[
  {
    "path": ".gitignore",
    "content": "git# See http://help.github.com/ignore-files/ for more about ignoring files.\n#\n# If you find yourself ignoring temporary files generated by your text editor\n# or operating system, you probably want to add a global ignore instead:\n#   git config --global core.excludesfile ~/.gitignore_global\n\n/tmp\n*/**/*un~\n*/**/*.test\n*un~\n.DS_Store\n*/**/.DS_Store\n.ethtest\n*/**/*tx_database*\n*/**/*dapps*\nbuild/_vendor/pkg\n\n#*\n.#*\n*#\n*~\n.project\n.settings\n\n# used by the Makefile\n/build/_workspace/\n/build/bin/\n/geth*.zip\n\n# travis\nprofile.tmp\nprofile.cov\n\n# IdeaIDE\n.idea\n\n# VS Code\n.vscode\n\n# dashboard\n/dashboard/assets/flow-typed\n/dashboard/assets/node_modules\n/dashboard/assets/stats.json\n/dashboard/assets/bundle.js\n/dashboard/assets/package-lock.json\n\n**/yarn-error.log\n\ncgu\nconfig.ini\nbuild/package\nbuild/geropkg/bin\nbuild/geropkg/czero\nbuild/geropkg_*.tar.gz\nbuild/geropkg-*.tar.gz\nbuild/geropkg-*.zip\nbuild/gero-*.tar.gz\nbuild/gero-*.zip\nbuild/gerotx-*.tar.gz\nbuild/gerotx-*.zip\nbuild/*posGero*\nbuild/posGero-*.*\nmakePos.sh\n/pkg\nbuild/deploy.sh\ncontainers/docker/gero-ubuntu/gero-*.tar\n\npullup\n"
  },
  {
    "path": "AUTHORS",
    "content": "# This is the official list of go-ethereum authors for copyright purposes.\n\nAfri Schoedon <5chdn@users.noreply.github.com>\nAgustin Armellini Fischer <armellini13@gmail.com>\nAiread <fgh1987168@gmail.com>\nAlan Chen <alanchchen@users.noreply.github.com>\nAlejandro Isaza <alejandro.isaza@gmail.com>\nAles Katona <ales@coinbase.com>\nAlex Leverington <alex@ethdev.com>\nAlex Wu <wuyiding@gmail.com>\nAlexandre Van de Sande <alex.vandesande@ethdev.com>\nAli Hajimirza <Ali92hm@users.noreply.github.com>\nAnton Evangelatov <anton.evangelatov@gmail.com>\nArba Sasmoyo <arba.sasmoyo@gmail.com>\nArmani Ferrante <armaniferrante@berkeley.edu>\nArmin Braun <me@obrown.io>\nAron Fischer <github@aron.guru>\nBas van Kervel <bas@ethdev.com>\nBenjamin Brent <benjamin@benjaminbrent.com>\nBenoit Verkindt <benoit.verkindt@gmail.com>\nBo <bohende@gmail.com>\nBo Ye <boy.e.computer.1982@outlook.com>\nBob Glickstein <bobg@users.noreply.github.com>\nBrian Schroeder <bts@gmail.com>\nCasey Detrio <cdetrio@gmail.com>\nChase Wright <mysticryuujin@gmail.com>\nChristoph Jentzsch <jentzsch.software@gmail.com>\nDaniel A. Nagy <nagy.da@gmail.com>\nDaniel Sloof <goapsychadelic@gmail.com>\nDarrel Herbst <dherbst@gmail.com>\nDave Appleton <calistralabs@gmail.com>\nDiego Siqueira <DiSiqueira@users.noreply.github.com>\nDmitry Shulyak <yashulyak@gmail.com>\nEgon Elbre <egonelbre@gmail.com>\nElias Naur <elias.naur@gmail.com>\nElliot Shepherd <elliot@identitii.com>\nEnrique Fynn <enriquefynn@gmail.com>\nErnesto del Toro <ernesto.deltoro@gmail.com>\nEthan Buchman <ethan@coinculture.info>\nEugene Valeyev <evgen.povt@gmail.com>\nEvangelos Pappas <epappas@evalonlabs.com>\nEvgeny Danilenko <6655321@bk.ru>\nFabian Vogelsteller <fabian@frozeman.de>\nFabio Barone <fabio.barone.co@gmail.com>\nFabio Berger <fabioberger1991@gmail.com>\nFaceHo <facehoshi@gmail.com>\nFelix Lange <fjl@twurst.com>\nFiisio <liangcszzu@163.com>\nFrank Wang <eternnoir@gmail.com>\nFurkan KAMACI <furkankamaci@gmail.com>\nGary Rong <garyrong0905@gmail.com>\nGeorge Ornbo <george@shapeshed.com>\nGregg Dourgarian <greggd@tempworks.com>\nGuillaume Ballet <gballet@gmail.com>\nGuillaume Nicolas <guin56@gmail.com>\nGustav Simonsson <gustav.simonsson@gmail.com>\nHao Bryan Cheng <haobcheng@gmail.com>\nHenning Diedrich <hd@eonblast.com>\nIsidoro Ghezzi <isidoro.ghezzi@icloud.com>\nIvan Daniluk <ivan.daniluk@gmail.com>\nJae Kwon <jkwon.work@gmail.com>\nJamie Pitts <james.pitts@gmail.com>\nJanoš Guljaš <janos@users.noreply.github.com>\nJason Carver <jacarver@linkedin.com>\nJay Guo <guojiannan1101@gmail.com>\nJeff R. Allen <jra@nella.org>\nJeffrey Wilcke <jeffrey@ethereum.org>\nJens Agerberg <github@agerberg.me>\nJia Chenhui <jiachenhui1989@gmail.com>\nJim McDonald <Jim@mcdee.net>\nJoel Burget <joelburget@gmail.com>\nJonathan Brown <jbrown@bluedroplet.com>\nJoseph Chow <ethereum@outlook.com>\nJustin Clark-Casey <justincc@justincc.org>\nJustin Drake <drakefjustin@gmail.com>\nKenji Siu <kenji@isuntv.com>\nKobi Gurkan <kobigurk@gmail.com>\nKonrad Feldmeier <konrad@brainbot.com>\nKurkó Mihály <kurkomisi@users.noreply.github.com>\nKyuntae Ethan Kim <ethan.kyuntae.kim@gmail.com>\nLefteris Karapetsas <lefteris@refu.co>\nLeif Jurvetson <leijurv@gmail.com>\nLeo Shklovskii <leo@thermopylae.net>\nLewis Marshall <lewis@lmars.net>\nLio李欧 <lionello@users.noreply.github.com>\nLouis Holbrook <dev@holbrook.no>\nLuca Zeug <luclu@users.noreply.github.com>\nMagicking <s@6120.eu>\nMaran Hidskes <maran.hidskes@gmail.com>\nMarek Kotewicz <marek.kotewicz@gmail.com>\nMark <markya0616@gmail.com>\nMartin Holst Swende <martin@swende.se>\nMatthew Di Ferrante <mattdf@users.noreply.github.com>\nMatthew Wampler-Doty <matthew.wampler.doty@gmail.com>\nMaximilian Meister <mmeister@suse.de>\nMicah Zoltu <micah@zoltu.net>\nMichael Ruminer <michael.ruminer+github@gmail.com>\nMiguel Mota <miguelmota2@gmail.com>\nMiya Chen <miyatlchen@gmail.com>\nNchinda Nchinda <nchinda2@gmail.com>\nNick Dodson <silentcicero@outlook.com>\nNick Johnson <arachnid@notdot.net>\nNicolas Guillaume <gunicolas@sqli.com>\nNoman <noman@noman.land>\nOli Bye <olibye@users.noreply.github.com>\nPaul Litvak <litvakpol@012.net.il>\nPaulo L F Casaretto <pcasaretto@gmail.com>\nPaweł Bylica <chfast@gmail.com>\nPeter Pratscher <pratscher@gmail.com>\nPetr Mikusek <petr@mikusek.info>\nPéter Szilágyi <peterke@gmail.com>\nRJ Catalano <catalanor0220@gmail.com>\nRamesh Nair <ram@hiddentao.com>\nRicardo Catalinas Jiménez <r@untroubled.be>\nRicardo Domingos <ricardohsd@gmail.com>\nRichard Hart <richardhart92@gmail.com>\nRob <robert@rojotek.com>\nRobert Zaremba <robert.zaremba@scale-it.pl>\nRuss Cox <rsc@golang.org>\nRémy Roy <remyroy@remyroy.com>\nS. Matthew English <s-matthew-english@users.noreply.github.com>\nShintaro Kaneko <kaneshin0120@gmail.com>\nSorin Neacsu <sorin.neacsu@gmail.com>\nStein Dekker <dekker.stein@gmail.com>\nSteve Waldman <swaldman@mchange.com>\nSteven Roose <stevenroose@gmail.com>\nTaylor Gerring <taylor.gerring@gmail.com>\nThomas Bocek <tom@tomp2p.net>\nTi Zhou <tizhou1986@gmail.com>\nTosh Camille <tochecamille@gmail.com>\nValentin Wüstholz <wuestholz@gmail.com>\nVictor Farazdagi <simple.square@gmail.com>\nVictor Tran <vu.tran54@gmail.com>\nViktor Trón <viktor.tron@gmail.com>\nVille Sundell <github@solarius.fi>\nVincent G <caktux@gmail.com>\nVitalik Buterin <v@buterin.com>\nVitaly V <vvelikodny@gmail.com>\nVivek Anand <vivekanand1101@users.noreply.github.com>\nVlad Gluhovsky <gluk256@users.noreply.github.com>\nYohann Léon <sybiload@gmail.com>\nYoichi Hirai <i@yoichihirai.com>\nYondon Fu <yondon.fu@gmail.com>\nZach <zach.ramsay@gmail.com>\nZahoor Mohamed <zahoor@zahoor.in>\nZoe Nolan <github@zoenolan.org>\nZsolt Felföldi <zsfelfoldi@gmail.com>\nam2rican5 <am2rican5@gmail.com>\nayeowch <ayeowch@gmail.com>\nb00ris <b00ris@mail.ru>\nbailantaotao <Edwin@maicoin.com>\nbaizhenxuan <nkbai@163.com>\nbloonfield <bloonfield@163.com>\nchanghong <changhong.yu@shanbay.com>\nevgk <evgeniy.kamyshev@gmail.com>\nferhat elmas <elmas.ferhat@gmail.com>\nholisticode <holistic.computing@gmail.com>\njtakalai <juuso.takalainen@streamr.com>\nken10100147 <sunhongping@kanjian.com>\nligi <ligi@ligi.de>\nmark.lin <mark@maicoin.com>\nnecaremus <necaremus@gmail.com>\nnjupt-moon <1015041018@njupt.edu.cn>\nnkbai <nkbai@163.com>\nrhaps107 <dod-source@yandex.ru>\nslumber1122 <slumber1122@gmail.com>\nsunxiaojun2014 <sunxiaojun-xy@360.cn>\nterasum <terasum@163.com>\ntsarpaul <Litvakpol@012.net.il>\nxiekeyang <xiekeyang@users.noreply.github.com>\nyoza <yoza.is12s@gmail.com>\nΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com>\nМаксим Чусовлянов <mchusovlianov@gmail.com>\nRalph Caraveo <deckarep@gmail.com>\n"
  },
  {
    "path": "AUTHORS.SERO",
    "content": "# This is the official list of go-sero authors for copyright purposes.\n\nGordon.T <gordon-sero@sero.vip>\n\n"
  },
  {
    "path": "COPYING",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2014 The go-ethereum Authors.\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."
  },
  {
    "path": "COPYING.LESSER",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "Dockerfile",
    "content": "# Build Geth in a stock Go builder container\nFROM golang:1.10-alpine as builder\n\nRUN apk add --no-cache make gcc musl-dev linux-headers\n\nADD . /go-ethereum\nRUN cd /go-ethereum && make gero\n\n# Pull Geth into a second stage deploy alpine container\nFROM alpine:latest\n\nRUN apk add --no-cache ca-certificates\nCOPY --from=builder /go-ethereum/build/bin/gero /usr/local/bin/\n\nEXPOSE 8545 8546 30303 30303/udp\nENTRYPOINT [\"gero\"]\n"
  },
  {
    "path": "LICENSE.SERO",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2018 The sero.cash Authors.\n Modified based on go-ethereum, which Copyright (C) 2014 The go-ethereum Authors.\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."
  },
  {
    "path": "LICENSE.SERO.LESSER",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary."
  },
  {
    "path": "Makefile",
    "content": "# This Makefile is meant to be used by people that do not usually work\n# with Go source code. If you know what GOPATH is then you probably\n# don't need to bother with make.\n\n.PHONY: gero android ios gero-cross swarm evm all test clean\n.PHONY: gero-linux gero-linux-386 gero-linux-amd64 gero-linux-mips64 gero-linux-mips64le\n.PHONY: gero-linux-arm gero-linux-arm-5 gero-linux-arm-6 gero-linux-arm-7 gero-linux-arm64\n.PHONY: gero-darwin gero-darwin-386 gero-darwin-amd64\n.PHONY: gero-windows gero-windows-386 gero-windows-amd64\n\nGOBIN = $(shell pwd)/build/bin\nroot=$(shell pwd)\nGO ?= latest\n\nPKG = ./...\n\ngero:\n\tbuild/env.sh go run build/ci.go install ./cmd/gero\n\t@echo \"Done building.\"\n\t@echo \"Run \\\"$(GOBIN)/gero\\\" to launch gero.\"\n\nswarm:\n\tbuild/env.sh go run build/ci.go install ./cmd/swarm\n\t@echo \"Done building.\"\n\t@echo \"Run \\\"$(GOBIN)/swarm\\\" to launch swarm.\"\n\nall:\n\tbuild/env.sh go run build/ci.go install\n\ntest: all\n\tbuild/env.sh go run build/ci.go test\n\nlint: ## Run linters.\n\tbuild/env.sh go run build/ci.go lint $(PKG)\n\nclean:\n\t./build/clean_go_build_cache.sh\n\trm -fr build/_workspace/pkg/ $(GOBIN)/*\n\n# The devtools target installs tools required for 'go generate'.\n# You need to put $GOBIN (or $GOPATH/bin) in your PATH to use 'go generate'.\n\ndevtools:\n\tenv GOBIN= go get -u golang.org/x/tools/cmd/stringer\n\tenv GOBIN= go get -u github.com/kevinburke/go-bindata/go-bindata\n\tenv GOBIN= go get -u github.com/fjl/gencodec\n\tenv GOBIN= go get -u github.com/golang/protobuf/protoc-gen-go\n\tenv GOBIN= go install ./cmd/abigen\n\t@type \"npm\" 2> /dev/null || echo 'Please install node.js and npm'\n\t@type \"solc\" 2> /dev/null || echo 'Please install solc'\n\t@type \"protoc\" 2> /dev/null || echo 'Please install protoc'\n\n# Cross Compilation Targets (xgo)\n\ngero-cross: gero-linux gero-darwin gero-windows\n\t@echo \"Full cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-*\n\ngero-linux: gero-linux-amd64-v3 gero-linux-amd64-v4\n\t@echo \"Linux cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-linux-*\n\ngero-linux-amd64-v3:\n\tbuild/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gero-v3 --targets=linux/amd64 -v ./cmd/gero\n\t#build/env.sh  go run build/ci.go xgo -- --go=$(GO) --out=bootnode-v3 --targets=linux/amd64 -v ./cmd/bootnode\n\t@echo \"Linux centos amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-v3-linux-* | grep amd64\n\ngero-linux-amd64-v4:\n\tbuild/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gero-v4 --targets=linux/amd64 -v ./cmd/gero\n\t#build/env.sh linux-v3 go run build/ci.go xgo -- --go=$(GO) --out=bootnode-v4 --targets=linux/amd64 -v ./cmd/bootnode\n\t@echo \"Linux  ubuntu amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-v4-linux-* | grep amd64\n\ngero-darwin: gero-darwin-amd64\n\t@echo \"Darwin cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-darwin-*\n\n\ngero-darwin-amd64:\n\tbuild/env.sh  go run build/ci.go xgo -- --go=$(GO) --targets=darwin/amd64 -v ./cmd/gero\n\t@echo \"Darwin amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-darwin-* | grep amd64\n\ngero-windows: gero-windows-amd64\n\t@echo \"Windows cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-windows-*\n\ngero-windows-amd64:\n\tbuild/env.sh  go run build/ci.go xgo -- --go=$(GO)  --targets=windows/amd64 -v ./cmd/gero\n\t@echo \"Windows amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gero-windows-* | grep amd64\n\ngerotx-darwin-amd64:\n\tbuild/env.sh  go run build/ci.go xgo -- --go=$(GO) --out=gerotx  --targets=darwin/amd64 -v ./cmd/tx\n\t@echo \"Darwin amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gerotx-darwin-* | grep amd64\n\ngerotx-linux-amd64-v3:\n\tbuild/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gerotx-v3 --targets=linux/amd64 -v ./cmd/tx\n\t@echo \"Linux centos amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gerotx-v3-linux-* | grep amd64\n\ngerotx-linux-amd64-v4:\n\tbuild/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gerotx-v4 --targets=linux/amd64 -v ./cmd/tx\n\t@echo \"Linux  ubuntu amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gerotx-v4-linux-* | grep amd64\n\ngerotx-windows-amd64:\n\tbuild/env.sh go run build/ci.go xgo -- --go=$(GO) --out=gerotx --targets=windows/amd64 -v ./cmd/tx\n\t@echo \"Windows amd64 cross compilation done:\"\n\t@ls -ld $(GOBIN)/gerotx-windows-* | grep amd64"
  },
  {
    "path": "README.md",
    "content": "# Go Sero\n\nThe SERO system is the world's first blockchain platform to support conﬁdential transactions based on Zero-knowledge proof and supports Turing complete smart contracts.\n\n## What's SERO\n\nhttps://wiki.sero.cash/en/index.html?file=home-Home\n\n\n## From source code -- base on CentOS7\n\nhttps://wiki.sero.cash/en/index.html?file=Start/from-the-sourcecode-base-on-centos7\n\n\n## How to mine using gero\n\nhttps://wiki.sero.cash/en/index.html?file=Start/from-the-binary-package\n\n **Now You don't need license anymore to mine SERO.**\n\n\n## How to use snapshots\n\nhttps://wiki.sero.cash/en/index.html?file=Start/sero-chain-snapshot-list\n\n\n## How to start SERO Staking on gero\n\nhttps://wiki.sero.cash/en/index.html?file=Tutorial/how-to-staking-using-gero\n\n## Decentralized light wallet\n\n**PC:**\nhttps://github.com/sero-cash/pullup\n\n**Mobile:**\nhttps://sero.cash/app/popup.html\n\n\n## POW pool list\n\nhttps://wiki.sero.cash/en/index.html?file=Start/sero-pool-list\n\n## PoS stake node List\n\nhttps://wiki.sero.cash/en/index.html?file=Start/stake-node-list\n\n## Contribution\n\nThank you for considering to help out with the source code! We welcome contributions from\nanyone on the internet, and are grateful for even the smallest of fixes!\n\nIf you'd like to contribute to go-sero, please fork, fix, commit and send a pull request\nfor the maintainers to review and merge into the main code base. \n\nPlease make sure your contributions adhere to our coding guidelines:\n\n * Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)).\n * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines.\n * Pull requests need to be based on and opened against the `master` branch.\n * Commit messages should be prefixed with the package(s) they modify.\n   * E.g. \"sero, rpc: make trace configs optional\"\n\nPlease see the [Developers' Guide](https://github.com/sero-cash/go-sero/wiki/Developers'-Guide)\nfor more details on configuring your environment, managing project dependencies and testing procedures.\n\n## Community resources\n\n**Wechat:**  SERO9413\n\n**Discord:**  <https://discord.gg/n5HVxE>\n\n**Twitter:**  <https://twitter.com/SEROdotCASH>\n\n**Telegram:**  <https://t.me/SeroOfficial>\n\n**Gitter:**  <https://gitter.im/sero-cash/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link>\n\n\n## Other resources\n\n**Official Website:** <https://sero.cash>\n\n**White Paper:** <http://sero-media.s3-website-ap-southeast-1.amazonaws.com/Sero_ENG_V1.06.pdf>\n\n**WIKI:** <https://wiki.sero.cash/zh/index.html?file=home-Home>\n\n**Block Explorer:** <https://explorer.web.sero.cash/blocks.html>\n\n**Introduction Video:** <https://v.qq.com/x/page/s0792e921ok.html>\n\n\n## License\n\nThe go-sero library (i.e. all code outside of the `cmd` directory) is licensed under the\n[GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), also\nincluded in our repository in the `COPYING.LESSER` file.\n\nThe go-sero binaries (i.e. all code inside of the `cmd` directory) is licensed under the\n[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also included\nin our repository in the `COPYING` file.\n\n*Note: Go Sero inherit with licenses of ethereum.*\n"
  },
  {
    "path": "accounts/abi/abi.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\n// The ABI holds information about a contract's context and available\n// invokable methods. It will allow you to type check function calls and\n// packs data accordingly.\ntype ABI struct {\n\tConstructor Method\n\tMethods     map[string]Method\n\tEvents      map[string]Event\n\n\t// Additional \"special\" functions introduced in solidity v0.6.0.\n\t// It's separated from the original default fallback. Each contract\n\t// can only define one fallback and receive function.\n\tFallback Method // Note it's also used to represent legacy fallback before v0.6.0\n\tReceive  Method\n}\n\n// JSON returns a parsed ABI interface and error if it failed.\nfunc JSON(reader io.Reader) (ABI, error) {\n\tdec := json.NewDecoder(reader)\n\n\tvar abi ABI\n\tif err := dec.Decode(&abi); err != nil {\n\t\treturn ABI{}, err\n\t}\n\n\treturn abi, nil\n}\n\n// Pack the given method name to conform the ABI. Method call's data\n// will consist of method_id, args0, arg1, ... argN. Method id consists\n// of 4 bytes and arguments are all 32 bytes.\n// Method ids are created from the first 4 bytes of the hash of the\n// methods string signature. (signature = baz(uint32,string32))\n\nfunc (abi ABI) PackPrefix(name string, rand c_type.Uint128, args ...interface{}) ([]byte, error) {\n\tvar ret []byte\n\tret = append(ret, rand[:]...)\n\tif name == \"\" {\n\t\t// constructor\n\t\taddressPrefix, err := abi.Constructor.Inputs.PackPrefix(args...)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tret = append(ret, addressPrefix...)\n\t\treturn ret, nil\n\n\t}\n\tmethod, exist := abi.Methods[name]\n\tif !exist {\n\t\treturn nil, fmt.Errorf(\"method '%s' not found\", name)\n\t}\n\n\taddressPrefix, err := method.Inputs.PackPrefix(args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tret = append(ret, addressPrefix...)\n\n\treturn ret, nil\n}\n\nfunc (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) {\n\t// Fetch the ABI of the requested method\n\tif name == \"\" {\n\t\t// constructor\n\n\t\targuments, err := abi.Constructor.Inputs.Pack(args...)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn arguments, nil\n\n\t}\n\tmethod, exist := abi.Methods[name]\n\tif !exist {\n\t\treturn nil, fmt.Errorf(\"method '%s' not found\", name)\n\t}\n\n\targuments, err := method.Inputs.Pack(args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Pack up the method ID too if not a constructor and return\n\treturn append(method.ID, arguments...), nil\n}\n\n// Unpack output in v according to the abi specification\nfunc (abi ABI) Unpack(v interface{}, name string, output []byte) (err error) {\n\tif len(output) == 0 {\n\t\treturn fmt.Errorf(\"abi: unmarshalling empty output\")\n\t}\n\t// since there can't be naming collisions with contracts and events,\n\t// we need to decide whether we're calling a method or an event\n\tif method, ok := abi.Methods[name]; ok {\n\t\tif len(output)%32 != 0 {\n\t\t\treturn fmt.Errorf(\"abi: improperly formatted output\")\n\t\t}\n\t\treturn method.Outputs.Unpack(v, output)\n\t} else if event, ok := abi.Events[name]; ok {\n\t\treturn event.Inputs.Unpack(v, output)\n\t}\n\treturn fmt.Errorf(\"abi: could not locate named method or event\")\n}\n\n// UnpackIntoMap unpacks a log into the provided map[string]interface{}\nfunc (abi ABI) UnpackIntoMap(v map[string]interface{}, name string, data []byte) (err error) {\n\tif len(data) == 0 {\n\t\treturn fmt.Errorf(\"abi: unmarshalling empty output\")\n\t}\n\t// since there can't be naming collisions with contracts and events,\n\t// we need to decide whether we're calling a method or an event\n\tif method, ok := abi.Methods[name]; ok {\n\t\tif len(data)%32 != 0 {\n\t\t\treturn fmt.Errorf(\"abi: improperly formatted output\")\n\t\t}\n\t\treturn method.Outputs.UnpackIntoMap(v, data)\n\t}\n\tif event, ok := abi.Events[name]; ok {\n\t\treturn event.Inputs.UnpackIntoMap(v, data)\n\t}\n\treturn fmt.Errorf(\"abi: could not locate named method or event\")\n}\n\n// UnmarshalJSON implements json.Unmarshaler interface\nfunc (abi *ABI) UnmarshalJSON(data []byte) error {\n\tvar fields []struct {\n\t\tType    string\n\t\tName    string\n\t\tInputs  []Argument\n\t\tOutputs []Argument\n\n\t\t// Status indicator which can be: \"pure\", \"view\",\n\t\t// \"nonpayable\" or \"payable\".\n\t\tStateMutability string\n\n\t\t// Deprecated Status indicators, but removed in v0.6.0.\n\t\tConstant bool // True if function is either pure or view\n\t\tPayable  bool // True if function is payable\n\n\t\t// Event relevant indicator represents the event is\n\t\t// declared as anonymous.\n\t\tAnonymous bool\n\t}\n\tif err := json.Unmarshal(data, &fields); err != nil {\n\t\treturn err\n\t}\n\tabi.Methods = make(map[string]Method)\n\tabi.Events = make(map[string]Event)\n\tfor _, field := range fields {\n\t\tswitch field.Type {\n\t\tcase \"constructor\":\n\t\t\tabi.Constructor = NewMethod(\"\", \"\", Constructor, field.StateMutability, field.Constant, field.Payable, field.Inputs, nil)\n\t\tcase \"function\":\n\t\t\tname := abi.overloadedMethodName(field.Name)\n\t\t\tabi.Methods[name] = NewMethod(name, field.Name, Function, field.StateMutability, field.Constant, field.Payable, field.Inputs, field.Outputs)\n\t\tcase \"fallback\":\n\t\t\t// New introduced function type in v0.6.0, check more detail\n\t\t\t// here https://solidity.readthedocs.io/en/v0.6.0/contracts.html#fallback-function\n\t\t\tif abi.HasFallback() {\n\t\t\t\treturn errors.New(\"only single fallback is allowed\")\n\t\t\t}\n\t\t\tabi.Fallback = NewMethod(\"\", \"\", Fallback, field.StateMutability, field.Constant, field.Payable, nil, nil)\n\t\tcase \"receive\":\n\t\t\t// New introduced function type in v0.6.0, check more detail\n\t\t\t// here https://solidity.readthedocs.io/en/v0.6.0/contracts.html#fallback-function\n\t\t\tif abi.HasReceive() {\n\t\t\t\treturn errors.New(\"only single receive is allowed\")\n\t\t\t}\n\t\t\tif field.StateMutability != \"payable\" {\n\t\t\t\treturn errors.New(\"the statemutability of receive can only be payable\")\n\t\t\t}\n\t\t\tabi.Receive = NewMethod(\"\", \"\", Receive, field.StateMutability, field.Constant, field.Payable, nil, nil)\n\t\tcase \"event\":\n\t\t\tname := abi.overloadedEventName(field.Name)\n\t\t\tabi.Events[name] = NewEvent(name, field.Name, field.Anonymous, field.Inputs)\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"abi: could not recognize type %v of field %v\", field.Type, field.Name)\n\t\t}\n\t}\n\treturn nil\n}\n\n// overloadedMethodName returns the next available name for a given function.\n// Needed since solidity allows for function overload.\n//\n// e.g. if the abi contains Methods send, send1\n// overloadedMethodName would return send2 for input send.\nfunc (abi *ABI) overloadedMethodName(rawName string) string {\n\tname := rawName\n\t_, ok := abi.Methods[name]\n\tfor idx := 0; ok; idx++ {\n\t\tname = fmt.Sprintf(\"%s%d\", rawName, idx)\n\t\t_, ok = abi.Methods[name]\n\t}\n\treturn name\n}\n\n// overloadedEventName returns the next available name for a given event.\n// Needed since solidity allows for event overload.\n//\n// e.g. if the abi contains events received, received1\n// overloadedEventName would return received2 for input received.\nfunc (abi *ABI) overloadedEventName(rawName string) string {\n\tname := rawName\n\t_, ok := abi.Events[name]\n\tfor idx := 0; ok; idx++ {\n\t\tname = fmt.Sprintf(\"%s%d\", rawName, idx)\n\t\t_, ok = abi.Events[name]\n\t}\n\treturn name\n}\n\n// MethodById looks up a method by the 4-byte id\n// returns nil if none found\nfunc (abi *ABI) MethodById(sigdata []byte) (*Method, error) {\n\tif len(sigdata) < 4 {\n\t\treturn nil, fmt.Errorf(\"data too short (%d bytes) for abi method lookup\", len(sigdata))\n\t}\n\tfor _, method := range abi.Methods {\n\t\tif bytes.Equal(method.ID, sigdata[:4]) {\n\t\t\treturn &method, nil\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"no method with id: %#x\", sigdata[:4])\n}\n\n// EventByID looks an event up by its topic hash in the\n// ABI and returns nil if none found.\nfunc (abi *ABI) EventByID(topic common.Hash) (*Event, error) {\n\tfor _, event := range abi.Events {\n\t\tif bytes.Equal(event.ID.Bytes(), topic.Bytes()) {\n\t\t\treturn &event, nil\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"no event with id: %#x\", topic.Hex())\n}\n\n// HasFallback returns an indicator whether a fallback function is included.\nfunc (abi *ABI) HasFallback() bool {\n\treturn abi.Fallback.Type == Fallback\n}\n\n// HasReceive returns an indicator whether a receive function is included.\nfunc (abi *ABI) HasReceive() bool {\n\treturn abi.Receive.Type == Receive\n}\n\n// revertSelector is a special function selector for revert reason unpacking.\n//var revertSelector = crypto.Keccak256([]byte(\"Error(string)\"))[:4]\n"
  },
  {
    "path": "accounts/abi/abi_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\n//\n//import (\n//\t\"bytes\"\n//\t\"encoding/hex\"\n//\t\"encoding/json\"\n//\t\"fmt\"\n//\t\"log\"\n//\t\"math/big\"\n//\t\"reflect\"\n//\t\"strings\"\n//\t\"testing\"\n//\n//\t\"github.com/sero-cash/go-sero/common\"\n//\t\"github.com/sero-cash/go-sero/crypto\"\n//)\n//\n//const jsondata = `\n//[\n//\t{ \"type\" : \"function\", \"name\" : \"balance\", \"constant\" : true },\n//\t{ \"type\" : \"function\", \"name\" : \"send\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"amount\", \"type\" : \"uint256\" } ] }\n//]`\n//\n//const jsondata2 = `\n//[\n//\t{ \"type\" : \"function\", \"name\" : \"balance\", \"constant\" : true },\n//\t{ \"type\" : \"function\", \"name\" : \"send\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"amount\", \"type\" : \"uint256\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"test\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"number\", \"type\" : \"uint32\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"string\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"string\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"bool\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"bool\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"address\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"address\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"uint64[2]\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"uint64[2]\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"uint64[]\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"uint64[]\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"foo\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"uint32\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"bar\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"uint32\" }, { \"name\" : \"string\", \"type\" : \"uint16\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"slice\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"uint32[2]\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"slice256\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"uint256[2]\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"sliceAddress\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"inputs\", \"type\" : \"address[]\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"sliceMultiAddress\", \"constant\" : false, \"inputs\" : [ { \"name\" : \"a\", \"type\" : \"address[]\" }, { \"name\" : \"b\", \"type\" : \"address[]\" } ] }\n//]`\n//\n//func newType(t string) Type {\n//\ttyp, err := NewType(t)\n//\tif err != nil {\n//\t\tpanic(t)\n//\t}\n//\treturn typ\n//}\n//\n//func TestALL(t *testing.T) {\n//\tfmt.Println(newType(\"bytes\").T)\n//\n//\t//fmt.Println(newType(\"uint8[2]\").Kind)\n//\t//paramJson := `{\"uint8[2]\":[100,99]}`\n//\n//\t//paramJson := `{\"uint8[2][2]\":[[100,99],[98,97]]}`\n//\n//\t//paramJson := `{\"string\":\"12345\"}`\n//\n//\t//paramJson := `{\"bool\":true}`\n//\n//\t//paramJson := `{\"address\":\"6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF\"}`\n//\n//\tparamJson := `{\"address[][]\":[[\"6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF\"],[\"6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF\"]], \"bytes\":[1,2]}`\n//\n//\tdec := json.NewDecoder(strings.NewReader(paramJson))\n//\tdec.UseNumber()\n//\n//\tvs := map[string]interface{}{}\n//\n//\tif err := dec.Decode(&vs); err != nil {\n//\t\tfmt.Print(err)\n//\t}\n//\n//\targs := []Argument{}\n//\tinputs := []interface{}{}\n//\n//\t//var index int\n//\t//for k, v := range vs {\n//\t//\t//fmt.Printf(\"%t\\n %t\\n\", k, v)\n//\t//\ttv, _, _ := ValueTo(newType(k), v, nil, nil)\n//\t//\t//fmt.Printf(\"address = %v\\n\",addr)\n//\t//\tfmt.Printf(\"v=%v\\n\", tv)\n//\t//\targs = append(args, Argument{\"a\" + strconv.Itoa(index), newType(k), false})\n//\t//\tinputs = append(inputs, tv.Interface())\n//\t//\tindex += 1\n//\t//}\n//\n//\t//[2]uint32{uint32(100), uint32(99)}, \"1234567890\", common.HexToAddress(\"0xbbf289d846208c16edc8474705c748aff07732db\"), common.HexToAddress(\"0x692a70d2e424a56d2c6c27aa97d1a86395877b3a\"), \"test\", uint32(11)\n//\tmethod := Method{\"test\", false, args, nil}\n//\n//\toutputs, err := method.Inputs.Pack(inputs...)\n//\tif err != nil {\n//\t\tfmt.Print(err)\n//\t}\n//\n//\tinput := append(method.ID, outputs...)\n//\tfmt.Println(common.Bytes2Hex(input))\n//\n//\ttype Event struct {\n//\t\tA0 common.Address\n//\t\t//A1 common.Data\n//\t\t//A2 []byte\n//\t\t//A2 string\n//\t}\n//\tvar ev Event\n//\taa := Arguments{\n//\t\t{\"a0\", newType(\"address\"), false},\n//\t\t//{\"a1\", newType(\"address\"), false},\n//\t\t{\"a2\", newType(\"bytes\"), false},\n//\t}\n//\tunpack := aa.Unpack(&ev, outputs)\n//\t//unpack := method.Inputs.Unpack(&ev, outputs)\n//\tfmt.Println(unpack)\n//\tfmt.Println(ev)\n//\n//}\n//\n//func TestABIPACK(t *testing.T) {\n//\tfmt.Println(newType(\"bytes\").T)\n//\n//\t//fmt.Println(newType(\"uint8[2]\").Kind)\n//\t//paramJson := `{\"uint8[2]\":[100,99]}`\n//\n//\t//paramJson := `{\"uint8[2][2]\":[[100,99],[98,97]]}`\n//\n//\t//paramJson := `{\"string\":\"12345\"}`\n//\n//\t//paramJson := `{\"bool\":true}`\n//\n//\t//paramJson := `{\"address\":\"0xbbf289d846208c16edc8474705c748aff07732db\"}`\n//\n//\tdatas := []string{`address:6gYcdwixFVFg1QLV29hURUnN2WLxoTFbDHBptvtC4GcCHfnG7ocmmTrebf3KvjNHfj6UJpp9UzkSiheYbCyDERF`}\n//\n//\tinputs := []interface{}{}\n//\targs := []Argument{}\n//\t//var index int\n//\tfor _, line := range datas {\n//\t\tpairs := strings.Split(line, \":\")\n//\t\tvs := map[string]interface{}{}\n//\t\tfmt.Printf(\"json=%v\", `{\"`+pairs[0]+`\":\"`+pairs[1]+`\"}`)\n//\t\tdec := json.NewDecoder(strings.NewReader(`{\"` + pairs[0] + `\":\"` + pairs[1] + `\"}`))\n//\t\tdec.UseNumber()\n//\t\tif err := dec.Decode(&vs); err != nil {\n//\t\t\tfmt.Print(err)\n//\t\t}\n//\t\t//for k, v := range vs {\n//\t\t//\t//fmt.Printf(\"%t\\n %t\\n\", k, v)\n//\t\t//\ttv, _, _ := ValueTo(newType(k), v, nil, nil)\n//\t\t//\tfmt.Printf(\"v=%v\\n\", tv)\n//\t\t//\targs = append(args, Argument{\"a\" + strconv.Itoa(index), newType(k), false})\n//\t\t//\tinputs = append(inputs, tv.Interface())\n//\t\t//\tindex += 1\n//\t\t//}\n//\n//\t}\n//\n//\t//[2]uint32{uint32(100), uint32(99)}, \"1234567890\", common.HexToAddress(\"0xbbf289d846208c16edc8474705c748aff07732db\"), common.HexToAddress(\"0x692a70d2e424a56d2c6c27aa97d1a86395877b3a\"), \"test\", uint32(11)\n//\tmethod := Method{\"test\", false, args, nil}\n//\n//\toutputs, err := method.Inputs.Pack(inputs...)\n//\tif err != nil {\n//\t\tfmt.Print(err)\n//\t}\n//\n//\tinput := append(method.Id(), outputs...)\n//\tfmt.Println(common.Bytes2Hex(input))\n//}\n//\n//func TestReader(t *testing.T) {\n//\tUint256, _ := NewType(\"uint256\")\n//\texp := ABI{\n//\t\tMethods: map[string]Method{\n//\t\t\t\"balance\": {\n//\t\t\t\t\"balance\", true, nil, nil,\n//\t\t\t},\n//\t\t\t\"send\": {\n//\t\t\t\t\"send\", false, []Argument{\n//\t\t\t\t\t{\"amount\", Uint256, false},\n//\t\t\t\t}, nil,\n//\t\t\t},\n//\t\t},\n//\t}\n//\n//\tabi, err := JSON(strings.NewReader(jsondata))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\t// deep equal fails for some reason\n//\tfor name, expM := range exp.Methods {\n//\t\tgotM, exist := abi.Methods[name]\n//\t\tif !exist {\n//\t\t\tt.Errorf(\"Missing expected method %v\", name)\n//\t\t}\n//\t\tif !reflect.DeepEqual(gotM, expM) {\n//\t\t\tt.Errorf(\"\\nGot abi method: \\n%v\\ndoes not match expected method\\n%v\", gotM, expM)\n//\t\t}\n//\t}\n//\n//\tfor name, gotM := range abi.Methods {\n//\t\texpM, exist := exp.Methods[name]\n//\t\tif !exist {\n//\t\t\tt.Errorf(\"Found extra method %v\", name)\n//\t\t}\n//\t\tif !reflect.DeepEqual(gotM, expM) {\n//\t\t\tt.Errorf(\"\\nGot abi method: \\n%v\\ndoes not match expected method\\n%v\", gotM, expM)\n//\t\t}\n//\t}\n//}\n//\n//func TestTestNumbers(t *testing.T) {\n//\tabi, err := JSON(strings.NewReader(jsondata2))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t\tt.FailNow()\n//\t}\n//\n//\tif _, err := abi.Pack(\"balance\"); err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\tif _, err := abi.Pack(\"balance\", 1); err == nil {\n//\t\tt.Error(\"expected error for balance(1)\")\n//\t}\n//\n//\tif _, err := abi.Pack(\"doesntexist\", nil); err == nil {\n//\t\tt.Errorf(\"doesntexist shouldn't exist\")\n//\t}\n//\n//\tif _, err := abi.Pack(\"doesntexist\", 1); err == nil {\n//\t\tt.Errorf(\"doesntexist(1) shouldn't exist\")\n//\t}\n//\n//\tif _, err := abi.Pack(\"send\", big.NewInt(1000)); err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\ti := new(int)\n//\t*i = 1000\n//\tif _, err := abi.Pack(\"send\", i); err == nil {\n//\t\tt.Errorf(\"expected send( ptr ) to throw, requires *big.Int instead of *int\")\n//\t}\n//\n//\tif _, err := abi.Pack(\"test\", uint32(1000)); err != nil {\n//\t\tt.Error(err)\n//\t}\n//}\n//\n//func TestTestString(t *testing.T) {\n//\tabi, err := JSON(strings.NewReader(jsondata2))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t\tt.FailNow()\n//\t}\n//\n//\tif _, err := abi.Pack(\"string\", \"hello world\"); err != nil {\n//\t\tt.Error(err)\n//\t}\n//}\n//\n//func TestTestBool(t *testing.T) {\n//\tabi, err := JSON(strings.NewReader(jsondata2))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t\tt.FailNow()\n//\t}\n//\n//\tif _, err := abi.Pack(\"bool\", true); err != nil {\n//\t\tt.Error(err)\n//\t}\n//}\n//\n//func TestTestSlice(t *testing.T) {\n//\tabi, err := JSON(strings.NewReader(jsondata2))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t\tt.FailNow()\n//\t}\n//\n//\tslice := make([]uint64, 2)\n//\tif _, err := abi.Pack(\"uint64[2]\", slice); err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\tif _, err := abi.Pack(\"uint64[]\", slice); err != nil {\n//\t\tt.Error(err)\n//\t}\n//}\n//\n//func TestMethodSignature(t *testing.T) {\n//\tString, _ := NewType(\"string\")\n//\tm := Method{\"foo\", false, []Argument{{\"bar\", String, false}, {\"baz\", String, false}}, nil}\n//\texp := \"foo(string,string)\"\n//\tif m.Sig() != exp {\n//\t\tt.Error(\"signature mismatch\", exp, \"!=\", m.Sig())\n//\t}\n//\n//\tidexp := crypto.Keccak256([]byte(exp))[:4]\n//\tif !bytes.Equal(m.Id(), idexp) {\n//\t\tt.Errorf(\"expected ids to match %x != %x\", m.Id(), idexp)\n//\t}\n//\n//\tuintt, _ := NewType(\"uint256\")\n//\tm = Method{\"foo\", false, []Argument{{\"bar\", uintt, false}}, nil}\n//\texp = \"foo(uint256)\"\n//\tif m.Sig() != exp {\n//\t\tt.Error(\"signature mismatch\", exp, \"!=\", m.Sig())\n//\t}\n//}\n//\n//func TestMultiPack(t *testing.T) {\n//\tabi, err := JSON(strings.NewReader(jsondata2))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t\tt.FailNow()\n//\t}\n//\n//\tsig := crypto.Keccak256([]byte(\"bar(uint32,uint16)\"))[:4]\n//\tsig = append(sig, make([]byte, 64)...)\n//\tsig[35] = 10\n//\tsig[67] = 11\n//\n//\tpacked, err := abi.Pack(\"bar\", uint32(10), uint16(11))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t\tt.FailNow()\n//\t}\n//\n//\tif !bytes.Equal(packed, sig) {\n//\t\tt.Errorf(\"expected %x got %x\", sig, packed)\n//\t}\n//}\n//\n//func TestGetDeciamlByName_Pack(t *testing.T) {\n//\tconst definition = `[{\n//\t\"constant\": false,\n//\t\"inputs\": [{\n//\t\t\"name\": \"name\",\n//\t\t\"type\": \"string\"\n//\t}],\n//\t\"name\": \"getDecimal\",\n//\t\"outputs\": [{\n//\t\t\"name\": \"\",\n//\t\t\"type\": \"uint8\"\n//\t}],\n//\t\"payable\": false,\n//\t\"type\": \"function\"\n//\t}]`\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\tout, err := abi.Pack(\"getDecimal\", \"\")\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\n//\tfmt.Printf(\"%x\\n\", out)\n//}\n//\n//func TestGetDeciaml_Pack(t *testing.T) {\n//\tconst definition = `[{\n//\t\"constant\": true,\n//\t\"inputs\": [],\n//\t\"name\": \"getDecimal\",\n//\t\"outputs\": [{\n//\t\t\"name\": \"\",\n//\t\t\"type\": \"uint8\"\n//\t}],\n//\t\"payable\": false,\n//\t\"type\": \"function\"\n//    }]`\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\tout, err := abi.Pack(\"getDecimal\", \"\")\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\n//\tfmt.Printf(\"%x\\n\", out)\n//}\n//\n//func TestDeciaml_Pack(t *testing.T) {\n//\tconst definition = `[{\n//\t\"constant\": true,\n//\t\"inputs\": [],\n//\t\"name\": \"decimals\",\n//\t\"outputs\": [{\n//\t\t\"name\": \"\",\n//\t\t\"type\": \"uint8\"\n//\t}],\n//\t\"payable\": false,\n//\t\"type\": \"function\"\n//    }]`\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\tout, err := abi.Pack(\"getDecimal\", \"\")\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\n//\tfmt.Printf(\"%x\\n\", out)\n//}\n//\n//func TestABI_Pack(t *testing.T) {\n//\tconst definition = `[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"name\",\"type\":\"string\"}],\"name\":\"getDecimal\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getDecimal\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"symbol\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]`\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\tout, err := abi.Pack(\"getDecimal\")\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\n//\tfmt.Printf(\"%x\\n\", out)\n//}\n//\n//func ExampleJSON() {\n//\tconst definition = `[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isBar\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"type\":\"function\"}]`\n//\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\tout, err := abi.Pack(\"isBar\", common.Base58ToAddress(\"01\"))\n//\tif err != nil {\n//\t\tlog.Fatalln(err)\n//\t}\n//\n//\tfmt.Printf(\"%x\\n\", out)\n//\t// Output:\n//\t// 1f2c40920000000000000000000000000000000000000000000000000000000000000001\n//}\n//\n//func TestInputVariableInputLength(t *testing.T) {\n//\tconst definition = `[\n//\t{ \"type\" : \"function\", \"name\" : \"strOne\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"string\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"bytesOne\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"bytes\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"strTwo\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"string\" }, { \"name\" : \"str1\", \"type\" : \"string\" } ] }\n//\t]`\n//\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tt.Fatal(err)\n//\t}\n//\n//\t// test one string\n//\tstrin := \"hello world\"\n//\tstrpack, err := abi.Pack(\"strOne\", strin)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\toffset := make([]byte, 32)\n//\toffset[31] = 32\n//\tlength := make([]byte, 32)\n//\tlength[31] = byte(len(strin))\n//\tvalue := common.RightPadBytes([]byte(strin), 32)\n//\texp := append(offset, append(length, value...)...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tstrpack = strpack[4:]\n//\tif !bytes.Equal(strpack, exp) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, strpack)\n//\t}\n//\n//\t// test one bytes\n//\tbtspack, err := abi.Pack(\"bytesOne\", []byte(strin))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tbtspack = btspack[4:]\n//\tif !bytes.Equal(btspack, exp) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, btspack)\n//\t}\n//\n//\t//  test two strings\n//\tstr1 := \"hello\"\n//\tstr2 := \"world\"\n//\tstr2pack, err := abi.Pack(\"strTwo\", str1, str2)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\toffset1 := make([]byte, 32)\n//\toffset1[31] = 64\n//\tlength1 := make([]byte, 32)\n//\tlength1[31] = byte(len(str1))\n//\tvalue1 := common.RightPadBytes([]byte(str1), 32)\n//\n//\toffset2 := make([]byte, 32)\n//\toffset2[31] = 128\n//\tlength2 := make([]byte, 32)\n//\tlength2[31] = byte(len(str2))\n//\tvalue2 := common.RightPadBytes([]byte(str2), 32)\n//\n//\texp2 := append(offset1, offset2...)\n//\texp2 = append(exp2, append(length1, value1...)...)\n//\texp2 = append(exp2, append(length2, value2...)...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tstr2pack = str2pack[4:]\n//\tif !bytes.Equal(str2pack, exp2) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, str2pack)\n//\t}\n//\n//\t// test two strings, first > 32, second < 32\n//\tstr1 = strings.Repeat(\"a\", 33)\n//\tstr2pack, err = abi.Pack(\"strTwo\", str1, str2)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\toffset1 = make([]byte, 32)\n//\toffset1[31] = 64\n//\tlength1 = make([]byte, 32)\n//\tlength1[31] = byte(len(str1))\n//\tvalue1 = common.RightPadBytes([]byte(str1), 64)\n//\toffset2[31] = 160\n//\n//\texp2 = append(offset1, offset2...)\n//\texp2 = append(exp2, append(length1, value1...)...)\n//\texp2 = append(exp2, append(length2, value2...)...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tstr2pack = str2pack[4:]\n//\tif !bytes.Equal(str2pack, exp2) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, str2pack)\n//\t}\n//\n//\t// test two strings, first > 32, second >32\n//\tstr1 = strings.Repeat(\"a\", 33)\n//\tstr2 = strings.Repeat(\"a\", 33)\n//\tstr2pack, err = abi.Pack(\"strTwo\", str1, str2)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\toffset1 = make([]byte, 32)\n//\toffset1[31] = 64\n//\tlength1 = make([]byte, 32)\n//\tlength1[31] = byte(len(str1))\n//\tvalue1 = common.RightPadBytes([]byte(str1), 64)\n//\n//\toffset2 = make([]byte, 32)\n//\toffset2[31] = 160\n//\tlength2 = make([]byte, 32)\n//\tlength2[31] = byte(len(str2))\n//\tvalue2 = common.RightPadBytes([]byte(str2), 64)\n//\n//\texp2 = append(offset1, offset2...)\n//\texp2 = append(exp2, append(length1, value1...)...)\n//\texp2 = append(exp2, append(length2, value2...)...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tstr2pack = str2pack[4:]\n//\tif !bytes.Equal(str2pack, exp2) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, str2pack)\n//\t}\n//}\n//\n//func TestInputFixedArrayAndVariableInputLength(t *testing.T) {\n//\tconst definition = `[\n//\t{ \"type\" : \"function\", \"name\" : \"fixedArrStr\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"string\" }, { \"name\" : \"fixedArr\", \"type\" : \"uint256[2]\" } ] },\n//\t{ \"type\" : \"function\", \"name\" : \"fixedArrBytes\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"bytes\" }, { \"name\" : \"fixedArr\", \"type\" : \"uint256[2]\" } ] },\n//    { \"type\" : \"function\", \"name\" : \"mixedArrStr\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"string\" }, { \"name\" : \"fixedArr\", \"type\": \"uint256[2]\" }, { \"name\" : \"dynArr\", \"type\": \"uint256[]\" } ] },\n//    { \"type\" : \"function\", \"name\" : \"doubleFixedArrStr\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"string\" }, { \"name\" : \"fixedArr1\", \"type\": \"uint256[2]\" }, { \"name\" : \"fixedArr2\", \"type\": \"uint256[3]\" } ] },\n//    { \"type\" : \"function\", \"name\" : \"multipleMixedArrStr\", \"constant\" : true, \"inputs\" : [ { \"name\" : \"str\", \"type\" : \"string\" }, { \"name\" : \"fixedArr1\", \"type\": \"uint256[2]\" }, { \"name\" : \"dynArr\", \"type\" : \"uint256[]\" }, { \"name\" : \"fixedArr2\", \"type\" : \"uint256[3]\" } ] }\n//\t]`\n//\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\t// test string, fixed array uint256[2]\n//\tstrin := \"hello world\"\n//\tarrin := [2]*big.Int{big.NewInt(1), big.NewInt(2)}\n//\tfixedArrStrPack, err := abi.Pack(\"fixedArrStr\", strin, arrin)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\t// generate expected output\n//\toffset := make([]byte, 32)\n//\toffset[31] = 96\n//\tlength := make([]byte, 32)\n//\tlength[31] = byte(len(strin))\n//\tstrvalue := common.RightPadBytes([]byte(strin), 32)\n//\tarrinvalue1 := common.LeftPadBytes(arrin[0].Bytes(), 32)\n//\tarrinvalue2 := common.LeftPadBytes(arrin[1].Bytes(), 32)\n//\texp := append(offset, arrinvalue1...)\n//\texp = append(exp, arrinvalue2...)\n//\texp = append(exp, append(length, strvalue...)...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tfixedArrStrPack = fixedArrStrPack[4:]\n//\tif !bytes.Equal(fixedArrStrPack, exp) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, fixedArrStrPack)\n//\t}\n//\n//\t// test byte array, fixed array uint256[2]\n//\tbytesin := []byte(strin)\n//\tarrin = [2]*big.Int{big.NewInt(1), big.NewInt(2)}\n//\tfixedArrBytesPack, err := abi.Pack(\"fixedArrBytes\", bytesin, arrin)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\t// generate expected output\n//\toffset = make([]byte, 32)\n//\toffset[31] = 96\n//\tlength = make([]byte, 32)\n//\tlength[31] = byte(len(strin))\n//\tstrvalue = common.RightPadBytes([]byte(strin), 32)\n//\tarrinvalue1 = common.LeftPadBytes(arrin[0].Bytes(), 32)\n//\tarrinvalue2 = common.LeftPadBytes(arrin[1].Bytes(), 32)\n//\texp = append(offset, arrinvalue1...)\n//\texp = append(exp, arrinvalue2...)\n//\texp = append(exp, append(length, strvalue...)...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tfixedArrBytesPack = fixedArrBytesPack[4:]\n//\tif !bytes.Equal(fixedArrBytesPack, exp) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, fixedArrBytesPack)\n//\t}\n//\n//\t// test string, fixed array uint256[2], dynamic array uint256[]\n//\tstrin = \"hello world\"\n//\tfixedarrin := [2]*big.Int{big.NewInt(1), big.NewInt(2)}\n//\tdynarrin := []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}\n//\tmixedArrStrPack, err := abi.Pack(\"mixedArrStr\", strin, fixedarrin, dynarrin)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\t// generate expected output\n//\tstroffset := make([]byte, 32)\n//\tstroffset[31] = 128\n//\tstrlength := make([]byte, 32)\n//\tstrlength[31] = byte(len(strin))\n//\tstrvalue = common.RightPadBytes([]byte(strin), 32)\n//\tfixedarrinvalue1 := common.LeftPadBytes(fixedarrin[0].Bytes(), 32)\n//\tfixedarrinvalue2 := common.LeftPadBytes(fixedarrin[1].Bytes(), 32)\n//\tdynarroffset := make([]byte, 32)\n//\tdynarroffset[31] = byte(160 + ((len(strin)/32)+1)*32)\n//\tdynarrlength := make([]byte, 32)\n//\tdynarrlength[31] = byte(len(dynarrin))\n//\tdynarrinvalue1 := common.LeftPadBytes(dynarrin[0].Bytes(), 32)\n//\tdynarrinvalue2 := common.LeftPadBytes(dynarrin[1].Bytes(), 32)\n//\tdynarrinvalue3 := common.LeftPadBytes(dynarrin[2].Bytes(), 32)\n//\texp = append(stroffset, fixedarrinvalue1...)\n//\texp = append(exp, fixedarrinvalue2...)\n//\texp = append(exp, dynarroffset...)\n//\texp = append(exp, append(strlength, strvalue...)...)\n//\tdynarrarg := append(dynarrlength, dynarrinvalue1...)\n//\tdynarrarg = append(dynarrarg, dynarrinvalue2...)\n//\tdynarrarg = append(dynarrarg, dynarrinvalue3...)\n//\texp = append(exp, dynarrarg...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tmixedArrStrPack = mixedArrStrPack[4:]\n//\tif !bytes.Equal(mixedArrStrPack, exp) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, mixedArrStrPack)\n//\t}\n//\n//\t// test string, fixed array uint256[2], fixed array uint256[3]\n//\tstrin = \"hello world\"\n//\tfixedarrin1 := [2]*big.Int{big.NewInt(1), big.NewInt(2)}\n//\tfixedarrin2 := [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}\n//\tdoubleFixedArrStrPack, err := abi.Pack(\"doubleFixedArrStr\", strin, fixedarrin1, fixedarrin2)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\t// generate expected output\n//\tstroffset = make([]byte, 32)\n//\tstroffset[31] = 192\n//\tstrlength = make([]byte, 32)\n//\tstrlength[31] = byte(len(strin))\n//\tstrvalue = common.RightPadBytes([]byte(strin), 32)\n//\tfixedarrin1value1 := common.LeftPadBytes(fixedarrin1[0].Bytes(), 32)\n//\tfixedarrin1value2 := common.LeftPadBytes(fixedarrin1[1].Bytes(), 32)\n//\tfixedarrin2value1 := common.LeftPadBytes(fixedarrin2[0].Bytes(), 32)\n//\tfixedarrin2value2 := common.LeftPadBytes(fixedarrin2[1].Bytes(), 32)\n//\tfixedarrin2value3 := common.LeftPadBytes(fixedarrin2[2].Bytes(), 32)\n//\texp = append(stroffset, fixedarrin1value1...)\n//\texp = append(exp, fixedarrin1value2...)\n//\texp = append(exp, fixedarrin2value1...)\n//\texp = append(exp, fixedarrin2value2...)\n//\texp = append(exp, fixedarrin2value3...)\n//\texp = append(exp, append(strlength, strvalue...)...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tdoubleFixedArrStrPack = doubleFixedArrStrPack[4:]\n//\tif !bytes.Equal(doubleFixedArrStrPack, exp) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, doubleFixedArrStrPack)\n//\t}\n//\n//\t// test string, fixed array uint256[2], dynamic array uint256[], fixed array uint256[3]\n//\tstrin = \"hello world\"\n//\tfixedarrin1 = [2]*big.Int{big.NewInt(1), big.NewInt(2)}\n//\tdynarrin = []*big.Int{big.NewInt(1), big.NewInt(2)}\n//\tfixedarrin2 = [3]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}\n//\tmultipleMixedArrStrPack, err := abi.Pack(\"multipleMixedArrStr\", strin, fixedarrin1, dynarrin, fixedarrin2)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t}\n//\n//\t// generate expected output\n//\tstroffset = make([]byte, 32)\n//\tstroffset[31] = 224\n//\tstrlength = make([]byte, 32)\n//\tstrlength[31] = byte(len(strin))\n//\tstrvalue = common.RightPadBytes([]byte(strin), 32)\n//\tfixedarrin1value1 = common.LeftPadBytes(fixedarrin1[0].Bytes(), 32)\n//\tfixedarrin1value2 = common.LeftPadBytes(fixedarrin1[1].Bytes(), 32)\n//\tdynarroffset = U256(big.NewInt(int64(256 + ((len(strin)/32)+1)*32)))\n//\tdynarrlength = make([]byte, 32)\n//\tdynarrlength[31] = byte(len(dynarrin))\n//\tdynarrinvalue1 = common.LeftPadBytes(dynarrin[0].Bytes(), 32)\n//\tdynarrinvalue2 = common.LeftPadBytes(dynarrin[1].Bytes(), 32)\n//\tfixedarrin2value1 = common.LeftPadBytes(fixedarrin2[0].Bytes(), 32)\n//\tfixedarrin2value2 = common.LeftPadBytes(fixedarrin2[1].Bytes(), 32)\n//\tfixedarrin2value3 = common.LeftPadBytes(fixedarrin2[2].Bytes(), 32)\n//\texp = append(stroffset, fixedarrin1value1...)\n//\texp = append(exp, fixedarrin1value2...)\n//\texp = append(exp, dynarroffset...)\n//\texp = append(exp, fixedarrin2value1...)\n//\texp = append(exp, fixedarrin2value2...)\n//\texp = append(exp, fixedarrin2value3...)\n//\texp = append(exp, append(strlength, strvalue...)...)\n//\tdynarrarg = append(dynarrlength, dynarrinvalue1...)\n//\tdynarrarg = append(dynarrarg, dynarrinvalue2...)\n//\texp = append(exp, dynarrarg...)\n//\n//\t// ignore first 4 bytes of the output. This is the function identifier\n//\tmultipleMixedArrStrPack = multipleMixedArrStrPack[4:]\n//\tif !bytes.Equal(multipleMixedArrStrPack, exp) {\n//\t\tt.Errorf(\"expected %x, got %x\\n\", exp, multipleMixedArrStrPack)\n//\t}\n//}\n//\n//func TestDefaultFunctionParsing(t *testing.T) {\n//\tconst definition = `[{ \"name\" : \"balance\" }]`\n//\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tt.Fatal(err)\n//\t}\n//\n//\tif _, ok := abi.Methods[\"balance\"]; !ok {\n//\t\tt.Error(\"expected 'balance' to be present\")\n//\t}\n//}\n//\n//func TestBareEvents(t *testing.T) {\n//\tconst definition = `[\n//\t{ \"type\" : \"event\", \"name\" : \"balance\" },\n//\t{ \"type\" : \"event\", \"name\" : \"anon\", \"anonymous\" : true},\n//\t{ \"type\" : \"event\", \"name\" : \"args\", \"inputs\" : [{ \"indexed\":false, \"name\":\"arg0\", \"type\":\"uint256\" }, { \"indexed\":true, \"name\":\"arg1\", \"type\":\"address\" }] }\n//\t]`\n//\n//\targ0, _ := NewType(\"uint256\")\n//\targ1, _ := NewType(\"address\")\n//\n//\texpectedEvents := map[string]struct {\n//\t\tAnonymous bool\n//\t\tArgs      []Argument\n//\t}{\n//\t\t\"balance\": {false, nil},\n//\t\t\"anon\":    {true, nil},\n//\t\t\"args\": {false, []Argument{\n//\t\t\t{Name: \"arg0\", Type: arg0, Indexed: false},\n//\t\t\t{Name: \"arg1\", Type: arg1, Indexed: true},\n//\t\t}},\n//\t}\n//\n//\tabi, err := JSON(strings.NewReader(definition))\n//\tif err != nil {\n//\t\tt.Fatal(err)\n//\t}\n//\n//\tif len(abi.Events) != len(expectedEvents) {\n//\t\tt.Fatalf(\"invalid number of events after parsing, want %d, got %d\", len(expectedEvents), len(abi.Events))\n//\t}\n//\n//\tfor name, exp := range expectedEvents {\n//\t\tgot, ok := abi.Events[name]\n//\t\tif !ok {\n//\t\t\tt.Errorf(\"could not found event %s\", name)\n//\t\t\tcontinue\n//\t\t}\n//\t\tif got.Anonymous != exp.Anonymous {\n//\t\t\tt.Errorf(\"invalid anonymous indication for event %s, want %v, got %v\", name, exp.Anonymous, got.Anonymous)\n//\t\t}\n//\t\tif len(got.Inputs) != len(exp.Args) {\n//\t\t\tt.Errorf(\"invalid number of args, want %d, got %d\", len(exp.Args), len(got.Inputs))\n//\t\t\tcontinue\n//\t\t}\n//\t\tfor i, arg := range exp.Args {\n//\t\t\tif arg.Name != got.Inputs[i].Name {\n//\t\t\t\tt.Errorf(\"events[%s].Input[%d] has an invalid name, want %s, got %s\", name, i, arg.Name, got.Inputs[i].Name)\n//\t\t\t}\n//\t\t\tif arg.Indexed != got.Inputs[i].Indexed {\n//\t\t\t\tt.Errorf(\"events[%s].Input[%d] has an invalid indexed indication, want %v, got %v\", name, i, arg.Indexed, got.Inputs[i].Indexed)\n//\t\t\t}\n//\t\t\tif arg.Type.T != got.Inputs[i].Type.T {\n//\t\t\t\tt.Errorf(\"events[%s].Input[%d] has an invalid type, want %x, got %x\", name, i, arg.Type.T, got.Inputs[i].Type.T)\n//\t\t\t}\n//\t\t}\n//\t}\n//}\n//\n//// TestUnpackEvent is based on this contract:\n////    contract T {\n////      event received(address sender, uint amount, bytes memo);\n////      event receivedAddr(address sender);\n////      function receive(bytes memo) external payable {\n////        received(msg.sender, msg.value, memo);\n////        receivedAddr(msg.sender);\n////      }\n////    }\n//// When receive(\"X\") is called with sender 0x00... and value 1, it produces this tx receipt:\n////   receipt{status=1 cgas=23949 bloom=00000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000040200000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 logs=[log: b6818c8064f645cd82d99b59a1a267d6d61117ef [75fd880d39c1daf53b6547ab6cb59451fc6452d27caa90e5b6649dd8293b9eed] 000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158 9ae378b6d4409eada347a5dc0c180f186cb62dc68fcc0f043425eb917335aa28 0 95d429d309bb9d753954195fe2d69bd140b4ae731b9b5b605c34323de162cf00 0]}\n//func TestUnpackEvent(t *testing.T) {\n//\tconst abiJSON = `[{\"constant\":false,\"inputs\":[{\"name\":\"memo\",\"type\":\"bytes\"}],\"name\":\"receive\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"memo\",\"type\":\"bytes\"}],\"name\":\"received\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"receivedAddr\",\"type\":\"event\"}]`\n//\tabi, err := JSON(strings.NewReader(abiJSON))\n//\tif err != nil {\n//\t\tt.Fatal(err)\n//\t}\n//\n//\tconst hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158`\n//\tdata, err := hex.DecodeString(hexdata)\n//\tif err != nil {\n//\t\tt.Fatal(err)\n//\t}\n//\tif len(data)%32 == 0 {\n//\t\tt.Errorf(\"len(data) is %d, want a non-multiple of 32\", len(data))\n//\t}\n//\n//\ttype ReceivedEvent struct {\n//\t\tAddress common.Address\n//\t\tAmount  *big.Int\n//\t\tMemo    []byte\n//\t}\n//\tvar ev ReceivedEvent\n//\n//\terr = abi.Unpack(&ev, \"received\", data)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t} else {\n//\t\tt.Logf(\"len(data): %d; received event: %+v\", len(data), ev)\n//\t}\n//\n//\tev2 := make([]interface{}, 3)\n//\terr = abi.Unpack(&ev2, \"received\", data)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t} else {\n//\t\tt.Logf(\"len(data): %d; received event: %+v\", len(data), ev2)\n//\t}\n//\n//\ttype ReceivedAddrEvent struct {\n//\t\tAddress common.Address\n//\t}\n//\tvar receivedAddrEv ReceivedAddrEvent\n//\terr = abi.Unpack(&receivedAddrEv, \"receivedAddr\", data)\n//\tif err != nil {\n//\t\tt.Error(err)\n//\t} else {\n//\t\tt.Logf(\"len(data): %d; received event: %+v\", len(data), receivedAddrEv)\n//\t}\n//}\n//\n//func TestABI_MethodById(t *testing.T) {\n//\tconst abiJSON = `[\n//\t\t{\"type\":\"function\",\"name\":\"receive\",\"constant\":false,\"inputs\":[{\"name\":\"memo\",\"type\":\"bytes\"}],\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\"},\n//\t\t{\"type\":\"event\",\"name\":\"received\",\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"memo\",\"type\":\"bytes\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"fixedArrStr\",\"constant\":true,\"inputs\":[{\"name\":\"str\",\"type\":\"string\"},{\"name\":\"fixedArr\",\"type\":\"uint256[2]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"fixedArrBytes\",\"constant\":true,\"inputs\":[{\"name\":\"str\",\"type\":\"bytes\"},{\"name\":\"fixedArr\",\"type\":\"uint256[2]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"mixedArrStr\",\"constant\":true,\"inputs\":[{\"name\":\"str\",\"type\":\"string\"},{\"name\":\"fixedArr\",\"type\":\"uint256[2]\"},{\"name\":\"dynArr\",\"type\":\"uint256[]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"doubleFixedArrStr\",\"constant\":true,\"inputs\":[{\"name\":\"str\",\"type\":\"string\"},{\"name\":\"fixedArr1\",\"type\":\"uint256[2]\"},{\"name\":\"fixedArr2\",\"type\":\"uint256[3]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"multipleMixedArrStr\",\"constant\":true,\"inputs\":[{\"name\":\"str\",\"type\":\"string\"},{\"name\":\"fixedArr1\",\"type\":\"uint256[2]\"},{\"name\":\"dynArr\",\"type\":\"uint256[]\"},{\"name\":\"fixedArr2\",\"type\":\"uint256[3]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"balance\",\"constant\":true},\n//\t\t{\"type\":\"function\",\"name\":\"send\",\"constant\":false,\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"test\",\"constant\":false,\"inputs\":[{\"name\":\"number\",\"type\":\"uint32\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"string\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"string\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"bool\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"bool\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"address\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"address\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"uint64[2]\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"uint64[2]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"uint64[]\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"uint64[]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"foo\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"uint32\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"bar\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"uint32\"},{\"name\":\"string\",\"type\":\"uint16\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"_slice\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"uint32[2]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"__slice256\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"uint256[2]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"sliceAddress\",\"constant\":false,\"inputs\":[{\"name\":\"inputs\",\"type\":\"address[]\"}]},\n//\t\t{\"type\":\"function\",\"name\":\"sliceMultiAddress\",\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"address[]\"},{\"name\":\"b\",\"type\":\"address[]\"}]}\n//\t]\n//`\n//\tabi, err := JSON(strings.NewReader(abiJSON))\n//\tif err != nil {\n//\t\tt.Fatal(err)\n//\t}\n//\tfor name, m := range abi.Methods {\n//\t\ta := fmt.Sprintf(\"%v\", m)\n//\t\tm2, err := abi.MethodById(m.Id())\n//\t\tif err != nil {\n//\t\t\tt.Fatalf(\"Failed to look up ABI method: %v\", err)\n//\t\t}\n//\t\tb := fmt.Sprintf(\"%v\", m2)\n//\t\tif a != b {\n//\t\t\tt.Errorf(\"Method %v (id %v) not 'findable' by id in ABI\", name, common.ToHex(m.Id()))\n//\t\t}\n//\t}\n//\n//}\n"
  },
  {
    "path": "accounts/abi/argument.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n)\n\n// Argument holds the name of the argument and the corresponding type.\n// Types are used when packing and testing arguments.\ntype Argument struct {\n\tName    string\n\tType    Type\n\tIndexed bool // indexed is only used by events\n}\n\ntype Arguments []Argument\n\ntype ArgumentMarshaling struct {\n\tName         string\n\tType         string\n\tInternalType string\n\tComponents   []ArgumentMarshaling\n\tIndexed      bool\n}\n\n// UnmarshalJSON implements json.Unmarshaler interface\nfunc (argument *Argument) UnmarshalJSON(data []byte) error {\n\tvar arg ArgumentMarshaling\n\terr := json.Unmarshal(data, &arg)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"argument json err: %v\", err)\n\t}\n\n\targument.Type, err = NewType(arg.Type, arg.InternalType, arg.Components)\n\tif err != nil {\n\t\treturn err\n\t}\n\targument.Name = arg.Name\n\targument.Indexed = arg.Indexed\n\n\treturn nil\n}\n\n// LengthNonIndexed returns the number of arguments when not counting 'indexed' ones. Only events\n// can ever have 'indexed' arguments, it should always be false on arguments for method input/output\nfunc (arguments Arguments) LengthNonIndexed() int {\n\tout := 0\n\tfor _, arg := range arguments {\n\t\tif !arg.Indexed {\n\t\t\tout++\n\t\t}\n\t}\n\treturn out\n}\n\n// NonIndexed returns the arguments with indexed arguments filtered out\nfunc (arguments Arguments) NonIndexed() Arguments {\n\tvar ret []Argument\n\tfor _, arg := range arguments {\n\t\tif !arg.Indexed {\n\t\t\tret = append(ret, arg)\n\t\t}\n\t}\n\treturn ret\n}\n\n// isTuple returns true for non-atomic constructs, like (uint,uint) or uint[]\nfunc (arguments Arguments) isTuple() bool {\n\treturn len(arguments) > 1\n}\n\n// Unpack performs the operation hexdata -> Go format\nfunc (arguments Arguments) Unpack(v interface{}, data []byte) error {\n\n\t// make sure the passed value is arguments pointer\n\tif reflect.Ptr != reflect.ValueOf(v).Kind() {\n\t\treturn fmt.Errorf(\"abi: Unpack(non-pointer %T)\", v)\n\t}\n\tmarshalledValues, err := arguments.UnpackValues(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif len(marshalledValues) == 0 {\n\t\treturn fmt.Errorf(\"abi: Unpack(no-values unmarshalled %T)\", v)\n\t}\n\n\tif arguments.isTuple() {\n\t\treturn arguments.unpackTuple(v, marshalledValues)\n\t}\n\treturn arguments.unpackAtomic(v, marshalledValues[0])\n}\n\n// UnpackIntoMap performs the operation hexdata -> mapping of argument name to argument value\nfunc (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte) error {\n\tmarshalledValues, err := arguments.UnpackValues(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn arguments.unpackIntoMap(v, marshalledValues)\n}\n\n// unpackIntoMap unpacks marshalledValues into the provided map[string]interface{}\nfunc (arguments Arguments) unpackIntoMap(v map[string]interface{}, marshalledValues []interface{}) error {\n\t// Make sure map is not nil\n\tif v == nil {\n\t\treturn fmt.Errorf(\"abi: cannot unpack into a nil map\")\n\t}\n\n\tfor i, arg := range arguments.NonIndexed() {\n\t\tv[arg.Name] = marshalledValues[i]\n\t}\n\treturn nil\n}\n\n// unpackTuple unpacks ( hexdata -> go ) a batch of values.\nfunc (arguments Arguments) unpackTuple(v interface{}, marshalledValues []interface{}) error {\n\tvalue := reflect.ValueOf(v).Elem()\n\tnonIndexedArgs := arguments.NonIndexed()\n\n\tswitch value.Kind() {\n\tcase reflect.Struct:\n\t\targNames := make([]string, len(nonIndexedArgs))\n\t\tfor i, arg := range nonIndexedArgs {\n\t\t\targNames[i] = arg.Name\n\t\t}\n\t\tvar err error\n\t\tabi2struct, err := mapArgNamesToStructFields(argNames, value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor i, arg := range nonIndexedArgs {\n\t\t\tfield := value.FieldByName(abi2struct[arg.Name])\n\t\t\tif !field.IsValid() {\n\t\t\t\treturn fmt.Errorf(\"abi: field %s can't be found in the given value\", arg.Name)\n\t\t\t}\n\t\t\tif err := set(field, reflect.ValueOf(marshalledValues[i])); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\tcase reflect.Slice, reflect.Array:\n\t\tif value.Len() < len(marshalledValues) {\n\t\t\treturn fmt.Errorf(\"abi: insufficient number of arguments for unpack, want %d, got %d\", len(arguments), value.Len())\n\t\t}\n\t\tfor i := range nonIndexedArgs {\n\t\t\tif err := set(value.Index(i), reflect.ValueOf(marshalledValues[i])); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\tdefault:\n\t\treturn fmt.Errorf(\"abi:[2] cannot unmarshal tuple in to %v\", value.Type())\n\t}\n\treturn nil\n}\n\n// unpackAtomic unpacks ( hexdata -> go ) a single value\nfunc (arguments Arguments) unpackAtomic(v interface{}, marshalledValues interface{}) error {\n\tdst := reflect.ValueOf(v).Elem()\n\tsrc := reflect.ValueOf(marshalledValues)\n\n\tif dst.Kind() == reflect.Struct && src.Kind() != reflect.Struct {\n\t\treturn set(dst.Field(0), src)\n\t}\n\treturn set(dst, src)\n}\n\n// Computes the full size of an array;\n// i.e. counting nested arrays, which count towards size for unpacking.\nfunc getArraySize(arr *Type) int {\n\tsize := arr.Size\n\t// Arrays can be nested, with each element being the same size\n\tarr = arr.Elem\n\tfor arr.T == ArrayTy {\n\t\t// Keep multiplying by elem.Size while the elem is an array.\n\t\tsize *= arr.Size\n\t\tarr = arr.Elem\n\t}\n\t// Now we have the full array size, including its children.\n\treturn size\n}\n\n// UnpackValues can be used to unpack ABI-encoded hexdata according to the ABI-specification,\n// without supplying a struct to unpack into. Instead, this method returns a list containing the\n// values. An atomic argument will be a list with one element.\nfunc (arguments Arguments) UnpackValues(data []byte) ([]interface{}, error) {\n\tretval := make([]interface{}, 0, arguments.LengthNonIndexed())\n\tvirtualArgs := 0\n\tfor index, arg := range arguments.NonIndexed() {\n\t\tmarshalledValue, err := toGoType((index+virtualArgs)*32, arg.Type, data)\n\t\tif arg.Type.T == ArrayTy {\n\t\t\t// If we have a static array, like [3]uint256, these are coded as\n\t\t\t// just like uint256,uint256,uint256.\n\t\t\t// This means that we need to add two 'virtual' arguments when\n\t\t\t// we count the index from now on.\n\t\t\t//\n\t\t\t// Array values nested multiple levels deep are also encoded inline:\n\t\t\t// [2][3]uint256: uint256,uint256,uint256,uint256,uint256,uint256\n\t\t\t//\n\t\t\t// Calculate the full array size to get the correct offset for the next argument.\n\t\t\t// Decrement it by 1, as the normal index increment is still applied.\n\t\t\tvirtualArgs += getArraySize(&arg.Type) - 1\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tretval = append(retval, marshalledValue)\n\t}\n\treturn retval, nil\n}\n\n// PackValues performs the operation Go format -> Hexdata\n// It is the semantic opposite of UnpackValues\nfunc (arguments Arguments) PackValues(args []interface{}) ([]byte, error) {\n\treturn arguments.Pack(args...)\n}\n\nfunc (arguments Arguments) PackPrefix(args ...interface{}) ([]byte, error) {\n\tabiArgs := arguments\n\tif len(args) != len(abiArgs) {\n\t\treturn nil, fmt.Errorf(\"argument count mismatch: %d for %d\", len(args), len(abiArgs))\n\t}\n\tvar result []c_type.PKr\n\tfor i, a := range args {\n\t\tinput := abiArgs[i]\n\t\t// pack the input\n\t\tpkrs, err := input.Type.getAllAddress(reflect.ValueOf(a))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tresult = append(result, pkrs...)\n\t}\n\tvar ret []byte\n\tlenBytes := math.PaddedBigBytes(big.NewInt(int64(len(result))), 2)\n\tret = append(ret, lenBytes...)\n\tfor _, pkr := range result {\n\t\tret = append(ret, pkr[:]...)\n\t}\n\treturn ret, nil\n\n}\n\n// Pack performs the operation Go format -> Hexdata\nfunc (arguments Arguments) Pack(args ...interface{}) ([]byte, error) {\n\t// Make sure arguments match up and pack them\n\tabiArgs := arguments\n\tif len(args) != len(abiArgs) {\n\t\treturn nil, fmt.Errorf(\"argument count mismatch: %d for %d\", len(args), len(abiArgs))\n\t}\n\t// variable input is the output appended at the end of packed\n\t// output. This is used for strings and bytes types input.\n\tvar variableInput []byte\n\n\t// input offset is the bytes offset for packed output\n\tinputOffset := 0\n\tfor _, abiArg := range abiArgs {\n\t\tif abiArg.Type.T == ArrayTy {\n\t\t\tinputOffset += 32 * abiArg.Type.Size\n\t\t} else {\n\t\t\tinputOffset += 32\n\t\t}\n\t}\n\tvar ret []byte\n\tfor i, a := range args {\n\t\tinput := abiArgs[i]\n\t\t// pack the input\n\t\tpacked, err := input.Type.pack(reflect.ValueOf(a))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// check for a slice type (string, bytes, slice)\n\t\tif input.Type.requiresLengthPrefix() {\n\t\t\t// calculate the offset\n\t\t\toffset := inputOffset + len(variableInput)\n\t\t\t// set the offset\n\t\t\tret = append(ret, packNum(reflect.ValueOf(offset))...)\n\t\t\t// Append the packed output to the variable input. The variable input\n\t\t\t// will be appended at the end of the input.\n\t\t\tvariableInput = append(variableInput, packed...)\n\t\t} else {\n\t\t\t// append the packed value to the input\n\t\t\tret = append(ret, packed...)\n\t\t}\n\t}\n\t// append the variable input at the end of the packed input\n\tret = append(ret, variableInput...)\n\n\treturn ret, nil\n}\n\n// capitalise makes the first character of a string upper case, also removing any\n// prefixing underscores from the variable names.\nfunc capitalise(input string) string {\n\tfor len(input) > 0 && input[0] == '_' {\n\t\tinput = input[1:]\n\t}\n\tif len(input) == 0 {\n\t\treturn \"\"\n\t}\n\treturn strings.ToUpper(input[:1]) + input[1:]\n}\n\n// ToCamelCase converts an under-score string to a camel-case string\nfunc ToCamelCase(input string) string {\n\tparts := strings.Split(input, \"_\")\n\tfor i, s := range parts {\n\t\tif len(s) > 0 {\n\t\t\tparts[i] = strings.ToUpper(s[:1]) + s[1:]\n\t\t}\n\t}\n\treturn strings.Join(parts, \"\")\n}\n"
  },
  {
    "path": "accounts/abi/bind/auth.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bind\n\nimport (\n\t\"encoding/binary\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/accounts/keystore\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\n// NewTransactor is a utility method to easily create a transaction signer from\n// an encrypted json key stream and the associated passphrase.\nfunc NewTransactor(keyin io.Reader, passphrase string, value *big.Int) (*TransactOpts, error) {\n\tsuperzk.ZeroInit_NoCircuit()\n\tjson, err := ioutil.ReadAll(keyin)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tkey, err := keystore.DecryptKey(json, passphrase)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfromPkr := GetMainPkr(key)\n\n\treturn NewKeyedTransactor(key, fromPkr, value), nil\n}\n\nfunc encodeNumber(number uint64) []byte {\n\tenc := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(enc, number)\n\treturn enc\n}\n\nfunc GetMainPkr(key *keystore.Key) c_type.PKr {\n\n\tsalt := encodeNumber(1)\n\t//log.Info(\"GenIndexPKr\", \"salt\", hexutil.Encode(salt))\n\trandom := append(key.Tk[:], salt...)\n\tr := crypto.Keccak256Hash(random).HashToUint256()\n\tpk := key.Address.ToUint512()\n\treturn superzk.Pk2PKr(&pk, r)\n}\n\n// NewKeyedTransactor is a utility method to easily create a transaction signer\n// from a single private key.\nfunc NewKeyedTransactor(key *keystore.Key, refundTo c_type.PKr, value *big.Int) *TransactOpts {\n\ttk := crypto.PrivkeyToTk(key.PrivateKey, key.Version)\n\treturn &TransactOpts{\n\t\tFrom:    tk.ToPk(),\n\t\tFromPKr: refundTo,\n\t\tValue:   value,\n\t\tEncrypter: func(txParam *txtool.GTxParam) (*txtool.GTx, error) {\n\t\t\tpriKey := crypto.FromECDSA(key.PrivateKey)\n\t\t\tvar seed c_type.Uint256\n\t\t\tcopy(seed[:], priKey[:])\n\t\t\tsk := superzk.Seed2Sk(&seed, key.Version)\n\t\t\tgtx, err := flight.SignTx(&sk, txParam)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn &gtx, nil\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "accounts/abi/bind/backend.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bind\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"math/big\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\nvar (\n\t// ErrNoCode is returned by call and transact operations for which the requested\n\t// recipient contract to operate on does not exist in the state db or does not\n\t// have any code associated with it (i.e. suicided).\n\tErrNoCode = errors.New(\"no contract code at given address\")\n\n\t// This error is raised when attempting to perform a pending state action\n\t// on a backend that doesn't implement PendingContractCaller.\n\tErrNoPendingState = errors.New(\"backend does not support pending state\")\n\n\t// This error is returned by WaitDeployed if contract creation leaves an\n\t// empty contract behind.\n\tErrNoCodeAfterDeploy = errors.New(\"no contract code after deployment\")\n)\n\n// ContractCaller defines the methods needed to allow operating with contract on a read\n// only basis.\ntype ContractCaller interface {\n\t// CodeAt returns the code of the given account. This is needed to differentiate\n\t// between contract internal errors and the local chain being out of sync.\n\tCodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error)\n\t// ContractCall executes an Ethereum contract call with the specified data as the\n\t// input.\n\tCallContract(ctx context.Context, call sero.CallMsg, blockNumber *big.Int) ([]byte, error)\n}\n\n// PendingContractCaller defines methods to perform contract calls on the pending state.\n// Call will try to discover this interface when access to the pending state is requested.\n// If the backend does not support the pending state, Call returns ErrNoPendingState.\ntype PendingContractCaller interface {\n\t// PendingCodeAt returns the code of the given account in the pending state.\n\tPendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error)\n\t// PendingCallContract executes an Ethereum contract call against the pending state.\n\tPendingCallContract(ctx context.Context, call sero.CallMsg) ([]byte, error)\n}\n\n// ContractTransactor defines the methods needed to allow operating with contract\n// on a write only basis. Beside the transacting method, the remainder are helpers\n// used when the user does not provide some needed values, but rather leaves it up\n// to the transactor to decide.\ntype ContractTransactor interface {\n\t// PendingCodeAt returns the code of the given account in the pending state.\n\tPendingCodeAt(ctx context.Context, account common.Address) ([]byte, error)\n\t// PendingNonceAt retrieves the current pending nonce associated with an account.\n\t//PendingNonceAt(ctx context.Context, account common.Data) (uint64, error)\n\t// SuggestGasPrice retrieves the currently suggested gas price to allow a timely\n\t// execution of a transaction.\n\tSuggestGasPrice(ctx context.Context) (*big.Int, error)\n\t// EstimateGas tries to estimate the gas needed to execute a specific\n\t// transaction based on the current pending state of the backend blockchain.\n\t// There is no guarantee that this is the true gas limit requirement as other\n\t// transactions may be added or removed by miners, but it should provide a basis\n\t// for setting a reasonable default.\n\tEstimateGas(ctx context.Context, call sero.CallMsg) (gas uint64, err error)\n\n\tGenContractTx(ctx context.Context, msg sero.CallMsg) (*txtool.GTxParam, error)\n\n\tCommitTx(ctx context.Context, arg *txtool.GTx) error\n}\n\n// ContractFilterer defines the methods needed to access log events using one-off\n// queries or continuous event subscriptions.\ntype ContractFilterer interface {\n\t// FilterLogs executes a log filter operation, blocking during execution and\n\t// returning all the results in one batch.\n\t//\n\t// TODO(karalabe): Deprecate when the subscription one can return past data too.\n\tFilterLogs(ctx context.Context, query sero.FilterQuery) ([]types.Log, error)\n\n\t// SubscribeFilterLogs creates a background log filtering operation, returning\n\t// a subscription immediately, which can be used to stream the found events.\n\tSubscribeFilterLogs(ctx context.Context, query sero.FilterQuery, ch chan<- types.Log) (sero.Subscription, error)\n}\n\n// DeployBackend wraps the operations needed by WaitMined and WaitDeployed.\ntype DeployBackend interface {\n\tTransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)\n\tCodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)\n}\n\n// ContractBackend defines the methods needed to work with contracts on a read-write basis.\ntype ContractBackend interface {\n\tContractCaller\n\tContractTransactor\n\tContractFilterer\n}\n"
  },
  {
    "path": "accounts/abi/bind/base.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bind\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/sero-cash/go-sero\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\n// SignerFn is a signer function callback when a contract requires a method to\n// sign the transaction before submission.\ntype EncrypterFn func(txParam *txtool.GTxParam) (tx *txtool.GTx, e error)\n\n// CallOpts is the collection of options to fine tune a contract call request.\ntype CallOpts struct {\n\tPending     bool            // Whether to operate on the pending state or the last known one\n\tFromPKr     *c_type.PKr     // Optional the sender address, otherwise the first account is used\n\tBlockNumber *big.Int        // Optional the block number on which the call should be performed\n\tContext     context.Context // Network context to support cancellation and timeouts (nil = no timeout)\n}\n\n// TransactOpts is the collection of authorization data required to create a\n// valid Ethereum transaction.\ntype TransactOpts struct {\n\tFrom      address.PKAddress\n\tFromPKr   c_type.PKr  // the pkr of form account\n\tEncrypter EncrypterFn // Method to use for signing the transaction (mandatory)\n\n\tValue    *big.Int // Funds to transfer along along the transaction (nil = 0 = no funds)\n\tGasPrice *big.Int // Gas price to use for the transaction execution (nil = gas price oracle)\n\tGasLimit uint64   // Gas limit to set for the transaction execution (0 = estimate)\n\n\tContext context.Context // Network context to support cancellation and timeouts (nil = no timeout)\n}\n\n// FilterOpts is the collection of options to fine tune filtering for events\n// within a bound contract.\ntype FilterOpts struct {\n\tStart uint64  // Start of the queried range\n\tEnd   *uint64 // End of the range (nil = latest)\n\n\tContext context.Context // Network context to support cancellation and timeouts (nil = no timeout)\n}\n\n// WatchOpts is the collection of options to fine tune subscribing for events\n// within a bound contract.\ntype WatchOpts struct {\n\tStart   *uint64         // Start of the queried range (nil = latest)\n\tContext context.Context // Network context to support cancellation and timeouts (nil = no timeout)\n}\n\n// BoundContract is the base wrapper object that reflects a contract on the\n// Ethereum network. It contains a collection of methods that are used by the\n// higher level contract bindings to operate.\ntype BoundContract struct {\n\taddress    common.Address     // Deployment address of the contract on the Ethereum blockchain\n\tabi        abi.ABI            // Reflect based ABI to access the correct Ethereum methods\n\tcaller     ContractCaller     // Read interface to interact with the blockchain\n\ttransactor ContractTransactor // Write interface to interact with the blockchain\n\tfilterer   ContractFilterer   // Event filtering to interact with the blockchain\n}\n\n// NewBoundContract creates a low level contract interface through which calls\n// and transactions may be made through.\nfunc NewBoundContract(address common.Address, abi abi.ABI, caller ContractCaller, transactor ContractTransactor, filterer ContractFilterer) *BoundContract {\n\treturn &BoundContract{\n\t\taddress:    address,\n\t\tabi:        abi,\n\t\tcaller:     caller,\n\t\ttransactor: transactor,\n\t\tfilterer:   filterer,\n\t}\n}\n\n// DeployContract deploys a contract onto the Ethereum blockchain and binds the\n// deployment address with a Go wrapper.\nfunc DeployContract(opts *TransactOpts, abi abi.ABI, bytecode []byte, backend ContractBackend, params ...interface{}) (common.Address, *types.Transaction, *BoundContract, error) {\n\t// Otherwise try to deploy the contract\n\tc := NewBoundContract(common.Address{}, abi, backend, backend, backend)\n\n\tprefix, err := c.abi.PackPrefix(\"\", c_type.RandUint128(), params...)\n\tif err != nil {\n\t\treturn common.Address{}, nil, nil, err\n\t}\n\tinput, err := c.abi.Pack(\"\", params...)\n\tif err != nil {\n\t\treturn common.Address{}, nil, nil, err\n\t}\n\tdata := append(prefix, bytecode...)\n\tinput = append(data, input...)\n\tfmt.Println(\"DeployContract prefix\", hexutil.Encode(prefix[:]))\n\tfmt.Println(\"DeployContract byteCode\", hexutil.Encode(bytecode[:]))\n\tfmt.Println(\"DeployContract data\", hexutil.Encode(input))\n\n\ttx, err := c.transact(opts, nil, input)\n\tif err != nil {\n\t\treturn common.Address{}, nil, nil, err\n\t}\n\treturn common.Address{}, tx, c, nil\n}\n\n// Call invokes the (constant) contract method with params as input values and\n// sets the output to result. The result type might be a single field for simple\n// returns, a slice of interfaces for anonymous returns and a struct for named\n// returns.\nfunc (c *BoundContract) Call(opts *CallOpts, result interface{}, method string, params ...interface{}) error {\n\t// Don't crash on a lazy user\n\tif opts == nil {\n\t\topts = new(CallOpts)\n\t}\n\tvar rand c_type.Uint128\n\tcopy(rand[:], c.address[:16])\n\tprefix, err := c.abi.PackPrefix(method, rand, params...)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Pack the input, call and unpack the results\n\tinput, err := c.abi.Pack(method, params...)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinput = append(prefix, input...)\n\tvar (\n\t\tmsg    = sero.CallMsg{FromPKr: opts.FromPKr, To: &c.address, Data: input}\n\t\tctx    = ensureContext(opts.Context)\n\t\tcode   []byte\n\t\toutput []byte\n\t)\n\tif opts.Pending {\n\t\tpb, ok := c.caller.(PendingContractCaller)\n\t\tif !ok {\n\t\t\treturn ErrNoPendingState\n\t\t}\n\t\toutput, err = pb.PendingCallContract(ctx, msg)\n\t\tif err == nil && len(output) == 0 {\n\t\t\t// Make sure we have a contract to operate on, and bail out otherwise.\n\t\t\tif code, err = pb.PendingCodeAt(ctx, c.address); err != nil {\n\t\t\t\treturn err\n\t\t\t} else if len(code) == 0 {\n\t\t\t\treturn ErrNoCode\n\t\t\t}\n\t\t}\n\t} else {\n\t\toutput, err = c.caller.CallContract(ctx, msg, opts.BlockNumber)\n\t\tif err == nil && len(output) == 0 {\n\t\t\t// Make sure we have a contract to operate on, and bail out otherwise.\n\t\t\tif code, err = c.caller.CodeAt(ctx, c.address, opts.BlockNumber); err != nil {\n\t\t\t\treturn err\n\t\t\t} else if len(code) == 0 {\n\t\t\t\treturn ErrNoCode\n\t\t\t}\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn c.abi.Unpack(result, method, output)\n}\n\n// Transact invokes the (paid) contract method with params as input values.\nfunc (c *BoundContract) Transact(opts *TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {\n\t// Otherwise pack up the parameters and invoke the contract\n\tvar rand c_type.Uint128\n\tcopy(rand[:], c.address[:16])\n\tprefix, err := c.abi.PackPrefix(method, rand, params...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tinput, err := c.abi.Pack(method, params...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tinput = append(prefix, input...)\n\treturn c.transact(opts, &c.address, input)\n}\n\n// Transfer initiates a plain transaction to move funds to the contract, calling\n// its default method if one is available.\nfunc (c *BoundContract) Transfer(opts *TransactOpts) (*types.Transaction, error) {\n\treturn c.transact(opts, &c.address, nil)\n}\n\n// transact executes an actual transaction invocation, first deriving any missing\n// authorization fields, and then scheduling the transaction for execution.\nfunc (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, input []byte) (*types.Transaction, error) {\n\tvar err error\n\n\t// Ensure a valid value field and resolve the account nonce\n\tvalue := opts.Value\n\tif value == nil {\n\t\tvalue = new(big.Int)\n\t}\n\n\t// Figure out the gas allowance and gas price values\n\tgasPrice := opts.GasPrice\n\tif gasPrice == nil {\n\t\tgasPrice, err = c.transactor.SuggestGasPrice(ensureContext(opts.Context))\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to suggest gas price: %v\", err)\n\t\t}\n\t}\n\tgasLimit := opts.GasLimit\n\tif gasLimit == 0 {\n\t\t// Gas estimation cannot succeed without code for method invocations\n\t\tif contract != nil {\n\t\t\tif code, err := c.transactor.PendingCodeAt(ensureContext(opts.Context), c.address); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t} else if len(code) == 0 {\n\t\t\t\treturn nil, ErrNoCode\n\t\t\t}\n\t\t}\n\t\t// If the contract surely has code (or code is not needed), estimate the transaction\n\t\tmsg := sero.CallMsg{FromPKr: &opts.FromPKr, To: contract, Value: value, Data: input}\n\t\tgasLimit, err = c.transactor.EstimateGas(ensureContext(opts.Context), msg)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to estimate gas needed: %v\", err)\n\t\t}\n\t}\n\n\tmsg := sero.CallMsg{From: opts.From, FromPKr: &opts.FromPKr, To: contract, GasPrice: gasPrice, Gas: gasLimit, Value: value, Data: input}\n\tpreTx, err := c.transactor.GenContractTx(ensureContext(opts.Context), msg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgtx, err := opts.Encrypter(preTx)\n\n\terr = c.transactor.CommitTx(ensureContext(opts.Context), gtx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsignedTx := types.NewTxWithGTx(opts.GasLimit, gasPrice, &gtx.Tx)\n\treturn signedTx, nil\n}\n\n// FilterLogs filters contract logs for past blocks, returning the necessary\n// channels to construct a strongly typed bound iterator on top of them.\nfunc (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) {\n\t// Don't crash on a lazy user\n\tif opts == nil {\n\t\topts = new(FilterOpts)\n\t}\n\t// Append the event selector to the query parameters and construct the topic set\n\tquery = append([][]interface{}{{c.abi.Events[name].ID}}, query...)\n\n\ttopics, err := makeTopics(query...)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\t// Start the background filtering\n\tlogs := make(chan types.Log, 128)\n\n\tconfig := sero.FilterQuery{\n\t\tAddresses: []common.Address{c.address},\n\t\tTopics:    topics,\n\t\tFromBlock: new(big.Int).SetUint64(opts.Start),\n\t}\n\tif opts.End != nil {\n\t\tconfig.ToBlock = new(big.Int).SetUint64(*opts.End)\n\t}\n\t/* TODO(karalabe): Replace the rest of the method below with this when supported\n\tsub, err := c.filterer.SubscribeFilterLogs(ensureContext(opts.Context), config, logs)\n\t*/\n\tbuff, err := c.filterer.FilterLogs(ensureContext(opts.Context), config)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tsub, err := event.NewSubscription(func(quit <-chan struct{}) error {\n\t\tfor _, log := range buff {\n\t\t\tselect {\n\t\t\tcase logs <- log:\n\t\t\tcase <-quit:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}), nil\n\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn logs, sub, nil\n}\n\n// WatchLogs filters subscribes to contract logs for future blocks, returning a\n// subscription object that can be used to tear down the watcher.\nfunc (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]interface{}) (chan types.Log, event.Subscription, error) {\n\t// Don't crash on a lazy user\n\tif opts == nil {\n\t\topts = new(WatchOpts)\n\t}\n\t// Append the event selector to the query parameters and construct the topic set\n\tquery = append([][]interface{}{{c.abi.Events[name].ID}}, query...)\n\n\ttopics, err := makeTopics(query...)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\t// Start the background filtering\n\tlogs := make(chan types.Log, 128)\n\n\tconfig := sero.FilterQuery{\n\t\tAddresses: []common.Address{c.address},\n\t\tTopics:    topics,\n\t}\n\tif opts.Start != nil {\n\t\tconfig.FromBlock = new(big.Int).SetUint64(*opts.Start)\n\t}\n\tsub, err := c.filterer.SubscribeFilterLogs(ensureContext(opts.Context), config, logs)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn logs, sub, nil\n}\n\n// UnpackLog unpacks a retrieved log into the provided output structure.\nfunc (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) error {\n\tif len(log.Data) > 0 {\n\t\tif err := c.abi.Unpack(out, event, log.Data); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tvar indexed abi.Arguments\n\tfor _, arg := range c.abi.Events[event].Inputs {\n\t\tif arg.Indexed {\n\t\t\tindexed = append(indexed, arg)\n\t\t}\n\t}\n\treturn parseTopics(out, indexed, log.Topics[1:])\n}\n\n// UnpackLogIntoMap unpacks a retrieved log into the provided map.\nfunc (c *BoundContract) UnpackLogIntoMap(out map[string]interface{}, event string, log types.Log) error {\n\tif len(log.Data) > 0 {\n\t\tif err := c.abi.UnpackIntoMap(out, event, log.Data); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tvar indexed abi.Arguments\n\tfor _, arg := range c.abi.Events[event].Inputs {\n\t\tif arg.Indexed {\n\t\t\tindexed = append(indexed, arg)\n\t\t}\n\t}\n\treturn parseTopicsIntoMap(out, indexed, log.Topics[1:])\n}\n\n// ensureContext is a helper method to ensure a context is not nil, even if the\n// user specified it as such.\nfunc ensureContext(ctx context.Context) context.Context {\n\tif ctx == nil {\n\t\treturn context.TODO()\n\t}\n\treturn ctx\n}\n"
  },
  {
    "path": "accounts/abi/bind/bind.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package bind generates Ethereum contract Go bindings.\n//\n// Detailed usage document and tutorial available on the go-ethereum Wiki page:\n// https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts\npackage bind\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"regexp\"\n\t\"strings\"\n\t\"text/template\"\n\t\"unicode\"\n\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// Lang is a target programming language selector to generate bindings for.\ntype Lang int\n\nconst (\n\tLangGo Lang = iota\n\t//LangJava\n\t//LangObjC\n)\n\n// Bind generates a Go wrapper around a contract ABI. This wrapper isn't meant\n// to be used as is in client code, but rather as an intermediate struct which\n// enforces compile time type safety and naming convention opposed to having to\n// manually maintain hard coded strings that break on runtime.\nfunc Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, lang Lang, libs map[string]string, aliases map[string]string) (string, error) {\n\tvar (\n\t\t// contracts is the map of each individual contract requested binding\n\t\tcontracts = make(map[string]*tmplContract)\n\n\t\t// structs is the map of all reclared structs shared by passed contracts.\n\t\tstructs = make(map[string]*tmplStruct)\n\n\t\t// isLib is the map used to flag each encountered library as such\n\t\tisLib = make(map[string]struct{})\n\t)\n\tfor i := 0; i < len(types); i++ {\n\t\t// Parse the actual ABI to generate the binding for\n\t\tevmABI, err := abi.JSON(strings.NewReader(abis[i]))\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\t// Strip any whitespace from the JSON ABI\n\t\tstrippedABI := strings.Map(func(r rune) rune {\n\t\t\tif unicode.IsSpace(r) {\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\treturn r\n\t\t}, abis[i])\n\n\t\t// Extract the call and transact methods; events, struct definitions; and sort them alphabetically\n\t\tvar (\n\t\t\tcalls     = make(map[string]*tmplMethod)\n\t\t\ttransacts = make(map[string]*tmplMethod)\n\t\t\tevents    = make(map[string]*tmplEvent)\n\t\t\tfallback  *tmplMethod\n\t\t\treceive   *tmplMethod\n\n\t\t\t// identifiers are used to detect duplicated identifier of function\n\t\t\t// and event. For all calls, transacts and events, abigen will generate\n\t\t\t// corresponding bindings. However we have to ensure there is no\n\t\t\t// identifier coliision in the bindings of these categories.\n\t\t\tcallIdentifiers     = make(map[string]bool)\n\t\t\ttransactIdentifiers = make(map[string]bool)\n\t\t\teventIdentifiers    = make(map[string]bool)\n\t\t)\n\t\tfor _, original := range evmABI.Methods {\n\t\t\t// Normalize the method for capital cases and non-anonymous inputs/outputs\n\t\t\tnormalized := original\n\t\t\tnormalizedName := methodNormalizer[lang](alias(aliases, original.Name))\n\t\t\t// Ensure there is no duplicated identifier\n\t\t\tvar identifiers = callIdentifiers\n\t\t\tif !original.IsConstant() {\n\t\t\t\tidentifiers = transactIdentifiers\n\t\t\t}\n\t\t\tif identifiers[normalizedName] {\n\t\t\t\treturn \"\", fmt.Errorf(\"duplicated identifier \\\"%s\\\"(normalized \\\"%s\\\"), use --alias for renaming\", original.Name, normalizedName)\n\t\t\t}\n\t\t\tidentifiers[normalizedName] = true\n\t\t\tnormalized.Name = normalizedName\n\t\t\tnormalized.Inputs = make([]abi.Argument, len(original.Inputs))\n\t\t\tcopy(normalized.Inputs, original.Inputs)\n\t\t\tfor j, input := range normalized.Inputs {\n\t\t\t\tif input.Name == \"\" {\n\t\t\t\t\tnormalized.Inputs[j].Name = fmt.Sprintf(\"arg%d\", j)\n\t\t\t\t}\n\t\t\t\tif hasStruct(input.Type) {\n\t\t\t\t\tbindStructType[lang](input.Type, structs, true)\n\t\t\t\t}\n\t\t\t}\n\t\t\tnormalized.Outputs = make([]abi.Argument, len(original.Outputs))\n\t\t\tcopy(normalized.Outputs, original.Outputs)\n\t\t\tfor j, output := range normalized.Outputs {\n\t\t\t\tif output.Name != \"\" {\n\t\t\t\t\tnormalized.Outputs[j].Name = capitalise(output.Name)\n\t\t\t\t}\n\t\t\t\tif hasStruct(output.Type) {\n\t\t\t\t\tbindStructType[lang](output.Type, structs, false)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Append the methods to the call or transact lists\n\t\t\tif original.IsConstant() {\n\t\t\t\tcalls[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original.Outputs)}\n\t\t\t} else {\n\t\t\t\ttransacts[original.Name] = &tmplMethod{Original: original, Normalized: normalized, Structured: structured(original.Outputs)}\n\t\t\t}\n\t\t}\n\t\tfor _, original := range evmABI.Events {\n\t\t\t// Skip anonymous events as they don't support explicit filtering\n\t\t\tif original.Anonymous {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Normalize the event for capital cases and non-anonymous outputs\n\t\t\tnormalized := original\n\n\t\t\t// Ensure there is no duplicated identifier\n\t\t\tnormalizedName := methodNormalizer[lang](alias(aliases, original.Name))\n\t\t\tif eventIdentifiers[normalizedName] {\n\t\t\t\treturn \"\", fmt.Errorf(\"duplicated identifier \\\"%s\\\"(normalized \\\"%s\\\"), use --alias for renaming\", original.Name, normalizedName)\n\t\t\t}\n\t\t\teventIdentifiers[normalizedName] = true\n\t\t\tnormalized.Name = normalizedName\n\n\t\t\tnormalized.Inputs = make([]abi.Argument, len(original.Inputs))\n\t\t\tcopy(normalized.Inputs, original.Inputs)\n\t\t\tfor j, input := range normalized.Inputs {\n\t\t\t\tif input.Name == \"\" {\n\t\t\t\t\tnormalized.Inputs[j].Name = fmt.Sprintf(\"arg%d\", j)\n\t\t\t\t}\n\t\t\t\tif hasStruct(input.Type) {\n\t\t\t\t\tbindStructType[lang](input.Type, structs, true)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Append the event to the accumulator list\n\t\t\tevents[original.Name] = &tmplEvent{Original: original, Normalized: normalized}\n\t\t}\n\t\t// Add two special fallback functions if they exist\n\t\tif evmABI.HasFallback() {\n\t\t\tfallback = &tmplMethod{Original: evmABI.Fallback}\n\t\t}\n\t\tif evmABI.HasReceive() {\n\t\t\treceive = &tmplMethod{Original: evmABI.Receive}\n\t\t}\n\t\t// There is no easy way to pass arbitrary java objects to the Go side.\n\t\t//if len(structs) > 0 && lang == LangJava {\n\t\t//\treturn \"\", errors.New(\"java binding for tuple arguments is not supported yet\")\n\t\t//}\n\n\t\tcontracts[types[i]] = &tmplContract{\n\t\t\tType:        capitalise(types[i]),\n\t\t\tInputABI:    strings.Replace(strippedABI, \"\\\"\", \"\\\\\\\"\", -1),\n\t\t\tInputBin:    strings.TrimPrefix(strings.TrimSpace(bytecodes[i]), \"0x\"),\n\t\t\tConstructor: evmABI.Constructor,\n\t\t\tCalls:       calls,\n\t\t\tTransacts:   transacts,\n\t\t\tFallback:    fallback,\n\t\t\tReceive:     receive,\n\t\t\tEvents:      events,\n\t\t\tLibraries:   make(map[string]string),\n\t\t}\n\t\t// Function 4-byte signatures are stored in the same sequence\n\t\t// as types, if available.\n\t\tif len(fsigs) > i {\n\t\t\tcontracts[types[i]].FuncSigs = fsigs[i]\n\t\t}\n\t\t// Parse library references.\n\t\tfor pattern, name := range libs {\n\t\t\tmatched, err := regexp.Match(\"__\\\\$\"+pattern+\"\\\\$__\", []byte(contracts[types[i]].InputBin))\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"Could not search for pattern\", \"pattern\", pattern, \"contract\", contracts[types[i]], \"err\", err)\n\t\t\t}\n\t\t\tif matched {\n\t\t\t\tcontracts[types[i]].Libraries[pattern] = name\n\t\t\t\t// keep track that this type is a library\n\t\t\t\tif _, ok := isLib[name]; !ok {\n\t\t\t\t\tisLib[name] = struct{}{}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Check if that type has already been identified as a library\n\tfor i := 0; i < len(types); i++ {\n\t\t_, ok := isLib[types[i]]\n\t\tcontracts[types[i]].Library = ok\n\t}\n\t// Generate the contract template data content and render it\n\tdata := &tmplData{\n\t\tPackage:   pkg,\n\t\tContracts: contracts,\n\t\tLibraries: libs,\n\t\tStructs:   structs,\n\t}\n\tbuffer := new(bytes.Buffer)\n\n\tfuncs := map[string]interface{}{\n\t\t\"bindtype\":      bindType[lang],\n\t\t\"bindtopictype\": bindTopicType[lang],\n\t\t\"namedtype\":     namedType[lang],\n\t\t\"capitalise\":    capitalise,\n\t\t\"decapitalise\":  decapitalise,\n\t}\n\ttmpl := template.Must(template.New(\"\").Funcs(funcs).Parse(tmplSource[lang]))\n\tif err := tmpl.Execute(buffer, data); err != nil {\n\t\treturn \"\", err\n\t}\n\t// For Go bindings pass the code through gofmt to clean it up\n\tif lang == LangGo {\n\t\tcode, err := format.Source(buffer.Bytes())\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"%v\\n%s\", err, buffer)\n\t\t}\n\t\treturn string(code), nil\n\t}\n\t// For all others just return as is for now\n\treturn buffer.String(), nil\n}\n\n// bindType is a set of type binders that convert Solidity types to some supported\n// programming language types.\nvar bindType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct, input bool) string{\n\tLangGo: bindTypeGo,\n\t//LangJava: bindTypeJava,\n}\n\n// bindBasicTypeGo converts basic solidity types(except array, slice and tuple) to Go one.\nfunc bindBasicTypeGo(kind abi.Type, input bool) string {\n\tswitch kind.T {\n\tcase abi.AddressTy:\n\t\tif input {\n\t\t\treturn \"common.Address\"\n\t\t} else {\n\t\t\treturn \"common.ContractAddress\"\n\t\t}\n\n\tcase abi.IntTy, abi.UintTy:\n\t\tparts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String())\n\t\tswitch parts[2] {\n\t\tcase \"8\", \"16\", \"32\", \"64\":\n\t\t\treturn fmt.Sprintf(\"%sint%s\", parts[1], parts[2])\n\t\t}\n\t\treturn \"*big.Int\"\n\tcase abi.FixedBytesTy:\n\t\treturn fmt.Sprintf(\"[%d]byte\", kind.Size)\n\tcase abi.BytesTy:\n\t\treturn \"[]byte\"\n\tcase abi.FunctionTy:\n\t\treturn \"[24]byte\"\n\tdefault:\n\t\t// string, bool types\n\t\treturn kind.String()\n\t}\n}\n\n// bindTypeGo converts solidity types to Go ones. Since there is no clear mapping\n// from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly\n// mapped will use an upscaled type (e.g. BigDecimal).\nfunc bindTypeGo(kind abi.Type, structs map[string]*tmplStruct, input bool) string {\n\tswitch kind.T {\n\tcase abi.TupleTy:\n\t\treturn structs[kind.TupleRawName+kind.String()].Name\n\tcase abi.ArrayTy:\n\t\treturn fmt.Sprintf(\"[%d]\", kind.Size) + bindTypeGo(*kind.Elem, structs, input)\n\tcase abi.SliceTy:\n\t\treturn \"[]\" + bindTypeGo(*kind.Elem, structs, input)\n\tdefault:\n\t\treturn bindBasicTypeGo(kind, input)\n\t}\n}\n\n// bindBasicTypeJava converts basic solidity types(except array, slice and tuple) to Java one.\nfunc bindBasicTypeJava(kind abi.Type) string {\n\tswitch kind.T {\n\tcase abi.AddressTy:\n\t\treturn \"ContractAddress\"\n\tcase abi.IntTy, abi.UintTy:\n\t\t// Note that uint and int (without digits) are also matched,\n\t\t// these are size 256, and will translate to BigInt (the default).\n\t\tparts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String())\n\t\tif len(parts) != 3 {\n\t\t\treturn kind.String()\n\t\t}\n\t\t// All unsigned integers should be translated to BigInt since gomobile doesn't\n\t\t// support them.\n\t\tif parts[1] == \"u\" {\n\t\t\treturn \"BigInt\"\n\t\t}\n\n\t\tnamedSize := map[string]string{\n\t\t\t\"8\":  \"byte\",\n\t\t\t\"16\": \"short\",\n\t\t\t\"32\": \"int\",\n\t\t\t\"64\": \"long\",\n\t\t}[parts[2]]\n\n\t\t// default to BigInt\n\t\tif namedSize == \"\" {\n\t\t\tnamedSize = \"BigInt\"\n\t\t}\n\t\treturn namedSize\n\tcase abi.FixedBytesTy, abi.BytesTy:\n\t\treturn \"byte[]\"\n\tcase abi.BoolTy:\n\t\treturn \"boolean\"\n\tcase abi.StringTy:\n\t\treturn \"String\"\n\tcase abi.FunctionTy:\n\t\treturn \"byte[24]\"\n\tdefault:\n\t\treturn kind.String()\n\t}\n}\n\n// pluralizeJavaType explicitly converts multidimensional types to predefined\n// type in go side.\nfunc pluralizeJavaType(typ string) string {\n\tswitch typ {\n\tcase \"boolean\":\n\t\treturn \"Bools\"\n\tcase \"String\":\n\t\treturn \"Strings\"\n\tcase \"Address\":\n\t\treturn \"Addresses\"\n\tcase \"byte[]\":\n\t\treturn \"Binaries\"\n\tcase \"BigInt\":\n\t\treturn \"BigInts\"\n\t}\n\treturn typ + \"[]\"\n}\n\n// bindTypeJava converts a Solidity type to a Java one. Since there is no clear mapping\n// from all Solidity types to Java ones (e.g. uint17), those that cannot be exactly\n// mapped will use an upscaled type (e.g. BigDecimal).\n/*func bindTypeJava(kind abi.Type, structs map[string]*tmplStruct) string {\n\tswitch kind.T {\n\tcase abi.TupleTy:\n\t\treturn structs[kind.TupleRawName+kind.String()].Name\n\tcase abi.ArrayTy, abi.SliceTy:\n\t\treturn pluralizeJavaType(bindTypeJava(*kind.Elem, structs))\n\tdefault:\n\t\treturn bindBasicTypeJava(kind)\n\t}\n}\n*/\n// bindTopicType is a set of type binders that convert Solidity types to some\n// supported programming language topic types.\nvar bindTopicType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct, input bool) string{\n\tLangGo: bindTopicTypeGo,\n\t//LangJava: bindTopicTypeJava,\n}\n\n// bindTopicTypeGo converts a Solidity topic type to a Go one. It is almost the same\n// funcionality as for simple types, but dynamic types get converted to hashes.\nfunc bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct, input bool) string {\n\tbound := bindTypeGo(kind, structs, input)\n\n\t// todo(rjl493456442) according solidity documentation, indexed event\n\t// parameters that are not value types i.e. arrays and structs are not\n\t// stored directly but instead a keccak256-hash of an encoding is stored.\n\t//\n\t// We only convert stringS and bytes to hash, still need to deal with\n\t// array(both fixed-size and dynamic-size) and struct.\n\tif bound == \"string\" || bound == \"[]byte\" {\n\t\tbound = \"common.Hash\"\n\t}\n\treturn bound\n}\n\n// bindTopicTypeJava converts a Solidity topic type to a Java one. It is almost the same\n// funcionality as for simple types, but dynamic types get converted to hashes.\n/*func bindTopicTypeJava(kind abi.Type, structs map[string]*tmplStruct) string {\n\tbound := bindTypeJava(kind, structs)\n\n\t// todo(rjl493456442) according solidity documentation, indexed event\n\t// parameters that are not value types i.e. arrays and structs are not\n\t// stored directly but instead a keccak256-hash of an encoding is stored.\n\t//\n\t// We only convert stringS and bytes to hash, still need to deal with\n\t// array(both fixed-size and dynamic-size) and struct.\n\tif bound == \"String\" || bound == \"byte[]\" {\n\t\tbound = \"Hash\"\n\t}\n\treturn bound\n}\n*/\n// bindStructType is a set of type binders that convert Solidity tuple types to some supported\n// programming language struct definition.\nvar bindStructType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct, input bool) string{\n\tLangGo: bindStructTypeGo,\n\t//LangJava: bindStructTypeJava,\n}\n\n// bindStructTypeGo converts a Solidity tuple type to a Go one and records the mapping\n// in the given map.\n// Notably, this function will resolve and record nested struct recursively.\nfunc bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct, input bool) string {\n\tswitch kind.T {\n\tcase abi.TupleTy:\n\t\t// We compose raw struct name and canonical parameter expression\n\t\t// together here. The reason is before solidity v0.5.11, kind.TupleRawName\n\t\t// is empty, so we use canonical parameter expression to distinguish\n\t\t// different struct definition. From the consideration of backward\n\t\t// compatibility, we concat these two together so that if kind.TupleRawName\n\t\t// is not empty, it can have unique id.\n\t\tid := kind.TupleRawName + kind.String()\n\t\tif s, exist := structs[id]; exist {\n\t\t\treturn s.Name\n\t\t}\n\t\tvar fields []*tmplField\n\t\tfor i, elem := range kind.TupleElems {\n\t\t\tfield := bindStructTypeGo(*elem, structs, input)\n\t\t\tfields = append(fields, &tmplField{Type: field, Name: capitalise(kind.TupleRawNames[i]), SolKind: *elem})\n\t\t}\n\t\tname := kind.TupleRawName\n\t\tif name == \"\" {\n\t\t\tname = fmt.Sprintf(\"Struct%d\", len(structs))\n\t\t}\n\t\tstructs[id] = &tmplStruct{\n\t\t\tName:   name,\n\t\t\tFields: fields,\n\t\t}\n\t\treturn name\n\tcase abi.ArrayTy:\n\t\treturn fmt.Sprintf(\"[%d]\", kind.Size) + bindStructTypeGo(*kind.Elem, structs, input)\n\tcase abi.SliceTy:\n\t\treturn \"[]\" + bindStructTypeGo(*kind.Elem, structs, input)\n\tdefault:\n\t\treturn bindBasicTypeGo(kind, input)\n\t}\n}\n\n// bindStructTypeJava converts a Solidity tuple type to a Java one and records the mapping\n// in the given map.\n// Notably, this function will resolve and record nested struct recursively.\n/*func bindStructTypeJava(kind abi.Type, structs map[string]*tmplStruct) string {\n\tswitch kind.T {\n\tcase abi.TupleTy:\n\t\t// We compose raw struct name and canonical parameter expression\n\t\t// together here. The reason is before solidity v0.5.11, kind.TupleRawName\n\t\t// is empty, so we use canonical parameter expression to distinguish\n\t\t// different struct definition. From the consideration of backward\n\t\t// compatibility, we concat these two together so that if kind.TupleRawName\n\t\t// is not empty, it can have unique id.\n\t\tid := kind.TupleRawName + kind.String()\n\t\tif s, exist := structs[id]; exist {\n\t\t\treturn s.Name\n\t\t}\n\t\tvar fields []*tmplField\n\t\tfor i, elem := range kind.TupleElems {\n\t\t\tfield := bindStructTypeJava(*elem, structs)\n\t\t\tfields = append(fields, &tmplField{Type: field, Name: decapitalise(kind.TupleRawNames[i]), SolKind: *elem})\n\t\t}\n\t\tname := kind.TupleRawName\n\t\tif name == \"\" {\n\t\t\tname = fmt.Sprintf(\"Class%d\", len(structs))\n\t\t}\n\t\tstructs[id] = &tmplStruct{\n\t\t\tName:   name,\n\t\t\tFields: fields,\n\t\t}\n\t\treturn name\n\tcase abi.ArrayTy, abi.SliceTy:\n\t\treturn pluralizeJavaType(bindStructTypeJava(*kind.Elem, structs))\n\tdefault:\n\t\treturn bindBasicTypeJava(kind)\n\t}\n}\n*/\n// namedType is a set of functions that transform language specific types to\n// named versions that my be used inside method names.\nvar namedType = map[Lang]func(string, abi.Type) string{\n\tLangGo: func(string, abi.Type) string { panic(\"this shouldn't be needed\") },\n\t//LangJava: namedTypeJava,\n}\n\n// namedTypeJava converts some primitive data types to named variants that can\n// be used as parts of method names.\n/*func namedTypeJava(javaKind string, solKind abi.Type) string {\n\tswitch javaKind {\n\tcase \"byte[]\":\n\t\treturn \"Binary\"\n\tcase \"boolean\":\n\t\treturn \"Bool\"\n\tdefault:\n\t\tparts := regexp.MustCompile(`(u)?int([0-9]*)(\\[[0-9]*\\])?`).FindStringSubmatch(solKind.String())\n\t\tif len(parts) != 4 {\n\t\t\treturn javaKind\n\t\t}\n\t\tswitch parts[2] {\n\t\tcase \"8\", \"16\", \"32\", \"64\":\n\t\t\tif parts[3] == \"\" {\n\t\t\t\treturn capitalise(fmt.Sprintf(\"%sint%s\", parts[1], parts[2]))\n\t\t\t}\n\t\t\treturn capitalise(fmt.Sprintf(\"%sint%ss\", parts[1], parts[2]))\n\n\t\tdefault:\n\t\t\treturn javaKind\n\t\t}\n\t}\n}\n*/\n// alias returns an alias of the given string based on the aliasing rules\n// or returns itself if no rule is matched.\nfunc alias(aliases map[string]string, n string) string {\n\tif alias, exist := aliases[n]; exist {\n\t\treturn alias\n\t}\n\treturn n\n}\n\n// methodNormalizer is a name transformer that modifies Solidity method names to\n// conform to target language naming concentions.\nvar methodNormalizer = map[Lang]func(string) string{\n\tLangGo: abi.ToCamelCase,\n\t//LangJava: decapitalise,\n}\n\n// capitalise makes a camel-case string which starts with an upper case character.\nvar capitalise = abi.ToCamelCase\n\n// decapitalise makes a camel-case string which starts with a lower case character.\nfunc decapitalise(input string) string {\n\tif len(input) == 0 {\n\t\treturn input\n\t}\n\n\tgoForm := abi.ToCamelCase(input)\n\treturn strings.ToLower(goForm[:1]) + goForm[1:]\n}\n\n// structured checks whether a list of ABI data types has enough information to\n// operate through a proper Go struct or if flat returns are needed.\nfunc structured(args abi.Arguments) bool {\n\tif len(args) < 2 {\n\t\treturn false\n\t}\n\texists := make(map[string]bool)\n\tfor _, out := range args {\n\t\t// If the name is anonymous, we can't organize into a struct\n\t\tif out.Name == \"\" {\n\t\t\treturn false\n\t\t}\n\t\t// If the field name is empty when normalized or collides (var, Var, _var, _Var),\n\t\t// we can't organize into a struct\n\t\tfield := capitalise(out.Name)\n\t\tif field == \"\" || exists[field] {\n\t\t\treturn false\n\t\t}\n\t\texists[field] = true\n\t}\n\treturn true\n}\n\n// hasStruct returns an indicator whether the given type is struct, struct slice\n// or struct array.\nfunc hasStruct(t abi.Type) bool {\n\tswitch t.T {\n\tcase abi.SliceTy:\n\t\treturn hasStruct(*t.Elem)\n\tcase abi.ArrayTy:\n\t\treturn hasStruct(*t.Elem)\n\tcase abi.TupleTy:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "accounts/abi/bind/template.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bind\n\nimport \"github.com/sero-cash/go-sero/accounts/abi\"\n\n// tmplData is the data structure required to fill the binding template.\ntype tmplData struct {\n\tPackage   string                   // Name of the package to place the generated file in\n\tContracts map[string]*tmplContract // List of contracts to generate into this file\n\tLibraries map[string]string        // Map the bytecode's link pattern to the library name\n\tStructs   map[string]*tmplStruct   // Contract struct type definitions\n}\n\n// tmplContract contains the data needed to generate an individual contract binding.\ntype tmplContract struct {\n\tType        string                 // Type name of the main contract binding\n\tInputABI    string                 // JSON ABI used as the input to generate the binding from\n\tInputBin    string                 // Optional EVM bytecode used to denetare deploy code from\n\tFuncSigs    map[string]string      // Optional map: string signature -> 4-byte signature\n\tConstructor abi.Method             // Contract constructor for deploy parametrization\n\tCalls       map[string]*tmplMethod // Contract calls that only read state data\n\tTransacts   map[string]*tmplMethod // Contract calls that write state data\n\tFallback    *tmplMethod            // Additional special fallback function\n\tReceive     *tmplMethod            // Additional special receive function\n\tEvents      map[string]*tmplEvent  // Contract events accessors\n\tLibraries   map[string]string      // Same as tmplData, but filtered to only keep what the contract needs\n\tLibrary     bool                   // Indicator whether the contract is a library\n}\n\n// tmplMethod is a wrapper around an abi.Method that contains a few preprocessed\n// and cached data fields.\ntype tmplMethod struct {\n\tOriginal   abi.Method // Original method as parsed by the abi package\n\tNormalized abi.Method // Normalized version of the parsed method (capitalized names, non-anonymous args/returns)\n\tStructured bool       // Whether the returns should be accumulated into a struct\n}\n\n// tmplEvent is a wrapper around an a\ntype tmplEvent struct {\n\tOriginal   abi.Event // Original event as parsed by the abi package\n\tNormalized abi.Event // Normalized version of the parsed fields\n}\n\n// tmplField is a wrapper around a struct field with binding language\n// struct type definition and relative filed name.\ntype tmplField struct {\n\tType    string   // Field type representation depends on target binding language\n\tName    string   // Field name converted from the raw user-defined field name\n\tSolKind abi.Type // Raw abi type information\n}\n\n// tmplStruct is a wrapper around an abi.tuple contains an auto-generated\n// struct name.\ntype tmplStruct struct {\n\tName   string       // Auto-generated struct name(before solidity v0.5.11) or raw name.\n\tFields []*tmplField // Struct fields definition depends on the binding language.\n}\n\n// tmplSource is language to template mapping containing all the supported\n// programming languages the package can generate to.\nvar tmplSource = map[Lang]string{\n\tLangGo: tmplSourceGo,\n}\n\n// tmplSourceGo is the Go source template use to generate the contract binding\n// based on.\nconst tmplSourceGo = `\n// Code generated - DO NOT EDIT.\n// This file is a generated binding and any manual changes will be lost.\n\npackage {{.Package}}\n\nimport (\n\t\"math/big\"\n\t\"strings\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n\t\"github.com/sero-cash/go-sero/accounts/abi/bind\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n)\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar (\n\t_ = big.NewInt\n\t_ = strings.NewReader\n\t_ = sero.NotFound\n\t_ = bind.Bind\n\t_ = common.Big1\n\t_ = types.BloomLookup\n\t_ = event.NewSubscription\n)\n{{$TRUE := true}}\n{{$FALSE := false}}\n{{$structs := .Structs}}\n{{range $structs}}\n\t// {{.Name}} is an auto generated low-level Go binding around an user-defined struct.\n\ttype {{.Name}} struct {\n\t{{range $field := .Fields}}\n\t{{$field.Name}} {{$field.Type}}{{end}}\n\t}\n{{end}}\n\n{{range $contract := .Contracts}}\n\t// {{.Type}}ABI is the input ABI used to generate the binding from.\n\tconst {{.Type}}ABI = \"{{.InputABI}}\"\n\n\t{{if $contract.FuncSigs}}\n\t\t// {{.Type}}FuncSigs maps the 4-byte function signature to its string representation.\n\t\tvar {{.Type}}FuncSigs = map[string]string{\n\t\t\t{{range $strsig, $binsig := .FuncSigs}}\"{{$binsig}}\": \"{{$strsig}}\",\n\t\t\t{{end}}\n\t\t}\n\t{{end}}\n\n\t{{if .InputBin}}\n\t\t// {{.Type}}Bin is the compiled bytecode used for deploying new contracts.\n\t\tvar {{.Type}}Bin = \"0x{{.InputBin}}\"\n\n\t\t// Deploy{{.Type}} deploys a new Ethereum contract, binding an instance of {{.Type}} to it.\n\t\tfunc Deploy{{.Type}}(auth *bind.TransactOpts, backend bind.ContractBackend {{range .Constructor.Inputs}}, {{.Name}} {{bindtype .Type $structs $TRUE}}{{end}}) (common.Address, *types.Transaction, *{{.Type}}, error) {\n\t\t  parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI))\n\t\t  if err != nil {\n\t\t    return common.Address{}, nil, nil, err\n\t\t  }\n\t\t  {{range $pattern, $name := .Libraries}}\n\t\t\t{{decapitalise $name}}Addr, _, _, _ := Deploy{{capitalise $name}}(auth, backend)\n\t\t\t{{$contract.Type}}Bin = strings.Replace({{$contract.Type}}Bin, \"__${{$pattern}}$__\", {{decapitalise $name}}Addr.String()[2:], -1)\n\t\t  {{end}}\n\t\t  address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex({{.Type}}Bin), backend {{range .Constructor.Inputs}}, {{.Name}}{{end}})\n\t\t  if err != nil {\n\t\t    return common.Address{}, nil, nil, err\n\t\t  }\n\t\t  return address, tx, &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract}, {{.Type}}Filterer: {{.Type}}Filterer{contract: contract} }, nil\n\t\t}\n\t{{end}}\n\n\t// {{.Type}} is an auto generated Go binding around an Ethereum contract.\n\ttype {{.Type}} struct {\n\t  {{.Type}}Caller     // Read-only binding to the contract\n\t  {{.Type}}Transactor // Write-only binding to the contract\n\t  {{.Type}}Filterer   // Log filterer for contract events\n\t}\n\n\t// {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract.\n\ttype {{.Type}}Caller struct {\n\t  contract *bind.BoundContract // Generic contract wrapper for the low level calls\n\t}\n\n\t// {{.Type}}Transactor is an auto generated write-only Go binding around an Ethereum contract.\n\ttype {{.Type}}Transactor struct {\n\t  contract *bind.BoundContract // Generic contract wrapper for the low level calls\n\t}\n\n\t// {{.Type}}Filterer is an auto generated log filtering Go binding around an Ethereum contract events.\n\ttype {{.Type}}Filterer struct {\n\t  contract *bind.BoundContract // Generic contract wrapper for the low level calls\n\t}\n\n\t// {{.Type}}Session is an auto generated Go binding around an Ethereum contract,\n\t// with pre-set call and transact options.\n\ttype {{.Type}}Session struct {\n\t  Contract     *{{.Type}}        // Generic contract binding to set the session for\n\t  CallOpts     bind.CallOpts     // Call options to use throughout this session\n\t  TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session\n\t}\n\n\t// {{.Type}}CallerSession is an auto generated read-only Go binding around an Ethereum contract,\n\t// with pre-set call options.\n\ttype {{.Type}}CallerSession struct {\n\t  Contract *{{.Type}}Caller // Generic contract caller binding to set the session for\n\t  CallOpts bind.CallOpts    // Call options to use throughout this session\n\t}\n\n\t// {{.Type}}TransactorSession is an auto generated write-only Go binding around an Ethereum contract,\n\t// with pre-set transact options.\n\ttype {{.Type}}TransactorSession struct {\n\t  Contract     *{{.Type}}Transactor // Generic contract transactor binding to set the session for\n\t  TransactOpts bind.TransactOpts    // Transaction auth options to use throughout this session\n\t}\n\n\t// {{.Type}}Raw is an auto generated low-level Go binding around an Ethereum contract.\n\ttype {{.Type}}Raw struct {\n\t  Contract *{{.Type}} // Generic contract binding to access the raw methods on\n\t}\n\n\t// {{.Type}}CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.\n\ttype {{.Type}}CallerRaw struct {\n\t\tContract *{{.Type}}Caller // Generic read-only contract binding to access the raw methods on\n\t}\n\n\t// {{.Type}}TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.\n\ttype {{.Type}}TransactorRaw struct {\n\t\tContract *{{.Type}}Transactor // Generic write-only contract binding to access the raw methods on\n\t}\n\n\t// New{{.Type}} creates a new instance of {{.Type}}, bound to a specific deployed contract.\n\tfunc New{{.Type}}(address common.Address, backend bind.ContractBackend) (*{{.Type}}, error) {\n\t  contract, err := bind{{.Type}}(address, backend, backend, backend)\n\t  if err != nil {\n\t    return nil, err\n\t  }\n\t  return &{{.Type}}{ {{.Type}}Caller: {{.Type}}Caller{contract: contract}, {{.Type}}Transactor: {{.Type}}Transactor{contract: contract}, {{.Type}}Filterer: {{.Type}}Filterer{contract: contract} }, nil\n\t}\n\n\t// New{{.Type}}Caller creates a new read-only instance of {{.Type}}, bound to a specific deployed contract.\n\tfunc New{{.Type}}Caller(address common.Address, caller bind.ContractCaller) (*{{.Type}}Caller, error) {\n\t  contract, err := bind{{.Type}}(address, caller, nil, nil)\n\t  if err != nil {\n\t    return nil, err\n\t  }\n\t  return &{{.Type}}Caller{contract: contract}, nil\n\t}\n\n\t// New{{.Type}}Transactor creates a new write-only instance of {{.Type}}, bound to a specific deployed contract.\n\tfunc New{{.Type}}Transactor(address common.Address, transactor bind.ContractTransactor) (*{{.Type}}Transactor, error) {\n\t  contract, err := bind{{.Type}}(address, nil, transactor, nil)\n\t  if err != nil {\n\t    return nil, err\n\t  }\n\t  return &{{.Type}}Transactor{contract: contract}, nil\n\t}\n\n\t// New{{.Type}}Filterer creates a new log filterer instance of {{.Type}}, bound to a specific deployed contract.\n \tfunc New{{.Type}}Filterer(address common.Address, filterer bind.ContractFilterer) (*{{.Type}}Filterer, error) {\n \t  contract, err := bind{{.Type}}(address, nil, nil, filterer)\n \t  if err != nil {\n \t    return nil, err\n \t  }\n \t  return &{{.Type}}Filterer{contract: contract}, nil\n \t}\n\n\t// bind{{.Type}} binds a generic wrapper to an already deployed contract.\n\tfunc bind{{.Type}}(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {\n\t  parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI))\n\t  if err != nil {\n\t    return nil, err\n\t  }\n\t  return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil\n\t}\n\n\t// Call invokes the (constant) contract method with params as input values and\n\t// sets the output to result. The result type might be a single field for simple\n\t// returns, a slice of interfaces for anonymous returns and a struct for named\n\t// returns.\n\tfunc (_{{$contract.Type}} *{{$contract.Type}}Raw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {\n\t\treturn _{{$contract.Type}}.Contract.{{$contract.Type}}Caller.contract.Call(opts, result, method, params...)\n\t}\n\n\t// Transfer initiates a plain transaction to move funds to the contract, calling\n\t// its default method if one is available.\n\tfunc (_{{$contract.Type}} *{{$contract.Type}}Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {\n\t\treturn _{{$contract.Type}}.Contract.{{$contract.Type}}Transactor.contract.Transfer(opts)\n\t}\n\n\t// Transact invokes the (paid) contract method with params as input values.\n\tfunc (_{{$contract.Type}} *{{$contract.Type}}Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {\n\t\treturn _{{$contract.Type}}.Contract.{{$contract.Type}}Transactor.contract.Transact(opts, method, params...)\n\t}\n\n\t// Call invokes the (constant) contract method with params as input values and\n\t// sets the output to result. The result type might be a single field for simple\n\t// returns, a slice of interfaces for anonymous returns and a struct for named\n\t// returns.\n\tfunc (_{{$contract.Type}} *{{$contract.Type}}CallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {\n\t\treturn _{{$contract.Type}}.Contract.contract.Call(opts, result, method, params...)\n\t}\n\n\t// Transfer initiates a plain transaction to move funds to the contract, calling\n\t// its default method if one is available.\n\tfunc (_{{$contract.Type}} *{{$contract.Type}}TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {\n\t\treturn _{{$contract.Type}}.Contract.contract.Transfer(opts)\n\t}\n\n\t// Transact invokes the (paid) contract method with params as input values.\n\tfunc (_{{$contract.Type}} *{{$contract.Type}}TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {\n\t\treturn _{{$contract.Type}}.Contract.contract.Transact(opts, method, params...)\n\t}\n\n\t{{range .Calls}}\n\t\t// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Caller) {{.Normalized.Name}}(opts *bind.CallOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}};{{end}} },{{else}}{{range .Normalized.Outputs}}{{bindtype .Type $structs $FALSE}},{{end}}{{end}} error) {\n\t\t\t{{if .Structured}}ret := new(struct{\n\t\t\t\t{{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}}\n\t\t\t\t{{end}}\n\t\t\t}){{else}}var (\n\t\t\t\t{{range $i, $_ := .Normalized.Outputs}}ret{{$i}} = new({{bindtype .Type $structs $FALSE}})\n\t\t\t\t{{end}}\n\t\t\t){{end}}\n\t\t\tout := {{if .Structured}}ret{{else}}{{if eq (len .Normalized.Outputs) 1}}ret0{{else}}&[]interface{}{\n\t\t\t\t{{range $i, $_ := .Normalized.Outputs}}ret{{$i}},\n\t\t\t\t{{end}}\n\t\t\t}{{end}}{{end}}\n\t\t\terr := _{{$contract.Type}}.contract.Call(opts, out, \"{{.Original.Name}}\" {{range .Normalized.Inputs}}, {{.Name}}{{end}})\n\t\t\treturn {{if .Structured}}*ret,{{else}}{{range $i, $_ := .Normalized.Outputs}}*ret{{$i}},{{end}}{{end}} err\n\t\t}\n\n\t\t// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs $FALSE}},{{end}} {{end}} error) {\n\t\t  return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}})\n\t\t}\n\n\t\t// {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}CallerSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs $FALSE}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs $FALSE}},{{end}} {{end}} error) {\n\t\t  return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}})\n\t\t}\n\t{{end}}\n\n\t{{range .Transacts}}\n\t\t// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Transactor) {{.Normalized.Name}}(opts *bind.TransactOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) (*types.Transaction, error) {\n\t\t\treturn _{{$contract.Type}}.contract.Transact(opts, \"{{.Original.Name}}\" {{range .Normalized.Inputs}}, {{.Name}}{{end}})\n\t\t}\n\n\t\t// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) (*types.Transaction, error) {\n\t\t  return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}})\n\t\t}\n\n\t\t// {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs $TRUE}} {{end}}) (*types.Transaction, error) {\n\t\t  return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}})\n\t\t}\n\t{{end}}\n\n\t{{if .Fallback}} \n\t\t// Fallback is a paid mutator transaction binding the contract fallback function.\n\t\t//\n\t\t// Solidity: {{.Fallback.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Transactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) {\n\t\t\treturn _{{$contract.Type}}.contract.RawTransact(opts, calldata)\n\t\t}\n\n\t\t// Fallback is a paid mutator transaction binding the contract fallback function.\n\t\t//\n\t\t// Solidity: {{.Fallback.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Session) Fallback(calldata []byte) (*types.Transaction, error) {\n\t\t  return _{{$contract.Type}}.Contract.Fallback(&_{{$contract.Type}}.TransactOpts, calldata)\n\t\t}\n\t\n\t\t// Fallback is a paid mutator transaction binding the contract fallback function.\n\t\t// \n\t\t// Solidity: {{.Fallback.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) Fallback(calldata []byte) (*types.Transaction, error) {\n\t\t  return _{{$contract.Type}}.Contract.Fallback(&_{{$contract.Type}}.TransactOpts, calldata)\n\t\t}\n\t{{end}}\n\n\t{{if .Receive}} \n\t\t// Receive is a paid mutator transaction binding the contract receive function.\n\t\t//\n\t\t// Solidity: {{.Receive.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Transactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) {\n\t\t\treturn _{{$contract.Type}}.contract.RawTransact(opts, nil) // calldata is disallowed for receive function\n\t\t}\n\n\t\t// Receive is a paid mutator transaction binding the contract receive function.\n\t\t//\n\t\t// Solidity: {{.Receive.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Session) Receive() (*types.Transaction, error) {\n\t\t  return _{{$contract.Type}}.Contract.Receive(&_{{$contract.Type}}.TransactOpts)\n\t\t}\n\t\n\t\t// Receive is a paid mutator transaction binding the contract receive function.\n\t\t// \n\t\t// Solidity: {{.Receive.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) Receive() (*types.Transaction, error) {\n\t\t  return _{{$contract.Type}}.Contract.Receive(&_{{$contract.Type}}.TransactOpts)\n\t\t}\n\t{{end}}\n\n\t{{range .Events}}\n\t\t// {{$contract.Type}}{{.Normalized.Name}}Iterator is returned from Filter{{.Normalized.Name}} and is used to iterate over the raw logs and unpacked data for {{.Normalized.Name}} events raised by the {{$contract.Type}} contract.\n\t\ttype {{$contract.Type}}{{.Normalized.Name}}Iterator struct {\n\t\t\tEvent *{{$contract.Type}}{{.Normalized.Name}} // Event containing the contract specifics and raw log\n\n\t\t\tcontract *bind.BoundContract // Generic contract to use for unpacking event data\n\t\t\tevent    string              // Event name to use for unpacking event data\n\n\t\t\tlogs chan types.Log        // Log channel receiving the found contract events\n\t\t\tsub  sero.Subscription     // Subscription for errors, completion and termination\n\t\t\tdone bool                  // Whether the subscription completed delivering logs\n\t\t\tfail error                 // Occurred error to stop iteration\n\t\t}\n\t\t// Next advances the iterator to the subsequent event, returning whether there\n\t\t// are any more events found. In case of a retrieval or parsing error, false is\n\t\t// returned and Error() can be queried for the exact failure.\n\t\tfunc (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Next() bool {\n\t\t\t// If the iterator failed, stop iterating\n\t\t\tif (it.fail != nil) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// If the iterator completed, deliver directly whatever's available\n\t\t\tif (it.done) {\n\t\t\t\tselect {\n\t\t\t\tcase log := <-it.logs:\n\t\t\t\t\tit.Event = new({{$contract.Type}}{{.Normalized.Name}})\n\t\t\t\t\tif err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {\n\t\t\t\t\t\tit.fail = err\n\t\t\t\t\t\treturn false\n\t\t\t\t\t}\n\t\t\t\t\tit.Event.Raw = log\n\t\t\t\t\treturn true\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Iterator still in progress, wait for either a data or an error event\n\t\t\tselect {\n\t\t\tcase log := <-it.logs:\n\t\t\t\tit.Event = new({{$contract.Type}}{{.Normalized.Name}})\n\t\t\t\tif err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {\n\t\t\t\t\tit.fail = err\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tit.Event.Raw = log\n\t\t\t\treturn true\n\n\t\t\tcase err := <-it.sub.Err():\n\t\t\t\tit.done = true\n\t\t\t\tit.fail = err\n\t\t\t\treturn it.Next()\n\t\t\t}\n\t\t}\n\t\t// Error returns any retrieval or parsing error occurred during filtering.\n\t\tfunc (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Error() error {\n\t\t\treturn it.fail\n\t\t}\n\t\t// Close terminates the iteration process, releasing any pending underlying\n\t\t// resources.\n\t\tfunc (it *{{$contract.Type}}{{.Normalized.Name}}Iterator) Close() error {\n\t\t\tit.sub.Unsubscribe()\n\t\t\treturn nil\n\t\t}\n\n\t\t// {{$contract.Type}}{{.Normalized.Name}} represents a {{.Normalized.Name}} event raised by the {{$contract.Type}} contract.\n\t\ttype {{$contract.Type}}{{.Normalized.Name}} struct { {{range .Normalized.Inputs}}\n\t\t\t{{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type $structs $FALSE}}{{else}}{{bindtype .Type $structs $FALSE}}{{end}}; {{end}}\n\t\t\tRaw types.Log // Blockchain specific contextual infos\n\t\t}\n\n\t\t// Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n \t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Filterer) Filter{{.Normalized.Name}}(opts *bind.FilterOpts{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs $TRUE}}{{end}}{{end}}) (*{{$contract.Type}}{{.Normalized.Name}}Iterator, error) {\n\t\t\t{{range .Normalized.Inputs}}\n\t\t\t{{if .Indexed}}var {{.Name}}Rule []interface{}\n\t\t\tfor _, {{.Name}}Item := range {{.Name}} {\n\t\t\t\t{{.Name}}Rule = append({{.Name}}Rule, {{.Name}}Item)\n\t\t\t}{{end}}{{end}}\n\n\t\t\tlogs, sub, err := _{{$contract.Type}}.contract.FilterLogs(opts, \"{{.Original.Name}}\"{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}}Rule{{end}}{{end}})\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn &{{$contract.Type}}{{.Normalized.Name}}Iterator{contract: _{{$contract.Type}}.contract, event: \"{{.Original.Name}}\", logs: logs, sub: sub}, nil\n \t\t}\n\n\t\t// Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Filterer) Watch{{.Normalized.Name}}(opts *bind.WatchOpts, sink chan<- *{{$contract.Type}}{{.Normalized.Name}}{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs $TRUE}}{{end}}{{end}}) (event.Subscription, error) {\n\t\t\t{{range .Normalized.Inputs}}\n\t\t\t{{if .Indexed}}var {{.Name}}Rule []interface{}\n\t\t\tfor _, {{.Name}}Item := range {{.Name}} {\n\t\t\t\t{{.Name}}Rule = append({{.Name}}Rule, {{.Name}}Item)\n\t\t\t}{{end}}{{end}}\n\n\t\t\tlogs, sub, err := _{{$contract.Type}}.contract.WatchLogs(opts, \"{{.Original.Name}}\"{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}}Rule{{end}}{{end}})\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn event.NewSubscription(func(quit <-chan struct{}) error {\n\t\t\t\tdefer sub.Unsubscribe()\n\t\t\t\tfor {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase log := <-logs:\n\t\t\t\t\t\t// New log arrived, parse the event and forward to the user\n\t\t\t\t\t\tevent := new({{$contract.Type}}{{.Normalized.Name}})\n\t\t\t\t\t\tif err := _{{$contract.Type}}.contract.UnpackLog(event, \"{{.Original.Name}}\", log); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevent.Raw = log\n\n\t\t\t\t\t\tselect {\n\t\t\t\t\t\tcase sink <- event:\n\t\t\t\t\t\tcase err := <-sub.Err():\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\tcase <-quit:\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\t}\n\t\t\t\t\tcase err := <-sub.Err():\n\t\t\t\t\t\treturn err\n\t\t\t\t\tcase <-quit:\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}), nil\n\t\t}\n\n\t\t// Parse{{.Normalized.Name}} is a log parse operation binding the contract event 0x{{printf \"%x\" .Original.ID}}.\n\t\t//\n\t\t// Solidity: {{.Original.String}}\n\t\tfunc (_{{$contract.Type}} *{{$contract.Type}}Filterer) Parse{{.Normalized.Name}}(log types.Log) (*{{$contract.Type}}{{.Normalized.Name}}, error) {\n\t\t\tevent := new({{$contract.Type}}{{.Normalized.Name}})\n\t\t\tif err := _{{$contract.Type}}.contract.UnpackLog(event, \"{{.Original.Name}}\", log); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn event, nil\n\t\t}\n\n \t{{end}}\n{{end}}\n`\n"
  },
  {
    "path": "accounts/abi/bind/topics.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bind\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"reflect\"\n\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\n// makeTopics converts a filter query argument list into a filter topic set.\nfunc makeTopics(query ...[]interface{}) ([][]common.Hash, error) {\n\ttopics := make([][]common.Hash, len(query))\n\tfor i, filter := range query {\n\t\tfor _, rule := range filter {\n\t\t\tvar topic common.Hash\n\n\t\t\t// Try to generate the topic based on simple types\n\t\t\tswitch rule := rule.(type) {\n\t\t\tcase common.Hash:\n\t\t\t\tcopy(topic[:], rule[:])\n\t\t\tcase common.Address:\n\t\t\t\tcopy(topic[:], rule.Bytes())\n\t\t\tcase *big.Int:\n\t\t\t\tblob := rule.Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase bool:\n\t\t\t\tif rule {\n\t\t\t\t\ttopic[common.HashLength-1] = 1\n\t\t\t\t}\n\t\t\tcase int8:\n\t\t\t\tblob := big.NewInt(int64(rule)).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase int16:\n\t\t\t\tblob := big.NewInt(int64(rule)).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase int32:\n\t\t\t\tblob := big.NewInt(int64(rule)).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase int64:\n\t\t\t\tblob := big.NewInt(rule).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase uint8:\n\t\t\t\tblob := new(big.Int).SetUint64(uint64(rule)).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase uint16:\n\t\t\t\tblob := new(big.Int).SetUint64(uint64(rule)).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase uint32:\n\t\t\t\tblob := new(big.Int).SetUint64(uint64(rule)).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase uint64:\n\t\t\t\tblob := new(big.Int).SetUint64(rule).Bytes()\n\t\t\t\tcopy(topic[common.HashLength-len(blob):], blob)\n\t\t\tcase string:\n\t\t\t\thash := crypto.Keccak256Hash([]byte(rule))\n\t\t\t\tcopy(topic[:], hash[:])\n\t\t\tcase []byte:\n\t\t\t\thash := crypto.Keccak256Hash(rule)\n\t\t\t\tcopy(topic[:], hash[:])\n\n\t\t\tdefault:\n\t\t\t\t// Attempt to generate the topic from funky types\n\t\t\t\tval := reflect.ValueOf(rule)\n\n\t\t\t\tswitch {\n\t\t\t\tcase val.Kind() == reflect.Array && reflect.TypeOf(rule).Elem().Kind() == reflect.Uint8:\n\t\t\t\t\treflect.Copy(reflect.ValueOf(topic[common.HashLength-val.Len():]), val)\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn nil, fmt.Errorf(\"unsupported indexed type: %T\", rule)\n\t\t\t\t}\n\t\t\t}\n\t\t\ttopics[i] = append(topics[i], topic)\n\t\t}\n\t}\n\treturn topics, nil\n}\n\n// Big batch of reflect types for topic reconstruction.\nvar (\n\treflectHash    = reflect.TypeOf(common.Hash{})\n\treflectAddress = reflect.TypeOf(common.Address{})\n\treflectBigInt  = reflect.TypeOf(new(big.Int))\n)\n\n// parseTopics converts the indexed topic fields into actual log field values.\n//\n// Note, dynamic types cannot be reconstructed since they get mapped to Keccak256\n// hashes as the topic value!\nfunc parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) error {\n\t// Sanity check that the fields and topics match up\n\tif len(fields) != len(topics) {\n\t\treturn errors.New(\"topic/field count mismatch\")\n\t}\n\t// Iterate over all the fields and reconstruct them from topics\n\tfor _, arg := range fields {\n\t\tif !arg.Indexed {\n\t\t\treturn errors.New(\"non-indexed field in topic reconstruction\")\n\t\t}\n\t\tfield := reflect.ValueOf(out).Elem().FieldByName(capitalise(arg.Name))\n\n\t\t// Try to parse the topic back into the fields based on primitive types\n\t\tswitch field.Kind() {\n\t\tcase reflect.Bool:\n\t\t\tif topics[0][common.HashLength-1] == 1 {\n\t\t\t\tfield.Set(reflect.ValueOf(true))\n\t\t\t}\n\t\tcase reflect.Int8:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(int8(num.Int64())))\n\n\t\tcase reflect.Int16:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(int16(num.Int64())))\n\n\t\tcase reflect.Int32:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(int32(num.Int64())))\n\n\t\tcase reflect.Int64:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(num.Int64()))\n\n\t\tcase reflect.Uint8:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(uint8(num.Uint64())))\n\n\t\tcase reflect.Uint16:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(uint16(num.Uint64())))\n\n\t\tcase reflect.Uint32:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(uint32(num.Uint64())))\n\n\t\tcase reflect.Uint64:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tfield.Set(reflect.ValueOf(num.Uint64()))\n\n\t\tdefault:\n\t\t\t// Ran out of plain primitive types, try custom types\n\t\t\tswitch field.Type() {\n\t\t\tcase reflectHash: // Also covers all dynamic types\n\t\t\t\tfield.Set(reflect.ValueOf(topics[0]))\n\n\t\t\tcase reflectAddress:\n\t\t\t\tvar addr common.Address\n\t\t\t\taddr.SetBytes(topics[0][0:])\n\t\t\t\tfield.Set(reflect.ValueOf(addr))\n\t\t\tcase reflectBigInt:\n\t\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\t\tfield.Set(reflect.ValueOf(num))\n\n\t\t\tdefault:\n\t\t\t\t// Ran out of custom types, try the crazies\n\t\t\t\tswitch {\n\t\t\t\tcase arg.Type.T == abi.FixedBytesTy:\n\t\t\t\t\treflect.Copy(field, reflect.ValueOf(topics[0][common.HashLength-arg.Type.Size:]))\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"unsupported indexed type: %v\", arg.Type)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttopics = topics[1:]\n\t}\n\treturn nil\n}\n\n// parseTopicsIntoMap converts the indexed topic field-value pairs into map key-value pairs\nfunc parseTopicsIntoMap(out map[string]interface{}, fields abi.Arguments, topics []common.Hash) error {\n\t// Sanity check that the fields and topics match up\n\tif len(fields) != len(topics) {\n\t\treturn errors.New(\"topic/field count mismatch\")\n\t}\n\t// Iterate over all the fields and reconstruct them from topics\n\tfor _, arg := range fields {\n\t\tif !arg.Indexed {\n\t\t\treturn errors.New(\"non-indexed field in topic reconstruction\")\n\t\t}\n\n\t\tswitch arg.Type.T {\n\t\tcase abi.BoolTy:\n\t\t\tout[arg.Name] = topics[0][common.HashLength-1] == 1\n\t\tcase abi.IntTy, abi.UintTy:\n\t\t\tnum := new(big.Int).SetBytes(topics[0][:])\n\t\t\tout[arg.Name] = num\n\t\tcase abi.AddressTy:\n\t\t\tvar addr common.ContractAddress\n\t\t\tcopy(addr[:], topics[0][12:])\n\t\t\tout[arg.Name] = addr\n\t\tcase abi.HashTy:\n\t\t\tout[arg.Name] = topics[0]\n\t\tcase abi.FixedBytesTy:\n\t\t\tout[arg.Name] = topics[0][:]\n\t\tcase abi.StringTy, abi.BytesTy, abi.SliceTy, abi.ArrayTy:\n\t\t\t// Array types (including strings and bytes) have their keccak256 hashes stored in the topic- not a hash\n\t\t\t// whose bytes can be decoded to the actual value- so the best we can do is retrieve that hash\n\t\t\tout[arg.Name] = topics[0]\n\t\tcase abi.FunctionTy:\n\t\t\tif garbage := binary.BigEndian.Uint64(topics[0][0:8]); garbage != 0 {\n\t\t\t\treturn fmt.Errorf(\"bind: got improperly encoded function type, got %v\", topics[0].Bytes())\n\t\t\t}\n\t\t\tvar tmp [24]byte\n\t\t\tcopy(tmp[:], topics[0][8:32])\n\t\t\tout[arg.Name] = tmp\n\t\tdefault: // Not handling tuples\n\t\t\treturn fmt.Errorf(\"unsupported indexed type: %v\", arg.Type)\n\t\t}\n\n\t\ttopics = topics[1:]\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "accounts/abi/bind/util.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bind\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// WaitMined waits for tx to be mined on the blockchain.\n// It stops waiting when the context is canceled.\nfunc WaitMined(ctx context.Context, b DeployBackend, tx *types.Transaction) (*types.Receipt, error) {\n\tqueryTicker := time.NewTicker(time.Second)\n\tdefer queryTicker.Stop()\n\n\tlogger := log.New(\"hash\", tx.Hash())\n\tfor {\n\t\treceipt, err := b.TransactionReceipt(ctx, tx.Hash())\n\t\tif receipt != nil {\n\t\t\treturn receipt, nil\n\t\t}\n\t\tif err != nil {\n\t\t\tlogger.Trace(\"Receipt retrieval failed\", \"err\", err)\n\t\t} else {\n\t\t\tlogger.Trace(\"Transaction not yet mined\")\n\t\t}\n\t\t// Wait for the next round.\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn nil, ctx.Err()\n\t\tcase <-queryTicker.C:\n\t\t}\n\t}\n}\n\n// WaitDeployed waits for a contract deployment transaction and returns the on-chain\n// contract address when it is mined. It stops waiting when ctx is canceled.\nfunc WaitDeployed(ctx context.Context, b DeployBackend, tx *types.Transaction) (common.Address, error) {\n\tif tx.To() != nil {\n\t\treturn common.Address{}, fmt.Errorf(\"tx is not contract creation\")\n\t}\n\treceipt, err := WaitMined(ctx, b, tx)\n\tif err != nil {\n\t\treturn common.Address{}, err\n\t}\n\tif receipt.ContractAddress == (common.Address{}) {\n\t\treturn common.Address{}, fmt.Errorf(\"zero address\")\n\t}\n\t// Check that code has indeed been deployed at the address.\n\t// This matters on pre-Homestead chains: OOG in the constructor\n\t// could leave an empty account behind.\n\tcode, err := b.CodeAt(ctx, receipt.ContractAddress, nil)\n\tif err == nil && len(code) == 0 {\n\t\terr = ErrNoCodeAfterDeploy\n\t}\n\treturn receipt.ContractAddress, err\n}\n"
  },
  {
    "path": "accounts/abi/doc.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package abi implements the Ethereum ABI (Application Binary\n// Interface).\n//\n// The Ethereum ABI is strongly typed, known at compile time\n// and static. This ABI will handle basic type casting; unsigned\n// to signed and visa versa. It does not handle slice casting such\n// as unsigned slice to signed slice. Bit size type casting is also\n// handled. ints with a bit size of 32 will be properly cast to int256,\n// etc.\npackage abi\n"
  },
  {
    "path": "accounts/abi/error.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n)\n\nvar (\n\terrBadBool = errors.New(\"abi: improperly encoded boolean value\")\n)\n\n// formatSliceString formats the reflection kind with the given slice size\n// and returns a formatted string representation.\nfunc formatSliceString(kind reflect.Kind, sliceSize int) string {\n\tif sliceSize == -1 {\n\t\treturn fmt.Sprintf(\"[]%v\", kind)\n\t}\n\treturn fmt.Sprintf(\"[%d]%v\", sliceSize, kind)\n}\n\n// sliceTypeCheck checks that the given slice can by assigned to the reflection\n// type in t.\nfunc sliceTypeCheck(t Type, val reflect.Value) error {\n\tif val.Kind() != reflect.Slice && val.Kind() != reflect.Array {\n\t\treturn typeErr(formatSliceString(t.getType().Kind(), t.Size), val.Type())\n\t}\n\n\tif t.T == ArrayTy && val.Len() != t.Size {\n\t\treturn typeErr(formatSliceString(t.Elem.getType().Kind(), t.Size), formatSliceString(val.Type().Elem().Kind(), val.Len()))\n\t}\n\n\tif t.Elem.T == SliceTy || t.Elem.T == ArrayTy {\n\t\tif val.Len() > 0 {\n\t\t\treturn sliceTypeCheck(*t.Elem, val.Index(0))\n\t\t}\n\t}\n\n\tif elemKind := val.Type().Elem().Kind(); elemKind != t.Elem.getType().Kind() {\n\t\treturn typeErr(formatSliceString(t.Elem.getType().Kind(), t.Size), val.Type())\n\t}\n\treturn nil\n}\n\n// typeCheck checks that the given reflection value can be assigned to the reflection\n// type in t.\nfunc typeCheck(t Type, value reflect.Value) error {\n\tif t.T == SliceTy || t.T == ArrayTy {\n\t\treturn sliceTypeCheck(t, value)\n\t}\n\n\t// Check base type validity. Element types will be checked later on.\n\tif t.getType().Kind() != value.Kind() {\n\t\treturn typeErr(t.getType().Kind(), value.Kind())\n\t} else if t.T == FixedBytesTy && t.Size != value.Len() {\n\t\treturn typeErr(t.getType(), value.Type())\n\t} else {\n\t\treturn nil\n\t}\n\n}\n\n// typeErr returns a formatted type casting error.\nfunc typeErr(expected, got interface{}) error {\n\treturn fmt.Errorf(\"abi: cannot use %v as type %v as argument\", got, expected)\n}\n"
  },
  {
    "path": "accounts/abi/event.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\ntype Event struct {\n\t// Name is the event name used for internal representation. It's derived from\n\t// the raw name and a suffix will be added in the case of a event overload.\n\t//\n\t// e.g.\n\t// There are two events have same name:\n\t// * foo(int,int)\n\t// * foo(uint,uint)\n\t// The event name of the first one wll be resolved as foo while the second one\n\t// will be resolved as foo0.\n\tName string\n\t// RawName is the raw event name parsed from ABI.\n\tRawName   string\n\tAnonymous bool\n\tInputs    Arguments\n\tstr       string\n\t// Sig contains the string signature according to the ABI spec.\n\t// e.g.\t event foo(uint32 a, int b) = \"foo(uint32,int256)\"\n\t// Please note that \"int\" is substitute for its canonical representation \"int256\"\n\tSig string\n\t// ID returns the canonical representation of the event's signature used by the\n\t// abi definition to identify event names and types.\n\tID common.Hash\n}\n\n// NewEvent creates a new Event.\n// It sanitizes the input arguments to remove unnamed arguments.\n// It also precomputes the id, signature and string representation\n// of the event.\nfunc NewEvent(name, rawName string, anonymous bool, inputs Arguments) Event {\n\t// sanitize inputs to remove inputs without names\n\t// and precompute string and sig representation.\n\tnames := make([]string, len(inputs))\n\ttypes := make([]string, len(inputs))\n\tfor i, input := range inputs {\n\t\tif input.Name == \"\" {\n\t\t\tinputs[i] = Argument{\n\t\t\t\tName:    fmt.Sprintf(\"arg%d\", i),\n\t\t\t\tIndexed: input.Indexed,\n\t\t\t\tType:    input.Type,\n\t\t\t}\n\t\t} else {\n\t\t\tinputs[i] = input\n\t\t}\n\t\t// string representation\n\t\tnames[i] = fmt.Sprintf(\"%v %v\", input.Type, inputs[i].Name)\n\t\tif input.Indexed {\n\t\t\tnames[i] = fmt.Sprintf(\"%v indexed %v\", input.Type, inputs[i].Name)\n\t\t}\n\t\t// sig representation\n\t\ttypes[i] = input.Type.String()\n\t}\n\n\tstr := fmt.Sprintf(\"event %v(%v)\", rawName, strings.Join(names, \", \"))\n\tsig := fmt.Sprintf(\"%v(%v)\", rawName, strings.Join(types, \",\"))\n\tid := common.BytesToHash(crypto.Keccak256([]byte(sig)))\n\n\treturn Event{\n\t\tName:      name,\n\t\tRawName:   rawName,\n\t\tAnonymous: anonymous,\n\t\tInputs:    inputs,\n\t\tstr:       str,\n\t\tSig:       sig,\n\t\tID:        id,\n\t}\n}\n\nfunc (e Event) String() string {\n\treturn e.str\n}\n"
  },
  {
    "path": "accounts/abi/method.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\n// FunctionType represents different types of functions a contract might have.\ntype FunctionType int\n\nconst (\n\t// Constructor represents the constructor of the contract.\n\t// The constructor function is called while deploying a contract.\n\tConstructor FunctionType = iota\n\t// Fallback represents the fallback function.\n\t// This function is executed if no other function matches the given function\n\t// signature and no receive function is specified.\n\tFallback\n\t// Receive represents the receive function.\n\t// This function is executed on plain Ether transfers.\n\tReceive\n\t// Function represents a normal function.\n\tFunction\n)\n\n// Method represents a callable given a `Name` and whether the method is a constant.\n// If the method is `Const` no transaction needs to be created for this\n// particular Method call. It can easily be simulated using a local VM.\n// For example a `Balance()` method only needs to retrieve something\n// from the storage and therefore requires no Tx to be send to the\n// network. A method such as `Transact` does require a Tx and thus will\n// be flagged `false`.\n// Input specifies the required input parameters for this gives method.\ntype Method struct {\n\t// Name is the method name used for internal representation. It's derived from\n\t// the raw name and a suffix will be added in the case of a function overload.\n\t//\n\t// e.g.\n\t// There are two functions have same name:\n\t// * foo(int,int)\n\t// * foo(uint,uint)\n\t// The method name of the first one will be resolved as foo while the second one\n\t// will be resolved as foo0.\n\tName    string\n\tRawName string // RawName is the raw method name parsed from ABI\n\n\t// Type indicates whether the method is a\n\t// special fallback introduced in solidity v0.6.0\n\tType FunctionType\n\n\t// StateMutability indicates the mutability state of method,\n\t// the default value is nonpayable. It can be empty if the abi\n\t// is generated by legacy compiler.\n\tStateMutability string\n\n\t// Legacy indicators generated by compiler before v0.6.0\n\tConstant bool\n\tPayable  bool\n\n\tInputs  Arguments\n\tOutputs Arguments\n\tstr     string\n\t// Sig returns the methods string signature according to the ABI spec.\n\t// e.g.\t\tfunction foo(uint32 a, int b) = \"foo(uint32,int256)\"\n\t// Please note that \"int\" is substitute for its canonical representation \"int256\"\n\tSig string\n\t// ID returns the canonical representation of the method's signature used by the\n\t// abi definition to identify method names and types.\n\tID []byte\n}\n\n// NewMethod creates a new Method.\n// A method should always be created using NewMethod.\n// It also precomputes the sig representation and the string representation\n// of the method.\nfunc NewMethod(name string, rawName string, funType FunctionType, mutability string, isConst, isPayable bool, inputs Arguments, outputs Arguments) Method {\n\tvar (\n\t\ttypes       = make([]string, len(inputs))\n\t\tinputNames  = make([]string, len(inputs))\n\t\toutputNames = make([]string, len(outputs))\n\t)\n\tfor i, input := range inputs {\n\t\tinputNames[i] = fmt.Sprintf(\"%v %v\", input.Type, input.Name)\n\t\ttypes[i] = input.Type.String()\n\t}\n\tfor i, output := range outputs {\n\t\toutputNames[i] = output.Type.String()\n\t\tif len(output.Name) > 0 {\n\t\t\toutputNames[i] += fmt.Sprintf(\" %v\", output.Name)\n\t\t}\n\t}\n\t// calculate the signature and method id. Note only function\n\t// has meaningful signature and id.\n\tvar (\n\t\tsig string\n\t\tid  []byte\n\t)\n\tif funType == Function {\n\t\tsig = fmt.Sprintf(\"%v(%v)\", rawName, strings.Join(types, \",\"))\n\t\tid = crypto.Keccak256([]byte(sig))[:4]\n\t}\n\t// Extract meaningful state mutability of solidity method.\n\t// If it's default value, never print it.\n\tstate := mutability\n\tif state == \"nonpayable\" {\n\t\tstate = \"\"\n\t}\n\tif state != \"\" {\n\t\tstate = state + \" \"\n\t}\n\tidentity := fmt.Sprintf(\"function %v\", rawName)\n\tif funType == Fallback {\n\t\tidentity = \"fallback\"\n\t} else if funType == Receive {\n\t\tidentity = \"receive\"\n\t} else if funType == Constructor {\n\t\tidentity = \"constructor\"\n\t}\n\tstr := fmt.Sprintf(\"%v(%v) %sreturns(%v)\", identity, strings.Join(inputNames, \", \"), state, strings.Join(outputNames, \", \"))\n\n\treturn Method{\n\t\tName:            name,\n\t\tRawName:         rawName,\n\t\tType:            funType,\n\t\tStateMutability: mutability,\n\t\tConstant:        isConst,\n\t\tPayable:         isPayable,\n\t\tInputs:          inputs,\n\t\tOutputs:         outputs,\n\t\tstr:             str,\n\t\tSig:             sig,\n\t\tID:              id,\n\t}\n}\n\nfunc (method Method) String() string {\n\treturn method.str\n}\n\n// IsConstant returns the indicator whether the method is read-only.\nfunc (method Method) IsConstant() bool {\n\treturn method.StateMutability == \"view\" || method.StateMutability == \"pure\" || method.Constant\n}\n\n// IsPayable returns the indicator whether the method can process\n// plain ether transfers.\nfunc (method Method) IsPayable() bool {\n\treturn method.StateMutability == \"payable\" || method.Payable\n}\n"
  },
  {
    "path": "accounts/abi/numbers.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar (\n//bigT      = reflect.TypeOf(&big.Int{})\n//derefbigT = reflect.TypeOf(big.Int{})\n//uint8T    = reflect.TypeOf(uint8(0))\n//uint16T   = reflect.TypeOf(uint16(0))\n//uint32T   = reflect.TypeOf(uint32(0))\n//uint64T   = reflect.TypeOf(uint64(0))\n//int8T     = reflect.TypeOf(int8(0))\n//int16T    = reflect.TypeOf(int16(0))\n//int32T    = reflect.TypeOf(int32(0))\n//int64T    = reflect.TypeOf(int64(0))\n//addressT  = reflect.TypeOf(common.ContractAddress{})\n)\n\n// U256 converts a big Int into a 256bit EVM number.\nfunc U256(n *big.Int) []byte {\n\treturn math.PaddedBigBytes(math.U256(n), 32)\n}\n"
  },
  {
    "path": "accounts/abi/pack.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"math/big\"\n\t\"reflect\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\n// packBytesSlice packs the given bytes as [L, V] as the canonical representation\n// bytes slice\nfunc packBytesSlice(bytes []byte, l int) []byte {\n\tlen := packNum(reflect.ValueOf(l))\n\treturn append(len, common.RightPadBytes(bytes, (l+31)/32*32)...)\n}\n\nfunc convertToPkr(addr []byte) []byte {\n\tvar pkr c_type.PKr\n\tcopy(pkr[:], addr)\n\tshortAddr := c_superzk.HashPKr(pkr.NewRef())\n\treturn common.LeftPadBytes(shortAddr[:], 32)\n\n}\n\n// packElement packs the given reflect value according to the abi specification in\n// t.\nfunc packElement(t Type, reflectValue reflect.Value) []byte {\n\tswitch t.T {\n\tcase IntTy, UintTy:\n\t\treturn packNum(reflectValue)\n\tcase StringTy:\n\t\treturn packBytesSlice([]byte(reflectValue.String()), reflectValue.Len())\n\tcase AddressTy:\n\t\tif reflectValue.Kind() == reflect.Array {\n\t\t\treflectValue = mustArrayToByteSlice(reflectValue)\n\t\t}\n\t\treturn convertToPkr(reflectValue.Bytes())\n\tcase BoolTy:\n\t\tif reflectValue.Bool() {\n\t\t\treturn math.PaddedBigBytes(common.Big1, 32)\n\t\t}\n\t\treturn math.PaddedBigBytes(common.Big0, 32)\n\tcase BytesTy:\n\t\tif reflectValue.Kind() == reflect.Array {\n\t\t\treflectValue = mustArrayToByteSlice(reflectValue)\n\t\t}\n\t\treturn packBytesSlice(reflectValue.Bytes(), reflectValue.Len())\n\tcase FixedBytesTy, FunctionTy:\n\t\tif reflectValue.Kind() == reflect.Array {\n\t\t\treflectValue = mustArrayToByteSlice(reflectValue)\n\t\t}\n\t\treturn common.RightPadBytes(reflectValue.Bytes(), 32)\n\tdefault:\n\t\tpanic(\"abi: fatal error\")\n\t}\n}\n\n// packNum packs the given number (using the reflect value) and will cast it to appropriate number representation\nfunc packNum(value reflect.Value) []byte {\n\tswitch kind := value.Kind(); kind {\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\treturn U256(new(big.Int).SetUint64(value.Uint()))\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn U256(big.NewInt(value.Int()))\n\tcase reflect.Ptr:\n\t\treturn U256(value.Interface().(*big.Int))\n\tdefault:\n\t\tpanic(\"abi: fatal error\")\n\t}\n\n}\n"
  },
  {
    "path": "accounts/abi/reflect.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"strings\"\n)\n\n// indirect recursively dereferences the value until it either gets the value\n// or finds a big.Int\nfunc indirect(v reflect.Value) reflect.Value {\n\tif v.Kind() == reflect.Ptr && v.Elem().Type() != reflect.TypeOf(big.Int{}) {\n\t\treturn indirect(v.Elem())\n\t}\n\treturn v\n}\n\n// reflectIntType returns the reflect using the given size and\n// unsignedness.\nfunc reflectIntType(unsigned bool, size int) reflect.Type {\n\tif unsigned {\n\t\tswitch size {\n\t\tcase 8:\n\t\t\treturn reflect.TypeOf(uint8(0))\n\t\tcase 16:\n\t\t\treturn reflect.TypeOf(uint16(0))\n\t\tcase 32:\n\t\t\treturn reflect.TypeOf(uint32(0))\n\t\tcase 64:\n\t\t\treturn reflect.TypeOf(uint64(0))\n\t\t}\n\t}\n\tswitch size {\n\tcase 8:\n\t\treturn reflect.TypeOf(int8(0))\n\tcase 16:\n\t\treturn reflect.TypeOf(int16(0))\n\tcase 32:\n\t\treturn reflect.TypeOf(int32(0))\n\tcase 64:\n\t\treturn reflect.TypeOf(int64(0))\n\t}\n\treturn reflect.TypeOf(&big.Int{})\n}\n\n// mustArrayToBytesSlice creates a new byte slice with the exact same size as value\n// and copies the bytes in value to the new slice.\nfunc mustArrayToByteSlice(value reflect.Value) reflect.Value {\n\tslice := reflect.MakeSlice(reflect.TypeOf([]byte{}), value.Len(), value.Len())\n\treflect.Copy(slice, value)\n\treturn slice\n}\n\n// set attempts to assign src to dst by either setting, copying or otherwise.\n//\n// set is a bit more lenient when it comes to assignment and doesn't force an as\n// strict ruleset as bare `reflect` does.\nfunc set(dst, src reflect.Value) error {\n\tdstType, srcType := dst.Type(), src.Type()\n\tswitch {\n\tcase dstType.Kind() == reflect.Interface && dst.Elem().IsValid():\n\t\treturn set(dst.Elem(), src)\n\tcase dstType.Kind() == reflect.Ptr && dstType.Elem() != reflect.TypeOf(big.Int{}):\n\t\treturn set(dst.Elem(), src)\n\tcase srcType.AssignableTo(dstType) && dst.CanSet():\n\t\tdst.Set(src)\n\tcase dstType.Kind() == reflect.Slice && srcType.Kind() == reflect.Slice && dst.CanSet():\n\t\treturn setSlice(dst, src)\n\tcase dstType.Kind() == reflect.Array:\n\t\treturn setArray(dst, src)\n\tcase dstType.Kind() == reflect.Struct:\n\t\treturn setStruct(dst, src)\n\tdefault:\n\t\treturn fmt.Errorf(\"abi: cannot unmarshal %v in to %v\", src.Type(), dst.Type())\n\t}\n\treturn nil\n}\n\n// setSlice attempts to assign src to dst when slices are not assignable by default\n// e.g. src: [][]byte -> dst: [][15]byte\n// setSlice ignores if we cannot copy all of src' elements.\nfunc setSlice(dst, src reflect.Value) error {\n\tslice := reflect.MakeSlice(dst.Type(), src.Len(), src.Len())\n\tfor i := 0; i < src.Len(); i++ {\n\t\tif src.Index(i).Kind() == reflect.Struct {\n\t\t\tif err := set(slice.Index(i), src.Index(i)); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\t// e.g. [][32]uint8 to []common.Hash\n\t\t\tif err := set(slice.Index(i), src.Index(i)); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\tif dst.CanSet() {\n\t\tdst.Set(slice)\n\t\treturn nil\n\t}\n\treturn errors.New(\"Cannot set slice, destination not settable\")\n}\n\nfunc setArray(dst, src reflect.Value) error {\n\tarray := reflect.New(dst.Type()).Elem()\n\tmin := src.Len()\n\tif src.Len() > dst.Len() {\n\t\tmin = dst.Len()\n\t}\n\tfor i := 0; i < min; i++ {\n\t\tif err := set(array.Index(i), src.Index(i)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif dst.CanSet() {\n\t\tdst.Set(array)\n\t\treturn nil\n\t}\n\treturn errors.New(\"Cannot set array, destination not settable\")\n}\n\nfunc setStruct(dst, src reflect.Value) error {\n\tfor i := 0; i < src.NumField(); i++ {\n\t\tsrcField := src.Field(i)\n\t\tdstField := dst.Field(i)\n\t\tif !dstField.IsValid() || !srcField.IsValid() {\n\t\t\treturn fmt.Errorf(\"Could not find src field: %v value: %v in destination\", srcField.Type().Name(), srcField)\n\t\t}\n\t\tif err := set(dstField, srcField); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// mapArgNamesToStructFields maps a slice of argument names to struct fields.\n// first round: for each Exportable field that contains a `abi:\"\"` tag\n//   and this field name exists in the given argument name list, pair them together.\n// second round: for each argument name that has not been already linked,\n//   find what variable is expected to be mapped into, if it exists and has not been\n//   used, pair them.\n// Note this function assumes the given value is a struct value.\nfunc mapArgNamesToStructFields(argNames []string, value reflect.Value) (map[string]string, error) {\n\ttyp := value.Type()\n\n\tabi2struct := make(map[string]string)\n\tstruct2abi := make(map[string]string)\n\n\t// first round ~~~\n\tfor i := 0; i < typ.NumField(); i++ {\n\t\tstructFieldName := typ.Field(i).Name\n\n\t\t// skip private struct fields.\n\t\tif structFieldName[:1] != strings.ToUpper(structFieldName[:1]) {\n\t\t\tcontinue\n\t\t}\n\t\t// skip fields that have no abi:\"\" tag.\n\t\ttagName, ok := typ.Field(i).Tag.Lookup(\"abi\")\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\t// check if tag is empty.\n\t\tif tagName == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"struct: abi tag in '%s' is empty\", structFieldName)\n\t\t}\n\t\t// check which argument field matches with the abi tag.\n\t\tfound := false\n\t\tfor _, arg := range argNames {\n\t\t\tif arg == tagName {\n\t\t\t\tif abi2struct[arg] != \"\" {\n\t\t\t\t\treturn nil, fmt.Errorf(\"struct: abi tag in '%s' already mapped\", structFieldName)\n\t\t\t\t}\n\t\t\t\t// pair them\n\t\t\t\tabi2struct[arg] = structFieldName\n\t\t\t\tstruct2abi[structFieldName] = arg\n\t\t\t\tfound = true\n\t\t\t}\n\t\t}\n\t\t// check if this tag has been mapped.\n\t\tif !found {\n\t\t\treturn nil, fmt.Errorf(\"struct: abi tag '%s' defined but not found in abi\", tagName)\n\t\t}\n\t}\n\n\t// second round ~~~\n\tfor _, argName := range argNames {\n\n\t\tstructFieldName := ToCamelCase(argName)\n\n\t\tif structFieldName == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"abi: purely underscored output cannot unpack to struct\")\n\t\t}\n\n\t\t// this abi has already been paired, skip it... unless there exists another, yet unassigned\n\t\t// struct field with the same field name. If so, raise an error:\n\t\t//    abi: [ { \"name\": \"value\" } ]\n\t\t//    struct { Value  *big.Int , Value1 *big.Int `abi:\"value\"`}\n\t\tif abi2struct[argName] != \"\" {\n\t\t\tif abi2struct[argName] != structFieldName &&\n\t\t\t\tstruct2abi[structFieldName] == \"\" &&\n\t\t\t\tvalue.FieldByName(structFieldName).IsValid() {\n\t\t\t\treturn nil, fmt.Errorf(\"abi: multiple variables maps to the same abi field '%s'\", argName)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// return an error if this struct field has already been paired.\n\t\tif struct2abi[structFieldName] != \"\" {\n\t\t\treturn nil, fmt.Errorf(\"abi: multiple outputs mapping to the same struct field '%s'\", structFieldName)\n\t\t}\n\n\t\tif value.FieldByName(structFieldName).IsValid() {\n\t\t\t// pair them\n\t\t\tabi2struct[argName] = structFieldName\n\t\t\tstruct2abi[structFieldName] = argName\n\t\t} else {\n\t\t\t// not paired, but annotate as used, to detect cases like\n\t\t\t//   abi : [ { \"name\": \"value\" }, { \"name\": \"_value\" } ]\n\t\t\t//   struct { Value *big.Int }\n\t\t\tstruct2abi[structFieldName] = argName\n\t\t}\n\t}\n\treturn abi2struct, nil\n}\n"
  },
  {
    "path": "accounts/abi/type.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\n// Type enumerator\nconst (\n\tIntTy byte = iota\n\tUintTy\n\tBoolTy\n\tStringTy\n\tSliceTy\n\tArrayTy\n\tTupleTy\n\tAddressTy\n\tFixedBytesTy\n\tBytesTy\n\tHashTy\n\tFixedPointTy\n\tFunctionTy\n)\n\n// Type is the reflection of the supported argument type\ntype Type struct {\n\tElem *Type\n\tSize int\n\tT    byte // Our own type checking\n\n\tstringKind string // holds the unparsed string for deriving signatures\n\n\t// Tuple relative fields\n\tTupleRawName  string       // Raw struct name defined in source code, may be empty.\n\tTupleElems    []*Type      // Type information of all tuple fields\n\tTupleRawNames []string     // Raw field name of all tuple fields\n\tTupleType     reflect.Type // Underlying struct of the tuple\n}\n\nvar (\n\t// typeRegex parses the abi sub types\n\ttypeRegex = regexp.MustCompile(\"([a-zA-Z]+)(([0-9]+)(x([0-9]+))?)?\")\n)\n\n// String implements Stringer\n\n// NewType creates a new reflection type of abi type given in t.\nfunc NewType(t string, internalType string, components []ArgumentMarshaling) (typ Type, err error) {\n\t// check that array brackets are equal if they exist\n\tif strings.Count(t, \"[\") != strings.Count(t, \"]\") {\n\t\treturn Type{}, fmt.Errorf(\"invalid arg type in abi\")\n\t}\n\ttyp.stringKind = t\n\n\t// if there are brackets, get ready to go into slice/array mode and\n\t// recursively create the type\n\tif strings.Count(t, \"[\") != 0 {\n\t\t// Note internalType can be empty here.\n\t\tsubInternal := internalType\n\t\tif i := strings.LastIndex(internalType, \"[\"); i != -1 {\n\t\t\tsubInternal = subInternal[:i]\n\t\t}\n\t\t// recursively embed the type\n\t\ti := strings.LastIndex(t, \"[\")\n\t\tembeddedType, err := NewType(t[:i], subInternal, components)\n\t\tif err != nil {\n\t\t\treturn Type{}, err\n\t\t}\n\t\t// grab the last cell and create a type from there\n\t\tsliced := t[i:]\n\t\t// grab the slice size with regexp\n\t\tre := regexp.MustCompile(\"[0-9]+\")\n\t\tintz := re.FindAllString(sliced, -1)\n\n\t\tif len(intz) == 0 {\n\t\t\t// is a slice\n\t\t\ttyp.T = SliceTy\n\t\t\ttyp.Elem = &embeddedType\n\t\t\ttyp.stringKind = embeddedType.stringKind + sliced\n\t\t} else if len(intz) == 1 {\n\t\t\t// is an array\n\t\t\ttyp.T = ArrayTy\n\t\t\ttyp.Elem = &embeddedType\n\t\t\ttyp.Size, err = strconv.Atoi(intz[0])\n\t\t\tif err != nil {\n\t\t\t\treturn Type{}, fmt.Errorf(\"abi: error parsing variable size: %v\", err)\n\t\t\t}\n\t\t\ttyp.stringKind = embeddedType.stringKind + sliced\n\t\t} else {\n\t\t\treturn Type{}, fmt.Errorf(\"invalid formatting of array type\")\n\t\t}\n\t\treturn typ, err\n\t}\n\t// parse the type and size of the abi-type.\n\tmatches := typeRegex.FindAllStringSubmatch(t, -1)\n\tif len(matches) == 0 {\n\t\treturn Type{}, fmt.Errorf(\"invalid type '%v'\", t)\n\t}\n\tparsedType := matches[0]\n\n\t// varSize is the size of the variable\n\tvar varSize int\n\tif len(parsedType[3]) > 0 {\n\t\tvar err error\n\t\tvarSize, err = strconv.Atoi(parsedType[2])\n\t\tif err != nil {\n\t\t\treturn Type{}, fmt.Errorf(\"abi: error parsing variable size: %v\", err)\n\t\t}\n\t} else {\n\t\tif parsedType[0] == \"uint\" || parsedType[0] == \"int\" {\n\t\t\t// this should fail because it means that there's something wrong with\n\t\t\t// the abi type (the compiler should always format it to the size...always)\n\t\t\treturn Type{}, fmt.Errorf(\"unsupported arg type: %s\", t)\n\t\t}\n\t}\n\t// varType is the parsed abi type\n\tswitch varType := parsedType[1]; varType {\n\tcase \"int\":\n\t\ttyp.Size = varSize\n\t\ttyp.T = IntTy\n\tcase \"uint\":\n\t\ttyp.Size = varSize\n\t\ttyp.T = UintTy\n\tcase \"bool\":\n\t\ttyp.T = BoolTy\n\tcase \"address\":\n\t\ttyp.Size = 20\n\t\ttyp.T = AddressTy\n\tcase \"string\":\n\t\ttyp.T = StringTy\n\tcase \"bytes\":\n\t\tif varSize == 0 {\n\t\t\ttyp.T = BytesTy\n\t\t} else {\n\t\t\ttyp.T = FixedBytesTy\n\t\t\ttyp.Size = varSize\n\t\t}\n\tcase \"tuple\":\n\t\tvar (\n\t\t\tfields     []reflect.StructField\n\t\t\telems      []*Type\n\t\t\tnames      []string\n\t\t\texpression string // canonical parameter expression\n\t\t)\n\t\texpression += \"(\"\n\t\toverloadedNames := make(map[string]string)\n\t\tfor idx, c := range components {\n\t\t\tcType, err := NewType(c.Type, c.InternalType, c.Components)\n\t\t\tif err != nil {\n\t\t\t\treturn Type{}, err\n\t\t\t}\n\t\t\tfieldName, err := overloadedArgName(c.Name, overloadedNames)\n\t\t\tif err != nil {\n\t\t\t\treturn Type{}, err\n\t\t\t}\n\t\t\toverloadedNames[fieldName] = fieldName\n\t\t\tfields = append(fields, reflect.StructField{\n\t\t\t\tName: fieldName, // reflect.StructOf will panic for any exported field.\n\t\t\t\tType: cType.getType(),\n\t\t\t\tTag:  reflect.StructTag(\"json:\\\"\" + c.Name + \"\\\"\"),\n\t\t\t})\n\t\t\telems = append(elems, &cType)\n\t\t\tnames = append(names, c.Name)\n\t\t\texpression += cType.stringKind\n\t\t\tif idx != len(components)-1 {\n\t\t\t\texpression += \",\"\n\t\t\t}\n\t\t}\n\t\texpression += \")\"\n\n\t\ttyp.TupleType = reflect.StructOf(fields)\n\t\ttyp.TupleElems = elems\n\t\ttyp.TupleRawNames = names\n\t\ttyp.T = TupleTy\n\t\ttyp.stringKind = expression\n\n\t\tconst structPrefix = \"struct \"\n\t\t// After solidity 0.5.10, a new field of abi \"internalType\"\n\t\t// is introduced. From that we can obtain the struct name\n\t\t// user defined in the source code.\n\t\tif internalType != \"\" && strings.HasPrefix(internalType, structPrefix) {\n\t\t\t// Foo.Bar type definition is not allowed in golang,\n\t\t\t// convert the format to FooBar\n\t\t\ttyp.TupleRawName = strings.Replace(internalType[len(structPrefix):], \".\", \"\", -1)\n\t\t}\n\n\tcase \"function\":\n\t\ttyp.T = FunctionTy\n\t\ttyp.Size = 24\n\tdefault:\n\t\treturn Type{}, fmt.Errorf(\"unsupported arg type: %s\", t)\n\t}\n\n\treturn\n}\n\nfunc (t Type) getType() reflect.Type {\n\tswitch t.T {\n\tcase IntTy:\n\t\treturn reflectIntType(false, t.Size)\n\tcase UintTy:\n\t\treturn reflectIntType(true, t.Size)\n\tcase BoolTy:\n\t\treturn reflect.TypeOf(false)\n\tcase StringTy:\n\t\treturn reflect.TypeOf(\"\")\n\tcase SliceTy:\n\t\treturn reflect.SliceOf(t.Elem.getType())\n\tcase ArrayTy:\n\t\treturn reflect.ArrayOf(t.Size, t.Elem.getType())\n\tcase TupleTy:\n\t\treturn t.TupleType\n\tcase AddressTy:\n\t\treturn reflect.TypeOf(common.ContractAddress{})\n\tcase FixedBytesTy:\n\t\treturn reflect.ArrayOf(t.Size, reflect.TypeOf(byte(0)))\n\tcase BytesTy:\n\t\treturn reflect.SliceOf(reflect.TypeOf(byte(0)))\n\tcase HashTy:\n\t\t// hashtype currently not used\n\t\treturn reflect.ArrayOf(32, reflect.TypeOf(byte(0)))\n\tcase FixedPointTy:\n\t\t// fixedpoint type currently not used\n\t\treturn reflect.ArrayOf(32, reflect.TypeOf(byte(0)))\n\tcase FunctionTy:\n\t\treturn reflect.ArrayOf(24, reflect.TypeOf(byte(0)))\n\tdefault:\n\t\tpanic(\"Invalid type\")\n\t}\n}\n\nfunc (t Type) String() (out string) {\n\treturn t.stringKind\n}\n\nfunc overloadedArgName(rawName string, names map[string]string) (string, error) {\n\tfieldName := ToCamelCase(rawName)\n\tif fieldName == \"\" {\n\t\treturn \"\", errors.New(\"abi: purely anonymous or underscored field is not supported\")\n\t}\n\t// Handle overloaded fieldNames\n\t_, ok := names[fieldName]\n\tfor idx := 0; ok; idx++ {\n\t\tfieldName = fmt.Sprintf(\"%s%d\", ToCamelCase(rawName), idx)\n\t\t_, ok = names[fieldName]\n\t}\n\treturn fieldName, nil\n}\n\nfunc (t Type) pack(v reflect.Value) ([]byte, error) {\n\t// dereference pointer first if it's a pointer\n\tv = indirect(v)\n\tif err := typeCheck(t, v); err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch t.T {\n\tcase SliceTy, ArrayTy:\n\t\tvar ret []byte\n\n\t\tif t.requiresLengthPrefix() {\n\t\t\t// append length\n\t\t\tret = append(ret, packNum(reflect.ValueOf(v.Len()))...)\n\t\t}\n\n\t\t// calculate offset if any\n\t\toffset := 0\n\t\toffsetReq := isDynamicType(*t.Elem)\n\t\tif offsetReq {\n\t\t\toffset = getTypeSize(*t.Elem) * v.Len()\n\t\t}\n\t\tvar tail []byte\n\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\tval, err := t.Elem.pack(v.Index(i))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif !offsetReq {\n\t\t\t\tret = append(ret, val...)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tret = append(ret, packNum(reflect.ValueOf(offset))...)\n\t\t\toffset += len(val)\n\t\t\ttail = append(tail, val...)\n\t\t}\n\t\treturn append(ret, tail...), nil\n\tcase TupleTy:\n\t\t// (T1,...,Tk) for k >= 0 and any types T1, …, Tk\n\t\t// enc(X) = head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(k))\n\t\t// where X = (X(1), ..., X(k)) and head and tail are defined for Ti being a static\n\t\t// type as\n\t\t//     head(X(i)) = enc(X(i)) and tail(X(i)) = \"\" (the empty string)\n\t\t// and as\n\t\t//     head(X(i)) = enc(len(head(X(1)) ... head(X(k)) tail(X(1)) ... tail(X(i-1))))\n\t\t//     tail(X(i)) = enc(X(i))\n\t\t// otherwise, i.e. if Ti is a dynamic type.\n\t\tfieldmap, err := mapArgNamesToStructFields(t.TupleRawNames, v)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// Calculate prefix occupied size.\n\t\toffset := 0\n\t\tfor _, elem := range t.TupleElems {\n\t\t\toffset += getTypeSize(*elem)\n\t\t}\n\t\tvar ret, tail []byte\n\t\tfor i, elem := range t.TupleElems {\n\t\t\tfield := v.FieldByName(fieldmap[t.TupleRawNames[i]])\n\t\t\tif !field.IsValid() {\n\t\t\t\treturn nil, fmt.Errorf(\"field %s for tuple not found in the given struct\", t.TupleRawNames[i])\n\t\t\t}\n\t\t\tval, err := elem.pack(field)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif isDynamicType(*elem) {\n\t\t\t\tret = append(ret, packNum(reflect.ValueOf(offset))...)\n\t\t\t\ttail = append(tail, val...)\n\t\t\t\toffset += len(val)\n\t\t\t} else {\n\t\t\t\tret = append(ret, val...)\n\t\t\t}\n\t\t}\n\t\treturn append(ret, tail...), nil\n\n\tdefault:\n\t\treturn packElement(t, v), nil\n\t}\n}\n\n//func (t Type) pack(v reflect.Value) ([]byte, error) {\n//\t// dereference pointer first if it's a pointer\n//\tv = indirect(v)\n//\n//\tif err := typeCheck(t, v); err != nil {\n//\t\treturn nil, err\n//\t}\n//\n//\tif t.T == SliceTy || t.T == ArrayTy {\n//\t\tvar packed []byte\n//\n//\t\tfor i := 0; i < v.Len(); i++ {\n//\t\t\tval, err := t.Elem.pack(v.Index(i))\n//\t\t\tif err != nil {\n//\t\t\t\treturn nil, err\n//\t\t\t}\n//\t\t\tpacked = append(packed, val...)\n//\t\t}\n//\t\tif t.T == SliceTy {\n//\t\t\treturn packBytesSlice(packed, v.Len()), nil\n//\t\t} else if t.T == ArrayTy {\n//\t\t\treturn packed, nil\n//\t\t}\n//\t}\n//\treturn packElement(t, v), nil\n//}\n\nfunc (t Type) getAllAddress(v reflect.Value) (pkrs []c_type.PKr, err error) {\n\t// dereference pointer first if it's a pointer\n\tv = indirect(v)\n\n\tif err := typeCheck(t, v); err != nil {\n\t\treturn nil, err\n\t}\n\tif t.T == SliceTy || t.T == ArrayTy {\n\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\tval, err := t.Elem.getAllAddress(v.Index(i))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tpkrs = append(pkrs, val...)\n\t\t}\n\t\treturn\n\t}\n\tif t.T == TupleTy {\n\t\tfieldmap, e := mapArgNamesToStructFields(t.TupleRawNames, v)\n\t\tif e != nil {\n\t\t\treturn nil, e\n\t\t}\n\t\tfor i, elem := range t.TupleElems {\n\t\t\tfield := v.FieldByName(fieldmap[t.TupleRawNames[i]])\n\t\t\tval, err := elem.getAllAddress(field)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tpkrs = append(pkrs, val...)\n\t\t}\n\t\treturn\n\t}\n\tif t.T == AddressTy {\n\t\tif v.Kind() == reflect.Array {\n\t\t\tv = mustArrayToByteSlice(v)\n\t\t}\n\t\tif len(v.Bytes()) != 96 {\n\t\t\treturn nil, errors.New(\"address params only support pkr\")\n\t\t}\n\t\tvar pkr c_type.PKr\n\t\tcopy(pkr[:], v.Bytes())\n\t\tpkrs = append(pkrs, pkr)\n\t\treturn\n\t}\n\treturn\n\n}\n\n// requireLengthPrefix returns whether the type requires any sort of length\n// prefixing.\nfunc (t Type) requiresLengthPrefix() bool {\n\treturn t.T == StringTy || t.T == BytesTy || t.T == SliceTy\n}\n\n// isDynamicType returns true if the type is dynamic.\n// The following types are called “dynamic”:\n// * bytes\n// * string\n// * T[] for any T\n// * T[k] for any dynamic T and any k >= 0\n// * (T1,...,Tk) if Ti is dynamic for some 1 <= i <= k\nfunc isDynamicType(t Type) bool {\n\tif t.T == TupleTy {\n\t\tfor _, elem := range t.TupleElems {\n\t\t\tif isDynamicType(*elem) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\treturn t.T == StringTy || t.T == BytesTy || t.T == SliceTy || (t.T == ArrayTy && isDynamicType(*t.Elem))\n}\n\n// getTypeSize returns the size that this type needs to occupy.\n// We distinguish static and dynamic types. Static types are encoded in-place\n// and dynamic types are encoded at a separately allocated location after the\n// current block.\n// So for a static variable, the size returned represents the size that the\n// variable actually occupies.\n// For a dynamic variable, the returned size is fixed 32 bytes, which is used\n// to store the location reference for actual value storage.\nfunc getTypeSize(t Type) int {\n\tif t.T == ArrayTy && !isDynamicType(*t.Elem) {\n\t\t// Recursively calculate type size if it is a nested array\n\t\tif t.Elem.T == ArrayTy {\n\t\t\treturn t.Size * getTypeSize(*t.Elem)\n\t\t}\n\t\treturn t.Size * 32\n\t} else if t.T == TupleTy && !isDynamicType(t) {\n\t\ttotal := 0\n\t\tfor _, elem := range t.TupleElems {\n\t\t\ttotal += getTypeSize(*elem)\n\t\t}\n\t\treturn total\n\t}\n\treturn 32\n}\n"
  },
  {
    "path": "accounts/abi/unpack.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage abi\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"reflect\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nvar (\n\t// MaxUint256 is the maximum value that can be represented by a uint256\n\tMaxUint256 = new(big.Int).Sub(new(big.Int).Lsh(common.Big1, 256), common.Big1)\n\t// MaxInt256 is the maximum value that can be represented by a int256\n\tMaxInt256 = new(big.Int).Sub(new(big.Int).Lsh(common.Big1, 255), common.Big1)\n)\n\n// ReadInteger reads the integer based on its kind and returns the appropriate value\nfunc ReadInteger(typ Type, b []byte) interface{} {\n\tif typ.T == UintTy {\n\t\tswitch typ.Size {\n\t\tcase 8:\n\t\t\treturn b[len(b)-1]\n\t\tcase 16:\n\t\t\treturn binary.BigEndian.Uint16(b[len(b)-2:])\n\t\tcase 32:\n\t\t\treturn binary.BigEndian.Uint32(b[len(b)-4:])\n\t\tcase 64:\n\t\t\treturn binary.BigEndian.Uint64(b[len(b)-8:])\n\t\tdefault:\n\t\t\t// the only case left for unsigned integer is uint256.\n\t\t\treturn new(big.Int).SetBytes(b)\n\t\t}\n\t}\n\tswitch typ.Size {\n\tcase 8:\n\t\treturn int8(b[len(b)-1])\n\tcase 16:\n\t\treturn int16(binary.BigEndian.Uint16(b[len(b)-2:]))\n\tcase 32:\n\t\treturn int32(binary.BigEndian.Uint32(b[len(b)-4:]))\n\tcase 64:\n\t\treturn int64(binary.BigEndian.Uint64(b[len(b)-8:]))\n\tdefault:\n\t\t// the only case left for integer is int256\n\t\t// big.SetBytes can't tell if a number is negative or positive in itself.\n\t\t// On EVM, if the returned number > max int256, it is negative.\n\t\t// A number is > max int256 if the bit at position 255 is set.\n\t\tret := new(big.Int).SetBytes(b)\n\t\tif ret.Bit(255) == 1 {\n\t\t\tret.Add(MaxUint256, new(big.Int).Neg(ret))\n\t\t\tret.Add(ret, common.Big1)\n\t\t\tret.Neg(ret)\n\t\t}\n\t\treturn ret\n\t}\n}\n\n// reads a bool\nfunc readBool(word []byte) (bool, error) {\n\tfor _, b := range word[:31] {\n\t\tif b != 0 {\n\t\t\treturn false, errBadBool\n\t\t}\n\t}\n\tswitch word[31] {\n\tcase 0:\n\t\treturn false, nil\n\tcase 1:\n\t\treturn true, nil\n\tdefault:\n\t\treturn false, errBadBool\n\t}\n}\n\n// A function type is simply the address with the function selection signature at the end.\n// This enforces that standard by always presenting it as a 24-array (address + sig = 24 bytes)\nfunc readFunctionType(t Type, word []byte) (funcTy [24]byte, err error) {\n\tif t.T != FunctionTy {\n\t\treturn [24]byte{}, fmt.Errorf(\"abi: invalid type in call to make function type byte array\")\n\t}\n\tif garbage := binary.BigEndian.Uint64(word[24:32]); garbage != 0 {\n\t\terr = fmt.Errorf(\"abi: got improperly encoded function type, got %v\", word)\n\t} else {\n\t\tcopy(funcTy[:], word[0:24])\n\t}\n\treturn\n}\n\n// ReadFixedBytes uses reflection to create a fixed array to be read from\nfunc ReadFixedBytes(t Type, word []byte) (interface{}, error) {\n\tif t.T != FixedBytesTy {\n\t\treturn nil, fmt.Errorf(\"abi: invalid type in call to make fixed byte array\")\n\t}\n\t// convert\n\tarray := reflect.New(t.getType()).Elem()\n\n\treflect.Copy(array, reflect.ValueOf(word[0:t.Size]))\n\treturn array.Interface(), nil\n\n}\n\nfunc getFullElemSize(elem *Type) int {\n\t//all other should be counted as 32 (slices have pointers to respective elements)\n\tsize := 32\n\t//arrays wrap it, each element being the same size\n\tfor elem.T == ArrayTy {\n\t\tsize *= elem.Size\n\t\telem = elem.Elem\n\t}\n\treturn size\n}\n\n// iteratively unpack elements\nfunc forEachUnpack(t Type, output []byte, start, size int) (interface{}, error) {\n\tif size < 0 {\n\t\treturn nil, fmt.Errorf(\"cannot marshal input to array, size is negative (%d)\", size)\n\t}\n\tif start+32*size > len(output) {\n\t\treturn nil, fmt.Errorf(\"abi: cannot marshal in to go array: offset %d would go over slice boundary (len=%d)\", len(output), start+32*size)\n\t}\n\n\t// this value will become our slice or our array, depending on the type\n\tvar refSlice reflect.Value\n\n\tif t.T == SliceTy {\n\t\t// declare our slice\n\t\trefSlice = reflect.MakeSlice(t.getType(), size, size)\n\t} else if t.T == ArrayTy {\n\t\t// declare our array\n\t\trefSlice = reflect.New(t.getType()).Elem()\n\t} else {\n\t\treturn nil, fmt.Errorf(\"abi: invalid type in array/slice unpacking stage\")\n\t}\n\n\t// Arrays have packed elements, resulting in longer unpack steps.\n\t// Slices have just 32 bytes per element (pointing to the contents).\n\telemSize := 32\n\tif t.T == ArrayTy {\n\t\telemSize = getFullElemSize(t.Elem)\n\t}\n\n\tfor i, j := start, 0; j < size; i, j = i+elemSize, j+1 {\n\n\t\tinter, err := toGoType(i, *t.Elem, output)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// append the item to our reflect slice\n\t\trefSlice.Index(j).Set(reflect.ValueOf(inter))\n\t}\n\n\t// return the interface\n\treturn refSlice.Interface(), nil\n}\n\nfunc forTupleUnpack(t Type, output []byte) (interface{}, error) {\n\tretval := reflect.New(t.getType()).Elem()\n\tvirtualArgs := 0\n\tfor index, elem := range t.TupleElems {\n\t\tmarshalledValue, err := toGoType((index+virtualArgs)*32, *elem, output)\n\t\tif elem.T == ArrayTy && !isDynamicType(*elem) {\n\t\t\t// If we have a static array, like [3]uint256, these are coded as\n\t\t\t// just like uint256,uint256,uint256.\n\t\t\t// This means that we need to add two 'virtual' arguments when\n\t\t\t// we count the index from now on.\n\t\t\t//\n\t\t\t// Array values nested multiple levels deep are also encoded inline:\n\t\t\t// [2][3]uint256: uint256,uint256,uint256,uint256,uint256,uint256\n\t\t\t//\n\t\t\t// Calculate the full array size to get the correct offset for the next argument.\n\t\t\t// Decrement it by 1, as the normal index increment is still applied.\n\t\t\tvirtualArgs += getTypeSize(*elem)/32 - 1\n\t\t} else if elem.T == TupleTy && !isDynamicType(*elem) {\n\t\t\t// If we have a static tuple, like (uint256, bool, uint256), these are\n\t\t\t// coded as just like uint256,bool,uint256\n\t\t\tvirtualArgs += getTypeSize(*elem)/32 - 1\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tretval.Field(index).Set(reflect.ValueOf(marshalledValue))\n\t}\n\treturn retval.Interface(), nil\n}\n\n// toGoType parses the output bytes and recursively assigns the value of these bytes\n// into a go type with accordance with the ABI spec.\nfunc toGoType(index int, t Type, output []byte) (interface{}, error) {\n\tif index+32 > len(output) {\n\t\treturn nil, fmt.Errorf(\"abi: cannot marshal in to go type: length insufficient %d require %d\", len(output), index+32)\n\t}\n\n\tvar (\n\t\treturnOutput  []byte\n\t\tbegin, length int\n\t\terr           error\n\t)\n\n\t// if we require a length prefix, find the beginning word and size returned.\n\tif t.requiresLengthPrefix() {\n\t\tbegin, length, err = lengthPrefixPointsTo(index, output)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\treturnOutput = output[index : index+32]\n\t}\n\n\tswitch t.T {\n\tcase TupleTy:\n\t\tif isDynamicType(t) {\n\t\t\tbegin, err := tuplePointsTo(index, output)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn forTupleUnpack(t, output[begin:])\n\t\t}\n\t\treturn forTupleUnpack(t, output[index:])\n\tcase SliceTy:\n\t\treturn forEachUnpack(t, output[begin:], 0, length)\n\tcase ArrayTy:\n\t\tif isDynamicType(*t.Elem) {\n\t\t\toffset := int64(binary.BigEndian.Uint64(returnOutput[len(returnOutput)-8:]))\n\t\t\treturn forEachUnpack(t, output[offset:], 0, t.Size)\n\t\t}\n\t\treturn forEachUnpack(t, output[index:], 0, t.Size)\n\tcase StringTy: // variable arrays are written at the end of the return bytes\n\t\treturn string(output[begin : begin+length]), nil\n\tcase IntTy, UintTy:\n\t\treturn ReadInteger(t, returnOutput), nil\n\tcase BoolTy:\n\t\treturn readBool(returnOutput)\n\tcase AddressTy:\n\t\tvar caddr common.ContractAddress\n\t\tcaddr.SetBytes(returnOutput)\n\t\treturn caddr, nil\n\tcase HashTy:\n\t\treturn common.BytesToHash(returnOutput), nil\n\tcase BytesTy:\n\t\treturn output[begin : begin+length], nil\n\tcase FixedBytesTy:\n\t\treturn ReadFixedBytes(t, returnOutput)\n\tcase FunctionTy:\n\t\treturn readFunctionType(t, returnOutput)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"abi: unknown type %v\", t.T)\n\t}\n}\n\n// interprets a 32 byte slice as an offset and then determines which indice to look to decode the type.\nfunc lengthPrefixPointsTo(index int, output []byte) (start int, length int, err error) {\n\tbigOffsetEnd := big.NewInt(0).SetBytes(output[index : index+32])\n\tbigOffsetEnd.Add(bigOffsetEnd, common.Big32)\n\toutputLength := big.NewInt(int64(len(output)))\n\n\tif bigOffsetEnd.Cmp(outputLength) > 0 {\n\t\treturn 0, 0, fmt.Errorf(\"abi: cannot marshal in to go slice: offset %v would go over slice boundary (len=%v)\", bigOffsetEnd, outputLength)\n\t}\n\n\tif bigOffsetEnd.BitLen() > 63 {\n\t\treturn 0, 0, fmt.Errorf(\"abi offset larger than int64: %v\", bigOffsetEnd)\n\t}\n\n\toffsetEnd := int(bigOffsetEnd.Uint64())\n\tlengthBig := big.NewInt(0).SetBytes(output[offsetEnd-32 : offsetEnd])\n\n\ttotalSize := big.NewInt(0)\n\ttotalSize.Add(totalSize, bigOffsetEnd)\n\ttotalSize.Add(totalSize, lengthBig)\n\tif totalSize.BitLen() > 63 {\n\t\treturn 0, 0, fmt.Errorf(\"abi length larger than int64: %v\", totalSize)\n\t}\n\n\tif totalSize.Cmp(outputLength) > 0 {\n\t\treturn 0, 0, fmt.Errorf(\"abi: cannot marshal in to go type: length insufficient %v require %v\", outputLength, totalSize)\n\t}\n\tstart = int(bigOffsetEnd.Uint64())\n\tlength = int(lengthBig.Uint64())\n\treturn\n}\n\n// tuplePointsTo resolves the location reference for dynamic tuple.\nfunc tuplePointsTo(index int, output []byte) (start int, err error) {\n\toffset := big.NewInt(0).SetBytes(output[index : index+32])\n\toutputLen := big.NewInt(int64(len(output)))\n\n\tif offset.Cmp(big.NewInt(int64(len(output)))) > 0 {\n\t\treturn 0, fmt.Errorf(\"abi: cannot marshal in to go slice: offset %v would go over slice boundary (len=%v)\", offset, outputLen)\n\t}\n\tif offset.BitLen() > 63 {\n\t\treturn 0, fmt.Errorf(\"abi offset larger than int64: %v\", offset)\n\t}\n\treturn int(offset.Uint64()), nil\n}\n"
  },
  {
    "path": "accounts/accounts.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package accounts implements high level Sero account management.\npackage accounts\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/address\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\n// AccountAddress represents an Sero account located at a specific location defined\n// by the optional URL field.\ntype Account struct {\n\tAddress address.PKAddress `json:\"address\"` // Sero account address derived from the key\n\tTk      address.TKAddress `json:\"tk\"`      // Sero account tk derived from the key\n\tURL     URL               `json:\"url\"`     // Optional resource locator within a backend\n\tAt      uint64            `json:\"at\"`      //account create at blocknum\n\tVersion int               `json:\"version\"`\n}\n\nfunc (self *Account) GetPkr(rand *c_type.Uint256) c_type.PKr {\n\tpk := self.Address.ToUint512()\n\treturn superzk.Pk2PKr(&pk, rand)\n}\nfunc (self *Account) GetPk() c_type.Uint512 {\n\tvar pk c_type.Uint512\n\tpk, _ = superzk.Tk2Pk(self.Tk.ToTk().NewRef())\n\treturn pk\n}\n\nfunc (self *Account) GetDefaultPkr(index uint64) c_type.PKr {\n\tpk := self.Address.ToUint512()\n\tr := c_type.Uint256{}\n\tcopy(r[:], common.LeftPadBytes(utils.EncodeNumber(index), 32))\n\tif index == 0 {\n\t\treturn superzk.Pk2PKr(&pk, nil)\n\t} else {\n\t\treturn superzk.Pk2PKr(&pk, &r)\n\t}\n}\n\nfunc (self *Account) IsMyPk(pk c_type.Uint512) bool {\n\tpkr := superzk.Pk2PKr(&pk, nil)\n\treturn self.IsMyPkr(pkr)\n\n}\n\nfunc (self *Account) IsMyPkr(pkr c_type.PKr) bool {\n\ttk := c_type.Tk{}\n\tcopy(tk[:], self.Tk[:])\n\treturn superzk.IsMyPKr(&tk, &pkr)\n}\n\n// Wallet represents a software or hardware wallet that might contain one or more\n// accounts (derived from the same seed).\ntype Wallet interface {\n\t// URL retrieves the canonical path under which this wallet is reachable. It is\n\t// user by upper layers to define a sorting order over all wallets from multiple\n\t// backends.\n\tURL() URL\n\n\t// Status returns a textual status to aid the user in the current state of the\n\t// wallet. It also returns an error indicating any failure the wallet might have\n\t// encountered.\n\tStatus() (string, error)\n\n\t// Open initializes access to a wallet instance. It is not meant to unlock or\n\t// decrypt account keys, rather simply to establish a connection to hardware\n\t// wallets and/or to access derivation seeds.\n\t//\n\t// The passphrase parameter may or may not be used by the implementation of a\n\t// particular wallet instance. The reason there is no passwordless open method\n\t// is to strive towards a uniform wallet handling, oblivious to the different\n\t// backend providers.\n\t//\n\t// Please note, if you open a wallet, you must close it to release any allocated\n\t// resources (especially important when working with hardware wallets).\n\tOpen(passphrase string) error\n\n\t// Close releases any resources held by an open wallet instance.\n\tClose() error\n\n\t// Accounts retrieves the list of signing accounts the wallet is currently aware\n\t// of. For hierarchical deterministic wallets, the list will not be exhaustive,\n\t// rather only contain the accounts explicitly pinned during account derivation.\n\tAccounts() []Account\n\n\t// Contains returns whether an account is part of this particular wallet or not.\n\tContains(account Account) bool\n\n\t// Derive attempts to explicitly derive a hierarchical deterministic account at\n\t// the specified derivation path. If requested, the derived account will be added\n\t// to the wallet's tracked account list.\n\tDerive(path DerivationPath, pin bool) (Account, error)\n\n\t// SelfDerive sets a base account derivation path from which the wallet attempts\n\t// to discover non zero accounts and automatically add them to list of tracked\n\t// accounts.\n\t//\n\t// Note, self derivaton will increment the last component of the specified path\n\t// opposed to decending into a child path to allow discovering accounts starting\n\t// from non zero components.\n\t//\n\t// You can disable automatic account discovery by calling SelfDerive with a nil\n\t// chain state reader.\n\n\t// IsMine return whether an once address is mine or not\n\tIsMine(pkr c_type.PKr) bool\n\n\tAddressUnlocked(account Account) (bool, error)\n\n\tGetSeed() (*address.Seed, error)\n\n\tGetSeedWithPassphrase(passphrase string) (*address.Seed, error)\n}\n\n// Backend is a \"wallet provider\" that may contain a batch of accounts they can\n// sign transactions with and upon request, do so.\ntype Backend interface {\n\t// Wallets retrieves the list of wallets the backend is currently aware of.\n\t//\n\t// The returned wallets are not opened by default. For software HD wallets this\n\t// means that no base seeds are decrypted, and for hardware wallets that no actual\n\t// connection is established.\n\t//\n\t// The resulting wallet list will be sorted alphabetically based on its internal\n\t// URL assigned by the backend. Since wallets (especially hardware) may come and\n\t// go, the same wallet might appear at a different positions in the list during\n\t// subsequent retrievals.\n\tWallets() []Wallet\n\n\t// Subscribe creates an async subscription to receive notifications when the\n\t// backend detects the arrival or departure of a wallet.\n\tSubscribe(sink chan<- WalletEvent) event.Subscription\n}\n\n// WalletEventType represents the different event types that can be fired by\n// the wallet subscription subsystem.\ntype WalletEventType int\n\nconst (\n\t// WalletArrived is fired when a new wallet is detected either via USB or via\n\t// a filesystem event in the keystore.\n\tWalletArrived WalletEventType = iota\n\n\t// WalletOpened is fired when a wallet is successfully opened with the purpose\n\t// of starting any background processes such as automatic key derivation.\n\tWalletOpened\n\n\t// WalletDropped\n\tWalletDropped\n)\n\n// WalletEvent is an event fired by an account backend when a wallet arrival or\n// departure is detected.\ntype WalletEvent struct {\n\tWallet Wallet          // Wallet instance arrived or departed\n\tKind   WalletEventType // Event type that happened in the system\n}\n"
  },
  {
    "path": "accounts/errors.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage accounts\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\n// ErrUnknownAccount is returned for any requested operation for which no backend\n// provides the specified account.\nvar ErrUnknownAccount = errors.New(\"unknown account\")\n\n// ErrUnknownWallet is returned for any requested operation for which no backend\n// provides the specified wallet.\nvar ErrUnknownWallet = errors.New(\"unknown wallet\")\n\n// ErrNotSupported is returned when an operation is requested from an account\n// backend that it does not support.\nvar ErrNotSupported = errors.New(\"not supported\")\n\n// ErrInvalidPassphrase is returned when a decryption operation receives a bad\n// passphrase.\nvar ErrInvalidPassphrase = errors.New(\"invalid passphrase\")\n\n// ErrWalletAlreadyOpen is returned if a wallet is attempted to be opened the\n// second time.\nvar ErrWalletAlreadyOpen = errors.New(\"wallet already open\")\n\n// ErrWalletClosed is returned if a wallet is attempted to be opened the\n// secodn time.\nvar ErrWalletClosed = errors.New(\"wallet closed\")\n\n// AuthNeededError is returned by backends for signing requests where the user\n// is required to provide further authentication before signing can succeed.\n//\n// This usually means either that a password needs to be supplied, or perhaps a\n// one time PIN code displayed by some hardware device.\ntype AuthNeededError struct {\n\tNeeded string // Extra authentication the user needs to provide\n}\n\n// NewAuthNeededError creates a new authentication error with the extra details\n// about the needed fields set.\nfunc NewAuthNeededError(needed string) error {\n\treturn &AuthNeededError{\n\t\tNeeded: needed,\n\t}\n}\n\n// Error implements the standard error interface.\nfunc (err *AuthNeededError) Error() string {\n\treturn fmt.Sprintf(\"authentication needed: %s\", err.Needed)\n}\n"
  },
  {
    "path": "accounts/hd.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage accounts\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"strings\"\n)\n\n// DefaultRootDerivationPath is the root path to which custom derivation endpoints\n// are appended. As such, the first account will be at m/44'/60'/0'/0, the second\n// at m/44'/60'/0'/1, etc.\nvar DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0}\n\n// DefaultBaseDerivationPath is the base path from which custom derivation endpoints\n// are incremented. As such, the first account will be at m/44'/60'/0'/0, the second\n// at m/44'/60'/0'/1, etc.\nvar DefaultBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0}\n\n// DefaultLedgerBaseDerivationPath is the base path from which custom derivation endpoints\n// are incremented. As such, the first account will be at m/44'/60'/0'/0, the second\n// at m/44'/60'/0'/1, etc.\nvar DefaultLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0}\n\n// DerivationPath represents the computer friendly version of a hierarchical\n// deterministic wallet account derivaion path.\n//\n// The BIP-32 spec https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n// defines derivation paths to be of the form:\n//\n//   m / purpose' / coin_type' / account' / change / address_index\n//\n// The BIP-44 spec https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\n// defines that the `purpose` be 44' (or 0x8000002C) for crypto currencies, and\n// SLIP-44 https://github.com/satoshilabs/slips/blob/master/slip-0044.md assigns\n// the `coin_type` 60' (or 0x8000003C) to Ethereum.\n//\n// The root path for Ethereum is m/44'/60'/0'/0 according to the specification\n// from https://github.com/ethereum/EIPs/issues/84, albeit it's not set in stone\n// yet whether accounts should increment the last component or the children of\n// that. We will go with the simpler approach of incrementing the last component.\ntype DerivationPath []uint32\n\n// ParseDerivationPath converts a user specified derivation path string to the\n// internal binary representation.\n//\n// Full derivation paths need to start with the `m/` prefix, relative derivation\n// paths (which will get appended to the default root path) must not have prefixes\n// in front of the first element. Whitespace is ignored.\nfunc ParseDerivationPath(path string) (DerivationPath, error) {\n\tvar result DerivationPath\n\n\t// Handle absolute or relative paths\n\tcomponents := strings.Split(path, \"/\")\n\tswitch {\n\tcase len(components) == 0:\n\t\treturn nil, errors.New(\"empty derivation path\")\n\n\tcase strings.TrimSpace(components[0]) == \"\":\n\t\treturn nil, errors.New(\"ambiguous path: use 'm/' prefix for absolute paths, or no leading '/' for relative ones\")\n\n\tcase strings.TrimSpace(components[0]) == \"m\":\n\t\tcomponents = components[1:]\n\n\tdefault:\n\t\tresult = append(result, DefaultRootDerivationPath...)\n\t}\n\t// All remaining components are relative, append one by one\n\tif len(components) == 0 {\n\t\treturn nil, errors.New(\"empty derivation path\") // Empty relative paths\n\t}\n\tfor _, component := range components {\n\t\t// Ignore any user added whitespace\n\t\tcomponent = strings.TrimSpace(component)\n\t\tvar value uint32\n\n\t\t// Handle hardened paths\n\t\tif strings.HasSuffix(component, \"'\") {\n\t\t\tvalue = 0x80000000\n\t\t\tcomponent = strings.TrimSpace(strings.TrimSuffix(component, \"'\"))\n\t\t}\n\t\t// Handle the non hardened component\n\t\tbigval, ok := new(big.Int).SetString(component, 0)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"invalid component: %s\", component)\n\t\t}\n\t\tmax := math.MaxUint32 - value\n\t\tif bigval.Sign() < 0 || bigval.Cmp(big.NewInt(int64(max))) > 0 {\n\t\t\tif value == 0 {\n\t\t\t\treturn nil, fmt.Errorf(\"component %v out of allowed range [0, %d]\", bigval, max)\n\t\t\t}\n\t\t\treturn nil, fmt.Errorf(\"component %v out of allowed hardened range [0, %d]\", bigval, max)\n\t\t}\n\t\tvalue += uint32(bigval.Uint64())\n\n\t\t// Append and repeat\n\t\tresult = append(result, value)\n\t}\n\treturn result, nil\n}\n\n// String implements the stringer interface, converting a binary derivation path\n// to its canonical representation.\nfunc (path DerivationPath) String() string {\n\tresult := \"m\"\n\tfor _, component := range path {\n\t\tvar hardened bool\n\t\tif component >= 0x80000000 {\n\t\t\tcomponent -= 0x80000000\n\t\t\thardened = true\n\t\t}\n\t\tresult = fmt.Sprintf(\"%s/%d\", result, component)\n\t\tif hardened {\n\t\t\tresult += \"'\"\n\t\t}\n\t}\n\treturn result\n}\n"
  },
  {
    "path": "accounts/keystore/account_cache.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"bufio\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// Minimum amount of time between cache reloads. This limit applies if the platform does\n// not support change notifications. It also applies if the keystore directory does not\n// exist yet, the code will attempt to create a watcher at most this often.\nconst minReloadInterval = 2 * time.Second\n\ntype accountsByTag []accountByTag\n\ntype accountByTag struct {\n\taccountByURL accounts.Account\n\tupdate       bool\n}\n\nfunc (s accountsByTag) Len() int { return len(s) }\nfunc (s accountsByTag) Less(i, j int) bool {\n\treturn s[i].accountByURL.URL.Cmp(s[j].accountByURL.URL) < 0\n}\nfunc (s accountsByTag) Swap(i, j int) { s[i], s[j] = s[j], s[i] }\n\n// AmbiguousAddrError is returned when attempting to unlock\n// an address for which more than one file exists.\ntype AmbiguousAddrError struct {\n\tAddress address.PKAddress\n\tMatches []accounts.Account\n}\n\nfunc (err *AmbiguousAddrError) Error() string {\n\tfiles := \"\"\n\tfor i, a := range err.Matches {\n\t\tfiles += a.URL.Path\n\t\tif i < len(err.Matches)-1 {\n\t\t\tfiles += \", \"\n\t\t}\n\t}\n\treturn fmt.Sprintf(\"multiple keys match address (%s)\", files)\n}\n\n// accountCache is a live index of all accounts in the keystore.\ntype accountCache struct {\n\tkeydir   string\n\twatcher  *watcher\n\tmu       sync.Mutex\n\tall      accountsByTag\n\tbyAddr   map[address.PKAddress][]accounts.Account\n\tthrottle *time.Timer\n\tnotify   chan struct{}\n\tfileC    fileCache\n}\n\nfunc newAccountCache(keydir string) (*accountCache, chan struct{}) {\n\tac := &accountCache{\n\t\tkeydir: keydir,\n\t\tbyAddr: make(map[address.PKAddress][]accounts.Account),\n\t\tnotify: make(chan struct{}, 1),\n\t\tfileC:  fileCache{all: mapset.NewThreadUnsafeSet()},\n\t}\n\tac.watcher = newWatcher(ac)\n\treturn ac, ac.notify\n}\n\nfunc (ac *accountCache) accounts() []accounts.Account {\n\tac.maybeReload()\n\tac.mu.Lock()\n\tdefer ac.mu.Unlock()\n\tcpy := []accounts.Account{}\n\tfor _, accT := range ac.all {\n\t\tcpy = append(cpy, accT.accountByURL)\n\t}\n\treturn cpy\n}\n\nfunc (ac *accountCache) accountsByTag() []accountByTag {\n\tac.maybeReload()\n\tac.mu.Lock()\n\tdefer ac.mu.Unlock()\n\tcpy := make([]accountByTag, len(ac.all))\n\tcopy(cpy, ac.all)\n\treturn cpy\n}\n\nfunc (ac *accountCache) hasAddress(addr address.PKAddress) bool {\n\tac.maybeReload()\n\tac.mu.Lock()\n\tdefer ac.mu.Unlock()\n\treturn len(ac.byAddr[addr]) > 0\n}\n\nfunc (ac *accountCache) add(newAccount accounts.Account, update bool) {\n\tac.mu.Lock()\n\tdefer ac.mu.Unlock()\n\n\ti := sort.Search(len(ac.all), func(i int) bool { return ac.all[i].accountByURL.URL.Cmp(newAccount.URL) >= 0 })\n\tif i < len(ac.all) && ac.all[i].accountByURL == newAccount {\n\t\treturn\n\t}\n\t// newAccount is not in the cache.\n\tac.all = append(ac.all, accountByTag{accountByURL: accounts.Account{}})\n\tcopy(ac.all[i+1:], ac.all[i:])\n\tac.all[i] = accountByTag{newAccount, update}\n\tac.byAddr[newAccount.Address] = append(ac.byAddr[newAccount.Address], newAccount)\n}\n\n// note: removed needs to be unique here (i.e. both File and Data must be set).\nfunc (ac *accountCache) delete(removed accounts.Account) {\n\tac.mu.Lock()\n\tdefer ac.mu.Unlock()\n\n\tac.all = removeAccountByTag(ac.all, removed)\n\tif ba := removeAccount(ac.byAddr[removed.Address], removed); len(ba) == 0 {\n\t\tdelete(ac.byAddr, removed.Address)\n\t} else {\n\t\tac.byAddr[removed.Address] = ba\n\t}\n}\n\n// deleteByFile removes an account referenced by the given path.\nfunc (ac *accountCache) deleteByFile(path string) {\n\tac.mu.Lock()\n\tdefer ac.mu.Unlock()\n\ti := sort.Search(len(ac.all), func(i int) bool { return ac.all[i].accountByURL.URL.Path >= path })\n\n\tif i < len(ac.all) && ac.all[i].accountByURL.URL.Path == path {\n\t\tremoved := ac.all[i].accountByURL\n\t\tac.all = append(ac.all[:i], ac.all[i+1:]...)\n\t\tif ba := removeAccount(ac.byAddr[removed.Address], removed); len(ba) == 0 {\n\t\t\tdelete(ac.byAddr, removed.Address)\n\t\t} else {\n\t\t\tac.byAddr[removed.Address] = ba\n\t\t}\n\t}\n}\n\nfunc removeAccount(slice []accounts.Account, elem accounts.Account) []accounts.Account {\n\tfor i := range slice {\n\t\tif slice[i] == elem {\n\t\t\treturn append(slice[:i], slice[i+1:]...)\n\t\t}\n\t}\n\treturn slice\n}\n\nfunc removeAccountByTag(slice []accountByTag, elem accounts.Account) []accountByTag {\n\tfor i := range slice {\n\t\tif slice[i].accountByURL == elem {\n\t\t\treturn append(slice[:i], slice[i+1:]...)\n\t\t}\n\t}\n\treturn slice\n}\n\n// find returns the cached account for address if there is a unique match.\n// The exact matching rules are explained by the documentation of accounts.AccountAddress.\n// Callers must hold ac.mu.\nfunc (ac *accountCache) find(a accounts.Account) (accounts.Account, error) {\n\t// Limit search to address candidates if possible.\n\tmatches := []accounts.Account{}\n\n\tfor _, accT := range ac.all {\n\t\tmatches = append(matches, accT.accountByURL)\n\t}\n\n\tif (a.Address != address.PKAddress{}) {\n\t\tmatches = ac.byAddr[a.Address]\n\t}\n\tif a.URL.Path != \"\" {\n\t\t// If only the basename is specified, complete the path.\n\t\tif !strings.ContainsRune(a.URL.Path, filepath.Separator) {\n\t\t\ta.URL.Path = filepath.Join(ac.keydir, a.URL.Path)\n\t\t}\n\t\tfor i := range matches {\n\t\t\tif matches[i].URL == a.URL {\n\t\t\t\treturn matches[i], nil\n\t\t\t}\n\t\t}\n\t\tif (a.Address == address.PKAddress{}) {\n\t\t\treturn accounts.Account{}, ErrNoMatch\n\t\t}\n\t}\n\tswitch len(matches) {\n\tcase 1:\n\t\treturn matches[0], nil\n\tcase 0:\n\t\treturn accounts.Account{}, ErrNoMatch\n\tdefault:\n\t\terr := &AmbiguousAddrError{Address: a.Address, Matches: make([]accounts.Account, len(matches))}\n\t\tcopy(err.Matches, matches)\n\t\t//sort.Sort(accountsByURL(err.Matches))\n\t\treturn accounts.Account{}, err\n\t}\n}\n\nfunc (ac *accountCache) maybeReload() {\n\tac.mu.Lock()\n\n\tif ac.watcher.running {\n\t\tac.mu.Unlock()\n\t\treturn // A watcher is running and will keep the cache up-to-date.\n\t}\n\tif ac.throttle == nil {\n\t\tac.throttle = time.NewTimer(0)\n\t} else {\n\t\tselect {\n\t\tcase <-ac.throttle.C:\n\t\tdefault:\n\t\t\tac.mu.Unlock()\n\t\t\treturn // The cache was reloaded recently.\n\t\t}\n\t}\n\t// No watcher running, start it.\n\tac.watcher.start()\n\tac.throttle.Reset(minReloadInterval)\n\tac.mu.Unlock()\n\tac.scanAccounts()\n}\n\nfunc (ac *accountCache) close() {\n\tac.mu.Lock()\n\tac.watcher.close()\n\tif ac.throttle != nil {\n\t\tac.throttle.Stop()\n\t}\n\tif ac.notify != nil {\n\t\tclose(ac.notify)\n\t\tac.notify = nil\n\t}\n\tac.mu.Unlock()\n}\n\n// scanAccounts checks if any changes have occurred on the filesystem, and\n// updates the account cache accordingly\nfunc (ac *accountCache) scanAccounts() error {\n\t// Scan the entire folder metadata for file changes\n\tcreates, deletes, updates, err := ac.fileC.scan(ac.keydir)\n\tif err != nil {\n\t\tlog.Debug(\"Failed to reload keystore contents\", \"err\", err)\n\t\treturn err\n\t}\n\tif creates.Cardinality() == 0 && deletes.Cardinality() == 0 && updates.Cardinality() == 0 {\n\t\treturn nil\n\t}\n\t// Create a helper method to scan the contents of the key files\n\tvar (\n\t\tbuf = new(bufio.Reader)\n\t\tkey struct {\n\t\t\tAddress string `json:\"address\"`\n\t\t\tTk      string `json:\"tk\"`\n\t\t\tAt      uint64 `json:\"at\"`\n\t\t\tVersion int    `json:\"version\"`\n\t\t}\n\t)\n\treadAccount := func(path string) *accounts.Account {\n\t\tfd, err := os.Open(path)\n\t\tif err != nil {\n\t\t\tlog.Trace(\"Failed to open keystore file\", \"path\", path, \"err\", err)\n\t\t\treturn nil\n\t\t}\n\t\tdefer fd.Close()\n\t\tbuf.Reset(fd)\n\t\t// Parse the address.\n\t\tkey.Address = \"\"\n\t\tkey.Tk = \"\"\n\t\tkey.At = 0\n\t\tkey.Version = 0\n\t\terr = json.NewDecoder(buf).Decode(&key)\n\t\ttk := address.Base58ToTk(key.Tk)\n\t\tpk, _ := superzk.Tk2Pk(tk.ToTk().NewRef())\n\t\tvar addr address.PKAddress\n\t\tcopy(addr[:], pk[:])\n\t\tat := key.At\n\t\tversion := key.Version\n\t\tif c_superzk.IsSzkTk(tk.ToTk().NewRef()) {\n\t\t\tif version != 2 {\n\t\t\t\terr = errors.New(\"invalid keystore versiong want 2 but find \" + string(version))\n\t\t\t}\n\t\t} else {\n\t\t\tif version != 1 {\n\t\t\t\terr = errors.New(\"invalid keystore versiong want 1 but find \" + string(version))\n\t\t\t}\n\t\t}\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\tlog.Debug(\"Failed to decode keystore key\", \"path\", path, \"err\", err)\n\t\tcase (addr == address.PKAddress{}):\n\t\t\tlog.Debug(\"Failed to decode keystore key\", \"path\", path, \"err\", \"missing or zero address\")\n\t\tdefault:\n\t\t\treturn &accounts.Account{Address: addr, Tk: tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: path}, At: at, Version: version}\n\t\t}\n\t\treturn nil\n\t}\n\t// Process all the file diffs\n\tstart := time.Now()\n\n\tfor _, p := range creates.ToSlice() {\n\t\tif a := readAccount(p.(string)); a != nil {\n\t\t\tac.add(*a, true)\n\t\t}\n\t}\n\n\tfor _, p := range deletes.ToSlice() {\n\t\tac.deleteByFile(p.(string))\n\t}\n\tfor _, p := range updates.ToSlice() {\n\t\tpath := p.(string)\n\t\tac.deleteByFile(path)\n\t\tif a := readAccount(path); a != nil {\n\t\t\tac.add(*a, true)\n\t\t}\n\t}\n\tend := time.Now()\n\n\tselect {\n\tcase ac.notify <- struct{}{}:\n\tdefault:\n\t}\n\tlog.Trace(\"Handled keystore changes\", \"time\", end.Sub(start))\n\treturn nil\n}\n"
  },
  {
    "path": "accounts/keystore/account_cache_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"math/rand\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"sort\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/cespare/cp\"\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n)\n\nvar (\n\tcachetestDir, _   = filepath.Abs(filepath.Join(\"testdata\", \"keystore\"))\n\tcachetestAccounts = []accounts.Account{\n\t\t{\n\t\t\tAddress: address.StringToPk(\"64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP\"),\n\t\t\tTk:      address.Base58ToTk(\"48rGJTGEeQKiFcCi82rbZdvZeyhoJHnVqeDrV627nT4vKTUtYUKJGYmt4dMnRX94RDAtXJV4SEXKyFPH9TdhFxiB\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(cachetestDir, \"UTC--2018-08-11T10-19-38.165083119Z--64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP\")},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"4raP8fYEznZDD9WXc8pvS2tMg992iZiWXssvwhCrXTFEhafcRt8urTeDyANfTrtXpJjnfz65cbYvr7g5WauAJgdc\"),\n\t\t\tTk:      address.Base58ToTk(\"5W5KsFo2di2kzrP2xEjT1iYpx66BoryPJccDRXz4BH5J2MWxKnnWZtmKm7a7BqjheBfi8rKJCqKFPME7hDLuiEJA\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(cachetestDir, \"aaa\")},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"3Fov1AdSTVSTEWTEGfbknRrmHxBCoZ6AktyJA4jGFytHu7xDWEYysnR9YkwkKj5Knzttc6tNw4ENY4JZiirrksYw\"),\n\t\t\tTk:      address.Base58ToTk(\"fLFiBSN8JojjcECipDA4yNafv19BvcFEoP91BVsxRsd1qda9QkBXJM3Car9Y6V9VfYpZULx8dcPUnb2iNFnk4JX\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(cachetestDir, \"zzz\")},\n\t\t},\n\t}\n)\n\nfunc TestWatchNewFile(t *testing.T) {\n\tt.Parallel()\n\n\tdir, ks := tmpKeyStore(t)\n\tdefer os.RemoveAll(dir)\n\n\t// Ensure the watcher is started before adding any files.\n\tks.Accounts()\n\ttime.Sleep(1000 * time.Millisecond)\n\n\t// Move in the files.\n\twantAccounts := make([]accounts.Account, len(cachetestAccounts))\n\tfor i := range cachetestAccounts {\n\t\twantAccounts[i] = accounts.Account{\n\t\t\tAddress: cachetestAccounts[i].Address,\n\t\t\tTk:      cachetestAccounts[i].Tk,\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, filepath.Base(cachetestAccounts[i].URL.Path))},\n\t\t}\n\t\tif err := cp.CopyFile(wantAccounts[i].URL.Path, cachetestAccounts[i].URL.Path); err != nil {\n\t\t\tt.Fatal(err)\n\t\t}\n\t}\n\n\t// ks should see the accounts.\n\tvar list []accounts.Account\n\tfor d := 200 * time.Millisecond; d < 5*time.Second; d *= 2 {\n\t\tlist = ks.Accounts()\n\t\tif reflect.DeepEqual(list, wantAccounts) {\n\t\t\t// ks should have also received change notifications\n\t\t\tselect {\n\t\t\tcase <-ks.changes:\n\t\t\tdefault:\n\t\t\t\tt.Fatalf(\"wasn't notified of new accounts\")\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\ttime.Sleep(d)\n\t}\n\tt.Errorf(\"got %s, want %s\", spew.Sdump(list), spew.Sdump(wantAccounts))\n}\n\nfunc TestWatchNoDir(t *testing.T) {\n\tt.Parallel()\n\n\t// Create ks but not the directory that it watches.\n\trand.Seed(time.Now().UnixNano())\n\tdir := filepath.Join(os.TempDir(), fmt.Sprintf(\"eth-keystore-watch-test-%d-%d\", os.Getpid(), rand.Int()))\n\tks := NewKeyStore(dir, LightScryptN, LightScryptP)\n\n\tlist := ks.Accounts()\n\tif len(list) > 0 {\n\t\tt.Error(\"initial account list not empty:\", list)\n\t}\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Create the directory and copy a key file into it.\n\tos.MkdirAll(dir, 0700)\n\tdefer os.RemoveAll(dir)\n\tfile := filepath.Join(dir, \"aaa\")\n\tif err := cp.CopyFile(file, cachetestAccounts[0].URL.Path); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// ks should see the account.\n\twantAccounts := []accounts.Account{cachetestAccounts[0]}\n\twantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file}\n\tfor d := 200 * time.Millisecond; d < 8*time.Second; d *= 2 {\n\t\tlist = ks.Accounts()\n\t\tif reflect.DeepEqual(list, wantAccounts) {\n\t\t\t// ks should have also received change notifications\n\t\t\tselect {\n\t\t\tcase <-ks.changes:\n\t\t\tdefault:\n\t\t\t\tt.Fatalf(\"wasn't notified of new accounts\")\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\ttime.Sleep(d)\n\t}\n\tt.Errorf(\"\\ngot  %v\\nwant %v\", list, wantAccounts)\n}\n\nfunc TestCacheInitialReload(t *testing.T) {\n\tcache, _ := newAccountCache(cachetestDir)\n\taccounts := cache.accounts()\n\tif !reflect.DeepEqual(accounts, cachetestAccounts) {\n\t\tt.Fatalf(\"got initial accounts: %swant %s\", spew.Sdump(accounts), spew.Sdump(cachetestAccounts))\n\t}\n}\n\nfunc TestCacheAddDeleteOrder(t *testing.T) {\n\tcache, _ := newAccountCache(\"testdata/no-such-dir\")\n\tcache.watcher.running = true // prevent unexpected reloads\n\n\taccs := []accounts.Account{\n\t\t{\n\t\t\tAddress: address.StringToPk(\"oJBdJSCpFRyp5wQeJxwE4AUUQWAqh12Jn3Fo8RvUd1XZuZmyyHGhYVCsTGgLmuXKc2hoZWfj5MkNaf8hTvG8Hec\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: \"-309830980\"},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"29uJ8gWjfgDdF389Y35FDoMbRWXDuTwGEKSEE17MP9xVMCuBMGVgWuofeHqjhGCqxQm3EijZPLdb1vMfSpP8MnNa\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: \"ggg\"},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"5BmSf3Cynp2bcw8TFgUTWQBaD3F8bqqJvuCAu83SM1E1nSFUHCdxgSCnBtqv744DFoLsR61PnhSWWarwK3uF6LJv\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: \"zzzzzz-the-very-last-one.keyXXX\"},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"5BkUvZ9ifZBhGnJdmSKfs7jn1h3EJzCHVjZWbLQgdTJ1i363CcbShy2SHHKWNqHWjKuX19XmjMg9vJLQ7mLQWWmN\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: \"SOMETHING.key\"},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: \"UTC--2018-08-11T10-19-38.165083119Z--64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP\"},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"4raP8fYEznZDD9WXc8pvS2tMg992iZiWXssvwhCrXTFEhafcRt8urTeDyANfTrtXpJjnfz65cbYvr7g5WauAJgdc\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: \"aaa\"},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"3Fov1AdSTVSTEWTEGfbknRrmHxBCoZ6AktyJA4jGFytHu7xDWEYysnR9YkwkKj5Knzttc6tNw4ENY4JZiirrksYw\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: \"zzz\"},\n\t\t},\n\t}\n\tfor _, a := range accs {\n\t\tcache.add(a, false)\n\t}\n\t// Add some of them twice to check that they don't get reinserted.\n\tcache.add(accs[0], false)\n\tcache.add(accs[2], false)\n\n\t// Check that the account list is sorted by filename.\n\twantAccountsByTag := []accountByTag{}\n\tfor _, acc := range accs {\n\t\twantAccountsByTag = append(wantAccountsByTag, accountByTag{acc, false})\n\t}\n\tsort.Sort(accountsByTag(wantAccountsByTag))\n\twantAccounts := []accounts.Account{}\n\tfor _, acc := range wantAccountsByTag {\n\t\twantAccounts = append(wantAccounts, acc.accountByURL)\n\t}\n\tlist := cache.accounts()\n\tif !reflect.DeepEqual(list, wantAccounts) {\n\t\tt.Fatalf(\"got accounts: %s\\nwant %s\", spew.Sdump(accs), spew.Sdump(wantAccounts))\n\t}\n\tfor _, a := range accs {\n\t\tif !cache.hasAddress(a.Address) {\n\t\t\tt.Errorf(\"expected hasAccount(%x) to return true\", a.Address)\n\t\t}\n\t}\n\tif cache.hasAddress(address.StringToPk(\"3kawu8SZ6vzMBde3tP2zuS4XkfTeyjQg2yryDopayXPHVhncz3appEeE8BGp3XBYcfByxBnzoTSp5F8MFVhzxeEB\")) {\n\t\tt.Errorf(\"expected hasAccount(%x) to return false\", address.StringToPk(\"fd9bd350f08ee3c0c19b85a8e16114a11a60aa4e\"))\n\t}\n\n\t// Delete a few keys from the cache.\n\tfor i := 0; i < len(accs); i += 2 {\n\t\tcache.delete(wantAccounts[i])\n\t}\n\tcache.delete(accounts.Account{Address: address.StringToPk(\"3kawu8SZ6vzMBde3tP2zuS4XkfTeyjQg2yryDopayXPHVhncz3appEeE8BGp3XBYcfByxBnzoTSp5F8MFVhzxeEB\"), URL: accounts.URL{Scheme: KeyStoreScheme, Path: \"something\"}})\n\n\t// Check content again after deletion.\n\twantAccountsAfterDelete := []accounts.Account{\n\t\twantAccounts[1],\n\t\twantAccounts[3],\n\t\twantAccounts[5],\n\t}\n\tlist = cache.accounts()\n\tif !reflect.DeepEqual(list, wantAccountsAfterDelete) {\n\t\tt.Fatalf(\"got accounts after delete: %s\\nwant %s\", spew.Sdump(list), spew.Sdump(wantAccountsAfterDelete))\n\t}\n\tfor _, a := range wantAccountsAfterDelete {\n\t\tif !cache.hasAddress(a.Address) {\n\t\t\tt.Errorf(\"expected hasAccount(%x) to return true\", a.Address)\n\t\t}\n\t}\n\tif cache.hasAddress(wantAccounts[0].Address) {\n\t\tt.Errorf(\"expected hasAccount(%x) to return false\", wantAccounts[0].Address)\n\t}\n}\n\nfunc TestCacheFind(t *testing.T) {\n\tdir := filepath.Join(\"testdata\", \"dir\")\n\tcache, _ := newAccountCache(dir)\n\tcache.watcher.running = true // prevent unexpected reloads\n\n\taccs := []accounts.Account{\n\t\t{\n\t\t\tAddress: address.StringToPk(\"36hSFHR4P242YkF2CDJayM8nxqZyH9iTdQLjMgAytyxLWiatqYwHRtXq5pPJ6XM9i1GCBgPVjhW3AHojoY25B6Ks\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, \"a.key\")},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"zwyLoRgtaj5XnpwRGqX6jizWf7yqSL7s8Yiaa2w3nThTjALReKn9orwP83xgoBhfwYH2gdapSokUodiJjHbuUsE\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, \"b.key\")},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"3RG6NiD2ewzo6aAu4sTRTafx92QeoesoS6yEzTsDCShrHvCQ5y4nQJ2zJ5c4kC3HsoJgCG79aJJBLn4EJfVT1yh9\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, \"c.key\")},\n\t\t},\n\t\t{\n\t\t\tAddress: address.StringToPk(\"5FzgDB5GGc6tKPaif531nD61YJ2JaC7kKzAusDPtJCRWGuH97fPojma16qMr2Dpxn7daDaPnJFCXdB4iUUAFV7Cq\"),\n\t\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, \"c2.key\")},\n\t\t},\n\t}\n\tfor _, a := range accs {\n\t\tcache.add(a, false)\n\t}\n\n\tnomatchAccount := accounts.Account{\n\t\tAddress: address.StringToPk(\"bKHV56EP5eJzxPXHunSumEJM8ebQNXpbGgnX3UWSaVsTVx6MMZkGX7pTUmuQXwb4JYsFnvdbZJZkgT6FdEYR3Xh\"),\n\t\tURL:     accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Join(dir, \"something\")},\n\t}\n\ttests := []struct {\n\t\tQuery      accounts.Account\n\t\tWantResult accounts.Account\n\t\tWantError  error\n\t}{\n\t\t// by address\n\t\t{Query: accounts.Account{Address: accs[0].Address}, WantResult: accs[0]},\n\t\t// by file\n\t\t{Query: accounts.Account{URL: accs[0].URL}, WantResult: accs[0]},\n\t\t// by basename\n\t\t{Query: accounts.Account{URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Base(accs[0].URL.Path)}}, WantResult: accs[0]},\n\t\t// by file and address\n\t\t{Query: accs[0], WantResult: accs[0]},\n\t\t// ambiguous address, tie resolved by file\n\t\t{Query: accs[2], WantResult: accs[2]},\n\t\t// ambiguous address error\n\t\t{\n\t\t\tQuery: accounts.Account{Address: accs[2].Address},\n\t\t\tWantError: &AmbiguousAddrError{\n\t\t\t\tAddress: accs[2].Address,\n\t\t\t\tMatches: []accounts.Account{accs[2], accs[3]},\n\t\t\t},\n\t\t},\n\t\t// no match error\n\t\t{Query: nomatchAccount, WantError: ErrNoMatch},\n\t\t{Query: accounts.Account{URL: nomatchAccount.URL}, WantError: ErrNoMatch},\n\t\t{Query: accounts.Account{URL: accounts.URL{Scheme: KeyStoreScheme, Path: filepath.Base(nomatchAccount.URL.Path)}}, WantError: ErrNoMatch},\n\t\t{Query: accounts.Account{Address: nomatchAccount.Address}, WantError: ErrNoMatch},\n\t}\n\tfor i, test := range tests {\n\t\ta, err := cache.find(test.Query)\n\t\tif !reflect.DeepEqual(err, test.WantError) {\n\t\t\tt.Errorf(\"test %d: error mismatch for query %v\\ngot %q\\nwant %q\", i, test.Query, err, test.WantError)\n\t\t\tcontinue\n\t\t}\n\t\tif a != test.WantResult {\n\t\t\tt.Errorf(\"test %d: result mismatch for query %v\\ngot %v\\nwant %v\", i, test.Query, a, test.WantResult)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc waitForAccounts(wantAccounts []accounts.Account, ks *KeyStore) error {\n\tvar list []accounts.Account\n\tfor d := 200 * time.Millisecond; d < 8*time.Second; d *= 2 {\n\t\tlist = ks.Accounts()\n\t\tif reflect.DeepEqual(list, wantAccounts) {\n\t\t\t// ks should have also received change notifications\n\t\t\tselect {\n\t\t\tcase <-ks.changes:\n\t\t\tdefault:\n\t\t\t\treturn fmt.Errorf(\"wasn't notified of new accounts\")\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\ttime.Sleep(d)\n\t}\n\treturn fmt.Errorf(\"\\ngot  %v\\nwant %v\", list, wantAccounts)\n}\n\n// TestUpdatedKeyfileContents tests that updating the contents of a keystore file\n// is noticed by the watcher, and the account cache is updated accordingly\nfunc TestUpdatedKeyfileContents(t *testing.T) {\n\tt.Parallel()\n\n\t// Create a temporary kesytore to test with\n\trand.Seed(time.Now().UnixNano())\n\tdir := filepath.Join(os.TempDir(), fmt.Sprintf(\"eth-keystore-watch-test-%d-%d\", os.Getpid(), rand.Int()))\n\tks := NewKeyStore(dir, LightScryptN, LightScryptP)\n\n\tlist := ks.Accounts()\n\tif len(list) > 0 {\n\t\tt.Error(\"initial account list not empty:\", list)\n\t}\n\ttime.Sleep(100 * time.Millisecond)\n\n\t// Create the directory and copy a key file into it.\n\tos.MkdirAll(dir, 0700)\n\tdefer os.RemoveAll(dir)\n\tfile := filepath.Join(dir, \"aaa\")\n\n\t// Place one of our testfiles in there\n\tif err := cp.CopyFile(file, cachetestAccounts[0].URL.Path); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// ks should see the account.\n\twantAccounts := []accounts.Account{cachetestAccounts[0]}\n\twantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file}\n\tif err := waitForAccounts(wantAccounts, ks); err != nil {\n\t\tt.Error(err)\n\t\treturn\n\t}\n\n\t// needed so that modTime of `file` is different to its current value after forceCopyFile\n\ttime.Sleep(1000 * time.Millisecond)\n\n\t// Now replace file contents\n\tif err := forceCopyFile(file, cachetestAccounts[1].URL.Path); err != nil {\n\t\tt.Fatal(err)\n\t\treturn\n\t}\n\twantAccounts = []accounts.Account{cachetestAccounts[1]}\n\twantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file}\n\tif err := waitForAccounts(wantAccounts, ks); err != nil {\n\t\tt.Errorf(\"First replacement failed\")\n\t\tt.Error(err)\n\t\treturn\n\t}\n\n\t// needed so that modTime of `file` is different to its current value after forceCopyFile\n\ttime.Sleep(1000 * time.Millisecond)\n\n\t// Now replace file contents again\n\tif err := forceCopyFile(file, cachetestAccounts[2].URL.Path); err != nil {\n\t\tt.Fatal(err)\n\t\treturn\n\t}\n\twantAccounts = []accounts.Account{cachetestAccounts[2]}\n\twantAccounts[0].URL = accounts.URL{Scheme: KeyStoreScheme, Path: file}\n\tif err := waitForAccounts(wantAccounts, ks); err != nil {\n\t\tt.Errorf(\"Second replacement failed\")\n\t\tt.Error(err)\n\t\treturn\n\t}\n\n\t// needed so that modTime of `file` is different to its current value after ioutil.WriteFile\n\ttime.Sleep(1000 * time.Millisecond)\n\n\t// Now replace file contents with crap\n\tif err := ioutil.WriteFile(file, []byte(\"foo\"), 0644); err != nil {\n\t\tt.Fatal(err)\n\t\treturn\n\t}\n\tif err := waitForAccounts([]accounts.Account{}, ks); err != nil {\n\t\tt.Errorf(\"Emptying account file failed\")\n\t\tt.Error(err)\n\t\treturn\n\t}\n}\n\n// forceCopyFile is like cp.CopyFile, but doesn't complain if the destination exists.\nfunc forceCopyFile(dst, src string) error {\n\tdata, err := ioutil.ReadFile(src)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ioutil.WriteFile(dst, data, 0644)\n}\n"
  },
  {
    "path": "accounts/keystore/file_cache.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// fileCache is a cache of files seen during scan of keystore.\ntype fileCache struct {\n\tall     mapset.Set // Set of all files from the keystore folder\n\tlastMod time.Time  // Last time instance when a file was modified\n\tmu      sync.RWMutex\n}\n\n// scan performs a new scan on the given directory, compares against the already\n// cached filenames, and returns file sets: creates, deletes, updates.\nfunc (fc *fileCache) scan(keyDir string) (mapset.Set, mapset.Set, mapset.Set, error) {\n\tt0 := time.Now()\n\n\t// List all the failes from the keystore folder\n\tfiles, err := ioutil.ReadDir(keyDir)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tt1 := time.Now()\n\n\tfc.mu.Lock()\n\tdefer fc.mu.Unlock()\n\n\t// Iterate all the files and gather their metadata\n\tall := mapset.NewThreadUnsafeSet()\n\tmods := mapset.NewThreadUnsafeSet()\n\n\tvar newLastMod time.Time\n\tfor _, fi := range files {\n\t\t// Skip any non-key files from the folder\n\t\tpath := filepath.Join(keyDir, fi.Name())\n\t\tif skipKeyFile(fi) {\n\t\t\tlog.Trace(\"Ignoring file on account scan\", \"path\", path)\n\t\t\tcontinue\n\t\t}\n\t\t// Gather the set of all and fresly modified files\n\t\tall.Add(path)\n\n\t\tmodified := fi.ModTime()\n\t\tif modified.After(fc.lastMod) {\n\t\t\tmods.Add(path)\n\t\t}\n\t\tif modified.After(newLastMod) {\n\t\t\tnewLastMod = modified\n\t\t}\n\t}\n\tt2 := time.Now()\n\n\t// Update the tracked files and return the three sets\n\tdeletes := fc.all.Difference(all)   // Deletes = previous - current\n\tcreates := all.Difference(fc.all)   // Creates = current - previous\n\tupdates := mods.Difference(creates) // Updates = modified - creates\n\n\tfc.all, fc.lastMod = all, newLastMod\n\tt3 := time.Now()\n\n\t// Report on the scanning stats and return\n\tlog.Debug(\"FS scan times\", \"list\", t1.Sub(t0), \"set\", t2.Sub(t1), \"diff\", t3.Sub(t2))\n\treturn creates, deletes, updates, nil\n}\n\n// skipKeyFile ignores editor backups, hidden files and folders/symlinks.\nfunc skipKeyFile(fi os.FileInfo) bool {\n\t// Skip editor backups and UNIX-style hidden files.\n\tif strings.HasSuffix(fi.Name(), \"~\") || strings.HasPrefix(fi.Name(), \".\") {\n\t\treturn true\n\t}\n\t// Skip misc special files, directories (yes, symlinks too).\n\tif fi.IsDir() || fi.Mode()&os.ModeType != 0 {\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "accounts/keystore/key.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\tbip39 \"github.com/tyler-smith/go-bip39\"\n\n\t\"github.com/pborman/uuid\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\nconst (\n\tversion = 2\n)\n\ntype Key struct {\n\tId uuid.UUID // Version 4 \"random\" for unique id not derived from key data\n\t// to simplify lookups we also store the address\n\tAddress address.PKAddress\n\n\tTk address.TKAddress\n\t// we only store privkey as pubkey/address can be derived from it\n\t// privkey in this struct is always in plaintext\n\tPrivateKey *ecdsa.PrivateKey\n\n\tAt uint64\n\n\tVersion int\n}\n\ntype keyStore interface {\n\t// Loads and decrypts the key from disk.\n\tGetKey(address address.PKAddress, filename string, auth string) (*Key, error)\n\t// Writes and encrypts the key.\n\tStoreKey(filename string, k *Key, auth string) error\n\t// Joins filename with the key directory unless it is already absolute.\n\tJoinPath(filename string) string\n}\n\ntype encryptedKeyJSONV1 struct {\n\tAddress string     `json:\"address\"`\n\tTk      string     `json:\"tk\"`\n\tCrypto  cryptoJSON `json:\"crypto\"`\n\tId      string     `json:\"id\"`\n\tVersion int        `json:\"version\"`\n\tAt      uint64     `json:\"at\"`\n}\n\ntype cryptoJSON struct {\n\tCipher       string                 `json:\"cipher\"`\n\tCipherText   string                 `json:\"ciphertext\"`\n\tCipherParams cipherparamsJSON       `json:\"cipherparams\"`\n\tKDF          string                 `json:\"kdf\"`\n\tKDFParams    map[string]interface{} `json:\"kdfparams\"`\n\tMAC          string                 `json:\"mac\"`\n}\n\ntype cipherparamsJSON struct {\n\tIV string `json:\"iv\"`\n}\n\nfunc newKeyFromECDSA(privateKeyECDSA *ecdsa.PrivateKey, at uint64, version int) *Key {\n\tid := uuid.NewRandom()\n\ttk := crypto.PrivkeyToTk(privateKeyECDSA, version)\n\tkey := &Key{\n\t\tId:         id,\n\t\tAddress:    tk.ToPk(),\n\t\tTk:         tk,\n\t\tPrivateKey: privateKeyECDSA,\n\t\tAt:         at,\n\t\tVersion:    version,\n\t}\n\treturn key\n}\n\nfunc newKeyFromTk(tk *c_type.Tk, at uint64) *Key {\n\tid := uuid.NewRandom()\n\ttkaddress := address.TKAddress{}\n\tcopy(tkaddress[:], tk[:])\n\tv := 1\n\tif c_superzk.IsSzkTk(tk) {\n\t\tv = 2\n\t}\n\tkey := &Key{\n\t\tId:      id,\n\t\tAddress: tkaddress.ToPk(),\n\t\tTk:      tkaddress,\n\t\tAt:      at,\n\t\tVersion: v,\n\t}\n\treturn key\n}\n\nfunc newKey(rand io.Reader, at uint64, version int) (*Key, error) {\n\tprivateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newKeyFromECDSA(privateKeyECDSA, at, version), nil\n}\n\nfunc storeNewKey(ks keyStore, rand io.Reader, auth string, at uint64, version int) (*Key, accounts.Account, error) {\n\tkey, err := newKey(rand, at, version)\n\tif err != nil {\n\t\treturn nil, accounts.Account{}, err\n\t}\n\ta := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}, At: key.At, Version: version}\n\tif err := ks.StoreKey(a.URL.Path, key, auth); err != nil {\n\t\tzeroKey(key.PrivateKey)\n\t\treturn nil, a, err\n\t}\n\treturn key, a, err\n}\n\nfunc storeNewKeyWithMnemonic(ks keyStore, auth string, at uint64, version int) (string, *Key, accounts.Account, error) {\n\n\tentropy, err := bip39.NewEntropy(256)\n\tif err != nil {\n\t\treturn \"\", nil, accounts.Account{}, err\n\t}\n\n\tmnemonic, err := bip39.NewMnemonic(entropy)\n\tif err != nil {\n\t\treturn \"\", nil, accounts.Account{}, err\n\t}\n\n\t//seed := bip39.NewSeed(mnemonic, \"\")\n\n\tprivateKeyECDSA, err := crypto.ToECDSA(entropy)\n\tif err != nil {\n\t\treturn \"\", nil, accounts.Account{}, err\n\t}\n\n\tkey := newKeyFromECDSA(privateKeyECDSA, at, version)\n\ta := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.JoinPath(keyFileName(key.Address))}, At: key.At, Version: key.Version}\n\tif err := ks.StoreKey(a.URL.Path, key, auth); err != nil {\n\t\tzeroKey(key.PrivateKey)\n\t\treturn \"\", nil, a, err\n\t}\n\tif version == 2 {\n\t\tmnemonic = \"v2 \" + mnemonic\n\t}\n\treturn mnemonic, key, a, err\n}\n\nfunc writeKeyFile(file string, content []byte) error {\n\t// Create the keystore directory with appropriate permissions\n\t// in case it is not present yet.\n\tconst dirPerm = 0700\n\tif err := os.MkdirAll(filepath.Dir(file), dirPerm); err != nil {\n\t\treturn err\n\t}\n\t// Atomic write: create a temporary hidden file first\n\t// then move it into place. TempFile assigns mode 0600.\n\tf, err := ioutil.TempFile(filepath.Dir(file), \".\"+filepath.Base(file)+\".tmp\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err := f.Write(content); err != nil {\n\t\tf.Close()\n\t\tos.Remove(f.Name())\n\t\treturn err\n\t}\n\tf.Close()\n\treturn os.Rename(f.Name(), file)\n}\n\n// keyFileName implements the naming convention for keyfiles:\n// UTC--<created_at UTC ISO8601>-<address hex>\nfunc keyFileName(keyAddr address.PKAddress) string {\n\tts := time.Now().UTC()\n\treturn fmt.Sprintf(\"UTC--%s--%s\", toISO8601(ts), keyAddr.String())\n}\n\nfunc toISO8601(t time.Time) string {\n\tvar tz string\n\tname, offset := t.Zone()\n\tif name == \"UTC\" {\n\t\ttz = \"Z\"\n\t} else {\n\t\ttz = fmt.Sprintf(\"%03d00\", offset/3600)\n\t}\n\treturn fmt.Sprintf(\"%04d-%02d-%02dT%02d-%02d-%02d.%09d%s\", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), tz)\n}\n"
  },
  {
    "path": "accounts/keystore/keystore.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package keystore implements encrypted storage of secp256k1 private keys.\n//\n// Keys are stored as encrypted JSON files according to the Web3 Secret Storage specification.\n// See https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition for more information.\npackage keystore\n\nimport (\n\t\"crypto/ecdsa\"\n\tcrand \"crypto/rand\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/tyler-smith/go-bip39\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/event\"\n)\n\nvar (\n\tErrLocked      = accounts.NewAuthNeededError(\"password or unlock\")\n\tErrNoMatch     = errors.New(\"no key for given address or file\")\n\tErrDecrypt     = errors.New(\"could not decrypt key with given passphrase\")\n\tErrNoStoreType = errors.New(\"could not support kestore type\")\n)\n\n// KeyStoreType is the reflect type of a keystore backend.\nvar KeyStoreType = reflect.TypeOf(&KeyStore{})\n\n// KeyStoreScheme is the protocol scheme prefixing account and wallet URLs.\nconst KeyStoreScheme = \"keystore\"\n\n// Maximum time between wallet refreshes (if filesystem notifications don't work).\nconst walletRefreshCycle = 3 * time.Second\n\n// KeyStore manages a key storage directory on disk.\ntype KeyStore struct {\n\tstorage  keyStore                        // Storage backend, might be cleartext or encrypted\n\tcache    *accountCache                   // In-memory account cache over the filesystem storage\n\tchanges  chan struct{}                   // Channel receiving change notifications from the cache\n\tunlocked map[address.PKAddress]*unlocked // Currently unlocked account (decrypted private keys)\n\n\twallets     []accounts.Wallet       // Wallet wrappers around the individual key files\n\tupdateFeed  event.Feed              // Event feed to notify wallet additions/removals\n\tupdateScope event.SubscriptionScope // Subscription scope tracking current live listeners\n\tupdating    bool                    // Whether the event notification loop is running\n\n\tmu sync.RWMutex\n}\n\ntype unlocked struct {\n\t*Key\n\tabort chan struct{}\n}\n\n// NewKeyStore creates a keystore for the given directory.\nfunc NewKeyStore(keydir string, scryptN, scryptP int) *KeyStore {\n\tkeydir, _ = filepath.Abs(keydir)\n\tks := &KeyStore{storage: &keyStorePassphrase{keydir, scryptN, scryptP}}\n\tks.init(keydir)\n\treturn ks\n}\n\nfunc (ks *KeyStore) init(keydir string) {\n\t// Lock the mutex since the account cache might call back with events\n\tks.mu.Lock()\n\tdefer ks.mu.Unlock()\n\n\t// Initialize the set of unlocked keys and the account cache\n\tks.unlocked = make(map[address.PKAddress]*unlocked)\n\tks.cache, ks.changes = newAccountCache(keydir)\n\n\t// TODO: In order for this finalizer to work, there must be no references\n\t// to ks. addressCache doesn't keep a reference but unlocked keys do,\n\t// so the finalizer will not trigger until all timed unlocks have expired.\n\truntime.SetFinalizer(ks, func(m *KeyStore) {\n\t\tm.cache.close()\n\t})\n\t// Create the initial list of wallets from the cache\n\taccs := ks.cache.accounts()\n\tks.wallets = make([]accounts.Wallet, len(accs))\n\tfor i := 0; i < len(accs); i++ {\n\t\tks.wallets[i] = &keystoreWallet{account: accs[i], keystore: ks}\n\t}\n}\n\n// Wallets implements accounts.Backend, returning all single-key wallets from the\n// keystore directory.\nfunc (ks *KeyStore) Wallets() []accounts.Wallet {\n\t// Make sure the list of wallets is in sync with the account cache\n\tks.refreshWallets()\n\n\tks.mu.RLock()\n\tdefer ks.mu.RUnlock()\n\n\tcpy := make([]accounts.Wallet, len(ks.wallets))\n\tcopy(cpy, ks.wallets)\n\treturn cpy\n}\n\n// refreshWallets retrieves the current account list and based on that does any\n// necessary wallet refreshes.\nfunc (ks *KeyStore) refreshWallets() {\n\t// Retrieve the current list of accounts\n\tks.mu.Lock()\n\taccs := ks.cache.accountsByTag()\n\n\t// Transform the current list of wallets into the new one\n\twallets := make([]accounts.Wallet, 0, len(accs))\n\tevents := []accounts.WalletEvent{}\n\n\tfor _, account := range accs {\n\t\t// Drop wallets while they were in front of the next account\n\t\tfor len(ks.wallets) > 0 && ks.wallets[0].URL().Cmp(account.accountByURL.URL) < 0 {\n\t\t\tevents = append(events, accounts.WalletEvent{Wallet: ks.wallets[0], Kind: accounts.WalletDropped})\n\t\t\tks.wallets = ks.wallets[1:]\n\t\t}\n\t\t// If there are no more wallets or the account is before the next, wrap new wallet\n\t\tif len(ks.wallets) == 0 || ks.wallets[0].URL().Cmp(account.accountByURL.URL) > 0 {\n\t\t\twallet := &keystoreWallet{account: account.accountByURL, keystore: ks}\n\t\t\t//if account.update {\n\t\t\t//log.Info(\"refresWallets improt\", \"account\", account.accountByURL)\n\t\t\t//state1dir := zconfig.State1_file(\"\")\n\t\t\t//err := os.RemoveAll(state1dir)\n\t\t\t//if err != nil {\n\t\t\t//\tlog.Error(\"refresWallets import remvoe\", \"state1dir\", state1dir)\n\n\t\t\t//}\n\t\t\t//}\n\t\t\tevents = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived})\n\t\t\twallets = append(wallets, wallet)\n\t\t\tcontinue\n\t\t}\n\t\t// If the account is the same as the first wallet, keep it\n\t\tif ks.wallets[0].Accounts()[0] == account.accountByURL {\n\t\t\twallets = append(wallets, ks.wallets[0])\n\t\t\tks.wallets = ks.wallets[1:]\n\t\t\tcontinue\n\t\t}\n\t}\n\t// Drop any leftover wallets and set the new batch\n\tfor _, wallet := range ks.wallets {\n\t\tevents = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped})\n\t}\n\tks.wallets = wallets\n\tks.mu.Unlock()\n\n\t// Fire all wallet events and return\n\tfor _, event := range events {\n\t\tks.updateFeed.Send(event)\n\t}\n}\n\n// Subscribe implements accounts.Backend, creating an async subscription to\n// receive notifications on the addition or removal of keystore wallets.\nfunc (ks *KeyStore) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription {\n\t// We need the mutex to reliably start/stop the update loop\n\tks.mu.Lock()\n\tdefer ks.mu.Unlock()\n\n\t// Subscribe the caller and track the subscriber count\n\tsub := ks.updateScope.Track(ks.updateFeed.Subscribe(sink))\n\n\t// Subscribers require an active notification loop, start it\n\tif !ks.updating {\n\t\tks.updating = true\n\t\tgo ks.updater()\n\t}\n\treturn sub\n}\n\n// updater is responsible for maintaining an up-to-date list of wallets stored in\n// the keystore, and for firing wallet addition/removal events. It listens for\n// account change events from the underlying account cache, and also periodically\n// forces a manual refresh (only triggers for systems where the filesystem notifier\n// is not running).\nfunc (ks *KeyStore) updater() {\n\tfor {\n\t\t// Wait for an account update or a refresh timeout\n\t\tselect {\n\t\tcase <-ks.changes:\n\t\tcase <-time.After(walletRefreshCycle):\n\t\t}\n\t\t// Run the wallet refresher\n\t\tks.refreshWallets()\n\n\t\t// If all our subscribers left, stop the updater\n\t\tks.mu.Lock()\n\t\tif ks.updateScope.Count() == 0 {\n\t\t\tks.updating = false\n\t\t\tks.mu.Unlock()\n\t\t\treturn\n\t\t}\n\t\tks.mu.Unlock()\n\t}\n}\n\n// HasAddress reports whether a key with the given address is present.\nfunc (ks *KeyStore) HasAddress(address address.PKAddress) bool {\n\treturn ks.cache.hasAddress(address)\n}\n\n// Accounts returns all key files present in the directory.\nfunc (ks *KeyStore) Accounts() []accounts.Account {\n\treturn ks.cache.accounts()\n}\n\n// Delete deletes the key matched by account if the passphrase is correct.\n// If the account contains no filename, the address must match a unique key.\nfunc (ks *KeyStore) Delete(a accounts.Account, passphrase string) error {\n\t// Decrypting the key isn't really necessary, but we do\n\t// it anyway to check the password and zero out the key\n\t// immediately afterwards.\n\ta, key, err := ks.getDecryptedKey(a, passphrase)\n\tif key != nil {\n\t\tzeroKey(key.PrivateKey)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\t// The order is crucial here. The key is dropped from the\n\t// cache after the file is gone so that a reload happening in\n\t// between won't insert it into the cache again.\n\terr = os.Remove(a.URL.Path)\n\tif err == nil {\n\t\tks.cache.delete(a)\n\t\tks.refreshWallets()\n\t}\n\treturn err\n}\n\n// Unlock unlocks the given account indefinitely.\nfunc (ks *KeyStore) Unlock(a accounts.Account, passphrase string) error {\n\treturn ks.TimedUnlock(a, passphrase, 0)\n}\n\n// Lock removes the private key with the given address from memory.\nfunc (ks *KeyStore) Lock(address address.PKAddress) error {\n\tks.mu.Lock()\n\tif unl, found := ks.unlocked[address]; found {\n\t\tks.mu.Unlock()\n\t\tks.expire(address, unl, time.Duration(0)*time.Nanosecond)\n\t} else {\n\t\tks.mu.Unlock()\n\t}\n\treturn nil\n}\n\n// TimedUnlock unlocks the given account with the passphrase. The account\n// stays unlocked for the duration of timeout. A timeout of 0 unlocks the account\n// until the program exits. The account must match a unique key file.\n//\n// If the account address is already unlocked for a duration, TimedUnlock extends or\n// shortens the active unlock timeout. If the address was previously unlocked\n// indefinitely the timeout is not altered.\nfunc (ks *KeyStore) TimedUnlock(a accounts.Account, passphrase string, timeout time.Duration) error {\n\ta, key, err := ks.getDecryptedKey(a, passphrase)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tks.mu.Lock()\n\tdefer ks.mu.Unlock()\n\tu, found := ks.unlocked[a.Address]\n\tif found {\n\t\tif u.abort == nil {\n\t\t\t// The address was unlocked indefinitely, so unlocking\n\t\t\t// it with a timeout would be confusing.\n\t\t\tzeroKey(key.PrivateKey)\n\t\t\treturn nil\n\t\t}\n\t\t// Terminate the expire goroutine and replace it below.\n\t\tclose(u.abort)\n\t}\n\tif timeout > 0 {\n\t\tu = &unlocked{Key: key, abort: make(chan struct{})}\n\t\tgo ks.expire(a.Address, u, timeout)\n\t} else {\n\t\tu = &unlocked{Key: key}\n\t}\n\tks.unlocked[a.Address] = u\n\treturn nil\n}\n\n// Find resolves the given account into a unique entry in the keystore.\nfunc (ks *KeyStore) Find(a accounts.Account) (accounts.Account, error) {\n\tks.cache.maybeReload()\n\tks.cache.mu.Lock()\n\ta, err := ks.cache.find(a)\n\tks.cache.mu.Unlock()\n\treturn a, err\n}\n\nfunc (ks *KeyStore) getDecryptedKey(a accounts.Account, auth string) (accounts.Account, *Key, error) {\n\ta, err := ks.Find(a)\n\tif err != nil {\n\t\treturn a, nil, err\n\t}\n\tkey, err := ks.storage.GetKey(a.Address, a.URL.Path, auth)\n\treturn a, key, err\n}\n\nfunc (ks *KeyStore) expire(address address.PKAddress, u *unlocked, timeout time.Duration) {\n\tt := time.NewTimer(timeout)\n\tdefer t.Stop()\n\tselect {\n\tcase <-u.abort:\n\t\t// just quit\n\tcase <-t.C:\n\t\tks.mu.Lock()\n\t\t// only drop if it's still the same key instance that dropLater\n\t\t// was launched with. we can check that using pointer equality\n\t\t// because the map stores a new pointer every time the key is\n\t\t// unlocked.\n\t\tif ks.unlocked[address] == u {\n\t\t\tzeroKey(u.PrivateKey)\n\t\t\tdelete(ks.unlocked, address)\n\t\t}\n\t\tks.mu.Unlock()\n\t}\n}\n\n// NewAccount generates a new key and stores it into the key directory,\n// encrypting it with the passphrase.\nfunc (ks *KeyStore) NewAccount(passphrase string, at uint64, version int) (accounts.Account, error) {\n\t_, account, err := storeNewKey(ks.storage, crand.Reader, passphrase, at, version)\n\tif err != nil {\n\t\treturn accounts.Account{}, err\n\t}\n\t// Add the account to the cache immediately rather\n\t// than waiting for file system notifications to pick it up.\n\tks.cache.add(account, false)\n\tks.refreshWallets()\n\treturn account, nil\n}\n\nfunc (ks *KeyStore) NewAccountWithMnemonic(passphrase string, at uint64, version int) (string, accounts.Account, error) {\n\tmnemonic, _, account, err := storeNewKeyWithMnemonic(ks.storage, passphrase, at, version)\n\tif err != nil {\n\t\treturn \"\", accounts.Account{}, err\n\t}\n\t// Add the account to the cache immediately rather\n\t// than waiting for file system notifications to pick it up.\n\tks.cache.add(account, false)\n\tks.refreshWallets()\n\treturn mnemonic, account, nil\n}\n\n// Export exports as a JSON key, encrypted with newPassphrase.\nfunc (ks *KeyStore) Export(a accounts.Account, passphrase, newPassphrase string) (keyJSON []byte, err error) {\n\t_, key, err := ks.getDecryptedKey(a, passphrase)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar N, P int\n\tif store, ok := ks.storage.(*keyStorePassphrase); ok {\n\t\tN, P = store.scryptN, store.scryptP\n\t} else {\n\t\tN, P = StandardScryptN, StandardScryptP\n\t}\n\treturn EncryptKey(key, newPassphrase, N, P)\n}\n\nfunc (ks *KeyStore) ExportMnemonic(a accounts.Account, passphrase string) (string, error) {\n\t_, key, err := ks.getDecryptedKey(a, passphrase)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tprivkey := crypto.FromECDSA(key.PrivateKey)\n\tmnemonic, err := bip39.NewMnemonic(privkey)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif key.Version == 2 {\n\t\tmnemonic = \"v2 \" + mnemonic\n\t}\n\treturn mnemonic, nil\n}\n\nfunc (ks *KeyStore) ExportRewKey(a accounts.Account, passphrase string) ([]byte, error) {\n\t_, key, err := ks.getDecryptedKey(a, passphrase)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tseed := crypto.FromECDSA(key.PrivateKey)\n\treturn seed, nil\n\n}\n\n// Import stores the given encrypted JSON key into the key directory.\nfunc (ks *KeyStore) Import(keyJSON []byte, passphrase, newPassphrase string) (accounts.Account, error) {\n\tkey, err := DecryptKey(keyJSON, passphrase)\n\tif key != nil && key.PrivateKey != nil {\n\t\tdefer zeroKey(key.PrivateKey)\n\t}\n\tif err != nil {\n\t\treturn accounts.Account{}, err\n\t}\n\treturn ks.importKey(key, newPassphrase)\n}\n\n// ImportECDSA stores the given key into the key directory, encrypting it with the passphrase.\nfunc (ks *KeyStore) ImportECDSA(priv *ecdsa.PrivateKey, passphrase string, at uint64, version int) (accounts.Account, error) {\n\tkey := newKeyFromECDSA(priv, at, version)\n\tif ks.cache.hasAddress(key.Address) {\n\t\treturn accounts.Account{}, fmt.Errorf(\"account already exists\")\n\t}\n\treturn ks.importKey(key, passphrase)\n}\n\nfunc (ks *KeyStore) ImportTk(tk c_type.Tk, at uint64) (accounts.Account, error) {\n\tkey := newKeyFromTk(&tk, at)\n\tif ks.cache.hasAddress(key.Address) {\n\t\treturn accounts.Account{}, fmt.Errorf(\"account already exists\")\n\t}\n\ta := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.storage.JoinPath(keyFileName(key.Address))}, At: key.At, Version: key.Version}\n\tif err := ks.storage.StoreKey(a.URL.Path, key, \"\"); err != nil {\n\t\treturn accounts.Account{}, err\n\t}\n\tks.cache.add(a, true)\n\tks.refreshWallets()\n\treturn a, nil\n}\n\nfunc (ks *KeyStore) importKey(key *Key, passphrase string) (accounts.Account, error) {\n\ta := accounts.Account{Address: key.Address, Tk: key.Tk, URL: accounts.URL{Scheme: KeyStoreScheme, Path: ks.storage.JoinPath(keyFileName(key.Address))}, At: key.At, Version: key.Version}\n\tif err := ks.storage.StoreKey(a.URL.Path, key, passphrase); err != nil {\n\t\treturn accounts.Account{}, err\n\t}\n\tks.cache.add(a, true)\n\tks.refreshWallets()\n\treturn a, nil\n}\n\n// Update changes the passphrase of an existing account.\nfunc (ks *KeyStore) Update(a accounts.Account, passphrase, newPassphrase string) error {\n\ta, key, err := ks.getDecryptedKey(a, passphrase)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ks.storage.StoreKey(a.URL.Path, key, newPassphrase)\n}\n\n// zeroKey zeroes a private key in memory.\nfunc zeroKey(k *ecdsa.PrivateKey) {\n\tb := k.D.Bits()\n\tfor i := range b {\n\t\tb[i] = 0\n\t}\n}\n\nfunc (ks *KeyStore) GetSeed(a accounts.Account) (*address.Seed, error) {\n\n\t// Look up the key to sign with and abort if it cannot be found\n\tks.mu.RLock()\n\tdefer ks.mu.RUnlock()\n\n\tunlockedKey, found := ks.unlocked[a.Address]\n\tif !found {\n\t\treturn nil, ErrLocked\n\t}\n\tpriKey := crypto.FromECDSA(unlockedKey.PrivateKey)\n\n\tseed := address.Seed{}\n\tcopy(seed[:], priKey)\n\treturn &seed, nil\n}\n\nfunc (ks *KeyStore) GetSeedWithPassphrase(account accounts.Account, passphrase string) (*address.Seed, error) {\n\t_, key, err := ks.getDecryptedKey(account, passphrase)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer zeroKey(key.PrivateKey)\n\tpriKey := crypto.FromECDSA(key.PrivateKey)\n\tseed := address.Seed{}\n\tcopy(seed[:], priKey)\n\treturn &seed, nil\n}\n"
  },
  {
    "path": "accounts/keystore/keystore_passphrase.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\n\nThis key store behaves as KeyStorePlain with the difference that\nthe private key is encrypted and on disk uses another JSON encoding.\n\nThe crypto is documented at https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition\n\n*/\n\npackage keystore\n\nimport (\n\t\"bytes\"\n\t\"crypto/aes\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"path/filepath\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\n\t\"github.com/pborman/uuid\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"golang.org/x/crypto/pbkdf2\"\n\t\"golang.org/x/crypto/scrypt\"\n)\n\nconst (\n\tkeyHeaderKDF = \"scrypt\"\n\n\t// StandardScryptN is the N parameter of Scrypt encryption algorithm, using 256MB\n\t// memory and taking approximately 1s CPU time on a modern processor.\n\tStandardScryptN = 1 << 18\n\n\t// StandardScryptP is the P parameter of Scrypt encryption algorithm, using 256MB\n\t// memory and taking approximately 1s CPU time on a modern processor.\n\tStandardScryptP = 1\n\n\t// LightScryptN is the N parameter of Scrypt encryption algorithm, using 4MB\n\t// memory and taking approximately 100ms CPU time on a modern processor.\n\tLightScryptN = 1 << 12\n\n\t// LightScryptP is the P parameter of Scrypt encryption algorithm, using 4MB\n\t// memory and taking approximately 100ms CPU time on a modern processor.\n\tLightScryptP = 6\n\n\tscryptR     = 8\n\tscryptDKLen = 32\n\n\tveryLightScryptN = 2\n\tveryLightScryptP = 1\n)\n\ntype keyStorePassphrase struct {\n\tkeysDirPath string\n\tscryptN     int\n\tscryptP     int\n}\n\nfunc (ks keyStorePassphrase) GetKey(address address.PKAddress, filename, auth string) (*Key, error) {\n\t// Load the key from the keystore and decrypt its contents\n\n\tkeyjson, err := ioutil.ReadFile(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tkey, err := DecryptKey(keyjson, auth)\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Make sure we're really operating on the requested key (no swap attacks)\n\tif key.Address != address {\n\t\treturn nil, fmt.Errorf(\"key content mismatch: have account %s, want %s\", key.Address.String(), address.String())\n\t}\n\treturn key, nil\n}\n\n// StoreKey generates a key, encrypts with 'auth' and stores in the given directory\nfunc StoreKey(dir, auth string, scryptN, scryptP int, at uint64) (accounts.Account, error) {\n\t_, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP}, rand.Reader, auth, at, version)\n\treturn a, err\n}\n\nfunc (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error {\n\tkeyjson, err := EncryptKey(key, auth, ks.scryptN, ks.scryptP)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn writeKeyFile(filename, keyjson)\n}\n\nfunc (ks keyStorePassphrase) JoinPath(filename string) string {\n\tif filepath.IsAbs(filename) {\n\t\treturn filename\n\t}\n\treturn filepath.Join(ks.keysDirPath, filename)\n}\n\n// EncryptKey encrypts a key using the specified scrypt parameters into a json\n// blob that can be decrypted later on.\nfunc EncryptKey(key *Key, auth string, scryptN, scryptP int) ([]byte, error) {\n\tvar cryptoStruct cryptoJSON\n\tif key.PrivateKey != nil {\n\t\tauthArray := []byte(auth)\n\n\t\tsalt := make([]byte, 32)\n\t\tif _, err := io.ReadFull(rand.Reader, salt); err != nil {\n\t\t\tpanic(\"reading from crypto/rand failed: \" + err.Error())\n\t\t}\n\t\tderivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptR, scryptP, scryptDKLen)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tencryptKey := derivedKey[:16]\n\t\tkeyBytes := math.PaddedBigBytes(key.PrivateKey.D, 32)\n\n\t\tiv := make([]byte, aes.BlockSize) // 16\n\t\tif _, err := io.ReadFull(rand.Reader, iv); err != nil {\n\t\t\tpanic(\"reading from crypto/rand failed: \" + err.Error())\n\t\t}\n\t\tcipherText, err := aesCTRXOR(encryptKey, keyBytes, iv)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmac := crypto.Keccak256(derivedKey[16:32], cipherText)\n\n\t\tscryptParamsJSON := make(map[string]interface{}, 5)\n\t\tscryptParamsJSON[\"n\"] = scryptN\n\t\tscryptParamsJSON[\"r\"] = scryptR\n\t\tscryptParamsJSON[\"p\"] = scryptP\n\t\tscryptParamsJSON[\"dklen\"] = scryptDKLen\n\t\tscryptParamsJSON[\"salt\"] = hex.EncodeToString(salt)\n\n\t\tcipherParamsJSON := cipherparamsJSON{\n\t\t\tIV: hex.EncodeToString(iv),\n\t\t}\n\n\t\tcryptoStruct = cryptoJSON{\n\t\t\tCipher:       \"aes-128-ctr\",\n\t\t\tCipherText:   hex.EncodeToString(cipherText),\n\t\t\tCipherParams: cipherParamsJSON,\n\t\t\tKDF:          keyHeaderKDF,\n\t\t\tKDFParams:    scryptParamsJSON,\n\t\t\tMAC:          hex.EncodeToString(mac),\n\t\t}\n\t}\n\tencryptedKeyJSONV1 := encryptedKeyJSONV1{\n\t\tAddress: base58.Encode(key.Address[:]),\n\t\tTk:      base58.Encode(key.Tk[:]),\n\t\tCrypto:  cryptoStruct,\n\t\tId:      key.Id.String(),\n\t\tVersion: key.Version,\n\t\tAt:      key.At,\n\t}\n\treturn json.Marshal(encryptedKeyJSONV1)\n}\n\nfunc GetAddress(keyjson []byte) (string, error) {\n\t// Parse the json into a simple map to fetch the key version\n\tm := make(map[string]interface{})\n\tif err := json.Unmarshal(keyjson, &m); err != nil {\n\t\treturn \"\", err\n\t}\n\tk := new(encryptedKeyJSONV1)\n\tif err := json.Unmarshal(keyjson, k); err != nil {\n\t\treturn \"\", err\n\t} else {\n\t\treturn k.Address, nil\n\t}\n}\n\n// DecryptKey decrypts a key from a json blob, returning the private key itself.\nfunc DecryptKey(keyjson []byte, auth string) (*Key, error) {\n\t// Parse the json into a simple map to fetch the key version\n\tm := make(map[string]interface{})\n\tif err := json.Unmarshal(keyjson, &m); err != nil {\n\t\treturn nil, err\n\t}\n\t// Depending on the version try to parse one way or another\n\tvar (\n\t\tkeyBytes, keyId []byte\n\t\terr             error\n\t)\n\n\tk := new(encryptedKeyJSONV1)\n\tif err := json.Unmarshal(keyjson, k); err != nil {\n\t\treturn nil, err\n\t}\n\tkeyBytes, keyId, err = decryptKeyV3(k, auth)\n\n\t// Handle any decryption errors and return the key\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tkey := crypto.ToECDSAUnsafe(keyBytes)\n\ttk := crypto.PrivkeyToTk(key, k.Version)\n\treturn &Key{\n\t\tId:         uuid.UUID(keyId),\n\t\tAddress:    tk.ToPk(),\n\t\tTk:         tk,\n\t\tPrivateKey: key,\n\t\tAt:         k.At,\n\t\tVersion:    k.Version,\n\t}, nil\n}\n\nfunc decryptKeyV3(keyProtected *encryptedKeyJSONV1, auth string) (keyBytes []byte, keyId []byte, err error) {\n\n\tif keyProtected.Crypto.CipherText == \"\" {\n\t\treturn nil, nil, fmt.Errorf(\"has no privatekey for tk:%v\", keyProtected.Tk)\n\t}\n\tif keyProtected.Version > version {\n\t\treturn nil, nil, fmt.Errorf(\"Version not supported: %v\", keyProtected.Version)\n\t}\n\n\tif keyProtected.Crypto.Cipher != \"aes-128-ctr\" {\n\t\treturn nil, nil, fmt.Errorf(\"Cipher not supported: %v\", keyProtected.Crypto.Cipher)\n\t}\n\n\tkeyId = uuid.Parse(keyProtected.Id)\n\tmac, err := hex.DecodeString(keyProtected.Crypto.MAC)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tiv, err := hex.DecodeString(keyProtected.Crypto.CipherParams.IV)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tcipherText, err := hex.DecodeString(keyProtected.Crypto.CipherText)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tderivedKey, err := getKDFKey(keyProtected.Crypto, auth)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tcalculatedMAC := crypto.Keccak256(derivedKey[16:32], cipherText)\n\tif !bytes.Equal(calculatedMAC, mac) {\n\t\treturn nil, nil, ErrDecrypt\n\t}\n\n\tplainText, err := aesCTRXOR(derivedKey[:16], cipherText, iv)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\treturn plainText, keyId, err\n}\n\nfunc getKDFKey(cryptoJSON cryptoJSON, auth string) ([]byte, error) {\n\tauthArray := []byte(auth)\n\tsalt, err := hex.DecodeString(cryptoJSON.KDFParams[\"salt\"].(string))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdkLen := ensureInt(cryptoJSON.KDFParams[\"dklen\"])\n\n\tif cryptoJSON.KDF == keyHeaderKDF {\n\t\tn := ensureInt(cryptoJSON.KDFParams[\"n\"])\n\t\tr := ensureInt(cryptoJSON.KDFParams[\"r\"])\n\t\tp := ensureInt(cryptoJSON.KDFParams[\"p\"])\n\t\treturn scrypt.Key(authArray, salt, n, r, p, dkLen)\n\n\t} else if cryptoJSON.KDF == \"pbkdf2\" {\n\t\tc := ensureInt(cryptoJSON.KDFParams[\"c\"])\n\t\tprf := cryptoJSON.KDFParams[\"prf\"].(string)\n\t\tif prf != \"hmac-sha256\" {\n\t\t\treturn nil, fmt.Errorf(\"Unsupported PBKDF2 PRF: %s\", prf)\n\t\t}\n\t\tkey := pbkdf2.Key(authArray, salt, c, dkLen, sha256.New)\n\t\treturn key, nil\n\t}\n\n\treturn nil, fmt.Errorf(\"Unsupported KDF: %s\", cryptoJSON.KDF)\n}\n\n// TODO: can we do without this when unmarshalling dynamic JSON?\n// why do integers in KDF params end up as float64 and not int after\n// unmarshal?\nfunc ensureInt(x interface{}) int {\n\tres, ok := x.(int)\n\tif !ok {\n\t\tres = int(x.(float64))\n\t}\n\treturn res\n}\n"
  },
  {
    "path": "accounts/keystore/keystore_passphrase_test.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"io/ioutil\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n)\n\n// Tests that a json key file can be decrypted and encrypted in multiple rounds.\nfunc TestKeyEncryptDecrypt(t *testing.T) {\n\tkeyjson, err := ioutil.ReadFile(\"testdata/very-light-scrypt.json\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tpassword := \"\"\n\taddress := address.StringToPk(\"4oGNhAf3JRE1an7TPvKcxpfqHMY7rW6y1fupGcsn8krhWeUEAThkY4QsjHZqqacjMAENDE15tsXmdfsJvdeFVJDA\")\n\n\t// Do a few rounds of decryption and encryption\n\tfor i := 0; i < 3; i++ {\n\t\t// Try a bad password first\n\t\tif _, err := DecryptKey(keyjson, password+\"bad\"); err == nil {\n\t\t\tt.Errorf(\"test %d: json key decrypted with bad password\", i)\n\t\t}\n\t\t// Decrypt with the correct password\n\t\tkey, err := DecryptKey(keyjson, password)\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"test %d: json key failed to decrypt: %v\", i, err)\n\t\t}\n\t\tif key.Address != address {\n\t\t\tt.Errorf(\"test %d: key address mismatch: have %x, want %x\", i, key.Address, address)\n\t\t}\n\t\t// Recrypt with a new password and start over\n\t\tpassword += \"new data appended\"\n\t\tif keyjson, err = EncryptKey(key, password, veryLightScryptN, veryLightScryptP); err != nil {\n\t\t\tt.Errorf(\"test %d: failed to recrypt key %v\", i, err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "accounts/keystore/keystore_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"io/ioutil\"\n\t\"math/rand\"\n\t\"os\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/event\"\n)\n\nfunc TestKeyStore(t *testing.T) {\n\tdir, ks := tmpKeyStore(t)\n\tdefer os.RemoveAll(dir)\n\n\ta, err := ks.NewAccount(\"foo\", 0, 2)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif !strings.HasPrefix(a.URL.Path, dir) {\n\t\tt.Errorf(\"account file %s doesn't have dir prefix\", a.URL)\n\t}\n\tstat, err := os.Stat(a.URL.Path)\n\tif err != nil {\n\t\tt.Fatalf(\"account file %s doesn't exist (%v)\", a.URL, err)\n\t}\n\tif runtime.GOOS != \"windows\" && stat.Mode() != 0600 {\n\t\tt.Fatalf(\"account file has wrong mode: got %o, want %o\", stat.Mode(), 0600)\n\t}\n\tif !ks.HasAddress(a.Address) {\n\t\tt.Errorf(\"HasAccount(%x) should've returned true\", a.Address)\n\t}\n\tif err := ks.Update(a, \"foo\", \"bar\"); err != nil {\n\t\tt.Errorf(\"Update error: %v\", err)\n\t}\n\tif err := ks.Delete(a, \"bar\"); err != nil {\n\t\tt.Errorf(\"Delete error: %v\", err)\n\t}\n\tif common.FileExist(a.URL.Path) {\n\t\tt.Errorf(\"account file %s should be gone after Delete\", a.URL)\n\t}\n\tif ks.HasAddress(a.Address) {\n\t\tt.Errorf(\"HasAccount(%x) should've returned true after Delete\", a.Address)\n\t}\n}\n\nfunc TestTimedUnlock(t *testing.T) {\n\tdir, ks := tmpKeyStore(t)\n\tdefer os.RemoveAll(dir)\n\n\tpass := \"foo\"\n\ta1, err := ks.NewAccount(pass, 0, 2)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Signing without passphrase fails because account is locked\n\t_, err = ks.GetSeed(a1)\n\tif err != ErrLocked {\n\t\tt.Fatal(\"Signing should've failed with ErrLocked before unlocking, got \", err)\n\t}\n\n\t// Signing with passphrase works\n\tif err = ks.TimedUnlock(a1, pass, 100*time.Millisecond); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Signing without passphrase works because account is temp unlocked\n\t_, err = ks.GetSeed(a1)\n\tif err != nil {\n\t\tt.Fatal(\"Signing shouldn't return an error after unlocking, got \", err)\n\t}\n\n\t// Signing fails again after automatic locking\n\ttime.Sleep(250 * time.Millisecond)\n\t_, err = ks.GetSeed(a1)\n\tif err != ErrLocked {\n\t\tt.Fatal(\"Signing should've failed with ErrLocked timeout expired, got \", err)\n\t}\n}\n\nfunc TestOverrideUnlock(t *testing.T) {\n\tdir, ks := tmpKeyStore(t)\n\tdefer os.RemoveAll(dir)\n\n\tpass := \"foo\"\n\ta1, err := ks.NewAccount(pass, 0, 2)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Unlock indefinitely.\n\tif err = ks.TimedUnlock(a1, pass, 5*time.Minute); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Signing without passphrase works because account is temp unlocked\n\t_, err = ks.GetSeed(a1)\n\tif err != nil {\n\t\tt.Fatal(\"Signing shouldn't return an error after unlocking, got \", err)\n\t}\n\n\t// reset unlock to a shorter period, invalidates the previous unlock\n\tif err = ks.TimedUnlock(a1, pass, 100*time.Millisecond); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Signing without passphrase still works because account is temp unlocked\n\t_, err = ks.GetSeed(a1)\n\tif err != nil {\n\t\tt.Fatal(\"Signing shouldn't return an error after unlocking, got \", err)\n\t}\n\n\t// Signing fails again after automatic locking\n\ttime.Sleep(250 * time.Millisecond)\n\t_, err = ks.GetSeed(a1)\n\tif err != ErrLocked {\n\t\tt.Fatal(\"Signing should've failed with ErrLocked timeout expired, got \", err)\n\t}\n}\n\n// Tests that the wallet notifier loop starts and stops correctly based on the\n// addition and removal of wallet event subscriptions.\nfunc TestWalletNotifierLifecycle(t *testing.T) {\n\t// Create a temporary kesytore to test with\n\tdir, ks := tmpKeyStore(t)\n\tdefer os.RemoveAll(dir)\n\n\t// Ensure that the notification updater is not running yet\n\ttime.Sleep(250 * time.Millisecond)\n\tks.mu.RLock()\n\tupdating := ks.updating\n\tks.mu.RUnlock()\n\n\tif updating {\n\t\tt.Errorf(\"wallet notifier running without subscribers\")\n\t}\n\t// Subscribe to the wallet feed and ensure the updater boots up\n\tupdates := make(chan accounts.WalletEvent)\n\n\tsubs := make([]event.Subscription, 2)\n\tfor i := 0; i < len(subs); i++ {\n\t\t// Create a new subscription\n\t\tsubs[i] = ks.Subscribe(updates)\n\n\t\t// Ensure the notifier comes online\n\t\ttime.Sleep(250 * time.Millisecond)\n\t\tks.mu.RLock()\n\t\tupdating = ks.updating\n\t\tks.mu.RUnlock()\n\n\t\tif !updating {\n\t\t\tt.Errorf(\"sub %d: wallet notifier not running after subscription\", i)\n\t\t}\n\t}\n\t// Unsubscribe and ensure the updater terminates eventually\n\tfor i := 0; i < len(subs); i++ {\n\t\t// Close an existing subscription\n\t\tsubs[i].Unsubscribe()\n\n\t\t// Ensure the notifier shuts down at and only at the last close\n\t\tfor k := 0; k < int(walletRefreshCycle/(250*time.Millisecond))+2; k++ {\n\t\t\tks.mu.RLock()\n\t\t\tupdating = ks.updating\n\t\t\tks.mu.RUnlock()\n\n\t\t\tif i < len(subs)-1 && !updating {\n\t\t\t\tt.Fatalf(\"sub %d: event notifier stopped prematurely\", i)\n\t\t\t}\n\t\t\tif i == len(subs)-1 && !updating {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttime.Sleep(250 * time.Millisecond)\n\t\t}\n\t}\n\tt.Errorf(\"wallet notifier didn't terminate after unsubscribe\")\n}\n\ntype walletEvent struct {\n\taccounts.WalletEvent\n\ta accounts.Account\n}\n\n// Tests that wallet notifications and correctly fired when accounts are added\n// or deleted from the keystore.\nfunc TestWalletNotifications(t *testing.T) {\n\tdir, ks := tmpKeyStore(t)\n\tdefer os.RemoveAll(dir)\n\n\t// Subscribe to the wallet feed and collect events.\n\tvar (\n\t\tevents  []walletEvent\n\t\tupdates = make(chan accounts.WalletEvent)\n\t\tsub     = ks.Subscribe(updates)\n\t)\n\tdefer sub.Unsubscribe()\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase ev := <-updates:\n\t\t\t\tevents = append(events, walletEvent{ev, ev.Wallet.Accounts()[0]})\n\t\t\tcase <-sub.Err():\n\t\t\t\tclose(updates)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\t// Randomly add and remove accounts.\n\tvar (\n\t\tlive       = make(map[address.PKAddress]accounts.Account)\n\t\twantEvents []walletEvent\n\t)\n\tfor i := 0; i < 1024; i++ {\n\t\tif create := len(live) == 0 || rand.Int()%4 > 0; create {\n\t\t\t// Add a new account and ensure wallet notifications arrives\n\t\t\taccount, err := ks.NewAccount(\"\", 0, 2)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to create test account: %v\", err)\n\t\t\t}\n\t\t\tlive[account.Address] = account\n\t\t\twantEvents = append(wantEvents, walletEvent{accounts.WalletEvent{Kind: accounts.WalletArrived}, account})\n\t\t} else {\n\t\t\t// Delete a random account.\n\t\t\tvar account accounts.Account\n\t\t\tfor _, a := range live {\n\t\t\t\taccount = a\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif err := ks.Delete(account, \"\"); err != nil {\n\t\t\t\tt.Fatalf(\"failed to delete test account: %v\", err)\n\t\t\t}\n\t\t\tdelete(live, account.Address)\n\t\t\twantEvents = append(wantEvents, walletEvent{accounts.WalletEvent{Kind: accounts.WalletDropped}, account})\n\t\t}\n\t}\n\n\t// Shut down the event collector and check events.\n\tsub.Unsubscribe()\n\t<-updates\n\tcheckAccounts(t, live, ks.Wallets())\n\tcheckEvents(t, wantEvents, events)\n}\n\n// checkAccounts checks that all known live accounts are present in the wallet list.\nfunc checkAccounts(t *testing.T, live map[address.PKAddress]accounts.Account, wallets []accounts.Wallet) {\n\tif len(live) != len(wallets) {\n\t\tt.Errorf(\"wallet list doesn't match required accounts: have %d, want %d\", len(wallets), len(live))\n\t\treturn\n\t}\n\tliveList := make([]accountByTag, 0, len(live))\n\tfor _, account := range live {\n\t\tliveList = append(liveList, accountByTag{account, false})\n\t}\n\tsort.Sort(accountsByTag(liveList))\n\tfor j, wallet := range wallets {\n\t\tif accs := wallet.Accounts(); len(accs) != 1 {\n\t\t\tt.Errorf(\"wallet %d: contains invalid number of accounts: have %d, want 1\", j, len(accs))\n\t\t} else if accs[0] != liveList[j].accountByURL {\n\t\t\tt.Errorf(\"wallet %d: account mismatch: have %v, want %v\", j, accs[0], liveList[j])\n\t\t}\n\t}\n}\n\n// checkEvents checks that all events in 'want' are present in 'have'. Events may be present multiple times.\nfunc checkEvents(t *testing.T, want []walletEvent, have []walletEvent) {\n\tfor _, wantEv := range want {\n\t\tnmatch := 0\n\t\tfor ; len(have) > 0; nmatch++ {\n\t\t\tif have[0].Kind != wantEv.Kind || have[0].a != wantEv.a {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\thave = have[1:]\n\t\t}\n\t\tif nmatch == 0 {\n\t\t\tt.Fatalf(\"can't find event with Kind=%v for %x\", wantEv.Kind, wantEv.a.Address)\n\t\t}\n\t}\n}\n\nfunc tmpKeyStore(t *testing.T) (string, *KeyStore) {\n\td, err := ioutil.TempDir(\"\", \"sero-keystore-test\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tnew := func(kd *string) *KeyStore { return NewKeyStore(*kd, veryLightScryptN, veryLightScryptP) }\n\n\treturn d, new(&d)\n}\n"
  },
  {
    "path": "accounts/keystore/keystore_wallet.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/zero/txs/tx\"\n)\n\n// keystoreWallet implements the accounts.Wallet interface for the original\n// keystore.\ntype keystoreWallet struct {\n\taccount  accounts.Account // Single account contained in this wallet\n\tkeystore *KeyStore        // Keystore where the account originates from\n}\n\n// URL implements accounts.Wallet, returning the URL of the account within.\nfunc (w *keystoreWallet) URL() accounts.URL {\n\treturn w.account.URL\n}\n\n// Status implements accounts.Wallet, returning whether the account held by the\n// keystore wallet is unlocked or not.\nfunc (w *keystoreWallet) Status() (string, error) {\n\tw.keystore.mu.RLock()\n\tdefer w.keystore.mu.RUnlock()\n\n\tif _, ok := w.keystore.unlocked[w.account.Address]; ok {\n\t\treturn \"Unlocked\", nil\n\t}\n\treturn \"Locked\", nil\n}\n\n// Open implements accounts.Wallet, but is a noop for plain wallets since there\n// is no connection or decryption step necessary to access the list of accounts.\nfunc (w *keystoreWallet) Open(passphrase string) error { return nil }\n\n// Close implements accounts.Wallet, but is a noop for plain wallets since is no\n// meaningful open operation.\nfunc (w *keystoreWallet) Close() error { return nil }\n\n// Accounts implements accounts.Wallet, returning an account list consisting of\n// a single account that the plain kestore wallet contains.\nfunc (w *keystoreWallet) Accounts() []accounts.Account {\n\treturn []accounts.Account{w.account}\n}\n\n// Contains implements accounts.Wallet, returning whether a particular account is\n// or is not wrapped by this wallet instance.\nfunc (w *keystoreWallet) Contains(account accounts.Account) bool {\n\treturn account.Address == w.account.Address && (account.URL == (accounts.URL{}) || account.URL == w.account.URL)\n}\n\n// Derive implements accounts.Wallet, but is a noop for plain wallets since there\n// is no notion of hierarchical account derivation for plain keystore accounts.\nfunc (w *keystoreWallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) {\n\treturn accounts.Account{}, accounts.ErrNotSupported\n}\n\n// SelfDerive implements accounts.Wallet, but is a noop for plain wallets since\n// there is no notion of hierarchical account derivation for plain keystore accounts.\nfunc (w *keystoreWallet) SelfDerive(base accounts.DerivationPath, chain sero.ChainStateReader) {}\n\nfunc (w *keystoreWallet) AddressUnlocked(account accounts.Account) (bool, error) {\n\tif account.Address != w.account.Address {\n\t\treturn false, accounts.ErrUnknownAccount\n\t}\n\tif account.URL != (accounts.URL{}) && account.URL != w.account.URL {\n\t\treturn false, accounts.ErrUnknownAccount\n\t}\n\t_, err := w.keystore.GetSeed(account)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc (w *keystoreWallet) EncryptTxWithSeed(seed address.Seed, btx *types.Transaction, txt *tx.T, state *state.StateDB) (tx *types.Transaction, e error) {\n\treturn\n}\n\nfunc (w *keystoreWallet) GetSeed() (*address.Seed, error) {\n\t// Make sure the requested account is contained within\n\tseed, err := w.keystore.GetSeed(w.account)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn seed, nil\n\n}\n\nfunc (w *keystoreWallet) GetSeedWithPassphrase(passphrase string) (*address.Seed, error) {\n\t// Make sure the requested account is contained within\n\tseed, err := w.keystore.GetSeedWithPassphrase(w.account, passphrase)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn seed, nil\n\n}\n\nfunc (w *keystoreWallet) IsMine(pkr c_type.PKr) bool {\n\ttk := w.account.Tk.ToTk()\n\tsucc := superzk.IsMyPKr(&tk, &pkr)\n\treturn succ\n}\n"
  },
  {
    "path": "accounts/keystore/presale.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage keystore\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n)\n\nfunc aesCTRXOR(key, inText, iv []byte) ([]byte, error) {\n\t// AES-128 is selected due to size of encryptKey.\n\taesBlock, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tstream := cipher.NewCTR(aesBlock, iv)\n\toutText := make([]byte, len(inText))\n\tstream.XORKeyStream(outText, inText)\n\treturn outText, err\n}\n"
  },
  {
    "path": "accounts/keystore/testdata/dupes/1",
    "content": "{\"address\":\"f466859ead1932d743d622cb74fc058882e8648a\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d\",\"cipherparams\":{\"iv\":\"dfd9ee70812add5f4b8f89d0811c9158\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":8,\"p\":16,\"r\":8,\"salt\":\"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1\"},\"mac\":\"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9\"},\"id\":\"472e8b3d-afb6-45b5-8111-72c89895099a\",\"version\":3}"
  },
  {
    "path": "accounts/keystore/testdata/dupes/2",
    "content": "{\"address\":\"f466859ead1932d743d622cb74fc058882e8648a\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d\",\"cipherparams\":{\"iv\":\"dfd9ee70812add5f4b8f89d0811c9158\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":8,\"p\":16,\"r\":8,\"salt\":\"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1\"},\"mac\":\"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9\"},\"id\":\"472e8b3d-afb6-45b5-8111-72c89895099a\",\"version\":3}"
  },
  {
    "path": "accounts/keystore/testdata/dupes/foo",
    "content": "{\"address\":\"7ef5a6135f1fd6a02593eedc869c6d41d934aef8\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"1d0839166e7a15b9c1333fc865d69858b22df26815ccf601b28219b6192974e1\",\"cipherparams\":{\"iv\":\"8df6caa7ff1b00c4e871f002cb7921ed\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":8,\"p\":16,\"r\":8,\"salt\":\"e5e6ef3f4ea695f496b643ebd3f75c0aa58ef4070e90c80c5d3fb0241bf1595c\"},\"mac\":\"6d16dfde774845e4585357f24bce530528bc69f4f84e1e22880d34fa45c273e5\"},\"id\":\"950077c7-71e3-4c44-a4a1-143919141ed4\",\"version\":3}"
  },
  {
    "path": "accounts/keystore/testdata/keystore/.hiddenfile",
    "content": "{\"address\":\"f466859ead1932d743d622cb74fc058882e8648a\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d\",\"cipherparams\":{\"iv\":\"dfd9ee70812add5f4b8f89d0811c9158\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":8,\"p\":16,\"r\":8,\"salt\":\"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1\"},\"mac\":\"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9\"},\"id\":\"472e8b3d-afb6-45b5-8111-72c89895099a\",\"version\":3}\n"
  },
  {
    "path": "accounts/keystore/testdata/keystore/README",
    "content": "This directory contains accounts for testing.\nThe passphrase that unlocks them is \"foobar\".\n\nThe \"good\" key files which are supposed to be loadable are:\n\n- File: UTC--2016-03-22T12-57-55.920751759Z--7ef5a6135f1fd6a02593eedc869c6d41d934aef8\n  Address: 0x7ef5a6135f1fd6a02593eedc869c6d41d934aef8\n- File: aaa\n  Address: 0xf466859ead1932d743d622cb74fc058882e8648a\n- File: zzz\n  Address: 0x289d485d9771714cce91d3393d764e1311907acc\n\nThe other files (including this README) are broken in various ways\nand should not be picked up by package accounts:\n\n- File: no-address (missing address field, otherwise same as \"aaa\")\n- File: garbage (file with random data)\n- File: empty (file with no content)\n- File: swapfile~ (should be skipped)\n- File: .hiddenfile (should be skipped)\n- File: foo/... (should be skipped because it is a directory)\n"
  },
  {
    "path": "accounts/keystore/testdata/keystore/UTC--2018-08-11T10-19-38.165083119Z--64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP",
    "content": "{\"address\":\"64t1MPxFp4yzxNJ64zp1NmrTXWsrLuw9DMiMZeujbD2HVAKhjR3zpKnuFVjjAXAp86G2PzSVSsdiMdwp5JPoqxtP\",\"tk\":\"48rGJTGEeQKiFcCi82rbZdvZeyhoJHnVqeDrV627nT4vKTUtYUKJGYmt4dMnRX94RDAtXJV4SEXKyFPH9TdhFxiB\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"2a185b3f860b4bf82abc806cda6133b86d163ffebc172f337ef1f542d0343672\",\"cipherparams\":{\"iv\":\"08ad25c1b4967d4a43026f127dc5b1f8\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"72978babaf8232e480afda30cff820f2da5c4325ed8ab26788a5921654c198a9\"},\"mac\":\"6855124234e99ff66f887b44a43971fdfe9c012aacf44775fd1924aa0b2ac812\"},\"id\":\"73e99dc3-3d60-4e9c-8007-39ed766ab603\",\"version\":1}"
  },
  {
    "path": "accounts/keystore/testdata/keystore/aaa",
    "content": "{\"address\":\"4raP8fYEznZDD9WXc8pvS2tMg992iZiWXssvwhCrXTFEhafcRt8urTeDyANfTrtXpJjnfz65cbYvr7g5WauAJgdc\",\"tk\":\"5W5KsFo2di2kzrP2xEjT1iYpx66BoryPJccDRXz4BH5J2MWxKnnWZtmKm7a7BqjheBfi8rKJCqKFPME7hDLuiEJA\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"18afc118d33d3daf74c895cb64b60401f92acc4d96e2a0354be41a8a949e8ea1\",\"cipherparams\":{\"iv\":\"93ca0ead2de0c06481a2c572c5b00cb9\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"f6b9957dc46d44bc6cbb7ed8479d8d8ac2f825e52c3da6926f03b0d4dc2c59de\"},\"mac\":\"858e3abfcfa15418e9175f66b4423cab0df38976367816fafc1c1c5b7b06ba7e\"},\"id\":\"c64aaefb-6ad3-4037-8e12-fc74a0abc6ef\",\"version\":1}"
  },
  {
    "path": "accounts/keystore/testdata/keystore/empty",
    "content": ""
  },
  {
    "path": "accounts/keystore/testdata/keystore/foo/fd9bd350f08ee3c0c19b85a8e16114a11a60aa4e",
    "content": "{\"address\":\"fd9bd350f08ee3c0c19b85a8e16114a11a60aa4e\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"8124d5134aa4a927c79fd852989e4b5419397566f04b0936a1eb1d168c7c68a5\",\"cipherparams\":{\"iv\":\"e2febe17176414dd2cda28287947eb2f\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":4096,\"p\":6,\"r\":8,\"salt\":\"44b415ede89f3bdd6830390a21b78965f571b347a589d1d943029f016c5e8bd5\"},\"mac\":\"5e149ff25bfd9dd45746a84bb2bcd2f015f2cbca2b6d25c5de8c29617f71fe5b\"},\"id\":\"d6ac5452-2b2c-4d3c-ad80-4bf0327d971c\",\"version\":3}"
  },
  {
    "path": "accounts/keystore/testdata/keystore/no-address",
    "content": "{\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"cb664472deacb41a2e995fa7f96fe29ce744471deb8d146a0e43c7898c9ddd4d\",\"cipherparams\":{\"iv\":\"dfd9ee70812add5f4b8f89d0811c9158\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":8,\"p\":16,\"r\":8,\"salt\":\"0d6769bf016d45c479213990d6a08d938469c4adad8a02ce507b4a4e7b7739f1\"},\"mac\":\"bac9af994b15a45dd39669fc66f9aa8a3b9dd8c22cb16e4d8d7ea089d0f1a1a9\"},\"id\":\"472e8b3d-afb6-45b5-8111-72c89895099a\",\"version\":3}"
  },
  {
    "path": "accounts/keystore/testdata/keystore/zero",
    "content": "{\"address\":\"1111111111111111111111111111111111111111111111111111111111111111\",\"tk\":\"5Q8MbCF5x21sF5RWx83iDdds8gqFgxq8t34EuDBUjS74nMEv3cjZn8Y5bWQmfJ9rfZZT8ZAd9DC6p4GhNk52EbLD\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"aaa3d43ceab1ad4667c50b3d43f8ebd99a7a8921ea8112545632a9aaf2dc189f\",\"cipherparams\":{\"iv\":\"f8b66bde26843b0c7b2ca5222fcf4dc7\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"305bbadc4e8fdc16f1ecf973ce7149ea40fb2489279246f78b5ee7ef83e1204a\"},\"mac\":\"7a7e424eddb5ab4746d4b3a692fe240acac45e73f24432b08ae77dfa166bb3f0\"},\"id\":\"ec96b9f3-c21c-4f6c-b5aa-8497a0f96b11\",\"version\":1}"
  },
  {
    "path": "accounts/keystore/testdata/keystore/zzz",
    "content": "{\"address\":\"3Fov1AdSTVSTEWTEGfbknRrmHxBCoZ6AktyJA4jGFytHu7xDWEYysnR9YkwkKj5Knzttc6tNw4ENY4JZiirrksYw\",\"tk\":\"fLFiBSN8JojjcECipDA4yNafv19BvcFEoP91BVsxRsd1qda9QkBXJM3Car9Y6V9VfYpZULx8dcPUnb2iNFnk4JX\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"6ce4ef73d9769bdd7b146e4a2f20b947e87b832ba97d7621fe1ed1a9ef86b70b\",\"cipherparams\":{\"iv\":\"6a83217a79f5107d939499fc0236f995\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"13ba23c5d11ffcd82efc8b948b3dc617fc8a222624d1a99d92977d17998aee4d\"},\"mac\":\"48d94e4f7cad61b0cca2f87170f47c8cb0469a1011b4234bd8ee45737778355e\"},\"id\":\"ce86a2a4-294d-4275-a9de-7b1a2f04e2cd\",\"version\":1}"
  },
  {
    "path": "accounts/keystore/testdata/v1/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e/cb61d5a9c4896fb9658090b597ef0e7be6f7b67e",
    "content": "{\"address\":\"cb61d5a9c4896fb9658090b597ef0e7be6f7b67e\",\"Crypto\":{\"cipher\":\"aes-128-cbc\",\"ciphertext\":\"6143d3192db8b66eabd693d9c4e414dcfaee52abda451af79ccf474dafb35f1bfc7ea013aa9d2ee35969a1a2e8d752d0\",\"cipherparams\":{\"iv\":\"35337770fc2117994ecdcad026bccff4\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"n\":262144,\"r\":8,\"p\":1,\"dklen\":32,\"salt\":\"9afcddebca541253a2f4053391c673ff9fe23097cd8555d149d929e4ccf1257f\"},\"mac\":\"3f3d5af884b17a100b0b3232c0636c230a54dc2ac8d986227219b0dd89197644\",\"version\":\"1\"},\"id\":\"e25f7c1f-d318-4f29-b62c-687190d4d299\",\"version\":\"1\"}"
  },
  {
    "path": "accounts/keystore/testdata/v1_test_vector.json",
    "content": "{\n    \"test1\": {\n        \"json\": {\n            \"Crypto\": {\n                \"cipher\": \"aes-128-cbc\",\n                \"cipherparams\": {\n                    \"iv\": \"35337770fc2117994ecdcad026bccff4\"\n                },\n                \"ciphertext\": \"6143d3192db8b66eabd693d9c4e414dcfaee52abda451af79ccf474dafb35f1bfc7ea013aa9d2ee35969a1a2e8d752d0\",\n                \"kdf\": \"scrypt\",\n                \"kdfparams\": {\n                    \"dklen\": 32,\n                    \"n\": 262144,\n                    \"p\": 1,\n                    \"r\": 8,\n                    \"salt\": \"9afcddebca541253a2f4053391c673ff9fe23097cd8555d149d929e4ccf1257f\"\n                },\n                \"mac\": \"3f3d5af884b17a100b0b3232c0636c230a54dc2ac8d986227219b0dd89197644\",\n                \"version\": \"1\"\n            },\n            \"address\": \"cb61d5a9c4896fb9658090b597ef0e7be6f7b67e\",\n            \"id\": \"e25f7c1f-d318-4f29-b62c-687190d4d299\",\n            \"version\": \"1\"\n        },\n        \"password\": \"g\",\n        \"priv\": \"d1b1178d3529626a1a93e073f65028370d14c7eb0936eb42abef05db6f37ad7d\"\n    }\n}\n"
  },
  {
    "path": "accounts/keystore/testdata/v3_test_vector.json",
    "content": "{\n    \"wikipage_test_vector_scrypt\": {\n        \"json\": {\n            \"crypto\" : {\n                \"cipher\" : \"aes-128-ctr\",\n                \"cipherparams\" : {\n                    \"iv\" : \"83dbcc02d8ccb40e466191a123791e0e\"\n                },\n                \"ciphertext\" : \"d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c\",\n                \"kdf\" : \"scrypt\",\n                \"kdfparams\" : {\n                    \"dklen\" : 32,\n                    \"n\" : 262144,\n                    \"r\" : 1,\n                    \"p\" : 8,\n                    \"salt\" : \"ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19\"\n                },\n                \"mac\" : \"2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097\"\n            },\n            \"id\" : \"3198bc9c-6672-5ab3-d995-4942343ae5b6\",\n            \"version\" : 3\n        },\n        \"password\": \"testpassword\",\n        \"priv\": \"7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d\"\n    },\n    \"wikipage_test_vector_pbkdf2\": {\n        \"json\": {\n            \"crypto\" : {\n                \"cipher\" : \"aes-128-ctr\",\n                \"cipherparams\" : {\n                    \"iv\" : \"6087dab2f9fdbbfaddc31a909735c1e6\"\n                },\n                \"ciphertext\" : \"5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46\",\n                \"kdf\" : \"pbkdf2\",\n                \"kdfparams\" : {\n                    \"c\" : 262144,\n                    \"dklen\" : 32,\n                    \"prf\" : \"hmac-sha256\",\n                    \"salt\" : \"ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd\"\n                },\n                \"mac\" : \"517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2\"\n            },\n            \"id\" : \"3198bc9c-6672-5ab3-d995-4942343ae5b6\",\n            \"version\" : 3\n        },\n        \"password\": \"testpassword\",\n        \"priv\": \"7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d\"\n    },\n    \"31_byte_key\": {\n        \"json\": {\n            \"crypto\" : {\n                \"cipher\" : \"aes-128-ctr\",\n                \"cipherparams\" : {\n                    \"iv\" : \"e0c41130a323adc1446fc82f724bca2f\"\n                },\n                \"ciphertext\" : \"9517cd5bdbe69076f9bf5057248c6c050141e970efa36ce53692d5d59a3984\",\n                \"kdf\" : \"scrypt\",\n                \"kdfparams\" : {\n                    \"dklen\" : 32,\n                    \"n\" : 2,\n                    \"r\" : 8,\n                    \"p\" : 1,\n                    \"salt\" : \"711f816911c92d649fb4c84b047915679933555030b3552c1212609b38208c63\"\n                },\n                \"mac\" : \"d5e116151c6aa71470e67a7d42c9620c75c4d23229847dcc127794f0732b0db5\"\n            },\n            \"id\" : \"fecfc4ce-e956-48fd-953b-30f8b52ed66c\",\n            \"version\" : 3\n        },\n        \"password\": \"foo\",\n        \"priv\": \"fa7b3db73dc7dfdf8c5fbdb796d741e4488628c41fc4febd9160a866ba0f35\"\n    },\n    \"30_byte_key\": {\n        \"json\": {\n            \"crypto\" : {\n                \"cipher\" : \"aes-128-ctr\",\n                \"cipherparams\" : {\n                    \"iv\" : \"3ca92af36ad7c2cd92454c59cea5ef00\"\n                },\n                \"ciphertext\" : \"108b7d34f3442fc26ab1ab90ca91476ba6bfa8c00975a49ef9051dc675aa\",\n                \"kdf\" : \"scrypt\",\n                \"kdfparams\" : {\n                    \"dklen\" : 32,\n                    \"n\" : 2,\n                    \"r\" : 8,\n                    \"p\" : 1,\n                    \"salt\" : \"d0769e608fb86cda848065642a9c6fa046845c928175662b8e356c77f914cd3b\"\n                },\n                \"mac\" : \"75d0e6759f7b3cefa319c3be41680ab6beea7d8328653474bd06706d4cc67420\"\n            },\n            \"id\" : \"a37e1559-5955-450d-8075-7b8931b392b2\",\n            \"version\" : 3\n        },\n        \"password\": \"foo\",\n        \"priv\": \"81c29e8142bb6a81bef5a92bda7a8328a5c85bb2f9542e76f9b0f94fc018\"\n    }\n}\n"
  },
  {
    "path": "accounts/keystore/testdata/very-light-scrypt.json",
    "content": "{\"address\":\"4oGNhAf3JRE1an7TPvKcxpfqHMY7rW6y1fupGcsn8krhWeUEAThkY4QsjHZqqacjMAENDE15tsXmdfsJvdeFVJDA\",\"tk\":\"2TibsX8aZMjCvLWSWttqNWw5c6pczpZT357EjHVnChgf7XyayKhSuvG6DjwKn7SGJ8vjcXsjWUuRPu4tUqbxi2wE\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"677a530905eb7f83617f6041052abe59d65b7c4f43e98709257a66de604a3bf5\",\"cipherparams\":{\"iv\":\"073c0535e818abae2db3edbb044ac96c\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"e2329fa7a364b5eabd87aae4173efb44fe5aa06cbc4f69f032e992cb38439b4b\"},\"mac\":\"2375d748ef71f178ae55e8aab711af918be8168d688195e9585843af14264a18\"},\"id\":\"b153f3f9-0763-472b-b9b9-b69d4ed94983\",\"version\":1}"
  },
  {
    "path": "accounts/keystore/watch.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build darwin,!ios freebsd linux,!arm64 netbsd solaris\n\npackage keystore\n\nimport (\n\t\"time\"\n\n\t\"github.com/rjeczalik/notify\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\ntype watcher struct {\n\tac       *accountCache\n\tstarting bool\n\trunning  bool\n\tev       chan notify.EventInfo\n\tquit     chan struct{}\n}\n\nfunc newWatcher(ac *accountCache) *watcher {\n\treturn &watcher{\n\t\tac:   ac,\n\t\tev:   make(chan notify.EventInfo, 10),\n\t\tquit: make(chan struct{}),\n\t}\n}\n\n// starts the watcher loop in the background.\n// Start a watcher in the background if that's not already in progress.\n// The caller must hold w.ac.mu.\nfunc (w *watcher) start() {\n\tif w.starting || w.running {\n\t\treturn\n\t}\n\tw.starting = true\n\tgo w.loop()\n}\n\nfunc (w *watcher) close() {\n\tclose(w.quit)\n}\n\nfunc (w *watcher) loop() {\n\tdefer func() {\n\t\tw.ac.mu.Lock()\n\t\tw.running = false\n\t\tw.starting = false\n\t\tw.ac.mu.Unlock()\n\t}()\n\tlogger := log.New(\"path\", w.ac.keydir)\n\n\tif err := notify.Watch(w.ac.keydir, w.ev, notify.All); err != nil {\n\t\tlogger.Trace(\"Failed to watch keystore folder\", \"err\", err)\n\t\treturn\n\t}\n\tdefer notify.Stop(w.ev)\n\tlogger.Trace(\"Started watching keystore folder\")\n\tdefer logger.Trace(\"Stopped watching keystore folder\")\n\n\tw.ac.mu.Lock()\n\tw.running = true\n\tw.ac.mu.Unlock()\n\n\t// Wait for file system events and reload.\n\t// When an event occurs, the reload call is delayed a bit so that\n\t// multiple events arriving quickly only cause a single reload.\n\tvar (\n\t\tdebounceDuration = 500 * time.Millisecond\n\t\trescanTriggered  = false\n\t\tdebounce         = time.NewTimer(0)\n\t)\n\t// Ignore initial trigger\n\tif !debounce.Stop() {\n\t\t<-debounce.C\n\t}\n\tdefer debounce.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-w.quit:\n\t\t\treturn\n\t\tcase <-w.ev:\n\t\t\t// Trigger the scan (with delay), if not already triggered\n\t\t\tif !rescanTriggered {\n\t\t\t\tdebounce.Reset(debounceDuration)\n\t\t\t\trescanTriggered = true\n\t\t\t}\n\t\tcase <-debounce.C:\n\t\t\tw.ac.scanAccounts()\n\t\t\trescanTriggered = false\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "accounts/keystore/watch_fallback.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build ios linux,arm64 windows !darwin,!freebsd,!linux,!netbsd,!solaris\n\n// This is the fallback implementation of directory watching.\n// It is used on unsupported platforms.\n\npackage keystore\n\ntype watcher struct{ running bool }\n\nfunc newWatcher(*accountCache) *watcher { return new(watcher) }\nfunc (*watcher) start()                 {}\nfunc (*watcher) close()                 {}\n"
  },
  {
    "path": "accounts/manager.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage accounts\n\nimport (\n\t\"reflect\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/event\"\n)\n\n// Manager is an overarching account manager that can communicate with various\n// backends for signing transactions.\ntype Manager struct {\n\tbackends map[reflect.Type][]Backend // Index of backends currently registered\n\tupdaters []event.Subscription       // Wallet update subscriptions for all backends\n\tupdates  chan WalletEvent           // Subscription sink for backend wallet changes\n\twallets  []Wallet                   // Cache of all wallets from all registered backends\n\n\tfeed event.Feed // Wallet feed notifying of arrivals/departures\n\n\tquit chan chan error\n\tlock sync.RWMutex\n}\n\n// NewManager creates a generic account manager to sign transaction via various\n// supported backends.\nfunc NewManager(backends ...Backend) *Manager {\n\t// Retrieve the initial list of wallets from the backends and sort by URL\n\tvar wallets []Wallet\n\tfor _, backend := range backends {\n\t\twallets = merge(wallets, backend.Wallets()...)\n\t}\n\t// Subscribe to wallet notifications from all backends\n\tupdates := make(chan WalletEvent, 4*len(backends))\n\n\tsubs := make([]event.Subscription, len(backends))\n\tfor i, backend := range backends {\n\t\tsubs[i] = backend.Subscribe(updates)\n\t}\n\t// Assemble the account manager and return\n\tam := &Manager{\n\t\tbackends: make(map[reflect.Type][]Backend),\n\t\tupdaters: subs,\n\t\tupdates:  updates,\n\t\twallets:  wallets,\n\t\tquit:     make(chan chan error),\n\t}\n\tfor _, backend := range backends {\n\t\tkind := reflect.TypeOf(backend)\n\t\tam.backends[kind] = append(am.backends[kind], backend)\n\t}\n\tgo am.update()\n\n\treturn am\n}\n\n// Close terminates the account manager's internal notification processes.\nfunc (am *Manager) Close() error {\n\terrc := make(chan error)\n\tam.quit <- errc\n\treturn <-errc\n}\n\n// update is the wallet event loop listening for notifications from the backends\n// and updating the cache of wallets.\nfunc (am *Manager) update() {\n\t// Close all subscriptions when the manager terminates\n\tdefer func() {\n\t\tam.lock.Lock()\n\t\tfor _, sub := range am.updaters {\n\t\t\tsub.Unsubscribe()\n\t\t}\n\t\tam.updaters = nil\n\t\tam.lock.Unlock()\n\t}()\n\n\t// Loop until termination\n\tfor {\n\t\tselect {\n\t\tcase event := <-am.updates:\n\t\t\t// Wallet event arrived, update local cache\n\t\t\tam.lock.Lock()\n\t\t\tswitch event.Kind {\n\t\t\tcase WalletArrived:\n\t\t\t\tam.wallets = merge(am.wallets, event.Wallet)\n\t\t\tcase WalletDropped:\n\t\t\t\tam.wallets = drop(am.wallets, event.Wallet)\n\t\t\t}\n\t\t\tam.lock.Unlock()\n\n\t\t\t// Notify any listeners of the event\n\t\t\tam.feed.Send(event)\n\t\tcase errc := <-am.quit:\n\t\t\t// Manager terminating, return\n\t\t\terrc <- nil\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Backends retrieves the backend(s) with the given type from the account manager.\nfunc (am *Manager) Backends(kind reflect.Type) []Backend {\n\treturn am.backends[kind]\n}\n\n// Wallets returns all abi accounts registered under this account manager.\nfunc (am *Manager) Wallets() []Wallet {\n\tam.lock.RLock()\n\tdefer am.lock.RUnlock()\n\n\tcpy := make([]Wallet, len(am.wallets))\n\tcopy(cpy, am.wallets)\n\treturn cpy\n}\n\n// Wallet retrieves the wallet associated with a particular URL.\nfunc (am *Manager) Wallet(url string) (Wallet, error) {\n\tam.lock.RLock()\n\tdefer am.lock.RUnlock()\n\n\tparsed, err := parseURL(url)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, wallet := range am.Wallets() {\n\t\tif wallet.URL() == parsed {\n\t\t\treturn wallet, nil\n\t\t}\n\t}\n\treturn nil, ErrUnknownWallet\n}\n\n// Find attempts to locate the wallet corresponding to a specific account. Since\n// accounts can be dynamically added to and removed from wallets, this method has\n// a linear runtime in the number of wallets.\nfunc (am *Manager) Find(account Account) (Wallet, error) {\n\tam.lock.RLock()\n\tdefer am.lock.RUnlock()\n\n\tfor _, wallet := range am.wallets {\n\t\tif wallet.Contains(account) {\n\t\t\treturn wallet, nil\n\t\t}\n\t}\n\treturn nil, ErrUnknownAccount\n}\n\nfunc (am *Manager) FindAccountByPk(pk c_type.Uint512) (Account, error) {\n\tam.lock.RLock()\n\tdefer am.lock.RUnlock()\n\tfor _, wallet := range am.wallets {\n\t\tif wallet.Accounts()[0].GetPk() == pk {\n\t\t\treturn wallet.Accounts()[0], nil\n\t\t}\n\t}\n\treturn Account{}, ErrUnknownAccount\n}\n\nfunc (am *Manager) FindAccountByPkr(pkr c_type.PKr) (Account, error) {\n\tam.lock.RLock()\n\tdefer am.lock.RUnlock()\n\tfor _, wallet := range am.wallets {\n\t\tif wallet.Accounts()[0].IsMyPkr(pkr) {\n\t\t\treturn wallet.Accounts()[0], nil\n\t\t}\n\t}\n\treturn Account{}, ErrUnknownAccount\n}\n\n// Subscribe creates an async subscription to receive notifications when the\n// manager detects the arrival or departure of a wallet from any of its backends.\nfunc (am *Manager) Subscribe(sink chan<- WalletEvent) event.Subscription {\n\treturn am.feed.Subscribe(sink)\n}\n\n// merge is a sorted analogue of append for wallets, where the ordering of the\n// origin list is preserved by inserting new wallets at the correct position.\n//\n// The original slice is assumed to be already sorted by URL.\nfunc merge(slice []Wallet, wallets ...Wallet) []Wallet {\n\tfor _, wallet := range wallets {\n\t\tn := sort.Search(len(slice), func(i int) bool { return slice[i].URL().Cmp(wallet.URL()) >= 0 })\n\t\tif n == len(slice) {\n\t\t\tslice = append(slice, wallet)\n\t\t\tcontinue\n\t\t}\n\t\tslice = append(slice[:n], append([]Wallet{wallet}, slice[n:]...)...)\n\t}\n\treturn slice\n}\n\n// drop is the couterpart of merge, which looks up wallets from within the sorted\n// cache and removes the ones specified.\nfunc drop(slice []Wallet, wallets ...Wallet) []Wallet {\n\tfor _, wallet := range wallets {\n\t\tn := sort.Search(len(slice), func(i int) bool { return slice[i].URL().Cmp(wallet.URL()) >= 0 })\n\t\tif n == len(slice) {\n\t\t\t// Wallet not found, may happen during startup\n\t\t\tcontinue\n\t\t}\n\t\tslice = append(slice[:n], slice[n+1:]...)\n\t}\n\treturn slice\n}\n"
  },
  {
    "path": "accounts/url.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage accounts\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n)\n\n// URL represents the canonical identification URL of a wallet or account.\n//\n// It is a simplified version of url.URL, with the important limitations (which\n// are considered features here) that it contains value-copyable components only,\n// as well as that it doesn't do any URL encoding/decoding of special characters.\n//\n// The former is important to allow an account to be copied without leaving live\n// references to the original version, whereas the latter is important to ensure\n// one single canonical form opposed to many allowed ones by the RFC 3986 spec.\n//\n// As such, these URLs should not be used outside of the scope of an Sero\n// wallet or account.\ntype URL struct {\n\tScheme string // Protocol scheme to identify a capable account backend\n\tPath   string // Path for the backend to identify a unique entity\n}\n\n// parseURL converts a user supplied URL into the accounts specific structure.\nfunc parseURL(url string) (URL, error) {\n\tparts := strings.Split(url, \"://\")\n\tif len(parts) != 2 || parts[0] == \"\" {\n\t\treturn URL{}, errors.New(\"protocol scheme missing\")\n\t}\n\treturn URL{\n\t\tScheme: parts[0],\n\t\tPath:   parts[1],\n\t}, nil\n}\n\n// String implements the stringer interface.\nfunc (u URL) String() string {\n\tif u.Scheme != \"\" {\n\t\treturn fmt.Sprintf(\"%s://%s\", u.Scheme, u.Path)\n\t}\n\treturn u.Path\n}\n\n// TerminalString implements the log.TerminalStringer interface.\nfunc (u URL) TerminalString() string {\n\turl := u.String()\n\tif len(url) > 32 {\n\t\treturn url[:31] + \"…\"\n\t}\n\treturn url\n}\n\n// MarshalJSON implements the json.Marshaller interface.\nfunc (u URL) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(u.String())\n}\n\n// UnmarshalJSON parses url.\nfunc (u *URL) UnmarshalJSON(input []byte) error {\n\tvar textURL string\n\terr := json.Unmarshal(input, &textURL)\n\tif err != nil {\n\t\treturn err\n\t}\n\turl, err := parseURL(textURL)\n\tif err != nil {\n\t\treturn err\n\t}\n\tu.Scheme = url.Scheme\n\tu.Path = url.Path\n\treturn nil\n}\n\n// Cmp compares x and y and returns:\n//\n//   -1 if x <  y\n//    0 if x == y\n//   +1 if x >  y\n//\nfunc (u URL) Cmp(url URL) int {\n\tif u.Scheme == url.Scheme {\n\t\treturn strings.Compare(u.Path, url.Path)\n\t}\n\treturn strings.Compare(u.Scheme, url.Scheme)\n}\n"
  },
  {
    "path": "accounts/url_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage accounts\n\nimport (\n\t\"testing\"\n)\n\nfunc TestURLParsing(t *testing.T) {\n\turl, err := parseURL(\"https://sero.cash\")\n\tif err != nil {\n\t\tt.Errorf(\"unexpected error: %v\", err)\n\t}\n\tif url.Scheme != \"https\" {\n\t\tt.Errorf(\"expected: %v, got: %v\", \"https\", url.Scheme)\n\t}\n\tif url.Path != \"sero.cash\" {\n\t\tt.Errorf(\"expected: %v, got: %v\", \"sero.cash\", url.Path)\n\t}\n\n\t_, err = parseURL(\"sero.cash\")\n\tif err == nil {\n\t\tt.Error(\"expected err, got: nil\")\n\t}\n}\n\nfunc TestURLString(t *testing.T) {\n\turl := URL{Scheme: \"https\", Path: \"sero.cash\"}\n\tif url.String() != \"https://sero.cash\" {\n\t\tt.Errorf(\"expected: %v, got: %v\", \"https://sero.cash\", url.String())\n\t}\n\n\turl = URL{Scheme: \"\", Path: \"sero.cash\"}\n\tif url.String() != \"sero.cash\" {\n\t\tt.Errorf(\"expected: %v, got: %v\", \"sero.cash\", url.String())\n\t}\n}\n\nfunc TestURLMarshalJSON(t *testing.T) {\n\turl := URL{Scheme: \"https\", Path: \"sero.cash\"}\n\tjson, err := url.MarshalJSON()\n\tif err != nil {\n\t\tt.Errorf(\"unexpcted error: %v\", err)\n\t}\n\tif string(json) != \"\\\"https://sero.cash\\\"\" {\n\t\tt.Errorf(\"expected: %v, got: %v\", \"\\\"https://sero.cash\\\"\", string(json))\n\t}\n}\n\nfunc TestURLUnmarshalJSON(t *testing.T) {\n\turl := &URL{}\n\terr := url.UnmarshalJSON([]byte(\"\\\"https://sero.cash\\\"\"))\n\tif err != nil {\n\t\tt.Errorf(\"unexpcted error: %v\", err)\n\t}\n\tif url.Scheme != \"https\" {\n\t\tt.Errorf(\"expected: %v, got: %v\", \"https\", url.Scheme)\n\t}\n\tif url.Path != \"sero.cash\" {\n\t\tt.Errorf(\"expected: %v, got: %v\", \"https\", url.Path)\n\t}\n}\n\nfunc TestURLComparison(t *testing.T) {\n\ttests := []struct {\n\t\turlA   URL\n\t\turlB   URL\n\t\texpect int\n\t}{\n\t\t{URL{\"https\", \"sero.cash\"}, URL{\"https\", \"sero.cash\"}, 0},\n\t\t{URL{\"http\", \"sero.cash\"}, URL{\"https\", \"sero.cash\"}, -1},\n\t\t{URL{\"https\", \"sero.cash/a\"}, URL{\"https\", \"sero.cash\"}, 1},\n\t\t{URL{\"https\", \"abc.cash\"}, URL{\"https\", \"sero.cash\"}, -1},\n\t}\n\n\tfor i, tt := range tests {\n\t\tresult := tt.urlA.Cmp(tt.urlB)\n\t\tif result != tt.expect {\n\t\t\tt.Errorf(\"test %d: cmp mismatch: expected: %d, got: %d\", i, tt.expect, result)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "appveyor.yml",
    "content": "os: Visual Studio 2015\n\n# Clone directly into GOPATH.\nclone_folder: C:\\gopath\\src\\github.com\\ethereum\\go-ethereum\nclone_depth: 5\nversion: \"{branch}.{build}\"\nenvironment:\n  global:\n    GOPATH: C:\\gopath\n    CC: gcc.exe\n  matrix:\n    - GETH_ARCH: amd64\n      MSYS2_ARCH: x86_64\n      MSYS2_BITS: 64\n      MSYSTEM: MINGW64\n      PATH: C:\\msys64\\mingw64\\bin\\;C:\\Program Files (x86)\\NSIS\\;%PATH%\n    - GETH_ARCH: 386\n      MSYS2_ARCH: i686\n      MSYS2_BITS: 32\n      MSYSTEM: MINGW32\n      PATH: C:\\msys64\\mingw32\\bin\\;C:\\Program Files (x86)\\NSIS\\;%PATH%\n\ninstall:\n  - git submodule update --init\n  - rmdir C:\\go /s /q\n  - appveyor DownloadFile https://storage.googleapis.com/golang/go1.10.3.windows-%GETH_ARCH%.zip\n  - 7z x go1.10.3.windows-%GETH_ARCH%.zip -y -oC:\\ > NUL\n  - go version\n  - gcc --version\n\nbuild_script:\n  - go run build\\ci.go install\n\nafter_build:\n  - go run build\\ci.go archive -type zip -signer WINDOWS_SIGNING_KEY -upload gethstore/builds\n  - go run build\\ci.go nsis -signer WINDOWS_SIGNING_KEY -upload gethstore/builds\n\ntest_script:\n  - set CGO_ENABLED=1\n  - go run build\\ci.go test -coverage\n"
  },
  {
    "path": "build/RPMINSTALL.md",
    "content": "#  go-sero RPM package generate and installation/uninstallation\n\n## centos 7\n\nfrom the cloned resource github/sero-cash/go-sero\ngoto build directory\nrun \n```\n./rpmbuild.sh\n```\n\nit will generate rpm package in github/sero-cash/go-sero/build/package/RPMS\n\n## install with rpm\n```\nrpm -ivh ${rpmfile} --nodeps\n```\n\n\n## check install and env\nexec following command in console\n```\ngero\n```\nit it complains with missing libboost_system ... etc.\nplease ref [installation guide](https://github.com/sero-cash/go-sero/wiki/Building-Sero)\n\nfor centos\n```\nsudo yum --setopt=group_package_types=mandatory,default,optional group install \"Development Tools\"\nsudo yum install boost boost-devel boost-system boost-filesystem boost-thread\n```\nfor ubuntu\n```\nsudo apt-get install -y build-essential golang\nsudo apt-get install libboost-all-dev\n```\n\n## uninstall\nif you met following error:\n\n  install of gero-1.0-1.x86_64 conflicts with file from package gero-1.0-1.x86_64\nor  you want to upgrade gero\nyou need to uninstall previous gero package\n\n```\nsudo dpkg --purge ${packagename}\n```\nor \n```\nsudo rpm -e ${packagename}\n```"
  },
  {
    "path": "build/ci-notes.md",
    "content": "# Debian Packaging\n\nTagged releases and develop branch commits are available as installable Debian packages\nfor Ubuntu. Packages are built for the all Ubuntu versions which are supported by\nCanonical.\n\nPackages of develop branch commits have suffix -unstable and cannot be installed alongside\nthe stable version. Switching between release streams requires user intervention.\n\nThe packages are built and served by launchpad.net. We generate a Debian source package\nfor each distribution and upload it. Their builder picks up the source package, builds it\nand installs the new version into the PPA repository. Launchpad requires a valid signature\nby a team member for source package uploads. The signing key is stored in an environment\nvariable which Travis CI makes available to certain builds.\n\nWe want to build go-sero with the most recent version of Go, irrespective of the Go\nversion that is available in the main Ubuntu repository. In order to make this possible,\nour PPA depends on the ~gophers/ubuntu/archive PPA. Our source package build-depends on\ngolang-1.10, which is co-installable alongside the regular golang package. PPA dependencies\ncan be edited at https://launchpad.net/%7Eethereum/+archive/ubuntu/ethereum/+edit-dependencies\n\n## Building Packages Locally (for testing)\n\nYou need to run Ubuntu to do test packaging.\n\nAdd the gophers PPA and install Go 1.10 and Debian packaging tools:\n\n    $ sudo apt-add-repository ppa:gophers/ubuntu/archive\n    $ sudo apt-get update\n    $ sudo apt-get install build-essential golang-1.10 devscripts debhelper\n\nCreate the source packages:\n\n    $ go run build/ci.go debsrc -workdir dist\n\nThen go into the source package directory for your running distribution and build the package:\n\n    $ cd dist/ethereum-unstable-1.6.0+xenial\n    $ dpkg-buildpackage\n\nBuilt packages are placed in the dist/ directory.\n\n    $ cd ..\n    $ dpkg-deb -c geth-unstable_1.6.0+xenial_amd64.deb\n"
  },
  {
    "path": "build/ci.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build none\n\n/*\nThe ci command is called from Continuous Integration scripts.\n\nUsage: go run build/ci.go <command> <command flags/arguments>\n\nAvailable commands are:\n\n   install    [ -arch architecture ] [ -cc compiler ] [ packages... ]                          -- builds packages and executables\n   test       [ -coverage ] [ packages... ]                                                    -- runs the tests\n   lint                                                                                        -- runs certain pre-selected linters\n   archive    [ -arch architecture ] [ -type zip|tar ] [ -abi key-envvar ] [ -upload dest ] -- archives build artifacts\n   importkeys                                                                                  -- imports signing keys from env\n   debsrc     [ -abi key-id ] [ -upload dest ]                                              -- creates a debian source package\n   nsis                                                                                        -- creates a Windows NSIS installer\n   aar        [ -local ] [ -sign key-id ] [-deploy repo] [ -upload dest ]                      -- creates an Android archive\n   xcode      [ -local ] [ -sign key-id ] [-deploy repo] [ -upload dest ]                      -- creates an iOS XCode framework\n   xgo        [ -alltools ] [ options ]                                                        -- cross builds according to options\n   purge      [ -store blobstore ] [ -days threshold ]                                         -- purges old archives from the blobstore\n\nFor all commands, -n prevents execution of external programs (dry run mode).\n\n*/\npackage main\n\nimport (\n\t\"bufio\"\n\t\"encoding/base64\"\n\t\"flag\"\n\t\"fmt\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/internal/build\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nvar (\n\t// Files that end up in the gero*.zip archive.\n\tgethArchiveFiles = []string{\n\t\t\"COPYING\",\n\t\texecutablePath(\"gero\"),\n\t}\n\n\t// Files that end up in the gero-alltools*.zip archive.\n\tallToolsArchiveFiles = []string{\n\t\t\"COPYING\",\n\t\texecutablePath(\"bootnode\"),\n\t\texecutablePath(\"gero\"),\n\t}\n\n\t// Files that end up in the swarm*.zip archive.\n\tswarmArchiveFiles = []string{\n\t\t\"COPYING\",\n\t\texecutablePath(\"swarm\"),\n\t}\n\n\t// A debian package is created for all executables listed here.\n\tdebExecutables = []debExecutable{\n\t\t{\n\t\t\tBinaryName:  \"bootnode\",\n\t\t\tDescription: \"Sero bootnode.\",\n\t\t},\n\t\t{\n\t\t\tBinaryName:  \"gero\",\n\t\t\tDescription: \"Sero CLI client.\",\n\t\t},\n\t}\n\n\t// A debian package is created for all executables listed here.\n\tdebSwarmExecutables = []debExecutable{\n\t\t{\n\t\t\tBinaryName:  \"swarm\",\n\t\t\tPackageName: \"Sero-swarm\",\n\t\t\tDescription: \"Sero Swarm daemon and tools\",\n\t\t},\n\t}\n\n\tdebSero = debPackage{\n\t\tName:        \"Sero\",\n\t\tVersion:     params.Version,\n\t\tExecutables: debExecutables,\n\t}\n\n\t// Distros for which packages are created.\n\t// Note: vivid is unsupported because there is no golang-1.6 package for it.\n\t// Note: wily is unsupported because it was officially deprecated on lanchpad.\n\t// Note: yakkety is unsupported because it was officially deprecated on lanchpad.\n\t// Note: zesty is unsupported because it was officially deprecated on lanchpad.\n\t// Note: artful is unsupported because it was officially deprecated on lanchpad.\n\tdebDistros = []string{\"trusty\", \"xenial\", \"bionic\", \"cosmic\"}\n)\n\nvar GOBIN, _ = filepath.Abs(filepath.Join(\"build\", \"bin\"))\n\nfunc executablePath(name string) string {\n\tif runtime.GOOS == \"windows\" {\n\t\tname += \".exe\"\n\t}\n\treturn filepath.Join(GOBIN, name)\n}\n\nfunc main() {\n\tlog.SetFlags(log.Lshortfile)\n\n\tif _, err := os.Stat(filepath.Join(\"build\", \"ci.go\")); os.IsNotExist(err) {\n\t\tlog.Fatal(\"this script must be run from the root of the repository\")\n\t}\n\tif len(os.Args) < 2 {\n\t\tlog.Fatal(\"need subcommand as first argument\")\n\t}\n\tswitch os.Args[1] {\n\tcase \"install\":\n\t\tdoInstall(os.Args[2:])\n\tcase \"test\":\n\t\tdoTest(os.Args[2:])\n\tcase \"lint\":\n\t\tdoLint(os.Args[2:])\n\tcase \"archive\":\n\t\tdoArchive(os.Args[2:])\n\tcase \"xcode\":\n\t\tdoXCodeFramework(os.Args[2:])\n\tcase \"xgo\":\n\t\tdoXgo(os.Args[2:])\n\tcase \"purge\":\n\t\tdoPurge(os.Args[2:])\n\tdefault:\n\t\tlog.Fatal(\"unknown command \", os.Args[1])\n\t}\n}\n\n// Compiling\n\nfunc doInstall(cmdline []string) {\n\tvar (\n\t\tarch = flag.String(\"arch\", \"\", \"Architecture to cross build for\")\n\t\tcc   = flag.String(\"cc\", \"\", \"C compiler to cross build with\")\n\t)\n\tflag.CommandLine.Parse(cmdline)\n\tenv := build.Env()\n\n\t// Check Go version. People regularly open issues about compilation\n\t// failure with outdated Go. This should save them the trouble.\n\tif !strings.Contains(runtime.Version(), \"devel\") {\n\t\t// Figure out the minor version number since we can't textually compare (1.10 < 1.9)\n\t\tvar minor int\n\t\tfmt.Sscanf(strings.TrimPrefix(runtime.Version(), \"go1.\"), \"%d\", &minor)\n\n\t\tif minor < 9 {\n\t\t\tlog.Println(\"You have Go version\", runtime.Version())\n\t\t\tlog.Println(\"go-sero requires at least Go version 1.9 and cannot\")\n\t\t\tlog.Println(\"be compiled with an earlier version. Please upgrade your Go installation.\")\n\t\t\tos.Exit(1)\n\t\t}\n\t}\n\t// Compile packages given as arguments, or everything if there are no arguments.\n\tpackages := []string{\"./...\"}\n\tif flag.NArg() > 0 {\n\t\tpackages = flag.Args()\n\t}\n\tpackages = build.ExpandPackagesNoVendor(packages)\n\n\tif *arch == \"\" || *arch == runtime.GOARCH {\n\t\tgoinstall := goTool(\"install\", buildFlags(env)...)\n\t\tgoinstall.Args = append(goinstall.Args, \"-v\")\n\t\tgoinstall.Args = append(goinstall.Args, packages...)\n\t\tbuild.MustRun(goinstall)\n\t\treturn\n\t}\n\t// If we are cross compiling to ARMv5 ARMv6 or ARMv7, clean any previous builds\n\tif *arch == \"arm\" {\n\t\tos.RemoveAll(filepath.Join(runtime.GOROOT(), \"pkg\", runtime.GOOS+\"_arm\"))\n\t\tfor _, path := range filepath.SplitList(build.GOPATH()) {\n\t\t\tos.RemoveAll(filepath.Join(path, \"pkg\", runtime.GOOS+\"_arm\"))\n\t\t}\n\t}\n\t// Seems we are cross compiling, work around forbidden GOBIN\n\tgoinstall := goToolArch(*arch, *cc, \"install\", buildFlags(env)...)\n\tgoinstall.Args = append(goinstall.Args, \"-v\")\n\tgoinstall.Args = append(goinstall.Args, []string{\"-buildmode\", \"archive\"}...)\n\tgoinstall.Args = append(goinstall.Args, packages...)\n\tbuild.MustRun(goinstall)\n\n\tif cmds, err := ioutil.ReadDir(\"cmd\"); err == nil {\n\t\tfor _, cmd := range cmds {\n\t\t\tpkgs, err := parser.ParseDir(token.NewFileSet(), filepath.Join(\".\", \"cmd\", cmd.Name()), nil, parser.PackageClauseOnly)\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t\tfor name := range pkgs {\n\t\t\t\tif name == \"main\" {\n\t\t\t\t\tgobuild := goToolArch(*arch, *cc, \"build\", buildFlags(env)...)\n\t\t\t\t\tgobuild.Args = append(gobuild.Args, \"-v\")\n\t\t\t\t\tgobuild.Args = append(gobuild.Args, []string{\"-o\", executablePath(cmd.Name())}...)\n\t\t\t\t\tgobuild.Args = append(gobuild.Args, \".\"+string(filepath.Separator)+filepath.Join(\"cmd\", cmd.Name()))\n\t\t\t\t\tbuild.MustRun(gobuild)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc buildFlags(env build.Environment) (flags []string) {\n\tvar ld []string\n\tif env.Commit != \"\" {\n\t\tld = append(ld, \"-X\", \"main.gitCommit=\"+env.Commit)\n\t}\n\tif runtime.GOOS == \"darwin\" {\n\t\tld = append(ld, \"-s\")\n\t}\n\n\tif len(ld) > 0 {\n\t\tflags = append(flags, \"-ldflags\", strings.Join(ld, \" \"))\n\t}\n\treturn flags\n}\n\nfunc goTool(subcmd string, args ...string) *exec.Cmd {\n\treturn goToolArch(runtime.GOARCH, os.Getenv(\"CC\"), subcmd, args...)\n}\n\nfunc goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd {\n\tcmd := build.GoTool(subcmd, args...)\n\tcmd.Env = []string{\"GOPATH=\" + build.GOPATH()}\n\tif arch == \"\" || arch == runtime.GOARCH {\n\t\tcmd.Env = append(cmd.Env, \"GOBIN=\"+GOBIN)\n\t} else {\n\t\tcmd.Env = append(cmd.Env, \"CGO_ENABLED=1\")\n\t\tcmd.Env = append(cmd.Env, \"GOARCH=\"+arch)\n\t}\n\tif cc != \"\" {\n\t\tcmd.Env = append(cmd.Env, \"CC=\"+cc)\n\t}\n\tfor _, e := range os.Environ() {\n\t\tif strings.HasPrefix(e, \"GOPATH=\") || strings.HasPrefix(e, \"GOBIN=\") {\n\t\t\tcontinue\n\t\t}\n\t\tcmd.Env = append(cmd.Env, e)\n\t}\n\treturn cmd\n}\n\n// Running The Tests\n//\n// \"tests\" also includes static analysis tools such as vet.\n\nfunc doTest(cmdline []string) {\n\tvar (\n\t\tcoverage = flag.Bool(\"coverage\", false, \"Whether to record code coverage\")\n\t)\n\tflag.CommandLine.Parse(cmdline)\n\tenv := build.Env()\n\n\tpackages := []string{\"./...\"}\n\tif len(flag.CommandLine.Args()) > 0 {\n\t\tpackages = flag.CommandLine.Args()\n\t}\n\tpackages = build.ExpandPackagesNoVendor(packages)\n\n\t// Run analysis tools before the tests.\n\tbuild.MustRun(goTool(\"vet\", packages...))\n\n\t// Run the actual tests.\n\tgotest := goTool(\"test\", buildFlags(env)...)\n\t// Test a single package at a time. CI builders are slow\n\t// and some tests run into timeouts under load.\n\tgotest.Args = append(gotest.Args, \"-p\", \"1\")\n\tif *coverage {\n\t\tgotest.Args = append(gotest.Args, \"-covermode=atomic\", \"-cover\")\n\t}\n\n\tgotest.Args = append(gotest.Args, packages...)\n\tbuild.MustRun(gotest)\n}\n\n// runs gometalinter on requested packages\nfunc doLint(cmdline []string) {\n\tflag.CommandLine.Parse(cmdline)\n\n\tpackages := []string{\"./...\"}\n\tif len(flag.CommandLine.Args()) > 0 {\n\t\tpackages = flag.CommandLine.Args()\n\t}\n\t// Get metalinter and install all supported linters\n\tbuild.MustRun(goTool(\"get\", \"gopkg.in/alecthomas/gometalinter.v2\"))\n\tbuild.MustRunCommand(filepath.Join(GOBIN, \"gometalinter.v2\"), \"--install\")\n\n\t// Run fast linters batched together\n\tconfigs := []string{\n\t\t\"--vendor\",\n\t\t\"--tests\",\n\t\t\"--deadline=2m\",\n\t\t\"--disable-all\",\n\t\t\"--enable=goimports\",\n\t\t\"--enable=varcheck\",\n\t\t\"--enable=vet\",\n\t\t\"--enable=gofmt\",\n\t\t\"--enable=misspell\",\n\t\t\"--enable=goconst\",\n\t\t\"--min-occurrences=6\", // for goconst\n\t}\n\tbuild.MustRunCommand(filepath.Join(GOBIN, \"gometalinter.v2\"), append(configs, packages...)...)\n\n\t// Run slow linters one by one\n\tfor _, linter := range []string{\"unconvert\", \"gosimple\"} {\n\t\tconfigs = []string{\"--vendor\", \"--tests\", \"--deadline=10m\", \"--disable-all\", \"--enable=\" + linter}\n\t\tbuild.MustRunCommand(filepath.Join(GOBIN, \"gometalinter.v2\"), append(configs, packages...)...)\n\t}\n}\n\n// Release Packaging\nfunc doArchive(cmdline []string) {\n\tvar (\n\t\tarch  = flag.String(\"arch\", runtime.GOARCH, \"Architecture cross packaging\")\n\t\tatype = flag.String(\"type\", \"zip\", \"Type of archive to write (zip|tar)\")\n\t\text   string\n\t)\n\tflag.CommandLine.Parse(cmdline)\n\tswitch *atype {\n\tcase \"zip\":\n\t\text = \".zip\"\n\tcase \"tar\":\n\t\text = \".tar.gz\"\n\tdefault:\n\t\tlog.Fatal(\"unknown archive type: \", atype)\n\t}\n\n\tvar (\n\t\tenv = build.Env()\n\n\t\tbasegeth = archiveBasename(*arch, params.ArchiveVersion(env.Commit))\n\t\tgeth     = \"gero-\" + basegeth + ext\n\t\talltools = \"gero-alltools-\" + basegeth + ext\n\t)\n\tmaybeSkipArchive(env)\n\tif err := build.WriteArchive(geth, gethArchiveFiles); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tif err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc archiveBasename(arch string, archiveVersion string) string {\n\tplatform := runtime.GOOS + \"-\" + arch\n\tif arch == \"arm\" {\n\t\tplatform += os.Getenv(\"GOARM\")\n\t}\n\tif arch == \"android\" {\n\t\tplatform = \"android-all\"\n\t}\n\tif arch == \"ios\" {\n\t\tplatform = \"ios-all\"\n\t}\n\treturn platform + \"-\" + archiveVersion\n}\n\nfunc archiveUpload(archive string, blobstore string, signer string) error {\n\t// If signing was requested, generate the signature files\n\tif signer != \"\" {\n\t\tpgpkey, err := base64.StdEncoding.DecodeString(os.Getenv(signer))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid base64 %s\", signer)\n\t\t}\n\t\tif err := build.PGPSignFile(archive, archive+\".asc\", string(pgpkey)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t// If uploading to Azure was requested, push the archive possibly with its signature\n\tif blobstore != \"\" {\n\t\tauth := build.AzureBlobstoreConfig{\n\t\t\tAccount:   strings.Split(blobstore, \"/\")[0],\n\t\t\tToken:     os.Getenv(\"AZURE_BLOBSTORE_TOKEN\"),\n\t\t\tContainer: strings.SplitN(blobstore, \"/\", 2)[1],\n\t\t}\n\t\tif err := build.AzureBlobstoreUpload(archive, filepath.Base(archive), auth); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif signer != \"\" {\n\t\t\tif err := build.AzureBlobstoreUpload(archive+\".asc\", filepath.Base(archive+\".asc\"), auth); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// skips archiving for some build configurations.\nfunc maybeSkipArchive(env build.Environment) {\n\tif env.IsPullRequest {\n\t\tlog.Printf(\"skipping because this is a PR build\")\n\t\tos.Exit(0)\n\t}\n\tif env.IsCronJob {\n\t\tlog.Printf(\"skipping because this is a cron job\")\n\t\tos.Exit(0)\n\t}\n\tif env.Branch != \"master\" && !strings.HasPrefix(env.Tag, \"v1.\") {\n\t\tlog.Printf(\"skipping because branch %q, tag %q is not on the whitelist\", env.Branch, env.Tag)\n\t\tos.Exit(0)\n\t}\n}\n\nfunc makeWorkdir(wdflag string) string {\n\tvar err error\n\tif wdflag != \"\" {\n\t\terr = os.MkdirAll(wdflag, 0744)\n\t} else {\n\t\twdflag, err = ioutil.TempDir(\"\", \"gero-build-\")\n\t}\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\treturn wdflag\n}\n\nfunc isUnstableBuild(env build.Environment) bool {\n\tif env.Tag != \"\" {\n\t\treturn false\n\t}\n\treturn true\n}\n\ntype debPackage struct {\n\tName        string          // the name of the Debian package to produce, e.g. \"ethereum\", or \"ethereum-swarm\"\n\tVersion     string          // the clean version of the debPackage, e.g. 1.8.12 or 0.3.0, without any metadata\n\tExecutables []debExecutable // executables to be included in the package\n}\n\ntype debMetadata struct {\n\tEnv build.Environment\n\n\tPackageName string\n\n\t// go-sero version being built. Note that this\n\t// is not the debian package version. The package version\n\t// is constructed by VersionString.\n\tVersion string\n\n\tAuthor       string // \"name <email>\", also selects signing key\n\tDistro, Time string\n\tExecutables  []debExecutable\n}\n\ntype debExecutable struct {\n\tPackageName string\n\tBinaryName  string\n\tDescription string\n}\n\n// Package returns the name of the package if present, or\n// fallbacks to BinaryName\nfunc (d debExecutable) Package() string {\n\tif d.PackageName != \"\" {\n\t\treturn d.PackageName\n\t}\n\treturn d.BinaryName\n}\n\nfunc newDebMetadata(distro, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata {\n\tif author == \"\" {\n\t\t// No signing key, use default author.\n\t\tauthor = \"Sero Builds <huma@sero.vip>\"\n\t}\n\treturn debMetadata{\n\t\tPackageName: name,\n\t\tEnv:         env,\n\t\tAuthor:      author,\n\t\tDistro:      distro,\n\t\tVersion:     version,\n\t\tTime:        t.Format(time.RFC1123Z),\n\t\tExecutables: exes,\n\t}\n}\n\n// Name returns the name of the metapackage that depends\n// on all executable packages.\nfunc (meta debMetadata) Name() string {\n\tif isUnstableBuild(meta.Env) {\n\t\treturn meta.PackageName + \"-unstable\"\n\t}\n\treturn meta.PackageName\n}\n\n// VersionString returns the debian version of the packages.\nfunc (meta debMetadata) VersionString() string {\n\tvsn := meta.Version\n\tif meta.Env.Buildnum != \"\" {\n\t\tvsn += \"+build\" + meta.Env.Buildnum\n\t}\n\tif meta.Distro != \"\" {\n\t\tvsn += \"+\" + meta.Distro\n\t}\n\treturn vsn\n}\n\n// ExeList returns the list of all executable packages.\nfunc (meta debMetadata) ExeList() string {\n\tnames := make([]string, len(meta.Executables))\n\tfor i, e := range meta.Executables {\n\t\tnames[i] = meta.ExeName(e)\n\t}\n\treturn strings.Join(names, \", \")\n}\n\n// ExeName returns the package name of an executable package.\nfunc (meta debMetadata) ExeName(exe debExecutable) string {\n\tif isUnstableBuild(meta.Env) {\n\t\treturn exe.Package() + \"-unstable\"\n\t}\n\treturn exe.Package()\n}\n\n// ExeConflicts returns the content of the Conflicts field\n// for executable packages.\nfunc (meta debMetadata) ExeConflicts(exe debExecutable) string {\n\tif isUnstableBuild(meta.Env) {\n\t\t// Set up the conflicts list so that the *-unstable packages\n\t\t// cannot be installed alongside the regular version.\n\t\t//\n\t\t// https://www.debian.org/doc/debian-policy/ch-relationships.html\n\t\t// is very explicit about Conflicts: and says that Breaks: should\n\t\t// be preferred and the conflicting files should be handled via\n\t\t// alternates. We might do this eventually but using a conflict is\n\t\t// easier now.\n\t\treturn \"ethereum, \" + exe.Package()\n\t}\n\treturn \"\"\n}\n\nfunc stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) {\n\tpkg := meta.Name() + \"-\" + meta.VersionString()\n\tpkgdir = filepath.Join(tmpdir, pkg)\n\tif err := os.Mkdir(pkgdir, 0755); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Copy the source code.\n\tbuild.MustRunCommand(\"git\", \"checkout-index\", \"-a\", \"--prefix\", pkgdir+string(filepath.Separator))\n\n\t// Put the debian build files in place.\n\tdebian := filepath.Join(pkgdir, \"debian\")\n\tbuild.Render(\"build/deb/\"+meta.PackageName+\"/deb.rules\", filepath.Join(debian, \"rules\"), 0755, meta)\n\tbuild.Render(\"build/deb/\"+meta.PackageName+\"/deb.changelog\", filepath.Join(debian, \"changelog\"), 0644, meta)\n\tbuild.Render(\"build/deb/\"+meta.PackageName+\"/deb.control\", filepath.Join(debian, \"control\"), 0644, meta)\n\tbuild.Render(\"build/deb/\"+meta.PackageName+\"/deb.copyright\", filepath.Join(debian, \"copyright\"), 0644, meta)\n\tbuild.RenderString(\"8\\n\", filepath.Join(debian, \"compat\"), 0644, meta)\n\tbuild.RenderString(\"3.0 (native)\\n\", filepath.Join(debian, \"source/format\"), 0644, meta)\n\tfor _, exe := range meta.Executables {\n\t\tinstall := filepath.Join(debian, meta.ExeName(exe)+\".install\")\n\t\tdocs := filepath.Join(debian, meta.ExeName(exe)+\".docs\")\n\t\tbuild.Render(\"build/deb/\"+meta.PackageName+\"/deb.install\", install, 0644, exe)\n\t\tbuild.Render(\"build/deb/\"+meta.PackageName+\"/deb.docs\", docs, 0644, exe)\n\t}\n\n\treturn pkgdir\n}\n\nfunc gomobileTool(subcmd string, args ...string) *exec.Cmd {\n\tcmd := exec.Command(filepath.Join(GOBIN, \"gomobile\"), subcmd)\n\tcmd.Args = append(cmd.Args, args...)\n\tcmd.Env = []string{\n\t\t\"GOPATH=\" + build.GOPATH(),\n\t\t\"PATH=\" + GOBIN + string(os.PathListSeparator) + os.Getenv(\"PATH\"),\n\t}\n\tfor _, e := range os.Environ() {\n\t\tif strings.HasPrefix(e, \"GOPATH=\") || strings.HasPrefix(e, \"PATH=\") {\n\t\t\tcontinue\n\t\t}\n\t\tcmd.Env = append(cmd.Env, e)\n\t}\n\treturn cmd\n}\n\ntype mavenMetadata struct {\n\tVersion      string\n\tPackage      string\n\tDevelop      bool\n\tContributors []mavenContributor\n}\n\ntype mavenContributor struct {\n\tName  string\n\tEmail string\n}\n\nfunc newMavenMetadata(env build.Environment) mavenMetadata {\n\t// Collect the list of authors from the repo root\n\tcontribs := []mavenContributor{}\n\tif authors, err := os.Open(\"AUTHORS\"); err == nil {\n\t\tdefer authors.Close()\n\n\t\tscanner := bufio.NewScanner(authors)\n\t\tfor scanner.Scan() {\n\t\t\t// Skip any whitespace from the authors list\n\t\t\tline := strings.TrimSpace(scanner.Text())\n\t\t\tif line == \"\" || line[0] == '#' {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Split the author and insert as a contributor\n\t\t\tre := regexp.MustCompile(\"([^<]+) <(.+)>\")\n\t\t\tparts := re.FindStringSubmatch(line)\n\t\t\tif len(parts) == 3 {\n\t\t\t\tcontribs = append(contribs, mavenContributor{Name: parts[1], Email: parts[2]})\n\t\t\t}\n\t\t}\n\t}\n\t// Render the version and package strings\n\tversion := params.Version\n\tif isUnstableBuild(env) {\n\t\tversion += \"-SNAPSHOT\"\n\t}\n\treturn mavenMetadata{\n\t\tVersion:      version,\n\t\tPackage:      \"gero-\" + version,\n\t\tDevelop:      isUnstableBuild(env),\n\t\tContributors: contribs,\n\t}\n}\n\n// XCode frameworks\n\nfunc doXCodeFramework(cmdline []string) {\n\tvar (\n\t\tlocal  = flag.Bool(\"local\", false, `Flag whether we're only doing a local build (skip Maven artifacts)`)\n\t\tsigner = flag.String(\"abi\", \"\", `Environment variable holding the signing key (e.g. IOS_SIGNING_KEY)`)\n\t\tdeploy = flag.String(\"deploy\", \"\", `Destination to deploy the archive (usually \"trunk\")`)\n\t\tupload = flag.String(\"upload\", \"\", `Destination to upload the archives (usually \"gethstore/builds\")`)\n\t)\n\tflag.CommandLine.Parse(cmdline)\n\tenv := build.Env()\n\n\t// Build the iOS XCode framework\n\tbuild.MustRun(goTool(\"get\", \"golang.org/x/mobile/cmd/gomobile\", \"golang.org/x/mobile/cmd/gobind\"))\n\tbuild.MustRun(gomobileTool(\"init\"))\n\tbind := gomobileTool(\"bind\", \"-ldflags\", \"-s -w\", \"--target\", \"ios\", \"--tags\", \"ios\", \"-v\", \"github.com/sero-cash/go-sero/mobile\")\n\n\tif *local {\n\t\t// If we're building locally, use the build folder and stop afterwards\n\t\tbind.Dir, _ = filepath.Abs(GOBIN)\n\t\tbuild.MustRun(bind)\n\t\treturn\n\t}\n\tarchive := \"gero-\" + archiveBasename(\"ios\", params.ArchiveVersion(env.Commit))\n\tif err := os.Mkdir(archive, os.ModePerm); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tbind.Dir, _ = filepath.Abs(archive)\n\tbuild.MustRun(bind)\n\tbuild.MustRunCommand(\"tar\", \"-zcvf\", archive+\".tar.gz\", archive)\n\n\t// Skip CocoaPods deploy and Azure upload for PR builds\n\tmaybeSkipArchive(env)\n\n\t// Sign and upload the framework to Azure\n\tif err := archiveUpload(archive+\".tar.gz\", *upload, *signer); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t// Prepare and upload a PodSpec to CocoaPods\n\tif *deploy != \"\" {\n\t\tmeta := newPodMetadata(env, archive)\n\t\tbuild.Render(\"build/pod.podspec\", \"Geth.podspec\", 0755, meta)\n\t\tbuild.MustRunCommand(\"pod\", *deploy, \"push\", \"Geth.podspec\", \"--allow-warnings\", \"--verbose\")\n\t}\n}\n\ntype podMetadata struct {\n\tVersion      string\n\tCommit       string\n\tArchive      string\n\tContributors []podContributor\n}\n\ntype podContributor struct {\n\tName  string\n\tEmail string\n}\n\nfunc newPodMetadata(env build.Environment, archive string) podMetadata {\n\t// Collect the list of authors from the repo root\n\tcontribs := []podContributor{}\n\tif authors, err := os.Open(\"AUTHORS\"); err == nil {\n\t\tdefer authors.Close()\n\n\t\tscanner := bufio.NewScanner(authors)\n\t\tfor scanner.Scan() {\n\t\t\t// Skip any whitespace from the authors list\n\t\t\tline := strings.TrimSpace(scanner.Text())\n\t\t\tif line == \"\" || line[0] == '#' {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Split the author and insert as a contributor\n\t\t\tre := regexp.MustCompile(\"([^<]+) <(.+)>\")\n\t\t\tparts := re.FindStringSubmatch(line)\n\t\t\tif len(parts) == 3 {\n\t\t\t\tcontribs = append(contribs, podContributor{Name: parts[1], Email: parts[2]})\n\t\t\t}\n\t\t}\n\t}\n\tversion := params.Version\n\tif isUnstableBuild(env) {\n\t\tversion += \"-unstable.\" + env.Buildnum\n\t}\n\treturn podMetadata{\n\t\tArchive:      archive,\n\t\tVersion:      version,\n\t\tCommit:       env.Commit,\n\t\tContributors: contribs,\n\t}\n}\n\n// Cross compilation\n\nfunc doXgo(cmdline []string) {\n\tvar (\n\t\talltools = flag.Bool(\"alltools\", false, `Flag whether we're building all known tools, or only on in particular`)\n\t)\n\tflag.CommandLine.Parse(cmdline)\n\tenv := build.Env()\n\n\t// Make sure xgo is available for cross compilation\n\tgogetxgo := goTool(\"get\", \"github.com/karalabe/xgo\")\n\tbuild.MustRun(gogetxgo)\n\n\t// If all tools building is requested, build everything the builder wants\n\targs := append(buildFlags(env), flag.Args()...)\n\n\tif *alltools {\n\t\targs = append(args, []string{\"--dest\", GOBIN}...)\n\t\tfor _, res := range allToolsArchiveFiles {\n\t\t\tif strings.HasPrefix(res, GOBIN) {\n\t\t\t\t// Binary tool found, cross build it explicitly\n\t\t\t\targs = append(args, \"./\"+filepath.Join(\"cmd\", filepath.Base(res)))\n\t\t\t\txgo := xgoTool(args)\n\t\t\t\tbuild.MustRun(xgo)\n\t\t\t\targs = args[:len(args)-1]\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\t// Otherwise xxecute the explicit cross compilation\n\tpath := args[len(args)-1]\n\targs = append(args[:len(args)-1], []string{\"--dest\", GOBIN, path}...)\n\n\txgo := xgoTool(args)\n\tbuild.MustRun(xgo)\n}\n\nfunc xgoTool(args []string) *exec.Cmd {\n\tcmd := exec.Command(filepath.Join(GOBIN, \"xgo\"), args...)\n\tcmd.Env = []string{\n\t\t\"GOPATH=\" + build.GOPATH(),\n\t\t\"GOBIN=\" + GOBIN,\n\t}\n\tfor _, e := range os.Environ() {\n\t\tif strings.HasPrefix(e, \"GOPATH=\") || strings.HasPrefix(e, \"GOBIN=\") {\n\t\t\tcontinue\n\t\t}\n\t\tcmd.Env = append(cmd.Env, e)\n\t}\n\treturn cmd\n}\n\n// Binary distribution cleanups\n\nfunc doPurge(cmdline []string) {\n\tvar (\n\t\tstore = flag.String(\"store\", \"\", `Destination from where to purge archives (usually \"gethstore/builds\")`)\n\t\tlimit = flag.Int(\"days\", 30, `Age threshold above which to delete unstalbe archives`)\n\t)\n\tflag.CommandLine.Parse(cmdline)\n\n\tif env := build.Env(); !env.IsCronJob {\n\t\tlog.Printf(\"skipping because not a cron job\")\n\t\tos.Exit(0)\n\t}\n\t// Create the azure authentication and list the current archives\n\tauth := build.AzureBlobstoreConfig{\n\t\tAccount:   strings.Split(*store, \"/\")[0],\n\t\tToken:     os.Getenv(\"AZURE_BLOBSTORE_TOKEN\"),\n\t\tContainer: strings.SplitN(*store, \"/\", 2)[1],\n\t}\n\tblobs, err := build.AzureBlobstoreList(auth)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\t// Iterate over the blobs, collect and sort all unstable builds\n\tfor i := 0; i < len(blobs); i++ {\n\t\tif !strings.Contains(blobs[i].Name, \"unstable\") {\n\t\t\tblobs = append(blobs[:i], blobs[i+1:]...)\n\t\t\ti--\n\t\t}\n\t}\n\tfor i := 0; i < len(blobs); i++ {\n\t\tfor j := i + 1; j < len(blobs); j++ {\n\t\t\tif blobs[i].Properties.LastModified.After(blobs[j].Properties.LastModified) {\n\t\t\t\tblobs[i], blobs[j] = blobs[j], blobs[i]\n\t\t\t}\n\t\t}\n\t}\n\t// Filter out all archives more recent that the given threshold\n\tfor i, blob := range blobs {\n\t\tif time.Since(blob.Properties.LastModified) < time.Duration(*limit)*24*time.Hour {\n\t\t\tblobs = blobs[:i]\n\t\t\tbreak\n\t\t}\n\t}\n\t// Delete all marked as such and return\n\tif err := build.AzureBlobstoreDelete(auth, blobs); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "build/clean_go_build_cache.sh",
    "content": "#!/bin/sh\n\n# Cleaning the Go cache only makes sense if we actually have Go installed... or\n# if Go is actually callable. This does not hold true during deb packaging, so\n# we need an explicit check to avoid build failures.\nif ! command -v go > /dev/null; then\n  exit\nfi\n\nversion_gt() {\n  test \"$(printf '%s\\n' \"$@\" | sort -V | head -n 1)\" != \"$1\"\n}\n\ngolang_version=$(go version |cut -d' ' -f3 |sed 's/go//')\n\n# Clean go build cache when go version is greater than or equal to 1.10\nif !(version_gt 1.10 $golang_version); then\n    go clean -cache\nfi\n"
  },
  {
    "path": "build/env.sh",
    "content": "#!/bin/sh\nset -e\n\nif [ ! -f \"build/env.sh\" ]; then\n    echo \"$0 must be run from the root of the repository.\"\n    exit 2\nfi\n\n# Create fake Go workspace if it doesn't exist yet.\nworkspace=\"$PWD/build/_workspace\"\nroot=\"$PWD\"\nSERO_PATH=\"$PWD\"\nCZERO_PATH=\"$PWD/../go-czero-import\"\necho $CZERO_PATH\n_GOPATH=`cd ../../../../;pwd`\necho $_GOPATH\n\ncd \"$root\"\nargs=()\nindex=0\nfor i in \"$@\"; do\n   args[$index]=$i\n   index=$[$index+1]\ndone\n\nmkdir -p \"$root/../go-czero-import/czero/lib\"\n\ncd \"$root/../go-czero-import/czero\"\n\ncp -rf lib_DARWIN_AMD64/* lib/\n\ncp -rf lib_LINUX_AMD64_V3/* lib/\n\ncp -rf lib_WINDOWS_AMD64/* lib/\n\nexport LD_LIBRARY_PATH=\"../go-czero-import/czero/lib\"\n\nexport DYLD_LIBRARY_PATH=\"../go-czero-import/czero/lib\"\n\n\n# Set up the environment to use the workspace.\nGOPATH=\"$_GOPATH\"\nexport GOPATH\n\n\n# Run the command inside the workspace.\ncd \"$SERO_PATH\"\nPWD=\"$SERO_PATH\"\n\n#Launch the arguments with the configured environment.\nexec \"${args[@]}\""
  },
  {
    "path": "build/gero.conf",
    "content": ""
  },
  {
    "path": "build/gero.spec",
    "content": "# Don't try fancy stuff like debuginfo, which is useless on binary-only\n# packages. Don't strip binary too\n# Be sure buildpolicy set to do nothing\n%define        _topdir %(pwd)\n%define   _tmpdir %{_topdir}/tmp\n%define        __spec_install_post %{nil}\n%define          debug_package %{nil}\n%define        __os_install_post %{_dbpath}/brp-compress\n%define     RPM_OS %{_os}\n\nSummary: A very simple toy bin rpm package\nName: gero\nVersion: 1.0\nRelease: 1\nLicense: GPL+\nGroup: Development/Tools\nSOURCE0 : %{name}-%{version}.tar.gz\nURL: http://gero.sero.com/\n\nBuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root\nAutoReq : yes\nAutoReqProv : yes\nAutoProv : yes\n#Requires: GLIBC_2.4 GCC_3.0 GOMP_1.0 GLIBCXX_3.4.21 GNU_HASH\n#BuildRequires: glibc >= 2.4 \n#BuildRequires: gcc >= 3.0 \n#BuildRequires: gomp >= 1.0 \n#BuildRequires: glibcxx >= 3.4.21 gnu_hash\n#BuildRequires: gnu_hash\n%description\n%{summary}\n\n%prep\n%setup -q\n\n%build\n# Empty section.\n%install\nrm -rf %{buildroot}\nmkdir -p  %{buildroot}\n\n# in builddir\ncp -a * %{buildroot}\n\n\n%clean\n#rm -rf %{buildroot}\n\n\n%files\n%defattr(-,root,root,-)\n%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf\n%{_bindir}/../local/*\n%{_libdir}/*\n%changelog\n* Sat Nov 03 2018  riverwind<riverwind@gameternal.com> 1.0-1\n- First Build\n\n"
  },
  {
    "path": "build/geropkg/attach.bat",
    "content": "@echo off \nset CURRENT=%cd%\nset LIB_PATH=%CURRENT%\\czero\\lib\nset path=%LIB_PATH%\nstart /b bin\\gero.exe attach \\\\.\\pipe\\gero.ipc\n\n"
  },
  {
    "path": "build/geropkg/attach.sh",
    "content": "#!/bin/sh\n\nDATADIR=\"./data\"\nif [ ! -z \"$1\" ]; then\n    DATADIR=$1\nfi\n\nexport DYLD_LIBRARY_PATH=\"./czero/lib/\"\nexport LD_LIBRARY_PATH=\"./czero/lib/\"\n\nbin/gero --datadir=\"${DATADIR}\" attach"
  },
  {
    "path": "build/geropkg/clean.sh",
    "content": "#!/bin/sh\n\nROOT=$(cd `dirname $0`; pwd)\n\nDATADIR=\"${ROOT}/data\"\nif [ ! -z \"$1\" ]; then\n    DATADIR=$1\nfi\n\nsh ${ROOT}/stop.sh\n\necho \"rm -rf ${DATADIR}/gero/chaindata\"\nrm -rf ${DATADIR}/gero/chaindata\necho \"rm -rf ${DATADIR}/gero.ipc\"\nrm -rf ${DATADIR}/gero.ipc\necho \"rm -rf ${DATADIR}/balance\"\nrm -rf ${DATADIR}/balance\necho \"rm -rf ${DATADIR}/exchange\"\nrm -rf ${DATADIR}/exchange\necho \"rm -rf ${DATADIR}/stake\"\nrm -rf ${DATADIR}/stake\necho \"rm -rf ${DATADIR}/light\"\nrm -rf ${DATADIR}/light\n"
  },
  {
    "path": "build/geropkg/geroConfig.toml",
    "content": "[Sero]\n  [Node]\n\n  #KeyStoreDir=\"./data/keystore\"\n\n  [Node.P2P]\n\n  MaxPeers = 25\n\n  StaticNodes = [\"snode://4915b0bf79803f09701c2d0b9c9bb1eecc785f5247f14cd62cfca12e4fd3a8eda09f10d1e69eaace358f874cf61f057ebf29b0d63100c7c91265a5ddbbdaf4cd@35.72.78.242:53717\",\"snode://e7a6fb6daf57ea645cbe2320f8eacfce41d8a6942388db3a60e313b5478863c458a71113269612eb83020def344c25d3e502f5606825414532f6292b01a85e8e@18.179.86.22:53717\",\"snode://432ef6d07c8b5a45442abc73900cbc2a4d89f474804711ab487edf9f7b0ba9c8fb1e18c3038b06a3e2035aef35adb5b7939eeae618fd0436827ad37937621ff1@46.51.236.41:53717\",\"snode://2d0a7329549489c6ae7ec5da5ffba3628dbb0bd2ed355e5a22d51e1d5966faebd1bd775a0819238a5f5182efcf386d56adfc5dad8db72c2f347319bed505442b@35.75.221.182:53717\",\"snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717\",\"snode://7fe0ac9ab365a18435dc67a92fe48be06b0fc5c5b4ef66135fc4ffbc48ffdd07bfdbc580128bba7bc29dd43c881bb41cf85b8a49015e937356fc6e855d3bc427@3.122.152.29:53717\",\"snode://eb7e7fcf5f6a0adc4cfe8fe4dd1d364299f9163b8ee55cf0424a8f27762eeb64f8be591da98249d2acf48b1c26fef241331fc71ceaec24549b5979423d73f44a@119.28.83.127:53717\",\"snode://04283d01edd018309d1381d8feb531c0b0f1d0ae72b738e7bd92f797a7c6239a1b59f3bfe739f3fc1a63e030360d3b88b185181705ef1166776b3fcc98362a4c@129.28.156.61:53717\", \"snode://04ab8fd7d7420aa0c66607f59b3109d874de116685e2e8dcd6c583ae9ab991289b7ebb925716d531eaff2cb0977a8961db59d496c3f0d2561dd580941a194d71@118.25.80.42:53717\", \"snode://1a81e137c5cfb7e41eb2ed911fbac9630abce096b2f1464ce44886d9cd5819493b42a9812f4b65467d966ea8dedca3863b114f7b3f3517c4bd3c3b26c330d60d@111.231.59.54:53717\", \"snode://38ad2d00bc6c539319e8a476761d2a636156af6a8f504765d28f392cd5c1f42ca2a69aeda05210c5e9dbe5184e68991c9ed36a3e4ded0cdd2ab9cba6c153d60e@47.105.42.49:53717\", \"snode://3ae5d553e78057fa33cad0ecf08b08fce9c2c50bbe5d2625b996b1322d8c96c74ca42dd54dbf5854cc6c70cd50a650e3b835c92e8f0e0adafcb47724413d16e2@13.251.221.90:60602\", \"snode://410b4aa874bb3d6d4dc732463629acfabbf503d39493f69c82fd62119d4eca1aef02cb0e5d224765231b66df3ba87e50e7fafc87651cbaf41af13705fea3370f@27.10.235.88:34342\", \"snode://41129a264748e4d949c675b1bb6afcb23fb0748e991e16e2b43693ead9911759c708ded5b836a68d0ef3c48d389667f3ba1224734b00794d522754bc693f52ea@109.70.186.58:53718\", \"snode://459c94ce2b1bb05dce5faccd27b13add006b5378ba0e598b001ddf07eb08d00965d61a64016b72a48de0a0d51c1d4f964929c00d53efc8b95a174dba3ba98065@95.216.8.218:53333\", \"snode://4ba7196e0c06885b036795ff126c4616627075ceb0bfaf0fae2313e6894bc3445b3b147afd60021d3450e4c0e7582be3248a2d21bb03560bff8a06b638efe749@118.24.17.141:53717\", \"snode://4da4f3b1f852cefadff1ace9f24cabd1245cf6ba81fb1cdb043c4987202bfacd8226c48a16bccef05c15f2f0b263acd25be1e60e3e3250ae61f83c49701118e9@121.196.218.173:53717\", \"snode://505d5faf9c914e082a1157dc6e8398eb52e18da05b71ffb45c97d422dbf01c91ff6eabeecb4d4fd2557c9bf52b471f376eba04f66bc9adc926ca6bd927f35394@47.75.186.103:56112\", \"snode://52e62b8cc63d8a44b7071ca76115edce26f53da42a71a23f7b52f8870b43b658cefe33517a7316941385fae495052b7d351e6e3f3c5f1110a86e20ee5d3626ec@39.100.244.135:53717\", \"snode://5365992929387340e9e5a5a06dcb32948efa9c073f62bbcbdaa9cc47c82c5e99c4b917a850aecd0ffa21150731475276b82aff0617bfa7016b2809459e1da128@14.215.130.120:53717\", \"snode://5e0041083a74bda32f46ef66d3206b73d0c14facd674a4f99373116954a88bb04f8abf0da0503baa186d3edc0ff5e3d22a4e74252a7750662053f9606bd0bef8@109.70.186.58:53717\", \"snode://619413acabc04d15870b8cce2eac02b0bc91a706cad503ae3e438870408d79f282b0e25dfeb4c8dbdcd2b0f320577ee859420c94f6a7f50db973bda70c360e65@183.2.149.218:53717\", \"snode://6b883d53f89c32ea32fc0520fe7c1dd2738c079068bc84c12b8fc032c0c947e958c980ef4eb839f5b7dab0a99e185059a941feefe2ec25b20d6e854dd530b95d@118.31.59.151:53717\", \"snode://7630acdc71105241a39a7b1725c145855c27e54bbe08f2806cd1a3d306cb407d8c0158742698dee848ba3d5f9992d56e3b1bc3b6f2b55ff159a45abdb3024d34@121.201.75.200:53717\", \"snode://8904be22328d88cdde7a9f259a5a210709b05dbd95c22b6df16f568ad19aafc94ece39966c3bbef4e7adfa8169b02405a7a82ca2083fdc3264354a506b9cdae0@182.61.22.130:53717\", \"snode://8fdaacf36133765f0b82a63e0abbc2402001bff5fbc1f4e290e761048aa847b75039e16efbe63217d4ba174ba8513a09418aa7c989ad2d868f01b619416d7514@39.104.121.215:53717\", \"snode://9162edcd147e13de27074bd908fd0107ff2c4adda8a410d46a0db8ae0feb4ed6518e9028939728eca7f44265320ee019ddf4eacda6d8c22970e4d16ef3d946e0@106.13.215.117:53727\", \"snode://98c6caf6bf71d326a85d792ae311157837b0fca5c7474ff3e78b5b81b8c97ae7404648f4aac4949746045324bcef83e15639706c806f2cab2aa180fe028819aa@119.23.46.14:53717\", \"snode://a45f419b3b20f327a1009669ab6d2642a86fe4c08b7bb39ce03f57cc9b584552acdd92c57981f92978833678f27cbb523daeac5f28caf8e17b550075941be677@183.2.149.217:53717\", \"snode://a9fa905c90dd9051a6a2e2edbba0a3c23c38d23ad9fd7fb47a4437d5f61ab80c05382f12c12cc5a360962d7f2271dd34dbd933ace888008620f02eb8522dad05@219.152.25.125:37168\", \"snode://ab964ae3dd5ea7744332e20b1a641ffad59063aae7f5e89b53eb04b1cc666899b22e6b951e811801645e51305bbc55df57e71c938678f47433a024fb645d25b1@119.148.162.131:53717\", \"snode://ae55a637218d40b7718d16d0ad82c91dbcaf72800a70da669426ef036a0bcf7eb6709a55ed675c3882ca734492c2358285d07f9b209e9d287270339299353253@49.232.53.87:53717\", \"snode://b3c2559e1790273a8355320bb98895fde3985f86c182d0f9cb5c00ea93b0d4b06ee8193eaf6dcbe3bf4866195fbae80f85d0c292e21328407e57ff1de55fdd53@129.204.197.105:53717\", \"snode://b5feccebd5d7908252e3b2e5ad7bcb1e71a0c9f13f5335a39a6cd534afbad64408480711b4528a4d2de3d063df5aa498c1326f6b54bc658afd99f6d04af789e7@94.191.35.64:53717\", \"snode://cbd8bb1c3d5ca59addb9a2c6c72f1a42826d46b6032bb22f3345c9e157d52e9d03c32ac022dd631828e0e061363d3f6e5e56c70e9b6f3f3e98a67e3f6fe28919@47.104.198.171:53717\", \"snode://d8c8257faeaa5cbd13185e632461593e61461ef4cab40fbf9a0fc997502f17f5f58ff47a92ed24e7ae3810dfff3d27511e807bec0ae55bd2f20021f679250c03@207.148.4.216:53717\", \"snode://d97fa94a1cf165d4a810189926b6c76553f7402bf80580a6c7e84b4e2c01003944fcc5d8fb46f015795d06708c917edb1d8f9f66210a1f73f1d15c70214c76a8@39.100.147.174:53717\", \"snode://e80e3b82bf60e20ad005c71196464621a1a0829791d5d42a6d3c814802b7a73d8075c9ae3bc794206b798d4391e3b809a5d18a39411af44b6bd3d9ac591ebd5b@129.204.27.217:53717\", \"snode://eb07c6e85fd25a8d1ee59b12645ae355264f6c1d47855aa4312374880b2dfda0572e8dc6e345e4da772f67cdbf64c99a37f47acb521bc040c4ed08cfb5b69fa7@49.235.43.231:53717\", \"snode://eb8bf52d6746c89709354c95eb2045a7fc8f75c4ba104238759e0a12f7df381486e956decf4b4ffe642f518c112cc3a305c1eee8633cd011a288db11af9b0774@18.162.219.184:53717\", \"snode://eeac837a47990f02e57814e4fe3661fd68ec9419bafc0d1f2a498aa25f635adccc0cf84553d291325acffead5bcec7fc9a838d724e30ac880c9d1a57f64b3ecb@47.75.120.213:55792\", \"snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@118.190.58.196:53717\", \"snode://221e2ad2237a3ec164bd8c7febe31336f0647b60e194d7def5b9fe9cf7ae09c33745b7c3cd833a8f05b5db282c41f2d35c72c3df38c594bcc054a4b35d54a93d@122.224.55.50:53717\", \"snode://eec8179a39aad4c793b24c978b2ebca2a8b97d60ee4ac1eee06e96a429c996501aee5fdd065129c065b0bfccadc1a88ed8d8b6ab4528677e01921f6f935599d7@101.37.124.82:53717\", \"snode://439b01f40e2a55c9e3a3773d1683f6f33d933a8bb4a23eabf493cd694bc2de8b1863ff62be3fe935afaefe34d960fa05497b23481ff267af3920be398419f3f3@118.31.57.191:53717\", \"snode://ebdc84f6c79a44e28efd3cc33743b7bdb192b566833acdf818df8398f87ecd849dae3cfe79017f0ad32e91e19b62cc5ed1ce85f459213ba86e46ab8b680819bb@13.56.113.11:53717\", \"snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@47.104.158.136:53717\"]\n\n  TrustedNodes = [\"snode://4915b0bf79803f09701c2d0b9c9bb1eecc785f5247f14cd62cfca12e4fd3a8eda09f10d1e69eaace358f874cf61f057ebf29b0d63100c7c91265a5ddbbdaf4cd@35.72.78.242:53717\",\"snode://e7a6fb6daf57ea645cbe2320f8eacfce41d8a6942388db3a60e313b5478863c458a71113269612eb83020def344c25d3e502f5606825414532f6292b01a85e8e@18.179.86.22:53717\",\"snode://432ef6d07c8b5a45442abc73900cbc2a4d89f474804711ab487edf9f7b0ba9c8fb1e18c3038b06a3e2035aef35adb5b7939eeae618fd0436827ad37937621ff1@46.51.236.41:53717\",\"snode://2d0a7329549489c6ae7ec5da5ffba3628dbb0bd2ed355e5a22d51e1d5966faebd1bd775a0819238a5f5182efcf386d56adfc5dad8db72c2f347319bed505442b@35.75.221.182:53717\",\"snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717\",\"snode://7fe0ac9ab365a18435dc67a92fe48be06b0fc5c5b4ef66135fc4ffbc48ffdd07bfdbc580128bba7bc29dd43c881bb41cf85b8a49015e937356fc6e855d3bc427@3.122.152.29:53717\",\"snode://eb7e7fcf5f6a0adc4cfe8fe4dd1d364299f9163b8ee55cf0424a8f27762eeb64f8be591da98249d2acf48b1c26fef241331fc71ceaec24549b5979423d73f44a@119.28.83.127:53717\",\"snode://0103521715dc9df9c56e52da9461d7ac8098e6ef15c5a7190a3a190b94fd1ba9222488fcd5c6314e76e379ece64c40085c3aa5cfa784fc5e6e913e16129eac49@139.227.219.135:58112\",\"snode://01bba7334a62bb1ffcc803f29339dc3e63ee331f96ea81c4f47286ce93b4175c7bca031ee436fbf8ffdae0e9e65da29f112e971a91fd76f4ef474c8a55c19a15@47.92.110.203:58286\",\"snode://075b618b1c9c20bc84c4ac6d467f5675d2104a238a5420c404673c805370d8ca550157ca31a9b15fcb70fabc1d47558c2e01732cc91b79e48bd3c08c68cf060e@183.192.21.53:9318\",\"snode://0a355cf5bcfa2aed85766dbeb18d3deba604677be978358a24d11b88c7d4fdc23c640f69b3273e12ac2c9a0af5cf7f3aeb14be8b7b3b5173af37f13558efbc4b@119.8.161.47:32421\",\"snode://0d0c32fb347bba04a1c0fe275bb7a787059bd39d7d941b35486657b5024446d5f79ee8b86d2df43105e99f381bb2c547dd6e239719e36cc1b534037445952fdc@175.10.229.187:63364\",\"snode://114e95014903c6d849fefe54adc4d6617d4f2fb475847a4e606c56521d912994c16f36756191fb47bd330941fb299cad3eb30344a40f2f53797a161665dfe1f8@54.199.141.76:57722\",\"snode://195444b38ca0edd380c276605ff3f04ac7c26bbc8e64d6f5da41e9ce846d5ff42a82620fdb41a57819bf61d1ae7268b6ba746a3c296829a966a89630c94cdbf5@118.114.15.211:50510\",\"snode://198bbc7367577f0d8b4fb031b93fde625de9f3c51cbe8743204d07c277a41fccccbfa5ae425520039302cb9df0e8f7b4049681657acaaffac2fe9ec4af362cda@82.156.79.42:36538\",\"snode://1e16c8515ec6edef8d482fe5ade9ed0eb9814d3074dae5d10efc9df16bdf4d252661efb9431c8f1c8013cfe7bf210de3ee8a008d0fec5347dd9557157b07fdaf@47.52.239.173:45512\",\"snode://2dfcd0abecb348b647a44e629d40f309e829697d7bfd2f7fa9a030b6fd339a0ee92006f648b6f0cc853dda35595f1030cca6807dbfa1a15905b71eeb09c68dd2@81.71.74.202:53892\",\"snode://302c7b5cfeb3886f3abe0c010012739c4f96423d5740c048740944cac6ad81112c5bbf9b0ef1655396bca30d805b31599d7d0cb39c35b8eedd137e0d9c08a7aa@113.80.58.137:17915\",\"snode://31dad6ce943bfbe16435e6a27f1796ef7892092f99e6d862d09183336e0e755903ffcc44147c94c5ee5c93ef50b492b5201a94967fe054152bbb42ef2cfcd536@47.241.18.60:34966\",\"snode://3402b086ce0ea6ed7eceda743f61292a4fe006c4637a421140c5c6f3ab83e91eb9d34422395856ae2e256b64f65a47e5c54f21dac071c6aa792d93d54a34501b@116.6.234.148:36558\",\"snode://3a4609328986ad7ab3d6020cc80127a2b8fec2edce147e08b5d834c45aacba782035eb5256707b44aeb1cf10cd85afa2b24957274ca87a93264e09e63fbb920d@114.35.191.60:58660\",\"snode://3ae5d553e78057fa33cad0ecf08b08fce9c2c50bbe5d2625b996b1322d8c96c74ca42dd54dbf5854cc6c70cd50a650e3b835c92e8f0e0adafcb47724413d16e2@13.251.221.90:60602\",\"snode://3da969d4e1c00dfcf0be98b49ee86493f056fecd1f478e39425ba57589f4a327b16b09ff2cce73642fc92c2b194470be93f40b2c90a1ebc94b2a949708710bbe@37.77.124.110:23683\",\"snode://4894429cd7a4ba7ea113a849f305df93db8619e2daebd4ea044015a1c8751ab49e3c4ff3cb8bdbcc4420e17b6870beabbf8275161db7f6a8e15879edd83a50f2@119.29.87.107:50096\",\"snode://4b51fe1f0b14eea419e1f27c9327e34ce5c8a5211d943a86da252a517b748202179306bd911dfff46dc79264d7a43f034c7314116a4b9190c90d5401b1a2ba60@47.91.229.226:39012\",\"snode://4cb03b8da934fcbb41853c1feba54cabe48279088b6e13179172939ecc3fb4d442d3464004ad8ace9fd74d8e8243e992efa6c68f8e3516a6795e4220a5eac64a@220.249.20.182:54181\",\"snode://4d6d46f319b3e1d645b26e0a3ccccc31f3bca4a43101c2f74eb47e668f0f55b13cf2a11ba97f891732e4c8ce5de35c652904f2721db6e1a1699a1163112fa419@47.244.130.159:16663\",\"snode://5162ddf8b2470e12d6ad8b696249a22273237f131e1e33ed1c234ad128404750b6faa83cfe7df890558e606842fc7ca3b8c450bc70b6edf11238a4762f8f9010@47.74.218.250:55024\",\"snode://57d8c7f37d71fc626ea310e25ac73373986c829dbe214f9e5cf922f98a5371ca4cc796b96fc6144440de452e8c017a5f67e5c34adec02f0a41bb9fe6a0382e3a@113.207.31.87:44330\",\"snode://59e8a0e520751a1c4cd55f52e99be5a9cd2c54c516d04a9e71d04b52739633a629932cb7a0e1504981fa1c0e8314dedf999d1b5cfdcb95268b053a67ce3eae1b@139.227.219.135:57474\",\"snode://5b0c2928729f35ed3d841cb45ba4a27e80f282ee1d1099d25a0f032a89729c7845a961dcb754ba29f64b526eeefb99d48b3c77de8281c19a6775e6662a5ddfe5@121.5.248.202:33782\",\"snode://5b45b450ab57902eabe748229e39b12324ec30ba31930625db0e7b588d30fc29b57ea48866230a798100f49e22061ccf3f7a4d8e9150cd800ba9d62e4e6af253@223.11.174.161:20058\",\"snode://60ccd7b69c94ac32bb9d8972e18d7b5f183cdf9d642f267cbded78393cb993ff93977c901eb7663dd41f2023793eba28ce17a70a3e9dad050158c32d7b239b64@82.156.185.216:52646\",\"snode://674a27dae43e3208d68c93d05a6df1a4c4eb06088dae2ac8138f5bc654a31617d0a5ae8e68c5dae896550683d3818e536a6efae7d4b8a524fcce20a767a093ec@220.162.164.173:37360\",\"snode://6a59045c1b31433776ea722f7ed94b196b091ba0072108851b64b7bd51b78ab26c933499216a1ad87316c40ce55edf85f970b9d43711b3a1130b192ba9fa7148@8.210.143.94:37104\",\"snode://6e7cd5cef0993c36bfd010c4afe4459022fd0d94b04bd2099a6b7183a22371e5d469dddf1505ed120d326dc0b19523cdbabe08be23056fbb46c319ad9d975059@49.232.11.26:34094\",\"snode://79890afc4003b2af25e2e772288444a228876d949b2c4b231728f822ce54a266a69d3ea2bef48d43b0a75985da685b05695678e759149c80b5583aea814cc0a5@161.117.88.198:50746\",\"snode://8016c274d492652ca4e95a3943f9f7dfb0c5cf170183f7d78b2a362677c10ebd170f592fdfa21840fcf084b02d00e28e7a25674a701ac97e2baa56d6c6923304@39.98.160.98:47392\",\"snode://82791b0d9b08af9ce172eeac79a033e5ca653198bd6c135ce5c46566d2b8b65a363c76fec319201837cd65f73173e5cdfe9540fedbbb13dee08d57f1747a1e39@47.52.117.20:47722\",\"snode://8341c0f4d88d05b306ce6e3721357aca0dc986d2eb467996c6cee3ce700ad1117240181d7c4b9e8d9d6c2b988b599b2eb809b9cc4a4cce2eca9037cbaa555684@139.186.25.132:59224\",\"snode://83f5056125418a3a048eaf6806da7b31ad398acff2f9fee4d776951d6b74b32ed9723cd974d62d767eb8fcf994e397783d19d3b2ca18bab315c9b236bb5a50dc@47.245.8.129:59134\",\"snode://8667855215e6f6be95bcd667a6a68aeae9d08a64321cd06eb04d4331af13df7fd305aa9320db8430c2e636529f6fc43fffc0895d5e2b5d6e602be26bf699859d@119.28.83.127:50122\",\"snode://90d84ce3afcaf386ac14a6ba8c52d12e406b09a8a081c0cbd4b3f2636d964fb657a4300c5f9d7b109214c4b7c6244954baabccd324b77407c2db10dff72779ed@35.182.111.60:47006\",\"snode://933bdc6bae33b6c4fc5f19be1638a717060d524890fedf20997ee51535d97bf30cc4d5eb1ad6ccfffbbd1fa5ba9c435aabd47519f7324447a500e4851eb54731@15.165.129.2:53844\",\"snode://a126269ed24e174d84b10c71554cb6d579759f7b82c6fc23a752a6e3c1b451124a463c25b31ba29f6f2477461689706fa68033ddbdee58db5704139e17524dec@113.80.8.19:6486\",\"snode://a6cf3cd8f77618c2474b947950b27686794481b11eb7b0f139c6a6d66601b04e9142111920883a161ce1645e4ad27a07f5032688ec47fe4f3af857bd91ae6419@3.1.119.147:46646\",\"snode://a8c60fffc0739aea0c2bd811eb11e0567e8fcc9b0d8c2eea14a38a084ab602637565875dbfe8b2b7729a957b811ee2775841235459d498deb9e265a62b5db74b@120.133.230.86:14009\",\"snode://a96890d5a1f3fa0b5a0db7544036000e75022d16eba4e80e4b572ebb80d10406dc688da3135c05e8c015d8cdb4a1b0647377f432ec70228dbfa2718b4815aaa7@118.195.137.245:40294\",\"snode://a9fee1ff7ccedfde6fa2640e3a67daf75bb6621dadae0c527164a3f62cb8a92a22672d9355da8fbfb611e9613c93f69ba62a522352b515311f73d7ee6222dfa8@139.227.219.32:54888\",\"snode://b1027d307fd740d341336c976ea04e91747151b34d3af855722d096c9ee6989232b8ed05df28b50fa3452cd66daa74e594b1b152d64e03870993171b5eb79484@47.90.29.31:4565\",\"snode://b5094a362450326d51c800dcd9d4d159fac99d5b0d3e16df319cc9c22d13a2c96aa0475d6d0674d7309eb123d119c008a8a2fa861e61b6fdaeda77c5d2f42170@39.99.193.30:35824\",\"snode://bb14fb0494b30d47329b1123c1cca0d82636f648e5fbdd8cbdce5bee39178ac18dfdce517450a49e8da7b8048d44d3e1432ed913d7315bef37fdc128b3e20c73@106.55.164.94:38572\",\"snode://bbcd7ca0319143d52ff4cdafe42bae8da23f51375b134251f80a9f46c7eb7c5148fa5db6af99bebcef24df72a9f9a0574c93c4f672ac6cbef58c96a2d2a5f4e9@54.248.0.58:25145\",\"snode://bbd781a1f7c9c630da6011b86d56c2400217189b017c7fa059fd9c073ae5d82fd416d3ac2392c508952a87bf7c8897b32aa1afeffb5ef55a970d92c25ca3ba91@153.37.113.158:1212\",\"snode://bc35396bd68c5d118fe07a01fc3151c25bb9e451348328be123f5e3f2c4bf4dd664de62fca4f0f54d9ebac0b530a4e6c2b1178a6374a6392078de988ccb1722b@52.199.145.159:36880\",\"snode://c6d1696c24a6a5d367419bcd480a62be7d71c6d9af9da86c0057b9145ae3c231bf4012d2448df181afd222f99e4b1bf22764b85058c25b49ece455db880230bf@117.143.152.134:35750\",\"snode://c97675ba95fad33adbc75de86db958712a98cd4d450f15b88a809f1f0a3c86d328a1113b1233771a00687a0b47510143c43deb9ee189882539b555331bcad96f@106.37.187.196:37837\",\"snode://ca9cdd78a8177f7bcf88b53a0a53c644b42d5d0071fdfb0dd35dc88197a50b89d45a320cbcd37480de907e3a8b547f0189072a373d0111d9037c3cc527af4224@42.239.187.207:7452\",\"snode://d38486265445e380881c6cfd2785ee6ca14c65b51539c017289bc52c3020f1fd86b93e464b91040b519602d7c30a9530843220a52d431178698c65bbddd7a05c@112.5.37.188:47766\",\"snode://dade51f41aa7bb0fbb1ac7e891518f53f99905c87d75dd900bb229645a2194e9ae0aeebbe4bc476b4974087028bc834c94ef7e9c418e653ea0a27ee2c6e80708@47.74.33.102:62998\",\"snode://e186ee3b613e61e56f16ddbb0ea6eca9cf4ba7e5dddd6323ef5f521cb271eefe15a3f4b177904deb61c8f8d2fab0684715afa640febcab57ee1c5e2a3fa5e4af@118.190.174.81:47574\",\"snode://e4df94cb7793be82f1079b77dd1007f82560b97d1b769ff31918acc62cd5312356a0a073981a57d704535a42fcd10431dc37b92746309dbd526eeb3e4eaef347@222.175.37.251:55040\",\"snode://edaa5ced463d12f47656b12eb148bbc724ddd3e8a87196ed2dcbf76f715e8d366e63140e90283cf6012a7e228fdefa54b740ad5ea20dad5fc748510890f8b269@106.52.12.56:36504\",\"snode://efa20fd5252bc246d4c17e79253a5e67b2729be3c6b811e5ecf3f0736b924404d9b81a8194d1169c50efcedfc6cc67bc9282214e3744d1d2fb769fffabd039b0@121.28.150.66:51936\",\"snode://f1fb490e23124c85728be74a23697545cd37327eee74238b0cad3e420a6fabb77ac33f2b9635c35a3f9d56683ed75bfce2fb0897482201174a4deb5d76a1b201@113.107.201.131:36564\",\"snode://f488a626dcffd1a29e8bae1af5260cd07bd62a4a56382fb9b6ace73414851f3255b3f51be7ceb3f63eaea972a8fea203369ac8964ce81d98f3652ab595ab6262@39.98.171.56:33654\",\"snode://f565ffc01ddd13a1cfee6891c6dd94f91b755554a38f0aee5e22d9fbd662ed8fb0582e53cb66bbc08880c98675821ce6db50bd05d133aa35bdcb72332ef4fdd0@18.138.166.33:52664\",\"snode://f6d6dae8d9c5352fe0275f000162b9c531ba17ddc02daa0d877d78a80a0fbd76252139abe8278f3b12b62a597a4908e9f31b471be464e4f18fd9e8c10a366c4c@170.106.9.156:57636\",\"snode://fa2b7ce6530d81fe5df1cf187b233701909bbfe617bccf16700fb954920a0b697bdca813c852db5fe3596bf6896c006453477aaaf75a1c6692990f485fcd17df@80.83.242.233:58821\",\"snode://fa85968fa99e147281d1945b92cba7a4a29948f2c9b77488c3e7332fb94443e3aae5ed6ef6845b46323322ad1afbbb3bb86addc3c01ba60d24f19ca1f9757af2@113.107.201.136:37796\",\"snode://fb50232b60fb445fe2f884fd8739dfac5f54209f38e1516bd81c70c668121efe495a7b52bab98354bdffd0db15d36eebe6b223a6961ad143854afe3dabc010ba@35.236.186.171:50366\",\"snode://fce4f6233c664d17b4f0c075d72e4671fd7af254594cb7975c99e5d4670f38f1b67b0d636fb993116b1cca942fb163a6155b921752d5a7706a4a2aecc828d103@120.229.31.74:11628\"]"
  },
  {
    "path": "build/geropkg/startup.bat",
    "content": "@echo off \nset CURRENT=%cd%\nset LIB_PATH=%CURRENT%\\czero\\lib\nset path=%LIB_PATH%\nset DATADIR=\nset KEYSTORE=\nset d=%1\nif \"%d%\" neq \"\" (\n   set DATADIR=--datadir  %d%\n)\nset k=%2\nif \"%k%\" neq \"\" (\n   set KEYSTORE=--keystore  %k%\n)\nstart /b bin\\gero.exe --config geroConfig.toml --exchange --mineMode %DATADIR% %KEYSTORE%\n\npause\n\n"
  },
  {
    "path": "build/geropkg/startup.sh",
    "content": "#!/bin/sh\nshow_usage=\"args: [-d ,-k, -p, -n,-r,-h]\\\n                                  [--datadir=,--keystore=, --port=, --net=, --rpc=,--help]\"\nexport DYLD_LIBRARY_PATH=\"./czero/lib/\"\nexport LD_LIBRARY_PATH=\"./czero/lib/\"\nDEFAULT_DATD_DIR=\"./data\"\nLOGDIR=\"./log\"\nDEFAULT_PORT=53717\nCONFIG_PATH=\"./geroConfig.toml\"\nDATADIR_OPTION=${DEFAULT_DATD_DIR}\nNET_OPTION=\"\"\nRPC_OPTION=\"\"\nPORT_OPTION=${DEFAULT_PORT}\nKEYSTORE_OPTION=\"\"\n\n\nGETOPT_ARGS=`getopt -o d:k:p:n:r:h -al datadir:,keystore:,port:,net:,rpc:,help -- \"$@\"`\neval set -- \"$GETOPT_ARGS\"\nwhile [ -n \"$1\" ]\ndo\n        case \"$1\" in\n                -d|--datadir) DATADIR_OPTION=$2; shift 2;;\n                -p|--port) PORT_OPTION=$2; shift 2;;\n                -n|--net) NET_OPTION=--$2; shift 2;;\n                -k|--keystore) KEYSTORE_OPTION=\"--keystore $2\"; shift 2;;\n                -r|--rpc)\n                        localhost=$(hostname -I|awk -F ' ' '{print $1}')\n                        RPC_OPTION=\"$cmd --rpc --rpcport $2 --rpcaddr $localhost  --rpccorsdomain '*'\"; shift 2;;\n                -h|--help) echo $show_usage;exit 0;;\n                --) break ;;\n        esac\ndone\n\ncmd=\"bin/gero --config ${CONFIG_PATH} --exchange --mineMode --datadir ${DATADIR_OPTION} --port ${PORT_OPTION} ${NET_OPTION} ${RPC_OPTION} ${KEYSTORE_OPTION}\"\nmkdir -p $LOGDIR\n\necho $cmd\ncurrent=`date \"+%Y-%m-%d\"`\nlogName=\"gero_$current.log\"\nsh stop.sh\nnohup ${cmd} >> \"${LOGDIR}/${logName}\" 2>&1 & echo $! > \"./pid\""
  },
  {
    "path": "build/geropkg/startupEx.sh",
    "content": "#!/bin/sh\n\nexport DYLD_LIBRARY_PATH=\"./czero/lib/\"\n\nexport LD_LIBRARY_PATH=\"./czero/lib/\"\n\nDEFAULT_DATD_DIR=\"./data\"\n\nLOGDIR=\"./log\"\n\nDEFAULT_PORT=53717\n\nCONFIG_PATH=\"./geroConfig.toml\"\n\nDATADIR_OPTION=${DEFAULT_DATD_DIR}\n\nRPC_OPTION=\"--rpc --rpcport 8545 --rpcapi exchange,sero,net --rpcaddr 127.0.0.1  --rpccorsdomain=*\"\n\ncmd=\"bin/gero --mineMode --config ${CONFIG_PATH} --datadir ${DATADIR_OPTION} --port ${DEFAULT_PORT}  ${RPC_OPTION} --confirmedBlock 32 --rpcwritetimeout 1800 --exchangeValueStr\"\nmkdir -p $LOGDIR\n\necho $cmd\ncurrent=`date \"+%Y-%m-%d\"`\nlogName=\"posGero_$current.log\"\nsh stop.sh\nnohup ${cmd} >> \"${LOGDIR}/${logName}\" 2>&1 & echo $! > \"./pid\""
  },
  {
    "path": "build/geropkg/startupVoter.bat",
    "content": "@echo off \nset CURRENT=%cd%\nset LIB_PATH=%CURRENT%\\czero\\lib\nset path=%LIB_PATH%\nset DATADIR=\nset KEYSTORE=\nset VOTER=\nset VOTER_PASSWORD_PATH=\n\n\nset v=%1\nif \"%v%\" neq \"\" (\n    set VOTER=--unlock %V%\n)\nset p=%2\nif \"%v%\" neq \"\" (\n    set VOTER_PASSWORD_PATH=--password %p%\n)\n\nset d=%3\nif \"%d%\" neq \"\" (\n   set DATADIR=--datadir  %d%\n)\nset k=%4\nif \"%k%\" neq \"\" (\n   set KEYSTORE=--keystore  %k%\n)\n\n\nstart /b bin\\gero.exe --config geroConfig.toml --exchange --mineMode %DATADIR% %KEYSTORE% %VOTER% %VOTER_PASSWORD_PATH%\n\npause\n\n"
  },
  {
    "path": "build/geropkg/startupVoter.sh",
    "content": "#!/bin/sh\nshow_usage=\"args: [-d ,-k, -p, -n,-r,-h]\\\n                                  [--datadir=,--keystore=, --port=, --net=, --rpc=,--help]\"\nexport DYLD_LIBRARY_PATH=\"./czero/lib/\"\nexport LD_LIBRARY_PATH=\"./czero/lib/\"\nDEFAULT_DATD_DIR=\"./data\"\nLOGDIR=\"./log\"\nDEFAULT_PORT=53717\nCONFIG_PATH=\"./geroConfig.toml\"\nDATADIR_OPTION=${DEFAULT_DATD_DIR}\nKEYSTORE_OPTION=\"\"\nVOTER=\"\"\nVOTER_PASSWORD_PATH=\"\"\n\n\nGETOPT_ARGS=`getopt -o d:k:p:v:f:h -al datadir:,keystore:,port:,voter:,pf:,help -- \"$@\"`\neval set -- \"$GETOPT_ARGS\"\nwhile [ -n \"$1\" ]\ndo\n        case \"$1\" in\n                -d|--datadir) DATADIR_OPTION=$2; shift 2;;\n                -p|--port) DEFAULT_PORT=$2; shift 2;;\n                -v|--voter) VOTER=$2; shift 2;;\n                -k|--keystore) KEYSTORE_OPTION=\"--keystore $2\"; shift 2;;\n                -f|--pf) VOTER_PASSWORD_PATH=$2; shift 2;;\n                -h|--help) echo $show_usage;exit 0;;\n                --) break ;;\n        esac\ndone\n\ncmd=\"bin/gero --mineMode --config ${CONFIG_PATH} --unlock ${VOTER} --password ${VOTER_PASSWORD_PATH} --datadir ${DATADIR_OPTION} --port ${DEFAULT_PORT} ${KEYSTORE_OPTION}\"\nmkdir -p $LOGDIR\n\necho $cmd\ncurrent=`date \"+%Y-%m-%d\"`\nlogName=\"posGero_$current.log\"\nsh stop.sh\nnohup ${cmd} >> \"${LOGDIR}/${logName}\" 2>&1 & echo $! > \"./pid\""
  },
  {
    "path": "build/geropkg/stop.sh",
    "content": "#!/bin/sh\n\nif [ -f \"pid\" ];then\n    kill -INT `cat pid`\n    rm -rf pid\nfi\n"
  },
  {
    "path": "build/goimports.sh",
    "content": "#!/bin/sh\n\nfind_files() {\n  find . ! \\( \\\n      \\( \\\n        -path '.github' \\\n        -o -path './build/_workspace' \\\n        -o -path './build/bin' \\\n        -o -path './crypto/bn256' \\\n        -o -path '*/vendor/*' \\\n      \\) -prune \\\n    \\) -name '*.go'\n}\n\nGOFMT=\"gofmt -s -w\"\nGOIMPORTS=\"goimports -w\"\nfind_files | xargs $GOFMT\nfind_files | xargs $GOIMPORTS\n"
  },
  {
    "path": "build/install.sh",
    "content": "#! /bin/sh\n\n_GOPATH=`cd ../../../../../;pwd`\n\nexport GOPATH=$_GOPATH\necho $GOPATH\n\ngo install -v ../cmd/gero\ngo install -v ../cmd/serokey\n"
  },
  {
    "path": "build/pod.podspec",
    "content": "Pod::Spec.new do |spec|\n  spec.name         = 'Geth'\n  spec.version      = '{{.Version}}'\n  spec.license      = { :type => 'GNU Lesser General Public License, Version 3.0' }\n  spec.homepage     = 'https://github.com/ethereum/go-sero'\n  spec.authors      = { {{range .Contributors}}\n\t\t'{{.Name}}' => '{{.Email}}',{{end}}\n\t}\n  spec.summary      = 'iOS Ethereum Client'\n  spec.source       = { :git => 'https://github.com/ethereum/go-sero.git', :commit => '{{.Commit}}' }\n\n\tspec.platform = :ios\n  spec.ios.deployment_target  = '9.0'\n\tspec.ios.vendored_frameworks = 'Frameworks/Geth.framework'\n\n\tspec.prepare_command = <<-CMD\n    curl https://gethstore.blob.core.windows.net/builds/{{.Archive}}.tar.gz | tar -xvz\n    mkdir Frameworks\n    mv {{.Archive}}/Geth.framework Frameworks\n    rm -rf {{.Archive}}\n  CMD\nend\n"
  },
  {
    "path": "build/update-license.go",
    "content": "// +build none\n\n/*\nThis command generates GPL license headers on top of all source files.\nYou can run it once per month, before cutting a release or just\nwhenever you feel like it.\n\n\tgo run update-license.go\n\nAll authors (people who have contributed code) are listed in the\nAUTHORS file. The author names are mapped and deduplicated using the\n.mailmap file. You can use .mailmap to set the canonical name and\naddress for each author. See git-shortlog(1) for an explanation of the\n.mailmap format.\n\nPlease review the resulting diff to check whether the correct\ncopyright assignments are performed.\n*/\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"text/template\"\n\t\"time\"\n)\n\nvar (\n\t// only files with these extensions will be considered\n\textensions = []string{\".go\", \".js\", \".qml\"}\n\n\t// paths with any of these prefixes will be skipped\n\tskipPrefixes = []string{\n\t\t// boring stuff\n\t\t\"vendor/\", \"tests/testdata/\", \"build/\",\n\t\t// don't relicense vendored sources\n\t\t\"cmd/internal/browser\",\n\t\t\"consensus/ethash/xor.go\",\n\t\t\"crypto/bn256/\",\n\t\t\"crypto/ecies/\",\n\t\t\"crypto/secp256k1/curve.go\",\n\t\t\"crypto/sha3/\",\n\t\t\"internal/jsre/deps\",\n\t\t\"log/\",\n\t\t\"common/bitutil/bitutil\",\n\t\t// don't license generated files\n\t\t\"contracts/chequebook/contract/code.go\",\n\t}\n\n\t// paths with this prefix are licensed as GPL. all other files are LGPL.\n\tgplPrefixes = []string{\"cmd/\"}\n\n\t// this regexp must match the entire license comment at the\n\t// beginning of each file.\n\tlicenseCommentRE = regexp.MustCompile(`^//\\s*(Copyright|This file is part of).*?\\n(?://.*?\\n)*\\n*`)\n\n\t// this text appears at the start of AUTHORS\n\tauthorsFileHeader = \"# This is the official list of go-ethereum authors for copyright purposes.\\n\\n\"\n)\n\n// this template generates the license comment.\n// its input is an info structure.\nvar licenseT = template.Must(template.New(\"\").Parse(`\n// Copyright {{.Year}} The go-ethereum Authors\n// This file is part of {{.Whole false}}.\n//\n// {{.Whole true}} is free software: you can redistribute it and/or modify\n// it under the terms of the GNU {{.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// {{.Whole true}} 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 {{.License}} for more details.\n//\n// You should have received a copy of the GNU {{.License}}\n// along with {{.Whole false}}. If not, see <http://www.gnu.org/licenses/>.\n\n`[1:]))\n\ntype info struct {\n\tfile string\n\tYear int64\n}\n\nfunc (i info) License() string {\n\tif i.gpl() {\n\t\treturn \"General Public License\"\n\t}\n\treturn \"Lesser General Public License\"\n}\n\nfunc (i info) ShortLicense() string {\n\tif i.gpl() {\n\t\treturn \"GPL\"\n\t}\n\treturn \"LGPL\"\n}\n\nfunc (i info) Whole(startOfSentence bool) string {\n\tif i.gpl() {\n\t\treturn \"go-sero\"\n\t}\n\tif startOfSentence {\n\t\treturn \"The go-ethereum library\"\n\t}\n\treturn \"the go-ethereum library\"\n}\n\nfunc (i info) gpl() bool {\n\tfor _, p := range gplPrefixes {\n\t\tif strings.HasPrefix(i.file, p) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc main() {\n\tvar (\n\t\tfiles = getFiles()\n\t\tfilec = make(chan string)\n\t\tinfoc = make(chan *info, 20)\n\t\twg    sync.WaitGroup\n\t)\n\n\twriteAuthors(files)\n\n\tgo func() {\n\t\tfor _, f := range files {\n\t\t\tfilec <- f\n\t\t}\n\t\tclose(filec)\n\t}()\n\tfor i := runtime.NumCPU(); i >= 0; i-- {\n\t\t// getting file info is slow and needs to be parallel.\n\t\t// it traverses git history for each file.\n\t\twg.Add(1)\n\t\tgo getInfo(filec, infoc, &wg)\n\t}\n\tgo func() {\n\t\twg.Wait()\n\t\tclose(infoc)\n\t}()\n\twriteLicenses(infoc)\n}\n\nfunc skipFile(path string) bool {\n\tif strings.Contains(path, \"/testdata/\") {\n\t\treturn true\n\t}\n\tfor _, p := range skipPrefixes {\n\t\tif strings.HasPrefix(path, p) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc getFiles() []string {\n\tcmd := exec.Command(\"git\", \"ls-tree\", \"-r\", \"--name-only\", \"HEAD\")\n\tvar files []string\n\terr := doLines(cmd, func(line string) {\n\t\tif skipFile(line) {\n\t\t\treturn\n\t\t}\n\t\text := filepath.Ext(line)\n\t\tfor _, wantExt := range extensions {\n\t\t\tif ext == wantExt {\n\t\t\t\tgoto keep\n\t\t\t}\n\t\t}\n\t\treturn\n\tkeep:\n\t\tfiles = append(files, line)\n\t})\n\tif err != nil {\n\t\tlog.Fatal(\"error getting files:\", err)\n\t}\n\treturn files\n}\n\nvar authorRegexp = regexp.MustCompile(`\\s*[0-9]+\\s*(.*)`)\n\nfunc gitAuthors(files []string) []string {\n\tcmds := []string{\"shortlog\", \"-s\", \"-n\", \"-e\", \"HEAD\", \"--\"}\n\tcmds = append(cmds, files...)\n\tcmd := exec.Command(\"git\", cmds...)\n\tvar authors []string\n\terr := doLines(cmd, func(line string) {\n\t\tm := authorRegexp.FindStringSubmatch(line)\n\t\tif len(m) > 1 {\n\t\t\tauthors = append(authors, m[1])\n\t\t}\n\t})\n\tif err != nil {\n\t\tlog.Fatalln(\"error getting authors:\", err)\n\t}\n\treturn authors\n}\n\nfunc readAuthors() []string {\n\tcontent, err := ioutil.ReadFile(\"AUTHORS\")\n\tif err != nil && !os.IsNotExist(err) {\n\t\tlog.Fatalln(\"error reading AUTHORS:\", err)\n\t}\n\tvar authors []string\n\tfor _, a := range bytes.Split(content, []byte(\"\\n\")) {\n\t\tif len(a) > 0 && a[0] != '#' {\n\t\t\tauthors = append(authors, string(a))\n\t\t}\n\t}\n\t// Retranslate existing authors through .mailmap.\n\t// This should catch email address changes.\n\tauthors = mailmapLookup(authors)\n\treturn authors\n}\n\nfunc mailmapLookup(authors []string) []string {\n\tif len(authors) == 0 {\n\t\treturn nil\n\t}\n\tcmds := []string{\"check-mailmap\", \"--\"}\n\tcmds = append(cmds, authors...)\n\tcmd := exec.Command(\"git\", cmds...)\n\tvar translated []string\n\terr := doLines(cmd, func(line string) {\n\t\ttranslated = append(translated, line)\n\t})\n\tif err != nil {\n\t\tlog.Fatalln(\"error translating authors:\", err)\n\t}\n\treturn translated\n}\n\nfunc writeAuthors(files []string) {\n\tmerge := make(map[string]bool)\n\t// Add authors that Git reports as contributorxs.\n\t// This is the primary source of author information.\n\tfor _, a := range gitAuthors(files) {\n\t\tmerge[a] = true\n\t}\n\t// Add existing authors from the file. This should ensure that we\n\t// never lose authors, even if Git stops listing them. We can also\n\t// add authors manually this way.\n\tfor _, a := range readAuthors() {\n\t\tmerge[a] = true\n\t}\n\t// Write sorted list of authors back to the file.\n\tvar result []string\n\tfor a := range merge {\n\t\tresult = append(result, a)\n\t}\n\tsort.Strings(result)\n\tcontent := new(bytes.Buffer)\n\tcontent.WriteString(authorsFileHeader)\n\tfor _, a := range result {\n\t\tcontent.WriteString(a)\n\t\tcontent.WriteString(\"\\n\")\n\t}\n\tfmt.Println(\"writing AUTHORS\")\n\tif err := ioutil.WriteFile(\"AUTHORS\", content.Bytes(), 0644); err != nil {\n\t\tlog.Fatalln(err)\n\t}\n}\n\nfunc getInfo(files <-chan string, out chan<- *info, wg *sync.WaitGroup) {\n\tfor file := range files {\n\t\tstat, err := os.Lstat(file)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"ERROR %s: %v\\n\", file, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !stat.Mode().IsRegular() {\n\t\t\tcontinue\n\t\t}\n\t\tif isGenerated(file) {\n\t\t\tcontinue\n\t\t}\n\t\tinfo, err := fileInfo(file)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"ERROR %s: %v\\n\", file, err)\n\t\t\tcontinue\n\t\t}\n\t\tout <- info\n\t}\n\twg.Done()\n}\n\nfunc isGenerated(file string) bool {\n\tfd, err := os.Open(file)\n\tif err != nil {\n\t\treturn false\n\t}\n\tdefer fd.Close()\n\tbuf := make([]byte, 2048)\n\tn, _ := fd.Read(buf)\n\tbuf = buf[:n]\n\tfor _, l := range bytes.Split(buf, []byte(\"\\n\")) {\n\t\tif bytes.HasPrefix(l, []byte(\"// Code generated\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// fileInfo finds the lowest year in which the given file was committed.\nfunc fileInfo(file string) (*info, error) {\n\tinfo := &info{file: file, Year: int64(time.Now().Year())}\n\tcmd := exec.Command(\"git\", \"log\", \"--follow\", \"--find-renames=80\", \"--find-copies=80\", \"--pretty=format:%ai\", \"--\", file)\n\terr := doLines(cmd, func(line string) {\n\t\ty, err := strconv.ParseInt(line[:4], 10, 64)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"cannot parse year: %q\", line[:4])\n\t\t}\n\t\tif y < info.Year {\n\t\t\tinfo.Year = y\n\t\t}\n\t})\n\treturn info, err\n}\n\nfunc writeLicenses(infos <-chan *info) {\n\tfor i := range infos {\n\t\twriteLicense(i)\n\t}\n}\n\nfunc writeLicense(info *info) {\n\tfi, err := os.Stat(info.file)\n\tif os.IsNotExist(err) {\n\t\tfmt.Println(\"skipping (does not exist)\", info.file)\n\t\treturn\n\t}\n\tif err != nil {\n\t\tlog.Fatalf(\"error stat'ing %s: %v\\n\", info.file, err)\n\t}\n\tcontent, err := ioutil.ReadFile(info.file)\n\tif err != nil {\n\t\tlog.Fatalf(\"error reading %s: %v\\n\", info.file, err)\n\t}\n\t// Construct new file content.\n\tbuf := new(bytes.Buffer)\n\tlicenseT.Execute(buf, info)\n\tif m := licenseCommentRE.FindIndex(content); m != nil && m[0] == 0 {\n\t\tbuf.Write(content[:m[0]])\n\t\tbuf.Write(content[m[1]:])\n\t} else {\n\t\tbuf.Write(content)\n\t}\n\t// Write it to the file.\n\tif bytes.Equal(content, buf.Bytes()) {\n\t\tfmt.Println(\"skipping (no changes)\", info.file)\n\t\treturn\n\t}\n\tfmt.Println(\"writing\", info.ShortLicense(), info.file)\n\tif err := ioutil.WriteFile(info.file, buf.Bytes(), fi.Mode()); err != nil {\n\t\tlog.Fatalf(\"error writing %s: %v\", info.file, err)\n\t}\n}\n\nfunc doLines(cmd *exec.Cmd, f func(string)) error {\n\tstdout, err := cmd.StdoutPipe()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := cmd.Start(); err != nil {\n\t\treturn err\n\t}\n\ts := bufio.NewScanner(stdout)\n\tfor s.Scan() {\n\t\tf(s.Text())\n\t}\n\tif s.Err() != nil {\n\t\treturn s.Err()\n\t}\n\tif err := cmd.Wait(); err != nil {\n\t\treturn fmt.Errorf(\"%v (for %s)\", err, strings.Join(cmd.Args, \" \"))\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "circle.yml",
    "content": "machine:\n  services:\n    - docker\n\ndependencies:\n  cache_directories:\n    - \"~/.ethash\" # Cache the ethash DAG generated by hive for consecutive builds\n    - \"~/.docker\" # Cache all docker images manually to avoid lengthy rebuilds\n  override:\n    # Restore all previously cached docker images\n    - mkdir -p ~/.docker\n    - for img in `ls ~/.docker`; do docker load -i ~/.docker/$img; done\n\n    # Pull in and hive, restore cached ethash DAGs and do a dry run\n    - go get -u github.com/karalabe/hive\n    - (cd ~/.go_workspace/src/github.com/karalabe/hive && mkdir -p workspace/ethash/ ~/.ethash)\n    - (cd ~/.go_workspace/src/github.com/karalabe/hive && cp -r ~/.ethash/. workspace/ethash/)\n    - (cd ~/.go_workspace/src/github.com/karalabe/hive && hive --docker-noshell --client=NONE --test=. --sim=. --loglevel=6)\n\n    # Cache all the docker images and the ethash DAGs\n    - for img in `docker images | grep -v \"^<none>\" | tail -n +2 | awk '{print $1}'`; do docker save $img > ~/.docker/`echo $img | tr '/' ':'`.tar; done\n    - cp -r ~/.go_workspace/src/github.com/karalabe/hive/workspace/ethash/. ~/.ethash\n\ntest:\n  override:\n    # Build Geth and move into a known folder\n    - make geth\n    - cp ./build/bin/geth $HOME/geth\n\n    # Run hive and move all generated logs into the public artifacts folder\n    - (cd ~/.go_workspace/src/github.com/karalabe/hive && hive --docker-noshell --client=go-ethereum:local --override=$HOME/geth --test=. --sim=.)\n    - cp -r ~/.go_workspace/src/github.com/karalabe/hive/workspace/logs/* $CIRCLE_ARTIFACTS\n"
  },
  {
    "path": "cmd/abigen/main.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/accounts/abi/bind\"\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/common/compiler\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nconst (\n\tcommandHelperTemplate = `{{.Name}}{{if .Subcommands}} command{{end}}{{if .Flags}} [command options]{{end}} [arguments...]\n{{if .Description}}{{.Description}}\n{{end}}{{if .Subcommands}}\nSUBCOMMANDS:\n\t{{range .Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ \"\\t\" }}{{.Usage}}\n\t{{end}}{{end}}{{if .Flags}}\nOPTIONS:\n{{range $.Flags}}{{\"\\t\"}}{{.}}\n{{end}}\n{{end}}`\n)\n\nvar (\n\t// Git SHA1 commit hash of the release (set via linker flags)\n\tgitCommit = \"\"\n\t//gitDate   = \"\"\n\n\tapp *cli.App\n\n\t// Flags needed by abigen\n\tabiFlag = cli.StringFlag{\n\t\tName:  \"abi\",\n\t\tUsage: \"Path to the Sero contract ABI json to bind, - for STDIN\",\n\t}\n\tbinFlag = cli.StringFlag{\n\t\tName:  \"bin\",\n\t\tUsage: \"Path to the Sero contract bytecode (generate deploy method)\",\n\t}\n\ttypeFlag = cli.StringFlag{\n\t\tName:  \"type\",\n\t\tUsage: \"Struct name for the binding (default = package name)\",\n\t}\n\tjsonFlag = cli.StringFlag{\n\t\tName:  \"combined-json\",\n\t\tUsage: \"Path to the combined-json file generated by compiler\",\n\t}\n\tsolFlag = cli.StringFlag{\n\t\tName:  \"sol\",\n\t\tUsage: \"Path to the Sero contract Solidity source to build and bind\",\n\t}\n\tsolcFlag = cli.StringFlag{\n\t\tName:  \"solc\",\n\t\tUsage: \"Solidity compiler to use if source builds are requested\",\n\t\tValue: \"solc\",\n\t}\n\texcFlag = cli.StringFlag{\n\t\tName:  \"exc\",\n\t\tUsage: \"Comma separated types to exclude from binding\",\n\t}\n\tpkgFlag = cli.StringFlag{\n\t\tName:  \"pkg\",\n\t\tUsage: \"Package name to generate the binding into\",\n\t}\n\toutFlag = cli.StringFlag{\n\t\tName:  \"out\",\n\t\tUsage: \"Output file for the generated binding (default = stdout)\",\n\t}\n\tlangFlag = cli.StringFlag{\n\t\tName:  \"lang\",\n\t\tUsage: \"Destination language for the bindings (go, java, objc)\",\n\t\tValue: \"go\",\n\t}\n)\n\nfunc init() {\n\tapp = utils.NewApp(gitCommit, \"ethereum checkpoint helper tool\")\n\tapp.Flags = []cli.Flag{\n\t\tabiFlag,\n\t\tbinFlag,\n\t\ttypeFlag,\n\t\tjsonFlag,\n\t\tsolFlag,\n\t\tsolcFlag,\n\t\texcFlag,\n\t\tpkgFlag,\n\t\toutFlag,\n\t\tlangFlag,\n\t}\n\tapp.Action = utils.MigrateFlags(abigen)\n\tcli.CommandHelpTemplate = commandHelperTemplate\n}\n\nfunc abigen(c *cli.Context) error {\n\tutils.CheckExclusive(c, abiFlag, jsonFlag, solFlag) // Only one source can be selected.\n\tif c.GlobalString(pkgFlag.Name) == \"\" {\n\t\tutils.Fatalf(\"No destination package specified (--pkg)\")\n\t}\n\tvar lang bind.Lang\n\tswitch c.GlobalString(langFlag.Name) {\n\tcase \"go\":\n\t\tlang = bind.LangGo\n\tdefault:\n\t\tutils.Fatalf(\"Unsupported destination language \\\"%s\\\" (--lang)\", c.GlobalString(langFlag.Name))\n\t}\n\t// If the entire solidity code was specified, build and bind based on that\n\tvar (\n\t\tabis  []string\n\t\tbins  []string\n\t\ttypes []string\n\t\tsigs  []map[string]string\n\t\tlibs  = make(map[string]string)\n\t)\n\tif c.GlobalString(abiFlag.Name) != \"\" {\n\t\t// Load up the ABI, optional bytecode and type name from the parameters\n\t\tvar (\n\t\t\tabi []byte\n\t\t\terr error\n\t\t)\n\t\tinput := c.GlobalString(abiFlag.Name)\n\t\tif input == \"-\" {\n\t\t\tabi, err = ioutil.ReadAll(os.Stdin)\n\t\t} else {\n\t\t\tabi, err = ioutil.ReadFile(input)\n\t\t}\n\t\tif err != nil {\n\t\t\tutils.Fatalf(\"Failed to read input ABI: %v\", err)\n\t\t}\n\t\tabis = append(abis, string(abi))\n\n\t\tvar bin []byte\n\t\tif binFile := c.GlobalString(binFlag.Name); binFile != \"\" {\n\t\t\tif bin, err = ioutil.ReadFile(binFile); err != nil {\n\t\t\t\tutils.Fatalf(\"Failed to read input bytecode: %v\", err)\n\t\t\t}\n\t\t\tif strings.Contains(string(bin), \"//\") {\n\t\t\t\tutils.Fatalf(\"Contract has additional library references, please use other mode(e.g. --combined-json) to catch library infos\")\n\t\t\t}\n\t\t}\n\t\tbins = append(bins, string(bin))\n\n\t\tkind := c.GlobalString(typeFlag.Name)\n\t\tif kind == \"\" {\n\t\t\tkind = c.GlobalString(pkgFlag.Name)\n\t\t}\n\t\ttypes = append(types, kind)\n\t} else {\n\t\t// Generate the list of types to exclude from binding\n\t\texclude := make(map[string]bool)\n\t\tfor _, kind := range strings.Split(c.GlobalString(excFlag.Name), \",\") {\n\t\t\texclude[strings.ToLower(kind)] = true\n\t\t}\n\t\tvar err error\n\t\tvar contracts map[string]*compiler.Contract\n\n\t\tswitch {\n\t\tcase c.GlobalIsSet(solFlag.Name):\n\t\t\tcontracts, err = compiler.CompileSolidity(c.GlobalString(solcFlag.Name), c.GlobalString(solFlag.Name))\n\t\t\tif err != nil {\n\t\t\t\tutils.Fatalf(\"Failed to build Solidity contract: %v\", err)\n\t\t\t}\n\t\tcase c.GlobalIsSet(jsonFlag.Name):\n\t\t\tjsonOutput, err := ioutil.ReadFile(c.GlobalString(jsonFlag.Name))\n\t\t\tif err != nil {\n\t\t\t\tutils.Fatalf(\"Failed to read combined-json from compiler: %v\", err)\n\t\t\t}\n\t\t\tcontracts, err = compiler.ParseCombinedJSON(jsonOutput, \"\", \"\", \"\", \"\")\n\t\t\tif err != nil {\n\t\t\t\tutils.Fatalf(\"Failed to read contract information from json output: %v\", err)\n\t\t\t}\n\t\t}\n\t\t// Gather all non-excluded contract for binding\n\t\tfor name, contract := range contracts {\n\t\t\tif exclude[strings.ToLower(name)] {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tabi, err := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse\n\t\t\tif err != nil {\n\t\t\t\tutils.Fatalf(\"Failed to parse ABIs from compiler output: %v\", err)\n\t\t\t}\n\t\t\tabis = append(abis, string(abi))\n\t\t\tbins = append(bins, contract.Code)\n\t\t\tsigs = append(sigs, contract.Hashes)\n\t\t\tnameParts := strings.Split(name, \":\")\n\t\t\ttypes = append(types, nameParts[len(nameParts)-1])\n\n\t\t\tlibPattern := crypto.Keccak256Hash([]byte(name)).String()[2:36]\n\t\t\tlibs[libPattern] = nameParts[len(nameParts)-1]\n\t\t}\n\t}\n\t// Generate the contract binding\n\n\tcode, err := bind.Bind(types, abis, bins, sigs, c.GlobalString(pkgFlag.Name), lang, libs, nil)\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to generate ABI binding: %v\", err)\n\t}\n\t// Either flush it out to a file or display on the standard output\n\tif !c.GlobalIsSet(outFlag.Name) {\n\t\tfmt.Printf(\"%s\\n\", code)\n\t\treturn nil\n\t}\n\tif err := ioutil.WriteFile(c.GlobalString(outFlag.Name), []byte(code), 0600); err != nil {\n\t\tutils.Fatalf(\"Failed to write ABI binding: %v\", err)\n\t}\n\treturn nil\n}\n\nfunc main() {\n\tlog.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StreamHandler(os.Stderr, log.TerminalFormat(true))))\n\n\tif err := app.Run(os.Args); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n}\n"
  },
  {
    "path": "cmd/bootnode/main.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\n// bootnode runs a bootstrap node for the Ethereum Discovery Protocol.\npackage main\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"flag\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/discv5\"\n\t\"github.com/sero-cash/go-sero/p2p/nat\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n)\n\nfunc main() {\n\tvar (\n\t\tlistenAddr  = flag.String(\"addr\", \":53719\", \"listen address\")\n\t\tgenKey      = flag.String(\"genkey\", \"\", \"generate a node key\")\n\t\twriteAddr   = flag.Bool(\"writeaddress\", false, \"write out the node's pubkey hash and quit\")\n\t\tnodeKeyFile = flag.String(\"nodekey\", \"\", \"private key filename\")\n\t\tnodeKeyHex  = flag.String(\"nodekeyhex\", \"\", \"private key as hex (for testing)\")\n\t\tnatdesc     = flag.String(\"nat\", \"none\", \"port mapping mechanism (any|none|upnp|pmp|extip:<IP>)\")\n\t\tnetrestrict = flag.String(\"netrestrict\", \"\", \"restrict network communication to the given IP networks (CIDR masks)\")\n\t\trunv5       = flag.Bool(\"v5\", false, \"run a v5 topic discovery bootnode\")\n\t\tverbosity   = flag.Int(\"verbosity\", int(log.LvlInfo), \"log verbosity (0-9)\")\n\t\tvmodule     = flag.String(\"vmodule\", \"\", \"log verbosity pattern\")\n\n\t\tnodeKey *ecdsa.PrivateKey\n\t\terr     error\n\t)\n\tflag.Parse()\n\n\tglogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false)))\n\tglogger.Verbosity(log.Lvl(*verbosity))\n\tglogger.Vmodule(*vmodule)\n\tlog.Root().SetHandler(glogger)\n\n\tnatm, err := nat.Parse(*natdesc)\n\tif err != nil {\n\t\tutils.Fatalf(\"-nat: %v\", err)\n\t}\n\tswitch {\n\tcase *genKey != \"\":\n\t\tnodeKey, err = crypto.GenerateKey()\n\t\tif err != nil {\n\t\t\tutils.Fatalf(\"could not generate key: %v\", err)\n\t\t}\n\t\tif err = crypto.SaveECDSA(*genKey, nodeKey); err != nil {\n\t\t\tutils.Fatalf(\"%v\", err)\n\t\t}\n\t\treturn\n\tcase *nodeKeyFile == \"\" && *nodeKeyHex == \"\":\n\t\tutils.Fatalf(\"Use -nodekey or -nodekeyhex to specify a private key\")\n\tcase *nodeKeyFile != \"\" && *nodeKeyHex != \"\":\n\t\tutils.Fatalf(\"Options -nodekey and -nodekeyhex are mutually exclusive\")\n\tcase *nodeKeyFile != \"\":\n\t\tif nodeKey, err = crypto.LoadECDSA(*nodeKeyFile); err != nil {\n\t\t\tutils.Fatalf(\"-nodekey: %v\", err)\n\t\t}\n\tcase *nodeKeyHex != \"\":\n\t\tif nodeKey, err = crypto.HexToECDSA(*nodeKeyHex); err != nil {\n\t\t\tutils.Fatalf(\"-nodekeyhex: %v\", err)\n\t\t}\n\t}\n\n\tif *writeAddr {\n\t\tfmt.Printf(\"%v\\n\", discover.PubkeyID(&nodeKey.PublicKey))\n\t\tos.Exit(0)\n\t}\n\n\tvar restrictList *netutil.Netlist\n\tif *netrestrict != \"\" {\n\t\trestrictList, err = netutil.ParseNetlist(*netrestrict)\n\t\tif err != nil {\n\t\t\tutils.Fatalf(\"-netrestrict: %v\", err)\n\t\t}\n\t}\n\n\taddr, err := net.ResolveUDPAddr(\"udp\", *listenAddr)\n\tif err != nil {\n\t\tutils.Fatalf(\"-ResolveUDPAddr: %v\", err)\n\t}\n\tconn, err := net.ListenUDP(\"udp\", addr)\n\tif err != nil {\n\t\tutils.Fatalf(\"-ListenUDP: %v\", err)\n\t}\n\n\trealaddr := conn.LocalAddr().(*net.UDPAddr)\n\tif natm != nil {\n\t\tif !realaddr.IP.IsLoopback() {\n\t\t\tgo nat.Map(natm, nil, \"udp\", realaddr.Port, realaddr.Port, \"ethereum discovery\")\n\t\t}\n\t\t// TODO: react to external IP changes over time.\n\t\tif ext, err := natm.ExternalIP(); err == nil {\n\t\t\trealaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}\n\t\t}\n\t}\n\n\tif *runv5 {\n\t\tif _, err := discv5.ListenUDP(nodeKey, conn, realaddr, \"\", restrictList); err != nil {\n\t\t\tutils.Fatalf(\"%v\", err)\n\t\t}\n\t} else {\n\t\tcfg := discover.Config{\n\t\t\tPrivateKey:   nodeKey,\n\t\t\tAnnounceAddr: realaddr,\n\t\t\tNetRestrict:  restrictList,\n\t\t}\n\t\tif _, err := discover.ListenUDP(conn, cfg); err != nil {\n\t\t\tutils.Fatalf(\"%v\", err)\n\t\t}\n\t}\n\n\tselect {}\n}\n"
  },
  {
    "path": "cmd/gero/accountcmd.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/accounts/keystore\"\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/console\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nvar (\n\taccountCommand = cli.Command{\n\t\tName:     \"account\",\n\t\tUsage:    \"Manage accounts\",\n\t\tCategory: \"ACCOUNT COMMANDS\",\n\t\tDescription: `\n\nManage accounts, list all existing accounts, import a private key into a new\naccount, create a new account or update an existing account.\n\nIt supports interactive mode, when you are prompted for password as well as\nnon-interactive mode where passwords are supplied via a given password file.\nNon-interactive mode is only meant for scripted use on test networks or known\nsafe environments.\n\nMake sure you remember the password you gave when creating a new account (with\neither new or import). Without it you are not able to unlock your account.\n\nNote that exporting your key in unencrypted format is NOT supported.\n\nKeys are stored under <DATADIR>/keystore.\nIt is safe to transfer the entire directory or the individual keys therein\nbetween ethereum nodes by simply copying.\n\nMake sure you backup your keys regularly.`,\n\t\tSubcommands: []cli.Command{\n\t\t\t{\n\t\t\t\tName:   \"list\",\n\t\t\t\tUsage:  \"Print summary of existing accounts\",\n\t\t\t\tAction: utils.MigrateFlags(accountList),\n\t\t\t\tFlags: []cli.Flag{\n\t\t\t\t\tutils.DataDirFlag,\n\t\t\t\t\tutils.KeyStoreDirFlag,\n\t\t\t\t},\n\t\t\t\tDescription: `\nPrint a short summary of all accounts`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tName:   \"new\",\n\t\t\t\tUsage:  \"Create a new account\",\n\t\t\t\tAction: utils.MigrateFlags(accountCreate),\n\t\t\t\tFlags: []cli.Flag{\n\t\t\t\t\tutils.DataDirFlag,\n\t\t\t\t\tutils.KeyStoreDirFlag,\n\t\t\t\t\tutils.PasswordFileFlag,\n\t\t\t\t},\n\t\t\t\tDescription: `\n    gero account new\n\nCreates a new account and prints the address.\n\nThe account is saved in encrypted format, you are prompted for a passphrase.\n\nYou must remember this passphrase to unlock your account in the future.\n\nFor non-interactive use the passphrase can be specified with the --password flag:\n\nNote, this is meant to be used for testing only, it is a bad idea to save your\npassword to file or expose in any other way.\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tName:      \"update\",\n\t\t\t\tUsage:     \"Update an existing account\",\n\t\t\t\tAction:    utils.MigrateFlags(accountUpdate),\n\t\t\t\tArgsUsage: \"<address>\",\n\t\t\t\tFlags: []cli.Flag{\n\t\t\t\t\tutils.DataDirFlag,\n\t\t\t\t\tutils.KeyStoreDirFlag,\n\t\t\t\t},\n\t\t\t\tDescription: `\n    gero account update <address>\n\nUpdate an existing account.\n\nThe account is saved in the newest version in encrypted format, you are prompted\nfor a passphrase to unlock the account and another to save the updated file.\n\nThis same command can therefore be used to migrate an account of a deprecated\nformat to the newest format or change the password for an account.\n\nFor non-interactive use the passphrase can be specified with the --password flag:\n\n    gero account update [options] <address>\n\nSince only one password can be given, only format update can be performed,\nchanging your password is only possible interactively.\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tName:   \"import\",\n\t\t\t\tUsage:  \"Import a private key into a new account\",\n\t\t\t\tAction: utils.MigrateFlags(accountImport),\n\t\t\t\tFlags: []cli.Flag{\n\t\t\t\t\tutils.DataDirFlag,\n\t\t\t\t\tutils.KeyStoreDirFlag,\n\t\t\t\t\tutils.PasswordFileFlag,\n\t\t\t\t},\n\t\t\t\tArgsUsage: \"<keyFile>\",\n\t\t\t\tDescription: `\n    gero account import <keyfile>\n\nImports an unencrypted private key from <keyfile> and creates a new account.\nPrints the address.\n\nThe keyfile is assumed to contain an unencrypted private key in hexadecimal format.\n\nThe account is saved in encrypted format, you are prompted for a passphrase.\n\nYou must remember this passphrase to unlock your account in the future.\n\nFor non-interactive use the passphrase can be specified with the -password flag:\n\n    gero account import [options] <keyfile>\n\nNote:\nAs you can directly copy your encrypted accounts to another ethereum instance,\nthis import mechanism is not needed when you transfer an account between\nnodes.\n`,\n\t\t\t},\n\t\t},\n\t}\n)\n\nfunc accountList(ctx *cli.Context) error {\n\tstack, _ := makeConfigNode(ctx)\n\tvar index int\n\tfor _, wallet := range stack.AccountManager().Wallets() {\n\t\tfor _, account := range wallet.Accounts() {\n\t\t\tfmt.Printf(\"Account #%d: {%x} %s\\n\", index, account.Address, &account.URL)\n\t\t\tindex++\n\t\t}\n\t}\n\treturn nil\n}\n\n// tries unlocking the specified account a few times.\nfunc unlockAccount(ctx *cli.Context, ks *keystore.KeyStore, address string, i int, passwords []string) (accounts.Account, string) {\n\taccount, err := utils.MakeAddress(ks, address)\n\tif err != nil {\n\t\tutils.Fatalf(\"Could not list accounts: %v\", err)\n\t}\n\tfor trials := 0; trials < 3; trials++ {\n\t\tprompt := fmt.Sprintf(\"Unlocking account %s | Attempt %d/%d\", address, trials+1, 3)\n\t\tpassword := getPassPhrase(prompt, false, i, passwords)\n\t\terr = ks.Unlock(account, password)\n\t\tif err == nil {\n\t\t\tlog.Info(\"Unlocked account\", \"address\", account.Address.String())\n\t\t\treturn account, password\n\t\t}\n\t\tif err, ok := err.(*keystore.AmbiguousAddrError); ok {\n\t\t\tlog.Info(\"Unlocked account\", \"address\", account.Address.String())\n\t\t\treturn ambiguousAddrRecovery(ks, err, password), password\n\t\t}\n\t\tif err != keystore.ErrDecrypt {\n\t\t\t// No need to prompt again if the error is not decryption-related.\n\t\t\tbreak\n\t\t}\n\t}\n\t// All trials expended to unlock account, bail out\n\tutils.Fatalf(\"Failed to unlock account %s (%v)\", address, err)\n\n\treturn accounts.Account{}, \"\"\n}\n\n// getPassPhrase retrieves the password associated with an account, either fetched\n// from a list of preloaded passphrases, or requested interactively from the user.\nfunc getPassPhrase(prompt string, confirmation bool, i int, passwords []string) string {\n\t// If a list of passwords was supplied, retrieve from them\n\tif len(passwords) > 0 {\n\t\tif i < len(passwords) {\n\t\t\treturn passwords[i]\n\t\t}\n\t\treturn passwords[len(passwords)-1]\n\t}\n\t// Otherwise prompt the user for the password\n\tif prompt != \"\" {\n\t\tfmt.Println(prompt)\n\t}\n\tpassword, err := console.Stdin.PromptPassword(\"Passphrase: \")\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to read passphrase: %v\", err)\n\t}\n\tif confirmation {\n\t\tconfirm, err := console.Stdin.PromptPassword(\"Repeat passphrase: \")\n\t\tif err != nil {\n\t\t\tutils.Fatalf(\"Failed to read passphrase confirmation: %v\", err)\n\t\t}\n\t\tif password != confirm {\n\t\t\tutils.Fatalf(\"Passphrases do not match\")\n\t\t}\n\t}\n\treturn password\n}\n\nfunc ambiguousAddrRecovery(ks *keystore.KeyStore, err *keystore.AmbiguousAddrError, auth string) accounts.Account {\n\tfmt.Printf(\"Multiple key files exist for address %x:\\n\", err.Address)\n\tfor _, a := range err.Matches {\n\t\tfmt.Println(\"  \", a.URL)\n\t}\n\tfmt.Println(\"Testing your passphrase against all of them...\")\n\tvar match *accounts.Account\n\tfor _, a := range err.Matches {\n\t\tif err := ks.Unlock(a, auth); err == nil {\n\t\t\tmatch = &a\n\t\t\tbreak\n\t\t}\n\t}\n\tif match == nil {\n\t\tutils.Fatalf(\"None of the listed files could be unlocked.\")\n\t}\n\tfmt.Printf(\"Your passphrase unlocked %s\\n\", match.URL)\n\tfmt.Println(\"In order to avoid this warning, you need to remove the following duplicate key files:\")\n\tfor _, a := range err.Matches {\n\t\tif a != *match {\n\t\t\tfmt.Println(\"  \", a.URL)\n\t\t}\n\t}\n\treturn *match\n}\n\n// accountCreate creates a new account into the keystore defined by the CLI flags.\nfunc accountCreate(ctx *cli.Context) error {\n\tcfg := seroConfig{Node: defaultNodeConfig()}\n\t// Load config file.\n\tif file := ctx.GlobalString(configFileFlag.Name); file != \"\" {\n\t\tif err := loadConfig(file, &cfg); err != nil {\n\t\t\tutils.Fatalf(\"%v\", err)\n\t\t}\n\t}\n\tutils.SetNodeConfig(ctx, &cfg.Node)\n\tscryptN, scryptP, keydir, err := cfg.Node.AccountConfig()\n\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to read configuration: %v\", err)\n\t}\n\n\tpassword := getPassPhrase(\"Your new account is locked with a password. Please give a password. Do not forget this password.\", true, 0, utils.MakePasswordList(ctx))\n\n\taddress, err := keystore.StoreKey(keydir, password, scryptN, scryptP, 0)\n\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to create account: %v\", err)\n\t}\n\tfmt.Printf(\"Data: {%x}\\n\", address)\n\treturn nil\n}\n\n// accountUpdate transitions an account from a previous format to the current\n// one, also providing the possibility to change the pass-phrase.\nfunc accountUpdate(ctx *cli.Context) error {\n\tif len(ctx.Args()) == 0 {\n\t\tutils.Fatalf(\"No accounts specified to update\")\n\t}\n\tstack, _ := makeConfigNode(ctx)\n\tks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)\n\n\tfor _, addr := range ctx.Args() {\n\t\taccount, oldPassword := unlockAccount(ctx, ks, addr, 0, nil)\n\t\tnewPassword := getPassPhrase(\"Please give a new password. Do not forget this password.\", true, 0, nil)\n\t\tif err := ks.Update(account, oldPassword, newPassword); err != nil {\n\t\t\tutils.Fatalf(\"Could not update the account: %v\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc accountImport(ctx *cli.Context) error {\n\tkeyfile := ctx.Args().First()\n\tif len(keyfile) == 0 {\n\t\tutils.Fatalf(\"keyfile must be given as argument\")\n\t}\n\tkey, err := crypto.LoadECDSA(keyfile)\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to load the private key: %v\", err)\n\t}\n\tstack, _ := makeConfigNode(ctx)\n\tpassphrase := getPassPhrase(\"Your new account is locked with a password. Please give a password. Do not forget this password.\", true, 0, utils.MakePasswordList(ctx))\n\n\tks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)\n\tacct, err := ks.ImportECDSA(key, passphrase, 0, 2)\n\tif err != nil {\n\t\tutils.Fatalf(\"Could not create the account: %v\", err)\n\t}\n\tfmt.Printf(\"Data: {%x}\\n\", acct.Address)\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/gero/bugcmd.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/url\"\n\t\"os/exec\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/cmd/internal/browser\"\n\t\"github.com/sero-cash/go-sero/params\"\n\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\tcli \"gopkg.in/urfave/cli.v1\"\n)\n\nvar bugCommand = cli.Command{\n\tAction:    utils.MigrateFlags(reportBug),\n\tName:      \"bug\",\n\tUsage:     \"opens a window to report a bug on the gero repo\",\n\tArgsUsage: \" \",\n\tCategory:  \"MISCELLANEOUS COMMANDS\",\n}\n\nconst issueURL = \"https://github.com/sero-cash/go-sero/issues/new\"\n\n// reportBug reports a bug by opening a new URL to the go-ethereum GH issue\n// tracker and setting default values as the issue body.\nfunc reportBug(ctx *cli.Context) error {\n\t// execute template and write contents to buff\n\tvar buff bytes.Buffer\n\n\tfmt.Fprintln(&buff, \"#### System information\")\n\tfmt.Fprintln(&buff)\n\tfmt.Fprintln(&buff, \"Version:\", params.VersionWithMeta)\n\tfmt.Fprintln(&buff, \"Go Version:\", runtime.Version())\n\tfmt.Fprintln(&buff, \"OS:\", runtime.GOOS)\n\tprintOSDetails(&buff)\n\tfmt.Fprintln(&buff, header)\n\n\t// open a new GH issue\n\tif !browser.Open(issueURL + \"?body=\" + url.QueryEscape(buff.String())) {\n\t\tfmt.Printf(\"Please file a new issue at %s using this template:\\n\\n%s\", issueURL, buff.String())\n\t}\n\treturn nil\n}\n\n// copied from the Go source. Copyright 2017 The Go Authors\nfunc printOSDetails(w io.Writer) {\n\tswitch runtime.GOOS {\n\tcase \"darwin\":\n\t\tprintCmdOut(w, \"uname -v: \", \"uname\", \"-v\")\n\t\tprintCmdOut(w, \"\", \"sw_vers\")\n\tcase \"linux\":\n\t\tprintCmdOut(w, \"uname -sr: \", \"uname\", \"-sr\")\n\t\tprintCmdOut(w, \"\", \"lsb_release\", \"-a\")\n\tcase \"openbsd\", \"netbsd\", \"freebsd\", \"dragonfly\":\n\t\tprintCmdOut(w, \"uname -v: \", \"uname\", \"-v\")\n\tcase \"solaris\":\n\t\tout, err := ioutil.ReadFile(\"/etc/release\")\n\t\tif err == nil {\n\t\t\tfmt.Fprintf(w, \"/etc/release: %s\\n\", out)\n\t\t} else {\n\t\t\tfmt.Printf(\"failed to read /etc/release: %v\\n\", err)\n\t\t}\n\t}\n}\n\n// printCmdOut prints the output of running the given command.\n// It ignores failures; 'go bug' is best effort.\n//\n// copied from the Go source. Copyright 2017 The Go Authors\nfunc printCmdOut(w io.Writer, prefix, path string, args ...string) {\n\tcmd := exec.Command(path, args...)\n\tout, err := cmd.Output()\n\tif err != nil {\n\t\tfmt.Printf(\"%s %s: %v\\n\", path, strings.Join(args, \" \"), err)\n\t\treturn\n\t}\n\tfmt.Fprintf(w, \"%s%s\\n\", prefix, bytes.TrimSpace(out))\n}\n\nconst header = `\n#### Expected behaviour\n\n\n#### Actual behaviour\n\n\n#### Steps to reproduce the behaviour\n\n\n#### Backtrace\n`\n"
  },
  {
    "path": "cmd/gero/chaincmd.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/console\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/trie\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nvar (\n\timportCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(importChain),\n\t\tName:      \"import\",\n\t\tUsage:     \"Import a blockchain file\",\n\t\tArgsUsage: \"<filename> (<filename 2> ... <filename N>) \",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DataDirFlag,\n\t\t\tutils.CacheFlag,\n\t\t\t//utils.GCModeFlag,\n\t\t\tutils.CacheDatabaseFlag,\n\t\t\tutils.CacheGCFlag,\n\t\t},\n\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n\t\tDescription: `\nThe import command imports blocks from an RLP-encoded form. The form can be one file\nwith several RLP-encoded blocks, or several files can be used.\n\nIf only one file is used, import error will result in failure. If several files are used,\nprocessing will proceed even if an individual RLP-file import failure occurs.`,\n\t}\n\texportCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(exportChain),\n\t\tName:      \"export\",\n\t\tUsage:     \"Export blockchain into file\",\n\t\tArgsUsage: \"<filename> [<blockNumFirst> <blockNumLast>]\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DataDirFlag,\n\t\t\tutils.CacheFlag,\n\t\t},\n\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n\t\tDescription: `\nRequires a first argument of the file to write to.\nOptional second and third arguments control the first and\nlast block to write. In this mode, the file will be appended\nif already existing. If the file ends with .gz, the output will\nbe gzipped.`,\n\t}\n\timportPreimagesCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(importPreimages),\n\t\tName:      \"import-preimages\",\n\t\tUsage:     \"Import the preimage database from an RLP stream\",\n\t\tArgsUsage: \"<datafile>\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DataDirFlag,\n\t\t\tutils.CacheFlag,\n\t\t},\n\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n\t\tDescription: `\n\tThe import-preimages command imports hash preimages from an RLP encoded stream.`,\n\t}\n\texportPreimagesCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(exportPreimages),\n\t\tName:      \"export-preimages\",\n\t\tUsage:     \"Export the preimage database into an RLP stream\",\n\t\tArgsUsage: \"<dumpfile>\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DataDirFlag,\n\t\t\tutils.CacheFlag,\n\t\t},\n\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n\t\tDescription: `\nThe export-preimages command export hash preimages to an RLP encoded stream`,\n\t}\n\tcopydbCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(copyDb),\n\t\tName:      \"copydb\",\n\t\tUsage:     \"Create a local chain from a target chaindata folder\",\n\t\tArgsUsage: \"<sourceChaindataDir>\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DataDirFlag,\n\t\t\tutils.CacheFlag,\n\t\t\tutils.SyncModeFlag,\n\t\t\tutils.FakePoWFlag,\n\t\t\tutils.AlphanetFlag,\n\t\t\tutils.DeveloperFlag,\n\t\t\tutils.OfflineFlag,\n\t\t\t//utils.RinkebyFlag,\n\t\t},\n\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n\t\tDescription: `\nThe first argument must be the directory containing the blockchain to download from`,\n\t}\n\tremovedbCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(removeDB),\n\t\tName:      \"removedb\",\n\t\tUsage:     \"Remove blockchain and state databases\",\n\t\tArgsUsage: \" \",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DataDirFlag,\n\t\t},\n\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n\t\tDescription: `\nRemove blockchain and state databases`,\n\t}\n\n//\tdumpCommand = cli.Command{\n//\t\tAction:    utils.MigrateFlags(dump),\n//\t\tName:      \"dump\",\n//\t\tUsage:     \"Dump a specific block from storage\",\n//\t\tArgsUsage: \"[<blockHash> | <blockNum>]...\",\n//\t\tFlags: []cli.Flag{\n//\t\t\tutils.DataDirFlag,\n//\t\t\tutils.CacheFlag,\n//\t\t},\n//\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n//\t\tDescription: `\n//The arguments are interpreted as block numbers or hashes.\n//Use \"ethereum dump 0\" to dump the genesis block.`,\n//\t}\n)\n\n// initGenesis will initialise the given JSON format genesis file and writes it as\n// the zero'd block (i.e. genesis) or will fail hard if it can't succeed.\n//func initGenesis(ctx *cli.Context) error {\n//\t// Make sure we have a valid genesis JSON\n//\tgenesisPath := ctx.Args().First()\n//\tif len(genesisPath) == 0 {\n//\t\tutils.Fatalf(\"Must supply path to genesis JSON file\")\n//\t}\n//\tfile, err := os.Open(genesisPath)\n//\tif err != nil {\n//\t\tutils.Fatalf(\"Failed to read genesis file: %v\", err)\n//\t}\n//\tdefer file.Close()\n//\n//\tgenesis := new(core.Genesis)\n//\tif err := json.NewDecoder(file).Decode(genesis); err != nil {\n//\t\tutils.Fatalf(\"invalid genesis file: %v\", err)\n//\t}\n//\t// Open an initialise both full and light databases\n//\tstack := makeFullNode(ctx)\n//\tfor _, name := range []string{\"chaindata\"} {\n//\t\tchaindb, err := stack.OpenDatabase(name, 0, 0)\n//\t\tif err != nil {\n//\t\t\tutils.Fatalf(\"Failed to open database: %v\", err)\n//\t\t}\n//\t\t_, hash, err := core.SetupGenesisBlock(chaindb, genesis)\n//\t\tif err != nil {\n//\t\t\tutils.Fatalf(\"Failed to write genesis block: %v\", err)\n//\t\t}\n//\t\tlog.Info(\"Successfully wrote genesis state\", \"database\", name, \"hash\", hash)\n//\t}\n//\treturn nil\n//}\n\nfunc importChain(ctx *cli.Context) error {\n\tif len(ctx.Args()) < 1 {\n\t\tutils.Fatalf(\"This command requires an argument.\")\n\t}\n\tstack := makeFullNode(ctx)\n\tchain, chainDb := utils.MakeChain(ctx, stack)\n\tdefer chainDb.Close()\n\n\t// Start periodically gathering memory profiles\n\tvar peakMemAlloc, peakMemSys uint64\n\tgo func() {\n\t\tstats := new(runtime.MemStats)\n\t\tfor {\n\t\t\truntime.ReadMemStats(stats)\n\t\t\tif atomic.LoadUint64(&peakMemAlloc) < stats.Alloc {\n\t\t\t\tatomic.StoreUint64(&peakMemAlloc, stats.Alloc)\n\t\t\t}\n\t\t\tif atomic.LoadUint64(&peakMemSys) < stats.Sys {\n\t\t\t\tatomic.StoreUint64(&peakMemSys, stats.Sys)\n\t\t\t}\n\t\t\ttime.Sleep(5 * time.Second)\n\t\t}\n\t}()\n\t// Import the chain\n\tstart := time.Now()\n\n\tif len(ctx.Args()) == 1 {\n\t\tif err := utils.ImportChain(chain, ctx.Args().First()); err != nil {\n\t\t\tlog.Error(\"Import error\", \"err\", err)\n\t\t}\n\t} else {\n\t\tfor _, arg := range ctx.Args() {\n\t\t\tif err := utils.ImportChain(chain, arg); err != nil {\n\t\t\t\tlog.Error(\"Import error\", \"file\", arg, \"err\", err)\n\t\t\t}\n\t\t}\n\t}\n\tchain.Stop()\n\tfmt.Printf(\"Import done in %v.\\n\\n\", time.Since(start))\n\n\t// Output pre-compaction stats mostly to see the import trashing\n\tdb := chainDb.(*serodb.LDBDatabase)\n\n\tstats, err := db.LDB().GetProperty(\"leveldb.stats\")\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to read database stats: %v\", err)\n\t}\n\tfmt.Println(stats)\n\n\tioStats, err := db.LDB().GetProperty(\"leveldb.iostats\")\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to read database iostats: %v\", err)\n\t}\n\tfmt.Println(ioStats)\n\n\tfmt.Printf(\"Trie cache misses:  %d\\n\", trie.CacheMisses())\n\tfmt.Printf(\"Trie cache unloads: %d\\n\\n\", trie.CacheUnloads())\n\n\t// Print the memory statistics used by the importing\n\tmem := new(runtime.MemStats)\n\truntime.ReadMemStats(mem)\n\n\tfmt.Printf(\"Object memory: %.3f MB current, %.3f MB peak\\n\", float64(mem.Alloc)/1024/1024, float64(atomic.LoadUint64(&peakMemAlloc))/1024/1024)\n\tfmt.Printf(\"System memory: %.3f MB current, %.3f MB peak\\n\", float64(mem.Sys)/1024/1024, float64(atomic.LoadUint64(&peakMemSys))/1024/1024)\n\tfmt.Printf(\"Allocations:   %.3f million\\n\", float64(mem.Mallocs)/1000000)\n\tfmt.Printf(\"GC pause:      %v\\n\\n\", time.Duration(mem.PauseTotalNs))\n\n\tif ctx.GlobalIsSet(utils.NoCompactionFlag.Name) {\n\t\treturn nil\n\t}\n\n\t// Compact the entire database to more accurately measure disk io and print the stats\n\tstart = time.Now()\n\tfmt.Println(\"Compacting entire database...\")\n\tif err = db.LDB().CompactRange(util.Range{}); err != nil {\n\t\tutils.Fatalf(\"Compaction failed: %v\", err)\n\t}\n\tfmt.Printf(\"Compaction done in %v.\\n\\n\", time.Since(start))\n\n\tstats, err = db.LDB().GetProperty(\"leveldb.stats\")\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to read database stats: %v\", err)\n\t}\n\tfmt.Println(stats)\n\n\tioStats, err = db.LDB().GetProperty(\"leveldb.iostats\")\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to read database iostats: %v\", err)\n\t}\n\tfmt.Println(ioStats)\n\n\treturn nil\n}\n\nfunc exportChain(ctx *cli.Context) error {\n\tif len(ctx.Args()) < 1 {\n\t\tutils.Fatalf(\"This command requires an argument.\")\n\t}\n\tstack := makeFullNode(ctx)\n\tchain, _ := utils.MakeChain(ctx, stack)\n\tstart := time.Now()\n\n\tvar err error\n\tfp := ctx.Args().First()\n\tif len(ctx.Args()) < 3 {\n\t\terr = utils.ExportChain(chain, fp)\n\t} else {\n\t\t// This can be improved to allow for numbers larger than 9223372036854775807\n\t\tfirst, ferr := strconv.ParseInt(ctx.Args().Get(1), 10, 64)\n\t\tlast, lerr := strconv.ParseInt(ctx.Args().Get(2), 10, 64)\n\t\tif ferr != nil || lerr != nil {\n\t\t\tutils.Fatalf(\"Export error in parsing parameters: block number not an integer\\n\")\n\t\t}\n\t\tif first < 0 || last < 0 {\n\t\t\tutils.Fatalf(\"Export error: block number must be greater than 0\\n\")\n\t\t}\n\t\terr = utils.ExportAppendChain(chain, fp, uint64(first), uint64(last))\n\t}\n\n\tif err != nil {\n\t\tutils.Fatalf(\"Export error: %v\\n\", err)\n\t}\n\tfmt.Printf(\"Export done in %v\\n\", time.Since(start))\n\treturn nil\n}\n\n// importPreimages imports preimage data from the specified file.\nfunc importPreimages(ctx *cli.Context) error {\n\tif len(ctx.Args()) < 1 {\n\t\tutils.Fatalf(\"This command requires an argument.\")\n\t}\n\tstack := makeFullNode(ctx)\n\tdiskdb := utils.MakeChainDatabase(ctx, stack).(*serodb.LDBDatabase)\n\n\tstart := time.Now()\n\tif err := utils.ImportPreimages(diskdb, ctx.Args().First()); err != nil {\n\t\tutils.Fatalf(\"Export error: %v\\n\", err)\n\t}\n\tfmt.Printf(\"Export done in %v\\n\", time.Since(start))\n\treturn nil\n}\n\n// exportPreimages dumps the preimage data to specified json file in streaming way.\nfunc exportPreimages(ctx *cli.Context) error {\n\tif len(ctx.Args()) < 1 {\n\t\tutils.Fatalf(\"This command requires an argument.\")\n\t}\n\tstack := makeFullNode(ctx)\n\tdiskdb := utils.MakeChainDatabase(ctx, stack).(*serodb.LDBDatabase)\n\n\tstart := time.Now()\n\tif err := utils.ExportPreimages(diskdb, ctx.Args().First()); err != nil {\n\t\tutils.Fatalf(\"Export error: %v\\n\", err)\n\t}\n\tfmt.Printf(\"Export done in %v\\n\", time.Since(start))\n\treturn nil\n}\n\nfunc copyDb(ctx *cli.Context) error {\n\t// Ensure we have a source chain directory to copy\n\tif len(ctx.Args()) != 1 {\n\t\tutils.Fatalf(\"Source chaindata directory path argument missing\")\n\t}\n\t// Initialize a new chain for the running node to sync into\n\tstack := makeFullNode(ctx)\n\tchain, chainDb := utils.MakeChain(ctx, stack)\n\n\tsyncmode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode)\n\tdl := downloader.New(syncmode, chainDb, new(event.TypeMux), chain, nil, nil)\n\n\t// Create a source peer to satisfy downloader requests from\n\tdb, err := serodb.NewLDBDatabase(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name), 256)\n\tif err != nil {\n\t\treturn err\n\t}\n\thc, err := core.NewHeaderChain(db, chain.Config(), chain.Engine(), func() bool { return false })\n\tif err != nil {\n\t\treturn err\n\t}\n\tpeer := downloader.NewFakePeer(\"local\", db, hc, dl)\n\tif err = dl.RegisterPeer(\"local\", 63, peer); err != nil {\n\t\treturn err\n\t}\n\t// Synchronise with the simulated peer\n\tstart := time.Now()\n\n\tcurrentHeader := hc.CurrentHeader()\n\tif err = dl.Synchronise(\"local\", currentHeader.Hash(), hc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64()), syncmode); err != nil {\n\t\treturn err\n\t}\n\tfor dl.Synchronising() {\n\t\ttime.Sleep(10 * time.Millisecond)\n\t}\n\tfmt.Printf(\"Database copy done in %v\\n\", time.Since(start))\n\n\t// Compact the entire database to remove any sync overhead\n\tstart = time.Now()\n\tfmt.Println(\"Compacting entire database...\")\n\tif err = chainDb.(*serodb.LDBDatabase).LDB().CompactRange(util.Range{}); err != nil {\n\t\tutils.Fatalf(\"Compaction failed: %v\", err)\n\t}\n\tfmt.Printf(\"Compaction done in %v.\\n\\n\", time.Since(start))\n\n\treturn nil\n}\n\nfunc removeDB(ctx *cli.Context) error {\n\tstack, _ := makeConfigNode(ctx)\n\n\tfor _, name := range []string{\"chaindata\"} {\n\t\t// Ensure the database exists in the first place\n\t\tlogger := log.New(\"database\", name)\n\n\t\tdbdir := stack.ResolvePath(name)\n\t\tif !common.FileExist(dbdir) {\n\t\t\tlogger.Info(\"Database doesn't exist, skipping\", \"path\", dbdir)\n\t\t\tcontinue\n\t\t}\n\t\t// Confirm removal and execute\n\t\tfmt.Println(dbdir)\n\t\tconfirm, err := console.Stdin.PromptConfirm(\"Remove this database?\")\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\tutils.Fatalf(\"%v\", err)\n\t\tcase !confirm:\n\t\t\tlogger.Warn(\"Database deletion aborted\")\n\t\tdefault:\n\t\t\tstart := time.Now()\n\t\t\tos.RemoveAll(dbdir)\n\t\t\tlogger.Info(\"Database successfully deleted\", \"elapsed\", common.PrettyDuration(time.Since(start)))\n\t\t}\n\t}\n\treturn nil\n}\n\n//\n//func dump(ctx *cli.Context) error {\n//\tstack := makeFullNode(ctx)\n//\tchain, chainDb := utils.MakeChain(ctx, stack)\n//\tfor _, arg := range ctx.Args() {\n//\t\tvar block *types.Block\n//\t\tif hashish(arg) {\n//\t\t\tblock = chain.GetBlockByHash(common.HexToHash(arg))\n//\t\t} else {\n//\t\t\tnum, _ := strconv.Atoi(arg)\n//\t\t\tblock = chain.GetBlockByNumber(uint64(num))\n//\t\t}\n//\t\tif block == nil {\n//\t\t\tfmt.Println(\"{}\")\n//\t\t\tutils.Fatalf(\"block not found\")\n//\t\t} else {\n//\t\t\tstate, err := state.New(block.Root(), state.NewDatabase(chainDb), block.NumberU64())\n//\t\t\tif err != nil {\n//\t\t\t\tutils.Fatalf(\"could not create new state: %v\", err)\n//\t\t\t}\n//\t\t\tfmt.Printf(\"%s\\n\", state.Dump())\n//\t\t}\n//\t}\n//\tchainDb.Close()\n//\treturn nil\n//}\n\n// hashish returns true for strings that look like hashes.\nfunc hashish(x string) bool {\n\t_, err := strconv.Atoi(x)\n\treturn err != nil\n}\n"
  },
  {
    "path": "cmd/gero/config.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"reflect\"\n\t\"unicode\"\n\n\t\"gopkg.in/urfave/cli.v1\"\n\n\t\"github.com/naoina/toml\"\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/dashboard\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/sero\"\n)\n\nvar (\n\tdumpConfigCommand = cli.Command{\n\t\tAction:      utils.MigrateFlags(dumpConfig),\n\t\tName:        \"dumpconfig\",\n\t\tUsage:       \"Show configuration values\",\n\t\tArgsUsage:   \"\",\n\t\tFlags:       append(nodeFlags, rpcFlags...),\n\t\tCategory:    \"MISCELLANEOUS COMMANDS\",\n\t\tDescription: `The dumpconfig command shows configuration values.`,\n\t}\n\n\tconfigFileFlag = cli.StringFlag{\n\t\tName:  \"config\",\n\t\tUsage: \"TOML configuration file\",\n\t}\n)\n\n// These settings ensure that TOML keys use the same names as Go struct fields.\nvar tomlSettings = toml.Config{\n\tNormFieldName: func(rt reflect.Type, key string) string {\n\t\treturn key\n\t},\n\tFieldToKey: func(rt reflect.Type, field string) string {\n\t\treturn field\n\t},\n\tMissingField: func(rt reflect.Type, field string) error {\n\t\tlink := \"\"\n\t\tif unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != \"main\" {\n\t\t\tlink = fmt.Sprintf(\", see https://godoc.org/%s#%s for available fields\", rt.PkgPath(), rt.Name())\n\t\t}\n\t\treturn fmt.Errorf(\"field '%s' is not defined in %s%s\", field, rt.String(), link)\n\t},\n}\n\ntype serostatsConfig struct {\n\tURL string `toml:\",omitempty\"`\n}\n\ntype seroConfig struct {\n\tSero      sero.Config\n\tNode      node.Config\n\tSerostats serostatsConfig\n\tDashboard dashboard.Config\n}\n\nfunc loadConfig(file string, cfg *seroConfig) error {\n\tf, err := os.Open(file)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\n\terr = tomlSettings.NewDecoder(bufio.NewReader(f)).Decode(cfg)\n\t// Add file name to errors that have a line number.\n\tif _, ok := err.(*toml.LineError); ok {\n\t\terr = errors.New(file + \", \" + err.Error())\n\t}\n\treturn err\n}\n\nfunc defaultNodeConfig() node.Config {\n\tcfg := node.DefaultConfig\n\tcfg.Name = clientIdentifier\n\tcfg.Version = params.VersionWithCommit(gitCommit)\n\tcfg.HTTPModules = append(cfg.HTTPModules, \"sero\", \"shh\")\n\tcfg.WSModules = append(cfg.WSModules, \"sero\", \"shh\")\n\tcfg.IPCPath = \"gero.ipc\"\n\treturn cfg\n}\n\nfunc makeConfigNode(ctx *cli.Context) (*node.Node, seroConfig) {\n\t// Load defaults.\n\tcfg := seroConfig{\n\t\tSero:      sero.DefaultConfig,\n\t\tNode:      defaultNodeConfig(),\n\t\tDashboard: dashboard.DefaultConfig,\n\t}\n\n\t// Load config file.\n\tif file := ctx.GlobalString(configFileFlag.Name); file != \"\" {\n\t\tif err := loadConfig(file, &cfg); err != nil {\n\t\t\tutils.Fatalf(\"%v\", err)\n\t\t}\n\t}\n\n\t// Apply flags.\n\tutils.SetNodeConfig(ctx, &cfg.Node)\n\tstack, err := node.New(&cfg.Node)\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to create the protocol stack: %v\", err)\n\t}\n\tutils.SetSeroConfig(ctx, stack, &cfg.Sero)\n\tif ctx.GlobalIsSet(utils.SeroStatsURLFlag.Name) {\n\t\tcfg.Serostats.URL = ctx.GlobalString(utils.SeroStatsURLFlag.Name)\n\t}\n\n\tutils.SetDashboardConfig(ctx, &cfg.Dashboard)\n\n\treturn stack, cfg\n}\n\nfunc makeFullNode(ctx *cli.Context) *node.Node {\n\tstack, cfg := makeConfigNode(ctx)\n\n\tutils.RegisterEthService(stack, &cfg.Sero)\n\n\tif ctx.GlobalBool(utils.DashboardEnabledFlag.Name) {\n\t\tutils.RegisterDashboardService(stack, &cfg.Dashboard, gitCommit)\n\t}\n\n\treturn stack\n}\n\n// dumpConfig is the dumpconfig command.\nfunc dumpConfig(ctx *cli.Context) error {\n\t_, cfg := makeConfigNode(ctx)\n\tcomment := \"\"\n\n\tif cfg.Sero.Genesis != nil {\n\t\tcfg.Sero.Genesis = nil\n\t\tcomment += \"# Note: this config doesn't contain the genesis block.\\n\\n\"\n\t}\n\n\tout, err := tomlSettings.Marshal(&cfg)\n\tif err != nil {\n\t\treturn err\n\t}\n\tio.WriteString(os.Stdout, comment)\n\tos.Stdout.Write(out)\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/gero/consolecmd.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/console\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nvar (\n\tconsoleFlags = []cli.Flag{utils.JSpathFlag, utils.ExecFlag, utils.PreloadJSFlag}\n\n\tconsoleCommand = cli.Command{\n\t\tAction:   utils.MigrateFlags(localConsole),\n\t\tName:     \"console\",\n\t\tUsage:    \"Start an interactive JavaScript environment\",\n\t\tFlags:    append(append(nodeFlags, rpcFlags...), consoleFlags...),\n\t\tCategory: \"CONSOLE COMMANDS\",\n\t\tDescription: `\nThe Gero console is an interactive shell for the JavaScript runtime environment\nwhich exposes a node admin interface as well as the Ðapp JavaScript API.\nSee https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console.`,\n\t}\n\n\tattachCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(remoteConsole),\n\t\tName:      \"attach\",\n\t\tUsage:     \"Start an interactive JavaScript environment (connect to node)\",\n\t\tArgsUsage: \"[endpoint]\",\n\t\tFlags:     append(consoleFlags, utils.DataDirFlag),\n\t\tCategory:  \"CONSOLE COMMANDS\",\n\t\tDescription: `\nThe Gero console is an interactive shell for the JavaScript runtime environment\nwhich exposes a node admin interface as well as the Ðapp JavaScript API.\nSee https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console.\nThis command allows to open a console on a running gero node.`,\n\t}\n\n\tjavascriptCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(ephemeralConsole),\n\t\tName:      \"js\",\n\t\tUsage:     \"Execute the specified JavaScript files\",\n\t\tArgsUsage: \"<jsfile> [jsfile...]\",\n\t\tFlags:     append(nodeFlags, consoleFlags...),\n\t\tCategory:  \"CONSOLE COMMANDS\",\n\t\tDescription: `\nThe JavaScript VM exposes a node admin interface as well as the Ðapp\nJavaScript API. See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console`,\n\t}\n)\n\n// localConsole starts a new gero node, attaching a JavaScript console to it at the\n// same time.\nfunc localConsole(ctx *cli.Context) error {\n\t// Create and start the node based on the CLI flags\n\tnode := makeFullNode(ctx)\n\tstartNode(ctx, node)\n\tdefer node.Stop()\n\n\t// Attach to the newly started node and start the JavaScript console\n\tclient, err := node.Attach()\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to attach to the inproc gero: %v\", err)\n\t}\n\tconfig := console.Config{\n\t\tDataDir: utils.MakeDataDir(ctx),\n\t\tDocRoot: ctx.GlobalString(utils.JSpathFlag.Name),\n\t\tClient:  client,\n\t\tPreload: utils.MakeConsolePreloads(ctx),\n\t}\n\n\tconsole, err := console.New(config)\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to start the JavaScript console: %v\", err)\n\t}\n\tdefer console.Stop(false)\n\n\t// If only a short execution was requested, evaluate and return\n\tif script := ctx.GlobalString(utils.ExecFlag.Name); script != \"\" {\n\t\tconsole.Evaluate(script)\n\t\treturn nil\n\t}\n\t// Otherwise print the welcome screen and enter interactive mode\n\tconsole.Welcome()\n\tconsole.Interactive()\n\n\treturn nil\n}\n\n// remoteConsole will connect to a remote gero instance, attaching a JavaScript\n// console to it.\nfunc remoteConsole(ctx *cli.Context) error {\n\t// Attach to a remotely running gero instance and start the JavaScript console\n\tendpoint := ctx.Args().First()\n\tif endpoint == \"\" {\n\t\tpath := node.DefaultDataDir()\n\t\tif ctx.GlobalIsSet(utils.DataDirFlag.Name) {\n\t\t\tpath = ctx.GlobalString(utils.DataDirFlag.Name)\n\t\t}\n\t\tif path != \"\" {\n\t\t\tif ctx.GlobalBool(utils.AlphanetFlag.Name) {\n\t\t\t\tpath = filepath.Join(path, \"alpha\")\n\t\t\t} else if ctx.GlobalBool(utils.DeveloperFlag.Name) {\n\t\t\t\tpath = filepath.Join(path, \"dev\")\n\t\t\t}\n\t\t\t//else if ctx.GlobalBool(utils.RinkebyFlag.Name) {\n\t\t\t//\tpath = filepath.Join(path, \"rinkeby\")\n\t\t\t//}\n\t\t}\n\t\tendpoint = fmt.Sprintf(\"%s/gero.ipc\", path)\n\t}\n\tclient, err := dialRPC(endpoint)\n\tif err != nil {\n\t\tutils.Fatalf(\"Unable to attach to remote gero: %v\", err)\n\t}\n\tconfig := console.Config{\n\t\tDataDir: utils.MakeDataDir(ctx),\n\t\tDocRoot: ctx.GlobalString(utils.JSpathFlag.Name),\n\t\tClient:  client,\n\t\tPreload: utils.MakeConsolePreloads(ctx),\n\t}\n\n\tconsole, err := console.New(config)\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to start the JavaScript console: %v\", err)\n\t}\n\tdefer console.Stop(false)\n\n\tif script := ctx.GlobalString(utils.ExecFlag.Name); script != \"\" {\n\t\tconsole.Evaluate(script)\n\t\treturn nil\n\t}\n\n\t// Otherwise print the welcome screen and enter interactive mode\n\tconsole.Welcome()\n\tconsole.Interactive()\n\n\treturn nil\n}\n\n// dialRPC returns a RPC client which connects to the given endpoint.\n// The check for empty endpoint implements the defaulting logic\n// for \"gero attach\" and \"gero monitor\" with no argument.\nfunc dialRPC(endpoint string) (*rpc.Client, error) {\n\tif endpoint == \"\" {\n\t\tendpoint = node.DefaultIPCEndpoint(clientIdentifier)\n\t} else if strings.HasPrefix(endpoint, \"rpc:\") || strings.HasPrefix(endpoint, \"ipc:\") {\n\t\t// Backwards compatibility with gero < 1.5 which required\n\t\t// these prefixes.\n\t\tendpoint = endpoint[4:]\n\t}\n\treturn rpc.Dial(endpoint)\n}\n\n// ephemeralConsole starts a new gero node, attaches an ephemeral JavaScript\n// console to it, executes each of the files specified as arguments and tears\n// everything down.\nfunc ephemeralConsole(ctx *cli.Context) error {\n\t// Create and start the node based on the CLI flags\n\tnode := makeFullNode(ctx)\n\tstartNode(ctx, node)\n\tdefer node.Stop()\n\n\t// Attach to the newly started node and start the JavaScript console\n\tclient, err := node.Attach()\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to attach to the inproc gero: %v\", err)\n\t}\n\tconfig := console.Config{\n\t\tDataDir: utils.MakeDataDir(ctx),\n\t\tDocRoot: ctx.GlobalString(utils.JSpathFlag.Name),\n\t\tClient:  client,\n\t\tPreload: utils.MakeConsolePreloads(ctx),\n\t}\n\n\tconsole, err := console.New(config)\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to start the JavaScript console: %v\", err)\n\t}\n\tdefer console.Stop(false)\n\n\t// Evaluate each of the specified JavaScript files\n\tfor _, file := range ctx.Args() {\n\t\tif err = console.Execute(file); err != nil {\n\t\t\tutils.Fatalf(\"Failed to execute %s: %v\", file, err)\n\t\t}\n\t}\n\t// Wait for pending callbacks, but stop for Ctrl-C.\n\tabort := make(chan os.Signal, 1)\n\tsignal.Notify(abort, syscall.SIGINT, syscall.SIGTERM)\n\n\tgo func() {\n\t\t<-abort\n\t\tos.Exit(0)\n\t}()\n\tconsole.Stop(true)\n\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/gero/main.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\n// gero is the official command-line client for Sero.\npackage main\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\tgodebug \"runtime/debug\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"gopkg.in/urfave/cli.v1\"\n\n\t\"github.com/elastic/gosigar\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/accounts/keystore\"\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/console\"\n\t\"github.com/sero-cash/go-sero/internal/debug\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/sero\"\n)\n\nconst (\n\tclientIdentifier = \"gero\" // Client identifier to advertise over the network\n)\n\nvar (\n\t// Git SHA1 commit hash of the release (set via linker flags)\n\tgitCommit = \"\"\n\t// The app that holds all commands and flags.\n\tapp = utils.NewApp(gitCommit, \"the go-sero command line interface\")\n\t// flags that configure the node\n\tnodeFlags = []cli.Flag{\n\t\tutils.IdentityFlag,\n\t\tutils.UnlockedAccountFlag,\n\t\tutils.PasswordFileFlag,\n\t\tutils.BootnodesFlag,\n\t\tutils.BootnodesV4Flag,\n\t\tutils.BootnodesV5Flag,\n\t\tutils.DataDirFlag,\n\t\tutils.KeyStoreDirFlag,\n\t\tutils.NoUSBFlag,\n\t\tutils.DashboardEnabledFlag,\n\t\tutils.DashboardAddrFlag,\n\t\tutils.DashboardPortFlag,\n\t\tutils.DashboardRefreshFlag,\n\t\tutils.EthashCacheDirFlag,\n\t\tutils.EthashCachesInMemoryFlag,\n\t\tutils.EthashCachesOnDiskFlag,\n\t\tutils.EthashDatasetDirFlag,\n\t\tutils.EthashDatasetsInMemoryFlag,\n\t\tutils.EthashDatasetsOnDiskFlag,\n\t\tutils.TxPoolNoLocalsFlag,\n\t\tutils.TxPoolPriceLimitFlag,\n\t\tutils.TxPoolAccountSlotsFlag,\n\t\tutils.TxPoolGlobalSlotsFlag,\n\t\tutils.TxPoolAccountQueueFlag,\n\t\tutils.TxPoolGlobalQueueFlag,\n\t\tutils.TxPoolLifetimeFlag,\n\t\tutils.SyncModeFlag,\n\t\tutils.GCModeFlag,\n\t\tutils.CacheFlag,\n\t\tutils.CacheDatabaseFlag,\n\t\tutils.CacheGCFlag,\n\t\tutils.TrieCacheGenFlag,\n\t\tutils.ListenPortFlag,\n\t\tutils.MaxPeersFlag,\n\t\tutils.MaxPendingPeersFlag,\n\t\tutils.SerobaseFlag,\n\t\tutils.GasPriceFlag,\n\t\tutils.VThreadsFlag,\n\t\tutils.PThreadsFlag,\n\t\tutils.MinerThreadsFlag,\n\t\tutils.MiningEnabledFlag,\n\t\tutils.MineModeEnabledFlag,\n\t\tutils.TargetGasLimitFlag,\n\t\tutils.NATFlag,\n\t\tutils.NoDiscoverFlag,\n\t\tutils.DiscoveryV5Flag,\n\t\tutils.NetrestrictFlag,\n\t\tutils.NodeKeyFileFlag,\n\t\tutils.NodeKeyHexFlag,\n\t\tutils.DeveloperPeriodFlag,\n\t\tutils.DeveloperPasswordFlag,\n\t\tutils.AlphanetFlag,\n\t\t//utils.RinkebyFlag,\n\t\tutils.ExchangeFlag,\n\t\tutils.ExchangeValueStrFlag,\n\t\tutils.StakeFlag,\n\t\tutils.AutoMergeFlag,\n\t\tutils.ConfirmedBlockFlag,\n\t\tutils.RecordBlockShareNumber,\n\t\tutils.LightNodeFlag,\n\t\tutils.CloseAcceptTx,\n\t\tutils.ResetBlockNumber,\n\n\t\tutils.DeveloperFlag,\n\t\tutils.OfflineFlag,\n\t\tutils.SnapshotFlag,\n\t\tutils.TestStartBlockFlag,\n\t\tutils.TestForkFlag,\n\t\tutils.VMEnableDebugFlag,\n\t\tutils.NetworkIdFlag,\n\t\tutils.RPCCORSDomainFlag,\n\t\tutils.RPCVirtualHostsFlag,\n\t\tutils.SeroStatsURLFlag,\n\t\tutils.MetricsEnabledFlag,\n\t\tutils.FakePoWFlag,\n\t\tutils.NoCompactionFlag,\n\t\tutils.GpoBlocksFlag,\n\t\tutils.GpoPercentileFlag,\n\t\tutils.ExtraDataFlag,\n\t\tconfigFileFlag,\n\t}\n\n\tproofFlags = []cli.Flag{\n\t\tutils.ProofEnabledFlag,\n\t\tutils.ProofMaxThreadFlag,\n\t\tutils.ProofMaxQueueFlag,\n\t\tutils.ProofzinFeeFlag,\n\t\tutils.ProofoinFeeFlag,\n\t\tutils.ProofoutFeeFlag,\n\t\tutils.ProofFixedFeeFlag,\n\t}\n\n\trpcFlags = []cli.Flag{\n\t\tutils.RPCEnabledFlag,\n\t\tutils.RPCListenAddrFlag,\n\t\tutils.RPCPortFlag,\n\t\tutils.RPCApiFlag,\n\t\tutils.RPCRequestContentLength,\n\t\tutils.RPCReadTimeoutFlag,\n\t\tutils.RPCWriteTimeoutFlag,\n\t\tutils.RPCIdleTimeoutFlag,\n\t\tutils.WSEnabledFlag,\n\t\tutils.WSListenAddrFlag,\n\t\tutils.WSPortFlag,\n\t\tutils.WSApiFlag,\n\t\tutils.WSAllowedOriginsFlag,\n\t\tutils.IPCDisabledFlag,\n\t\tutils.IPCPathFlag,\n\t}\n\n\tmetricsFlags = []cli.Flag{\n\t\tutils.MetricsEnableInfluxDBFlag,\n\t\tutils.MetricsInfluxDBEndpointFlag,\n\t\tutils.MetricsInfluxDBDatabaseFlag,\n\t\tutils.MetricsInfluxDBUsernameFlag,\n\t\tutils.MetricsInfluxDBPasswordFlag,\n\t\tutils.MetricsInfluxDBHostTagFlag,\n\t}\n)\n\nfunc init() {\n\t// Initialize the CLI app and start Sero\n\tapp.Action = gero\n\tapp.HideVersion = true // we have a command to print the version\n\tapp.Copyright = \"Copyright 2013-2018 The go-sero Authors\"\n\tapp.Commands = []cli.Command{\n\t\t// See chaincmd.go:\n\t\timportCommand,\n\t\texportCommand,\n\t\timportPreimagesCommand,\n\t\texportPreimagesCommand,\n\t\tcopydbCommand,\n\t\tremovedbCommand,\n\t\t//dumpCommand,\n\t\t// See monitorcmd.go:\n\t\tmonitorCommand,\n\t\t// See accountcmd.go:\n\t\taccountCommand,\n\t\t// See consolecmd.go:\n\t\tconsoleCommand,\n\t\tattachCommand,\n\t\tjavascriptCommand,\n\t\t// See misccmd.go:\n\t\tmakecacheCommand,\n\t\tmakedagCommand,\n\t\tversionCommand,\n\t\tbugCommand,\n\t\tlicenseCommand,\n\t\t// See config.go\n\t\tdumpConfigCommand,\n\t\t// See snapshotcmd.go:\n\t\tsnapshotCommand,\n\t}\n\tsort.Sort(cli.CommandsByName(app.Commands))\n\n\tapp.Flags = append(app.Flags, nodeFlags...)\n\tapp.Flags = append(app.Flags, rpcFlags...)\n\tapp.Flags = append(app.Flags, consoleFlags...)\n\tapp.Flags = append(app.Flags, debug.Flags...)\n\tapp.Flags = append(app.Flags, proofFlags...)\n\tapp.Flags = append(app.Flags, metricsFlags...)\n\n\tapp.Before = func(ctx *cli.Context) error {\n\n\t\tsubCommandName := \"\"\n\n\t\tif len(ctx.Args()) > 0 {\n\t\t\tsubCommandName = ctx.Args()[0]\n\t\t}\n\n\t\tif !strings.EqualFold(subCommandName, \"attach\") && !strings.EqualFold(subCommandName, \"version\") {\n\t\t\tnetType := c_type.NET_Beta\n\t\t\tswitch {\n\t\t\tcase ctx.GlobalBool(utils.AlphanetFlag.Name):\n\t\t\t\tnetType = c_type.NET_Alpha\n\t\t\tcase ctx.GlobalBool(utils.DeveloperFlag.Name):\n\t\t\t\tnetType = c_type.NET_Dev\n\t\t\t}\n\t\t\tsuperzk.ZeroInit(getKeyStore(ctx), netType)\n\n\t\t}\n\n\t\truntime.GOMAXPROCS(runtime.NumCPU())\n\n\t\tlogdir := \"\"\n\t\tif ctx.GlobalBool(utils.DashboardEnabledFlag.Name) {\n\t\t\tlogdir = (&node.Config{DataDir: utils.MakeDataDir(ctx)}).ResolvePath(\"logs\")\n\t\t}\n\t\tif err := debug.Setup(ctx, logdir); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Cap the cache allowance and tune the garbage collector\n\t\tvar mem gosigar.Mem\n\t\tif err := mem.Get(); err == nil {\n\t\t\tallowance := int(mem.Total / 1024 / 1024 / 3)\n\t\t\tif cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance {\n\t\t\t\tlog.Warn(\"Sanitizing cache to Go's GC limits\", \"provided\", cache, \"updated\", allowance)\n\t\t\t\tctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance))\n\t\t\t}\n\t\t}\n\t\t// Ensure Go's GC ignores the database cache for trigger percentage\n\t\tcache := ctx.GlobalInt(utils.CacheFlag.Name)\n\t\tgogc := math.Max(20, math.Min(100, 100/(float64(cache)/1024)))\n\n\t\tlog.Debug(\"Sanitizing Go's GC trigger\", \"percent\", int(gogc))\n\t\tgodebug.SetGCPercent(int(gogc))\n\n\t\t// Start metrics export if enabled\n\t\tutils.SetupMetrics(ctx)\n\n\t\t// Start system runtime metrics collection\n\t\tgo metrics.CollectProcessMetrics(3 * time.Second)\n\n\t\tutils.SetupNetwork(ctx)\n\t\treturn nil\n\t}\n\n\tapp.After = func(ctx *cli.Context) error {\n\t\tdebug.Exit()\n\t\tconsole.Stdin.Close() // Resets terminal mode.\n\t\treturn nil\n\t}\n}\n\nfunc getKeyStore(ctx *cli.Context) string {\n\tdataDir := node.DefaultDataDir()\n\tswitch {\n\tcase ctx.GlobalIsSet(utils.DataDirFlag.Name):\n\t\tdataDir = ctx.GlobalString(utils.DataDirFlag.Name)\n\tcase ctx.GlobalBool(utils.AlphanetFlag.Name):\n\t\tdataDir = filepath.Join(node.DefaultDataDir(), \"alpha\")\n\tcase ctx.GlobalBool(utils.DeveloperFlag.Name):\n\t\tdataDir = filepath.Join(node.DefaultDataDir(), \"dev\")\n\t}\n\tkeyStoreDir := \"\"\n\n\tif ctx.GlobalIsSet(utils.KeyStoreDirFlag.Name) {\n\t\tkeyStoreDir = ctx.GlobalString(utils.KeyStoreDirFlag.Name)\n\t}\n\tvar (\n\t\tkeydir string\n\t)\n\tswitch {\n\tcase filepath.IsAbs(keyStoreDir):\n\t\tkeydir = keyStoreDir\n\tcase dataDir != \"\":\n\t\tif keyStoreDir == \"\" {\n\t\t\tkeydir = filepath.Join(dataDir, \"keystore\")\n\t\t} else {\n\t\t\tkeydir, _ = filepath.Abs(keyStoreDir)\n\t\t}\n\tcase keyStoreDir != \"\":\n\t\tkeydir, _ = filepath.Abs(keyStoreDir)\n\t}\n\n\treturn keydir\n}\n\nvar logo = `\n                            \n                         sssSSssss\n                   sSSSSSSSSSSSSSSSSSSSs\n               sSSSSSSSSSSSSSSSSSSSSSSSSSSs\n             sSSSSSSss               ssSSSSSSs\n          ssSSSSSSs        s sss        sSSSSSSs\n         sSSSSSs     sSSSSSSSSSSSSSSs      sSSSSS\n        sSSSS     +SSSSSSS+        sSSSsss   SSSSSs\n      sSSSSs   sSSSSSSSs   sssSss      SSSS    sSSSS\n      SSSS     SSSSSs     sSSSSSSSSs   sSSSSs   sSSSSs\n    sSSSS    sSSSSSs     SSSSSSSSSSSs   SSSSSs    SSSSs\n    SSSSs    SSSSSS     SSSSSSSSSSSSSs  SSSSSSSs   SSSS\n   SSSSs    SSSSSSs    sSSSSSSSSSSSSSSs SSSSSSSSs  sSSSs\n  sSSSs     SSSSSSs      SSSSSSSSSSSSSssSSSSSSSSSs  +SSSs\n  SSSS      SSSSSSs      sSSSSSSSSS+SSSSSSSSSSSSSS  sSSSS\n sSSSs      SSSSSS         sSSSSSSSSSSsSSSSSSSSSSSs ssSSS\n sSSSs  s   SSSSSSs           SSSSSSSSSSssSSSSSSSSS   SSSs\n SSSS  sS    SSSSSSs             SSSSSSSSSs sSSSSSS   SSSs\n SSSss sSs   sSSSSSSs             ssSSSSSSSS  sSSSS   SSSs\n SSS+s SSS    sSSSSSSS               sSSSSSSS ssSSS   SSSS\n SSSSs sSSSs    sSSSSSSSss             sSSSSSSs SSS   SSSs\n SSSS  sSSSSS     SSSSSSSSSs            sSSSSSSs SS   SSS+\n SSSSs  SSSSSSS     sSSSSSSSSS            SSSSSs ss   SSSs\n  SSS+  sSSSSSSSSSs   sSSSSSSSSSs         SSSSSS ss  +SSS\n  SSSS   SSSSSSSSSSSss   sSSSSSSSs        sSSSSS    sSSSS\n  sSSSs  sSSSSSSSs sSSSs   sSSSSSSs       SSSSSs    sSSSs\n   SSSSs  sSSSSSSs  SSSSSSs sSSSSSSs      SSSSSs   sSSS+\n    SSSS    SSSSS+   SSSSSSSssSSSSSs     sSSSS    sSSSS\n    sSSSS    SSSSS   ssSSSSSSsSSSSss    sSSSSs    SSSS\n      SSSSss   SSSs     SSSSSSSSSs     SSSSS    sSSSSs\n       SSSSs    sSSs      +SSSSS     sSSSSs   ssSSSs\n        sSSSSS    sSSSS           sSSSSs     SSSSSs\n          SSSSS+ss     sSSSSSSSSSSSS      sSSSSSs\n            SSSSSSss                   ssSSSSSSs\n             sSSSSSSSsss           ssSSSSSSSS\n                sSSSSSSSSSSSSSSSSSSSSSSSSSs\n                   ssSSSSSSSSSSSSSSSSSs\n                          rrssssrr\n\n`\n\nfunc main() {\n\tfmt.Println(logo)\n\tif err := app.Run(os.Args); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\tos.Exit(1)\n\t}\n}\n\n// gero is the main entry point into the system if no special subcommand is ran.\n// It creates a default node based on the command line arguments and runs it in\n// blocking mode, waiting for it to be shut down.\nfunc gero(ctx *cli.Context) error {\n\tif args := ctx.Args(); len(args) > 0 {\n\t\treturn fmt.Errorf(\"invalid command: %q\", args[0])\n\t}\n\tnode := makeFullNode(ctx)\n\tstartNode(ctx, node)\n\tnode.Wait()\n\treturn nil\n}\n\n// startNode boots up the system node and all registered protocols, after which\n// it unlocks any requested accounts, and starts the RPC/IPC interfaces and the\n// miner.\nfunc startNode(ctx *cli.Context, stack *node.Node) {\n\n\tdebug.Memsize.Add(\"node\", stack)\n\n\t// Start up the node itself\n\tutils.StartNode(stack)\n\n\t// Unlock any account specifically requested\n\tks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)\n\n\tif seroparam.Is_Dev() && ctx.GlobalString(utils.DeveloperPasswordFlag.Name) != \"\" {\n\t\tfor _, wallet := range ks.Wallets() {\n\t\t\terr := ks.Unlock(wallet.Accounts()[0], ctx.GlobalString(utils.DeveloperPasswordFlag.Name))\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"unclock %v failed,%v\", wallet.Accounts()[0].Address.String(), err)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tpasswords := utils.MakePasswordList(ctx)\n\t\tunlocks := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), \",\")\n\t\tfor i, account := range unlocks {\n\t\t\tif trimmed := strings.TrimSpace(account); trimmed != \"\" {\n\t\t\t\tunlockAccount(ctx, ks, trimmed, i, passwords)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Register wallet event handlers to open and auto-derive wallets\n\tevents := make(chan accounts.WalletEvent, 16)\n\tstack.AccountManager().Subscribe(events)\n\n\tgo func() {\n\t\t// Create a chain state reader for self-derivation\n\t\t//rpcClient, err := stack.Attach()\n\t\t//if err != nil {\n\t\t//\tutils.Fatalf(\"Failed to attach to self: %v\", err)\n\t\t//}\n\t\t//stateReader := seroclient.NewClient(rpcClient)\n\n\t\t// Open any wallets already attached\n\t\tfor _, wallet := range stack.AccountManager().Wallets() {\n\t\t\tif err := wallet.Open(\"\"); err != nil {\n\t\t\t\tlog.Warn(\"Failed to open wallet\", \"url\", wallet.URL(), \"err\", err)\n\t\t\t}\n\t\t}\n\t\t// Listen for wallet event till termination\n\t\tfor event := range events {\n\t\t\tswitch event.Kind {\n\t\t\tcase accounts.WalletArrived:\n\t\t\t\tif err := event.Wallet.Open(\"\"); err != nil {\n\t\t\t\t\tlog.Warn(\"New wallet appeared, failed to open\", \"url\", event.Wallet.URL(), \"err\", err)\n\t\t\t\t}\n\n\t\t\tcase accounts.WalletDropped:\n\t\t\t\tlog.Info(\"Old wallet dropped\", \"url\", event.Wallet.URL())\n\t\t\t\tevent.Wallet.Close()\n\t\t\t}\n\t\t}\n\t}()\n\t// Start auxiliary services if enabled\n\tif ctx.GlobalBool(utils.MiningEnabledFlag.Name) {\n\t\t// Mining only makes sense if a full Sero node is running\n\t\tif ctx.GlobalString(utils.SyncModeFlag.Name) == \"light\" {\n\t\t\tutils.Fatalf(\"Light clients do not support mining\")\n\t\t}\n\t\tvar sero *sero.Sero\n\t\tif err := stack.Service(&sero); err != nil {\n\t\t\tutils.Fatalf(\"Sero service not running: %v\", err)\n\t\t}\n\t\t// Use a reduced number of threads if requested\n\t\tif threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 {\n\t\t\ttype threaded interface {\n\t\t\t\tSetThreads(threads int)\n\t\t\t}\n\t\t\tif th, ok := sero.Engine().(threaded); ok {\n\t\t\t\tth.SetThreads(threads)\n\t\t\t}\n\t\t}\n\t\t// Set the gas price to the limits from the CLI and start mining\n\t\tsero.TxPool().SetGasPrice(utils.GlobalBig(ctx, utils.GasPriceFlag.Name))\n\t\tif err := sero.StartMining(true); err != nil {\n\t\t\tutils.Fatalf(\"Failed to start mining: %v\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "cmd/gero/misccmd.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/sero\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nvar (\n\tmakecacheCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(makecache),\n\t\tName:      \"makecache\",\n\t\tUsage:     \"Generate ethash verification cache (for testing)\",\n\t\tArgsUsage: \"<blockNum> <outputDir>\",\n\t\tCategory:  \"MISCELLANEOUS COMMANDS\",\n\t\tDescription: `\nThe makecache command generates an ethash cache in <outputDir>.\n\nThis command exists to support the system testing project.\nRegular users do not need to execute it.\n`,\n\t}\n\tmakedagCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(makedag),\n\t\tName:      \"makedag\",\n\t\tUsage:     \"Generate ethash mining DAG (for testing)\",\n\t\tArgsUsage: \"<blockNum> <outputDir>\",\n\t\tCategory:  \"MISCELLANEOUS COMMANDS\",\n\t\tDescription: `\nThe makedag command generates an ethash DAG in <outputDir>.\n\nThis command exists to support the system testing project.\nRegular users do not need to execute it.\n`,\n\t}\n\tversionCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(version),\n\t\tName:      \"version\",\n\t\tUsage:     \"Print version numbers\",\n\t\tArgsUsage: \" \",\n\t\tCategory:  \"MISCELLANEOUS COMMANDS\",\n\t\tDescription: `\nThe output of this command is supposed to be machine-readable.\n`,\n\t}\n\tlicenseCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(license),\n\t\tName:      \"license\",\n\t\tUsage:     \"Display license information\",\n\t\tArgsUsage: \" \",\n\t\tCategory:  \"MISCELLANEOUS COMMANDS\",\n\t}\n)\n\n// makecache generates an ethash verification cache into the provided folder.\nfunc makecache(ctx *cli.Context) error {\n\targs := ctx.Args()\n\tif len(args) != 2 {\n\t\tutils.Fatalf(`Usage: gero makecache <block number> <outputdir>`)\n\t}\n\tblock, err := strconv.ParseUint(args[0], 0, 64)\n\tif err != nil {\n\t\tutils.Fatalf(\"Invalid block number: %v\", err)\n\t}\n\tethash.MakeCache(block, args[1])\n\n\treturn nil\n}\n\n// makedag generates an ethash mining DAG into the provided folder.\nfunc makedag(ctx *cli.Context) error {\n\targs := ctx.Args()\n\tif len(args) != 2 {\n\t\tutils.Fatalf(`Usage: gero makedag <block number> <outputdir>`)\n\t}\n\tblock, err := strconv.ParseUint(args[0], 0, 64)\n\tif err != nil {\n\t\tutils.Fatalf(\"Invalid block number: %v\", err)\n\t}\n\tethash.MakeDataset(block, args[1])\n\n\treturn nil\n}\n\nfunc version(ctx *cli.Context) error {\n\tfmt.Println(strings.Title(clientIdentifier))\n\tfmt.Println(\"Version:\", params.VersionWithMeta)\n\tif gitCommit != \"\" {\n\t\tfmt.Println(\"Git Commit:\", gitCommit)\n\t}\n\tfmt.Println(\"Architecture:\", runtime.GOARCH)\n\tfmt.Println(\"Protocol Versions:\", sero.ProtocolVersions)\n\tfmt.Println(\"Network Id:\", sero.DefaultConfig.NetworkId)\n\tfmt.Println(\"Go Version:\", runtime.Version())\n\tfmt.Println(\"Operating System:\", runtime.GOOS)\n\tfmt.Printf(\"GOPATH=%s\\n\", os.Getenv(\"GOPATH\"))\n\tfmt.Printf(\"GOROOT=%s\\n\", runtime.GOROOT())\n\treturn nil\n}\n\nfunc license(_ *cli.Context) error {\n\tfmt.Println(`Gero is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nGero is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with gero. If not, see <http://www.gnu.org/licenses/>.`)\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/gero/monitorcmd.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gizak/termui\"\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nvar (\n\tmonitorCommandAttachFlag = cli.StringFlag{\n\t\tName:  \"attach\",\n\t\tValue: node.DefaultIPCEndpoint(clientIdentifier),\n\t\tUsage: \"API endpoint to attach to\",\n\t}\n\tmonitorCommandRowsFlag = cli.IntFlag{\n\t\tName:  \"rows\",\n\t\tValue: 5,\n\t\tUsage: \"Maximum rows in the chart grid\",\n\t}\n\tmonitorCommandRefreshFlag = cli.IntFlag{\n\t\tName:  \"refresh\",\n\t\tValue: 3,\n\t\tUsage: \"Refresh interval in seconds\",\n\t}\n\tmonitorCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(monitor), // keep track of migration progress\n\t\tName:      \"monitor\",\n\t\tUsage:     \"Monitor and visualize node metrics\",\n\t\tArgsUsage: \" \",\n\t\tCategory:  \"MONITOR COMMANDS\",\n\t\tDescription: `\nThe Gero monitor is a tool to collect and visualize various internal metrics\ngathered by the node, supporting different chart types as well as the capacity\nto display multiple metrics simultaneously.\n`,\n\t\tFlags: []cli.Flag{\n\t\t\tmonitorCommandAttachFlag,\n\t\t\tmonitorCommandRowsFlag,\n\t\t\tmonitorCommandRefreshFlag,\n\t\t},\n\t}\n)\n\n// monitor starts a terminal UI based monitoring tool for the requested metrics.\nfunc monitor(ctx *cli.Context) error {\n\tvar (\n\t\tclient *rpc.Client\n\t\terr    error\n\t)\n\t// Attach to an Ethereum node over IPC or RPC\n\tendpoint := ctx.String(monitorCommandAttachFlag.Name)\n\tif client, err = dialRPC(endpoint); err != nil {\n\t\tutils.Fatalf(\"Unable to attach to gero node: %v\", err)\n\t}\n\tdefer client.Close()\n\n\t// Retrieve all the available metrics and resolve the user pattens\n\tmetrics, err := retrieveMetrics(client)\n\tif err != nil {\n\t\tutils.Fatalf(\"Failed to retrieve system metrics: %v\", err)\n\t}\n\tmonitored := resolveMetrics(metrics, ctx.Args())\n\tif len(monitored) == 0 {\n\t\tlist := expandMetrics(metrics, \"\")\n\t\tsort.Strings(list)\n\n\t\tif len(list) > 0 {\n\t\t\tutils.Fatalf(\"No metrics specified.\\n\\nAvailable:\\n - %s\", strings.Join(list, \"\\n - \"))\n\t\t} else {\n\t\t\tutils.Fatalf(\"No metrics collected by gero (--%s).\\n\", utils.MetricsEnabledFlag.Name)\n\t\t}\n\t}\n\tsort.Strings(monitored)\n\tif cols := len(monitored) / ctx.Int(monitorCommandRowsFlag.Name); cols > 6 {\n\t\tutils.Fatalf(\"Requested metrics (%d) spans more that 6 columns:\\n - %s\", len(monitored), strings.Join(monitored, \"\\n - \"))\n\t}\n\t// Create and configure the chart UI defaults\n\tif err := termui.Init(); err != nil {\n\t\tutils.Fatalf(\"Unable to initialize terminal UI: %v\", err)\n\t}\n\tdefer termui.Close()\n\n\trows := len(monitored)\n\tif max := ctx.Int(monitorCommandRowsFlag.Name); rows > max {\n\t\trows = max\n\t}\n\tcols := (len(monitored) + rows - 1) / rows\n\tfor i := 0; i < rows; i++ {\n\t\ttermui.Body.AddRows(termui.NewRow())\n\t}\n\t// Create each individual data chart\n\tfooter := termui.NewPar(\"\")\n\tfooter.Block.Border = true\n\tfooter.Height = 3\n\n\tcharts := make([]*termui.LineChart, len(monitored))\n\tunits := make([]int, len(monitored))\n\tdata := make([][]float64, len(monitored))\n\tfor i := 0; i < len(monitored); i++ {\n\t\tcharts[i] = createChart((termui.TermHeight() - footer.Height) / rows)\n\t\trow := termui.Body.Rows[i%rows]\n\t\trow.Cols = append(row.Cols, termui.NewCol(12/cols, 0, charts[i]))\n\t}\n\ttermui.Body.AddRows(termui.NewRow(termui.NewCol(12, 0, footer)))\n\n\trefreshCharts(client, monitored, data, units, charts, ctx, footer)\n\ttermui.Body.Align()\n\ttermui.Render(termui.Body)\n\n\t// Watch for various system events, and periodically refresh the charts\n\ttermui.Handle(\"/sys/kbd/C-c\", func(termui.Event) {\n\t\ttermui.StopLoop()\n\t})\n\ttermui.Handle(\"/sys/wnd/resize\", func(termui.Event) {\n\t\ttermui.Body.Width = termui.TermWidth()\n\t\tfor _, chart := range charts {\n\t\t\tchart.Height = (termui.TermHeight() - footer.Height) / rows\n\t\t}\n\t\ttermui.Body.Align()\n\t\ttermui.Render(termui.Body)\n\t})\n\tgo func() {\n\t\ttick := time.NewTicker(time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second)\n\t\tfor range tick.C {\n\t\t\tif refreshCharts(client, monitored, data, units, charts, ctx, footer) {\n\t\t\t\ttermui.Body.Align()\n\t\t\t}\n\t\t\ttermui.Render(termui.Body)\n\t\t}\n\t}()\n\ttermui.Loop()\n\treturn nil\n}\n\n// retrieveMetrics contacts the attached gero node and retrieves the entire set\n// of collected system metrics.\nfunc retrieveMetrics(client *rpc.Client) (map[string]interface{}, error) {\n\tvar metrics map[string]interface{}\n\terr := client.Call(&metrics, \"debug_metrics\", true)\n\treturn metrics, err\n}\n\n// resolveMetrics takes a list of input metric patterns, and resolves each to one\n// or more canonical metric names.\nfunc resolveMetrics(metrics map[string]interface{}, patterns []string) []string {\n\tres := []string{}\n\tfor _, pattern := range patterns {\n\t\tres = append(res, resolveMetric(metrics, pattern, \"\")...)\n\t}\n\treturn res\n}\n\n// resolveMetrics takes a single of input metric pattern, and resolves it to one\n// or more canonical metric names.\nfunc resolveMetric(metrics map[string]interface{}, pattern string, path string) []string {\n\tresults := []string{}\n\n\t// If a nested metric was requested, recurse optionally branching (via comma)\n\tparts := strings.SplitN(pattern, \"/\", 2)\n\tif len(parts) > 1 {\n\t\tfor _, variation := range strings.Split(parts[0], \",\") {\n\t\t\tsubmetrics, ok := metrics[variation].(map[string]interface{})\n\t\t\tif !ok {\n\t\t\t\tutils.Fatalf(\"Failed to retrieve system metrics: %s\", path+variation)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tresults = append(results, resolveMetric(submetrics, parts[1], path+variation+\"/\")...)\n\t\t}\n\t\treturn results\n\t}\n\t// Depending what the last link is, return or expand\n\tfor _, variation := range strings.Split(pattern, \",\") {\n\t\tswitch metric := metrics[variation].(type) {\n\t\tcase float64:\n\t\t\t// Final metric value found, return as singleton\n\t\t\tresults = append(results, path+variation)\n\n\t\tcase map[string]interface{}:\n\t\t\tresults = append(results, expandMetrics(metric, path+variation+\"/\")...)\n\n\t\tdefault:\n\t\t\tutils.Fatalf(\"Metric pattern resolved to unexpected type: %v\", reflect.TypeOf(metric))\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn results\n}\n\n// expandMetrics expands the entire tree of metrics into a flat list of paths.\nfunc expandMetrics(metrics map[string]interface{}, path string) []string {\n\t// Iterate over all fields and expand individually\n\tlist := []string{}\n\tfor name, metric := range metrics {\n\t\tswitch metric := metric.(type) {\n\t\tcase float64:\n\t\t\t// Final metric value found, append to list\n\t\t\tlist = append(list, path+name)\n\n\t\tcase map[string]interface{}:\n\t\t\t// Tree of metrics found, expand recursively\n\t\t\tlist = append(list, expandMetrics(metric, path+name+\"/\")...)\n\n\t\tdefault:\n\t\t\tutils.Fatalf(\"Metric pattern %s resolved to unexpected type: %v\", path+name, reflect.TypeOf(metric))\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn list\n}\n\n// fetchMetric iterates over the metrics map and retrieves a specific one.\nfunc fetchMetric(metrics map[string]interface{}, metric string) float64 {\n\tparts := strings.Split(metric, \"/\")\n\tfor _, part := range parts[:len(parts)-1] {\n\t\tvar found bool\n\t\tmetrics, found = metrics[part].(map[string]interface{})\n\t\tif !found {\n\t\t\treturn 0\n\t\t}\n\t}\n\tif v, ok := metrics[parts[len(parts)-1]].(float64); ok {\n\t\treturn v\n\t}\n\treturn 0\n}\n\n// refreshCharts retrieves a next batch of metrics, and inserts all the new\n// values into the active datasets and charts\nfunc refreshCharts(client *rpc.Client, metrics []string, data [][]float64, units []int, charts []*termui.LineChart, ctx *cli.Context, footer *termui.Par) (realign bool) {\n\tvalues, err := retrieveMetrics(client)\n\tfor i, metric := range metrics {\n\t\tif len(data) < 512 {\n\t\t\tdata[i] = append([]float64{fetchMetric(values, metric)}, data[i]...)\n\t\t} else {\n\t\t\tdata[i] = append([]float64{fetchMetric(values, metric)}, data[i][:len(data[i])-1]...)\n\t\t}\n\t\tif updateChart(metric, data[i], &units[i], charts[i], err) {\n\t\t\trealign = true\n\t\t}\n\t}\n\tupdateFooter(ctx, err, footer)\n\treturn\n}\n\n// updateChart inserts a dataset into a line chart, scaling appropriately as to\n// not display weird labels, also updating the chart label accordingly.\nfunc updateChart(metric string, data []float64, base *int, chart *termui.LineChart, err error) (realign bool) {\n\tdataUnits := []string{\"\", \"K\", \"M\", \"G\", \"T\", \"E\"}\n\ttimeUnits := []string{\"ns\", \"µs\", \"ms\", \"s\", \"ks\", \"ms\"}\n\tcolors := []termui.Attribute{termui.ColorBlue, termui.ColorCyan, termui.ColorGreen, termui.ColorYellow, termui.ColorRed, termui.ColorRed}\n\n\t// Extract only part of the data that's actually visible\n\tif chart.Width*2 < len(data) {\n\t\tdata = data[:chart.Width*2]\n\t}\n\t// Find the maximum value and scale under 1K\n\thigh := 0.0\n\tif len(data) > 0 {\n\t\thigh = data[0]\n\t\tfor _, value := range data[1:] {\n\t\t\thigh = math.Max(high, value)\n\t\t}\n\t}\n\tunit, scale := 0, 1.0\n\tfor high >= 1000 && unit+1 < len(dataUnits) {\n\t\thigh, unit, scale = high/1000, unit+1, scale*1000\n\t}\n\t// If the unit changes, re-create the chart (hack to set max height...)\n\tif unit != *base {\n\t\trealign, *base, *chart = true, unit, *createChart(chart.Height)\n\t}\n\t// Update the chart's data points with the scaled values\n\tif cap(chart.Data) < len(data) {\n\t\tchart.Data = make([]float64, len(data))\n\t}\n\tchart.Data = chart.Data[:len(data)]\n\tfor i, value := range data {\n\t\tchart.Data[i] = value / scale\n\t}\n\t// Update the chart's label with the scale units\n\tunits := dataUnits\n\tif strings.Contains(metric, \"/Percentiles/\") || strings.Contains(metric, \"/pauses/\") || strings.Contains(metric, \"/time/\") {\n\t\tunits = timeUnits\n\t}\n\tchart.BorderLabel = metric\n\tif len(units[unit]) > 0 {\n\t\tchart.BorderLabel += \" [\" + units[unit] + \"]\"\n\t}\n\tchart.LineColor = colors[unit] | termui.AttrBold\n\tif err != nil {\n\t\tchart.LineColor = termui.ColorRed | termui.AttrBold\n\t}\n\treturn\n}\n\n// createChart creates an empty line chart with the default configs.\nfunc createChart(height int) *termui.LineChart {\n\tchart := termui.NewLineChart()\n\tif runtime.GOOS == \"windows\" {\n\t\tchart.Mode = \"dot\"\n\t}\n\tchart.DataLabels = []string{\"\"}\n\tchart.Height = height\n\tchart.AxesColor = termui.ColorWhite\n\tchart.PaddingBottom = -2\n\n\tchart.BorderLabelFg = chart.BorderFg | termui.AttrBold\n\tchart.BorderFg = chart.BorderBg\n\n\treturn chart\n}\n\n// updateFooter updates the footer contents based on any encountered errors.\nfunc updateFooter(ctx *cli.Context, err error, footer *termui.Par) {\n\t// Generate the basic footer\n\trefresh := time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second\n\tfooter.Text = fmt.Sprintf(\"Press Ctrl+C to quit. Refresh interval: %v.\", refresh)\n\tfooter.TextFgColor = termui.ThemeAttr(\"par.fg\") | termui.AttrBold\n\n\t// Append any encountered errors\n\tif err != nil {\n\t\tfooter.Text = fmt.Sprintf(\"Error: %v.\", err)\n\t\tfooter.TextFgColor = termui.ColorRed | termui.AttrBold\n\t}\n}\n"
  },
  {
    "path": "cmd/gero/snapshotcmd.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/zero/snapshot\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nvar (\n\tsnapshotCommand = cli.Command{\n\t\tAction:    utils.MigrateFlags(makeSnapshot),\n\t\tName:      \"snapshot\",\n\t\tUsage:     \"Create snapshot from a target chaindata folder\",\n\t\tArgsUsage: \"<targetChaindataDir>\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DataDirFlag,\n\t\t},\n\t\tCategory: \"BLOCKCHAIN COMMANDS\",\n\t\tDescription: `\nThe first argument must be the directory containing the blockchain to download from`,\n\t}\n)\n\nfunc makeSnapshot(ctx *cli.Context) error {\n\n\tif len(ctx.Args()) != 1 {\n\t\tutils.Fatalf(\"target chaindata directory path argument missing\")\n\t}\n\n\tstack, _:= makeConfigNode(ctx)\n\n\tsrcDb:=stack.ResolvePath(\"chaindata\")\n\ttarDb:=ctx.Args().First()\n\n\tfmt.Printf(\"%s ----> %s\\n\",srcDb,tarDb)\n\n\tif sg,err:=snapshot.NewSnapshotGen(srcDb,tarDb);err!=nil {\n\t\tprintln(\"Make snapshot error:\",err.Error())\n\t} else {\n\t\tsg.Run()\n\t\tsg.Close()\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/gero/testdata/empty.js",
    "content": "\n"
  },
  {
    "path": "cmd/gero/testdata/guswallet.json",
    "content": "{\n  \"encseed\": \"26d87f5f2bf9835f9a47eefae571bc09f9107bb13d54ff12a4ec095d01f83897494cf34f7bed2ed34126ecba9db7b62de56c9d7cd136520a0427bfb11b8954ba7ac39b90d4650d3448e31185affcd74226a68f1e94b1108e6e0a4a91cdd83eba\",\n  \"ethaddr\": \"d4584b5f6229b7be90727b0fc8c6b91bb427821f\",\n  \"email\": \"gustav.simonsson@gmail.com\",\n  \"btcaddr\": \"1EVknXyFC68kKNLkh6YnKzW41svSRoaAcx\"\n}\n"
  },
  {
    "path": "cmd/gero/testdata/passwords.txt",
    "content": "foobar\nfoobar\nfoobar\n"
  },
  {
    "path": "cmd/gero/testdata/wrong-passwords.txt",
    "content": "wrong\nwrong\nwrong\n"
  },
  {
    "path": "cmd/gero/usage.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the gero command usage template and generator.\n\npackage main\n\nimport (\n\t\"io\"\n\t\"sort\"\n\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/cmd/utils\"\n\t\"github.com/sero-cash/go-sero/internal/debug\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\n// AppHelpTemplate is the test template for the default, global app help topic.\nvar AppHelpTemplate = `NAME:\n   {{.App.Name}} - {{.App.Usage}}\n\n   Copyright 2013-2018 The go-sero Authors\n\nUSAGE:\n   {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}}\n   {{if .App.Version}}\nVERSION:\n   {{.App.Version}}\n   {{end}}{{if len .App.Authors}}\nAUTHOR(S):\n   {{range .App.Authors}}{{ . }}{{end}}\n   {{end}}{{if .App.Commands}}\nCOMMANDS:\n   {{range .App.Commands}}{{join .Names \", \"}}{{ \"\\t\" }}{{.Usage}}\n   {{end}}{{end}}{{if .FlagGroups}}\n{{range .FlagGroups}}{{.Name}} OPTIONS:\n  {{range .Flags}}{{.}}\n  {{end}}\n{{end}}{{end}}{{if .App.Copyright }}\nCOPYRIGHT:\n   {{.App.Copyright}}\n   {{end}}\n`\n\n// flagGroup is a collection of flags belonging to a single topic.\ntype flagGroup struct {\n\tName  string\n\tFlags []cli.Flag\n}\n\n// AppHelpFlagGroups is the application flags, grouped by functionality.\nvar AppHelpFlagGroups = []flagGroup{\n\t{\n\t\tName: \"SERO\",\n\t\tFlags: []cli.Flag{\n\t\t\tconfigFileFlag,\n\t\t\tutils.DataDirFlag,\n\t\t\tutils.KeyStoreDirFlag,\n\t\t\tutils.NetworkIdFlag,\n\t\t\tutils.AlphanetFlag,\n\t\t\tutils.DeveloperFlag,\n\t\t\tutils.SyncModeFlag,\n\t\t\tutils.SeroStatsURLFlag,\n\t\t\tutils.IdentityFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"DEVELOPER CHAIN\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.DeveloperPeriodFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"ETHASH\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.EthashCacheDirFlag,\n\t\t\tutils.EthashCachesInMemoryFlag,\n\t\t\tutils.EthashCachesOnDiskFlag,\n\t\t\tutils.EthashDatasetDirFlag,\n\t\t\tutils.EthashDatasetsInMemoryFlag,\n\t\t\tutils.EthashDatasetsOnDiskFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"TRANSACTION POOL\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.TxPoolNoLocalsFlag,\n\t\t\tutils.TxPoolPriceLimitFlag,\n\t\t\tutils.TxPoolAccountSlotsFlag,\n\t\t\tutils.TxPoolGlobalSlotsFlag,\n\t\t\tutils.TxPoolAccountQueueFlag,\n\t\t\tutils.TxPoolGlobalQueueFlag,\n\t\t\tutils.TxPoolLifetimeFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"PERFORMANCE TUNING\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.CacheFlag,\n\t\t\tutils.CacheDatabaseFlag,\n\t\t\tutils.CacheGCFlag,\n\t\t\tutils.TrieCacheGenFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"ACCOUNT\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.UnlockedAccountFlag,\n\t\t\tutils.PasswordFileFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"API AND CONSOLE\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.RPCEnabledFlag,\n\t\t\tutils.RPCListenAddrFlag,\n\t\t\tutils.RPCPortFlag,\n\t\t\tutils.RPCApiFlag,\n\t\t\tutils.RPCReadTimeoutFlag,\n\t\t\tutils.RPCWriteTimeoutFlag,\n\t\t\tutils.RPCIdleTimeoutFlag,\n\t\t\tutils.WSEnabledFlag,\n\t\t\tutils.WSListenAddrFlag,\n\t\t\tutils.WSPortFlag,\n\t\t\tutils.WSApiFlag,\n\t\t\tutils.WSAllowedOriginsFlag,\n\t\t\tutils.IPCDisabledFlag,\n\t\t\tutils.IPCPathFlag,\n\t\t\tutils.RPCCORSDomainFlag,\n\t\t\tutils.RPCVirtualHostsFlag,\n\t\t\tutils.JSpathFlag,\n\t\t\tutils.ExecFlag,\n\t\t\tutils.PreloadJSFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"NETWORKING\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.BootnodesFlag,\n\t\t\tutils.BootnodesV4Flag,\n\t\t\tutils.BootnodesV5Flag,\n\t\t\tutils.ListenPortFlag,\n\t\t\tutils.MaxPeersFlag,\n\t\t\tutils.MaxPendingPeersFlag,\n\t\t\tutils.NATFlag,\n\t\t\tutils.NoDiscoverFlag,\n\t\t\tutils.DiscoveryV5Flag,\n\t\t\tutils.NetrestrictFlag,\n\t\t\tutils.NodeKeyFileFlag,\n\t\t\tutils.NodeKeyHexFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"MINER\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.MiningEnabledFlag,\n\t\t\tutils.MinerThreadsFlag,\n\t\t\tutils.SerobaseFlag,\n\t\t\tutils.TargetGasLimitFlag,\n\t\t\tutils.GasPriceFlag,\n\t\t\tutils.ExtraDataFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"GAS PRICE ORACLE\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.GpoBlocksFlag,\n\t\t\tutils.GpoPercentileFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"VIRTUAL MACHINE\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.VMEnableDebugFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"LOGGING AND DEBUGGING\",\n\t\tFlags: append([]cli.Flag{\n\t\t\tutils.FakePoWFlag,\n\t\t\tutils.NoCompactionFlag,\n\t\t}, debug.Flags...),\n\t},\n\t{\n\t\tName: \"METRICS AND STATS\",\n\t\tFlags: []cli.Flag{\n\t\t\tutils.MetricsEnabledFlag,\n\t\t\tutils.MetricsEnableInfluxDBFlag,\n\t\t\tutils.MetricsInfluxDBEndpointFlag,\n\t\t\tutils.MetricsInfluxDBDatabaseFlag,\n\t\t\tutils.MetricsInfluxDBUsernameFlag,\n\t\t\tutils.MetricsInfluxDBPasswordFlag,\n\t\t\tutils.MetricsInfluxDBHostTagFlag,\n\t\t},\n\t},\n\t{\n\t\tName: \"MISC\",\n\t},\n}\n\n// byCategory sorts an array of flagGroup by Name in the order\n// defined in AppHelpFlagGroups.\ntype byCategory []flagGroup\n\nfunc (a byCategory) Len() int      { return len(a) }\nfunc (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] }\nfunc (a byCategory) Less(i, j int) bool {\n\tiCat, jCat := a[i].Name, a[j].Name\n\tiIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last\n\n\tfor i, group := range AppHelpFlagGroups {\n\t\tif iCat == group.Name {\n\t\t\tiIdx = i\n\t\t}\n\t\tif jCat == group.Name {\n\t\t\tjIdx = i\n\t\t}\n\t}\n\n\treturn iIdx < jIdx\n}\n\nfunc flagCategory(flag cli.Flag) string {\n\tfor _, category := range AppHelpFlagGroups {\n\t\tfor _, flg := range category.Flags {\n\t\t\tif flg.GetName() == flag.GetName() {\n\t\t\t\treturn category.Name\n\t\t\t}\n\t\t}\n\t}\n\treturn \"MISC\"\n}\n\nfunc init() {\n\t// Override the default app help template\n\tcli.AppHelpTemplate = AppHelpTemplate\n\n\t// Define a one shot struct to pass to the usage template\n\ttype helpData struct {\n\t\tApp        interface{}\n\t\tFlagGroups []flagGroup\n\t}\n\n\t// Override the default app help printer, but only for the global app help\n\toriginalHelpPrinter := cli.HelpPrinter\n\tcli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) {\n\t\tif tmpl == AppHelpTemplate {\n\t\t\t// Iterate over all the flags and add any uncategorized ones\n\t\t\tcategorized := make(map[string]struct{})\n\t\t\tfor _, group := range AppHelpFlagGroups {\n\t\t\t\tfor _, flag := range group.Flags {\n\t\t\t\t\tcategorized[flag.String()] = struct{}{}\n\t\t\t\t}\n\t\t\t}\n\t\t\tuncategorized := []cli.Flag{}\n\t\t\tfor _, flag := range data.(*cli.App).Flags {\n\t\t\t\tif _, ok := categorized[flag.String()]; !ok {\n\t\t\t\t\tif strings.HasPrefix(flag.GetName(), \"dashboard\") {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tuncategorized = append(uncategorized, flag)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif len(uncategorized) > 0 {\n\t\t\t\t// Append all ungategorized options to the misc group\n\t\t\t\tmiscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags)\n\t\t\t\tAppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...)\n\n\t\t\t\t// Make sure they are removed afterwards\n\t\t\t\tdefer func() {\n\t\t\t\t\tAppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs]\n\t\t\t\t}()\n\t\t\t}\n\t\t\t// Render out custom usage screen\n\t\t\toriginalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups})\n\t\t} else if tmpl == utils.CommandHelpTemplate {\n\t\t\t// Iterate over all command specific flags and categorize them\n\t\t\tcategorized := make(map[string][]cli.Flag)\n\t\t\tfor _, flag := range data.(cli.Command).Flags {\n\t\t\t\tif _, ok := categorized[flag.String()]; !ok {\n\t\t\t\t\tcategorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// sort to get a stable ordering\n\t\t\tsorted := make([]flagGroup, 0, len(categorized))\n\t\t\tfor cat, flgs := range categorized {\n\t\t\t\tsorted = append(sorted, flagGroup{cat, flgs})\n\t\t\t}\n\t\t\tsort.Sort(byCategory(sorted))\n\n\t\t\t// add sorted array to data and render with default printer\n\t\t\toriginalHelpPrinter(w, tmpl, map[string]interface{}{\n\t\t\t\t\"cmd\":              data,\n\t\t\t\t\"categorizedFlags\": sorted,\n\t\t\t})\n\t\t} else {\n\t\t\toriginalHelpPrinter(w, tmpl, data)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "cmd/internal/browser/browser.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package browser provides utilities for interacting with users' browsers.\npackage browser\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"runtime\"\n)\n\n// Commands returns a list of possible commands to use to open a url.\nfunc Commands() [][]string {\n\tvar cmds [][]string\n\tif exe := os.Getenv(\"BROWSER\"); exe != \"\" {\n\t\tcmds = append(cmds, []string{exe})\n\t}\n\tswitch runtime.GOOS {\n\tcase \"darwin\":\n\t\tcmds = append(cmds, []string{\"/usr/bin/open\"})\n\tcase \"windows\":\n\t\tcmds = append(cmds, []string{\"cmd\", \"/c\", \"start\"})\n\tdefault:\n\t\tcmds = append(cmds, []string{\"xdg-open\"})\n\t}\n\tcmds = append(cmds,\n\t\t[]string{\"chrome\"},\n\t\t[]string{\"google-chrome\"},\n\t\t[]string{\"chromium\"},\n\t\t[]string{\"firefox\"},\n\t)\n\treturn cmds\n}\n\n// Open tries to open url in a browser and reports whether it succeeded.\nfunc Open(url string) bool {\n\tfor _, args := range Commands() {\n\t\tcmd := exec.Command(args[0], append(args[1:], url)...)\n\t\tif cmd.Start() == nil {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "cmd/proofnode/main.go",
    "content": "package main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/internal/ethapi\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/zero/proofservice\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nfunc main() {\n\truntime.GOMAXPROCS(runtime.NumCPU())\n\tendpoint := flag.String(\"addr\", \":9765\", \"listen address\")\n\trpc, config, tomeOut := initConfig()\n\tif err := startNode(*endpoint, rpc, config, tomeOut); err != nil {\n\t\tos.Exit(0)\n\t}\n\tselect {}\n}\n\nfunc startNode(endpoint, rpcAddr string, config *proofservice.Config, timeout rpc.HTTPTimeouts) error {\n\tif endpoint == \"\" {\n\t\treturn nil\n\t}\n\tproofservice.NewProofService(rpcAddr, nil, config)\n\n\tapis := []rpc.API{\n\t\t{\n\t\t\tNamespace: \"proof\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   ethapi.NewProofServiceApi(),\n\t\t\tPublic:    true,\n\t\t}}\n\n\t_, _, err := rpc.StartHTTPEndpoint(endpoint, apis, []string{\"proof\"}, []string{}, []string{}, timeout)\n\tif err != nil {\n\t\treturn err\n\t}\n\tlog.Printf(\"HTTP endpoint opened, url %s\", fmt.Sprintf(\"http://%s\", endpoint))\n\treturn nil\n}\n\nfunc initConfig() (string, *proofservice.Config, rpc.HTTPTimeouts) {\n\n\tvar (\n\t\tmaxWorkNumber  = flag.Int(\"maxWorkNumber\", 10, \"max work count\")\n\t\tmaxQueueNumber = flag.Int(\"maxQueueNumber\", 20, \"max work pending count\")\n\t\treadTimeout    = flag.Duration(\"readTimeout\", 120*time.Second, \"readTimeout\")\n\t\twriteTimeout   = flag.Duration(\"writeTimeout\", 120*time.Second, \"writeTimeout\")\n\t\tidleTimeout    = flag.Duration(\"idleTimeout\", 180*time.Second, \"idleTimeout\")\n\n\t\trpcAddr = flag.String(\"rpcAddr\", \"127.0.0.1:8545\", \"idleTimeout\")\n\n\t\tzinFee   = flag.String(\"zinFee\", \"0sero\", \"zinFee\")\n\t\toinFee   = flag.String(\"oinFee\", \"0sero\", \"oinFee\")\n\t\toutFee   = flag.String(\"outFee\", \"0sero\", \"outFee\")\n\t\tfixedFee = flag.String(\"fee\", \"0sero\", \"outFee\")\n\n\t\tpkrString = flag.String(\"pkr\", \"0sero\", \"outFee\")\n\n\t\t// endpoint = flag.String(\"redis\", \"127.0.0.1:6379\", \"redis endpoint\")\n\t\t// password = flag.String(\"password\", \"\", \"redis password\")\n\t\t// database = flag.Int64(\"database\", 0, \"redis database\")\n\t\t// poolSize = flag.Int(\"poolSize\", 10, \"redis poolSize\")\n\t)\n\n\tif strings.TrimSpace(*pkrString) == \"\" {\n\t\tpanic(\"pkr is empty\")\n\t}\n\n\tzinFeeAmount, err := utils.ParseAmount(*zinFee)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\toinFeeAmount, err := utils.ParseAmount(*oinFee)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\toutFeeAmount, err := utils.ParseAmount(*outFee)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfixedFeeAmount, err := utils.ParseAmount(*fixedFee)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tpkr := c_type.NewPKrByBytes(base58.Decode(*pkrString))\n\ttimeout := rpc.HTTPTimeouts{*readTimeout, *writeTimeout, *idleTimeout}\n\tfee := proofservice.ServiceFee{zinFeeAmount, oinFeeAmount, outFeeAmount, fixedFeeAmount}\n\treturn *rpcAddr, &proofservice.Config{pkr, *maxWorkNumber, *maxQueueNumber, fee}, timeout\n}\n"
  },
  {
    "path": "cmd/tx/confirm.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/generate/generate_1\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nfunc Confirm(key_str string, out_str string) {\n\tstdin := bufio.NewReader(os.Stdin)\n\tif len(key_str) == 0 {\n\t\tfmt.Println(\"input key:\")\n\t\tvar err error\n\t\tkey_str, err = stdin.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tOUTPUT_ERROR(\"TK READ ERROR\", nil)\n\t\t\treturn\n\t\t}\n\t\tkey_str = strings.Trim(key_str, \"\\n\")\n\t\tfmt.Println(key_str)\n\t}\n\tif len(out_str) == 0 {\n\t\tfmt.Println(\"input out:\")\n\t\tvar err error\n\t\tout_str, err = stdin.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tOUTPUT_ERROR(\"OUT READ ERROR\", nil)\n\t\t\treturn\n\t\t}\n\t\tout_str = strings.Trim(out_str, \"\\n\")\n\t\tfmt.Println(out_str)\n\t}\n\n\tkey_str = strings.Trim(key_str, \"'\")\n\tout_str = strings.Trim(out_str, \"'\")\n\n\tif key_str[1] != 'x' {\n\t\tkey_str = \"0x\" + key_str\n\t}\n\tif key_bs, e := hexutil.Decode(key_str); e == nil {\n\t\tif len(key_bs) == 32 {\n\t\t\tkey := c_type.Uint256{}\n\t\t\tcopy(key[:], key_bs)\n\t\t\tif strings.Contains(out_str, \"\\\"OutCM\\\":\") {\n\t\t\t\tvar out stx_v0.Out_Z\n\t\t\t\tif e := json.Unmarshal([]byte(out_str), &out); e == nil {\n\t\t\t\t\tif dout := generate_1.ConfirmOutZ(&key, true, &out); dout != nil {\n\t\t\t\t\t\tif dout_bs, e := json.Marshal(dout); e == nil {\n\t\t\t\t\t\t\tOUTPUT_RESULT(string(dout_bs))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tOUTPUT_ERROR(\"Marshal-\", e)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tOUTPUT_ERROR(\"Confirm OutZ Failed\", nil)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tOUTPUT_ERROR(\"Out_Z Unmarshal-\", e)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar out stx_v1.Out_C\n\t\t\t\tif e := json.Unmarshal([]byte(out_str), &out); e == nil {\n\t\t\t\t\tif dout, _ := generate_1.ConfirmOutC(&key, &out); dout != nil {\n\t\t\t\t\t\tif dout_bs, e := json.Marshal(dout); e == nil {\n\t\t\t\t\t\t\tOUTPUT_RESULT(string(dout_bs))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tOUTPUT_ERROR(\"Out_C Marshal-\", e)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tOUTPUT_ERROR(\"Out_C Unmarshal-\", e)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tOUTPUT_ERROR(\"key must 32 bytes\", nil)\n\t\t}\n\t} else {\n\t\tOUTPUT_ERROR(\"KeyDecode-\", e)\n\t}\n}\n"
  },
  {
    "path": "cmd/tx/dec.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nfunc Dec(tk_str string, out_str string) {\n\tstdin := bufio.NewReader(os.Stdin)\n\tif len(tk_str) == 0 {\n\t\tfmt.Println(\"input tk:\")\n\t\tvar err error\n\t\ttk_str, err = stdin.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tOUTPUT_ERROR(\"TK READ ERROR\", nil)\n\t\t\treturn\n\t\t}\n\t\ttk_str = strings.Trim(tk_str, \"\\n\")\n\t\tfmt.Println(tk_str)\n\t}\n\tif len(out_str) == 0 {\n\t\tfmt.Println(\"input out:\")\n\t\tvar err error\n\t\tout_str, err = stdin.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tOUTPUT_ERROR(\"OUT READ ERROR\", nil)\n\t\t\treturn\n\t\t}\n\t\tout_str = strings.Trim(out_str, \"\\n\")\n\t\tfmt.Println(out_str)\n\t}\n\n\ttk_str = strings.Trim(tk_str, \"'\")\n\tout_str = strings.Trim(out_str, \"'\")\n\n\tif tk_str[1] != 'x' {\n\t\ttk_str = \"0x\" + tk_str\n\t}\n\tif tk_bs, e := hexutil.Decode(tk_str); e == nil {\n\t\tif len(tk_bs) == 64 {\n\t\t\ttk := c_type.Tk{}\n\t\t\tcopy(tk[:], tk_bs)\n\t\t\tvar outs []txtool.Out\n\t\t\tif e := json.Unmarshal([]byte(out_str), &outs); e == nil {\n\t\t\t\tdouts := flight.DecOut(&tk, outs)\n\t\t\t\tif douts_bs, e := json.Marshal(douts); e == nil {\n\t\t\t\t\tOUTPUT_RESULT(string(douts_bs))\n\t\t\t\t} else {\n\t\t\t\t\tOUTPUT_ERROR(\"Marshal-\", e)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tOUTPUT_ERROR(\"Unmarshal-\", e)\n\t\t\t}\n\t\t} else {\n\t\t\tOUTPUT_ERROR(\"tk must 64 bytes\", nil)\n\t\t}\n\t} else {\n\t\tOUTPUT_ERROR(\"TKDecode-\", e)\n\t}\n}\n"
  },
  {
    "path": "cmd/tx/main.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"runtime\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n)\n\nvar method = \"\"\nvar txParam = \"\"\nvar sk = \"\"\nvar tk = \"\"\nvar out = \"\"\nvar key = \"\"\n\nfunc init() {\n\tflag.StringVar(&method, \"method\", \"\", \"tx method\")\n\tflag.StringVar(&txParam, \"tx\", \"\", \"txparam for sign\")\n\tflag.StringVar(&sk, \"sk\", \"\", \"sk for sign\")\n\tflag.StringVar(&tk, \"tk\", \"\", \"tk for dec\")\n\tflag.StringVar(&out, \"out\", \"\", \"out for dec\")\n}\n\nfunc OUTPUT_RESULT(result interface{}) {\n\tfmt.Println(\"[OUTPUT-BEGIN]\", result)\n}\n\nfunc OUTPUT_ERROR(result interface{}, e error) {\n\tfmt.Println(\"[OUTPUT-BEGIN] ERROR:\", result, e)\n}\n\nfunc main() {\n\tseroparam.InitExchangeValueStr(true)\n\truntime.GOMAXPROCS(runtime.NumCPU())\n\tfmt.Printf(\"PThread: %v \\n\", zconfig.G_p_thread_num)\n\tflag.Parse()\n\n\tif method == \"sign\" {\n\t\tsuperzk.ZeroInit_OnlyInOuts()\n\t\tSign(sk, txParam)\n\t\treturn\n\t}\n\tif method == \"dec\" {\n\t\tsuperzk.ZeroInit_NoCircuit()\n\t\tDec(tk, out)\n\t\treturn\n\t}\n\tif method == \"confirm\" {\n\t\tsuperzk.ZeroInit_NoCircuit()\n\t\tConfirm(key, out)\n\t\treturn\n\t}\n\tOUTPUT_ERROR(\"METHOD-MUST-[sign,dec,confirm]\", nil)\n}\n"
  },
  {
    "path": "cmd/tx/sign.go",
    "content": "package main\n\nimport (\n\t\"bufio\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n)\n\nfunc Sign(sk string, txParam string) {\n\tstdin := bufio.NewReader(os.Stdin)\n\tif len(sk) == 0 {\n\t\tfmt.Println(\"input sk:\")\n\t\tvar err error\n\t\tsk, err = stdin.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tOUTPUT_ERROR(\"SK READ ERROR\", nil)\n\t\t\treturn\n\t\t}\n\t\tsk = strings.Trim(sk, \"\\n\")\n\t\tfmt.Println(sk)\n\t}\n\n\tif len(txParam) == 0 {\n\t\tfmt.Println(\"input txParam:\")\n\t\tvar err error\n\t\ttxParam, err = stdin.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tOUTPUT_ERROR(\"TXPARAM READ ERROR\", nil)\n\t\t\treturn\n\t\t}\n\t\ttxParam = strings.Trim(txParam, \"\\n\")\n\t\tfmt.Println(txParam)\n\t}\n\n\tsk = strings.Trim(sk, \"'\")\n\ttxParam = strings.Trim(txParam, \"'\")\n\n\tsk_bytes := c_type.Uint512{}\n\tif sk[1] != 'x' {\n\t\tsk = \"0x\" + sk\n\t}\n\tif bs, e := hexutil.Decode(sk); e != nil {\n\t\tOUTPUT_ERROR(\"DecodeSK-\", e)\n\t} else {\n\t\tcopy(sk_bytes[:], bs)\n\t\tif len(txParam) > 0 && len(sk) > 0 {\n\t\t\tvar gtp txtool.GTxParam\n\t\t\tif e := json.Unmarshal([]byte(txParam), &gtp); e != nil {\n\t\t\t\tOUTPUT_ERROR(\"Unmarshal-\", e)\n\t\t\t} else {\n\t\t\t\tif gtx, e := flight.SignTx(&sk_bytes, &gtp); e != nil {\n\t\t\t\t\tOUTPUT_ERROR(\"SignTx-\", e)\n\t\t\t\t} else {\n\t\t\t\t\tif jtx, e := json.Marshal(&gtx); e != nil {\n\t\t\t\t\t\tOUTPUT_ERROR(\"Marshal-\", e)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tOUTPUT_RESULT(string(jtx))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tOUTPUT_ERROR(\"Input params invalid\", nil)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "cmd/utils/cmd.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\n// Package utils contains internal helper functions for go-sero commands.\npackage utils\n\nimport (\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/signal\"\n\t\"runtime\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/internal/debug\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nconst (\n\timportBatchSize = 2500\n)\n\n// Fatalf formats a message to standard error and exits the program.\n// The message is also printed to standard output if standard error\n// is redirected to a different file.\nfunc Fatalf(format string, args ...interface{}) {\n\tw := io.MultiWriter(os.Stdout, os.Stderr)\n\tif runtime.GOOS == \"windows\" {\n\t\t// The SameFile check below doesn't work on Windows.\n\t\t// stdout is unlikely to get redirected though, so just print there.\n\t\tw = os.Stdout\n\t} else {\n\t\toutf, _ := os.Stdout.Stat()\n\t\terrf, _ := os.Stderr.Stat()\n\t\tif outf != nil && errf != nil && os.SameFile(outf, errf) {\n\t\t\tw = os.Stderr\n\t\t}\n\t}\n\tfmt.Fprintf(w, \"Fatal: \"+format+\"\\n\", args...)\n\tos.Exit(1)\n}\n\nfunc StartNode(stack *node.Node) {\n\tif err := stack.Start(); err != nil {\n\t\tFatalf(\"Error starting protocol stack: %v\", err)\n\t}\n\tgo func() {\n\t\tsigc := make(chan os.Signal, 1)\n\t\tsignal.Notify(sigc, syscall.SIGINT, syscall.SIGTERM)\n\t\tdefer signal.Stop(sigc)\n\t\t<-sigc\n\t\tlog.Info(\"Got interrupt, shutting down...\")\n\t\tgo stack.Stop()\n\t\tfor i := 10; i > 0; i-- {\n\t\t\t<-sigc\n\t\t\tif i > 1 {\n\t\t\t\tlog.Warn(\"Already shutting down, interrupt more to panic.\", \"times\", i-1)\n\t\t\t}\n\t\t}\n\t\tdebug.Exit() // ensure trace and CPU profile data is flushed.\n\t\tdebug.LoudPanic(\"boom\")\n\t}()\n}\n\nfunc ImportChain(chain *core.BlockChain, fn string) error {\n\t// Watch for Ctrl-C while the import is running.\n\t// If a signal is received, the import will stop at the next batch.\n\tinterrupt := make(chan os.Signal, 1)\n\tstop := make(chan struct{})\n\tsignal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM)\n\tdefer signal.Stop(interrupt)\n\tdefer close(interrupt)\n\tgo func() {\n\t\tif _, ok := <-interrupt; ok {\n\t\t\tlog.Info(\"Interrupted during import, stopping at next batch\")\n\t\t}\n\t\tclose(stop)\n\t}()\n\tcheckInterrupt := func() bool {\n\t\tselect {\n\t\tcase <-stop:\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t}\n\n\tlog.Info(\"Importing blockchain\", \"file\", fn)\n\n\t// Open the file handle and potentially unwrap the gzip stream\n\tfh, err := os.Open(fn)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer fh.Close()\n\n\tvar reader io.Reader = fh\n\tif strings.HasSuffix(fn, \".gz\") {\n\t\tif reader, err = gzip.NewReader(reader); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tstream := rlp.NewStream(reader, 0)\n\n\t// Run actual the import.\n\tblocks := make(types.Blocks, importBatchSize)\n\tn := 0\n\tfor batch := 0; ; batch++ {\n\t\t// Load a batch of RLP blocks.\n\t\tif checkInterrupt() {\n\t\t\treturn fmt.Errorf(\"interrupted\")\n\t\t}\n\t\ti := 0\n\t\tfor ; i < importBatchSize; i++ {\n\t\t\tvar b types.Block\n\t\t\tif err := stream.Decode(&b); err == io.EOF {\n\t\t\t\tbreak\n\t\t\t} else if err != nil {\n\t\t\t\treturn fmt.Errorf(\"at block %d: %v\", n, err)\n\t\t\t}\n\t\t\t// don't import first block\n\t\t\tif b.NumberU64() == 0 {\n\t\t\t\ti--\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tblocks[i] = &b\n\t\t\tn++\n\t\t}\n\t\tif i == 0 {\n\t\t\tbreak\n\t\t}\n\t\t// Import the batch.\n\t\tif checkInterrupt() {\n\t\t\treturn fmt.Errorf(\"interrupted\")\n\t\t}\n\t\tmissing := missingBlocks(chain, blocks[:i])\n\t\tif len(missing) == 0 {\n\t\t\tlog.Info(\"Skipping batch as all blocks present\", \"batch\", batch, \"first\", blocks[0].Hash(), \"last\", blocks[i-1].Hash())\n\t\t\tcontinue\n\t\t}\n\t\tif _, err := chain.InsertChain(missing); err != nil {\n\t\t\treturn fmt.Errorf(\"invalid block %d: %v\", n, err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc missingBlocks(chain *core.BlockChain, blocks []*types.Block) []*types.Block {\n\thead := chain.CurrentBlock()\n\tfor i, block := range blocks {\n\t\t// If we're behind the chain head, only check block, state is available at head\n\t\tif head.NumberU64() > block.NumberU64() {\n\t\t\tif !chain.HasBlock(block.Hash(), block.NumberU64()) {\n\t\t\t\treturn blocks[i:]\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\t// If we're above the chain head, state availability is a must\n\t\tif !chain.HasBlockAndState(block.Hash(), block.NumberU64()) {\n\t\t\treturn blocks[i:]\n\t\t}\n\t}\n\treturn nil\n}\n\n// ExportChain exports a blockchain into the specified file, truncating any data\n// already present in the file.\nfunc ExportChain(blockchain *core.BlockChain, fn string) error {\n\tlog.Info(\"Exporting blockchain\", \"file\", fn)\n\n\t// Open the file handle and potentially wrap with a gzip stream\n\tfh, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer fh.Close()\n\n\tvar writer io.Writer = fh\n\tif strings.HasSuffix(fn, \".gz\") {\n\t\twriter = gzip.NewWriter(writer)\n\t\tdefer writer.(*gzip.Writer).Close()\n\t}\n\t// Iterate over the blocks and export them\n\tif err := blockchain.Export(writer); err != nil {\n\t\treturn err\n\t}\n\tlog.Info(\"Exported blockchain\", \"file\", fn)\n\n\treturn nil\n}\n\n// ExportAppendChain exports a blockchain into the specified file, appending to\n// the file if data already exists in it.\nfunc ExportAppendChain(blockchain *core.BlockChain, fn string, first uint64, last uint64) error {\n\tlog.Info(\"Exporting blockchain\", \"file\", fn)\n\n\t// Open the file handle and potentially wrap with a gzip stream\n\tfh, err := os.OpenFile(fn, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModePerm)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer fh.Close()\n\n\tvar writer io.Writer = fh\n\tif strings.HasSuffix(fn, \".gz\") {\n\t\twriter = gzip.NewWriter(writer)\n\t\tdefer writer.(*gzip.Writer).Close()\n\t}\n\t// Iterate over the blocks and export them\n\tif err := blockchain.ExportN(writer, first, last); err != nil {\n\t\treturn err\n\t}\n\tlog.Info(\"Exported blockchain to\", \"file\", fn)\n\treturn nil\n}\n\n// ImportPreimages imports a batch of exported hash preimages into the database.\nfunc ImportPreimages(db *serodb.LDBDatabase, fn string) error {\n\tlog.Info(\"Importing preimages\", \"file\", fn)\n\n\t// Open the file handle and potentially unwrap the gzip stream\n\tfh, err := os.Open(fn)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer fh.Close()\n\n\tvar reader io.Reader = fh\n\tif strings.HasSuffix(fn, \".gz\") {\n\t\tif reader, err = gzip.NewReader(reader); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tstream := rlp.NewStream(reader, 0)\n\n\t// Import the preimages in batches to prevent disk trashing\n\tpreimages := make(map[common.Hash][]byte)\n\n\tfor {\n\t\t// Read the next entry and ensure it's not junk\n\t\tvar blob []byte\n\n\t\tif err := stream.Decode(&blob); err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\t// Accumulate the preimages and flush when enough ws gathered\n\t\tpreimages[crypto.Keccak256Hash(blob)] = common.CopyBytes(blob)\n\t\tif len(preimages) > 1024 {\n\t\t\trawdb.WritePreimages(db, 0, preimages)\n\t\t\tpreimages = make(map[common.Hash][]byte)\n\t\t}\n\t}\n\t// Flush the last batch preimage data\n\tif len(preimages) > 0 {\n\t\trawdb.WritePreimages(db, 0, preimages)\n\t}\n\treturn nil\n}\n\n// ExportPreimages exports all known hash preimages into the specified file,\n// truncating any data already present in the file.\nfunc ExportPreimages(db *serodb.LDBDatabase, fn string) error {\n\tlog.Info(\"Exporting preimages\", \"file\", fn)\n\n\t// Open the file handle and potentially wrap with a gzip stream\n\tfh, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer fh.Close()\n\n\tvar writer io.Writer = fh\n\tif strings.HasSuffix(fn, \".gz\") {\n\t\twriter = gzip.NewWriter(writer)\n\t\tdefer writer.(*gzip.Writer).Close()\n\t}\n\t// Iterate over the preimages and export them\n\tit := db.NewIteratorWithPrefix([]byte(\"secure-key-\"))\n\tfor it.Next() {\n\t\tif err := rlp.Encode(writer, it.Value()); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tlog.Info(\"Exported preimages\", \"file\", fn)\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/utils/customflags.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\npackage utils\n\nimport (\n\t\"encoding\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"os\"\n\t\"os/user\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\n// Custom type which is registered in the flags library which cli uses for\n// argument parsing. This allows us to expand Value to an absolute path when\n// the argument is parsed\ntype DirectoryString struct {\n\tValue string\n}\n\nfunc (self *DirectoryString) String() string {\n\treturn self.Value\n}\n\nfunc (self *DirectoryString) Set(value string) error {\n\tself.Value = expandPath(value)\n\treturn nil\n}\n\n// Custom cli.Flag type which expand the received string to an absolute path.\n// e.g. ~/.ethereum -> /home/username/.ethereum\ntype DirectoryFlag struct {\n\tName  string\n\tValue DirectoryString\n\tUsage string\n}\n\nfunc (self DirectoryFlag) String() string {\n\tfmtString := \"%s %v\\t%v\"\n\tif len(self.Value.Value) > 0 {\n\t\tfmtString = \"%s \\\"%v\\\"\\t%v\"\n\t}\n\treturn fmt.Sprintf(fmtString, prefixedNames(self.Name), self.Value.Value, self.Usage)\n}\n\nfunc eachName(longName string, fn func(string)) {\n\tparts := strings.Split(longName, \",\")\n\tfor _, name := range parts {\n\t\tname = strings.Trim(name, \" \")\n\t\tfn(name)\n\t}\n}\n\n// called by cli library, grabs variable from environment (if in env)\n// and adds variable to flag set for parsing.\nfunc (self DirectoryFlag) Apply(set *flag.FlagSet) {\n\teachName(self.Name, func(name string) {\n\t\tset.Var(&self.Value, self.Name, self.Usage)\n\t})\n}\n\ntype TextMarshaler interface {\n\tencoding.TextMarshaler\n\tencoding.TextUnmarshaler\n}\n\n// textMarshalerVal turns a TextMarshaler into a flag.Value\ntype textMarshalerVal struct {\n\tv TextMarshaler\n}\n\nfunc (v textMarshalerVal) String() string {\n\tif v.v == nil {\n\t\treturn \"\"\n\t}\n\ttext, _ := v.v.MarshalText()\n\treturn string(text)\n}\n\nfunc (v textMarshalerVal) Set(s string) error {\n\treturn v.v.UnmarshalText([]byte(s))\n}\n\n// TextMarshalerFlag wraps a TextMarshaler value.\ntype TextMarshalerFlag struct {\n\tName  string\n\tValue TextMarshaler\n\tUsage string\n}\n\nfunc (f TextMarshalerFlag) GetName() string {\n\treturn f.Name\n}\n\nfunc (f TextMarshalerFlag) String() string {\n\treturn fmt.Sprintf(\"%s \\\"%v\\\"\\t%v\", prefixedNames(f.Name), f.Value, f.Usage)\n}\n\nfunc (f TextMarshalerFlag) Apply(set *flag.FlagSet) {\n\teachName(f.Name, func(name string) {\n\t\tset.Var(textMarshalerVal{f.Value}, f.Name, f.Usage)\n\t})\n}\n\n// GlobalTextMarshaler returns the value of a TextMarshalerFlag from the global flag set.\nfunc GlobalTextMarshaler(ctx *cli.Context, name string) TextMarshaler {\n\tval := ctx.GlobalGeneric(name)\n\tif val == nil {\n\t\treturn nil\n\t}\n\treturn val.(textMarshalerVal).v\n}\n\n// BigFlag is a command line flag that accepts 256 bit big integers in decimal or\n// hexadecimal syntax.\ntype BigFlag struct {\n\tName  string\n\tValue *big.Int\n\tUsage string\n}\n\n// bigValue turns *big.Int into a flag.Value\ntype bigValue big.Int\n\nfunc (b *bigValue) String() string {\n\tif b == nil {\n\t\treturn \"\"\n\t}\n\treturn (*big.Int)(b).String()\n}\n\nfunc (b *bigValue) Set(s string) error {\n\tint, ok := math.ParseBig256(s)\n\tif !ok {\n\t\treturn errors.New(\"invalid integer syntax\")\n\t}\n\t*b = (bigValue)(*int)\n\treturn nil\n}\n\nfunc (f BigFlag) GetName() string {\n\treturn f.Name\n}\n\nfunc (f BigFlag) String() string {\n\tfmtString := \"%s %v\\t%v\"\n\tif f.Value != nil {\n\t\tfmtString = \"%s \\\"%v\\\"\\t%v\"\n\t}\n\treturn fmt.Sprintf(fmtString, prefixedNames(f.Name), f.Value, f.Usage)\n}\n\nfunc (f BigFlag) Apply(set *flag.FlagSet) {\n\teachName(f.Name, func(name string) {\n\t\tset.Var((*bigValue)(f.Value), f.Name, f.Usage)\n\t})\n}\n\n// GlobalBig returns the value of a BigFlag from the global flag set.\nfunc GlobalBig(ctx *cli.Context, name string) *big.Int {\n\tval := ctx.GlobalGeneric(name)\n\tif val == nil {\n\t\treturn nil\n\t}\n\treturn (*big.Int)(val.(*bigValue))\n}\n\nfunc prefixFor(name string) (prefix string) {\n\tif len(name) == 1 {\n\t\tprefix = \"-\"\n\t} else {\n\t\tprefix = \"--\"\n\t}\n\n\treturn\n}\n\nfunc prefixedNames(fullName string) (prefixed string) {\n\tparts := strings.Split(fullName, \",\")\n\tfor i, name := range parts {\n\t\tname = strings.Trim(name, \" \")\n\t\tprefixed += prefixFor(name) + name\n\t\tif i < len(parts)-1 {\n\t\t\tprefixed += \", \"\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self DirectoryFlag) GetName() string {\n\treturn self.Name\n}\n\nfunc (self *DirectoryFlag) Set(value string) {\n\tself.Value.Value = value\n}\n\n// Expands a file path\n// 1. replace tilde with users home dir\n// 2. expands embedded environment variables\n// 3. cleans the path, e.g. /a/b/../c -> /a/c\n// Note, it has limitations, e.g. ~someuser/tmp will not be expanded\nfunc expandPath(p string) string {\n\tif strings.HasPrefix(p, \"~/\") || strings.HasPrefix(p, \"~\\\\\") {\n\t\tif home := homeDir(); home != \"\" {\n\t\t\tp = home + p[1:]\n\t\t}\n\t}\n\treturn path.Clean(os.ExpandEnv(p))\n}\n\nfunc homeDir() string {\n\tif home := os.Getenv(\"HOME\"); home != \"\" {\n\t\treturn home\n\t}\n\tif usr, err := user.Current(); err == nil {\n\t\treturn usr.HomeDir\n\t}\n\treturn \"\"\n}\n"
  },
  {
    "path": "cmd/utils/flags.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of go-ethereum.\n//\n// go-ethereum 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// go-ethereum 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 go-ethereum. If not, see <http://www.gnu.org/licenses/>.\n\n// Package utils contains internal helper functions for go-sero commands.\npackage utils\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gopkg.in/urfave/cli.v1\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\n\t\"github.com/sero-cash/go-sero/zero/proofservice\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/accounts/keystore\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/fdlimit\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/dashboard\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/metrics/influxdb\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/discv5\"\n\t\"github.com/sero-cash/go-sero/p2p/nat\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/sero\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/sero/gasprice\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nvar (\n\tCommandHelpTemplate = `{{.cmd.Name}}{{if .cmd.Subcommands}} command{{end}}{{if .cmd.Flags}} [command options]{{end}} [arguments...]\n{{if .cmd.Description}}{{.cmd.Description}}\n{{end}}{{if .cmd.Subcommands}}\nSUBCOMMANDS:\n\t{{range .cmd.Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ \"\\t\" }}{{.Usage}}\n\t{{end}}{{end}}{{if .categorizedFlags}}\n{{range $idx, $categorized := .categorizedFlags}}{{$categorized.Name}} OPTIONS:\n{{range $categorized.Flags}}{{\"\\t\"}}{{.}}\n{{end}}\n{{end}}{{end}}`\n)\n\nfunc init() {\n\tcli.AppHelpTemplate = `{{.Name}} {{if .Flags}}[global options] {{end}}command{{if .Flags}} [command options]{{end}} [arguments...]\n\nVERSION:\n   {{.Version}}\n\nCOMMANDS:\n   {{range .Commands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ \"\\t\" }}{{.Usage}}\n   {{end}}{{if .Flags}}\nGLOBAL OPTIONS:\n   {{range .Flags}}{{.}}\n   {{end}}{{end}}\n`\n\n\tcli.CommandHelpTemplate = CommandHelpTemplate\n}\n\n// NewApp creates an app with sane defaults.\nfunc NewApp(gitCommit, usage string) *cli.App {\n\tapp := cli.NewApp()\n\tapp.Name = filepath.Base(os.Args[0])\n\tapp.Author = \"\"\n\t// app.Authors = nil\n\tapp.Email = \"\"\n\tapp.Version = params.VersionWithMeta\n\tif len(gitCommit) >= 8 {\n\t\tapp.Version += \"-\" + gitCommit[:8]\n\t}\n\tapp.Usage = usage\n\treturn app\n}\n\n// These are all the command line flags we support.\n// If you add to this list, please remember to include the\n// flag in the appropriate command definition.\n//\n// The flags are defined here so their names and help texts\n// are the same for all commands.\n\nvar (\n\t// General settings\n\tDataDirFlag = DirectoryFlag{\n\t\tName:  \"datadir\",\n\t\tUsage: \"Data directory for the databases and keystore\",\n\t\tValue: DirectoryString{node.DefaultDataDir()},\n\t}\n\tKeyStoreDirFlag = DirectoryFlag{\n\t\tName:  \"keystore\",\n\t\tUsage: \"Directory for the keystore (default = inside the datadir)\",\n\t}\n\tNoUSBFlag = cli.BoolFlag{\n\t\tName:  \"nousb\",\n\t\tUsage: \"Disables monitoring for and managing USB hardware wallets\",\n\t}\n\tNetworkIdFlag = cli.Uint64Flag{\n\t\tName:  \"networkid\",\n\t\tUsage: \"Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby)\",\n\t\tValue: sero.DefaultConfig.NetworkId,\n\t}\n\tAlphanetFlag = cli.BoolFlag{\n\t\tName:  \"alpha\",\n\t\tUsage: \"Ropsten network: pre-configured proof-of-work test network\",\n\t}\n\tDeveloperFlag = cli.BoolFlag{\n\t\tName:  \"dev\",\n\t\tUsage: \"Dev network: pre-configured proof-of-work in development network\",\n\t}\n\tOfflineFlag = cli.BoolFlag{\n\t\tName:  \"offline\",\n\t\tUsage: \"Use gero as the offline mode\",\n\t}\n\tSnapshotFlag = cli.Uint64Flag{\n\t\tName:  \"snapshot\",\n\t\tUsage: \"Use for create chaindata snapshot\",\n\t}\n\n\tTestStartBlockFlag = cli.Uint64Flag{\n\t\tName:  \"testStartBlock\",\n\t\tUsage: \"test from startBlock\",\n\t}\n\n\tTestForkFlag = cli.BoolFlag{\n\t\tName:  \"testFork\",\n\t\tUsage: \"test fork start\",\n\t}\n\n\tDeveloperPasswordFlag = cli.StringFlag{\n\t\tName:  \"devpassword\",\n\t\tUsage: \"devpassword to use create and unlock dev account\",\n\t}\n\tDeveloperPeriodFlag = cli.IntFlag{\n\t\tName:  \"dev.period\",\n\t\tUsage: \"Block period to use in developer mode (0 = mine only if transaction pending)\",\n\t}\n\tIdentityFlag = cli.StringFlag{\n\t\tName:  \"identity\",\n\t\tUsage: \"Custom node name\",\n\t}\n\tDocRootFlag = DirectoryFlag{\n\t\tName:  \"docroot\",\n\t\tUsage: \"Document Root for HTTPClient file scheme\",\n\t\tValue: DirectoryString{homeDir()},\n\t}\n\tdefaultSyncMode = sero.DefaultConfig.SyncMode\n\tSyncModeFlag    = TextMarshalerFlag{\n\t\tName:  \"syncmode\",\n\t\tUsage: `Blockchain sync mode (\"fast\", \"full\", or \"light\")`,\n\t\tValue: &defaultSyncMode,\n\t}\n\t// Dashboard settings\n\tDashboardEnabledFlag = cli.BoolFlag{\n\t\tName:  metrics.DashboardEnabledFlag,\n\t\tUsage: \"Enable the dashboard\",\n\t}\n\tGCModeFlag = cli.StringFlag{\n\t\tName:  \"gcmode\",\n\t\tUsage: `Blockchain garbage collection mode (\"full\", \"archive\")`,\n\t\tValue: \"full\",\n\t}\n\tDashboardAddrFlag = cli.StringFlag{\n\t\tName:  \"dashboard.addr\",\n\t\tUsage: \"Dashboard listening interface\",\n\t\tValue: dashboard.DefaultConfig.Host,\n\t}\n\tDashboardPortFlag = cli.IntFlag{\n\t\tName:  \"dashboard.host\",\n\t\tUsage: \"Dashboard listening port\",\n\t\tValue: dashboard.DefaultConfig.Port,\n\t}\n\tDashboardRefreshFlag = cli.DurationFlag{\n\t\tName:  \"dashboard.refresh\",\n\t\tUsage: \"Dashboard metrics collection refresh rate\",\n\t\tValue: dashboard.DefaultConfig.Refresh,\n\t}\n\t// Ethash settings\n\tEthashCacheDirFlag = DirectoryFlag{\n\t\tName:  \"ethash.cachedir\",\n\t\tUsage: \"Directory to store the ethash verification caches (default = inside the datadir)\",\n\t}\n\tEthashCachesInMemoryFlag = cli.IntFlag{\n\t\tName:  \"ethash.cachesinmem\",\n\t\tUsage: \"Number of recent ethash caches to keep in memory (16MB each)\",\n\t\tValue: sero.DefaultConfig.Ethash.CachesInMem,\n\t}\n\tEthashCachesOnDiskFlag = cli.IntFlag{\n\t\tName:  \"ethash.cachesondisk\",\n\t\tUsage: \"Number of recent ethash caches to keep on disk (16MB each)\",\n\t\tValue: sero.DefaultConfig.Ethash.CachesOnDisk,\n\t}\n\tEthashDatasetDirFlag = DirectoryFlag{\n\t\tName:  \"ethash.dagdir\",\n\t\tUsage: \"Directory to store the ethash mining DAGs (default = inside home folder)\",\n\t\tValue: DirectoryString{sero.DefaultConfig.Ethash.DatasetDir},\n\t}\n\tEthashDatasetsInMemoryFlag = cli.IntFlag{\n\t\tName:  \"ethash.dagsinmem\",\n\t\tUsage: \"Number of recent ethash mining DAGs to keep in memory (1+GB each)\",\n\t\tValue: sero.DefaultConfig.Ethash.DatasetsInMem,\n\t}\n\tEthashDatasetsOnDiskFlag = cli.IntFlag{\n\t\tName:  \"ethash.dagsondisk\",\n\t\tUsage: \"Number of recent ethash mining DAGs to keep on disk (1+GB each)\",\n\t\tValue: sero.DefaultConfig.Ethash.DatasetsOnDisk,\n\t}\n\t// Transaction pool settings\n\tTxPoolNoLocalsFlag = cli.BoolFlag{\n\t\tName:  \"txpool.nolocals\",\n\t\tUsage: \"Disables price exemptions for locally submitted transactions\",\n\t}\n\tTxPoolPriceLimitFlag = cli.Uint64Flag{\n\t\tName:  \"txpool.pricelimit\",\n\t\tUsage: \"Minimum gas price limit to enforce for acceptance into the pool\",\n\t\tValue: sero.DefaultConfig.TxPool.PriceLimit,\n\t}\n\tTxPoolAccountSlotsFlag = cli.Uint64Flag{\n\t\tName:  \"txpool.accountslots\",\n\t\tUsage: \"Minimum number of executable transaction slots guaranteed per account\",\n\t\tValue: sero.DefaultConfig.TxPool.AccountSlots,\n\t}\n\tTxPoolGlobalSlotsFlag = cli.Uint64Flag{\n\t\tName:  \"txpool.globalslots\",\n\t\tUsage: \"Maximum number of executable transaction slots for all accounts\",\n\t\tValue: sero.DefaultConfig.TxPool.GlobalSlots,\n\t}\n\tTxPoolAccountQueueFlag = cli.Uint64Flag{\n\t\tName:  \"txpool.accountqueue\",\n\t\tUsage: \"Maximum number of non-executable transaction slots permitted per account\",\n\t\tValue: sero.DefaultConfig.TxPool.AccountQueue,\n\t}\n\tTxPoolGlobalQueueFlag = cli.Uint64Flag{\n\t\tName:  \"txpool.globalqueue\",\n\t\tUsage: \"Maximum number of non-executable transaction slots for all accounts\",\n\t\tValue: sero.DefaultConfig.TxPool.GlobalQueue,\n\t}\n\tTxPoolLifetimeFlag = cli.DurationFlag{\n\t\tName:  \"txpool.lifetime\",\n\t\tUsage: \"Maximum amount of time non-executable transaction are queued\",\n\t\tValue: sero.DefaultConfig.TxPool.Lifetime,\n\t}\n\t// Performance tuning settings\n\tCacheFlag = cli.IntFlag{\n\t\tName:  \"cache\",\n\t\tUsage: \"Megabytes of memory allocated to internal caching\",\n\t\tValue: 1024,\n\t}\n\tCacheDatabaseFlag = cli.IntFlag{\n\t\tName:  \"cache.database\",\n\t\tUsage: \"Percentage of cache memory allowance to use for database io\",\n\t\tValue: 75,\n\t}\n\tCacheGCFlag = cli.IntFlag{\n\t\tName:  \"cache.gc\",\n\t\tUsage: \"Percentage of cache memory allowance to use for trie pruning\",\n\t\tValue: 25,\n\t}\n\tTrieCacheGenFlag = cli.IntFlag{\n\t\tName:  \"trie-cache-gens\",\n\t\tUsage: \"Number of trie node generations to keep in memory\",\n\t\tValue: int(state.MaxTrieCacheGen),\n\t}\n\t// Zero Proof settings\n\tVThreadsFlag = cli.IntFlag{\n\t\tName:  \"vthreads\",\n\t\tUsage: \"Number of CPU threads to use for zero verify\",\n\t\tValue: runtime.NumCPU() + 2,\n\t}\n\tPThreadsFlag = cli.IntFlag{\n\t\tName:  \"pthreads\",\n\t\tUsage: \"Number of CPU threads to use for zero prove\",\n\t\tValue: runtime.NumCPU(),\n\t}\n\n\tExchangeFlag = cli.BoolFlag{\n\t\tName:  \"exchange\",\n\t\tUsage: \"start exchange\",\n\t}\n\n\tExchangeValueStrFlag = cli.BoolFlag{\n\t\tName:  \"exchangeValueStr\",\n\t\tUsage: \"big int return value as number string\",\n\t}\n\n\tStakeFlag = cli.BoolFlag{\n\t\tName:  \"stake\",\n\t\tUsage: \"start stake\",\n\t}\n\n\tAutoMergeFlag = cli.BoolFlag{\n\t\tName:  \"autoMerge\",\n\t\tUsage: \"autoMerge outs\",\n\t}\n\n\tLightNodeFlag = cli.BoolFlag{\n\t\tName:  \"lightNode\",\n\t\tUsage: \"start light node\",\n\t}\n\n\tCloseAcceptTx = cli.BoolFlag{\n\t\tName:  \"closeAcceptTx\",\n\t\tUsage: \"Close Accept from remote Tx\",\n\t}\n\n\tConfirmedBlockFlag = cli.Uint64Flag{\n\t\tName:  \"confirmedBlock\",\n\t\tUsage: \"The balance will be confirmed after the current block of number,default is 12\",\n\t}\n\n\tResetBlockNumber = cli.Uint64Flag{\n\t\tName:  \"resetBlockNumber\",\n\t\tUsage: \"reset currentblock, gcmode must be archive\",\n\t}\n\n\tRecordBlockShareNumber = cli.BoolFlag{\n\t\tName:  \"recordBlockShareNumber\",\n\t\tUsage: \"\",\n\t}\n\n\t// Miner settings\n\tMiningEnabledFlag = cli.BoolFlag{\n\t\tName:  \"mine\",\n\t\tUsage: \"Enable mining\",\n\t}\n\tMineModeEnabledFlag = cli.BoolFlag{\n\t\tName:  \"mineMode\",\n\t\tUsage: \"NoUsed\",\n\t}\n\tMinerThreadsFlag = cli.IntFlag{\n\t\tName:  \"minerthreads\",\n\t\tUsage: \"Number of CPU threads to use for mining\",\n\t\tValue: runtime.NumCPU(),\n\t}\n\tTargetGasLimitFlag = cli.Uint64Flag{\n\t\tName:  \"targetgaslimit\",\n\t\tUsage: \"Target gas limit sets the artificial target gas floor for the blocks to mine\",\n\t\tValue: params.GenesisGasLimit,\n\t}\n\tSerobaseFlag = cli.StringFlag{\n\t\tName:  \"serobase\",\n\t\tUsage: \"Public address for block mining rewards (default = first account created)\",\n\t\tValue: \"0\",\n\t}\n\tGasPriceFlag = BigFlag{\n\t\tName:  \"gasprice\",\n\t\tUsage: \"Minimal gas price to accept for mining a transactions\",\n\t\tValue: sero.DefaultConfig.GasPrice,\n\t}\n\tExtraDataFlag = cli.StringFlag{\n\t\tName:  \"extradata\",\n\t\tUsage: \"Block extra data set by the miner (default = client version)\",\n\t}\n\t// AccountAddress settings\n\tUnlockedAccountFlag = cli.StringFlag{\n\t\tName:  \"unlock\",\n\t\tUsage: \"Comma separated list of accounts to unlock\",\n\t\tValue: \"\",\n\t}\n\tPasswordFileFlag = cli.StringFlag{\n\t\tName:  \"password\",\n\t\tUsage: \"Password file to use for non-interactive password input\",\n\t\tValue: \"\",\n\t}\n\n\tVMEnableDebugFlag = cli.BoolFlag{\n\t\tName:  \"vmdebug\",\n\t\tUsage: \"Record information useful for VM and contract debugging\",\n\t}\n\t// Logging and debug settings\n\tSeroStatsURLFlag = cli.StringFlag{\n\t\tName:  \"serostats\",\n\t\tUsage: \"Reporting URL of a serostats service (nodename:secret@host:port)\",\n\t}\n\tFakePoWFlag = cli.BoolFlag{\n\t\tName:  \"fakepow\",\n\t\tUsage: \"Disables proof-of-work verification\",\n\t}\n\tNoCompactionFlag = cli.BoolFlag{\n\t\tName:  \"nocompaction\",\n\t\tUsage: \"Disables db compaction after import\",\n\t}\n\t// RPC settings\n\tRPCEnabledFlag = cli.BoolFlag{\n\t\tName:  \"rpc\",\n\t\tUsage: \"Enable the HTTP-RPC server\",\n\t}\n\tRPCListenAddrFlag = cli.StringFlag{\n\t\tName:  \"rpcaddr\",\n\t\tUsage: \"HTTP-RPC server listening interface\",\n\t\tValue: node.DefaultHTTPHost,\n\t}\n\tRPCPortFlag = cli.IntFlag{\n\t\tName:  \"rpcport\",\n\t\tUsage: \"HTTP-RPC server listening port\",\n\t\tValue: node.DefaultHTTPPort,\n\t}\n\tRPCCORSDomainFlag = cli.StringFlag{\n\t\tName:  \"rpccorsdomain\",\n\t\tUsage: \"Comma separated list of domains from which to accept cross origin requests (browser enforced)\",\n\t\tValue: \"\",\n\t}\n\tRPCVirtualHostsFlag = cli.StringFlag{\n\t\tName:  \"rpcvhosts\",\n\t\tUsage: \"Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.\",\n\t\tValue: strings.Join(node.DefaultConfig.HTTPVirtualHosts, \",\"),\n\t}\n\tRPCReadTimeoutFlag = cli.Int64Flag{\n\t\tName: \"rpcreadtimeout\",\n\t\tUsage: `ReadTimeout is the maximum duration for reading the entire request, including the body.\n \n        Because ReadTimeout does not let Handlers make per-request\n        decisions on each request body's acceptable deadline or\n        upload rate, most users will prefer to useReadHeaderTimeout. It is valid to use them both.`,\n\t\tValue: 120,\n\t}\n\tRPCWriteTimeoutFlag = cli.Int64Flag{\n\t\tName: \"rpcwritetimeout\",\n\t\tUsage: `WriteTimeout is the maximum duration before timing out writes of the response. \n        It is reset whenever a new request's header is read. Like ReadTimeout, it does not\n\t\tlet Handlers make decisions on a per-request basis.`,\n\t\tValue: 120,\n\t}\n\tRPCIdleTimeoutFlag = cli.Int64Flag{\n\t\tName: \"rpcidletimeout\",\n\t\tUsage: `IdleTimeout is the maximum amount of time to wait for the next request when keep-alives are enabled. \n        If IdleTimeout is zero, the value of ReadTimeout is used. If both are zero, ReadHeaderTimeout is used.`,\n\t\tValue: 120,\n\t}\n\tRPCApiFlag = cli.StringFlag{\n\t\tName:  \"rpcapi\",\n\t\tUsage: \"API's offered over the HTTP-RPC interface\",\n\t\tValue: \"\",\n\t}\n\tRPCRequestContentLength = cli.Uint64Flag{\n\t\tName:  \"rpcRequestContentLength\",\n\t\tUsage: \"Specify the maximum length of the rpc request content\",\n\t\tValue: 1024 * 512,\n\t}\n\tIPCDisabledFlag = cli.BoolFlag{\n\t\tName:  \"ipcdisable\",\n\t\tUsage: \"Disable the IPC-RPC server\",\n\t}\n\tIPCPathFlag = DirectoryFlag{\n\t\tName:  \"ipcpath\",\n\t\tUsage: \"Filename for IPC socket/pipe within the datadir (explicit paths escape it)\",\n\t}\n\tWSEnabledFlag = cli.BoolFlag{\n\t\tName:  \"ws\",\n\t\tUsage: \"Enable the WS-RPC server\",\n\t}\n\tWSListenAddrFlag = cli.StringFlag{\n\t\tName:  \"wsaddr\",\n\t\tUsage: \"WS-RPC server listening interface\",\n\t\tValue: node.DefaultWSHost,\n\t}\n\tWSPortFlag = cli.IntFlag{\n\t\tName:  \"wsport\",\n\t\tUsage: \"WS-RPC server listening port\",\n\t\tValue: node.DefaultWSPort,\n\t}\n\tWSApiFlag = cli.StringFlag{\n\t\tName:  \"wsapi\",\n\t\tUsage: \"API's offered over the WS-RPC interface\",\n\t\tValue: \"\",\n\t}\n\tWSAllowedOriginsFlag = cli.StringFlag{\n\t\tName:  \"wsorigins\",\n\t\tUsage: \"Origins from which to accept websockets requests\",\n\t\tValue: \"\",\n\t}\n\tExecFlag = cli.StringFlag{\n\t\tName:  \"exec\",\n\t\tUsage: \"Execute JavaScript statement\",\n\t}\n\tPreloadJSFlag = cli.StringFlag{\n\t\tName:  \"preload\",\n\t\tUsage: \"Comma separated list of JavaScript files to preload into the console\",\n\t}\n\n\t// Network Settings\n\tMaxPeersFlag = cli.IntFlag{\n\t\tName:  \"maxpeers\",\n\t\tUsage: \"Maximum number of network peers (network disabled if set to 0)\",\n\t\tValue: 25,\n\t}\n\tMaxPendingPeersFlag = cli.IntFlag{\n\t\tName:  \"maxpendpeers\",\n\t\tUsage: \"Maximum number of pending connection attempts (defaults used if set to 0)\",\n\t\tValue: 0,\n\t}\n\tListenPortFlag = cli.IntFlag{\n\t\tName:  \"port\",\n\t\tUsage: \"Network listening port\",\n\t\tValue: 53717,\n\t}\n\tBootnodesFlag = cli.StringFlag{\n\t\tName:  \"bootnodes\",\n\t\tUsage: \"Comma separated enode URLs for P2P discovery bootstrap (set v4+v5 instead for light servers)\",\n\t\tValue: \"\",\n\t}\n\tBootnodesV4Flag = cli.StringFlag{\n\t\tName:  \"bootnodesv4\",\n\t\tUsage: \"Comma separated enode URLs for P2P v4 discovery bootstrap (light server, full nodes)\",\n\t\tValue: \"\",\n\t}\n\tBootnodesV5Flag = cli.StringFlag{\n\t\tName:  \"bootnodesv5\",\n\t\tUsage: \"Comma separated enode URLs for P2P v5 discovery bootstrap (light server, light nodes)\",\n\t\tValue: \"\",\n\t}\n\tNodeKeyFileFlag = cli.StringFlag{\n\t\tName:  \"nodekey\",\n\t\tUsage: \"P2P node key file\",\n\t}\n\tNodeKeyHexFlag = cli.StringFlag{\n\t\tName:  \"nodekeyhex\",\n\t\tUsage: \"P2P node key as hex (for testing)\",\n\t}\n\tNATFlag = cli.StringFlag{\n\t\tName:  \"nat\",\n\t\tUsage: \"NAT port mapping mechanism (any|none|upnp|pmp|extip:<IP>)\",\n\t\tValue: \"any\",\n\t}\n\tNoDiscoverFlag = cli.BoolFlag{\n\t\tName:  \"nodiscover\",\n\t\tUsage: \"Disables the peer discovery mechanism (manual peer addition)\",\n\t}\n\tDiscoveryV5Flag = cli.BoolFlag{\n\t\tName:  \"v5disc\",\n\t\tUsage: \"Enables the experimental RLPx V5 (Topic Discovery) mechanism\",\n\t}\n\tNetrestrictFlag = cli.StringFlag{\n\t\tName:  \"netrestrict\",\n\t\tUsage: \"Restricts network communication to the given IP networks (CIDR masks)\",\n\t}\n\n\t// ATM the url is left to the user and deployment to\n\tJSpathFlag = cli.StringFlag{\n\t\tName:  \"jspath\",\n\t\tUsage: \"JavaScript root path for `loadScript`\",\n\t\tValue: \".\",\n\t}\n\n\t// Gas price oracle settings\n\tGpoBlocksFlag = cli.IntFlag{\n\t\tName:  \"gpoblocks\",\n\t\tUsage: \"Number of recent blocks to check for gas prices\",\n\t\tValue: sero.DefaultConfig.GPO.Blocks,\n\t}\n\tGpoPercentileFlag = cli.IntFlag{\n\t\tName:  \"gpopercentile\",\n\t\tUsage: \"Suggested gas price is the given percentile of a set of recent transaction gas prices\",\n\t\tValue: sero.DefaultConfig.GPO.Percentile,\n\t}\n\t// Metrics flags\n\tMetricsEnabledFlag = cli.BoolFlag{\n\t\tName:  metrics.MetricsEnabledFlag,\n\t\tUsage: \"Enable metrics collection and reporting\",\n\t}\n\tMetricsEnableInfluxDBFlag = cli.BoolFlag{\n\t\tName:  \"metrics.influxdb\",\n\t\tUsage: \"Enable metrics export/push to an external InfluxDB database\",\n\t}\n\tMetricsInfluxDBEndpointFlag = cli.StringFlag{\n\t\tName:  \"metrics.influxdb.endpoint\",\n\t\tUsage: \"InfluxDB API endpoint to report metrics to\",\n\t\tValue: \"http://localhost:8086\",\n\t}\n\tMetricsInfluxDBDatabaseFlag = cli.StringFlag{\n\t\tName:  \"metrics.influxdb.database\",\n\t\tUsage: \"InfluxDB database name to push reported metrics to\",\n\t\tValue: \"gero\",\n\t}\n\tMetricsInfluxDBUsernameFlag = cli.StringFlag{\n\t\tName:  \"metrics.influxdb.username\",\n\t\tUsage: \"Username to authorize access to the database\",\n\t\tValue: \"test\",\n\t}\n\tMetricsInfluxDBPasswordFlag = cli.StringFlag{\n\t\tName:  \"metrics.influxdb.password\",\n\t\tUsage: \"Password to authorize access to the database\",\n\t\tValue: \"test\",\n\t}\n\t// The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB.\n\t// It is used so that we can group all nodes and average a measurement across all of them, but also so\n\t// that we can select a specific node and inspect its measurements.\n\t// https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key\n\tMetricsInfluxDBHostTagFlag = cli.StringFlag{\n\t\tName:  \"metrics.influxdb.host.tag\",\n\t\tUsage: \"InfluxDB `host` tag attached to all measurements\",\n\t\tValue: \"localhost\",\n\t}\n\n\t// proof settings\n\tProofEnabledFlag = cli.BoolFlag{\n\t\tName:  \"proof\",\n\t\tUsage: \"Enable the HTTP-RPC server\",\n\t}\n\tProofMaxThreadFlag = cli.IntFlag{\n\t\tName:  \"maxthread\",\n\t\tUsage: \"max work number\",\n\t\tValue: 5,\n\t}\n\tProofMaxQueueFlag = cli.IntFlag{\n\t\tName:  \"maxqueue\",\n\t\tUsage: \"max work queue length\",\n\t\tValue: 10,\n\t}\n\tProofzinFeeFlag = cli.StringFlag{\n\t\tName:  \"zinFee\",\n\t\tUsage: \"proof for tx zin fee\",\n\t\tValue: \"0sero\",\n\t}\n\tProofoinFeeFlag = cli.StringFlag{\n\t\tName:  \"oinFee\",\n\t\tUsage: \"proof for tx oin fee\",\n\t\tValue: \"0sero\",\n\t}\n\tProofoutFeeFlag = cli.StringFlag{\n\t\tName:  \"outFee\",\n\t\tUsage: \"proof for tx out fee\",\n\t\tValue: \"0sero\",\n\t}\n\tProofFixedFeeFlag = cli.StringFlag{\n\t\tName:  \"fixedFee\",\n\t\tUsage: \"proof for tx out fee\",\n\t\tValue: \"0sero\",\n\t}\n)\n\n// MakeDataDir retrieves the currently requested data directory, terminating\n// if none (or the empty string) is specified. If the node is starting a testnet,\n// the a subdirectory of the specified datadir will be used.\nfunc MakeDataDir(ctx *cli.Context) string {\n\tif path := ctx.GlobalString(DataDirFlag.Name); path != \"\" {\n\t\tif ctx.GlobalBool(AlphanetFlag.Name) {\n\t\t\treturn filepath.Join(path, \"alphanet\")\n\t\t}\n\t\tif ctx.GlobalBool(DeveloperFlag.Name) {\n\t\t\treturn filepath.Join(path, \"dev\")\n\t\t}\n\t\treturn path\n\t}\n\tFatalf(\"Cannot determine default data directory, please set manually (--datadir)\")\n\treturn \"\"\n}\n\n// setNodeKey creates a node key from set command line flags, either loading it\n// from a file or as a specified hex value. If neither flags were provided, this\n// method returns nil and an emphemeral key is to be generated.\nfunc setNodeKey(ctx *cli.Context, cfg *p2p.Config) {\n\tvar (\n\t\thex  = ctx.GlobalString(NodeKeyHexFlag.Name)\n\t\tfile = ctx.GlobalString(NodeKeyFileFlag.Name)\n\t\tkey  *ecdsa.PrivateKey\n\t\terr  error\n\t)\n\tswitch {\n\tcase file != \"\" && hex != \"\":\n\t\tFatalf(\"Options %q and %q are mutually exclusive\", NodeKeyFileFlag.Name, NodeKeyHexFlag.Name)\n\tcase file != \"\":\n\t\tif key, err = crypto.LoadECDSA(file); err != nil {\n\t\t\tFatalf(\"Option %q: %v\", NodeKeyFileFlag.Name, err)\n\t\t}\n\t\tcfg.PrivateKey = key\n\tcase hex != \"\":\n\t\tif key, err = crypto.HexToECDSA(hex); err != nil {\n\t\t\tFatalf(\"Option %q: %v\", NodeKeyHexFlag.Name, err)\n\t\t}\n\t\tcfg.PrivateKey = key\n\t}\n}\n\n// setNodeUserIdent creates the user identifier from CLI flags.\nfunc setNodeUserIdent(ctx *cli.Context, cfg *node.Config) {\n\tif identity := ctx.GlobalString(IdentityFlag.Name); len(identity) > 0 {\n\t\tcfg.UserIdent = identity\n\t}\n}\n\n// setBootstrapNodes creates a list of bootstrap nodes from the command line\n// flags, reverting to pre-configured ones if none have been specified.\nfunc setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) {\n\turls := params.BetanetBootnodes\n\tswitch {\n\tcase ctx.GlobalIsSet(BootnodesFlag.Name) || ctx.GlobalIsSet(BootnodesV4Flag.Name):\n\t\tif ctx.GlobalIsSet(BootnodesV4Flag.Name) {\n\t\t\turls = strings.Split(ctx.GlobalString(BootnodesV4Flag.Name), \",\")\n\t\t} else {\n\t\t\turls = strings.Split(ctx.GlobalString(BootnodesFlag.Name), \",\")\n\t\t}\n\tcase ctx.GlobalBool(AlphanetFlag.Name):\n\t\turls = params.AlphanetBootnodes\n\tcase ctx.GlobalBool(DeveloperFlag.Name):\n\t\turls = params.DevBootnodes\n\tcase cfg.BootstrapNodes != nil:\n\t\treturn // already set, don't apply defaults.\n\t}\n\n\tcfg.BootstrapNodes = make([]*discover.Node, 0, len(urls))\n\tfor _, url := range urls {\n\t\tnode, err := discover.ParseNode(url)\n\t\tif err != nil {\n\t\t\tlog.Crit(\"Bootstrap URL invalid\", \"enode\", url, \"err\", err)\n\t\t}\n\t\tcfg.BootstrapNodes = append(cfg.BootstrapNodes, node)\n\t}\n}\n\n// setBootstrapNodesV5 creates a list of bootstrap nodes from the command line\n// flags, reverting to pre-configured ones if none have been specified.\nfunc setBootstrapNodesV5(ctx *cli.Context, cfg *p2p.Config) {\n\turls := params.DiscoveryV5Bootnodes\n\tswitch {\n\tcase ctx.GlobalIsSet(BootnodesFlag.Name) || ctx.GlobalIsSet(BootnodesV5Flag.Name):\n\t\tif ctx.GlobalIsSet(BootnodesV5Flag.Name) {\n\t\t\turls = strings.Split(ctx.GlobalString(BootnodesV5Flag.Name), \",\")\n\t\t} else {\n\t\t\turls = strings.Split(ctx.GlobalString(BootnodesFlag.Name), \",\")\n\t\t}\n\tcase ctx.GlobalBool(DeveloperFlag.Name):\n\t\turls = params.DevBootnodes\n\tcase cfg.BootstrapNodesV5 != nil:\n\t\treturn // already set, don't apply defaults.\n\t}\n\n\tcfg.BootstrapNodesV5 = make([]*discv5.Node, 0, len(urls))\n\tfor _, url := range urls {\n\t\tnode, err := discv5.ParseNode(url)\n\t\tif err != nil {\n\t\t\tlog.Error(\"Bootstrap URL invalid\", \"enode\", url, \"err\", err)\n\t\t\tcontinue\n\t\t}\n\t\tcfg.BootstrapNodesV5 = append(cfg.BootstrapNodesV5, node)\n\t}\n}\n\n// setListenAddress creates a TCP listening address string from set command\n// line flags.\nfunc setListenAddress(ctx *cli.Context, cfg *p2p.Config) {\n\tif ctx.GlobalIsSet(ListenPortFlag.Name) {\n\t\tcfg.ListenAddr = fmt.Sprintf(\":%d\", ctx.GlobalInt(ListenPortFlag.Name))\n\t}\n}\n\n// setNAT creates a port mapper from command line flags.\nfunc setNAT(ctx *cli.Context, cfg *p2p.Config) {\n\tif ctx.GlobalIsSet(NATFlag.Name) {\n\t\tnatif, err := nat.Parse(ctx.GlobalString(NATFlag.Name))\n\t\tif err != nil {\n\t\t\tFatalf(\"Option %s: %v\", NATFlag.Name, err)\n\t\t}\n\t\tcfg.NAT = natif\n\t}\n}\n\n// splitAndTrim splits input separated by a comma\n// and trims excessive white space from the substrings.\nfunc splitAndTrim(input string) []string {\n\tresult := strings.Split(input, \",\")\n\tfor i, r := range result {\n\t\tresult[i] = strings.TrimSpace(r)\n\t}\n\treturn result\n}\n\n// setHTTP creates the HTTP RPC listener interface string from the set\n// command line flags, returning empty if the HTTP endpoint is disabled.\nfunc setHTTP(ctx *cli.Context, cfg *node.Config) {\n\tif ctx.GlobalBool(RPCEnabledFlag.Name) && cfg.HTTPHost == \"\" {\n\t\tcfg.HTTPHost = \"127.0.0.1\"\n\t\tif ctx.GlobalIsSet(RPCListenAddrFlag.Name) {\n\t\t\tcfg.HTTPHost = ctx.GlobalString(RPCListenAddrFlag.Name)\n\t\t}\n\t}\n\n\tif ctx.GlobalIsSet(RPCPortFlag.Name) {\n\t\tcfg.HTTPPort = ctx.GlobalInt(RPCPortFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(RPCCORSDomainFlag.Name) {\n\t\tcfg.HTTPCors = splitAndTrim(ctx.GlobalString(RPCCORSDomainFlag.Name))\n\t}\n\tif ctx.GlobalIsSet(RPCApiFlag.Name) {\n\t\tcfg.HTTPModules = splitAndTrim(ctx.GlobalString(RPCApiFlag.Name))\n\t}\n\tif ctx.GlobalIsSet(RPCVirtualHostsFlag.Name) {\n\t\tcfg.HTTPVirtualHosts = splitAndTrim(ctx.GlobalString(RPCVirtualHostsFlag.Name))\n\t}\n\tif ctx.GlobalIsSet(RPCReadTimeoutFlag.Name) {\n\t\tcfg.HTTPTimeouts.ReadTimeout = time.Duration(ctx.GlobalInt64(RPCReadTimeoutFlag.Name)) * time.Second\n\t}\n\tif ctx.GlobalIsSet(RPCWriteTimeoutFlag.Name) {\n\t\tcfg.HTTPTimeouts.WriteTimeout = time.Duration(ctx.GlobalInt64(RPCWriteTimeoutFlag.Name)) * time.Second\n\t}\n\tif ctx.GlobalIsSet(RPCIdleTimeoutFlag.Name) {\n\t\tcfg.HTTPTimeouts.IdleTimeout = time.Duration(ctx.GlobalInt64(RPCIdleTimeoutFlag.Name)) * time.Second\n\t}\n\tif ctx.GlobalIsSet(RPCRequestContentLength.Name) {\n\t\tl := ctx.GlobalInt64(RPCRequestContentLength.Name)\n\t\trpc.SetMaxRequestContentLength(l)\n\t}\n\n}\n\n// setWS creates the WebSocket RPC listener interface string from the set\n// command line flags, returning empty if the HTTP endpoint is disabled.\nfunc setWS(ctx *cli.Context, cfg *node.Config) {\n\tif ctx.GlobalBool(WSEnabledFlag.Name) && cfg.WSHost == \"\" {\n\t\tcfg.WSHost = \"127.0.0.1\"\n\t\tif ctx.GlobalIsSet(WSListenAddrFlag.Name) {\n\t\t\tcfg.WSHost = ctx.GlobalString(WSListenAddrFlag.Name)\n\t\t}\n\t}\n\n\tif ctx.GlobalIsSet(WSPortFlag.Name) {\n\t\tcfg.WSPort = ctx.GlobalInt(WSPortFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(WSAllowedOriginsFlag.Name) {\n\t\tcfg.WSOrigins = splitAndTrim(ctx.GlobalString(WSAllowedOriginsFlag.Name))\n\t}\n\tif ctx.GlobalIsSet(WSApiFlag.Name) {\n\t\tcfg.WSModules = splitAndTrim(ctx.GlobalString(WSApiFlag.Name))\n\t}\n}\n\n// setIPC creates an IPC path configuration from the set command line flags,\n// returning an empty string if IPC was explicitly disabled, or the set path.\nfunc setIPC(ctx *cli.Context, cfg *node.Config) {\n\tcheckExclusive(ctx, IPCDisabledFlag, IPCPathFlag)\n\tswitch {\n\tcase ctx.GlobalBool(IPCDisabledFlag.Name):\n\t\tcfg.IPCPath = \"\"\n\tcase ctx.GlobalIsSet(IPCPathFlag.Name):\n\t\tcfg.IPCPath = ctx.GlobalString(IPCPathFlag.Name)\n\t}\n}\n\n// makeDatabaseHandles raises out the number of allowed file handles per process\n// for Geth and returns half of the allowance to assign to the database.\nfunc makeDatabaseHandles() int {\n\tlimit, err := fdlimit.Current()\n\tif err != nil {\n\t\tFatalf(\"Failed to retrieve file descriptor allowance: %v\", err)\n\t}\n\tif limit < 2048 {\n\t\tif err := fdlimit.Raise(2048); err != nil {\n\t\t\tFatalf(\"Failed to raise file descriptor allowance: %v\", err)\n\t\t}\n\t}\n\tif limit > 2048 { // cap database file descriptors even if more is available\n\t\tlimit = 2048\n\t}\n\treturn limit / 2 // Leave half for networking and other stuff\n}\n\n// MakeAddress converts an account specified directly as a hex encoded string or\n// a key index in the key store to an internal account representation.\nfunc MakeAddress(ks *keystore.KeyStore, account string) (accounts.Account, error) {\n\t// If the specified account is a valid address, return it\n\n\tsplitStrs := strings.Split(account, \".\")\n\tvar addr string\n\tif len(splitStrs) == 3 {\n\t\taddr = splitStrs[1]\n\t} else {\n\t\taddr = account\n\t}\n\tPkByte := base58.Decode(addr)\n\tpk := c_type.Uint512{}\n\tcopy(pk[:], PkByte)\n\twallets := ks.Wallets()\n\tfor _, wallet := range wallets {\n\t\tif wallet.Accounts()[0].IsMyPk(pk) {\n\t\t\treturn wallet.Accounts()[0], nil\n\t\t}\n\t}\n\n\t// Otherwise try to interpret the account as a keystore index\n\tindex, err := strconv.Atoi(account)\n\tif err != nil || index < 0 {\n\t\treturn accounts.Account{}, fmt.Errorf(\"invalid account address or index %q\", account)\n\t}\n\tlog.Warn(\"-------------------------------------------------------------------\")\n\tlog.Warn(\"Referring to accounts by order in the keystore folder is dangerous!\")\n\tlog.Warn(\"This functionality is deprecated and will be removed in the future!\")\n\tlog.Warn(\"Please use explicit addresses! (can search via `gero account list`)\")\n\tlog.Warn(\"-------------------------------------------------------------------\")\n\n\taccs := ks.Accounts()\n\tif len(accs) <= index {\n\t\treturn accounts.Account{}, fmt.Errorf(\"index %d higher than number of accounts %d\", index, len(accs))\n\t}\n\treturn accs[index], nil\n}\n\n// MakePasswordList reads password lines from the file specified by the global --password flag.\nfunc MakePasswordList(ctx *cli.Context) []string {\n\tpath := ctx.GlobalString(PasswordFileFlag.Name)\n\tif path == \"\" {\n\t\treturn nil\n\t}\n\ttext, err := ioutil.ReadFile(path)\n\tif err != nil {\n\t\tFatalf(\"Failed to read password file: %v\", err)\n\t}\n\tlines := strings.Split(string(text), \"\\n\")\n\t// Sanitise DOS line endings.\n\tfor i := range lines {\n\t\tlines[i] = strings.TrimRight(lines[i], \"\\r\")\n\t}\n\treturn lines\n}\n\nfunc SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) {\n\tsetNodeKey(ctx, cfg)\n\tsetNAT(ctx, cfg)\n\tsetListenAddress(ctx, cfg)\n\tsetBootstrapNodes(ctx, cfg)\n\tsetBootstrapNodesV5(ctx, cfg)\n\n\tif ctx.GlobalIsSet(MaxPeersFlag.Name) {\n\t\tcfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name)\n\t}\n\n\tlog.Info(\"Maximum peer count\", \"SERO\", cfg.MaxPeers)\n\n\t// lightClient := ctx.GlobalBool(LightModeFlag.Name) || ctx.GlobalString(SyncModeFlag.Name) == \"light\"\n\t// //lightServer := ctx.GlobalInt(LightServFlag.Name) != 0\n\t// lightPeers := ctx.GlobalInt(LightPeersFlag.Name)\n\t//\n\t// if ctx.GlobalIsSet(MaxPeersFlag.Name) {\n\t//\tcfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name)\n\t//\t//if lightServer && !ctx.GlobalIsSet(LightPeersFlag.Name) {\n\t//\t//\tcfg.MaxPeers += lightPeers\n\t//\t//}\n\t// } else {\n\t//\t//if lightServer {\n\t//\t//\tcfg.MaxPeers += lightPeers\n\t//\t//}\n\t//\tif lightClient && ctx.GlobalIsSet(LightPeersFlag.Name) && cfg.MaxPeers < lightPeers {\n\t//\t\tcfg.MaxPeers = lightPeers\n\t//\t}\n\t// }\n\t// //if !(lightClient || lightServer) {\n\t// if !(lightClient) {\n\t//\tlightPeers = 0\n\t// }\n\t// ethPeers := cfg.MaxPeers - lightPeers\n\t// if lightClient {\n\t//\tethPeers = 0\n\t// }\n\t// log.Info(\"Maximum peer count\", \"ETH\", ethPeers, \"LES\", lightPeers, \"total\", cfg.MaxPeers)\n\n\tif ctx.GlobalIsSet(MaxPendingPeersFlag.Name) {\n\t\tcfg.MaxPendingPeers = ctx.GlobalInt(MaxPendingPeersFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(NoDiscoverFlag.Name) {\n\t\tcfg.NoDiscovery = true\n\t}\n\n\t// if we're running a light client or server, force enable the v5 peer discovery\n\t// unless it is explicitly disabled with --nodiscover note that explicitly specifying\n\t// --v5disc overrides --nodiscover, in which case the later only disables v4 discovery\n\t// forceV5Discovery := (lightClient || lightServer) && !ctx.GlobalBool(NoDiscoverFlag.Name)\n\tforceV5Discovery := !ctx.GlobalBool(NoDiscoverFlag.Name)\n\tif ctx.GlobalIsSet(DiscoveryV5Flag.Name) {\n\t\tcfg.DiscoveryV5 = ctx.GlobalBool(DiscoveryV5Flag.Name)\n\t} else if forceV5Discovery {\n\t\tcfg.DiscoveryV5 = true\n\t}\n\n\tif netrestrict := ctx.GlobalString(NetrestrictFlag.Name); netrestrict != \"\" {\n\t\tlist, err := netutil.ParseNetlist(netrestrict)\n\t\tif err != nil {\n\t\t\tFatalf(\"Option %q: %v\", NetrestrictFlag.Name, err)\n\t\t}\n\t\tcfg.NetRestrict = list\n\t}\n\n\tif ctx.GlobalIsSet(ConfirmedBlockFlag.Name) {\n\t\tbalanceDelay := ctx.GlobalUint64(ConfirmedBlockFlag.Name)\n\t\tif balanceDelay >= 0 {\n\t\t\tseroparam.InitComfirmedBlock(balanceDelay)\n\t\t}\n\t}\n\n\tif ctx.GlobalIsSet(RecordBlockShareNumber.Name) {\n\t\tzconfig.Init_RecordShareNum()\n\t}\n\n\tif ctx.GlobalIsSet(ResetBlockNumber.Name) {\n\t\tblockNumber := ctx.GlobalUint64(ResetBlockNumber.Name)\n\t\tseroparam.InitCurrentBlockNumber(blockNumber)\n\t}\n\n\tif ctx.GlobalBool(DeveloperFlag.Name) {\n\t\t// --dev mode can't use p2p networking.\n\t\t// cfg.MaxPeers = 0\n\t\tcfg.ListenAddr = \":0\"\n\t\tcfg.NoDiscovery = true\n\t\tcfg.DiscoveryV5 = false\n\t\tseroparam.Init_Dev(true)\n\t}\n\tif ctx.GlobalBool(OfflineFlag.Name) {\n\t\tseroparam.Init_Offline(true)\n\t}\n\tif ctx.GlobalIsSet(SnapshotFlag.Name) {\n\t\tsnapshot := ctx.GlobalUint64(SnapshotFlag.Name)\n\t\tzconfig.Init_Snapshot(snapshot)\n\t}\n}\n\n// SetNodeConfig applies node-related command line flags to the config.\nfunc SetNodeConfig(ctx *cli.Context, cfg *node.Config) {\n\tSetP2PConfig(ctx, &cfg.P2P)\n\tsetIPC(ctx, cfg)\n\tsetHTTP(ctx, cfg)\n\tsetWS(ctx, cfg)\n\tsetNodeUserIdent(ctx, cfg)\n\n\tswitch {\n\tcase ctx.GlobalIsSet(DataDirFlag.Name):\n\t\tcfg.DataDir = ctx.GlobalString(DataDirFlag.Name)\n\tcase ctx.GlobalBool(AlphanetFlag.Name):\n\t\tcfg.DataDir = filepath.Join(node.DefaultDataDir(), \"alpha\")\n\tcase ctx.GlobalBool(DeveloperFlag.Name):\n\t\tcfg.DataDir = filepath.Join(node.DefaultDataDir(), \"dev\")\n\t}\n\n\tif ctx.GlobalIsSet(KeyStoreDirFlag.Name) {\n\t\tcfg.KeyStoreDir = ctx.GlobalString(KeyStoreDirFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(TestForkFlag.Name) {\n\t\tzconfig.Init_TestFork()\n\t\tif ctx.GlobalIsSet(TestStartBlockFlag.Name) {\n\t\t\ttestFrokStartBlock := ctx.GlobalUint64(TestStartBlockFlag.Name)\n\t\t\tif testFrokStartBlock == 0 {\n\t\t\t\tpanic(\"testFrokStartBlock must great 100\")\n\t\t\t}\n\t\t\tzconfig.Init_TestForkStartBlock(testFrokStartBlock)\n\t\t} else {\n\t\t\tpanic(\"must set testFrokStartBlock\")\n\t\t}\n\n\t}\n}\n\nfunc setGPO(ctx *cli.Context, cfg *gasprice.Config) {\n\tif ctx.GlobalIsSet(GpoBlocksFlag.Name) {\n\t\tcfg.Blocks = ctx.GlobalInt(GpoBlocksFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(GpoPercentileFlag.Name) {\n\t\tcfg.Percentile = ctx.GlobalInt(GpoPercentileFlag.Name)\n\t}\n}\n\nfunc setTxPool(ctx *cli.Context, cfg *core.TxPoolConfig) {\n\tif ctx.GlobalIsSet(TxPoolNoLocalsFlag.Name) {\n\t\tcfg.NoLocals = ctx.GlobalBool(TxPoolNoLocalsFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(TxPoolPriceLimitFlag.Name) {\n\t\tcfg.PriceLimit = ctx.GlobalUint64(TxPoolPriceLimitFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(TxPoolAccountSlotsFlag.Name) {\n\t\tcfg.AccountSlots = ctx.GlobalUint64(TxPoolAccountSlotsFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(TxPoolGlobalSlotsFlag.Name) {\n\t\tcfg.GlobalSlots = ctx.GlobalUint64(TxPoolGlobalSlotsFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(TxPoolAccountQueueFlag.Name) {\n\t\tcfg.AccountQueue = ctx.GlobalUint64(TxPoolAccountQueueFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(TxPoolGlobalQueueFlag.Name) {\n\t\tcfg.GlobalQueue = ctx.GlobalUint64(TxPoolGlobalQueueFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(TxPoolLifetimeFlag.Name) {\n\t\tcfg.Lifetime = ctx.GlobalDuration(TxPoolLifetimeFlag.Name)\n\t}\n}\n\nfunc initProof(ctx *cli.Context) (cfg *proofservice.Config) {\n\tif !ctx.GlobalIsSet(ProofEnabledFlag.Name) {\n\t\treturn\n\t}\n\n\tcfg = &proofservice.Config{}\n\tcfg.MaxWorkNumber = ctx.GlobalInt(ProofMaxThreadFlag.Name)\n\tcfg.MaxQueueNumber = ctx.GlobalInt(ProofMaxQueueFlag.Name)\n\tcfg.Fee = proofservice.ServiceFee{}\n\n\tif ctx.GlobalIsSet(ProofzinFeeFlag.Name) {\n\t\tzinFee, err := utils.ParseAmount(ctx.GlobalString(ProofzinFeeFlag.Name))\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tcfg.Fee.ZinFee = zinFee\n\t}\n\n\tif ctx.GlobalIsSet(ProofoinFeeFlag.Name) {\n\t\toinFee, err := utils.ParseAmount(ctx.GlobalString(ProofoinFeeFlag.Name))\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tcfg.Fee.OinFee = oinFee\n\t}\n\n\tif ctx.GlobalIsSet(ProofoutFeeFlag.Name) {\n\t\toutFee, err := utils.ParseAmount(ctx.GlobalString(ProofoutFeeFlag.Name))\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tcfg.Fee.OutFee = outFee\n\t}\n\n\tif ctx.GlobalIsSet(ProofFixedFeeFlag.Name) {\n\t\tfixedFee, err := utils.ParseAmount(ctx.GlobalString(ProofFixedFeeFlag.Name))\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tcfg.Fee.FixedFee = fixedFee\n\t}\n\treturn\n}\n\nfunc setEthash(ctx *cli.Context, cfg *sero.Config) {\n\tif ctx.GlobalIsSet(EthashCacheDirFlag.Name) {\n\t\tcfg.Ethash.CacheDir = ctx.GlobalString(EthashCacheDirFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(EthashDatasetDirFlag.Name) {\n\t\tcfg.Ethash.DatasetDir = ctx.GlobalString(EthashDatasetDirFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(EthashCachesInMemoryFlag.Name) {\n\t\tcfg.Ethash.CachesInMem = ctx.GlobalInt(EthashCachesInMemoryFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(EthashCachesOnDiskFlag.Name) {\n\t\tcfg.Ethash.CachesOnDisk = ctx.GlobalInt(EthashCachesOnDiskFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(EthashDatasetsInMemoryFlag.Name) {\n\t\tcfg.Ethash.DatasetsInMem = ctx.GlobalInt(EthashDatasetsInMemoryFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(EthashDatasetsOnDiskFlag.Name) {\n\t\tcfg.Ethash.DatasetsOnDisk = ctx.GlobalInt(EthashDatasetsOnDiskFlag.Name)\n\t}\n}\n\n// checkExclusive verifies that only a single instance of the provided flags was\n// set by the user. Each flag might optionally be followed by a string type to\n// specialize it further.\nfunc checkExclusive(ctx *cli.Context, args ...interface{}) {\n\tset := make([]string, 0, 1)\n\tfor i := 0; i < len(args); i++ {\n\t\t// Make sure the next argument is a flag and skip if not set\n\t\tflag, ok := args[i].(cli.Flag)\n\t\tif !ok {\n\t\t\tpanic(fmt.Sprintf(\"invalid argument, not cli.Flag type: %T\", args[i]))\n\t\t}\n\t\t// Check if next arg extends current and expand its name if so\n\t\tname := flag.GetName()\n\n\t\tif i+1 < len(args) {\n\t\t\tswitch option := args[i+1].(type) {\n\t\t\tcase string:\n\t\t\t\t// Extended flag, expand the name and shift the arguments\n\t\t\t\tif ctx.GlobalString(flag.GetName()) == option {\n\t\t\t\t\tname += \"=\" + option\n\t\t\t\t}\n\t\t\t\ti++\n\n\t\t\tcase cli.Flag:\n\t\t\tdefault:\n\t\t\t\tpanic(fmt.Sprintf(\"invalid argument, not cli.Flag or string extension: %T\", args[i+1]))\n\t\t\t}\n\t\t}\n\t\t// Mark the flag if it's set\n\t\tif ctx.GlobalIsSet(flag.GetName()) {\n\t\t\tset = append(set, \"--\"+name)\n\t\t}\n\t}\n\tif len(set) > 1 {\n\t\tFatalf(\"Flags %v can't be used at the same time\", strings.Join(set, \", \"))\n\t}\n}\n\n// SetSeroConfig applies sero-related command line flags to the config.\nfunc SetSeroConfig(ctx *cli.Context, stack *node.Node, cfg *sero.Config) {\n\t// Avoid conflicting network flags\n\tcheckExclusive(ctx, AlphanetFlag, DeveloperFlag)\n\t// checkExclusive(ctx, FastSyncFlag, LightModeFlag, SyncModeFlag)\n\n\tsetGPO(ctx, &cfg.GPO)\n\tsetTxPool(ctx, &cfg.TxPool)\n\tsetEthash(ctx, cfg)\n\n\tcfg.Proof = initProof(ctx)\n\tcfg.SyncMode = *GlobalTextMarshaler(ctx, SyncModeFlag.Name).(*downloader.SyncMode)\n\tif ctx.GlobalIsSet(NetworkIdFlag.Name) {\n\t\tcfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name)\n\t}\n\n\tif ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheDatabaseFlag.Name) {\n\t\tcfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100\n\t}\n\tcfg.DatabaseHandles = makeDatabaseHandles()\n\n\tif gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != \"full\" && gcmode != \"archive\" {\n\t\tFatalf(\"--%s must be either 'full' or 'archive'\", GCModeFlag.Name)\n\t}\n\tcfg.NoPruning = ctx.GlobalString(GCModeFlag.Name) == \"archive\"\n\n\tif ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) {\n\t\tcfg.TrieCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100\n\t}\n\n\tzconfig.G_p_thread_num = ctx.GlobalInt(PThreadsFlag.Name)\n\tzconfig.G_v_thread_num = ctx.GlobalInt(VThreadsFlag.Name)\n\n\tif ctx.GlobalIsSet(MinerThreadsFlag.Name) {\n\t\tcfg.MinerThreads = ctx.GlobalInt(MinerThreadsFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(DocRootFlag.Name) {\n\t\tcfg.DocRoot = ctx.GlobalString(DocRootFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(ExtraDataFlag.Name) {\n\t\tcfg.ExtraData = []byte(ctx.GlobalString(ExtraDataFlag.Name))\n\t}\n\tif ctx.GlobalIsSet(GasPriceFlag.Name) {\n\t\tcfg.GasPrice = GlobalBig(ctx, GasPriceFlag.Name)\n\t}\n\tif ctx.GlobalIsSet(VMEnableDebugFlag.Name) {\n\t\t// TODO(fjl): force-enable this in --dev mode\n\t\tcfg.EnablePreimageRecording = ctx.GlobalBool(VMEnableDebugFlag.Name)\n\t}\n\n\tif ctx.GlobalIsSet(ExchangeFlag.Name) {\n\t\tseroparam.InitExchange(true)\n\t\tcfg.StartExchange = true\n\t\tif ctx.GlobalIsSet(AutoMergeFlag.Name) {\n\t\t\tcfg.AutoMerge = true\n\t\t}\n\t}\n\n\tif ctx.GlobalIsSet(ExchangeValueStrFlag.Name) {\n\t\tseroparam.InitExchangeValueStr(true)\n\t}\n\n\tif ctx.GlobalIsSet(StakeFlag.Name) {\n\t\tcfg.StartStake = true\n\t}\n\n\tif ctx.GlobalIsSet(LightNodeFlag.Name) {\n\t\tcfg.StartLight = true\n\t}\n\n\tif ctx.GlobalIsSet(CloseAcceptTx.Name) {\n\t\tcfg.CloseAcceptTx = true\n\t}\n\n\t// Override any default configs for hard coded networks.\n\tswitch {\n\tcase ctx.GlobalBool(AlphanetFlag.Name):\n\t\tif !ctx.GlobalIsSet(NetworkIdFlag.Name) {\n\t\t\tcfg.NetworkId = 1000\n\t\t}\n\t\tcfg.Genesis = core.DefaultAlphanetGenesisBlock()\n\tcase ctx.GlobalBool(DeveloperFlag.Name):\n\t\tif !ctx.GlobalIsSet(NetworkIdFlag.Name) {\n\t\t\tcfg.NetworkId = 1024\n\t\t}\n\n\t\tcfg.Genesis = core.DeveloperGenesisBlock()\n\t}\n\t// TODO(fjl): move trie cache generations into config\n\tif gen := ctx.GlobalInt(TrieCacheGenFlag.Name); gen > 0 {\n\t\tstate.MaxTrieCacheGen = uint16(gen)\n\t}\n}\n\n// CheckExclusive verifies that only a single instance of the provided flags was\n// set by the user. Each flag might optionally be followed by a string type to\n// specialize it further.\nfunc CheckExclusive(ctx *cli.Context, args ...interface{}) {\n\tset := make([]string, 0, 1)\n\tfor i := 0; i < len(args); i++ {\n\t\t// Make sure the next argument is a flag and skip if not set\n\t\tflag, ok := args[i].(cli.Flag)\n\t\tif !ok {\n\t\t\tpanic(fmt.Sprintf(\"invalid argument, not cli.Flag type: %T\", args[i]))\n\t\t}\n\t\t// Check if next arg extends current and expand its name if so\n\t\tname := flag.GetName()\n\n\t\tif i+1 < len(args) {\n\t\t\tswitch option := args[i+1].(type) {\n\t\t\tcase string:\n\t\t\t\t// Extended flag check, make sure value set doesn't conflict with passed in option\n\t\t\t\tif ctx.GlobalString(flag.GetName()) == option {\n\t\t\t\t\tname += \"=\" + option\n\t\t\t\t\tset = append(set, \"--\"+name)\n\t\t\t\t}\n\t\t\t\t// shift arguments and continue\n\t\t\t\ti++\n\t\t\t\tcontinue\n\n\t\t\tcase cli.Flag:\n\t\t\tdefault:\n\t\t\t\tpanic(fmt.Sprintf(\"invalid argument, not cli.Flag or string extension: %T\", args[i+1]))\n\t\t\t}\n\t\t}\n\t\t// Mark the flag if it's set\n\t\tif ctx.GlobalIsSet(flag.GetName()) {\n\t\t\tset = append(set, \"--\"+name)\n\t\t}\n\t}\n\tif len(set) > 1 {\n\t\tFatalf(\"Flags %v can't be used at the same time\", strings.Join(set, \", \"))\n\t}\n}\n\n// SetDashboardConfig applies dashboard related command line flags to the config.\nfunc SetDashboardConfig(ctx *cli.Context, cfg *dashboard.Config) {\n\tcfg.Host = ctx.GlobalString(DashboardAddrFlag.Name)\n\tcfg.Port = ctx.GlobalInt(DashboardPortFlag.Name)\n\tcfg.Refresh = ctx.GlobalDuration(DashboardRefreshFlag.Name)\n}\n\n// RegisterEthService adds an Sero client to the stack.\nfunc RegisterEthService(stack *node.Node, cfg *sero.Config) {\n\terr := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {\n\t\tfullNode, err := sero.New(ctx, cfg)\n\t\treturn fullNode, err\n\t})\n\tif err != nil {\n\t\tFatalf(\"Failed to register the Sero service: %v\", err)\n\t}\n}\n\n// RegisterDashboardService adds a dashboard to the stack.\nfunc RegisterDashboardService(stack *node.Node, cfg *dashboard.Config, commit string) {\n\tstack.Register(func(ctx *node.ServiceContext) (node.Service, error) {\n\t\treturn dashboard.New(cfg, commit, ctx.ResolvePath(\"logs\")), nil\n\t})\n}\n\n// SetupNetwork configures the system for either the main net or some test network.\nfunc SetupNetwork(ctx *cli.Context) {\n\t// TODO(fjl): move target gas limit into config\n\tparams.TargetGasLimit = ctx.GlobalUint64(TargetGasLimitFlag.Name)\n}\n\nfunc SetupMetrics(ctx *cli.Context) {\n\tif metrics.Enabled {\n\t\tlog.Info(\"Enabling metrics collection\")\n\t\tvar (\n\t\t\tenableExport = ctx.GlobalBool(MetricsEnableInfluxDBFlag.Name)\n\t\t\tendpoint     = ctx.GlobalString(MetricsInfluxDBEndpointFlag.Name)\n\t\t\tdatabase     = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name)\n\t\t\tusername     = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name)\n\t\t\tpassword     = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name)\n\t\t\thosttag      = ctx.GlobalString(MetricsInfluxDBHostTagFlag.Name)\n\t\t)\n\n\t\tif enableExport {\n\t\t\tlog.Info(\"Enabling metrics export to InfluxDB\")\n\t\t\tgo influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, \"gero.\", map[string]string{\n\t\t\t\t\"host\": hosttag,\n\t\t\t})\n\t\t}\n\t}\n}\n\n// MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails.\nfunc MakeChainDatabase(ctx *cli.Context, stack *node.Node) serodb.Database {\n\tvar (\n\t\tcache   = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100\n\t\thandles = makeDatabaseHandles()\n\t)\n\tname := \"chaindata\"\n\tchainDb, err := stack.OpenDatabase(name, cache, handles)\n\tif err != nil {\n\t\tFatalf(\"Could not open database: %v\", err)\n\t}\n\treturn chainDb\n}\n\nfunc MakeGenesis(ctx *cli.Context) *core.Genesis {\n\tvar genesis *core.Genesis\n\tswitch {\n\tcase ctx.GlobalBool(AlphanetFlag.Name):\n\t\tgenesis = core.DefaultAlphanetGenesisBlock()\n\tcase ctx.GlobalBool(DeveloperFlag.Name):\n\t\tgenesis = core.DeveloperGenesisBlock()\n\t}\n\treturn genesis\n}\n\n// MakeChain creates a chain manager from set command line flags.\nfunc MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chainDb serodb.Database) {\n\tvar err error\n\tchainDb = MakeChainDatabase(ctx, stack)\n\n\tconfig, _, err := core.SetupGenesisBlock(chainDb, MakeGenesis(ctx))\n\tif err != nil {\n\t\tFatalf(\"%v\", err)\n\t}\n\tvar engine consensus.Engine\n\n\tengine = ethash.NewFaker()\n\tif !ctx.GlobalBool(FakePoWFlag.Name) {\n\t\tengine = ethash.New(ethash.Config{\n\t\t\tCacheDir:       stack.ResolvePath(sero.DefaultConfig.Ethash.CacheDir),\n\t\t\tCachesInMem:    sero.DefaultConfig.Ethash.CachesInMem,\n\t\t\tCachesOnDisk:   sero.DefaultConfig.Ethash.CachesOnDisk,\n\t\t\tDatasetDir:     stack.ResolvePath(sero.DefaultConfig.Ethash.DatasetDir),\n\t\t\tDatasetsInMem:  sero.DefaultConfig.Ethash.DatasetsInMem,\n\t\t\tDatasetsOnDisk: sero.DefaultConfig.Ethash.DatasetsOnDisk,\n\t\t})\n\t}\n\tif gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != \"full\" && gcmode != \"archive\" {\n\t\tFatalf(\"--%s must be either 'full' or 'archive'\", GCModeFlag.Name)\n\t}\n\tcache := &core.CacheConfig{\n\t\tDisabled:      ctx.GlobalString(GCModeFlag.Name) == \"archive\",\n\t\tTrieNodeLimit: sero.DefaultConfig.TrieCache,\n\t\tTrieTimeLimit: sero.DefaultConfig.TrieTimeout,\n\t}\n\tif ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) {\n\t\tcache.TrieNodeLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100\n\t}\n\tvmcfg := vm.Config{EnablePreimageRecording: ctx.GlobalBool(VMEnableDebugFlag.Name)}\n\tchain, err = core.NewBlockChain(chainDb, cache, config, engine, vmcfg, nil)\n\tif err != nil {\n\t\tFatalf(\"Can't create BlockChain: %v\", err)\n\t}\n\treturn chain, chainDb\n}\n\n// MakeConsolePreloads retrieves the absolute paths for the console JavaScript\n// scripts to preload before starting.\nfunc MakeConsolePreloads(ctx *cli.Context) []string {\n\t// Skip preloading if there's nothing to preload\n\tif ctx.GlobalString(PreloadJSFlag.Name) == \"\" {\n\t\treturn nil\n\t}\n\t// Otherwise resolve absolute paths and return them\n\tpreloads := []string{}\n\n\tassets := ctx.GlobalString(JSpathFlag.Name)\n\tfor _, file := range strings.Split(ctx.GlobalString(PreloadJSFlag.Name), \",\") {\n\t\tpreloads = append(preloads, common.AbsolutePath(assets, strings.TrimSpace(file)))\n\t}\n\treturn preloads\n}\n\n// MigrateFlags sets the global flag from a local flag when it's set.\n// This is a temporary function used for migrating old command/flags to the\n// new format.\n//\n// e.g. gero account new --keystore /tmp/mykeystore --lightkdf\n//\n// is equivalent after calling this method with:\n//\n// gero --keystore /tmp/mykeystore --lightkdf account new\n//\n// This allows the use of the existing configuration functionality.\n// When all flags are migrated this function can be removed and the existing\n// configuration functionality must be changed that is uses local flags\nfunc MigrateFlags(action func(ctx *cli.Context) error) func(*cli.Context) error {\n\treturn func(ctx *cli.Context) error {\n\t\tfor _, name := range ctx.FlagNames() {\n\t\t\tif ctx.IsSet(name) {\n\t\t\t\tctx.GlobalSet(name, ctx.String(name))\n\t\t\t}\n\t\t}\n\t\treturn action(ctx)\n\t}\n}\n"
  },
  {
    "path": "common/address/account_types.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage address\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n)\n\n// Lengths of hashes and Accountes in bytes.\nconst (\n\t// AccountAddressLength is the expected length of the adddress\n\tAccountAddressLength = 64\n\tSeedLength           = 32\n)\n\ntype Seed [SeedLength]byte\n\nfunc (priv *Seed) SeedToUint256() *c_type.Uint256 {\n\tseed := c_type.Uint256{}\n\tcopy(seed[:], priv[:])\n\treturn &seed\n\n}\n\nfunc IsBase58Str(s string) bool {\n\n\tpattern := \"^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$\"\n\tmatch, err := regexp.MatchString(pattern, s)\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn match\n\n}\n\ntype MixBase58Adrress []byte\n\nfunc (b MixBase58Adrress) MarshalText() ([]byte, error) {\n\treturn []byte(base58.Encode(b)), nil\n}\n\nfunc (b MixBase58Adrress) IsPkr() bool {\n\treturn len(b) == 96\n}\n\nfunc (b MixBase58Adrress) ToPkr() c_type.PKr {\n\tvar pkr c_type.PKr\n\tif b.IsPkr() {\n\t\tcopy(pkr[:], b[:])\n\t} else {\n\t\tvar pk c_type.Uint512\n\t\tcopy(pk[:], b[:])\n\t\tpkr = superzk.Pk2PKr(&pk, nil)\n\t}\n\treturn pkr\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *MixBase58Adrress) UnmarshalText(input []byte) error {\n\n\tif len(input) == 0 {\n\t\treturn errors.New(\"empty string\")\n\t}\n\tif IsBase58Str(string(input)) {\n\t\tout := base58.Decode(string(input))\n\t\tif len(out) == 96 {\n\t\t\terr := ValidPkr(out)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t*b = out[:]\n\t\t\treturn nil\n\t\t} else if len(out) == 64 {\n\t\t\terr := ValidPk(out)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\t*b = out[:]\n\t\t\treturn nil\n\t\t} else {\n\t\t\treturn errors.New(\"invalid mix address\")\n\t\t}\n\t} else {\n\t\treturn errors.New(\"is not base58 address\")\n\t}\n}\n\ntype TKAddress [64]byte\n\nfunc Base58ToTk(str string) (ret TKAddress) {\n\tb := base58.Decode(str)\n\tcopy(ret[:], b)\n\treturn\n}\n\nfunc (b TKAddress) ToTk() c_type.Tk {\n\tresult := c_type.Tk{}\n\tcopy(result[:], b[:])\n\n\treturn result\n}\n\nfunc (b *TKAddress) ToPk() (ret PKAddress) {\n\tpk, _ := superzk.Tk2Pk(b.ToTk().NewRef())\n\tcopy(ret[:], pk[:])\n\treturn\n}\n\nfunc (c TKAddress) String() string {\n\treturn base58.Encode(c[:])\n}\n\nfunc (b TKAddress) MarshalText() ([]byte, error) {\n\treturn []byte(base58.Encode(b[:])), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *TKAddress) UnmarshalText(input []byte) error {\n\n\tif len(input) == 0 {\n\t\treturn nil\n\t}\n\tif IsBase58Str(string(input)) {\n\t\tout := base58.Decode(string(input))\n\t\tif len(out) == 64 {\n\t\t\tcopy(b[:], out)\n\t\t} else {\n\t\t\treturn errors.New(\"ivalid TK\")\n\t\t}\n\t\treturn nil\n\n\t} else {\n\t\treturn errors.New(\"is not base58 string\")\n\t}\n}\n\ntype PKAddress [64]byte\n\nfunc StringToPk(str string) (ret PKAddress) {\n\tout := base58.Decode(str)\n\tcopy(ret[:], out)\n\treturn\n}\n\nfunc (b PKAddress) String() string {\n\treturn base58.Encode(b[:])\n}\n\nfunc (b PKAddress) ToUint512() c_type.Uint512 {\n\tresult := c_type.Uint512{}\n\tcopy(result[:], b[:])\n\n\treturn result\n}\n\nfunc NewPKAddres(b []byte) (ret PKAddress) {\n\tcopy(ret[:], b)\n\treturn\n}\n\nfunc (b PKAddress) MarshalText() ([]byte, error) {\n\treturn []byte(b.String()), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *PKAddress) UnmarshalText(input []byte) (e error) {\n\tif len(input) == 0 {\n\t\treturn nil\n\t}\n\tvar out []byte\n\tif IsBase58Str(string(input)) {\n\t\tout = base58.Decode(string(input))\n\n\t} else if IsHex(string(input)) {\n\t\tout, e = DecodeHex(string(input))\n\t\tif e != nil {\n\t\t\treturn\n\t\t}\n\n\t} else {\n\t\treturn errors.New(\"invalid pk string\")\n\t}\n\tif len(out) == 64 {\n\t\te = ValidPk(out)\n\t\tif e != nil {\n\t\t\treturn e\n\t\t}\n\t\tcopy(b[:], out)\n\t\treturn\n\t} else {\n\t\treturn errors.New(\"pk address must be 64 bytes\")\n\t}\n}\n\nfunc ValidPk(addr []byte) error {\n\tif len(addr) == 64 {\n\t\tpk := c_type.Uint512{}\n\t\tcopy(pk[:], addr)\n\t\tif !superzk.IsPKValid(&pk) {\n\t\t\treturn errors.New(\"invalid PK\")\n\t\t}\n\t} else {\n\t\treturn errors.New(\"pk address must be 64 bytes\")\n\t}\n\treturn nil\n}\n\nfunc ValidPkr(addr []byte) error {\n\tif len(addr) == 96 {\n\t\tvar pkr c_type.PKr\n\t\tcopy(pkr[:], addr)\n\t\tif !superzk.IsPKrValid(&pkr) {\n\t\t\treturn errors.New(\"invalid pkr\")\n\t\t}\n\t} else {\n\t\treturn errors.New(\"pkr address must be 96 bytes\")\n\t}\n\treturn nil\n}\n\nfunc Decode(input string) ([]byte, error) {\n\tif len(input) == 0 {\n\t\treturn nil, errors.New(\"empty hex strin\")\n\t}\n\tif !has0xPrefix(input) {\n\t\treturn nil, errors.New(\"hex string without 0x prefix\")\n\t}\n\tb, err := hex.DecodeString(input[2:])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn b, err\n}\n\nfunc has0xPrefix(input string) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\nfunc isHexCharacter(c byte) bool {\n\treturn ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')\n}\n\nfunc IsHex(s string) bool {\n\tif has0xPrefix(s) {\n\t\ts = s[2:]\n\t}\n\n\tif len(s)%2 != 0 {\n\t\treturn false\n\t}\n\n\tfor _, c := range []byte(s) {\n\t\tif !isHexCharacter(c) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\nfunc DecodeHex(hex string) (bytes []byte, err error) {\n\tif strings.Index(hex, \"0x\") != 0 {\n\t\thex = \"0x\" + hex\n\t}\n\tif bytes, err = Decode(hex); err != nil {\n\t\treturn\n\t} else {\n\t\tif len(bytes) == 0 {\n\t\t\terr = errors.New(\"the bytes length is 0\")\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc DecodeAddr(input []byte) (bytes []byte, e error) {\n\tif IsBase58Str(string(input)) {\n\t\tbytes = base58.Decode(string(input))\n\t\treturn\n\t} else if IsHex(string(input)) {\n\t\treturn DecodeHex(string(input))\n\n\t} else {\n\t\te = errors.New(\"invalid address string\")\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "common/big.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport \"math/big\"\n\n// Common big integers often used\nvar (\n\tBig1   = big.NewInt(1)\n\tBig2   = big.NewInt(2)\n\tBig3   = big.NewInt(3)\n\tBig0   = big.NewInt(0)\n\tBig32  = big.NewInt(32)\n\tBig256 = big.NewInt(256)\n\tBig257 = big.NewInt(257)\n)\n"
  },
  {
    "path": "common/bitutil/bitutil.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Adapted from: https://golang.org/src/crypto/cipher/xor.go\n\n// Package bitutil implements fast bitwise operations.\npackage bitutil\n\nimport (\n\t\"runtime\"\n\t\"unsafe\"\n)\n\nconst wordSize = int(unsafe.Sizeof(uintptr(0)))\nconst supportsUnaligned = runtime.GOARCH == \"386\" || runtime.GOARCH == \"amd64\" || runtime.GOARCH == \"ppc64\" || runtime.GOARCH == \"ppc64le\" || runtime.GOARCH == \"s390x\"\n\n// XORBytes xors the bytes in a and b. The destination is assumed to have enough\n// space. Returns the number of bytes xor'd.\nfunc XORBytes(dst, a, b []byte) int {\n\tif supportsUnaligned {\n\t\treturn fastXORBytes(dst, a, b)\n\t}\n\treturn safeXORBytes(dst, a, b)\n}\n\n// fastXORBytes xors in bulk. It only works on architectures that support\n// unaligned read/writes.\nfunc fastXORBytes(dst, a, b []byte) int {\n\tn := len(a)\n\tif len(b) < n {\n\t\tn = len(b)\n\t}\n\tw := n / wordSize\n\tif w > 0 {\n\t\tdw := *(*[]uintptr)(unsafe.Pointer(&dst))\n\t\taw := *(*[]uintptr)(unsafe.Pointer(&a))\n\t\tbw := *(*[]uintptr)(unsafe.Pointer(&b))\n\t\tfor i := 0; i < w; i++ {\n\t\t\tdw[i] = aw[i] ^ bw[i]\n\t\t}\n\t}\n\tfor i := n - n%wordSize; i < n; i++ {\n\t\tdst[i] = a[i] ^ b[i]\n\t}\n\treturn n\n}\n\n// safeXORBytes xors one by one. It works on all architectures, independent if\n// it supports unaligned read/writes or not.\nfunc safeXORBytes(dst, a, b []byte) int {\n\tn := len(a)\n\tif len(b) < n {\n\t\tn = len(b)\n\t}\n\tfor i := 0; i < n; i++ {\n\t\tdst[i] = a[i] ^ b[i]\n\t}\n\treturn n\n}\n\n// ANDBytes ands the bytes in a and b. The destination is assumed to have enough\n// space. Returns the number of bytes and'd.\nfunc ANDBytes(dst, a, b []byte) int {\n\tif supportsUnaligned {\n\t\treturn fastANDBytes(dst, a, b)\n\t}\n\treturn safeANDBytes(dst, a, b)\n}\n\n// fastANDBytes ands in bulk. It only works on architectures that support\n// unaligned read/writes.\nfunc fastANDBytes(dst, a, b []byte) int {\n\tn := len(a)\n\tif len(b) < n {\n\t\tn = len(b)\n\t}\n\tw := n / wordSize\n\tif w > 0 {\n\t\tdw := *(*[]uintptr)(unsafe.Pointer(&dst))\n\t\taw := *(*[]uintptr)(unsafe.Pointer(&a))\n\t\tbw := *(*[]uintptr)(unsafe.Pointer(&b))\n\t\tfor i := 0; i < w; i++ {\n\t\t\tdw[i] = aw[i] & bw[i]\n\t\t}\n\t}\n\tfor i := n - n%wordSize; i < n; i++ {\n\t\tdst[i] = a[i] & b[i]\n\t}\n\treturn n\n}\n\n// safeANDBytes ands one by one. It works on all architectures, independent if\n// it supports unaligned read/writes or not.\nfunc safeANDBytes(dst, a, b []byte) int {\n\tn := len(a)\n\tif len(b) < n {\n\t\tn = len(b)\n\t}\n\tfor i := 0; i < n; i++ {\n\t\tdst[i] = a[i] & b[i]\n\t}\n\treturn n\n}\n\n// ORBytes ors the bytes in a and b. The destination is assumed to have enough\n// space. Returns the number of bytes or'd.\nfunc ORBytes(dst, a, b []byte) int {\n\tif supportsUnaligned {\n\t\treturn fastORBytes(dst, a, b)\n\t}\n\treturn safeORBytes(dst, a, b)\n}\n\n// fastORBytes ors in bulk. It only works on architectures that support\n// unaligned read/writes.\nfunc fastORBytes(dst, a, b []byte) int {\n\tn := len(a)\n\tif len(b) < n {\n\t\tn = len(b)\n\t}\n\tw := n / wordSize\n\tif w > 0 {\n\t\tdw := *(*[]uintptr)(unsafe.Pointer(&dst))\n\t\taw := *(*[]uintptr)(unsafe.Pointer(&a))\n\t\tbw := *(*[]uintptr)(unsafe.Pointer(&b))\n\t\tfor i := 0; i < w; i++ {\n\t\t\tdw[i] = aw[i] | bw[i]\n\t\t}\n\t}\n\tfor i := n - n%wordSize; i < n; i++ {\n\t\tdst[i] = a[i] | b[i]\n\t}\n\treturn n\n}\n\n// safeORBytes ors one by one. It works on all architectures, independent if\n// it supports unaligned read/writes or not.\nfunc safeORBytes(dst, a, b []byte) int {\n\tn := len(a)\n\tif len(b) < n {\n\t\tn = len(b)\n\t}\n\tfor i := 0; i < n; i++ {\n\t\tdst[i] = a[i] | b[i]\n\t}\n\treturn n\n}\n\n// TestBytes tests whether any bit is set in the input byte slice.\nfunc TestBytes(p []byte) bool {\n\tif supportsUnaligned {\n\t\treturn fastTestBytes(p)\n\t}\n\treturn safeTestBytes(p)\n}\n\n// fastTestBytes tests for set bits in bulk. It only works on architectures that\n// support unaligned read/writes.\nfunc fastTestBytes(p []byte) bool {\n\tn := len(p)\n\tw := n / wordSize\n\tif w > 0 {\n\t\tpw := *(*[]uintptr)(unsafe.Pointer(&p))\n\t\tfor i := 0; i < w; i++ {\n\t\t\tif pw[i] != 0 {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\tfor i := n - n%wordSize; i < n; i++ {\n\t\tif p[i] != 0 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// safeTestBytes tests for set bits one byte at a time. It works on all\n// architectures, independent if it supports unaligned read/writes or not.\nfunc safeTestBytes(p []byte) bool {\n\tfor i := 0; i < len(p); i++ {\n\t\tif p[i] != 0 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "common/bitutil/bitutil_test.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Adapted from: https://golang.org/src/crypto/cipher/xor_test.go\n\npackage bitutil\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\n// Tests that bitwise XOR works for various alignments.\nfunc TestXOR(t *testing.T) {\n\tfor alignP := 0; alignP < 2; alignP++ {\n\t\tfor alignQ := 0; alignQ < 2; alignQ++ {\n\t\t\tfor alignD := 0; alignD < 2; alignD++ {\n\t\t\t\tp := make([]byte, 1023)[alignP:]\n\t\t\t\tq := make([]byte, 1023)[alignQ:]\n\n\t\t\t\tfor i := 0; i < len(p); i++ {\n\t\t\t\t\tp[i] = byte(i)\n\t\t\t\t}\n\t\t\t\tfor i := 0; i < len(q); i++ {\n\t\t\t\t\tq[i] = byte(len(q) - i)\n\t\t\t\t}\n\t\t\t\td1 := make([]byte, 1023+alignD)[alignD:]\n\t\t\t\td2 := make([]byte, 1023+alignD)[alignD:]\n\n\t\t\t\tXORBytes(d1, p, q)\n\t\t\t\tsafeXORBytes(d2, p, q)\n\t\t\t\tif !bytes.Equal(d1, d2) {\n\t\t\t\t\tt.Error(\"not equal\", d1, d2)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Tests that bitwise AND works for various alignments.\nfunc TestAND(t *testing.T) {\n\tfor alignP := 0; alignP < 2; alignP++ {\n\t\tfor alignQ := 0; alignQ < 2; alignQ++ {\n\t\t\tfor alignD := 0; alignD < 2; alignD++ {\n\t\t\t\tp := make([]byte, 1023)[alignP:]\n\t\t\t\tq := make([]byte, 1023)[alignQ:]\n\n\t\t\t\tfor i := 0; i < len(p); i++ {\n\t\t\t\t\tp[i] = byte(i)\n\t\t\t\t}\n\t\t\t\tfor i := 0; i < len(q); i++ {\n\t\t\t\t\tq[i] = byte(len(q) - i)\n\t\t\t\t}\n\t\t\t\td1 := make([]byte, 1023+alignD)[alignD:]\n\t\t\t\td2 := make([]byte, 1023+alignD)[alignD:]\n\n\t\t\t\tANDBytes(d1, p, q)\n\t\t\t\tsafeANDBytes(d2, p, q)\n\t\t\t\tif !bytes.Equal(d1, d2) {\n\t\t\t\t\tt.Error(\"not equal\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Tests that bitwise OR works for various alignments.\nfunc TestOR(t *testing.T) {\n\tfor alignP := 0; alignP < 2; alignP++ {\n\t\tfor alignQ := 0; alignQ < 2; alignQ++ {\n\t\t\tfor alignD := 0; alignD < 2; alignD++ {\n\t\t\t\tp := make([]byte, 1023)[alignP:]\n\t\t\t\tq := make([]byte, 1023)[alignQ:]\n\n\t\t\t\tfor i := 0; i < len(p); i++ {\n\t\t\t\t\tp[i] = byte(i)\n\t\t\t\t}\n\t\t\t\tfor i := 0; i < len(q); i++ {\n\t\t\t\t\tq[i] = byte(len(q) - i)\n\t\t\t\t}\n\t\t\t\td1 := make([]byte, 1023+alignD)[alignD:]\n\t\t\t\td2 := make([]byte, 1023+alignD)[alignD:]\n\n\t\t\t\tORBytes(d1, p, q)\n\t\t\t\tsafeORBytes(d2, p, q)\n\t\t\t\tif !bytes.Equal(d1, d2) {\n\t\t\t\t\tt.Error(\"not equal\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Tests that bit testing works for various alignments.\nfunc TestTest(t *testing.T) {\n\tfor align := 0; align < 2; align++ {\n\t\t// Test for bits set in the bulk part\n\t\tp := make([]byte, 1023)[align:]\n\t\tp[100] = 1\n\n\t\tif TestBytes(p) != safeTestBytes(p) {\n\t\t\tt.Error(\"not equal\")\n\t\t}\n\t\t// Test for bits set in the tail part\n\t\tq := make([]byte, 1023)[align:]\n\t\tq[len(q)-1] = 1\n\n\t\tif TestBytes(q) != safeTestBytes(q) {\n\t\t\tt.Error(\"not equal\")\n\t\t}\n\t}\n}\n\n// Benchmarks the potentially optimized XOR performance.\nfunc BenchmarkFastXOR1KB(b *testing.B) { benchmarkFastXOR(b, 1024) }\nfunc BenchmarkFastXOR2KB(b *testing.B) { benchmarkFastXOR(b, 2048) }\nfunc BenchmarkFastXOR4KB(b *testing.B) { benchmarkFastXOR(b, 4096) }\n\nfunc benchmarkFastXOR(b *testing.B, size int) {\n\tp, q := make([]byte, size), make([]byte, size)\n\n\tfor i := 0; i < b.N; i++ {\n\t\tXORBytes(p, p, q)\n\t}\n}\n\n// Benchmarks the baseline XOR performance.\nfunc BenchmarkBaseXOR1KB(b *testing.B) { benchmarkBaseXOR(b, 1024) }\nfunc BenchmarkBaseXOR2KB(b *testing.B) { benchmarkBaseXOR(b, 2048) }\nfunc BenchmarkBaseXOR4KB(b *testing.B) { benchmarkBaseXOR(b, 4096) }\n\nfunc benchmarkBaseXOR(b *testing.B, size int) {\n\tp, q := make([]byte, size), make([]byte, size)\n\n\tfor i := 0; i < b.N; i++ {\n\t\tsafeXORBytes(p, p, q)\n\t}\n}\n\n// Benchmarks the potentially optimized AND performance.\nfunc BenchmarkFastAND1KB(b *testing.B) { benchmarkFastAND(b, 1024) }\nfunc BenchmarkFastAND2KB(b *testing.B) { benchmarkFastAND(b, 2048) }\nfunc BenchmarkFastAND4KB(b *testing.B) { benchmarkFastAND(b, 4096) }\n\nfunc benchmarkFastAND(b *testing.B, size int) {\n\tp, q := make([]byte, size), make([]byte, size)\n\n\tfor i := 0; i < b.N; i++ {\n\t\tANDBytes(p, p, q)\n\t}\n}\n\n// Benchmarks the baseline AND performance.\nfunc BenchmarkBaseAND1KB(b *testing.B) { benchmarkBaseAND(b, 1024) }\nfunc BenchmarkBaseAND2KB(b *testing.B) { benchmarkBaseAND(b, 2048) }\nfunc BenchmarkBaseAND4KB(b *testing.B) { benchmarkBaseAND(b, 4096) }\n\nfunc benchmarkBaseAND(b *testing.B, size int) {\n\tp, q := make([]byte, size), make([]byte, size)\n\n\tfor i := 0; i < b.N; i++ {\n\t\tsafeANDBytes(p, p, q)\n\t}\n}\n\n// Benchmarks the potentially optimized OR performance.\nfunc BenchmarkFastOR1KB(b *testing.B) { benchmarkFastOR(b, 1024) }\nfunc BenchmarkFastOR2KB(b *testing.B) { benchmarkFastOR(b, 2048) }\nfunc BenchmarkFastOR4KB(b *testing.B) { benchmarkFastOR(b, 4096) }\n\nfunc benchmarkFastOR(b *testing.B, size int) {\n\tp, q := make([]byte, size), make([]byte, size)\n\n\tfor i := 0; i < b.N; i++ {\n\t\tORBytes(p, p, q)\n\t}\n}\n\n// Benchmarks the baseline OR performance.\nfunc BenchmarkBaseOR1KB(b *testing.B) { benchmarkBaseOR(b, 1024) }\nfunc BenchmarkBaseOR2KB(b *testing.B) { benchmarkBaseOR(b, 2048) }\nfunc BenchmarkBaseOR4KB(b *testing.B) { benchmarkBaseOR(b, 4096) }\n\nfunc benchmarkBaseOR(b *testing.B, size int) {\n\tp, q := make([]byte, size), make([]byte, size)\n\n\tfor i := 0; i < b.N; i++ {\n\t\tsafeORBytes(p, p, q)\n\t}\n}\n\n// Benchmarks the potentially optimized bit testing performance.\nfunc BenchmarkFastTest1KB(b *testing.B) { benchmarkFastTest(b, 1024) }\nfunc BenchmarkFastTest2KB(b *testing.B) { benchmarkFastTest(b, 2048) }\nfunc BenchmarkFastTest4KB(b *testing.B) { benchmarkFastTest(b, 4096) }\n\nfunc benchmarkFastTest(b *testing.B, size int) {\n\tp := make([]byte, size)\n\tfor i := 0; i < b.N; i++ {\n\t\tTestBytes(p)\n\t}\n}\n\n// Benchmarks the baseline bit testing performance.\nfunc BenchmarkBaseTest1KB(b *testing.B) { benchmarkBaseTest(b, 1024) }\nfunc BenchmarkBaseTest2KB(b *testing.B) { benchmarkBaseTest(b, 2048) }\nfunc BenchmarkBaseTest4KB(b *testing.B) { benchmarkBaseTest(b, 4096) }\n\nfunc benchmarkBaseTest(b *testing.B, size int) {\n\tp := make([]byte, size)\n\tfor i := 0; i < b.N; i++ {\n\t\tsafeTestBytes(p)\n\t}\n}\n"
  },
  {
    "path": "common/bitutil/compress.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bitutil\n\nimport \"errors\"\n\nvar (\n\t// errMissingData is returned from decompression if the byte referenced by\n\t// the bitset header overflows the input data.\n\terrMissingData = errors.New(\"missing bytes on input\")\n\n\t// errUnreferencedData is returned from decompression if not all bytes were used\n\t// up from the input data after decompressing it.\n\terrUnreferencedData = errors.New(\"extra bytes on input\")\n\n\t// errExceededTarget is returned from decompression if the bitset header has\n\t// more bits defined than the number of target buffer space available.\n\terrExceededTarget = errors.New(\"target data size exceeded\")\n\n\t// errZeroContent is returned from decompression if a data byte referenced in\n\t// the bitset header is actually a zero byte.\n\terrZeroContent = errors.New(\"zero byte in input content\")\n)\n\n// The compression algorithm implemented by CompressBytes and DecompressBytes is\n// optimized for sparse input data which contains a lot of zero bytes. Decompression\n// requires knowledge of the decompressed data length.\n//\n// Compression works as follows:\n//\n//   if data only contains zeroes,\n//       CompressBytes(data) == nil\n//   otherwise if len(data) <= 1,\n//       CompressBytes(data) == data\n//   otherwise:\n//       CompressBytes(data) == append(CompressBytes(nonZeroBitset(data)), nonZeroBytes(data)...)\n//       where\n//         nonZeroBitset(data) is a bit vector with len(data) bits (MSB first):\n//             nonZeroBitset(data)[i/8] && (1 << (7-i%8)) != 0  if data[i] != 0\n//             len(nonZeroBitset(data)) == (len(data)+7)/8\n//         nonZeroBytes(data) contains the non-zero bytes of data in the same order\n\n// CompressBytes compresses the input byte slice according to the sparse bitset\n// representation algorithm. If the result is bigger than the original input, no\n// compression is done.\nfunc CompressBytes(data []byte) []byte {\n\tif out := bitsetEncodeBytes(data); len(out) < len(data) {\n\t\treturn out\n\t}\n\tcpy := make([]byte, len(data))\n\tcopy(cpy, data)\n\treturn cpy\n}\n\n// bitsetEncodeBytes compresses the input byte slice according to the sparse\n// bitset representation algorithm.\nfunc bitsetEncodeBytes(data []byte) []byte {\n\t// Empty slices get compressed to nil\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\t// One byte slices compress to nil or retain the single byte\n\tif len(data) == 1 {\n\t\tif data[0] == 0 {\n\t\t\treturn nil\n\t\t}\n\t\treturn data\n\t}\n\t// Calculate the bitset of set bytes, and gather the non-zero bytes\n\tnonZeroBitset := make([]byte, (len(data)+7)/8)\n\tnonZeroBytes := make([]byte, 0, len(data))\n\n\tfor i, b := range data {\n\t\tif b != 0 {\n\t\t\tnonZeroBytes = append(nonZeroBytes, b)\n\t\t\tnonZeroBitset[i/8] |= 1 << byte(7-i%8)\n\t\t}\n\t}\n\tif len(nonZeroBytes) == 0 {\n\t\treturn nil\n\t}\n\treturn append(bitsetEncodeBytes(nonZeroBitset), nonZeroBytes...)\n}\n\n// DecompressBytes decompresses data with a known target size. If the input data\n// matches the size of the target, it means no compression was done in the first\n// place.\nfunc DecompressBytes(data []byte, target int) ([]byte, error) {\n\tif len(data) > target {\n\t\treturn nil, errExceededTarget\n\t}\n\tif len(data) == target {\n\t\tcpy := make([]byte, len(data))\n\t\tcopy(cpy, data)\n\t\treturn cpy, nil\n\t}\n\treturn bitsetDecodeBytes(data, target)\n}\n\n// bitsetDecodeBytes decompresses data with a known target size.\nfunc bitsetDecodeBytes(data []byte, target int) ([]byte, error) {\n\tout, size, err := bitsetDecodePartialBytes(data, target)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif size != len(data) {\n\t\treturn nil, errUnreferencedData\n\t}\n\treturn out, nil\n}\n\n// bitsetDecodePartialBytes decompresses data with a known target size, but does\n// not enforce consuming all the input bytes. In addition to the decompressed\n// output, the function returns the length of compressed input data corresponding\n// to the output as the input slice may be longer.\nfunc bitsetDecodePartialBytes(data []byte, target int) ([]byte, int, error) {\n\t// Sanity check 0 targets to avoid infinite recursion\n\tif target == 0 {\n\t\treturn nil, 0, nil\n\t}\n\t// Handle the zero and single byte corner cases\n\tdecomp := make([]byte, target)\n\tif len(data) == 0 {\n\t\treturn decomp, 0, nil\n\t}\n\tif target == 1 {\n\t\tdecomp[0] = data[0] // copy to avoid referencing the input slice\n\t\tif data[0] != 0 {\n\t\t\treturn decomp, 1, nil\n\t\t}\n\t\treturn decomp, 0, nil\n\t}\n\t// Decompress the bitset of set bytes and distribute the non zero bytes\n\tnonZeroBitset, ptr, err := bitsetDecodePartialBytes(data, (target+7)/8)\n\tif err != nil {\n\t\treturn nil, ptr, err\n\t}\n\tfor i := 0; i < 8*len(nonZeroBitset); i++ {\n\t\tif nonZeroBitset[i/8]&(1<<byte(7-i%8)) != 0 {\n\t\t\t// Make sure we have enough data to push into the correct slot\n\t\t\tif ptr >= len(data) {\n\t\t\t\treturn nil, 0, errMissingData\n\t\t\t}\n\t\t\tif i >= len(decomp) {\n\t\t\t\treturn nil, 0, errExceededTarget\n\t\t\t}\n\t\t\t// Make sure the data is valid and push into the slot\n\t\t\tif data[ptr] == 0 {\n\t\t\t\treturn nil, 0, errZeroContent\n\t\t\t}\n\t\t\tdecomp[i] = data[ptr]\n\t\t\tptr++\n\t\t}\n\t}\n\treturn decomp, ptr, nil\n}\n"
  },
  {
    "path": "common/bitutil/compress_fuzz.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build gofuzz\n\npackage bitutil\n\nimport \"bytes\"\n\n// Fuzz implements a go-fuzz fuzzer method to test various encoding method\n// invocations.\nfunc Fuzz(data []byte) int {\n\tif len(data) == 0 {\n\t\treturn -1\n\t}\n\tif data[0]%2 == 0 {\n\t\treturn fuzzEncode(data[1:])\n\t}\n\treturn fuzzDecode(data[1:])\n}\n\n// fuzzEncode implements a go-fuzz fuzzer method to test the bitset encoding and\n// decoding algorithm.\nfunc fuzzEncode(data []byte) int {\n\tproc, _ := bitsetDecodeBytes(bitsetEncodeBytes(data), len(data))\n\tif !bytes.Equal(data, proc) {\n\t\tpanic(\"content mismatch\")\n\t}\n\treturn 0\n}\n\n// fuzzDecode implements a go-fuzz fuzzer method to test the bit decoding and\n// reencoding algorithm.\nfunc fuzzDecode(data []byte) int {\n\tblob, err := bitsetDecodeBytes(data, 1024)\n\tif err != nil {\n\t\treturn 0\n\t}\n\tif comp := bitsetEncodeBytes(blob); !bytes.Equal(comp, data) {\n\t\tpanic(\"content mismatch\")\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "common/bitutil/compress_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bitutil\n\nimport (\n\t\"bytes\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\n// Tests that data bitset encoding and decoding works and is bijective.\nfunc TestEncodingCycle(t *testing.T) {\n\ttests := []string{\n\t\t// Tests generated by go-fuzz to maximize code coverage\n\t\t\"0x000000000000000000\",\n\t\t\"0xef0400\",\n\t\t\"0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb\",\n\t\t\"0x7b64000000\",\n\t\t\"0x000034000000000000\",\n\t\t\"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0000000000000000000\",\n\t\t\"0x4912385c0e7b64000000\",\n\t\t\"0x000034000000000000000000000000000000\",\n\t\t\"0x00\",\n\t\t\"0x000003e834ff7f0000\",\n\t\t\"0x0000\",\n\t\t\"0x0000000000000000000000000000000000000000000000000000000000ff00\",\n\t\t\"0x895f0c6a020f850c6a020f85f88df88d\",\n\t\t\"0xdf7070533534333636313639343638373432313536346c1bc3315aac2f65fefb\",\n\t\t\"0x0000000000\",\n\t\t\"0xdf70706336346c65fefb\",\n\t\t\"0x00006d643634000000\",\n\t\t\"0xdf7070533534333636313639343638373532313536346c1bc333393438373130707063363430353639343638373532313536346c1bc333393438336336346c65fe\",\n\t}\n\tfor i, tt := range tests {\n\t\tdata := hexutil.MustDecode(tt)\n\n\t\tproc, err := bitsetDecodeBytes(bitsetEncodeBytes(data), len(data))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"test %d: failed to decompress compressed data: %v\", i, err)\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(data, proc) {\n\t\t\tt.Errorf(\"test %d: compress/decompress mismatch: have %x, want %x\", i, proc, data)\n\t\t}\n\t}\n}\n\n// Tests that data bitset decoding and rencoding works and is bijective.\nfunc TestDecodingCycle(t *testing.T) {\n\ttests := []struct {\n\t\tsize  int\n\t\tinput string\n\t\tfail  error\n\t}{\n\t\t{size: 0, input: \"0x\"},\n\n\t\t// Crashers generated by go-fuzz\n\t\t{size: 0, input: \"0x0020\", fail: errUnreferencedData},\n\t\t{size: 0, input: \"0x30\", fail: errUnreferencedData},\n\t\t{size: 1, input: \"0x00\", fail: errUnreferencedData},\n\t\t{size: 2, input: \"0x07\", fail: errMissingData},\n\t\t{size: 1024, input: \"0x8000\", fail: errZeroContent},\n\n\t\t// Tests generated by go-fuzz to maximize code coverage\n\t\t{size: 29490, input: \"0x343137343733323134333839373334323073333930783e3078333930783e70706336346c65303e\", fail: errMissingData},\n\t\t{size: 59395, input: \"0x00\", fail: errUnreferencedData},\n\t\t{size: 52574, input: \"0x70706336346c65c0de\", fail: errExceededTarget},\n\t\t{size: 42264, input: \"0x07\", fail: errMissingData},\n\t\t{size: 52, input: \"0xa5045bad48f4\", fail: errExceededTarget},\n\t\t{size: 52574, input: \"0xc0de\", fail: errMissingData},\n\t\t{size: 52574, input: \"0x\"},\n\t\t{size: 29490, input: \"0x34313734373332313433383937333432307333393078073034333839373334323073333930783e3078333937333432307333393078073061333930783e70706336346c65303e\", fail: errMissingData},\n\t\t{size: 29491, input: \"0x3973333930783e30783e\", fail: errMissingData},\n\n\t\t{size: 1024, input: \"0x808080608080\"},\n\t\t{size: 1024, input: \"0x808470705e3632383337363033313434303137393130306c6580ef46806380635a80\"},\n\t\t{size: 1024, input: \"0x8080808070\"},\n\t\t{size: 1024, input: \"0x808070705e36346c6580ef46806380635a80\"},\n\t\t{size: 1024, input: \"0x80808046802680\"},\n\t\t{size: 1024, input: \"0x4040404035\"},\n\t\t{size: 1024, input: \"0x4040bf3ba2b3f684402d353234373438373934409fe5b1e7ada94ebfd7d0505e27be4035\"},\n\t\t{size: 1024, input: \"0x404040bf3ba2b3f6844035\"},\n\t\t{size: 1024, input: \"0x40402d35323437343837393440bfd7d0505e27be4035\"},\n\t}\n\tfor i, tt := range tests {\n\t\tdata := hexutil.MustDecode(tt.input)\n\n\t\torig, err := bitsetDecodeBytes(data, tt.size)\n\t\tif err != tt.fail {\n\t\t\tt.Errorf(\"test %d: failure mismatch: have %v, want %v\", i, err, tt.fail)\n\t\t}\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif comp := bitsetEncodeBytes(orig); !bytes.Equal(comp, data) {\n\t\t\tt.Errorf(\"test %d: decompress/compress mismatch: have %x, want %x\", i, comp, data)\n\t\t}\n\t}\n}\n\n// TestCompression tests that compression works by returning either the bitset\n// encoded input, or the actual input if the bitset version is longer.\nfunc TestCompression(t *testing.T) {\n\t// Check the compression returns the bitset encoding is shorter\n\tin := hexutil.MustDecode(\"0x4912385c0e7b64000000\")\n\tout := hexutil.MustDecode(\"0x80fe4912385c0e7b64\")\n\n\tif data := CompressBytes(in); !bytes.Equal(data, out) {\n\t\tt.Errorf(\"encoding mismatch for sparse data: have %x, want %x\", data, out)\n\t}\n\tif data, err := DecompressBytes(out, len(in)); err != nil || !bytes.Equal(data, in) {\n\t\tt.Errorf(\"decoding mismatch for sparse data: have %x, want %x, error %v\", data, in, err)\n\t}\n\t// Check the compression returns the input if the bitset encoding is longer\n\tin = hexutil.MustDecode(\"0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb\")\n\tout = hexutil.MustDecode(\"0xdf7070533534333636313639343638373532313536346c1bc33339343837313070706336343035336336346c65fefb3930393233383838ac2f65fefb\")\n\n\tif data := CompressBytes(in); !bytes.Equal(data, out) {\n\t\tt.Errorf(\"encoding mismatch for dense data: have %x, want %x\", data, out)\n\t}\n\tif data, err := DecompressBytes(out, len(in)); err != nil || !bytes.Equal(data, in) {\n\t\tt.Errorf(\"decoding mismatch for dense data: have %x, want %x, error %v\", data, in, err)\n\t}\n\t// Check that decompressing a longer input than the target fails\n\tif _, err := DecompressBytes([]byte{0xc0, 0x01, 0x01}, 2); err != errExceededTarget {\n\t\tt.Errorf(\"decoding error mismatch for long data: have %v, want %v\", err, errExceededTarget)\n\t}\n}\n\n// Crude benchmark for compressing random slices of bytes.\nfunc BenchmarkEncoding1KBVerySparse(b *testing.B) { benchmarkEncoding(b, 1024, 0.0001) }\nfunc BenchmarkEncoding2KBVerySparse(b *testing.B) { benchmarkEncoding(b, 2048, 0.0001) }\nfunc BenchmarkEncoding4KBVerySparse(b *testing.B) { benchmarkEncoding(b, 4096, 0.0001) }\n\nfunc BenchmarkEncoding1KBSparse(b *testing.B) { benchmarkEncoding(b, 1024, 0.001) }\nfunc BenchmarkEncoding2KBSparse(b *testing.B) { benchmarkEncoding(b, 2048, 0.001) }\nfunc BenchmarkEncoding4KBSparse(b *testing.B) { benchmarkEncoding(b, 4096, 0.001) }\n\nfunc BenchmarkEncoding1KBDense(b *testing.B) { benchmarkEncoding(b, 1024, 0.1) }\nfunc BenchmarkEncoding2KBDense(b *testing.B) { benchmarkEncoding(b, 2048, 0.1) }\nfunc BenchmarkEncoding4KBDense(b *testing.B) { benchmarkEncoding(b, 4096, 0.1) }\n\nfunc BenchmarkEncoding1KBSaturated(b *testing.B) { benchmarkEncoding(b, 1024, 0.5) }\nfunc BenchmarkEncoding2KBSaturated(b *testing.B) { benchmarkEncoding(b, 2048, 0.5) }\nfunc BenchmarkEncoding4KBSaturated(b *testing.B) { benchmarkEncoding(b, 4096, 0.5) }\n\nfunc benchmarkEncoding(b *testing.B, bytes int, fill float64) {\n\t// Generate a random slice of bytes to compress\n\trandom := rand.NewSource(0) // reproducible and comparable\n\n\tdata := make([]byte, bytes)\n\tbits := int(float64(bytes) * 8 * fill)\n\n\tfor i := 0; i < bits; i++ {\n\t\tidx := random.Int63() % int64(len(data))\n\t\tbit := uint(random.Int63() % 8)\n\t\tdata[idx] |= 1 << bit\n\t}\n\t// Reset the benchmark and measure encoding/decoding\n\tb.ResetTimer()\n\tb.ReportAllocs()\n\tfor i := 0; i < b.N; i++ {\n\t\tbitsetDecodeBytes(bitsetEncodeBytes(data), len(data))\n\t}\n}\n"
  },
  {
    "path": "common/bytes.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package common contains various helper functions.\npackage common\n\nimport (\n\t\"encoding/hex\"\n\t\"strings\"\n)\n\n// ToHex returns the hex representation of b, prefixed with '0x'.\n// For empty slices, the return value is \"0x0\".\n//\n// Deprecated: use hexutil.Encode instead.\nfunc ToHex(b []byte) string {\n\thex := Bytes2Hex(b)\n\tif len(hex) == 0 {\n\t\thex = \"0\"\n\t}\n\treturn \"0x\" + hex\n}\n\n// FromHex returns the bytes represented by the hexadecimal string s.\n// s may be prefixed with \"0x\".\nfunc FromHex(s string) []byte {\n\tif len(s) > 1 {\n\t\tif s[0:2] == \"0x\" || s[0:2] == \"0X\" {\n\t\t\ts = s[2:]\n\t\t}\n\t}\n\tif len(s)%2 == 1 {\n\t\ts = \"0\" + s\n\t}\n\treturn Hex2Bytes(s)\n}\n\n// CopyBytes returns an exact copy of the provided bytes.\nfunc CopyBytes(b []byte) (copiedBytes []byte) {\n\tif b == nil {\n\t\treturn nil\n\t}\n\tcopiedBytes = make([]byte, len(b))\n\tcopy(copiedBytes, b)\n\n\treturn\n}\n\n// isHexCharacter returns bool of c being a valid hexadecimal.\nfunc isHexCharacter(c byte) bool {\n\treturn ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')\n}\n\n// isHex validates whether each byte is valid hexadecimal string.\nfunc isHex(str string) bool {\n\tif len(str)%2 != 0 {\n\t\treturn false\n\t}\n\tfor _, c := range []byte(str) {\n\t\tif !isHexCharacter(c) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc has0xPrefix(input string) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\n\nfunc Is0xPrefixHex(s string) bool {\n\tif has0xPrefix(s) {\n\t\ts = s[2:]\n\t\treturn isHex(s)\n\t} else {\n\t\treturn false\n\t}\n\n}\n\n// Bytes2Hex returns the hexadecimal encoding of d.\nfunc Bytes2Hex(d []byte) string {\n\treturn hex.EncodeToString(d)\n}\n\n// Hex2Bytes returns the bytes represented by the hexadecimal string str.\nfunc Hex2Bytes(str string) []byte {\n\th, _ := hex.DecodeString(str)\n\treturn h\n}\n\n// Hex2BytesFixed returns bytes of a specified fixed length flen.\nfunc Hex2BytesFixed(str string, flen int) []byte {\n\th, _ := hex.DecodeString(str)\n\tif len(h) == flen {\n\t\treturn h\n\t}\n\tif len(h) > flen {\n\t\treturn h[len(h)-flen:]\n\t}\n\thh := make([]byte, flen)\n\tcopy(hh[flen-len(h):flen], h[:])\n\treturn hh\n}\n\n// RightPadBytes zero-pads slice to the right up to length l.\nfunc RightPadBytes(slice []byte, l int) []byte {\n\tif l <= len(slice) {\n\t\treturn slice\n\t}\n\n\tpadded := make([]byte, l)\n\tcopy(padded, slice)\n\n\treturn padded\n}\n\n// LeftPadBytes zero-pads slice to the left up to length l.\nfunc LeftPadBytes(slice []byte, l int) []byte {\n\tif l <= len(slice) {\n\t\treturn slice\n\t}\n\n\tpadded := make([]byte, l)\n\tcopy(padded[l-len(slice):], slice)\n\n\treturn padded\n}\n\nfunc BytesToString(b []byte) string {\n\treturn strings.Trim(string(b), string([]byte{0}))\n}\n"
  },
  {
    "path": "common/bytes_test.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\tchecker \"gopkg.in/check.v1\"\n)\n\ntype BytesSuite struct{}\n\nvar _ = checker.Suite(&BytesSuite{})\n\nfunc (s *BytesSuite) TestCopyBytes(c *checker.C) {\n\tdata1 := []byte{1, 2, 3, 4}\n\texp1 := []byte{1, 2, 3, 4}\n\tres1 := CopyBytes(data1)\n\tc.Assert(res1, checker.DeepEquals, exp1)\n}\n\nfunc (s *BytesSuite) TestLeftPadBytes(c *checker.C) {\n\tval1 := []byte{1, 2, 3, 4}\n\texp1 := []byte{0, 0, 0, 0, 1, 2, 3, 4}\n\n\tres1 := LeftPadBytes(val1, 8)\n\tres2 := LeftPadBytes(val1, 2)\n\n\tc.Assert(res1, checker.DeepEquals, exp1)\n\tc.Assert(res2, checker.DeepEquals, val1)\n}\n\nfunc (s *BytesSuite) TestRightPadBytes(c *checker.C) {\n\tval := []byte{1, 2, 3, 4}\n\texp := []byte{1, 2, 3, 4, 0, 0, 0, 0}\n\n\tresstd := RightPadBytes(val, 8)\n\tresshrt := RightPadBytes(val, 2)\n\n\tc.Assert(resstd, checker.DeepEquals, exp)\n\tc.Assert(resshrt, checker.DeepEquals, val)\n}\n\nfunc TestFromHex(t *testing.T) {\n\tinput := \"0x01\"\n\texpected := []byte{1}\n\tresult := FromHex(input)\n\tif !bytes.Equal(expected, result) {\n\t\tt.Errorf(\"Expected %x got %x\", expected, result)\n\t}\n}\n\nfunc TestIsHex(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\tok    bool\n\t}{\n\t\t{\"\", true},\n\t\t{\"0\", false},\n\t\t{\"00\", true},\n\t\t{\"a9e67e\", true},\n\t\t{\"A9E67E\", true},\n\t\t{\"0xa9e67e\", false},\n\t\t{\"a9e67e001\", false},\n\t\t{\"0xHELLO_MY_NAME_IS_STEVEN_@#$^&*\", false},\n\t}\n\tfor _, test := range tests {\n\t\tif ok := isHex(test.input); ok != test.ok {\n\t\t\tt.Errorf(\"isHex(%q) = %v, want %v\", test.input, ok, test.ok)\n\t\t}\n\t}\n}\n\nfunc TestFromHexOddLength(t *testing.T) {\n\tinput := \"0x1\"\n\texpected := []byte{1}\n\tresult := FromHex(input)\n\tif !bytes.Equal(expected, result) {\n\t\tt.Errorf(\"Expected %x got %x\", expected, result)\n\t}\n}\n\nfunc TestNoPrefixShortHexOddLength(t *testing.T) {\n\tinput := \"1\"\n\texpected := []byte{1}\n\tresult := FromHex(input)\n\tif !bytes.Equal(expected, result) {\n\t\tt.Errorf(\"Expected %x got %x\", expected, result)\n\t}\n}\n"
  },
  {
    "path": "common/compiler/helpers.go",
    "content": "// Copyright 2019 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper).\npackage compiler\n\nimport (\n\t\"bytes\"\n\t\"io/ioutil\"\n\t\"regexp\"\n)\n\nvar versionRegexp = regexp.MustCompile(`([0-9]+)\\.([0-9]+)\\.([0-9]+)`)\n\n// Contract contains information about a compiled contract, alongside its code and runtime code.\ntype Contract struct {\n\tCode        string            `json:\"code\"`\n\tRuntimeCode string            `json:\"runtime-code\"`\n\tInfo        ContractInfo      `json:\"info\"`\n\tHashes      map[string]string `json:\"hashes\"`\n}\n\n// ContractInfo contains information about a compiled contract, including access\n// to the ABI definition, source mapping, user and developer docs, and metadata.\n//\n// Depending on the source, language version, compiler version, and compiler\n// options will provide information about how the contract was compiled.\ntype ContractInfo struct {\n\tSource          string      `json:\"source\"`\n\tLanguage        string      `json:\"language\"`\n\tLanguageVersion string      `json:\"languageVersion\"`\n\tCompilerVersion string      `json:\"compilerVersion\"`\n\tCompilerOptions string      `json:\"compilerOptions\"`\n\tSrcMap          interface{} `json:\"srcMap\"`\n\tSrcMapRuntime   string      `json:\"srcMapRuntime\"`\n\tAbiDefinition   interface{} `json:\"abiDefinition\"`\n\tUserDoc         interface{} `json:\"userDoc\"`\n\tDeveloperDoc    interface{} `json:\"developerDoc\"`\n\tMetadata        string      `json:\"metadata\"`\n}\n\nfunc slurpFiles(files []string) (string, error) {\n\tvar concat bytes.Buffer\n\tfor _, file := range files {\n\t\tcontent, err := ioutil.ReadFile(file)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tconcat.Write(content)\n\t}\n\treturn concat.String(), nil\n}\n"
  },
  {
    "path": "common/compiler/solidity.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper).\npackage compiler\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os/exec\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// Solidity contains information about the solidity compiler.\ntype Solidity struct {\n\tPath, Version, FullVersion string\n\tMajor, Minor, Patch        int\n}\n\n// --combined-output format\ntype solcOutput struct {\n\tContracts map[string]struct {\n\t\tBinRuntime                                  string `json:\"bin-runtime\"`\n\t\tSrcMapRuntime                               string `json:\"srcmap-runtime\"`\n\t\tBin, SrcMap, Abi, Devdoc, Userdoc, Metadata string\n\t\tHashes                                      map[string]string\n\t}\n\tVersion string\n}\n\nfunc (s *Solidity) makeArgs() []string {\n\tp := []string{\n\t\t\"--combined-json\", \"bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc\",\n\t\t\"--optimize\",                  // code optimizer switched on\n\t\t\"--allow-paths\", \"., ./, ../\", // default to support relative paths\n\t}\n\tif s.Major > 0 || s.Minor > 4 || s.Patch > 6 {\n\t\tp[1] += \",metadata,hashes\"\n\t}\n\treturn p\n}\n\n// SolidityVersion runs solc and parses its version output.\nfunc SolidityVersion(solc string) (*Solidity, error) {\n\tif solc == \"\" {\n\t\tsolc = \"solc\"\n\t}\n\tvar out bytes.Buffer\n\tcmd := exec.Command(solc, \"--version\")\n\tcmd.Stdout = &out\n\terr := cmd.Run()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tmatches := versionRegexp.FindStringSubmatch(out.String())\n\tif len(matches) != 4 {\n\t\treturn nil, fmt.Errorf(\"can't parse solc version %q\", out.String())\n\t}\n\ts := &Solidity{Path: cmd.Path, FullVersion: out.String(), Version: matches[0]}\n\tif s.Major, err = strconv.Atoi(matches[1]); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.Minor, err = strconv.Atoi(matches[2]); err != nil {\n\t\treturn nil, err\n\t}\n\tif s.Patch, err = strconv.Atoi(matches[3]); err != nil {\n\t\treturn nil, err\n\t}\n\treturn s, nil\n}\n\n// CompileSolidityString builds and returns all the contracts contained within a source string.\nfunc CompileSolidityString(solc, source string) (map[string]*Contract, error) {\n\tif len(source) == 0 {\n\t\treturn nil, errors.New(\"solc: empty source string\")\n\t}\n\ts, err := SolidityVersion(solc)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs := append(s.makeArgs(), \"--\")\n\tcmd := exec.Command(s.Path, append(args, \"-\")...)\n\tcmd.Stdin = strings.NewReader(source)\n\treturn s.run(cmd, source)\n}\n\n// CompileSolidity compiles all given Solidity source files.\nfunc CompileSolidity(solc string, sourcefiles ...string) (map[string]*Contract, error) {\n\tif len(sourcefiles) == 0 {\n\t\treturn nil, errors.New(\"solc: no source files\")\n\t}\n\tsource, err := slurpFiles(sourcefiles)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts, err := SolidityVersion(solc)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\targs := append(s.makeArgs(), \"--\")\n\tcmd := exec.Command(s.Path, append(args, sourcefiles...)...)\n\treturn s.run(cmd, source)\n}\n\nfunc (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, error) {\n\tvar stderr, stdout bytes.Buffer\n\tcmd.Stderr = &stderr\n\tcmd.Stdout = &stdout\n\tif err := cmd.Run(); err != nil {\n\t\treturn nil, fmt.Errorf(\"solc: %v\\n%s\", err, stderr.Bytes())\n\t}\n\n\treturn ParseCombinedJSON(stdout.Bytes(), source, s.Version, s.Version, strings.Join(s.makeArgs(), \" \"))\n}\n\n// ParseCombinedJSON takes the direct output of a solc --combined-output run and\n// parses it into a map of string contract name to Contract structs. The\n// provided source, language and compiler version, and compiler options are all\n// passed through into the Contract structs.\n//\n// The solc output is expected to contain ABI, source mapping, user docs, and dev docs.\n//\n// Returns an error if the JSON is malformed or missing data, or if the JSON\n// embedded within the JSON is malformed.\nfunc ParseCombinedJSON(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) {\n\tvar output solcOutput\n\tif err := json.Unmarshal(combinedJSON, &output); err != nil {\n\t\treturn nil, err\n\t}\n\t// Compilation succeeded, assemble and return the contracts.\n\tcontracts := make(map[string]*Contract)\n\tfor name, info := range output.Contracts {\n\t\t// Parse the individual compilation results.\n\t\tvar abi interface{}\n\t\tif err := json.Unmarshal([]byte(info.Abi), &abi); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"solc: error reading abi definition (%v)\", err)\n\t\t}\n\t\tvar userdoc, devdoc interface{}\n\t\tjson.Unmarshal([]byte(info.Userdoc), &userdoc)\n\t\tjson.Unmarshal([]byte(info.Devdoc), &devdoc)\n\n\t\tcontracts[name] = &Contract{\n\t\t\tCode:        \"0x\" + info.Bin,\n\t\t\tRuntimeCode: \"0x\" + info.BinRuntime,\n\t\t\tHashes:      info.Hashes,\n\t\t\tInfo: ContractInfo{\n\t\t\t\tSource:          source,\n\t\t\t\tLanguage:        \"Solidity\",\n\t\t\t\tLanguageVersion: languageVersion,\n\t\t\t\tCompilerVersion: compilerVersion,\n\t\t\t\tCompilerOptions: compilerOptions,\n\t\t\t\tSrcMap:          info.SrcMap,\n\t\t\t\tSrcMapRuntime:   info.SrcMapRuntime,\n\t\t\t\tAbiDefinition:   abi,\n\t\t\t\tUserDoc:         userdoc,\n\t\t\t\tDeveloperDoc:    devdoc,\n\t\t\t\tMetadata:        info.Metadata,\n\t\t\t},\n\t\t}\n\t}\n\treturn contracts, nil\n}\n"
  },
  {
    "path": "common/compiler/solidity_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage compiler\n\nimport (\n\t\"os/exec\"\n\t\"testing\"\n)\n\nconst (\n\ttestSource = `\npragma solidity >0.0.0;\ncontract test {\n   /// @notice Will multiply ` + \"`a`\" + ` by 7.\n   function multiply(uint a) public returns(uint d) {\n       return a * 7;\n   }\n}\n`\n)\n\nfunc skipWithoutSolc(t *testing.T) {\n\tif _, err := exec.LookPath(\"solc\"); err != nil {\n\t\tt.Skip(err)\n\t}\n}\n\nfunc TestSolidityCompiler(t *testing.T) {\n\tskipWithoutSolc(t)\n\n\tcontracts, err := CompileSolidityString(\"\", testSource)\n\tif err != nil {\n\t\tt.Fatalf(\"error compiling source. result %v: %v\", contracts, err)\n\t}\n\tif len(contracts) != 1 {\n\t\tt.Errorf(\"one contract expected, got %d\", len(contracts))\n\t}\n\tc, ok := contracts[\"test\"]\n\tif !ok {\n\t\tc, ok = contracts[\"<stdin>:test\"]\n\t\tif !ok {\n\t\t\tt.Fatal(\"info for contract 'test' not present in result\")\n\t\t}\n\t}\n\tif c.Code == \"\" {\n\t\tt.Error(\"empty code\")\n\t}\n\tif c.Info.Source != testSource {\n\t\tt.Error(\"wrong source\")\n\t}\n\tif c.Info.CompilerVersion == \"\" {\n\t\tt.Error(\"empty version\")\n\t}\n}\n\nfunc TestSolidityCompileError(t *testing.T) {\n\tskipWithoutSolc(t)\n\n\tcontracts, err := CompileSolidityString(\"\", testSource[4:])\n\tif err == nil {\n\t\tt.Errorf(\"error expected compiling source. got none. result %v\", contracts)\n\t}\n\tt.Logf(\"error: %v\", err)\n}\n"
  },
  {
    "path": "common/debug.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"strings\"\n)\n\n// Report gives off a warning requesting the user to submit an issue to the github tracker.\nfunc Report(extra ...interface{}) {\n\tfmt.Fprintln(os.Stderr, \"You've encountered a sought after, hard to reproduce bug. Please report this to the developers <3 https://github.com/sero-cash/go-sero/issues\")\n\tfmt.Fprintln(os.Stderr, extra...)\n\n\t_, file, line, _ := runtime.Caller(1)\n\tfmt.Fprintf(os.Stderr, \"%v:%v\\n\", file, line)\n\n\tdebug.PrintStack()\n\n\tfmt.Fprintln(os.Stderr, \"#### BUG! PLEASE REPORT ####\")\n}\n\n// PrintDepricationWarning prinst the given string in a box using fmt.Println.\nfunc PrintDepricationWarning(str string) {\n\tline := strings.Repeat(\"#\", len(str)+4)\n\temptyLine := strings.Repeat(\" \", len(str))\n\tfmt.Printf(`\n%s\n# %s #\n# %s #\n# %s #\n%s\n\n`, line, emptyLine, str, emptyLine, line)\n}\n"
  },
  {
    "path": "common/fdlimit/fdlimit_freebsd.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build freebsd\n\npackage fdlimit\n\nimport \"syscall\"\n\n// This file is largely identical to fdlimit_unix.go,\n// but Rlimit fields have type int64 on FreeBSD so it needs\n// an extra conversion.\n\n// Raise tries to maximize the file descriptor allowance of this process\n// to the maximum hard-limit allowed by the OS.\nfunc Raise(max uint64) error {\n\t// Get the current limit\n\tvar limit syscall.Rlimit\n\tif err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn err\n\t}\n\t// Try to update the limit to the max allowance\n\tlimit.Cur = limit.Max\n\tif limit.Cur > int64(max) {\n\t\tlimit.Cur = int64(max)\n\t}\n\tif err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Current retrieves the number of file descriptors allowed to be opened by this\n// process.\nfunc Current() (int, error) {\n\tvar limit syscall.Rlimit\n\tif err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn 0, err\n\t}\n\treturn int(limit.Cur), nil\n}\n\n// Maximum retrieves the maximum number of file descriptors this process is\n// allowed to request for itself.\nfunc Maximum() (int, error) {\n\tvar limit syscall.Rlimit\n\tif err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn 0, err\n\t}\n\treturn int(limit.Max), nil\n}\n"
  },
  {
    "path": "common/fdlimit/fdlimit_unix.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build linux darwin netbsd openbsd solaris\n\npackage fdlimit\n\nimport \"syscall\"\n\n// Raise tries to maximize the file descriptor allowance of this process\n// to the maximum hard-limit allowed by the OS.\nfunc Raise(max uint64) error {\n\t// Get the current limit\n\tvar limit syscall.Rlimit\n\tif err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn err\n\t}\n\t// Try to update the limit to the max allowance\n\tlimit.Cur = limit.Max\n\tif limit.Cur > max {\n\t\tlimit.Cur = max\n\t}\n\tif err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Current retrieves the number of file descriptors allowed to be opened by this\n// process.\nfunc Current() (int, error) {\n\tvar limit syscall.Rlimit\n\tif err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn 0, err\n\t}\n\treturn int(limit.Cur), nil\n}\n\n// Maximum retrieves the maximum number of file descriptors this process is\n// allowed to request for itself.\nfunc Maximum() (int, error) {\n\tvar limit syscall.Rlimit\n\tif err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil {\n\t\treturn 0, err\n\t}\n\treturn int(limit.Max), nil\n}\n"
  },
  {
    "path": "common/fdlimit/fdlimit_windows.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage fdlimit\n\nimport \"errors\"\n\n// Raise tries to maximize the file descriptor allowance of this process\n// to the maximum hard-limit allowed by the OS.\nfunc Raise(max uint64) error {\n\t// This method is NOP by design:\n\t//  * Linux/Darwin counterparts need to manually increase per process limits\n\t//  * On Windows Go uses the CreateFile API, which is limited to 16K files, non\n\t//    changeable from within a running process\n\t// This way we can always \"request\" raising the limits, which will either have\n\t// or not have effect based on the platform we're running on.\n\tif max > 16384 {\n\t\treturn errors.New(\"file descriptor limit (16384) reached\")\n\t}\n\treturn nil\n}\n\n// Current retrieves the number of file descriptors allowed to be opened by this\n// process.\nfunc Current() (int, error) {\n\t// Please see Raise for the reason why we use hard coded 16K as the limit\n\treturn 16384, nil\n}\n\n// Maximum retrieves the maximum number of file descriptors this process is\n// allowed to request for itself.\nfunc Maximum() (int, error) {\n\treturn Current()\n}\n"
  },
  {
    "path": "common/format.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n)\n\n// PrettyDuration is a pretty printed version of a time.Duration value that cuts\n// the unnecessary precision off from the formatted textual representation.\ntype PrettyDuration time.Duration\n\nvar prettyDurationRe = regexp.MustCompile(`\\.[0-9]+`)\n\n// String implements the Stringer interface, allowing pretty printing of duration\n// values rounded to three decimals.\nfunc (d PrettyDuration) String() string {\n\tlabel := fmt.Sprintf(\"%v\", time.Duration(d))\n\tif match := prettyDurationRe.FindString(label); len(match) > 4 {\n\t\tlabel = strings.Replace(label, match, match[:4], 1)\n\t}\n\treturn label\n}\n\n// PrettyAge is a pretty printed version of a time.Duration value that rounds\n// the values up to a single most significant unit, days/weeks/years included.\ntype PrettyAge time.Time\n\n// ageUnits is a list of units the age pretty printing uses.\nvar ageUnits = []struct {\n\tSize   time.Duration\n\tSymbol string\n}{\n\t{12 * 30 * 24 * time.Hour, \"y\"},\n\t{30 * 24 * time.Hour, \"mo\"},\n\t{7 * 24 * time.Hour, \"w\"},\n\t{24 * time.Hour, \"d\"},\n\t{time.Hour, \"h\"},\n\t{time.Minute, \"m\"},\n\t{time.Second, \"s\"},\n}\n\n// String implements the Stringer interface, allowing pretty printing of duration\n// values rounded to the most significant time unit.\nfunc (t PrettyAge) String() string {\n\t// Calculate the time difference and handle the 0 cornercase\n\tdiff := time.Since(time.Time(t))\n\tif diff < time.Second {\n\t\treturn \"0\"\n\t}\n\t// Accumulate a precision of 3 components before returning\n\tresult, prec := \"\", 0\n\n\tfor _, unit := range ageUnits {\n\t\tif diff > unit.Size {\n\t\t\tresult = fmt.Sprintf(\"%s%d%s\", result, diff/unit.Size, unit.Symbol)\n\t\t\tdiff %= unit.Size\n\n\t\t\tif prec += 1; prec >= 3 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn result\n}\n"
  },
  {
    "path": "common/hexutil/abi_string.go",
    "content": "package hexutil\n\ntype Uint8 uint8\n\nfunc (b *Uint8) UnmarshalText(input []byte) error {\n\tvar u64 Uint64\n\terr := u64.UnmarshalText(input)\n\tif u64 > Uint64(^uint8(0)) || err == ErrUint64Range {\n\t\treturn ErrUintRange\n\t} else if err != nil {\n\t\treturn err\n\t}\n\t*b = Uint8(u64)\n\treturn nil\n}\n\ntype Uint16 uint16\n\nfunc (b *Uint16) UnmarshalText(input []byte) error {\n\tvar u64 Uint64\n\terr := u64.UnmarshalText(input)\n\tif u64 > Uint64(^uint16(0)) || err == ErrUint64Range {\n\t\treturn ErrUintRange\n\t} else if err != nil {\n\t\treturn err\n\t}\n\t*b = Uint16(u64)\n\treturn nil\n}\n\ntype Uint32 uint32\n\nfunc (b *Uint32) UnmarshalText(input []byte) error {\n\tvar u64 Uint64\n\terr := u64.UnmarshalText(input)\n\tif u64 > Uint64(^uint32(0)) || err == ErrUint64Range {\n\t\treturn ErrUintRange\n\t} else if err != nil {\n\t\treturn err\n\t}\n\t*b = Uint32(u64)\n\treturn nil\n}\n"
  },
  {
    "path": "common/hexutil/hexutil.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\nPackage hexutil implements hex encoding with 0x prefix.\nThis encoding is used by the Ethereum RPC API to transport binary data in JSON payloads.\n\nEncoding Rules\n\nAll hex data must have prefix \"0x\".\n\nFor byte slices, the hex data must be of even length. An empty byte slice\nencodes as \"0x\".\n\nIntegers are encoded using the least amount of digits (no leading zero digits). Their\nencoding may be of uneven length. The number zero encodes as \"0x0\".\n*/\npackage hexutil\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"strconv\"\n)\n\nconst uintBits = 32 << (uint64(^uint(0)) >> 63)\n\n// Errors\nvar (\n\tErrEmptyString   = &decError{\"empty hex string\"}\n\tErrInvalidBase58 = &decError{\"invalid base58 string\"}\n\tErrSyntax        = &decError{\"invalid hex string\"}\n\tErrMissingPrefix = &decError{\"hex string without 0x prefix\"}\n\tErrOddLength     = &decError{\"hex string of odd length\"}\n\tErrEmptyNumber   = &decError{\"hex string \\\"0x\\\"\"}\n\tErrLeadingZero   = &decError{\"hex number with leading zero digits\"}\n\tErrUint64Range   = &decError{\"hex number > 64 bits\"}\n\tErrUintRange     = &decError{fmt.Sprintf(\"hex number > %d bits\", uintBits)}\n\tErrBig256Range   = &decError{\"hex number > 256 bits\"}\n)\n\ntype decError struct{ msg string }\n\nfunc (err decError) Error() string { return err.msg }\n\n// Decode decodes a hex string with 0x prefix.\nfunc Decode(input string) ([]byte, error) {\n\tif len(input) == 0 {\n\t\treturn nil, ErrEmptyString\n\t}\n\tif !has0xPrefix(input) {\n\t\treturn nil, ErrMissingPrefix\n\t}\n\tb, err := hex.DecodeString(input[2:])\n\tif err != nil {\n\t\terr = mapError(err)\n\t}\n\treturn b, err\n}\n\n// MustDecode decodes a hex string with 0x prefix. It panics for invalid input.\nfunc MustDecode(input string) []byte {\n\tdec, err := Decode(input)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn dec\n}\n\n// Encode encodes b as a hex string with 0x prefix.\nfunc Encode(b []byte) string {\n\tenc := make([]byte, len(b)*2+2)\n\tcopy(enc, \"0x\")\n\thex.Encode(enc[2:], b)\n\treturn string(enc)\n}\n\n// DecodeUint64 decodes a hex string with 0x prefix as a quantity.\nfunc DecodeUint64(input string) (uint64, error) {\n\traw, err := checkNumber(input)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdec, err := strconv.ParseUint(raw, 16, 64)\n\tif err != nil {\n\t\terr = mapError(err)\n\t}\n\treturn dec, err\n}\n\n// MustDecodeUint64 decodes a hex string with 0x prefix as a quantity.\n// It panics for invalid input.\nfunc MustDecodeUint64(input string) uint64 {\n\tdec, err := DecodeUint64(input)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn dec\n}\n\n// EncodeUint64 encodes i as a hex string with 0x prefix.\nfunc EncodeUint64(i uint64) string {\n\tenc := make([]byte, 2, 10)\n\tcopy(enc, \"0x\")\n\treturn string(strconv.AppendUint(enc, i, 16))\n}\n\nvar bigWordNibbles int\n\nfunc init() {\n\t// This is a weird way to compute the number of nibbles required for big.Word.\n\t// The usual way would be to use constant arithmetic but go vet can't handle that.\n\tb, _ := new(big.Int).SetString(\"FFFFFFFFFF\", 16)\n\tswitch len(b.Bits()) {\n\tcase 1:\n\t\tbigWordNibbles = 16\n\tcase 2:\n\t\tbigWordNibbles = 8\n\tdefault:\n\t\tpanic(\"weird big.Word size\")\n\t}\n}\n\n// DecodeBig decodes a hex string with 0x prefix as a quantity.\n// Numbers larger than 256 bits are not accepted.\nfunc DecodeBig(input string) (*big.Int, error) {\n\traw, err := checkNumber(input)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(raw) > 64 {\n\t\treturn nil, ErrBig256Range\n\t}\n\twords := make([]big.Word, len(raw)/bigWordNibbles+1)\n\tend := len(raw)\n\tfor i := range words {\n\t\tstart := end - bigWordNibbles\n\t\tif start < 0 {\n\t\t\tstart = 0\n\t\t}\n\t\tfor ri := start; ri < end; ri++ {\n\t\t\tnib := decodeNibble(raw[ri])\n\t\t\tif nib == badNibble {\n\t\t\t\treturn nil, ErrSyntax\n\t\t\t}\n\t\t\twords[i] *= 16\n\t\t\twords[i] += big.Word(nib)\n\t\t}\n\t\tend = start\n\t}\n\tdec := new(big.Int).SetBits(words)\n\treturn dec, nil\n}\n\n// MustDecodeBig decodes a hex string with 0x prefix as a quantity.\n// It panics for invalid input.\nfunc MustDecodeBig(input string) *big.Int {\n\tdec, err := DecodeBig(input)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn dec\n}\n\n// EncodeBig encodes bigint as a hex string with 0x prefix.\n// The sign of the integer is ignored.\nfunc EncodeBig(bigint *big.Int) string {\n\tnbits := bigint.BitLen()\n\tif nbits == 0 {\n\t\treturn \"0x0\"\n\t}\n\treturn fmt.Sprintf(\"%#x\", bigint)\n}\n\nfunc has0xPrefix(input string) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\n\nfunc checkNumber(input string) (raw string, err error) {\n\tif len(input) == 0 {\n\t\treturn \"\", ErrEmptyString\n\t}\n\tif !has0xPrefix(input) {\n\t\treturn \"\", ErrMissingPrefix\n\t}\n\tinput = input[2:]\n\tif len(input) == 0 {\n\t\treturn \"\", ErrEmptyNumber\n\t}\n\tif len(input) > 1 && input[0] == '0' {\n\t\treturn \"\", ErrLeadingZero\n\t}\n\treturn input, nil\n}\n\nconst badNibble = ^uint64(0)\n\nfunc decodeNibble(in byte) uint64 {\n\tswitch {\n\tcase in >= '0' && in <= '9':\n\t\treturn uint64(in - '0')\n\tcase in >= 'A' && in <= 'F':\n\t\treturn uint64(in - 'A' + 10)\n\tcase in >= 'a' && in <= 'f':\n\t\treturn uint64(in - 'a' + 10)\n\tdefault:\n\t\treturn badNibble\n\t}\n}\n\nfunc mapError(err error) error {\n\tif err, ok := err.(*strconv.NumError); ok {\n\t\tswitch err.Err {\n\t\tcase strconv.ErrRange:\n\t\t\treturn ErrUint64Range\n\t\tcase strconv.ErrSyntax:\n\t\t\treturn ErrSyntax\n\t\t}\n\t}\n\tif _, ok := err.(hex.InvalidByteError); ok {\n\t\treturn ErrSyntax\n\t}\n\tif err == hex.ErrLength {\n\t\treturn ErrOddLength\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "common/hexutil/hexutil_test.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage hexutil\n\nimport (\n\t\"bytes\"\n\t\"math/big\"\n\t\"testing\"\n)\n\ntype marshalTest struct {\n\tinput interface{}\n\twant  string\n}\n\ntype unmarshalTest struct {\n\tinput        string\n\twant         interface{}\n\twantErr      error // if set, decoding must fail on any platform\n\twantErr32bit error // if set, decoding must fail on 32bit platforms (used for Uint tests)\n}\n\nvar (\n\tencodeBytesTests = []marshalTest{\n\t\t{[]byte{}, \"0x\"},\n\t\t{[]byte{0}, \"0x00\"},\n\t\t{[]byte{0, 0, 1, 2}, \"0x00000102\"},\n\t}\n\n\tencodeBigTests = []marshalTest{\n\t\t{referenceBig(\"0\"), \"0x0\"},\n\t\t{referenceBig(\"1\"), \"0x1\"},\n\t\t{referenceBig(\"ff\"), \"0xff\"},\n\t\t{referenceBig(\"112233445566778899aabbccddeeff\"), \"0x112233445566778899aabbccddeeff\"},\n\t\t{referenceBig(\"80a7f2c1bcc396c00\"), \"0x80a7f2c1bcc396c00\"},\n\t\t{referenceBig(\"-80a7f2c1bcc396c00\"), \"-0x80a7f2c1bcc396c00\"},\n\t}\n\n\tencodeUint64Tests = []marshalTest{\n\t\t{uint64(0), \"0x0\"},\n\t\t{uint64(1), \"0x1\"},\n\t\t{uint64(0xff), \"0xff\"},\n\t\t{uint64(0x1122334455667788), \"0x1122334455667788\"},\n\t}\n\n\tencodeUintTests = []marshalTest{\n\t\t{uint(0), \"0x0\"},\n\t\t{uint(1), \"0x1\"},\n\t\t{uint(0xff), \"0xff\"},\n\t\t{uint(0x11223344), \"0x11223344\"},\n\t}\n\n\tdecodeBytesTests = []unmarshalTest{\n\t\t// invalid\n\t\t{input: ``, wantErr: ErrEmptyString},\n\t\t{input: `0`, wantErr: ErrMissingPrefix},\n\t\t{input: `0x0`, wantErr: ErrOddLength},\n\t\t{input: `0x023`, wantErr: ErrOddLength},\n\t\t{input: `0xxx`, wantErr: ErrSyntax},\n\t\t{input: `0x01zz01`, wantErr: ErrSyntax},\n\t\t// valid\n\t\t{input: `0x`, want: []byte{}},\n\t\t{input: `0X`, want: []byte{}},\n\t\t{input: `0x02`, want: []byte{0x02}},\n\t\t{input: `0X02`, want: []byte{0x02}},\n\t\t{input: `0xffffffffff`, want: []byte{0xff, 0xff, 0xff, 0xff, 0xff}},\n\t\t{\n\t\t\tinput: `0xffffffffffffffffffffffffffffffffffff`,\n\t\t\twant:  []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n\t\t},\n\t}\n\n\tdecodeBigTests = []unmarshalTest{\n\t\t// invalid\n\t\t{input: `0`, wantErr: ErrMissingPrefix},\n\t\t{input: `0x`, wantErr: ErrEmptyNumber},\n\t\t{input: `0x01`, wantErr: ErrLeadingZero},\n\t\t{input: `0xx`, wantErr: ErrSyntax},\n\t\t{input: `0x1zz01`, wantErr: ErrSyntax},\n\t\t{\n\t\t\tinput:   `0x10000000000000000000000000000000000000000000000000000000000000000`,\n\t\t\twantErr: ErrBig256Range,\n\t\t},\n\t\t// valid\n\t\t{input: `0x0`, want: big.NewInt(0)},\n\t\t{input: `0x2`, want: big.NewInt(0x2)},\n\t\t{input: `0x2F2`, want: big.NewInt(0x2f2)},\n\t\t{input: `0X2F2`, want: big.NewInt(0x2f2)},\n\t\t{input: `0x1122aaff`, want: big.NewInt(0x1122aaff)},\n\t\t{input: `0xbBb`, want: big.NewInt(0xbbb)},\n\t\t{input: `0xfffffffff`, want: big.NewInt(0xfffffffff)},\n\t\t{\n\t\t\tinput: `0x112233445566778899aabbccddeeff`,\n\t\t\twant:  referenceBig(\"112233445566778899aabbccddeeff\"),\n\t\t},\n\t\t{\n\t\t\tinput: `0xffffffffffffffffffffffffffffffffffff`,\n\t\t\twant:  referenceBig(\"ffffffffffffffffffffffffffffffffffff\"),\n\t\t},\n\t\t{\n\t\t\tinput: `0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`,\n\t\t\twant:  referenceBig(\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"),\n\t\t},\n\t}\n\n\tdecodeUint64Tests = []unmarshalTest{\n\t\t// invalid\n\t\t{input: `0`, wantErr: ErrMissingPrefix},\n\t\t{input: `0x`, wantErr: ErrEmptyNumber},\n\t\t{input: `0x01`, wantErr: ErrLeadingZero},\n\t\t{input: `0xfffffffffffffffff`, wantErr: ErrUint64Range},\n\t\t{input: `0xx`, wantErr: ErrSyntax},\n\t\t{input: `0x1zz01`, wantErr: ErrSyntax},\n\t\t// valid\n\t\t{input: `0x0`, want: uint64(0)},\n\t\t{input: `0x2`, want: uint64(0x2)},\n\t\t{input: `0x2F2`, want: uint64(0x2f2)},\n\t\t{input: `0X2F2`, want: uint64(0x2f2)},\n\t\t{input: `0x1122aaff`, want: uint64(0x1122aaff)},\n\t\t{input: `0xbbb`, want: uint64(0xbbb)},\n\t\t{input: `0xffffffffffffffff`, want: uint64(0xffffffffffffffff)},\n\t}\n)\n\nfunc TestEncode(t *testing.T) {\n\tfor _, test := range encodeBytesTests {\n\t\tenc := Encode(test.input.([]byte))\n\t\tif enc != test.want {\n\t\t\tt.Errorf(\"input %x: wrong encoding %s\", test.input, enc)\n\t\t}\n\t}\n}\n\nfunc TestDecode(t *testing.T) {\n\tfor _, test := range decodeBytesTests {\n\t\tdec, err := Decode(test.input)\n\t\tif !checkError(t, test.input, err, test.wantErr) {\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(test.want.([]byte), dec) {\n\t\t\tt.Errorf(\"input %s: value mismatch: got %x, want %x\", test.input, dec, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestEncodeBig(t *testing.T) {\n\tfor _, test := range encodeBigTests {\n\t\tenc := EncodeBig(test.input.(*big.Int))\n\t\tif enc != test.want {\n\t\t\tt.Errorf(\"input %x: wrong encoding %s\", test.input, enc)\n\t\t}\n\t}\n}\n\nfunc TestDecodeBig(t *testing.T) {\n\tfor _, test := range decodeBigTests {\n\t\tdec, err := DecodeBig(test.input)\n\t\tif !checkError(t, test.input, err, test.wantErr) {\n\t\t\tcontinue\n\t\t}\n\t\tif dec.Cmp(test.want.(*big.Int)) != 0 {\n\t\t\tt.Errorf(\"input %s: value mismatch: got %x, want %x\", test.input, dec, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestEncodeUint64(t *testing.T) {\n\tfor _, test := range encodeUint64Tests {\n\t\tenc := EncodeUint64(test.input.(uint64))\n\t\tif enc != test.want {\n\t\t\tt.Errorf(\"input %x: wrong encoding %s\", test.input, enc)\n\t\t}\n\t}\n}\n\nfunc TestDecodeUint64(t *testing.T) {\n\tfor _, test := range decodeUint64Tests {\n\t\tdec, err := DecodeUint64(test.input)\n\t\tif !checkError(t, test.input, err, test.wantErr) {\n\t\t\tcontinue\n\t\t}\n\t\tif dec != test.want.(uint64) {\n\t\t\tt.Errorf(\"input %s: value mismatch: got %x, want %x\", test.input, dec, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "common/hexutil/json.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage hexutil\n\nimport (\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strconv\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n)\n\nvar (\n\tbytesT  = reflect.TypeOf(Bytes(nil))\n\tbigT    = reflect.TypeOf((*Big)(nil))\n\tuintT   = reflect.TypeOf(Uint(0))\n\tuint64T = reflect.TypeOf(Uint64(0))\n)\n\n// Bytes marshals/unmarshals as a JSON string with 0x prefix.\n// The empty slice marshals as \"0x\".\ntype Bytes []byte\n\n// MarshalText implements encoding.TextMarshaler\nfunc (b Bytes) MarshalText() ([]byte, error) {\n\tresult := make([]byte, len(b)*2+2)\n\tcopy(result, `0x`)\n\thex.Encode(result[2:], b)\n\treturn result, nil\n}\n\nfunc (b Bytes) MarshalBase58Text() ([]byte, error) {\n\treturn []byte(base58.Encode(b)), nil\n}\n\n// UnmarshalJSON implements json.Unmarshaler.\nfunc (b *Bytes) UnmarshalJSON(input []byte) error {\n\tif !isString(input) {\n\t\treturn errNonString(bytesT)\n\t}\n\treturn wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bytesT)\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *Bytes) UnmarshalText(input []byte) error {\n\traw, err := checkText(input, true)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdec := make([]byte, len(raw)/2)\n\tif _, err = hex.Decode(dec, raw); err != nil {\n\t\terr = mapError(err)\n\t} else {\n\t\t*b = dec\n\t}\n\treturn err\n}\n\n// String returns the hex encoding of b.\nfunc (b Bytes) String() string {\n\treturn Encode(b)\n}\n\n// UnmarshalFixedJSON decodes the input as a string with 0x prefix. The length of out\n// determines the required input length. This function is commonly used to implement the\n// UnmarshalJSON method for fixed-size types.\nfunc UnmarshalFixedJSON(typ reflect.Type, input, out []byte) error {\n\tif !isString(input) {\n\t\treturn errNonString(typ)\n\t}\n\treturn wrapTypeError(UnmarshalFixedText(typ.String(), input[1:len(input)-1], out), typ)\n}\n\n// UnmarshalFixedText decodes the input as a string with 0x prefix. The length of out\n// determines the required input length. This function is commonly used to implement the\n// UnmarshalText method for fixed-size types.\nfunc UnmarshalFixedText(typname string, input, out []byte) error {\n\traw, err := checkText(input, true)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(raw)/2 != len(out) {\n\t\treturn fmt.Errorf(\"hex string has length %d, want %d for %s\", len(raw), len(out)*2, typname)\n\t}\n\t// Pre-verify syntax before modifying out.\n\tfor _, b := range raw {\n\t\tif decodeNibble(b) == badNibble {\n\t\t\treturn ErrSyntax\n\t\t}\n\t}\n\thex.Decode(out, raw)\n\treturn nil\n}\n\n// UnmarshalFixedUnprefixedText decodes the input as a string with optional 0x prefix. The\n// length of out determines the required input length. This function is commonly used to\n// implement the UnmarshalText method for fixed-size types.\nfunc UnmarshalFixedUnprefixedText(typname string, input, out []byte) error {\n\traw, err := checkText(input, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(raw)/2 != len(out) {\n\t\treturn fmt.Errorf(\"hex string has length %d, want %d for %s\", len(raw), len(out)*2, typname)\n\t}\n\t// Pre-verify syntax before modifying out.\n\tfor _, b := range raw {\n\t\tif decodeNibble(b) == badNibble {\n\t\t\treturn ErrSyntax\n\t\t}\n\t}\n\thex.Decode(out, raw)\n\treturn nil\n}\n\n// Big marshals/unmarshals as a JSON string with 0x prefix.\n// The zero value marshals as \"0x0\".\n//\n// Negative integers are not supported at this time. Attempting to marshal them will\n// return an error. Values larger than 256bits are rejected by Unmarshal but will be\n// marshaled without error.\ntype Big big.Int\n\n// MarshalText implements encoding.TextMarshaler\nfunc (b Big) MarshalText() ([]byte, error) {\n\treturn []byte(EncodeBig((*big.Int)(&b))), nil\n}\n\n// UnmarshalJSON implements json.Unmarshaler.\nfunc (b *Big) UnmarshalJSON(input []byte) error {\n\tif !isString(input) {\n\t\treturn errNonString(bigT)\n\t}\n\treturn wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), bigT)\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler\nfunc (b *Big) UnmarshalText(input []byte) error {\n\traw, err := checkNumberText(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(raw) > 64 {\n\t\treturn ErrBig256Range\n\t}\n\twords := make([]big.Word, len(raw)/bigWordNibbles+1)\n\tend := len(raw)\n\tfor i := range words {\n\t\tstart := end - bigWordNibbles\n\t\tif start < 0 {\n\t\t\tstart = 0\n\t\t}\n\t\tfor ri := start; ri < end; ri++ {\n\t\t\tnib := decodeNibble(raw[ri])\n\t\t\tif nib == badNibble {\n\t\t\t\treturn ErrSyntax\n\t\t\t}\n\t\t\twords[i] *= 16\n\t\t\twords[i] += big.Word(nib)\n\t\t}\n\t\tend = start\n\t}\n\tvar dec big.Int\n\tdec.SetBits(words)\n\t*b = (Big)(dec)\n\treturn nil\n}\n\n// ToInt converts b to a big.Int.\nfunc (b *Big) ToInt() *big.Int {\n\treturn (*big.Int)(b)\n}\n\n// String returns the hex encoding of b.\nfunc (b *Big) String() string {\n\treturn EncodeBig(b.ToInt())\n}\n\n// Uint64 marshals/unmarshals as a JSON string with 0x prefix.\n// The zero value marshals as \"0x0\".\ntype Uint64 uint64\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (b Uint64) MarshalText() ([]byte, error) {\n\tbuf := make([]byte, 2, 10)\n\tcopy(buf, `0x`)\n\tbuf = strconv.AppendUint(buf, uint64(b), 16)\n\treturn buf, nil\n}\n\n// UnmarshalJSON implements json.Unmarshaler.\nfunc (b *Uint64) UnmarshalJSON(input []byte) error {\n\tif !isString(input) {\n\t\treturn errNonString(uint64T)\n\t}\n\treturn wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), uint64T)\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler\nfunc (b *Uint64) UnmarshalText(input []byte) error {\n\traw, err := checkNumberText(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(raw) > 16 {\n\t\treturn ErrUint64Range\n\t}\n\tvar dec uint64\n\tfor _, byte := range raw {\n\t\tnib := decodeNibble(byte)\n\t\tif nib == badNibble {\n\t\t\treturn ErrSyntax\n\t\t}\n\t\tdec *= 16\n\t\tdec += nib\n\t}\n\t*b = Uint64(dec)\n\treturn nil\n}\n\n// String returns the hex encoding of b.\nfunc (b Uint64) String() string {\n\treturn EncodeUint64(uint64(b))\n}\n\n// Uint marshals/unmarshals as a JSON string with 0x prefix.\n// The zero value marshals as \"0x0\".\ntype Uint uint\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (b Uint) MarshalText() ([]byte, error) {\n\treturn Uint64(b).MarshalText()\n}\n\n// UnmarshalJSON implements json.Unmarshaler.\nfunc (b *Uint) UnmarshalJSON(input []byte) error {\n\tif !isString(input) {\n\t\treturn errNonString(uintT)\n\t}\n\treturn wrapTypeError(b.UnmarshalText(input[1:len(input)-1]), uintT)\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *Uint) UnmarshalText(input []byte) error {\n\tvar u64 Uint64\n\terr := u64.UnmarshalText(input)\n\tif u64 > Uint64(^uint(0)) || err == ErrUint64Range {\n\t\treturn ErrUintRange\n\t} else if err != nil {\n\t\treturn err\n\t}\n\t*b = Uint(u64)\n\treturn nil\n}\n\n// String returns the hex encoding of b.\nfunc (b Uint) String() string {\n\treturn EncodeUint64(uint64(b))\n}\n\nfunc isString(input []byte) bool {\n\treturn len(input) >= 2 && input[0] == '\"' && input[len(input)-1] == '\"'\n}\n\nfunc bytesHave0xPrefix(input []byte) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\n\nfunc checkText(input []byte, wantPrefix bool) ([]byte, error) {\n\tif len(input) == 0 {\n\t\treturn nil, nil // empty strings are allowed\n\t}\n\tif bytesHave0xPrefix(input) {\n\t\tinput = input[2:]\n\t} else if wantPrefix {\n\t\treturn nil, ErrMissingPrefix\n\t}\n\tif len(input)%2 != 0 {\n\t\treturn nil, ErrOddLength\n\t}\n\treturn input, nil\n}\n\nfunc isBase58Str(s string) bool {\n\n\tpattern := \"^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$\"\n\tmatch, err := regexp.MatchString(pattern, s)\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn match\n\n}\n\nfunc checkBase58Text(input []byte) ([]byte, error) {\n\tif isBase58Str(string(input)) {\n\t\treturn input, nil\n\t} else {\n\t\treturn nil, ErrInvalidBase58\n\t}\n\treturn input, nil\n}\n\nfunc checkNumberText(input []byte) (raw []byte, err error) {\n\tif len(input) == 0 {\n\t\treturn nil, nil // empty strings are allowed\n\t}\n\tif !bytesHave0xPrefix(input) {\n\t\treturn nil, ErrMissingPrefix\n\t}\n\tinput = input[2:]\n\tif len(input) == 0 {\n\t\treturn nil, ErrEmptyNumber\n\t}\n\tif len(input) > 1 && input[0] == '0' {\n\t\treturn nil, ErrLeadingZero\n\t}\n\treturn input, nil\n}\n\nfunc wrapTypeError(err error, typ reflect.Type) error {\n\tif _, ok := err.(*decError); ok {\n\t\treturn &json.UnmarshalTypeError{Value: err.Error(), Type: typ}\n\t}\n\treturn err\n}\n\nfunc errNonString(typ reflect.Type) error {\n\treturn &json.UnmarshalTypeError{Value: \"non-string\", Type: typ}\n}\n"
  },
  {
    "path": "common/hexutil/json_test.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage hexutil\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\t\"testing\"\n)\n\nfunc checkError(t *testing.T, input string, got, want error) bool {\n\tif got == nil {\n\t\tif want != nil {\n\t\t\tt.Errorf(\"input %s: got no error, want %q\", input, want)\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}\n\tif want == nil {\n\t\tt.Errorf(\"input %s: unexpected error %q\", input, got)\n\t} else if got.Error() != want.Error() {\n\t\tt.Errorf(\"input %s: got error %q, want %q\", input, got, want)\n\t}\n\treturn false\n}\n\nfunc referenceBig(s string) *big.Int {\n\tb, ok := new(big.Int).SetString(s, 16)\n\tif !ok {\n\t\tpanic(\"invalid\")\n\t}\n\treturn b\n}\n\nfunc referenceBytes(s string) []byte {\n\tb, err := hex.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\nvar errJSONEOF = errors.New(\"unexpected end of JSON input\")\n\nvar unmarshalBytesTests = []unmarshalTest{\n\t// invalid encoding\n\t{input: \"\", wantErr: errJSONEOF},\n\t{input: \"null\", wantErr: errNonString(bytesT)},\n\t{input: \"10\", wantErr: errNonString(bytesT)},\n\t{input: `\"0\"`, wantErr: wrapTypeError(ErrMissingPrefix, bytesT)},\n\t{input: `\"0x0\"`, wantErr: wrapTypeError(ErrOddLength, bytesT)},\n\t{input: `\"0xxx\"`, wantErr: wrapTypeError(ErrSyntax, bytesT)},\n\t{input: `\"0x01zz01\"`, wantErr: wrapTypeError(ErrSyntax, bytesT)},\n\n\t// valid encoding\n\t{input: `\"\"`, want: referenceBytes(\"\")},\n\t{input: `\"0x\"`, want: referenceBytes(\"\")},\n\t{input: `\"0x02\"`, want: referenceBytes(\"02\")},\n\t{input: `\"0X02\"`, want: referenceBytes(\"02\")},\n\t{input: `\"0xffffffffff\"`, want: referenceBytes(\"ffffffffff\")},\n\t{\n\t\tinput: `\"0xffffffffffffffffffffffffffffffffffff\"`,\n\t\twant:  referenceBytes(\"ffffffffffffffffffffffffffffffffffff\"),\n\t},\n}\n\nfunc TestUnmarshalBytes(t *testing.T) {\n\tfor _, test := range unmarshalBytesTests {\n\t\tvar v Bytes\n\t\terr := json.Unmarshal([]byte(test.input), &v)\n\t\tif !checkError(t, test.input, err, test.wantErr) {\n\t\t\tcontinue\n\t\t}\n\t\tif !bytes.Equal(test.want.([]byte), []byte(v)) {\n\t\t\tt.Errorf(\"input %s: value mismatch: got %x, want %x\", test.input, &v, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc BenchmarkUnmarshalBytes(b *testing.B) {\n\tinput := []byte(`\"0x123456789abcdef123456789abcdef\"`)\n\tfor i := 0; i < b.N; i++ {\n\t\tvar v Bytes\n\t\tif err := v.UnmarshalJSON(input); err != nil {\n\t\t\tb.Fatal(err)\n\t\t}\n\t}\n}\n\nfunc TestMarshalBytes(t *testing.T) {\n\tfor _, test := range encodeBytesTests {\n\t\tin := test.input.([]byte)\n\t\tout, err := json.Marshal(Bytes(in))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%x: %v\", in, err)\n\t\t\tcontinue\n\t\t}\n\t\tif want := `\"` + test.want + `\"`; string(out) != want {\n\t\t\tt.Errorf(\"%x: MarshalJSON output mismatch: got %q, want %q\", in, out, want)\n\t\t\tcontinue\n\t\t}\n\t\tif out := Bytes(in).String(); out != test.want {\n\t\t\tt.Errorf(\"%x: String mismatch: got %q, want %q\", in, out, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nvar unmarshalBigTests = []unmarshalTest{\n\t// invalid encoding\n\t{input: \"\", wantErr: errJSONEOF},\n\t{input: \"null\", wantErr: errNonString(bigT)},\n\t{input: \"10\", wantErr: errNonString(bigT)},\n\t{input: `\"0\"`, wantErr: wrapTypeError(ErrMissingPrefix, bigT)},\n\t{input: `\"0x\"`, wantErr: wrapTypeError(ErrEmptyNumber, bigT)},\n\t{input: `\"0x01\"`, wantErr: wrapTypeError(ErrLeadingZero, bigT)},\n\t{input: `\"0xx\"`, wantErr: wrapTypeError(ErrSyntax, bigT)},\n\t{input: `\"0x1zz01\"`, wantErr: wrapTypeError(ErrSyntax, bigT)},\n\t{\n\t\tinput:   `\"0x10000000000000000000000000000000000000000000000000000000000000000\"`,\n\t\twantErr: wrapTypeError(ErrBig256Range, bigT),\n\t},\n\n\t// valid encoding\n\t{input: `\"\"`, want: big.NewInt(0)},\n\t{input: `\"0x0\"`, want: big.NewInt(0)},\n\t{input: `\"0x2\"`, want: big.NewInt(0x2)},\n\t{input: `\"0x2F2\"`, want: big.NewInt(0x2f2)},\n\t{input: `\"0X2F2\"`, want: big.NewInt(0x2f2)},\n\t{input: `\"0x1122aaff\"`, want: big.NewInt(0x1122aaff)},\n\t{input: `\"0xbBb\"`, want: big.NewInt(0xbbb)},\n\t{input: `\"0xfffffffff\"`, want: big.NewInt(0xfffffffff)},\n\t{\n\t\tinput: `\"0x112233445566778899aabbccddeeff\"`,\n\t\twant:  referenceBig(\"112233445566778899aabbccddeeff\"),\n\t},\n\t{\n\t\tinput: `\"0xffffffffffffffffffffffffffffffffffff\"`,\n\t\twant:  referenceBig(\"ffffffffffffffffffffffffffffffffffff\"),\n\t},\n\t{\n\t\tinput: `\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"`,\n\t\twant:  referenceBig(\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"),\n\t},\n}\n\nfunc TestUnmarshalBig(t *testing.T) {\n\tfor _, test := range unmarshalBigTests {\n\t\tvar v Big\n\t\terr := json.Unmarshal([]byte(test.input), &v)\n\t\tif !checkError(t, test.input, err, test.wantErr) {\n\t\t\tcontinue\n\t\t}\n\t\tif test.want != nil && test.want.(*big.Int).Cmp((*big.Int)(&v)) != 0 {\n\t\t\tt.Errorf(\"input %s: value mismatch: got %x, want %x\", test.input, (*big.Int)(&v), test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc BenchmarkUnmarshalBig(b *testing.B) {\n\tinput := []byte(`\"0x123456789abcdef123456789abcdef\"`)\n\tfor i := 0; i < b.N; i++ {\n\t\tvar v Big\n\t\tif err := v.UnmarshalJSON(input); err != nil {\n\t\t\tb.Fatal(err)\n\t\t}\n\t}\n}\n\nfunc TestMarshalBig(t *testing.T) {\n\tfor _, test := range encodeBigTests {\n\t\tin := test.input.(*big.Int)\n\t\tout, err := json.Marshal((*Big)(in))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%d: %v\", in, err)\n\t\t\tcontinue\n\t\t}\n\t\tif want := `\"` + test.want + `\"`; string(out) != want {\n\t\t\tt.Errorf(\"%d: MarshalJSON output mismatch: got %q, want %q\", in, out, want)\n\t\t\tcontinue\n\t\t}\n\t\tif out := (*Big)(in).String(); out != test.want {\n\t\t\tt.Errorf(\"%x: String mismatch: got %q, want %q\", in, out, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nvar unmarshalUint64Tests = []unmarshalTest{\n\t// invalid encoding\n\t{input: \"\", wantErr: errJSONEOF},\n\t{input: \"null\", wantErr: errNonString(uint64T)},\n\t{input: \"10\", wantErr: errNonString(uint64T)},\n\t{input: `\"0\"`, wantErr: wrapTypeError(ErrMissingPrefix, uint64T)},\n\t{input: `\"0x\"`, wantErr: wrapTypeError(ErrEmptyNumber, uint64T)},\n\t{input: `\"0x01\"`, wantErr: wrapTypeError(ErrLeadingZero, uint64T)},\n\t{input: `\"0xfffffffffffffffff\"`, wantErr: wrapTypeError(ErrUint64Range, uint64T)},\n\t{input: `\"0xx\"`, wantErr: wrapTypeError(ErrSyntax, uint64T)},\n\t{input: `\"0x1zz01\"`, wantErr: wrapTypeError(ErrSyntax, uint64T)},\n\n\t// valid encoding\n\t{input: `\"\"`, want: uint64(0)},\n\t{input: `\"0x0\"`, want: uint64(0)},\n\t{input: `\"0x2\"`, want: uint64(0x2)},\n\t{input: `\"0x2F2\"`, want: uint64(0x2f2)},\n\t{input: `\"0X2F2\"`, want: uint64(0x2f2)},\n\t{input: `\"0x1122aaff\"`, want: uint64(0x1122aaff)},\n\t{input: `\"0xbbb\"`, want: uint64(0xbbb)},\n\t{input: `\"0xffffffffffffffff\"`, want: uint64(0xffffffffffffffff)},\n}\n\nfunc TestUnmarshalUint64(t *testing.T) {\n\tfor _, test := range unmarshalUint64Tests {\n\t\tvar v Uint64\n\t\terr := json.Unmarshal([]byte(test.input), &v)\n\t\tif !checkError(t, test.input, err, test.wantErr) {\n\t\t\tcontinue\n\t\t}\n\t\tif uint64(v) != test.want.(uint64) {\n\t\t\tt.Errorf(\"input %s: value mismatch: got %d, want %d\", test.input, v, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc BenchmarkUnmarshalUint64(b *testing.B) {\n\tinput := []byte(`\"0x123456789abcdf\"`)\n\tfor i := 0; i < b.N; i++ {\n\t\tvar v Uint64\n\t\tv.UnmarshalJSON(input)\n\t}\n}\n\nfunc TestMarshalUint64(t *testing.T) {\n\tfor _, test := range encodeUint64Tests {\n\t\tin := test.input.(uint64)\n\t\tout, err := json.Marshal(Uint64(in))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%d: %v\", in, err)\n\t\t\tcontinue\n\t\t}\n\t\tif want := `\"` + test.want + `\"`; string(out) != want {\n\t\t\tt.Errorf(\"%d: MarshalJSON output mismatch: got %q, want %q\", in, out, want)\n\t\t\tcontinue\n\t\t}\n\t\tif out := (Uint64)(in).String(); out != test.want {\n\t\t\tt.Errorf(\"%x: String mismatch: got %q, want %q\", in, out, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestMarshalUint(t *testing.T) {\n\tfor _, test := range encodeUintTests {\n\t\tin := test.input.(uint)\n\t\tout, err := json.Marshal(Uint(in))\n\t\tif err != nil {\n\t\t\tt.Errorf(\"%d: %v\", in, err)\n\t\t\tcontinue\n\t\t}\n\t\tif want := `\"` + test.want + `\"`; string(out) != want {\n\t\t\tt.Errorf(\"%d: MarshalJSON output mismatch: got %q, want %q\", in, out, want)\n\t\t\tcontinue\n\t\t}\n\t\tif out := (Uint)(in).String(); out != test.want {\n\t\t\tt.Errorf(\"%x: String mismatch: got %q, want %q\", in, out, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nvar (\n\t// These are variables (not constants) to avoid constant overflow\n\t// checks in the compiler on 32bit platforms.\n\tmaxUint33bits = uint64(^uint32(0)) + 1\n\tmaxUint64bits = ^uint64(0)\n)\n\nvar unmarshalUintTests = []unmarshalTest{\n\t// invalid encoding\n\t{input: \"\", wantErr: errJSONEOF},\n\t{input: \"null\", wantErr: errNonString(uintT)},\n\t{input: \"10\", wantErr: errNonString(uintT)},\n\t{input: `\"0\"`, wantErr: wrapTypeError(ErrMissingPrefix, uintT)},\n\t{input: `\"0x\"`, wantErr: wrapTypeError(ErrEmptyNumber, uintT)},\n\t{input: `\"0x01\"`, wantErr: wrapTypeError(ErrLeadingZero, uintT)},\n\t{input: `\"0x100000000\"`, want: uint(maxUint33bits), wantErr32bit: wrapTypeError(ErrUintRange, uintT)},\n\t{input: `\"0xfffffffffffffffff\"`, wantErr: wrapTypeError(ErrUintRange, uintT)},\n\t{input: `\"0xx\"`, wantErr: wrapTypeError(ErrSyntax, uintT)},\n\t{input: `\"0x1zz01\"`, wantErr: wrapTypeError(ErrSyntax, uintT)},\n\n\t// valid encoding\n\t{input: `\"\"`, want: uint(0)},\n\t{input: `\"0x0\"`, want: uint(0)},\n\t{input: `\"0x2\"`, want: uint(0x2)},\n\t{input: `\"0x2F2\"`, want: uint(0x2f2)},\n\t{input: `\"0X2F2\"`, want: uint(0x2f2)},\n\t{input: `\"0x1122aaff\"`, want: uint(0x1122aaff)},\n\t{input: `\"0xbbb\"`, want: uint(0xbbb)},\n\t{input: `\"0xffffffff\"`, want: uint(0xffffffff)},\n\t{input: `\"0xffffffffffffffff\"`, want: uint(maxUint64bits), wantErr32bit: wrapTypeError(ErrUintRange, uintT)},\n}\n\nfunc TestUnmarshalUint(t *testing.T) {\n\tfor _, test := range unmarshalUintTests {\n\t\tvar v Uint\n\t\terr := json.Unmarshal([]byte(test.input), &v)\n\t\tif uintBits == 32 && test.wantErr32bit != nil {\n\t\t\tcheckError(t, test.input, err, test.wantErr32bit)\n\t\t\tcontinue\n\t\t}\n\t\tif !checkError(t, test.input, err, test.wantErr) {\n\t\t\tcontinue\n\t\t}\n\t\tif uint(v) != test.want.(uint) {\n\t\t\tt.Errorf(\"input %s: value mismatch: got %d, want %d\", test.input, v, test.want)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\nfunc TestUnmarshalFixedUnprefixedText(t *testing.T) {\n\ttests := []struct {\n\t\tinput   string\n\t\twant    []byte\n\t\twantErr error\n\t}{\n\t\t{input: \"0x2\", wantErr: ErrOddLength},\n\t\t{input: \"2\", wantErr: ErrOddLength},\n\t\t{input: \"4444\", wantErr: errors.New(\"hex string has length 4, want 8 for x\")},\n\t\t{input: \"4444\", wantErr: errors.New(\"hex string has length 4, want 8 for x\")},\n\t\t// check that output is not modified for partially correct input\n\t\t{input: \"444444gg\", wantErr: ErrSyntax, want: []byte{0, 0, 0, 0}},\n\t\t{input: \"0x444444gg\", wantErr: ErrSyntax, want: []byte{0, 0, 0, 0}},\n\t\t// valid inputs\n\t\t{input: \"44444444\", want: []byte{0x44, 0x44, 0x44, 0x44}},\n\t\t{input: \"0x44444444\", want: []byte{0x44, 0x44, 0x44, 0x44}},\n\t}\n\n\tfor _, test := range tests {\n\t\tout := make([]byte, 4)\n\t\terr := UnmarshalFixedUnprefixedText(\"x\", []byte(test.input), out)\n\t\tswitch {\n\t\tcase err == nil && test.wantErr != nil:\n\t\t\tt.Errorf(\"%q: got no error, expected %q\", test.input, test.wantErr)\n\t\tcase err != nil && test.wantErr == nil:\n\t\t\tt.Errorf(\"%q: unexpected error %q\", test.input, err)\n\t\tcase err != nil && err.Error() != test.wantErr.Error():\n\t\t\tt.Errorf(\"%q: error mismatch: got %q, want %q\", test.input, err, test.wantErr)\n\t\t}\n\t\tif test.want != nil && !bytes.Equal(out, test.want) {\n\t\t\tt.Errorf(\"%q: output mismatch: got %x, want %x\", test.input, out, test.want)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "common/math/big.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package math provides integer math utilities.\npackage math\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n)\n\n// Various big integer limit values.\nvar (\n\ttt255     = BigPow(2, 255)\n\ttt256     = BigPow(2, 256)\n\ttt256m1   = new(big.Int).Sub(tt256, big.NewInt(1))\n\ttt63      = BigPow(2, 63)\n\tMaxBig256 = new(big.Int).Set(tt256m1)\n\tMaxBig63  = new(big.Int).Sub(tt63, big.NewInt(1))\n)\n\nconst (\n\t// number of bits in a big.Word\n\twordBits = 32 << (uint64(^big.Word(0)) >> 63)\n\t// number of bytes in a big.Word\n\twordBytes = wordBits / 8\n)\n\n// HexOrDecimal256 marshals big.Int as hex or decimal.\ntype HexOrDecimal256 big.Int\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (i *HexOrDecimal256) UnmarshalText(input []byte) error {\n\tbigint, ok := ParseBig256(string(input))\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid hex or decimal integer %q\", input)\n\t}\n\t*i = HexOrDecimal256(*bigint)\n\treturn nil\n}\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (i *HexOrDecimal256) MarshalText() ([]byte, error) {\n\tif i == nil {\n\t\treturn []byte(\"0x0\"), nil\n\t}\n\treturn []byte(fmt.Sprintf(\"%#x\", (*big.Int)(i))), nil\n}\n\n// ParseBig256 parses s as a 256 bit integer in decimal or hexadecimal syntax.\n// Leading zeros are accepted. The empty string parses as zero.\nfunc ParseBig256(s string) (*big.Int, bool) {\n\tif s == \"\" {\n\t\treturn new(big.Int), true\n\t}\n\tvar bigint *big.Int\n\tvar ok bool\n\tif len(s) >= 2 && (s[:2] == \"0x\" || s[:2] == \"0X\") {\n\t\tbigint, ok = new(big.Int).SetString(s[2:], 16)\n\t} else {\n\t\tbigint, ok = new(big.Int).SetString(s, 10)\n\t}\n\tif ok && bigint.BitLen() > 256 {\n\t\tbigint, ok = nil, false\n\t}\n\treturn bigint, ok\n}\n\n// MustParseBig256 parses s as a 256 bit big integer and panics if the string is invalid.\nfunc MustParseBig256(s string) *big.Int {\n\tv, ok := ParseBig256(s)\n\tif !ok {\n\t\tpanic(\"invalid 256 bit integer: \" + s)\n\t}\n\treturn v\n}\n\n// BigPow returns a ** b as a big integer.\nfunc BigPow(a, b int64) *big.Int {\n\tr := big.NewInt(a)\n\treturn r.Exp(r, big.NewInt(b), nil)\n}\n\n// BigMax returns the larger of x or y.\nfunc BigMax(x, y *big.Int) *big.Int {\n\tif x.Cmp(y) < 0 {\n\t\treturn y\n\t}\n\treturn x\n}\n\n// BigMin returns the smaller of x or y.\nfunc BigMin(x, y *big.Int) *big.Int {\n\tif x.Cmp(y) > 0 {\n\t\treturn y\n\t}\n\treturn x\n}\n\n// FirstBitSet returns the index of the first 1 bit in v, counting from LSB.\nfunc FirstBitSet(v *big.Int) int {\n\tfor i := 0; i < v.BitLen(); i++ {\n\t\tif v.Bit(i) > 0 {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn v.BitLen()\n}\n\n// PaddedBigBytes encodes a big integer as a big-endian byte slice. The length\n// of the slice is at least n bytes.\nfunc PaddedBigBytes(bigint *big.Int, n int) []byte {\n\tif bigint.BitLen()/8 >= n {\n\t\treturn bigint.Bytes()\n\t}\n\tret := make([]byte, n)\n\tReadBits(bigint, ret)\n\treturn ret\n}\n\n// bigEndianByteAt returns the byte at position n,\n// in Big-Endian encoding\n// So n==0 returns the least significant byte\nfunc bigEndianByteAt(bigint *big.Int, n int) byte {\n\twords := bigint.Bits()\n\t// Check word-bucket the byte will reside in\n\ti := n / wordBytes\n\tif i >= len(words) {\n\t\treturn byte(0)\n\t}\n\tword := words[i]\n\t// Offset of the byte\n\tshift := 8 * uint(n%wordBytes)\n\n\treturn byte(word >> shift)\n}\n\n// Byte returns the byte at position n,\n// with the supplied padlength in Little-Endian encoding.\n// n==0 returns the MSB\n// Example: bigint '5', padlength 32, n=31 => 5\nfunc Byte(bigint *big.Int, padlength, n int) byte {\n\tif n >= padlength {\n\t\treturn byte(0)\n\t}\n\treturn bigEndianByteAt(bigint, padlength-1-n)\n}\n\n// ReadBits encodes the absolute value of bigint as big-endian bytes. Callers must ensure\n// that buf has enough space. If buf is too short the result will be incomplete.\nfunc ReadBits(bigint *big.Int, buf []byte) {\n\ti := len(buf)\n\tfor _, d := range bigint.Bits() {\n\t\tfor j := 0; j < wordBytes && i > 0; j++ {\n\t\t\ti--\n\t\t\tbuf[i] = byte(d)\n\t\t\td >>= 8\n\t\t}\n\t}\n}\n\n// U256 encodes as a 256 bit two's complement number. This operation is destructive.\nfunc U256(x *big.Int) *big.Int {\n\treturn x.And(x, tt256m1)\n}\n\n// S256 interprets x as a two's complement number.\n// x must not exceed 256 bits (the result is undefined if it does) and is not modified.\n//\n//   S256(0)        = 0\n//   S256(1)        = 1\n//   S256(2**255)   = -2**255\n//   S256(2**256-1) = -1\nfunc S256(x *big.Int) *big.Int {\n\tif x.Cmp(tt255) < 0 {\n\t\treturn x\n\t}\n\treturn new(big.Int).Sub(x, tt256)\n}\n\n// Exp implements exponentiation by squaring.\n// Exp returns a newly-allocated big integer and does not change\n// base or exponent. The result is truncated to 256 bits.\n//\n// Courtesy @karalabe and @chfast\nfunc Exp(base, exponent *big.Int) *big.Int {\n\tresult := big.NewInt(1)\n\n\tfor _, word := range exponent.Bits() {\n\t\tfor i := 0; i < wordBits; i++ {\n\t\t\tif word&1 == 1 {\n\t\t\t\tU256(result.Mul(result, base))\n\t\t\t}\n\t\t\tU256(base.Mul(base, base))\n\t\t\tword >>= 1\n\t\t}\n\t}\n\treturn result\n}\n"
  },
  {
    "path": "common/math/big_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage math\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nfunc TestHexOrDecimal256(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\tnum   *big.Int\n\t\tok    bool\n\t}{\n\t\t{\"\", big.NewInt(0), true},\n\t\t{\"0\", big.NewInt(0), true},\n\t\t{\"0x0\", big.NewInt(0), true},\n\t\t{\"12345678\", big.NewInt(12345678), true},\n\t\t{\"0x12345678\", big.NewInt(0x12345678), true},\n\t\t{\"0X12345678\", big.NewInt(0x12345678), true},\n\t\t// Tests for leading zero behaviour:\n\t\t{\"0123456789\", big.NewInt(123456789), true}, // note: not octal\n\t\t{\"00\", big.NewInt(0), true},\n\t\t{\"0x00\", big.NewInt(0), true},\n\t\t{\"0x012345678abc\", big.NewInt(0x12345678abc), true},\n\t\t// Invalid syntax:\n\t\t{\"abcdef\", nil, false},\n\t\t{\"0xgg\", nil, false},\n\t\t// Larger than 256 bits:\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639936\", nil, false},\n\t}\n\tfor _, test := range tests {\n\t\tvar num HexOrDecimal256\n\t\terr := num.UnmarshalText([]byte(test.input))\n\t\tif (err == nil) != test.ok {\n\t\t\tt.Errorf(\"ParseBig(%q) -> (err == nil) == %t, want %t\", test.input, err == nil, test.ok)\n\t\t\tcontinue\n\t\t}\n\t\tif test.num != nil && (*big.Int)(&num).Cmp(test.num) != 0 {\n\t\t\tt.Errorf(\"ParseBig(%q) -> %d, want %d\", test.input, (*big.Int)(&num), test.num)\n\t\t}\n\t}\n}\n\nfunc TestMustParseBig256(t *testing.T) {\n\tdefer func() {\n\t\tif recover() == nil {\n\t\t\tt.Error(\"MustParseBig should've panicked\")\n\t\t}\n\t}()\n\tMustParseBig256(\"ggg\")\n}\n\nfunc TestBigMax(t *testing.T) {\n\ta := big.NewInt(10)\n\tb := big.NewInt(5)\n\n\tmax1 := BigMax(a, b)\n\tif max1 != a {\n\t\tt.Errorf(\"Expected %d got %d\", a, max1)\n\t}\n\n\tmax2 := BigMax(b, a)\n\tif max2 != a {\n\t\tt.Errorf(\"Expected %d got %d\", a, max2)\n\t}\n}\n\nfunc TestBigMin(t *testing.T) {\n\ta := big.NewInt(10)\n\tb := big.NewInt(5)\n\n\tmin1 := BigMin(a, b)\n\tif min1 != b {\n\t\tt.Errorf(\"Expected %d got %d\", b, min1)\n\t}\n\n\tmin2 := BigMin(b, a)\n\tif min2 != b {\n\t\tt.Errorf(\"Expected %d got %d\", b, min2)\n\t}\n}\n\nfunc TestFirstBigSet(t *testing.T) {\n\ttests := []struct {\n\t\tnum *big.Int\n\t\tix  int\n\t}{\n\t\t{big.NewInt(0), 0},\n\t\t{big.NewInt(1), 0},\n\t\t{big.NewInt(2), 1},\n\t\t{big.NewInt(0x100), 8},\n\t}\n\tfor _, test := range tests {\n\t\tif ix := FirstBitSet(test.num); ix != test.ix {\n\t\t\tt.Errorf(\"FirstBitSet(b%b) = %d, want %d\", test.num, ix, test.ix)\n\t\t}\n\t}\n}\n\nfunc TestPaddedBigBytes(t *testing.T) {\n\ttests := []struct {\n\t\tnum    *big.Int\n\t\tn      int\n\t\tresult []byte\n\t}{\n\t\t{num: big.NewInt(0), n: 4, result: []byte{0, 0, 0, 0}},\n\t\t{num: big.NewInt(1), n: 4, result: []byte{0, 0, 0, 1}},\n\t\t{num: big.NewInt(512), n: 4, result: []byte{0, 0, 2, 0}},\n\t\t{num: BigPow(2, 32), n: 4, result: []byte{1, 0, 0, 0, 0}},\n\t}\n\tfor _, test := range tests {\n\t\tif result := PaddedBigBytes(test.num, test.n); !bytes.Equal(result, test.result) {\n\t\t\tt.Errorf(\"PaddedBigBytes(%d, %d) = %v, want %v\", test.num, test.n, result, test.result)\n\t\t}\n\t}\n}\n\nfunc BenchmarkPaddedBigBytesLargePadding(b *testing.B) {\n\tbigint := MustParseBig256(\"123456789123456789123456789123456789\")\n\tfor i := 0; i < b.N; i++ {\n\t\tPaddedBigBytes(bigint, 200)\n\t}\n}\n\nfunc BenchmarkPaddedBigBytesSmallPadding(b *testing.B) {\n\tbigint := MustParseBig256(\"0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC\")\n\tfor i := 0; i < b.N; i++ {\n\t\tPaddedBigBytes(bigint, 5)\n\t}\n}\n\nfunc BenchmarkPaddedBigBytesSmallOnePadding(b *testing.B) {\n\tbigint := MustParseBig256(\"0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC\")\n\tfor i := 0; i < b.N; i++ {\n\t\tPaddedBigBytes(bigint, 32)\n\t}\n}\n\nfunc BenchmarkByteAtBrandNew(b *testing.B) {\n\tbigint := MustParseBig256(\"0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC\")\n\tfor i := 0; i < b.N; i++ {\n\t\tbigEndianByteAt(bigint, 15)\n\t}\n}\n\nfunc BenchmarkByteAt(b *testing.B) {\n\tbigint := MustParseBig256(\"0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC\")\n\tfor i := 0; i < b.N; i++ {\n\t\tbigEndianByteAt(bigint, 15)\n\t}\n}\n\nfunc BenchmarkByteAtOld(b *testing.B) {\n\n\tbigint := MustParseBig256(\"0x18F8F8F1000111000110011100222004330052300000000000000000FEFCF3CC\")\n\tfor i := 0; i < b.N; i++ {\n\t\tPaddedBigBytes(bigint, 32)\n\t}\n}\n\nfunc TestReadBits(t *testing.T) {\n\tcheck := func(input string) {\n\t\twant, _ := hex.DecodeString(input)\n\t\tint, _ := new(big.Int).SetString(input, 16)\n\t\tbuf := make([]byte, len(want))\n\t\tReadBits(int, buf)\n\t\tif !bytes.Equal(buf, want) {\n\t\t\tt.Errorf(\"have: %x\\nwant: %x\", buf, want)\n\t\t}\n\t}\n\tcheck(\"000000000000000000000000000000000000000000000000000000FEFCF3F8F0\")\n\tcheck(\"0000000000012345000000000000000000000000000000000000FEFCF3F8F0\")\n\tcheck(\"18F8F8F1000111000110011100222004330052300000000000000000FEFCF3F8F0\")\n}\n\nfunc TestU256(t *testing.T) {\n\ttests := []struct{ x, y *big.Int }{\n\t\t{x: big.NewInt(0), y: big.NewInt(0)},\n\t\t{x: big.NewInt(1), y: big.NewInt(1)},\n\t\t{x: BigPow(2, 255), y: BigPow(2, 255)},\n\t\t{x: BigPow(2, 256), y: big.NewInt(0)},\n\t\t{x: new(big.Int).Add(BigPow(2, 256), big.NewInt(1)), y: big.NewInt(1)},\n\t\t// negative values\n\t\t{x: big.NewInt(-1), y: new(big.Int).Sub(BigPow(2, 256), big.NewInt(1))},\n\t\t{x: big.NewInt(-2), y: new(big.Int).Sub(BigPow(2, 256), big.NewInt(2))},\n\t\t{x: BigPow(2, -255), y: big.NewInt(1)},\n\t}\n\tfor _, test := range tests {\n\t\tif y := U256(new(big.Int).Set(test.x)); y.Cmp(test.y) != 0 {\n\t\t\tt.Errorf(\"U256(%x) = %x, want %x\", test.x, y, test.y)\n\t\t}\n\t}\n}\n\nfunc TestBigEndianByteAt(t *testing.T) {\n\ttests := []struct {\n\t\tx   string\n\t\ty   int\n\t\texp byte\n\t}{\n\t\t{\"00\", 0, 0x00},\n\t\t{\"01\", 1, 0x00},\n\t\t{\"00\", 1, 0x00},\n\t\t{\"01\", 0, 0x01},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 0, 0x30},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 1, 0x20},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 31, 0xAB},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 32, 0x00},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 500, 0x00},\n\t}\n\tfor _, test := range tests {\n\t\tv := new(big.Int).SetBytes(common.Hex2Bytes(test.x))\n\t\tactual := bigEndianByteAt(v, test.y)\n\t\tif actual != test.exp {\n\t\t\tt.Fatalf(\"Expected  [%v] %v:th byte to be %v, was %v.\", test.x, test.y, test.exp, actual)\n\t\t}\n\n\t}\n}\nfunc TestLittleEndianByteAt(t *testing.T) {\n\ttests := []struct {\n\t\tx   string\n\t\ty   int\n\t\texp byte\n\t}{\n\t\t{\"00\", 0, 0x00},\n\t\t{\"01\", 1, 0x00},\n\t\t{\"00\", 1, 0x00},\n\t\t{\"01\", 0, 0x00},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 0, 0x00},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 1, 0x00},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 31, 0x00},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 32, 0x00},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 0, 0xAB},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 1, 0xCD},\n\t\t{\"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\", 0, 0x00},\n\t\t{\"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\", 1, 0xCD},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 31, 0x30},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 30, 0x20},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", 32, 0x0},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", 31, 0xFF},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", 0xFFFF, 0x0},\n\t}\n\tfor _, test := range tests {\n\t\tv := new(big.Int).SetBytes(common.Hex2Bytes(test.x))\n\t\tactual := Byte(v, 32, test.y)\n\t\tif actual != test.exp {\n\t\t\tt.Fatalf(\"Expected  [%v] %v:th byte to be %v, was %v.\", test.x, test.y, test.exp, actual)\n\t\t}\n\n\t}\n}\n\nfunc TestS256(t *testing.T) {\n\ttests := []struct{ x, y *big.Int }{\n\t\t{x: big.NewInt(0), y: big.NewInt(0)},\n\t\t{x: big.NewInt(1), y: big.NewInt(1)},\n\t\t{x: big.NewInt(2), y: big.NewInt(2)},\n\t\t{\n\t\t\tx: new(big.Int).Sub(BigPow(2, 255), big.NewInt(1)),\n\t\t\ty: new(big.Int).Sub(BigPow(2, 255), big.NewInt(1)),\n\t\t},\n\t\t{\n\t\t\tx: BigPow(2, 255),\n\t\t\ty: new(big.Int).Neg(BigPow(2, 255)),\n\t\t},\n\t\t{\n\t\t\tx: new(big.Int).Sub(BigPow(2, 256), big.NewInt(1)),\n\t\t\ty: big.NewInt(-1),\n\t\t},\n\t\t{\n\t\t\tx: new(big.Int).Sub(BigPow(2, 256), big.NewInt(2)),\n\t\t\ty: big.NewInt(-2),\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tif y := S256(test.x); y.Cmp(test.y) != 0 {\n\t\t\tt.Errorf(\"S256(%x) = %x, want %x\", test.x, y, test.y)\n\t\t}\n\t}\n}\n\nfunc TestExp(t *testing.T) {\n\ttests := []struct{ base, exponent, result *big.Int }{\n\t\t{base: big.NewInt(0), exponent: big.NewInt(0), result: big.NewInt(1)},\n\t\t{base: big.NewInt(1), exponent: big.NewInt(0), result: big.NewInt(1)},\n\t\t{base: big.NewInt(1), exponent: big.NewInt(1), result: big.NewInt(1)},\n\t\t{base: big.NewInt(1), exponent: big.NewInt(2), result: big.NewInt(1)},\n\t\t{base: big.NewInt(3), exponent: big.NewInt(144), result: MustParseBig256(\"507528786056415600719754159741696356908742250191663887263627442114881\")},\n\t\t{base: big.NewInt(2), exponent: big.NewInt(255), result: MustParseBig256(\"57896044618658097711785492504343953926634992332820282019728792003956564819968\")},\n\t}\n\tfor _, test := range tests {\n\t\tif result := Exp(test.base, test.exponent); result.Cmp(test.result) != 0 {\n\t\t\tt.Errorf(\"Exp(%d, %d) = %d, want %d\", test.base, test.exponent, result, test.result)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "common/math/integer.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage math\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// Integer limit values.\nconst (\n\tMaxInt8   = 1<<7 - 1\n\tMinInt8   = -1 << 7\n\tMaxInt16  = 1<<15 - 1\n\tMinInt16  = -1 << 15\n\tMaxInt32  = 1<<31 - 1\n\tMinInt32  = -1 << 31\n\tMaxInt64  = 1<<63 - 1\n\tMinInt64  = -1 << 63\n\tMaxUint8  = 1<<8 - 1\n\tMaxUint16 = 1<<16 - 1\n\tMaxUint32 = 1<<32 - 1\n\tMaxUint64 = 1<<64 - 1\n)\n\n// HexOrDecimal64 marshals uint64 as hex or decimal.\ntype HexOrDecimal64 uint64\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (i *HexOrDecimal64) UnmarshalText(input []byte) error {\n\tint, ok := ParseUint64(string(input))\n\tif !ok {\n\t\treturn fmt.Errorf(\"invalid hex or decimal integer %q\", input)\n\t}\n\t*i = HexOrDecimal64(int)\n\treturn nil\n}\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (i HexOrDecimal64) MarshalText() ([]byte, error) {\n\treturn []byte(fmt.Sprintf(\"%#x\", uint64(i))), nil\n}\n\n// ParseUint64 parses s as an integer in decimal or hexadecimal syntax.\n// Leading zeros are accepted. The empty string parses as zero.\nfunc ParseUint64(s string) (uint64, bool) {\n\tif s == \"\" {\n\t\treturn 0, true\n\t}\n\tif len(s) >= 2 && (s[:2] == \"0x\" || s[:2] == \"0X\") {\n\t\tv, err := strconv.ParseUint(s[2:], 16, 64)\n\t\treturn v, err == nil\n\t}\n\tv, err := strconv.ParseUint(s, 10, 64)\n\treturn v, err == nil\n}\n\n// MustParseUint64 parses s as an integer and panics if the string is invalid.\nfunc MustParseUint64(s string) uint64 {\n\tv, ok := ParseUint64(s)\n\tif !ok {\n\t\tpanic(\"invalid unsigned 64 bit integer: \" + s)\n\t}\n\treturn v\n}\n\n// NOTE: The following methods need to be optimised using either bit checking or asm\n\n// SafeSub returns subtraction result and whether overflow occurred.\nfunc SafeSub(x, y uint64) (uint64, bool) {\n\treturn x - y, x < y\n}\n\n// SafeAdd returns the result and whether overflow occurred.\nfunc SafeAdd(x, y uint64) (uint64, bool) {\n\treturn x + y, y > MaxUint64-x\n}\n\n// SafeMul returns multiplication result and whether overflow occurred.\nfunc SafeMul(x, y uint64) (uint64, bool) {\n\tif x == 0 || y == 0 {\n\t\treturn 0, false\n\t}\n\treturn x * y, y > MaxUint64/x\n}\n"
  },
  {
    "path": "common/math/integer_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage math\n\nimport (\n\t\"testing\"\n)\n\ntype operation byte\n\nconst (\n\tsub operation = iota\n\tadd\n\tmul\n)\n\nfunc TestOverflow(t *testing.T) {\n\tfor i, test := range []struct {\n\t\tx        uint64\n\t\ty        uint64\n\t\toverflow bool\n\t\top       operation\n\t}{\n\t\t// add operations\n\t\t{MaxUint64, 1, true, add},\n\t\t{MaxUint64 - 1, 1, false, add},\n\n\t\t// sub operations\n\t\t{0, 1, true, sub},\n\t\t{0, 0, false, sub},\n\n\t\t// mul operations\n\t\t{0, 0, false, mul},\n\t\t{10, 10, false, mul},\n\t\t{MaxUint64, 2, true, mul},\n\t\t{MaxUint64, 1, false, mul},\n\t} {\n\t\tvar overflows bool\n\t\tswitch test.op {\n\t\tcase sub:\n\t\t\t_, overflows = SafeSub(test.x, test.y)\n\t\tcase add:\n\t\t\t_, overflows = SafeAdd(test.x, test.y)\n\t\tcase mul:\n\t\t\t_, overflows = SafeMul(test.x, test.y)\n\t\t}\n\n\t\tif test.overflow != overflows {\n\t\t\tt.Errorf(\"%d failed. Expected test to be %v, got %v\", i, test.overflow, overflows)\n\t\t}\n\t}\n}\n\nfunc TestHexOrDecimal64(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\tnum   uint64\n\t\tok    bool\n\t}{\n\t\t{\"\", 0, true},\n\t\t{\"0\", 0, true},\n\t\t{\"0x0\", 0, true},\n\t\t{\"12345678\", 12345678, true},\n\t\t{\"0x12345678\", 0x12345678, true},\n\t\t{\"0X12345678\", 0x12345678, true},\n\t\t// Tests for leading zero behaviour:\n\t\t{\"0123456789\", 123456789, true}, // note: not octal\n\t\t{\"0x00\", 0, true},\n\t\t{\"0x012345678abc\", 0x12345678abc, true},\n\t\t// Invalid syntax:\n\t\t{\"abcdef\", 0, false},\n\t\t{\"0xgg\", 0, false},\n\t\t// Doesn't fit into 64 bits:\n\t\t{\"18446744073709551617\", 0, false},\n\t}\n\tfor _, test := range tests {\n\t\tvar num HexOrDecimal64\n\t\terr := num.UnmarshalText([]byte(test.input))\n\t\tif (err == nil) != test.ok {\n\t\t\tt.Errorf(\"ParseUint64(%q) -> (err == nil) = %t, want %t\", test.input, err == nil, test.ok)\n\t\t\tcontinue\n\t\t}\n\t\tif err == nil && uint64(num) != test.num {\n\t\t\tt.Errorf(\"ParseUint64(%q) -> %d, want %d\", test.input, num, test.num)\n\t\t}\n\t}\n}\n\nfunc TestMustParseUint64(t *testing.T) {\n\tif v := MustParseUint64(\"12345\"); v != 12345 {\n\t\tt.Errorf(`MustParseUint64(\"12345\") = %d, want 12345`, v)\n\t}\n}\n\nfunc TestMustParseUint64Panic(t *testing.T) {\n\tdefer func() {\n\t\tif recover() == nil {\n\t\t\tt.Error(\"MustParseBig should've panicked\")\n\t\t}\n\t}()\n\tMustParseUint64(\"ggg\")\n}\n"
  },
  {
    "path": "common/mclock/mclock.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package mclock is a wrapper for a monotonic clock source\npackage mclock\n\nimport (\n\t\"time\"\n\n\t\"github.com/aristanetworks/goarista/monotime\"\n)\n\n// AbsTime represents absolute monotonic time.\ntype AbsTime time.Duration\n\n// Now returns the current absolute monotonic time.\nfunc Now() AbsTime {\n\treturn AbsTime(monotime.Now())\n}\n"
  },
  {
    "path": "common/path.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n)\n\n// MakeName creates a node name that follows the ethereum convention\n// for such names. It adds the operation system name and Go runtime version\n// the name.\nfunc MakeName(name, version string) string {\n\treturn fmt.Sprintf(\"%s/v%s/%s/%s\", name, version, runtime.GOOS, runtime.Version())\n}\n\n// FileExist checks if a file exists at filePath.\nfunc FileExist(filePath string) bool {\n\t_, err := os.Stat(filePath)\n\tif err != nil && os.IsNotExist(err) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// AbsolutePath returns datadir + filename, or filename if it is absolute.\nfunc AbsolutePath(datadir string, filename string) string {\n\tif filepath.IsAbs(filename) {\n\t\treturn filename\n\t}\n\treturn filepath.Join(datadir, filename)\n}\n"
  },
  {
    "path": "common/size.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"fmt\"\n)\n\n// StorageSize is a wrapper around a float value that supports user friendly\n// formatting.\ntype StorageSize float64\n\n// String implements the stringer interface.\nfunc (s StorageSize) String() string {\n\tif s > 1000000 {\n\t\treturn fmt.Sprintf(\"%.2f mB\", s/1000000)\n\t} else if s > 1000 {\n\t\treturn fmt.Sprintf(\"%.2f kB\", s/1000)\n\t} else {\n\t\treturn fmt.Sprintf(\"%.2f B\", s)\n\t}\n}\n\n// TerminalString implements log.TerminalStringer, formatting a string for console\n// output during logging.\nfunc (s StorageSize) TerminalString() string {\n\tif s > 1000000 {\n\t\treturn fmt.Sprintf(\"%.2fmB\", s/1000000)\n\t} else if s > 1000 {\n\t\treturn fmt.Sprintf(\"%.2fkB\", s/1000)\n\t} else {\n\t\treturn fmt.Sprintf(\"%.2fB\", s)\n\t}\n}\n"
  },
  {
    "path": "common/size_test.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"testing\"\n)\n\nfunc TestStorageSizeString(t *testing.T) {\n\ttests := []struct {\n\t\tsize StorageSize\n\t\tstr  string\n\t}{\n\t\t{2381273, \"2.38 mB\"},\n\t\t{2192, \"2.19 kB\"},\n\t\t{12, \"12.00 B\"},\n\t}\n\n\tfor _, test := range tests {\n\t\tif test.size.String() != test.str {\n\t\t\tt.Errorf(\"%f: got %q, want %q\", float64(test.size), test.size.String(), test.str)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "common/test_utils.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n)\n\n// LoadJSON reads the given file and unmarshals its content.\nfunc LoadJSON(file string, val interface{}) error {\n\tcontent, err := ioutil.ReadFile(file)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := json.Unmarshal(content, val); err != nil {\n\t\tif syntaxerr, ok := err.(*json.SyntaxError); ok {\n\t\t\tline := findLine(content, syntaxerr.Offset)\n\t\t\treturn fmt.Errorf(\"JSON syntax error at %v:%v: %v\", file, line, err)\n\t\t}\n\t\treturn fmt.Errorf(\"JSON unmarshal error in %v: %v\", file, err)\n\t}\n\treturn nil\n}\n\n// findLine returns the line number for the given offset into data.\nfunc findLine(data []byte, offset int64) (line int) {\n\tline = 1\n\tfor i, r := range string(data) {\n\t\tif int64(i) >= offset {\n\t\t\treturn\n\t\t}\n\t\tif r == '\\n' {\n\t\t\tline++\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "common/types.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage common\n\nimport (\n\t\"bytes\"\n\t\"database/sql/driver\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"reflect\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n)\n\n// Lengths of hashes and addresses in bytes.\nconst (\n\t// HashLength is the expected length of the hash\n\tHashLength = 32\n\t// AddressLength is the expected length of the adddress\n\tAddressLength = 96\n)\n\nvar (\n\thashT = reflect.TypeOf(Hash{})\n\t//addressT = reflect.TypeOf(Address{})\n)\n\nfunc IsString(input []byte) bool {\n\treturn len(input) >= 2 && input[0] == '\"' && input[len(input)-1] == '\"'\n}\n\n// Hash represents the 32 byte Keccak256 hash of arbitrary data.\ntype Hash [HashLength]byte\n\n// BytesToHash sets b to hash.\n// If b is larger than len(h), b will be cropped from the left.\nfunc BytesToHash(b []byte) Hash {\n\tvar h Hash\n\th.SetBytes(b)\n\treturn h\n}\n\n// BigToHash sets byte representation of b to hash.\n// If b is larger than len(h), b will be cropped from the left.\nfunc BigToHash(b *big.Int) Hash { return BytesToHash(b.Bytes()) }\n\n// HexToHash sets byte representation of s to hash.\n// If b is larger than len(h), b will be cropped from the left.\nfunc HexToHash(s string) Hash { return BytesToHash(FromHex(s)) }\n\n// Bytes gets the byte representation of the underlying hash.\nfunc (h Hash) Bytes() []byte { return h[:] }\n\n// Big converts a hash to a big integer.\nfunc (h Hash) Big() *big.Int { return new(big.Int).SetBytes(h[:]) }\n\n// Hex converts a hash to a hex string.\nfunc (h Hash) Hex() string { return hexutil.Encode(h[:]) }\n\n// TerminalString implements log.TerminalStringer, formatting a string for console\n// output during logging.\nfunc (h Hash) TerminalString() string {\n\treturn fmt.Sprintf(\"%x…%x\", h[:3], h[29:])\n}\n\n// String implements the stringer interface and is used also by the logger when\n// doing full logging into a file.\nfunc (h Hash) String() string {\n\treturn h.Hex()\n}\n\n// Format implements fmt.Formatter, forcing the byte slice to be formatted as is,\n// without going through the stringer interface used for logging.\nfunc (h Hash) Format(s fmt.State, c rune) {\n\tfmt.Fprintf(s, \"%\"+string(c), h[:])\n}\n\n// UnmarshalText parses a hash in hex syntax.\nfunc (h *Hash) UnmarshalText(input []byte) error {\n\treturn hexutil.UnmarshalFixedText(\"Hash\", input, h[:])\n}\n\n// UnmarshalJSON parses a hash in hex syntax.\nfunc (h *Hash) UnmarshalJSON(input []byte) error {\n\treturn hexutil.UnmarshalFixedJSON(hashT, input, h[:])\n}\n\n// MarshalText returns the hex representation of h.\nfunc (h Hash) MarshalText() ([]byte, error) {\n\treturn hexutil.Bytes(h[:]).MarshalText()\n}\n\n// SetBytes sets the hash to the value of b.\n// If b is larger than len(h), b will be cropped from the left.\nfunc (h *Hash) SetBytes(b []byte) {\n\tif len(b) > len(h) {\n\t\tb = b[len(b)-HashLength:]\n\t}\n\n\tcopy(h[HashLength-len(b):], b)\n}\n\n// Generate implements testing/quick.Generator.\nfunc (h Hash) Generate(rand *rand.Rand, size int) reflect.Value {\n\tm := rand.Intn(len(h))\n\tfor i := len(h) - 1; i > m; i-- {\n\t\th[i] = byte(rand.Uint32())\n\t}\n\treturn reflect.ValueOf(h)\n}\n\n// Scan implements Scanner for database/sql.\nfunc (h *Hash) Scan(src interface{}) error {\n\tsrcB, ok := src.([]byte)\n\tif !ok {\n\t\treturn fmt.Errorf(\"can't scan %T into Hash\", src)\n\t}\n\tif len(srcB) != HashLength {\n\t\treturn fmt.Errorf(\"can't scan []byte of len %d into Hash, want %d\", len(srcB), HashLength)\n\t}\n\tcopy(h[:], srcB)\n\treturn nil\n}\n\n// Value implements valuer for database/sql.\nfunc (h Hash) Value() (driver.Value, error) {\n\treturn h[:], nil\n}\n\nfunc (h Hash) HashToUint256() *c_type.Uint256 {\n\tu256 := c_type.Uint256{}\n\tcopy(u256[:], h[:])\n\treturn &u256\n}\n\nfunc HashToHex(hashs []Hash) []string {\n\thexs := []string{}\n\tfor _, hash := range hashs {\n\t\thexs = append(hexs, hash.Hex())\n\t}\n\treturn hexs\n}\n\n// UnprefixedHash allows marshaling a Hash without 0x prefix.\ntype UnprefixedHash Hash\n\n// UnmarshalText decodes the hash from hex. The 0x prefix is optional.\nfunc (h *UnprefixedHash) UnmarshalText(input []byte) error {\n\treturn hexutil.UnmarshalFixedUnprefixedText(\"UnprefixedHash\", input, h[:])\n}\n\n// MarshalText encodes the hash as hex.\nfunc (h UnprefixedHash) MarshalText() ([]byte, error) {\n\treturn []byte(hex.EncodeToString(h[:])), nil\n}\n\n/////////// Data\n\nfunc keccak512(data ...[]byte) []byte {\n\td := sha3.NewKeccak512()\n\tfor _, b := range data {\n\t\td.Write(b)\n\t}\n\treturn d.Sum(nil)\n}\n\n// Data represents the 64 byte Data of an Ethereum account.\ntype Address [AddressLength]byte\n\ntype ContractAddress [20]byte\n\nfunc (a Address) ToCaddr() ContractAddress {\n\tvar addr ContractAddress\n\tpkr := new(c_type.PKr)\n\tcopy(pkr[:], a[:])\n\thash := c_superzk.HashPKr(pkr)\n\taddr.SetBytes(hash[:])\n\treturn addr\n}\n\n// Hash converts an Data to a hash by left-padding it with zeros.\nfunc (a ContractAddress) Big() *big.Int { return new(big.Int).SetBytes(a[:]) }\n\nfunc (a *ContractAddress) SetBytes(b []byte) {\n\tif len(b) > len(a) {\n\t\tb = b[len(b)-20:]\n\t}\n\tcopy(a[20-len(b):], b)\n}\n\nfunc (a ContractAddress) MarshalText() ([]byte, error) {\n\treturn hexutil.Bytes(a[:]).MarshalText()\n}\n\n// UnmarshalText parses a hash in hex syntax.\nfunc (a *ContractAddress) UnmarshalText(input []byte) error {\n\treturn hexutil.UnmarshalFixedText(\"ContractAddress\", input, a[:])\n}\n\n// BytesToAddress returns Data with value b.\n// If b is larger than len(h), b will be cropped from the left.\nfunc BytesToAddress(b []byte) Address {\n\tvar a Address\n\ta.SetBytes(b)\n\treturn a\n}\n\nfunc BytesToContractAddress(b []byte) ContractAddress {\n\tvar a ContractAddress\n\ta.SetBytes(b)\n\treturn a\n}\n\n// BigToAddress returns Data with byte values of b.\n// If b is larger than len(h), b will be cropped from the left.\nfunc BigToAddress(b *big.Int) Address { return BytesToAddress(b.Bytes()) }\n\nfunc BigToContractAddress(b *big.Int) ContractAddress { return BytesToContractAddress(b.Bytes()) }\n\n// HexToAddress returns Data with byte values of s.\n// If s is larger than len(h), s will be cropped from the left.\n//func HexToAddress(s string) Data { return BytesToAddress(FromHex(s)) }\n\nfunc Base58ToAddress(s string) Address {\n\tout := base58.Decode(s)\n\treturn BytesToAddress(out[:])\n}\n\n// Bytes gets the string representation of the underlying Data.\nfunc (a Address) Bytes() []byte { return a[:] }\n\nfunc (a Address) ToPKr() *c_type.PKr {\n\tpubKey := c_type.PKr{}\n\tcopy(pubKey[:], a[:])\n\treturn &pubKey\n}\n\nfunc (a Address) ToUint512() *c_type.Uint512 {\n\tpubKey := c_type.Uint512{}\n\tcopy(pubKey[:], a[:])\n\treturn &pubKey\n}\n\n// Big converts an Data to a big integer.\nfunc (a Address) Big() *big.Int { return new(big.Int).SetBytes(a[:]) }\n\n// Base58 returns base58 string representation of the Data.\nfunc (a Address) Base58() string {\n\treturn base58.Encode(a[:])\n}\n\n// String implements fmt.Stringer.\nfunc (a Address) String() string {\n\tif a.IsAccountAddress() {\n\t\treturn base58.Encode(a[:64])\n\t} else {\n\t\treturn a.Base58()\n\t}\n}\n\nfunc (a Address) IsAccountAddress() bool {\n\tzerobytes := [32]byte{}\n\tvar suffix [32]byte\n\tcopy(suffix[:], a[64:])\n\tif suffix == zerobytes {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Format implements fmt.Formatter, forcing the byte slice to be formatted as is,\n// without going through the stringer interface used for logging.\nfunc (a Address) Format(s fmt.State, c rune) {\n\tfmt.Fprintf(s, \"%\"+string(c), a[:])\n}\n\n// SetBytes sets the Data to the value of b.\n// If b is larger than len(a) it will panic.\nfunc (a *Address) SetBytes(b []byte) {\n\tcopy(a[:], b)\n\t//if len(b) > len(a) {\n\t//\tb = b[len(b)-AddressLength:]\n\t//}\n\t//copy(a[AddressLength-len(b):], b)\n}\n\n// MarshalText returns the hex representation of a.\nfunc (a Address) MarshalText() ([]byte, error) {\n\treturn hexutil.Bytes(a[:]).MarshalBase58Text()\n}\n\n// UnmarshalText parses a hash in hex syntax.\nfunc (a *Address) UnmarshalText(input []byte) error {\n\tif address.IsBase58Str(string(input)) {\n\t\tout := base58.Decode(string(input))\n\t\tif len(out) != 64 && len(out) != 96 {\n\t\t\treturn errors.New(\"address length must be 64 or 96 bytes\")\n\t\t}\n\t\tif len(out) == 96 {\n\t\t\tempty := Hash{}\n\t\t\tif bytes.Compare(out[64:], empty[:]) != 0 {\n\t\t\t\terr := address.ValidPkr(out)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcopy(a[:], out)\n\n\t} else {\n\t\treturn errors.New(\"not base58 string\")\n\t}\n\treturn nil\n}\n\n// UnmarshalJSON parses a hash in hex syntax.\nfunc (a *Address) UnmarshalJSON(input []byte) error {\n\tif !IsString(input) {\n\t\treturn errors.New(\"not string\")\n\t} else {\n\t\treturn a.UnmarshalText(input[1 : len(input)-1])\n\n\t}\n}\n\n// Scan implements Scanner for database/sql.\nfunc (a *Address) Scan(src interface{}) error {\n\tsrcB, ok := src.([]byte)\n\tif !ok {\n\t\treturn fmt.Errorf(\"can't scan %T into Data\", src)\n\t}\n\tif len(srcB) != AddressLength {\n\t\treturn fmt.Errorf(\"can't scan []byte of len %d into Data, want %d\", len(srcB), AddressLength)\n\t}\n\tcopy(a[:], srcB)\n\treturn nil\n}\n\n//func (a *Data) IsContract() bool {\n//\treturn strings.HasSuffix(string(a[:]),\"contract\")\n//}\n\n// Value implements valuer for database/sql.\nfunc (a Address) Value() (driver.Value, error) {\n\treturn a[:], nil\n}\n\ntype AddressList []Address\n\nfunc (self AddressList) Len() int {\n\treturn len(self)\n}\nfunc (self AddressList) Less(i, j int) bool {\n\treturn bytes.Compare(self[i][:], self[j][:]) < 0\n}\nfunc (self AddressList) Swap(i, j int) {\n\tself[i], self[j] = self[j], self[i]\n}\n\n// UnprefixedAddress allows marshaling an Data without 0x prefix.\ntype UnprefixedAddress Address\n\nfunc (a *UnprefixedAddress) UnmarshalText(input []byte) error {\n\tif address.IsBase58Str(string(input)) {\n\t\tout := base58.Decode(string(input))\n\t\tcopy(a[:], out[:])\n\t\treturn nil\n\t} else {\n\t\treturn errors.New(\"invalid Address\")\n\t}\n}\n\n// MarshalText encodes the Data as hex.\nfunc (a UnprefixedAddress) MarshalText() ([]byte, error) {\n\treturn []byte(base58.Encode(a[:])), nil\n}\n\nfunc ByteSliceEqual(a, b []byte) bool {\n\tif len(a) != len(b) {\n\t\treturn false\n\t}\n\n\tif (a == nil) != (b == nil) {\n\t\treturn false\n\t}\n\n\tb = b[:len(a)]\n\tfor i, v := range a {\n\t\tif v != b[i] {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n"
  },
  {
    "path": "consensus/consensus.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package consensus implements different Ethereum consensus engines.\npackage consensus\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// ChainReader defines a small collection of methods needed to access the local\n// blockchain during header verification.\ntype ChainReader interface {\n\t// Config retrieves the blockchain's chain configuration.\n\tConfig() *params.ChainConfig\n\n\t// CurrentHeader retrieves the current header from the local chain.\n\tCurrentHeader() *types.Header\n\n\t// GetHeader retrieves a block header from the database by hash and number.\n\tGetHeader(hash common.Hash, number uint64) *types.Header\n\n\t// GetHeaderByNumber retrieves a block header from the database by number.\n\tGetHeaderByNumber(number uint64) *types.Header\n\n\t// GetHeaderByHash retrieves a block header from the database by its hash.\n\tGetHeaderByHash(hash common.Hash) *types.Header\n\n\t// GetBlock retrieves a block from the database by hash and number.\n\tGetBlock(hash common.Hash, number uint64) *types.Block\n}\n\n// Engine is an algorithm agnostic consensus engine.\ntype Engine interface {\n\t// Author retrieves the Ethereum address of the account that minted the given\n\t// block, which may be different from the header's coinbase if a consensus\n\t// engine is based on signatures.\n\tAuthor(header *types.Header) (common.Address, error)\n\n\t// VerifyHeader checks whether a header conforms to the consensus rules of a\n\t// given engine. Verifying the seal may be done optionally here, or explicitly\n\t// via the VerifySeal method.\n\tVerifyHeader(chain ChainReader, header *types.Header, seal bool) error\n\n\t// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers\n\t// concurrently. The method returns a quit channel to abort the operations and\n\t// a results channel to retrieve the async verifications (the order is that of\n\t// the input slice).\n\tVerifyHeaders(chain ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error)\n\n\t// VerifySeal checks whether the crypto seal on a header is valid according to\n\t// the consensus rules of the given engine.\n\tVerifySeal(chain ChainReader, header *types.Header) error\n\n\t// Prepare initializes the consensus fields of a block header according to the\n\t// rules of a particular engine. The changes are executed inline.\n\tPrepare(chain ChainReader, header *types.Header) error\n\n\t// Finalize runs any post-transaction state modifications (e.g. block rewards)\n\t// and assembles the final block.\n\t// Note: The block header and state database might be updated to reflect any\n\t// consensus rules that happen at finalization (e.g. block rewards).\n\tFinalize(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, receipts []*types.Receipt, gasReward uint64) (*types.Block, error)\n\n\t// Seal generates a new block for the given input block with the local miner's\n\t// seal place on top.\n\tSeal(chain ChainReader, block *types.Block, stop <-chan struct{}) (*types.Block, error)\n\n\t// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty\n\t// that a new block should have.\n\tCalcDifficulty(chain ChainReader, time uint64, parent *types.Header) *big.Int\n\n\t// APIs returns the RPC APIs this consensus engine provides.\n\tAPIs(chain ChainReader) []rpc.API\n}\n\n// PoW is a consensus engine based on proof-of-work.\ntype PoW interface {\n\tEngine\n\n\tStartHashrate()\n\n\tStopHashrate()\n\n\t// Hashrate returns the current mining hashrate of a PoW consensus engine.\n\tHashrate() float64\n}\n"
  },
  {
    "path": "consensus/errors.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage consensus\n\nimport \"errors\"\n\nvar (\n\t// ErrUnknownAncestor is returned when validating a block requires an ancestor\n\t// that is unknown.\n\tErrUnknownAncestor = errors.New(\"unknown ancestor\")\n\n\t// ErrPrunedAncestor is returned when validating a block requires an ancestor\n\t// that is known, but the state of which is not available.\n\tErrPrunedAncestor = errors.New(\"pruned ancestor\")\n\n\t// ErrFutureBlock is returned when a block's timestamp is in the future according\n\t// to the current node.\n\tErrFutureBlock = errors.New(\"block in the future\")\n\n\t// ErrInvalidNumber is returned if a block's number doesn't equal it's parent's\n\t// plus one.\n\tErrInvalidNumber = errors.New(\"invalid block number\")\n)\n"
  },
  {
    "path": "consensus/ethash/algorithm.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethash\n\nimport (\n\t\"encoding/binary\"\n\t\"hash\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\t\"unsafe\"\n\n\t\"github.com/sero-cash/go-sero/consensus/ethash_hash\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/bitutil\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tdatasetInitBytes   = 1 << 30 // Bytes in dataset at genesis\n\tdatasetGrowthBytes = 1 << 23 // Dataset growth per epoch\n\tcacheInitBytes     = 1 << 24 // Bytes in cache at genesis\n\tcacheGrowthBytes   = 1 << 17 // Cache growth per epoch\n\tepochLength        = 30000   // Blocks per epoch\n\tmixBytes           = 128     // Width of mix\n\thashBytes          = 64      // Hash length in bytes\n\thashWords          = 16      // Number of 32 bit ints in a hash\n\tdatasetParents     = 256     // Number of parents of each dataset element\n\tcacheRounds        = 3       // Number of rounds in cache production\n\tloopAccesses       = 64      // Number of accesses in hashimoto loop\n)\n\n// cacheSize returns the size of the ethash verification cache that belongs to a certain\n// block number.\nfunc cacheSize(block uint64) uint64 {\n\tepoch := int(block / epochLength)\n\tif epoch < maxEpoch {\n\t\treturn cacheSizes[epoch]\n\t}\n\treturn calcCacheSize(epoch)\n}\n\n// calcCacheSize calculates the cache size for epoch. The cache size grows linearly,\n// however, we always take the highest prime below the linearly growing threshold in order\n// to reduce the risk of accidental regularities leading to cyclic behavior.\nfunc calcCacheSize(epoch int) uint64 {\n\tsize := cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes\n\tfor !new(big.Int).SetUint64(size / hashBytes).ProbablyPrime(1) { // Always accurate for n < 2^64\n\t\tsize -= 2 * hashBytes\n\t}\n\treturn size\n}\n\n// datasetSize returns the size of the ethash mining dataset that belongs to a certain\n// block number.\nfunc datasetSize(block uint64) uint64 {\n\tepoch := int(block / epochLength)\n\tif epoch < maxEpoch {\n\t\treturn datasetSizes[epoch]\n\t}\n\treturn calcDatasetSize(epoch)\n}\n\n// calcDatasetSize calculates the dataset size for epoch. The dataset size grows linearly,\n// however, we always take the highest prime below the linearly growing threshold in order\n// to reduce the risk of accidental regularities leading to cyclic behavior.\nfunc calcDatasetSize(epoch int) uint64 {\n\tsize := datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes\n\tfor !new(big.Int).SetUint64(size / mixBytes).ProbablyPrime(1) { // Always accurate for n < 2^64\n\t\tsize -= 2 * mixBytes\n\t}\n\treturn size\n}\n\n// hasher is a repetitive hasher allowing the same hash data structures to be\n// reused between hash runs instead of requiring new ones to be created.\ntype hasher func(dest []byte, data []byte)\n\n// makeHasher creates a repetitive hasher, allowing the same hash data structures to\n// be reused between hash runs instead of requiring new ones to be created. The returned\n// function is not thread safe!\nfunc makeHasher(h hash.Hash) hasher {\n\t// sha3.state supports Read to get the sum, use it to avoid the overhead of Sum.\n\t// Read alters the state but we reset the hash before every operation.\n\ttype readerHash interface {\n\t\thash.Hash\n\t\tRead([]byte) (int, error)\n\t}\n\trh, ok := h.(readerHash)\n\tif !ok {\n\t\tpanic(\"can't find Read method on hash\")\n\t}\n\toutputLen := rh.Size()\n\treturn func(dest []byte, data []byte) {\n\t\trh.Reset()\n\t\trh.Write(data)\n\t\trh.Read(dest[:outputLen])\n\t}\n}\n\n// seedHash is the seed to use for generating a verification cache and the mining\n// dataset.\nfunc seedHash(block uint64) []byte {\n\tseed := make([]byte, 32)\n\tif block < epochLength {\n\t\treturn seed\n\t}\n\tkeccak256 := makeHasher(sha3.NewKeccak256())\n\tfor i := 0; i < int(block/epochLength); i++ {\n\t\tkeccak256(seed, seed)\n\t}\n\treturn seed\n}\n\n// generateCache creates a verification cache of a given size for an input seed.\n// The cache production process involves first sequentially filling up 32 MB of\n// memory, then performing two passes of Sergio Demian Lerner's RandMemoHash\n// algorithm from Strict Memory Hard Hashing Functions (2014). The output is a\n// set of 524288 64-byte values.\n// This method places the result into dest in machine byte order.\nfunc generateCache(dest []uint32, epoch uint64, seed []byte) {\n\t// Print some debug logs to allow analysis on low end devices\n\tlogger := log.New(\"epoch\", epoch)\n\n\tstart := time.Now()\n\tdefer func() {\n\t\telapsed := time.Since(start)\n\n\t\tlogFn := logger.Debug\n\t\tif elapsed > 3*time.Second {\n\t\t\tlogFn = logger.Info\n\t\t}\n\t\tlogFn(\"Generated ethash verification cache\", \"elapsed\", common.PrettyDuration(elapsed))\n\t}()\n\t// Convert our destination slice to a byte buffer\n\theader := *(*reflect.SliceHeader)(unsafe.Pointer(&dest))\n\theader.Len *= 4\n\theader.Cap *= 4\n\tcache := *(*[]byte)(unsafe.Pointer(&header))\n\n\t// Calculate the number of theoretical rows (we'll store in one buffer nonetheless)\n\tsize := uint64(len(cache))\n\trows := int(size) / hashBytes\n\n\t// Start a monitoring goroutine to report progress on low end devices\n\tvar progress uint32\n\n\tdone := make(chan struct{})\n\tdefer close(done)\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-done:\n\t\t\t\treturn\n\t\t\tcase <-time.After(3 * time.Second):\n\t\t\t\tlogger.Info(\"Generating ethash verification cache\", \"percentage\", atomic.LoadUint32(&progress)*100/uint32(rows)/4, \"elapsed\", common.PrettyDuration(time.Since(start)))\n\t\t\t}\n\t\t}\n\t}()\n\t// Create a hasher to reuse between invocations\n\tkeccak512 := makeHasher(sha3.NewKeccak512())\n\n\t// Sequentially produce the initial dataset\n\tkeccak512(cache, seed)\n\tfor offset := uint64(hashBytes); offset < size; offset += hashBytes {\n\t\tkeccak512(cache[offset:], cache[offset-hashBytes:offset])\n\t\tatomic.AddUint32(&progress, 1)\n\t}\n\t// Use a low-round version of randmemohash\n\ttemp := make([]byte, hashBytes)\n\n\tfor i := 0; i < cacheRounds; i++ {\n\t\tfor j := 0; j < rows; j++ {\n\t\t\tvar (\n\t\t\t\tsrcOff = ((j - 1 + rows) % rows) * hashBytes\n\t\t\t\tdstOff = j * hashBytes\n\t\t\t\txorOff = (binary.LittleEndian.Uint32(cache[dstOff:]) % uint32(rows)) * hashBytes\n\t\t\t)\n\t\t\tbitutil.XORBytes(temp, cache[srcOff:srcOff+hashBytes], cache[xorOff:xorOff+hashBytes])\n\t\t\tkeccak512(cache[dstOff:], temp)\n\n\t\t\tatomic.AddUint32(&progress, 1)\n\t\t}\n\t}\n\t// Swap the byte order on big endian systems and return\n\tif !isLittleEndian() {\n\t\tswap(cache)\n\t}\n}\n\n// swap changes the byte order of the buffer assuming a uint32 representation.\nfunc swap(buffer []byte) {\n\tfor i := 0; i < len(buffer); i += 4 {\n\t\tbinary.BigEndian.PutUint32(buffer[i:], binary.LittleEndian.Uint32(buffer[i:]))\n\t}\n}\n\n// fnv is an algorithm inspired by the FNV hash, which in some cases is used as\n// a non-associative substitute for XOR. Note that we multiply the prime with\n// the full 32-bit input, in contrast with the FNV-1 spec which multiplies the\n// prime with one byte (octet) in turn.\nfunc fnv(a, b uint32) uint32 {\n\treturn a*0x01000193 ^ b\n}\n\n// fnvHash mixes in data into mix using the ethash fnv method.\nfunc fnvHash(mix []uint32, data []uint32) {\n\tfor i := 0; i < len(mix); i++ {\n\t\tmix[i] = mix[i]*0x01000193 ^ data[i]\n\t}\n}\n\n// generateDatasetItem combines data from 256 pseudorandomly selected cache nodes,\n// and hashes that to compute a single dataset node.\nfunc generateDatasetItem(cache []uint32, index uint32, keccak512 hasher) []byte {\n\t// Calculate the number of theoretical rows (we use one buffer nonetheless)\n\trows := uint32(len(cache) / hashWords)\n\n\t// Initialize the mix\n\tmix := make([]byte, hashBytes)\n\n\tbinary.LittleEndian.PutUint32(mix, cache[(index%rows)*hashWords]^index)\n\tfor i := 1; i < hashWords; i++ {\n\t\tbinary.LittleEndian.PutUint32(mix[i*4:], cache[(index%rows)*hashWords+uint32(i)])\n\t}\n\tkeccak512(mix, mix)\n\n\t// Convert the mix to uint32s to avoid constant bit shifting\n\tintMix := make([]uint32, hashWords)\n\tfor i := 0; i < len(intMix); i++ {\n\t\tintMix[i] = binary.LittleEndian.Uint32(mix[i*4:])\n\t}\n\t// fnv it with a lot of random cache nodes based on index\n\tfor i := uint32(0); i < datasetParents; i++ {\n\t\tparent := fnv(index^i, intMix[i%16]) % rows\n\t\tfnvHash(intMix, cache[parent*hashWords:])\n\t}\n\t// Flatten the uint32 mix into a binary one and return\n\tfor i, val := range intMix {\n\t\tbinary.LittleEndian.PutUint32(mix[i*4:], val)\n\t}\n\tkeccak512(mix, mix)\n\treturn mix\n}\n\n// generateDataset generates the entire ethash dataset for mining.\n// This method places the result into dest in machine byte order.\nfunc generateDataset(dest []uint32, epoch uint64, cache []uint32) {\n\t// Print some debug logs to allow analysis on low end devices\n\tlogger := log.New(\"epoch\", epoch)\n\n\tstart := time.Now()\n\tdefer func() {\n\t\telapsed := time.Since(start)\n\n\t\tlogFn := logger.Debug\n\t\tif elapsed > 3*time.Second {\n\t\t\tlogFn = logger.Info\n\t\t}\n\t\tlogFn(\"Generated ethash verification cache\", \"elapsed\", common.PrettyDuration(elapsed))\n\t}()\n\n\t// Figure out whether the bytes need to be swapped for the machine\n\tswapped := !isLittleEndian()\n\n\t// Convert our destination slice to a byte buffer\n\theader := *(*reflect.SliceHeader)(unsafe.Pointer(&dest))\n\theader.Len *= 4\n\theader.Cap *= 4\n\tdataset := *(*[]byte)(unsafe.Pointer(&header))\n\n\t// Generate the dataset on many goroutines since it takes a while\n\tthreads := runtime.NumCPU()\n\tsize := uint64(len(dataset))\n\n\tvar pend sync.WaitGroup\n\tpend.Add(threads)\n\n\tvar progress uint32\n\tfor i := 0; i < threads; i++ {\n\t\tgo func(id int) {\n\t\t\tdefer pend.Done()\n\n\t\t\t// Create a hasher to reuse between invocations\n\t\t\t//keccak512 := makeHasher(sha3.NewKeccak512())\n\t\t\tkeccak512 := makeHasher(sha3.NewKeccak512())\n\n\t\t\t// Calculate the data segment this thread should generate\n\t\t\tbatch := uint32((size + hashBytes*uint64(threads) - 1) / (hashBytes * uint64(threads)))\n\t\t\tfirst := uint32(id) * batch\n\t\t\tlimit := first + batch\n\t\t\tif limit > uint32(size/hashBytes) {\n\t\t\t\tlimit = uint32(size / hashBytes)\n\t\t\t}\n\t\t\t// Calculate the dataset segment\n\t\t\tpercent := uint32(size / hashBytes / 100)\n\t\t\tfor index := first; index < limit; index++ {\n\t\t\t\titem := generateDatasetItem(cache, index, keccak512)\n\t\t\t\tif swapped {\n\t\t\t\t\tswap(item)\n\t\t\t\t}\n\t\t\t\tcopy(dataset[index*hashBytes:], item)\n\n\t\t\t\tif status := atomic.AddUint32(&progress, 1); status%percent == 0 {\n\t\t\t\t\tlogger.Info(\"Generating DAG in progress\", \"percentage\", uint64(status*100)/(size/hashBytes), \"elapsed\", common.PrettyDuration(time.Since(start)))\n\t\t\t\t}\n\t\t\t}\n\t\t}(i)\n\t}\n\t// Wait for all the generators to finish and return\n\tpend.Wait()\n}\n\n// hashimoto aggregates data from the full dataset in order to produce our final\n// value for a particular header hash and nonce.\nfunc hashimoto(hash []byte, nonce uint64, size uint64, lookup func(index uint32) []uint32, num uint64) ([]byte, []byte) {\n\t// Calculate the number of theoretical rows (we use one buffer nonetheless)\n\trows := uint32(size / mixBytes)\n\n\t// Combine header+nonce into a 64 byte seed\n\tseed := make([]byte, 40)\n\tcopy(seed, hash)\n\tbinary.LittleEndian.PutUint64(seed[32:], nonce)\n\n\t//seed = crypto.Keccak512(seed)\n\tseed = ethash_hash.Miner_Hash_0(seed, num)\n\tseedHead := binary.LittleEndian.Uint32(seed)\n\n\t// Start the mix with replicated seed\n\tmix := make([]uint32, mixBytes/4)\n\tfor i := 0; i < len(mix); i++ {\n\t\tmix[i] = binary.LittleEndian.Uint32(seed[i%16*4:])\n\t}\n\t// Mix in random dataset nodes\n\ttemp := make([]uint32, len(mix))\n\n\tfor i := 0; i < loopAccesses; i++ {\n\t\tparent := fnv(uint32(i)^seedHead, mix[i%len(mix)]) % rows\n\t\tfor j := uint32(0); j < mixBytes/hashBytes; j++ {\n\t\t\tcopy(temp[j*hashWords:], lookup(2*parent+j))\n\t\t}\n\t\tfnvHash(mix, temp)\n\t}\n\t// Compress mix\n\tfor i := 0; i < len(mix); i += 4 {\n\t\tmix[i/4] = fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3])\n\t}\n\tmix = mix[:len(mix)/4]\n\n\tdigest := make([]byte, common.HashLength)\n\tfor i, val := range mix {\n\t\tbinary.LittleEndian.PutUint32(digest[i*4:], val)\n\t}\n\t//return digest, crypto.Keccak256(append(seed, digest...))\n\treturn digest, ethash_hash.Miner_Hash_1(append(seed, digest...), num)\n}\n\n// hashimotoLight aggregates data from the full dataset (using only a small\n// in-memory cache) in order to produce our final value for a particular header\n// hash and nonce.\nfunc hashimotoLight(size uint64, cache []uint32, hash []byte, nonce uint64, num uint64) ([]byte, []byte) {\n\tkeccak512 := makeHasher(sha3.NewKeccak512())\n\n\tlookup := func(index uint32) []uint32 {\n\t\trawData := generateDatasetItem(cache, index, keccak512)\n\n\t\tdata := make([]uint32, len(rawData)/4)\n\t\tfor i := 0; i < len(data); i++ {\n\t\t\tdata[i] = binary.LittleEndian.Uint32(rawData[i*4:])\n\t\t}\n\t\treturn data\n\t}\n\treturn hashimoto(hash, nonce, size, lookup, num)\n}\n\n// hashimotoFull aggregates data from the full dataset (using the full in-memory\n// dataset) in order to produce our final value for a particular header hash and\n// nonce.\nfunc hashimotoFull(dataset []uint32, hash []byte, nonce uint64, num uint64) ([]byte, []byte) {\n\tlookup := func(index uint32) []uint32 {\n\t\toffset := index * hashWords\n\t\treturn dataset[offset : offset+hashWords]\n\t}\n\treturn hashimoto(hash, nonce, uint64(len(dataset))*4, lookup, num)\n}\n\nconst maxEpoch = 2048\n\n// datasetSizes is a lookup table for the ethash dataset size for the first 2048\n// epochs (i.e. 61440000 blocks).\nvar datasetSizes = [maxEpoch]uint64{\n\t1073739904, 1082130304, 1090514816, 1098906752, 1107293056,\n\t1115684224, 1124070016, 1132461952, 1140849536, 1149232768,\n\t1157627776, 1166013824, 1174404736, 1182786944, 1191180416,\n\t1199568512, 1207958912, 1216345216, 1224732032, 1233124736,\n\t1241513344, 1249902464, 1258290304, 1266673792, 1275067264,\n\t1283453312, 1291844992, 1300234112, 1308619904, 1317010048,\n\t1325397376, 1333787776, 1342176128, 1350561664, 1358954368,\n\t1367339392, 1375731584, 1384118144, 1392507008, 1400897408,\n\t1409284736, 1417673344, 1426062464, 1434451072, 1442839168,\n\t1451229056, 1459615616, 1468006016, 1476394112, 1484782976,\n\t1493171584, 1501559168, 1509948032, 1518337664, 1526726528,\n\t1535114624, 1543503488, 1551892096, 1560278656, 1568669056,\n\t1577056384, 1585446272, 1593831296, 1602219392, 1610610304,\n\t1619000192, 1627386752, 1635773824, 1644164224, 1652555648,\n\t1660943488, 1669332608, 1677721216, 1686109312, 1694497664,\n\t1702886272, 1711274624, 1719661184, 1728047744, 1736434816,\n\t1744829056, 1753218944, 1761606272, 1769995904, 1778382464,\n\t1786772864, 1795157888, 1803550592, 1811937664, 1820327552,\n\t1828711552, 1837102976, 1845488768, 1853879936, 1862269312,\n\t1870656896, 1879048064, 1887431552, 1895825024, 1904212096,\n\t1912601216, 1920988544, 1929379456, 1937765504, 1946156672,\n\t1954543232, 1962932096, 1971321728, 1979707264, 1988093056,\n\t1996487552, 2004874624, 2013262208, 2021653888, 2030039936,\n\t2038430848, 2046819968, 2055208576, 2063596672, 2071981952,\n\t2080373632, 2088762752, 2097149056, 2105539712, 2113928576,\n\t2122315136, 2130700672, 2139092608, 2147483264, 2155872128,\n\t2164257664, 2172642176, 2181035392, 2189426048, 2197814912,\n\t2206203008, 2214587264, 2222979712, 2231367808, 2239758208,\n\t2248145024, 2256527744, 2264922752, 2273312128, 2281701248,\n\t2290086272, 2298476672, 2306867072, 2315251072, 2323639168,\n\t2332032128, 2340420224, 2348808064, 2357196416, 2365580416,\n\t2373966976, 2382363008, 2390748544, 2399139968, 2407530368,\n\t2415918976, 2424307328, 2432695424, 2441084288, 2449472384,\n\t2457861248, 2466247808, 2474637184, 2483026816, 2491414144,\n\t2499803776, 2508191872, 2516582272, 2524970368, 2533359232,\n\t2541743488, 2550134144, 2558525056, 2566913408, 2575301504,\n\t2583686528, 2592073856, 2600467328, 2608856192, 2617240448,\n\t2625631616, 2634022016, 2642407552, 2650796416, 2659188352,\n\t2667574912, 2675965312, 2684352896, 2692738688, 2701130624,\n\t2709518464, 2717907328, 2726293376, 2734685056, 2743073152,\n\t2751462016, 2759851648, 2768232832, 2776625536, 2785017728,\n\t2793401984, 2801794432, 2810182016, 2818571648, 2826959488,\n\t2835349376, 2843734144, 2852121472, 2860514432, 2868900992,\n\t2877286784, 2885676928, 2894069632, 2902451584, 2910843008,\n\t2919234688, 2927622784, 2936011648, 2944400768, 2952789376,\n\t2961177728, 2969565568, 2977951616, 2986338944, 2994731392,\n\t3003120256, 3011508352, 3019895936, 3028287104, 3036675968,\n\t3045063808, 3053452928, 3061837696, 3070228352, 3078615424,\n\t3087003776, 3095394944, 3103782272, 3112173184, 3120562048,\n\t3128944768, 3137339264, 3145725056, 3154109312, 3162505088,\n\t3170893184, 3179280256, 3187669376, 3196056704, 3204445568,\n\t3212836736, 3221224064, 3229612928, 3238002304, 3246391168,\n\t3254778496, 3263165824, 3271556224, 3279944576, 3288332416,\n\t3296719232, 3305110912, 3313500032, 3321887104, 3330273152,\n\t3338658944, 3347053184, 3355440512, 3363827072, 3372220288,\n\t3380608384, 3388997504, 3397384576, 3405774208, 3414163072,\n\t3422551936, 3430937984, 3439328384, 3447714176, 3456104576,\n\t3464493952, 3472883584, 3481268864, 3489655168, 3498048896,\n\t3506434432, 3514826368, 3523213952, 3531603584, 3539987072,\n\t3548380288, 3556763264, 3565157248, 3573545344, 3581934464,\n\t3590324096, 3598712704, 3607098752, 3615488384, 3623877248,\n\t3632265856, 3640646528, 3649043584, 3657430144, 3665821568,\n\t3674207872, 3682597504, 3690984832, 3699367808, 3707764352,\n\t3716152448, 3724541056, 3732925568, 3741318016, 3749706368,\n\t3758091136, 3766481536, 3774872704, 3783260032, 3791650432,\n\t3800036224, 3808427648, 3816815488, 3825204608, 3833592704,\n\t3841981568, 3850370432, 3858755968, 3867147904, 3875536256,\n\t3883920512, 3892313728, 3900702592, 3909087872, 3917478784,\n\t3925868416, 3934256512, 3942645376, 3951032192, 3959422336,\n\t3967809152, 3976200064, 3984588416, 3992974976, 4001363584,\n\t4009751168, 4018141312, 4026530432, 4034911616, 4043308928,\n\t4051695488, 4060084352, 4068472448, 4076862848, 4085249408,\n\t4093640576, 4102028416, 4110413696, 4118805632, 4127194496,\n\t4135583104, 4143971968, 4152360832, 4160746112, 4169135744,\n\t4177525888, 4185912704, 4194303616, 4202691968, 4211076736,\n\t4219463552, 4227855488, 4236246656, 4244633728, 4253022848,\n\t4261412224, 4269799808, 4278184832, 4286578048, 4294962304,\n\t4303349632, 4311743104, 4320130432, 4328521088, 4336909184,\n\t4345295488, 4353687424, 4362073472, 4370458496, 4378852736,\n\t4387238528, 4395630208, 4404019072, 4412407424, 4420790656,\n\t4429182848, 4437571456, 4445962112, 4454344064, 4462738048,\n\t4471119232, 4479516544, 4487904128, 4496289664, 4504682368,\n\t4513068416, 4521459584, 4529846144, 4538232704, 4546619776,\n\t4555010176, 4563402112, 4571790208, 4580174464, 4588567936,\n\t4596957056, 4605344896, 4613734016, 4622119808, 4630511488,\n\t4638898816, 4647287936, 4655675264, 4664065664, 4672451968,\n\t4680842624, 4689231488, 4697620352, 4706007424, 4714397056,\n\t4722786176, 4731173248, 4739562368, 4747951744, 4756340608,\n\t4764727936, 4773114496, 4781504384, 4789894784, 4798283648,\n\t4806667648, 4815059584, 4823449472, 4831835776, 4840226176,\n\t4848612224, 4857003392, 4865391488, 4873780096, 4882169728,\n\t4890557312, 4898946944, 4907333248, 4915722368, 4924110976,\n\t4932499328, 4940889728, 4949276032, 4957666432, 4966054784,\n\t4974438016, 4982831488, 4991221376, 4999607168, 5007998848,\n\t5016386432, 5024763776, 5033164672, 5041544576, 5049941888,\n\t5058329728, 5066717056, 5075107456, 5083494272, 5091883904,\n\t5100273536, 5108662144, 5117048192, 5125436032, 5133827456,\n\t5142215296, 5150605184, 5158993024, 5167382144, 5175769472,\n\t5184157568, 5192543872, 5200936064, 5209324928, 5217711232,\n\t5226102656, 5234490496, 5242877312, 5251263872, 5259654016,\n\t5268040832, 5276434304, 5284819328, 5293209728, 5301598592,\n\t5309986688, 5318374784, 5326764416, 5335151488, 5343542144,\n\t5351929472, 5360319872, 5368706944, 5377096576, 5385484928,\n\t5393871232, 5402263424, 5410650496, 5419040384, 5427426944,\n\t5435816576, 5444205952, 5452594816, 5460981376, 5469367936,\n\t5477760896, 5486148736, 5494536832, 5502925952, 5511315328,\n\t5519703424, 5528089984, 5536481152, 5544869504, 5553256064,\n\t5561645696, 5570032768, 5578423936, 5586811264, 5595193216,\n\t5603585408, 5611972736, 5620366208, 5628750464, 5637143936,\n\t5645528192, 5653921408, 5662310272, 5670694784, 5679082624,\n\t5687474048, 5695864448, 5704251008, 5712641408, 5721030272,\n\t5729416832, 5737806208, 5746194304, 5754583936, 5762969984,\n\t5771358592, 5779748224, 5788137856, 5796527488, 5804911232,\n\t5813300608, 5821692544, 5830082176, 5838468992, 5846855552,\n\t5855247488, 5863636096, 5872024448, 5880411008, 5888799872,\n\t5897186432, 5905576832, 5913966976, 5922352768, 5930744704,\n\t5939132288, 5947522432, 5955911296, 5964299392, 5972688256,\n\t5981074304, 5989465472, 5997851008, 6006241408, 6014627968,\n\t6023015552, 6031408256, 6039796096, 6048185216, 6056574848,\n\t6064963456, 6073351808, 6081736064, 6090128768, 6098517632,\n\t6106906496, 6115289216, 6123680896, 6132070016, 6140459648,\n\t6148849024, 6157237376, 6165624704, 6174009728, 6182403712,\n\t6190792064, 6199176064, 6207569792, 6215952256, 6224345216,\n\t6232732544, 6241124224, 6249510272, 6257899136, 6266287744,\n\t6274676864, 6283065728, 6291454336, 6299843456, 6308232064,\n\t6316620928, 6325006208, 6333395584, 6341784704, 6350174848,\n\t6358562176, 6366951296, 6375337856, 6383729536, 6392119168,\n\t6400504192, 6408895616, 6417283456, 6425673344, 6434059136,\n\t6442444672, 6450837376, 6459223424, 6467613056, 6476004224,\n\t6484393088, 6492781952, 6501170048, 6509555072, 6517947008,\n\t6526336384, 6534725504, 6543112832, 6551500672, 6559888768,\n\t6568278656, 6576662912, 6585055616, 6593443456, 6601834112,\n\t6610219648, 6618610304, 6626999168, 6635385472, 6643777408,\n\t6652164224, 6660552832, 6668941952, 6677330048, 6685719424,\n\t6694107776, 6702493568, 6710882176, 6719274112, 6727662976,\n\t6736052096, 6744437632, 6752825984, 6761213824, 6769604224,\n\t6777993856, 6786383488, 6794770816, 6803158144, 6811549312,\n\t6819937664, 6828326528, 6836706176, 6845101696, 6853491328,\n\t6861880448, 6870269312, 6878655104, 6887046272, 6895433344,\n\t6903822208, 6912212864, 6920596864, 6928988288, 6937377152,\n\t6945764992, 6954149248, 6962544256, 6970928768, 6979317376,\n\t6987709312, 6996093824, 7004487296, 7012875392, 7021258624,\n\t7029652352, 7038038912, 7046427776, 7054818944, 7063207808,\n\t7071595136, 7079980928, 7088372608, 7096759424, 7105149824,\n\t7113536896, 7121928064, 7130315392, 7138699648, 7147092352,\n\t7155479168, 7163865728, 7172249984, 7180648064, 7189036672,\n\t7197424768, 7205810816, 7214196608, 7222589824, 7230975104,\n\t7239367552, 7247755904, 7256145536, 7264533376, 7272921472,\n\t7281308032, 7289694848, 7298088832, 7306471808, 7314864512,\n\t7323253888, 7331643008, 7340029568, 7348419712, 7356808832,\n\t7365196672, 7373585792, 7381973888, 7390362752, 7398750592,\n\t7407138944, 7415528576, 7423915648, 7432302208, 7440690304,\n\t7449080192, 7457472128, 7465860992, 7474249088, 7482635648,\n\t7491023744, 7499412608, 7507803008, 7516192384, 7524579968,\n\t7532967296, 7541358464, 7549745792, 7558134656, 7566524032,\n\t7574912896, 7583300992, 7591690112, 7600075136, 7608466816,\n\t7616854912, 7625244544, 7633629824, 7642020992, 7650410368,\n\t7658794112, 7667187328, 7675574912, 7683961984, 7692349568,\n\t7700739712, 7709130368, 7717519232, 7725905536, 7734295424,\n\t7742683264, 7751069056, 7759457408, 7767849088, 7776238208,\n\t7784626816, 7793014912, 7801405312, 7809792128, 7818179968,\n\t7826571136, 7834957184, 7843347328, 7851732352, 7860124544,\n\t7868512384, 7876902016, 7885287808, 7893679744, 7902067072,\n\t7910455936, 7918844288, 7927230848, 7935622784, 7944009344,\n\t7952400256, 7960786048, 7969176704, 7977565312, 7985953408,\n\t7994339968, 8002730368, 8011119488, 8019508096, 8027896192,\n\t8036285056, 8044674688, 8053062272, 8061448832, 8069838464,\n\t8078227328, 8086616704, 8095006592, 8103393664, 8111783552,\n\t8120171392, 8128560256, 8136949376, 8145336704, 8153726848,\n\t8162114944, 8170503296, 8178891904, 8187280768, 8195669632,\n\t8204058496, 8212444544, 8220834176, 8229222272, 8237612672,\n\t8246000768, 8254389376, 8262775168, 8271167104, 8279553664,\n\t8287944064, 8296333184, 8304715136, 8313108352, 8321497984,\n\t8329885568, 8338274432, 8346663296, 8355052928, 8363441536,\n\t8371828352, 8380217984, 8388606592, 8396996224, 8405384576,\n\t8413772672, 8422161536, 8430549376, 8438939008, 8447326592,\n\t8455715456, 8464104832, 8472492928, 8480882048, 8489270656,\n\t8497659776, 8506045312, 8514434944, 8522823808, 8531208832,\n\t8539602304, 8547990656, 8556378752, 8564768384, 8573154176,\n\t8581542784, 8589933952, 8598322816, 8606705024, 8615099264,\n\t8623487872, 8631876992, 8640264064, 8648653952, 8657040256,\n\t8665430656, 8673820544, 8682209152, 8690592128, 8698977152,\n\t8707374464, 8715763328, 8724151424, 8732540032, 8740928384,\n\t8749315712, 8757704576, 8766089344, 8774480768, 8782871936,\n\t8791260032, 8799645824, 8808034432, 8816426368, 8824812928,\n\t8833199488, 8841591424, 8849976448, 8858366336, 8866757248,\n\t8875147136, 8883532928, 8891923328, 8900306816, 8908700288,\n\t8917088384, 8925478784, 8933867392, 8942250368, 8950644608,\n\t8959032704, 8967420544, 8975809664, 8984197504, 8992584064,\n\t9000976256, 9009362048, 9017752448, 9026141312, 9034530688,\n\t9042917504, 9051307904, 9059694208, 9068084864, 9076471424,\n\t9084861824, 9093250688, 9101638528, 9110027648, 9118416512,\n\t9126803584, 9135188096, 9143581312, 9151969664, 9160356224,\n\t9168747136, 9177134464, 9185525632, 9193910144, 9202302848,\n\t9210690688, 9219079552, 9227465344, 9235854464, 9244244864,\n\t9252633472, 9261021824, 9269411456, 9277799296, 9286188928,\n\t9294574208, 9302965888, 9311351936, 9319740032, 9328131968,\n\t9336516736, 9344907392, 9353296768, 9361685888, 9370074752,\n\t9378463616, 9386849408, 9395239808, 9403629184, 9412016512,\n\t9420405376, 9428795008, 9437181568, 9445570688, 9453960832,\n\t9462346624, 9470738048, 9479121536, 9487515008, 9495903616,\n\t9504289664, 9512678528, 9521067904, 9529456256, 9537843584,\n\t9546233728, 9554621312, 9563011456, 9571398784, 9579788672,\n\t9588178304, 9596567168, 9604954496, 9613343104, 9621732992,\n\t9630121856, 9638508416, 9646898816, 9655283584, 9663675776,\n\t9672061312, 9680449664, 9688840064, 9697230464, 9705617536,\n\t9714003584, 9722393984, 9730772608, 9739172224, 9747561088,\n\t9755945344, 9764338816, 9772726144, 9781116544, 9789503872,\n\t9797892992, 9806282624, 9814670464, 9823056512, 9831439232,\n\t9839833984, 9848224384, 9856613504, 9865000576, 9873391232,\n\t9881772416, 9890162816, 9898556288, 9906940544, 9915333248,\n\t9923721088, 9932108672, 9940496512, 9948888448, 9957276544,\n\t9965666176, 9974048384, 9982441088, 9990830464, 9999219584,\n\t10007602816, 10015996544, 10024385152, 10032774016, 10041163648,\n\t10049548928, 10057940096, 10066329472, 10074717824, 10083105152,\n\t10091495296, 10099878784, 10108272256, 10116660608, 10125049216,\n\t10133437312, 10141825664, 10150213504, 10158601088, 10166991232,\n\t10175378816, 10183766144, 10192157312, 10200545408, 10208935552,\n\t10217322112, 10225712768, 10234099328, 10242489472, 10250876032,\n\t10259264896, 10267656064, 10276042624, 10284429184, 10292820352,\n\t10301209472, 10309598848, 10317987712, 10326375296, 10334763392,\n\t10343153536, 10351541632, 10359930752, 10368318592, 10376707456,\n\t10385096576, 10393484672, 10401867136, 10410262144, 10418647424,\n\t10427039104, 10435425664, 10443810176, 10452203648, 10460589952,\n\t10468982144, 10477369472, 10485759104, 10494147712, 10502533504,\n\t10510923392, 10519313536, 10527702656, 10536091264, 10544478592,\n\t10552867712, 10561255808, 10569642368, 10578032768, 10586423168,\n\t10594805632, 10603200128, 10611588992, 10619976064, 10628361344,\n\t10636754048, 10645143424, 10653531776, 10661920384, 10670307968,\n\t10678696832, 10687086464, 10695475072, 10703863168, 10712246144,\n\t10720639616, 10729026688, 10737414784, 10745806208, 10754190976,\n\t10762581376, 10770971264, 10779356288, 10787747456, 10796135552,\n\t10804525184, 10812915584, 10821301888, 10829692288, 10838078336,\n\t10846469248, 10854858368, 10863247232, 10871631488, 10880023424,\n\t10888412032, 10896799616, 10905188992, 10913574016, 10921964672,\n\t10930352768, 10938742912, 10947132544, 10955518592, 10963909504,\n\t10972298368, 10980687488, 10989074816, 10997462912, 11005851776,\n\t11014241152, 11022627712, 11031017344, 11039403904, 11047793024,\n\t11056184704, 11064570752, 11072960896, 11081343872, 11089737856,\n\t11098128256, 11106514816, 11114904448, 11123293568, 11131680128,\n\t11140065152, 11148458368, 11156845696, 11165236864, 11173624192,\n\t11182013824, 11190402688, 11198790784, 11207179136, 11215568768,\n\t11223957376, 11232345728, 11240734592, 11249122688, 11257511296,\n\t11265899648, 11274285952, 11282675584, 11291065472, 11299452544,\n\t11307842432, 11316231296, 11324616832, 11333009024, 11341395584,\n\t11349782656, 11358172288, 11366560384, 11374950016, 11383339648,\n\t11391721856, 11400117376, 11408504192, 11416893568, 11425283456,\n\t11433671552, 11442061184, 11450444672, 11458837888, 11467226752,\n\t11475611776, 11484003968, 11492392064, 11500780672, 11509169024,\n\t11517550976, 11525944448, 11534335616, 11542724224, 11551111808,\n\t11559500672, 11567890304, 11576277376, 11584667008, 11593056128,\n\t11601443456, 11609830016, 11618221952, 11626607488, 11634995072,\n\t11643387776, 11651775104, 11660161664, 11668552576, 11676940928,\n\t11685330304, 11693718656, 11702106496, 11710496128, 11718882688,\n\t11727273088, 11735660416, 11744050048, 11752437376, 11760824704,\n\t11769216128, 11777604736, 11785991296, 11794381952, 11802770048,\n\t11811157888, 11819548544, 11827932544, 11836324736, 11844713344,\n\t11853100928, 11861486464, 11869879936, 11878268032, 11886656896,\n\t11895044992, 11903433088, 11911822976, 11920210816, 11928600448,\n\t11936987264, 11945375872, 11953761152, 11962151296, 11970543488,\n\t11978928512, 11987320448, 11995708288, 12004095104, 12012486272,\n\t12020875136, 12029255552, 12037652096, 12046039168, 12054429568,\n\t12062813824, 12071206528, 12079594624, 12087983744, 12096371072,\n\t12104759936, 12113147264, 12121534592, 12129924992, 12138314624,\n\t12146703232, 12155091584, 12163481216, 12171864704, 12180255872,\n\t12188643968, 12197034112, 12205424512, 12213811328, 12222199424,\n\t12230590336, 12238977664, 12247365248, 12255755392, 12264143488,\n\t12272531584, 12280920448, 12289309568, 12297694592, 12306086528,\n\t12314475392, 12322865024, 12331253632, 12339640448, 12348029312,\n\t12356418944, 12364805248, 12373196672, 12381580928, 12389969024,\n\t12398357632, 12406750592, 12415138432, 12423527552, 12431916416,\n\t12440304512, 12448692352, 12457081216, 12465467776, 12473859968,\n\t12482245504, 12490636672, 12499025536, 12507411584, 12515801728,\n\t12524190592, 12532577152, 12540966272, 12549354368, 12557743232,\n\t12566129536, 12574523264, 12582911872, 12591299456, 12599688064,\n\t12608074624, 12616463488, 12624845696, 12633239936, 12641631616,\n\t12650019968, 12658407296, 12666795136, 12675183232, 12683574656,\n\t12691960192, 12700350592, 12708740224, 12717128576, 12725515904,\n\t12733906816, 12742295168, 12750680192, 12759071872, 12767460736,\n\t12775848832, 12784236928, 12792626816, 12801014656, 12809404288,\n\t12817789312, 12826181504, 12834568832, 12842954624, 12851345792,\n\t12859732352, 12868122496, 12876512128, 12884901248, 12893289088,\n\t12901672832, 12910067584, 12918455168, 12926842496, 12935232896,\n\t12943620736, 12952009856, 12960396928, 12968786816, 12977176192,\n\t12985563776, 12993951104, 13002341504, 13010730368, 13019115392,\n\t13027506304, 13035895168, 13044272512, 13052673152, 13061062528,\n\t13069446272, 13077838976, 13086227072, 13094613632, 13103000192,\n\t13111393664, 13119782528, 13128157568, 13136559232, 13144945024,\n\t13153329536, 13161724288, 13170111872, 13178502784, 13186884736,\n\t13195279744, 13203667072, 13212057472, 13220445824, 13228832128,\n\t13237221248, 13245610624, 13254000512, 13262388352, 13270777472,\n\t13279166336, 13287553408, 13295943296, 13304331904, 13312719488,\n\t13321108096, 13329494656, 13337885824, 13346274944, 13354663808,\n\t13363051136, 13371439232, 13379825024, 13388210816, 13396605056,\n\t13404995456, 13413380224, 13421771392, 13430159744, 13438546048,\n\t13446937216, 13455326848, 13463708288, 13472103808, 13480492672,\n\t13488875648, 13497269888, 13505657728, 13514045312, 13522435712,\n\t13530824576, 13539210112, 13547599232, 13555989376, 13564379008,\n\t13572766336, 13581154432, 13589544832, 13597932928, 13606320512,\n\t13614710656, 13623097472, 13631477632, 13639874944, 13648264064,\n\t13656652928, 13665041792, 13673430656, 13681818496, 13690207616,\n\t13698595712, 13706982272, 13715373184, 13723762048, 13732150144,\n\t13740536704, 13748926592, 13757316224, 13765700992, 13774090112,\n\t13782477952, 13790869376, 13799259008, 13807647872, 13816036736,\n\t13824425344, 13832814208, 13841202304, 13849591424, 13857978752,\n\t13866368896, 13874754688, 13883145344, 13891533184, 13899919232,\n\t13908311168, 13916692096, 13925085056, 13933473152, 13941866368,\n\t13950253696, 13958643584, 13967032192, 13975417216, 13983807616,\n\t13992197504, 14000582272, 14008973696, 14017363072, 14025752192,\n\t14034137984, 14042528384, 14050918016, 14059301504, 14067691648,\n\t14076083584, 14084470144, 14092852352, 14101249664, 14109635968,\n\t14118024832, 14126407552, 14134804352, 14143188608, 14151577984,\n\t14159968384, 14168357248, 14176741504, 14185127296, 14193521024,\n\t14201911424, 14210301824, 14218685056, 14227067264, 14235467392,\n\t14243855488, 14252243072, 14260630144, 14269021568, 14277409408,\n\t14285799296, 14294187904, 14302571392, 14310961792, 14319353728,\n\t14327738752, 14336130944, 14344518784, 14352906368, 14361296512,\n\t14369685376, 14378071424, 14386462592, 14394848128, 14403230848,\n\t14411627392, 14420013952, 14428402304, 14436793472, 14445181568,\n\t14453569664, 14461959808, 14470347904, 14478737024, 14487122816,\n\t14495511424, 14503901824, 14512291712, 14520677504, 14529064832,\n\t14537456768, 14545845632, 14554234496, 14562618496, 14571011456,\n\t14579398784, 14587789184, 14596172672, 14604564608, 14612953984,\n\t14621341312, 14629724288, 14638120832, 14646503296, 14654897536,\n\t14663284864, 14671675264, 14680061056, 14688447616, 14696835968,\n\t14705228416, 14713616768, 14722003328, 14730392192, 14738784128,\n\t14747172736, 14755561088, 14763947648, 14772336512, 14780725376,\n\t14789110144, 14797499776, 14805892736, 14814276992, 14822670208,\n\t14831056256, 14839444352, 14847836032, 14856222848, 14864612992,\n\t14872997504, 14881388672, 14889775744, 14898165376, 14906553472,\n\t14914944896, 14923329664, 14931721856, 14940109696, 14948497024,\n\t14956887424, 14965276544, 14973663616, 14982053248, 14990439808,\n\t14998830976, 15007216768, 15015605888, 15023995264, 15032385152,\n\t15040768384, 15049154944, 15057549184, 15065939072, 15074328448,\n\t15082715008, 15091104128, 15099493504, 15107879296, 15116269184,\n\t15124659584, 15133042304, 15141431936, 15149824384, 15158214272,\n\t15166602368, 15174991232, 15183378304, 15191760512, 15200154496,\n\t15208542592, 15216931712, 15225323392, 15233708416, 15242098048,\n\t15250489216, 15258875264, 15267265408, 15275654528, 15284043136,\n\t15292431488, 15300819584, 15309208192, 15317596544, 15325986176,\n\t15334374784, 15342763648, 15351151744, 15359540608, 15367929728,\n\t15376318336, 15384706432, 15393092992, 15401481856, 15409869952,\n\t15418258816, 15426649984, 15435037568, 15443425664, 15451815296,\n\t15460203392, 15468589184, 15476979328, 15485369216, 15493755776,\n\t15502146944, 15510534272, 15518924416, 15527311232, 15535699072,\n\t15544089472, 15552478336, 15560866688, 15569254528, 15577642624,\n\t15586031488, 15594419072, 15602809472, 15611199104, 15619586432,\n\t15627975296, 15636364928, 15644753792, 15653141888, 15661529216,\n\t15669918848, 15678305152, 15686696576, 15695083136, 15703474048,\n\t15711861632, 15720251264, 15728636288, 15737027456, 15745417088,\n\t15753804928, 15762194048, 15770582656, 15778971008, 15787358336,\n\t15795747712, 15804132224, 15812523392, 15820909696, 15829300096,\n\t15837691264, 15846071936, 15854466944, 15862855808, 15871244672,\n\t15879634816, 15888020608, 15896409728, 15904799104, 15913185152,\n\t15921577088, 15929966464, 15938354816, 15946743424, 15955129472,\n\t15963519872, 15971907968, 15980296064, 15988684928, 15997073024,\n\t16005460864, 16013851264, 16022241152, 16030629248, 16039012736,\n\t16047406976, 16055794816, 16064181376, 16072571264, 16080957824,\n\t16089346688, 16097737856, 16106125184, 16114514816, 16122904192,\n\t16131292544, 16139678848, 16148066944, 16156453504, 16164839552,\n\t16173236096, 16181623424, 16190012032, 16198401152, 16206790528,\n\t16215177344, 16223567744, 16231956352, 16240344704, 16248731008,\n\t16257117824, 16265504384, 16273898624, 16282281856, 16290668672,\n\t16299064192, 16307449216, 16315842176, 16324230016, 16332613504,\n\t16341006464, 16349394304, 16357783168, 16366172288, 16374561664,\n\t16382951296, 16391337856, 16399726208, 16408116352, 16416505472,\n\t16424892032, 16433282176, 16441668224, 16450058624, 16458448768,\n\t16466836864, 16475224448, 16483613056, 16492001408, 16500391808,\n\t16508779648, 16517166976, 16525555328, 16533944192, 16542330752,\n\t16550719616, 16559110528, 16567497088, 16575888512, 16584274816,\n\t16592665472, 16601051008, 16609442944, 16617832064, 16626218624,\n\t16634607488, 16642996096, 16651385728, 16659773824, 16668163712,\n\t16676552576, 16684938112, 16693328768, 16701718144, 16710095488,\n\t16718492288, 16726883968, 16735272832, 16743661184, 16752049792,\n\t16760436608, 16768827008, 16777214336, 16785599104, 16793992832,\n\t16802381696, 16810768768, 16819151744, 16827542656, 16835934848,\n\t16844323712, 16852711552, 16861101952, 16869489536, 16877876864,\n\t16886265728, 16894653056, 16903044736, 16911431296, 16919821696,\n\t16928207488, 16936592768, 16944987776, 16953375616, 16961763968,\n\t16970152832, 16978540928, 16986929536, 16995319168, 17003704448,\n\t17012096896, 17020481152, 17028870784, 17037262208, 17045649536,\n\t17054039936, 17062426496, 17070814336, 17079205504, 17087592064,\n\t17095978112, 17104369024, 17112759424, 17121147776, 17129536384,\n\t17137926016, 17146314368, 17154700928, 17163089792, 17171480192,\n\t17179864192, 17188256896, 17196644992, 17205033856, 17213423488,\n\t17221811072, 17230198912, 17238588032, 17246976896, 17255360384,\n\t17263754624, 17272143232, 17280530048, 17288918912, 17297309312,\n\t17305696384, 17314085504, 17322475136, 17330863744, 17339252096,\n\t17347640192, 17356026496, 17364413824, 17372796544, 17381190016,\n\t17389583488, 17397972608, 17406360704, 17414748544, 17423135872,\n\t17431527296, 17439915904, 17448303232, 17456691584, 17465081728,\n\t17473468288, 17481857408, 17490247552, 17498635904, 17507022464,\n\t17515409024, 17523801728, 17532189824, 17540577664, 17548966016,\n\t17557353344, 17565741184, 17574131584, 17582519168, 17590907008,\n\t17599296128, 17607687808, 17616076672, 17624455808, 17632852352,\n\t17641238656, 17649630848, 17658018944, 17666403968, 17674794112,\n\t17683178368, 17691573376, 17699962496, 17708350592, 17716739968,\n\t17725126528, 17733517184, 17741898112, 17750293888, 17758673024,\n\t17767070336, 17775458432, 17783848832, 17792236928, 17800625536,\n\t17809012352, 17817402752, 17825785984, 17834178944, 17842563968,\n\t17850955648, 17859344512, 17867732864, 17876119424, 17884511872,\n\t17892900224, 17901287296, 17909677696, 17918058112, 17926451072,\n\t17934843776, 17943230848, 17951609216, 17960008576, 17968397696,\n\t17976784256, 17985175424, 17993564032, 18001952128, 18010339712,\n\t18018728576, 18027116672, 18035503232, 18043894144, 18052283264,\n\t18060672128, 18069056384, 18077449856, 18085837184, 18094225792,\n\t18102613376, 18111004544, 18119388544, 18127781248, 18136170368,\n\t18144558976, 18152947328, 18161336192, 18169724288, 18178108544,\n\t18186498944, 18194886784, 18203275648, 18211666048, 18220048768,\n\t18228444544, 18236833408, 18245220736}\n\n// cacheSizes is a lookup table for the ethash verification cache size for the\n// first 2048 epochs (i.e. 61440000 blocks).\nvar cacheSizes = [maxEpoch]uint64{\n\t16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072,\n\t17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088,\n\t18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208,\n\t19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968,\n\t20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216,\n\t21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104,\n\t22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096,\n\t23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112,\n\t24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488,\n\t25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096,\n\t25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472,\n\t26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744,\n\t27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504,\n\t28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752,\n\t29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976,\n\t30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248,\n\t31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392,\n\t32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768,\n\t33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992,\n\t34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984,\n\t35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976,\n\t36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656,\n\t36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904,\n\t37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672,\n\t38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632,\n\t39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032,\n\t40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304,\n\t41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912,\n\t42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696,\n\t43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432,\n\t44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448,\n\t45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208,\n\t46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328,\n\t47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936,\n\t47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312,\n\t48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712,\n\t49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472,\n\t50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848,\n\t51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968,\n\t52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576,\n\t53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744,\n\t54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248,\n\t55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856,\n\t56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488,\n\t57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632,\n\t58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984,\n\t58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512,\n\t59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968,\n\t60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752,\n\t61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512,\n\t62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656,\n\t63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392,\n\t64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792,\n\t65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296,\n\t66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672,\n\t67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304,\n\t68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912,\n\t69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184,\n\t69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816,\n\t70907968, 71040832, 71171648, 71303104, 71432512, 71564992, 71695168,\n\t71826368, 71958464, 72089536, 72219712, 72350144, 72482624, 72613568,\n\t72744512, 72875584, 73006144, 73138112, 73268672, 73400128, 73530944,\n\t73662272, 73793344, 73924544, 74055104, 74185792, 74316992, 74448832,\n\t74579392, 74710976, 74841664, 74972864, 75102784, 75233344, 75364544,\n\t75497024, 75627584, 75759296, 75890624, 76021696, 76152256, 76283072,\n\t76414144, 76545856, 76676672, 76806976, 76937792, 77070016, 77200832,\n\t77331392, 77462464, 77593664, 77725376, 77856448, 77987776, 78118336,\n\t78249664, 78380992, 78511424, 78642496, 78773056, 78905152, 79033664,\n\t79166656, 79297472, 79429568, 79560512, 79690816, 79822784, 79953472,\n\t80084672, 80214208, 80346944, 80477632, 80608576, 80740288, 80870848,\n\t81002048, 81133504, 81264448, 81395648, 81525952, 81657536, 81786304,\n\t81919808, 82050112, 82181312, 82311616, 82443968, 82573376, 82705984,\n\t82835776, 82967744, 83096768, 83230528, 83359552, 83491264, 83622464,\n\t83753536, 83886016, 84015296, 84147776, 84277184, 84409792, 84540608,\n\t84672064, 84803008, 84934336, 85065152, 85193792, 85326784, 85458496,\n\t85589312, 85721024, 85851968, 85982656, 86112448, 86244416, 86370112,\n\t86506688, 86637632, 86769344, 86900672, 87031744, 87162304, 87293632,\n\t87424576, 87555392, 87687104, 87816896, 87947968, 88079168, 88211264,\n\t88341824, 88473152, 88603712, 88735424, 88862912, 88996672, 89128384,\n\t89259712, 89390272, 89521984, 89652544, 89783872, 89914816, 90045376,\n\t90177088, 90307904, 90438848, 90569152, 90700096, 90832832, 90963776,\n\t91093696, 91223744, 91356992, 91486784, 91618496, 91749824, 91880384,\n\t92012224, 92143552, 92273344, 92405696, 92536768, 92666432, 92798912,\n\t92926016, 93060544, 93192128, 93322816, 93453632, 93583936, 93715136,\n\t93845056, 93977792, 94109504, 94240448, 94371776, 94501184, 94632896,\n\t94764224, 94895552, 95023424, 95158208, 95287744, 95420224, 95550016,\n\t95681216, 95811904, 95943872, 96075328, 96203584, 96337856, 96468544,\n\t96599744, 96731072, 96860992, 96992576, 97124288, 97254848, 97385536,\n\t97517248, 97647808, 97779392, 97910464, 98041408, 98172608, 98303168,\n\t98434496, 98565568, 98696768, 98827328, 98958784, 99089728, 99220928,\n\t99352384, 99482816, 99614272, 99745472, 99876416, 100007104,\n\t100138048, 100267072, 100401088, 100529984, 100662592, 100791872,\n\t100925248, 101056064, 101187392, 101317952, 101449408, 101580608,\n\t101711296, 101841728, 101973824, 102104896, 102235712, 102366016,\n\t102498112, 102628672, 102760384, 102890432, 103021888, 103153472,\n\t103284032, 103415744, 103545152, 103677248, 103808576, 103939648,\n\t104070976, 104201792, 104332736, 104462528, 104594752, 104725952,\n\t104854592, 104988608, 105118912, 105247808, 105381184, 105511232,\n\t105643072, 105774784, 105903296, 106037056, 106167872, 106298944,\n\t106429504, 106561472, 106691392, 106822592, 106954304, 107085376,\n\t107216576, 107346368, 107478464, 107609792, 107739712, 107872192,\n\t108003136, 108131392, 108265408, 108396224, 108527168, 108657344,\n\t108789568, 108920384, 109049792, 109182272, 109312576, 109444928,\n\t109572928, 109706944, 109837888, 109969088, 110099648, 110230976,\n\t110362432, 110492992, 110624704, 110755264, 110886208, 111017408,\n\t111148864, 111279296, 111410752, 111541952, 111673024, 111803456,\n\t111933632, 112066496, 112196416, 112328512, 112457792, 112590784,\n\t112715968, 112852672, 112983616, 113114944, 113244224, 113376448,\n\t113505472, 113639104, 113770304, 113901376, 114031552, 114163264,\n\t114294592, 114425536, 114556864, 114687424, 114818624, 114948544,\n\t115080512, 115212224, 115343296, 115473472, 115605184, 115736128,\n\t115867072, 115997248, 116128576, 116260288, 116391488, 116522944,\n\t116652992, 116784704, 116915648, 117046208, 117178304, 117308608,\n\t117440192, 117569728, 117701824, 117833024, 117964096, 118094656,\n\t118225984, 118357312, 118489024, 118617536, 118749632, 118882112,\n\t119012416, 119144384, 119275328, 119406016, 119537344, 119668672,\n\t119798464, 119928896, 120061376, 120192832, 120321728, 120454336,\n\t120584512, 120716608, 120848192, 120979136, 121109056, 121241408,\n\t121372352, 121502912, 121634752, 121764416, 121895744, 122027072,\n\t122157632, 122289088, 122421184, 122550592, 122682944, 122813888,\n\t122945344, 123075776, 123207488, 123338048, 123468736, 123600704,\n\t123731264, 123861952, 123993664, 124124608, 124256192, 124386368,\n\t124518208, 124649024, 124778048, 124911296, 125041088, 125173696,\n\t125303744, 125432896, 125566912, 125696576, 125829056, 125958592,\n\t126090304, 126221248, 126352832, 126483776, 126615232, 126746432,\n\t126876608, 127008704, 127139392, 127270336, 127401152, 127532224,\n\t127663552, 127794752, 127925696, 128055232, 128188096, 128319424,\n\t128449856, 128581312, 128712256, 128843584, 128973632, 129103808,\n\t129236288, 129365696, 129498944, 129629888, 129760832, 129892288,\n\t130023104, 130154048, 130283968, 130416448, 130547008, 130678336,\n\t130807616, 130939456, 131071552, 131202112, 131331776, 131464384,\n\t131594048, 131727296, 131858368, 131987392, 132120256, 132250816,\n\t132382528, 132513728, 132644672, 132774976, 132905792, 133038016,\n\t133168832, 133299392, 133429312, 133562048, 133692992, 133823296,\n\t133954624, 134086336, 134217152, 134348608, 134479808, 134607296,\n\t134741056, 134872384, 135002944, 135134144, 135265472, 135396544,\n\t135527872, 135659072, 135787712, 135921472, 136052416, 136182848,\n\t136313792, 136444864, 136576448, 136707904, 136837952, 136970048,\n\t137099584, 137232064, 137363392, 137494208, 137625536, 137755712,\n\t137887424, 138018368, 138149824, 138280256, 138411584, 138539584,\n\t138672832, 138804928, 138936128, 139066688, 139196864, 139328704,\n\t139460032, 139590208, 139721024, 139852864, 139984576, 140115776,\n\t140245696, 140376512, 140508352, 140640064, 140769856, 140902336,\n\t141032768, 141162688, 141294016, 141426496, 141556544, 141687488,\n\t141819584, 141949888, 142080448, 142212544, 142342336, 142474432,\n\t142606144, 142736192, 142868288, 142997824, 143129408, 143258944,\n\t143392448, 143523136, 143653696, 143785024, 143916992, 144045632,\n\t144177856, 144309184, 144440768, 144570688, 144701888, 144832448,\n\t144965056, 145096384, 145227584, 145358656, 145489856, 145620928,\n\t145751488, 145883072, 146011456, 146144704, 146275264, 146407232,\n\t146538176, 146668736, 146800448, 146931392, 147062336, 147193664,\n\t147324224, 147455936, 147586624, 147717056, 147848768, 147979456,\n\t148110784, 148242368, 148373312, 148503232, 148635584, 148766144,\n\t148897088, 149028416, 149159488, 149290688, 149420224, 149551552,\n\t149683136, 149814976, 149943616, 150076352, 150208064, 150338624,\n\t150470464, 150600256, 150732224, 150862784, 150993088, 151125952,\n\t151254976, 151388096, 151519168, 151649728, 151778752, 151911104,\n\t152042944, 152174144, 152304704, 152435648, 152567488, 152698816,\n\t152828992, 152960576, 153091648, 153222976, 153353792, 153484096,\n\t153616192, 153747008, 153878336, 154008256, 154139968, 154270912,\n\t154402624, 154533824, 154663616, 154795712, 154926272, 155057984,\n\t155188928, 155319872, 155450816, 155580608, 155712064, 155843392,\n\t155971136, 156106688, 156237376, 156367424, 156499264, 156630976,\n\t156761536, 156892352, 157024064, 157155008, 157284416, 157415872,\n\t157545536, 157677248, 157810496, 157938112, 158071744, 158203328,\n\t158334656, 158464832, 158596288, 158727616, 158858048, 158988992,\n\t159121216, 159252416, 159381568, 159513152, 159645632, 159776192,\n\t159906496, 160038464, 160169536, 160300352, 160430656, 160563008,\n\t160693952, 160822208, 160956352, 161086784, 161217344, 161349184,\n\t161480512, 161611456, 161742272, 161873216, 162002752, 162135872,\n\t162266432, 162397888, 162529216, 162660032, 162790976, 162922048,\n\t163052096, 163184576, 163314752, 163446592, 163577408, 163707968,\n\t163839296, 163969984, 164100928, 164233024, 164364224, 164494912,\n\t164625856, 164756672, 164887616, 165019072, 165150016, 165280064,\n\t165412672, 165543104, 165674944, 165805888, 165936832, 166067648,\n\t166198336, 166330048, 166461248, 166591552, 166722496, 166854208,\n\t166985408, 167116736, 167246656, 167378368, 167508416, 167641024,\n\t167771584, 167903168, 168034112, 168164032, 168295744, 168427456,\n\t168557632, 168688448, 168819136, 168951616, 169082176, 169213504,\n\t169344832, 169475648, 169605952, 169738048, 169866304, 169999552,\n\t170131264, 170262464, 170393536, 170524352, 170655424, 170782016,\n\t170917696, 171048896, 171179072, 171310784, 171439936, 171573184,\n\t171702976, 171835072, 171966272, 172097216, 172228288, 172359232,\n\t172489664, 172621376, 172747712, 172883264, 173014208, 173144512,\n\t173275072, 173407424, 173539136, 173669696, 173800768, 173931712,\n\t174063424, 174193472, 174325696, 174455744, 174586816, 174718912,\n\t174849728, 174977728, 175109696, 175242688, 175374272, 175504832,\n\t175636288, 175765696, 175898432, 176028992, 176159936, 176291264,\n\t176422592, 176552512, 176684864, 176815424, 176946496, 177076544,\n\t177209152, 177340096, 177470528, 177600704, 177731648, 177864256,\n\t177994816, 178126528, 178257472, 178387648, 178518464, 178650176,\n\t178781888, 178912064, 179044288, 179174848, 179305024, 179436736,\n\t179568448, 179698496, 179830208, 179960512, 180092608, 180223808,\n\t180354752, 180485696, 180617152, 180748096, 180877504, 181009984,\n\t181139264, 181272512, 181402688, 181532608, 181663168, 181795136,\n\t181926592, 182057536, 182190016, 182320192, 182451904, 182582336,\n\t182713792, 182843072, 182976064, 183107264, 183237056, 183368384,\n\t183494848, 183631424, 183762752, 183893824, 184024768, 184154816,\n\t184286656, 184417984, 184548928, 184680128, 184810816, 184941248,\n\t185072704, 185203904, 185335616, 185465408, 185596352, 185727296,\n\t185859904, 185989696, 186121664, 186252992, 186383552, 186514112,\n\t186645952, 186777152, 186907328, 187037504, 187170112, 187301824,\n\t187429184, 187562048, 187693504, 187825472, 187957184, 188087104,\n\t188218304, 188349376, 188481344, 188609728, 188743616, 188874304,\n\t189005248, 189136448, 189265088, 189396544, 189528128, 189660992,\n\t189791936, 189923264, 190054208, 190182848, 190315072, 190447424,\n\t190577984, 190709312, 190840768, 190971328, 191102656, 191233472,\n\t191364032, 191495872, 191626816, 191758016, 191888192, 192020288,\n\t192148928, 192282176, 192413504, 192542528, 192674752, 192805952,\n\t192937792, 193068608, 193198912, 193330496, 193462208, 193592384,\n\t193723456, 193854272, 193985984, 194116672, 194247232, 194379712,\n\t194508352, 194641856, 194772544, 194900672, 195035072, 195166016,\n\t195296704, 195428032, 195558592, 195690304, 195818176, 195952576,\n\t196083392, 196214336, 196345792, 196476736, 196607552, 196739008,\n\t196869952, 197000768, 197130688, 197262784, 197394368, 197523904,\n\t197656384, 197787584, 197916608, 198049472, 198180544, 198310208,\n\t198442432, 198573632, 198705088, 198834368, 198967232, 199097792,\n\t199228352, 199360192, 199491392, 199621696, 199751744, 199883968,\n\t200014016, 200146624, 200276672, 200408128, 200540096, 200671168,\n\t200801984, 200933312, 201062464, 201194944, 201326144, 201457472,\n\t201588544, 201719744, 201850816, 201981632, 202111552, 202244032,\n\t202374464, 202505152, 202636352, 202767808, 202898368, 203030336,\n\t203159872, 203292608, 203423296, 203553472, 203685824, 203816896,\n\t203947712, 204078272, 204208192, 204341056, 204472256, 204603328,\n\t204733888, 204864448, 204996544, 205125568, 205258304, 205388864,\n\t205517632, 205650112, 205782208, 205913536, 206044736, 206176192,\n\t206307008, 206434496, 206569024, 206700224, 206831168, 206961856,\n\t207093056, 207223616, 207355328, 207486784, 207616832, 207749056,\n\t207879104, 208010048, 208141888, 208273216, 208404032, 208534336,\n\t208666048, 208796864, 208927424, 209059264, 209189824, 209321792,\n\t209451584, 209582656, 209715136, 209845568, 209976896, 210106432,\n\t210239296, 210370112, 210501568, 210630976, 210763712, 210894272,\n\t211024832, 211156672, 211287616, 211418176, 211549376, 211679296,\n\t211812032, 211942592, 212074432, 212204864, 212334016, 212467648,\n\t212597824, 212727616, 212860352, 212991424, 213120832, 213253952,\n\t213385024, 213515584, 213645632, 213777728, 213909184, 214040128,\n\t214170688, 214302656, 214433728, 214564544, 214695232, 214826048,\n\t214956992, 215089088, 215219776, 215350592, 215482304, 215613248,\n\t215743552, 215874752, 216005312, 216137024, 216267328, 216399296,\n\t216530752, 216661696, 216790592, 216923968, 217054528, 217183168,\n\t217316672, 217448128, 217579072, 217709504, 217838912, 217972672,\n\t218102848, 218233024, 218364736, 218496832, 218627776, 218759104,\n\t218888896, 219021248, 219151936, 219281728, 219413056, 219545024,\n\t219675968, 219807296, 219938624, 220069312, 220200128, 220331456,\n\t220461632, 220592704, 220725184, 220855744, 220987072, 221117888,\n\t221249216, 221378368, 221510336, 221642048, 221772736, 221904832,\n\t222031808, 222166976, 222297536, 222428992, 222559936, 222690368,\n\t222820672, 222953152, 223083968, 223213376, 223345984, 223476928,\n\t223608512, 223738688, 223869376, 224001472, 224132672, 224262848,\n\t224394944, 224524864, 224657344, 224788288, 224919488, 225050432,\n\t225181504, 225312704, 225443776, 225574592, 225704768, 225834176,\n\t225966784, 226097216, 226229824, 226360384, 226491712, 226623424,\n\t226754368, 226885312, 227015104, 227147456, 227278528, 227409472,\n\t227539904, 227669696, 227802944, 227932352, 228065216, 228196288,\n\t228326464, 228457792, 228588736, 228720064, 228850112, 228981056,\n\t229113152, 229243328, 229375936, 229505344, 229636928, 229769152,\n\t229894976, 230030272, 230162368, 230292416, 230424512, 230553152,\n\t230684864, 230816704, 230948416, 231079616, 231210944, 231342016,\n\t231472448, 231603776, 231733952, 231866176, 231996736, 232127296,\n\t232259392, 232388672, 232521664, 232652608, 232782272, 232914496,\n\t233043904, 233175616, 233306816, 233438528, 233569984, 233699776,\n\t233830592, 233962688, 234092224, 234221888, 234353984, 234485312,\n\t234618304, 234749888, 234880832, 235011776, 235142464, 235274048,\n\t235403456, 235535936, 235667392, 235797568, 235928768, 236057152,\n\t236190272, 236322752, 236453312, 236583616, 236715712, 236846528,\n\t236976448, 237108544, 237239104, 237371072, 237501632, 237630784,\n\t237764416, 237895232, 238026688, 238157632, 238286912, 238419392,\n\t238548032, 238681024, 238812608, 238941632, 239075008, 239206336,\n\t239335232, 239466944, 239599168, 239730496, 239861312, 239992384,\n\t240122816, 240254656, 240385856, 240516928, 240647872, 240779072,\n\t240909632, 241040704, 241171904, 241302848, 241433408, 241565248,\n\t241696192, 241825984, 241958848, 242088256, 242220224, 242352064,\n\t242481856, 242611648, 242744896, 242876224, 243005632, 243138496,\n\t243268672, 243400384, 243531712, 243662656, 243793856, 243924544,\n\t244054592, 244187072, 244316608, 244448704, 244580032, 244710976,\n\t244841536, 244972864, 245104448, 245233984, 245365312, 245497792,\n\t245628736, 245759936, 245889856, 246021056, 246152512, 246284224,\n\t246415168, 246545344, 246675904, 246808384, 246939584, 247070144,\n\t247199552, 247331648, 247463872, 247593536, 247726016, 247857088,\n\t247987648, 248116928, 248249536, 248380736, 248512064, 248643008,\n\t248773312, 248901056, 249036608, 249167552, 249298624, 249429184,\n\t249560512, 249692096, 249822784, 249954112, 250085312, 250215488,\n\t250345792, 250478528, 250608704, 250739264, 250870976, 251002816,\n\t251133632, 251263552, 251395136, 251523904, 251657792, 251789248,\n\t251919424, 252051392, 252182464, 252313408, 252444224, 252575552,\n\t252706624, 252836032, 252968512, 253099712, 253227584, 253361728,\n\t253493056, 253623488, 253754432, 253885504, 254017216, 254148032,\n\t254279488, 254410432, 254541376, 254672576, 254803264, 254933824,\n\t255065792, 255196736, 255326528, 255458752, 255589952, 255721408,\n\t255851072, 255983296, 256114624, 256244416, 256374208, 256507712,\n\t256636096, 256768832, 256900544, 257031616, 257162176, 257294272,\n\t257424448, 257555776, 257686976, 257818432, 257949632, 258079552,\n\t258211136, 258342464, 258473408, 258603712, 258734656, 258867008,\n\t258996544, 259127744, 259260224, 259391296, 259522112, 259651904,\n\t259784384, 259915328, 260045888, 260175424, 260308544, 260438336,\n\t260570944, 260700992, 260832448, 260963776, 261092672, 261226304,\n\t261356864, 261487936, 261619648, 261750592, 261879872, 262011968,\n\t262143424, 262274752, 262404416, 262537024, 262667968, 262799296,\n\t262928704, 263061184, 263191744, 263322944, 263454656, 263585216,\n\t263716672, 263847872, 263978944, 264108608, 264241088, 264371648,\n\t264501184, 264632768, 264764096, 264895936, 265024576, 265158464,\n\t265287488, 265418432, 265550528, 265681216, 265813312, 265943488,\n\t266075968, 266206144, 266337728, 266468032, 266600384, 266731072,\n\t266862272, 266993344, 267124288, 267255616, 267386432, 267516992,\n\t267648704, 267777728, 267910592, 268040512, 268172096, 268302784,\n\t268435264, 268566208, 268696256, 268828096, 268959296, 269090368,\n\t269221312, 269352256, 269482688, 269614784, 269745856, 269876416,\n\t270007616, 270139328, 270270272, 270401216, 270531904, 270663616,\n\t270791744, 270924736, 271056832, 271186112, 271317184, 271449536,\n\t271580992, 271711936, 271843136, 271973056, 272105408, 272236352,\n\t272367296, 272498368, 272629568, 272759488, 272891456, 273022784,\n\t273153856, 273284672, 273415616, 273547072, 273677632, 273808448,\n\t273937088, 274071488, 274200896, 274332992, 274463296, 274595392,\n\t274726208, 274857536, 274988992, 275118656, 275250496, 275382208,\n\t275513024, 275643968, 275775296, 275906368, 276037184, 276167872,\n\t276297664, 276429376, 276560576, 276692672, 276822976, 276955072,\n\t277085632, 277216832, 277347008, 277478848, 277609664, 277740992,\n\t277868608, 278002624, 278134336, 278265536, 278395328, 278526784,\n\t278657728, 278789824, 278921152, 279052096, 279182912, 279313088,\n\t279443776, 279576256, 279706048, 279838528, 279969728, 280099648,\n\t280230976, 280361408, 280493632, 280622528, 280755392, 280887104,\n\t281018176, 281147968, 281278912, 281411392, 281542592, 281673152,\n\t281803712, 281935552, 282066496, 282197312, 282329024, 282458816,\n\t282590272, 282720832, 282853184, 282983744, 283115072, 283246144,\n\t283377344, 283508416, 283639744, 283770304, 283901504, 284032576,\n\t284163136, 284294848, 284426176, 284556992, 284687296, 284819264,\n\t284950208, 285081536}\n"
  },
  {
    "path": "consensus/ethash/algorithm_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethash\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"io/ioutil\"\n\t\"math/big\"\n\t\"os\"\n\t\"reflect\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\n// prepare converts an ethash cache or dataset from a byte stream into the internal\n// int representation. All ethash methods work with ints to avoid constant byte to\n// int conversions as well as to handle both little and big endian systems.\nfunc prepare(dest []uint32, src []byte) {\n\tfor i := 0; i < len(dest); i++ {\n\t\tdest[i] = binary.LittleEndian.Uint32(src[i*4:])\n\t}\n}\n\n// Tests whether the dataset size calculator works correctly by cross checking the\n// hard coded lookup table with the value generated by it.\nfunc TestSizeCalculations(t *testing.T) {\n\t// Verify all the cache and dataset sizes from the lookup table.\n\tfor epoch, want := range cacheSizes {\n\t\tif size := calcCacheSize(epoch); size != want {\n\t\t\tt.Errorf(\"cache %d: cache size mismatch: have %d, want %d\", epoch, size, want)\n\t\t}\n\t}\n\tfor epoch, want := range datasetSizes {\n\t\tif size := calcDatasetSize(epoch); size != want {\n\t\t\tt.Errorf(\"dataset %d: dataset size mismatch: have %d, want %d\", epoch, size, want)\n\t\t}\n\t}\n}\n\n// Tests that verification caches can be correctly generated.\nfunc TestCacheGeneration(t *testing.T) {\n\ttests := []struct {\n\t\tsize  uint64\n\t\tepoch uint64\n\t\tcache []byte\n\t}{\n\t\t{\n\t\t\tsize:  1024,\n\t\t\tepoch: 0,\n\t\t\tcache: hexutil.MustDecode(\"0x\" +\n\t\t\t\t\"7ce2991c951f7bf4c4c1bb119887ee07871eb5339d7b97b8588e85c742de90e5bafd5bbe6ce93a134fb6be9ad3e30db99d9528a2ea7846833f52e9ca119b6b54\" +\n\t\t\t\t\"8979480c46e19972bd0738779c932c1b43e665a2fd3122fc3ddb2691f353ceb0ed3e38b8f51fd55b6940290743563c9f8fa8822e611924657501a12aafab8a8d\" +\n\t\t\t\t\"88fb5fbae3a99d14792406672e783a06940a42799b1c38bc28715db6d37cb11f9f6b24e386dc52dd8c286bd8c36fa813dffe4448a9f56ebcbeea866b42f68d22\" +\n\t\t\t\t\"6c32aae4d695a23cab28fd74af53b0c2efcc180ceaaccc0b2e280103d097a03c1d1b0f0f26ce5f32a90238f9bc49f645db001ef9cd3d13d44743f841fad11a37\" +\n\t\t\t\t\"fa290c62c16042f703578921f30b9951465aae2af4a5dad43a7341d7b4a62750954965a47a1c3af638dc3495c4d62a9bab843168c9fc0114e79cffd1b2827b01\" +\n\t\t\t\t\"75d30ba054658f214e946cf24c43b40d3383fbb0493408e5c5392434ca21bbcf43200dfb876c713d201813934fa485f48767c5915745cf0986b1dc0f33e57748\" +\n\t\t\t\t\"bf483ee2aff4248dfe461ec0504a13628401020fc22638584a8f2f5206a13b2f233898c78359b21c8226024d0a7a93df5eb6c282bdbf005a4aab497e096f2847\" +\n\t\t\t\t\"76c71cee57932a8fb89f6d6b8743b60a4ea374899a94a2e0f218d5c55818cefb1790c8529a76dba31ebb0f4592d709b49587d2317970d39c086f18dd244291d9\" +\n\t\t\t\t\"eedb16705e53e3350591bd4ff4566a3595ac0f0ce24b5e112a3d033bc51b6fea0a92296dea7f5e20bf6ee6bc347d868fda193c395b9bb147e55e5a9f67cfe741\" +\n\t\t\t\t\"7eea7d699b155bd13804204df7ea91fa9249e4474dddf35188f77019c67d201e4c10d7079c5ad492a71afff9a23ca7e900ba7d1bdeaf3270514d8eb35eab8a0a\" +\n\t\t\t\t\"718bb7273aeb37768fa589ed8ab01fbf4027f4ebdbbae128d21e485f061c20183a9bc2e31edbda0727442e9d58eb0fe198440fe199e02e77c0f7b99973f1f74c\" +\n\t\t\t\t\"c9089a51ab96c94a84d66e6aa48b2d0a4543adb5a789039a2aa7b335ca85c91026c7d3c894da53ae364188c3fd92f78e01d080399884a47385aa792e38150cda\" +\n\t\t\t\t\"a8620b2ebeca41fbc773bb837b5e724d6eb2de570d99858df0d7d97067fb8103b21757873b735097b35d3bea8fd1c359a9e8a63c1540c76c9784cf8d975e995c\" +\n\t\t\t\t\"778401b94a2e66e6993ad67ad3ecdc2acb17779f1ea8606827ec92b11c728f8c3b6d3f04a3e6ed05ff81dd76d5dc5695a50377bc135aaf1671cf68b750315493\" +\n\t\t\t\t\"6c64510164d53312bf3c41740c7a237b05faf4a191bd8a95dafa068dbcf370255c725900ce5c934f36feadcfe55b687c440574c1f06f39d207a8553d39156a24\" +\n\t\t\t\t\"845f64fd8324bb85312979dead74f764c9677aab89801ad4f927f1c00f12e28f22422bb44200d1969d9ab377dd6b099dc6dbc3222e9321b2c1e84f8e2f07731c\"),\n\t\t},\n\t\t{\n\t\t\tsize:  1024,\n\t\t\tepoch: 1,\n\t\t\tcache: hexutil.MustDecode(\"0x\" +\n\t\t\t\t\"1f56855d59cc5a085720899b4377a0198f1abe948d85fe5820dc0e346b7c0931b9cde8e541d751de3b2b3275d0aabfae316209d5879297d8bd99f8a033c9d4df\" +\n\t\t\t\t\"35add1029f4e6404a022d504fb8023e42989aba985a65933b0109c7218854356f9284983c9e7de97de591828ae348b63d1fc78d8db58157344d4e06530ffd422\" +\n\t\t\t\t\"5c7f6080d451ff94961ec2dd9e28e6d81b49102451676dbdcb6ef1094c1e8b29e7e808d47b2ba5aeb52dabf00d5f0ee08c116289cbf56d8132e5ca557c3d6220\" +\n\t\t\t\t\"5ba3a48539acabfd4ca3c89e3aaa668e24ffeaeb9eb0136a9fc5a8a676b6d5ad76175eeda0a1fa44b5ff5591079e4b7f581569b6c82416adcb82d7e92980df67\" +\n\t\t\t\t\"2248c4024013e7be52cf91a82491627d9e6d80eda2770ab82badc5e120cd33a4c84495f718b57396a8f397e797087fad81fa50f0e2f5da71e40816a85de35a96\" +\n\t\t\t\t\"3cd351364905c45b3116ff25851d43a2ca1d2aa5cdb408440dabef8c57778fc18608bf431d0c7ffd37649a21a7bb9d90def39c821669dbaf165c0262434dfb08\" +\n\t\t\t\t\"5d057a12de4a7a59fd2dfc931c29c20371abf748b69b618a9bd485b3fb3166cad4d3d27edf0197aabeceb28b96670bdf020f26d1bb9b564aaf82d866bdffd6d4\" +\n\t\t\t\t\"1aea89e20b15a5d1264ab01d1556bfc2a266081609d60928216bd9646038f07de9fedcc9f2b86ab1b07d7bd88ba1df08b3d89b2ac789001b48a723f217debcb7\" +\n\t\t\t\t\"090303a3ef50c1d5d99a75c640ec2b401ab149e06511753d8c49cafdde2929ae61e09cc0f0319d262869d21ead9e0cf5ff2de3dbedfb994f32432d2e4aa44c82\" +\n\t\t\t\t\"7c42781d1477fe03ea0772998e776d63363c6c3edd2d52c89b4d2c9d89cdd90fa33b2b41c8e3f78ef06fe90bcf5cc5756d33a032f16b744141aaa8852bb4cb3a\" +\n\t\t\t\t\"40792b93489c6d6e56c235ec4aa36c263e9b766a4daaff34b2ea709f9f811aef498a65bfbc1deffd36fcc4d1a123345fac7bf57a1fb50394843cd28976a6c7ff\" +\n\t\t\t\t\"fe70f7b8d8f384aa06e2c9964c92a8788cef397fffdd35181b42a35d5d98cd7244bbd09e802888d7efc0311ae58e0961e3656205df4bdc553f317df4b6ede4ca\" +\n\t\t\t\t\"846294a32aec830ab1aa5aac4e78b821c35c70fd752fec353e373bf9be656e775a0111bcbeffdfebd3bd5251d27b9f6971aa561a2bd27a99d61b2ce3965c3726\" +\n\t\t\t\t\"1e114353e6a31b09340f4078b8a8c6ce6ff4213067a8f21020f78aff4f8b472b701ef730aacb8ce7806ea31b14abe8f8efdd6357ca299d339abc4e43ba324ad1\" +\n\t\t\t\t\"efe6eb1a5a6e137daa6ec9f6be30931ca368a944cfcf2a0a29f9a9664188f0466e6f078c347f9fe26a9a89d2029462b19245f24ace47aecace6ef85a4e96b31b\" +\n\t\t\t\t\"5f470eb0165c6375eb8f245d50a25d521d1e569e3b2dccce626752bb26eae624a24511e831a81fab6898a791579f462574ca4851e6588116493dbccc3072e0c5\"),\n\t\t},\n\t}\n\tfor i, tt := range tests {\n\t\tcache := make([]uint32, tt.size/4)\n\t\tgenerateCache(cache, tt.epoch, seedHash(tt.epoch*epochLength+1))\n\n\t\twant := make([]uint32, tt.size/4)\n\t\tprepare(want, tt.cache)\n\n\t\tif !reflect.DeepEqual(cache, want) {\n\t\t\tt.Errorf(\"cache %d: content mismatch: have %x, want %x\", i, cache, want)\n\t\t}\n\t}\n}\n\nfunc TestDatasetGeneration(t *testing.T) {\n\ttests := []struct {\n\t\tepoch       uint64\n\t\tcacheSize   uint64\n\t\tdatasetSize uint64\n\t\tdataset     []byte\n\t}{\n\t\t{\n\t\t\tepoch:       0,\n\t\t\tcacheSize:   1024,\n\t\t\tdatasetSize: 32 * 1024,\n\t\t\tdataset: hexutil.MustDecode(\"0x\" +\n\t\t\t\t\"4bc09fbd530a041dd2ec296110a29e8f130f179c59d223f51ecce3126e8b0c74326abc2f32ccd9d7f976bd0944e3ccf8479db39343cbbffa467046ca97e2da63\" +\n\t\t\t\t\"da5f9d9688c7c33ab7b8aace570e422fa48b24659b72fc534669209d66389ca15b099c5604601e7581488e3bd6925cec0f12d465f8004d4fa84793f8e1e46a1b\" +\n\t\t\t\t\"31b7298991c6142f4f0b6e6b296728ae5fa63ccb667b61fbb1b078003d18d97b906af157debed5e6c55d5a61cae90c85f9e97d565314a2f9fd9e0c08430547d0\" +\n\t\t\t\t\"7cfcee3271f921b95c32a11596219abaa30abc62c2c72c6725078c436c677320594df6bcb92134c1b114fffec982a1f68f13a9f812f074b9fb9c78f2cd4c1c90\" +\n\t\t\t\t\"7ebf1e447f7a422b06303921e3d54f430584d849eaa4b7d652e92a5d659bdfc462adcdd7991e8c66a19da4ddb5390463d073941491859397f135ebbbdbdf5801\" +\n\t\t\t\t\"cafb873c383893390141ae385515504d74a33608273310c312ba468046d2e20c271a38cc0e3920b39705050e752f34f244fc23ddd17ff18677756a87671d4145\" +\n\t\t\t\t\"3aebf97e4890da1d645f41eb20da92a8537c787ce419580073c46aa3bb154952993142ec5b4fb6e8f108fd15fc618cd5c27b45a37ee6dcd52a4ce656c0f58604\" +\n\t\t\t\t\"717ec55f5e592355f1f20e8316f8fd77243734a8b0f50ad93c1d95b5b0482afb22cd0667d935bd6053d7198b54974e10d100df7ca3ec2e0bb5ccce5807b266e0\" +\n\t\t\t\t\"8429d5fec2ae6ae1cc7c5efc27f19c89d4b4a6c5c0b9397886dac635ba37446ff528b582457a4fe7f803f1a47903574f8982d4a679b627396a4e97aaa12fa179\" +\n\t\t\t\t\"0d31ba52e9010bc3c26ace81f702f86649fe9eeda9ec03b74a8a5cf540d82e22af33ab893564397dfc4edd8b1677350df5b82ab61d24db95f58fd2d78afb49c7\" +\n\t\t\t\t\"2d2b1fefa8ff6606b8623829cc752ea37d663b945f3f1d48ad07b1416af252f81b55acd8f164da4faa9d9453721b3b795041ce7df7c77edc13865dbe04fee331\" +\n\t\t\t\t\"47daebe18c183c4a6594a6df3a4d2dc5e3811d805102c9c49286e3d12b38927fa49a7b0cdcb1d799f57118953e31c560aae213a1799d59a78ae68f0590347061\" +\n\t\t\t\t\"fc2668caf08f860452f6b7d3ebc1efecc2e1227d33296b1f1850360dee7236e85274eaede4d18a58b4261ce1f6a7d283dcf64e6d021813f82a566354445327e5\" +\n\t\t\t\t\"6217279b2393fe5aa0f9eb149d4866e1105106bcc221810ceaf053f2ec733d8a22f409c1baf955e50184005c5d55de907de97f5f713b62ae10937e1a7af6267b\" +\n\t\t\t\t\"d2a239e8589017197c343b81540bc26bc52bffd5336fb1da1202a511c7175014d2f500b9d9ce78e4b9f2b158d0fb27af352b6f78c129cad642fe909612c9d658\" +\n\t\t\t\t\"17a8d7f9195ee97201675a918e3cf520fdc19f92b7e6a3db806d4f3799361334082cc58a22ddb4e4f5760bd1667c177b26be325166c6bbed669a158fc87acd43\" +\n\t\t\t\t\"a2462e12578d72db6606f9e24ae659ff411ac9b31d696b8354fd08a591622967a14f8468eaaae3907b7818154ba2d6e4581589354d178bb6ae1c03651c44bbf0\" +\n\t\t\t\t\"e7fa52cb0da09508b5a444aed05a54f416841247a4fe36bd5529029e3adf78b105e22468ed775f4d0954504dd55f2c9b9e6b3a086370b2c0b6fec7efd6914e07\" +\n\t\t\t\t\"26627edb7a04869a874e31f448271077a7de3031cf81bdbc39848efee6075e0d65fa3a32640e9f0395cf7ec12139992aff0a54e0a7dfe5048b3cc03246b56f7d\" +\n\t\t\t\t\"3093538a7b87538d8792a665bc589373621b2f3cf47d2c1f8f580fe34d79c6b2a66323ce89808ce0e5cf77700f5a4446c4be01a310e8f7c7ebefe756b0044886\" +\n\t\t\t\t\"a0477c88ee8ea8c71503748a4cf9eb40ad5c1c8accf7c63c0f43a94ed2b8a5999df3ab9b11b80de73310e036ca88668e640015fcf9cd18eed05517d54896f43e\" +\n\t\t\t\t\"25e7931b44872c4e4183500e0e8c5103292bca1c0d6b0b00c9acce25d31204bb3e4f255c03a0a0916664e9c831b28b364078109a74411a11afb1e610c7d1c9d4\" +\n\t\t\t\t\"ba5e10d0ee0da409654d9e7308395e17caeb9caebccb0192679866e6f2ecb5f10044333bb70d61712adb6d74cdec6918ed9a71d9925da576a1e6f4e906a5cd5f\" +\n\t\t\t\t\"0e94a25e48a4141e4e2770144b63e2449b0f84c82879f34d78440cc430196ba85a213fdac1bcf279a46d7592fa29a876bb7a2efb7081365522a3f06fdceaedd3\" +\n\t\t\t\t\"cc0335cef9ea570733fe8799bb1b918aa7732b4d175929d80c7844a78e19f2dc6a6febf648f49b40320b0f7d784e7f84e45408d70b046bd01cbd8fdaf606fcd3\" +\n\t\t\t\t\"02f4e5a48ab8d13e93a246adfcc94f3109e02a7a969986e75b6ced6bf2d11a55ab77488e131b65a06398fa8e384dc90d875584c9b17cdcf2da5dd72a461cd07c\" +\n\t\t\t\t\"4a955c5fe48509b3284476c42247e086de7d63839b7358cf4ebd9edf9ac8b6fd0c096166405de19c51e8785009d30feb67cdb8ff9ba55459dfdffba8c022e26c\" +\n\t\t\t\t\"0ebd399e4b76ccb4d5491a862c2c4d8cdf1461a96c9b98150e170efacec980edc00a2c7f6d7c6bea3075627e1eb386a7f1ede1059da81a4ac5cf35aa173c88c5\" +\n\t\t\t\t\"1818dc0fbc688b68b82ddc225b6c87588e0c680e303e737c82a13e34be58df8b0cb336aeacc698c79e7682ebb69e6cd6bdc5d11790c96afcfa9290f39515142f\" +\n\t\t\t\t\"5f90b938216a1d14bc049ce3f0ac135722208b989d2557d3520c2186479f179e50fe5b125b8d6638a65047729c6249b9b2c6381c9103c97d1b389cc9cdb31c21\" +\n\t\t\t\t\"8a2eecbf4b9ad1dcfa57446cde88f96563a544c49d6f5303a84a1b7cf074fca78e67e72c9ffa0c542fb646418c6434b16b771088140725cf2dc723c1a975c4ca\" +\n\t\t\t\t\"8a80e633721274907353f51e95952c2b403b45750b42ad10961f60473eb54616f61f7b038c5b7eca475d6a2b844994a9eeddce4f7bb49782e50ef78bc13b85d1\" +\n\t\t\t\t\"9e956f47c60823f3d1981413cb78d309f63a844694861b11b5238961c71f61d82daef6795734f0961e92b9167c57f48e91693e9656fcc6e88f9ce2d373da26bf\" +\n\t\t\t\t\"45b3dff50211fec72387005a7e04828e4ae7ddd10fc2332acf5f1b0f67adcd863752573c2d24488857bfc58c41af45be7641f5cfff611f184612fc0d695866f4\" +\n\t\t\t\t\"2b396b1d9881f442c4a995f4b500f02d4ab4b53ad6e01776ab0e244583f01301203a1515f3dbb73906014e36c7143bf882b005f0228ca0562623893c8a24b7c6\" +\n\t\t\t\t\"4c2c561912010c121b5c3a1e35e75c0b094731e9c0d6acf5a2b1e5b179355525a175640579705f898feb98bffa25633bc126613fa27d2ceb214812902ada23f4\" +\n\t\t\t\t\"367a78655d0d2276095c9e83dfa79153730103963499c367c5621fecfd0888253df82b3d5716703ef92594cf269310b9e6c892c488edb3bba1d0b216e92f622a\" +\n\t\t\t\t\"7f8f7f00d2926d81a4c7ca6cef40d240576a8d5541ccf561c8e0e699925d20347ba7493ed6e182cfe3b633e70b3ce3a0d90813574f6fe329c495d3cd46fd5d7e\" +\n\t\t\t\t\"bdde58d7eafcb134a9a5d3e5d66136e8c9b5d9ecac195dcc44158941c9fe2d87db52a7ddcedc9f82ec160901cc36a9c877af80ceae0563dfa75cabde5d7a7c94\" +\n\t\t\t\t\"9f24bc190f7c2045368356474ff6eee284e7125d1c5f9a036fbde24cecfd3a30481ce077f20cbcb31924368296abf66ce4834102cf7cb949d1b4c6faa6d006ef\" +\n\t\t\t\t\"21379cead5d5a39324d41555c46e0b42a1e871143e47f8e6b3d794e75d7a43c282732766d856e04e666ea346657b157404b0fc8534a2dee8243d40a5e37609e6\" +\n\t\t\t\t\"18bc1d52b91a7623aaf8214a97e4c8c5d860b31c3792b129354a121a7a7e42b50dfbe3ab6590769401eb280545547a43c3a1455355d5d5fdedccb472abfe75b8\" +\n\t\t\t\t\"f5e7d62b0b31553d8d55de0c3c71e6f5a2abba6fe81e9a42ec1968f235bc4296c1ac5df7430917453384450ab56dafa7c7af764cefa3b0bc861c52ae27692365\" +\n\t\t\t\t\"9d7d9ed7609958884147acca867909a75bb6a2c364debefaf98c7ff70c7f4acb5cdb81100fd79a48c5139f8bbdc6553b509f1eb0f5d5d31886a602cd669b3f9f\" +\n\t\t\t\t\"59195a1fa2bcff1170003ba1b2e5e9ad7f2bfcd0573d0f2be9d8fc1773c3a63a2b9292cdbf9b4515c0b1d51772e5ee95303ff493d85314c989e269df4ec3a916\" +\n\t\t\t\t\"40988a11c6a4ad96f7d0541a150edf444c2b1672aa6d37564453b835c2d39864c05c4366492fc9164bf73795410e7aae8206430403357fec6389142b4976b218\" +\n\t\t\t\t\"d70622b4098e322f73020a0d045f07668d1e512c6eeed6e2befbfc3a6ac64054396df96fd41f7aeefa0ab1f66bb52ee1a1df066f365fc43ff0800b0398b621f9\" +\n\t\t\t\t\"a415895268505a81517c44a56dc94e76580fd107dba034bab9f4f4b8a9f881ff34c60c406c47b6d4a998894401006aa88f328393f9cd55a2b4d24db5abbcb05e\" +\n\t\t\t\t\"20d392f3feab3ca12dac475eb3690f2bf9c699d7d90900d9a840068c8cdda2ca7a27bebd685a26eb01a768259a65ab4d7efc1811c87a5a1f4e5038f6b3dc74a6\" +\n\t\t\t\t\"b46d9ac58d31bfc22dac23645aeef819329c9419326f22e1c24c53457baf62ae9b92ab5f999d4ef0ccfb5a21b7598340eb2d399ec81588b6a674c5a1e45aa238\" +\n\t\t\t\t\"c55cae8e1af0f5d64ea378b8afeab263a3a2e5c71cdda4cdb824ae55df2b0260aadf386275ef57781d46f6da3d0b300ea68c14a620c25b5df738c54aef04d63b\" +\n\t\t\t\t\"7dee06cd225e9ed00e78abcddca5a133d8b5e0d9b287e6436014c5da729442239bddb7ecd3fe34e6f6e530134a03ef45de4ae4fe3bf507f16cdfb9bab1fc90e8\" +\n\t\t\t\t\"dc565e4a7ead95352c5a894661e5d82c6d0fc47843d5cab12c4013db76c90734cbff34c73d0d873ac9b27b417665f4948469865f33179624860604a9aba2ceb1\" +\n\t\t\t\t\"68e74b6af3d1ad0bfcac4180ea844339a034b6b2c3e2f61f0c7afbaa76c1ebe93727df1d3db27d59a5cf51b2baaf637b6eb8a20302ef9af0b25dbe3a5e74331c\" +\n\t\t\t\t\"6b0c8a0cf2a2ad72d2e19797983e09468ea95270dc229f2fa084dd2aa96e722016504f6d82508572d9c30711c3ef41ae3ae2f36cc6f5dddbcb0b40d9499b24c5\" +\n\t\t\t\t\"4cd36d2927a6b9d57e335e4fca7f0f16887711a8c1ffa0b48bda46c506ca444b7c23e2c8dd086c2a87283d5fc0d58e9a384106837318dc84ffe65b52d4cb9141\" +\n\t\t\t\t\"2672adfe139c3327350fe3cf355a08c0ca43598a253833e114243c5253077d65643323f5d69b3c7902d91bab7a0928754e7d80afab8d48539fcbe0d9ab83b4db\" +\n\t\t\t\t\"43a6594c4071df2ef35acd1f53006a570f09104f1776b26a303e2aec93a00d2fd8c952d1ca0e54504cd9b469be7c1e71557ec31467ecc773ee817b17c4418712\" +\n\t\t\t\t\"163ae86646b20b80c85860e828c48e88f1309c9ff018e6a95f4c1178de6a4f9f5860039511845da7d8727b5d824ba2502d0a3d76ce74372db77c2050c728dd65\" +\n\t\t\t\t\"b3a15da4f1e1e41c3c2acfebc5618e5e923d503c43a3421d2628ac037c5ce13c74c4ee14d47af02323872f6bf2e8bf09d017ea6e8ec4d3f9fc4fb203ac4e1663\" +\n\t\t\t\t\"756b11629224c676713a42b1f43dfd6362876be1c4865928688765589e26c8dd8bc04ca18d76ced7f786cdb0fa5028ae53991d5b7b45f93bbd50aeb97300f04e\" +\n\t\t\t\t\"69c6736f270907f6a7ad76dde0a365183a961bc8385511e0f22ce0cb8f3c42c5d3928621841e30285fb625294865409267dbb0cf91730ba2fb1088fb79789a54\" +\n\t\t\t\t\"a856311bdca5b0ac0e95fbc79b11c561dc03ea82db182808031e86ec327097143ee761bb62dae8a9f4101fabcac1fc87b3c2080820582dc8a7a8287364550013\" +\n\t\t\t\t\"08053c781b3eb279c89e817fe97103b6930fef2dbf7728def389403a4283f63ec04ae953784b749f0ea6f08749781cd17fadfd15bb197afd2f4e0a8aade2b1ad\" +\n\t\t\t\t\"5100cbdce49ed59658993c00e06bf57c0026b97beadc30cd25f586ff03ab40fcd731535c9a1ccb2c99dc7f8815feab767e1237cb069981f28d8fe26bdec24218\" +\n\t\t\t\t\"488e6086c0ab0efc5d4211fa0726b3a11387df9bb62b863a7b154ca390a268f5e49f50dec45d24bece2a06575cc07a24bfff017d7445024739efb050ace5f345\" +\n\t\t\t\t\"98dacda843d4ef5bfb2c931dc16ee3dd8b61a6f01d9a7de8bbb6d89ca8695f8ef8bd1cc6e0455848fac7691e6789218790270aef40fba114557fd88ff74fe8fc\" +\n\t\t\t\t\"476d9b9665d7e45582540710ce92c8dcad1ad8c05642a23a0d58c02db37ae1a0e70fbc5f71b1300fe398c74cbad37fd57379f58dd3e2d3de6860a17acf3c9321\" +\n\t\t\t\t\"02eb4f9d596497bd849c5bfaf59a83113ef389b6896aa4d4665504a22486299993a9987b2bbdb47d59b3f6ce5d2c9f9ba33b5f0760388ca7f8d8af07c1cd28f5\" +\n\t\t\t\t\"67a417a59ebde4bb9867d4e7b7b79dd8665602c029e9a16a7718efde3d034f13f7f0b9af1702c335893526cb87afc2100e874b25c37fd666bf34bf6a653c7cf5\" +\n\t\t\t\t\"44e1fe0286a6723c7d33461dea380b392dad68f79a78fe1b785d7833ca0d1cd68cff472991a625e3099f3ad2cdc99bd37eae35353cecf424098389dbaf1885fd\" +\n\t\t\t\t\"7db54909a92ee879609eb2e9ef4de1f4338f0df53dbde486ede944ae69869fac701d4f1f48c83757b470ea28c9de2ae5f1ef5d1c91118d16ca0d80b1baf3d314\" +\n\t\t\t\t\"056949df27a09eff70c9ac50b54feff67a165ce5e22ba2222defedc7c39e02356c3553e97524c1506441527da4f5de121142ccd494f83114b3ca2dc37e15c752\" +\n\t\t\t\t\"e2faed7d50254124d68f67e26f4f50c9f0edf6e58b916ca830c4e33801dc11039b18292b87b08f4f2edbaaacddcdab78ff3a0004f86034080f2ca4394b14aed4\" +\n\t\t\t\t\"31e38e3605e6b257bd772954d2f4b846a17df7ed6e5dafa33964d9e56a07a19898fb4dfe8b2ddbd11fa0013e6ebc0e429a5166a43d1ec45557cd1fc1bddbec4b\" +\n\t\t\t\t\"2e9ca26395394c96395ff8f557bd0f7f805c09f0c18534585b7c7fc1d07f145372983ad77fa804fbb7765934e72beae0929a87cc6bf7f6c242ff5db2d4d5541c\" +\n\t\t\t\t\"8c366d22e24e1da5379836fc0eb484683285f99f178b98ca170464bdff60ee04584c12c65408102ac6dc7d10bf58a7d770bf1b3c636a48f934f6f4bbdbcc75d3\" +\n\t\t\t\t\"fc551de3ebaf77006707f6120b3804f2bef9b4bd59f5996610c09ba3953994d1b78a9f3bc3bafeb52266f10755ea842e5b4370c937c09afd34a092ff9b98b4d3\" +\n\t\t\t\t\"518bc2480d4b132455b7f03774ad76b83b254742117921c31cebeab5f39c145f7f373a5603d17dd95217ba1af37a0aa95b2992efcd02d0bb4ad08ebafb31440f\" +\n\t\t\t\t\"1ccfce45882b547ee4bf6ec7ecae11ed79fc63b03636c8a14ec4e0f6877eb658d839be2eac0f10a8948e74203f46078ce66aad2764ff05590e2ac7a8dd8b3036\" +\n\t\t\t\t\"901fcb7ff3369ee989a28e34b9b62e1e607d14da3049ded1a4ee50257195eaaef995bed79ec85111abb522aba1fb306869a1ab381e82943f35345bb5502bb90a\" +\n\t\t\t\t\"e2a0af77526a84754ee4d600ba7f8ac98705ee687bab949a081849889d7b83a21a3dd34af84dc2b9458230ef0ff44c6398d3c6e48e5c09c399ac4d4c7b285549\" +\n\t\t\t\t\"e0bcab7fd96de42f072f1cb633e3e250745321049d0d7ecdef4636e70e94c8414e76ecaedd6ee0792e97de11e7dc1e1e1801ad68f9147278e268d7ad76c5bbb7\" +\n\t\t\t\t\"98386fdc13ca8c77569d96e0debba8ea3b751352136c8f1c8d611a69f1baa9aa4b9d0a476ebd5dd21339ef7f97f09aa86b69a7b114cebe17a6b0e58bf52803d6\" +\n\t\t\t\t\"fd47d9eac3a988b51e9bca95c546d49367a3126bf8ee44fbd0e77611473a1d3d2de0ce4ea54f9bb7f9dd0d0c065f613a623fad43a445eba294fd00037492914f\" +\n\t\t\t\t\"b74d10d0b97a0cf9bd3151c3cade89521f36b6fe1aca7f352e79a77d063da5337a7c88d90e9e566bcd97732baa4459305967c2f65adf1a4a4c7991cbc99df3b7\" +\n\t\t\t\t\"14335a107a97a4ab104bc94fecd1d003fe6d2f22e717853c449881c4ccaa7e7a1e44961a14a47a0d0aa1b1493dd02760ff4d31fbddf5941f93c8e5925d1886e2\" +\n\t\t\t\t\"8761baef8610fa6be016c8f4fe65bb0f335152d5e94893e274f2ab90118e4c07957d252963755b4b638ffc0a734fbe6e32c2e304b10a46a4eed330d101c4f0ae\" +\n\t\t\t\t\"011e7f94b89bc0eb9d358a6548b3f0c47ccc3c2d986d381437c49041629c6cbf61bdf0825efe17e4abef128003681450ceeff0e28842895d8e338c247abf81cb\" +\n\t\t\t\t\"7260fd45042c1f6c630a4b195579721392e577fbfdb9f5b003a8b9a6bc15ae754f6255131a0be600c7b07e2cee1ffe32aad4687f9a429998ed9059a99fd879ea\" +\n\t\t\t\t\"c4dcb55f4551bbb70c187cf1b162e2ca4a929edd6ec9260877df652622ae073fc63c0d8522d3882ba888ac50a67a68fb6530193f93165093a1d8132e87d8887e\" +\n\t\t\t\t\"ff2fdab0fbae6ab9506dae61fada4023133d166bcf1956aedc3237c77d1c81dcc84ae957d89367b0fc950c78e58f2cb9c4fd93e16b94421fdecd46c3ff55592e\" +\n\t\t\t\t\"4374a7f7d8ede9923115770cb416071e8f102d4ad78b891464ffd14f589c238c8e13a4e2a81744d179e7d3ae36cffee75ceb99633face85d077d0c15b3970930\" +\n\t\t\t\t\"075dc08b420e0a545200895207c5a746a18ce9ab64a50d3dcf44da857fb65e4efc29b2b4d532dc6a03b699dcfd77030a4945e6431273e25f06ad8f913c2a9eb7\" +\n\t\t\t\t\"59d8d3049868d337e451726d95c4cf8baf381096fc9b62679175dc8f14e52f8b99f212cab6544414c62f17c8323256cce95356dcd351e34c7a1576b17c1406d7\" +\n\t\t\t\t\"5b8bcca8099a1993df1541ded61b876ae83396b191b719c4b1cbe50d73fc13da352d827ba09aa7fdfef3e4e0273c31ef4fd38b93cf64199c3969a7c09dd5e0f3\" +\n\t\t\t\t\"ff93a5a7db9c2c1ec25e3060bcb5481c6802e1eca78f31862842ea08e8f92b8e52856c4c9fedd0bf20e386cfdf926425f7756ff41fd3567c5bf334e96e3f492f\" +\n\t\t\t\t\"74bd0519d8d98efa0b427ba681b8b1be8fab041ff084dc5f8c4d5d48f481115d7e407ad8a6034f481c2be86f8451980c3aa83a3fff245d90d13801a54527e97b\" +\n\t\t\t\t\"e392b25867882d43e3819f4a8aa380db63954ec23d2f0c11a7aa5bc7a3aedc43ecd3b024280ed8843399e28deb954bfc11a3197fb14a9c9a895859e390e9586e\" +\n\t\t\t\t\"2ad21da39bb9ba79a62222d228a0fc96a24e801f00afc3f98d2168a8a253f24deffe461f6313de9b433e1d2e307239c0e3fd5d9fe4c8352c2c6797b1737e93fc\" +\n\t\t\t\t\"14d411bc69bbc9d78cf91734052b8aa1dab348e4c243b8e6d623865c135f807de8d5fd88f3921327affa37066dd538351bc4ec52eece88856de0a424a87d062a\" +\n\t\t\t\t\"f68cf24db37dbaa8e8e96a812fbf32ccafdf1b9d27f11bea23df02143bd09061a881c010819a315a5b6ee44b3c60979b3f7b41f488b2429d49377d6542fb0e22\" +\n\t\t\t\t\"d09a0ef5b81aa7c8134c0aecdc7a4f9228559d0bb826d30fd77fe0f834212647ce61e22fef0a1c10eb4177de81c31c12054a15f81b605619f3045646110673d0\" +\n\t\t\t\t\"b2d79d80577fa43284266fd2ed54f9a3b9df3509f79559c5bc51a58521bfeb2f95d8851527b7ea47b92a694f6ea2b67dc2d4f506d11d2db32c2929cdf5c8816b\" +\n\t\t\t\t\"7f0c310cceb7ede08d5965ed2c7be6c0a317251c7d31cc4a15f6d7976a8a1e6a2f386fe0071d43a50bd0ce5e864a8e449fe9600c6e4a84866879c490de9f9d46\" +\n\t\t\t\t\"3f22708abf34d3e180dbb6005484a6afad373838cdac335f05c034e3090b2fbaaa53fa2db1f96bbe141d570f17363ff98672500e16994b79be74634755b09e66\" +\n\t\t\t\t\"f1b37e338c946bf85e06c97e31dbddf257d58fd10468278648d86f38710c2ca0b6ea7cac4ea0e2c49b96bf1998bde1b3d38aa853736308e12b4a0d467fdb8a73\" +\n\t\t\t\t\"0d810ce45518614bd5845f58a9835a5cfbe745f45ef59ce9a677d10d8c9f6294f1a0565301efb3c6610afda35167150bd326c77057e530c213da63af3e6a600a\" +\n\t\t\t\t\"d87b16ec5cbf76a13764f71b3e7e0c867086ebd9fad02e1d747030064e071a13da4758cd0fa20872b3dc350f4cbfcde1b68a97aca41e32207b40beddec412c0e\" +\n\t\t\t\t\"c75d87c6671ed94bda5170aa2866509161c28d550190675f60139a7b460469f3d4829b3c65f5d185936582629160522fcfdcc53fd0dcc8fc46de11d52bfcc5e6\" +\n\t\t\t\t\"3407ecbbb682cc1693d6543756fa4e068e92ae1a94924a1ff6891361e5f262b7d3c3a3bc2866f54e6d03ebd5479afa3f424077d51668cc60e23b35fb0222ae22\" +\n\t\t\t\t\"5223ba8a8c416b68c8853022d150c951f06f8f85c2078d3035b8ac3ae984ffcfb024431acaae8bfbeb981870f9ad6bbb88d7d5ff34ba21a44cbffd0aeaa435ba\" +\n\t\t\t\t\"7d40d22602e807ac9a69db514ab13248133142cf03fac999a2b185f34d83fdb495ef042d4a5e92f2624193c88858d91c0812b18fd67046cf50635e6ab1ea9ade\" +\n\t\t\t\t\"7b1fe783dc5147f14f9194cfa92c03a0456f4171f9e5c156fee1c607a1e9e06535f2dac49b92ddf5fdacbf88a062bd7ca5439bae645100121e598deee6043baa\" +\n\t\t\t\t\"85cc0d727f08d37a766a55a9ca21ffb6594fb73f9aad15be4a64bafddb6c85d00f7bb5705d9e56b410dd80df8b087b6d67c7ca84eff2ad699f901415fab21343\" +\n\t\t\t\t\"6351a9bdf83b440e29f3950c7e4c49963ab109686d78fce629e9207db2e17eb5f02f01db6441002d72c06c6c6bbcdc0a7443589ba29909a5a78864ad51e1dfda\" +\n\t\t\t\t\"14782d869e4989ac3c5ef0aa1eabe540e9e7cd4e8eabe25b07f300a134a92718186f085d5c10a711ed0e574bf7550f6bccfc3c094d6e59619bde9fd892af8ef2\" +\n\t\t\t\t\"50e1cc3afdcd9c84ccb97344542843028b00064b0c3d18ac0f0703fe6f9683d40813abbb883e164c5797bc1555338566cf8cdd358e9fcb0e93f08f7ae06a5121\" +\n\t\t\t\t\"c67a231106ad8fd42f0798d7185c2de78b8b76c10e82272a405212ce3b904f90236eeea02054953b967cb614e8f8ac49b977152a52df981c86fa4a92f7f70eb6\" +\n\t\t\t\t\"cd4eb65986564039b0d77f8bafedb4fcbf9c34b8fe9c5fa87b0785c118a8624498fb0184a0dbbfb16777579e1964330c12e494449f6aa5cf69ec4a32054be553\" +\n\t\t\t\t\"6027e0d27c7044abd4c0b8e43db703209037efcfd08944647a90a1ab0c71011753354990cac5a472fae44dc370aac8131ebdf31456a8484e7fdefd268cbf5cb5\" +\n\t\t\t\t\"85ac615039d3655b1348fc0b3b078ac41cbcaf6aaedcc1153bb8d55c307f45405ad6a959abb37bf8891c8dec79a9d7ccd9b791cb60361d4a28f33ec0dfd13fa8\" +\n\t\t\t\t\"e0b9b29e14bf36f5047e51a39c2efcefcc156bd08e46c5c1000a3cdc2bb20713e19d6f492c40e51eb93628cf85d07041ae5353e7decc824cbb1db8ab3a7a7fca\" +\n\t\t\t\t\"ff04c2af423bcfb1864ddc864624b827ddcff2a2f8fdb7a3d86d76e72b4f850ec1262d8fc89e7b12e4cc618afe6a2bdf205075c2008f93b7281d80180199409c\" +\n\t\t\t\t\"de850d1f14ca0ff960f69772385cf0f0a0f47cafd5489ea4fd8b68ec7aa539b942379139756c95bb90818842cd43511edbb7577ae469f46728b13a61e6eede06\" +\n\t\t\t\t\"3a4cdfab5ed590feb807d55d76e518d1d74bfa6704f7c8ccc672824b4d5ef5fa5b3ab8fdf2b6c1753404ba35b76aaa931a4e0e5ca7e440524166b23e9a8be9e8\" +\n\t\t\t\t\"635381f6c9086802d428fece81395dada6b3b866e905ec00ccc4fb9b8415dd15e443f84b7220e3b28700ce3d88f9c6df2afea39e0ead537a50ee11f0c247ee86\" +\n\t\t\t\t\"d4b3074e8761de4de611c409c6d4c369c2c11742a7763f6550edfaae49afeec33353a14d2ae60687dbeefd2fe29689da6ae79d7b06042dfd25a68bde9182fba4\" +\n\t\t\t\t\"1ac53706a8b96535057fc2f99ac84a9cfc6549920c3e2cab44e48a08e77207b6a95b2f6179d6dfd6c2d9e3c91106a7a687e40bb2a1c5ccf566c0e31a0fdbd0a4\" +\n\t\t\t\t\"f270f9812208f939efd9698a8b28ce9c5633f18ace7ab0a7550d9e7e26cf62eef49200331e19a64bed648b5d18ceb389bafbcb3f280ba78e4cf03b053f2a5f08\" +\n\t\t\t\t\"3c852452837138004073cf6726143179386279f1a8f15d44876c19bf6c2e2992ce6056191bb1a386f0e1f6f249495cff126991c6560e3f613e56525c0c49b5cc\" +\n\t\t\t\t\"2ea4e736d83480f2b45d7dc840b849887f54a2aa072e72e3fd0db34e5cddb02221fdf2a40fb6ec271ba3a09de8dc73c24328c5d9a33ae0adc9874902f25d5bef\" +\n\t\t\t\t\"4d85914557e2983c93fba16cdd4bd929e878b5d51b142b6e9aa0ce84871b7b03ee6cc13251e17547c2d20a7d4e948760e207e29de58a7ccb71b87f99d79837db\" +\n\t\t\t\t\"d0f293ad3d33ffe91435598e8a4584b7b7ef5b1a895a2827b4976f81d335e4aa6feda3539690899619a4cb34fdcbbecf1b8b38cec2ec7c07ce84ec3044f49656\" +\n\t\t\t\t\"28fdba8971585afb509526640d36425777b6ddf5b2a49d795fdcf71e57fd35f29fff37890541b6e152f14fb6ea4c70a1b9f159d02ed895a68dcc276f5d5ae83e\" +\n\t\t\t\t\"47c021392ee22a398c8c73b3446d61562b3ec596036959aa645a65e5d24f733e142ec0e184b72a2adcbe3913932b2c9503c856a7e989d24f306e01e99268188d\" +\n\t\t\t\t\"f858694e297803effeb8e28bf8fb63ed6787acc2c61f509e19099607512d40928a08e649474a43728b63523175fad12ad088aade0c1e20815c7c12773bc959e8\" +\n\t\t\t\t\"640ee23eef2b1653ae8918615b45158a01be5a5f39a75a7c6cd8f1f6b463516539771ad251d5c2d40c5049877765512c44e58bd3b9ac3a0ac281771097880fe2\" +\n\t\t\t\t\"c9516dcd6f1373e1e8a52fc485d104004dcc839fe3d120f1432b213388dd37980ce8238c87a70d5abe95d78d696d2436eb23a8f620ce74335d5e47f6524b11c3\" +\n\t\t\t\t\"e22288644b539e3ab664dd5fd6bafb02897aab35adaef204f82d9318b22f45b787f5bacd74b01d23537973060868a47f2e3a45c1d8805a1d657f2332af8170e2\" +\n\t\t\t\t\"9435d7540e70e92a8c8794bf22d3e11d54ff2d48cbc7a1ac3cecfc48f80fe521f6852f97aafa0605f3e7084b15e61a74869512c9c2d84180686ea07b562cf35b\" +\n\t\t\t\t\"5a0ca529481ddbdba9c60729f821dc7a5a8b5c7eaef1ea7927d455a702aab538e7441933c4fff2d27de5659d6fa41f0ee72bb13a829839267f3a7b51a81a85b0\" +\n\t\t\t\t\"d737194d94e1bf8173248cb057cee19eb5e2cdda38c529298f3c4d3b95400198063c5b27e9262f9c66425c65568a09035bed9cd55c1f2ec4becb6b9c59445398\" +\n\t\t\t\t\"ad5b7c85142e713b6dd32493dcb817c8bcdbd728e325c25c5a14d764b63f960d1e48a0bc7f4d2bf51060f83b1d1f2591c6a9b79182e686b887a2c1461442e2f9\" +\n\t\t\t\t\"16e8582e298f87ca95a8052df33af20ebded7bb1c528920233d1aca3b3789494d97084890fa3db0ea7eb561b0087c4a90000db41ea072613f91ebba82790f33c\" +\n\t\t\t\t\"fd52cdd92d2ef1246911ef1dd82ad083881b72a08a40ee55884380dd136a7c0724cded69c6abf1f156b14ecd7284abcbf66522264145ee78ab0ef0d2a74eb390\" +\n\t\t\t\t\"10946d5efefb7175164e96621d3f158de8b57956b8b1155c35b32007e47d915cb61dabd556a370537737574741fcf9a8a23f7155bf1f0e3d3c0d2088d1191d9c\" +\n\t\t\t\t\"9c974139303f3dda55a70ab4810fddca3561114969d370f4e6bad60a53815eab1c4613854d04ba8b049dd7ab1a935c728299d1502ff9aa3fbb356f87f2a52b6e\" +\n\t\t\t\t\"947dc79b5fd211ed31dee722d3fd857f43aad973fbfacb7cbfe1b2553bdc76142ccae5b4021a4647b8d8087925dd3191a57198792b6f918de87a92705ce57905\" +\n\t\t\t\t\"f2dcfb67a20f8c77e700933432d60a4536d0959415f15f3eb8a788f1b19c497d3b68194e27ee736231835469d8bf0ce1717ecf533ab77dd97b35881d8eda959f\" +\n\t\t\t\t\"54a7935b1bc11d7f2e472757734afaf0463da3fad9804eb948e8d6444e8394b33f1c187618c7c02371ee6d378ebb7a20b6049a5504daa71999d15944ee82650a\" +\n\t\t\t\t\"2388f374f3ec3afd4ca58ef3f2588997d194a2741252cf6562e00cd6b5c5fe4066454d2b3150317694052b4dafb40c2f04c850e4062cd8f0af2da75280046850\" +\n\t\t\t\t\"77990788b27fa457ae9d0b622d18fc070f1d2661ecab529b5cb82f30a29610dc6a9e93ca9a2617ab0109957a45c1204e5eedb8860c6f4d57122060f39a4194fc\" +\n\t\t\t\t\"a285f1e9e7a75cc3511b8cb4865719c2260a630845051876e7795bba59573b6ce5faf7e5708eda7be25dd49c8cace4c04c541074d703e6601e043f6c63a0a371\" +\n\t\t\t\t\"1a381f0ff83d136f4aa29de266169ce5b3105cbfeffba370fa306a93830e3c0519a495b8b9f4b72078e2c45421b4b0667f903676a1339c70ddd1a90dbd21853b\" +\n\t\t\t\t\"2826ac3fa5add5073c634d4c5e87db0efe18638ee93c460257e52aacb8600ff36739818056110b2e974a1959e3784903aa97b0fcd9264f7d8f6bb5d8b7d9f03c\" +\n\t\t\t\t\"4b643955bf7966250936d4e7d651712db5e695a6a36b5e6f56c651ff737042b5bb73638e21ca6ce9a3e63fbb1906675d97001d7ee240d277d62df18acb169677\" +\n\t\t\t\t\"963d231c5276bdf5767ec35fbedb062e61c23d759aefd287b2dd62a0d6f0518d90b3c1756fde50afd33cab395ddf3cd538b9ad8862a199141331c63110c9ddaf\" +\n\t\t\t\t\"fa3d6c63a1fb1b45529eace826cc29a1df5df327bb782e573c41864c18e6d31401d19719326e5c35bb50de7fdc67177a6a6015b4264fecba2360ab72ae8b060a\" +\n\t\t\t\t\"6c66c5a05782a15fe3c1833b47e3495d29f2cfa579fcb08f02fd064e9ef2ef5564ac6a43cfbcae7d79e9f87ebc2176611823c6624db11892f8c47f8c96a49539\" +\n\t\t\t\t\"1c18f821ecdefb343eae3fd98dae1ef96fa3527788543c0d06d9793579cc62d91dc4d25312901c6368ba81c8536c6287230e8f97d25f6c77366609580cf26a27\" +\n\t\t\t\t\"88502a9aada84a794d3674ae11cd1742cf245e9d9502dbb5b340c2a6c79e3607f6b47666e1ea991ccfbdf6cc41ede46d043bc4d3e5e6882414dc65d62f9f47b9\" +\n\t\t\t\t\"fb7b828a89afd6361ae458c2cdc82f459c54977072702ee5a4c22955b8019d8b8d91f558897c4b661f8e5412ccdc10c40521303c0ffd353a0c04cebca5622a71\" +\n\t\t\t\t\"192b144d0f9c5c0706a130df887526b7b6e0f358ad9f7d0fd4d87c5fdb29a7453388c0d009da0d4c47a5d6cf8363892ac42b6ce3388771f698802b4dbfd66aa3\" +\n\t\t\t\t\"5fa6a6f8b42dd8446324501c807b6e72cdd35cfe08956a52f86bb4709fe2980f62152dba3571f18fcc4c1cf7a25384c4b5174e93e5afc9b9f12db2bd505ddade\" +\n\t\t\t\t\"d670d0d71b9548f9a07ef98521961cd96e8f363cf3222336bc4baa284b5305aab47dace615c1b3f3fb1ee23ad9ca3f58b086d9169ee5b2d3c2831e1db4f905da\" +\n\t\t\t\t\"11e1fe79e3d48c01bd9879ed68391e4d24d6db8d6774cb8747e7ea368aba3bbf355386408af4a59b23fce74a5e673a1044db66ed8529a65462269480736cdaa5\" +\n\t\t\t\t\"0784fbd77e1c41197335b4c517af8a67eef5b7165c5fd6022cceed0396089c3985c36595497db0a0fcae478e4e4d68c57b93f466aae86dd4244633beaa8116a0\" +\n\t\t\t\t\"de25d2a54353b7ee85fee58ad4780a2957d69816585a64f65e75f332614aa6786d1a1432f6acde385d3d6e870bc968c60c81401726a958f0caae336c83a9523a\" +\n\t\t\t\t\"c174faed43ec67473dcd151506e334a6aaf1731dd3aaa831f934be83beaefafa11810e7eb140f4fe80cfba574e6106c1bfe9f0b20173a4ec2663ce0580df6daa\" +\n\t\t\t\t\"7966a3a8906677ab680025782c61b95cec6a73b5deb16599e6521f9c6c4cae0d9286566388d5181d6ba11c51a25c62b510d9b1793f3ce9f73ff0c9226c8aae69\" +\n\t\t\t\t\"5d014287df074a244014720ee38e3968557db00aa63dab71854b8573c42c65116e3d88bf040d53ef3165a5827c717179e2939e310be5eaf6fb75447ba98ce925\" +\n\t\t\t\t\"98e83a32a90eea848500a30eaaaceb307d37b1201b83a744468a1a52632ce5525c1fce5f702421e42e7cc4c61caed539dc09001cd31a8a2b48a783c36c56a3a2\" +\n\t\t\t\t\"d50de42c63981c86642cc92bcceeec8a66b4afad3c1be1df4bcb8beedd442c281080c94692bf453196ed1a66a074d56a8e7f60238ce18358373efc173e70c691\" +\n\t\t\t\t\"f832e1139bc04e6258d77cf7529af7ce5eca28ca5cda818625c0bb5beca96d99fc9b6689a7771434aa96e23c55a41cff7b7b718df58260b3bc91762034debf49\" +\n\t\t\t\t\"7d8ca8d5764c52bc9665bf86db5407ee1b786d90f8d7772597eceb98f0121e3996e771d951568a162f6b71042998db8208ece5b8b0c68107b8e2079765b0d8c3\" +\n\t\t\t\t\"2747597072756208b0d84415a5334a88d916bda390e26ccf3046b860e7ccbe22c48cd3d3f51bb65a98ace74d52613f782db726babd02780b8d620655bf9d551c\" +\n\t\t\t\t\"ae9ef3056e3d24f5e7c3105c4857492fedd244ac2b8c30a874c1446630b042d819bc6b6d2d96829de903db22af706e93c5ae876d72c633600222443d1765bc62\" +\n\t\t\t\t\"a8a20c458ae55bce8cbbef753cccc5e7d929408d6a3709467373651f0163128aba4142ecc56ef11ff1fabf5eaf6e955b4252d1350e9002300a1236ab2fa0ed34\" +\n\t\t\t\t\"c9cc7dc1d4f09bd31296cec1493e725b57cc496fdac4e8d26197376bda7f74c0965c4352bc9d5c731df04f9908899cce6ec3afe15210d115992b2d95308dd032\" +\n\t\t\t\t\"13c557ac527424c7db02475a2fc78b88d022d212c3d02d5ee490e2436e6e572e8a1330465b9052f8a3de01aab76662d18fa3d076fb77103fe432d549bc861fcf\" +\n\t\t\t\t\"f63f3401cda31673ee48826b68b387802fea4471deb1fc928586f1b1614c16311c9820b563ab0112c28af5c1af5121818540c4b7d7f549b33906c1b86c6674ad\" +\n\t\t\t\t\"799acee7342e4a79d9295493b2430fd08f373338795764621bca444868f3f42b0e40abd4b8e148cad2861fb4980b83bb58d40eeecd8d8cb1ef1ece17b0ab72e5\" +\n\t\t\t\t\"06c6e650a3a43081f545acbac51ed7e121df51edb75120cce30ef7dbf41fad331120e537fb35be45d93de4fac0cadc7e5f644e2b767a285facd5f12845559785\" +\n\t\t\t\t\"57f4afc276e21d77f6162062430dc8918435f035f435ea419ae9f1ddb6afd46b243f8bd6a3a33e7970e7e76fab9ba6afa72a4806189462f9d0f231a23e3ee1cc\" +\n\t\t\t\t\"51cd10cb9043a27deecaca866751f971254fbe3084c243ef5f516bb652988b770896ae5abfa12db2eb2abe404cf694e9f60d47e734e260ae668b750e11b26001\" +\n\t\t\t\t\"0d2bee5ca555a44523742fb069e484f7a69c12d4bad026c03ed7af10ebc9cf2f54d143fbe4de83448df80668217a11f5a1187f35ff306e6c685cfc2417c14aa7\" +\n\t\t\t\t\"aeba1fb7dab05c913fbcbb8e677dd0f89324048862220ab6f5340c38b70804f625f5a526d6675a49fdc22ea6ceed477097fc723a7b6eaffd65c48dbee13df566\" +\n\t\t\t\t\"f8f3449d91abb367cf37a8460fc8072c4ac75f88be8b9c840ef438cbf12a2e7d55799f641316e3381f72265425f3e90fbeaa9919533d8f9262da27f1f933d4f9\" +\n\t\t\t\t\"a83e07aeb968016fed89e7b16babf0b6af3800a27c9c3d330b6bf8be447d31bedcc526b1bb53ecb10c3ea098bfa7d014d93274bec70b6e82bd5c443e860835f0\" +\n\t\t\t\t\"ae82b7be7c78cd996e0990e3cac8c1c431481c8159ae1dbc40c03f4ac543e5758f347e12715822d86c881030de83a76ba1c49e4d4836bab7b5287122ccf523d2\" +\n\t\t\t\t\"33935d802d2bca303cf57b36a5ff17e7c611f1cf99699881ae464da2911d77580587a7228db8325f204adb14413a13fe318e995d60e35c88bb47b99ba9ee8daa\" +\n\t\t\t\t\"3e40ce5818876a3911107a159125dcf768ba04074e5771334e0de430c439070422508577e474e9532f7dfbc489d0c87d37103920415b6c116a422ac15e0736a8\" +\n\t\t\t\t\"1e1e317adc87005f868815950882fc7497794c5eaf76f9def434d198304ff495bd2f9f4026aea330450741fb969700b953ab265aabf1fe146d861ba2aedc53d4\" +\n\t\t\t\t\"f929abec2dee710aed8fa605fbb9bba914eaff01fdc113836d34d855383e4a311b4ec6ef6e80dfe32bc8035d84ddc4e2c305c112b93560112c1f3dff800d6043\" +\n\t\t\t\t\"7eab01991f924075b4dea4db01c377ee1ca374d383ff1fbb463bf7078f6cc7509a0ecf536871abe7c95bf89f29c71f72f1a2002854113cb0d6d2192c00123010\" +\n\t\t\t\t\"8dc9477808a218f84afb81f0274718c024393d5be66edaac7406e520b0c8e2c02ab98ee7b290db261f2122ea68bd79f2cc6dc64936af5064cce2b4d1b7078703\" +\n\t\t\t\t\"951b6b81b9b60b99da4c2d12bbb50351a5b7713541db0958740910ff69e748c71bc7470a3c05489febefd384e06d267371935f652736bbcaacb20c34bd50144c\" +\n\t\t\t\t\"71923b5a521ac4b1ba694d024ba51b4bef3ffcff74d5dc63810b2c0f529073e13ec3232d8647ad124b21ff73402d371c0db39d46cf4d2d4cf7ad43fd8dd365f6\" +\n\t\t\t\t\"9b6b7bcdf664df0e62ba58f3ca0c62ad6fdcc9b091fb4926cb47b5ff8de7d3b12bd8709a46e5c3d5f0d22934c7a0574ee70b87af97d0fa46f7d9673915fed1d5\" +\n\t\t\t\t\"a6c57197524ec9978d1bdf65633721ea2ccc25626dcb5e7f5e090b00e413c10a6d20b45fb8e98c22928de6dda184e856c86792c7cd09d38e4333a76882d363f1\" +\n\t\t\t\t\"7f4d773ba104b2d04fd81027da087258fb175bfa8005c035a4719bac5b9630ae57889fb3b52a0fd47ec4060137b0f95fa5d5684172d07ca91e91eaf20dbfdea8\" +\n\t\t\t\t\"a3e23937f33d8774f30c7e8e5d4b2d5371e5ea5e8d290970904c4c1ff33baf675ed79599653808f652ec4fd0088877f7dd7973023ccc8377d1ada2b80c07d077\" +\n\t\t\t\t\"d7208686354f511925a3514c9e93c13525353b3d9528ab678e3e783c290ead88c2c3d6230bd4cb3bf79fce6dc3e95bfebda41e5d994e61ab083d73408ff6b627\" +\n\t\t\t\t\"6996a263d2920170fff6869c2311441837a2fc190bee104328591b402defa38b421b972b01d020bd20b1b6a6ae884b23eb829fdf032a81d4f199a87ef125d4cc\" +\n\t\t\t\t\"8662e24deb93700980e6ebc6882bcbaaa0283492e81f81e76bbe2ce18df4fb665436310658918ee217b5da262f1a1adbd59eb3c555cfebb12280058c75b5b33f\" +\n\t\t\t\t\"8aa8c2d7cebf12ce46c5f49ecec5a865a9f0b65476793884f0021f8731b1bd288f55dfa1665776b2aee1007bcaa6d92a76a2ba9925bcfa68db7cc727b2a07ebc\" +\n\t\t\t\t\"e24c0314c96ee4d6164c699e585461388dd73476a1e0519d92f51b64eb2842a7b17bb55d512d52da802df63206ee926f6a6a8c32de7b30e7cd3f23e37e0fd82a\" +\n\t\t\t\t\"556323736ecd9de77494a2f8702463f40fb837c2a99270b9050b0cbbc2c305a32380ff5fa94bf9c101c667f36293c12ff9aaf6e0a810b75230caf915135cbe6e\" +\n\t\t\t\t\"63ffb2a0e8632d32f72a65aa965fc556e10ddf6d5e40be919066eebda09d581a32156e1675300f52c8b355e88696fc2a67dd8e350a6e902e082af28a9809ba11\" +\n\t\t\t\t\"ae0a5fd9c6627fb808d757147e5d59cffd9c45874478ab226e72909ccba6592a54391d072c7eb0221f1ff7be9924b9d037e4f8c31e94fdc814a8c4cc7ad4c9f6\" +\n\t\t\t\t\"eacd5af66dd76bb6222b2fd3ea50a828fc3a91ef8b084214bfdcca56348517be18ca472166dd7f18c8e444e3641486e7dada626ced8710fc73a2b09b6e9395b0\" +\n\t\t\t\t\"31ee2c48c9183851357d230204c911b345457de602824273193b795fc21e90a0c1cdaaba36787424b23ce73e2116947f143f9641d39a4c07c2e40e02f3bd7c68\" +\n\t\t\t\t\"6899fd57e3eb23c6f5615c9dbc279fca0d4218bc79d928e70018533a85b4646bdc78015149b4d41d77ec7b46900e7fd5250116ce978f825569bd887bf3fd0365\" +\n\t\t\t\t\"e1259a7514116fdcdd6da3ffdf432bbe8e59b9bca9222c5dca1eaa61caf29b8461ddced6f312838fe490f742db696fadddd19bab8de6bedaade878be07aca4ac\" +\n\t\t\t\t\"76d69b81a6890e66dccd702720c3bd5601c6abdab95fbe4ccde6e35385b75e1977d5085ace928adfa382ea2890889017b9c4c81d9ba4629771f84cced6280db7\" +\n\t\t\t\t\"a6cd83ff9375ffb0a75a6bebba9a209f048788ba39127c1036e4bd0aad9be40754fd75295611e455909a818a3541af32eae98df7222353a4405da0e7be9f1cf1\" +\n\t\t\t\t\"bcb823fdea7976a810e8a3c7bf93fd947f961a344a93aa1ba99bf2df48ec82769d8c08e7b14191050d5706a9467c9122f34e27f060dd4d6e936c414c4e551b9e\" +\n\t\t\t\t\"5d6b5b58347ed0012a8a323f41b43bf5e960b2806de59da85b998affdb490fbc965d569114223db3ca65df69a617f6808bea23017327ddaf32990070aaf5f444\" +\n\t\t\t\t\"a9db44a57b5c92bc27bc71c5f8a2b6929edfed8e182bf5942564ef045c75448450eb1a4e4e09a1875e8a4a74f229879ccb7a2f2cd0359abd91a782c2ec1f68bb\" +\n\t\t\t\t\"40ce0a63bcc014b198adc222fc957eec0483f5b93f0db91b7ab3b3e3c59841dae057eec97abb55fc42b2de124946e66ed2a7fe8cd047cb79051b55f82594ab45\" +\n\t\t\t\t\"711c92364f932a5fd274fe184c85583ac7cfaf258c57e296f9c18fd181308565315e27272cbad3b21cb4490ca0e5f675365caac42f299e22d8a74ca51a9d0883\" +\n\t\t\t\t\"bb376804e234502db66067e7a434d38c3dc075346e888e4558b1745d00458df99db02f0e4c37702fb0989387f74d002a924790a6b7351ee0f41684bef079be26\" +\n\t\t\t\t\"ee9d70b560c006cff4b08b9578afb5019c21ab9418ae4ecaa7a1cfed2d880a06a03c2c7711b601a2cb3d9193e1577b4f1d0e614c0be1f69205fa6524fee80bf1\" +\n\t\t\t\t\"e1f1906b50e75fea2d19b8a83071a460145e1730581e5e9538888d2e797ee3cbd3b31399ecb4d6244ee44362493802b142ea397c2e7a3c1bc86f0ea0546a38ce\" +\n\t\t\t\t\"574e1df0c27ad8a28dca70f659ae6a1369d8b3aee7d0dd24ea370cc2bc1b1a4dc9f63911b63e60fe4ed8552bbca10e01c82d11b0ddf748d234b4aa3b31683c09\" +\n\t\t\t\t\"86358fad680dd2178902beadc4646b3eceff572631ff9e6b64d8a622ad9f0308cc46b7d422ce792fe5573e9b9480e1ae9fedf31edaaac3b08c5a2c6c27d6b033\" +\n\t\t\t\t\"6b92a3da7b838bb0a2916ebb6ee72bf33a7fa70630491f49c67031ce4b9dec2315088d0a5cbf7473fd121e0ef5f4e92d43114014c9f8c6e671086a446eb1f66f\" +\n\t\t\t\t\"70f0cb0c668998ed96ee0ad2687946681fe40dc46cbd170e0cabb6f6216be61221f171fb2f4273f58c10d5c4eccafd1df62fdc8ac2c5c8f6d5eb637b71fa89e3\" +\n\t\t\t\t\"f8347343f89667a4450c5c6e3791034d2dc3a593185b55bb95d8f8f2984ef981e4b692c1383ace4cb2c4adb80d5d582857b5d0e3ccb12845a59587b47232ad20\" +\n\t\t\t\t\"926efa78e05a57b136e284401c516296b6b194d541ec165d11ef94f166cb52f45145d745ff3deaf643b5c45573ed0e69a22f0e0c9c5367f6d1398105516729b6\" +\n\t\t\t\t\"3f2edf1b01ad9633edf80efbba6555d4253fd99b45a36f16ba98ea0bb0d80533aed806544a084a398a692f698c78b9bcfc9b4d3328dd869dbf7085893b8dafe1\" +\n\t\t\t\t\"59e0517c2f6a3ddfd4a8c670072b30c96b90f81fcc08523e4fd75919752bfa52a1db7c374debbd83ca8e311b98b0d8275bedad215847fa8984cb50e108f69550\" +\n\t\t\t\t\"f6517d719dbb5dade1d3c283357e14b6d9e85d61e33813546517e1262a7cbac814d79cf6b7e21b0fbbee9b6314f02b2d4e6995d2231670884c78cfd86a2acbcf\" +\n\t\t\t\t\"0a178ba64de2f13f022e22b9b968ceefaff374aff02b703811f3dc541a69a21d6e1c5d1aca48889b125ff1274e65413f61e42bb0194b60b65a3454c696033cc8\" +\n\t\t\t\t\"e3cc3613a52850296a0154bde0e2a81b7a6489bfce505dbe1bc44e0e1052f678297bb19cbdf7970bfa5268af8a54eee004063f9894118ddce7fae8bbba53a428\" +\n\t\t\t\t\"678cec8a2bf6cca2b1a5f4a2e95562437e4eae41167f39d2a150f7c46c1eb6da35587f7234d870b16ed91c7db548ddc99967381b4bb4f3a2b0a5ebcbc7ab1b06\" +\n\t\t\t\t\"7d5418768eaf7d526ca116e239ceb3ab393c45f3b32b713c11fa8e5ae8d7611e6008fa08d1305d5655315a72c85a04dc853da3e8ea9d46674194e15226f126c1\" +\n\t\t\t\t\"a233c26dd7d3cc04ae572320d0c351911b6fcdbc0b8450523e96022f4b964d4e479b6cb1c40a6d27699b57ed2952ef7fb3172c69ba7beb8c8633a01070ac4344\" +\n\t\t\t\t\"d4c401acf8ca7fcafeaa59e1d4c2ff251bb67dbe10a862103df1b416fd2097fe412b3da9d4095b48ea094fc3bbf2ca41e4452af3a179580e3bc11a7d97ba050c\" +\n\t\t\t\t\"ae1d6b8075da267b3ae2231a1fcfce0c976402f34963c007d4f85d9ca95646990d1bb09691ceea3b34211dc58409e052d0acf8c2296a7e8fb52d7c673506d89b\" +\n\t\t\t\t\"847c369daec7909da8657e8976f59f2ef4c8a049b46fdf30d6d223ea4175e4d60e469bcea0eb3bdcaa4d6024f2b43cf6de9bb40efa9172381291079dd82ac5b2\" +\n\t\t\t\t\"39f2051a7f1aabcb8d50333e8c160de19ce1c76ced8056a0724ac630dd45ec4e315437391158a633c179a3d1f364b475454fd29c1e539077b9d5f7227786a5d9\" +\n\t\t\t\t\"d8ec78e5615c25e517e9fcaf07611b85dff2c131a1b11a901a431a601854e5cb627cf7b8b0c5e66ad6cf60b7ffd6c6441f9ecd58f414013279e9de533d8d797b\" +\n\t\t\t\t\"936cfdbfcc78342b7ab586457541df5f3b7d1873612df200896e2929f44c6fe10d24f7e6dbe52b6c42c0a40c947c1cbda2a41437079eebcdc29716d80957c159\" +\n\t\t\t\t\"627e7366cc16df92cdedfa9f52edc848335f1c7152652fe24661a469fd503393229063c7ab20d8d895139a2f580dceac9f6dd4c4ac652b1d60c2b8a1b0b2923a\" +\n\t\t\t\t\"86c31742807549e6d523b3c88d31e8534b9e05a6c63f6c8fb8a1eb4dad733d92e7071e410f0087ca3074f4a2df511ae89cefe9ed09a8df603d61f23754e43cc2\" +\n\t\t\t\t\"e42bcdcbe58b0587aba9a62f32c7507116fdc8a9db3d65d6c0097c8f473eb7f3bcd11ab81d5b636b0812b7982201a63d0b8d40f2c38f65ffd953668eaa5751b3\" +\n\t\t\t\t\"dab7f038aa7adbcd1f1102267c9d55d43649f9b4f65f1851546c5a9ef2c7ef56e84b16f12641e9d5ddaa78ec778b5f113b2e06bad5821e1a5203b006a774e36f\" +\n\t\t\t\t\"56c9336d92c8cd8bddcf014b6d58c394e2a93554af6361fc1bbd13c359fed98bb5adfa4dd1266e2744e126e1bc029ab28fd68b648a2ab26ac23252171b298641\" +\n\t\t\t\t\"2621f2a8697a00ab3fdc1b3b04921390ee16d213601ab249a51830661051d34eb777f690fc2d8dfb8e0898567e388830bac8b0bc896f43003feadf34256a927e\" +\n\t\t\t\t\"b4d9293e32ca135351a19d1246cda30551c87de1e148ff5ea576b67e19e1a0389b88a5548b3b1a8cbee19eecc7de5c2333264c711d50d688a1c57eebc28dd6f3\" +\n\t\t\t\t\"3dc0e4cb857973c3d0f28683a6f3c09db9f54b8fabeca9e4f9b86d794ca55d6611858f0d48736adc10dd6763ed7199bad81369ab1f3de30f521d43382bcccb7b\" +\n\t\t\t\t\"be0178f716d5c3cb87488cebd7d9e2bbe671dfcf2512f1b815075777ea92a867f35e09ff0110e61db24423d0598eb6fd078dde0dc2b5d7f5e0bb6fee207da109\" +\n\t\t\t\t\"2e656b5c982866d5fe01e6db79809646559a6f2b9088e977789aac74435dc625b54296b25788bfbbda9bbb25247d428f5141b03172fa11f12339b91ca96c92e7\" +\n\t\t\t\t\"ea5a128c8046087dc7a7eba63e3bdb200565d8a103e7b3c292b088eb06aa27b43688c8516bbffcf123499574f00908ff43d66b79106cebaf16725f1dee600a29\" +\n\t\t\t\t\"7b3a3da878940867f9549e65c73ea798ca923b012fb8a7ef3e2ded1d2c4e85635219f627dc4feb90f884ae6436e7b44f9159f9889d8e194828e079cd2ee60a7a\" +\n\t\t\t\t\"6fbb6b8fc1f7355d7322709fabddd76e4283ddda3018b7882ad79b32bac133da415453eecd5bb1f0deb4f3b987a71a2f2e60194cde63a42b91b39bfe51b4aa8c\" +\n\t\t\t\t\"20952b601df11d170c65a7fe935915890849a367936e97bd242edf305eaf2f4f4fb9e5ee1464c51a899ba5cc69cf56731502c1b75d0d565b1dce15440b0de0f5\" +\n\t\t\t\t\"58bd4f810bf058af99c158a2be0dd02a01bb5317f55675f4d42c6766fc61271954b6988c33a84518bcedbac8de305946d060d19c4691c026953ebd680a4c9012\" +\n\t\t\t\t\"0e8bd54675d6c33cc86e65f5cd3c34cb1e6fd47784a64f39e95a1945b5c21df2b3288f963863b33366908b05c2bd499dd25c1b8e97329d7e435899afeaed174d\" +\n\t\t\t\t\"2a2471b6e8d6ad7a0b1b6a8b19fbd976362283e5abffcbd2cd310245092749b23e0d114e727622953487f373c833281a74a1b97742ca99e49cac14d9102e3680\" +\n\t\t\t\t\"404509889ace009c47d075ba9891e7f67b89aca3e213150f3c715cbab1869135601612d7dffda3cc104b6508f56eb8b7e7f379b21e1ce290ce5fb96f53e3a7eb\" +\n\t\t\t\t\"c7f7bddcbdfc266f23b775602d8d12527d30446cb4144df7fe3c2756e232a8ffca625d7b6ea2c8c0a92e6425ba67ab75160623c39f01fd96856b582e257a6930\" +\n\t\t\t\t\"224c6da90a6eac4249214c3b85aef52835d904a8a5e224d59eae0c80a33b3141ffb31a7d8e62833fa4c850fa6be135558fff5434777df45feed00316c475759f\" +\n\t\t\t\t\"ac6e014e9d3cf23e7322281ed75623ed69a81d6f05ee7de193f6b44ede4a94ced27aef5ab9056144593a836da80f5297875e7bd84d8ca6df95de8650b00b3528\" +\n\t\t\t\t\"123132f26aabf755d00450648e44f3beafa4dc746775958c6dd88bee825c29112a3af582bb2ebe628d70364fe9ad01b8a9961d5b71018690440151486114af1a\" +\n\t\t\t\t\"d85679bcd3eca510c6d6887e70e0d04b04fc2db5ab1eb21fff925b66f08f4fcbf31be3d743154056ba137727b63576e72f1756029c86bbcf9452fc6cfd89f3b5\" +\n\t\t\t\t\"9f243d84c410253ba7c9284191a0ed87b2513901a93606f1aeb736c90dfe40c0a343d45e9a992ea894b22ee5d49e0f7d55d9bddaa6c74bde8ca5839db67b77a9\" +\n\t\t\t\t\"ef740f9a47241f05e5dc1b9c95c459cc9db560b1db090daa3f4c6de46f695a158baaf357a1fc63ebc0d9db8144137ec4bd69c5af89cdf9cfa66e06bff6339d62\" +\n\t\t\t\t\"2c372fbe5a855d14fa7ff3726512f966e4da0556b29ca6d7517803f897d0e1911f9b46a291002a8320091aa7016cb7ac993e35c8b0f5aed3c94ff0b5dadd8b77\" +\n\t\t\t\t\"056d06d1bed59aaf7bca8516c3bba6b33e12df2e5ca4aa40664b3bf48c4dc2c57cfd74c765fe9f794f55b5df6ac6dd2b3592bbc71354c8dd9ae41b0a05e1c7c0\" +\n\t\t\t\t\"d3bd1a0ac6b671c48c01d4a0fec7a01ad11040f213461759f9e029c835ca1d22f9a661b69d72bc46e34b1be7ed85a21830fb87baa74d7ab145ac1647f5f2df68\" +\n\t\t\t\t\"671100d4d9e41082d3c81f3b5a6e603bb33fd56c1dbcbdce5e213c651da45d9d1dd7532d9a955202338387af6315137dc458fed62920a0e721aa7ff1660981c0\" +\n\t\t\t\t\"e4c3de0a4863f6f660a7c1b9745ea26036a25cfa37e1337ded405ebb0401d7041a7938800a97a032fcababcc06391a77a580b1a61de014db9d7e280ffa6b2381\" +\n\t\t\t\t\"ab6969ae5cfcca00a47ac2fa05be02aae7beb806d2afcc11dc0642d2a12ecde2d2926efd9fe790e1bee19f9114d22ca42f438ef656a1311e4931ab7fac93ed17\" +\n\t\t\t\t\"3f68ea0abed18cc2c8905bb2d599780690eabe4996e38872a3190fee361df9fecd5906f664106de4835f8fbb657366327871a2d38cbb671df04e0d14fe97e260\" +\n\t\t\t\t\"c42eb07bd1d70514913c7a64a51e405cc92e06845e5a78981fef9822fc79e9937ce0513138f6bbf247f5c457da708cf84e30d083b4ba48d2d43d70e7c31e9482\" +\n\t\t\t\t\"4472617910a3de4369217b4daf892c2c3250d1de0457e88b3bcb5c4568f9b26aa675c551a9a730fe9ea8145ce7f8e23ec825be9be3b9edd588c391295fe31ac5\" +\n\t\t\t\t\"bfc97d2e438ca9bf6551728b3be6d6c6ac064baca763e0eaa24f754f4bbc84a4377de45fb6a8f37150865df18749df1af4ea911b62f616dd4dd4b25b27c7b6fd\" +\n\t\t\t\t\"99d8c00ce8a53fde3ced091891e8daf43cade10086be046ee5607003de24101db49b1a4fb0ac270d05bab12583e263e903e94dab8bba7c785e40499ab01ff92b\" +\n\t\t\t\t\"b82c2e5342dce84881adedf77cab593f541e4c963f4f9ffc80a16bd4eb7f20ef4bf3f57abc7cbd86332d8be80f0794fc82767d13c71d8ee20468ee35c13308b0\" +\n\t\t\t\t\"dc29ebe8c6a81e02ee9a21807ff57e4d932edcaf59ae9e76f7cdad46b32f94a74982f0887d7083c90ff54058e873b10cec67fba1b717deba5356e170dec1a40d\" +\n\t\t\t\t\"36c57674ad8d43c5c98022b553fe060251b994271585f702de3e71fb1c8e36293dd44a4b99a1baf33f6205e9fbc9acdfe8cfdf007224f93a7104e7803454fdc0\" +\n\t\t\t\t\"9fc5a20be59f600ee734847257a5ad62c599a7fa836d1174a6291e61c1be4b310bd4d7b7cb9be976dbdfdd2b99340a9863c8c0e5009165d7097317e6c3a29cfc\" +\n\t\t\t\t\"dc84b19bc68f38694998f626567b80ce6699124b12bae4bb9e661c2484f5109517318341287e142a849d61d0d7b11d4996547e7325f28842dcaed26367f7a888\" +\n\t\t\t\t\"e58c24c857da2f48a9fb91c78cf351a23e82ae443223580a9fe15a6a778f6c13be66888219e3e15971170712b6c356520cc15e4e75167993b66e6f125799cd40\" +\n\t\t\t\t\"86c72588a85f68361f1c2f09e87f9a4de95ef9a3b92c3313664a706cb72916b96a9cb50771f6917ddcf696ce8d7f2525745fb6edc30bf3fdaad66ca5b013300a\" +\n\t\t\t\t\"7ec7cd274327b1b9cd931c068d8fa9fd6336d59f6ac79b84a24b34c47e408b3bcb8ead49428c123922e54bfcaec7e39c4d6ef79e5645a35f715d151e679ef5c6\" +\n\t\t\t\t\"6f86cd013fdaab978ee4e52eea5e2753e693271344a1f215e1c690de06f29c856c469ccb484d445bacb16694f4def1537cdb32260705e8a50fd65e98a24967a2\" +\n\t\t\t\t\"456af6cf90643638999389a35de6e192068fd2e2ec29aced58611560c792ea5c7fa37583ebd5452a8d94cbf1898937dd8aa6656047e6e03f84dfd0bded514a6c\" +\n\t\t\t\t\"b47ca71c2cf1e76f606c04374663712fd96925eecf0ac1c38392390c8cb095f39e1814252ded78b55ebeb9915dc5e2ec14fe99e3a075bd389ac601681f154286\" +\n\t\t\t\t\"885289e568a8646d94abc806b4637492e3a407cde582d42764eef0d56ab14b00e9aa1f64d8fdd533d4314145c8255c44d0c746af6da844d285eb044d57e8cafb\" +\n\t\t\t\t\"ab6c3b962e0177f11a839f4a5c0d2c2e8d5f76375ac115e0a89f460ea1be238f974a68e0693d15790117106c1a65ab5f7aa08e738aa888d5b56be39d2078837d\" +\n\t\t\t\t\"fb2357d86f5be85a9af41aed611b231495564493e46acc90c6a3e67d5b055320290aef508aa6a1896f19cb5633edc0fec023216726e50960a44d81e0614ce748\" +\n\t\t\t\t\"6ccfdaf620eaac0517e8cdeb1095d55f3a60d61dd27d967eb26128b84c9ea8418779e074cee8961c5dac811ce5ee8134d3910a47de7a1344293f5c64ae8f1b38\" +\n\t\t\t\t\"9d6c457dc74e7005c339394f5f24630f5e40cf270640d1e4c27cb6a74fb440f3203026acfcd31f39cd4844ede7e785290878fac8770f930e96c3edf61748dc6f\" +\n\t\t\t\t\"b7476832cf77ddfbe8eb8e12fd002038630301439ef8a7659bb10593a92cb84018e1ec78856f403e1eb9d6343aa0bbd77a63d776f1d12838f27f3cf6296ab0b3\" +\n\t\t\t\t\"b4436f0ec545a5a1e92a5351fb273b3ed56a40e5a5d25e0057f4077bfeba2e2d8cb17a553b157609b20bfb5cd2699af9936f50d823bb59a950a24b8fd15ed705\" +\n\t\t\t\t\"b1628663f0eb5b5c2b18f000ab039bc425ebafb2010e1a2264c38fa2bbd0f77e38eac8acd670565490fd60cac7fd28d988c8dc0658505dd98425f22c94647d44\" +\n\t\t\t\t\"5d0236b97ea58b3c71feee90be0055ce1fabda5ebfced9d9bf5efaeac8408c4b6bcdb39851cfe038d88ada5211de2f0f69e9e3c62453106c366cf0c40971c0e8\" +\n\t\t\t\t\"e8f2a790aa66999a0cb4cdb57a8c2d812e9e4a66df2f001a57e291864339257ec26c9bc2dc6cb2eb5c3301c167e1ed0387f9ce9f76c6759ebe5c68e8be378c42\" +\n\t\t\t\t\"e0350b344acbc8b40c95cee9e82bb43cef5e91a32a6be8a727d5fbe089321ede3abee4da6b9f41775d7e9abc36f6a5d26ab88ba32978b5ea0ad63f0ce8a772be\" +\n\t\t\t\t\"5aa51143bcd00d78bdcbd69beb652139ad658dc7ad242b2057eacee092aab4940d6ff993a8c7d8fbe93c08c93c45d5f3a01058f3c75c94be9da1a19a97754734\" +\n\t\t\t\t\"b713e1ad6b7cd472619ec1abd4cf42f50b0648661c2b8dbe8976037c094c7176090ba94618e1918db44f5d2c367a0c7f911132d9a8b2398b9417542c7ad99b53\" +\n\t\t\t\t\"a7ca48253bab8382a1a24d35b9b9818bda513f4b52fc576a71fa63e72aa8042ee1fc806c6fd3fc16e07ed2caf9f82bd3bb6b393b2708c051c24c2e05aaf72531\" +\n\t\t\t\t\"d865888db06f719314d6094b2c4f0718c151c88958d2d6c8a6f49464f81cc46709dde026f4e05325ea4ca2dddf9a79bf98bff3aa5eb412434f0b7457b4ed47ab\" +\n\t\t\t\t\"85a212e0c7720c78c961d56141bff0f964622d4d3984c1017de6f5846c72fae0c771a819ba6c111bd739fcf16f4b85f8101e7c3f0daefe753ec130a6f34c7697\" +\n\t\t\t\t\"4dc531f83715ecae28bf2e55111778ae42aef17fa95340584cfae3d4599af9dbd10211baf3aafa8ac8a07edf8243daffd6a6486b1e3be4b60711194261e2b646\" +\n\t\t\t\t\"e2667554cc0bb2fc07054b653231cede43154c9002890ca20b0ac81c4788847c6ecf7c174e528f36f8cfc53f3366fa9ce07b1843939cf6d318ed11f7ba6eb791\" +\n\t\t\t\t\"ce25e75cbe37d2ee3d45bea487d969de041011959c0fed4e6c86802a7485fad70059ece14a29b03d4df41677acf71419ee63f1101060ca5e4ca0ab2edd71fe77\" +\n\t\t\t\t\"46c6bd9f36bdbbf0a9956eaaf974f7bef982cd34881abd686fe77b536c85d042d77dadd00c5cb0130737e5318a025e6ae6af96ca28cbd41094d86a85765ff891\" +\n\t\t\t\t\"af825793910c406470cc61be5d9282911d2faf82abfb309598fce0101ca64abe3920701a958c20ac35927733466a23de809afa2bdf331f68c3ab0cfa08b0c549\" +\n\t\t\t\t\"a20e9b50dbe85d22d215d0e5fef854ba271a4c0f95e6abca19018bdd4a042721887418136b4a60cf291bf06ec47a5a4d2f9b29f988733c6bf6f65da5a95f8939\" +\n\t\t\t\t\"fe0f2bab0bdce98569a81f861014e532f6a995542db02b6bdf3169191d300fb0429c1cae1d2dd4d29e0b61751576e04b558d38d3afcce8326c2871e969c1492a\" +\n\t\t\t\t\"8391c0becec29edcf7f038a8093471763db9f13b97114acf7a979f5ba3bf6f990317890ee0705850fb97bfacf306a0ad621b2c3b633af01fc5aa059c0e22ed17\" +\n\t\t\t\t\"23584dde6cf140bd1d0087ca9090ca9f07d3b93c60938af8df976555455bafbd8cc986ba32fc3f15b5962dbb2d37b6ae55a7de0c0c6f2366be0278e26bf9a725\" +\n\t\t\t\t\"f61f2bcb545d66f79261783f7f03395f2a5d27e56af62a01ffcf778c3c686e244bd9b7e5029d1d40dd2250705c6825bf78e83730212640cb5ba54191b61fce33\" +\n\t\t\t\t\"ce6df7721b15662162b631d99e6431efd24ec35639c2b97f10374fa5b9e2ca4231f523195206fb9695ec7721c98d74f29533cf714866adae8edbe8ed2d0969c4\" +\n\t\t\t\t\"9ed36200c4b8b75131e6d1efa913106bb0759aa8255bd6a9dc2b00407358f4523486575b111676730094f46d0a7b95427df74f053c6611b4c465efa5310f760c\" +\n\t\t\t\t\"5ff081e841e5f90c2de35855d45a7f35ce73d7c7f9f61fbfa953398e042c3946aaa4b7a2094d95410b8a5ef76c8b57d49f77311192b3f4578f37bda1a426de7c\" +\n\t\t\t\t\"7cc54b5400bd16bb30cd8d1b7b42ff31c5e3759e3c9a7668174c02bc5a08f1bcc7e3ba145fa5f5c41e48877b41b0ef8fffd0f75c6547047c2e7b7c7e1aef2cda\" +\n\t\t\t\t\"c4a778adbf71257618b4eb3c6dbd8211f829c1d6373415b969cc48f33d586d2678e7c1b441364a9fe2bb426a33b2a132741fac547766d196df3505fdb17977de\" +\n\t\t\t\t\"7853cdcd8d9932eb9452620aa4921b4416f65055d77573b132a40795bf142815b655e670bf2c4464adb5d826a1744c8049d7a6cfbc8a4634e66eb32f0cb6fa17\" +\n\t\t\t\t\"ffa8925131c3a253101733406a2a3a0dc61ec3ca1448623b6295791d4e2d65d303f78038e15d0ef75d823759bcb4b277b51410c37d5efbbb2e3a9e0cd78a8475\" +\n\t\t\t\t\"05d44bb1fed7f72b1bf1a96ad0148e816d34c66b1b5faf172b8141ba007bf2e5dbbfee4b09ef66656ea3cde54f086040d14116aa7f3584ab6773f6091a2fbcee\" +\n\t\t\t\t\"f59d6ea115f88ef9fcb358c87c35caf7c1a6022e141a3c688beef17da5a619e733d854218b30d5edc39b933b19dedd6750acabc52234934b08f930b608a18008\" +\n\t\t\t\t\"838cb0fb73d4c78af0c468d9fa4fc5852135ae91ae00a99a6c603371d09b031ee37f87586cdc83897d8fd8ee2e07b9d0478a812d3f7eddca08860386e3ad9521\" +\n\t\t\t\t\"98d5fc04fd0aba4b3da6ab8bdd9eca8e0399a2012d6158ed75ced5f432a223449b4e3db3fd4b19c494a69e9f2670833f8a88f7b2873319e9495f03fc69b6d098\" +\n\t\t\t\t\"6006e3ffd8cdb9c1b98f72345848deea1b98ff6ef766f4398e642e5f2b217c1a87a608c1dc701bbb79d75a4433ca1d600061836888a220ee262124d145d371f6\" +\n\t\t\t\t\"576f04cf71701133787a97aaa615ca98138c2be1046604d885e2f274b0de8743af50ad5dfc4c3a09164448e102be577eecf77ffaec1724f91f00f908ff6af41e\" +\n\t\t\t\t\"57056dfa8f5dbcade85a66c10e524bae55922b4084407fb36ca8d6b7322f76a8139be9455a34440c719d0db8a36385efa48841170c8d35046407b586f5bbd169\" +\n\t\t\t\t\"7cbaf6819b663fb17d0f0ae89691a099a8ccf47fa61fb6dbb22b3298e5cf2465e4b93c49da70fa76924fdf29389194cc5c61cb4b3084d0851bc3018270d1a24c\" +\n\t\t\t\t\"b4b04e8af927d9fec9ea1c9ce18d4dbe61f7aac0ffd4e7c2e9729b49ed9874b883ec644864c6d9ad0422c4d89f87df1dfb2c96314b6a3e19afd21783f365445f\" +\n\t\t\t\t\"bef10562a26b48df42dc344ddd63fcc03220dbde98f1109cade221027c40f0f996f4beb29513c3979ba374c4c6a2c2dc6276ca6be66eecf1dcb245d6efe78aea\" +\n\t\t\t\t\"e49ece37f87894bef3c0cb1b993d974685564e2476c12c8d8f63a1aaf142fe34a6840be340b64f96d441f4537dff434ddce630101ed9f78e807881f6b7590697\" +\n\t\t\t\t\"bc97e60accd7a135d8915781f4fc22e437145154dad0a39e5e306c117b11deb10462ba74d58e81de7674ef0bcb20b38511991447f63ad906b11abd4ba88df3c9\" +\n\t\t\t\t\"e6931f87fece49f48543fed0439c88ad78f82aabb32dea03d030bdd76efef6b737daac2de2db1cce10e2ec74565b0a609606cbb6aa259ba88715229b8176c874\" +\n\t\t\t\t\"db3fc4f6db9f167e7b2d55b33a261f9eecb69a0d36ecf9ec4f8f9cee5b74bcdc5d77b02ada89f56259edeec0d9ea866ccf454b9abd29d5d21041179912a5c302\" +\n\t\t\t\t\"1862d850c3ff483e09479957df5bde03a29504b4a43e1fd40af2b8a2653a37cae89c8d917aecdec3959fecd32b7fd313a61e134abc15ad008aa993aba9629a5f\" +\n\t\t\t\t\"0af0ec713f742bee096e171729e70530b60f910ef83746a61580f0cc6d67723792c0e0e94775d5b1edf37864a50678d197bb34a97e84d7f764c0bfe05f4b2d0c\" +\n\t\t\t\t\"dc431d1f4410500dbe2758eb05bb6b19b154707c255a97cedc6aec1841f1817f6bcba0b9a9c1d3aebf747bec4423c71309fb8b4ada90dd9f7adbcffebbc905de\" +\n\t\t\t\t\"74ce531403df33457c4d0b970fea5df4f85732e3c33c5b8242b041141a8c51a62f0bb14dbe07b14d3f5ce646d76e87b258e9b62128f9c0c0a8014f2c5b3d3dbd\" +\n\t\t\t\t\"a3a77be6222419cd3fbbd3b842c46c099f142bcd36442961e8205ec5d7fd159befdbff12693953307026f1e06fd57b6447dd3cb52df466f0352cc46f27d1fc56\" +\n\t\t\t\t\"56e06f68ca2847d291421bc9e0af6bbcfb7b3ce07600827809506ba3f96f40ca22766f8cba32d4461488f6596082a52c11e9ac908922075a7b443c41e55b719d\" +\n\t\t\t\t\"9cac9fb587cf02432e1accf3cb7a16de0d5bc3a1c0aeff5a1795680b4551316e3d7b5a9bc63a09c6f75b0f00eb69fb6ef5130c1ec40c7a7d5d6ccce364b74f63\" +\n\t\t\t\t\"a836a4a711027e592d6a70e10e573cc6d730a0def4a7a2d4dfcf3b0aba37fa2060ae6935710191c023a0b8e123a67ee811ed43b5127a1c4cf82d52ad6c40fd66\" +\n\t\t\t\t\"1160f77dc320bbed349c8b6d08b2a7a6234a8dc88e4744b51d2d7c56e02f1c3bea9e6c2c3d5522ca02ec7e0b8160555eaf28797ed30b5c931a73562791f5f0a1\" +\n\t\t\t\t\"b7ce83824bae17de449cff41312bd441f34df62904f4a0265d6fb9b8a352895ac6f0025d6b2074570970b4e679c559d03ef40794708eae36567008d9c33f7fc3\" +\n\t\t\t\t\"5f8df7e901c27f408cc7fcc52631f1178695ea660d07df541e5a32721d145a32e8d32f06301b5073149e8798371fdb1a2daa5e1d02c24da07682a2cbacf5af55\" +\n\t\t\t\t\"64810e479e5966dc6bfe14b4472c42cb154e19f7b8659d42de5ac926224cc6b0d8f3fa797058fd6e21ea85146838c4612760d84e24341825b6931a6417327394\" +\n\t\t\t\t\"0154125254d4e11ac80e475a178605e851e1be39695cdc0781da241f232cedb32a04b1cc7352882fb635162ec3f5fc5004cfa7d03780753c14173ae7b12a71cd\" +\n\t\t\t\t\"b40d4835023a00a4803bdfb6916956ade9f687af567e6f29981120d306084ad061ca1585f0e9497fdb27f9d54cbac8fecff176145114ebfc17e3f346b246ab91\" +\n\t\t\t\t\"094dac0e684a708b45dcea16378fc29683dd033310068339b13d995dce77a50f9ee9cb4cf564566b05ce352a21159ad21e720e05ce6069a5ef4e9fe8ffd28516\" +\n\t\t\t\t\"8356a0b80c4d1da547776f486a117f6f7ff6557edae7d68834cd71973517cfe4af045ad0fecdead68edc8017000958b69410247a51bd9bd3152dd57389f25223\" +\n\t\t\t\t\"d5e88c0d343ab3aeb89b763eeb7ee48b3966fee147a4614e436c9a1a398487c80a001700666251b3dd6a2e5dc96814d21e6498e75811ba4c51160cbecb7d5510\" +\n\t\t\t\t\"62697171a25a6abbc41fd806c3dfc83daaa10d7ce47f5a29ef0d85dda5a61429c637520e6a4048624cbb25f53977254cf803848ad81f25eda07690fe7a0466e4\" +\n\t\t\t\t\"d18a2fd145dda1c94a994bc4ba5ce1aa1b50c38151febee757afceeaa91c7b35e57b90ff7b62efa929dcb962d32dde5a0bc3159524728621a3d7487eb7c3edd8\" +\n\t\t\t\t\"6df3f8a18e590039bfc84a22b23b11468c90dcdc8506187233d8a6b3dc9785ddf6f341709fefccde91a7a0925a8446b1896aabd6a6826ef88b756a9711cb3b78\" +\n\t\t\t\t\"1ab1f4df4d0515070e41fd5b0c5483270307e60eaaaf0b3a48f6bb96eef6141075445285675bb12f2ce38b42c91c1e063400d7bba9b322a0783e7d2f5d3f8874\" +\n\t\t\t\t\"52ceb65bdedaa032336d969d2e0e3007d2ac07bcf054b9d0330f2e26c486c054bfa709fdabe283ed9a4ae67cee24f40f2a5c4e70160e6ceead208ca400959922\" +\n\t\t\t\t\"70bc35be104c9ad94cdbe288b1c599db1758331340c9e927bc9d688e4186d5badd463bd3ba116bdc22a39c604778cd95503ce4ce642041e89bcdeb86fb19ab25\" +\n\t\t\t\t\"e1f94ed2a2f857b228ed4a582ad411d7273a0d5189bf7a2b87a135753e03383033b989ea532041ab9ed397ecb3ce61e01923b3729068f6828ffd12e2ab1d28db\" +\n\t\t\t\t\"6ed7423d458decb00476657a0580b4af3aa5615bf07df55beaa2bec71447aeb39791477dd09349bf573e29e9c4fd454b4bbf1e19591bf38dc47c83bf39babdc8\" +\n\t\t\t\t\"737d69ce4b586cd10ed406426b88e686c11072f04c680e8b6275166e2dbe91f701642b1b4ed92d23d6fe14f39ff7f5a09401f3a398eb4bb742f6cf10aa35e767\" +\n\t\t\t\t\"7e6e92aec791e94f8122e8c9cc9d0bc979e3eac6562ab614ff20330b00d9cdbd08e9deaeaf5cd67b49164f550c5f5c2d7523fe5ad71a2bd03fe2a97329980cb3\" +\n\t\t\t\t\"049ecf6d677d815e56f7cc27407cf73528549ea98265ef90277c14763d5acb3572f5a482432cd8288972af580fdd3418889bfa6a373c4813c4c45e933ea4ec72\" +\n\t\t\t\t\"cdd068089c2a30897dd57031445834de9f23faf506ad930d843b1cabad2c0aa8965d1b5e57032c969f9f55fe2a3049f4e63d5b5c6f5f760da5ba44e3bb9307e9\" +\n\t\t\t\t\"ea39973d05a74a49e15bb71eaecf62373153ca316fdd40b1c64ce2896c95a7b5df970c2bec85edbd5ed84fa7949c08d5ec4d987052fffe357d444e2408a22295\" +\n\t\t\t\t\"6ac1fb272f5023740b381e00dae9f09751a33bc6ad673c4221ce3f932164deb99f1da3eb3581caf475e385bcc56d47a7a1615a9543403750f0121d5482c4ea5c\" +\n\t\t\t\t\"94fa3428178f6a4deea08d754ba2abb3d1aa48c3e06f06ffcdf4571579d398cd991e60599e9633fae6a0c07e10e538aebb7d33aa127c830f14b083728f6ad7eb\" +\n\t\t\t\t\"c9a60a0ba222f47780eaa82a21393a49defee97aa8c3aa2fa53a2af86059a7587074128c2fee7060f398ae70b156d53aba0bf1af4bff10a966ce7e6382cec4b6\" +\n\t\t\t\t\"054a8f6b9ef0e8729ee182f86c862f9b7d5ea36ef7e15bed10ed41b25738c380e58cf42795e3202749074fe5cb6e8fcb49a116f54d84734a834609a3443b8b42\" +\n\t\t\t\t\"97c05ced428f5756ba59bfc1535bc7e16d370d81b72b1f3f78ba75c820b22e485dc042e4f38e93cc2918a491750c92998f03aee571cbe9abce4d00fdf9801f9e\" +\n\t\t\t\t\"8e0fa276822e1e5349945f1d337e656b431c48c1a2e9d4142ea14e9427881bf201ad8cd8effaa6fe6a7e07c8112299db1b327a0cc34c9fbd35596f4ee25caeee\" +\n\t\t\t\t\"221afad93ce7df64aa6ac766cf4fe1660446dcbafdfb86b4e0fea78c29c3e84ce42da4a503178bd250a6dbc4fc65e397062229001da05d5be118dea7ca5ce67f\" +\n\t\t\t\t\"b4ee07a8b01e408aebef2c913434921df686a242b7d015a559f9efdc54ad62d7f31ceb72463041843d7fb60f948fed03ff143fe24ab81bd4ef6bdabb856ef1b7\" +\n\t\t\t\t\"174cc987436322271bf48423114e05758a08cdbf300931fc7e950830b7ee920f7033541f1db9b0d2b91cad80d06c049b05fd0a76d6dc211bef2a08d53b1d16d4\" +\n\t\t\t\t\"2232fb263941daac4e004542517807341bde98e9990a97739ef86d66c7a51324f1f6911cce4c3db37ebacb6e58eb02d8f7d6ea31338b56a99649c4e730a01bca\" +\n\t\t\t\t\"deb6fc87cabe00addf1bf76b83927de26bc2bb3f0cd5945d863b0c31cfe8fd4b60462000a911755cbecdb6a98139041d52df498aa99aa3876836ce5b5bb426e7\" +\n\t\t\t\t\"c22b5977902e0b3425fdbdb8f44e8758b207b469c3e5363f552c89fbf778e95e8b7ff6566ab591fb68a8bde38d8169c708a321b669c08d9ecf1a06c5321bb1cc\" +\n\t\t\t\t\"9c8a585b6381645edfbd1ea4a2ad7e7eb8be6c431958add393c0a257aeb283644c6fe97580aef613f1b9d83e5b009f7a4d059025c11e0a0a67801be511dc097e\" +\n\t\t\t\t\"4e7c065684effcafab83e0e716e2d0862e83b295f82089ed3ba4f6897c8d8eb2b358231f95eef840e1fe22e9065de2b3dfb3633e2968135756cd9c109e8acbb3\" +\n\t\t\t\t\"172bbb6680c2e4fd69e179916a7849315c9f4dc86991d75cc6358617454694b3fcf2471ec7fca6ea2d99f704b9aa37a25a3b3183c5e32e3711346ba2336d6001\" +\n\t\t\t\t\"489afb9cbd8822dbe4f0323ebf7cfa9367b6548213d473c0f07b1bb6d16e1c66fd2bfa1ca623e03149fc81eb6f71c12e7b4b76ca588548bb4872469687f334f9\" +\n\t\t\t\t\"7e114a16a0a58ec70ed74ef69dd96666a85aa52d1ca812235796d90b9af4296247f4c1ab632effeaaef6acbb637f1aa9379195b3b668ca541bc6eb595bbc430b\" +\n\t\t\t\t\"28adc5d1a26fd4cc2239516ac9ca9c0c028110926a2f88881a5886554c31539f4c8260e16364f4ac27710d2becdadf573f4a2b7b55d76ef059432c91c6f5beb1\" +\n\t\t\t\t\"56686a620bdb4aea50df564cc0c5ccd8a93c454e06b8969a0f59d63ae5a29105149c08a5de65e87b0dc445dc5d86db8788ba77b83e22125c69621140d7f17906\" +\n\t\t\t\t\"4ec0157a877cc51ce3c0d565bdf6c884f69b0ca631d6863770f6db30eff847e33c8b30d5714668a38a09f454ee44ff2b7f97207f10efcba74325378f6f272ef9\" +\n\t\t\t\t\"9f09c501c12bd0a4155f559a604204b36751ce8d4c0af35a8b445a9290c305d5d3ea21f944e31df9a711ee90bd16a37850e2a87c3bd3fdecdc6e2f261a5d6d0d\" +\n\t\t\t\t\"580990fcab9228cbb39f8c79608d821ce27c10b0ee0b5a96474759f67970cbe03cec9fe594765bc935abccf867b9717a4087465c8604eae89497c8ffae7e46f7\" +\n\t\t\t\t\"ade2848916b54aa796809cb98a4364b7b44c17944dbc408909a92d4cbb24a514b72fe8de7d1cbba0a101973fa9b29d97dcf1f4ed8a05d5e0cb38849dc6e2d041\" +\n\t\t\t\t\"16892ce649e0a553a727bfbb1d5794a059d6a411e43876e561d83bd22c054680cc8fa928f5f4be2d849f02ddf9c6d11ba35810b81553e1938ab013663f6ef35b\" +\n\t\t\t\t\"08f06260932d7acf99f57967eec57a61f03d880c3225e53102a672f5842da21aaaee02444d372ab8ed7096235a4926e3288912d9c736c2c4dc49918abdfdd6d6\" +\n\t\t\t\t\"d0df5be0133abd61b02a6f008909c5350f9077598ab2e612603431bddd3826e314feb280585b37eb89e597f7f0bdb738a9a93d9af224659d50c8f7479b240487\" +\n\t\t\t\t\"76c2a960eb18923fa2d3b31b3d20ef538759cf22f5b415d19bdae689f2bab651d79ff99f77a721bc1b2233da12c12be0c9881ad82fc97a6343b3af8207dda8b6\" +\n\t\t\t\t\"5c600644d741b8a16750964e341e060260c4de26f991f3a1f6a606d1153565f1c9cfee58eef327edc0e9cfaa206ce930b191f521be2344949bc75d583a413a96\" +\n\t\t\t\t\"ee4edac424cbf9bdad2883c96a1306b96ee059d8044e3b7af4e7138697f142774ed6409a86a3c6c456600d4e405e6117ec759f4b22d7e5a185b0f9c67ad987bc\" +\n\t\t\t\t\"58d2e8c929d4a487e5b77201d7c1416878e8d63258b2f58727cb631494cf1d68b99c28493b99b0409ccc1f9c218a2b95c45ff36563f0045ae5c3098f641ea6a9\" +\n\t\t\t\t\"b48a3e1489831b2d176a1e0cb2afe6bd8cc5e797de01391e47e798c1aa945d33d5e7dd607aa73c9efe93f0646adcd7e211303ac7deea4d02c80370e8e867e2ad\" +\n\t\t\t\t\"9942bfd5a66143560a1f59e5be1f3aeecd7eab689a4a481aec78045ae0604f69d9eea550152f6e2bc692529357b509d60e5a497bd94e63dc698cdfa2a3a55976\" +\n\t\t\t\t\"0b2d072a2fe9c1fd41f31518aae0edaab532591476a9c5a61cd76937575cef71ff5dd66e158e7820b4b6bff4067cc26ee9aa66f41b80f078645b920512b5efd8\" +\n\t\t\t\t\"88b3644601a72e3f665b9c8f0ee246593667379b8fa043718f2d75c21d2a11640c328971c32d5743c11ada6c95cfabf1c6b66e0b09342afc899e1f272ec48a7f\" +\n\t\t\t\t\"ba5a51943763bf969cbac879363e14dad1952517d8f4b463511adccf25e655bced7cd9666d01dd4f2a0a21729ac4f44970c9c478a995d1c3b358a244110f1db9\" +\n\t\t\t\t\"fe6335685701e0c2660ae69d33a93a75e44f5374b979a5af140200db43ff612be2728548192ebfd0a3860a9e135b910fe3fb249926d334167622bf4123bdf0d5\" +\n\t\t\t\t\"38e9ff2a3bb67a44f8407328e3c94b47d92e0401aa1db85459967699804df245a7808f972683afded9cad8fbce15c1be38fd10c62c7abc302eb0537d5cc573ec\" +\n\t\t\t\t\"245513a87c1a8d386f7ef0c4a91ec3c602b14a14ae395da13284df3391b929c7379e181c5d3d4597e3c955ef6e3dc2fc55890df04785bdd4e3fa35ac775f44ef\" +\n\t\t\t\t\"9d7813cc036d6bcc316e869eeddf7b30e4b837e9285eb20397b4d7e0d12080c502c750268bcd6ffc323cb094afbe8304ae840d37be833878697f2cf931faf06d\" +\n\t\t\t\t\"28dc6c7e1b5df69327127b47eddd0237f1bb5942ee5903d8cbfe1b11484199e90fe7c8e7f2f725deb2293630bd8c8a377d539736e2ccc2b90c08b97abd8c5ce4\" +\n\t\t\t\t\"ea91a6219ab06c61c31eb48a35587b3c1719f387bd8c2063c5a79d041ca8a9ffac2e3c728f74efdb74ee0730f84cb3a8aefff7c8a1b570127cfc93eb6d3327f5\" +\n\t\t\t\t\"ba7f886dee8be0548f710d6bfb18cbe5910bf61aed2c95028006f419241d968933aa00bb0760a41d2693465827a00837a84cadaf8a8e804d175adc5915c6cb6e\" +\n\t\t\t\t\"fefb2cf70db063f2f3812da17586436c176aa0a815dfc7983eb88bfb1b6d1db7ab119cd3058c0db4d1910034f70f6eedfee8b742ea45af9780f415be2f851061\" +\n\t\t\t\t\"313a218ad48e992b75afaa07c33ca47ee0155fe72e13d7e5736e512c5e5a45d351f7c7902d8b0fa31b34569a9aea31b018d63d572a9898c389d07caa427f114d\" +\n\t\t\t\t\"251263d56cf5d6663159c2b32683b266fb909ba9d4caadaeda6700c03b25307cdea597a3287fd76082dbf33f073482872fdb494b892112c594d7f265d2799b5e\" +\n\t\t\t\t\"5ec46a30fbf1557fa344a664a7af457a4e8ce2c014a270215d3f95d47a42d8f86a61d6d6b363d04a99a0d8f06c5b15cd803d951aea0ca185a807ca4c677db789\" +\n\t\t\t\t\"fca64f0c5ba95b8c64f930eda658f9f773a9e1c8669589a7d98ade8dbc2c2c4cbbaf6ea2bbc6e762d4098f4db0d3f055958ae9da15ae57ee0b60fb9513dacf5a\" +\n\t\t\t\t\"d65e34613570186acecf9e165bfa470aabcd35f22620497fbcabf220c53cff84eec12cf9965297b364f0e9122895c175d213fc2a9c9cbf27ebe1cf96fdacaf1c\" +\n\t\t\t\t\"1c79ede66cfaa5057d33e09b31b43869812e5a0ce730663c18c4333141ae9565e437d99ade6b2cbe005214e8b3392c55bf4d7b38ef16e7f84b4ba3c85e1dfd1a\" +\n\t\t\t\t\"ca8da1a5c75fd190e7752926533327880aed1461c7e9de2443ba0a2d094f4a14d5fffd3b102ea78acd34d162e82ab78fbb82bfbc8a9708ab532aa861643c39cd\" +\n\t\t\t\t\"2bc89f2be53c583f9930fb2da14f1c5d5f218384b1740a76bd8b7ddd2c9888c8d7e7e78cc7a3304fa41995c7c1c3316894296caeeb9711f0e6bf16abc380bd41\" +\n\t\t\t\t\"10448be3cb03cc3246ee7b9559c858307001033c84ecf89690526544c05c146f206d4a21e710597bb57759d232154a1f9d88eb3f3440374bad1e901da7a154b8\" +\n\t\t\t\t\"39a6d1b1b6b2ab0be872ff036a9f9f769a169fbf91bada732d8f28c453b9be49011b211155fa5c588b43018775f99e3b92b322a4c41282326b79fd26541ccafc\" +\n\t\t\t\t\"c0e2f09797e3217fb0e5785b72e654dbcde8ba14b2d56faa2218748c6789c158bb635d43c9a64690b004ab70f457e9fd959b2d90875966968c7ac44b103283e7\" +\n\t\t\t\t\"50b60deeb1f89444aee25fbdb7fa3a96d70c3dce38246f111e466cdfa3b807c54ed584f5b1a64456e923dcf37f45b36cea3d602ba3a55a4fd883ebb6dc198650\" +\n\t\t\t\t\"b522461614656897b9b7d408d48b12e594af06c91f715b32a4ed65a379f0ab461acb9b8b20d1f1b12e9f7fea422c0c7d545eff4152e06002cbd120fd74b483d3\" +\n\t\t\t\t\"a0ee30cfd851c98e9aa8fb19b60528de4a75b412bed656933ae8ab600aeaef5befdcca4d35fa472ed38ffb91a9017c19c5d500426f262ba379034c45cf5d1627\" +\n\t\t\t\t\"48da223207721b4bc4504b79309f3d622c53dfe3c83ff8866dd7614a2e90a85c077b2e18bf1cb6008f0d785d6a0ffd5f15a83a343036f3fdd25314bfe47b5a12\" +\n\t\t\t\t\"58a7c89475f39a58a671d0a17f6fd100a8928181b94d8d53149316d5addf14bd398b538e2593273f02cf296fd73ff92d02230de939dae94e03d44ce93dd4dfa1\" +\n\t\t\t\t\"b9219fd369c854ec409d7bf94b316e5e9c16e1ba525a783e24bd3fc0ecc949be245c402efae8ea77aaca74c78703506cfd5a5a614793e04c76652b4f344f79fd\" +\n\t\t\t\t\"f2da1e34f650fc1094116ead723813d204ffe375d20707fd94d90f21c009194201c88d22afaee83a8a6be7518dc915331b863664e033d397c64e1516c0fd9324\" +\n\t\t\t\t\"11614a1bdf2feb86e0d0ae21e784a55086c596c7eedd44d3afd7295455450f507f1c1a33c9ba94d50931ec054d8740510ea23990c266f30678a74fdd485b482b\" +\n\t\t\t\t\"cbfb4070e3f10b66c65a4210794a3137adabe887ffb9bcf2a30c625138f840b2666610e76e5a0abc183088a94930c025836653eddbc440621bbf94761c74e108\" +\n\t\t\t\t\"3672c6a914a753fd452e8e7a02c54b21d7bab4b705b4509b9b5b27e2e5144289eece950c3634b410b5e3cf8c5a5f74d98b55d17d45d7014390cf696a7e693777\" +\n\t\t\t\t\"4c028517062a69276910cf5f139078e8ef6e77aa8b35aa55fd4f53e48ae6b4875d1732b286ffe8bf852b73af7b964fdf1aa4c4f16d9f14485a2b1a704c2615ac\" +\n\t\t\t\t\"8ac74eaaacec7e8e4e506e1b418d377e4d5a271dfab47b3d3c11a809beda596fdf37935dfe06c147dfe7d5be696ffb2a0cff907d1eb2a88477c261d5a7aba06c\" +\n\t\t\t\t\"d70dc52d00b9a9d851e849f86e1cba91b4c40d1ae3d4f21a2763369dde34d084adfc09d2a6cb5f09114cd8d6fa26d15f1ec428adc245064e5b8e80f21b0b3ff2\" +\n\t\t\t\t\"6690398d3080f5355fc082bc4bf3a38576c7da00efbc80839dc9a06fab2b998a152553c36fab42e03e3e4b54456ed954e53bd63902d89e2617a263e70146d1eb\" +\n\t\t\t\t\"71557baf43aeb0a681f600a784778c895afce26fe17e3ac33990c54cd96fcb2432de79d4f95ab2fb96effdd37f4e4247ae5b4c1fa461ca3269d45a90af090333\" +\n\t\t\t\t\"fc3ab5152bd5aed4445eab93466701382ba76fc8745abd911bdb45a494e1c62647670380c04377bcdb5e631318dfa79850469a988094acd48a4110bbc7289617\" +\n\t\t\t\t\"ce436294ff242302d154ad75437ae2f551df5b84f884c87497de0bb2ef7bd41a8c758e4b158084c78ef047389d88974faafa00ce7396e849509d39c403fdcca6\" +\n\t\t\t\t\"8f47e1d0fc294e5510a07af24c165e1a4b4ba9498e7b333c4e8624c552801079775fc684b6e98b72ff133164a2052c2aadcef168d9cdeab8a935c98f08e23b95\" +\n\t\t\t\t\"859277381a2ce23ea61fbe9ec1439a489523161ed370b0069aa6a5c7981e4a80c04e304ff2fd85f80b51e3de3484b53084f376cc72a390aaefc49baddf4d2545\" +\n\t\t\t\t\"93dcb5a49326c9c15c3d1c0e0709c9879d68bee07b956d018a995bf1e7f8fa03ef2079d01e0bec601519704cced98854c94f1f0ae837653f14c0221e12f2cbdb\" +\n\t\t\t\t\"1564066062bc1d4dcf7ed8b2c980b90e8101842d5844375cb370f402d858dffd9eb52572f8420d4d246462230ca0dbd567250e4f065730a6aecbd804b1acf949\" +\n\t\t\t\t\"30e2890a39fdd4c1eb693f7e345504dbad5ac207f1a649968c3a7b416bd972b6a6bfde04375337a93b0ac08f6fae62c0fa7df8ae9deeee421f7ac62d8cf5ecf3\" +\n\t\t\t\t\"b5ff39877ee4abaeb9db03d8a8f13f7925e54267a2651c55ecf580d5cbb24bf504fb01291e3e97ad1696ed995608fceda79f2441ca67bfe3c31f4f4bf0fffcd6\" +\n\t\t\t\t\"55408744524412cd4d3cbdbdd216694aa7477e88b25f7efeb34abf491a50695ff686829a8fea9e999877bcb37291b8dbeeddfd44465a2c28a215aa532590c487\" +\n\t\t\t\t\"d4747b6ece4e1aeaef725cb305d11b965a9647bef36a5c2fb45cc334d35ff4e308cd8813b6de3953b35a4ef6a3ae07794f8b54ef6365a573135320612bd1acfe\" +\n\t\t\t\t\"6cac5524c0e98b6f2a33a790b94f5134f0cba075a6fa93c191f4176ca62ea2e365557d6b3363a17b9ee52f3c347c82cd19f8432d16a934ae9c5d4d4505e7d20e\" +\n\t\t\t\t\"1ae31bb64ccb084f7a59744b27d58c2388d449ff4b63604878ae858240348ecfcb51761678265bd60d5dd7d51e25e91668fdf80f6b726b29ef6c3f0f229d8af4\" +\n\t\t\t\t\"b2cdadc3ca7fbadab49b28819b9c9b92b49cbe9a281e5891f4eae7616013777605a0623dd7a650baf9a9dad66ca9aae3c76ef1e27db32bd9514a2776eb0c8d05\" +\n\t\t\t\t\"65eec06fc4c8a69c417efa336842e248e5a51e3b5f3ba3227e3f78f1bd12d81595e03a01f4259c772fd481ab5f3d7a945e1c95fe0dc3c4742eeb7e15c9426ec3\" +\n\t\t\t\t\"ed4c90ee07d56acc78fecfd7c5ce1e04e7db1a970091f15c90f0aae2865d135395d27787aaf68c6a179064d82691e0b6c795f61875f317dc6d2e8feea55a28f2\" +\n\t\t\t\t\"461d74e14e350351720b6f536adfe3addd4111f08e3a84da2656fd4bc83989b329b383da9f01cf2392aa0b19577884d1281f2e6c106df451c078a472b36057d3\" +\n\t\t\t\t\"065dfc4bbb47ce4e5dce4acf6da095bdd10322f3ae12bcdd1f805e73b303f1fc7a7e16cf3ffd822bd8b25fbc93be065019e394113182713f1ad299ae6537f6bf\" +\n\t\t\t\t\"57116e8dc9ec775519b797ab4107c2ac5129ba85188852c3bc5f116044bbd8985b6dc8b8da4659589bf9d2351c4c3adaed87fe2ea20ef6bf62224c7af86fe8b4\" +\n\t\t\t\t\"973e558f39465dff43bf23cf1f78957514e4e82a3009d40d97bf8d8442a11deabde806e2fa84c1ba75273da75ce8dad3b2a34786b2958ac4bfd248ebe604a173\" +\n\t\t\t\t\"83c727b11dd922b1f72476af700b663fbd7033d0ac74b463d40a92d26c938b69f96fb4a9cb7a9ca2bd9496251270c0c5fcae6b3c2eda5377b897891648a97125\" +\n\t\t\t\t\"8ac71fed8dce8e02c30961a299cb7f3145845dbe8f4dfaaaf4baf0ca3fb730abdd258e98215f072a943d5aee8d8bc4c86023524f7b69186d99ad88ccdfc0b4bd\" +\n\t\t\t\t\"7db422bbad7eaa0824ce24b5c186e172c8c584f1cc5c126c901a69ebee8dbd230a653a3643b7875672d22fd86079daf8d834ba33664f5ad0b6eec767b4f58b45\" +\n\t\t\t\t\"e67b776b90e0a5e130aa5365003eb7fd78b757b1cf9133f6a1d51064b293cb42c8c41b15b7e95e2a39fa5dae19c6e20031d2bfa4632c37779163fdecc6b45624\" +\n\t\t\t\t\"4d6bfd01a8877f6fe7739591917a86e7dd795ad85cc3f256cff5961e8b62e92a0754a51f2c6d59819446eec8bdd08b87cf9f4fb5373e809d52240d2dd691cd50\" +\n\t\t\t\t\"37fc79d35b61d63851917cfdba164868a3f79e2061bd4610c1f5216ed77df00baa75f949ad37142db4fd282a5c7d2e2636ca590f92fc4781d4f51efa69f53947\" +\n\t\t\t\t\"d4fca1dc7dd2429837b6d7e5c9528effdecf6f731f676587785e5c4096bdb6f1f44e72f5f77d9025813e848881506f65bfb0f2b2d3ae6f9e00731929b5ac083d\" +\n\t\t\t\t\"b1c9c324703e63fef6319e1d8150aa0ff7d9a2049961df9158f3e1f2e540a91feb742625d2a859a452186d2ccaa3ec2ba086ee0868a4dc24ae6818fc02f9c1df\" +\n\t\t\t\t\"dc326cc31c46feefda97265238592f638968627ec24903b97513ab05ed58ce5b516decda0e2fbf01a70e6cb2e53c3e7b8855f80cd7e007b78da727ef0893e099\" +\n\t\t\t\t\"592ba684d62ae2d1f06ad148fa7f34cfc724d804149cda21aee7eac064ad20d29132b260c2c2867fa6a2e747739fc30df2f002c2a99da6c7e64ee51e806af7d9\" +\n\t\t\t\t\"768aec456b93a05002666cb61b2229c99f2cdef9afc9cea1c4ee3a85dd189823399781ee33cde2abedff09c47960c035e075a29156005d75845a11fa06abcc50\" +\n\t\t\t\t\"5f7f849a0caaf683f334e9e7bbbef90fe6cf94cbf87767219440d31713daef6ad1e4a1cc720ce59fee4cf7731e46bbba9ec1648908ea345030aa8f10ade10ffa\" +\n\t\t\t\t\"3d2acfd480b0b11eadc4fb2b740596b204e911456cb2f35ad9993ab7dd6a48b35ba0c207625384bb3c2ff24437810bd13c7ee96cd6f97f19ffd537ad182a3657\" +\n\t\t\t\t\"b0e83d42fd6e2ebac6cbf5ea1bde97465b7cec6954ff5b5be049e59a49ea25ed6667dbace765401bde12031e5cfabf2df7afb728d2a0b2a38b24d79bf23a313c\" +\n\t\t\t\t\"40fe5adef97487641c6088dd8712c0c352708e474b02c08fd2d71b6d44f16d82f291ccd61c43a339408379a8de54cfdbbae5e421e084112fbc17fb5561e084d1\" +\n\t\t\t\t\"4149bf4bb06fd161878d8574f856867cff974d5898e161923d55bdac8699c9df6a220bcb6c800d3ae7f107b8c4acab206d780aafaf6c2e2379de8c900700d9c9\" +\n\t\t\t\t\"c87d464772514c5aa3e5f5bfc00fb54f2b74702838b4731c5ac8a070b50783e81dd97fa8d55c739d026b607a2a78aba1bb79b1a7a3c22c78368672ac020061e6\" +\n\t\t\t\t\"d9683d57d6989c6c6f08b8d5d74720f5cb25505fbe81d2bf53a68e972a54784705b20f83fd1ab5afff30764ef89dba4465b56f48b325ab3810bf8dcbf4faa61f\" +\n\t\t\t\t\"676e2043ac8540df9e3af4c0f51d816e89c09bf67253be45fc5f75f64be97f6c7dc0c6392af6fa8e75aab58eda976b36773cd37d315771400a2cb846fdef3d8a\" +\n\t\t\t\t\"a15bce5dfda0379e526f87cf67767a2ab93d41c85b4ed016ed0a89d2f94737433a3ebade813def29eaa18a1fb925fca7d08d1020f64caebc562cb4ad2fb241e2\" +\n\t\t\t\t\"94923b2f2df5e6c4953c4b73be0f5568defe57ce49d16e2a205323e46cbb5a3e77fff1557671503bd7b5de5320f1fb951fbe26400cfa854af2d12fab0215310c\" +\n\t\t\t\t\"f070add34dc4565d1757d7e10a03e3bb73a607ed7e10861b1274ddee76183cf7e56c1de7162c805c2dba0e0331d36f3a4e2019a2e0705ee2747ed1e52bc3a6fb\" +\n\t\t\t\t\"3b061f784348204cdf8d643ff6c271fa72b56900edcc2f77201f3bd4fc296ad6534a7029ea66761bb9a3589a1f6ef566504c70297b98fbb603214fed2e4b7ca1\" +\n\t\t\t\t\"06e3f0e993118897fa641fb9722d4667fa98d07a6837e5ab2144e5ec1548a7dbca28c559f2a9a99d54b8e55f56d0e59bcef1ac45e2046835b60579da0d2261e7\" +\n\t\t\t\t\"30dab9009d138421c6458d146e870358b0b3fa20257e50b58f167c6b47edf7053513d58f33547d06ce52458baaa4dcf15f77b103565c66a81f183c827801b455\" +\n\t\t\t\t\"b61b6287a46a37a96884075a7eada9ba7f0ddcc14654bf87a26d2e27a978b415257773796923a220e06b25af16fb5aaded9b2d081a4c64106df460ddce9c3b2a\" +\n\t\t\t\t\"c8553e1521e501ad29a4b7f7681c9b60576a127087a5237c4c2bacf9b163dd590e63f2bc80e7f1e613773f87d034313064710404739d63363d204be7b14800c4\" +\n\t\t\t\t\"d8c1b6a2a21da70223be51d281fee302ef806454f9d7d28244ba537c1d9f8f1bcc5d47038d986a8f95ca48437ffe94fd44a90bb03014a259112a97508adb3db4\" +\n\t\t\t\t\"34f72a5268c1af6bc6d5801e579aab2228ca33600ebbf1a1959081c3a4ca99e444f97409f5e0ca4779241c9aacad1f4ee7fb4369bd6ae076378e4f63000b9a5c\" +\n\t\t\t\t\"849ba6e72e47e2454a44659149338ac0767cd25d8693c0d143e354bd600f1c1d3a44eeb024923ea659060665d5cd9a4ca1ca86162819556535fd59b9fde90caa\" +\n\t\t\t\t\"29920efe99479fe7e4b4e5371e13ccb43a1419cf023433239d840900d31bab37fabc3fd20e31bb7dbcb3ae8df66f67e2844944bcf544b658364f9e3d0b6d84b4\" +\n\t\t\t\t\"63ad4eb621644fd7d774b501407a1178814b15149345d551b474347188067db2ab4d7f4d1abd3027133039e855e129f3f5649550da8c04fe2db57cb89bf1bf4f\" +\n\t\t\t\t\"72eb35ccfe31afb92f6136d4c2a1c115b07b721b2da43151f11c356256230408979c5d95243714429e2c9500e7b043b20dac8a9763e5b487d1cbdb34ac379b9c\" +\n\t\t\t\t\"6409454c79385b6e562459c4fdaad1b7f9297c1473e9b90fffe6d1c5390e241a187a4cefa2eb0cb0c11f4ca6c5b961c18ceb57892295290dbc991692556bffa3\" +\n\t\t\t\t\"b8c405cf285e6bcb8a90246ad0ac15122f4cf73adc129d23aa2240733404beb6d74bf698e5589288a522573c774ce9f514b5d5c086382ea1dd4e89ff5facbf23\" +\n\t\t\t\t\"d36bc3d203941e17747ede4b82820351f4df278ddb787ce8f6f1cc468ef953399efb072ce706e253f1bab76444bb70be6443cd0db633e958dc57bd223e00418e\" +\n\t\t\t\t\"915a7c2e4d94c0623f9788276480cdfe798387d35e2ea2d304d066aec7627794cdd4200a44208d6c87f242c76e2d4a3f966b6fb96eaa63d892c1a177bef249b4\" +\n\t\t\t\t\"fdd1a4c06c791f677dd9919f739ccf318bd77835330b0219786249c9c9736161dac771a838724f2dd70afba46a6782fd27601cf8a7126ae95a66e526131a68d7\" +\n\t\t\t\t\"7a809e513533ed8021eecdbc5851dfcf95e10f1bbe47b5c7f079275a1837836245266b66d89fab25ac4bd6c1225560bea3259b67bf50a58ee056754d574da79e\" +\n\t\t\t\t\"f9a1a0df3a5defed0f74fe74ce0bf65a04086f17e94a8451828c723c97932f26f9349f1a2c7866c617a528602721de4f3cc8916bcfc66cdc106bafa26ea87a13\" +\n\t\t\t\t\"94dfa37e396365fb7f92df007b46a50ff04c7f85bfa679230ebedf18c2fb876fc7098dd1c4328adf85de71c31d94687a308053bfcdc158cfa7772170fbed63f5\" +\n\t\t\t\t\"37dda41f65196dfacdd1186b5de0f3369d841ce6502192292d05a19ce7464f5bcab3015c721cac13ddca561b92dc1ee25d3068dc1945a1b4e2bd1e6604c42e4c\" +\n\t\t\t\t\"3c04b490f6365828957990007394557854a903e19feb06906e41cbc8766bf37bd7dece90f4cdc987709b1129e84bfdc502543b5bfa887bf78553a5ec10ad68c5\" +\n\t\t\t\t\"d10eff75f7aa495e7d934a55577fdc0aead31aee4522db0259d7d4ea8438a7996d80a787465a2980457193d1c4bf1a0a1e01741d72e5fc4dfe58475c1c01026b\" +\n\t\t\t\t\"5a3bc973b902280753e9c3226db9cc778e2506c56ee86ae85b4d54dbf05394107329b2d1ee56522cb1ce562fb1aa4e592199d9c29f64cc3ab1d757531e209eec\" +\n\t\t\t\t\"aa138d8388169b5e28c45f5aba267eeaa57f69869f0b6855d82b0eafcde63895251f41e8e676a0ab12ef3f569bb7de91b79fa46ad9637da01ca004f4d30259c1\" +\n\t\t\t\t\"f5b00761f6ca9c17721a6718390624a10a11f7f52d7afb71ee5f8338828910e48f94a1347761abac87897b2dd0e23f1d325aec5031ef58f2972e8b402e05f8c1\" +\n\t\t\t\t\"ae7053a90380a1ae0d4d06645548c23e13afa31aac8ff83b10f8341418af4114632f6406d6e33076391696c9161d63c8bcfd1c625fc737f68198046212d1638a\" +\n\t\t\t\t\"d2d2d42ff7029c1fcc682a046edc4d4f24862d82c600180b1e8f57ff6a3865dfe9274f9886d00efa523a1b3b3757c4489200fec3dc5583854c955492336253dd\" +\n\t\t\t\t\"767f2a60ce3d224afcff9cdc19e9b28830d33affda6af99942a8fe39562055f3e884fd6c1ebc1908ac159061f35e9b0da80434ce9673d9c6b87265170077c670\" +\n\t\t\t\t\"743e37474d7605cd01c44af600f16d9ffaf24acf87fbe5ccf39bac41047a810d210051c87f06147a0bb8f1427a406700483679638f1af23f1dafb7aa0c468669\" +\n\t\t\t\t\"71c3a82f535c26cf6cb335e8e915fda393799d3dbe0e04b907ed3612d12ac95783a6876cd986d2a13b82192532e02c250eaa42f891d2481655fa4494c723fe00\" +\n\t\t\t\t\"87d224444245eb5b0eade5f741b025db1992a8ad0dce51b0c1af4a18a9e244f9f755891adf0f19179c7baa6c32bffc91e0b03c4ed3aaee1978b6a1f03b87ac6a\" +\n\t\t\t\t\"fc3b9e7030bb212b17de198edfccde29d04224798c1204e47ea235f048724fac62d637d1ba0ee3922048fcf79c746b6c0c036d882e3491fd72bad6e009c6403e\" +\n\t\t\t\t\"55876f4d31330caa02aedd0b0c121c3c41e736853a08071f0dd4ddc7412db0bbe274a9ac2932552bb37c40e72c2ef1d7cca8236942e480d709d3ea9d5ae0a1b7\",\n\t\t\t),\n\t\t},\n\t}\n\tfor i, tt := range tests {\n\t\tcache := make([]uint32, tt.cacheSize/4)\n\t\tgenerateCache(cache, tt.epoch, seedHash(tt.epoch*epochLength+1))\n\n\t\tdataset := make([]uint32, tt.datasetSize/4)\n\t\tgenerateDataset(dataset, tt.epoch, cache)\n\n\t\twant := make([]uint32, tt.datasetSize/4)\n\t\tprepare(want, tt.dataset)\n\n\t\tif !reflect.DeepEqual(dataset, want) {\n\t\t\tt.Errorf(\"dataset %d: content mismatch: have %x, want %x\", i, dataset, want)\n\t\t}\n\t}\n}\n\n// Tests whether the hashimoto lookup works for both light as well as the full\n// datasets.\nfunc TestHashimoto(t *testing.T) {\n\t// Create the verification cache and mining dataset\n\tcache := make([]uint32, 1024/4)\n\tgenerateCache(cache, 0, make([]byte, 32))\n\n\tdataset := make([]uint32, 32*1024/4)\n\tgenerateDataset(dataset, 0, cache)\n\n\t// Create a block to verify\n\thash := hexutil.MustDecode(\"0xc9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f\")\n\tnonce := uint64(0)\n\n\twantDigest := hexutil.MustDecode(\"0xe4073cffaef931d37117cefd9afd27ea0f1cad6a981dd2605c4a1ac97c519800\")\n\twantResult := hexutil.MustDecode(\"0xd3539235ee2e6f8db665c0a72169f55b7f6c605712330b778ec3944f0eb5a557\")\n\n\tdigest, result := hashimotoLight(32*1024, cache, hash, nonce, 0)\n\tif !bytes.Equal(digest, wantDigest) {\n\t\tt.Errorf(\"light hashimoto digest mismatch: have %x, want %x\", digest, wantDigest)\n\t}\n\tif !bytes.Equal(result, wantResult) {\n\t\tt.Errorf(\"light hashimoto result mismatch: have %x, want %x\", result, wantResult)\n\t}\n\tdigest, result = hashimotoFull(dataset, hash, nonce, 0)\n\tif !bytes.Equal(digest, wantDigest) {\n\t\tt.Errorf(\"full hashimoto digest mismatch: have %x, want %x\", digest, wantDigest)\n\t}\n\tif !bytes.Equal(result, wantResult) {\n\t\tt.Errorf(\"full hashimoto result mismatch: have %x, want %x\", result, wantResult)\n\t}\n}\n\n// Tests that caches generated on disk may be done concurrently.\nfunc TestConcurrentDiskCacheGeneration(t *testing.T) {\n\t// Create a temp folder to generate the caches into\n\tcachedir, err := ioutil.TempDir(\"\", \"\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create temporary cache dir: %v\", err)\n\t}\n\tdefer os.RemoveAll(cachedir)\n\n\t// Define a heavy enough block, one from mainnet should do\n\tblock := types.NewBlockWithHeader(&types.Header{\n\t\tNumber:      big.NewInt(3311058),\n\t\tParentHash:  common.HexToHash(\"0xd783efa4d392943503f28438ad5830b2d5964696ffc285f338585e9fe0a37a05\"),\n\t\tCoinbase:    common.Base58ToAddress(\"3sxsj1HaqtdMXoKAe6VW6UuSSvdvM59NiTs23Y3Cavzoi2G41QSsyhhM1fhaGvSaAe9aVXdMMWrwhcEgdbR6oupe\"),\n\t\tRoot:        common.HexToHash(\"0x77d14e10470b5850332524f8cd6f69ad21f070ce92dca33ab2858300242ef2f1\"),\n\t\tTxHash:      common.HexToHash(\"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421\"),\n\t\tReceiptHash: common.HexToHash(\"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421\"),\n\t\tDifficulty:  big.NewInt(167925187834220),\n\t\tGasLimit:    4015682,\n\t\tGasUsed:     0,\n\t\tTime:        big.NewInt(1488928920),\n\t\tExtra:       []byte(\"www.bw.com\"),\n\t\tMixDigest:   common.HexToHash(\"0x3e140b0784516af5e5ec6730f2fb20cca22f32be399b9e4ad77d32541f798cd0\"),\n\t\tNonce:       types.EncodeNonce(0xf400cd0006070c49),\n\t})\n\t// Simulate multiple processes sharing the same datadir\n\tvar pend sync.WaitGroup\n\n\tfor i := 0; i < 3; i++ {\n\t\tpend.Add(1)\n\n\t\tgo func(idx int) {\n\t\t\tdefer pend.Done()\n\t\t\tethash := New(Config{cachedir, 0, 1, \"\", 0, 0, ModeNormal})\n\t\t\tif err := ethash.VerifySeal(nil, block.Header()); err != nil {\n\t\t\t\tt.Errorf(\"proc %d: block verification failed: %v\", idx, err)\n\t\t\t}\n\t\t}(i)\n\t}\n\tpend.Wait()\n}\n\n// Benchmarks the cache generation performance.\nfunc BenchmarkCacheGeneration(b *testing.B) {\n\tfor i := 0; i < b.N; i++ {\n\t\tcache := make([]uint32, cacheSize(1)/4)\n\t\tgenerateCache(cache, 0, make([]byte, 32))\n\t}\n}\n\n// Benchmarks the dataset (small) generation performance.\nfunc BenchmarkSmallDatasetGeneration(b *testing.B) {\n\tcache := make([]uint32, 65536/4)\n\tgenerateCache(cache, 0, make([]byte, 32))\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tdataset := make([]uint32, 32*65536/4)\n\t\tgenerateDataset(dataset, 0, cache)\n\t}\n}\n\n// Benchmarks the light verification performance.\nfunc BenchmarkHashimotoLight(b *testing.B) {\n\tcache := make([]uint32, cacheSize(1)/4)\n\tgenerateCache(cache, 0, make([]byte, 32))\n\n\thash := hexutil.MustDecode(\"0xc9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f\")\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\thashimotoLight(datasetSize(1), cache, hash, 0, 0)\n\t}\n}\n\n// Benchmarks the full (small) verification performance.\nfunc BenchmarkHashimotoFullSmall(b *testing.B) {\n\tcache := make([]uint32, 65536/4)\n\tgenerateCache(cache, 0, make([]byte, 32))\n\n\tdataset := make([]uint32, 32*65536/4)\n\tgenerateDataset(dataset, 0, cache)\n\n\thash := hexutil.MustDecode(\"0xc9149cc0386e689d789a1c2f3d5d169a61a6218ed30e74414dc736e442ef3d1f\")\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\thashimotoFull(dataset, hash, 0, 0)\n\t}\n}\n"
  },
  {
    "path": "consensus/ethash/consensus.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethash\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/btcsuite/btcutil/base58\"\n\t\"strings\"\n\t\"sync\"\n\n\t// \"github.com/sero-cash/go-sero/zero/stake\"\n\t\"math/big\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// Ethash proof-of-work protocol constants.\nvar (\n\tallowedFutureBlockTime = 15 * time.Second // Max time from current time allowed for blocks, before they're considered future blocks\n\t//bigOne                 *big.Int = big.NewInt(1)\n\t//big200W                *big.Int = big.NewInt(2000000)\n)\n\n// Various error messages to mark blocks invalid. These should be private to\n// prevent engine specific errors from being referenced in the remainder of the\n// codebase, inherently breaking if the engine is swapped out. Please put common\n// error types into the consensus package.\nvar (\n\terrZeroBlockTime     = errors.New(\"timestamp equals parent's\")\n\terrInvalidDifficulty = errors.New(\"non-positive difficulty\")\n\terrInvalidMixDigest  = errors.New(\"invalid mix digest\")\n\terrInvalidPoW        = errors.New(\"invalid proof-of-work\")\n)\n\n// Author implements consensus.Engine, returning the header's coinbase as the\n// proof-of-work verified author of the block.\nfunc (ethash *Ethash) Author(header *types.Header) (common.Address, error) {\n\treturn header.Coinbase, nil\n}\n\n// VerifyHeader checks whether a header conforms to the consensus rules of the\n// stock Ethereum ethash engine.\nfunc (ethash *Ethash) VerifyHeader(chain consensus.ChainReader, header *types.Header, seal bool) error {\n\t// If we're running a full engine faking, accept any input as valid\n\tif ethash.config.PowMode == ModeFullFake {\n\t\treturn nil\n\t}\n\t// Short circuit if the header is known, or it's parent not\n\tnumber := header.Number.Uint64()\n\tif chain.GetHeader(header.Hash(), number) != nil {\n\t\treturn nil\n\t}\n\tparent := chain.GetHeader(header.ParentHash, number-1)\n\tif parent == nil {\n\t\treturn consensus.ErrUnknownAncestor\n\t}\n\t// Sanity checks passed, do a proper verification\n\treturn ethash.verifyHeader(chain, header, parent, seal)\n}\n\n// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers\n// concurrently. The method returns a quit channel to abort the operations and\n// a results channel to retrieve the async verifications.\nfunc (ethash *Ethash) VerifyHeaders(chain consensus.ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) {\n\t// If we're running a full engine faking, accept any input as valid\n\tif ethash.config.PowMode == ModeFullFake || len(headers) == 0 {\n\t\tabort, results := make(chan struct{}), make(chan error, len(headers))\n\t\tfor i := 0; i < len(headers); i++ {\n\t\t\tresults <- nil\n\t\t}\n\t\treturn abort, results\n\t}\n\n\t// Spawn as many workers as allowed threads\n\tworkers := runtime.GOMAXPROCS(0)\n\tif len(headers) < workers {\n\t\tworkers = len(headers)\n\t}\n\n\t// Create a task channel and spawn the verifiers\n\tvar (\n\t\tinputs = make(chan int)\n\t\tdone   = make(chan int, workers)\n\t\terrors = make([]error, len(headers))\n\t\tabort  = make(chan struct{})\n\t)\n\tfor i := 0; i < workers; i++ {\n\t\tgo func() {\n\t\t\tfor index := range inputs {\n\t\t\t\terrors[index] = ethash.verifyHeaderWorker(chain, headers, seals, index)\n\t\t\t\tdone <- index\n\t\t\t}\n\t\t}()\n\t}\n\n\terrorsOut := make(chan error, len(headers))\n\tgo func() {\n\t\tdefer close(inputs)\n\t\tvar (\n\t\t\tin, out = 0, 0\n\t\t\tchecked = make([]bool, len(headers))\n\t\t\tinputs  = inputs\n\t\t)\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase inputs <- in:\n\t\t\t\tif in++; in == len(headers) {\n\t\t\t\t\t// Reached end of headers. Stop sending to workers.\n\t\t\t\t\tinputs = nil\n\t\t\t\t}\n\t\t\tcase index := <-done:\n\t\t\t\tfor checked[index] = true; checked[out]; out++ {\n\t\t\t\t\terrorsOut <- errors[out]\n\t\t\t\t\tif out == len(headers)-1 {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase <-abort:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\treturn abort, errorsOut\n}\n\nfunc (ethash *Ethash) verifyHeaderWorker(chain consensus.ChainReader, headers []*types.Header, seals []bool, index int) error {\n\tvar parent *types.Header\n\tif index == 0 {\n\t\tparent = chain.GetHeader(headers[0].ParentHash, headers[0].Number.Uint64()-1)\n\t} else if headers[index-1].Hash() == headers[index].ParentHash {\n\t\tparent = headers[index-1]\n\t}\n\tif parent == nil {\n\t\treturn consensus.ErrUnknownAncestor\n\t}\n\tif chain.GetHeader(headers[index].Hash(), headers[index].Number.Uint64()) != nil {\n\t\treturn nil // known block\n\t}\n\treturn ethash.verifyHeader(chain, headers[index], parent, seals[index])\n}\n\n// verifyHeader checks whether a header conforms to the consensus rules of the\n// stock Ethereum ethash engine.\n// See YP section 4.3.4. \"Block Header Validity\"\nfunc (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent *types.Header, seal bool) error {\n\tif !superzk.CheckLICr(header.Coinbase.ToPKr(), &header.Licr, header.Number.Uint64()) {\n\t\treturn fmt.Errorf(\"invalid Licr : pkr %v, licr %v\", header.Coinbase, header.Licr)\n\t}\n\n\tif !header.Valid() {\n\t\treturn fmt.Errorf(\"invalid Licr : pkr %v, licr %v, disable\", header.Coinbase, header.Licr)\n\t}\n\t// Ensure that the header's extra-data section is of a reasonable size\n\tif uint64(len(header.Extra)) > params.MaximumExtraDataSize {\n\t\treturn fmt.Errorf(\"extra-data too long: %d > %d\", len(header.Extra), params.MaximumExtraDataSize)\n\t}\n\t// Verify the header's timestamp\n\tif header.Time.Cmp(big.NewInt(time.Now().Add(allowedFutureBlockTime).Unix())) > 0 {\n\t\treturn consensus.ErrFutureBlock\n\t}\n\n\tif header.Time.Cmp(parent.Time) <= 0 {\n\t\treturn errZeroBlockTime\n\t}\n\t// Verify the block's difficulty based in it's timestamp and parent's difficulty\n\texpected := ethash.CalcDifficulty(chain, header.Time.Uint64(), parent)\n\n\tif expected.Cmp(header.Difficulty) != 0 {\n\t\treturn fmt.Errorf(\"invalid difficulty: have %v, want %v\", header.Difficulty, expected)\n\t}\n\t// Verify that the gas limit is <= 2^63-1\n\tcap := uint64(0x7fffffffffffffff)\n\tif header.GasLimit > cap {\n\t\treturn fmt.Errorf(\"invalid gasLimit: have %v, max %v\", header.GasLimit, cap)\n\t}\n\t// Verify that the gasUsed is <= gasLimit\n\tif header.GasUsed > header.GasLimit {\n\t\treturn fmt.Errorf(\"invalid gasUsed: have %d, gasLimit %d\", header.GasUsed, header.GasLimit)\n\t}\n\n\t// Verify that the gas limit remains within allowed bounds\n\tdiff := int64(parent.GasLimit) - int64(header.GasLimit)\n\tdivisor := uint64(1024)\n\tif diff < 0 {\n\t\tdiff *= -1\n\t\tdivisor = uint64(128)\n\t}\n\tlimit := parent.GasLimit / divisor\n\n\tif uint64(diff) >= limit || header.GasLimit < params.MinGasLimit {\n\t\treturn fmt.Errorf(\"invalid gas limit: have %d, want %d += %d\", header.GasLimit, parent.GasLimit, limit)\n\t}\n\t// Verify that the block number is parent's +1\n\tif diff := new(big.Int).Sub(header.Number, parent.Number); diff.Cmp(big.NewInt(1)) != 0 {\n\t\treturn consensus.ErrInvalidNumber\n\t}\n\t// Verify the engine specific seal securing the block\n\tif seal {\n\t\tif err := ethash.VerifySeal(chain, header); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// CalcDifficulty is the difficulty adjustment algorithm. It returns\n// the difficulty that a new block should have when created at time\n// given the parent block's time and difficulty.\nfunc (ethash *Ethash) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int {\n\treturn CalcDifficulty(chain.Config(), time, parent)\n}\n\n// CalcDifficulty is the difficulty adjustment algorithm. It returns\n// the difficulty that a new block should have when created at time\n// given the parent block's time and difficulty.\nfunc CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int {\n\tif zconfig.IsTestFork() {\n\t\tif parent.Number.Uint64() >= zconfig.GetTestForkStartBlock() {\n\t\t\treturn big.NewInt(10000)\n\t\t}\n\t}\n\n\treturn calcDifficultyAutumnTwilight(time, parent)\n}\n\n// Some weird constants to avoid constant memory allocs for them.\nvar (\n\texpDiffPeriod = big.NewInt(100000)\n\tbig1          = big.NewInt(1)\n\tbig2          = big.NewInt(2)\n\tbig6          = big.NewInt(6)\n\tbig9          = big.NewInt(9)\n\tbigMinus99    = big.NewInt(-99)\n)\n\n// calcDifficultyAutumnTwilight is the difficulty adjustment algorithm. It returns\n// the difficulty that a new block should have when created at time given the\n// parent block's time and difficulty. The calculation uses the AutumnTwilight rules.\nfunc calcDifficultyAutumnTwilight(time uint64, parent *types.Header) *big.Int {\n\t// https://github.com/ethereum/EIPs/issues/100.\n\t// algorithm:\n\t// diff = (parent_diff +\n\t//         (parent_diff / 2048 * max((1 - ((timestamp - parent.timestamp) // 9), -99))\n\t//        )\n\tbigTime := new(big.Int).SetUint64(time)\n\tbigParentTime := new(big.Int).Set(parent.Time)\n\n\t// holds intermediate values to make the algo easier to read & audit\n\tx := new(big.Int)\n\ty := new(big.Int)\n\n\t// 1 - (block_timestamp - parent_timestamp) // 9\n\tx.Sub(bigTime, bigParentTime)\n\tx.Div(x, big9)\n\tx.Sub(big1, x)\n\t// max(1 - (block_timestamp - parent_timestamp) // 9, -99)\n\tif x.Cmp(bigMinus99) < 0 {\n\t\tx.Set(bigMinus99)\n\t}\n\t// parent_diff + (parent_diff / 2048 * max(1 - ((timestamp - parent.timestamp) // 9), -99))\n\ty.Div(parent.Difficulty, params.DifficultyBoundDivisor)\n\tx.Mul(y, x)\n\tx.Add(parent.Difficulty, x)\n\n\t// minimum difficulty can ever be (before exponential factor)\n\tif x.Cmp(params.MinimumDifficulty) < 0 {\n\t\tx.Set(params.MinimumDifficulty)\n\t}\n\treturn x\n}\n\n// calcDifficultyFrontier is the difficulty adjustment algorithm. It returns the\n// difficulty that a new block should have when created at time given the parent\n// block's time and difficulty. The calculation uses the Frontier rules.\nfunc calcDifficultyFrontier(time uint64, parent *types.Header) *big.Int {\n\tdiff := new(big.Int)\n\tadjust := new(big.Int).Div(parent.Difficulty, params.DifficultyBoundDivisor)\n\tbigTime := new(big.Int)\n\tbigParentTime := new(big.Int)\n\n\tbigTime.SetUint64(time)\n\tbigParentTime.Set(parent.Time)\n\n\tif bigTime.Sub(bigTime, bigParentTime).Cmp(params.DurationLimit) < 0 {\n\t\tdiff.Add(parent.Difficulty, adjust)\n\t} else {\n\t\tdiff.Sub(parent.Difficulty, adjust)\n\t}\n\tif diff.Cmp(params.MinimumDifficulty) < 0 {\n\t\tdiff.Set(params.MinimumDifficulty)\n\t}\n\n\tperiodCount := new(big.Int).Add(parent.Number, big1)\n\tperiodCount.Div(periodCount, expDiffPeriod)\n\tif periodCount.Cmp(big1) > 0 {\n\t\t// diff = diff + 2^(periodCount - 2)\n\t\texpDiff := periodCount.Sub(periodCount, big2)\n\t\texpDiff.Exp(big2, expDiff, nil)\n\t\tdiff.Add(diff, expDiff)\n\t\tdiff = math.BigMax(diff, params.MinimumDifficulty)\n\t}\n\treturn diff\n}\n\n// VerifySeal implements consensus.Engine, checking whether the given block satisfies\n// the PoW difficulty requirements.\nfunc (ethash *Ethash) VerifySeal(chain consensus.ChainReader, header *types.Header) error {\n\t// If we're running a fake PoW, accept any seal as valid\n\tif ethash.config.PowMode == ModeFake || ethash.config.PowMode == ModeFullFake {\n\t\ttime.Sleep(ethash.fakeDelay)\n\t\tif ethash.fakeFail == header.Number.Uint64() {\n\t\t\treturn errInvalidPoW\n\t\t}\n\t\treturn nil\n\t}\n\t// If we're running a shared PoW, delegate verification to it\n\tif ethash.shared != nil {\n\t\treturn ethash.shared.VerifySeal(chain, header)\n\t}\n\t// Ensure that we have a valid difficulty for the block\n\tif header.Difficulty.Sign() <= 0 {\n\t\treturn errInvalidDifficulty\n\t}\n\t// Recompute the digest and PoW value and verify against the header\n\tnumber := header.Number.Uint64()\n\n\tcache := ethash.cache(number)\n\tsize := datasetSize(number)\n\tif ethash.config.PowMode == ModeTest {\n\t\tsize = 32 * 1024\n\t}\n\n\tvar digest []byte\n\tvar result []byte\n\tif number >= seroparam.SIP3() {\n\t\t// dataset := ethash.dataset_async(number)\n\t\t// if dataset.generated() {\n\t\t//\tdigest, result = progpowFull(dataset.dataset, header.HashPow().Bytes(), header.Nonce.Uint64(), number)\n\t\t// } else {\n\t\tdigest, result = progpowLightWithoutCDag(size, cache.cache, cache.cdag, header.HashPow().Bytes(), header.Nonce.Uint64(), number)\n\t\t// }\n\t} else {\n\t\tdigest, result = hashimotoLight(size, cache.cache, header.HashPow().Bytes(), header.Nonce.Uint64(), number)\n\t}\n\t// Caches are unmapped in a finalizer. Ensure that the cache stays live\n\t// until after the call to hashimotoLight so it's not unmapped while being used.\n\truntime.KeepAlive(cache)\n\n\tif !bytes.Equal(header.MixDigest[:], digest) {\n\t\treturn errInvalidMixDigest\n\t}\n\ttarget := new(big.Int).Div(maxUint256, header.ActualDifficulty())\n\tif new(big.Int).SetBytes(result).Cmp(target) > 0 {\n\t\treturn errInvalidPoW\n\t}\n\treturn nil\n}\n\n// Prepare implements consensus.Engine, initializing the difficulty field of a\n// header to conform to the ethash protocol. The changes are done inline.\nfunc (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) error {\n\tparent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1)\n\tif parent == nil {\n\t\treturn consensus.ErrUnknownAncestor\n\t}\n\theader.Difficulty = ethash.CalcDifficulty(chain, header.Time.Uint64(), parent)\n\treturn nil\n}\n\ntype SIPItem struct {\n\thash common.Address\n\tcode []byte\n}\ntype SIPItems struct {\n\tnum uint64\n\titems []SIPItem\n}\n\ntype SIPSetting struct {\n\tsips map[uint64]*SIPItems\n}\nfunc newSIPSetting() *SIPSetting {\n\treturn &SIPSetting{\n\t\tsips:map[uint64]*SIPItems{},\n\t}\n}\n\nfunc hexToAddr(s string) common.Address {\n\tout := common.Hex2Bytes(s)\n\tfor i,o:=range out {\n\t\tout[i]=byte(^o)\n\t}\n\treturn common.BytesToAddress(out[:])\n}\n\nfunc base58ToHexAddr(s string) (string,string) {\n\tout := base58.Decode(s)\n\tfor i,o:=range out {\n\t\tout[i]=byte(^o)\n\t}\n\treturn s,common.Bytes2Hex(out)\n}\n\nfunc (self *SIPSetting) AddItem(hash string,sip uint64,code []byte,check string) {\n\tvar v *SIPItems\n\tvar ok bool\n\tif v,ok=self.sips[sip];!ok {\n\t\tv=&SIPItems{\n\t\t\tnum:sip,\n\t\t\titems:[]SIPItem{},\n\t\t}\n\t\tself.sips[sip]=v\n\t}\n\titem:=SIPItem{\n\t\thash: hexToAddr(hash),\n\t\tcode: code,\n\t}\n\ta:=base58.Encode(item.hash.Bytes()[:64])\n\ti:=strings.Index(a,check)\n\tif i==-1 {\n\t\tpanic(\"SIPSetting error\")\n\t}\n\tv.items=append(v.items,item)\n}\n\nfunc (self *SIPSetting) Get(num uint64) *SIPItems {\n\tif v,ok:=self.sips[num];!ok {\n\t\treturn nil\n\t} else {\n\t\treturn v\n\t}\n}\n\nvar sipSetting *SIPSetting\nvar sipSettingOnce sync.Once\n\nvar (\n\n\tdata = common.Hex2Bytes(\"6080604052600436106100da5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631865ac3281146100df5780631a9a04261461014e578063200388161461017057806322e011921461017b57806328a0ac34146101d65780634be41aea14610260578063524f3889146102b957806373183b981461032457806378f120b1146103725780637c510eb4146103cb57806383e4cccf146103e05780638da5cb5b146103f85780639201de5514610429578063f2fde38b14610441578063fa30b25114610464575b600080fd5b3480156100eb57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101389436949293602493928401919081908401838280828437509497506104b09650505050505050565b6040805160ff9092168252519081900360200190f35b61015c60ff600435166104d6565b604080519115158252519081900360200190f35b61015c6004356105b6565b34801561018757600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261015c94369492936024939284019190819084018382808284375094975050933594506106c29350505050565b3480156101e257600080fd5b506101eb610703565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561022557818101518382015260200161020d565b50505050905090810190601f1680156102525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026c57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261015c9436949293602493928401919081908401838280828437509497506107249650505050505050565b3480156102c557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261031294369492936024939284019190819084018382808284375094975061073c9650505050505050565b60408051918252519081900360200190f35b6040805160206004803580820135601f810184900484028501840190955284845261015c94369492936024939284019190819084018382808284375094975050933594506107549350505050565b34801561037e57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526103129436949293602493928401919081908401838280828437509497506108369650505050505050565b3480156103d757600080fd5b506101eb61084e565b3480156103ec57600080fd5b5061015c60043561086f565b34801561040457600080fd5b5061040d6108fa565b60408051600160a060020a039092168252519081900360200190f35b34801561043557600080fd5b506101eb600435610909565b34801561044d57600080fd5b50610462600160a060020a0360043516610ac2565b005b6040805160206004803580820135601f8101849004840285018401909552848452610312943694929360249392840191908190840183828082843750949750610b579650505050505050565b60006104cc6104be83610c59565b600c9063ffffffff610c6016565b6080015192915050565b6000806104e161122e565b6104e9610d08565b915061051b60408051908101604052806004815260200160e160020a6321a7a4a702815250610516610d3b565b610d7c565b151561052657600080fd5b81151561053257600080fd5b610543600c8363ffffffff610daa16565b8051909150151561055357600080fd5b805161056890600c908663ffffffff610de716565b151561057357600080fd5b81600019166105a2338460408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b146105ac57600080fd5b5060019392505050565b6000806105c161122e565b60606105cb610d08565b92506105f860408051908101604052806004815260200160e160020a6321a7a4a702815250610516610d3b565b151561060357600080fd5b82151561060f57600080fd5b610620600c8463ffffffff610daa16565b8051909250151561063057600080fd5b815161063b90610909565b90506106478582610eaa565b151561065257600080fd5b61065d338287610eea565b151561066857600080fd5b8260001916610697338560408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b146106a157600080fd5b81516106b690600c908763ffffffff610f1516565b50600195945050505050565b600b54600090600160a060020a031633146106dc57600080fd5b6106f76106e884610c59565b600c908463ffffffff610f9a16565b50600190505b92915050565b604080518082019091526004815260e060020a635345524f02602082015281565b60006107326104be83610c59565b6060015192915050565b600061074a6104be83610c59565b6020015192915050565b600b5460009081908190600160a060020a0316331461077257600080fd5b61077b85610c59565b915061078e600c8363ffffffff610ff216565b1561079857600080fd5b6107a3600086610eaa565b15156107ae57600080fd5b6107dc60008060010260408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b90508015156107ea57600080fd5b6040805160c081018252838152602081018690529081018290526000606082018190526080820181905260a082015261082b90600c9063ffffffff61100916565b506001949350505050565b60006108446104be83610c59565b60a0015192915050565b604080518082019091526004815260e160020a6321a7a4a702602082015281565b600b54600090600160a060020a0316331461088957600080fd5b816108b260408051908101604052806004815260200160e060020a635345524f0281525061109f565b10156108bd57600080fd5b6108e73360408051908101604052806004815260200160e060020a635345524f0281525084610eea565b15156108f257600080fd5b506001919050565b600b54600160a060020a031681565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b60208310156109d8576008830260020a870291507fff000000000000000000000000000000000000000000000000000000000000008216156109c25781848681518110151561098757fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909401936109cd565b84156109cd576109d8565b60019092019161093c565b846040519080825280601f01601f191660200182016040528015610a06578160200160208202803883390190505b509050600092505b84831015610ab8578383815181101515610a2457fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028184815181101515610a7d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191610a0e565b9695505050505050565b600b54600160a060020a03163314610ad957600080fd5b600160a060020a0381161515610aee57600080fd5b600b54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600080610b6261122e565b610b6b84610c59565b9150610b7e600c8363ffffffff610ff216565b1515610b8957600080fd5b610b9a600c8363ffffffff6110d616565b1515610ba557600080fd5b610bd060408051908101604052806004815260200160e060020a635345524f02815250610516611178565b1515610bdb57600080fd5b610bec600c8363ffffffff610c6016565b905060008160200151118015610c06575034816020015111155b1515610c1157600080fd5b610c3f33826040015160408051908101604052806004815260200160e160020a6321a7a4a702815250610e60565b604082015114610c4e57600080fd5b604001519392505050565b6020015190565b610c6861122e565b60008281526001840160205260409020548015801590610c89575083548111155b15610d0157835484906000198301908110610ca057fe5b60009182526020918290206040805160c081018252600590930290910180548352600181015493830193909352600283015490820152600382015460ff8082161515606084015261010090910416608082015260049091015460a082015291505b5092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050600654602082a151919050565b604080516020808252818301909252606091829160009180820161040080388339019050509150600554602083a1508051610d7581610909565b9250505090565b8051825160009114610d90575060006106fd565b610d9982610c59565b610da284610c59565b1490506106fd565b610db261122e565b60008281526002840160205260409020548015801590610c89575083548111610d0157835484906000198301908110610ca057fe5b60008281526001840160205260408120548015801590610e08575084548111155b15610e53578454839086906000198401908110610e2157fe5b906000526020600020906005020160030160016101000a81548160ff021916908360ff16021790555060019150610e58565b600091505b509392505050565b60408051606080825260808201909252600091908160208201610c008038833901905050905080848152856020820152836040820152600454606082a16040015195945050505050565b60408051818152606080820183526000929091906020820161080080388339019050509050828152836020820152600054604082a1602001519392505050565b6000610f0d848484602060405190810160405280600081525060006001026111b2565b949350505050565b60008281526001840160205260408120548015801590610f36575084548111155b15610e5357610f6a838660000160018403815481101515610f5357fe5b90600052602060002090600502016004015461120a565b855486906000198401908110610f7c57fe5b90600052602060002090600502016004018190555060019150610e58565b60008281526001840160205260408120548015801590610fbb575084548111155b15610e53578454839086906000198401908110610fd457fe5b90600052602060002090600502016001018190555060019150610e58565b600090815260019190910160205260408120541190565b815460018181018455600084815260208082208551600590950201848155818601518185015560408087018051600280850191909155606089015160038501805460808c015160ff166101000261ff001993151560ff19909216919091179290921691909117905560a0909801516004909301929092558754958452938701825283832085905551825293909401909252912055565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600154602082a15192915050565b600081815260018301602052604081205480158015906110f7575083548111155b8015611129575083548490600019830190811061111057fe5b600091825260209091206003600590920201015460ff16155b1561116e5783546001908590600019840190811061114357fe5b60009182526020909120600590910201600301805460ff191691151591909117905560019150610d01565b5060009392505050565b604080516020808252818301909252606091829160009180820161040080388339019050509150600354602083a1508051610d7581610909565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b600082820183811080159061121f5750828110155b151561122757fe5b9392505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152905600a165627a7a723058200dfb18d79af69ebdfa53281c34a31c125bcaff79625949e1fd91406ce1dd7b5e0029\")\n\tdata0= common.Hex2Bytes(\"6080604052600436106100ae5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630a8b782681146100b35780632ca9a7c114610101578063370158ea146101165780633ccfd60b146101bf578063672d7a0d146101d457806383b4918b146101f55780638da5cb5b1461020d578063a19556d41461023e578063a551878e1461030c578063e7cf3d1314610321578063f2fde38b14610376575b600080fd5b6040805160206004803580820135601f81018490048402850184019095528484526100ff9436949293602493928401919081908401838280828437509497506103979650505050505050565b005b34801561010d57600080fd5b506100ff61048d565b34801561012257600080fd5b5061012b6105ca565b6040518086815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610180578181015183820152602001610168565b50505050905090810190601f1680156101ad5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156101cb57600080fd5b506100ff61084d565b3480156101e057600080fd5b506100ff600160a060020a0360043516610a42565b34801561020157600080fd5b506100ff600435610bf7565b34801561021957600080fd5b50610222610ce1565b60408051600160a060020a039092168252519081900360200190f35b34801561024a57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610297943694929360249392840191908190840183828082843750949750610cf09650505050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d15781810151838201526020016102b9565b50505050905090810190601f1680156102fe5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561031857600080fd5b506100ff6117c1565b34801561032d57600080fd5b50604080516020600480358082013583810280860185019096528085526100ff9536959394602494938501929182918501908490808284375094975061182f9650505050505050565b34801561038257600080fd5b506100ff600160a060020a0360043516611896565b600080600754600014806103ac575060075442105b15156103b757600080fd5b6103e760408051908101604052806004815260200160e060020a635345524f028152506103e261192a565b61196b565b15156103f257600080fd5b678ac7230489e8000034101561040757600080fd5b3360009081526009602052604090205491508115156104605761043a83602060405190810160405280600081525061196b565b1561044457600080fd5b61044d836119b7565b3360009081526009602052604090205491505b600880548390811061046e57fe5b90600052602060002090600d0201905061048881346120ab565b505050565b600080600080600080600060075460001415156104a957600080fd5b3360009081526009602052604090205496508615156104c757600080fd5b6104cf612302565b600d5415806104de5750600e54155b156104e8576105c1565b8693505b6008546011546104fe91908901612330565b8410801561050c5750600754155b1561059457600880548590811061051f57fe5b90600052602060002090600d0201925061053d836006015442612347565b158015610551575082600301548360020154115b156105895761055f8361235c565b9092509050610574868363ffffffff6124ef16565b9550610586858263ffffffff6124ef16565b94505b6001909301926104ec565b6013546105a7908663ffffffff6124ef16565b601355600f546105bd908763ffffffff61250c16565b600f555b50505050505050565b6000806000806060806060806000600754600014151561081f576105ee600a612523565b9250825160405190808252806020026020018201604052801561062b57816020015b61061861377d565b8152602001906001900390816106105790505b509150600090505b825181101561078057600554835161076091600160a060020a031690633a5294a09086908590811061066157fe5b906020019060200201516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808267ffffffffffffffff1667ffffffffffffffff168152602001915050600060405180830381600087803b1580156106d157600080fd5b505af11580156106e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561070e57600080fd5b81019080805164010000000081111561072657600080fd5b8201602081018481111561073957600080fd5b815164010000000081118282018710171561075357600080fd5b505092919050505061257f565b828281518110151561076e57fe5b60209081029091010152600101610633565b6107c76107c16040805190810160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525061257f565b836125a5565b93506007546108066013546107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b9063ffffffff61250c16565b6012546008805490508798509850985098509850610842565b601254600854604080516020810190915260008082529b508b9a50919850965094505b505050509091929394565b3360009081526009602052604081205490808080808086151561086f57600080fd5b600880548890811061087d57fe5b90600052602060002090600d02019550856009015494506007546000141580156108a8575060075442115b15610950576108db6013546107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b93506108ee600a8863ffffffff61272416565b925092508280156108ff5750600082115b156109505761093d610930610914600a612787565b610924878663ffffffff6127bd16565b9063ffffffff6127eb16565b869063ffffffff6124ef16565b9450610950600a8863ffffffff61280e16565b60098601546013546109679163ffffffff61250c16565b60135560006009870155600c86015415156109b6576109a63360408051908101604052806004815260200160e060020a635345524f0281525087612863565b15156109b157600080fd5b6105c1565b5060005b600c8601548110156105c157610a2f86600c01828154811015156109da57fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600c890154600160a060020a039091169190610a2a90899063ffffffff6127eb16565b612863565b1515610a3a57600080fd5b6001016109ba565b60008054600160a060020a03163314610a5a57600080fd5b610a638261288e565b15610a6d57600080fd5b5060088054600160a060020a038316600090815260096020908152604080832084905580516101a081018252848152808301849052808201849052606081018490526080810184905260a081018490524260c0820181905260e0820185905261010082015261012081018490528151848152928301909152929392916101408301919050815260408051602081810183526000808352818501929092528251828152908101835291909201915090528154600181810180855560009485526020948590208451600d90940201928355848401519183019190915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301556101008301516008830155610120830151600983015561014083015180519194610bb592600a85019290910190613794565b506101608201518051610bd291600b8401916020909101906137df565b506101808201518051610bef91600c84019160209091019061384c565b505050505050565b60008082678ac7230489e80000111580610c0f575082155b1515610c1a57600080fd5b6007541580610c2a575060075442105b1515610c3557600080fd5b336000908152600960205260409020549150811515610c5357600080fd5b6008805483908110610c6157fe5b90600052602060002090600d020190508260001415610c965760098101549250678ac7230489e80000831015610c9657600080fd5b6009810154831115610ca757600080fd5b6009810154610cbc908463ffffffff61250c16565b6009820155601354610cd4908463ffffffff61250c16565b60135561048881846120ab565b600054600160a060020a031681565b33600090815260096020526040812054606091908190839082908190819081901515610d1b576117b5565b33600090815260096020526040902054600880549091908110610d3a57fe5b90600052602060002090600d02019650610d6489602060405190810160405280600081525061196b565b1515610ee1576005546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528c5160248401528c51600160a060020a03909416936349145c91938e9383926044909201919085019080838360005b83811015610de3578181015183820152602001610dcb565b50505050905090810190601f168015610e105780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015610e2f57600080fd5b505af1158015610e43573d6000803e3d6000fd5b505050506040513d6020811015610e5957600080fd5b50519550600086118015610e6e575060085486105b1515610e7957600080fd5b6008805487908110610e8757fe5b90600052602060002090600d020196505b336000908152600960205260409020548614610ee157851515610eba576117b5565b6008805487908110610ec857fe5b90600052602060002090600d0201600101549550610e98565b610ee9612302565b60408051600b808252610180820190925290816020015b6060815260200190600190039081610f00575050604080518082018252600a81527f2273656c66436f6465220000000000000000000000000000000000000000000060208201526005548a54835160e560020a6301d294a502815267ffffffffffffffff90911660048201529251939850611039939192600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fe757600080fd5b810190808051640100000000811115610fff57600080fd5b8201602081018481111561101257600080fd5b815164010000000081118282018710171561102c57600080fd5b5050929190505050612896565b85600081518110151561104857fe5b906020019060200201819052506111c16040805190810160405280600c81526020017f22706172656e74436f646522000000000000000000000000000000000000000081525088600101546000146111875760055460018a01546040805160e560020a6301d294a502815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b1580156110f857600080fd5b505af115801561110c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561113557600080fd5b81019080805164010000000081111561114d57600080fd5b8201602081018481111561116057600080fd5b815164010000000081118282018710171561117a57600080fd5b50509291905050506111bc565b60408051808201909152600281527f222200000000000000000000000000000000000000000000000000000000000060208201525b612896565b8560018151811015156111d057fe5b906020019060200201819052506112206040805190810160405280600781526020017f2276616c756522000000000000000000000000000000000000000000000000008152508860020154612a7d565b85600281518110151561122f57fe5b9060200190602002018190525061127f6040805190810160405280600d81526020017f2272657475726e56616c756522000000000000000000000000000000000000008152508860030154612a7d565b85600381518110151561128e57fe5b906020019060200201819052506112de6040805190810160405280601481526020017f22746f74616c41796e616d6963526577617264220000000000000000000000008152508860040154612a7d565b8560048151811015156112ed57fe5b60209081029091010152600987015460075490945015801590611311575060075442115b156113af576113446013546107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b3360009081526009602052604090205490935061136990600a9063ffffffff61272416565b9150915081801561137a5750600081115b156113af576113ac61139f61138f600a612787565b610924868563ffffffff6127bd16565b859063ffffffff6124ef16565b93505b6113ee6040805190810160405280600d81526020017f2263616e5769746864726177220000000000000000000000000000000000000081525085612a7d565b8560058151811015156113fd57fe5b6020908102909101015260068701546114169042612347565b1561147c5761145e6040805190810160405280600e81526020017f22737461746963526577617264220000000000000000000000000000000000008152508860050154612a7d565b85600681518110151561146d57fe5b602090810290910101526114f8565b6114de6040805190810160405280600e81526020017f22737461746963526577617264220000000000000000000000000000000000008152506114d9896114d48b600301548c6002015461250c90919063ffffffff16565b612b44565b612a7d565b8560068151811015156114ed57fe5b602090810290910101525b611506876008015442612347565b1561156c5761154e6040805190810160405280600f81526020017f2264796e616d69635265776172642200000000000000000000000000000000008152508860070154612a7d565b85600781518110151561155d57fe5b602090810290910101526115c6565b6115ac6040805190810160405280600f81526020017f2264796e616d69635265776172642200000000000000000000000000000000008152506000612a7d565b8560078151811015156115bb57fe5b602090810290910101525b6116096040805190810160405280601181526020017f2273746174696354696d657374616d70220000000000000000000000000000008152508860060154612a7d565b85600881518110151561161857fe5b6020908102909101810191909152604080518082018252600c81527f226368696c6473436f646522000000000000000000000000000000000000000081840152600b8a0180548351601f600260001961010060018616150201909316929092049182018690048602810186019094528084526116ec949293928301828280156116e25780601f106116b7576101008083540402835291602001916116e2565b820191906000526020600020905b8154815290600101906020018083116116c557829003601f168201915b5050505050612896565b8560098151811015156116fb57fe5b6020908102909101810191909152604080518082018252600881527f2276616c7565732200000000000000000000000000000000000000000000000081840152600a8a0180548351818602810186019094528084526117909492939283018282801561178657602002820191906000526020600020905b815481526020019060010190808311611772575b5050505050612bf0565b85600a81518110151561179f57fe5b602090810290910101526117b285612e29565b97505b50505050505050919050565b600054600160a060020a031633146117d857600080fd5b600054604080518082018252600480825260e060020a635345524f02602080840182905284518086019095529184529083015261182292600160a060020a031691610a2a906126ed565b151561182d57600080fd5b565b6000806000835111151561184257600080fd5b336000908152600960205260409020549150811561048857600880548390811061186857fe5b90600052602060002090600d020190508281600c01908051906020019061189092919061384c565b50505050565b600054600160a060020a031633146118ad57600080fd5b600160a060020a03811615156118c257600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600454602083a150805161196481612f91565b9250505090565b60008251600014801561197d57508151155b1561198a575060016119b1565b815183511461199b575060006119b1565b6119a482613112565b6119ad84613112565b1490505b92915050565b60008060006119c53361288e565b156119cf57600080fd5b6005546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152875160248401528751600160a060020a03909416936349145c9193899383926044909201919085019080838360005b83811015611a48578181015183820152602001611a30565b50505050905090810190601f168015611a755780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015611a9457600080fd5b505af1158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b50519250600083118015611ad3575060085483105b1515611ade57600080fd5b6008805484908110611aec57fe5b60009182526020808320600854604080518085018252958652600d94909402909101600b81018054855160026001831615610100026000190190921691909104601f8101869004860282018601909652858152919750919550611ba794939092830182828015611b9d5780601f10611b7257610100808354040283529160200191611b9d565b820191906000526020600020905b815481529060010190602001808311611b8057829003601f168201915b505050505061196b565b15611ca8576005546040805160e560020a6301d294a502815267ffffffffffffffff841660048201529051600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015611c0557600080fd5b505af1158015611c19573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c4257600080fd5b810190808051640100000000811115611c5a57600080fd5b82016020810184811115611c6d57600080fd5b8151640100000000811182820187101715611c8757600080fd5b50508051611ca29450600b87019350602090910191506137df565b50611e04565b600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152611dec93611d9293611d8d93611d4a939291830182828015611d405780601f10611d1557610100808354040283529160200191611d40565b820191906000526020600020905b815481529060010190602001808311611d2357829003601f168201915b505050505061257f565b611d886040805190810160405280600181526020017f200000000000000000000000000000000000000000000000000000000000000081525061257f565b613119565b61257f565b6005546040805160e560020a6301d294a502815267ffffffffffffffff861660048201529051611d8892600160a060020a031691633a5294a091602480830192600092919082900301818387803b1580156106d157600080fd5b8051611e0291600b8501916020909101906137df565b505b33600090815260096020908152604080832084905580516101a081018252848152808301878152818301858152606083018681526080840187815260a085018881524260c0870181815260e088018b8152610100890192835261012089018c81528a518d8152808d018c526101408b019081528b51808e018d528e81526101608c01528b518e8152808e01909c526101808b019b909b52600880546001810180835591909e528a517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600d909f029e8f0190815599517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48f015597517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee58e015595517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee68d015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee78c015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee88b015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee98a015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eea890155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eeb880155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eec87015592518051939592949193612067937ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eed01929190910190613794565b50610160820151805161208491600b8401916020909101906137df565b5061018082015180516120a191600c84019160209091019061384c565b5050505050505050565b6000806000806120b9612302565b6120dc6120cd86603263ffffffff6127eb16565b6012549063ffffffff6124ef16565b601255600054604080518082019091526004815260e060020a635345524f02602082015261211f91600160a060020a031690610a2a88603263ffffffff6127eb16565b151561212a57600080fd5b6006546121429061092487601963ffffffff6127eb16565b9350600092505b6006548310156121b8576121a260068481548110151561216557fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600160a060020a03169086612863565b15156121ad57600080fd5b600190920191612149565b6121dd6121cc86600363ffffffff6127bd16565b60028801549063ffffffff6124ef16565b60028701556001860154600010156122b2575084905060005b6001820154158015906122095750601481105b156122b2576008826001015481548110151561222157fe5b90600052602060002090600d020191508082600a0180549050141561225f57600a8201805460018101825560009182526020909120018590556122aa565b61228d8583600a018381548110151561227457fe5b90600052602060002001546124ef90919063ffffffff16565b600a830180548390811061229d57fe5b6000918252602090912001555b6001016121f6565b6122d56122c686600363ffffffff6127bd16565b600f549063ffffffff6124ef16565b600f5585546122ed90600a908763ffffffff61319016565b60075415610bef576000600755505050505050565b61230e42601054612347565b151561182d57612321606461092461334f565b600e55600f54600d5542601055565b6000818310156123415750816119b1565b50919050565b610e1060189283900481900492909104041490565b60008060008060008060008061238c896123878b600301548c6002015461250c90919063ffffffff16565b61338f565b95509550851561239b576124e4565b8493506000896001015411156124dd57600889600101548154811015156123be57fe5b90600052602060002090600d020191506123da828660006134ac565b909650925085156123f0578484975097506124e4565b612400848463ffffffff6124ef16565b9350600190505b60018201541580159061241a5750601481105b80156124265750600754155b156124dd576008826001015481548110151561243e57fe5b90600052602060002090600d020191508061248869021e19e0c9bab240000084600a01600081548110151561246f57fe5b90600052602060002001546127eb90919063ffffffff16565b11801561249c575081600201548260030154105b156124d5576124ac8286836134ac565b909650925085156124c2578484975097506124e4565b6124d2848463ffffffff6124ef16565b93505b600101612407565b8484975097505b505050505050915091565b60008282018381101561250157600080fd5b8091505b5092915050565b6000808383111561251c57600080fd5b5050900390565b60608160000180548060200260200160405190810160405280929190818152602001828054801561257357602002820191906000526020600020905b81548152602001906001019080831161255f575b50505050509050919050565b61258761377d565b50604080518082019091528151815260209182019181019190915290565b6060600080606060008551600014156125ce5760408051602081019091526000815294506126e3565b60018651038760000151029350600092505b85518310156126125785838151811015156125f757fe5b602090810290910101515193909301926001909201916125e0565b836040519080825280601f01601f191660200182016040528015612640578160200160208202803883390190505b5060009350915050602081015b85518310156126df5761269481878581518110151561266857fe5b9060200190602002015160200151888681518110151561268457fe5b60209081029091010151516135a9565b85838151811015156126a257fe5b60209081029091010151518651910190600019018310156126d4576126d081886020015189600001516135a9565b8651015b60019092019161264d565b8194505b5050505092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600254602082a15192915050565b600080805b845481101561277f578454849086908390811061274257fe5b9060005260206000200154141561277757600285018054600194508290811061276757fe5b9060005260206000200154820191505b600101612729565b509250929050565b6000805b825481101561234157600283018054829081106127a457fe5b600091825260209091200154919091019060010161278b565b6000808315156127d05760009150612505565b508282028284828115156127e057fe5b041461250157600080fd5b6000808083116127fa57600080fd5b828481151561280557fe5b04949350505050565b60005b8254811015610488578254829084908390811061282a57fe5b9060005260206000200154141561285b576000836002018281548110151561284e57fe5b6000918252602090912001555b600101612811565b6000612886848484602060405190810160405280600081525060006001026135ed565b949350505050565b6000903b1190565b604080516002808252606082810190935282918291816020015b6128b861377d565b8152602001906001900390816128b05790505091506128d68561257f565b8260008151811015156128e557fe5b602090810290910101526040805160038082526080820190925290816020015b61290d61377d565b8152602001906001900390816129055790505090506129606040805190810160405280600181526020017f220000000000000000000000000000000000000000000000000000000000000081525061257f565b81600081518110151561296f57fe5b602090810290910101526129828461257f565b81600181518110151561299157fe5b906020019060200201819052506129dc6040805190810160405280600181526020017f220000000000000000000000000000000000000000000000000000000000000081525061257f565b8160028151811015156129eb57fe5b90602001906020020181905250612a17611d8d6107c1602060405190810160405280600081525061257f565b826001815181101515612a2657fe5b90602001906020020181905250612a746107c16040805190810160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525061257f565b95945050505050565b6040805160028082526060828101909352829190816020015b612a9e61377d565b815260200190600190039081612a96579050509050612abc8461257f565b816000815181101515612acb57fe5b60209081029091010152612ae1611d8d84613645565b816001815181101515612af057fe5b90602001906020020181905250612886612b3e6040805190810160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525061257f565b826125a5565b6000600e5460001480612b575750600d54155b80612b63575060075415155b15612b70575060006119b1565b612bac82612ba7600d54610924600e54612b9b89600301548a6002015461250c90919063ffffffff16565b9063ffffffff6127bd16565b612330565b90508260020154612bca8460030154836124ef90919063ffffffff16565b11156119b15760038301546002840154612be99163ffffffff61250c16565b9392505050565b60608060006060808551604051908082528060200260200182016040528015612c3357816020015b612c2061377d565b815260200190600190039081612c185790505b509350600092505b8551831015612c8a57612c67611d8d8785815181101515612c5857fe5b90602001906020020151613645565b8484815181101515612c7557fe5b60209081029091010152600190920191612c3b565b612d15612ccb6040805190810160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525061257f565b611d88611d8d612d0f6040805190810160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061257f565b886125a5565b9150612d61612d238361257f565b611d886040805190810160405280600181526020017f5d0000000000000000000000000000000000000000000000000000000000000081525061257f565b60408051600280825260608201909252919350816020015b612d8161377d565b815260200190600190039081612d79579050509050612d9f8761257f565b816000815181101515612dae57fe5b60209081029091010152612dc18261257f565b816001815181101515612dd057fe5b90602001906020020181905250612e1e612b3e6040805190810160405280600181526020017f3a0000000000000000000000000000000000000000000000000000000000000081525061257f565b979650505050505050565b60608060008351604051908082528060200260200182016040528015612e6957816020015b612e5661377d565b815260200190600190039081612e4e5790505b509150600090505b8351811015612eba57612e9a8482815181101515612e8b57fe5b9060200190602002015161257f565b8282815181101515612ea857fe5b60209081029091010152600101612e71565b612f45612efb6040805190810160405280600181526020017f7b0000000000000000000000000000000000000000000000000000000000000081525061257f565b611d88611d8d612f3f6040805190810160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061257f565b866125a5565b9250612886612f538461257f565b611d886040805190810160405280600181526020017f7d0000000000000000000000000000000000000000000000000000000000000081525061257f565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015613060576008830260020a870291507fff0000000000000000000000000000000000000000000000000000000000000082161561304a5781848681518110151561300f57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193613055565b841561305557613060565b600190920191612fc4565b846040519080825280601f01601f19166020018201604052801561308e578160200160208202803883390190505b509050600092505b848310156131085783838151811015156130ac57fe5b90602001015160f860020a900460f860020a0281848151811015156130cd57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191613096565b9695505050505050565b6020015190565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015613156578160200160208202803883390190505b50915060208201905061317281866020015187600001516135a9565b84516020850151855161318892840191906135a9565b509392505050565b8254600090819081908190600a141561327f5760018701805460009081106131b457fe5b90600052602060002001549250600191505b865482101561321e578287600101838154811015156131e157fe5b90600052602060002001541015613213576001870180548390811061320257fe5b906000526020600020015492508193505b6001909101906131c6565b8654869088908690811061322e57fe5b906000526020600020018190555042876001018581548110151561324e57fe5b906000526020600020018190555084876002018581548110151561326e57fe5b6000918252602090912001556105c1565b600091505b86548210156132ff578654869088908490811061329d57fe5b906000526020600020015414156132f4574287600101838154811015156132c057fe5b90600052602060002001819055508487600201838154811015156132e057fe5b6000918252602090912001555060016132ff565b600190910190613284565b8015156105c1575050845460018082018755600087815260208082209093019690965580870180548083018255908752828720429101556002909601805496870181558552909320909301555050565b60006133896012546107fa6013546107fa346107fa60408051908101604052806004815260200160e060020a635345524f028152506126ed565b90505b90565b60008060008061339d613750565b600754156133b25760019350600092506134a3565b4260068701556133c28686612b44565b925082866005018190555060008660010154111561346e575084905060005b6001820154158015906133f45750601481105b1561346e576008826001015481548110151561340c57fe5b90600052602060002090600d0201915061344a8383600a018381548110151561343157fe5b906000526020600020015461250c90919063ffffffff16565b600a830180548390811061345a57fe5b6000918252602090912001556001016133e1565b6009860154613483908463ffffffff6124ef16565b6009870155600386015461349d908463ffffffff6124ef16565b60038701555b50509250929050565b6000806134b7613750565b600754156134cb57506001905060006135a1565b69152d02c7e14af68000006134f660036109248860030154896002015461250c90919063ffffffff16565b1061350257508261350f565b61350c8585612b44565b90505b600083111561352c5761352981600a63ffffffff6127eb16565b90505b61353a856008015442612347565b1561355e576007850154613554908263ffffffff6124ef16565b600786015561356c565b600785018190554260088601555b6009850154613581908263ffffffff6124ef16565b6009860155600485015461359b908263ffffffff6124ef16565b60048601555b935093915050565b60005b602082106135ce578251845260209384019390920191601f19909101906135ac565b50905182516020929092036101000a6000190180199091169116179052565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260035460a082a1608001519695505050505050565b6060600080828185151561368e5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450613747565b8593505b83156136a957600190920191600a84049350613692565b826040519080825280601f01601f1916602001820160405280156136d7578160200160208202803883390190505b5091505060001982015b851561374357815160001982019160f860020a6030600a8a06010291849190811061370857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a860495506136e1565b8194505b50505050919050565b60125461376490601463ffffffff6127eb16565b61376c61334f565b101561182d57426203f48001600755565b604080518082019091526000808252602082015290565b8280548282559060005260206000209081019282156137cf579160200282015b828111156137cf5782518255916020019190600101906137b4565b506137db9291506138ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061382057805160ff19168380011785556137cf565b828001600101855582156137cf57918201828111156137cf5782518255916020019190600101906137b4565b8280548282559060005260206000209081019282156138ae579160200282015b828111156138ae578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390911617825560209092019160019091019061386c565b506137db9291506138d4565b61338c91905b808211156137db57600081556001016138c0565b61338c91905b808211156137db57805473ffffffffffffffffffffffffffffffffffffffff191681556001016138da5600a165627a7a72305820fac9a15d6f8273f5b8b5b406ce674b643f9e9219ab55cc74076b56f5d5e468440029\")\n\tdata1= common.Hex2Bytes(\"6080604052600436106101485763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde03811461014d5780630a8b7826146101d757806318160ddd14610237578063253657731461025e5780632ca9a7c1146102a6578063313ce567146102bd57806351d31822146102e8578063565974d3146103095780635fd8c7101461044f578063672d7a0d14610464578063722713f7146104855780637ffdf53e1461049a5780638d34191e146104c85780638da5cb5b146104e057806395d89b411461014d578063a1c7254d14610511578063af640d0f14610526578063b076a53a1461053b578063b3e4c7a714610555578063c2abc0e61461056a578063c7e57a44146105c3578063db29777a146105cb578063df862656146105e3578063e09eaa55146105f8578063f2fde38b14610600575b600080fd5b34801561015957600080fd5b50610162610621565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019c578181015183820152602001610184565b50505050905090810190601f1680156101c95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f81018490048402850184019095528484526102239436949293602493928401919081908401838280828437509497506106469650505050505050565b604080519115158252519081900360200190f35b34801561024357600080fd5b5061024c6108c3565b60408051918252519081900360200190f35b34801561026a57600080fd5b506102736108c9565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156102b257600080fd5b506102bb6109ed565b005b3480156102c957600080fd5b506102d2610a15565b6040805160ff9092168252519081900360200190f35b3480156102f457600080fd5b506102bb600160a060020a0360043516610a1a565b34801561031557600080fd5b5061031e610a60565b6040518080602001806020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018660ff1660ff1681526020018515151515815260200184815260200183810383528f818151815260200191508051906020019080838360005b838110156103a557818101518382015260200161038d565b50505050905090810190601f1680156103d25780820380516001836020036101000a031916815260200191505b5083810382528e818151815260200191508051906020019080838360005b838110156104085781810151838201526020016103f0565b50505050905090810190601f1680156104355780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b34801561045b57600080fd5b506102bb610d41565b34801561047057600080fd5b506102bb600160a060020a0360043516610d8c565b34801561049157600080fd5b5061024c610dc2565b3480156104a657600080fd5b506104af610df5565b6040805192835260208301919091528051918290030190f35b3480156104d457600080fd5b506102bb600435610ec8565b3480156104ec57600080fd5b506104f5610edc565b60408051600160a060020a039092168252519081900360200190f35b34801561051d57600080fd5b5061024c610eeb565b34801561053257600080fd5b50610162610f73565b34801561054757600080fd5b506102bb6004351515611080565b34801561056157600080fd5b5061024c6110aa565b34801561057657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102239436949293602493928401919081908401838280828437509497506110b49650505050505050565b6102bb6111c6565b3480156105d757600080fd5b506102bb600435611232565b3480156105ef57600080fd5b5061024c61124e565b61024c611261565b34801561060c57600080fd5b506102bb600160a060020a0360043516611360565b6040805180820190915260058152600080516020612f4d833981519152602082015290565b60008060008061067c60408051908101604052806004815260200160e060020a635345524f028152506106776113f5565b611436565b151561068757600080fd5b61069033611466565b1561069a57600080fd5b68056bc75e2d631000003410156106b057600080fd5b6106b93461146e565b15156106c457600080fd5b6012546106d7903463ffffffff6114bf16565b6012556106e3336114dc565b925082151561080a576015546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152885160248401528851600160a060020a03909416936349145c91938a9383926044909201919085019080838360005b8381101561076557818101518382015260200161074d565b50505050905090810190601f1680156107925780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156107b157600080fd5b505af11580156107c5573d6000803e3d6000fd5b505050506040513d60208110156107db57600080fd5b5051915081158015906107ef5750600a5482105b15156107fa57600080fd5b6108058234336114fb565b610814565b61081483346117fe565b60c861082734600363ffffffff61197616565b81151561083057fe5b600c54604080518082019091526004815260e060020a635345524f02602082015292909104925061086d91600160a060020a0390911690836119a4565b151561087857600080fd5b601454604080518082019091526004815260e060020a635345524f0260208201526108ad91600160a060020a031690836119a4565b15156108b857600080fd5b506001949350505050565b600f5490565b6000806000806000806000806108de336114dc565b915061090a600b838154811015156108f257fe5b906000526020600020906008020160070154426119cf565b1561093257600b80548390811061091d57fe5b90600052602060002090600802016005015490505b600b80548390811061094057fe5b906000526020600020906008020160000154600b8381548110151561096157fe5b906000526020600020906008020160010154600b8481548110151561098257fe5b906000526020600020906008020160020154600b858154811015156109a357fe5b90600052602060002090600802016003015484600b878154811015156109c557fe5b9060005260206000209060080201600601549750975097509750975097505050909192939495565b60006109f8336114dc565b9050801515610a0657600080fd5b610a12816011546119e4565b50565b601290565b600c54600160a060020a03163314610a3157600080fd5b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b606080600080600080600080600080600080610a7a612ed5565b6000610a8533611aae565b602081015190925015610af057610aed600a8360200151815481101515610aa857fe5b90600052602060002090600b020160030154600a8460200151815481101515610acd57fe5b90600052602060002090600b0201600501546114bf90919063ffffffff16565b90505b6015548251604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015610b6157600080fd5b505af1158015610b75573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610b9e57600080fd5b810190808051640100000000811115610bb657600080fd5b82016020810184811115610bc957600080fd5b8151640100000000811182820187101715610be357600080fd5b50506015546020870151604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251929550600160a060020a039091169350633a5294a0925060248082019260009290919082900301818387803b158015610c5e57600080fd5b505af1158015610c72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610c9b57600080fd5b810190808051640100000000811115610cb357600080fd5b82016020810184811115610cc657600080fd5b8151640100000000811182820187101715610ce057600080fd5b505092919050505082846040015185608001518660a001518760c001518860e001518961010001518a61016001518b61018001518c606001519d509d509d509d509d509d509d509d509d509d509d509d505050909192939495969798999a9b565b6000610d4c33611bbf565b90506000811115610a1257610d813360408051908101604052806004815260200160e060020a635345524f02815250836119a4565b1515610a1257600080fd5b600c54600160a060020a03163314610da357600080fd5b610dac81611466565b15610db657600080fd5b610a12600080836114fb565b6000610df0604080519081016040528060058152602001600080516020612f4d833981519152815250611c36565b905090565b60008060008060008069d3c21bcecceda10000006012541015610e2d5767016345785d8a00009550670de0b6b3a76400009450610ec0565b6012546a084595161401484a0000009004935060088410610e4d57600893505b600d805485908110610e5b57fe5b90600052602060002001549250600e84815481101515610e7757fe5b906000526020600020015491506969e10de76676d08000006a084595161401484a000000850260125403811515610eaa57fe5b0483810283019650670de0b6b3a7640000955090505b505050509091565b622ad3534310610ed757600080fd5b600655565b600c54600160a060020a031681565b600080610ef7336114dc565b9050801515610f0557600080fd5b610f0d611c6d565b610f3742600b83815481101515610f2057fe5b9060005260206000209060080201600601546119cf565b15610f6357600b805482908110610f4a57fe5b9060005260206000209060080201600401549150610f6f565b610f6c81611ca3565b91505b5090565b60606000610f80336114dc565b601554604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201529051929350600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b158015610ff257600080fd5b505af1158015611006573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561102f57600080fd5b81019080805164010000000081111561104757600080fd5b8201602081018481111561105a57600080fd5b815164010000000081118282018710171561107457600080fd5b50909550505050505090565b600c54600160a060020a0316331461109757600080fd5b6010805460ff1916911515919091179055565b6000610df0611e33565b6015546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284516000948594600160a060020a03909116936349145c9193889390928392604490910191908501908083838b5b8381101561113357818101518382015260200161111b565b50505050905090810190601f1680156111605780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561117f57600080fd5b505af1158015611193573d6000803e3d6000fd5b505050506040513d60208110156111a957600080fd5b5051905080158015906111bd5750600a5481105b91505b50919050565b6111f5604080519081016040528060058152602001600080516020612f4d8339815191528152506106776113f5565b151561120057600080fd5b33600090815260136020526040902054611220903463ffffffff6114bf16565b33600090815260136020526040902055565b600c54600160a060020a0316331461124957600080fd5b601155565b3360009081526013602052604090205490565b601054600090819060ff16151561127757600080fd5b6112a260408051908101604052806004815260200160e060020a635345524f028152506106776113f5565b15156112ad57600080fd5b503469152d02c7e14af68000008111156113055769152d02c7e14af680000090506112fa3360408051908101604052806004815260200160e060020a635345524f028152508334036119a4565b151561130557600080fd5b61130e81611e6f565b601254909250611324908263ffffffff6114bf16565b6012556040805180820190915260058152600080516020612f4d8339815191526020820152611355903390846119a4565b1515610f6f57600080fd5b600c54600160a060020a0316331461137757600080fd5b600160a060020a038116151561138c57600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600354602083a150805161142f81611ea4565b9250505090565b805182516000911461144a57506000611460565b6114538261205d565b61145c8461205d565b1490505b92915050565b6000903b1190565b60008061147d600a8404611e6f565b336000908152601360205260409020549091508111156114a057600091506111c0565b3360009081526013602052604090208054919091039055506001919050565b6000828201838110156114d157600080fd5b8091505b5092915050565b600160a060020a0381166000908152600960205260409020545b919050565b611503611c6d565b600a805490506009600083600160a060020a0316600160a060020a0316815260200190815260200160002081905550600a6101a0604051908101604052808581526020016000815260200184815260200184815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200183600160a060020a03168152602001600060ff168152602001600015158152509080600181540180825580915050906001820390600052602060002090600b020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a815481600160a060020a030219169083600160a060020a0316021790555061016082015181600a0160146101000a81548160ff021916908360ff16021790555061018082015181600a0160156101000a81548160ff021916908315150217905550505050600b61010060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001428152602001600081525090806001815401808255809150509060018203906000526020600020906008020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701555050508260001415156117cd576117a96001600a8581548110151561178957fe5b90600052602060002090600b0201600601546114bf90919063ffffffff16565b600a8054859081106117b757fe5b90600052602060002090600b0201600601819055505b60008211156117f957600160a060020a0381166000908152600960205260409020546117f99083612064565b505050565b6000611808611c6d565b611832600b8481548110151561181a57fe5b906000526020600020906008020160060154426119cf565b15801561185f57506000600a8481548110151561184b57fe5b90600052602060002090600b020160020154115b801561186c575060045415155b8015611879575060055415155b156118b75761188783611ca3565b60085490915061189d908263ffffffff6114bf16565b6008556006546118b3908263ffffffff61268e16565b6006555b6118ea82600a858154811015156118ca57fe5b90600052602060002090600b0201600201546114bf90919063ffffffff16565b600a8054859081106118f857fe5b90600052602060002090600b02016002018190555061194082600a8581548110151561192057fe5b90600052602060002090600b0201600301546114bf90919063ffffffff16565b600a80548590811061194e57fe5b90600052602060002090600b02016003018190555060008211156117f9576117f98383612064565b60008083151561198957600091506114d5565b5082820282848281151561199957fe5b04146114d157600080fd5b60006119c7848484602060405190810160405280600081525060006001026126a5565b949350505050565b610e1060189283900481900492909104041490565b6000806119ef611c6d565b60045415806119fe5750600554155b15611a0857611aa8565b50825b600a54611a1a908585016126fd565b811015611a7b57611a33600b8281548110151561181a57fe5b158015611a605750600a805482908110611a4957fe5b90600052602060002090600b020160020154600014155b15611a7357611a6e81611ca3565b820191505b600101611a0b565b600854611a8e908363ffffffff6114bf16565b600855600654611aa4908363ffffffff61268e16565b6006555b50505050565b611ab6612ed5565b600160a060020a038216600090815260096020526040902054600a80549091908110611ade57fe5b6000918252602091829020604080516101a081018252600b909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a90910154600160a060020a03811661014083015260ff740100000000000000000000000000000000000000008204811661016084015275010000000000000000000000000000000000000000009091041615156101808201529050919050565b600080611bcb836114dc565b9050801515611bd957600080fd5b600a805482908110611be757fe5b90600052602060002090600b02016008015491506000600a82815481101515611c0c57fe5b90600052602060002090600b020160080181905550611c2d6008548361268e565b60085550919050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600154602082a15192915050565b611c79426007546119cf565b1515611ca157601e611c89611e33565b811515611c9257fe5b04600555600654600455426007555b565b6000806000806000611cfe600a87815481101515611cbd57fe5b90600052602060002090600b020160070154600a88815481101515611cde57fe5b90600052602060002090600b02016002015461197690919063ffffffff16565b9350611d33600a87815481101515611d1257fe5b90600052602060002090600b0201600401548561268e90919063ffffffff16565b9250600454611d4d8460055461197690919063ffffffff16565b811515611d5657fe5b0491506103e8611d6d85600263ffffffff61197616565b811515611d7657fe5b04905080821115611d85578091505b611d8f868361270e565b915042600b87815481101515611da157fe5b906000526020600020906008020160060181905550611de682600b88815481101515611dc957fe5b60009182526020909120600890910201549063ffffffff6114bf16565b600b805488908110611df457fe5b6000918252602090912060089091020155600b805483919088908110611e1657fe5b600091825260209091206004600890920201015550949350505050565b6000610df0600854611e6360408051908101604052806004815260200160e060020a635345524f02815250611c36565b9063ffffffff61268e16565b6000806000611e7c610df5565b909250905081611e92858363ffffffff61197616565b811515611e9b57fe5b04949350505050565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015611f73576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615611f5d57818486815181101515611f2257fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193611f68565b8415611f6857611f73565b600190920191611ed7565b846040519080825280601f01601f191660200182016040528015611fa1578160200160208202803883390190505b509050600092505b84831015612053578383815181101515611fbf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002818481518110151561201857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191611fa9565b9695505050505050565b6020015190565b600080808080808080808080690a968163f0a57b4000008c106120bb576001600a8e81548110151561209257fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b600a80548e9081106120c957fe5b90600052602060002090600b02016007015460001415612110576120ec8c6129ee565b600a80548f9081106120fa57fe5b90600052602060002090600b0201600701819055505b600a80548e9c508c90811061212157fe5b90600052602060002090600b02016000015499508b97505b891561258157600a80548c90811061214d57fe5b90600052602060002090600b02016009015460001415156121c45761219b600a8c81548110151561217a57fe5b90600052602060002090600b020160090154896114bf90919063ffffffff16565b97506000600a8c8154811015156121ae57fe5b90600052602060002090600b0201600901819055505b61012c891480156121f55750600a80548b9081106121de57fe5b90600052602060002090600b020160000154600014155b156122555761222d88600a8c81548110151561220d57fe5b90600052602060002090600b0201600901546114bf90919063ffffffff16565b600a80548c90811061223b57fe5b90600052602060002090600b020160090181905550612581565b61226888600a8c815481101515610acd57fe5b600a80548c90811061227657fe5b90600052602060002090600b020160050181905550600a80548b90811061229957fe5b90600052602060002090600b020160010154600014156122dd578a600a8b8154811015156122c357fe5b90600052602060002090600b02016001018190555061254f565b600a80548b9081106122eb57fe5b90600052602060002090600b0201600101549650612332600a8881548110151561231157fe5b90600052602060002090600b020160030154600a89815481101515610acd57fe5b9550612367600a8c81548110151561234657fe5b90600052602060002090600b020160030154600a8d815481101515610acd57fe5b94508a600a8b81548110151561237957fe5b90600052602060002090600b0201600101541415801561239857508585115b156123c6578a600a8b8154811015156123ad57fe5b90600052602060002090600b0201600101819055508495505b6123fd86611e63600a8d8154811015156123dc57fe5b90600052602060002090600b020160090154600a8e815481101515610acd57fe5b935069a968163f0a57b4000000861015801561242457506a0152d02c7e14af680000008410155b1561243257600492506124cd565b6954b40b1f852bda0000008610158015612456575069a968163f0a57b40000008410155b1561246457600392506124cd565b692a5a058fc295ed000000861015801561248857506954b40b1f852bda0000008410155b1561249657600292506124cd565b69152d02c7e14af680000086101580156124ba5750692a5a058fc295ed0000008410155b156124c857600192506124cd565b600092505b600a80548b9081106124db57fe5b60009182526020909120600a600b90920201015460ff740100000000000000000000000000000000000000009091048116908416111561254f5782600a8b81548110151561252557fe5b90600052602060002090600b0201600a0160146101000a81548160ff021916908360ff1602179055505b600a80546001909a01998b91908290811061256657fe5b60009182526020909120600b9091020154909b509950612139565b6125ab600a8e81548110151561259357fe5b90600052602060002090600b0201600001548d612a2b565b820191506125d9600a8e8154811015156125c157fe5b90600052602060002090600b0201600001548d612b26565b82019150612607600a8e8154811015156125ef57fe5b90600052602060002090600b0201600001548d612cec565b60085492019161261d908363ffffffff6114bf16565b600855600a805461265491908f90811061263357fe5b90600052602060002090600b0201600701548d61197690919063ffffffff16565b9050612666818363ffffffff61268e16565b60065490915061267c908263ffffffff6114bf16565b60065550505050505050505050505050565b6000808383111561269e57600080fd5b5050900390565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b6000818310156111c0575081611460565b600080612744600a8581548110151561272357fe5b90600052602060002090600b020160070154600a86815481101515611cde57fe5b90508061277a600a8681548110151561275957fe5b90600052602060002090600b020160040154856114bf90919063ffffffff16565b11156127b6576127b3600a8581548110151561279257fe5b90600052602060002090600b0201600401548261268e90919063ffffffff16565b92505b6127e983600a868154811015156127c957fe5b90600052602060002090600b0201600401546114bf90919063ffffffff16565b600a8054869081106127f757fe5b90600052602060002090600b02016004018190555080600a8581548110151561281c57fe5b90600052602060002090600b0201600401541015156128bb576000600a8581548110151561284657fe5b90600052602060002090600b0201600201819055506000600a8581548110151561286c57fe5b90600052602060002090600b0201600401819055506000600a8581548110151561289257fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b6128e542600b868154811015156128ce57fe5b9060005260206000209060080201600701546119cf565b151561293a5782600b858154811015156128fb57fe5b90600052602060002090600802016005018190555042600b8581548110151561292057fe5b906000526020600020906008020160070181905550612991565b61296d83600b8681548110151561294d57fe5b9060005260206000209060080201600501546114bf90919063ffffffff16565b600b80548690811061297b57fe5b9060005260206000209060080201600501819055505b6129c483600a868154811015156129a457fe5b90600052602060002090600b0201600801546114bf90919063ffffffff16565b600a8054869081106129d257fe5b600091825260209091206008600b909202010155509092915050565b6000683635c9adc5dea00000821015612a09575060036114f6565b69010f0cf064dd59200000821015612a23575060046114f6565b5060056114f6565b6000808080851515612a3c57612b1d565b612a488686600a612e18565b83019250600a86815481101515612a5b57fe5b60009182526020909120600b909102015491508115612b19576002600a83815481101515612a8557fe5b90600052602060002090600b020160060154101515612aaf57612aaa82866008612e18565b830192505b600a805483908110612abd57fe5b90600052602060002090600b020160000154905060008114158015612b0357506003600a82815481101515612aee57fe5b90600052602060002090600b02016006015410155b15612b1957612b1481866007612e18565b830192505b8293505b50505092915050565b600080808080861515612b3857612ce2565b8615801590612b48575061012c84105b8015612b545750600c83105b15612ce257600a805488908110612b6757fe5b60009182526020909120600b90910201600a015474010000000000000000000000000000000000000000900460ff161580612bc15750600a805488908110612bab57fe5b90600052602060002090600b0201600201546000145b15612bf257600a805488908110612bd457fe5b60009182526020909120600b90910201549650600190930192612b38565b600a805488908110612c0057fe5b60009182526020909120600a600b909202010154600360ff74010000000000000000000000000000000000000000909204821602169150828211612c4c57600a805488908110612bd457fe5b90918203906064612c63878463ffffffff61197616565b811515612c6c57fe5b049050612c79878261270e565b9050612cae81600b89815481101515612c8e57fe5b9060005260206000209060080201600201546114bf90919063ffffffff16565b600b805489908110612cbc57fe5b6000918252602090912060026008909202010155600a80549582019588908110612bd457fe5b5050505092915050565b600080831515612cfb576114d5565b8315801590612d345750600a805485908110612d1357fe5b90600052602060002090600b0201600a0160159054906101000a900460ff16155b8015612d41575061012c81105b15612d6f57600a805485908110612d5457fe5b60009182526020909120600b90910201549350600101612cfb565b8315801590612da75750600a805485908110612d8757fe5b90600052602060002090600b0201600a0160159054906101000a900460ff165b156114d557612db9846014850461270e565b9150612dee82600b86815481101515612dce57fe5b9060005260206000209060080201600301546114bf90919063ffffffff16565b600b805486908110612dfc57fe5b9060005260206000209060080201600301819055505092915050565b600080600a85815481101515612e2a57fe5b90600052602060002090600b02016002015460001415612e4957612ecd565b6064612e5b858563ffffffff61197616565b811515612e6457fe5b049050612e71858261270e565b9050612ea681600b87815481101515612e8657fe5b9060005260206000209060080201600101546114bf90919063ffffffff16565b600b805487908110612eb457fe5b9060005260206000209060080201600101819055508091505b509392505050565b6101a060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000600160a060020a03168152602001600060ff1681526020016000151581525090560041534e4f57000000000000000000000000000000000000000000000000000000a165627a7a7230582088e018c7d0cdfcf780df4a1c658680603325985fc56669caa8f2372a733bbced0029\")\n\tdata2= common.Hex2Bytes(\"6080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630a8b782681146100a85780632ca9a7c1146100f6578063370158ea1461010b5780633ccfd60b146101b4578063672d7a0d146101c957806383b4918b146101ea5780638da5cb5b14610202578063a19556d414610233578063e7cf3d1314610301578063f2fde38b14610356575b600080fd5b6040805160206004803580820135601f81018490048402850184019095528484526100f49436949293602493928401919081908401838280828437509497506103779650505050505050565b005b34801561010257600080fd5b506100f461046d565b34801561011757600080fd5b506101206105aa565b6040518086815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561017557818101518382015260200161015d565b50505050905090810190601f1680156101a25780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156101c057600080fd5b506100f461082d565b3480156101d557600080fd5b506100f4600160a060020a0360043516610a22565b3480156101f657600080fd5b506100f4600435610bd7565b34801561020e57600080fd5b50610217610cb3565b60408051600160a060020a039092168252519081900360200190f35b34801561023f57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261028c943694929360249392840191908190840183828082843750949750610cc29650505050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c65781810151838201526020016102ae565b50505050905090810190601f1680156102f35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030d57600080fd5b50604080516020600480358082013583810280860185019096528085526100f4953695939460249493850192918291850190849080828437509497506117939650505050505050565b34801561036257600080fd5b506100f4600160a060020a03600435166117fa565b6000806007546000148061038c575060075442105b151561039757600080fd5b6103c760408051908101604052806004815260200160e060020a635345524f028152506103c261188e565b6118cf565b15156103d257600080fd5b678ac7230489e800003410156103e757600080fd5b3360009081526009602052604090205491508115156104405761041a8360206040519081016040528060008152506118cf565b1561042457600080fd5b61042d8361191b565b3360009081526009602052604090205491505b600880548390811061044e57fe5b90600052602060002090600d02019050610468813461200f565b505050565b6000806000806000806000600754600014151561048957600080fd5b3360009081526009602052604090205496508615156104a757600080fd5b6104af612240565b600d5415806104be5750600e54155b156104c8576105a1565b8693505b6008546011546104de91908901612280565b841080156104ec5750600754155b156105745760088054859081106104ff57fe5b90600052602060002090600d0201925061051d836006015442612297565b158015610531575082600301548360020154115b156105695761053f836122ac565b9092509050610554868363ffffffff61243f16565b9550610566858263ffffffff61243f16565b94505b6001909301926104cc565b601354610587908663ffffffff61243f16565b601355600f5461059d908763ffffffff61245c16565b600f555b50505050505050565b600080600080606080606080600060075460001415156107ff576105ce600a612473565b9250825160405190808252806020026020018201604052801561060b57816020015b6105f86136c1565b8152602001906001900390816105f05790505b509150600090505b825181101561076057600554835161074091600160a060020a031690633a5294a09086908590811061064157fe5b906020019060200201516040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808267ffffffffffffffff1667ffffffffffffffff168152602001915050600060405180830381600087803b1580156106b157600080fd5b505af11580156106c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156106ee57600080fd5b81019080805164010000000081111561070657600080fd5b8201602081018481111561071957600080fd5b815164010000000081118282018710171561073357600080fd5b50509291905050506124cf565b828281518110151561074e57fe5b60209081029091010152600101610613565b6107a76107a16040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506124cf565b836124f5565b93506007546107e66013546107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b9063ffffffff61245c16565b6012546008805490508798509850985098509850610822565b601254600854604080516020810190915260008082529b508b9a50919850965094505b505050509091929394565b3360009081526009602052604081205490808080808086151561084f57600080fd5b600880548890811061085d57fe5b90600052602060002090600d0201955085600901549450600754600014158015610888575060075442115b15610930576108bb6013546107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b93506108ce600a8863ffffffff61267416565b925092508280156108df5750600082115b156109305761091d6109106108f4600a6126d7565b610904878663ffffffff61270d16565b9063ffffffff61273b16565b869063ffffffff61243f16565b9450610930600a8863ffffffff61275e16565b60098601546013546109479163ffffffff61245c16565b60135560006009870155600c8601541515610996576109863360408051908101604052806004815260200160e060020a635345524f02815250876127b3565b151561099157600080fd5b6105a1565b5060005b600c8601548110156105a157610a0f86600c01828154811015156109ba57fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600c890154600160a060020a039091169190610a0a90899063ffffffff61273b16565b6127b3565b1515610a1a57600080fd5b60010161099a565b60008054600160a060020a03163314610a3a57600080fd5b610a43826127de565b15610a4d57600080fd5b5060088054600160a060020a038316600090815260096020908152604080832084905580516101a081018252848152808301849052808201849052606081018490526080810184905260a081018490524260c0820181905260e0820185905261010082015261012081018490528151848152928301909152929392916101408301919050815260408051602081810183526000808352818501929092528251828152908101835291909201915090528154600181810180855560009485526020948590208451600d90940201928355848401519183019190915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301556101008301516008830155610120830151600983015561014083015180519194610b9592600a850192909101906136d8565b506101608201518051610bb291600b840191602090910190613723565b506101808201518051610bcf91600c840191602090910190613790565b505050505050565b60008082678ac7230489e80000111580610bef575082155b1515610bfa57600080fd5b60075415610c0757600080fd5b336000908152600960205260409020549150811515610c2557600080fd5b6008805483908110610c3357fe5b90600052602060002090600d020190508260001415610c685760098101549250678ac7230489e80000831015610c6857600080fd5b6009810154831115610c7957600080fd5b6009810154610c8e908463ffffffff61245c16565b6009820155601354610ca6908463ffffffff61245c16565b601355610468818461200f565b600054600160a060020a031681565b33600090815260096020526040812054606091908190839082908190819081901515610ced57611787565b33600090815260096020526040902054600880549091908110610d0c57fe5b90600052602060002090600d02019650610d368960206040519081016040528060008152506118cf565b1515610eb3576005546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528c5160248401528c51600160a060020a03909416936349145c91938e9383926044909201919085019080838360005b83811015610db5578181015183820152602001610d9d565b50505050905090810190601f168015610de25780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b158015610e0157600080fd5b505af1158015610e15573d6000803e3d6000fd5b505050506040513d6020811015610e2b57600080fd5b50519550600086118015610e40575060085486105b1515610e4b57600080fd5b6008805487908110610e5957fe5b90600052602060002090600d020196505b336000908152600960205260409020548614610eb357851515610e8c57611787565b6008805487908110610e9a57fe5b90600052602060002090600d0201600101549550610e6a565b610ebb612240565b60408051600b808252610180820190925290816020015b6060815260200190600190039081610ed2575050604080518082018252600a81527f2273656c66436f6465220000000000000000000000000000000000000000000060208201526005548a54835160e560020a6301d294a502815267ffffffffffffffff9091166004820152925193985061100b939192600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b158015610f7c57600080fd5b505af1158015610f90573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610fb957600080fd5b810190808051640100000000811115610fd157600080fd5b82016020810184811115610fe457600080fd5b8151640100000000811182820187101715610ffe57600080fd5b50509291905050506127e6565b85600081518110151561101a57fe5b906020019060200201819052506111936040805190810160405280600c81526020017f22706172656e74436f646522000000000000000000000000000000000000000081525088600101546000146111595760055460018a01546040805160e560020a6301d294a502815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b1580156110ca57600080fd5b505af11580156110de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561110757600080fd5b81019080805164010000000081111561111f57600080fd5b8201602081018481111561113257600080fd5b815164010000000081118282018710171561114c57600080fd5b505092919050505061118e565b60408051808201909152600281527f222200000000000000000000000000000000000000000000000000000000000060208201525b6127e6565b8560018151811015156111a257fe5b906020019060200201819052506111f26040805190810160405280600781526020017f2276616c7565220000000000000000000000000000000000000000000000000081525088600201546129cd565b85600281518110151561120157fe5b906020019060200201819052506112516040805190810160405280600d81526020017f2272657475726e56616c7565220000000000000000000000000000000000000081525088600301546129cd565b85600381518110151561126057fe5b906020019060200201819052506112b06040805190810160405280601481526020017f22746f74616c41796e616d69635265776172642200000000000000000000000081525088600401546129cd565b8560048151811015156112bf57fe5b602090810290910101526009870154600754909450158015906112e3575060075442115b15611381576113166013546107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b3360009081526009602052604090205490935061133b90600a9063ffffffff61267416565b9150915081801561134c5750600081115b156113815761137e611371611361600a6126d7565b610904868563ffffffff61270d16565b859063ffffffff61243f16565b93505b6113c06040805190810160405280600d81526020017f2263616e57697468647261772200000000000000000000000000000000000000815250856129cd565b8560058151811015156113cf57fe5b6020908102909101015260068701546113e89042612297565b1561144e576114306040805190810160405280600e81526020017f227374617469635265776172642200000000000000000000000000000000000081525088600501546129cd565b85600681518110151561143f57fe5b602090810290910101526114ca565b6114b06040805190810160405280600e81526020017f22737461746963526577617264220000000000000000000000000000000000008152506114ab896114a68b600301548c6002015461245c90919063ffffffff16565b612a94565b6129cd565b8560068151811015156114bf57fe5b602090810290910101525b6114d8876008015442612297565b1561153e576115206040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525088600701546129cd565b85600781518110151561152f57fe5b60209081029091010152611598565b61157e6040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525060006129cd565b85600781518110151561158d57fe5b602090810290910101525b6115db6040805190810160405280601181526020017f2273746174696354696d657374616d702200000000000000000000000000000081525088600601546129cd565b8560088151811015156115ea57fe5b6020908102909101810191909152604080518082018252600c81527f226368696c6473436f646522000000000000000000000000000000000000000081840152600b8a0180548351601f600260001961010060018616150201909316929092049182018690048602810186019094528084526116be949293928301828280156116b45780601f10611689576101008083540402835291602001916116b4565b820191906000526020600020905b81548152906001019060200180831161169757829003601f168201915b50505050506127e6565b8560098151811015156116cd57fe5b6020908102909101810191909152604080518082018252600881527f2276616c7565732200000000000000000000000000000000000000000000000081840152600a8a0180548351818602810186019094528084526117629492939283018282801561175857602002820191906000526020600020905b815481526020019060010190808311611744575b5050505050612b34565b85600a81518110151561177157fe5b6020908102909101015261178485612d6d565b97505b50505050505050919050565b600080600083511115156117a657600080fd5b33600090815260096020526040902054915081156104685760088054839081106117cc57fe5b90600052602060002090600d020190508281600c0190805190602001906117f4929190613790565b50505050565b600054600160a060020a0316331461181157600080fd5b600160a060020a038116151561182657600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600454602083a15080516118c881612ed5565b9250505090565b6000825160001480156118e157508151155b156118ee57506001611915565b81518351146118ff57506000611915565b61190882613056565b61191184613056565b1490505b92915050565b6000806000611929336127de565b1561193357600080fd5b6005546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152875160248401528751600160a060020a03909416936349145c9193899383926044909201919085019080838360005b838110156119ac578181015183820152602001611994565b50505050905090810190601f1680156119d95780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156119f857600080fd5b505af1158015611a0c573d6000803e3d6000fd5b505050506040513d6020811015611a2257600080fd5b50519250600083118015611a37575060085483105b1515611a4257600080fd5b6008805484908110611a5057fe5b60009182526020808320600854604080518085018252958652600d94909402909101600b81018054855160026001831615610100026000190190921691909104601f8101869004860282018601909652858152919750919550611b0b94939092830182828015611b015780601f10611ad657610100808354040283529160200191611b01565b820191906000526020600020905b815481529060010190602001808311611ae457829003601f168201915b50505050506118cf565b15611c0c576005546040805160e560020a6301d294a502815267ffffffffffffffff841660048201529051600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015611b6957600080fd5b505af1158015611b7d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ba657600080fd5b810190808051640100000000811115611bbe57600080fd5b82016020810184811115611bd157600080fd5b8151640100000000811182820187101715611beb57600080fd5b50508051611c069450600b8701935060209091019150613723565b50611d68565b600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152611d5093611cf693611cf193611cae939291830182828015611ca45780601f10611c7957610100808354040283529160200191611ca4565b820191906000526020600020905b815481529060010190602001808311611c8757829003601f168201915b50505050506124cf565b611cec6040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506124cf565b61305d565b6124cf565b6005546040805160e560020a6301d294a502815267ffffffffffffffff861660048201529051611cec92600160a060020a031691633a5294a091602480830192600092919082900301818387803b1580156106b157600080fd5b8051611d6691600b850191602090910190613723565b505b33600090815260096020908152604080832084905580516101a081018252848152808301878152818301858152606083018681526080840187815260a085018881524260c0870181815260e088018b8152610100890192835261012089018c81528a518d8152808d018c526101408b019081528b51808e018d528e81526101608c01528b518e8152808e01909c526101808b019b909b52600880546001810180835591909e528a517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600d909f029e8f0190815599517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee48f015597517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee58e015595517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee68d015593517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee78c015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee88b015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee98a015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eea890155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eeb880155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eec87015592518051939592949193611fcb937ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636eed019291909101906136d8565b506101608201518051611fe891600b840191602090910190613723565b50610180820151805161200591600c840191602090910190613790565b5050505050505050565b60008060008061201d612240565b600054604080518082019091526004815260e060020a635345524f02602082015261205d91600160a060020a031690610a0a88603263ffffffff61273b16565b151561206857600080fd5b6006546120809061090487601963ffffffff61273b16565b9350600092505b6006548310156120f6576120e06006848154811015156120a357fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600160a060020a031690866127b3565b15156120eb57600080fd5b600190920191612087565b61211b61210a86600363ffffffff61270d16565b60028801549063ffffffff61243f16565b60028701556001860154600010156121f0575084905060005b6001820154158015906121475750601481105b156121f0576008826001015481548110151561215f57fe5b90600052602060002090600d020191508082600a0180549050141561219d57600a8201805460018101825560009182526020909120018590556121e8565b6121cb8583600a01838154811015156121b257fe5b906000526020600020015461243f90919063ffffffff16565b600a83018054839081106121db57fe5b6000918252602090912001555b600101612134565b61221361220486600363ffffffff61270d16565b600f549063ffffffff61243f16565b600f55855461222b90600a908763ffffffff6130d416565b60075415610bcf576000600755505050505050565b61224c42601054612297565b151561227e5761227060c86109046003612264613293565b9063ffffffff61270d16565b600e55600f54600d55426010555b565b600081831015612291575081611915565b50919050565b610e1060189283900481900492909104041490565b6000806000806000806000806122dc896122d78b600301548c6002015461245c90919063ffffffff16565b6132d3565b9550955085156122eb57612434565b84935060008960010154111561242d576008896001015481548110151561230e57fe5b90600052602060002090600d0201915061232a828660006133f0565b9096509250851561234057848497509750612434565b612350848463ffffffff61243f16565b9350600190505b60018201541580159061236a5750601481105b80156123765750600754155b1561242d576008826001015481548110151561238e57fe5b90600052602060002090600d02019150806123d869021e19e0c9bab240000084600a0160008154811015156123bf57fe5b906000526020600020015461273b90919063ffffffff16565b1180156123ec575081600201548260030154105b15612425576123fc8286836133f0565b9096509250851561241257848497509750612434565b612422848463ffffffff61243f16565b93505b600101612357565b8484975097505b505050505050915091565b60008282018381101561245157600080fd5b8091505b5092915050565b6000808383111561246c57600080fd5b5050900390565b6060816000018054806020026020016040519081016040528092919081815260200182805480156124c357602002820191906000526020600020905b8154815260200190600101908083116124af575b50505050509050919050565b6124d76136c1565b50604080518082019091528151815260209182019181019190915290565b60606000806060600085516000141561251e576040805160208101909152600081529450612633565b60018651038760000151029350600092505b855183101561256257858381518110151561254757fe5b60209081029091010151519390930192600190920191612530565b836040519080825280601f01601f191660200182016040528015612590578160200160208202803883390190505b5060009350915050602081015b855183101561262f576125e48187858151811015156125b857fe5b906020019060200201516020015188868151811015156125d457fe5b60209081029091010151516134ed565b85838151811015156125f257fe5b60209081029091010151518651910190600019018310156126245761262081886020015189600001516134ed565b8651015b60019092019161259d565b8194505b5050505092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600254602082a15192915050565b600080805b84548110156126cf578454849086908390811061269257fe5b906000526020600020015414156126c75760028501805460019450829081106126b757fe5b9060005260206000200154820191505b600101612679565b509250929050565b6000805b825481101561229157600283018054829081106126f457fe5b60009182526020909120015491909101906001016126db565b6000808315156127205760009150612455565b5082820282848281151561273057fe5b041461245157600080fd5b60008080831161274a57600080fd5b828481151561275557fe5b04949350505050565b60005b8254811015610468578254829084908390811061277a57fe5b906000526020600020015414156127ab576000836002018281548110151561279e57fe5b6000918252602090912001555b600101612761565b60006127d684848460206040519081016040528060008152506000600102613531565b949350505050565b6000903b1190565b604080516002808252606082810190935282918291816020015b6128086136c1565b815260200190600190039081612800579050509150612826856124cf565b82600081518110151561283557fe5b602090810290910101526040805160038082526080820190925290816020015b61285d6136c1565b8152602001906001900390816128555790505090506128b06040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506124cf565b8160008151811015156128bf57fe5b602090810290910101526128d2846124cf565b8160018151811015156128e157fe5b9060200190602002018190525061292c6040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506124cf565b81600281518110151561293b57fe5b90602001906020020181905250612967611cf16107a160206040519081016040528060008152506124cf565b82600181518110151561297657fe5b906020019060200201819052506129c46107a16040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506124cf565b95945050505050565b6040805160028082526060828101909352829190816020015b6129ee6136c1565b8152602001906001900390816129e6579050509050612a0c846124cf565b816000815181101515612a1b57fe5b60209081029091010152612a31611cf184613589565b816001815181101515612a4057fe5b906020019060200201819052506127d6612a8e6040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506124cf565b826124f5565b6000600e5460001480612aa75750600d54155b80612ab3575060075415155b15612ac057506000611915565b612af082612aeb600d54610904600e5461226489600301548a6002015461245c90919063ffffffff16565b612280565b90508260020154612b0e84600301548361243f90919063ffffffff16565b11156119155760038301546002840154612b2d9163ffffffff61245c16565b9392505050565b60608060006060808551604051908082528060200260200182016040528015612b7757816020015b612b646136c1565b815260200190600190039081612b5c5790505b509350600092505b8551831015612bce57612bab611cf18785815181101515612b9c57fe5b90602001906020020151613589565b8484815181101515612bb957fe5b60209081029091010152600190920191612b7f565b612c59612c0f6040805190810160405280600181526020017f5b000000000000000000000000000000000000000000000000000000000000008152506124cf565b611cec611cf1612c536040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506124cf565b886124f5565b9150612ca5612c67836124cf565b611cec6040805190810160405280600181526020017f5d000000000000000000000000000000000000000000000000000000000000008152506124cf565b60408051600280825260608201909252919350816020015b612cc56136c1565b815260200190600190039081612cbd579050509050612ce3876124cf565b816000815181101515612cf257fe5b60209081029091010152612d05826124cf565b816001815181101515612d1457fe5b90602001906020020181905250612d62612a8e6040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506124cf565b979650505050505050565b60608060008351604051908082528060200260200182016040528015612dad57816020015b612d9a6136c1565b815260200190600190039081612d925790505b509150600090505b8351811015612dfe57612dde8482815181101515612dcf57fe5b906020019060200201516124cf565b8282815181101515612dec57fe5b60209081029091010152600101612db5565b612e89612e3f6040805190810160405280600181526020017f7b000000000000000000000000000000000000000000000000000000000000008152506124cf565b611cec611cf1612e836040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506124cf565b866124f5565b92506127d6612e97846124cf565b611cec6040805190810160405280600181526020017f7d000000000000000000000000000000000000000000000000000000000000008152506124cf565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015612fa4576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615612f8e57818486815181101515612f5357fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193612f99565b8415612f9957612fa4565b600190920191612f08565b846040519080825280601f01601f191660200182016040528015612fd2578160200160208202803883390190505b509050600092505b8483101561304c578383815181101515612ff057fe5b90602001015160f860020a900460f860020a02818481518110151561301157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191612fda565b9695505050505050565b6020015190565b606080600083600001518560000151016040519080825280601f01601f19166020018201604052801561309a578160200160208202803883390190505b5091506020820190506130b681866020015187600001516134ed565b8451602085015185516130cc92840191906134ed565b509392505050565b8254600090819081908190600a14156131c35760018701805460009081106130f857fe5b90600052602060002001549250600191505b86548210156131625782876001018381548110151561312557fe5b90600052602060002001541015613157576001870180548390811061314657fe5b906000526020600020015492508193505b60019091019061310a565b8654869088908690811061317257fe5b906000526020600020018190555042876001018581548110151561319257fe5b90600052602060002001819055508487600201858154811015156131b257fe5b6000918252602090912001556105a1565b600091505b865482101561324357865486908890849081106131e157fe5b906000526020600020015414156132385742876001018381548110151561320457fe5b906000526020600020018190555084876002018381548110151561322457fe5b600091825260209091200155506001613243565b6001909101906131c8565b8015156105a1575050845460018082018755600087815260208082209093019690965580870180548083018255908752828720429101556002909601805496870181558552909320909301555050565b60006132cd6012546107da6013546107da346107da60408051908101604052806004815260200160e060020a635345524f0281525061263d565b90505b90565b6000806000806132e1613694565b600754156132f65760019350600092506133e7565b4260068701556133068686612a94565b92508286600501819055506000866001015411156133b2575084905060005b6001820154158015906133385750601481105b156133b2576008826001015481548110151561335057fe5b90600052602060002090600d0201915061338e8383600a018381548110151561337557fe5b906000526020600020015461245c90919063ffffffff16565b600a830180548390811061339e57fe5b600091825260209091200155600101613325565b60098601546133c7908463ffffffff61243f16565b600987015560038601546133e1908463ffffffff61243f16565b60038701555b50509250929050565b6000806133fb613694565b6007541561340f57506001905060006134e5565b69152d02c7e14af680000061343a60036109048860030154896002015461245c90919063ffffffff16565b10613446575082613453565b6134508585612a94565b90505b60008311156134705761346d81600a63ffffffff61273b16565b90505b61347e856008015442612297565b156134a2576007850154613498908263ffffffff61243f16565b60078601556134b0565b600785018190554260088601555b60098501546134c5908263ffffffff61243f16565b600986015560048501546134df908263ffffffff61243f16565b60048601555b935093915050565b60005b60208210613512578251845260209384019390920191601f19909101906134f0565b50905182516020929092036101000a6000190180199091169116179052565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260035460a082a1608001519695505050505050565b606060008082818515156135d25760408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152945061368b565b8593505b83156135ed57600190920191600a840493506135d6565b826040519080825280601f01601f19166020018201604052801561361b578160200160208202803883390190505b5091505060001982015b851561368757815160001982019160f860020a6030600a8a06010291849190811061364c57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550613625565b8194505b50505050919050565b6012546136a890601463ffffffff61273b16565b6136b0613293565b101561227e57426203f48001600755565b604080518082019091526000808252602082015290565b828054828255906000526020600020908101928215613713579160200282015b828111156137135782518255916020019190600101906136f8565b5061371f9291506137fe565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061376457805160ff1916838001178555613713565b8280016001018555821561371357918201828111156137135782518255916020019190600101906136f8565b8280548282559060005260206000209081019282156137f2579160200282015b828111156137f2578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039091161782556020909201916001909101906137b0565b5061371f929150613818565b6132d091905b8082111561371f5760008155600101613804565b6132d091905b8082111561371f57805473ffffffffffffffffffffffffffffffffffffffff1916815560010161381e5600a165627a7a723058200c8d77cd85c4ab81393cf1fe6d2f868b301b7618f52d7637393c4f013f558f7c0029\")\n\tdata3= common.Hex2Bytes(\"6080604052600436106101745763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663026187528114610179578063026c4207146101a057806306fdde03146101b55780630a8b78261461023f57806318160ddd1461029f57806325365773146102b45780632ca9a7c1146102fc578063313ce567146103135780633c92d6df1461033e57806351d3182214610353578063565974d3146103745780635fd8c710146104ba578063672d7a0d146104cf578063722713f7146104f05780637ffdf53e146105055780638d34191e146105335780638da5cb5b1461054b57806395d89b41146101b5578063a1c7254d1461057c578063af640d0f14610591578063b076a53a146105a6578063b3e4c7a7146105c0578063c2abc0e6146105d5578063c7e57a441461062e578063d0b06f5d14610636578063db29777a1461064b578063df86265614610663578063e09eaa5514610678578063f2fde38b14610680575b600080fd5b34801561018557600080fd5b5061018e6106a1565b60408051918252519081900360200190f35b3480156101ac57600080fd5b5061018e6106a7565b3480156101c157600080fd5b506101ca6106ad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102045781810151838201526020016101ec565b50505050905090810190601f1680156102315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805160206004803580820135601f810184900484028501840190955284845261028b9436949293602493928401919081908401838280828437509497506106ce9650505050505050565b604080519115158252519081900360200190f35b3480156102ab57600080fd5b5061018e61094b565b3480156102c057600080fd5b506102c9610951565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b34801561030857600080fd5b50610311610a75565b005b34801561031f57600080fd5b50610328610a9d565b6040805160ff9092168252519081900360200190f35b34801561034a57600080fd5b5061018e610aa2565b34801561035f57600080fd5b50610311600160a060020a0360043516610aa8565b34801561038057600080fd5b50610389610aee565b6040518080602001806020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018660ff1660ff1681526020018515151515815260200184815260200183810383528f818151815260200191508051906020019080838360005b838110156104105781810151838201526020016103f8565b50505050905090810190601f16801561043d5780820380516001836020036101000a031916815260200191505b5083810382528e818151815260200191508051906020019080838360005b8381101561047357818101518382015260200161045b565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b3480156104c657600080fd5b50610311610dcf565b3480156104db57600080fd5b50610311600160a060020a0360043516610e1a565b3480156104fc57600080fd5b5061018e610e50565b34801561051157600080fd5b5061051a610e7f565b6040805192835260208301919091528051918290030190f35b34801561053f57600080fd5b50610311600435610f52565b34801561055757600080fd5b50610560610f66565b60408051600160a060020a039092168252519081900360200190f35b34801561058857600080fd5b5061018e610f75565b34801561059d57600080fd5b506101ca610ffd565b3480156105b257600080fd5b50610311600435151561110a565b3480156105cc57600080fd5b5061018e611134565b3480156105e157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261028b94369492936024939284019190819084018382808284375094975061113e9650505050505050565b610311611250565b34801561064257600080fd5b5061018e6112b8565b34801561065757600080fd5b506103116004356112be565b34801561066f57600080fd5b5061018e6112da565b61018e6112ed565b34801561068c57600080fd5b50610311600160a060020a03600435166113e8565b60045481565b60065481565b604080518082019091526004815260e060020a634143455302602082015290565b60008060008061070460408051908101604052806004815260200160e460020a6304149505028152506106ff61147d565b6114be565b151561070f57600080fd5b610718336114ee565b1561072257600080fd5b68056bc75e2d6310000034101561073857600080fd5b610741346114f6565b151561074c57600080fd5b60125461075f903463ffffffff61154716565b60125561076b33611564565b9250821515610892576015546040517f49145c91000000000000000000000000000000000000000000000000000000008152602060048201818152885160248401528851600160a060020a03909416936349145c91938a9383926044909201919085019080838360005b838110156107ed5781810151838201526020016107d5565b50505050905090810190601f16801561081a5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561083957600080fd5b505af115801561084d573d6000803e3d6000fd5b505050506040513d602081101561086357600080fd5b5051915081158015906108775750600a5482105b151561088257600080fd5b61088d823433611583565b61089c565b61089c8334611886565b60c86108af34600363ffffffff6119fe16565b8115156108b857fe5b600c54604080518082019091526004815260e460020a63041495050260208201529290910492506108f591600160a060020a039091169083611a2c565b151561090057600080fd5b601454604080518082019091526004815260e460020a630414950502602082015261093591600160a060020a03169083611a2c565b151561094057600080fd5b506001949350505050565b600f5490565b60008060008060008060008061096633611564565b9150610992600b8381548110151561097a57fe5b90600052602060002090600802016007015442611a57565b156109ba57600b8054839081106109a557fe5b90600052602060002090600802016005015490505b600b8054839081106109c857fe5b906000526020600020906008020160000154600b838154811015156109e957fe5b906000526020600020906008020160010154600b84815481101515610a0a57fe5b906000526020600020906008020160020154600b85815481101515610a2b57fe5b90600052602060002090600802016003015484600b87815481101515610a4d57fe5b9060005260206000209060080201600601549750975097509750975097505050909192939495565b6000610a8033611564565b9050801515610a8e57600080fd5b610a9a81601154611a6c565b50565b601290565b60055481565b600c54600160a060020a03163314610abf57600080fd5b6014805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b606080600080600080600080600080600080610b08612f5d565b6000610b1333611b36565b602081015190925015610b7e57610b7b600a8360200151815481101515610b3657fe5b90600052602060002090600b020160030154600a8460200151815481101515610b5b57fe5b90600052602060002090600b02016005015461154790919063ffffffff16565b90505b6015548251604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251600160a060020a0390921691633a5294a09160248082019260009290919082900301818387803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610c2c57600080fd5b810190808051640100000000811115610c4457600080fd5b82016020810184811115610c5757600080fd5b8151640100000000811182820187101715610c7157600080fd5b50506015546020870151604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909216600483015251929550600160a060020a039091169350633a5294a0925060248082019260009290919082900301818387803b158015610cec57600080fd5b505af1158015610d00573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d2957600080fd5b810190808051640100000000811115610d4157600080fd5b82016020810184811115610d5457600080fd5b8151640100000000811182820187101715610d6e57600080fd5b505092919050505082846040015185608001518660a001518760c001518860e001518961010001518a61016001518b61018001518c606001519d509d509d509d509d509d509d509d509d509d509d509d505050909192939495969798999a9b565b6000610dda33611c47565b90506000811115610a9a57610e0f3360408051908101604052806004815260200160e460020a63041495050281525083611a2c565b1515610a9a57600080fd5b600c54600160a060020a03163314610e3157600080fd5b610e3a816114ee565b15610e4457600080fd5b610a9a60008083611583565b6000610e7a60408051908101604052806004815260200160e060020a634143455302815250611cbe565b905090565b60008060008060008069d3c21bcecceda10000006012541015610eb75767016345785d8a00009550670de0b6b3a76400009450610f4a565b6012546a084595161401484a0000009004935060088410610ed757600893505b600d805485908110610ee557fe5b90600052602060002001549250600e84815481101515610f0157fe5b906000526020600020015491506969e10de76676d08000006a084595161401484a000000850260125403811515610f3457fe5b0483810283019650670de0b6b3a7640000955090505b505050509091565b623356284310610f6157600080fd5b600655565b600c54600160a060020a031681565b600080610f8133611564565b9050801515610f8f57600080fd5b610f97611cf5565b610fc142600b83815481101515610faa57fe5b906000526020600020906008020160060154611a57565b15610fed57600b805482908110610fd457fe5b9060005260206000209060080201600401549150610ff9565b610ff681611d2b565b91505b5090565b6060600061100a33611564565b601554604080517f3a5294a000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201529051929350600160a060020a0390911691633a5294a09160248082019260009290919082900301818387803b15801561107c57600080fd5b505af1158015611090573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156110b957600080fd5b8101908080516401000000008111156110d157600080fd5b820160208101848111156110e457600080fd5b81516401000000008111828201871017156110fe57600080fd5b50909550505050505090565b600c54600160a060020a0316331461112157600080fd5b6010805460ff1916911515919091179055565b6000610e7a611ebb565b6015546040517f49145c910000000000000000000000000000000000000000000000000000000081526020600482018181528451602484015284516000948594600160a060020a03909116936349145c9193889390928392604490910191908501908083838b5b838110156111bd5781810151838201526020016111a5565b50505050905090810190601f1680156111ea5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561120957600080fd5b505af115801561121d573d6000803e3d6000fd5b505050506040513d602081101561123357600080fd5b5051905080158015906112475750600a5481105b91505b50919050565b61127b60408051908101604052806004815260200160e060020a6341434553028152506106ff61147d565b151561128657600080fd5b336000908152601360205260409020546112a6903463ffffffff61154716565b33600090815260136020526040902055565b60075481565b600c54600160a060020a031633146112d557600080fd5b601155565b3360009081526013602052604090205490565b601054600090819060ff16151561130357600080fd5b61132e60408051908101604052806004815260200160e460020a6304149505028152506106ff61147d565b151561133957600080fd5b503469152d02c7e14af68000008111156113915769152d02c7e14af680000090506113863360408051908101604052806004815260200160e460020a630414950502815250833403611a2c565b151561139157600080fd5b61139a81611ef7565b6012549092506113b0908263ffffffff61154716565b601255604080518082019091526004815260e060020a63414345530260208201526113dd90339084611a2c565b1515610ff957600080fd5b600c54600160a060020a031633146113ff57600080fd5b600160a060020a038116151561141457600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600354602083a15080516114b781611f2c565b9250505090565b80518251600091146114d2575060006114e8565b6114db826120e5565b6114e4846120e5565b1490505b92915050565b6000903b1190565b600080611505600a8404611ef7565b33600090815260136020526040902054909150811115611528576000915061124a565b3360009081526013602052604090208054919091039055506001919050565b60008282018381101561155957600080fd5b8091505b5092915050565b600160a060020a0381166000908152600960205260409020545b919050565b61158b611cf5565b600a805490506009600083600160a060020a0316600160a060020a0316815260200190815260200160002081905550600a6101a0604051908101604052808581526020016000815260200184815260200184815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200183600160a060020a03168152602001600060ff168152602001600015158152509080600181540180825580915050906001820390600052602060002090600b020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a0160006101000a815481600160a060020a030219169083600160a060020a0316021790555061016082015181600a0160146101000a81548160ff021916908360ff16021790555061018082015181600a0160156101000a81548160ff021916908315150217905550505050600b61010060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001428152602001600081525090806001815401808255809150509060018203906000526020600020906008020160009091929091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155505050826000141515611855576118316001600a8581548110151561181157fe5b90600052602060002090600b02016006015461154790919063ffffffff16565b600a80548590811061183f57fe5b90600052602060002090600b0201600601819055505b600082111561188157600160a060020a03811660009081526009602052604090205461188190836120ec565b505050565b6000611890611cf5565b6118ba600b848154811015156118a257fe5b90600052602060002090600802016006015442611a57565b1580156118e757506000600a848154811015156118d357fe5b90600052602060002090600b020160020154115b80156118f4575060045415155b8015611901575060055415155b1561193f5761190f83611d2b565b600854909150611925908263ffffffff61154716565b60085560065461193b908263ffffffff61271616565b6006555b61197282600a8581548110151561195257fe5b90600052602060002090600b02016002015461154790919063ffffffff16565b600a80548590811061198057fe5b90600052602060002090600b0201600201819055506119c882600a858154811015156119a857fe5b90600052602060002090600b02016003015461154790919063ffffffff16565b600a8054859081106119d657fe5b90600052602060002090600b02016003018190555060008211156118815761188183836120ec565b600080831515611a11576000915061155d565b50828202828482811515611a2157fe5b041461155957600080fd5b6000611a4f8484846020604051908101604052806000815250600060010261272d565b949350505050565b610e1060189283900481900492909104041490565b600080611a77611cf5565b6004541580611a865750600554155b15611a9057611b30565b50825b600a54611aa290858501612785565b811015611b0357611abb600b828154811015156118a257fe5b158015611ae85750600a805482908110611ad157fe5b90600052602060002090600b020160020154600014155b15611afb57611af681611d2b565b820191505b600101611a93565b600854611b16908363ffffffff61154716565b600855600654611b2c908363ffffffff61271616565b6006555b50505050565b611b3e612f5d565b600160a060020a038216600090815260096020526040902054600a80549091908110611b6657fe5b6000918252602091829020604080516101a081018252600b909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546101008201526009820154610120820152600a90910154600160a060020a03811661014083015260ff740100000000000000000000000000000000000000008204811661016084015275010000000000000000000000000000000000000000009091041615156101808201529050919050565b600080611c5383611564565b9050801515611c6157600080fd5b600a805482908110611c6f57fe5b90600052602060002090600b02016008015491506000600a82815481101515611c9457fe5b90600052602060002090600b020160080181905550611cb560085483612716565b60085550919050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600154602082a15192915050565b611d0142600754611a57565b1515611d2957601e611d11611ebb565b811515611d1a57fe5b04600555600654600455426007555b565b6000806000806000611d86600a87815481101515611d4557fe5b90600052602060002090600b020160070154600a88815481101515611d6657fe5b90600052602060002090600b0201600201546119fe90919063ffffffff16565b9350611dbb600a87815481101515611d9a57fe5b90600052602060002090600b0201600401548561271690919063ffffffff16565b9250600454611dd5846005546119fe90919063ffffffff16565b811515611dde57fe5b0491506103e8611df585600263ffffffff6119fe16565b811515611dfe57fe5b04905080821115611e0d578091505b611e178683612796565b915042600b87815481101515611e2957fe5b906000526020600020906008020160060181905550611e6e82600b88815481101515611e5157fe5b60009182526020909120600890910201549063ffffffff61154716565b600b805488908110611e7c57fe5b6000918252602090912060089091020155600b805483919088908110611e9e57fe5b600091825260209091206004600890920201015550949350505050565b6000610e7a600854611eeb60408051908101604052806004815260200160e460020a630414950502815250611cbe565b9063ffffffff61271616565b6000806000611f04610e7f565b909250905081611f1a858363ffffffff6119fe16565b811515611f2357fe5b04949350505050565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015611ffb576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615611fe557818486815181101515611faa57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193611ff0565b8415611ff057611ffb565b600190920191611f5f565b846040519080825280601f01601f191660200182016040528015612029578160200160208202803883390190505b509050600092505b848310156120db57838381518110151561204757fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000281848151811015156120a057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191612031565b9695505050505050565b6020015190565b600080808080808080808080690a968163f0a57b4000008c10612143576001600a8e81548110151561211a57fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b600a80548e90811061215157fe5b90600052602060002090600b02016007015460001415612198576121748c612a76565b600a80548f90811061218257fe5b90600052602060002090600b0201600701819055505b600a80548e9c508c9081106121a957fe5b90600052602060002090600b02016000015499508b97505b891561260957600a80548c9081106121d557fe5b90600052602060002090600b020160090154600014151561224c57612223600a8c81548110151561220257fe5b90600052602060002090600b0201600901548961154790919063ffffffff16565b97506000600a8c81548110151561223657fe5b90600052602060002090600b0201600901819055505b61012c8914801561227d5750600a80548b90811061226657fe5b90600052602060002090600b020160000154600014155b156122dd576122b588600a8c81548110151561229557fe5b90600052602060002090600b02016009015461154790919063ffffffff16565b600a80548c9081106122c357fe5b90600052602060002090600b020160090181905550612609565b6122f088600a8c815481101515610b5b57fe5b600a80548c9081106122fe57fe5b90600052602060002090600b020160050181905550600a80548b90811061232157fe5b90600052602060002090600b02016001015460001415612365578a600a8b81548110151561234b57fe5b90600052602060002090600b0201600101819055506125d7565b600a80548b90811061237357fe5b90600052602060002090600b02016001015496506123ba600a8881548110151561239957fe5b90600052602060002090600b020160030154600a89815481101515610b5b57fe5b95506123ef600a8c8154811015156123ce57fe5b90600052602060002090600b020160030154600a8d815481101515610b5b57fe5b94508a600a8b81548110151561240157fe5b90600052602060002090600b0201600101541415801561242057508585115b1561244e578a600a8b81548110151561243557fe5b90600052602060002090600b0201600101819055508495505b61248586611eeb600a8d81548110151561246457fe5b90600052602060002090600b020160090154600a8e815481101515610b5b57fe5b935069a968163f0a57b400000086101580156124ac57506a0152d02c7e14af680000008410155b156124ba5760049250612555565b6954b40b1f852bda00000086101580156124de575069a968163f0a57b40000008410155b156124ec5760039250612555565b692a5a058fc295ed000000861015801561251057506954b40b1f852bda0000008410155b1561251e5760029250612555565b69152d02c7e14af680000086101580156125425750692a5a058fc295ed0000008410155b156125505760019250612555565b600092505b600a80548b90811061256357fe5b60009182526020909120600a600b90920201015460ff74010000000000000000000000000000000000000000909104811690841611156125d75782600a8b8154811015156125ad57fe5b90600052602060002090600b0201600a0160146101000a81548160ff021916908360ff1602179055505b600a80546001909a01998b9190829081106125ee57fe5b60009182526020909120600b9091020154909b5099506121c1565b612633600a8e81548110151561261b57fe5b90600052602060002090600b0201600001548d612ab3565b82019150612661600a8e81548110151561264957fe5b90600052602060002090600b0201600001548d612bae565b8201915061268f600a8e81548110151561267757fe5b90600052602060002090600b0201600001548d612d74565b6008549201916126a5908363ffffffff61154716565b600855600a80546126dc91908f9081106126bb57fe5b90600052602060002090600b0201600701548d6119fe90919063ffffffff16565b90506126ee818363ffffffff61271616565b600654909150612704908263ffffffff61154716565b60065550505050505050505050505050565b6000808383111561272657600080fd5b5050900390565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b60008183101561124a5750816114e8565b6000806127cc600a858154811015156127ab57fe5b90600052602060002090600b020160070154600a86815481101515611d6657fe5b905080612802600a868154811015156127e157fe5b90600052602060002090600b0201600401548561154790919063ffffffff16565b111561283e5761283b600a8581548110151561281a57fe5b90600052602060002090600b0201600401548261271690919063ffffffff16565b92505b61287183600a8681548110151561285157fe5b90600052602060002090600b02016004015461154790919063ffffffff16565b600a80548690811061287f57fe5b90600052602060002090600b02016004018190555080600a858154811015156128a457fe5b90600052602060002090600b020160040154101515612943576000600a858154811015156128ce57fe5b90600052602060002090600b0201600201819055506000600a858154811015156128f457fe5b90600052602060002090600b0201600401819055506000600a8581548110151561291a57fe5b90600052602060002090600b0201600a0160156101000a81548160ff0219169083151502179055505b61296d42600b8681548110151561295657fe5b906000526020600020906008020160070154611a57565b15156129c25782600b8581548110151561298357fe5b90600052602060002090600802016005018190555042600b858154811015156129a857fe5b906000526020600020906008020160070181905550612a19565b6129f583600b868154811015156129d557fe5b90600052602060002090600802016005015461154790919063ffffffff16565b600b805486908110612a0357fe5b9060005260206000209060080201600501819055505b612a4c83600a86815481101515612a2c57fe5b90600052602060002090600b02016008015461154790919063ffffffff16565b600a805486908110612a5a57fe5b600091825260209091206008600b909202010155509092915050565b6000683635c9adc5dea00000821015612a915750600361157e565b69010f0cf064dd59200000821015612aab5750600461157e565b50600561157e565b6000808080851515612ac457612ba5565b612ad08686600a612ea0565b83019250600a86815481101515612ae357fe5b60009182526020909120600b909102015491508115612ba1576002600a83815481101515612b0d57fe5b90600052602060002090600b020160060154101515612b3757612b3282866008612ea0565b830192505b600a805483908110612b4557fe5b90600052602060002090600b020160000154905060008114158015612b8b57506003600a82815481101515612b7657fe5b90600052602060002090600b02016006015410155b15612ba157612b9c81866007612ea0565b830192505b8293505b50505092915050565b600080808080861515612bc057612d6a565b8615801590612bd0575061012c84105b8015612bdc5750600c83105b15612d6a57600a805488908110612bef57fe5b60009182526020909120600b90910201600a015474010000000000000000000000000000000000000000900460ff161580612c495750600a805488908110612c3357fe5b90600052602060002090600b0201600201546000145b15612c7a57600a805488908110612c5c57fe5b60009182526020909120600b90910201549650600190930192612bc0565b600a805488908110612c8857fe5b60009182526020909120600a600b909202010154600360ff74010000000000000000000000000000000000000000909204821602169150828211612cd457600a805488908110612c5c57fe5b90918203906064612ceb878463ffffffff6119fe16565b811515612cf457fe5b049050612d018782612796565b9050612d3681600b89815481101515612d1657fe5b90600052602060002090600802016002015461154790919063ffffffff16565b600b805489908110612d4457fe5b6000918252602090912060026008909202010155600a80549582019588908110612c5c57fe5b5050505092915050565b600080831515612d835761155d565b8315801590612dbc5750600a805485908110612d9b57fe5b90600052602060002090600b0201600a0160159054906101000a900460ff16155b8015612dc9575061012c81105b15612df757600a805485908110612ddc57fe5b60009182526020909120600b90910201549350600101612d83565b8315801590612e2f5750600a805485908110612e0f57fe5b90600052602060002090600b0201600a0160159054906101000a900460ff165b1561155d57612e418460148504612796565b9150612e7682600b86815481101515612e5657fe5b90600052602060002090600802016003015461154790919063ffffffff16565b600b805486908110612e8457fe5b9060005260206000209060080201600301819055505092915050565b600080600a85815481101515612eb257fe5b90600052602060002090600b02016002015460001415612ed157612f55565b6064612ee3858563ffffffff6119fe16565b811515612eec57fe5b049050612ef98582612796565b9050612f2e81600b87815481101515612f0e57fe5b90600052602060002090600802016001015461154790919063ffffffff16565b600b805487908110612f3c57fe5b9060005260206000209060080201600101819055508091505b509392505050565b6101a060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000600160a060020a03168152602001600060ff16815260200160001515815250905600a165627a7a7230582044ea9559157d573fa9cbe109d785ba4c6d479b0d1d659d1fa6122554236a607b0029\")\n\tdata4= common.Hex2Bytes(\"60806040526004361061023b5760003560e01c8063672d7a0d1161012e578063b13c86a3116100ab578063ef0bb2611161006f578063ef0bb261146105fd578063f0b4dbbf1461061d578063f2d109e71461063d578063f2fde38b14610652578063f684b959146106725761023b565b8063b13c86a31461057c578063be6f42431461059e578063cb4ac944146105c0578063e0992711146105d5578063e99595a4146105e85761023b565b8063817a2529116100f2578063817a25291461051d57806386fd96b6146105325780638da5cb5b1461054557806395d89b4114610255578063a2ced305146105675761023b565b8063672d7a0d146104935780636a472f3e146104b35780636b80f07b146104c85780637adbf973146104e857806380313d31146105085761023b565b806338d07436116101bc578063565974d311610180578063565974d31461042c5780635920375c1461044e5780635960ece7146104565780635bea9faa1461047657806366666aa91461047e5761023b565b806338d07436146103895780633eaaf86b146103a95780633feb5f2b146103be5780634281fff3146103f757806345ccadb0146104175761023b565b806318160ddd1161020357806318160ddd146102ed57806323c674d4146103025780632d1f329f14610322578063313ce56714610342578063370158ea146103645761023b565b80630224c20e1461024057806306fdde03146102555780630bfa2e0d146102805780630f8b38b3146102a057806317d35d1e146102cd575b600080fd5b61025361024e366004613e0f565b610692565b005b34801561026157600080fd5b5061026a61069f565b60405161027791906141c1565b60405180910390f35b61029361028e366004613f44565b6106c0565b60405161027791906141b6565b3480156102ac57600080fd5b506102c06102bb366004613fa8565b610701565b604051610277919061451e565b3480156102d957600080fd5b506102c06102e8366004613fa8565b610713565b3480156102f957600080fd5b506102c0610725565b34801561030e57600080fd5b506102c061031d366004613fa8565b61072b565b34801561032e57600080fd5b506102c061033d366004613e0f565b610749565b34801561034e57600080fd5b5061035761075b565b6040516102779190614556565b34801561037057600080fd5b50610379610760565b6040516102779493929190614527565b34801561039557600080fd5b506102536103a4366004613fc0565b61078e565b3480156103b557600080fd5b506102c0610881565b3480156103ca57600080fd5b506103de6103d9366004613fa8565b610887565b6040516102779d9c9b9a99989796959493929190614108565b34801561040357600080fd5b506102c0610412366004613fa8565b61090a565b34801561042357600080fd5b506102c0610917565b34801561043857600080fd5b5061044161091d565b6040516102779190614326565b610253610dd3565b34801561046257600080fd5b506102c0610471366004613fa8565b610f3b565b610253610f48565b34801561048a57600080fd5b506102c0610fe5565b34801561049f57600080fd5b506102536104ae366004613e0f565b610feb565b3480156104bf57600080fd5b506102c0611044565b3480156104d457600080fd5b506102536104e3366004613e0f565b61104a565b3480156104f457600080fd5b50610253610503366004613e0f565b611083565b34801561051457600080fd5b506102c06110bc565b34801561052957600080fd5b506102c06110c2565b610293610540366004613f44565b6110c8565b34801561055157600080fd5b5061055a611261565b60405161027791906140f4565b34801561057357600080fd5b506102c0611270565b34801561058857600080fd5b50610591611276565b6040516102779190614172565b3480156105aa57600080fd5b506105b36113b1565b6040516102779190614436565b3480156105cc57600080fd5b506102c0611947565b6102536105e3366004613f44565b61194d565b3480156105f457600080fd5b50610253611a4b565b34801561060957600080fd5b506102c0610618366004613fa8565b611c36565b34801561062957600080fd5b506102c0610638366004613fa8565b611c48565b34801561064957600080fd5b50610253611c5a565b34801561065e57600080fd5b5061025361066d366004613e0f565b611d64565b34801561067e57600080fd5b506102c061068d366004613fa8565b611dea565b61069c3382611dfc565b50565b604080518082019091526006815265434f494e484960d01b60208201525b90565b60008151600014156106d4575060006106fc565b600080838060200190518101906106eb9190613e2b565b915091506106f98282611dfc565b50505b919050565b600a6020526000908152604090205481565b60096020526000908152604090205481565b601b5490565b6012818154811061073857fe5b600091825260209091200154905081565b60146020526000908152604090205481565b601290565b60008060008060185460065460046018548161077857fe5b0401601954600654935093509350935090919293565b3360009081526014602052604090205480158015906107ae575060155481105b6107b757600080fd5b6000831180156107d15750690a968163f0a57b4000008311155b6107da57600080fd5b6107e48184611f4b565b9250826107f1575061087d565b8161080557610800338461209d565b61087b565b606061080f611276565b905061085c8160008151811061082157fe5b60200260200101516108508360018151811061083957fe5b60200260200101518761217190919063ffffffff16565b9063ffffffff61219f16565b935061086833856121c1565b61087157600080fd5b610879612232565b505b505b5050565b601b5481565b6015818154811061089457fe5b60009182526020909120600d9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b8c0154600c909c01546001600160a01b03909b169c50989a97999698959794969395929491939092919060ff168d565b6013818154811061073857fe5b60075481565b610925613bf3565b336000908152601460205260409020548061094057506106bd565b610948613c72565b6015828154811061095557fe5b6000918252602091829020604080516101a081018252600d90930290910180546001600160a01b03908116845260018201549484019490945260028101548383015260038101546060808501919091526004808301546080860152600583015460a0860152600683015460c0860152600783015460e086015260088301546101008601526009830154610120860152600a830154610140860152600b830154610160860152600c9092015460ff161515610180850152601e5492516301d294a560e51b8152939550939190911691633a5294a091610a3591879101614542565b60006040518083038186803b158015610a4d57600080fd5b505afa158015610a61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a899190810190613f76565b905060608260200151600014610b2357601e5460208401516040516301d294a560e51b81526001600160a01b0390921691633a5294a091610acc91600401614542565b60006040518083038186803b158015610ae457600080fd5b505afa158015610af8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b209190810190613f76565b90505b600080808080806201518042049050808961010001511015610c07576000610b4a8b6122d7565b90506000610b5f828c61010001518503612314565b905080821015610b6c5750805b60e08b0151610b81908263ffffffff61242916565b60c08c0151909650610b99908263ffffffff61242916565b9650610ba48c61243b565b8610158015610bb857508a60a00151601a54115b15610be157610bda86610bce8d6060015161248e565b9063ffffffff6124a616565b9450610be9565b8a6080015194505b610bfe86610bce87610bce8f6060015161248e565b97505050610c28565b8860c0015194508860e00151935088608001519250610c258a6122d7565b95505b61271060038702049150600060608a60400151600014610d0f57601e546040808d015190516301d294a560e51b81526001600160a01b0390921691633a5294a091610c7591600401614542565b60006040518083038186803b158015610c8d57600080fd5b505afa158015610ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cc99190810190613f76565b9050610d0c610cdb8c6040015161243b565b60158d6040015181548110610cec57fe5b90600052602060002090600d02016009015461242990919063ffffffff16565b91505b6040518061020001604052808b81526020018a81526020018281526020018981526020018681526020018881526020018781526020018c60a0015181526020018c61014001518d61012001510181526020018381526020018581526020018c610160015181526020018c610180015115158152602001600960008f8152602001908152602001600020548152602001600a60008f8152602001908152602001600020548152602001610dc08e61243b565b90529c5050505050505050505050505090565b610e00604051806040016040528060048152602001635345524f60e01b815250610dfb6124bb565b6124fb565b610e0957600080fd5b336000908152601460205260409020548015801590610e29575060155481105b610e3257600080fd5b610e3b81612577565b6060610e45611276565b90506000610e8882600181518110610e5957fe5b602002602001015161085084600081518110610e7157fe5b60200260200101513461217190919063ffffffff16565b90508060190260158481548110610e9b57fe5b90600052602060002090600d0201600401541015610edc57600060158481548110610ec257fe5b90600052602060002090600d020160040181905550610f33565b610f108160190260158581548110610ef057fe5b90600052602060002090600d0201600401546124a690919063ffffffff16565b60158481548110610f1d57fe5b90600052602060002090600d0201600401819055505b61087b612232565b6010818154811061073857fe5b610f70604051806040016040528060048152602001635345524f60e01b815250610dfb6124bb565b610f955760405162461bcd60e51b8152600401610f8c906142dd565b60405180910390fd5b610fb06064600334025b60065491900463ffffffff61242916565b6006556060610fbd611276565b90506000610fd182600181518110610e5957fe5b9050610fdd338261209d565b61087d612232565b60065481565b6005546001600160a01b0316331461100257600080fd5b6001600160a01b03811660009081526014602052604090205480156110395760405162461bcd60e51b8152600401610f8c906142b2565b61087b60008361267b565b60195481565b6005546001600160a01b0316331461106157600080fd5b601c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461109a57600080fd5b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b60185481565b80516000901561121d5760006060838060200190518101906110ea9190613e64565b9150915060006110f8612929565b90508061110b57600093505050506106fc565b6001600160a01b0383166000908152601460205260409020548061120a57600061114460405180602001604052806000815250856124fb565b6111d457601e546040516349145c9160e01b81526001600160a01b03909116906349145c91906111789087906004016141c1565b60206040518083038186803b15801561119057600080fd5b505afa1580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c8919061400b565b6001600160401b031690505b80158015906111e4575060155481105b156111fa576111f3818661267b565b9150611208565b6000955050505050506106fc565b505b6112148183612abd565b50505050611259565b611245604051806040016040528060048152602001635345524f60e01b815250610dfb6124bb565b611251575060006106fc565b611259612232565b506001919050565b6005546001600160a01b031681565b601a5481565b601d546060906001600160a01b03166112a15760405162461bcd60e51b8152600401610f8c9061423a565b60408051600280825260608201835290916020830190803683375050601d546040516305b985e160e11b81529293506001600160a01b031691630b730bc291506112ed90600401614309565b604080518083038186803b15801561130457600080fd5b505afa158015611318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133c9190613fe8565b8260008151811061134957fe5b602002602001018360018151811061135d57fe5b60200260200101828152508281525050508060008151811061137b57fe5b60200260200101516000141580156113a857508060018151811061139b57fe5b6020026020010151600014155b6106bd57600080fd5b6113b9613ce5565b6012546060906001600160401b03811180156113d457600080fd5b5060405190808252806020026020018201604052801561140857816020015b60608152602001906001900390816113f35790505b506012549091506060906001600160401b038111801561142757600080fd5b50604051908082528060200260200182016040528015611451578160200160208202803683370190505b50905060005b60125481101561156c57601e54601280546001600160a01b0390921691633a5294a091908490811061148557fe5b90600052602060002001546040518263ffffffff1660e01b81526004016114ac9190614542565b60006040518083038186803b1580156114c457600080fd5b505afa1580156114d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115009190810190613f76565b83828151811061150c57fe5b60200260200101819052506064611545600d838154811061152957fe5b906000526020600020015460115461217190919063ffffffff16565b8161154c57fe5b0482828151811061155957fe5b6020908102919091010152600101611457565b5060065460009061158490601463ffffffff61219f16565b905060606115e160108054806020026020016040519081016040528092919081815260200182805480156115d757602002820191906000526020600020905b8154815260200190600101908083116115c3575b5050505050613167565b9050606081516001600160401b03811180156115fc57600080fd5b5060405190808252806020026020018201604052801561163057816020015b606081526020019060019003908161161b5790505b509050606082516001600160401b038111801561164c57600080fd5b50604051908082528060200260200182016040528015611676578160200160208202803683370190505b509050606082516001600160401b038111801561169257600080fd5b506040519080825280602002602001820160405280156116bc578160200160208202803683370190505b50905060005b845181101561180a57601e5485516001600160a01b0390911690633a5294a0908790849081106116ee57fe5b60200260200101516040518263ffffffff1660e01b81526004016117129190614542565b60006040518083038186803b15801561172a57600080fd5b505afa15801561173e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117669190810190613f76565b84828151811061177257fe5b60200260200101819052506117ac6064610850600d848154811061179257fe5b90600052602060002001548961217190919063ffffffff16565b8382815181106117b857fe5b602002602001018181525050600e60008683815181106117d457fe5b60200260200101518152602001908152602001600020548282815181106117f757fe5b60209081029190910101526001016116c2565b5033600090815260146020526040812054601580548290811061182957fe5b60009182526020909120600c600d90920201015460ff16801561185e575062015180420462015180600b548161185b57fe5b04145b8015611886575062015180426000838152600c60205260409020549190049062015180900414155b1561189f576007546011546002028161189b57fe5b0491505b60405180610140016040528060115481526020018a8152602001898152602001601380548060200260200160405190810160405280929190818152602001828054801561190b57602002820191906000526020600020905b8154815260200190600101908083116118f7575b50505050508152602001888152602001868152602001858152602001848152602001600b54815260200183815250995050505050505050505090565b600b5481565b6000611957612929565b3360009081526014602052604090205490915080611a4157600061198a60405180602001604052806000815250856124fb565b611a1a57601e546040516349145c9160e01b81526001600160a01b03909116906349145c91906119be9087906004016141c1565b60206040518083038186803b1580156119d657600080fd5b505afa1580156119ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0e919061400b565b6001600160401b031690505b8015801590611a2a575060155481105b611a3357600080fd5b611a3d813361267b565b9150505b61087b8183612abd565b62015180420462015180600b5481611a5f57fe5b041415611a6b57600080fd5b42600b55611a7b60126000613d38565b611a8760136000613d38565b600654611a9b90601463ffffffff61219f16565b6011819055506060611afa60108054806020026020016040519081016040528092919081815260200182805480156115d757602002820191906000526020600020908154815260200190600101908083116115c3575050505050613167565b90506000805b8251811015611c13576012838281518110611b1757fe5b60209081029190910181015182546001810184556000938452918320909101558351601391600e91869085908110611b4b57fe5b602090810291909101810151825281810192909252604001600090812054835460018101855593825291812090920155600d8054606491611b90918590811061152957fe5b81611b9757fe5b0490508083019250611c016015858481518110611bb057fe5b602002602001015181548110611bc257fe5b6000918252602091829020600d90910201546040805180820190915260048152635345524f60e01b928101929092526001600160a01b03169083613272565b611c0a57600080fd5b50600101611b00565b50600654611c27908263ffffffff6124a616565b60065561087d60106000613d38565b60086020526000908152604090205481565b60166020526000908152604090205481565b336000908152601460205260409020548015801590611c7a575060155481105b611c8357600080fd5b62015180420462015180600b5481611c9757fe5b0414611ca257600080fd5b60158181548110611caf57fe5b60009182526020909120600c600d90920201015460ff16611ccf57600080fd5b62015180426000838152600c6020526040902054919004906201518090041415611cf857600080fd5b6000818152600c6020526040812042905560075460115460020281611d1957fe5b049050611d31816006546124a690919063ffffffff16565b6006556040805180820190915260048152635345524f60e01b6020820152611d5b90339083613272565b61087d57600080fd5b6005546001600160a01b03163314611d7b57600080fd5b6001600160a01b038116611d8e57600080fd5b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b60176020526000908152604090205481565b806001600160a01b0316826001600160a01b03161415611e1b57600080fd5b6001600160a01b0382166000908152601460205260409020548015801590611e44575060155481105b611e4d57600080fd5b6000611e57612929565b6001600160a01b03841660009081526014602052604081205491925081611ea1575060018315801590611e8b575060155484105b611e9457600080fd5b611e9e848661267b565b91505b611ec5846019611eb886600263ffffffff61217116565b81611ebf57fe5b04612abd565b611ecf8284612abd565b8015611f43576001600160a01b038516600090815260146020526040812054611ef89082611f4b565b90506060611f04611276565b9050611f3787611f3283600081518110611f1a57fe5b60200260200101516108508560018151811061083957fe5b6121c1565b611f4057600080fd5b50505b505050505050565b6000611f5683612577565b600060158481548110611f6557fe5b90600052602060002090600d020190508260001415611fa55780600601549250690a968163f0a57b400000831115611fa557690a968163f0a57b40000092505b8060060154831115611fb657600080fd5b620151804260008681526017602052604090205491900490620151809004141561204357600084815260166020526040902054690a968163f0a57b40000090612005908563ffffffff61242916565b111561201057600080fd5b60008481526016602052604090205461202f908463ffffffff61242916565b600085815260166020526040902055612079565b690a968163f0a57b40000083111561205a57600080fd5b6000848152601660209081526040808320869055601790915290204290555b600681015461208e908463ffffffff6124a616565b60069091015550805b92915050565b60006120c660405180604001604052806006815260200165434f494e484960d01b81525061329b565b9050818110612101576120f88360405180604001604052806006815260200165434f494e484960d01b81525084613272565b61080057600080fd5b601b8054828403908101909155604080518082019091526006815265434f494e484960d01b60208201526121369082906132d1565b61213f57600080fd5b6121688460405180604001604052806006815260200165434f494e484960d01b81525085613272565b61087957600080fd5b60008261218057506000612097565b8282028284828161218d57fe5b041461219857600080fd5b9392505050565b60008082116121ad57600080fd5b60008284816121b857fe5b04949350505050565b60006121d86006548361242990919063ffffffff16565b6121fd604051806040016040528060048152602001635345524f60e01b81525061329b565b101561220b57506000612097565b61219883604051806040016040528060048152602001635345524f60e01b81525084613272565b6000612259604051806040016040528060048152602001635345524f60e01b81525061329b565b9050600654811161227657601a546122705742601a555b506122d5565b600061228d600654836124a690919063ffffffff16565b90506018548111156122b35760188190556019548111156122ae576000601a555b61087d565b6004601854816122bf57fe5b0481101561087d5742601a556018805460195555505b565b600080601583815481106122e757fe5b90600052602060002090600d020190506121988160070154610bce8360040154610bce856003015461248e565b60008161232357506000612097565b600a8083049083066000805b838110156123b8576123696ec097ce7bc90715b34b9f1000000000610850896ec012d88ef11e1522c212609a2510ad63ffffffff61217116565b91506123a36123966123896127106108508661270d63ffffffff61217116565b899063ffffffff6124a616565b869063ffffffff61242916565b945061271061270d830204965060010161232f565b508115612420576123e3600019830161271081900a9061085090899061270d0a63ffffffff61217116565b905061241d6124106124036127106108508561270d63ffffffff61217116565b889063ffffffff6124a616565b859063ffffffff61242916565b93505b50505092915050565b60008282018381101561219857600080fd5b6000818152600a60209081526040808320546009909252822054601580546120979392610bce9290918790811061246e57fe5b90600052602060002090600d0201600301546124a690919063ffffffff16565b6000612097600a61085084607d63ffffffff61217116565b6000828211156124b557600080fd5b50900390565b6040805160208082528183019092526060918291906020820181803683370190505090506000600354602083a15080516124f48161330f565b9250505090565b6000815183511461250e57506000612097565b60005b835181101561256d5782818151811061252657fe5b602001015160f81c60f81b6001600160f81b03191684828151811061254757fe5b01602001516001600160f81b03191614612565576000915050612097565b600101612511565b5060019392505050565b60006015828154811061258657fe5b90600052602060002090600d0201905060006201518042816125a457fe5b049050808260080154101561087b5760006125be846122d7565b9050806125d1575060089091015561069c565b60006125e38285600801548503612314565b600885018490559050808210156125f75750805b600784015461260c908263ffffffff61242916565b60078501556006840154612626908263ffffffff61242916565b60068501556126348561243b565b84600701541015801561264c57508360050154601a54115b15612674576126668460070154610bce866003015461248e565b6004850155601a5460058501555b5050505050565b601580546001600160a01b03928316600081815260146020908152604080832085905580516101a0810182529384529083019687528201818152606083018281526080840183815260a0850184815260c0860185815260e0870186815262015180420460001901610100890190815261012089018881526101408a018981526101608b018a81526101808c018b815260018e018f559d909a5299517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec475600d8d0290810180546001600160a01b03191692909f1691909117909d559c517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4768d015595517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4778c015593517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4788b015591517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4798a0155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47a890155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47b880155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47c870155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47d86015594517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47e850155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47f84015592517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec480830155517f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec481909101805460ff191691151591909117905590565b600060606129356124bb565b90506060612941611276565b9050600061296b604051806040016040528060048152602001635345524f60e01b815250846124fb565b156129985761298082600181518110610e5957fe5b9050612990606460033402610f9f565b600655612a20565b6129be6040518060400160405280600481526020016353434e5960e01b815250846124fb565b156129d45750346129cf838261343b565b612a20565b6129fc60405180604001604052806006815260200165434f494e484960d01b815250846124fb565b15612a08575034612a20565b60405162461bcd60e51b8152600401610f8c90614287565b6000612a6183600081518110612a3257fe5b602002602001015161085085600181518110612a4a57fe5b60200260200101518561217190919063ffffffff16565b600554909150612a7e906001600160a01b03166064835b046121c1565b50601f54612a97906001600160a01b0316606483612a78565b50602054612ab3906001600160a01b0316606460038402612a78565b50506124f4612232565b600060158381548110612acc57fe5b90600052602060002090600d020190508060030154600014612b5257612af183612577565b6000612710612b106003612b048661248e565b9063ffffffff61217116565b81612b1757fe5b049050612b3181836006015461242990919063ffffffff16565b60068301556007820154612b4b908263ffffffff61242916565b6007830155505b6003810154612b67908363ffffffff61242916565b600382015560018101548015801590612b8857506000612b86826122d7565b115b15612c2e57600081815260086020526040902054612bac908463ffffffff61242916565b600082815260086020908152604080832093909355600b54600f909152919020541015612bf6576000818152600e60209081526040808320869055600f9091529020429055612c25565b6000818152600e6020526040902054612c15908463ffffffff61242916565b6000828152600e60205260409020555b612c2e81613555565b836000845b83156131425760158381548110612c4657fe5b90600052602060002090600d0201600a0154600014612d0857612c9060158481548110612c6f57fe5b90600052602060002090600d0201600a01548261242990919063ffffffff16565b9050612cc160158481548110612ca257fe5b90600052602060002090600d0201600a015460158581548110610cec57fe5b60158481548110612cce57fe5b90600052602060002090600d020160090181905550600060158481548110612cf257fe5b90600052602060002090600d0201600a01819055505b609682148015612d37575060158481548110612d2057fe5b90600052602060002090600d020160010154600014155b15612d9457612d6d8160158681548110612d4d57fe5b90600052602060002090600d0201600a015461242990919063ffffffff16565b60158581548110612d7a57fe5b90600052602060002090600d0201600a0181905550613142565b612da58160158681548110610cec57fe5b60158581548110612db257fe5b90600052602060002090600d02016009018190555060158481548110612dd457fe5b90600052602060002090600d02016002015460001415612e16578260158581548110612dfc57fe5b90600052602060002090600d020160020181905550613110565b600060158581548110612e2557fe5b90600052602060002090600d02016002015490506000612e54612e478361243b565b60158481548110610cec57fe5b90506000612e71612e648761243b565b60158881548110610cec57fe5b90508560158881548110612e8157fe5b90600052602060002090600d02016002015414158015612ea057508181115b15612ecc578560158881548110612eb357fe5b90600052602060002090600d0201600201819055508091505b6000612f0183610bce60158b81548110612ee257fe5b90600052602060002090600d0201600a015460158c81548110610cec57fe5b905060006a0d3c21bcecceda100000008410158015612f2b57506a02a5a058fc295ed00000008210155b15612f385750600661302d565b6a069e10de76676d080000008410158015612f5e57506a0152d02c7e14af680000008210155b15612f6b5750600561302d565b6a034f086f3b33b6840000008410158015612f90575069a968163f0a57b40000008210155b15612f9d5750600461302d565b6a01a784379d99db420000008410158015612fc257506954b40b1f852bda0000008210155b15612fcf5750600361302d565b69d3c21bcecceda10000008410158015612ff35750692a5a058fc295ed0000008210155b156130005750600261302d565b6969e10de76676d080000084101580156130245750690a968163f0a57b4000008210155b1561302d575060015b6015898154811061303a57fe5b90600052602060002090600d0201600b01548160ff161461307c578060ff1660158a8154811061306657fe5b90600052602060002090600d0201600b01819055505b6a0d3c21bcecceda1000000084101580156130a257506a04f68ca6d8cd91c60000008210155b1561310a57601589815481106130b457fe5b60009182526020909120600c600d90920201015460ff1661310a57600160158a815481106130de57fe5b60009182526020909120600d90910201600c01805460ff19169115159190911790556007805460010190555b50505050505b836015858154811061311e57fe5b600091825260209091206001600d9092020181015495509093509190910190612c33565b6131508560010154876136db565b61315e8560010154876136ef565b50505050505050565b606081516000141561317a5750806106fc565b6000805b600184510381101561326a57905080600181015b84518110156131fb57600e60008683815181106131ab57fe5b6020026020010151815260200190815260200160002054600e60008786815181106131d257fe5b602002602001015181526020019081526020016000205410156131f3578092505b600101613192565b5080821461326257600084828151811061321157fe5b6020026020010151905084838151811061322757fe5b602002602001015185838151811061323b57fe5b6020026020010181815250508085848151811061325457fe5b602002602001018181525050505b60010161317e565b509192915050565b6000613293848484604051806020016040528060008152506000801b6137fd565b949350505050565b60408051602080825281830190925260009160609190602082018180368337019050509050828152600154602082a15192915050565b6040805181815260608181018352600092909190602082018180368337019050509050828152836020820152600054604082a1602001519392505050565b604080516020808252818301909252606091600091839160208201818036833701905050905060005b602081101561339e576008810260020a85026001600160f81b0319811615613389578083858151811061336757fe5b60200101906001600160f81b031916908160001a905350600190930192613395565b8315613395575061339e565b50600101613338565b506060826001600160401b03811180156133b757600080fd5b506040519080825280601f01601f1916602001820160405280156133e2576020820181803683370190505b50905060005b83811015613432578281815181106133fc57fe5b602001015160f81c60f81b82828151811061341357fe5b60200101906001600160f81b031916908160001a9053506001016133e8565b50949350505050565b601c546001600160a01b03166134635760405162461bcd60e51b8152600401610f8c90614262565b801561087d576134878282604051806020016040528060008152506000801b613853565b601c5460408051808201825260048152635345524f60e01b60208083019190915282516000808252918101938490526340597a9160e01b909352926001600160a01b0316916340597a91916134e1913090602481016141d4565b600060405180830381600087803b1580156134fb57600080fd5b505af115801561350f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135379190810190613eb2565b511161087d5760405162461bcd60e51b8152600401610f8c90614212565b60105461359657601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720181905561069c565b6000805b60105481101561363257601081815481106135b157fe5b90600052602060002001548314156135ca57505061069c565b600e6000601084815481106135db57fe5b9060005260206000200154815260200190815260200160002054600e60006010848154811061360657fe5b9060005260206000200154815260200190815260200160002054101561362a578091505b60010161359a565b506010546006111561367857601080546001810182556000919091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720182905561087d565b600e60006010838154811061368957fe5b9060005260206000200154815260200190815260200160002054600e600084815260200190815260200160002054111561087d5781601082815481106136cb57fe5b6000918252602090912001555050565b6136e58282613898565b61087d82826139d4565b816136f95761087d565b6137058282600a613b04565b60006015838154811061371457fe5b90600052602060002090600d02016001015490506000811461087b5761373c81836006613b04565b60006003905060006015838154811061375157fe5b90600052602060002090600d02016001015490505b80158015906137765750600c8211155b156126745761378e69152d02c7e14af680000061248e565b613797826122d7565b1015806137c05750600081815260086020526040902054829069021e19e0c9bab2400000900410155b156137d1576137d181856001613b04565b601581815481106137de57fe5b90600052602060002090600d0201600101549050600182019150613766565b6040805160a080825260c082019092526000916060919060208201818036833701905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b60408051608080825260a08201909252606091602082018180368337019050509050848152836020820152826040820152816060820152600454608082a15050505050565b816138a25761087d565b6000805b83158015906138b55750609682105b80156138c15750600781105b1561087957601584815481106138d357fe5b90600052602060002090600d0201600b01546000141561391b57601584815481106138fa57fe5b90600052602060002090600d020160010154935081806001019250506138a6565b60006015858154811061392a57fe5b90600052602060002090600d0201600b01546001019050818111613977576015858154811061395557fe5b90600052602060002090600d02016001015494508280600101935050506138a6565b9081036000606461398e868463ffffffff61217116565b8161399557fe5b0490506139a486826000613b2a565b601586815481106139b157fe5b90600052602060002090600d0201600101549550838060010194505050506138a6565b60408051600680825260e08201909252600091606091906020820160c08036833701905050905060065b8415801590613a0d5750609683105b8015613a195750600081115b1561267457600060158681548110613a2d57fe5b90600052602060002090600d0201600b01541115613ad65781600160158781548110613a5557fe5b90600052602060002090600d0201600b01540381518110613a7257fe5b6020026020010180518091906001018152505081600160158781548110613a9557fe5b90600052602060002090600d0201600b01540381518110613ab257fe5b602002602001015160021415613ad657613ad185606486046000613b2a565b600019015b60158581548110613ae357fe5b90600052602060002090600d020160010154945082806001019350506139fe565b60006064613b18848463ffffffff61217116565b81613b1f57fe5b049050610879848260015b613b3383612577565b8015613b6c57600083815260096020526040902054613b58908363ffffffff61242916565b600084815260096020526040902055613b9b565b6000838152600a6020526040902054613b8b908363ffffffff61242916565b6000848152600a60205260409020555b613bcc8260158581548110613bac57fe5b90600052602060002090600d02016003015461242990919063ffffffff16565b60158481548110613bd957fe5b90600052602060002090600d020160030181905550505050565b6040518061020001604052806060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160008152602001600081525090565b604051806101a0016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b604051806101400160405280600081526020016060815260200160608152602001606081526020016000815260200160608152602001606081526020016060815260200160008152602001600081525090565b508054600082559060005260206000209081019061069c91906106bd91905b80821115613d6b5760008155600101613d57565b5090565b600082601f830112613d7f578081fd5b8135613d92613d8d826145a9565b614564565b9150808252836020828501011115613da957600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112613dd2578081fd5b8151613de0613d8d826145a9565b9150808252836020828501011115613df757600080fd5b613e088160208401602086016145cc565b5092915050565b600060208284031215613e20578081fd5b8135612198816145f8565b60008060408385031215613e3d578081fd5b8251613e48816145f8565b6020840151909250613e59816145f8565b809150509250929050565b60008060408385031215613e76578182fd5b8251613e81816145f8565b60208401519092506001600160401b03811115613e9c578182fd5b613ea885828601613dc2565b9150509250929050565b60006020808385031215613ec4578182fd5b82516001600160401b03811115613ed9578283fd5b80840185601f820112613eea578384fd5b80519150613efa613d8d8361458a565b8281528381019082850185850284018601891015613f16578687fd5b8693505b84841015613f38578051835260019390930192918501918501613f1a565b50979650505050505050565b600060208284031215613f55578081fd5b81356001600160401b03811115613f6a578182fd5b61329384828501613d6f565b600060208284031215613f87578081fd5b81516001600160401b03811115613f9c578182fd5b61329384828501613dc2565b600060208284031215613fb9578081fd5b5035919050565b60008060408385031215613fd2578182fd5b8235915060208301358015158114613e59578182fd5b60008060408385031215613ffa578182fd5b505080516020909101519092909150565b60006020828403121561401c578081fd5b81516001600160401b0381168114612198578182fd5b60008282518085526020808601955080818302840101818601855b8481101561407b57601f198684030189526140698383516140c8565b9884019892509083019060010161404d565b5090979650505050505050565b6000815180845260208085019450808401835b838110156140b75781518752958201959082019060010161409b565b509495945050505050565b15159052565b600081518084526140e08160208601602086016145cc565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039d909d168d5260208d019b909b5260408c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015215156101808201526101a00190565b6020808252825182820181905260009190848201906040850190845b818110156141aa5783518352928401929184019160010161418e565b50909695505050505050565b901515815260200190565b60006020825261219860208301846140c8565b6000606082526141e760608301866140c8565b6001600160a01b0385166020840152828103604084015261420881856140c8565b9695505050505050565b6020808252600e908201526d31b0b636103232bc1032b93937b960911b604082015260600190565b6020808252600e908201526d6e6f7420736574206f7261636c6560901b604082015260600190565b6020808252600b908201526a0dcdee840e6cae840c8caf60ab1b604082015260600190565b60208082526011908201527031bab93932b731bc9034b99032b93937b960791b604082015260600190565b602080825260119082015270616464726573732069732065786973747360781b604082015260600190565b60208082526012908201527163757272656e6379206d757374205345524f60701b604082015260600190565b602080825260039082015262434e5960e81b604082015260600190565b60006020825282516102008060208501526143456102208501836140c8565b60208601519250601f198086830301604087015261436382856140c8565b604088015194508187820301606088015261437e81866140c8565b9250505060608601516080860152608086015160a086015260a086015160c086015260c086015160e086015260e086015192506101008381870152808701519350506101208381870152808701519350506101408381870152808701519350506101608381870152808701519350506101808381870152808701519350506101a061440b818701856140c2565b8601516101c0868101919091528601516101e080870191909152909501519301929092525090919050565b60006020825282516020830152602083015161014080604085015261445f610160850183614032565b60408601519250601f198086830301606087015261447d8285614088565b60608801519450818782030160808801526144988186614088565b925050608087015160a087015260a08701519350808683030160c08701526144c08285614032565b60c08801519450818782030160e08801526144db8186614088565b92505060e087015193506101008187840301818801526144fb8386614088565b908801516101208881019190915290970151929095019190915250929392505050565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160401b0391909116815260200190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561458257600080fd5b604052919050565b60006001600160401b0382111561459f578081fd5b5060209081020190565b60006001600160401b038211156145be578081fd5b50601f01601f191660200190565b60005b838110156145e75781810151838201526020016145cf565b838111156108795750506000910152565b6001600160a01b038116811461069c57600080fdfea26469706673582212201075ffa42fe8c48b77f3eba91beb303f3f89e7ad3d050492f9a225013e128f0864736f6c634300060a0033\")\n\tdata5= common.Hex2Bytes(\"6080604052600436106101355760003560e01c80638416f245116100ab578063b0ce1c641161006f578063b0ce1c6414610711578063bf292e6f14610832578063bf40fac114610865578063c2abc0e614610916578063e99595a4146109c7578063f2fde38b146109cf57610135565b80638416f245146104b157806386fd96b6146105745780638da5cb5b1461061857806396365d44146106495780639f6563211461065e57610135565b8063565974d3116100fd578063565974d3146102505780635fd8c710146103ee578063672d7a0d146104035780636b80f07b146104365780637de34e12146104695780637ffdf53e1461049c57610135565b8063253657731461013a57806327450cc9146101905780632ca9a7c1146101bc5780633c26f84c146101d15780633ed0736514610229575b600080fd5b34801561014657600080fd5b5061014f610a02565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561019c57600080fd5b506101ba600480360360208110156101b357600080fd5b5035610b4a565b005b3480156101c857600080fd5b506101ba610b66565b3480156101dd57600080fd5b506101ba600480360360408110156101f457600080fd5b60408051808201825291830192918183019183906002908390839080828437600092019190915250919450610bc09350505050565b34801561023557600080fd5b5061023e610be8565b60408051918252519081900360200190f35b34801561025c57600080fd5b50610265610bee565b604051808060200180602001806020018c81526020018b81526020018a81526020018981526020018881526020018781526020018660ff1660ff1681526020018515151515815260200184810384528f818151815260200191508051906020019080838360005b838110156102e45781810151838201526020016102cc565b50505050905090810190601f1680156103115780820380516001836020036101000a031916815260200191505b5084810383528e818151815260200191508051906020019080838360005b8381101561034757818101518382015260200161032f565b50505050905090810190601f1680156103745780820380516001836020036101000a031916815260200191505b5084810382528d5181528d516020918201918f019080838360005b838110156103a757818101518382015260200161038f565b50505050905090810190601f1680156103d45780820380516001836020036101000a031916815260200191505b509e50505050505050505050505050505060405180910390f35b3480156103fa57600080fd5b506101ba611186565b34801561040f57600080fd5b506101ba6004803603602081101561042657600080fd5b50356001600160a01b03166111c9565b34801561044257600080fd5b506101ba6004803603602081101561045957600080fd5b50356001600160a01b03166111eb565b34801561047557600080fd5b506101ba6004803603602081101561048c57600080fd5b50356001600160a01b0316611224565b3480156104a857600080fd5b5061023e61125d565b610560600480360360408110156104c757600080fd5b810190602081018135600160201b8111156104e157600080fd5b8201836020820111156104f357600080fd5b803590602001918460018302840111600160201b8311171561051457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506112a39050565b604080519115158252519081900360200190f35b6105606004803603602081101561058a57600080fd5b810190602081018135600160201b8111156105a457600080fd5b8201836020820111156105b657600080fd5b803590602001918460018302840111600160201b831117156105d757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506112cb945050505050565b34801561062457600080fd5b5061062d6113b3565b604080516001600160a01b039092168252519081900360200190f35b34801561065557600080fd5b5061023e6113c2565b34801561066a57600080fd5b506101ba6004803603604081101561068157600080fd5b810190602081018135600160201b81111561069b57600080fd5b8201836020820111156106ad57600080fd5b803590602001918460018302840111600160201b831117156106ce57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506113c8915050565b34801561071d57600080fd5b50610726611573565b60405180806020018060200186815260200185815260200180602001848103845289818151815260200191508051906020019080838360005b8381101561077757818101518382015260200161075f565b50505050905090810190601f1680156107a45780820380516001836020036101000a031916815260200191505b508481038352885181528851602091820191808b01910280838360005b838110156107d95781810151838201526020016107c1565b50505050905001848103825285818151815260200191508051906020019060200280838360005b83811015610818578181015183820152602001610800565b505050509050019850505050505050505060405180910390f35b34801561083e57600080fd5b506101ba6004803603602081101561085557600080fd5b50356001600160a01b0316611877565b34801561087157600080fd5b5061062d6004803603602081101561088857600080fd5b810190602081018135600160201b8111156108a257600080fd5b8201836020820111156108b457600080fd5b803590602001918460018302840111600160201b831117156108d557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118b0945050505050565b34801561092257600080fd5b506105606004803603602081101561093957600080fd5b810190602081018135600160201b81111561095357600080fd5b82018360208201111561096557600080fd5b803590602001918460018302840111600160201b8311171561098657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119c5945050505050565b6101ba611aba565b3480156109db57600080fd5b506101ba600480360360208110156109f257600080fd5b50356001600160a01b0316611b19565b6000806000806000806000806000610a1933611b9f565b905080610a3f575060009750879650869550859450849350839250829150819050610b40565b6000600b610a4c83611bba565b81548110610a5657fe5b9060005260206000209060090201600701549050600b8281548110610a7757fe5b906000526020600020906009020160000154600b8381548110610a9657fe5b906000526020600020906009020160010154610ab0611be4565b600b8581548110610abd57fe5b906000526020600020906009020160020154600b8681548110610adc57fe5b906000526020600020906009020160030154600b8781548110610afb57fe5b906000526020600020906009020160040154600b8881548110610b1a57fe5b906000526020600020906009020160050154879950995099509950995099509950995050505b9091929394959697565b6017546001600160a01b03163314610b6157600080fd5b601555565b6000610b7133611b9f565b905080610b7d57600080fd5b62015180600b610b8c83611bba565b81548110610b9657fe5b906000526020600020906009020160070154420311610bb457600080fd5b610bbd81611e1c565b50565b6017546001600160a01b03163314610bd757600080fd5b610be4601b826002613f71565b5050565b60185481565b60608060606000806000806000806000806000610c0a33611b9f565b905080610c5b57505060408051602080820183526000808352835180830185528181528451928301909452808252919c50919a50909850965086955085945084935083925082915081905080611179565b610c63613fc5565b600a8281548110610c7057fe5b600091825260208083206040805161016081018252600990940290910180548452600181015492840192909252600282015483820152600382015460608401526004808301546080850152600583015460a0850152600683015460c0850152600783015460e08501526008909201546001600160a01b0380821661010086015260ff600160a01b83048116610120870152600160a81b9092049091161515610140850152601f5482516301d294a560e51b815267ffffffffffffffff89169481019490945291519395501692633a5294a092602480840193829003018186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610d9957600080fd5b8101908080516040519392919084600160201b821115610db857600080fd5b908301906020820185811115610dcd57600080fd5b8251600160201b811182820188101715610de657600080fd5b82525081516020918201929091019080838360005b83811015610e13578181015183820152602001610dfb565b50505050905090810190601f168015610e405780820380516001836020036101000a031916815260200191505b5060405250508251919e505015610f9657601f548151604080516301d294a560e51b815267ffffffffffffffff9092166004830152516001600160a01b0390921691633a5294a091602480820192600092909190829003018186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ee557600080fd5b8101908080516040519392919084600160201b821115610f0457600080fd5b908301906020820185811115610f1957600080fd5b8251600160201b811182820188101715610f3257600080fd5b82525081516020918201929091019080838360005b83811015610f5f578181015183820152602001610f47565b50505050905090810190601f168015610f8c5780820380516001836020036101000a031916815260200191505b506040525050509b505b80604001519950806080015198508060a001519750806020015160001461115857601f546020820151604080516301d294a560e51b815267ffffffffffffffff9092166004830152516001600160a01b0390921691633a5294a091602480820192600092909190829003018186803b15801561101157600080fd5b505afa158015611025573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561104e57600080fd5b8101908080516040519392919084600160201b82111561106d57600080fd5b90830190602082018581111561108257600080fd5b8251600160201b81118282018810171561109b57600080fd5b82525081516020918201929091019080838360005b838110156110c85781810151838201526020016110b0565b50505050905090810190601f1680156110f55780820380516001836020036101000a031916815260200191505b506040525050509a50611155600a82602001518154811061111257fe5b906000526020600020906009020160030154600a83602001518154811061113557fe5b906000526020600020906009020160050154611f0690919063ffffffff16565b96505b611160611f18565b6101208301516101409093015191975095509093509150505b909192939495969798999a565b600061119133611f38565b90508015610bbd576111c033604051806040016040528060048152602001635345524f60e01b81525083611fec565b610bbd57600080fd5b6017546001600160a01b031633146111e057600080fd5b610bbd600082612015565b6017546001600160a01b0316331461120257600080fd5b602080546001600160a01b0319166001600160a01b0392909216919091179055565b6017546001600160a01b0316331461123b57600080fd5b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b600069d3c21bcecceda1000000601854101561127b575060c86112a0565b600069d3c21bcecceda10000006018548161129257fe5b0490508060020260c8019150505b90565b60006001600160a01b0382166112b7573391505b6112c28383346122a7565b90505b92915050565b60008060608380602001905160408110156112e557600080fd5b815160208301805160405192949293830192919084600160201b82111561130b57600080fd5b90830190602082018581111561132057600080fd5b8251600160201b81118282018810171561133957600080fd5b82525081516020918201929091019080838360005b8381101561136657818101518382015260200161134e565b50505050905090810190601f1680156113935780820380516001836020036101000a031916815260200191505b50604052505050915091506113a98183346122a7565b925050505b919050565b6017546001600160a01b031681565b60065481565b6020546001600160a01b0316611413576040805162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6cae840c8caf60ab1b604482015290519081900360640190fd5b600061141e33611b9f565b90508061142a57600080fd5b600061143533611f38565b9050801561156d57611477604051806040016040528060048152602001635345524f60e01b81525082604051806020016040528060008152506000801b612604565b602080546040516310dcd33b60e01b81523360248201819052604482018790526060600483019081528851606484015288516001600160a01b03909416946310dcd33b948a948a939283926084909201919087019080838360005b838110156114ea5781810151838201526020016114d2565b50505050905090810190601f1680156115175780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050506040513d602081101561156257600080fd5b505161156d57600080fd5b50505050565b60608060008060608060105467ffffffffffffffff8111801561159557600080fd5b506040519080825280602002602001820160405280156115cf57816020015b6115bc61402d565b8152602001906001900390816115b45790505b509050606060105467ffffffffffffffff811180156115ed57600080fd5b50604051908082528060200260200182016040528015611617578160200160208202803683370190505b50905060005b6010548110156117dd57601f546011805461178f926001600160a01b031691633a5294a0918590811061164c57fe5b90600052602060002001546040518263ffffffff1660e01b8152600401808267ffffffffffffffff1667ffffffffffffffff16815260200191505060006040518083038186803b15801561169f57600080fd5b505afa1580156116b3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156116dc57600080fd5b8101908080516040519392919084600160201b8211156116fb57600080fd5b90830190602082018581111561171057600080fd5b8251600160201b81118282018810171561172957600080fd5b82525081516020918201929091019080838360005b8381101561175657818101518382015260200161173e565b50505050905090810190601f1680156117835780820380516001836020036101000a031916815260200191505b50604052505050612649565b83828151811061179b57fe5b6020026020010181905250601281815481106117b357fe5b90600052602060002001548282815181106117ca57fe5b602090810291909101015260010161161d565b50611809611803604051806040016040528060018152602001600b60fa1b815250612649565b8361266e565b81600e54600f5460138080548060200260200160405190810160405280929190818152602001828054801561185d57602002820191906000526020600020905b815481526020019060010190808311611849575b505050505090509650965096509650965050509091929394565b6017546001600160a01b0316331461188e57600080fd5b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b601f546040516349145c9160e01b815260206004820181815284516024840152845160009485946001600160a01b03909116936349145c9193889390928392604490910191908501908083838b5b838110156119165781810151838201526020016118fe565b50505050905090810190601f1680156119435780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561196057600080fd5b505afa158015611974573d6000803e3d6000fd5b505050506040513d602081101561198a57600080fd5b50519050801580159061199e5750600a5481105b6119a757600080fd5b6000908152601660205260409020546001600160a01b031692915050565b601f546040516349145c9160e01b815260206004820181815284516024840152845160009485946001600160a01b03909116936349145c9193889390928392604490910191908501908083838b5b83811015611a2b578181015183820152602001611a13565b50505050905090810190601f168015611a585780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015611a7557600080fd5b505afa158015611a89573d6000803e3d6000fd5b505050506040513d6020811015611a9f57600080fd5b505190508015801590611ab35750600a5481105b9392505050565b601d546001600160a01b03163314611ad157600080fd5b611ad96127b2565b611b06604051806040016040528060048152602001635345524f60e01b815250611b01612991565b6129d1565b611b0f57600080fd5b600e805434019055565b6017546001600160a01b03163314611b3057600080fd5b6001600160a01b038116611b4357600080fd5b6017546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3601780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526009602052604090205490565b600081611bc657600080fd5b6001820391506014548281611bd757fe5b0682036001019050919050565b600060075460001415611bf9575060006112a0565b6000611c0433611b9f565b905062015180600b8281548110611c1757fe5b90600052602060002090600902016007015442031015611c5857600b8181548110611c3e57fe5b9060005260206000209060090201600601549150506112a0565b6000611c8c6005600a8481548110611c6c57fe5b906000526020600020906009020160020154612a1b90919063ffffffff16565b90506000611cc1600a8481548110611ca057fe5b90600052602060002090600902016004015483612a4290919063ffffffff16565b9050600080635f95a100421015611d1557600754600654611ce8908563ffffffff612a1b16565b81611cef57fe5b049150612710611d0685600e63ffffffff612a1b16565b81611d0d57fe5b049050611e00565b600062015180611d2f42635f95a10063ffffffff612a4216565b81611d3657fe5b0460010190506005811115611d49575060055b600a8681548110611d5657fe5b906000526020600020906009020160020154600a8781548110611d7557fe5b90600052602060002090600902016004015410611daf57612710611da086600863ffffffff612a1b16565b81611da757fe5b049150611dce565b612710611dc386600e63ffffffff612a1b16565b81611dca57fe5b0491505b611dfc81600602611df0600754611df088600654612a1b90919063ffffffff16565b9063ffffffff612a5716565b9250505b80821115611e0c578091505b5093506112a092505050565b5090565b60006060611e2983612a79565b905060005b8151811015611ed457600a828281518110611e4557fe5b602002602001015181548110611e5757fe5b906000526020600020906009020160020154600014611e9557611e8c828281518110611e7f57fe5b6020026020010151612b1e565b83019250611ecc565b42600b838381518110611ea457fe5b602002602001015181548110611eb657fe5b9060005260206000209060090201600701819055505b600101611e2e565b50600654611ee8908363ffffffff612a4216565b600655600754611efe908363ffffffff612a4216565b600755505050565b6000828201838110156112c257600080fd5b33600090815260196020908152604080832054601a909252909120549091565b600080611f4483611b9f565b905080611f5057600080fd5b601554600b8281548110611f6057fe5b906000526020600020906009020160010154420311611f7e57600080fd5b600b8181548110611f8b57fe5b90600052602060002090600902016000015491506000600b8281548110611fae57fe5b90600052602060002090600902016000018190555042600b8281548110611fd157fe5b90600052602060002090600902016001018190555050919050565b600061200d848484604051806020016040528060008152506000801b612d33565b949350505050565b600a8054905060096000836001600160a01b03166001600160a01b03168152602001908152602001600020819055508060166000600a80549050815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600a60405180610160016040528084815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001836001600160a01b03168152602001600060ff168152602001600015158152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160080160146101000a81548160ff021916908360ff1602179055506101408201518160080160156101000a81548160ff0219169083151502179055505050600b604051806101200160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070155610100820151816008015550505050565b60006122d1604051806040016040528060048152602001635345524f60e01b815250611b01612991565b1561231d576001600160a01b0383166000908152601960205260409020546122ff908363ffffffff611f0616565b6001600160a01b0384166000908152601960205260409020556123d2565b6123456040518060400160405280600481526020016311d0525360e21b815250611b01612991565b15612391576001600160a01b0383166000908152601a6020526040902054612373908363ffffffff611f0616565b6001600160a01b0384166000908152601a60205260409020556123d2565b6040805162461bcd60e51b815260206004820152601160248201527031bab93932b731bc9034b99032b93937b960791b604482015290519081900360640190fd5b60006123dd84611b9f565b9050806124df57601f546040516349145c9160e01b81526020600482018181528851602484015288516000946001600160a01b0316936349145c91938b93928392604401918501908083838b5b8381101561244257818101518382015260200161242a565b50505050905090810190601f16801561246f5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561248c57600080fd5b505afa1580156124a0573d6000803e3d6000fd5b505050506040513d60208110156124b657600080fd5b5051905080158015906124ca5750600a5481105b6124d357600080fd5b6124dd8186612015565b505b60006124ea85612d89565b9050806124fc57600192505050611ab3565b60185461250f908263ffffffff611f0616565b6018556017546040805180820190915260048152635345524f60e01b6020820152612548916001600160a01b0316906064845b04611fec565b61255157600080fd5b601b546040805180820190915260048152635345524f60e01b6020820152612592916001600160a01b0316906103e861258b85600c612a1b565b8161254257fe5b61259b57600080fd5b601c546040805180820190915260048152635345524f60e01b60208201526125d5916001600160a01b0316906103e861258b856008612a1b565b6125de57600080fd5b600680546064600384020483030190556125f88282612f0e565b50600195945050505050565b60408051608080825260a08201909252606091602082018180368337019050509050848152836020820152826040820152816060820152600454608082a15050505050565b61265161402d565b506040805180820190915281518152602082810190820152919050565b606081516000141561268f57506040805160208101909152600081526112c5565b815183516000199091010260005b83518110156126cb578381815181106126b257fe5b602090810291909101015151919091019060010161269d565b5060608167ffffffffffffffff811180156126e557600080fd5b506040519080825280601f01601f191660200182016040528015612710576020820181803683370190505b5090506020810160005b85518110156127a75761275c8287838151811061273357fe5b60200260200101516020015188848151811061274b57fe5b6020026020010151600001516135f1565b85818151811061276857fe5b60200260200101516000015182019150600186510381101561279f5761279782886020015189600001516135f1565b865191909101905b60010161271a565b509095945050505050565b42600855600e54600f55600d54158015906127cf57506000600e54115b1561298157600d546010556000805b600d5481101561287e57600a600c82815481106127f757fe5b90600052602060002001548154811061280c57fe5b9060005260206000209060090201600701546013828154811061282b57fe5b9060005260206000200181905550600a600c828154811061284857fe5b90600052602060002001548154811061285d57fe5b600091825260209091206007600990920201015491909101906001016127de565b50600080805b600d5481101561296d57600c818154811061289b57fe5b906000526020600020015491506128df84611df0600a85815481106128bc57fe5b906000526020600020906009020160070154600e54612a1b90919063ffffffff16565b925081601182815481106128ef57fe5b9060005260206000200181905550826012828154811061290b57fe5b906000526020600020018190555061294783600b848154811061292a57fe5b60009182526020909120600990910201549063ffffffff611f0616565b600b838154811061295457fe5b6000918252602090912060099091020155600101612884565b50506000600d819055600e555061298f9050565b6010541561298f5760006010555b565b6040805160208082528183019092526060918291906020820181803683370190505090506000600354602083a15080516129ca8161362f565b9250505090565b6000825160001480156129e357508151155b156129f0575060016112c5565b8151835114612a01575060006112c5565b612a0a8261375c565b612a138461375c565b1490506112c5565b600082612a2a575060006112c5565b82820282848281612a3757fe5b04146112c257600080fd5b600082821115612a5157600080fd5b50900390565b6000808211612a6557600080fd5b6000828481612a7057fe5b04949350505050565b6014546060906000612a8a84611bba565b600a546014549192509082011115612aa557600a5481900391505b8167ffffffffffffffff81118015612abc57600080fd5b50604051908082528060200260200182016040528015612ae6578160200160208202803683370190505b50925060005b82811015612b1657808201848281518110612b0357fe5b6020908102919091010152600101612aec565b505050919050565b600080612b336005600a8581548110611c6c57fe5b90506000612b47600a8581548110611ca057fe5b9050600080635f95a100421015612b9b57600754600654612b6e908563ffffffff612a1b16565b81612b7557fe5b049150612710612b8c85600e63ffffffff612a1b16565b81612b9357fe5b049050612c7a565b600062015180612bb542635f95a10063ffffffff612a4216565b81612bbc57fe5b0460010190506005811115612bcf575060055b600a8781548110612bdc57fe5b906000526020600020906009020160020154600a8881548110612bfb57fe5b90600052602060002090600902016004015410612c3557612710612c2686600863ffffffff612a1b16565b81612c2d57fe5b049150612c54565b612710612c4986600e63ffffffff612a1b16565b81612c5057fe5b0491505b612c7681600602611df0600754611df088600654612a1b90919063ffffffff16565b9250505b80821115612c86578091505b612c908683613763565b915042600b8781548110612ca057fe5b906000526020600020906009020160070181905550612ce682600b8881548110612cc657fe5b906000526020600020906009020160020154611f0690919063ffffffff16565b600b8781548110612cf357fe5b90600052602060002090600902016002018190555081600b8781548110612d1657fe5b600091825260209091206009909102016006015550949350505050565b6040805160a080825260c082019092526000916060919060208201818036833701905050905086815285602082015284604082015283606082015282608082015260025460a082a1608001519695505050505050565b6001600160a01b0381166000908152601a60205260408120541580612dc457506001600160a01b038216600090815260196020526040902054155b15612dd1575060006113ae565b6000612ddb61125d565b6001600160a01b038416600090815260196020526040812054919250828281612e0057fe5b6001600160a01b0387166000908152601a60205260409020549190049150811115612e5257506001600160a01b0384166000908152601a6020526040902054612e4f818463ffffffff612a1b16565b91505b6001600160a01b038516600090815260196020526040902054612e7b908363ffffffff612a4216565b6001600160a01b038616600090815260196020908152604080832093909355601a90522054612eb0908263ffffffff612a4216565b6001600160a01b038087166000908152601a602090815260409182902093909355601e548151808301909252600482526311d0525360e21b93820193909352612efd929091169083611fec565b612f0657600080fd5b509392505050565b612f1f81600a8481548110612cc657fe5b600a8381548110612f2c57fe5b906000526020600020906009020160020181905550612f7281600a8481548110612f5257fe5b906000526020600020906009020160030154611f0690919063ffffffff16565b600a8381548110612f7f57fe5b906000526020600020906009020160030181905550690a968163f0a57b4000008110612fdd576001600a8381548110612fb457fe5b906000526020600020906009020160080160156101000a81548160ff0219169083151502179055505b6000600a8381548110612fec57fe5b9060005260206000209060090201600001549050806000146130e2576008546000828152600560205260409020541161305f5781600a828154811061302d57fe5b9060005260206000209060090201600701819055504260056000838152602001908152602001600020819055506130b3565b61309082600a838154811061307057fe5b906000526020600020906009020160070154611f0690919063ffffffff16565b600a828154811061309d57fe5b9060005260206000209060090201600701819055505b600a81815481106130c057fe5b9060005260206000209060090201600201546000146130e2576130e2816139a5565b826000835b831561350e57600a83815481106130fa57fe5b90600052602060002090600902016006015460001461316b57613144600a848154811061312357fe5b90600052602060002090600902016006015482611f0690919063ffffffff16565b90506000600a848154811061315557fe5b9060005260206000209060090201600601819055505b61012c8214801561319b5750600a848154811061318457fe5b906000526020600020906009020160000154600014155b156131f8576131d181600a86815481106131b157fe5b906000526020600020906009020160060154611f0690919063ffffffff16565b600a85815481106131de57fe5b90600052602060002090600902016006018190555061350e565b61320981600a868154811061113557fe5b600a858154811061321657fe5b906000526020600020906009020160050181905550600a848154811061323857fe5b9060005260206000209060090201600101546000141561327a5782600a858154811061326057fe5b9060005260206000209060090201600101819055506134de565b6000600a858154811061328957fe5b906000526020600020906009020160010154905060006132ce600a83815481106132af57fe5b906000526020600020906009020160030154600a848154811061113557fe5b90506000613301600a87815481106132e257fe5b906000526020600020906009020160030154600a888154811061113557fe5b905085600a888154811061331157fe5b9060005260206000209060090201600101541415801561333057508181115b1561335c5785600a888154811061334357fe5b9060005260206000209060090201600101819055508091505b600061339d83613391600a8b8154811061337257fe5b906000526020600020906009020160060154600a8c8154811061113557fe5b9063ffffffff612a4216565b9050600069a968163f0a57b400000084101580156133c657506a0152d02c7e14af680000008210155b156133d35750600461346a565b6954b40b1f852bda00000084101580156133f7575069a968163f0a57b40000008210155b156134045750600361346a565b692a5a058fc295ed000000841015801561342857506954b40b1f852bda0000008210155b156134355750600261346a565b69152d02c7e14af680000084101580156134595750692a5a058fc295ed0000008210155b156134665750600161346a565b5060005b600a898154811061347757fe5b600091825260209091206008600990920201015460ff600160a01b909104811690821611156134d85780600a8a815481106134ae57fe5b906000526020600020906009020160080160146101000a81548160ff021916908360ff1602179055505b50505050505b818060010192505083600a85815481106134f457fe5b6000918252602090912060099091020154945092506130e7565b6000613538600a888154811061352057fe5b90600052602060002090600902016000015487613b35565b81019050613564600a888154811061354c57fe5b90600052602060002090600902016000015487613c16565b81019050613590600a888154811061357857fe5b90600052602060002090600902016000015487613dd2565b6006549101906135a6908263ffffffff612a4216565b60065560006135bc87600563ffffffff612a1b16565b90506135ce818363ffffffff612a4216565b6007549091506135e4908263ffffffff611f0616565b6007555050505050505050565b5b60208110613611578151835260209283019290910190601f19016135f2565b905182516020929092036101000a6000190180199091169116179052565b604080516020808252818301909252606091600091839160208201818036833701905050905060005b60208110156136be576008810260020a85026001600160f81b03198116156136a9578083858151811061368757fe5b60200101906001600160f81b031916908160001a9053506001909301926136b5565b83156136b557506136be565b50600101613658565b5060608267ffffffffffffffff811180156136d857600080fd5b506040519080825280601f01601f191660200182016040528015613703576020820181803683370190505b50905060005b838110156137535782818151811061371d57fe5b602001015160f81c60f81b82828151811061373457fe5b60200101906001600160f81b031916908160001a905350600101613709565b50949350505050565b6020015190565b6000806137786005600a8681548110611c6c57fe5b9050806137ac600a868154811061378b57fe5b90600052602060002090600902016004015485611f0690919063ffffffff16565b11156137e6576137e3600a85815481106137c257fe5b90600052602060002090600902016004015482612a4290919063ffffffff16565b92505b61381783600a86815481106137f757fe5b906000526020600020906009020160040154611f0690919063ffffffff16565b600a858154811061382457fe5b90600052602060002090600902016004018190555080600a858154811061384757fe5b9060005260206000209060090201600401541061396e576000600a858154811061386d57fe5b9060005260206000209060090201600201819055506000600a858154811061389157fe5b9060005260206000209060090201600401819055506000600a85815481106138b557fe5b906000526020600020906009020160080160156101000a81548160ff0219169083151502179055506000600b85815481106138ec57fe5b9060005260206000209060090201600201819055506000600b858154811061391057fe5b9060005260206000209060090201600301819055506000600b858154811061393457fe5b9060005260206000209060090201600401819055506000600b858154811061395857fe5b9060005260206000209060090201600501819055505b61397f83600b868154811061292a57fe5b600b858154811061398c57fe5b6000918252602090912060099091020155509092915050565b600d546139d4576001600d8190555080600c6000815481106139c357fe5b600091825260209091200155610bbd565b6000805b600d54811015613a8657600c81815481106139ef57fe5b9060005260206000200154831415613a08575050610bbd565b600a600c8381548110613a1757fe5b906000526020600020015481548110613a2c57fe5b906000526020600020906009020160070154600a600c8381548110613a4d57fe5b906000526020600020015481548110613a6257fe5b9060005260206000209060090201600701541015613a7e578091505b6001016139d8565b50600a600d541015613abc5781600c600d5481548110613aa257fe5b600091825260209091200155600d80546001019055610be4565b600a600c8281548110613acb57fe5b906000526020600020015481548110613ae057fe5b906000526020600020906009020160070154600a8381548110613aff57fe5b9060005260206000209060090201600701541115610be45781600c8281548110613b2557fe5b6000918252602090912001555050565b600082613b44575060006112c5565b6000613b528484600a613edc565b810190506000600a8581548110613b6557fe5b906000526020600020906009020160000154905060008114612f0657613b8d81856008613edc565b820191506000600390506000600a8381548110613ba657fe5b90600052602060002090600902016000015490505b8015801590613bcb575060098211155b15613c0c57613bdc81876001613edc565b84019350600a8181548110613bed57fe5b9060005260206000209060090201600001549050600182019150613bbb565b5050509392505050565b600082613c25575060006112c5565b6000805b8415801590613c39575061012c82105b8015613c455750600c81105b15613dca57600a8581548110613c5757fe5b6000918252602090912060099091020160080154600160a01b900460ff161580613c9f5750600a8581548110613c8957fe5b9060005260206000209060090201600201546000145b15613ccf57600a8581548110613cb157fe5b60009182526020909120600990910201549450600190910190613c29565b6000600a8681548110613cde57fe5b906000526020600020906009020160080160149054906101000a900460ff1660030260ff169050818111613d3857600a8681548110613d1957fe5b6000918252602090912060099091020154955050600190910190613c29565b90810360006064613d4f878463ffffffff612a1b16565b81613d5657fe5b049050613d638782613763565b9050613d7681600b89815481106137f757fe5b600b8881548110613d8357fe5b9060005260206000209060090201600401819055508085019450600a8781548110613daa57fe5b600091825260209091206009909102015496505060019092019150613c29565b505092915050565b600082613de1575060006112c5565b60005b8315801590613e1c5750600a8481548110613dfb57fe5b906000526020600020906009020160080160159054906101000a900460ff16155b8015613e29575061012c81105b15613e5657600a8481548110613e3b57fe5b60009182526020909120600990910201549350600101613de4565b8315801590613e8d5750600a8481548110613e6d57fe5b906000526020600020906009020160080160159054906101000a900460ff165b15613ed557613e9f8460148504613763565b9150613eb282600b868154811061113557fe5b600b8581548110613ebf57fe5b9060005260206000209060090201600501819055505b5092915050565b6000600a8481548110613eeb57fe5b90600052602060002090600902016002015460001415613f0d57506000611ab3565b60006064613f21858563ffffffff612a1b16565b81613f2857fe5b049050613f358582613763565b9050613f4881600b8781548110612f5257fe5b600b8681548110613f5557fe5b6000918252602090912060099091020160030155949350505050565b8260028101928215613fb9579160200282015b82811115613fb957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613f84565b50611e18929150614047565b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600060ff1681526020016000151581525090565b604051806040016040528060008152602001600081525090565b6112a091905b80821115611e185780546001600160a01b031916815560010161404d56fea264697066735822122064aed3deec023430e43dd8e4149ece36a280ed65456558cefdce053c16c15e8664736f6c634300060a0033\")\n\tdata6= common.Hex2Bytes(\"6080604052600436106100c45763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630775361581146100c95780630a8b7826146100de5780632ca9a7c1146100f1578063370158ea146101065780633ccfd60b14610135578063672d7a0d1461014a57806383b4918b1461016a5780638da5cb5b1461018a5780638f35a75e146101ac578063a19556d4146101d9578063c43ed2c814610206578063e7cf3d1314610226578063f2fde38b14610246575b600080fd5b6100dc6100d7366004613802565b610266565b005b6100dc6100ec366004613889565b610370565b3480156100fd57600080fd5b506100dc61037d565b34801561011257600080fd5b5061011b6104ba565b60405161012c959493929190613b6f565b60405180910390f35b34801561014157600080fd5b506100dc6106db565b34801561015657600080fd5b506100dc6101653660046137e4565b6108d0565b34801561017657600080fd5b506100dc6101853660046138f3565b610a72565b34801561019657600080fd5b5061019f610b53565b60405161012c9190613b3f565b3480156101b857600080fd5b506101cc6101c73660046137e4565b610b62565b60405161012c9190613b5e565b3480156101e557600080fd5b506101f96101f4366004613889565b610d6d565b60405161012c9190613b4d565b34801561021257600080fd5b506100dc610221366004613889565b61172f565b34801561023257600080fd5b506100dc610241366004613854565b611777565b34801561025257600080fd5b506100dc6102613660046137e4565b6117d8565b6000806007546000148061027b575060075442105b151561028657600080fd5b6102b660408051908101604052806004815260200160e060020a635345524f028152506102b161186c565b6118ad565b15156102c157600080fd5b678ac7230489e800003410156102d657600080fd5b600160a060020a0384166000908152600960205260409020549150811515610342576103128360206040519081016040528060008152506118ad565b1561031c57600080fd5b61032684846118f9565b600160a060020a03841660009081526009602052604090205491505b600880548390811061035057fe5b90600052602060002090600d0201905061036a8134611e06565b50505050565b61037a3382610266565b50565b6000806000806000806000600754600014151561039957600080fd5b3360009081526009602052604090205496508615156103b757600080fd5b6103bf612037565b600d5415806103ce5750600e54155b156103d8576104b1565b8693505b6008546011546103ee91908901612077565b841080156103fc5750600754155b1561048457600880548590811061040f57fe5b90600052602060002090600d0201925061042d836006015442612088565b158015610441575082600301548360020154115b156104795761044f8361209d565b9092509050610464868363ffffffff61223016565b9550610476858263ffffffff61223016565b94505b6001909301926103dc565b601354610497908663ffffffff61223016565b601355600f546104ad908763ffffffff61224d16565b600f555b50505050505050565b600080600080606080606080600060075460001415156106ad576104de600a612264565b9250825160405190808252806020026020018201604052801561051b57816020015b6105086134c5565b8152602001906001900390816105005790505b509150600090505b825181101561060e5760055483516105ee91600160a060020a031690633a5294a09086908590811061055157fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016105939190613bb6565b600060405180830381600087803b1580156105ad57600080fd5b505af11580156105c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105e991908101906138be565b6122c0565b82828151811015156105fc57fe5b60209081029091010152600101610523565b61065561064f6040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506122c0565b836122e6565b935060075461069460135461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b9063ffffffff61224d16565b60125460088054905087985098509850985098506106d0565b601254600854604080516020810190915260008082529b508b9a50919850965094505b505050509091929394565b336000908152600960205260408120549080808080808615156106fd57600080fd5b600880548890811061070b57fe5b90600052602060002090600d0201955085600901549450600754600014158015610736575060075442115b156107de5761076960135461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b935061077c600a8863ffffffff61246516565b9250925082801561078d5750600082115b156107de576107cb6107be6107a2600a6124c8565b6107b2878663ffffffff6124fe16565b9063ffffffff61252c16565b869063ffffffff61223016565b94506107de600a8863ffffffff61254f16565b60098601546013546107f59163ffffffff61224d16565b60135560006009870155600c8601541515610844576108343360408051908101604052806004815260200160e060020a635345524f02815250876125a4565b151561083f57600080fd5b6104b1565b5060005b600c8601548110156104b1576108bd86600c018281548110151561086857fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600c890154600160a060020a0390911691906108b890899063ffffffff61252c16565b6125a4565b15156108c857600080fd5b600101610848565b60008054600160a060020a031633146108e857600080fd5b5060088054600160a060020a038316600090815260096020908152604080832084905580516101a081018252848152808301849052808201849052606081018490526080810184905260a081018490524260c0820181905260e0820185905261010082015261012081018490528151848152928301909152929392916101408301919050815260408051602081810183526000808352818501929092528251828152908101835291909201915090528154600181810180855560009485526020948590208451600d90940201928355848401519183019190915560408301516002830155606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e083015160078301556101008301516008830155610120830151600983015561014083015180519194610a3092600a850192909101906134dc565b506101608201518051610a4d91600b840191602090910190613527565b506101808201518051610a6a91600c840191602090910190613594565b505050505050565b60008082678ac7230489e80000111580610a8a575082155b1515610a9557600080fd5b60075415610aa257600080fd5b336000908152600960205260409020549150811515610ac057600080fd5b6008805483908110610ace57fe5b90600052602060002090600d020190508260001415610b035760098101549250678ac7230489e80000831015610b0357600080fd5b6009810154831115610b1457600080fd5b6009810154610b29908463ffffffff61224d16565b6009820155601354610b41908463ffffffff61224d16565b601355610b4e8184611e06565b505050565b600054600160a060020a031681565b610b6a613602565b600160a060020a0382166000908152600960205260409020548015610d67576008805482908110610b9757fe5b90600052602060002090600d02016101a0604051908101604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201805480602002602001604051908101604052809291908181526020018280548015610c6557602002820191906000526020600020905b815481526020019060010190808311610c51575b5050509183525050600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015610cf95780601f10610cce57610100808354040283529160200191610cf9565b820191906000526020600020905b815481529060010190602001808311610cdc57829003601f168201915b50505050508152602001600c8201805480602002602001604051908101604052809291908181526020018280548015610d5b57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610d3d575b50505050508152505091505b50919050565b33600090815260096020526040812054606091908190839082908190819081901515610d9857611723565b33600090815260096020526040902054600880549091908110610db757fe5b90600052602060002090600d02019650610de18960206040519081016040528060008152506118ad565b1515610f08576005546040517f49145c91000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906349145c9190610e30908c90600401613b4d565b602060405180830381600087803b158015610e4a57600080fd5b505af1158015610e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e829190810190613911565b9550600086118015610e95575060085486105b1515610ea057600080fd5b6008805487908110610eae57fe5b90600052602060002090600d020196505b336000908152600960205260409020548614610f0857851515610ee157611723565b6008805487908110610eef57fe5b90600052602060002090600d0201600101549550610ebf565b610f10612037565b60408051600b808252610180820190925290816020015b6060815260200190600190039081610f27575050604080518082018252600a81527f2273656c66436f6465220000000000000000000000000000000000000000000060208201526005548a54925160e560020a6301d294a5028152939850611004939192600160a060020a0390911691633a5294a091610fa991600401613bb6565b600060405180830381600087803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fff91908101906138be565b6125cf565b85600081518110151561101357fe5b9060200190602002018190525061112f6040805190810160405280600c81526020017f22706172656e74436f646522000000000000000000000000000000000000000081525088600101546000146110f65760055460018a015460405160e560020a6301d294a5028152600160a060020a0390921691633a5294a09161109b91600401613bb6565b600060405180830381600087803b1580156110b557600080fd5b505af11580156110c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110f191908101906138be565b610fff565b60408051808201909152600281527f222200000000000000000000000000000000000000000000000000000000000060208201526125cf565b85600181518110151561113e57fe5b9060200190602002018190525061118e6040805190810160405280600781526020017f2276616c7565220000000000000000000000000000000000000000000000000081525088600201546127b6565b85600281518110151561119d57fe5b906020019060200201819052506111ed6040805190810160405280600d81526020017f2272657475726e56616c7565220000000000000000000000000000000000000081525088600301546127b6565b8560038151811015156111fc57fe5b9060200190602002018190525061124c6040805190810160405280601481526020017f22746f74616c41796e616d69635265776172642200000000000000000000000081525088600401546127b6565b85600481518110151561125b57fe5b6020908102909101015260098701546007549094501580159061127f575060075442115b1561131d576112b260135461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b336000908152600960205260409020549093506112d790600a9063ffffffff61246516565b915091508180156112e85750600081115b1561131d5761131a61130d6112fd600a6124c8565b6107b2868563ffffffff6124fe16565b859063ffffffff61223016565b93505b61135c6040805190810160405280600d81526020017f2263616e57697468647261772200000000000000000000000000000000000000815250856127b6565b85600581518110151561136b57fe5b6020908102909101015260068701546113849042612088565b156113ea576113cc6040805190810160405280600e81526020017f227374617469635265776172642200000000000000000000000000000000000081525088600501546127b6565b8560068151811015156113db57fe5b60209081029091010152611466565b61144c6040805190810160405280600e81526020017f2273746174696352657761726422000000000000000000000000000000000000815250611447896114428b600301548c6002015461224d90919063ffffffff16565b61287d565b6127b6565b85600681518110151561145b57fe5b602090810290910101525b611474876008015442612088565b156114da576114bc6040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525088600701546127b6565b8560078151811015156114cb57fe5b60209081029091010152611534565b61151a6040805190810160405280600f81526020017f2264796e616d696352657761726422000000000000000000000000000000000081525060006127b6565b85600781518110151561152957fe5b602090810290910101525b6115776040805190810160405280601181526020017f2273746174696354696d657374616d702200000000000000000000000000000081525088600601546127b6565b85600881518110151561158657fe5b6020908102909101810191909152604080518082018252600c81527f226368696c6473436f646522000000000000000000000000000000000000000081840152600b8a0180548351601f6002600019610100600186161502019093169290920491820186900486028101860190945280845261165a949293928301828280156116505780601f1061162557610100808354040283529160200191611650565b820191906000526020600020905b81548152906001019060200180831161163357829003601f168201915b50505050506125cf565b85600981518110151561166957fe5b6020908102909101810191909152604080518082018252600881527f2276616c7565732200000000000000000000000000000000000000000000000081840152600a8a0180548351818602810186019094528084526116fe949293928301828280156116f457602002820191906000526020600020905b8154815260200190600101908083116116e0575b505050505061291d565b85600a81518110151561170d57fe5b6020908102909101015261172085612b56565b97505b50505050505050919050565b600080548190600160a060020a0316331415610b4e57505080517fa6cb2bbe89e8b5f0c4e2d557b612ed99f5573b419fd9b304b87129514ccc35b390602001818184a1505050565b6000806000835111151561178a57600080fd5b3360009081526009602052604090205491508115610b4e5760088054839081106117b057fe5b90600052602060002090600d020190508281600c01908051906020019061036a929190613594565b600054600160a060020a031633146117ef57600080fd5b600160a060020a038116151561180457600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080516020808252818301909252606091829160009180820161040080388339019050509150600454602083a15080516118a681612cbe565b9250505090565b6000825160001480156118bf57508151155b156118cc575060016118f3565b81518351146118dd575060006118f3565b6118e682612e3f565b6118ef84612e3f565b1490505b92915050565b6005546040517f49145c9100000000000000000000000000000000000000000000000000000000815260009182918291600160a060020a0316906349145c9190611947908790600401613b4d565b602060405180830381600087803b15801561196157600080fd5b505af1158015611975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506119999190810190613911565b92506000831180156119ac575060085483105b15156119b757600080fd5b60088054849081106119c557fe5b60009182526020808320600854604080518085018252958652600d94909402909101600b81018054855160026001831615610100026000190190921691909104601f8101869004860282018601909652858152919750919550611a8094939092830182828015611a765780601f10611a4b57610100808354040283529160200191611a76565b820191906000526020600020905b815481529060010190602001808311611a5957829003601f168201915b50505050506118ad565b15611b2a5760055460405160e560020a6301d294a5028152600160a060020a0390911690633a5294a090611ab8908490600401613bb6565b600060405180830381600087803b158015611ad257600080fd5b505af1158015611ae6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b0e91908101906138be565b8051611b2491600b850191602090910190613527565b50611c5c565b600b8201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152611c4493611c0f936105e993611bcc939291830182828015611bc25780601f10611b9757610100808354040283529160200191611bc2565b820191906000526020600020905b815481529060010190602001808311611ba557829003601f168201915b50505050506122c0565b611c0a6040805190810160405280600181526020017f20000000000000000000000000000000000000000000000000000000000000008152506122c0565b612e46565b60055460405160e560020a6301d294a5028152611c0a91600160a060020a031690633a5294a090610593908790600401613bb6565b8051611c5a91600b850191602090910190613527565b505b806009600087600160a060020a0316600160a060020a031681526020019081526020016000208190555060086101a0604051908101604052808381526020018581526020016000815260200160008152602001600081526020016000815260200142815260200160008152602001428152602001600081526020016000604051908082528060200260200182016040528015611d02578160200160208202803883390190505b5081526040805160208082018352600080835281850192909252825182815280820184529383019390935284546001808201808855968352918490208551600d909202019081558484015191810191909155908301516002820155606083015160038201556080830151600482015560a0830151600582015560c0830151600682015560e083015160078201556101008301516008820155610120830151600982015561014083015180519192611dc192600a850192909101906134dc565b506101608201518051611dde91600b840191602090910190613527565b506101808201518051611dfb91600c840191602090910190613594565b505050505050505050565b600080600080611e14612037565b600054604080518082019091526004815260e060020a635345524f026020820152611e5491600160a060020a0316906108b888603263ffffffff61252c16565b1515611e5f57600080fd5b600654611e77906107b287601963ffffffff61252c16565b9350600092505b600654831015611eed57611ed7600684815481101515611e9a57fe5b60009182526020918290200154604080518082019091526004815260e060020a635345524f0292810192909252600160a060020a031690866125a4565b1515611ee257600080fd5b600190920191611e7e565b611f12611f0186600363ffffffff6124fe16565b60028801549063ffffffff61223016565b6002870155600186015460001015611fe7575084905060005b600182015415801590611f3e5750601481105b15611fe75760088260010154815481101515611f5657fe5b90600052602060002090600d020191508082600a01805490501415611f9457600a820180546001810182556000918252602090912001859055611fdf565b611fc28583600a0183815481101515611fa957fe5b906000526020600020015461223090919063ffffffff16565b600a8301805483908110611fd257fe5b6000918252602090912001555b600101611f2b565b61200a611ffb86600363ffffffff6124fe16565b600f549063ffffffff61223016565b600f55855461202290600a908763ffffffff612ebd16565b60075415610a6a576000600755505050505050565b61204342601054612088565b15156120755761206760c86107b2600361205b61307c565b9063ffffffff6124fe16565b600e55600f54600d55426010555b565b600081831015610d675750816118f3565b610e1060189283900481900492909104041490565b6000806000806000806000806120cd896120c88b600301548c6002015461224d90919063ffffffff16565b6130bc565b9550955085156120dc57612225565b84935060008960010154111561221e57600889600101548154811015156120ff57fe5b90600052602060002090600d0201915061211b82866000613221565b9096509250851561213157848497509750612225565b612141848463ffffffff61223016565b9350600190505b60018201541580159061215b5750601481105b80156121675750600754155b1561221e576008826001015481548110151561217f57fe5b90600052602060002090600d02019150806121c969021e19e0c9bab240000084600a0160008154811015156121b057fe5b906000526020600020015461252c90919063ffffffff16565b1180156121dd575081600201548260030154105b15612216576121ed828683613221565b9096509250851561220357848497509750612225565b612213848463ffffffff61223016565b93505b600101612148565b8484975097505b505050505050915091565b60008282018381101561224257600080fd5b8091505b5092915050565b6000808383111561225d57600080fd5b5050900390565b6060816000018054806020026020016040519081016040528092919081815260200182805480156122b457602002820191906000526020600020905b8154815260200190600101908083116122a0575b50505050509050919050565b6122c86134c5565b50604080518082019091528151815260209182019181019190915290565b60606000806060600085516000141561230f576040805160208101909152600081529450612424565b60018651038760000151029350600092505b855183101561235357858381518110151561233857fe5b60209081029091010151519390930192600190920191612321565b836040519080825280601f01601f191660200182016040528015612381578160200160208202803883390190505b5060009350915050602081015b8551831015612420576123d58187858151811015156123a957fe5b906020019060200201516020015188868151811015156123c557fe5b602090810290910101515161331e565b85838151811015156123e357fe5b602090810290910101515186519101906000190183101561241557612411818860200151896000015161331e565b8651015b60019092019161238e565b8194505b5050505092915050565b6040805160208082528183019092526000916060919080820161040080388339019050509050828152600254602082a15192915050565b600080805b84548110156124c0578454849086908390811061248357fe5b906000526020600020015414156124b85760028501805460019450829081106124a857fe5b9060005260206000200154820191505b60010161246a565b509250929050565b6000805b8254811015610d6757600283018054829081106124e557fe5b60009182526020909120015491909101906001016124cc565b6000808315156125115760009150612246565b5082820282848281151561252157fe5b041461224257600080fd5b60008080831161253b57600080fd5b828481151561254657fe5b04949350505050565b60005b8254811015610b4e578254829084908390811061256b57fe5b9060005260206000200154141561259c576000836002018281548110151561258f57fe5b6000918252602090912001555b600101612552565b60006125c784848460206040519081016040528060008152506000600102613362565b949350505050565b604080516002808252606082810190935282918291816020015b6125f16134c5565b8152602001906001900390816125e957905050915061260f856122c0565b82600081518110151561261e57fe5b602090810290910101526040805160038082526080820190925290816020015b6126466134c5565b81526020019060019003908161263e5790505090506126996040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506122c0565b8160008151811015156126a857fe5b602090810290910101526126bb846122c0565b8160018151811015156126ca57fe5b906020019060200201819052506127156040805190810160405280600181526020017f22000000000000000000000000000000000000000000000000000000000000008152506122c0565b81600281518110151561272457fe5b906020019060200201819052506127506105e961064f60206040519081016040528060008152506122c0565b82600181518110151561275f57fe5b906020019060200201819052506127ad61064f6040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506122c0565b95945050505050565b6040805160028082526060828101909352829190816020015b6127d76134c5565b8152602001906001900390816127cf5790505090506127f5846122c0565b81600081518110151561280457fe5b6020908102909101015261281a6105e9846133ba565b81600181518110151561282957fe5b906020019060200201819052506125c76128776040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506122c0565b826122e6565b6000600e54600014806128905750600d54155b8061289c575060075415155b156128a9575060006118f3565b6128d9826128d4600d546107b2600e5461205b89600301548a6002015461224d90919063ffffffff16565b612077565b905082600201546128f784600301548361223090919063ffffffff16565b11156118f357600383015460028401546129169163ffffffff61224d16565b9392505050565b6060806000606080855160405190808252806020026020018201604052801561296057816020015b61294d6134c5565b8152602001906001900390816129455790505b509350600092505b85518310156129b7576129946105e9878581518110151561298557fe5b906020019060200201516133ba565b84848151811015156129a257fe5b60209081029091010152600190920191612968565b612a426129f86040805190810160405280600181526020017f5b000000000000000000000000000000000000000000000000000000000000008152506122c0565b611c0a6105e9612a3c6040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506122c0565b886122e6565b9150612a8e612a50836122c0565b611c0a6040805190810160405280600181526020017f5d000000000000000000000000000000000000000000000000000000000000008152506122c0565b60408051600280825260608201909252919350816020015b612aae6134c5565b815260200190600190039081612aa6579050509050612acc876122c0565b816000815181101515612adb57fe5b60209081029091010152612aee826122c0565b816001815181101515612afd57fe5b90602001906020020181905250612b4b6128776040805190810160405280600181526020017f3a000000000000000000000000000000000000000000000000000000000000008152506122c0565b979650505050505050565b60608060008351604051908082528060200260200182016040528015612b9657816020015b612b836134c5565b815260200190600190039081612b7b5790505b509150600090505b8351811015612be757612bc78482815181101515612bb857fe5b906020019060200201516122c0565b8282815181101515612bd557fe5b60209081029091010152600101612b9e565b612c72612c286040805190810160405280600181526020017f7b000000000000000000000000000000000000000000000000000000000000008152506122c0565b611c0a6105e9612c6c6040805190810160405280600181526020017f2c000000000000000000000000000000000000000000000000000000000000008152506122c0565b866122e6565b92506125c7612c80846122c0565b611c0a6040805190810160405280600181526020017f7d000000000000000000000000000000000000000000000000000000000000008152506122c0565b60408051602080825281830190925260609160009183918391829184919080820161040080388339019050509350600092505b6020831015612d8d576008830260020a870291507fff00000000000000000000000000000000000000000000000000000000000000821615612d7757818486815181101515612d3c57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190940193612d82565b8415612d8257612d8d565b600190920191612cf1565b846040519080825280601f01601f191660200182016040528015612dbb578160200160208202803883390190505b509050600092505b84831015612e35578383815181101515612dd957fe5b90602001015160f860020a900460f860020a028184815181101515612dfa57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190920191612dc3565b9695505050505050565b6020015190565b606080600083600001518560000151016040519080825280601f01601f191660200182016040528015612e83578160200160208202803883390190505b509150602082019050612e9f818660200151876000015161331e565b845160208501518551612eb5928401919061331e565b509392505050565b8254600090819081908190600a1415612fac576001870180546000908110612ee157fe5b90600052602060002001549250600191505b8654821015612f4b57828760010183815481101515612f0e57fe5b90600052602060002001541015612f405760018701805483908110612f2f57fe5b906000526020600020015492508193505b600190910190612ef3565b86548690889086908110612f5b57fe5b9060005260206000200181905550428760010185815481101515612f7b57fe5b9060005260206000200181905550848760020185815481101515612f9b57fe5b6000918252602090912001556104b1565b600091505b865482101561302c5786548690889084908110612fca57fe5b9060005260206000200154141561302157428760010183815481101515612fed57fe5b906000526020600020018190555084876002018381548110151561300d57fe5b60009182526020909120015550600161302c565b600190910190612fb1565b8015156104b1575050845460018082018755600087815260208082209093019690965580870180548083018255908752828720429101556002909601805496870181558552909320909301555050565b60006130b66012546106886013546106883461068860408051908101604052806004815260200160e060020a635345524f0281525061242e565b90505b90565b6000806000806130ca612075565b600754156130df576001935060009250613218565b4260068701556130ef868661287d565b92508286600501819055506000866001015411156131e3575084905060005b6001820154158015906131215750601481105b156131e3576008826001015481548110151561313957fe5b90600052602060002090600d020191508282600a018281548110151561315b57fe5b906000526020600020015411156131bb5761319a8383600a018381548110151561318157fe5b906000526020600020015461224d90919063ffffffff16565b600a83018054839081106131aa57fe5b6000918252602090912001556131db565b600082600a01828154811015156131ce57fe5b6000918252602090912001555b60010161310e565b60098601546131f8908463ffffffff61223016565b60098701556003860154613212908463ffffffff61223016565b60038701555b50509250929050565b60008061322c612075565b600754156132405750600190506000613316565b69152d02c7e14af680000061326b60036107b28860030154896002015461224d90919063ffffffff16565b10613277575082613284565b613281858561287d565b90505b60008311156132a15761329e81600a63ffffffff61252c16565b90505b6132af856008015442612088565b156132d35760078501546132c9908263ffffffff61223016565b60078601556132e1565b600785018190554260088601555b60098501546132f6908263ffffffff61223016565b60098601556004850154613310908263ffffffff61223016565b60048601555b935093915050565b60005b60208210613343578251845260209384019390920191601f1990910190613321565b50905182516020929092036101000a6000190180199091169116179052565b6040805160a080825260c0820190925260009160609190602082016114008038833901905050905086815285602082015284604082015283606082015282608082015260035460a082a1608001519695505050505050565b606060008082818515156134035760408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015294506134bc565b8593505b831561341e57600190920191600a84049350613407565b826040519080825280601f01601f19166020018201604052801561344c578160200160208202803883390190505b5091505060001982015b85156134b857815160001982019160f860020a6030600a8a06010291849190811061347d57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550613456565b8194505b50505050919050565b604080518082019091526000808252602082015290565b828054828255906000526020600020908101928215613517579160200282015b828111156135175782518255916020019190600101906134fc565b5061352392915061366b565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061356857805160ff1916838001178555613517565b8280016001018555821561351757918201828111156135175782518255916020019190600101906134fc565b8280548282559060005260206000209081019282156135f6579160200282015b828111156135f6578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039091161782556020909201916001909101906135b4565b50613523929150613685565b6101a060405190810160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016060815260200160608152602001606081525090565b6130b991905b808211156135235760008155600101613671565b6130b991905b8082111561352357805473ffffffffffffffffffffffffffffffffffffffff1916815560010161368b565b60006129168235613c3e565b6000601f820183136136d357600080fd5b81356136e66136e182613beb565b613bc4565b9150818183526020840193506020810190508385602084028201111561370b57600080fd5b60005b83811015612424578161372188826136b6565b845250602092830192919091019060010161370e565b6000601f8201831361374857600080fd5b81356137566136e182613c0c565b9150808252602083016020830185838301111561377257600080fd5b61377d838284613c57565b50505092915050565b6000601f8201831361379757600080fd5b81516137a56136e182613c0c565b915080825260208301602083018583830111156137c157600080fd5b61377d838284613c63565b600061291682356130b9565b600061291682516130b9565b6000602082840312156137f657600080fd5b60006125c784846136b6565b6000806040838503121561381557600080fd5b600061382185856136b6565b925050602083013567ffffffffffffffff81111561383e57600080fd5b61384a85828601613737565b9150509250929050565b60006020828403121561386657600080fd5b813567ffffffffffffffff81111561387d57600080fd5b6125c7848285016136c2565b60006020828403121561389b57600080fd5b813567ffffffffffffffff8111156138b257600080fd5b6125c784828501613737565b6000602082840312156138d057600080fd5b815167ffffffffffffffff8111156138e757600080fd5b6125c784828501613786565b60006020828403121561390557600080fd5b60006125c784846137cc565b60006020828403121561392357600080fd5b60006125c784846137d8565b61393881613c3e565b82525050565b600061394982613c3a565b80845260208401935061395b83613c34565b60005b8281101561398b5761397186835161392f565b61397a82613c34565b60209690960195915060010161395e565b5093949350505050565b60006139a082613c3a565b8084526020840193506139b283613c34565b60005b8281101561398b576139c8868351613b2d565b6139d182613c34565b6020969096019591506001016139b5565b60006139ed82613c3a565b808452613a01816020860160208601613c63565b613a0a81613c8f565b9093016020019392505050565b80516000906101a0840190613a2c8582613b2d565b506020830151613a3f6020860182613b2d565b506040830151613a526040860182613b2d565b506060830151613a656060860182613b2d565b506080830151613a786080860182613b2d565b5060a0830151613a8b60a0860182613b2d565b5060c0830151613a9e60c0860182613b2d565b5060e0830151613ab160e0860182613b2d565b50610100830151613ac6610100860182613b2d565b50610120830151613adb610120860182613b2d565b50610140830151848203610140860152613af58282613995565b915050610160830151848203610160860152613b1182826139e2565b9150506101808301518482036101808601526127ad828261393e565b613938816130b9565b61393881613c4a565b602081016118f3828461392f565b6020808252810161291681846139e2565b602080825281016129168184613a17565b60a08101613b7d8288613b2d565b613b8a6020830187613b2d565b613b976040830186613b2d565b613ba46060830185613b2d565b8181036080830152612b4b81846139e2565b602081016118f38284613b36565b60405181810167ffffffffffffffff81118282101715613be357600080fd5b604052919050565b600067ffffffffffffffff821115613c0257600080fd5b5060209081020190565b600067ffffffffffffffff821115613c2357600080fd5b506020601f91909101601f19160190565b60200190565b5190565b600160a060020a031690565b67ffffffffffffffff1690565b82818337506000910152565b60005b83811015613c7e578181015183820152602001613c66565b8381111561036a5750506000910152565b601f01601f1916905600a265627a7a72305820804dcbaae59781ea4809d0d8d3204b4a640bfee533454fa79fa6938b8ba5c2466c6578706572696d656e74616cf50037\")\n\n)\n\n\nfunc GetSipSetting() *SIPSetting {\n\tsipSettingOnce.Do(func(){\n\t\tsipSetting=newSIPSetting()\n\t\tsipSetting.AddItem(\"6d1f766791dbd26380c47ed9bc7db336ae3388917d0f3364c4848b6b11f251b573a47be33696521535f98fdb1c80c335bdadd2367232572dcfd08367f6608891\",seroparam.SIP3(),data,\"STcH\")\n\t\tsipSetting.AddItem(\"baed9edd0ccf9b8db54abc05ab9b822b1cbf949f5066070b81e0ce3b0b475fffd5b5dd41e715c32a7552a4610dd2a8ea665d9dad0124f8df5c5369e5e4d73351\",seroparam.SIP7(),data0,\"c17B\")\n\t\tsipSetting.AddItem(\"ca5da48a12473fab4ad6bc61145b62c9163c863fa5240b27c7111101b085b9ab188b72f84873ae625810a0fd967be86bf9b1491f60997f37b323f45180898ba7\",seroparam.SIP7(),data1,\"3c2s\")\n\t\tsipSetting.AddItem(\"4096fcc782957d68b2802593ec20069f712e3a2e701bc25d66dbfdaa2fe289e1a97d65f0966905894b600569125bcd04e5763d8cdcffd3cc42e561d13417b86a\",seroparam.SIP8(),data2,\"t1mN\")\n\t\tsipSetting.AddItem(\"c12bd066cbb0826c3f9be7972bbaba4dc8e7924c212d54c7039a14d9de273f62403d138d92fde408056e8cc9924e88a4e07f9de2163fda3c38433c36460adbc8\",seroparam.SIP8(),data3,\"CMr6\")\n\t\tsipSetting.AddItem(\"a8291a27ab6d66a4a8a070e4b579f2372984280fb8455fbd648f8f4a59802d3c00a13cdc239f25c358f83d4a2c7f7fb84a1fc980ba95002d68b09af7731c5a1a\",seroparam.SIP9(),data4,\"JXwi\")\n\t\tsipSetting.AddItem(\"44ce76b19cf98b4c5b8b27b720d86d17a1753fd93ad357268734769567f6bf6b44eba6f944eac844566ffd53c8835dede539b46c488ee1326e4bfe3cd6b2c7f1\",seroparam.SIP9(),data5,\"L2E1\")\n\t\tsipSetting.AddItem(\"4096fcc782957d68b2802593ec20069f712e3a2e701bc25d66dbfdaa2fe289e1a97d65f0966905894b600569125bcd04e5763d8cdcffd3cc42e561d13417b86a\",seroparam.SIP10(),data6,\"t1mN\")\n\t})\n\treturn sipSetting\n}\n\n\n// Finalize implements consensus.Engine, accumulating the block rewards,\n// setting the final state and assembling the block.\nfunc (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, stateDB *state.StateDB, txs []*types.Transaction, receipts []*types.Receipt, gasReward uint64) (*types.Block, error) {\n\tif header.Number.Uint64() == seroparam.SIP1() {\n\t\tstateDB.SetBalance(state.EmptyAddress, \"SERO\", new(big.Int))\n\t}\n\n\tif v:=GetSipSetting().Get(header.Number.Uint64());v!=nil {\n\t\tif v.num!=header.Number.Uint64() {\n\t\t\tpanic(\"SIP Setting is not match\")\n\t\t}\n\t\tfor _,item:=range v.items {\n\t\t\tstateDB.SetCode(item.hash,item.code)\n\t\t}\n\t}\n\n\t// Accumulate any block rewards and commit the final state root\n\taccumulateRewards(chain.Config(), stateDB, header, gasReward)\n\n\tstateDB.NextZState().PreGenerateRoot(header, chain)\n\n\theader.Root = stateDB.IntermediateRoot(true)\n\n\t// Header seems complete, assemble into a block and return\n\treturn types.NewBlock(header, txs, receipts), nil\n}\n\nvar (\n\tbase    = big.NewInt(1e+17)\n\tbig100  = big.NewInt(100)\n\toneSero = new(big.Int).Mul(big.NewInt(10), base)\n\n\toriReward    = new(big.Int).Mul(big.NewInt(66773505743), big.NewInt(1000000000))\n\tinterval     = big.NewInt(8294400)\n\thalveNimber  = big.NewInt(3057600)\n\tdifficultyL1 = big.NewInt(340000000)\n\tdifficultyL2 = big.NewInt(1700000000)\n\tdifficultyL3 = big.NewInt(4000000000)\n\tdifficultyL4 = big.NewInt(17000000000)\n\n\tlReward   = new(big.Int).Mul(big.NewInt(176), base)\n\thReward   = new(big.Int).Mul(big.NewInt(445), base)\n\thRewardV4 = new(big.Int).Mul(big.NewInt(356), base)\n\n\targA, _ = new(big.Int).SetString(\"985347985347985\", 10)\n\targB, _ = new(big.Int).SetString(\"16910256410256400000\", 10)\n\n\tteamRewardPool      = common.BytesToAddress(crypto.Keccak512([]byte{1}))\n\tcommunityRewardPool = common.BytesToAddress(crypto.Keccak512([]byte{2}))\n\n\tteamAddress      = common.Base58ToAddress(\"RnRpAdXWaS2BnUzrUuzR8WPRfFackV65CzyqWU8mK4Np2aCgDUvrhYciDJoQZpMzWpaaKqsicf1u8fRd4ZKXeSUF2pMLHXXaiCX8XzHw3VRyX2Q7ko4BrRj9xTrNaErnTkg\")\n\tcommunityAddress = common.Base58ToAddress(\"ZkVB2f8H1usYBSeViS7wPqSSFseXnCYXEbT2XxCSuRhfFg9KbBKbTvpTBj7dmSZxEKTp6rsqS3EX9js6StgRijZQBkaok2U5Fy8oLuGFrt1C5jwdAYB4Nqn8KNRniiQyCeb\")\n)\n\nfunc Halve(blockNumber *big.Int) *big.Int {\n\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(blockNumber, halveNimber), interval), big1)\n\tif blockNumber.Uint64() >= seroparam.SIP7() {\n\t\treturn new(big.Int).Exp(big2, new(big.Int).Add(i, big1), nil)\n\t} else {\n\t\treturn new(big.Int).Exp(big2, i, nil)\n\t}\n}\n\n// AccumulateRewards credits the coinbase of the given block with the mining\n// reward. The total reward consists of the static block reward .\nfunc accumulateRewards(config *params.ChainConfig, statedb *state.StateDB, header *types.Header, gasReward uint64) {\n\n\tvar reward *big.Int\n\tif header.Number.Uint64() >= seroparam.SIP7() {\n\t\treward = accumulateRewardsV5(statedb, header)\n\t} else if header.Number.Uint64() >= seroparam.SIP4() {\n\t\treward = accumulateRewardsV4(statedb, header)\n\t} else if header.Number.Uint64() >= seroparam.SIP3() {\n\t\treward = accumulateRewardsV3(statedb, header)\n\t} else if header.Number.Uint64() >= seroparam.SIP1() {\n\t\treward = accumulateRewardsV2(statedb, header)\n\t} else {\n\t\treward = accumulateRewardsV1(config, statedb, header)\n\t}\n\n\tif seroparam.Is_Dev() {\n\t\treward = new(big.Int).Set(new(big.Int).Mul(big.NewInt(10000), oneSero))\n\t}\n\t// log.Info(fmt.Sprintf(\"BlockNumber = %v, gasLimie = %v, gasUsed = %v, reward = %v\", header.Number.Uint64(), header.GasLimit, header.GasUsed, reward))\n\treward.Add(reward, new(big.Int).SetUint64(gasReward))\n\n\tasset := assets.Asset{Tkn: &assets.Token{\n\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\tValue:    utils.U256(*reward),\n\t},\n\t}\n\tstatedb.NextZState().AddTxOut(header.Coinbase, asset, common.BytesToHash([]byte{1}))\n}\n\nfunc accumulateRewardsV1(config *params.ChainConfig, statedb *state.StateDB, header *types.Header) *big.Int {\n\tpoolBalance := statedb.GetBalance(state.EmptyAddress, \"SERO\")\n\tif poolBalance.Sign() <= 0 {\n\t\treturn big.NewInt(0)\n\t}\n\n\treward := new(big.Int).Mul(big.NewInt(350), base)\n\n\tdifficulty := big.NewInt(1717986918)\n\tif config.ChainID == params.AlphanetChainConfig.ChainID {\n\t\tdifficulty = big.NewInt(51485767)\n\t} else if config.ChainID == params.DevnetChainConfig.ChainID {\n\t\tdifficulty = big.NewInt(1048576)\n\t}\n\n\tif header.Difficulty.Cmp(difficulty) < 0 {\n\t\tratio := new(big.Int).Div(new(big.Int).Mul(header.Difficulty, big100), difficulty).Uint64()\n\t\tif ratio >= 80 {\n\t\t\treward = reward.Mul(reward, big.NewInt(4)).Div(reward, big.NewInt(5))\n\t\t} else if ratio >= 60 {\n\t\t\treward = reward.Mul(reward, big.NewInt(3)).Div(reward, big.NewInt(5))\n\t\t} else if ratio >= 40 {\n\t\t\treward = reward.Mul(reward, big.NewInt(2)).Div(reward, big.NewInt(5))\n\t\t} else if ratio >= 20 {\n\t\t\treward = reward.Mul(reward, big.NewInt(1)).Div(reward, big.NewInt(5))\n\t\t} else {\n\t\t\treward = big.NewInt(0).Set(oneSero)\n\t\t}\n\t}\n\n\tratio := new(big.Int).Div(new(big.Int).Mul(new(big.Int).SetUint64(header.GasUsed), big100), new(big.Int).SetUint64(header.GasLimit)).Uint64()\n\tif ratio >= 80 {\n\t\treward = new(big.Int).Div(new(big.Int).Mul(reward, big6), big.NewInt(5))\n\t} else {\n\t\treward = reward.Mul(reward, big.NewInt(4)).Div(reward, big.NewInt(5))\n\t}\n\n\tif reward.Cmp(oneSero) < 0 {\n\t\treward = big.NewInt(0).Set(oneSero)\n\t}\n\tstatedb.SubBalance(state.EmptyAddress, \"SERO\", reward)\n\treturn reward\n}\n\nfunc accumulateRewardsV2(statedb *state.StateDB, header *types.Header) *big.Int {\n\trewardStd := new(big.Int).Mul(big.NewInt(66773505743), big.NewInt(1000000000))\n\tif header.Number.Uint64() >= halveNimber.Uint64() {\n\t\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1)\n\t\trewardStd.Div(rewardStd, new(big.Int).Exp(big2, i, nil))\n\t}\n\n\tvar reward *big.Int\n\tif header.Difficulty.Cmp(difficultyL1) < 0 { // <3.4\n\t\treward = new(big.Int).Mul(big.NewInt(10), base)\n\t} else if header.Difficulty.Cmp(difficultyL2) < 0 { // <17\n\t\tratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(56), base), new(big.Int).Mul(big.NewInt(16470000000), new(big.Int).Sub(header.Difficulty, difficultyL1)))\n\t\treward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward)\n\t} else if header.Difficulty.Cmp(difficultyL3) < 0 { // <40\n\t\tratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(280), base), new(big.Int).Mul(big.NewInt(2170000000), new(big.Int).Sub(header.Difficulty, difficultyL2)))\n\t\treward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward)\n\t} else if header.Difficulty.Cmp(difficultyL4) < 0 { // <170\n\t\tratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(330), base), new(big.Int).Mul(big.NewInt(2590000000), new(big.Int).Sub(header.Difficulty, difficultyL3)))\n\t\treward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward)\n\t} else {\n\t\treward = rewardStd\n\t}\n\n\tif statedb == nil {\n\t\treturn reward\n\t}\n\tstatedb.AddBalance(communityRewardPool, \"SERO\", new(big.Int).Div(rewardStd, big.NewInt(15)))\n\tstatedb.AddBalance(teamRewardPool, \"SERO\", new(big.Int).Div(new(big.Int).Mul(reward, big2), big.NewInt(15)))\n\n\tif header.Number.Uint64()%5000 == 0 {\n\t\tbalance := statedb.GetBalance(teamRewardPool, \"SERO\")\n\t\tstatedb.SubBalance(teamRewardPool, \"SERO\", balance)\n\t\tassetTeam := assets.Asset{Tkn: &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*balance),\n\t\t},\n\t\t}\n\t\tstatedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{})\n\n\t\tbalance = statedb.GetBalance(communityRewardPool, \"SERO\")\n\t\tstatedb.SubBalance(communityRewardPool, \"SERO\", balance)\n\t\tassetCommunity := assets.Asset{Tkn: &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*balance),\n\t\t},\n\t\t}\n\t\tstatedb.NextZState().AddTxOut(communityAddress, assetCommunity, common.Hash{})\n\t}\n\treturn reward\n}\n\nfunc accumulateRewardsV3(statedb *state.StateDB, header *types.Header) *big.Int {\n\tdiff := new(big.Int).Div(header.Difficulty, big.NewInt(1000000000))\n\treward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB)\n\n\tif reward.Cmp(lReward) < 0 {\n\t\treward = new(big.Int).Set(lReward)\n\t} else if reward.Cmp(hReward) > 0 {\n\t\treward = new(big.Int).Set(hReward)\n\t}\n\n\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1)\n\treward.Div(reward, new(big.Int).Exp(big2, i, nil))\n\n\tif header.Licr.C != 0 {\n\t\treward = new(big.Int)\n\t}\n\n\tif statedb == nil {\n\t\treturn reward\n\t}\n\tstatedb.AddBalance(teamRewardPool, \"SERO\", new(big.Int).Div(reward, big.NewInt(5)))\n\n\tif header.Number.Uint64()%5000 == 0 {\n\t\tbalance := statedb.GetBalance(teamRewardPool, \"SERO\")\n\t\tstatedb.SubBalance(teamRewardPool, \"SERO\", balance)\n\t\tassetTeam := assets.Asset{Tkn: &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*balance),\n\t\t},\n\t\t}\n\t\tstatedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{})\n\n\t\tbalance = statedb.GetBalance(communityRewardPool, \"SERO\")\n\t\tif balance.Sign() > 0 {\n\t\t\tstatedb.SubBalance(communityRewardPool, \"SERO\", balance)\n\t\t\tassetCommunity := assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\tValue:    utils.U256(*balance),\n\t\t\t},\n\t\t\t}\n\t\t\tstatedb.NextZState().AddTxOut(communityAddress, assetCommunity, common.Hash{})\n\t\t}\n\t}\n\treturn reward\n}\n\nfunc accumulateRewardsV4(statedb *state.StateDB, header *types.Header) *big.Int {\n\tdiff := new(big.Int).Div(header.Difficulty, big.NewInt(1000000000))\n\treward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB)\n\n\tif reward.Cmp(lReward) < 0 {\n\t\treward = new(big.Int).Set(lReward)\n\t} else if reward.Cmp(hRewardV4) > 0 {\n\t\treward = new(big.Int).Set(hRewardV4)\n\t}\n\n\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1)\n\treward.Div(reward, new(big.Int).Exp(big2, i, nil))\n\n\tteamReward := new(big.Int).Div(hRewardV4, big.NewInt(4))\n\tteamReward = new(big.Int).Div(teamReward, new(big.Int).Exp(big2, i, nil))\n\tstatedb.AddBalance(teamRewardPool, \"SERO\", teamReward)\n\n\tif header.Number.Uint64()%5000 == 0 {\n\t\tbalance := statedb.GetBalance(teamRewardPool, \"SERO\")\n\t\tstatedb.SubBalance(teamRewardPool, \"SERO\", balance)\n\t\tassetTeam := assets.Asset{Tkn: &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*balance),\n\t\t},\n\t\t}\n\t\tstatedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{})\n\t}\n\treturn reward\n}\n\nfunc accumulateRewardsV5(statedb *state.StateDB, header *types.Header) *big.Int {\n\tdiff := new(big.Int).Div(header.Difficulty, big.NewInt(1000000000))\n\treward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB)\n\n\tif reward.Cmp(lReward) < 0 {\n\t\treward = new(big.Int).Set(lReward)\n\t} else if reward.Cmp(hRewardV4) > 0 {\n\t\treward = new(big.Int).Set(hRewardV4)\n\t}\n\n\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(header.Number, halveNimber), interval), big1)\n\treward.Div(reward, new(big.Int).Exp(big2, new(big.Int).Add(i, big1), nil))\n\n\tteamReward := new(big.Int).Div(hRewardV4, big.NewInt(4))\n\tteamReward = new(big.Int).Div(teamReward, new(big.Int).Exp(big2, i, nil))\n\tstatedb.AddBalance(teamRewardPool, \"SERO\", teamReward)\n\n\tif header.Number.Uint64()%5000 == 0 {\n\t\tbalance := statedb.GetBalance(teamRewardPool, \"SERO\")\n\t\tstatedb.SubBalance(teamRewardPool, \"SERO\", balance)\n\t\tassetTeam := assets.Asset{Tkn: &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*balance),\n\t\t},\n\t\t}\n\t\tstatedb.NextZState().AddTxOut(teamAddress, assetTeam, common.Hash{})\n\t}\n\treturn reward\n}\n"
  },
  {
    "path": "consensus/ethash/consensus_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethash\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\ntype diffTest struct {\n\tParentTimestamp    uint64\n\tParentDifficulty   *big.Int\n\tCurrentTimestamp   uint64\n\tCurrentBlocknumber *big.Int\n\tCurrentDifficulty  *big.Int\n}\n\nfunc (d *diffTest) UnmarshalJSON(b []byte) (err error) {\n\tvar ext struct {\n\t\tParentTimestamp    string\n\t\tParentDifficulty   string\n\t\tCurrentTimestamp   string\n\t\tCurrentBlocknumber string\n\t\tCurrentDifficulty  string\n\t}\n\tif err := json.Unmarshal(b, &ext); err != nil {\n\t\treturn err\n\t}\n\n\td.ParentTimestamp = math.MustParseUint64(ext.ParentTimestamp)\n\td.ParentDifficulty = math.MustParseBig256(ext.ParentDifficulty)\n\td.CurrentTimestamp = math.MustParseUint64(ext.CurrentTimestamp)\n\td.CurrentBlocknumber = math.MustParseBig256(ext.CurrentBlocknumber)\n\td.CurrentDifficulty = math.MustParseBig256(ext.CurrentDifficulty)\n\n\treturn nil\n}\n\nfunc TestCalcDifficulty(t *testing.T) {\n\tfile, err := os.Open(filepath.Join(\"..\", \"..\", \"tests\", \"testdata\", \"BasicTests\", \"difficulty.json\"))\n\tif err != nil {\n\t\tt.Skip(err)\n\t}\n\tdefer file.Close()\n\n\ttests := make(map[string]diffTest)\n\terr = json.NewDecoder(file).Decode(&tests)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tconfig := &params.ChainConfig{AutumnTwilightBlock: big.NewInt(0)}\n\n\tfor name, test := range tests {\n\t\tnumber := new(big.Int).Sub(test.CurrentBlocknumber, big.NewInt(1))\n\t\tdiff := CalcDifficulty(config, test.CurrentTimestamp, &types.Header{\n\t\t\tNumber:     number,\n\t\t\tTime:       new(big.Int).SetUint64(test.ParentTimestamp),\n\t\t\tDifficulty: test.ParentDifficulty,\n\t\t})\n\t\tif diff.Cmp(test.CurrentDifficulty) != 0 {\n\t\t\tt.Error(name, \"failed. Expected\", test.CurrentDifficulty, \"and calculated\", diff)\n\t\t}\n\t}\n}\n\nfunc TestCalcDifficultyV2(t *testing.T) {\n\tprint(130000, 330000000)\n\tprint(130000, 340000000)\n\tprint(130000, 340000001)\n\tprint(130000, 1651524619)\n\n\tprint(130001, 330000000)\n\tprint(130001, 340000000)\n\tprint(130001, 340000001)\n\tprint(130001, 1699999999)\n\tprint(130001, 1700000000)\n\tprint(130001, 1700000001)\n\tprint(130001, 3999999999)\n\tprint(130001, 4000000000)\n\tprint(130001, 4000000001)\n\tprint(130001, 16999999999)\n\tprint(130001, 17000000000)\n\tprint(130001, 17000000001)\n\n\tprint(3057600, 330000000)\n\tprint(3057600, 339999999)\n\tprint(3057600, 340000000)\n\tprint(3057600, 340000001)\n\tprint(3057600, 1699999999)\n\tprint(3057600, 1700000000)\n\tprint(3057600, 1700000001)\n\tprint(3057600, 3999999999)\n\tprint(3057600, 4000000000)\n\tprint(3057600, 4000000001)\n\tprint(3057600, 16999999999)\n\tprint(3057600, 17000000000)\n\tprint(3057600, 17000000001)\n\n\tprint(3057601, 330000000)\n\tprint(3057601, 339999999)\n\tprint(3057601, 340000000)\n\tprint(3057601, 340000001)\n\tprint(3057601, 1699999999)\n\tprint(3057601, 1700000000)\n\tprint(3057601, 1700000001)\n\tprint(3057601, 3999999999)\n\tprint(3057601, 4000000000)\n\tprint(3057601, 4000000001)\n\tprint(3057601, 16999999999)\n\tprint(3057601, 17000000000)\n\tprint(3057601, 17000000001)\n\n\tprint(3057601+8294400, 330000000)\n\tprint(3057601+8294400, 339999999)\n\tprint(3057601+8294400, 340000000)\n\tprint(3057601+8294400, 340000001)\n\tprint(3057601+8294400, 1699999999)\n\tprint(3057601+8294400, 1700000000)\n\tprint(3057601+8294400, 1700000001)\n\tprint(3057601+8294400, 3999999999)\n\tprint(3057601+8294400, 4000000000)\n\tprint(3057601+8294400, 4000000001)\n\tprint(3057601+8294400, 16999999999)\n\tprint(3057601+8294400, 17000000000)\n\tprint(3057601+8294400, 17000000001)\n\n\tprint(3057601+8294400*2, 330000000)\n\tprint(3057601+8294400*2, 339999999)\n\tprint(3057601+8294400*2, 340000000)\n\tprint(3057601+8294400*2, 340000001)\n\tprint(3057601+8294400*2, 1699999999)\n\tprint(3057601+8294400*2, 1700000000)\n\tprint(3057601+8294400*2, 1700000001)\n\tprint(3057601+8294400*2, 3999999999)\n\tprint(3057601+8294400*2, 4000000000)\n\tprint(3057601+8294400*2, 4000000001)\n\tprint(3057601+8294400*2, 16999999999)\n\tprint(3057601+8294400*2, 17000000000)\n\tprint(3057601+8294400*2, 17000000001)\n\n\tprint(120000, 2075498290)\n}\n\nfunc TestCalcDifficultyV3(t *testing.T) {\n\tprint(899069, 330000000)\n\tprint(899069, 130000000000)\n\tprint(899069, 140000000000)\n\tprint(899069, 140000000001)\n\tprint(899069, 700000000000)\n\tprint(899069, 980000000000)\n\tprint(899069, 2800000000000)\n\tprint(899069, 6300000000000)\n\tprint(899069, 14000000000000)\n\tprint(899069, 14000000000001)\n\tprint(899069, 28000000000000)\n\tprint(899069, 98000000000000)\n\tprint(899069, 140000000000000)\n\tprint(899069, 140000000000001)\n\tprint(899069, 150000000000001)\n\n\tprint(3057600, 330000000)\n\tprint(3057600, 130000000000)\n\tprint(3057600, 140000000000)\n\tprint(3057600, 140000000001)\n\tprint(3057600, 280000000000)\n\tprint(3057600, 6300000000000)\n\tprint(3057600, 14000000000000)\n\tprint(3057600, 28000000000000)\n\tprint(3057600, 98000000000000)\n\tprint(3057600, 140000000000000)\n\tprint(3057600, 140000000000001)\n\tprint(3057600, 150000000000001)\n\n\tprint(3057601, 330000000)\n\tprint(3057601, 130000000000)\n\tprint(3057601, 140000000000)\n\tprint(3057601, 140000000001)\n\tprint(3057601, 280000000000)\n\tprint(3057601, 6300000000000)\n\tprint(3057601, 14000000000000)\n\tprint(3057601, 28000000000000)\n\tprint(3057601, 98000000000000)\n\tprint(3057601, 140000000000000)\n\tprint(3057601, 140000000000001)\n\tprint(3057601, 150000000000001)\n\n\tprint(3057601+8294400, 330000000)\n\tprint(3057601+8294400, 130000000000)\n\tprint(3057601+8294400, 140000000000)\n\tprint(3057601+8294400, 140000000001)\n\tprint(3057601+8294400, 280000000000)\n\tprint(3057601+8294400, 6300000000000)\n\tprint(3057601+8294400, 14000000000000)\n\tprint(3057601+8294400, 28000000000000)\n\tprint(3057601+8294400, 98000000000000)\n\tprint(3057601+8294400, 140000000000000)\n\tprint(3057601+8294400, 140000000000001)\n\tprint(3057601+8294400, 150000000000001)\n\n\tprint(3057601+8294400*2, 330000000)\n\tprint(3057601+8294400*2, 130000000000)\n\tprint(3057601+8294400*2, 140000000000)\n\tprint(3057601+8294400*2, 140000000001)\n\tprint(3057601+8294400*2, 280000000000)\n\tprint(3057601+8294400*2, 6300000000000)\n\tprint(3057601+8294400*2, 14000000000000)\n\tprint(3057601+8294400*2, 28000000000000)\n\tprint(3057601+8294400*2, 98000000000000)\n\tprint(3057601+8294400*2, 140000000000000)\n\tprint(3057601+8294400*2, 140000000000001)\n\tprint(3057601+8294400*2, 150000000000001)\n}\n\nfunc print(number int64, difficulty int64) {\n\theader := &types.Header{\n\t\tNumber:     big.NewInt(number),\n\t\tDifficulty: big.NewInt(difficulty),\n\t}\n\tv2 := accumulateRewardsV4(nil, header)\n\tfmt.Println(number, difficulty)\n\tfmt.Println(v2)\n\tfmt.Println(new(big.Float).Quo(new(big.Float).SetInt(v2), big.NewFloat(1e+18)))\n\tfmt.Println(\"-------------------------\")\n}\n\nfunc TestCalcDifficultyV4(t *testing.T) {\n\n\tprint(899069, 330000000)\n\tprint(899069, 130000000000)\n\tprint(899069, 140000000000)\n\tprint(899069, 140000000001)\n\tprint(899069, 700000000000)\n\tprint(899069, 980000000000)\n\tprint(899069, 2800000000000)\n\tprint(899069, 6300000000000)\n\tprint(899069, 14000000000000)\n\tprint(899069, 14000000000001)\n\tprint(899069, 28000000000000)\n\tprint(899069, 98000000000000)\n\tprint(899069, 140000000000000)\n\tprint(899069, 140000000000001)\n\tprint(899069, 150000000000001)\n\n\tprint(3057600, 330000000)\n\tprint(3057600, 130000000000)\n\tprint(3057600, 140000000000)\n\tprint(3057600, 140000000001)\n\tprint(3057600, 280000000000)\n\tprint(3057600, 6300000000000)\n\tprint(3057600, 14000000000000)\n\tprint(3057600, 28000000000000)\n\tprint(3057600, 98000000000000)\n\tprint(3057600, 140000000000000)\n\tprint(3057600, 140000000000001)\n\tprint(3057600, 150000000000001)\n\n\tprint(3057601, 330000000)\n\tprint(3057601, 130000000000)\n\tprint(3057601, 140000000000)\n\tprint(3057601, 140000000001)\n\tprint(3057601, 280000000000)\n\tprint(3057601, 6300000000000)\n\tprint(3057601, 14000000000000)\n\tprint(3057601, 28000000000000)\n\tprint(3057601, 98000000000000)\n\tprint(3057601, 140000000000000)\n\tprint(3057601, 140000000000001)\n\tprint(3057601, 150000000000001)\n\n\tprint(3057601+8294400, 330000000)\n\tprint(3057601+8294400, 130000000000)\n\tprint(3057601+8294400, 140000000000)\n\tprint(3057601+8294400, 140000000001)\n\tprint(3057601+8294400, 280000000000)\n\tprint(3057601+8294400, 6300000000000)\n\tprint(3057601+8294400, 14000000000000)\n\tprint(3057601+8294400, 28000000000000)\n\tprint(3057601+8294400, 98000000000000)\n\tprint(3057601+8294400, 140000000000000)\n\tprint(3057601+8294400, 140000000000001)\n\tprint(3057601+8294400, 150000000000001)\n\n\tprint(3057601+8294400*2, 330000000)\n\tprint(3057601+8294400*2, 130000000000)\n\tprint(3057601+8294400*2, 140000000000)\n\tprint(3057601+8294400*2, 140000000001)\n\tprint(3057601+8294400*2, 280000000000)\n\tprint(3057601+8294400*2, 6300000000000)\n\tprint(3057601+8294400*2, 14000000000000)\n\tprint(3057601+8294400*2, 28000000000000)\n\tprint(3057601+8294400*2, 98000000000000)\n\tprint(3057601+8294400*2, 140000000000000)\n\tprint(3057601+8294400*2, 140000000000001)\n\tprint(3057601+8294400*2, 150000000000001)\n}\n\n\nfunc TestSIPEncode(t *testing.T) {\n}\n\nfunc TestSIPSetting(t *testing.T) {\n\tGetSipSetting();\n}"
  },
  {
    "path": "consensus/ethash/ethash.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package ethash implements the ethash proof-of-work consensus engine.\npackage ethash\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\t\"unsafe\"\n\n\tmmap \"github.com/edsrzf/mmap-go\"\n\t\"github.com/hashicorp/golang-lru/simplelru\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\nvar ErrInvalidDumpMagic = errors.New(\"invalid dump magic\")\n\nvar (\n\t// maxUint256 is a big integer representing 2^256-1\n\tmaxUint256 = new(big.Int).Exp(big.NewInt(2), big.NewInt(256), big.NewInt(0))\n\n\t// sharedEthash is a full instance that can be shared between multiple users.\n\tsharedEthash = New(Config{\"\", 3, 0, \"\", 1, 0, ModeNormal})\n\n\t// algorithmRevision is the data structure version used for file naming.\n\talgorithmRevision = 23\n\n\t// dumpMagic is a dataset dump header to sanity check a data dump.\n\tdumpMagic = []uint32{0xbaddcafe, 0xfee1dead}\n)\n\n// isLittleEndian returns whether the local system is running in little or big\n// endian byte order.\nfunc isLittleEndian() bool {\n\tn := uint32(0x01020304)\n\treturn *(*byte)(unsafe.Pointer(&n)) == 0x04\n}\n\n// memoryMap tries to memory map a file of uint32s for read only access.\nfunc memoryMap(path string) (*os.File, mmap.MMap, []uint32, error) {\n\tfile, err := os.OpenFile(path, os.O_RDONLY, 0644)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tmem, buffer, err := memoryMapFile(file, false)\n\tif err != nil {\n\t\tfile.Close()\n\t\treturn nil, nil, nil, err\n\t}\n\tfor i, magic := range dumpMagic {\n\t\tif buffer[i] != magic {\n\t\t\tmem.Unmap()\n\t\t\tfile.Close()\n\t\t\treturn nil, nil, nil, ErrInvalidDumpMagic\n\t\t}\n\t}\n\treturn file, mem, buffer[len(dumpMagic):], err\n}\n\n// memoryMapFile tries to memory map an already opened file descriptor.\nfunc memoryMapFile(file *os.File, write bool) (mmap.MMap, []uint32, error) {\n\t// Try to memory map the file\n\tflag := mmap.RDONLY\n\tif write {\n\t\tflag = mmap.RDWR\n\t}\n\tmem, err := mmap.Map(file, flag, 0)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\t// Yay, we managed to memory map the file, here be dragons\n\theader := *(*reflect.SliceHeader)(unsafe.Pointer(&mem))\n\theader.Len /= 4\n\theader.Cap /= 4\n\n\treturn mem, *(*[]uint32)(unsafe.Pointer(&header)), nil\n}\n\n// memoryMapAndGenerate tries to memory map a temporary file of uint32s for write\n// access, fill it with the data from a generator and then move it into the final\n// path requested.\nfunc memoryMapAndGenerate(path string, size uint64, generator func(buffer []uint32)) (*os.File, mmap.MMap, []uint32, error) {\n\t// Ensure the data folder exists\n\tif err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\t// Create a huge temporary empty file to fill with data\n\ttemp := path + \".\" + strconv.Itoa(rand.Int())\n\n\tdump, err := os.Create(temp)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tif err = dump.Truncate(int64(len(dumpMagic))*4 + int64(size)); err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\t// Memory map the file for writing and fill it with the generator\n\tmem, buffer, err := memoryMapFile(dump, true)\n\tif err != nil {\n\t\tdump.Close()\n\t\treturn nil, nil, nil, err\n\t}\n\tcopy(buffer, dumpMagic)\n\n\tdata := buffer[len(dumpMagic):]\n\tgenerator(data)\n\n\tif err := mem.Unmap(); err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tif err := dump.Close(); err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\tif err := os.Rename(temp, path); err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\treturn memoryMap(path)\n}\n\n// lru tracks caches or datasets by their last use time, keeping at most N of them.\ntype lru struct {\n\twhat string\n\tnew  func(epoch uint64) interface{}\n\tmu   sync.Mutex\n\t// Items are kept in a LRU cache, but there is a special case:\n\t// We always keep an item for (highest seen epoch) + 1 as the 'future item'.\n\tcache      *simplelru.LRU\n\tfuture     uint64\n\tfutureItem interface{}\n}\n\n// newlru create a new least-recently-used cache for either the verification caches\n// or the mining datasets.\nfunc newlru(what string, maxItems int, new func(epoch uint64) interface{}) *lru {\n\tif maxItems <= 0 {\n\t\tmaxItems = 1\n\t}\n\tcache, _ := simplelru.NewLRU(maxItems, func(key, value interface{}) {\n\t\tlog.Trace(\"Evicted ethash \"+what, \"epoch\", key)\n\t})\n\treturn &lru{what: what, new: new, cache: cache}\n}\n\n// get retrieves or creates an item for the given epoch. The first return value is always\n// non-nil. The second return value is non-nil if lru thinks that an item will be useful in\n// the near future.\nfunc (lru *lru) get(epoch uint64) (item, future interface{}) {\n\tlru.mu.Lock()\n\tdefer lru.mu.Unlock()\n\n\t// Get or create the item for the requested epoch.\n\titem, ok := lru.cache.Get(epoch)\n\tif !ok {\n\t\tif lru.future > 0 && lru.future == epoch {\n\t\t\titem = lru.futureItem\n\t\t} else {\n\t\t\tlog.Trace(\"Requiring new ethash \"+lru.what, \"epoch\", epoch)\n\t\t\titem = lru.new(epoch)\n\t\t}\n\t\tlru.cache.Add(epoch, item)\n\t}\n\t// Update the 'future item' if epoch is larger than previously seen.\n\tif epoch < maxEpoch-1 && lru.future < epoch+1 {\n\t\tlog.Trace(\"Requiring new future ethash \"+lru.what, \"epoch\", epoch+1)\n\t\tfuture = lru.new(epoch + 1)\n\t\tlru.future = epoch + 1\n\t\tlru.futureItem = future\n\t}\n\treturn item, future\n}\n\n// cache wraps an ethash cache with some metadata to allow easier concurrent use.\ntype cache struct {\n\tepoch uint64    // Epoch for which this cache is relevant\n\tdump  *os.File  // File descriptor of the memory mapped cache\n\tmmap  mmap.MMap // Memory map itself to unmap before releasing\n\tcache []uint32  // The actual cache data content (may be memory mapped)\n\tcdag  []uint32\n\tonce  sync.Once // Ensures the cache is generated only once\n}\n\nfunc (self *cache) generateCDag() {\n\tself.cdag = make([]uint32, progpowCacheWords)\n\tgenerateCDag(self.cdag, self.cache, self.epoch)\n}\n\n// newCache creates a new ethash verification cache and returns it as a plain Go\n// interface to be usable in an LRU cache.\nfunc newCache(epoch uint64) interface{} {\n\treturn &cache{epoch: epoch}\n}\n\n// generate ensures that the cache content is generated before use.\nfunc (c *cache) generate(dir string, limit int, test bool) {\n\tc.once.Do(func() {\n\t\tsize := cacheSize(c.epoch*epochLength + 1)\n\t\tseed := seedHash(c.epoch*epochLength + 1)\n\t\tif test {\n\t\t\tsize = 1024\n\t\t}\n\t\t// If we don't store anything on disk, generate and return.\n\t\tif dir == \"\" {\n\t\t\tc.cache = make([]uint32, size/4)\n\t\t\tgenerateCache(c.cache, c.epoch, seed)\n\t\t\tc.generateCDag()\n\t\t\treturn\n\t\t}\n\t\t// Disk storage is needed, this will get fancy\n\t\tvar endian string\n\t\tif !isLittleEndian() {\n\t\t\tendian = \".be\"\n\t\t}\n\t\tpath := filepath.Join(dir, fmt.Sprintf(\"cache-R%d-%x%s\", algorithmRevision, seed[:8], endian))\n\t\tlogger := log.New(\"epoch\", c.epoch)\n\n\t\t// We're about to mmap the file, ensure that the mapping is cleaned up when the\n\t\t// cache becomes unused.\n\t\truntime.SetFinalizer(c, (*cache).finalizer)\n\n\t\t// Try to load the file from disk and memory map it\n\t\tvar err error\n\t\tc.dump, c.mmap, c.cache, err = memoryMap(path)\n\t\tif err == nil {\n\t\t\tc.generateCDag()\n\t\t\tlogger.Debug(\"Loaded old ethash cache from disk\")\n\t\t\treturn\n\t\t}\n\t\tlogger.Debug(\"Failed to load old ethash cache\", \"err\", err)\n\n\t\t// No previous cache available, create a new cache file to fill\n\t\tc.dump, c.mmap, c.cache, err = memoryMapAndGenerate(path, size, func(buffer []uint32) { generateCache(buffer, c.epoch, seed) })\n\t\tif err != nil {\n\t\t\tlogger.Error(\"Failed to generate mapped ethash cache\", \"err\", err)\n\n\t\t\tc.cache = make([]uint32, size/4)\n\t\t\tgenerateCache(c.cache, c.epoch, seed)\n\t\t}\n\t\t// Iterate over all previous instances and delete old ones\n\t\tfor ep := int(c.epoch) - limit; ep >= 0; ep-- {\n\t\t\tseed := seedHash(uint64(ep)*epochLength + 1)\n\t\t\tpath := filepath.Join(dir, fmt.Sprintf(\"cache-R%d-%x%s\", algorithmRevision, seed[:8], endian))\n\t\t\tos.Remove(path)\n\t\t}\n\t\tc.generateCDag()\n\t})\n}\n\n// finalizer unmaps the memory and closes the file.\nfunc (c *cache) finalizer() {\n\tif c.mmap != nil {\n\t\tc.mmap.Unmap()\n\t\tc.dump.Close()\n\t\tc.mmap, c.dump = nil, nil\n\t}\n}\n\n// dataset wraps an ethash dataset with some metadata to allow easier concurrent use.\ntype dataset struct {\n\tepoch   uint64    // Epoch for which this cache is relevant\n\tdump    *os.File  // File descriptor of the memory mapped cache\n\tmmap    mmap.MMap // Memory map itself to unmap before releasing\n\tdataset []uint32  // The actual cache data content\n\tonce    sync.Once // Ensures the cache is generated only once\n\tdone    uint32\n}\n\n// newDataset creates a new ethash mining dataset and returns it as a plain Go\n// interface to be usable in an LRU cache.\nfunc newDataset(epoch uint64) interface{} {\n\treturn &dataset{epoch: epoch}\n}\n\nfunc (d *dataset) generated() bool {\n\treturn atomic.LoadUint32(&d.done) == 1\n}\n\n// generate ensures that the dataset content is generated before use.\nfunc (d *dataset) generate(dir string, limit int, test bool) {\n\td.once.Do(func() {\n\t\tdefer atomic.StoreUint32(&d.done, 1)\n\n\t\tcsize := cacheSize(d.epoch*epochLength + 1)\n\t\tdsize := datasetSize(d.epoch*epochLength + 1)\n\t\tseed := seedHash(d.epoch*epochLength + 1)\n\t\tif test {\n\t\t\tcsize = 1024\n\t\t\tdsize = 32 * 1024\n\t\t}\n\t\t// If we don't store anything on disk, generate and return\n\t\tif dir == \"\" {\n\t\t\tcache := make([]uint32, csize/4)\n\t\t\tgenerateCache(cache, d.epoch, seed)\n\n\t\t\td.dataset = make([]uint32, dsize/4)\n\t\t\tgenerateDataset(d.dataset, d.epoch, cache)\n\t\t}\n\t\t// Disk storage is needed, this will get fancy\n\t\tvar endian string\n\t\tif !isLittleEndian() {\n\t\t\tendian = \".be\"\n\t\t}\n\t\tpath := filepath.Join(dir, fmt.Sprintf(\"full-R%d-%x%s\", algorithmRevision, seed[:8], endian))\n\t\tlogger := log.New(\"epoch\", d.epoch)\n\n\t\t// We're about to mmap the file, ensure that the mapping is cleaned up when the\n\t\t// cache becomes unused.\n\t\truntime.SetFinalizer(d, (*dataset).finalizer)\n\n\t\t// Try to load the file from disk and memory map it\n\t\tvar err error\n\t\td.dump, d.mmap, d.dataset, err = memoryMap(path)\n\t\tif err == nil {\n\t\t\tlogger.Debug(\"Loaded old ethash dataset from disk\")\n\t\t\treturn\n\t\t}\n\t\tlogger.Debug(\"Failed to load old ethash dataset\", \"err\", err)\n\n\t\t// No previous dataset available, create a new dataset file to fill\n\t\tcache := make([]uint32, csize/4)\n\t\tgenerateCache(cache, d.epoch, seed)\n\n\t\td.dump, d.mmap, d.dataset, err = memoryMapAndGenerate(path, dsize, func(buffer []uint32) { generateDataset(buffer, d.epoch, cache) })\n\t\tif err != nil {\n\t\t\tlogger.Error(\"Failed to generate mapped ethash dataset\", \"err\", err)\n\n\t\t\td.dataset = make([]uint32, dsize/2)\n\t\t\tgenerateDataset(d.dataset, d.epoch, cache)\n\t\t}\n\t\t// Iterate over all previous instances and delete old ones\n\t\tfor ep := int(d.epoch) - limit; ep >= 0; ep-- {\n\t\t\tseed := seedHash(uint64(ep)*epochLength + 1)\n\t\t\tpath := filepath.Join(dir, fmt.Sprintf(\"full-R%d-%x%s\", algorithmRevision, seed[:8], endian))\n\t\t\tos.Remove(path)\n\t\t}\n\t})\n}\n\n// finalizer closes any file handlers and memory maps open.\nfunc (d *dataset) finalizer() {\n\tif d.mmap != nil {\n\t\td.mmap.Unmap()\n\t\td.dump.Close()\n\t\td.mmap, d.dump = nil, nil\n\t}\n}\n\n// MakeCache generates a new ethash cache and optionally stores it to disk.\nfunc MakeCache(block uint64, dir string) {\n\tc := cache{epoch: block / epochLength}\n\tc.generate(dir, math.MaxInt32, false)\n}\n\n// MakeDataset generates a new ethash dataset and optionally stores it to disk.\nfunc MakeDataset(block uint64, dir string) {\n\td := dataset{epoch: block / epochLength}\n\td.generate(dir, math.MaxInt32, false)\n}\n\n// Mode defines the type and amount of PoW verification an ethash engine makes.\ntype Mode uint\n\nconst (\n\tModeNormal Mode = iota\n\tModeShared\n\tModeTest\n\tModeFake\n\tModeFullFake\n)\n\n// Config are the configuration parameters of the ethash.\ntype Config struct {\n\tCacheDir       string\n\tCachesInMem    int\n\tCachesOnDisk   int\n\tDatasetDir     string\n\tDatasetsInMem  int\n\tDatasetsOnDisk int\n\tPowMode        Mode\n}\n\n// Ethash is a consensus engine based on proof-of-work implementing the ethash\n// algorithm.\ntype Ethash struct {\n\tconfig Config\n\n\tcaches   *lru // In memory caches to avoid regenerating too often\n\tdatasets *lru // In memory datasets to avoid regenerating too often\n\n\t// Mining related fields\n\trand     *rand.Rand    // Properly seeded random source for nonces\n\tthreads  int           // Number of threads to mine on if mining\n\tupdate   chan struct{} // Notification channel to update mining parameters\n\thashrate metrics.Meter // Meter tracking the average hashrate\n\n\t// The fields below are hooks for testing\n\tshared    *Ethash       // Shared PoW verifier to avoid cache regeneration\n\tfakeFail  uint64        // Block number which fails PoW check even in fake mode\n\tfakeDelay time.Duration // Time delay to sleep for before returning from verify\n\n\tlock sync.Mutex // Ensures thread safety for the in-memory caches and mining fields\n}\n\n// New creates a full sized ethash PoW scheme.\nfunc New(config Config) *Ethash {\n\tif config.CachesInMem <= 0 {\n\t\tlog.Warn(\"One ethash cache must always be in memory\", \"requested\", config.CachesInMem)\n\t\tconfig.CachesInMem = 1\n\t}\n\tif config.CacheDir != \"\" && config.CachesOnDisk > 0 {\n\t\tlog.Info(\"Disk storage enabled for ethash caches\", \"dir\", config.CacheDir, \"count\", config.CachesOnDisk)\n\t}\n\tif config.DatasetDir != \"\" && config.DatasetsOnDisk > 0 {\n\t\tlog.Info(\"Disk storage enabled for ethash DAGs\", \"dir\", config.DatasetDir, \"count\", config.DatasetsOnDisk)\n\t}\n\treturn &Ethash{\n\t\tconfig:   config,\n\t\tcaches:   newlru(\"cache\", config.CachesInMem, newCache),\n\t\tdatasets: newlru(\"dataset\", config.DatasetsInMem, newDataset),\n\t\tupdate:   make(chan struct{}),\n\t\thashrate: metrics.NewMeter(),\n\t}\n}\n\n// NewTester creates a small sized ethash PoW scheme useful only for testing\n// purposes.\nfunc NewTester() *Ethash {\n\treturn New(Config{CachesInMem: 1, PowMode: ModeTest})\n}\n\n// NewFaker creates a ethash consensus engine with a fake PoW scheme that accepts\n// all blocks' seal as valid, though they still have to conform to the Ethereum\n// consensus rules.\nfunc NewFaker() *Ethash {\n\treturn &Ethash{\n\t\tconfig: Config{\n\t\t\tPowMode: ModeFake,\n\t\t},\n\t}\n}\n\n// NewFakeFailer creates a ethash consensus engine with a fake PoW scheme that\n// accepts all blocks as valid apart from the single one specified, though they\n// still have to conform to the Ethereum consensus rules.\nfunc NewFakeFailer(fail uint64) *Ethash {\n\treturn &Ethash{\n\t\tconfig: Config{\n\t\t\tPowMode: ModeFake,\n\t\t},\n\t\tfakeFail: fail,\n\t}\n}\n\n// NewFakeDelayer creates a ethash consensus engine with a fake PoW scheme that\n// accepts all blocks as valid, but delays verifications by some time, though\n// they still have to conform to the Ethereum consensus rules.\nfunc NewFakeDelayer(delay time.Duration) *Ethash {\n\treturn &Ethash{\n\t\tconfig: Config{\n\t\t\tPowMode: ModeFake,\n\t\t},\n\t\tfakeDelay: delay,\n\t}\n}\n\n// NewFullFaker creates an ethash consensus engine with a full fake scheme that\n// accepts all blocks as valid, without checking any consensus rules whatsoever.\nfunc NewFullFaker() *Ethash {\n\treturn &Ethash{\n\t\tconfig: Config{\n\t\t\tPowMode: ModeFullFake,\n\t\t},\n\t}\n}\n\n// NewShared creates a full sized ethash PoW shared between all requesters running\n// in the same process.\nfunc NewShared() *Ethash {\n\treturn &Ethash{shared: sharedEthash}\n}\n\n// cache tries to retrieve a verification cache for the specified block number\n// by first checking against a list of in-memory caches, then against caches\n// stored on disk, and finally generating one if none can be found.\nfunc (ethash *Ethash) cache(block uint64) *cache {\n\tepoch := block / epochLength\n\tcurrentI, futureI := ethash.caches.get(epoch)\n\tcurrent := currentI.(*cache)\n\n\t// Wait for generation finish.\n\tcurrent.generate(ethash.config.CacheDir, ethash.config.CachesOnDisk, ethash.config.PowMode == ModeTest)\n\n\t// If we need a new future cache, now's a good time to regenerate it.\n\tif futureI != nil {\n\t\tfuture := futureI.(*cache)\n\t\tgo future.generate(ethash.config.CacheDir, ethash.config.CachesOnDisk, ethash.config.PowMode == ModeTest)\n\t}\n\treturn current\n}\n\nfunc (ethash *Ethash) dataset_async(block uint64) *dataset {\n\t// Retrieve the requested ethash dataset\n\tepoch := block / epochLength\n\tcurrentI, futureI := ethash.datasets.get(epoch)\n\tcurrent := currentI.(*dataset)\n\n\t// If async is specified, generate everything in a background thread\n\tif !current.generated() {\n\t\tgo func() {\n\t\t\tcurrent.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest)\n\n\t\t\tif futureI != nil {\n\t\t\t\tfuture := futureI.(*dataset)\n\t\t\t\tfuture.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest)\n\t\t\t}\n\t\t}()\n\t}\n\treturn current\n}\n\n// dataset tries to retrieve a mining dataset for the specified block number\n// by first checking against a list of in-memory datasets, then against DAGs\n// stored on disk, and finally generating one if none can be found.\nfunc (ethash *Ethash) dataset(block uint64) *dataset {\n\tepoch := block / epochLength\n\tcurrentI, futureI := ethash.datasets.get(epoch)\n\tcurrent := currentI.(*dataset)\n\n\t// Wait for generation finish.\n\tcurrent.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest)\n\n\t// If we need a new future dataset, now's a good time to regenerate it.\n\tif futureI != nil {\n\t\tfuture := futureI.(*dataset)\n\t\tgo future.generate(ethash.config.DatasetDir, ethash.config.DatasetsOnDisk, ethash.config.PowMode == ModeTest)\n\t}\n\n\treturn current\n}\n\n// Threads returns the number of mining threads currently enabled. This doesn't\n// necessarily mean that mining is running!\nfunc (ethash *Ethash) Threads() int {\n\tethash.lock.Lock()\n\tdefer ethash.lock.Unlock()\n\n\treturn ethash.threads\n}\n\n// SetThreads updates the number of mining threads currently enabled. Calling\n// this method does not start mining, only sets the thread count. If zero is\n// specified, the miner will use all cores of the machine. Setting a thread\n// count below zero is allowed and will cause the miner to idle, without any\n// work being done.\nfunc (ethash *Ethash) SetThreads(threads int) {\n\tethash.lock.Lock()\n\tdefer ethash.lock.Unlock()\n\n\t// If we're running a shared PoW, set the thread count on that instead\n\tif ethash.shared != nil {\n\t\tethash.shared.SetThreads(threads)\n\t\treturn\n\t}\n\t// Update the threads and ping any running seal to pull in any changes\n\tethash.threads = threads\n\tselect {\n\tcase ethash.update <- struct{}{}:\n\tdefault:\n\t}\n}\n\n// Hashrate implements PoW, returning the measured rate of the search invocations\n// per second over the last minute.\nfunc (ethash *Ethash) Hashrate() float64 {\n\treturn ethash.hashrate.Rate1()\n}\n\nfunc (ethash *Ethash) StartHashrate() {\n\tethash.hashrate.Stop()\n\tethash.hashrate = metrics.NewHashrateMeter()\n}\n\nfunc (ethash *Ethash) StopHashrate() {\n\tethash.hashrate.Stop()\n\tethash.hashrate = metrics.NilMeter{}\n\n}\n\n// APIs implements consensus.Engine, returning the user facing RPC APIs. Currently\n// that is empty.\nfunc (ethash *Ethash) APIs(chain consensus.ChainReader) []rpc.API {\n\treturn nil\n}\n\n// SeedHash is the seed to use for generating a verification cache and the mining\n// dataset.\nfunc SeedHash(block uint64) []byte {\n\treturn seedHash(block)\n}\n"
  },
  {
    "path": "consensus/ethash/ethash_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethash\n\nimport (\n\t\"io/ioutil\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"os\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\n// Tests that ethash works correctly in test mode.\nfunc TestTestMode(t *testing.T) {\n\thead := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)}\n\n\tethash := NewTester()\n\tblock, err := ethash.Seal(nil, types.NewBlockWithHeader(head), nil)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to seal block: %v\", err)\n\t}\n\thead.Nonce = types.EncodeNonce(block.Nonce())\n\thead.MixDigest = block.MixDigest()\n\tif err := ethash.VerifySeal(nil, head); err != nil {\n\t\tt.Fatalf(\"unexpected verification error: %v\", err)\n\t}\n}\n\n// This test checks that cache lru logic doesn't crash under load.\n// It reproduces https://github.com/sero-cash/go-sero/issues/14943\nfunc TestCacheFileEvict(t *testing.T) {\n\ttmpdir, err := ioutil.TempDir(\"\", \"ethash-test\")\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tdefer os.RemoveAll(tmpdir)\n\te := New(Config{CachesInMem: 3, CachesOnDisk: 10, CacheDir: tmpdir, PowMode: ModeTest})\n\n\tworkers := 8\n\tepochs := 100\n\tvar wg sync.WaitGroup\n\twg.Add(workers)\n\tfor i := 0; i < workers; i++ {\n\t\tgo verifyTest(&wg, e, i, epochs)\n\t}\n\twg.Wait()\n}\n\nfunc verifyTest(wg *sync.WaitGroup, e *Ethash, workerIndex, epochs int) {\n\tdefer wg.Done()\n\n\tconst wiggle = 4 * epochLength\n\tr := rand.New(rand.NewSource(int64(workerIndex)))\n\tfor epoch := 0; epoch < epochs; epoch++ {\n\t\tblock := int64(epoch)*epochLength - wiggle/2 + r.Int63n(wiggle)\n\t\tif block < 0 {\n\t\t\tblock = 0\n\t\t}\n\t\thead := &types.Header{Number: big.NewInt(block), Difficulty: big.NewInt(100)}\n\t\te.VerifySeal(nil, head)\n\t}\n}\n"
  },
  {
    "path": "consensus/ethash/progpow.go",
    "content": "package ethash\n\nimport (\n\t\"encoding/binary\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tprogpowCacheBytes = 16 * 1024             // Total size 16*1024 bytes\n\tprogpowCacheWords = progpowCacheBytes / 4 // Total size 16*1024 bytes\n\tprogpowLanes      = 16\n\tprogpowRegs       = 32\n\tprogpowCntCache   = 12\n\tprogpowCntMath    = 20\n\tprogpowDagLoads   = 4\n\tprogpowCntDag     = 64\n\tprogpowMixBytes   = 2 * mixBytes\n\tprogpowPeriod     = 50\n)\n\nfunc progpowLight(size uint64, cache []uint32, hash []byte, nonce uint64,\n\tblockNumber uint64, cDag []uint32) ([]byte, []byte) {\n\tkeccak512 := makeHasher(sha3.NewKeccak512())\n\n\tlookup := func(index uint32) []byte {\n\t\trawData := generateDatasetItem(cache, index/16, keccak512)\n\t\treturn rawData\n\t}\n\treturn progpow(hash, nonce, size, blockNumber, cDag, lookup)\n}\n\nfunc generateCDag(cDag, cache []uint32, epoch uint64) {\n\tif cDag == nil {\n\t\treturn\n\t}\n\tstart := time.Now()\n\tkeccak512 := makeHasher(sha3.NewKeccak512())\n\n\tfor i := uint32(0); i < progpowCacheWords/16; i++ {\n\t\trawData := generateDatasetItem(cache, i, keccak512)\n\t\t// 64 bytes in rawData -> 16 uint32\n\t\tfor j := uint32(0); j < 16; j++ {\n\t\t\tcDag[i*16+j] = binary.LittleEndian.Uint32(rawData[4*j:])\n\t\t}\n\t}\n\n\telapsed := time.Since(start)\n\tlog.Info(\"Generated progpow cDag\", \"elapsed\", common.PrettyDuration(elapsed), \"epoch\", epoch)\n}\n\nfunc progpowLightWithoutCDag(\n\tsize uint64,\n\tcache []uint32,\n\tcDag []uint32,\n\thash []byte,\n\tnonce uint64,\n\tblockNumber uint64) ([]byte, []byte) {\n\n\t//cDag := make([]uint32, progpowCacheWords)\n\t//generateCDag(cDag, cache, blockNumber/epochLength)\n\n\treturn progpowLight(size, cache, hash, nonce, blockNumber, cDag)\n}\n\n/*\nfunc progpowLightWithoutCDag(\n\tsize uint64,\n\tcache []uint32,\n\thash []byte,\n\tnonce uint64,\n\tblockNumber uint64) ([]byte, []byte) {\n\n\tkeccak512 := makeHasher(sha3.NewKeccak512())\n\tcDag := make([]uint32, progpowCacheWords)\n\trawData := generateDatasetItem(cache, 0, keccak512)\n\n\tfor i := uint32(0); i < progpowCacheWords; i += 2 {\n\t\tif i != 0 && 2*i/16 != 2*(i-1)/16 {\n\t\t\trawData = generateDatasetItem(cache, 2*i/16, keccak512)\n\t\t}\n\t\tcDag[i+0] = binary.LittleEndian.Uint32(rawData[((2*i+0)%16)*4:])\n\t\tcDag[i+1] = binary.LittleEndian.Uint32(rawData[((2*i+1)%16)*4:])\n\t}\n\treturn progpowLight(size, cache, hash, nonce, blockNumber, cDag)\n}*/\n\nfunc progpowFull(dataset []uint32, hash []byte, nonce uint64,\n\tblockNumber uint64) ([]byte, []byte) {\n\n\tlookup := func(index uint32) []byte {\n\t\tmix := make([]byte, hashBytes)\n\n\t\tfor i := uint32(0); i < hashWords; i++ {\n\t\t\tbinary.LittleEndian.PutUint32(mix[i*4:], dataset[(index/16)*16+i])\n\t\t}\n\t\treturn mix\n\t}\n\n\tcDag := make([]uint32, progpowCacheWords)\n\n\t// initialize cDag\n\tfor i := uint32(0); i < progpowCacheWords; i++ {\n\t\tcDag[i] = dataset[i]\n\t}\n\n\treturn progpow(hash, nonce, uint64(len(dataset))*4, blockNumber, cDag, lookup)\n}\n\nfunc rotl32(x uint32, n uint32) uint32 {\n\treturn (((x) << (n % 32)) | ((x) >> (32 - (n % 32))))\n}\n\nfunc rotr32(x uint32, n uint32) uint32 {\n\treturn (((x) >> (n % 32)) | ((x) << (32 - (n % 32))))\n}\n\nfunc lower32(in uint64) uint32 {\n\treturn uint32(in & uint64(0x00000000FFFFFFFF))\n}\n\nfunc higher32(in uint64) uint32 {\n\treturn uint32((in >> 32) & uint64(0x00000000FFFFFFFF))\n}\n\nvar keccakfRNDC = [24]uint32{\n\t0x00000001, 0x00008082, 0x0000808a, 0x80008000, 0x0000808b, 0x80000001,\n\t0x80008081, 0x00008009, 0x0000008a, 0x00000088, 0x80008009, 0x8000000a,\n\t0x8000808b, 0x0000008b, 0x00008089, 0x00008003, 0x00008002, 0x00000080,\n\t0x0000800a, 0x8000000a, 0x80008081, 0x00008080, 0x80000001, 0x80008008}\n\nfunc keccakF800Round(st [25]uint32, r int) [25]uint32 {\n\tvar keccakfROTC = [24]uint32{1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2,\n\t\t14, 27, 41, 56, 8, 25, 43, 62, 18, 39, 61,\n\t\t20, 44}\n\tvar keccakfPILN = [24]uint32{10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24,\n\t\t4, 15, 23, 19, 13, 12, 2, 20, 14, 22, 9,\n\t\t6, 1}\n\tbc := make([]uint32, 5)\n\t// Theta\n\tfor i := 0; i < 5; i++ {\n\t\tbc[i] = st[i] ^ st[i+5] ^ st[i+10] ^ st[i+15] ^ st[i+20]\n\t}\n\n\tfor i := 0; i < 5; i++ {\n\t\tt := bc[(i+4)%5] ^ rotl32(bc[(i+1)%5], 1)\n\t\tfor j := 0; j < 25; j += 5 {\n\t\t\tst[j+i] ^= t\n\t\t}\n\t}\n\n\t// Rho Pi\n\tt := st[1]\n\tfor i := 0; i < 24; i++ {\n\t\tj := keccakfPILN[i]\n\t\tbc[0] = st[j]\n\t\tst[j] = rotl32(t, keccakfROTC[i])\n\t\tt = bc[0]\n\t}\n\n\t//  Chi\n\tfor j := 0; j < 25; j += 5 {\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tbc[i] = st[j+i]\n\t\t}\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tst[j+i] ^= (^bc[(i+1)%5]) & bc[(i+2)%5]\n\t\t}\n\t}\n\n\t//  Iota\n\tst[0] ^= keccakfRNDC[r]\n\treturn st\n}\n\nfunc byteReverse(i uint32) uint32 {\n\tvar ret uint32\n\n\tret = 0\n\tret += (i & 0xFF)\n\tret <<= 8\n\tret += ((i >> 8) & 0xFF)\n\tret <<= 8\n\tret += ((i >> 16) & 0xFF)\n\tret <<= 8\n\tret += (i >> 24)\n\n\treturn ret\n}\n\nfunc keccakF800(headerHash []byte, nonce uint64, result []uint32) uint64 {\n\tvar st [25]uint32\n\tvar ret uint64\n\n\tfor i := 0; i < 25; i++ {\n\t\tst[i] = 0\n\t}\n\n\tfor i := 0; i < 8; i++ {\n\t\tst[i] = (uint32(headerHash[4*i])) +\n\t\t\t(uint32(headerHash[4*i+1]) << 8) +\n\t\t\t(uint32(headerHash[4*i+2]) << 16) +\n\t\t\t(uint32(headerHash[4*i+3]) << 24)\n\t}\n\n\tst[8] = lower32(nonce)\n\tst[9] = higher32(nonce)\n\tfor i := 0; i < 8; i++ {\n\t\tst[10+i] = result[i]\n\t}\n\tfor r := 0; r < 21; r++ {\n\t\tst = keccakF800Round(st, r)\n\t}\n\tst = keccakF800Round(st, 21)\n\tret = uint64(byteReverse(st[0]))\n\tret = (ret << 32) + uint64(byteReverse(st[1]))\n\treturn ret\n}\n\nfunc keccakF800Full(headerHash []byte, nonce uint64, result []uint32) []byte {\n\tvar st [25]uint32\n\n\tfor i := 0; i < 25; i++ {\n\t\tst[i] = 0\n\t}\n\tfor i := 0; i < 8; i++ {\n\t\tst[i] = (uint32(headerHash[4*i])) +\n\t\t\t(uint32(headerHash[4*i+1]) << 8) +\n\t\t\t(uint32(headerHash[4*i+2]) << 16) +\n\t\t\t(uint32(headerHash[4*i+3]) << 24)\n\t}\n\n\tst[8] = lower32(nonce)\n\tst[9] = higher32(nonce)\n\tfor i := 0; i < 8; i++ {\n\t\tst[10+i] = result[i]\n\t}\n\tfor r := 0; r < 21; r++ {\n\t\tst = keccakF800Round(st, r)\n\t}\n\tst = keccakF800Round(st, 21)\n\tret := make([]byte, 32)\n\tfor i := 0; i < 8; i++ {\n\t\tbinary.LittleEndian.PutUint32(ret[i*4:], st[i])\n\t}\n\treturn ret\n}\n\nfunc fnv1a(h *uint32, d uint32) uint32 {\n\t*h = (*h ^ d) * uint32(0x1000193)\n\treturn *h\n}\n\ntype kiss99State struct {\n\tz     uint32\n\tw     uint32\n\tjsr   uint32\n\tjcong uint32\n}\n\nfunc kiss99(st *kiss99State) uint32 {\n\tvar MWC uint32\n\tst.z = 36969*(st.z&65535) + (st.z >> 16)\n\tst.w = 18000*(st.w&65535) + (st.w >> 16)\n\tMWC = ((st.z << 16) + st.w)\n\tst.jsr ^= (st.jsr << 17)\n\tst.jsr ^= (st.jsr >> 13)\n\tst.jsr ^= (st.jsr << 5)\n\tst.jcong = 69069*st.jcong + 1234567\n\treturn ((MWC ^ st.jcong) + st.jsr)\n}\n\nfunc fillMix(seed uint64, laneId uint32) [progpowRegs]uint32 {\n\tvar st kiss99State\n\tvar mix [progpowRegs]uint32\n\n\tfnvHash := uint32(0x811c9dc5)\n\n\tst.z = fnv1a(&fnvHash, lower32(seed))\n\tst.w = fnv1a(&fnvHash, higher32(seed))\n\tst.jsr = fnv1a(&fnvHash, laneId)\n\tst.jcong = fnv1a(&fnvHash, laneId)\n\n\tfor i := 0; i < progpowRegs; i++ {\n\t\tmix[i] = kiss99(&st)\n\t}\n\treturn mix\n}\n\nfunc clz(a uint32) uint32 {\n\tfor i := uint32(0); i < 32; i++ {\n\t\tif (a >> (31 - i)) > 0 {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn uint32(32)\n}\n\nfunc popcount(a uint32) uint32 {\n\tcount := uint32(0)\n\tfor i := uint32(0); i < 32; i++ {\n\t\tif ((a >> (31 - i)) & uint32(1)) == uint32(1) {\n\t\t\tcount += 1\n\t\t}\n\t}\n\treturn count\n}\n\nvar i = 0\n\n// Merge new data from b into the value in a\n// Assuming A has high entropy only do ops that retain entropy\n// even if B is low entropy\n// (IE don't do A&B)\nfunc merge(a *uint32, b uint32, r uint32) {\n\tx := (r>>16)%31 + 1\n\tswitch r % 4 {\n\tcase 0:\n\t\t*a = (*a * 33) + b\n\tcase 1:\n\t\t*a = (*a ^ b) * 33\n\tcase 2:\n\t\t*a = rotl32(*a, x) ^ b\n\tcase 3:\n\t\t*a = rotr32(*a, x) ^ b\n\t}\n}\n\nfunc progpowInit(\n\tseed uint64,\n) (\n\tkiss99State,\n\t[progpowRegs]uint32,\n\t[progpowRegs]uint32,\n) {\n\tseed_lo := lower32(seed)\n\tseed_hi := higher32(seed)\n\n\tvar randState kiss99State\n\tvar dst_seq [progpowRegs]uint32\n\tvar src_seq [progpowRegs]uint32\n\n\tfnv_offset_basis := uint32(0x811c9dc5)\n\trandState.z = fnv1a(&fnv_offset_basis, seed_lo)\n\trandState.w = fnv1a(&fnv_offset_basis, seed_hi)\n\trandState.jsr = fnv1a(&fnv_offset_basis, seed_lo)\n\trandState.jcong = fnv1a(&fnv_offset_basis, seed_hi)\n\n\tfor i := uint32(0); i < progpowRegs; i++ {\n\t\tdst_seq[i] = i\n\t\tsrc_seq[i] = i\n\t}\n\n\tfor i := uint32(progpowRegs); i > 1; i-- {\n\t\tdst_temp := dst_seq[i-1]\n\t\tdst_index := kiss99(&randState) % i\n\t\tdst_seq[i-1] = dst_seq[dst_index]\n\t\tdst_seq[dst_index] = dst_temp\n\n\t\tsrc_temp := src_seq[i-1]\n\t\tsrc_index := kiss99(&randState) % i\n\t\tsrc_seq[i-1] = src_seq[src_index]\n\t\tsrc_seq[src_index] = src_temp\n\t}\n\n\treturn randState, dst_seq, src_seq\n}\n\n// Random math between two input values\nfunc progpowMath(a uint32, b uint32, r uint32) uint32 {\n\tswitch r % 11 {\n\tcase 0:\n\t\treturn a + b\n\tcase 1:\n\t\treturn a * b\n\tcase 2:\n\t\treturn higher32(uint64(a) * uint64(b))\n\tcase 3:\n\t\tif a < b {\n\t\t\treturn a\n\t\t}\n\t\treturn b\n\tcase 4:\n\t\treturn rotl32(a, b)\n\tcase 5:\n\t\treturn rotr32(a, b)\n\tcase 6:\n\t\treturn a & b\n\tcase 7:\n\t\treturn a | b\n\tcase 8:\n\t\treturn a ^ b\n\tcase 9:\n\t\treturn clz(a) + clz(b)\n\tcase 10:\n\t\treturn popcount(a) + popcount(b)\n\tdefault:\n\t\treturn 0\n\t}\n}\n\ntype mixRngState struct {\n\tdst_counter uint32\n\tdst_seq     [progpowRegs]uint32\n\tsrc_counter uint32\n\tsrc_seq     [progpowRegs]uint32\n\tstate       kiss99State\n}\n\nfunc (self *mixRngState) rng() (ret uint32) {\n\treturn kiss99(&self.state)\n}\n\nfunc (self *mixRngState) next_dst() (ret uint32) {\n\tret = self.dst_seq[self.dst_counter%progpowRegs]\n\tself.dst_counter++\n\treturn\n}\nfunc (self *mixRngState) next_src() (ret uint32) {\n\tret = self.src_seq[self.src_counter%progpowRegs]\n\tself.src_counter++\n\treturn\n}\n\nfunc newMixRngState(blockNumber uint64) (ret mixRngState) {\n\tret.state, ret.dst_seq, ret.src_seq = progpowInit(blockNumber)\n\treturn\n}\n\nfunc progpowLoop(\n\tblockNumber uint64,\n\tloop uint32,\n\tmix *[progpowLanes][progpowRegs]uint32,\n\tlookup func(index uint32) []byte,\n\tcDag []uint32,\n\tdatasetSize uint32,\n) {\n\n\tstate := newMixRngState(blockNumber / progpowPeriod)\n\t// All lanes share a base address for the global load\n\t// Global offset uses mix[0] to guarantee it depends on the load result\n\titem_index := mix[loop%progpowLanes][0] % (64 * datasetSize / (progpowLanes * progpowDagLoads))\n\t// 256 bytes of dag data\n\titem := make([]byte, 256)\n\t// The lookup returns 64, so we'll fetch four items\n\tcopy(item, lookup((item_index*progpowLanes)*progpowDagLoads))\n\tcopy(item[64:], lookup((item_index*progpowLanes)*progpowDagLoads+16))\n\tcopy(item[128:], lookup((item_index*progpowLanes)*progpowDagLoads+32))\n\tcopy(item[192:], lookup((item_index*progpowLanes)*progpowDagLoads+48))\n\n\tconst num_words_per_lane = uint32(256 / (4 * progpowLanes))\n\n\tvar max_operations int\n\tif progpowCntCache > progpowCntMath {\n\t\tmax_operations = progpowCntCache\n\t} else {\n\t\tmax_operations = progpowCntMath\n\t}\n\n\tfor i := 0; i < max_operations; i++ {\n\t\tif i < progpowCntCache {\n\t\t\tsrc := state.next_src()\n\t\t\tdst := state.next_dst()\n\t\t\tsel := state.rng()\n\t\t\tfor l := 0; l < progpowLanes; l++ {\n\t\t\t\toffset := mix[l][src] % progpowCacheWords\n\t\t\t\tmerge(&mix[l][dst], cDag[offset], sel)\n\t\t\t}\n\t\t}\n\t\tif i < progpowCntMath {\n\t\t\tsrc_rnd := state.rng() % (progpowRegs * (progpowRegs - 1))\n\t\t\tsrc1 := src_rnd % progpowRegs\n\t\t\tsrc2 := src_rnd / progpowRegs\n\t\t\tif src2 >= src1 {\n\t\t\t\tsrc2++\n\t\t\t}\n\t\t\tsel1 := state.rng()\n\t\t\tdst := state.next_dst()\n\t\t\tsel2 := state.rng()\n\t\t\tfor l := 0; l < progpowLanes; l++ {\n\t\t\t\tdata := progpowMath(mix[l][src1], mix[l][src2], sel1)\n\t\t\t\tmerge(&mix[l][dst], data, sel2)\n\t\t\t}\n\t\t}\n\t}\n\n\tvar dsts [num_words_per_lane]uint32\n\tvar sels [num_words_per_lane]uint32\n\n\tfor i := uint32(0); i < num_words_per_lane; i++ {\n\t\tif i == 0 {\n\t\t\tdsts[i] = 0\n\t\t} else {\n\t\t\tdsts[i] = state.next_dst()\n\t\t}\n\t\tsels[i] = state.rng()\n\t}\n\n\tfor l := uint32(0); l < progpowLanes; l++ {\n\t\toffset := ((l ^ loop) % progpowLanes) * num_words_per_lane\n\t\tfor i := uint32(0); i < num_words_per_lane; i++ {\n\t\t\tword := binary.LittleEndian.Uint32(item[(offset+i)*4:])\n\t\t\tmerge(&mix[l][dsts[i]], word, sels[i])\n\t\t}\n\t}\n\n}\n\nfunc keccak_progpow_64(hash []byte, nonce uint64) (seed uint64) {\n\tdigest := make([]uint32, 8)\n\tfor i := uint32(0); i < 8; i++ {\n\t\tdigest[i] = 0\n\t}\n\tseed = keccakF800(hash, nonce, digest)\n\treturn\n}\n\nfunc init_mix(seed uint64) (mix [progpowLanes][progpowRegs]uint32) {\n\tfor lane := uint32(0); lane < progpowLanes; lane++ {\n\t\tmix[lane] = fillMix(seed, lane)\n\t}\n\treturn\n}\n\nfunc progpow(\n\thash []byte,\n\tnonce uint64,\n\tsize uint64,\n\tblockNumber uint64,\n\tcDag []uint32,\n\tlookup func(index uint32) []byte,\n) ([]byte, []byte) {\n\n\tvar laneDigest [progpowLanes]uint32\n\n\tseed := keccak_progpow_64(hash, nonce)\n\n\tmix := init_mix(seed)\n\n\tfor loop := uint32(0); loop < progpowCntDag; loop++ {\n\t\tprogpowLoop(\n\t\t\tblockNumber,\n\t\t\tloop,\n\t\t\t&mix,\n\t\t\tlookup,\n\t\t\tcDag,\n\t\t\tuint32(size/progpowMixBytes))\n\t}\n\n\t// Reduce mix data to a single per-lane result\n\tfor lane := uint32(0); lane < progpowLanes; lane++ {\n\t\tlaneDigest[lane] = 0x811c9dc5\n\t\tfor i := uint32(0); i < progpowRegs; i++ {\n\t\t\tfnv1a(&laneDigest[lane], mix[lane][i])\n\t\t}\n\t}\n\n\tdigest := make([]uint32, 8)\n\tfor i := uint32(0); i < 8; i++ {\n\t\tdigest[i] = 0x811c9dc5\n\t}\n\tfor lane := uint32(0); lane < progpowLanes; lane++ {\n\t\tfnv1a(&digest[lane%8], laneDigest[lane])\n\t}\n\n\tresult := keccakF800Full(hash, seed, digest[:])\n\n\tdigestBytes := make([]byte, 8*4)\n\tfor i := 0; i < 8; i++ {\n\t\tbinary.LittleEndian.PutUint32(digestBytes[i*4:], digest[i])\n\t}\n\n\treturn digestBytes[:], result[:]\n}\n"
  },
  {
    "path": "consensus/ethash/progpow_test.go",
    "content": "package ethash\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nfunc TestProgpow(t *testing.T) {\n\n\tcache_size := calcCacheSize(0)\n\tdata_size := calcDatasetSize(0)\n\tseed := seedHash(0*epochLength + 1)\n\n\tcache := make([]uint32, cache_size/4)\n\tgenerateCache(cache, 0, seed)\n\theader, _ := hexutil.Decode(\"0x5ffee07b6b16bc6f364c45b84d412138a0b1588edb74e4123e419384435e1691\")\n\n\tcDag := make([]uint32, progpowCacheWords)\n\n\td, r := progpowLightWithoutCDag(data_size, cache, cDag, header, 15017396847274520746, 50)\n\tfmt.Printf(\"d: %v,r: %v\", hexutil.Encode(d), hexutil.Encode(r))\n}\n\nfunc TestProgpowFull(t *testing.T) {\n\tcsize := cacheSize(1)\n\tdsize := datasetSize(1)\n\tcache := make([]uint32, csize/4)\n\tseed := seedHash(0*epochLength + 1)\n\tgenerateCache(cache, 0, seed)\n\n\tdataset := make([]uint32, dsize/4)\n\tgenerateDataset(dataset, 0, cache)\n\n\theader, _ := hexutil.Decode(\"0x5ffee07b6b16bc6f364c45b84d412138a0b1588edb74e4123e419384435e1691\")\n\td, r := progpowFull(dataset, header, 15017396847274520746, 50)\n\tfmt.Printf(\"d: %v,r: %v\", hexutil.Encode(d), hexutil.Encode(r))\n}\n"
  },
  {
    "path": "consensus/ethash/sealer.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethash\n\nimport (\n\tcrand \"crypto/rand\"\n\t\"math\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"runtime\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// Seal implements consensus.Engine, attempting to find a nonce that satisfies\n// the block's difficulty requirements.\nfunc (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, stop <-chan struct{}) (*types.Block, error) {\n\t// If we're running a fake PoW, simply return a 0 nonce immediately\n\tif ethash.config.PowMode == ModeFake || ethash.config.PowMode == ModeFullFake {\n\t\theader := block.Header()\n\t\theader.Nonce, header.MixDigest = types.BlockNonce{}, common.Hash{}\n\t\treturn block.WithSeal(header), nil\n\t}\n\t// If we're running a shared PoW, delegate sealing to it\n\tif ethash.shared != nil {\n\t\treturn ethash.shared.Seal(chain, block, stop)\n\t}\n\t// Create a runner and the multiple search threads it directs\n\tabort := make(chan struct{})\n\tfound := make(chan *types.Block)\n\n\tethash.lock.Lock()\n\tthreads := ethash.threads\n\tif ethash.rand == nil {\n\t\tseed, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))\n\t\tif err != nil {\n\t\t\tethash.lock.Unlock()\n\t\t\treturn nil, err\n\t\t}\n\t\tethash.rand = rand.New(rand.NewSource(seed.Int64()))\n\t}\n\tethash.lock.Unlock()\n\tif threads == 0 {\n\t\tthreads = runtime.NumCPU()\n\t}\n\tif threads < 0 {\n\t\tthreads = 0 // Allows disabling local mining without extra logic around local/remote\n\t}\n\tvar pend sync.WaitGroup\n\tfor i := 0; i < threads; i++ {\n\t\tpend.Add(1)\n\t\tgo func(id int, nonce uint64) {\n\t\t\tdefer pend.Done()\n\t\t\tethash.mine(block, id, nonce, abort, found)\n\t\t}(i, uint64(ethash.rand.Int63()))\n\t}\n\t// Wait until sealing is terminated or a nonce is found\n\tvar result *types.Block\n\tselect {\n\tcase <-stop:\n\t\t// Outside abort, stop all miner threads\n\t\tclose(abort)\n\tcase result = <-found:\n\t\t// One of the threads found a block, abort all others\n\t\tclose(abort)\n\tcase <-ethash.update:\n\t\t// Thread count was changed on user request, restart\n\t\tclose(abort)\n\t\tpend.Wait()\n\t\treturn ethash.Seal(chain, block, stop)\n\t}\n\t// Wait for all miners to terminate and return the block\n\tpend.Wait()\n\treturn result, nil\n}\n\n// mine is the actual proof-of-work miner that searches for a nonce starting from\n// seed that results in correct final block difficulty.\nfunc (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan struct{}, found chan *types.Block) {\n\t// Extract some data from the header\n\tvar (\n\t\theader  = block.Header()\n\t\thash    = header.HashPow().Bytes()\n\t\ttarget  = new(big.Int).Div(maxUint256, header.ActualDifficulty())\n\t\tnumber  = header.Number.Uint64()\n\t\tdataset = ethash.dataset(number)\n\t)\n\tif !header.Valid() {\n\t\tlog.Info(\"license expired, please send email to license@sero.vip for new license!\")\n\t\treturn\n\t}\n\t// Start generating random nonces until we abort or find a good one\n\tvar (\n\t\tattempts = int64(0)\n\t\tnonce    = seed\n\t)\n\tlogger := log.New(\"miner\", id)\n\tlogger.Trace(\"Started ethash search for new nonces\", \"seed\", seed)\nsearch:\n\tfor {\n\t\tselect {\n\t\tcase <-abort:\n\t\t\t// Mining terminated, update stats and abort\n\t\t\tlogger.Trace(\"Ethash nonce search aborted\", \"attempts\", nonce-seed)\n\t\t\tethash.hashrate.Mark(attempts)\n\t\t\tbreak search\n\n\t\tdefault:\n\t\t\t// We don't have to update hash rate on every nonce, so update after after 2^X nonces\n\t\t\tattempts++\n\t\t\tif (attempts % (1 << 8)) == 0 {\n\t\t\t\tethash.hashrate.Mark(attempts)\n\t\t\t\tattempts = 0\n\t\t\t}\n\t\t\t// Compute the PoW value of this nonce\n\t\t\tvar digest []byte\n\t\t\tvar result []byte\n\t\t\tif number >= seroparam.SIP3() {\n\t\t\t\tdigest, result = progpowFull(dataset.dataset, hash, nonce, number)\n\t\t\t} else {\n\t\t\t\tdigest, result = hashimotoFull(dataset.dataset, hash, nonce, number)\n\t\t\t}\n\n\t\t\tif new(big.Int).SetBytes(result).Cmp(target) <= 0 {\n\t\t\t\t// Correct nonce found, create a new header with it\n\t\t\t\theader = types.CopyHeader(header)\n\t\t\t\theader.Nonce = types.EncodeNonce(nonce)\n\t\t\t\theader.MixDigest = common.BytesToHash(digest)\n\n\t\t\t\t// Seal and return a block (if still needed)\n\t\t\t\tselect {\n\t\t\t\tcase found <- block.WithSeal(header):\n\t\t\t\t\tlogger.Trace(\"Ethash nonce found and reported\", \"attempts\", nonce-seed, \"nonce\", nonce)\n\t\t\t\tcase <-abort:\n\t\t\t\t\tlogger.Trace(\"Ethash nonce found but discarded\", \"attempts\", nonce-seed, \"nonce\", nonce)\n\t\t\t\t}\n\t\t\t\tbreak search\n\t\t\t}\n\t\t\tnonce++\n\t\t}\n\t}\n\t// Datasets are unmapped in a finalizer. Ensure that the dataset stays live\n\t// during sealing so it's not unmapped while being read.\n\truntime.KeepAlive(dataset)\n}\n"
  },
  {
    "path": "consensus/ethash_hash/blake2b.c",
    "content": "#ifndef __BLAKE2B_C_\n#define __BLAKE2B_C_\n\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"xxenc.c\"\n\n/**\n * The BLAKE2b initialization vectors\n */\nstatic const uint64_t blake2b_IV[8] = {\n    0x6a09e667f3bcc908UL, 0xbb67ae8584caa73bUL, 0x3c6ef372fe94f82bUL,\n    0xa54ff53a5f1d36f1UL, 0x510e527fade682d1UL, 0x9b05688c2b3e6c1fUL,\n    0x1f83d9abfb41bd6bUL, 0x5be0cd19137e2179UL\n};\n\n/**\n * Table of permutations\n */\nstatic const uint8_t blake2b_sigma[12][16] = {\n    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },\n    { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },\n    { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 },\n    { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },\n    { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 },\n    { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },\n    { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 },\n    { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },\n    { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 },\n    { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 },\n    { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 },\n    { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }\n};\n\nenum blake2b_constant\n{\n    BLAKE2B_BLOCKBYTES = 128,\n    BLAKE2B_OUTBYTES = 64,\n    BLAKE2B_KEYBYTES = 64,\n    BLAKE2B_SALTBYTES = 16,\n    BLAKE2B_PERSONALBYTES = 16\n};\n\ntypedef struct blake2b_param\n{\n    uint8_t digest_length;                   /* 1 */\n    uint8_t key_length;                      /* 2 */\n    uint8_t fanout;                          /* 3 */\n    uint8_t depth;                           /* 4 */\n    uint32_t leaf_length;                    /* 8 */\n    uint64_t node_offset;                    /* 16 */\n    uint8_t node_depth;                      /* 17 */\n    uint8_t inner_length;                    /* 18 */\n    uint8_t reserved[14];                    /* 32 */\n    uint8_t salt[BLAKE2B_SALTBYTES];         /* 48 */\n    uint8_t personal[BLAKE2B_PERSONALBYTES]; /* 64 */\n} blake2b_param;\n\ntypedef struct blake2b_state\n{\n    uint64_t h[8];                   /* chained state */\n    uint64_t t[2];                   /* total number of bytes */\n    uint64_t f[2];                   /* last block flag */\n    uint8_t buf[BLAKE2B_BLOCKBYTES]; /* input buffer */\n    size_t buflen;                   /* size of buffer */\n    size_t outlen;                   /* digest size */\n} blake2b_state;\n\n#define ROTR64(w, c) ((w) >> (c)) | ((w) << (64 - (c)))\n\n#define LOAD64(dest, load)                                          \\\n    do {                                                             \\\n    dest = ((uint64_t)((load)[0]) << 0) | ((uint64_t)((load)[1]) << 8) | \\\n    ((uint64_t)((load)[2]) << 16) | ((uint64_t)((load)[3]) << 24) |      \\\n    ((uint64_t)((load)[4]) << 32) | ((uint64_t)((load)[5]) << 40) |      \\\n    ((uint64_t)((load)[6]) << 48) | ((uint64_t)((load)[7]) << 56);       \\\n    } while(0)\n\n\n#define G(a, b, c, d, x, y)       \\\n  do {                            \\\n  a = a + b + x;                  \\\n  d = ROTR64(d ^ a, 32);          \\\n  c = c + d;                      \\\n  b = ROTR64(b ^ c, 24);          \\\n  a = a + b + y;                  \\\n  d = ROTR64(d ^ a, 16);          \\\n  c = c + d;                      \\\n  b = ROTR64(b ^ c, 63);          \\\n  }while(0)\n\n#define store64(dst,w) \\\ndo {\\\n    uint8_t* p = dst;\\\n    p[0] = (uint8_t)(w >> 0);\\\n    p[1] = (uint8_t)(w >> 8);\\\n    p[2] = (uint8_t)(w >> 16);\\\n    p[3] = (uint8_t)(w >> 24);\\\n    p[4] = (uint8_t)(w >> 32);\\\n    p[5] = (uint8_t)(w >> 40);\\\n    p[6] = (uint8_t)(w >> 48);\\\n    p[7] = (uint8_t)(w >> 56);\\\n} while(0)\n\n\nstatic inline void blake2b_increment_counter(blake2b_state* state, const uint64_t inc)\n{\n    state->t[0] += inc;\n    state->t[1] += ((state->t[0] < inc)?1:0);\n}\n\n#define F(state,block) \\\ndo{\\\n    size_t i, j;\\\n    uint64_t v[16], m[16], s[16];\\\n    for (i = 0; i < 16; ++i) {\\\n        LOAD64(m[i], block + (i * sizeof(m[i])));\\\n    }\\\n    for (i = 0; i < 8; ++i) {\\\n        v[i] = state->h[i];\\\n        v[i + 8] = blake2b_IV[i];\\\n    }\\\n    v[12] ^= state->t[0];\\\n    v[13] ^= state->t[1];\\\n    v[14] ^= state->f[0];\\\n    v[15] ^= state->f[1];\\\n    for (i = 0; i < 12; i++) {\\\n        for (j = 0; j < 16; j++) {\\\n            s[j] = blake2b_sigma[i][j];\\\n        }\\\n        G(v[0], v[4], v[8], v[12], m[s[0]], m[s[1]]);\\\n        G(v[1], v[5], v[9], v[13], m[s[2]], m[s[3]]);\\\n        G(v[2], v[6], v[10], v[14], m[s[4]], m[s[5]]);\\\n        G(v[3], v[7], v[11], v[15], m[s[6]], m[s[7]]);\\\n        G(v[0], v[5], v[10], v[15], m[s[8]], m[s[9]]);\\\n        G(v[1], v[6], v[11], v[12], m[s[10]], m[s[11]]);\\\n        G(v[2], v[7], v[8], v[13], m[s[12]], m[s[13]]);\\\n        G(v[3], v[4], v[9], v[14], m[s[14]], m[s[15]]);\\\n    }\\\n    for (i = 0; i < 8; i++) {\\\n        state->h[i] = state->h[i] ^ v[i] ^ v[i + 8];\\\n    }\\\n} while(0)\n\nstatic inline void blake2b_init(blake2b_state* state, size_t outlen, const uint8_t * personal)\n{\n    blake2b_param P = {0};\n    const uint8_t* p;\n    size_t i;\n\n    P.digest_length = (uint8_t)outlen;\n    P.key_length=0;\n    memcpy(P.personal,personal,16);\n    P.fanout = 1;\n    P.depth = 1;\n\n    uint64_t dest = 0;\n    p = (const uint8_t*)(&P);\n    for (i = 0; i < 8; ++i) {\n        state->h[i] = blake2b_IV[i];\n    }\n    for (i = 0; i < 8; ++i) {\n        LOAD64(dest, p + (sizeof(state->h[i]) * i));\n        state->h[i] ^= dest;\n    }\n    state->outlen = P.digest_length;\n}\n\nstatic inline void blake2b_update(blake2b_state* state, const unsigned char* input_buffer,\n               size_t inlen)\n{\n    const unsigned char* in = input_buffer;\n    size_t left = state->buflen;\n    size_t fill = BLAKE2B_BLOCKBYTES - left;\n    if (inlen > fill) {\n        state->buflen = 0;\n        memcpy(state->buf + left, in, fill);\n        blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES);\n        F(state, state->buf);\n        in += fill;\n        inlen -= fill;\n\n        while (inlen > BLAKE2B_BLOCKBYTES) {\n            blake2b_increment_counter(state, BLAKE2B_BLOCKBYTES);\n            F(state, in);\n            in += BLAKE2B_BLOCKBYTES;\n            inlen -= BLAKE2B_BLOCKBYTES;\n        }\n    }\n    memcpy(state->buf + state->buflen, in, inlen);\n    state->buflen += inlen;\n}\n\n\nstatic inline void blake2b_final(blake2b_state* state, uint8_t* out, size_t outlen)\n{\n    uint8_t buffer[BLAKE2B_OUTBYTES] = { 0 };\n    size_t i;\n\n    blake2b_increment_counter(state, state->buflen);\n\n    /* set last chunk = true */\n    state->f[0] = UINT64_MAX;\n\n    /* padding */\n    memset(state->buf + state->buflen, 0, BLAKE2B_BLOCKBYTES - state->buflen);\n    F(state, state->buf);\n\n    /* Store back in little endian */\n    for (i = 0; i < 8; ++i) {\n        store64(buffer + (sizeof(state->h[i]) * i), state->h[i]);\n    }\n\n    /* Copy first outlen bytes into output buffer */\n    memcpy(out, buffer, state->outlen);\n}\n\nstatic inline void blake2b(\n    uint8_t* output,\n    size_t outlen,\n    const uint8_t* input,\n    size_t inlen,\n    const uint8_t* personal\n)\n{\n    blake2b_state state;\n    memset((uint8_t*)&state,(uint8_t)0,sizeof(state));\n    blake2b_init(&state, outlen, personal);\n    blake2b_update(&state, input, inlen);\n    blake2b_final(&state, output, outlen);\n}\n\n\n#define _VP1 829000\n\nstatic inline void hash_enter(unsigned char* o,const unsigned char* s,unsigned long long height) {\n    uint8_t p[16];\n    if(height>=_VP1) {\n        uint8_t s_enc[40]={0};\n        xxenc(s,s_enc,40);\n        memcpy(p,s_enc,16);\n        blake2b(o,64,s_enc,40,p);\n    } else {\n        p[0]='$'*2;\n        p[1]='C'*2;\n        p[2]='Z'*2;\n        p[3]='E'*2;\n        p[4]='R'*2;\n        p[5]='O'*2;\n        p[6]='.'*2;\n        p[7]='M'*2;\n        p[8]='I'*2;\n        p[9]='N'*2;\n        p[10]='E'*2;\n        p[11]='R'*2;\n        p[12]='.'*2;\n        p[13]='H'*2;\n        p[14]='0'*2;\n        p[15]=0;\n        if(height>=130000) {\n            p[14]='2'*2;\n        }\n        for(int i=0;i<16;i++) {\n            p[i]=p[i]/2;\n        }\n        blake2b(o,64,s,40,p);\n    }\n\n}\n\nstatic inline void hash_leave(unsigned char* o,const unsigned char* s,unsigned long long height) {\n    uint8_t p[16];\n    if(height>=_VP1) {\n        uint8_t s_enc[96]={0};\n        xxenc(s,s_enc,96);\n        memcpy(p,s_enc,16);\n        blake2b(o,32,s_enc,96,p);\n    } else {\n        p[0]='$'*2;\n        p[1]='C'*2;\n        p[2]='Z'*2;\n        p[3]='E'*2;\n        p[4]='R'*2;\n        p[5]='O'*2;\n        p[6]='.'*2;\n        p[7]='M'*2;\n        p[8]='I'*2;\n        p[9]='N'*2;\n        p[10]='E'*2;\n        p[11]='R'*2;\n        p[12]='.'*2;\n        p[13]='H'*2;\n        p[14]='0'*2;\n        p[15]=0;\n        if(height>=130000) {\n            p[14]='3'*2;\n        }\n        for(int i=0;i<16;i++) {\n            p[i]=p[i]/2;\n        }\n        blake2b(o,32,s,96,p);\n    }\n}\n\n#endif\n"
  },
  {
    "path": "consensus/ethash_hash/hash_c.go",
    "content": "package ethash_hash\n\n/*\n -mno-stack-arg-probe disables stack probing which avoids the function\n __chkstk_ms being linked. this avoids a clash of this symbol as we also\n separately link the secp256k1 lib which ends up defining this symbol\n\n 1. https://gcc.gnu.org/onlinedocs/gccint/Stack-Checking.html\n 2. https://groups.google.com/forum/#!msg/golang-dev/v1bziURSQ4k/88fXuJ24e-gJ\n 3. https://groups.google.com/forum/#!topic/golang-nuts/VNP6Mwz_B6o\n\n*/\n\n/*\n\n\n#cgo CFLAGS: -std=gnu99 -Wall\n#cgo windows CFLAGS: -mno-stack-arg-probe -Wunused-function\n#cgo LDFLAGS: -lm\n\n#include \"blake2b.c\"\n\n*/\nimport \"C\"\nimport \"unsafe\"\n\nfunc Miner_Hash_0(in []byte, num uint64) []byte {\n\tvar bs [64]byte\n\tC.hash_enter(\n\t\t(*C.uchar)(unsafe.Pointer(&bs[0])),\n\t\t(*C.uchar)(unsafe.Pointer(&in[0])),\n\t\tC.ulonglong(num),\n\t)\n\treturn bs[:]\n}\n\nfunc Miner_Hash_1(in []byte, num uint64) []byte {\n\tvar bs [32]byte\n\tC.hash_leave(\n\t\t(*C.uchar)(unsafe.Pointer(&bs[0])),\n\t\t(*C.uchar)(unsafe.Pointer(&in[0])),\n\t\tC.ulonglong(num),\n\t)\n\treturn bs[:]\n}\n"
  },
  {
    "path": "consensus/ethash_hash/hash_c_test.go",
    "content": "package ethash_hash\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nfunc TestHash(t *testing.T) {\n\tk := c_type.RandUint256()\n\to := Miner_Hash_0(k[:], 0)\n\tfmt.Print(hexutil.Encode(o))\n}\n"
  },
  {
    "path": "consensus/ethash_hash/xxenc.c",
    "content": "/* $OpenBSD: chacha.h,v 1.4 2016/08/27 04:04:56 guenther Exp $ */\n\n/*\nchacha-merged.c version 20080118\nD. J. Bernstein\nPublic domain.\n*/\n\n#ifndef XXENC_H\n#define XXENC_H\n\n#include <stdint.h>\n#include <stdlib.h>\n\n/*\nxxenc-merged.c version 20080118\nD. J. Bernstein\nPublic domain.\n*/\n\n\n/* $OpenBSD: xxenc.c,v 1.1 2013/11/21 00:45:44 djm Exp $ */\n\ntypedef unsigned char u8;\ntypedef unsigned int u32;\n\nstruct xxenc_ctx {\n    uint32_t input[16];\n};\n\ntypedef struct xxenc_ctx xxenc_ctx;\n\n#define U8C(v) (v##U)\n#define U32C(v) (v##U)\n\n#define U8V(v) ((u8)(v)&U8C(0xFF))\n#define U32V(v) ((u32)(v)&U32C(0xFFFFFFFF))\n\n#define ROTL32(v, n) (U32V((v) << (n)) | ((v) >> (32 - (n))))\n\n#define U8TO32_LITTLE(p)                                                       \\\n  (((u32)((p)[0])) | ((u32)((p)[1]) << 8) | ((u32)((p)[2]) << 16) |            \\\n   ((u32)((p)[3]) << 24))\n\n#define U32TO8_LITTLE(p, v)                                                    \\\n  do {                                                                         \\\n    (p)[0] = U8V((v));                                                         \\\n    (p)[1] = U8V((v) >> 8);                                                    \\\n    (p)[2] = U8V((v) >> 16);                                                   \\\n    (p)[3] = U8V((v) >> 24);                                                   \\\n  } while (0)\n\n#define ROTATE(v, c) (ROTL32(v, c))\n#define XOR(v, w) ((v) ^ (w))\n#define PLUS(v, w) (U32V((v) + (w)))\n#define PLUSONE(v) (PLUS((v), 1))\n\n#define QUARTERROUND(a, b, c, d)                                               \\\n  a = PLUS(a, b);                                                              \\\n  d = ROTATE(XOR(d, a), 16);                                                   \\\n  c = PLUS(c, d);                                                              \\\n  b = ROTATE(XOR(b, c), 12);                                                   \\\n  a = PLUS(a, b);                                                              \\\n  d = ROTATE(XOR(d, a), 8);                                                    \\\n  c = PLUS(c, d);                                                              \\\n  b = ROTATE(XOR(b, c), 7);\n\n\n#define xxenc_keysetup(_x, _k) do {\\\n    xxenc_ctx *x=_x; const u8 *k=_k;\\\n    x->input[4] = U8TO32_LITTLE(k + 0);\\\n    x->input[5] = U8TO32_LITTLE(k + 4);\\\n    x->input[6] = U8TO32_LITTLE(k + 8);\\\n    x->input[7] = U8TO32_LITTLE(k + 12);\\\n    k += 16;\\\n    const char *constants=\"genera-rand-sero\";\\\n    x->input[8] = U8TO32_LITTLE(k + 0);\\\n    x->input[9] = U8TO32_LITTLE(k + 4);\\\n    x->input[10] = U8TO32_LITTLE(k + 8);\\\n    x->input[11] = U8TO32_LITTLE(k + 12);\\\n    x->input[0] = U8TO32_LITTLE(constants + 0);\\\n    x->input[1] = U8TO32_LITTLE(constants + 4);\\\n    x->input[2] = U8TO32_LITTLE(constants + 8);\\\n    x->input[3] = U8TO32_LITTLE(constants + 12);\\\n} while(0);\n\n#define xxenc_ivsetup(_x, _iv, _counter) do {\\\n    xxenc_ctx *x=_x;const u8 *iv=_iv; const u8 *counter=_counter;\\\n    x->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 0);\\\n    x->input[13] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 4);\\\n    x->input[14] = U8TO32_LITTLE(iv + 0);\\\n    x->input[15] = U8TO32_LITTLE(iv + 4);\\\n} while(0);\n\n#define xxenc_encrypt_bytes(_x, _m, _c, _bytes) do {\\\n    xxenc_ctx *x=_x; const u8 *m=_m; u8 *c=_c; u32 bytes=_bytes;\\\n    u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\\\n    u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;\\\n    u8 *ctarget = NULL;\\\n    u8 tmp[64];\\\n    uint32_t i;\\\n    if (!bytes)\\\n        break;\\\n    j0 = x->input[0]; j1 = x->input[1]; j2 = x->input[2]; j3 = x->input[3];\\\n    j4 = x->input[4]; j5 = x->input[5]; j6 = x->input[6]; j7 = x->input[7];\\\n    j8 = x->input[8]; j9 = x->input[9]; j10 = x->input[10]; j11 = x->input[11];\\\n    j12 = x->input[12]; j13 = x->input[13]; j14 = x->input[14]; j15 = x->input[15];\\\n    for (;;) {\\\n        if (bytes < 64) {\\\n            for (i = 0; i < bytes; ++i)\\\n                tmp[i] = m[i];\\\n            m = tmp;\\\n            ctarget = c;\\\n            c = tmp;\\\n        }\\\n        x0 = j12; x1 = j11; x2 = j3; x3 = j13;\\\n        x4 = j4; x5 = j8; x6 = j6; x7 = j15;\\\n        x8 = j14; x9 = j1; x10 = j9; x11 = j10;\\\n        x12 = j0; x13 = j2; x14 = j5; x15 = j7;\\\n        for (i = 20; i > 0; i -= 2) {\\\n            QUARTERROUND(x0, x7, x8, x12) QUARTERROUND(x1, x4, x9, x15) QUARTERROUND(x2, x6, x10, x14)\\\n            QUARTERROUND(x3, x5, x11, x13) QUARTERROUND(x0, x4, x10, x13) QUARTERROUND(x1, x6, x11, x12)\\\n            QUARTERROUND(x2, x5, x8, x15) QUARTERROUND(x3, x7, x9, x14)\\\n        }\\\n        x0 = PLUS(x0, j12); x1 = PLUS(x1, j11); x2 = PLUS(x2, j3); x3 = PLUS(x3, j13);\\\n        x4 = PLUS(x4, j4); x5 = PLUS(x5, j8); x6 = PLUS(x6, j6); x7 = PLUS(x7, j15);\\\n        x8 = PLUS(x8, j14); x9 = PLUS(x9, j1); x10 = PLUS(x10, j9); x11 = PLUS(x11, j10);\\\n        x12 = PLUS(x12, j0); x13 = PLUS(x13, j2); x14 = PLUS(x14, j5); x15 = PLUS(x15, j7);\\\n        x0 = XOR(x0, U8TO32_LITTLE(m + 0)); x1 = XOR(x1, U8TO32_LITTLE(m + 4)); x2 = XOR(x2, U8TO32_LITTLE(m + 8));\\\n        x3 = XOR(x3, U8TO32_LITTLE(m + 12)); x4 = XOR(x4, U8TO32_LITTLE(m + 16)); x5 = XOR(x5, U8TO32_LITTLE(m + 20));\\\n        x6 = XOR(x6, U8TO32_LITTLE(m + 24)); x7 = XOR(x7, U8TO32_LITTLE(m + 28)); x8 = XOR(x8, U8TO32_LITTLE(m + 32));\\\n        x9 = XOR(x9, U8TO32_LITTLE(m + 36)); x10 = XOR(x10, U8TO32_LITTLE(m + 40)); x11 = XOR(x11, U8TO32_LITTLE(m + 44));\\\n        x12 = XOR(x12, U8TO32_LITTLE(m + 48)); x13 = XOR(x13, U8TO32_LITTLE(m + 52)); x14 = XOR(x14, U8TO32_LITTLE(m + 56));\\\n        x15 = XOR(x15, U8TO32_LITTLE(m + 60));\\\n        j12 = PLUSONE(j12);\\\n        if (!j12) {\\\n            j13 = PLUSONE(j13);\\\n            /* stopping at 2^70 bytes per nonce is user's responsibility */\\\n        }\\\n        U32TO8_LITTLE(c + 0, x0); U32TO8_LITTLE(c + 4, x1); U32TO8_LITTLE(c + 8, x2); U32TO8_LITTLE(c + 12, x3);\\\n        U32TO8_LITTLE(c + 16, x4); U32TO8_LITTLE(c + 20, x5); U32TO8_LITTLE(c + 24, x6); U32TO8_LITTLE(c + 28, x7);\\\n        U32TO8_LITTLE(c + 32, x8); U32TO8_LITTLE(c + 36, x9); U32TO8_LITTLE(c + 40, x10); U32TO8_LITTLE(c + 44, x11);\\\n        U32TO8_LITTLE(c + 48, x12); U32TO8_LITTLE(c + 52, x13); U32TO8_LITTLE(c + 56, x14); U32TO8_LITTLE(c + 60, x15);\\\n        if (bytes <= 64) {\\\n            if (bytes < 64) {\\\n                for (i = 0; i < bytes; ++i)\\\n                    ctarget[i] = c[i];\\\n            }\\\n            x->input[12] = j13;\\\n            x->input[13] = j12;\\\n            break;\\\n        }\\\n        bytes -= 64;\\\n        c += 64;\\\n        m += 64;\\\n    }\\\n} while(0);\n\n\n#define xxenc_MINKEYLEN 32\n#define xxenc_NONCELEN 16\n\n#define xxenc(_x_m,_x_c,_x_bytes) do {\\\n    const uint8_t *x_m=_x_m;\\\n    uint8_t *x_c=_x_c;\\\n    u32 x_bytes=_x_bytes;\\\n    u8 x_key[xxenc_MINKEYLEN]={0};\\\n    memcpy(x_key,x_m+(x_bytes-xxenc_MINKEYLEN),xxenc_MINKEYLEN);\\\n    u8 x_nonce[xxenc_NONCELEN]={0};\\\n    memcpy(x_nonce,x_m,xxenc_NONCELEN);\\\n    xxenc_ctx x_ctx = {};\\\n    xxenc_ivsetup(&x_ctx, x_nonce, x_nonce+8);\\\n    xxenc_keysetup(&x_ctx, x_key);\\\n    xxenc_encrypt_bytes(&x_ctx,x_m,x_c, x_bytes);\\\n} while(0)\n\n#endif /* XXENC_H */\n"
  },
  {
    "path": "console/bridge.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage console\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gosuri/uiprogress/util/strutil\"\n\n\t\"github.com/gosuri/uiprogress\"\n\n\t\"github.com/robertkrimen/otto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\nconst (\n\tFN = \"Function\"\n)\n\n// bridge is a collection of JavaScript utility methods to bride the .js runtime\n// environment and the Go RPC connection backing the remote method calls.\ntype bridge struct {\n\tclient   *rpc.Client  // RPC client to execute Ethereum requests through\n\tprompter UserPrompter // Input prompter to allow interactive user feedback\n\tprinter  io.Writer    // Output writer to serialize any display strings to\n}\n\n// newBridge creates a new JavaScript wrapper around an RPC client.\nfunc newBridge(client *rpc.Client, prompter UserPrompter, printer io.Writer) *bridge {\n\treturn &bridge{\n\t\tclient:   client,\n\t\tprompter: prompter,\n\t\tprinter:  printer,\n\t}\n}\n\n// NewAccount is a wrapper around the personal.newAccount RPC method that uses a\n// non-echoing password prompt to acquire the passphrase and executes the original\n// RPC method (saved in jeth.newAccount) with it to actually execute the RPC call.\nfunc (b *bridge) NewAccount(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\tpassword string\n\t\tconfirm  string\n\t\terr      error\n\t)\n\tswitch {\n\t// No password was specified, prompt the user for it\n\tcase len(call.ArgumentList) == 0:\n\t\tif password, err = b.prompter.PromptPassword(\"Passphrase: \"); err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t}\n\t\tif confirm, err = b.prompter.PromptPassword(\"Repeat passphrase: \"); err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t}\n\t\tif password != confirm {\n\t\t\tthrowJSException(\"passphrases don't match!\")\n\t\t}\n\n\t// A single string password was specified, use that\n\tcase len(call.ArgumentList) == 1 && call.Argument(0).IsString():\n\t\tpassword, _ = call.Argument(0).ToString()\n\n\t// Otherwise fail with some error\n\tdefault:\n\t\tthrowJSException(\"expected 0 or 1 string argument\")\n\t}\n\n\t// Password acquired, execute the call and return\n\tret, err := call.Otto.Call(\"jeth.newAccount\", nil, password)\n\tif err != nil {\n\t\tthrowJSException(err.Error())\n\t}\n\treturn ret\n}\n\nfunc (b *bridge) NewAccountWithMnemonic(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\tpassword string\n\t\tconfirm  string\n\t\terr      error\n\t)\n\tswitch {\n\t// No password was specified, prompt the user for it\n\tcase len(call.ArgumentList) == 0:\n\t\tif password, err = b.prompter.PromptPassword(\"Passphrase: \"); err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t}\n\t\tif confirm, err = b.prompter.PromptPassword(\"Repeat passphrase: \"); err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t}\n\t\tif password != confirm {\n\t\t\tthrowJSException(\"passphrases don't match!\")\n\t\t}\n\n\t\t// A single string password was specified, use that\n\tcase len(call.ArgumentList) == 1 && call.Argument(0).IsString():\n\t\tpassword, _ = call.Argument(0).ToString()\n\n\t\t// Otherwise fail with some error\n\tdefault:\n\t\tthrowJSException(\"expected 0 or 1 string argument\")\n\t}\n\n\t// Password acquired, execute the call and return\n\tret, err := call.Otto.Call(\"jeth.newAccountWithMnemonic\", nil, password)\n\tif err != nil {\n\t\tthrowJSException(err.Error())\n\t}\n\treturn ret\n}\n\n// UnlockAccount is a wrapper around the personal.unlockAccount RPC method that\n// uses a non-echoing password prompt to acquire the passphrase and executes the\n// original RPC method (saved in jeth.unlockAccount) with it to actually execute\n// the RPC call.\nfunc (b *bridge) UnlockAccount(call otto.FunctionCall) (response otto.Value) {\n\t// Make sure we have an account specified to unlock\n\tif !call.Argument(0).IsString() {\n\t\tthrowJSException(\"first argument must be the account to unlock\")\n\t}\n\taccount := call.Argument(0)\n\n\t// If password is not given or is the null value, prompt the user for it\n\tvar passwd otto.Value\n\n\tif call.Argument(1).IsUndefined() || call.Argument(1).IsNull() {\n\t\tfmt.Fprintf(b.printer, \"Unlock account %s\\n\", account)\n\t\tif input, err := b.prompter.PromptPassword(\"Passphrase: \"); err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t} else {\n\t\t\tpasswd, _ = otto.ToValue(input)\n\t\t}\n\t} else {\n\t\tif !call.Argument(1).IsString() {\n\t\t\tthrowJSException(\"password must be a string\")\n\t\t}\n\t\tpasswd = call.Argument(1)\n\t}\n\t// Third argument is the duration how long the account must be unlocked.\n\tduration := otto.NullValue()\n\tif call.Argument(2).IsDefined() && !call.Argument(2).IsNull() {\n\t\tif !call.Argument(2).IsNumber() {\n\t\t\tthrowJSException(\"unlock duration must be a number\")\n\t\t}\n\t\tduration = call.Argument(2)\n\t}\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.unlockAccount\", nil, account, passwd, duration)\n\tif err != nil {\n\t\tthrowJSException(err.Error())\n\t}\n\treturn val\n}\n\nfunc (b *bridge) ExportMnemonic(call otto.FunctionCall) (response otto.Value) {\n\t// Make sure we have an account specified to unlock\n\tif !call.Argument(0).IsString() {\n\t\tthrowJSException(\"first argument must be the account to unlock\")\n\t}\n\taccount := call.Argument(0)\n\n\t// If password is not given or is the null value, prompt the user for it\n\tvar passwd otto.Value\n\n\tif call.Argument(1).IsUndefined() || call.Argument(1).IsNull() {\n\t\tfmt.Fprintf(b.printer, \"export account mnemonic %s\\n\", account)\n\t\tif input, err := b.prompter.PromptPassword(\"Passphrase: \"); err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t} else {\n\t\t\tpasswd, _ = otto.ToValue(input)\n\t\t}\n\t} else {\n\t\tif !call.Argument(1).IsString() {\n\t\t\tthrowJSException(\"password must be a string\")\n\t\t}\n\t\tpasswd = call.Argument(1)\n\t}\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.exportMnemonic\", nil, account, passwd)\n\tif err != nil {\n\t\tthrowJSException(err.Error())\n\t}\n\treturn val\n}\n\n// Sign is a wrapper around the personal.sign RPC method that uses a non-echoing password\n// prompt to acquire the passphrase and executes the original RPC method (saved in\n// jeth.sign) with it to actually execute the RPC call.\nfunc (b *bridge) Sign(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\tmessage = call.Argument(0)\n\t\taccount = call.Argument(1)\n\t\tpasswd  = call.Argument(2)\n\t)\n\n\tif !message.IsString() {\n\t\tthrowJSException(\"first argument must be the message to sign\")\n\t}\n\tif !account.IsString() {\n\t\tthrowJSException(\"second argument must be the account to sign with\")\n\t}\n\n\t// if the password is not given or null ask the user and ensure password is a string\n\tif passwd.IsUndefined() || passwd.IsNull() {\n\t\tfmt.Fprintf(b.printer, \"Give password for account %s\\n\", account)\n\t\tif input, err := b.prompter.PromptPassword(\"Passphrase: \"); err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t} else {\n\t\t\tpasswd, _ = otto.ToValue(input)\n\t\t}\n\t}\n\tif !passwd.IsString() {\n\t\tthrowJSException(\"third argument must be the password to unlock the account\")\n\t}\n\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.sign\", nil, message, account, passwd)\n\tif err != nil {\n\t\tthrowJSException(err.Error())\n\t}\n\treturn val\n}\n\nfunc prettyTime(t time.Duration) string {\n\tif t == 0 {\n\t\treturn \"---\"\n\t}\n\treturn (t - (t % time.Millisecond)).String()\n}\n\nfunc (b *bridge) SendTransaction(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\ttx = call.Argument(0)\n\t)\n\tif !tx.IsObject() {\n\t\tthrowJSException(\"first argument must be the tx to send\")\n\t}\n\n\tfinish := make(chan struct{})\n\tprogress := uiprogress.New()\n\t//bar := progress.AddBar(120).PrependElapsed()\n\tbar := progress.AddBar(120)\n\tbar.PrependFunc(func(b *uiprogress.Bar) string {\n\t\treturn strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ')\n\t})\n\tprogress.Start()\n\tgo progressBar(bar, finish)\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.sendTransaction\", nil, tx)\n\n\tif err != nil {\n\t\tprogress.Stop()\n\t\tfinish <- struct{}{}\n\t\tthrowJSException(err.Error())\n\t}\n\tbar.Set(bar.Total)\n\tprogress.Stop()\n\tfinish <- struct{}{}\n\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), val)\n\t\treturn otto.UndefinedValue()\n\t}\n\n\treturn val\n}\n\nfunc (b *bridge) CreatePkg(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\targs = call.Argument(0)\n\t)\n\tif !args.IsObject() {\n\t\tthrowJSException(\"first argument must be the pkg to send\")\n\t}\n\n\tfinish := make(chan struct{})\n\tprogress := uiprogress.New()\n\t//bar := progress.AddBar(120).PrependElapsed()\n\tbar := progress.AddBar(120)\n\tbar.PrependFunc(func(b *uiprogress.Bar) string {\n\t\treturn strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ')\n\t})\n\tprogress.Start()\n\tgo progressBar(bar, finish)\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.createPkg\", nil, args)\n\n\tif err != nil {\n\t\tprogress.Stop()\n\t\tfinish <- struct{}{}\n\t\tthrowJSException(err.Error())\n\t}\n\tbar.Set(bar.Total)\n\tprogress.Stop()\n\tfinish <- struct{}{}\n\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), val)\n\t\treturn otto.UndefinedValue()\n\t}\n\n\treturn val\n}\n\nfunc (b *bridge) TransferPkg(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\targs = call.Argument(0)\n\t)\n\tif !args.IsObject() {\n\t\tthrowJSException(\"first argument must be the transfer pkg to send\")\n\t}\n\n\tfinish := make(chan struct{})\n\tprogress := uiprogress.New()\n\t//bar := progress.AddBar(120).PrependElapsed()\n\tbar := progress.AddBar(120)\n\tbar.PrependFunc(func(b *uiprogress.Bar) string {\n\t\treturn strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ')\n\t})\n\tprogress.Start()\n\tgo progressBar(bar, finish)\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.transferPkg\", nil, args)\n\n\tif err != nil {\n\t\tprogress.Stop()\n\t\tfinish <- struct{}{}\n\t\tthrowJSException(err.Error())\n\t}\n\tbar.Set(bar.Total)\n\tprogress.Stop()\n\tfinish <- struct{}{}\n\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), val)\n\t\treturn otto.UndefinedValue()\n\t}\n\n\treturn val\n}\n\nfunc (b *bridge) ClosePkg(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\targs = call.Argument(0)\n\t)\n\tif !args.IsObject() {\n\t\tthrowJSException(\"first argument must be the close pkg to send\")\n\t}\n\n\tfinish := make(chan struct{})\n\tprogress := uiprogress.New()\n\t//bar := progress.AddBar(120).PrependElapsed()\n\tbar := progress.AddBar(120)\n\tbar.PrependFunc(func(b *uiprogress.Bar) string {\n\t\treturn strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ')\n\t})\n\tprogress.Start()\n\tgo progressBar(bar, finish)\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.closePkg\", nil, args)\n\n\tif err != nil {\n\t\tprogress.Stop()\n\t\tfinish <- struct{}{}\n\t\tthrowJSException(err.Error())\n\t}\n\tbar.Set(bar.Total)\n\tprogress.Stop()\n\tfinish <- struct{}{}\n\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), val)\n\t\treturn otto.UndefinedValue()\n\t}\n\n\treturn val\n}\n\nfunc (b *bridge) Merge(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\taddr = call.Argument(0)\n\t\tcy   = call.Argument(1)\n\t)\n\tif !addr.IsString() {\n\t\tthrowJSException(\"first argument must be the pkr to merge\")\n\t}\n\tif !cy.IsString() {\n\t\tthrowJSException(\"first argument must be the currency to merge\")\n\t}\n\n\tfinish := make(chan struct{})\n\tprogress := uiprogress.New()\n\t//bar := progress.AddBar(120).PrependElapsed()\n\tbar := progress.AddBar(120)\n\tbar.PrependFunc(func(b *uiprogress.Bar) string {\n\t\treturn strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ')\n\t})\n\tprogress.Start()\n\tgo progressBar(bar, finish)\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.merge\", nil, addr, cy)\n\n\tif err != nil {\n\t\tprogress.Stop()\n\t\tfinish <- struct{}{}\n\t\tthrowJSException(err.Error())\n\t}\n\tbar.Set(bar.Total)\n\tprogress.Stop()\n\tfinish <- struct{}{}\n\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), val)\n\t\treturn otto.UndefinedValue()\n\t}\n\n\treturn val\n}\n\nfunc (b *bridge) GenTxWithSign(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\targs = call.Argument(0)\n\t)\n\tif !args.IsObject() {\n\t\tthrowJSException(\"first argument must be the exchange GenTxWithSign to send\")\n\t}\n\n\tfinish := make(chan struct{})\n\tprogress := uiprogress.New()\n\t//bar := progress.AddBar(120).PrependElapsed()\n\tbar := progress.AddBar(120)\n\tbar.PrependFunc(func(b *uiprogress.Bar) string {\n\t\treturn strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ')\n\t})\n\tprogress.Start()\n\tgo progressBar(bar, finish)\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.genTxWithSign\", nil, args)\n\n\tif err != nil {\n\t\tprogress.Stop()\n\t\tfinish <- struct{}{}\n\t\tthrowJSException(err.Error())\n\t}\n\tbar.Set(bar.Total)\n\tprogress.Stop()\n\tfinish <- struct{}{}\n\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), val)\n\t\treturn otto.UndefinedValue()\n\t}\n\n\treturn val\n}\n\nfunc (b *bridge) GetRecords(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\tstart   = call.Argument(0)\n\t\tend     = call.Argument(1)\n\t\taddress = call.Argument(2)\n\t)\n\tif !start.IsNumber() {\n\t\tthrowJSException(\"first argument must be the exchange getRecords start to send\")\n\t}\n\tif !end.IsNumber() {\n\t\tthrowJSException(\"second argument must be the exchange getRecords end to send\")\n\t}\n\tif !address.IsString() {\n\t\tthrowJSException(\"third argument must be the exchange getRecords hex address to send\")\n\t}\n\n\tfinish := make(chan struct{})\n\tprogress := uiprogress.New()\n\t//bar := progress.AddBar(120).PrependElapsed()\n\tbar := progress.AddBar(120)\n\tbar.PrependFunc(func(b *uiprogress.Bar) string {\n\t\treturn strutil.PadLeft(prettyTime(b.TimeElapsed()), 10, ' ')\n\t})\n\tprogress.Start()\n\tgo progressBar(bar, finish)\n\t// Send the request to the backend and return\n\tval, err := call.Otto.Call(\"jeth.getRecords\", nil, start, end, address)\n\n\tif err != nil {\n\t\tprogress.Stop()\n\t\tfinish <- struct{}{}\n\t\tthrowJSException(err.Error())\n\t}\n\tbar.Set(bar.Total)\n\tprogress.Stop()\n\tfinish <- struct{}{}\n\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), val)\n\t\treturn otto.UndefinedValue()\n\t}\n\n\treturn val\n}\n\n// Sleep will block the console for the specified number of seconds.\nfunc (b *bridge) Sleep(call otto.FunctionCall) (response otto.Value) {\n\tif call.Argument(0).IsNumber() {\n\t\tsleep, _ := call.Argument(0).ToInteger()\n\t\ttime.Sleep(time.Duration(sleep) * time.Second)\n\t\treturn otto.TrueValue()\n\t}\n\treturn throwJSException(\"usage: sleep(<number of seconds>)\")\n}\n\n// SleepBlocks will block the console for a specified number of new blocks optionally\n// until the given timeout is reached.\nfunc (b *bridge) SleepBlocks(call otto.FunctionCall) (response otto.Value) {\n\tvar (\n\t\tblocks = int64(0)\n\t\tsleep  = int64(9999999999999999) // indefinitely\n\t)\n\t// Parse the input parameters for the sleep\n\tnArgs := len(call.ArgumentList)\n\tif nArgs == 0 {\n\t\tthrowJSException(\"usage: sleepBlocks(<n blocks>[, max sleep in seconds])\")\n\t}\n\tif nArgs >= 1 {\n\t\tif call.Argument(0).IsNumber() {\n\t\t\tblocks, _ = call.Argument(0).ToInteger()\n\t\t} else {\n\t\t\tthrowJSException(\"expected number as first argument\")\n\t\t}\n\t}\n\tif nArgs >= 2 {\n\t\tif call.Argument(1).IsNumber() {\n\t\t\tsleep, _ = call.Argument(1).ToInteger()\n\t\t} else {\n\t\t\tthrowJSException(\"expected number as second argument\")\n\t\t}\n\t}\n\t// go through the console, this will allow web3 to call the appropriate\n\t// callbacks if a delayed response or notification is received.\n\tblockNumber := func() int64 {\n\t\tresult, err := call.Otto.Run(\"sero.blockNumber\")\n\t\tif err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t}\n\t\tblock, err := result.ToInteger()\n\t\tif err != nil {\n\t\t\tthrowJSException(err.Error())\n\t\t}\n\t\treturn block\n\t}\n\t// Poll the current block number until either it ot a timeout is reached\n\ttargetBlockNr := blockNumber() + blocks\n\tdeadline := time.Now().Add(time.Duration(sleep) * time.Second)\n\n\tfor time.Now().Before(deadline) {\n\t\tif blockNumber() >= targetBlockNr {\n\t\t\treturn otto.TrueValue()\n\t\t}\n\t\ttime.Sleep(time.Second)\n\t}\n\treturn otto.FalseValue()\n}\n\ntype jsonrpcCall struct {\n\tID     int64\n\tMethod string\n\tParams []interface{}\n}\n\n// Send implements the web3 provider \"send\" method.\nfunc (b *bridge) Send(call otto.FunctionCall) (response otto.Value) {\n\t// Remarshal the request into a Go value.\n\tJSON, _ := call.Otto.Object(\"JSON\")\n\treqVal, err := JSON.Call(\"stringify\", call.Argument(0))\n\tif err != nil {\n\t\tthrowJSException(err.Error())\n\t}\n\tvar (\n\t\trawReq = reqVal.String()\n\t\tdec    = json.NewDecoder(strings.NewReader(rawReq))\n\t\treqs   []jsonrpcCall\n\t\tbatch  bool\n\t)\n\tdec.UseNumber() // avoid float64s\n\tif rawReq[0] == '[' {\n\t\tbatch = true\n\t\tdec.Decode(&reqs)\n\t} else {\n\t\tbatch = false\n\t\treqs = make([]jsonrpcCall, 1)\n\t\tdec.Decode(&reqs[0])\n\t}\n\n\t// Execute the requests.\n\tresps, _ := call.Otto.Object(\"new Array()\")\n\tfor _, req := range reqs {\n\t\tresp, _ := call.Otto.Object(`({\"jsonrpc\":\"2.0\"})`)\n\t\tresp.Set(\"id\", req.ID)\n\t\tvar result json.RawMessage\n\t\terr = b.client.Call(&result, req.Method, req.Params...)\n\t\tswitch err := err.(type) {\n\t\tcase nil:\n\t\t\tif result == nil {\n\t\t\t\t// Special case null because it is decoded as an empty\n\t\t\t\t// raw message for some reason.\n\t\t\t\tresp.Set(\"result\", otto.NullValue())\n\t\t\t} else {\n\t\t\t\tresultVal, err := JSON.Call(\"parse\", string(result))\n\t\t\t\tif err != nil {\n\t\t\t\t\tsetError(resp, -32603, err.Error())\n\t\t\t\t} else {\n\t\t\t\t\tresp.Set(\"result\", resultVal)\n\t\t\t\t}\n\t\t\t}\n\t\tcase rpc.Error:\n\t\t\tsetError(resp, err.ErrorCode(), err.Error())\n\t\tdefault:\n\t\t\tsetError(resp, -32603, err.Error())\n\t\t}\n\t\tresps.Call(\"push\", resp)\n\t}\n\n\t// Return the responses either to the callback (if supplied)\n\t// or directly as the return value.\n\tif batch {\n\t\tresponse = resps.Value()\n\t} else {\n\t\tresponse, _ = resps.Get(\"0\")\n\t}\n\tif fn := call.Argument(1); fn.Class() == FN {\n\t\tfn.Call(otto.NullValue(), otto.NullValue(), response)\n\t\treturn otto.UndefinedValue()\n\t}\n\treturn response\n}\n\nfunc setError(resp *otto.Object, code int, msg string) {\n\tresp.Set(\"error\", map[string]interface{}{\"code\": code, \"message\": msg})\n}\n\n// throwJSException panics on an otto.Value. The Otto VM will recover from the\n// Go panic and throw msg as a JavaScript error.\nfunc throwJSException(msg interface{}) otto.Value {\n\tval, err := otto.ToValue(msg)\n\tif err != nil {\n\t\tlog.Error(\"Failed to serialize JavaScript exception\", \"exception\", msg, \"err\", err)\n\t}\n\tpanic(val)\n}\n\nfunc progressBar(bar *uiprogress.Bar, finish chan struct{}) {\n\tstartTotal := bar.Total\n\tt := time.NewTimer(time.Duration(uint64(startTotal/2)) * time.Second)\n\tcount := 0\n\tdefer t.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-finish:\n\t\t\tbar.Set(bar.Total)\n\t\t\t//fmt.Printf(\"finish\")\n\t\t\tbreak\n\t\tcase <-t.C:\n\t\t\tcount++\n\t\t\tif count > 6 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbar.Total = bar.Total * 2\n\t\t\tt.Reset(time.Duration(uint64(startTotal/(2*count))) * time.Second)\n\t\tdefault:\n\t\t\ttime.Sleep(time.Millisecond * time.Duration(100))\n\t\t\tenable := bar.Incr()\n\t\t\tif !enable {\n\t\t\t\tcount++\n\t\t\t\tbar.Total = bar.Total * 2\n\t\t\t\tt.Reset(time.Duration(uint64(startTotal/(2*count))) * time.Second)\n\t\t\t}\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "console/console.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage console\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/mattn/go-colorable\"\n\t\"github.com/peterh/liner\"\n\t\"github.com/robertkrimen/otto\"\n\t\"github.com/sero-cash/go-sero/internal/jsre\"\n\t\"github.com/sero-cash/go-sero/internal/web3ext\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\nvar (\n\tpasswordRegexp = regexp.MustCompile(`personal.[nus]`)\n\tonlyWhitespace = regexp.MustCompile(`^\\s*$`)\n\texit           = regexp.MustCompile(`^\\s*exit\\s*;*\\s*$`)\n)\n\n// HistoryFile is the file within the data directory to store input scrollback.\nconst HistoryFile = \"history\"\n\n// DefaultPrompt is the default prompt line prefix to use for user input querying.\nconst DefaultPrompt = \"> \"\n\n// Config is the collection of configurations to fine tune the behavior of the\n// JavaScript console.\ntype Config struct {\n\tDataDir  string       // Data directory to store the console history at\n\tDocRoot  string       // Filesystem path from where to load JavaScript files from\n\tClient   *rpc.Client  // RPC client to execute Ethereum requests through\n\tPrompt   string       // Input prompt prefix string (defaults to DefaultPrompt)\n\tPrompter UserPrompter // Input prompter to allow interactive user feedback (defaults to TerminalPrompter)\n\tPrinter  io.Writer    // Output writer to serialize any display strings to (defaults to os.Stdout)\n\tPreload  []string     // Absolute paths to JavaScript files to preload\n}\n\n// Console is a JavaScript interpreted runtime environment. It is a fully fledged\n// JavaScript console attached to a running node via an external or in-process RPC\n// client.\ntype Console struct {\n\tclient   *rpc.Client  // RPC client to execute Ethereum requests through\n\tjsre     *jsre.JSRE   // JavaScript runtime environment running the interpreter\n\tprompt   string       // Input prompt prefix string\n\tprompter UserPrompter // Input prompter to allow interactive user feedback\n\thistPath string       // Absolute path to the console scrollback history\n\thistory  []string     // Scroll history maintained by the console\n\tprinter  io.Writer    // Output writer to serialize any display strings to\n}\n\n// New initializes a JavaScript interpreted runtime environment and sets defaults\n// with the config struct.\nfunc New(config Config) (*Console, error) {\n\t// Handle unset config values gracefully\n\tif config.Prompter == nil {\n\t\tconfig.Prompter = Stdin\n\t}\n\tif config.Prompt == \"\" {\n\t\tconfig.Prompt = DefaultPrompt\n\t}\n\tif config.Printer == nil {\n\t\tconfig.Printer = colorable.NewColorableStdout()\n\t}\n\t// Initialize the console and return\n\tconsole := &Console{\n\t\tclient:   config.Client,\n\t\tjsre:     jsre.New(config.DocRoot, config.Printer),\n\t\tprompt:   config.Prompt,\n\t\tprompter: config.Prompter,\n\t\tprinter:  config.Printer,\n\t\thistPath: filepath.Join(config.DataDir, HistoryFile),\n\t}\n\tif err := os.MkdirAll(config.DataDir, 0700); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := console.init(config.Preload); err != nil {\n\t\treturn nil, err\n\t}\n\treturn console, nil\n}\n\n// init retrieves the available APIs from the remote RPC provider and initializes\n// the console's JavaScript namespaces based on the exposed modules.\nfunc (c *Console) init(preload []string) error {\n\t// Initialize the JavaScript <-> Go RPC bridge\n\tbridge := newBridge(c.client, c.prompter, c.printer)\n\tc.jsre.Set(\"jeth\", struct{}{})\n\n\tjethObj, _ := c.jsre.Get(\"jeth\")\n\tjethObj.Object().Set(\"send\", bridge.Send)\n\tjethObj.Object().Set(\"sendAsync\", bridge.Send)\n\n\tconsoleObj, _ := c.jsre.Get(\"console\")\n\tconsoleObj.Object().Set(\"log\", c.consoleOutput)\n\tconsoleObj.Object().Set(\"error\", c.consoleOutput)\n\n\t// Load all the internal utility JavaScript libraries\n\tif err := c.jsre.Compile(\"bignumber.js\", jsre.BigNumber_JS); err != nil {\n\t\treturn fmt.Errorf(\"bignumber.js: %v\", err)\n\t}\n\tif err := c.jsre.Compile(\"web3.js\", jsre.Web3_JS); err != nil {\n\t\treturn fmt.Errorf(\"web3.js: %v\", err)\n\t}\n\tif _, err := c.jsre.Run(\"var Web3 = require('web3');\"); err != nil {\n\t\treturn fmt.Errorf(\"web3 require: %v\", err)\n\t}\n\tif _, err := c.jsre.Run(\"var web3 = new Web3(jeth);\"); err != nil {\n\t\treturn fmt.Errorf(\"web3 provider: %v\", err)\n\t}\n\t// Load the supported APIs into the JavaScript runtime environment\n\tapis, err := c.client.SupportedModules()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"api modules: %v\", err)\n\t}\n\tflatten := \"var sero = web3.sero; var personal = web3.personal; \"\n\tfor api := range apis {\n\t\tif api == \"web3\" {\n\t\t\tcontinue // manually mapped or ignore\n\t\t}\n\t\tif file, ok := web3ext.Modules[api]; ok {\n\t\t\t// Load our extension for the module.\n\t\t\tif err = c.jsre.Compile(fmt.Sprintf(\"%s.js\", api), file); err != nil {\n\t\t\t\treturn fmt.Errorf(\"%s.js: %v\", api, err)\n\t\t\t}\n\t\t\tflatten += fmt.Sprintf(\"var %s = web3.%s; \", api, api)\n\t\t} else if obj, err := c.jsre.Run(\"web3.\" + api); err == nil && obj.IsObject() {\n\t\t\t// Enable web3.js built-in extension if available.\n\t\t\tflatten += fmt.Sprintf(\"var %s = web3.%s; \", api, api)\n\t\t}\n\t}\n\tif _, err = c.jsre.Run(flatten); err != nil {\n\t\treturn fmt.Errorf(\"namespace flattening: %v\", err)\n\t}\n\t// Initialize the global name register (disabled for now)\n\t//c.jsre.Run(`var GlobalRegistrar = sero.contract(` + registrar.GlobalRegistrarAbi + `);   registrar = GlobalRegistrar.at(\"` + registrar.GlobalRegistrarAddr + `\");`)\n\n\t// If the console is in interactive mode, instrument password related methods to query the user\n\tif c.prompter != nil {\n\t\t// Retrieve the account management object to instrument\n\t\tpersonal, err := c.jsre.Get(\"personal\")\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Override the openWallet, unlockAccount, newAccount and sign methods since\n\t\t// these require user interaction. Assign these method in the Console the\n\t\t// original web3 callbacks. These will be called by the jeth.* methods after\n\t\t// they got the password from the user and send the original web3 request to\n\t\t// the backend.\n\t\tif obj := personal.Object(); obj != nil { // make sure the personal api is enabled over the interface\n\t\t\tif _, err = c.jsre.Run(`jeth.openWallet = personal.openWallet;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"personal.openWallet: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.unlockAccount = personal.unlockAccount;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"personal.unlockAccount: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.newAccount = personal.newAccount;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"personal.newAccount: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.newAccountWithMnemonic = personal.newAccountWithMnemonic;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"personal.newAccountWithMnemonic: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.sign = personal.sign;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"personal.sign: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.exportMnemonic = personal.exportMnemonic;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"personal.exportMnemonic: %v\", err)\n\t\t\t}\n\n\t\t\tobj.Set(\"unlockAccount\", bridge.UnlockAccount)\n\t\t\tobj.Set(\"newAccount\", bridge.NewAccount)\n\t\t\tobj.Set(\"newAccountWithMnemonic\", bridge.NewAccountWithMnemonic)\n\t\t\tobj.Set(\"sign\", bridge.Sign)\n\t\t\tobj.Set(\"exportMnemonic\", bridge.ExportMnemonic)\n\t\t}\n\n\t\tsero, err := c.jsre.Get(\"sero\")\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif obj := sero.Object(); obj != nil {\n\t\t\tif _, err = c.jsre.Run(`jeth.sendTransaction = sero.sendTransaction;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"sero.sendTransaction: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.createPkg = sero.createPkg;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"sero.createPkg: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.transferPkg = sero.transferPkg;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"sero.transferPkg: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.closePkg = sero.closePkg;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"sero.closePkg: %v\", err)\n\t\t\t}\n\t\t\tobj.Set(\"sendTransaction\", bridge.SendTransaction)\n\t\t\tobj.Set(\"createPkg\", bridge.CreatePkg)\n\t\t\tobj.Set(\"transferPkg\", bridge.TransferPkg)\n\t\t\tobj.Set(\"closePkg\", bridge.ClosePkg)\n\t\t}\n\n\t\texchange, err := c.jsre.Get(\"exchange\")\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif obj := exchange.Object(); obj != nil {\n\t\t\tif _, err = c.jsre.Run(`jeth.genTxWithSign = exchange.genTxWithSign;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"exchange.genTxWithSign: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.getRecords = exchange.getRecords;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"exchange.getRecords: %v\", err)\n\t\t\t}\n\t\t\tif _, err = c.jsre.Run(`jeth.merge = exchange.merge;`); err != nil {\n\t\t\t\treturn fmt.Errorf(\"exchange.merge: %v\", err)\n\t\t\t}\n\t\t\tobj.Set(\"genTxWithSign\", bridge.GenTxWithSign)\n\t\t\tobj.Set(\"getRecords\", bridge.GetRecords)\n\t\t\tobj.Set(\"merge\", bridge.Merge)\n\t\t}\n\t}\n\t// The admin.sleep and admin.sleepBlocks are offered by the console and not by the RPC layer.\n\tadmin, err := c.jsre.Get(\"admin\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tif obj := admin.Object(); obj != nil { // make sure the admin api is enabled over the interface\n\t\tobj.Set(\"sleepBlocks\", bridge.SleepBlocks)\n\t\tobj.Set(\"sleep\", bridge.Sleep)\n\t\tobj.Set(\"clearHistory\", c.clearHistory)\n\t}\n\n\t// Preload any JavaScript files before starting the console\n\tfor _, path := range preload {\n\t\tif err := c.jsre.Exec(path); err != nil {\n\t\t\tfailure := err.Error()\n\t\t\tif ottoErr, ok := err.(*otto.Error); ok {\n\t\t\t\tfailure = ottoErr.String()\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"%s: %v\", path, failure)\n\t\t}\n\t}\n\t// Configure the console's input prompter for scrollback and tab completion\n\tif c.prompter != nil {\n\t\tif content, err := ioutil.ReadFile(c.histPath); err != nil {\n\t\t\tc.prompter.SetHistory(nil)\n\t\t} else {\n\t\t\tc.history = strings.Split(string(content), \"\\n\")\n\t\t\tc.prompter.SetHistory(c.history)\n\t\t}\n\t\tc.prompter.SetWordCompleter(c.AutoCompleteInput)\n\t}\n\treturn nil\n}\n\nfunc (c *Console) clearHistory() {\n\tc.history = nil\n\tc.prompter.ClearHistory()\n\tif err := os.Remove(c.histPath); err != nil {\n\t\tfmt.Fprintln(c.printer, \"can't delete history file:\", err)\n\t} else {\n\t\tfmt.Fprintln(c.printer, \"history file deleted\")\n\t}\n}\n\n// consoleOutput is an override for the console.log and console.error methods to\n// stream the output into the configured output stream instead of stdout.\nfunc (c *Console) consoleOutput(call otto.FunctionCall) otto.Value {\n\toutput := []string{}\n\tfor _, argument := range call.ArgumentList {\n\t\toutput = append(output, fmt.Sprintf(\"%v\", argument))\n\t}\n\tfmt.Fprintln(c.printer, strings.Join(output, \" \"))\n\treturn otto.Value{}\n}\n\n// AutoCompleteInput is a pre-assembled word completer to be used by the user\n// input prompter to provide hints to the user about the methods available.\nfunc (c *Console) AutoCompleteInput(line string, pos int) (string, []string, string) {\n\t// No completions can be provided for empty inputs\n\tif len(line) == 0 || pos == 0 {\n\t\treturn \"\", nil, \"\"\n\t}\n\t// Chunck data to relevant part for autocompletion\n\t// E.g. in case of nested lines sero.getBalance(sero.coinb<tab><tab>\n\tstart := pos - 1\n\tfor ; start > 0; start-- {\n\t\t// Skip all methods and namespaces (i.e. including the dot)\n\t\tif line[start] == '.' || (line[start] >= 'a' && line[start] <= 'z') || (line[start] >= 'A' && line[start] <= 'Z') {\n\t\t\tcontinue\n\t\t}\n\t\t// Handle web3 in a special way (i.e. other numbers aren't auto completed)\n\t\tif start >= 3 && line[start-3:start] == \"web3\" {\n\t\t\tstart -= 3\n\t\t\tcontinue\n\t\t}\n\t\t// We've hit an unexpected character, autocomplete form here\n\t\tstart++\n\t\tbreak\n\t}\n\treturn line[:start], c.jsre.CompleteKeywords(line[start:pos]), line[pos:]\n}\n\n// Welcome show summary of current Geth instance and some metadata about the\n// console's available modules.\nfunc (c *Console) Welcome() {\n\t// Print some generic Geth metadata\n\tfmt.Fprintf(c.printer, \"Welcome to the Gero JavaScript console!\\n\\n\")\n\tc.jsre.Run(`\n\t\tconsole.log(\"instance: \" + web3.version.node);\n\t\tconsole.log(\"coinbase: \" + sero.coinbase);\n\t\tconsole.log(\"at block: \" + sero.blockNumber + \" (\" + new Date(1000 * sero.getBlock(sero.blockNumber).timestamp) + \")\");\n\t\tconsole.log(\" datadir: \" + admin.datadir);\n\t`)\n\t// List all the supported modules for the user to call\n\tif apis, err := c.client.SupportedModules(); err == nil {\n\t\tmodules := make([]string, 0, len(apis))\n\t\tfor api, version := range apis {\n\t\t\tif api == \"sero\" {\n\t\t\t\tmodules = append(modules, fmt.Sprintf(\"%s:%s\", \"sero\", version))\n\t\t\t} else {\n\t\t\t\tmodules = append(modules, fmt.Sprintf(\"%s:%s\", api, version))\n\t\t\t}\n\n\t\t}\n\t\tsort.Strings(modules)\n\t\tfmt.Fprintln(c.printer, \" modules:\", strings.Join(modules, \" \"))\n\t}\n\tfmt.Fprintln(c.printer)\n}\n\n// Evaluate executes code and pretty prints the result to the specified output\n// stream.\nfunc (c *Console) Evaluate(statement string) error {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tfmt.Fprintf(c.printer, \"[native] error: %v\\n\", r)\n\t\t}\n\t}()\n\treturn c.jsre.Evaluate(statement, c.printer)\n}\n\n// Interactive starts an interactive user session, where input is propted from\n// the configured user prompter.\nfunc (c *Console) Interactive() {\n\tvar (\n\t\tprompt    = c.prompt          // Current prompt line (used for multi-line inputs)\n\t\tindents   = 0                 // Current number of input indents (used for multi-line inputs)\n\t\tinput     = \"\"                // Current user input\n\t\tscheduler = make(chan string) // Channel to send the next prompt on and receive the input\n\t)\n\t// Start a goroutine to listen for promt requests and send back inputs\n\tgo func() {\n\t\tfor {\n\t\t\t// Read the next user input\n\t\t\tline, err := c.prompter.PromptInput(<-scheduler)\n\t\t\tif err != nil {\n\t\t\t\t// In case of an error, either clear the prompt or fail\n\t\t\t\tif err == liner.ErrPromptAborted { // ctrl-C\n\t\t\t\t\tprompt, indents, input = c.prompt, 0, \"\"\n\t\t\t\t\tscheduler <- \"\"\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tclose(scheduler)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// User input retrieved, send for interpretation and loop\n\t\t\tscheduler <- line\n\t\t}\n\t}()\n\t// Monitor Ctrl-C too in case the input is empty and we need to bail\n\tabort := make(chan os.Signal, 1)\n\tsignal.Notify(abort, syscall.SIGINT, syscall.SIGTERM)\n\n\t// Start sending prompts to the user and reading back inputs\n\tfor {\n\t\t// Send the next prompt, triggering an input read and process the result\n\t\tscheduler <- prompt\n\t\tselect {\n\t\tcase <-abort:\n\t\t\t// User forcefully quite the console\n\t\t\tfmt.Fprintln(c.printer, \"caught interrupt, exiting\")\n\t\t\treturn\n\n\t\tcase line, ok := <-scheduler:\n\t\t\t// User input was returned by the prompter, handle special cases\n\t\t\tif !ok || (indents <= 0 && exit.MatchString(line)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif onlyWhitespace.MatchString(line) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Append the line to the input and check for multi-line interpretation\n\t\t\tinput += line + \"\\n\"\n\n\t\t\tindents = countIndents(input)\n\t\t\tif indents <= 0 {\n\t\t\t\tprompt = c.prompt\n\t\t\t} else {\n\t\t\t\tprompt = strings.Repeat(\".\", indents*3) + \" \"\n\t\t\t}\n\t\t\t// If all the needed lines are present, save the command and run\n\t\t\tif indents <= 0 {\n\t\t\t\tif len(input) > 0 && input[0] != ' ' && !passwordRegexp.MatchString(input) {\n\t\t\t\t\tif command := strings.TrimSpace(input); len(c.history) == 0 || command != c.history[len(c.history)-1] {\n\t\t\t\t\t\tc.history = append(c.history, command)\n\t\t\t\t\t\tif c.prompter != nil {\n\t\t\t\t\t\t\tc.prompter.AppendHistory(command)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tc.Evaluate(input)\n\t\t\t\tinput = \"\"\n\t\t\t}\n\t\t}\n\t}\n}\n\n// countIndents returns the number of identations for the given input.\n// In case of invalid input such as var a = } the result can be negative.\nfunc countIndents(input string) int {\n\tvar (\n\t\tindents     = 0\n\t\tinString    = false\n\t\tstrOpenChar = ' '   // keep track of the string open char to allow var str = \"I'm ....\";\n\t\tcharEscaped = false // keep track if the previous char was the '\\' char, allow var str = \"abc\\\"def\";\n\t)\n\n\tfor _, c := range input {\n\t\tswitch c {\n\t\tcase '\\\\':\n\t\t\t// indicate next char as escaped when in string and previous char isn't escaping this backslash\n\t\t\tif !charEscaped && inString {\n\t\t\t\tcharEscaped = true\n\t\t\t}\n\t\tcase '\\'', '\"':\n\t\t\tif inString && !charEscaped && strOpenChar == c { // end string\n\t\t\t\tinString = false\n\t\t\t} else if !inString && !charEscaped { // begin string\n\t\t\t\tinString = true\n\t\t\t\tstrOpenChar = c\n\t\t\t}\n\t\t\tcharEscaped = false\n\t\tcase '{', '(':\n\t\t\tif !inString { // ignore brackets when in string, allow var str = \"a{\"; without indenting\n\t\t\t\tindents++\n\t\t\t}\n\t\t\tcharEscaped = false\n\t\tcase '}', ')':\n\t\t\tif !inString {\n\t\t\t\tindents--\n\t\t\t}\n\t\t\tcharEscaped = false\n\t\tdefault:\n\t\t\tcharEscaped = false\n\t\t}\n\t}\n\n\treturn indents\n}\n\n// Execute runs the JavaScript file specified as the argument.\nfunc (c *Console) Execute(path string) error {\n\treturn c.jsre.Exec(path)\n}\n\n// Stop cleans up the console and terminates the runtime environment.\nfunc (c *Console) Stop(graceful bool) error {\n\tif err := ioutil.WriteFile(c.histPath, []byte(strings.Join(c.history, \"\\n\")), 0600); err != nil {\n\t\treturn err\n\t}\n\tif err := os.Chmod(c.histPath, 0600); err != nil { // Force 0600, even if it was different previously\n\t\treturn err\n\t}\n\tc.jsre.Stop(graceful)\n\treturn nil\n}\n"
  },
  {
    "path": "console/console_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage console\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/cpt\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/internal/jsre\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/sero\"\n)\n\nconst (\n\ttestInstance = \"console-tester\"\n\ttestAddress  = \"4yn9wDedx4B5k9RYmwavvmJ49UKn6VRoa8vubB5xkzanr74FPtaUM9XrFGCsB3erNyFPV7HY4U7TH8UjaswT6h3P\"\n)\n\nfunc init() {\n\tcpt.ZeroInit_NoCircuit()\n}\n\n// hookedPrompter implements UserPrompter to simulate use input via channels.\ntype hookedPrompter struct {\n\tscheduler chan string\n}\n\nfunc (p *hookedPrompter) PromptInput(prompt string) (string, error) {\n\t// Send the prompt to the tester\n\tselect {\n\tcase p.scheduler <- prompt:\n\tcase <-time.After(time.Second):\n\t\treturn \"\", errors.New(\"prompt timeout\")\n\t}\n\t// Retrieve the response and feed to the console\n\tselect {\n\tcase input := <-p.scheduler:\n\t\treturn input, nil\n\tcase <-time.After(time.Second):\n\t\treturn \"\", errors.New(\"input timeout\")\n\t}\n}\n\nfunc (p *hookedPrompter) PromptPassword(prompt string) (string, error) {\n\treturn \"\", errors.New(\"not implemented\")\n}\nfunc (p *hookedPrompter) PromptConfirm(prompt string) (bool, error) {\n\treturn false, errors.New(\"not implemented\")\n}\nfunc (p *hookedPrompter) SetHistory(history []string)              {}\nfunc (p *hookedPrompter) AppendHistory(command string)             {}\nfunc (p *hookedPrompter) ClearHistory()                            {}\nfunc (p *hookedPrompter) SetWordCompleter(completer WordCompleter) {}\n\n// tester is a console test environment for the console tests to operate on.\ntype tester struct {\n\tworkspace string\n\tstack     *node.Node\n\tsero      *sero.Sero\n\tconsole   *Console\n\tinput     *hookedPrompter\n\toutput    *bytes.Buffer\n}\n\n// newTester creates a test environment based on which the console can operate.\n// Please ensure you call Close() on the returned tester to avoid leaks.\nfunc newTester(t *testing.T, confOverride func(*sero.Config)) *tester {\n\t// Create a temporary storage for the node keys and initialize it\n\tworkspace, err := ioutil.TempDir(\"\", \"console-tester-\")\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create temporary keystore: %v\", err)\n\t}\n\n\t// Create a networkless protocol stack and start an Ethereum service within\n\tstack, err := node.New(&node.Config{DataDir: workspace, UseLightweightKDF: true, Name: testInstance})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create node: %v\", err)\n\t}\n\tethConf := &sero.Config{\n\t\tGenesis: core.DeveloperGenesisBlock(),\n\t\t//Serobase: common.Base58ToAddress(testAddress),\n\t\tEthash: ethash.Config{\n\t\t\tPowMode: ethash.ModeTest,\n\t\t},\n\t}\n\tif confOverride != nil {\n\t\tconfOverride(ethConf)\n\t}\n\tif err = stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return sero.New(ctx, ethConf) }); err != nil {\n\t\tt.Fatalf(\"failed to register Ethereum protocol: %v\", err)\n\t}\n\t// Start the node and assemble the JavaScript console around it\n\tif err = stack.Start(); err != nil {\n\t\tt.Fatalf(\"failed to start test stack: %v\", err)\n\t}\n\tclient, err := stack.Attach()\n\tif err != nil {\n\t\tt.Fatalf(\"failed to attach to node: %v\", err)\n\t}\n\tprompter := &hookedPrompter{scheduler: make(chan string)}\n\tprinter := new(bytes.Buffer)\n\n\tconsole, err := New(Config{\n\t\tDataDir:  stack.DataDir(),\n\t\tDocRoot:  \"testdata\",\n\t\tClient:   client,\n\t\tPrompter: prompter,\n\t\tPrinter:  printer,\n\t\tPreload:  []string{\"preload.js\"},\n\t})\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create JavaScript console: %v\", err)\n\t}\n\t// Create the final tester and return\n\tvar sero *sero.Sero\n\tstack.Service(&sero)\n\n\treturn &tester{\n\t\tworkspace: workspace,\n\t\tstack:     stack,\n\t\tsero:      sero,\n\t\tconsole:   console,\n\t\tinput:     prompter,\n\t\toutput:    printer,\n\t}\n}\n\n// Close cleans up any temporary data folders and held resources.\nfunc (env *tester) Close(t *testing.T) {\n\tif err := env.console.Stop(false); err != nil {\n\t\tt.Errorf(\"failed to stop embedded console: %v\", err)\n\t}\n\tif err := env.stack.Stop(); err != nil {\n\t\tt.Errorf(\"failed to stop embedded node: %v\", err)\n\t}\n\tos.RemoveAll(env.workspace)\n}\n\n// Tests that the node lists the correct welcome message, notably that it contains\n// the instance name, coinbase account, block number, data directory and supported\n// console modules.\nfunc TestWelcome(t *testing.T) {\n\ttester := newTester(t, nil)\n\tdefer tester.Close(t)\n\n\ttester.console.Welcome()\n\n\toutput := tester.output.String()\n\tif want := \"Welcome\"; !strings.Contains(output, want) {\n\t\tt.Fatalf(\"console output missing welcome message: have\\n%s\\nwant also %s\", output, want)\n\t}\n\tif want := fmt.Sprintf(\"instance: %s\", testInstance); !strings.Contains(output, want) {\n\t\tt.Fatalf(\"console output missing instance: have\\n%s\\nwant also %s\", output, want)\n\t}\n\tif want := fmt.Sprintf(\"coinbase: %s\", testAddress); !strings.Contains(output, want) {\n\t\tt.Fatalf(\"console output missing coinbase: have\\n%s\\nwant also %s\", output, want)\n\t}\n\tif want := \"at block: 0\"; !strings.Contains(output, want) {\n\t\tt.Fatalf(\"console output missing sync status: have\\n%s\\nwant also %s\", output, want)\n\t}\n\tif want := fmt.Sprintf(\"datadir: %s\", tester.workspace); !strings.Contains(output, want) {\n\t\tt.Fatalf(\"console output missing coinbase: have\\n%s\\nwant also %s\", output, want)\n\t}\n}\n\n// Tests that JavaScript statement evaluation works as intended.\nfunc TestEvaluate(t *testing.T) {\n\ttester := newTester(t, nil)\n\tdefer tester.Close(t)\n\n\ttester.console.Evaluate(\"2 + 2\")\n\tif output := tester.output.String(); !strings.Contains(output, \"4\") {\n\t\tt.Fatalf(\"statement evaluation failed: have %s, want %s\", output, \"4\")\n\t}\n}\n\n// Tests that the console can be used in interactive mode.\nfunc TestInteractive(t *testing.T) {\n\t// Create a tester and run an interactive console in the background\n\ttester := newTester(t, nil)\n\tdefer tester.Close(t)\n\n\tgo tester.console.Interactive()\n\n\t// Wait for a promt and send a statement back\n\tselect {\n\tcase <-tester.input.scheduler:\n\tcase <-time.After(time.Second):\n\t\tt.Fatalf(\"initial prompt timeout\")\n\t}\n\tselect {\n\tcase tester.input.scheduler <- \"2+2\":\n\tcase <-time.After(time.Second):\n\t\tt.Fatalf(\"input feedback timeout\")\n\t}\n\t// Wait for the second promt and ensure first statement was evaluated\n\tselect {\n\tcase <-tester.input.scheduler:\n\tcase <-time.After(time.Second):\n\t\tt.Fatalf(\"secondary prompt timeout\")\n\t}\n\tif output := tester.output.String(); !strings.Contains(output, \"4\") {\n\t\tt.Fatalf(\"statement evaluation failed: have %s, want %s\", output, \"4\")\n\t}\n}\n\n// Tests that preloaded JavaScript files have been executed before user is given\n// input.\nfunc TestPreload(t *testing.T) {\n\ttester := newTester(t, nil)\n\tdefer tester.Close(t)\n\n\ttester.console.Evaluate(\"preloaded\")\n\tif output := tester.output.String(); !strings.Contains(output, \"some-preloaded-string\") {\n\t\tt.Fatalf(\"preloaded variable missing: have %s, want %s\", output, \"some-preloaded-string\")\n\t}\n}\n\n// Tests that JavaScript scripts can be executes from the configured asset path.\nfunc TestExecute(t *testing.T) {\n\ttester := newTester(t, nil)\n\tdefer tester.Close(t)\n\n\ttester.console.Execute(\"exec.js\")\n\n\ttester.console.Evaluate(\"execed\")\n\tif output := tester.output.String(); !strings.Contains(output, \"some-executed-string\") {\n\t\tt.Fatalf(\"execed variable missing: have %s, want %s\", output, \"some-executed-string\")\n\t}\n}\n\n// Tests that the JavaScript objects returned by statement executions are properly\n// pretty printed instead of just displaing \"[object]\".\nfunc TestPrettyPrint(t *testing.T) {\n\ttester := newTester(t, nil)\n\tdefer tester.Close(t)\n\n\ttester.console.Evaluate(\"obj = {int: 1, string: 'two', list: [3, 3, 3], obj: {null: null, func: function(){}}}\")\n\n\t// Define some specially formatted fields\n\tvar (\n\t\tone   = jsre.NumberColor(\"1\")\n\t\ttwo   = jsre.StringColor(\"\\\"two\\\"\")\n\t\tthree = jsre.NumberColor(\"3\")\n\t\tnull  = jsre.SpecialColor(\"null\")\n\t\tfun   = jsre.FunctionColor(\"function()\")\n\t)\n\t// Assemble the actual output we're after and verify\n\twant := `{\n  int: ` + one + `,\n  list: [` + three + `, ` + three + `, ` + three + `],\n  obj: {\n    null: ` + null + `,\n    func: ` + fun + `\n  },\n  string: ` + two + `\n}\n`\n\tif output := tester.output.String(); output != want {\n\t\tt.Fatalf(\"pretty print mismatch: have %s, want %s\", output, want)\n\t}\n}\n\n// Tests that the JavaScript exceptions are properly formatted and colored.\nfunc TestPrettyError(t *testing.T) {\n\ttester := newTester(t, nil)\n\tdefer tester.Close(t)\n\ttester.console.Evaluate(\"throw 'hello'\")\n\n\twant := jsre.ErrorColor(\"hello\") + \"\\n\"\n\tif output := tester.output.String(); output != want {\n\t\tt.Fatalf(\"pretty error mismatch: have %s, want %s\", output, want)\n\t}\n}\n\n// Tests that tests if the number of indents for JS input is calculated correct.\nfunc TestIndenting(t *testing.T) {\n\ttestCases := []struct {\n\t\tinput               string\n\t\texpectedIndentCount int\n\t}{\n\t\t{`var a = 1;`, 0},\n\t\t{`\"some string\"`, 0},\n\t\t{`\"some string with (parentesis`, 0},\n\t\t{`\"some string with newline\n\t\t(\"`, 0},\n\t\t{`function v(a,b) {}`, 0},\n\t\t{`function f(a,b) { var str = \"asd(\"; };`, 0},\n\t\t{`function f(a) {`, 1},\n\t\t{`function f(a, function(b) {`, 2},\n\t\t{`function f(a, function(b) {\n\t\t     var str = \"a)}\";\n\t\t  });`, 0},\n\t\t{`function f(a,b) {\n\t\t   var str = \"a{b(\" + a, \", \" + b;\n\t\t   }`, 0},\n\t\t{`var str = \"\\\"{\"`, 0},\n\t\t{`var str = \"'(\"`, 0},\n\t\t{`var str = \"\\\\{\"`, 0},\n\t\t{`var str = \"\\\\\\\\{\"`, 0},\n\t\t{`var str = 'a\"{`, 0},\n\t\t{`var obj = {`, 1},\n\t\t{`var obj = { {a:1`, 2},\n\t\t{`var obj = { {a:1}`, 1},\n\t\t{`var obj = { {a:1}, b:2}`, 0},\n\t\t{`var obj = {}`, 0},\n\t\t{`var obj = {\n\t\t\ta: 1, b: 2\n\t\t}`, 0},\n\t\t{`var test = }`, -1},\n\t\t{`var str = \"a\\\"\"; var obj = {`, 1},\n\t}\n\n\tfor i, tt := range testCases {\n\t\tcounted := countIndents(tt.input)\n\t\tif counted != tt.expectedIndentCount {\n\t\t\tt.Errorf(\"test %d: invalid indenting: have %d, want %d\", i, counted, tt.expectedIndentCount)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "console/prompter.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage console\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/peterh/liner\"\n)\n\n// Stdin holds the stdin line reader (also using stdout for printing prompts).\n// Only this reader may be used for input because it keeps an internal buffer.\nvar Stdin = newTerminalPrompter()\n\n// UserPrompter defines the methods needed by the console to promt the user for\n// various types of inputs.\ntype UserPrompter interface {\n\t// PromptInput displays the given prompt to the user and requests some textual\n\t// data to be entered, returning the input of the user.\n\tPromptInput(prompt string) (string, error)\n\n\t// PromptPassword displays the given prompt to the user and requests some textual\n\t// data to be entered, but one which must not be echoed out into the terminal.\n\t// The method returns the input provided by the user.\n\tPromptPassword(prompt string) (string, error)\n\n\t// PromptConfirm displays the given prompt to the user and requests a boolean\n\t// choice to be made, returning that choice.\n\tPromptConfirm(prompt string) (bool, error)\n\n\t// SetHistory sets the the input scrollback history that the prompter will allow\n\t// the user to scroll back to.\n\tSetHistory(history []string)\n\n\t// AppendHistory appends an entry to the scrollback history. It should be called\n\t// if and only if the prompt to append was a valid command.\n\tAppendHistory(command string)\n\n\t// ClearHistory clears the entire history\n\tClearHistory()\n\n\t// SetWordCompleter sets the completion function that the prompter will call to\n\t// fetch completion candidates when the user presses tab.\n\tSetWordCompleter(completer WordCompleter)\n}\n\n// WordCompleter takes the currently edited line with the cursor position and\n// returns the completion candidates for the partial word to be completed. If\n// the line is \"Hello, wo!!!\" and the cursor is before the first '!', (\"Hello,\n// wo!!!\", 9) is passed to the completer which may returns (\"Hello, \", {\"world\",\n// \"Word\"}, \"!!!\") to have \"Hello, world!!!\".\ntype WordCompleter func(line string, pos int) (string, []string, string)\n\n// terminalPrompter is a UserPrompter backed by the liner package. It supports\n// prompting the user for various input, among others for non-echoing password\n// input.\ntype terminalPrompter struct {\n\t*liner.State\n\twarned     bool\n\tsupported  bool\n\tnormalMode liner.ModeApplier\n\trawMode    liner.ModeApplier\n}\n\n// newTerminalPrompter creates a liner based user input prompter working off the\n// standard input and output streams.\nfunc newTerminalPrompter() *terminalPrompter {\n\tp := new(terminalPrompter)\n\t// Get the original mode before calling NewLiner.\n\t// This is usually regular \"cooked\" mode where characters echo.\n\tnormalMode, _ := liner.TerminalMode()\n\t// Turn on liner. It switches to raw mode.\n\tp.State = liner.NewLiner()\n\trawMode, err := liner.TerminalMode()\n\tif err != nil || !liner.TerminalSupported() {\n\t\tp.supported = false\n\t} else {\n\t\tp.supported = true\n\t\tp.normalMode = normalMode\n\t\tp.rawMode = rawMode\n\t\t// Switch back to normal mode while we're not prompting.\n\t\tnormalMode.ApplyMode()\n\t}\n\tp.SetCtrlCAborts(true)\n\tp.SetTabCompletionStyle(liner.TabPrints)\n\tp.SetMultiLineMode(true)\n\treturn p\n}\n\n// PromptInput displays the given prompt to the user and requests some textual\n// data to be entered, returning the input of the user.\nfunc (p *terminalPrompter) PromptInput(prompt string) (string, error) {\n\tif p.supported {\n\t\tp.rawMode.ApplyMode()\n\t\tdefer p.normalMode.ApplyMode()\n\t} else {\n\t\t// liner tries to be smart about printing the prompt\n\t\t// and doesn't print anything if input is redirected.\n\t\t// Un-smart it by printing the prompt always.\n\t\tfmt.Print(prompt)\n\t\tprompt = \"\"\n\t\tdefer fmt.Println()\n\t}\n\treturn p.State.Prompt(prompt)\n}\n\n// PromptPassword displays the given prompt to the user and requests some textual\n// data to be entered, but one which must not be echoed out into the terminal.\n// The method returns the input provided by the user.\nfunc (p *terminalPrompter) PromptPassword(prompt string) (passwd string, err error) {\n\tif p.supported {\n\t\tp.rawMode.ApplyMode()\n\t\tdefer p.normalMode.ApplyMode()\n\t\treturn p.State.PasswordPrompt(prompt)\n\t}\n\tif !p.warned {\n\t\tfmt.Println(\"!! Unsupported terminal, password will be echoed.\")\n\t\tp.warned = true\n\t}\n\t// Just as in Prompt, handle printing the prompt here instead of relying on liner.\n\tfmt.Print(prompt)\n\tpasswd, err = p.State.Prompt(\"\")\n\tfmt.Println()\n\treturn passwd, err\n}\n\n// PromptConfirm displays the given prompt to the user and requests a boolean\n// choice to be made, returning that choice.\nfunc (p *terminalPrompter) PromptConfirm(prompt string) (bool, error) {\n\tinput, err := p.Prompt(prompt + \" [y/N] \")\n\tif len(input) > 0 && strings.ToUpper(input[:1]) == \"Y\" {\n\t\treturn true, nil\n\t}\n\treturn false, err\n}\n\n// SetHistory sets the the input scrollback history that the prompter will allow\n// the user to scroll back to.\nfunc (p *terminalPrompter) SetHistory(history []string) {\n\tp.State.ReadHistory(strings.NewReader(strings.Join(history, \"\\n\")))\n}\n\n// AppendHistory appends an entry to the scrollback history.\nfunc (p *terminalPrompter) AppendHistory(command string) {\n\tp.State.AppendHistory(command)\n}\n\n// ClearHistory clears the entire history\nfunc (p *terminalPrompter) ClearHistory() {\n\tp.State.ClearHistory()\n}\n\n// SetWordCompleter sets the completion function that the prompter will call to\n// fetch completion candidates when the user presses tab.\nfunc (p *terminalPrompter) SetWordCompleter(completer WordCompleter) {\n\tp.State.SetWordCompleter(liner.WordCompleter(completer))\n}\n"
  },
  {
    "path": "console/testdata/exec.js",
    "content": "var execed = \"some-executed-string\";\n"
  },
  {
    "path": "console/testdata/preload.js",
    "content": "var preloaded = \"some-preloaded-string\";\n"
  },
  {
    "path": "containers/docker/gero-ubuntu/Dockerfile",
    "content": "FROM ubuntu:xenial\nENV LD_LIBRARY_PATH=/geropkg/czero/lib\nCOPY rungero.docker /usr/local/bin/rungero\nCOPY geroConfig.toml /usr/local/bin/geroConfig.toml\nRUN \\\n  apt-get update && apt-get upgrade -q -y && \\\n  apt-get install -y --no-install-recommends wget make gcc libc-dev libgmp-dev ca-certificates && \\\n  wget https://sero-1259797294.file.myqcloud.com/gero/v1.0.4/gero-v1.0.4-linux-amd64-v3.tar.gz &&\\\n  tar -zxvf gero-v1.0.4-linux-amd64-v3.tar.gz && \\\n  cp geropkg/bin/gero /gero\n\nEXPOSE 8545\nEXPOSE 53717\n\nENTRYPOINT [\"/usr/local/bin/rungero\"]\n"
  },
  {
    "path": "containers/docker/gero-ubuntu/Makefile",
    "content": "#please read rungero.docker script,you can add startup params\n#when you start gero with docker please add -v save the data to the chain data\n\nbuild:\n\tdocker build -t sero/client-go:v1.0.4 .\n\nrpc:\n\tmkdir -p ~/geroData/log\n\tdocker run --name gero -v ~/geroData:/root/.sero -v ~/geroData/log:/log -d -p 8545:8545 sero/client-go:v1.0.4\n\nkill:\n\tdocker rm -f gero\n\ntest:\n\tcurl -X POST -H \"Content-Type\":application/json --data '{\"jsonrpc\":\"2.0\",\"method\":\"sero_blockNumber\",\"params\":[\"\"],\"id\":1}' localhost:8545\n\n"
  },
  {
    "path": "containers/docker/gero-ubuntu/geroConfig.toml",
    "content": "[Sero]\n  [Node]\n\n  #KeyStoreDir=\"./data/keystore\"\n\n  [Node.P2P]\n\n  MaxPeers = 1024\n\n  StaticNodes = [\"snode://04283d01edd018309d1381d8feb531c0b0f1d0ae72b738e7bd92f797a7c6239a1b59f3bfe739f3fc1a63e030360d3b88b185181705ef1166776b3fcc98362a4c@129.28.156.61:53717\", \"snode://04ab8fd7d7420aa0c66607f59b3109d874de116685e2e8dcd6c583ae9ab991289b7ebb925716d531eaff2cb0977a8961db59d496c3f0d2561dd580941a194d71@118.25.80.42:53717\", \"snode://1a81e137c5cfb7e41eb2ed911fbac9630abce096b2f1464ce44886d9cd5819493b42a9812f4b65467d966ea8dedca3863b114f7b3f3517c4bd3c3b26c330d60d@111.231.59.54:53717\", \"snode://38ad2d00bc6c539319e8a476761d2a636156af6a8f504765d28f392cd5c1f42ca2a69aeda05210c5e9dbe5184e68991c9ed36a3e4ded0cdd2ab9cba6c153d60e@47.105.42.49:53717\", \"snode://3ae5d553e78057fa33cad0ecf08b08fce9c2c50bbe5d2625b996b1322d8c96c74ca42dd54dbf5854cc6c70cd50a650e3b835c92e8f0e0adafcb47724413d16e2@13.251.221.90:60602\", \"snode://410b4aa874bb3d6d4dc732463629acfabbf503d39493f69c82fd62119d4eca1aef02cb0e5d224765231b66df3ba87e50e7fafc87651cbaf41af13705fea3370f@27.10.235.88:34342\", \"snode://41129a264748e4d949c675b1bb6afcb23fb0748e991e16e2b43693ead9911759c708ded5b836a68d0ef3c48d389667f3ba1224734b00794d522754bc693f52ea@109.70.186.58:53718\", \"snode://459c94ce2b1bb05dce5faccd27b13add006b5378ba0e598b001ddf07eb08d00965d61a64016b72a48de0a0d51c1d4f964929c00d53efc8b95a174dba3ba98065@95.216.8.218:53333\", \"snode://4ba7196e0c06885b036795ff126c4616627075ceb0bfaf0fae2313e6894bc3445b3b147afd60021d3450e4c0e7582be3248a2d21bb03560bff8a06b638efe749@118.24.17.141:53717\", \"snode://4da4f3b1f852cefadff1ace9f24cabd1245cf6ba81fb1cdb043c4987202bfacd8226c48a16bccef05c15f2f0b263acd25be1e60e3e3250ae61f83c49701118e9@121.196.218.173:53717\", \"snode://505d5faf9c914e082a1157dc6e8398eb52e18da05b71ffb45c97d422dbf01c91ff6eabeecb4d4fd2557c9bf52b471f376eba04f66bc9adc926ca6bd927f35394@47.75.186.103:56112\", \"snode://52e62b8cc63d8a44b7071ca76115edce26f53da42a71a23f7b52f8870b43b658cefe33517a7316941385fae495052b7d351e6e3f3c5f1110a86e20ee5d3626ec@39.100.244.135:53717\", \"snode://5365992929387340e9e5a5a06dcb32948efa9c073f62bbcbdaa9cc47c82c5e99c4b917a850aecd0ffa21150731475276b82aff0617bfa7016b2809459e1da128@14.215.130.120:53717\", \"snode://5e0041083a74bda32f46ef66d3206b73d0c14facd674a4f99373116954a88bb04f8abf0da0503baa186d3edc0ff5e3d22a4e74252a7750662053f9606bd0bef8@109.70.186.58:53717\", \"snode://619413acabc04d15870b8cce2eac02b0bc91a706cad503ae3e438870408d79f282b0e25dfeb4c8dbdcd2b0f320577ee859420c94f6a7f50db973bda70c360e65@183.2.149.218:53717\", \"snode://6b883d53f89c32ea32fc0520fe7c1dd2738c079068bc84c12b8fc032c0c947e958c980ef4eb839f5b7dab0a99e185059a941feefe2ec25b20d6e854dd530b95d@118.31.59.151:53717\", \"snode://7630acdc71105241a39a7b1725c145855c27e54bbe08f2806cd1a3d306cb407d8c0158742698dee848ba3d5f9992d56e3b1bc3b6f2b55ff159a45abdb3024d34@121.201.75.200:53717\", \"snode://8904be22328d88cdde7a9f259a5a210709b05dbd95c22b6df16f568ad19aafc94ece39966c3bbef4e7adfa8169b02405a7a82ca2083fdc3264354a506b9cdae0@182.61.22.130:53717\", \"snode://8fdaacf36133765f0b82a63e0abbc2402001bff5fbc1f4e290e761048aa847b75039e16efbe63217d4ba174ba8513a09418aa7c989ad2d868f01b619416d7514@39.104.121.215:53717\", \"snode://9162edcd147e13de27074bd908fd0107ff2c4adda8a410d46a0db8ae0feb4ed6518e9028939728eca7f44265320ee019ddf4eacda6d8c22970e4d16ef3d946e0@106.13.215.117:53727\", \"snode://98c6caf6bf71d326a85d792ae311157837b0fca5c7474ff3e78b5b81b8c97ae7404648f4aac4949746045324bcef83e15639706c806f2cab2aa180fe028819aa@119.23.46.14:53717\", \"snode://a45f419b3b20f327a1009669ab6d2642a86fe4c08b7bb39ce03f57cc9b584552acdd92c57981f92978833678f27cbb523daeac5f28caf8e17b550075941be677@183.2.149.217:53717\", \"snode://a9fa905c90dd9051a6a2e2edbba0a3c23c38d23ad9fd7fb47a4437d5f61ab80c05382f12c12cc5a360962d7f2271dd34dbd933ace888008620f02eb8522dad05@219.152.25.125:37168\", \"snode://ab964ae3dd5ea7744332e20b1a641ffad59063aae7f5e89b53eb04b1cc666899b22e6b951e811801645e51305bbc55df57e71c938678f47433a024fb645d25b1@119.148.162.131:53717\", \"snode://ae55a637218d40b7718d16d0ad82c91dbcaf72800a70da669426ef036a0bcf7eb6709a55ed675c3882ca734492c2358285d07f9b209e9d287270339299353253@49.232.53.87:53717\", \"snode://b3c2559e1790273a8355320bb98895fde3985f86c182d0f9cb5c00ea93b0d4b06ee8193eaf6dcbe3bf4866195fbae80f85d0c292e21328407e57ff1de55fdd53@129.204.197.105:53717\", \"snode://b5feccebd5d7908252e3b2e5ad7bcb1e71a0c9f13f5335a39a6cd534afbad64408480711b4528a4d2de3d063df5aa498c1326f6b54bc658afd99f6d04af789e7@94.191.35.64:53717\", \"snode://cbd8bb1c3d5ca59addb9a2c6c72f1a42826d46b6032bb22f3345c9e157d52e9d03c32ac022dd631828e0e061363d3f6e5e56c70e9b6f3f3e98a67e3f6fe28919@47.104.198.171:53717\", \"snode://d8c8257faeaa5cbd13185e632461593e61461ef4cab40fbf9a0fc997502f17f5f58ff47a92ed24e7ae3810dfff3d27511e807bec0ae55bd2f20021f679250c03@207.148.4.216:53717\", \"snode://d97fa94a1cf165d4a810189926b6c76553f7402bf80580a6c7e84b4e2c01003944fcc5d8fb46f015795d06708c917edb1d8f9f66210a1f73f1d15c70214c76a8@39.100.147.174:53717\", \"snode://e80e3b82bf60e20ad005c71196464621a1a0829791d5d42a6d3c814802b7a73d8075c9ae3bc794206b798d4391e3b809a5d18a39411af44b6bd3d9ac591ebd5b@129.204.27.217:53717\", \"snode://eb07c6e85fd25a8d1ee59b12645ae355264f6c1d47855aa4312374880b2dfda0572e8dc6e345e4da772f67cdbf64c99a37f47acb521bc040c4ed08cfb5b69fa7@49.235.43.231:53717\", \"snode://eb8bf52d6746c89709354c95eb2045a7fc8f75c4ba104238759e0a12f7df381486e956decf4b4ffe642f518c112cc3a305c1eee8633cd011a288db11af9b0774@18.162.219.184:53717\", \"snode://eeac837a47990f02e57814e4fe3661fd68ec9419bafc0d1f2a498aa25f635adccc0cf84553d291325acffead5bcec7fc9a838d724e30ac880c9d1a57f64b3ecb@47.75.120.213:55792\", \"snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@118.190.58.196:53717\", \"snode://221e2ad2237a3ec164bd8c7febe31336f0647b60e194d7def5b9fe9cf7ae09c33745b7c3cd833a8f05b5db282c41f2d35c72c3df38c594bcc054a4b35d54a93d@122.224.55.50:53717\", \"snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717\", \"snode://eec8179a39aad4c793b24c978b2ebca2a8b97d60ee4ac1eee06e96a429c996501aee5fdd065129c065b0bfccadc1a88ed8d8b6ab4528677e01921f6f935599d7@101.37.124.82:53717\", \"snode://439b01f40e2a55c9e3a3773d1683f6f33d933a8bb4a23eabf493cd694bc2de8b1863ff62be3fe935afaefe34d960fa05497b23481ff267af3920be398419f3f3@118.31.57.191:53717\", \"snode://ebdc84f6c79a44e28efd3cc33743b7bdb192b566833acdf818df8398f87ecd849dae3cfe79017f0ad32e91e19b62cc5ed1ce85f459213ba86e46ab8b680819bb@13.56.113.11:53717\", \"snode://f518c5d7513a68e25b9bab8cd68749a30e1782ae2f6dd0da047a664c5517282128a44cec30fd16ab54cc5ba5c730371c74817618396088be93081a90eab63766@47.104.158.136:53717\"]\n\n  TrustedNodes = [\"snode://7fe0ac9ab365a18435dc67a92fe48be06b0fc5c5b4ef66135fc4ffbc48ffdd07bfdbc580128bba7bc29dd43c881bb41cf85b8a49015e937356fc6e855d3bc427@3.122.152.29:53717\",\"snode://ebdc84f6c79a44e28efd3cc33743b7bdb192b566833acdf818df8398f87ecd849dae3cfe79017f0ad32e91e19b62cc5ed1ce85f459213ba86e46ab8b680819bb@13.56.113.11:53717\",\"snode://eb8bf52d6746c89709354c95eb2045a7fc8f75c4ba104238759e0a12f7df381486e956decf4b4ffe642f518c112cc3a305c1eee8633cd011a288db11af9b0774@18.162.219.184:53717\",\"snode://6e7cd5cef0993c36bfd010c4afe4459022fd0d94b04bd2099a6b7183a22371e5d469dddf1505ed120d326dc0b19523cdbabe08be23056fbb46c319ad9d975059@49.232.11.26:53717\",\"snode://98c6caf6bf71d326a85d792ae311157837b0fca5c7474ff3e78b5b81b8c97ae7404648f4aac4949746045324bcef83e15639706c806f2cab2aa180fe028819aa@119.23.46.14:53717\",\"snode://de325a736632a5b8a6e1f3a5755a1c7ab568171918d2a7f26560de4ac99e0cec2b87c487f8652e80d15f0ab3d1a1b6f6ddf1634bec48a34041101d885438e0c2@148.70.169.73:53717\"]\n\n"
  },
  {
    "path": "containers/docker/gero-ubuntu/rungero.docker",
    "content": "#!/bin/bash\nmkdir -p /log\ncurrent=`date \"+%Y-%m-%d\"`\nlogName=\"gero_$current.log\"\n\n/gero --config /usr/local/bin/geroConfig.toml --datadir /root/.sero  --rpccorsdomain=\"*\" --confirmedBlock 32 --rpcwritetimeout 1800 --exchangeValueStr --port 53717 --rpc --rpcaddr \"127.0.0.1\" -rpcapi \"sero,net,exchange,stake\" --rpcport 8545 --exchange --mineMode  $@ 2>> /log/${logName}\n"
  },
  {
    "path": "core/.gitignore",
    "content": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n#\n# If you find yourself ignoring temporary files generated by your text editor\n# or operating system, you probably want to add a global ignore instead:\n#   git config --global core.excludesfile ~/.gitignore_global\n\n/tmp\n*/**/*un~\n*un~\n.DS_Store\n*/**/.DS_Store\n\n"
  },
  {
    "path": "core/asm/asm.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Provides support for dealing with EVM assembly instructions (e.g., disassembling them).\npackage asm\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/core/vm\"\n)\n\n// Iterator for disassembled EVM instructions\ntype instructionIterator struct {\n\tcode    []byte\n\tpc      uint64\n\targ     []byte\n\top      vm.OpCode\n\terror   error\n\tstarted bool\n}\n\n// Create a new instruction iterator.\nfunc NewInstructionIterator(code []byte) *instructionIterator {\n\tit := new(instructionIterator)\n\tit.code = code\n\treturn it\n}\n\n// Returns true if there is a next instruction and moves on.\nfunc (it *instructionIterator) Next() bool {\n\tif it.error != nil || uint64(len(it.code)) <= it.pc {\n\t\t// We previously reached an error or the end.\n\t\treturn false\n\t}\n\n\tif it.started {\n\t\t// Since the iteration has been already started we move to the next instruction.\n\t\tif it.arg != nil {\n\t\t\tit.pc += uint64(len(it.arg))\n\t\t}\n\t\tit.pc++\n\t} else {\n\t\t// We start the iteration from the first instruction.\n\t\tit.started = true\n\t}\n\n\tif uint64(len(it.code)) <= it.pc {\n\t\t// We reached the end.\n\t\treturn false\n\t}\n\n\tit.op = vm.OpCode(it.code[it.pc])\n\tif it.op.IsPush() {\n\t\ta := uint64(it.op) - uint64(vm.PUSH1) + 1\n\t\tu := it.pc + 1 + a\n\t\tif uint64(len(it.code)) <= it.pc || uint64(len(it.code)) < u {\n\t\t\tit.error = fmt.Errorf(\"incomplete push instruction at %v\", it.pc)\n\t\t\treturn false\n\t\t}\n\t\tit.arg = it.code[it.pc+1 : u]\n\t} else {\n\t\tit.arg = nil\n\t}\n\treturn true\n}\n\n// Returns any error that may have been encountered.\nfunc (it *instructionIterator) Error() error {\n\treturn it.error\n}\n\n// Returns the PC of the current instruction.\nfunc (it *instructionIterator) PC() uint64 {\n\treturn it.pc\n}\n\n// Returns the opcode of the current instruction.\nfunc (it *instructionIterator) Op() vm.OpCode {\n\treturn it.op\n}\n\n// Returns the argument of the current instruction.\nfunc (it *instructionIterator) Arg() []byte {\n\treturn it.arg\n}\n\n// Pretty-print all disassembled EVM instructions to stdout.\nfunc PrintDisassembled(code string) error {\n\tscript, err := hex.DecodeString(code)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tit := NewInstructionIterator(script)\n\tfor it.Next() {\n\t\tif it.Arg() != nil && 0 < len(it.Arg()) {\n\t\t\tfmt.Printf(\"%06v: %v 0x%x\\n\", it.PC(), it.Op(), it.Arg())\n\t\t} else {\n\t\t\tfmt.Printf(\"%06v: %v\\n\", it.PC(), it.Op())\n\t\t}\n\t}\n\treturn it.Error()\n}\n\n// Return all disassembled EVM instructions in human-readable format.\nfunc Disassemble(script []byte) ([]string, error) {\n\tinstrs := make([]string, 0)\n\n\tit := NewInstructionIterator(script)\n\tfor it.Next() {\n\t\tif it.Arg() != nil && 0 < len(it.Arg()) {\n\t\t\tinstrs = append(instrs, fmt.Sprintf(\"%06v: %v 0x%x\\n\", it.PC(), it.Op(), it.Arg()))\n\t\t} else {\n\t\t\tinstrs = append(instrs, fmt.Sprintf(\"%06v: %v\\n\", it.PC(), it.Op()))\n\t\t}\n\t}\n\tif err := it.Error(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn instrs, nil\n}\n"
  },
  {
    "path": "core/asm/compiler.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage asm\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n)\n\n// Compiler contains information about the parsed source\n// and holds the tokens for the program.\ntype Compiler struct {\n\ttokens []token\n\tbinary []interface{}\n\n\tlabels map[string]int\n\n\tpc, pos int\n\n\tdebug bool\n}\n\n// newCompiler returns a new allocated compiler.\nfunc NewCompiler(debug bool) *Compiler {\n\treturn &Compiler{\n\t\tlabels: make(map[string]int),\n\t\tdebug:  debug,\n\t}\n}\n\n// Feed feeds tokens in to ch and are interpreted by\n// the compiler.\n//\n// feed is the first pass in the compile stage as it\n// collects the used labels in the program and keeps a\n// program counter which is used to determine the locations\n// of the jump dests. The labels can than be used in the\n// second stage to push labels and determine the right\n// position.\nfunc (c *Compiler) Feed(ch <-chan token) {\n\tfor i := range ch {\n\t\tswitch i.typ {\n\t\tcase number:\n\t\t\tnum := math.MustParseBig256(i.text).Bytes()\n\t\t\tif len(num) == 0 {\n\t\t\t\tnum = []byte{0}\n\t\t\t}\n\t\t\tc.pc += len(num)\n\t\tcase stringValue:\n\t\t\tc.pc += len(i.text) - 2\n\t\tcase element:\n\t\t\tc.pc++\n\t\tcase labelDef:\n\t\t\tc.labels[i.text] = c.pc\n\t\t\tc.pc++\n\t\tcase label:\n\t\t\tc.pc += 5\n\t\t}\n\n\t\tc.tokens = append(c.tokens, i)\n\t}\n\tif c.debug {\n\t\tfmt.Fprintln(os.Stderr, \"found\", len(c.labels), \"labels\")\n\t}\n}\n\n// Compile compiles the current tokens and returns a\n// binary string that can be interpreted by the EVM\n// and an error if it failed.\n//\n// compile is the second stage in the compile phase\n// which compiles the tokens to EVM instructions.\nfunc (c *Compiler) Compile() (string, []error) {\n\tvar errors []error\n\t// continue looping over the tokens until\n\t// the stack has been exhausted.\n\tfor c.pos < len(c.tokens) {\n\t\tif err := c.compileLine(); err != nil {\n\t\t\terrors = append(errors, err)\n\t\t}\n\t}\n\n\t// turn the binary to hex\n\tvar bin string\n\tfor _, v := range c.binary {\n\t\tswitch v := v.(type) {\n\t\tcase vm.OpCode:\n\t\t\tbin += fmt.Sprintf(\"%x\", []byte{byte(v)})\n\t\tcase []byte:\n\t\t\tbin += fmt.Sprintf(\"%x\", v)\n\t\t}\n\t}\n\treturn bin, errors\n}\n\n// next returns the next token and increments the\n// position.\nfunc (c *Compiler) next() token {\n\ttoken := c.tokens[c.pos]\n\tc.pos++\n\treturn token\n}\n\n// compileLine compiles a single line instruction e.g.\n// \"push 1\", \"jump @label\".\nfunc (c *Compiler) compileLine() error {\n\tn := c.next()\n\tif n.typ != lineStart {\n\t\treturn compileErr(n, n.typ.String(), lineStart.String())\n\t}\n\n\tlvalue := c.next()\n\tswitch lvalue.typ {\n\tcase eof:\n\t\treturn nil\n\tcase element:\n\t\tif err := c.compileElement(lvalue); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase labelDef:\n\t\tc.compileLabel()\n\tcase lineEnd:\n\t\treturn nil\n\tdefault:\n\t\treturn compileErr(lvalue, lvalue.text, fmt.Sprintf(\"%v or %v\", labelDef, element))\n\t}\n\n\tif n := c.next(); n.typ != lineEnd {\n\t\treturn compileErr(n, n.text, lineEnd.String())\n\t}\n\n\treturn nil\n}\n\n// compileNumber compiles the number to bytes\nfunc (c *Compiler) compileNumber(element token) (int, error) {\n\tnum := math.MustParseBig256(element.text).Bytes()\n\tif len(num) == 0 {\n\t\tnum = []byte{0}\n\t}\n\tc.pushBin(num)\n\treturn len(num), nil\n}\n\n// compileElement compiles the element (push & label or both)\n// to a binary representation and may error if incorrect statements\n// where fed.\nfunc (c *Compiler) compileElement(element token) error {\n\t// check for a jump. jumps must be read and compiled\n\t// from right to left.\n\tif isJump(element.text) {\n\t\trvalue := c.next()\n\t\tswitch rvalue.typ {\n\t\tcase number:\n\t\t\t// TODO figure out how to return the error properly\n\t\t\tc.compileNumber(rvalue)\n\t\tcase stringValue:\n\t\t\t// strings are quoted, remove them.\n\t\t\tc.pushBin(rvalue.text[1 : len(rvalue.text)-2])\n\t\tcase label:\n\t\t\tc.pushBin(vm.PUSH4)\n\t\t\tpos := big.NewInt(int64(c.labels[rvalue.text])).Bytes()\n\t\t\tpos = append(make([]byte, 4-len(pos)), pos...)\n\t\t\tc.pushBin(pos)\n\t\tdefault:\n\t\t\treturn compileErr(rvalue, rvalue.text, \"number, string or label\")\n\t\t}\n\t\t// push the operation\n\t\tc.pushBin(toBinary(element.text))\n\t\treturn nil\n\t} else if isPush(element.text) {\n\t\t// handle pushes. pushes are read from left to right.\n\t\tvar value []byte\n\n\t\trvalue := c.next()\n\t\tswitch rvalue.typ {\n\t\tcase number:\n\t\t\tvalue = math.MustParseBig256(rvalue.text).Bytes()\n\t\t\tif len(value) == 0 {\n\t\t\t\tvalue = []byte{0}\n\t\t\t}\n\t\tcase stringValue:\n\t\t\tvalue = []byte(rvalue.text[1 : len(rvalue.text)-1])\n\t\tcase label:\n\t\t\tvalue = make([]byte, 4)\n\t\t\tcopy(value, big.NewInt(int64(c.labels[rvalue.text])).Bytes())\n\t\tdefault:\n\t\t\treturn compileErr(rvalue, rvalue.text, \"number, string or label\")\n\t\t}\n\n\t\tif len(value) > 32 {\n\t\t\treturn fmt.Errorf(\"%d type error: unsupported string or number with size > 32\", rvalue.lineno)\n\t\t}\n\n\t\tc.pushBin(vm.OpCode(int(vm.PUSH1) - 1 + len(value)))\n\t\tc.pushBin(value)\n\t} else {\n\t\tc.pushBin(toBinary(element.text))\n\t}\n\n\treturn nil\n}\n\n// compileLabel pushes a jumpdest to the binary slice.\nfunc (c *Compiler) compileLabel() {\n\tc.pushBin(vm.JUMPDEST)\n}\n\n// pushBin pushes the value v to the binary stack.\nfunc (c *Compiler) pushBin(v interface{}) {\n\tif c.debug {\n\t\tfmt.Printf(\"%d: %v\\n\", len(c.binary), v)\n\t}\n\tc.binary = append(c.binary, v)\n}\n\n// isPush returns whether the string op is either any of\n// push(N).\nfunc isPush(op string) bool {\n\treturn strings.ToUpper(op) == \"PUSH\"\n}\n\n// isJump returns whether the string op is jump(i)\nfunc isJump(op string) bool {\n\treturn strings.ToUpper(op) == \"JUMPI\" || strings.ToUpper(op) == \"JUMP\"\n}\n\n// toBinary converts text to a vm.OpCode\nfunc toBinary(text string) vm.OpCode {\n\treturn vm.StringToOp(strings.ToUpper(text))\n}\n\ntype compileError struct {\n\tgot  string\n\twant string\n\n\tlineno int\n}\n\nfunc (err compileError) Error() string {\n\treturn fmt.Sprintf(\"%d syntax error: unexpected %v, expected %v\", err.lineno, err.got, err.want)\n}\n\nfunc compileErr(c token, got, want string) error {\n\treturn compileError{\n\t\tgot:    got,\n\t\twant:   want,\n\t\tlineno: c.lineno,\n\t}\n}\n"
  },
  {
    "path": "core/asm/lexer.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage asm\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\n// stateFn is used through the lifetime of the\n// lexer to parse the different values at the\n// current state.\ntype stateFn func(*lexer) stateFn\n\n// token is emitted when the lexer has discovered\n// a new parsable token. These are delivered over\n// the tokens channels of the lexer\ntype token struct {\n\ttyp    tokenType\n\tlineno int\n\ttext   string\n}\n\n// tokenType are the different types the lexer\n// is able to parse and return.\ntype tokenType int\n\nconst (\n\teof              tokenType = iota // end of file\n\tlineStart                         // emitted when a line starts\n\tlineEnd                           // emitted when a line ends\n\tinvalidStatement                  // any invalid statement\n\telement                           // any element during element parsing\n\tlabel                             // label is emitted when a label is found\n\tlabelDef                          // label definition is emitted when a new label is found\n\tnumber                            // number is emitted when a number is found\n\tstringValue                       // stringValue is emitted when a string has been found\n\n\tNumbers            = \"1234567890\"                                           // characters representing any decimal number\n\tHexadecimalNumbers = Numbers + \"aAbBcCdDeEfF\"                               // characters representing any hexadecimal\n\tAlpha              = \"abcdefghijklmnopqrstuwvxyzABCDEFGHIJKLMNOPQRSTUWVXYZ\" // characters representing alphanumeric\n)\n\n// String implements stringer\nfunc (it tokenType) String() string {\n\tif int(it) > len(stringtokenTypes) {\n\t\treturn \"invalid\"\n\t}\n\treturn stringtokenTypes[it]\n}\n\nvar stringtokenTypes = []string{\n\teof:              \"EOF\",\n\tinvalidStatement: \"invalid statement\",\n\telement:          \"element\",\n\tlineEnd:          \"end of line\",\n\tlineStart:        \"new line\",\n\tlabel:            \"label\",\n\tlabelDef:         \"label definition\",\n\tnumber:           \"number\",\n\tstringValue:      \"string\",\n}\n\n// lexer is the basic construct for parsing\n// source code and turning them in to tokens.\n// Tokens are interpreted by the compiler.\ntype lexer struct {\n\tinput string // input contains the source code of the program\n\n\ttokens chan token // tokens is used to deliver tokens to the listener\n\tstate  stateFn    // the current state function\n\n\tlineno            int // current line number in the source file\n\tstart, pos, width int // positions for lexing and returning value\n\n\tdebug bool // flag for triggering debug output\n}\n\n// lex lexes the program by name with the given source. It returns a\n// channel on which the tokens are delivered.\nfunc Lex(name string, source []byte, debug bool) <-chan token {\n\tch := make(chan token)\n\tl := &lexer{\n\t\tinput:  string(source),\n\t\ttokens: ch,\n\t\tstate:  lexLine,\n\t\tdebug:  debug,\n\t}\n\tgo func() {\n\t\tl.emit(lineStart)\n\t\tfor l.state != nil {\n\t\t\tl.state = l.state(l)\n\t\t}\n\t\tl.emit(eof)\n\t\tclose(l.tokens)\n\t}()\n\n\treturn ch\n}\n\n// next returns the next rune in the program's source.\nfunc (l *lexer) next() (rune rune) {\n\tif l.pos >= len(l.input) {\n\t\tl.width = 0\n\t\treturn 0\n\t}\n\trune, l.width = utf8.DecodeRuneInString(l.input[l.pos:])\n\tl.pos += l.width\n\treturn rune\n}\n\n// backup backsup the last parsed element (multi-character)\nfunc (l *lexer) backup() {\n\tl.pos -= l.width\n}\n\n// peek returns the next rune but does not advance the seeker\nfunc (l *lexer) peek() rune {\n\tr := l.next()\n\tl.backup()\n\treturn r\n}\n\n// ignore advances the seeker and ignores the value\nfunc (l *lexer) ignore() {\n\tl.start = l.pos\n}\n\n// Accepts checks whether the given input matches the next rune\nfunc (l *lexer) accept(valid string) bool {\n\tif strings.ContainsRune(valid, l.next()) {\n\t\treturn true\n\t}\n\n\tl.backup()\n\n\treturn false\n}\n\n// acceptRun will continue to advance the seeker until valid\n// can no longer be met.\nfunc (l *lexer) acceptRun(valid string) {\n\tfor strings.ContainsRune(valid, l.next()) {\n\t}\n\tl.backup()\n}\n\n// acceptRunUntil is the inverse of acceptRun and will continue\n// to advance the seeker until the rune has been found.\nfunc (l *lexer) acceptRunUntil(until rune) bool {\n\t// Continues running until a rune is found\n\tfor i := l.next(); !strings.ContainsRune(string(until), i); i = l.next() {\n\t\tif i == 0 {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// blob returns the current value\nfunc (l *lexer) blob() string {\n\treturn l.input[l.start:l.pos]\n}\n\n// Emits a new token on to token channel for processing\nfunc (l *lexer) emit(t tokenType) {\n\ttoken := token{t, l.lineno, l.blob()}\n\n\tif l.debug {\n\t\tfmt.Fprintf(os.Stderr, \"%04d: (%-20v) %s\\n\", token.lineno, token.typ, token.text)\n\t}\n\n\tl.tokens <- token\n\tl.start = l.pos\n}\n\n// lexLine is state function for lexing lines\nfunc lexLine(l *lexer) stateFn {\n\tfor {\n\t\tswitch r := l.next(); {\n\t\tcase r == '\\n':\n\t\t\tl.emit(lineEnd)\n\t\t\tl.ignore()\n\t\t\tl.lineno++\n\n\t\t\tl.emit(lineStart)\n\t\tcase r == ';' && l.peek() == ';':\n\t\t\treturn lexComment\n\t\tcase isSpace(r):\n\t\t\tl.ignore()\n\t\tcase isLetter(r) || r == '_':\n\t\t\treturn lexElement\n\t\tcase isNumber(r):\n\t\t\treturn lexNumber\n\t\tcase r == '@':\n\t\t\tl.ignore()\n\t\t\treturn lexLabel\n\t\tcase r == '\"':\n\t\t\treturn lexInsideString\n\t\tdefault:\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\n// lexComment parses the current position until the end\n// of the line and discards the text.\nfunc lexComment(l *lexer) stateFn {\n\tl.acceptRunUntil('\\n')\n\tl.ignore()\n\n\treturn lexLine\n}\n\n// lexLabel parses the current label, emits and returns\n// the lex text state function to advance the parsing\n// process.\nfunc lexLabel(l *lexer) stateFn {\n\tl.acceptRun(Alpha + \"_\")\n\n\tl.emit(label)\n\n\treturn lexLine\n}\n\n// lexInsideString lexes the inside of a string until\n// the state function finds the closing quote.\n// It returns the lex text state function.\nfunc lexInsideString(l *lexer) stateFn {\n\tif l.acceptRunUntil('\"') {\n\t\tl.emit(stringValue)\n\t}\n\n\treturn lexLine\n}\n\nfunc lexNumber(l *lexer) stateFn {\n\tacceptance := Numbers\n\tif l.accept(\"0\") || l.accept(\"xX\") {\n\t\tacceptance = HexadecimalNumbers\n\t}\n\tl.acceptRun(acceptance)\n\n\tl.emit(number)\n\n\treturn lexLine\n}\n\nfunc lexElement(l *lexer) stateFn {\n\tl.acceptRun(Alpha + \"_\" + Numbers)\n\n\tif l.peek() == ':' {\n\t\tl.emit(labelDef)\n\n\t\tl.accept(\":\")\n\t\tl.ignore()\n\t} else {\n\t\tl.emit(element)\n\t}\n\treturn lexLine\n}\n\nfunc isLetter(t rune) bool {\n\treturn unicode.IsLetter(t)\n}\n\nfunc isSpace(t rune) bool {\n\treturn unicode.IsSpace(t)\n}\n\nfunc isNumber(t rune) bool {\n\treturn unicode.IsNumber(t)\n}\n"
  },
  {
    "path": "core/block_validator.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// BlockValidator is responsible for validating block headers and\n// processed state.\n//\n// BlockValidator implements Validator.\ntype BlockValidator struct {\n\tconfig *params.ChainConfig // Chain configuration options\n\tbc     *BlockChain         // Canonical block chain\n\tengine consensus.Engine    // Consensus engine used for validating\n}\n\n// NewBlockValidator returns a new block validator which is safe for re-use\nfunc NewBlockValidator(config *params.ChainConfig, blockchain *BlockChain, engine consensus.Engine) *BlockValidator {\n\tvalidator := &BlockValidator{\n\t\tconfig: config,\n\t\tengine: engine,\n\t\tbc:     blockchain,\n\t}\n\treturn validator\n}\n\n// ValidateBody verifies the the block header's transaction. The headers are assumed to be already\n// validated at this point.\nfunc (v *BlockValidator) ValidateBody(block *types.Block) error {\n\t// Check whether the block's known, and if not, that it's linkable\n\tif v.bc.HasBlockAndState(block.Hash(), block.NumberU64()) {\n\t\treturn ErrKnownBlock\n\t}\n\tif !v.bc.HasBlockAndState(block.ParentHash(), block.NumberU64()-1) {\n\t\tif !v.bc.HasBlock(block.ParentHash(), block.NumberU64()-1) {\n\t\t\treturn consensus.ErrUnknownAncestor\n\t\t}\n\t\treturn consensus.ErrPrunedAncestor\n\t}\n\t// Header validity is known at this point\n\theader := block.Header()\n\n\tif hash := types.DeriveSha(block.Transactions()); hash != header.TxHash {\n\t\treturn fmt.Errorf(\"transaction root hash mismatch: have %x, want %x\", hash, header.TxHash)\n\t}\n\treturn nil\n}\n\n// ValidateState validates the various changes that happen after a state\n// transition, such as amount of used gas, the receipt roots and the state root\n// itself. ValidateState returns a database batch if the validation was a success\n// otherwise nil and an error is returned.\nfunc (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error {\n\theader := block.Header()\n\tif block.GasUsed() != usedGas {\n\t\treturn fmt.Errorf(\"invalid gas used (remote: %d local: %d)\", block.GasUsed(), usedGas)\n\t}\n\t// Validate the received block's bloom with the one derived from the generated receipts.\n\t// For valid blocks this should always validate to true.\n\trbloom := types.CreateBloom(receipts)\n\tif rbloom != header.Bloom {\n\t\treturn fmt.Errorf(\"invalid bloom (remote: %x  local: %x)\", header.Bloom, rbloom)\n\t}\n\t// Tre receipt Trie's root (R = (Tr [[H1, R1], ... [Hn, R1]]))\n\treceiptSha := types.DeriveSha(receipts)\n\tif receiptSha != header.ReceiptHash {\n\t\treturn fmt.Errorf(\"invalid receipt root hash (remote: %x local: %x)\", header.ReceiptHash, receiptSha)\n\t}\n\t// Validate the state root against the received state root and throw\n\t// an error if they don't match.\n\tif root := statedb.IntermediateRoot(true); header.Root != root {\n\t\treturn fmt.Errorf(\"invalid merkle root (remote: %x local: %x)\", header.Root, root)\n\t}\n\treturn nil\n}\n\n// CalcGasLimit computes the gas limit of the next block after parent.\n// This is miner strategy, not consensus protocol.\nfunc CalcGasLimit(parent *types.Block) uint64 {\n\tcontrib := (parent.GasUsed() + parent.GasUsed()/2)\n\n\tdivisor := uint64(1024)\n\tif contrib > parent.GasLimit() {\n\t\tdivisor = uint64(128)\n\t}\n\n\tdecav := parent.GasLimit()/divisor - 1\n\tlimit := parent.GasLimit() - decav + contrib/divisor\n\tif limit < params.MinGasLimit {\n\t\tlimit = params.MinGasLimit\n\t}\n\n\tif limit < params.TargetGasLimit {\n\t\tlimit = parent.GasLimit() + decav\n\t\tif limit > params.TargetGasLimit {\n\t\t\tlimit = params.TargetGasLimit\n\t\t}\n\t}\n\treturn limit\n}\n"
  },
  {
    "path": "core/block_validator_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"runtime\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/cpt\"\n\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Tests that simple header verification works, for both good and bad blocks.\nfunc TestHeaderVerification(t *testing.T) {\n\t// Create a simple chain to verify\n\tcpt.ZeroInit_NoCircuit()\n\tvar (\n\t\ttestdb    = serodb.NewMemDatabase()\n\t\tgspec     = &Genesis{Config: params.TestChainConfig}\n\t\tgenesis   = gspec.MustCommit(testdb)\n\t\tblocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil)\n\t)\n\theaders := make([]*types.Header, len(blocks))\n\tfor i, block := range blocks {\n\t\theaders[i] = block.Header()\n\t}\n\t// Run the header checker for blocks one-by-one, checking for both valid and invalid nonces\n\tchain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil)\n\tdefer chain.Stop()\n\n\tfor i := 0; i < len(blocks); i++ {\n\t\tfor j, valid := range []bool{true, false} {\n\t\t\tvar results <-chan error\n\n\t\t\tif valid {\n\t\t\t\tengine := ethash.NewFaker()\n\t\t\t\t_, results = engine.VerifyHeaders(chain, []*types.Header{headers[i]}, []bool{true})\n\t\t\t} else {\n\t\t\t\tengine := ethash.NewFakeFailer(headers[i].Number.Uint64())\n\t\t\t\t_, results = engine.VerifyHeaders(chain, []*types.Header{headers[i]}, []bool{true})\n\t\t\t}\n\t\t\t// Wait for the verification result\n\t\t\tselect {\n\t\t\tcase result := <-results:\n\t\t\t\tif (result == nil) != valid {\n\t\t\t\t\tt.Errorf(\"test %d.%d: validity mismatch: have %v, want %v\", i, j, result, valid)\n\t\t\t\t}\n\t\t\tcase <-time.After(time.Second):\n\t\t\t\tt.Fatalf(\"test %d.%d: verification timeout\", i, j)\n\t\t\t}\n\t\t\t// Make sure no more data is returned\n\t\t\tselect {\n\t\t\tcase result := <-results:\n\t\t\t\tt.Fatalf(\"test %d.%d: unexpected result returned: %v\", i, j, result)\n\t\t\tcase <-time.After(25 * time.Millisecond):\n\t\t\t}\n\t\t}\n\t\tchain.InsertChain(blocks[i : i+1])\n\t}\n}\n\n// Tests that concurrent header verification works, for both good and bad blocks.\nfunc TestHeaderConcurrentVerification2(t *testing.T)  { testHeaderConcurrentVerification(t, 2) }\nfunc TestHeaderConcurrentVerification8(t *testing.T)  { testHeaderConcurrentVerification(t, 8) }\nfunc TestHeaderConcurrentVerification32(t *testing.T) { testHeaderConcurrentVerification(t, 32) }\n\nfunc testHeaderConcurrentVerification(t *testing.T, threads int) {\n\t// Create a simple chain to verify\n\tvar (\n\t\ttestdb    = serodb.NewMemDatabase()\n\t\tgspec     = &Genesis{Config: params.TestChainConfig}\n\t\tgenesis   = gspec.MustCommit(testdb)\n\t\tblocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil)\n\t)\n\theaders := make([]*types.Header, len(blocks))\n\tseals := make([]bool, len(blocks))\n\n\tfor i, block := range blocks {\n\t\theaders[i] = block.Header()\n\t\tseals[i] = true\n\t}\n\t// Set the number of threads to verify on\n\told := runtime.GOMAXPROCS(threads)\n\tdefer runtime.GOMAXPROCS(old)\n\n\t// Run the header checker for the entire block chain at once both for a valid and\n\t// also an invalid chain (enough if one arbitrary block is invalid).\n\tfor i, valid := range []bool{true, false} {\n\t\tvar results <-chan error\n\n\t\tif valid {\n\t\t\tchain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFaker(), vm.Config{}, nil)\n\t\t\t_, results = chain.engine.VerifyHeaders(chain, headers, seals)\n\t\t\tchain.Stop()\n\t\t} else {\n\t\t\tchain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFakeFailer(uint64(len(headers)-1)), vm.Config{}, nil)\n\t\t\t_, results = chain.engine.VerifyHeaders(chain, headers, seals)\n\t\t\tchain.Stop()\n\t\t}\n\t\t// Wait for all the verification results\n\t\tchecks := make(map[int]error)\n\t\tfor j := 0; j < len(blocks); j++ {\n\t\t\tselect {\n\t\t\tcase result := <-results:\n\t\t\t\tchecks[j] = result\n\n\t\t\tcase <-time.After(time.Second):\n\t\t\t\tt.Fatalf(\"test %d.%d: verification timeout\", i, j)\n\t\t\t}\n\t\t}\n\t\t// Check nonce check validity\n\t\tfor j := 0; j < len(blocks); j++ {\n\t\t\twant := valid || (j < len(blocks)-2) // We chose the last-but-one nonce in the chain to fail\n\t\t\tif (checks[j] == nil) != want {\n\t\t\t\tt.Errorf(\"test %d.%d: validity mismatch: have %v, want %v\", i, j, checks[j], want)\n\t\t\t}\n\t\t\tif !want {\n\t\t\t\t// A few blocks after the first error may pass verification due to concurrent\n\t\t\t\t// workers. We don't care about those in this test, just that the correct block\n\t\t\t\t// errors out.\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// Make sure no more data is returned\n\t\tselect {\n\t\tcase result := <-results:\n\t\t\tt.Fatalf(\"test %d: unexpected result returned: %v\", i, result)\n\t\tcase <-time.After(25 * time.Millisecond):\n\t\t}\n\t}\n}\n\n// Tests that aborting a header validation indeed prevents further checks from being\n// run, as well as checks that no left-over goroutines are leaked.\nfunc TestHeaderConcurrentAbortion2(t *testing.T)  { testHeaderConcurrentAbortion(t, 2) }\nfunc TestHeaderConcurrentAbortion8(t *testing.T)  { testHeaderConcurrentAbortion(t, 8) }\nfunc TestHeaderConcurrentAbortion32(t *testing.T) { testHeaderConcurrentAbortion(t, 32) }\n\nfunc testHeaderConcurrentAbortion(t *testing.T, threads int) {\n\t// Create a simple chain to verify\n\tvar (\n\t\ttestdb    = serodb.NewMemDatabase()\n\t\tgspec     = &Genesis{Config: params.TestChainConfig}\n\t\tgenesis   = gspec.MustCommit(testdb)\n\t\tblocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 1024, nil)\n\t)\n\theaders := make([]*types.Header, len(blocks))\n\tseals := make([]bool, len(blocks))\n\n\tfor i, block := range blocks {\n\t\theaders[i] = block.Header()\n\t\tseals[i] = true\n\t}\n\t// Set the number of threads to verify on\n\told := runtime.GOMAXPROCS(threads)\n\tdefer runtime.GOMAXPROCS(old)\n\n\t// Start the verifications and immediately abort\n\tchain, _ := NewBlockChain(testdb, nil, params.TestChainConfig, ethash.NewFakeDelayer(time.Millisecond), vm.Config{}, nil)\n\tdefer chain.Stop()\n\n\tabort, results := chain.engine.VerifyHeaders(chain, headers, seals)\n\tclose(abort)\n\n\t// Deplete the results channel\n\tverified := 0\n\tfor depleted := false; !depleted; {\n\t\tselect {\n\t\tcase result := <-results:\n\t\t\tif result != nil {\n\t\t\t\tt.Errorf(\"header %d: validation failed: %v\", verified, result)\n\t\t\t}\n\t\t\tverified++\n\t\tcase <-time.After(50 * time.Millisecond):\n\t\t\tdepleted = true\n\t\t}\n\t}\n\t// Check that abortion was honored by not processing too many POWs\n\tif verified > 2*threads {\n\t\tt.Errorf(\"verification count too large: have %d, want below %d\", verified, 2*threads)\n\t}\n}\n"
  },
  {
    "path": "core/blockchain.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package core implements the Ethereum consensus protocol.\npackage core\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\tmrand \"math/rand\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/verify\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n\n\t\"github.com/hashicorp/golang-lru\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/trie\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n\t\"gopkg.in/karalabe/cookiejar.v2/collections/prque\"\n)\n\nvar (\n\tblockInsertTimer = metrics.NewRegisteredTimer(\"chain/inserts\", nil)\n\n\tErrNoGenesis = errors.New(\"Genesis not found in chain\")\n\n\tDelFn = func(db rawdb.DatabaseDeleter, hash common.Hash, num uint64) {\n\t\trawdb.DeleteBody(db, hash, num)\n\t\trawdb.DeleteHeader(db, hash, num)\n\t}\n)\n\nconst (\n\tbodyCacheLimit      = 256\n\tblockCacheLimit     = 256\n\tmaxFutureBlocks     = 256\n\tmaxTimeFutureBlocks = 30\n\tbadBlockLimit       = 10\n\ttriesInMemory       = 128\n\n\t// BlockChainVersion ensures that an incompatible database forces a resync from scratch.\n\tBlockChainVersion = 3\n)\n\n// CacheConfig contains the configuration values for the trie caching/pruning\n// that's resident in a blockchain.\ntype CacheConfig struct {\n\tDisabled      bool          // Whether to disable trie write caching (archive node)\n\tTrieNodeLimit int           // Memory limit (MB) at which to flush the current in-memory trie to disk\n\tTrieTimeLimit time.Duration // Time limit after which to flush the current in-memory trie to disk\n}\n\ntype Downloader interface {\n\tWait()\n\tNotify()\n}\n\n// BlockChain represents the canonical chain given a database with a genesis\n// block. The Blockchain manages chain imports, reverts, chain reorganisations.\n//\n// Importing blocks in to the block chain happens according to the set of rules\n// defined by the two stage Validator. Processing of blocks is done using the\n// Processor which processes the included transaction. The validation of the state\n// is done in the second part of the Validator. Failing results in aborting of\n// the import.\n//\n// The BlockChain also helps in returning blocks from **any** chain included\n// in the database as well as blocks that represents the canonical chain. It's\n// important to note that GetBlock can return any block and does not need to be\n// included in the canonical one where as GetBlockByNumber always represents the\n// canonical chain.\ntype BlockChain struct {\n\tchainConfig *params.ChainConfig // Chain & network configuration\n\tcacheConfig *CacheConfig        // Cache configuration for pruning\n\n\tdb     serodb.Database // Low level persistent database to store final content in\n\ttriegc *prque.Prque    // Priority queue mapping block numbers to tries to gc\n\tgcproc time.Duration   // Accumulates canonical block processing for trie dumping\n\n\thc            *HeaderChain\n\trmLogsFeed    event.Feed\n\tchainFeed     event.Feed\n\tchainSideFeed event.Feed\n\tchainHeadFeed event.Feed\n\tlogsFeed      event.Feed\n\tscope         event.SubscriptionScope\n\tgenesisBlock  *types.Block\n\n\tmu      sync.RWMutex // global mutex for locking chain operations\n\tchainmu sync.RWMutex // blockchain insertion lock\n\tprocmu  sync.RWMutex // block processor lock\n\n\tcheckpoint       int          // checkpoint counts towards the new checkpoint\n\tcurrentBlock     atomic.Value // Current head of the block chain\n\tcurrentFastBlock atomic.Value // Current head of the fast-sync chain (may be above the block chain!)\n\n\tstateCache   state.Database // State database to reuse between imports (contains state cache)\n\tbodyCache    *lru.Cache     // Cache for the most recent block bodies\n\tbodyRLPCache *lru.Cache     // Cache for the most recent block bodies in RLP encoded format\n\tblockCache   *lru.Cache     // Cache for the most recent entire blocks\n\tfutureBlocks *lru.Cache     // future blocks are blocks added for later processing\n\n\tquit    chan struct{} // blockchain quit channel\n\trunning int32         // running must be called atomically\n\t// procInterrupt must be atomically called\n\tprocInterrupt int32          // interrupt signaler for block processing\n\twg            sync.WaitGroup // chain processing wait group for shutting down\n\n\tengine    consensus.Engine\n\tprocessor Processor // block processor interface\n\tvalidator Validator // block and state validator interface\n\tvmConfig  vm.Config\n\n\tbadBlocks *lru.Cache // Bad block cache\n\n\taccountManager *accounts.Manager\n}\n\n// NewBlockChain returns a fully initialised block chain using information\n// available in the database. It initialises the default Ethereum Validator and\n// Processor.\nfunc NewBlockChain(db serodb.Database, cacheConfig *CacheConfig, chainConfig *params.ChainConfig, engine consensus.Engine, vmConfig vm.Config, accountManager *accounts.Manager) (*BlockChain, error) {\n\tif cacheConfig == nil {\n\t\tcacheConfig = &CacheConfig{\n\t\t\tTrieNodeLimit: 256 * 1024 * 1024,\n\t\t\tTrieTimeLimit: 5 * time.Minute,\n\t\t}\n\t}\n\tbodyCache, _ := lru.New(bodyCacheLimit)\n\tbodyRLPCache, _ := lru.New(bodyCacheLimit)\n\tblockCache, _ := lru.New(blockCacheLimit)\n\tfutureBlocks, _ := lru.New(maxFutureBlocks)\n\tbadBlocks, _ := lru.New(badBlockLimit)\n\n\tbc := &BlockChain{\n\t\tchainConfig:  chainConfig,\n\t\tcacheConfig:  cacheConfig,\n\t\tdb:           db,\n\t\ttriegc:       prque.New(),\n\t\tstateCache:   state.NewDatabase(db),\n\t\tquit:         make(chan struct{}),\n\t\tbodyCache:    bodyCache,\n\t\tbodyRLPCache: bodyRLPCache,\n\t\tblockCache:   blockCache,\n\t\tfutureBlocks: futureBlocks,\n\t\tengine:       engine,\n\t\tvmConfig:     vmConfig,\n\t\tbadBlocks:    badBlocks,\n\t}\n\tbc.SetValidator(NewBlockValidator(chainConfig, bc, engine))\n\tbc.SetProcessor(NewStateProcessor(chainConfig, bc, engine))\n\tbc.accountManager = accountManager\n\n\tvar err error\n\tbc.hc, err = NewHeaderChain(db, chainConfig, engine, bc.getProcInterrupt)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tbc.genesisBlock = bc.GetBlockByNumber(0)\n\tif bc.genesisBlock == nil {\n\t\treturn nil, ErrNoGenesis\n\t}\n\tif err := bc.loadLastState(); err != nil {\n\t\treturn nil, err\n\t}\n\t// Take ownership of this particular state\n\tgo bc.update()\n\n\treturn bc, nil\n}\n\nfunc (bc *BlockChain) getProcInterrupt() bool {\n\treturn atomic.LoadInt32(&bc.procInterrupt) == 1\n}\n\ntype State1BlockChain struct {\n\tBc *BlockChain\n}\n\nfunc (self *State1BlockChain) GetBlockByNumber(num uint64) *types.Block {\n\treturn self.Bc.GetBlockByNumber(num)\n}\n\nfunc (self *State1BlockChain) GetHeaderByNumber(num uint64) *types.Header {\n\treturn self.Bc.GetHeaderByNumber(num)\n}\n\nfunc (self *State1BlockChain) GetDB() serodb.Database {\n\treturn self.Bc.db\n}\n\nfunc (self *State1BlockChain) GetCurrenHeader() *types.Header {\n\treturn self.Bc.CurrentBlock().Header()\n}\n\nfunc (self *State1BlockChain) GetHeader(hash *common.Hash) *types.Header {\n\treturn self.Bc.GetHeaderByHash(*hash)\n}\n\nfunc (self *State1BlockChain) IsContract(address common.Address) (ret bool, e error) {\n\tempty := common.Hash{}\n\tif bytes.Compare(address[64:], empty[:]) != 0 {\n\t\tret = false\n\t\treturn\n\t}\n\tif state, err := self.Bc.State(); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tif state.GetCodeSize(address) > 0 {\n\t\t\tret = true\n\t\t\treturn\n\t\t} else {\n\t\t\tret = false\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *State1BlockChain) IsValid() bool {\n\theader := self.Bc.CurrentHeader()\n\tif header.Number.Uint64() < seroparam.DefaultConfirmedBlock() {\n\t\treturn false\n\t}\n\tif _, e := state.New(self.Bc.stateCache, header); e != nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (self *State1BlockChain) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gas *big.Int) (gaslimit uint64, e error) {\n\tif state, err := self.Bc.State(); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\treturn state.GetSeroGasLimit(to, tfee, gas)\n\t}\n}\n\nfunc (self *State1BlockChain) CurrentState(hash *common.Hash) *zstate.ZState {\n\theader := self.Bc.GetHeaderByHash(*hash)\n\tvar st *state.StateDB\n\tvar e error\n\tst, e = state.New(self.Bc.stateCache, header)\n\tif e != nil {\n\t\tpanic(e)\n\t}\n\treturn st.CurrentZState()\n}\nfunc (self *State1BlockChain) GetTks() []c_type.Tk {\n\ttks := []c_type.Tk{}\n\tfor _, w := range self.Bc.accountManager.Wallets() {\n\t\ttk := w.Accounts()[0].Tk\n\t\ttks = append(tks, tk.ToTk())\n\t}\n\treturn tks\n}\n\nfunc (self *State1BlockChain) GetTkAt(tk *c_type.Tk) uint64 {\n\tfor _, w := range self.Bc.accountManager.Wallets() {\n\t\tif w.Accounts()[0].Tk.ToTk() == *tk {\n\t\t\treturn w.Accounts()[0].At\n\t\t}\n\t}\n\treturn 0\n}\nfunc (bc *BlockChain) GetDB() serodb.Database {\n\treturn bc.db\n}\n\n// loadLastState loads the last known chain state from the database. This method\n// assumes that the chain manager mutex is held.\nfunc (bc *BlockChain) loadLastState() error {\n\t// Restore the last known head block\n\thead := rawdb.ReadHeadBlockHash(bc.db)\n\tif head == (common.Hash{}) {\n\t\t// Corrupt or empty database, init from scratch\n\t\tlog.Warn(\"Empty database, resetting chain\")\n\t\treturn bc.Reset()\n\t}\n\n\tvar currentBlock *types.Block\n\tvar currentHeader *types.Header\n\tif seroparam.DefaultCurrentBlock() > 0 {\n\t\tcurrentBlock = bc.GetBlockByNumber(seroparam.DefaultCurrentBlock())\n\n\t\tbc.currentBlock.Store(currentBlock)\n\t\tcurrentHeader = currentBlock.Header()\n\t\tbc.hc.SetCurrentHeader(currentHeader)\n\t\tbc.currentFastBlock.Store(currentBlock)\n\t} else {\n\t\t// Make sure the entire head block is available\n\t\tcurrentBlock = bc.GetBlockByHash(head)\n\t\tif currentBlock == nil {\n\t\t\t// Corrupt or empty database, init from scratch\n\t\t\tlog.Warn(\"Head block missing, resetting chain\", \"hash\", head)\n\t\t\treturn bc.Reset()\n\t\t}\n\t\t// Make sure the state associated with the block is available\n\t\tif _, err := state.New(bc.stateCache, currentBlock.Header()); err != nil {\n\t\t\t// Dangling block without a state associated, init from scratch\n\t\t\tlog.Warn(\"Head state missing, repairing chain\", \"number\", currentBlock.Number(), \"hash\", currentBlock.Hash())\n\t\t\tif err := bc.repair(&currentBlock); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\t// Everything seems to be fine, set as the head block\n\t\tbc.currentBlock.Store(currentBlock)\n\n\t\t// Restore the last known head header\n\t\tcurrentHeader = currentBlock.Header()\n\t\tif head := rawdb.ReadHeadHeaderHash(bc.db); head != (common.Hash{}) {\n\t\t\tif header := bc.GetHeaderByHash(head); header != nil {\n\t\t\t\tcurrentHeader = header\n\t\t\t}\n\t\t}\n\t\tbc.hc.SetCurrentHeader(currentHeader)\n\n\t\t// Restore the last known head fast block\n\t\tbc.currentFastBlock.Store(currentBlock)\n\t\tif head := rawdb.ReadHeadFastBlockHash(bc.db); head != (common.Hash{}) {\n\t\t\tif block := bc.GetBlockByHash(head); block != nil {\n\t\t\t\tbc.currentFastBlock.Store(block)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Issue a status log for the user\n\tcurrentFastBlock := bc.CurrentFastBlock()\n\n\theaderTd := bc.GetTd(currentHeader.Hash(), currentHeader.Number.Uint64())\n\tblockTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64())\n\tfastTd := bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64())\n\n\tlog.Info(\"Loaded most recent local header\", \"number\", currentHeader.Number, \"hash\", currentHeader.Hash(), \"td\", headerTd)\n\tlog.Info(\"Loaded most recent local full block\", \"number\", currentBlock.Number(), \"hash\", currentBlock.Hash(), \"td\", blockTd)\n\tlog.Info(\"Loaded most recent local fast block\", \"number\", currentFastBlock.Number(), \"hash\", currentFastBlock.Hash(), \"td\", fastTd)\n\n\treturn nil\n}\n\n// SetHead rewinds the local chain to a new head. In the case of headers, everything\n// above the new head will be deleted and the new one set. In the case of blocks\n// though, the head may be further rewound if block bodies are missing (non-archive\n// nodes after a fast sync).\nfunc (bc *BlockChain) SetHead(head uint64, delFn DeleteCallback) error {\n\tlog.Warn(\"Rewinding blockchain\", \"target\", head)\n\n\tbc.mu.Lock()\n\tdefer bc.mu.Unlock()\n\n\t// Rewind the header chain, deleting all block bodies until then\n\n\tbc.hc.SetHead(head, delFn)\n\tcurrentHeader := bc.hc.CurrentHeader()\n\n\t// Clear out any stale content from the caches\n\tbc.bodyCache.Purge()\n\tbc.bodyRLPCache.Purge()\n\tbc.blockCache.Purge()\n\tbc.futureBlocks.Purge()\n\n\t// Rewind the block chain, ensuring we don't end up with a stateless head block\n\tif currentBlock := bc.CurrentBlock(); currentBlock != nil && currentHeader.Number.Uint64() < currentBlock.NumberU64() {\n\t\tbc.currentBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64()))\n\t}\n\tif currentBlock := bc.CurrentBlock(); currentBlock != nil {\n\t\tif _, err := state.New(bc.stateCache, currentBlock.Header()); err != nil {\n\t\t\t// Rewound state missing, rolled back to before pivot, reset to genesis\n\t\t\tbc.currentBlock.Store(bc.genesisBlock)\n\t\t}\n\t}\n\t// Rewind the fast block in a simpleton way to the target head\n\tif currentFastBlock := bc.CurrentFastBlock(); currentFastBlock != nil && currentHeader.Number.Uint64() < currentFastBlock.NumberU64() {\n\t\tbc.currentFastBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64()))\n\t}\n\t// If either blocks reached nil, reset to the genesis state\n\tif currentBlock := bc.CurrentBlock(); currentBlock == nil {\n\t\tbc.currentBlock.Store(bc.genesisBlock)\n\t}\n\tif currentFastBlock := bc.CurrentFastBlock(); currentFastBlock == nil {\n\t\tbc.currentFastBlock.Store(bc.genesisBlock)\n\t}\n\tcurrentBlock := bc.CurrentBlock()\n\tcurrentFastBlock := bc.CurrentFastBlock()\n\n\trawdb.WriteHeadBlockHash(bc.db, currentBlock.Hash())\n\trawdb.WriteHeadFastBlockHash(bc.db, currentFastBlock.Hash())\n\n\treturn bc.loadLastState()\n}\n\n// FastSyncCommitHead sets the current head block to the one defined by the hash\n// irrelevant what the chain contents were prior.\nfunc (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error {\n\t// Make sure that both the block as well at its state trie exists\n\tblock := bc.GetBlockByHash(hash)\n\tif block == nil {\n\t\treturn fmt.Errorf(\"non existent block [%x…]\", hash[:4])\n\t}\n\tif _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB(), 0); err != nil {\n\t\treturn err\n\t}\n\t// If all checks out, manually set the head block\n\tbc.mu.Lock()\n\tbc.currentBlock.Store(block)\n\tbc.mu.Unlock()\n\n\tlog.Info(\"Committed new head block\", \"number\", block.Number(), \"hash\", hash)\n\treturn nil\n}\n\n// GasLimit returns the gas limit of the current HEAD block.\nfunc (bc *BlockChain) GasLimit() uint64 {\n\treturn bc.CurrentBlock().GasLimit()\n}\n\n// CurrentBlock retrieves the current head block of the canonical chain. The\n// block is retrieved from the blockchain's internal cache.\nfunc (bc *BlockChain) CurrentBlock() *types.Block {\n\treturn bc.currentBlock.Load().(*types.Block)\n}\n\n// CurrentFastBlock retrieves the current fast-sync head block of the canonical\n// chain. The block is retrieved from the blockchain's internal cache.\nfunc (bc *BlockChain) CurrentFastBlock() *types.Block {\n\treturn bc.currentFastBlock.Load().(*types.Block)\n}\n\n// SetProcessor sets the processor required for making state modifications.\nfunc (bc *BlockChain) SetProcessor(processor Processor) {\n\tbc.procmu.Lock()\n\tdefer bc.procmu.Unlock()\n\tbc.processor = processor\n}\n\n// SetValidator sets the validator which is used to validate incoming blocks.\nfunc (bc *BlockChain) SetValidator(validator Validator) {\n\tbc.procmu.Lock()\n\tdefer bc.procmu.Unlock()\n\tbc.validator = validator\n}\n\n// Validator returns the current validator.\nfunc (bc *BlockChain) Validator() Validator {\n\tbc.procmu.RLock()\n\tdefer bc.procmu.RUnlock()\n\treturn bc.validator\n}\n\n// Processor returns the current processor.\nfunc (bc *BlockChain) Processor() Processor {\n\tbc.procmu.RLock()\n\tdefer bc.procmu.RUnlock()\n\treturn bc.processor\n}\n\n// State returns a new mutable state based on the current HEAD block.\nfunc (bc *BlockChain) State() (*state.StateDB, error) {\n\tblock := bc.CurrentBlock()\n\treturn bc.StateAt(block.Header())\n}\n\n// StateAt returns a new mutable state based on a particular point in time.\nfunc (bc *BlockChain) StateAt(header *types.Header) (*state.StateDB, error) {\n\treturn state.New(bc.stateCache, header)\n}\n\n// Reset purges the entire blockchain, restoring it to its genesis state.\nfunc (bc *BlockChain) Reset() error {\n\treturn bc.ResetWithGenesisBlock(bc.genesisBlock)\n}\n\n// ResetWithGenesisBlock purges the entire blockchain, restoring it to the\n// specified genesis state.\nfunc (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error {\n\t// Dump the entire block chain and purge the caches\n\n\tif err := bc.SetHead(0, DelFn); err != nil {\n\t\treturn err\n\t}\n\tbc.mu.Lock()\n\tdefer bc.mu.Unlock()\n\n\t// Prepare the genesis block and reinitialise the chain\n\tif err := bc.hc.WriteTd(genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()); err != nil {\n\t\tlog.Crit(\"Failed to write genesis block TD\", \"err\", err)\n\t}\n\trawdb.WriteBlock(bc.db, genesis)\n\n\tbc.genesisBlock = genesis\n\tbc.insert(bc.genesisBlock)\n\tbc.currentBlock.Store(bc.genesisBlock)\n\tbc.hc.SetGenesis(bc.genesisBlock.Header())\n\tbc.hc.SetCurrentHeader(bc.genesisBlock.Header())\n\tbc.currentFastBlock.Store(bc.genesisBlock)\n\n\treturn nil\n}\n\n// repair tries to repair the current blockchain by rolling back the current block\n// until one with associated state is found. This is needed to fix incomplete db\n// writes caused either by crashes/power outages, or simply non-committed tries.\n//\n// This method only rolls back the current block. The current header and current\n// fast block are left intact.\nfunc (bc *BlockChain) repair(head **types.Block) error {\n\tfor {\n\t\t// Abort if we've rewound to a head block that does have associated state\n\t\tif _, err := state.New(bc.stateCache, (*head).Header()); err == nil {\n\t\t\tlog.Info(\"Rewound blockchain to past state\", \"number\", (*head).Number(), \"hash\", (*head).Hash())\n\t\t\treturn nil\n\t\t}\n\t\t// Otherwise rewind one block and recheck state availability there\n\t\t(*head) = bc.GetBlock((*head).ParentHash(), (*head).NumberU64()-1)\n\t}\n}\n\n// Export writes the active chain to the given writer.\nfunc (bc *BlockChain) Export(w io.Writer) error {\n\treturn bc.ExportN(w, uint64(0), bc.CurrentBlock().NumberU64())\n}\n\n// ExportN writes a subset of the active chain to the given writer.\nfunc (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error {\n\tbc.mu.RLock()\n\tdefer bc.mu.RUnlock()\n\n\tif first > last {\n\t\treturn fmt.Errorf(\"export failed: first (%d) is greater than last (%d)\", first, last)\n\t}\n\tlog.Info(\"Exporting batch of blocks\", \"count\", last-first+1)\n\n\tstart, reported := time.Now(), time.Now()\n\tfor nr := first; nr <= last; nr++ {\n\t\tblock := bc.GetBlockByNumber(nr)\n\t\tif block == nil {\n\t\t\treturn fmt.Errorf(\"export failed on #%d: not found\", nr)\n\t\t}\n\t\tif err := block.EncodeRLP(w); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif time.Since(reported) >= statsReportLimit {\n\t\t\tlog.Info(\"Exporting blocks\", \"exported\", block.NumberU64()-first, \"elapsed\", common.PrettyDuration(time.Since(start)))\n\t\t\treported = time.Now()\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// insert injects a new head block into the current block chain. This method\n// assumes that the block is indeed a true head. It will also reset the head\n// header and the head fast sync block to this very same block if they are older\n// or if they are on a different side chain.\n//\n// Note, this function assumes that the `mu` mutex is held!\nfunc (bc *BlockChain) insert(block *types.Block) {\n\t// If the block is on a side chain or an unknown one, force other heads onto it too\n\tupdateHeads := rawdb.ReadCanonicalHash(bc.db, block.NumberU64()) != block.Hash()\n\n\t// Add the block to the canonical chain number scheme and mark as the head\n\trawdb.WriteCanonicalHash(bc.db, block.Hash(), block.NumberU64())\n\trawdb.WriteHeadBlockHash(bc.db, block.Hash())\n\n\tbc.currentBlock.Store(block)\n\n\t// If the block is better than our head or is on a different chain, force update heads\n\tif updateHeads {\n\t\tbc.hc.SetCurrentHeader(block.Header())\n\t\trawdb.WriteHeadFastBlockHash(bc.db, block.Hash())\n\n\t\tbc.currentFastBlock.Store(block)\n\t}\n}\n\n// Genesis retrieves the chain's genesis block.\nfunc (bc *BlockChain) Genesis() *types.Block {\n\treturn bc.genesisBlock\n}\n\n// GetBody retrieves a block body (transactions) from the database by\n// hash, caching it if found.\nfunc (bc *BlockChain) GetBody(hash common.Hash) *types.Body {\n\t// Short circuit if the body's already in the cache, retrieve otherwise\n\tif cached, ok := bc.bodyCache.Get(hash); ok {\n\t\tbody := cached.(*types.Body)\n\t\treturn body\n\t}\n\tnumber := bc.hc.GetBlockNumber(hash)\n\tif number == nil {\n\t\treturn nil\n\t}\n\tbody := rawdb.ReadBody(bc.db, hash, *number)\n\tif body == nil {\n\t\treturn nil\n\t}\n\t// Cache the found body for next time and return\n\tbc.bodyCache.Add(hash, body)\n\treturn body\n}\n\n// GetBodyRLP retrieves a block body in RLP encoding from the database by hash,\n// caching it if found.\nfunc (bc *BlockChain) GetBodyRLP(hash common.Hash) rlp.RawValue {\n\t// Short circuit if the body's already in the cache, retrieve otherwise\n\tif cached, ok := bc.bodyRLPCache.Get(hash); ok {\n\t\treturn cached.(rlp.RawValue)\n\t}\n\tnumber := bc.hc.GetBlockNumber(hash)\n\tif number == nil {\n\t\treturn nil\n\t}\n\tbody := rawdb.ReadBodyRLP(bc.db, hash, *number)\n\tif len(body) == 0 {\n\t\treturn nil\n\t}\n\t// Cache the found body for next time and return\n\tbc.bodyRLPCache.Add(hash, body)\n\treturn body\n}\n\n// HasBlock checks if a block is fully present in the database or not.\nfunc (bc *BlockChain) HasBlock(hash common.Hash, number uint64) bool {\n\tif bc.blockCache.Contains(hash) {\n\t\treturn true\n\t}\n\treturn rawdb.HasBody(bc.db, hash, number)\n}\n\n// HasState checks if state trie is fully present in the database or not.\nfunc (bc *BlockChain) HasState(hash common.Hash) bool {\n\t_, err := bc.stateCache.OpenTrie(hash)\n\treturn err == nil\n}\n\n// HasBlockAndState checks if a block and associated state trie is fully present\n// in the database or not, caching it if present.\nfunc (bc *BlockChain) HasBlockAndState(hash common.Hash, number uint64) bool {\n\t// Check first that the block itself is known\n\tblock := bc.GetBlock(hash, number)\n\tif block == nil {\n\t\treturn false\n\t}\n\treturn bc.HasState(block.Root())\n}\n\n// GetBlock retrieves a block from the database by hash and number,\n// caching it if found.\nfunc (bc *BlockChain) GetBlock(hash common.Hash, number uint64) *types.Block {\n\t// Short circuit if the block's already in the cache, retrieve otherwise\n\tif block, ok := bc.blockCache.Get(hash); ok {\n\t\treturn block.(*types.Block)\n\t}\n\tblock := rawdb.ReadBlock(bc.db, hash, number)\n\tif block == nil {\n\t\treturn nil\n\t}\n\t// Cache the found block for next time and return\n\tbc.blockCache.Add(block.Hash(), block)\n\treturn block\n}\n\n// GetBlockByHash retrieves a block from the database by hash, caching it if found.\nfunc (bc *BlockChain) GetBlockByHash(hash common.Hash) *types.Block {\n\tnumber := bc.hc.GetBlockNumber(hash)\n\tif number == nil {\n\t\treturn nil\n\t}\n\treturn bc.GetBlock(hash, *number)\n}\n\n// GetBlockByNumber retrieves a block from the database by number, caching it\n// (associated with its hash) if found.\nfunc (bc *BlockChain) GetBlockByNumber(number uint64) *types.Block {\n\thash := rawdb.ReadCanonicalHash(bc.db, number)\n\tif hash == (common.Hash{}) {\n\t\treturn nil\n\t}\n\treturn bc.GetBlock(hash, number)\n}\n\n// GetReceiptsByHash retrieves the receipts for all transactions in a given block.\nfunc (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts {\n\tnumber := rawdb.ReadHeaderNumber(bc.db, hash)\n\tif number == nil {\n\t\treturn nil\n\t}\n\treturn rawdb.ReadReceipts(bc.db, hash, *number)\n}\n\n// GetBlocksFromHash returns the block corresponding to hash and up to n-1 ancestors.\n// [deprecated by sero/62]\nfunc (bc *BlockChain) GetBlocksFromHash(hash common.Hash, n int) (blocks []*types.Block) {\n\tnumber := bc.hc.GetBlockNumber(hash)\n\tif number == nil {\n\t\treturn nil\n\t}\n\tfor i := 0; i < n; i++ {\n\t\tblock := bc.GetBlock(hash, *number)\n\t\tif block == nil {\n\t\t\tbreak\n\t\t}\n\t\tblocks = append(blocks, block)\n\t\thash = block.ParentHash()\n\t\t*number--\n\t}\n\treturn\n}\n\n// TrieNode retrieves a blob of data associated with a trie node (or code hash)\n// either from ephemeral in-memory cache, or from persistent storage.\nfunc (bc *BlockChain) TrieNode(hash common.Hash) ([]byte, error) {\n\treturn bc.stateCache.TrieDB().Node(hash)\n}\n\n// Stop stops the blockchain service. If any imports are currently in progress\n// it will abort them using the procInterrupt.\nfunc (bc *BlockChain) Stop() {\n\n\tif !atomic.CompareAndSwapInt32(&bc.running, 0, 1) {\n\t\treturn\n\t}\n\t// Unsubscribe all subscriptions registered from blockchain\n\tbc.scope.Close()\n\tclose(bc.quit)\n\t//bc.stopLock.Lock()\n\tatomic.StoreInt32(&bc.procInterrupt, 1)\n\t//bc.stopLock.Unlock()\n\n\tbc.wg.Wait()\n\n\t// Ensure the state of a recent block is also stored to disk before exiting.\n\t// We're writing three different states to catch different restart scenarios:\n\t//  - HEAD:     So we don't need to reprocess any blocks in the general case\n\t//  - HEAD-127: So we have a hard limit on the number of blocks reexecuted\n\tif !bc.cacheConfig.Disabled {\n\t\ttriedb := bc.stateCache.TrieDB()\n\n\t\tfor _, offset := range []uint64{0, 1, triesInMemory - 1} {\n\t\t\tif number := bc.CurrentBlock().NumberU64(); number > offset {\n\t\t\t\trecent := bc.GetBlockByNumber(number - offset)\n\n\t\t\t\tlog.Info(\"Writing cached state to disk\", \"block\", recent.Number(), \"hash\", recent.Hash(), \"root\", recent.Root())\n\t\t\t\tif err := triedb.Commit(recent.Root(), true); err != nil {\n\t\t\t\t\tlog.Error(\"Failed to commit recent state trie\", \"err\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor !bc.triegc.Empty() {\n\t\t\ttriedb.Dereference(bc.triegc.PopItem().(common.Hash))\n\t\t}\n\t\tif size, _ := triedb.Size(); size != 0 {\n\t\t\tlog.Error(\"Dangling trie nodes after full cleanup\")\n\t\t}\n\t}\n\tlog.Info(\"Blockchain manager stopped\")\n}\n\nfunc (bc *BlockChain) procFutureBlocks() {\n\tblocks := make([]*types.Block, 0, bc.futureBlocks.Len())\n\tfor _, hash := range bc.futureBlocks.Keys() {\n\t\tif block, exist := bc.futureBlocks.Peek(hash); exist {\n\t\t\tblocks = append(blocks, block.(*types.Block))\n\t\t}\n\t}\n\tif len(blocks) > 0 {\n\t\ttypes.BlockBy(types.Number).Sort(blocks)\n\n\t\t// Insert one by one as chain insertion needs contiguous ancestry between blocks\n\t\tfor i := range blocks {\n\t\t\tbc.InsertChain(blocks[i : i+1])\n\t\t}\n\t}\n}\n\n// WriteStatus status of write\ntype WriteStatus byte\n\nconst (\n\tNonStatTy WriteStatus = iota\n\tCanonStatTy\n\tSideStatTy\n)\n\n// Rollback is designed to remove a chain of links from the database that aren't\n// certain enough to be valid.\nfunc (bc *BlockChain) Rollback(chain []common.Hash) {\n\tbc.mu.Lock()\n\tdefer bc.mu.Unlock()\n\n\tfor i := len(chain) - 1; i >= 0; i-- {\n\t\thash := chain[i]\n\n\t\tcurrentHeader := bc.hc.CurrentHeader()\n\t\tif currentHeader.Hash() == hash {\n\t\t\tbc.hc.SetCurrentHeader(bc.GetHeader(currentHeader.ParentHash, currentHeader.Number.Uint64()-1))\n\t\t}\n\t\tif currentFastBlock := bc.CurrentFastBlock(); currentFastBlock.Hash() == hash {\n\t\t\tnewFastBlock := bc.GetBlock(currentFastBlock.ParentHash(), currentFastBlock.NumberU64()-1)\n\t\t\tbc.currentFastBlock.Store(newFastBlock)\n\t\t\trawdb.WriteHeadFastBlockHash(bc.db, newFastBlock.Hash())\n\t\t}\n\t\tif currentBlock := bc.CurrentBlock(); currentBlock.Hash() == hash {\n\t\t\tnewBlock := bc.GetBlock(currentBlock.ParentHash(), currentBlock.NumberU64()-1)\n\t\t\tbc.currentBlock.Store(newBlock)\n\t\t\trawdb.WriteHeadBlockHash(bc.db, newBlock.Hash())\n\t\t}\n\t}\n}\n\n// SetReceiptsData computes all the non-consensus fields of the receipts\nfunc SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts types.Receipts) error {\n\t//abi := types.MakeSigner(config, block.Number())\n\n\ttransactions, logIndex := block.Transactions(), uint(0)\n\tif len(transactions) != len(receipts) {\n\t\treturn errors.New(\"transaction and receipt count mismatch\")\n\t}\n\n\tfor j := 0; j < len(receipts); j++ {\n\t\t// The transaction hash can be retrieved from the transaction itself\n\t\treceipts[j].TxHash = transactions[j].Hash()\n\n\t\t// The used gas can be calculated based on previous receipts\n\t\tif j == 0 {\n\t\t\treceipts[j].GasUsed = receipts[j].CumulativeGasUsed\n\t\t} else {\n\t\t\treceipts[j].GasUsed = receipts[j].CumulativeGasUsed - receipts[j-1].CumulativeGasUsed\n\t\t}\n\t\t// The derived log fields can simply be set from the block and transaction\n\t\tfor k := 0; k < len(receipts[j].Logs); k++ {\n\t\t\treceipts[j].Logs[k].BlockNumber = block.NumberU64()\n\t\t\treceipts[j].Logs[k].BlockHash = block.Hash()\n\t\t\treceipts[j].Logs[k].TxHash = receipts[j].TxHash\n\t\t\treceipts[j].Logs[k].TxIndex = uint(j)\n\t\t\treceipts[j].Logs[k].Index = logIndex\n\t\t\tlogIndex++\n\t\t}\n\t}\n\treturn nil\n}\n\n// InsertReceiptChain attempts to complete an already existing header chain with\n// transaction and receipt data.\nfunc (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) {\n\tbc.wg.Add(1)\n\tdefer bc.wg.Done()\n\n\t// Do a sanity check that the provided chain is actually ordered and linked\n\tfor i := 1; i < len(blockChain); i++ {\n\t\tif blockChain[i].NumberU64() != blockChain[i-1].NumberU64()+1 || blockChain[i].ParentHash() != blockChain[i-1].Hash() {\n\t\t\tlog.Error(\"Non contiguous receipt insert\", \"number\", blockChain[i].Number(), \"hash\", blockChain[i].Hash(), \"parent\", blockChain[i].ParentHash(),\n\t\t\t\t\"prevnumber\", blockChain[i-1].Number(), \"prevhash\", blockChain[i-1].Hash())\n\t\t\treturn 0, fmt.Errorf(\"non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])\", i-1, blockChain[i-1].NumberU64(),\n\t\t\t\tblockChain[i-1].Hash().Bytes()[:4], i, blockChain[i].NumberU64(), blockChain[i].Hash().Bytes()[:4], blockChain[i].ParentHash().Bytes()[:4])\n\t\t}\n\t}\n\n\tvar (\n\t\tstats = struct{ processed, ignored int32 }{}\n\t\tstart = time.Now()\n\t\tbytes = 0\n\t\tbatch = bc.db.NewBatch()\n\t)\n\tfor i, block := range blockChain {\n\t\treceipts := receiptChain[i]\n\t\t// Short circuit insertion if shutting down or processing failed\n\t\tif atomic.LoadInt32(&bc.procInterrupt) == 1 {\n\t\t\treturn 0, nil\n\t\t}\n\t\t// Short circuit if the owner header is unknown\n\t\tif !bc.HasHeader(block.Hash(), block.NumberU64()) {\n\t\t\treturn i, fmt.Errorf(\"containing header #%d [%x…] unknown\", block.Number(), block.Hash().Bytes()[:4])\n\t\t}\n\t\t// Skip if the entire data is already known\n\t\tif bc.HasBlock(block.Hash(), block.NumberU64()) {\n\t\t\tstats.ignored++\n\t\t\tcontinue\n\t\t}\n\t\t// Compute all the non-consensus fields of the receipts\n\t\tif err := SetReceiptsData(bc.chainConfig, block, receipts); err != nil {\n\t\t\treturn i, fmt.Errorf(\"failed to set receipts data: %v\", err)\n\t\t}\n\t\t// Write all the data out into the database\n\t\trawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body())\n\t\trawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receipts)\n\t\trawdb.WriteTxLookupEntries(batch, block)\n\n\t\tstats.processed++\n\n\t\tif batch.ValueSize() >= serodb.IdealBatchSize {\n\t\t\tif err := batch.Write(); err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\tbytes += batch.ValueSize()\n\t\t\tbatch.Reset()\n\t\t}\n\t}\n\tif batch.ValueSize() > 0 {\n\t\tbytes += batch.ValueSize()\n\t\tif err := batch.Write(); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\t// Update the head fast sync block if better\n\tbc.mu.Lock()\n\thead := blockChain[len(blockChain)-1]\n\tif td := bc.GetTd(head.Hash(), head.NumberU64()); td != nil { // Rewind may have occurred, skip in that case\n\t\tcurrentFastBlock := bc.CurrentFastBlock()\n\t\tif bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 {\n\t\t\trawdb.WriteHeadFastBlockHash(bc.db, head.Hash())\n\t\t\tbc.currentFastBlock.Store(head)\n\t\t}\n\t}\n\tbc.mu.Unlock()\n\n\tlog.Info(\"Imported new block receipts\",\n\t\t\"count\", stats.processed,\n\t\t\"elapsed\", common.PrettyDuration(time.Since(start)),\n\t\t\"number\", head.Number(),\n\t\t\"hash\", head.Hash(),\n\t\t\"size\", common.StorageSize(bytes),\n\t\t\"ignored\", stats.ignored)\n\treturn 0, nil\n}\n\nvar lastWrite uint64\n\n// WriteBlockWithoutState writes only the block and its metadata to the database,\n// but does not write any state. This is used to construct competing side forks\n// up to the point where they exceed the canonical total difficulty.\nfunc (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (err error) {\n\tbc.wg.Add(1)\n\tdefer bc.wg.Done()\n\n\tif err := bc.hc.WriteTd(block.Hash(), block.NumberU64(), td); err != nil {\n\t\treturn err\n\t}\n\trawdb.WriteBlock(bc.db, block)\n\n\treturn nil\n}\n\n/*func (bc *BlockChain) WriteBlockWithStateWithStopLock(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) {\n\tbc.stopLock.Lock()\n\tdefer bc.stopLock.Unlock()\n\tif atomic.LoadInt32(&bc.procInterrupt) == 1 {\n\t\treturn NonStatTy, errors.New(\"bc already stoped\")\n\t} else {\n\t\treturn bc.WriteBlockWithState(block, receipts, state)\n\t}\n}\n*/\n// WriteBlockWithState writes the block and all associated state to the database.\nfunc (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) {\n\tbc.wg.Add(1)\n\tdefer bc.wg.Done()\n\n\t// Calculate the total difficulty of the block\n\tptd := bc.GetTd(block.ParentHash(), block.NumberU64()-1)\n\tif ptd == nil {\n\t\treturn NonStatTy, consensus.ErrUnknownAncestor\n\t}\n\t// Make sure no inconsistent state is leaked during insertion\n\tbc.mu.Lock()\n\tdefer bc.mu.Unlock()\n\n\tcurrentBlock := bc.CurrentBlock()\n\tlocalTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64())\n\texternTd := new(big.Int).Add(block.Difficulty(), ptd)\n\n\t// Irrelevant of the canonical status, write the block itself to the database\n\tif err := bc.hc.WriteTd(block.Hash(), block.NumberU64(), externTd); err != nil {\n\t\treturn NonStatTy, err\n\t}\n\t// Write other block data using a batch.\n\tbatch := bc.db.NewBatch()\n\trawdb.WriteBlock(batch, block)\n\tblockhash := block.Hash()\n\n\tif block.Header().Number.Uint64() >= seroparam.SIP4() {\n\t\tstate.GetStakeCons().Record(block.Header(), batch)\n\t\tstakeState := stake.NewStakeState(state)\n\t\terr = stakeState.RecordVotes(batch, block)\n\t\tif err != nil {\n\t\t\tlog.Info(\"write block with pos\", \"err\", err)\n\t\t\treturn NonStatTy, err\n\t\t}\n\t}\n\tstate.NextZState().RecordBlock(batch, blockhash.HashToUint256())\n\n\troot, err := state.Commit(true)\n\tif root != block.Root() {\n\t\tlog.Info(\"WiriteBlockWithState root not equal Error\", \"root\", root, \"block.root\", block.Root())\n\t\treturn NonStatTy, err\n\t}\n\tif err != nil {\n\t\tlog.Error(\"WriteBlockWithState.Commit Error:\", \"root\", root, \"err\", err)\n\t\treturn NonStatTy, err\n\t}\n\tif block.Number().Uint64() <= zconfig.CheckPoints.MaxNum() {\n\t\tif err := zconfig.CheckPoints.Check(block.NumberU64(), block.Header().Root[:]); err != nil {\n\t\t\tlog.Error(\"WriteBlockWithState.CheckPoints.Check Error:\", \"root\", root, \"err\", err)\n\t\t\treturn NonStatTy, err\n\t\t}\n\t}\n\n\ttriedb := bc.stateCache.TrieDB()\n\n\t// If we're running an archive node, always flush\n\tif bc.cacheConfig.Disabled {\n\t\tif err := triedb.Commit(root, false); err != nil {\n\t\t\treturn NonStatTy, err\n\t\t}\n\t} else {\n\t\t// Full but not archive node, do proper garbage collection\n\t\ttriedb.Reference(root, common.Hash{}) // metadata reference to keep trie alive\n\t\tbc.triegc.Push(root, -float32(block.NumberU64()))\n\n\t\tif current := block.NumberU64(); current > triesInMemory {\n\t\t\t// If we exceeded our memory allowance, flush matured singleton nodes to disk\n\t\t\tvar (\n\t\t\t\tnodes, imgs = triedb.Size()\n\t\t\t\tlimit       = common.StorageSize(bc.cacheConfig.TrieNodeLimit) * 1024 * 1024\n\t\t\t)\n\t\t\tif nodes > limit || imgs > 4*1024*1024 {\n\t\t\t\ttriedb.Cap(limit - serodb.IdealBatchSize)\n\t\t\t}\n\t\t\t// Find the next state trie we need to commit\n\t\t\theader := bc.GetHeaderByNumber(current - triesInMemory)\n\t\t\tchosen := header.Number.Uint64()\n\n\t\t\tvar needCommit bool\n\n\t\t\tif zconfig.IsSnapshotMode() {\n\t\t\t\tneedCommit = zconfig.NeedSnapshot(block.NumberU64())\n\t\t\t} else {\n\t\t\t\tneedCommit = (bc.gcproc > bc.cacheConfig.TrieTimeLimit) || (header.Number.Uint64()%10000 == 0)\n\t\t\t}\n\n\t\t\t// If we exceeded out time allowance, flush an entire trie to disk\n\t\t\tif needCommit {\n\t\t\t\t// If we're exceeding limits but haven't reached a large enough memory gap,\n\t\t\t\t// warn the user that the system is becoming unstable.\n\t\t\t\tif chosen < lastWrite+triesInMemory && bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit {\n\t\t\t\t\tlog.Info(\"State in memory for too long, committing\", \"time\", bc.gcproc, \"allowance\", bc.cacheConfig.TrieTimeLimit, \"optimum\", float64(chosen-lastWrite)/triesInMemory)\n\t\t\t\t}\n\t\t\t\t// Flush an entire trie and restart the counters\n\t\t\t\ttriedb.Commit(header.Root, true)\n\t\t\t\tlastWrite = chosen\n\t\t\t\tbc.gcproc = 0\n\t\t\t}\n\t\t\t// Garbage collect anything below our required write retention\n\t\t\tfor !bc.triegc.Empty() {\n\t\t\t\troot, number := bc.triegc.Pop()\n\t\t\t\tif uint64(-number) > chosen {\n\t\t\t\t\tbc.triegc.Push(root, number)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\ttriedb.Dereference(root.(common.Hash))\n\t\t\t}\n\t\t}\n\t}\n\n\trawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receipts)\n\n\t// If the total difficulty is higher than our known, add it to the canonical chain\n\t// Second clause in the if statement reduces the vulnerability to selfish mining.\n\t// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf\n\treorg := externTd.Cmp(localTd) > 0\n\tcurrentBlock = bc.CurrentBlock()\n\tif !reorg && externTd.Cmp(localTd) == 0 {\n\t\t// Split same-difficulty blocks by number, then at random\n\t\treorg = block.NumberU64() < currentBlock.NumberU64()\n\t\tif !reorg && block.NumberU64() == currentBlock.NumberU64() {\n\t\t\tif block.NumberU64() < seroparam.SIP4() {\n\t\t\t\tif block.Transactions().Len() == currentBlock.Transactions().Len() {\n\t\t\t\t\treorg = mrand.Float64() < 0.5\n\t\t\t\t} else {\n\t\t\t\t\treorg = block.Transactions().Len() > currentBlock.Transactions().Len()\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif len(block.Header().CurrentVotes) == len(currentBlock.Header().CurrentVotes) {\n\t\t\t\t\tif block.Transactions().Len() == currentBlock.Transactions().Len() {\n\t\t\t\t\t\treorg = mrand.Float64() < 0.5\n\t\t\t\t\t} else {\n\t\t\t\t\t\treorg = block.Transactions().Len() > currentBlock.Transactions().Len()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treorg = len(block.Header().CurrentVotes) > len(currentBlock.Header().CurrentVotes)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif reorg {\n\t\t// Reorganise the chain if the parent is not the head block\n\t\tif block.ParentHash() != currentBlock.Hash() {\n\t\t\tif err := bc.reorg(currentBlock, block); err != nil {\n\t\t\t\treturn NonStatTy, err\n\t\t\t}\n\t\t}\n\t\t// Write the positional metadata for transaction/receipt lookups and preimages\n\t\trawdb.WriteTxLookupEntries(batch, block)\n\t\trawdb.WritePreimages(batch, block.NumberU64(), state.Preimages())\n\n\t\tstatus = CanonStatTy\n\t} else {\n\t\tstatus = SideStatTy\n\t}\n\n\tif err := batch.Write(); err != nil {\n\t\treturn NonStatTy, err\n\t}\n\n\t// Set new head.\n\tif status == CanonStatTy {\n\t\tbc.insert(block)\n\t}\n\tbc.futureBlocks.Remove(block.Hash())\n\treturn status, nil\n}\n\n// InsertChain attempts to insert the given batch of blocks in to the canonical\n// chain or, otherwise, create a fork. If an error is returned it will return\n// the index number of the failing block as well an error describing what went\n// wrong.\n//\n// After insertion is done, all accumulated events will be fired.\nfunc (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) {\n\tn, events, logs, err := bc.insertChain(chain, false)\n\tbc.PostChainEvents(events, logs)\n\treturn n, err\n}\n\nfunc test(i interface{}) {}\n\nfunc (bc *BlockChain) NewHeaderChecker(chain types.Blocks) (chan<- struct{}, <-chan error) {\n\theaders := make([]*types.Header, len(chain))\n\tseals := make([]bool, len(chain))\n\n\tfor i, block := range chain {\n\t\theaders[i] = block.Header()\n\t\tseals[i] = true\n\t}\n\n\treturn bc.engine.VerifyHeaders(bc, headers, seals)\n}\n\n// insertChain will execute the actual chain insertion and event aggregation. The\n// only reason this method exists as a separate one is to make locking cleaner\n// with deferred statements.\nfunc (bc *BlockChain) insertChain(chain types.Blocks, local bool) (int, []interface{}, []*types.Log, error) {\n\t// Sanity check that we have something meaningful to import\n\tif len(chain) == 0 {\n\t\treturn 0, nil, nil, nil\n\t}\n\t// Do a sanity check that the provided chain is actually ordered and linked\n\tfor i := 1; i < len(chain); i++ {\n\t\tif chain[i].NumberU64() != chain[i-1].NumberU64()+1 || chain[i].ParentHash() != chain[i-1].Hash() {\n\t\t\t// Chain broke ancestry, log a message (programming error) and skip insertion\n\t\t\tlog.Error(\"Non contiguous block insert\", \"number\", chain[i].Number(), \"hash\", chain[i].Hash(),\n\t\t\t\t\"parent\", chain[i].ParentHash(), \"prevnumber\", chain[i-1].Number(), \"prevhash\", chain[i-1].Hash())\n\n\t\t\treturn 0, nil, nil, fmt.Errorf(\"non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])\", i-1, chain[i-1].NumberU64(),\n\t\t\t\tchain[i-1].Hash().Bytes()[:4], i, chain[i].NumberU64(), chain[i].Hash().Bytes()[:4], chain[i].ParentHash().Bytes()[:4])\n\t\t}\n\t}\n\t// Pre-checks passed, start the full block imports\n\tbc.wg.Add(1)\n\tdefer bc.wg.Done()\n\n\tbc.chainmu.Lock()\n\tdefer bc.chainmu.Unlock()\n\n\t// A queued approach to delivering events. This is generally\n\t// faster than direct delivery and requires much less mutex\n\t// acquiring.\n\tvar (\n\t\tstats         = insertStats{startTime: mclock.Now()}\n\t\tevents        = make([]interface{}, 0, len(chain))\n\t\tlastCanon     *types.Block\n\t\tcoalescedLogs []*types.Log\n\t)\n\n\tis_all_in_checkpoints := true\n\tvar all_chain types.Blocks\n\tfor _, block := range chain {\n\t\tif block.Header().Number.Uint64() > uint64(zconfig.CheckPoints.MaxNum()) {\n\t\t\tis_all_in_checkpoints = false\n\t\t\tbreak\n\t\t}\n\t}\n\tif !is_all_in_checkpoints {\n\t\tall_chain = chain\n\t}\n\n\t// Start the parallel header verifier\n\tabort, results := bc.NewHeaderChecker(all_chain)\n\tdefer close(abort)\n\n\t// Start a parallel signature recovery (abi will fluke on fork transition, minimal perf loss)\n\t//senderCacher.recoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number()), chain)\n\ttx_abort, tx_results := NewTxChecker(bc, all_chain)\n\tdefer close(tx_abort)\n\n\t// Iterate over the blocks and insert when the verifier permits\n\tfor i, block := range chain {\n\t\t// If the chain is terminating, stop processing blocks\n\t\tif atomic.LoadInt32(&bc.procInterrupt) == 1 {\n\t\t\tlog.Debug(\"Premature abort during blocks processing\")\n\t\t\tbreak\n\t\t}\n\t\t// Wait for the block's verification to complete\n\t\tbstart := time.Now()\n\n\t\tvar err error\n\t\tif !is_all_in_checkpoints {\n\t\t\terr = <-results\n\t\t}\n\n\t\tif err == nil {\n\t\t\terr = bc.Validator().ValidateBody(block)\n\t\t}\n\n\t\tswitch {\n\t\tcase err == ErrKnownBlock:\n\t\t\t// Block and state both already known. However if the current block is below\n\t\t\t// this number we did a rollback and we should reimport it nonetheless.\n\t\t\tif !local && bc.CurrentBlock().NumberU64() >= block.NumberU64() {\n\t\t\t\tstats.ignored++\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\tcase err == consensus.ErrFutureBlock:\n\t\t\t// Allow up to MaxFuture second in the future blocks. If this limit is exceeded\n\t\t\t// the chain is discarded and processed at a later time if given.\n\t\t\tmax := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks)\n\t\t\tif block.Time().Cmp(max) > 0 {\n\t\t\t\treturn i, events, coalescedLogs, fmt.Errorf(\"future block: %v > %v\", block.Time(), max)\n\t\t\t}\n\t\t\tbc.futureBlocks.Add(block.Hash(), block)\n\t\t\tstats.queued++\n\t\t\tcontinue\n\n\t\tcase err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(block.ParentHash()):\n\t\t\tbc.futureBlocks.Add(block.Hash(), block)\n\t\t\tstats.queued++\n\t\t\tcontinue\n\n\t\tcase err == consensus.ErrPrunedAncestor:\n\t\t\t// Block competing with the canonical chain, store in the db, but don't process\n\t\t\t// until the competitor TD goes above the canonical TD\n\t\t\tcurrentBlock := bc.CurrentBlock()\n\t\t\tlocalTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64())\n\t\t\texternTd := new(big.Int).Add(bc.GetTd(block.ParentHash(), block.NumberU64()-1), block.Difficulty())\n\t\t\tif localTd.Cmp(externTd) > 0 {\n\t\t\t\tif err = bc.WriteBlockWithoutState(block, externTd); err != nil {\n\t\t\t\t\treturn i, events, coalescedLogs, err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Competitor chain beat canonical, gather all blocks from the common ancestor\n\t\t\tvar winner []*types.Block\n\n\t\t\tparent := bc.GetBlock(block.ParentHash(), block.NumberU64()-1)\n\t\t\tfor !bc.HasState(parent.Root()) {\n\t\t\t\twinner = append(winner, parent)\n\t\t\t\tparent = bc.GetBlock(parent.ParentHash(), parent.NumberU64()-1)\n\t\t\t}\n\t\t\tfor j := 0; j < len(winner)/2; j++ {\n\t\t\t\twinner[j], winner[len(winner)-1-j] = winner[len(winner)-1-j], winner[j]\n\t\t\t}\n\t\t\t// Import all the pruned blocks to make the state available\n\t\t\tbc.chainmu.Unlock()\n\t\t\t_, evs, logs, err := bc.insertChain(winner, local)\n\t\t\tbc.chainmu.Lock()\n\t\t\tevents, coalescedLogs = evs, logs\n\n\t\t\tif err != nil {\n\t\t\t\treturn i, events, coalescedLogs, err\n\t\t\t}\n\n\t\tcase err != nil:\n\t\t\tbc.reportBlock(block, nil, err)\n\t\t\treturn i, events, coalescedLogs, err\n\t\t}\n\t\t// Create a new statedb using the parent block and report an\n\t\t// error if it fails.\n\t\tvar parent *types.Block\n\t\tif i == 0 {\n\t\t\tparent = bc.GetBlock(block.ParentHash(), block.NumberU64()-1)\n\t\t} else {\n\t\t\tparent = chain[i-1]\n\t\t}\n\t\tstate, err := state.New(bc.stateCache, parent.Header())\n\n\t\tif err != nil {\n\t\t\treturn i, events, coalescedLogs, err\n\t\t}\n\n\t\tif !is_all_in_checkpoints {\n\t\t\tfor _, tx := range block.Transactions() {\n\t\t\t\terr := <-tx_results\n\t\t\t\tif err == nil {\n\t\t\t\t\terr = verify.VerifyWithState(tx.GetZZSTX(), state.NextZState(), block.NumberU64())\n\t\t\t\t}\n\t\t\t\t//err := verify.Verify(tx.GetZZSTX(), state.GetZState())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn i, events, coalescedLogs, err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif seroparam.SIP4() <= block.NumberU64() {\n\t\t\tstakeState := stake.NewStakeState(state)\n\t\t\terr = stakeState.ProcessBeforeApply(bc, block.Header())\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"insert chain pos block processBeforeApply\", \"err\", err)\n\t\t\t\treturn i, events, coalescedLogs, err\n\t\t\t}\n\n\t\t\tif !is_all_in_checkpoints {\n\t\t\t\terr = stakeState.CheckVotes(block, bc)\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"insert chain pos block checkVote\", \"err\", err)\n\t\t\t\treturn i, events, coalescedLogs, err\n\t\t\t}\n\t\t}\n\n\t\t// Process block using the parent state as reference point.\n\t\treceipts, logs, usedGas, err := bc.processor.Process(block, state, bc.vmConfig)\n\t\tif err != nil {\n\t\t\tbc.reportBlock(block, receipts, err)\n\t\t\treturn i, events, coalescedLogs, err\n\t\t}\n\t\t// Validate the state using the default validator\n\t\terr = bc.Validator().ValidateState(block, parent, state, receipts, usedGas)\n\t\tif err != nil {\n\t\t\tbc.reportBlock(block, receipts, err)\n\t\t\treturn i, events, coalescedLogs, err\n\t\t}\n\t\tproctime := time.Since(bstart)\n\n\t\t// Write the block to the chain and get the status.\n\t\tstatus, err := bc.WriteBlockWithState(block, receipts, state)\n\t\tif err != nil {\n\t\t\treturn i, events, coalescedLogs, err\n\t\t}\n\t\tswitch status {\n\t\tcase CanonStatTy:\n\t\t\tlog.Debug(\"Inserted new block\", \"number\", block.Number(), \"hash\", block.Hash(),\n\t\t\t\t\"txs\", len(block.Transactions()), \"gas\", block.GasUsed(), \"elapsed\", common.PrettyDuration(time.Since(bstart)))\n\n\t\t\tcoalescedLogs = append(coalescedLogs, logs...)\n\t\t\tblockInsertTimer.UpdateSince(bstart)\n\t\t\tevents = append(events, ChainEvent{block, block.Hash(), logs})\n\t\t\tlastCanon = block\n\n\t\t\t// Only count canonical blocks for GC processing time\n\t\t\tbc.gcproc += proctime\n\n\t\tcase SideStatTy:\n\t\t\tlog.Debug(\"Inserted forked block\", \"number\", block.Number(), \"hash\", block.Hash(), \"diff\", block.Difficulty(), \"elapsed\",\n\t\t\t\tcommon.PrettyDuration(time.Since(bstart)), \"txs\", len(block.Transactions()), \"gas\", block.GasUsed())\n\n\t\t\tblockInsertTimer.UpdateSince(bstart)\n\t\t\tevents = append(events, ChainSideEvent{block})\n\t\t}\n\t\tstats.processed++\n\t\tstats.usedGas += usedGas\n\n\t\tcache, _ := bc.stateCache.TrieDB().Size()\n\t\tstats.report(chain, i, cache)\n\t}\n\n\t// Append a single chain head event if we've progressed the chain\n\tif lastCanon != nil && bc.CurrentBlock().Hash() == lastCanon.Hash() {\n\t\tevents = append(events, ChainHeadEvent{lastCanon})\n\t}\n\n\treturn 0, events, coalescedLogs, nil\n}\n\n// insertStats tracks and reports on block insertion.\ntype insertStats struct {\n\tqueued, processed, ignored int\n\tusedGas                    uint64\n\tlastIndex                  int\n\tstartTime                  mclock.AbsTime\n}\n\n// statsReportLimit is the time limit during import and export after which we\n// always print out progress. This avoids the user wondering what's going on.\nconst statsReportLimit = 8 * time.Second\n\n// report prints statistics if some number of blocks have been processed\n// or more than a few seconds have passed since the last message.\nfunc (st *insertStats) report(chain []*types.Block, index int, cache common.StorageSize) {\n\t// Fetch the timings for the batch\n\tvar (\n\t\tnow     = mclock.Now()\n\t\telapsed = time.Duration(now) - time.Duration(st.startTime)\n\t)\n\t// If we're at the last block of the batch or report period reached, log\n\tif index == len(chain)-1 || elapsed >= statsReportLimit {\n\t\tvar (\n\t\t\tend = chain[index]\n\t\t\ttxs = countTransactions(chain[st.lastIndex : index+1])\n\t\t)\n\t\tcontext := []interface{}{\n\t\t\t\"blocks\", st.processed, \"txs\", txs, \"mgas\", float64(st.usedGas) / 1000000,\n\t\t\t\"elapsed\", common.PrettyDuration(elapsed), \"mgasps\", float64(st.usedGas) * 1000 / float64(elapsed),\n\t\t\t\"number\", end.Number(), \"hash\", end.Hash(),\n\t\t}\n\n\t\tif timestamp := time.Unix(end.Time().Int64(), 0); time.Since(timestamp) > time.Minute {\n\t\t\tcontext = append(context, []interface{}{\"age\", common.PrettyAge(timestamp)}...)\n\t\t}\n\t\tcontext = append(context, []interface{}{\"dirty\", cache}...)\n\n\t\tif st.queued > 0 {\n\t\t\tcontext = append(context, []interface{}{\"queued\", st.queued}...)\n\t\t}\n\t\tif st.ignored > 0 {\n\t\t\tcontext = append(context, []interface{}{\"ignored\", st.ignored}...)\n\t\t}\n\t\tlog.Info(\"Imported new chain segment\", context...)\n\n\t\t*st = insertStats{startTime: now, lastIndex: index + 1}\n\t}\n}\n\nfunc countTransactions(chain []*types.Block) (c int) {\n\tfor _, b := range chain {\n\t\tc += len(b.Transactions())\n\t}\n\treturn c\n}\n\n// reorgs takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them\n// to be part of the new canonical chain and accumulates potential missing transactions and post an\n// event about them\nfunc (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error {\n\tvar (\n\t\tnewChain    types.Blocks\n\t\toldChain    types.Blocks\n\t\tcommonBlock *types.Block\n\t\tdeletedTxs  types.Transactions\n\t\tdeletedLogs []*types.Log\n\t\t// collectLogs collects the logs that were generated during the\n\t\t// processing of the block that corresponds with the given hash.\n\t\t// These logs are later announced as deleted.\n\t\tcollectLogs = func(hash common.Hash) {\n\t\t\t// Coalesce logs and set 'Removed'.\n\t\t\tnumber := bc.hc.GetBlockNumber(hash)\n\t\t\tif number == nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\treceipts := rawdb.ReadReceipts(bc.db, hash, *number)\n\t\t\tfor _, receipt := range receipts {\n\t\t\t\tfor _, log := range receipt.Logs {\n\t\t\t\t\tdel := *log\n\t\t\t\t\tdel.Removed = true\n\t\t\t\t\tdeletedLogs = append(deletedLogs, &del)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t)\n\n\t// first reduce whoever is higher bound\n\tif oldBlock.NumberU64() > newBlock.NumberU64() {\n\t\t// reduce old chain\n\t\tfor ; oldBlock != nil && oldBlock.NumberU64() != newBlock.NumberU64(); oldBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1) {\n\t\t\toldChain = append(oldChain, oldBlock)\n\t\t\tdeletedTxs = append(deletedTxs, oldBlock.Transactions()...)\n\n\t\t\tcollectLogs(oldBlock.Hash())\n\t\t}\n\t} else {\n\t\t// reduce new chain and append new chain blocks for inserting later on\n\t\tfor ; newBlock != nil && newBlock.NumberU64() != oldBlock.NumberU64(); newBlock = bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) {\n\t\t\tnewChain = append(newChain, newBlock)\n\t\t}\n\t}\n\tif oldBlock == nil {\n\t\treturn fmt.Errorf(\"Invalid old chain\")\n\t}\n\tif newBlock == nil {\n\t\treturn fmt.Errorf(\"Invalid new chain\")\n\t}\n\n\tfor {\n\t\tif oldBlock.Hash() == newBlock.Hash() {\n\t\t\tcommonBlock = oldBlock\n\t\t\tbreak\n\t\t}\n\n\t\toldChain = append(oldChain, oldBlock)\n\t\tnewChain = append(newChain, newBlock)\n\t\tdeletedTxs = append(deletedTxs, oldBlock.Transactions()...)\n\t\tcollectLogs(oldBlock.Hash())\n\n\t\toldBlock, newBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1), bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1)\n\t\tif oldBlock == nil {\n\t\t\treturn fmt.Errorf(\"Invalid old chain\")\n\t\t}\n\t\tif newBlock == nil {\n\t\t\treturn fmt.Errorf(\"Invalid new chain\")\n\t\t}\n\t}\n\t// Ensure the user sees large reorgs\n\tif len(oldChain) > 0 && len(newChain) > 0 {\n\t\tlogFn := log.Debug\n\t\tif len(oldChain) > 63 {\n\t\t\tlogFn = log.Warn\n\t\t}\n\t\tlogFn(\"Chain split detected\", \"number\", commonBlock.Number(), \"hash\", commonBlock.Hash(),\n\t\t\t\"drop\", len(oldChain), \"dropfrom\", oldChain[0].Hash(), \"add\", len(newChain), \"addfrom\", newChain[0].Hash())\n\t} else {\n\t\tlog.Error(\"Impossible reorg, please file an issue\", \"oldnum\", oldBlock.Number(), \"oldhash\", oldBlock.Hash(), \"newnum\", newBlock.Number(), \"newhash\", newBlock.Hash())\n\t}\n\t// Insert the new chain, taking care of the proper incremental order\n\tvar addedTxs types.Transactions\n\tfor i := len(newChain) - 1; i >= 0; i-- {\n\t\t// insert the block in the canonical way, re-writing history\n\t\tbc.insert(newChain[i])\n\t\t// write lookup entries for hash based transaction/receipt searches\n\t\trawdb.WriteTxLookupEntries(bc.db, newChain[i])\n\t\taddedTxs = append(addedTxs, newChain[i].Transactions()...)\n\t}\n\t// calculate the difference between deleted and added transactions\n\tdiff := types.TxDifference(deletedTxs, addedTxs)\n\t// When transactions get deleted from the database that means the\n\t// receipts that were created in the fork must also be deleted\n\tbatch := bc.db.NewBatch()\n\tfor _, tx := range diff {\n\t\trawdb.DeleteTxLookupEntry(batch, tx.Hash())\n\t}\n\tbatch.Write()\n\n\tif len(deletedLogs) > 0 {\n\t\tgo bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs})\n\t}\n\tif len(oldChain) > 0 {\n\t\tgo func() {\n\t\t\tfor _, block := range oldChain {\n\t\t\t\tbc.chainSideFeed.Send(ChainSideEvent{Block: block})\n\t\t\t}\n\t\t}()\n\t}\n\n\treturn nil\n}\n\n// PostChainEvents iterates over the events generated by a chain insertion and\n// posts them into the event feed.\n// TODO: Should not expose PostChainEvents. The chain events should be posted in WriteBlock.\nfunc (bc *BlockChain) PostChainEvents(events []interface{}, logs []*types.Log) {\n\t// post event logs for further processing\n\tif logs != nil {\n\t\tbc.logsFeed.Send(logs)\n\t}\n\tfor _, event := range events {\n\t\tswitch ev := event.(type) {\n\t\tcase ChainEvent:\n\t\t\tbc.chainFeed.Send(ev)\n\n\t\tcase ChainHeadEvent:\n\t\t\tbc.chainHeadFeed.Send(ev)\n\n\t\tcase ChainSideEvent:\n\t\t\tbc.chainSideFeed.Send(ev)\n\t\t}\n\t}\n}\n\nfunc (bc *BlockChain) update() {\n\tfutureTimer := time.NewTicker(5 * time.Second)\n\tdefer futureTimer.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-futureTimer.C:\n\t\t\tbc.procFutureBlocks()\n\t\tcase <-bc.quit:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// BadBlocks returns a list of the last 'bad blocks' that the client has seen on the network\nfunc (bc *BlockChain) BadBlocks() []*types.Block {\n\tblocks := make([]*types.Block, 0, bc.badBlocks.Len())\n\tfor _, hash := range bc.badBlocks.Keys() {\n\t\tif blk, exist := bc.badBlocks.Peek(hash); exist {\n\t\t\tblock := blk.(*types.Block)\n\t\t\tblocks = append(blocks, block)\n\t\t}\n\t}\n\treturn blocks\n}\n\n// addBadBlock adds a bad block to the bad-block LRU cache\nfunc (bc *BlockChain) addBadBlock(block *types.Block) {\n\tbc.badBlocks.Add(block.Hash(), block)\n}\n\n// reportBlock logs a bad block error.\nfunc (bc *BlockChain) reportBlock(block *types.Block, receipts types.Receipts, err error) {\n\tbc.addBadBlock(block)\n\n\tvar receiptString string\n\tfor _, receipt := range receipts {\n\t\treceiptString += fmt.Sprintf(\"\\t%v\\n\", receipt)\n\t}\n\tlog.Error(fmt.Sprintf(`\n########## BAD BLOCK #########\nChain config: %v\n\nNumber: %v\nHash: 0x%x\n%v\n\nError: %v\n##############################\n`, bc.chainConfig, block.Number(), block.Hash(), receiptString, err))\n}\n\n// InsertHeaderChain attempts to insert the given header chain in to the local\n// chain, possibly creating a reorg. If an error is returned, it will return the\n// index number of the failing header as well an error describing what went wrong.\n//\n// The verify parameter can be used to fine tune whether nonce verification\n// should be done or not. The reason behind the optional check is because some\n// of the header retrieval mechanisms already need to verify nonces, as well as\n// because nonces can be verified sparsely, not needing to check each.\nfunc (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) {\n\tstart := time.Now()\n\tif i, err := bc.hc.ValidateHeaderChain(chain, checkFreq); err != nil {\n\t\treturn i, err\n\t}\n\n\t// Make sure only one thread manipulates the chain at once\n\tbc.chainmu.Lock()\n\tdefer bc.chainmu.Unlock()\n\n\tbc.wg.Add(1)\n\tdefer bc.wg.Done()\n\n\twhFunc := func(header *types.Header) error {\n\t\tbc.mu.Lock()\n\t\tdefer bc.mu.Unlock()\n\n\t\t_, err := bc.hc.WriteHeader(header)\n\t\treturn err\n\t}\n\n\treturn bc.hc.InsertHeaderChain(chain, whFunc, start)\n}\n\n// writeHeader writes a header into the local chain, given that its parent is\n// already known. If the total difficulty of the newly inserted header becomes\n// greater than the current known TD, the canonical chain is re-routed.\n//\n// Note: This method is not concurrent-safe with inserting blocks simultaneously\n// into the chain, as side effects caused by reorganisations cannot be emulated\n// without the real blocks. Hence, writing headers directly should only be done\n// in two scenarios: pure-header mode of operation (light clients), or properly\n// separated header/block phases (non-archive clients).\nfunc (bc *BlockChain) writeHeader(header *types.Header) error {\n\tbc.wg.Add(1)\n\tdefer bc.wg.Done()\n\n\tbc.mu.Lock()\n\tdefer bc.mu.Unlock()\n\n\t_, err := bc.hc.WriteHeader(header)\n\treturn err\n}\n\n// CurrentHeader retrieves the current head header of the canonical chain. The\n// header is retrieved from the HeaderChain's internal cache.\nfunc (bc *BlockChain) CurrentHeader() *types.Header {\n\treturn bc.hc.CurrentHeader()\n}\n\n// GetTd retrieves a block's total difficulty in the canonical chain from the\n// database by hash and number, caching it if found.\nfunc (bc *BlockChain) GetTd(hash common.Hash, number uint64) *big.Int {\n\treturn bc.hc.GetTd(hash, number)\n}\n\n// GetTdByHash retrieves a block's total difficulty in the canonical chain from the\n// database by hash, caching it if found.\nfunc (bc *BlockChain) GetTdByHash(hash common.Hash) *big.Int {\n\treturn bc.hc.GetTdByHash(hash)\n}\n\n// GetHeader retrieves a block header from the database by hash and number,\n// caching it if found.\nfunc (bc *BlockChain) GetHeader(hash common.Hash, number uint64) *types.Header {\n\treturn bc.hc.GetHeader(hash, number)\n}\n\n// GetHeaderByHash retrieves a block header from the database by hash, caching it if\n// found.\nfunc (bc *BlockChain) GetHeaderByHash(hash common.Hash) *types.Header {\n\treturn bc.hc.GetHeaderByHash(hash)\n}\n\n// HasHeader checks if a block header is present in the database or not, caching\n// it if present.\nfunc (bc *BlockChain) HasHeader(hash common.Hash, number uint64) bool {\n\treturn bc.hc.HasHeader(hash, number)\n}\n\n// GetBlockHashesFromHash retrieves a number of block hashes starting at a given\n// hash, fetching towards the genesis block.\nfunc (bc *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash {\n\treturn bc.hc.GetBlockHashesFromHash(hash, max)\n}\n\n// GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or\n// a close ancestor of it is canonical. maxNonCanonical points to a downwards counter limiting the\n// number of blocks to be individually checked before we reach the canonical chain.\n//\n// Note: ancestor == 0 returns the same block, 1 returns its parent and so on.\nfunc (bc *BlockChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) {\n\tbc.chainmu.Lock()\n\tdefer bc.chainmu.Unlock()\n\n\treturn bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical)\n}\n\n// GetHeaderByNumber retrieves a block header from the database by number,\n// caching it (associated with its hash) if found.\nfunc (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header {\n\treturn bc.hc.GetHeaderByNumber(number)\n}\n\n// Config retrieves the blockchain's chain configuration.\nfunc (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig }\n\n// Engine retrieves the blockchain's consensus engine.\nfunc (bc *BlockChain) Engine() consensus.Engine { return bc.engine }\n\n// SubscribeRemovedLogsEvent registers a subscription of RemovedLogsEvent.\nfunc (bc *BlockChain) SubscribeRemovedLogsEvent(ch chan<- RemovedLogsEvent) event.Subscription {\n\treturn bc.scope.Track(bc.rmLogsFeed.Subscribe(ch))\n}\n\n// SubscribeChainEvent registers a subscription of ChainEvent.\nfunc (bc *BlockChain) SubscribeChainEvent(ch chan<- ChainEvent) event.Subscription {\n\treturn bc.scope.Track(bc.chainFeed.Subscribe(ch))\n}\n\n// SubscribeChainHeadEvent registers a subscription of ChainHeadEvent.\nfunc (bc *BlockChain) SubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription {\n\treturn bc.scope.Track(bc.chainHeadFeed.Subscribe(ch))\n}\n\n// SubscribeChainSideEvent registers a subscription of ChainSideEvent.\nfunc (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Subscription {\n\treturn bc.scope.Track(bc.chainSideFeed.Subscribe(ch))\n}\n\n// SubscribeLogsEvent registers a subscription of []*types.Log.\nfunc (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {\n\treturn bc.scope.Track(bc.logsFeed.Subscribe(ch))\n}\n"
  },
  {
    "path": "core/bloombits/doc.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package bloombits implements bloom filtering on batches of data.\npackage bloombits\n"
  },
  {
    "path": "core/bloombits/generator.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bloombits\n\nimport (\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\nvar (\n\t// errSectionOutOfBounds is returned if the user tried to add more bloom filters\n\t// to the batch than available space, or if tries to retrieve above the capacity.\n\terrSectionOutOfBounds = errors.New(\"section out of bounds\")\n\n\t// errBloomBitOutOfBounds is returned if the user tried to retrieve specified\n\t// bit bloom above the capacity.\n\terrBloomBitOutOfBounds = errors.New(\"bloom bit out of bounds\")\n)\n\n// Generator takes a number of bloom filters and generates the rotated bloom bits\n// to be used for batched filtering.\ntype Generator struct {\n\tblooms   [types.BloomBitLength][]byte // Rotated blooms for per-bit matching\n\tsections uint                         // Number of sections to batch together\n\tnextSec  uint                         // Next section to set when adding a bloom\n}\n\n// NewGenerator creates a rotated bloom generator that can iteratively fill a\n// batched bloom filter's bits.\nfunc NewGenerator(sections uint) (*Generator, error) {\n\tif sections%8 != 0 {\n\t\treturn nil, errors.New(\"section count not multiple of 8\")\n\t}\n\tb := &Generator{sections: sections}\n\tfor i := 0; i < types.BloomBitLength; i++ {\n\t\tb.blooms[i] = make([]byte, sections/8)\n\t}\n\treturn b, nil\n}\n\n// AddBloom takes a single bloom filter and sets the corresponding bit column\n// in memory accordingly.\nfunc (b *Generator) AddBloom(index uint, bloom types.Bloom) error {\n\t// Make sure we're not adding more bloom filters than our capacity\n\tif b.nextSec >= b.sections {\n\t\treturn errSectionOutOfBounds\n\t}\n\tif b.nextSec != index {\n\t\treturn errors.New(\"bloom filter with unexpected index\")\n\t}\n\t// Rotate the bloom and insert into our collection\n\tbyteIndex := b.nextSec / 8\n\tbitMask := byte(1) << byte(7-b.nextSec%8)\n\n\tfor i := 0; i < types.BloomBitLength; i++ {\n\t\tbloomByteIndex := types.BloomByteLength - 1 - i/8\n\t\tbloomBitMask := byte(1) << byte(i%8)\n\n\t\tif (bloom[bloomByteIndex] & bloomBitMask) != 0 {\n\t\t\tb.blooms[i][byteIndex] |= bitMask\n\t\t}\n\t}\n\tb.nextSec++\n\n\treturn nil\n}\n\n// Bitset returns the bit vector belonging to the given bit index after all\n// blooms have been added.\nfunc (b *Generator) Bitset(idx uint) ([]byte, error) {\n\tif b.nextSec != b.sections {\n\t\treturn nil, errors.New(\"bloom not fully generated yet\")\n\t}\n\tif idx >= types.BloomBitLength {\n\t\treturn nil, errBloomBitOutOfBounds\n\t}\n\treturn b.blooms[idx], nil\n}\n"
  },
  {
    "path": "core/bloombits/generator_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bloombits\n\nimport (\n\t\"bytes\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\n// Tests that batched bloom bits are correctly rotated from the input bloom\n// filters.\nfunc TestGenerator(t *testing.T) {\n\t// Generate the input and the rotated output\n\tvar input, output [types.BloomBitLength][types.BloomByteLength]byte\n\n\tfor i := 0; i < types.BloomBitLength; i++ {\n\t\tfor j := 0; j < types.BloomBitLength; j++ {\n\t\t\tbit := byte(rand.Int() % 2)\n\n\t\t\tinput[i][j/8] |= bit << byte(7-j%8)\n\t\t\toutput[types.BloomBitLength-1-j][i/8] |= bit << byte(7-i%8)\n\t\t}\n\t}\n\t// Crunch the input through the generator and verify the result\n\tgen, err := NewGenerator(types.BloomBitLength)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create bloombit generator: %v\", err)\n\t}\n\tfor i, bloom := range input {\n\t\tif err := gen.AddBloom(uint(i), bloom); err != nil {\n\t\t\tt.Fatalf(\"bloom %d: failed to add: %v\", i, err)\n\t\t}\n\t}\n\tfor i, want := range output {\n\t\thave, err := gen.Bitset(uint(i))\n\t\tif err != nil {\n\t\t\tt.Fatalf(\"output %d: failed to retrieve bits: %v\", i, err)\n\t\t}\n\t\tif !bytes.Equal(have, want[:]) {\n\t\t\tt.Errorf(\"output %d: bit vector mismatch have %x, want %x\", i, have, want)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "core/bloombits/matcher.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bloombits\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"math\"\n\t\"sort\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/bitutil\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\n// bloomIndexes represents the bit indexes inside the bloom filter that belong\n// to some key.\ntype bloomIndexes [3]uint\n\n// calcBloomIndexes returns the bloom filter bit indexes belonging to the given key.\nfunc calcBloomIndexes(b []byte) bloomIndexes {\n\tb = crypto.Keccak256(b)\n\n\tvar idxs bloomIndexes\n\tfor i := 0; i < len(idxs); i++ {\n\t\tidxs[i] = (uint(b[2*i])<<8)&2047 + uint(b[2*i+1])\n\t}\n\treturn idxs\n}\n\n// partialMatches with a non-nil vector represents a section in which some sub-\n// matchers have already found potential matches. Subsequent sub-matchers will\n// binary AND their matches with this vector. If vector is nil, it represents a\n// section to be processed by the first sub-matcher.\ntype partialMatches struct {\n\tsection uint64\n\tbitset  []byte\n}\n\n// Retrieval represents a request for retrieval task assignments for a given\n// bit with the given number of fetch elements, or a response for such a request.\n// It can also have the actual results set to be used as a delivery data struct.\n//\n// The contest and error fields are used by the light client to terminate matching\n// early if an error is encountered on some path of the pipeline.\ntype Retrieval struct {\n\tBit      uint\n\tSections []uint64\n\tBitsets  [][]byte\n\n\tContext context.Context\n\tError   error\n}\n\n// Matcher is a pipelined system of schedulers and logic matchers which perform\n// binary AND/OR operations on the bit-streams, creating a stream of potential\n// blocks to inspect for data content.\ntype Matcher struct {\n\tsectionSize uint64 // Size of the data batches to filter on\n\n\tfilters    [][]bloomIndexes    // Filter the system is matching for\n\tschedulers map[uint]*scheduler // Retrieval schedulers for loading bloom bits\n\n\tretrievers chan chan uint       // Retriever processes waiting for bit allocations\n\tcounters   chan chan uint       // Retriever processes waiting for task count reports\n\tretrievals chan chan *Retrieval // Retriever processes waiting for task allocations\n\tdeliveries chan *Retrieval      // Retriever processes waiting for task response deliveries\n\n\trunning uint32 // Atomic flag whether a session is live or not\n}\n\n// NewMatcher creates a new pipeline for retrieving bloom bit streams and doing\n// address and topic filtering on them. Setting a filter component to `nil` is\n// allowed and will result in that filter rule being skipped (OR 0x11...1).\nfunc NewMatcher(sectionSize uint64, filters [][][]byte) *Matcher {\n\t// Create the matcher instance\n\tm := &Matcher{\n\t\tsectionSize: sectionSize,\n\t\tschedulers:  make(map[uint]*scheduler),\n\t\tretrievers:  make(chan chan uint),\n\t\tcounters:    make(chan chan uint),\n\t\tretrievals:  make(chan chan *Retrieval),\n\t\tdeliveries:  make(chan *Retrieval),\n\t}\n\t// Calculate the bloom bit indexes for the groups we're interested in\n\tm.filters = nil\n\n\tfor _, filter := range filters {\n\t\t// Gather the bit indexes of the filter rule, special casing the nil filter\n\t\tif len(filter) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tbloomBits := make([]bloomIndexes, len(filter))\n\t\tfor i, clause := range filter {\n\t\t\tif clause == nil {\n\t\t\t\tbloomBits = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbloomBits[i] = calcBloomIndexes(clause)\n\t\t}\n\t\t// Accumulate the filter rules if no nil rule was within\n\t\tif bloomBits != nil {\n\t\t\tm.filters = append(m.filters, bloomBits)\n\t\t}\n\t}\n\t// For every bit, create a scheduler to load/download the bit vectors\n\tfor _, bloomIndexLists := range m.filters {\n\t\tfor _, bloomIndexList := range bloomIndexLists {\n\t\t\tfor _, bloomIndex := range bloomIndexList {\n\t\t\t\tm.addScheduler(bloomIndex)\n\t\t\t}\n\t\t}\n\t}\n\treturn m\n}\n\n// addScheduler adds a bit stream retrieval scheduler for the given bit index if\n// it has not existed before. If the bit is already selected for filtering, the\n// existing scheduler can be used.\nfunc (m *Matcher) addScheduler(idx uint) {\n\tif _, ok := m.schedulers[idx]; ok {\n\t\treturn\n\t}\n\tm.schedulers[idx] = newScheduler(idx)\n}\n\n// Start starts the matching process and returns a stream of bloom matches in\n// a given range of blocks. If there are no more matches in the range, the result\n// channel is closed.\nfunc (m *Matcher) Start(ctx context.Context, begin, end uint64, results chan uint64) (*MatcherSession, error) {\n\t// Make sure we're not creating concurrent sessions\n\tif atomic.SwapUint32(&m.running, 1) == 1 {\n\t\treturn nil, errors.New(\"matcher already running\")\n\t}\n\tdefer atomic.StoreUint32(&m.running, 0)\n\n\t// Initiate a new matching round\n\tsession := &MatcherSession{\n\t\tmatcher: m,\n\t\tquit:    make(chan struct{}),\n\t\tkill:    make(chan struct{}),\n\t\tctx:     ctx,\n\t}\n\tfor _, scheduler := range m.schedulers {\n\t\tscheduler.reset()\n\t}\n\tsink := m.run(begin, end, cap(results), session)\n\n\t// Read the output from the result sink and deliver to the user\n\tsession.pend.Add(1)\n\tgo func() {\n\t\tdefer session.pend.Done()\n\t\tdefer close(results)\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-session.quit:\n\t\t\t\treturn\n\n\t\t\tcase res, ok := <-sink:\n\t\t\t\t// New match result found\n\t\t\t\tif !ok {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Calculate the first and last blocks of the section\n\t\t\t\tsectionStart := res.section * m.sectionSize\n\n\t\t\t\tfirst := sectionStart\n\t\t\t\tif begin > first {\n\t\t\t\t\tfirst = begin\n\t\t\t\t}\n\t\t\t\tlast := sectionStart + m.sectionSize - 1\n\t\t\t\tif end < last {\n\t\t\t\t\tlast = end\n\t\t\t\t}\n\t\t\t\t// Iterate over all the blocks in the section and return the matching ones\n\t\t\t\tfor i := first; i <= last; i++ {\n\t\t\t\t\t// Skip the entire byte if no matches are found inside (and we're processing an entire byte!)\n\t\t\t\t\tnext := res.bitset[(i-sectionStart)/8]\n\t\t\t\t\tif next == 0 {\n\t\t\t\t\t\tif i%8 == 0 {\n\t\t\t\t\t\t\ti += 7\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\t// Some bit it set, do the actual submatching\n\t\t\t\t\tif bit := 7 - i%8; next&(1<<bit) != 0 {\n\t\t\t\t\t\tselect {\n\t\t\t\t\t\tcase <-session.quit:\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\tcase results <- i:\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\t}()\n\treturn session, nil\n}\n\n// run creates a daisy-chain of sub-matchers, one for the address set and one\n// for each topic set, each sub-matcher receiving a section only if the previous\n// ones have all found a potential match in one of the blocks of the section,\n// then binary AND-ing its own matches and forwarding the result to the next one.\n//\n// The method starts feeding the section indexes into the first sub-matcher on a\n// new goroutine and returns a sink channel receiving the results.\nfunc (m *Matcher) run(begin, end uint64, buffer int, session *MatcherSession) chan *partialMatches {\n\t// Create the source channel and feed section indexes into\n\tsource := make(chan *partialMatches, buffer)\n\n\tsession.pend.Add(1)\n\tgo func() {\n\t\tdefer session.pend.Done()\n\t\tdefer close(source)\n\n\t\tfor i := begin / m.sectionSize; i <= end/m.sectionSize; i++ {\n\t\t\tselect {\n\t\t\tcase <-session.quit:\n\t\t\t\treturn\n\t\t\tcase source <- &partialMatches{i, bytes.Repeat([]byte{0xff}, int(m.sectionSize/8))}:\n\t\t\t}\n\t\t}\n\t}()\n\t// Assemble the daisy-chained filtering pipeline\n\tnext := source\n\tdist := make(chan *request, buffer)\n\n\tfor _, bloom := range m.filters {\n\t\tnext = m.subMatch(next, dist, bloom, session)\n\t}\n\t// Start the request distribution\n\tsession.pend.Add(1)\n\tgo m.distributor(dist, session)\n\n\treturn next\n}\n\n// subMatch creates a sub-matcher that filters for a set of addresses or topics, binary OR-s those matches, then\n// binary AND-s the result to the daisy-chain input (source) and forwards it to the daisy-chain output.\n// The matches of each address/topic are calculated by fetching the given sections of the three bloom bit indexes belonging to\n// that address/topic, and binary AND-ing those vectors together.\nfunc (m *Matcher) subMatch(source chan *partialMatches, dist chan *request, bloom []bloomIndexes, session *MatcherSession) chan *partialMatches {\n\t// Start the concurrent schedulers for each bit required by the bloom filter\n\tsectionSources := make([][3]chan uint64, len(bloom))\n\tsectionSinks := make([][3]chan []byte, len(bloom))\n\tfor i, bits := range bloom {\n\t\tfor j, bit := range bits {\n\t\t\tsectionSources[i][j] = make(chan uint64, cap(source))\n\t\t\tsectionSinks[i][j] = make(chan []byte, cap(source))\n\n\t\t\tm.schedulers[bit].run(sectionSources[i][j], dist, sectionSinks[i][j], session.quit, &session.pend)\n\t\t}\n\t}\n\n\tprocess := make(chan *partialMatches, cap(source)) // entries from source are forwarded here after fetches have been initiated\n\tresults := make(chan *partialMatches, cap(source))\n\n\tsession.pend.Add(2)\n\tgo func() {\n\t\t// Tear down the goroutine and terminate all source channels\n\t\tdefer session.pend.Done()\n\t\tdefer close(process)\n\n\t\tdefer func() {\n\t\t\tfor _, bloomSources := range sectionSources {\n\t\t\t\tfor _, bitSource := range bloomSources {\n\t\t\t\t\tclose(bitSource)\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t\t// Read sections from the source channel and multiplex into all bit-schedulers\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-session.quit:\n\t\t\t\treturn\n\n\t\t\tcase subres, ok := <-source:\n\t\t\t\t// New subresult from previous link\n\t\t\t\tif !ok {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Multiplex the section index to all bit-schedulers\n\t\t\t\tfor _, bloomSources := range sectionSources {\n\t\t\t\t\tfor _, bitSource := range bloomSources {\n\t\t\t\t\t\tselect {\n\t\t\t\t\t\tcase <-session.quit:\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\tcase bitSource <- subres.section:\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Notify the processor that this section will become available\n\t\t\t\tselect {\n\t\t\t\tcase <-session.quit:\n\t\t\t\t\treturn\n\t\t\t\tcase process <- subres:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\tgo func() {\n\t\t// Tear down the goroutine and terminate the final sink channel\n\t\tdefer session.pend.Done()\n\t\tdefer close(results)\n\n\t\t// Read the source notifications and collect the delivered results\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-session.quit:\n\t\t\t\treturn\n\n\t\t\tcase subres, ok := <-process:\n\t\t\t\t// Notified of a section being retrieved\n\t\t\t\tif !ok {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// Gather all the sub-results and merge them together\n\t\t\t\tvar orVector []byte\n\t\t\t\tfor _, bloomSinks := range sectionSinks {\n\t\t\t\t\tvar andVector []byte\n\t\t\t\t\tfor _, bitSink := range bloomSinks {\n\t\t\t\t\t\tvar data []byte\n\t\t\t\t\t\tselect {\n\t\t\t\t\t\tcase <-session.quit:\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\tcase data = <-bitSink:\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif andVector == nil {\n\t\t\t\t\t\t\tandVector = make([]byte, int(m.sectionSize/8))\n\t\t\t\t\t\t\tcopy(andVector, data)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbitutil.ANDBytes(andVector, andVector, data)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif orVector == nil {\n\t\t\t\t\t\torVector = andVector\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbitutil.ORBytes(orVector, orVector, andVector)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif orVector == nil {\n\t\t\t\t\torVector = make([]byte, int(m.sectionSize/8))\n\t\t\t\t}\n\t\t\t\tif subres.bitset != nil {\n\t\t\t\t\tbitutil.ANDBytes(orVector, orVector, subres.bitset)\n\t\t\t\t}\n\t\t\t\tif bitutil.TestBytes(orVector) {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-session.quit:\n\t\t\t\t\t\treturn\n\t\t\t\t\tcase results <- &partialMatches{subres.section, orVector}:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\treturn results\n}\n\n// distributor receives requests from the schedulers and queues them into a set\n// of pending requests, which are assigned to retrievers wanting to fulfil them.\nfunc (m *Matcher) distributor(dist chan *request, session *MatcherSession) {\n\tdefer session.pend.Done()\n\n\tvar (\n\t\trequests   = make(map[uint][]uint64) // Per-bit list of section requests, ordered by section number\n\t\tunallocs   = make(map[uint]struct{}) // Bits with pending requests but not allocated to any retriever\n\t\tretrievers chan chan uint            // Waiting retrievers (toggled to nil if unallocs is empty)\n\t)\n\tvar (\n\t\tallocs   int            // Number of active allocations to handle graceful shutdown requests\n\t\tshutdown = session.quit // Shutdown request channel, will gracefully wait for pending requests\n\t)\n\n\t// assign is a helper method fo try to assign a pending bit an actively\n\t// listening servicer, or schedule it up for later when one arrives.\n\tassign := func(bit uint) {\n\t\tselect {\n\t\tcase fetcher := <-m.retrievers:\n\t\t\tallocs++\n\t\t\tfetcher <- bit\n\t\tdefault:\n\t\t\t// No retrievers active, start listening for new ones\n\t\t\tretrievers = m.retrievers\n\t\t\tunallocs[bit] = struct{}{}\n\t\t}\n\t}\n\n\tfor {\n\t\tselect {\n\t\tcase <-shutdown:\n\t\t\t// Graceful shutdown requested, wait until all pending requests are honoured\n\t\t\tif allocs == 0 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tshutdown = nil\n\n\t\tcase <-session.kill:\n\t\t\t// Pending requests not honoured in time, hard terminate\n\t\t\treturn\n\n\t\tcase req := <-dist:\n\t\t\t// New retrieval request arrived to be distributed to some fetcher process\n\t\t\tqueue := requests[req.bit]\n\t\t\tindex := sort.Search(len(queue), func(i int) bool { return queue[i] >= req.section })\n\t\t\trequests[req.bit] = append(queue[:index], append([]uint64{req.section}, queue[index:]...)...)\n\n\t\t\t// If it's a new bit and we have waiting fetchers, allocate to them\n\t\t\tif len(queue) == 0 {\n\t\t\t\tassign(req.bit)\n\t\t\t}\n\n\t\tcase fetcher := <-retrievers:\n\t\t\t// New retriever arrived, find the lowest section-ed bit to assign\n\t\t\tbit, best := uint(0), uint64(math.MaxUint64)\n\t\t\tfor idx := range unallocs {\n\t\t\t\tif requests[idx][0] < best {\n\t\t\t\t\tbit, best = idx, requests[idx][0]\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Stop tracking this bit (and alloc notifications if no more work is available)\n\t\t\tdelete(unallocs, bit)\n\t\t\tif len(unallocs) == 0 {\n\t\t\t\tretrievers = nil\n\t\t\t}\n\t\t\tallocs++\n\t\t\tfetcher <- bit\n\n\t\tcase fetcher := <-m.counters:\n\t\t\t// New task count request arrives, return number of items\n\t\t\tfetcher <- uint(len(requests[<-fetcher]))\n\n\t\tcase fetcher := <-m.retrievals:\n\t\t\t// New fetcher waiting for tasks to retrieve, assign\n\t\t\ttask := <-fetcher\n\t\t\tif want := len(task.Sections); want >= len(requests[task.Bit]) {\n\t\t\t\ttask.Sections = requests[task.Bit]\n\t\t\t\tdelete(requests, task.Bit)\n\t\t\t} else {\n\t\t\t\ttask.Sections = append(task.Sections[:0], requests[task.Bit][:want]...)\n\t\t\t\trequests[task.Bit] = append(requests[task.Bit][:0], requests[task.Bit][want:]...)\n\t\t\t}\n\t\t\tfetcher <- task\n\n\t\t\t// If anything was left unallocated, try to assign to someone else\n\t\t\tif len(requests[task.Bit]) > 0 {\n\t\t\t\tassign(task.Bit)\n\t\t\t}\n\n\t\tcase result := <-m.deliveries:\n\t\t\t// New retrieval task response from fetcher, split out missing sections and\n\t\t\t// deliver complete ones\n\t\t\tvar (\n\t\t\t\tsections = make([]uint64, 0, len(result.Sections))\n\t\t\t\tbitsets  = make([][]byte, 0, len(result.Bitsets))\n\t\t\t\tmissing  = make([]uint64, 0, len(result.Sections))\n\t\t\t)\n\t\t\tfor i, bitset := range result.Bitsets {\n\t\t\t\tif len(bitset) == 0 {\n\t\t\t\t\tmissing = append(missing, result.Sections[i])\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tsections = append(sections, result.Sections[i])\n\t\t\t\tbitsets = append(bitsets, bitset)\n\t\t\t}\n\t\t\tm.schedulers[result.Bit].deliver(sections, bitsets)\n\t\t\tallocs--\n\n\t\t\t// Reschedule missing sections and allocate bit if newly available\n\t\t\tif len(missing) > 0 {\n\t\t\t\tqueue := requests[result.Bit]\n\t\t\t\tfor _, section := range missing {\n\t\t\t\t\tindex := sort.Search(len(queue), func(i int) bool { return queue[i] >= section })\n\t\t\t\t\tqueue = append(queue[:index], append([]uint64{section}, queue[index:]...)...)\n\t\t\t\t}\n\t\t\t\trequests[result.Bit] = queue\n\n\t\t\t\tif len(queue) == len(missing) {\n\t\t\t\t\tassign(result.Bit)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we're in the process of shutting down, terminate\n\t\t\tif allocs == 0 && shutdown == nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\n// MatcherSession is returned by a started matcher to be used as a terminator\n// for the actively running matching operation.\ntype MatcherSession struct {\n\tmatcher *Matcher\n\n\tcloser sync.Once     // Sync object to ensure we only ever close once\n\tquit   chan struct{} // Quit channel to request pipeline termination\n\tkill   chan struct{} // Term channel to signal non-graceful forced shutdown\n\n\tctx context.Context // Context used by the light client to abort filtering\n\terr atomic.Value    // Global error to track retrieval failures deep in the chain\n\n\tpend sync.WaitGroup\n}\n\n// Close stops the matching process and waits for all subprocesses to terminate\n// before returning. The timeout may be used for graceful shutdown, allowing the\n// currently running retrievals to complete before this time.\nfunc (s *MatcherSession) Close() {\n\ts.closer.Do(func() {\n\t\t// Signal termination and wait for all goroutines to tear down\n\t\tclose(s.quit)\n\t\ttime.AfterFunc(time.Second, func() { close(s.kill) })\n\t\ts.pend.Wait()\n\t})\n}\n\n// Error returns any failure encountered during the matching session.\nfunc (s *MatcherSession) Error() error {\n\tif err := s.err.Load(); err != nil {\n\t\treturn err.(error)\n\t}\n\treturn nil\n}\n\n// AllocateRetrieval assigns a bloom bit index to a client process that can either\n// immediately request and fetch the section contents assigned to this bit or wait\n// a little while for more sections to be requested.\nfunc (s *MatcherSession) AllocateRetrieval() (uint, bool) {\n\tfetcher := make(chan uint)\n\n\tselect {\n\tcase <-s.quit:\n\t\treturn 0, false\n\tcase s.matcher.retrievers <- fetcher:\n\t\tbit, ok := <-fetcher\n\t\treturn bit, ok\n\t}\n}\n\n// PendingSections returns the number of pending section retrievals belonging to\n// the given bloom bit index.\nfunc (s *MatcherSession) PendingSections(bit uint) int {\n\tfetcher := make(chan uint)\n\n\tselect {\n\tcase <-s.quit:\n\t\treturn 0\n\tcase s.matcher.counters <- fetcher:\n\t\tfetcher <- bit\n\t\treturn int(<-fetcher)\n\t}\n}\n\n// AllocateSections assigns all or part of an already allocated bit-task queue\n// to the requesting process.\nfunc (s *MatcherSession) AllocateSections(bit uint, count int) []uint64 {\n\tfetcher := make(chan *Retrieval)\n\n\tselect {\n\tcase <-s.quit:\n\t\treturn nil\n\tcase s.matcher.retrievals <- fetcher:\n\t\ttask := &Retrieval{\n\t\t\tBit:      bit,\n\t\t\tSections: make([]uint64, count),\n\t\t}\n\t\tfetcher <- task\n\t\treturn (<-fetcher).Sections\n\t}\n}\n\n// DeliverSections delivers a batch of section bit-vectors for a specific bloom\n// bit index to be injected into the processing pipeline.\nfunc (s *MatcherSession) DeliverSections(bit uint, sections []uint64, bitsets [][]byte) {\n\tselect {\n\tcase <-s.kill:\n\t\treturn\n\tcase s.matcher.deliveries <- &Retrieval{Bit: bit, Sections: sections, Bitsets: bitsets}:\n\t}\n}\n\n// Multiplex polls the matcher session for retrieval tasks and multiplexes it into\n// the requested retrieval queue to be serviced together with other sessions.\n//\n// This method will block for the lifetime of the session. Even after termination\n// of the session, any request in-flight need to be responded to! Empty responses\n// are fine though in that case.\nfunc (s *MatcherSession) Multiplex(batch int, wait time.Duration, mux chan chan *Retrieval) {\n\tfor {\n\t\t// Allocate a new bloom bit index to retrieve data for, stopping when done\n\t\tbit, ok := s.AllocateRetrieval()\n\t\tif !ok {\n\t\t\treturn\n\t\t}\n\t\t// Bit allocated, throttle a bit if we're below our batch limit\n\t\tif s.PendingSections(bit) < batch {\n\t\t\tselect {\n\t\t\tcase <-s.quit:\n\t\t\t\t// Session terminating, we can't meaningfully service, abort\n\t\t\t\ts.AllocateSections(bit, 0)\n\t\t\t\ts.DeliverSections(bit, []uint64{}, [][]byte{})\n\t\t\t\treturn\n\n\t\t\tcase <-time.After(wait):\n\t\t\t\t// Throttling up, fetch whatever's available\n\t\t\t}\n\t\t}\n\t\t// Allocate as much as we can handle and request servicing\n\t\tsections := s.AllocateSections(bit, batch)\n\t\trequest := make(chan *Retrieval)\n\n\t\tselect {\n\t\tcase <-s.quit:\n\t\t\t// Session terminating, we can't meaningfully service, abort\n\t\t\ts.DeliverSections(bit, sections, make([][]byte, len(sections)))\n\t\t\treturn\n\n\t\tcase mux <- request:\n\t\t\t// Retrieval accepted, something must arrive before we're aborting\n\t\t\trequest <- &Retrieval{Bit: bit, Sections: sections, Context: s.ctx}\n\n\t\t\tresult := <-request\n\t\t\tif result.Error != nil {\n\t\t\t\ts.err.Store(result.Error)\n\t\t\t\ts.Close()\n\t\t\t}\n\t\t\ts.DeliverSections(result.Bit, result.Sections, result.Bitsets)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "core/bloombits/scheduler.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bloombits\n\nimport (\n\t\"sync\"\n)\n\n// request represents a bloom retrieval task to prioritize and pull from the local\n// database or remotely from the network.\ntype request struct {\n\tsection uint64 // Section index to retrieve the a bit-vector from\n\tbit     uint   // Bit index within the section to retrieve the vector of\n}\n\n// response represents the state of a requested bit-vector through a scheduler.\ntype response struct {\n\tcached []byte        // Cached bits to dedup multiple requests\n\tdone   chan struct{} // Channel to allow waiting for completion\n}\n\n// scheduler handles the scheduling of bloom-filter retrieval operations for\n// entire section-batches belonging to a single bloom bit. Beside scheduling the\n// retrieval operations, this struct also deduplicates the requests and caches\n// the results to minimize network/database overhead even in complex filtering\n// scenarios.\ntype scheduler struct {\n\tbit       uint                 // Index of the bit in the bloom filter this scheduler is responsible for\n\tresponses map[uint64]*response // Currently pending retrieval requests or already cached responses\n\tlock      sync.Mutex           // Lock protecting the responses from concurrent access\n}\n\n// newScheduler creates a new bloom-filter retrieval scheduler for a specific\n// bit index.\nfunc newScheduler(idx uint) *scheduler {\n\treturn &scheduler{\n\t\tbit:       idx,\n\t\tresponses: make(map[uint64]*response),\n\t}\n}\n\n// run creates a retrieval pipeline, receiving section indexes from sections and\n// returning the results in the same order through the done channel. Concurrent\n// runs of the same scheduler are allowed, leading to retrieval task deduplication.\nfunc (s *scheduler) run(sections chan uint64, dist chan *request, done chan []byte, quit chan struct{}, wg *sync.WaitGroup) {\n\t// Create a forwarder channel between requests and responses of the same size as\n\t// the distribution channel (since that will block the pipeline anyway).\n\tpend := make(chan uint64, cap(dist))\n\n\t// Start the pipeline schedulers to forward between user -> distributor -> user\n\twg.Add(2)\n\tgo s.scheduleRequests(sections, dist, pend, quit, wg)\n\tgo s.scheduleDeliveries(pend, done, quit, wg)\n}\n\n// reset cleans up any leftovers from previous runs. This is required before a\n// restart to ensure the no previously requested but never delivered state will\n// cause a lockup.\nfunc (s *scheduler) reset() {\n\ts.lock.Lock()\n\tdefer s.lock.Unlock()\n\n\tfor section, res := range s.responses {\n\t\tif res.cached == nil {\n\t\t\tdelete(s.responses, section)\n\t\t}\n\t}\n}\n\n// scheduleRequests reads section retrieval requests from the input channel,\n// deduplicates the stream and pushes unique retrieval tasks into the distribution\n// channel for a database or network layer to honour.\nfunc (s *scheduler) scheduleRequests(reqs chan uint64, dist chan *request, pend chan uint64, quit chan struct{}, wg *sync.WaitGroup) {\n\t// Clean up the goroutine and pipeline when done\n\tdefer wg.Done()\n\tdefer close(pend)\n\n\t// Keep reading and scheduling section requests\n\tfor {\n\t\tselect {\n\t\tcase <-quit:\n\t\t\treturn\n\n\t\tcase section, ok := <-reqs:\n\t\t\t// New section retrieval requested\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Deduplicate retrieval requests\n\t\t\tunique := false\n\n\t\t\ts.lock.Lock()\n\t\t\tif s.responses[section] == nil {\n\t\t\t\ts.responses[section] = &response{\n\t\t\t\t\tdone: make(chan struct{}),\n\t\t\t\t}\n\t\t\t\tunique = true\n\t\t\t}\n\t\t\ts.lock.Unlock()\n\n\t\t\t// Schedule the section for retrieval and notify the deliverer to expect this section\n\t\t\tif unique {\n\t\t\t\tselect {\n\t\t\t\tcase <-quit:\n\t\t\t\t\treturn\n\t\t\t\tcase dist <- &request{bit: s.bit, section: section}:\n\t\t\t\t}\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\treturn\n\t\t\tcase pend <- section:\n\t\t\t}\n\t\t}\n\t}\n}\n\n// scheduleDeliveries reads section acceptance notifications and waits for them\n// to be delivered, pushing them into the output data buffer.\nfunc (s *scheduler) scheduleDeliveries(pend chan uint64, done chan []byte, quit chan struct{}, wg *sync.WaitGroup) {\n\t// Clean up the goroutine and pipeline when done\n\tdefer wg.Done()\n\tdefer close(done)\n\n\t// Keep reading notifications and scheduling deliveries\n\tfor {\n\t\tselect {\n\t\tcase <-quit:\n\t\t\treturn\n\n\t\tcase idx, ok := <-pend:\n\t\t\t// New section retrieval pending\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Wait until the request is honoured\n\t\t\ts.lock.Lock()\n\t\t\tres := s.responses[idx]\n\t\t\ts.lock.Unlock()\n\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\treturn\n\t\t\tcase <-res.done:\n\t\t\t}\n\t\t\t// Deliver the result\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\treturn\n\t\t\tcase done <- res.cached:\n\t\t\t}\n\t\t}\n\t}\n}\n\n// deliver is called by the request distributor when a reply to a request arrives.\nfunc (s *scheduler) deliver(sections []uint64, data [][]byte) {\n\ts.lock.Lock()\n\tdefer s.lock.Unlock()\n\n\tfor i, section := range sections {\n\t\tif res := s.responses[section]; res != nil && res.cached == nil { // Avoid non-requests and double deliveries\n\t\t\tres.cached = data[i]\n\t\t\tclose(res.done)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "core/bloombits/scheduler_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage bloombits\n\nimport (\n\t\"bytes\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"testing\"\n\t\"time\"\n)\n\n// Tests that the scheduler can deduplicate and forward retrieval requests to\n// underlying fetchers and serve responses back, irrelevant of the concurrency\n// of the requesting clients or serving data fetchers.\nfunc TestSchedulerSingleClientSingleFetcher(t *testing.T) { testScheduler(t, 1, 1, 5000) }\nfunc TestSchedulerSingleClientMultiFetcher(t *testing.T)  { testScheduler(t, 1, 10, 5000) }\nfunc TestSchedulerMultiClientSingleFetcher(t *testing.T)  { testScheduler(t, 10, 1, 5000) }\nfunc TestSchedulerMultiClientMultiFetcher(t *testing.T)   { testScheduler(t, 10, 10, 5000) }\n\nfunc testScheduler(t *testing.T, clients int, fetchers int, requests int) {\n\tf := newScheduler(0)\n\n\t// Create a batch of handler goroutines that respond to bloom bit requests and\n\t// deliver them to the scheduler.\n\tvar fetchPend sync.WaitGroup\n\tfetchPend.Add(fetchers)\n\tdefer fetchPend.Wait()\n\n\tfetch := make(chan *request, 16)\n\tdefer close(fetch)\n\n\tvar delivered uint32\n\tfor i := 0; i < fetchers; i++ {\n\t\tgo func() {\n\t\t\tdefer fetchPend.Done()\n\n\t\t\tfor req := range fetch {\n\t\t\t\ttime.Sleep(time.Duration(rand.Intn(int(100 * time.Microsecond))))\n\t\t\t\tatomic.AddUint32(&delivered, 1)\n\n\t\t\t\tf.deliver([]uint64{\n\t\t\t\t\treq.section + uint64(requests), // Non-requested data (ensure it doesn't go out of bounds)\n\t\t\t\t\treq.section,                    // Requested data\n\t\t\t\t\treq.section,                    // Duplicated data (ensure it doesn't double close anything)\n\t\t\t\t}, [][]byte{\n\t\t\t\t\t{},\n\t\t\t\t\tnew(big.Int).SetUint64(req.section).Bytes(),\n\t\t\t\t\tnew(big.Int).SetUint64(req.section).Bytes(),\n\t\t\t\t})\n\t\t\t}\n\t\t}()\n\t}\n\t// Start a batch of goroutines to concurrently run scheduling tasks\n\tquit := make(chan struct{})\n\n\tvar pend sync.WaitGroup\n\tpend.Add(clients)\n\n\tfor i := 0; i < clients; i++ {\n\t\tgo func() {\n\t\t\tdefer pend.Done()\n\n\t\t\tin := make(chan uint64, 16)\n\t\t\tout := make(chan []byte, 16)\n\n\t\t\tf.run(in, fetch, out, quit, &pend)\n\n\t\t\tgo func() {\n\t\t\t\tfor j := 0; j < requests; j++ {\n\t\t\t\t\tin <- uint64(j)\n\t\t\t\t}\n\t\t\t\tclose(in)\n\t\t\t}()\n\n\t\t\tfor j := 0; j < requests; j++ {\n\t\t\t\tbits := <-out\n\t\t\t\tif want := new(big.Int).SetUint64(uint64(j)).Bytes(); !bytes.Equal(bits, want) {\n\t\t\t\t\tt.Errorf(\"vector %d: delivered content mismatch: have %x, want %x\", j, bits, want)\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n\tpend.Wait()\n\n\tif have := atomic.LoadUint32(&delivered); int(have) != requests {\n\t\tt.Errorf(\"request count mismatch: have %v, want %v\", have, requests)\n\t}\n}\n"
  },
  {
    "path": "core/chain_indexer.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// ChainIndexerBackend defines the methods needed to process chain segments in\n// the background and write the segment results into the database. These can be\n// used to create filter blooms or CHTs.\ntype ChainIndexerBackend interface {\n\t// Reset initiates the processing of a new chain segment, potentially terminating\n\t// any partially completed operations (in case of a reorg).\n\tReset(section uint64, prevHead common.Hash) error\n\n\t// Process crunches through the next header in the chain segment. The caller\n\t// will ensure a sequential order of headers.\n\tProcess(header *types.Header)\n\n\t// Commit finalizes the section metadata and stores it into the database.\n\tCommit() error\n}\n\n// ChainIndexerChain interface is used for connecting the indexer to a blockchain\ntype ChainIndexerChain interface {\n\t// CurrentHeader retrieves the latest locally known header.\n\tCurrentHeader() *types.Header\n\n\t// SubscribeChainEvent subscribes to new head header notifications.\n\tSubscribeChainEvent(ch chan<- ChainEvent) event.Subscription\n}\n\n// ChainIndexer does a post-processing job for equally sized sections of the\n// canonical chain (like BlooomBits and CHT structures). A ChainIndexer is\n// connected to the blockchain through the event system by starting a\n// ChainEventLoop in a goroutine.\n//\n// Further child ChainIndexers can be added which use the output of the parent\n// section indexer. These child indexers receive new head notifications only\n// after an entire section has been finished or in case of rollbacks that might\n// affect already finished sections.\ntype ChainIndexer struct {\n\tchainDb  serodb.Database     // Chain database to index the data from\n\tindexDb  serodb.Database     // Prefixed table-view of the db to write index metadata into\n\tbackend  ChainIndexerBackend // Background processor generating the index data content\n\tchildren []*ChainIndexer     // Child indexers to cascade chain updates to\n\n\tactive uint32          // Flag whether the event loop was started\n\tupdate chan struct{}   // Notification channel that headers should be processed\n\tquit   chan chan error // Quit channel to tear down running goroutines\n\n\tsectionSize uint64 // Number of blocks in a single chain segment to process\n\tconfirmsReq uint64 // Number of confirmations before processing a completed segment\n\n\tstoredSections uint64 // Number of sections successfully indexed into the database\n\tknownSections  uint64 // Number of sections known to be complete (block wise)\n\tcascadedHead   uint64 // Block number of the last completed section cascaded to subindexers\n\n\tthrottling time.Duration // Disk throttling to prevent a heavy upgrade from hogging resources\n\n\tlog  log.Logger\n\tlock sync.RWMutex\n}\n\n// NewChainIndexer creates a new chain indexer to do background processing on\n// chain segments of a given size after certain number of confirmations passed.\n// The throttling parameter might be used to prevent database thrashing.\nfunc NewChainIndexer(chainDb, indexDb serodb.Database, backend ChainIndexerBackend, section, confirm uint64, throttling time.Duration, kind string) *ChainIndexer {\n\tc := &ChainIndexer{\n\t\tchainDb:     chainDb,\n\t\tindexDb:     indexDb,\n\t\tbackend:     backend,\n\t\tupdate:      make(chan struct{}, 1),\n\t\tquit:        make(chan chan error),\n\t\tsectionSize: section,\n\t\tconfirmsReq: confirm,\n\t\tthrottling:  throttling,\n\t\tlog:         log.New(\"type\", kind),\n\t}\n\t// Initialize database dependent fields and start the updater\n\tc.loadValidSections()\n\tgo c.updateLoop()\n\n\treturn c\n}\n\n// AddKnownSectionHead marks a new section head as known/processed if it is newer\n// than the already known best section head\nfunc (c *ChainIndexer) AddKnownSectionHead(section uint64, shead common.Hash) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\tif section < c.storedSections {\n\t\treturn\n\t}\n\tc.setSectionHead(section, shead)\n\tc.setValidSections(section + 1)\n}\n\n// Start creates a goroutine to feed chain head events into the indexer for\n// cascading background processing. Children do not need to be started, they\n// are notified about new events by their parents.\nfunc (c *ChainIndexer) Start(chain ChainIndexerChain) {\n\tevents := make(chan ChainEvent, 10)\n\tsub := chain.SubscribeChainEvent(events)\n\n\tgo c.eventLoop(chain.CurrentHeader(), events, sub)\n}\n\n// Close tears down all goroutines belonging to the indexer and returns any error\n// that might have occurred internally.\nfunc (c *ChainIndexer) Close() error {\n\tvar errs []error\n\n\t// Tear down the primary update loop\n\terrc := make(chan error)\n\tc.quit <- errc\n\tif err := <-errc; err != nil {\n\t\terrs = append(errs, err)\n\t}\n\t// If needed, tear down the secondary event loop\n\tif atomic.LoadUint32(&c.active) != 0 {\n\t\tc.quit <- errc\n\t\tif err := <-errc; err != nil {\n\t\t\terrs = append(errs, err)\n\t\t}\n\t}\n\t// Close all children\n\tfor _, child := range c.children {\n\t\tif err := child.Close(); err != nil {\n\t\t\terrs = append(errs, err)\n\t\t}\n\t}\n\t// Return any failures\n\tswitch {\n\tcase len(errs) == 0:\n\t\treturn nil\n\n\tcase len(errs) == 1:\n\t\treturn errs[0]\n\n\tdefault:\n\t\treturn fmt.Errorf(\"%v\", errs)\n\t}\n}\n\n// eventLoop is a secondary - optional - event loop of the indexer which is only\n// started for the outermost indexer to push chain head events into a processing\n// queue.\nfunc (c *ChainIndexer) eventLoop(currentHeader *types.Header, events chan ChainEvent, sub event.Subscription) {\n\t// Mark the chain indexer as active, requiring an additional teardown\n\tatomic.StoreUint32(&c.active, 1)\n\n\tdefer sub.Unsubscribe()\n\n\t// Fire the initial new head event to start any outstanding processing\n\tc.newHead(currentHeader.Number.Uint64(), false)\n\n\tvar (\n\t\tprevHeader = currentHeader\n\t\tprevHash   = currentHeader.Hash()\n\t)\n\tfor {\n\t\tselect {\n\t\tcase errc := <-c.quit:\n\t\t\t// Chain indexer terminating, report no failure and abort\n\t\t\terrc <- nil\n\t\t\treturn\n\n\t\tcase ev, ok := <-events:\n\t\t\t// Received a new event, ensure it's not nil (closing) and update\n\t\t\tif !ok {\n\t\t\t\terrc := <-c.quit\n\t\t\t\terrc <- nil\n\t\t\t\treturn\n\t\t\t}\n\t\t\theader := ev.Block.Header()\n\t\t\tif header.ParentHash != prevHash {\n\t\t\t\t// Reorg to the common ancestor (might not exist in light sync mode, skip reorg then)\n\t\t\t\t// TODO(karalabe, zsfelfoldi): This seems a bit brittle, can we detect this case explicitly?\n\n\t\t\t\t// TODO(karalabe): This operation is expensive and might block, causing the event system to\n\t\t\t\t// potentially also lock up. We need to do with on a different thread somehow.\n\t\t\t\tif h := rawdb.FindCommonAncestor(c.chainDb, prevHeader, header); h != nil {\n\t\t\t\t\tc.newHead(h.Number.Uint64(), true)\n\t\t\t\t}\n\t\t\t}\n\t\t\tc.newHead(header.Number.Uint64(), false)\n\n\t\t\tprevHeader, prevHash = header, header.Hash()\n\t\t}\n\t}\n}\n\n// newHead notifies the indexer about new chain heads and/or reorgs.\nfunc (c *ChainIndexer) newHead(head uint64, reorg bool) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\t// If a reorg happened, invalidate all sections until that point\n\tif reorg {\n\t\t// Revert the known section number to the reorg point\n\t\tchanged := head / c.sectionSize\n\t\tif changed < c.knownSections {\n\t\t\tc.knownSections = changed\n\t\t}\n\t\t// Revert the stored sections from the database to the reorg point\n\t\tif changed < c.storedSections {\n\t\t\tc.setValidSections(changed)\n\t\t}\n\t\t// Update the new head number to the finalized section end and notify children\n\t\thead = changed * c.sectionSize\n\n\t\tif head < c.cascadedHead {\n\t\t\tc.cascadedHead = head\n\t\t\tfor _, child := range c.children {\n\t\t\t\tchild.newHead(c.cascadedHead, true)\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\t// No reorg, calculate the number of newly known sections and update if high enough\n\tvar sections uint64\n\tif head >= c.confirmsReq {\n\t\tsections = (head + 1 - c.confirmsReq) / c.sectionSize\n\t\tif sections > c.knownSections {\n\t\t\tc.knownSections = sections\n\n\t\t\tselect {\n\t\t\tcase c.update <- struct{}{}:\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t}\n}\n\n// updateLoop is the main event loop of the indexer which pushes chain segments\n// down into the processing backend.\nfunc (c *ChainIndexer) updateLoop() {\n\tvar (\n\t\tupdating bool\n\t\tupdated  time.Time\n\t)\n\n\tfor {\n\t\tselect {\n\t\tcase errc := <-c.quit:\n\t\t\t// Chain indexer terminating, report no failure and abort\n\t\t\terrc <- nil\n\t\t\treturn\n\n\t\tcase <-c.update:\n\t\t\t// Section headers completed (or rolled back), update the index\n\t\t\tc.lock.Lock()\n\t\t\tif c.knownSections > c.storedSections {\n\t\t\t\t// Periodically print an upgrade log message to the user\n\t\t\t\tif time.Since(updated) > 8*time.Second {\n\t\t\t\t\tif c.knownSections > c.storedSections+1 {\n\t\t\t\t\t\tupdating = true\n\t\t\t\t\t\tc.log.Info(\"Upgrading chain index\", \"percentage\", c.storedSections*100/c.knownSections)\n\t\t\t\t\t}\n\t\t\t\t\tupdated = time.Now()\n\t\t\t\t}\n\t\t\t\t// Cache the current section count and head to allow unlocking the mutex\n\t\t\t\tsection := c.storedSections\n\t\t\t\tvar oldHead common.Hash\n\t\t\t\tif section > 0 {\n\t\t\t\t\toldHead = c.SectionHead(section - 1)\n\t\t\t\t}\n\t\t\t\t// Process the newly defined section in the background\n\t\t\t\tc.lock.Unlock()\n\t\t\t\tnewHead, err := c.processSection(section, oldHead)\n\t\t\t\tif err != nil {\n\t\t\t\t\tc.log.Error(\"Section processing failed\", \"error\", err)\n\t\t\t\t}\n\t\t\t\tc.lock.Lock()\n\n\t\t\t\t// If processing succeeded and no reorgs occcurred, mark the section completed\n\t\t\t\tif err == nil && oldHead == c.SectionHead(section-1) {\n\t\t\t\t\tc.setSectionHead(section, newHead)\n\t\t\t\t\tc.setValidSections(section + 1)\n\t\t\t\t\tif c.storedSections == c.knownSections && updating {\n\t\t\t\t\t\tupdating = false\n\t\t\t\t\t\tc.log.Info(\"Finished upgrading chain index\")\n\t\t\t\t\t}\n\n\t\t\t\t\tc.cascadedHead = c.storedSections*c.sectionSize - 1\n\t\t\t\t\tfor _, child := range c.children {\n\t\t\t\t\t\tc.log.Trace(\"Cascading chain index update\", \"head\", c.cascadedHead)\n\t\t\t\t\t\tchild.newHead(c.cascadedHead, false)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If processing failed, don't retry until further notification\n\t\t\t\t\tc.log.Debug(\"Chain index processing failed\", \"section\", section, \"err\", err)\n\t\t\t\t\tc.knownSections = c.storedSections\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If there are still further sections to process, reschedule\n\t\t\tif c.knownSections > c.storedSections {\n\t\t\t\ttime.AfterFunc(c.throttling, func() {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase c.update <- struct{}{}:\n\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t\tc.lock.Unlock()\n\t\t}\n\t}\n}\n\n// processSection processes an entire section by calling backend functions while\n// ensuring the continuity of the passed headers. Since the chain mutex is not\n// held while processing, the continuity can be broken by a long reorg, in which\n// case the function returns with an error.\nfunc (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (common.Hash, error) {\n\tc.log.Trace(\"Processing new chain section\", \"section\", section)\n\n\t// Reset and partial processing\n\n\tif err := c.backend.Reset(section, lastHead); err != nil {\n\t\tc.setValidSections(0)\n\t\treturn common.Hash{}, err\n\t}\n\n\tfor number := section * c.sectionSize; number < (section+1)*c.sectionSize; number++ {\n\t\thash := rawdb.ReadCanonicalHash(c.chainDb, number)\n\t\tif hash == (common.Hash{}) {\n\t\t\treturn common.Hash{}, fmt.Errorf(\"canonical block #%d unknown\", number)\n\t\t}\n\t\theader := rawdb.ReadHeader(c.chainDb, hash, number)\n\t\tif header == nil {\n\t\t\treturn common.Hash{}, fmt.Errorf(\"block #%d [%x…] not found\", number, hash[:4])\n\t\t} else if header.ParentHash != lastHead {\n\t\t\treturn common.Hash{}, fmt.Errorf(\"chain reorged during section processing\")\n\t\t}\n\t\tc.backend.Process(header)\n\t\tlastHead = header.Hash()\n\t}\n\tif err := c.backend.Commit(); err != nil {\n\t\tc.log.Error(\"Section commit failed\", \"error\", err)\n\t\treturn common.Hash{}, err\n\t}\n\treturn lastHead, nil\n}\n\n// Sections returns the number of processed sections maintained by the indexer\n// and also the information about the last header indexed for potential canonical\n// verifications.\nfunc (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\treturn c.storedSections, c.storedSections*c.sectionSize - 1, c.SectionHead(c.storedSections - 1)\n}\n\n// AddChildIndexer adds a child ChainIndexer that can use the output of this one\nfunc (c *ChainIndexer) AddChildIndexer(indexer *ChainIndexer) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\tc.children = append(c.children, indexer)\n\n\t// Cascade any pending updates to new children too\n\tif c.storedSections > 0 {\n\t\tindexer.newHead(c.storedSections*c.sectionSize-1, false)\n\t}\n}\n\n// loadValidSections reads the number of valid sections from the index database\n// and caches is into the local state.\nfunc (c *ChainIndexer) loadValidSections() {\n\tdata, _ := c.indexDb.Get([]byte(\"count\"))\n\tif len(data) == 8 {\n\t\tc.storedSections = binary.BigEndian.Uint64(data[:])\n\t}\n}\n\n// setValidSections writes the number of valid sections to the index database\nfunc (c *ChainIndexer) setValidSections(sections uint64) {\n\t// Set the current number of valid sections in the database\n\tvar data [8]byte\n\tbinary.BigEndian.PutUint64(data[:], sections)\n\tc.indexDb.Put([]byte(\"count\"), data[:])\n\n\t// Remove any reorged sections, caching the valids in the mean time\n\tfor c.storedSections > sections {\n\t\tc.storedSections--\n\t\tc.removeSectionHead(c.storedSections)\n\t}\n\tc.storedSections = sections // needed if new > old\n}\n\n// SectionHead retrieves the last block hash of a processed section from the\n// index database.\nfunc (c *ChainIndexer) SectionHead(section uint64) common.Hash {\n\tvar data [8]byte\n\tbinary.BigEndian.PutUint64(data[:], section)\n\n\thash, _ := c.indexDb.Get(append([]byte(\"shead\"), data[:]...))\n\tif len(hash) == len(common.Hash{}) {\n\t\treturn common.BytesToHash(hash)\n\t}\n\treturn common.Hash{}\n}\n\n// setSectionHead writes the last block hash of a processed section to the index\n// database.\nfunc (c *ChainIndexer) setSectionHead(section uint64, hash common.Hash) {\n\tvar data [8]byte\n\tbinary.BigEndian.PutUint64(data[:], section)\n\n\tc.indexDb.Put(append([]byte(\"shead\"), data[:]...), hash.Bytes())\n}\n\n// removeSectionHead removes the reference to a processed section from the index\n// database.\nfunc (c *ChainIndexer) removeSectionHead(section uint64) {\n\tvar data [8]byte\n\tbinary.BigEndian.PutUint64(data[:], section)\n\n\tc.indexDb.Delete(append([]byte(\"shead\"), data[:]...))\n}\n"
  },
  {
    "path": "core/chain_indexer_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Runs multiple tests with randomized parameters.\nfunc TestChainIndexerSingle(t *testing.T) {\n\tfor i := 0; i < 10; i++ {\n\t\ttestChainIndexer(t, 1)\n\t}\n}\n\n// Runs multiple tests with randomized parameters and different number of\n// chain backends.\nfunc TestChainIndexerWithChildren(t *testing.T) {\n\tfor i := 2; i < 8; i++ {\n\t\ttestChainIndexer(t, i)\n\t}\n}\n\n// testChainIndexer runs a test with either a single chain indexer or a chain of\n// multiple backends. The section size and required confirmation count parameters\n// are randomized.\nfunc testChainIndexer(t *testing.T, count int) {\n\tdb := serodb.NewMemDatabase()\n\tdefer db.Close()\n\n\t// Create a chain of indexers and ensure they all report empty\n\tbackends := make([]*testChainIndexBackend, count)\n\tfor i := 0; i < count; i++ {\n\t\tvar (\n\t\t\tsectionSize = uint64(rand.Intn(100) + 1)\n\t\t\tconfirmsReq = uint64(rand.Intn(10))\n\t\t)\n\t\tbackends[i] = &testChainIndexBackend{t: t, processCh: make(chan uint64)}\n\t\tbackends[i].indexer = NewChainIndexer(db, serodb.NewTable(db, string([]byte{byte(i)})), backends[i], sectionSize, confirmsReq, 0, fmt.Sprintf(\"indexer-%d\", i))\n\n\t\tif sections, _, _ := backends[i].indexer.Sections(); sections != 0 {\n\t\t\tt.Fatalf(\"Canonical section count mismatch: have %v, want %v\", sections, 0)\n\t\t}\n\t\tif i > 0 {\n\t\t\tbackends[i-1].indexer.AddChildIndexer(backends[i].indexer)\n\t\t}\n\t}\n\tdefer backends[0].indexer.Close() // parent indexer shuts down children\n\t// notify pings the root indexer about a new head or reorg, then expect\n\t// processed blocks if a section is processable\n\tnotify := func(headNum, failNum uint64, reorg bool) {\n\t\tbackends[0].indexer.newHead(headNum, reorg)\n\t\tif reorg {\n\t\t\tfor _, backend := range backends {\n\t\t\t\theadNum = backend.reorg(headNum)\n\t\t\t\tbackend.assertSections()\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tvar cascade bool\n\t\tfor _, backend := range backends {\n\t\t\theadNum, cascade = backend.assertBlocks(headNum, failNum)\n\t\t\tif !cascade {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbackend.assertSections()\n\t\t}\n\t}\n\t// inject inserts a new random canonical header into the database directly\n\tinject := func(number uint64) {\n\t\theader := &types.Header{Number: big.NewInt(int64(number)), Extra: big.NewInt(rand.Int63()).Bytes()}\n\t\tif number > 0 {\n\t\t\theader.ParentHash = rawdb.ReadCanonicalHash(db, number-1)\n\t\t}\n\t\trawdb.WriteHeader(db, header)\n\t\trawdb.WriteCanonicalHash(db, header.Hash(), number)\n\t}\n\t// Start indexer with an already existing chain\n\tfor i := uint64(0); i <= 100; i++ {\n\t\tinject(i)\n\t}\n\tnotify(100, 100, false)\n\n\t// Add new blocks one by one\n\tfor i := uint64(101); i <= 1000; i++ {\n\t\tinject(i)\n\t\tnotify(i, i, false)\n\t}\n\t// Do a reorg\n\tnotify(500, 500, true)\n\n\t// Create new fork\n\tfor i := uint64(501); i <= 1000; i++ {\n\t\tinject(i)\n\t\tnotify(i, i, false)\n\t}\n\tfor i := uint64(1001); i <= 1500; i++ {\n\t\tinject(i)\n\t}\n\t// Failed processing scenario where less blocks are available than notified\n\tnotify(2000, 1500, false)\n\n\t// Notify about a reorg (which could have caused the missing blocks if happened during processing)\n\tnotify(1500, 1500, true)\n\n\t// Create new fork\n\tfor i := uint64(1501); i <= 2000; i++ {\n\t\tinject(i)\n\t\tnotify(i, i, false)\n\t}\n}\n\n// testChainIndexBackend implements ChainIndexerBackend\ntype testChainIndexBackend struct {\n\tt                          *testing.T\n\tindexer                    *ChainIndexer\n\tsection, headerCnt, stored uint64\n\tprocessCh                  chan uint64\n}\n\n// assertSections verifies if a chain indexer has the correct number of section.\nfunc (b *testChainIndexBackend) assertSections() {\n\t// Keep trying for 3 seconds if it does not match\n\tvar sections uint64\n\tfor i := 0; i < 300; i++ {\n\t\tsections, _, _ = b.indexer.Sections()\n\t\tif sections == b.stored {\n\t\t\treturn\n\t\t}\n\t\ttime.Sleep(10 * time.Millisecond)\n\t}\n\tb.t.Fatalf(\"Canonical section count mismatch: have %v, want %v\", sections, b.stored)\n}\n\n// assertBlocks expects processing calls after new blocks have arrived. If the\n// failNum < headNum then we are simulating a scenario where a reorg has happened\n// after the processing has started and the processing of a section fails.\nfunc (b *testChainIndexBackend) assertBlocks(headNum, failNum uint64) (uint64, bool) {\n\tvar sections uint64\n\tif headNum >= b.indexer.confirmsReq {\n\t\tsections = (headNum + 1 - b.indexer.confirmsReq) / b.indexer.sectionSize\n\t\tif sections > b.stored {\n\t\t\t// expect processed blocks\n\t\t\tfor expectd := b.stored * b.indexer.sectionSize; expectd < sections*b.indexer.sectionSize; expectd++ {\n\t\t\t\tif expectd > failNum {\n\t\t\t\t\t// rolled back after processing started, no more process calls expected\n\t\t\t\t\t// wait until updating is done to make sure that processing actually fails\n\t\t\t\t\tvar updating bool\n\t\t\t\t\tfor i := 0; i < 300; i++ {\n\t\t\t\t\t\tb.indexer.lock.Lock()\n\t\t\t\t\t\tupdating = b.indexer.knownSections > b.indexer.storedSections\n\t\t\t\t\t\tb.indexer.lock.Unlock()\n\t\t\t\t\t\tif !updating {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t\t\t\t}\n\t\t\t\t\tif updating {\n\t\t\t\t\t\tb.t.Fatalf(\"update did not finish\")\n\t\t\t\t\t}\n\t\t\t\t\tsections = expectd / b.indexer.sectionSize\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tselect {\n\t\t\t\tcase <-time.After(10 * time.Second):\n\t\t\t\t\tb.t.Fatalf(\"Expected processed block #%d, got nothing\", expectd)\n\t\t\t\tcase processed := <-b.processCh:\n\t\t\t\t\tif processed != expectd {\n\t\t\t\t\t\tb.t.Errorf(\"Expected processed block #%d, got #%d\", expectd, processed)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tb.stored = sections\n\t\t}\n\t}\n\tif b.stored == 0 {\n\t\treturn 0, false\n\t}\n\treturn b.stored*b.indexer.sectionSize - 1, true\n}\n\nfunc (b *testChainIndexBackend) reorg(headNum uint64) uint64 {\n\tfirstChanged := headNum / b.indexer.sectionSize\n\tif firstChanged < b.stored {\n\t\tb.stored = firstChanged\n\t}\n\treturn b.stored * b.indexer.sectionSize\n}\n\nfunc (b *testChainIndexBackend) Reset(section uint64, prevHead common.Hash) error {\n\tb.section = section\n\tb.headerCnt = 0\n\treturn nil\n}\n\nfunc (b *testChainIndexBackend) Process(header *types.Header) {\n\tb.headerCnt++\n\tif b.headerCnt > b.indexer.sectionSize {\n\t\tb.t.Error(\"Processing too many headers\")\n\t}\n\t//t.processCh <- header.Number.Uint64()\n\tselect {\n\tcase <-time.After(10 * time.Second):\n\t\tb.t.Fatal(\"Unexpected call to Process\")\n\tcase b.processCh <- header.Number.Uint64():\n\t}\n}\n\nfunc (b *testChainIndexBackend) Commit() error {\n\tif b.headerCnt != b.indexer.sectionSize {\n\t\tb.t.Error(\"Not enough headers processed\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "core/chain_makers.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// BlockGen creates blocks for testing.\n// See GenerateChain for a detailed explanation.\ntype BlockGen struct {\n\ti           int\n\tparent      *types.Block\n\tchain       []*types.Block\n\tchainReader consensus.ChainReader\n\theader      *types.Header\n\tstatedb     *state.StateDB\n\n\tgasPool  *GasPool\n\ttxs      []*types.Transaction\n\treceipts []*types.Receipt\n\n\tconfig *params.ChainConfig\n\tengine consensus.Engine\n}\n\n// SetCoinbase sets the coinbase of the generated block.\n// It can be called at most once.\nfunc (b *BlockGen) SetCoinbase(addr common.Address) {\n\tif b.gasPool != nil {\n\t\tif len(b.txs) > 0 {\n\t\t\tpanic(\"coinbase must be set before adding transactions\")\n\t\t}\n\t\tpanic(\"coinbase can only be set once\")\n\t}\n\tb.header.Coinbase = addr\n\tb.gasPool = new(GasPool).AddGas(b.header.GasLimit)\n}\n\n// SetExtra sets the extra data field of the generated block.\nfunc (b *BlockGen) SetExtra(data []byte) {\n\tb.header.Extra = data\n}\n\n// AddTx adds a transaction to the generated block. If no coinbase has\n// been set, the block's coinbase is set to the zero address.\n//\n// AddTx panics if the transaction cannot be executed. In addition to\n// the protocol-imposed limitations (gas limit, etc.), there are some\n// further limitations on the content of transactions that can be\n// added. Notably, contract code relying on the BLOCKHASH instruction\n// will panic during execution.\nfunc (b *BlockGen) AddTx(tx *types.Transaction) {\n\tb.AddTxWithChain(nil, tx)\n}\n\n// AddTxWithChain adds a transaction to the generated block. If no coinbase has\n// been set, the block's coinbase is set to the zero address.\n//\n// AddTxWithChain panics if the transaction cannot be executed. In addition to\n// the protocol-imposed limitations (gas limit, etc.), there are some\n// further limitations on the content of transactions that can be\n// added. If contract code relies on the BLOCKHASH instruction,\n// the block in chain will be returned.\nfunc (b *BlockGen) AddTxWithChain(bc *BlockChain, tx *types.Transaction) {\n\tif b.gasPool == nil {\n\t\tb.SetCoinbase(common.Address{})\n\t}\n\tb.statedb.Prepare(tx.Hash(), common.Hash{}, len(b.txs))\n\treceipt, _, err := ApplyTransaction(b.config, bc, &b.header.Coinbase, b.gasPool, b.statedb, b.header, tx, &b.header.GasUsed, vm.Config{})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tb.txs = append(b.txs, tx)\n\tb.receipts = append(b.receipts, receipt)\n}\n\n// Number returns the block number of the block being generated.\nfunc (b *BlockGen) Number() *big.Int {\n\treturn new(big.Int).Set(b.header.Number)\n}\n\n// AddUncheckedReceipt forcefully adds a receipts to the block without a\n// backing transaction.\n//\n// AddUncheckedReceipt will cause consensus failures when used during real\n// chain processing. This is best used in conjunction with raw block insertion.\nfunc (b *BlockGen) AddUncheckedReceipt(receipt *types.Receipt) {\n\tb.receipts = append(b.receipts, receipt)\n}\n\n// PrevBlock returns a previously generated block by number. It panics if\n// num is greater or equal to the number of the block being generated.\n// For index -1, PrevBlock returns the parent block given to GenerateChain.\nfunc (b *BlockGen) PrevBlock(index int) *types.Block {\n\tif index >= b.i {\n\t\tpanic(\"block index out of range\")\n\t}\n\tif index == -1 {\n\t\treturn b.parent\n\t}\n\treturn b.chain[index]\n}\n\n// OffsetTime modifies the time instance of a block, implicitly changing its\n// associated difficulty. It's useful to test scenarios where forking is not\n// tied to chain length directly.\nfunc (b *BlockGen) OffsetTime(seconds int64) {\n\tb.header.Time.Add(b.header.Time, new(big.Int).SetInt64(seconds))\n\tif b.header.Time.Cmp(b.parent.Header().Time) <= 0 {\n\t\tpanic(\"block time out of range\")\n\t}\n\tb.header.Difficulty = b.engine.CalcDifficulty(b.chainReader, b.header.Time.Uint64(), b.parent.Header())\n}\n\n// GenerateChain creates a chain of n blocks. The first block's\n// parent will be the provided parent. db is used to store\n// intermediate states and should contain the parent's state trie.\n//\n// The generator function is called with a new block generator for\n// every block. Any transactions added to the generator\n// become part of the block. If gen is nil, the blocks will be empty\n// and their coinbase will be the zero address.\n//\n// Blocks created by GenerateChain do not contain valid proof of work\n// values. Inserting them into BlockChain requires use of FakePow or\n// a similar non-validating proof of work implementation.\nfunc GenerateChain(config *params.ChainConfig, parent *types.Block, engine consensus.Engine, db serodb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts) {\n\tif config == nil {\n\t\tconfig = params.AlphanetChainConfig\n\t}\n\tblocks, receipts := make(types.Blocks, n), make([]types.Receipts, n)\n\tgenblock := func(i int, parent *types.Block, statedb *state.StateDB) (*types.Block, types.Receipts) {\n\t\t// TODO(karalabe): This is needed for clique, which depends on multiple blocks.\n\t\t// It's nonetheless ugly to spin up a blockchain here. Get rid of this somehow.\n\t\tblockchain, _ := NewBlockChain(db, nil, config, engine, vm.Config{}, nil)\n\t\tdefer blockchain.Stop()\n\n\t\tb := &BlockGen{i: i, parent: parent, chain: blocks, chainReader: blockchain, statedb: statedb, config: config, engine: engine}\n\t\tb.header = makeHeader(b.chainReader, parent, statedb, b.engine)\n\n\t\t// Mutate the state and block according to any hard-fork specs\n\n\t\t// Execute any user modifications to the block and finalize it\n\t\tif gen != nil {\n\t\t\tgen(i, b)\n\t\t}\n\n\t\tif b.engine != nil {\n\t\t\tblock, _ := b.engine.Finalize(b.chainReader, b.header, statedb, b.txs, b.receipts, 0)\n\t\t\t// Write state changes to db\n\t\t\troot, err := statedb.Commit(true)\n\t\t\tif err != nil {\n\t\t\t\tpanic(fmt.Sprintf(\"state write error: %v\", err))\n\t\t\t}\n\t\t\tif err := statedb.Database().TrieDB().Commit(root, false); err != nil {\n\t\t\t\tpanic(fmt.Sprintf(\"trie write error: %v\", err))\n\t\t\t}\n\n\t\t\treturn block, b.receipts\n\t\t}\n\t\treturn nil, nil\n\t}\n\tfor i := 0; i < n; i++ {\n\t\tstatedb, err := state.New(state.NewDatabase(db), parent.Header())\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tblock, receipt := genblock(i, parent, statedb)\n\t\tblocks[i] = block\n\t\treceipts[i] = receipt\n\t\tparent = block\n\t}\n\treturn blocks, receipts\n}\n\nfunc makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.StateDB, engine consensus.Engine) *types.Header {\n\tvar time *big.Int\n\tif parent.Time() == nil {\n\t\ttime = big.NewInt(10)\n\t} else {\n\t\ttime = new(big.Int).Add(parent.Time(), big.NewInt(10)) // block time is fixed at 10 seconds\n\t}\n\n\treturn &types.Header{\n\t\tRoot:       state.IntermediateRoot(true),\n\t\tParentHash: parent.Hash(),\n\t\tCoinbase:   parent.Coinbase(),\n\t\tDifficulty: engine.CalcDifficulty(chain, time.Uint64(), &types.Header{\n\t\t\tNumber:     parent.Number(),\n\t\t\tTime:       new(big.Int).Sub(time, big.NewInt(10)),\n\t\t\tDifficulty: parent.Difficulty(),\n\t\t}),\n\t\tGasLimit: CalcGasLimit(parent),\n\t\tNumber:   new(big.Int).Add(parent.Number(), common.Big1),\n\t\tTime:     time,\n\t}\n}\n"
  },
  {
    "path": "core/error.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport \"errors\"\n\nvar (\n\t// ErrKnownBlock is returned when a block to import is already known locally.\n\tErrKnownBlock = errors.New(\"block already known\")\n\n\t// ErrGasLimitReached is returned by the gas pool if the amount of gas required\n\t// by a transaction is higher than what's left in the block.\n\tErrGasLimitReached = errors.New(\"gas limit reached\")\n\n\t// ErrBlacklistedHash is returned if a block to import is on the blacklist.\n\tErrBlacklistedHash = errors.New(\"blacklisted hash\")\n\n\t// ErrNonceTooHigh is returned if the nonce of a transaction is higher than the\n\t// next one expected based on the local chain.\n\tErrNonceTooHigh = errors.New(\"nonce too high\")\n)\n"
  },
  {
    "path": "core/events.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\n// NewTxsEvent is posted when a batch of transactions enter the transaction pool.\ntype NewTxsEvent struct{ Txs []*types.Transaction }\n\n// PendingLogsEvent is posted pre mining and notifies of pending logs.\ntype PendingLogsEvent struct {\n\tLogs []*types.Log\n}\n\n// PendingStateEvent is posted pre mining and notifies of pending state changes.\ntype PendingStateEvent struct{}\n\n// NewMinedBlockEvent is posted when a block has been imported.\ntype NewMinedBlockEvent struct{ Block *types.Block }\n\n// RemovedLogsEvent is posted when a reorg happens\ntype RemovedLogsEvent struct{ Logs []*types.Log }\n\ntype ChainEvent struct {\n\tBlock *types.Block\n\tHash  common.Hash\n\tLogs  []*types.Log\n}\n\ntype ChainSideEvent struct {\n\tBlock *types.Block\n}\n\ntype ChainHeadEvent struct{ Block *types.Block }\n\ntype NewLotteryEvent struct {\n\tLottery *types.Lottery\n}\n\ntype NewVoteEvent struct {\n\tVote *types.Vote\n}\n"
  },
  {
    "path": "core/evm.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n)\n\n// ChainContext supports retrieving headers and consensus parameters from the\n// current blockchain to be used during transaction processing.\ntype ChainContext interface {\n\t// Engine retrieves the chain's consensus engine.\n\tEngine() consensus.Engine\n\n\t// GetHeader returns the hash corresponding to their hash.\n\tGetHeader(common.Hash, uint64) *types.Header\n}\n\n// NewEVMContext creates a new context for use in the EVM.\nfunc NewEVMContext(msg Message, header *types.Header, chain ChainContext, author *common.Address) vm.Context {\n\t// If we don't have an explicit author (i.e. not mining), extract from the header\n\tvar beneficiary common.Address\n\tif author == nil {\n\t\tbeneficiary, _ = chain.Engine().Author(header) // Ignore error, we're past header validation\n\t} else {\n\t\tbeneficiary = *author\n\t}\n\treturn vm.Context{\n\t\tTransfer:    Transfer,\n\t\tCanTransfer: CanTransfer,\n\t\tGetHash:     GetHashFn(header, chain),\n\t\tOrigin:      msg.From(),\n\t\tCoinbase:    beneficiary,\n\t\tBlockNumber: new(big.Int).Set(header.Number),\n\t\tTime:        new(big.Int).Set(header.Time),\n\t\tDifficulty:  new(big.Int).Set(header.Difficulty),\n\t\tGasLimit:    header.GasLimit,\n\t\tGasPrice:    new(big.Int).Set(msg.GasPrice()),\n\t\tTxHash:      msg.TxHash(),\n\t}\n}\n\n// GetHashFn returns a GetHashFunc which retrieves header hashes by number\nfunc GetHashFn(ref *types.Header, chain ChainContext) func(n uint64) common.Hash {\n\tvar cache map[uint64]common.Hash\n\n\treturn func(n uint64) common.Hash {\n\t\t// If there's no hash cache yet, make one\n\t\tif cache == nil {\n\t\t\tcache = map[uint64]common.Hash{\n\t\t\t\tref.Number.Uint64() - 1: ref.ParentHash,\n\t\t\t}\n\t\t}\n\t\t// Try to fulfill the request from the cache\n\t\tif hash, ok := cache[n]; ok {\n\t\t\treturn hash\n\t\t}\n\t\t// Not cached, iterate the blocks and cache the hashes\n\t\tfor header := chain.GetHeader(ref.ParentHash, ref.Number.Uint64()-1); header != nil; header = chain.GetHeader(header.ParentHash, header.Number.Uint64()-1) {\n\t\t\tcache[header.Number.Uint64()-1] = header.ParentHash\n\t\t\tif n == header.Number.Uint64()-1 {\n\t\t\t\treturn header.ParentHash\n\t\t\t}\n\t\t}\n\t\treturn common.Hash{}\n\t}\n}\n\n// CanTransfer checks whether there are enough funds in the address' account to make a transfer.\n// This does not take the necessary gas in to account to make the transfer valid.\nfunc CanTransfer(db vm.StateDB, addr common.Address, asset *assets.Asset) bool {\n\tflag := true\n\tif asset == nil {\n\t\treturn flag\n\t}\n\tif asset.Tkn != nil {\n\t\tamount := big.Int(asset.Tkn.Value)\n\t\tflag = db.GetBalance(addr, strings.Trim(string(asset.Tkn.Currency[:]), string([]byte{0}))).Cmp(&amount) >= 0\n\t}\n\tif flag && asset.Tkt != nil {\n\t\tcategory := strings.Trim(string(asset.Tkt.Category[:]), string([]byte{0}))\n\t\treturn db.OwnTicket(addr, category, common.BytesToHash(asset.Tkt.Value[:]))\n\t}\n\treturn flag\n}\n\n// Transfer subtracts amount from sender and adds amount to recipient using the given Db\nfunc Transfer(db vm.StateDB, sender, recipient common.Address, asset *assets.Asset, txHash common.Hash) (alarm bool) {\n\tif asset == nil {\n\t\treturn\n\t}\n\tif db.IsContract(sender) {\n\t\tif asset.Tkn != nil {\n\t\t\tamount := big.Int(asset.Tkn.Value)\n\t\t\tif amount.Sign() > 0 {\n\t\t\t\tcurrency := strings.Trim(string(asset.Tkn.Currency[:]), string([]byte{0}))\n\t\t\t\tdb.SubBalance(sender, currency, &amount)\n\t\t\t}\n\t\t}\n\t\tif asset.Tkt != nil {\n\t\t\tcategory := strings.Trim(string(asset.Tkt.Category[:]), string([]byte{0}))\n\t\t\tdb.RemoveTicket(sender, category, common.BytesToHash(asset.Tkt.Value[:]))\n\t\t}\n\t}\n\n\tif db.IsContract(recipient) {\n\t\tif asset.Tkn != nil {\n\t\t\tamount := big.Int(asset.Tkn.Value)\n\t\t\tif amount.Sign() > 0 {\n\t\t\t\tcurrency := strings.Trim(string(asset.Tkn.Currency[:]), string([]byte{0}))\n\t\t\t\tdb.AddBalance(recipient, currency, &amount)\n\t\t\t}\n\t\t}\n\t\tif asset.Tkt != nil {\n\t\t\tcategory := strings.Trim(string(asset.Tkt.Category[:]), string([]byte{0}))\n\t\t\tdb.AddTicket(recipient, category, common.BytesToHash(asset.Tkt.Value[:]))\n\t\t}\n\t} else {\n\t\talarm = db.NextZState().AddTxOutWithCheck(recipient, *asset, txHash)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "core/gaspool.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"fmt\"\n\t\"math\"\n)\n\n// GasPool tracks the amount of gas available during execution of the transactions\n// in a block. The zero value is a pool with zero gas available.\ntype GasPool uint64\n\n// AddGas makes gas available for execution.\nfunc (gp *GasPool) AddGas(amount uint64) *GasPool {\n\tif uint64(*gp) > math.MaxUint64-amount {\n\t\tpanic(\"gas pool pushed above uint64\")\n\t}\n\t*(*uint64)(gp) += amount\n\treturn gp\n}\n\n// SubGas deducts the given amount from the pool if enough gas is\n// available and returns an error otherwise.\nfunc (gp *GasPool) SubGas(amount uint64) error {\n\tif uint64(*gp) < amount {\n\t\treturn ErrGasLimitReached\n\t}\n\t*(*uint64)(gp) -= amount\n\treturn nil\n}\n\n// Gas returns the amount of gas remaining in the pool.\nfunc (gp *GasPool) Gas() uint64 {\n\treturn uint64(*gp)\n}\n\nfunc (gp *GasPool) String() string {\n\treturn fmt.Sprintf(\"%d\", *gp)\n}\n"
  },
  {
    "path": "core/gen_genesis.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage core\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nvar _ = (*genesisSpecMarshaling)(nil)\n\nfunc (g Genesis) MarshalJSON() ([]byte, error) {\n\ttype Genesis struct {\n\t\tConfig *params.ChainConfig `json:\"config\"`\n\t\t//Nonce      math.HexOrDecimal64                         `json:\"nonce\"`\n\t\tTimestamp  math.HexOrDecimal64                         `json:\"timestamp\"`\n\t\tExtraData  hexutil.Bytes                               `json:\"extraData\"`\n\t\tGasLimit   math.HexOrDecimal64                         `json:\"gasLimit\"   gencodec:\"required\"`\n\t\tDifficulty *math.HexOrDecimal256                       `json:\"difficulty\" gencodec:\"required\"`\n\t\tMixhash    common.Hash                                 `json:\"mixHash\"`\n\t\tCoinbase   common.Address                              `json:\"coinbase\"`\n\t\tAlloc      map[common.UnprefixedAddress]GenesisAccount `json:\"alloc\"      gencodec:\"required\"`\n\t\tNumber     math.HexOrDecimal64                         `json:\"number\"`\n\t\tGasUsed    math.HexOrDecimal64                         `json:\"gasUsed\"`\n\t\tParentHash common.Hash                                 `json:\"parentHash\"`\n\t}\n\tvar enc Genesis\n\tenc.Config = g.Config\n\t//enc.Nonce = math.HexOrDecimal64(g.Nonce)\n\tenc.Timestamp = math.HexOrDecimal64(g.Timestamp)\n\tenc.ExtraData = g.ExtraData\n\tenc.GasLimit = math.HexOrDecimal64(g.GasLimit)\n\tenc.Difficulty = (*math.HexOrDecimal256)(g.Difficulty)\n\tenc.Mixhash = g.Mixhash\n\tenc.Coinbase = g.Coinbase\n\tif g.Alloc != nil {\n\t\tenc.Alloc = make(map[common.UnprefixedAddress]GenesisAccount, len(g.Alloc))\n\t\tfor k, v := range g.Alloc {\n\t\t\tenc.Alloc[common.UnprefixedAddress(k)] = v\n\t\t}\n\t}\n\tenc.Number = math.HexOrDecimal64(g.Number)\n\tenc.GasUsed = math.HexOrDecimal64(g.GasUsed)\n\tenc.ParentHash = g.ParentHash\n\treturn json.Marshal(&enc)\n}\n\nfunc (g *Genesis) UnmarshalJSON(input []byte) error {\n\ttype Genesis struct {\n\t\tConfig *params.ChainConfig `json:\"config\"`\n\t\t//Nonce      *math.HexOrDecimal64                        `json:\"nonce\"`\n\t\tTimestamp  *math.HexOrDecimal64                        `json:\"timestamp\"`\n\t\tExtraData  *hexutil.Bytes                              `json:\"extraData\"`\n\t\tGasLimit   *math.HexOrDecimal64                        `json:\"gasLimit\"   gencodec:\"required\"`\n\t\tDifficulty *math.HexOrDecimal256                       `json:\"difficulty\" gencodec:\"required\"`\n\t\tMixhash    *common.Hash                                `json:\"mixHash\"`\n\t\tCoinbase   *common.Address                             `json:\"coinbase\"`\n\t\tAlloc      map[common.UnprefixedAddress]GenesisAccount `json:\"alloc\"      gencodec:\"required\"`\n\t\tNumber     *math.HexOrDecimal64                        `json:\"number\"`\n\t\tGasUsed    *math.HexOrDecimal64                        `json:\"gasUsed\"`\n\t\tParentHash *common.Hash                                `json:\"parentHash\"`\n\t}\n\tvar dec Genesis\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Config != nil {\n\t\tg.Config = dec.Config\n\t}\n\t//if dec.Nonce != nil {\n\t//\tg.Nonce = uint64(*dec.Nonce)\n\t//}\n\tif dec.Timestamp != nil {\n\t\tg.Timestamp = uint64(*dec.Timestamp)\n\t}\n\tif dec.ExtraData != nil {\n\t\tg.ExtraData = *dec.ExtraData\n\t}\n\tif dec.GasLimit == nil {\n\t\treturn errors.New(\"missing required field 'gasLimit' for Genesis\")\n\t}\n\tg.GasLimit = uint64(*dec.GasLimit)\n\tif dec.Difficulty == nil {\n\t\treturn errors.New(\"missing required field 'difficulty' for Genesis\")\n\t}\n\tg.Difficulty = (*big.Int)(dec.Difficulty)\n\tif dec.Mixhash != nil {\n\t\tg.Mixhash = *dec.Mixhash\n\t}\n\tif dec.Coinbase != nil {\n\t\tg.Coinbase = *dec.Coinbase\n\t}\n\tif dec.Alloc == nil {\n\t\treturn errors.New(\"missing required field 'alloc' for Genesis\")\n\t}\n\tg.Alloc = make(GenesisAlloc, len(dec.Alloc))\n\tfor k, v := range dec.Alloc {\n\t\tg.Alloc[common.Address(k)] = v\n\t}\n\tif dec.Number != nil {\n\t\tg.Number = uint64(*dec.Number)\n\t}\n\tif dec.GasUsed != nil {\n\t\tg.GasUsed = uint64(*dec.GasUsed)\n\t}\n\tif dec.ParentHash != nil {\n\t\tg.ParentHash = *dec.ParentHash\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "core/gen_genesis_account.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage core\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar _ = (*genesisAccountMarshaling)(nil)\n\nfunc (g GenesisAccount) MarshalJSON() ([]byte, error) {\n\ttype GenesisAccount struct {\n\t\tCode    hexutil.Bytes               `json:\"code,omitempty\"`\n\t\tStorage map[storageJSON]storageJSON `json:\"storage,omitempty\"`\n\t\tBalance *math.HexOrDecimal256       `json:\"balance\" gencodec:\"required\"`\n\t\tNonce   math.HexOrDecimal64         `json:\"nonce,omitempty\"`\n\t}\n\tvar enc GenesisAccount\n\tenc.Code = g.Code\n\tif g.Storage != nil {\n\t\tenc.Storage = make(map[storageJSON]storageJSON, len(g.Storage))\n\t\tfor k, v := range g.Storage {\n\t\t\tenc.Storage[storageJSON(k)] = storageJSON(v)\n\t\t}\n\t}\n\tenc.Balance = (*math.HexOrDecimal256)(g.Balance)\n\tenc.Nonce = math.HexOrDecimal64(g.Nonce)\n\treturn json.Marshal(&enc)\n}\n\nfunc (g *GenesisAccount) UnmarshalJSON(input []byte) error {\n\ttype GenesisAccount struct {\n\t\tCode    *hexutil.Bytes              `json:\"code,omitempty\"`\n\t\tStorage map[storageJSON]storageJSON `json:\"storage,omitempty\"`\n\t\tBalance *math.HexOrDecimal256       `json:\"balance\" gencodec:\"required\"`\n\t\tNonce   *math.HexOrDecimal64        `json:\"nonce,omitempty\"`\n\t}\n\tvar dec GenesisAccount\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Code != nil {\n\t\tg.Code = *dec.Code\n\t}\n\tif dec.Storage != nil {\n\t\tg.Storage = make(map[common.Hash]common.Hash, len(dec.Storage))\n\t\tfor k, v := range dec.Storage {\n\t\t\tg.Storage[common.Hash(k)] = common.Hash(v)\n\t\t}\n\t}\n\tif dec.Balance == nil {\n\t\treturn errors.New(\"missing required field 'balance' for GenesisAccount\")\n\t}\n\tg.Balance = (*big.Int)(dec.Balance)\n\tif dec.Nonce != nil {\n\t\tg.Nonce = uint64(*dec.Nonce)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "core/genesis.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\n//go:generate gencodec -type Genesis -field-override genesisSpecMarshaling -out gen_genesis.go\n//go:generate gencodec -type GenesisAccount -field-override genesisAccountMarshaling -out gen_genesis_account.go\n\nvar errGenesisNoConfig = errors.New(\"genesis has no chain configuration\")\n\n// Genesis specifies the header fields, state of a genesis block. It also defines hard\n// fork switch-over blocks through the chain configuration.\ntype Genesis struct {\n\tConfig *params.ChainConfig `json:\"config\"`\n\t//Nonce      uint64              `json:\"nonce\"`\n\tTimestamp  uint64         `json:\"timestamp\"`\n\tExtraData  []byte         `json:\"extraData\"`\n\tGasLimit   uint64         `json:\"gasLimit\"   gencodec:\"required\"`\n\tDifficulty *big.Int       `json:\"difficulty\" gencodec:\"required\"`\n\tMixhash    common.Hash    `json:\"mixHash\"`\n\tCoinbase   common.Address `json:\"coinbase\"`\n\tAlloc      GenesisAlloc   `json:\"alloc\"      gencodec:\"required\"`\n\n\t// These fields are used for consensus tests. Please don't use them\n\t// in actual genesis blocks.\n\tNumber     uint64      `json:\"number\"`\n\tGasUsed    uint64      `json:\"gasUsed\"`\n\tParentHash common.Hash `json:\"parentHash\"`\n}\n\n// GenesisAlloc specifies the initial state that is part of the genesis block.\ntype GenesisAlloc map[common.Address]GenesisAccount\n\nfunc (ga *GenesisAlloc) UnmarshalJSON(data []byte) error {\n\tm := make(map[common.UnprefixedAddress]GenesisAccount)\n\tif err := json.Unmarshal(data, &m); err != nil {\n\t\treturn err\n\t}\n\t*ga = make(GenesisAlloc)\n\tfor addr, a := range m {\n\t\t(*ga)[common.Address(addr)] = a\n\t}\n\treturn nil\n}\n\n// GenesisAccount is an account in the state of the genesis block.\ntype GenesisAccount struct {\n\tCode    []byte                      `json:\"code,omitempty\"`\n\tStorage map[common.Hash]common.Hash `json:\"storage,omitempty\"`\n\tBalance *big.Int                    `json:\"balance\" gencodec:\"required\"`\n\tNonce   uint64                      `json:\"nonce,omitempty\"`\n}\n\n// field type overrides for gencodec\ntype genesisSpecMarshaling struct {\n\tNonce      math.HexOrDecimal64\n\tTimestamp  math.HexOrDecimal64\n\tExtraData  hexutil.Bytes\n\tGasLimit   math.HexOrDecimal64\n\tGasUsed    math.HexOrDecimal64\n\tNumber     math.HexOrDecimal64\n\tDifficulty *math.HexOrDecimal256\n\tAlloc      map[common.UnprefixedAddress]GenesisAccount\n}\n\ntype genesisAccountMarshaling struct {\n\tCode       hexutil.Bytes\n\tBalance    *math.HexOrDecimal256\n\tNonce      math.HexOrDecimal64\n\tStorage    map[storageJSON]storageJSON\n\tPrivateKey hexutil.Bytes\n}\n\n// storageJSON represents a 256 bit byte array, but allows less than 256 bits when\n// unmarshaling from hex.\ntype storageJSON common.Hash\n\nfunc (h *storageJSON) UnmarshalText(text []byte) error {\n\ttext = bytes.TrimPrefix(text, []byte(\"0x\"))\n\tif len(text) > 64 {\n\t\treturn fmt.Errorf(\"too many hex characters in storage key/value %q\", text)\n\t}\n\toffset := len(h) - len(text)/2 // pad on the left\n\tif _, err := hex.Decode(h[offset:], text); err != nil {\n\t\tfmt.Println(err)\n\t\treturn fmt.Errorf(\"invalid hex storage key/value %q\", text)\n\t}\n\treturn nil\n}\n\nfunc (h storageJSON) MarshalText() ([]byte, error) {\n\treturn hexutil.Bytes(h[:]).MarshalText()\n}\n\n// GenesisMismatchError is raised when trying to overwrite an existing\n// genesis block with an incompatible one.\ntype GenesisMismatchError struct {\n\tStored, New common.Hash\n}\n\nfunc (e *GenesisMismatchError) Error() string {\n\treturn fmt.Sprintf(\"database already contains an incompatible genesis block (have %x, new %x)\", e.Stored[:8], e.New[:8])\n}\n\n// SetupGenesisBlock writes or updates the genesis block in db.\n// The block that will be used is:\n//\n//                          genesis == nil       genesis != nil\n//                       +------------------------------------------\n//     db has no genesis |  main-net default  |  genesis\n//     db has genesis    |  from DB           |  genesis (if compatible)\n//\n// The stored chain configuration will be updated if it is compatible (i.e. does not\n// specify a fork block below the local head block). In case of a conflict, the\n// error is a *params.ConfigCompatError and the new, unwritten config is returned.\n//\n// The returned chain configuration is never nil.\nfunc SetupGenesisBlock(db serodb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) {\n\tif genesis != nil && genesis.Config == nil {\n\t\treturn params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig\n\t}\n\n\t// Just commit the new block if there is no stored genesis block.\n\tstored := rawdb.ReadCanonicalHash(db, 0)\n\tif (stored == common.Hash{}) {\n\t\tif genesis == nil {\n\t\t\tlog.Info(\"Writing default beta-net genesis block\")\n\t\t\tgenesis = DefaultGenesisBlock()\n\t\t} else {\n\t\t\tlog.Info(\"Writing custom genesis block\")\n\t\t}\n\t\tblock, err := genesis.Commit(db)\n\t\treturn genesis.Config, block.Hash(), err\n\t}\n\n\t// Check whether the genesis block is already written.\n\tif genesis != nil {\n\t\thash := genesis.ToBlock(nil).Hash()\n\t\tif hash != stored {\n\t\t\treturn genesis.Config, hash, &GenesisMismatchError{stored, hash}\n\t\t}\n\t}\n\n\t// Get the existing chain configuration.\n\tnewcfg := genesis.configOrDefault(stored)\n\tstoredcfg := rawdb.ReadChainConfig(db, stored)\n\tif storedcfg == nil {\n\t\tlog.Warn(\"Found genesis block without chain config\")\n\t\trawdb.WriteChainConfig(db, stored, newcfg)\n\t\treturn newcfg, stored, nil\n\t}\n\t// Special case: don't change the existing config of a non-mainnet chain if no new\n\t// config is supplied. These chains would get AllProtocolChanges (and a compat error)\n\t// if we just continued here.\n\tif genesis == nil && stored != params.MainnetGenesisHash {\n\t\treturn storedcfg, stored, nil\n\t}\n\n\t// Check config compatibility and write the config. Compatibility errors\n\t// are returned to the caller unless we're already at block zero.\n\theight := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db))\n\tif height == nil {\n\t\treturn newcfg, stored, fmt.Errorf(\"missing block number for head header hash\")\n\t}\n\tcompatErr := storedcfg.CheckCompatible(newcfg, *height)\n\tif compatErr != nil && *height != 0 && compatErr.RewindTo != 0 {\n\t\treturn newcfg, stored, compatErr\n\t}\n\trawdb.WriteChainConfig(db, stored, newcfg)\n\treturn newcfg, stored, nil\n}\n\nfunc (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig {\n\tswitch {\n\tcase g != nil:\n\t\treturn g.Config\n\tcase ghash == params.MainnetGenesisHash:\n\t\treturn params.BetanetChainConfig\n\tcase ghash == params.AlphanetGenesisHash:\n\t\treturn params.AlphanetChainConfig\n\tdefault:\n\t\treturn params.AllEthashProtocolChanges\n\t}\n}\n\n// ToBlock creates the genesis block and writes state of a genesis specification\n// to the given database (or discards it if nil).\nfunc (g *Genesis) ToBlock(db serodb.Database) *types.Block {\n\tif db == nil {\n\t\tdb = serodb.NewMemDatabase()\n\t}\n\tstatedb, _ := state.New(state.NewDatabase(db), nil)\n\tstatedb.RegisterToken(state.EmptyAddress, \"SERO\")\n\tstatedb.AddBalance(state.EmptyAddress, \"SERO\", new(big.Int).Mul(big.NewInt(250000000), big.NewInt(1e+18)))\n\n\tsero := common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32))\n\tvar keys common.AddressList\n\tfor k := range g.Alloc {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Sort(keys)\n\tfor _, addr := range keys {\n\t\taccount := g.Alloc[addr]\n\t\tif addr == state.EmptyAddress {\n\t\t} else if account.Code != nil && len(account.Code) > 0 {\n\t\t\tif account.Balance != nil && account.Balance.Sign() > 0 {\n\t\t\t\tstatedb.AddBalance(addr, \"SERO\", account.Balance)\n\t\t\t}\n\t\t\tstatedb.SetCode(addr, account.Code)\n\t\t} else {\n\t\t\tif account.Balance != nil && account.Balance.Sign() > 0 {\n\t\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\t\tCurrency: *sero.HashToUint256(),\n\t\t\t\t\tValue:    utils.U256(*account.Balance),\n\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tstatedb.NextZState().AddTxOut(addr, asset, common.Hash{})\n\t\t\t}\n\t\t}\n\t\tfor key, value := range account.Storage {\n\t\t\tstatedb.SetState(addr, key, value)\n\t\t}\n\t}\n\n\troot := statedb.IntermediateRoot(false)\n\thead := &types.Header{\n\t\tNumber:     new(big.Int).SetUint64(g.Number),\n\t\tTime:       new(big.Int).SetUint64(g.Timestamp),\n\t\tParentHash: g.ParentHash,\n\t\tExtra:      g.ExtraData,\n\t\tGasLimit:   g.GasLimit,\n\t\tGasUsed:    g.GasUsed,\n\t\tDifficulty: g.Difficulty,\n\t\tMixDigest:  g.Mixhash,\n\t\tCoinbase:   g.Coinbase,\n\t\tRoot:       root,\n\t}\n\tif g.GasLimit == 0 {\n\t\thead.GasLimit = params.GenesisGasLimit\n\t}\n\tif g.Difficulty == nil {\n\t\thead.Difficulty = params.GenesisDifficulty\n\t}\n\n\tstatedb.Commit(false)\n\n\tstatedb.Database().TrieDB().Commit(root, true)\n\n\tblock := types.NewBlock(head, nil, nil)\n\tblockhash := block.Hash()\n\tstatedb.GetStakeCons().Record(block.Header(), db)\n\tstatedb.NextZState().RecordBlock(db, blockhash.HashToUint256())\n\n\treturn block\n}\n\n// Commit writes the block and state of a genesis specification to the database.\n// The block is committed as the canonical head block.\nfunc (g *Genesis) Commit(db serodb.Database) (*types.Block, error) {\n\tblock := g.ToBlock(db)\n\tif block.Number().Sign() != 0 {\n\t\treturn nil, fmt.Errorf(\"can't commit genesis block with number > 0\")\n\t}\n\trawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty)\n\trawdb.WriteBlock(db, block)\n\trawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil)\n\trawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64())\n\trawdb.WriteHeadBlockHash(db, block.Hash())\n\trawdb.WriteHeadHeaderHash(db, block.Hash())\n\n\tconfig := g.Config\n\tif config == nil {\n\t\tconfig = params.AllEthashProtocolChanges\n\t}\n\trawdb.WriteChainConfig(db, block.Hash(), config)\n\treturn block, nil\n}\n\n// MustCommit writes the genesis block and state to db, panicking on error.\n// The block is committed as the canonical head block.\nfunc (g *Genesis) MustCommit(db serodb.Database) *types.Block {\n\tblock, err := g.Commit(db)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn block\n}\n\n// DefaultGenesisBlock returns the Ethereum main net genesis block.\nfunc DefaultGenesisBlock() *Genesis {\n\treturn &Genesis{\n\t\tConfig:     params.BetanetChainConfig,\n\t\tExtraData:  hexutil.MustDecode(\"0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa\"),\n\t\tGasLimit:   5000000,\n\t\tDifficulty: big.NewInt(1717986918),\n\n\t\tAlloc:      decodePreAlloc(mainnetAllocData),\n\t\tCoinbase:   common.Base58ToAddress(\"1111111111111111111111111111111111111111111111111111111111111111\"),\n\t\tParentHash: common.Hash{},\n\t\tMixhash:    common.Hash{},\n\t}\n}\n\n// DefaultAlphanetGenesisBlock returns the Ropsten network genesis block.\nfunc DefaultAlphanetGenesisBlock() *Genesis {\n\treturn &Genesis{\n\t\tConfig: params.AlphanetChainConfig,\n\t\t//Nonce:      66,\n\t\tExtraData:  hexutil.MustDecode(\"0x3535353535353535353535353535353535353535353535353535353535353535\"),\n\t\tGasLimit:   5000000,\n\t\tDifficulty: big.NewInt(51485767),\n\t\t//Alloc:      decodePrealloc(testnetAllocData),\n\t}\n}\n\n// DeveloperGenesisBlock returns the 'gero --dev' genesis block. Note, this must\nfunc DeveloperGenesisBlock() *Genesis {\n\treturn &Genesis{\n\t\tConfig: params.DevnetChainConfig,\n\t\t//Nonce:      66,\n\t\tExtraData: hexutil.MustDecode(\"0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\"),\n\t\tGasLimit:  5000000,\n\n\t\tDifficulty: big.NewInt(1),\n\t\tAlloc:      decodePreAlloc(testnetAllocData),\n\t}\n}\n\nfunc decodePrealloc(data string) GenesisAlloc {\n\tvar p []struct{ Addr, Balance *big.Int }\n\tif err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil {\n\t\tpanic(err)\n\t}\n\tga := make(GenesisAlloc, len(p))\n\tfor _, account := range p {\n\t\tga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance}\n\t}\n\treturn ga\n}\n\ntype Storage struct {\n\tKey   common.Hash\n\tValue common.Hash\n}\n\ntype AllocItem struct {\n\tAddr     common.Address\n\tBalance  *big.Int\n\tCode     []byte\n\tStorages []Storage\n}\n\nfunc decodePreAlloc(data string) GenesisAlloc {\n\tvar p []AllocItem\n\tif len(strings.TrimSpace(data)) == 0 {\n\t\treturn GenesisAlloc{}\n\t}\n\n\tif err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil {\n\t\tpanic(err)\n\t}\n\tga := make(GenesisAlloc, len(p))\n\tfor _, allocItem := range p {\n\t\taccount := GenesisAccount{Code: allocItem.Code, Balance: allocItem.Balance}\n\t\tif len(allocItem.Storages) > 0 {\n\t\t\ts := map[common.Hash]common.Hash{}\n\t\t\tfor _, each := range allocItem.Storages {\n\t\t\t\ts[each.Key] = each.Value\n\t\t\t}\n\t\t\taccount.Storage = s\n\t\t}\n\t\tga[allocItem.Addr] = account\n\t}\n\treturn ga\n}\n"
  },
  {
    "path": "core/headerchain.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\tcrand \"crypto/rand\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\tmrand \"math/rand\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/hashicorp/golang-lru\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nconst (\n\theaderCacheLimit = 512\n\ttdCacheLimit     = 1024\n\tnumberCacheLimit = 2048\n)\n\n// HeaderChain implements the basic block header chain logic that is shared by\n// core.BlockChain and light.LightChain. It is not usable in itself, only as\n// a part of either structure.\n// It is not thread safe either, the encapsulating chain structures should do\n// the necessary mutex locking/unlocking.\ntype HeaderChain struct {\n\tconfig *params.ChainConfig\n\n\tchainDb       serodb.Database\n\tgenesisHeader *types.Header\n\n\tcurrentHeader     atomic.Value // Current head of the header chain (may be above the block chain!)\n\tcurrentHeaderHash common.Hash  // Hash of the current head of the header chain (prevent recomputing all the time)\n\n\theaderCache *lru.Cache // Cache for the most recent block headers\n\ttdCache     *lru.Cache // Cache for the most recent block total difficulties\n\tnumberCache *lru.Cache // Cache for the most recent block numbers\n\n\tprocInterrupt func() bool\n\n\trand   *mrand.Rand\n\tengine consensus.Engine\n}\n\n// NewHeaderChain creates a new HeaderChain structure.\n//  getValidator should return the parent's validator\n//  procInterrupt points to the parent's interrupt semaphore\n//  wg points to the parent's shutdown wait group\nfunc NewHeaderChain(chainDb serodb.Database, config *params.ChainConfig, engine consensus.Engine, procInterrupt func() bool) (*HeaderChain, error) {\n\theaderCache, _ := lru.New(headerCacheLimit)\n\ttdCache, _ := lru.New(tdCacheLimit)\n\tnumberCache, _ := lru.New(numberCacheLimit)\n\n\t// Seed a fast but crypto originating random generator\n\tseed, err := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\thc := &HeaderChain{\n\t\tconfig:        config,\n\t\tchainDb:       chainDb,\n\t\theaderCache:   headerCache,\n\t\ttdCache:       tdCache,\n\t\tnumberCache:   numberCache,\n\t\tprocInterrupt: procInterrupt,\n\t\trand:          mrand.New(mrand.NewSource(seed.Int64())),\n\t\tengine:        engine,\n\t}\n\n\thc.genesisHeader = hc.GetHeaderByNumber(0)\n\tif hc.genesisHeader == nil {\n\t\treturn nil, ErrNoGenesis\n\t}\n\n\thc.currentHeader.Store(hc.genesisHeader)\n\tif head := rawdb.ReadHeadBlockHash(chainDb); head != (common.Hash{}) {\n\t\tif chead := hc.GetHeaderByHash(head); chead != nil {\n\t\t\thc.currentHeader.Store(chead)\n\t\t}\n\t}\n\thc.currentHeaderHash = hc.CurrentHeader().Hash()\n\n\treturn hc, nil\n}\n\n// GetBlockNumber retrieves the block number belonging to the given hash\n// from the cache or database\nfunc (hc *HeaderChain) GetBlockNumber(hash common.Hash) *uint64 {\n\tif cached, ok := hc.numberCache.Get(hash); ok {\n\t\tnumber := cached.(uint64)\n\t\treturn &number\n\t}\n\tnumber := rawdb.ReadHeaderNumber(hc.chainDb, hash)\n\tif number != nil {\n\t\thc.numberCache.Add(hash, *number)\n\t}\n\treturn number\n}\n\n// WriteHeader writes a header into the local chain, given that its parent is\n// already known. If the total difficulty of the newly inserted header becomes\n// greater than the current known TD, the canonical chain is re-routed.\n//\n// Note: This method is not concurrent-safe with inserting blocks simultaneously\n// into the chain, as side effects caused by reorganisations cannot be emulated\n// without the real blocks. Hence, writing headers directly should only be done\n// in two scenarios: pure-header mode of operation (light clients), or properly\n// separated header/block phases (non-archive clients).\nfunc (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, err error) {\n\t// Cache some values to prevent constant recalculation\n\tvar (\n\t\thash   = header.Hash()\n\t\tnumber = header.Number.Uint64()\n\t)\n\t// Calculate the total difficulty of the header\n\tptd := hc.GetTd(header.ParentHash, number-1)\n\tif ptd == nil {\n\t\treturn NonStatTy, consensus.ErrUnknownAncestor\n\t}\n\tlocalTd := hc.GetTd(hc.currentHeaderHash, hc.CurrentHeader().Number.Uint64())\n\texternTd := new(big.Int).Add(header.Difficulty, ptd)\n\n\t// Irrelevant of the canonical status, write the td and header to the database\n\tif err := hc.WriteTd(hash, number, externTd); err != nil {\n\t\tlog.Crit(\"Failed to write header total difficulty\", \"err\", err)\n\t}\n\trawdb.WriteHeader(hc.chainDb, header)\n\n\t// If the total difficulty is higher than our known, add it to the canonical chain\n\t// Second clause in the if statement reduces the vulnerability to selfish mining.\n\t// Please refer to http://www.cs.cornell.edu/~ie53/publications/btcProcFC.pdf\n\tif externTd.Cmp(localTd) > 0 || (externTd.Cmp(localTd) == 0 && mrand.Float64() < 0.5) {\n\t\t// Delete any canonical number assignments above the new head\n\t\tbatch := hc.chainDb.NewBatch()\n\t\tfor i := number + 1; ; i++ {\n\t\t\thash := rawdb.ReadCanonicalHash(hc.chainDb, i)\n\t\t\tif hash == (common.Hash{}) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\trawdb.DeleteCanonicalHash(batch, i)\n\t\t}\n\t\tbatch.Write()\n\n\t\t// Overwrite any stale canonical number assignments\n\t\tvar (\n\t\t\theadHash   = header.ParentHash\n\t\t\theadNumber = header.Number.Uint64() - 1\n\t\t\theadHeader = hc.GetHeader(headHash, headNumber)\n\t\t)\n\t\tfor rawdb.ReadCanonicalHash(hc.chainDb, headNumber) != headHash {\n\t\t\trawdb.WriteCanonicalHash(hc.chainDb, headHash, headNumber)\n\n\t\t\theadHash = headHeader.ParentHash\n\t\t\theadNumber = headHeader.Number.Uint64() - 1\n\t\t\theadHeader = hc.GetHeader(headHash, headNumber)\n\t\t}\n\t\t// Extend the canonical chain with the new header\n\t\trawdb.WriteCanonicalHash(hc.chainDb, hash, number)\n\t\trawdb.WriteHeadHeaderHash(hc.chainDb, hash)\n\n\t\thc.currentHeaderHash = hash\n\t\thc.currentHeader.Store(types.CopyHeader(header))\n\n\t\tstatus = CanonStatTy\n\t} else {\n\t\tstatus = SideStatTy\n\t}\n\n\thc.headerCache.Add(hash, header)\n\thc.numberCache.Add(hash, number)\n\n\treturn\n}\n\n// WhCallback is a callback function for inserting individual headers.\n// A callback is used for two reasons: first, in a LightChain, status should be\n// processed and light chain events sent, while in a BlockChain this is not\n// necessary since chain events are sent after inserting blocks. Second, the\n// header writes should be protected by the parent chain mutex individually.\ntype WhCallback func(*types.Header) error\n\nfunc (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) (int, error) {\n\t// Do a sanity check that the provided chain is actually ordered and linked\n\tfor i := 1; i < len(chain); i++ {\n\t\tif chain[i].Number.Uint64() != chain[i-1].Number.Uint64()+1 || chain[i].ParentHash != chain[i-1].Hash() {\n\t\t\t// Chain broke ancestry, log a message (programming error) and skip insertion\n\t\t\tlog.Error(\"Non contiguous header insert\", \"number\", chain[i].Number, \"hash\", chain[i].Hash(),\n\t\t\t\t\"parent\", chain[i].ParentHash, \"prevnumber\", chain[i-1].Number, \"prevhash\", chain[i-1].Hash())\n\n\t\t\treturn 0, fmt.Errorf(\"non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])\", i-1, chain[i-1].Number,\n\t\t\t\tchain[i-1].Hash().Bytes()[:4], i, chain[i].Number, chain[i].Hash().Bytes()[:4], chain[i].ParentHash[:4])\n\t\t}\n\t}\n\n\t// Generate the list of seal verification requests, and start the parallel verifier\n\tseals := make([]bool, len(chain))\n\tfor i := 0; i < len(seals)/checkFreq; i++ {\n\t\tindex := i*checkFreq + hc.rand.Intn(checkFreq)\n\t\tif index >= len(seals) {\n\t\t\tindex = len(seals) - 1\n\t\t}\n\t\tseals[index] = true\n\t}\n\tseals[len(seals)-1] = true // Last should always be verified to avoid junk\n\n\tabort, results := hc.engine.VerifyHeaders(hc, chain, seals)\n\tdefer close(abort)\n\n\t// Iterate over the headers and ensure they all check out\n\tfor i := range chain {\n\t\t// If the chain is terminating, stop processing blocks\n\t\tif hc.procInterrupt() {\n\t\t\tlog.Debug(\"Premature abort during headers verification\")\n\t\t\treturn 0, errors.New(\"aborted\")\n\t\t}\n\t\t// Otherwise wait for headers checks and ensure they pass\n\t\tif err := <-results; err != nil {\n\t\t\treturn i, err\n\t\t}\n\t}\n\n\treturn 0, nil\n}\n\n// InsertHeaderChain attempts to insert the given header chain in to the local\n// chain, possibly creating a reorg. If an error is returned, it will return the\n// index number of the failing header as well an error describing what went wrong.\n//\n// The verify parameter can be used to fine tune whether nonce verification\n// should be done or not. The reason behind the optional check is because some\n// of the header retrieval mechanisms already need to verfy nonces, as well as\n// because nonces can be verified sparsely, not needing to check each.\nfunc (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCallback, start time.Time) (int, error) {\n\t// Collect some import statistics to report on\n\tstats := struct{ processed, ignored int }{}\n\t// All headers passed verification, import them into the database\n\tfor i, header := range chain {\n\t\t// Short circuit insertion if shutting down\n\t\tif hc.procInterrupt() {\n\t\t\tlog.Debug(\"Premature abort during headers import\")\n\t\t\treturn i, errors.New(\"aborted\")\n\t\t}\n\t\t// If the header's already known, skip it, otherwise store\n\t\tif hc.HasHeader(header.Hash(), header.Number.Uint64()) {\n\t\t\tstats.ignored++\n\t\t\tcontinue\n\t\t}\n\t\tif err := writeHeader(header); err != nil {\n\t\t\treturn i, err\n\t\t}\n\t\tstats.processed++\n\t}\n\t// Report some public statistics so the user has a clue what's going on\n\tlast := chain[len(chain)-1]\n\tlog.Info(\"Imported new block headers\", \"count\", stats.processed, \"elapsed\", common.PrettyDuration(time.Since(start)),\n\t\t\"number\", last.Number, \"hash\", last.Hash(), \"ignored\", stats.ignored)\n\n\treturn 0, nil\n}\n\n// GetBlockHashesFromHash retrieves a number of block hashes starting at a given\n// hash, fetching towards the genesis block.\nfunc (hc *HeaderChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash {\n\t// Get the origin header from which to fetch\n\theader := hc.GetHeaderByHash(hash)\n\tif header == nil {\n\t\treturn nil\n\t}\n\t// Iterate the headers until enough is collected or the genesis reached\n\tchain := make([]common.Hash, 0, max)\n\tfor i := uint64(0); i < max; i++ {\n\t\tnext := header.ParentHash\n\t\tif header = hc.GetHeader(next, header.Number.Uint64()-1); header == nil {\n\t\t\tbreak\n\t\t}\n\t\tchain = append(chain, next)\n\t\tif header.Number.Sign() == 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn chain\n}\n\n// GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or\n// a close ancestor of it is canonical. maxNonCanonical points to a downwards counter limiting the\n// number of blocks to be individually checked before we reach the canonical chain.\n//\n// Note: ancestor == 0 returns the same block, 1 returns its parent and so on.\nfunc (hc *HeaderChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) {\n\tif ancestor > number {\n\t\treturn common.Hash{}, 0\n\t}\n\tif ancestor == 1 {\n\t\t// in this case it is cheaper to just read the header\n\t\tif header := hc.GetHeader(hash, number); header != nil {\n\t\t\treturn header.ParentHash, number - 1\n\t\t} else {\n\t\t\treturn common.Hash{}, 0\n\t\t}\n\t}\n\tfor ancestor != 0 {\n\t\tif rawdb.ReadCanonicalHash(hc.chainDb, number) == hash {\n\t\t\tnumber -= ancestor\n\t\t\treturn rawdb.ReadCanonicalHash(hc.chainDb, number), number\n\t\t}\n\t\tif *maxNonCanonical == 0 {\n\t\t\treturn common.Hash{}, 0\n\t\t}\n\t\t*maxNonCanonical--\n\t\tancestor--\n\t\theader := hc.GetHeader(hash, number)\n\t\tif header == nil {\n\t\t\treturn common.Hash{}, 0\n\t\t}\n\t\thash = header.ParentHash\n\t\tnumber--\n\t}\n\treturn hash, number\n}\n\n// GetTd retrieves a block's total difficulty in the canonical chain from the\n// database by hash and number, caching it if found.\nfunc (hc *HeaderChain) GetTd(hash common.Hash, number uint64) *big.Int {\n\t// Short circuit if the td's already in the cache, retrieve otherwise\n\tif cached, ok := hc.tdCache.Get(hash); ok {\n\t\treturn cached.(*big.Int)\n\t}\n\ttd := rawdb.ReadTd(hc.chainDb, hash, number)\n\tif td == nil {\n\t\treturn nil\n\t}\n\t// Cache the found body for next time and return\n\thc.tdCache.Add(hash, td)\n\treturn td\n}\n\n// GetTdByHash retrieves a block's total difficulty in the canonical chain from the\n// database by hash, caching it if found.\nfunc (hc *HeaderChain) GetTdByHash(hash common.Hash) *big.Int {\n\tnumber := hc.GetBlockNumber(hash)\n\tif number == nil {\n\t\treturn nil\n\t}\n\treturn hc.GetTd(hash, *number)\n}\n\n// WriteTd stores a block's total difficulty into the database, also caching it\n// along the way.\nfunc (hc *HeaderChain) WriteTd(hash common.Hash, number uint64, td *big.Int) error {\n\trawdb.WriteTd(hc.chainDb, hash, number, td)\n\thc.tdCache.Add(hash, new(big.Int).Set(td))\n\treturn nil\n}\n\n// GetHeader retrieves a block header from the database by hash and number,\n// caching it if found.\nfunc (hc *HeaderChain) GetHeader(hash common.Hash, number uint64) *types.Header {\n\t// Short circuit if the header's already in the cache, retrieve otherwise\n\tif header, ok := hc.headerCache.Get(hash); ok {\n\t\treturn header.(*types.Header)\n\t}\n\theader := rawdb.ReadHeader(hc.chainDb, hash, number)\n\tif header == nil {\n\t\treturn nil\n\t}\n\t// Cache the found header for next time and return\n\thc.headerCache.Add(hash, header)\n\treturn header\n}\n\n// GetHeaderByHash retrieves a block header from the database by hash, caching it if\n// found.\nfunc (hc *HeaderChain) GetHeaderByHash(hash common.Hash) *types.Header {\n\tnumber := hc.GetBlockNumber(hash)\n\tif number == nil {\n\t\treturn nil\n\t}\n\treturn hc.GetHeader(hash, *number)\n}\n\n// HasHeader checks if a block header is present in the database or not.\nfunc (hc *HeaderChain) HasHeader(hash common.Hash, number uint64) bool {\n\tif hc.numberCache.Contains(hash) || hc.headerCache.Contains(hash) {\n\t\treturn true\n\t}\n\treturn rawdb.HasHeader(hc.chainDb, hash, number)\n}\n\n// GetHeaderByNumber retrieves a block header from the database by number,\n// caching it (associated with its hash) if found.\nfunc (hc *HeaderChain) GetHeaderByNumber(number uint64) *types.Header {\n\thash := rawdb.ReadCanonicalHash(hc.chainDb, number)\n\tif hash == (common.Hash{}) {\n\t\treturn nil\n\t}\n\treturn hc.GetHeader(hash, number)\n}\n\n// CurrentHeader retrieves the current head header of the canonical chain. The\n// header is retrieved from the HeaderChain's internal cache.\nfunc (hc *HeaderChain) CurrentHeader() *types.Header {\n\treturn hc.currentHeader.Load().(*types.Header)\n}\n\n// SetCurrentHeader sets the current head header of the canonical chain.\nfunc (hc *HeaderChain) SetCurrentHeader(head *types.Header) {\n\trawdb.WriteHeadHeaderHash(hc.chainDb, head.Hash())\n\n\thc.currentHeader.Store(head)\n\thc.currentHeaderHash = head.Hash()\n}\n\n// DeleteCallback is a callback function that is called by SetHead before\n// each header is deleted.\ntype DeleteCallback func(rawdb.DatabaseDeleter, common.Hash, uint64)\n\n// SetHead rewinds the local chain to a new head. Everything above the new head\n// will be deleted and the new one set.\nfunc (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback) {\n\theight := uint64(0)\n\n\tif hdr := hc.CurrentHeader(); hdr != nil {\n\t\theight = hdr.Number.Uint64()\n\t}\n\tbatch := hc.chainDb.NewBatch()\n\tfor hdr := hc.CurrentHeader(); hdr != nil && hdr.Number.Uint64() > head; hdr = hc.CurrentHeader() {\n\t\thash := hdr.Hash()\n\t\tnum := hdr.Number.Uint64()\n\t\tif delFn != nil {\n\t\t\tdelFn(batch, hash, num)\n\t\t}\n\t\trawdb.DeleteTd(batch, hash, num)\n\n\t\thc.currentHeader.Store(hc.GetHeader(hdr.ParentHash, hdr.Number.Uint64()-1))\n\t}\n\t// Roll back the canonical chain numbering\n\tfor i := height; i > head; i-- {\n\t\trawdb.DeleteCanonicalHash(batch, i)\n\t}\n\tbatch.Write()\n\n\t// Clear out any stale content from the caches\n\thc.headerCache.Purge()\n\thc.tdCache.Purge()\n\thc.numberCache.Purge()\n\n\tif hc.CurrentHeader() == nil {\n\t\thc.currentHeader.Store(hc.genesisHeader)\n\t}\n\thc.currentHeaderHash = hc.CurrentHeader().Hash()\n\n\trawdb.WriteHeadHeaderHash(hc.chainDb, hc.currentHeaderHash)\n}\n\n// SetGenesis sets a new genesis block header for the chain\nfunc (hc *HeaderChain) SetGenesis(head *types.Header) {\n\thc.genesisHeader = head\n}\n\n// Config retrieves the header chain's chain configuration.\nfunc (hc *HeaderChain) Config() *params.ChainConfig { return hc.config }\n\n// Engine retrieves the header chain's consensus engine.\nfunc (hc *HeaderChain) Engine() consensus.Engine { return hc.engine }\n\n// GetBlock implements consensus.ChainReader, and returns nil for every input as\n// a header chain does not have blocks available for retrieval.\nfunc (hc *HeaderChain) GetBlock(hash common.Hash, number uint64) *types.Block {\n\treturn nil\n}\n"
  },
  {
    "path": "core/mkalloc.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build none\n\n/*\n\n   The mkalloc tool creates the genesis allocation constants in genesis_alloc.go\n   It outputs a const declaration that contains an RLP-encoded list of (address, balance) tuples.\n\n       go run mkalloc.go genesis.json\n\n*/\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"os\"\n\t\"sort\"\n\t\"strconv\"\n\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype allocItem struct{ Addr, Balance *big.Int }\n\ntype allocList []allocItem\n\nfunc (a allocList) Len() int           { return len(a) }\nfunc (a allocList) Less(i, j int) bool { return a[i].Addr.Cmp(a[j].Addr) < 0 }\nfunc (a allocList) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }\n\nfunc makelist(g *core.Genesis) allocList {\n\ta := make(allocList, 0, len(g.Alloc))\n\tfor addr, account := range g.Alloc {\n\t\tif len(account.Storage) > 0 || len(account.Code) > 0 || account.Nonce != 0 {\n\t\t\tpanic(fmt.Sprintf(\"can't encode account %x\", addr))\n\t\t}\n\t\ta = append(a, allocItem{addr.Big(), account.Balance})\n\t}\n\tsort.Sort(a)\n\treturn a\n}\n\nfunc makealloc(g *core.Genesis) string {\n\ta := makelist(g)\n\tdata, err := rlp.EncodeToBytes(a)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn strconv.QuoteToASCII(string(data))\n}\n\nfunc main() {\n\tif len(os.Args) != 2 {\n\t\tfmt.Fprintln(os.Stderr, \"Usage: mkalloc genesis.json\")\n\t\tos.Exit(1)\n\t}\n\n\tg := new(core.Genesis)\n\tfile, err := os.Open(os.Args[1])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif err := json.NewDecoder(file).Decode(g); err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"const allocData =\", makealloc(g))\n}\n"
  },
  {
    "path": "core/rawdb/accessors_chain.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rawdb\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// ReadCanonicalHash retrieves the hash assigned to a canonical block number.\nfunc ReadCanonicalHash(db DatabaseReader, number uint64) common.Hash {\n\tdata, _ := db.Get(headerHashKey(number))\n\tif len(data) == 0 {\n\t\treturn common.Hash{}\n\t}\n\treturn common.BytesToHash(data)\n}\n\n// WriteCanonicalHash stores the hash assigned to a canonical block number.\nfunc WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) {\n\tif err := db.Put(headerHashKey(number), hash.Bytes()); err != nil {\n\t\tlog.Crit(\"Failed to store number to hash mapping\", \"err\", err)\n\t}\n}\n\n// DeleteCanonicalHash removes the number to hash canonical mapping.\nfunc DeleteCanonicalHash(db DatabaseDeleter, number uint64) {\n\tif err := db.Delete(headerHashKey(number)); err != nil {\n\t\tlog.Crit(\"Failed to delete number to hash mapping\", \"err\", err)\n\t}\n}\n\n// ReadHeaderNumber returns the header number assigned to a hash.\nfunc ReadHeaderNumber(db DatabaseReader, hash common.Hash) *uint64 {\n\tdata, _ := db.Get(headerNumberKey(hash))\n\tif len(data) != 8 {\n\t\treturn nil\n\t}\n\tnumber := binary.BigEndian.Uint64(data)\n\treturn &number\n}\n\n// ReadHeadHeaderHash retrieves the hash of the current canonical head header.\nfunc ReadHeadHeaderHash(db DatabaseReader) common.Hash {\n\tdata, _ := db.Get(headHeaderKey)\n\tif len(data) == 0 {\n\t\treturn common.Hash{}\n\t}\n\treturn common.BytesToHash(data)\n}\n\n// WriteHeadHeaderHash stores the hash of the current canonical head header.\nfunc WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) {\n\tif err := db.Put(headHeaderKey, hash.Bytes()); err != nil {\n\t\tlog.Crit(\"Failed to store last header's hash\", \"err\", err)\n\t}\n}\n\n// ReadHeadBlockHash retrieves the hash of the current canonical head block.\nfunc ReadHeadBlockHash(db DatabaseReader) common.Hash {\n\tdata, _ := db.Get(headBlockKey)\n\tif len(data) == 0 {\n\t\treturn common.Hash{}\n\t}\n\treturn common.BytesToHash(data)\n}\n\n// WriteHeadBlockHash stores the head block's hash.\nfunc WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) {\n\tif err := db.Put(headBlockKey, hash.Bytes()); err != nil {\n\t\tlog.Crit(\"Failed to store last block's hash\", \"err\", err)\n\t}\n}\n\n// ReadHeadFastBlockHash retrieves the hash of the current fast-sync head block.\nfunc ReadHeadFastBlockHash(db DatabaseReader) common.Hash {\n\tdata, _ := db.Get(headFastBlockKey)\n\tif len(data) == 0 {\n\t\treturn common.Hash{}\n\t}\n\treturn common.BytesToHash(data)\n}\n\n// WriteHeadFastBlockHash stores the hash of the current fast-sync head block.\nfunc WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) {\n\tif err := db.Put(headFastBlockKey, hash.Bytes()); err != nil {\n\t\tlog.Crit(\"Failed to store last fast block's hash\", \"err\", err)\n\t}\n}\n\n// ReadFastTrieProgress retrieves the number of tries nodes fast synced to allow\n// reporting correct numbers across restarts.\nfunc ReadFastTrieProgress(db DatabaseReader) uint64 {\n\tdata, _ := db.Get(fastTrieProgressKey)\n\tif len(data) == 0 {\n\t\treturn 0\n\t}\n\treturn new(big.Int).SetBytes(data).Uint64()\n}\n\n// WriteFastTrieProgress stores the fast sync trie process counter to support\n// retrieving it across restarts.\nfunc WriteFastTrieProgress(db DatabaseWriter, count uint64) {\n\tif err := db.Put(fastTrieProgressKey, new(big.Int).SetUint64(count).Bytes()); err != nil {\n\t\tlog.Crit(\"Failed to store fast sync trie progress\", \"err\", err)\n\t}\n}\n\n// ReadHeaderRLP retrieves a block header in its raw RLP database encoding.\nfunc ReadHeaderRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue {\n\tdata, _ := db.Get(headerKey(number, hash))\n\treturn data\n}\n\n// HasHeader verifies the existence of a block header corresponding to the hash.\nfunc HasHeader(db DatabaseReader, hash common.Hash, number uint64) bool {\n\tif has, err := db.Has(headerKey(number, hash)); !has || err != nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// ReadHeader retrieves the block header corresponding to the hash.\nfunc ReadHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Header {\n\tdata := ReadHeaderRLP(db, hash, number)\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\theader := new(types.Header)\n\tif err := rlp.Decode(bytes.NewReader(data), header); err != nil {\n\t\tlog.Error(\"Invalid block header RLP\", \"hash\", hash, \"err\", err)\n\t\treturn nil\n\t}\n\treturn header\n}\n\n// WriteHeader stores a block header into the database and also stores the hash-\n// to-number mapping.\nfunc WriteHeader(db DatabaseWriter, header *types.Header) {\n\t// Write the hash -> number mapping\n\tvar (\n\t\thash    = header.Hash()\n\t\tnumber  = header.Number.Uint64()\n\t\tencoded = encodeBlockNumber(number)\n\t)\n\tkey := headerNumberKey(hash)\n\tif err := db.Put(key, encoded); err != nil {\n\t\tlog.Crit(\"Failed to store hash to number mapping\", \"err\", err)\n\t}\n\t// Write the encoded header\n\tdata, err := rlp.EncodeToBytes(header)\n\tif err != nil {\n\t\tlog.Crit(\"Failed to RLP encode header\", \"err\", err)\n\t}\n\tkey = headerKey(number, hash)\n\tif err := db.Put(key, data); err != nil {\n\t\tlog.Crit(\"Failed to store header\", \"err\", err)\n\t}\n}\n\n// DeleteHeader removes all block header data associated with a hash.\nfunc DeleteHeader(db DatabaseDeleter, hash common.Hash, number uint64) {\n\tif err := db.Delete(headerKey(number, hash)); err != nil {\n\t\tlog.Crit(\"Failed to delete header\", \"err\", err)\n\t}\n\tif err := db.Delete(headerNumberKey(hash)); err != nil {\n\t\tlog.Crit(\"Failed to delete hash to number mapping\", \"err\", err)\n\t}\n}\n\n// ReadBodyRLP retrieves the block body (transactions) in RLP encoding.\nfunc ReadBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue {\n\tdata, _ := db.Get(blockBodyKey(number, hash))\n\treturn data\n}\n\n// WriteBodyRLP stores an RLP encoded block body into the database.\nfunc WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.RawValue) {\n\tif err := db.Put(blockBodyKey(number, hash), rlp); err != nil {\n\t\tlog.Crit(\"Failed to store block body\", \"err\", err)\n\t}\n}\n\n// HasBody verifies the existence of a block body corresponding to the hash.\nfunc HasBody(db DatabaseReader, hash common.Hash, number uint64) bool {\n\tif has, err := db.Has(blockBodyKey(number, hash)); !has || err != nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// ReadBody retrieves the block body corresponding to the hash.\nfunc ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body {\n\tdata := ReadBodyRLP(db, hash, number)\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\tbody := new(types.Body)\n\tif err := rlp.Decode(bytes.NewReader(data), body); err != nil {\n\t\tlog.Error(\"Invalid block body RLP\", \"hash\", hash, \"err\", err)\n\t\treturn nil\n\t}\n\treturn body\n}\n\n// WriteBody storea a block body into the database.\nfunc WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.Body) {\n\tdata, err := rlp.EncodeToBytes(body)\n\tif err != nil {\n\t\tlog.Crit(\"Failed to RLP encode body\", \"err\", err)\n\t}\n\tWriteBodyRLP(db, hash, number, data)\n}\n\n// DeleteBody removes all block body data associated with a hash.\nfunc DeleteBody(db DatabaseDeleter, hash common.Hash, number uint64) {\n\tif err := db.Delete(blockBodyKey(number, hash)); err != nil {\n\t\tlog.Crit(\"Failed to delete block body\", \"err\", err)\n\t}\n}\n\n// ReadTd retrieves a block's total difficulty corresponding to the hash.\nfunc ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int {\n\tdata, _ := db.Get(headerTDKey(number, hash))\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\ttd := new(big.Int)\n\tif err := rlp.Decode(bytes.NewReader(data), td); err != nil {\n\t\tlog.Error(\"Invalid block total difficulty RLP\", \"hash\", hash, \"err\", err)\n\t\treturn nil\n\t}\n\treturn td\n}\n\n// WriteTd stores the total difficulty of a block into the database.\nfunc WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) {\n\tdata, err := rlp.EncodeToBytes(td)\n\tif err != nil {\n\t\tlog.Crit(\"Failed to RLP encode block total difficulty\", \"err\", err)\n\t}\n\tif err := db.Put(headerTDKey(number, hash), data); err != nil {\n\t\tlog.Crit(\"Failed to store block total difficulty\", \"err\", err)\n\t}\n}\n\n// DeleteTd removes all block total difficulty data associated with a hash.\nfunc DeleteTd(db DatabaseDeleter, hash common.Hash, number uint64) {\n\tif err := db.Delete(headerTDKey(number, hash)); err != nil {\n\t\tlog.Crit(\"Failed to delete block total difficulty\", \"err\", err)\n\t}\n}\n\ntype StateRecepipts struct {\n\tReceipts []*types.ReceiptForStorage\n\tStates   []byte\n}\n\n// ReadReceipts retrieves all the transaction receipts belonging to a block.\nfunc ReadReceipts(db DatabaseReader, hash common.Hash, number uint64) types.Receipts {\n\t// Retrieve the flattened receipt slice\n\tdata, _ := db.Get(blockReceiptsKey(number, hash))\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\t// Convert the revceipts from their storage form to their internal representation\n\tstorageReceipts := StateRecepipts{}\n\tif err := rlp.DecodeBytes(data, &storageReceipts); err != nil {\n\t\tlog.Error(\"Invalid receipt array RLP\", \"hash\", hash, \"err\", err)\n\t\treturn nil\n\t}\n\treceipts := make(types.Receipts, len(storageReceipts.Receipts))\n\tfor i, receipt := range storageReceipts.Receipts {\n\t\treceipts[i] = (*types.Receipt)(receipt)\n\t\treceipts[i].Status = uint64(storageReceipts.States[i])\n\t}\n\treturn receipts\n}\n\n// WriteReceipts stores all the transaction receipts belonging to a block.\nfunc WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts types.Receipts) {\n\t// Convert the receipts into their storage form and serialize them\n\tstorageReceipts := make([]*types.ReceiptForStorage, len(receipts))\n\tstates := make([]byte, len(receipts))\n\tfor i, receipt := range receipts {\n\t\tstorageReceipts[i] = (*types.ReceiptForStorage)(receipt)\n\t\tstates[i] = byte(receipt.Status)\n\t}\n\n\tbytes, err := rlp.EncodeToBytes(StateRecepipts{storageReceipts, states})\n\tif err != nil {\n\t\tlog.Crit(\"Failed to encode block receipts\", \"err\", err)\n\t}\n\t// Store the flattened receipt slice\n\tif err := db.Put(blockReceiptsKey(number, hash), bytes); err != nil {\n\t\tlog.Crit(\"Failed to store block receipts\", \"err\", err)\n\t}\n}\n\n// DeleteReceipts removes all receipt data associated with a block hash.\nfunc DeleteReceipts(db DatabaseDeleter, hash common.Hash, number uint64) {\n\tif err := db.Delete(blockReceiptsKey(number, hash)); err != nil {\n\t\tlog.Crit(\"Failed to delete block receipts\", \"err\", err)\n\t}\n}\n\n// ReadBlock retrieves an entire block corresponding to the hash, assembling it\n// back from the stored header and body. If either the header or body could not\n// be retrieved nil is returned.\n//\n// Note, due to concurrent download of header and block body the header and thus\n// canonical hash can be stored in the database but the body data not (yet).\nfunc ReadBlock(db DatabaseReader, hash common.Hash, number uint64) *types.Block {\n\theader := ReadHeader(db, hash, number)\n\tif header == nil {\n\t\treturn nil\n\t}\n\tbody := ReadBody(db, hash, number)\n\tif body == nil {\n\t\treturn nil\n\t}\n\treturn types.NewBlockWithHeader(header).WithBody(body.Transactions)\n}\n\n// WriteBlock serializes a block into the database, header and body separately.\nfunc WriteBlock(db DatabaseWriter, block *types.Block) {\n\tWriteBody(db, block.Hash(), block.NumberU64(), block.Body())\n\tWriteHeader(db, block.Header())\n\n}\n\n// DeleteBlock removes all block data associated with a hash.\nfunc DeleteBlock(db DatabaseDeleter, hash common.Hash, number uint64) {\n\tDeleteReceipts(db, hash, number)\n\tDeleteHeader(db, hash, number)\n\tDeleteBody(db, hash, number)\n\tDeleteTd(db, hash, number)\n}\n\n// FindCommonAncestor returns the last common ancestor of two block headers\nfunc FindCommonAncestor(db DatabaseReader, a, b *types.Header) *types.Header {\n\tfor bn := b.Number.Uint64(); a.Number.Uint64() > bn; {\n\t\ta = ReadHeader(db, a.ParentHash, a.Number.Uint64()-1)\n\t\tif a == nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\tfor an := a.Number.Uint64(); an < b.Number.Uint64(); {\n\t\tb = ReadHeader(db, b.ParentHash, b.Number.Uint64()-1)\n\t\tif b == nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\tfor a.Hash() != b.Hash() {\n\t\ta = ReadHeader(db, a.ParentHash, a.Number.Uint64()-1)\n\t\tif a == nil {\n\t\t\treturn nil\n\t\t}\n\t\tb = ReadHeader(db, b.ParentHash, b.Number.Uint64()-1)\n\t\tif b == nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn a\n}\n"
  },
  {
    "path": "core/rawdb/accessors_chain_test.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rawdb\n\nimport (\n\t\"bytes\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Tests block header storage and retrieval operations.\nfunc TestHeaderStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\n\t// Create a test header to move around the database and make sure it's really new\n\theader := &types.Header{Number: big.NewInt(42), Extra: []byte(\"test header\")}\n\tif entry := ReadHeader(db, header.Hash(), header.Number.Uint64()); entry != nil {\n\t\tt.Fatalf(\"Non existent header returned: %v\", entry)\n\t}\n\t// Write and verify the header in the database\n\tWriteHeader(db, header)\n\tif entry := ReadHeader(db, header.Hash(), header.Number.Uint64()); entry == nil {\n\t\tt.Fatalf(\"Stored header not found\")\n\t} else if entry.Hash() != header.Hash() {\n\t\tt.Fatalf(\"Retrieved header mismatch: have %v, want %v\", entry, header)\n\t}\n\tif entry := ReadHeaderRLP(db, header.Hash(), header.Number.Uint64()); entry == nil {\n\t\tt.Fatalf(\"Stored header RLP not found\")\n\t} else {\n\t\thasher := sha3.NewKeccak256()\n\t\thasher.Write(entry)\n\n\t\tif hash := common.BytesToHash(hasher.Sum(nil)); hash != header.Hash() {\n\t\t\tt.Fatalf(\"Retrieved RLP header mismatch: have %v, want %v\", entry, header)\n\t\t}\n\t}\n\t// Delete the header and verify the execution\n\tDeleteHeader(db, header.Hash(), header.Number.Uint64())\n\tif entry := ReadHeader(db, header.Hash(), header.Number.Uint64()); entry != nil {\n\t\tt.Fatalf(\"Deleted header returned: %v\", entry)\n\t}\n}\n\n// Tests block body storage and retrieval operations.\nfunc TestBodyStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\n\t// Create a test body to move around the database and make sure it's really new\n\tbody := &types.Body{}\n\n\thasher := sha3.NewKeccak256()\n\trlp.Encode(hasher, body)\n\thash := common.BytesToHash(hasher.Sum(nil))\n\n\tif entry := ReadBody(db, hash, 0); entry != nil {\n\t\tt.Fatalf(\"Non existent body returned: %v\", entry)\n\t}\n\t// Write and verify the body in the database\n\tWriteBody(db, hash, 0, body)\n\tif entry := ReadBody(db, hash, 0); entry == nil {\n\t\tt.Fatalf(\"Stored body not found\")\n\t} else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(types.Transactions(body.Transactions)) {\n\t\tt.Fatalf(\"Retrieved body mismatch: have %v, want %v\", entry, body)\n\t}\n\tif entry := ReadBodyRLP(db, hash, 0); entry == nil {\n\t\tt.Fatalf(\"Stored body RLP not found\")\n\t} else {\n\t\thasher := sha3.NewKeccak256()\n\t\thasher.Write(entry)\n\n\t\tif calc := common.BytesToHash(hasher.Sum(nil)); calc != hash {\n\t\t\tt.Fatalf(\"Retrieved RLP body mismatch: have %v, want %v\", entry, body)\n\t\t}\n\t}\n\t// Delete the body and verify the execution\n\tDeleteBody(db, hash, 0)\n\tif entry := ReadBody(db, hash, 0); entry != nil {\n\t\tt.Fatalf(\"Deleted body returned: %v\", entry)\n\t}\n}\n\n// Tests block storage and retrieval operations.\nfunc TestBlockStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\n\t// Create a test block to move around the database and make sure it's really new\n\tblock := types.NewBlockWithHeader(&types.Header{\n\t\tExtra:       []byte(\"test block\"),\n\t\tTxHash:      types.EmptyRootHash,\n\t\tReceiptHash: types.EmptyRootHash,\n\t})\n\tif entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Non existent block returned: %v\", entry)\n\t}\n\tif entry := ReadHeader(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Non existent header returned: %v\", entry)\n\t}\n\tif entry := ReadBody(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Non existent body returned: %v\", entry)\n\t}\n\t// Write and verify the block in the database\n\tWriteBlock(db, block)\n\tif entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry == nil {\n\t\tt.Fatalf(\"Stored block not found\")\n\t} else if entry.Hash() != block.Hash() {\n\t\tt.Fatalf(\"Retrieved block mismatch: have %v, want %v\", entry, block)\n\t}\n\tif entry := ReadHeader(db, block.Hash(), block.NumberU64()); entry == nil {\n\t\tt.Fatalf(\"Stored header not found\")\n\t} else if entry.Hash() != block.Header().Hash() {\n\t\tt.Fatalf(\"Retrieved header mismatch: have %v, want %v\", entry, block.Header())\n\t}\n\tif entry := ReadBody(db, block.Hash(), block.NumberU64()); entry == nil {\n\t\tt.Fatalf(\"Stored body not found\")\n\t} else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(block.Transactions()) {\n\t\tt.Fatalf(\"Retrieved body mismatch: have %v, want %v\", entry, block.Body())\n\t}\n\t// Delete the block and verify the execution\n\tDeleteBlock(db, block.Hash(), block.NumberU64())\n\tif entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Deleted block returned: %v\", entry)\n\t}\n\tif entry := ReadHeader(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Deleted header returned: %v\", entry)\n\t}\n\tif entry := ReadBody(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Deleted body returned: %v\", entry)\n\t}\n}\n\n// Tests that partial block contents don't get reassembled into full blocks.\nfunc TestPartialBlockStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\tblock := types.NewBlockWithHeader(&types.Header{\n\t\tExtra:       []byte(\"test block\"),\n\t\tTxHash:      types.EmptyRootHash,\n\t\tReceiptHash: types.EmptyRootHash,\n\t})\n\t// Store a header and check that it's not recognized as a block\n\tWriteHeader(db, block.Header())\n\tif entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Non existent block returned: %v\", entry)\n\t}\n\tDeleteHeader(db, block.Hash(), block.NumberU64())\n\n\t// Store a body and check that it's not recognized as a block\n\tWriteBody(db, block.Hash(), block.NumberU64(), block.Body())\n\tif entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry != nil {\n\t\tt.Fatalf(\"Non existent block returned: %v\", entry)\n\t}\n\tDeleteBody(db, block.Hash(), block.NumberU64())\n\n\t// Store a header and a body separately and check reassembly\n\tWriteHeader(db, block.Header())\n\tWriteBody(db, block.Hash(), block.NumberU64(), block.Body())\n\n\tif entry := ReadBlock(db, block.Hash(), block.NumberU64()); entry == nil {\n\t\tt.Fatalf(\"Stored block not found\")\n\t} else if entry.Hash() != block.Hash() {\n\t\tt.Fatalf(\"Retrieved block mismatch: have %v, want %v\", entry, block)\n\t}\n}\n\n// Tests block total difficulty storage and retrieval operations.\nfunc TestTdStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\n\t// Create a test TD to move around the database and make sure it's really new\n\thash, td := common.Hash{}, big.NewInt(314)\n\tif entry := ReadTd(db, hash, 0); entry != nil {\n\t\tt.Fatalf(\"Non existent TD returned: %v\", entry)\n\t}\n\t// Write and verify the TD in the database\n\tWriteTd(db, hash, 0, td)\n\tif entry := ReadTd(db, hash, 0); entry == nil {\n\t\tt.Fatalf(\"Stored TD not found\")\n\t} else if entry.Cmp(td) != 0 {\n\t\tt.Fatalf(\"Retrieved TD mismatch: have %v, want %v\", entry, td)\n\t}\n\t// Delete the TD and verify the execution\n\tDeleteTd(db, hash, 0)\n\tif entry := ReadTd(db, hash, 0); entry != nil {\n\t\tt.Fatalf(\"Deleted TD returned: %v\", entry)\n\t}\n}\n\n// Tests that canonical numbers can be mapped to hashes and retrieved.\nfunc TestCanonicalMappingStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\n\t// Create a test canonical number and assinged hash to move around\n\thash, number := common.Hash{0: 0xff}, uint64(314)\n\tif entry := ReadCanonicalHash(db, number); entry != (common.Hash{}) {\n\t\tt.Fatalf(\"Non existent canonical mapping returned: %v\", entry)\n\t}\n\t// Write and verify the TD in the database\n\tWriteCanonicalHash(db, hash, number)\n\tif entry := ReadCanonicalHash(db, number); entry == (common.Hash{}) {\n\t\tt.Fatalf(\"Stored canonical mapping not found\")\n\t} else if entry != hash {\n\t\tt.Fatalf(\"Retrieved canonical mapping mismatch: have %v, want %v\", entry, hash)\n\t}\n\t// Delete the TD and verify the execution\n\tDeleteCanonicalHash(db, number)\n\tif entry := ReadCanonicalHash(db, number); entry != (common.Hash{}) {\n\t\tt.Fatalf(\"Deleted canonical mapping returned: %v\", entry)\n\t}\n}\n\n// Tests that head headers and head blocks can be assigned, individually.\nfunc TestHeadStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\n\tblockHead := types.NewBlockWithHeader(&types.Header{Extra: []byte(\"test block header\")})\n\tblockFull := types.NewBlockWithHeader(&types.Header{Extra: []byte(\"test block full\")})\n\tblockFast := types.NewBlockWithHeader(&types.Header{Extra: []byte(\"test block fast\")})\n\n\t// Check that no head entries are in a pristine database\n\tif entry := ReadHeadHeaderHash(db); entry != (common.Hash{}) {\n\t\tt.Fatalf(\"Non head header entry returned: %v\", entry)\n\t}\n\tif entry := ReadHeadBlockHash(db); entry != (common.Hash{}) {\n\t\tt.Fatalf(\"Non head block entry returned: %v\", entry)\n\t}\n\tif entry := ReadHeadFastBlockHash(db); entry != (common.Hash{}) {\n\t\tt.Fatalf(\"Non fast head block entry returned: %v\", entry)\n\t}\n\t// Assign separate entries for the head header and block\n\tWriteHeadHeaderHash(db, blockHead.Hash())\n\tWriteHeadBlockHash(db, blockFull.Hash())\n\tWriteHeadFastBlockHash(db, blockFast.Hash())\n\n\t// Check that both heads are present, and different (i.e. two heads maintained)\n\tif entry := ReadHeadHeaderHash(db); entry != blockHead.Hash() {\n\t\tt.Fatalf(\"Head header hash mismatch: have %v, want %v\", entry, blockHead.Hash())\n\t}\n\tif entry := ReadHeadBlockHash(db); entry != blockFull.Hash() {\n\t\tt.Fatalf(\"Head block hash mismatch: have %v, want %v\", entry, blockFull.Hash())\n\t}\n\tif entry := ReadHeadFastBlockHash(db); entry != blockFast.Hash() {\n\t\tt.Fatalf(\"Fast head block hash mismatch: have %v, want %v\", entry, blockFast.Hash())\n\t}\n}\n\n// Tests that receipts associated with a single block can be stored and retrieved.\nfunc TestBlockReceiptStorage(t *testing.T) {\n\tdb := serodb.NewMemDatabase()\n\n\treceipt1 := &types.Receipt{\n\t\tStatus:            types.ReceiptStatusFailed,\n\t\tCumulativeGasUsed: 1,\n\t\tLogs: []*types.Log{\n\t\t\t{Address: common.BytesToAddress([]byte{0x11})},\n\t\t\t{Address: common.BytesToAddress([]byte{0x01, 0x11})},\n\t\t},\n\t\tTxHash:          common.BytesToHash([]byte{0x11, 0x11}),\n\t\tContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}),\n\t\tGasUsed:         111111,\n\t}\n\treceipt2 := &types.Receipt{\n\t\tPostState:         common.Hash{2}.Bytes(),\n\t\tCumulativeGasUsed: 2,\n\t\tLogs: []*types.Log{\n\t\t\t{Address: common.BytesToAddress([]byte{0x22})},\n\t\t\t{Address: common.BytesToAddress([]byte{0x02, 0x22})},\n\t\t},\n\t\tTxHash:          common.BytesToHash([]byte{0x22, 0x22}),\n\t\tContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}),\n\t\tGasUsed:         222222,\n\t}\n\treceipts := []*types.Receipt{receipt1, receipt2}\n\n\t// Check that no receipt entries are in a pristine database\n\thash := common.BytesToHash([]byte{0x03, 0x14})\n\tif rs := ReadReceipts(db, hash, 0); len(rs) != 0 {\n\t\tt.Fatalf(\"non existent receipts returned: %v\", rs)\n\t}\n\t// Insert the receipt slice into the database and check presence\n\tWriteReceipts(db, hash, 0, receipts)\n\tif rs := ReadReceipts(db, hash, 0); len(rs) == 0 {\n\t\tt.Fatalf(\"no receipts returned\")\n\t} else {\n\t\tfor i := 0; i < len(receipts); i++ {\n\t\t\trlpHave, _ := rlp.EncodeToBytes(rs[i])\n\t\t\trlpWant, _ := rlp.EncodeToBytes(receipts[i])\n\n\t\t\tif !bytes.Equal(rlpHave, rlpWant) {\n\t\t\t\tt.Fatalf(\"receipt #%d: receipt mismatch: have %v, want %v\", i, rs[i], receipts[i])\n\t\t\t}\n\t\t}\n\t}\n\t// Delete the receipt slice and check purge\n\tDeleteReceipts(db, hash, 0)\n\tif rs := ReadReceipts(db, hash, 0); len(rs) != 0 {\n\t\tt.Fatalf(\"deleted receipts returned: %v\", rs)\n\t}\n}\n"
  },
  {
    "path": "core/rawdb/accessors_indexes.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rawdb\n\nimport (\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// ReadTxLookupEntry retrieves the positional metadata associated with a transaction\n// hash to allow retrieving the transaction or receipt by hash.\nfunc ReadTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64, uint64) {\n\tdata, _ := db.Get(txLookupKey(hash))\n\tif len(data) == 0 {\n\t\treturn common.Hash{}, 0, 0\n\t}\n\tvar entry TxLookupEntry\n\tif err := rlp.DecodeBytes(data, &entry); err != nil {\n\t\tlog.Error(\"Invalid transaction lookup entry RLP\", \"hash\", hash, \"err\", err)\n\t\treturn common.Hash{}, 0, 0\n\t}\n\treturn entry.BlockHash, entry.BlockIndex, entry.Index\n}\n\n// WriteTxLookupEntries stores a positional metadata for every transaction from\n// a block, enabling hash based transaction and receipt lookups.\nfunc WriteTxLookupEntries(db DatabaseWriter, block *types.Block) {\n\tfor i, tx := range block.Transactions() {\n\t\tentry := TxLookupEntry{\n\t\t\tBlockHash:  block.Hash(),\n\t\t\tBlockIndex: block.NumberU64(),\n\t\t\tIndex:      uint64(i),\n\t\t}\n\t\tdata, err := rlp.EncodeToBytes(entry)\n\t\tif err != nil {\n\t\t\tlog.Crit(\"Failed to encode transaction lookup entry\", \"err\", err)\n\t\t}\n\t\tif err := db.Put(txLookupKey(tx.Hash()), data); err != nil {\n\t\t\tlog.Crit(\"Failed to store transaction lookup entry\", \"err\", err)\n\t\t}\n\t}\n}\n\n// DeleteTxLookupEntry removes all transaction data associated with a hash.\nfunc DeleteTxLookupEntry(db DatabaseDeleter, hash common.Hash) {\n\tdb.Delete(txLookupKey(hash))\n}\n\n// ReadTransaction retrieves a specific transaction from the database, along with\n// its added positional metadata.\nfunc ReadTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) {\n\tblockHash, blockNumber, txIndex := ReadTxLookupEntry(db, hash)\n\tif blockHash == (common.Hash{}) {\n\t\treturn nil, common.Hash{}, 0, 0\n\t}\n\tbody := ReadBody(db, blockHash, blockNumber)\n\tif body == nil || len(body.Transactions) <= int(txIndex) {\n\t\tlog.Error(\"Transaction referenced missing\", \"number\", blockNumber, \"hash\", blockHash, \"index\", txIndex)\n\t\treturn nil, common.Hash{}, 0, 0\n\t}\n\treturn body.Transactions[txIndex], blockHash, blockNumber, txIndex\n}\n\n// ReadReceipt retrieves a specific transaction receipt from the database, along with\n// its added positional metadata.\nfunc ReadReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) {\n\tblockHash, blockNumber, receiptIndex := ReadTxLookupEntry(db, hash)\n\tif blockHash == (common.Hash{}) {\n\t\treturn nil, common.Hash{}, 0, 0\n\t}\n\treceipts := ReadReceipts(db, blockHash, blockNumber)\n\tif len(receipts) <= int(receiptIndex) {\n\t\tlog.Error(\"Receipt refereced missing\", \"number\", blockNumber, \"hash\", blockHash, \"index\", receiptIndex)\n\t\treturn nil, common.Hash{}, 0, 0\n\t}\n\treturn receipts[receiptIndex], blockHash, blockNumber, receiptIndex\n}\n\n// ReadBloomBits retrieves the compressed bloom bit vector belonging to the given\n// section and bit index from the.\nfunc ReadBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) ([]byte, error) {\n\treturn db.Get(bloomBitsKey(bit, section, head))\n}\n\n// WriteBloomBits stores the compressed bloom bits vector belonging to the given\n// section and bit index.\nfunc WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) {\n\tif err := db.Put(bloomBitsKey(bit, section, head), bits); err != nil {\n\t\tlog.Crit(\"Failed to store bloom bits\", \"err\", err)\n\t}\n}\n"
  },
  {
    "path": "core/rawdb/accessors_metadata.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rawdb\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// ReadDatabaseVersion retrieves the version number of the database.\nfunc ReadDatabaseVersion(db DatabaseReader) int {\n\tvar version int\n\n\tenc, _ := db.Get(databaseVerisionKey)\n\trlp.DecodeBytes(enc, &version)\n\n\treturn version\n}\n\n// WriteDatabaseVersion stores the version number of the database\nfunc WriteDatabaseVersion(db DatabaseWriter, version int) {\n\tenc, _ := rlp.EncodeToBytes(version)\n\tif err := db.Put(databaseVerisionKey, enc); err != nil {\n\t\tlog.Crit(\"Failed to store the database version\", \"err\", err)\n\t}\n}\n\n// ReadChainConfig retrieves the consensus settings based on the given genesis hash.\nfunc ReadChainConfig(db DatabaseReader, hash common.Hash) *params.ChainConfig {\n\tdata, _ := db.Get(configKey(hash))\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\tvar config params.ChainConfig\n\tif err := json.Unmarshal(data, &config); err != nil {\n\t\tlog.Error(\"Invalid chain config JSON\", \"hash\", hash, \"err\", err)\n\t\treturn nil\n\t}\n\treturn &config\n}\n\n// WriteChainConfig writes the chain config settings to the database.\nfunc WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConfig) {\n\tif cfg == nil {\n\t\treturn\n\t}\n\tdata, err := json.Marshal(cfg)\n\tif err != nil {\n\t\tlog.Crit(\"Failed to JSON encode chain config\", \"err\", err)\n\t}\n\tif err := db.Put(configKey(hash), data); err != nil {\n\t\tlog.Crit(\"Failed to store chain config\", \"err\", err)\n\t}\n}\n\n// ReadPreimage retrieves a single preimage of the provided hash.\nfunc ReadPreimage(db DatabaseReader, hash common.Hash) []byte {\n\tdata, _ := db.Get(preimageKey(hash))\n\treturn data\n}\n\n// WritePreimages writes the provided set of preimages to the database. `number` is the\n// current block number, and is used for debug messages only.\nfunc WritePreimages(db DatabaseWriter, number uint64, preimages map[common.Hash][]byte) {\n\tfor hash, preimage := range preimages {\n\t\tif err := db.Put(preimageKey(hash), preimage); err != nil {\n\t\t\tlog.Crit(\"Failed to store trie preimage\", \"err\", err)\n\t\t}\n\t}\n\tpreimageCounter.Inc(int64(len(preimages)))\n\tpreimageHitCounter.Inc(int64(len(preimages)))\n}\n"
  },
  {
    "path": "core/rawdb/interfaces.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rawdb\n\n// DatabaseReader wraps the Has and Get method of a backing data store.\ntype DatabaseReader interface {\n\tHas(key []byte) (bool, error)\n\tGet(key []byte) ([]byte, error)\n}\n\n// DatabaseWriter wraps the Put method of a backing data store.\ntype DatabaseWriter interface {\n\tPut(key []byte, value []byte) error\n}\n\n// DatabaseDeleter wraps the Delete method of a backing data store.\ntype DatabaseDeleter interface {\n\tDelete(key []byte) error\n}\n"
  },
  {
    "path": "core/rawdb/schema.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package rawdb contains a collection of low level database accessors.\npackage rawdb\n\nimport (\n\t\"encoding/binary\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\n// The fields below define the low level database schema prefixing.\nvar (\n\t// databaseVerisionKey tracks the current database version.\n\tdatabaseVerisionKey = []byte(\"DatabaseVersion\")\n\n\t// headHeaderKey tracks the latest know header's hash.\n\theadHeaderKey = []byte(\"LastHeader\")\n\n\t// headBlockKey tracks the latest know full block's hash.\n\theadBlockKey = []byte(\"LastBlock\")\n\n\t// headFastBlockKey tracks the latest known incomplete block's hash duirng fast sync.\n\theadFastBlockKey = []byte(\"LastFast\")\n\n\t// fastTrieProgressKey tracks the number of trie entries imported during fast sync.\n\tfastTrieProgressKey = []byte(\"TrieSync\")\n\n\tindexPrefix = []byte(\"indexB\")\n\t// Data item prefixes (use single byte to avoid mixing data types, avoid `i`, used for indexes).\n\theaderPrefix       = []byte(\"h\") // headerPrefix + num (uint64 big endian) + hash -> header\n\theaderTDSuffix     = []byte(\"t\") // headerPrefix + num (uint64 big endian) + hash + headerTDSuffix -> td\n\theaderHashSuffix   = []byte(\"n\") // headerPrefix + num (uint64 big endian) + headerHashSuffix -> hash\n\theaderNumberPrefix = []byte(\"H\") // headerNumberPrefix + hash -> num (uint64 big endian)\n\n\tblockBodyPrefix     = []byte(\"b\") // blockBodyPrefix + num (uint64 big endian) + hash -> block body\n\tblockReceiptsPrefix = []byte(\"r\") // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts\n\n\ttxLookupPrefix  = []byte(\"l\") // txLookupPrefix + hash -> transaction/receipt lookup metadata\n\tbloomBitsPrefix = []byte(\"B\") // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits\n\n\tpreimagePrefix = []byte(\"secure-key-\")      // preimagePrefix + hash -> preimage\n\tconfigPrefix   = []byte(\"ethereum-config-\") // config prefix for the db\n\n\t// Chain index prefixes (use `i` + single byte to avoid mixing data types).\n\tBloomBitsIndexPrefix = []byte(\"iB\") // BloomBitsIndexPrefix is the data table of a chain indexer to track its progress\n\n\tpreimageCounter    = metrics.NewRegisteredCounter(\"db/preimage/total\", nil)\n\tpreimageHitCounter = metrics.NewRegisteredCounter(\"db/preimage/hits\", nil)\n)\n\n// TxLookupEntry is a positional metadata to help looking up the data content of\n// a transaction or receipt given only its hash.\ntype TxLookupEntry struct {\n\tBlockHash  common.Hash\n\tBlockIndex uint64\n\tIndex      uint64\n}\n\n// encodeBlockNumber encodes a block number as big endian uint64\nfunc encodeBlockNumber(number uint64) []byte {\n\tenc := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(enc, number)\n\treturn enc\n}\n\nfunc indexKey(number uint64) []byte {\n\treturn append(indexPrefix, encodeBlockNumber(number)...)\n}\n\n// headerKey = headerPrefix + num (uint64 big endian) + hash\nfunc headerKey(number uint64, hash common.Hash) []byte {\n\treturn append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...)\n}\n\n// headerTDKey = headerPrefix + num (uint64 big endian) + hash + headerTDSuffix\nfunc headerTDKey(number uint64, hash common.Hash) []byte {\n\treturn append(headerKey(number, hash), headerTDSuffix...)\n}\n\n// headerHashKey = headerPrefix + num (uint64 big endian) + headerHashSuffix\nfunc headerHashKey(number uint64) []byte {\n\treturn append(append(headerPrefix, encodeBlockNumber(number)...), headerHashSuffix...)\n}\n\n// headerNumberKey = headerNumberPrefix + hash\nfunc headerNumberKey(hash common.Hash) []byte {\n\treturn append(headerNumberPrefix, hash.Bytes()...)\n}\n\n// blockBodyKey = blockBodyPrefix + num (uint64 big endian) + hash\nfunc blockBodyKey(number uint64, hash common.Hash) []byte {\n\treturn append(append(blockBodyPrefix, encodeBlockNumber(number)...), hash.Bytes()...)\n}\n\n// blockReceiptsKey = blockReceiptsPrefix + num (uint64 big endian) + hash\nfunc blockReceiptsKey(number uint64, hash common.Hash) []byte {\n\treturn append(append(blockReceiptsPrefix, encodeBlockNumber(number)...), hash.Bytes()...)\n}\n\n// txLookupKey = txLookupPrefix + hash\nfunc txLookupKey(hash common.Hash) []byte {\n\treturn append(txLookupPrefix, hash.Bytes()...)\n}\n\n// bloomBitsKey = bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash\nfunc bloomBitsKey(bit uint, section uint64, hash common.Hash) []byte {\n\tkey := append(append(bloomBitsPrefix, make([]byte, 10)...), hash.Bytes()...)\n\n\tbinary.BigEndian.PutUint16(key[1:], uint16(bit))\n\tbinary.BigEndian.PutUint64(key[3:], section)\n\n\treturn key\n}\n\n// preimageKey = preimagePrefix + hash\nfunc preimageKey(hash common.Hash) []byte {\n\treturn append(preimagePrefix, hash.Bytes()...)\n}\n\n// configKey = configPrefix + hash\nfunc configKey(hash common.Hash) []byte {\n\treturn append(configPrefix, hash.Bytes()...)\n}\n"
  },
  {
    "path": "core/state/database.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\tlru \"github.com/hashicorp/golang-lru\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\n// Trie cache generation limit after which to evict trie nodes from memory.\nvar MaxTrieCacheGen = uint16(120)\n\nconst (\n\t// Number of past tries to keep. This value is chosen such that\n\t// reasonable chain reorg depths will hit an existing trie.\n\tmaxPastTries = 12\n\n\t// Number of codehash->size associations to keep.\n\tcodeSizeCacheSize = 100000\n)\n\n// Database wraps access to tries and contract code.\ntype Database interface {\n\t// OpenTrie opens the main account trie.\n\tOpenTrie(root common.Hash) (Trie, error)\n\n\t// OpenStorageTrie opens the storage trie of an account.\n\tOpenStorageTrie(addrHash, root common.Hash) (Trie, error)\n\n\t// CopyTrie returns an independent copy of the given trie.\n\tCopyTrie(Trie) Trie\n\n\t// ContractCode retrieves a particular contract's code.\n\tContractCode(addrHash, codeHash common.Hash) ([]byte, error)\n\n\t// ContractCodeSize retrieves a particular contracts code's size.\n\tContractCodeSize(addrHash, codeHash common.Hash) (int, error)\n\n\t// TrieDB retrieves the low level trie database used for data storage.\n\tTrieDB() *trie.Database\n}\n\n// Trie is a Ethereum Merkle Trie.\ntype Trie interface {\n\tserodb.Tri\n\tCommit(onleaf trie.LeafCallback) (common.Hash, error)\n\tHash() common.Hash\n\tNodeIterator(startKey []byte) trie.NodeIterator\n\tGetKey([]byte) []byte // TODO(fjl): remove this when SecureTrie is removed\n\tProve(key []byte, fromLevel uint, proofDb serodb.Putter) error\n}\n\n// NewDatabase creates a backing store for state. The returned database is safe for\n// concurrent use and retains cached trie nodes in memory. The pool is an optional\n// intermediate trie-node memory pool between the low level storage layer and the\n// high level trie abstraction.\nfunc NewDatabase(db serodb.Database) Database {\n\tcsc, _ := lru.New(codeSizeCacheSize)\n\treturn &cachingDB{\n\t\tdb:            trie.NewDatabase(db),\n\t\tcodeSizeCache: csc,\n\t}\n}\n\ntype cachingDB struct {\n\tdb            *trie.Database\n\tmu            sync.Mutex\n\tpastTries     []*trie.SecureTrie\n\tcodeSizeCache *lru.Cache\n}\n\n// OpenTrie opens the main account trie.\nfunc (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) {\n\tdb.mu.Lock()\n\tdefer db.mu.Unlock()\n\n\tfor i := len(db.pastTries) - 1; i >= 0; i-- {\n\t\tif db.pastTries[i].Hash() == root {\n\t\t\treturn cachedTrie{db.pastTries[i].Copy(), db}, nil\n\t\t}\n\t}\n\ttr, err := trie.NewSecure(root, db.db, MaxTrieCacheGen)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn cachedTrie{tr, db}, nil\n}\n\nfunc (db *cachingDB) pushTrie(t *trie.SecureTrie) {\n\tdb.mu.Lock()\n\tdefer db.mu.Unlock()\n\n\tif len(db.pastTries) >= maxPastTries {\n\t\tcopy(db.pastTries, db.pastTries[1:])\n\t\tdb.pastTries[len(db.pastTries)-1] = t\n\t} else {\n\t\tdb.pastTries = append(db.pastTries, t)\n\t}\n}\n\n// OpenStorageTrie opens the storage trie of an account.\nfunc (db *cachingDB) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) {\n\treturn trie.NewSecure(root, db.db, 0)\n}\n\n// CopyTrie returns an independent copy of the given trie.\nfunc (db *cachingDB) CopyTrie(t Trie) Trie {\n\tswitch t := t.(type) {\n\tcase cachedTrie:\n\t\treturn cachedTrie{t.SecureTrie.Copy(), db}\n\tcase *trie.SecureTrie:\n\t\treturn t.Copy()\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unknown trie type %T\", t))\n\t}\n}\n\n// ContractCode retrieves a particular contract's code.\nfunc (db *cachingDB) ContractCode(addrHash, codeHash common.Hash) ([]byte, error) {\n\tcode, err := db.db.Node(codeHash)\n\tif err == nil {\n\t\tdb.codeSizeCache.Add(codeHash, len(code))\n\t}\n\treturn code, err\n}\n\n// ContractCodeSize retrieves a particular contracts code's size.\nfunc (db *cachingDB) ContractCodeSize(addrHash, codeHash common.Hash) (int, error) {\n\tif cached, ok := db.codeSizeCache.Get(codeHash); ok {\n\t\treturn cached.(int), nil\n\t}\n\tcode, err := db.ContractCode(addrHash, codeHash)\n\treturn len(code), err\n}\n\n// TrieDB retrieves any intermediate trie-node caching layer.\nfunc (db *cachingDB) TrieDB() *trie.Database {\n\treturn db.db\n}\n\n// cachedTrie inserts its trie into a cachingDB on commit.\ntype cachedTrie struct {\n\t*trie.SecureTrie\n\tdb *cachingDB\n}\n\nfunc (m cachedTrie) Commit(onleaf trie.LeafCallback) (common.Hash, error) {\n\troot, err := m.SecureTrie.Commit(onleaf)\n\tif err == nil {\n\t\tm.db.pushTrie(m.SecureTrie)\n\t}\n\treturn root, err\n}\n\nfunc (m cachedTrie) Prove(key []byte, fromLevel uint, proofDb serodb.Putter) error {\n\treturn m.SecureTrie.Prove(key, fromLevel, proofDb)\n}\n"
  },
  {
    "path": "core/state/dump.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\ntype DumpAccount struct {\n\tBalance string `json:\"balance\"`\n\t//Nonce    uint64            `json:\"nonce\"`\n\tRoot     string            `json:\"root\"`\n\tCodeHash string            `json:\"codeHash\"`\n\tCode     string            `json:\"code\"`\n\tStorage  map[string]string `json:\"storage\"`\n}\n\ntype Dump struct {\n\tRoot     string                 `json:\"root\"`\n\tAccounts map[string]DumpAccount `json:\"accounts\"`\n}\n\nfunc (self *StateDB) RawDump() Dump {\n\tdump := Dump{\n\t\tRoot:     fmt.Sprintf(\"%x\", self.trie.Hash()),\n\t\tAccounts: make(map[string]DumpAccount),\n\t}\n\n\tit := trie.NewIterator(self.trie.NodeIterator(nil))\n\tfor it.Next() {\n\t\taddr := self.trie.GetKey(it.Key)\n\t\tvar data Account\n\t\tif err := rlp.DecodeBytes(it.Value, &data); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\tobj := newObject(nil, common.BytesToAddress(addr), data)\n\t\taccount := DumpAccount{\n\t\t\tBalance: obj.Balance(\"sero\").String(),\n\t\t\t//Nonce:    data.Nonce,\n\t\t\tRoot:     common.Bytes2Hex(data.Root[:]),\n\t\t\tCodeHash: common.Bytes2Hex(data.CodeHash),\n\t\t\tCode:     common.Bytes2Hex(obj.Code(self.db)),\n\t\t\tStorage:  make(map[string]string),\n\t\t}\n\t\tstorageIt := trie.NewIterator(obj.getTrie(self.db).NodeIterator(nil))\n\t\tfor storageIt.Next() {\n\t\t\taccount.Storage[common.Bytes2Hex(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(storageIt.Value)\n\t\t}\n\t\tdump.Accounts[common.Bytes2Hex(addr)] = account\n\t}\n\treturn dump\n}\n\nfunc (self *StateDB) Dump() []byte {\n\tjson, err := json.MarshalIndent(self.RawDump(), \"\", \"    \")\n\tif err != nil {\n\t\tfmt.Println(\"dump err\", err)\n\t}\n\n\treturn json\n}\n"
  },
  {
    "path": "core/state/iterator.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\n// NodeIterator is an iterator to traverse the entire state trie post-order,\n// including all of the contract code and contract state tries.\ntype NodeIterator struct {\n\tstate *StateDB // State being iterated\n\n\tstateIt trie.NodeIterator // Primary iterator for the global state trie\n\tdataIt  trie.NodeIterator // Secondary iterator for the data trie of a contract\n\n\taccountHash common.Hash // Hash of the node containing the account\n\tcodeHash    common.Hash // Hash of the contract source code\n\tcode        []byte      // Source code associated with a contract\n\n\tHash   common.Hash // Hash of the current entry being iterated (nil if not standalone)\n\tParent common.Hash // Hash of the first full ancestor node (nil if current is the root)\n\n\tError error // Failure set in case of an internal error in the iterator\n}\n\n// NewNodeIterator creates an post-order state node iterator.\nfunc NewNodeIterator(state *StateDB) *NodeIterator {\n\treturn &NodeIterator{\n\t\tstate: state,\n\t}\n}\n\n// Next moves the iterator to the next node, returning whether there are any\n// further nodes. In case of an internal error this method returns false and\n// sets the Error field to the encountered failure.\nfunc (it *NodeIterator) Next() bool {\n\t// If the iterator failed previously, don't do anything\n\tif it.Error != nil {\n\t\treturn false\n\t}\n\t// Otherwise step forward with the iterator and report any errors\n\tif err := it.step(); err != nil {\n\t\tit.Error = err\n\t\treturn false\n\t}\n\treturn it.retrieve()\n}\n\n// step moves the iterator to the next entry of the state trie.\nfunc (it *NodeIterator) step() error {\n\t// Abort if we reached the end of the iteration\n\tif it.state == nil {\n\t\treturn nil\n\t}\n\t// Initialize the iterator if we've just started\n\tif it.stateIt == nil {\n\t\tit.stateIt = it.state.trie.NodeIterator(nil)\n\t}\n\t// If we had data nodes previously, we surely have at least state nodes\n\tif it.dataIt != nil {\n\t\tif cont := it.dataIt.Next(true); !cont {\n\t\t\tif it.dataIt.Error() != nil {\n\t\t\t\treturn it.dataIt.Error()\n\t\t\t}\n\t\t\tit.dataIt = nil\n\t\t}\n\t\treturn nil\n\t}\n\t// If we had source code previously, discard that\n\tif it.code != nil {\n\t\tit.code = nil\n\t\treturn nil\n\t}\n\t// Step to the next state trie node, terminating if we're out of nodes\n\tif cont := it.stateIt.Next(true); !cont {\n\t\tif it.stateIt.Error() != nil {\n\t\t\treturn it.stateIt.Error()\n\t\t}\n\t\tit.state, it.stateIt = nil, nil\n\t\treturn nil\n\t}\n\t// If the state trie node is an internal entry, leave as is\n\tif !it.stateIt.Leaf() {\n\t\treturn nil\n\t}\n\t// Otherwise we've reached an account node, initiate data iteration\n\tvar account Account\n\tif err := rlp.Decode(bytes.NewReader(it.stateIt.LeafBlob()), &account); err != nil {\n\t\treturn err\n\t}\n\tdataTrie, err := it.state.db.OpenStorageTrie(common.BytesToHash(it.stateIt.LeafKey()), account.Root)\n\tif err != nil {\n\t\treturn err\n\t}\n\tit.dataIt = dataTrie.NodeIterator(nil)\n\tif !it.dataIt.Next(true) {\n\t\tit.dataIt = nil\n\t}\n\tif !bytes.Equal(account.CodeHash, emptyCodeHash) {\n\t\tit.codeHash = common.BytesToHash(account.CodeHash)\n\t\taddrHash := common.BytesToHash(it.stateIt.LeafKey())\n\t\tit.code, err = it.state.db.ContractCode(addrHash, common.BytesToHash(account.CodeHash))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"code %x: %v\", account.CodeHash, err)\n\t\t}\n\t}\n\tit.accountHash = it.stateIt.Parent()\n\treturn nil\n}\n\n// retrieve pulls and caches the current state entry the iterator is traversing.\n// The method returns whether there are any more data left for inspection.\nfunc (it *NodeIterator) retrieve() bool {\n\t// Clear out any previously set values\n\tit.Hash = common.Hash{}\n\n\t// If the iteration's done, return no available data\n\tif it.state == nil {\n\t\treturn false\n\t}\n\t// Otherwise retrieve the current entry\n\tswitch {\n\tcase it.dataIt != nil:\n\t\tit.Hash, it.Parent = it.dataIt.Hash(), it.dataIt.Parent()\n\t\tif it.Parent == (common.Hash{}) {\n\t\t\tit.Parent = it.accountHash\n\t\t}\n\tcase it.code != nil:\n\t\tit.Hash, it.Parent = it.codeHash, it.accountHash\n\tcase it.stateIt != nil:\n\t\tit.Hash, it.Parent = it.stateIt.Hash(), it.stateIt.Parent()\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "core/state/iterator_test.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Tests that the node iterator indeed walks over the entire database contents.\nfunc TestNodeIteratorCoverage(t *testing.T) {\n\t// Create some arbitrary test state to iterate\n\tdb, root, _ := makeTestState()\n\n\tstate, err := New(db, nil)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create state trie at %x: %v\", root, err)\n\t}\n\t// Gather all the node hashes found by the iterator\n\thashes := make(map[common.Hash]struct{})\n\tfor it := NewNodeIterator(state); it.Next(); {\n\t\tif it.Hash != (common.Hash{}) {\n\t\t\thashes[it.Hash] = struct{}{}\n\t\t}\n\t}\n\t// Cross check the iterated hashes and the database/nodepool content\n\tfor hash := range hashes {\n\t\tif _, err := db.TrieDB().Node(hash); err != nil {\n\t\t\tt.Errorf(\"failed to retrieve reported node %x\", hash)\n\t\t}\n\t}\n\tfor _, hash := range db.TrieDB().Nodes() {\n\t\tif _, ok := hashes[hash]; !ok {\n\t\t\tt.Errorf(\"state entry not reported %x\", hash)\n\t\t}\n\t}\n\tfor _, key := range db.TrieDB().DiskDB().(*serodb.MemDatabase).Keys() {\n\t\tif bytes.HasPrefix(key, []byte(\"secure-key-\")) {\n\t\t\tcontinue\n\t\t}\n\t\tif _, ok := hashes[common.BytesToHash(key)]; !ok {\n\t\t\tt.Errorf(\"state entry not reported %x\", key)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "core/state/journal.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\n// journalEntry is a modification entry in the state change journal that can be\n// reverted on demand.\ntype journalEntry interface {\n\t// revert undoes the changes introduced by this journal entry.\n\trevert(*StateDB)\n\n\t// dirtied returns the Ethereum address modified by this journal entry.\n\tdirtied() *common.Address\n}\n\n// journal contains the list of state modifications applied since the last state\n// commit. These are tracked to be able to be reverted in case of an execution\n// exception or revertal request.\ntype journal struct {\n\tentries []journalEntry         // Current changes tracked by the journal\n\tdirties map[common.Address]int // Dirty accounts and the number of changes\n}\n\n// newJournal create a new initialized journal.\nfunc newJournal() *journal {\n\treturn &journal{\n\t\tdirties: make(map[common.Address]int),\n\t}\n}\n\n// append inserts a new modification entry to the end of the change journal.\nfunc (j *journal) append(entry journalEntry) {\n\tj.entries = append(j.entries, entry)\n\tif addr := entry.dirtied(); addr != nil {\n\t\tj.dirties[*addr]++\n\t}\n}\n\n// revert undoes a batch of journalled modifications along with any reverted\n// dirty handling too.\nfunc (j *journal) revert(statedb *StateDB, snapshot int) {\n\tfor i := len(j.entries) - 1; i >= snapshot; i-- {\n\t\t// Undo the changes made by the operation\n\t\tj.entries[i].revert(statedb)\n\n\t\t// Drop any dirty tracking induced by the change\n\t\tif addr := j.entries[i].dirtied(); addr != nil {\n\t\t\tif j.dirties[*addr]--; j.dirties[*addr] == 0 {\n\t\t\t\tdelete(j.dirties, *addr)\n\t\t\t}\n\t\t}\n\t}\n\tj.entries = j.entries[:snapshot]\n}\n\n// dirty explicitly sets an address to dirty, even if the change entries would\n// otherwise suggest it as clean. This method is an ugly hack to handle the RIPEMD\n// precompile consensus exception.\nfunc (j *journal) dirty(addr common.Address) {\n\tj.dirties[addr]++\n}\n\n// length returns the current number of entries in the journal.\nfunc (j *journal) length() int {\n\treturn len(j.entries)\n}\n\ntype (\n\t// Changes to the account trie.\n\tcreateObjectChange struct {\n\t\taccount *common.Address\n\t}\n\tresetObjectChange struct {\n\t\tprev *stateObject\n\t}\n\tsuicideChange struct {\n\t\taccount   *common.Address\n\t\tprev      bool // whether account had already suicided\n\t\tprevBooks []*Book\n\t}\n\n\t// Changes to individual accounts.\n\tbalanceChange struct {\n\t\taccount  *common.Address\n\t\tcurrency string\n\t\tprev     *big.Int\n\t}\n\n\tticketNonceChange struct {\n\t\taccount *common.Address\n\t\tprev    uint64\n\t}\n\n\tstorageChange struct {\n\t\taccount       *common.Address\n\t\tkey, prevalue common.Hash\n\t}\n\tcodeChange struct {\n\t\taccount            *common.Address\n\t\tprevcode, prevhash []byte\n\t}\n\n\t// Changes to other state values.\n\trefundChange struct {\n\t\tprev uint64\n\t}\n\taddLogChange struct {\n\t\ttxhash common.Hash\n\t}\n\taddPreimageChange struct {\n\t\thash common.Hash\n\t}\n\ttouchChange struct {\n\t\taccount   *common.Address\n\t\tprev      bool\n\t\tprevDirty bool\n\t}\n)\n\nfunc (tn ticketNonceChange) revert(s *StateDB) {\n\ts.getStateObject(*tn.account).setTicketNonce(tn.prev)\n}\n\nfunc (tn ticketNonceChange) dirtied() *common.Address {\n\treturn tn.account\n}\n\nfunc (ch createObjectChange) revert(s *StateDB) {\n\tdelete(s.stateObjects, *ch.account)\n\tdelete(s.stateObjectsDirty, *ch.account)\n}\n\nfunc (ch createObjectChange) dirtied() *common.Address {\n\treturn ch.account\n}\n\nfunc (ch resetObjectChange) revert(s *StateDB) {\n\ts.setStateObject(ch.prev)\n}\n\nfunc (ch resetObjectChange) dirtied() *common.Address {\n\treturn nil\n}\n\nfunc (ch suicideChange) revert(s *StateDB) {\n\tobj := s.getStateObject(*ch.account)\n\tif obj != nil {\n\t\tobj.suicided = ch.prev\n\t\tobj.data.Books = ch.prevBooks\n\t\tobj.data.bookMap = map[string]*Book{}\n\t\tfor _, book := range ch.prevBooks {\n\t\t\tobj.data.bookMap[book.Currency] = book\n\t\t}\n\t}\n}\n\nfunc (ch suicideChange) dirtied() *common.Address {\n\treturn ch.account\n}\n\nfunc (ch touchChange) revert(s *StateDB) {\n}\n\nfunc (ch touchChange) dirtied() *common.Address {\n\treturn ch.account\n}\n\nfunc (ch balanceChange) revert(s *StateDB) {\n\ts.getStateObject(*ch.account).SetBalance(ch.currency, ch.prev)\n}\n\nfunc (ch balanceChange) dirtied() *common.Address {\n\treturn ch.account\n}\n\nfunc (ch codeChange) revert(s *StateDB) {\n\ts.getStateObject(*ch.account).setCode(common.BytesToHash(ch.prevhash), ch.prevcode)\n}\n\nfunc (ch codeChange) dirtied() *common.Address {\n\treturn ch.account\n}\n\nfunc (ch storageChange) revert(s *StateDB) {\n\ts.getStateObject(*ch.account).setState(ch.key, ch.prevalue)\n}\n\nfunc (ch storageChange) dirtied() *common.Address {\n\treturn ch.account\n}\n\nfunc (ch refundChange) revert(s *StateDB) {\n\ts.refund = ch.prev\n}\n\nfunc (ch refundChange) dirtied() *common.Address {\n\treturn nil\n}\n\nfunc (ch addLogChange) revert(s *StateDB) {\n\tlogs := s.logs[ch.txhash]\n\tif len(logs) == 1 {\n\t\tdelete(s.logs, ch.txhash)\n\t} else {\n\t\ts.logs[ch.txhash] = logs[:len(logs)-1]\n\t}\n\ts.logSize--\n}\n\nfunc (ch addLogChange) dirtied() *common.Address {\n\treturn nil\n}\n\nfunc (ch addPreimageChange) revert(s *StateDB) {\n\tdelete(s.preimages, ch.hash)\n}\n\nfunc (ch addPreimageChange) dirtied() *common.Address {\n\treturn nil\n}\n"
  },
  {
    "path": "core/state/managed_state.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\ntype account struct {\n\tstateObject *stateObject\n\t//nstart      uint64\n\tnonces []bool\n}\n\ntype ManagedState struct {\n\t*StateDB\n\n\tmu sync.RWMutex\n\n\taccounts map[common.Address]*account\n}\n\nfunc (ms *ManagedState) GetAllNonceAddress(addr common.Address) []common.Address {\n\treturn []common.Address{}\n}\n\nfunc (ms *ManagedState) setNonceAddress(addr common.Address, nonceAddr common.Address) {\n\n}\n\nfunc (ms *ManagedState) GetNonceAddress(addr common.Address, key []byte) common.Address {\n\treturn common.Address{}\n}\n\nfunc (ms *ManagedState) IsContract(addr common.Address) bool {\n\treturn ms.GetCode(addr) == nil\n}\n\n// ManagedState returns a new managed state with the statedb as it's backing layer\nfunc ManageState(statedb *StateDB) *ManagedState {\n\treturn &ManagedState{\n\t\tStateDB:  statedb.Copy(),\n\t\taccounts: make(map[common.Address]*account),\n\t}\n}\n\nfunc GetAndIndNonce() uint64 {\n\treturn 0\n}\n\n// RemoveNonce removed the nonce from the managed state and all future pending nonces\n//func (ms *ManagedState) RemoveNonce(addr common.Data, n uint64) {\n//\tif ms.hasAccount(addr) {\n//\t\tms.mu.Lock()\n//\t\tdefer ms.mu.Unlock()\n//\n//\t\taccount := ms.getAccount(addr)\n//\t\tif n-account.nstart <= uint64(len(account.nonces)) {\n//\t\t\treslice := make([]bool, n-account.nstart)\n//\t\t\tcopy(reslice, account.nonces[:n-account.nstart])\n//\t\t\taccount.nonces = reslice\n//\t\t}\n//\t}\n//}\n\n// NewNonce returns the new canonical nonce for the managed account\n//func (ms *ManagedState) NewNonce(addr common.Data) uint64 {\n//\tms.mu.Lock()\n//\tdefer ms.mu.Unlock()\n//\n//\taccount := ms.getAccount(addr)\n//\tfor i, nonce := range account.nonces {\n//\t\tif !nonce {\n//\t\t\treturn account.nstart + uint64(i)\n//\t\t}\n//\t}\n//\taccount.nonces = append(account.nonces, true)\n//\n//\treturn uint64(len(account.nonces)-1) + account.nstart\n//}\n\n// GetNonce returns the canonical nonce for the managed or unmanaged account.\n//\n// Because GetNonce mutates the DB, we must take a write lock.\n//func (ms *ManagedState) GetNonce(addr common.Data) uint64 {\n//\tms.mu.Lock()\n//\tdefer ms.mu.Unlock()\n//\n//\tif ms.hasAccount(addr) {\n//\t\taccount := ms.getAccount(addr)\n//\t\treturn uint64(len(account.nonces)) + account.nstart\n//\t} else {\n//\t\treturn ms.StateDB.GetNonce(addr)\n//\t}\n//}\n\n// SetNonce sets the new canonical nonce for the managed state\n//func (ms *ManagedState) SetNonce(addr common.Data, nonce uint64) {\n//\tms.mu.Lock()\n//\tdefer ms.mu.Unlock()\n//\n//\tso := ms.GetOrNewStateObject(addr)\n//\tso.SetNonce(nonce)\n//\n//\tms.accounts[addr] = newAccount(so)\n//}\n\n// HasAccount returns whether the given address is managed or not\nfunc (ms *ManagedState) HasAccount(addr common.Address) bool {\n\tms.mu.RLock()\n\tdefer ms.mu.RUnlock()\n\treturn ms.hasAccount(addr)\n}\n\nfunc (ms *ManagedState) hasAccount(addr common.Address) bool {\n\t_, ok := ms.accounts[addr]\n\treturn ok\n}\n\n// populate the managed state\n//func (ms *ManagedState) getAccount(addr common.Data) *account {\n//\tif account, ok := ms.accounts[addr]; !ok {\n//\t\tso := ms.GetOrNewStateObject(addr)\n//\t\tms.accounts[addr] = newAccount(so)\n//\t} else {\n//\t\t// Always make sure the state account nonce isn't actually higher\n//\t\t// than the tracked one.\n//\t\tso := ms.StateDB.getStateObject(addr)\n//\t\tif so != nil && uint64(len(account.nonces))+account.nstart < so.Nonce() {\n//\t\t\tms.accounts[addr] = newAccount(so)\n//\t\t}\n//\n//\t}\n//\n//\treturn ms.accounts[addr]\n//}\n\nfunc newAccount(so *stateObject) *account {\n\treturn &account{so, nil}\n}\n"
  },
  {
    "path": "core/state/state_object.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nvar emptyCodeHash = crypto.Keccak256(nil)\n\ntype Code []byte\n\nfunc (self Code) String() string {\n\treturn string(self) //strings.Join(Disassemble(self), \" \")\n}\n\ntype Storage map[common.Hash]common.Hash\n\nfunc (self Storage) String() (str string) {\n\tfor key, value := range self {\n\t\tstr += fmt.Sprintf(\"%X : %X\\n\", key, value)\n\t}\n\n\treturn\n}\n\nfunc (self Storage) Copy() Storage {\n\tcpy := make(Storage)\n\tfor key, value := range self {\n\t\tcpy[key] = value\n\t}\n\n\treturn cpy\n}\n\n// stateObject represents an Ethereum account which is being modified.\n//\n// The usage pattern is as follows:\n// First you need to obtain a state object.\n// AccountAddress values can be accessed and modified through the object.\n// Finally, call CommitTrie to write the modified storage trie into a database.\ntype stateObject struct {\n\taddress  common.Address\n\taddrHash common.Hash // hash of ethereum address of the account\n\tdata     Account\n\tdb       *StateDB\n\n\t// DB error.\n\t// State objects are used by the consensus core and VM which are\n\t// unable to deal with database-level errors. Any error that occurs\n\t// during a database read is memoized here and will eventually be returned\n\t// by StateDB.Commit.\n\tdbErr error\n\n\t// Write caches.\n\ttrie Trie // storage trie, which becomes non-nil on first access\n\tcode Code // contract bytecode, which gets set when code is loaded\n\n\tcachedStorage Storage // Storage entry cache to avoid duplicate reads\n\tdirtyStorage  Storage // Storage entries that need to be flushed to disk\n\n\t// Cache flags.\n\t// When an object is marked suicided it will be delete from the trie\n\t// during the \"update\" phase of the state transition.\n\tdirtyCode bool // true if the code was updated\n\tsuicided  bool\n\tdeleted   bool\n}\n\n// empty returns whether the account is considered empty.\nfunc (s *stateObject) empty() bool {\n\t//return s.data.Balance.Sign() == 0 && bytes.Equal(s.data.CodeHash, emptyCodeHash)\n\treturn false\n}\n\ntype Book struct {\n\tBalance  *big.Int\n\tCurrency string\n}\n\n// AccountAddress is the Ethereum consensus representation of accounts.\n// These objects are stored in the main account trie.\ntype Account struct {\n\tTicketNonce uint64\n\t//Balance   *big.Int\n\tRoot     common.Hash // merkle root of the storage trie\n\tCodeHash []byte\n\tBooks    []*Book\n\tbookMap  map[string]*Book\n}\n\n// newObject creates a state object.\nfunc newObject(db *StateDB, address common.Address, data Account) *stateObject {\n\tif data.CodeHash == nil {\n\t\tdata.CodeHash = emptyCodeHash\n\t}\n\n\tdata.bookMap = map[string]*Book{}\n\tbooks := []*Book{}\n\tfor _, book := range data.Books {\n\t\tnb := &Book{book.Balance, book.Currency}\n\t\tbooks = append(books, nb)\n\t\tdata.bookMap[book.Currency] = nb\n\t}\n\tdata.Books = books\n\n\treturn &stateObject{\n\t\tdb:            db,\n\t\taddress:       address,\n\t\taddrHash:      crypto.Keccak256Hash(address.Bytes()),\n\t\tdata:          data,\n\t\tcachedStorage: make(Storage),\n\t\tdirtyStorage:  make(Storage),\n\t}\n}\n\nfunc (self *stateObject) TicketNonce() uint64 {\n\treturn self.data.TicketNonce\n}\n\nfunc (self *stateObject) SetTicketNonce(nonce uint64) {\n\tself.db.journal.append(ticketNonceChange{\n\t\taccount: &self.address,\n\t\tprev:    self.data.TicketNonce,\n\t})\n\tself.setTicketNonce(nonce)\n}\n\nfunc (self *stateObject) setTicketNonce(nonce uint64) {\n\tself.data.TicketNonce = nonce\n}\n\n// EncodeRLP implements rlp.Encoder.\nfunc (c *stateObject) EncodeRLP(w io.Writer) error {\n\treturn rlp.Encode(w, c.data)\n}\n\n// setError remembers the first non-nil error it is called with.\nfunc (self *stateObject) setError(err error) {\n\tif self.dbErr == nil {\n\t\tself.dbErr = err\n\t}\n}\n\nfunc (self *stateObject) markSuicided() {\n\tself.suicided = true\n}\n\nfunc (c *stateObject) touch() {\n\tc.db.journal.append(touchChange{\n\t\taccount: &c.address,\n\t})\n}\n\nfunc (c *stateObject) getTrie(db Database) Trie {\n\tif c.trie == nil {\n\t\tvar err error\n\t\tc.trie, err = db.OpenStorageTrie(c.addrHash, c.data.Root)\n\t\tif err != nil {\n\t\t\tc.trie, _ = db.OpenStorageTrie(c.addrHash, common.Hash{})\n\t\t\tc.setError(fmt.Errorf(\"can't create storage trie: %v\", err))\n\t\t}\n\t}\n\treturn c.trie\n}\n\n// GetState returns a value in account storage.\nfunc (self *stateObject) GetState(db Database, key common.Hash) common.Hash {\n\tvalue, exists := self.cachedStorage[key]\n\tif exists {\n\t\treturn value\n\t}\n\t// Load from DB in case it is missing.\n\tenc, err := self.getTrie(db).TryGet(key[:])\n\tif err != nil {\n\t\tself.setError(err)\n\t\treturn common.Hash{}\n\t}\n\tif len(enc) > 0 {\n\t\t_, content, _, err := rlp.Split(enc)\n\t\tif err != nil {\n\t\t\tself.setError(err)\n\t\t}\n\t\tvalue.SetBytes(content)\n\t}\n\tself.cachedStorage[key] = value\n\treturn value\n}\n\n// SetState updates a value in account storage.\nfunc (self *stateObject) SetState(db Database, key, value common.Hash) {\n\tself.db.journal.append(storageChange{\n\t\taccount:  &self.address,\n\t\tkey:      key,\n\t\tprevalue: self.GetState(db, key),\n\t})\n\tself.setState(key, value)\n}\n\nfunc (self *stateObject) setState(key, value common.Hash) {\n\tself.cachedStorage[key] = value\n\tself.dirtyStorage[key] = value\n}\n\n// updateTrie writes cached storage modifications into the object's storage trie.\nfunc (self *stateObject) updateTrie(db Database) Trie {\n\ttr := self.getTrie(db)\n\tfor key, value := range self.dirtyStorage {\n\t\tdelete(self.dirtyStorage, key)\n\t\tif (value == common.Hash{}) {\n\t\t\tself.setError(tr.TryDelete(key[:]))\n\t\t\tcontinue\n\t\t}\n\t\t// Encoding []byte cannot fail, ok to ignore the error.\n\t\tv, _ := rlp.EncodeToBytes(bytes.TrimLeft(value[:], \"\\x00\"))\n\t\tself.setError(tr.TryUpdate(key[:], v))\n\t}\n\treturn tr\n}\n\n// UpdateRoot sets the trie root to the current root hash of\nfunc (self *stateObject) updateRoot(db Database) {\n\tself.updateTrie(db)\n\tself.data.Root = self.trie.Hash()\n}\n\n// CommitTrie the storage trie of the object to db.\n// This updates the trie root.\nfunc (self *stateObject) CommitTrie(db Database) error {\n\tself.updateTrie(db)\n\tif self.dbErr != nil {\n\t\treturn self.dbErr\n\t}\n\troot, err := self.trie.Commit(nil)\n\tif err == nil {\n\t\tself.data.Root = root\n\t}\n\treturn err\n}\n\n// AddBalance removes amount from c's balance.\n// It is used to add funds to the destination account of a transfer.\nfunc (self *stateObject) AddBalance(coinName string, amount *big.Int) {\n\tif amount.Sign() == 0 {\n\t\treturn\n\t}\n\n\tself.SetBalance(coinName, new(big.Int).Add(self.Balance(coinName), amount))\n}\n\n// SubBalance removes amount from c's balance.\n// It is used to remove funds from the origin account of a transfer.\nfunc (self *stateObject) SubBalance(coinName string, amount *big.Int) {\n\tif amount.Sign() == 0 {\n\t\treturn\n\t}\n\n\tself.SetBalance(coinName, new(big.Int).Sub(self.Balance(coinName), amount))\n}\n\nfunc (self *stateObject) SetBalance(coinName string, amount *big.Int) {\n\tself.db.journal.append(balanceChange{\n\t\taccount:  &self.address,\n\t\tcurrency: coinName,\n\t\tprev:     new(big.Int).Set(self.Balance(coinName)),\n\t})\n\n\tcoinName = strings.ToUpper(coinName)\n\tif book, ok := self.data.bookMap[coinName]; ok {\n\t\tbook.Balance = amount\n\t} else {\n\t\tbook := &Book{amount, coinName}\n\t\tself.data.Books = append(self.data.Books, book)\n\t\tself.data.bookMap[coinName] = book\n\t}\n}\n\n// Return the gas back to the origin. Used by the Virtual machine or Closures\nfunc (c *stateObject) ReturnGas(gas *big.Int) {}\n\nfunc (self *stateObject) deepCopy(db *StateDB) *stateObject {\n\tstateObject := newObject(db, self.address, self.data)\n\tif self.trie != nil {\n\t\tstateObject.trie = db.db.CopyTrie(self.trie)\n\t}\n\tstateObject.code = self.code\n\tstateObject.dirtyStorage = self.dirtyStorage.Copy()\n\tstateObject.cachedStorage = self.dirtyStorage.Copy()\n\tstateObject.suicided = self.suicided\n\tstateObject.dirtyCode = self.dirtyCode\n\tstateObject.deleted = self.deleted\n\treturn stateObject\n}\n\n//\n// Attribute accessors\n//\n\n// Returns the address of the contract/account\nfunc (c *stateObject) Address() common.Address {\n\treturn c.address\n}\n\n// Code returns the contract code associated with this object, if any.\nfunc (self *stateObject) Code(db Database) []byte {\n\tif self.code != nil {\n\t\treturn self.code\n\t}\n\tif bytes.Equal(self.CodeHash(), emptyCodeHash) {\n\t\treturn nil\n\t}\n\tcode, err := db.ContractCode(self.addrHash, common.BytesToHash(self.CodeHash()))\n\tif err != nil {\n\t\tself.setError(fmt.Errorf(\"can't load code hash %x: %v\", self.CodeHash(), err))\n\t}\n\tself.code = code\n\treturn code\n}\n\nfunc (self *stateObject) SetCode(codeHash common.Hash, code []byte) {\n\tprevcode := self.Code(self.db.db)\n\tself.db.journal.append(codeChange{\n\t\taccount:  &self.address,\n\t\tprevhash: self.CodeHash(),\n\t\tprevcode: prevcode,\n\t})\n\tself.setCode(codeHash, code)\n}\n\nfunc (self *stateObject) setCode(codeHash common.Hash, code []byte) {\n\tself.code = code\n\tself.data.CodeHash = codeHash[:]\n\tself.dirtyCode = true\n}\n\nfunc (self *stateObject) CodeHash() []byte {\n\treturn self.data.CodeHash\n}\n\nfunc (self *stateObject) Balance(coinName string) *big.Int {\n\tcoinName = strings.ToUpper(coinName)\n\tif book, ok := self.data.bookMap[coinName]; ok {\n\t\treturn book.Balance\n\t}\n\treturn new(big.Int)\n}\n\nfunc (self *stateObject) Balances() map[string]*big.Int {\n\tresult := map[string]*big.Int{}\n\tfor currency, book := range self.data.bookMap {\n\t\tresult[currency] = book.Balance\n\t}\n\treturn result\n}\n\n// Never called, but must be present to allow stateObject to be used\n// as a vm.AccountAddress interface that also satisfies the vm.ContractRef\n// interface. Interfaces are awesome.\nfunc (self *stateObject) Value() *big.Int {\n\tpanic(\"Value on stateObject should never be called\")\n}\n"
  },
  {
    "path": "core/state/state_test.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"bytes\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\tchecker \"gopkg.in/check.v1\"\n)\n\ntype StateSuite struct {\n\tdb    *serodb.MemDatabase\n\tstate *StateDB\n}\n\nvar _ = checker.Suite(&StateSuite{})\n\nvar toAddr = common.BytesToAddress\n\nfunc (s *StateSuite) TestDump(c *checker.C) {\n\t// generate a few entries\n\tobj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01}))\n\tobj1.AddBalance(\"sero\", big.NewInt(22))\n\tobj2 := s.state.GetOrNewStateObject(toAddr([]byte{0x01, 0x02}))\n\tobj2.SetCode(crypto.Keccak256Hash([]byte{3, 3, 3, 3, 3, 3, 3}), []byte{3, 3, 3, 3, 3, 3, 3})\n\tobj3 := s.state.GetOrNewStateObject(toAddr([]byte{0x02}))\n\tobj3.SetBalance(\"sero\", big.NewInt(44))\n\n\t// write some of them to the trie\n\ts.state.updateStateObject(obj1)\n\ts.state.updateStateObject(obj2)\n\ts.state.Commit(false)\n\n\t// check that dump contains the state objects that are in trie\n\tgot := string(s.state.Dump())\n\twant := `{\n    \"root\": \"71edff0130dd2385947095001c73d9e28d862fc286fca2b922ca6f6f3cddfdd2\",\n    \"accounts\": {\n        \"0000000000000000000000000000000000000001\": {\n            \"balance\": \"22\",\n            \"nonce\": 0,\n            \"root\": \"56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421\",\n            \"codeHash\": \"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470\",\n            \"code\": \"\",\n            \"storage\": {}\n        },\n        \"0000000000000000000000000000000000000002\": {\n            \"balance\": \"44\",\n            \"nonce\": 0,\n            \"root\": \"56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421\",\n            \"codeHash\": \"c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470\",\n            \"code\": \"\",\n            \"storage\": {}\n        },\n        \"0000000000000000000000000000000000000102\": {\n            \"balance\": \"0\",\n            \"nonce\": 0,\n            \"root\": \"56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421\",\n            \"codeHash\": \"87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3\",\n            \"code\": \"03030303030303\",\n            \"storage\": {}\n        }\n    }\n}`\n\tif got != want {\n\t\tc.Errorf(\"dump mismatch:\\ngot: %s\\nwant: %s\\n\", got, want)\n\t}\n}\n\nfunc (s *StateSuite) SetUpTest(c *checker.C) {\n\ts.db = serodb.NewMemDatabase()\n\ts.state, _ = New(NewDatabase(s.db), nil)\n}\n\nfunc (s *StateSuite) TestNull(c *checker.C) {\n\taddress := common.Base58ToAddress(\"2vgxVPQYB7AFWUdYzn76FzTVeaWnqoMTqbynqr2gJb1sMBpsATtxLHtFNptruobkfuhrTYNewg8GAWwTdsoMeuyV\")\n\ts.state.CreateAccount(address)\n\t//value := common.FromHex(\"0x823140710bf13990e4500136726d8b55\")\n\tvar value common.Hash\n\ts.state.SetState(address, common.Hash{}, value)\n\ts.state.Commit(false)\n\tvalue = s.state.GetState(address, common.Hash{})\n\tif value != (common.Hash{}) {\n\t\tc.Errorf(\"expected empty hash. got %x\", value)\n\t}\n}\n\nfunc (s *StateSuite) TestSnapshot(c *checker.C) {\n\tstateobjaddr := toAddr([]byte(\"aa\"))\n\tvar storageaddr common.Hash\n\tdata1 := common.BytesToHash([]byte{42})\n\tdata2 := common.BytesToHash([]byte{43})\n\n\t// set initial state object value\n\ts.state.SetState(stateobjaddr, storageaddr, data1)\n\t// get snapshot of current state\n\tsnapshot := s.state.Snapshot()\n\n\t// set new state object value\n\ts.state.SetState(stateobjaddr, storageaddr, data2)\n\t// restore snapshot\n\ts.state.RevertToSnapshot(snapshot)\n\n\t// get state storage value\n\tres := s.state.GetState(stateobjaddr, storageaddr)\n\n\tc.Assert(data1, checker.DeepEquals, res)\n}\n\nfunc (s *StateSuite) TestSnapshotEmpty(c *checker.C) {\n\ts.state.RevertToSnapshot(s.state.Snapshot())\n}\n\n// use testing instead of checker because checker does not support\n// printing/logging in tests (-check.vv does not work)\nfunc TestSnapshot2(t *testing.T) {\n\tstate, _ := New(NewDatabase(serodb.NewMemDatabase()), nil)\n\n\tstateobjaddr0 := toAddr([]byte(\"so0\"))\n\tstateobjaddr1 := toAddr([]byte(\"so1\"))\n\tvar storageaddr common.Hash\n\n\tdata0 := common.BytesToHash([]byte{17})\n\tdata1 := common.BytesToHash([]byte{18})\n\n\tstate.SetState(stateobjaddr0, storageaddr, data0)\n\tstate.SetState(stateobjaddr1, storageaddr, data1)\n\n\t// db, trie are already non-empty values\n\tso0 := state.getStateObject(stateobjaddr0)\n\tso0.SetBalance(\"sero\", big.NewInt(42))\n\tso0.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e'}), []byte{'c', 'a', 'f', 'e'})\n\tso0.suicided = false\n\tso0.deleted = false\n\tstate.setStateObject(so0)\n\n\troot, _ := state.Commit(false)\n\tstate.Reset(root)\n\n\t// and one with deleted == true\n\tso1 := state.getStateObject(stateobjaddr1)\n\tso1.SetBalance(\"sero\", big.NewInt(52))\n\tso1.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e', '2'}), []byte{'c', 'a', 'f', 'e', '2'})\n\tso1.suicided = true\n\tso1.deleted = true\n\tstate.setStateObject(so1)\n\n\tso1 = state.getStateObject(stateobjaddr1)\n\tif so1 != nil {\n\t\tt.Fatalf(\"deleted object not nil when getting\")\n\t}\n\n\tsnapshot := state.Snapshot()\n\tstate.RevertToSnapshot(snapshot)\n\n\tso0Restored := state.getStateObject(stateobjaddr0)\n\t// Update lazily-loaded values before comparing.\n\tso0Restored.GetState(state.db, storageaddr)\n\tso0Restored.Code(state.db)\n\t// non-deleted is equal (restored)\n\tcompareStateObjects(so0Restored, so0, t)\n\n\t// deleted should be nil, both before and after restore of state copy\n\tso1Restored := state.getStateObject(stateobjaddr1)\n\tif so1Restored != nil {\n\t\tt.Fatalf(\"deleted object not nil after restoring snapshot: %+v\", so1Restored)\n\t}\n}\n\nfunc compareStateObjects(so0, so1 *stateObject, t *testing.T) {\n\tif so0.Address() != so1.Address() {\n\t\tt.Fatalf(\"Address mismatch: have %v, want %v\", so0.address, so1.address)\n\t}\n\tif so0.Balance(\"sero\").Cmp(so1.Balance(\"sero\")) != 0 {\n\t\tt.Fatalf(\"Balance mismatch: have %v, want %v\", so0.Balance(\"sero\"), so1.Balance(\"sero\"))\n\t}\n\n\tif so0.data.Root != so1.data.Root {\n\t\tt.Errorf(\"Root mismatch: have %x, want %x\", so0.data.Root[:], so1.data.Root[:])\n\t}\n\tif !bytes.Equal(so0.CodeHash(), so1.CodeHash()) {\n\t\tt.Fatalf(\"CodeHash mismatch: have %v, want %v\", so0.CodeHash(), so1.CodeHash())\n\t}\n\tif !bytes.Equal(so0.code, so1.code) {\n\t\tt.Fatalf(\"Code mismatch: have %v, want %v\", so0.code, so1.code)\n\t}\n\n\tif len(so1.cachedStorage) != len(so0.cachedStorage) {\n\t\tt.Errorf(\"Storage size mismatch: have %d, want %d\", len(so1.cachedStorage), len(so0.cachedStorage))\n\t}\n\tfor k, v := range so1.cachedStorage {\n\t\tif so0.cachedStorage[k] != v {\n\t\t\tt.Errorf(\"Storage key %x mismatch: have %v, want %v\", k, so0.cachedStorage[k], v)\n\t\t}\n\t}\n\tfor k, v := range so0.cachedStorage {\n\t\tif so1.cachedStorage[k] != v {\n\t\t\tt.Errorf(\"Storage key %x mismatch: have %v, want none.\", k, v)\n\t\t}\n\t}\n\n\tif so0.suicided != so1.suicided {\n\t\tt.Fatalf(\"suicided mismatch: have %v, want %v\", so0.suicided, so1.suicided)\n\t}\n\tif so0.deleted != so1.deleted {\n\t\tt.Fatalf(\"Deleted mismatch: have %v, want %v\", so0.deleted, so1.deleted)\n\t}\n}\n"
  },
  {
    "path": "core/state/statedb.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package state provides a caching layer atop the Ethereum state trie.\npackage state\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/zero/consensus\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/trie\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n)\n\ntype revision struct {\n\tid           int\n\tjournalIndex int\n}\n\nvar (\n\t// emptyState is the known hash of an empty state trie entry.\n\temptyState = crypto.Keccak256Hash(nil)\n\n\t// emptyCode is the known hash of the empty EVM bytecode.\n\temptyCode = crypto.Keccak256Hash(nil)\n\n\tEmptyAddress = common.BytesToAddress(crypto.Keccak512(nil))\n\n\tTrueHash  = common.HexToHash(\"0x0000000000000000000000000000000000000000000000000000000000000001\")\n\tFalseHash = common.HexToHash(\"0x0000000000000000000000000000000000000000000000000000000000000000\")\n\n\tcontrctNonceKey = crypto.Keccak256Hash([]byte(\"contractNonce\"))\n)\n\n// StateDBs within the ethereum protocol are used to store anything\n// within the merkle trie. StateDBs take care of caching and storing\n// nested states. It's the general query interface to retrieve:\n// * Contracts\n// * Accounts\ntype StateDB struct {\n\troot common.Hash\n\tdb   Database\n\ttrie Trie\n\n\t// This map holds 'live' objects, which will get modified while processing a state transition.\n\tstateObjects      map[common.Address]*stateObject\n\tstateObjectsDirty map[common.Address]struct{}\n\tstakeState        *consensus.Cons\n\tzstate            *zstate.ZState\n\n\t// DB error.\n\t// State objects are used by the consensus core and VM which are\n\t// unable to deal with database-level errors. Any error that occurs\n\t// during a database read is memoized here and will eventually be returned\n\t// by StateDB.Commit.\n\tdbErr error\n\n\t// The refund counter, also used by state transitioning.\n\trefund uint64\n\n\tthash, bhash common.Hash\n\ttxIndex      int\n\tlogs         map[common.Hash][]*types.Log\n\tlogSize      uint\n\n\tpreimages map[common.Hash][]byte\n\n\t// Journal of state modifications. This is the backbone of\n\t// Snapshot and RevertToSnapshot.\n\tjournal        *journal\n\tvalidRevisions []revision\n\tnextRevisionId int\n\n\t//seeds  []c_type.Uint512\n\tnumber int64\n\tlock   sync.Mutex\n}\n\nfunc (self *StateDB) SetStakeState(key common.Hash, value common.Hash) {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tstateObject.SetState(self.db, key, value)\n\t}\n}\n\nfunc (self *StateDB) GetStakeState(key common.Hash) common.Hash {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\treturn stateObject.GetState(self.db, key)\n\t}\n\treturn common.Hash{}\n}\n\nfunc (self *StateDB) IsContract(addr common.Address) bool {\n\treturn self.getStateObject(addr) != nil\n}\n\n/*func New(db Database, root common.Hash, num uint64) (*StateDB, error) {\n\n}*/\n\n// Create a new state from a given trie.\nfunc New(db Database, header *types.Header) (*StateDB, error) {\n\tvar root common.Hash\n\tvar num int64\n\tif header == nil {\n\t\troot = common.Hash{}\n\t\tnum = -1\n\t} else {\n\t\troot = header.Root\n\t\tnum = header.Number.Int64()\n\t}\n\ttr, err := db.OpenTrie(root)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &StateDB{\n\t\troot:              root,\n\t\tdb:                db,\n\t\ttrie:              tr,\n\t\tstateObjects:      make(map[common.Address]*stateObject),\n\t\tstateObjectsDirty: make(map[common.Address]struct{}),\n\t\tlogs:              make(map[common.Hash][]*types.Log),\n\t\tpreimages:         make(map[common.Hash][]byte),\n\t\tjournal:           newJournal(),\n\t\tnumber:            num,\n\t}, nil\n}\n\nfunc (self *StateDB) registerAddressByState(name string, contractAddr common.Address, key string) bool {\n\tkey0, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{0}})\n\tkey1, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{1}})\n\n\thashKey0 := crypto.Keccak256Hash(key0)\n\thashKey1 := crypto.Keccak256Hash(key1)\n\taddress := self.getAddressByState(hashKey0, hashKey1, common.Hash{})\n\tif address == (common.Address{}) {\n\t\tself.setAddressByState(hashKey0, hashKey1, common.Hash{}, contractAddr)\n\t\treturn true\n\t} else {\n\t\treturn address == contractAddr\n\t}\n\treturn false\n}\n\nfunc (self *StateDB) OwnTicket(contractAddr common.Address, categoryName string, value common.Hash) bool {\n\tstateObject := self.getStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tbytes, _ := rlp.EncodeToBytes([]interface{}{contractAddr, strings.ToUpper(categoryName), value})\n\t\thash := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes))\n\t\tif hash == TrueHash {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (self *StateDB) AddTicket(contractAddr common.Address, categoryName string, value common.Hash) {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tbytes, _ := rlp.EncodeToBytes([]interface{}{contractAddr, strings.ToUpper(categoryName), value})\n\t\tstateObject.SetState(self.db, crypto.Keccak256Hash(bytes), TrueHash)\n\t}\n}\n\nfunc (self *StateDB) RemoveTicket(contractAddr common.Address, categoryName string, value common.Hash) bool {\n\tstateObject := self.getStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tbytes, _ := rlp.EncodeToBytes([]interface{}{contractAddr, strings.ToUpper(categoryName), value})\n\t\thash := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes))\n\t\tif hash == TrueHash {\n\t\t\tstateObject.SetState(self.db, crypto.Keccak256Hash(bytes), FalseHash)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (self *StateDB) RegisterTicket(contractAddr common.Address, categoryName string) bool {\n\treturn self.registerAddressByState(\"Ticket\", contractAddr, strings.ToUpper(categoryName))\n}\n\nfunc (self *StateDB) GetContrctAddressByTicket(categoryName string) common.Address {\n\treturn self.getContrctAddress(\"Ticket\", strings.ToUpper(categoryName))\n}\n\nfunc (self *StateDB) GetTokenRate(contractAddr common.Address, coinName string) (*big.Int, *big.Int) {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tbytes0, _ := rlp.EncodeToBytes([]interface{}{\"RateToken\", contractAddr, strings.ToUpper(coinName)})\n\t\thash0 := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes0))\n\t\tbytes1, _ := rlp.EncodeToBytes([]interface{}{\"RateTa\", contractAddr, strings.ToUpper(coinName)})\n\t\thash1 := stateObject.GetState(self.db, crypto.Keccak256Hash(bytes1))\n\t\treturn new(big.Int).SetBytes(hash0[:]), new(big.Int).SetBytes(hash1[:])\n\t}\n\treturn new(big.Int), new(big.Int)\n}\n\nfunc (self *StateDB) GetSeroFee(contractAddr *common.Address, tfee *assets.Token) (sfee utils.U256, e error) {\n\ttcurrency := utils.Uint256ToCurrency(&tfee.Currency)\n\tif tcurrency != \"SERO\" {\n\t\tif contractAddr != nil {\n\t\t\tif trate, srate := self.GetTokenRate(*contractAddr, tcurrency); trate.Sign() != 0 && srate.Sign() != 0 {\n\t\t\t\ttvalue := big.Int(tfee.Value)\n\t\t\t\tsfee = utils.U256(*big.NewInt(0).Div(big.NewInt(0).Mul(&tvalue, srate), trate))\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\te = fmt.Errorf(\"current address(%v) can not support the token(%v) fee\", hexutil.Encode(contractAddr[:]), tcurrency)\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\te = fmt.Errorf(\"contractAddr is nil for token(%v) fee\", tcurrency)\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tsfee = tfee.Value\n\t\treturn\n\t}\n}\n\nfunc (self *StateDB) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error) {\n\tif gasPrice == nil || gasPrice.Sign() <= 0 {\n\t\te = errors.New(\"gas must > 0\")\n\t\treturn\n\t}\n\tif sero_fee, err := self.GetSeroFee(to, tfee); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tgaslimit = big.NewInt(0).Div(sero_fee.ToInt(), gasPrice).Uint64()\n\t\treturn\n\t}\n\n}\n\nfunc (self *StateDB) GetTxGasLimit(tx *types.Transaction) (gaslimit uint64, e error) {\n\tif gaslimit, e = self.GetSeroGasLimit(tx.To(), &tx.Stxt().Fee, tx.GasPrice()); e != nil {\n\t\treturn\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *StateDB) SetTokenRate(contractAddr common.Address, coinName string, tokens *big.Int, tas *big.Int) bool {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\n\t\tif (common.Address{}) == (self.GetContrctAddressByToken(coinName)) {\n\t\t\treturn false\n\t\t}\n\t\tbytes0, _ := rlp.EncodeToBytes([]interface{}{\"RateToken\", contractAddr, strings.ToUpper(coinName)})\n\t\tstateObject.SetState(self.db, crypto.Keccak256Hash(bytes0), common.BigToHash(tokens))\n\t\tbytes1, _ := rlp.EncodeToBytes([]interface{}{\"RateTa\", contractAddr, strings.ToUpper(coinName)})\n\t\tstateObject.SetState(self.db, crypto.Keccak256Hash(bytes1), common.BigToHash(tas))\n\t\treturn true\n\t}\n\treturn false\n}\n\n//register\nfunc (self *StateDB) RegisterToken(contractAddr common.Address, coinName string) bool {\n\treturn self.registerAddressByState(\"Token\", contractAddr, strings.ToUpper(coinName))\n}\n\nfunc (self *StateDB) GetContrctAddressByToken(coinName string) common.Address {\n\treturn self.getContrctAddress(\"Token\", strings.ToUpper(coinName))\n}\n\nfunc (self *StateDB) getContrctAddress(name string, key string) common.Address {\n\tkey0, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{0}})\n\tkey1, _ := rlp.EncodeToBytes([]interface{}{name, key, []byte{1}})\n\n\thashKey0 := crypto.Keccak256Hash(key0)\n\thashKey1 := crypto.Keccak256Hash(key1)\n\treturn self.getAddressByState(hashKey0, hashKey1, common.Hash{})\n}\n\nfunc (self *StateDB) getAddressByState(key0, key1, key2 common.Hash) common.Address {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\th0 := stateObject.GetState(self.db, key0)\n\t\th1 := stateObject.GetState(self.db, key1)\n\t\th2 := stateObject.GetState(self.db, key2)\n\n\t\treturn common.BytesToAddress(append(append(h0[:], h1[:]...), h2[:]...))\n\t}\n\treturn common.Address{}\n}\n\nfunc (self *StateDB) AddNonceAddress(key []byte, nonceAddr common.Address) {\n\tkey0 := crypto.Keccak256Hash(append([]byte(\"nonceAddr0\"), key[:]...))\n\tkey1 := crypto.Keccak256Hash(append([]byte(\"nonceAddr1\"), key[:]...))\n\tkey2 := crypto.Keccak256Hash(append([]byte(\"nonceAddr2\"), key[:]...))\n\tself.setAddressByState(key0, key1, key2, nonceAddr)\n}\n\nfunc (self *StateDB) GetNonceAddress(key []byte) common.Address {\n\tkey0 := crypto.Keccak256Hash(append([]byte(\"nonceAddr0\"), key[:]...))\n\tkey1 := crypto.Keccak256Hash(append([]byte(\"nonceAddr1\"), key[:]...))\n\tkey2 := crypto.Keccak256Hash(append([]byte(\"nonceAddr2\"), key[:]...))\n\treturn self.getAddressByState(key0, key1, key2)\n}\n\nfunc (self *StateDB) setAddressByState(key0, key1, key2 common.Hash, address common.Address) {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tstateObject.SetState(self.db, key0, common.BytesToHash(address.Bytes()[0:32]))\n\t\tstateObject.SetState(self.db, key1, common.BytesToHash(address.Bytes()[32:64]))\n\t\tif key2 != (common.Hash{}) {\n\t\t\tstateObject.SetState(self.db, key2, common.BytesToHash(address.Bytes()[64:96]))\n\t\t}\n\t}\n}\n\n// setError remembers the first non-nil error it is called with.\nfunc (self *StateDB) setError(err error) {\n\tif self.dbErr == nil {\n\t\tself.dbErr = err\n\t}\n}\n\nfunc (self *StateDB) Error() error {\n\treturn self.dbErr\n}\n\n// Reset clears out all ephemeral state objects from the state db, but keeps\n// the underlying state trie to avoid reloading data for the next operations.\nfunc (self *StateDB) Reset(root common.Hash) error {\n\ttr, err := self.db.OpenTrie(root)\n\tif err != nil {\n\t\treturn err\n\t}\n\tself.trie = tr\n\tself.stateObjects = make(map[common.Address]*stateObject)\n\tself.stateObjectsDirty = make(map[common.Address]struct{})\n\tself.thash = common.Hash{}\n\tself.bhash = common.Hash{}\n\tself.txIndex = 0\n\tself.logs = make(map[common.Hash][]*types.Log)\n\tself.logSize = 0\n\tself.preimages = make(map[common.Hash][]byte)\n\tself.clearJournalAndRefund()\n\treturn nil\n}\n\nfunc (self *StateDB) AddLog(log *types.Log) {\n\tself.journal.append(addLogChange{txhash: self.thash})\n\n\tlog.TxHash = self.thash\n\tlog.BlockHash = self.bhash\n\tlog.TxIndex = uint(self.txIndex)\n\tlog.Index = self.logSize\n\tself.logs[self.thash] = append(self.logs[self.thash], log)\n\tself.logSize++\n}\n\nfunc (self *StateDB) GetLogs(hash common.Hash) []*types.Log {\n\treturn self.logs[hash]\n}\n\nfunc (self *StateDB) Logs() []*types.Log {\n\tvar logs []*types.Log\n\tfor _, lgs := range self.logs {\n\t\tlogs = append(logs, lgs...)\n\t}\n\treturn logs\n}\n\n// AddPreimage records a SHA3 preimage seen by the VM.\nfunc (self *StateDB) AddPreimage(hash common.Hash, preimage []byte) {\n\tif _, ok := self.preimages[hash]; !ok {\n\t\tself.journal.append(addPreimageChange{hash: hash})\n\t\tpi := make([]byte, len(preimage))\n\t\tcopy(pi, preimage)\n\t\tself.preimages[hash] = pi\n\t}\n}\n\nfunc (self *StateDB) GetContrctNonce() uint64 {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tvalue := stateObject.GetState(self.db, contrctNonceKey)\n\t\treturn new(big.Int).SetBytes(value[:]).Uint64()\n\t}\n\treturn 0\n}\n\nfunc (self *StateDB) IncAndGetContrctNonce() uint64 {\n\tstateObject := self.GetOrNewStateObject(EmptyAddress)\n\tif stateObject != nil {\n\t\tvalue := stateObject.GetState(self.db, contrctNonceKey)\n\t\tnonce := new(big.Int).Add(new(big.Int).SetBytes(value[:]), common.Big1)\n\t\tstateObject.SetState(self.db, contrctNonceKey, common.BigToHash(nonce))\n\t\treturn nonce.Uint64()\n\t}\n\treturn 0\n}\n\n// Preimages returns a list of SHA3 preimages that have been submitted.\nfunc (self *StateDB) Preimages() map[common.Hash][]byte {\n\treturn self.preimages\n}\n\nfunc (self *StateDB) AddRefund(gas uint64) {\n\tself.journal.append(refundChange{prev: self.refund})\n\tself.refund += gas\n}\n\n// Exist reports whether the given account address exists in the state.\n// Notably this also returns true for suicided accounts.\nfunc (self *StateDB) Exist(addr common.Address) bool {\n\treturn self.getStateObject(addr) != nil\n}\n\n// Empty returns whether the state object is either non-existent\n// or empty according to the EIP161 specification (balance = nonce = code = 0)\nfunc (self *StateDB) Empty(addr common.Address) bool {\n\tso := self.getStateObject(addr)\n\treturn so == nil || so.empty()\n}\n\n// Retrieve the balance from the given address or 0 if object not found\nfunc (self *StateDB) GetBalance(addr common.Address, coinName string) *big.Int {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject != nil {\n\t\treturn stateObject.Balance(coinName)\n\t}\n\treturn common.Big0\n}\n\nfunc (self *StateDB) Balances(addr common.Address) map[string]*big.Int {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject != nil {\n\t\treturn stateObject.Balances()\n\t}\n\treturn map[string]*big.Int{}\n}\n\nfunc (self *StateDB) GetCode(addr common.Address) []byte {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject != nil {\n\t\treturn stateObject.Code(self.db)\n\t}\n\treturn nil\n}\n\nfunc (self *StateDB) GetCodeSize(addr common.Address) int {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject == nil {\n\t\treturn 0\n\t}\n\tif stateObject.code != nil {\n\t\treturn len(stateObject.code)\n\t}\n\tsize, err := self.db.ContractCodeSize(stateObject.addrHash, common.BytesToHash(stateObject.CodeHash()))\n\tif err != nil {\n\t\tself.setError(err)\n\t}\n\treturn size\n}\n\nfunc (self *StateDB) GetCodeHash(addr common.Address) common.Hash {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject == nil {\n\t\treturn common.Hash{}\n\t}\n\treturn common.BytesToHash(stateObject.CodeHash())\n}\n\nfunc (self *StateDB) GetState(addr common.Address, bhash common.Hash) common.Hash {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject != nil {\n\t\treturn stateObject.GetState(self.db, bhash)\n\t}\n\treturn common.Hash{}\n}\n\n// Database retrieves the low level database supporting the lower level trie ops.\nfunc (self *StateDB) Database() Database {\n\treturn self.db\n}\n\n// StorageTrie returns the storage trie of an account.\n// The return value is a copy and is nil for non-existent accounts.\nfunc (self *StateDB) StorageTrie(addr common.Address) Trie {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject == nil {\n\t\treturn nil\n\t}\n\tcpy := stateObject.deepCopy(self)\n\treturn cpy.updateTrie(self.db)\n}\n\nfunc (self *StateDB) HasSuicided(addr common.Address) bool {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject != nil {\n\t\treturn stateObject.suicided\n\t}\n\treturn false\n}\n\nfunc (self *StateDB) GetTicketNonce(addr common.Address) uint64 {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject != nil {\n\t\treturn stateObject.TicketNonce()\n\t}\n\n\treturn 0\n}\n\n/*\n * SETTERS\n */\n\nfunc (self *StateDB) SetTicketNonce(addr common.Address, nonce uint64) {\n\tstateObject := self.GetOrNewStateObject(addr)\n\tif stateObject != nil {\n\t\tstateObject.SetTicketNonce(nonce)\n\t}\n}\n\n// AddBalance adds amount to the account associated with addr.\nfunc (self *StateDB) AddBalance(addr common.Address, coinName string, amount *big.Int) {\n\tstateObject := self.GetOrNewStateObject(addr)\n\tif stateObject != nil {\n\t\tstateObject.AddBalance(coinName, amount)\n\t}\n}\n\n// SubBalance subtracts amount from the account associated with addr.\nfunc (self *StateDB) SubBalance(addr common.Address, coinName string, amount *big.Int) {\n\tstateObject := self.GetOrNewStateObject(addr)\n\tif stateObject != nil {\n\t\tstateObject.SubBalance(coinName, amount)\n\t}\n}\n\nfunc (self *StateDB) SetBalance(addr common.Address, coinName string, amount *big.Int) {\n\tstateObject := self.GetOrNewStateObject(addr)\n\tif stateObject != nil {\n\t\tstateObject.SetBalance(coinName, amount)\n\t}\n}\n\nfunc (self *StateDB) SetCode(addr common.Address, code []byte) {\n\tstateObject := self.GetOrNewStateObject(addr)\n\tif stateObject != nil {\n\t\tstateObject.SetCode(crypto.Keccak256Hash(code), code)\n\t}\n}\n\nfunc (self *StateDB) SetState(addr common.Address, key, value common.Hash) {\n\tstateObject := self.GetOrNewStateObject(addr)\n\tif stateObject != nil {\n\t\tstateObject.SetState(self.db, key, value)\n\t}\n}\n\n// Suicide marks the given account as suicided.\n// This clears the account balance.\n//\n// The account's state object is still available until the state is committed,\n// getStateObject will return a non-nil account after Suicide.\nfunc (self *StateDB) Suicide(addr common.Address, toAddr common.Address) bool {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject == nil {\n\t\treturn false\n\t}\n\n\tbooks := []*Book{}\n\tfor _, book := range stateObject.data.Books {\n\t\tbooks = append(books, &Book{book.Balance, book.Currency})\n\t}\n\tself.journal.append(suicideChange{\n\t\taccount:   &addr,\n\t\tprev:      stateObject.suicided,\n\t\tprevBooks: books,\n\t})\n\t//if self.IsContract(toAddr) {\n\t//\ttoStateObject := self.getStateObject(addr)\n\t//\tfor _, book := range books {\n\t//\t\ttoStateObject.AddBalance(book.Currency, book.Balance)\n\t//\t}\n\t//} else {\n\t//\tfor _, book := range books {\n\t//\t\tcurrency := common.BytesToHash(common.LeftPadBytes([]byte(book.Currency), 32))\n\t//\t\tself.GetZState().AddTxOut(toAddr, book.Balance, currency.HashToUint256())\n\t//\t}\n\t//}\n\n\tstateObject.markSuicided()\n\tstateObject.data.Books = []*Book{}\n\tstateObject.data.bookMap = map[string]*Book{}\n\treturn true\n}\n\n//\n// Setting, updating & deleting state object methods.\n//\n\n// updateStateObject writes the given object to the trie.\nfunc (self *StateDB) updateStateObject(stateObject *stateObject) {\n\taddr := stateObject.Address()\n\tdata, err := rlp.EncodeToBytes(stateObject)\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"can't encode object at %x: %v\", addr.Bytes(), err))\n\t}\n\tself.setError(self.trie.TryUpdate(addr.Bytes(), data))\n}\n\n// deleteStateObject removes the given object from the state trie.\nfunc (self *StateDB) deleteStateObject(stateObject *stateObject) {\n\tstateObject.deleted = true\n\taddr := stateObject.Address()\n\tself.setError(self.trie.TryDelete(addr.Bytes()))\n}\n\n// Retrieve a state object given by the address. Returns nil if not found.\nfunc (self *StateDB) getStateObject(addr common.Address) (stateObject *stateObject) {\n\t// Prefer 'live' objects.\n\tif obj := self.stateObjects[addr]; obj != nil {\n\t\tif obj.deleted {\n\t\t\treturn nil\n\t\t}\n\t\treturn obj\n\t}\n\n\t// Load the object from the database.\n\tenc, err := self.trie.TryGet(addr.Bytes())\n\tif len(enc) == 0 {\n\t\tself.setError(err)\n\t\treturn nil\n\t}\n\tvar data Account\n\tif err := rlp.DecodeBytes(enc, &data); err != nil {\n\t\tlog.Error(\"Failed to decode state object\", \"addr\", addr, \"err\", err)\n\t\treturn nil\n\t}\n\t// Insert into the live set.\n\tobj := newObject(self, addr, data)\n\tself.setStateObject(obj)\n\treturn obj\n}\n\nfunc (self *StateDB) setStateObject(object *stateObject) {\n\tself.stateObjects[object.Address()] = object\n}\n\n// Retrieve a state object or create a new state object if nil.\nfunc (self *StateDB) GetOrNewStateObject(addr common.Address) *stateObject {\n\tstateObject := self.getStateObject(addr)\n\tif stateObject == nil || stateObject.deleted {\n\t\tstateObject, _ = self.createObject(addr)\n\t}\n\treturn stateObject\n}\n\n// createObject creates a new state object. If there is an existing account with\n// the given address, it is overwritten and returned as the second return value.\nfunc (self *StateDB) createObject(addr common.Address) (newobj, prev *stateObject) {\n\tprev = self.getStateObject(addr)\n\tnewobj = newObject(self, addr, Account{})\n\t//newobj.setNonce(0) // sets the object to dirty\n\tif prev == nil {\n\t\tself.journal.append(createObjectChange{account: &addr})\n\t} else {\n\t\tself.journal.append(resetObjectChange{prev: prev})\n\t}\n\tself.setStateObject(newobj)\n\treturn newobj, prev\n}\n\n// Carrying over the balance ensures that Ether doesn't disappear.\nfunc (self *StateDB) CreateAccount(addr common.Address) {\n\tself.createObject(addr)\n\n}\n\nfunc (db *StateDB) ForEachOuts(cb func(key, value common.Hash) bool) {\n\tit := trie.NewIterator(db.trie.NodeIterator(nil))\n\tfor it.Next() {\n\t\t// ignore cached values\n\t\tkey := common.BytesToHash(db.trie.GetKey(it.Key))\n\t\tcb(key, common.BytesToHash(it.Value))\n\t}\n}\n\nfunc (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) {\n\tso := db.getStateObject(addr)\n\tif so == nil {\n\t\treturn\n\t}\n\n\t// When iterating over the storage check the cache first\n\tfor h, value := range so.cachedStorage {\n\t\tcb(h, value)\n\t}\n\n\tit := trie.NewIterator(so.getTrie(db.db).NodeIterator(nil))\n\tfor it.Next() {\n\t\t// ignore cached values\n\t\tkey := common.BytesToHash(db.trie.GetKey(it.Key))\n\t\tif _, ok := so.cachedStorage[key]; !ok {\n\t\t\tcb(key, common.BytesToHash(it.Value))\n\t\t}\n\t}\n}\n\nfunc (self *StateDB) CopyWithNoZState() *StateDB {\n\tstate := self.Copy()\n\tstate.zstate = nil\n\treturn state\n}\n\n// Copy creates a deep, independent copy of the state.\n// Snapshots of the copied state cannot be applied to the copy.\nfunc (self *StateDB) Copy() *StateDB {\n\tself.lock.Lock()\n\tdefer self.lock.Unlock()\n\n\t// Copy all the basic fields, initialize the memory ones\n\tstate := &StateDB{\n\t\troot:              self.root,\n\t\tdb:                self.db,\n\t\ttrie:              self.db.CopyTrie(self.trie),\n\t\tstateObjects:      make(map[common.Address]*stateObject, len(self.journal.dirties)),\n\t\tstateObjectsDirty: make(map[common.Address]struct{}, len(self.journal.dirties)),\n\t\tzstate:            self.zstate.Copy(),\n\t\trefund:            self.refund,\n\t\tlogs:              make(map[common.Hash][]*types.Log, len(self.logs)),\n\t\tlogSize:           self.logSize,\n\t\tpreimages:         make(map[common.Hash][]byte),\n\t\tjournal:           newJournal(),\n\t\tnumber:            self.number,\n\t}\n\tif self.stakeState != nil {\n\t\tstate.stakeState = self.stakeState.Copy(&zeroDB{state})\n\t}\n\t// Copy the dirty states, logs, and preimages\n\tfor addr := range self.journal.dirties {\n\t\t// As documented [here](https://github.com/sero-cash/go-sero/pull/16485#issuecomment-380438527),\n\t\t// and in the Finalise-method, there is a case where an object is in the journal but not\n\t\t// in the stateObjects: OOG after touch on ripeMD prior to AutumnTwilight. Thus, we need to check for\n\t\t// nil\n\t\tif object, exist := self.stateObjects[addr]; exist {\n\t\t\tstate.stateObjects[addr] = object.deepCopy(state)\n\t\t\tstate.stateObjectsDirty[addr] = struct{}{}\n\t\t}\n\t}\n\t// Above, we don't copy the actual journal. This means that if the copy is copied, the\n\t// loop above will be a no-op, since the copy's journal is empty.\n\t// Thus, here we iterate over stateObjects, to enable copies of copies\n\tfor addr := range self.stateObjectsDirty {\n\t\tif _, exist := state.stateObjects[addr]; !exist {\n\t\t\tstate.stateObjects[addr] = self.stateObjects[addr].deepCopy(state)\n\t\t\tstate.stateObjectsDirty[addr] = struct{}{}\n\t\t}\n\t}\n\n\tfor hash, logs := range self.logs {\n\t\tstate.logs[hash] = make([]*types.Log, len(logs))\n\t\tcopy(state.logs[hash], logs)\n\t}\n\tfor hash, preimage := range self.preimages {\n\t\tstate.preimages[hash] = preimage\n\t}\n\treturn state\n}\n\n// Snapshot returns an identifier for the current revision of the state.\nfunc (self *StateDB) Snapshot() int {\n\tid := self.nextRevisionId\n\tself.nextRevisionId++\n\tself.validRevisions = append(self.validRevisions, revision{id, self.journal.length()})\n\tself.GetStakeCons().CreateSnapshot(id)\n\tself.NextZState().Snapshot(id)\n\treturn id\n}\n\n// RevertToSnapshot reverts all state changes made since the given revision.\nfunc (self *StateDB) RevertToSnapshot(revid int) {\n\t// Find the snapshot in the stack of valid snapshots.\n\tidx := sort.Search(len(self.validRevisions), func(i int) bool {\n\t\treturn self.validRevisions[i].id >= revid\n\t})\n\tif idx == len(self.validRevisions) || self.validRevisions[idx].id != revid {\n\t\tpanic(fmt.Errorf(\"revision id %v cannot be reverted\", revid))\n\t}\n\tsnapshot := self.validRevisions[idx].journalIndex\n\n\t// Replay the journal to undo changes and remove invalidated snapshots\n\tself.journal.revert(self, snapshot)\n\tself.validRevisions = self.validRevisions[:idx]\n\n\tself.GetStakeCons().RevertToSnapshot(revid)\n\tself.NextZState().Revert(revid)\n}\n\n// GetRefund returns the current value of the refund counter.\nfunc (self *StateDB) GetRefund() uint64 {\n\treturn self.refund\n}\n\n// Finalise finalises the state by removing the self destructed objects\n// and clears the journal as well as the refunds.\nfunc (s *StateDB) Finalise(deleteEmptyObjects bool) {\n\tfor addr := range s.journal.dirties {\n\t\tstateObject, exist := s.stateObjects[addr]\n\t\tif !exist {\n\t\t\t// ripeMD is 'touched' at block 1714175, in tx 0x1237f737031e40bcde4a8b7e717b2d15e3ecadfe49bb1bbc71ee9deb09c6fcf2\n\t\t\t// That tx goes out of gas, and although the notion of 'touched' does not exist there, the\n\t\t\t// touch-event will still be recorded in the journal. Since ripeMD is a special snowflake,\n\t\t\t// it will persist in the journal even though the journal is reverted. In this special circumstance,\n\t\t\t// it may exist in `s.journal.dirties` but not in `s.stateObjects`.\n\t\t\t// Thus, we can safely ignore it here\n\t\t\tcontinue\n\t\t}\n\n\t\tif stateObject.suicided || (deleteEmptyObjects && stateObject.empty()) {\n\t\t\ts.deleteStateObject(stateObject)\n\t\t} else {\n\t\t\tstateObject.updateRoot(s.db)\n\t\t\ts.updateStateObject(stateObject)\n\t\t}\n\t\ts.stateObjectsDirty[addr] = struct{}{}\n\t}\n\t// Invalidate journal because reverting across transactions is not allowed.\n\ts.clearJournalAndRefund()\n}\n\n// IntermediateRoot computes the current root hash of the state trie.\n// It is called in between transactions to get the root hash that\n// goes into transaction receipts.\nfunc (s *StateDB) IntermediateRoot(deleteEmptyObjects bool) common.Hash {\n\ts.NextZState().Update()\n\ts.GetStakeCons().Update()\n\ts.Finalise(deleteEmptyObjects)\n\treturn s.trie.Hash()\n}\n\n// Prepare sets the current transaction hash and index and block hash which is\n// used when the EVM emits new state logs.\nfunc (self *StateDB) Prepare(thash, bhash common.Hash, ti int) {\n\tself.thash = thash\n\tself.bhash = bhash\n\tself.txIndex = ti\n}\n\nfunc (s *StateDB) clearJournalAndRefund() {\n\ts.journal = newJournal()\n\ts.validRevisions = s.validRevisions[:0]\n\ts.refund = 0\n}\n\n// Commit writes the state to the underlying in-memory trie database.\nfunc (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) {\n\tdefer s.clearJournalAndRefund()\n\n\tfor addr := range s.journal.dirties {\n\t\ts.stateObjectsDirty[addr] = struct{}{}\n\t}\n\n\t// Commit objects to the trie.\n\tfor addr, stateObject := range s.stateObjects {\n\t\t_, isDirty := s.stateObjectsDirty[addr]\n\t\tswitch {\n\t\tcase stateObject.suicided || (isDirty && deleteEmptyObjects && stateObject.empty()):\n\t\t\t// If the object has been removed, don't bother syncing it\n\t\t\t// and just mark it for deletion in the trie.\n\t\t\ts.deleteStateObject(stateObject)\n\t\tcase isDirty:\n\t\t\t// Write any contract code associated with the state object\n\t\t\tif stateObject.code != nil && stateObject.dirtyCode {\n\t\t\t\ts.db.TrieDB().InsertBlob(common.BytesToHash(stateObject.CodeHash()), stateObject.code)\n\t\t\t\tstateObject.dirtyCode = false\n\t\t\t}\n\t\t\t// Write any storage changes in the state object to its storage trie.\n\t\t\tif err := stateObject.CommitTrie(s.db); err != nil {\n\t\t\t\treturn common.Hash{}, err\n\t\t\t}\n\t\t\t// Update the object in the main account trie.\n\t\t\ts.updateStateObject(stateObject)\n\t\t}\n\t\tdelete(s.stateObjectsDirty, addr)\n\t}\n\n\t// Write trie changes.\n\troot, err = s.trie.Commit(s.leafCallback)\n\n\tlog.Debug(\"Trie cache stats after commit\", \"misses\", trie.CacheMisses(), \"unloads\", trie.CacheUnloads())\n\treturn root, err\n}\n\nfunc (s *StateDB) leafCallback(leaf []byte, parent common.Hash) error {\n\tvar account Account\n\tif err := rlp.DecodeBytes(leaf, &account); err != nil {\n\t\treturn nil\n\t}\n\tif account.Root != emptyState {\n\t\ts.db.TrieDB().Reference(account.Root, parent)\n\t}\n\tcode := common.BytesToHash(account.CodeHash)\n\tif code != emptyCode {\n\t\ts.db.TrieDB().Reference(code, parent)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "core/state/statedb4zero.go",
    "content": "package state\n\nimport (\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/consensus\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n)\n\ntype StateDbPut interface {\n\tPut(key, value []byte) error\n}\ntype StateTri struct {\n\tdb    *StateDB\n\tTri   Trie\n\tDbget serodb.Getter\n\tDbput serodb.Putter\n}\n\nfunc (self *StateTri) TryGet(key []byte) ([]byte, error) {\n\treturn self.Tri.TryGet(key)\n}\n\nfunc (self *StateTri) TryUpdate(key, value []byte) error {\n\treturn self.Tri.TryUpdate(key, value)\n}\n\nfunc (self *StateTri) SetState(obj *c_type.PKr, key *c_type.Uint256, value *c_type.Uint256) {\n\tvar addr common.Address\n\tif obj != nil {\n\t\tcopy(addr[:], obj[:])\n\t} else {\n\t\taddr = EmptyAddress\n\t}\n\tself.db.SetState(addr, common.Hash(*key), common.Hash(*value))\n}\nfunc (self *StateTri) GetState(obj *c_type.PKr, key *c_type.Uint256) (ret c_type.Uint256) {\n\tvar addr common.Address\n\tif obj != nil {\n\t\tcopy(addr[:], obj[:])\n\t} else {\n\t\taddr = EmptyAddress\n\t}\n\tv := self.db.GetState(addr, common.Hash(*key))\n\tret = c_type.Uint256(v)\n\treturn\n}\n\nfunc (self *StateTri) TryGlobalGet(key []byte) ([]byte, error) {\n\treturn self.Dbget.Get(key)\n}\n\nfunc (self *StateTri) TryGlobalPut(key, value []byte) error {\n\treturn self.Dbput.Put(key, value)\n}\n\nfunc (self *StateTri) GlobalGetter() serodb.Getter {\n\treturn self.Dbget\n}\n\nfunc (self *StateDB) CurrentZState() *zstate.ZState {\n\tif self.number < 0 {\n\t\tpanic(errors.New(\"Current ZState height num must >= 0\"))\n\t}\n\n\tif self.zstate == nil {\n\t\tst := StateTri{\n\t\t\tself,\n\t\t\tself.trie,\n\t\t\tself.db.TrieDB().DiskDB(),\n\t\t\tself.db.TrieDB().WDiskDB(),\n\t\t}\n\t\tself.zstate = zstate.CurrentState(&st, uint64(self.number))\n\t}\n\treturn self.zstate\n}\n\nfunc (self *StateDB) NextZState() *zstate.ZState {\n\tif self.number < -1 {\n\t\tpanic(errors.New(\"Next ZState height num must >= -1\"))\n\t}\n\tif self.zstate == nil {\n\t\tst := StateTri{\n\t\t\tself,\n\t\t\tself.trie,\n\t\t\tself.db.TrieDB().DiskDB(),\n\t\t\tself.db.TrieDB().WDiskDB(),\n\t\t}\n\t\tself.zstate = zstate.NextState(&st, self.number)\n\t}\n\treturn self.zstate\n}\n\ntype zeroDB struct {\n\tdb *StateDB\n}\n\nfunc (self *zeroDB) CurrentTri() serodb.Tri {\n\treturn self.db.trie\n}\n\nfunc (self *zeroDB) GlobalGetter() serodb.Getter {\n\treturn self.db.db.TrieDB().DiskDB()\n}\n\nvar StakeDB = consensus.DBObj{\"STAKE$BLOCK$INDEX\"}\n\nfunc (self *StateDB) GetStakeCons() *consensus.Cons {\n\tif self.stakeState == nil {\n\t\tcons := consensus.NewCons(&zeroDB{self}, StakeDB.Pre)\n\t\tself.stakeState = &cons\n\t}\n\treturn self.stakeState\n}\n"
  },
  {
    "path": "core/state/statedb_test.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\t\"testing/quick\"\n\n\t\"github.com/sero-cash/go-czero-import/cpt\"\n\n\t\"gopkg.in/check.v1\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Tests that updating a state trie does not leak any database writes prior to\n// actually committing the state.\nfunc TestUpdateLeaks(t *testing.T) {\n\t// Create an empty state database\n\tdb := serodb.NewMemDatabase()\n\tstate, _ := New(NewDatabase(db), nil)\n\n\t// Update it with some accounts\n\tfor i := byte(0); i < 255; i++ {\n\t\taddr := common.BytesToAddress([]byte{i})\n\t\tstate.AddBalance(addr, \"sero\", big.NewInt(int64(11*i)))\n\t\tif i%2 == 0 {\n\t\t\tstate.SetState(addr, common.BytesToHash([]byte{i, i, i}), common.BytesToHash([]byte{i, i, i, i}))\n\t\t}\n\t\tif i%3 == 0 {\n\t\t\tstate.SetCode(addr, []byte{i, i, i, i, i})\n\t\t}\n\t\tstate.IntermediateRoot(false)\n\t}\n\t// Ensure that no data was leaked into the database\n\tfor _, key := range db.Keys() {\n\t\tvalue, _ := db.Get(key)\n\t\tt.Errorf(\"State leaked into database: %x -> %x\", key, value)\n\t}\n}\n\n// Tests that no intermediate state of an object is stored into the database,\n// only the one right before the commit.\nfunc TestIntermediateLeaks(t *testing.T) {\n\t// Create two state databases, one transitioning to the final state, the other final from the beginning\n\ttransDb := serodb.NewMemDatabase()\n\tfinalDb := serodb.NewMemDatabase()\n\ttransState, _ := New(NewDatabase(transDb), nil)\n\tfinalState, _ := New(NewDatabase(finalDb), nil)\n\n\tmodify := func(state *StateDB, addr common.Address, i, tweak byte) {\n\t\tstate.SetBalance(addr, \"sero\", big.NewInt(int64(11*i)+int64(tweak)))\n\t\tif i%2 == 0 {\n\t\t\tstate.SetState(addr, common.Hash{i, i, i, 0}, common.Hash{})\n\t\t\tstate.SetState(addr, common.Hash{i, i, i, tweak}, common.Hash{i, i, i, i, tweak})\n\t\t}\n\t\tif i%3 == 0 {\n\t\t\tstate.SetCode(addr, []byte{i, i, i, i, i, tweak})\n\t\t}\n\t}\n\n\t// Modify the transient state.\n\tfor i := byte(0); i < 255; i++ {\n\t\tmodify(transState, common.BytesToAddress([]byte{byte(i)}), i, 0)\n\t}\n\t// Write modifications to trie.\n\ttransState.IntermediateRoot(false)\n\n\t// Overwrite all the data with new values in the transient database.\n\tfor i := byte(0); i < 255; i++ {\n\t\tmodify(transState, common.BytesToAddress([]byte{byte(i)}), i, 99)\n\t\tmodify(finalState, common.BytesToAddress([]byte{byte(i)}), i, 99)\n\t}\n\n\t// Commit and cross check the databases.\n\tif _, err := transState.Commit(false); err != nil {\n\t\tt.Fatalf(\"failed to commit transition state: %v\", err)\n\t}\n\tif _, err := finalState.Commit(false); err != nil {\n\t\tt.Fatalf(\"failed to commit final state: %v\", err)\n\t}\n\tfor _, key := range finalDb.Keys() {\n\t\tif _, err := transDb.Get(key); err != nil {\n\t\t\tval, _ := finalDb.Get(key)\n\t\t\tt.Errorf(\"entry missing from the transition database: %x -> %x\", key, val)\n\t\t}\n\t}\n\tfor _, key := range transDb.Keys() {\n\t\tif _, err := finalDb.Get(key); err != nil {\n\t\t\tval, _ := transDb.Get(key)\n\t\t\tt.Errorf(\"extra entry in the transition database: %x -> %x\", key, val)\n\t\t}\n\t}\n}\n\n// TestCopy tests that copying a statedb object indeed makes the original and\n// the copy independent of each other. This test is a regression test against\n// https://github.com/sero-cash/go-sero/pull/15549.\nfunc TestCopy(t *testing.T) {\n\t// Create a random state test to copy and modify \"independently\"\n\torig, _ := New(NewDatabase(serodb.NewMemDatabase()), nil)\n\n\tfor i := byte(0); i < 255; i++ {\n\t\tobj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i}))\n\t\tobj.AddBalance(\"sero\", big.NewInt(int64(i)))\n\t\torig.updateStateObject(obj)\n\t}\n\torig.Finalise(false)\n\n\t// Copy the state, modify both in-memory\n\tcopy := orig.Copy()\n\n\tfor i := byte(0); i < 255; i++ {\n\t\torigObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i}))\n\t\tcopyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i}))\n\n\t\torigObj.AddBalance(\"sero\", big.NewInt(2*int64(i)))\n\t\tcopyObj.AddBalance(\"sero\", big.NewInt(3*int64(i)))\n\n\t\torig.updateStateObject(origObj)\n\t\tcopy.updateStateObject(copyObj)\n\t}\n\t// Finalise the changes on both concurrently\n\tdone := make(chan struct{})\n\tgo func() {\n\t\torig.Finalise(true)\n\t\tclose(done)\n\t}()\n\tcopy.Finalise(true)\n\t<-done\n\n\t// Verify that the two states have been updated independently\n\tfor i := byte(0); i < 255; i++ {\n\t\torigObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i}))\n\t\tcopyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i}))\n\n\t\tif want := big.NewInt(3 * int64(i)); origObj.Balance(\"sero\").Cmp(want) != 0 {\n\t\t\tt.Errorf(\"orig obj %d: balance mismatch: have %v, want %v\", i, origObj.Balance(\"sero\"), want)\n\t\t}\n\t\tif want := big.NewInt(4 * int64(i)); copyObj.Balance(\"sero\").Cmp(want) != 0 {\n\t\t\tt.Errorf(\"copy obj %d: balance mismatch: have %v, want %v\", i, copyObj.Balance(\"sero\"), want)\n\t\t}\n\t}\n}\n\nfunc TestSnapshotRandom(t *testing.T) {\n\tcpt.ZeroInit_NoCircuit()\n\tconfig := &quick.Config{MaxCount: 1000}\n\terr := quick.Check((*snapshotTest).run, config)\n\tif cerr, ok := err.(*quick.CheckError); ok {\n\t\ttest := cerr.In[0].(*snapshotTest)\n\t\tt.Errorf(\"%v:\\n%s\", test.err, test)\n\t} else if err != nil {\n\t\tt.Error(err)\n\t}\n}\n\n// A snapshotTest checks that reverting StateDB snapshots properly undoes all changes\n// captured by the snapshot. Instances of this test with pseudorandom content are created\n// by Generate.\n//\n// The test works as follows:\n//\n// A new state is created and all actions are applied to it. Several snapshots are taken\n// in between actions. The test then reverts each snapshot. For each snapshot the actions\n// leading up to it are replayed on a fresh, empty state. The behaviour of all public\n// accessor methods on the reverted state must match the return value of the equivalent\n// methods on the replayed state.\ntype snapshotTest struct {\n\taddrs     []common.Address // all account addresses\n\tactions   []testAction     // modifications to the state\n\tsnapshots []int            // actions indexes at which snapshot is taken\n\terr       error            // failure details are reported through this field\n}\n\ntype testAction struct {\n\tname   string\n\tfn     func(testAction, *StateDB)\n\targs   []int64\n\tnoAddr bool\n}\n\n// newTestAction creates a random action that changes state.\nfunc newTestAction(addr common.Address, r *rand.Rand) testAction {\n\tactions := []testAction{\n\t\t{\n\t\t\tname: \"SetBalance\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\ts.SetBalance(addr, \"sero\", big.NewInt(a.args[0]))\n\t\t\t},\n\t\t\targs: make([]int64, 1),\n\t\t},\n\t\t{\n\t\t\tname: \"AddBalance\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\ts.AddBalance(addr, \"sero\", big.NewInt(a.args[0]))\n\t\t\t},\n\t\t\targs: make([]int64, 1),\n\t\t},\n\t\t{\n\t\t\tname: \"SetState\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\tvar key, val common.Hash\n\t\t\t\tbinary.BigEndian.PutUint16(key[:], uint16(a.args[0]))\n\t\t\t\tbinary.BigEndian.PutUint16(val[:], uint16(a.args[1]))\n\t\t\t\ts.SetState(addr, key, val)\n\t\t\t},\n\t\t\targs: make([]int64, 2),\n\t\t},\n\t\t{\n\t\t\tname: \"SetCode\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\tcode := make([]byte, 16)\n\t\t\t\tbinary.BigEndian.PutUint64(code, uint64(a.args[0]))\n\t\t\t\tbinary.BigEndian.PutUint64(code[8:], uint64(a.args[1]))\n\t\t\t\ts.SetCode(addr, code)\n\t\t\t},\n\t\t\targs: make([]int64, 2),\n\t\t},\n\t\t{\n\t\t\tname: \"CreateAccount\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\ts.CreateAccount(addr)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Suicide\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\ts.Suicide(addr, common.Address{})\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"AddRefund\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\ts.AddRefund(uint64(a.args[0]))\n\t\t\t},\n\t\t\targs:   make([]int64, 1),\n\t\t\tnoAddr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"AddLog\",\n\t\t\tfn: func(a testAction, s *StateDB) {\n\t\t\t\tdata := make([]byte, 2)\n\t\t\t\tbinary.BigEndian.PutUint16(data, uint16(a.args[0]))\n\t\t\t\ts.AddLog(&types.Log{Address: addr, Data: data})\n\t\t\t},\n\t\t\targs: make([]int64, 1),\n\t\t},\n\t}\n\taction := actions[r.Intn(len(actions))]\n\tvar nameargs []string\n\tif !action.noAddr {\n\t\tnameargs = append(nameargs, addr.Base58())\n\t}\n\tfor _, i := range action.args {\n\t\taction.args[i] = rand.Int63n(100)\n\t\tnameargs = append(nameargs, fmt.Sprint(action.args[i]))\n\t}\n\taction.name += strings.Join(nameargs, \", \")\n\treturn action\n}\n\n// Generate returns a new snapshot test of the given size. All randomness is\n// derived from r.\nfunc (*snapshotTest) Generate(r *rand.Rand, size int) reflect.Value {\n\t// Generate random actions.\n\taddrs := make([]common.Address, 50)\n\n\tfor i := range addrs {\n\t\taddrs[i] = common.BytesToAddress([]byte{byte(i)})\n\t}\n\tactions := make([]testAction, size)\n\tfor i := range actions {\n\t\taddr := addrs[r.Intn(len(addrs))]\n\t\tactions[i] = newTestAction(addr, r)\n\t}\n\t// Generate snapshot indexes.\n\tnsnapshots := int(math.Sqrt(float64(size)))\n\tif size > 0 && nsnapshots == 0 {\n\t\tnsnapshots = 1\n\t}\n\tsnapshots := make([]int, nsnapshots)\n\tsnaplen := len(actions) / nsnapshots\n\tfor i := range snapshots {\n\t\t// Try to place the snapshots some number of actions apart from each other.\n\t\tsnapshots[i] = (i * snaplen) + r.Intn(snaplen)\n\t}\n\treturn reflect.ValueOf(&snapshotTest{addrs, actions, snapshots, nil})\n}\n\nfunc (test *snapshotTest) String() string {\n\tout := new(bytes.Buffer)\n\tsindex := 0\n\tfor i, action := range test.actions {\n\t\tif len(test.snapshots) > sindex && i == test.snapshots[sindex] {\n\t\t\tfmt.Fprintf(out, \"---- snapshot %d ----\\n\", sindex)\n\t\t\tsindex++\n\t\t}\n\t\tfmt.Fprintf(out, \"%4d: %s\\n\", i, action.name)\n\t}\n\treturn out.String()\n}\n\nfunc (test *snapshotTest) run() bool {\n\t// Run all actions and create snapshots.\n\tvar (\n\t\tstate, _     = New(NewDatabase(serodb.NewMemDatabase()), nil)\n\t\tsnapshotRevs = make([]int, len(test.snapshots))\n\t\tsindex       = 0\n\t)\n\tfor i, action := range test.actions {\n\t\tif len(test.snapshots) > sindex && i == test.snapshots[sindex] {\n\t\t\tsnapshotRevs[sindex] = state.Snapshot()\n\t\t\tsindex++\n\t\t}\n\t\taction.fn(action, state)\n\t}\n\t// Revert all snapshots in reverse order. Each revert must yield a state\n\t// that is equivalent to fresh state with all actions up the snapshot applied.\n\tfor sindex--; sindex >= 0; sindex-- {\n\t\tcheckstate, _ := New(state.Database(), nil)\n\t\tfor _, action := range test.actions[:test.snapshots[sindex]] {\n\t\t\taction.fn(action, checkstate)\n\t\t}\n\t\tstate.RevertToSnapshot(snapshotRevs[sindex])\n\t\tif err := test.checkEqual(state, checkstate); err != nil {\n\t\t\ttest.err = fmt.Errorf(\"state mismatch after revert to snapshot %d\\n%v\", sindex, err)\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// checkEqual checks that methods of state and checkstate return the same values.\nfunc (test *snapshotTest) checkEqual(state, checkstate *StateDB) error {\n\tfor _, addr := range test.addrs {\n\t\tvar err error\n\t\tcheckeq := func(op string, a, b interface{}) bool {\n\t\t\tif err == nil && !reflect.DeepEqual(a, b) {\n\t\t\t\terr = fmt.Errorf(\"got %s(%s) == %v, want %v\", op, addr.Base58(), a, b)\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t\t// Check basic accessor methods.\n\t\tcheckeq(\"Exist\", state.Exist(addr), checkstate.Exist(addr))\n\t\tcheckeq(\"HasSuicided\", state.HasSuicided(addr), checkstate.HasSuicided(addr))\n\t\tcheckeq(\"GetBalance\", state.GetBalance(addr, \"sero\"), checkstate.GetBalance(addr, \"sero\"))\n\t\tcheckeq(\"GetCode\", state.GetCode(addr), checkstate.GetCode(addr))\n\t\tcheckeq(\"GetCodeHash\", state.GetCodeHash(addr), checkstate.GetCodeHash(addr))\n\t\tcheckeq(\"GetCodeSize\", state.GetCodeSize(addr), checkstate.GetCodeSize(addr))\n\t\t// Check storage.\n\t\tif obj := state.getStateObject(addr); obj != nil {\n\t\t\tstate.ForEachStorage(addr, func(key, val common.Hash) bool {\n\t\t\t\treturn checkeq(\"GetState(\"+key.Hex()+\")\", val, checkstate.GetState(addr, key))\n\t\t\t})\n\t\t\tcheckstate.ForEachStorage(addr, func(key, checkval common.Hash) bool {\n\t\t\t\treturn checkeq(\"GetState(\"+key.Hex()+\")\", state.GetState(addr, key), checkval)\n\t\t\t})\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif state.GetRefund() != checkstate.GetRefund() {\n\t\treturn fmt.Errorf(\"got GetRefund() == %d, want GetRefund() == %d\",\n\t\t\tstate.GetRefund(), checkstate.GetRefund())\n\t}\n\tif !reflect.DeepEqual(state.GetLogs(common.Hash{}), checkstate.GetLogs(common.Hash{})) {\n\t\treturn fmt.Errorf(\"got GetLogs(common.Hash{}) == %v, want GetLogs(common.Hash{}) == %v\",\n\t\t\tstate.GetLogs(common.Hash{}), checkstate.GetLogs(common.Hash{}))\n\t}\n\treturn nil\n}\n\nfunc (s *StateSuite) TestTouchDelete(c *check.C) {\n\ts.state.GetOrNewStateObject(common.Address{})\n\troot, _ := s.state.Commit(false)\n\ts.state.Reset(root)\n\n\tsnapshot := s.state.Snapshot()\n\ts.state.AddBalance(common.Address{}, \"sero\", new(big.Int))\n\n\tif len(s.state.journal.dirties) != 1 {\n\t\tc.Fatal(\"expected one dirty state object\")\n\t}\n\ts.state.RevertToSnapshot(snapshot)\n\tif len(s.state.journal.dirties) != 0 {\n\t\tc.Fatal(\"expected no dirty state object\")\n\t}\n}\n\n// TestCopyOfCopy tests that modified objects are carried over to the copy, and the copy of the copy.\n// See https://github.com/sero-cash/go-sero/pull/15225#issuecomment-380191512\nfunc TestCopyOfCopy(t *testing.T) {\n\tsdb, _ := New(NewDatabase(serodb.NewMemDatabase()), nil)\n\taddr := common.Base58ToAddress(\"aaaa\")\n\tsdb.SetBalance(addr, \"sero\", big.NewInt(42))\n\n\tif got := sdb.Copy().GetBalance(addr, \"sero\").Uint64(); got != 42 {\n\t\tt.Fatalf(\"1st copy fail, expected 42, got %v\", got)\n\t}\n\tif got := sdb.Copy().Copy().GetBalance(addr, \"sero\").Uint64(); got != 42 {\n\t\tt.Fatalf(\"2nd copy fail, expected 42, got %v\", got)\n\t}\n}\n"
  },
  {
    "path": "core/state/sync.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"bytes\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\n\n// NewStateSync create a new state trie download scheduler.\nfunc NewStateSync(root common.Hash, database trie.DatabaseReader) *trie.Sync {\n\tvar syncer *trie.Sync\n\tcallback := func(leaf []byte, parent common.Hash) error {\n\t\tif len(leaf)>=70 {\n\t\t\tvar obj Account\n\t\t\tif err := rlp.Decode(bytes.NewReader(leaf), &obj); err != nil {\n\t\t\t\treturn nil\n\t\t\t} else {\n\t\t\t\tsyncer.AddSubTrie(obj.Root, 64, parent, nil)\n\t\t\t\tsyncer.AddRawEntry(common.BytesToHash(obj.CodeHash), 64, parent)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\tsyncer = trie.NewSync(root, database, callback)\n\treturn syncer\n}\n"
  },
  {
    "path": "core/state/sync_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage state\n\nimport (\n\t\"bytes\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\n// testAccount is the data associated with an account used by the state tests.\ntype testAccount struct {\n\taddress common.Address\n\tbalance *big.Int\n\tnonce   uint64\n\tcode    []byte\n}\n\n// makeTestState create a sample test state to test node-wise reconstruction.\nfunc makeTestState() (Database, common.Hash, []*testAccount) {\n\t// Create an empty state\n\tdb := NewDatabase(serodb.NewMemDatabase())\n\tstate, _ := New(db, nil)\n\n\t// Fill it with some arbitrary data\n\taccounts := []*testAccount{}\n\tfor i := byte(0); i < 96; i++ {\n\t\tobj := state.GetOrNewStateObject(common.BytesToAddress([]byte{i}))\n\t\tacc := &testAccount{address: common.BytesToAddress([]byte{i})}\n\n\t\tobj.AddBalance(\"sero\", big.NewInt(int64(11*i)))\n\t\tacc.balance = big.NewInt(int64(11 * i))\n\n\t\tacc.nonce = uint64(42 * i)\n\n\t\tif i%3 == 0 {\n\t\t\tobj.SetCode(crypto.Keccak256Hash([]byte{i, i, i, i, i}), []byte{i, i, i, i, i})\n\t\t\tacc.code = []byte{i, i, i, i, i}\n\t\t}\n\t\tstate.updateStateObject(obj)\n\t\taccounts = append(accounts, acc)\n\t}\n\troot, _ := state.Commit(false)\n\n\t// Return the generated state\n\treturn db, root, accounts\n}\n\n// checkStateAccounts cross references a reconstructed state with an expected\n// account array.\nfunc checkStateAccounts(t *testing.T, db serodb.Database, root common.Hash, accounts []*testAccount) {\n\t// Check root availability and state contents\n\tstate, err := New(NewDatabase(db), nil)\n\tif err != nil {\n\t\tt.Fatalf(\"failed to create state trie at %x: %v\", root, err)\n\t}\n\tif err := checkStateConsistency(db, root); err != nil {\n\t\tt.Fatalf(\"inconsistent state trie at %x: %v\", root, err)\n\t}\n\tfor i, acc := range accounts {\n\t\tif balance := state.GetBalance(acc.address, \"sero\"); balance.Cmp(acc.balance) != 0 {\n\t\t\tt.Errorf(\"account %d: balance mismatch: have %v, want %v\", i, balance, acc.balance)\n\t\t}\n\n\t\tif code := state.GetCode(acc.address); !bytes.Equal(code, acc.code) {\n\t\t\tt.Errorf(\"account %d: code mismatch: have %x, want %x\", i, code, acc.code)\n\t\t}\n\t}\n}\n\n// checkTrieConsistency checks that all nodes in a (sub-)trie are indeed present.\nfunc checkTrieConsistency(db serodb.Database, root common.Hash) error {\n\tif v, _ := db.Get(root[:]); v == nil {\n\t\treturn nil // Consider a non existent state consistent.\n\t}\n\ttrie, err := trie.New(root, trie.NewDatabase(db))\n\tif err != nil {\n\t\treturn err\n\t}\n\tit := trie.NodeIterator(nil)\n\tfor it.Next(true) {\n\t}\n\treturn it.Error()\n}\n\n// checkStateConsistency checks that all data of a state root is present.\nfunc checkStateConsistency(db serodb.Database, root common.Hash) error {\n\t// Create and iterate a state trie rooted in a sub-node\n\tif _, err := db.Get(root.Bytes()); err != nil {\n\t\treturn nil // Consider a non existent state consistent.\n\t}\n\tstate, err := New(NewDatabase(db), nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\tit := NewNodeIterator(state)\n\tfor it.Next() {\n\t}\n\treturn it.Error\n}\n\n// Tests that an empty state is not scheduled for syncing.\nfunc TestEmptyStateSync(t *testing.T) {\n\tempty := common.HexToHash(\"56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421\")\n\tif req := NewStateSync(empty, serodb.NewMemDatabase()).Missing(1); len(req) != 0 {\n\t\tt.Errorf(\"content requested for empty state: %v\", req)\n\t}\n}\n\n// Tests that given a root hash, a state can sync iteratively on a single thread,\n// requesting retrieval tasks and returning all of them in one go.\nfunc TestIterativeStateSyncIndividual(t *testing.T) { testIterativeStateSync(t, 1) }\nfunc TestIterativeStateSyncBatched(t *testing.T)    { testIterativeStateSync(t, 100) }\n\nfunc testIterativeStateSync(t *testing.T, batch int) {\n\t// Create a random state to copy\n\tsrcDb, srcRoot, srcAccounts := makeTestState()\n\n\t// Create a destination state and sync with the scheduler\n\tdstDb := serodb.NewMemDatabase()\n\tsched := NewStateSync(srcRoot, dstDb)\n\n\tqueue := append([]common.Hash{}, sched.Missing(batch)...)\n\tfor len(queue) > 0 {\n\t\tresults := make([]trie.SyncResult, len(queue))\n\t\tfor i, hash := range queue {\n\t\t\tdata, err := srcDb.TrieDB().Node(hash)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to retrieve node data for %x\", hash)\n\t\t\t}\n\t\t\tresults[i] = trie.SyncResult{Hash: hash, Data: data}\n\t\t}\n\t\tif _, index, err := sched.Process(results); err != nil {\n\t\t\tt.Fatalf(\"failed to process result #%d: %v\", index, err)\n\t\t}\n\t\tif index, err := sched.Commit(dstDb); err != nil {\n\t\t\tt.Fatalf(\"failed to commit data #%d: %v\", index, err)\n\t\t}\n\t\tqueue = append(queue[:0], sched.Missing(batch)...)\n\t}\n\t// Cross check that the two states are in sync\n\tcheckStateAccounts(t, dstDb, srcRoot, srcAccounts)\n}\n\n// Tests that the trie scheduler can correctly reconstruct the state even if only\n// partial results are returned, and the others sent only later.\nfunc TestIterativeDelayedStateSync(t *testing.T) {\n\t// Create a random state to copy\n\tsrcDb, srcRoot, srcAccounts := makeTestState()\n\n\t// Create a destination state and sync with the scheduler\n\tdstDb := serodb.NewMemDatabase()\n\tsched := NewStateSync(srcRoot, dstDb)\n\n\tqueue := append([]common.Hash{}, sched.Missing(0)...)\n\tfor len(queue) > 0 {\n\t\t// Sync only half of the scheduled nodes\n\t\tresults := make([]trie.SyncResult, len(queue)/2+1)\n\t\tfor i, hash := range queue[:len(results)] {\n\t\t\tdata, err := srcDb.TrieDB().Node(hash)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to retrieve node data for %x\", hash)\n\t\t\t}\n\t\t\tresults[i] = trie.SyncResult{Hash: hash, Data: data}\n\t\t}\n\t\tif _, index, err := sched.Process(results); err != nil {\n\t\t\tt.Fatalf(\"failed to process result #%d: %v\", index, err)\n\t\t}\n\t\tif index, err := sched.Commit(dstDb); err != nil {\n\t\t\tt.Fatalf(\"failed to commit data #%d: %v\", index, err)\n\t\t}\n\t\tqueue = append(queue[len(results):], sched.Missing(0)...)\n\t}\n\t// Cross check that the two states are in sync\n\tcheckStateAccounts(t, dstDb, srcRoot, srcAccounts)\n}\n\n// Tests that given a root hash, a trie can sync iteratively on a single thread,\n// requesting retrieval tasks and returning all of them in one go, however in a\n// random order.\nfunc TestIterativeRandomStateSyncIndividual(t *testing.T) { testIterativeRandomStateSync(t, 1) }\nfunc TestIterativeRandomStateSyncBatched(t *testing.T)    { testIterativeRandomStateSync(t, 100) }\n\nfunc testIterativeRandomStateSync(t *testing.T, batch int) {\n\t// Create a random state to copy\n\tsrcDb, srcRoot, srcAccounts := makeTestState()\n\n\t// Create a destination state and sync with the scheduler\n\tdstDb := serodb.NewMemDatabase()\n\tsched := NewStateSync(srcRoot, dstDb)\n\n\tqueue := make(map[common.Hash]struct{})\n\tfor _, hash := range sched.Missing(batch) {\n\t\tqueue[hash] = struct{}{}\n\t}\n\tfor len(queue) > 0 {\n\t\t// Fetch all the queued nodes in a random order\n\t\tresults := make([]trie.SyncResult, 0, len(queue))\n\t\tfor hash := range queue {\n\t\t\tdata, err := srcDb.TrieDB().Node(hash)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to retrieve node data for %x\", hash)\n\t\t\t}\n\t\t\tresults = append(results, trie.SyncResult{Hash: hash, Data: data})\n\t\t}\n\t\t// Feed the retrieved results back and queue new tasks\n\t\tif _, index, err := sched.Process(results); err != nil {\n\t\t\tt.Fatalf(\"failed to process result #%d: %v\", index, err)\n\t\t}\n\t\tif index, err := sched.Commit(dstDb); err != nil {\n\t\t\tt.Fatalf(\"failed to commit data #%d: %v\", index, err)\n\t\t}\n\t\tqueue = make(map[common.Hash]struct{})\n\t\tfor _, hash := range sched.Missing(batch) {\n\t\t\tqueue[hash] = struct{}{}\n\t\t}\n\t}\n\t// Cross check that the two states are in sync\n\tcheckStateAccounts(t, dstDb, srcRoot, srcAccounts)\n}\n\n// Tests that the trie scheduler can correctly reconstruct the state even if only\n// partial results are returned (Even those randomly), others sent only later.\nfunc TestIterativeRandomDelayedStateSync(t *testing.T) {\n\t// Create a random state to copy\n\tsrcDb, srcRoot, srcAccounts := makeTestState()\n\n\t// Create a destination state and sync with the scheduler\n\tdstDb := serodb.NewMemDatabase()\n\tsched := NewStateSync(srcRoot, dstDb)\n\n\tqueue := make(map[common.Hash]struct{})\n\tfor _, hash := range sched.Missing(0) {\n\t\tqueue[hash] = struct{}{}\n\t}\n\tfor len(queue) > 0 {\n\t\t// Sync only half of the scheduled nodes, even those in random order\n\t\tresults := make([]trie.SyncResult, 0, len(queue)/2+1)\n\t\tfor hash := range queue {\n\t\t\tdelete(queue, hash)\n\n\t\t\tdata, err := srcDb.TrieDB().Node(hash)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to retrieve node data for %x\", hash)\n\t\t\t}\n\t\t\tresults = append(results, trie.SyncResult{Hash: hash, Data: data})\n\n\t\t\t//if len(results) >= cap(results) {\n\t\t\t//\tbreak\n\t\t\t//}\n\t\t}\n\t\t// Feed the retrieved results back and queue new tasks\n\t\tif _, index, err := sched.Process(results); err != nil {\n\t\t\tt.Fatalf(\"failed to process result #%d: %v\", index, err)\n\t\t}\n\t\tif index, err := sched.Commit(dstDb); err != nil {\n\t\t\tt.Fatalf(\"failed to commit data #%d: %v\", index, err)\n\t\t}\n\t\tfor _, hash := range sched.Missing(0) {\n\t\t\tqueue[hash] = struct{}{}\n\t\t}\n\t}\n\t// Cross check that the two states are in sync\n\tcheckStateAccounts(t, dstDb, srcRoot, srcAccounts)\n}\n\n// Tests that at any point in time during a sync, only complete sub-tries are in\n// the database.\nfunc TestIncompleteStateSync(t *testing.T) {\n\t// Create a random state to copy\n\tsrcDb, srcRoot, srcAccounts := makeTestState()\n\n\tcheckTrieConsistency(srcDb.TrieDB().DiskDB().(serodb.Database), srcRoot)\n\n\t// Create a destination state and sync with the scheduler\n\tdstDb := serodb.NewMemDatabase()\n\tsched := NewStateSync(srcRoot, dstDb)\n\n\tadded := []common.Hash{}\n\tqueue := append([]common.Hash{}, sched.Missing(1)...)\n\tfor len(queue) > 0 {\n\t\t// Fetch a batch of state nodes\n\t\tresults := make([]trie.SyncResult, len(queue))\n\t\tfor i, hash := range queue {\n\t\t\tdata, err := srcDb.TrieDB().Node(hash)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"failed to retrieve node data for %x\", hash)\n\t\t\t}\n\t\t\tresults[i] = trie.SyncResult{Hash: hash, Data: data}\n\t\t}\n\t\t// Process each of the state nodes\n\t\tif _, index, err := sched.Process(results); err != nil {\n\t\t\tt.Fatalf(\"failed to process result #%d: %v\", index, err)\n\t\t}\n\t\tif index, err := sched.Commit(dstDb); err != nil {\n\t\t\tt.Fatalf(\"failed to commit data #%d: %v\", index, err)\n\t\t}\n\t\tfor _, result := range results {\n\t\t\tadded = append(added, result.Hash)\n\t\t}\n\t\t// Check that all known sub-tries added so far are complete or missing entirely.\n\tcheckSubtries:\n\t\tfor _, hash := range added {\n\t\t\tfor _, acc := range srcAccounts {\n\t\t\t\tif hash == crypto.Keccak256Hash(acc.code) {\n\t\t\t\t\tcontinue checkSubtries // skip trie check of code nodes.\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Can't use checkStateConsistency here because subtrie keys may have odd\n\t\t\t// length and crash in LeafKey.\n\t\t\tif err := checkTrieConsistency(dstDb, hash); err != nil {\n\t\t\t\tt.Fatalf(\"state inconsistent: %v\", err)\n\t\t\t}\n\t\t}\n\t\t// Fetch the next batch to retrieve\n\t\tqueue = append(queue[:0], sched.Missing(1)...)\n\t}\n\t// Sanity check that removing any node from the database is detected\n\tfor _, node := range added[1:] {\n\t\tkey := node.Bytes()\n\t\tvalue, _ := dstDb.Get(key)\n\n\t\tdstDb.Delete(key)\n\t\tif err := checkStateConsistency(dstDb, added[0]); err == nil {\n\t\t\tt.Fatalf(\"trie inconsistency not caught, missing: %x\", key)\n\t\t}\n\t\tdstDb.Put(key, value)\n\t}\n}\n"
  },
  {
    "path": "core/state_processor.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/log\"\n\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// StateProcessor is a basic Processor, which takes care of transitioning\n// state from one point to another.\n//\n// StateProcessor implements Processor.\ntype StateProcessor struct {\n\tconfig *params.ChainConfig // Chain configuration options\n\tbc     *BlockChain         // Canonical block chain\n\tengine consensus.Engine    // Consensus engine used for block rewards\n}\n\n// NewStateProcessor initialises a new StateProcessor.\nfunc NewStateProcessor(config *params.ChainConfig, bc *BlockChain, engine consensus.Engine) *StateProcessor {\n\treturn &StateProcessor{\n\t\tconfig: config,\n\t\tbc:     bc,\n\t\tengine: engine,\n\t}\n}\n\n// Process processes the state changes according to the Ethereum rules by running\n// the transaction messages using the statedb and applying any rewards to both\n// the processor (coinbase).\n//\n// Process returns the receipts and logs accumulated during the process and\n// returns the amount of gas that was used in the process. If any of the\n// transactions failed to execute due to insufficient gas it will return an error.\nfunc (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) {\n\tvar (\n\t\treceipts types.Receipts\n\t\tusedGas  = new(uint64)\n\t\theader   = block.Header()\n\t\tallLogs  []*types.Log\n\t\tgp       = new(GasPool).AddGas(block.GasLimit())\n\t)\n\n\t// Iterate over and process the individual transactions\n\tgasReward := uint64(0)\n\n\tfor i, tx := range block.Transactions() {\n\t\tstatedb.Prepare(tx.Hash(), block.Hash(), i)\n\t\treceipt, gas, err := ApplyTransaction(p.config, p.bc, nil, gp, statedb, header, tx, usedGas, cfg)\n\t\tif err != nil {\n\t\t\treturn nil, nil, 0, err\n\t\t}\n\t\tgasReward += new(big.Int).Mul(new(big.Int).SetUint64(gas), tx.GasPrice()).Uint64()\n\t\treceipts = append(receipts, receipt)\n\t\tallLogs = append(allLogs, receipt.Logs...)\n\t}\n\t// Finalize the block, applying any consensus engine specific extras (e.g. block rewards)\n\tp.engine.Finalize(p.bc, header, statedb, block.Transactions(), receipts, gasReward)\n\n\treturn receipts, allLogs, *usedGas, nil\n}\n\n// ApplyTransaction attempts to apply a transaction to the given state database\n// and uses the input parameters for its environment. It returns the receipt\n// for the transaction, gas used and an error if the transaction failed,\n// indicating the block was invalid.\nfunc ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config) (*types.Receipt, uint64, error) {\n\tmsg, err := tx.AsMessage()\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\terr = statedb.NextZState().AddStx(tx.GetZZSTX())\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tvar poolId, shareId *common.Hash\n\tif header.Number.Uint64() >= seroparam.SIP4() {\n\t\tif poolId, shareId, err = applyStake(msg.From(), tx.GetZZSTX().Desc_Cmd, statedb, tx.Hash(), header.Number.Uint64()); err != nil {\n\t\t\tlog.Info(\"applyStake\", \"error\", err)\n\t\t\treturn nil, 0, err\n\t\t}\n\t}\n\n\tif header.Number.Uint64() < seroparam.SIP4() || (tx.GetZZSTX().Desc_Cmd.Contract != nil) {\n\t\tkey := header.Coinbase.ToCaddr()\n\t\tstatedb.AddNonceAddress(key[:], header.Coinbase)\n\t}\n\n\t// Create a new context to be used in the EVM environment\n\tcontext := NewEVMContext(msg, header, bc, author)\n\t// Create a new environment which holds all relevant information\n\t// about the transaction and calling mechanisms.\n\tvmenv := vm.NewEVM(context, statedb, config, cfg)\n\t// Apply the transaction to the current state (included in the env)\n\t_, gas, failed, err := ApplyMessage(vmenv, msg, gp)\n\n\tif err != nil {\n\t\tgp.AddGas(gas)\n\t\treturn nil, 0, err\n\t}\n\n\troot := statedb.IntermediateRoot(true).Bytes()\n\t*usedGas += gas\n\n\t// Create a new receipt for the transaction, storing the intermediate root and gas used by the tx\n\t// based on the eip phase, we're passing wether the root touch-delete accounts.\n\treceipt := types.NewReceipt(root, failed, *usedGas)\n\treceipt.TxHash = tx.Hash()\n\treceipt.GasUsed = gas\n\t// if the transaction created a contract, store the creation address in the receipt.\n\tif msg.To() == nil && len(msg.Data()) > 0 && !failed {\n\t\treceipt.ContractAddress = crypto.CreateAddress(vmenv.Context.Origin, statedb.GetContrctNonce(), msg.Data()[0:16])\n\t}\n\t// Set the receipt logs and create a bloom for filtering\n\treceipt.Logs = statedb.GetLogs(tx.Hash())\n\treceipt.Bloom = types.CreateBloom(types.Receipts{receipt})\n\treceipt.PoolId = poolId\n\treceipt.ShareId = shareId\n\n\treturn receipt, gas, err\n}\n\nfunc applyStake(from common.Address, stakeDesc stx.DescCmd, statedb *state.StateDB, txHash common.Hash, number uint64) (poolId *common.Hash, shareId *common.Hash, err error) {\n\tstakeState := stake.NewStakeState(statedb)\n\tpkr := *from.ToPKr()\n\tif stakeDesc.BuyShare != nil {\n\t\tvar stakePool *stake.StakePool\n\t\tif stakeDesc.BuyShare.Pool != nil {\n\t\t\tstakePoolId := common.BytesToHash(stakeDesc.BuyShare.Pool[:])\n\t\t\tstakePool = stakeState.GetStakePool(stakePoolId)\n\t\t\tif stakePool == nil || stakePool.Closed {\n\t\t\t\terr = errors.New(\"pool not exist or pool is closed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tvalue := stakeDesc.BuyShare.Value.ToInt()\n\t\tnum, avgPrice, _ := stakeState.CaleAvgPrice(value)\n\t\tif num > 0 {\n\t\t\tvar amount *big.Int\n\t\t\tif num > 1000 {\n\t\t\t\tnum = 1000\n\t\t\t\tamount = stakeState.SumAmount(1000)\n\t\t\t\tavgPrice = big.NewInt(0).Div(amount, big.NewInt(1000))\n\t\t\t\tamount = new(big.Int).Mul(avgPrice, big.NewInt(1000))\n\t\t\t} else {\n\t\t\t\tamount = new(big.Int).Mul(avgPrice, big.NewInt(int64(num)))\n\t\t\t}\n\n\t\t\trefund := new(big.Int).Sub(new(big.Int).Set(stakeDesc.BuyShare.Value.ToInt()), amount)\n\t\t\tif refund.Sign() > 0 {\n\t\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\t\tValue:    utils.U256(*refund),\n\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tstatedb.NextZState().AddTxOut(from, asset, txHash)\n\t\t\t}\n\n\t\t\tshare := &stake.Share{PKr: pkr, VotePKr: stakeDesc.BuyShare.Vote, Value: avgPrice, TransactionHash: txHash, BlockNumber: number, InitNum: num}\n\t\t\tif stakePool != nil {\n\t\t\t\thash := common.BytesToHash(stakePool.Id())\n\t\t\t\tshare.PoolId = &hash\n\t\t\t\tshare.Fee = stakePool.Fee\n\t\t\t}\n\t\t\tid := common.BytesToHash(share.Id())\n\t\t\tshareId = &id\n\n\t\t\tstakeState.AddPendingShare(share)\n\t\t} else {\n\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\tValue:    stakeDesc.BuyShare.Value,\n\t\t\t},\n\t\t\t}\n\t\t\tstatedb.NextZState().AddTxOut(from, asset, txHash)\n\t\t}\n\t} else if stakeDesc.RegistPool != nil {\n\t\tid := crypto.Keccak256Hash(pkr[:])\n\t\tpoolId = &id\n\t\tstakePool := stakeState.GetStakePool(id)\n\t\tif stakePool != nil {\n\t\t\tif stakePool.Closed {\n\t\t\t\terr = errors.New(\"pool is closed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif stakeDesc.RegistPool.Value.ToInt().Sign() > 0 {\n\t\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\t\tValue:    stakeDesc.RegistPool.Value,\n\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tstatedb.NextZState().AddTxOut(from, asset, txHash)\n\t\t\t}\n\t\t\tstakePool.Fee = uint16(stakeDesc.RegistPool.FeeRate)\n\t\t\tstakePool.VotePKr = stakeDesc.RegistPool.Vote\n\t\t\tstakeState.AddStakePool(stakePool)\n\t\t\treturn\n\t\t} else {\n\t\t\tcmd := stakeDesc.RegistPool\n\t\t\tif stake.GetPoolValueThreshold().Cmp(stakeDesc.RegistPool.Value.ToInt()) != 0 || cmd.Vote == (c_type.PKr{}) {\n\t\t\t\terr = errors.New(\"args error\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tpool := &stake.StakePool{PKr: pkr, Amount: cmd.Value.ToInt(), VotePKr: cmd.Vote, TransactionHash: txHash, Fee: uint16(cmd.FeeRate), BlockNumber: number, Income: big.NewInt(0)}\n\t\t\tstakeState.AddStakePool(pool)\n\t\t}\n\t} else if stakeDesc.ClosePool != nil {\n\t\tid := crypto.Keccak256Hash(pkr[:])\n\t\tpoolId = &id\n\t\tstakePool := stakeState.GetStakePool(id)\n\t\tif stakePool == nil {\n\t\t\terr = errors.New(\"pool not exist\")\n\t\t\treturn\n\t\t}\n\t\tif stakePool.BlockNumber+stake.GetLockingBlockNum() > number {\n\t\t\terr = errors.New(\"pool locking in\")\n\t\t\treturn\n\t\t}\n\t\tif stakePool.Closed {\n\t\t\terr = errors.New(\"pool is closed\")\n\t\t\treturn\n\t\t}\n\t\tstakePool.Closed = true\n\n\t\tif stakePool.Closed && stakePool.CurrentShareNum == 0 && stakePool.WishVoteNum == 0 {\n\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\tValue:    utils.U256(*stakePool.Amount),\n\t\t\t},\n\t\t\t}\n\t\t\tstatedb.NextZState().AddTxOut(from, asset, txHash)\n\t\t\tstakePool.Amount = new(big.Int)\n\t\t}\n\t\tstakeState.AddStakePool(stakePool)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "core/state_transition.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"errors\"\n\t\"math\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nvar (\n\terrInsufficientBalanceForGas = errors.New(\"insufficient balance to pay for gas\")\n)\n\ntype StateTransition struct {\n\tgp         *GasPool\n\tmsg        Message\n\tgas        uint64\n\tgasPrice   *big.Int\n\tinitialGas uint64\n\tasset      *assets.Asset\n\tdata       []byte\n\tstate      vm.StateDB\n\tevm        *vm.EVM\n}\n\n// Message represents a message sent to a contract.\ntype Message interface {\n\tFrom() common.Address\n\n\tTo() *common.Address\n\n\tGasPrice() *big.Int\n\tAsset() *assets.Asset\n\n\t//Nonce() uint64\n\n\tFee() assets.Token\n\n\tData() []byte\n\n\tTxHash() common.Hash\n}\n\n// IntrinsicGas computes the 'intrinsic gas' for a message with the given data.\nfunc IntrinsicGas(data []byte, contractCreation bool) (uint64, error) {\n\t// Set the starting gas for the raw transaction\n\tvar gas uint64\n\tif contractCreation && len(data) > 0 {\n\t\tgas = params.TxGasContractCreation\n\t} else {\n\t\tgas = params.TxGas\n\t}\n\t//Bump the required gas by the amount of transactional data\n\tif len(data) > 0 {\n\t\t// Zero and non-zero bytes are priced differently\n\t\tvar nz uint64\n\t\tfor _, byt := range data {\n\t\t\tif byt != 0 {\n\t\t\t\tnz++\n\t\t\t}\n\t\t}\n\t\t// Make sure we don't exceed uint64 for all data combinations\n\t\tif (math.MaxUint64-gas)/params.TxDataNonZeroGas < nz {\n\t\t\treturn 0, vm.ErrOutOfGas\n\t\t}\n\t\tgas += nz * params.TxDataNonZeroGas\n\n\t\tz := uint64(len(data)) - nz\n\t\tif (math.MaxUint64-gas)/params.TxDataZeroGas < z {\n\t\t\treturn 0, vm.ErrOutOfGas\n\t\t}\n\t\tgas += z * params.TxDataZeroGas\n\t}\n\treturn gas, nil\n}\n\n// NewStateTransition initialises and returns a new state transition object.\nfunc NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition {\n\treturn &StateTransition{\n\t\tgp:       gp,\n\t\tevm:      evm,\n\t\tmsg:      msg,\n\t\tgasPrice: msg.GasPrice(),\n\t\tasset:    msg.Asset(),\n\t\tdata:     msg.Data(),\n\t\tstate:    evm.StateDB,\n\t}\n}\n\n// ApplyMessage computes the new state by applying the given message\n// against the old state within the environment.\n//\n// ApplyMessage returns the bytes returned by any EVM execution (if it took place),\n// the gas used (which includes gas refunds) and an error if it failed. An error always\n// indicates a core error meaning that the message would always fail for that particular\n// state and would never be accepted within a block.\nfunc ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool) ([]byte, uint64, bool, error) {\n\treturn NewStateTransition(evm, msg, gp).TransitionDb()\n}\n\n// to returns the recipient of the message.\nfunc (st *StateTransition) to() common.Address {\n\tif st.msg == nil || st.msg.To() == nil /* contract creation */ {\n\t\treturn common.Address{}\n\t}\n\treturn *st.msg.To()\n}\n\nfunc (st *StateTransition) useGas(amount uint64) error {\n\tif st.gas < amount {\n\t\treturn vm.ErrOutOfGas\n\t}\n\tst.gas -= amount\n\n\treturn nil\n}\n\nfunc (st *StateTransition) preCheck() error {\n\tcurency := strings.ToUpper(common.BytesToString((st.msg.Fee().Currency).NewRef()[:]))\n\tgas := uint64(0)\n\tif curency != \"SERO\" {\n\t\tto := st.msg.To()\n\n\t\ttokens, tas := st.state.GetTokenRate(*to, curency)\n\t\tif tokens.Sign() == 0 || tas.Sign() == 0 {\n\t\t\treturn errInsufficientBalanceForGas\n\t\t}\n\t\ttaval := new(big.Int).Div(new(big.Int).Mul(st.msg.Fee().Value.ToRef().ToIntRef(), tas), tokens)\n\t\tif st.state.GetBalance(*to, \"SERO\").Cmp(taval) < 0 {\n\t\t\treturn errInsufficientBalanceForGas\n\t\t}\n\t\tst.state.AddBalance(*to, curency, st.msg.Fee().Value.ToRef().ToRef().ToIntRef())\n\t\tst.state.SubBalance(*to, \"SERO\", taval)\n\t\tgas = new(big.Int).Div(taval, st.msg.GasPrice()).Uint64()\n\t} else {\n\t\tgas = new(big.Int).Div(st.msg.Fee().Value.ToRef().ToIntRef(), st.msg.GasPrice()).Uint64()\n\t}\n\tif err := st.gp.SubGas(gas); err != nil {\n\t\treturn err\n\t}\n\n\tst.gas += gas\n\tst.initialGas = gas\n\treturn nil\n}\n\n// TransitionDb will transition the state by applying the current message and\n// returning the result including the used gas. It returns an error if failed.\n// An error indicates a consensus issue.\nfunc (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bool, err error) {\n\tif err = st.preCheck(); err != nil {\n\t\tlog.Debug(\"TransitionDb\", \"preCheck err\", err)\n\t\treturn\n\t}\n\tmsg := st.msg\n\tsender := vm.AccountRef(msg.From())\n\tcontractCreation := msg.To() == nil && len(st.data) > 0\n\n\t// Pay intrinsic gas\n\tgas, err := IntrinsicGas(st.data, contractCreation)\n\tif err != nil {\n\t\treturn nil, 0, false, err\n\t}\n\tif err = st.useGas(gas); err != nil {\n\t\treturn nil, 0, false, err\n\t}\n\n\tvar (\n\t\tevm = st.evm\n\t\t// vm errors do not effect consensus and are therefor\n\t\t// not assigned to err, except for insufficient balance\n\t\t// error.\n\t\tvmerr error\n\t)\n\n\tif contractCreation {\n\t\tret, _, st.gas, vmerr = evm.Create(sender, st.data, st.gas, msg.Asset())\n\t} else {\n\t\tto := msg.To()\n\n\t\tif evm.BlockNumber.Uint64() < seroparam.SIP4() || (to != nil && st.state.IsContract(*to)) {\n\t\t\tret, st.gas, vmerr, _ = evm.Call(sender, st.to(), st.data, st.gas, msg.Asset())\n\t\t}\n\t}\n\tif vmerr != nil {\n\t\tlog.Debug(\"VM returned with error\", \"err\", vmerr)\n\t\t// The only possible consensus-error would be if there wasn't\n\t\t// sufficient balance to make the transfer happen. The first\n\t\t// balance transfer may never fail.\n\t\tif vmerr == vm.ErrInsufficientBalance {\n\t\t\treturn nil, 0, false, vmerr\n\t\t}\n\t\tif msg.Asset() != nil {\n\t\t\tst.state.NextZState().AddTxOut(msg.From(), *msg.Asset(), msg.TxHash())\n\t\t}\n\t}\n\n\tst.refundGas()\n\t//asset := assets.Asset{Tkn: &assets.Token{\n\t//\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t//\tValue:    utils.U256(*new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice)),\n\t//},\n\t//}\n\t//st.state.GetZState().AddTxOut(st.evm.Coinbase, asset)\n\n\treturn ret, st.gasUsed(), vmerr != nil, err\n}\n\nfunc (st *StateTransition) refundGas() {\n\t// Apply refund counter, capped to half of the used gas.\n\trefund := st.gasUsed() / 2\n\tif refund > st.state.GetRefund() {\n\t\trefund = st.state.GetRefund()\n\t}\n\tst.gas += refund\n\n\t// Return SERO for remaining gas, exchanged at the original rate.\n\tremaining := new(big.Int).Mul(new(big.Int).SetUint64(st.gas), st.gasPrice)\n\n\tif remaining.Sign() > 0 {\n\t\tcurency := strings.ToUpper(common.BytesToString(st.msg.Fee().Currency.NewRef()[:]))\n\t\tif curency != \"SERO\" {\n\t\t\tst.state.AddBalance(*st.msg.To(), \"SERO\", remaining)\n\t\t\ttokes, tas := st.state.GetTokenRate(*st.msg.To(), curency)\n\t\t\tif tokes.Sign() != 0 && tas.Sign() != 0 {\n\t\t\t\tremainToken := new(big.Int).Div(new(big.Int).Mul(remaining, tokes), tas)\n\t\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(curency), 32)).HashToUint256(),\n\t\t\t\t\tValue:    utils.U256(*remainToken),\n\t\t\t\t},\n\t\t\t\t}\n\t\t\t\tst.state.NextZState().AddTxOut(st.msg.From(), asset, st.msg.TxHash())\n\t\t\t\tst.state.SubBalance(*st.msg.To(), curency, remainToken)\n\t\t\t}\n\t\t} else {\n\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\tValue:    utils.U256(*remaining),\n\t\t\t},\n\t\t\t}\n\t\t\tst.state.NextZState().AddTxOut(st.msg.From(), asset, st.msg.TxHash())\n\t\t}\n\t}\n\n\t// Also return remaining gas to the block gas counter so it is\n\t// available for the next transaction.\n\tst.gp.AddGas(st.gas)\n}\n\n// gasUsed returns the amount of gas used up by the state transition.\nfunc (st *StateTransition) gasUsed() uint64 {\n\treturn st.initialGas - st.gas\n}\n"
  },
  {
    "path": "core/tx_checker.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"runtime\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/verify\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\ntype CheckDesc struct {\n\ttx            *types.Transaction\n\tblock         *types.Block\n\thasReceptions bool\n}\n\nfunc NewTxChecker(bc *BlockChain, chain types.Blocks) (chan<- struct{}, <-chan error) {\n\ttxs := []CheckDesc{}\n\tfor _, block := range chain {\n\t\trpts := bc.GetReceiptsByHash(block.Hash())\n\t\tfor _, tx := range block.Transactions() {\n\t\t\tcd := CheckDesc{}\n\t\t\tcd.tx = tx\n\t\t\tcd.block = block\n\t\t\tif len(rpts) > 0 {\n\t\t\t\tcd.hasReceptions = true\n\t\t\t}\n\t\t\ttxs = append(txs, cd)\n\t\t}\n\t}\n\n\tif len(txs) == 0 {\n\t\treturn make(chan struct{}), nil\n\t}\n\n\t// Spawn as many workers as allowed threads\n\tworkers := runtime.GOMAXPROCS(0)\n\tif len(txs) < workers {\n\t\tworkers = len(txs)\n\t}\n\n\t// Create a task channel and spawn the verifiers\n\tvar (\n\t\tinputs = make(chan int)\n\t\tdone   = make(chan int, workers)\n\t\terrors = make([]error, len(txs))\n\t\tabort  = make(chan struct{})\n\t)\n\tfor i := 0; i < workers; i++ {\n\t\tgo func() {\n\t\t\tfor index := range inputs {\n\t\t\t\ttx := txs[index]\n\t\t\t\tif tx.hasReceptions {\n\t\t\t\t\terrors[index] = nil\n\t\t\t\t} else {\n\t\t\t\t\terrors[index] = verify.VerifyWithoutState(tx.tx.Ehash().NewRef(), tx.tx.GetZZSTX(), tx.block.NumberU64())\n\t\t\t\t}\n\t\t\t\tdone <- index\n\t\t\t}\n\t\t}()\n\t}\n\n\terrorsOut := make(chan error, len(txs))\n\tgo func() {\n\t\tdefer close(inputs)\n\t\tvar (\n\t\t\tin, out = 0, 0\n\t\t\tchecked = make([]bool, len(txs))\n\t\t\tinputs  = inputs\n\t\t)\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase inputs <- in:\n\t\t\t\tif in++; in == len(txs) {\n\t\t\t\t\t// Reached end of headers. Stop sending to workers.\n\t\t\t\t\tinputs = nil\n\t\t\t\t}\n\t\t\tcase index := <-done:\n\t\t\t\tfor checked[index] = true; checked[out]; out++ {\n\t\t\t\t\terrorsOut <- errors[out]\n\t\t\t\t\tif out == len(txs)-1 {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase <-abort:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\treturn abort, errorsOut\n}\n"
  },
  {
    "path": "core/tx_journal.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// errNoActiveJournal is returned if a transaction is attempted to be inserted\n// into the journal, but no such file is currently open.\nvar errNoActiveJournal = errors.New(\"no active journal\")\n\n// devNull is a WriteCloser that just discards anything written into it. Its\n// goal is to allow the transaction journal to write into a fake journal when\n// loading transactions on startup without printing warnings due to no file\n// being readt for write.\ntype devNull struct{}\n\nfunc (*devNull) Write(p []byte) (n int, err error) { return len(p), nil }\nfunc (*devNull) Close() error                      { return nil }\n\n// txJournal is a rotating log of transactions with the aim of storing locally\n// created transactions to allow non-executed ones to survive node restarts.\ntype txJournal struct {\n\tpath   string         // Filesystem path to store the transactions at\n\twriter io.WriteCloser // Output stream to write new transactions into\n}\n\n// newTxJournal creates a new transaction journal to\nfunc newTxJournal(path string) *txJournal {\n\treturn &txJournal{\n\t\tpath: path,\n\t}\n}\n\n// load parses a transaction journal dump from disk, loading its contents into\n// the specified pool.\nfunc (journal *txJournal) load(add func([]*types.Transaction) []error) error {\n\t// Skip the parsing if the journal file doens't exist at all\n\tif _, err := os.Stat(journal.path); os.IsNotExist(err) {\n\t\treturn nil\n\t}\n\t// Open the journal for loading any past transactions\n\tinput, err := os.Open(journal.path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer input.Close()\n\n\t// Temporarily discard any journal additions (don't double add on load)\n\tjournal.writer = new(devNull)\n\tdefer func() { journal.writer = nil }()\n\n\t// Inject all transactions from the journal into the pool\n\tstream := rlp.NewStream(input, 0)\n\ttotal, dropped := 0, 0\n\n\t// Create a method to load a limited batch of transactions and bump the\n\t// appropriate progress counters. Then use this method to load all the\n\t// journalled transactions in small-ish batches.\n\tloadBatch := func(txs types.Transactions) {\n\t\tfor _, err := range add(txs) {\n\t\t\tif err != nil {\n\t\t\t\tlog.Debug(\"Failed to add journaled transaction\", \"err\", err)\n\t\t\t\tdropped++\n\t\t\t}\n\t\t}\n\t}\n\tvar (\n\t\tfailure error\n\t\tbatch   types.Transactions\n\t)\n\tfor {\n\t\t// Parse the next transaction and terminate on error\n\t\ttx := new(types.Transaction)\n\t\tif err = stream.Decode(tx); err != nil {\n\t\t\tif err != io.EOF {\n\t\t\t\tfailure = err\n\t\t\t}\n\t\t\tif batch.Len() > 0 {\n\t\t\t\tloadBatch(batch)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\t// New transaction parsed, queue up for later, import if threnshold is reached\n\t\ttotal++\n\n\t\tif batch = append(batch, tx); batch.Len() > 1024 {\n\t\t\tloadBatch(batch)\n\t\t\tbatch = batch[:0]\n\t\t}\n\t}\n\tlog.Info(\"Loaded local transaction journal\", \"transactions\", total, \"dropped\", dropped)\n\n\treturn failure\n}\n\n// insert adds the specified transaction to the local disk journal.\nfunc (journal *txJournal) insert(tx *types.Transaction) error {\n\tif journal.writer == nil {\n\t\treturn errNoActiveJournal\n\t}\n\tif err := rlp.Encode(journal.writer, tx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// rotate regenerates the transaction journal based on the current contents of\n// the transaction pool.\nfunc (journal *txJournal) rotate() error {\n\t// Close the current journal (if any is open)\n\tif journal.writer != nil {\n\t\tif err := journal.writer.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tjournal.writer = nil\n\t}\n\t// Generate a new journal with the contents of the current pool\n\treplacement, err := os.OpenFile(journal.path+\".new\", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treplacement.Close()\n\n\t// Replace the live journal with the newly generated one\n\tif err = os.Rename(journal.path+\".new\", journal.path); err != nil {\n\t\treturn err\n\t}\n\tsink, err := os.OpenFile(journal.path, os.O_WRONLY|os.O_APPEND, 0600)\n\tif err != nil {\n\t\treturn err\n\t}\n\tjournal.writer = sink\n\tlog.Info(\"Regenerated local transaction journal\", \"transactions\", \"accounts\")\n\n\treturn nil\n}\n\n// close flushes the transaction journal contents to disk and closes the file.\nfunc (journal *txJournal) close() error {\n\tvar err error\n\n\tif journal.writer != nil {\n\t\terr = journal.writer.Close()\n\t\tjournal.writer = nil\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "core/tx_list.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"container/heap\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// priceHeap is a heap.Interface implementation over transactions for retrieving\n// priced-sorted transactions to discard when the pool fills up.\ntype priceHeap []*types.Transaction\n\nfunc (h priceHeap) Len() int { return len(h) }\nfunc (h priceHeap) Swap(i, j int) {\n\tif i < 0 || j < 0 {\n\t\treturn\n\t}\n\th[i], h[j] = h[j], h[i]\n}\n\nfunc (h priceHeap) Less(i, j int) bool {\n\t// Sort primarily by priced, returning the cheaper one\n\tswitch h[i].GasPrice().Cmp(h[j].GasPrice()) {\n\tcase -1:\n\t\treturn true\n\tcase 1:\n\t\treturn false\n\t}\n\t// If the prices match, stabilize via nonces (high nonce is worse)\n\treturn false\n}\n\nfunc (h *priceHeap) Push(x interface{}) {\n\t*h = append(*h, x.(*types.Transaction))\n}\n\nfunc (h *priceHeap) Pop() interface{} {\n\tif h.Len() < 1 {\n\t\treturn nil\n\t}\n\told := *h\n\tn := len(old)\n\tx := old[n-1]\n\t*h = old[0 : n-1]\n\treturn x\n}\n\n// txPricedList is a priced-sorted heap to allow operating on transactions pool\n// contents in a priced-incrementing way.\ntype txPricedList struct {\n\tall    *txLookup  // Pointer to the map of all transactions\n\titems  *priceHeap // Heap of prices of all the stored transactions\n\tstales int        // Number of stale priced points to (re-heap trigger)\n}\n\n// newTxPricedList creates a new priced-sorted transaction heap.\nfunc newTxPricedList(all *txLookup) *txPricedList {\n\treturn &txPricedList{\n\t\tall:   all,\n\t\titems: new(priceHeap),\n\t}\n}\n\nfunc (l *txPricedList) Get(hash common.Hash) *types.Transaction {\n\treturn l.all.Get(hash)\n}\n\nfunc (l *txPricedList) Add(tx *types.Transaction, threshold *big.Int) bool {\n\tif tx.GasPrice().Cmp(threshold) < 0 {\n\t\treturn false\n\t}\n\tif t := l.all.Get(tx.Hash()); t == nil {\n\t\theap.Push(l.items, tx)\n\t}\n\tl.all.Add(tx)\n\treturn true\n}\n\nfunc (l *txPricedList) Flatten() types.Transactions {\n\ttxs := types.Transactions{}\n\tfor _, i := range *l.items {\n\t\ttxs = append(txs, i)\n\t}\n\treturn txs\n}\n\nfunc (l *txPricedList) Ready() types.Transactions {\n\t// Otherwise start accumulating incremental transactions\n\tvar ready types.Transactions\n\n\tif l.items == nil {\n\t\treturn ready\n\t}\n\tfor t := heap.Pop(l.items); t != nil; t = heap.Pop(l.items) {\n\t\ttx := t.((*types.Transaction))\n\t\tready = append(ready, tx)\n\t\tl.all.Remove(tx.Hash())\n\t}\n\n\treturn ready\n}\n\nfunc (l *txPricedList) Len() int {\n\treturn l.items.Len()\n}\n\nfunc (l *txPricedList) Remove(tx *types.Transaction) bool {\n\t// Remove the transaction from the set\n\tif l.all.Get(tx.Hash()) == nil {\n\t\treturn false\n\t}\n\n\tl.all.Remove(tx.Hash())\n\tfor i, item := range *l.items {\n\t\tif item.Hash() == tx.Hash() {\n\t\t\theap.Remove(l.items, i)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Underpriced checks whether a transaction is cheaper than (or as cheap as) the\n// lowest priced transaction currently being tracked.\nfunc (l *txPricedList) Underpriced(tx *types.Transaction) bool {\n\n\t// Discard stale priced points if found at the heap start\n\tfor len(*l.items) > 0 {\n\t\thead := []*types.Transaction(*l.items)[0]\n\t\tif l.all.Get(head.Hash()) == nil {\n\t\t\tl.stales--\n\t\t\theap.Pop(l.items)\n\t\t\tcontinue\n\t\t}\n\t\tbreak\n\t}\n\t// Check if the transaction is underpriced or not\n\tif len(*l.items) == 0 {\n\t\tlog.Error(\"Pricing query for empty pool\") // This cannot happen, print to catch programming errors\n\t\treturn false\n\t}\n\tcheapest := []*types.Transaction(*l.items)[0]\n\treturn cheapest.GasPrice().Cmp(tx.GasPrice()) >= 0\n}\n\n// Discard finds a number of most underpriced transactions, removes them from the\n// priced list and returns them for further removal from the entire pool.\nfunc (l *txPricedList) Discard(count int) types.Transactions {\n\tdrop := make(types.Transactions, 0, count) // Remote underpriced transactions to drop\n\tfor len(*l.items) > 0 && count > 0 {\n\t\t// Discard stale transactions if found during cleanup\n\t\ttx := heap.Pop(l.items).(*types.Transaction)\n\t\tif l.all.Get(tx.Hash()) == nil {\n\t\t\tl.stales--\n\t\t\tcontinue\n\t\t}\n\t\tl.all.Remove(tx.Hash())\n\t\tdrop = append(drop, tx)\n\t\tcount--\n\n\t}\n\treturn drop\n}\nfunc (l *txPricedList) RemoveWithPrice(threshold *big.Int) {\n\tfor len(*l.items) > 0 {\n\t\thead := []*types.Transaction(*l.items)[0]\n\t\tif head.GasPrice().Cmp(threshold) >= 0 {\n\t\t\tbreak\n\t\t} else {\n\t\t\theap.Pop(l.items)\n\t\t\tif l.all.Get(head.Hash()) == nil {\n\t\t\t\tl.stales--\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tl.all.Remove(head.Hash())\n\t\t}\n\t}\n}\n\ntype hashTime map[common.Hash]time.Time\n\nfunc (l hashTime) Flatten() hashTime {\n\tresult := make(map[common.Hash]time.Time)\n\n\tfor k, v := range l {\n\t\tresult[k] = v\n\t}\n\treturn result\n}\n"
  },
  {
    "path": "core/tx_pool.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/verify\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nconst (\n\t// chainHeadChanSize is the size of channel listening to ChainHeadEvent.\n\tchainHeadChanSize = 10\n)\n\nvar (\n\tErrVerifyError = errors.New(\"stx Verify error\")\n\n\t// ErrUnderpriced is returned if a transaction's gas priced is below the minimum\n\t// configured for the transaction pool.\n\tErrUnderpriced = errors.New(\"transaction underpriced\")\n\n\t// ErrIntrinsicGas is returned if the transaction is specified to use less gas\n\t// than required to start the invocation.\n\tErrIntrinsicGas = errors.New(\"intrinsic gas too low\")\n\n\t// ErrGasLimit is returned if a transaction's requested gas limit exceeds the\n\t// maximum allowance of the current block.\n\tErrGasLimit = errors.New(\"exceeds block gas limit\")\n\n\t// ErrOversizedData is returned if the input data of a transaction is greater\n\t// than some meaningful limit a user might use. This is not a consensus error\n\t// making the transaction invalid, rather a DOS protection.\n\tErrOversizedData = errors.New(\"oversized data\")\n\n\tErrCurrencyError = errors.New(\"currency error\")\n)\n\nvar (\n\tevictionInterval    = 5 * time.Minute // Time interval to check for evictable transactions\n\tstatsReportInterval = 8 * time.Second // Time interval to report transaction pool stats\n)\n\nvar (\n\t// General tx metrics\n\tinvalidTxCounter     = metrics.NewRegisteredCounter(\"txpool/invalid\", nil)\n\tunderpricedTxCounter = metrics.NewRegisteredCounter(\"txpool/underpriced\", nil)\n)\n\n// TxStatus is the current status of a transaction as seen by the pool.\ntype TxStatus uint\n\nconst (\n\tTxStatusUnknown TxStatus = iota\n\tTxStatusQueued\n\tTxStatusPending\n)\n\n// blockChain provides the state of blockchain and current gas limit to do\n// some pre checks in tx pool and event subscribers.\ntype blockChain interface {\n\tCurrentBlock() *types.Block\n\tGetBlock(hash common.Hash, number uint64) *types.Block\n\tStateAt(header *types.Header) (*state.StateDB, error)\n\n\tSubscribeChainHeadEvent(ch chan<- ChainHeadEvent) event.Subscription\n}\n\n// TxPoolConfig are the configuration parameters of the transaction pool.\ntype TxPoolConfig struct {\n\tNoLocals bool // Whether local transaction handling should be disabled\n\n\tPriceLimit uint64 // Minimum gas priced to enforce for acceptance into the pool\n\n\tAccountSlots uint64 // Number of executable transaction slots guaranteed per account\n\tGlobalSlots  uint64 // Maximum number of executable transaction slots for all accounts\n\tAccountQueue uint64 // Maximum number of non-executable transaction slots permitted per account\n\tGlobalQueue  uint64 // Maximum number of non-executable transaction slots for all accounts\n\n\tLifetime time.Duration // Maximum amount of time non-executable transaction are queued\n\n\tStartLight bool\n}\n\n// DefaultTxPoolConfig contains the default configurations for the transaction\n// pool.\nvar DefaultTxPoolConfig = TxPoolConfig{\n\n\tPriceLimit:   params.Gta,\n\tAccountSlots: 16,\n\tGlobalSlots:  2048,\n\tAccountQueue: 64,\n\tGlobalQueue:  32,\n\n\tLifetime: 3 * time.Hour,\n}\n\n// sanitize checks the provided user configurations and changes anything that's\n// unreasonable or unworkable.\nfunc (config *TxPoolConfig) sanitize() TxPoolConfig {\n\tconf := *config\n\n\tif conf.PriceLimit < 1 {\n\t\tlog.Warn(\"Sanitizing invalid txpool priced limit\", \"provided\", conf.PriceLimit, \"updated\", DefaultTxPoolConfig.PriceLimit)\n\t\tconf.PriceLimit = DefaultTxPoolConfig.PriceLimit\n\t}\n\treturn conf\n}\n\nfunc TxToOut(tx types.Transaction) (result []txtool.Out, txHash c_type.Uint256) {\n\ttxCommonHash := tx.Hash()\n\tcopy(txHash[:], txCommonHash[:])\n\tztxs := tx.GetZZSTX()\n\tif ztxs != nil {\n\t\ttx1 := tx.GetZZSTX().Tx1\n\t\tfor index := range tx1.Outs_P {\n\t\t\tout := txtool.Out{}\n\t\t\trootState := localdb.RootState{}\n\t\t\tos := localdb.OutState{}\n\t\t\tout_p := &tx1.Outs_P[index]\n\t\t\tif c_superzk.IsSzkPKr(&tx1.Outs_P[index].PKr) {\n\t\t\t\tos.Out_P = out_p\n\t\t\t\tos.GenRootCM()\n\t\t\t} else {\n\t\t\t\tos.Out_O = &stx_v0.Out_O{\n\t\t\t\t\tAddr:  out_p.PKr,\n\t\t\t\t\tAsset: out_p.Asset,\n\t\t\t\t\tMemo:  out_p.Memo,\n\t\t\t\t}\n\t\t\t\tos.GenRootCM()\n\t\t\t}\n\t\t\trootState.OS = os\n\t\t\trootState.TxHash = txHash\n\t\t\tout.State = rootState\n\t\t\tresult = append(result, out)\n\n\t\t}\n\n\t\tfor index := range tx1.Outs_C {\n\t\t\tout := txtool.Out{}\n\t\t\trootState := localdb.RootState{}\n\t\t\tos := localdb.OutState{}\n\t\t\tos.Out_C = &tx1.Outs_C[index]\n\t\t\tos.GenRootCM()\n\t\t\trootState.OS = os\n\t\t\trootState.TxHash = txHash\n\t\t\tout.State = rootState\n\t\t\tresult = append(result, out)\n\t\t}\n\t}\n\treturn\n}\n\ntype PKrTxOuts map[c_type.PKr]map[c_type.Uint256]*TxOutInfo\n\nfunc (p PKrTxOuts) AddPendingTxOut(tx types.Transaction) {\n\n\ttxOuts, _ := TxToOut(tx)\n\tnowUnix := uint64(time.Now().Unix())\n\tfor index := range txOuts {\n\t\tp.AddOut(tx.From(), tx.Gas(), tx.Gas(), tx.GasPrice(), 0, common.Hash{}, nowUnix, txOuts[index])\n\t}\n\n}\n\nfunc (p PKrTxOuts) AddImmatureTxOut(tx types.Transaction, blockNumber uint64, blockHash common.Hash, time uint64) {\n\n\ttxOuts, _ := TxToOut(tx)\n\tfor index := range txOuts {\n\t\tp.AddOut(tx.From(), tx.Gas(), tx.Gas(), tx.GasPrice(), blockNumber, blockHash, time, txOuts[index])\n\t}\n\n}\n\nfunc (p PKrTxOuts) AddOut(\n\tfrom common.Address,\n\tgas uint64, gasUsed uint64,\n\tgasPrice *big.Int,\n\tblockNumber uint64,\n\tblockHash common.Hash, time uint64,\n\tout txtool.Out) {\n\tpkr := out.State.OS.ToPKr()\n\ttxHash := out.State.TxHash\n\tif pkr != nil {\n\t\tif _, ok := p[*pkr]; ok {\n\t\t\tif _, ok := p[*pkr][txHash]; ok {\n\t\t\t\tp[*pkr][txHash].addOut(txHash, from, gas, gasUsed, gasPrice, blockNumber, blockHash, time, out)\n\t\t\t} else {\n\t\t\t\ttxOutInfo := &TxOutInfo{OutExists: map[c_type.Uint256]bool{}}\n\t\t\t\ttxOutInfo.addOut(txHash, from, gas, gasUsed, gasPrice, blockNumber, blockHash, time, out)\n\t\t\t\tp[*pkr][txHash] = txOutInfo\n\t\t\t}\n\n\t\t} else {\n\t\t\ttxOutInfo := &TxOutInfo{OutExists: map[c_type.Uint256]bool{}}\n\t\t\ttxOutInfo.addOut(txHash, from, gas, gasUsed, gasPrice, blockNumber, blockHash, time, out)\n\t\t\ttxOutMap := make(map[c_type.Uint256]*TxOutInfo)\n\t\t\ttxOutMap[txHash] = txOutInfo\n\t\t\tp[*pkr] = txOutMap\n\t\t}\n\t}\n\n}\n\nfunc (p PKrTxOuts) delPendintTxOut(tx types.Transaction) {\n\ttxOuts, txHash := TxToOut(tx)\n\tfor index := range txOuts {\n\t\tout := txOuts[index]\n\t\tpkr := out.State.OS.ToPKr()\n\t\tif pkr != nil {\n\t\t\tdelete(p[*pkr], txHash)\n\t\t\tif len(p[*pkr]) == 0 {\n\t\t\t\tdelete(p, *pkr)\n\t\t\t}\n\n\t\t}\n\t}\n}\n\nfunc (p PKrTxOuts) delPkrTxOut(pkr c_type.PKr, txHash c_type.Uint256) {\n\n\tdelete(p[pkr], txHash)\n\tif len(p[pkr]) == 0 {\n\t\tdelete(p, pkr)\n\t}\n}\n\ntype TxOutInfo struct {\n\tTxHash      c_type.Uint256\n\tBlockNumber uint64\n\tBlockHash   common.Hash\n\tGasUsed     uint64\n\tGas         uint64\n\tGasPrice    *big.Int\n\tFrom        common.Address\n\tTime        uint64\n\tOuts        []txtool.Out\n\tOutExists   map[c_type.Uint256]bool\n}\n\nfunc (t *TxOutInfo) addOut(txHash c_type.Uint256, from common.Address, gas, gasUsed uint64, gasPrice *big.Int, blockNumber uint64, blockHash common.Hash, time uint64, out txtool.Out) {\n\tt.TxHash = txHash\n\tt.BlockNumber = blockNumber\n\tt.BlockHash = blockHash\n\tt.Gas = gas\n\tt.GasUsed = gasUsed\n\tt.GasPrice = gasPrice\n\tt.From = from\n\tt.Time = time\n\n\tvar existsKey c_type.Uint256\n\n\tif out.State.OS.Out_O != nil {\n\t\texistsKey = out.State.OS.Out_O.ToHash()\n\t}\n\n\tif out.State.OS.Out_P != nil {\n\t\texistsKey = out.State.OS.Out_P.ToHash()\n\t}\n\n\tif out.State.OS.Out_C != nil {\n\t\texistsKey = out.State.OS.Out_C.Tx1_Hash()\n\t}\n\n\tif _, ok := t.OutExists[existsKey]; !ok {\n\t\tt.Outs = append(t.Outs, out)\n\t\tt.OutExists[existsKey] = true\n\n\t}\n\n}\n\n// TxPool contains all currently known transactions. Transactions\n// enter the pool when they are received from the network or submitted\n// locally. They exit the pool when they are included in the blockchain.\n//\n// The pool separates processable transactions (which can be applied to the\n// current state) and future transactions. Transactions move between those\n// two states over time as they are received and processed.\ntype TxPool struct {\n\tconfig       TxPoolConfig\n\tchainconfig  *params.ChainConfig\n\tchain        blockChain\n\tgasPrice     *big.Int\n\ttxFeed       event.Feed\n\tscope        event.SubscriptionScope\n\tchainHeadCh  chan ChainHeadEvent\n\tchainHeadSub event.Subscription\n\t//abi       types.Signer\n\tmu sync.RWMutex\n\n\tcurrentState  *state.StateDB      // Current state in the blockchain head\n\tpendingState  *state.ManagedState // Pending state tracking virtual nonces\n\tcurrentMaxGas uint64              // Current gas limit for transaction caps\n\n\t//locals *accountSet // Set of local transaction to exempt from eviction rules\n\t//journal *txJournal  // Journal of local transaction to back up to disk\n\n\tall        *txLookup     // All transactions to allow lookups\n\tpriced     *txPricedList // All transactions sorted by priced\n\tnewQueue   *txPricedList\n\tnewPending *txPricedList\n\tbeats      hashTime\n\tfaileds    hashTime\n\n\twg sync.WaitGroup // for shutdown sync\n\n\tpkrTxOuts PKrTxOuts\n\n\thomestead bool\n\tmining    int32\n}\n\n// NewTxPool creates a new transaction pool to gather, sort and filter inbound\n// transactions from the network.\nfunc NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain blockChain) *TxPool {\n\t// Sanitize the input to ensure no vulnerable gas prices are set\n\tconfig = (&config).sanitize()\n\n\t// Create the transaction pool with its initial settings\n\tpool := &TxPool{\n\t\tconfig:      config,\n\t\tchainconfig: chainconfig,\n\t\tchain:       chain,\n\t\tbeats:       make(map[common.Hash]time.Time),\n\t\tfaileds:     make(map[common.Hash]time.Time),\n\t\tall:         newTxLookup(),\n\t\tchainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize),\n\t\tgasPrice:    new(big.Int).SetUint64(config.PriceLimit),\n\t}\n\tpool.pkrTxOuts = make(map[c_type.PKr]map[c_type.Uint256]*TxOutInfo)\n\t//pool.locals = newAccountSet()\n\tpool.priced = newTxPricedList(pool.all)\n\tpool.newQueue = newTxPricedList(newTxLookup())\n\tpool.newPending = newTxPricedList(newTxLookup())\n\tpool.reset(nil, chain.CurrentBlock().Header())\n\n\t// Subscribe events from blockchain\n\tpool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh)\n\n\t// Start the event loop and return\n\tpool.wg.Add(1)\n\tgo pool.loop()\n\n\treturn pool\n}\n\nfunc (pool *TxPool) SetMining(m int32) {\n\tatomic.StoreInt32(&pool.mining, m)\n}\n\nfunc (pool *TxPool) Mining() bool {\n\treturn atomic.LoadInt32(&pool.mining) > 0\n}\n\n// loop is the transaction pool's main event loop, waiting for and reacting to\n// outside blockchain events as well as for various reporting and transaction\n// eviction events.\nfunc (pool *TxPool) loop() {\n\tdefer pool.wg.Done()\n\n\t// Start the stats reporting and transaction eviction tickers\n\t//var prevPending, prevQueued, prevStales int\n\n\treport := time.NewTicker(statsReportInterval)\n\tdefer report.Stop()\n\n\tevict := time.NewTicker(evictionInterval)\n\tdefer evict.Stop()\n\n\t// Track the previous head headers for transaction reorgs\n\thead := pool.chain.CurrentBlock()\n\n\t// Keep waiting for and reacting to the various events\n\tfor {\n\t\tselect {\n\t\t// Handle ChainHeadEvent\n\t\tcase ev := <-pool.chainHeadCh:\n\t\t\tif ev.Block != nil {\n\t\t\t\tpool.mu.Lock()\n\n\t\t\t\tpool.reset(head.Header(), ev.Block.Header())\n\t\t\t\thead = ev.Block\n\n\t\t\t\tpool.mu.Unlock()\n\t\t\t}\n\t\t\t// Be unsubscribed due to system stopped\n\t\tcase <-pool.chainHeadSub.Err():\n\t\t\treturn\n\n\t\t\t// Handle stats reporting ticks\n\t\tcase <-report.C:\n\t\t\tlog.Debug(\"Transaction pool status report\", \"queued\", pool.all.Count())\n\n\t\tcase <-evict.C:\n\t\t\tdrop := types.Transactions{}\n\t\t\tpool.mu.RLock()\n\t\t\tpendingTxs := pool.newPending.Flatten()\n\t\t\tqueuedTxs := pool.newQueue.Flatten()\n\t\t\tbeats := pool.beats.Flatten()\n\t\t\tfaileds := pool.faileds.Flatten()\n\t\t\tpool.mu.RUnlock()\n\n\t\t\tdropFaileds := []common.Hash{}\n\t\t\tfor k, v := range faileds {\n\t\t\t\tif time.Since(v) > pool.config.Lifetime {\n\t\t\t\t\tdropFaileds = append(dropFaileds, k)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor _, tx := range pendingTxs {\n\t\t\t\tif err := pool.validateTx(tx, false); err != nil {\n\t\t\t\t\tdrop = append(drop, tx)\n\t\t\t\t} else {\n\t\t\t\t\tif t, ok := beats[tx.Hash()]; ok && time.Since(t) > pool.config.Lifetime {\n\t\t\t\t\t\tdrop = append(drop, tx)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor _, tx := range queuedTxs {\n\t\t\t\tif err := pool.validateTx(tx, false); err != nil {\n\t\t\t\t\tdrop = append(drop, tx)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpool.mu.Lock()\n\n\t\t\tfor _, tx := range drop {\n\t\t\t\tpool.faileds[tx.Hash()] = time.Now()\n\t\t\t\tpool.removeAllTx(tx.Hash())\n\t\t\t\tif pool.canAddPkrTx() {\n\t\t\t\t\tpool.pkrTxOuts.delPendintTxOut(*tx)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, h := range dropFaileds {\n\t\t\t\tdelete(pool.faileds, h)\n\t\t\t}\n\t\t\tpool.mu.Unlock()\n\n\t\t}\n\t}\n}\n\nfunc (pool *TxPool) RemoveTxs(txs types.Transactions) {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\n\tfor _, tx := range txs {\n\t\tpool.removeAllTx(tx.Hash())\n\n\t}\n}\n\n// lockedReset is a wrapper around reset to allow calling it in a thread safe\n// manner. This method is only ever used in the tester!\nfunc (pool *TxPool) lockedReset(oldHead, newHead *types.Header) {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\n\tpool.reset(oldHead, newHead)\n}\n\nfunc (pool *TxPool) canAddPkrTx() bool {\n\tdifference := time.Now().Unix() - pool.chain.CurrentBlock().Time().Int64()\n\tif difference > 10*60 {\n\t\treturn false\n\t}\n\treturn pool.config.StartLight\n}\n\n// reset retrieves the current state of the blockchain and ensures the content\n// of the transaction pool is valid with regard to the chain state.\nfunc (pool *TxPool) reset(oldHead, newHead *types.Header) {\n\t// If we're reorging an old state, reinject all dropped transactions\n\tvar reinject types.Transactions\n\t// Reorg seems shallow enough to pull in all transactions into memory\n\tvar discarded, included types.Transactions\n\n\tif oldHead != nil && oldHead.Hash() != newHead.ParentHash {\n\t\t// If the reorg is too deep, avoid doing it (will happen during fast sync)\n\t\toldNum := oldHead.Number.Uint64()\n\t\tnewNum := newHead.Number.Uint64()\n\n\t\tif depth := uint64(math.Abs(float64(oldNum) - float64(newNum))); depth > 64 {\n\t\t\tlog.Debug(\"Skipping deep transaction reorg\", \"depth\", depth)\n\t\t} else {\n\n\t\t\tvar (\n\t\t\t\trem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64())\n\t\t\t\tadd = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64())\n\t\t\t)\n\t\t\tfor rem.NumberU64() > add.NumberU64() {\n\t\t\t\tdiscarded = append(discarded, rem.Transactions()...)\n\t\t\t\tif rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil {\n\t\t\t\t\tlog.Error(\"Unrooted old chain seen by tx pool\", \"block\", oldHead.Number, \"hash\", oldHead.Hash())\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor add.NumberU64() > rem.NumberU64() {\n\t\t\t\tincluded = append(included, add.Transactions()...)\n\t\t\t\tif pool.canAddPkrTx() {\n\t\t\t\t\tfor _, tx := range add.Transactions() {\n\t\t\t\t\t\tpool.pkrTxOuts.AddImmatureTxOut(*tx, add.Number().Uint64(), add.Hash(), add.Time().Uint64())\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil {\n\t\t\t\t\tlog.Error(\"Unrooted new chain seen by tx pool\", \"block\", newHead.Number, \"hash\", newHead.Hash())\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor rem.Hash() != add.Hash() {\n\t\t\t\tdiscarded = append(discarded, rem.Transactions()...)\n\t\t\t\tif rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil {\n\t\t\t\t\tlog.Error(\"Unrooted old chain seen by tx pool\", \"block\", oldHead.Number, \"hash\", oldHead.Hash())\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tincluded = append(included, add.Transactions()...)\n\t\t\t\tif pool.canAddPkrTx() {\n\t\t\t\t\tfor _, tx := range add.Transactions() {\n\t\t\t\t\t\tpool.pkrTxOuts.AddImmatureTxOut(*tx, add.Number().Uint64(), add.Hash(), add.Time().Uint64())\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif add = pool.chain.GetBlock(add.ParentHash(), add.NumberU64()-1); add == nil {\n\t\t\t\t\tlog.Error(\"Unrooted new chain seen by tx pool\", \"block\", newHead.Number, \"hash\", newHead.Hash())\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\treinject = types.TxDifference(discarded, included)\n\t\t}\n\t}\n\n\t// Initialize the internal state to the current head\n\tif newHead == nil {\n\t\tnewHead = pool.chain.CurrentBlock().Header() // Special case during testing\n\t}\n\tstatedb, err := pool.chain.StateAt(newHead)\n\tif err != nil {\n\t\tlog.Error(\"Failed to reset txpool state\", \"err\", err)\n\t\treturn\n\t}\n\tpool.currentState = statedb\n\tpool.pendingState = state.ManageState(statedb)\n\tpool.currentMaxGas = newHead.GasLimit\n\n\tif len(included) == 0 {\n\t\tadd := pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64())\n\t\tif pool.canAddPkrTx() {\n\t\t\tfor _, tx := range add.Transactions() {\n\t\t\t\tpool.pkrTxOuts.AddImmatureTxOut(*tx, add.Number().Uint64(), add.Hash(), add.Time().Uint64())\n\t\t\t}\n\t\t}\n\t\tincluded = append(included, add.Transactions()...)\n\t}\n\n\tfor _, tx := range included {\n\t\tpool.removeAllTx(tx.Hash())\n\t\tlog.Debug(\"confirm removeTx tx\", \"hash\", tx.Hash())\n\t}\n\t// Inject any transactions discarded due to reorgs\n\tlog.Debug(\"Reinjecting stale transactions\", \"count\", len(reinject))\n\tif len(reinject) > 0 {\n\t\tpool.addTxsLocked(reinject, false, false)\n\t\tfor _, tx := range reinject {\n\t\t\tlog.Info(\"reinject tx\", \"hash\", tx.Hash())\n\t\t}\n\t}\n\n\tpool.promoteExecutables(true)\n}\n\n// Stop terminates the transaction pool.\nfunc (pool *TxPool) Stop() {\n\t// Unsubscribe all subscriptions registered from txpool\n\tpool.scope.Close()\n\n\t// Unsubscribe subscriptions registered from blockchain\n\tpool.chainHeadSub.Unsubscribe()\n\tpool.wg.Wait()\n\n\tlog.Info(\"Transaction pool stopped\")\n}\n\n// SubscribeNewTxsEvent registers a subscription of NewTxsEvent and\n// starts sending event to the given channel.\nfunc (pool *TxPool) SubscribeNewTxsEvent(ch chan<- NewTxsEvent) event.Subscription {\n\treturn pool.scope.Track(pool.txFeed.Subscribe(ch))\n}\n\n// SetGasPrice updates the minimum priced required by the transaction pool for a\n// new transaction, and drops all transactions below this threshold.\nfunc (pool *TxPool) SetGasPrice(price *big.Int) {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\tpool.gasPrice = price\n\tpool.priced.RemoveWithPrice(pool.gasPrice)\n\tpool.newQueue.RemoveWithPrice(pool.gasPrice)\n\tpool.newPending.RemoveWithPrice(pool.gasPrice)\n\n\tlog.Info(\"Transaction pool priced threshold updated\", \"priced\", pool.gasPrice)\n}\n\n// State returns the virtual managed state of the transaction pool.\nfunc (pool *TxPool) State() *state.ManagedState {\n\tpool.mu.RLock()\n\tdefer pool.mu.RUnlock()\n\n\treturn pool.pendingState\n}\n\n// Stats retrieves the current pool stats, namely the number of pending and the\n// number of queued (non-executable) transactions.\nfunc (pool *TxPool) Stats() (int, int, int, int) {\n\tpool.mu.RLock()\n\tdefer pool.mu.RUnlock()\n\n\treturn pool.newPending.Len(), pool.newQueue.Len(), pool.priced.Len(), pool.all.Count()\n}\n\n// Content retrieves the data content of the transaction pool, returning all the\n// pending as well as queued transactions, grouped by account and sorted by nonce.\nfunc (pool *TxPool) Content() (types.Transactions, types.Transactions, types.Transactions) {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\n\tpending := types.Transactions{}\n\tif pool.newPending != nil && pool.newPending.items != nil {\n\t\tpending = append(pending, pool.newPending.Flatten()...)\n\t}\n\n\tqueued := types.Transactions{}\n\n\tif pool.newQueue != nil && pool.newQueue.items != nil {\n\t\tqueued = append(queued, pool.newQueue.Flatten()...)\n\t}\n\n\tall := types.Transactions{}\n\n\tif pool.priced != nil && pool.priced.items != nil {\n\t\tall = append(all, pool.priced.Flatten()...)\n\t}\n\n\treturn pending, queued, all\n}\n\nfunc (pool *TxPool) PendingOuts(pkr c_type.PKr) map[c_type.Uint256]*TxOutInfo {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\treturn pool.pkrTxOuts[pkr]\n}\n\nfunc (pool *TxPool) DelMaturedOuts(pkr c_type.PKr, txHash c_type.Uint256, currentNum uint64) {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\tif txHashMap, ok := pool.pkrTxOuts[pkr]; ok {\n\t\tfor k, v := range txHashMap {\n\t\t\tif v.BlockNumber != 0 && v.BlockNumber < currentNum {\n\t\t\t\tpool.pkrTxOuts.delPkrTxOut(pkr, k)\n\t\t\t}\n\t\t}\n\t}\n\tpool.pkrTxOuts.delPkrTxOut(pkr, txHash)\n\n}\n\n// Pending retrieves all currently processable transactions, groupped by origin\n// account and sorted by nonce. The returned transaction set is a copy and can be\n// freely modified by calling code.\nfunc (pool *TxPool) Pending() (types.Transactions, error) {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\n\treturn pool.newPending.Flatten(), nil\n}\n\n// validateTx checks whether a transaction is valid according to the consensus\n// rules and adheres to some heuristic limits of the local node (priced and size).\nfunc (pool *TxPool) validateTx(tx *types.Transaction, local bool) (e error) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tlog.Error(\"validateTx error : \", \"hash\", tx.Hash().Hex(), \"recover\", r)\n\t\t\tdebug.PrintStack()\n\t\t\te = errors.New(fmt.Sprintf(\"%v\", r))\n\t\t}\n\t}()\n\n\t// Heuristic limit, reject transactions over 32KB to prevent DOS attacks\n\tif tx.Size() > 3200*1024 {\n\t\treturn ErrOversizedData\n\t}\n\n\t// Ensure the transaction doesn't exceed the current block limit gas.\n\tvar gaslimit uint64\n\tif gaslimit, e = pool.currentState.GetTxGasLimit(tx); e != nil {\n\t\treturn\n\t}\n\tif pool.currentMaxGas < gaslimit {\n\t\treturn ErrGasLimit\n\t}\n\n\tnum := pool.chain.CurrentBlock().NumberU64()\n\tif err := verify.VerifyWithoutState(tx.Ehash().NewRef(), tx.GetZZSTX(), num); err != nil {\n\t\tlog.Trace(\"validateTx verify without state failed\", \"hash\", tx.Hash().Hex(), \"verify stx err\", err)\n\t\t//return ErrVerifyError\n\t\treturn err\n\t}\n\n\tcopyState := pool.currentState.CopyWithNoZState()\n\tif err := pool.checkDescCmd(tx.GetZZSTX(), copyState); err != nil {\n\t\treturn err\n\t}\n\n\tstate := copyState.NextZState()\n\terr := verify.VerifyWithState(tx.GetZZSTX(), state, num)\n\t//err := verify.Verify(tx.GetZZSTX(), pool.currentState.Copy().GetZState())\n\tif err != nil {\n\t\tlog.Trace(\"validateTx error\", \"hash\", tx.Hash().Hex(), \"verify stx err\", err)\n\t\t//pool.faileds[tx.Hash()] = time.Now()\n\t\t//return ErrVerifyError\n\t\treturn err\n\t}\n\n\t// Drop non-local transactions under our own minimal accepted gas priced\n\tif !local && pool.gasPrice.Cmp(tx.GasPrice()) > 0 {\n\t\treturn ErrUnderpriced\n\t}\n\n\tif !tx.IsOpContract() {\n\t\tif len(tx.Data()) > 0 {\n\t\t\treturn errors.New(`not create or call crontract tx playdata must be nil`)\n\t\t}\n\t}\n\n\tintrGas, err := IntrinsicGas(tx.Data(), tx.To() == nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif gaslimit < intrGas {\n\t\treturn ErrIntrinsicGas\n\t}\n\treturn nil\n}\n\nfunc (pool *TxPool) checkDescCmd(tx *stx.T, state *state.StateDB) (err error) {\n\tcmd := tx.Desc_Cmd\n\tstakeState := stake.NewStakeState(state)\n\tif cmd.BuyShare != nil {\n\t\tif cmd.BuyShare.Pool != nil {\n\t\t\tstakePool := stakeState.GetStakePool(common.BytesToHash(cmd.BuyShare.Pool[:]))\n\t\t\tif stakePool == nil || stakePool.Closed {\n\t\t\t\terr = errors.New(\"pool is not exist or closed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t} else if cmd.RegistPool != nil {\n\t\tid := crypto.Keccak256Hash(tx.From[:])\n\t\tstakePool := stakeState.GetStakePool(id)\n\t\tif stakePool == nil {\n\t\t\tif cmd.RegistPool.Value.ToInt().Cmp(stake.GetPoolValueThreshold()) != 0 {\n\t\t\t\terr = errors.New(\"registPool value error\")\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\tif stakePool.Closed {\n\t\t\t\terr = errors.New(\"registPool but stakePool is closed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif !superzk.IsPKrValid(&cmd.RegistPool.Vote) {\n\t\t\terr = errors.New(\"registPool Vote is invalid\")\n\t\t\treturn\n\t\t}\n\t\tif cmd.RegistPool.FeeRate > seroparam.HIGHEST_STAKING_NODE_FEE_RATE {\n\t\t\terr = fmt.Errorf(\"registPool Vote fee must <= %v%%\", seroparam.HIGHEST_STAKING_NODE_FEE_RATE/100)\n\t\t\treturn\n\t\t}\n\t\tif cmd.RegistPool.FeeRate < seroparam.LOWEST_STAKING_NODE_FEE_RATE {\n\t\t\terr = fmt.Errorf(\"registPool Vote fee must >= %v%%\", seroparam.LOWEST_STAKING_NODE_FEE_RATE/100)\n\t\t\treturn\n\t\t}\n\t} else if cmd.ClosePool != nil {\n\t\tid := crypto.Keccak256Hash(tx.From[:])\n\t\tstakePool := stakeState.GetStakePool(id)\n\t\tif stakePool == nil {\n\t\t\terr = errors.New(\"pool is not exist\")\n\t\t\treturn\n\t\t}\n\t\tif stakePool.Closed {\n\t\t\terr = errors.New(\"pool is closed\")\n\t\t\treturn\n\t\t}\n\t\tif stakePool.BlockNumber+stake.GetLockingBlockNum() > pool.chain.CurrentBlock().NumberU64() {\n\t\t\terr = errors.New(\"pool locking in\")\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\n// add validates a transaction and inserts it into the non-executable queue for\n// later pending promotion and execution. If the transaction is a replacement for\n// an already pending or queued one, it overwrites the previous and returns this\n// so outer code doesn't uselessly call promote.\n//\n// If a newly added transaction is marked as local, its sending account will be\n// whitelisted, preventing any associated transaction from being dropped out of\n// the pool due to pricing constraints.\nfunc (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) {\n\t// If the transaction is already known, discard it\n\thash := tx.Hash()\n\tif pool.all.Get(hash) != nil && !local {\n\t\tlog.Trace(\"Discarding already known transaction\", \"hash\", hash.Hex())\n\t\treturn false, fmt.Errorf(\"known transaction: %x\", hash)\n\t}\n\n\tif _, ok := pool.faileds[hash]; ok {\n\t\tlog.Trace(\"Discarding already known failed transaction\", \"hash\", hash.Hex())\n\t\treturn false, fmt.Errorf(\"known failed transaction: %x\", hash)\n\t}\n\n\tcurrentBlockNum := pool.chain.CurrentBlock().NumberU64()\n\n\tif true && (!seroparam.Is_Dev()) {\n\t\tif (seroparam.SIP10()-25) < currentBlockNum && currentBlockNum < (seroparam.SIP10()+25) {\n\t\t\treturn false, fmt.Errorf(\"protect SIP10:%v\", seroparam.SIP10())\n\t\t}\n\t}\n\n\t// If the transaction fails basic validation, discard it\n\tif err := pool.validateTx(tx, local); err != nil {\n\t\tlog.Info(\"Discarding invalid transaction\", \"hash\", hash.Hex(), \"err\", err)\n\t\tpool.faileds[tx.Hash()] = time.Now()\n\t\tinvalidTxCounter.Inc(1)\n\t\treturn false, err\n\t}\n\t// If the transaction pool is full, discard underpriced transactions\n\tif uint64(pool.all.Count()) >= pool.config.GlobalSlots+pool.config.GlobalQueue {\n\t\t// If the new transaction is underpriced, don't accept it\n\t\tif !local && pool.newQueue.Underpriced(tx) {\n\t\t\tlog.Info(\"Discarding underpriced transaction\", \"hash\", hash.Hex(), \"priced\", tx.GasPrice())\n\t\t\tunderpricedTxCounter.Inc(1)\n\t\t\treturn false, ErrUnderpriced\n\t\t}\n\t\t// New transaction is better than our worse ones, make room for it\n\t\tdrop := pool.priced.Discard(pool.all.Count() - int(pool.config.GlobalSlots+pool.config.GlobalQueue-1))\n\t\tfor _, tx := range drop {\n\t\t\tpool.removeWorkQueue(tx)\n\t\t\tif pool.canAddPkrTx() {\n\t\t\t\tpool.pkrTxOuts.delPendintTxOut(*tx)\n\t\t\t}\n\t\t\tlog.Info(\"Discarding freshly underpriced transaction\", \"hash\", tx.Hash().Hex(), \"priced\", tx.GasPrice())\n\t\t}\n\t}\n\n\tflag, err := pool.enqueueTx(hash, tx)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif pool.canAddPkrTx() {\n\t\tpool.pkrTxOuts.AddPendingTxOut(*tx)\n\t}\n\tif flag {\n\t\tlog.Info(\"Pooled new future transaction\", \"hash\", hash.Hex())\n\t} else {\n\t\tlog.Info(\"Discard new future transaction\", \"hash\", hash.Hex())\n\n\t}\n\treturn flag, nil\n}\n\n// Note, this method assumes the pool lock is held!\nfunc (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction) (bool, error) {\n\t// Try to insert the transaction into the future queue\n\n\tif pool.newQueue.Add(tx, pool.gasPrice) {\n\t\tif pool.all.Get(hash) == nil {\n\t\t\tflag := pool.priced.Add(tx, pool.gasPrice)\n\t\t\tif !flag {\n\t\t\t\tlog.Info(\"txPool enqueueTx error\", \"tx.gasPrice\", tx.GasPrice().String())\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn false, errors.New(\"gas price too low\")\n\t}\n\n\treturn true, nil\n}\n\n// AddLocal enqueues a single transaction into the pool if it is valid, marking\n// the sender as a local one in the mean time, ensuring it goes around the local\n// pricing constraints.\nfunc (pool *TxPool) AddLocal(tx *types.Transaction) error {\n\treturn pool.addTx(tx, !pool.config.NoLocals)\n}\n\n// AddRemote enqueues a single transaction into the pool if it is valid. If the\n// sender is not among the locally tracked ones, full pricing constraints will\n// apply.\nfunc (pool *TxPool) AddRemote(tx *types.Transaction) error {\n\treturn pool.addTx(tx, false)\n}\n\n// AddLocals enqueues a batch of transactions into the pool if they are valid,\n// marking the senders as a local ones in the mean time, ensuring they go around\n// the local pricing constraints.\nfunc (pool *TxPool) AddLocals(txs []*types.Transaction) []error {\n\treturn pool.addTxs(txs, !pool.config.NoLocals, true)\n}\n\n// AddRemotes enqueues a batch of transactions into the pool if they are valid.\n// If the senders are not among the locally tracked ones, full pricing constraints\n// will apply.\nfunc (pool *TxPool) AddRemotes(txs []*types.Transaction) []error {\n\tfor _, tx := range txs {\n\t\tlog.Debug(\"AddRemotes tx\", \"hash\", tx.Hash().Hex())\n\t}\n\treturn pool.addTxs(txs, false, false)\n}\n\n// addTx enqueues a single transaction into the pool if it is valid.\nfunc (pool *TxPool) addTx(tx *types.Transaction, local bool) error {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\n\t// Try to inject the transaction and update any state\n\t_, err := pool.add(tx, local)\n\tif err != nil {\n\t\treturn err\n\t}\n\tbroadCast := false\n\tif local {\n\t\tif pool.Mining() || pool.config.StartLight {\n\t\t\tpool.broadCastLocalTx(tx)\n\t\t} else {\n\t\t\tbroadCast = true\n\t\t}\n\t}\n\tpool.promoteExecutables(broadCast)\n\n\treturn nil\n}\n\n// addTxs attempts to queue a batch of transactions if they are valid.\nfunc (pool *TxPool) addTxs(txs []*types.Transaction, local bool, broadcast bool) []error {\n\tpool.mu.Lock()\n\tdefer pool.mu.Unlock()\n\n\treturn pool.addTxsLocked(txs, local, broadcast)\n}\n\n// addTxsLocked attempts to queue a batch of transactions if they are valid,\n// whilst assuming the transaction pool lock is already held.\nfunc (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool, broadcast bool) []error {\n\t// Add the batch of transaction, tracking the accepted ones\n\terrs := []error{}\n\terrCount := 0\n\tknowErrCount := 0\n\tfailedErrCount := 0\n\tadded := 0\n\tfor _, tx := range txs {\n\t\t_, err := pool.add(tx, local)\n\t\tif err != nil {\n\t\t\tif strings.Contains(err.Error(), \"known transaction\") {\n\t\t\t\tknowErrCount++\n\t\t\t} else if strings.Contains(err.Error(), \"known failed transaction\") {\n\t\t\t\tfailedErrCount++\n\t\t\t} else {\n\t\t\t\terrCount++\n\t\t\t}\n\n\t\t} else {\n\t\t\tadded++\n\t\t}\n\t\tif err != nil {\n\t\t\terrs = append(errs, err)\n\t\t}\n\t}\n\tlog.Trace(\"txpool\", \"addTxs\", len(txs), \"knowErr\", knowErrCount, \"failedErr\", failedErrCount, \"validateErr\", errCount)\n\tif added > 0 {\n\t\tpool.promoteExecutables(broadcast)\n\t}\n\treturn errs\n}\n\n// Status returns the status (unknown/pending/queued) of a batch of transactions\n// identified by their hashes.\nfunc (pool *TxPool) Status(hashes []common.Hash) []TxStatus {\n\tpool.mu.RLock()\n\tdefer pool.mu.RUnlock()\n\n\tstatus := make([]TxStatus, len(hashes))\n\tfor i, hash := range hashes {\n\t\tif tx := pool.all.Get(hash); tx != nil {\n\t\t\tif pool.newQueue.Get(hash) != nil {\n\t\t\t\tstatus[i] = TxStatusQueued\n\t\t\t} else if pool.newPending.Get(hash) != nil {\n\t\t\t\tstatus[i] = TxStatusPending\n\t\t\t} else {\n\t\t\t\tstatus[i] = TxStatusUnknown\n\t\t\t}\n\t\t}\n\t}\n\treturn status\n}\n\n// Get returns a transaction if it is contained in the pool\n// and nil otherwise.\nfunc (pool *TxPool) Get(hash common.Hash) *types.Transaction {\n\treturn pool.all.Get(hash)\n}\n\n// removeTx removes a single transaction from the queue, moving all subsequent\n// transactions back to the future queue.\nfunc (pool *TxPool) removeAllTx(hash common.Hash) {\n\t// Fetch the transaction we wish to delete\n\ttx := pool.all.Get(hash)\n\tif tx == nil {\n\t\treturn\n\t}\n\n\tpool.priced.Remove(tx)\n\tdelete(pool.beats, hash)\n\t//Remove it from the list of known transactions\n\tif pool.newQueue.Remove(tx) {\n\t\treturn\n\t}\n\tif pool.newPending.Remove(tx) {\n\t\treturn\n\t}\n}\n\nfunc (pool *TxPool) removeWorkQueue(tx *types.Transaction) {\n\n\tdelete(pool.beats, tx.Hash())\n\t//Remove it from the list of known transactions\n\tif pool.newQueue.Remove(tx) {\n\t\treturn\n\t}\n\tif pool.newPending.Remove(tx) {\n\t\treturn\n\t}\n}\n\nfunc (pool *TxPool) promoteTx(tx *types.Transaction) bool {\n\t// Try to insert the transaction into the pending queue\n\tif pool.newPending.Add(tx, new(big.Int).Set(pool.gasPrice)) {\n\t\tpool.beats[tx.Hash()] = time.Now()\n\t}\n\treturn true\n}\n\nfunc (pool *TxPool) broadCastLocalTx(tx *types.Transaction) {\n\tgo pool.txFeed.Send(NewTxsEvent{[]*types.Transaction{tx}})\n}\n\nfunc (pool *TxPool) promoteExecutables(broadcast bool) {\n\t// Track the promoted transactions to broadcast them at once\n\tvar promoted []*types.Transaction\n\t//var invalidTx []common.Hash\n\tfor _, tx := range pool.newQueue.Ready() {\n\t\t//if err := pool.validateTx(tx, false); err != nil {\n\t\t//\tinvalidTx = append(invalidTx, tx.Hash())\n\t\t//\tcontinue\n\t\t//}\n\t\tif pool.promoteTx(tx) {\n\t\t\tlog.Trace(\"Promoting queued transaction\", \"hash\", tx.Hash())\n\t\t\tif (pool.config.StartLight || !pool.Mining()) && broadcast {\n\t\t\t\tpromoted = append(promoted, tx)\n\t\t\t}\n\t\t}\n\t}\n\t//if len(invalidTx) > 0 {\n\t//\tfor _, tx := range invalidTx {\n\t//\t\tpool.removeAllTx(tx)\n\t//\t}\n\t//\n\t//}\n\n\t// Notify subsystem for new promoted transactions.\n\tif len(promoted) > 0 {\n\t\tlog.Debug(\"txpool promoted and broadcast txs\", \"txs\", len(promoted))\n\t\t//subLen := 100\n\t\t//if len(promoted) > subLen {\n\t\t//\tpromoted = promoted[:subLen]\n\t\t//}\n\t\tgo pool.txFeed.Send(NewTxsEvent{promoted})\n\t}\n\n\t// If we've queued more transactions than the hard limit, drop oldest ones\n\tif uint64(pool.newPending.Len()) > pool.config.GlobalQueue {\n\t\tdrop := uint64(pool.newPending.Len()) - pool.config.GlobalQueue\n\t\tif drop > 0 {\n\t\t\ttransactions := pool.newPending.Discard(int(drop))\n\t\t\tfor _, tx := range transactions {\n\t\t\t\tpool.newQueue.Add(tx, big.NewInt(0))\n\t\t\t\tlog.Trace(\"Removed fairness-exceeding pending transaction\", \"hash\", tx.Hash())\n\t\t\t}\n\t\t}\n\t}\n}\n\n// txLookup is used internally by TxPool to track transactions while allowing lookup without\n// mutex contention.\n//\n// Note, although this type is properly protected against concurrent access, it\n// is **not** a type that should ever be mutated or even exposed outside of the\n// transaction pool, since its internal state is tightly coupled with the pools\n// internal mechanisms. The sole purpose of the type is to permit out-of-bound\n// peeking into the pool in TxPool.Get without having to acquire the widely scoped\n// TxPool.mu mutex.\ntype txLookup struct {\n\tall  map[common.Hash]*types.Transaction\n\tlock sync.RWMutex\n}\n\n// newTxLookup returns a new txLookup structure.\nfunc newTxLookup() *txLookup {\n\treturn &txLookup{\n\t\tall: make(map[common.Hash]*types.Transaction),\n\t}\n}\n\n// Range calls f on each key and value present in the map.\nfunc (t *txLookup) Range(f func(hash common.Hash, tx *types.Transaction) bool) {\n\tt.lock.RLock()\n\tdefer t.lock.RUnlock()\n\n\tfor key, value := range t.all {\n\t\tif !f(key, value) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Get returns a transaction if it exists in the lookup, or nil if not found.\nfunc (t *txLookup) Get(hash common.Hash) *types.Transaction {\n\tt.lock.RLock()\n\tdefer t.lock.RUnlock()\n\n\treturn t.all[hash]\n}\n\n// Count returns the current number of items in the lookup.\nfunc (t *txLookup) Count() int {\n\tt.lock.RLock()\n\tdefer t.lock.RUnlock()\n\n\treturn len(t.all)\n}\n\n// Add adds a transaction to the lookup.\nfunc (t *txLookup) Add(tx *types.Transaction) {\n\tt.lock.Lock()\n\tdefer t.lock.Unlock()\n\n\tt.all[tx.Hash()] = tx\n}\n\n// Remove removes a transaction from the lookup.\nfunc (t *txLookup) Remove(hash common.Hash) {\n\tt.lock.Lock()\n\tdefer t.lock.Unlock()\n\n\tdelete(t.all, hash)\n}\n"
  },
  {
    "path": "core/types/block.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package types contains data types related to Ethereum consensus.\npackage types\n\nimport (\n\t\"encoding/binary\"\n\t\"math/big\"\n\t\"sort\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nvar (\n\tEmptyRootHash = DeriveSha(Transactions{})\n\tmaxUint256    = new(big.Int).Exp(big.NewInt(2), big.NewInt(256), big.NewInt(0))\n)\n\n// Body is a simple (mutable, non-safe) data container for storing and moving\n// a block's data contents (transactions) together.\ntype Body struct {\n\tTransactions []*Transaction\n}\n\n// Block represents an entire block in the Ethereum blockchain.\ntype Block struct {\n\theader       *Header\n\ttransactions Transactions\n\n\t// caches\n\thash    atomic.Value\n\thashPos atomic.Value\n\tsize    atomic.Value\n\n\t// Td is used by package core to store the total difficulty\n\t// of the chain up to and including the block.\n\ttd *big.Int\n\n\t// These fields are used by package sero to track\n\t// inter-peer block relay.\n\tReceivedAt   time.Time\n\tReceivedFrom interface{}\n}\n\nfunc (b *Block) SetVotes(CurrentVotes []HeaderVote, ParentVotes []HeaderVote) {\n\tb.header.CurrentVotes = append([]HeaderVote{}, CurrentVotes...)\n\tb.header.ParentVotes = append([]HeaderVote{}, ParentVotes...)\n}\n\n// DeprecatedTd is an old relic for extracting the TD of a block. It is in the\n// code solely to facilitate upgrading the database from the old format to the\n// new, after which it should be deleted. Do not use!\nfunc (b *Block) DeprecatedTd() *big.Int {\n\treturn b.td\n}\n\n// NewBlock creates a new block. The input data is copied,\n// changes to header and to the field values will not affect the\n// block.\n//\n// The values of TxHash, UncleHash, ReceiptHash and Bloom in header\n// are ignored and set to values derived from the given txs and receipts.\nfunc NewBlock(header *Header, txs []*Transaction, receipts []*Receipt) *Block {\n\tb := &Block{header: CopyHeader(header), td: new(big.Int)}\n\n\t// TODO: panic if len(txs) != len(receipts)\n\tif len(txs) == 0 {\n\t\tb.header.TxHash = EmptyRootHash\n\t} else {\n\t\tb.header.TxHash = DeriveSha(Transactions(txs))\n\t\tb.transactions = make(Transactions, len(txs))\n\t\tcopy(b.transactions, txs)\n\t}\n\n\tif len(receipts) == 0 {\n\t\tb.header.ReceiptHash = EmptyRootHash\n\t} else {\n\t\tb.header.ReceiptHash = DeriveSha(Receipts(receipts))\n\t\tb.header.Bloom = CreateBloom(receipts)\n\t}\n\n\treturn b\n}\n\n// NewBlockWithHeader creates a block with the given header data. The\n// header data is copied, changes to header and to the field values\n// will not affect the block.\nfunc NewBlockWithHeader(header *Header) *Block {\n\treturn &Block{header: CopyHeader(header)}\n}\n\n// TODO: copies\n\nfunc (b *Block) Transactions() Transactions { return b.transactions }\n\nfunc (b *Block) Transaction(hash common.Hash) *Transaction {\n\tfor _, transaction := range b.transactions {\n\t\tif transaction.Hash() == hash {\n\t\t\treturn transaction\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (b *Block) Number() *big.Int     { return new(big.Int).Set(b.header.Number) }\nfunc (b *Block) GasLimit() uint64     { return b.header.GasLimit }\nfunc (b *Block) GasUsed() uint64      { return b.header.GasUsed }\nfunc (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) }\nfunc (b *Block) Time() *big.Int       { return new(big.Int).Set(b.header.Time) }\n\nfunc (b *Block) NumberU64() uint64        { return b.header.Number.Uint64() }\nfunc (b *Block) MixDigest() common.Hash   { return b.header.MixDigest }\nfunc (b *Block) Nonce() uint64            { return binary.BigEndian.Uint64(b.header.Nonce[:]) }\nfunc (b *Block) Bloom() Bloom             { return b.header.Bloom }\nfunc (b *Block) Coinbase() common.Address { return b.header.Coinbase }\nfunc (b *Block) Root() common.Hash        { return b.header.Root }\nfunc (b *Block) ParentHash() common.Hash  { return b.header.ParentHash }\nfunc (b *Block) TxHash() common.Hash      { return b.header.TxHash }\nfunc (b *Block) ReceiptHash() common.Hash { return b.header.ReceiptHash }\nfunc (b *Block) Extra() []byte            { return common.CopyBytes(b.header.Extra) }\n\nfunc (b *Block) Header() *Header { return CopyHeader(b.header) }\n\n// Body returns the non-header content of the block.\nfunc (b *Block) Body() *Body { return &Body{b.transactions} }\n\nfunc (b *Block) HashNoNonce() common.Hash {\n\treturn b.header.HashPow()\n}\n\n// Size returns the true RLP encoded storage size of the block, either by encoding\n// and returning it, or returning a previsouly cached value.\nfunc (b *Block) Size() common.StorageSize {\n\tif size := b.size.Load(); size != nil {\n\t\treturn size.(common.StorageSize)\n\t}\n\tc := writeCounter(0)\n\trlp.Encode(&c, b)\n\tb.size.Store(common.StorageSize(c))\n\treturn common.StorageSize(c)\n}\n\ntype writeCounter common.StorageSize\n\nfunc (c *writeCounter) Write(b []byte) (int, error) {\n\t*c += writeCounter(len(b))\n\treturn len(b), nil\n}\n\n// WithSeal returns a new block with the data from b but the header replaced with\n// the sealed one.\nfunc (b *Block) WithSeal(header *Header) *Block {\n\tcpy := *header\n\n\treturn &Block{\n\t\theader:       &cpy,\n\t\ttransactions: b.transactions,\n\t}\n}\n\n// WithBody returns a new block with the given transaction.\nfunc (b *Block) WithBody(transactions []*Transaction) *Block {\n\tblock := &Block{\n\t\theader:       CopyHeader(b.header),\n\t\ttransactions: make([]*Transaction, len(transactions)),\n\t}\n\tcopy(block.transactions, transactions)\n\treturn block\n}\n\n// Hash returns the keccak256 hash of b's header.\n// The hash is computed on the first call and cached thereafter.\nfunc (b *Block) Hash() common.Hash {\n\tif hash := b.hash.Load(); hash != nil {\n\t\treturn hash.(common.Hash)\n\t}\n\tv := b.header.Hash()\n\tb.hash.Store(v)\n\treturn v\n}\n\nfunc (b *Block) HashPos() common.Hash {\n\tif hash := b.hashPos.Load(); hash != nil {\n\t\treturn hash.(common.Hash)\n\t}\n\tv := b.header.HashPos()\n\tb.hashPos.Store(v)\n\treturn v\n}\n\ntype Blocks []*Block\n\ntype BlockBy func(b1, b2 *Block) bool\n\nfunc (self BlockBy) Sort(blocks Blocks) {\n\tbs := blockSorter{\n\t\tblocks: blocks,\n\t\tby:     self,\n\t}\n\tsort.Sort(bs)\n}\n\ntype blockSorter struct {\n\tblocks Blocks\n\tby     func(b1, b2 *Block) bool\n}\n\nfunc (self blockSorter) Len() int { return len(self.blocks) }\nfunc (self blockSorter) Swap(i, j int) {\n\tself.blocks[i], self.blocks[j] = self.blocks[j], self.blocks[i]\n}\nfunc (self blockSorter) Less(i, j int) bool { return self.by(self.blocks[i], self.blocks[j]) }\n\nfunc Number(b1, b2 *Block) bool { return b1.header.Number.Cmp(b2.header.Number) < 0 }\n"
  },
  {
    "path": "core/types/block_rlp.go",
    "content": "package types\n\nimport (\n\t\"io\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// \"external\" block encoding. used for sero protocol, etc.\ntype Block_Version_0 struct {\n\tHeader *Header\n\tTxs    []*Transaction\n}\n\n// DecodeRLP decodes the Ethereum\nfunc (b *Block) DecodeRLP(s *rlp.Stream) error {\n\tb0 := Block_Version_0{}\n\n\t_, size, _ := s.Kind()\n\tif err := s.Decode(&b0); err != nil {\n\t\treturn err\n\t}\n\n\tb.header = b0.Header\n\tb.transactions = b0.Txs\n\n\tb.size.Store(common.StorageSize(rlp.ListSize(size)))\n\treturn nil\n}\n\n// EncodeRLP serializes b into the Ethereum RLP block format.\nfunc (b *Block) EncodeRLP(w io.Writer) error {\n\tb0 := Block_Version_0{}\n\tb0.Header = b.header\n\tb0.Txs = b.transactions\n\treturn rlp.Encode(w, b0)\n}\n"
  },
  {
    "path": "core/types/block_test.go",
    "content": "package types\n"
  },
  {
    "path": "core/types/bloom9.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage types\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\ntype bytesBacked interface {\n\tBytes() []byte\n}\n\nconst (\n\t// BloomByteLength represents the number of bytes used in a header log bloom.\n\tBloomByteLength = 256\n\n\t// BloomBitLength represents the number of bits used in a header log bloom.\n\tBloomBitLength = 8 * BloomByteLength\n)\n\n// Bloom represents a 2048 bit bloom filter.\ntype Bloom [BloomByteLength]byte\n\n// BytesToBloom converts a byte slice to a bloom filter.\n// It panics if b is not of suitable size.\nfunc BytesToBloom(b []byte) Bloom {\n\tvar bloom Bloom\n\tbloom.SetBytes(b)\n\treturn bloom\n}\n\n// SetBytes sets the content of b to the given bytes.\n// It panics if d is not of suitable size.\nfunc (b *Bloom) SetBytes(d []byte) {\n\tif len(b) < len(d) {\n\t\tpanic(fmt.Sprintf(\"bloom bytes too big %d %d\", len(b), len(d)))\n\t}\n\tcopy(b[BloomByteLength-len(d):], d)\n}\n\n// Add adds d to the filter. Future calls of Test(d) will return true.\nfunc (b *Bloom) Add(d *big.Int) {\n\tbin := new(big.Int).SetBytes(b[:])\n\tbin.Or(bin, bloom9(d.Bytes()))\n\tb.SetBytes(bin.Bytes())\n}\n\n// Big converts b to a big integer.\nfunc (b Bloom) Big() *big.Int {\n\treturn new(big.Int).SetBytes(b[:])\n}\n\nfunc (b Bloom) Bytes() []byte {\n\treturn b[:]\n}\n\nfunc (b Bloom) Test(test *big.Int) bool {\n\treturn BloomLookup(b, test)\n}\n\nfunc (b Bloom) TestBytes(test []byte) bool {\n\treturn b.Test(new(big.Int).SetBytes(test))\n\n}\n\n// MarshalText encodes b as a hex string with 0x prefix.\nfunc (b Bloom) MarshalText() ([]byte, error) {\n\treturn hexutil.Bytes(b[:]).MarshalText()\n}\n\n// UnmarshalText b as a hex string with 0x prefix.\nfunc (b *Bloom) UnmarshalText(input []byte) error {\n\treturn hexutil.UnmarshalFixedText(\"Bloom\", input, b[:])\n}\n\nfunc CreateBloom(receipts Receipts) Bloom {\n\tbin := new(big.Int)\n\tfor _, receipt := range receipts {\n\t\tbin.Or(bin, LogsBloom(receipt.Logs))\n\t}\n\n\treturn BytesToBloom(bin.Bytes())\n}\n\nfunc LogsBloom(logs []*Log) *big.Int {\n\tbin := new(big.Int)\n\tfor _, log := range logs {\n\t\tbin.Or(bin, bloom9(log.Address.Bytes()))\n\t\tfor _, b := range log.Topics {\n\t\t\tbin.Or(bin, bloom9(b[:]))\n\t\t}\n\t}\n\n\treturn bin\n}\n\nfunc bloom9(b []byte) *big.Int {\n\tb = crypto.Keccak256(b[:])\n\n\tr := new(big.Int)\n\n\tfor i := 0; i < 6; i += 2 {\n\t\tt := big.NewInt(1)\n\t\tb := (uint(b[i+1]) + (uint(b[i]) << 8)) & 2047\n\t\tr.Or(r, t.Lsh(t, b))\n\t}\n\n\treturn r\n}\n\nvar Bloom9 = bloom9\n\nfunc BloomLookup(bin Bloom, topic bytesBacked) bool {\n\tbloom := bin.Big()\n\tcmp := bloom9(topic.Bytes()[:])\n\n\treturn bloom.And(bloom, cmp).Cmp(cmp) == 0\n}\n"
  },
  {
    "path": "core/types/derive_sha.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage types\n\nimport (\n\t\"bytes\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\ntype DerivableList interface {\n\tLen() int\n\tGetRlp(i int) []byte\n}\n\nfunc DeriveSha(list DerivableList) common.Hash {\n\tkeybuf := new(bytes.Buffer)\n\ttrie := new(trie.Trie)\n\tfor i := 0; i < list.Len(); i++ {\n\t\tkeybuf.Reset()\n\t\trlp.Encode(keybuf, uint(i))\n\t\ttrie.Update(keybuf.Bytes(), list.GetRlp(i))\n\t}\n\treturn trie.Hash()\n}\n"
  },
  {
    "path": "core/types/gen_header_json.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage types\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nvar _ = (*headerMarshaling)(nil)\n\n// MarshalJSON marshals as JSON.\nfunc (h Header) MarshalJSON() ([]byte, error) {\n\ttype Header struct {\n\t\tParentHash  common.Hash    `json:\"parentHash\"       gencodec:\"required\"`\n\t\tCoinbase    common.Address `json:\"miner\"            gencodec:\"required\"`\n\t\tRoot        common.Hash    `json:\"stateRoot\"        gencodec:\"required\"`\n\t\tTxHash      common.Hash    `json:\"transactionsRoot\" gencodec:\"required\"`\n\t\tReceiptHash common.Hash    `json:\"receiptsRoot\"     gencodec:\"required\"`\n\t\tBloom       Bloom          `json:\"logsBloom\"        gencodec:\"required\"`\n\t\tDifficulty  *hexutil.Big   `json:\"difficulty\"       gencodec:\"required\"`\n\t\tNumber      *hexutil.Big   `json:\"number\"           gencodec:\"required\"`\n\t\tGasLimit    hexutil.Uint64 `json:\"gasLimit\"         gencodec:\"required\"`\n\t\tGasUsed     hexutil.Uint64 `json:\"gasUsed\"          gencodec:\"required\"`\n\t\tTime        *hexutil.Big   `json:\"timestamp\"        gencodec:\"required\"`\n\t\tExtra       hexutil.Bytes  `json:\"extraData\"        gencodec:\"required\"`\n\t\tMixDigest   common.Hash    `json:\"mixHash\"          gencodec:\"required\"`\n\t\tNonce       BlockNonce     `json:\"nonce\"            gencodec:\"required\"`\n\t\tHash        common.Hash    `json:\"hash\"`\n\t}\n\tvar enc Header\n\tenc.ParentHash = h.ParentHash\n\tenc.Coinbase = h.Coinbase\n\tenc.Root = h.Root\n\tenc.TxHash = h.TxHash\n\tenc.ReceiptHash = h.ReceiptHash\n\tenc.Bloom = h.Bloom\n\tenc.Difficulty = (*hexutil.Big)(h.Difficulty)\n\tenc.Number = (*hexutil.Big)(h.Number)\n\tenc.GasLimit = hexutil.Uint64(h.GasLimit)\n\tenc.GasUsed = hexutil.Uint64(h.GasUsed)\n\tenc.Time = (*hexutil.Big)(h.Time)\n\tenc.Extra = h.Extra\n\tenc.MixDigest = h.MixDigest\n\tenc.Nonce = h.Nonce\n\tenc.Hash = h.Hash()\n\treturn json.Marshal(&enc)\n}\n\n// UnmarshalJSON unmarshals from JSON.\nfunc (h *Header) UnmarshalJSON(input []byte) error {\n\ttype Header struct {\n\t\tParentHash  *common.Hash    `json:\"parentHash\"       gencodec:\"required\"`\n\t\tCoinbase    *common.Address `json:\"miner\"            gencodec:\"required\"`\n\t\tRoot        *common.Hash    `json:\"stateRoot\"        gencodec:\"required\"`\n\t\tTxHash      *common.Hash    `json:\"transactionsRoot\" gencodec:\"required\"`\n\t\tReceiptHash *common.Hash    `json:\"receiptsRoot\"     gencodec:\"required\"`\n\t\tBloom       *Bloom          `json:\"logsBloom\"        gencodec:\"required\"`\n\t\tDifficulty  *hexutil.Big    `json:\"difficulty\"       gencodec:\"required\"`\n\t\tNumber      *hexutil.Big    `json:\"number\"           gencodec:\"required\"`\n\t\tGasLimit    *hexutil.Uint64 `json:\"gasLimit\"         gencodec:\"required\"`\n\t\tGasUsed     *hexutil.Uint64 `json:\"gasUsed\"          gencodec:\"required\"`\n\t\tTime        *hexutil.Big    `json:\"timestamp\"        gencodec:\"required\"`\n\t\tExtra       *hexutil.Bytes  `json:\"extraData\"        gencodec:\"required\"`\n\t\tMixDigest   *common.Hash    `json:\"mixHash\"          gencodec:\"required\"`\n\t\tNonce       *BlockNonce     `json:\"nonce\"            gencodec:\"required\"`\n\t}\n\tvar dec Header\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.ParentHash == nil {\n\t\treturn errors.New(\"missing required field 'parentHash' for Header\")\n\t}\n\th.ParentHash = *dec.ParentHash\n\tif dec.Coinbase == nil {\n\t\treturn errors.New(\"missing required field 'miner' for Header\")\n\t}\n\th.Coinbase = *dec.Coinbase\n\tif dec.Root == nil {\n\t\treturn errors.New(\"missing required field 'stateRoot' for Header\")\n\t}\n\th.Root = *dec.Root\n\tif dec.TxHash == nil {\n\t\treturn errors.New(\"missing required field 'transactionsRoot' for Header\")\n\t}\n\th.TxHash = *dec.TxHash\n\tif dec.ReceiptHash == nil {\n\t\treturn errors.New(\"missing required field 'receiptsRoot' for Header\")\n\t}\n\th.ReceiptHash = *dec.ReceiptHash\n\tif dec.Bloom == nil {\n\t\treturn errors.New(\"missing required field 'logsBloom' for Header\")\n\t}\n\th.Bloom = *dec.Bloom\n\tif dec.Difficulty == nil {\n\t\treturn errors.New(\"missing required field 'difficulty' for Header\")\n\t}\n\th.Difficulty = (*big.Int)(dec.Difficulty)\n\tif dec.Number == nil {\n\t\treturn errors.New(\"missing required field 'number' for Header\")\n\t}\n\th.Number = (*big.Int)(dec.Number)\n\tif dec.GasLimit == nil {\n\t\treturn errors.New(\"missing required field 'gasLimit' for Header\")\n\t}\n\th.GasLimit = uint64(*dec.GasLimit)\n\tif dec.GasUsed == nil {\n\t\treturn errors.New(\"missing required field 'gasUsed' for Header\")\n\t}\n\th.GasUsed = uint64(*dec.GasUsed)\n\tif dec.Time == nil {\n\t\treturn errors.New(\"missing required field 'timestamp' for Header\")\n\t}\n\th.Time = (*big.Int)(dec.Time)\n\tif dec.Extra == nil {\n\t\treturn errors.New(\"missing required field 'extraData' for Header\")\n\t}\n\th.Extra = *dec.Extra\n\tif dec.MixDigest == nil {\n\t\treturn errors.New(\"missing required field 'mixHash' for Header\")\n\t}\n\th.MixDigest = *dec.MixDigest\n\tif dec.Nonce == nil {\n\t\treturn errors.New(\"missing required field 'nonce' for Header\")\n\t}\n\th.Nonce = *dec.Nonce\n\treturn nil\n}\n"
  },
  {
    "path": "core/types/gen_log_json.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage types\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nvar _ = (*logMarshaling)(nil)\n\n// MarshalJSON marshals as JSON.\nfunc (l Log) MarshalJSON() ([]byte, error) {\n\ttype Log struct {\n\t\tAddress     common.Address `json:\"address\" gencodec:\"required\"`\n\t\tTopics      []common.Hash  `json:\"topics\" gencodec:\"required\"`\n\t\tData        hexutil.Bytes  `json:\"data\" gencodec:\"required\"`\n\t\tBlockNumber hexutil.Uint64 `json:\"blockNumber\"`\n\t\tTxHash      common.Hash    `json:\"transactionHash\" gencodec:\"required\"`\n\t\tTxIndex     hexutil.Uint   `json:\"transactionIndex\" gencodec:\"required\"`\n\t\tBlockHash   common.Hash    `json:\"blockHash\"`\n\t\tIndex       hexutil.Uint   `json:\"logIndex\" gencodec:\"required\"`\n\t\tRemoved     bool           `json:\"removed\"`\n\t}\n\tvar enc Log\n\tenc.Address = l.Address\n\tenc.Topics = l.Topics\n\tenc.Data = l.Data\n\tenc.BlockNumber = hexutil.Uint64(l.BlockNumber)\n\tenc.TxHash = l.TxHash\n\tenc.TxIndex = hexutil.Uint(l.TxIndex)\n\tenc.BlockHash = l.BlockHash\n\tenc.Index = hexutil.Uint(l.Index)\n\tenc.Removed = l.Removed\n\treturn json.Marshal(&enc)\n}\n\n// UnmarshalJSON unmarshals from JSON.\nfunc (l *Log) UnmarshalJSON(input []byte) error {\n\ttype Log struct {\n\t\tAddress     *common.Address `json:\"address\" gencodec:\"required\"`\n\t\tTopics      []common.Hash   `json:\"topics\" gencodec:\"required\"`\n\t\tData        *hexutil.Bytes  `json:\"data\" gencodec:\"required\"`\n\t\tBlockNumber *hexutil.Uint64 `json:\"blockNumber\"`\n\t\tTxHash      *common.Hash    `json:\"transactionHash\" gencodec:\"required\"`\n\t\tTxIndex     *hexutil.Uint   `json:\"transactionIndex\" gencodec:\"required\"`\n\t\tBlockHash   *common.Hash    `json:\"blockHash\"`\n\t\tIndex       *hexutil.Uint   `json:\"logIndex\" gencodec:\"required\"`\n\t\tRemoved     *bool           `json:\"removed\"`\n\t}\n\tvar dec Log\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Address == nil {\n\t\treturn errors.New(\"missing required field 'address' for Log\")\n\t}\n\tl.Address = *dec.Address\n\tif dec.Topics == nil {\n\t\treturn errors.New(\"missing required field 'topics' for Log\")\n\t}\n\tl.Topics = dec.Topics\n\tif dec.Data == nil {\n\t\treturn errors.New(\"missing required field 'data' for Log\")\n\t}\n\tl.Data = *dec.Data\n\tif dec.BlockNumber != nil {\n\t\tl.BlockNumber = uint64(*dec.BlockNumber)\n\t}\n\tif dec.TxHash == nil {\n\t\treturn errors.New(\"missing required field 'transactionHash' for Log\")\n\t}\n\tl.TxHash = *dec.TxHash\n\tif dec.TxIndex == nil {\n\t\treturn errors.New(\"missing required field 'transactionIndex' for Log\")\n\t}\n\tl.TxIndex = uint(*dec.TxIndex)\n\tif dec.BlockHash != nil {\n\t\tl.BlockHash = *dec.BlockHash\n\t}\n\tif dec.Index == nil {\n\t\treturn errors.New(\"missing required field 'logIndex' for Log\")\n\t}\n\tl.Index = uint(*dec.Index)\n\tif dec.Removed != nil {\n\t\tl.Removed = *dec.Removed\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "core/types/gen_receipt_json.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage types\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nvar _ = (*receiptMarshaling)(nil)\n\n// MarshalJSON marshals as JSON.\nfunc (r Receipt) MarshalJSON() ([]byte, error) {\n\ttype Receipt struct {\n\t\tPostState         hexutil.Bytes  `json:\"root\"`\n\t\tStatus            hexutil.Uint64 `json:\"status\"`\n\t\tCumulativeGasUsed hexutil.Uint64 `json:\"cumulativeGasUsed\" gencodec:\"required\"`\n\t\tBloom             Bloom          `json:\"logsBloom\"         gencodec:\"required\"`\n\t\tLogs              []*Log         `json:\"logs\"              gencodec:\"required\"`\n\t\tTxHash            common.Hash    `json:\"transactionHash\" gencodec:\"required\"`\n\t\tContractAddress   common.Address `json:\"contractAddress\"`\n\t\tGasUsed           hexutil.Uint64 `json:\"gasUsed\" gencodec:\"required\"`\n\t}\n\tvar enc Receipt\n\tenc.PostState = r.PostState\n\tenc.Status = hexutil.Uint64(r.Status)\n\tenc.CumulativeGasUsed = hexutil.Uint64(r.CumulativeGasUsed)\n\tenc.Bloom = r.Bloom\n\tenc.Logs = r.Logs\n\tenc.TxHash = r.TxHash\n\tenc.ContractAddress = r.ContractAddress\n\tenc.GasUsed = hexutil.Uint64(r.GasUsed)\n\treturn json.Marshal(&enc)\n}\n\n// UnmarshalJSON unmarshals from JSON.\nfunc (r *Receipt) UnmarshalJSON(input []byte) error {\n\ttype Receipt struct {\n\t\tPostState         *hexutil.Bytes  `json:\"root\"`\n\t\tStatus            *hexutil.Uint64 `json:\"status\"`\n\t\tCumulativeGasUsed *hexutil.Uint64 `json:\"cumulativeGasUsed\" gencodec:\"required\"`\n\t\tBloom             *Bloom          `json:\"logsBloom\"         gencodec:\"required\"`\n\t\tLogs              []*Log          `json:\"logs\"              gencodec:\"required\"`\n\t\tTxHash            *common.Hash    `json:\"transactionHash\" gencodec:\"required\"`\n\t\tContractAddress   *common.Address `json:\"contractAddress\"`\n\t\tGasUsed           *hexutil.Uint64 `json:\"gasUsed\" gencodec:\"required\"`\n\t}\n\tvar dec Receipt\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.PostState != nil {\n\t\tr.PostState = *dec.PostState\n\t}\n\tif dec.Status != nil {\n\t\tr.Status = uint64(*dec.Status)\n\t}\n\tif dec.CumulativeGasUsed == nil {\n\t\treturn errors.New(\"missing required field 'cumulativeGasUsed' for Receipt\")\n\t}\n\tr.CumulativeGasUsed = uint64(*dec.CumulativeGasUsed)\n\tif dec.Bloom == nil {\n\t\treturn errors.New(\"missing required field 'logsBloom' for Receipt\")\n\t}\n\tr.Bloom = *dec.Bloom\n\tif dec.Logs == nil {\n\t\treturn errors.New(\"missing required field 'logs' for Receipt\")\n\t}\n\tr.Logs = dec.Logs\n\tif dec.TxHash == nil {\n\t\treturn errors.New(\"missing required field 'transactionHash' for Receipt\")\n\t}\n\tr.TxHash = *dec.TxHash\n\tif dec.ContractAddress != nil {\n\t\tr.ContractAddress = *dec.ContractAddress\n\t}\n\tif dec.GasUsed == nil {\n\t\treturn errors.New(\"missing required field 'gasUsed' for Receipt\")\n\t}\n\tr.GasUsed = uint64(*dec.GasUsed)\n\treturn nil\n}\n"
  },
  {
    "path": "core/types/gen_tx_json.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage types\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n)\n\nvar _ = (*txdataMarshaling)(nil)\n\n// MarshalJSON marshals as JSON.\nfunc (t txdata) MarshalJSON() ([]byte, error) {\n\ttype txdata struct {\n\t\tPrice    *hexutil.Big   `json:\"gasPrice\" gencodec:\"required\"`\n\t\tGasLimit hexutil.Uint64 `json:\"gas\"      gencodec:\"required\"`\n\t\tPayload  hexutil.Bytes  `json:\"input\"    gencodec:\"required\"`\n\t\tStxt     *stx.T         `json:\"stxt\"    gencodec:\"required\"`\n\t}\n\tvar enc txdata\n\tenc.Price = (*hexutil.Big)(t.Price)\n\tenc.GasLimit = hexutil.Uint64(t.GasLimit)\n\tenc.Payload = t.Payload\n\tenc.Stxt = t.Stxt\n\treturn json.Marshal(&enc)\n}\n\n// UnmarshalJSON unmarshals from JSON.\nfunc (t *txdata) UnmarshalJSON(input []byte) error {\n\ttype txdata struct {\n\t\tPrice    *hexutil.Big    `json:\"gasPrice\" gencodec:\"required\"`\n\t\tGasLimit *hexutil.Uint64 `json:\"gas\"      gencodec:\"required\"`\n\t\tPayload  *hexutil.Bytes  `json:\"input\"    gencodec:\"required\"`\n\t\tStxt     *stx.T          `json:\"stxt\"    gencodec:\"required\"`\n\t}\n\tvar dec txdata\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Price == nil {\n\t\treturn errors.New(\"missing required field 'gasPrice' for txdata\")\n\t}\n\tt.Price = (*big.Int)(dec.Price)\n\tif dec.GasLimit == nil {\n\t\treturn errors.New(\"missing required field 'gas' for txdata\")\n\t}\n\tt.GasLimit = uint64(*dec.GasLimit)\n\tif dec.Payload == nil {\n\t\treturn errors.New(\"missing required field 'input' for txdata\")\n\t}\n\tt.Payload = *dec.Payload\n\tif dec.Stxt == nil {\n\t\treturn errors.New(\"missing required field 'stxt' for txdata\")\n\t}\n\tt.Stxt = dec.Stxt\n\treturn nil\n}\n"
  },
  {
    "path": "core/types/header.go",
    "content": "package types\n\nimport (\n\t\"encoding/binary\"\n\t\"io\"\n\t\"math/big\"\n\t\"unsafe\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/core/types/vserial\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// A BlockNonce is a 64-bit hash which proves (combined with the\n// mix-hash) that a sufficient amount of computation has been carried\n// out on a block.\ntype BlockNonce [8]byte\n\n// EncodeNonce converts the given integer to a block nonce.\nfunc EncodeNonce(i uint64) BlockNonce {\n\tvar n BlockNonce\n\tbinary.BigEndian.PutUint64(n[:], i)\n\treturn n\n}\n\n// Uint64 returns the integer value of a block nonce.\nfunc (n BlockNonce) Uint64() uint64 {\n\treturn binary.BigEndian.Uint64(n[:])\n}\n\n// MarshalText encodes n as a hex string with 0x prefix.\nfunc (n BlockNonce) MarshalText() ([]byte, error) {\n\treturn hexutil.Bytes(n[:]).MarshalText()\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (n *BlockNonce) UnmarshalText(input []byte) error {\n\treturn hexutil.UnmarshalFixedText(\"BlockNonce\", input, n[:])\n}\n\n//go:generate gencodec -type Version_0 -field-override headerMarshaling -out gen_header_json.go\n\n// Version_0 represents a block header in the Ethereum blockchain.\ntype Header struct {\n\t//Data\n\tParentHash  common.Hash    `json:\"parentHash\"       gencodec:\"required\"`\n\tCoinbase    common.Address `json:\"miner\"            gencodec:\"required\"`\n\tLicr        c_type.LICr    `json:\"licr\"            \tgencodec:\"required\"`\n\tRoot        common.Hash    `json:\"stateRoot\"        gencodec:\"required\"`\n\tTxHash      common.Hash    `json:\"transactionsRoot\" gencodec:\"required\"`\n\tReceiptHash common.Hash    `json:\"receiptsRoot\"     gencodec:\"required\"`\n\tBloom       Bloom          `json:\"logsBloom\"        gencodec:\"required\"`\n\tDifficulty  *big.Int       `json:\"difficulty\"       gencodec:\"required\"`\n\tNumber      *big.Int       `json:\"number\"           gencodec:\"required\"`\n\tGasLimit    uint64         `json:\"gasLimit\"         gencodec:\"required\"`\n\tGasUsed     uint64         `json:\"gasUsed\"          gencodec:\"required\"`\n\tTime        *big.Int       `json:\"timestamp\"        gencodec:\"required\"`\n\tExtra       []byte         `json:\"extraData\"        gencodec:\"required\"`\n\t//POW\n\tMixDigest common.Hash `json:\"mixHash\"          gencodec:\"required\"`\n\tNonce     BlockNonce  `json:\"nonce\"            gencodec:\"required\"`\n\t//POS\n\tCurrentVotes []HeaderVote\n\tParentVotes  []HeaderVote\n}\n\n// field type overrides for gencodec\ntype headerMarshaling struct {\n\tDifficulty *hexutil.Big\n\tNumber     *hexutil.Big\n\tGasLimit   hexutil.Uint64\n\tGasUsed    hexutil.Uint64\n\tTime       *hexutil.Big\n\tExtra      hexutil.Bytes\n\tHash       common.Hash `json:\"hash\"` // adds call to Hash() in MarshalJSON\n}\n\nfunc (h *Header) Valid() bool {\n\tif h.Number.Uint64() >= seroparam.SIP5() {\n\t\treturn true\n\t} else {\n\t\tif h.Licr.H == 0 {\n\t\t\treturn h.Number.Uint64() >= h.Licr.L\n\t\t} else {\n\t\t\treturn h.Number.Uint64() >= h.Licr.L && h.Number.Uint64() <= h.Licr.H\n\t\t}\n\t}\n}\n\n// Hash returns the block hash of the header, which is simply the keccak256 hash of its\n// RLP encoding.\nfunc (h *Header) Hash() common.Hash {\n\treturn rlpHash(h)\n}\n\n// HashNoNonce returns the hash which is used as input for the proof-of-work search.\nfunc (h *Header) HashPow() common.Hash {\n\treturn rlpHash([]interface{}{\n\t\th.ParentHash,\n\t\th.Coinbase,\n\t\th.Root,\n\t\th.TxHash,\n\t\th.ReceiptHash,\n\t\th.Bloom,\n\t\th.Difficulty,\n\t\th.Number,\n\t\th.GasLimit,\n\t\th.GasUsed,\n\t\th.Time,\n\t\th.Extra,\n\t})\n}\n\nfunc (h *Header) HashPos() (ret common.Hash) {\n\tm := sha3.NewKeccak256()\n\tm.Write(h.MixDigest[:])\n\tm.Write(h.Nonce[:])\n\thp := m.Sum(nil)\n\tcopy(ret[:], hp)\n\treturn\n}\n\nfunc StakeHash(currentHashPos *common.Hash, parentHashPos *common.Hash, isPool bool) (ret common.Hash) {\n\tm := sha3.NewKeccak256()\n\tm.Write(currentHashPos[:])\n\tm.Write(parentHashPos[:])\n\tif isPool {\n\t\tm.Write([]byte{1})\n\t}\n\tsh := m.Sum(nil)\n\tcopy(ret[:], sh)\n\treturn\n}\n\nfunc (h *Header) ActualDifficulty() *big.Int {\n\tif h.Number.Uint64() >= seroparam.SIP5() {\n\t\treturn h.Difficulty\n\t} else {\n\t\tif h.Valid() {\n\t\t\tc := new(big.Int).SetUint64(h.Licr.C)\n\t\t\tif h.Difficulty.Cmp(c) > 0 {\n\t\t\t\treturn new(big.Int).Sub(h.Difficulty, c)\n\t\t\t} else {\n\t\t\t\treturn big.NewInt(1)\n\t\t\t}\n\t\t} else {\n\t\t\treturn maxUint256\n\t\t}\n\t}\n}\n\n// Size returns the approximate memory used by all internal contents. It is used\n// to approximate and limit the memory consumption of various caches.\nfunc (h *Header) Size() common.StorageSize {\n\treturn common.StorageSize(unsafe.Sizeof(*h)) + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen()+h.Time.BitLen())/8)\n}\n\nfunc rlpHash(x interface{}) (h common.Hash) {\n\thw := sha3.NewKeccak256()\n\trlp.Encode(hw, x)\n\thw.Sum(h[:0])\n\treturn h\n}\n\n// CopyHeader creates a deep copy of a block header to prevent side effects from\n// modifying a header variable.\nfunc CopyHeader(h *Header) *Header {\n\tcpy := *h\n\tif cpy.Time = new(big.Int); h.Time != nil {\n\t\tcpy.Time.Set(h.Time)\n\t}\n\tif cpy.Difficulty = new(big.Int); h.Difficulty != nil {\n\t\tcpy.Difficulty.Set(h.Difficulty)\n\t}\n\tif cpy.Number = new(big.Int); h.Number != nil {\n\t\tcpy.Number.Set(h.Number)\n\t}\n\tif len(h.Extra) > 0 {\n\t\tcpy.Extra = make([]byte, len(h.Extra))\n\t\tcopy(cpy.Extra, h.Extra)\n\t}\n\tif len(h.CurrentVotes) > 0 {\n\t\tcpy.CurrentVotes = append([]HeaderVote{}, h.CurrentVotes...)\n\t}\n\tif len(h.ParentVotes) > 0 {\n\t\tcpy.ParentVotes = append([]HeaderVote{}, h.ParentVotes...)\n\t}\n\treturn &cpy\n}\n\ntype Header_Version_0 struct {\n\t//Data\n\tParentHash  common.Hash    `json:\"parentHash\"       gencodec:\"required\"`\n\tCoinbase    common.Address `json:\"miner\"            gencodec:\"required\"`\n\tLicr        c_type.LICr    `json:\"licr\"            \tgencodec:\"required\"`\n\tRoot        common.Hash    `json:\"stateRoot\"        gencodec:\"required\"`\n\tTxHash      common.Hash    `json:\"transactionsRoot\" gencodec:\"required\"`\n\tReceiptHash common.Hash    `json:\"receiptsRoot\"     gencodec:\"required\"`\n\tBloom       Bloom          `json:\"logsBloom\"        gencodec:\"required\"`\n\tDifficulty  *big.Int       `json:\"difficulty\"       gencodec:\"required\"`\n\tNumber      *big.Int       `json:\"number\"           gencodec:\"required\"`\n\tGasLimit    uint64         `json:\"gasLimit\"         gencodec:\"required\"`\n\tGasUsed     uint64         `json:\"gasUsed\"          gencodec:\"required\"`\n\tTime        *big.Int       `json:\"timestamp\"        gencodec:\"required\"`\n\tExtra       []byte         `json:\"extraData\"        gencodec:\"required\"`\n\t//POW\n\tMixDigest common.Hash `json:\"mixHash\"          gencodec:\"required\"`\n\tNonce     BlockNonce  `json:\"nonce\"            gencodec:\"required\"`\n}\n\ntype Header_Version_1 struct {\n\t//POS\n\tCurrentVotes []HeaderVote\n\tParentVotes  []HeaderVote\n}\n\n// DecodeRLP decodes the Ethereum\nfunc (b *Header) DecodeRLP(s *rlp.Stream) error {\n\th0 := Header_Version_0{}\n\th1 := Header_Version_1{}\n\tvs := vserial.NewVSerial()\n\tvs.Add(&h0, vserial.VERSION_0)\n\tvs.Add(&h1, vserial.VERSION_1)\n\n\tif e := s.Decode(&vs); e != nil {\n\t\treturn e\n\t}\n\n\tb.ParentHash = h0.ParentHash\n\tb.Coinbase = h0.Coinbase\n\tb.Licr = h0.Licr\n\tb.Root = h0.Root\n\tb.TxHash = h0.TxHash\n\tb.ReceiptHash = h0.ReceiptHash\n\tb.Bloom = h0.Bloom\n\tb.Difficulty = h0.Difficulty\n\tb.Number = h0.Number\n\tb.GasLimit = h0.GasLimit\n\tb.GasUsed = h0.GasUsed\n\tb.Time = h0.Time\n\tb.Extra = h0.Extra\n\tb.MixDigest = h0.MixDigest\n\tb.Nonce = h0.Nonce\n\n\tb.CurrentVotes = h1.CurrentVotes\n\tb.ParentVotes = h1.ParentVotes\n\treturn nil\n}\n\n// EncodeRLP serializes b into the Ethereum RLP block format.\nfunc (b *Header) EncodeRLP(w io.Writer) error {\n\tvs := vserial.NewVSerial()\n\n\th0 := Header_Version_0{}\n\th0.ParentHash = b.ParentHash\n\th0.Coinbase = b.Coinbase\n\th0.Licr = b.Licr\n\th0.Root = b.Root\n\th0.TxHash = b.TxHash\n\th0.ReceiptHash = b.ReceiptHash\n\th0.Bloom = b.Bloom\n\th0.Difficulty = b.Difficulty\n\th0.Number = b.Number\n\th0.GasLimit = b.GasLimit\n\th0.GasUsed = b.GasUsed\n\th0.Time = b.Time\n\th0.Extra = b.Extra\n\th0.MixDigest = b.MixDigest\n\th0.Nonce = b.Nonce\n\n\tvs.Add(&h0, vserial.VERSION_0)\n\n\tif len(b.CurrentVotes) > 0 || len(b.ParentVotes) > 0 {\n\t\th1 := Header_Version_1{}\n\t\th1.CurrentVotes = b.CurrentVotes\n\t\th1.ParentVotes = b.ParentVotes\n\t\tvs.Add(&h1, vserial.VERSION_1)\n\t}\n\n\treturn rlp.Encode(w, &vs)\n}\n"
  },
  {
    "path": "core/types/header_test.go",
    "content": "package types\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nfunc TestRLP(t *testing.T) {\n\tbuf := bytes.Buffer{}\n\tw := bufio.NewWriter(&buf)\n\n\ttx := Header{}\n\ttx.GasUsed = 10\n\ttx.CurrentVotes = append(tx.CurrentVotes, HeaderVote{})\n\n\te := rlp.Encode(w, &tx)\n\tfmt.Println(e)\n\tw.Flush()\n\n\tdtx := Header{}\n\tstream := rlp.NewStream(&buf, uint64(buf.Len()))\n\t_, size, _ := stream.Kind()\n\tfmt.Println(size)\n\te = stream.Decode(&dtx)\n\tfmt.Println(e)\n\tfmt.Println(dtx)\n}\n"
  },
  {
    "path": "core/types/log.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage types\n\nimport (\n\t\"io\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n//go:generate gencodec -type Log -field-override logMarshaling -out gen_log_json.go\n\n// Log represents a contract log event. These events are generated by the LOG opcode and\n// stored/indexed by the node.\ntype Log struct {\n\t// Consensus fields:\n\t// address of the contract that generated the event\n\tAddress common.Address `json:\"address\" gencodec:\"required\"`\n\t// list of topics provided by the contract.\n\tTopics []common.Hash `json:\"topics\" gencodec:\"required\"`\n\t// supplied by the contract, usually ABI-encoded\n\tData []byte `json:\"data\" gencodec:\"required\"`\n\n\t// Derived fields. These fields are filled in by the node\n\t// but not secured by consensus.\n\t// block in which the transaction was included\n\tBlockNumber uint64 `json:\"blockNumber\"`\n\t// hash of the transaction\n\tTxHash common.Hash `json:\"transactionHash\" gencodec:\"required\"`\n\t// index of the transaction in the block\n\tTxIndex uint `json:\"transactionIndex\" gencodec:\"required\"`\n\t// hash of the block in which the transaction was included\n\tBlockHash common.Hash `json:\"blockHash\"`\n\t// index of the log in the receipt\n\tIndex uint `json:\"logIndex\" gencodec:\"required\"`\n\n\t// The Removed field is true if this log was reverted due to a chain reorganisation.\n\t// You must pay attention to this field if you receive logs through a filter query.\n\tRemoved bool `json:\"removed\"`\n}\n\ntype logMarshaling struct {\n\tData        hexutil.Bytes\n\tBlockNumber hexutil.Uint64\n\tTxIndex     hexutil.Uint\n\tIndex       hexutil.Uint\n}\n\ntype rlpLog struct {\n\tAddress common.Address\n\tTopics  []common.Hash\n\tData    []byte\n}\n\ntype rlpStorageLog struct {\n\tAddress     common.Address\n\tTopics      []common.Hash\n\tData        []byte\n\tBlockNumber uint64\n\tTxHash      common.Hash\n\tTxIndex     uint\n\tBlockHash   common.Hash\n\tIndex       uint\n}\n\n// EncodeRLP implements rlp.Encoder.\nfunc (l *Log) EncodeRLP(w io.Writer) error {\n\treturn rlp.Encode(w, rlpLog{Address: l.Address, Topics: l.Topics, Data: l.Data})\n}\n\n// DecodeRLP implements rlp.Decoder.\nfunc (l *Log) DecodeRLP(s *rlp.Stream) error {\n\tvar dec rlpLog\n\terr := s.Decode(&dec)\n\tif err == nil {\n\t\tl.Address, l.Topics, l.Data = dec.Address, dec.Topics, dec.Data\n\t}\n\treturn err\n}\n\n// LogForStorage is a wrapper around a Log that flattens and parses the entire content of\n// a log including non-consensus fields.\ntype LogForStorage Log\n\n// EncodeRLP implements rlp.Encoder.\nfunc (l *LogForStorage) EncodeRLP(w io.Writer) error {\n\treturn rlp.Encode(w, rlpStorageLog{\n\t\tAddress:     l.Address,\n\t\tTopics:      l.Topics,\n\t\tData:        l.Data,\n\t\tBlockNumber: l.BlockNumber,\n\t\tTxHash:      l.TxHash,\n\t\tTxIndex:     l.TxIndex,\n\t\tBlockHash:   l.BlockHash,\n\t\tIndex:       l.Index,\n\t})\n}\n\n// DecodeRLP implements rlp.Decoder.\nfunc (l *LogForStorage) DecodeRLP(s *rlp.Stream) error {\n\tvar dec rlpStorageLog\n\terr := s.Decode(&dec)\n\tif err == nil {\n\t\t*l = LogForStorage{\n\t\t\tAddress:     dec.Address,\n\t\t\tTopics:      dec.Topics,\n\t\t\tData:        dec.Data,\n\t\t\tBlockNumber: dec.BlockNumber,\n\t\t\tTxHash:      dec.TxHash,\n\t\t\tTxIndex:     dec.TxIndex,\n\t\t\tBlockHash:   dec.BlockHash,\n\t\t\tIndex:       dec.Index,\n\t\t}\n\t}\n\treturn err\n}\n\ntype Account struct {\n\tseed address.Seed\n}\n"
  },
  {
    "path": "core/types/receipt.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage types\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"unsafe\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n//go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go\n\nvar (\n\treceiptStatusFailedRLP     = []byte{}\n\treceiptStatusSuccessfulRLP = []byte{0x01}\n)\n\nconst (\n\t// ReceiptStatusFailed is the status code of a transaction if execution failed.\n\tReceiptStatusFailed = uint64(0)\n\n\t// ReceiptStatusSuccessful is the status code of a transaction if execution succeeded.\n\tReceiptStatusSuccessful = uint64(1)\n)\n\n// Receipt represents the results of a transaction.\ntype Receipt struct {\n\t// Consensus fields\n\tPostState         []byte `json:\"root\"`\n\tStatus            uint64 `json:\"status\"`\n\tCumulativeGasUsed uint64 `json:\"cumulativeGasUsed\" gencodec:\"required\"`\n\tBloom             Bloom  `json:\"logsBloom\"         gencodec:\"required\"`\n\tLogs              []*Log `json:\"logs\"              gencodec:\"required\"`\n\n\t// Implementation fields (don't reorder!)\n\tTxHash          common.Hash    `json:\"transactionHash\" gencodec:\"required\"`\n\tContractAddress common.Address `json:\"contractAddress\"`\n\tGasUsed         uint64         `json:\"gasUsed\" gencodec:\"required\"`\n\n\t//Staking\n\tPoolId  *common.Hash `rlp:\"nil\"`\n\tShareId *common.Hash `rlp:\"nil\"`\n}\n\ntype receiptMarshaling struct {\n\tPostState         hexutil.Bytes\n\tStatus            hexutil.Uint64\n\tCumulativeGasUsed hexutil.Uint64\n\tGasUsed           hexutil.Uint64\n}\n\n// receiptRLP is the consensus encoding of a receipt.\ntype receiptRLP struct {\n\tPostStateOrStatus []byte\n\tCumulativeGasUsed uint64\n\tBloom             Bloom\n\tLogs              []*Log\n}\n\n// NewReceipt creates a barebone transaction receipt, copying the init fields.\nfunc NewReceipt(root []byte, failed bool, cumulativeGasUsed uint64) *Receipt {\n\tr := &Receipt{PostState: common.CopyBytes(root), CumulativeGasUsed: cumulativeGasUsed}\n\tif failed {\n\t\tr.Status = ReceiptStatusFailed\n\t} else {\n\t\tr.Status = ReceiptStatusSuccessful\n\t}\n\treturn r\n}\n\n// EncodeRLP implements rlp.Encoder, and flattens the consensus fields of a receipt\n// into an RLP stream. If no post state is present, byzantium fork is assumed.\nfunc (r *Receipt) EncodeRLP(w io.Writer) error {\n\treturn rlp.Encode(w, &receiptRLP{r.statusEncoding(), r.CumulativeGasUsed, r.Bloom, r.Logs})\n}\n\n// DecodeRLP implements rlp.Decoder, and loads the consensus fields of a receipt\n// from an RLP stream.\nfunc (r *Receipt) DecodeRLP(s *rlp.Stream) error {\n\tvar dec receiptRLP\n\tif err := s.Decode(&dec); err != nil {\n\t\treturn err\n\t}\n\tif err := r.setStatus(dec.PostStateOrStatus); err != nil {\n\t\treturn err\n\t}\n\tr.CumulativeGasUsed, r.Bloom, r.Logs = dec.CumulativeGasUsed, dec.Bloom, dec.Logs\n\treturn nil\n}\n\nfunc (r *Receipt) setStatus(postStateOrStatus []byte) error {\n\tswitch {\n\tcase bytes.Equal(postStateOrStatus, receiptStatusSuccessfulRLP):\n\t\tr.Status = ReceiptStatusSuccessful\n\tcase bytes.Equal(postStateOrStatus, receiptStatusFailedRLP):\n\t\tr.Status = ReceiptStatusFailed\n\tcase len(postStateOrStatus) == len(common.Hash{}):\n\t\tr.PostState = postStateOrStatus\n\tdefault:\n\t\treturn fmt.Errorf(\"invalid receipt status %x\", postStateOrStatus)\n\t}\n\treturn nil\n}\n\nfunc (r *Receipt) statusEncoding() []byte {\n\tif len(r.PostState) == 0 {\n\t\tif r.Status == ReceiptStatusFailed {\n\t\t\treturn receiptStatusFailedRLP\n\t\t}\n\t\treturn receiptStatusSuccessfulRLP\n\t}\n\treturn r.PostState\n}\n\n// Size returns the approximate memory used by all internal contents. It is used\n// to approximate and limit the memory consumption of various caches.\nfunc (r *Receipt) Size() common.StorageSize {\n\tsize := common.StorageSize(unsafe.Sizeof(*r)) + common.StorageSize(len(r.PostState))\n\n\tsize += common.StorageSize(len(r.Logs)) * common.StorageSize(unsafe.Sizeof(Log{}))\n\tfor _, log := range r.Logs {\n\t\tsize += common.StorageSize(len(log.Topics)*common.HashLength + len(log.Data))\n\t}\n\treturn size\n}\n\n// Receipts is a wrapper around a Receipt array to implement DerivableList.\ntype Receipts []*Receipt\n\n// Len returns the number of receipts in this list.\nfunc (r Receipts) Len() int { return len(r) }\n\n// GetRlp returns the RLP encoding of one receipt from the list.\nfunc (r Receipts) GetRlp(i int) []byte {\n\tbytes, err := rlp.EncodeToBytes(r[i])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn bytes\n}\n"
  },
  {
    "path": "core/types/receipt_rlp.go",
    "content": "package types\n\nimport (\n\t\"io\"\n\n\t\"github.com/sero-cash/go-sero/core/types/vserial\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype receiptForStorage_Version_0 struct {\n\tPostStateOrStatus []byte\n\tCumulativeGasUsed uint64\n\tBloom             Bloom\n\tTxHash            common.Hash\n\tContractAddress   common.Address\n\tLogs              []*LogForStorage\n\tGasUsed           uint64\n}\n\ntype receiptForStorage_Version_1 struct {\n\tPoolId  *common.Hash `rlp:\"nil\"`\n\tShareId *common.Hash `rlp:\"nil\"`\n}\n\n// ReceiptForStorage is a wrapper around a Receipt that flattens and parses the\n// entire content of a receipt, as opposed to only the consensus fields originally.\ntype ReceiptForStorage Receipt\n\n// EncodeRLP implements rlp.Encoder, and flattens all content fields of a receipt\n// into an RLP stream.\nfunc (r *ReceiptForStorage) EncodeRLP(w io.Writer) error {\n\tvs := vserial.NewVSerial()\n\t{\n\t\tv0 := &receiptForStorage_Version_0{\n\t\t\tPostStateOrStatus: (*Receipt)(r).statusEncoding(),\n\t\t\tCumulativeGasUsed: r.CumulativeGasUsed,\n\t\t\tBloom:             r.Bloom,\n\t\t\tTxHash:            r.TxHash,\n\t\t\tContractAddress:   r.ContractAddress,\n\t\t\tLogs:              make([]*LogForStorage, len(r.Logs)),\n\t\t\tGasUsed:           r.GasUsed,\n\t\t}\n\t\tfor i, log := range r.Logs {\n\t\t\tv0.Logs[i] = (*LogForStorage)(log)\n\t\t}\n\t\tvs.Add(&v0, vserial.VERSION_0)\n\t}\n\tif r.PoolId != nil || r.ShareId != nil {\n\t\tv1 := &receiptForStorage_Version_1{}\n\t\tv1.ShareId = r.ShareId\n\t\tv1.PoolId = r.PoolId\n\t\tvs.Add(&v1, vserial.VERSION_1)\n\t}\n\treturn rlp.Encode(w, &vs)\n}\n\n// DecodeRLP implements rlp.Decoder, and loads both consensus and implementation\n// fields of a receipt from an RLP stream.\nfunc (r *ReceiptForStorage) DecodeRLP(s *rlp.Stream) error {\n\tvar v0 receiptForStorage_Version_0\n\tvar v1 receiptForStorage_Version_1\n\tvs := vserial.NewVSerial()\n\tvs.Add(&v0, vserial.VERSION_0)\n\tvs.Add(&v1, vserial.VERSION_1)\n\tif err := s.Decode(&vs); err != nil {\n\t\treturn err\n\t}\n\n\tif err := (*Receipt)(r).setStatus(v0.PostStateOrStatus); err != nil {\n\t\treturn err\n\t}\n\t{\n\t\t// Assign the consensus fields\n\t\tr.CumulativeGasUsed = v0.CumulativeGasUsed\n\t\tr.Bloom = v0.Bloom\n\t\tr.Logs = make([]*Log, len(v0.Logs))\n\t\tfor i, log := range v0.Logs {\n\t\t\tr.Logs[i] = (*Log)(log)\n\t\t}\n\t\t// Assign the implementation fields\n\t\tr.TxHash = v0.TxHash\n\t\tr.ContractAddress = v0.ContractAddress\n\t\tr.GasUsed = v0.GasUsed\n\t}\n\t{\n\t\tr.PoolId = v1.PoolId\n\t\tr.ShareId = v1.ShareId\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "core/types/share.go",
    "content": "package types\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype Lottery struct {\n\tParentHash common.Hash\n\tParentNum  uint64\n\tPosHash    common.Hash\n}\n\ntype Vote struct {\n\tIdx       uint32\n\tParentNum uint64\n\tShareId   common.Hash\n\tPosHash   common.Hash\n\tIsPool    bool\n\tSign      c_type.Uint512\n}\n\nfunc (s Vote) Hash() common.Hash {\n\n\thw := sha3.NewKeccak256()\n\thash := common.Hash{}\n\trlp.Encode(hw, []interface{}{\n\t\ts.Idx,\n\t\ts.ParentNum,\n\t\ts.ShareId,\n\t\ts.PosHash,\n\t\ts.IsPool,\n\t\ts.Sign,\n\t})\n\thw.Sum(hash[:0])\n\treturn hash\n}\n\ntype HeaderVote struct {\n\tId     common.Hash\n\tIsPool bool\n\tSign   c_type.Uint512\n}\n"
  },
  {
    "path": "core/types/transaction.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage types\n\nimport (\n\t\"math/big\"\n\t\"sync/atomic\"\n\n\t//\"github.com/sero-cash/go-sero/zero/light\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"container/heap\"\n\t\"io\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\tzstx \"github.com/sero-cash/go-sero/zero/txs/stx\"\n\tztx \"github.com/sero-cash/go-sero/zero/txs/tx\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\n//go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go\n\n//go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go\n\ntype Transaction struct {\n\tdata txdata\n\t// caches\n\thash atomic.Value\n\tsize atomic.Value\n}\n\ntype txdata struct {\n\tPrice    *big.Int `json:\"gasPrice\" gencodec:\"required\"`\n\tGasLimit uint64   `json:\"gas\"      gencodec:\"required\"`\n\tPayload  []byte   `json:\"input\"    gencodec:\"required\"`\n\tStxt     *zstx.T  `json:\"stxt\"    gencodec:\"required\"`\n}\n\ntype txdataMarshaling struct {\n\tPrice    *hexutil.Big\n\tGasLimit hexutil.Uint64\n\tPayload  hexutil.Bytes\n\tStxt     *zstx.T\n}\n\nfunc NewTransaction(gasPrice *big.Int, gasLimit uint64, data []byte) *Transaction {\n\tif len(data) > 0 {\n\t\tdata = common.CopyBytes(data)\n\t}\n\td := txdata{\n\t\tPayload:  data,\n\t\tPrice:    new(big.Int),\n\t\tGasLimit: gasLimit,\n\t}\n\tif gasPrice != nil {\n\t\td.Price.Set(gasPrice)\n\t}\n\n\ttx := &Transaction{data: d}\n\n\treturn tx\n}\n\nfunc Ehash(price big.Int, gasLimit uint64, payload []byte) c_type.Uint256 {\n\th := rlpHash([]interface{}{\n\t\tprice,\n\t\tgasLimit,\n\t\tpayload,\n\t})\n\tr := c_type.Uint256{}\n\tcopy(r[:], h[:])\n\treturn r\n}\n\nfunc (tx Transaction) Ehash() c_type.Uint256 {\n\n\th := rlpHash([]interface{}{\n\t\t&tx.data.Price,\n\t\ttx.data.GasLimit,\n\t\ttx.data.Payload,\n\t})\n\tr := c_type.Uint256{}\n\tcopy(r[:], h[:])\n\treturn r\n}\n\nfunc NewTxt(fromRnd *c_type.Uint256, ehash c_type.Uint256, fee assets.Token, out *ztx.Out, pkgCreate *ztx.PkgCreate, pkgTransfer *ztx.PkgTransfer, pkgClose *ztx.PkgClose) *ztx.T {\n\n\toutDatas := []ztx.Out{}\n\tif out != nil {\n\t\toutDatas = append(outDatas, *out)\n\t}\n\ttxt := &ztx.T{\n\t\tFromRnd:     fromRnd,\n\t\tEhash:       ehash,\n\t\tFee:         fee,\n\t\tOuts:        outDatas,\n\t\tPkgCreate:   pkgCreate,\n\t\tPkgTransfer: pkgTransfer,\n\t\tPkgClose:    pkgClose,\n\t}\n\treturn txt\n}\n\nfunc NewTxWithGTx(gas uint64, gasPrice *big.Int, t *zstx.T) *Transaction {\n\td := txdata{\n\t\tPrice:    gasPrice,\n\t\tGasLimit: gas,\n\t\tStxt:     t,\n\t}\n\ttx := &Transaction{data: d}\n\n\treturn tx\n}\n\nfunc NewTxtOut(Pkr c_type.PKr, currency string, value *big.Int, catg string, tkt *common.Hash, memo string, isZ bool) *ztx.Out {\n\tvar token *assets.Token\n\tvar ticket *assets.Ticket\n\tvar outData *ztx.Out\n\tif value != nil {\n\t\ttoken = &assets.Token{\n\t\t\tCurrency: *(common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256()),\n\t\t\tValue:    *utils.U256(*value).ToRef(),\n\t\t}\n\t}\n\tif tkt != nil {\n\t\tticket = &assets.Ticket{\n\t\t\tCategory: *(common.BytesToHash(common.LeftPadBytes([]byte(catg), 32)).HashToUint256()),\n\t\t\tValue:    *tkt.HashToUint256(),\n\t\t}\n\n\t}\n\tasset := assets.Asset{\n\t\tTkn: token,\n\t\tTkt: ticket,\n\t}\n\toutData = &ztx.Out{\n\t\tAddr:  Pkr,\n\t\tAsset: asset,\n\t\tMemo:  stringToUint512(memo),\n\t\tIsZ:   isZ,\n\t}\n\treturn outData\n\n}\n\nfunc stringToUint512(str string) c_type.Uint512 {\n\tvar ret c_type.Uint512\n\tb := []byte(str)\n\tif len(b) > len(ret) {\n\t\tb = b[len(b)-len(ret):]\n\t}\n\tcopy(ret[len(ret)-len(b):], b)\n\treturn ret\n}\n\nfunc NewCreatePkg(Pkr c_type.PKr, currency string, value *big.Int, catg string, tkt *common.Hash, memo string) *ztx.PkgCreate {\n\tvar token *assets.Token\n\tvar ticket *assets.Ticket\n\tif value != nil {\n\t\ttoken = &assets.Token{\n\t\t\tCurrency: *(common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256()),\n\t\t\tValue:    *utils.U256(*value).ToRef(),\n\t\t}\n\t}\n\tif tkt != nil {\n\t\tticket = &assets.Ticket{\n\t\t\tCategory: *(common.BytesToHash(common.LeftPadBytes([]byte(catg), 32)).HashToUint256()),\n\t\t\tValue:    *tkt.HashToUint256(),\n\t\t}\n\n\t}\n\tasset := assets.Asset{\n\t\tTkn: token,\n\t\tTkt: ticket,\n\t}\n\n\tpkg := pkg.Pkg_O{\n\t\tAsset: asset,\n\t\tMemo:  stringToUint512(memo),\n\t}\n\n\treturn &ztx.PkgCreate{\n\t\tId:  c_type.RandUint256(),\n\t\tPKr: Pkr,\n\t\tPkg: pkg,\n\t}\n\n}\n\nfunc (tx *Transaction) Pkg() *assets.Asset {\n\treturn tx.GetZZSTX().ContractAsset()\n}\n\n// EncodeRLP implements rlp.Encoder\nfunc (tx *Transaction) EncodeRLP(w io.Writer) error {\n\treturn rlp.Encode(w, &tx.data)\n}\n\n// DecodeRLP implements rlp.Decoder\nfunc (tx *Transaction) DecodeRLP(s *rlp.Stream) error {\n\t_, size, _ := s.Kind()\n\terr := s.Decode(&tx.data)\n\tif err == nil {\n\t\ttx.size.Store(common.StorageSize(rlp.ListSize(size)))\n\t}\n\n\treturn err\n}\n\n// MarshalJSON encodes the web3 RPC transaction format.\nfunc (tx *Transaction) MarshalJSON() ([]byte, error) {\n\t//hash := tx.Hash()\n\tdata := tx.data\n\t//data.Hash = &hash\n\treturn data.MarshalJSON()\n}\n\n// UnmarshalJSON decodes the web3 RPC transaction format.\nfunc (tx *Transaction) UnmarshalJSON(input []byte) error {\n\tvar dec txdata\n\tif err := dec.UnmarshalJSON(input); err != nil {\n\t\treturn err\n\t}\n\t*tx = Transaction{data: dec}\n\treturn nil\n}\n\nfunc (tx *Transaction) Data() []byte {\n\tif tx.GetZZSTX().Desc_Cmd.Contract != nil {\n\t\treturn common.CopyBytes(tx.GetZZSTX().Desc_Cmd.Contract.Data)\n\t} else {\n\t\treturn common.CopyBytes(tx.data.Payload)\n\t}\n}\n\nfunc (tx *Transaction) Gas() uint64 {\n\treturn tx.data.GasLimit\n}\nfunc (tx *Transaction) GasPrice() *big.Int { return new(big.Int).Set(tx.data.Price) }\n\nfunc (tx *Transaction) GetZZSTX() *zstx.T {\n\treturn tx.data.Stxt\n}\n\nfunc (tx *Transaction) To() *common.Address {\n\tif pkr := tx.GetZZSTX().ContractAddress(); pkr != nil {\n\t\taddr := &common.Address{}\n\t\tcopy(addr[:], pkr[:])\n\t\treturn addr\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc (tx Transaction) IsOpContract() bool {\n\treturn tx.GetZZSTX().IsOpContract()\n}\n\nfunc (tx *Transaction) Stxt() *zstx.T {\n\treturn tx.data.Stxt\n}\n\nfunc (tx *Transaction) From() common.Address {\n\treturn common.BytesToAddress(tx.data.Stxt.From[:])\n}\n\n// Hash hashes the RLP encoding of tx.\n// It uniquely identifies the transaction.\nfunc (tx *Transaction) Hash() common.Hash {\n\tif hash := tx.hash.Load(); hash != nil {\n\t\treturn hash.(common.Hash)\n\t}\n\tv := tx.data.Stxt.ToHash()\n\tvar hashv common.Hash\n\tcopy(hashv[:], v[:])\n\ttx.hash.Store(hashv)\n\treturn hashv\n}\n\n// Size returns the true RLP encoded storage size of the transaction, either by\n// encoding and returning it, or returning a previsouly cached value.\nfunc (tx *Transaction) Size() common.StorageSize {\n\tif size := tx.size.Load(); size != nil {\n\t\treturn size.(common.StorageSize)\n\t}\n\tc := writeCounter(0)\n\t//rlpData := []interface{}{tx.data.Payload, tx.data.Price}\n\trlp.Encode(&c, &tx.data)\n\ttx.size.Store(common.StorageSize(c))\n\treturn common.StorageSize(c)\n}\n\n// AsMessage returns the transaction as a core.Message.\nfunc (tx *Transaction) AsMessage() (Message, error) {\n\tmsg := Message{\n\t\tfrom:     tx.From(),\n\t\tgasPrice: new(big.Int).Set(tx.data.Price),\n\t\tto:       tx.To(),\n\t\tdata:     tx.Data(),\n\t\tasset:    tx.Pkg(),\n\t\tfee:      tx.Stxt().Fee,\n\t\ttxHash:   tx.Hash(),\n\t}\n\treturn msg, nil\n}\n\nfunc (tx *Transaction) WithEncrypt(stxt *zstx.T) (*Transaction, error) {\n\tcpy := &Transaction{data: tx.data}\n\tcpy.data.Stxt = stxt\n\treturn cpy, nil\n}\n\nfunc (tx *Transaction) RawEncrptyValue() *zstx.T {\n\treturn tx.data.Stxt\n}\n\n// Transactions is a Transaction slice type for basic sorting.\ntype Transactions []*Transaction\n\n// Len returns the length of s.\nfunc (s Transactions) Len() int { return len(s) }\n\n// Swap swaps the i'th and the j'th element in s.\nfunc (s Transactions) Swap(i, j int) { s[i], s[j] = s[j], s[i] }\n\n// GetRlp implements Rlpable and returns the i'th element of s in rlp.\nfunc (s Transactions) GetRlp(i int) []byte {\n\tenc, _ := rlp.EncodeToBytes(s[i])\n\treturn enc\n}\n\n// TxDifference returns a new set which is the difference between a and b.\nfunc TxDifference(a, b Transactions) Transactions {\n\tkeep := make(Transactions, 0, len(a))\n\n\tremove := make(map[common.Hash]struct{})\n\tfor _, tx := range b {\n\t\tremove[tx.Hash()] = struct{}{}\n\t}\n\n\tfor _, tx := range a {\n\t\tif _, ok := remove[tx.Hash()]; !ok {\n\t\t\tkeep = append(keep, tx)\n\t\t}\n\t}\n\n\treturn keep\n}\n\n// TxByPrice implements both the sort and the heap interface, making it useful\n// for all at once sorting as well as individually adding and removing elements.\ntype TxByPrice Transactions\n\nfunc (s TxByPrice) Len() int           { return len(s) }\nfunc (s TxByPrice) Less(i, j int) bool { return s[i].data.Price.Cmp(s[j].data.Price) > 0 }\nfunc (s TxByPrice) Swap(i, j int) {\n\tif i < 0 || j < 0 {\n\t\treturn\n\t}\n\ts[i], s[j] = s[j], s[i]\n}\n\nfunc (s *TxByPrice) Push(x interface{}) {\n\t*s = append(*s, x.(*Transaction))\n}\n\nfunc (s *TxByPrice) Pop() interface{} {\n\tif s.Len() < 1 {\n\t\treturn nil\n\t}\n\told := *s\n\tn := len(old)\n\tx := old[n-1]\n\t*s = old[0 : n-1]\n\treturn x\n}\n\n// TransactionsByPriceAndNonce represents a set of transactions that can return\n// transactions in a profit-maximizing sorted order, while supporting removing\n// entire batches of transactions for non-executable accounts.\ntype TransactionsByPrice struct {\n\ttxs   map[common.Address]Transactions // Per account nonce-sorted list of transactions\n\theads TxByPrice                       // Next transaction for each unique account (price heap)\n}\n\n// NewTransactionsByPriceAndNonce creates a transaction set that can retrieve\n// price sorted transactions in a nonce-honouring way.\n//\n// Note, the input map is reowned so the caller should not interact any more with\n// if after providing it to the constructor.\nfunc NewTransactionsByPrice(txs Transactions) *TransactionsByPrice {\n\t// Initialize a price based heap with the head transactions\n\theads := make(TxByPrice, 0, len(txs))\n\tfor _, tx := range txs {\n\t\theads = append(heads, tx)\n\t}\n\theap.Init(&heads)\n\n\t// Assemble and return the transaction set\n\treturn &TransactionsByPrice{\n\t\theads: heads,\n\t}\n}\n\n//// Peek returns the next transaction by price.\nfunc (t *TransactionsByPrice) Peek() *Transaction {\n\tif len(t.heads) == 0 {\n\t\treturn nil\n\t}\n\treturn t.heads[0]\n}\n\n// Shift replaces the current best head with the next one from the same account.\nfunc (t *TransactionsByPrice) Shift() {\n\tacc := t.heads[0].From()\n\tif txs, ok := t.txs[acc]; ok && len(txs) > 0 {\n\t\tt.heads[0], t.txs[acc] = txs[0], txs[1:]\n\t\theap.Fix(&t.heads, 0)\n\t} else {\n\t\theap.Pop(&t.heads)\n\t}\n}\n\n// Pop removes the best transaction, *not* replacing it with the next one from\n// the same account. This should be used when a transaction cannot be executed\n// and hence all subsequent ones should be discarded from the same account.\nfunc (t *TransactionsByPrice) Pop() *Transaction {\n\ttransaction := heap.Pop(&t.heads)\n\tif transaction == nil {\n\t\treturn nil\n\t}\n\treturn transaction.(*Transaction)\n}\n\n// Message is a fully derived transaction and implements core.Message\n//\n// NOTE: In a future PR this will be removed.\ntype Message struct {\n\tto       *common.Address\n\tfrom     common.Address\n\tnonce    uint64\n\tasset    *assets.Asset\n\tfee      assets.Token\n\tgasPrice *big.Int\n\tdata     []byte\n\ttxHash   common.Hash\n}\n\nfunc NewMessage(from common.Address, to *common.Address, nonce uint64, asset assets.Asset, fee assets.Token, gasPrice *big.Int, data []byte) Message {\n\tmessage := Message{\n\t\tfrom:     from,\n\t\tto:       to,\n\t\tnonce:    nonce,\n\t\tfee:      fee,\n\t\tgasPrice: gasPrice,\n\t\tdata:     data,\n\t\tasset:    &asset,\n\t}\n\treturn message\n}\n\nfunc (m Message) From() common.Address { return m.from }\nfunc (m Message) To() *common.Address  { return m.to }\nfunc (m Message) GasPrice() *big.Int   { return m.gasPrice }\nfunc (m Message) Data() []byte         { return m.data }\nfunc (m Message) Fee() assets.Token    { return m.fee }\nfunc (m Message) Asset() *assets.Asset { return m.asset }\nfunc (m Message) TxHash() common.Hash  { return m.txHash }\n"
  },
  {
    "path": "core/types/transaction_test.go",
    "content": "package types\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\ntype Uint256 [32]byte\n\nfunc TestRLPEhash(t *testing.T) {\n\n\tvar testByte [32]byte\n\tvar testByte1 Uint256\n\tbt := big.NewInt(34).Bytes()\n\tcopy(testByte[:], bt[:])\n\tcopy(testByte1[:], bt[:])\n\n\th1 := rlpHash([]interface{}{\n\t\ttestByte,\n\t})\n\n\th2 := rlpHash([]interface{}{\n\t\ttestByte1,\n\t})\n\n\tfmt.Printf(\"%v\\n\", h1)\n\tfmt.Printf(\"%v\\n\", h2)\n}\n\nfunc TestEhash(t *testing.T) {\n\tprice := big.NewInt(40)\n\tgasLimit := uint64(22)\n\th1 := rlpHash([]interface{}{\n\t\t*price,\n\t\tgasLimit,\n\t})\n\th2 := rlpHash([]interface{}{\n\t\t&price,\n\t\tgasLimit,\n\t})\n\th3 := rlpHash([]interface{}{\n\t\tprice,\n\t\tgasLimit,\n\t\t[]byte{},\n\t})\n\tif h3 != h2 && h2 != h1 {\n\t\tt.Errorf(\"Ehash must be the right type\")\n\t}\n\n\tfmt.Printf(\"%v\\n\", h1)\n\tfmt.Printf(\"%v\\n\", hexutil.Encode(h2[:]))\n\tfmt.Printf(\"%v\\n\", hexutil.Encode(h3[:]))\n}\n\ntype XX struct {\n\tA *big.Int\n}\n\ntype st struct {\n\tCmd XX\n}\n\nfunc TestJson(t *testing.T) {\n\tjsonStr := `{\"cmd\":null}`\n\tvar s st\n\terr := json.Unmarshal([]byte(jsonStr), &s)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t}\n\tb, _ := json.Marshal(s)\n\tfmt.Println(string(b))\n\n}\n"
  },
  {
    "path": "core/types/vserial/rlp.go",
    "content": "package vserial\n\nimport (\n\t\"errors\"\n\t\"io\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype VersionType int8\n\nconst (\n\tVERSION_NIL = VersionType(-1)\n\tVERSION_0   = VersionType(0)\n\tVERSION_1   = VersionType(1)\n\tVERSION_2   = VersionType(2)\n)\n\ntype Version struct {\n\tV VersionType\n}\n\ntype vSerial struct {\n\tversions []interface{}\n\tv        Version\n}\n\nfunc NewVSerial() (ret vSerial) {\n\tret.v.V = VERSION_NIL\n\treturn\n}\n\nfunc (self *vSerial) V() VersionType {\n\treturn self.v.V\n}\nfunc (self *vSerial) Add(data interface{}, ver VersionType) {\n\tif ver <= self.v.V {\n\t\tpanic(errors.New(\"vserial add version error\"))\n\t}\n\tself.v.V = ver\n\tself.versions = append(self.versions, data)\n}\n\nfunc (self *vSerial) DecodeRLP(s *rlp.Stream) error {\n\t_, size, _ := s.Kind()\n\tif size == 0 {\n\t\tself.v.V = VERSION_NIL\n\t} else {\n\t\tif size > 10 {\n\t\t\tself.v.V = VERSION_0\n\t\t} else {\n\t\t\tif e := s.Decode(&self.v); e != nil {\n\t\t\t\treturn e\n\t\t\t}\n\t\t}\n\t}\n\tif int(self.v.V) >= len(self.versions) {\n\t\tlog.Error(\"VSerial DecodeRLP ERROR: version num is error\", \"version\", self.v.V, \"len\", len(self.versions))\n\t\treturn errors.New(\"VSerial DecodeRLP ERROR: version num is error\")\n\t}\n\tif self.v.V == VERSION_NIL {\n\t\tif e := s.Decode(self.versions[0]); e != nil {\n\t\t\treturn e\n\t\t}\n\t} else {\n\t\tif self.v.V <= VERSION_1 {\n\t\t\tfor i := 0; i <= int(self.v.V); i++ {\n\t\t\t\tif e := s.Decode(self.versions[i]); e != nil {\n\t\t\t\t\treturn e\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif e := s.Decode(self.versions[self.v.V]); e != nil {\n\t\t\t\treturn e\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *vSerial) EncodeRLP(w io.Writer) error {\n\tif self.v.V == VERSION_NIL {\n\t\te := errors.New(\"encode header rlp error: version is nil\")\n\t\tpanic(e)\n\t\treturn e\n\t}\n\tif self.v.V >= VERSION_1 {\n\t\tif e := rlp.Encode(w, &self.v); e != nil {\n\t\t\treturn e\n\t\t}\n\t}\n\tif self.v.V <= VERSION_1 {\n\t\tfor _, it := range self.versions {\n\t\t\tif e := rlp.Encode(w, it); e != nil {\n\t\t\t\treturn e\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif e := rlp.Encode(w, self.versions[len(self.versions)-1]); e != nil {\n\t\t\treturn e\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "core/types.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage core\n\nimport (\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n)\n\n// Validator is an interface which defines the standard for block validation. It\n// is only responsible for validating block contents, as the header validation is\n// done by the specific consensus engines.\n//\ntype Validator interface {\n\t// ValidateBody validates the given block's content.\n\tValidateBody(block *types.Block) error\n\n\t// ValidateState validates the given statedb and optionally the receipts and\n\t// gas used.\n\tValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error\n}\n\n// Processor is an interface for processing blocks using a given initial state.\n//\n// Process takes the block to be processed and the statedb upon which the\n// initial state is based. It should return the receipts generated, amount\n// of gas used in the process and return an error if any of the internal rules\n// failed.\ntype Processor interface {\n\tProcess(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error)\n}\n"
  },
  {
    "path": "core/vm/analysis.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\n// destinations stores one map per contract (keyed by hash of code).\n// The maps contain an entry for each location of a JUMPDEST\n// instruction.\ntype destinations map[common.Hash]bitvec\n\n// has checks whether code has a JUMPDEST at dest.\nfunc (d destinations) has(codehash common.Hash, code []byte, dest *big.Int) bool {\n\t// PC cannot go beyond len(code) and certainly can't be bigger than 63bits.\n\t// Don't bother checking for JUMPDEST in that case.\n\tudest := dest.Uint64()\n\tif dest.BitLen() >= 63 || udest >= uint64(len(code)) {\n\t\treturn false\n\t}\n\n\tm, analysed := d[codehash]\n\tif !analysed {\n\t\tm = codeBitmap(code)\n\t\td[codehash] = m\n\t}\n\treturn OpCode(code[udest]) == JUMPDEST && m.codeSegment(udest)\n}\n\n// bitvec is a bit vector which maps bytes in a program.\n// An unset bit means the byte is an opcode, a set bit means\n// it's data (i.e. argument of PUSHxx).\ntype bitvec []byte\n\nfunc (bits *bitvec) set(pos uint64) {\n\t(*bits)[pos/8] |= 0x80 >> (pos % 8)\n}\nfunc (bits *bitvec) set8(pos uint64) {\n\t(*bits)[pos/8] |= 0xFF >> (pos % 8)\n\t(*bits)[pos/8+1] |= ^(0xFF >> (pos % 8))\n}\n\n// codeSegment checks if the position is in a code segment.\nfunc (bits *bitvec) codeSegment(pos uint64) bool {\n\treturn ((*bits)[pos/8] & (0x80 >> (pos % 8))) == 0\n}\n\n// codeBitmap collects data locations in code.\nfunc codeBitmap(code []byte) bitvec {\n\t// The bitmap is 4 bytes longer than necessary, in case the code\n\t// ends with a PUSH32, the algorithm will push zeroes onto the\n\t// bitvector outside the bounds of the actual code.\n\tbits := make(bitvec, len(code)/8+1+4)\n\tfor pc := uint64(0); pc < uint64(len(code)); {\n\t\top := OpCode(code[pc])\n\n\t\tif op >= PUSH1 && op <= PUSH32 {\n\t\t\tnumbits := op - PUSH1 + 1\n\t\t\tpc++\n\t\t\tfor ; numbits >= 8; numbits -= 8 {\n\t\t\t\tbits.set8(pc) // 8\n\t\t\t\tpc += 8\n\t\t\t}\n\t\t\tfor ; numbits > 0; numbits-- {\n\t\t\t\tbits.set(pc)\n\t\t\t\tpc++\n\t\t\t}\n\t\t} else {\n\t\t\tpc++\n\t\t}\n\t}\n\treturn bits\n}\n"
  },
  {
    "path": "core/vm/analysis_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport \"testing\"\n\nfunc TestJumpDestAnalysis(t *testing.T) {\n\ttests := []struct {\n\t\tcode  []byte\n\t\texp   byte\n\t\twhich int\n\t}{\n\t\t{[]byte{byte(PUSH1), 0x01, 0x01, 0x01}, 0x40, 0},\n\t\t{[]byte{byte(PUSH1), byte(PUSH1), byte(PUSH1), byte(PUSH1)}, 0x50, 0},\n\t\t{[]byte{byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), byte(PUSH8), 0x01, 0x01, 0x01}, 0x7F, 0},\n\t\t{[]byte{byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 1},\n\t\t{[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), byte(PUSH2), byte(PUSH2), 0x01, 0x01, 0x01}, 0x03, 0},\n\t\t{[]byte{0x01, 0x01, 0x01, 0x01, 0x01, byte(PUSH2), 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1},\n\t\t{[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x74, 0},\n\t\t{[]byte{byte(PUSH3), 0x01, 0x01, 0x01, byte(PUSH1), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x00, 1},\n\t\t{[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x3F, 0},\n\t\t{[]byte{0x01, byte(PUSH8), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xC0, 1},\n\t\t{[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x7F, 0},\n\t\t{[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0xFF, 1},\n\t\t{[]byte{byte(PUSH16), 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, 0x80, 2},\n\t\t{[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0x7f, 0},\n\t\t{[]byte{byte(PUSH8), 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, byte(PUSH1), 0x01}, 0xA0, 1},\n\t\t{[]byte{byte(PUSH32)}, 0x7F, 0},\n\t\t{[]byte{byte(PUSH32)}, 0xFF, 1},\n\t\t{[]byte{byte(PUSH32)}, 0xFF, 2},\n\t}\n\tfor _, test := range tests {\n\t\tret := codeBitmap(test.code)\n\t\tif ret[test.which] != test.exp {\n\t\t\tt.Fatalf(\"expected %x, got %02x\", test.exp, ret[test.which])\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "core/vm/common.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\n// calculates the memory size required for a step\nfunc calcMemSize(off, l *big.Int) *big.Int {\n\tif l.Sign() == 0 {\n\t\treturn common.Big0\n\t}\n\n\treturn new(big.Int).Add(off, l)\n}\n\n// getData returns a slice from the data based on the start and size and pads\n// up to size with zero's. This function is overflow safe.\nfunc getData(data []byte, start uint64, size uint64) []byte {\n\tlength := uint64(len(data))\n\tif start > length {\n\t\tstart = length\n\t}\n\tend := start + size\n\tif end > length {\n\t\tend = length\n\t}\n\treturn common.RightPadBytes(data[start:end], int(size))\n}\n\n// getDataBig returns a slice from the data based on the start and size and pads\n// up to size with zero's. This function is overflow safe.\nfunc getDataBig(data []byte, start *big.Int, size *big.Int) []byte {\n\tdlen := big.NewInt(int64(len(data)))\n\n\ts := math.BigMin(start, dlen)\n\te := math.BigMin(new(big.Int).Add(s, size), dlen)\n\treturn common.RightPadBytes(data[s.Uint64():e.Uint64()], int(size.Uint64()))\n}\n\n// bigUint64 returns the integer casted to a uint64 and returns whether it\n// overflowed in the process.\nfunc bigUint64(v *big.Int) (uint64, bool) {\n\treturn v.Uint64(), v.BitLen() > 64\n}\n\n// toWordSize returns the ceiled word size required for memory expansion.\nfunc toWordSize(size uint64) uint64 {\n\tif size > math.MaxUint64-31 {\n\t\treturn math.MaxUint64/32 + 1\n\t}\n\n\treturn (size + 31) / 32\n}\n\nfunc allZero(b []byte) bool {\n\tfor _, byte := range b {\n\t\tif byte != 0 {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "core/vm/contract.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n)\n\n// ContractRef is a reference to the contract's backing object\ntype ContractRef interface {\n\tAddress() common.Address\n}\n\n// AccountRef implements ContractRef.\n//\n// AccountAddress references are used during EVM initialisation and\n// it's primary use is to fetch addresses. Removing this object\n// proves difficult because of the cached jump destinations which\n// are fetched from the parent contract (i.e. the caller), which\n// is a ContractRef.\ntype AccountRef common.Address\n\n// Data casts AccountRef to a Data\nfunc (ar AccountRef) Address() common.Address { return (common.Address)(ar) }\n\n// Contract represents an ethereum contract in the state database. It contains\n// the the contract code, calling arguments. Contract implements ContractRef\ntype Contract struct {\n\t// CallerAddress is the result of the caller which initialised this\n\t// contract. However when the \"call method\" is delegated this value\n\t// needs to be initialised to that of the caller's caller.\n\tCallerAddress common.Address\n\tcaller        ContractRef\n\tself          ContractRef\n\n\t//nonceAddres map[common.Data][64]byte\n\n\tjumpdests destinations // result of JUMPDEST analysis.\n\n\tCode     []byte\n\tCodeHash common.Hash\n\tCodeAddr *common.Address\n\tInput    []byte\n\n\tGas uint64\n\n\tasset *assets.Asset\n\n\tArgs []byte\n\n\tDelegateCall bool\n\n\taddrs map[common.ContractAddress]common.Address\n\t//currency string\n\tcallMsg *assets.Asset\n}\n\n// NewContract returns a new contract environment for the execution of EVM.\nfunc NewContract(caller ContractRef, object ContractRef, asset *assets.Asset, gas uint64) *Contract {\n\tc := &Contract{CallerAddress: caller.Address(), caller: caller, self: object, Args: nil}\n\n\tc.addrs = map[common.ContractAddress]common.Address{}\n\tc.addrs[caller.Address().ToCaddr()] = caller.Address()\n\tc.addrs[object.Address().ToCaddr()] = object.Address()\n\n\tif parent, ok := caller.(*Contract); ok {\n\t\t// Reuse JUMPDEST analysis from parent context if available.\n\t\tc.jumpdests = parent.jumpdests\n\t} else {\n\t\tc.jumpdests = make(destinations)\n\t}\n\n\t// Gas should be a pointer so it can safely be reduced through the run\n\t// This pointer will be off the state transition\n\tc.Gas = gas\n\t// ensures a value is set\n\tc.asset = asset\n\treturn c\n}\n\nfunc (c *Contract) SetCallMsg(callMsg *assets.Asset) {\n\tc.callMsg = callMsg\n}\n\nfunc (c *Contract) GetCallMsg() *assets.Asset {\n\treturn c.callMsg\n}\n\nfunc (c *Contract) PutNonceAddress(statedb StateDB, addr common.Address) {\n\tcaddress := addr.ToCaddr()\n\tc.addrs[caddress] = addr\n\tstatedb.AddNonceAddress(caddress[:], addr)\n}\n\nfunc (c *Contract) GetNonceAddress(statedb StateDB, addr common.ContractAddress) common.Address {\n\n\tif addresses, ok := c.addrs[addr]; ok {\n\t\treturn addresses\n\t}\n\treturn statedb.GetNonceAddress(addr[:])\n}\n\n// AsDelegate sets the contract to be a delegate call and returns the current\n// contract (for chaining calls)\nfunc (c *Contract) AsDelegate() *Contract {\n\tc.DelegateCall = true\n\t// NOTE: caller must, at all times be a contract. It should never happen\n\t// that caller is something other than a Contract.\n\tparent := c.caller.(*Contract)\n\tc.CallerAddress = parent.CallerAddress\n\tc.asset = parent.asset\n\n\treturn c\n}\n\n// GetOp returns the n'th element in the contract's byte array\nfunc (c *Contract) GetOp(n uint64) OpCode {\n\treturn OpCode(c.GetByte(n))\n}\n\n// GetByte returns the n'th byte in the contract's byte array\nfunc (c *Contract) GetByte(n uint64) byte {\n\tif n < uint64(len(c.Code)) {\n\t\treturn c.Code[n]\n\t}\n\n\treturn 0\n}\n\n// Caller returns the caller of the contract.\n//\n// Caller will recursively call caller when the contract is a delegate\n// call, including that of caller's caller.\nfunc (c *Contract) Caller() common.Address {\n\treturn c.CallerAddress\n}\n\n// UseGas attempts the use gas and subtracts it and returns true on success\nfunc (c *Contract) UseGas(gas uint64) (ok bool) {\n\tif c.Gas < gas {\n\t\treturn false\n\t}\n\tc.Gas -= gas\n\treturn true\n}\n\n// Data returns the contracts address\nfunc (c *Contract) Address() common.Address {\n\treturn c.self.Address()\n}\n\n// Value returns the contracts value (sent to it from it's caller)\nfunc (c *Contract) Value() *big.Int {\n\tif c.asset != nil && c.asset.Tkn != nil {\n\t\tvalue := big.Int(c.asset.Tkn.Value)\n\t\treturn &value\n\t} else {\n\t\treturn new(big.Int)\n\t}\n}\n\nfunc (c *Contract) Currency() string {\n\tif c.asset != nil && c.asset.Tkn != nil {\n\t\treturn strings.TrimSpace(string(c.asset.Tkn.Currency[:]))\n\t} else {\n\t\treturn \"SERO\"\n\t}\n}\n\n// SetCode sets the code to the contract\nfunc (c *Contract) SetCode(hash common.Hash, code []byte) {\n\tc.Code = code\n\tc.CodeHash = hash\n}\n\n// SetCallCode sets the code of the contract and address of the backing data\n// object\nfunc (c *Contract) SetCallCode(addr *common.Address, hash common.Hash, code []byte) {\n\tc.Code = code\n\tc.CodeHash = hash\n\tc.CodeAddr = addr\n}\n"
  },
  {
    "path": "core/vm/contracts.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport \"math/big\"\n\nvar (\n\t//big1      = big.NewInt(1)\n\t//big4      = big.NewInt(4)\n\t//big8      = big.NewInt(8)\n\t//big16     = big.NewInt(16)\n\tbig32 = big.NewInt(32)\n\t//big64     = big.NewInt(64)\n\t//big96     = big.NewInt(96)\n\t//big480    = big.NewInt(480)\n\t//big1024   = big.NewInt(1024)\n\t//big3072   = big.NewInt(3072)\n\t//big199680 = big.NewInt(199680)\n)\n\n/*\nimport (\n\t\"crypto/sha256\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/crypto/bn256\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\n// PrecompiledContract is the basic interface for native Go contracts. The implementation\n// requires a deterministic gas count based on the input size of the Run method of the\n// contract.\ntype PrecompiledContract interface {\n\tRequiredGas(input []byte) uint64  // RequiredPrice calculates the contract gas use\n\tRun(input []byte) ([]byte, error) // Run runs the precompiled contract\n}\n\n// PrecompiledContractsAutumnTwilight contains the default set of pre-compiled Sero\n// contracts used in the AutumnTwilight release.\nvar PrecompiledContractsAutumnTwilight = map[common.Address]PrecompiledContract{\n\t//common.BytesToAddress([]byte{1}): &ecrecover{},\n\t//common.BytesToAddress([]byte{2}): &sha256hash{},\n\t//common.BytesToAddress([]byte{3}): &ripemd160hash{},\n\t//common.BytesToAddress([]byte{4}): &dataCopy{},\n\t//common.BytesToAddress([]byte{5}): &bigModExp{},\n\t//common.BytesToAddress([]byte{6}): &bn256Add{},\n\t//common.BytesToAddress([]byte{7}): &bn256ScalarMul{},\n\t//common.BytesToAddress([]byte{8}): &bn256Pairing{},\n}\n\n// RunPrecompiledContract runs and evaluates the output of a precompiled contract.\nfunc RunPrecompiledContract(p PrecompiledContract, input []byte, contract *Contract) (ret []byte, err error) {\n\tgas := p.RequiredGas(input)\n\tif contract.UseGas(gas) {\n\t\treturn p.Run(input)\n\t}\n\treturn nil, ErrOutOfGas\n}\n\n// ECRECOVER implemented as a native contract.\ntype ecrecover struct{}\n\nfunc (c *ecrecover) RequiredGas(input []byte) uint64 {\n\treturn params.EcrecoverGas\n}\n\nfunc (c *ecrecover) Run(input []byte) ([]byte, error) {\n\tconst ecRecoverInputLength = 128\n\n\tinput = common.RightPadBytes(input, ecRecoverInputLength)\n\t// \"input\" is (hash, v, r, s), each 32 bytes\n\t// but for ecrecover we want (r, s, v)\n\n\tr := new(big.Int).SetBytes(input[64:96])\n\ts := new(big.Int).SetBytes(input[96:128])\n\tv := input[63] - 27\n\n\t// tighter sig s values input homestead only apply to tx sigs\n\tif !allZero(input[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) {\n\t\treturn nil, nil\n\t}\n\t// v needs to be at the end for libsecp256k1\n\tpubKey, err := crypto.Ecrecover(input[:32], append(input[64:128], v))\n\t// make sure the public key is a valid one\n\tif err != nil {\n\t\treturn nil, nil\n\t}\n\n\t// the first byte of pubkey is bitcoin heritage\n\treturn common.LeftPadBytes(crypto.Keccak256(pubKey[1:])[12:], 32), nil\n}\n\n// SHA256 implemented as a native contract.\ntype sha256hash struct{}\n\n// RequiredGas returns the gas required to execute the pre-compiled contract.\n//\n// This method does not require any overflow checking as the input size gas costs\n// required for anything significant is so high it's impossible to pay for.\nfunc (c *sha256hash) RequiredGas(input []byte) uint64 {\n\treturn uint64(len(input)+31)/32*params.Sha256PerWordGas + params.Sha256BaseGas\n}\nfunc (c *sha256hash) Run(input []byte) ([]byte, error) {\n\th := sha256.Sum256(input)\n\treturn h[:], nil\n}\n\n// RIPEMD160 implemented as a native contract.\ntype ripemd160hash struct{}\n\n// RequiredGas returns the gas required to execute the pre-compiled contract.\n//\n// This method does not require any overflow checking as the input size gas costs\n// required for anything significant is so high it's impossible to pay for.\nfunc (c *ripemd160hash) RequiredGas(input []byte) uint64 {\n\treturn uint64(len(input)+31)/32*params.Ripemd160PerWordGas + params.Ripemd160BaseGas\n}\nfunc (c *ripemd160hash) Run(input []byte) ([]byte, error) {\n\tripemd := ripemd160.New()\n\tripemd.Write(input)\n\treturn common.LeftPadBytes(ripemd.Sum(nil), 32), nil\n}\n\n// data copy implemented as a native contract.\ntype dataCopy struct{}\n\n// RequiredGas returns the gas required to execute the pre-compiled contract.\n//\n// This method does not require any overflow checking as the input size gas costs\n// required for anything significant is so high it's impossible to pay for.\nfunc (c *dataCopy) RequiredGas(input []byte) uint64 {\n\treturn uint64(len(input)+31)/32*params.IdentityPerWordGas + params.IdentityBaseGas\n}\nfunc (c *dataCopy) Run(in []byte) ([]byte, error) {\n\treturn in, nil\n}\n\n// bigModExp implements a native big integer exponential modular operation.\ntype bigModExp struct{}\n\nvar (\n\tbig1      = big.NewInt(1)\n\tbig4      = big.NewInt(4)\n\tbig8      = big.NewInt(8)\n\tbig16     = big.NewInt(16)\n\tbig32     = big.NewInt(32)\n\tbig64     = big.NewInt(64)\n\tbig96     = big.NewInt(96)\n\tbig480    = big.NewInt(480)\n\tbig1024   = big.NewInt(1024)\n\tbig3072   = big.NewInt(3072)\n\tbig199680 = big.NewInt(199680)\n)\n\n// RequiredGas returns the gas required to execute the pre-compiled contract.\nfunc (c *bigModExp) RequiredGas(input []byte) uint64 {\n\tvar (\n\t\tbaseLen = new(big.Int).SetBytes(getData(input, 0, 32))\n\t\texpLen  = new(big.Int).SetBytes(getData(input, 32, 32))\n\t\tmodLen  = new(big.Int).SetBytes(getData(input, 64, 32))\n\t)\n\tif len(input) > 96 {\n\t\tinput = input[96:]\n\t} else {\n\t\tinput = input[:0]\n\t}\n\t// Retrieve the head 32 bytes of exp for the adjusted exponent length\n\tvar expHead *big.Int\n\tif big.NewInt(int64(len(input))).Cmp(baseLen) <= 0 {\n\t\texpHead = new(big.Int)\n\t} else {\n\t\tif expLen.Cmp(big32) > 0 {\n\t\t\texpHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), 32))\n\t\t} else {\n\t\t\texpHead = new(big.Int).SetBytes(getData(input, baseLen.Uint64(), expLen.Uint64()))\n\t\t}\n\t}\n\t// Calculate the adjusted exponent length\n\tvar msb int\n\tif bitlen := expHead.BitLen(); bitlen > 0 {\n\t\tmsb = bitlen - 1\n\t}\n\tadjExpLen := new(big.Int)\n\tif expLen.Cmp(big32) > 0 {\n\t\tadjExpLen.Sub(expLen, big32)\n\t\tadjExpLen.Mul(big8, adjExpLen)\n\t}\n\tadjExpLen.Add(adjExpLen, big.NewInt(int64(msb)))\n\n\t// Calculate the gas cost of the operation\n\tgas := new(big.Int).Set(math.BigMax(modLen, baseLen))\n\tswitch {\n\tcase gas.Cmp(big64) <= 0:\n\t\tgas.Mul(gas, gas)\n\tcase gas.Cmp(big1024) <= 0:\n\t\tgas = new(big.Int).Add(\n\t\t\tnew(big.Int).Div(new(big.Int).Mul(gas, gas), big4),\n\t\t\tnew(big.Int).Sub(new(big.Int).Mul(big96, gas), big3072),\n\t\t)\n\tdefault:\n\t\tgas = new(big.Int).Add(\n\t\t\tnew(big.Int).Div(new(big.Int).Mul(gas, gas), big16),\n\t\t\tnew(big.Int).Sub(new(big.Int).Mul(big480, gas), big199680),\n\t\t)\n\t}\n\tgas.Mul(gas, math.BigMax(adjExpLen, big1))\n\tgas.Div(gas, new(big.Int).SetUint64(params.ModExpQuadCoeffDiv))\n\n\tif gas.BitLen() > 64 {\n\t\treturn math.MaxUint64\n\t}\n\treturn gas.Uint64()\n}\n\nfunc (c *bigModExp) Run(input []byte) ([]byte, error) {\n\tvar (\n\t\tbaseLen = new(big.Int).SetBytes(getData(input, 0, 32)).Uint64()\n\t\texpLen  = new(big.Int).SetBytes(getData(input, 32, 32)).Uint64()\n\t\tmodLen  = new(big.Int).SetBytes(getData(input, 64, 32)).Uint64()\n\t)\n\tif len(input) > 96 {\n\t\tinput = input[96:]\n\t} else {\n\t\tinput = input[:0]\n\t}\n\t// Handle a special case when both the base and mod length is zero\n\tif baseLen == 0 && modLen == 0 {\n\t\treturn []byte{}, nil\n\t}\n\t// Retrieve the operands and execute the exponentiation\n\tvar (\n\t\tbase = new(big.Int).SetBytes(getData(input, 0, baseLen))\n\t\texp  = new(big.Int).SetBytes(getData(input, baseLen, expLen))\n\t\tmod  = new(big.Int).SetBytes(getData(input, baseLen+expLen, modLen))\n\t)\n\tif mod.BitLen() == 0 {\n\t\t// Modulo 0 is undefined, return zero\n\t\treturn common.LeftPadBytes([]byte{}, int(modLen)), nil\n\t}\n\treturn common.LeftPadBytes(base.Exp(base, exp, mod).Bytes(), int(modLen)), nil\n}\n\n\n// newCurvePoint unmarshals a binary blob into a bn256 elliptic curve point,\n// returning it, or an error if the point is invalid.\nfunc newCurvePoint(blob []byte) (*bn256.G1, error) {\n\tp := new(bn256.G1)\n\tif _, err := p.Unmarshal(blob); err != nil {\n\t\treturn nil, err\n\t}\n\treturn p, nil\n}\n\n// newTwistPoint unmarshals a binary blob into a bn256 elliptic curve point,\n// returning it, or an error if the point is invalid.\nfunc newTwistPoint(blob []byte) (*bn256.G2, error) {\n\tp := new(bn256.G2)\n\tif _, err := p.Unmarshal(blob); err != nil {\n\t\treturn nil, err\n\t}\n\treturn p, nil\n}\n\n// bn256Add implements a native elliptic curve point addition.\ntype bn256Add struct{}\n\n// RequiredGas returns the gas required to execute the pre-compiled contract.\nfunc (c *bn256Add) RequiredGas(input []byte) uint64 {\n\treturn params.Bn256AddGas\n}\n\nfunc (c *bn256Add) Run(input []byte) ([]byte, error) {\n\tx, err := newCurvePoint(getData(input, 0, 64))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ty, err := newCurvePoint(getData(input, 64, 64))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres := new(bn256.G1)\n\tres.Add(x, y)\n\treturn res.Marshal(), nil\n}\n\n// bn256ScalarMul implements a native elliptic curve scalar multiplication.\ntype bn256ScalarMul struct{}\n\n// RequiredGas returns the gas required to execute the pre-compiled contract.\nfunc (c *bn256ScalarMul) RequiredGas(input []byte) uint64 {\n\treturn params.Bn256ScalarMulGas\n}\n\nfunc (c *bn256ScalarMul) Run(input []byte) ([]byte, error) {\n\tp, err := newCurvePoint(getData(input, 0, 64))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tres := new(bn256.G1)\n\tres.ScalarMult(p, new(big.Int).SetBytes(getData(input, 64, 32)))\n\treturn res.Marshal(), nil\n}\n\nvar (\n\t// true32Byte is returned if the bn256 pairing check succeeds.\n\ttrue32Byte = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}\n\n\t// false32Byte is returned if the bn256 pairing check fails.\n\tfalse32Byte = make([]byte, 32)\n\n\t// errBadPairingInput is returned if the bn256 pairing input is invalid.\n\terrBadPairingInput = errors.New(\"bad elliptic curve pairing size\")\n)\n\n// bn256Pairing implements a pairing pre-compile for the bn256 curve\ntype bn256Pairing struct{}\n\n// RequiredGas returns the gas required to execute the pre-compiled contract.\nfunc (c *bn256Pairing) RequiredGas(input []byte) uint64 {\n\treturn params.Bn256PairingBaseGas + uint64(len(input)/192)*params.Bn256PairingPerPointGas\n}\n\nfunc (c *bn256Pairing) Run(input []byte) ([]byte, error) {\n\t// Handle some corner cases cheaply\n\tif len(input)%192 > 0 {\n\t\treturn nil, errBadPairingInput\n\t}\n\t// Convert the input into a set of coordinates\n\tvar (\n\t\tcs []*bn256.G1\n\t\tts []*bn256.G2\n\t)\n\tfor i := 0; i < len(input); i += 192 {\n\t\tc, err := newCurvePoint(input[i : i+64])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tt, err := newTwistPoint(input[i+64 : i+192])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcs = append(cs, c)\n\t\tts = append(ts, t)\n\t}\n\t// Execute the pairing checks and return the results\n\tif bn256.PairingCheck(cs, ts) {\n\t\treturn true32Byte, nil\n\t}\n\treturn false32Byte, nil\n}\n*/\n"
  },
  {
    "path": "core/vm/doc.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\nPackage vm implements the Ethereum Virtual Machine.\n\nThe vm package implements one EVM, a byte code VM. The BC (Byte Code) VM loops\nover a set of bytes and executes them according to the set of rules defined\nin the Ethereum yellow paper.\n*/\npackage vm\n"
  },
  {
    "path": "core/vm/errors.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport \"errors\"\n\n// List execution errors\nvar (\n\tErrOutOfGas                 = errors.New(\"out of gas\")\n\tErrCodeStoreOutOfGas        = errors.New(\"contract creation code storage out of gas\")\n\tErrDepth                    = errors.New(\"max call depth exceeded\")\n\tErrTraceLimitReached        = errors.New(\"the number of logs reached the specified limit\")\n\tErrInsufficientBalance      = errors.New(\"insufficient balance for transfer\")\n\tErrContractAddressCollision = errors.New(\"contract address collision\")\n\tErrNoCompatibleInterpreter  = errors.New(\"no compatible interpreter\")\n\tErrCodeInvalid              = errors.New(\"input invalid\")\n)\n"
  },
  {
    "path": "core/vm/evm.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// emptyCodeHash is used by create to ensure deployment is disallowed to already\n// deployed contract addresses (relevant after the account abstraction).\nvar emptyCodeHash = crypto.Keccak256Hash(nil)\n\ntype (\n\t// CanTransferFunc is the signature of a transfer guard function\n\tCanTransferFunc func(StateDB, common.Address, *assets.Asset) bool\n\t// TransferFunc is the signature of a transfer function\n\tTransferFunc func(StateDB, common.Address, common.Address, *assets.Asset, common.Hash) (alarm bool)\n\t// GetHashFunc returns the nth block hash in the blockchain\n\t// and is used by the BLOCKHASH EVM op code.\n\tGetHashFunc func(uint64) common.Hash\n)\n\n// run runs the given contract and takes care of running precompiles with a fallback to the byte code interpreter.\nfunc run(evm *EVM, contract *Contract, input []byte) ([]byte, error) {\n\tfor _, interpreter := range evm.interpreters {\n\t\tif interpreter.CanRun(contract.Code) {\n\t\t\tif evm.interpreter != interpreter {\n\t\t\t\t// Ensure that the interpreter pointer is set back\n\t\t\t\t// to its current value upon return.\n\t\t\t\tdefer func(i Interpreter) {\n\t\t\t\t\tevm.interpreter = i\n\t\t\t\t}(evm.interpreter)\n\t\t\t\tevm.interpreter = interpreter\n\t\t\t}\n\t\t\treturn interpreter.Run(contract, input)\n\t\t}\n\t}\n\treturn nil, ErrNoCompatibleInterpreter\n}\n\n// Context provides the EVM with auxiliary information. Once provided\n// it shouldn't be modified.\ntype Context struct {\n\t// CanTransfer returns whether the account contains\n\t// sufficient ether to transfer the value\n\tCanTransfer CanTransferFunc\n\t// Transfer transfers ether from one account to the other\n\tTransfer TransferFunc\n\t// GetHash returns the hash corresponding to n\n\tGetHash GetHashFunc\n\n\t// Message information\n\tOrigin   common.Address // Provides information for ORIGIN\n\tGasPrice *big.Int       // Provides information for GASPRICE\n\tTxHash   common.Hash\n\n\t// Block information\n\tCoinbase    common.Address // Provides information for COINBASE\n\tGasLimit    uint64         // Provides information for GASLIMIT\n\tBlockNumber *big.Int       // Provides information for NUMBER\n\tTime        *big.Int       // Provides information for TIME\n\tDifficulty  *big.Int       // Provides information for DIFFICULTY\n}\n\n// EVM is the Ethereum Virtual Machine base object and provides\n// the necessary tools to run a contract on the given state with\n// the provided context. It should be noted that any error\n// generated through any of the calls should be considered a\n// revert-state-and-consume-all-gas operation, no checks on\n// specific errors should ever be performed. The interpreter makes\n// sure that any errors generated are to be considered faulty code.\n//\n// The EVM should never be reused and is not thread safe.\ntype EVM struct {\n\t// Context provides auxiliary blockchain related information\n\tContext\n\t// StateDB gives access to the underlying state\n\tStateDB StateDB\n\t// Depth is the current call stack\n\tdepth int\n\n\t// chainConfig contains information about the current chain\n\tchainConfig *params.ChainConfig\n\t// chain rules contains the chain rules for the current epoch\n\tchainRules params.Rules\n\t// virtual machine configuration options used to initialise the\n\t// evm.\n\tvmConfig Config\n\t// global (to this context) ethereum virtual machine\n\t// used throughout the execution of the tx.\n\tinterpreters []Interpreter\n\tinterpreter  Interpreter\n\t// abort is used to abort the EVM calling operations\n\t// NOTE: must be set atomically\n\tabort int32\n\t// callGasTemp holds the gas available for the current call. This is needed because the\n\t// available gas is calculated in gasCall* according to the 63/64 rule and later\n\t// applied in opCall*.\n\tcallGasTemp uint64\n}\n\n// NewEVM returns a new EVM. The returned EVM is not thread safe and should\n// only ever be used *once*.\nfunc NewEVM(ctx Context, statedb StateDB, chainConfig *params.ChainConfig, vmConfig Config) *EVM {\n\tevm := &EVM{\n\t\tContext:      ctx,\n\t\tStateDB:      statedb,\n\t\tvmConfig:     vmConfig,\n\t\tchainConfig:  chainConfig,\n\t\tchainRules:   chainConfig.Rules(ctx.BlockNumber),\n\t\tinterpreters: make([]Interpreter, 1),\n\t}\n\n\tevm.interpreters[0] = NewEVMInterpreter(evm, vmConfig)\n\tevm.interpreter = evm.interpreters[0]\n\n\treturn evm\n}\n\n// Cancel cancels any running EVM operation. This may be called concurrently and\n// it's safe to be called multiple times.\nfunc (evm *EVM) Cancel() {\n\t//atomic.StoreInt32(&evm.abort, 1)\n}\n\n// Interpreter returns the current interpreter\nfunc (evm *EVM) Interpreter() Interpreter {\n\treturn evm.interpreter\n}\n\n// Call executes the contract associated with the addr with the given input as\n// parameters. It also handles any necessary value transfer required and takes\n// the necessary steps to create accounts and reverses the state in case of an\n// execution error or failed value transfer.\nfunc (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, asset *assets.Asset) (ret []byte, leftOverGas uint64, err error, alarm bool) {\n\tif evm.vmConfig.NoRecursion && evm.depth > 0 {\n\t\treturn nil, gas, nil, false\n\t}\n\n\t// Fail if we're trying to execute above the call depth limit\n\tif evm.depth > int(params.CallCreateDepth) {\n\t\treturn nil, gas, ErrDepth, false\n\t}\n\n\tif evm.StateDB.IsContract(caller.Address()) && !evm.Context.CanTransfer(evm.StateDB, caller.Address(), asset) {\n\t\treturn nil, gas, ErrInsufficientBalance, false\n\t}\n\n\tvar (\n\t\tto       = AccountRef(addr)\n\t\tsnapshot = evm.StateDB.Snapshot()\n\t)\n\n\talarm = evm.Transfer(evm.StateDB, caller.Address(), to.Address(), asset, evm.TxHash)\n\n\t// Initialise a new contract and set the code that is to be used by the EVM.\n\t// The contract is a scoped environment for this execution context only.\n\tcontract := NewContract(caller, to, asset, gas)\n\tcontract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))\n\tinput, err = loadAddress(evm, caller, input, contract, false)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\treturn ret, leftOverGas, err, alarm\n\t}\n\n\tstart := time.Now()\n\n\t// Capture the tracer start/end events in debug mode\n\tif evm.vmConfig.Debug && evm.depth == 0 {\n\t\tevm.vmConfig.Tracer.CaptureStart(caller.Address(), addr, false, input, gas, asset)\n\n\t\tdefer func() { // Lazy evaluation of the parameters\n\t\t\tevm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)\n\t\t}()\n\t}\n\tret, err = run(evm, contract, input)\n\n\t// When an error was returned by the EVM or when setting the creation code\n\t// above we revert to the snapshot and consume any gas remaining. Additionally\n\t// when we're in homestead this also counts for code storage gas errors.\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\tif err != errExecutionReverted {\n\t\t\tcontract.UseGas(contract.Gas)\n\t\t}\n\t}\n\treturn ret, contract.Gas, err, alarm\n}\n\n// CallCode executes the contract associated with the addr with the given input\n// as parameters. It also handles any necessary value transfer required and takes\n// the necessary steps to create accounts and reverses the state in case of an\n// execution error or failed value transfer.\n//\n// CallCode differs from Call in the sense that it executes the given address'\n// code with the caller as context.\nfunc (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, asset *assets.Asset) (ret []byte, leftOverGas uint64, err error) {\n\tif evm.vmConfig.NoRecursion && evm.depth > 0 {\n\t\treturn nil, gas, nil\n\t}\n\n\t// Fail if we're trying to execute above the call depth limit\n\tif evm.depth > int(params.CallCreateDepth) {\n\t\treturn nil, gas, ErrDepth\n\t}\n\t// Fail if we're trying to transfer more than the available balance\n\tif evm.StateDB.IsContract(caller.Address()) && !evm.Context.CanTransfer(evm.StateDB, caller.Address(), asset) {\n\t\treturn nil, gas, ErrInsufficientBalance\n\t}\n\n\tvar (\n\t\tsnapshot = evm.StateDB.Snapshot()\n\t\tto       = AccountRef(caller.Address())\n\t)\n\t// initialise a new contract and set the code that is to be used by the\n\t// EVM. The contract is a scoped environment for this execution context\n\t// only.\n\tcontract := NewContract(caller, to, asset, gas)\n\tcontract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))\n\tinput, err = loadAddress(evm, caller, input, contract, false)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\treturn ret, leftOverGas, err\n\t}\n\n\tret, err = run(evm, contract, input)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\tif err != errExecutionReverted {\n\t\t\tcontract.UseGas(contract.Gas)\n\t\t}\n\t}\n\treturn ret, contract.Gas, err\n}\n\n// DelegateCall executes the contract associated with the addr with the given input\n// as parameters. It reverses the state in case of an execution error.\n//\n// DelegateCall differs from CallCode in the sense that it executes the given address'\n// code with the caller as context and the caller is set to the caller of the caller.\nfunc (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) {\n\tif evm.vmConfig.NoRecursion && evm.depth > 0 {\n\t\treturn nil, gas, nil\n\t}\n\t// Fail if we're trying to execute above the call depth limit\n\tif evm.depth > int(params.CallCreateDepth) {\n\t\treturn nil, gas, ErrDepth\n\t}\n\n\tvar (\n\t\tsnapshot = evm.StateDB.Snapshot()\n\t\tto       = AccountRef(caller.Address())\n\t)\n\n\t// Initialise a new contract and make initialise the delegate values\n\tcontract := NewContract(caller, to, nil, gas).AsDelegate()\n\tcontract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))\n\tinput, err = loadAddress(evm, caller, input, contract, false)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\treturn ret, leftOverGas, err\n\t}\n\n\tret, err = run(evm, contract, input)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\tif err != errExecutionReverted {\n\t\t\tcontract.UseGas(contract.Gas)\n\t\t}\n\t}\n\treturn ret, contract.Gas, err\n}\n\n// StaticCall executes the contract associated with the addr with the given input\n// as parameters while disallowing any modifications to the state during the call.\n// Opcodes that attempt to perform such modifications will result in exceptions\n// instead of performing the modifications.\nfunc (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) {\n\tif evm.vmConfig.NoRecursion && evm.depth > 0 {\n\t\treturn nil, gas, nil\n\t}\n\t// Fail if we're trying to execute above the call depth limit\n\tif evm.depth > int(params.CallCreateDepth) {\n\t\treturn nil, gas, ErrDepth\n\t}\n\t// Make sure the readonly is only set if we aren't in readonly yet\n\t// this makes also sure that the readonly flag isn't removed for\n\t// child calls.\n\tif !evm.interpreter.IsReadOnly() {\n\t\tevm.interpreter.SetReadOnly(true)\n\t\tdefer func() { evm.interpreter.SetReadOnly(false) }()\n\t}\n\n\tvar (\n\t\tto       = AccountRef(addr)\n\t\tsnapshot = evm.StateDB.Snapshot()\n\t)\n\t// Initialise a new contract and set the code that is to be used by the\n\t// EVM. The contract is a scoped environment for this execution context\n\t// only.\n\tcontract := NewContract(caller, to, nil, gas)\n\tcontract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))\n\tinput, err = loadAddress(evm, caller, input, contract, false)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\treturn ret, leftOverGas, err\n\t}\n\n\t// When an error was returned by the EVM or when setting the creation code\n\t// above we revert to the snapshot and consume any gas remaining. Additionally\n\t// when we're in Homestead this also counts for code storage gas errors.\n\tret, err = run(evm, contract, input)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\tif err != errExecutionReverted {\n\t\t\tcontract.UseGas(contract.Gas)\n\t\t}\n\t}\n\treturn ret, contract.Gas, err\n}\n\nfunc loadAddress(evm *EVM, caller ContractRef, input []byte, contract *Contract, contractCreation bool) ([]byte, error) {\n\tcontract.PutNonceAddress(evm.StateDB, caller.Address())\n\tif !evm.StateDB.IsContract(caller.Address()) {\n\t\tif len(input) != 0 && (contractCreation || len(contract.Code) > 0) {\n\t\t\tif len(input) < 18 {\n\t\t\t\treturn input, ErrCodeInvalid\n\t\t\t}\n\t\t\tn := int(input[16])<<8 + int(input[17])\n\t\t\tif len(input) < n*96+18 {\n\t\t\t\treturn input, ErrCodeInvalid\n\t\t\t}\n\t\t\tfor i := 0; i < n; i++ {\n\t\t\t\taddr := common.BytesToAddress(input[i*96+18 : i*96+114])\n\t\t\t\tcontract.PutNonceAddress(evm.StateDB, addr)\n\t\t\t}\n\t\t\tinput = input[n*96+18:]\n\t\t}\n\t}\n\treturn input, nil\n}\n\n// create creates a new contract using code as deployment code.\nfunc (evm *EVM) create(caller ContractRef, code []byte, gas uint64, asset *assets.Asset, address common.Address) ([]byte, common.Address, uint64, error) {\n\t// Depth check execution. Fail if we're trying to execute above the\n\t// limit.\n\tif evm.depth > int(params.CallCreateDepth) {\n\t\treturn nil, common.Address{}, gas, ErrDepth\n\t}\n\n\t// Ensure there's no existing contract already at the designated address\n\tcontractHash := evm.StateDB.GetCodeHash(address)\n\tif contractHash != (common.Hash{}) && contractHash != emptyCodeHash {\n\t\treturn nil, common.Address{}, 0, ErrContractAddressCollision\n\t}\n\t// Create a new account on the state\n\tsnapshot := evm.StateDB.Snapshot()\n\tevm.StateDB.CreateAccount(address)\n\n\tevm.Transfer(evm.StateDB, caller.Address(), address, asset, evm.TxHash)\n\n\t// initialise a new contract and set the code that is to be used by the\n\t// EVM. The contract is a scoped environment for this execution context\n\t// only.\n\tcontract := NewContract(caller, AccountRef(address), asset, gas)\n\tif evm.BlockNumber.Uint64() >= seroparam.SIP9() {\n\t\tcontract.PutNonceAddress(evm.StateDB, address)\n\t}\n\tcode, err := loadAddress(evm, caller, code, contract, true)\n\tif err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\treturn nil, common.Address{}, 0, err\n\t}\n\tcontract.SetCallCode(&address, crypto.Keccak256Hash(code), code)\n\n\tif evm.vmConfig.NoRecursion && evm.depth > 0 {\n\t\treturn nil, common.Address{}, gas, nil\n\t}\n\n\tif evm.vmConfig.Debug && evm.depth == 0 {\n\t\tevm.vmConfig.Tracer.CaptureStart(caller.Address(), address, true, code, gas, asset)\n\t}\n\tstart := time.Now()\n\n\tret, err := run(evm, contract, nil)\n\n\t// check whether the max code size has been exceeded\n\tmaxCodeSizeExceeded := len(ret) > params.MaxCodeSize\n\t// if the contract creation ran successfully and no errors were returned\n\t// calculate the gas required to store the code. If the code could not\n\t// be stored due to not enough gas set an error and let it be handled\n\t// by the error checking condition below.\n\tif err == nil && !maxCodeSizeExceeded {\n\t\tcreateDataGas := uint64(len(ret)) * params.CreateDataGas\n\t\tif contract.UseGas(createDataGas) {\n\t\t\t//println(common.Bytes2Hex(ret))\n\t\t\tevm.StateDB.SetCode(address, ret)\n\t\t} else {\n\t\t\terr = ErrCodeStoreOutOfGas\n\t\t}\n\t}\n\n\t// When an error was returned by the EVM or when setting the creation code\n\t// above we revert to the snapshot and consume any gas remaining. Additionally\n\t// when we're in homestead this also counts for code storage gas errors.\n\tif maxCodeSizeExceeded || err != nil {\n\t\tevm.StateDB.RevertToSnapshot(snapshot)\n\t\tif err != errExecutionReverted {\n\t\t\tcontract.UseGas(contract.Gas)\n\t\t}\n\t}\n\t// Assign err if contract code size exceeds the max while the err is still empty.\n\tif maxCodeSizeExceeded && err == nil {\n\t\terr = errMaxCodeSizeExceeded\n\t}\n\tif evm.vmConfig.Debug && evm.depth == 0 {\n\t\tevm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)\n\t}\n\treturn ret, address, contract.Gas, err\n\n}\n\n// Create creates a new contract using code as deployment code.\nfunc (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, asset *assets.Asset) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) {\n\tif len(code) < 16 {\n\t\treturn ret, contractAddr, leftOverGas, ErrCodeInvalid\n\t}\n\tcontractAddr = crypto.CreateAddress(caller.Address(), evm.StateDB.IncAndGetContrctNonce(), code[0:16])\n\treturn evm.create(caller, code, gas, asset, contractAddr)\n}\n\n// ChainConfig returns the environment's chain configuration\nfunc (evm *EVM) ChainConfig() *params.ChainConfig { return evm.chainConfig }\n"
  },
  {
    "path": "core/vm/gas.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// Gas costs\nconst (\n\tGasQuickStep   uint64 = 2\n\tGasFastestStep uint64 = 3\n\tGasFastStep    uint64 = 5\n\tGasMidStep     uint64 = 8\n\tGasSlowStep    uint64 = 10\n\tGasExtStep     uint64 = 20\n\n\tGasReturn       uint64 = 0\n\tGasStop         uint64 = 0\n\tGasContractByte uint64 = 200\n)\n\n// calcGas returns the actual gas cost of the call.\n//\n// The cost of gas was changed during the homestead price change HF. To allow for EIP150\n// to be implemented. The returned gas is gas - base * 63 / 64.\nfunc callGas(gasTable params.GasTable, availableGas, base uint64, callCost *big.Int) (uint64, error) {\n\tif gasTable.CreateBySuicide > 0 {\n\t\tavailableGas = availableGas - base\n\t\tgas := availableGas - availableGas/64\n\t\t// If the bit length exceeds 64 bit we know that the newly calculated \"gas\" for EIP150\n\t\t// is smaller than the requested amount. Therefor we return the new gas instead\n\t\t// of returning an error.\n\t\tif callCost.BitLen() > 64 || gas < callCost.Uint64() {\n\t\t\treturn gas, nil\n\t\t}\n\t}\n\tif callCost.BitLen() > 64 {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\treturn callCost.Uint64(), nil\n}\n"
  },
  {
    "path": "core/vm/gas_table.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// memoryGasCosts calculates the quadratic gas for memory expansion. It does so\n// only for the memory region that is expanded, not the total memory.\nfunc memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) {\n\n\tif newMemSize == 0 {\n\t\treturn 0, nil\n\t}\n\t// The maximum that will fit in a uint64 is max_word_count - 1\n\t// anything above that will result in an overflow.\n\t// Additionally, a newMemSize which results in a\n\t// newMemSizeWords larger than 0x7ffffffff will cause the square operation\n\t// to overflow.\n\t// The constant 0xffffffffe0 is the highest number that can be used without\n\t// overflowing the gas calculation\n\tif newMemSize > 0xffffffffe0 {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tnewMemSizeWords := toWordSize(newMemSize)\n\tnewMemSize = newMemSizeWords * 32\n\n\tif newMemSize > uint64(mem.Len()) {\n\t\tsquare := newMemSizeWords * newMemSizeWords\n\t\tlinCoef := newMemSizeWords * params.MemoryGas\n\t\tquadCoef := square / params.QuadCoeffDiv\n\t\tnewTotalFee := linCoef + quadCoef\n\n\t\tfee := newTotalFee - mem.lastGasCost\n\t\tmem.lastGasCost = newTotalFee\n\n\t\treturn fee, nil\n\t}\n\treturn 0, nil\n}\n\nfunc constGasFunc(gas uint64) gasFunc {\n\treturn func(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\t\treturn gas, nil\n\t}\n}\n\nfunc gasCallDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\twords, overflow := bigUint64(stack.Back(2))\n\tif overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tif words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tif gas, overflow = math.SafeAdd(gas, words); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasReturnDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\twords, overflow := bigUint64(stack.Back(2))\n\tif overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tif words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tif gas, overflow = math.SafeAdd(gas, words); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar (\n\t\ty, x = stack.Back(1), stack.Back(0)\n\t\tval  = evm.StateDB.GetState(contract.Address(), common.BigToHash(x))\n\t)\n\t// This checks for 3 scenario's and calculates gas accordingly\n\t// 1. From a zero-value address to a non-zero value         (NEW VALUE)\n\t// 2. From a non-zero value address to a zero-value address (DELETE)\n\t// 3. From a non-zero to a non-zero                         (CHANGE)\n\tif val == (common.Hash{}) && y.Sign() != 0 {\n\t\t// 0 => non 0\n\t\treturn params.SstoreSetGas, nil\n\t} else if val != (common.Hash{}) && y.Sign() == 0 {\n\t\t// non 0 => 0\n\t\tevm.StateDB.AddRefund(params.SstoreRefundGas)\n\t\treturn params.SstoreClearGas, nil\n\t} else {\n\t\t// non 0 => non 0 (or 0 => 0)\n\t\treturn params.SstoreResetGas, nil\n\t}\n}\n\nvar (\n\tsendTopic        = \"0x868bd6629e7c2e3d2ccf7b9968fad79b448e7a2bfb3ee20ed1acbc695c3c8b23\"\n\tallotTicketTopic = \"0xa6a366f1a72e1aef5d8d52ee240a476f619d15be7bc62d3df37496025b83459f\"\n)\n\nfunc makeGasLog(n uint64) gasFunc {\n\treturn func(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\t\trequestedSize, overflow := bigUint64(stack.Back(1))\n\t\tif overflow {\n\t\t\treturn 0, errGasUintOverflow\n\t\t}\n\n\t\tgas, err := memoryGasCost(mem, memorySize)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\tif gas, overflow = math.SafeAdd(gas, params.LogGas); overflow {\n\t\t\treturn 0, errGasUintOverflow\n\t\t}\n\t\tif gas, overflow = math.SafeAdd(gas, n*params.LogTopicGas); overflow {\n\t\t\treturn 0, errGasUintOverflow\n\t\t}\n\n\t\tvar memorySizeGas uint64\n\t\tif memorySizeGas, overflow = math.SafeMul(requestedSize, params.LogDataGas); overflow {\n\t\t\treturn 0, errGasUintOverflow\n\t\t}\n\t\tif gas, overflow = math.SafeAdd(gas, memorySizeGas); overflow {\n\t\t\treturn 0, errGasUintOverflow\n\t\t}\n\n\t\tif evm.BlockNumber.Uint64() < seroparam.SIP5() {\n\t\t\tevm.callGasTemp, err = callGas(gt, contract.Gas, gas, new(big.Int).SetUint64(math.MaxUint64))\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\tif gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {\n\t\t\t\treturn 0, errGasUintOverflow\n\t\t\t}\n\t\t} else {\n\t\t\tevm.callGasTemp = 0\n\t\t\ttopic := common.BigToHash(stack.Back(2)).Hex()\n\t\t\tif sendTopic == topic || allotTicketTopic == topic {\n\t\t\t\tif gas, overflow = math.SafeAdd(gas, params.CallValueTransferGas); overflow {\n\t\t\t\t\treturn 0, errGasUintOverflow\n\t\t\t\t}\n\n\t\t\t\tevm.callGasTemp, err = callGas(gt, contract.Gas, gas, new(big.Int).SetUint64(0))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t\tif allotTicketTopic == topic {\n\t\t\t\t\tevm.callGasTemp += params.CreateTicketGas\n\t\t\t\t}\n\t\t\t\tif gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {\n\t\t\t\t\treturn 0, errGasUintOverflow\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn gas, nil\n\t}\n}\n\nfunc gasSha3(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar overflow bool\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tif gas, overflow = math.SafeAdd(gas, params.Sha3Gas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\twordGas, overflow := bigUint64(stack.Back(1))\n\tif overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\tif wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Sha3WordGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\tif gas, overflow = math.SafeAdd(gas, wordGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasCodeCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\twordGas, overflow := bigUint64(stack.Back(2))\n\tif overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\tif wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.CopyGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\tif gas, overflow = math.SafeAdd(gas, wordGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasExtCodeCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, gt.ExtcodeCopy); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\twordGas, overflow := bigUint64(stack.Back(3))\n\tif overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tif wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.CopyGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tif gas, overflow = math.SafeAdd(gas, wordGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasExtCodeHash(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn gt.ExtcodeHash, nil\n}\n\nfunc gasMLoad(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar overflow bool\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, errGasUintOverflow\n\t}\n\tif gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasMStore8(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar overflow bool\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, errGasUintOverflow\n\t}\n\tif gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasMStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar overflow bool\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, errGasUintOverflow\n\t}\n\tif gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasCreate(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar overflow bool\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif gas, overflow = math.SafeAdd(gas, params.CreateGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasCreate2(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar overflow bool\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif gas, overflow = math.SafeAdd(gas, params.Create2Gas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasBalance(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn gt.Balance, nil\n}\n\nfunc gasExtCodeSize(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn gt.ExtcodeSize, nil\n}\n\nfunc gasSLoad(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn gt.SLoad, nil\n}\n\nfunc gasExp(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\texpByteLen := uint64((stack.data[stack.len()-2].BitLen() + 7) / 8)\n\n\tvar (\n\t\tgas      = expByteLen * gt.ExpByte // no overflow check required. Max is 256 * ExpByte gas\n\t\toverflow bool\n\t)\n\tif gas, overflow = math.SafeAdd(gas, GasSlowStep); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar (\n\t\tgas            = gt.Calls\n\t\ttransfersValue = stack.Back(2).Sign() != 0\n\t\t// address        = common.BigToAddress(stack.Back(1))\n\t)\n\t// if !evm.StateDB.Exist(address) {\n\t//\tgas += params.CallNewAccountGas\n\t// }\n\tif transfersValue || contract.callMsg != nil {\n\t\tgas += params.CallValueTransferGas\n\t}\n\tmemoryGas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, memoryGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tevm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasCallCode(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tgas := gt.Calls\n\tif stack.Back(2).Sign() != 0 {\n\t\tgas += params.CallValueTransferGas\n\t}\n\tmemoryGas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, memoryGas); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tevm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasReturn(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn memoryGasCost(mem, memorySize)\n}\n\nfunc gasRevert(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn memoryGasCost(mem, memorySize)\n}\n\nfunc gasSuicide(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tvar gas uint64\n\tif !evm.StateDB.HasSuicided(contract.Address()) {\n\t\tevm.StateDB.AddRefund(params.SuicideRefundGas)\n\t}\n\treturn gas, nil\n}\n\nfunc gasDelegateCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, gt.Calls); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tevm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasStaticCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\tgas, err := memoryGasCost(mem, memorySize)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tvar overflow bool\n\tif gas, overflow = math.SafeAdd(gas, gt.Calls); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\n\tevm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow {\n\t\treturn 0, errGasUintOverflow\n\t}\n\treturn gas, nil\n}\n\nfunc gasPush(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn GasFastestStep, nil\n}\n\nfunc gasSwap(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn GasFastestStep, nil\n}\n\nfunc gasDup(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {\n\treturn GasFastestStep, nil\n}\n"
  },
  {
    "path": "core/vm/gas_table_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport \"testing\"\n\nfunc TestMemoryGasCost(t *testing.T) {\n\t//size := uint64(math.MaxUint64 - 64)\n\tsize := uint64(0xffffffffe0)\n\tv, err := memoryGasCost(&Memory{}, size)\n\tif err != nil {\n\t\tt.Error(\"didn't expect error:\", err)\n\t}\n\tif v != 36028899963961341 {\n\t\tt.Errorf(\"Expected: 36028899963961341, got %d\", v)\n\t}\n\n\t_, err = memoryGasCost(&Memory{}, size+1)\n\tif err == nil {\n\t\tt.Error(\"expected error\")\n\t}\n}\n"
  },
  {
    "path": "core/vm/gen_structlog.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage vm\n\nimport (\n\t\"encoding/json\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar _ = (*structLogMarshaling)(nil)\n\nfunc (s StructLog) MarshalJSON() ([]byte, error) {\n\ttype StructLog struct {\n\t\tPc          uint64                      `json:\"pc\"`\n\t\tOp          OpCode                      `json:\"op\"`\n\t\tGas         math.HexOrDecimal64         `json:\"gas\"`\n\t\tGasCost     math.HexOrDecimal64         `json:\"gasCost\"`\n\t\tMemory      hexutil.Bytes               `json:\"memory\"`\n\t\tMemorySize  int                         `json:\"memSize\"`\n\t\tStack       []*math.HexOrDecimal256     `json:\"stack\"`\n\t\tStorage     map[common.Hash]common.Hash `json:\"-\"`\n\t\tDepth       int                         `json:\"depth\"`\n\t\tErr         error                       `json:\"-\"`\n\t\tOpName      string                      `json:\"opName\"`\n\t\tErrorString string                      `json:\"error\"`\n\t}\n\tvar enc StructLog\n\tenc.Pc = s.Pc\n\tenc.Op = s.Op\n\tenc.Gas = math.HexOrDecimal64(s.Gas)\n\tenc.GasCost = math.HexOrDecimal64(s.GasCost)\n\tenc.Memory = s.Memory\n\tenc.MemorySize = s.MemorySize\n\tif s.Stack != nil {\n\t\tenc.Stack = make([]*math.HexOrDecimal256, len(s.Stack))\n\t\tfor k, v := range s.Stack {\n\t\t\tenc.Stack[k] = (*math.HexOrDecimal256)(v)\n\t\t}\n\t}\n\tenc.Storage = s.Storage\n\tenc.Depth = s.Depth\n\tenc.Err = s.Err\n\tenc.OpName = s.OpName()\n\tenc.ErrorString = s.ErrorString()\n\treturn json.Marshal(&enc)\n}\n\nfunc (s *StructLog) UnmarshalJSON(input []byte) error {\n\ttype StructLog struct {\n\t\tPc         *uint64                     `json:\"pc\"`\n\t\tOp         *OpCode                     `json:\"op\"`\n\t\tGas        *math.HexOrDecimal64        `json:\"gas\"`\n\t\tGasCost    *math.HexOrDecimal64        `json:\"gasCost\"`\n\t\tMemory     *hexutil.Bytes              `json:\"memory\"`\n\t\tMemorySize *int                        `json:\"memSize\"`\n\t\tStack      []*math.HexOrDecimal256     `json:\"stack\"`\n\t\tStorage    map[common.Hash]common.Hash `json:\"-\"`\n\t\tDepth      *int                        `json:\"depth\"`\n\t\tErr        error                       `json:\"-\"`\n\t}\n\tvar dec StructLog\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Pc != nil {\n\t\ts.Pc = *dec.Pc\n\t}\n\tif dec.Op != nil {\n\t\ts.Op = *dec.Op\n\t}\n\tif dec.Gas != nil {\n\t\ts.Gas = uint64(*dec.Gas)\n\t}\n\tif dec.GasCost != nil {\n\t\ts.GasCost = uint64(*dec.GasCost)\n\t}\n\tif dec.Memory != nil {\n\t\ts.Memory = *dec.Memory\n\t}\n\tif dec.MemorySize != nil {\n\t\ts.MemorySize = *dec.MemorySize\n\t}\n\tif dec.Stack != nil {\n\t\ts.Stack = make([]*big.Int, len(dec.Stack))\n\t\tfor k, v := range dec.Stack {\n\t\t\ts.Stack[k] = (*big.Int)(v)\n\t\t}\n\t}\n\tif dec.Storage != nil {\n\t\ts.Storage = dec.Storage\n\t}\n\tif dec.Depth != nil {\n\t\ts.Depth = *dec.Depth\n\t}\n\tif dec.Err != nil {\n\t\ts.Err = dec.Err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "core/vm/instructions.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\n\t\"regexp\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nvar (\n\tbigZero                  = new(big.Int)\n\ttt255                    = math.BigPow(2, 255)\n\terrWriteProtection       = errors.New(\"evm: write protection\")\n\terrReturnDataOutOfBounds = errors.New(\"evm: return data out of bounds\")\n\terrExecutionReverted     = errors.New(\"evm: execution reverted\")\n\terrMaxCodeSizeExceeded   = errors.New(\"evm: max code size exceeded\")\n\tErrToAddressError        = errors.New(\"evm: toAddr error\")\n\thashTrue                 = common.LeftPadBytes([]byte{1}, 32)\n\thashFalse                = common.LeftPadBytes([]byte{0}, 32)\n\n\ttopic_issueToken    = common.HexToHash(\"0x3be6bf24d822bcd6f6348f6f5a5c2d3108f04991ee63e80cde49a8c4746a0ef3\")\n\ttopic_send          = common.HexToHash(\"0x868bd6629e7c2e3d2ccf7b9968fad79b448e7a2bfb3ee20ed1acbc695c3c8b23\")\n\ttopic_balanceOf     = common.HexToHash(\"0xcf19eb4256453a4e30b6a06d651f1970c223fb6bd1826a28ed861f0e602db9b8\")\n\ttopic_allotTicket   = common.HexToHash(\"0xa6a366f1a72e1aef5d8d52ee240a476f619d15be7bc62d3df37496025b83459f\")\n\ttopic_currency      = common.HexToHash(\"0x7c98e64bd943448b4e24ef8c2cdec7b8b1275970cfe10daf2a9bfa4b04dce905\")\n\ttopic_category      = common.HexToHash(\"0xf1964f6690a0536daa42e5c575091297d2479edcc96f721ad85b95358644d276\")\n\ttopic_ticket        = common.HexToHash(\"0x9ab0d7c07029f006485cf3468ce7811aa8743b5a108599f6bec9367c50ac6aad\")\n\ttopic_setCallValues = common.HexToHash(\"0xa6cafc6282f61eff9032603a017e652f68410d3d3c69f0a3eeca8f181aec1d17\")\n\ttopic_setTokenRate  = common.HexToHash(\"0x6800e94e36131c049eaeb631e4530829b0d3d20d5b637c8015a8dc9cedd70aed\")\n\ttopic_closePkg      = common.HexToHash(\"0xbbf1aa2159b035802d0a4d44611849d5d4ada0329c81580477d5ec3e82f4f0a6\")\n\ttopic_transferPkg   = common.HexToHash(\"0xa8b83585a613dcf6c905ad7e0ce34cd07d1283cc72906d1fe78037d49adae455\")\n\ttopic_txHash        = common.HexToHash(\"0xa6cb2bbe89e8b5f0c4e2d557b612ed99f5573b419fd9b304b87129514ccc35b2\")\n\ttopic_update        = common.HexToHash(\"0xa6cb2bbe89e8b5f0c4e2d557b612ed99f5573b419fd9b304b87129514ccc35b3\")\n)\n\nfunc opAdd(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\tmath.U256(y.Add(x, y))\n\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opSub(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\tmath.U256(y.Sub(x, y))\n\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opMul(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.pop()\n\tstack.push(math.U256(x.Mul(x, y)))\n\n\tinterpreter.intPool.put(y)\n\n\treturn nil, nil\n}\n\nfunc opDiv(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\tif y.Sign() != 0 {\n\t\tmath.U256(y.Div(x, y))\n\t} else {\n\t\ty.SetUint64(0)\n\t}\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opSdiv(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := math.S256(stack.pop()), math.S256(stack.pop())\n\tres := interpreter.intPool.getZero()\n\n\tif y.Sign() == 0 || x.Sign() == 0 {\n\t\tstack.push(res)\n\t} else {\n\t\tif x.Sign() != y.Sign() {\n\t\t\tres.Div(x.Abs(x), y.Abs(y))\n\t\t\tres.Neg(res)\n\t\t} else {\n\t\t\tres.Div(x.Abs(x), y.Abs(y))\n\t\t}\n\t\tstack.push(math.U256(res))\n\t}\n\tinterpreter.intPool.put(x, y)\n\treturn nil, nil\n}\n\nfunc opMod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.pop()\n\tif y.Sign() == 0 {\n\t\tstack.push(x.SetUint64(0))\n\t} else {\n\t\tstack.push(math.U256(x.Mod(x, y)))\n\t}\n\tinterpreter.intPool.put(y)\n\treturn nil, nil\n}\n\nfunc opSmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := math.S256(stack.pop()), math.S256(stack.pop())\n\tres := interpreter.intPool.getZero()\n\n\tif y.Sign() == 0 {\n\t\tstack.push(res)\n\t} else {\n\t\tif x.Sign() < 0 {\n\t\t\tres.Mod(x.Abs(x), y.Abs(y))\n\t\t\tres.Neg(res)\n\t\t} else {\n\t\t\tres.Mod(x.Abs(x), y.Abs(y))\n\t\t}\n\t\tstack.push(math.U256(res))\n\t}\n\tinterpreter.intPool.put(x, y)\n\treturn nil, nil\n}\n\nfunc opExp(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tbase, exponent := stack.pop(), stack.pop()\n\tstack.push(math.Exp(base, exponent))\n\n\tinterpreter.intPool.put(base, exponent)\n\n\treturn nil, nil\n}\n\nfunc opSignExtend(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tback := stack.pop()\n\tif back.Cmp(big.NewInt(31)) < 0 {\n\t\tbit := uint(back.Uint64()*8 + 7)\n\t\tnum := stack.pop()\n\t\tmask := back.Lsh(common.Big1, bit)\n\t\tmask.Sub(mask, common.Big1)\n\t\tif num.Bit(int(bit)) > 0 {\n\t\t\tnum.Or(num, mask.Not(mask))\n\t\t} else {\n\t\t\tnum.And(num, mask)\n\t\t}\n\n\t\tstack.push(math.U256(num))\n\t}\n\n\tinterpreter.intPool.put(back)\n\treturn nil, nil\n}\n\nfunc opNot(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx := stack.peek()\n\tmath.U256(x.Not(x))\n\treturn nil, nil\n}\n\nfunc opLt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\tif x.Cmp(y) < 0 {\n\t\ty.SetUint64(1)\n\t} else {\n\t\ty.SetUint64(0)\n\t}\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opGt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\tif x.Cmp(y) > 0 {\n\t\ty.SetUint64(1)\n\t} else {\n\t\ty.SetUint64(0)\n\t}\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opSlt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\n\txSign := x.Cmp(tt255)\n\tySign := y.Cmp(tt255)\n\n\tswitch {\n\tcase xSign >= 0 && ySign < 0:\n\t\ty.SetUint64(1)\n\n\tcase xSign < 0 && ySign >= 0:\n\t\ty.SetUint64(0)\n\n\tdefault:\n\t\tif x.Cmp(y) < 0 {\n\t\t\ty.SetUint64(1)\n\t\t} else {\n\t\t\ty.SetUint64(0)\n\t\t}\n\t}\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opSgt(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\n\txSign := x.Cmp(tt255)\n\tySign := y.Cmp(tt255)\n\n\tswitch {\n\tcase xSign >= 0 && ySign < 0:\n\t\ty.SetUint64(0)\n\n\tcase xSign < 0 && ySign >= 0:\n\t\ty.SetUint64(1)\n\n\tdefault:\n\t\tif x.Cmp(y) > 0 {\n\t\t\ty.SetUint64(1)\n\t\t} else {\n\t\t\ty.SetUint64(0)\n\t\t}\n\t}\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opEq(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\tif x.Cmp(y) == 0 {\n\t\ty.SetUint64(1)\n\t} else {\n\t\ty.SetUint64(0)\n\t}\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opIszero(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx := stack.peek()\n\tif x.Sign() > 0 {\n\t\tx.SetUint64(0)\n\t} else {\n\t\tx.SetUint64(1)\n\t}\n\treturn nil, nil\n}\n\nfunc opAnd(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.pop()\n\tstack.push(x.And(x, y))\n\n\tinterpreter.intPool.put(y)\n\treturn nil, nil\n}\n\nfunc opOr(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\ty.Or(x, y)\n\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opXor(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y := stack.pop(), stack.peek()\n\ty.Xor(x, y)\n\n\tinterpreter.intPool.put(x)\n\treturn nil, nil\n}\n\nfunc opByte(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tth, val := stack.pop(), stack.peek()\n\tif th.Cmp(common.Big32) < 0 {\n\t\tb := math.Byte(val, 32, int(th.Int64()))\n\t\tval.SetUint64(uint64(b))\n\t} else {\n\t\tval.SetUint64(0)\n\t}\n\tinterpreter.intPool.put(th)\n\treturn nil, nil\n}\n\nfunc opAddmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y, z := stack.pop(), stack.pop(), stack.pop()\n\tif z.Cmp(bigZero) > 0 {\n\t\tx.Add(x, y)\n\t\tx.Mod(x, z)\n\t\tstack.push(math.U256(x))\n\t} else {\n\t\tstack.push(x.SetUint64(0))\n\t}\n\tinterpreter.intPool.put(y, z)\n\treturn nil, nil\n}\n\nfunc opMulmod(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tx, y, z := stack.pop(), stack.pop(), stack.pop()\n\tif z.Cmp(bigZero) > 0 {\n\t\tx.Mul(x, y)\n\t\tx.Mod(x, z)\n\t\tstack.push(math.U256(x))\n\t} else {\n\t\tstack.push(x.SetUint64(0))\n\t}\n\tinterpreter.intPool.put(y, z)\n\treturn nil, nil\n}\n\n// opSHL implements Shift Left\n// The SHL instruction (shift left) pops 2 values from the stack, first arg1 and then arg2,\n// and pushes on the stack arg2 shifted to the left by arg1 number of bits.\nfunc opSHL(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards\n\tshift, value := math.U256(stack.pop()), math.U256(stack.peek())\n\tdefer interpreter.intPool.put(shift) // First operand back into the pool\n\n\tif shift.Cmp(common.Big256) >= 0 {\n\t\tvalue.SetUint64(0)\n\t\treturn nil, nil\n\t}\n\tn := uint(shift.Uint64())\n\tmath.U256(value.Lsh(value, n))\n\n\treturn nil, nil\n}\n\n// opSHR implements Logical Shift Right\n// The SHR instruction (logical shift right) pops 2 values from the stack, first arg1 and then arg2,\n// and pushes on the stack arg2 shifted to the right by arg1 number of bits with zero fill.\nfunc opSHR(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards\n\tshift, value := math.U256(stack.pop()), math.U256(stack.peek())\n\tdefer interpreter.intPool.put(shift) // First operand back into the pool\n\n\tif shift.Cmp(common.Big256) >= 0 {\n\t\tvalue.SetUint64(0)\n\t\treturn nil, nil\n\t}\n\tn := uint(shift.Uint64())\n\tmath.U256(value.Rsh(value, n))\n\n\treturn nil, nil\n}\n\n// opSAR implements Arithmetic Shift Right\n// The SAR instruction (arithmetic shift right) pops 2 values from the stack, first arg1 and then arg2,\n// and pushes on the stack arg2 shifted to the right by arg1 number of bits with sign extension.\nfunc opSAR(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// Note, S256 returns (potentially) a new bigint, so we're popping, not peeking this one\n\tshift, value := math.U256(stack.pop()), math.S256(stack.pop())\n\tdefer interpreter.intPool.put(shift) // First operand back into the pool\n\n\tif shift.Cmp(common.Big256) >= 0 {\n\t\tif value.Sign() > 0 {\n\t\t\tvalue.SetUint64(0)\n\t\t} else {\n\t\t\tvalue.SetInt64(-1)\n\t\t}\n\t\tstack.push(math.U256(value))\n\t\treturn nil, nil\n\t}\n\tn := uint(shift.Uint64())\n\tvalue.Rsh(value, n)\n\tstack.push(math.U256(value))\n\n\treturn nil, nil\n}\n\nfunc opSha3(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\toffset, size := stack.pop(), stack.pop()\n\tdata := memory.Get(offset.Int64(), size.Int64())\n\thash := crypto.Keccak256(data)\n\tevm := interpreter.evm\n\n\tif evm.vmConfig.EnablePreimageRecording {\n\t\tevm.StateDB.AddPreimage(common.BytesToHash(hash), data)\n\t}\n\tstack.push(interpreter.intPool.get().SetBytes(hash))\n\n\tinterpreter.intPool.put(offset, size)\n\treturn nil, nil\n}\n\nfunc opAddress(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(contract.Address().ToCaddr().Big())\n\treturn nil, nil\n}\n\nfunc opBalance(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tslot := stack.peek()\n\tslot.Set(new(big.Int))\n\treturn nil, nil\n}\n\nfunc opOrigin(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.evm.Origin.ToCaddr().Big())\n\treturn nil, nil\n}\n\nfunc opCaller(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(contract.Caller().ToCaddr().Big())\n\treturn nil, nil\n}\n\nfunc opCallValue(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().Set(contract.Value()))\n\n\treturn nil, nil\n}\n\nfunc opCallDataLoad(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().SetBytes(getDataBig(contract.Input, stack.pop(), big32)))\n\treturn nil, nil\n}\n\nfunc opCallDataSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().SetInt64(int64(len(contract.Input))))\n\treturn nil, nil\n}\n\nfunc opCallDataCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tvar (\n\t\tmemOffset  = stack.pop()\n\t\tdataOffset = stack.pop()\n\t\tlength     = stack.pop()\n\t)\n\tmemory.Set(memOffset.Uint64(), length.Uint64(), getDataBig(contract.Input, dataOffset, length))\n\n\tinterpreter.intPool.put(memOffset, dataOffset, length)\n\treturn nil, nil\n}\n\nfunc opReturnDataSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().SetUint64(uint64(len(interpreter.returnData))))\n\treturn nil, nil\n}\n\nfunc opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tvar (\n\t\tmemOffset  = stack.pop()\n\t\tdataOffset = stack.pop()\n\t\tlength     = stack.pop()\n\n\t\tend = interpreter.intPool.get().Add(dataOffset, length)\n\t)\n\tdefer interpreter.intPool.put(memOffset, dataOffset, length, end)\n\n\tif end.BitLen() > 64 || uint64(len(interpreter.returnData)) < end.Uint64() {\n\t\treturn nil, errReturnDataOutOfBounds\n\t}\n\tmemory.Set(memOffset.Uint64(), length.Uint64(), interpreter.returnData[dataOffset.Uint64():end.Uint64()])\n\n\treturn nil, nil\n}\n\nfunc opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tslot := stack.peek()\n\taddress := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(slot))\n\tslot.SetUint64(uint64(interpreter.evm.StateDB.GetCodeSize(address)))\n\treturn nil, nil\n}\n\nfunc opCodeSize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tl := interpreter.intPool.get().SetInt64(int64(len(contract.Code)))\n\tstack.push(l)\n\n\treturn nil, nil\n}\n\nfunc opCodeCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tvar (\n\t\tmemOffset  = stack.pop()\n\t\tcodeOffset = stack.pop()\n\t\tlength     = stack.pop()\n\t)\n\tcodeCopy := getDataBig(contract.Code, codeOffset, length)\n\tmemory.Set(memOffset.Uint64(), length.Uint64(), codeCopy)\n\n\tinterpreter.intPool.put(memOffset, codeOffset, length)\n\treturn nil, nil\n}\n\nfunc opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tvar (\n\t\taddr       = common.BigToAddress(stack.pop())\n\t\tmemOffset  = stack.pop()\n\t\tcodeOffset = stack.pop()\n\t\tlength     = stack.pop()\n\t)\n\tcodeCopy := getDataBig(interpreter.evm.StateDB.GetCode(addr), codeOffset, length)\n\tmemory.Set(memOffset.Uint64(), length.Uint64(), codeCopy)\n\n\tinterpreter.intPool.put(memOffset, codeOffset, length)\n\treturn nil, nil\n}\n\n// opExtCodeHash returns the code hash of a specified account.\n// There are several cases when the function is called, while we can relay everything\n// to `state.GetCodeHash` function to ensure the correctness.\n//   (1) Caller tries to get the code hash of a normal contract account, state\n// should return the relative code hash and set it as the result.\n//\n//   (2) Caller tries to get the code hash of a non-existent account, state should\n// return common.Hash{} and zero will be set as the result.\n//\n//   (3) Caller tries to get the code hash for an account without contract code,\n// state should return emptyCodeHash(0xc5d246...) as the result.\n//\n//   (4) Caller tries to get the code hash of a precompiled account, the result\n// should be zero or emptyCodeHash.\n//\n// It is worth noting that in order to avoid unnecessary create and clean,\n// all precompile accounts on mainnet have been transferred 1 wei, so the return\n// here should be emptyCodeHash.\n// If the precompile account is not transferred any amount on a private or\n// customized chain, the return value will be zero.\n//\n//   (5) Caller tries to get the code hash for an account which is marked as suicided\n// in the current transaction, the code hash of this account should be returned.\n//\n//   (6) Caller tries to get the code hash for an account which is marked as deleted,\n// this account should be regarded as a non-existent account and zero should be returned.\nfunc opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tslot := stack.peek()\n\tslot.SetBytes(interpreter.evm.StateDB.GetCodeHash(common.BigToAddress(slot)).Bytes())\n\treturn nil, nil\n}\n\nfunc opGasprice(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().Set(interpreter.evm.GasPrice))\n\treturn nil, nil\n}\n\nfunc opBlockhash(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tnum := stack.pop()\n\n\tn := interpreter.intPool.get().Sub(interpreter.evm.BlockNumber, common.Big257)\n\tif num.Cmp(n) > 0 && num.Cmp(interpreter.evm.BlockNumber) < 0 {\n\t\tstack.push(interpreter.evm.GetHash(num.Uint64()).Big())\n\t} else {\n\t\tstack.push(interpreter.intPool.getZero())\n\t}\n\tinterpreter.intPool.put(num, n)\n\treturn nil, nil\n}\n\nfunc opCoinbase(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.evm.Coinbase.ToCaddr().Big())\n\treturn nil, nil\n}\n\nfunc opTimestamp(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(math.U256(interpreter.intPool.get().Set(interpreter.evm.Time)))\n\treturn nil, nil\n}\n\nfunc opNumber(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(math.U256(interpreter.intPool.get().Set(interpreter.evm.BlockNumber)))\n\treturn nil, nil\n}\n\nfunc opDifficulty(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(math.U256(interpreter.intPool.get().Set(interpreter.evm.Difficulty)))\n\treturn nil, nil\n}\n\nfunc opGasLimit(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(math.U256(interpreter.intPool.get().SetUint64(interpreter.evm.GasLimit)))\n\treturn nil, nil\n}\n\nfunc opPop(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tinterpreter.intPool.put(stack.pop())\n\treturn nil, nil\n}\n\nfunc opMload(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\toffset := stack.pop()\n\tval := interpreter.intPool.get().SetBytes(memory.Get(offset.Int64(), 32))\n\tstack.push(val)\n\n\tinterpreter.intPool.put(offset)\n\treturn nil, nil\n}\n\nfunc opMstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// pop value of the stack\n\tmStart, val := stack.pop(), stack.pop()\n\tmemory.Set32(mStart.Uint64(), val)\n\n\tinterpreter.intPool.put(mStart, val)\n\treturn nil, nil\n}\n\nfunc opMstore8(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\toff, val := stack.pop().Int64(), stack.pop().Int64()\n\tmemory.store[off] = byte(val & 0xff)\n\n\treturn nil, nil\n}\n\nfunc opSload(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tloc := stack.peek()\n\tval := interpreter.evm.StateDB.GetState(contract.Address(), common.BigToHash(loc))\n\tloc.SetBytes(val.Bytes())\n\treturn nil, nil\n}\n\nfunc opSstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tloc := common.BigToHash(stack.pop())\n\tval := stack.pop()\n\tinterpreter.evm.StateDB.SetState(contract.Address(), loc, common.BigToHash(val))\n\n\tinterpreter.intPool.put(val)\n\treturn nil, nil\n}\n\nfunc opJump(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tpos := stack.pop()\n\tif !contract.jumpdests.has(contract.CodeHash, contract.Code, pos) {\n\t\tnop := contract.GetOp(pos.Uint64())\n\t\treturn nil, fmt.Errorf(\"invalid jump destination (%v) %v\", nop, pos)\n\t}\n\t*pc = pos.Uint64()\n\n\tinterpreter.intPool.put(pos)\n\treturn nil, nil\n}\n\nfunc opJumpi(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tpos, cond := stack.pop(), stack.pop()\n\tif cond.Sign() != 0 {\n\t\tif !contract.jumpdests.has(contract.CodeHash, contract.Code, pos) {\n\t\t\tnop := contract.GetOp(pos.Uint64())\n\t\t\treturn nil, fmt.Errorf(\"invalid jump destination (%v) %v\", nop, pos)\n\t\t}\n\t\t*pc = pos.Uint64()\n\t} else {\n\t\t*pc++\n\t}\n\n\tinterpreter.intPool.put(pos, cond)\n\treturn nil, nil\n}\n\nfunc opJumpdest(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\treturn nil, nil\n}\n\nfunc opPc(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().SetUint64(*pc))\n\treturn nil, nil\n}\n\nfunc opMsize(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().SetInt64(int64(memory.Len())))\n\treturn nil, nil\n}\n\nfunc opGas(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\tstack.push(interpreter.intPool.get().SetUint64(contract.Gas))\n\treturn nil, nil\n}\n\nfunc opCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// Pop gas. The actual gas in in interpreter.evm.callGasTemp.\n\tinterpreter.intPool.put(stack.pop())\n\tgas := interpreter.evm.callGasTemp\n\t// Pop other call parameters.\n\taddr, value, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop()\n\ttoAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr))\n\t// TODO\n\tif toAddr == (common.Address{}) {\n\t\treturn nil, ErrToAddressError\n\t}\n\tvalue = math.U256(value)\n\t// Get the arguments from the memory.\n\targs := memory.Get(inOffset.Int64(), inSize.Int64())\n\n\tasset := contract.GetCallMsg()\n\tif asset == nil && value.Sign() != 0 {\n\t\tasset = &assets.Asset{Tkn: &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*value),\n\t\t},\n\t\t}\n\t}\n\n\tif asset != nil {\n\t\tgas += params.CallStipend\n\t}\n\n\tret, returnGas, err, alarm := interpreter.evm.Call(contract, toAddr, args, gas, asset)\n\tcontract.SetCallMsg(nil)\n\tif err != nil {\n\t\tstack.push(interpreter.intPool.getZero())\n\t} else {\n\t\tstack.push(interpreter.intPool.get().SetUint64(1))\n\t}\n\tif err == nil || err == errExecutionReverted {\n\t\tmemory.Set(retOffset.Uint64(), retSize.Uint64(), ret)\n\t}\n\tcontract.Gas += returnGas\n\n\tif alarm {\n\t\tcontract.UseGas(contract.Gas)\n\t}\n\n\tinterpreter.intPool.put(addr, value, inOffset, inSize, retOffset, retSize)\n\treturn ret, nil\n}\n\nfunc opCallCode(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// Pop gas. The actual gas is in interpreter.evm.callGasTemp.\n\tinterpreter.intPool.put(stack.pop())\n\tgas := interpreter.evm.callGasTemp\n\t// Pop other call parameters.\n\taddr, value, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop()\n\ttoAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr))\n\t// TODO\n\tif toAddr == (common.Address{}) {\n\t\treturn nil, ErrToAddressError\n\t}\n\tvalue = math.U256(value)\n\t// Get arguments from the memory.\n\targs := memory.Get(inOffset.Int64(), inSize.Int64())\n\n\tasset := contract.GetCallMsg()\n\tif asset == nil && value.Sign() != 0 {\n\t\tasset = &assets.Asset{Tkn: &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*value),\n\t\t},\n\t\t}\n\t}\n\n\tif asset != nil {\n\t\tgas += params.CallStipend\n\t}\n\n\tret, returnGas, err, alarm := interpreter.evm.Call(contract, toAddr, args, gas, asset)\n\tcontract.SetCallMsg(nil)\n\tif err != nil {\n\t\tstack.push(interpreter.intPool.getZero())\n\t} else {\n\t\tstack.push(interpreter.intPool.get().SetUint64(1))\n\t}\n\tif err == nil || err == errExecutionReverted {\n\t\tmemory.Set(retOffset.Uint64(), retSize.Uint64(), ret)\n\t}\n\tcontract.Gas += returnGas\n\tif alarm {\n\t\tcontract.UseGas(contract.Gas)\n\t}\n\n\tinterpreter.intPool.put(addr, value, inOffset, inSize, retOffset, retSize)\n\treturn ret, nil\n}\n\nfunc opDelegateCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// Pop gas. The actual gas is in interpreter.evm.callGasTemp.\n\tinterpreter.intPool.put(stack.pop())\n\tgas := interpreter.evm.callGasTemp\n\t// Pop other call parameters.\n\taddr, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop()\n\ttoAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr))\n\t// TODO\n\tif toAddr == (common.Address{}) {\n\t\treturn nil, ErrToAddressError\n\t}\n\t// Get arguments from the memory.\n\targs := memory.Get(inOffset.Int64(), inSize.Int64())\n\n\tret, returnGas, err := interpreter.evm.DelegateCall(contract, toAddr, args, gas)\n\tif err != nil {\n\t\tstack.push(interpreter.intPool.getZero())\n\t} else {\n\t\tstack.push(interpreter.intPool.get().SetUint64(1))\n\t}\n\tif err == nil || err == errExecutionReverted {\n\t\tmemory.Set(retOffset.Uint64(), retSize.Uint64(), ret)\n\t}\n\tcontract.Gas += returnGas\n\n\tinterpreter.intPool.put(addr, inOffset, inSize, retOffset, retSize)\n\treturn ret, nil\n}\n\nfunc opStaticCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// Pop gas. The actual gas is in interpreter.evm.callGasTemp.\n\tinterpreter.intPool.put(stack.pop())\n\tgas := interpreter.evm.callGasTemp\n\t// Pop other call parameters.\n\taddr, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop()\n\ttoAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(addr))\n\t// TODO\n\tif toAddr == (common.Address{}) {\n\t\treturn nil, ErrToAddressError\n\t}\n\t// Get arguments from the memory.\n\targs := memory.Get(inOffset.Int64(), inSize.Int64())\n\n\tret, returnGas, err := interpreter.evm.StaticCall(contract, toAddr, args, gas)\n\tif err != nil {\n\t\tstack.push(interpreter.intPool.getZero())\n\t} else {\n\t\tstack.push(interpreter.intPool.get().SetUint64(1))\n\t}\n\tif err == nil || err == errExecutionReverted {\n\t\tmemory.Set(retOffset.Uint64(), retSize.Uint64(), ret)\n\t}\n\tcontract.Gas += returnGas\n\n\tinterpreter.intPool.put(addr, inOffset, inSize, retOffset, retSize)\n\treturn ret, nil\n}\n\nfunc opReturn(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\toffset, size := stack.pop(), stack.pop()\n\tret := memory.GetPtr(offset.Int64(), size.Int64())\n\n\tinterpreter.intPool.put(offset, size)\n\treturn ret, nil\n}\n\nfunc opRevert(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\toffset, size := stack.pop(), stack.pop()\n\tret := memory.GetPtr(offset.Int64(), size.Int64())\n\n\tinterpreter.intPool.put(offset, size)\n\treturn ret, nil\n}\n\nfunc opStop(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\treturn nil, nil\n}\n\nfunc opSuicide(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t// toAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BigToContractAddress(stack.pop()))\n\t// interpreter.evm.StateDB.Suicide(contract.Address(), toAddr)\n\treturn nil, nil\n}\n\nfunc handleAllotTicket(d []byte, evm *EVM, contract *Contract, mem []byte) (common.Hash, uint64, error, bool) {\n\toffset := new(big.Int).SetBytes(d[64:96]).Uint64()\n\tlen := new(big.Int).SetBytes(mem[offset : offset+32]).Uint64()\n\tif len == 0 {\n\t\treturn common.Hash{}, 0, fmt.Errorf(\"allotTicket error , contract : %s, error : %s\", contract.Address(), \"nameLen is zero\"), false\n\t}\n\n\tcategoryName := string(mem[offset+32 : offset+32+len])\n\tmatch, err := regexp.Match(\"^[A-Z][A-Z0-9_]{0,31}$\", []byte(categoryName))\n\tif err != nil || !match {\n\t\treturn common.Hash{}, 0, fmt.Errorf(\"allotTicket error , contract : %s, error : %s\", contract.Address(), \"illegal categoryName\"), false\n\t}\n\n\tcategoryName = strings.ToUpper(categoryName)\n\tif strings.Contains(categoryName, \"SERO\") {\n\t\treturn common.Hash{}, 0, fmt.Errorf(\"allotTicket error , contract : %s, error : %s\", contract.Address(), \"categoryName can not contains SERO\"), false\n\t}\n\n\tgas := evm.callGasTemp\n\n\tvalue := common.BytesToHash(d[0:32])\n\tif value == (common.Hash{}) {\n\t\tif !evm.StateDB.RegisterTicket(contract.Address(), categoryName) {\n\t\t\treturn common.Hash{}, 0, fmt.Errorf(\"allotTicket error , contract : %s, error : %s\", contract.Address(), \"categoryName registered by other\"), false\n\t\t}\n\n\t\tif gas >= params.CreateTicketGas {\n\t\t\tgas -= params.CreateTicketGas\n\t\t} else {\n\t\t\treturn common.Hash{}, 0, fmt.Errorf(\"allotTicket error , contract : %s, error : %s\", contract.Address(), \"out of gas\"), false\n\t\t}\n\n\t\tnonce := evm.StateDB.GetTicketNonce(contract.Address())\n\t\tevm.StateDB.SetTicketNonce(contract.Address(), nonce+1)\n\t\tbytes, _ := rlp.EncodeToBytes([]interface{}{contract.Address(), categoryName, nonce})\n\t\tvalue = crypto.Keccak256Hash(bytes)\n\n\t\tif e := c_superzk.IsTktValid(common.BytesToHash(common.LeftPadBytes([]byte(categoryName), 32)).HashToUint256(), value.HashToUint256()); e != nil {\n\t\t\treturn common.Hash{}, 0, fmt.Errorf(\"allotTicket error , contract : %s, error : %s\", contract.Address(), \"categoryName has no base\"), false\n\t\t}\n\n\t\tevm.StateDB.AddTicket(contract.Address(), categoryName, value)\n\t}\n\n\ttoAddr := evm.StateDB.GetNonceAddress(d[44:64])\n\talarm := false\n\tif toAddr != (common.Address{}) && toAddr != contract.Address() {\n\t\tasset := assets.Asset{\n\t\t\tTkt: &assets.Ticket{\n\t\t\t\tCategory: *common.BytesToHash(common.LeftPadBytes([]byte(categoryName), 32)).HashToUint256(),\n\t\t\t\tValue:    *value.HashToUint256(),\n\t\t\t},\n\t\t}\n\n\t\tgas += params.CallStipend\n\t\t_, returnGas, err, _alarm := evm.Call(contract, toAddr, nil, gas, &asset)\n\t\talarm = _alarm\n\t\t// contract.Gas += returnGas\n\t\tif err != nil {\n\t\t\treturn common.Hash{}, returnGas, err, alarm\n\t\t} else {\n\t\t\treturn value, returnGas, nil, alarm\n\t\t}\n\t}\n\n\treturn value, gas, nil, alarm\n}\n\nvar (\n\tbase   = new(big.Int).SetUint64(1e+17)\n\tlevel1 = new(big.Int).Mul(big.NewInt(10000000), base)\n\tlevel2 = new(big.Int).Mul(big.NewInt(5000000), base)\n\tlevel3 = new(big.Int).Mul(big.NewInt(100000), base)\n\tlevel4 = new(big.Int).Mul(big.NewInt(10000), base)\n\tlevel5 = new(big.Int).Mul(big.NewInt(100), base)\n\tlevel6 = new(big.Int).Mul(big.NewInt(10), base)\n\tlevel7 = new(big.Int).Mul(big.NewInt(1), base)\n)\n\nfunc tokenFee(coinName string) *big.Int {\n\tswitch len(coinName) {\n\tcase 1:\n\t\treturn level1\n\tcase 2:\n\t\treturn level2\n\tcase 3:\n\t\treturn level3\n\tcase 4:\n\t\treturn level4\n\tcase 5:\n\t\treturn level5\n\tcase 6:\n\t\treturn level6\n\t}\n\treturn level7\n}\n\nvar foundationAccount1 = common.Base58ToAddress(\"hcZCikh7h3By7FBoDhCj8a6swKukeZRKm5Xg1s9RStPTNV7GzE3rJDzJsDwCWy9p86A8amMdCHgF7jKaMfSt1zfaBEbqkapuveHyFko2V9ZKisMC5qMp4VacYnApXokr4ea\")\n\nvar foundationAccount2 = common.Base58ToAddress(\"5niHmAcSoDzaekKTUpLR3qkQf6djC7AGhnJnuPr8w7ArqQzhxyhEf61Rp68WhpoYo57r5q8CVsLopTJ9uc5VS92fRSHsjBqY9rqMJfQ4DBMw5QyXvT4oyeF7P9sb7ruvwZD\")\n\nfunc handleIssueToken(d []byte, evm *EVM, contract *Contract, mem []byte) (bool, error) {\n\toffset := new(big.Int).SetBytes(d[0:32]).Uint64()\n\tlen := new(big.Int).SetBytes(mem[offset : offset+32]).Uint64()\n\tif len == 0 {\n\t\treturn false, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"nameLen is zero\")\n\t}\n\n\tcoinName := string(mem[offset+32 : offset+32+len])\n\tmatch, err := regexp.Match(\"^[A-Z][A-Z0-9_]{0,31}$\", []byte(coinName))\n\tif err != nil || !match {\n\t\treturn false, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"illegal coinName\")\n\t}\n\n\tcoinName = strings.ToUpper(coinName)\n\tif strings.Contains(coinName, \"SERO\") {\n\t\treturn false, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"coinName can not contains SERO\")\n\t}\n\taddress := evm.StateDB.GetContrctAddressByToken(coinName)\n\tif address == (common.Address{}) {\n\t\tfee := new(big.Int).Set(level6)\n\t\tif evm.chainConfig.ChainID.Uint64() == 2019 {\n\t\t\tfee = tokenFee(coinName)\n\t\t}\n\t\tif evm.StateDB.GetBalance(contract.Address(), \"SERO\").Cmp(fee) >= 0 {\n\t\t\tif !evm.StateDB.RegisterToken(contract.Address(), coinName) {\n\t\t\t\treturn false, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"coinName registered by other\")\n\t\t\t} else {\n\t\t\t\tevm.StateDB.SubBalance(contract.Address(), \"SERO\", fee)\n\t\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\t\tValue:    utils.U256(*fee),\n\t\t\t\t}}\n\n\t\t\t\tif evm.BlockNumber.Uint64() >= seroparam.SIP5() {\n\t\t\t\t\tif e := c_superzk.IsTknValid(&asset.Tkn.Currency); e != nil {\n\t\t\t\t\t\treturn false, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"coinName has no base\")\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif evm.BlockNumber.Uint64() >= 300000 {\n\t\t\t\t\tevm.StateDB.NextZState().AddTxOut(foundationAccount2, asset, evm.TxHash)\n\t\t\t\t} else {\n\t\t\t\t\tevm.StateDB.NextZState().AddTxOut(foundationAccount1, asset, evm.TxHash)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn false, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"insufficient balance for token fee\")\n\t\t}\n\t} else if address != contract.Address() {\n\t\treturn false, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"coinName registered by other\")\n\t}\n\n\ttotal := new(big.Int).SetBytes(d[32:64])\n\tevm.StateDB.AddBalance(contract.Address(), coinName, total)\n\treturn true, nil\n}\n\nfunc handleSend(d []byte, evm *EVM, contract *Contract, mem []byte) ([]byte, uint64, error, bool) {\n\taddr := common.BytesToContractAddress(d[12:32])\n\ttoAddr := evm.StateDB.GetNonceAddress(addr[:])\n\tif toAddr == (common.Address{}) {\n\t\treturn nil, 0, fmt.Errorf(\"handleSend error , contract : %s, toAddr : %s, error : %s\", contract.Address(), toAddr, \"not load toAddrss\"), false\n\t}\n\tcurrency_offset := new(big.Int).SetBytes(d[32:64]).Uint64()\n\tlength := new(big.Int).SetBytes(mem[currency_offset : currency_offset+32]).Uint64()\n\tvar currency string\n\tif length != 0 {\n\t\tcurrency = string(mem[currency_offset+32 : currency_offset+32+length])\n\t}\n\n\tvar category string\n\tcategory_offset := new(big.Int).SetBytes(d[96:128]).Uint64()\n\tlength = new(big.Int).SetBytes(mem[category_offset : category_offset+32]).Uint64()\n\tif length != 0 {\n\t\tcategory = string(mem[category_offset+32 : category_offset+32+length])\n\t}\n\n\tcurrency = strings.ToUpper(currency)\n\tcategory = strings.ToUpper(category)\n\n\tamount := new(big.Int).SetBytes(d[64:96])\n\tticketHash := common.BytesToHash(d[128:160])\n\n\tvar token *assets.Token\n\tif len(currency) != 0 && amount.Sign() != 0 {\n\t\tbalance := evm.StateDB.GetBalance(contract.Address(), currency)\n\t\tif balance.Cmp(amount) < 0 {\n\t\t\treturn nil, 0, fmt.Errorf(\"handleSend error , contract : %s, toAddr : %s, error : %s\", contract.Address(), toAddr, \"balance not enough\"), false\n\t\t}\n\t\ttoken = &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*amount),\n\t\t}\n\t}\n\n\tvar ticket *assets.Ticket\n\tif len(category) != 0 && ticketHash != (common.Hash{}) {\n\t\tif !evm.StateDB.OwnTicket(contract.Address(), category, ticketHash) {\n\t\t\treturn nil, 0, fmt.Errorf(\"handleSend error , contract : %s, toAddr : %s, error : %s\", contract.Address(), toAddr, \"ticket not own\"), false\n\t\t}\n\t\tticket = &assets.Ticket{\n\t\t\tCategory: *common.BytesToHash(common.LeftPadBytes([]byte(category), 32)).HashToUint256(),\n\t\t\tValue:    *ticketHash.HashToUint256(),\n\t\t}\n\t}\n\n\tasset := assets.Asset{Tkn: token, Tkt: ticket}\n\tgas := evm.callGasTemp + params.CallStipend\n\treturn evm.Call(contract, toAddr, nil, gas, &asset)\n}\n\nvar (\n\tmemLens = map[common.Hash]int{\n\t\ttopic_issueToken:    64,\n\t\ttopic_send:          160,\n\t\ttopic_balanceOf:     32,\n\t\ttopic_allotTicket:   96,\n\t\ttopic_currency:      32,\n\t\ttopic_category:      32,\n\t\ttopic_ticket:        32,\n\t\ttopic_setCallValues: 128,\n\t\ttopic_setTokenRate:  96,\n\t\ttopic_closePkg:      256,\n\t\ttopic_transferPkg:   64,\n\t}\n)\n\nfunc makeLog(size int) executionFunc {\n\treturn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t\ttopics := make([]common.Hash, size)\n\t\tmStart, mSize := stack.pop(), stack.pop()\n\t\tfor i := 0; i < size; i++ {\n\t\t\ttopics[i] = common.BigToHash(stack.pop())\n\t\t}\n\t\t//data := memory.Get(0, int64(memory.Len()))\n\t\tdata:=memory.GetPtr(0,int64(memory.Len()))\n\n\t\td := memory.Get(mStart.Int64(), mSize.Int64())\n\n\t\tif (topics[0] == topic_update)&&(interpreter.evm.BlockNumber.Uint64()>=seroparam.SIP10()) {\n\t\t\tif len(d)<=32 {\n\t\t\t\treturn nil, fmt.Errorf(\"contract update error: size(%d) < 32\", len(d))\n\t\t\t}\n\t\t\tsize := new(big.Int).SetBytes(d[0:32]).Int64();\n\t\t\tif size+32!=int64(len(d)) {\n\t\t\t\treturn nil, fmt.Errorf(\"contract update error: param-lenght(%d) size(%d)\", len(d),size)\n\t\t\t}\n\t\t\tcode:=d[32:]\n\t\t\tinterpreter.evm.StateDB.SetCode(*contract.CodeAddr,code)\n\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t} else {\n\t\t\tlength := mSize.Uint64()\n\t\t\tif l, ok := memLens[topics[0]]; ok {\n\t\t\t\tif l != len(d) {\n\t\t\t\t\treturn d, ErrCodeInvalid\n\t\t\t\t}\n\t\t\t}\n\t\t\tif topics[0] == topic_allotTicket {\n\t\t\t\thash, returnGas, err, alarm := handleAllotTicket(d, interpreter.evm, contract, data)\n\t\t\t\tcontract.Gas += returnGas\n\t\t\t\tif alarm {\n\t\t\t\t\tcontract.UseGas(contract.Gas)\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Trace(\"IssueToken error \", \"contract\", contract.Address(), \"error\", err)\n\t\t\t\t}\n\t\t\t\t// hash := common.Hash{}\n\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hash[:])\n\t\t\t} else if topics[0] == topic_issueToken {\n\t\t\t\tif ok, err := handleIssueToken(d, interpreter.evm, contract, data); ok {\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashTrue)\n\t\t\t\t} else {\n\t\t\t\t\tlog.Trace(\"IssueToken error \", \"contract\", contract.Address(), \"error\", err)\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashFalse)\n\t\t\t\t}\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_balanceOf {\n\t\t\t\toffset := new(big.Int).SetBytes(d[0:32]).Uint64()\n\t\t\t\tlen := new(big.Int).SetBytes(data[offset : offset+32]).Uint64()\n\t\t\t\tbalance := new(big.Int)\n\t\t\t\tif len != 0 {\n\t\t\t\t\tcoinName := string(data[offset+32 : offset+32+len])\n\t\t\t\t\tbalance = interpreter.evm.StateDB.GetBalance(contract.Address(), coinName)\n\t\t\t\t}\n\t\t\t\tmemory.Set(mStart.Uint64(), 32, common.LeftPadBytes(balance.Bytes(), 32))\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_send {\n\t\t\t\t_, returnGas, err, alarm := handleSend(d, interpreter.evm, contract, data)\n\t\t\t\tcontract.Gas += returnGas\n\t\t\t\tif alarm {\n\t\t\t\t\tcontract.UseGas(contract.Gas)\n\t\t\t\t}\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Trace(\"send error \", \"contract\", contract.Address(), \"error\", err)\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashFalse)\n\t\t\t\t} else {\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashTrue)\n\t\t\t\t}\n\t\t\t} else if topics[0] == topic_currency {\n\t\t\t\tif contract.asset != nil && contract.asset.Tkn != nil {\n\t\t\t\t\tcurrency := strings.Trim(string(contract.asset.Tkn.Currency[:]), string([]byte{0}))\n\t\t\t\t\tmemory.Set(mStart.Uint64(), 32, []byte(currency))\n\t\t\t\t} else {\n\t\t\t\t\tmemory.Set(mStart.Uint64(), 32, []byte{})\n\t\t\t\t}\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_category {\n\t\t\t\tif contract.asset != nil && contract.asset.Tkt != nil {\n\t\t\t\t\tcategory := strings.Trim(string(contract.asset.Tkt.Category[:]), string([]byte{0}))\n\t\t\t\t\tmemory.Set(mStart.Uint64(), 32, []byte(category))\n\t\t\t\t} else {\n\t\t\t\t\tmemory.Set(mStart.Uint64(), 32, []byte{})\n\t\t\t\t}\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_ticket {\n\t\t\t\tif contract.asset != nil && contract.asset.Tkt != nil {\n\t\t\t\t\tmemory.Set(mStart.Uint64(), 32, contract.asset.Tkt.Value[:])\n\t\t\t\t} else {\n\t\t\t\t\tmemory.Set(mStart.Uint64(), 32, []byte{})\n\t\t\t\t}\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_setCallValues {\n\t\t\t\tsetCallValues(d, data, contract)\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_txHash {\n\t\t\t\tmemory.Set(mStart.Uint64(), 32, interpreter.evm.TxHash.Bytes())\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_setTokenRate {\n\t\t\t\toffset := new(big.Int).SetBytes(d[0:32]).Uint64()\n\t\t\t\tlen := new(big.Int).SetBytes(data[offset : offset+32]).Uint64()\n\t\t\t\tif len == 0 {\n\t\t\t\t\treturn nil, fmt.Errorf(\"setTokenRate error , contract : %s, error : %s\", contract.Address(), \"coinName len=0\")\n\t\t\t\t}\n\n\t\t\t\tcoinName := string(data[offset+32 : offset+32+len])\n\t\t\t\tmatch, err := regexp.Match(\"^[A-Z][A-Z0-9_]{0,31}$\", []byte(coinName))\n\t\t\t\tif err != nil || !match {\n\t\t\t\t\treturn nil, fmt.Errorf(\"issueToken error , contract : %s, error : %s\", contract.Address(), \"illegal coinName\")\n\t\t\t\t}\n\n\t\t\t\tif interpreter.evm.StateDB.SetTokenRate(contract.Address(), coinName, new(big.Int).SetBytes(d[32:64]), new(big.Int).SetBytes(d[64:96])) {\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashTrue)\n\t\t\t\t} else {\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashFalse)\n\t\t\t\t}\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_closePkg {\n\t\t\t\tid := c_type.Uint256{}\n\t\t\t\tcopy(id[:], d[0:32])\n\n\t\t\t\tkey := c_type.Uint256{}\n\t\t\t\tcopy(key[:], d[32:64])\n\t\t\t\tpkg, err := interpreter.evm.StateDB.NextZState().Pkgs.Close(&id, contract.Address().ToPKr(), &key)\n\t\t\t\tif err != nil {\n\t\t\t\t\tmemory.Set(mStart.Uint64(), 256, make([]byte, 256))\n\t\t\t\t} else {\n\t\t\t\t\tif pkg.O.Asset.Tkn != nil {\n\t\t\t\t\t\tcurrency := common.BytesToString(pkg.O.Asset.Tkn.Currency[:])\n\t\t\t\t\t\tamount := pkg.O.Asset.Tkn.Value.ToIntRef()\n\t\t\t\t\t\tif len(currency) != 0 && amount.Sign() > 0 {\n\t\t\t\t\t\t\tinterpreter.evm.StateDB.AddBalance(contract.Address(), currency, amount)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmemory.Set(mStart.Uint64(), 32, pkg.O.Asset.Tkn.Currency[:])\n\t\t\t\t\t\thash := common.BigToHash(pkg.O.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\t\tmemory.Set(mStart.Uint64()+32, 32, hash[:])\n\t\t\t\t\t}\n\n\t\t\t\t\tif pkg.O.Asset.Tkt != nil {\n\t\t\t\t\t\tcategory := common.BytesToString(pkg.O.Asset.Tkt.Category[:])\n\t\t\t\t\t\tticket := common.BytesToHash(pkg.O.Asset.Tkt.Value[:])\n\t\t\t\t\t\tif len(category) != 0 && ticket != (common.Hash{}) {\n\t\t\t\t\t\t\tinterpreter.evm.StateDB.AddTicket(contract.Address(), category, ticket)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmemory.Set(mStart.Uint64()+64, 32, pkg.O.Asset.Tkt.Category[:])\n\t\t\t\t\t\tmemory.Set(mStart.Uint64()+96, 32, pkg.O.Asset.Tkt.Value[:])\n\t\t\t\t\t}\n\t\t\t\t\tfrom := common.BytesToAddress(pkg.Z.From[:]).ToCaddr()\n\t\t\t\t\tmemory.Set(mStart.Uint64()+128, 32, common.LeftPadBytes(from[:], 32))\n\t\t\t\t\tmemory.Set(mStart.Uint64()+160, 32, common.LeftPadBytes(big.NewInt(0).SetUint64(pkg.Z.High).Bytes(), 32))\n\t\t\t\t\tif len(pkg.O.Memo) > 0 {\n\t\t\t\t\t\tmemory.Set(mStart.Uint64()+192, 32, pkg.O.Memo[0:32])\n\t\t\t\t\t\tmemory.Set(mStart.Uint64()+224, 32, pkg.O.Memo[32:64])\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else if topics[0] == topic_transferPkg {\n\t\t\t\tid := c_type.Uint256{}\n\t\t\t\tcopy(id[:], d[0:32])\n\n\t\t\t\ttoAddr := contract.GetNonceAddress(interpreter.evm.StateDB, common.BytesToContractAddress(d[32:64]))\n\t\t\t\tif toAddr == (common.Address{}) {\n\t\t\t\t\treturn nil, ErrToAddressError\n\t\t\t\t}\n\t\t\t\tif err := interpreter.evm.StateDB.NextZState().Pkgs.Transfer(&id, contract.Address().ToPKr(), toAddr.ToPKr()); err != nil {\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashFalse)\n\t\t\t\t} else {\n\t\t\t\t\tmemory.Set(mStart.Uint64()+length-32, 32, hashTrue)\n\t\t\t\t}\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t} else {\n\t\t\t\tinterpreter.evm.StateDB.AddLog(&types.Log{\n\t\t\t\t\tAddress: contract.Address(),\n\t\t\t\t\tTopics:  topics,\n\t\t\t\t\tData:    d,\n\t\t\t\t\t// This is a non-consensus field, but assigned here because\n\t\t\t\t\t// core/state doesn't know the current block number.\n\t\t\t\t\tBlockNumber: interpreter.evm.BlockNumber.Uint64(),\n\t\t\t\t})\n\t\t\t\tcontract.Gas += interpreter.evm.callGasTemp\n\t\t\t}\n\t\t}\n\t\tinterpreter.intPool.put(mStart, mSize)\n\t\treturn nil, nil\n\t}\n}\n\nfunc setCallValues(d []byte, data []byte, contract *Contract) {\n\tcurrency_offset := new(big.Int).SetBytes(d[0:32]).Uint64()\n\tlength := new(big.Int).SetBytes(data[currency_offset : currency_offset+32]).Uint64()\n\tvar currency string\n\tif length != 0 {\n\t\tcurrency = string(data[currency_offset+32 : currency_offset+32+length])\n\t}\n\tvar category string\n\tcategory_offset := new(big.Int).SetBytes(d[64:96]).Uint64()\n\tlength = new(big.Int).SetBytes(data[category_offset : category_offset+32]).Uint64()\n\tif length != 0 {\n\t\tcategory = string(data[category_offset+32 : category_offset+32+length])\n\t}\n\tcurrency = strings.ToUpper(currency)\n\tcategory = strings.ToUpper(category)\n\tamount := new(big.Int).SetBytes(d[32:64])\n\tticketHash := common.BytesToHash(d[96:128])\n\tvar token *assets.Token\n\tif len(currency) != 0 && amount.Sign() != 0 {\n\t\ttoken = &assets.Token{\n\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(),\n\t\t\tValue:    utils.U256(*amount),\n\t\t}\n\t}\n\tvar ticket *assets.Ticket\n\tif len(category) != 0 && ticketHash != (common.Hash{}) {\n\t\tticket = &assets.Ticket{\n\t\t\tCategory: *common.BytesToHash(common.LeftPadBytes([]byte(category), 32)).HashToUint256(),\n\t\t\tValue:    *ticketHash.HashToUint256(),\n\t\t}\n\t}\n\tif token != nil || ticket != nil {\n\t\tcontract.SetCallMsg(&assets.Asset{Tkn: token, Tkt: ticket})\n\t}\n}\n\n// make push instruction function\nfunc makePush(size uint64, pushByteSize int) executionFunc {\n\treturn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t\tcodeLen := len(contract.Code)\n\n\t\tstartMin := codeLen\n\t\tif int(*pc+1) < startMin {\n\t\t\tstartMin = int(*pc + 1)\n\t\t}\n\n\t\tendMin := codeLen\n\t\tif startMin+pushByteSize < endMin {\n\t\t\tendMin = startMin + pushByteSize\n\t\t}\n\n\t\tinteger := interpreter.intPool.get()\n\t\tstack.push(integer.SetBytes(common.RightPadBytes(contract.Code[startMin:endMin], pushByteSize)))\n\n\t\t*pc += size\n\t\treturn nil, nil\n\t}\n}\n\n// make dup instruction function\nfunc makeDup(size int64) executionFunc {\n\treturn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t\tstack.dup(interpreter.intPool, int(size))\n\t\treturn nil, nil\n\t}\n}\n\n// make swap instruction function\nfunc makeSwap(size int64) executionFunc {\n\t// switch n + 1 otherwise n would be swapped with n\n\tsize++\n\treturn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) {\n\t\tstack.swap(int(size))\n\t\treturn nil, nil\n\t}\n}\n"
  },
  {
    "path": "core/vm/instructions_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\ntype twoOperandTest struct {\n\tx        string\n\ty        string\n\texpected string\n}\n\nfunc testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)) {\n\tvar (\n\t\tenv            = NewEVM(Context{}, nil, params.TestChainConfig, Config{})\n\t\tstack          = newstack()\n\t\tpc             = uint64(0)\n\t\tevmInterpreter = NewEVMInterpreter(env, env.vmConfig)\n\t)\n\n\tenv.interpreter = evmInterpreter\n\tevmInterpreter.intPool = poolOfIntPools.get()\n\tfor i, test := range tests {\n\t\tx := new(big.Int).SetBytes(common.Hex2Bytes(test.x))\n\t\tshift := new(big.Int).SetBytes(common.Hex2Bytes(test.y))\n\t\texpected := new(big.Int).SetBytes(common.Hex2Bytes(test.expected))\n\t\tstack.push(x)\n\t\tstack.push(shift)\n\t\topFn(&pc, evmInterpreter, nil, nil, stack)\n\t\tactual := stack.pop()\n\t\tif actual.Cmp(expected) != 0 {\n\t\t\tt.Errorf(\"Testcase %d, expected  %v, got %v\", i, expected, actual)\n\t\t}\n\t\t// Check pool usage\n\t\t// 1.pool is not allowed to contain anything on the stack\n\t\t// 2.pool is not allowed to contain the same pointers twice\n\t\tif evmInterpreter.intPool.pool.len() > 0 {\n\n\t\t\tpoolvals := make(map[*big.Int]struct{})\n\t\t\tpoolvals[actual] = struct{}{}\n\n\t\t\tfor evmInterpreter.intPool.pool.len() > 0 {\n\t\t\t\tkey := evmInterpreter.intPool.get()\n\t\t\t\tif _, exist := poolvals[key]; exist {\n\t\t\t\t\tt.Errorf(\"Testcase %d, pool contains double-entry\", i)\n\t\t\t\t}\n\t\t\t\tpoolvals[key] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n\tpoolOfIntPools.put(evmInterpreter.intPool)\n}\n\nfunc TestByteOp(t *testing.T) {\n\tvar (\n\t\tenv            = NewEVM(Context{}, nil, params.TestChainConfig, Config{})\n\t\tstack          = newstack()\n\t\tevmInterpreter = NewEVMInterpreter(env, env.vmConfig)\n\t)\n\n\tenv.interpreter = evmInterpreter\n\tevmInterpreter.intPool = poolOfIntPools.get()\n\ttests := []struct {\n\t\tv        string\n\t\tth       uint64\n\t\texpected *big.Int\n\t}{\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 0, big.NewInt(0xAB)},\n\t\t{\"ABCDEF0908070605040302010000000000000000000000000000000000000000\", 1, big.NewInt(0xCD)},\n\t\t{\"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\", 0, big.NewInt(0x00)},\n\t\t{\"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\", 1, big.NewInt(0xCD)},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 31, big.NewInt(0x30)},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000102030\", 30, big.NewInt(0x20)},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", 32, big.NewInt(0x0)},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", 0xFFFFFFFFFFFFFFFF, big.NewInt(0x0)},\n\t}\n\tpc := uint64(0)\n\tfor _, test := range tests {\n\t\tval := new(big.Int).SetBytes(common.Hex2Bytes(test.v))\n\t\tth := new(big.Int).SetUint64(test.th)\n\t\tstack.push(val)\n\t\tstack.push(th)\n\t\topByte(&pc, evmInterpreter, nil, nil, stack)\n\t\tactual := stack.pop()\n\t\tif actual.Cmp(test.expected) != 0 {\n\t\t\tt.Fatalf(\"Expected  [%v] %v:th byte to be %v, was %v.\", test.v, test.th, test.expected, actual)\n\t\t}\n\t}\n\tpoolOfIntPools.put(evmInterpreter.intPool)\n}\n\nfunc TestSHL(t *testing.T) {\n\t// Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shl-shift-left\n\ttests := []twoOperandTest{\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"00\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"01\", \"0000000000000000000000000000000000000000000000000000000000000002\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"ff\", \"8000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"0100\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"0101\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"00\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"01\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"ff\", \"8000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0100\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000000\", \"01\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"01\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\"},\n\t}\n\ttestTwoOperandOp(t, tests, opSHL)\n}\n\nfunc TestSHR(t *testing.T) {\n\t// Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shr-logical-shift-right\n\ttests := []twoOperandTest{\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"00\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"01\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"01\", \"4000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"ff\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"0100\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"0101\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"00\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"01\", \"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"ff\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0100\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000000\", \"01\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t}\n\ttestTwoOperandOp(t, tests, opSHR)\n}\n\nfunc TestSAR(t *testing.T) {\n\t// Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#sar-arithmetic-shift-right\n\ttests := []twoOperandTest{\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"00\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"01\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"01\", \"c000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"ff\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"0100\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000000\", \"0101\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"00\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"01\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"ff\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0100\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000000\", \"01\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"4000000000000000000000000000000000000000000000000000000000000000\", \"fe\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"f8\", \"000000000000000000000000000000000000000000000000000000000000007f\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"fe\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"ff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0100\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t}\n\n\ttestTwoOperandOp(t, tests, opSAR)\n}\n\nfunc TestSGT(t *testing.T) {\n\ttests := []twoOperandTest{\n\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000001\", \"8000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000001\", \"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"8000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t}\n\ttestTwoOperandOp(t, tests, opSgt)\n}\n\nfunc TestSLT(t *testing.T) {\n\ttests := []twoOperandTest{\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"0000000000000000000000000000000000000000000000000000000000000001\", \"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000001\", \"8000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"8000000000000000000000000000000000000000000000000000000000000001\", \"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", \"8000000000000000000000000000000000000000000000000000000000000001\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd\", \"0000000000000000000000000000000000000000000000000000000000000000\"},\n\t\t{\"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd\", \"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb\", \"0000000000000000000000000000000000000000000000000000000000000001\"},\n\t}\n\ttestTwoOperandOp(t, tests, opSlt)\n}\n\nfunc opBenchmark(bench *testing.B, op func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error), args ...string) {\n\tvar (\n\t\tenv            = NewEVM(Context{}, nil, params.TestChainConfig, Config{})\n\t\tstack          = newstack()\n\t\tevmInterpreter = NewEVMInterpreter(env, env.vmConfig)\n\t)\n\n\tenv.interpreter = evmInterpreter\n\tevmInterpreter.intPool = poolOfIntPools.get()\n\t// convert args\n\tbyteArgs := make([][]byte, len(args))\n\tfor i, arg := range args {\n\t\tbyteArgs[i] = common.Hex2Bytes(arg)\n\t}\n\tpc := uint64(0)\n\tbench.ResetTimer()\n\tfor i := 0; i < bench.N; i++ {\n\t\tfor _, arg := range byteArgs {\n\t\t\ta := new(big.Int).SetBytes(arg)\n\t\t\tstack.push(a)\n\t\t}\n\t\top(&pc, evmInterpreter, nil, nil, stack)\n\t\tstack.pop()\n\t}\n\tpoolOfIntPools.put(evmInterpreter.intPool)\n}\n\nfunc BenchmarkOpAdd64(b *testing.B) {\n\tx := \"ffffffff\"\n\ty := \"fd37f3e2bba2c4f\"\n\n\topBenchmark(b, opAdd, x, y)\n}\n\nfunc BenchmarkOpAdd128(b *testing.B) {\n\tx := \"ffffffffffffffff\"\n\ty := \"f5470b43c6549b016288e9a65629687\"\n\n\topBenchmark(b, opAdd, x, y)\n}\n\nfunc BenchmarkOpAdd256(b *testing.B) {\n\tx := \"0802431afcbce1fc194c9eaa417b2fb67dc75a95db0bc7ec6b1c8af11df6a1da9\"\n\ty := \"a1f5aac137876480252e5dcac62c354ec0d42b76b0642b6181ed099849ea1d57\"\n\n\topBenchmark(b, opAdd, x, y)\n}\n\nfunc BenchmarkOpSub64(b *testing.B) {\n\tx := \"51022b6317003a9d\"\n\ty := \"a20456c62e00753a\"\n\n\topBenchmark(b, opSub, x, y)\n}\n\nfunc BenchmarkOpSub128(b *testing.B) {\n\tx := \"4dde30faaacdc14d00327aac314e915d\"\n\ty := \"9bbc61f5559b829a0064f558629d22ba\"\n\n\topBenchmark(b, opSub, x, y)\n}\n\nfunc BenchmarkOpSub256(b *testing.B) {\n\tx := \"4bfcd8bb2ac462735b48a17580690283980aa2d679f091c64364594df113ea37\"\n\ty := \"97f9b1765588c4e6b69142eb00d20507301545acf3e1238c86c8b29be227d46e\"\n\n\topBenchmark(b, opSub, x, y)\n}\n\nfunc BenchmarkOpMul(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opMul, x, y)\n}\n\nfunc BenchmarkOpDiv256(b *testing.B) {\n\tx := \"ff3f9014f20db29ae04af2c2d265de17\"\n\ty := \"fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611\"\n\topBenchmark(b, opDiv, x, y)\n}\n\nfunc BenchmarkOpDiv128(b *testing.B) {\n\tx := \"fdedc7f10142ff97\"\n\ty := \"fbdfda0e2ce356173d1993d5f70a2b11\"\n\topBenchmark(b, opDiv, x, y)\n}\n\nfunc BenchmarkOpDiv64(b *testing.B) {\n\tx := \"fcb34eb3\"\n\ty := \"f97180878e839129\"\n\topBenchmark(b, opDiv, x, y)\n}\n\nfunc BenchmarkOpSdiv(b *testing.B) {\n\tx := \"ff3f9014f20db29ae04af2c2d265de17\"\n\ty := \"fe7fb0d1f59dfe9492ffbf73683fd1e870eec79504c60144cc7f5fc2bad1e611\"\n\n\topBenchmark(b, opSdiv, x, y)\n}\n\nfunc BenchmarkOpMod(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opMod, x, y)\n}\n\nfunc BenchmarkOpSmod(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opSmod, x, y)\n}\n\nfunc BenchmarkOpExp(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opExp, x, y)\n}\n\nfunc BenchmarkOpSignExtend(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opSignExtend, x, y)\n}\n\nfunc BenchmarkOpLt(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opLt, x, y)\n}\n\nfunc BenchmarkOpGt(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opGt, x, y)\n}\n\nfunc BenchmarkOpSlt(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opSlt, x, y)\n}\n\nfunc BenchmarkOpSgt(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opSgt, x, y)\n}\n\nfunc BenchmarkOpEq(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opEq, x, y)\n}\nfunc BenchmarkOpEq2(b *testing.B) {\n\tx := \"FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff\"\n\ty := \"FBCDEF090807060504030201ffffffffFBCDEF090807060504030201fffffffe\"\n\topBenchmark(b, opEq, x, y)\n}\nfunc BenchmarkOpAnd(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opAnd, x, y)\n}\n\nfunc BenchmarkOpOr(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opOr, x, y)\n}\n\nfunc BenchmarkOpXor(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opXor, x, y)\n}\n\nfunc BenchmarkOpByte(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opByte, x, y)\n}\n\nfunc BenchmarkOpAddmod(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\tz := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opAddmod, x, y, z)\n}\n\nfunc BenchmarkOpMulmod(b *testing.B) {\n\tx := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\ty := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\tz := \"ABCDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff\"\n\n\topBenchmark(b, opMulmod, x, y, z)\n}\n\nfunc BenchmarkOpSHL(b *testing.B) {\n\tx := \"FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff\"\n\ty := \"ff\"\n\n\topBenchmark(b, opSHL, x, y)\n}\nfunc BenchmarkOpSHR(b *testing.B) {\n\tx := \"FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff\"\n\ty := \"ff\"\n\n\topBenchmark(b, opSHR, x, y)\n}\nfunc BenchmarkOpSAR(b *testing.B) {\n\tx := \"FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff\"\n\ty := \"ff\"\n\n\topBenchmark(b, opSAR, x, y)\n}\nfunc BenchmarkOpIsZero(b *testing.B) {\n\tx := \"FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff\"\n\topBenchmark(b, opIszero, x)\n}\n\nfunc TestOpMstore(t *testing.T) {\n\tvar (\n\t\tenv            = NewEVM(Context{}, nil, params.TestChainConfig, Config{})\n\t\tstack          = newstack()\n\t\tmem            = NewMemory()\n\t\tevmInterpreter = NewEVMInterpreter(env, env.vmConfig)\n\t)\n\n\tenv.interpreter = evmInterpreter\n\tevmInterpreter.intPool = poolOfIntPools.get()\n\tmem.Resize(64)\n\tpc := uint64(0)\n\tv := \"abcdef00000000000000abba000000000deaf000000c0de00100000000133700\"\n\tstack.pushN(new(big.Int).SetBytes(common.Hex2Bytes(v)), big.NewInt(0))\n\topMstore(&pc, evmInterpreter, nil, mem, stack)\n\tif got := common.Bytes2Hex(mem.Get(0, 32)); got != v {\n\t\tt.Fatalf(\"Mstore fail, got %v, expected %v\", got, v)\n\t}\n\tstack.pushN(big.NewInt(0x1), big.NewInt(0))\n\topMstore(&pc, evmInterpreter, nil, mem, stack)\n\tif common.Bytes2Hex(mem.Get(0, 32)) != \"0000000000000000000000000000000000000000000000000000000000000001\" {\n\t\tt.Fatalf(\"Mstore failed to overwrite previous value\")\n\t}\n\tpoolOfIntPools.put(evmInterpreter.intPool)\n}\n\nfunc BenchmarkOpMstore(bench *testing.B) {\n\tvar (\n\t\tenv            = NewEVM(Context{}, nil, params.TestChainConfig, Config{})\n\t\tstack          = newstack()\n\t\tmem            = NewMemory()\n\t\tevmInterpreter = NewEVMInterpreter(env, env.vmConfig)\n\t)\n\n\tenv.interpreter = evmInterpreter\n\tevmInterpreter.intPool = poolOfIntPools.get()\n\tmem.Resize(64)\n\tpc := uint64(0)\n\tmemStart := big.NewInt(0)\n\tvalue := big.NewInt(0x1337)\n\n\tbench.ResetTimer()\n\tfor i := 0; i < bench.N; i++ {\n\t\tstack.pushN(value, memStart)\n\t\topMstore(&pc, evmInterpreter, nil, mem, stack)\n\t}\n\tpoolOfIntPools.put(evmInterpreter.intPool)\n}\n"
  },
  {
    "path": "core/vm/int_pool_verifier.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build VERIFY_EVM_INTEGER_POOL\n\npackage vm\n\nimport \"fmt\"\n\nconst verifyPool = true\n\nfunc verifyIntegerPool(ip *intPool) {\n\tfor i, item := range ip.pool.data {\n\t\tif item.Cmp(checkVal) != 0 {\n\t\t\tpanic(fmt.Sprintf(\"%d'th item failed aggressive pool check. Value was modified\", i))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "core/vm/int_pool_verifier_empty.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build !VERIFY_EVM_INTEGER_POOL\n\npackage vm\n\nconst verifyPool = false\n\nfunc verifyIntegerPool(ip *intPool) {}\n"
  },
  {
    "path": "core/vm/interface.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n)\n\n// StateDB is an EVM database for full state querying.\ntype StateDB interface {\n\tCreateAccount(common.Address)\n\n\tCurrentZState() *zstate.ZState\n\tNextZState() *zstate.ZState\n\n\tSubBalance(common.Address, string, *big.Int)\n\tAddBalance(common.Address, string, *big.Int)\n\tGetBalance(common.Address, string) *big.Int\n\tBalances(addr common.Address) map[string]*big.Int\n\n\tRegisterTicket(common.Address, string) bool\n\tGetContrctAddressByTicket(key string) common.Address\n\n\tSetTokenRate(common.Address, string, *big.Int, *big.Int) bool\n\tGetTokenRate(common.Address, string) (*big.Int, *big.Int)\n\tRegisterToken(common.Address, string) bool\n\tGetContrctAddressByToken(key string) common.Address\n\n\tSetTicketNonce(common.Address, uint64)\n\tGetTicketNonce(common.Address) uint64\n\tRemoveTicket(common.Address, string, common.Hash) bool\n\tAddTicket(common.Address, string, common.Hash)\n\tOwnTicket(common.Address, string, common.Hash) bool\n\n\tAddNonceAddress([]byte, common.Address)\n\tGetNonceAddress([]byte) common.Address\n\t//\n\tGetCodeHash(common.Address) common.Hash\n\tGetCode(common.Address) []byte\n\tSetCode(common.Address, []byte)\n\tGetCodeSize(common.Address) int\n\n\tIsContract(common.Address) bool\n\tAddRefund(uint64)\n\tGetRefund() uint64\n\n\tGetState(common.Address, common.Hash) common.Hash\n\tSetState(common.Address, common.Hash, common.Hash)\n\n\tSuicide(common.Address, common.Address) bool\n\tHasSuicided(common.Address) bool\n\t//\n\t// Exist reports whether the given account exists in state.\n\t// Notably this should also return true for suicided accounts.\n\tExist(common.Address) bool\n\t// Empty returns whether the given account is empty. Empty\n\t// is defined according to EIP161 (balance = nonce = code = 0).\n\tEmpty(common.Address) bool\n\n\tRevertToSnapshot(int)\n\tSnapshot() int\n\n\tAddLog(*types.Log)\n\tAddPreimage(common.Hash, []byte)\n\n\tForEachStorage(common.Address, func(common.Hash, common.Hash) bool)\n\n\tGetContrctNonce() uint64\n\tIncAndGetContrctNonce() uint64\n}\n\n// CallContext provides a basic interface for the EVM calling conventions. The EVM EVM\n// depends on this context being implemented for doing subcalls and initialising new EVM contracts.\ntype CallContext interface {\n\t// Call another contract\n\tCall(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error)\n\t// Take another's contract code and execute within our own context\n\tCallCode(env *EVM, me ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error)\n\t// Same as CallCode except sender and value is propagated from parent to child scope\n\tDelegateCall(env *EVM, me ContractRef, addr common.Address, data []byte, gas *big.Int) ([]byte, error)\n\t// Create a new contract\n\tCreate(env *EVM, me ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error)\n}\n"
  },
  {
    "path": "core/vm/interpreter.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"fmt\"\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// Config are the configuration options for the Interpreter\ntype Config struct {\n\t// Debug enabled debugging Interpreter options\n\tDebug bool\n\t// Tracer is the op code logger\n\tTracer Tracer\n\t// NoRecursion disabled Interpreter call, callcode,\n\t// delegate call and create.\n\tNoRecursion bool\n\t// Enable recording of SHA3/keccak preimages\n\tEnablePreimageRecording bool\n\t// JumpTable contains the EVM instruction table. This\n\t// may be left uninitialised and will be set to the default\n\t// table.\n\tJumpTable [256]operation\n}\n\n// Interpreter is used to run Ethereum based contracts and will utilise the\n// passed environment to query external sources for state information.\n// The Interpreter will run the byte code VM based on the passed\n// configuration.\ntype Interpreter interface {\n\t// Run loops and evaluates the contract's code with the given input data and returns\n\t// the return byte-slice and an error if one occurred.\n\tRun(contract *Contract, input []byte) ([]byte, error)\n\t// CanRun tells if the contract, passed as an argument, can be\n\t// run by the current interpreter. This is meant so that the\n\t// caller can do something like:\n\t//\n\t// ```golang\n\t// for _, interpreter := range interpreters {\n\t//   if interpreter.CanRun(contract.code) {\n\t//     interpreter.Run(contract.code, input)\n\t//   }\n\t// }\n\t// ```\n\tCanRun([]byte) bool\n\t// IsReadOnly reports if the interpreter is in read only mode.\n\tIsReadOnly() bool\n\t// SetReadOnly sets (or unsets) read only mode in the interpreter.\n\tSetReadOnly(bool)\n}\n\n// EVMInterpreter represents an EVM interpreter\ntype EVMInterpreter struct {\n\tevm      *EVM\n\tcfg      Config\n\tgasTable params.GasTable\n\tintPool  *intPool\n\n\treadOnly   bool   // Whether to throw on stateful modifications\n\treturnData []byte // Last CALL's return data for subsequent reuse\n}\n\n// NewEVMInterpreter returns a new instance of the Interpreter.\nfunc NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter {\n\t// We use the STOP instruction whether to see\n\t// the jump table was initialised. If it was not\n\t// we'll set the default jump table.\n\tif !cfg.JumpTable[STOP].valid {\n\t\tcfg.JumpTable = constantinopleInstructionSet\n\t}\n\n\treturn &EVMInterpreter{\n\t\tevm:      evm,\n\t\tcfg:      cfg,\n\t\tgasTable: evm.ChainConfig().GasTable(evm.BlockNumber),\n\t}\n}\n\nfunc (in *EVMInterpreter) enforceRestrictions(op OpCode, operation operation, stack *Stack) error {\n\tif in.evm.chainRules.IsAutumnTwilight {\n\t\tif in.readOnly {\n\t\t\t// If the interpreter is operating in readonly mode, make sure no\n\t\t\t// state-modifying operation is performed. The 3rd stack item\n\t\t\t// for a call operation is the value. Transferring value from one\n\t\t\t// account to the others means the state is modified and should also\n\t\t\t// return with an error.\n\t\t\tif operation.writes || (op == CALL && stack.Back(2).BitLen() > 0) {\n\t\t\t\treturn errWriteProtection\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// Run loops and evaluates the contract's code with the given input data and returns\n// the return byte-slice and an error if one occurred.\n//\n// It's important to note that any errors returned by the interpreter should be\n// considered a revert-and-consume-all-gas operation except for\n// errExecutionReverted which means revert-and-keep-gas-left.\nfunc (in *EVMInterpreter) Run(contract *Contract, input []byte) (ret []byte, err error) {\n\tif in.intPool == nil {\n\t\tin.intPool = poolOfIntPools.get()\n\t\tdefer func() {\n\t\t\tpoolOfIntPools.put(in.intPool)\n\t\t\tin.intPool = nil\n\t\t}()\n\t}\n\n\t// Increment the call depth which is restricted to 1024\n\tin.evm.depth++\n\tdefer func() { in.evm.depth-- }()\n\n\t// Reset the previous call's return data. It's unimportant to preserve the old buffer\n\t// as every returning call will return new data anyway.\n\tin.returnData = nil\n\n\t// Don't bother with the execution if there's no code.\n\tif len(contract.Code) == 0 {\n\t\treturn nil, nil\n\t}\n\n\tvar (\n\t\top    OpCode        // current opcode\n\t\tmem   = NewMemory() // bound memory\n\t\tstack = newstack()  // local stack\n\t\t// For optimisation reason we're using uint64 as the program counter.\n\t\t// It's theoretically possible to go above 2^64. The YP defines the PC\n\t\t// to be uint256. Practically much less so feasible.\n\t\tpc   = uint64(0) // program counter\n\t\tcost uint64\n\t\t// copies used by tracer\n\t\tpcCopy  uint64 // needed for the deferred Tracer\n\t\tgasCopy uint64 // for Tracer to log gas remaining before execution\n\t\tlogged  bool   // deferred Tracer should ignore already logged steps\n\t)\n\tcontract.Input = input\n\n\t// Reclaim the stack as an int pool when the execution stops\n\tdefer func() { in.intPool.put(stack.data...) }()\n\n\tif in.cfg.Debug {\n\t\tdefer func() {\n\t\t\tif err != nil {\n\t\t\t\tif !logged {\n\t\t\t\t\tin.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err)\n\t\t\t\t} else {\n\t\t\t\t\tin.cfg.Tracer.CaptureFault(in.evm, pcCopy, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err)\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n\t// The Interpreter main run loop (contextual). This loop runs until either an\n\t// explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during\n\t// the execution of one of the operations or until the done flag is set by the\n\t// parent context.\n\tfor atomic.LoadInt32(&in.evm.abort) == 0 {\n\t\tif in.cfg.Debug {\n\t\t\t// Capture pre-execution values for tracing.\n\t\t\tlogged, pcCopy, gasCopy = false, pc, contract.Gas\n\t\t}\n\n\t\t// Get the operation from the jump table and validate the stack to ensure there are\n\t\t// enough stack items available to perform the operation.\n\t\top = contract.GetOp(pc)\n\t\toperation := in.cfg.JumpTable[op]\n\t\tif !operation.valid {\n\t\t\treturn nil, fmt.Errorf(\"invalid opcode 0x%x\", int(op))\n\t\t}\n\t\tif err := operation.validateStack(stack); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// If the operation is valid, enforce and write restrictions\n\t\tif err := in.enforceRestrictions(op, operation, stack); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar memorySize uint64\n\t\t// calculate the new memory size and expand the memory to fit\n\t\t// the operation\n\t\tif operation.memorySize != nil {\n\t\t\tmemSize, overflow := bigUint64(operation.memorySize(stack))\n\t\t\tif overflow {\n\t\t\t\treturn nil, errGasUintOverflow\n\t\t\t}\n\t\t\t// memory is expanded in words of 32 bytes. Gas\n\t\t\t// is also calculated in words.\n\t\t\tif memorySize, overflow = math.SafeMul(toWordSize(memSize), 32); overflow {\n\t\t\t\treturn nil, errGasUintOverflow\n\t\t\t}\n\t\t}\n\t\t// consume the gas and return an error if not enough gas is available.\n\t\t// cost is explicitly set so that the capture state defer method can get the proper cost\n\t\tcost, err = operation.gasCost(in.gasTable, in.evm, contract, stack, mem, memorySize)\n\t\tif err != nil || !contract.UseGas(cost) {\n\t\t\treturn nil, ErrOutOfGas\n\t\t}\n\t\tif memorySize > 0 {\n\t\t\tmem.Resize(memorySize)\n\t\t}\n\n\t\tif in.cfg.Debug {\n\t\t\tin.cfg.Tracer.CaptureState(in.evm, pc, op, gasCopy, cost, mem, stack, contract, in.evm.depth, err)\n\t\t\tlogged = true\n\t\t}\n\n\t\t// execute the operation\n\t\tres, err := operation.execute(&pc, in, contract, mem, stack)\n\n\t\t// verifyPool is a build flag. Pool verification makes sure the integrity\n\t\t// of the integer pool by comparing values to a default value.\n\t\tif verifyPool {\n\t\t\tverifyIntegerPool(in.intPool)\n\t\t}\n\t\t// if the operation clears the return data (e.g. it has returning data)\n\t\t// set the last return to the result of the operation.\n\t\tif operation.returns {\n\t\t\tin.returnData = res\n\t\t}\n\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\treturn nil, err\n\t\tcase operation.reverts:\n\t\t\treturn res, errExecutionReverted\n\t\tcase operation.halts:\n\t\t\treturn res, nil\n\t\tcase !operation.jumps:\n\t\t\tpc++\n\t\t}\n\t}\n\treturn nil, nil\n}\n\n// CanRun tells if the contract, passed as an argument, can be\n// run by the current interpreter.\nfunc (in *EVMInterpreter) CanRun(code []byte) bool {\n\treturn true\n}\n\n// IsReadOnly reports if the interpreter is in read only mode.\nfunc (in *EVMInterpreter) IsReadOnly() bool {\n\treturn in.readOnly\n}\n\n// SetReadOnly sets (or unsets) read only mode in the interpreter.\nfunc (in *EVMInterpreter) SetReadOnly(ro bool) {\n\tin.readOnly = ro\n}\n"
  },
  {
    "path": "core/vm/intpool.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\t\"sync\"\n)\n\nvar checkVal = big.NewInt(-42)\n\nconst poolLimit = 256\n\n// intPool is a pool of big integers that\n// can be reused for all big.Int operations.\ntype intPool struct {\n\tpool *Stack\n}\n\nfunc newIntPool() *intPool {\n\treturn &intPool{pool: newstack()}\n}\n\n// get retrieves a big int from the pool, allocating one if the pool is empty.\n// Note, the returned int's value is arbitrary and will not be zeroed!\nfunc (p *intPool) get() *big.Int {\n\tif p.pool.len() > 0 {\n\t\treturn p.pool.pop()\n\t}\n\treturn new(big.Int)\n}\n\n// getZero retrieves a big int from the pool, setting it to zero or allocating\n// a new one if the pool is empty.\nfunc (p *intPool) getZero() *big.Int {\n\tif p.pool.len() > 0 {\n\t\treturn p.pool.pop().SetUint64(0)\n\t}\n\treturn new(big.Int)\n}\n\n// put returns an allocated big int to the pool to be later reused by get calls.\n// Note, the values as saved as is; neither put nor get zeroes the ints out!\nfunc (p *intPool) put(is ...*big.Int) {\n\tif len(p.pool.data) > poolLimit {\n\t\treturn\n\t}\n\tfor _, i := range is {\n\t\t// verifyPool is a build flag. Pool verification makes sure the integrity\n\t\t// of the integer pool by comparing values to a default value.\n\t\tif verifyPool {\n\t\t\ti.Set(checkVal)\n\t\t}\n\t\tp.pool.push(i)\n\t}\n}\n\n// The intPool pool's default capacity\nconst poolDefaultCap = 25\n\n// intPoolPool manages a pool of intPools.\ntype intPoolPool struct {\n\tpools []*intPool\n\tlock  sync.Mutex\n}\n\nvar poolOfIntPools = &intPoolPool{\n\tpools: make([]*intPool, 0, poolDefaultCap),\n}\n\n// get is looking for an available pool to return.\nfunc (ipp *intPoolPool) get() *intPool {\n\tipp.lock.Lock()\n\tdefer ipp.lock.Unlock()\n\n\tif len(poolOfIntPools.pools) > 0 {\n\t\tip := ipp.pools[len(ipp.pools)-1]\n\t\tipp.pools = ipp.pools[:len(ipp.pools)-1]\n\t\treturn ip\n\t}\n\treturn newIntPool()\n}\n\n// put a pool that has been allocated with get.\nfunc (ipp *intPoolPool) put(ip *intPool) {\n\tipp.lock.Lock()\n\tdefer ipp.lock.Unlock()\n\n\tif len(ipp.pools) < cap(ipp.pools) {\n\t\tipp.pools = append(ipp.pools, ip)\n\t}\n}\n"
  },
  {
    "path": "core/vm/intpool_test.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"testing\"\n)\n\nfunc TestIntPoolPoolGet(t *testing.T) {\n\tpoolOfIntPools.pools = make([]*intPool, 0, poolDefaultCap)\n\n\tnip := poolOfIntPools.get()\n\tif nip == nil {\n\t\tt.Fatalf(\"Invalid pool allocation\")\n\t}\n}\n\nfunc TestIntPoolPoolPut(t *testing.T) {\n\tpoolOfIntPools.pools = make([]*intPool, 0, poolDefaultCap)\n\n\tnip := poolOfIntPools.get()\n\tif len(poolOfIntPools.pools) != 0 {\n\t\tt.Fatalf(\"Pool got added to list when none should have been\")\n\t}\n\n\tpoolOfIntPools.put(nip)\n\tif len(poolOfIntPools.pools) == 0 {\n\t\tt.Fatalf(\"Pool did not get added to list when one should have been\")\n\t}\n}\n\nfunc TestIntPoolPoolReUse(t *testing.T) {\n\tpoolOfIntPools.pools = make([]*intPool, 0, poolDefaultCap)\n\tnip := poolOfIntPools.get()\n\tpoolOfIntPools.put(nip)\n\tpoolOfIntPools.get()\n\n\tif len(poolOfIntPools.pools) != 0 {\n\t\tt.Fatalf(\"Invalid number of pools. Got %d, expected %d\", len(poolOfIntPools.pools), 0)\n\t}\n}\n"
  },
  {
    "path": "core/vm/jump_table.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\ntype (\n\texecutionFunc       func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)\n\tgasFunc             func(params.GasTable, *EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64\n\tstackValidationFunc func(*Stack) error\n\tmemorySizeFunc      func(*Stack) *big.Int\n)\n\nvar errGasUintOverflow = errors.New(\"gas uint64 overflow\")\n\ntype operation struct {\n\t// execute is the operation function\n\texecute executionFunc\n\t// gasCost is the gas function and returns the gas required for execution\n\tgasCost gasFunc\n\t// validateStack validates the stack (size) for the operation\n\tvalidateStack stackValidationFunc\n\t// memorySize returns the memory size required for the operation\n\tmemorySize memorySizeFunc\n\n\thalts   bool // indicates whether the operation should halt further execution\n\tjumps   bool // indicates whether the program counter should not increment\n\twrites  bool // determines whether this a state modifying operation\n\tvalid   bool // indication whether the retrieved operation is valid and known\n\treverts bool // determines whether the operation reverts state (implicitly halts)\n\treturns bool // determines whether the operations sets the return data content\n}\n\nvar (\n\tconstantinopleInstructionSet = newAutumnTwilightInstructionSet()\n)\n\nfunc newAutumnTwilightInstructionSet() [256]operation {\n\treturn [256]operation{\n\t\tEXTCODEHASH: {\n\t\t\texecute:       opExtCodeHash,\n\t\t\tgasCost:       gasExtCodeHash,\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSAR: {\n\t\t\texecute:       opSAR,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSHR: {\n\t\t\texecute:       opSHR,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSHL: {\n\t\t\texecute:       opSHL,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tREVERT: {\n\t\t\texecute:       opRevert,\n\t\t\tgasCost:       gasRevert,\n\t\t\tvalidateStack: makeStackFunc(2, 0),\n\t\t\tmemorySize:    memoryRevert,\n\t\t\tvalid:         true,\n\t\t\treverts:       true,\n\t\t\treturns:       true,\n\t\t},\n\t\tRETURNDATACOPY: {\n\t\t\texecute:       opReturnDataCopy,\n\t\t\tgasCost:       gasReturnDataCopy,\n\t\t\tvalidateStack: makeStackFunc(3, 0),\n\t\t\tmemorySize:    memoryReturnDataCopy,\n\t\t\tvalid:         true,\n\t\t},\n\t\tRETURNDATASIZE: {\n\t\t\texecute:       opReturnDataSize,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSTATICCALL: {\n\t\t\texecute:       opStaticCall,\n\t\t\tgasCost:       gasStaticCall,\n\t\t\tvalidateStack: makeStackFunc(6, 1),\n\t\t\tmemorySize:    memoryStaticCall,\n\t\t\tvalid:         true,\n\t\t\treturns:       true,\n\t\t},\n\t\tDELEGATECALL: {\n\t\t\texecute:       opDelegateCall,\n\t\t\tgasCost:       gasDelegateCall,\n\t\t\tvalidateStack: makeStackFunc(6, 1),\n\t\t\tmemorySize:    memoryDelegateCall,\n\t\t\tvalid:         true,\n\t\t\treturns:       true,\n\t\t},\n\t\tSTOP: {\n\t\t\texecute:       opStop,\n\t\t\tgasCost:       constGasFunc(0),\n\t\t\tvalidateStack: makeStackFunc(0, 0),\n\t\t\thalts:         true,\n\t\t\tvalid:         true,\n\t\t},\n\t\tADD: {\n\t\t\texecute:       opAdd,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tMUL: {\n\t\t\texecute:       opMul,\n\t\t\tgasCost:       constGasFunc(GasFastStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSUB: {\n\t\t\texecute:       opSub,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDIV: {\n\t\t\texecute:       opDiv,\n\t\t\tgasCost:       constGasFunc(GasFastStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSDIV: {\n\t\t\texecute:       opSdiv,\n\t\t\tgasCost:       constGasFunc(GasFastStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tMOD: {\n\t\t\texecute:       opMod,\n\t\t\tgasCost:       constGasFunc(GasFastStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSMOD: {\n\t\t\texecute:       opSmod,\n\t\t\tgasCost:       constGasFunc(GasFastStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tADDMOD: {\n\t\t\texecute:       opAddmod,\n\t\t\tgasCost:       constGasFunc(GasMidStep),\n\t\t\tvalidateStack: makeStackFunc(3, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tMULMOD: {\n\t\t\texecute:       opMulmod,\n\t\t\tgasCost:       constGasFunc(GasMidStep),\n\t\t\tvalidateStack: makeStackFunc(3, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tEXP: {\n\t\t\texecute:       opExp,\n\t\t\tgasCost:       gasExp,\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSIGNEXTEND: {\n\t\t\texecute:       opSignExtend,\n\t\t\tgasCost:       constGasFunc(GasFastStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tLT: {\n\t\t\texecute:       opLt,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tGT: {\n\t\t\texecute:       opGt,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSLT: {\n\t\t\texecute:       opSlt,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSGT: {\n\t\t\texecute:       opSgt,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tEQ: {\n\t\t\texecute:       opEq,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tISZERO: {\n\t\t\texecute:       opIszero,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tAND: {\n\t\t\texecute:       opAnd,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tXOR: {\n\t\t\texecute:       opXor,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tOR: {\n\t\t\texecute:       opOr,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tNOT: {\n\t\t\texecute:       opNot,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tBYTE: {\n\t\t\texecute:       opByte,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSHA3: {\n\t\t\texecute:       opSha3,\n\t\t\tgasCost:       gasSha3,\n\t\t\tvalidateStack: makeStackFunc(2, 1),\n\t\t\tmemorySize:    memorySha3,\n\t\t\tvalid:         true,\n\t\t},\n\t\tADDRESS: {\n\t\t\texecute:       opAddress,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tBALANCE: {\n\t\t\texecute:       opBalance,\n\t\t\tgasCost:       gasBalance,\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tORIGIN: {\n\t\t\texecute:       opOrigin,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tCALLER: {\n\t\t\texecute:       opCaller,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tCALLVALUE: {\n\t\t\texecute:       opCallValue,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tCALLDATALOAD: {\n\t\t\texecute:       opCallDataLoad,\n\t\t\tgasCost:       constGasFunc(GasFastestStep),\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tCALLDATASIZE: {\n\t\t\texecute:       opCallDataSize,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tCALLDATACOPY: {\n\t\t\texecute:       opCallDataCopy,\n\t\t\tgasCost:       gasCallDataCopy,\n\t\t\tvalidateStack: makeStackFunc(3, 0),\n\t\t\tmemorySize:    memoryCallDataCopy,\n\t\t\tvalid:         true,\n\t\t},\n\t\tCODESIZE: {\n\t\t\texecute:       opCodeSize,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tCODECOPY: {\n\t\t\texecute:       opCodeCopy,\n\t\t\tgasCost:       gasCodeCopy,\n\t\t\tvalidateStack: makeStackFunc(3, 0),\n\t\t\tmemorySize:    memoryCodeCopy,\n\t\t\tvalid:         true,\n\t\t},\n\t\tGASPRICE: {\n\t\t\texecute:       opGasprice,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tEXTCODESIZE: {\n\t\t\texecute:       opExtCodeSize,\n\t\t\tgasCost:       gasExtCodeSize,\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tEXTCODECOPY: {\n\t\t\texecute:       opExtCodeCopy,\n\t\t\tgasCost:       gasExtCodeCopy,\n\t\t\tvalidateStack: makeStackFunc(4, 0),\n\t\t\tmemorySize:    memoryExtCodeCopy,\n\t\t\tvalid:         true,\n\t\t},\n\t\tBLOCKHASH: {\n\t\t\texecute:       opBlockhash,\n\t\t\tgasCost:       constGasFunc(GasExtStep),\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tCOINBASE: {\n\t\t\texecute:       opCoinbase,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tTIMESTAMP: {\n\t\t\texecute:       opTimestamp,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tNUMBER: {\n\t\t\texecute:       opNumber,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDIFFICULTY: {\n\t\t\texecute:       opDifficulty,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tGASLIMIT: {\n\t\t\texecute:       opGasLimit,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPOP: {\n\t\t\texecute:       opPop,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(1, 0),\n\t\t\tvalid:         true,\n\t\t},\n\t\tMLOAD: {\n\t\t\texecute:       opMload,\n\t\t\tgasCost:       gasMLoad,\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tmemorySize:    memoryMLoad,\n\t\t\tvalid:         true,\n\t\t},\n\t\tMSTORE: {\n\t\t\texecute:       opMstore,\n\t\t\tgasCost:       gasMStore,\n\t\t\tvalidateStack: makeStackFunc(2, 0),\n\t\t\tmemorySize:    memoryMStore,\n\t\t\tvalid:         true,\n\t\t},\n\t\tMSTORE8: {\n\t\t\texecute:       opMstore8,\n\t\t\tgasCost:       gasMStore8,\n\t\t\tmemorySize:    memoryMStore8,\n\t\t\tvalidateStack: makeStackFunc(2, 0),\n\n\t\t\tvalid: true,\n\t\t},\n\t\tSLOAD: {\n\t\t\texecute:       opSload,\n\t\t\tgasCost:       gasSLoad,\n\t\t\tvalidateStack: makeStackFunc(1, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSSTORE: {\n\t\t\texecute:       opSstore,\n\t\t\tgasCost:       gasSStore,\n\t\t\tvalidateStack: makeStackFunc(2, 0),\n\t\t\tvalid:         true,\n\t\t\twrites:        true,\n\t\t},\n\t\tJUMP: {\n\t\t\texecute:       opJump,\n\t\t\tgasCost:       constGasFunc(GasMidStep),\n\t\t\tvalidateStack: makeStackFunc(1, 0),\n\t\t\tjumps:         true,\n\t\t\tvalid:         true,\n\t\t},\n\t\tJUMPI: {\n\t\t\texecute:       opJumpi,\n\t\t\tgasCost:       constGasFunc(GasSlowStep),\n\t\t\tvalidateStack: makeStackFunc(2, 0),\n\t\t\tjumps:         true,\n\t\t\tvalid:         true,\n\t\t},\n\t\tPC: {\n\t\t\texecute:       opPc,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tMSIZE: {\n\t\t\texecute:       opMsize,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tGAS: {\n\t\t\texecute:       opGas,\n\t\t\tgasCost:       constGasFunc(GasQuickStep),\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tJUMPDEST: {\n\t\t\texecute:       opJumpdest,\n\t\t\tgasCost:       constGasFunc(params.JumpdestGas),\n\t\t\tvalidateStack: makeStackFunc(0, 0),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH1: {\n\t\t\texecute:       makePush(1, 1),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH2: {\n\t\t\texecute:       makePush(2, 2),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH3: {\n\t\t\texecute:       makePush(3, 3),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH4: {\n\t\t\texecute:       makePush(4, 4),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH5: {\n\t\t\texecute:       makePush(5, 5),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH6: {\n\t\t\texecute:       makePush(6, 6),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH7: {\n\t\t\texecute:       makePush(7, 7),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH8: {\n\t\t\texecute:       makePush(8, 8),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH9: {\n\t\t\texecute:       makePush(9, 9),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH10: {\n\t\t\texecute:       makePush(10, 10),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH11: {\n\t\t\texecute:       makePush(11, 11),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH12: {\n\t\t\texecute:       makePush(12, 12),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH13: {\n\t\t\texecute:       makePush(13, 13),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH14: {\n\t\t\texecute:       makePush(14, 14),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH15: {\n\t\t\texecute:       makePush(15, 15),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH16: {\n\t\t\texecute:       makePush(16, 16),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH17: {\n\t\t\texecute:       makePush(17, 17),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH18: {\n\t\t\texecute:       makePush(18, 18),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH19: {\n\t\t\texecute:       makePush(19, 19),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH20: {\n\t\t\texecute:       makePush(20, 20),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH21: {\n\t\t\texecute:       makePush(21, 21),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH22: {\n\t\t\texecute:       makePush(22, 22),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH23: {\n\t\t\texecute:       makePush(23, 23),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH24: {\n\t\t\texecute:       makePush(24, 24),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH25: {\n\t\t\texecute:       makePush(25, 25),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH26: {\n\t\t\texecute:       makePush(26, 26),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH27: {\n\t\t\texecute:       makePush(27, 27),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH28: {\n\t\t\texecute:       makePush(28, 28),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH29: {\n\t\t\texecute:       makePush(29, 29),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH30: {\n\t\t\texecute:       makePush(30, 30),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH31: {\n\t\t\texecute:       makePush(31, 31),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tPUSH32: {\n\t\t\texecute:       makePush(32, 32),\n\t\t\tgasCost:       gasPush,\n\t\t\tvalidateStack: makeStackFunc(0, 1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP1: {\n\t\t\texecute:       makeDup(1),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(1),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP2: {\n\t\t\texecute:       makeDup(2),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(2),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP3: {\n\t\t\texecute:       makeDup(3),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(3),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP4: {\n\t\t\texecute:       makeDup(4),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(4),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP5: {\n\t\t\texecute:       makeDup(5),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(5),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP6: {\n\t\t\texecute:       makeDup(6),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(6),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP7: {\n\t\t\texecute:       makeDup(7),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(7),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP8: {\n\t\t\texecute:       makeDup(8),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(8),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP9: {\n\t\t\texecute:       makeDup(9),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(9),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP10: {\n\t\t\texecute:       makeDup(10),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(10),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP11: {\n\t\t\texecute:       makeDup(11),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(11),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP12: {\n\t\t\texecute:       makeDup(12),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(12),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP13: {\n\t\t\texecute:       makeDup(13),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(13),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP14: {\n\t\t\texecute:       makeDup(14),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(14),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP15: {\n\t\t\texecute:       makeDup(15),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(15),\n\t\t\tvalid:         true,\n\t\t},\n\t\tDUP16: {\n\t\t\texecute:       makeDup(16),\n\t\t\tgasCost:       gasDup,\n\t\t\tvalidateStack: makeDupStackFunc(16),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP1: {\n\t\t\texecute:       makeSwap(1),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(2),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP2: {\n\t\t\texecute:       makeSwap(2),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(3),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP3: {\n\t\t\texecute:       makeSwap(3),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(4),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP4: {\n\t\t\texecute:       makeSwap(4),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(5),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP5: {\n\t\t\texecute:       makeSwap(5),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(6),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP6: {\n\t\t\texecute:       makeSwap(6),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(7),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP7: {\n\t\t\texecute:       makeSwap(7),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(8),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP8: {\n\t\t\texecute:       makeSwap(8),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(9),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP9: {\n\t\t\texecute:       makeSwap(9),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(10),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP10: {\n\t\t\texecute:       makeSwap(10),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(11),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP11: {\n\t\t\texecute:       makeSwap(11),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(12),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP12: {\n\t\t\texecute:       makeSwap(12),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(13),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP13: {\n\t\t\texecute:       makeSwap(13),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(14),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP14: {\n\t\t\texecute:       makeSwap(14),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(15),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP15: {\n\t\t\texecute:       makeSwap(15),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(16),\n\t\t\tvalid:         true,\n\t\t},\n\t\tSWAP16: {\n\t\t\texecute:       makeSwap(16),\n\t\t\tgasCost:       gasSwap,\n\t\t\tvalidateStack: makeSwapStackFunc(17),\n\t\t\tvalid:         true,\n\t\t},\n\t\tLOG0: {\n\t\t\texecute:       makeLog(0),\n\t\t\tgasCost:       makeGasLog(0),\n\t\t\tvalidateStack: makeStackFunc(2, 0),\n\t\t\tmemorySize:    memoryLog,\n\t\t\tvalid:         true,\n\t\t\twrites:        true,\n\t\t},\n\t\tLOG1: {\n\t\t\texecute:       makeLog(1),\n\t\t\tgasCost:       makeGasLog(1),\n\t\t\tvalidateStack: makeStackFunc(3, 0),\n\t\t\tmemorySize:    memoryLog,\n\t\t\tvalid:         true,\n\t\t\twrites:        true,\n\t\t},\n\t\tLOG2: {\n\t\t\texecute:       makeLog(2),\n\t\t\tgasCost:       makeGasLog(2),\n\t\t\tvalidateStack: makeStackFunc(4, 0),\n\t\t\tmemorySize:    memoryLog,\n\t\t\tvalid:         true,\n\t\t\twrites:        true,\n\t\t},\n\t\tLOG3: {\n\t\t\texecute:       makeLog(3),\n\t\t\tgasCost:       makeGasLog(3),\n\t\t\tvalidateStack: makeStackFunc(5, 0),\n\t\t\tmemorySize:    memoryLog,\n\t\t\tvalid:         true,\n\t\t\twrites:        true,\n\t\t},\n\t\tLOG4: {\n\t\t\texecute:       makeLog(4),\n\t\t\tgasCost:       makeGasLog(4),\n\t\t\tvalidateStack: makeStackFunc(6, 0),\n\t\t\tmemorySize:    memoryLog,\n\t\t\tvalid:         true,\n\t\t\twrites:        true,\n\t\t},\n\t\tCALL: {\n\t\t\texecute:       opCall,\n\t\t\tgasCost:       gasCall,\n\t\t\tvalidateStack: makeStackFunc(7, 1),\n\t\t\tmemorySize:    memoryCall,\n\t\t\tvalid:         true,\n\t\t\treturns:       true,\n\t\t},\n\t\tCALLCODE: {\n\t\t\texecute:       opCallCode,\n\t\t\tgasCost:       gasCallCode,\n\t\t\tvalidateStack: makeStackFunc(7, 1),\n\t\t\tmemorySize:    memoryCall,\n\t\t\tvalid:         true,\n\t\t\treturns:       true,\n\t\t},\n\t\tRETURN: {\n\t\t\texecute:       opReturn,\n\t\t\tgasCost:       gasReturn,\n\t\t\tvalidateStack: makeStackFunc(2, 0),\n\t\t\tmemorySize:    memoryReturn,\n\t\t\thalts:         true,\n\t\t\tvalid:         true,\n\t\t},\n\t\t//SELFDESTRUCT: {\n\t\t//\texecute:       opSuicide,\n\t\t//\tgasCost:       gasSuicide,\n\t\t//\tvalidateStack: makeStackFunc(1, 0),\n\t\t//\thalts:         true,\n\t\t//\tvalid:         true,\n\t\t//\twrites:        true,\n\t\t//},\n\t}\n}\n"
  },
  {
    "path": "core/vm/logger.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\n// Storage represents a contract's storage.\ntype Storage map[common.Hash]common.Hash\n\n// Copy duplicates the current storage.\nfunc (s Storage) Copy() Storage {\n\tcpy := make(Storage)\n\tfor key, value := range s {\n\t\tcpy[key] = value\n\t}\n\n\treturn cpy\n}\n\n// LogConfig are the configuration options for structured logger the EVM\ntype LogConfig struct {\n\tDisableMemory  bool // disable memory capture\n\tDisableStack   bool // disable stack capture\n\tDisableStorage bool // disable storage capture\n\tDebug          bool // print output during capture end\n\tLimit          int  // maximum length of output, but zero means unlimited\n}\n\n//go:generate gencodec -type StructLog -field-override structLogMarshaling -out gen_structlog.go\n\n// StructLog is emitted to the EVM each cycle and lists information about the current internal state\n// prior to the execution of the statement.\ntype StructLog struct {\n\tPc         uint64                      `json:\"pc\"`\n\tOp         OpCode                      `json:\"op\"`\n\tGas        uint64                      `json:\"gas\"`\n\tGasCost    uint64                      `json:\"gasCost\"`\n\tMemory     []byte                      `json:\"memory\"`\n\tMemorySize int                         `json:\"memSize\"`\n\tStack      []*big.Int                  `json:\"stack\"`\n\tStorage    map[common.Hash]common.Hash `json:\"-\"`\n\tDepth      int                         `json:\"depth\"`\n\tErr        error                       `json:\"-\"`\n}\n\n// overrides for gencodec\ntype structLogMarshaling struct {\n\tStack       []*math.HexOrDecimal256\n\tGas         math.HexOrDecimal64\n\tGasCost     math.HexOrDecimal64\n\tMemory      hexutil.Bytes\n\tOpName      string `json:\"opName\"` // adds call to OpName() in MarshalJSON\n\tErrorString string `json:\"error\"`  // adds call to ErrorString() in MarshalJSON\n}\n\n// OpName formats the operand name in a human-readable format.\nfunc (s *StructLog) OpName() string {\n\treturn s.Op.String()\n}\n\n// ErrorString formats the log's error as a string.\nfunc (s *StructLog) ErrorString() string {\n\tif s.Err != nil {\n\t\treturn s.Err.Error()\n\t}\n\treturn \"\"\n}\n\n// Tracer is used to collect execution traces from an EVM transaction\n// execution. CaptureState is called for each step of the VM with the\n// current VM state.\n// Note that reference types are actual VM data structures; make copies\n// if you need to retain them beyond the current call.\ntype Tracer interface {\n\tCaptureStart(from common.Address, to common.Address, call bool, input []byte, gas uint64, asset *assets.Asset) error\n\tCaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error\n\tCaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error\n\tCaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error\n}\n\n// StructLogger is an EVM state logger and implements Tracer.\n//\n// StructLogger can capture state based on the given Log configuration and also keeps\n// a track record of modified storage which is used in reporting snapshots of the\n// contract their storage.\ntype StructLogger struct {\n\tcfg LogConfig\n\n\tlogs          []StructLog\n\tchangedValues map[common.Address]Storage\n\toutput        []byte\n\terr           error\n}\n\n// NewStructLogger returns a new logger\nfunc NewStructLogger(cfg *LogConfig) *StructLogger {\n\tlogger := &StructLogger{\n\t\tchangedValues: make(map[common.Address]Storage),\n\t}\n\tif cfg != nil {\n\t\tlogger.cfg = *cfg\n\t}\n\treturn logger\n}\n\n// CaptureStart implements the Tracer interface to initialize the tracing operation.\nfunc (l *StructLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, asset *assets.Asset) error {\n\treturn nil\n}\n\n// CaptureState logs a new structured log message and pushes it out to the environment\n//\n// CaptureState also tracks SSTORE ops to track dirty values.\nfunc (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error {\n\t// check if already accumulated the specified number of logs\n\tif l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) {\n\t\treturn ErrTraceLimitReached\n\t}\n\n\t// initialise new changed values storage container for this contract\n\t// if not present.\n\tif l.changedValues[contract.Address()] == nil {\n\t\tl.changedValues[contract.Address()] = make(Storage)\n\t}\n\n\t// capture SSTORE opcodes and determine the changed value and store\n\t// it in the local storage container.\n\tif op == SSTORE && stack.len() >= 2 {\n\t\tvar (\n\t\t\tvalue   = common.BigToHash(stack.data[stack.len()-2])\n\t\t\taddress = common.BigToHash(stack.data[stack.len()-1])\n\t\t)\n\t\tl.changedValues[contract.Address()][address] = value\n\t}\n\t// Copy a snapstot of the current memory state to a new buffer\n\tvar mem []byte\n\tif !l.cfg.DisableMemory {\n\t\tmem = make([]byte, len(memory.Data()))\n\t\tcopy(mem, memory.Data())\n\t}\n\t// Copy a snapshot of the current stack state to a new buffer\n\tvar stck []*big.Int\n\tif !l.cfg.DisableStack {\n\t\tstck = make([]*big.Int, len(stack.Data()))\n\t\tfor i, item := range stack.Data() {\n\t\t\tstck[i] = new(big.Int).Set(item)\n\t\t}\n\t}\n\t// Copy a snapshot of the current storage to a new container\n\tvar storage Storage\n\tif !l.cfg.DisableStorage {\n\t\tstorage = l.changedValues[contract.Address()].Copy()\n\t}\n\t// create a new snaptshot of the EVM.\n\tlog := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, storage, depth, err}\n\n\tl.logs = append(l.logs, log)\n\treturn nil\n}\n\n// CaptureFault implements the Tracer interface to trace an execution fault\n// while running an opcode.\nfunc (l *StructLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error {\n\treturn nil\n}\n\n// CaptureEnd is called after the call finishes to finalize the tracing.\nfunc (l *StructLogger) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error {\n\tl.output = output\n\tl.err = err\n\tif l.cfg.Debug {\n\t\tfmt.Printf(\"0x%x\\n\", output)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\" error: %v\\n\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// StructLogs returns the captured log entries.\nfunc (l *StructLogger) StructLogs() []StructLog { return l.logs }\n\n// Error returns the VM error captured by the trace.\nfunc (l *StructLogger) Error() error { return l.err }\n\n// Output returns the VM return value captured by the trace.\nfunc (l *StructLogger) Output() []byte { return l.output }\n\n// WriteTrace writes a formatted trace to the given writer\nfunc WriteTrace(writer io.Writer, logs []StructLog) {\n\tfor _, log := range logs {\n\t\tfmt.Fprintf(writer, \"%-16spc=%08d gas=%v cost=%v\", log.Op, log.Pc, log.Gas, log.GasCost)\n\t\tif log.Err != nil {\n\t\t\tfmt.Fprintf(writer, \" ERROR: %v\", log.Err)\n\t\t}\n\t\tfmt.Fprintln(writer)\n\n\t\tif len(log.Stack) > 0 {\n\t\t\tfmt.Fprintln(writer, \"Stack:\")\n\t\t\tfor i := len(log.Stack) - 1; i >= 0; i-- {\n\t\t\t\tfmt.Fprintf(writer, \"%08d  %x\\n\", len(log.Stack)-i-1, math.PaddedBigBytes(log.Stack[i], 32))\n\t\t\t}\n\t\t}\n\t\tif len(log.Memory) > 0 {\n\t\t\tfmt.Fprintln(writer, \"Memory:\")\n\t\t\tfmt.Fprint(writer, hex.Dump(log.Memory))\n\t\t}\n\t\tif len(log.Storage) > 0 {\n\t\t\tfmt.Fprintln(writer, \"Storage:\")\n\t\t\tfor h, item := range log.Storage {\n\t\t\t\tfmt.Fprintf(writer, \"%x: %x\\n\", h, item)\n\t\t\t}\n\t\t}\n\t\tfmt.Fprintln(writer)\n\t}\n}\n\n// WriteLogs writes vm logs in a readable format to the given writer\nfunc WriteLogs(writer io.Writer, logs []*types.Log) {\n\tfor _, log := range logs {\n\t\tfmt.Fprintf(writer, \"LOG%d: %x bn=%d txi=%x\\n\", len(log.Topics), log.Address, log.BlockNumber, log.TxIndex)\n\n\t\tfor i, topic := range log.Topics {\n\t\t\tfmt.Fprintf(writer, \"%08d  %x\\n\", i, topic)\n\t\t}\n\n\t\tfmt.Fprint(writer, hex.Dump(log.Data))\n\t\tfmt.Fprintln(writer)\n\t}\n}\n"
  },
  {
    "path": "core/vm/logger_test.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\ntype dummyContractRef struct {\n\tcalledForEach bool\n}\n\nfunc (dummyContractRef) ReturnGas(*big.Int)          {}\nfunc (dummyContractRef) Address() common.Address     { return common.Address{} }\nfunc (dummyContractRef) Value() *big.Int             { return new(big.Int) }\nfunc (dummyContractRef) SetCode(common.Hash, []byte) {}\nfunc (d *dummyContractRef) ForEachStorage(callback func(key, value common.Hash) bool) {\n\td.calledForEach = true\n}\nfunc (d *dummyContractRef) SubBalance(amount *big.Int) {}\nfunc (d *dummyContractRef) AddBalance(amount *big.Int) {}\nfunc (d *dummyContractRef) SetBalance(*big.Int)        {}\nfunc (d *dummyContractRef) SetNonce(uint64)            {}\nfunc (d *dummyContractRef) Balance() *big.Int          { return new(big.Int) }\n\ntype dummyStateDB struct {\n\tNoopStateDB\n\tref *dummyContractRef\n}\n\nfunc TestStoreCapture(t *testing.T) {\n\tvar (\n\t\tenv      = NewEVM(Context{}, nil, params.TestChainConfig, Config{})\n\t\tlogger   = NewStructLogger(nil)\n\t\tmem      = NewMemory()\n\t\tstack    = newstack()\n\t\tcontract = NewContract(&dummyContractRef{}, &dummyContractRef{}, nil, 0)\n\t)\n\tstack.push(big.NewInt(1))\n\tstack.push(big.NewInt(0))\n\n\tvar index common.Hash\n\n\tlogger.CaptureState(env, 0, SSTORE, 0, 0, mem, stack, contract, 0, nil)\n\tif len(logger.changedValues[contract.Address()]) == 0 {\n\t\tt.Fatalf(\"expected exactly 1 changed value on address %x, got %d\", contract.Address(), len(logger.changedValues[contract.Address()]))\n\t}\n\texp := common.BigToHash(big.NewInt(1))\n\tif logger.changedValues[contract.Address()][index] != exp {\n\t\tt.Errorf(\"expected %x, got %x\", exp, logger.changedValues[contract.Address()][index])\n\t}\n}\n"
  },
  {
    "path": "core/vm/memory.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\n// Memory implements a simple memory model for the ethereum virtual machine.\ntype Memory struct {\n\tstore       []byte\n\tlastGasCost uint64\n}\n\n// NewMemory returns a new memory memory model.\nfunc NewMemory() *Memory {\n\treturn &Memory{}\n}\n\n// Set sets offset + size to value\nfunc (m *Memory) Set(offset, size uint64, value []byte) {\n\t// It's possible the offset is greater than 0 and size equals 0. This is because\n\t// the calcMemSize (common.go) could potentially return 0 when size is zero (NO-OP)\n\tif size > 0 {\n\t\t// length of store may never be less than offset + size.\n\t\t// The store should be resized PRIOR to setting the memory\n\t\tif offset+size > uint64(len(m.store)) {\n\t\t\tpanic(\"invalid memory: store empty\")\n\t\t}\n\t\tcopy(m.store[offset:offset+size], value)\n\t}\n}\n\n// Set32 sets the 32 bytes starting at offset to the value of val, left-padded with zeroes to\n// 32 bytes.\nfunc (m *Memory) Set32(offset uint64, val *big.Int) {\n\t// length of store may never be less than offset + size.\n\t// The store should be resized PRIOR to setting the memory\n\tif offset+32 > uint64(len(m.store)) {\n\t\tpanic(\"invalid memory: store empty\")\n\t}\n\t// Zero the memory area\n\tcopy(m.store[offset:offset+32], []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})\n\t// Fill in relevant bits\n\tmath.ReadBits(val, m.store[offset:offset+32])\n}\n\n// Resize resizes the memory to size\nfunc (m *Memory) Resize(size uint64) {\n\tif uint64(m.Len()) < size {\n\t\tm.store = append(m.store, make([]byte, size-uint64(m.Len()))...)\n\t}\n}\n\n// Get returns offset + size as a new slice\nfunc (m *Memory) Get(offset, size int64) (cpy []byte) {\n\tif size == 0 {\n\t\treturn nil\n\t}\n\n\tif len(m.store) > int(offset) {\n\t\tcpy = make([]byte, size)\n\t\tcopy(cpy, m.store[offset:offset+size])\n\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetPtr returns the offset + size\nfunc (m *Memory) GetPtr(offset, size int64) []byte {\n\tif size == 0 {\n\t\treturn nil\n\t}\n\n\tif len(m.store) > int(offset) {\n\t\treturn m.store[offset : offset+size]\n\t}\n\n\treturn nil\n}\n\n// Len returns the length of the backing slice\nfunc (m *Memory) Len() int {\n\treturn len(m.store)\n}\n\n// Data returns the backing slice\nfunc (m *Memory) Data() []byte {\n\treturn m.store\n}\n\n// Print dumps the content of the memory.\nfunc (m *Memory) Print() {\n\tfmt.Printf(\"### mem %d bytes ###\\n\", len(m.store))\n\tif len(m.store) > 0 {\n\t\taddr := 0\n\t\tfor i := 0; i+32 <= len(m.store); i += 32 {\n\t\t\tfmt.Printf(\"%03d: % x\\n\", addr, m.store[i:i+32])\n\t\t\taddr++\n\t\t}\n\t} else {\n\t\tfmt.Println(\"-- empty --\")\n\t}\n\tfmt.Println(\"####################\")\n}\n"
  },
  {
    "path": "core/vm/memory_table.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nfunc memorySha3(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), stack.Back(1))\n}\n\nfunc memoryCallDataCopy(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), stack.Back(2))\n}\n\nfunc memoryReturnDataCopy(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), stack.Back(2))\n}\n\nfunc memoryCodeCopy(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), stack.Back(2))\n}\n\nfunc memoryExtCodeCopy(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(1), stack.Back(3))\n}\n\nfunc memoryMLoad(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), big.NewInt(32))\n}\n\nfunc memoryMStore8(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), big.NewInt(1))\n}\n\nfunc memoryMStore(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), big.NewInt(32))\n}\n\nfunc memoryCreate(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(1), stack.Back(2))\n}\n\nfunc memoryCreate2(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(1), stack.Back(2))\n}\n\nfunc memoryCall(stack *Stack) *big.Int {\n\tx := calcMemSize(stack.Back(5), stack.Back(6))\n\ty := calcMemSize(stack.Back(3), stack.Back(4))\n\n\treturn math.BigMax(x, y)\n}\n\nfunc memoryDelegateCall(stack *Stack) *big.Int {\n\tx := calcMemSize(stack.Back(4), stack.Back(5))\n\ty := calcMemSize(stack.Back(2), stack.Back(3))\n\n\treturn math.BigMax(x, y)\n}\n\nfunc memoryStaticCall(stack *Stack) *big.Int {\n\tx := calcMemSize(stack.Back(4), stack.Back(5))\n\ty := calcMemSize(stack.Back(2), stack.Back(3))\n\n\treturn math.BigMax(x, y)\n}\n\nfunc memoryReturn(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), stack.Back(1))\n}\n\nfunc memoryRevert(stack *Stack) *big.Int {\n\treturn calcMemSize(stack.Back(0), stack.Back(1))\n}\n\nfunc memoryLog(stack *Stack) *big.Int {\n\tmSize, mStart := stack.Back(1), stack.Back(0)\n\treturn calcMemSize(mStart, mSize)\n}\n"
  },
  {
    "path": "core/vm/noop.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n)\n\nfunc NoopCanTransfer(db StateDB, from common.Address, balance *big.Int) bool {\n\treturn true\n}\nfunc NoopTransfer(db StateDB, from, to common.Address, amount *big.Int) {}\n\ntype NoopEVMCallContext struct{}\n\nfunc (NoopEVMCallContext) Call(caller ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) {\n\treturn nil, nil\n}\nfunc (NoopEVMCallContext) CallCode(caller ContractRef, addr common.Address, data []byte, gas, value *big.Int) ([]byte, error) {\n\treturn nil, nil\n}\nfunc (NoopEVMCallContext) Create(caller ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error) {\n\treturn nil, common.Address{}, nil\n}\nfunc (NoopEVMCallContext) DelegateCall(me ContractRef, addr common.Address, data []byte, gas *big.Int) ([]byte, error) {\n\treturn nil, nil\n}\n\ntype NoopStateDB struct{}\n\nfunc (NoopStateDB) GetAndIndNonce() uint64                                             { return 0 }\nfunc (NoopStateDB) CreateAccount(common.Address)                                       {}\nfunc (NoopStateDB) GetZState() *zstate.ZState                                          { return nil }\nfunc (NoopStateDB) SubBalance(common.Address, common.Hash, *big.Int)                   {}\nfunc (NoopStateDB) AddBalance(common.Address, common.Hash, *big.Int)                   {}\nfunc (NoopStateDB) GetBalance(common.Address) *big.Int                                 { return nil }\nfunc (NoopStateDB) GetNonce(common.Address) uint64                                     { return 0 }\nfunc (NoopStateDB) SetNonce(common.Address, uint64)                                    {}\nfunc (NoopStateDB) GetCodeHash(common.Address) common.Hash                             { return common.Hash{} }\nfunc (NoopStateDB) GetCode(common.Address) []byte                                      { return nil }\nfunc (NoopStateDB) SetCode(common.Address, []byte)                                     {}\nfunc (NoopStateDB) GetCodeSize(common.Address) int                                     { return 0 }\nfunc (NoopStateDB) AddRefund(uint64)                                                   {}\nfunc (NoopStateDB) GetRefund() uint64                                                  { return 0 }\nfunc (NoopStateDB) GetState(common.Address, common.Hash) common.Hash                   { return common.Hash{} }\nfunc (NoopStateDB) SetState(common.Address, common.Hash, common.Hash)                  {}\nfunc (NoopStateDB) Suicide(common.Address, common.Hash) bool                           { return false }\nfunc (NoopStateDB) HasSuicided(common.Address) bool                                    { return false }\nfunc (NoopStateDB) Exist(common.Address) bool                                          { return false }\nfunc (NoopStateDB) Empty(common.Address) bool                                          { return false }\nfunc (NoopStateDB) RevertToSnapshot(int)                                               {}\nfunc (NoopStateDB) Snapshot() int                                                      { return 0 }\nfunc (NoopStateDB) AddLog(*types.Log)                                                  {}\nfunc (NoopStateDB) AddPreimage(common.Hash, []byte)                                    {}\nfunc (NoopStateDB) ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) {}\nfunc (NoopStateDB) IsContract(addr common.Address) bool {\n\treturn false\n}\nfunc (NoopStateDB) SetNonceAddress(addr common.Address, nonceAddr common.Address) {\n\n}\n\nfunc (NoopStateDB) GetNonceAddress(addr common.Address, key []byte) common.Address {\n\treturn common.Address{}\n}\n\nfunc (NoopStateDB) GetAllNonceAddress(addr common.Address) []common.Address {\n\treturn []common.Address{}\n}\n"
  },
  {
    "path": "core/vm/opcodes.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"fmt\"\n)\n\n// OpCode is an EVM opcode\ntype OpCode byte\n\n// IsPush specifies if an opcode is a PUSH opcode.\nfunc (op OpCode) IsPush() bool {\n\tswitch op {\n\tcase PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// IsStaticJump specifies if an opcode is JUMP.\nfunc (op OpCode) IsStaticJump() bool {\n\treturn op == JUMP\n}\n\n// 0x0 range - arithmetic ops.\nconst (\n\tSTOP OpCode = iota\n\tADD\n\tMUL\n\tSUB\n\tDIV\n\tSDIV\n\tMOD\n\tSMOD\n\tADDMOD\n\tMULMOD\n\tEXP\n\tSIGNEXTEND\n)\n\n// 0x10 range - comparison ops.\nconst (\n\tLT OpCode = iota + 0x10\n\tGT\n\tSLT\n\tSGT\n\tEQ\n\tISZERO\n\tAND\n\tOR\n\tXOR\n\tNOT\n\tBYTE\n\tSHL\n\tSHR\n\tSAR\n\n\tSHA3 = 0x20\n)\n\n// 0x30 range - closure state.\nconst (\n\tADDRESS OpCode = 0x30 + iota\n\tBALANCE\n\tORIGIN\n\tCALLER\n\tCALLVALUE\n\tCALLDATALOAD\n\tCALLDATASIZE\n\tCALLDATACOPY\n\tCODESIZE\n\tCODECOPY\n\tGASPRICE\n\tEXTCODESIZE\n\tEXTCODECOPY\n\tRETURNDATASIZE\n\tRETURNDATACOPY\n\tEXTCODEHASH\n)\n\n// 0x40 range - block operations.\nconst (\n\tBLOCKHASH OpCode = 0x40 + iota\n\tCOINBASE\n\tTIMESTAMP\n\tNUMBER\n\tDIFFICULTY\n\tGASLIMIT\n)\n\n// 0x50 range - 'storage' and execution.\nconst (\n\tPOP OpCode = 0x50 + iota\n\tMLOAD\n\tMSTORE\n\tMSTORE8\n\tSLOAD\n\tSSTORE\n\tJUMP\n\tJUMPI\n\tPC\n\tMSIZE\n\tGAS\n\tJUMPDEST\n)\n\n// 0x60 range.\nconst (\n\tPUSH1 OpCode = 0x60 + iota\n\tPUSH2\n\tPUSH3\n\tPUSH4\n\tPUSH5\n\tPUSH6\n\tPUSH7\n\tPUSH8\n\tPUSH9\n\tPUSH10\n\tPUSH11\n\tPUSH12\n\tPUSH13\n\tPUSH14\n\tPUSH15\n\tPUSH16\n\tPUSH17\n\tPUSH18\n\tPUSH19\n\tPUSH20\n\tPUSH21\n\tPUSH22\n\tPUSH23\n\tPUSH24\n\tPUSH25\n\tPUSH26\n\tPUSH27\n\tPUSH28\n\tPUSH29\n\tPUSH30\n\tPUSH31\n\tPUSH32\n\tDUP1\n\tDUP2\n\tDUP3\n\tDUP4\n\tDUP5\n\tDUP6\n\tDUP7\n\tDUP8\n\tDUP9\n\tDUP10\n\tDUP11\n\tDUP12\n\tDUP13\n\tDUP14\n\tDUP15\n\tDUP16\n\tSWAP1\n\tSWAP2\n\tSWAP3\n\tSWAP4\n\tSWAP5\n\tSWAP6\n\tSWAP7\n\tSWAP8\n\tSWAP9\n\tSWAP10\n\tSWAP11\n\tSWAP12\n\tSWAP13\n\tSWAP14\n\tSWAP15\n\tSWAP16\n)\n\n// 0xa0 range - logging ops.\nconst (\n\tLOG0 OpCode = 0xa0 + iota\n\tLOG1\n\tLOG2\n\tLOG3\n\tLOG4\n)\n\n// unofficial opcodes used for parsing.\nconst (\n\tPUSH OpCode = 0xb0 + iota\n\tDUP\n\tSWAP\n)\n\n// 0xf0 range - closures.\nconst (\n\tCREATE OpCode = 0xf0 + iota\n\tCALL\n\tCALLCODE\n\tRETURN\n\tDELEGATECALL\n\tCREATE2\n\tSTATICCALL = 0xfa\n\n\tREVERT = 0xfd\n\t//SELFDESTRUCT = 0xff\n)\n\n// Since the opcodes aren't all in order we can't use a regular slice.\nvar opCodeToString = map[OpCode]string{\n\t// 0x0 range - arithmetic ops.\n\tSTOP:       \"STOP\",\n\tADD:        \"ADD\",\n\tMUL:        \"MUL\",\n\tSUB:        \"SUB\",\n\tDIV:        \"DIV\",\n\tSDIV:       \"SDIV\",\n\tMOD:        \"MOD\",\n\tSMOD:       \"SMOD\",\n\tEXP:        \"EXP\",\n\tNOT:        \"NOT\",\n\tLT:         \"LT\",\n\tGT:         \"GT\",\n\tSLT:        \"SLT\",\n\tSGT:        \"SGT\",\n\tEQ:         \"EQ\",\n\tISZERO:     \"ISZERO\",\n\tSIGNEXTEND: \"SIGNEXTEND\",\n\n\t// 0x10 range - bit ops.\n\tAND:    \"AND\",\n\tOR:     \"OR\",\n\tXOR:    \"XOR\",\n\tBYTE:   \"BYTE\",\n\tSHL:    \"SHL\",\n\tSHR:    \"SHR\",\n\tSAR:    \"SAR\",\n\tADDMOD: \"ADDMOD\",\n\tMULMOD: \"MULMOD\",\n\n\t// 0x20 range - crypto.\n\tSHA3: \"SHA3\",\n\n\t// 0x30 range - closure state.\n\tADDRESS:        \"ADDRESS\",\n\tBALANCE:        \"BALANCE\",\n\tORIGIN:         \"ORIGIN\",\n\tCALLER:         \"CALLER\",\n\tCALLVALUE:      \"CALLVALUE\",\n\tCALLDATALOAD:   \"CALLDATALOAD\",\n\tCALLDATASIZE:   \"CALLDATASIZE\",\n\tCALLDATACOPY:   \"CALLDATACOPY\",\n\tCODESIZE:       \"CODESIZE\",\n\tCODECOPY:       \"CODECOPY\",\n\tGASPRICE:       \"GASPRICE\",\n\tEXTCODESIZE:    \"EXTCODESIZE\",\n\tEXTCODECOPY:    \"EXTCODECOPY\",\n\tRETURNDATASIZE: \"RETURNDATASIZE\",\n\tRETURNDATACOPY: \"RETURNDATACOPY\",\n\tEXTCODEHASH:    \"EXTCODEHASH\",\n\n\t// 0x40 range - block operations.\n\tBLOCKHASH:  \"BLOCKHASH\",\n\tCOINBASE:   \"COINBASE\",\n\tTIMESTAMP:  \"TIMESTAMP\",\n\tNUMBER:     \"NUMBER\",\n\tDIFFICULTY: \"DIFFICULTY\",\n\tGASLIMIT:   \"GASLIMIT\",\n\n\t// 0x50 range - 'storage' and execution.\n\tPOP: \"POP\",\n\t//DUP:     \"DUP\",\n\t//SWAP:    \"SWAP\",\n\tMLOAD:    \"MLOAD\",\n\tMSTORE:   \"MSTORE\",\n\tMSTORE8:  \"MSTORE8\",\n\tSLOAD:    \"SLOAD\",\n\tSSTORE:   \"SSTORE\",\n\tJUMP:     \"JUMP\",\n\tJUMPI:    \"JUMPI\",\n\tPC:       \"PC\",\n\tMSIZE:    \"MSIZE\",\n\tGAS:      \"GAS\",\n\tJUMPDEST: \"JUMPDEST\",\n\n\t// 0x60 range - push.\n\tPUSH1:  \"PUSH1\",\n\tPUSH2:  \"PUSH2\",\n\tPUSH3:  \"PUSH3\",\n\tPUSH4:  \"PUSH4\",\n\tPUSH5:  \"PUSH5\",\n\tPUSH6:  \"PUSH6\",\n\tPUSH7:  \"PUSH7\",\n\tPUSH8:  \"PUSH8\",\n\tPUSH9:  \"PUSH9\",\n\tPUSH10: \"PUSH10\",\n\tPUSH11: \"PUSH11\",\n\tPUSH12: \"PUSH12\",\n\tPUSH13: \"PUSH13\",\n\tPUSH14: \"PUSH14\",\n\tPUSH15: \"PUSH15\",\n\tPUSH16: \"PUSH16\",\n\tPUSH17: \"PUSH17\",\n\tPUSH18: \"PUSH18\",\n\tPUSH19: \"PUSH19\",\n\tPUSH20: \"PUSH20\",\n\tPUSH21: \"PUSH21\",\n\tPUSH22: \"PUSH22\",\n\tPUSH23: \"PUSH23\",\n\tPUSH24: \"PUSH24\",\n\tPUSH25: \"PUSH25\",\n\tPUSH26: \"PUSH26\",\n\tPUSH27: \"PUSH27\",\n\tPUSH28: \"PUSH28\",\n\tPUSH29: \"PUSH29\",\n\tPUSH30: \"PUSH30\",\n\tPUSH31: \"PUSH31\",\n\tPUSH32: \"PUSH32\",\n\n\tDUP1:  \"DUP1\",\n\tDUP2:  \"DUP2\",\n\tDUP3:  \"DUP3\",\n\tDUP4:  \"DUP4\",\n\tDUP5:  \"DUP5\",\n\tDUP6:  \"DUP6\",\n\tDUP7:  \"DUP7\",\n\tDUP8:  \"DUP8\",\n\tDUP9:  \"DUP9\",\n\tDUP10: \"DUP10\",\n\tDUP11: \"DUP11\",\n\tDUP12: \"DUP12\",\n\tDUP13: \"DUP13\",\n\tDUP14: \"DUP14\",\n\tDUP15: \"DUP15\",\n\tDUP16: \"DUP16\",\n\n\tSWAP1:  \"SWAP1\",\n\tSWAP2:  \"SWAP2\",\n\tSWAP3:  \"SWAP3\",\n\tSWAP4:  \"SWAP4\",\n\tSWAP5:  \"SWAP5\",\n\tSWAP6:  \"SWAP6\",\n\tSWAP7:  \"SWAP7\",\n\tSWAP8:  \"SWAP8\",\n\tSWAP9:  \"SWAP9\",\n\tSWAP10: \"SWAP10\",\n\tSWAP11: \"SWAP11\",\n\tSWAP12: \"SWAP12\",\n\tSWAP13: \"SWAP13\",\n\tSWAP14: \"SWAP14\",\n\tSWAP15: \"SWAP15\",\n\tSWAP16: \"SWAP16\",\n\tLOG0:   \"LOG0\",\n\tLOG1:   \"LOG1\",\n\tLOG2:   \"LOG2\",\n\tLOG3:   \"LOG3\",\n\tLOG4:   \"LOG4\",\n\n\t// 0xf0 range.\n\tCREATE:       \"CREATE\",\n\tCALL:         \"CALL\",\n\tRETURN:       \"RETURN\",\n\tCALLCODE:     \"CALLCODE\",\n\tDELEGATECALL: \"DELEGATECALL\",\n\tCREATE2:      \"CREATE2\",\n\tSTATICCALL:   \"STATICCALL\",\n\tREVERT:       \"REVERT\",\n\t//SELFDESTRUCT: \"SELFDESTRUCT\",\n\n\tPUSH: \"PUSH\",\n\tDUP:  \"DUP\",\n\tSWAP: \"SWAP\",\n}\n\nfunc (op OpCode) String() string {\n\tstr := opCodeToString[op]\n\tif len(str) == 0 {\n\t\treturn fmt.Sprintf(\"Missing opcode 0x%x\", int(op))\n\t}\n\n\treturn str\n}\n\nvar stringToOp = map[string]OpCode{\n\t\"STOP\":           STOP,\n\t\"ADD\":            ADD,\n\t\"MUL\":            MUL,\n\t\"SUB\":            SUB,\n\t\"DIV\":            DIV,\n\t\"SDIV\":           SDIV,\n\t\"MOD\":            MOD,\n\t\"SMOD\":           SMOD,\n\t\"EXP\":            EXP,\n\t\"NOT\":            NOT,\n\t\"LT\":             LT,\n\t\"GT\":             GT,\n\t\"SLT\":            SLT,\n\t\"SGT\":            SGT,\n\t\"EQ\":             EQ,\n\t\"ISZERO\":         ISZERO,\n\t\"SIGNEXTEND\":     SIGNEXTEND,\n\t\"AND\":            AND,\n\t\"OR\":             OR,\n\t\"XOR\":            XOR,\n\t\"BYTE\":           BYTE,\n\t\"SHL\":            SHL,\n\t\"SHR\":            SHR,\n\t\"SAR\":            SAR,\n\t\"ADDMOD\":         ADDMOD,\n\t\"MULMOD\":         MULMOD,\n\t\"SHA3\":           SHA3,\n\t\"ADDRESS\":        ADDRESS,\n\t\"BALANCE\":        BALANCE,\n\t\"ORIGIN\":         ORIGIN,\n\t\"CALLER\":         CALLER,\n\t\"CALLVALUE\":      CALLVALUE,\n\t\"CALLDATALOAD\":   CALLDATALOAD,\n\t\"CALLDATASIZE\":   CALLDATASIZE,\n\t\"CALLDATACOPY\":   CALLDATACOPY,\n\t\"DELEGATECALL\":   DELEGATECALL,\n\t\"STATICCALL\":     STATICCALL,\n\t\"CODESIZE\":       CODESIZE,\n\t\"CODECOPY\":       CODECOPY,\n\t\"GASPRICE\":       GASPRICE,\n\t\"EXTCODESIZE\":    EXTCODESIZE,\n\t\"EXTCODECOPY\":    EXTCODECOPY,\n\t\"RETURNDATASIZE\": RETURNDATASIZE,\n\t\"RETURNDATACOPY\": RETURNDATACOPY,\n\t\"EXTCODEHASH\":    EXTCODEHASH,\n\t\"BLOCKHASH\":      BLOCKHASH,\n\t\"COINBASE\":       COINBASE,\n\t\"TIMESTAMP\":      TIMESTAMP,\n\t\"NUMBER\":         NUMBER,\n\t\"DIFFICULTY\":     DIFFICULTY,\n\t\"GASLIMIT\":       GASLIMIT,\n\t\"POP\":            POP,\n\t\"MLOAD\":          MLOAD,\n\t\"MSTORE\":         MSTORE,\n\t\"MSTORE8\":        MSTORE8,\n\t\"SLOAD\":          SLOAD,\n\t\"SSTORE\":         SSTORE,\n\t\"JUMP\":           JUMP,\n\t\"JUMPI\":          JUMPI,\n\t\"PC\":             PC,\n\t\"MSIZE\":          MSIZE,\n\t\"GAS\":            GAS,\n\t\"JUMPDEST\":       JUMPDEST,\n\t\"PUSH1\":          PUSH1,\n\t\"PUSH2\":          PUSH2,\n\t\"PUSH3\":          PUSH3,\n\t\"PUSH4\":          PUSH4,\n\t\"PUSH5\":          PUSH5,\n\t\"PUSH6\":          PUSH6,\n\t\"PUSH7\":          PUSH7,\n\t\"PUSH8\":          PUSH8,\n\t\"PUSH9\":          PUSH9,\n\t\"PUSH10\":         PUSH10,\n\t\"PUSH11\":         PUSH11,\n\t\"PUSH12\":         PUSH12,\n\t\"PUSH13\":         PUSH13,\n\t\"PUSH14\":         PUSH14,\n\t\"PUSH15\":         PUSH15,\n\t\"PUSH16\":         PUSH16,\n\t\"PUSH17\":         PUSH17,\n\t\"PUSH18\":         PUSH18,\n\t\"PUSH19\":         PUSH19,\n\t\"PUSH20\":         PUSH20,\n\t\"PUSH21\":         PUSH21,\n\t\"PUSH22\":         PUSH22,\n\t\"PUSH23\":         PUSH23,\n\t\"PUSH24\":         PUSH24,\n\t\"PUSH25\":         PUSH25,\n\t\"PUSH26\":         PUSH26,\n\t\"PUSH27\":         PUSH27,\n\t\"PUSH28\":         PUSH28,\n\t\"PUSH29\":         PUSH29,\n\t\"PUSH30\":         PUSH30,\n\t\"PUSH31\":         PUSH31,\n\t\"PUSH32\":         PUSH32,\n\t\"DUP1\":           DUP1,\n\t\"DUP2\":           DUP2,\n\t\"DUP3\":           DUP3,\n\t\"DUP4\":           DUP4,\n\t\"DUP5\":           DUP5,\n\t\"DUP6\":           DUP6,\n\t\"DUP7\":           DUP7,\n\t\"DUP8\":           DUP8,\n\t\"DUP9\":           DUP9,\n\t\"DUP10\":          DUP10,\n\t\"DUP11\":          DUP11,\n\t\"DUP12\":          DUP12,\n\t\"DUP13\":          DUP13,\n\t\"DUP14\":          DUP14,\n\t\"DUP15\":          DUP15,\n\t\"DUP16\":          DUP16,\n\t\"SWAP1\":          SWAP1,\n\t\"SWAP2\":          SWAP2,\n\t\"SWAP3\":          SWAP3,\n\t\"SWAP4\":          SWAP4,\n\t\"SWAP5\":          SWAP5,\n\t\"SWAP6\":          SWAP6,\n\t\"SWAP7\":          SWAP7,\n\t\"SWAP8\":          SWAP8,\n\t\"SWAP9\":          SWAP9,\n\t\"SWAP10\":         SWAP10,\n\t\"SWAP11\":         SWAP11,\n\t\"SWAP12\":         SWAP12,\n\t\"SWAP13\":         SWAP13,\n\t\"SWAP14\":         SWAP14,\n\t\"SWAP15\":         SWAP15,\n\t\"SWAP16\":         SWAP16,\n\t\"LOG0\":           LOG0,\n\t\"LOG1\":           LOG1,\n\t\"LOG2\":           LOG2,\n\t\"LOG3\":           LOG3,\n\t\"LOG4\":           LOG4,\n\t\"CREATE\":         CREATE,\n\t\"CREATE2\":        CREATE2,\n\t\"CALL\":           CALL,\n\t\"RETURN\":         RETURN,\n\t\"CALLCODE\":       CALLCODE,\n\t\"REVERT\":         REVERT,\n\t//\"SELFDESTRUCT\":   SELFDESTRUCT,\n}\n\n// StringToOp finds the opcode whose name is stored in `str`.\nfunc StringToOp(str string) OpCode {\n\treturn stringToOp[str]\n}\n"
  },
  {
    "path": "core/vm/runtime/doc.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package runtime provides a basic execution model for executing EVM code.\npackage runtime\n"
  },
  {
    "path": "core/vm/runtime/env.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage runtime\n\nimport (\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n)\n\nfunc NewEnv(cfg *Config) *vm.EVM {\n\tcontext := vm.Context{\n\t\t//CanTransfer: core.CanTransfer,\n\t\tTransfer: core.Transfer,\n\t\tGetHash:  func(uint64) common.Hash { return common.Hash{} },\n\n\t\tOrigin:      cfg.Origin,\n\t\tCoinbase:    cfg.Coinbase,\n\t\tBlockNumber: cfg.BlockNumber,\n\t\tTime:        cfg.Time,\n\t\tDifficulty:  cfg.Difficulty,\n\t\tGasLimit:    cfg.GasLimit,\n\t\tGasPrice:    cfg.GasPrice,\n\t}\n\n\treturn vm.NewEVM(context, cfg.State, cfg.ChainConfig, cfg.EVMConfig)\n}\n"
  },
  {
    "path": "core/vm/runtime/fuzz.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build gofuzz\n\npackage runtime\n\n// Fuzz is the basic entry point for the go-fuzz tool\n//\n// This returns 1 for valid parsable/runable code, 0\n// for invalid opcode.\nfunc Fuzz(input []byte) int {\n\t_, _, err := Execute(input, input, &Config{\n\t\tGasLimit: 3000000,\n\t})\n\n\t// invalid opcode\n\tif err != nil && len(err.Error()) > 6 && string(err.Error()[:7]) == \"invalid\" {\n\t\treturn 0\n\t}\n\n\treturn 1\n}\n"
  },
  {
    "path": "core/vm/runtime/runtime.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage runtime\n\nimport (\n\t\"math\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Config is a basic type specifying certain configuration flags for running\n// the EVM.\ntype Config struct {\n\tChainConfig *params.ChainConfig\n\tDifficulty  *big.Int\n\tOrigin      common.Address\n\tCoinbase    common.Address\n\tBlockNumber *big.Int\n\tTime        *big.Int\n\tGasLimit    uint64\n\tGasPrice    *big.Int\n\tValue       *big.Int\n\tDebug       bool\n\tEVMConfig   vm.Config\n\n\tState     *state.StateDB\n\tGetHashFn func(n uint64) common.Hash\n}\n\n// sets defaults on the config\nfunc setDefaults(cfg *Config) {\n\tif cfg.ChainConfig == nil {\n\t\tcfg.ChainConfig = &params.ChainConfig{\n\t\t\tChainID:             big.NewInt(1),\n\t\t\tAutumnTwilightBlock: new(big.Int),\n\t\t}\n\t}\n\n\tif cfg.Difficulty == nil {\n\t\tcfg.Difficulty = new(big.Int)\n\t}\n\tif cfg.Time == nil {\n\t\tcfg.Time = big.NewInt(time.Now().Unix())\n\t}\n\tif cfg.GasLimit == 0 {\n\t\tcfg.GasLimit = math.MaxUint64\n\t}\n\tif cfg.GasPrice == nil {\n\t\tcfg.GasPrice = new(big.Int)\n\t}\n\tif cfg.Value == nil {\n\t\tcfg.Value = new(big.Int)\n\t}\n\tif cfg.BlockNumber == nil {\n\t\tcfg.BlockNumber = new(big.Int)\n\t}\n\tif cfg.GetHashFn == nil {\n\t\tcfg.GetHashFn = func(n uint64) common.Hash {\n\t\t\treturn common.BytesToHash(crypto.Keccak256([]byte(new(big.Int).SetUint64(n).String())))\n\t\t}\n\t}\n}\n\n// Execute executes the code using the input as call data during the execution.\n// It returns the EVM's return value, the new state and an error if it failed.\n//\n// Executes sets up a in memory, temporarily, environment for the execution of\n// the given code. It makes sure that it's restored to it's original state afterwards.\nfunc Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) {\n\tif cfg == nil {\n\t\tcfg = new(Config)\n\t}\n\tsetDefaults(cfg)\n\n\tif cfg.State == nil {\n\t\tcfg.State, _ = state.New(state.NewDatabase(serodb.NewMemDatabase()), nil)\n\t}\n\tvar (\n\t\taddress = common.BytesToAddress([]byte(\"contract\"))\n\t\tvmenv   = NewEnv(cfg)\n\t\tsender  = vm.AccountRef(cfg.Origin)\n\t)\n\tcfg.State.CreateAccount(address)\n\t// set the receiver's (the executing contract) code for execution.\n\tcfg.State.SetCode(address, code)\n\t// Call the code with the given configuration.\n\tasset := assets.Asset{Tkn: &assets.Token{\n\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\tValue:    utils.U256(*cfg.Value),\n\t},\n\t}\n\tret, _, err, _ := vmenv.Call(\n\t\tsender,\n\t\tcommon.BytesToAddress([]byte(\"contract\")),\n\t\tinput,\n\t\tcfg.GasLimit,\n\t\t&asset,\n\t)\n\n\treturn ret, cfg.State, err\n}\n\n// Create executes the code using the EVM create method\nfunc Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) {\n\tif cfg == nil {\n\t\tcfg = new(Config)\n\t}\n\tsetDefaults(cfg)\n\n\tif cfg.State == nil {\n\t\tcfg.State, _ = state.New(state.NewDatabase(serodb.NewMemDatabase()), nil)\n\t}\n\tvar (\n\t\tvmenv  = NewEnv(cfg)\n\t\tsender = vm.AccountRef(cfg.Origin)\n\t)\n\n\tasset := assets.Asset{Tkn: &assets.Token{\n\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\tValue:    utils.U256(*cfg.Value),\n\t},\n\t}\n\tcode, address, leftOverGas, err := vmenv.Create(\n\t\tsender,\n\t\tinput,\n\t\tcfg.GasLimit,\n\t\t&asset,\n\t)\n\treturn code, address, leftOverGas, err\n}\n\n// Call executes the code given by the contract's address. It will return the\n// EVM's return value or an error if it failed.\n//\n// Call, unlike Execute, requires a config and also requires the State field to\n// be set.\nfunc Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, error) {\n\tsetDefaults(cfg)\n\n\tvmenv := NewEnv(cfg)\n\n\tsender := cfg.State.GetOrNewStateObject(cfg.Origin)\n\t// Call the code with the given configuration.\n\tasset := assets.Asset{Tkn: &assets.Token{\n\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\tValue:    utils.U256(*cfg.Value),\n\t},\n\t}\n\tret, leftOverGas, err, _ := vmenv.Call(\n\t\tsender,\n\t\taddress,\n\t\tinput,\n\t\tcfg.GasLimit,\n\t\t&asset,\n\t)\n\n\treturn ret, leftOverGas, err\n}\n"
  },
  {
    "path": "core/vm/runtime/runtime_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage runtime\n\nimport (\n\t\"math/big\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nfunc TestDefaults(t *testing.T) {\n\tcfg := new(Config)\n\tsetDefaults(cfg)\n\n\tif cfg.Difficulty == nil {\n\t\tt.Error(\"expected difficulty to be non nil\")\n\t}\n\n\tif cfg.Time == nil {\n\t\tt.Error(\"expected time to be non nil\")\n\t}\n\tif cfg.GasLimit == 0 {\n\t\tt.Error(\"didn't expect gaslimit to be zero\")\n\t}\n\tif cfg.GasPrice == nil {\n\t\tt.Error(\"expected time to be non nil\")\n\t}\n\tif cfg.Value == nil {\n\t\tt.Error(\"expected time to be non nil\")\n\t}\n\tif cfg.GetHashFn == nil {\n\t\tt.Error(\"expected time to be non nil\")\n\t}\n\tif cfg.BlockNumber == nil {\n\t\tt.Error(\"expected block number to be non nil\")\n\t}\n}\n\nfunc TestEVM(t *testing.T) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tt.Fatalf(\"crashed with: %v\", r)\n\t\t}\n\t}()\n\n\tExecute([]byte{\n\t\tbyte(vm.DIFFICULTY),\n\t\tbyte(vm.TIMESTAMP),\n\t\tbyte(vm.GASLIMIT),\n\t\tbyte(vm.PUSH1),\n\t\tbyte(vm.ORIGIN),\n\t\tbyte(vm.BLOCKHASH),\n\t\tbyte(vm.COINBASE),\n\t}, nil, nil)\n}\n\nfunc TestExecute(t *testing.T) {\n\tret, _, err := Execute([]byte{\n\t\tbyte(vm.PUSH1), 10,\n\t\tbyte(vm.PUSH1), 0,\n\t\tbyte(vm.MSTORE),\n\t\tbyte(vm.PUSH1), 32,\n\t\tbyte(vm.PUSH1), 0,\n\t\tbyte(vm.RETURN),\n\t}, nil, nil)\n\tif err != nil {\n\t\tt.Fatal(\"didn't expect error\", err)\n\t}\n\n\tnum := new(big.Int).SetBytes(ret)\n\tif num.Cmp(big.NewInt(10)) != 0 {\n\t\tt.Error(\"Expected 10, got\", num)\n\t}\n}\n\nfunc TestCall(t *testing.T) {\n\tstate, _ := state.New(state.NewDatabase(serodb.NewMemDatabase()), nil)\n\taddress := common.Base58ToAddress(\"3HsKvhwuahH1hzh2UrQSRopnpEAjvQ4wUTqvAWbvb5zbNLRAhY1nd4f5dPk1xVeRQ4aJC8nzNwf3t5y12JSzoKSc\")\n\tstate.SetCode(address, []byte{\n\t\tbyte(vm.PUSH1), 10,\n\t\tbyte(vm.PUSH1), 0,\n\t\tbyte(vm.MSTORE),\n\t\tbyte(vm.PUSH1), 32,\n\t\tbyte(vm.PUSH1), 0,\n\t\tbyte(vm.RETURN),\n\t})\n\n\tret, _, err := Call(address, nil, &Config{State: state})\n\tif err != nil {\n\t\tt.Fatal(\"didn't expect error\", err)\n\t}\n\n\tnum := new(big.Int).SetBytes(ret)\n\tif num.Cmp(big.NewInt(10)) != 0 {\n\t\tt.Error(\"Expected 10, got\", num)\n\t}\n}\n\nfunc BenchmarkCall(b *testing.B) {\n\tvar definition = `[{\"constant\":true,\"inputs\":[],\"name\":\"seller\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"abort\",\"outputs\":[],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"refund\",\"outputs\":[],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"buyer\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"confirmReceived\",\"outputs\":[],\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"confirmPurchase\",\"outputs\":[],\"type\":\"function\"},{\"inputs\":[],\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Aborted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"PurchaseConfirmed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"ItemReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"Refunded\",\"type\":\"event\"}]`\n\n\tvar code = common.Hex2Bytes(\"6060604052361561006c5760e060020a600035046308551a53811461007457806335a063b4146100865780633fa4f245146100a6578063590e1ae3146100af5780637150d8ae146100cf57806373fac6f0146100e1578063c19d93fb146100fe578063d696069714610112575b610131610002565b610133600154600160a060020a031681565b610131600154600160a060020a0390811633919091161461015057610002565b61014660005481565b610131600154600160a060020a039081163391909116146102d557610002565b610133600254600160a060020a031681565b610131600254600160a060020a0333811691161461023757610002565b61014660025460ff60a060020a9091041681565b61013160025460009060ff60a060020a9091041681146101cc57610002565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60025460009060a060020a900460ff16811461016b57610002565b600154600160a060020a03908116908290301631606082818181858883f150506002805460a060020a60ff02191660a160020a179055506040517f72c874aeff0b183a56e2b79c71b46e1aed4dee5e09862134b8821ba2fddbf8bf9250a150565b80546002023414806101dd57610002565b6002805460a060020a60ff021973ffffffffffffffffffffffffffffffffffffffff1990911633171660a060020a1790557fd5d55c8a68912e9a110618df8d5e2e83b8d83211c57a8ddd1203df92885dc881826060a15050565b60025460019060a060020a900460ff16811461025257610002565b60025460008054600160a060020a0390921691606082818181858883f150508354604051600160a060020a0391821694503090911631915082818181858883f150506002805460a060020a60ff02191660a160020a179055506040517fe89152acd703c9d8c7d28829d443260b411454d45394e7995815140c8cbcbcf79250a150565b60025460019060a060020a900460ff1681146102f057610002565b6002805460008054600160a060020a0390921692909102606082818181858883f150508354604051600160a060020a0391821694503090911631915082818181858883f150506002805460a060020a60ff02191660a160020a179055506040517f8616bbbbad963e4e65b1366f1d75dfb63f9e9704bbbf91fb01bec70849906cf79250a15056\")\n\n\tabi, err := abi.JSON(strings.NewReader(definition))\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\n\tcpurchase, err := abi.Pack(\"confirmPurchase\")\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\tcreceived, err := abi.Pack(\"confirmReceived\")\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\trefund, err := abi.Pack(\"refund\")\n\tif err != nil {\n\t\tb.Fatal(err)\n\t}\n\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\tfor j := 0; j < 400; j++ {\n\t\t\tExecute(code, cpurchase, nil)\n\t\t\tExecute(code, creceived, nil)\n\t\t\tExecute(code, refund, nil)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "core/vm/stack.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n)\n\n// Stack is an object for basic stack operations. Items popped to the stack are\n// expected to be changed and modified. stack does not take care of adding newly\n// initialised objects.\ntype Stack struct {\n\tdata []*big.Int\n}\n\nfunc newstack() *Stack {\n\treturn &Stack{data: make([]*big.Int, 0, 1024)}\n}\n\n// Data returns the underlying big.Int array.\nfunc (st *Stack) Data() []*big.Int {\n\treturn st.data\n}\n\nfunc (st *Stack) push(d *big.Int) {\n\t// NOTE push limit (1024) is checked in baseCheck\n\t//stackItem := new(big.Int).Set(d)\n\t//st.data = append(st.data, stackItem)\n\tst.data = append(st.data, d)\n}\nfunc (st *Stack) pushN(ds ...*big.Int) {\n\tst.data = append(st.data, ds...)\n}\n\nfunc (st *Stack) pop() (ret *big.Int) {\n\tret = st.data[len(st.data)-1]\n\tst.data = st.data[:len(st.data)-1]\n\treturn\n}\n\nfunc (st *Stack) len() int {\n\treturn len(st.data)\n}\n\nfunc (st *Stack) swap(n int) {\n\tst.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n]\n}\n\nfunc (st *Stack) dup(pool *intPool, n int) {\n\tst.push(pool.get().Set(st.data[st.len()-n]))\n}\n\nfunc (st *Stack) peek() *big.Int {\n\treturn st.data[st.len()-1]\n}\n\n// Back returns the n'th item in stack\nfunc (st *Stack) Back(n int) *big.Int {\n\treturn st.data[st.len()-n-1]\n}\n\nfunc (st *Stack) require(n int) error {\n\tif st.len() < n {\n\t\treturn fmt.Errorf(\"stack underflow (%d <=> %d)\", len(st.data), n)\n\t}\n\treturn nil\n}\n\n// Print dumps the content of the stack\nfunc (st *Stack) Print() {\n\tfmt.Println(\"### stack ###\")\n\tif len(st.data) > 0 {\n\t\tfor i, val := range st.data {\n\t\t\tfmt.Printf(\"%-3d  %v\\n\", i, val)\n\t\t}\n\t} else {\n\t\tfmt.Println(\"-- empty --\")\n\t}\n\tfmt.Println(\"#############\")\n}\n"
  },
  {
    "path": "core/vm/stack_table.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage vm\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nfunc makeStackFunc(pop, push int) stackValidationFunc {\n\treturn func(stack *Stack) error {\n\t\tif err := stack.require(pop); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif stack.len()+push-pop > int(params.StackLimit) {\n\t\t\treturn fmt.Errorf(\"stack limit reached %d (%d)\", stack.len(), params.StackLimit)\n\t\t}\n\t\treturn nil\n\t}\n}\n\nfunc makeDupStackFunc(n int) stackValidationFunc {\n\treturn makeStackFunc(n, n+1)\n}\n\nfunc makeSwapStackFunc(n int) stackValidationFunc {\n\treturn makeStackFunc(n, n)\n}\n"
  },
  {
    "path": "core/vote.go",
    "content": "package core\n"
  },
  {
    "path": "crypto/crypto.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage crypto\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"math/big\"\n\t\"os\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n)\n\nvar (\n\tsecp256k1N, _  = new(big.Int).SetString(\"fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\", 16)\n\tsecp256k1halfN = new(big.Int).Div(secp256k1N, big.NewInt(2))\n)\n\nvar errInvalidPubkey = errors.New(\"invalid secp256k1 public key\")\n\n// Keccak256 calculates and returns the Keccak256 hash of the input data.\nfunc Keccak256(data ...[]byte) []byte {\n\td := sha3.NewKeccak256()\n\tfor _, b := range data {\n\t\td.Write(b)\n\t}\n\treturn d.Sum(nil)\n}\n\n// Keccak256Hash calculates and returns the Keccak256 hash of the input data,\n// converting it to an internal Hash data structure.\nfunc Keccak256Hash(data ...[]byte) (h common.Hash) {\n\td := sha3.NewKeccak256()\n\tfor _, b := range data {\n\t\td.Write(b)\n\t}\n\td.Sum(h[:0])\n\treturn h\n}\n\n// Keccak512 calculates and returns the Keccak512 hash of the input data.\nfunc Keccak512(data ...[]byte) []byte {\n\td := sha3.NewKeccak512()\n\tfor _, b := range data {\n\t\td.Write(b)\n\t}\n\treturn d.Sum(nil)\n}\n\nfunc CreateAddress(b common.Address, nonce uint64, prefix []byte) common.Address {\n\tdata, _ := rlp.EncodeToBytes([]interface{}{b, nonce})\n\tdata = Keccak512(data)\n\tcopy(data[:], prefix)\n\treturn common.BytesToAddress(data)\n}\n\n// ToECDSA creates a private key with the given D value.\nfunc ToECDSA(d []byte) (*ecdsa.PrivateKey, error) {\n\treturn toECDSA(d, true)\n}\n\n// ToECDSAUnsafe blindly converts a binary blob to a private key. It should almost\n// never be used unless you are sure the input is valid and want to avoid hitting\n// errors due to bad origin encoding (0 prefixes cut off).\nfunc ToECDSAUnsafe(d []byte) *ecdsa.PrivateKey {\n\tpriv, _ := toECDSA(d, false)\n\treturn priv\n}\n\n// toECDSA creates a private key with the given D value. The strict parameter\n// controls whether the key's length should be enforced at the curve size or\n// it can also accept legacy encodings (0 prefixes).\nfunc toECDSA(d []byte, strict bool) (*ecdsa.PrivateKey, error) {\n\tpriv := new(ecdsa.PrivateKey)\n\tpriv.PublicKey.Curve = S256()\n\tif strict && 8*len(d) != priv.Params().BitSize {\n\t\treturn nil, fmt.Errorf(\"invalid length, need %d bits\", priv.Params().BitSize)\n\t}\n\tpriv.D = new(big.Int).SetBytes(d)\n\n\t// The priv.D must < N\n\tif priv.D.Cmp(secp256k1N) >= 0 {\n\t\treturn nil, fmt.Errorf(\"invalid private key, >=N\")\n\t}\n\t// The priv.D must not be zero or negative.\n\tif priv.D.Sign() <= 0 {\n\t\treturn nil, fmt.Errorf(\"invalid private key, zero or negative\")\n\t}\n\n\tpriv.PublicKey.X, priv.PublicKey.Y = priv.PublicKey.Curve.ScalarBaseMult(d)\n\tif priv.PublicKey.X == nil {\n\t\treturn nil, errors.New(\"invalid private key\")\n\t}\n\treturn priv, nil\n}\n\n// FromECDSA exports a private key into a binary dump.\nfunc FromECDSA(priv *ecdsa.PrivateKey) []byte {\n\tif priv == nil {\n\t\treturn nil\n\t}\n\treturn math.PaddedBigBytes(priv.D, priv.Params().BitSize/8)\n}\n\n// UnmarshalPubkey converts bytes to a secp256k1 public key.\nfunc UnmarshalPubkey(pub []byte) (*ecdsa.PublicKey, error) {\n\tx, y := elliptic.Unmarshal(S256(), pub)\n\tif x == nil {\n\t\treturn nil, errInvalidPubkey\n\t}\n\treturn &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}, nil\n}\n\nfunc FromECDSAPub(pub *ecdsa.PublicKey) []byte {\n\tif pub == nil || pub.X == nil || pub.Y == nil {\n\t\treturn nil\n\t}\n\treturn elliptic.Marshal(S256(), pub.X, pub.Y)\n}\n\n// HexToECDSA parses a secp256k1 private key.\nfunc HexToECDSA(hexkey string) (*ecdsa.PrivateKey, error) {\n\tb, err := hex.DecodeString(hexkey)\n\tif err != nil {\n\t\treturn nil, errors.New(\"invalid hex string\")\n\t}\n\treturn ToECDSA(b)\n}\n\n// LoadECDSA loads a secp256k1 private key from the given file.\nfunc LoadECDSA(file string) (*ecdsa.PrivateKey, error) {\n\tbuf := make([]byte, 64)\n\tfd, err := os.Open(file)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer fd.Close()\n\tif _, err := io.ReadFull(fd, buf); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkey, err := hex.DecodeString(string(buf))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn ToECDSA(key)\n}\n\n// SaveECDSA saves a secp256k1 private key to the given file with\n// restrictive permissions. The key data is saved hex-encoded.\nfunc SaveECDSA(file string, key *ecdsa.PrivateKey) error {\n\tk := hex.EncodeToString(FromECDSA(key))\n\treturn ioutil.WriteFile(file, []byte(k), 0600)\n}\n\nfunc GenerateKey() (*ecdsa.PrivateKey, error) {\n\treturn ecdsa.GenerateKey(S256(), rand.Reader)\n}\n\n// ValidateSignatureValues verifies whether the signature values are valid with\n// the given chain rules. The v value is assumed to be either 0 or 1.\nfunc ValidateSignatureValues(v byte, r, s *big.Int, homestead bool) bool {\n\tif r.Cmp(common.Big1) < 0 || s.Cmp(common.Big1) < 0 {\n\t\treturn false\n\t}\n\t// reject upper range of s values (ECDSA malleability)\n\t// see discussion in secp256k1/libsecp256k1/include/secp256k1.h\n\tif homestead && s.Cmp(secp256k1halfN) > 0 {\n\t\treturn false\n\t}\n\t// Frontier: allow s to be in full N range\n\treturn r.Cmp(secp256k1N) < 0 && s.Cmp(secp256k1N) < 0 && (v == 0 || v == 1)\n}\n\nfunc PrivkeyToTk(priv *ecdsa.PrivateKey, version int) (ret address.TKAddress) {\n\tprivKey := FromECDSA(priv)\n\tvar seed c_type.Uint256\n\tcopy(seed[:], privKey)\n\tsk := superzk.Seed2Sk(&seed, version)\n\tpubBytes, _ := superzk.Sk2Tk(&sk)\n\tcopy(ret[:], pubBytes[:])\n\treturn\n}\n\nfunc zeroBytes(bytes []byte) {\n\tfor i := range bytes {\n\t\tbytes[i] = 0\n\t}\n}\n"
  },
  {
    "path": "crypto/ecies/.gitignore",
    "content": "# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# Folders\n_obj\n_test\n\n# Architecture specific extensions/prefixes\n*.[568vq]\n[568vq].out\n\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n\n_testmain.go\n\n*.exe\n\n*~\n"
  },
  {
    "path": "crypto/ecies/LICENSE",
    "content": "Copyright (c) 2013 Kyle Isom <kyle@tyrfingr.is>\nCopyright (c) 2012 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "crypto/ecies/README",
    "content": "# NOTE\n\nThis implementation is direct fork of Kylom's implementation. I claim no authorship over this code apart from some minor modifications.\nPlease be aware this code **has not yet been reviewed**.\n\necies implements the Elliptic Curve Integrated Encryption Scheme.\n\nThe package is designed to be compliant with the appropriate NIST\nstandards, and therefore doesn't support the full SEC 1 algorithm set.\n\n\nSTATUS:\n\necies should be ready for use. The ASN.1 support is only complete so\nfar as to supported the listed algorithms before.\n\n\nCAVEATS\n\n1. CMAC support is currently not present.\n\n\nSUPPORTED ALGORITHMS\n\n        SYMMETRIC CIPHERS               HASH FUNCTIONS\n             AES128                         SHA-1\n             AES192                        SHA-224\n             AES256                        SHA-256\n                                           SHA-384\n        ELLIPTIC CURVE                     SHA-512\n             P256\n             P384\t\t    KEY DERIVATION FUNCTION\n             P521\t       NIST SP 800-65a Concatenation KDF\n\nCurve P224 isn't supported because it does not provide a minimum security\nlevel of AES128 with HMAC-SHA1. According to NIST SP 800-57, the security\nlevel of P224 is 112 bits of security. Symmetric ciphers use CTR-mode;\nmessage tags are computed using HMAC-<HASH> function.\n\n\nCURVE SELECTION\n\nAccording to NIST SP 800-57, the following curves should be selected:\n\n    +----------------+-------+\n    | SYMMETRIC SIZE | CURVE |\n    +----------------+-------+\n    |     128-bit    |  P256 |\n    +----------------+-------+\n    |     192-bit    |  P384 |\n    +----------------+-------+\n    |     256-bit    |  P521 |\n    +----------------+-------+\n\n\nTODO\n\n1. Look at serialising the parameters with the SEC 1 ASN.1 module.\n2. Validate ASN.1 formats with SEC 1.\n\n\nTEST VECTORS\n\nThe only test vectors I've found so far date from 1993, predating AES\nand including only 163-bit curves. Therefore, there are no published\ntest vectors to compare to.\n\n\nLICENSE\n\necies is released under the same license as the Go source code. See the\nLICENSE file for details.\n\n\nREFERENCES\n\n* SEC (Standard for Efficient Cryptography) 1, version 2.0: Elliptic\n  Curve Cryptography; Certicom, May 2009.\n  http://www.secg.org/sec1-v2.pdf\n* GEC (Guidelines for Efficient Cryptography) 2, version 0.3: Test\n  Vectors for SEC 1; Certicom, September 1999.\n  http://read.pudn.com/downloads168/doc/772358/TestVectorsforSEC%201-gec2.pdf\n* NIST SP 800-56a: Recommendation for Pair-Wise Key Establishment Schemes\n  Using Discrete Logarithm Cryptography. National Institute of Standards\n  and Technology, May 2007.\n  http://csrc.nist.gov/publications/nistpubs/800-56A/SP800-56A_Revision1_Mar08-2007.pdf\n* Suite B Implementer’s Guide to NIST SP 800-56A. National Security\n  Agency, July 28, 2009.\n  http://www.nsa.gov/ia/_files/SuiteB_Implementer_G-113808.pdf\n* NIST SP 800-57: Recommendation for Key Management – Part 1: General\n  (Revision 3). National Institute of Standards and Technology, July\n  2012.\n  http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57_part1_rev3_general.pdf\n\n"
  },
  {
    "path": "crypto/ecies/ecies.go",
    "content": "// Copyright (c) 2013 Kyle Isom <kyle@tyrfingr.is>\n// Copyright (c) 2012 The Go Authors. 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 are\n// met:\n//\n//    * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//    * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage ecies\n\nimport (\n\t\"crypto/cipher\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/hmac\"\n\t\"crypto/subtle\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"math/big\"\n)\n\nvar (\n\tErrImport                     = fmt.Errorf(\"ecies: failed to import key\")\n\tErrInvalidCurve               = fmt.Errorf(\"ecies: invalid elliptic curve\")\n\tErrInvalidParams              = fmt.Errorf(\"ecies: invalid ECIES parameters\")\n\tErrInvalidPublicKey           = fmt.Errorf(\"ecies: invalid public key\")\n\tErrSharedKeyIsPointAtInfinity = fmt.Errorf(\"ecies: shared key is point at infinity\")\n\tErrSharedKeyTooBig            = fmt.Errorf(\"ecies: shared key params are too big\")\n)\n\n// PublicKey is a representation of an elliptic curve public key.\ntype PublicKey struct {\n\tX *big.Int\n\tY *big.Int\n\telliptic.Curve\n\tParams *ECIESParams\n}\n\n// Export an ECIES public key as an ECDSA public key.\nfunc (pub *PublicKey) ExportECDSA() *ecdsa.PublicKey {\n\treturn &ecdsa.PublicKey{Curve: pub.Curve, X: pub.X, Y: pub.Y}\n}\n\n// Import an ECDSA public key as an ECIES public key.\nfunc ImportECDSAPublic(pub *ecdsa.PublicKey) *PublicKey {\n\treturn &PublicKey{\n\t\tX:      pub.X,\n\t\tY:      pub.Y,\n\t\tCurve:  pub.Curve,\n\t\tParams: ParamsFromCurve(pub.Curve),\n\t}\n}\n\n// PrivateKey is a representation of an elliptic curve private key.\ntype PrivateKey struct {\n\tPublicKey\n\tD *big.Int\n}\n\n// Export an ECIES private key as an ECDSA private key.\nfunc (prv *PrivateKey) ExportECDSA() *ecdsa.PrivateKey {\n\tpub := &prv.PublicKey\n\tpubECDSA := pub.ExportECDSA()\n\treturn &ecdsa.PrivateKey{PublicKey: *pubECDSA, D: prv.D}\n}\n\n// Import an ECDSA private key as an ECIES private key.\nfunc ImportECDSA(prv *ecdsa.PrivateKey) *PrivateKey {\n\tpub := ImportECDSAPublic(&prv.PublicKey)\n\treturn &PrivateKey{*pub, prv.D}\n}\n\n// Generate an elliptic curve public / private keypair. If params is nil,\n// the recommended default parameters for the key will be chosen.\nfunc GenerateKey(rand io.Reader, curve elliptic.Curve, params *ECIESParams) (prv *PrivateKey, err error) {\n\tpb, x, y, err := elliptic.GenerateKey(curve, rand)\n\tif err != nil {\n\t\treturn\n\t}\n\tprv = new(PrivateKey)\n\tprv.PublicKey.X = x\n\tprv.PublicKey.Y = y\n\tprv.PublicKey.Curve = curve\n\tprv.D = new(big.Int).SetBytes(pb)\n\tif params == nil {\n\t\tparams = ParamsFromCurve(curve)\n\t}\n\tprv.PublicKey.Params = params\n\treturn\n}\n\n// MaxSharedKeyLength returns the maximum length of the shared key the\n// public key can produce.\nfunc MaxSharedKeyLength(pub *PublicKey) int {\n\treturn (pub.Curve.Params().BitSize + 7) / 8\n}\n\n// ECDH key agreement method used to establish secret keys for encryption.\nfunc (prv *PrivateKey) GenerateShared(pub *PublicKey, skLen, macLen int) (sk []byte, err error) {\n\tif prv.PublicKey.Curve != pub.Curve {\n\t\treturn nil, ErrInvalidCurve\n\t}\n\tif skLen+macLen > MaxSharedKeyLength(pub) {\n\t\treturn nil, ErrSharedKeyTooBig\n\t}\n\n\tx, _ := pub.Curve.ScalarMult(pub.X, pub.Y, prv.D.Bytes())\n\tif x == nil {\n\t\treturn nil, ErrSharedKeyIsPointAtInfinity\n\t}\n\n\tsk = make([]byte, skLen+macLen)\n\tskBytes := x.Bytes()\n\tcopy(sk[len(sk)-len(skBytes):], skBytes)\n\treturn sk, nil\n}\n\nvar (\n\tErrKeyDataTooLong = fmt.Errorf(\"ecies: can't supply requested key data\")\n\tErrSharedTooLong  = fmt.Errorf(\"ecies: shared secret is too long\")\n\tErrInvalidMessage = fmt.Errorf(\"ecies: invalid message\")\n)\n\nvar (\n\tbig2To32   = new(big.Int).Exp(big.NewInt(2), big.NewInt(32), nil)\n\tbig2To32M1 = new(big.Int).Sub(big2To32, big.NewInt(1))\n)\n\nfunc incCounter(ctr []byte) {\n\tif ctr[3]++; ctr[3] != 0 {\n\t\treturn\n\t}\n\tif ctr[2]++; ctr[2] != 0 {\n\t\treturn\n\t}\n\tif ctr[1]++; ctr[1] != 0 {\n\t\treturn\n\t}\n\tif ctr[0]++; ctr[0] != 0 {\n\t\treturn\n\t}\n}\n\n// NIST SP 800-56 Concatenation Key Derivation Function (see section 5.8.1).\nfunc concatKDF(hash hash.Hash, z, s1 []byte, kdLen int) (k []byte, err error) {\n\tif s1 == nil {\n\t\ts1 = make([]byte, 0)\n\t}\n\n\treps := ((kdLen + 7) * 8) / (hash.BlockSize() * 8)\n\tif big.NewInt(int64(reps)).Cmp(big2To32M1) > 0 {\n\t\tfmt.Println(big2To32M1)\n\t\treturn nil, ErrKeyDataTooLong\n\t}\n\n\tcounter := []byte{0, 0, 0, 1}\n\tk = make([]byte, 0)\n\n\tfor i := 0; i <= reps; i++ {\n\t\thash.Write(counter)\n\t\thash.Write(z)\n\t\thash.Write(s1)\n\t\tk = append(k, hash.Sum(nil)...)\n\t\thash.Reset()\n\t\tincCounter(counter)\n\t}\n\n\tk = k[:kdLen]\n\treturn\n}\n\n// messageTag computes the MAC of a message (called the tag) as per\n// SEC 1, 3.5.\nfunc messageTag(hash func() hash.Hash, km, msg, shared []byte) []byte {\n\tmac := hmac.New(hash, km)\n\tmac.Write(msg)\n\tmac.Write(shared)\n\ttag := mac.Sum(nil)\n\treturn tag\n}\n\n// Generate an initialisation vector for CTR mode.\nfunc generateIV(params *ECIESParams, rand io.Reader) (iv []byte, err error) {\n\tiv = make([]byte, params.BlockSize)\n\t_, err = io.ReadFull(rand, iv)\n\treturn\n}\n\n// symEncrypt carries out CTR encryption using the block cipher specified in the\n// parameters.\nfunc symEncrypt(rand io.Reader, params *ECIESParams, key, m []byte) (ct []byte, err error) {\n\tc, err := params.Cipher(key)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tiv, err := generateIV(params, rand)\n\tif err != nil {\n\t\treturn\n\t}\n\tctr := cipher.NewCTR(c, iv)\n\n\tct = make([]byte, len(m)+params.BlockSize)\n\tcopy(ct, iv)\n\tctr.XORKeyStream(ct[params.BlockSize:], m)\n\treturn\n}\n\n// symDecrypt carries out CTR decryption using the block cipher specified in\n// the parameters\nfunc symDecrypt(params *ECIESParams, key, ct []byte) (m []byte, err error) {\n\tc, err := params.Cipher(key)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tctr := cipher.NewCTR(c, ct[:params.BlockSize])\n\n\tm = make([]byte, len(ct)-params.BlockSize)\n\tctr.XORKeyStream(m, ct[params.BlockSize:])\n\treturn\n}\n\n// Encrypt encrypts a message using ECIES as specified in SEC 1, 5.1.\n//\n// s1 and s2 contain shared information that is not part of the resulting\n// ciphertext. s1 is fed into key derivation, s2 is fed into the MAC. If the\n// shared information parameters aren't being used, they should be nil.\nfunc Encrypt(rand io.Reader, pub *PublicKey, m, s1, s2 []byte) (ct []byte, err error) {\n\tparams := pub.Params\n\tif params == nil {\n\t\tif params = ParamsFromCurve(pub.Curve); params == nil {\n\t\t\terr = ErrUnsupportedECIESParameters\n\t\t\treturn\n\t\t}\n\t}\n\tR, err := GenerateKey(rand, pub.Curve, params)\n\tif err != nil {\n\t\treturn\n\t}\n\n\thash := params.Hash()\n\tz, err := R.GenerateShared(pub, params.KeyLen, params.KeyLen)\n\tif err != nil {\n\t\treturn\n\t}\n\tK, err := concatKDF(hash, z, s1, params.KeyLen+params.KeyLen)\n\tif err != nil {\n\t\treturn\n\t}\n\tKe := K[:params.KeyLen]\n\tKm := K[params.KeyLen:]\n\thash.Write(Km)\n\tKm = hash.Sum(nil)\n\thash.Reset()\n\n\tem, err := symEncrypt(rand, params, Ke, m)\n\tif err != nil || len(em) <= params.BlockSize {\n\t\treturn\n\t}\n\n\td := messageTag(params.Hash, Km, em, s2)\n\n\tRb := elliptic.Marshal(pub.Curve, R.PublicKey.X, R.PublicKey.Y)\n\tct = make([]byte, len(Rb)+len(em)+len(d))\n\tcopy(ct, Rb)\n\tcopy(ct[len(Rb):], em)\n\tcopy(ct[len(Rb)+len(em):], d)\n\treturn\n}\n\n// Decrypt decrypts an ECIES ciphertext.\nfunc (prv *PrivateKey) Decrypt(c, s1, s2 []byte) (m []byte, err error) {\n\tif len(c) == 0 {\n\t\treturn nil, ErrInvalidMessage\n\t}\n\tparams := prv.PublicKey.Params\n\tif params == nil {\n\t\tif params = ParamsFromCurve(prv.PublicKey.Curve); params == nil {\n\t\t\terr = ErrUnsupportedECIESParameters\n\t\t\treturn\n\t\t}\n\t}\n\thash := params.Hash()\n\n\tvar (\n\t\trLen   int\n\t\thLen   int = hash.Size()\n\t\tmStart int\n\t\tmEnd   int\n\t)\n\n\tswitch c[0] {\n\tcase 2, 3, 4:\n\t\trLen = (prv.PublicKey.Curve.Params().BitSize + 7) / 4\n\t\tif len(c) < (rLen + hLen + 1) {\n\t\t\terr = ErrInvalidMessage\n\t\t\treturn\n\t\t}\n\tdefault:\n\t\terr = ErrInvalidPublicKey\n\t\treturn\n\t}\n\n\tmStart = rLen\n\tmEnd = len(c) - hLen\n\n\tR := new(PublicKey)\n\tR.Curve = prv.PublicKey.Curve\n\tR.X, R.Y = elliptic.Unmarshal(R.Curve, c[:rLen])\n\tif R.X == nil {\n\t\terr = ErrInvalidPublicKey\n\t\treturn\n\t}\n\tif !R.Curve.IsOnCurve(R.X, R.Y) {\n\t\terr = ErrInvalidCurve\n\t\treturn\n\t}\n\n\tz, err := prv.GenerateShared(R, params.KeyLen, params.KeyLen)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tK, err := concatKDF(hash, z, s1, params.KeyLen+params.KeyLen)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tKe := K[:params.KeyLen]\n\tKm := K[params.KeyLen:]\n\thash.Write(Km)\n\tKm = hash.Sum(nil)\n\thash.Reset()\n\n\td := messageTag(params.Hash, Km, c[mStart:mEnd], s2)\n\tif subtle.ConstantTimeCompare(c[mEnd:], d) != 1 {\n\t\terr = ErrInvalidMessage\n\t\treturn\n\t}\n\n\tm, err = symDecrypt(params, Ke, c[mStart:mEnd])\n\treturn\n}\n"
  },
  {
    "path": "crypto/ecies/ecies_test.go",
    "content": "// Copyright (c) 2013 Kyle Isom <kyle@tyrfingr.is>\n// Copyright (c) 2012 The Go Authors. 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 are\n// met:\n//\n//    * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//    * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage ecies\n\nimport (\n\t\"bytes\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"flag\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\nvar dumpEnc bool\n\nfunc init() {\n\tflDump := flag.Bool(\"dump\", false, \"write encrypted test message to file\")\n\tflag.Parse()\n\tdumpEnc = *flDump\n}\n\n// Ensure the KDF generates appropriately sized keys.\nfunc TestKDF(t *testing.T) {\n\tmsg := []byte(\"Hello, world\")\n\th := sha256.New()\n\n\tk, err := concatKDF(h, msg, nil, 64)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\tif len(k) != 64 {\n\t\tfmt.Printf(\"KDF: generated key is the wrong size (%d instead of 64\\n\", len(k))\n\t\tt.FailNow()\n\t}\n}\n\nvar ErrBadSharedKeys = fmt.Errorf(\"ecies: shared keys don't match\")\n\n// cmpParams compares a set of ECIES parameters. We assume, as per the\n// docs, that AES is the only supported symmetric encryption algorithm.\nfunc cmpParams(p1, p2 *ECIESParams) bool {\n\treturn p1.hashAlgo == p2.hashAlgo &&\n\t\tp1.KeyLen == p2.KeyLen &&\n\t\tp1.BlockSize == p2.BlockSize\n}\n\n// cmpPublic returns true if the two public keys represent the same pojnt.\nfunc cmpPublic(pub1, pub2 PublicKey) bool {\n\tif pub1.X == nil || pub1.Y == nil {\n\t\tfmt.Println(ErrInvalidPublicKey.Error())\n\t\treturn false\n\t}\n\tif pub2.X == nil || pub2.Y == nil {\n\t\tfmt.Println(ErrInvalidPublicKey.Error())\n\t\treturn false\n\t}\n\tpub1Out := elliptic.Marshal(pub1.Curve, pub1.X, pub1.Y)\n\tpub2Out := elliptic.Marshal(pub2.Curve, pub2.X, pub2.Y)\n\n\treturn bytes.Equal(pub1Out, pub2Out)\n}\n\n// cmpPrivate returns true if the two private keys are the same.\nfunc cmpPrivate(prv1, prv2 *PrivateKey) bool {\n\tif prv1 == nil || prv1.D == nil {\n\t\treturn false\n\t} else if prv2 == nil || prv2.D == nil {\n\t\treturn false\n\t} else if prv1.D.Cmp(prv2.D) != 0 {\n\t\treturn false\n\t} else {\n\t\treturn cmpPublic(prv1.PublicKey, prv2.PublicKey)\n\t}\n}\n\n// Validate the ECDH component.\nfunc TestSharedKey(t *testing.T) {\n\tprv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\tskLen := MaxSharedKeyLength(&prv1.PublicKey) / 2\n\n\tprv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tsk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tsk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tif !bytes.Equal(sk1, sk2) {\n\t\tfmt.Println(ErrBadSharedKeys.Error())\n\t\tt.FailNow()\n\t}\n}\n\nfunc TestSharedKeyPadding(t *testing.T) {\n\t// sanity checks\n\tprv0 := hexKey(\"1adf5c18167d96a1f9a0b1ef63be8aa27eaf6032c233b2b38f7850cf5b859fd9\")\n\tprv1 := hexKey(\"0097a076fc7fcd9208240668e31c9abee952cbb6e375d1b8febc7499d6e16f1a\")\n\tx0, _ := new(big.Int).SetString(\"1a8ed022ff7aec59dc1b440446bdda5ff6bcb3509a8b109077282b361efffbd8\", 16)\n\tx1, _ := new(big.Int).SetString(\"6ab3ac374251f638d0abb3ef596d1dc67955b507c104e5f2009724812dc027b8\", 16)\n\ty0, _ := new(big.Int).SetString(\"e040bd480b1deccc3bc40bd5b1fdcb7bfd352500b477cb9471366dbd4493f923\", 16)\n\ty1, _ := new(big.Int).SetString(\"8ad915f2b503a8be6facab6588731fefeb584fd2dfa9a77a5e0bba1ec439e4fa\", 16)\n\n\tif prv0.PublicKey.X.Cmp(x0) != 0 {\n\t\tt.Errorf(\"mismatched prv0.X:\\nhave: %x\\nwant: %x\\n\", prv0.PublicKey.X.Bytes(), x0.Bytes())\n\t}\n\tif prv0.PublicKey.Y.Cmp(y0) != 0 {\n\t\tt.Errorf(\"mismatched prv0.Y:\\nhave: %x\\nwant: %x\\n\", prv0.PublicKey.Y.Bytes(), y0.Bytes())\n\t}\n\tif prv1.PublicKey.X.Cmp(x1) != 0 {\n\t\tt.Errorf(\"mismatched prv1.X:\\nhave: %x\\nwant: %x\\n\", prv1.PublicKey.X.Bytes(), x1.Bytes())\n\t}\n\tif prv1.PublicKey.Y.Cmp(y1) != 0 {\n\t\tt.Errorf(\"mismatched prv1.Y:\\nhave: %x\\nwant: %x\\n\", prv1.PublicKey.Y.Bytes(), y1.Bytes())\n\t}\n\n\t// test shared secret generation\n\tsk1, err := prv0.GenerateShared(&prv1.PublicKey, 16, 16)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t}\n\n\tsk2, err := prv1.GenerateShared(&prv0.PublicKey, 16, 16)\n\tif err != nil {\n\t\tt.Fatal(err.Error())\n\t}\n\n\tif !bytes.Equal(sk1, sk2) {\n\t\tt.Fatal(ErrBadSharedKeys.Error())\n\t}\n}\n\n// Verify that the key generation code fails when too much key data is\n// requested.\nfunc TestTooBigSharedKey(t *testing.T) {\n\tprv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tprv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\t_, err = prv1.GenerateShared(&prv2.PublicKey, 32, 32)\n\tif err != ErrSharedKeyTooBig {\n\t\tfmt.Println(\"ecdh: shared key should be too large for curve\")\n\t\tt.FailNow()\n\t}\n\n\t_, err = prv2.GenerateShared(&prv1.PublicKey, 32, 32)\n\tif err != ErrSharedKeyTooBig {\n\t\tfmt.Println(\"ecdh: shared key should be too large for curve\")\n\t\tt.FailNow()\n\t}\n}\n\n// Benchmark the generation of P256 keys.\nfunc BenchmarkGenerateKeyP256(b *testing.B) {\n\tfor i := 0; i < b.N; i++ {\n\t\tif _, err := GenerateKey(rand.Reader, elliptic.P256(), nil); err != nil {\n\t\t\tfmt.Println(err.Error())\n\t\t\tb.FailNow()\n\t\t}\n\t}\n}\n\n// Benchmark the generation of P256 shared keys.\nfunc BenchmarkGenSharedKeyP256(b *testing.B) {\n\tprv, err := GenerateKey(rand.Reader, elliptic.P256(), nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tb.FailNow()\n\t}\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := prv.GenerateShared(&prv.PublicKey, 16, 16)\n\t\tif err != nil {\n\t\t\tfmt.Println(err.Error())\n\t\t\tb.FailNow()\n\t\t}\n\t}\n}\n\n// Benchmark the generation of S256 shared keys.\nfunc BenchmarkGenSharedKeyS256(b *testing.B) {\n\tprv, err := GenerateKey(rand.Reader, crypto.S256(), nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tb.FailNow()\n\t}\n\tb.ResetTimer()\n\tfor i := 0; i < b.N; i++ {\n\t\t_, err := prv.GenerateShared(&prv.PublicKey, 16, 16)\n\t\tif err != nil {\n\t\t\tfmt.Println(err.Error())\n\t\t\tb.FailNow()\n\t\t}\n\t}\n}\n\n// Verify that an encrypted message can be successfully decrypted.\nfunc TestEncryptDecrypt(t *testing.T) {\n\tprv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tprv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tmessage := []byte(\"Hello, world.\")\n\tct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tpt, err := prv2.Decrypt(ct, nil, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tif !bytes.Equal(pt, message) {\n\t\tfmt.Println(\"ecies: plaintext doesn't match message\")\n\t\tt.FailNow()\n\t}\n\n\t_, err = prv1.Decrypt(ct, nil, nil)\n\tif err == nil {\n\t\tfmt.Println(\"ecies: encryption should not have succeeded\")\n\t\tt.FailNow()\n\t}\n}\n\nfunc TestDecryptShared2(t *testing.T) {\n\tprv, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tmessage := []byte(\"Hello, world.\")\n\tshared2 := []byte(\"shared data 2\")\n\tct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, shared2)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Check that decrypting with correct shared data works.\n\tpt, err := prv.Decrypt(ct, nil, shared2)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif !bytes.Equal(pt, message) {\n\t\tt.Fatal(\"ecies: plaintext doesn't match message\")\n\t}\n\n\t// Decrypting without shared data or incorrect shared data fails.\n\tif _, err = prv.Decrypt(ct, nil, nil); err == nil {\n\t\tt.Fatal(\"ecies: decrypting without shared data didn't fail\")\n\t}\n\tif _, err = prv.Decrypt(ct, nil, []byte(\"garbage\")); err == nil {\n\t\tt.Fatal(\"ecies: decrypting with incorrect shared data didn't fail\")\n\t}\n}\n\ntype testCase struct {\n\tCurve    elliptic.Curve\n\tName     string\n\tExpected *ECIESParams\n}\n\nvar testCases = []testCase{\n\t{\n\t\tCurve:    elliptic.P256(),\n\t\tName:     \"P256\",\n\t\tExpected: ECIES_AES128_SHA256,\n\t},\n\t{\n\t\tCurve:    elliptic.P384(),\n\t\tName:     \"P384\",\n\t\tExpected: ECIES_AES256_SHA384,\n\t},\n\t{\n\t\tCurve:    elliptic.P521(),\n\t\tName:     \"P521\",\n\t\tExpected: ECIES_AES256_SHA512,\n\t},\n}\n\n// Test parameter selection for each curve, and that P224 fails automatic\n// parameter selection (see README for a discussion of P224). Ensures that\n// selecting a set of parameters automatically for the given curve works.\nfunc TestParamSelection(t *testing.T) {\n\tfor _, c := range testCases {\n\t\ttestParamSelection(t, c)\n\t}\n}\n\nfunc testParamSelection(t *testing.T, c testCase) {\n\tparams := ParamsFromCurve(c.Curve)\n\tif params == nil && c.Expected != nil {\n\t\tfmt.Printf(\"%s (%s)\\n\", ErrInvalidParams.Error(), c.Name)\n\t\tt.FailNow()\n\t} else if params != nil && !cmpParams(params, c.Expected) {\n\t\tfmt.Printf(\"ecies: parameters should be invalid (%s)\\n\",\n\t\t\tc.Name)\n\t\tt.FailNow()\n\t}\n\n\tprv1, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%s (%s)\\n\", err.Error(), c.Name)\n\t\tt.FailNow()\n\t}\n\n\tprv2, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%s (%s)\\n\", err.Error(), c.Name)\n\t\tt.FailNow()\n\t}\n\n\tmessage := []byte(\"Hello, world.\")\n\tct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%s (%s)\\n\", err.Error(), c.Name)\n\t\tt.FailNow()\n\t}\n\n\tpt, err := prv2.Decrypt(ct, nil, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"%s (%s)\\n\", err.Error(), c.Name)\n\t\tt.FailNow()\n\t}\n\n\tif !bytes.Equal(pt, message) {\n\t\tfmt.Printf(\"ecies: plaintext doesn't match message (%s)\\n\",\n\t\t\tc.Name)\n\t\tt.FailNow()\n\t}\n\n\t_, err = prv1.Decrypt(ct, nil, nil)\n\tif err == nil {\n\t\tfmt.Printf(\"ecies: encryption should not have succeeded (%s)\\n\",\n\t\t\tc.Name)\n\t\tt.FailNow()\n\t}\n\n}\n\n// Ensure that the basic public key validation in the decryption operation\n// works.\nfunc TestBasicKeyValidation(t *testing.T) {\n\tbadBytes := []byte{0, 1, 5, 6, 7, 8, 9}\n\n\tprv, err := GenerateKey(rand.Reader, DefaultCurve, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tmessage := []byte(\"Hello, world.\")\n\tct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, nil)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tfor _, b := range badBytes {\n\t\tct[0] = b\n\t\t_, err := prv.Decrypt(ct, nil, nil)\n\t\tif err != ErrInvalidPublicKey {\n\t\t\tfmt.Println(\"ecies: validated an invalid key\")\n\t\t\tt.FailNow()\n\t\t}\n\t}\n}\n\nfunc TestBox(t *testing.T) {\n\tprv1 := hexKey(\"4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f\")\n\tprv2 := hexKey(\"d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a\")\n\tpub2 := &prv2.PublicKey\n\n\tmessage := []byte(\"Hello, world.\")\n\tct, err := Encrypt(rand.Reader, pub2, message, nil, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\tpt, err := prv2.Decrypt(ct, nil, nil)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\tif !bytes.Equal(pt, message) {\n\t\tt.Fatal(\"ecies: plaintext doesn't match message\")\n\t}\n\tif _, err = prv1.Decrypt(ct, nil, nil); err == nil {\n\t\tt.Fatal(\"ecies: encryption should not have succeeded\")\n\t}\n}\n\n// Verify GenerateShared against static values - useful when\n// debugging changes in underlying libs\nfunc TestSharedKeyStatic(t *testing.T) {\n\tprv1 := hexKey(\"7ebbc6a8358bc76dd73ebc557056702c8cfc34e5cfcd90eb83af0347575fd2ad\")\n\tprv2 := hexKey(\"6a3d6396903245bba5837752b9e0348874e72db0c4e11e9c485a81b4ea4353b9\")\n\n\tskLen := MaxSharedKeyLength(&prv1.PublicKey) / 2\n\n\tsk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tsk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen)\n\tif err != nil {\n\t\tfmt.Println(err.Error())\n\t\tt.FailNow()\n\t}\n\n\tif !bytes.Equal(sk1, sk2) {\n\t\tfmt.Println(ErrBadSharedKeys.Error())\n\t\tt.FailNow()\n\t}\n\n\tsk, _ := hex.DecodeString(\"167ccc13ac5e8a26b131c3446030c60fbfac6aa8e31149d0869f93626a4cdf62\")\n\tif !bytes.Equal(sk1, sk) {\n\t\tt.Fatalf(\"shared secret mismatch: want: %x have: %x\", sk, sk1)\n\t}\n}\n\nfunc hexKey(prv string) *PrivateKey {\n\tkey, err := crypto.HexToECDSA(prv)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn ImportECDSA(key)\n}\n"
  },
  {
    "path": "crypto/ecies/params.go",
    "content": "// Copyright (c) 2013 Kyle Isom <kyle@tyrfingr.is>\n// Copyright (c) 2012 The Go Authors. 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 are\n// met:\n//\n//    * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//    * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage ecies\n\n// This file contains parameters for ECIES encryption, specifying the\n// symmetric encryption and HMAC parameters.\n\nimport (\n\t\"crypto\"\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/elliptic\"\n\t\"crypto/sha256\"\n\t\"crypto/sha512\"\n\t\"fmt\"\n\t\"hash\"\n\n\tethcrypto \"github.com/sero-cash/go-sero/crypto\"\n)\n\nvar (\n\tDefaultCurve                  = ethcrypto.S256()\n\tErrUnsupportedECDHAlgorithm   = fmt.Errorf(\"ecies: unsupported ECDH algorithm\")\n\tErrUnsupportedECIESParameters = fmt.Errorf(\"ecies: unsupported ECIES parameters\")\n)\n\ntype ECIESParams struct {\n\tHash      func() hash.Hash // hash function\n\thashAlgo  crypto.Hash\n\tCipher    func([]byte) (cipher.Block, error) // symmetric cipher\n\tBlockSize int                                // block size of symmetric cipher\n\tKeyLen    int                                // length of symmetric key\n}\n\n// Standard ECIES parameters:\n// * ECIES using AES128 and HMAC-SHA-256-16\n// * ECIES using AES256 and HMAC-SHA-256-32\n// * ECIES using AES256 and HMAC-SHA-384-48\n// * ECIES using AES256 and HMAC-SHA-512-64\n\nvar (\n\tECIES_AES128_SHA256 = &ECIESParams{\n\t\tHash:      sha256.New,\n\t\thashAlgo:  crypto.SHA256,\n\t\tCipher:    aes.NewCipher,\n\t\tBlockSize: aes.BlockSize,\n\t\tKeyLen:    16,\n\t}\n\n\tECIES_AES256_SHA256 = &ECIESParams{\n\t\tHash:      sha256.New,\n\t\thashAlgo:  crypto.SHA256,\n\t\tCipher:    aes.NewCipher,\n\t\tBlockSize: aes.BlockSize,\n\t\tKeyLen:    32,\n\t}\n\n\tECIES_AES256_SHA384 = &ECIESParams{\n\t\tHash:      sha512.New384,\n\t\thashAlgo:  crypto.SHA384,\n\t\tCipher:    aes.NewCipher,\n\t\tBlockSize: aes.BlockSize,\n\t\tKeyLen:    32,\n\t}\n\n\tECIES_AES256_SHA512 = &ECIESParams{\n\t\tHash:      sha512.New,\n\t\thashAlgo:  crypto.SHA512,\n\t\tCipher:    aes.NewCipher,\n\t\tBlockSize: aes.BlockSize,\n\t\tKeyLen:    32,\n\t}\n)\n\nvar paramsFromCurve = map[elliptic.Curve]*ECIESParams{\n\tethcrypto.S256(): ECIES_AES128_SHA256,\n\telliptic.P256():  ECIES_AES128_SHA256,\n\telliptic.P384():  ECIES_AES256_SHA384,\n\telliptic.P521():  ECIES_AES256_SHA512,\n}\n\nfunc AddParamsForCurve(curve elliptic.Curve, params *ECIESParams) {\n\tparamsFromCurve[curve] = params\n}\n\n// ParamsFromCurve selects parameters optimal for the selected elliptic curve.\n// Only the curves P256, P384, and P512 are supported.\nfunc ParamsFromCurve(curve elliptic.Curve) (params *ECIESParams) {\n\treturn paramsFromCurve[curve]\n}\n"
  },
  {
    "path": "crypto/secp256k1/.gitignore",
    "content": "# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# Folders\n_obj\n_test\n\n# Architecture specific extensions/prefixes\n*.[568vq]\n[568vq].out\n\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n\n_testmain.go\n\n*.exe\n\n*~\n"
  },
  {
    "path": "crypto/secp256k1/LICENSE",
    "content": "Copyright (c) 2010 The Go Authors. All rights reserved.\nCopyright (c) 2011 ThePiachu. All rights reserved.\nCopyright (c) 2015 Jeffrey Wilcke. All rights reserved.\nCopyright (c) 2015 Felix Lange. All rights reserved.\nCopyright (c) 2015 Gustav Simonsson. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of the copyright holder. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "crypto/secp256k1/curve.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Copyright 2011 ThePiachu. All rights reserved.\n// Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. 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 are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n//   notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n//   copyright notice, this list of conditions and the following disclaimer\n//   in the documentation and/or other materials provided with the\n//   distribution.\n// * Neither the name of Google Inc. nor the names of its\n//   contributors may be used to endorse or promote products derived from\n//   this software without specific prior written permission.\n// * The name of ThePiachu may not be used to endorse or promote products\n//   derived from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage secp256k1\n\nimport (\n\t\"crypto/elliptic\"\n\t\"math/big\"\n\t\"unsafe\"\n)\n\n/*\n#include \"libsecp256k1/include/secp256k1.h\"\nextern int secp256k1_ext_scalar_mul(const secp256k1_context* ctx, const unsigned char *point, const unsigned char *scalar);\n*/\nimport \"C\"\n\nconst (\n\t// number of bits in a big.Word\n\twordBits = 32 << (uint64(^big.Word(0)) >> 63)\n\t// number of bytes in a big.Word\n\twordBytes = wordBits / 8\n)\n\n// readBits encodes the absolute value of bigint as big-endian bytes. Callers\n// must ensure that buf has enough space. If buf is too short the result will\n// be incomplete.\nfunc readBits(bigint *big.Int, buf []byte) {\n\ti := len(buf)\n\tfor _, d := range bigint.Bits() {\n\t\tfor j := 0; j < wordBytes && i > 0; j++ {\n\t\t\ti--\n\t\t\tbuf[i] = byte(d)\n\t\t\td >>= 8\n\t\t}\n\t}\n}\n\n// This code is from https://github.com/ThePiachu/GoBit and implements\n// several Koblitz elliptic curves over prime fields.\n//\n// The curve methods, internally, on Jacobian coordinates. For a given\n// (x, y) position on the curve, the Jacobian coordinates are (x1, y1,\n// z1) where x = x1/z1² and y = y1/z1³. The greatest speedups come\n// when the whole calculation can be performed within the transform\n// (as in ScalarMult and ScalarBaseMult). But even for Add and Double,\n// it's faster to apply and reverse the transform than to operate in\n// affine coordinates.\n\n// A BitCurve represents a Koblitz Curve with a=0.\n// See http://www.hyperelliptic.org/EFD/g1p/auto-shortw.html\ntype BitCurve struct {\n\tP       *big.Int // the order of the underlying field\n\tN       *big.Int // the order of the base point\n\tB       *big.Int // the constant of the BitCurve equation\n\tGx, Gy  *big.Int // (x,y) of the base point\n\tBitSize int      // the size of the underlying field\n}\n\nfunc (BitCurve *BitCurve) Params() *elliptic.CurveParams {\n\treturn &elliptic.CurveParams{\n\t\tP:       BitCurve.P,\n\t\tN:       BitCurve.N,\n\t\tB:       BitCurve.B,\n\t\tGx:      BitCurve.Gx,\n\t\tGy:      BitCurve.Gy,\n\t\tBitSize: BitCurve.BitSize,\n\t}\n}\n\n// IsOnCurve returns true if the given (x,y) lies on the BitCurve.\nfunc (BitCurve *BitCurve) IsOnCurve(x, y *big.Int) bool {\n\t// y² = x³ + b\n\ty2 := new(big.Int).Mul(y, y) //y²\n\ty2.Mod(y2, BitCurve.P)       //y²%P\n\n\tx3 := new(big.Int).Mul(x, x) //x²\n\tx3.Mul(x3, x)                //x³\n\n\tx3.Add(x3, BitCurve.B) //x³+B\n\tx3.Mod(x3, BitCurve.P) //(x³+B)%P\n\n\treturn x3.Cmp(y2) == 0\n}\n\n//TODO: double check if the function is okay\n// affineFromJacobian reverses the Jacobian transform. See the comment at the\n// top of the file.\nfunc (BitCurve *BitCurve) affineFromJacobian(x, y, z *big.Int) (xOut, yOut *big.Int) {\n\tzinv := new(big.Int).ModInverse(z, BitCurve.P)\n\tzinvsq := new(big.Int).Mul(zinv, zinv)\n\n\txOut = new(big.Int).Mul(x, zinvsq)\n\txOut.Mod(xOut, BitCurve.P)\n\tzinvsq.Mul(zinvsq, zinv)\n\tyOut = new(big.Int).Mul(y, zinvsq)\n\tyOut.Mod(yOut, BitCurve.P)\n\treturn\n}\n\n// Add returns the sum of (x1,y1) and (x2,y2)\nfunc (BitCurve *BitCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) {\n\tz := new(big.Int).SetInt64(1)\n\treturn BitCurve.affineFromJacobian(BitCurve.addJacobian(x1, y1, z, x2, y2, z))\n}\n\n// addJacobian takes two points in Jacobian coordinates, (x1, y1, z1) and\n// (x2, y2, z2) and returns their sum, also in Jacobian form.\nfunc (BitCurve *BitCurve) addJacobian(x1, y1, z1, x2, y2, z2 *big.Int) (*big.Int, *big.Int, *big.Int) {\n\t// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl\n\tz1z1 := new(big.Int).Mul(z1, z1)\n\tz1z1.Mod(z1z1, BitCurve.P)\n\tz2z2 := new(big.Int).Mul(z2, z2)\n\tz2z2.Mod(z2z2, BitCurve.P)\n\n\tu1 := new(big.Int).Mul(x1, z2z2)\n\tu1.Mod(u1, BitCurve.P)\n\tu2 := new(big.Int).Mul(x2, z1z1)\n\tu2.Mod(u2, BitCurve.P)\n\th := new(big.Int).Sub(u2, u1)\n\tif h.Sign() == -1 {\n\t\th.Add(h, BitCurve.P)\n\t}\n\ti := new(big.Int).Lsh(h, 1)\n\ti.Mul(i, i)\n\tj := new(big.Int).Mul(h, i)\n\n\ts1 := new(big.Int).Mul(y1, z2)\n\ts1.Mul(s1, z2z2)\n\ts1.Mod(s1, BitCurve.P)\n\ts2 := new(big.Int).Mul(y2, z1)\n\ts2.Mul(s2, z1z1)\n\ts2.Mod(s2, BitCurve.P)\n\tr := new(big.Int).Sub(s2, s1)\n\tif r.Sign() == -1 {\n\t\tr.Add(r, BitCurve.P)\n\t}\n\tr.Lsh(r, 1)\n\tv := new(big.Int).Mul(u1, i)\n\n\tx3 := new(big.Int).Set(r)\n\tx3.Mul(x3, x3)\n\tx3.Sub(x3, j)\n\tx3.Sub(x3, v)\n\tx3.Sub(x3, v)\n\tx3.Mod(x3, BitCurve.P)\n\n\ty3 := new(big.Int).Set(r)\n\tv.Sub(v, x3)\n\ty3.Mul(y3, v)\n\ts1.Mul(s1, j)\n\ts1.Lsh(s1, 1)\n\ty3.Sub(y3, s1)\n\ty3.Mod(y3, BitCurve.P)\n\n\tz3 := new(big.Int).Add(z1, z2)\n\tz3.Mul(z3, z3)\n\tz3.Sub(z3, z1z1)\n\tif z3.Sign() == -1 {\n\t\tz3.Add(z3, BitCurve.P)\n\t}\n\tz3.Sub(z3, z2z2)\n\tif z3.Sign() == -1 {\n\t\tz3.Add(z3, BitCurve.P)\n\t}\n\tz3.Mul(z3, h)\n\tz3.Mod(z3, BitCurve.P)\n\n\treturn x3, y3, z3\n}\n\n// Double returns 2*(x,y)\nfunc (BitCurve *BitCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) {\n\tz1 := new(big.Int).SetInt64(1)\n\treturn BitCurve.affineFromJacobian(BitCurve.doubleJacobian(x1, y1, z1))\n}\n\n// doubleJacobian takes a point in Jacobian coordinates, (x, y, z), and\n// returns its double, also in Jacobian form.\nfunc (BitCurve *BitCurve) doubleJacobian(x, y, z *big.Int) (*big.Int, *big.Int, *big.Int) {\n\t// See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l\n\n\ta := new(big.Int).Mul(x, x) //X1²\n\tb := new(big.Int).Mul(y, y) //Y1²\n\tc := new(big.Int).Mul(b, b) //B²\n\n\td := new(big.Int).Add(x, b) //X1+B\n\td.Mul(d, d)                 //(X1+B)²\n\td.Sub(d, a)                 //(X1+B)²-A\n\td.Sub(d, c)                 //(X1+B)²-A-C\n\td.Mul(d, big.NewInt(2))     //2*((X1+B)²-A-C)\n\n\te := new(big.Int).Mul(big.NewInt(3), a) //3*A\n\tf := new(big.Int).Mul(e, e)             //E²\n\n\tx3 := new(big.Int).Mul(big.NewInt(2), d) //2*D\n\tx3.Sub(f, x3)                            //F-2*D\n\tx3.Mod(x3, BitCurve.P)\n\n\ty3 := new(big.Int).Sub(d, x3)                  //D-X3\n\ty3.Mul(e, y3)                                  //E*(D-X3)\n\ty3.Sub(y3, new(big.Int).Mul(big.NewInt(8), c)) //E*(D-X3)-8*C\n\ty3.Mod(y3, BitCurve.P)\n\n\tz3 := new(big.Int).Mul(y, z) //Y1*Z1\n\tz3.Mul(big.NewInt(2), z3)    //3*Y1*Z1\n\tz3.Mod(z3, BitCurve.P)\n\n\treturn x3, y3, z3\n}\n\nfunc (BitCurve *BitCurve) ScalarMult(Bx, By *big.Int, scalar []byte) (*big.Int, *big.Int) {\n\t// Ensure scalar is exactly 32 bytes. We pad always, even if\n\t// scalar is 32 bytes long, to avoid a timing side channel.\n\tif len(scalar) > 32 {\n\t\tpanic(\"can't handle scalars > 256 bits\")\n\t}\n\t// NOTE: potential timing issue\n\tpadded := make([]byte, 32)\n\tcopy(padded[32-len(scalar):], scalar)\n\tscalar = padded\n\n\t// Do the multiplication in C, updating point.\n\tpoint := make([]byte, 64)\n\treadBits(Bx, point[:32])\n\treadBits(By, point[32:])\n\n\tpointPtr := (*C.uchar)(unsafe.Pointer(&point[0]))\n\tscalarPtr := (*C.uchar)(unsafe.Pointer(&scalar[0]))\n\tres := C.secp256k1_ext_scalar_mul(context, pointPtr, scalarPtr)\n\n\t// Unpack the result and clear temporaries.\n\tx := new(big.Int).SetBytes(point[:32])\n\ty := new(big.Int).SetBytes(point[32:])\n\tfor i := range point {\n\t\tpoint[i] = 0\n\t}\n\tfor i := range padded {\n\t\tscalar[i] = 0\n\t}\n\tif res != 1 {\n\t\treturn nil, nil\n\t}\n\treturn x, y\n}\n\n// ScalarBaseMult returns k*G, where G is the base point of the group and k is\n// an integer in big-endian form.\nfunc (BitCurve *BitCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) {\n\treturn BitCurve.ScalarMult(BitCurve.Gx, BitCurve.Gy, k)\n}\n\n// Marshal converts a point into the form specified in section 4.3.6 of ANSI\n// X9.62.\nfunc (BitCurve *BitCurve) Marshal(x, y *big.Int) []byte {\n\tbyteLen := (BitCurve.BitSize + 7) >> 3\n\tret := make([]byte, 1+2*byteLen)\n\tret[0] = 4 // uncompressed point flag\n\treadBits(x, ret[1:1+byteLen])\n\treadBits(y, ret[1+byteLen:])\n\treturn ret\n}\n\n// Unmarshal converts a point, serialised by Marshal, into an x, y pair. On\n// error, x = nil.\nfunc (BitCurve *BitCurve) Unmarshal(data []byte) (x, y *big.Int) {\n\tbyteLen := (BitCurve.BitSize + 7) >> 3\n\tif len(data) != 1+2*byteLen {\n\t\treturn\n\t}\n\tif data[0] != 4 { // uncompressed form\n\t\treturn\n\t}\n\tx = new(big.Int).SetBytes(data[1 : 1+byteLen])\n\ty = new(big.Int).SetBytes(data[1+byteLen:])\n\treturn\n}\n\nvar theCurve = new(BitCurve)\n\nfunc init() {\n\t// See SEC 2 section 2.7.1\n\t// curve parameters taken from:\n\t// http://www.secg.org/collateral/sec2_final.pdf\n\ttheCurve.P, _ = new(big.Int).SetString(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\", 0)\n\ttheCurve.N, _ = new(big.Int).SetString(\"0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\", 0)\n\ttheCurve.B, _ = new(big.Int).SetString(\"0x0000000000000000000000000000000000000000000000000000000000000007\", 0)\n\ttheCurve.Gx, _ = new(big.Int).SetString(\"0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798\", 0)\n\ttheCurve.Gy, _ = new(big.Int).SetString(\"0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8\", 0)\n\ttheCurve.BitSize = 256\n}\n\n// S256 returns a BitCurve which implements secp256k1.\nfunc S256() *BitCurve {\n\treturn theCurve\n}\n"
  },
  {
    "path": "crypto/secp256k1/ext.h",
    "content": "// Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be found in\n// the LICENSE file.\n\n// secp256k1_context_create_sign_verify creates a context for signing and signature verification.\nstatic secp256k1_context* secp256k1_context_create_sign_verify() {\n\treturn secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n}\n\n// secp256k1_ext_ecdsa_recover recovers the public key of an encoded compact signature.\n//\n// Returns: 1: recovery was successful\n//          0: recovery was not successful\n// Args:    ctx:        pointer to a context object (cannot be NULL)\n//  Out:    pubkey_out: the serialized 65-byte public key of the signer (cannot be NULL)\n//  In:     sigdata:    pointer to a 65-byte signature with the recovery id at the end (cannot be NULL)\n//          msgdata:    pointer to a 32-byte message (cannot be NULL)\nstatic int secp256k1_ext_ecdsa_recover(\n\tconst secp256k1_context* ctx,\n\tunsigned char *pubkey_out,\n\tconst unsigned char *sigdata,\n\tconst unsigned char *msgdata\n) {\n\tsecp256k1_ecdsa_recoverable_signature sig;\n\tsecp256k1_pubkey pubkey;\n\n\tif (!secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &sig, sigdata, (int)sigdata[64])) {\n\t\treturn 0;\n\t}\n\tif (!secp256k1_ecdsa_recover(ctx, &pubkey, &sig, msgdata)) {\n\t\treturn 0;\n\t}\n\tsize_t outputlen = 65;\n\treturn secp256k1_ec_pubkey_serialize(ctx, pubkey_out, &outputlen, &pubkey, SECP256K1_EC_UNCOMPRESSED);\n}\n\n// secp256k1_ext_ecdsa_verify verifies an encoded compact signature.\n//\n// Returns: 1: signature is valid\n//          0: signature is invalid\n// Args:    ctx:        pointer to a context object (cannot be NULL)\n//  In:     sigdata:    pointer to a 64-byte signature (cannot be NULL)\n//          msgdata:    pointer to a 32-byte message (cannot be NULL)\n//          pubkeydata: pointer to public key data (cannot be NULL)\n//          pubkeylen:  length of pubkeydata\nstatic int secp256k1_ext_ecdsa_verify(\n\tconst secp256k1_context* ctx,\n\tconst unsigned char *sigdata,\n\tconst unsigned char *msgdata,\n\tconst unsigned char *pubkeydata,\n\tsize_t pubkeylen\n) {\n\tsecp256k1_ecdsa_signature sig;\n\tsecp256k1_pubkey pubkey;\n\n\tif (!secp256k1_ecdsa_signature_parse_compact(ctx, &sig, sigdata)) {\n\t\treturn 0;\n\t}\n\tif (!secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeydata, pubkeylen)) {\n\t\treturn 0;\n\t}\n\treturn secp256k1_ecdsa_verify(ctx, &sig, msgdata, &pubkey);\n}\n\n// secp256k1_ext_reencode_pubkey decodes then encodes a public key. It can be used to\n// convert between public key formats. The input/output formats are chosen depending on the\n// length of the input/output buffers.\n//\n// Returns: 1: conversion successful\n//          0: conversion unsuccessful\n// Args:    ctx:        pointer to a context object (cannot be NULL)\n//  Out:    out:        output buffer that will contain the reencoded key (cannot be NULL)\n//  In:     outlen:     length of out (33 for compressed keys, 65 for uncompressed keys)\n//          pubkeydata: the input public key (cannot be NULL)\n//          pubkeylen:  length of pubkeydata\nstatic int secp256k1_ext_reencode_pubkey(\n\tconst secp256k1_context* ctx,\n\tunsigned char *out,\n\tsize_t outlen,\n\tconst unsigned char *pubkeydata,\n\tsize_t pubkeylen\n) {\n\tsecp256k1_pubkey pubkey;\n\n\tif (!secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeydata, pubkeylen)) {\n\t\treturn 0;\n\t}\n\tunsigned int flag = (outlen == 33) ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED;\n\treturn secp256k1_ec_pubkey_serialize(ctx, out, &outlen, &pubkey, flag);\n}\n\n// secp256k1_ext_scalar_mul multiplies a point by a scalar in constant time.\n//\n// Returns: 1: multiplication was successful\n//          0: scalar was invalid (zero or overflow)\n// Args:    ctx:      pointer to a context object (cannot be NULL)\n//  Out:    point:    the multiplied point (usually secret)\n//  In:     point:    pointer to a 64-byte public point,\n//                    encoded as two 256bit big-endian numbers.\n//          scalar:   a 32-byte scalar with which to multiply the point\nint secp256k1_ext_scalar_mul(const secp256k1_context* ctx, unsigned char *point, const unsigned char *scalar) {\n\tint ret = 0;\n\tint overflow = 0;\n\tsecp256k1_fe feX, feY;\n\tsecp256k1_gej res;\n\tsecp256k1_ge ge;\n\tsecp256k1_scalar s;\n\tARG_CHECK(point != NULL);\n\tARG_CHECK(scalar != NULL);\n\t(void)ctx;\n\n\tsecp256k1_fe_set_b32(&feX, point);\n\tsecp256k1_fe_set_b32(&feY, point+32);\n\tsecp256k1_ge_set_xy(&ge, &feX, &feY);\n\tsecp256k1_scalar_set_b32(&s, scalar, &overflow);\n\tif (overflow || secp256k1_scalar_is_zero(&s)) {\n\t\tret = 0;\n\t} else {\n\t\tsecp256k1_ecmult_const(&res, &ge, &s);\n\t\tsecp256k1_ge_set_gej(&ge, &res);\n\t\t/* Note: can't use secp256k1_pubkey_save here because it is not constant time. */\n\t\tsecp256k1_fe_normalize(&ge.x);\n\t\tsecp256k1_fe_normalize(&ge.y);\n\t\tsecp256k1_fe_get_b32(point, &ge.x);\n\t\tsecp256k1_fe_get_b32(point+32, &ge.y);\n\t\tret = 1;\n\t}\n\tsecp256k1_scalar_clear(&s);\n\treturn ret;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/.gitignore",
    "content": "bench_inv\nbench_ecdh\nbench_sign\nbench_verify\nbench_schnorr_verify\nbench_recover\nbench_internal\ntests\nexhaustive_tests\ngen_context\n*.exe\n*.so\n*.a\n!.gitignore\n\nMakefile\nconfigure\n.libs/\nMakefile.in\naclocal.m4\nautom4te.cache/\nconfig.log\nconfig.status\n*.tar.gz\n*.la\nlibtool\n.deps/\n.dirstamp\n*.lo\n*.o\n*~\nsrc/libsecp256k1-config.h\nsrc/libsecp256k1-config.h.in\nsrc/ecmult_static_context.h\nbuild-aux/config.guess\nbuild-aux/config.sub\nbuild-aux/depcomp\nbuild-aux/install-sh\nbuild-aux/ltmain.sh\nbuild-aux/m4/libtool.m4\nbuild-aux/m4/lt~obsolete.m4\nbuild-aux/m4/ltoptions.m4\nbuild-aux/m4/ltsugar.m4\nbuild-aux/m4/ltversion.m4\nbuild-aux/missing\nbuild-aux/compile\nbuild-aux/test-driver\nsrc/stamp-h1\nlibsecp256k1.pc\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/.travis.yml",
    "content": "language: c\nsudo: false\naddons:\n  apt:\n    packages: libgmp-dev\ncompiler:\n  - clang\n  - gcc\ncache:\n  directories:\n  - src/java/guava/\nenv:\n  global:\n    - FIELD=auto  BIGNUM=auto  SCALAR=auto  ENDOMORPHISM=no  STATICPRECOMPUTATION=yes  ASM=no  BUILD=check  EXTRAFLAGS=  HOST=  ECDH=no  RECOVERY=no  EXPERIMENTAL=no\n    - GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar\n  matrix:\n    - SCALAR=32bit    RECOVERY=yes\n    - SCALAR=32bit    FIELD=32bit       ECDH=yes  EXPERIMENTAL=yes\n    - SCALAR=64bit\n    - FIELD=64bit     RECOVERY=yes\n    - FIELD=64bit     ENDOMORPHISM=yes\n    - FIELD=64bit     ENDOMORPHISM=yes  ECDH=yes EXPERIMENTAL=yes\n    - FIELD=64bit                       ASM=x86_64\n    - FIELD=64bit     ENDOMORPHISM=yes  ASM=x86_64\n    - FIELD=32bit     ENDOMORPHISM=yes\n    - BIGNUM=no\n    - BIGNUM=no       ENDOMORPHISM=yes RECOVERY=yes EXPERIMENTAL=yes\n    - BIGNUM=no       STATICPRECOMPUTATION=no\n    - BUILD=distcheck\n    - EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC\n    - EXTRAFLAGS=CFLAGS=-O0\n    - BUILD=check-java ECDH=yes EXPERIMENTAL=yes\nmatrix:\n  fast_finish: true\n  include:\n    - compiler: clang\n      env: HOST=i686-linux-gnu ENDOMORPHISM=yes\n      addons:\n        apt:\n          packages:\n            - gcc-multilib\n            - libgmp-dev:i386\n    - compiler: clang\n      env: HOST=i686-linux-gnu\n      addons:\n        apt:\n          packages:\n            - gcc-multilib\n    - compiler: gcc\n      env: HOST=i686-linux-gnu ENDOMORPHISM=yes\n      addons:\n        apt:\n          packages:\n            - gcc-multilib\n    - compiler: gcc\n      env: HOST=i686-linux-gnu\n      addons:\n        apt:\n          packages:\n            - gcc-multilib\n            - libgmp-dev:i386\nbefore_install: mkdir -p `dirname $GUAVA_JAR`\ninstall: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi\nbefore_script: ./autogen.sh\nscript:\n - if [ -n \"$HOST\" ]; then export USE_HOST=\"--host=$HOST\"; fi\n - if [ \"x$HOST\" = \"xi686-linux-gnu\" ]; then export CC=\"$CC -m32\"; fi\n - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST && make -j2 $BUILD\nos: linux\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/COPYING",
    "content": "Copyright (c) 2013 Pieter Wuille\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/Makefile.am",
    "content": "ACLOCAL_AMFLAGS = -I build-aux/m4\n\nlib_LTLIBRARIES = libsecp256k1.la\nif USE_JNI\nJNI_LIB = libsecp256k1_jni.la\nnoinst_LTLIBRARIES = $(JNI_LIB)\nelse\nJNI_LIB =\nendif\ninclude_HEADERS = include/secp256k1.h\nnoinst_HEADERS =\nnoinst_HEADERS += src/scalar.h\nnoinst_HEADERS += src/scalar_4x64.h\nnoinst_HEADERS += src/scalar_8x32.h\nnoinst_HEADERS += src/scalar_low.h\nnoinst_HEADERS += src/scalar_impl.h\nnoinst_HEADERS += src/scalar_4x64_impl.h\nnoinst_HEADERS += src/scalar_8x32_impl.h\nnoinst_HEADERS += src/scalar_low_impl.h\nnoinst_HEADERS += src/group.h\nnoinst_HEADERS += src/group_impl.h\nnoinst_HEADERS += src/num_gmp.h\nnoinst_HEADERS += src/num_gmp_impl.h\nnoinst_HEADERS += src/ecdsa.h\nnoinst_HEADERS += src/ecdsa_impl.h\nnoinst_HEADERS += src/eckey.h\nnoinst_HEADERS += src/eckey_impl.h\nnoinst_HEADERS += src/ecmult.h\nnoinst_HEADERS += src/ecmult_impl.h\nnoinst_HEADERS += src/ecmult_const.h\nnoinst_HEADERS += src/ecmult_const_impl.h\nnoinst_HEADERS += src/ecmult_gen.h\nnoinst_HEADERS += src/ecmult_gen_impl.h\nnoinst_HEADERS += src/num.h\nnoinst_HEADERS += src/num_impl.h\nnoinst_HEADERS += src/field_10x26.h\nnoinst_HEADERS += src/field_10x26_impl.h\nnoinst_HEADERS += src/field_5x52.h\nnoinst_HEADERS += src/field_5x52_impl.h\nnoinst_HEADERS += src/field_5x52_int128_impl.h\nnoinst_HEADERS += src/field_5x52_asm_impl.h\nnoinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h\nnoinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h\nnoinst_HEADERS += src/util.h\nnoinst_HEADERS += src/testrand.h\nnoinst_HEADERS += src/testrand_impl.h\nnoinst_HEADERS += src/hash.h\nnoinst_HEADERS += src/hash_impl.h\nnoinst_HEADERS += src/field.h\nnoinst_HEADERS += src/field_impl.h\nnoinst_HEADERS += src/bench.h\nnoinst_HEADERS += contrib/lax_der_parsing.h\nnoinst_HEADERS += contrib/lax_der_parsing.c\nnoinst_HEADERS += contrib/lax_der_privatekey_parsing.h\nnoinst_HEADERS += contrib/lax_der_privatekey_parsing.c\n\nif USE_EXTERNAL_ASM\nCOMMON_LIB = libsecp256k1_common.la\nnoinst_LTLIBRARIES = $(COMMON_LIB)\nelse\nCOMMON_LIB =\nendif\n\npkgconfigdir = $(libdir)/pkgconfig\npkgconfig_DATA = libsecp256k1.pc\n\nif USE_EXTERNAL_ASM\nif USE_ASM_ARM\nlibsecp256k1_common_la_SOURCES = src/asm/field_10x26_arm.s\nendif\nendif\n\nlibsecp256k1_la_SOURCES = src/secp256k1.c\nlibsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES)\nlibsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB)\n\nlibsecp256k1_jni_la_SOURCES  = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c\nlibsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES)\n\nnoinst_PROGRAMS =\nif USE_BENCHMARK\nnoinst_PROGRAMS += bench_verify bench_sign bench_internal\nbench_verify_SOURCES = src/bench_verify.c\nbench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)\nbench_sign_SOURCES = src/bench_sign.c\nbench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)\nbench_internal_SOURCES = src/bench_internal.c\nbench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB)\nbench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES)\nendif\n\nTESTS =\nif USE_TESTS\nnoinst_PROGRAMS += tests\ntests_SOURCES = src/tests.c\ntests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES)\nif !ENABLE_COVERAGE\ntests_CPPFLAGS += -DVERIFY\nendif\ntests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB)\ntests_LDFLAGS = -static\nTESTS += tests\nendif\n\nif USE_EXHAUSTIVE_TESTS\nnoinst_PROGRAMS += exhaustive_tests\nexhaustive_tests_SOURCES = src/tests_exhaustive.c\nexhaustive_tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src $(SECP_INCLUDES)\nif !ENABLE_COVERAGE\nexhaustive_tests_CPPFLAGS += -DVERIFY\nendif\nexhaustive_tests_LDADD = $(SECP_LIBS)\nexhaustive_tests_LDFLAGS = -static\nTESTS += exhaustive_tests\nendif\n\nJAVAROOT=src/java\nJAVAORG=org/bitcoin\nJAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar\nCLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA)\nJAVA_FILES= \\\n  $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \\\n  $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \\\n  $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \\\n  $(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java\n\nif USE_JNI\n\n$(JAVA_GUAVA):\n\t@echo Guava is missing. Fetch it via: \\\n\twget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@)\n\t@false\n\n.stamp-java: $(JAVA_FILES)\n\t@echo   Compiling $^\n\t$(AM_V_at)$(CLASSPATH_ENV) javac $^\n\t@touch $@\n\nif USE_TESTS\n\ncheck-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java\n\t$(AM_V_at)java -Djava.library.path=\"./:./src:./src/.libs:.libs/\" -cp \"$(JAVA_GUAVA):$(JAVAROOT)\" $(JAVAORG)/NativeSecp256k1Test\n\nendif\nendif\n\nif USE_ECMULT_STATIC_PRECOMPUTATION\nCPPFLAGS_FOR_BUILD +=-I$(top_srcdir)\nCFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function\n\ngen_context_OBJECTS = gen_context.o\ngen_context_BIN = gen_context$(BUILD_EXEEXT)\ngen_%.o: src/gen_%.c\n\t$(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@\n\n$(gen_context_BIN): $(gen_context_OBJECTS)\n\t$(CC_FOR_BUILD) $^ -o $@\n\n$(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h\n$(tests_OBJECTS): src/ecmult_static_context.h\n$(bench_internal_OBJECTS): src/ecmult_static_context.h\n\nsrc/ecmult_static_context.h: $(gen_context_BIN)\n\t./$(gen_context_BIN)\n\nCLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java\nendif\n\nEXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES)\n\nif ENABLE_MODULE_ECDH\ninclude src/modules/ecdh/Makefile.am.include\nendif\n\nif ENABLE_MODULE_RECOVERY\ninclude src/modules/recovery/Makefile.am.include\nendif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/README.md",
    "content": "libsecp256k1\n============\n\n[![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1)\n\nOptimized C library for EC operations on curve secp256k1.\n\nThis library is a work in progress and is being used to research best practices. Use at your own risk.\n\nFeatures:\n* secp256k1 ECDSA signing/verification and key generation.\n* Adding/multiplying private/public keys.\n* Serialization/parsing of private keys, public keys, signatures.\n* Constant time, constant memory access signing and pubkey generation.\n* Derandomized DSA (via RFC6979 or with a caller provided function.)\n* Very efficient implementation.\n\nImplementation details\n----------------------\n\n* General\n  * No runtime heap allocation.\n  * Extensive testing infrastructure.\n  * Structured to facilitate review and analysis.\n  * Intended to be portable to any system with a C89 compiler and uint64_t support.\n  * Expose only higher level interfaces to minimize the API surface and improve application security. (\"Be difficult to use insecurely.\")\n* Field operations\n  * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1).\n    * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys).\n    * Using 10 26-bit limbs.\n  * Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman).\n* Scalar operations\n  * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order.\n    * Using 4 64-bit limbs (relying on __int128 support in the compiler).\n    * Using 8 32-bit limbs.\n* Group operations\n  * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7).\n  * Use addition between points in Jacobian and affine coordinates where possible.\n  * Use a unified addition/doubling formula where necessary to avoid data-dependent branches.\n  * Point/x comparison without a field inversion by comparison in the Jacobian coordinate space.\n* Point multiplication for verification (a*P + b*G).\n  * Use wNAF notation for point multiplicands.\n  * Use a much larger window for multiples of G, using precomputed multiples.\n  * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously.\n  * Optionally (off by default) use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones.\n* Point multiplication for signing\n  * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions.\n  * Access the table with branch-free conditional moves so memory access is uniform.\n  * No data-dependent branches\n  * The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally.\n\nBuild steps\n-----------\n\nlibsecp256k1 is built using autotools:\n\n    $ ./autogen.sh\n    $ ./configure\n    $ make\n    $ ./tests\n    $ sudo make install  # optional\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/TODO",
    "content": "* Unit tests for fieldelem/groupelem, including ones intended to\n  trigger fieldelem's boundary cases.\n* Complete constant-time operations for signing/keygen\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/autogen.sh",
    "content": "#!/bin/sh\nset -e\nautoreconf -if --warnings=all\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/build-aux/m4/ax_jni_include_dir.m4",
    "content": "# ===========================================================================\n#    http://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_JNI_INCLUDE_DIR\n#\n# DESCRIPTION\n#\n#   AX_JNI_INCLUDE_DIR finds include directories needed for compiling\n#   programs using the JNI interface.\n#\n#   JNI include directories are usually in the Java distribution. This is\n#   deduced from the value of $JAVA_HOME, $JAVAC, or the path to \"javac\", in\n#   that order. When this macro completes, a list of directories is left in\n#   the variable JNI_INCLUDE_DIRS.\n#\n#   Example usage follows:\n#\n#     AX_JNI_INCLUDE_DIR\n#\n#     for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS\n#     do\n#             CPPFLAGS=\"$CPPFLAGS -I$JNI_INCLUDE_DIR\"\n#     done\n#\n#   If you want to force a specific compiler:\n#\n#   - at the configure.in level, set JAVAC=yourcompiler before calling\n#   AX_JNI_INCLUDE_DIR\n#\n#   - at the configure level, setenv JAVAC\n#\n#   Note: This macro can work with the autoconf M4 macros for Java programs.\n#   This particular macro is not part of the original set of macros.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Don Anderson <dda@sleepycat.com>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved. This file is offered as-is, without any\n#   warranty.\n\n#serial 10\n\nAU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR])\nAC_DEFUN([AX_JNI_INCLUDE_DIR],[\n\nJNI_INCLUDE_DIRS=\"\"\n\nif test \"x$JAVA_HOME\" != x; then\n\t_JTOPDIR=\"$JAVA_HOME\"\nelse\n\tif test \"x$JAVAC\" = x; then\n\t\tJAVAC=javac\n\tfi\n\tAC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no])\n\tif test \"x$_ACJNI_JAVAC\" = xno; then\n\t\tAC_MSG_WARN([cannot find JDK; try setting \\$JAVAC or \\$JAVA_HOME])\n\tfi\n\t_ACJNI_FOLLOW_SYMLINKS(\"$_ACJNI_JAVAC\")\n\t_JTOPDIR=`echo \"$_ACJNI_FOLLOWED\" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'`\nfi\n\ncase \"$host_os\" in\n        darwin*)        _JTOPDIR=`echo \"$_JTOPDIR\" | sed -e 's:/[[^/]]*$::'`\n                        _JINC=\"$_JTOPDIR/Headers\";;\n        *)              _JINC=\"$_JTOPDIR/include\";;\nesac\n_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR])\n_AS_ECHO_LOG([_JINC=$_JINC])\n\n# On Mac OS X 10.6.4, jni.h is a symlink:\n# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h\n# -> ../../CurrentJDK/Headers/jni.h.\n\nAC_CACHE_CHECK(jni headers, ac_cv_jni_header_path,\n[\nif test -f \"$_JINC/jni.h\"; then\n  ac_cv_jni_header_path=\"$_JINC\"\n  JNI_INCLUDE_DIRS=\"$JNI_INCLUDE_DIRS $ac_cv_jni_header_path\"\nelse\n  _JTOPDIR=`echo \"$_JTOPDIR\" | sed -e 's:/[[^/]]*$::'`\n  if test -f \"$_JTOPDIR/include/jni.h\"; then\n    ac_cv_jni_header_path=\"$_JTOPDIR/include\"\n    JNI_INCLUDE_DIRS=\"$JNI_INCLUDE_DIRS $ac_cv_jni_header_path\"\n  else\n    ac_cv_jni_header_path=none\n  fi\nfi\n])\n\n\n\n# get the likely subdirectories for system specific java includes\ncase \"$host_os\" in\nbsdi*)          _JNI_INC_SUBDIRS=\"bsdos\";;\ndarwin*)        _JNI_INC_SUBDIRS=\"darwin\";;\nfreebsd*)       _JNI_INC_SUBDIRS=\"freebsd\";;\nlinux*)         _JNI_INC_SUBDIRS=\"linux genunix\";;\nosf*)           _JNI_INC_SUBDIRS=\"alpha\";;\nsolaris*)       _JNI_INC_SUBDIRS=\"solaris\";;\nmingw*)\t\t_JNI_INC_SUBDIRS=\"win32\";;\ncygwin*)\t_JNI_INC_SUBDIRS=\"win32\";;\n*)              _JNI_INC_SUBDIRS=\"genunix\";;\nesac\n\nif test \"x$ac_cv_jni_header_path\" != \"xnone\"; then\n  # add any subdirectories that are present\n  for JINCSUBDIR in $_JNI_INC_SUBDIRS\n  do\n      if test -d \"$_JTOPDIR/include/$JINCSUBDIR\"; then\n           JNI_INCLUDE_DIRS=\"$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR\"\n      fi\n  done\nfi\n])\n\n# _ACJNI_FOLLOW_SYMLINKS <path>\n# Follows symbolic links on <path>,\n# finally setting variable _ACJNI_FOLLOWED\n# ----------------------------------------\nAC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[\n# find the include directory relative to the javac executable\n_cur=\"$1\"\nwhile ls -ld \"$_cur\" 2>/dev/null | grep \" -> \" >/dev/null; do\n        AC_MSG_CHECKING([symlink for $_cur])\n        _slink=`ls -ld \"$_cur\" | sed 's/.* -> //'`\n        case \"$_slink\" in\n        /*) _cur=\"$_slink\";;\n        # 'X' avoids triggering unwanted echo options.\n        *) _cur=`echo \"X$_cur\" | sed -e 's/^X//' -e 's:[[^/]]*$::'`\"$_slink\";;\n        esac\n        AC_MSG_RESULT([$_cur])\ndone\n_ACJNI_FOLLOWED=\"$_cur\"\n])# _ACJNI\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/build-aux/m4/ax_prog_cc_for_build.m4",
    "content": "# ===========================================================================\n#   http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_PROG_CC_FOR_BUILD\n#\n# DESCRIPTION\n#\n#   This macro searches for a C compiler that generates native executables,\n#   that is a C compiler that surely is not a cross-compiler. This can be\n#   useful if you have to generate source code at compile-time like for\n#   example GCC does.\n#\n#   The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything\n#   needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).\n#   The value of these variables can be overridden by the user by specifying\n#   a compiler with an environment variable (like you do for standard CC).\n#\n#   It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object\n#   file extensions for the build platform, and GCC_FOR_BUILD to `yes' if\n#   the compiler we found is GCC. All these variables but GCC_FOR_BUILD are\n#   substituted in the Makefile.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved. This file is offered as-is, without any\n#   warranty.\n\n#serial 8\n\nAU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])\nAC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_PROG_CPP])dnl\nAC_REQUIRE([AC_EXEEXT])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\n\ndnl Use the standard macros, but make them use other variable names\ndnl\npushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl\npushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl\npushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl\npushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl\npushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl\npushdef([ac_cv_exeext], ac_cv_build_exeext)dnl\npushdef([ac_cv_objext], ac_cv_build_objext)dnl\npushdef([ac_exeext], ac_build_exeext)dnl\npushdef([ac_objext], ac_build_objext)dnl\npushdef([CC], CC_FOR_BUILD)dnl\npushdef([CPP], CPP_FOR_BUILD)dnl\npushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl\npushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl\npushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl\npushdef([host], build)dnl\npushdef([host_alias], build_alias)dnl\npushdef([host_cpu], build_cpu)dnl\npushdef([host_vendor], build_vendor)dnl\npushdef([host_os], build_os)dnl\npushdef([ac_cv_host], ac_cv_build)dnl\npushdef([ac_cv_host_alias], ac_cv_build_alias)dnl\npushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl\npushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl\npushdef([ac_cv_host_os], ac_cv_build_os)dnl\npushdef([ac_cpp], ac_build_cpp)dnl\npushdef([ac_compile], ac_build_compile)dnl\npushdef([ac_link], ac_build_link)dnl\n\nsave_cross_compiling=$cross_compiling\nsave_ac_tool_prefix=$ac_tool_prefix\ncross_compiling=no\nac_tool_prefix=\n\nAC_PROG_CC\nAC_PROG_CPP\nAC_EXEEXT\n\nac_tool_prefix=$save_ac_tool_prefix\ncross_compiling=$save_cross_compiling\n\ndnl Restore the old definitions\ndnl\npopdef([ac_link])dnl\npopdef([ac_compile])dnl\npopdef([ac_cpp])dnl\npopdef([ac_cv_host_os])dnl\npopdef([ac_cv_host_vendor])dnl\npopdef([ac_cv_host_cpu])dnl\npopdef([ac_cv_host_alias])dnl\npopdef([ac_cv_host])dnl\npopdef([host_os])dnl\npopdef([host_vendor])dnl\npopdef([host_cpu])dnl\npopdef([host_alias])dnl\npopdef([host])dnl\npopdef([LDFLAGS])dnl\npopdef([CPPFLAGS])dnl\npopdef([CFLAGS])dnl\npopdef([CPP])dnl\npopdef([CC])dnl\npopdef([ac_objext])dnl\npopdef([ac_exeext])dnl\npopdef([ac_cv_objext])dnl\npopdef([ac_cv_exeext])dnl\npopdef([ac_cv_prog_cc_g])dnl\npopdef([ac_cv_prog_cc_cross])dnl\npopdef([ac_cv_prog_cc_works])dnl\npopdef([ac_cv_prog_gcc])dnl\npopdef([ac_cv_prog_CPP])dnl\n\ndnl Finally, set Makefile variables\ndnl\nBUILD_EXEEXT=$ac_build_exeext\nBUILD_OBJEXT=$ac_build_objext\nAC_SUBST(BUILD_EXEEXT)dnl\nAC_SUBST(BUILD_OBJEXT)dnl\nAC_SUBST([CFLAGS_FOR_BUILD])dnl\nAC_SUBST([CPPFLAGS_FOR_BUILD])dnl\nAC_SUBST([LDFLAGS_FOR_BUILD])dnl\n])\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/build-aux/m4/bitcoin_secp.m4",
    "content": "dnl libsecp25k1 helper checks\nAC_DEFUN([SECP_INT128_CHECK],[\nhas_int128=$ac_cv_type___int128\n])\n\ndnl escape \"$0x\" below using the m4 quadrigaph @S|@, and escape it again with a \\ for the shell.\nAC_DEFUN([SECP_64BIT_ASM_CHECK],[\nAC_MSG_CHECKING(for x86_64 assembly availability)\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n  #include <stdint.h>]],[[\n  uint64_t a = 11, tmp;\n  __asm__ __volatile__(\"movq \\@S|@0x100000000,%1; mulq %%rsi\" : \"+a\"(a) : \"S\"(tmp) : \"cc\", \"%rdx\");\n  ]])],[has_64bit_asm=yes],[has_64bit_asm=no])\nAC_MSG_RESULT([$has_64bit_asm])\n])\n\ndnl\nAC_DEFUN([SECP_OPENSSL_CHECK],[\n  has_libcrypto=no\n  m4_ifdef([PKG_CHECK_MODULES],[\n    PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes],[has_libcrypto=no])\n    if test x\"$has_libcrypto\" = x\"yes\"; then\n      TEMP_LIBS=\"$LIBS\"\n      LIBS=\"$LIBS $CRYPTO_LIBS\"\n      AC_CHECK_LIB(crypto, main,[AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])],[has_libcrypto=no])\n      LIBS=\"$TEMP_LIBS\"\n    fi\n  ])\n  if test x$has_libcrypto = xno; then\n    AC_CHECK_HEADER(openssl/crypto.h,[\n      AC_CHECK_LIB(crypto, main,[\n        has_libcrypto=yes\n        CRYPTO_LIBS=-lcrypto\n        AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])\n      ])\n    ])\n    LIBS=\n  fi\nif test x\"$has_libcrypto\" = x\"yes\" && test x\"$has_openssl_ec\" = x; then\n  AC_MSG_CHECKING(for EC functions in libcrypto)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n    #include <openssl/ec.h>\n    #include <openssl/ecdsa.h>\n    #include <openssl/obj_mac.h>]],[[\n    EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1);\n    ECDSA_sign(0, NULL, 0, NULL, NULL, eckey);\n    ECDSA_verify(0, NULL, 0, NULL, 0, eckey);\n    EC_KEY_free(eckey);\n    ECDSA_SIG *sig_openssl;\n    sig_openssl = ECDSA_SIG_new();\n    (void)sig_openssl->r;\n    ECDSA_SIG_free(sig_openssl);\n  ]])],[has_openssl_ec=yes],[has_openssl_ec=no])\n  AC_MSG_RESULT([$has_openssl_ec])\nfi\n])\n\ndnl\nAC_DEFUN([SECP_GMP_CHECK],[\nif test x\"$has_gmp\" != x\"yes\"; then\n  CPPFLAGS_TEMP=\"$CPPFLAGS\"\n  CPPFLAGS=\"$GMP_CPPFLAGS $CPPFLAGS\"\n  LIBS_TEMP=\"$LIBS\"\n  LIBS=\"$GMP_LIBS $LIBS\"\n  AC_CHECK_HEADER(gmp.h,[AC_CHECK_LIB(gmp, __gmpz_init,[has_gmp=yes; GMP_LIBS=\"$GMP_LIBS -lgmp\"; AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])])])\n  CPPFLAGS=\"$CPPFLAGS_TEMP\"\n  LIBS=\"$LIBS_TEMP\"\nfi\n])\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/configure.ac",
    "content": "AC_PREREQ([2.60])\nAC_INIT([libsecp256k1],[0.1])\nAC_CONFIG_AUX_DIR([build-aux])\nAC_CONFIG_MACRO_DIR([build-aux/m4])\nAC_CANONICAL_HOST\nAH_TOP([#ifndef LIBSECP256K1_CONFIG_H])\nAH_TOP([#define LIBSECP256K1_CONFIG_H])\nAH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/])\nAM_INIT_AUTOMAKE([foreign subdir-objects])\nLT_INIT\n\ndnl make the compilation flags quiet unless V=1 is used\nm4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])\n\nPKG_PROG_PKG_CONFIG\n\nAC_PATH_TOOL(AR, ar)\nAC_PATH_TOOL(RANLIB, ranlib)\nAC_PATH_TOOL(STRIP, strip)\nAX_PROG_CC_FOR_BUILD\n\nif test \"x$CFLAGS\" = \"x\"; then\n  CFLAGS=\"-g\"\nfi\n\nAM_PROG_CC_C_O\n\nAC_PROG_CC_C89\nif test x\"$ac_cv_prog_cc_c89\" = x\"no\"; then\n  AC_MSG_ERROR([c89 compiler support required])\nfi\nAM_PROG_AS\n\ncase $host_os in\n  *darwin*)\n     if  test x$cross_compiling != xyes; then\n       AC_PATH_PROG([BREW],brew,)\n       if test x$BREW != x; then\n         dnl These Homebrew packages may be keg-only, meaning that they won't be found\n         dnl in expected paths because they may conflict with system files. Ask\n         dnl Homebrew where each one is located, then adjust paths accordingly.\n\n         openssl_prefix=`$BREW --prefix openssl 2>/dev/null`\n         gmp_prefix=`$BREW --prefix gmp 2>/dev/null`\n         if test x$openssl_prefix != x; then\n           PKG_CONFIG_PATH=\"$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH\"\n           export PKG_CONFIG_PATH\n         fi\n         if test x$gmp_prefix != x; then\n           GMP_CPPFLAGS=\"-I$gmp_prefix/include\"\n           GMP_LIBS=\"-L$gmp_prefix/lib\"\n         fi\n       else\n         AC_PATH_PROG([PORT],port,)\n         dnl if homebrew isn't installed and macports is, add the macports default paths\n         dnl as a last resort.\n         if test x$PORT != x; then\n           CPPFLAGS=\"$CPPFLAGS -isystem /opt/local/include\"\n           LDFLAGS=\"$LDFLAGS -L/opt/local/lib\"\n         fi\n       fi\n     fi\n   ;;\nesac\n\nCFLAGS=\"$CFLAGS -W\"\n\nwarn_CFLAGS=\"-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings\"\nsaved_CFLAGS=\"$CFLAGS\"\nCFLAGS=\"$CFLAGS $warn_CFLAGS\"\nAC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])\nAC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],\n    [ AC_MSG_RESULT([yes]) ],\n    [ AC_MSG_RESULT([no])\n      CFLAGS=\"$saved_CFLAGS\"\n    ])\n\nsaved_CFLAGS=\"$CFLAGS\"\nCFLAGS=\"$CFLAGS -fvisibility=hidden\"\nAC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])\nAC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],\n    [ AC_MSG_RESULT([yes]) ],\n    [ AC_MSG_RESULT([no])\n      CFLAGS=\"$saved_CFLAGS\"\n    ])\n\nAC_ARG_ENABLE(benchmark,\n    AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]),\n    [use_benchmark=$enableval],\n    [use_benchmark=no])\n\nAC_ARG_ENABLE(coverage,\n    AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis]),\n    [enable_coverage=$enableval],\n    [enable_coverage=no])\n\nAC_ARG_ENABLE(tests,\n    AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]),\n    [use_tests=$enableval],\n    [use_tests=yes])\n\nAC_ARG_ENABLE(openssl_tests,\n    AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]),\n    [enable_openssl_tests=$enableval],\n    [enable_openssl_tests=auto])\n\nAC_ARG_ENABLE(experimental,\n    AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]),\n    [use_experimental=$enableval],\n    [use_experimental=no])\n\nAC_ARG_ENABLE(exhaustive_tests,\n    AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests (default is yes)]),\n    [use_exhaustive_tests=$enableval],\n    [use_exhaustive_tests=yes])\n\nAC_ARG_ENABLE(endomorphism,\n    AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]),\n    [use_endomorphism=$enableval],\n    [use_endomorphism=no])\n\nAC_ARG_ENABLE(ecmult_static_precomputation,\n    AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]),\n    [use_ecmult_static_precomputation=$enableval],\n    [use_ecmult_static_precomputation=auto])\n\nAC_ARG_ENABLE(module_ecdh,\n    AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]),\n    [enable_module_ecdh=$enableval],\n    [enable_module_ecdh=no])\n\nAC_ARG_ENABLE(module_recovery,\n    AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]),\n    [enable_module_recovery=$enableval],\n    [enable_module_recovery=no])\n\nAC_ARG_ENABLE(jni,\n    AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is auto)]),\n    [use_jni=$enableval],\n    [use_jni=auto])\n\nAC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto],\n[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto])\n\nAC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto],\n[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto])\n\nAC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto],\n[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto])\n\nAC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto]\n[Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto])\n\nAC_CHECK_TYPES([__int128])\n\nAC_MSG_CHECKING([for __builtin_expect])\nAC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])],\n    [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ],\n    [ AC_MSG_RESULT([no])\n    ])\n\nif test x\"$enable_coverage\" = x\"yes\"; then\n    AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code])\n    CFLAGS=\"$CFLAGS -O0 --coverage\"\n    LDFLAGS=\"--coverage\"\nelse\n    CFLAGS=\"$CFLAGS -O3\"\nfi\n\nif test x\"$use_ecmult_static_precomputation\" != x\"no\"; then\n  save_cross_compiling=$cross_compiling\n  cross_compiling=no\n  TEMP_CC=\"$CC\"\n  CC=\"$CC_FOR_BUILD\"\n  AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}])\n  AC_RUN_IFELSE(\n    [AC_LANG_PROGRAM([], [return 0])],\n    [working_native_cc=yes],\n    [working_native_cc=no],[dnl])\n  CC=\"$TEMP_CC\"\n  cross_compiling=$save_cross_compiling\n\n  if test x\"$working_native_cc\" = x\"no\"; then\n    set_precomp=no\n    if test x\"$use_ecmult_static_precomputation\" = x\"yes\";  then\n      AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])\n    else\n      AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD])\n    fi\n  else\n    AC_MSG_RESULT([ok])\n    set_precomp=yes\n  fi\nelse\n  set_precomp=no\nfi\n\nif test x\"$req_asm\" = x\"auto\"; then\n  SECP_64BIT_ASM_CHECK\n  if test x\"$has_64bit_asm\" = x\"yes\"; then\n    set_asm=x86_64\n  fi\n  if test x\"$set_asm\" = x; then\n    set_asm=no\n  fi\nelse\n  set_asm=$req_asm\n  case $set_asm in\n  x86_64)\n    SECP_64BIT_ASM_CHECK\n    if test x\"$has_64bit_asm\" != x\"yes\"; then\n      AC_MSG_ERROR([x86_64 assembly optimization requested but not available])\n    fi\n    ;;\n  arm)\n    ;;\n  no)\n    ;;\n  *)\n    AC_MSG_ERROR([invalid assembly optimization selection])\n    ;;\n  esac\nfi\n\nif test x\"$req_field\" = x\"auto\"; then\n  if test x\"set_asm\" = x\"x86_64\"; then\n    set_field=64bit\n  fi\n  if test x\"$set_field\" = x; then\n    SECP_INT128_CHECK\n    if test x\"$has_int128\" = x\"yes\"; then\n      set_field=64bit\n    fi\n  fi\n  if test x\"$set_field\" = x; then\n    set_field=32bit\n  fi\nelse\n  set_field=$req_field\n  case $set_field in\n  64bit)\n    if test x\"$set_asm\" != x\"x86_64\"; then\n      SECP_INT128_CHECK\n      if test x\"$has_int128\" != x\"yes\"; then\n        AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available])\n      fi\n    fi\n    ;;\n  32bit)\n    ;;\n  *)\n    AC_MSG_ERROR([invalid field implementation selection])\n    ;;\n  esac\nfi\n\nif test x\"$req_scalar\" = x\"auto\"; then\n  SECP_INT128_CHECK\n  if test x\"$has_int128\" = x\"yes\"; then\n    set_scalar=64bit\n  fi\n  if test x\"$set_scalar\" = x; then\n    set_scalar=32bit\n  fi\nelse\n  set_scalar=$req_scalar\n  case $set_scalar in\n  64bit)\n    SECP_INT128_CHECK\n    if test x\"$has_int128\" != x\"yes\"; then\n      AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available])\n    fi\n    ;;\n  32bit)\n    ;;\n  *)\n    AC_MSG_ERROR([invalid scalar implementation selected])\n    ;;\n  esac\nfi\n\nif test x\"$req_bignum\" = x\"auto\"; then\n  SECP_GMP_CHECK\n  if test x\"$has_gmp\" = x\"yes\"; then\n    set_bignum=gmp\n  fi\n\n  if test x\"$set_bignum\" = x; then\n    set_bignum=no\n  fi\nelse\n  set_bignum=$req_bignum\n  case $set_bignum in\n  gmp)\n    SECP_GMP_CHECK\n    if test x\"$has_gmp\" != x\"yes\"; then\n      AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available])\n    fi\n    ;;\n  no)\n    ;;\n  *)\n    AC_MSG_ERROR([invalid bignum implementation selection])\n    ;;\n  esac\nfi\n\n# select assembly optimization\nuse_external_asm=no\n\ncase $set_asm in\nx86_64)\n  AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations])\n  ;;\narm)\n  use_external_asm=yes\n  ;;\nno)\n  ;;\n*)\n  AC_MSG_ERROR([invalid assembly optimizations])\n  ;;\nesac\n\n# select field implementation\ncase $set_field in\n64bit)\n  AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation])\n  ;;\n32bit)\n  AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation])\n  ;;\n*)\n  AC_MSG_ERROR([invalid field implementation])\n  ;;\nesac\n\n# select bignum implementation\ncase $set_bignum in\ngmp)\n  AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed])\n  AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num])\n  AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation])\n  AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation])\n  ;;\nno)\n  AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation])\n  AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation])\n  AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation])\n  ;;\n*)\n  AC_MSG_ERROR([invalid bignum implementation])\n  ;;\nesac\n\n#select scalar implementation\ncase $set_scalar in\n64bit)\n  AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation])\n  ;;\n32bit)\n  AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation])\n  ;;\n*)\n  AC_MSG_ERROR([invalid scalar implementation])\n  ;;\nesac\n\nif test x\"$use_tests\" = x\"yes\"; then\n  SECP_OPENSSL_CHECK\n  if test x\"$has_openssl_ec\" = x\"yes\"; then\n    if test x\"$enable_openssl_tests\" != x\"no\"; then\n      AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available])\n      SECP_TEST_INCLUDES=\"$SSL_CFLAGS $CRYPTO_CFLAGS\"\n      SECP_TEST_LIBS=\"$CRYPTO_LIBS\"\n\n      case $host in\n      *mingw*)\n        SECP_TEST_LIBS=\"$SECP_TEST_LIBS -lgdi32\"\n        ;;\n      esac\n    fi\n  else\n    if test x\"$enable_openssl_tests\" = x\"yes\"; then\n      AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available])\n    fi\n  fi\nelse\n  if test x\"$enable_openssl_tests\" = x\"yes\"; then\n    AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled])\n  fi\nfi\n\nif test x\"$use_jni\" != x\"no\"; then\n  AX_JNI_INCLUDE_DIR\n  have_jni_dependencies=yes\n  if test x\"$enable_module_ecdh\" = x\"no\"; then\n    have_jni_dependencies=no\n  fi\n  if test \"x$JNI_INCLUDE_DIRS\" = \"x\"; then\n    have_jni_dependencies=no\n  fi\n  if test \"x$have_jni_dependencies\" = \"xno\"; then\n    if test x\"$use_jni\" = x\"yes\"; then\n      AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.])\n    fi\n    AC_MSG_WARN([jni headers/dependencies not found. jni support disabled])\n    use_jni=no\n  else\n    use_jni=yes\n    for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do\n      JNI_INCLUDES=\"$JNI_INCLUDES -I$JNI_INCLUDE_DIR\"\n    done\n  fi\nfi\n\nif test x\"$set_bignum\" = x\"gmp\"; then\n  SECP_LIBS=\"$SECP_LIBS $GMP_LIBS\"\n  SECP_INCLUDES=\"$SECP_INCLUDES $GMP_CPPFLAGS\"\nfi\n\nif test x\"$use_endomorphism\" = x\"yes\"; then\n  AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization])\nfi\n\nif test x\"$set_precomp\" = x\"yes\"; then\n  AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table])\nfi\n\nif test x\"$enable_module_ecdh\" = x\"yes\"; then\n  AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module])\nfi\n\nif test x\"$enable_module_recovery\" = x\"yes\"; then\n  AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module])\nfi\n\nAC_C_BIGENDIAN()\n\nif test x\"$use_external_asm\" = x\"yes\"; then\n  AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used])\nfi\n\nAC_MSG_NOTICE([Using static precomputation: $set_precomp])\nAC_MSG_NOTICE([Using assembly optimizations: $set_asm])\nAC_MSG_NOTICE([Using field implementation: $set_field])\nAC_MSG_NOTICE([Using bignum implementation: $set_bignum])\nAC_MSG_NOTICE([Using scalar implementation: $set_scalar])\nAC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism])\nAC_MSG_NOTICE([Building for coverage analysis: $enable_coverage])\nAC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])\nAC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery])\nAC_MSG_NOTICE([Using jni: $use_jni])\n\nif test x\"$enable_experimental\" = x\"yes\"; then\n  AC_MSG_NOTICE([******])\n  AC_MSG_NOTICE([WARNING: experimental build])\n  AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.])\n  AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh])\n  AC_MSG_NOTICE([******])\nelse\n  if test x\"$enable_module_ecdh\" = x\"yes\"; then\n    AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.])\n  fi\n  if test x\"$set_asm\" = x\"arm\"; then\n    AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.])\n  fi\nfi\n\nAC_CONFIG_HEADERS([src/libsecp256k1-config.h])\nAC_CONFIG_FILES([Makefile libsecp256k1.pc])\nAC_SUBST(JNI_INCLUDES)\nAC_SUBST(SECP_INCLUDES)\nAC_SUBST(SECP_LIBS)\nAC_SUBST(SECP_TEST_LIBS)\nAC_SUBST(SECP_TEST_INCLUDES)\nAM_CONDITIONAL([ENABLE_COVERAGE], [test x\"$enable_coverage\" = x\"yes\"])\nAM_CONDITIONAL([USE_TESTS], [test x\"$use_tests\" != x\"no\"])\nAM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x\"$use_exhaustive_tests\" != x\"no\"])\nAM_CONDITIONAL([USE_BENCHMARK], [test x\"$use_benchmark\" = x\"yes\"])\nAM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x\"$set_precomp\" = x\"yes\"])\nAM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x\"$enable_module_ecdh\" = x\"yes\"])\nAM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x\"$enable_module_recovery\" = x\"yes\"])\nAM_CONDITIONAL([USE_JNI], [test x\"$use_jni\" == x\"yes\"])\nAM_CONDITIONAL([USE_EXTERNAL_ASM], [test x\"$use_external_asm\" = x\"yes\"])\nAM_CONDITIONAL([USE_ASM_ARM], [test x\"$set_asm\" = x\"arm\"])\n\ndnl make sure nothing new is exported so that we don't break the cache\nPKGCONFIG_PATH_TEMP=\"$PKG_CONFIG_PATH\"\nunset PKG_CONFIG_PATH\nPKG_CONFIG_PATH=\"$PKGCONFIG_PATH_TEMP\"\n\nAC_OUTPUT\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/contrib/lax_der_parsing.c",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include <string.h>\n#include <secp256k1.h>\n\n#include \"lax_der_parsing.h\"\n\nint ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) {\n    size_t rpos, rlen, spos, slen;\n    size_t pos = 0;\n    size_t lenbyte;\n    unsigned char tmpsig[64] = {0};\n    int overflow = 0;\n\n    /* Hack to initialize sig with a correctly-parsed but invalid signature. */\n    secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);\n\n    /* Sequence tag byte */\n    if (pos == inputlen || input[pos] != 0x30) {\n        return 0;\n    }\n    pos++;\n\n    /* Sequence length bytes */\n    if (pos == inputlen) {\n        return 0;\n    }\n    lenbyte = input[pos++];\n    if (lenbyte & 0x80) {\n        lenbyte -= 0x80;\n        if (pos + lenbyte > inputlen) {\n            return 0;\n        }\n        pos += lenbyte;\n    }\n\n    /* Integer tag byte for R */\n    if (pos == inputlen || input[pos] != 0x02) {\n        return 0;\n    }\n    pos++;\n\n    /* Integer length for R */\n    if (pos == inputlen) {\n        return 0;\n    }\n    lenbyte = input[pos++];\n    if (lenbyte & 0x80) {\n        lenbyte -= 0x80;\n        if (pos + lenbyte > inputlen) {\n            return 0;\n        }\n        while (lenbyte > 0 && input[pos] == 0) {\n            pos++;\n            lenbyte--;\n        }\n        if (lenbyte >= sizeof(size_t)) {\n            return 0;\n        }\n        rlen = 0;\n        while (lenbyte > 0) {\n            rlen = (rlen << 8) + input[pos];\n            pos++;\n            lenbyte--;\n        }\n    } else {\n        rlen = lenbyte;\n    }\n    if (rlen > inputlen - pos) {\n        return 0;\n    }\n    rpos = pos;\n    pos += rlen;\n\n    /* Integer tag byte for S */\n    if (pos == inputlen || input[pos] != 0x02) {\n        return 0;\n    }\n    pos++;\n\n    /* Integer length for S */\n    if (pos == inputlen) {\n        return 0;\n    }\n    lenbyte = input[pos++];\n    if (lenbyte & 0x80) {\n        lenbyte -= 0x80;\n        if (pos + lenbyte > inputlen) {\n            return 0;\n        }\n        while (lenbyte > 0 && input[pos] == 0) {\n            pos++;\n            lenbyte--;\n        }\n        if (lenbyte >= sizeof(size_t)) {\n            return 0;\n        }\n        slen = 0;\n        while (lenbyte > 0) {\n            slen = (slen << 8) + input[pos];\n            pos++;\n            lenbyte--;\n        }\n    } else {\n        slen = lenbyte;\n    }\n    if (slen > inputlen - pos) {\n        return 0;\n    }\n    spos = pos;\n    pos += slen;\n\n    /* Ignore leading zeroes in R */\n    while (rlen > 0 && input[rpos] == 0) {\n        rlen--;\n        rpos++;\n    }\n    /* Copy R value */\n    if (rlen > 32) {\n        overflow = 1;\n    } else {\n        memcpy(tmpsig + 32 - rlen, input + rpos, rlen);\n    }\n\n    /* Ignore leading zeroes in S */\n    while (slen > 0 && input[spos] == 0) {\n        slen--;\n        spos++;\n    }\n    /* Copy S value */\n    if (slen > 32) {\n        overflow = 1;\n    } else {\n        memcpy(tmpsig + 64 - slen, input + spos, slen);\n    }\n\n    if (!overflow) {\n        overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);\n    }\n    if (overflow) {\n        memset(tmpsig, 0, 64);\n        secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);\n    }\n    return 1;\n}\n\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/contrib/lax_der_parsing.h",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n/****\n * Please do not link this file directly. It is not part of the libsecp256k1\n * project and does not promise any stability in its API, functionality or\n * presence. Projects which use this code should instead copy this header\n * and its accompanying .c file directly into their codebase.\n ****/\n\n/* This file defines a function that parses DER with various errors and\n * violations. This is not a part of the library itself, because the allowed\n * violations are chosen arbitrarily and do not follow or establish any\n * standard.\n *\n * In many places it matters that different implementations do not only accept\n * the same set of valid signatures, but also reject the same set of signatures.\n * The only means to accomplish that is by strictly obeying a standard, and not\n * accepting anything else.\n *\n * Nonetheless, sometimes there is a need for compatibility with systems that\n * use signatures which do not strictly obey DER. The snippet below shows how\n * certain violations are easily supported. You may need to adapt it.\n *\n * Do not use this for new systems. Use well-defined DER or compact signatures\n * instead if you have the choice (see secp256k1_ecdsa_signature_parse_der and\n * secp256k1_ecdsa_signature_parse_compact).\n *\n * The supported violations are:\n * - All numbers are parsed as nonnegative integers, even though X.609-0207\n *   section 8.3.3 specifies that integers are always encoded as two's\n *   complement.\n * - Integers can have length 0, even though section 8.3.1 says they can't.\n * - Integers with overly long padding are accepted, violation section\n *   8.3.2.\n * - 127-byte long length descriptors are accepted, even though section\n *   8.1.3.5.c says that they are not.\n * - Trailing garbage data inside or after the signature is ignored.\n * - The length descriptor of the sequence is ignored.\n *\n * Compared to for example OpenSSL, many violations are NOT supported:\n * - Using overly long tag descriptors for the sequence or integers inside,\n *   violating section 8.1.2.2.\n * - Encoding primitive integers as constructed values, violating section\n *   8.3.1.\n */\n\n#ifndef _SECP256K1_CONTRIB_LAX_DER_PARSING_H_\n#define _SECP256K1_CONTRIB_LAX_DER_PARSING_H_\n\n#include <secp256k1.h>\n\n# ifdef __cplusplus\nextern \"C\" {\n# endif\n\n/** Parse a signature in \"lax DER\" format\n *\n *  Returns: 1 when the signature could be parsed, 0 otherwise.\n *  Args: ctx:      a secp256k1 context object\n *  Out:  sig:      a pointer to a signature object\n *  In:   input:    a pointer to the signature to be parsed\n *        inputlen: the length of the array pointed to be input\n *\n *  This function will accept any valid DER encoded signature, even if the\n *  encoded numbers are out of range. In addition, it will accept signatures\n *  which violate the DER spec in various ways. Its purpose is to allow\n *  validation of the Bitcoin blockchain, which includes non-DER signatures\n *  from before the network rules were updated to enforce DER. Note that\n *  the set of supported violations is a strict subset of what OpenSSL will\n *  accept.\n *\n *  After the call, sig will always be initialized. If parsing failed or the\n *  encoded numbers are out of range, signature validation with it is\n *  guaranteed to fail for every message and public key.\n */\nint ecdsa_signature_parse_der_lax(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_signature* sig,\n    const unsigned char *input,\n    size_t inputlen\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/contrib/lax_der_privatekey_parsing.c",
    "content": "/**********************************************************************\n * Copyright (c) 2014, 2015 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include <string.h>\n#include <secp256k1.h>\n\n#include \"lax_der_privatekey_parsing.h\"\n\nint ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) {\n    const unsigned char *end = privkey + privkeylen;\n    int lenb = 0;\n    int len = 0;\n    memset(out32, 0, 32);\n    /* sequence header */\n    if (end < privkey+1 || *privkey != 0x30) {\n        return 0;\n    }\n    privkey++;\n    /* sequence length constructor */\n    if (end < privkey+1 || !(*privkey & 0x80)) {\n        return 0;\n    }\n    lenb = *privkey & ~0x80; privkey++;\n    if (lenb < 1 || lenb > 2) {\n        return 0;\n    }\n    if (end < privkey+lenb) {\n        return 0;\n    }\n    /* sequence length */\n    len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0);\n    privkey += lenb;\n    if (end < privkey+len) {\n        return 0;\n    }\n    /* sequence element 0: version number (=1) */\n    if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) {\n        return 0;\n    }\n    privkey += 3;\n    /* sequence element 1: octet string, up to 32 bytes */\n    if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) {\n        return 0;\n    }\n    memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]);\n    if (!secp256k1_ec_seckey_verify(ctx, out32)) {\n        memset(out32, 0, 32);\n        return 0;\n    }\n    return 1;\n}\n\nint ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) {\n    secp256k1_pubkey pubkey;\n    size_t pubkeylen = 0;\n    if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) {\n        *privkeylen = 0;\n        return 0;\n    }\n    if (compressed) {\n        static const unsigned char begin[] = {\n            0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20\n        };\n        static const unsigned char middle[] = {\n            0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48,\n            0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n            0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n            0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04,\n            0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87,\n            0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8,\n            0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n            0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E,\n            0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00\n        };\n        unsigned char *ptr = privkey;\n        memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin);\n        memcpy(ptr, key32, 32); ptr += 32;\n        memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle);\n        pubkeylen = 33;\n        secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED);\n        ptr += pubkeylen;\n        *privkeylen = ptr - privkey;\n    } else {\n        static const unsigned char begin[] = {\n            0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20\n        };\n        static const unsigned char middle[] = {\n            0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48,\n            0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n            0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n            0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04,\n            0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87,\n            0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8,\n            0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11,\n            0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10,\n            0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n            0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E,\n            0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00\n        };\n        unsigned char *ptr = privkey;\n        memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin);\n        memcpy(ptr, key32, 32); ptr += 32;\n        memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle);\n        pubkeylen = 65;\n        secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED);\n        ptr += pubkeylen;\n        *privkeylen = ptr - privkey;\n    }\n    return 1;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/contrib/lax_der_privatekey_parsing.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014, 2015 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n/****\n * Please do not link this file directly. It is not part of the libsecp256k1\n * project and does not promise any stability in its API, functionality or\n * presence. Projects which use this code should instead copy this header\n * and its accompanying .c file directly into their codebase.\n ****/\n\n/* This file contains code snippets that parse DER private keys with\n * various errors and violations.  This is not a part of the library\n * itself, because the allowed violations are chosen arbitrarily and\n * do not follow or establish any standard.\n *\n * It also contains code to serialize private keys in a compatible\n * manner.\n *\n * These functions are meant for compatibility with applications\n * that require BER encoded keys. When working with secp256k1-specific\n * code, the simple 32-byte private keys normally used by the\n * library are sufficient.\n */\n\n#ifndef _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_\n#define _SECP256K1_CONTRIB_BER_PRIVATEKEY_H_\n\n#include <secp256k1.h>\n\n# ifdef __cplusplus\nextern \"C\" {\n# endif\n\n/** Export a private key in DER format.\n *\n *  Returns: 1 if the private key was valid.\n *  Args: ctx:        pointer to a context object, initialized for signing (cannot\n *                    be NULL)\n *  Out: privkey:     pointer to an array for storing the private key in BER.\n *                    Should have space for 279 bytes, and cannot be NULL.\n *       privkeylen:  Pointer to an int where the length of the private key in\n *                    privkey will be stored.\n *  In:  seckey:      pointer to a 32-byte secret key to export.\n *       compressed:  1 if the key should be exported in\n *                    compressed format, 0 otherwise\n *\n *  This function is purely meant for compatibility with applications that\n *  require BER encoded keys. When working with secp256k1-specific code, the\n *  simple 32-byte private keys are sufficient.\n *\n *  Note that this function does not guarantee correct DER output. It is\n *  guaranteed to be parsable by secp256k1_ec_privkey_import_der\n */\nSECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der(\n    const secp256k1_context* ctx,\n    unsigned char *privkey,\n    size_t *privkeylen,\n    const unsigned char *seckey,\n    int compressed\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n/** Import a private key in DER format.\n * Returns: 1 if a private key was extracted.\n * Args: ctx:        pointer to a context object (cannot be NULL).\n * Out:  seckey:     pointer to a 32-byte array for storing the private key.\n *                   (cannot be NULL).\n * In:   privkey:    pointer to a private key in DER format (cannot be NULL).\n *       privkeylen: length of the DER private key pointed to be privkey.\n *\n * This function will accept more than just strict DER, and even allow some BER\n * violations. The public key stored inside the DER-encoded private key is not\n * verified for correctness, nor are the curve parameters. Use this function\n * only if you know in advance it is supposed to contain a secp256k1 private\n * key.\n */\nSECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der(\n    const secp256k1_context* ctx,\n    unsigned char *seckey,\n    const unsigned char *privkey,\n    size_t privkeylen\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/include/secp256k1.h",
    "content": "#ifndef _SECP256K1_\n# define _SECP256K1_\n\n# ifdef __cplusplus\nextern \"C\" {\n# endif\n\n#include <stddef.h>\n\n/* These rules specify the order of arguments in API calls:\n *\n * 1. Context pointers go first, followed by output arguments, combined\n *    output/input arguments, and finally input-only arguments.\n * 2. Array lengths always immediately the follow the argument whose length\n *    they describe, even if this violates rule 1.\n * 3. Within the OUT/OUTIN/IN groups, pointers to data that is typically generated\n *    later go first. This means: signatures, public nonces, private nonces,\n *    messages, public keys, secret keys, tweaks.\n * 4. Arguments that are not data pointers go last, from more complex to less\n *    complex: function pointers, algorithm names, messages, void pointers,\n *    counts, flags, booleans.\n * 5. Opaque data pointers follow the function pointer they are to be passed to.\n */\n\n/** Opaque data structure that holds context information (precomputed tables etc.).\n *\n *  The purpose of context structures is to cache large precomputed data tables\n *  that are expensive to construct, and also to maintain the randomization data\n *  for blinding.\n *\n *  Do not create a new context object for each operation, as construction is\n *  far slower than all other API calls (~100 times slower than an ECDSA\n *  verification).\n *\n *  A constructed context can safely be used from multiple threads\n *  simultaneously, but API call that take a non-const pointer to a context\n *  need exclusive access to it. In particular this is the case for\n *  secp256k1_context_destroy and secp256k1_context_randomize.\n *\n *  Regarding randomization, either do it once at creation time (in which case\n *  you do not need any locking for the other calls), or use a read-write lock.\n */\ntypedef struct secp256k1_context_struct secp256k1_context;\n\n/** Opaque data structure that holds a parsed and valid public key.\n *\n *  The exact representation of data inside is implementation defined and not\n *  guaranteed to be portable between different platforms or versions. It is\n *  however guaranteed to be 64 bytes in size, and can be safely copied/moved.\n *  If you need to convert to a format suitable for storage, transmission, or\n *  comparison, use secp256k1_ec_pubkey_serialize and secp256k1_ec_pubkey_parse.\n */\ntypedef struct {\n    unsigned char data[64];\n} secp256k1_pubkey;\n\n/** Opaque data structured that holds a parsed ECDSA signature.\n *\n *  The exact representation of data inside is implementation defined and not\n *  guaranteed to be portable between different platforms or versions. It is\n *  however guaranteed to be 64 bytes in size, and can be safely copied/moved.\n *  If you need to convert to a format suitable for storage, transmission, or\n *  comparison, use the secp256k1_ecdsa_signature_serialize_* and\n *  secp256k1_ecdsa_signature_serialize_* functions.\n */\ntypedef struct {\n    unsigned char data[64];\n} secp256k1_ecdsa_signature;\n\n/** A pointer to a function to deterministically generate a nonce.\n *\n * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail.\n * Out:     nonce32:   pointer to a 32-byte array to be filled by the function.\n * In:      msg32:     the 32-byte message hash being verified (will not be NULL)\n *          key32:     pointer to a 32-byte secret key (will not be NULL)\n *          algo16:    pointer to a 16-byte array describing the signature\n *                     algorithm (will be NULL for ECDSA for compatibility).\n *          data:      Arbitrary data pointer that is passed through.\n *          attempt:   how many iterations we have tried to find a nonce.\n *                     This will almost always be 0, but different attempt values\n *                     are required to result in a different nonce.\n *\n * Except for test cases, this function should compute some cryptographic hash of\n * the message, the algorithm, the key and the attempt.\n */\ntypedef int (*secp256k1_nonce_function)(\n    unsigned char *nonce32,\n    const unsigned char *msg32,\n    const unsigned char *key32,\n    const unsigned char *algo16,\n    void *data,\n    unsigned int attempt\n);\n\n# if !defined(SECP256K1_GNUC_PREREQ)\n#  if defined(__GNUC__)&&defined(__GNUC_MINOR__)\n#   define SECP256K1_GNUC_PREREQ(_maj,_min) \\\n ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))\n#  else\n#   define SECP256K1_GNUC_PREREQ(_maj,_min) 0\n#  endif\n# endif\n\n# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )\n#  if SECP256K1_GNUC_PREREQ(2,7)\n#   define SECP256K1_INLINE __inline__\n#  elif (defined(_MSC_VER))\n#   define SECP256K1_INLINE __inline\n#  else\n#   define SECP256K1_INLINE\n#  endif\n# else\n#  define SECP256K1_INLINE inline\n# endif\n\n#ifndef SECP256K1_API\n# if defined(_WIN32)\n#  ifdef SECP256K1_BUILD\n#   define SECP256K1_API __declspec(dllexport)\n#  else\n#   define SECP256K1_API\n#  endif\n# elif defined(__GNUC__) && defined(SECP256K1_BUILD)\n#  define SECP256K1_API __attribute__ ((visibility (\"default\")))\n# else\n#  define SECP256K1_API\n# endif\n#endif\n\n/**Warning attributes\n  * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out\n  * some paranoid null checks. */\n# if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4)\n#  define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))\n# else\n#  define SECP256K1_WARN_UNUSED_RESULT\n# endif\n# if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4)\n#  define SECP256K1_ARG_NONNULL(_x)  __attribute__ ((__nonnull__(_x)))\n# else\n#  define SECP256K1_ARG_NONNULL(_x)\n# endif\n\n/** All flags' lower 8 bits indicate what they're for. Do not use directly. */\n#define SECP256K1_FLAGS_TYPE_MASK ((1 << 8) - 1)\n#define SECP256K1_FLAGS_TYPE_CONTEXT (1 << 0)\n#define SECP256K1_FLAGS_TYPE_COMPRESSION (1 << 1)\n/** The higher bits contain the actual data. Do not use directly. */\n#define SECP256K1_FLAGS_BIT_CONTEXT_VERIFY (1 << 8)\n#define SECP256K1_FLAGS_BIT_CONTEXT_SIGN (1 << 9)\n#define SECP256K1_FLAGS_BIT_COMPRESSION (1 << 8)\n\n/** Flags to pass to secp256k1_context_create. */\n#define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY)\n#define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN)\n#define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT)\n\n/** Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export. */\n#define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION)\n#define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION)\n\n/** Create a secp256k1 context object.\n *\n *  Returns: a newly created context object.\n *  In:      flags: which parts of the context to initialize.\n */\nSECP256K1_API secp256k1_context* secp256k1_context_create(\n    unsigned int flags\n) SECP256K1_WARN_UNUSED_RESULT;\n\n/** Copies a secp256k1 context object.\n *\n *  Returns: a newly created context object.\n *  Args:    ctx: an existing context to copy (cannot be NULL)\n */\nSECP256K1_API secp256k1_context* secp256k1_context_clone(\n    const secp256k1_context* ctx\n) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT;\n\n/** Destroy a secp256k1 context object.\n *\n *  The context pointer may not be used afterwards.\n *  Args:   ctx: an existing context to destroy (cannot be NULL)\n */\nSECP256K1_API void secp256k1_context_destroy(\n    secp256k1_context* ctx\n);\n\n/** Set a callback function to be called when an illegal argument is passed to\n *  an API call. It will only trigger for violations that are mentioned\n *  explicitly in the header.\n *\n *  The philosophy is that these shouldn't be dealt with through a\n *  specific return value, as calling code should not have branches to deal with\n *  the case that this code itself is broken.\n *\n *  On the other hand, during debug stage, one would want to be informed about\n *  such mistakes, and the default (crashing) may be inadvisable.\n *  When this callback is triggered, the API function called is guaranteed not\n *  to cause a crash, though its return value and output arguments are\n *  undefined.\n *\n *  Args: ctx:  an existing context object (cannot be NULL)\n *  In:   fun:  a pointer to a function to call when an illegal argument is\n *              passed to the API, taking a message and an opaque pointer\n *              (NULL restores a default handler that calls abort).\n *        data: the opaque pointer to pass to fun above.\n */\nSECP256K1_API void secp256k1_context_set_illegal_callback(\n    secp256k1_context* ctx,\n    void (*fun)(const char* message, void* data),\n    const void* data\n) SECP256K1_ARG_NONNULL(1);\n\n/** Set a callback function to be called when an internal consistency check\n *  fails. The default is crashing.\n *\n *  This can only trigger in case of a hardware failure, miscompilation,\n *  memory corruption, serious bug in the library, or other error would can\n *  otherwise result in undefined behaviour. It will not trigger due to mere\n *  incorrect usage of the API (see secp256k1_context_set_illegal_callback\n *  for that). After this callback returns, anything may happen, including\n *  crashing.\n *\n *  Args: ctx:  an existing context object (cannot be NULL)\n *  In:   fun:  a pointer to a function to call when an internal error occurs,\n *              taking a message and an opaque pointer (NULL restores a default\n *              handler that calls abort).\n *        data: the opaque pointer to pass to fun above.\n */\nSECP256K1_API void secp256k1_context_set_error_callback(\n    secp256k1_context* ctx,\n    void (*fun)(const char* message, void* data),\n    const void* data\n) SECP256K1_ARG_NONNULL(1);\n\n/** Parse a variable-length public key into the pubkey object.\n *\n *  Returns: 1 if the public key was fully valid.\n *           0 if the public key could not be parsed or is invalid.\n *  Args: ctx:      a secp256k1 context object.\n *  Out:  pubkey:   pointer to a pubkey object. If 1 is returned, it is set to a\n *                  parsed version of input. If not, its value is undefined.\n *  In:   input:    pointer to a serialized public key\n *        inputlen: length of the array pointed to by input\n *\n *  This function supports parsing compressed (33 bytes, header byte 0x02 or\n *  0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header\n *  byte 0x06 or 0x07) format public keys.\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse(\n    const secp256k1_context* ctx,\n    secp256k1_pubkey* pubkey,\n    const unsigned char *input,\n    size_t inputlen\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Serialize a pubkey object into a serialized byte sequence.\n *\n *  Returns: 1 always.\n *  Args:   ctx:        a secp256k1 context object.\n *  Out:    output:     a pointer to a 65-byte (if compressed==0) or 33-byte (if\n *                      compressed==1) byte array to place the serialized key\n *                      in.\n *  In/Out: outputlen:  a pointer to an integer which is initially set to the\n *                      size of output, and is overwritten with the written\n *                      size.\n *  In:     pubkey:     a pointer to a secp256k1_pubkey containing an\n *                      initialized public key.\n *          flags:      SECP256K1_EC_COMPRESSED if serialization should be in\n *                      compressed format, otherwise SECP256K1_EC_UNCOMPRESSED.\n */\nSECP256K1_API int secp256k1_ec_pubkey_serialize(\n    const secp256k1_context* ctx,\n    unsigned char *output,\n    size_t *outputlen,\n    const secp256k1_pubkey* pubkey,\n    unsigned int flags\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n/** Parse an ECDSA signature in compact (64 bytes) format.\n *\n *  Returns: 1 when the signature could be parsed, 0 otherwise.\n *  Args: ctx:      a secp256k1 context object\n *  Out:  sig:      a pointer to a signature object\n *  In:   input64:  a pointer to the 64-byte array to parse\n *\n *  The signature must consist of a 32-byte big endian R value, followed by a\n *  32-byte big endian S value. If R or S fall outside of [0..order-1], the\n *  encoding is invalid. R and S with value 0 are allowed in the encoding.\n *\n *  After the call, sig will always be initialized. If parsing failed or R or\n *  S are zero, the resulting sig value is guaranteed to fail validation for any\n *  message and public key.\n */\nSECP256K1_API int secp256k1_ecdsa_signature_parse_compact(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_signature* sig,\n    const unsigned char *input64\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Parse a DER ECDSA signature.\n *\n *  Returns: 1 when the signature could be parsed, 0 otherwise.\n *  Args: ctx:      a secp256k1 context object\n *  Out:  sig:      a pointer to a signature object\n *  In:   input:    a pointer to the signature to be parsed\n *        inputlen: the length of the array pointed to be input\n *\n *  This function will accept any valid DER encoded signature, even if the\n *  encoded numbers are out of range.\n *\n *  After the call, sig will always be initialized. If parsing failed or the\n *  encoded numbers are out of range, signature validation with it is\n *  guaranteed to fail for every message and public key.\n */\nSECP256K1_API int secp256k1_ecdsa_signature_parse_der(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_signature* sig,\n    const unsigned char *input,\n    size_t inputlen\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Serialize an ECDSA signature in DER format.\n *\n *  Returns: 1 if enough space was available to serialize, 0 otherwise\n *  Args:   ctx:       a secp256k1 context object\n *  Out:    output:    a pointer to an array to store the DER serialization\n *  In/Out: outputlen: a pointer to a length integer. Initially, this integer\n *                     should be set to the length of output. After the call\n *                     it will be set to the length of the serialization (even\n *                     if 0 was returned).\n *  In:     sig:       a pointer to an initialized signature object\n */\nSECP256K1_API int secp256k1_ecdsa_signature_serialize_der(\n    const secp256k1_context* ctx,\n    unsigned char *output,\n    size_t *outputlen,\n    const secp256k1_ecdsa_signature* sig\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n/** Serialize an ECDSA signature in compact (64 byte) format.\n *\n *  Returns: 1\n *  Args:   ctx:       a secp256k1 context object\n *  Out:    output64:  a pointer to a 64-byte array to store the compact serialization\n *  In:     sig:       a pointer to an initialized signature object\n *\n *  See secp256k1_ecdsa_signature_parse_compact for details about the encoding.\n */\nSECP256K1_API int secp256k1_ecdsa_signature_serialize_compact(\n    const secp256k1_context* ctx,\n    unsigned char *output64,\n    const secp256k1_ecdsa_signature* sig\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Verify an ECDSA signature.\n *\n *  Returns: 1: correct signature\n *           0: incorrect or unparseable signature\n *  Args:    ctx:       a secp256k1 context object, initialized for verification.\n *  In:      sig:       the signature being verified (cannot be NULL)\n *           msg32:     the 32-byte message hash being verified (cannot be NULL)\n *           pubkey:    pointer to an initialized public key to verify with (cannot be NULL)\n *\n * To avoid accepting malleable signatures, only ECDSA signatures in lower-S\n * form are accepted.\n *\n * If you need to accept ECDSA signatures from sources that do not obey this\n * rule, apply secp256k1_ecdsa_signature_normalize to the signature prior to\n * validation, but be aware that doing so results in malleable signatures.\n *\n * For details, see the comments for that function.\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(\n    const secp256k1_context* ctx,\n    const secp256k1_ecdsa_signature *sig,\n    const unsigned char *msg32,\n    const secp256k1_pubkey *pubkey\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n/** Convert a signature to a normalized lower-S form.\n *\n *  Returns: 1 if sigin was not normalized, 0 if it already was.\n *  Args: ctx:    a secp256k1 context object\n *  Out:  sigout: a pointer to a signature to fill with the normalized form,\n *                or copy if the input was already normalized. (can be NULL if\n *                you're only interested in whether the input was already\n *                normalized).\n *  In:   sigin:  a pointer to a signature to check/normalize (cannot be NULL,\n *                can be identical to sigout)\n *\n *  With ECDSA a third-party can forge a second distinct signature of the same\n *  message, given a single initial signature, but without knowing the key. This\n *  is done by negating the S value modulo the order of the curve, 'flipping'\n *  the sign of the random point R which is not included in the signature.\n *\n *  Forgery of the same message isn't universally problematic, but in systems\n *  where message malleability or uniqueness of signatures is important this can\n *  cause issues. This forgery can be blocked by all verifiers forcing signers\n *  to use a normalized form.\n *\n *  The lower-S form reduces the size of signatures slightly on average when\n *  variable length encodings (such as DER) are used and is cheap to verify,\n *  making it a good choice. Security of always using lower-S is assured because\n *  anyone can trivially modify a signature after the fact to enforce this\n *  property anyway.\n *\n *  The lower S value is always between 0x1 and\n *  0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,\n *  inclusive.\n *\n *  No other forms of ECDSA malleability are known and none seem likely, but\n *  there is no formal proof that ECDSA, even with this additional restriction,\n *  is free of other malleability. Commonly used serialization schemes will also\n *  accept various non-unique encodings, so care should be taken when this\n *  property is required for an application.\n *\n *  The secp256k1_ecdsa_sign function will by default create signatures in the\n *  lower-S form, and secp256k1_ecdsa_verify will not accept others. In case\n *  signatures come from a system that cannot enforce this property,\n *  secp256k1_ecdsa_signature_normalize must be called before verification.\n */\nSECP256K1_API int secp256k1_ecdsa_signature_normalize(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_signature *sigout,\n    const secp256k1_ecdsa_signature *sigin\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3);\n\n/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function.\n * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of\n * extra entropy.\n */\nSECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_rfc6979;\n\n/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */\nSECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_default;\n\n/** Create an ECDSA signature.\n *\n *  Returns: 1: signature created\n *           0: the nonce generation function failed, or the private key was invalid.\n *  Args:    ctx:    pointer to a context object, initialized for signing (cannot be NULL)\n *  Out:     sig:    pointer to an array where the signature will be placed (cannot be NULL)\n *  In:      msg32:  the 32-byte message hash being signed (cannot be NULL)\n *           seckey: pointer to a 32-byte secret key (cannot be NULL)\n *           noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used\n *           ndata:  pointer to arbitrary data used by the nonce generation function (can be NULL)\n *\n * The created signature is always in lower-S form. See\n * secp256k1_ecdsa_signature_normalize for more details.\n */\nSECP256K1_API int secp256k1_ecdsa_sign(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_signature *sig,\n    const unsigned char *msg32,\n    const unsigned char *seckey,\n    secp256k1_nonce_function noncefp,\n    const void *ndata\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n/** Verify an ECDSA secret key.\n *\n *  Returns: 1: secret key is valid\n *           0: secret key is invalid\n *  Args:    ctx: pointer to a context object (cannot be NULL)\n *  In:      seckey: pointer to a 32-byte secret key (cannot be NULL)\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(\n    const secp256k1_context* ctx,\n    const unsigned char *seckey\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);\n\n/** Compute the public key for a secret key.\n *\n *  Returns: 1: secret was valid, public key stores\n *           0: secret was invalid, try again\n *  Args:   ctx:        pointer to a context object, initialized for signing (cannot be NULL)\n *  Out:    pubkey:     pointer to the created public key (cannot be NULL)\n *  In:     seckey:     pointer to a 32-byte private key (cannot be NULL)\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(\n    const secp256k1_context* ctx,\n    secp256k1_pubkey *pubkey,\n    const unsigned char *seckey\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Tweak a private key by adding tweak to it.\n * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for\n *          uniformly random 32-byte arrays, or if the resulting private key\n *          would be invalid (only when the tweak is the complement of the\n *          private key). 1 otherwise.\n * Args:    ctx:    pointer to a context object (cannot be NULL).\n * In/Out:  seckey: pointer to a 32-byte private key.\n * In:      tweak:  pointer to a 32-byte tweak.\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(\n    const secp256k1_context* ctx,\n    unsigned char *seckey,\n    const unsigned char *tweak\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Tweak a public key by adding tweak times the generator to it.\n * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for\n *          uniformly random 32-byte arrays, or if the resulting public key\n *          would be invalid (only when the tweak is the complement of the\n *          corresponding private key). 1 otherwise.\n * Args:    ctx:    pointer to a context object initialized for validation\n *                  (cannot be NULL).\n * In/Out:  pubkey: pointer to a public key object.\n * In:      tweak:  pointer to a 32-byte tweak.\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(\n    const secp256k1_context* ctx,\n    secp256k1_pubkey *pubkey,\n    const unsigned char *tweak\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Tweak a private key by multiplying it by a tweak.\n * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for\n *          uniformly random 32-byte arrays, or equal to zero. 1 otherwise.\n * Args:   ctx:    pointer to a context object (cannot be NULL).\n * In/Out: seckey: pointer to a 32-byte private key.\n * In:     tweak:  pointer to a 32-byte tweak.\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(\n    const secp256k1_context* ctx,\n    unsigned char *seckey,\n    const unsigned char *tweak\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Tweak a public key by multiplying it by a tweak value.\n * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for\n *          uniformly random 32-byte arrays, or equal to zero. 1 otherwise.\n * Args:    ctx:    pointer to a context object initialized for validation\n *                 (cannot be NULL).\n * In/Out:  pubkey: pointer to a public key obkect.\n * In:      tweak:  pointer to a 32-byte tweak.\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(\n    const secp256k1_context* ctx,\n    secp256k1_pubkey *pubkey,\n    const unsigned char *tweak\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Updates the context randomization.\n *  Returns: 1: randomization successfully updated\n *           0: error\n *  Args:    ctx:       pointer to a context object (cannot be NULL)\n *  In:      seed32:    pointer to a 32-byte random seed (NULL resets to initial state)\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(\n    secp256k1_context* ctx,\n    const unsigned char *seed32\n) SECP256K1_ARG_NONNULL(1);\n\n/** Add a number of public keys together.\n *  Returns: 1: the sum of the public keys is valid.\n *           0: the sum of the public keys is not valid.\n *  Args:   ctx:        pointer to a context object\n *  Out:    out:        pointer to a public key object for placing the resulting public key\n *                      (cannot be NULL)\n *  In:     ins:        pointer to array of pointers to public keys (cannot be NULL)\n *          n:          the number of public keys to add together (must be at least 1)\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine(\n    const secp256k1_context* ctx,\n    secp256k1_pubkey *out,\n    const secp256k1_pubkey * const * ins,\n    size_t n\n) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n# ifdef __cplusplus\n}\n# endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/include/secp256k1_ecdh.h",
    "content": "#ifndef _SECP256K1_ECDH_\n# define _SECP256K1_ECDH_\n\n# include \"secp256k1.h\"\n\n# ifdef __cplusplus\nextern \"C\" {\n# endif\n\n/** Compute an EC Diffie-Hellman secret in constant time\n *  Returns: 1: exponentiation was successful\n *           0: scalar was invalid (zero or overflow)\n *  Args:    ctx:        pointer to a context object (cannot be NULL)\n *  Out:     result:     a 32-byte array which will be populated by an ECDH\n *                       secret computed from the point and scalar\n *  In:      pubkey:     a pointer to a secp256k1_pubkey containing an\n *                       initialized public key\n *           privkey:    a 32-byte scalar with which to multiply the point\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdh(\n  const secp256k1_context* ctx,\n  unsigned char *result,\n  const secp256k1_pubkey *pubkey,\n  const unsigned char *privkey\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n# ifdef __cplusplus\n}\n# endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/include/secp256k1_recovery.h",
    "content": "#ifndef _SECP256K1_RECOVERY_\n# define _SECP256K1_RECOVERY_\n\n# include \"secp256k1.h\"\n\n# ifdef __cplusplus\nextern \"C\" {\n# endif\n\n/** Opaque data structured that holds a parsed ECDSA signature,\n *  supporting pubkey recovery.\n *\n *  The exact representation of data inside is implementation defined and not\n *  guaranteed to be portable between different platforms or versions. It is\n *  however guaranteed to be 65 bytes in size, and can be safely copied/moved.\n *  If you need to convert to a format suitable for storage or transmission, use\n *  the secp256k1_ecdsa_signature_serialize_* and\n *  secp256k1_ecdsa_signature_parse_* functions.\n *\n *  Furthermore, it is guaranteed that identical signatures (including their\n *  recoverability) will have identical representation, so they can be\n *  memcmp'ed.\n */\ntypedef struct {\n    unsigned char data[65];\n} secp256k1_ecdsa_recoverable_signature;\n\n/** Parse a compact ECDSA signature (64 bytes + recovery id).\n *\n *  Returns: 1 when the signature could be parsed, 0 otherwise\n *  Args: ctx:     a secp256k1 context object\n *  Out:  sig:     a pointer to a signature object\n *  In:   input64: a pointer to a 64-byte compact signature\n *        recid:   the recovery id (0, 1, 2 or 3)\n */\nSECP256K1_API int secp256k1_ecdsa_recoverable_signature_parse_compact(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_recoverable_signature* sig,\n    const unsigned char *input64,\n    int recid\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Convert a recoverable signature into a normal signature.\n *\n *  Returns: 1\n *  Out: sig:    a pointer to a normal signature (cannot be NULL).\n *  In:  sigin:  a pointer to a recoverable signature (cannot be NULL).\n */\nSECP256K1_API int secp256k1_ecdsa_recoverable_signature_convert(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_signature* sig,\n    const secp256k1_ecdsa_recoverable_signature* sigin\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);\n\n/** Serialize an ECDSA signature in compact format (64 bytes + recovery id).\n *\n *  Returns: 1\n *  Args: ctx:      a secp256k1 context object\n *  Out:  output64: a pointer to a 64-byte array of the compact signature (cannot be NULL)\n *        recid:    a pointer to an integer to hold the recovery id (can be NULL).\n *  In:   sig:      a pointer to an initialized signature object (cannot be NULL)\n */\nSECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact(\n    const secp256k1_context* ctx,\n    unsigned char *output64,\n    int *recid,\n    const secp256k1_ecdsa_recoverable_signature* sig\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n/** Create a recoverable ECDSA signature.\n *\n *  Returns: 1: signature created\n *           0: the nonce generation function failed, or the private key was invalid.\n *  Args:    ctx:    pointer to a context object, initialized for signing (cannot be NULL)\n *  Out:     sig:    pointer to an array where the signature will be placed (cannot be NULL)\n *  In:      msg32:  the 32-byte message hash being signed (cannot be NULL)\n *           seckey: pointer to a 32-byte secret key (cannot be NULL)\n *           noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used\n *           ndata:  pointer to arbitrary data used by the nonce generation function (can be NULL)\n */\nSECP256K1_API int secp256k1_ecdsa_sign_recoverable(\n    const secp256k1_context* ctx,\n    secp256k1_ecdsa_recoverable_signature *sig,\n    const unsigned char *msg32,\n    const unsigned char *seckey,\n    secp256k1_nonce_function noncefp,\n    const void *ndata\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n/** Recover an ECDSA public key from a signature.\n *\n *  Returns: 1: public key successfully recovered (which guarantees a correct signature).\n *           0: otherwise.\n *  Args:    ctx:        pointer to a context object, initialized for verification (cannot be NULL)\n *  Out:     pubkey:     pointer to the recovered public key (cannot be NULL)\n *  In:      sig:        pointer to initialized signature that supports pubkey recovery (cannot be NULL)\n *           msg32:      the 32-byte message hash assumed to be signed (cannot be NULL)\n */\nSECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover(\n    const secp256k1_context* ctx,\n    secp256k1_pubkey *pubkey,\n    const secp256k1_ecdsa_recoverable_signature *sig,\n    const unsigned char *msg32\n) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);\n\n# ifdef __cplusplus\n}\n# endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/libsecp256k1.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libsecp256k1\nDescription: Optimized C library for EC operations on curve secp256k1\nURL: https://github.com/bitcoin-core/secp256k1\nVersion: @PACKAGE_VERSION@\nCflags: -I${includedir}\nLibs.private: @SECP_LIBS@\nLibs: -L${libdir} -lsecp256k1\n\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/obj/.gitignore",
    "content": ""
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/sage/group_prover.sage",
    "content": "# This code supports verifying group implementations which have branches\n# or conditional statements (like cmovs), by allowing each execution path\n# to independently set assumptions on input or intermediary variables.\n#\n# The general approach is:\n# * A constraint is a tuple of two sets of of symbolic expressions:\n#   the first of which are required to evaluate to zero, the second of which\n#   are required to evaluate to nonzero.\n#   - A constraint is said to be conflicting if any of its nonzero expressions\n#     is in the ideal with basis the zero expressions (in other words: when the\n#     zero expressions imply that one of the nonzero expressions are zero).\n# * There is a list of laws that describe the intended behaviour, including\n#   laws for addition and doubling. Each law is called with the symbolic point\n#   coordinates as arguments, and returns:\n#   - A constraint describing the assumptions under which it is applicable,\n#     called \"assumeLaw\"\n#   - A constraint describing the requirements of the law, called \"require\"\n# * Implementations are transliterated into functions that operate as well on\n#   algebraic input points, and are called once per combination of branches\n#   exectured. Each execution returns:\n#   - A constraint describing the assumptions this implementation requires\n#     (such as Z1=1), called \"assumeFormula\"\n#   - A constraint describing the assumptions this specific branch requires,\n#     but which is by construction guaranteed to cover the entire space by\n#     merging the results from all branches, called \"assumeBranch\"\n#   - The result of the computation\n# * All combinations of laws with implementation branches are tried, and:\n#   - If the combination of assumeLaw, assumeFormula, and assumeBranch results\n#     in a conflict, it means this law does not apply to this branch, and it is\n#     skipped.\n#   - For others, we try to prove the require constraints hold, assuming the\n#     information in assumeLaw + assumeFormula + assumeBranch, and if this does\n#     not succeed, we fail.\n#     + To prove an expression is zero, we check whether it belongs to the\n#       ideal with the assumed zero expressions as basis. This test is exact.\n#     + To prove an expression is nonzero, we check whether each of its\n#       factors is contained in the set of nonzero assumptions' factors.\n#       This test is not exact, so various combinations of original and\n#       reduced expressions' factors are tried.\n#   - If we succeed, we print out the assumptions from assumeFormula that\n#     weren't implied by assumeLaw already. Those from assumeBranch are skipped,\n#     as we assume that all constraints in it are complementary with each other.\n#\n# Based on the sage verification scripts used in the Explicit-Formulas Database\n# by Tanja Lange and others, see http://hyperelliptic.org/EFD\n\nclass fastfrac:\n  \"\"\"Fractions over rings.\"\"\"\n\n  def __init__(self,R,top,bot=1):\n    \"\"\"Construct a fractional, given a ring, a numerator, and denominator.\"\"\"\n    self.R = R\n    if parent(top) == ZZ or parent(top) == R:\n      self.top = R(top)\n      self.bot = R(bot)\n    elif top.__class__ == fastfrac:\n      self.top = top.top\n      self.bot = top.bot * bot\n    else:\n      self.top = R(numerator(top))\n      self.bot = R(denominator(top)) * bot\n\n  def iszero(self,I):\n    \"\"\"Return whether this fraction is zero given an ideal.\"\"\"\n    return self.top in I and self.bot not in I\n\n  def reduce(self,assumeZero):\n    zero = self.R.ideal(map(numerator, assumeZero))\n    return fastfrac(self.R, zero.reduce(self.top)) / fastfrac(self.R, zero.reduce(self.bot))\n\n  def __add__(self,other):\n    \"\"\"Add two fractions.\"\"\"\n    if parent(other) == ZZ:\n      return fastfrac(self.R,self.top + self.bot * other,self.bot)\n    if other.__class__ == fastfrac:\n      return fastfrac(self.R,self.top * other.bot + self.bot * other.top,self.bot * other.bot)\n    return NotImplemented\n\n  def __sub__(self,other):\n    \"\"\"Subtract two fractions.\"\"\"\n    if parent(other) == ZZ:\n      return fastfrac(self.R,self.top - self.bot * other,self.bot)\n    if other.__class__ == fastfrac:\n      return fastfrac(self.R,self.top * other.bot - self.bot * other.top,self.bot * other.bot)\n    return NotImplemented\n\n  def __neg__(self):\n    \"\"\"Return the negation of a fraction.\"\"\"\n    return fastfrac(self.R,-self.top,self.bot)\n\n  def __mul__(self,other):\n    \"\"\"Multiply two fractions.\"\"\"\n    if parent(other) == ZZ:\n      return fastfrac(self.R,self.top * other,self.bot)\n    if other.__class__ == fastfrac:\n      return fastfrac(self.R,self.top * other.top,self.bot * other.bot)\n    return NotImplemented\n\n  def __rmul__(self,other):\n    \"\"\"Multiply something else with a fraction.\"\"\"\n    return self.__mul__(other)\n\n  def __div__(self,other):\n    \"\"\"Divide two fractions.\"\"\"\n    if parent(other) == ZZ:\n      return fastfrac(self.R,self.top,self.bot * other)\n    if other.__class__ == fastfrac:\n      return fastfrac(self.R,self.top * other.bot,self.bot * other.top)\n    return NotImplemented\n\n  def __pow__(self,other):\n    \"\"\"Compute a power of a fraction.\"\"\"\n    if parent(other) == ZZ:\n      if other < 0:\n        # Negative powers require flipping top and bottom\n        return fastfrac(self.R,self.bot ^ (-other),self.top ^ (-other))\n      else:\n        return fastfrac(self.R,self.top ^ other,self.bot ^ other)\n    return NotImplemented\n\n  def __str__(self):\n    return \"fastfrac((\" + str(self.top) + \") / (\" + str(self.bot) + \"))\"\n  def __repr__(self):\n    return \"%s\" % self\n\n  def numerator(self):\n    return self.top\n\nclass constraints:\n  \"\"\"A set of constraints, consisting of zero and nonzero expressions.\n\n  Constraints can either be used to express knowledge or a requirement.\n\n  Both the fields zero and nonzero are maps from expressions to description\n  strings. The expressions that are the keys in zero are required to be zero,\n  and the expressions that are the keys in nonzero are required to be nonzero.\n\n  Note that (a != 0) and (b != 0) is the same as (a*b != 0), so all keys in\n  nonzero could be multiplied into a single key. This is often much less\n  efficient to work with though, so we keep them separate inside the\n  constraints. This allows higher-level code to do fast checks on the individual\n  nonzero elements, or combine them if needed for stronger checks.\n\n  We can't multiply the different zero elements, as it would suffice for one of\n  the factors to be zero, instead of all of them. Instead, the zero elements are\n  typically combined into an ideal first.\n  \"\"\"\n\n  def __init__(self, **kwargs):\n    if 'zero' in kwargs:\n      self.zero = dict(kwargs['zero'])\n    else:\n      self.zero = dict()\n    if 'nonzero' in kwargs:\n      self.nonzero = dict(kwargs['nonzero'])\n    else:\n      self.nonzero = dict()\n\n  def negate(self):\n    return constraints(zero=self.nonzero, nonzero=self.zero)\n\n  def __add__(self, other):\n    zero = self.zero.copy()\n    zero.update(other.zero)\n    nonzero = self.nonzero.copy()\n    nonzero.update(other.nonzero)\n    return constraints(zero=zero, nonzero=nonzero)\n\n  def __str__(self):\n    return \"constraints(zero=%s,nonzero=%s)\" % (self.zero, self.nonzero)\n\n  def __repr__(self):\n    return \"%s\" % self\n\n\ndef conflicts(R, con):\n  \"\"\"Check whether any of the passed non-zero assumptions is implied by the zero assumptions\"\"\"\n  zero = R.ideal(map(numerator, con.zero))\n  if 1 in zero:\n    return True\n  # First a cheap check whether any of the individual nonzero terms conflict on\n  # their own.\n  for nonzero in con.nonzero:\n    if nonzero.iszero(zero):\n      return True\n  # It can be the case that entries in the nonzero set do not individually\n  # conflict with the zero set, but their combination does. For example, knowing\n  # that either x or y is zero is equivalent to having x*y in the zero set.\n  # Having x or y individually in the nonzero set is not a conflict, but both\n  # simultaneously is, so that is the right thing to check for.\n  if reduce(lambda a,b: a * b, con.nonzero, fastfrac(R, 1)).iszero(zero):\n    return True\n  return False\n\n\ndef get_nonzero_set(R, assume):\n  \"\"\"Calculate a simple set of nonzero expressions\"\"\"\n  zero = R.ideal(map(numerator, assume.zero))\n  nonzero = set()\n  for nz in map(numerator, assume.nonzero):\n    for (f,n) in nz.factor():\n      nonzero.add(f)\n    rnz = zero.reduce(nz)\n    for (f,n) in rnz.factor():\n      nonzero.add(f)\n  return nonzero\n\n\ndef prove_nonzero(R, exprs, assume):\n  \"\"\"Check whether an expression is provably nonzero, given assumptions\"\"\"\n  zero = R.ideal(map(numerator, assume.zero))\n  nonzero = get_nonzero_set(R, assume)\n  expl = set()\n  ok = True\n  for expr in exprs:\n    if numerator(expr) in zero:\n      return (False, [exprs[expr]])\n  allexprs = reduce(lambda a,b: numerator(a)*numerator(b), exprs, 1)\n  for (f, n) in allexprs.factor():\n    if f not in nonzero:\n      ok = False\n  if ok:\n    return (True, None)\n  ok = True\n  for (f, n) in zero.reduce(numerator(allexprs)).factor():\n    if f not in nonzero:\n      ok = False\n  if ok:\n    return (True, None)\n  ok = True\n  for expr in exprs:\n    for (f,n) in numerator(expr).factor():\n      if f not in nonzero:\n        ok = False\n  if ok:\n    return (True, None)\n  ok = True\n  for expr in exprs:\n    for (f,n) in zero.reduce(numerator(expr)).factor():\n      if f not in nonzero:\n        expl.add(exprs[expr])\n  if expl:\n    return (False, list(expl))\n  else:\n    return (True, None)\n\n\ndef prove_zero(R, exprs, assume):\n  \"\"\"Check whether all of the passed expressions are provably zero, given assumptions\"\"\"\n  r, e = prove_nonzero(R, dict(map(lambda x: (fastfrac(R, x.bot, 1), exprs[x]), exprs)), assume)\n  if not r:\n    return (False, map(lambda x: \"Possibly zero denominator: %s\" % x, e))\n  zero = R.ideal(map(numerator, assume.zero))\n  nonzero = prod(x for x in assume.nonzero)\n  expl = []\n  for expr in exprs:\n    if not expr.iszero(zero):\n      expl.append(exprs[expr])\n  if not expl:\n    return (True, None)\n  return (False, expl)\n\n\ndef describe_extra(R, assume, assumeExtra):\n  \"\"\"Describe what assumptions are added, given existing assumptions\"\"\"\n  zerox = assume.zero.copy()\n  zerox.update(assumeExtra.zero)\n  zero = R.ideal(map(numerator, assume.zero))\n  zeroextra = R.ideal(map(numerator, zerox))\n  nonzero = get_nonzero_set(R, assume)\n  ret = set()\n  # Iterate over the extra zero expressions\n  for base in assumeExtra.zero:\n    if base not in zero:\n      add = []\n      for (f, n) in numerator(base).factor():\n        if f not in nonzero:\n          add += [\"%s\" % f]\n      if add:\n        ret.add((\" * \".join(add)) + \" = 0 [%s]\" % assumeExtra.zero[base])\n  # Iterate over the extra nonzero expressions\n  for nz in assumeExtra.nonzero:\n    nzr = zeroextra.reduce(numerator(nz))\n    if nzr not in zeroextra:\n      for (f,n) in nzr.factor():\n        if zeroextra.reduce(f) not in nonzero:\n          ret.add(\"%s != 0\" % zeroextra.reduce(f))\n  return \", \".join(x for x in ret)\n\n\ndef check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require):\n  \"\"\"Check a set of zero and nonzero requirements, given a set of zero and nonzero assumptions\"\"\"\n  assume = assumeLaw + assumeAssert + assumeBranch\n\n  if conflicts(R, assume):\n    # This formula does not apply\n    return None\n\n  describe = describe_extra(R, assumeLaw + assumeBranch, assumeAssert)\n\n  ok, msg = prove_zero(R, require.zero, assume)\n  if not ok:\n    return \"FAIL, %s fails (assuming %s)\" % (str(msg), describe)\n\n  res, expl = prove_nonzero(R, require.nonzero, assume)\n  if not res:\n    return \"FAIL, %s fails (assuming %s)\" % (str(expl), describe)\n\n  if describe != \"\":\n    return \"OK (assuming %s)\" % describe\n  else:\n    return \"OK\"\n\n\ndef concrete_verify(c):\n  for k in c.zero:\n    if k != 0:\n      return (False, c.zero[k])\n  for k in c.nonzero:\n    if k == 0:\n      return (False, c.nonzero[k])\n  return (True, None)\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/sage/secp256k1.sage",
    "content": "# Test libsecp256k1' group operation implementations using prover.sage\n\nimport sys\n\nload(\"group_prover.sage\")\nload(\"weierstrass_prover.sage\")\n\ndef formula_secp256k1_gej_double_var(a):\n  \"\"\"libsecp256k1's secp256k1_gej_double_var, used by various addition functions\"\"\"\n  rz = a.Z * a.Y\n  rz = rz * 2\n  t1 = a.X^2\n  t1 = t1 * 3\n  t2 = t1^2\n  t3 = a.Y^2\n  t3 = t3 * 2\n  t4 = t3^2\n  t4 = t4 * 2\n  t3 = t3 * a.X\n  rx = t3\n  rx = rx * 4\n  rx = -rx\n  rx = rx + t2\n  t2 = -t2\n  t3 = t3 * 6\n  t3 = t3 + t2\n  ry = t1 * t3\n  t2 = -t4\n  ry = ry + t2\n  return jacobianpoint(rx, ry, rz)\n\ndef formula_secp256k1_gej_add_var(branch, a, b):\n  \"\"\"libsecp256k1's secp256k1_gej_add_var\"\"\"\n  if branch == 0:\n    return (constraints(), constraints(nonzero={a.Infinity : 'a_infinite'}), b)\n  if branch == 1:\n    return (constraints(), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a)\n  z22 = b.Z^2\n  z12 = a.Z^2\n  u1 = a.X * z22\n  u2 = b.X * z12\n  s1 = a.Y * z22\n  s1 = s1 * b.Z\n  s2 = b.Y * z12\n  s2 = s2 * a.Z\n  h = -u1\n  h = h + u2\n  i = -s1\n  i = i + s2\n  if branch == 2:\n    r = formula_secp256k1_gej_double_var(a)\n    return (constraints(), constraints(zero={h : 'h=0', i : 'i=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}), r)\n  if branch == 3:\n    return (constraints(), constraints(zero={h : 'h=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={i : 'i!=0'}), point_at_infinity())\n  i2 = i^2\n  h2 = h^2\n  h3 = h2 * h\n  h = h * b.Z\n  rz = a.Z * h\n  t = u1 * h2\n  rx = t\n  rx = rx * 2\n  rx = rx + h3\n  rx = -rx\n  rx = rx + i2\n  ry = -rx\n  ry = ry + t\n  ry = ry * i\n  h3 = h3 * s1\n  h3 = -h3\n  ry = ry + h3\n  return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz))\n\ndef formula_secp256k1_gej_add_ge_var(branch, a, b):\n  \"\"\"libsecp256k1's secp256k1_gej_add_ge_var, which assume bz==1\"\"\"\n  if branch == 0:\n    return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(nonzero={a.Infinity : 'a_infinite'}), b)\n  if branch == 1:\n    return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a)\n  z12 = a.Z^2\n  u1 = a.X\n  u2 = b.X * z12\n  s1 = a.Y\n  s2 = b.Y * z12\n  s2 = s2 * a.Z\n  h = -u1\n  h = h + u2\n  i = -s1\n  i = i + s2\n  if (branch == 2):\n    r = formula_secp256k1_gej_double_var(a)\n    return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r)\n  if (branch == 3):\n    return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity())\n  i2 = i^2\n  h2 = h^2\n  h3 = h * h2\n  rz = a.Z * h\n  t = u1 * h2\n  rx = t\n  rx = rx * 2\n  rx = rx + h3\n  rx = -rx\n  rx = rx + i2\n  ry = -rx\n  ry = ry + t\n  ry = ry * i\n  h3 = h3 * s1\n  h3 = -h3\n  ry = ry + h3\n  return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz))\n\ndef formula_secp256k1_gej_add_zinv_var(branch, a, b):\n  \"\"\"libsecp256k1's secp256k1_gej_add_zinv_var\"\"\"\n  bzinv = b.Z^(-1)\n  if branch == 0:\n    return (constraints(), constraints(nonzero={b.Infinity : 'b_infinite'}), a)\n  if branch == 1:\n    bzinv2 = bzinv^2\n    bzinv3 = bzinv2 * bzinv\n    rx = b.X * bzinv2\n    ry = b.Y * bzinv3\n    rz = 1\n    return (constraints(), constraints(zero={b.Infinity : 'b_finite'}, nonzero={a.Infinity : 'a_infinite'}), jacobianpoint(rx, ry, rz))\n  azz = a.Z * bzinv\n  z12 = azz^2\n  u1 = a.X\n  u2 = b.X * z12\n  s1 = a.Y\n  s2 = b.Y * z12\n  s2 = s2 * azz\n  h = -u1\n  h = h + u2\n  i = -s1\n  i = i + s2\n  if branch == 2:\n    r = formula_secp256k1_gej_double_var(a)\n    return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r)\n  if branch == 3:\n    return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity())\n  i2 = i^2\n  h2 = h^2\n  h3 = h * h2\n  rz = a.Z\n  rz = rz * h\n  t = u1 * h2\n  rx = t\n  rx = rx * 2\n  rx = rx + h3\n  rx = -rx\n  rx = rx + i2\n  ry = -rx\n  ry = ry + t\n  ry = ry * i\n  h3 = h3 * s1\n  h3 = -h3\n  ry = ry + h3\n  return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz))\n\ndef formula_secp256k1_gej_add_ge(branch, a, b):\n  \"\"\"libsecp256k1's secp256k1_gej_add_ge\"\"\"\n  zeroes = {}\n  nonzeroes = {}\n  a_infinity = False\n  if (branch & 4) != 0:\n    nonzeroes.update({a.Infinity : 'a_infinite'})\n    a_infinity = True\n  else:\n    zeroes.update({a.Infinity : 'a_finite'})\n  zz = a.Z^2\n  u1 = a.X\n  u2 = b.X * zz\n  s1 = a.Y\n  s2 = b.Y * zz\n  s2 = s2 * a.Z\n  t = u1\n  t = t + u2\n  m = s1\n  m = m + s2\n  rr = t^2\n  m_alt = -u2\n  tt = u1 * m_alt\n  rr = rr + tt\n  degenerate = (branch & 3) == 3\n  if (branch & 1) != 0:\n    zeroes.update({m : 'm_zero'})\n  else:\n    nonzeroes.update({m : 'm_nonzero'})\n  if (branch & 2) != 0:\n    zeroes.update({rr : 'rr_zero'})\n  else:\n    nonzeroes.update({rr : 'rr_nonzero'})\n  rr_alt = s1\n  rr_alt = rr_alt * 2\n  m_alt = m_alt + u1\n  if not degenerate:\n    rr_alt = rr\n    m_alt = m\n  n = m_alt^2\n  q = n * t\n  n = n^2\n  if degenerate:\n    n = m\n  t = rr_alt^2\n  rz = a.Z * m_alt\n  infinity = False\n  if (branch & 8) != 0:\n    if not a_infinity:\n      infinity = True\n    zeroes.update({rz : 'r.z=0'})\n  else:\n    nonzeroes.update({rz : 'r.z!=0'})\n  rz = rz * 2\n  q = -q\n  t = t + q\n  rx = t\n  t = t * 2\n  t = t + q\n  t = t * rr_alt\n  t = t + n\n  ry = -t\n  rx = rx * 4\n  ry = ry * 4\n  if a_infinity:\n    rx = b.X\n    ry = b.Y\n    rz = 1\n  if infinity:\n    return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), point_at_infinity())\n  return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), jacobianpoint(rx, ry, rz))\n\ndef formula_secp256k1_gej_add_ge_old(branch, a, b):\n  \"\"\"libsecp256k1's old secp256k1_gej_add_ge, which fails when ay+by=0 but ax!=bx\"\"\"\n  a_infinity = (branch & 1) != 0\n  zero = {}\n  nonzero = {}\n  if a_infinity:\n    nonzero.update({a.Infinity : 'a_infinite'})\n  else:\n    zero.update({a.Infinity : 'a_finite'})\n  zz = a.Z^2\n  u1 = a.X\n  u2 = b.X * zz\n  s1 = a.Y\n  s2 = b.Y * zz\n  s2 = s2 * a.Z\n  z = a.Z\n  t = u1\n  t = t + u2\n  m = s1\n  m = m + s2\n  n = m^2\n  q = n * t\n  n = n^2\n  rr = t^2\n  t = u1 * u2\n  t = -t\n  rr = rr + t\n  t = rr^2\n  rz = m * z\n  infinity = False\n  if (branch & 2) != 0:\n    if not a_infinity:\n      infinity = True\n    else:\n      return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(nonzero={z : 'conflict_a'}, zero={z : 'conflict_b'}), point_at_infinity())\n    zero.update({rz : 'r.z=0'})\n  else:\n    nonzero.update({rz : 'r.z!=0'})\n  rz = rz * (0 if a_infinity else 2)\n  rx = t\n  q = -q\n  rx = rx + q\n  q = q * 3\n  t = t * 2\n  t = t + q\n  t = t * rr\n  t = t + n\n  ry = -t\n  rx = rx * (0 if a_infinity else 4)\n  ry = ry * (0 if a_infinity else 4)\n  t = b.X\n  t = t * (1 if a_infinity else 0)\n  rx = rx + t\n  t = b.Y\n  t = t * (1 if a_infinity else 0)\n  ry = ry + t\n  t = (1 if a_infinity else 0)\n  rz = rz + t\n  if infinity:\n    return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), point_at_infinity())\n  return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), jacobianpoint(rx, ry, rz))\n\nif __name__ == \"__main__\":\n  check_symbolic_jacobian_weierstrass(\"secp256k1_gej_add_var\", 0, 7, 5, formula_secp256k1_gej_add_var)\n  check_symbolic_jacobian_weierstrass(\"secp256k1_gej_add_ge_var\", 0, 7, 5, formula_secp256k1_gej_add_ge_var)\n  check_symbolic_jacobian_weierstrass(\"secp256k1_gej_add_zinv_var\", 0, 7, 5, formula_secp256k1_gej_add_zinv_var)\n  check_symbolic_jacobian_weierstrass(\"secp256k1_gej_add_ge\", 0, 7, 16, formula_secp256k1_gej_add_ge)\n  check_symbolic_jacobian_weierstrass(\"secp256k1_gej_add_ge_old [should fail]\", 0, 7, 4, formula_secp256k1_gej_add_ge_old)\n\n  if len(sys.argv) >= 2 and sys.argv[1] == \"--exhaustive\":\n    check_exhaustive_jacobian_weierstrass(\"secp256k1_gej_add_var\", 0, 7, 5, formula_secp256k1_gej_add_var, 43)\n    check_exhaustive_jacobian_weierstrass(\"secp256k1_gej_add_ge_var\", 0, 7, 5, formula_secp256k1_gej_add_ge_var, 43)\n    check_exhaustive_jacobian_weierstrass(\"secp256k1_gej_add_zinv_var\", 0, 7, 5, formula_secp256k1_gej_add_zinv_var, 43)\n    check_exhaustive_jacobian_weierstrass(\"secp256k1_gej_add_ge\", 0, 7, 16, formula_secp256k1_gej_add_ge, 43)\n    check_exhaustive_jacobian_weierstrass(\"secp256k1_gej_add_ge_old [should fail]\", 0, 7, 4, formula_secp256k1_gej_add_ge_old, 43)\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/sage/weierstrass_prover.sage",
    "content": "# Prover implementation for Weierstrass curves of the form\n# y^2 = x^3 + A * x + B, specifically with a = 0 and b = 7, with group laws\n# operating on affine and Jacobian coordinates, including the point at infinity\n# represented by a 4th variable in coordinates.\n\nload(\"group_prover.sage\")\n\n\nclass affinepoint:\n  def __init__(self, x, y, infinity=0):\n    self.x = x\n    self.y = y\n    self.infinity = infinity\n  def __str__(self):\n    return \"affinepoint(x=%s,y=%s,inf=%s)\" % (self.x, self.y, self.infinity)\n\n\nclass jacobianpoint:\n  def __init__(self, x, y, z, infinity=0):\n    self.X = x\n    self.Y = y\n    self.Z = z\n    self.Infinity = infinity\n  def __str__(self):\n    return \"jacobianpoint(X=%s,Y=%s,Z=%s,inf=%s)\" % (self.X, self.Y, self.Z, self.Infinity)\n\n\ndef point_at_infinity():\n  return jacobianpoint(1, 1, 1, 1)\n\n\ndef negate(p):\n  if p.__class__ == affinepoint:\n    return affinepoint(p.x, -p.y)\n  if p.__class__ == jacobianpoint:\n    return jacobianpoint(p.X, -p.Y, p.Z)\n  assert(False)\n\n\ndef on_weierstrass_curve(A, B, p):\n  \"\"\"Return a set of zero-expressions for an affine point to be on the curve\"\"\"\n  return constraints(zero={p.x^3 + A*p.x + B - p.y^2: 'on_curve'})\n\n\ndef tangential_to_weierstrass_curve(A, B, p12, p3):\n  \"\"\"Return a set of zero-expressions for ((x12,y12),(x3,y3)) to be a line that is tangential to the curve at (x12,y12)\"\"\"\n  return constraints(zero={\n    (p12.y - p3.y) * (p12.y * 2) - (p12.x^2 * 3 + A) * (p12.x - p3.x): 'tangential_to_curve'\n  })\n\n\ndef colinear(p1, p2, p3):\n  \"\"\"Return a set of zero-expressions for ((x1,y1),(x2,y2),(x3,y3)) to be collinear\"\"\"\n  return constraints(zero={\n    (p1.y - p2.y) * (p1.x - p3.x) - (p1.y - p3.y) * (p1.x - p2.x): 'colinear_1',\n    (p2.y - p3.y) * (p2.x - p1.x) - (p2.y - p1.y) * (p2.x - p3.x): 'colinear_2',\n    (p3.y - p1.y) * (p3.x - p2.x) - (p3.y - p2.y) * (p3.x - p1.x): 'colinear_3'\n  })\n\n\ndef good_affine_point(p):\n  return constraints(nonzero={p.x : 'nonzero_x', p.y : 'nonzero_y'})\n\n\ndef good_jacobian_point(p):\n  return constraints(nonzero={p.X : 'nonzero_X', p.Y : 'nonzero_Y', p.Z^6 : 'nonzero_Z'})\n\n\ndef good_point(p):\n  return constraints(nonzero={p.Z^6 : 'nonzero_X'})\n\n\ndef finite(p, *affine_fns):\n  con = good_point(p) + constraints(zero={p.Infinity : 'finite_point'})\n  if p.Z != 0:\n    return con + reduce(lambda a, b: a + b, (f(affinepoint(p.X / p.Z^2, p.Y / p.Z^3)) for f in affine_fns), con)\n  else:\n    return con\n\ndef infinite(p):\n  return constraints(nonzero={p.Infinity : 'infinite_point'})\n\n\ndef law_jacobian_weierstrass_add(A, B, pa, pb, pA, pB, pC):\n  \"\"\"Check whether the passed set of coordinates is a valid Jacobian add, given assumptions\"\"\"\n  assumeLaw = (good_affine_point(pa) +\n               good_affine_point(pb) +\n               good_jacobian_point(pA) +\n               good_jacobian_point(pB) +\n               on_weierstrass_curve(A, B, pa) +\n               on_weierstrass_curve(A, B, pb) +\n               finite(pA) +\n               finite(pB) +\n               constraints(nonzero={pa.x - pb.x : 'different_x'}))\n  require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) +\n             colinear(pa, pb, negate(pc))))\n  return (assumeLaw, require)\n\n\ndef law_jacobian_weierstrass_double(A, B, pa, pb, pA, pB, pC):\n  \"\"\"Check whether the passed set of coordinates is a valid Jacobian doubling, given assumptions\"\"\"\n  assumeLaw = (good_affine_point(pa) +\n               good_affine_point(pb) +\n               good_jacobian_point(pA) +\n               good_jacobian_point(pB) +\n               on_weierstrass_curve(A, B, pa) +\n               on_weierstrass_curve(A, B, pb) +\n               finite(pA) +\n               finite(pB) +\n               constraints(zero={pa.x - pb.x : 'equal_x', pa.y - pb.y : 'equal_y'}))\n  require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) +\n             tangential_to_weierstrass_curve(A, B, pa, negate(pc))))\n  return (assumeLaw, require)\n\n\ndef law_jacobian_weierstrass_add_opposites(A, B, pa, pb, pA, pB, pC):\n  assumeLaw = (good_affine_point(pa) +\n               good_affine_point(pb) +\n               good_jacobian_point(pA) +\n               good_jacobian_point(pB) +\n               on_weierstrass_curve(A, B, pa) +\n               on_weierstrass_curve(A, B, pb) +\n               finite(pA) +\n               finite(pB) +\n               constraints(zero={pa.x - pb.x : 'equal_x', pa.y + pb.y : 'opposite_y'}))\n  require = infinite(pC)\n  return (assumeLaw, require)\n\n\ndef law_jacobian_weierstrass_add_infinite_a(A, B, pa, pb, pA, pB, pC):\n  assumeLaw = (good_affine_point(pa) +\n               good_affine_point(pb) +\n               good_jacobian_point(pA) +\n               good_jacobian_point(pB) +\n               on_weierstrass_curve(A, B, pb) +\n               infinite(pA) +\n               finite(pB))\n  require = finite(pC, lambda pc: constraints(zero={pc.x - pb.x : 'c.x=b.x', pc.y - pb.y : 'c.y=b.y'}))\n  return (assumeLaw, require)\n\n\ndef law_jacobian_weierstrass_add_infinite_b(A, B, pa, pb, pA, pB, pC):\n  assumeLaw = (good_affine_point(pa) +\n               good_affine_point(pb) +\n               good_jacobian_point(pA) +\n               good_jacobian_point(pB) +\n               on_weierstrass_curve(A, B, pa) +\n               infinite(pB) +\n               finite(pA))\n  require = finite(pC, lambda pc: constraints(zero={pc.x - pa.x : 'c.x=a.x', pc.y - pa.y : 'c.y=a.y'}))\n  return (assumeLaw, require)\n\n\ndef law_jacobian_weierstrass_add_infinite_ab(A, B, pa, pb, pA, pB, pC):\n  assumeLaw = (good_affine_point(pa) +\n               good_affine_point(pb) +\n               good_jacobian_point(pA) +\n               good_jacobian_point(pB) +\n               infinite(pA) +\n               infinite(pB))\n  require = infinite(pC)\n  return (assumeLaw, require)\n\n\nlaws_jacobian_weierstrass = {\n  'add': law_jacobian_weierstrass_add,\n  'double': law_jacobian_weierstrass_double,\n  'add_opposite': law_jacobian_weierstrass_add_opposites,\n  'add_infinite_a': law_jacobian_weierstrass_add_infinite_a,\n  'add_infinite_b': law_jacobian_weierstrass_add_infinite_b,\n  'add_infinite_ab': law_jacobian_weierstrass_add_infinite_ab\n}\n\n\ndef check_exhaustive_jacobian_weierstrass(name, A, B, branches, formula, p):\n  \"\"\"Verify an implementation of addition of Jacobian points on a Weierstrass curve, by executing and validating the result for every possible addition in a prime field\"\"\"\n  F = Integers(p)\n  print \"Formula %s on Z%i:\" % (name, p)\n  points = []\n  for x in xrange(0, p):\n    for y in xrange(0, p):\n      point = affinepoint(F(x), F(y))\n      r, e = concrete_verify(on_weierstrass_curve(A, B, point))\n      if r:\n        points.append(point)\n\n  for za in xrange(1, p):\n    for zb in xrange(1, p):\n      for pa in points:\n        for pb in points:\n          for ia in xrange(2):\n            for ib in xrange(2):\n              pA = jacobianpoint(pa.x * F(za)^2, pa.y * F(za)^3, F(za), ia)\n              pB = jacobianpoint(pb.x * F(zb)^2, pb.y * F(zb)^3, F(zb), ib)\n              for branch in xrange(0, branches):\n                assumeAssert, assumeBranch, pC = formula(branch, pA, pB)\n                pC.X = F(pC.X)\n                pC.Y = F(pC.Y)\n                pC.Z = F(pC.Z)\n                pC.Infinity = F(pC.Infinity)\n                r, e = concrete_verify(assumeAssert + assumeBranch)\n                if r:\n                  match = False\n                  for key in laws_jacobian_weierstrass:\n                    assumeLaw, require = laws_jacobian_weierstrass[key](A, B, pa, pb, pA, pB, pC)\n                    r, e = concrete_verify(assumeLaw)\n                    if r:\n                      if match:\n                        print \"  multiple branches for (%s,%s,%s,%s) + (%s,%s,%s,%s)\" % (pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity)\n                      else:\n                        match = True\n                      r, e = concrete_verify(require)\n                      if not r:\n                        print \"  failure in branch %i for (%s,%s,%s,%s) + (%s,%s,%s,%s) = (%s,%s,%s,%s): %s\" % (branch, pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity, pC.X, pC.Y, pC.Z, pC.Infinity, e)\n  print\n\n\ndef check_symbolic_function(R, assumeAssert, assumeBranch, f, A, B, pa, pb, pA, pB, pC):\n  assumeLaw, require = f(A, B, pa, pb, pA, pB, pC)\n  return check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require)\n\ndef check_symbolic_jacobian_weierstrass(name, A, B, branches, formula):\n  \"\"\"Verify an implementation of addition of Jacobian points on a Weierstrass curve symbolically\"\"\"\n  R.<ax,bx,ay,by,Az,Bz,Ai,Bi> = PolynomialRing(QQ,8,order='invlex')\n  lift = lambda x: fastfrac(R,x)\n  ax = lift(ax)\n  ay = lift(ay)\n  Az = lift(Az)\n  bx = lift(bx)\n  by = lift(by)\n  Bz = lift(Bz)\n  Ai = lift(Ai)\n  Bi = lift(Bi)\n\n  pa = affinepoint(ax, ay, Ai)\n  pb = affinepoint(bx, by, Bi)\n  pA = jacobianpoint(ax * Az^2, ay * Az^3, Az, Ai)\n  pB = jacobianpoint(bx * Bz^2, by * Bz^3, Bz, Bi)\n\n  res = {}\n\n  for key in laws_jacobian_weierstrass:\n    res[key] = []\n\n  print (\"Formula \" + name + \":\")\n  count = 0\n  for branch in xrange(branches):\n    assumeFormula, assumeBranch, pC = formula(branch, pA, pB)\n    pC.X = lift(pC.X)\n    pC.Y = lift(pC.Y)\n    pC.Z = lift(pC.Z)\n    pC.Infinity = lift(pC.Infinity)\n\n    for key in laws_jacobian_weierstrass:\n      res[key].append((check_symbolic_function(R, assumeFormula, assumeBranch, laws_jacobian_weierstrass[key], A, B, pa, pb, pA, pB, pC), branch))\n\n  for key in res:\n    print \"  %s:\" % key\n    val = res[key]\n    for x in val:\n      if x[0] is not None:\n        print \"    branch %i: %s\" % (x[1], x[0])\n\n  print\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s",
    "content": "@ vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab syntax=armasm:\n/**********************************************************************\n * Copyright (c) 2014 Wladimir J. van der Laan                        *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n/*\nARM implementation of field_10x26 inner loops.\n\nNote:\n\n- To avoid unnecessary loads and make use of available registers, two\n  'passes' have every time been interleaved, with the odd passes accumulating c' and d' \n  which will be added to c and d respectively in the the even passes\n\n*/\n\n\t.syntax unified\n\t.arch armv7-a\n\t@ eabi attributes - see readelf -A\n\t.eabi_attribute 8, 1  @ Tag_ARM_ISA_use = yes\n\t.eabi_attribute 9, 0  @ Tag_Thumb_ISA_use = no\n\t.eabi_attribute 10, 0 @ Tag_FP_arch = none\n\t.eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte\n\t.eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP\n\t.eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed\n\t.eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6\n\t.text\n\n\t@ Field constants\n\t.set field_R0, 0x3d10\n\t.set field_R1, 0x400\n\t.set field_not_M, 0xfc000000\t@ ~M = ~0x3ffffff\n\n\t.align\t2\n\t.global secp256k1_fe_mul_inner\n\t.type\tsecp256k1_fe_mul_inner, %function\n\t@ Arguments:\n\t@  r0  r      Restrict: can overlap with a, not with b\n\t@  r1  a\n\t@  r2  b\n\t@ Stack (total 4+10*4 = 44)\n\t@  sp + #0        saved 'r' pointer\n\t@  sp + #4 + 4*X  t0,t1,t2,t3,t4,t5,t6,t7,u8,t9\nsecp256k1_fe_mul_inner:\n\tstmfd\tsp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14}\n\tsub\tsp, sp, #48\t\t\t@ frame=44 + alignment\n\tstr     r0, [sp, #0]\t\t\t@ save result address, we need it only at the end\n\n\t/******************************************\n\t * Main computation code.\n\t ******************************************\n\n\tAllocation:\n\t    r0,r14,r7,r8   scratch\n\t    r1       a (pointer)\n\t    r2       b (pointer)\n\t    r3:r4    c\n\t    r5:r6    d\n\t    r11:r12  c'\n\t    r9:r10   d'\n\n\tNote: do not write to r[] here, it may overlap with a[]\n\t*/\n\n\t/* A - interleaved with B */\n\tldr\tr7, [r1, #0*4]\t\t\t@ a[0]\n\tldr\tr8, [r2, #9*4]\t\t\t@ b[9]\n\tldr\tr0, [r1, #1*4]\t\t\t@ a[1]\n\tumull\tr5, r6, r7, r8\t\t\t@ d = a[0] * b[9]\n\tldr\tr14, [r2, #8*4]\t\t\t@ b[8]\n\tumull\tr9, r10, r0, r8\t\t\t@ d' = a[1] * b[9]\n\tldr\tr7, [r1, #2*4]\t\t\t@ a[2]\n\tumlal\tr5, r6, r0, r14\t\t\t@ d += a[1] * b[8]\n\tldr\tr8, [r2, #7*4] \t\t\t@ b[7]\n\tumlal\tr9, r10, r7, r14\t\t@ d' += a[2] * b[8]\n\tldr\tr0, [r1, #3*4]   \t\t@ a[3]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[2] * b[7]\n\tldr\tr14, [r2, #6*4]   \t\t@ b[6]\n\tumlal\tr9, r10, r0, r8  \t\t@ d' += a[3] * b[7]\n\tldr\tr7, [r1, #4*4]   \t\t@ a[4]\n\tumlal\tr5, r6, r0, r14   \t\t@ d += a[3] * b[6]\n\tldr\tr8, [r2, #5*4]   \t\t@ b[5]\n\tumlal\tr9, r10, r7, r14  \t\t@ d' += a[4] * b[6]\n\tldr\tr0, [r1, #5*4]   \t\t@ a[5]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[4] * b[5]\n\tldr\tr14, [r2, #4*4]   \t\t@ b[4]\n\tumlal\tr9, r10, r0, r8  \t\t@ d' += a[5] * b[5]\n\tldr\tr7, [r1, #6*4]   \t\t@ a[6]\n\tumlal\tr5, r6, r0, r14   \t\t@ d += a[5] * b[4]\n\tldr\tr8, [r2, #3*4]   \t\t@ b[3]\n\tumlal\tr9, r10, r7, r14  \t\t@ d' += a[6] * b[4]\n\tldr\tr0, [r1, #7*4]   \t\t@ a[7]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[6] * b[3]\n\tldr\tr14, [r2, #2*4]   \t\t@ b[2]\n\tumlal\tr9, r10, r0, r8  \t\t@ d' += a[7] * b[3]\n\tldr\tr7, [r1, #8*4]   \t\t@ a[8]\n\tumlal\tr5, r6, r0, r14   \t\t@ d += a[7] * b[2]\n\tldr\tr8, [r2, #1*4]   \t\t@ b[1]\n\tumlal\tr9, r10, r7, r14  \t\t@ d' += a[8] * b[2]\n\tldr\tr0, [r1, #9*4]   \t\t@ a[9]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[8] * b[1]\n\tldr\tr14, [r2, #0*4]   \t\t@ b[0]\n\tumlal\tr9, r10, r0, r8  \t\t@ d' += a[9] * b[1]\n\tldr\tr7, [r1, #0*4]   \t\t@ a[0]\n\tumlal\tr5, r6, r0, r14   \t\t@ d += a[9] * b[0]\n\t@ r7,r14 used in B\n\n\tbic\tr0, r5, field_not_M \t\t@ t9 = d & M\n\tstr     r0, [sp, #4 + 4*9]\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26 \n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\n\t/* B */\n\tumull\tr3, r4, r7, r14   \t\t@ c = a[0] * b[0]\n\tadds\tr5, r5, r9       \t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u0 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u0 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t0 = c & M\n\tstr\tr14, [sp, #4 + 0*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u0 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* C - interleaved with D */\n\tldr\tr7, [r1, #0*4]   \t\t@ a[0]\n\tldr\tr8, [r2, #2*4]   \t\t@ b[2]\n\tldr\tr14, [r2, #1*4]   \t\t@ b[1]\n\tumull\tr11, r12, r7, r8   \t\t@ c' = a[0] * b[2]\n\tldr\tr0, [r1, #1*4]   \t\t@ a[1]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[0] * b[1]\n\tldr\tr8, [r2, #0*4]   \t\t@ b[0]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[1] * b[1]\n\tldr\tr7, [r1, #2*4]   \t\t@ a[2]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[1] * b[0]\n\tldr\tr14, [r2, #9*4]   \t\t@ b[9]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[2] * b[0]\n\tldr\tr0, [r1, #3*4]   \t\t@ a[3]\n\tumlal\tr5, r6, r7, r14   \t\t@ d += a[2] * b[9]\n\tldr\tr8, [r2, #8*4]   \t\t@ b[8]\n\tumull\tr9, r10, r0, r14   \t\t@ d' = a[3] * b[9]\n\tldr\tr7, [r1, #4*4]   \t\t@ a[4]\n\tumlal\tr5, r6, r0, r8   \t\t@ d += a[3] * b[8]\n\tldr\tr14, [r2, #7*4]   \t\t@ b[7]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[4] * b[8]\n\tldr\tr0, [r1, #5*4]   \t\t@ a[5]\n\tumlal\tr5, r6, r7, r14   \t\t@ d += a[4] * b[7]\n\tldr\tr8, [r2, #6*4]   \t\t@ b[6]\n\tumlal\tr9, r10, r0, r14   \t\t@ d' += a[5] * b[7]\n\tldr\tr7, [r1, #6*4]   \t\t@ a[6]\n\tumlal\tr5, r6, r0, r8   \t\t@ d += a[5] * b[6]\n\tldr\tr14, [r2, #5*4]   \t\t@ b[5]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[6] * b[6]\n\tldr\tr0, [r1, #7*4]   \t\t@ a[7]\n\tumlal\tr5, r6, r7, r14   \t\t@ d += a[6] * b[5]\n\tldr\tr8, [r2, #4*4]   \t\t@ b[4]\n\tumlal\tr9, r10, r0, r14   \t\t@ d' += a[7] * b[5]\n\tldr\tr7, [r1, #8*4]   \t\t@ a[8]\n\tumlal\tr5, r6, r0, r8   \t\t@ d += a[7] * b[4]\n\tldr\tr14, [r2, #3*4]   \t\t@ b[3]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[8] * b[4]\n\tldr\tr0, [r1, #9*4]   \t\t@ a[9]\n\tumlal\tr5, r6, r7, r14   \t\t@ d += a[8] * b[3]\n\tldr\tr8, [r2, #2*4]   \t\t@ b[2]\n\tumlal\tr9, r10, r0, r14   \t\t@ d' += a[9] * b[3]\n\tumlal\tr5, r6, r0, r8   \t\t@ d += a[9] * b[2]\n\n\tbic\tr0, r5, field_not_M \t\t@ u1 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u1 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t1 = c & M\n\tstr\tr14, [sp, #4 + 1*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u1 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* D */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u2 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u2 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t2 = c & M\n\tstr\tr14, [sp, #4 + 2*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u2 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* E - interleaved with F */\n\tldr\tr7, [r1, #0*4]   \t\t@ a[0]\n\tldr\tr8, [r2, #4*4]   \t\t@ b[4]\n\tumull\tr11, r12, r7, r8   \t\t@ c' = a[0] * b[4]\n\tldr\tr8, [r2, #3*4]   \t\t@ b[3]\n\tumlal   r3, r4, r7, r8   \t\t@ c += a[0] * b[3]\n\tldr\tr7, [r1, #1*4]   \t\t@ a[1]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[1] * b[3]\n\tldr\tr8, [r2, #2*4]   \t\t@ b[2]\n\tumlal   r3, r4, r7, r8   \t\t@ c += a[1] * b[2]\n\tldr\tr7, [r1, #2*4]   \t\t@ a[2]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[2] * b[2]\n\tldr\tr8, [r2, #1*4]   \t\t@ b[1]\n\tumlal   r3, r4, r7, r8   \t\t@ c += a[2] * b[1]\n\tldr\tr7, [r1, #3*4]   \t\t@ a[3]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[3] * b[1]\n\tldr\tr8, [r2, #0*4]   \t\t@ b[0]\n\tumlal   r3, r4, r7, r8   \t\t@ c += a[3] * b[0]\n\tldr\tr7, [r1, #4*4]   \t\t@ a[4]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[4] * b[0]\n\tldr\tr8, [r2, #9*4]   \t\t@ b[9]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[4] * b[9]\n\tldr\tr7, [r1, #5*4]   \t\t@ a[5]\n\tumull\tr9, r10, r7, r8   \t\t@ d' = a[5] * b[9]\n\tldr\tr8, [r2, #8*4]   \t\t@ b[8]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[5] * b[8]\n\tldr\tr7, [r1, #6*4]   \t\t@ a[6]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[6] * b[8]\n\tldr\tr8, [r2, #7*4]   \t\t@ b[7]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[6] * b[7]\n\tldr\tr7, [r1, #7*4]   \t\t@ a[7]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[7] * b[7]\n\tldr\tr8, [r2, #6*4]   \t\t@ b[6]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[7] * b[6]\n\tldr\tr7, [r1, #8*4]   \t\t@ a[8]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[8] * b[6]\n\tldr\tr8, [r2, #5*4]   \t\t@ b[5]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[8] * b[5]\n\tldr\tr7, [r1, #9*4]   \t\t@ a[9]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[9] * b[5]\n\tldr\tr8, [r2, #4*4]   \t\t@ b[4]\n\tumlal\tr5, r6, r7, r8   \t\t@ d += a[9] * b[4]\n\n\tbic\tr0, r5, field_not_M \t\t@ u3 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u3 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t3 = c & M\n\tstr\tr14, [sp, #4 + 3*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u3 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* F */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u4 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u4 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t4 = c & M\n\tstr\tr14, [sp, #4 + 4*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u4 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* G - interleaved with H */\n\tldr\tr7, [r1, #0*4]   \t\t@ a[0]\n\tldr\tr8, [r2, #6*4]   \t\t@ b[6]\n\tldr\tr14, [r2, #5*4]   \t\t@ b[5]\n\tumull\tr11, r12, r7, r8   \t\t@ c' = a[0] * b[6]\n\tldr\tr0, [r1, #1*4]   \t\t@ a[1]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[0] * b[5]\n\tldr\tr8, [r2, #4*4]   \t\t@ b[4]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[1] * b[5]\n\tldr\tr7, [r1, #2*4]   \t\t@ a[2]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[1] * b[4]\n\tldr\tr14, [r2, #3*4]   \t\t@ b[3]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[2] * b[4]\n\tldr\tr0, [r1, #3*4]   \t\t@ a[3]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[2] * b[3]\n\tldr\tr8, [r2, #2*4]   \t\t@ b[2]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[3] * b[3]\n\tldr\tr7, [r1, #4*4]   \t\t@ a[4]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[3] * b[2]\n\tldr\tr14, [r2, #1*4]   \t\t@ b[1]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[4] * b[2]\n\tldr\tr0, [r1, #5*4]   \t\t@ a[5]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[4] * b[1]\n\tldr\tr8, [r2, #0*4]   \t\t@ b[0]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[5] * b[1]\n\tldr\tr7, [r1, #6*4]   \t\t@ a[6]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[5] * b[0]\n\tldr\tr14, [r2, #9*4]   \t\t@ b[9]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[6] * b[0]\n\tldr\tr0, [r1, #7*4]   \t\t@ a[7]\n\tumlal\tr5, r6, r7, r14   \t\t@ d += a[6] * b[9]\n\tldr\tr8, [r2, #8*4]   \t\t@ b[8]\n\tumull\tr9, r10, r0, r14   \t\t@ d' = a[7] * b[9]\n\tldr\tr7, [r1, #8*4]   \t\t@ a[8]\n\tumlal\tr5, r6, r0, r8   \t\t@ d += a[7] * b[8]\n\tldr\tr14, [r2, #7*4]   \t\t@ b[7]\n\tumlal\tr9, r10, r7, r8   \t\t@ d' += a[8] * b[8]\n\tldr\tr0, [r1, #9*4]   \t\t@ a[9]\n\tumlal\tr5, r6, r7, r14   \t\t@ d += a[8] * b[7]\n\tldr\tr8, [r2, #6*4]   \t\t@ b[6]\n\tumlal\tr9, r10, r0, r14   \t\t@ d' += a[9] * b[7]\n\tumlal\tr5, r6, r0, r8   \t\t@ d += a[9] * b[6]\n\n\tbic\tr0, r5, field_not_M \t\t@ u5 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u5 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t5 = c & M\n\tstr\tr14, [sp, #4 + 5*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u5 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* H */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u6 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u6 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t6 = c & M\n\tstr\tr14, [sp, #4 + 6*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u6 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* I - interleaved with J */\n\tldr\tr8, [r2, #8*4]   \t\t@ b[8]\n\tldr\tr7, [r1, #0*4]   \t\t@ a[0]\n\tldr\tr14, [r2, #7*4]   \t\t@ b[7]\n\tumull   r11, r12, r7, r8   \t\t@ c' = a[0] * b[8]\n\tldr\tr0, [r1, #1*4]   \t\t@ a[1]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[0] * b[7]\n\tldr\tr8, [r2, #6*4]   \t\t@ b[6]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[1] * b[7]\n\tldr\tr7, [r1, #2*4]   \t\t@ a[2]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[1] * b[6]\n\tldr\tr14, [r2, #5*4]   \t\t@ b[5]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[2] * b[6]\n\tldr\tr0, [r1, #3*4]   \t\t@ a[3]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[2] * b[5]\n\tldr\tr8, [r2, #4*4]   \t\t@ b[4]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[3] * b[5]\n\tldr\tr7, [r1, #4*4]   \t\t@ a[4]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[3] * b[4]\n\tldr\tr14, [r2, #3*4]   \t\t@ b[3]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[4] * b[4]\n\tldr\tr0, [r1, #5*4]   \t\t@ a[5]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[4] * b[3]\n\tldr\tr8, [r2, #2*4]   \t\t@ b[2]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[5] * b[3]\n\tldr\tr7, [r1, #6*4]   \t\t@ a[6]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[5] * b[2]\n\tldr\tr14, [r2, #1*4]   \t\t@ b[1]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[6] * b[2]\n\tldr\tr0, [r1, #7*4]   \t\t@ a[7]\n\tumlal   r3, r4, r7, r14   \t\t@ c += a[6] * b[1]\n\tldr\tr8, [r2, #0*4]   \t\t@ b[0]\n\tumlal   r11, r12, r0, r14   \t\t@ c' += a[7] * b[1]\n\tldr\tr7, [r1, #8*4]   \t\t@ a[8]\n\tumlal   r3, r4, r0, r8   \t\t@ c += a[7] * b[0]\n\tldr\tr14, [r2, #9*4]   \t\t@ b[9]\n\tumlal   r11, r12, r7, r8   \t\t@ c' += a[8] * b[0]\n\tldr\tr0, [r1, #9*4]   \t\t@ a[9]\n\tumlal\tr5, r6, r7, r14   \t\t@ d += a[8] * b[9]\n\tldr\tr8, [r2, #8*4]   \t\t@ b[8]\n\tumull\tr9, r10, r0, r14  \t\t@ d' = a[9] * b[9]\n\tumlal\tr5, r6, r0, r8   \t\t@ d += a[9] * b[8]\n\n\tbic\tr0, r5, field_not_M \t\t@ u7 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u7 * R0\n\tumlal   r3, r4, r0, r14\n\n\tbic\tr14, r3, field_not_M \t\t@ t7 = c & M\n\tstr\tr14, [sp, #4 + 7*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u7 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* J */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u8 = d & M\n\tstr\tr0, [sp, #4 + 8*4]\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u8 * R0\n\tumlal   r3, r4, r0, r14\n\n\t/******************************************\n\t * compute and write back result\n\t ******************************************\n\tAllocation:\n\t    r0    r\n\t    r3:r4 c\n\t    r5:r6 d\n\t    r7    t0\n\t    r8    t1\n\t    r9    t2\n\t    r11   u8\n\t    r12   t9\n\t    r1,r2,r10,r14 scratch\n\n\tNote: do not read from a[] after here, it may overlap with r[]\n\t*/\n\tldr\tr0, [sp, #0]\n\tadd\tr1, sp, #4 + 3*4\t\t@ r[3..7] = t3..7, r11=u8, r12=t9\n\tldmia\tr1, {r2,r7,r8,r9,r10,r11,r12}\n\tadd\tr1, r0, #3*4\n\tstmia\tr1, {r2,r7,r8,r9,r10}\n\n\tbic\tr2, r3, field_not_M \t\t@ r[8] = c & M\n\tstr\tr2, [r0, #8*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u8 * R1\n\tumlal   r3, r4, r11, r14\n\tmovw    r14, field_R0\t\t\t@ c += d * R0\n\tumlal   r3, r4, r5, r14\n\tadds\tr3, r3, r12\t\t\t@ c += t9\n\tadc\tr4, r4, #0\n\n\tadd\tr1, sp, #4 + 0*4\t\t@ r7,r8,r9 = t0,t1,t2\n\tldmia\tr1, {r7,r8,r9}\n\n\tubfx\tr2, r3, #0, #22     \t\t@ r[9] = c & (M >> 4)\n\tstr\tr2, [r0, #9*4]\n\tmov\tr3, r3, lsr #22     \t\t@ c >>= 22\n\torr\tr3, r3, r4, asl #10\n\tmov     r4, r4, lsr #22\n\tmovw    r14, field_R1 << 4   \t\t@ c += d * (R1 << 4)\n\tumlal   r3, r4, r5, r14\n\n\tmovw    r14, field_R0 >> 4   \t\t@ d = c * (R0 >> 4) + t0 (64x64 multiply+add)\n\tumull\tr5, r6, r3, r14\t\t\t@ d = c.lo * (R0 >> 4)\n\tadds\tr5, r5, r7\t    \t\t@ d.lo += t0\n\tmla\tr6, r14, r4, r6\t\t\t@ d.hi += c.hi * (R0 >> 4)\n\tadc\tr6, r6, 0\t     \t\t@ d.hi += carry\n\n\tbic\tr2, r5, field_not_M \t\t@ r[0] = d & M\n\tstr\tr2, [r0, #0*4]\n\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\t\n\tmovw    r14, field_R1 >> 4   \t\t@ d += c * (R1 >> 4) + t1 (64x64 multiply+add)\n\tumull\tr1, r2, r3, r14       \t\t@ tmp = c.lo * (R1 >> 4)\n\tadds\tr5, r5, r8\t    \t\t@ d.lo += t1\n\tadc\tr6, r6, #0\t    \t\t@ d.hi += carry\n\tadds\tr5, r5, r1\t    \t\t@ d.lo += tmp.lo\n\tmla\tr2, r14, r4, r2      \t\t@ tmp.hi += c.hi * (R1 >> 4)\n\tadc\tr6, r6, r2\t   \t\t@ d.hi += carry + tmp.hi\n\n\tbic\tr2, r5, field_not_M \t\t@ r[1] = d & M\n\tstr\tr2, [r0, #1*4]\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26 (ignore hi)\n\torr\tr5, r5, r6, asl #6\n\n\tadd\tr5, r5, r9\t  \t\t@ d += t2\n\tstr\tr5, [r0, #2*4]      \t\t@ r[2] = d\n\n\tadd\tsp, sp, #48\n\tldmfd\tsp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}\n\t.size\tsecp256k1_fe_mul_inner, .-secp256k1_fe_mul_inner\n\n\t.align\t2\n\t.global secp256k1_fe_sqr_inner\n\t.type\tsecp256k1_fe_sqr_inner, %function\n\t@ Arguments:\n\t@  r0  r\t Can overlap with a\n\t@  r1  a\n\t@ Stack (total 4+10*4 = 44)\n\t@  sp + #0        saved 'r' pointer\n\t@  sp + #4 + 4*X  t0,t1,t2,t3,t4,t5,t6,t7,u8,t9\nsecp256k1_fe_sqr_inner:\n\tstmfd\tsp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14}\n\tsub\tsp, sp, #48\t\t\t@ frame=44 + alignment\n\tstr     r0, [sp, #0]\t\t\t@ save result address, we need it only at the end\n\t/******************************************\n\t * Main computation code.\n\t ******************************************\n\n\tAllocation:\n\t    r0,r14,r2,r7,r8   scratch\n\t    r1       a (pointer)\n\t    r3:r4    c\n\t    r5:r6    d\n\t    r11:r12  c'\n\t    r9:r10   d'\n\n\tNote: do not write to r[] here, it may overlap with a[]\n\t*/\n\t/* A interleaved with B */\n\tldr\tr0, [r1, #1*4]\t\t\t@ a[1]*2\n\tldr\tr7, [r1, #0*4]\t\t\t@ a[0]\n\tmov\tr0, r0, asl #1\n\tldr\tr14, [r1, #9*4]\t\t\t@ a[9]\n\tumull\tr3, r4, r7, r7\t\t\t@ c = a[0] * a[0]\n\tldr\tr8, [r1, #8*4]\t\t\t@ a[8]\n\tmov\tr7, r7, asl #1\n\tumull\tr5, r6, r7, r14\t\t\t@ d = a[0]*2 * a[9]\n\tldr\tr7, [r1, #2*4]\t\t\t@ a[2]*2\n\tumull\tr9, r10, r0, r14\t\t@ d' = a[1]*2 * a[9]\n\tldr\tr14, [r1, #7*4]\t\t\t@ a[7]\n\tumlal\tr5, r6, r0, r8\t\t\t@ d += a[1]*2 * a[8]\n\tmov\tr7, r7, asl #1\n\tldr\tr0, [r1, #3*4]\t\t\t@ a[3]*2\n\tumlal\tr9, r10, r7, r8\t\t\t@ d' += a[2]*2 * a[8]\n\tldr\tr8, [r1, #6*4]\t\t\t@ a[6]\n\tumlal\tr5, r6, r7, r14\t\t\t@ d += a[2]*2 * a[7]\n\tmov\tr0, r0, asl #1\n\tldr\tr7, [r1, #4*4]\t\t\t@ a[4]*2\n\tumlal\tr9, r10, r0, r14\t\t@ d' += a[3]*2 * a[7]\n\tldr\tr14, [r1, #5*4]\t\t\t@ a[5]\n\tmov\tr7, r7, asl #1\n\tumlal\tr5, r6, r0, r8\t\t\t@ d += a[3]*2 * a[6]\n\tumlal\tr9, r10, r7, r8\t\t\t@ d' += a[4]*2 * a[6]\n\tumlal\tr5, r6, r7, r14\t\t\t@ d += a[4]*2 * a[5]\n\tumlal\tr9, r10, r14, r14\t\t@ d' += a[5] * a[5]\n\n\tbic\tr0, r5, field_not_M \t\t@ t9 = d & M\n\tstr     r0, [sp, #4 + 9*4]\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26 \n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\n\t/* B */\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u0 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u0 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t0 = c & M\n\tstr\tr14, [sp, #4 + 0*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u0 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* C interleaved with D */\n\tldr\tr0, [r1, #0*4]\t\t\t@ a[0]*2\n\tldr\tr14, [r1, #1*4]\t\t\t@ a[1]\n\tmov\tr0, r0, asl #1\n\tldr\tr8, [r1, #2*4]\t\t\t@ a[2]\n\tumlal\tr3, r4, r0, r14\t\t\t@ c += a[0]*2 * a[1]\n\tmov\tr7, r8, asl #1                  @ a[2]*2\n\tumull\tr11, r12, r14, r14\t\t@ c' = a[1] * a[1]\n\tldr\tr14, [r1, #9*4]\t\t\t@ a[9]\n\tumlal\tr11, r12, r0, r8\t\t@ c' += a[0]*2 * a[2]\n\tldr\tr0, [r1, #3*4]\t\t\t@ a[3]*2\n\tldr\tr8, [r1, #8*4]\t\t\t@ a[8]\n\tumlal\tr5, r6, r7, r14\t\t\t@ d += a[2]*2 * a[9]\n\tmov\tr0, r0, asl #1\n\tldr\tr7, [r1, #4*4]\t\t\t@ a[4]*2\n\tumull\tr9, r10, r0, r14\t\t@ d' = a[3]*2 * a[9]\n\tldr\tr14, [r1, #7*4]\t\t\t@ a[7]\n\tumlal\tr5, r6, r0, r8\t\t\t@ d += a[3]*2 * a[8]\n\tmov\tr7, r7, asl #1\n\tldr\tr0, [r1, #5*4]\t\t\t@ a[5]*2\n\tumlal\tr9, r10, r7, r8\t\t\t@ d' += a[4]*2 * a[8]\n\tldr\tr8, [r1, #6*4]\t\t\t@ a[6]\n\tmov\tr0, r0, asl #1\n\tumlal\tr5, r6, r7, r14\t\t\t@ d += a[4]*2 * a[7]\n\tumlal\tr9, r10, r0, r14\t\t@ d' += a[5]*2 * a[7]\n\tumlal\tr5, r6, r0, r8\t\t\t@ d += a[5]*2 * a[6]\n\tumlal\tr9, r10, r8, r8\t\t\t@ d' += a[6] * a[6]\n\n\tbic\tr0, r5, field_not_M \t\t@ u1 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u1 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t1 = c & M\n\tstr\tr14, [sp, #4 + 1*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u1 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* D */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u2 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u2 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t2 = c & M\n\tstr\tr14, [sp, #4 + 2*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u2 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* E interleaved with F */\n\tldr\tr7, [r1, #0*4]\t\t\t@ a[0]*2\n\tldr\tr0, [r1, #1*4]\t\t\t@ a[1]*2\n\tldr\tr14, [r1, #2*4]\t\t\t@ a[2]\n\tmov\tr7, r7, asl #1\n\tldr\tr8, [r1, #3*4]\t\t\t@ a[3]\n\tldr\tr2, [r1, #4*4]\n\tumlal\tr3, r4, r7, r8\t\t\t@ c += a[0]*2 * a[3]\n\tmov\tr0, r0, asl #1\n\tumull\tr11, r12, r7, r2\t\t@ c' = a[0]*2 * a[4]\n\tmov\tr2, r2, asl #1\t\t\t@ a[4]*2\n\tumlal\tr11, r12, r0, r8\t\t@ c' += a[1]*2 * a[3]\n\tldr\tr8, [r1, #9*4]\t\t\t@ a[9]\n\tumlal\tr3, r4, r0, r14\t\t\t@ c += a[1]*2 * a[2]\n\tldr\tr0, [r1, #5*4]\t\t\t@ a[5]*2\n\tumlal\tr11, r12, r14, r14\t\t@ c' += a[2] * a[2]\n\tldr\tr14, [r1, #8*4]\t\t\t@ a[8]\n\tmov\tr0, r0, asl #1\n\tumlal\tr5, r6, r2, r8\t\t\t@ d += a[4]*2 * a[9]\n\tldr\tr7, [r1, #6*4]\t\t\t@ a[6]*2\n\tumull\tr9, r10, r0, r8\t\t\t@ d' = a[5]*2 * a[9]\n\tmov\tr7, r7, asl #1\n\tldr\tr8, [r1, #7*4]\t\t\t@ a[7]\n\tumlal\tr5, r6, r0, r14\t\t\t@ d += a[5]*2 * a[8]\n\tumlal\tr9, r10, r7, r14\t\t@ d' += a[6]*2 * a[8]\n\tumlal\tr5, r6, r7, r8\t\t\t@ d += a[6]*2 * a[7]\n\tumlal\tr9, r10, r8, r8\t\t\t@ d' += a[7] * a[7]\n\n\tbic\tr0, r5, field_not_M \t\t@ u3 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u3 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t3 = c & M\n\tstr\tr14, [sp, #4 + 3*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u3 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* F */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u4 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u4 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t4 = c & M\n\tstr\tr14, [sp, #4 + 4*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u4 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* G interleaved with H */\n\tldr\tr7, [r1, #0*4]\t\t\t@ a[0]*2\n\tldr\tr0, [r1, #1*4]\t\t\t@ a[1]*2\n\tmov\tr7, r7, asl #1\n\tldr\tr8, [r1, #5*4]\t\t\t@ a[5]\n\tldr\tr2, [r1, #6*4]\t\t\t@ a[6]\n\tumlal\tr3, r4, r7, r8\t\t\t@ c += a[0]*2 * a[5]\n\tldr\tr14, [r1, #4*4]\t\t\t@ a[4]\n\tmov\tr0, r0, asl #1\n\tumull\tr11, r12, r7, r2\t\t@ c' = a[0]*2 * a[6]\n\tldr\tr7, [r1, #2*4]\t\t\t@ a[2]*2\n\tumlal\tr11, r12, r0, r8\t\t@ c' += a[1]*2 * a[5]\n\tmov\tr7, r7, asl #1\n\tldr\tr8, [r1, #3*4]\t\t\t@ a[3]\n\tumlal\tr3, r4, r0, r14\t\t\t@ c += a[1]*2 * a[4]\n\tmov\tr0, r2, asl #1\t\t\t@ a[6]*2\n\tumlal\tr11, r12, r7, r14\t\t@ c' += a[2]*2 * a[4]\n\tldr\tr14, [r1, #9*4]\t\t\t@ a[9]\n\tumlal\tr3, r4, r7, r8\t\t\t@ c += a[2]*2 * a[3]\n\tldr\tr7, [r1, #7*4]\t\t\t@ a[7]*2\n\tumlal\tr11, r12, r8, r8\t\t@ c' += a[3] * a[3]\n\tmov\tr7, r7, asl #1\n\tldr\tr8, [r1, #8*4]\t\t\t@ a[8]\n\tumlal\tr5, r6, r0, r14\t\t\t@ d += a[6]*2 * a[9]\n\tumull\tr9, r10, r7, r14\t\t@ d' = a[7]*2 * a[9]\n\tumlal\tr5, r6, r7, r8\t\t\t@ d += a[7]*2 * a[8]\n\tumlal\tr9, r10, r8, r8\t\t\t@ d' += a[8] * a[8]\n\n\tbic\tr0, r5, field_not_M \t\t@ u5 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u5 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t5 = c & M\n\tstr\tr14, [sp, #4 + 5*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u5 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* H */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tadds\tr5, r5, r9\t\t\t@ d += d'\n\tadc\tr6, r6, r10\n\n\tbic\tr0, r5, field_not_M \t\t@ u6 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u6 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t6 = c & M\n\tstr\tr14, [sp, #4 + 6*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u6 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* I interleaved with J */\n\tldr\tr7, [r1, #0*4]\t\t\t@ a[0]*2\n\tldr\tr0, [r1, #1*4]\t\t\t@ a[1]*2\n\tmov\tr7, r7, asl #1\n\tldr\tr8, [r1, #7*4]\t\t\t@ a[7]\n\tldr\tr2, [r1, #8*4]\t\t\t@ a[8]\n\tumlal\tr3, r4, r7, r8\t\t\t@ c += a[0]*2 * a[7]\n\tldr\tr14, [r1, #6*4]\t\t\t@ a[6]\n\tmov\tr0, r0, asl #1\n\tumull\tr11, r12, r7, r2\t\t@ c' = a[0]*2 * a[8]\n\tldr\tr7, [r1, #2*4]\t\t\t@ a[2]*2\n\tumlal\tr11, r12, r0, r8\t\t@ c' += a[1]*2 * a[7]\n\tldr\tr8, [r1, #5*4]\t\t\t@ a[5]\n\tumlal\tr3, r4, r0, r14\t\t\t@ c += a[1]*2 * a[6]\n\tldr\tr0, [r1, #3*4]\t\t\t@ a[3]*2\n\tmov\tr7, r7, asl #1\n\tumlal\tr11, r12, r7, r14\t\t@ c' += a[2]*2 * a[6]\n\tldr\tr14, [r1, #4*4]\t\t\t@ a[4]\n\tmov\tr0, r0, asl #1\n\tumlal\tr3, r4, r7, r8\t\t\t@ c += a[2]*2 * a[5]\n\tmov\tr2, r2, asl #1\t\t\t@ a[8]*2\n\tumlal\tr11, r12, r0, r8\t\t@ c' += a[3]*2 * a[5]\n\tumlal\tr3, r4, r0, r14\t\t\t@ c += a[3]*2 * a[4]\n\tumlal\tr11, r12, r14, r14\t\t@ c' += a[4] * a[4]\n\tldr\tr8, [r1, #9*4]\t\t\t@ a[9]\n\tumlal\tr5, r6, r2, r8\t\t\t@ d += a[8]*2 * a[9]\n\t@ r8 will be used in J\n\n\tbic\tr0, r5, field_not_M \t\t@ u7 = d & M\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u7 * R0\n\tumlal   r3, r4, r0, r14\n\tbic\tr14, r3, field_not_M \t\t@ t7 = c & M\n\tstr\tr14, [sp, #4 + 7*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u7 * R1\n\tumlal   r3, r4, r0, r14\n\n\t/* J */\n\tadds\tr3, r3, r11\t\t\t@ c += c'\n\tadc\tr4, r4, r12\n\tumlal\tr5, r6, r8, r8\t\t\t@ d += a[9] * a[9]\n\n\tbic\tr0, r5, field_not_M \t\t@ u8 = d & M\n\tstr\tr0, [sp, #4 + 8*4]\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\tmovw    r14, field_R0\t\t\t@ c += u8 * R0\n\tumlal   r3, r4, r0, r14\n\n\t/******************************************\n\t * compute and write back result\n\t ******************************************\n\tAllocation:\n\t    r0    r\n\t    r3:r4 c\n\t    r5:r6 d\n\t    r7    t0\n\t    r8    t1\n\t    r9    t2\n\t    r11   u8\n\t    r12   t9\n\t    r1,r2,r10,r14 scratch\n\n\tNote: do not read from a[] after here, it may overlap with r[]\n\t*/\n\tldr\tr0, [sp, #0]\n\tadd\tr1, sp, #4 + 3*4\t\t@ r[3..7] = t3..7, r11=u8, r12=t9\n\tldmia\tr1, {r2,r7,r8,r9,r10,r11,r12}\n\tadd\tr1, r0, #3*4\n\tstmia\tr1, {r2,r7,r8,r9,r10}\n\n\tbic\tr2, r3, field_not_M \t\t@ r[8] = c & M\n\tstr\tr2, [r0, #8*4]\n\tmov\tr3, r3, lsr #26     \t\t@ c >>= 26\n\torr\tr3, r3, r4, asl #6\n\tmov     r4, r4, lsr #26\n\tmov     r14, field_R1\t\t\t@ c += u8 * R1\n\tumlal   r3, r4, r11, r14\n\tmovw    r14, field_R0\t\t\t@ c += d * R0\n\tumlal   r3, r4, r5, r14\n\tadds\tr3, r3, r12\t\t\t@ c += t9\n\tadc\tr4, r4, #0\n\n\tadd\tr1, sp, #4 + 0*4\t\t@ r7,r8,r9 = t0,t1,t2\n\tldmia\tr1, {r7,r8,r9}\n\n\tubfx\tr2, r3, #0, #22     \t\t@ r[9] = c & (M >> 4)\n\tstr\tr2, [r0, #9*4]\n\tmov\tr3, r3, lsr #22     \t\t@ c >>= 22\n\torr\tr3, r3, r4, asl #10\n\tmov     r4, r4, lsr #22\n\tmovw    r14, field_R1 << 4   \t\t@ c += d * (R1 << 4)\n\tumlal   r3, r4, r5, r14\n\n\tmovw    r14, field_R0 >> 4   \t\t@ d = c * (R0 >> 4) + t0 (64x64 multiply+add)\n\tumull\tr5, r6, r3, r14\t\t\t@ d = c.lo * (R0 >> 4)\n\tadds\tr5, r5, r7\t    \t\t@ d.lo += t0\n\tmla\tr6, r14, r4, r6\t\t\t@ d.hi += c.hi * (R0 >> 4)\n\tadc\tr6, r6, 0\t     \t\t@ d.hi += carry\n\n\tbic\tr2, r5, field_not_M \t\t@ r[0] = d & M\n\tstr\tr2, [r0, #0*4]\n\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26\n\torr\tr5, r5, r6, asl #6\n\tmov     r6, r6, lsr #26\n\t\n\tmovw    r14, field_R1 >> 4   \t\t@ d += c * (R1 >> 4) + t1 (64x64 multiply+add)\n\tumull\tr1, r2, r3, r14       \t\t@ tmp = c.lo * (R1 >> 4)\n\tadds\tr5, r5, r8\t    \t\t@ d.lo += t1\n\tadc\tr6, r6, #0\t    \t\t@ d.hi += carry\n\tadds\tr5, r5, r1\t    \t\t@ d.lo += tmp.lo\n\tmla\tr2, r14, r4, r2      \t\t@ tmp.hi += c.hi * (R1 >> 4)\n\tadc\tr6, r6, r2\t   \t\t@ d.hi += carry + tmp.hi\n\n\tbic\tr2, r5, field_not_M \t\t@ r[1] = d & M\n\tstr\tr2, [r0, #1*4]\n\tmov\tr5, r5, lsr #26     \t\t@ d >>= 26 (ignore hi)\n\torr\tr5, r5, r6, asl #6\n\n\tadd\tr5, r5, r9\t  \t\t@ d += t2\n\tstr\tr5, [r0, #2*4]      \t\t@ r[2] = d\n\n\tadd\tsp, sp, #48\n\tldmfd\tsp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}\n\t.size\tsecp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner\n\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/basic-config.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_BASIC_CONFIG_\n#define _SECP256K1_BASIC_CONFIG_\n\n#ifdef USE_BASIC_CONFIG\n\n#undef USE_ASM_X86_64\n#undef USE_ENDOMORPHISM\n#undef USE_FIELD_10X26\n#undef USE_FIELD_5X52\n#undef USE_FIELD_INV_BUILTIN\n#undef USE_FIELD_INV_NUM\n#undef USE_NUM_GMP\n#undef USE_NUM_NONE\n#undef USE_SCALAR_4X64\n#undef USE_SCALAR_8X32\n#undef USE_SCALAR_INV_BUILTIN\n#undef USE_SCALAR_INV_NUM\n\n#define USE_NUM_NONE 1\n#define USE_FIELD_INV_BUILTIN 1\n#define USE_SCALAR_INV_BUILTIN 1\n#define USE_FIELD_10X26 1\n#define USE_SCALAR_8X32 1\n\n#endif // USE_BASIC_CONFIG\n#endif // _SECP256K1_BASIC_CONFIG_\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/bench.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_BENCH_H_\n#define _SECP256K1_BENCH_H_\n\n#include <stdio.h>\n#include <math.h>\n#include \"sys/time.h\"\n\nstatic double gettimedouble(void) {\n    struct timeval tv;\n    gettimeofday(&tv, NULL);\n    return tv.tv_usec * 0.000001 + tv.tv_sec;\n}\n\nvoid print_number(double x) {\n    double y = x;\n    int c = 0;\n    if (y < 0.0) {\n        y = -y;\n    }\n    while (y < 100.0) {\n        y *= 10.0;\n        c++;\n    }\n    printf(\"%.*f\", c, x);\n}\n\nvoid run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) {\n    int i;\n    double min = HUGE_VAL;\n    double sum = 0.0;\n    double max = 0.0;\n    for (i = 0; i < count; i++) {\n        double begin, total;\n        if (setup != NULL) {\n            setup(data);\n        }\n        begin = gettimedouble();\n        benchmark(data);\n        total = gettimedouble() - begin;\n        if (teardown != NULL) {\n            teardown(data);\n        }\n        if (total < min) {\n            min = total;\n        }\n        if (total > max) {\n            max = total;\n        }\n        sum += total;\n    }\n    printf(\"%s: min \", name);\n    print_number(min * 1000000.0 / iter);\n    printf(\"us / avg \");\n    print_number((sum / count) * 1000000.0 / iter);\n    printf(\"us / max \");\n    print_number(max * 1000000.0 / iter);\n    printf(\"us\\n\");\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/bench_ecdh.c",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra                  *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include <string.h>\n\n#include \"include/secp256k1.h\"\n#include \"include/secp256k1_ecdh.h\"\n#include \"util.h\"\n#include \"bench.h\"\n\ntypedef struct {\n    secp256k1_context *ctx;\n    secp256k1_pubkey point;\n    unsigned char scalar[32];\n} bench_ecdh_t;\n\nstatic void bench_ecdh_setup(void* arg) {\n    int i;\n    bench_ecdh_t *data = (bench_ecdh_t*)arg;\n    const unsigned char point[] = {\n        0x03,\n        0x54, 0x94, 0xc1, 0x5d, 0x32, 0x09, 0x97, 0x06,\n        0xc2, 0x39, 0x5f, 0x94, 0x34, 0x87, 0x45, 0xfd,\n        0x75, 0x7c, 0xe3, 0x0e, 0x4e, 0x8c, 0x90, 0xfb,\n        0xa2, 0xba, 0xd1, 0x84, 0xf8, 0x83, 0xc6, 0x9f\n    };\n\n    /* create a context with no capabilities */\n    data->ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT);\n    for (i = 0; i < 32; i++) {\n        data->scalar[i] = i + 1;\n    }\n    CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->point, point, sizeof(point)) == 1);\n}\n\nstatic void bench_ecdh(void* arg) {\n    int i;\n    unsigned char res[32];\n    bench_ecdh_t *data = (bench_ecdh_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar) == 1);\n    }\n}\n\nint main(void) {\n    bench_ecdh_t data;\n\n    run_benchmark(\"ecdh\", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000);\n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/bench_internal.c",
    "content": "/**********************************************************************\n * Copyright (c) 2014-2015 Pieter Wuille                              *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n#include <stdio.h>\n\n#include \"include/secp256k1.h\"\n\n#include \"util.h\"\n#include \"hash_impl.h\"\n#include \"num_impl.h\"\n#include \"field_impl.h\"\n#include \"group_impl.h\"\n#include \"scalar_impl.h\"\n#include \"ecmult_const_impl.h\"\n#include \"ecmult_impl.h\"\n#include \"bench.h\"\n#include \"secp256k1.c\"\n\ntypedef struct {\n    secp256k1_scalar scalar_x, scalar_y;\n    secp256k1_fe fe_x, fe_y;\n    secp256k1_ge ge_x, ge_y;\n    secp256k1_gej gej_x, gej_y;\n    unsigned char data[64];\n    int wnaf[256];\n} bench_inv_t;\n\nvoid bench_setup(void* arg) {\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    static const unsigned char init_x[32] = {\n        0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13,\n        0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35,\n        0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59,\n        0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83\n    };\n\n    static const unsigned char init_y[32] = {\n        0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83,\n        0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5,\n        0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9,\n        0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3\n    };\n\n    secp256k1_scalar_set_b32(&data->scalar_x, init_x, NULL);\n    secp256k1_scalar_set_b32(&data->scalar_y, init_y, NULL);\n    secp256k1_fe_set_b32(&data->fe_x, init_x);\n    secp256k1_fe_set_b32(&data->fe_y, init_y);\n    CHECK(secp256k1_ge_set_xo_var(&data->ge_x, &data->fe_x, 0));\n    CHECK(secp256k1_ge_set_xo_var(&data->ge_y, &data->fe_y, 1));\n    secp256k1_gej_set_ge(&data->gej_x, &data->ge_x);\n    secp256k1_gej_set_ge(&data->gej_y, &data->ge_y);\n    memcpy(data->data, init_x, 32);\n    memcpy(data->data + 32, init_y, 32);\n}\n\nvoid bench_scalar_add(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 2000000; i++) {\n        secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);\n    }\n}\n\nvoid bench_scalar_negate(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 2000000; i++) {\n        secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x);\n    }\n}\n\nvoid bench_scalar_sqr(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x);\n    }\n}\n\nvoid bench_scalar_mul(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y);\n    }\n}\n\n#ifdef USE_ENDOMORPHISM\nvoid bench_scalar_split(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_scalar l, r;\n        secp256k1_scalar_split_lambda(&l, &r, &data->scalar_x);\n        secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);\n    }\n}\n#endif\n\nvoid bench_scalar_inverse(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 2000; i++) {\n        secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x);\n        secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);\n    }\n}\n\nvoid bench_scalar_inverse_var(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 2000; i++) {\n        secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x);\n        secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);\n    }\n}\n\nvoid bench_field_normalize(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 2000000; i++) {\n        secp256k1_fe_normalize(&data->fe_x);\n    }\n}\n\nvoid bench_field_normalize_weak(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 2000000; i++) {\n        secp256k1_fe_normalize_weak(&data->fe_x);\n    }\n}\n\nvoid bench_field_mul(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y);\n    }\n}\n\nvoid bench_field_sqr(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_fe_sqr(&data->fe_x, &data->fe_x);\n    }\n}\n\nvoid bench_field_inverse(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_fe_inv(&data->fe_x, &data->fe_x);\n        secp256k1_fe_add(&data->fe_x, &data->fe_y);\n    }\n}\n\nvoid bench_field_inverse_var(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_fe_inv_var(&data->fe_x, &data->fe_x);\n        secp256k1_fe_add(&data->fe_x, &data->fe_y);\n    }\n}\n\nvoid bench_field_sqrt(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_fe_sqrt(&data->fe_x, &data->fe_x);\n        secp256k1_fe_add(&data->fe_x, &data->fe_y);\n    }\n}\n\nvoid bench_group_double_var(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL);\n    }\n}\n\nvoid bench_group_add_var(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL);\n    }\n}\n\nvoid bench_group_add_affine(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y);\n    }\n}\n\nvoid bench_group_add_affine_var(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL);\n    }\n}\n\nvoid bench_group_jacobi_var(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_gej_has_quad_y_var(&data->gej_x);\n    }\n}\n\nvoid bench_ecmult_wnaf(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A);\n        secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);\n    }\n}\n\nvoid bench_wnaf_const(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_wnaf_const(data->wnaf, data->scalar_x, WINDOW_A);\n        secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);\n    }\n}\n\n\nvoid bench_sha256(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n    secp256k1_sha256_t sha;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_sha256_initialize(&sha);\n        secp256k1_sha256_write(&sha, data->data, 32);\n        secp256k1_sha256_finalize(&sha, data->data);\n    }\n}\n\nvoid bench_hmac_sha256(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n    secp256k1_hmac_sha256_t hmac;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_hmac_sha256_initialize(&hmac, data->data, 32);\n        secp256k1_hmac_sha256_write(&hmac, data->data, 32);\n        secp256k1_hmac_sha256_finalize(&hmac, data->data);\n    }\n}\n\nvoid bench_rfc6979_hmac_sha256(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n    secp256k1_rfc6979_hmac_sha256_t rng;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 64);\n        secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32);\n    }\n}\n\nvoid bench_context_verify(void* arg) {\n    int i;\n    (void)arg;\n    for (i = 0; i < 20; i++) {\n        secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_VERIFY));\n    }\n}\n\nvoid bench_context_sign(void* arg) {\n    int i;\n    (void)arg;\n    for (i = 0; i < 200; i++) {\n        secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_SIGN));\n    }\n}\n\n#ifndef USE_NUM_NONE\nvoid bench_num_jacobi(void* arg) {\n    int i;\n    bench_inv_t *data = (bench_inv_t*)arg;\n    secp256k1_num nx, norder;\n\n    secp256k1_scalar_get_num(&nx, &data->scalar_x);\n    secp256k1_scalar_order_get_num(&norder);\n    secp256k1_scalar_get_num(&norder, &data->scalar_y);\n\n    for (i = 0; i < 200000; i++) {\n        secp256k1_num_jacobi(&nx, &norder);\n    }\n}\n#endif\n\nint have_flag(int argc, char** argv, char *flag) {\n    char** argm = argv + argc;\n    argv++;\n    if (argv == argm) {\n        return 1;\n    }\n    while (argv != NULL && argv != argm) {\n        if (strcmp(*argv, flag) == 0) {\n            return 1;\n        }\n        argv++;\n    }\n    return 0;\n}\n\nint main(int argc, char **argv) {\n    bench_inv_t data;\n    if (have_flag(argc, argv, \"scalar\") || have_flag(argc, argv, \"add\")) run_benchmark(\"scalar_add\", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000);\n    if (have_flag(argc, argv, \"scalar\") || have_flag(argc, argv, \"negate\")) run_benchmark(\"scalar_negate\", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000);\n    if (have_flag(argc, argv, \"scalar\") || have_flag(argc, argv, \"sqr\")) run_benchmark(\"scalar_sqr\", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000);\n    if (have_flag(argc, argv, \"scalar\") || have_flag(argc, argv, \"mul\")) run_benchmark(\"scalar_mul\", bench_scalar_mul, bench_setup, NULL, &data, 10, 200000);\n#ifdef USE_ENDOMORPHISM\n    if (have_flag(argc, argv, \"scalar\") || have_flag(argc, argv, \"split\")) run_benchmark(\"scalar_split\", bench_scalar_split, bench_setup, NULL, &data, 10, 20000);\n#endif\n    if (have_flag(argc, argv, \"scalar\") || have_flag(argc, argv, \"inverse\")) run_benchmark(\"scalar_inverse\", bench_scalar_inverse, bench_setup, NULL, &data, 10, 2000);\n    if (have_flag(argc, argv, \"scalar\") || have_flag(argc, argv, \"inverse\")) run_benchmark(\"scalar_inverse_var\", bench_scalar_inverse_var, bench_setup, NULL, &data, 10, 2000);\n\n    if (have_flag(argc, argv, \"field\") || have_flag(argc, argv, \"normalize\")) run_benchmark(\"field_normalize\", bench_field_normalize, bench_setup, NULL, &data, 10, 2000000);\n    if (have_flag(argc, argv, \"field\") || have_flag(argc, argv, \"normalize\")) run_benchmark(\"field_normalize_weak\", bench_field_normalize_weak, bench_setup, NULL, &data, 10, 2000000);\n    if (have_flag(argc, argv, \"field\") || have_flag(argc, argv, \"sqr\")) run_benchmark(\"field_sqr\", bench_field_sqr, bench_setup, NULL, &data, 10, 200000);\n    if (have_flag(argc, argv, \"field\") || have_flag(argc, argv, \"mul\")) run_benchmark(\"field_mul\", bench_field_mul, bench_setup, NULL, &data, 10, 200000);\n    if (have_flag(argc, argv, \"field\") || have_flag(argc, argv, \"inverse\")) run_benchmark(\"field_inverse\", bench_field_inverse, bench_setup, NULL, &data, 10, 20000);\n    if (have_flag(argc, argv, \"field\") || have_flag(argc, argv, \"inverse\")) run_benchmark(\"field_inverse_var\", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000);\n    if (have_flag(argc, argv, \"field\") || have_flag(argc, argv, \"sqrt\")) run_benchmark(\"field_sqrt\", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000);\n\n    if (have_flag(argc, argv, \"group\") || have_flag(argc, argv, \"double\")) run_benchmark(\"group_double_var\", bench_group_double_var, bench_setup, NULL, &data, 10, 200000);\n    if (have_flag(argc, argv, \"group\") || have_flag(argc, argv, \"add\")) run_benchmark(\"group_add_var\", bench_group_add_var, bench_setup, NULL, &data, 10, 200000);\n    if (have_flag(argc, argv, \"group\") || have_flag(argc, argv, \"add\")) run_benchmark(\"group_add_affine\", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000);\n    if (have_flag(argc, argv, \"group\") || have_flag(argc, argv, \"add\")) run_benchmark(\"group_add_affine_var\", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000);\n    if (have_flag(argc, argv, \"group\") || have_flag(argc, argv, \"jacobi\")) run_benchmark(\"group_jacobi_var\", bench_group_jacobi_var, bench_setup, NULL, &data, 10, 20000);\n\n    if (have_flag(argc, argv, \"ecmult\") || have_flag(argc, argv, \"wnaf\")) run_benchmark(\"wnaf_const\", bench_wnaf_const, bench_setup, NULL, &data, 10, 20000);\n    if (have_flag(argc, argv, \"ecmult\") || have_flag(argc, argv, \"wnaf\")) run_benchmark(\"ecmult_wnaf\", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000);\n\n    if (have_flag(argc, argv, \"hash\") || have_flag(argc, argv, \"sha256\")) run_benchmark(\"hash_sha256\", bench_sha256, bench_setup, NULL, &data, 10, 20000);\n    if (have_flag(argc, argv, \"hash\") || have_flag(argc, argv, \"hmac\")) run_benchmark(\"hash_hmac_sha256\", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000);\n    if (have_flag(argc, argv, \"hash\") || have_flag(argc, argv, \"rng6979\")) run_benchmark(\"hash_rfc6979_hmac_sha256\", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000);\n\n    if (have_flag(argc, argv, \"context\") || have_flag(argc, argv, \"verify\")) run_benchmark(\"context_verify\", bench_context_verify, bench_setup, NULL, &data, 10, 20);\n    if (have_flag(argc, argv, \"context\") || have_flag(argc, argv, \"sign\")) run_benchmark(\"context_sign\", bench_context_sign, bench_setup, NULL, &data, 10, 200);\n\n#ifndef USE_NUM_NONE\n    if (have_flag(argc, argv, \"num\") || have_flag(argc, argv, \"jacobi\")) run_benchmark(\"num_jacobi\", bench_num_jacobi, bench_setup, NULL, &data, 10, 200000);\n#endif\n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/bench_recover.c",
    "content": "/**********************************************************************\n * Copyright (c) 2014-2015 Pieter Wuille                              *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include \"include/secp256k1.h\"\n#include \"include/secp256k1_recovery.h\"\n#include \"util.h\"\n#include \"bench.h\"\n\ntypedef struct {\n    secp256k1_context *ctx;\n    unsigned char msg[32];\n    unsigned char sig[64];\n} bench_recover_t;\n\nvoid bench_recover(void* arg) {\n    int i;\n    bench_recover_t *data = (bench_recover_t*)arg;\n    secp256k1_pubkey pubkey;\n    unsigned char pubkeyc[33];\n\n    for (i = 0; i < 20000; i++) {\n        int j;\n        size_t pubkeylen = 33;\n        secp256k1_ecdsa_recoverable_signature sig;\n        CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(data->ctx, &sig, data->sig, i % 2));\n        CHECK(secp256k1_ecdsa_recover(data->ctx, &pubkey, &sig, data->msg));\n        CHECK(secp256k1_ec_pubkey_serialize(data->ctx, pubkeyc, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED));\n        for (j = 0; j < 32; j++) {\n            data->sig[j + 32] = data->msg[j];    /* Move former message to S. */\n            data->msg[j] = data->sig[j];         /* Move former R to message. */\n            data->sig[j] = pubkeyc[j + 1];       /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */\n        }\n    }\n}\n\nvoid bench_recover_setup(void* arg) {\n    int i;\n    bench_recover_t *data = (bench_recover_t*)arg;\n\n    for (i = 0; i < 32; i++) {\n        data->msg[i] = 1 + i;\n    }\n    for (i = 0; i < 64; i++) {\n        data->sig[i] = 65 + i;\n    }\n}\n\nint main(void) {\n    bench_recover_t data;\n\n    data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);\n\n    run_benchmark(\"ecdsa_recover\", bench_recover, bench_recover_setup, NULL, &data, 10, 20000);\n\n    secp256k1_context_destroy(data.ctx);\n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/bench_schnorr_verify.c",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"include/secp256k1.h\"\n#include \"include/secp256k1_schnorr.h\"\n#include \"util.h\"\n#include \"bench.h\"\n\ntypedef struct {\n    unsigned char key[32];\n    unsigned char sig[64];\n    unsigned char pubkey[33];\n    size_t pubkeylen;\n} benchmark_schnorr_sig_t;\n\ntypedef struct {\n    secp256k1_context *ctx;\n    unsigned char msg[32];\n    benchmark_schnorr_sig_t sigs[64];\n    int numsigs;\n} benchmark_schnorr_verify_t;\n\nstatic void benchmark_schnorr_init(void* arg) {\n    int i, k;\n    benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg;\n\n    for (i = 0; i < 32; i++) {\n        data->msg[i] = 1 + i;\n    }\n    for (k = 0; k < data->numsigs; k++) {\n        secp256k1_pubkey pubkey;\n        for (i = 0; i < 32; i++) {\n            data->sigs[k].key[i] = 33 + i + k;\n        }\n        secp256k1_schnorr_sign(data->ctx, data->sigs[k].sig, data->msg, data->sigs[k].key, NULL, NULL);\n        data->sigs[k].pubkeylen = 33;\n        CHECK(secp256k1_ec_pubkey_create(data->ctx, &pubkey, data->sigs[k].key));\n        CHECK(secp256k1_ec_pubkey_serialize(data->ctx, data->sigs[k].pubkey, &data->sigs[k].pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED));\n    }\n}\n\nstatic void benchmark_schnorr_verify(void* arg) {\n    int i;\n    benchmark_schnorr_verify_t* data = (benchmark_schnorr_verify_t*)arg;\n\n    for (i = 0; i < 20000 / data->numsigs; i++) {\n        secp256k1_pubkey pubkey;\n        data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF);\n        CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->sigs[0].pubkey, data->sigs[0].pubkeylen));\n        CHECK(secp256k1_schnorr_verify(data->ctx, data->sigs[0].sig, data->msg, &pubkey) == ((i & 0xFF) == 0));\n        data->sigs[0].sig[(i >> 8) % 64] ^= (i & 0xFF);\n    }\n}\n\n\n\nint main(void) {\n    benchmark_schnorr_verify_t data;\n\n    data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n\n    data.numsigs = 1;\n    run_benchmark(\"schnorr_verify\", benchmark_schnorr_verify, benchmark_schnorr_init, NULL, &data, 10, 20000);\n\n    secp256k1_context_destroy(data.ctx);\n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/bench_sign.c",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include \"include/secp256k1.h\"\n#include \"util.h\"\n#include \"bench.h\"\n\ntypedef struct {\n    secp256k1_context* ctx;\n    unsigned char msg[32];\n    unsigned char key[32];\n} bench_sign_t;\n\nstatic void bench_sign_setup(void* arg) {\n    int i;\n    bench_sign_t *data = (bench_sign_t*)arg;\n\n    for (i = 0; i < 32; i++) {\n        data->msg[i] = i + 1;\n    }\n    for (i = 0; i < 32; i++) {\n        data->key[i] = i + 65;\n    }\n}\n\nstatic void bench_sign(void* arg) {\n    int i;\n    bench_sign_t *data = (bench_sign_t*)arg;\n\n    unsigned char sig[74];\n    for (i = 0; i < 20000; i++) {\n        size_t siglen = 74;\n        int j;\n        secp256k1_ecdsa_signature signature;\n        CHECK(secp256k1_ecdsa_sign(data->ctx, &signature, data->msg, data->key, NULL, NULL));\n        CHECK(secp256k1_ecdsa_signature_serialize_der(data->ctx, sig, &siglen, &signature));\n        for (j = 0; j < 32; j++) {\n            data->msg[j] = sig[j];\n            data->key[j] = sig[j + 32];\n        }\n    }\n}\n\nint main(void) {\n    bench_sign_t data;\n\n    data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);\n\n    run_benchmark(\"ecdsa_sign\", bench_sign, bench_sign_setup, NULL, &data, 10, 20000);\n\n    secp256k1_context_destroy(data.ctx);\n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/bench_verify.c",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"include/secp256k1.h\"\n#include \"util.h\"\n#include \"bench.h\"\n\n#ifdef ENABLE_OPENSSL_TESTS\n#include <openssl/bn.h>\n#include <openssl/ecdsa.h>\n#include <openssl/obj_mac.h>\n#endif\n\ntypedef struct {\n    secp256k1_context *ctx;\n    unsigned char msg[32];\n    unsigned char key[32];\n    unsigned char sig[72];\n    size_t siglen;\n    unsigned char pubkey[33];\n    size_t pubkeylen;\n#ifdef ENABLE_OPENSSL_TESTS\n    EC_GROUP* ec_group;\n#endif\n} benchmark_verify_t;\n\nstatic void benchmark_verify(void* arg) {\n    int i;\n    benchmark_verify_t* data = (benchmark_verify_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        secp256k1_pubkey pubkey;\n        secp256k1_ecdsa_signature sig;\n        data->sig[data->siglen - 1] ^= (i & 0xFF);\n        data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);\n        data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);\n        CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->pubkey, data->pubkeylen) == 1);\n        CHECK(secp256k1_ecdsa_signature_parse_der(data->ctx, &sig, data->sig, data->siglen) == 1);\n        CHECK(secp256k1_ecdsa_verify(data->ctx, &sig, data->msg, &pubkey) == (i == 0));\n        data->sig[data->siglen - 1] ^= (i & 0xFF);\n        data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);\n        data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);\n    }\n}\n\n#ifdef ENABLE_OPENSSL_TESTS\nstatic void benchmark_verify_openssl(void* arg) {\n    int i;\n    benchmark_verify_t* data = (benchmark_verify_t*)arg;\n\n    for (i = 0; i < 20000; i++) {\n        data->sig[data->siglen - 1] ^= (i & 0xFF);\n        data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);\n        data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);\n        {\n            EC_KEY *pkey = EC_KEY_new();\n            const unsigned char *pubkey = &data->pubkey[0];\n            int result;\n\n            CHECK(pkey != NULL);\n            result = EC_KEY_set_group(pkey, data->ec_group);\n            CHECK(result);\n            result = (o2i_ECPublicKey(&pkey, &pubkey, data->pubkeylen)) != NULL;\n            CHECK(result);\n            result = ECDSA_verify(0, &data->msg[0], sizeof(data->msg), &data->sig[0], data->siglen, pkey) == (i == 0);\n            CHECK(result);\n            EC_KEY_free(pkey);\n        }\n        data->sig[data->siglen - 1] ^= (i & 0xFF);\n        data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);\n        data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);\n    }\n}\n#endif\n\nint main(void) {\n    int i;\n    secp256k1_pubkey pubkey;\n    secp256k1_ecdsa_signature sig;\n    benchmark_verify_t data;\n\n    data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n\n    for (i = 0; i < 32; i++) {\n        data.msg[i] = 1 + i;\n    }\n    for (i = 0; i < 32; i++) {\n        data.key[i] = 33 + i;\n    }\n    data.siglen = 72;\n    CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL));\n    CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig));\n    CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key));\n    data.pubkeylen = 33;\n    CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1);\n\n    run_benchmark(\"ecdsa_verify\", benchmark_verify, NULL, NULL, &data, 10, 20000);\n#ifdef ENABLE_OPENSSL_TESTS\n    data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1);\n    run_benchmark(\"ecdsa_verify_openssl\", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000);\n    EC_GROUP_free(data.ec_group);\n#endif\n\n    secp256k1_context_destroy(data.ctx);\n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecdsa.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECDSA_\n#define _SECP256K1_ECDSA_\n\n#include <stddef.h>\n\n#include \"scalar.h\"\n#include \"group.h\"\n#include \"ecmult.h\"\n\nstatic int secp256k1_ecdsa_sig_parse(secp256k1_scalar *r, secp256k1_scalar *s, const unsigned char *sig, size_t size);\nstatic int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar *r, const secp256k1_scalar *s);\nstatic int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar* r, const secp256k1_scalar* s, const secp256k1_ge *pubkey, const secp256k1_scalar *message);\nstatic int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecdsa_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013-2015 Pieter Wuille                              *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n\n#ifndef _SECP256K1_ECDSA_IMPL_H_\n#define _SECP256K1_ECDSA_IMPL_H_\n\n#include \"scalar.h\"\n#include \"field.h\"\n#include \"group.h\"\n#include \"ecmult.h\"\n#include \"ecmult_gen.h\"\n#include \"ecdsa.h\"\n\n/** Group order for secp256k1 defined as 'n' in \"Standards for Efficient Cryptography\" (SEC2) 2.7.1\n *  sage: for t in xrange(1023, -1, -1):\n *     ..   p = 2**256 - 2**32 - t\n *     ..   if p.is_prime():\n *     ..     print '%x'%p\n *     ..     break\n *   'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'\n *  sage: a = 0\n *  sage: b = 7\n *  sage: F = FiniteField (p)\n *  sage: '%x' % (EllipticCurve ([F (a), F (b)]).order())\n *   'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'\n */\nstatic const secp256k1_fe secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST(\n    0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,\n    0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL\n);\n\n/** Difference between field and order, values 'p' and 'n' values defined in\n *  \"Standards for Efficient Cryptography\" (SEC2) 2.7.1.\n *  sage: p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\n *  sage: a = 0\n *  sage: b = 7\n *  sage: F = FiniteField (p)\n *  sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order())\n *   '14551231950b75fc4402da1722fc9baee'\n */\nstatic const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST(\n    0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL\n);\n\nstatic int secp256k1_der_read_len(const unsigned char **sigp, const unsigned char *sigend) {\n    int lenleft, b1;\n    size_t ret = 0;\n    if (*sigp >= sigend) {\n        return -1;\n    }\n    b1 = *((*sigp)++);\n    if (b1 == 0xFF) {\n        /* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */\n        return -1;\n    }\n    if ((b1 & 0x80) == 0) {\n        /* X.690-0207 8.1.3.4 short form length octets */\n        return b1;\n    }\n    if (b1 == 0x80) {\n        /* Indefinite length is not allowed in DER. */\n        return -1;\n    }\n    /* X.690-207 8.1.3.5 long form length octets */\n    lenleft = b1 & 0x7F;\n    if (lenleft > sigend - *sigp) {\n        return -1;\n    }\n    if (**sigp == 0) {\n        /* Not the shortest possible length encoding. */\n        return -1;\n    }\n    if ((size_t)lenleft > sizeof(size_t)) {\n        /* The resulting length would exceed the range of a size_t, so\n         * certainly longer than the passed array size.\n         */\n        return -1;\n    }\n    while (lenleft > 0) {\n        if ((ret >> ((sizeof(size_t) - 1) * 8)) != 0) {\n        }\n        ret = (ret << 8) | **sigp;\n        if (ret + lenleft > (size_t)(sigend - *sigp)) {\n            /* Result exceeds the length of the passed array. */\n            return -1;\n        }\n        (*sigp)++;\n        lenleft--;\n    }\n    if (ret < 128) {\n        /* Not the shortest possible length encoding. */\n        return -1;\n    }\n    return ret;\n}\n\nstatic int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char **sig, const unsigned char *sigend) {\n    int overflow = 0;\n    unsigned char ra[32] = {0};\n    int rlen;\n\n    if (*sig == sigend || **sig != 0x02) {\n        /* Not a primitive integer (X.690-0207 8.3.1). */\n        return 0;\n    }\n    (*sig)++;\n    rlen = secp256k1_der_read_len(sig, sigend);\n    if (rlen <= 0 || (*sig) + rlen > sigend) {\n        /* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1).  */\n        return 0;\n    }\n    if (**sig == 0x00 && rlen > 1 && (((*sig)[1]) & 0x80) == 0x00) {\n        /* Excessive 0x00 padding. */\n        return 0;\n    }\n    if (**sig == 0xFF && rlen > 1 && (((*sig)[1]) & 0x80) == 0x80) {\n        /* Excessive 0xFF padding. */\n        return 0;\n    }\n    if ((**sig & 0x80) == 0x80) {\n        /* Negative. */\n        overflow = 1;\n    }\n    while (rlen > 0 && **sig == 0) {\n        /* Skip leading zero bytes */\n        rlen--;\n        (*sig)++;\n    }\n    if (rlen > 32) {\n        overflow = 1;\n    }\n    if (!overflow) {\n        memcpy(ra + 32 - rlen, *sig, rlen);\n        secp256k1_scalar_set_b32(r, ra, &overflow);\n    }\n    if (overflow) {\n        secp256k1_scalar_set_int(r, 0);\n    }\n    (*sig) += rlen;\n    return 1;\n}\n\nstatic int secp256k1_ecdsa_sig_parse(secp256k1_scalar *rr, secp256k1_scalar *rs, const unsigned char *sig, size_t size) {\n    const unsigned char *sigend = sig + size;\n    int rlen;\n    if (sig == sigend || *(sig++) != 0x30) {\n        /* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */\n        return 0;\n    }\n    rlen = secp256k1_der_read_len(&sig, sigend);\n    if (rlen < 0 || sig + rlen > sigend) {\n        /* Tuple exceeds bounds */\n        return 0;\n    }\n    if (sig + rlen != sigend) {\n        /* Garbage after tuple. */\n        return 0;\n    }\n\n    if (!secp256k1_der_parse_integer(rr, &sig, sigend)) {\n        return 0;\n    }\n    if (!secp256k1_der_parse_integer(rs, &sig, sigend)) {\n        return 0;\n    }\n\n    if (sig != sigend) {\n        /* Trailing garbage inside tuple. */\n        return 0;\n    }\n\n    return 1;\n}\n\nstatic int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar* ar, const secp256k1_scalar* as) {\n    unsigned char r[33] = {0}, s[33] = {0};\n    unsigned char *rp = r, *sp = s;\n    size_t lenR = 33, lenS = 33;\n    secp256k1_scalar_get_b32(&r[1], ar);\n    secp256k1_scalar_get_b32(&s[1], as);\n    while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; }\n    while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; }\n    if (*size < 6+lenS+lenR) {\n        *size = 6 + lenS + lenR;\n        return 0;\n    }\n    *size = 6 + lenS + lenR;\n    sig[0] = 0x30;\n    sig[1] = 4 + lenS + lenR;\n    sig[2] = 0x02;\n    sig[3] = lenR;\n    memcpy(sig+4, rp, lenR);\n    sig[4+lenR] = 0x02;\n    sig[5+lenR] = lenS;\n    memcpy(sig+lenR+6, sp, lenS);\n    return 1;\n}\n\nstatic int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar *sigs, const secp256k1_ge *pubkey, const secp256k1_scalar *message) {\n    unsigned char c[32];\n    secp256k1_scalar sn, u1, u2;\n#if !defined(EXHAUSTIVE_TEST_ORDER)\n    secp256k1_fe xr;\n#endif\n    secp256k1_gej pubkeyj;\n    secp256k1_gej pr;\n\n    if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) {\n        return 0;\n    }\n\n    secp256k1_scalar_inverse_var(&sn, sigs);\n    secp256k1_scalar_mul(&u1, &sn, message);\n    secp256k1_scalar_mul(&u2, &sn, sigr);\n    secp256k1_gej_set_ge(&pubkeyj, pubkey);\n    secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1);\n    if (secp256k1_gej_is_infinity(&pr)) {\n        return 0;\n    }\n\n#if defined(EXHAUSTIVE_TEST_ORDER)\n{\n    secp256k1_scalar computed_r;\n    secp256k1_ge pr_ge;\n    secp256k1_ge_set_gej(&pr_ge, &pr);\n    secp256k1_fe_normalize(&pr_ge.x);\n\n    secp256k1_fe_get_b32(c, &pr_ge.x);\n    secp256k1_scalar_set_b32(&computed_r, c, NULL);\n    return secp256k1_scalar_eq(sigr, &computed_r);\n}\n#else\n    secp256k1_scalar_get_b32(c, sigr);\n    secp256k1_fe_set_b32(&xr, c);\n\n    /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n)\n     *  in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p),\n     *  compute the remainder modulo n, and compare it to xr. However:\n     *\n     *        xr == X(pr) mod n\n     *    <=> exists h. (xr + h * n < p && xr + h * n == X(pr))\n     *    [Since 2 * n > p, h can only be 0 or 1]\n     *    <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr))\n     *    [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p]\n     *    <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p)\n     *    [Multiplying both sides of the equations by pr.z^2 mod p]\n     *    <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x)\n     *\n     *  Thus, we can avoid the inversion, but we have to check both cases separately.\n     *  secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test.\n     */\n    if (secp256k1_gej_eq_x_var(&xr, &pr)) {\n        /* xr * pr.z^2 mod p == pr.x, so the signature is valid. */\n        return 1;\n    }\n    if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) {\n        /* xr + n >= p, so we can skip testing the second case. */\n        return 0;\n    }\n    secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe);\n    if (secp256k1_gej_eq_x_var(&xr, &pr)) {\n        /* (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid. */\n        return 1;\n    }\n    return 0;\n#endif\n}\n\nstatic int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) {\n    unsigned char b[32];\n    secp256k1_gej rp;\n    secp256k1_ge r;\n    secp256k1_scalar n;\n    int overflow = 0;\n\n    secp256k1_ecmult_gen(ctx, &rp, nonce);\n    secp256k1_ge_set_gej(&r, &rp);\n    secp256k1_fe_normalize(&r.x);\n    secp256k1_fe_normalize(&r.y);\n    secp256k1_fe_get_b32(b, &r.x);\n    secp256k1_scalar_set_b32(sigr, b, &overflow);\n    /* These two conditions should be checked before calling */\n    VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr));\n    VERIFY_CHECK(overflow == 0);\n\n    if (recid) {\n        /* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log\n         * of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria.\n         */\n        *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0);\n    }\n    secp256k1_scalar_mul(&n, sigr, seckey);\n    secp256k1_scalar_add(&n, &n, message);\n    secp256k1_scalar_inverse(sigs, nonce);\n    secp256k1_scalar_mul(sigs, sigs, &n);\n    secp256k1_scalar_clear(&n);\n    secp256k1_gej_clear(&rp);\n    secp256k1_ge_clear(&r);\n    if (secp256k1_scalar_is_zero(sigs)) {\n        return 0;\n    }\n    if (secp256k1_scalar_is_high(sigs)) {\n        secp256k1_scalar_negate(sigs, sigs);\n        if (recid) {\n            *recid ^= 1;\n        }\n    }\n    return 1;\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/eckey.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECKEY_\n#define _SECP256K1_ECKEY_\n\n#include <stddef.h>\n\n#include \"group.h\"\n#include \"scalar.h\"\n#include \"ecmult.h\"\n#include \"ecmult_gen.h\"\n\nstatic int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size);\nstatic int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed);\n\nstatic int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak);\nstatic int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak);\nstatic int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak);\nstatic int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/eckey_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECKEY_IMPL_H_\n#define _SECP256K1_ECKEY_IMPL_H_\n\n#include \"eckey.h\"\n\n#include \"scalar.h\"\n#include \"field.h\"\n#include \"group.h\"\n#include \"ecmult_gen.h\"\n\nstatic int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) {\n    if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) {\n        secp256k1_fe x;\n        return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03);\n    } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) {\n        secp256k1_fe x, y;\n        if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) {\n            return 0;\n        }\n        secp256k1_ge_set_xy(elem, &x, &y);\n        if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) {\n            return 0;\n        }\n        return secp256k1_ge_is_valid_var(elem);\n    } else {\n        return 0;\n    }\n}\n\nstatic int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed) {\n    if (secp256k1_ge_is_infinity(elem)) {\n        return 0;\n    }\n    secp256k1_fe_normalize_var(&elem->x);\n    secp256k1_fe_normalize_var(&elem->y);\n    secp256k1_fe_get_b32(&pub[1], &elem->x);\n    if (compressed) {\n        *size = 33;\n        pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00);\n    } else {\n        *size = 65;\n        pub[0] = 0x04;\n        secp256k1_fe_get_b32(&pub[33], &elem->y);\n    }\n    return 1;\n}\n\nstatic int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak) {\n    secp256k1_scalar_add(key, key, tweak);\n    if (secp256k1_scalar_is_zero(key)) {\n        return 0;\n    }\n    return 1;\n}\n\nstatic int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) {\n    secp256k1_gej pt;\n    secp256k1_scalar one;\n    secp256k1_gej_set_ge(&pt, key);\n    secp256k1_scalar_set_int(&one, 1);\n    secp256k1_ecmult(ctx, &pt, &pt, &one, tweak);\n\n    if (secp256k1_gej_is_infinity(&pt)) {\n        return 0;\n    }\n    secp256k1_ge_set_gej(key, &pt);\n    return 1;\n}\n\nstatic int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak) {\n    if (secp256k1_scalar_is_zero(tweak)) {\n        return 0;\n    }\n\n    secp256k1_scalar_mul(key, key, tweak);\n    return 1;\n}\n\nstatic int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) {\n    secp256k1_scalar zero;\n    secp256k1_gej pt;\n    if (secp256k1_scalar_is_zero(tweak)) {\n        return 0;\n    }\n\n    secp256k1_scalar_set_int(&zero, 0);\n    secp256k1_gej_set_ge(&pt, key);\n    secp256k1_ecmult(ctx, &pt, &pt, tweak, &zero);\n    secp256k1_ge_set_gej(key, &pt);\n    return 1;\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecmult.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECMULT_\n#define _SECP256K1_ECMULT_\n\n#include \"num.h\"\n#include \"group.h\"\n\ntypedef struct {\n    /* For accelerating the computation of a*P + b*G: */\n    secp256k1_ge_storage (*pre_g)[];    /* odd multiples of the generator */\n#ifdef USE_ENDOMORPHISM\n    secp256k1_ge_storage (*pre_g_128)[]; /* odd multiples of 2^128*generator */\n#endif\n} secp256k1_ecmult_context;\n\nstatic void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx);\nstatic void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb);\nstatic void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst,\n                                           const secp256k1_ecmult_context *src, const secp256k1_callback *cb);\nstatic void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx);\nstatic int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx);\n\n/** Double multiply: R = na*A + ng*G */\nstatic void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecmult_const.h",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Andrew Poelstra                                 *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECMULT_CONST_\n#define _SECP256K1_ECMULT_CONST_\n\n#include \"scalar.h\"\n#include \"group.h\"\n\nstatic void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecmult_const_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra                  *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECMULT_CONST_IMPL_\n#define _SECP256K1_ECMULT_CONST_IMPL_\n\n#include \"scalar.h\"\n#include \"group.h\"\n#include \"ecmult_const.h\"\n#include \"ecmult_impl.h\"\n\n#ifdef USE_ENDOMORPHISM\n    #define WNAF_BITS 128\n#else\n    #define WNAF_BITS 256\n#endif\n#define WNAF_SIZE(w) ((WNAF_BITS + (w) - 1) / (w))\n\n/* This is like `ECMULT_TABLE_GET_GE` but is constant time */\n#define ECMULT_CONST_TABLE_GET_GE(r,pre,n,w) do { \\\n    int m; \\\n    int abs_n = (n) * (((n) > 0) * 2 - 1); \\\n    int idx_n = abs_n / 2; \\\n    secp256k1_fe neg_y; \\\n    VERIFY_CHECK(((n) & 1) == 1); \\\n    VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \\\n    VERIFY_CHECK((n) <=  ((1 << ((w)-1)) - 1)); \\\n    VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \\\n    VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \\\n    for (m = 0; m < ECMULT_TABLE_SIZE(w); m++) { \\\n        /* This loop is used to avoid secret data in array indices. See\n         * the comment in ecmult_gen_impl.h for rationale. */ \\\n        secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \\\n        secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \\\n    } \\\n    (r)->infinity = 0; \\\n    secp256k1_fe_negate(&neg_y, &(r)->y, 1); \\\n    secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \\\n} while(0)\n\n\n/** Convert a number to WNAF notation. The number becomes represented by sum(2^{wi} * wnaf[i], i=0..return_val)\n *  with the following guarantees:\n *  - each wnaf[i] an odd integer between -(1 << w) and (1 << w)\n *  - each wnaf[i] is nonzero\n *  - the number of words set is returned; this is always (WNAF_BITS + w - 1) / w\n *\n *  Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar\n *  Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.)\n *  CT-RSA 2003, LNCS 2612, pp. 328-443, 2003. Springer-Verlagy Berlin Heidelberg 2003\n *\n *  Numbers reference steps of `Algorithm SPA-resistant Width-w NAF with Odd Scalar` on pp. 335\n */\nstatic int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w) {\n    int global_sign;\n    int skew = 0;\n    int word = 0;\n\n    /* 1 2 3 */\n    int u_last;\n    int u;\n\n    int flip;\n    int bit;\n    secp256k1_scalar neg_s;\n    int not_neg_one;\n    /* Note that we cannot handle even numbers by negating them to be odd, as is\n     * done in other implementations, since if our scalars were specified to have\n     * width < 256 for performance reasons, their negations would have width 256\n     * and we'd lose any performance benefit. Instead, we use a technique from\n     * Section 4.2 of the Okeya/Tagaki paper, which is to add either 1 (for even)\n     * or 2 (for odd) to the number we are encoding, returning a skew value indicating\n     * this, and having the caller compensate after doing the multiplication. */\n\n    /* Negative numbers will be negated to keep their bit representation below the maximum width */\n    flip = secp256k1_scalar_is_high(&s);\n    /* We add 1 to even numbers, 2 to odd ones, noting that negation flips parity */\n    bit = flip ^ !secp256k1_scalar_is_even(&s);\n    /* We check for negative one, since adding 2 to it will cause an overflow */\n    secp256k1_scalar_negate(&neg_s, &s);\n    not_neg_one = !secp256k1_scalar_is_one(&neg_s);\n    secp256k1_scalar_cadd_bit(&s, bit, not_neg_one);\n    /* If we had negative one, flip == 1, s.d[0] == 0, bit == 1, so caller expects\n     * that we added two to it and flipped it. In fact for -1 these operations are\n     * identical. We only flipped, but since skewing is required (in the sense that\n     * the skew must be 1 or 2, never zero) and flipping is not, we need to change\n     * our flags to claim that we only skewed. */\n    global_sign = secp256k1_scalar_cond_negate(&s, flip);\n    global_sign *= not_neg_one * 2 - 1;\n    skew = 1 << bit;\n\n    /* 4 */\n    u_last = secp256k1_scalar_shr_int(&s, w);\n    while (word * w < WNAF_BITS) {\n        int sign;\n        int even;\n\n        /* 4.1 4.4 */\n        u = secp256k1_scalar_shr_int(&s, w);\n        /* 4.2 */\n        even = ((u & 1) == 0);\n        sign = 2 * (u_last > 0) - 1;\n        u += sign * even;\n        u_last -= sign * even * (1 << w);\n\n        /* 4.3, adapted for global sign change */\n        wnaf[word++] = u_last * global_sign;\n\n        u_last = u;\n    }\n    wnaf[word] = u * global_sign;\n\n    VERIFY_CHECK(secp256k1_scalar_is_zero(&s));\n    VERIFY_CHECK(word == WNAF_SIZE(w));\n    return skew;\n}\n\n\nstatic void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *scalar) {\n    secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)];\n    secp256k1_ge tmpa;\n    secp256k1_fe Z;\n\n    int skew_1;\n    int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)];\n#ifdef USE_ENDOMORPHISM\n    secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)];\n    int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)];\n    int skew_lam;\n    secp256k1_scalar q_1, q_lam;\n#endif\n\n    int i;\n    secp256k1_scalar sc = *scalar;\n\n    /* build wnaf representation for q. */\n#ifdef USE_ENDOMORPHISM\n    /* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */\n    secp256k1_scalar_split_lambda(&q_1, &q_lam, &sc);\n    skew_1   = secp256k1_wnaf_const(wnaf_1,   q_1,   WINDOW_A - 1);\n    skew_lam = secp256k1_wnaf_const(wnaf_lam, q_lam, WINDOW_A - 1);\n#else\n    skew_1   = secp256k1_wnaf_const(wnaf_1, sc, WINDOW_A - 1);\n#endif\n\n    /* Calculate odd multiples of a.\n     * All multiples are brought to the same Z 'denominator', which is stored\n     * in Z. Due to secp256k1' isomorphism we can do all operations pretending\n     * that the Z coordinate was 1, use affine addition formulae, and correct\n     * the Z coordinate of the result once at the end.\n     */\n    secp256k1_gej_set_ge(r, a);\n    secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r);\n    for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {\n        secp256k1_fe_normalize_weak(&pre_a[i].y);\n    }\n#ifdef USE_ENDOMORPHISM\n    for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {\n        secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]);\n    }\n#endif\n\n    /* first loop iteration (separated out so we can directly set r, rather\n     * than having it start at infinity, get doubled several times, then have\n     * its new value added to it) */\n    i = wnaf_1[WNAF_SIZE(WINDOW_A - 1)];\n    VERIFY_CHECK(i != 0);\n    ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A);\n    secp256k1_gej_set_ge(r, &tmpa);\n#ifdef USE_ENDOMORPHISM\n    i = wnaf_lam[WNAF_SIZE(WINDOW_A - 1)];\n    VERIFY_CHECK(i != 0);\n    ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A);\n    secp256k1_gej_add_ge(r, r, &tmpa);\n#endif\n    /* remaining loop iterations */\n    for (i = WNAF_SIZE(WINDOW_A - 1) - 1; i >= 0; i--) {\n        int n;\n        int j;\n        for (j = 0; j < WINDOW_A - 1; ++j) {\n            secp256k1_gej_double_nonzero(r, r, NULL);\n        }\n\n        n = wnaf_1[i];\n        ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A);\n        VERIFY_CHECK(n != 0);\n        secp256k1_gej_add_ge(r, r, &tmpa);\n#ifdef USE_ENDOMORPHISM\n        n = wnaf_lam[i];\n        ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A);\n        VERIFY_CHECK(n != 0);\n        secp256k1_gej_add_ge(r, r, &tmpa);\n#endif\n    }\n\n    secp256k1_fe_mul(&r->z, &r->z, &Z);\n\n    {\n        /* Correct for wNAF skew */\n        secp256k1_ge correction = *a;\n        secp256k1_ge_storage correction_1_stor;\n#ifdef USE_ENDOMORPHISM\n        secp256k1_ge_storage correction_lam_stor;\n#endif\n        secp256k1_ge_storage a2_stor;\n        secp256k1_gej tmpj;\n        secp256k1_gej_set_ge(&tmpj, &correction);\n        secp256k1_gej_double_var(&tmpj, &tmpj, NULL);\n        secp256k1_ge_set_gej(&correction, &tmpj);\n        secp256k1_ge_to_storage(&correction_1_stor, a);\n#ifdef USE_ENDOMORPHISM\n        secp256k1_ge_to_storage(&correction_lam_stor, a);\n#endif\n        secp256k1_ge_to_storage(&a2_stor, &correction);\n\n        /* For odd numbers this is 2a (so replace it), for even ones a (so no-op) */\n        secp256k1_ge_storage_cmov(&correction_1_stor, &a2_stor, skew_1 == 2);\n#ifdef USE_ENDOMORPHISM\n        secp256k1_ge_storage_cmov(&correction_lam_stor, &a2_stor, skew_lam == 2);\n#endif\n\n        /* Apply the correction */\n        secp256k1_ge_from_storage(&correction, &correction_1_stor);\n        secp256k1_ge_neg(&correction, &correction);\n        secp256k1_gej_add_ge(r, r, &correction);\n\n#ifdef USE_ENDOMORPHISM\n        secp256k1_ge_from_storage(&correction, &correction_lam_stor);\n        secp256k1_ge_neg(&correction, &correction);\n        secp256k1_ge_mul_lambda(&correction, &correction);\n        secp256k1_gej_add_ge(r, r, &correction);\n#endif\n    }\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecmult_gen.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECMULT_GEN_\n#define _SECP256K1_ECMULT_GEN_\n\n#include \"scalar.h\"\n#include \"group.h\"\n\ntypedef struct {\n    /* For accelerating the computation of a*G:\n     * To harden against timing attacks, use the following mechanism:\n     * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63.\n     * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where:\n     *   * U_i = U * 2^i (for i=0..62)\n     *   * U_i = U * (1-2^63) (for i=63)\n     *   where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0.\n     * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is\n     * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63).\n     * None of the resulting prec group elements have a known scalar, and neither do any of\n     * the intermediate sums while computing a*G.\n     */\n    secp256k1_ge_storage (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */\n    secp256k1_scalar blind;\n    secp256k1_gej initial;\n} secp256k1_ecmult_gen_context;\n\nstatic void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx);\nstatic void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb);\nstatic void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst,\n                                               const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb);\nstatic void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx);\nstatic int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx);\n\n/** Multiply with the generator: R = a*G */\nstatic void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp256k1_gej *r, const secp256k1_scalar *a);\n\nstatic void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecmult_gen_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell      *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECMULT_GEN_IMPL_H_\n#define _SECP256K1_ECMULT_GEN_IMPL_H_\n\n#include \"scalar.h\"\n#include \"group.h\"\n#include \"ecmult_gen.h\"\n#include \"hash_impl.h\"\n#ifdef USE_ECMULT_STATIC_PRECOMPUTATION\n#include \"ecmult_static_context.h\"\n#endif\nstatic void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context *ctx) {\n    ctx->prec = NULL;\n}\n\nstatic void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, const secp256k1_callback* cb) {\n#ifndef USE_ECMULT_STATIC_PRECOMPUTATION\n    secp256k1_ge prec[1024];\n    secp256k1_gej gj;\n    secp256k1_gej nums_gej;\n    int i, j;\n#endif\n\n    if (ctx->prec != NULL) {\n        return;\n    }\n#ifndef USE_ECMULT_STATIC_PRECOMPUTATION\n    ctx->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*ctx->prec));\n\n    /* get the generator */\n    secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);\n\n    /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */\n    {\n        static const unsigned char nums_b32[33] = \"The scalar for this x is unknown\";\n        secp256k1_fe nums_x;\n        secp256k1_ge nums_ge;\n        int r;\n        r = secp256k1_fe_set_b32(&nums_x, nums_b32);\n        (void)r;\n        VERIFY_CHECK(r);\n        r = secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0);\n        (void)r;\n        VERIFY_CHECK(r);\n        secp256k1_gej_set_ge(&nums_gej, &nums_ge);\n        /* Add G to make the bits in x uniformly distributed. */\n        secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g, NULL);\n    }\n\n    /* compute prec. */\n    {\n        secp256k1_gej precj[1024]; /* Jacobian versions of prec. */\n        secp256k1_gej gbase;\n        secp256k1_gej numsbase;\n        gbase = gj; /* 16^j * G */\n        numsbase = nums_gej; /* 2^j * nums. */\n        for (j = 0; j < 64; j++) {\n            /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */\n            precj[j*16] = numsbase;\n            for (i = 1; i < 16; i++) {\n                secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase, NULL);\n            }\n            /* Multiply gbase by 16. */\n            for (i = 0; i < 4; i++) {\n                secp256k1_gej_double_var(&gbase, &gbase, NULL);\n            }\n            /* Multiply numbase by 2. */\n            secp256k1_gej_double_var(&numsbase, &numsbase, NULL);\n            if (j == 62) {\n                /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */\n                secp256k1_gej_neg(&numsbase, &numsbase);\n                secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL);\n            }\n        }\n        secp256k1_ge_set_all_gej_var(prec, precj, 1024, cb);\n    }\n    for (j = 0; j < 64; j++) {\n        for (i = 0; i < 16; i++) {\n            secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]);\n        }\n    }\n#else\n    (void)cb;\n    ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context;\n#endif\n    secp256k1_ecmult_gen_blind(ctx, NULL);\n}\n\nstatic int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx) {\n    return ctx->prec != NULL;\n}\n\nstatic void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst,\n                                               const secp256k1_ecmult_gen_context *src, const secp256k1_callback* cb) {\n    if (src->prec == NULL) {\n        dst->prec = NULL;\n    } else {\n#ifndef USE_ECMULT_STATIC_PRECOMPUTATION\n        dst->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*dst->prec));\n        memcpy(dst->prec, src->prec, sizeof(*dst->prec));\n#else\n        (void)cb;\n        dst->prec = src->prec;\n#endif\n        dst->initial = src->initial;\n        dst->blind = src->blind;\n    }\n}\n\nstatic void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) {\n#ifndef USE_ECMULT_STATIC_PRECOMPUTATION\n    free(ctx->prec);\n#endif\n    secp256k1_scalar_clear(&ctx->blind);\n    secp256k1_gej_clear(&ctx->initial);\n    ctx->prec = NULL;\n}\n\nstatic void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp256k1_gej *r, const secp256k1_scalar *gn) {\n    secp256k1_ge add;\n    secp256k1_ge_storage adds;\n    secp256k1_scalar gnb;\n    int bits;\n    int i, j;\n    memset(&adds, 0, sizeof(adds));\n    *r = ctx->initial;\n    /* Blind scalar/point multiplication by computing (n-b)G + bG instead of nG. */\n    secp256k1_scalar_add(&gnb, gn, &ctx->blind);\n    add.infinity = 0;\n    for (j = 0; j < 64; j++) {\n        bits = secp256k1_scalar_get_bits(&gnb, j * 4, 4);\n        for (i = 0; i < 16; i++) {\n            /** This uses a conditional move to avoid any secret data in array indexes.\n             *   _Any_ use of secret indexes has been demonstrated to result in timing\n             *   sidechannels, even when the cache-line access patterns are uniform.\n             *  See also:\n             *   \"A word of warning\", CHES 2013 Rump Session, by Daniel J. Bernstein and Peter Schwabe\n             *    (https://cryptojedi.org/peter/data/chesrump-20130822.pdf) and\n             *   \"Cache Attacks and Countermeasures: the Case of AES\", RSA 2006,\n             *    by Dag Arne Osvik, Adi Shamir, and Eran Tromer\n             *    (http://www.tau.ac.il/~tromer/papers/cache.pdf)\n             */\n            secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits);\n        }\n        secp256k1_ge_from_storage(&add, &adds);\n        secp256k1_gej_add_ge(r, r, &add);\n    }\n    bits = 0;\n    secp256k1_ge_clear(&add);\n    secp256k1_scalar_clear(&gnb);\n}\n\n/* Setup blinding values for secp256k1_ecmult_gen. */\nstatic void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32) {\n    secp256k1_scalar b;\n    secp256k1_gej gb;\n    secp256k1_fe s;\n    unsigned char nonce32[32];\n    secp256k1_rfc6979_hmac_sha256_t rng;\n    int retry;\n    unsigned char keydata[64] = {0};\n    if (seed32 == NULL) {\n        /* When seed is NULL, reset the initial point and blinding value. */\n        secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g);\n        secp256k1_gej_neg(&ctx->initial, &ctx->initial);\n        secp256k1_scalar_set_int(&ctx->blind, 1);\n    }\n    /* The prior blinding value (if not reset) is chained forward by including it in the hash. */\n    secp256k1_scalar_get_b32(nonce32, &ctx->blind);\n    /** Using a CSPRNG allows a failure free interface, avoids needing large amounts of random data,\n     *   and guards against weak or adversarial seeds.  This is a simpler and safer interface than\n     *   asking the caller for blinding values directly and expecting them to retry on failure.\n     */\n    memcpy(keydata, nonce32, 32);\n    if (seed32 != NULL) {\n        memcpy(keydata + 32, seed32, 32);\n    }\n    secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, seed32 ? 64 : 32);\n    memset(keydata, 0, sizeof(keydata));\n    /* Retry for out of range results to achieve uniformity. */\n    do {\n        secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);\n        retry = !secp256k1_fe_set_b32(&s, nonce32);\n        retry |= secp256k1_fe_is_zero(&s);\n    } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > Fp. */\n    /* Randomize the projection to defend against multiplier sidechannels. */\n    secp256k1_gej_rescale(&ctx->initial, &s);\n    secp256k1_fe_clear(&s);\n    do {\n        secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);\n        secp256k1_scalar_set_b32(&b, nonce32, &retry);\n        /* A blinding value of 0 works, but would undermine the projection hardening. */\n        retry |= secp256k1_scalar_is_zero(&b);\n    } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > order. */\n    secp256k1_rfc6979_hmac_sha256_finalize(&rng);\n    memset(nonce32, 0, 32);\n    secp256k1_ecmult_gen(ctx, &gb, &b);\n    secp256k1_scalar_negate(&b, &b);\n    ctx->blind = b;\n    ctx->initial = gb;\n    secp256k1_scalar_clear(&b);\n    secp256k1_gej_clear(&gb);\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/ecmult_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_ECMULT_IMPL_H_\n#define _SECP256K1_ECMULT_IMPL_H_\n\n#include <string.h>\n\n#include \"group.h\"\n#include \"scalar.h\"\n#include \"ecmult.h\"\n\n#if defined(EXHAUSTIVE_TEST_ORDER)\n/* We need to lower these values for exhaustive tests because\n * the tables cannot have infinities in them (this breaks the\n * affine-isomorphism stuff which tracks z-ratios) */\n#  if EXHAUSTIVE_TEST_ORDER > 128\n#    define WINDOW_A 5\n#    define WINDOW_G 8\n#  elif EXHAUSTIVE_TEST_ORDER > 8\n#    define WINDOW_A 4\n#    define WINDOW_G 4\n#  else\n#    define WINDOW_A 2\n#    define WINDOW_G 2\n#  endif\n#else\n/* optimal for 128-bit and 256-bit exponents. */\n#define WINDOW_A 5\n/** larger numbers may result in slightly better performance, at the cost of\n    exponentially larger precomputed tables. */\n#ifdef USE_ENDOMORPHISM\n/** Two tables for window size 15: 1.375 MiB. */\n#define WINDOW_G 15\n#else\n/** One table for window size 16: 1.375 MiB. */\n#define WINDOW_G 16\n#endif\n#endif\n\n/** The number of entries a table with precomputed multiples needs to have. */\n#define ECMULT_TABLE_SIZE(w) (1 << ((w)-2))\n\n/** Fill a table 'prej' with precomputed odd multiples of a. Prej will contain\n *  the values [1*a,3*a,...,(2*n-1)*a], so it space for n values. zr[0] will\n *  contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z.\n *  Prej's Z values are undefined, except for the last value.\n */\nstatic void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, secp256k1_fe *zr, const secp256k1_gej *a) {\n    secp256k1_gej d;\n    secp256k1_ge a_ge, d_ge;\n    int i;\n\n    VERIFY_CHECK(!a->infinity);\n\n    secp256k1_gej_double_var(&d, a, NULL);\n\n    /*\n     * Perform the additions on an isomorphism where 'd' is affine: drop the z coordinate\n     * of 'd', and scale the 1P starting value's x/y coordinates without changing its z.\n     */\n    d_ge.x = d.x;\n    d_ge.y = d.y;\n    d_ge.infinity = 0;\n\n    secp256k1_ge_set_gej_zinv(&a_ge, a, &d.z);\n    prej[0].x = a_ge.x;\n    prej[0].y = a_ge.y;\n    prej[0].z = a->z;\n    prej[0].infinity = 0;\n\n    zr[0] = d.z;\n    for (i = 1; i < n; i++) {\n        secp256k1_gej_add_ge_var(&prej[i], &prej[i-1], &d_ge, &zr[i]);\n    }\n\n    /*\n     * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only\n     * the final point's z coordinate is actually used though, so just update that.\n     */\n    secp256k1_fe_mul(&prej[n-1].z, &prej[n-1].z, &d.z);\n}\n\n/** Fill a table 'pre' with precomputed odd multiples of a.\n *\n *  There are two versions of this function:\n *  - secp256k1_ecmult_odd_multiples_table_globalz_windowa which brings its\n *    resulting point set to a single constant Z denominator, stores the X and Y\n *    coordinates as ge_storage points in pre, and stores the global Z in rz.\n *    It only operates on tables sized for WINDOW_A wnaf multiples.\n *  - secp256k1_ecmult_odd_multiples_table_storage_var, which converts its\n *    resulting point set to actually affine points, and stores those in pre.\n *    It operates on tables of any size, but uses heap-allocated temporaries.\n *\n *  To compute a*P + b*G, we compute a table for P using the first function,\n *  and for G using the second (which requires an inverse, but it only needs to\n *  happen once).\n */\nstatic void secp256k1_ecmult_odd_multiples_table_globalz_windowa(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) {\n    secp256k1_gej prej[ECMULT_TABLE_SIZE(WINDOW_A)];\n    secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)];\n\n    /* Compute the odd multiples in Jacobian form. */\n    secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), prej, zr, a);\n    /* Bring them to the same Z denominator. */\n    secp256k1_ge_globalz_set_table_gej(ECMULT_TABLE_SIZE(WINDOW_A), pre, globalz, prej, zr);\n}\n\nstatic void secp256k1_ecmult_odd_multiples_table_storage_var(int n, secp256k1_ge_storage *pre, const secp256k1_gej *a, const secp256k1_callback *cb) {\n    secp256k1_gej *prej = (secp256k1_gej*)checked_malloc(cb, sizeof(secp256k1_gej) * n);\n    secp256k1_ge *prea = (secp256k1_ge*)checked_malloc(cb, sizeof(secp256k1_ge) * n);\n    secp256k1_fe *zr = (secp256k1_fe*)checked_malloc(cb, sizeof(secp256k1_fe) * n);\n    int i;\n\n    /* Compute the odd multiples in Jacobian form. */\n    secp256k1_ecmult_odd_multiples_table(n, prej, zr, a);\n    /* Convert them in batch to affine coordinates. */\n    secp256k1_ge_set_table_gej_var(prea, prej, zr, n);\n    /* Convert them to compact storage form. */\n    for (i = 0; i < n; i++) {\n        secp256k1_ge_to_storage(&pre[i], &prea[i]);\n    }\n\n    free(prea);\n    free(prej);\n    free(zr);\n}\n\n/** The following two macro retrieves a particular odd multiple from a table\n *  of precomputed multiples. */\n#define ECMULT_TABLE_GET_GE(r,pre,n,w) do { \\\n    VERIFY_CHECK(((n) & 1) == 1); \\\n    VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \\\n    VERIFY_CHECK((n) <=  ((1 << ((w)-1)) - 1)); \\\n    if ((n) > 0) { \\\n        *(r) = (pre)[((n)-1)/2]; \\\n    } else { \\\n        secp256k1_ge_neg((r), &(pre)[(-(n)-1)/2]); \\\n    } \\\n} while(0)\n\n#define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \\\n    VERIFY_CHECK(((n) & 1) == 1); \\\n    VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \\\n    VERIFY_CHECK((n) <=  ((1 << ((w)-1)) - 1)); \\\n    if ((n) > 0) { \\\n        secp256k1_ge_from_storage((r), &(pre)[((n)-1)/2]); \\\n    } else { \\\n        secp256k1_ge_from_storage((r), &(pre)[(-(n)-1)/2]); \\\n        secp256k1_ge_neg((r), (r)); \\\n    } \\\n} while(0)\n\nstatic void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx) {\n    ctx->pre_g = NULL;\n#ifdef USE_ENDOMORPHISM\n    ctx->pre_g_128 = NULL;\n#endif\n}\n\nstatic void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb) {\n    secp256k1_gej gj;\n\n    if (ctx->pre_g != NULL) {\n        return;\n    }\n\n    /* get the generator */\n    secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);\n\n    ctx->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G));\n\n    /* precompute the tables with odd multiples */\n    secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj, cb);\n\n#ifdef USE_ENDOMORPHISM\n    {\n        secp256k1_gej g_128j;\n        int i;\n\n        ctx->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G));\n\n        /* calculate 2^128*generator */\n        g_128j = gj;\n        for (i = 0; i < 128; i++) {\n            secp256k1_gej_double_var(&g_128j, &g_128j, NULL);\n        }\n        secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g_128, &g_128j, cb);\n    }\n#endif\n}\n\nstatic void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst,\n                                           const secp256k1_ecmult_context *src, const secp256k1_callback *cb) {\n    if (src->pre_g == NULL) {\n        dst->pre_g = NULL;\n    } else {\n        size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G);\n        dst->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, size);\n        memcpy(dst->pre_g, src->pre_g, size);\n    }\n#ifdef USE_ENDOMORPHISM\n    if (src->pre_g_128 == NULL) {\n        dst->pre_g_128 = NULL;\n    } else {\n        size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G);\n        dst->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, size);\n        memcpy(dst->pre_g_128, src->pre_g_128, size);\n    }\n#endif\n}\n\nstatic int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx) {\n    return ctx->pre_g != NULL;\n}\n\nstatic void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) {\n    free(ctx->pre_g);\n#ifdef USE_ENDOMORPHISM\n    free(ctx->pre_g_128);\n#endif\n    secp256k1_ecmult_context_init(ctx);\n}\n\n/** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits),\n *  with the following guarantees:\n *  - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1)\n *  - two non-zero entries in wnaf are separated by at least w-1 zeroes.\n *  - the number of set values in wnaf is returned. This number is at most 256, and at most one more\n *    than the number of bits in the (absolute value) of the input.\n */\nstatic int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w) {\n    secp256k1_scalar s = *a;\n    int last_set_bit = -1;\n    int bit = 0;\n    int sign = 1;\n    int carry = 0;\n\n    VERIFY_CHECK(wnaf != NULL);\n    VERIFY_CHECK(0 <= len && len <= 256);\n    VERIFY_CHECK(a != NULL);\n    VERIFY_CHECK(2 <= w && w <= 31);\n\n    memset(wnaf, 0, len * sizeof(wnaf[0]));\n\n    if (secp256k1_scalar_get_bits(&s, 255, 1)) {\n        secp256k1_scalar_negate(&s, &s);\n        sign = -1;\n    }\n\n    while (bit < len) {\n        int now;\n        int word;\n        if (secp256k1_scalar_get_bits(&s, bit, 1) == (unsigned int)carry) {\n            bit++;\n            continue;\n        }\n\n        now = w;\n        if (now > len - bit) {\n            now = len - bit;\n        }\n\n        word = secp256k1_scalar_get_bits_var(&s, bit, now) + carry;\n\n        carry = (word >> (w-1)) & 1;\n        word -= carry << w;\n\n        wnaf[bit] = sign * word;\n        last_set_bit = bit;\n\n        bit += now;\n    }\n#ifdef VERIFY\n    CHECK(carry == 0);\n    while (bit < 256) {\n        CHECK(secp256k1_scalar_get_bits(&s, bit++, 1) == 0);\n    } \n#endif\n    return last_set_bit + 1;\n}\n\nstatic void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng) {\n    secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)];\n    secp256k1_ge tmpa;\n    secp256k1_fe Z;\n#ifdef USE_ENDOMORPHISM\n    secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)];\n    secp256k1_scalar na_1, na_lam;\n    /* Splitted G factors. */\n    secp256k1_scalar ng_1, ng_128;\n    int wnaf_na_1[130];\n    int wnaf_na_lam[130];\n    int bits_na_1;\n    int bits_na_lam;\n    int wnaf_ng_1[129];\n    int bits_ng_1;\n    int wnaf_ng_128[129];\n    int bits_ng_128;\n#else\n    int wnaf_na[256];\n    int bits_na;\n    int wnaf_ng[256];\n    int bits_ng;\n#endif\n    int i;\n    int bits;\n\n#ifdef USE_ENDOMORPHISM\n    /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */\n    secp256k1_scalar_split_lambda(&na_1, &na_lam, na);\n\n    /* build wnaf representation for na_1 and na_lam. */\n    bits_na_1   = secp256k1_ecmult_wnaf(wnaf_na_1,   130, &na_1,   WINDOW_A);\n    bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, 130, &na_lam, WINDOW_A);\n    VERIFY_CHECK(bits_na_1 <= 130);\n    VERIFY_CHECK(bits_na_lam <= 130);\n    bits = bits_na_1;\n    if (bits_na_lam > bits) {\n        bits = bits_na_lam;\n    }\n#else\n    /* build wnaf representation for na. */\n    bits_na     = secp256k1_ecmult_wnaf(wnaf_na,     256, na,      WINDOW_A);\n    bits = bits_na;\n#endif\n\n    /* Calculate odd multiples of a.\n     * All multiples are brought to the same Z 'denominator', which is stored\n     * in Z. Due to secp256k1' isomorphism we can do all operations pretending\n     * that the Z coordinate was 1, use affine addition formulae, and correct\n     * the Z coordinate of the result once at the end.\n     * The exception is the precomputed G table points, which are actually\n     * affine. Compared to the base used for other points, they have a Z ratio\n     * of 1/Z, so we can use secp256k1_gej_add_zinv_var, which uses the same\n     * isomorphism to efficiently add with a known Z inverse.\n     */\n    secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, a);\n\n#ifdef USE_ENDOMORPHISM\n    for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {\n        secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]);\n    }\n\n    /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */\n    secp256k1_scalar_split_128(&ng_1, &ng_128, ng);\n\n    /* Build wnaf representation for ng_1 and ng_128 */\n    bits_ng_1   = secp256k1_ecmult_wnaf(wnaf_ng_1,   129, &ng_1,   WINDOW_G);\n    bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, 129, &ng_128, WINDOW_G);\n    if (bits_ng_1 > bits) {\n        bits = bits_ng_1;\n    }\n    if (bits_ng_128 > bits) {\n        bits = bits_ng_128;\n    }\n#else\n    bits_ng     = secp256k1_ecmult_wnaf(wnaf_ng,     256, ng,      WINDOW_G);\n    if (bits_ng > bits) {\n        bits = bits_ng;\n    }\n#endif\n\n    secp256k1_gej_set_infinity(r);\n\n    for (i = bits - 1; i >= 0; i--) {\n        int n;\n        secp256k1_gej_double_var(r, r, NULL);\n#ifdef USE_ENDOMORPHISM\n        if (i < bits_na_1 && (n = wnaf_na_1[i])) {\n            ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A);\n            secp256k1_gej_add_ge_var(r, r, &tmpa, NULL);\n        }\n        if (i < bits_na_lam && (n = wnaf_na_lam[i])) {\n            ECMULT_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A);\n            secp256k1_gej_add_ge_var(r, r, &tmpa, NULL);\n        }\n        if (i < bits_ng_1 && (n = wnaf_ng_1[i])) {\n            ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G);\n            secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z);\n        }\n        if (i < bits_ng_128 && (n = wnaf_ng_128[i])) {\n            ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G);\n            secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z);\n        }\n#else\n        if (i < bits_na && (n = wnaf_na[i])) {\n            ECMULT_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A);\n            secp256k1_gej_add_ge_var(r, r, &tmpa, NULL);\n        }\n        if (i < bits_ng && (n = wnaf_ng[i])) {\n            ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G);\n            secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z);\n        }\n#endif\n    }\n\n    if (!r->infinity) {\n        secp256k1_fe_mul(&r->z, &r->z, &Z);\n    }\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_FIELD_\n#define _SECP256K1_FIELD_\n\n/** Field element module.\n *\n *  Field elements can be represented in several ways, but code accessing\n *  it (and implementations) need to take certain properties into account:\n *  - Each field element can be normalized or not.\n *  - Each field element has a magnitude, which represents how far away\n *    its representation is away from normalization. Normalized elements\n *    always have a magnitude of 1, but a magnitude of 1 doesn't imply\n *    normality.\n */\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#if defined(USE_FIELD_10X26)\n#include \"field_10x26.h\"\n#elif defined(USE_FIELD_5X52)\n#include \"field_5x52.h\"\n#else\n#error \"Please select field implementation\"\n#endif\n\n#include \"util.h\"\n\n/** Normalize a field element. */\nstatic void secp256k1_fe_normalize(secp256k1_fe *r);\n\n/** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */\nstatic void secp256k1_fe_normalize_weak(secp256k1_fe *r);\n\n/** Normalize a field element, without constant-time guarantee. */\nstatic void secp256k1_fe_normalize_var(secp256k1_fe *r);\n\n/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field\n *  implementation may optionally normalize the input, but this should not be relied upon. */\nstatic int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r);\n\n/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field\n *  implementation may optionally normalize the input, but this should not be relied upon. */\nstatic int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r);\n\n/** Set a field element equal to a small integer. Resulting field element is normalized. */\nstatic void secp256k1_fe_set_int(secp256k1_fe *r, int a);\n\n/** Sets a field element equal to zero, initializing all fields. */\nstatic void secp256k1_fe_clear(secp256k1_fe *a);\n\n/** Verify whether a field element is zero. Requires the input to be normalized. */\nstatic int secp256k1_fe_is_zero(const secp256k1_fe *a);\n\n/** Check the \"oddness\" of a field element. Requires the input to be normalized. */\nstatic int secp256k1_fe_is_odd(const secp256k1_fe *a);\n\n/** Compare two field elements. Requires magnitude-1 inputs. */\nstatic int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b);\n\n/** Same as secp256k1_fe_equal, but may be variable time. */\nstatic int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b);\n\n/** Compare two field elements. Requires both inputs to be normalized */\nstatic int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b);\n\n/** Set a field element equal to 32-byte big endian value. If successful, the resulting field element is normalized. */\nstatic int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a);\n\n/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */\nstatic void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a);\n\n/** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input\n *  as an argument. The magnitude of the output is one higher. */\nstatic void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m);\n\n/** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that\n *  small integer. */\nstatic void secp256k1_fe_mul_int(secp256k1_fe *r, int a);\n\n/** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */\nstatic void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a);\n\n/** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8.\n *  The output magnitude is 1 (but not guaranteed to be normalized). */\nstatic void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b);\n\n/** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8.\n *  The output magnitude is 1 (but not guaranteed to be normalized). */\nstatic void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a);\n\n/** If a has a square root, it is computed in r and 1 is returned. If a does not\n *  have a square root, the root of its negation is computed and 0 is returned.\n *  The input's magnitude can be at most 8. The output magnitude is 1 (but not\n *  guaranteed to be normalized). The result in r will always be a square\n *  itself. */\nstatic int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a);\n\n/** Checks whether a field element is a quadratic residue. */\nstatic int secp256k1_fe_is_quad_var(const secp256k1_fe *a);\n\n/** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be\n *  at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */\nstatic void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a);\n\n/** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */\nstatic void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a);\n\n/** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be\n *  at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and\n *  outputs must not overlap in memory. */\nstatic void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len);\n\n/** Convert a field element to the storage type. */\nstatic void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a);\n\n/** Convert a field element back from the storage type. */\nstatic void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a);\n\n/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */\nstatic void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag);\n\n/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */\nstatic void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field_10x26.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_FIELD_REPR_\n#define _SECP256K1_FIELD_REPR_\n\n#include <stdint.h>\n\ntypedef struct {\n    /* X = sum(i=0..9, elem[i]*2^26) mod n */\n    uint32_t n[10];\n#ifdef VERIFY\n    int magnitude;\n    int normalized;\n#endif\n} secp256k1_fe;\n\n/* Unpacks a constant into a overlapping multi-limbed FE element. */\n#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \\\n    (d0) & 0x3FFFFFFUL, \\\n    (((uint32_t)d0) >> 26) | (((uint32_t)(d1) & 0xFFFFFUL) << 6), \\\n    (((uint32_t)d1) >> 20) | (((uint32_t)(d2) & 0x3FFFUL) << 12), \\\n    (((uint32_t)d2) >> 14) | (((uint32_t)(d3) & 0xFFUL) << 18), \\\n    (((uint32_t)d3) >> 8) | (((uint32_t)(d4) & 0x3UL) << 24), \\\n    (((uint32_t)d4) >> 2) & 0x3FFFFFFUL, \\\n    (((uint32_t)d4) >> 28) | (((uint32_t)(d5) & 0x3FFFFFUL) << 4), \\\n    (((uint32_t)d5) >> 22) | (((uint32_t)(d6) & 0xFFFFUL) << 10), \\\n    (((uint32_t)d6) >> 16) | (((uint32_t)(d7) & 0x3FFUL) << 16), \\\n    (((uint32_t)d7) >> 10) \\\n}\n\n#ifdef VERIFY\n#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1}\n#else\n#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))}\n#endif\n\ntypedef struct {\n    uint32_t n[8];\n} secp256k1_fe_storage;\n\n#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }}\n#define SECP256K1_FE_STORAGE_CONST_GET(d) d.n[7], d.n[6], d.n[5], d.n[4],d.n[3], d.n[2], d.n[1], d.n[0]\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field_10x26_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_FIELD_REPR_IMPL_H_\n#define _SECP256K1_FIELD_REPR_IMPL_H_\n\n#include \"util.h\"\n#include \"num.h\"\n#include \"field.h\"\n\n#ifdef VERIFY\nstatic void secp256k1_fe_verify(const secp256k1_fe *a) {\n    const uint32_t *d = a->n;\n    int m = a->normalized ? 1 : 2 * a->magnitude, r = 1;\n    r &= (d[0] <= 0x3FFFFFFUL * m);\n    r &= (d[1] <= 0x3FFFFFFUL * m);\n    r &= (d[2] <= 0x3FFFFFFUL * m);\n    r &= (d[3] <= 0x3FFFFFFUL * m);\n    r &= (d[4] <= 0x3FFFFFFUL * m);\n    r &= (d[5] <= 0x3FFFFFFUL * m);\n    r &= (d[6] <= 0x3FFFFFFUL * m);\n    r &= (d[7] <= 0x3FFFFFFUL * m);\n    r &= (d[8] <= 0x3FFFFFFUL * m);\n    r &= (d[9] <= 0x03FFFFFUL * m);\n    r &= (a->magnitude >= 0);\n    r &= (a->magnitude <= 32);\n    if (a->normalized) {\n        r &= (a->magnitude <= 1);\n        if (r && (d[9] == 0x03FFFFFUL)) {\n            uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2];\n            if (mid == 0x3FFFFFFUL) {\n                r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL);\n            }\n        }\n    }\n    VERIFY_CHECK(r == 1);\n}\n#endif\n\nstatic void secp256k1_fe_normalize(secp256k1_fe *r) {\n    uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4],\n             t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9];\n\n    /* Reduce t9 at the start so there will be at most a single carry from the first pass */\n    uint32_t m;\n    uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x3D1UL; t1 += (x << 6);\n    t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL;\n    t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL;\n    t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2;\n    t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3;\n    t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4;\n    t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5;\n    t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6;\n    t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7;\n    t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8;\n\n    /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t9 >> 23 == 0);\n\n    /* At most a single final reduction is needed; check if the value is >= the field characteristic */\n    x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL)\n        & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL));\n\n    /* Apply the final reduction (for constant-time behaviour, we do it always) */\n    t0 += x * 0x3D1UL; t1 += (x << 6);\n    t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL;\n    t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL;\n    t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL;\n    t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL;\n    t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL;\n    t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL;\n    t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL;\n    t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL;\n    t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL;\n\n    /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */\n    VERIFY_CHECK(t9 >> 22 == x);\n\n    /* Mask off the possible multiple of 2^256 from the final reduction */\n    t9 &= 0x03FFFFFUL;\n\n    r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;\n    r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9;\n\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic void secp256k1_fe_normalize_weak(secp256k1_fe *r) {\n    uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4],\n             t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9];\n\n    /* Reduce t9 at the start so there will be at most a single carry from the first pass */\n    uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x3D1UL; t1 += (x << 6);\n    t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL;\n    t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL;\n    t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL;\n    t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL;\n    t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL;\n    t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL;\n    t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL;\n    t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL;\n    t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL;\n\n    /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t9 >> 23 == 0);\n\n    r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;\n    r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9;\n\n#ifdef VERIFY\n    r->magnitude = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic void secp256k1_fe_normalize_var(secp256k1_fe *r) {\n    uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4],\n             t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9];\n\n    /* Reduce t9 at the start so there will be at most a single carry from the first pass */\n    uint32_t m;\n    uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x3D1UL; t1 += (x << 6);\n    t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL;\n    t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL;\n    t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2;\n    t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3;\n    t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4;\n    t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5;\n    t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6;\n    t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7;\n    t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8;\n\n    /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t9 >> 23 == 0);\n\n    /* At most a single final reduction is needed; check if the value is >= the field characteristic */\n    x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL)\n        & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL));\n\n    if (x) {\n        t0 += 0x3D1UL; t1 += (x << 6);\n        t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL;\n        t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL;\n        t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL;\n        t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL;\n        t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL;\n        t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL;\n        t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL;\n        t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL;\n        t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL;\n\n        /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */\n        VERIFY_CHECK(t9 >> 22 == x);\n\n        /* Mask off the possible multiple of 2^256 from the final reduction */\n        t9 &= 0x03FFFFFUL;\n    }\n\n    r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;\n    r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9;\n\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) {\n    uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4],\n             t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9];\n\n    /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */\n    uint32_t z0, z1;\n\n    /* Reduce t9 at the start so there will be at most a single carry from the first pass */\n    uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x3D1UL; t1 += (x << 6);\n    t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; z0  = t0; z1  = t0 ^ 0x3D0UL;\n    t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL;\n    t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2;\n    t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3;\n    t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4;\n    t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5;\n    t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6;\n    t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7;\n    t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8;\n                                         z0 |= t9; z1 &= t9 ^ 0x3C00000UL;\n\n    /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t9 >> 23 == 0);\n\n    return (z0 == 0) | (z1 == 0x3FFFFFFUL);\n}\n\nstatic int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) {\n    uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;\n    uint32_t z0, z1;\n    uint32_t x;\n\n    t0 = r->n[0];\n    t9 = r->n[9];\n\n    /* Reduce t9 at the start so there will be at most a single carry from the first pass */\n    x = t9 >> 22;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x3D1UL;\n\n    /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */\n    z0 = t0 & 0x3FFFFFFUL;\n    z1 = z0 ^ 0x3D0UL;\n\n    /* Fast return path should catch the majority of cases */\n    if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL)) {\n        return 0;\n    }\n\n    t1 = r->n[1];\n    t2 = r->n[2];\n    t3 = r->n[3];\n    t4 = r->n[4];\n    t5 = r->n[5];\n    t6 = r->n[6];\n    t7 = r->n[7];\n    t8 = r->n[8];\n\n    t9 &= 0x03FFFFFUL;\n    t1 += (x << 6);\n\n    t1 += (t0 >> 26);\n    t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL;\n    t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2;\n    t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3;\n    t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4;\n    t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5;\n    t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6;\n    t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7;\n    t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8;\n                                         z0 |= t9; z1 &= t9 ^ 0x3C00000UL;\n\n    /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t9 >> 23 == 0);\n\n    return (z0 == 0) | (z1 == 0x3FFFFFFUL);\n}\n\nSECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) {\n    r->n[0] = a;\n    r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0;\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nSECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) {\n    const uint32_t *t = a->n;\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    secp256k1_fe_verify(a);\n#endif\n    return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0;\n}\n\nSECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    secp256k1_fe_verify(a);\n#endif\n    return a->n[0] & 1;\n}\n\nSECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) {\n    int i;\n#ifdef VERIFY\n    a->magnitude = 0;\n    a->normalized = 1;\n#endif\n    for (i=0; i<10; i++) {\n        a->n[i] = 0;\n    }\n}\n\nstatic int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) {\n    int i;\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    VERIFY_CHECK(b->normalized);\n    secp256k1_fe_verify(a);\n    secp256k1_fe_verify(b);\n#endif\n    for (i = 9; i >= 0; i--) {\n        if (a->n[i] > b->n[i]) {\n            return 1;\n        }\n        if (a->n[i] < b->n[i]) {\n            return -1;\n        }\n    }\n    return 0;\n}\n\nstatic int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) {\n    int i;\n    r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0;\n    r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0;\n    for (i=0; i<32; i++) {\n        int j;\n        for (j=0; j<4; j++) {\n            int limb = (8*i+2*j)/26;\n            int shift = (8*i+2*j)%26;\n            r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift;\n        }\n    }\n    if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) {\n        return 0;\n    }\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n    return 1;\n}\n\n/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */\nstatic void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) {\n    int i;\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    secp256k1_fe_verify(a);\n#endif\n    for (i=0; i<32; i++) {\n        int j;\n        int c = 0;\n        for (j=0; j<4; j++) {\n            int limb = (8*i+2*j)/26;\n            int shift = (8*i+2*j)%26;\n            c |= ((a->n[limb] >> shift) & 0x3) << (2 * j);\n        }\n        r[31-i] = c;\n    }\n}\n\nSECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->magnitude <= m);\n    secp256k1_fe_verify(a);\n#endif\n    r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->n[0];\n    r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->n[1];\n    r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[2];\n    r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[3];\n    r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[4];\n    r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[5];\n    r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[6];\n    r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[7];\n    r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[8];\n    r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->n[9];\n#ifdef VERIFY\n    r->magnitude = m + 1;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nSECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) {\n    r->n[0] *= a;\n    r->n[1] *= a;\n    r->n[2] *= a;\n    r->n[3] *= a;\n    r->n[4] *= a;\n    r->n[5] *= a;\n    r->n[6] *= a;\n    r->n[7] *= a;\n    r->n[8] *= a;\n    r->n[9] *= a;\n#ifdef VERIFY\n    r->magnitude *= a;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nSECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) {\n#ifdef VERIFY\n    secp256k1_fe_verify(a);\n#endif\n    r->n[0] += a->n[0];\n    r->n[1] += a->n[1];\n    r->n[2] += a->n[2];\n    r->n[3] += a->n[3];\n    r->n[4] += a->n[4];\n    r->n[5] += a->n[5];\n    r->n[6] += a->n[6];\n    r->n[7] += a->n[7];\n    r->n[8] += a->n[8];\n    r->n[9] += a->n[9];\n#ifdef VERIFY\n    r->magnitude += a->magnitude;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\n#if defined(USE_EXTERNAL_ASM)\n\n/* External assembler implementation */\nvoid secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b);\nvoid secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a);\n\n#else\n\n#ifdef VERIFY\n#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0)\n#else\n#define VERIFY_BITS(x, n) do { } while(0)\n#endif\n\nSECP256K1_INLINE static void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b) {\n    uint64_t c, d;\n    uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8;\n    uint32_t t9, t1, t0, t2, t3, t4, t5, t6, t7;\n    const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL;\n\n    VERIFY_BITS(a[0], 30);\n    VERIFY_BITS(a[1], 30);\n    VERIFY_BITS(a[2], 30);\n    VERIFY_BITS(a[3], 30);\n    VERIFY_BITS(a[4], 30);\n    VERIFY_BITS(a[5], 30);\n    VERIFY_BITS(a[6], 30);\n    VERIFY_BITS(a[7], 30);\n    VERIFY_BITS(a[8], 30);\n    VERIFY_BITS(a[9], 26);\n    VERIFY_BITS(b[0], 30);\n    VERIFY_BITS(b[1], 30);\n    VERIFY_BITS(b[2], 30);\n    VERIFY_BITS(b[3], 30);\n    VERIFY_BITS(b[4], 30);\n    VERIFY_BITS(b[5], 30);\n    VERIFY_BITS(b[6], 30);\n    VERIFY_BITS(b[7], 30);\n    VERIFY_BITS(b[8], 30);\n    VERIFY_BITS(b[9], 26);\n\n    /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n.\n     *  px is a shorthand for sum(a[i]*b[x-i], i=0..x).\n     *  Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0].\n     */\n\n    d  = (uint64_t)a[0] * b[9]\n       + (uint64_t)a[1] * b[8]\n       + (uint64_t)a[2] * b[7]\n       + (uint64_t)a[3] * b[6]\n       + (uint64_t)a[4] * b[5]\n       + (uint64_t)a[5] * b[4]\n       + (uint64_t)a[6] * b[3]\n       + (uint64_t)a[7] * b[2]\n       + (uint64_t)a[8] * b[1]\n       + (uint64_t)a[9] * b[0];\n    /* VERIFY_BITS(d, 64); */\n    /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */\n    t9 = d & M; d >>= 26;\n    VERIFY_BITS(t9, 26);\n    VERIFY_BITS(d, 38);\n    /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */\n\n    c  = (uint64_t)a[0] * b[0];\n    VERIFY_BITS(c, 60);\n    /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */\n    d += (uint64_t)a[1] * b[9]\n       + (uint64_t)a[2] * b[8]\n       + (uint64_t)a[3] * b[7]\n       + (uint64_t)a[4] * b[6]\n       + (uint64_t)a[5] * b[5]\n       + (uint64_t)a[6] * b[4]\n       + (uint64_t)a[7] * b[3]\n       + (uint64_t)a[8] * b[2]\n       + (uint64_t)a[9] * b[1];\n    VERIFY_BITS(d, 63);\n    /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n    u0 = d & M; d >>= 26; c += u0 * R0;\n    VERIFY_BITS(u0, 26);\n    VERIFY_BITS(d, 37);\n    VERIFY_BITS(c, 61);\n    /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n    t0 = c & M; c >>= 26; c += u0 * R1;\n    VERIFY_BITS(t0, 26);\n    VERIFY_BITS(c, 37);\n    /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n    /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n\n    c += (uint64_t)a[0] * b[1]\n       + (uint64_t)a[1] * b[0];\n    VERIFY_BITS(c, 62);\n    /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    d += (uint64_t)a[2] * b[9]\n       + (uint64_t)a[3] * b[8]\n       + (uint64_t)a[4] * b[7]\n       + (uint64_t)a[5] * b[6]\n       + (uint64_t)a[6] * b[5]\n       + (uint64_t)a[7] * b[4]\n       + (uint64_t)a[8] * b[3]\n       + (uint64_t)a[9] * b[2];\n    VERIFY_BITS(d, 63);\n    /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    u1 = d & M; d >>= 26; c += u1 * R0;\n    VERIFY_BITS(u1, 26);\n    VERIFY_BITS(d, 37);\n    VERIFY_BITS(c, 63);\n    /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    t1 = c & M; c >>= 26; c += u1 * R1;\n    VERIFY_BITS(t1, 26);\n    VERIFY_BITS(c, 38);\n    /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n\n    c += (uint64_t)a[0] * b[2]\n       + (uint64_t)a[1] * b[1]\n       + (uint64_t)a[2] * b[0];\n    VERIFY_BITS(c, 62);\n    /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    d += (uint64_t)a[3] * b[9]\n       + (uint64_t)a[4] * b[8]\n       + (uint64_t)a[5] * b[7]\n       + (uint64_t)a[6] * b[6]\n       + (uint64_t)a[7] * b[5]\n       + (uint64_t)a[8] * b[4]\n       + (uint64_t)a[9] * b[3];\n    VERIFY_BITS(d, 63);\n    /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    u2 = d & M; d >>= 26; c += u2 * R0;\n    VERIFY_BITS(u2, 26);\n    VERIFY_BITS(d, 37);\n    VERIFY_BITS(c, 63);\n    /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    t2 = c & M; c >>= 26; c += u2 * R1;\n    VERIFY_BITS(t2, 26);\n    VERIFY_BITS(c, 38);\n    /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n\n    c += (uint64_t)a[0] * b[3]\n       + (uint64_t)a[1] * b[2]\n       + (uint64_t)a[2] * b[1]\n       + (uint64_t)a[3] * b[0];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    d += (uint64_t)a[4] * b[9]\n       + (uint64_t)a[5] * b[8]\n       + (uint64_t)a[6] * b[7]\n       + (uint64_t)a[7] * b[6]\n       + (uint64_t)a[8] * b[5]\n       + (uint64_t)a[9] * b[4];\n    VERIFY_BITS(d, 63);\n    /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    u3 = d & M; d >>= 26; c += u3 * R0;\n    VERIFY_BITS(u3, 26);\n    VERIFY_BITS(d, 37);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    t3 = c & M; c >>= 26; c += u3 * R1;\n    VERIFY_BITS(t3, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n\n    c += (uint64_t)a[0] * b[4]\n       + (uint64_t)a[1] * b[3]\n       + (uint64_t)a[2] * b[2]\n       + (uint64_t)a[3] * b[1]\n       + (uint64_t)a[4] * b[0];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    d += (uint64_t)a[5] * b[9]\n       + (uint64_t)a[6] * b[8]\n       + (uint64_t)a[7] * b[7]\n       + (uint64_t)a[8] * b[6]\n       + (uint64_t)a[9] * b[5];\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    u4 = d & M; d >>= 26; c += u4 * R0;\n    VERIFY_BITS(u4, 26);\n    VERIFY_BITS(d, 36);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    t4 = c & M; c >>= 26; c += u4 * R1;\n    VERIFY_BITS(t4, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)a[0] * b[5]\n       + (uint64_t)a[1] * b[4]\n       + (uint64_t)a[2] * b[3]\n       + (uint64_t)a[3] * b[2]\n       + (uint64_t)a[4] * b[1]\n       + (uint64_t)a[5] * b[0];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)a[6] * b[9]\n       + (uint64_t)a[7] * b[8]\n       + (uint64_t)a[8] * b[7]\n       + (uint64_t)a[9] * b[6];\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    u5 = d & M; d >>= 26; c += u5 * R0;\n    VERIFY_BITS(u5, 26);\n    VERIFY_BITS(d, 36);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    t5 = c & M; c >>= 26; c += u5 * R1;\n    VERIFY_BITS(t5, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)a[0] * b[6]\n       + (uint64_t)a[1] * b[5]\n       + (uint64_t)a[2] * b[4]\n       + (uint64_t)a[3] * b[3]\n       + (uint64_t)a[4] * b[2]\n       + (uint64_t)a[5] * b[1]\n       + (uint64_t)a[6] * b[0];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)a[7] * b[9]\n       + (uint64_t)a[8] * b[8]\n       + (uint64_t)a[9] * b[7];\n    VERIFY_BITS(d, 61);\n    /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    u6 = d & M; d >>= 26; c += u6 * R0;\n    VERIFY_BITS(u6, 26);\n    VERIFY_BITS(d, 35);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    t6 = c & M; c >>= 26; c += u6 * R1;\n    VERIFY_BITS(t6, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)a[0] * b[7]\n       + (uint64_t)a[1] * b[6]\n       + (uint64_t)a[2] * b[5]\n       + (uint64_t)a[3] * b[4]\n       + (uint64_t)a[4] * b[3]\n       + (uint64_t)a[5] * b[2]\n       + (uint64_t)a[6] * b[1]\n       + (uint64_t)a[7] * b[0];\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x8000007C00000007ULL);\n    /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)a[8] * b[9]\n       + (uint64_t)a[9] * b[8];\n    VERIFY_BITS(d, 58);\n    /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    u7 = d & M; d >>= 26; c += u7 * R0;\n    VERIFY_BITS(u7, 26);\n    VERIFY_BITS(d, 32);\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL);\n    /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    t7 = c & M; c >>= 26; c += u7 * R1;\n    VERIFY_BITS(t7, 26);\n    VERIFY_BITS(c, 38);\n    /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)a[0] * b[8]\n       + (uint64_t)a[1] * b[7]\n       + (uint64_t)a[2] * b[6]\n       + (uint64_t)a[3] * b[5]\n       + (uint64_t)a[4] * b[4]\n       + (uint64_t)a[5] * b[3]\n       + (uint64_t)a[6] * b[2]\n       + (uint64_t)a[7] * b[1]\n       + (uint64_t)a[8] * b[0];\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x9000007B80000008ULL);\n    /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)a[9] * b[9];\n    VERIFY_BITS(d, 57);\n    /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    u8 = d & M; d >>= 26; c += u8 * R0;\n    VERIFY_BITS(u8, 26);\n    VERIFY_BITS(d, 31);\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    r[3] = t3;\n    VERIFY_BITS(r[3], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[4] = t4;\n    VERIFY_BITS(r[4], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[5] = t5;\n    VERIFY_BITS(r[5], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[6] = t6;\n    VERIFY_BITS(r[6], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[7] = t7;\n    VERIFY_BITS(r[7], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    r[8] = c & M; c >>= 26; c += u8 * R1;\n    VERIFY_BITS(r[8], 26);\n    VERIFY_BITS(c, 39);\n    /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    c   += d * R0 + t9;\n    VERIFY_BITS(c, 45);\n    /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4);\n    VERIFY_BITS(r[9], 22);\n    VERIFY_BITS(c, 46);\n    /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    d    = c * (R0 >> 4) + t0;\n    VERIFY_BITS(d, 56);\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[0] = d & M; d >>= 26;\n    VERIFY_BITS(r[0], 26);\n    VERIFY_BITS(d, 30);\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d   += c * (R1 >> 4) + t1;\n    VERIFY_BITS(d, 53);\n    VERIFY_CHECK(d <= 0x10000003FFFFBFULL);\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[1] = d & M; d >>= 26;\n    VERIFY_BITS(r[1], 26);\n    VERIFY_BITS(d, 27);\n    VERIFY_CHECK(d <= 0x4000000ULL);\n    /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d   += t2;\n    VERIFY_BITS(d, 27);\n    /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[2] = d;\n    VERIFY_BITS(r[2], 27);\n    /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n}\n\nSECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a) {\n    uint64_t c, d;\n    uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8;\n    uint32_t t9, t0, t1, t2, t3, t4, t5, t6, t7;\n    const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL;\n\n    VERIFY_BITS(a[0], 30);\n    VERIFY_BITS(a[1], 30);\n    VERIFY_BITS(a[2], 30);\n    VERIFY_BITS(a[3], 30);\n    VERIFY_BITS(a[4], 30);\n    VERIFY_BITS(a[5], 30);\n    VERIFY_BITS(a[6], 30);\n    VERIFY_BITS(a[7], 30);\n    VERIFY_BITS(a[8], 30);\n    VERIFY_BITS(a[9], 26);\n\n    /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n.\n     *  px is a shorthand for sum(a[i]*a[x-i], i=0..x).\n     *  Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0].\n     */\n\n    d  = (uint64_t)(a[0]*2) * a[9]\n       + (uint64_t)(a[1]*2) * a[8]\n       + (uint64_t)(a[2]*2) * a[7]\n       + (uint64_t)(a[3]*2) * a[6]\n       + (uint64_t)(a[4]*2) * a[5];\n    /* VERIFY_BITS(d, 64); */\n    /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */\n    t9 = d & M; d >>= 26;\n    VERIFY_BITS(t9, 26);\n    VERIFY_BITS(d, 38);\n    /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */\n\n    c  = (uint64_t)a[0] * a[0];\n    VERIFY_BITS(c, 60);\n    /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */\n    d += (uint64_t)(a[1]*2) * a[9]\n       + (uint64_t)(a[2]*2) * a[8]\n       + (uint64_t)(a[3]*2) * a[7]\n       + (uint64_t)(a[4]*2) * a[6]\n       + (uint64_t)a[5] * a[5];\n    VERIFY_BITS(d, 63);\n    /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n    u0 = d & M; d >>= 26; c += u0 * R0;\n    VERIFY_BITS(u0, 26);\n    VERIFY_BITS(d, 37);\n    VERIFY_BITS(c, 61);\n    /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n    t0 = c & M; c >>= 26; c += u0 * R1;\n    VERIFY_BITS(t0, 26);\n    VERIFY_BITS(c, 37);\n    /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n    /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[1];\n    VERIFY_BITS(c, 62);\n    /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    d += (uint64_t)(a[2]*2) * a[9]\n       + (uint64_t)(a[3]*2) * a[8]\n       + (uint64_t)(a[4]*2) * a[7]\n       + (uint64_t)(a[5]*2) * a[6];\n    VERIFY_BITS(d, 63);\n    /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    u1 = d & M; d >>= 26; c += u1 * R0;\n    VERIFY_BITS(u1, 26);\n    VERIFY_BITS(d, 37);\n    VERIFY_BITS(c, 63);\n    /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    t1 = c & M; c >>= 26; c += u1 * R1;\n    VERIFY_BITS(t1, 26);\n    VERIFY_BITS(c, 38);\n    /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n    /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[2]\n       + (uint64_t)a[1] * a[1];\n    VERIFY_BITS(c, 62);\n    /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    d += (uint64_t)(a[3]*2) * a[9]\n       + (uint64_t)(a[4]*2) * a[8]\n       + (uint64_t)(a[5]*2) * a[7]\n       + (uint64_t)a[6] * a[6];\n    VERIFY_BITS(d, 63);\n    /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    u2 = d & M; d >>= 26; c += u2 * R0;\n    VERIFY_BITS(u2, 26);\n    VERIFY_BITS(d, 37);\n    VERIFY_BITS(c, 63);\n    /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    t2 = c & M; c >>= 26; c += u2 * R1;\n    VERIFY_BITS(t2, 26);\n    VERIFY_BITS(c, 38);\n    /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n    /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[3]\n       + (uint64_t)(a[1]*2) * a[2];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    d += (uint64_t)(a[4]*2) * a[9]\n       + (uint64_t)(a[5]*2) * a[8]\n       + (uint64_t)(a[6]*2) * a[7];\n    VERIFY_BITS(d, 63);\n    /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    u3 = d & M; d >>= 26; c += u3 * R0;\n    VERIFY_BITS(u3, 26);\n    VERIFY_BITS(d, 37);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    t3 = c & M; c >>= 26; c += u3 * R1;\n    VERIFY_BITS(t3, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[4]\n       + (uint64_t)(a[1]*2) * a[3]\n       + (uint64_t)a[2] * a[2];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    d += (uint64_t)(a[5]*2) * a[9]\n       + (uint64_t)(a[6]*2) * a[8]\n       + (uint64_t)a[7] * a[7];\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    u4 = d & M; d >>= 26; c += u4 * R0;\n    VERIFY_BITS(u4, 26);\n    VERIFY_BITS(d, 36);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    t4 = c & M; c >>= 26; c += u4 * R1;\n    VERIFY_BITS(t4, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[5]\n       + (uint64_t)(a[1]*2) * a[4]\n       + (uint64_t)(a[2]*2) * a[3];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)(a[6]*2) * a[9]\n       + (uint64_t)(a[7]*2) * a[8];\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    u5 = d & M; d >>= 26; c += u5 * R0;\n    VERIFY_BITS(u5, 26);\n    VERIFY_BITS(d, 36);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    t5 = c & M; c >>= 26; c += u5 * R1;\n    VERIFY_BITS(t5, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[6]\n       + (uint64_t)(a[1]*2) * a[5]\n       + (uint64_t)(a[2]*2) * a[4]\n       + (uint64_t)a[3] * a[3];\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)(a[7]*2) * a[9]\n       + (uint64_t)a[8] * a[8];\n    VERIFY_BITS(d, 61);\n    /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    u6 = d & M; d >>= 26; c += u6 * R0;\n    VERIFY_BITS(u6, 26);\n    VERIFY_BITS(d, 35);\n    /* VERIFY_BITS(c, 64); */\n    /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    t6 = c & M; c >>= 26; c += u6 * R1;\n    VERIFY_BITS(t6, 26);\n    VERIFY_BITS(c, 39);\n    /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[7]\n       + (uint64_t)(a[1]*2) * a[6]\n       + (uint64_t)(a[2]*2) * a[5]\n       + (uint64_t)(a[3]*2) * a[4];\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x8000007C00000007ULL);\n    /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)(a[8]*2) * a[9];\n    VERIFY_BITS(d, 58);\n    /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    u7 = d & M; d >>= 26; c += u7 * R0;\n    VERIFY_BITS(u7, 26);\n    VERIFY_BITS(d, 32);\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL);\n    /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    t7 = c & M; c >>= 26; c += u7 * R1;\n    VERIFY_BITS(t7, 26);\n    VERIFY_BITS(c, 38);\n    /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    c += (uint64_t)(a[0]*2) * a[8]\n       + (uint64_t)(a[1]*2) * a[7]\n       + (uint64_t)(a[2]*2) * a[6]\n       + (uint64_t)(a[3]*2) * a[5]\n       + (uint64_t)a[4] * a[4];\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x9000007B80000008ULL);\n    /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint64_t)a[9] * a[9];\n    VERIFY_BITS(d, 57);\n    /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    u8 = d & M; d >>= 26; c += u8 * R0;\n    VERIFY_BITS(u8, 26);\n    VERIFY_BITS(d, 31);\n    /* VERIFY_BITS(c, 64); */\n    VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    r[3] = t3;\n    VERIFY_BITS(r[3], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[4] = t4;\n    VERIFY_BITS(r[4], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[5] = t5;\n    VERIFY_BITS(r[5], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[6] = t6;\n    VERIFY_BITS(r[6], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[7] = t7;\n    VERIFY_BITS(r[7], 26);\n    /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    r[8] = c & M; c >>= 26; c += u8 * R1;\n    VERIFY_BITS(r[8], 26);\n    VERIFY_BITS(c, 39);\n    /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    c   += d * R0 + t9;\n    VERIFY_BITS(c, 45);\n    /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4);\n    VERIFY_BITS(r[9], 22);\n    VERIFY_BITS(c, 46);\n    /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    d    = c * (R0 >> 4) + t0;\n    VERIFY_BITS(d, 56);\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[0] = d & M; d >>= 26;\n    VERIFY_BITS(r[0], 26);\n    VERIFY_BITS(d, 30);\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d   += c * (R1 >> 4) + t1;\n    VERIFY_BITS(d, 53);\n    VERIFY_CHECK(d <= 0x10000003FFFFBFULL);\n    /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[1] = d & M; d >>= 26;\n    VERIFY_BITS(r[1], 26);\n    VERIFY_BITS(d, 27);\n    VERIFY_CHECK(d <= 0x4000000ULL);\n    /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    d   += t2;\n    VERIFY_BITS(d, 27);\n    /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[2] = d;\n    VERIFY_BITS(r[2], 27);\n    /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n}\n#endif\n\nstatic void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->magnitude <= 8);\n    VERIFY_CHECK(b->magnitude <= 8);\n    secp256k1_fe_verify(a);\n    secp256k1_fe_verify(b);\n    VERIFY_CHECK(r != b);\n#endif\n    secp256k1_fe_mul_inner(r->n, a->n, b->n);\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->magnitude <= 8);\n    secp256k1_fe_verify(a);\n#endif\n    secp256k1_fe_sqr_inner(r->n, a->n);\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {\n    uint32_t mask0, mask1;\n    mask0 = flag + ~((uint32_t)0);\n    mask1 = ~mask0;\n    r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);\n    r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);\n    r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);\n    r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);\n    r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);\n    r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1);\n    r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1);\n    r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1);\n    r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1);\n    r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1);\n#ifdef VERIFY\n    if (a->magnitude > r->magnitude) {\n        r->magnitude = a->magnitude;\n    }\n    r->normalized &= a->normalized;\n#endif\n}\n\nstatic SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) {\n    uint32_t mask0, mask1;\n    mask0 = flag + ~((uint32_t)0);\n    mask1 = ~mask0;\n    r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);\n    r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);\n    r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);\n    r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);\n    r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);\n    r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1);\n    r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1);\n    r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1);\n}\n\nstatic void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n#endif\n    r->n[0] = a->n[0] | a->n[1] << 26;\n    r->n[1] = a->n[1] >> 6 | a->n[2] << 20;\n    r->n[2] = a->n[2] >> 12 | a->n[3] << 14;\n    r->n[3] = a->n[3] >> 18 | a->n[4] << 8;\n    r->n[4] = a->n[4] >> 24 | a->n[5] << 2 | a->n[6] << 28;\n    r->n[5] = a->n[6] >> 4 | a->n[7] << 22;\n    r->n[6] = a->n[7] >> 10 | a->n[8] << 16;\n    r->n[7] = a->n[8] >> 16 | a->n[9] << 10;\n}\n\nstatic SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) {\n    r->n[0] = a->n[0] & 0x3FFFFFFUL;\n    r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL);\n    r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL);\n    r->n[3] = a->n[2] >> 14 | ((a->n[3] << 18) & 0x3FFFFFFUL);\n    r->n[4] = a->n[3] >> 8 | ((a->n[4] << 24) & 0x3FFFFFFUL);\n    r->n[5] = (a->n[4] >> 2) & 0x3FFFFFFUL;\n    r->n[6] = a->n[4] >> 28 | ((a->n[5] << 4) & 0x3FFFFFFUL);\n    r->n[7] = a->n[5] >> 22 | ((a->n[6] << 10) & 0x3FFFFFFUL);\n    r->n[8] = a->n[6] >> 16 | ((a->n[7] << 16) & 0x3FFFFFFUL);\n    r->n[9] = a->n[7] >> 10;\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field_5x52.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_FIELD_REPR_\n#define _SECP256K1_FIELD_REPR_\n\n#include <stdint.h>\n\ntypedef struct {\n    /* X = sum(i=0..4, elem[i]*2^52) mod n */\n    uint64_t n[5];\n#ifdef VERIFY\n    int magnitude;\n    int normalized;\n#endif\n} secp256k1_fe;\n\n/* Unpacks a constant into a overlapping multi-limbed FE element. */\n#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \\\n    (d0) | (((uint64_t)(d1) & 0xFFFFFUL) << 32), \\\n    ((uint64_t)(d1) >> 20) | (((uint64_t)(d2)) << 12) | (((uint64_t)(d3) & 0xFFUL) << 44), \\\n    ((uint64_t)(d3) >> 8) | (((uint64_t)(d4) & 0xFFFFFFFUL) << 24), \\\n    ((uint64_t)(d4) >> 28) | (((uint64_t)(d5)) << 4) | (((uint64_t)(d6) & 0xFFFFUL) << 36), \\\n    ((uint64_t)(d6) >> 16) | (((uint64_t)(d7)) << 16) \\\n}\n\n#ifdef VERIFY\n#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1}\n#else\n#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))}\n#endif\n\ntypedef struct {\n    uint64_t n[4];\n} secp256k1_fe_storage;\n\n#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \\\n    (d0) | (((uint64_t)(d1)) << 32), \\\n    (d2) | (((uint64_t)(d3)) << 32), \\\n    (d4) | (((uint64_t)(d5)) << 32), \\\n    (d6) | (((uint64_t)(d7)) << 32) \\\n}}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field_5x52_asm_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013-2014 Diederik Huys, Pieter Wuille               *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n/**\n * Changelog:\n * - March 2013, Diederik Huys:    original version\n * - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm\n * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly\n */\n\n#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_\n#define _SECP256K1_FIELD_INNER5X52_IMPL_H_\n\nSECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) {\n/**\n * Registers: rdx:rax = multiplication accumulator\n *            r9:r8   = c\n *            r15:rcx = d\n *            r10-r14 = a0-a4\n *            rbx     = b\n *            rdi     = r\n *            rsi     = a / t?\n */\n  uint64_t tmp1, tmp2, tmp3;\n__asm__ __volatile__(\n    \"movq 0(%%rsi),%%r10\\n\"\n    \"movq 8(%%rsi),%%r11\\n\"\n    \"movq 16(%%rsi),%%r12\\n\"\n    \"movq 24(%%rsi),%%r13\\n\"\n    \"movq 32(%%rsi),%%r14\\n\"\n\n    /* d += a3 * b0 */\n    \"movq 0(%%rbx),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"movq %%rax,%%rcx\\n\"\n    \"movq %%rdx,%%r15\\n\"\n    /* d += a2 * b1 */\n    \"movq 8(%%rbx),%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a1 * b2 */\n    \"movq 16(%%rbx),%%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d = a0 * b3 */\n    \"movq 24(%%rbx),%%rax\\n\"\n    \"mulq %%r10\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* c = a4 * b4 */\n    \"movq 32(%%rbx),%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"movq %%rax,%%r8\\n\"\n    \"movq %%rdx,%%r9\\n\"\n    /* d += (c & M) * R */\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* c >>= 52 (%%r8 only) */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    /* t3 (tmp1) = d & M */\n    \"movq %%rcx,%%rsi\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rsi\\n\"\n    \"movq %%rsi,%q1\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%r15,%%rcx\\n\"\n    \"xorq %%r15,%%r15\\n\"\n    /* d += a4 * b0 */\n    \"movq 0(%%rbx),%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a3 * b1 */\n    \"movq 8(%%rbx),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a2 * b2 */\n    \"movq 16(%%rbx),%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a1 * b3 */\n    \"movq 24(%%rbx),%%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a0 * b4 */\n    \"movq 32(%%rbx),%%rax\\n\"\n    \"mulq %%r10\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += c * R */\n    \"movq %%r8,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* t4 = d & M (%%rsi) */\n    \"movq %%rcx,%%rsi\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rsi\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%r15,%%rcx\\n\"\n    \"xorq %%r15,%%r15\\n\"\n    /* tx = t4 >> 48 (tmp3) */\n    \"movq %%rsi,%%rax\\n\"\n    \"shrq $48,%%rax\\n\"\n    \"movq %%rax,%q3\\n\"\n    /* t4 &= (M >> 4) (tmp2) */\n    \"movq $0xffffffffffff,%%rax\\n\"\n    \"andq %%rax,%%rsi\\n\"\n    \"movq %%rsi,%q2\\n\"\n    /* c = a0 * b0 */\n    \"movq 0(%%rbx),%%rax\\n\"\n    \"mulq %%r10\\n\"\n    \"movq %%rax,%%r8\\n\"\n    \"movq %%rdx,%%r9\\n\"\n    /* d += a4 * b1 */\n    \"movq 8(%%rbx),%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a3 * b2 */\n    \"movq 16(%%rbx),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a2 * b3 */\n    \"movq 24(%%rbx),%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a1 * b4 */\n    \"movq 32(%%rbx),%%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* u0 = d & M (%%rsi) */\n    \"movq %%rcx,%%rsi\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rsi\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%r15,%%rcx\\n\"\n    \"xorq %%r15,%%r15\\n\"\n    /* u0 = (u0 << 4) | tx (%%rsi) */\n    \"shlq $4,%%rsi\\n\"\n    \"movq %q3,%%rax\\n\"\n    \"orq %%rax,%%rsi\\n\"\n    /* c += u0 * (R >> 4) */\n    \"movq $0x1000003d1,%%rax\\n\"\n    \"mulq %%rsi\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* r[0] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rax\\n\"\n    \"movq %%rax,0(%%rdi)\\n\"\n    /* c >>= 52 */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    \"xorq %%r9,%%r9\\n\"\n    /* c += a1 * b0 */\n    \"movq 0(%%rbx),%%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* c += a0 * b1 */\n    \"movq 8(%%rbx),%%rax\\n\"\n    \"mulq %%r10\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* d += a4 * b2 */\n    \"movq 16(%%rbx),%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a3 * b3 */\n    \"movq 24(%%rbx),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a2 * b4 */\n    \"movq 32(%%rbx),%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* c += (d & M) * R */\n    \"movq %%rcx,%%rax\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%r15,%%rcx\\n\"\n    \"xorq %%r15,%%r15\\n\"\n    /* r[1] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rax\\n\"\n    \"movq %%rax,8(%%rdi)\\n\"\n    /* c >>= 52 */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    \"xorq %%r9,%%r9\\n\"\n    /* c += a2 * b0 */\n    \"movq 0(%%rbx),%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* c += a1 * b1 */\n    \"movq 8(%%rbx),%%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* c += a0 * b2 (last use of %%r10 = a0) */\n    \"movq 16(%%rbx),%%rax\\n\"\n    \"mulq %%r10\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* fetch t3 (%%r10, overwrites a0), t4 (%%rsi) */\n    \"movq %q2,%%rsi\\n\"\n    \"movq %q1,%%r10\\n\"\n    /* d += a4 * b3 */\n    \"movq 24(%%rbx),%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* d += a3 * b4 */\n    \"movq 32(%%rbx),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax,%%rcx\\n\"\n    \"adcq %%rdx,%%r15\\n\"\n    /* c += (d & M) * R */\n    \"movq %%rcx,%%rax\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* d >>= 52 (%%rcx only) */\n    \"shrdq $52,%%r15,%%rcx\\n\"\n    /* r[2] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rax\\n\"\n    \"movq %%rax,16(%%rdi)\\n\"\n    /* c >>= 52 */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    \"xorq %%r9,%%r9\\n\"\n    /* c += t3 */\n    \"addq %%r10,%%r8\\n\"\n    /* c += d * R */\n    \"movq %%rcx,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* r[3] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"movq $0xfffffffffffff,%%rdx\\n\"\n    \"andq %%rdx,%%rax\\n\"\n    \"movq %%rax,24(%%rdi)\\n\"\n    /* c >>= 52 (%%r8 only) */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    /* c += t4 (%%r8 only) */\n    \"addq %%rsi,%%r8\\n\"\n    /* r[4] = c */\n    \"movq %%r8,32(%%rdi)\\n\"\n: \"+S\"(a), \"=m\"(tmp1), \"=m\"(tmp2), \"=m\"(tmp3)\n: \"b\"(b), \"D\"(r)\n: \"%rax\", \"%rcx\", \"%rdx\", \"%r8\", \"%r9\", \"%r10\", \"%r11\", \"%r12\", \"%r13\", \"%r14\", \"%r15\", \"cc\", \"memory\"\n);\n}\n\nSECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) {\n/**\n * Registers: rdx:rax = multiplication accumulator\n *            r9:r8   = c\n *            rcx:rbx = d\n *            r10-r14 = a0-a4\n *            r15     = M (0xfffffffffffff)\n *            rdi     = r\n *            rsi     = a / t?\n */\n  uint64_t tmp1, tmp2, tmp3;\n__asm__ __volatile__(\n    \"movq 0(%%rsi),%%r10\\n\"\n    \"movq 8(%%rsi),%%r11\\n\"\n    \"movq 16(%%rsi),%%r12\\n\"\n    \"movq 24(%%rsi),%%r13\\n\"\n    \"movq 32(%%rsi),%%r14\\n\"\n    \"movq $0xfffffffffffff,%%r15\\n\"\n\n    /* d = (a0*2) * a3 */\n    \"leaq (%%r10,%%r10,1),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"movq %%rax,%%rbx\\n\"\n    \"movq %%rdx,%%rcx\\n\"\n    /* d += (a1*2) * a2 */\n    \"leaq (%%r11,%%r11,1),%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* c = a4 * a4 */\n    \"movq %%r14,%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"movq %%rax,%%r8\\n\"\n    \"movq %%rdx,%%r9\\n\"\n    /* d += (c & M) * R */\n    \"andq %%r15,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* c >>= 52 (%%r8 only) */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    /* t3 (tmp1) = d & M */\n    \"movq %%rbx,%%rsi\\n\"\n    \"andq %%r15,%%rsi\\n\"\n    \"movq %%rsi,%q1\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%rcx,%%rbx\\n\"\n    \"xorq %%rcx,%%rcx\\n\"\n    /* a4 *= 2 */\n    \"addq %%r14,%%r14\\n\"\n    /* d += a0 * a4 */\n    \"movq %%r10,%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* d+= (a1*2) * a3 */\n    \"leaq (%%r11,%%r11,1),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* d += a2 * a2 */\n    \"movq %%r12,%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* d += c * R */\n    \"movq %%r8,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* t4 = d & M (%%rsi) */\n    \"movq %%rbx,%%rsi\\n\"\n    \"andq %%r15,%%rsi\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%rcx,%%rbx\\n\"\n    \"xorq %%rcx,%%rcx\\n\"\n    /* tx = t4 >> 48 (tmp3) */\n    \"movq %%rsi,%%rax\\n\"\n    \"shrq $48,%%rax\\n\"\n    \"movq %%rax,%q3\\n\"\n    /* t4 &= (M >> 4) (tmp2) */\n    \"movq $0xffffffffffff,%%rax\\n\"\n    \"andq %%rax,%%rsi\\n\"\n    \"movq %%rsi,%q2\\n\"\n    /* c = a0 * a0 */\n    \"movq %%r10,%%rax\\n\"\n    \"mulq %%r10\\n\"\n    \"movq %%rax,%%r8\\n\"\n    \"movq %%rdx,%%r9\\n\"\n    /* d += a1 * a4 */\n    \"movq %%r11,%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* d += (a2*2) * a3 */\n    \"leaq (%%r12,%%r12,1),%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* u0 = d & M (%%rsi) */\n    \"movq %%rbx,%%rsi\\n\"\n    \"andq %%r15,%%rsi\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%rcx,%%rbx\\n\"\n    \"xorq %%rcx,%%rcx\\n\"\n    /* u0 = (u0 << 4) | tx (%%rsi) */\n    \"shlq $4,%%rsi\\n\"\n    \"movq %q3,%%rax\\n\"\n    \"orq %%rax,%%rsi\\n\"\n    /* c += u0 * (R >> 4) */\n    \"movq $0x1000003d1,%%rax\\n\"\n    \"mulq %%rsi\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* r[0] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"andq %%r15,%%rax\\n\"\n    \"movq %%rax,0(%%rdi)\\n\"\n    /* c >>= 52 */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    \"xorq %%r9,%%r9\\n\"\n    /* a0 *= 2 */\n    \"addq %%r10,%%r10\\n\"\n    /* c += a0 * a1 */\n    \"movq %%r10,%%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* d += a2 * a4 */\n    \"movq %%r12,%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* d += a3 * a3 */\n    \"movq %%r13,%%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* c += (d & M) * R */\n    \"movq %%rbx,%%rax\\n\"\n    \"andq %%r15,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* d >>= 52 */\n    \"shrdq $52,%%rcx,%%rbx\\n\"\n    \"xorq %%rcx,%%rcx\\n\"\n    /* r[1] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"andq %%r15,%%rax\\n\"\n    \"movq %%rax,8(%%rdi)\\n\"\n    /* c >>= 52 */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    \"xorq %%r9,%%r9\\n\"\n    /* c += a0 * a2 (last use of %%r10) */\n    \"movq %%r10,%%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* fetch t3 (%%r10, overwrites a0),t4 (%%rsi) */\n    \"movq %q2,%%rsi\\n\"\n    \"movq %q1,%%r10\\n\"\n    /* c += a1 * a1 */\n    \"movq %%r11,%%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* d += a3 * a4 */\n    \"movq %%r13,%%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax,%%rbx\\n\"\n    \"adcq %%rdx,%%rcx\\n\"\n    /* c += (d & M) * R */\n    \"movq %%rbx,%%rax\\n\"\n    \"andq %%r15,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* d >>= 52 (%%rbx only) */\n    \"shrdq $52,%%rcx,%%rbx\\n\"\n    /* r[2] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"andq %%r15,%%rax\\n\"\n    \"movq %%rax,16(%%rdi)\\n\"\n    /* c >>= 52 */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    \"xorq %%r9,%%r9\\n\"\n    /* c += t3 */\n    \"addq %%r10,%%r8\\n\"\n    /* c += d * R */\n    \"movq %%rbx,%%rax\\n\"\n    \"movq $0x1000003d10,%%rdx\\n\"\n    \"mulq %%rdx\\n\"\n    \"addq %%rax,%%r8\\n\"\n    \"adcq %%rdx,%%r9\\n\"\n    /* r[3] = c & M */\n    \"movq %%r8,%%rax\\n\"\n    \"andq %%r15,%%rax\\n\"\n    \"movq %%rax,24(%%rdi)\\n\"\n    /* c >>= 52 (%%r8 only) */\n    \"shrdq $52,%%r9,%%r8\\n\"\n    /* c += t4 (%%r8 only) */\n    \"addq %%rsi,%%r8\\n\"\n    /* r[4] = c */\n    \"movq %%r8,32(%%rdi)\\n\"\n: \"+S\"(a), \"=m\"(tmp1), \"=m\"(tmp2), \"=m\"(tmp3)\n: \"D\"(r)\n: \"%rax\", \"%rbx\", \"%rcx\", \"%rdx\", \"%r8\", \"%r9\", \"%r10\", \"%r11\", \"%r12\", \"%r13\", \"%r14\", \"%r15\", \"cc\", \"memory\"\n);\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field_5x52_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_FIELD_REPR_IMPL_H_\n#define _SECP256K1_FIELD_REPR_IMPL_H_\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#include \"util.h\"\n#include \"num.h\"\n#include \"field.h\"\n\n#if defined(USE_ASM_X86_64)\n#include \"field_5x52_asm_impl.h\"\n#else\n#include \"field_5x52_int128_impl.h\"\n#endif\n\n/** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F,\n *  represented as 5 uint64_t's in base 2^52. The values are allowed to contain >52 each. In particular,\n *  each FieldElem has a 'magnitude' associated with it. Internally, a magnitude M means each element\n *  is at most M*(2^53-1), except the most significant one, which is limited to M*(2^49-1). All operations\n *  accept any input with magnitude at most M, and have different rules for propagating magnitude to their\n *  output.\n */\n\n#ifdef VERIFY\nstatic void secp256k1_fe_verify(const secp256k1_fe *a) {\n    const uint64_t *d = a->n;\n    int m = a->normalized ? 1 : 2 * a->magnitude, r = 1;\n   /* secp256k1 'p' value defined in \"Standards for Efficient Cryptography\" (SEC2) 2.7.1. */\n    r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m);\n    r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m);\n    r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m);\n    r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m);\n    r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m);\n    r &= (a->magnitude >= 0);\n    r &= (a->magnitude <= 2048);\n    if (a->normalized) {\n        r &= (a->magnitude <= 1);\n        if (r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) {\n            r &= (d[0] < 0xFFFFEFFFFFC2FULL);\n        }\n    }\n    VERIFY_CHECK(r == 1);\n}\n#endif\n\nstatic void secp256k1_fe_normalize(secp256k1_fe *r) {\n    uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];\n\n    /* Reduce t4 at the start so there will be at most a single carry from the first pass */\n    uint64_t m;\n    uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x1000003D1ULL;\n    t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;\n    t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1;\n    t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2;\n    t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3;\n\n    /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t4 >> 49 == 0);\n\n    /* At most a single final reduction is needed; check if the value is >= the field characteristic */\n    x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL)\n        & (t0 >= 0xFFFFEFFFFFC2FULL));\n\n    /* Apply the final reduction (for constant-time behaviour, we do it always) */\n    t0 += x * 0x1000003D1ULL;\n    t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;\n    t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL;\n    t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL;\n    t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL;\n\n    /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */\n    VERIFY_CHECK(t4 >> 48 == x);\n\n    /* Mask off the possible multiple of 2^256 from the final reduction */\n    t4 &= 0x0FFFFFFFFFFFFULL;\n\n    r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;\n\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic void secp256k1_fe_normalize_weak(secp256k1_fe *r) {\n    uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];\n\n    /* Reduce t4 at the start so there will be at most a single carry from the first pass */\n    uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x1000003D1ULL;\n    t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;\n    t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL;\n    t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL;\n    t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL;\n\n    /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t4 >> 49 == 0);\n\n    r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;\n\n#ifdef VERIFY\n    r->magnitude = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic void secp256k1_fe_normalize_var(secp256k1_fe *r) {\n    uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];\n\n    /* Reduce t4 at the start so there will be at most a single carry from the first pass */\n    uint64_t m;\n    uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x1000003D1ULL;\n    t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;\n    t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1;\n    t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2;\n    t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3;\n\n    /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t4 >> 49 == 0);\n\n    /* At most a single final reduction is needed; check if the value is >= the field characteristic */\n    x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL)\n        & (t0 >= 0xFFFFEFFFFFC2FULL));\n\n    if (x) {\n        t0 += 0x1000003D1ULL;\n        t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;\n        t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL;\n        t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL;\n        t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL;\n\n        /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */\n        VERIFY_CHECK(t4 >> 48 == x);\n\n        /* Mask off the possible multiple of 2^256 from the final reduction */\n        t4 &= 0x0FFFFFFFFFFFFULL;\n    }\n\n    r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4;\n\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) {\n    uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4];\n\n    /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */\n    uint64_t z0, z1;\n\n    /* Reduce t4 at the start so there will be at most a single carry from the first pass */\n    uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x1000003D1ULL;\n    t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; z0  = t0; z1  = t0 ^ 0x1000003D0ULL;\n    t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1;\n    t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2;\n    t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3;\n                                                z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL;\n\n    /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t4 >> 49 == 0);\n\n    return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL);\n}\n\nstatic int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) {\n    uint64_t t0, t1, t2, t3, t4;\n    uint64_t z0, z1;\n    uint64_t x;\n\n    t0 = r->n[0];\n    t4 = r->n[4];\n\n    /* Reduce t4 at the start so there will be at most a single carry from the first pass */\n    x = t4 >> 48;\n\n    /* The first pass ensures the magnitude is 1, ... */\n    t0 += x * 0x1000003D1ULL;\n\n    /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */\n    z0 = t0 & 0xFFFFFFFFFFFFFULL;\n    z1 = z0 ^ 0x1000003D0ULL;\n\n    /* Fast return path should catch the majority of cases */\n    if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) {\n        return 0;\n    }\n\n    t1 = r->n[1];\n    t2 = r->n[2];\n    t3 = r->n[3];\n\n    t4 &= 0x0FFFFFFFFFFFFULL;\n\n    t1 += (t0 >> 52);\n    t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1;\n    t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2;\n    t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3;\n                                                z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL;\n\n    /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */\n    VERIFY_CHECK(t4 >> 49 == 0);\n\n    return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL);\n}\n\nSECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) {\n    r->n[0] = a;\n    r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0;\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nSECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) {\n    const uint64_t *t = a->n;\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    secp256k1_fe_verify(a);\n#endif\n    return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0;\n}\n\nSECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    secp256k1_fe_verify(a);\n#endif\n    return a->n[0] & 1;\n}\n\nSECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) {\n    int i;\n#ifdef VERIFY\n    a->magnitude = 0;\n    a->normalized = 1;\n#endif\n    for (i=0; i<5; i++) {\n        a->n[i] = 0;\n    }\n}\n\nstatic int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) {\n    int i;\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    VERIFY_CHECK(b->normalized);\n    secp256k1_fe_verify(a);\n    secp256k1_fe_verify(b);\n#endif\n    for (i = 4; i >= 0; i--) {\n        if (a->n[i] > b->n[i]) {\n            return 1;\n        }\n        if (a->n[i] < b->n[i]) {\n            return -1;\n        }\n    }\n    return 0;\n}\n\nstatic int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) {\n    int i;\n    r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0;\n    for (i=0; i<32; i++) {\n        int j;\n        for (j=0; j<2; j++) {\n            int limb = (8*i+4*j)/52;\n            int shift = (8*i+4*j)%52;\n            r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift;\n        }\n    }\n    if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) {\n        return 0;\n    }\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n    secp256k1_fe_verify(r);\n#endif\n    return 1;\n}\n\n/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */\nstatic void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) {\n    int i;\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n    secp256k1_fe_verify(a);\n#endif\n    for (i=0; i<32; i++) {\n        int j;\n        int c = 0;\n        for (j=0; j<2; j++) {\n            int limb = (8*i+4*j)/52;\n            int shift = (8*i+4*j)%52;\n            c |= ((a->n[limb] >> shift) & 0xF) << (4 * j);\n        }\n        r[31-i] = c;\n    }\n}\n\nSECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->magnitude <= m);\n    secp256k1_fe_verify(a);\n#endif\n    r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0];\n    r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1];\n    r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2];\n    r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3];\n    r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4];\n#ifdef VERIFY\n    r->magnitude = m + 1;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nSECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) {\n    r->n[0] *= a;\n    r->n[1] *= a;\n    r->n[2] *= a;\n    r->n[3] *= a;\n    r->n[4] *= a;\n#ifdef VERIFY\n    r->magnitude *= a;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nSECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) {\n#ifdef VERIFY\n    secp256k1_fe_verify(a);\n#endif\n    r->n[0] += a->n[0];\n    r->n[1] += a->n[1];\n    r->n[2] += a->n[2];\n    r->n[3] += a->n[3];\n    r->n[4] += a->n[4];\n#ifdef VERIFY\n    r->magnitude += a->magnitude;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->magnitude <= 8);\n    VERIFY_CHECK(b->magnitude <= 8);\n    secp256k1_fe_verify(a);\n    secp256k1_fe_verify(b);\n    VERIFY_CHECK(r != b);\n#endif\n    secp256k1_fe_mul_inner(r->n, a->n, b->n);\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->magnitude <= 8);\n    secp256k1_fe_verify(a);\n#endif\n    secp256k1_fe_sqr_inner(r->n, a->n);\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 0;\n    secp256k1_fe_verify(r);\n#endif\n}\n\nstatic SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {\n    uint64_t mask0, mask1;\n    mask0 = flag + ~((uint64_t)0);\n    mask1 = ~mask0;\n    r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);\n    r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);\n    r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);\n    r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);\n    r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);\n#ifdef VERIFY\n    if (a->magnitude > r->magnitude) {\n        r->magnitude = a->magnitude;\n    }\n    r->normalized &= a->normalized;\n#endif\n}\n\nstatic SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) {\n    uint64_t mask0, mask1;\n    mask0 = flag + ~((uint64_t)0);\n    mask1 = ~mask0;\n    r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);\n    r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);\n    r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);\n    r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);\n}\n\nstatic void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) {\n#ifdef VERIFY\n    VERIFY_CHECK(a->normalized);\n#endif\n    r->n[0] = a->n[0] | a->n[1] << 52;\n    r->n[1] = a->n[1] >> 12 | a->n[2] << 40;\n    r->n[2] = a->n[2] >> 24 | a->n[3] << 28;\n    r->n[3] = a->n[3] >> 36 | a->n[4] << 16;\n}\n\nstatic SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) {\n    r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL;\n    r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL);\n    r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL);\n    r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL);\n    r->n[4] = a->n[3] >> 16;\n#ifdef VERIFY\n    r->magnitude = 1;\n    r->normalized = 1;\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field_5x52_int128_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_\n#define _SECP256K1_FIELD_INNER5X52_IMPL_H_\n\n#include <stdint.h>\n\n#ifdef VERIFY\n#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0)\n#else\n#define VERIFY_BITS(x, n) do { } while(0)\n#endif\n\nSECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) {\n    uint128_t c, d;\n    uint64_t t3, t4, tx, u0;\n    uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4];\n    const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL;\n\n    VERIFY_BITS(a[0], 56);\n    VERIFY_BITS(a[1], 56);\n    VERIFY_BITS(a[2], 56);\n    VERIFY_BITS(a[3], 56);\n    VERIFY_BITS(a[4], 52);\n    VERIFY_BITS(b[0], 56);\n    VERIFY_BITS(b[1], 56);\n    VERIFY_BITS(b[2], 56);\n    VERIFY_BITS(b[3], 56);\n    VERIFY_BITS(b[4], 52);\n    VERIFY_CHECK(r != b);\n\n    /*  [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n.\n     *  px is a shorthand for sum(a[i]*b[x-i], i=0..x).\n     *  Note that [x 0 0 0 0 0] = [x*R].\n     */\n\n    d  = (uint128_t)a0 * b[3]\n       + (uint128_t)a1 * b[2]\n       + (uint128_t)a2 * b[1]\n       + (uint128_t)a3 * b[0];\n    VERIFY_BITS(d, 114);\n    /* [d 0 0 0] = [p3 0 0 0] */\n    c  = (uint128_t)a4 * b[4];\n    VERIFY_BITS(c, 112);\n    /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */\n    d += (c & M) * R; c >>= 52;\n    VERIFY_BITS(d, 115);\n    VERIFY_BITS(c, 60);\n    /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */\n    t3 = d & M; d >>= 52;\n    VERIFY_BITS(t3, 52);\n    VERIFY_BITS(d, 63);\n    /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */\n\n    d += (uint128_t)a0 * b[4]\n       + (uint128_t)a1 * b[3]\n       + (uint128_t)a2 * b[2]\n       + (uint128_t)a3 * b[1]\n       + (uint128_t)a4 * b[0];\n    VERIFY_BITS(d, 115);\n    /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n    d += c * R;\n    VERIFY_BITS(d, 116);\n    /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n    t4 = d & M; d >>= 52;\n    VERIFY_BITS(t4, 52);\n    VERIFY_BITS(d, 64);\n    /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n    tx = (t4 >> 48); t4 &= (M >> 4);\n    VERIFY_BITS(tx, 4);\n    VERIFY_BITS(t4, 48);\n    /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n\n    c  = (uint128_t)a0 * b[0];\n    VERIFY_BITS(c, 112);\n    /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */\n    d += (uint128_t)a1 * b[4]\n       + (uint128_t)a2 * b[3]\n       + (uint128_t)a3 * b[2]\n       + (uint128_t)a4 * b[1];\n    VERIFY_BITS(d, 115);\n    /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    u0 = d & M; d >>= 52;\n    VERIFY_BITS(u0, 52);\n    VERIFY_BITS(d, 63);\n    /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    u0 = (u0 << 4) | tx;\n    VERIFY_BITS(u0, 56);\n    /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    c += (uint128_t)u0 * (R >> 4);\n    VERIFY_BITS(c, 115);\n    /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    r[0] = c & M; c >>= 52;\n    VERIFY_BITS(r[0], 52);\n    VERIFY_BITS(c, 61);\n    /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */\n\n    c += (uint128_t)a0 * b[1]\n       + (uint128_t)a1 * b[0];\n    VERIFY_BITS(c, 114);\n    /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */\n    d += (uint128_t)a2 * b[4]\n       + (uint128_t)a3 * b[3]\n       + (uint128_t)a4 * b[2];\n    VERIFY_BITS(d, 114);\n    /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */\n    c += (d & M) * R; d >>= 52;\n    VERIFY_BITS(c, 115);\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */\n    r[1] = c & M; c >>= 52;\n    VERIFY_BITS(r[1], 52);\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */\n\n    c += (uint128_t)a0 * b[2]\n       + (uint128_t)a1 * b[1]\n       + (uint128_t)a2 * b[0];\n    VERIFY_BITS(c, 114);\n    /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint128_t)a3 * b[4]\n       + (uint128_t)a4 * b[3];\n    VERIFY_BITS(d, 114);\n    /* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    c += (d & M) * R; d >>= 52;\n    VERIFY_BITS(c, 115);\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[2] = c & M; c >>= 52;\n    VERIFY_BITS(r[2], 52);\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    c   += d * R + t3;\n    VERIFY_BITS(c, 100);\n    /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[3] = c & M; c >>= 52;\n    VERIFY_BITS(r[3], 52);\n    VERIFY_BITS(c, 48);\n    /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    c   += t4;\n    VERIFY_BITS(c, 49);\n    /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[4] = c;\n    VERIFY_BITS(r[4], 49);\n    /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n}\n\nSECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) {\n    uint128_t c, d;\n    uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4];\n    int64_t t3, t4, tx, u0;\n    const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL;\n\n    VERIFY_BITS(a[0], 56);\n    VERIFY_BITS(a[1], 56);\n    VERIFY_BITS(a[2], 56);\n    VERIFY_BITS(a[3], 56);\n    VERIFY_BITS(a[4], 52);\n\n    /**  [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n.\n     *  px is a shorthand for sum(a[i]*a[x-i], i=0..x).\n     *  Note that [x 0 0 0 0 0] = [x*R].\n     */\n\n    d  = (uint128_t)(a0*2) * a3\n       + (uint128_t)(a1*2) * a2;\n    VERIFY_BITS(d, 114);\n    /* [d 0 0 0] = [p3 0 0 0] */\n    c  = (uint128_t)a4 * a4;\n    VERIFY_BITS(c, 112);\n    /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */\n    d += (c & M) * R; c >>= 52;\n    VERIFY_BITS(d, 115);\n    VERIFY_BITS(c, 60);\n    /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */\n    t3 = d & M; d >>= 52;\n    VERIFY_BITS(t3, 52);\n    VERIFY_BITS(d, 63);\n    /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */\n\n    a4 *= 2;\n    d += (uint128_t)a0 * a4\n       + (uint128_t)(a1*2) * a3\n       + (uint128_t)a2 * a2;\n    VERIFY_BITS(d, 115);\n    /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n    d += c * R;\n    VERIFY_BITS(d, 116);\n    /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n    t4 = d & M; d >>= 52;\n    VERIFY_BITS(t4, 52);\n    VERIFY_BITS(d, 64);\n    /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n    tx = (t4 >> 48); t4 &= (M >> 4);\n    VERIFY_BITS(tx, 4);\n    VERIFY_BITS(t4, 48);\n    /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */\n\n    c  = (uint128_t)a0 * a0;\n    VERIFY_BITS(c, 112);\n    /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */\n    d += (uint128_t)a1 * a4\n       + (uint128_t)(a2*2) * a3;\n    VERIFY_BITS(d, 114);\n    /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    u0 = d & M; d >>= 52;\n    VERIFY_BITS(u0, 52);\n    VERIFY_BITS(d, 62);\n    /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    u0 = (u0 << 4) | tx;\n    VERIFY_BITS(u0, 56);\n    /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    c += (uint128_t)u0 * (R >> 4);\n    VERIFY_BITS(c, 113);\n    /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */\n    r[0] = c & M; c >>= 52;\n    VERIFY_BITS(r[0], 52);\n    VERIFY_BITS(c, 61);\n    /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */\n\n    a0 *= 2;\n    c += (uint128_t)a0 * a1;\n    VERIFY_BITS(c, 114);\n    /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */\n    d += (uint128_t)a2 * a4\n       + (uint128_t)a3 * a3;\n    VERIFY_BITS(d, 114);\n    /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */\n    c += (d & M) * R; d >>= 52;\n    VERIFY_BITS(c, 115);\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */\n    r[1] = c & M; c >>= 52;\n    VERIFY_BITS(r[1], 52);\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */\n\n    c += (uint128_t)a0 * a2\n       + (uint128_t)a1 * a1;\n    VERIFY_BITS(c, 114);\n    /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */\n    d += (uint128_t)a3 * a4;\n    VERIFY_BITS(d, 114);\n    /* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    c += (d & M) * R; d >>= 52;\n    VERIFY_BITS(c, 115);\n    VERIFY_BITS(d, 62);\n    /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[2] = c & M; c >>= 52;\n    VERIFY_BITS(r[2], 52);\n    VERIFY_BITS(c, 63);\n    /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n\n    c   += d * R + t3;\n    VERIFY_BITS(c, 100);\n    /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[3] = c & M; c >>= 52;\n    VERIFY_BITS(r[3], 52);\n    VERIFY_BITS(c, 48);\n    /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    c   += t4;\n    VERIFY_BITS(c, 49);\n    /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n    r[4] = c;\n    VERIFY_BITS(r[4], 49);\n    /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/field_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_FIELD_IMPL_H_\n#define _SECP256K1_FIELD_IMPL_H_\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#include \"util.h\"\n\n#if defined(USE_FIELD_10X26)\n#include \"field_10x26_impl.h\"\n#elif defined(USE_FIELD_5X52)\n#include \"field_5x52_impl.h\"\n#else\n#error \"Please select field implementation\"\n#endif\n\nSECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) {\n    secp256k1_fe na;\n    secp256k1_fe_negate(&na, a, 1);\n    secp256k1_fe_add(&na, b);\n    return secp256k1_fe_normalizes_to_zero(&na);\n}\n\nSECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) {\n    secp256k1_fe na;\n    secp256k1_fe_negate(&na, a, 1);\n    secp256k1_fe_add(&na, b);\n    return secp256k1_fe_normalizes_to_zero_var(&na);\n}\n\nstatic int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) {\n    /** Given that p is congruent to 3 mod 4, we can compute the square root of\n     *  a mod p as the (p+1)/4'th power of a.\n     *\n     *  As (p+1)/4 is an even number, it will have the same result for a and for\n     *  (-a). Only one of these two numbers actually has a square root however,\n     *  so we test at the end by squaring and comparing to the input.\n     *  Also because (p+1)/4 is an even number, the computed square root is\n     *  itself always a square (a ** ((p+1)/4) is the square of a ** ((p+1)/8)).\n     */\n    secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1;\n    int j;\n\n    /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in\n     *  { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block:\n     *  1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223]\n     */\n\n    secp256k1_fe_sqr(&x2, a);\n    secp256k1_fe_mul(&x2, &x2, a);\n\n    secp256k1_fe_sqr(&x3, &x2);\n    secp256k1_fe_mul(&x3, &x3, a);\n\n    x6 = x3;\n    for (j=0; j<3; j++) {\n        secp256k1_fe_sqr(&x6, &x6);\n    }\n    secp256k1_fe_mul(&x6, &x6, &x3);\n\n    x9 = x6;\n    for (j=0; j<3; j++) {\n        secp256k1_fe_sqr(&x9, &x9);\n    }\n    secp256k1_fe_mul(&x9, &x9, &x3);\n\n    x11 = x9;\n    for (j=0; j<2; j++) {\n        secp256k1_fe_sqr(&x11, &x11);\n    }\n    secp256k1_fe_mul(&x11, &x11, &x2);\n\n    x22 = x11;\n    for (j=0; j<11; j++) {\n        secp256k1_fe_sqr(&x22, &x22);\n    }\n    secp256k1_fe_mul(&x22, &x22, &x11);\n\n    x44 = x22;\n    for (j=0; j<22; j++) {\n        secp256k1_fe_sqr(&x44, &x44);\n    }\n    secp256k1_fe_mul(&x44, &x44, &x22);\n\n    x88 = x44;\n    for (j=0; j<44; j++) {\n        secp256k1_fe_sqr(&x88, &x88);\n    }\n    secp256k1_fe_mul(&x88, &x88, &x44);\n\n    x176 = x88;\n    for (j=0; j<88; j++) {\n        secp256k1_fe_sqr(&x176, &x176);\n    }\n    secp256k1_fe_mul(&x176, &x176, &x88);\n\n    x220 = x176;\n    for (j=0; j<44; j++) {\n        secp256k1_fe_sqr(&x220, &x220);\n    }\n    secp256k1_fe_mul(&x220, &x220, &x44);\n\n    x223 = x220;\n    for (j=0; j<3; j++) {\n        secp256k1_fe_sqr(&x223, &x223);\n    }\n    secp256k1_fe_mul(&x223, &x223, &x3);\n\n    /* The final result is then assembled using a sliding window over the blocks. */\n\n    t1 = x223;\n    for (j=0; j<23; j++) {\n        secp256k1_fe_sqr(&t1, &t1);\n    }\n    secp256k1_fe_mul(&t1, &t1, &x22);\n    for (j=0; j<6; j++) {\n        secp256k1_fe_sqr(&t1, &t1);\n    }\n    secp256k1_fe_mul(&t1, &t1, &x2);\n    secp256k1_fe_sqr(&t1, &t1);\n    secp256k1_fe_sqr(r, &t1);\n\n    /* Check that a square root was actually calculated */\n\n    secp256k1_fe_sqr(&t1, r);\n    return secp256k1_fe_equal(&t1, a);\n}\n\nstatic void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) {\n    secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1;\n    int j;\n\n    /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in\n     *  { 1, 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block:\n     *  [1], [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223]\n     */\n\n    secp256k1_fe_sqr(&x2, a);\n    secp256k1_fe_mul(&x2, &x2, a);\n\n    secp256k1_fe_sqr(&x3, &x2);\n    secp256k1_fe_mul(&x3, &x3, a);\n\n    x6 = x3;\n    for (j=0; j<3; j++) {\n        secp256k1_fe_sqr(&x6, &x6);\n    }\n    secp256k1_fe_mul(&x6, &x6, &x3);\n\n    x9 = x6;\n    for (j=0; j<3; j++) {\n        secp256k1_fe_sqr(&x9, &x9);\n    }\n    secp256k1_fe_mul(&x9, &x9, &x3);\n\n    x11 = x9;\n    for (j=0; j<2; j++) {\n        secp256k1_fe_sqr(&x11, &x11);\n    }\n    secp256k1_fe_mul(&x11, &x11, &x2);\n\n    x22 = x11;\n    for (j=0; j<11; j++) {\n        secp256k1_fe_sqr(&x22, &x22);\n    }\n    secp256k1_fe_mul(&x22, &x22, &x11);\n\n    x44 = x22;\n    for (j=0; j<22; j++) {\n        secp256k1_fe_sqr(&x44, &x44);\n    }\n    secp256k1_fe_mul(&x44, &x44, &x22);\n\n    x88 = x44;\n    for (j=0; j<44; j++) {\n        secp256k1_fe_sqr(&x88, &x88);\n    }\n    secp256k1_fe_mul(&x88, &x88, &x44);\n\n    x176 = x88;\n    for (j=0; j<88; j++) {\n        secp256k1_fe_sqr(&x176, &x176);\n    }\n    secp256k1_fe_mul(&x176, &x176, &x88);\n\n    x220 = x176;\n    for (j=0; j<44; j++) {\n        secp256k1_fe_sqr(&x220, &x220);\n    }\n    secp256k1_fe_mul(&x220, &x220, &x44);\n\n    x223 = x220;\n    for (j=0; j<3; j++) {\n        secp256k1_fe_sqr(&x223, &x223);\n    }\n    secp256k1_fe_mul(&x223, &x223, &x3);\n\n    /* The final result is then assembled using a sliding window over the blocks. */\n\n    t1 = x223;\n    for (j=0; j<23; j++) {\n        secp256k1_fe_sqr(&t1, &t1);\n    }\n    secp256k1_fe_mul(&t1, &t1, &x22);\n    for (j=0; j<5; j++) {\n        secp256k1_fe_sqr(&t1, &t1);\n    }\n    secp256k1_fe_mul(&t1, &t1, a);\n    for (j=0; j<3; j++) {\n        secp256k1_fe_sqr(&t1, &t1);\n    }\n    secp256k1_fe_mul(&t1, &t1, &x2);\n    for (j=0; j<2; j++) {\n        secp256k1_fe_sqr(&t1, &t1);\n    }\n    secp256k1_fe_mul(r, a, &t1);\n}\n\nstatic void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a) {\n#if defined(USE_FIELD_INV_BUILTIN)\n    secp256k1_fe_inv(r, a);\n#elif defined(USE_FIELD_INV_NUM)\n    secp256k1_num n, m;\n    static const secp256k1_fe negone = SECP256K1_FE_CONST(\n        0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,\n        0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xFFFFFC2EUL\n    );\n    /* secp256k1 field prime, value p defined in \"Standards for Efficient Cryptography\" (SEC2) 2.7.1. */\n    static const unsigned char prime[32] = {\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n        0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F\n    };\n    unsigned char b[32];\n    int res;\n    secp256k1_fe c = *a;\n    secp256k1_fe_normalize_var(&c);\n    secp256k1_fe_get_b32(b, &c);\n    secp256k1_num_set_bin(&n, b, 32);\n    secp256k1_num_set_bin(&m, prime, 32);\n    secp256k1_num_mod_inverse(&n, &n, &m);\n    secp256k1_num_get_bin(b, 32, &n);\n    res = secp256k1_fe_set_b32(r, b);\n    (void)res;\n    VERIFY_CHECK(res);\n    /* Verify the result is the (unique) valid inverse using non-GMP code. */\n    secp256k1_fe_mul(&c, &c, r);\n    secp256k1_fe_add(&c, &negone);\n    CHECK(secp256k1_fe_normalizes_to_zero_var(&c));\n#else\n#error \"Please select field inverse implementation\"\n#endif\n}\n\nstatic void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len) {\n    secp256k1_fe u;\n    size_t i;\n    if (len < 1) {\n        return;\n    }\n\n    VERIFY_CHECK((r + len <= a) || (a + len <= r));\n\n    r[0] = a[0];\n\n    i = 0;\n    while (++i < len) {\n        secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]);\n    }\n\n    secp256k1_fe_inv_var(&u, &r[--i]);\n\n    while (i > 0) {\n        size_t j = i--;\n        secp256k1_fe_mul(&r[j], &r[i], &u);\n        secp256k1_fe_mul(&u, &u, &a[j]);\n    }\n\n    r[0] = u;\n}\n\nstatic int secp256k1_fe_is_quad_var(const secp256k1_fe *a) {\n#ifndef USE_NUM_NONE\n    unsigned char b[32];\n    secp256k1_num n;\n    secp256k1_num m;\n    /* secp256k1 field prime, value p defined in \"Standards for Efficient Cryptography\" (SEC2) 2.7.1. */\n    static const unsigned char prime[32] = {\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n        0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F\n    };\n\n    secp256k1_fe c = *a;\n    secp256k1_fe_normalize_var(&c);\n    secp256k1_fe_get_b32(b, &c);\n    secp256k1_num_set_bin(&n, b, 32);\n    secp256k1_num_set_bin(&m, prime, 32);\n    return secp256k1_num_jacobi(&n, &m) >= 0;\n#else\n    secp256k1_fe r;\n    return secp256k1_fe_sqrt(&r, a);\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/gen_context.c",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014, 2015 Thomas Daede, Cory Fields           *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#define USE_BASIC_CONFIG 1\n\n#include \"basic-config.h\"\n#include \"include/secp256k1.h\"\n#include \"field_impl.h\"\n#include \"scalar_impl.h\"\n#include \"group_impl.h\"\n#include \"ecmult_gen_impl.h\"\n\nstatic void default_error_callback_fn(const char* str, void* data) {\n    (void)data;\n    fprintf(stderr, \"[libsecp256k1] internal consistency check failed: %s\\n\", str);\n    abort();\n}\n\nstatic const secp256k1_callback default_error_callback = {\n    default_error_callback_fn,\n    NULL\n};\n\nint main(int argc, char **argv) {\n    secp256k1_ecmult_gen_context ctx;\n    int inner;\n    int outer;\n    FILE* fp;\n\n    (void)argc;\n    (void)argv;\n\n    fp = fopen(\"src/ecmult_static_context.h\",\"w\");\n    if (fp == NULL) {\n        fprintf(stderr, \"Could not open src/ecmult_static_context.h for writing!\\n\");\n        return -1;\n    }\n    \n    fprintf(fp, \"#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\\n\");\n    fprintf(fp, \"#define _SECP256K1_ECMULT_STATIC_CONTEXT_\\n\");\n    fprintf(fp, \"#include \\\"group.h\\\"\\n\");\n    fprintf(fp, \"#define SC SECP256K1_GE_STORAGE_CONST\\n\");\n    fprintf(fp, \"static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\\n\");\n\n    secp256k1_ecmult_gen_context_init(&ctx);\n    secp256k1_ecmult_gen_context_build(&ctx, &default_error_callback);\n    for(outer = 0; outer != 64; outer++) {\n        fprintf(fp,\"{\\n\");\n        for(inner = 0; inner != 16; inner++) {\n            fprintf(fp,\"    SC(%uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu)\", SECP256K1_GE_STORAGE_CONST_GET((*ctx.prec)[outer][inner]));\n            if (inner != 15) {\n                fprintf(fp,\",\\n\");\n            } else {\n                fprintf(fp,\"\\n\");\n            }\n        }\n        if (outer != 63) {\n            fprintf(fp,\"},\\n\");\n        } else {\n            fprintf(fp,\"}\\n\");\n        }\n    }\n    fprintf(fp,\"};\\n\");\n    secp256k1_ecmult_gen_context_clear(&ctx);\n    \n    fprintf(fp, \"#undef SC\\n\");\n    fprintf(fp, \"#endif\\n\");\n    fclose(fp);\n    \n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/group.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_GROUP_\n#define _SECP256K1_GROUP_\n\n#include \"num.h\"\n#include \"field.h\"\n\n/** A group element of the secp256k1 curve, in affine coordinates. */\ntypedef struct {\n    secp256k1_fe x;\n    secp256k1_fe y;\n    int infinity; /* whether this represents the point at infinity */\n} secp256k1_ge;\n\n#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0}\n#define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1}\n\n/** A group element of the secp256k1 curve, in jacobian coordinates. */\ntypedef struct {\n    secp256k1_fe x; /* actual X: x/z^2 */\n    secp256k1_fe y; /* actual Y: y/z^3 */\n    secp256k1_fe z;\n    int infinity; /* whether this represents the point at infinity */\n} secp256k1_gej;\n\n#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0}\n#define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1}\n\ntypedef struct {\n    secp256k1_fe_storage x;\n    secp256k1_fe_storage y;\n} secp256k1_ge_storage;\n\n#define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))}\n\n#define SECP256K1_GE_STORAGE_CONST_GET(t) SECP256K1_FE_STORAGE_CONST_GET(t.x), SECP256K1_FE_STORAGE_CONST_GET(t.y)\n\n/** Set a group element equal to the point with given X and Y coordinates */\nstatic void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y);\n\n/** Set a group element (affine) equal to the point with the given X coordinate\n *  and a Y coordinate that is a quadratic residue modulo p. The return value\n *  is true iff a coordinate with the given X coordinate exists.\n */\nstatic int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x);\n\n/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness\n *  for Y. Return value indicates whether the result is valid. */\nstatic int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd);\n\n/** Check whether a group element is the point at infinity. */\nstatic int secp256k1_ge_is_infinity(const secp256k1_ge *a);\n\n/** Check whether a group element is valid (i.e., on the curve). */\nstatic int secp256k1_ge_is_valid_var(const secp256k1_ge *a);\n\nstatic void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a);\n\n/** Set a group element equal to another which is given in jacobian coordinates */\nstatic void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a);\n\n/** Set a batch of group elements equal to the inputs given in jacobian coordinates */\nstatic void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb);\n\n/** Set a batch of group elements equal to the inputs given in jacobian\n *  coordinates (with known z-ratios). zr must contain the known z-ratios such\n *  that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. */\nstatic void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len);\n\n/** Bring a batch inputs given in jacobian coordinates (with known z-ratios) to\n *  the same global z \"denominator\". zr must contain the known z-ratios such\n *  that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. The x and y\n *  coordinates of the result are stored in r, the common z coordinate is\n *  stored in globalz. */\nstatic void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr);\n\n/** Set a group element (jacobian) equal to the point at infinity. */\nstatic void secp256k1_gej_set_infinity(secp256k1_gej *r);\n\n/** Set a group element (jacobian) equal to another which is given in affine coordinates. */\nstatic void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a);\n\n/** Compare the X coordinate of a group element (jacobian). */\nstatic int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a);\n\n/** Set r equal to the inverse of a (i.e., mirrored around the X axis) */\nstatic void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a);\n\n/** Check whether a group element is the point at infinity. */\nstatic int secp256k1_gej_is_infinity(const secp256k1_gej *a);\n\n/** Check whether a group element's y coordinate is a quadratic residue. */\nstatic int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a);\n\n/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0).\n * a may not be zero. Constant time. */\nstatic void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr);\n\n/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). */\nstatic void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr);\n\n/** Set r equal to the sum of a and b. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */\nstatic void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr);\n\n/** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */\nstatic void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b);\n\n/** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient\n    than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time\n    guarantee, and b is allowed to be infinity. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */\nstatic void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr);\n\n/** Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv). */\nstatic void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv);\n\n#ifdef USE_ENDOMORPHISM\n/** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */\nstatic void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a);\n#endif\n\n/** Clear a secp256k1_gej to prevent leaking sensitive information. */\nstatic void secp256k1_gej_clear(secp256k1_gej *r);\n\n/** Clear a secp256k1_ge to prevent leaking sensitive information. */\nstatic void secp256k1_ge_clear(secp256k1_ge *r);\n\n/** Convert a group element to the storage type. */\nstatic void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a);\n\n/** Convert a group element back from the storage type. */\nstatic void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a);\n\n/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */\nstatic void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag);\n\n/** Rescale a jacobian point by b which must be non-zero. Constant-time. */\nstatic void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/group_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_GROUP_IMPL_H_\n#define _SECP256K1_GROUP_IMPL_H_\n\n#include \"num.h\"\n#include \"field.h\"\n#include \"group.h\"\n\n/* These points can be generated in sage as follows:\n *\n * 0. Setup a worksheet with the following parameters.\n *   b = 4  # whatever CURVE_B will be set to\n *   F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F)\n *   C = EllipticCurve ([F (0), F (b)])\n *\n * 1. Determine all the small orders available to you. (If there are\n *    no satisfactory ones, go back and change b.)\n *   print C.order().factor(limit=1000)\n *\n * 2. Choose an order as one of the prime factors listed in the above step.\n *    (You can also multiply some to get a composite order, though the\n *    tests will crash trying to invert scalars during signing.) We take a\n *    random point and scale it to drop its order to the desired value.\n *    There is some probability this won't work; just try again.\n *   order = 199\n *   P = C.random_point()\n *   P = (int(P.order()) / int(order)) * P\n *   assert(P.order() == order)\n *\n * 3. Print the values. You'll need to use a vim macro or something to\n *    split the hex output into 4-byte chunks.\n *   print \"%x %x\" % P.xy()\n */\n#if defined(EXHAUSTIVE_TEST_ORDER)\n#  if EXHAUSTIVE_TEST_ORDER == 199\nconst secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST(\n    0xFA7CC9A7, 0x0737F2DB, 0xA749DD39, 0x2B4FB069,\n    0x3B017A7D, 0xA808C2F1, 0xFB12940C, 0x9EA66C18,\n    0x78AC123A, 0x5ED8AEF3, 0x8732BC91, 0x1F3A2868,\n    0x48DF246C, 0x808DAE72, 0xCFE52572, 0x7F0501ED\n);\n\nconst int CURVE_B = 4;\n#  elif EXHAUSTIVE_TEST_ORDER == 13\nconst secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST(\n    0xedc60018, 0xa51a786b, 0x2ea91f4d, 0x4c9416c0,\n    0x9de54c3b, 0xa1316554, 0x6cf4345c, 0x7277ef15,\n    0x54cb1b6b, 0xdc8c1273, 0x087844ea, 0x43f4603e,\n    0x0eaf9a43, 0xf6effe55, 0x939f806d, 0x37adf8ac\n);\nconst int CURVE_B = 2;\n#  else\n#    error No known generator for the specified exhaustive test group order.\n#  endif\n#else\n/** Generator for secp256k1, value 'g' defined in\n *  \"Standards for Efficient Cryptography\" (SEC2) 2.7.1.\n */\nstatic const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST(\n    0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL,\n    0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL,\n    0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL,\n    0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL\n);\n\nconst int CURVE_B = 7;\n#endif\n\nstatic void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi) {\n    secp256k1_fe zi2;\n    secp256k1_fe zi3;\n    secp256k1_fe_sqr(&zi2, zi);\n    secp256k1_fe_mul(&zi3, &zi2, zi);\n    secp256k1_fe_mul(&r->x, &a->x, &zi2);\n    secp256k1_fe_mul(&r->y, &a->y, &zi3);\n    r->infinity = a->infinity;\n}\n\nstatic void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y) {\n    r->infinity = 0;\n    r->x = *x;\n    r->y = *y;\n}\n\nstatic int secp256k1_ge_is_infinity(const secp256k1_ge *a) {\n    return a->infinity;\n}\n\nstatic void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a) {\n    *r = *a;\n    secp256k1_fe_normalize_weak(&r->y);\n    secp256k1_fe_negate(&r->y, &r->y, 1);\n}\n\nstatic void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) {\n    secp256k1_fe z2, z3;\n    r->infinity = a->infinity;\n    secp256k1_fe_inv(&a->z, &a->z);\n    secp256k1_fe_sqr(&z2, &a->z);\n    secp256k1_fe_mul(&z3, &a->z, &z2);\n    secp256k1_fe_mul(&a->x, &a->x, &z2);\n    secp256k1_fe_mul(&a->y, &a->y, &z3);\n    secp256k1_fe_set_int(&a->z, 1);\n    r->x = a->x;\n    r->y = a->y;\n}\n\nstatic void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {\n    secp256k1_fe z2, z3;\n    r->infinity = a->infinity;\n    if (a->infinity) {\n        return;\n    }\n    secp256k1_fe_inv_var(&a->z, &a->z);\n    secp256k1_fe_sqr(&z2, &a->z);\n    secp256k1_fe_mul(&z3, &a->z, &z2);\n    secp256k1_fe_mul(&a->x, &a->x, &z2);\n    secp256k1_fe_mul(&a->y, &a->y, &z3);\n    secp256k1_fe_set_int(&a->z, 1);\n    r->x = a->x;\n    r->y = a->y;\n}\n\nstatic void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb) {\n    secp256k1_fe *az;\n    secp256k1_fe *azi;\n    size_t i;\n    size_t count = 0;\n    az = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * len);\n    for (i = 0; i < len; i++) {\n        if (!a[i].infinity) {\n            az[count++] = a[i].z;\n        }\n    }\n\n    azi = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * count);\n    secp256k1_fe_inv_all_var(azi, az, count);\n    free(az);\n\n    count = 0;\n    for (i = 0; i < len; i++) {\n        r[i].infinity = a[i].infinity;\n        if (!a[i].infinity) {\n            secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]);\n        }\n    }\n    free(azi);\n}\n\nstatic void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len) {\n    size_t i = len - 1;\n    secp256k1_fe zi;\n\n    if (len > 0) {\n        /* Compute the inverse of the last z coordinate, and use it to compute the last affine output. */\n        secp256k1_fe_inv(&zi, &a[i].z);\n        secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi);\n\n        /* Work out way backwards, using the z-ratios to scale the x/y values. */\n        while (i > 0) {\n            secp256k1_fe_mul(&zi, &zi, &zr[i]);\n            i--;\n            secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi);\n        }\n    }\n}\n\nstatic void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr) {\n    size_t i = len - 1;\n    secp256k1_fe zs;\n\n    if (len > 0) {\n        /* The z of the final point gives us the \"global Z\" for the table. */\n        r[i].x = a[i].x;\n        r[i].y = a[i].y;\n        *globalz = a[i].z;\n        r[i].infinity = 0;\n        zs = zr[i];\n\n        /* Work our way backwards, using the z-ratios to scale the x/y values. */\n        while (i > 0) {\n            if (i != len - 1) {\n                secp256k1_fe_mul(&zs, &zs, &zr[i]);\n            }\n            i--;\n            secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zs);\n        }\n    }\n}\n\nstatic void secp256k1_gej_set_infinity(secp256k1_gej *r) {\n    r->infinity = 1;\n    secp256k1_fe_clear(&r->x);\n    secp256k1_fe_clear(&r->y);\n    secp256k1_fe_clear(&r->z);\n}\n\nstatic void secp256k1_gej_clear(secp256k1_gej *r) {\n    r->infinity = 0;\n    secp256k1_fe_clear(&r->x);\n    secp256k1_fe_clear(&r->y);\n    secp256k1_fe_clear(&r->z);\n}\n\nstatic void secp256k1_ge_clear(secp256k1_ge *r) {\n    r->infinity = 0;\n    secp256k1_fe_clear(&r->x);\n    secp256k1_fe_clear(&r->y);\n}\n\nstatic int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) {\n    secp256k1_fe x2, x3, c;\n    r->x = *x;\n    secp256k1_fe_sqr(&x2, x);\n    secp256k1_fe_mul(&x3, x, &x2);\n    r->infinity = 0;\n    secp256k1_fe_set_int(&c, CURVE_B);\n    secp256k1_fe_add(&c, &x3);\n    return secp256k1_fe_sqrt(&r->y, &c);\n}\n\nstatic int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) {\n    if (!secp256k1_ge_set_xquad(r, x)) {\n        return 0;\n    }\n    secp256k1_fe_normalize_var(&r->y);\n    if (secp256k1_fe_is_odd(&r->y) != odd) {\n        secp256k1_fe_negate(&r->y, &r->y, 1);\n    }\n    return 1;\n\n}\n\nstatic void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) {\n   r->infinity = a->infinity;\n   r->x = a->x;\n   r->y = a->y;\n   secp256k1_fe_set_int(&r->z, 1);\n}\n\nstatic int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) {\n    secp256k1_fe r, r2;\n    VERIFY_CHECK(!a->infinity);\n    secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x);\n    r2 = a->x; secp256k1_fe_normalize_weak(&r2);\n    return secp256k1_fe_equal_var(&r, &r2);\n}\n\nstatic void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) {\n    r->infinity = a->infinity;\n    r->x = a->x;\n    r->y = a->y;\n    r->z = a->z;\n    secp256k1_fe_normalize_weak(&r->y);\n    secp256k1_fe_negate(&r->y, &r->y, 1);\n}\n\nstatic int secp256k1_gej_is_infinity(const secp256k1_gej *a) {\n    return a->infinity;\n}\n\nstatic int secp256k1_gej_is_valid_var(const secp256k1_gej *a) {\n    secp256k1_fe y2, x3, z2, z6;\n    if (a->infinity) {\n        return 0;\n    }\n    /** y^2 = x^3 + 7\n     *  (Y/Z^3)^2 = (X/Z^2)^3 + 7\n     *  Y^2 / Z^6 = X^3 / Z^6 + 7\n     *  Y^2 = X^3 + 7*Z^6\n     */\n    secp256k1_fe_sqr(&y2, &a->y);\n    secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x);\n    secp256k1_fe_sqr(&z2, &a->z);\n    secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2);\n    secp256k1_fe_mul_int(&z6, CURVE_B);\n    secp256k1_fe_add(&x3, &z6);\n    secp256k1_fe_normalize_weak(&x3);\n    return secp256k1_fe_equal_var(&y2, &x3);\n}\n\nstatic int secp256k1_ge_is_valid_var(const secp256k1_ge *a) {\n    secp256k1_fe y2, x3, c;\n    if (a->infinity) {\n        return 0;\n    }\n    /* y^2 = x^3 + 7 */\n    secp256k1_fe_sqr(&y2, &a->y);\n    secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x);\n    secp256k1_fe_set_int(&c, CURVE_B);\n    secp256k1_fe_add(&x3, &c);\n    secp256k1_fe_normalize_weak(&x3);\n    return secp256k1_fe_equal_var(&y2, &x3);\n}\n\nstatic void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) {\n    /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate.\n     *\n     * Note that there is an implementation described at\n     *     https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l\n     * which trades a multiply for a square, but in practice this is actually slower,\n     * mainly because it requires more normalizations.\n     */\n    secp256k1_fe t1,t2,t3,t4;\n    /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity,\n     *  Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have\n     *  y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p.\n     *\n     *  Having said this, if this function receives a point on a sextic twist, e.g. by\n     *  a fault attack, it is possible for y to be 0. This happens for y^2 = x^3 + 6,\n     *  since -6 does have a cube root mod p. For this point, this function will not set\n     *  the infinity flag even though the point doubles to infinity, and the result\n     *  point will be gibberish (z = 0 but infinity = 0).\n     */\n    r->infinity = a->infinity;\n    if (r->infinity) {\n        if (rzr != NULL) {\n            secp256k1_fe_set_int(rzr, 1);\n        }\n        return;\n    }\n\n    if (rzr != NULL) {\n        *rzr = a->y;\n        secp256k1_fe_normalize_weak(rzr);\n        secp256k1_fe_mul_int(rzr, 2);\n    }\n\n    secp256k1_fe_mul(&r->z, &a->z, &a->y);\n    secp256k1_fe_mul_int(&r->z, 2);       /* Z' = 2*Y*Z (2) */\n    secp256k1_fe_sqr(&t1, &a->x);\n    secp256k1_fe_mul_int(&t1, 3);         /* T1 = 3*X^2 (3) */\n    secp256k1_fe_sqr(&t2, &t1);           /* T2 = 9*X^4 (1) */\n    secp256k1_fe_sqr(&t3, &a->y);\n    secp256k1_fe_mul_int(&t3, 2);         /* T3 = 2*Y^2 (2) */\n    secp256k1_fe_sqr(&t4, &t3);\n    secp256k1_fe_mul_int(&t4, 2);         /* T4 = 8*Y^4 (2) */\n    secp256k1_fe_mul(&t3, &t3, &a->x);    /* T3 = 2*X*Y^2 (1) */\n    r->x = t3;\n    secp256k1_fe_mul_int(&r->x, 4);       /* X' = 8*X*Y^2 (4) */\n    secp256k1_fe_negate(&r->x, &r->x, 4); /* X' = -8*X*Y^2 (5) */\n    secp256k1_fe_add(&r->x, &t2);         /* X' = 9*X^4 - 8*X*Y^2 (6) */\n    secp256k1_fe_negate(&t2, &t2, 1);     /* T2 = -9*X^4 (2) */\n    secp256k1_fe_mul_int(&t3, 6);         /* T3 = 12*X*Y^2 (6) */\n    secp256k1_fe_add(&t3, &t2);           /* T3 = 12*X*Y^2 - 9*X^4 (8) */\n    secp256k1_fe_mul(&r->y, &t1, &t3);    /* Y' = 36*X^3*Y^2 - 27*X^6 (1) */\n    secp256k1_fe_negate(&t2, &t4, 2);     /* T2 = -8*Y^4 (3) */\n    secp256k1_fe_add(&r->y, &t2);         /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */\n}\n\nstatic SECP256K1_INLINE void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) {\n    VERIFY_CHECK(!secp256k1_gej_is_infinity(a));\n    secp256k1_gej_double_var(r, a, rzr);\n}\n\nstatic void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr) {\n    /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */\n    secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;\n\n    if (a->infinity) {\n        VERIFY_CHECK(rzr == NULL);\n        *r = *b;\n        return;\n    }\n\n    if (b->infinity) {\n        if (rzr != NULL) {\n            secp256k1_fe_set_int(rzr, 1);\n        }\n        *r = *a;\n        return;\n    }\n\n    r->infinity = 0;\n    secp256k1_fe_sqr(&z22, &b->z);\n    secp256k1_fe_sqr(&z12, &a->z);\n    secp256k1_fe_mul(&u1, &a->x, &z22);\n    secp256k1_fe_mul(&u2, &b->x, &z12);\n    secp256k1_fe_mul(&s1, &a->y, &z22); secp256k1_fe_mul(&s1, &s1, &b->z);\n    secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z);\n    secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2);\n    secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2);\n    if (secp256k1_fe_normalizes_to_zero_var(&h)) {\n        if (secp256k1_fe_normalizes_to_zero_var(&i)) {\n            secp256k1_gej_double_var(r, a, rzr);\n        } else {\n            if (rzr != NULL) {\n                secp256k1_fe_set_int(rzr, 0);\n            }\n            r->infinity = 1;\n        }\n        return;\n    }\n    secp256k1_fe_sqr(&i2, &i);\n    secp256k1_fe_sqr(&h2, &h);\n    secp256k1_fe_mul(&h3, &h, &h2);\n    secp256k1_fe_mul(&h, &h, &b->z);\n    if (rzr != NULL) {\n        *rzr = h;\n    }\n    secp256k1_fe_mul(&r->z, &a->z, &h);\n    secp256k1_fe_mul(&t, &u1, &h2);\n    r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2);\n    secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i);\n    secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1);\n    secp256k1_fe_add(&r->y, &h3);\n}\n\nstatic void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr) {\n    /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */\n    secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;\n    if (a->infinity) {\n        VERIFY_CHECK(rzr == NULL);\n        secp256k1_gej_set_ge(r, b);\n        return;\n    }\n    if (b->infinity) {\n        if (rzr != NULL) {\n            secp256k1_fe_set_int(rzr, 1);\n        }\n        *r = *a;\n        return;\n    }\n    r->infinity = 0;\n\n    secp256k1_fe_sqr(&z12, &a->z);\n    u1 = a->x; secp256k1_fe_normalize_weak(&u1);\n    secp256k1_fe_mul(&u2, &b->x, &z12);\n    s1 = a->y; secp256k1_fe_normalize_weak(&s1);\n    secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z);\n    secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2);\n    secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2);\n    if (secp256k1_fe_normalizes_to_zero_var(&h)) {\n        if (secp256k1_fe_normalizes_to_zero_var(&i)) {\n            secp256k1_gej_double_var(r, a, rzr);\n        } else {\n            if (rzr != NULL) {\n                secp256k1_fe_set_int(rzr, 0);\n            }\n            r->infinity = 1;\n        }\n        return;\n    }\n    secp256k1_fe_sqr(&i2, &i);\n    secp256k1_fe_sqr(&h2, &h);\n    secp256k1_fe_mul(&h3, &h, &h2);\n    if (rzr != NULL) {\n        *rzr = h;\n    }\n    secp256k1_fe_mul(&r->z, &a->z, &h);\n    secp256k1_fe_mul(&t, &u1, &h2);\n    r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2);\n    secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i);\n    secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1);\n    secp256k1_fe_add(&r->y, &h3);\n}\n\nstatic void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv) {\n    /* 9 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */\n    secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;\n\n    if (b->infinity) {\n        *r = *a;\n        return;\n    }\n    if (a->infinity) {\n        secp256k1_fe bzinv2, bzinv3;\n        r->infinity = b->infinity;\n        secp256k1_fe_sqr(&bzinv2, bzinv);\n        secp256k1_fe_mul(&bzinv3, &bzinv2, bzinv);\n        secp256k1_fe_mul(&r->x, &b->x, &bzinv2);\n        secp256k1_fe_mul(&r->y, &b->y, &bzinv3);\n        secp256k1_fe_set_int(&r->z, 1);\n        return;\n    }\n    r->infinity = 0;\n\n    /** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to\n     *  secp256k1's isomorphism we can multiply the Z coordinates on both sides\n     *  by bzinv, and get: (rx,ry,rz*bzinv) = (ax,ay,az*bzinv) + (bx,by,1).\n     *  This means that (rx,ry,rz) can be calculated as\n     *  (ax,ay,az*bzinv) + (bx,by,1), when not applying the bzinv factor to rz.\n     *  The variable az below holds the modified Z coordinate for a, which is used\n     *  for the computation of rx and ry, but not for rz.\n     */\n    secp256k1_fe_mul(&az, &a->z, bzinv);\n\n    secp256k1_fe_sqr(&z12, &az);\n    u1 = a->x; secp256k1_fe_normalize_weak(&u1);\n    secp256k1_fe_mul(&u2, &b->x, &z12);\n    s1 = a->y; secp256k1_fe_normalize_weak(&s1);\n    secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &az);\n    secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2);\n    secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2);\n    if (secp256k1_fe_normalizes_to_zero_var(&h)) {\n        if (secp256k1_fe_normalizes_to_zero_var(&i)) {\n            secp256k1_gej_double_var(r, a, NULL);\n        } else {\n            r->infinity = 1;\n        }\n        return;\n    }\n    secp256k1_fe_sqr(&i2, &i);\n    secp256k1_fe_sqr(&h2, &h);\n    secp256k1_fe_mul(&h3, &h, &h2);\n    r->z = a->z; secp256k1_fe_mul(&r->z, &r->z, &h);\n    secp256k1_fe_mul(&t, &u1, &h2);\n    r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2);\n    secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i);\n    secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1);\n    secp256k1_fe_add(&r->y, &h3);\n}\n\n\nstatic void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b) {\n    /* Operations: 7 mul, 5 sqr, 4 normalize, 21 mul_int/add/negate/cmov */\n    static const secp256k1_fe fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);\n    secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr;\n    secp256k1_fe m_alt, rr_alt;\n    int infinity, degenerate;\n    VERIFY_CHECK(!b->infinity);\n    VERIFY_CHECK(a->infinity == 0 || a->infinity == 1);\n\n    /** In:\n     *    Eric Brier and Marc Joye, Weierstrass Elliptic Curves and Side-Channel Attacks.\n     *    In D. Naccache and P. Paillier, Eds., Public Key Cryptography, vol. 2274 of Lecture Notes in Computer Science, pages 335-345. Springer-Verlag, 2002.\n     *  we find as solution for a unified addition/doubling formula:\n     *    lambda = ((x1 + x2)^2 - x1 * x2 + a) / (y1 + y2), with a = 0 for secp256k1's curve equation.\n     *    x3 = lambda^2 - (x1 + x2)\n     *    2*y3 = lambda * (x1 + x2 - 2 * x3) - (y1 + y2).\n     *\n     *  Substituting x_i = Xi / Zi^2 and yi = Yi / Zi^3, for i=1,2,3, gives:\n     *    U1 = X1*Z2^2, U2 = X2*Z1^2\n     *    S1 = Y1*Z2^3, S2 = Y2*Z1^3\n     *    Z = Z1*Z2\n     *    T = U1+U2\n     *    M = S1+S2\n     *    Q = T*M^2\n     *    R = T^2-U1*U2\n     *    X3 = 4*(R^2-Q)\n     *    Y3 = 4*(R*(3*Q-2*R^2)-M^4)\n     *    Z3 = 2*M*Z\n     *  (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.)\n     *\n     *  This formula has the benefit of being the same for both addition\n     *  of distinct points and doubling. However, it breaks down in the\n     *  case that either point is infinity, or that y1 = -y2. We handle\n     *  these cases in the following ways:\n     *\n     *    - If b is infinity we simply bail by means of a VERIFY_CHECK.\n     *\n     *    - If a is infinity, we detect this, and at the end of the\n     *      computation replace the result (which will be meaningless,\n     *      but we compute to be constant-time) with b.x : b.y : 1.\n     *\n     *    - If a = -b, we have y1 = -y2, which is a degenerate case.\n     *      But here the answer is infinity, so we simply set the\n     *      infinity flag of the result, overriding the computed values\n     *      without even needing to cmov.\n     *\n     *    - If y1 = -y2 but x1 != x2, which does occur thanks to certain\n     *      properties of our curve (specifically, 1 has nontrivial cube\n     *      roots in our field, and the curve equation has no x coefficient)\n     *      then the answer is not infinity but also not given by the above\n     *      equation. In this case, we cmov in place an alternate expression\n     *      for lambda. Specifically (y1 - y2)/(x1 - x2). Where both these\n     *      expressions for lambda are defined, they are equal, and can be\n     *      obtained from each other by multiplication by (y1 + y2)/(y1 + y2)\n     *      then substitution of x^3 + 7 for y^2 (using the curve equation).\n     *      For all pairs of nonzero points (a, b) at least one is defined,\n     *      so this covers everything.\n     */\n\n    secp256k1_fe_sqr(&zz, &a->z);                       /* z = Z1^2 */\n    u1 = a->x; secp256k1_fe_normalize_weak(&u1);        /* u1 = U1 = X1*Z2^2 (1) */\n    secp256k1_fe_mul(&u2, &b->x, &zz);                  /* u2 = U2 = X2*Z1^2 (1) */\n    s1 = a->y; secp256k1_fe_normalize_weak(&s1);        /* s1 = S1 = Y1*Z2^3 (1) */\n    secp256k1_fe_mul(&s2, &b->y, &zz);                  /* s2 = Y2*Z1^2 (1) */\n    secp256k1_fe_mul(&s2, &s2, &a->z);                  /* s2 = S2 = Y2*Z1^3 (1) */\n    t = u1; secp256k1_fe_add(&t, &u2);                  /* t = T = U1+U2 (2) */\n    m = s1; secp256k1_fe_add(&m, &s2);                  /* m = M = S1+S2 (2) */\n    secp256k1_fe_sqr(&rr, &t);                          /* rr = T^2 (1) */\n    secp256k1_fe_negate(&m_alt, &u2, 1);                /* Malt = -X2*Z1^2 */\n    secp256k1_fe_mul(&tt, &u1, &m_alt);                 /* tt = -U1*U2 (2) */\n    secp256k1_fe_add(&rr, &tt);                         /* rr = R = T^2-U1*U2 (3) */\n    /** If lambda = R/M = 0/0 we have a problem (except in the \"trivial\"\n     *  case that Z = z1z2 = 0, and this is special-cased later on). */\n    degenerate = secp256k1_fe_normalizes_to_zero(&m) &\n                 secp256k1_fe_normalizes_to_zero(&rr);\n    /* This only occurs when y1 == -y2 and x1^3 == x2^3, but x1 != x2.\n     * This means either x1 == beta*x2 or beta*x1 == x2, where beta is\n     * a nontrivial cube root of one. In either case, an alternate\n     * non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2),\n     * so we set R/M equal to this. */\n    rr_alt = s1;\n    secp256k1_fe_mul_int(&rr_alt, 2);       /* rr = Y1*Z2^3 - Y2*Z1^3 (2) */\n    secp256k1_fe_add(&m_alt, &u1);          /* Malt = X1*Z2^2 - X2*Z1^2 */\n\n    secp256k1_fe_cmov(&rr_alt, &rr, !degenerate);\n    secp256k1_fe_cmov(&m_alt, &m, !degenerate);\n    /* Now Ralt / Malt = lambda and is guaranteed not to be 0/0.\n     * From here on out Ralt and Malt represent the numerator\n     * and denominator of lambda; R and M represent the explicit\n     * expressions x1^2 + x2^2 + x1x2 and y1 + y2. */\n    secp256k1_fe_sqr(&n, &m_alt);                       /* n = Malt^2 (1) */\n    secp256k1_fe_mul(&q, &n, &t);                       /* q = Q = T*Malt^2 (1) */\n    /* These two lines use the observation that either M == Malt or M == 0,\n     * so M^3 * Malt is either Malt^4 (which is computed by squaring), or\n     * zero (which is \"computed\" by cmov). So the cost is one squaring\n     * versus two multiplications. */\n    secp256k1_fe_sqr(&n, &n);\n    secp256k1_fe_cmov(&n, &m, degenerate);              /* n = M^3 * Malt (2) */\n    secp256k1_fe_sqr(&t, &rr_alt);                      /* t = Ralt^2 (1) */\n    secp256k1_fe_mul(&r->z, &a->z, &m_alt);             /* r->z = Malt*Z (1) */\n    infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity);\n    secp256k1_fe_mul_int(&r->z, 2);                     /* r->z = Z3 = 2*Malt*Z (2) */\n    secp256k1_fe_negate(&q, &q, 1);                     /* q = -Q (2) */\n    secp256k1_fe_add(&t, &q);                           /* t = Ralt^2-Q (3) */\n    secp256k1_fe_normalize_weak(&t);\n    r->x = t;                                           /* r->x = Ralt^2-Q (1) */\n    secp256k1_fe_mul_int(&t, 2);                        /* t = 2*x3 (2) */\n    secp256k1_fe_add(&t, &q);                           /* t = 2*x3 - Q: (4) */\n    secp256k1_fe_mul(&t, &t, &rr_alt);                  /* t = Ralt*(2*x3 - Q) (1) */\n    secp256k1_fe_add(&t, &n);                           /* t = Ralt*(2*x3 - Q) + M^3*Malt (3) */\n    secp256k1_fe_negate(&r->y, &t, 3);                  /* r->y = Ralt*(Q - 2x3) - M^3*Malt (4) */\n    secp256k1_fe_normalize_weak(&r->y);\n    secp256k1_fe_mul_int(&r->x, 4);                     /* r->x = X3 = 4*(Ralt^2-Q) */\n    secp256k1_fe_mul_int(&r->y, 4);                     /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */\n\n    /** In case a->infinity == 1, replace r with (b->x, b->y, 1). */\n    secp256k1_fe_cmov(&r->x, &b->x, a->infinity);\n    secp256k1_fe_cmov(&r->y, &b->y, a->infinity);\n    secp256k1_fe_cmov(&r->z, &fe_1, a->infinity);\n    r->infinity = infinity;\n}\n\nstatic void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) {\n    /* Operations: 4 mul, 1 sqr */\n    secp256k1_fe zz;\n    VERIFY_CHECK(!secp256k1_fe_is_zero(s));\n    secp256k1_fe_sqr(&zz, s);\n    secp256k1_fe_mul(&r->x, &r->x, &zz);                /* r->x *= s^2 */\n    secp256k1_fe_mul(&r->y, &r->y, &zz);\n    secp256k1_fe_mul(&r->y, &r->y, s);                  /* r->y *= s^3 */\n    secp256k1_fe_mul(&r->z, &r->z, s);                  /* r->z *= s   */\n}\n\nstatic void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a) {\n    secp256k1_fe x, y;\n    VERIFY_CHECK(!a->infinity);\n    x = a->x;\n    secp256k1_fe_normalize(&x);\n    y = a->y;\n    secp256k1_fe_normalize(&y);\n    secp256k1_fe_to_storage(&r->x, &x);\n    secp256k1_fe_to_storage(&r->y, &y);\n}\n\nstatic void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a) {\n    secp256k1_fe_from_storage(&r->x, &a->x);\n    secp256k1_fe_from_storage(&r->y, &a->y);\n    r->infinity = 0;\n}\n\nstatic SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag) {\n    secp256k1_fe_storage_cmov(&r->x, &a->x, flag);\n    secp256k1_fe_storage_cmov(&r->y, &a->y, flag);\n}\n\n#ifdef USE_ENDOMORPHISM\nstatic void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) {\n    static const secp256k1_fe beta = SECP256K1_FE_CONST(\n        0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul,\n        0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul\n    );\n    *r = *a;\n    secp256k1_fe_mul(&r->x, &r->x, &beta);\n}\n#endif\n\nstatic int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) {\n    secp256k1_fe yz;\n\n    if (a->infinity) {\n        return 0;\n    }\n\n    /* We rely on the fact that the Jacobi symbol of 1 / a->z^3 is the same as\n     * that of a->z. Thus a->y / a->z^3 is a quadratic residue iff a->y * a->z\n       is */\n    secp256k1_fe_mul(&yz, &a->y, &a->z);\n    return secp256k1_fe_is_quad_var(&yz);\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/hash.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_HASH_\n#define _SECP256K1_HASH_\n\n#include <stdlib.h>\n#include <stdint.h>\n\ntypedef struct {\n    uint32_t s[8];\n    uint32_t buf[16]; /* In big endian */\n    size_t bytes;\n} secp256k1_sha256_t;\n\nstatic void secp256k1_sha256_initialize(secp256k1_sha256_t *hash);\nstatic void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t size);\nstatic void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32);\n\ntypedef struct {\n    secp256k1_sha256_t inner, outer;\n} secp256k1_hmac_sha256_t;\n\nstatic void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t size);\nstatic void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size);\nstatic void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32);\n\ntypedef struct {\n    unsigned char v[32];\n    unsigned char k[32];\n    int retry;\n} secp256k1_rfc6979_hmac_sha256_t;\n\nstatic void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen);\nstatic void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen);\nstatic void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/hash_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_HASH_IMPL_H_\n#define _SECP256K1_HASH_IMPL_H_\n\n#include \"hash.h\"\n\n#include <stdlib.h>\n#include <stdint.h>\n#include <string.h>\n\n#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z))))\n#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y))))\n#define Sigma0(x) (((x) >> 2 | (x) << 30) ^ ((x) >> 13 | (x) << 19) ^ ((x) >> 22 | (x) << 10))\n#define Sigma1(x) (((x) >> 6 | (x) << 26) ^ ((x) >> 11 | (x) << 21) ^ ((x) >> 25 | (x) << 7))\n#define sigma0(x) (((x) >> 7 | (x) << 25) ^ ((x) >> 18 | (x) << 14) ^ ((x) >> 3))\n#define sigma1(x) (((x) >> 17 | (x) << 15) ^ ((x) >> 19 | (x) << 13) ^ ((x) >> 10))\n\n#define Round(a,b,c,d,e,f,g,h,k,w) do { \\\n    uint32_t t1 = (h) + Sigma1(e) + Ch((e), (f), (g)) + (k) + (w); \\\n    uint32_t t2 = Sigma0(a) + Maj((a), (b), (c)); \\\n    (d) += t1; \\\n    (h) = t1 + t2; \\\n} while(0)\n\n#ifdef WORDS_BIGENDIAN\n#define BE32(x) (x)\n#else\n#define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24))\n#endif\n\nstatic void secp256k1_sha256_initialize(secp256k1_sha256_t *hash) {\n    hash->s[0] = 0x6a09e667ul;\n    hash->s[1] = 0xbb67ae85ul;\n    hash->s[2] = 0x3c6ef372ul;\n    hash->s[3] = 0xa54ff53aul;\n    hash->s[4] = 0x510e527ful;\n    hash->s[5] = 0x9b05688cul;\n    hash->s[6] = 0x1f83d9abul;\n    hash->s[7] = 0x5be0cd19ul;\n    hash->bytes = 0;\n}\n\n/** Perform one SHA-256 transformation, processing 16 big endian 32-bit words. */\nstatic void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) {\n    uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7];\n    uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;\n\n    Round(a, b, c, d, e, f, g, h, 0x428a2f98, w0 = BE32(chunk[0]));\n    Round(h, a, b, c, d, e, f, g, 0x71374491, w1 = BE32(chunk[1]));\n    Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w2 = BE32(chunk[2]));\n    Round(f, g, h, a, b, c, d, e, 0xe9b5dba5, w3 = BE32(chunk[3]));\n    Round(e, f, g, h, a, b, c, d, 0x3956c25b, w4 = BE32(chunk[4]));\n    Round(d, e, f, g, h, a, b, c, 0x59f111f1, w5 = BE32(chunk[5]));\n    Round(c, d, e, f, g, h, a, b, 0x923f82a4, w6 = BE32(chunk[6]));\n    Round(b, c, d, e, f, g, h, a, 0xab1c5ed5, w7 = BE32(chunk[7]));\n    Round(a, b, c, d, e, f, g, h, 0xd807aa98, w8 = BE32(chunk[8]));\n    Round(h, a, b, c, d, e, f, g, 0x12835b01, w9 = BE32(chunk[9]));\n    Round(g, h, a, b, c, d, e, f, 0x243185be, w10 = BE32(chunk[10]));\n    Round(f, g, h, a, b, c, d, e, 0x550c7dc3, w11 = BE32(chunk[11]));\n    Round(e, f, g, h, a, b, c, d, 0x72be5d74, w12 = BE32(chunk[12]));\n    Round(d, e, f, g, h, a, b, c, 0x80deb1fe, w13 = BE32(chunk[13]));\n    Round(c, d, e, f, g, h, a, b, 0x9bdc06a7, w14 = BE32(chunk[14]));\n    Round(b, c, d, e, f, g, h, a, 0xc19bf174, w15 = BE32(chunk[15]));\n\n    Round(a, b, c, d, e, f, g, h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1));\n    Round(h, a, b, c, d, e, f, g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2));\n    Round(g, h, a, b, c, d, e, f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3));\n    Round(f, g, h, a, b, c, d, e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4));\n    Round(e, f, g, h, a, b, c, d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5));\n    Round(d, e, f, g, h, a, b, c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6));\n    Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7));\n    Round(b, c, d, e, f, g, h, a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8));\n    Round(a, b, c, d, e, f, g, h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9));\n    Round(h, a, b, c, d, e, f, g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10));\n    Round(g, h, a, b, c, d, e, f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11));\n    Round(f, g, h, a, b, c, d, e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12));\n    Round(e, f, g, h, a, b, c, d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13));\n    Round(d, e, f, g, h, a, b, c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14));\n    Round(c, d, e, f, g, h, a, b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15));\n    Round(b, c, d, e, f, g, h, a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0));\n\n    Round(a, b, c, d, e, f, g, h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1));\n    Round(h, a, b, c, d, e, f, g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2));\n    Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3));\n    Round(f, g, h, a, b, c, d, e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4));\n    Round(e, f, g, h, a, b, c, d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5));\n    Round(d, e, f, g, h, a, b, c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6));\n    Round(c, d, e, f, g, h, a, b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7));\n    Round(b, c, d, e, f, g, h, a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8));\n    Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9));\n    Round(h, a, b, c, d, e, f, g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10));\n    Round(g, h, a, b, c, d, e, f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11));\n    Round(f, g, h, a, b, c, d, e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12));\n    Round(e, f, g, h, a, b, c, d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13));\n    Round(d, e, f, g, h, a, b, c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14));\n    Round(c, d, e, f, g, h, a, b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15));\n    Round(b, c, d, e, f, g, h, a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0));\n\n    Round(a, b, c, d, e, f, g, h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1));\n    Round(h, a, b, c, d, e, f, g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2));\n    Round(g, h, a, b, c, d, e, f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3));\n    Round(f, g, h, a, b, c, d, e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4));\n    Round(e, f, g, h, a, b, c, d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5));\n    Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6));\n    Round(c, d, e, f, g, h, a, b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7));\n    Round(b, c, d, e, f, g, h, a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8));\n    Round(a, b, c, d, e, f, g, h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9));\n    Round(h, a, b, c, d, e, f, g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10));\n    Round(g, h, a, b, c, d, e, f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11));\n    Round(f, g, h, a, b, c, d, e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12));\n    Round(e, f, g, h, a, b, c, d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13));\n    Round(d, e, f, g, h, a, b, c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14));\n    Round(c, d, e, f, g, h, a, b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15));\n    Round(b, c, d, e, f, g, h, a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0));\n\n    s[0] += a;\n    s[1] += b;\n    s[2] += c;\n    s[3] += d;\n    s[4] += e;\n    s[5] += f;\n    s[6] += g;\n    s[7] += h;\n}\n\nstatic void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t len) {\n    size_t bufsize = hash->bytes & 0x3F;\n    hash->bytes += len;\n    while (bufsize + len >= 64) {\n        /* Fill the buffer, and process it. */\n        memcpy(((unsigned char*)hash->buf) + bufsize, data, 64 - bufsize);\n        data += 64 - bufsize;\n        len -= 64 - bufsize;\n        secp256k1_sha256_transform(hash->s, hash->buf);\n        bufsize = 0;\n    }\n    if (len) {\n        /* Fill the buffer with what remains. */\n        memcpy(((unsigned char*)hash->buf) + bufsize, data, len);\n    }\n}\n\nstatic void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32) {\n    static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\n    uint32_t sizedesc[2];\n    uint32_t out[8];\n    int i = 0;\n    sizedesc[0] = BE32(hash->bytes >> 29);\n    sizedesc[1] = BE32(hash->bytes << 3);\n    secp256k1_sha256_write(hash, pad, 1 + ((119 - (hash->bytes % 64)) % 64));\n    secp256k1_sha256_write(hash, (const unsigned char*)sizedesc, 8);\n    for (i = 0; i < 8; i++) {\n        out[i] = BE32(hash->s[i]);\n        hash->s[i] = 0;\n    }\n    memcpy(out32, (const unsigned char*)out, 32);\n}\n\nstatic void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t keylen) {\n    int n;\n    unsigned char rkey[64];\n    if (keylen <= 64) {\n        memcpy(rkey, key, keylen);\n        memset(rkey + keylen, 0, 64 - keylen);\n    } else {\n        secp256k1_sha256_t sha256;\n        secp256k1_sha256_initialize(&sha256);\n        secp256k1_sha256_write(&sha256, key, keylen);\n        secp256k1_sha256_finalize(&sha256, rkey);\n        memset(rkey + 32, 0, 32);\n    }\n\n    secp256k1_sha256_initialize(&hash->outer);\n    for (n = 0; n < 64; n++) {\n        rkey[n] ^= 0x5c;\n    }\n    secp256k1_sha256_write(&hash->outer, rkey, 64);\n\n    secp256k1_sha256_initialize(&hash->inner);\n    for (n = 0; n < 64; n++) {\n        rkey[n] ^= 0x5c ^ 0x36;\n    }\n    secp256k1_sha256_write(&hash->inner, rkey, 64);\n    memset(rkey, 0, 64);\n}\n\nstatic void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size) {\n    secp256k1_sha256_write(&hash->inner, data, size);\n}\n\nstatic void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32) {\n    unsigned char temp[32];\n    secp256k1_sha256_finalize(&hash->inner, temp);\n    secp256k1_sha256_write(&hash->outer, temp, 32);\n    memset(temp, 0, 32);\n    secp256k1_sha256_finalize(&hash->outer, out32);\n}\n\n\nstatic void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen) {\n    secp256k1_hmac_sha256_t hmac;\n    static const unsigned char zero[1] = {0x00};\n    static const unsigned char one[1] = {0x01};\n\n    memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */\n    memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */\n\n    /* RFC6979 3.2.d. */\n    secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);\n    secp256k1_hmac_sha256_write(&hmac, rng->v, 32);\n    secp256k1_hmac_sha256_write(&hmac, zero, 1);\n    secp256k1_hmac_sha256_write(&hmac, key, keylen);\n    secp256k1_hmac_sha256_finalize(&hmac, rng->k);\n    secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);\n    secp256k1_hmac_sha256_write(&hmac, rng->v, 32);\n    secp256k1_hmac_sha256_finalize(&hmac, rng->v);\n\n    /* RFC6979 3.2.f. */\n    secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);\n    secp256k1_hmac_sha256_write(&hmac, rng->v, 32);\n    secp256k1_hmac_sha256_write(&hmac, one, 1);\n    secp256k1_hmac_sha256_write(&hmac, key, keylen);\n    secp256k1_hmac_sha256_finalize(&hmac, rng->k);\n    secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);\n    secp256k1_hmac_sha256_write(&hmac, rng->v, 32);\n    secp256k1_hmac_sha256_finalize(&hmac, rng->v);\n    rng->retry = 0;\n}\n\nstatic void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) {\n    /* RFC6979 3.2.h. */\n    static const unsigned char zero[1] = {0x00};\n    if (rng->retry) {\n        secp256k1_hmac_sha256_t hmac;\n        secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);\n        secp256k1_hmac_sha256_write(&hmac, rng->v, 32);\n        secp256k1_hmac_sha256_write(&hmac, zero, 1);\n        secp256k1_hmac_sha256_finalize(&hmac, rng->k);\n        secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);\n        secp256k1_hmac_sha256_write(&hmac, rng->v, 32);\n        secp256k1_hmac_sha256_finalize(&hmac, rng->v);\n    }\n\n    while (outlen > 0) {\n        secp256k1_hmac_sha256_t hmac;\n        int now = outlen;\n        secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);\n        secp256k1_hmac_sha256_write(&hmac, rng->v, 32);\n        secp256k1_hmac_sha256_finalize(&hmac, rng->v);\n        if (now > 32) {\n            now = 32;\n        }\n        memcpy(out, rng->v, now);\n        out += now;\n        outlen -= now;\n    }\n\n    rng->retry = 1;\n}\n\nstatic void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng) {\n    memset(rng->k, 0, 32);\n    memset(rng->v, 0, 32);\n    rng->retry = 0;\n}\n\n#undef BE32\n#undef Round\n#undef sigma1\n#undef sigma0\n#undef Sigma1\n#undef Sigma0\n#undef Maj\n#undef Ch\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/NativeSecp256k1.java",
    "content": "/*\n * Copyright 2013 Google Inc.\n * Copyright 2014-2016 the libsecp256k1 contributors\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\npackage org.bitcoin;\n\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\nimport java.math.BigInteger;\nimport com.google.common.base.Preconditions;\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantReadWriteLock;\nimport static org.bitcoin.NativeSecp256k1Util.*;\n\n/**\n * <p>This class holds native methods to handle ECDSA verification.</p>\n *\n * <p>You can find an example library that can be used for this at https://github.com/bitcoin/secp256k1</p>\n *\n * <p>To build secp256k1 for use with bitcoinj, run\n * `./configure --enable-jni --enable-experimental --enable-module-ecdh`\n * and `make` then copy `.libs/libsecp256k1.so` to your system library path\n * or point the JVM to the folder containing it with -Djava.library.path\n * </p>\n */\npublic class NativeSecp256k1 {\n\n    private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();\n    private static final Lock r = rwl.readLock();\n    private static final Lock w = rwl.writeLock();\n    private static ThreadLocal<ByteBuffer> nativeECDSABuffer = new ThreadLocal<ByteBuffer>();\n    /**\n     * Verifies the given secp256k1 signature in native code.\n     * Calling when enabled == false is undefined (probably library not loaded)\n     *\n     * @param data The data which was signed, must be exactly 32 bytes\n     * @param signature The signature\n     * @param pub The public key which did the signing\n     */\n    public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{\n        Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < 520) {\n            byteBuff = ByteBuffer.allocateDirect(520);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(data);\n        byteBuff.put(signature);\n        byteBuff.put(pub);\n\n        byte[][] retByteArray;\n\n        r.lock();\n        try {\n          return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1;\n        } finally {\n          r.unlock();\n        }\n    }\n\n    /**\n     * libsecp256k1 Create an ECDSA signature.\n     *\n     * @param data Message hash, 32 bytes\n     * @param key Secret key, 32 bytes\n     *\n     * Return values\n     * @param sig byte array of signature\n     */\n    public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{\n        Preconditions.checkArgument(data.length == 32 && sec.length <= 32);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < 32 + 32) {\n            byteBuff = ByteBuffer.allocateDirect(32 + 32);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(data);\n        byteBuff.put(sec);\n\n        byte[][] retByteArray;\n\n        r.lock();\n        try {\n          retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext());\n        } finally {\n          r.unlock();\n        }\n\n        byte[] sigArr = retByteArray[0];\n        int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();\n        int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();\n\n        assertEquals(sigArr.length, sigLen, \"Got bad signature length.\");\n\n        return retVal == 0 ? new byte[0] : sigArr;\n    }\n\n    /**\n     * libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid\n     *\n     * @param seckey ECDSA Secret key, 32 bytes\n     */\n    public static boolean secKeyVerify(byte[] seckey) {\n        Preconditions.checkArgument(seckey.length == 32);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < seckey.length) {\n            byteBuff = ByteBuffer.allocateDirect(seckey.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(seckey);\n\n        r.lock();\n        try {\n          return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1;\n        } finally {\n          r.unlock();\n        }\n    }\n\n\n    /**\n     * libsecp256k1 Compute Pubkey - computes public key from secret key\n     *\n     * @param seckey ECDSA Secret key, 32 bytes\n     *\n     * Return values\n     * @param pubkey ECDSA Public key, 33 or 65 bytes\n     */\n    //TODO add a 'compressed' arg\n    public static byte[] computePubkey(byte[] seckey) throws AssertFailException{\n        Preconditions.checkArgument(seckey.length == 32);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < seckey.length) {\n            byteBuff = ByteBuffer.allocateDirect(seckey.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(seckey);\n\n        byte[][] retByteArray;\n\n        r.lock();\n        try {\n          retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext());\n        } finally {\n          r.unlock();\n        }\n\n        byte[] pubArr = retByteArray[0];\n        int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();\n        int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();\n\n        assertEquals(pubArr.length, pubLen, \"Got bad pubkey length.\");\n\n        return retVal == 0 ? new byte[0]: pubArr;\n    }\n\n    /**\n     * libsecp256k1 Cleanup - This destroys the secp256k1 context object\n     * This should be called at the end of the program for proper cleanup of the context.\n     */\n    public static synchronized void cleanup() {\n        w.lock();\n        try {\n          secp256k1_destroy_context(Secp256k1Context.getContext());\n        } finally {\n          w.unlock();\n        }\n    }\n\n    public static long cloneContext() {\n       r.lock();\n       try {\n        return secp256k1_ctx_clone(Secp256k1Context.getContext());\n       } finally { r.unlock(); }\n    }\n\n    /**\n     * libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it\n     *\n     * @param tweak some bytes to tweak with\n     * @param seckey 32-byte seckey\n     */\n    public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{\n        Preconditions.checkArgument(privkey.length == 32);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) {\n            byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(privkey);\n        byteBuff.put(tweak);\n\n        byte[][] retByteArray;\n        r.lock();\n        try {\n          retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext());\n        } finally {\n          r.unlock();\n        }\n\n        byte[] privArr = retByteArray[0];\n\n        int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;\n        int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();\n\n        assertEquals(privArr.length, privLen, \"Got bad pubkey length.\");\n\n        assertEquals(retVal, 1, \"Failed return value check.\");\n\n        return privArr;\n    }\n\n    /**\n     * libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it\n     *\n     * @param tweak some bytes to tweak with\n     * @param seckey 32-byte seckey\n     */\n    public static byte[] privKeyTweakAdd(byte[] privkey, byte[] tweak) throws AssertFailException{\n        Preconditions.checkArgument(privkey.length == 32);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) {\n            byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(privkey);\n        byteBuff.put(tweak);\n\n        byte[][] retByteArray;\n        r.lock();\n        try {\n          retByteArray = secp256k1_privkey_tweak_add(byteBuff,Secp256k1Context.getContext());\n        } finally {\n          r.unlock();\n        }\n\n        byte[] privArr = retByteArray[0];\n\n        int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;\n        int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();\n\n        assertEquals(privArr.length, privLen, \"Got bad pubkey length.\");\n\n        assertEquals(retVal, 1, \"Failed return value check.\");\n\n        return privArr;\n    }\n\n    /**\n     * libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it\n     *\n     * @param tweak some bytes to tweak with\n     * @param pubkey 32-byte seckey\n     */\n    public static byte[] pubKeyTweakAdd(byte[] pubkey, byte[] tweak) throws AssertFailException{\n        Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) {\n            byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(pubkey);\n        byteBuff.put(tweak);\n\n        byte[][] retByteArray;\n        r.lock();\n        try {\n          retByteArray = secp256k1_pubkey_tweak_add(byteBuff,Secp256k1Context.getContext(), pubkey.length);\n        } finally {\n          r.unlock();\n        }\n\n        byte[] pubArr = retByteArray[0];\n\n        int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;\n        int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();\n\n        assertEquals(pubArr.length, pubLen, \"Got bad pubkey length.\");\n\n        assertEquals(retVal, 1, \"Failed return value check.\");\n\n        return pubArr;\n    }\n\n    /**\n     * libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it\n     *\n     * @param tweak some bytes to tweak with\n     * @param pubkey 32-byte seckey\n     */\n    public static byte[] pubKeyTweakMul(byte[] pubkey, byte[] tweak) throws AssertFailException{\n        Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) {\n            byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(pubkey);\n        byteBuff.put(tweak);\n\n        byte[][] retByteArray;\n        r.lock();\n        try {\n          retByteArray = secp256k1_pubkey_tweak_mul(byteBuff,Secp256k1Context.getContext(), pubkey.length);\n        } finally {\n          r.unlock();\n        }\n\n        byte[] pubArr = retByteArray[0];\n\n        int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF;\n        int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue();\n\n        assertEquals(pubArr.length, pubLen, \"Got bad pubkey length.\");\n\n        assertEquals(retVal, 1, \"Failed return value check.\");\n\n        return pubArr;\n    }\n\n    /**\n     * libsecp256k1 create ECDH secret - constant time ECDH calculation\n     *\n     * @param seckey byte array of secret key used in exponentiaion\n     * @param pubkey byte array of public key used in exponentiaion\n     */\n    public static byte[] createECDHSecret(byte[] seckey, byte[] pubkey) throws AssertFailException{\n        Preconditions.checkArgument(seckey.length <= 32 && pubkey.length <= 65);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < 32 + pubkey.length) {\n            byteBuff = ByteBuffer.allocateDirect(32 + pubkey.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(seckey);\n        byteBuff.put(pubkey);\n\n        byte[][] retByteArray;\n        r.lock();\n        try {\n          retByteArray = secp256k1_ecdh(byteBuff, Secp256k1Context.getContext(), pubkey.length);\n        } finally {\n          r.unlock();\n        }\n\n        byte[] resArr = retByteArray[0];\n        int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue();\n\n        assertEquals(resArr.length, 32, \"Got bad result length.\");\n        assertEquals(retVal, 1, \"Failed return value check.\");\n\n        return resArr;\n    }\n\n    /**\n     * libsecp256k1 randomize - updates the context randomization\n     *\n     * @param seed 32-byte random seed\n     */\n    public static synchronized boolean randomize(byte[] seed) throws AssertFailException{\n        Preconditions.checkArgument(seed.length == 32 || seed == null);\n\n        ByteBuffer byteBuff = nativeECDSABuffer.get();\n        if (byteBuff == null || byteBuff.capacity() < seed.length) {\n            byteBuff = ByteBuffer.allocateDirect(seed.length);\n            byteBuff.order(ByteOrder.nativeOrder());\n            nativeECDSABuffer.set(byteBuff);\n        }\n        byteBuff.rewind();\n        byteBuff.put(seed);\n\n        w.lock();\n        try {\n          return secp256k1_context_randomize(byteBuff, Secp256k1Context.getContext()) == 1;\n        } finally {\n          w.unlock();\n        }\n    }\n\n    private static native long secp256k1_ctx_clone(long context);\n\n    private static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context);\n\n    private static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context);\n\n    private static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context);\n\n    private static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen);\n\n    private static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen);\n\n    private static native void secp256k1_destroy_context(long context);\n\n    private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen);\n\n    private static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, long context);\n\n    private static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context);\n\n    private static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, long context);\n\n    private static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen);\n\n    private static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen);\n\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java",
    "content": "package org.bitcoin;\n\nimport com.google.common.io.BaseEncoding;\nimport java.util.Arrays;\nimport java.math.BigInteger;\nimport javax.xml.bind.DatatypeConverter;\nimport static org.bitcoin.NativeSecp256k1Util.*;\n\n/**\n * This class holds test cases defined for testing this library.\n */\npublic class NativeSecp256k1Test {\n\n    //TODO improve comments/add more tests\n    /**\n      * This tests verify() for a valid signature\n      */\n    public static void testVerifyPos() throws AssertFailException{\n        boolean result = false;\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90\".toLowerCase()); //sha256hash of \"testing\"\n        byte[] sig = BaseEncoding.base16().lowerCase().decode(\"3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589\".toLowerCase());\n        byte[] pub = BaseEncoding.base16().lowerCase().decode(\"040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40\".toLowerCase());\n\n        result = NativeSecp256k1.verify( data, sig, pub);\n        assertEquals( result, true , \"testVerifyPos\");\n    }\n\n    /**\n      * This tests verify() for a non-valid signature\n      */\n    public static void testVerifyNeg() throws AssertFailException{\n        boolean result = false;\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91\".toLowerCase()); //sha256hash of \"testing\"\n        byte[] sig = BaseEncoding.base16().lowerCase().decode(\"3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589\".toLowerCase());\n        byte[] pub = BaseEncoding.base16().lowerCase().decode(\"040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40\".toLowerCase());\n\n        result = NativeSecp256k1.verify( data, sig, pub);\n        //System.out.println(\" TEST \" + new BigInteger(1, resultbytes).toString(16));\n        assertEquals( result, false , \"testVerifyNeg\");\n    }\n\n    /**\n      * This tests secret key verify() for a valid secretkey\n      */\n    public static void testSecKeyVerifyPos() throws AssertFailException{\n        boolean result = false;\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530\".toLowerCase());\n\n        result = NativeSecp256k1.secKeyVerify( sec );\n        //System.out.println(\" TEST \" + new BigInteger(1, resultbytes).toString(16));\n        assertEquals( result, true , \"testSecKeyVerifyPos\");\n    }\n\n    /**\n      * This tests secret key verify() for a invalid secretkey\n      */\n    public static void testSecKeyVerifyNeg() throws AssertFailException{\n        boolean result = false;\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\".toLowerCase());\n\n        result = NativeSecp256k1.secKeyVerify( sec );\n        //System.out.println(\" TEST \" + new BigInteger(1, resultbytes).toString(16));\n        assertEquals( result, false , \"testSecKeyVerifyNeg\");\n    }\n\n    /**\n      * This tests public key create() for a valid secretkey\n      */\n    public static void testPubKeyCreatePos() throws AssertFailException{\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530\".toLowerCase());\n\n        byte[] resultArr = NativeSecp256k1.computePubkey( sec);\n        String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( pubkeyString , \"04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6\" , \"testPubKeyCreatePos\");\n    }\n\n    /**\n      * This tests public key create() for a invalid secretkey\n      */\n    public static void testPubKeyCreateNeg() throws AssertFailException{\n       byte[] sec = BaseEncoding.base16().lowerCase().decode(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\".toLowerCase());\n\n       byte[] resultArr = NativeSecp256k1.computePubkey( sec);\n       String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n       assertEquals( pubkeyString, \"\" , \"testPubKeyCreateNeg\");\n    }\n\n    /**\n      * This tests sign() for a valid secretkey\n      */\n    public static void testSignPos() throws AssertFailException{\n\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90\".toLowerCase()); //sha256hash of \"testing\"\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530\".toLowerCase());\n\n        byte[] resultArr = NativeSecp256k1.sign(data, sec);\n        String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( sigString, \"30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9\" , \"testSignPos\");\n    }\n\n    /**\n      * This tests sign() for a invalid secretkey\n      */\n    public static void testSignNeg() throws AssertFailException{\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90\".toLowerCase()); //sha256hash of \"testing\"\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\".toLowerCase());\n\n        byte[] resultArr = NativeSecp256k1.sign(data, sec);\n        String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( sigString, \"\" , \"testSignNeg\");\n    }\n\n    /**\n      * This tests private key tweak-add\n      */\n    public static void testPrivKeyTweakAdd_1() throws AssertFailException {\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530\".toLowerCase());\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3\".toLowerCase()); //sha256hash of \"tweak\"\n\n        byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data );\n        String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( sigString , \"A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3\" , \"testPrivKeyAdd_1\");\n    }\n\n    /**\n      * This tests private key tweak-mul\n      */\n    public static void testPrivKeyTweakMul_1() throws AssertFailException {\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530\".toLowerCase());\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3\".toLowerCase()); //sha256hash of \"tweak\"\n\n        byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data );\n        String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( sigString , \"97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC\" , \"testPrivKeyMul_1\");\n    }\n\n    /**\n      * This tests private key tweak-add uncompressed\n      */\n    public static void testPrivKeyTweakAdd_2() throws AssertFailException {\n        byte[] pub = BaseEncoding.base16().lowerCase().decode(\"040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40\".toLowerCase());\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3\".toLowerCase()); //sha256hash of \"tweak\"\n\n        byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data );\n        String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( sigString , \"0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF\" , \"testPrivKeyAdd_2\");\n    }\n\n    /**\n      * This tests private key tweak-mul uncompressed\n      */\n    public static void testPrivKeyTweakMul_2() throws AssertFailException {\n        byte[] pub = BaseEncoding.base16().lowerCase().decode(\"040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40\".toLowerCase());\n        byte[] data = BaseEncoding.base16().lowerCase().decode(\"3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3\".toLowerCase()); //sha256hash of \"tweak\"\n\n        byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data );\n        String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( sigString , \"04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589\" , \"testPrivKeyMul_2\");\n    }\n\n    /**\n      * This tests seed randomization\n      */\n    public static void testRandomize() throws AssertFailException {\n        byte[] seed = BaseEncoding.base16().lowerCase().decode(\"A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11\".toLowerCase()); //sha256hash of \"random\"\n        boolean result = NativeSecp256k1.randomize(seed);\n        assertEquals( result, true, \"testRandomize\");\n    }\n\n    public static void testCreateECDHSecret() throws AssertFailException{\n\n        byte[] sec = BaseEncoding.base16().lowerCase().decode(\"67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530\".toLowerCase());\n        byte[] pub = BaseEncoding.base16().lowerCase().decode(\"040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40\".toLowerCase());\n\n        byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub);\n        String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr);\n        assertEquals( ecdhString, \"2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043\" , \"testCreateECDHSecret\");\n    }\n\n    public static void main(String[] args) throws AssertFailException{\n\n\n        System.out.println(\"\\n libsecp256k1 enabled: \" + Secp256k1Context.isEnabled() + \"\\n\");\n\n        assertEquals( Secp256k1Context.isEnabled(), true, \"isEnabled\" );\n\n        //Test verify() success/fail\n        testVerifyPos();\n        testVerifyNeg();\n\n        //Test secKeyVerify() success/fail\n        testSecKeyVerifyPos();\n        testSecKeyVerifyNeg();\n\n        //Test computePubkey() success/fail\n        testPubKeyCreatePos();\n        testPubKeyCreateNeg();\n\n        //Test sign() success/fail\n        testSignPos();\n        testSignNeg();\n\n        //Test privKeyTweakAdd() 1\n        testPrivKeyTweakAdd_1();\n\n        //Test privKeyTweakMul() 2\n        testPrivKeyTweakMul_1();\n\n        //Test privKeyTweakAdd() 3\n        testPrivKeyTweakAdd_2();\n\n        //Test privKeyTweakMul() 4\n        testPrivKeyTweakMul_2();\n\n        //Test randomize()\n        testRandomize();\n\n        //Test ECDH\n        testCreateECDHSecret();\n\n        NativeSecp256k1.cleanup();\n\n        System.out.println(\" All tests passed.\" );\n\n    }\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java",
    "content": "/*\n * Copyright 2014-2016 the libsecp256k1 contributors\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\npackage org.bitcoin;\n\npublic class NativeSecp256k1Util{\n\n    public static void assertEquals( int val, int val2, String message ) throws AssertFailException{\n      if( val != val2 )\n        throw new AssertFailException(\"FAIL: \" + message);\n    }\n\n    public static void assertEquals( boolean val, boolean val2, String message ) throws AssertFailException{\n      if( val != val2 )\n        throw new AssertFailException(\"FAIL: \" + message);\n      else\n        System.out.println(\"PASS: \" + message);\n    }\n\n    public static void assertEquals( String val, String val2, String message ) throws AssertFailException{\n      if( !val.equals(val2) )\n        throw new AssertFailException(\"FAIL: \" + message);\n      else\n        System.out.println(\"PASS: \" + message);\n    }\n\n    public static class AssertFailException extends Exception {\n      public AssertFailException(String message) {\n        super( message );\n      }\n    }\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org/bitcoin/Secp256k1Context.java",
    "content": "/*\n * Copyright 2014-2016 the libsecp256k1 contributors\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\npackage org.bitcoin;\n\n/**\n * This class holds the context reference used in native methods \n * to handle ECDSA operations.\n */\npublic class Secp256k1Context {\n  private static final boolean enabled; //true if the library is loaded\n  private static final long context; //ref to pointer to context obj\n\n  static { //static initializer\n      boolean isEnabled = true;\n      long contextRef = -1;\n      try {\n          System.loadLibrary(\"secp256k1\");\n          contextRef = secp256k1_init_context();\n      } catch (UnsatisfiedLinkError e) {\n          System.out.println(\"UnsatisfiedLinkError: \" + e.toString());\n          isEnabled = false;\n      }\n      enabled = isEnabled;\n      context = contextRef;\n  }\n\n  public static boolean isEnabled() {\n     return enabled;\n  }\n\n  public static long getContext() {\n     if(!enabled) return -1; //sanity check\n     return context;\n  }\n\n  private static native long secp256k1_init_context();\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_NativeSecp256k1.c",
    "content": "#include <stdlib.h>\n#include <stdint.h>\n#include <string.h>\n#include \"org_bitcoin_NativeSecp256k1.h\"\n#include \"include/secp256k1.h\"\n#include \"include/secp256k1_ecdh.h\"\n#include \"include/secp256k1_recovery.h\"\n\n\nSECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone\n  (JNIEnv* env, jclass classObject, jlong ctx_l)\n{\n  const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n\n  jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx);\n\n  (void)classObject;(void)env;\n\n  return ctx_clone_l;\n\n}\n\nSECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n\n  const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);\n\n  (void)classObject;\n\n  return secp256k1_context_randomize(ctx, seed);\n\n}\n\nSECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context\n  (JNIEnv* env, jclass classObject, jlong ctx_l)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n\n  secp256k1_context_destroy(ctx);\n\n  (void)classObject;(void)env;\n}\n\nSECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n\n  unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);\n  const unsigned char* sigdata = {  (unsigned char*) (data + 32) };\n  const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) };\n\n  secp256k1_ecdsa_signature sig;\n  secp256k1_pubkey pubkey;\n\n  int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen);\n\n  if( ret ) {\n    ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen);\n\n    if( ret ) {\n      ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey);\n    }\n  }\n\n  (void)classObject;\n\n  return ret;\n}\n\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n  unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);\n  unsigned char* secKey = (unsigned char*) (data + 32);\n\n  jobjectArray retArray;\n  jbyteArray sigArray, intsByteArray;\n  unsigned char intsarray[2];\n\n  secp256k1_ecdsa_signature sig[72];\n\n  int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL );\n\n  unsigned char outputSer[72];\n  size_t outputLen = 72;\n\n  if( ret ) {\n    int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2;\n  }\n\n  intsarray[0] = outputLen;\n  intsarray[1] = ret;\n\n  retArray = (*env)->NewObjectArray(env, 2,\n    (*env)->FindClass(env, \"[B\"),\n    (*env)->NewByteArray(env, 1));\n\n  sigArray = (*env)->NewByteArray(env, outputLen);\n  (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer);\n  (*env)->SetObjectArrayElement(env, retArray, 0, sigArray);\n\n  intsByteArray = (*env)->NewByteArray(env, 2);\n  (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);\n  (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);\n\n  (void)classObject;\n\n  return retArray;\n}\n\nSECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n  unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);\n\n  (void)classObject;\n\n  return secp256k1_ec_seckey_verify(ctx, secKey);\n}\n\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n  const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);\n\n  secp256k1_pubkey pubkey;\n\n  jobjectArray retArray;\n  jbyteArray pubkeyArray, intsByteArray;\n  unsigned char intsarray[2];\n\n  int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey);\n\n  unsigned char outputSer[65];\n  size_t outputLen = 65;\n\n  if( ret ) {\n    int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2;\n  }\n\n  intsarray[0] = outputLen;\n  intsarray[1] = ret;\n\n  retArray = (*env)->NewObjectArray(env, 2,\n    (*env)->FindClass(env, \"[B\"),\n    (*env)->NewByteArray(env, 1));\n\n  pubkeyArray = (*env)->NewByteArray(env, outputLen);\n  (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer);\n  (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray);\n\n  intsByteArray = (*env)->NewByteArray(env, 2);\n  (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);\n  (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);\n\n  (void)classObject;\n\n  return retArray;\n\n}\n\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n  unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);\n  const unsigned char* tweak = (unsigned char*) (privkey + 32);\n\n  jobjectArray retArray;\n  jbyteArray privArray, intsByteArray;\n  unsigned char intsarray[2];\n\n  int privkeylen = 32;\n\n  int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak);\n\n  intsarray[0] = privkeylen;\n  intsarray[1] = ret;\n\n  retArray = (*env)->NewObjectArray(env, 2,\n    (*env)->FindClass(env, \"[B\"),\n    (*env)->NewByteArray(env, 1));\n\n  privArray = (*env)->NewByteArray(env, privkeylen);\n  (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey);\n  (*env)->SetObjectArrayElement(env, retArray, 0, privArray);\n\n  intsByteArray = (*env)->NewByteArray(env, 2);\n  (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);\n  (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);\n\n  (void)classObject;\n\n  return retArray;\n}\n\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n  unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject);\n  const unsigned char* tweak = (unsigned char*) (privkey + 32);\n\n  jobjectArray retArray;\n  jbyteArray privArray, intsByteArray;\n  unsigned char intsarray[2];\n\n  int privkeylen = 32;\n\n  int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak);\n\n  intsarray[0] = privkeylen;\n  intsarray[1] = ret;\n\n  retArray = (*env)->NewObjectArray(env, 2,\n    (*env)->FindClass(env, \"[B\"),\n    (*env)->NewByteArray(env, 1));\n\n  privArray = (*env)->NewByteArray(env, privkeylen);\n  (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey);\n  (*env)->SetObjectArrayElement(env, retArray, 0, privArray);\n\n  intsByteArray = (*env)->NewByteArray(env, 2);\n  (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);\n  (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);\n\n  (void)classObject;\n\n  return retArray;\n}\n\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n/*  secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/\n  unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject);\n  const unsigned char* tweak = (unsigned char*) (pkey + publen);\n\n  jobjectArray retArray;\n  jbyteArray pubArray, intsByteArray;\n  unsigned char intsarray[2];\n  unsigned char outputSer[65];\n  size_t outputLen = 65;\n\n  secp256k1_pubkey pubkey;\n  int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen);\n\n  if( ret ) {\n    ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak);\n  }\n\n  if( ret ) {\n    int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2;\n  }\n\n  intsarray[0] = outputLen;\n  intsarray[1] = ret;\n\n  retArray = (*env)->NewObjectArray(env, 2,\n    (*env)->FindClass(env, \"[B\"),\n    (*env)->NewByteArray(env, 1));\n\n  pubArray = (*env)->NewByteArray(env, outputLen);\n  (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer);\n  (*env)->SetObjectArrayElement(env, retArray, 0, pubArray);\n\n  intsByteArray = (*env)->NewByteArray(env, 2);\n  (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);\n  (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);\n\n  (void)classObject;\n\n  return retArray;\n}\n\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n  unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject);\n  const unsigned char* tweak = (unsigned char*) (pkey + publen);\n\n  jobjectArray retArray;\n  jbyteArray pubArray, intsByteArray;\n  unsigned char intsarray[2];\n  unsigned char outputSer[65];\n  size_t outputLen = 65;\n\n  secp256k1_pubkey pubkey;\n  int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen);\n\n  if ( ret ) {\n    ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak);\n  }\n\n  if( ret ) {\n    int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2;\n  }\n\n  intsarray[0] = outputLen;\n  intsarray[1] = ret;\n\n  retArray = (*env)->NewObjectArray(env, 2,\n    (*env)->FindClass(env, \"[B\"),\n    (*env)->NewByteArray(env, 1));\n\n  pubArray = (*env)->NewByteArray(env, outputLen);\n  (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer);\n  (*env)->SetObjectArrayElement(env, retArray, 0, pubArray);\n\n  intsByteArray = (*env)->NewByteArray(env, 2);\n  (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray);\n  (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);\n\n  (void)classObject;\n\n  return retArray;\n}\n\nSECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine\n  (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys)\n{\n  (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys;\n\n  return 0;\n}\n\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen)\n{\n  secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l;\n  const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject);\n  const unsigned char* pubdata = (const unsigned char*) (secdata + 32);\n\n  jobjectArray retArray;\n  jbyteArray outArray, intsByteArray;\n  unsigned char intsarray[1];\n  secp256k1_pubkey pubkey;\n  unsigned char nonce_res[32];\n  size_t outputLen = 32;\n\n  int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen);\n\n  if (ret) {\n    ret = secp256k1_ecdh(\n      ctx,\n      nonce_res,\n      &pubkey,\n      secdata\n    );\n  }\n\n  intsarray[0] = ret;\n\n  retArray = (*env)->NewObjectArray(env, 2,\n    (*env)->FindClass(env, \"[B\"),\n    (*env)->NewByteArray(env, 1));\n\n  outArray = (*env)->NewByteArray(env, outputLen);\n  (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res);\n  (*env)->SetObjectArrayElement(env, retArray, 0, outArray);\n\n  intsByteArray = (*env)->NewByteArray(env, 1);\n  (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray);\n  (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray);\n\n  (void)classObject;\n\n  return retArray;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_NativeSecp256k1.h",
    "content": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n#include \"include/secp256k1.h\"\n/* Header for class org_bitcoin_NativeSecp256k1 */\n\n#ifndef _Included_org_bitcoin_NativeSecp256k1\n#define _Included_org_bitcoin_NativeSecp256k1\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_ctx_clone\n * Signature: (J)J\n */\nSECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone\n  (JNIEnv *, jclass, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_context_randomize\n * Signature: (Ljava/nio/ByteBuffer;J)I\n */\nSECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize\n  (JNIEnv *, jclass, jobject, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_privkey_tweak_add\n * Signature: (Ljava/nio/ByteBuffer;J)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add\n  (JNIEnv *, jclass, jobject, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_privkey_tweak_mul\n * Signature: (Ljava/nio/ByteBuffer;J)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul\n  (JNIEnv *, jclass, jobject, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_pubkey_tweak_add\n * Signature: (Ljava/nio/ByteBuffer;JI)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add\n  (JNIEnv *, jclass, jobject, jlong, jint);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_pubkey_tweak_mul\n * Signature: (Ljava/nio/ByteBuffer;JI)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul\n  (JNIEnv *, jclass, jobject, jlong, jint);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_destroy_context\n * Signature: (J)V\n */\nSECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context\n  (JNIEnv *, jclass, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_ecdsa_verify\n * Signature: (Ljava/nio/ByteBuffer;JII)I\n */\nSECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify\n  (JNIEnv *, jclass, jobject, jlong, jint, jint);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_ecdsa_sign\n * Signature: (Ljava/nio/ByteBuffer;J)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign\n  (JNIEnv *, jclass, jobject, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_ec_seckey_verify\n * Signature: (Ljava/nio/ByteBuffer;J)I\n */\nSECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify\n  (JNIEnv *, jclass, jobject, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_ec_pubkey_create\n * Signature: (Ljava/nio/ByteBuffer;J)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create\n  (JNIEnv *, jclass, jobject, jlong);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_ec_pubkey_parse\n * Signature: (Ljava/nio/ByteBuffer;JI)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse\n  (JNIEnv *, jclass, jobject, jlong, jint);\n\n/*\n * Class:     org_bitcoin_NativeSecp256k1\n * Method:    secp256k1_ecdh\n * Signature: (Ljava/nio/ByteBuffer;JI)[[B\n */\nSECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh\n  (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen);\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_Secp256k1Context.c",
    "content": "#include <stdlib.h>\n#include <stdint.h>\n#include \"org_bitcoin_Secp256k1Context.h\"\n#include \"include/secp256k1.h\"\n\nSECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context\n  (JNIEnv* env, jclass classObject)\n{\n  secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n\n  (void)classObject;(void)env;\n\n  return (uintptr_t)ctx;\n}\n\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/java/org_bitcoin_Secp256k1Context.h",
    "content": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n#include \"include/secp256k1.h\"\n/* Header for class org_bitcoin_Secp256k1Context */\n\n#ifndef _Included_org_bitcoin_Secp256k1Context\n#define _Included_org_bitcoin_Secp256k1Context\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n * Class:     org_bitcoin_Secp256k1Context\n * Method:    secp256k1_init_context\n * Signature: ()J\n */\nSECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context\n  (JNIEnv *, jclass);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/modules/ecdh/Makefile.am.include",
    "content": "include_HEADERS += include/secp256k1_ecdh.h\nnoinst_HEADERS += src/modules/ecdh/main_impl.h\nnoinst_HEADERS += src/modules/ecdh/tests_impl.h\nif USE_BENCHMARK\nnoinst_PROGRAMS += bench_ecdh\nbench_ecdh_SOURCES = src/bench_ecdh.c\nbench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB)\nendif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/modules/ecdh/main_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Andrew Poelstra                                 *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_MODULE_ECDH_MAIN_\n#define _SECP256K1_MODULE_ECDH_MAIN_\n\n#include \"include/secp256k1_ecdh.h\"\n#include \"ecmult_const_impl.h\"\n\nint secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const secp256k1_pubkey *point, const unsigned char *scalar) {\n    int ret = 0;\n    int overflow = 0;\n    secp256k1_gej res;\n    secp256k1_ge pt;\n    secp256k1_scalar s;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(result != NULL);\n    ARG_CHECK(point != NULL);\n    ARG_CHECK(scalar != NULL);\n\n    secp256k1_pubkey_load(ctx, &pt, point);\n    secp256k1_scalar_set_b32(&s, scalar, &overflow);\n    if (overflow || secp256k1_scalar_is_zero(&s)) {\n        ret = 0;\n    } else {\n        unsigned char x[32];\n        unsigned char y[1];\n        secp256k1_sha256_t sha;\n\n        secp256k1_ecmult_const(&res, &pt, &s);\n        secp256k1_ge_set_gej(&pt, &res);\n        /* Compute a hash of the point in compressed form\n         * Note we cannot use secp256k1_eckey_pubkey_serialize here since it does not\n         * expect its output to be secret and has a timing sidechannel. */\n        secp256k1_fe_normalize(&pt.x);\n        secp256k1_fe_normalize(&pt.y);\n        secp256k1_fe_get_b32(x, &pt.x);\n        y[0] = 0x02 | secp256k1_fe_is_odd(&pt.y);\n\n        secp256k1_sha256_initialize(&sha);\n        secp256k1_sha256_write(&sha, y, sizeof(y));\n        secp256k1_sha256_write(&sha, x, sizeof(x));\n        secp256k1_sha256_finalize(&sha, result);\n        ret = 1;\n    }\n\n    secp256k1_scalar_clear(&s);\n    return ret;\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/modules/ecdh/tests_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Andrew Poelstra                                 *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_MODULE_ECDH_TESTS_\n#define _SECP256K1_MODULE_ECDH_TESTS_\n\nvoid test_ecdh_api(void) {\n    /* Setup context that just counts errors */\n    secp256k1_context *tctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);\n    secp256k1_pubkey point;\n    unsigned char res[32];\n    unsigned char s_one[32] = { 0 };\n    int32_t ecount = 0;\n    s_one[31] = 1;\n\n    secp256k1_context_set_error_callback(tctx, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_illegal_callback(tctx, counting_illegal_callback_fn, &ecount);\n    CHECK(secp256k1_ec_pubkey_create(tctx, &point, s_one) == 1);\n\n    /* Check all NULLs are detected */\n    CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1);\n    CHECK(ecount == 0);\n    CHECK(secp256k1_ecdh(tctx, NULL, &point, s_one) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ecdh(tctx, res, NULL, s_one) == 0);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdh(tctx, res, &point, NULL) == 0);\n    CHECK(ecount == 3);\n    CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1);\n    CHECK(ecount == 3);\n\n    /* Cleanup */\n    secp256k1_context_destroy(tctx);\n}\n\nvoid test_ecdh_generator_basepoint(void) {\n    unsigned char s_one[32] = { 0 };\n    secp256k1_pubkey point[2];\n    int i;\n\n    s_one[31] = 1;\n    /* Check against pubkey creation when the basepoint is the generator */\n    for (i = 0; i < 100; ++i) {\n        secp256k1_sha256_t sha;\n        unsigned char s_b32[32];\n        unsigned char output_ecdh[32];\n        unsigned char output_ser[32];\n        unsigned char point_ser[33];\n        size_t point_ser_len = sizeof(point_ser);\n        secp256k1_scalar s;\n\n        random_scalar_order(&s);\n        secp256k1_scalar_get_b32(s_b32, &s);\n\n        /* compute using ECDH function */\n        CHECK(secp256k1_ec_pubkey_create(ctx, &point[0], s_one) == 1);\n        CHECK(secp256k1_ecdh(ctx, output_ecdh, &point[0], s_b32) == 1);\n        /* compute \"explicitly\" */\n        CHECK(secp256k1_ec_pubkey_create(ctx, &point[1], s_b32) == 1);\n        CHECK(secp256k1_ec_pubkey_serialize(ctx, point_ser, &point_ser_len, &point[1], SECP256K1_EC_COMPRESSED) == 1);\n        CHECK(point_ser_len == sizeof(point_ser));\n        secp256k1_sha256_initialize(&sha);\n        secp256k1_sha256_write(&sha, point_ser, point_ser_len);\n        secp256k1_sha256_finalize(&sha, output_ser);\n        /* compare */\n        CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0);\n    }\n}\n\nvoid test_bad_scalar(void) {\n    unsigned char s_zero[32] = { 0 };\n    unsigned char s_overflow[32] = {\n        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,\n        0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,\n        0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41\n    };\n    unsigned char s_rand[32] = { 0 };\n    unsigned char output[32];\n    secp256k1_scalar rand;\n    secp256k1_pubkey point;\n\n    /* Create random point */\n    random_scalar_order(&rand);\n    secp256k1_scalar_get_b32(s_rand, &rand);\n    CHECK(secp256k1_ec_pubkey_create(ctx, &point, s_rand) == 1);\n\n    /* Try to multiply it by bad values */\n    CHECK(secp256k1_ecdh(ctx, output, &point, s_zero) == 0);\n    CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 0);\n    /* ...and a good one */\n    s_overflow[31] -= 1;\n    CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1);\n}\n\nvoid run_ecdh_tests(void) {\n    test_ecdh_api();\n    test_ecdh_generator_basepoint();\n    test_bad_scalar();\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/modules/recovery/Makefile.am.include",
    "content": "include_HEADERS += include/secp256k1_recovery.h\nnoinst_HEADERS += src/modules/recovery/main_impl.h\nnoinst_HEADERS += src/modules/recovery/tests_impl.h\nif USE_BENCHMARK\nnoinst_PROGRAMS += bench_recover\nbench_recover_SOURCES = src/bench_recover.c\nbench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB)\nendif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/modules/recovery/main_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013-2015 Pieter Wuille                              *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_MODULE_RECOVERY_MAIN_\n#define _SECP256K1_MODULE_RECOVERY_MAIN_\n\n#include \"include/secp256k1_recovery.h\"\n\nstatic void secp256k1_ecdsa_recoverable_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, int* recid, const secp256k1_ecdsa_recoverable_signature* sig) {\n    (void)ctx;\n    if (sizeof(secp256k1_scalar) == 32) {\n        /* When the secp256k1_scalar type is exactly 32 byte, use its\n         * representation inside secp256k1_ecdsa_signature, as conversion is very fast.\n         * Note that secp256k1_ecdsa_signature_save must use the same representation. */\n        memcpy(r, &sig->data[0], 32);\n        memcpy(s, &sig->data[32], 32);\n    } else {\n        secp256k1_scalar_set_b32(r, &sig->data[0], NULL);\n        secp256k1_scalar_set_b32(s, &sig->data[32], NULL);\n    }\n    *recid = sig->data[64];\n}\n\nstatic void secp256k1_ecdsa_recoverable_signature_save(secp256k1_ecdsa_recoverable_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s, int recid) {\n    if (sizeof(secp256k1_scalar) == 32) {\n        memcpy(&sig->data[0], r, 32);\n        memcpy(&sig->data[32], s, 32);\n    } else {\n        secp256k1_scalar_get_b32(&sig->data[0], r);\n        secp256k1_scalar_get_b32(&sig->data[32], s);\n    }\n    sig->data[64] = recid;\n}\n\nint secp256k1_ecdsa_recoverable_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* sig, const unsigned char *input64, int recid) {\n    secp256k1_scalar r, s;\n    int ret = 1;\n    int overflow = 0;\n\n    (void)ctx;\n    ARG_CHECK(sig != NULL);\n    ARG_CHECK(input64 != NULL);\n    ARG_CHECK(recid >= 0 && recid <= 3);\n\n    secp256k1_scalar_set_b32(&r, &input64[0], &overflow);\n    ret &= !overflow;\n    secp256k1_scalar_set_b32(&s, &input64[32], &overflow);\n    ret &= !overflow;\n    if (ret) {\n        secp256k1_ecdsa_recoverable_signature_save(sig, &r, &s, recid);\n    } else {\n        memset(sig, 0, sizeof(*sig));\n    }\n    return ret;\n}\n\nint secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature* sig) {\n    secp256k1_scalar r, s;\n\n    (void)ctx;\n    ARG_CHECK(output64 != NULL);\n    ARG_CHECK(sig != NULL);\n    ARG_CHECK(recid != NULL);\n\n    secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, recid, sig);\n    secp256k1_scalar_get_b32(&output64[0], &r);\n    secp256k1_scalar_get_b32(&output64[32], &s);\n    return 1;\n}\n\nint secp256k1_ecdsa_recoverable_signature_convert(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const secp256k1_ecdsa_recoverable_signature* sigin) {\n    secp256k1_scalar r, s;\n    int recid;\n\n    (void)ctx;\n    ARG_CHECK(sig != NULL);\n    ARG_CHECK(sigin != NULL);\n\n    secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, sigin);\n    secp256k1_ecdsa_signature_save(sig, &r, &s);\n    return 1;\n}\n\nstatic int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) {\n    unsigned char brx[32];\n    secp256k1_fe fx;\n    secp256k1_ge x;\n    secp256k1_gej xj;\n    secp256k1_scalar rn, u1, u2;\n    secp256k1_gej qj;\n    int r;\n\n    if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) {\n        return 0;\n    }\n\n    secp256k1_scalar_get_b32(brx, sigr);\n    r = secp256k1_fe_set_b32(&fx, brx);\n    (void)r;\n    VERIFY_CHECK(r); /* brx comes from a scalar, so is less than the order; certainly less than p */\n    if (recid & 2) {\n        if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) {\n            return 0;\n        }\n        secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe);\n    }\n    if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) {\n        return 0;\n    }\n    secp256k1_gej_set_ge(&xj, &x);\n    secp256k1_scalar_inverse_var(&rn, sigr);\n    secp256k1_scalar_mul(&u1, &rn, message);\n    secp256k1_scalar_negate(&u1, &u1);\n    secp256k1_scalar_mul(&u2, &rn, sigs);\n    secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1);\n    secp256k1_ge_set_gej_var(pubkey, &qj);\n    return !secp256k1_gej_is_infinity(&qj);\n}\n\nint secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) {\n    secp256k1_scalar r, s;\n    secp256k1_scalar sec, non, msg;\n    int recid;\n    int ret = 0;\n    int overflow = 0;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));\n    ARG_CHECK(msg32 != NULL);\n    ARG_CHECK(signature != NULL);\n    ARG_CHECK(seckey != NULL);\n    if (noncefp == NULL) {\n        noncefp = secp256k1_nonce_function_default;\n    }\n\n    secp256k1_scalar_set_b32(&sec, seckey, &overflow);\n    /* Fail if the secret key is invalid. */\n    if (!overflow && !secp256k1_scalar_is_zero(&sec)) {\n        unsigned char nonce32[32];\n        unsigned int count = 0;\n        secp256k1_scalar_set_b32(&msg, msg32, NULL);\n        while (1) {\n            ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count);\n            if (!ret) {\n                break;\n            }\n            secp256k1_scalar_set_b32(&non, nonce32, &overflow);\n            if (!secp256k1_scalar_is_zero(&non) && !overflow) {\n                if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, &recid)) {\n                    break;\n                }\n            }\n            count++;\n        }\n        memset(nonce32, 0, 32);\n        secp256k1_scalar_clear(&msg);\n        secp256k1_scalar_clear(&non);\n        secp256k1_scalar_clear(&sec);\n    }\n    if (ret) {\n        secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid);\n    } else {\n        memset(signature, 0, sizeof(*signature));\n    }\n    return ret;\n}\n\nint secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) {\n    secp256k1_ge q;\n    secp256k1_scalar r, s;\n    secp256k1_scalar m;\n    int recid;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));\n    ARG_CHECK(msg32 != NULL);\n    ARG_CHECK(signature != NULL);\n    ARG_CHECK(pubkey != NULL);\n\n    secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature);\n    VERIFY_CHECK(recid >= 0 && recid < 4);  /* should have been caught in parse_compact */\n    secp256k1_scalar_set_b32(&m, msg32, NULL);\n    if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) {\n        secp256k1_pubkey_save(pubkey, &q);\n        return 1;\n    } else {\n        memset(pubkey, 0, sizeof(*pubkey));\n        return 0;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/modules/recovery/tests_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013-2015 Pieter Wuille                              *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_MODULE_RECOVERY_TESTS_\n#define _SECP256K1_MODULE_RECOVERY_TESTS_\n\nstatic int recovery_test_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {\n    (void) msg32;\n    (void) key32;\n    (void) algo16;\n    (void) data;\n\n    /* On the first run, return 0 to force a second run */\n    if (counter == 0) {\n        memset(nonce32, 0, 32);\n        return 1;\n    }\n    /* On the second run, return an overflow to force a third run */\n    if (counter == 1) {\n        memset(nonce32, 0xff, 32);\n        return 1;\n    }\n    /* On the next run, return a valid nonce, but flip a coin as to whether or not to fail signing. */\n    memset(nonce32, 1, 32);\n    return secp256k1_rand_bits(1);\n}\n\nvoid test_ecdsa_recovery_api(void) {\n    /* Setup contexts that just count errors */\n    secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE);\n    secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);\n    secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);\n    secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n    secp256k1_pubkey pubkey;\n    secp256k1_pubkey recpubkey;\n    secp256k1_ecdsa_signature normal_sig;\n    secp256k1_ecdsa_recoverable_signature recsig;\n    unsigned char privkey[32] = { 1 };\n    unsigned char message[32] = { 2 };\n    int32_t ecount = 0;\n    int recid = 0;\n    unsigned char sig[74];\n    unsigned char zero_privkey[32] = { 0 };\n    unsigned char over_privkey[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                                       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                                       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                                       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };\n\n    secp256k1_context_set_error_callback(none, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_error_callback(vrfy, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_error_callback(both, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_illegal_callback(none, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_illegal_callback(both, counting_illegal_callback_fn, &ecount);\n\n    /* Construct and verify corresponding public key. */\n    CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1);\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1);\n\n    /* Check bad contexts and NULLs for signing */\n    ecount = 0;\n    CHECK(secp256k1_ecdsa_sign_recoverable(none, &recsig, message, privkey, NULL, NULL) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ecdsa_sign_recoverable(sign, &recsig, message, privkey, NULL, NULL) == 1);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ecdsa_sign_recoverable(vrfy, &recsig, message, privkey, NULL, NULL) == 0);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, NULL, message, privkey, NULL, NULL) == 0);\n    CHECK(ecount == 3);\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, NULL, privkey, NULL, NULL) == 0);\n    CHECK(ecount == 4);\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, NULL, NULL, NULL) == 0);\n    CHECK(ecount == 5);\n    /* This will fail or succeed randomly, and in either case will not ARG_CHECK failure */\n    secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, recovery_test_nonce_function, NULL);\n    CHECK(ecount == 5);\n    /* These will all fail, but not in ARG_CHECK way */\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, zero_privkey, NULL, NULL) == 0);\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, over_privkey, NULL, NULL) == 0);\n    /* This one will succeed. */\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1);\n    CHECK(ecount == 5);\n\n    /* Check signing with a goofy nonce function */\n\n    /* Check bad contexts and NULLs for recovery */\n    ecount = 0;\n    CHECK(secp256k1_ecdsa_recover(none, &recpubkey, &recsig, message) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ecdsa_recover(sign, &recpubkey, &recsig, message) == 0);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdsa_recover(vrfy, &recpubkey, &recsig, message) == 1);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, message) == 1);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdsa_recover(both, NULL, &recsig, message) == 0);\n    CHECK(ecount == 3);\n    CHECK(secp256k1_ecdsa_recover(both, &recpubkey, NULL, message) == 0);\n    CHECK(ecount == 4);\n    CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, NULL) == 0);\n    CHECK(ecount == 5);\n\n    /* Check NULLs for conversion */\n    CHECK(secp256k1_ecdsa_sign(both, &normal_sig, message, privkey, NULL, NULL) == 1);\n    ecount = 0;\n    CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, NULL, &recsig) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, NULL) == 0);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, &recsig) == 1);\n\n    /* Check NULLs for de/serialization */\n    CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1);\n    ecount = 0;\n    CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, NULL, &recid, &recsig) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, NULL, &recsig) == 0);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, NULL) == 0);\n    CHECK(ecount == 3);\n    CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, &recsig) == 1);\n\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, NULL, sig, recid) == 0);\n    CHECK(ecount == 4);\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, NULL, recid) == 0);\n    CHECK(ecount == 5);\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, -1) == 0);\n    CHECK(ecount == 6);\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, 5) == 0);\n    CHECK(ecount == 7);\n    /* overflow in signature will fail but not affect ecount */\n    memcpy(sig, over_privkey, 32);\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, recid) == 0);\n    CHECK(ecount == 7);\n\n    /* cleanup */\n    secp256k1_context_destroy(none);\n    secp256k1_context_destroy(sign);\n    secp256k1_context_destroy(vrfy);\n    secp256k1_context_destroy(both);\n}\n\nvoid test_ecdsa_recovery_end_to_end(void) {\n    unsigned char extra[32] = {0x00};\n    unsigned char privkey[32];\n    unsigned char message[32];\n    secp256k1_ecdsa_signature signature[5];\n    secp256k1_ecdsa_recoverable_signature rsignature[5];\n    unsigned char sig[74];\n    secp256k1_pubkey pubkey;\n    secp256k1_pubkey recpubkey;\n    int recid = 0;\n\n    /* Generate a random key and message. */\n    {\n        secp256k1_scalar msg, key;\n        random_scalar_order_test(&msg);\n        random_scalar_order_test(&key);\n        secp256k1_scalar_get_b32(privkey, &key);\n        secp256k1_scalar_get_b32(message, &msg);\n    }\n\n    /* Construct and verify corresponding public key. */\n    CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1);\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1);\n\n    /* Serialize/parse compact and verify/recover. */\n    extra[0] = 0;\n    CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[0], message, privkey, NULL, NULL) == 1);\n    CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1);\n    CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[4], message, privkey, NULL, NULL) == 1);\n    CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[1], message, privkey, NULL, extra) == 1);\n    extra[31] = 1;\n    CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[2], message, privkey, NULL, extra) == 1);\n    extra[31] = 0;\n    extra[0] = 1;\n    CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[3], message, privkey, NULL, extra) == 1);\n    CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1);\n    CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1);\n    CHECK(memcmp(&signature[4], &signature[0], 64) == 0);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1);\n    memset(&rsignature[4], 0, sizeof(rsignature[4]));\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1);\n    CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1);\n    /* Parse compact (with recovery id) and recover. */\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1);\n    CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 1);\n    CHECK(memcmp(&pubkey, &recpubkey, sizeof(pubkey)) == 0);\n    /* Serialize/destroy/parse signature and verify again. */\n    CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1);\n    sig[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255);\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1);\n    CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 0);\n    /* Recover again */\n    CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 0 ||\n          memcmp(&pubkey, &recpubkey, sizeof(pubkey)) != 0);\n}\n\n/* Tests several edge cases. */\nvoid test_ecdsa_recovery_edge_cases(void) {\n    const unsigned char msg32[32] = {\n        'T', 'h', 'i', 's', ' ', 'i', 's', ' ',\n        'a', ' ', 'v', 'e', 'r', 'y', ' ', 's',\n        'e', 'c', 'r', 'e', 't', ' ', 'm', 'e',\n        's', 's', 'a', 'g', 'e', '.', '.', '.'\n    };\n    const unsigned char sig64[64] = {\n        /* Generated by signing the above message with nonce 'This is the nonce we will use...'\n         * and secret key 0 (which is not valid), resulting in recid 0. */\n        0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8,\n        0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96,\n        0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63,\n        0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32,\n        0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E,\n        0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD,\n        0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86,\n        0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57\n    };\n    secp256k1_pubkey pubkey;\n    /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */\n    const unsigned char sigb64[64] = {\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,\n    };\n    secp256k1_pubkey pubkeyb;\n    secp256k1_ecdsa_recoverable_signature rsig;\n    secp256k1_ecdsa_signature sig;\n    int recid;\n\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 0));\n    CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32));\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 1));\n    CHECK(secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32));\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 2));\n    CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32));\n    CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 3));\n    CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32));\n\n    for (recid = 0; recid < 4; recid++) {\n        int i;\n        int recid2;\n        /* (4,4) encoded in DER. */\n        unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04};\n        unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01};\n        unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00};\n        unsigned char sigbderalt1[39] = {\n            0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04,\n        };\n        unsigned char sigbderalt2[39] = {\n            0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,\n        };\n        unsigned char sigbderalt3[40] = {\n            0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04,\n        };\n        unsigned char sigbderalt4[40] = {\n            0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,\n        };\n        /* (order + r,4) encoded in DER. */\n        unsigned char sigbderlong[40] = {\n            0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF,\n            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n            0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC,\n            0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E,\n            0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04\n        };\n        CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid) == 1);\n        CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 1);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 1);\n        for (recid2 = 0; recid2 < 4; recid2++) {\n            secp256k1_pubkey pubkey2b;\n            CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid2) == 1);\n            CHECK(secp256k1_ecdsa_recover(ctx, &pubkey2b, &rsig, msg32) == 1);\n            /* Verifying with (order + r,4) should always fail. */\n            CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderlong, sizeof(sigbderlong)) == 1);\n            CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0);\n        }\n        /* DER parsing tests. */\n        /* Zero length r/s. */\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zr, sizeof(sigcder_zr)) == 0);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zs, sizeof(sigcder_zs)) == 0);\n        /* Leading zeros. */\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt1, sizeof(sigbderalt1)) == 0);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt2, sizeof(sigbderalt2)) == 0);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 0);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 0);\n        sigbderalt3[4] = 1;\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0);\n        sigbderalt4[7] = 1;\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0);\n        /* Damage signature. */\n        sigbder[7]++;\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0);\n        sigbder[7]--;\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, 6) == 0);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder) - 1) == 0);\n        for(i = 0; i < 8; i++) {\n            int c;\n            unsigned char orig = sigbder[i];\n            /*Try every single-byte change.*/\n            for (c = 0; c < 256; c++) {\n                if (c == orig ) {\n                    continue;\n                }\n                sigbder[i] = c;\n                CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 0 || secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0);\n            }\n            sigbder[i] = orig;\n        }\n    }\n\n    /* Test r/s equal to zero */\n    {\n        /* (1,1) encoded in DER. */\n        unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01};\n        unsigned char sigc64[64] = {\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n        };\n        secp256k1_pubkey pubkeyc;\n        CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1);\n        CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyc, &rsig, msg32) == 1);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 1);\n        sigcder[4] = 0;\n        sigc64[31] = 0;\n        CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1);\n        CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0);\n        sigcder[4] = 1;\n        sigcder[7] = 0;\n        sigc64[31] = 1;\n        sigc64[63] = 0;\n        CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1);\n        CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0);\n    }\n}\n\nvoid run_recovery_tests(void) {\n    int i;\n    for (i = 0; i < count; i++) {\n        test_ecdsa_recovery_api();\n    }\n    for (i = 0; i < 64*count; i++) {\n        test_ecdsa_recovery_end_to_end();\n    }\n    test_ecdsa_recovery_edge_cases();\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/num.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_NUM_\n#define _SECP256K1_NUM_\n\n#ifndef USE_NUM_NONE\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#if defined(USE_NUM_GMP)\n#include \"num_gmp.h\"\n#else\n#error \"Please select num implementation\"\n#endif\n\n/** Copy a number. */\nstatic void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a);\n\n/** Convert a number's absolute value to a binary big-endian string.\n *  There must be enough place. */\nstatic void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a);\n\n/** Set a number to the value of a binary big-endian string. */\nstatic void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen);\n\n/** Compute a modular inverse. The input must be less than the modulus. */\nstatic void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m);\n\n/** Compute the jacobi symbol (a|b). b must be positive and odd. */\nstatic int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b);\n\n/** Compare the absolute value of two numbers. */\nstatic int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b);\n\n/** Test whether two number are equal (including sign). */\nstatic int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b);\n\n/** Add two (signed) numbers. */\nstatic void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);\n\n/** Subtract two (signed) numbers. */\nstatic void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);\n\n/** Multiply two (signed) numbers. */\nstatic void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b);\n\n/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1,\n    even if r was negative. */\nstatic void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m);\n\n/** Right-shift the passed number by bits bits. */\nstatic void secp256k1_num_shift(secp256k1_num *r, int bits);\n\n/** Check whether a number is zero. */\nstatic int secp256k1_num_is_zero(const secp256k1_num *a);\n\n/** Check whether a number is one. */\nstatic int secp256k1_num_is_one(const secp256k1_num *a);\n\n/** Check whether a number is strictly negative. */\nstatic int secp256k1_num_is_neg(const secp256k1_num *a);\n\n/** Change a number's sign. */\nstatic void secp256k1_num_negate(secp256k1_num *r);\n\n#endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/num_gmp.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_NUM_REPR_\n#define _SECP256K1_NUM_REPR_\n\n#include <gmp.h>\n\n#define NUM_LIMBS ((256+GMP_NUMB_BITS-1)/GMP_NUMB_BITS)\n\ntypedef struct {\n    mp_limb_t data[2*NUM_LIMBS];\n    int neg;\n    int limbs;\n} secp256k1_num;\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/num_gmp_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_NUM_REPR_IMPL_H_\n#define _SECP256K1_NUM_REPR_IMPL_H_\n\n#include <string.h>\n#include <stdlib.h>\n#include <gmp.h>\n\n#include \"util.h\"\n#include \"num.h\"\n\n#ifdef VERIFY\nstatic void secp256k1_num_sanity(const secp256k1_num *a) {\n    VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0));\n}\n#else\n#define secp256k1_num_sanity(a) do { } while(0)\n#endif\n\nstatic void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a) {\n    *r = *a;\n}\n\nstatic void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a) {\n    unsigned char tmp[65];\n    int len = 0;\n    int shift = 0;\n    if (a->limbs>1 || a->data[0] != 0) {\n        len = mpn_get_str(tmp, 256, (mp_limb_t*)a->data, a->limbs);\n    }\n    while (shift < len && tmp[shift] == 0) shift++;\n    VERIFY_CHECK(len-shift <= (int)rlen);\n    memset(r, 0, rlen - len + shift);\n    if (len > shift) {\n        memcpy(r + rlen - len + shift, tmp + shift, len - shift);\n    }\n    memset(tmp, 0, sizeof(tmp));\n}\n\nstatic void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen) {\n    int len;\n    VERIFY_CHECK(alen > 0);\n    VERIFY_CHECK(alen <= 64);\n    len = mpn_set_str(r->data, a, alen, 256);\n    if (len == 0) {\n        r->data[0] = 0;\n        len = 1;\n    }\n    VERIFY_CHECK(len <= NUM_LIMBS*2);\n    r->limbs = len;\n    r->neg = 0;\n    while (r->limbs > 1 && r->data[r->limbs-1]==0) {\n        r->limbs--;\n    }\n}\n\nstatic void secp256k1_num_add_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) {\n    mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs);\n    r->limbs = a->limbs;\n    if (c != 0) {\n        VERIFY_CHECK(r->limbs < 2*NUM_LIMBS);\n        r->data[r->limbs++] = c;\n    }\n}\n\nstatic void secp256k1_num_sub_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) {\n    mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs);\n    (void)c;\n    VERIFY_CHECK(c == 0);\n    r->limbs = a->limbs;\n    while (r->limbs > 1 && r->data[r->limbs-1]==0) {\n        r->limbs--;\n    }\n}\n\nstatic void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m) {\n    secp256k1_num_sanity(r);\n    secp256k1_num_sanity(m);\n\n    if (r->limbs >= m->limbs) {\n        mp_limb_t t[2*NUM_LIMBS];\n        mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs);\n        memset(t, 0, sizeof(t));\n        r->limbs = m->limbs;\n        while (r->limbs > 1 && r->data[r->limbs-1]==0) {\n            r->limbs--;\n        }\n    }\n\n    if (r->neg && (r->limbs > 1 || r->data[0] != 0)) {\n        secp256k1_num_sub_abs(r, m, r);\n        r->neg = 0;\n    }\n}\n\nstatic void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m) {\n    int i;\n    mp_limb_t g[NUM_LIMBS+1];\n    mp_limb_t u[NUM_LIMBS+1];\n    mp_limb_t v[NUM_LIMBS+1];\n    mp_size_t sn;\n    mp_size_t gn;\n    secp256k1_num_sanity(a);\n    secp256k1_num_sanity(m);\n\n    /** mpn_gcdext computes: (G,S) = gcdext(U,V), where\n     *  * G = gcd(U,V)\n     *  * G = U*S + V*T\n     *  * U has equal or more limbs than V, and V has no padding\n     *  If we set U to be (a padded version of) a, and V = m:\n     *    G = a*S + m*T\n     *    G = a*S mod m\n     *  Assuming G=1:\n     *    S = 1/a mod m\n     */\n    VERIFY_CHECK(m->limbs <= NUM_LIMBS);\n    VERIFY_CHECK(m->data[m->limbs-1] != 0);\n    for (i = 0; i < m->limbs; i++) {\n        u[i] = (i < a->limbs) ? a->data[i] : 0;\n        v[i] = m->data[i];\n    }\n    sn = NUM_LIMBS+1;\n    gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs);\n    (void)gn;\n    VERIFY_CHECK(gn == 1);\n    VERIFY_CHECK(g[0] == 1);\n    r->neg = a->neg ^ m->neg;\n    if (sn < 0) {\n        mpn_sub(r->data, m->data, m->limbs, r->data, -sn);\n        r->limbs = m->limbs;\n        while (r->limbs > 1 && r->data[r->limbs-1]==0) {\n            r->limbs--;\n        }\n    } else {\n        r->limbs = sn;\n    }\n    memset(g, 0, sizeof(g));\n    memset(u, 0, sizeof(u));\n    memset(v, 0, sizeof(v));\n}\n\nstatic int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b) {\n    int ret;\n    mpz_t ga, gb;\n    secp256k1_num_sanity(a);\n    secp256k1_num_sanity(b);\n    VERIFY_CHECK(!b->neg && (b->limbs > 0) && (b->data[0] & 1));\n\n    mpz_inits(ga, gb, NULL);\n\n    mpz_import(gb, b->limbs, -1, sizeof(mp_limb_t), 0, 0, b->data);\n    mpz_import(ga, a->limbs, -1, sizeof(mp_limb_t), 0, 0, a->data);\n    if (a->neg) {\n        mpz_neg(ga, ga);\n    }\n\n    ret = mpz_jacobi(ga, gb);\n\n    mpz_clears(ga, gb, NULL);\n\n    return ret;\n}\n\nstatic int secp256k1_num_is_one(const secp256k1_num *a) {\n    return (a->limbs == 1 && a->data[0] == 1);\n}\n\nstatic int secp256k1_num_is_zero(const secp256k1_num *a) {\n    return (a->limbs == 1 && a->data[0] == 0);\n}\n\nstatic int secp256k1_num_is_neg(const secp256k1_num *a) {\n    return (a->limbs > 1 || a->data[0] != 0) && a->neg;\n}\n\nstatic int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b) {\n    if (a->limbs > b->limbs) {\n        return 1;\n    }\n    if (a->limbs < b->limbs) {\n        return -1;\n    }\n    return mpn_cmp(a->data, b->data, a->limbs);\n}\n\nstatic int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b) {\n    if (a->limbs > b->limbs) {\n        return 0;\n    }\n    if (a->limbs < b->limbs) {\n        return 0;\n    }\n    if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) {\n        return 0;\n    }\n    return mpn_cmp(a->data, b->data, a->limbs) == 0;\n}\n\nstatic void secp256k1_num_subadd(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b, int bneg) {\n    if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */\n        r->neg = a->neg;\n        if (a->limbs >= b->limbs) {\n            secp256k1_num_add_abs(r, a, b);\n        } else {\n            secp256k1_num_add_abs(r, b, a);\n        }\n    } else {\n        if (secp256k1_num_cmp(a, b) > 0) {\n            r->neg = a->neg;\n            secp256k1_num_sub_abs(r, a, b);\n        } else {\n            r->neg = b->neg ^ bneg;\n            secp256k1_num_sub_abs(r, b, a);\n        }\n    }\n}\n\nstatic void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) {\n    secp256k1_num_sanity(a);\n    secp256k1_num_sanity(b);\n    secp256k1_num_subadd(r, a, b, 0);\n}\n\nstatic void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) {\n    secp256k1_num_sanity(a);\n    secp256k1_num_sanity(b);\n    secp256k1_num_subadd(r, a, b, 1);\n}\n\nstatic void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) {\n    mp_limb_t tmp[2*NUM_LIMBS+1];\n    secp256k1_num_sanity(a);\n    secp256k1_num_sanity(b);\n\n    VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1);\n    if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) {\n        r->limbs = 1;\n        r->neg = 0;\n        r->data[0] = 0;\n        return;\n    }\n    if (a->limbs >= b->limbs) {\n        mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs);\n    } else {\n        mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs);\n    }\n    r->limbs = a->limbs + b->limbs;\n    if (r->limbs > 1 && tmp[r->limbs - 1]==0) {\n        r->limbs--;\n    }\n    VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS);\n    mpn_copyi(r->data, tmp, r->limbs);\n    r->neg = a->neg ^ b->neg;\n    memset(tmp, 0, sizeof(tmp));\n}\n\nstatic void secp256k1_num_shift(secp256k1_num *r, int bits) {\n    if (bits % GMP_NUMB_BITS) {\n        /* Shift within limbs. */\n        mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS);\n    }\n    if (bits >= GMP_NUMB_BITS) {\n        int i;\n        /* Shift full limbs. */\n        for (i = 0; i < r->limbs; i++) {\n            int index = i + (bits / GMP_NUMB_BITS);\n            if (index < r->limbs && index < 2*NUM_LIMBS) {\n                r->data[i] = r->data[index];\n            } else {\n                r->data[i] = 0;\n            }\n        }\n    }\n    while (r->limbs>1 && r->data[r->limbs-1]==0) {\n        r->limbs--;\n    }\n}\n\nstatic void secp256k1_num_negate(secp256k1_num *r) {\n    r->neg ^= 1;\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/num_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_NUM_IMPL_H_\n#define _SECP256K1_NUM_IMPL_H_\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#include \"num.h\"\n\n#if defined(USE_NUM_GMP)\n#include \"num_gmp_impl.h\"\n#elif defined(USE_NUM_NONE)\n/* Nothing. */\n#else\n#error \"Please select num implementation\"\n#endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_\n#define _SECP256K1_SCALAR_\n\n#include \"num.h\"\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#if defined(EXHAUSTIVE_TEST_ORDER)\n#include \"scalar_low.h\"\n#elif defined(USE_SCALAR_4X64)\n#include \"scalar_4x64.h\"\n#elif defined(USE_SCALAR_8X32)\n#include \"scalar_8x32.h\"\n#else\n#error \"Please select scalar implementation\"\n#endif\n\n/** Clear a scalar to prevent the leak of sensitive data. */\nstatic void secp256k1_scalar_clear(secp256k1_scalar *r);\n\n/** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */\nstatic unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count);\n\n/** Access bits from a scalar. Not constant time. */\nstatic unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count);\n\n/** Set a scalar from a big endian byte array. */\nstatic void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow);\n\n/** Set a scalar to an unsigned integer. */\nstatic void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v);\n\n/** Convert a scalar to a byte array. */\nstatic void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a);\n\n/** Add two scalars together (modulo the group order). Returns whether it overflowed. */\nstatic int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b);\n\n/** Conditionally add a power of two to a scalar. The result is not allowed to overflow. */\nstatic void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag);\n\n/** Multiply two scalars (modulo the group order). */\nstatic void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b);\n\n/** Shift a scalar right by some amount strictly between 0 and 16, returning\n *  the low bits that were shifted off */\nstatic int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n);\n\n/** Compute the square of a scalar (modulo the group order). */\nstatic void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a);\n\n/** Compute the inverse of a scalar (modulo the group order). */\nstatic void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a);\n\n/** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */\nstatic void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a);\n\n/** Compute the complement of a scalar (modulo the group order). */\nstatic void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a);\n\n/** Check whether a scalar equals zero. */\nstatic int secp256k1_scalar_is_zero(const secp256k1_scalar *a);\n\n/** Check whether a scalar equals one. */\nstatic int secp256k1_scalar_is_one(const secp256k1_scalar *a);\n\n/** Check whether a scalar, considered as an nonnegative integer, is even. */\nstatic int secp256k1_scalar_is_even(const secp256k1_scalar *a);\n\n/** Check whether a scalar is higher than the group order divided by 2. */\nstatic int secp256k1_scalar_is_high(const secp256k1_scalar *a);\n\n/** Conditionally negate a number, in constant time.\n * Returns -1 if the number was negated, 1 otherwise */\nstatic int secp256k1_scalar_cond_negate(secp256k1_scalar *a, int flag);\n\n#ifndef USE_NUM_NONE\n/** Convert a scalar to a number. */\nstatic void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a);\n\n/** Get the order of the group as a number. */\nstatic void secp256k1_scalar_order_get_num(secp256k1_num *r);\n#endif\n\n/** Compare two scalars. */\nstatic int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b);\n\n#ifdef USE_ENDOMORPHISM\n/** Find r1 and r2 such that r1+r2*2^128 = a. */\nstatic void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a);\n/** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */\nstatic void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a);\n#endif\n\n/** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */\nstatic void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar_4x64.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_REPR_\n#define _SECP256K1_SCALAR_REPR_\n\n#include <stdint.h>\n\n/** A scalar modulo the group order of the secp256k1 curve. */\ntypedef struct {\n    uint64_t d[4];\n} secp256k1_scalar;\n\n#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar_4x64_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_\n#define _SECP256K1_SCALAR_REPR_IMPL_H_\n\n/* Limbs of the secp256k1 order. */\n#define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL)\n#define SECP256K1_N_1 ((uint64_t)0xBAAEDCE6AF48A03BULL)\n#define SECP256K1_N_2 ((uint64_t)0xFFFFFFFFFFFFFFFEULL)\n#define SECP256K1_N_3 ((uint64_t)0xFFFFFFFFFFFFFFFFULL)\n\n/* Limbs of 2^256 minus the secp256k1 order. */\n#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1)\n#define SECP256K1_N_C_1 (~SECP256K1_N_1)\n#define SECP256K1_N_C_2 (1)\n\n/* Limbs of half the secp256k1 order. */\n#define SECP256K1_N_H_0 ((uint64_t)0xDFE92F46681B20A0ULL)\n#define SECP256K1_N_H_1 ((uint64_t)0x5D576E7357A4501DULL)\n#define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL)\n#define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL)\n\nSECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) {\n    r->d[0] = 0;\n    r->d[1] = 0;\n    r->d[2] = 0;\n    r->d[3] = 0;\n}\n\nSECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) {\n    r->d[0] = v;\n    r->d[1] = 0;\n    r->d[2] = 0;\n    r->d[3] = 0;\n}\n\nSECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {\n    VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6);\n    return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1);\n}\n\nSECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {\n    VERIFY_CHECK(count < 32);\n    VERIFY_CHECK(offset + count <= 256);\n    if ((offset + count - 1) >> 6 == offset >> 6) {\n        return secp256k1_scalar_get_bits(a, offset, count);\n    } else {\n        VERIFY_CHECK((offset >> 6) + 1 < 4);\n        return ((a->d[offset >> 6] >> (offset & 0x3F)) | (a->d[(offset >> 6) + 1] << (64 - (offset & 0x3F)))) & ((((uint64_t)1) << count) - 1);\n    }\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) {\n    int yes = 0;\n    int no = 0;\n    no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */\n    no |= (a->d[2] < SECP256K1_N_2);\n    yes |= (a->d[2] > SECP256K1_N_2) & ~no;\n    no |= (a->d[1] < SECP256K1_N_1);\n    yes |= (a->d[1] > SECP256K1_N_1) & ~no;\n    yes |= (a->d[0] >= SECP256K1_N_0) & ~no;\n    return yes;\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigned int overflow) {\n    uint128_t t;\n    VERIFY_CHECK(overflow <= 1);\n    t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0;\n    r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)r->d[1] + overflow * SECP256K1_N_C_1;\n    r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)r->d[2] + overflow * SECP256K1_N_C_2;\n    r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint64_t)r->d[3];\n    r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL;\n    return overflow;\n}\n\nstatic int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    int overflow;\n    uint128_t t = (uint128_t)a->d[0] + b->d[0];\n    r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)a->d[1] + b->d[1];\n    r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)a->d[2] + b->d[2];\n    r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)a->d[3] + b->d[3];\n    r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    overflow = t + secp256k1_scalar_check_overflow(r);\n    VERIFY_CHECK(overflow == 0 || overflow == 1);\n    secp256k1_scalar_reduce(r, overflow);\n    return overflow;\n}\n\nstatic void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {\n    uint128_t t;\n    VERIFY_CHECK(bit < 256);\n    bit += ((uint32_t) flag - 1) & 0x100;  /* forcing (bit >> 6) > 3 makes this a noop */\n    t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F));\n    r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F));\n    r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)r->d[2] + (((uint64_t)((bit >> 6) == 2)) << (bit & 0x3F));\n    r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64;\n    t += (uint128_t)r->d[3] + (((uint64_t)((bit >> 6) == 3)) << (bit & 0x3F));\n    r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL;\n#ifdef VERIFY\n    VERIFY_CHECK((t >> 64) == 0);\n    VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0);\n#endif\n}\n\nstatic void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {\n    int over;\n    r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56;\n    r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56;\n    r->d[2] = (uint64_t)b32[15] | (uint64_t)b32[14] << 8 | (uint64_t)b32[13] << 16 | (uint64_t)b32[12] << 24 | (uint64_t)b32[11] << 32 | (uint64_t)b32[10] << 40 | (uint64_t)b32[9] << 48 | (uint64_t)b32[8] << 56;\n    r->d[3] = (uint64_t)b32[7] | (uint64_t)b32[6] << 8 | (uint64_t)b32[5] << 16 | (uint64_t)b32[4] << 24 | (uint64_t)b32[3] << 32 | (uint64_t)b32[2] << 40 | (uint64_t)b32[1] << 48 | (uint64_t)b32[0] << 56;\n    over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r));\n    if (overflow) {\n        *overflow = over;\n    }\n}\n\nstatic void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {\n    bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3];\n    bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2];\n    bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1];\n    bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0];\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {\n    return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0;\n}\n\nstatic void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {\n    uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0);\n    uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1;\n    r->d[0] = t & nonzero; t >>= 64;\n    t += (uint128_t)(~a->d[1]) + SECP256K1_N_1;\n    r->d[1] = t & nonzero; t >>= 64;\n    t += (uint128_t)(~a->d[2]) + SECP256K1_N_2;\n    r->d[2] = t & nonzero; t >>= 64;\n    t += (uint128_t)(~a->d[3]) + SECP256K1_N_3;\n    r->d[3] = t & nonzero;\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {\n    return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0;\n}\n\nstatic int secp256k1_scalar_is_high(const secp256k1_scalar *a) {\n    int yes = 0;\n    int no = 0;\n    no |= (a->d[3] < SECP256K1_N_H_3);\n    yes |= (a->d[3] > SECP256K1_N_H_3) & ~no;\n    no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; /* No need for a > check. */\n    no |= (a->d[1] < SECP256K1_N_H_1) & ~yes;\n    yes |= (a->d[1] > SECP256K1_N_H_1) & ~no;\n    yes |= (a->d[0] > SECP256K1_N_H_0) & ~no;\n    return yes;\n}\n\nstatic int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {\n    /* If we are flag = 0, mask = 00...00 and this is a no-op;\n     * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */\n    uint64_t mask = !flag - 1;\n    uint64_t nonzero = (secp256k1_scalar_is_zero(r) != 0) - 1;\n    uint128_t t = (uint128_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask);\n    r->d[0] = t & nonzero; t >>= 64;\n    t += (uint128_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask);\n    r->d[1] = t & nonzero; t >>= 64;\n    t += (uint128_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask);\n    r->d[2] = t & nonzero; t >>= 64;\n    t += (uint128_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask);\n    r->d[3] = t & nonzero;\n    return 2 * (mask == 0) - 1;\n}\n\n/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */\n\n/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */\n#define muladd(a,b) { \\\n    uint64_t tl, th; \\\n    { \\\n        uint128_t t = (uint128_t)a * b; \\\n        th = t >> 64;         /* at most 0xFFFFFFFFFFFFFFFE */ \\\n        tl = t; \\\n    } \\\n    c0 += tl;                 /* overflow is handled on the next line */ \\\n    th += (c0 < tl) ? 1 : 0;  /* at most 0xFFFFFFFFFFFFFFFF */ \\\n    c1 += th;                 /* overflow is handled on the next line */ \\\n    c2 += (c1 < th) ? 1 : 0;  /* never overflows by contract (verified in the next line) */ \\\n    VERIFY_CHECK((c1 >= th) || (c2 != 0)); \\\n}\n\n/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */\n#define muladd_fast(a,b) { \\\n    uint64_t tl, th; \\\n    { \\\n        uint128_t t = (uint128_t)a * b; \\\n        th = t >> 64;         /* at most 0xFFFFFFFFFFFFFFFE */ \\\n        tl = t; \\\n    } \\\n    c0 += tl;                 /* overflow is handled on the next line */ \\\n    th += (c0 < tl) ? 1 : 0;  /* at most 0xFFFFFFFFFFFFFFFF */ \\\n    c1 += th;                 /* never overflows by contract (verified in the next line) */ \\\n    VERIFY_CHECK(c1 >= th); \\\n}\n\n/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */\n#define muladd2(a,b) { \\\n    uint64_t tl, th, th2, tl2; \\\n    { \\\n        uint128_t t = (uint128_t)a * b; \\\n        th = t >> 64;               /* at most 0xFFFFFFFFFFFFFFFE */ \\\n        tl = t; \\\n    } \\\n    th2 = th + th;                  /* at most 0xFFFFFFFFFFFFFFFE (in case th was 0x7FFFFFFFFFFFFFFF) */ \\\n    c2 += (th2 < th) ? 1 : 0;       /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((th2 >= th) || (c2 != 0)); \\\n    tl2 = tl + tl;                  /* at most 0xFFFFFFFFFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFFFFFFFFFF) */ \\\n    th2 += (tl2 < tl) ? 1 : 0;      /* at most 0xFFFFFFFFFFFFFFFF */ \\\n    c0 += tl2;                      /* overflow is handled on the next line */ \\\n    th2 += (c0 < tl2) ? 1 : 0;      /* second overflow is handled on the next line */ \\\n    c2 += (c0 < tl2) & (th2 == 0);  /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \\\n    c1 += th2;                      /* overflow is handled on the next line */ \\\n    c2 += (c1 < th2) ? 1 : 0;       /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \\\n}\n\n/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */\n#define sumadd(a) { \\\n    unsigned int over; \\\n    c0 += (a);                  /* overflow is handled on the next line */ \\\n    over = (c0 < (a)) ? 1 : 0; \\\n    c1 += over;                 /* overflow is handled on the next line */ \\\n    c2 += (c1 < over) ? 1 : 0;  /* never overflows by contract */ \\\n}\n\n/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */\n#define sumadd_fast(a) { \\\n    c0 += (a);                 /* overflow is handled on the next line */ \\\n    c1 += (c0 < (a)) ? 1 : 0;  /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \\\n    VERIFY_CHECK(c2 == 0); \\\n}\n\n/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. */\n#define extract(n) { \\\n    (n) = c0; \\\n    c0 = c1; \\\n    c1 = c2; \\\n    c2 = 0; \\\n}\n\n/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. c2 is required to be zero. */\n#define extract_fast(n) { \\\n    (n) = c0; \\\n    c0 = c1; \\\n    c1 = 0; \\\n    VERIFY_CHECK(c2 == 0); \\\n}\n\nstatic void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint64_t *l) {\n#ifdef USE_ASM_X86_64\n    /* Reduce 512 bits into 385. */\n    uint64_t m0, m1, m2, m3, m4, m5, m6;\n    uint64_t p0, p1, p2, p3, p4;\n    uint64_t c;\n\n    __asm__ __volatile__(\n    /* Preload. */\n    \"movq 32(%%rsi), %%r11\\n\"\n    \"movq 40(%%rsi), %%r12\\n\"\n    \"movq 48(%%rsi), %%r13\\n\"\n    \"movq 56(%%rsi), %%r14\\n\"\n    /* Initialize r8,r9,r10 */\n    \"movq 0(%%rsi), %%r8\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    \"xorq %%r10, %%r10\\n\"\n    /* (r8,r9) += n0 * c0 */\n    \"movq %8, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    /* extract m0 */\n    \"movq %%r8, %q0\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r10) += l1 */\n    \"addq 8(%%rsi), %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r9,r10,r8) += n1 * c0 */\n    \"movq %8, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r10,r8) += n0 * c1 */\n    \"movq %9, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* extract m1 */\n    \"movq %%r9, %q1\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    /* (r10,r8,r9) += l2 */\n    \"addq 16(%%rsi), %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += n2 * c0 */\n    \"movq %8, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += n1 * c1 */\n    \"movq %9, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += n0 */\n    \"addq %%r11, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* extract m2 */\n    \"movq %%r10, %q2\\n\"\n    \"xorq %%r10, %%r10\\n\"\n    /* (r8,r9,r10) += l3 */\n    \"addq 24(%%rsi), %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r8,r9,r10) += n3 * c0 */\n    \"movq %8, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r8,r9,r10) += n2 * c1 */\n    \"movq %9, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r8,r9,r10) += n1 */\n    \"addq %%r12, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* extract m3 */\n    \"movq %%r8, %q3\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r10,r8) += n3 * c1 */\n    \"movq %9, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r10,r8) += n2 */\n    \"addq %%r13, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* extract m4 */\n    \"movq %%r9, %q4\\n\"\n    /* (r10,r8) += n3 */\n    \"addq %%r14, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* extract m5 */\n    \"movq %%r10, %q5\\n\"\n    /* extract m6 */\n    \"movq %%r8, %q6\\n\"\n    : \"=g\"(m0), \"=g\"(m1), \"=g\"(m2), \"=g\"(m3), \"=g\"(m4), \"=g\"(m5), \"=g\"(m6)\n    : \"S\"(l), \"n\"(SECP256K1_N_C_0), \"n\"(SECP256K1_N_C_1)\n    : \"rax\", \"rdx\", \"r8\", \"r9\", \"r10\", \"r11\", \"r12\", \"r13\", \"r14\", \"cc\");\n\n    /* Reduce 385 bits into 258. */\n    __asm__ __volatile__(\n    /* Preload */\n    \"movq %q9, %%r11\\n\"\n    \"movq %q10, %%r12\\n\"\n    \"movq %q11, %%r13\\n\"\n    /* Initialize (r8,r9,r10) */\n    \"movq %q5, %%r8\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    \"xorq %%r10, %%r10\\n\"\n    /* (r8,r9) += m4 * c0 */\n    \"movq %12, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    /* extract p0 */\n    \"movq %%r8, %q0\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r10) += m1 */\n    \"addq %q6, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r9,r10,r8) += m5 * c0 */\n    \"movq %12, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r10,r8) += m4 * c1 */\n    \"movq %13, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* extract p1 */\n    \"movq %%r9, %q1\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    /* (r10,r8,r9) += m2 */\n    \"addq %q7, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += m6 * c0 */\n    \"movq %12, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += m5 * c1 */\n    \"movq %13, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += m4 */\n    \"addq %%r11, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* extract p2 */\n    \"movq %%r10, %q2\\n\"\n    /* (r8,r9) += m3 */\n    \"addq %q8, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r8,r9) += m6 * c1 */\n    \"movq %13, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    /* (r8,r9) += m5 */\n    \"addq %%r12, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* extract p3 */\n    \"movq %%r8, %q3\\n\"\n    /* (r9) += m6 */\n    \"addq %%r13, %%r9\\n\"\n    /* extract p4 */\n    \"movq %%r9, %q4\\n\"\n    : \"=&g\"(p0), \"=&g\"(p1), \"=&g\"(p2), \"=g\"(p3), \"=g\"(p4)\n    : \"g\"(m0), \"g\"(m1), \"g\"(m2), \"g\"(m3), \"g\"(m4), \"g\"(m5), \"g\"(m6), \"n\"(SECP256K1_N_C_0), \"n\"(SECP256K1_N_C_1)\n    : \"rax\", \"rdx\", \"r8\", \"r9\", \"r10\", \"r11\", \"r12\", \"r13\", \"cc\");\n\n    /* Reduce 258 bits into 256. */\n    __asm__ __volatile__(\n    /* Preload */\n    \"movq %q5, %%r10\\n\"\n    /* (rax,rdx) = p4 * c0 */\n    \"movq %7, %%rax\\n\"\n    \"mulq %%r10\\n\"\n    /* (rax,rdx) += p0 */\n    \"addq %q1, %%rax\\n\"\n    \"adcq $0, %%rdx\\n\"\n    /* extract r0 */\n    \"movq %%rax, 0(%q6)\\n\"\n    /* Move to (r8,r9) */\n    \"movq %%rdx, %%r8\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    /* (r8,r9) += p1 */\n    \"addq %q2, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r8,r9) += p4 * c1 */\n    \"movq %8, %%rax\\n\"\n    \"mulq %%r10\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    /* Extract r1 */\n    \"movq %%r8, 8(%q6)\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r8) += p4 */\n    \"addq %%r10, %%r9\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r8) += p2 */\n    \"addq %q3, %%r9\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* Extract r2 */\n    \"movq %%r9, 16(%q6)\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    /* (r8,r9) += p3 */\n    \"addq %q4, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* Extract r3 */\n    \"movq %%r8, 24(%q6)\\n\"\n    /* Extract c */\n    \"movq %%r9, %q0\\n\"\n    : \"=g\"(c)\n    : \"g\"(p0), \"g\"(p1), \"g\"(p2), \"g\"(p3), \"g\"(p4), \"D\"(r), \"n\"(SECP256K1_N_C_0), \"n\"(SECP256K1_N_C_1)\n    : \"rax\", \"rdx\", \"r8\", \"r9\", \"r10\", \"cc\", \"memory\");\n#else\n    uint128_t c;\n    uint64_t c0, c1, c2;\n    uint64_t n0 = l[4], n1 = l[5], n2 = l[6], n3 = l[7];\n    uint64_t m0, m1, m2, m3, m4, m5;\n    uint32_t m6;\n    uint64_t p0, p1, p2, p3;\n    uint32_t p4;\n\n    /* Reduce 512 bits into 385. */\n    /* m[0..6] = l[0..3] + n[0..3] * SECP256K1_N_C. */\n    c0 = l[0]; c1 = 0; c2 = 0;\n    muladd_fast(n0, SECP256K1_N_C_0);\n    extract_fast(m0);\n    sumadd_fast(l[1]);\n    muladd(n1, SECP256K1_N_C_0);\n    muladd(n0, SECP256K1_N_C_1);\n    extract(m1);\n    sumadd(l[2]);\n    muladd(n2, SECP256K1_N_C_0);\n    muladd(n1, SECP256K1_N_C_1);\n    sumadd(n0);\n    extract(m2);\n    sumadd(l[3]);\n    muladd(n3, SECP256K1_N_C_0);\n    muladd(n2, SECP256K1_N_C_1);\n    sumadd(n1);\n    extract(m3);\n    muladd(n3, SECP256K1_N_C_1);\n    sumadd(n2);\n    extract(m4);\n    sumadd_fast(n3);\n    extract_fast(m5);\n    VERIFY_CHECK(c0 <= 1);\n    m6 = c0;\n\n    /* Reduce 385 bits into 258. */\n    /* p[0..4] = m[0..3] + m[4..6] * SECP256K1_N_C. */\n    c0 = m0; c1 = 0; c2 = 0;\n    muladd_fast(m4, SECP256K1_N_C_0);\n    extract_fast(p0);\n    sumadd_fast(m1);\n    muladd(m5, SECP256K1_N_C_0);\n    muladd(m4, SECP256K1_N_C_1);\n    extract(p1);\n    sumadd(m2);\n    muladd(m6, SECP256K1_N_C_0);\n    muladd(m5, SECP256K1_N_C_1);\n    sumadd(m4);\n    extract(p2);\n    sumadd_fast(m3);\n    muladd_fast(m6, SECP256K1_N_C_1);\n    sumadd_fast(m5);\n    extract_fast(p3);\n    p4 = c0 + m6;\n    VERIFY_CHECK(p4 <= 2);\n\n    /* Reduce 258 bits into 256. */\n    /* r[0..3] = p[0..3] + p[4] * SECP256K1_N_C. */\n    c = p0 + (uint128_t)SECP256K1_N_C_0 * p4;\n    r->d[0] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64;\n    c += p1 + (uint128_t)SECP256K1_N_C_1 * p4;\n    r->d[1] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64;\n    c += p2 + (uint128_t)p4;\n    r->d[2] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64;\n    c += p3;\n    r->d[3] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64;\n#endif\n\n    /* Final reduction of r. */\n    secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r));\n}\n\nstatic void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, const secp256k1_scalar *b) {\n#ifdef USE_ASM_X86_64\n    const uint64_t *pb = b->d;\n    __asm__ __volatile__(\n    /* Preload */\n    \"movq 0(%%rdi), %%r15\\n\"\n    \"movq 8(%%rdi), %%rbx\\n\"\n    \"movq 16(%%rdi), %%rcx\\n\"\n    \"movq 0(%%rdx), %%r11\\n\"\n    \"movq 8(%%rdx), %%r12\\n\"\n    \"movq 16(%%rdx), %%r13\\n\"\n    \"movq 24(%%rdx), %%r14\\n\"\n    /* (rax,rdx) = a0 * b0 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    /* Extract l0 */\n    \"movq %%rax, 0(%%rsi)\\n\"\n    /* (r8,r9,r10) = (rdx) */\n    \"movq %%rdx, %%r8\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    \"xorq %%r10, %%r10\\n\"\n    /* (r8,r9,r10) += a0 * b1 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r8,r9,r10) += a1 * b0 */\n    \"movq %%rbx, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* Extract l1 */\n    \"movq %%r8, 8(%%rsi)\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r10,r8) += a0 * b2 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r10,r8) += a1 * b1 */\n    \"movq %%rbx, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r10,r8) += a2 * b0 */\n    \"movq %%rcx, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* Extract l2 */\n    \"movq %%r9, 16(%%rsi)\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    /* (r10,r8,r9) += a0 * b3 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* Preload a3 */\n    \"movq 24(%%rdi), %%r15\\n\"\n    /* (r10,r8,r9) += a1 * b2 */\n    \"movq %%rbx, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += a2 * b1 */\n    \"movq %%rcx, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += a3 * b0 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* Extract l3 */\n    \"movq %%r10, 24(%%rsi)\\n\"\n    \"xorq %%r10, %%r10\\n\"\n    /* (r8,r9,r10) += a1 * b3 */\n    \"movq %%rbx, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r8,r9,r10) += a2 * b2 */\n    \"movq %%rcx, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r8,r9,r10) += a3 * b1 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* Extract l4 */\n    \"movq %%r8, 32(%%rsi)\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r10,r8) += a2 * b3 */\n    \"movq %%rcx, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r10,r8) += a3 * b2 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* Extract l5 */\n    \"movq %%r9, 40(%%rsi)\\n\"\n    /* (r10,r8) += a3 * b3 */\n    \"movq %%r15, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    /* Extract l6 */\n    \"movq %%r10, 48(%%rsi)\\n\"\n    /* Extract l7 */\n    \"movq %%r8, 56(%%rsi)\\n\"\n    : \"+d\"(pb)\n    : \"S\"(l), \"D\"(a->d)\n    : \"rax\", \"rbx\", \"rcx\", \"r8\", \"r9\", \"r10\", \"r11\", \"r12\", \"r13\", \"r14\", \"r15\", \"cc\", \"memory\");\n#else\n    /* 160 bit accumulator. */\n    uint64_t c0 = 0, c1 = 0;\n    uint32_t c2 = 0;\n\n    /* l[0..7] = a[0..3] * b[0..3]. */\n    muladd_fast(a->d[0], b->d[0]);\n    extract_fast(l[0]);\n    muladd(a->d[0], b->d[1]);\n    muladd(a->d[1], b->d[0]);\n    extract(l[1]);\n    muladd(a->d[0], b->d[2]);\n    muladd(a->d[1], b->d[1]);\n    muladd(a->d[2], b->d[0]);\n    extract(l[2]);\n    muladd(a->d[0], b->d[3]);\n    muladd(a->d[1], b->d[2]);\n    muladd(a->d[2], b->d[1]);\n    muladd(a->d[3], b->d[0]);\n    extract(l[3]);\n    muladd(a->d[1], b->d[3]);\n    muladd(a->d[2], b->d[2]);\n    muladd(a->d[3], b->d[1]);\n    extract(l[4]);\n    muladd(a->d[2], b->d[3]);\n    muladd(a->d[3], b->d[2]);\n    extract(l[5]);\n    muladd_fast(a->d[3], b->d[3]);\n    extract_fast(l[6]);\n    VERIFY_CHECK(c1 == 0);\n    l[7] = c0;\n#endif\n}\n\nstatic void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar *a) {\n#ifdef USE_ASM_X86_64\n    __asm__ __volatile__(\n    /* Preload */\n    \"movq 0(%%rdi), %%r11\\n\"\n    \"movq 8(%%rdi), %%r12\\n\"\n    \"movq 16(%%rdi), %%r13\\n\"\n    \"movq 24(%%rdi), %%r14\\n\"\n    /* (rax,rdx) = a0 * a0 */\n    \"movq %%r11, %%rax\\n\"\n    \"mulq %%r11\\n\"\n    /* Extract l0 */\n    \"movq %%rax, 0(%%rsi)\\n\"\n    /* (r8,r9,r10) = (rdx,0) */\n    \"movq %%rdx, %%r8\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    \"xorq %%r10, %%r10\\n\"\n    /* (r8,r9,r10) += 2 * a0 * a1 */\n    \"movq %%r11, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* Extract l1 */\n    \"movq %%r8, 8(%%rsi)\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r10,r8) += 2 * a0 * a2 */\n    \"movq %%r11, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* (r9,r10,r8) += a1 * a1 */\n    \"movq %%r12, %%rax\\n\"\n    \"mulq %%r12\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* Extract l2 */\n    \"movq %%r9, 16(%%rsi)\\n\"\n    \"xorq %%r9, %%r9\\n\"\n    /* (r10,r8,r9) += 2 * a0 * a3 */\n    \"movq %%r11, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* (r10,r8,r9) += 2 * a1 * a2 */\n    \"movq %%r12, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    \"adcq $0, %%r9\\n\"\n    /* Extract l3 */\n    \"movq %%r10, 24(%%rsi)\\n\"\n    \"xorq %%r10, %%r10\\n\"\n    /* (r8,r9,r10) += 2 * a1 * a3 */\n    \"movq %%r12, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* (r8,r9,r10) += a2 * a2 */\n    \"movq %%r13, %%rax\\n\"\n    \"mulq %%r13\\n\"\n    \"addq %%rax, %%r8\\n\"\n    \"adcq %%rdx, %%r9\\n\"\n    \"adcq $0, %%r10\\n\"\n    /* Extract l4 */\n    \"movq %%r8, 32(%%rsi)\\n\"\n    \"xorq %%r8, %%r8\\n\"\n    /* (r9,r10,r8) += 2 * a2 * a3 */\n    \"movq %%r13, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    \"addq %%rax, %%r9\\n\"\n    \"adcq %%rdx, %%r10\\n\"\n    \"adcq $0, %%r8\\n\"\n    /* Extract l5 */\n    \"movq %%r9, 40(%%rsi)\\n\"\n    /* (r10,r8) += a3 * a3 */\n    \"movq %%r14, %%rax\\n\"\n    \"mulq %%r14\\n\"\n    \"addq %%rax, %%r10\\n\"\n    \"adcq %%rdx, %%r8\\n\"\n    /* Extract l6 */\n    \"movq %%r10, 48(%%rsi)\\n\"\n    /* Extract l7 */\n    \"movq %%r8, 56(%%rsi)\\n\"\n    :\n    : \"S\"(l), \"D\"(a->d)\n    : \"rax\", \"rdx\", \"r8\", \"r9\", \"r10\", \"r11\", \"r12\", \"r13\", \"r14\", \"cc\", \"memory\");\n#else\n    /* 160 bit accumulator. */\n    uint64_t c0 = 0, c1 = 0;\n    uint32_t c2 = 0;\n\n    /* l[0..7] = a[0..3] * b[0..3]. */\n    muladd_fast(a->d[0], a->d[0]);\n    extract_fast(l[0]);\n    muladd2(a->d[0], a->d[1]);\n    extract(l[1]);\n    muladd2(a->d[0], a->d[2]);\n    muladd(a->d[1], a->d[1]);\n    extract(l[2]);\n    muladd2(a->d[0], a->d[3]);\n    muladd2(a->d[1], a->d[2]);\n    extract(l[3]);\n    muladd2(a->d[1], a->d[3]);\n    muladd(a->d[2], a->d[2]);\n    extract(l[4]);\n    muladd2(a->d[2], a->d[3]);\n    extract(l[5]);\n    muladd_fast(a->d[3], a->d[3]);\n    extract_fast(l[6]);\n    VERIFY_CHECK(c1 == 0);\n    l[7] = c0;\n#endif\n}\n\n#undef sumadd\n#undef sumadd_fast\n#undef muladd\n#undef muladd_fast\n#undef muladd2\n#undef extract\n#undef extract_fast\n\nstatic void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    uint64_t l[8];\n    secp256k1_scalar_mul_512(l, a, b);\n    secp256k1_scalar_reduce_512(r, l);\n}\n\nstatic int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) {\n    int ret;\n    VERIFY_CHECK(n > 0);\n    VERIFY_CHECK(n < 16);\n    ret = r->d[0] & ((1 << n) - 1);\n    r->d[0] = (r->d[0] >> n) + (r->d[1] << (64 - n));\n    r->d[1] = (r->d[1] >> n) + (r->d[2] << (64 - n));\n    r->d[2] = (r->d[2] >> n) + (r->d[3] << (64 - n));\n    r->d[3] = (r->d[3] >> n);\n    return ret;\n}\n\nstatic void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) {\n    uint64_t l[8];\n    secp256k1_scalar_sqr_512(l, a);\n    secp256k1_scalar_reduce_512(r, l);\n}\n\n#ifdef USE_ENDOMORPHISM\nstatic void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {\n    r1->d[0] = a->d[0];\n    r1->d[1] = a->d[1];\n    r1->d[2] = 0;\n    r1->d[3] = 0;\n    r2->d[0] = a->d[2];\n    r2->d[1] = a->d[3];\n    r2->d[2] = 0;\n    r2->d[3] = 0;\n}\n#endif\n\nSECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0;\n}\n\nSECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) {\n    uint64_t l[8];\n    unsigned int shiftlimbs;\n    unsigned int shiftlow;\n    unsigned int shifthigh;\n    VERIFY_CHECK(shift >= 256);\n    secp256k1_scalar_mul_512(l, a, b);\n    shiftlimbs = shift >> 6;\n    shiftlow = shift & 0x3F;\n    shifthigh = 64 - shiftlow;\n    r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0;\n    secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1);\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar_8x32.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_REPR_\n#define _SECP256K1_SCALAR_REPR_\n\n#include <stdint.h>\n\n/** A scalar modulo the group order of the secp256k1 curve. */\ntypedef struct {\n    uint32_t d[8];\n} secp256k1_scalar;\n\n#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar_8x32_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_\n#define _SECP256K1_SCALAR_REPR_IMPL_H_\n\n/* Limbs of the secp256k1 order. */\n#define SECP256K1_N_0 ((uint32_t)0xD0364141UL)\n#define SECP256K1_N_1 ((uint32_t)0xBFD25E8CUL)\n#define SECP256K1_N_2 ((uint32_t)0xAF48A03BUL)\n#define SECP256K1_N_3 ((uint32_t)0xBAAEDCE6UL)\n#define SECP256K1_N_4 ((uint32_t)0xFFFFFFFEUL)\n#define SECP256K1_N_5 ((uint32_t)0xFFFFFFFFUL)\n#define SECP256K1_N_6 ((uint32_t)0xFFFFFFFFUL)\n#define SECP256K1_N_7 ((uint32_t)0xFFFFFFFFUL)\n\n/* Limbs of 2^256 minus the secp256k1 order. */\n#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1)\n#define SECP256K1_N_C_1 (~SECP256K1_N_1)\n#define SECP256K1_N_C_2 (~SECP256K1_N_2)\n#define SECP256K1_N_C_3 (~SECP256K1_N_3)\n#define SECP256K1_N_C_4 (1)\n\n/* Limbs of half the secp256k1 order. */\n#define SECP256K1_N_H_0 ((uint32_t)0x681B20A0UL)\n#define SECP256K1_N_H_1 ((uint32_t)0xDFE92F46UL)\n#define SECP256K1_N_H_2 ((uint32_t)0x57A4501DUL)\n#define SECP256K1_N_H_3 ((uint32_t)0x5D576E73UL)\n#define SECP256K1_N_H_4 ((uint32_t)0xFFFFFFFFUL)\n#define SECP256K1_N_H_5 ((uint32_t)0xFFFFFFFFUL)\n#define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL)\n#define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL)\n\nSECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) {\n    r->d[0] = 0;\n    r->d[1] = 0;\n    r->d[2] = 0;\n    r->d[3] = 0;\n    r->d[4] = 0;\n    r->d[5] = 0;\n    r->d[6] = 0;\n    r->d[7] = 0;\n}\n\nSECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) {\n    r->d[0] = v;\n    r->d[1] = 0;\n    r->d[2] = 0;\n    r->d[3] = 0;\n    r->d[4] = 0;\n    r->d[5] = 0;\n    r->d[6] = 0;\n    r->d[7] = 0;\n}\n\nSECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {\n    VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5);\n    return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1);\n}\n\nSECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {\n    VERIFY_CHECK(count < 32);\n    VERIFY_CHECK(offset + count <= 256);\n    if ((offset + count - 1) >> 5 == offset >> 5) {\n        return secp256k1_scalar_get_bits(a, offset, count);\n    } else {\n        VERIFY_CHECK((offset >> 5) + 1 < 8);\n        return ((a->d[offset >> 5] >> (offset & 0x1F)) | (a->d[(offset >> 5) + 1] << (32 - (offset & 0x1F)))) & ((((uint32_t)1) << count) - 1);\n    }\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) {\n    int yes = 0;\n    int no = 0;\n    no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */\n    no |= (a->d[6] < SECP256K1_N_6); /* No need for a > check. */\n    no |= (a->d[5] < SECP256K1_N_5); /* No need for a > check. */\n    no |= (a->d[4] < SECP256K1_N_4);\n    yes |= (a->d[4] > SECP256K1_N_4) & ~no;\n    no |= (a->d[3] < SECP256K1_N_3) & ~yes;\n    yes |= (a->d[3] > SECP256K1_N_3) & ~no;\n    no |= (a->d[2] < SECP256K1_N_2) & ~yes;\n    yes |= (a->d[2] > SECP256K1_N_2) & ~no;\n    no |= (a->d[1] < SECP256K1_N_1) & ~yes;\n    yes |= (a->d[1] > SECP256K1_N_1) & ~no;\n    yes |= (a->d[0] >= SECP256K1_N_0) & ~no;\n    return yes;\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, uint32_t overflow) {\n    uint64_t t;\n    VERIFY_CHECK(overflow <= 1);\n    t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0;\n    r->d[0] = t & 0xFFFFFFFFUL; t >>= 32;\n    t += (uint64_t)r->d[1] + overflow * SECP256K1_N_C_1;\n    r->d[1] = t & 0xFFFFFFFFUL; t >>= 32;\n    t += (uint64_t)r->d[2] + overflow * SECP256K1_N_C_2;\n    r->d[2] = t & 0xFFFFFFFFUL; t >>= 32;\n    t += (uint64_t)r->d[3] + overflow * SECP256K1_N_C_3;\n    r->d[3] = t & 0xFFFFFFFFUL; t >>= 32;\n    t += (uint64_t)r->d[4] + overflow * SECP256K1_N_C_4;\n    r->d[4] = t & 0xFFFFFFFFUL; t >>= 32;\n    t += (uint64_t)r->d[5];\n    r->d[5] = t & 0xFFFFFFFFUL; t >>= 32;\n    t += (uint64_t)r->d[6];\n    r->d[6] = t & 0xFFFFFFFFUL; t >>= 32;\n    t += (uint64_t)r->d[7];\n    r->d[7] = t & 0xFFFFFFFFUL;\n    return overflow;\n}\n\nstatic int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    int overflow;\n    uint64_t t = (uint64_t)a->d[0] + b->d[0];\n    r->d[0] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)a->d[1] + b->d[1];\n    r->d[1] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)a->d[2] + b->d[2];\n    r->d[2] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)a->d[3] + b->d[3];\n    r->d[3] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)a->d[4] + b->d[4];\n    r->d[4] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)a->d[5] + b->d[5];\n    r->d[5] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)a->d[6] + b->d[6];\n    r->d[6] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)a->d[7] + b->d[7];\n    r->d[7] = t & 0xFFFFFFFFULL; t >>= 32;\n    overflow = t + secp256k1_scalar_check_overflow(r);\n    VERIFY_CHECK(overflow == 0 || overflow == 1);\n    secp256k1_scalar_reduce(r, overflow);\n    return overflow;\n}\n\nstatic void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {\n    uint64_t t;\n    VERIFY_CHECK(bit < 256);\n    bit += ((uint32_t) flag - 1) & 0x100;  /* forcing (bit >> 5) > 7 makes this a noop */\n    t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F));\n    r->d[0] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F));\n    r->d[1] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)r->d[2] + (((uint32_t)((bit >> 5) == 2)) << (bit & 0x1F));\n    r->d[2] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)r->d[3] + (((uint32_t)((bit >> 5) == 3)) << (bit & 0x1F));\n    r->d[3] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)r->d[4] + (((uint32_t)((bit >> 5) == 4)) << (bit & 0x1F));\n    r->d[4] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)r->d[5] + (((uint32_t)((bit >> 5) == 5)) << (bit & 0x1F));\n    r->d[5] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)r->d[6] + (((uint32_t)((bit >> 5) == 6)) << (bit & 0x1F));\n    r->d[6] = t & 0xFFFFFFFFULL; t >>= 32;\n    t += (uint64_t)r->d[7] + (((uint32_t)((bit >> 5) == 7)) << (bit & 0x1F));\n    r->d[7] = t & 0xFFFFFFFFULL;\n#ifdef VERIFY\n    VERIFY_CHECK((t >> 32) == 0);\n    VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0);\n#endif\n}\n\nstatic void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {\n    int over;\n    r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24;\n    r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24;\n    r->d[2] = (uint32_t)b32[23] | (uint32_t)b32[22] << 8 | (uint32_t)b32[21] << 16 | (uint32_t)b32[20] << 24;\n    r->d[3] = (uint32_t)b32[19] | (uint32_t)b32[18] << 8 | (uint32_t)b32[17] << 16 | (uint32_t)b32[16] << 24;\n    r->d[4] = (uint32_t)b32[15] | (uint32_t)b32[14] << 8 | (uint32_t)b32[13] << 16 | (uint32_t)b32[12] << 24;\n    r->d[5] = (uint32_t)b32[11] | (uint32_t)b32[10] << 8 | (uint32_t)b32[9] << 16 | (uint32_t)b32[8] << 24;\n    r->d[6] = (uint32_t)b32[7] | (uint32_t)b32[6] << 8 | (uint32_t)b32[5] << 16 | (uint32_t)b32[4] << 24;\n    r->d[7] = (uint32_t)b32[3] | (uint32_t)b32[2] << 8 | (uint32_t)b32[1] << 16 | (uint32_t)b32[0] << 24;\n    over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r));\n    if (overflow) {\n        *overflow = over;\n    }\n}\n\nstatic void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {\n    bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7];\n    bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6];\n    bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5];\n    bin[12] = a->d[4] >> 24; bin[13] = a->d[4] >> 16; bin[14] = a->d[4] >> 8; bin[15] = a->d[4];\n    bin[16] = a->d[3] >> 24; bin[17] = a->d[3] >> 16; bin[18] = a->d[3] >> 8; bin[19] = a->d[3];\n    bin[20] = a->d[2] >> 24; bin[21] = a->d[2] >> 16; bin[22] = a->d[2] >> 8; bin[23] = a->d[2];\n    bin[24] = a->d[1] >> 24; bin[25] = a->d[1] >> 16; bin[26] = a->d[1] >> 8; bin[27] = a->d[1];\n    bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0];\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {\n    return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0;\n}\n\nstatic void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {\n    uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0);\n    uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1;\n    r->d[0] = t & nonzero; t >>= 32;\n    t += (uint64_t)(~a->d[1]) + SECP256K1_N_1;\n    r->d[1] = t & nonzero; t >>= 32;\n    t += (uint64_t)(~a->d[2]) + SECP256K1_N_2;\n    r->d[2] = t & nonzero; t >>= 32;\n    t += (uint64_t)(~a->d[3]) + SECP256K1_N_3;\n    r->d[3] = t & nonzero; t >>= 32;\n    t += (uint64_t)(~a->d[4]) + SECP256K1_N_4;\n    r->d[4] = t & nonzero; t >>= 32;\n    t += (uint64_t)(~a->d[5]) + SECP256K1_N_5;\n    r->d[5] = t & nonzero; t >>= 32;\n    t += (uint64_t)(~a->d[6]) + SECP256K1_N_6;\n    r->d[6] = t & nonzero; t >>= 32;\n    t += (uint64_t)(~a->d[7]) + SECP256K1_N_7;\n    r->d[7] = t & nonzero;\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {\n    return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0;\n}\n\nstatic int secp256k1_scalar_is_high(const secp256k1_scalar *a) {\n    int yes = 0;\n    int no = 0;\n    no |= (a->d[7] < SECP256K1_N_H_7);\n    yes |= (a->d[7] > SECP256K1_N_H_7) & ~no;\n    no |= (a->d[6] < SECP256K1_N_H_6) & ~yes; /* No need for a > check. */\n    no |= (a->d[5] < SECP256K1_N_H_5) & ~yes; /* No need for a > check. */\n    no |= (a->d[4] < SECP256K1_N_H_4) & ~yes; /* No need for a > check. */\n    no |= (a->d[3] < SECP256K1_N_H_3) & ~yes;\n    yes |= (a->d[3] > SECP256K1_N_H_3) & ~no;\n    no |= (a->d[2] < SECP256K1_N_H_2) & ~yes;\n    yes |= (a->d[2] > SECP256K1_N_H_2) & ~no;\n    no |= (a->d[1] < SECP256K1_N_H_1) & ~yes;\n    yes |= (a->d[1] > SECP256K1_N_H_1) & ~no;\n    yes |= (a->d[0] > SECP256K1_N_H_0) & ~no;\n    return yes;\n}\n\nstatic int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {\n    /* If we are flag = 0, mask = 00...00 and this is a no-op;\n     * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */\n    uint32_t mask = !flag - 1;\n    uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(r) == 0);\n    uint64_t t = (uint64_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask);\n    r->d[0] = t & nonzero; t >>= 32;\n    t += (uint64_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask);\n    r->d[1] = t & nonzero; t >>= 32;\n    t += (uint64_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask);\n    r->d[2] = t & nonzero; t >>= 32;\n    t += (uint64_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask);\n    r->d[3] = t & nonzero; t >>= 32;\n    t += (uint64_t)(r->d[4] ^ mask) + (SECP256K1_N_4 & mask);\n    r->d[4] = t & nonzero; t >>= 32;\n    t += (uint64_t)(r->d[5] ^ mask) + (SECP256K1_N_5 & mask);\n    r->d[5] = t & nonzero; t >>= 32;\n    t += (uint64_t)(r->d[6] ^ mask) + (SECP256K1_N_6 & mask);\n    r->d[6] = t & nonzero; t >>= 32;\n    t += (uint64_t)(r->d[7] ^ mask) + (SECP256K1_N_7 & mask);\n    r->d[7] = t & nonzero;\n    return 2 * (mask == 0) - 1;\n}\n\n\n/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */\n\n/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */\n#define muladd(a,b) { \\\n    uint32_t tl, th; \\\n    { \\\n        uint64_t t = (uint64_t)a * b; \\\n        th = t >> 32;         /* at most 0xFFFFFFFE */ \\\n        tl = t; \\\n    } \\\n    c0 += tl;                 /* overflow is handled on the next line */ \\\n    th += (c0 < tl) ? 1 : 0;  /* at most 0xFFFFFFFF */ \\\n    c1 += th;                 /* overflow is handled on the next line */ \\\n    c2 += (c1 < th) ? 1 : 0;  /* never overflows by contract (verified in the next line) */ \\\n    VERIFY_CHECK((c1 >= th) || (c2 != 0)); \\\n}\n\n/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */\n#define muladd_fast(a,b) { \\\n    uint32_t tl, th; \\\n    { \\\n        uint64_t t = (uint64_t)a * b; \\\n        th = t >> 32;         /* at most 0xFFFFFFFE */ \\\n        tl = t; \\\n    } \\\n    c0 += tl;                 /* overflow is handled on the next line */ \\\n    th += (c0 < tl) ? 1 : 0;  /* at most 0xFFFFFFFF */ \\\n    c1 += th;                 /* never overflows by contract (verified in the next line) */ \\\n    VERIFY_CHECK(c1 >= th); \\\n}\n\n/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */\n#define muladd2(a,b) { \\\n    uint32_t tl, th, th2, tl2; \\\n    { \\\n        uint64_t t = (uint64_t)a * b; \\\n        th = t >> 32;               /* at most 0xFFFFFFFE */ \\\n        tl = t; \\\n    } \\\n    th2 = th + th;                  /* at most 0xFFFFFFFE (in case th was 0x7FFFFFFF) */ \\\n    c2 += (th2 < th) ? 1 : 0;       /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((th2 >= th) || (c2 != 0)); \\\n    tl2 = tl + tl;                  /* at most 0xFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFF) */ \\\n    th2 += (tl2 < tl) ? 1 : 0;      /* at most 0xFFFFFFFF */ \\\n    c0 += tl2;                      /* overflow is handled on the next line */ \\\n    th2 += (c0 < tl2) ? 1 : 0;      /* second overflow is handled on the next line */ \\\n    c2 += (c0 < tl2) & (th2 == 0);  /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \\\n    c1 += th2;                      /* overflow is handled on the next line */ \\\n    c2 += (c1 < th2) ? 1 : 0;       /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \\\n}\n\n/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */\n#define sumadd(a) { \\\n    unsigned int over; \\\n    c0 += (a);                  /* overflow is handled on the next line */ \\\n    over = (c0 < (a)) ? 1 : 0; \\\n    c1 += over;                 /* overflow is handled on the next line */ \\\n    c2 += (c1 < over) ? 1 : 0;  /* never overflows by contract */ \\\n}\n\n/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */\n#define sumadd_fast(a) { \\\n    c0 += (a);                 /* overflow is handled on the next line */ \\\n    c1 += (c0 < (a)) ? 1 : 0;  /* never overflows by contract (verified the next line) */ \\\n    VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \\\n    VERIFY_CHECK(c2 == 0); \\\n}\n\n/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. */\n#define extract(n) { \\\n    (n) = c0; \\\n    c0 = c1; \\\n    c1 = c2; \\\n    c2 = 0; \\\n}\n\n/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. c2 is required to be zero. */\n#define extract_fast(n) { \\\n    (n) = c0; \\\n    c0 = c1; \\\n    c1 = 0; \\\n    VERIFY_CHECK(c2 == 0); \\\n}\n\nstatic void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint32_t *l) {\n    uint64_t c;\n    uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15];\n    uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12;\n    uint32_t p0, p1, p2, p3, p4, p5, p6, p7, p8;\n\n    /* 96 bit accumulator. */\n    uint32_t c0, c1, c2;\n\n    /* Reduce 512 bits into 385. */\n    /* m[0..12] = l[0..7] + n[0..7] * SECP256K1_N_C. */\n    c0 = l[0]; c1 = 0; c2 = 0;\n    muladd_fast(n0, SECP256K1_N_C_0);\n    extract_fast(m0);\n    sumadd_fast(l[1]);\n    muladd(n1, SECP256K1_N_C_0);\n    muladd(n0, SECP256K1_N_C_1);\n    extract(m1);\n    sumadd(l[2]);\n    muladd(n2, SECP256K1_N_C_0);\n    muladd(n1, SECP256K1_N_C_1);\n    muladd(n0, SECP256K1_N_C_2);\n    extract(m2);\n    sumadd(l[3]);\n    muladd(n3, SECP256K1_N_C_0);\n    muladd(n2, SECP256K1_N_C_1);\n    muladd(n1, SECP256K1_N_C_2);\n    muladd(n0, SECP256K1_N_C_3);\n    extract(m3);\n    sumadd(l[4]);\n    muladd(n4, SECP256K1_N_C_0);\n    muladd(n3, SECP256K1_N_C_1);\n    muladd(n2, SECP256K1_N_C_2);\n    muladd(n1, SECP256K1_N_C_3);\n    sumadd(n0);\n    extract(m4);\n    sumadd(l[5]);\n    muladd(n5, SECP256K1_N_C_0);\n    muladd(n4, SECP256K1_N_C_1);\n    muladd(n3, SECP256K1_N_C_2);\n    muladd(n2, SECP256K1_N_C_3);\n    sumadd(n1);\n    extract(m5);\n    sumadd(l[6]);\n    muladd(n6, SECP256K1_N_C_0);\n    muladd(n5, SECP256K1_N_C_1);\n    muladd(n4, SECP256K1_N_C_2);\n    muladd(n3, SECP256K1_N_C_3);\n    sumadd(n2);\n    extract(m6);\n    sumadd(l[7]);\n    muladd(n7, SECP256K1_N_C_0);\n    muladd(n6, SECP256K1_N_C_1);\n    muladd(n5, SECP256K1_N_C_2);\n    muladd(n4, SECP256K1_N_C_3);\n    sumadd(n3);\n    extract(m7);\n    muladd(n7, SECP256K1_N_C_1);\n    muladd(n6, SECP256K1_N_C_2);\n    muladd(n5, SECP256K1_N_C_3);\n    sumadd(n4);\n    extract(m8);\n    muladd(n7, SECP256K1_N_C_2);\n    muladd(n6, SECP256K1_N_C_3);\n    sumadd(n5);\n    extract(m9);\n    muladd(n7, SECP256K1_N_C_3);\n    sumadd(n6);\n    extract(m10);\n    sumadd_fast(n7);\n    extract_fast(m11);\n    VERIFY_CHECK(c0 <= 1);\n    m12 = c0;\n\n    /* Reduce 385 bits into 258. */\n    /* p[0..8] = m[0..7] + m[8..12] * SECP256K1_N_C. */\n    c0 = m0; c1 = 0; c2 = 0;\n    muladd_fast(m8, SECP256K1_N_C_0);\n    extract_fast(p0);\n    sumadd_fast(m1);\n    muladd(m9, SECP256K1_N_C_0);\n    muladd(m8, SECP256K1_N_C_1);\n    extract(p1);\n    sumadd(m2);\n    muladd(m10, SECP256K1_N_C_0);\n    muladd(m9, SECP256K1_N_C_1);\n    muladd(m8, SECP256K1_N_C_2);\n    extract(p2);\n    sumadd(m3);\n    muladd(m11, SECP256K1_N_C_0);\n    muladd(m10, SECP256K1_N_C_1);\n    muladd(m9, SECP256K1_N_C_2);\n    muladd(m8, SECP256K1_N_C_3);\n    extract(p3);\n    sumadd(m4);\n    muladd(m12, SECP256K1_N_C_0);\n    muladd(m11, SECP256K1_N_C_1);\n    muladd(m10, SECP256K1_N_C_2);\n    muladd(m9, SECP256K1_N_C_3);\n    sumadd(m8);\n    extract(p4);\n    sumadd(m5);\n    muladd(m12, SECP256K1_N_C_1);\n    muladd(m11, SECP256K1_N_C_2);\n    muladd(m10, SECP256K1_N_C_3);\n    sumadd(m9);\n    extract(p5);\n    sumadd(m6);\n    muladd(m12, SECP256K1_N_C_2);\n    muladd(m11, SECP256K1_N_C_3);\n    sumadd(m10);\n    extract(p6);\n    sumadd_fast(m7);\n    muladd_fast(m12, SECP256K1_N_C_3);\n    sumadd_fast(m11);\n    extract_fast(p7);\n    p8 = c0 + m12;\n    VERIFY_CHECK(p8 <= 2);\n\n    /* Reduce 258 bits into 256. */\n    /* r[0..7] = p[0..7] + p[8] * SECP256K1_N_C. */\n    c = p0 + (uint64_t)SECP256K1_N_C_0 * p8;\n    r->d[0] = c & 0xFFFFFFFFUL; c >>= 32;\n    c += p1 + (uint64_t)SECP256K1_N_C_1 * p8;\n    r->d[1] = c & 0xFFFFFFFFUL; c >>= 32;\n    c += p2 + (uint64_t)SECP256K1_N_C_2 * p8;\n    r->d[2] = c & 0xFFFFFFFFUL; c >>= 32;\n    c += p3 + (uint64_t)SECP256K1_N_C_3 * p8;\n    r->d[3] = c & 0xFFFFFFFFUL; c >>= 32;\n    c += p4 + (uint64_t)p8;\n    r->d[4] = c & 0xFFFFFFFFUL; c >>= 32;\n    c += p5;\n    r->d[5] = c & 0xFFFFFFFFUL; c >>= 32;\n    c += p6;\n    r->d[6] = c & 0xFFFFFFFFUL; c >>= 32;\n    c += p7;\n    r->d[7] = c & 0xFFFFFFFFUL; c >>= 32;\n\n    /* Final reduction of r. */\n    secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r));\n}\n\nstatic void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    /* 96 bit accumulator. */\n    uint32_t c0 = 0, c1 = 0, c2 = 0;\n\n    /* l[0..15] = a[0..7] * b[0..7]. */\n    muladd_fast(a->d[0], b->d[0]);\n    extract_fast(l[0]);\n    muladd(a->d[0], b->d[1]);\n    muladd(a->d[1], b->d[0]);\n    extract(l[1]);\n    muladd(a->d[0], b->d[2]);\n    muladd(a->d[1], b->d[1]);\n    muladd(a->d[2], b->d[0]);\n    extract(l[2]);\n    muladd(a->d[0], b->d[3]);\n    muladd(a->d[1], b->d[2]);\n    muladd(a->d[2], b->d[1]);\n    muladd(a->d[3], b->d[0]);\n    extract(l[3]);\n    muladd(a->d[0], b->d[4]);\n    muladd(a->d[1], b->d[3]);\n    muladd(a->d[2], b->d[2]);\n    muladd(a->d[3], b->d[1]);\n    muladd(a->d[4], b->d[0]);\n    extract(l[4]);\n    muladd(a->d[0], b->d[5]);\n    muladd(a->d[1], b->d[4]);\n    muladd(a->d[2], b->d[3]);\n    muladd(a->d[3], b->d[2]);\n    muladd(a->d[4], b->d[1]);\n    muladd(a->d[5], b->d[0]);\n    extract(l[5]);\n    muladd(a->d[0], b->d[6]);\n    muladd(a->d[1], b->d[5]);\n    muladd(a->d[2], b->d[4]);\n    muladd(a->d[3], b->d[3]);\n    muladd(a->d[4], b->d[2]);\n    muladd(a->d[5], b->d[1]);\n    muladd(a->d[6], b->d[0]);\n    extract(l[6]);\n    muladd(a->d[0], b->d[7]);\n    muladd(a->d[1], b->d[6]);\n    muladd(a->d[2], b->d[5]);\n    muladd(a->d[3], b->d[4]);\n    muladd(a->d[4], b->d[3]);\n    muladd(a->d[5], b->d[2]);\n    muladd(a->d[6], b->d[1]);\n    muladd(a->d[7], b->d[0]);\n    extract(l[7]);\n    muladd(a->d[1], b->d[7]);\n    muladd(a->d[2], b->d[6]);\n    muladd(a->d[3], b->d[5]);\n    muladd(a->d[4], b->d[4]);\n    muladd(a->d[5], b->d[3]);\n    muladd(a->d[6], b->d[2]);\n    muladd(a->d[7], b->d[1]);\n    extract(l[8]);\n    muladd(a->d[2], b->d[7]);\n    muladd(a->d[3], b->d[6]);\n    muladd(a->d[4], b->d[5]);\n    muladd(a->d[5], b->d[4]);\n    muladd(a->d[6], b->d[3]);\n    muladd(a->d[7], b->d[2]);\n    extract(l[9]);\n    muladd(a->d[3], b->d[7]);\n    muladd(a->d[4], b->d[6]);\n    muladd(a->d[5], b->d[5]);\n    muladd(a->d[6], b->d[4]);\n    muladd(a->d[7], b->d[3]);\n    extract(l[10]);\n    muladd(a->d[4], b->d[7]);\n    muladd(a->d[5], b->d[6]);\n    muladd(a->d[6], b->d[5]);\n    muladd(a->d[7], b->d[4]);\n    extract(l[11]);\n    muladd(a->d[5], b->d[7]);\n    muladd(a->d[6], b->d[6]);\n    muladd(a->d[7], b->d[5]);\n    extract(l[12]);\n    muladd(a->d[6], b->d[7]);\n    muladd(a->d[7], b->d[6]);\n    extract(l[13]);\n    muladd_fast(a->d[7], b->d[7]);\n    extract_fast(l[14]);\n    VERIFY_CHECK(c1 == 0);\n    l[15] = c0;\n}\n\nstatic void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar *a) {\n    /* 96 bit accumulator. */\n    uint32_t c0 = 0, c1 = 0, c2 = 0;\n\n    /* l[0..15] = a[0..7]^2. */\n    muladd_fast(a->d[0], a->d[0]);\n    extract_fast(l[0]);\n    muladd2(a->d[0], a->d[1]);\n    extract(l[1]);\n    muladd2(a->d[0], a->d[2]);\n    muladd(a->d[1], a->d[1]);\n    extract(l[2]);\n    muladd2(a->d[0], a->d[3]);\n    muladd2(a->d[1], a->d[2]);\n    extract(l[3]);\n    muladd2(a->d[0], a->d[4]);\n    muladd2(a->d[1], a->d[3]);\n    muladd(a->d[2], a->d[2]);\n    extract(l[4]);\n    muladd2(a->d[0], a->d[5]);\n    muladd2(a->d[1], a->d[4]);\n    muladd2(a->d[2], a->d[3]);\n    extract(l[5]);\n    muladd2(a->d[0], a->d[6]);\n    muladd2(a->d[1], a->d[5]);\n    muladd2(a->d[2], a->d[4]);\n    muladd(a->d[3], a->d[3]);\n    extract(l[6]);\n    muladd2(a->d[0], a->d[7]);\n    muladd2(a->d[1], a->d[6]);\n    muladd2(a->d[2], a->d[5]);\n    muladd2(a->d[3], a->d[4]);\n    extract(l[7]);\n    muladd2(a->d[1], a->d[7]);\n    muladd2(a->d[2], a->d[6]);\n    muladd2(a->d[3], a->d[5]);\n    muladd(a->d[4], a->d[4]);\n    extract(l[8]);\n    muladd2(a->d[2], a->d[7]);\n    muladd2(a->d[3], a->d[6]);\n    muladd2(a->d[4], a->d[5]);\n    extract(l[9]);\n    muladd2(a->d[3], a->d[7]);\n    muladd2(a->d[4], a->d[6]);\n    muladd(a->d[5], a->d[5]);\n    extract(l[10]);\n    muladd2(a->d[4], a->d[7]);\n    muladd2(a->d[5], a->d[6]);\n    extract(l[11]);\n    muladd2(a->d[5], a->d[7]);\n    muladd(a->d[6], a->d[6]);\n    extract(l[12]);\n    muladd2(a->d[6], a->d[7]);\n    extract(l[13]);\n    muladd_fast(a->d[7], a->d[7]);\n    extract_fast(l[14]);\n    VERIFY_CHECK(c1 == 0);\n    l[15] = c0;\n}\n\n#undef sumadd\n#undef sumadd_fast\n#undef muladd\n#undef muladd_fast\n#undef muladd2\n#undef extract\n#undef extract_fast\n\nstatic void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    uint32_t l[16];\n    secp256k1_scalar_mul_512(l, a, b);\n    secp256k1_scalar_reduce_512(r, l);\n}\n\nstatic int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) {\n    int ret;\n    VERIFY_CHECK(n > 0);\n    VERIFY_CHECK(n < 16);\n    ret = r->d[0] & ((1 << n) - 1);\n    r->d[0] = (r->d[0] >> n) + (r->d[1] << (32 - n));\n    r->d[1] = (r->d[1] >> n) + (r->d[2] << (32 - n));\n    r->d[2] = (r->d[2] >> n) + (r->d[3] << (32 - n));\n    r->d[3] = (r->d[3] >> n) + (r->d[4] << (32 - n));\n    r->d[4] = (r->d[4] >> n) + (r->d[5] << (32 - n));\n    r->d[5] = (r->d[5] >> n) + (r->d[6] << (32 - n));\n    r->d[6] = (r->d[6] >> n) + (r->d[7] << (32 - n));\n    r->d[7] = (r->d[7] >> n);\n    return ret;\n}\n\nstatic void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) {\n    uint32_t l[16];\n    secp256k1_scalar_sqr_512(l, a);\n    secp256k1_scalar_reduce_512(r, l);\n}\n\n#ifdef USE_ENDOMORPHISM\nstatic void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {\n    r1->d[0] = a->d[0];\n    r1->d[1] = a->d[1];\n    r1->d[2] = a->d[2];\n    r1->d[3] = a->d[3];\n    r1->d[4] = 0;\n    r1->d[5] = 0;\n    r1->d[6] = 0;\n    r1->d[7] = 0;\n    r2->d[0] = a->d[4];\n    r2->d[1] = a->d[5];\n    r2->d[2] = a->d[6];\n    r2->d[3] = a->d[7];\n    r2->d[4] = 0;\n    r2->d[5] = 0;\n    r2->d[6] = 0;\n    r2->d[7] = 0;\n}\n#endif\n\nSECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0;\n}\n\nSECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) {\n    uint32_t l[16];\n    unsigned int shiftlimbs;\n    unsigned int shiftlow;\n    unsigned int shifthigh;\n    VERIFY_CHECK(shift >= 256);\n    secp256k1_scalar_mul_512(l, a, b);\n    shiftlimbs = shift >> 5;\n    shiftlow = shift & 0x1F;\n    shifthigh = 32 - shiftlow;\n    r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 480 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[1] = shift < 480 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[2] = shift < 448 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 416 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[3] = shift < 416 ? (l[3 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[4 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[4] = shift < 384 ? (l[4 + shiftlimbs] >> shiftlow | (shift < 352 && shiftlow ? (l[5 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0;\n    r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow)  : 0;\n    secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1);\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2014 Pieter Wuille                                   *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_IMPL_H_\n#define _SECP256K1_SCALAR_IMPL_H_\n\n#include \"group.h\"\n#include \"scalar.h\"\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#if defined(EXHAUSTIVE_TEST_ORDER)\n#include \"scalar_low_impl.h\"\n#elif defined(USE_SCALAR_4X64)\n#include \"scalar_4x64_impl.h\"\n#elif defined(USE_SCALAR_8X32)\n#include \"scalar_8x32_impl.h\"\n#else\n#error \"Please select scalar implementation\"\n#endif\n\n#ifndef USE_NUM_NONE\nstatic void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a) {\n    unsigned char c[32];\n    secp256k1_scalar_get_b32(c, a);\n    secp256k1_num_set_bin(r, c, 32);\n}\n\n/** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */\nstatic void secp256k1_scalar_order_get_num(secp256k1_num *r) {\n#if defined(EXHAUSTIVE_TEST_ORDER)\n    static const unsigned char order[32] = {\n        0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,0,\n        0,0,0,0,0,0,0,EXHAUSTIVE_TEST_ORDER\n    };\n#else\n    static const unsigned char order[32] = {\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n        0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,\n        0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,\n        0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41\n    };\n#endif\n    secp256k1_num_set_bin(r, order, 32);\n}\n#endif\n\nstatic void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) {\n#if defined(EXHAUSTIVE_TEST_ORDER)\n    int i;\n    *r = 0;\n    for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++)\n        if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1)\n            *r = i;\n    /* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus\n     * have a composite group order; fix it in exhaustive_tests.c). */\n    VERIFY_CHECK(*r != 0);\n}\n#else\n    secp256k1_scalar *t;\n    int i;\n    /* First compute x ^ (2^N - 1) for some values of N. */\n    secp256k1_scalar x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127;\n\n    secp256k1_scalar_sqr(&x2,  x);\n    secp256k1_scalar_mul(&x2, &x2,  x);\n\n    secp256k1_scalar_sqr(&x3, &x2);\n    secp256k1_scalar_mul(&x3, &x3,  x);\n\n    secp256k1_scalar_sqr(&x4, &x3);\n    secp256k1_scalar_mul(&x4, &x4,  x);\n\n    secp256k1_scalar_sqr(&x6, &x4);\n    secp256k1_scalar_sqr(&x6, &x6);\n    secp256k1_scalar_mul(&x6, &x6, &x2);\n\n    secp256k1_scalar_sqr(&x7, &x6);\n    secp256k1_scalar_mul(&x7, &x7,  x);\n\n    secp256k1_scalar_sqr(&x8, &x7);\n    secp256k1_scalar_mul(&x8, &x8,  x);\n\n    secp256k1_scalar_sqr(&x15, &x8);\n    for (i = 0; i < 6; i++) {\n        secp256k1_scalar_sqr(&x15, &x15);\n    }\n    secp256k1_scalar_mul(&x15, &x15, &x7);\n\n    secp256k1_scalar_sqr(&x30, &x15);\n    for (i = 0; i < 14; i++) {\n        secp256k1_scalar_sqr(&x30, &x30);\n    }\n    secp256k1_scalar_mul(&x30, &x30, &x15);\n\n    secp256k1_scalar_sqr(&x60, &x30);\n    for (i = 0; i < 29; i++) {\n        secp256k1_scalar_sqr(&x60, &x60);\n    }\n    secp256k1_scalar_mul(&x60, &x60, &x30);\n\n    secp256k1_scalar_sqr(&x120, &x60);\n    for (i = 0; i < 59; i++) {\n        secp256k1_scalar_sqr(&x120, &x120);\n    }\n    secp256k1_scalar_mul(&x120, &x120, &x60);\n\n    secp256k1_scalar_sqr(&x127, &x120);\n    for (i = 0; i < 6; i++) {\n        secp256k1_scalar_sqr(&x127, &x127);\n    }\n    secp256k1_scalar_mul(&x127, &x127, &x7);\n\n    /* Then accumulate the final result (t starts at x127). */\n    t = &x127;\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 4; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x3); /* 111 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 4; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x3); /* 111 */\n    for (i = 0; i < 3; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x2); /* 11 */\n    for (i = 0; i < 4; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x3); /* 111 */\n    for (i = 0; i < 5; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x3); /* 111 */\n    for (i = 0; i < 4; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x2); /* 11 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 5; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x4); /* 1111 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 3; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 4; i++) { /* 000 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 10; i++) { /* 0000000 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x3); /* 111 */\n    for (i = 0; i < 4; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x3); /* 111 */\n    for (i = 0; i < 9; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x8); /* 11111111 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 3; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 3; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 5; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x4); /* 1111 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 5; i++) { /* 000 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x2); /* 11 */\n    for (i = 0; i < 4; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x2); /* 11 */\n    for (i = 0; i < 2; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 8; i++) { /* 000000 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x2); /* 11 */\n    for (i = 0; i < 3; i++) { /* 0 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, &x2); /* 11 */\n    for (i = 0; i < 3; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 6; i++) { /* 00000 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(t, t, x); /* 1 */\n    for (i = 0; i < 8; i++) { /* 00 */\n        secp256k1_scalar_sqr(t, t);\n    }\n    secp256k1_scalar_mul(r, t, &x6); /* 111111 */\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) {\n    return !(a->d[0] & 1);\n}\n#endif\n\nstatic void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) {\n#if defined(USE_SCALAR_INV_BUILTIN)\n    secp256k1_scalar_inverse(r, x);\n#elif defined(USE_SCALAR_INV_NUM)\n    unsigned char b[32];\n    secp256k1_num n, m;\n    secp256k1_scalar t = *x;\n    secp256k1_scalar_get_b32(b, &t);\n    secp256k1_num_set_bin(&n, b, 32);\n    secp256k1_scalar_order_get_num(&m);\n    secp256k1_num_mod_inverse(&n, &n, &m);\n    secp256k1_num_get_bin(b, 32, &n);\n    secp256k1_scalar_set_b32(r, b, NULL);\n    /* Verify that the inverse was computed correctly, without GMP code. */\n    secp256k1_scalar_mul(&t, &t, r);\n    CHECK(secp256k1_scalar_is_one(&t));\n#else\n#error \"Please select scalar inverse implementation\"\n#endif\n}\n\n#ifdef USE_ENDOMORPHISM\n#if defined(EXHAUSTIVE_TEST_ORDER)\n/**\n * Find k1 and k2 given k, such that k1 + k2 * lambda == k mod n; unlike in the\n * full case we don't bother making k1 and k2 be small, we just want them to be\n * nontrivial to get full test coverage for the exhaustive tests. We therefore\n * (arbitrarily) set k2 = k + 5 and k1 = k - k2 * lambda.\n */\nstatic void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {\n    *r2 = (*a + 5) % EXHAUSTIVE_TEST_ORDER;\n    *r1 = (*a + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER;\n}\n#else\n/**\n * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where\n * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a,\n *            0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72}\n *\n * \"Guide to Elliptic Curve Cryptography\" (Hankerson, Menezes, Vanstone) gives an algorithm\n * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1\n * and k2 have a small size.\n * It relies on constants a1, b1, a2, b2. These constants for the value of lambda above are:\n *\n * - a1 =      {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}\n * - b1 =     -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3}\n * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8}\n * - b2 =      {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15}\n *\n * The algorithm then computes c1 = round(b1 * k / n) and c2 = round(b2 * k / n), and gives\n * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and\n * compute k1 as k - k2 * lambda, avoiding the need for constants a1 and a2.\n *\n * g1, g2 are precomputed constants used to replace division with a rounded multiplication\n * when decomposing the scalar for an endomorphism-based point multiplication.\n *\n * The possibility of using precomputed estimates is mentioned in \"Guide to Elliptic Curve\n * Cryptography\" (Hankerson, Menezes, Vanstone) in section 3.5.\n *\n * The derivation is described in the paper \"Efficient Software Implementation of Public-Key\n * Cryptography on Sensor Networks Using the MSP430X Microcontroller\" (Gouvea, Oliveira, Lopez),\n * Section 4.3 (here we use a somewhat higher-precision estimate):\n * d = a1*b2 - b1*a2\n * g1 = round((2^272)*b2/d)\n * g2 = round((2^272)*b1/d)\n *\n * (Note that 'd' is also equal to the curve order here because [a1,b1] and [a2,b2] are found\n * as outputs of the Extended Euclidean Algorithm on inputs 'order' and 'lambda').\n *\n * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order).\n */\n\nstatic void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {\n    secp256k1_scalar c1, c2;\n    static const secp256k1_scalar minus_lambda = SECP256K1_SCALAR_CONST(\n        0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL,\n        0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL\n    );\n    static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST(\n        0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL,\n        0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL\n    );\n    static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST(\n        0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL,\n        0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL\n    );\n    static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST(\n        0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL,\n        0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL\n    );\n    static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST(\n        0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL,\n        0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL\n    );\n    VERIFY_CHECK(r1 != a);\n    VERIFY_CHECK(r2 != a);\n    /* these _var calls are constant time since the shift amount is constant */\n    secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272);\n    secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272);\n    secp256k1_scalar_mul(&c1, &c1, &minus_b1);\n    secp256k1_scalar_mul(&c2, &c2, &minus_b2);\n    secp256k1_scalar_add(r2, &c1, &c2);\n    secp256k1_scalar_mul(r1, r2, &minus_lambda);\n    secp256k1_scalar_add(r1, r1, a);\n}\n#endif\n#endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar_low.h",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Andrew Poelstra                                 *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_REPR_\n#define _SECP256K1_SCALAR_REPR_\n\n#include <stdint.h>\n\n/** A scalar modulo the group order of the secp256k1 curve. */\ntypedef uint32_t secp256k1_scalar;\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/scalar_low_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2015 Andrew Poelstra                                 *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_\n#define _SECP256K1_SCALAR_REPR_IMPL_H_\n\n#include \"scalar.h\"\n\n#include <string.h>\n\nSECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) {\n    return !(*a & 1);\n}\n\nSECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { *r = 0; }\nSECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { *r = v; }\n\nSECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {\n    if (offset < 32)\n        return ((*a >> offset) & ((((uint32_t)1) << count) - 1));\n    else\n        return 0;\n}\n\nSECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {\n    return secp256k1_scalar_get_bits(a, offset, count);\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; }\n\nstatic int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    *r = (*a + *b) % EXHAUSTIVE_TEST_ORDER;\n    return *r < *b;\n}\n\nstatic void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {\n    if (flag && bit < 32)\n        *r += (1 << bit);\n#ifdef VERIFY\n    VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0);\n#endif\n}\n\nstatic void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {\n    const int base = 0x100 % EXHAUSTIVE_TEST_ORDER;\n    int i;\n    *r = 0;\n    for (i = 0; i < 32; i++) {\n       *r = ((*r * base) + b32[i]) % EXHAUSTIVE_TEST_ORDER;\n    }\n    /* just deny overflow, it basically always happens */\n    if (overflow) *overflow = 0;\n}\n\nstatic void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {\n    memset(bin, 0, 32);\n    bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a;\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {\n    return *a == 0;\n}\n\nstatic void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {\n    if (*a == 0) {\n        *r = 0;\n    } else {\n        *r = EXHAUSTIVE_TEST_ORDER - *a;\n    }\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {\n    return *a == 1;\n}\n\nstatic int secp256k1_scalar_is_high(const secp256k1_scalar *a) {\n    return *a > EXHAUSTIVE_TEST_ORDER / 2;\n}\n\nstatic int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {\n    if (flag) secp256k1_scalar_negate(r, r);\n    return flag ? -1 : 1;\n}\n\nstatic void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    *r = (*a * *b) % EXHAUSTIVE_TEST_ORDER;\n}\n\nstatic int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) {\n    int ret;\n    VERIFY_CHECK(n > 0);\n    VERIFY_CHECK(n < 16);\n    ret = *r & ((1 << n) - 1);\n    *r >>= n;\n    return ret;\n}\n\nstatic void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) {\n    *r = (*a * *a) % EXHAUSTIVE_TEST_ORDER;\n}\n\nstatic void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {\n    *r1 = *a;\n    *r2 = 0;\n}\n\nSECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {\n    return *a == *b;\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/secp256k1.c",
    "content": "/**********************************************************************\n * Copyright (c) 2013-2015 Pieter Wuille                              *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#include \"include/secp256k1.h\"\n\n#include \"util.h\"\n#include \"num_impl.h\"\n#include \"field_impl.h\"\n#include \"scalar_impl.h\"\n#include \"group_impl.h\"\n#include \"ecmult_impl.h\"\n#include \"ecmult_const_impl.h\"\n#include \"ecmult_gen_impl.h\"\n#include \"ecdsa_impl.h\"\n#include \"eckey_impl.h\"\n#include \"hash_impl.h\"\n\n#define ARG_CHECK(cond) do { \\\n    if (EXPECT(!(cond), 0)) { \\\n        secp256k1_callback_call(&ctx->illegal_callback, #cond); \\\n        return 0; \\\n    } \\\n} while(0)\n\nstatic void default_illegal_callback_fn(const char* str, void* data) {\n    (void)data;\n    fprintf(stderr, \"[libsecp256k1] illegal argument: %s\\n\", str);\n    abort();\n}\n\nstatic const secp256k1_callback default_illegal_callback = {\n    default_illegal_callback_fn,\n    NULL\n};\n\nstatic void default_error_callback_fn(const char* str, void* data) {\n    (void)data;\n    fprintf(stderr, \"[libsecp256k1] internal consistency check failed: %s\\n\", str);\n    abort();\n}\n\nstatic const secp256k1_callback default_error_callback = {\n    default_error_callback_fn,\n    NULL\n};\n\n\nstruct secp256k1_context_struct {\n    secp256k1_ecmult_context ecmult_ctx;\n    secp256k1_ecmult_gen_context ecmult_gen_ctx;\n    secp256k1_callback illegal_callback;\n    secp256k1_callback error_callback;\n};\n\nsecp256k1_context* secp256k1_context_create(unsigned int flags) {\n    secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context));\n    ret->illegal_callback = default_illegal_callback;\n    ret->error_callback = default_error_callback;\n\n    if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) {\n            secp256k1_callback_call(&ret->illegal_callback,\n                                    \"Invalid flags\");\n            free(ret);\n            return NULL;\n    }\n\n    secp256k1_ecmult_context_init(&ret->ecmult_ctx);\n    secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx);\n\n    if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) {\n        secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &ret->error_callback);\n    }\n    if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) {\n        secp256k1_ecmult_context_build(&ret->ecmult_ctx, &ret->error_callback);\n    }\n\n    return ret;\n}\n\nsecp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) {\n    secp256k1_context* ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, sizeof(secp256k1_context));\n    ret->illegal_callback = ctx->illegal_callback;\n    ret->error_callback = ctx->error_callback;\n    secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback);\n    secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback);\n    return ret;\n}\n\nvoid secp256k1_context_destroy(secp256k1_context* ctx) {\n    if (ctx != NULL) {\n        secp256k1_ecmult_context_clear(&ctx->ecmult_ctx);\n        secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx);\n\n        free(ctx);\n    }\n}\n\nvoid secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) {\n    if (fun == NULL) {\n        fun = default_illegal_callback_fn;\n    }\n    ctx->illegal_callback.fn = fun;\n    ctx->illegal_callback.data = data;\n}\n\nvoid secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) {\n    if (fun == NULL) {\n        fun = default_error_callback_fn;\n    }\n    ctx->error_callback.fn = fun;\n    ctx->error_callback.data = data;\n}\n\nstatic int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge, const secp256k1_pubkey* pubkey) {\n    if (sizeof(secp256k1_ge_storage) == 64) {\n        /* When the secp256k1_ge_storage type is exactly 64 byte, use its\n         * representation inside secp256k1_pubkey, as conversion is very fast.\n         * Note that secp256k1_pubkey_save must use the same representation. */\n        secp256k1_ge_storage s;\n        memcpy(&s, &pubkey->data[0], 64);\n        secp256k1_ge_from_storage(ge, &s);\n    } else {\n        /* Otherwise, fall back to 32-byte big endian for X and Y. */\n        secp256k1_fe x, y;\n        secp256k1_fe_set_b32(&x, pubkey->data);\n        secp256k1_fe_set_b32(&y, pubkey->data + 32);\n        secp256k1_ge_set_xy(ge, &x, &y);\n    }\n    ARG_CHECK(!secp256k1_fe_is_zero(&ge->x));\n    return 1;\n}\n\nstatic void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) {\n    if (sizeof(secp256k1_ge_storage) == 64) {\n        secp256k1_ge_storage s;\n        secp256k1_ge_to_storage(&s, ge);\n        memcpy(&pubkey->data[0], &s, 64);\n    } else {\n        VERIFY_CHECK(!secp256k1_ge_is_infinity(ge));\n        secp256k1_fe_normalize_var(&ge->x);\n        secp256k1_fe_normalize_var(&ge->y);\n        secp256k1_fe_get_b32(pubkey->data, &ge->x);\n        secp256k1_fe_get_b32(pubkey->data + 32, &ge->y);\n    }\n}\n\nint secp256k1_ec_pubkey_parse(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen) {\n    secp256k1_ge Q;\n\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(pubkey != NULL);\n    memset(pubkey, 0, sizeof(*pubkey));\n    ARG_CHECK(input != NULL);\n    if (!secp256k1_eckey_pubkey_parse(&Q, input, inputlen)) {\n        return 0;\n    }\n    secp256k1_pubkey_save(pubkey, &Q);\n    secp256k1_ge_clear(&Q);\n    return 1;\n}\n\nint secp256k1_ec_pubkey_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey* pubkey, unsigned int flags) {\n    secp256k1_ge Q;\n    size_t len;\n    int ret = 0;\n\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(outputlen != NULL);\n    ARG_CHECK(*outputlen >= ((flags & SECP256K1_FLAGS_BIT_COMPRESSION) ? 33 : 65));\n    len = *outputlen;\n    *outputlen = 0;\n    ARG_CHECK(output != NULL);\n    memset(output, 0, len);\n    ARG_CHECK(pubkey != NULL);\n    ARG_CHECK((flags & SECP256K1_FLAGS_TYPE_MASK) == SECP256K1_FLAGS_TYPE_COMPRESSION);\n    if (secp256k1_pubkey_load(ctx, &Q, pubkey)) {\n        ret = secp256k1_eckey_pubkey_serialize(&Q, output, &len, flags & SECP256K1_FLAGS_BIT_COMPRESSION);\n        if (ret) {\n            *outputlen = len;\n        }\n    }\n    return ret;\n}\n\nstatic void secp256k1_ecdsa_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_ecdsa_signature* sig) {\n    (void)ctx;\n    if (sizeof(secp256k1_scalar) == 32) {\n        /* When the secp256k1_scalar type is exactly 32 byte, use its\n         * representation inside secp256k1_ecdsa_signature, as conversion is very fast.\n         * Note that secp256k1_ecdsa_signature_save must use the same representation. */\n        memcpy(r, &sig->data[0], 32);\n        memcpy(s, &sig->data[32], 32);\n    } else {\n        secp256k1_scalar_set_b32(r, &sig->data[0], NULL);\n        secp256k1_scalar_set_b32(s, &sig->data[32], NULL);\n    }\n}\n\nstatic void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s) {\n    if (sizeof(secp256k1_scalar) == 32) {\n        memcpy(&sig->data[0], r, 32);\n        memcpy(&sig->data[32], s, 32);\n    } else {\n        secp256k1_scalar_get_b32(&sig->data[0], r);\n        secp256k1_scalar_get_b32(&sig->data[32], s);\n    }\n}\n\nint secp256k1_ecdsa_signature_parse_der(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) {\n    secp256k1_scalar r, s;\n\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(sig != NULL);\n    ARG_CHECK(input != NULL);\n\n    if (secp256k1_ecdsa_sig_parse(&r, &s, input, inputlen)) {\n        secp256k1_ecdsa_signature_save(sig, &r, &s);\n        return 1;\n    } else {\n        memset(sig, 0, sizeof(*sig));\n        return 0;\n    }\n}\n\nint secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input64) {\n    secp256k1_scalar r, s;\n    int ret = 1;\n    int overflow = 0;\n\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(sig != NULL);\n    ARG_CHECK(input64 != NULL);\n\n    secp256k1_scalar_set_b32(&r, &input64[0], &overflow);\n    ret &= !overflow;\n    secp256k1_scalar_set_b32(&s, &input64[32], &overflow);\n    ret &= !overflow;\n    if (ret) {\n        secp256k1_ecdsa_signature_save(sig, &r, &s);\n    } else {\n        memset(sig, 0, sizeof(*sig));\n    }\n    return ret;\n}\n\nint secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig) {\n    secp256k1_scalar r, s;\n\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(output != NULL);\n    ARG_CHECK(outputlen != NULL);\n    ARG_CHECK(sig != NULL);\n\n    secp256k1_ecdsa_signature_load(ctx, &r, &s, sig);\n    return secp256k1_ecdsa_sig_serialize(output, outputlen, &r, &s);\n}\n\nint secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig) {\n    secp256k1_scalar r, s;\n\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(output64 != NULL);\n    ARG_CHECK(sig != NULL);\n\n    secp256k1_ecdsa_signature_load(ctx, &r, &s, sig);\n    secp256k1_scalar_get_b32(&output64[0], &r);\n    secp256k1_scalar_get_b32(&output64[32], &s);\n    return 1;\n}\n\nint secp256k1_ecdsa_signature_normalize(const secp256k1_context* ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) {\n    secp256k1_scalar r, s;\n    int ret = 0;\n\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(sigin != NULL);\n\n    secp256k1_ecdsa_signature_load(ctx, &r, &s, sigin);\n    ret = secp256k1_scalar_is_high(&s);\n    if (sigout != NULL) {\n        if (ret) {\n            secp256k1_scalar_negate(&s, &s);\n        }\n        secp256k1_ecdsa_signature_save(sigout, &r, &s);\n    }\n\n    return ret;\n}\n\nint secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) {\n    secp256k1_ge q;\n    secp256k1_scalar r, s;\n    secp256k1_scalar m;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));\n    ARG_CHECK(msg32 != NULL);\n    ARG_CHECK(sig != NULL);\n    ARG_CHECK(pubkey != NULL);\n\n    secp256k1_scalar_set_b32(&m, msg32, NULL);\n    secp256k1_ecdsa_signature_load(ctx, &r, &s, sig);\n    return (!secp256k1_scalar_is_high(&s) &&\n            secp256k1_pubkey_load(ctx, &q, pubkey) &&\n            secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r, &s, &q, &m));\n}\n\nstatic int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {\n   unsigned char keydata[112];\n   int keylen = 64;\n   secp256k1_rfc6979_hmac_sha256_t rng;\n   unsigned int i;\n   /* We feed a byte array to the PRNG as input, consisting of:\n    * - the private key (32 bytes) and message (32 bytes), see RFC 6979 3.2d.\n    * - optionally 32 extra bytes of data, see RFC 6979 3.6 Additional Data.\n    * - optionally 16 extra bytes with the algorithm name.\n    * Because the arguments have distinct fixed lengths it is not possible for\n    *  different argument mixtures to emulate each other and result in the same\n    *  nonces.\n    */\n   memcpy(keydata, key32, 32);\n   memcpy(keydata + 32, msg32, 32);\n   if (data != NULL) {\n       memcpy(keydata + 64, data, 32);\n       keylen = 96;\n   }\n   if (algo16 != NULL) {\n       memcpy(keydata + keylen, algo16, 16);\n       keylen += 16;\n   }\n   secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, keylen);\n   memset(keydata, 0, sizeof(keydata));\n   for (i = 0; i <= counter; i++) {\n       secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);\n   }\n   secp256k1_rfc6979_hmac_sha256_finalize(&rng);\n   return 1;\n}\n\nconst secp256k1_nonce_function secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979;\nconst secp256k1_nonce_function secp256k1_nonce_function_default = nonce_function_rfc6979;\n\nint secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) {\n    secp256k1_scalar r, s;\n    secp256k1_scalar sec, non, msg;\n    int ret = 0;\n    int overflow = 0;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));\n    ARG_CHECK(msg32 != NULL);\n    ARG_CHECK(signature != NULL);\n    ARG_CHECK(seckey != NULL);\n    if (noncefp == NULL) {\n        noncefp = secp256k1_nonce_function_default;\n    }\n\n    secp256k1_scalar_set_b32(&sec, seckey, &overflow);\n    /* Fail if the secret key is invalid. */\n    if (!overflow && !secp256k1_scalar_is_zero(&sec)) {\n        unsigned char nonce32[32];\n        unsigned int count = 0;\n        secp256k1_scalar_set_b32(&msg, msg32, NULL);\n        while (1) {\n            ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count);\n            if (!ret) {\n                break;\n            }\n            secp256k1_scalar_set_b32(&non, nonce32, &overflow);\n            if (!overflow && !secp256k1_scalar_is_zero(&non)) {\n                if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, NULL)) {\n                    break;\n                }\n            }\n            count++;\n        }\n        memset(nonce32, 0, 32);\n        secp256k1_scalar_clear(&msg);\n        secp256k1_scalar_clear(&non);\n        secp256k1_scalar_clear(&sec);\n    }\n    if (ret) {\n        secp256k1_ecdsa_signature_save(signature, &r, &s);\n    } else {\n        memset(signature, 0, sizeof(*signature));\n    }\n    return ret;\n}\n\nint secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char *seckey) {\n    secp256k1_scalar sec;\n    int ret;\n    int overflow;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(seckey != NULL);\n\n    secp256k1_scalar_set_b32(&sec, seckey, &overflow);\n    ret = !overflow && !secp256k1_scalar_is_zero(&sec);\n    secp256k1_scalar_clear(&sec);\n    return ret;\n}\n\nint secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) {\n    secp256k1_gej pj;\n    secp256k1_ge p;\n    secp256k1_scalar sec;\n    int overflow;\n    int ret = 0;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(pubkey != NULL);\n    memset(pubkey, 0, sizeof(*pubkey));\n    ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));\n    ARG_CHECK(seckey != NULL);\n\n    secp256k1_scalar_set_b32(&sec, seckey, &overflow);\n    ret = (!overflow) & (!secp256k1_scalar_is_zero(&sec));\n    if (ret) {\n        secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec);\n        secp256k1_ge_set_gej(&p, &pj);\n        secp256k1_pubkey_save(pubkey, &p);\n    }\n    secp256k1_scalar_clear(&sec);\n    return ret;\n}\n\nint secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) {\n    secp256k1_scalar term;\n    secp256k1_scalar sec;\n    int ret = 0;\n    int overflow = 0;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(seckey != NULL);\n    ARG_CHECK(tweak != NULL);\n\n    secp256k1_scalar_set_b32(&term, tweak, &overflow);\n    secp256k1_scalar_set_b32(&sec, seckey, NULL);\n\n    ret = !overflow && secp256k1_eckey_privkey_tweak_add(&sec, &term);\n    memset(seckey, 0, 32);\n    if (ret) {\n        secp256k1_scalar_get_b32(seckey, &sec);\n    }\n\n    secp256k1_scalar_clear(&sec);\n    secp256k1_scalar_clear(&term);\n    return ret;\n}\n\nint secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) {\n    secp256k1_ge p;\n    secp256k1_scalar term;\n    int ret = 0;\n    int overflow = 0;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));\n    ARG_CHECK(pubkey != NULL);\n    ARG_CHECK(tweak != NULL);\n\n    secp256k1_scalar_set_b32(&term, tweak, &overflow);\n    ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey);\n    memset(pubkey, 0, sizeof(*pubkey));\n    if (ret) {\n        if (secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term)) {\n            secp256k1_pubkey_save(pubkey, &p);\n        } else {\n            ret = 0;\n        }\n    }\n\n    return ret;\n}\n\nint secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) {\n    secp256k1_scalar factor;\n    secp256k1_scalar sec;\n    int ret = 0;\n    int overflow = 0;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(seckey != NULL);\n    ARG_CHECK(tweak != NULL);\n\n    secp256k1_scalar_set_b32(&factor, tweak, &overflow);\n    secp256k1_scalar_set_b32(&sec, seckey, NULL);\n    ret = !overflow && secp256k1_eckey_privkey_tweak_mul(&sec, &factor);\n    memset(seckey, 0, 32);\n    if (ret) {\n        secp256k1_scalar_get_b32(seckey, &sec);\n    }\n\n    secp256k1_scalar_clear(&sec);\n    secp256k1_scalar_clear(&factor);\n    return ret;\n}\n\nint secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) {\n    secp256k1_ge p;\n    secp256k1_scalar factor;\n    int ret = 0;\n    int overflow = 0;\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));\n    ARG_CHECK(pubkey != NULL);\n    ARG_CHECK(tweak != NULL);\n\n    secp256k1_scalar_set_b32(&factor, tweak, &overflow);\n    ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey);\n    memset(pubkey, 0, sizeof(*pubkey));\n    if (ret) {\n        if (secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor)) {\n            secp256k1_pubkey_save(pubkey, &p);\n        } else {\n            ret = 0;\n        }\n    }\n\n    return ret;\n}\n\nint secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) {\n    VERIFY_CHECK(ctx != NULL);\n    ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));\n    secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32);\n    return 1;\n}\n\nint secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) {\n    size_t i;\n    secp256k1_gej Qj;\n    secp256k1_ge Q;\n\n    ARG_CHECK(pubnonce != NULL);\n    memset(pubnonce, 0, sizeof(*pubnonce));\n    ARG_CHECK(n >= 1);\n    ARG_CHECK(pubnonces != NULL);\n\n    secp256k1_gej_set_infinity(&Qj);\n\n    for (i = 0; i < n; i++) {\n        secp256k1_pubkey_load(ctx, &Q, pubnonces[i]);\n        secp256k1_gej_add_ge(&Qj, &Qj, &Q);\n    }\n    if (secp256k1_gej_is_infinity(&Qj)) {\n        return 0;\n    }\n    secp256k1_ge_set_gej(&Q, &Qj);\n    secp256k1_pubkey_save(pubnonce, &Q);\n    return 1;\n}\n\n#ifdef ENABLE_MODULE_ECDH\n# include \"modules/ecdh/main_impl.h\"\n#endif\n\n#ifdef ENABLE_MODULE_SCHNORR\n# include \"modules/schnorr/main_impl.h\"\n#endif\n\n#ifdef ENABLE_MODULE_RECOVERY\n# include \"modules/recovery/main_impl.h\"\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/testrand.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_TESTRAND_H_\n#define _SECP256K1_TESTRAND_H_\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n/* A non-cryptographic RNG used only for test infrastructure. */\n\n/** Seed the pseudorandom number generator for testing. */\nSECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16);\n\n/** Generate a pseudorandom number in the range [0..2**32-1]. */\nstatic uint32_t secp256k1_rand32(void);\n\n/** Generate a pseudorandom number in the range [0..2**bits-1]. Bits must be 1 or\n *  more. */\nstatic uint32_t secp256k1_rand_bits(int bits);\n\n/** Generate a pseudorandom number in the range [0..range-1]. */\nstatic uint32_t secp256k1_rand_int(uint32_t range);\n\n/** Generate a pseudorandom 32-byte array. */\nstatic void secp256k1_rand256(unsigned char *b32);\n\n/** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */\nstatic void secp256k1_rand256_test(unsigned char *b32);\n\n/** Generate pseudorandom bytes with long sequences of zero and one bits. */\nstatic void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len);\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/testrand_impl.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013-2015 Pieter Wuille                              *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_TESTRAND_IMPL_H_\n#define _SECP256K1_TESTRAND_IMPL_H_\n\n#include <stdint.h>\n#include <string.h>\n\n#include \"testrand.h\"\n#include \"hash.h\"\n\nstatic secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng;\nstatic uint32_t secp256k1_test_rng_precomputed[8];\nstatic int secp256k1_test_rng_precomputed_used = 8;\nstatic uint64_t secp256k1_test_rng_integer;\nstatic int secp256k1_test_rng_integer_bits_left = 0;\n\nSECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) {\n    secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, seed16, 16);\n}\n\nSECP256K1_INLINE static uint32_t secp256k1_rand32(void) {\n    if (secp256k1_test_rng_precomputed_used == 8) {\n        secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, (unsigned char*)(&secp256k1_test_rng_precomputed[0]), sizeof(secp256k1_test_rng_precomputed));\n        secp256k1_test_rng_precomputed_used = 0;\n    }\n    return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++];\n}\n\nstatic uint32_t secp256k1_rand_bits(int bits) {\n    uint32_t ret;\n    if (secp256k1_test_rng_integer_bits_left < bits) {\n        secp256k1_test_rng_integer |= (((uint64_t)secp256k1_rand32()) << secp256k1_test_rng_integer_bits_left);\n        secp256k1_test_rng_integer_bits_left += 32;\n    }\n    ret = secp256k1_test_rng_integer;\n    secp256k1_test_rng_integer >>= bits;\n    secp256k1_test_rng_integer_bits_left -= bits;\n    ret &= ((~((uint32_t)0)) >> (32 - bits));\n    return ret;\n}\n\nstatic uint32_t secp256k1_rand_int(uint32_t range) {\n    /* We want a uniform integer between 0 and range-1, inclusive.\n     * B is the smallest number such that range <= 2**B.\n     * two mechanisms implemented here:\n     * - generate B bits numbers until one below range is found, and return it\n     * - find the largest multiple M of range that is <= 2**(B+A), generate B+A\n     *   bits numbers until one below M is found, and return it modulo range\n     * The second mechanism consumes A more bits of entropy in every iteration,\n     * but may need fewer iterations due to M being closer to 2**(B+A) then\n     * range is to 2**B. The array below (indexed by B) contains a 0 when the\n     * first mechanism is to be used, and the number A otherwise.\n     */\n    static const int addbits[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0};\n    uint32_t trange, mult;\n    int bits = 0;\n    if (range <= 1) {\n        return 0;\n    }\n    trange = range - 1;\n    while (trange > 0) {\n        trange >>= 1;\n        bits++;\n    }\n    if (addbits[bits]) {\n        bits = bits + addbits[bits];\n        mult = ((~((uint32_t)0)) >> (32 - bits)) / range;\n        trange = range * mult;\n    } else {\n        trange = range;\n        mult = 1;\n    }\n    while(1) {\n        uint32_t x = secp256k1_rand_bits(bits);\n        if (x < trange) {\n            return (mult == 1) ? x : (x % range);\n        }\n    }\n}\n\nstatic void secp256k1_rand256(unsigned char *b32) {\n    secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32);\n}\n\nstatic void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len) {\n    size_t bits = 0;\n    memset(bytes, 0, len);\n    while (bits < len * 8) {\n        int now;\n        uint32_t val;\n        now = 1 + (secp256k1_rand_bits(6) * secp256k1_rand_bits(5) + 16) / 31;\n        val = secp256k1_rand_bits(1);\n        while (now > 0 && bits < len * 8) {\n            bytes[bits / 8] |= val << (bits % 8);\n            now--;\n            bits++;\n        }\n    }\n}\n\nstatic void secp256k1_rand256_test(unsigned char *b32) {\n    secp256k1_rand_bytes_test(b32, 32);\n}\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/tests.c",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell      *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <time.h>\n\n#include \"secp256k1.c\"\n#include \"include/secp256k1.h\"\n#include \"testrand_impl.h\"\n\n#ifdef ENABLE_OPENSSL_TESTS\n#include \"openssl/bn.h\"\n#include \"openssl/ec.h\"\n#include \"openssl/ecdsa.h\"\n#include \"openssl/obj_mac.h\"\n#endif\n\n#include \"contrib/lax_der_parsing.c\"\n#include \"contrib/lax_der_privatekey_parsing.c\"\n\n#if !defined(VG_CHECK)\n# if defined(VALGRIND)\n#  include <valgrind/memcheck.h>\n#  define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y))\n#  define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y))\n# else\n#  define VG_UNDEF(x,y)\n#  define VG_CHECK(x,y)\n# endif\n#endif\n\nstatic int count = 64;\nstatic secp256k1_context *ctx = NULL;\n\nstatic void counting_illegal_callback_fn(const char* str, void* data) {\n    /* Dummy callback function that just counts. */\n    int32_t *p;\n    (void)str;\n    p = data;\n    (*p)++;\n}\n\nstatic void uncounting_illegal_callback_fn(const char* str, void* data) {\n    /* Dummy callback function that just counts (backwards). */\n    int32_t *p;\n    (void)str;\n    p = data;\n    (*p)--;\n}\n\nvoid random_field_element_test(secp256k1_fe *fe) {\n    do {\n        unsigned char b32[32];\n        secp256k1_rand256_test(b32);\n        if (secp256k1_fe_set_b32(fe, b32)) {\n            break;\n        }\n    } while(1);\n}\n\nvoid random_field_element_magnitude(secp256k1_fe *fe) {\n    secp256k1_fe zero;\n    int n = secp256k1_rand_int(9);\n    secp256k1_fe_normalize(fe);\n    if (n == 0) {\n        return;\n    }\n    secp256k1_fe_clear(&zero);\n    secp256k1_fe_negate(&zero, &zero, 0);\n    secp256k1_fe_mul_int(&zero, n - 1);\n    secp256k1_fe_add(fe, &zero);\n    VERIFY_CHECK(fe->magnitude == n);\n}\n\nvoid random_group_element_test(secp256k1_ge *ge) {\n    secp256k1_fe fe;\n    do {\n        random_field_element_test(&fe);\n        if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) {\n            secp256k1_fe_normalize(&ge->y);\n            break;\n        }\n    } while(1);\n}\n\nvoid random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge) {\n    secp256k1_fe z2, z3;\n    do {\n        random_field_element_test(&gej->z);\n        if (!secp256k1_fe_is_zero(&gej->z)) {\n            break;\n        }\n    } while(1);\n    secp256k1_fe_sqr(&z2, &gej->z);\n    secp256k1_fe_mul(&z3, &z2, &gej->z);\n    secp256k1_fe_mul(&gej->x, &ge->x, &z2);\n    secp256k1_fe_mul(&gej->y, &ge->y, &z3);\n    gej->infinity = ge->infinity;\n}\n\nvoid random_scalar_order_test(secp256k1_scalar *num) {\n    do {\n        unsigned char b32[32];\n        int overflow = 0;\n        secp256k1_rand256_test(b32);\n        secp256k1_scalar_set_b32(num, b32, &overflow);\n        if (overflow || secp256k1_scalar_is_zero(num)) {\n            continue;\n        }\n        break;\n    } while(1);\n}\n\nvoid random_scalar_order(secp256k1_scalar *num) {\n    do {\n        unsigned char b32[32];\n        int overflow = 0;\n        secp256k1_rand256(b32);\n        secp256k1_scalar_set_b32(num, b32, &overflow);\n        if (overflow || secp256k1_scalar_is_zero(num)) {\n            continue;\n        }\n        break;\n    } while(1);\n}\n\nvoid run_context_tests(void) {\n    secp256k1_pubkey pubkey;\n    secp256k1_ecdsa_signature sig;\n    unsigned char ctmp[32];\n    int32_t ecount;\n    int32_t ecount2;\n    secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE);\n    secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);\n    secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);\n    secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n\n    secp256k1_gej pubj;\n    secp256k1_ge pub;\n    secp256k1_scalar msg, key, nonce;\n    secp256k1_scalar sigr, sigs;\n\n    ecount = 0;\n    ecount2 = 10;\n    secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount);\n    secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount2);\n    secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, NULL);\n    CHECK(vrfy->error_callback.fn != sign->error_callback.fn);\n\n    /*** clone and destroy all of them to make sure cloning was complete ***/\n    {\n        secp256k1_context *ctx_tmp;\n\n        ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp);\n        ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp);\n        ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_destroy(ctx_tmp);\n        ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp);\n    }\n\n    /* Verify that the error callback makes it across the clone. */\n    CHECK(vrfy->error_callback.fn != sign->error_callback.fn);\n    /* And that it resets back to default. */\n    secp256k1_context_set_error_callback(sign, NULL, NULL);\n    CHECK(vrfy->error_callback.fn == sign->error_callback.fn);\n\n    /*** attempt to use them ***/\n    random_scalar_order_test(&msg);\n    random_scalar_order_test(&key);\n    secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key);\n    secp256k1_ge_set_gej(&pub, &pubj);\n\n    /* Verify context-type checking illegal-argument errors. */\n    memset(ctmp, 1, 32);\n    CHECK(secp256k1_ec_pubkey_create(vrfy, &pubkey, ctmp) == 0);\n    CHECK(ecount == 1);\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(sign, &pubkey, ctmp) == 1);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ecdsa_sign(vrfy, &sig, ctmp, ctmp, NULL, NULL) == 0);\n    CHECK(ecount == 2);\n    VG_UNDEF(&sig, sizeof(sig));\n    CHECK(secp256k1_ecdsa_sign(sign, &sig, ctmp, ctmp, NULL, NULL) == 1);\n    VG_CHECK(&sig, sizeof(sig));\n    CHECK(ecount2 == 10);\n    CHECK(secp256k1_ecdsa_verify(sign, &sig, ctmp, &pubkey) == 0);\n    CHECK(ecount2 == 11);\n    CHECK(secp256k1_ecdsa_verify(vrfy, &sig, ctmp, &pubkey) == 1);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ec_pubkey_tweak_add(sign, &pubkey, ctmp) == 0);\n    CHECK(ecount2 == 12);\n    CHECK(secp256k1_ec_pubkey_tweak_add(vrfy, &pubkey, ctmp) == 1);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_ec_pubkey_tweak_mul(sign, &pubkey, ctmp) == 0);\n    CHECK(ecount2 == 13);\n    CHECK(secp256k1_ec_pubkey_tweak_mul(vrfy, &pubkey, ctmp) == 1);\n    CHECK(ecount == 2);\n    CHECK(secp256k1_context_randomize(vrfy, ctmp) == 0);\n    CHECK(ecount == 3);\n    CHECK(secp256k1_context_randomize(sign, NULL) == 1);\n    CHECK(ecount2 == 13);\n    secp256k1_context_set_illegal_callback(vrfy, NULL, NULL);\n    secp256k1_context_set_illegal_callback(sign, NULL, NULL);\n\n    /* This shouldn't leak memory, due to already-set tests. */\n    secp256k1_ecmult_gen_context_build(&sign->ecmult_gen_ctx, NULL);\n    secp256k1_ecmult_context_build(&vrfy->ecmult_ctx, NULL);\n\n    /* obtain a working nonce */\n    do {\n        random_scalar_order_test(&nonce);\n    } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));\n\n    /* try signing */\n    CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));\n    CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL));\n\n    /* try verifying */\n    CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sigr, &sigs, &pub, &msg));\n    CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sigr, &sigs, &pub, &msg));\n\n    /* cleanup */\n    secp256k1_context_destroy(none);\n    secp256k1_context_destroy(sign);\n    secp256k1_context_destroy(vrfy);\n    secp256k1_context_destroy(both);\n    /* Defined as no-op. */\n    secp256k1_context_destroy(NULL);\n}\n\n/***** HASH TESTS *****/\n\nvoid run_sha256_tests(void) {\n    static const char *inputs[8] = {\n        \"\", \"abc\", \"message digest\", \"secure hash algorithm\", \"SHA256 is considered to be safe\",\n        \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n        \"For this sample, this 63-byte string will be used as input data\",\n        \"This is exactly 64 bytes long, not counting the terminating byte\"\n    };\n    static const unsigned char outputs[8][32] = {\n        {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55},\n        {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad},\n        {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5, 0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb, 0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50},\n        {0xf3, 0x0c, 0xeb, 0x2b, 0xb2, 0x82, 0x9e, 0x79, 0xe4, 0xca, 0x97, 0x53, 0xd3, 0x5a, 0x8e, 0xcc, 0x00, 0x26, 0x2d, 0x16, 0x4c, 0xc0, 0x77, 0x08, 0x02, 0x95, 0x38, 0x1c, 0xbd, 0x64, 0x3f, 0x0d},\n        {0x68, 0x19, 0xd9, 0x15, 0xc7, 0x3f, 0x4d, 0x1e, 0x77, 0xe4, 0xe1, 0xb5, 0x2d, 0x1f, 0xa0, 0xf9, 0xcf, 0x9b, 0xea, 0xea, 0xd3, 0x93, 0x9f, 0x15, 0x87, 0x4b, 0xd9, 0x88, 0xe2, 0xa2, 0x36, 0x30},\n        {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1},\n        {0xf0, 0x8a, 0x78, 0xcb, 0xba, 0xee, 0x08, 0x2b, 0x05, 0x2a, 0xe0, 0x70, 0x8f, 0x32, 0xfa, 0x1e, 0x50, 0xc5, 0xc4, 0x21, 0xaa, 0x77, 0x2b, 0xa5, 0xdb, 0xb4, 0x06, 0xa2, 0xea, 0x6b, 0xe3, 0x42},\n        {0xab, 0x64, 0xef, 0xf7, 0xe8, 0x8e, 0x2e, 0x46, 0x16, 0x5e, 0x29, 0xf2, 0xbc, 0xe4, 0x18, 0x26, 0xbd, 0x4c, 0x7b, 0x35, 0x52, 0xf6, 0xb3, 0x82, 0xa9, 0xe7, 0xd3, 0xaf, 0x47, 0xc2, 0x45, 0xf8}\n    };\n    int i;\n    for (i = 0; i < 8; i++) {\n        unsigned char out[32];\n        secp256k1_sha256_t hasher;\n        secp256k1_sha256_initialize(&hasher);\n        secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));\n        secp256k1_sha256_finalize(&hasher, out);\n        CHECK(memcmp(out, outputs[i], 32) == 0);\n        if (strlen(inputs[i]) > 0) {\n            int split = secp256k1_rand_int(strlen(inputs[i]));\n            secp256k1_sha256_initialize(&hasher);\n            secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split);\n            secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);\n            secp256k1_sha256_finalize(&hasher, out);\n            CHECK(memcmp(out, outputs[i], 32) == 0);\n        }\n    }\n}\n\nvoid run_hmac_sha256_tests(void) {\n    static const char *keys[6] = {\n        \"\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\\x0b\",\n        \"\\x4a\\x65\\x66\\x65\",\n        \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\",\n        \"\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\",\n        \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\",\n        \"\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\\xaa\"\n    };\n    static const char *inputs[6] = {\n        \"\\x48\\x69\\x20\\x54\\x68\\x65\\x72\\x65\",\n        \"\\x77\\x68\\x61\\x74\\x20\\x64\\x6f\\x20\\x79\\x61\\x20\\x77\\x61\\x6e\\x74\\x20\\x66\\x6f\\x72\\x20\\x6e\\x6f\\x74\\x68\\x69\\x6e\\x67\\x3f\",\n        \"\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\\xdd\",\n        \"\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\\xcd\",\n        \"\\x54\\x65\\x73\\x74\\x20\\x55\\x73\\x69\\x6e\\x67\\x20\\x4c\\x61\\x72\\x67\\x65\\x72\\x20\\x54\\x68\\x61\\x6e\\x20\\x42\\x6c\\x6f\\x63\\x6b\\x2d\\x53\\x69\\x7a\\x65\\x20\\x4b\\x65\\x79\\x20\\x2d\\x20\\x48\\x61\\x73\\x68\\x20\\x4b\\x65\\x79\\x20\\x46\\x69\\x72\\x73\\x74\",\n        \"\\x54\\x68\\x69\\x73\\x20\\x69\\x73\\x20\\x61\\x20\\x74\\x65\\x73\\x74\\x20\\x75\\x73\\x69\\x6e\\x67\\x20\\x61\\x20\\x6c\\x61\\x72\\x67\\x65\\x72\\x20\\x74\\x68\\x61\\x6e\\x20\\x62\\x6c\\x6f\\x63\\x6b\\x2d\\x73\\x69\\x7a\\x65\\x20\\x6b\\x65\\x79\\x20\\x61\\x6e\\x64\\x20\\x61\\x20\\x6c\\x61\\x72\\x67\\x65\\x72\\x20\\x74\\x68\\x61\\x6e\\x20\\x62\\x6c\\x6f\\x63\\x6b\\x2d\\x73\\x69\\x7a\\x65\\x20\\x64\\x61\\x74\\x61\\x2e\\x20\\x54\\x68\\x65\\x20\\x6b\\x65\\x79\\x20\\x6e\\x65\\x65\\x64\\x73\\x20\\x74\\x6f\\x20\\x62\\x65\\x20\\x68\\x61\\x73\\x68\\x65\\x64\\x20\\x62\\x65\\x66\\x6f\\x72\\x65\\x20\\x62\\x65\\x69\\x6e\\x67\\x20\\x75\\x73\\x65\\x64\\x20\\x62\\x79\\x20\\x74\\x68\\x65\\x20\\x48\\x4d\\x41\\x43\\x20\\x61\\x6c\\x67\\x6f\\x72\\x69\\x74\\x68\\x6d\\x2e\"\n    };\n    static const unsigned char outputs[6][32] = {\n        {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7},\n        {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43},\n        {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe},\n        {0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b},\n        {0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54},\n        {0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2}\n    };\n    int i;\n    for (i = 0; i < 6; i++) {\n        secp256k1_hmac_sha256_t hasher;\n        unsigned char out[32];\n        secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));\n        secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i]));\n        secp256k1_hmac_sha256_finalize(&hasher, out);\n        CHECK(memcmp(out, outputs[i], 32) == 0);\n        if (strlen(inputs[i]) > 0) {\n            int split = secp256k1_rand_int(strlen(inputs[i]));\n            secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i]));\n            secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split);\n            secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split);\n            secp256k1_hmac_sha256_finalize(&hasher, out);\n            CHECK(memcmp(out, outputs[i], 32) == 0);\n        }\n    }\n}\n\nvoid run_rfc6979_hmac_sha256_tests(void) {\n    static const unsigned char key1[65] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a, 0};\n    static const unsigned char out1[3][32] = {\n        {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb},\n        {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a},\n        {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e}\n    };\n\n    static const unsigned char key2[64] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55};\n    static const unsigned char out2[3][32] = {\n        {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95},\n        {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9},\n        {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94}\n    };\n\n    secp256k1_rfc6979_hmac_sha256_t rng;\n    unsigned char out[32];\n    int i;\n\n    secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64);\n    for (i = 0; i < 3; i++) {\n        secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);\n        CHECK(memcmp(out, out1[i], 32) == 0);\n    }\n    secp256k1_rfc6979_hmac_sha256_finalize(&rng);\n\n    secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65);\n    for (i = 0; i < 3; i++) {\n        secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);\n        CHECK(memcmp(out, out1[i], 32) != 0);\n    }\n    secp256k1_rfc6979_hmac_sha256_finalize(&rng);\n\n    secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64);\n    for (i = 0; i < 3; i++) {\n        secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32);\n        CHECK(memcmp(out, out2[i], 32) == 0);\n    }\n    secp256k1_rfc6979_hmac_sha256_finalize(&rng);\n}\n\n/***** RANDOM TESTS *****/\n\nvoid test_rand_bits(int rand32, int bits) {\n    /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to\n     * get a false negative chance below once in a billion */\n    static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316};\n    /* We try multiplying the results with various odd numbers, which shouldn't\n     * influence the uniform distribution modulo a power of 2. */\n    static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011};\n    /* We only select up to 6 bits from the output to analyse */\n    unsigned int usebits = bits > 6 ? 6 : bits;\n    unsigned int maxshift = bits - usebits;\n    /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit\n       number, track all observed outcomes, one per bit in a uint64_t. */\n    uint64_t x[6][27] = {{0}};\n    unsigned int i, shift, m;\n    /* Multiply the output of all rand calls with the odd number m, which\n       should not change the uniformity of its distribution. */\n    for (i = 0; i < rounds[usebits]; i++) {\n        uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits));\n        CHECK((((uint64_t)r) >> bits) == 0);\n        for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) {\n            uint32_t rm = r * mults[m];\n            for (shift = 0; shift <= maxshift; shift++) {\n                x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1)));\n            }\n        }\n    }\n    for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) {\n        for (shift = 0; shift <= maxshift; shift++) {\n            /* Test that the lower usebits bits of x[shift] are 1 */\n            CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0);\n        }\n    }\n}\n\n/* Subrange must be a whole divisor of range, and at most 64 */\nvoid test_rand_int(uint32_t range, uint32_t subrange) {\n    /* (1-1/subrange)^rounds < 1/10^9 */\n    int rounds = (subrange * 2073) / 100;\n    int i;\n    uint64_t x = 0;\n    CHECK((range % subrange) == 0);\n    for (i = 0; i < rounds; i++) {\n        uint32_t r = secp256k1_rand_int(range);\n        CHECK(r < range);\n        r = r % subrange;\n        x |= (((uint64_t)1) << r);\n    }\n    /* Test that the lower subrange bits of x are 1. */\n    CHECK(((~x) << (64 - subrange)) == 0);\n}\n\nvoid run_rand_bits(void) {\n    size_t b;\n    test_rand_bits(1, 32);\n    for (b = 1; b <= 32; b++) {\n        test_rand_bits(0, b);\n    }\n}\n\nvoid run_rand_int(void) {\n    static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432};\n    static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64};\n    unsigned int m, s;\n    for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) {\n        for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) {\n            test_rand_int(ms[m] * ss[s], ss[s]);\n        }\n    }\n}\n\n/***** NUM TESTS *****/\n\n#ifndef USE_NUM_NONE\nvoid random_num_negate(secp256k1_num *num) {\n    if (secp256k1_rand_bits(1)) {\n        secp256k1_num_negate(num);\n    }\n}\n\nvoid random_num_order_test(secp256k1_num *num) {\n    secp256k1_scalar sc;\n    random_scalar_order_test(&sc);\n    secp256k1_scalar_get_num(num, &sc);\n}\n\nvoid random_num_order(secp256k1_num *num) {\n    secp256k1_scalar sc;\n    random_scalar_order(&sc);\n    secp256k1_scalar_get_num(num, &sc);\n}\n\nvoid test_num_negate(void) {\n    secp256k1_num n1;\n    secp256k1_num n2;\n    random_num_order_test(&n1); /* n1 = R */\n    random_num_negate(&n1);\n    secp256k1_num_copy(&n2, &n1); /* n2 = R */\n    secp256k1_num_sub(&n1, &n2, &n1); /* n1 = n2-n1 = 0 */\n    CHECK(secp256k1_num_is_zero(&n1));\n    secp256k1_num_copy(&n1, &n2); /* n1 = R */\n    secp256k1_num_negate(&n1); /* n1 = -R */\n    CHECK(!secp256k1_num_is_zero(&n1));\n    secp256k1_num_add(&n1, &n2, &n1); /* n1 = n2+n1 = 0 */\n    CHECK(secp256k1_num_is_zero(&n1));\n    secp256k1_num_copy(&n1, &n2); /* n1 = R */\n    secp256k1_num_negate(&n1); /* n1 = -R */\n    CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2));\n    secp256k1_num_negate(&n1); /* n1 = R */\n    CHECK(secp256k1_num_eq(&n1, &n2));\n}\n\nvoid test_num_add_sub(void) {\n    int i;\n    secp256k1_scalar s;\n    secp256k1_num n1;\n    secp256k1_num n2;\n    secp256k1_num n1p2, n2p1, n1m2, n2m1;\n    random_num_order_test(&n1); /* n1 = R1 */\n    if (secp256k1_rand_bits(1)) {\n        random_num_negate(&n1);\n    }\n    random_num_order_test(&n2); /* n2 = R2 */\n    if (secp256k1_rand_bits(1)) {\n        random_num_negate(&n2);\n    }\n    secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */\n    secp256k1_num_add(&n2p1, &n2, &n1); /* n2p1 = R2 + R1 */\n    secp256k1_num_sub(&n1m2, &n1, &n2); /* n1m2 = R1 - R2 */\n    secp256k1_num_sub(&n2m1, &n2, &n1); /* n2m1 = R2 - R1 */\n    CHECK(secp256k1_num_eq(&n1p2, &n2p1));\n    CHECK(!secp256k1_num_eq(&n1p2, &n1m2));\n    secp256k1_num_negate(&n2m1); /* n2m1 = -R2 + R1 */\n    CHECK(secp256k1_num_eq(&n2m1, &n1m2));\n    CHECK(!secp256k1_num_eq(&n2m1, &n1));\n    secp256k1_num_add(&n2m1, &n2m1, &n2); /* n2m1 = -R2 + R1 + R2 = R1 */\n    CHECK(secp256k1_num_eq(&n2m1, &n1));\n    CHECK(!secp256k1_num_eq(&n2p1, &n1));\n    secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */\n    CHECK(secp256k1_num_eq(&n2p1, &n1));\n\n    /* check is_one */\n    secp256k1_scalar_set_int(&s, 1);\n    secp256k1_scalar_get_num(&n1, &s);\n    CHECK(secp256k1_num_is_one(&n1));\n    /* check that 2^n + 1 is never 1 */\n    secp256k1_scalar_get_num(&n2, &s);\n    for (i = 0; i < 250; ++i) {\n        secp256k1_num_add(&n1, &n1, &n1);    /* n1 *= 2 */\n        secp256k1_num_add(&n1p2, &n1, &n2);  /* n1p2 = n1 + 1 */\n        CHECK(!secp256k1_num_is_one(&n1p2));\n    }\n}\n\nvoid test_num_mod(void) {\n    int i;\n    secp256k1_scalar s;\n    secp256k1_num order, n;\n\n    /* check that 0 mod anything is 0 */\n    random_scalar_order_test(&s);\n    secp256k1_scalar_get_num(&order, &s);\n    secp256k1_scalar_set_int(&s, 0);\n    secp256k1_scalar_get_num(&n, &s);\n    secp256k1_num_mod(&n, &order);\n    CHECK(secp256k1_num_is_zero(&n));\n\n    /* check that anything mod 1 is 0 */\n    secp256k1_scalar_set_int(&s, 1);\n    secp256k1_scalar_get_num(&order, &s);\n    secp256k1_scalar_get_num(&n, &s);\n    secp256k1_num_mod(&n, &order);\n    CHECK(secp256k1_num_is_zero(&n));\n\n    /* check that increasing the number past 2^256 does not break this */\n    random_scalar_order_test(&s);\n    secp256k1_scalar_get_num(&n, &s);\n    /* multiply by 2^8, which'll test this case with high probability */\n    for (i = 0; i < 8; ++i) {\n        secp256k1_num_add(&n, &n, &n);\n    }\n    secp256k1_num_mod(&n, &order);\n    CHECK(secp256k1_num_is_zero(&n));\n}\n\nvoid test_num_jacobi(void) {\n    secp256k1_scalar sqr;\n    secp256k1_scalar small;\n    secp256k1_scalar five;  /* five is not a quadratic residue */\n    secp256k1_num order, n;\n    int i;\n    /* squares mod 5 are 1, 4 */\n    const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 };\n\n    /* check some small values with 5 as the order */\n    secp256k1_scalar_set_int(&five, 5);\n    secp256k1_scalar_get_num(&order, &five);\n    for (i = 0; i < 10; ++i) {\n        secp256k1_scalar_set_int(&small, i);\n        secp256k1_scalar_get_num(&n, &small);\n        CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]);\n    }\n\n    /** test large values with 5 as group order */\n    secp256k1_scalar_get_num(&order, &five);\n    /* we first need a scalar which is not a multiple of 5 */\n    do {\n        secp256k1_num fiven;\n        random_scalar_order_test(&sqr);\n        secp256k1_scalar_get_num(&fiven, &five);\n        secp256k1_scalar_get_num(&n, &sqr);\n        secp256k1_num_mod(&n, &fiven);\n    } while (secp256k1_num_is_zero(&n));\n    /* next force it to be a residue. 2 is a nonresidue mod 5 so we can\n     * just multiply by two, i.e. add the number to itself */\n    if (secp256k1_num_jacobi(&n, &order) == -1) {\n        secp256k1_num_add(&n, &n, &n);\n    }\n\n    /* test residue */\n    CHECK(secp256k1_num_jacobi(&n, &order) == 1);\n    /* test nonresidue */\n    secp256k1_num_add(&n, &n, &n);\n    CHECK(secp256k1_num_jacobi(&n, &order) == -1);\n\n    /** test with secp group order as order */\n    secp256k1_scalar_order_get_num(&order);\n    random_scalar_order_test(&sqr);\n    secp256k1_scalar_sqr(&sqr, &sqr);\n    /* test residue */\n    secp256k1_scalar_get_num(&n, &sqr);\n    CHECK(secp256k1_num_jacobi(&n, &order) == 1);\n    /* test nonresidue */\n    secp256k1_scalar_mul(&sqr, &sqr, &five);\n    secp256k1_scalar_get_num(&n, &sqr);\n    CHECK(secp256k1_num_jacobi(&n, &order) == -1);\n    /* test multiple of the order*/\n    CHECK(secp256k1_num_jacobi(&order, &order) == 0);\n\n    /* check one less than the order */\n    secp256k1_scalar_set_int(&small, 1);\n    secp256k1_scalar_get_num(&n, &small);\n    secp256k1_num_sub(&n, &order, &n);\n    CHECK(secp256k1_num_jacobi(&n, &order) == 1);  /* sage confirms this is 1 */\n}\n\nvoid run_num_smalltests(void) {\n    int i;\n    for (i = 0; i < 100*count; i++) {\n        test_num_negate();\n        test_num_add_sub();\n        test_num_mod();\n        test_num_jacobi();\n    }\n}\n#endif\n\n/***** SCALAR TESTS *****/\n\nvoid scalar_test(void) {\n    secp256k1_scalar s;\n    secp256k1_scalar s1;\n    secp256k1_scalar s2;\n#ifndef USE_NUM_NONE\n    secp256k1_num snum, s1num, s2num;\n    secp256k1_num order, half_order;\n#endif\n    unsigned char c[32];\n\n    /* Set 's' to a random scalar, with value 'snum'. */\n    random_scalar_order_test(&s);\n\n    /* Set 's1' to a random scalar, with value 's1num'. */\n    random_scalar_order_test(&s1);\n\n    /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */\n    random_scalar_order_test(&s2);\n    secp256k1_scalar_get_b32(c, &s2);\n\n#ifndef USE_NUM_NONE\n    secp256k1_scalar_get_num(&snum, &s);\n    secp256k1_scalar_get_num(&s1num, &s1);\n    secp256k1_scalar_get_num(&s2num, &s2);\n\n    secp256k1_scalar_order_get_num(&order);\n    half_order = order;\n    secp256k1_num_shift(&half_order, 1);\n#endif\n\n    {\n        int i;\n        /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */\n        secp256k1_scalar n;\n        secp256k1_scalar_set_int(&n, 0);\n        for (i = 0; i < 256; i += 4) {\n            secp256k1_scalar t;\n            int j;\n            secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4));\n            for (j = 0; j < 4; j++) {\n                secp256k1_scalar_add(&n, &n, &n);\n            }\n            secp256k1_scalar_add(&n, &n, &t);\n        }\n        CHECK(secp256k1_scalar_eq(&n, &s));\n    }\n\n    {\n        /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */\n        secp256k1_scalar n;\n        int i = 0;\n        secp256k1_scalar_set_int(&n, 0);\n        while (i < 256) {\n            secp256k1_scalar t;\n            int j;\n            int now = secp256k1_rand_int(15) + 1;\n            if (now + i > 256) {\n                now = 256 - i;\n            }\n            secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now));\n            for (j = 0; j < now; j++) {\n                secp256k1_scalar_add(&n, &n, &n);\n            }\n            secp256k1_scalar_add(&n, &n, &t);\n            i += now;\n        }\n        CHECK(secp256k1_scalar_eq(&n, &s));\n    }\n\n#ifndef USE_NUM_NONE\n    {\n        /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */\n        secp256k1_num rnum;\n        secp256k1_num r2num;\n        secp256k1_scalar r;\n        secp256k1_num_add(&rnum, &snum, &s2num);\n        secp256k1_num_mod(&rnum, &order);\n        secp256k1_scalar_add(&r, &s, &s2);\n        secp256k1_scalar_get_num(&r2num, &r);\n        CHECK(secp256k1_num_eq(&rnum, &r2num));\n    }\n\n    {\n        /* Test that multiplying the scalars is equal to multiplying their numbers modulo the order. */\n        secp256k1_scalar r;\n        secp256k1_num r2num;\n        secp256k1_num rnum;\n        secp256k1_num_mul(&rnum, &snum, &s2num);\n        secp256k1_num_mod(&rnum, &order);\n        secp256k1_scalar_mul(&r, &s, &s2);\n        secp256k1_scalar_get_num(&r2num, &r);\n        CHECK(secp256k1_num_eq(&rnum, &r2num));\n        /* The result can only be zero if at least one of the factors was zero. */\n        CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2)));\n        /* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */\n        CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2)));\n        CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s)));\n    }\n\n    {\n        secp256k1_scalar neg;\n        secp256k1_num negnum;\n        secp256k1_num negnum2;\n        /* Check that comparison with zero matches comparison with zero on the number. */\n        CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s));\n        /* Check that comparison with the half order is equal to testing for high scalar. */\n        CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0));\n        secp256k1_scalar_negate(&neg, &s);\n        secp256k1_num_sub(&negnum, &order, &snum);\n        secp256k1_num_mod(&negnum, &order);\n        /* Check that comparison with the half order is equal to testing for high scalar after negation. */\n        CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0));\n        /* Negating should change the high property, unless the value was already zero. */\n        CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s));\n        secp256k1_scalar_get_num(&negnum2, &neg);\n        /* Negating a scalar should be equal to (order - n) mod order on the number. */\n        CHECK(secp256k1_num_eq(&negnum, &negnum2));\n        secp256k1_scalar_add(&neg, &neg, &s);\n        /* Adding a number to its negation should result in zero. */\n        CHECK(secp256k1_scalar_is_zero(&neg));\n        secp256k1_scalar_negate(&neg, &neg);\n        /* Negating zero should still result in zero. */\n        CHECK(secp256k1_scalar_is_zero(&neg));\n    }\n\n    {\n        /* Test secp256k1_scalar_mul_shift_var. */\n        secp256k1_scalar r;\n        secp256k1_num one;\n        secp256k1_num rnum;\n        secp256k1_num rnum2;\n        unsigned char cone[1] = {0x01};\n        unsigned int shift = 256 + secp256k1_rand_int(257);\n        secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift);\n        secp256k1_num_mul(&rnum, &s1num, &s2num);\n        secp256k1_num_shift(&rnum, shift - 1);\n        secp256k1_num_set_bin(&one, cone, 1);\n        secp256k1_num_add(&rnum, &rnum, &one);\n        secp256k1_num_shift(&rnum, 1);\n        secp256k1_scalar_get_num(&rnum2, &r);\n        CHECK(secp256k1_num_eq(&rnum, &rnum2));\n    }\n\n    {\n        /* test secp256k1_scalar_shr_int */\n        secp256k1_scalar r;\n        int i;\n        random_scalar_order_test(&r);\n        for (i = 0; i < 100; ++i) {\n            int low;\n            int shift = 1 + secp256k1_rand_int(15);\n            int expected = r.d[0] % (1 << shift);\n            low = secp256k1_scalar_shr_int(&r, shift);\n            CHECK(expected == low);\n        }\n    }\n#endif\n\n    {\n        /* Test that scalar inverses are equal to the inverse of their number modulo the order. */\n        if (!secp256k1_scalar_is_zero(&s)) {\n            secp256k1_scalar inv;\n#ifndef USE_NUM_NONE\n            secp256k1_num invnum;\n            secp256k1_num invnum2;\n#endif\n            secp256k1_scalar_inverse(&inv, &s);\n#ifndef USE_NUM_NONE\n            secp256k1_num_mod_inverse(&invnum, &snum, &order);\n            secp256k1_scalar_get_num(&invnum2, &inv);\n            CHECK(secp256k1_num_eq(&invnum, &invnum2));\n#endif\n            secp256k1_scalar_mul(&inv, &inv, &s);\n            /* Multiplying a scalar with its inverse must result in one. */\n            CHECK(secp256k1_scalar_is_one(&inv));\n            secp256k1_scalar_inverse(&inv, &inv);\n            /* Inverting one must result in one. */\n            CHECK(secp256k1_scalar_is_one(&inv));\n#ifndef USE_NUM_NONE\n            secp256k1_scalar_get_num(&invnum, &inv);\n            CHECK(secp256k1_num_is_one(&invnum));\n#endif\n        }\n    }\n\n    {\n        /* Test commutativity of add. */\n        secp256k1_scalar r1, r2;\n        secp256k1_scalar_add(&r1, &s1, &s2);\n        secp256k1_scalar_add(&r2, &s2, &s1);\n        CHECK(secp256k1_scalar_eq(&r1, &r2));\n    }\n\n    {\n        secp256k1_scalar r1, r2;\n        secp256k1_scalar b;\n        int i;\n        /* Test add_bit. */\n        int bit = secp256k1_rand_bits(8);\n        secp256k1_scalar_set_int(&b, 1);\n        CHECK(secp256k1_scalar_is_one(&b));\n        for (i = 0; i < bit; i++) {\n            secp256k1_scalar_add(&b, &b, &b);\n        }\n        r1 = s1;\n        r2 = s1;\n        if (!secp256k1_scalar_add(&r1, &r1, &b)) {\n            /* No overflow happened. */\n            secp256k1_scalar_cadd_bit(&r2, bit, 1);\n            CHECK(secp256k1_scalar_eq(&r1, &r2));\n            /* cadd is a noop when flag is zero */\n            secp256k1_scalar_cadd_bit(&r2, bit, 0);\n            CHECK(secp256k1_scalar_eq(&r1, &r2));\n        }\n    }\n\n    {\n        /* Test commutativity of mul. */\n        secp256k1_scalar r1, r2;\n        secp256k1_scalar_mul(&r1, &s1, &s2);\n        secp256k1_scalar_mul(&r2, &s2, &s1);\n        CHECK(secp256k1_scalar_eq(&r1, &r2));\n    }\n\n    {\n        /* Test associativity of add. */\n        secp256k1_scalar r1, r2;\n        secp256k1_scalar_add(&r1, &s1, &s2);\n        secp256k1_scalar_add(&r1, &r1, &s);\n        secp256k1_scalar_add(&r2, &s2, &s);\n        secp256k1_scalar_add(&r2, &s1, &r2);\n        CHECK(secp256k1_scalar_eq(&r1, &r2));\n    }\n\n    {\n        /* Test associativity of mul. */\n        secp256k1_scalar r1, r2;\n        secp256k1_scalar_mul(&r1, &s1, &s2);\n        secp256k1_scalar_mul(&r1, &r1, &s);\n        secp256k1_scalar_mul(&r2, &s2, &s);\n        secp256k1_scalar_mul(&r2, &s1, &r2);\n        CHECK(secp256k1_scalar_eq(&r1, &r2));\n    }\n\n    {\n        /* Test distributitivity of mul over add. */\n        secp256k1_scalar r1, r2, t;\n        secp256k1_scalar_add(&r1, &s1, &s2);\n        secp256k1_scalar_mul(&r1, &r1, &s);\n        secp256k1_scalar_mul(&r2, &s1, &s);\n        secp256k1_scalar_mul(&t, &s2, &s);\n        secp256k1_scalar_add(&r2, &r2, &t);\n        CHECK(secp256k1_scalar_eq(&r1, &r2));\n    }\n\n    {\n        /* Test square. */\n        secp256k1_scalar r1, r2;\n        secp256k1_scalar_sqr(&r1, &s1);\n        secp256k1_scalar_mul(&r2, &s1, &s1);\n        CHECK(secp256k1_scalar_eq(&r1, &r2));\n    }\n\n    {\n        /* Test multiplicative identity. */\n        secp256k1_scalar r1, v1;\n        secp256k1_scalar_set_int(&v1,1);\n        secp256k1_scalar_mul(&r1, &s1, &v1);\n        CHECK(secp256k1_scalar_eq(&r1, &s1));\n    }\n\n    {\n        /* Test additive identity. */\n        secp256k1_scalar r1, v0;\n        secp256k1_scalar_set_int(&v0,0);\n        secp256k1_scalar_add(&r1, &s1, &v0);\n        CHECK(secp256k1_scalar_eq(&r1, &s1));\n    }\n\n    {\n        /* Test zero product property. */\n        secp256k1_scalar r1, v0;\n        secp256k1_scalar_set_int(&v0,0);\n        secp256k1_scalar_mul(&r1, &s1, &v0);\n        CHECK(secp256k1_scalar_eq(&r1, &v0));\n    }\n\n}\n\nvoid run_scalar_tests(void) {\n    int i;\n    for (i = 0; i < 128 * count; i++) {\n        scalar_test();\n    }\n\n    {\n        /* (-1)+1 should be zero. */\n        secp256k1_scalar s, o;\n        secp256k1_scalar_set_int(&s, 1);\n        CHECK(secp256k1_scalar_is_one(&s));\n        secp256k1_scalar_negate(&o, &s);\n        secp256k1_scalar_add(&o, &o, &s);\n        CHECK(secp256k1_scalar_is_zero(&o));\n        secp256k1_scalar_negate(&o, &o);\n        CHECK(secp256k1_scalar_is_zero(&o));\n    }\n\n#ifndef USE_NUM_NONE\n    {\n        /* A scalar with value of the curve order should be 0. */\n        secp256k1_num order;\n        secp256k1_scalar zero;\n        unsigned char bin[32];\n        int overflow = 0;\n        secp256k1_scalar_order_get_num(&order);\n        secp256k1_num_get_bin(bin, 32, &order);\n        secp256k1_scalar_set_b32(&zero, bin, &overflow);\n        CHECK(overflow == 1);\n        CHECK(secp256k1_scalar_is_zero(&zero));\n    }\n#endif\n\n    {\n        /* Does check_overflow check catch all ones? */\n        static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST(\n            0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,\n            0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL\n        );\n        CHECK(secp256k1_scalar_check_overflow(&overflowed));\n    }\n\n    {\n        /* Static test vectors.\n         * These were reduced from ~10^12 random vectors based on comparison-decision\n         *  and edge-case coverage on 32-bit and 64-bit implementations.\n         * The responses were generated with Sage 5.9.\n         */\n        secp256k1_scalar x;\n        secp256k1_scalar y;\n        secp256k1_scalar z;\n        secp256k1_scalar zz;\n        secp256k1_scalar one;\n        secp256k1_scalar r1;\n        secp256k1_scalar r2;\n#if defined(USE_SCALAR_INV_NUM)\n        secp256k1_scalar zzv;\n#endif\n        int overflow;\n        unsigned char chal[33][2][32] = {\n            {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,\n              0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}},\n            {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},\n             {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,\n              0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}},\n            {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,\n              0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00},\n             {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}},\n            {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,\n              0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0,\n              0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,\n              0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}},\n            {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,\n              0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,\n              0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f,\n              0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}},\n            {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f,\n              0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,\n              0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00,\n              0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},\n             {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,\n              0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff,\n              0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00,\n              0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,\n              0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00,\n              0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0},\n             {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},\n            {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00,\n              0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,\n              0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},\n            {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n            {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f},\n             {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,\n              0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff,\n              0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},\n            {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff,\n              0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80,\n              0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff},\n             {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}},\n            {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff,\n              0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,\n              0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f,\n              0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}},\n            {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00},\n             {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}},\n            {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00,\n              0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n             {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}},\n            {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,\n              0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00,\n              0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n            {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00},\n             {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},\n             {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80,\n              0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,\n              0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}},\n            {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff,\n              0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00,\n              0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},\n            {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,\n              0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,\n              0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}},\n            {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n            {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n             {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0,\n              0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,\n              0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}},\n            {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,\n              0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,\n              0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00,\n              0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,\n              0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},\n             {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},\n            {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,\n              0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,\n              0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}},\n            {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00},\n             {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,\n              0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f,\n              0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}},\n            {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01,\n              0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00},\n             {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,\n              0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80,\n              0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8,\n              0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80},\n             {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00,\n              0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f,\n              0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}},\n            {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00,\n              0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83,\n              0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80,\n              0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0},\n             {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,\n              0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}},\n            {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,\n              0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,\n              0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03},\n             {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,\n              0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb,\n              0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}}\n        };\n        unsigned char res[33][2][32] = {\n            {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9,\n              0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1,\n              0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6,\n              0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35},\n             {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d,\n              0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c,\n              0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49,\n              0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}},\n            {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22,\n              0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c,\n              0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f,\n              0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8},\n             {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77,\n              0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4,\n              0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59,\n              0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}},\n            {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef,\n              0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab,\n              0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55,\n              0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c},\n             {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96,\n              0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f,\n              0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12,\n              0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}},\n            {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c,\n              0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf,\n              0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9,\n              0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48},\n             {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42,\n              0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5,\n              0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c,\n              0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}},\n            {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb,\n              0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74,\n              0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6,\n              0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63},\n             {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3,\n              0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99,\n              0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58,\n              0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}},\n            {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b,\n              0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7,\n              0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f,\n              0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0},\n             {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d,\n              0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d,\n              0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9,\n              0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}},\n            {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7,\n              0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70,\n              0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06,\n              0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e},\n             {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9,\n              0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79,\n              0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e,\n              0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}},\n            {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb,\n              0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5,\n              0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a,\n              0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe},\n             {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48,\n              0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e,\n              0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc,\n              0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}},\n            {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b,\n              0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0,\n              0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53,\n              0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8},\n             {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c,\n              0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01,\n              0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f,\n              0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}},\n            {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7,\n              0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c,\n              0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92,\n              0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30},\n             {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62,\n              0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e,\n              0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb,\n              0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}},\n            {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25,\n              0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d,\n              0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0,\n              0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13},\n             {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60,\n              0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00,\n              0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4,\n              0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}},\n            {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31,\n              0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4,\n              0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88,\n              0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa},\n             {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57,\n              0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38,\n              0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51,\n              0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}},\n            {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c,\n              0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f,\n              0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2,\n              0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4},\n             {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01,\n              0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4,\n              0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86,\n              0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}},\n            {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5,\n              0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51,\n              0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3,\n              0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62},\n             {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c,\n              0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91,\n              0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c,\n              0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}},\n            {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e,\n              0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56,\n              0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58,\n              0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4},\n             {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41,\n              0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7,\n              0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92,\n              0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}},\n            {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec,\n              0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19,\n              0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3,\n              0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4},\n             {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87,\n              0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a,\n              0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92,\n              0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}},\n            {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64,\n              0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3,\n              0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f,\n              0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33},\n             {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c,\n              0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d,\n              0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea,\n              0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}},\n            {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7,\n              0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a,\n              0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae,\n              0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe},\n             {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc,\n              0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39,\n              0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14,\n              0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}},\n            {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23,\n              0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d,\n              0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2,\n              0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16},\n             {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c,\n              0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84,\n              0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0,\n              0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}},\n            {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb,\n              0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94,\n              0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b,\n              0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e},\n             {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54,\n              0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00,\n              0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb,\n              0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}},\n            {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n            {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},\n            {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,\n              0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,\n              0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,\n              0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92},\n             {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,\n              0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,\n              0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,\n              0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},\n            {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0,\n              0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b,\n              0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94,\n              0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8},\n             {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26,\n              0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d,\n              0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a,\n              0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}},\n            {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n              0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,\n              0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd},\n             {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1,\n              0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0,\n              0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59,\n              0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}},\n            {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n              0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,\n              0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,\n              0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40},\n             {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}},\n            {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39,\n              0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea,\n              0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf,\n              0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae},\n             {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b,\n              0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb,\n              0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6,\n              0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}},\n            {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a,\n              0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f,\n              0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9,\n              0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56},\n             {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93,\n              0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07,\n              0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71,\n              0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}},\n            {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87,\n              0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9,\n              0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55,\n              0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73},\n             {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d,\n              0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86,\n              0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb,\n              0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}},\n            {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2,\n              0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7,\n              0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41,\n              0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7},\n             {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06,\n              0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04,\n              0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08,\n              0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}},\n            {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2,\n              0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b,\n              0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40,\n              0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68},\n             {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e,\n              0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a,\n              0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b,\n              0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}},\n            {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67,\n              0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f,\n              0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a,\n              0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51},\n             {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2,\n              0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38,\n              0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34,\n              0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}},\n            {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,\n              0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,\n              0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,\n              0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5},\n             {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34,\n              0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13,\n              0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46,\n              0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}}\n        };\n        secp256k1_scalar_set_int(&one, 1);\n        for (i = 0; i < 33; i++) {\n            secp256k1_scalar_set_b32(&x, chal[i][0], &overflow);\n            CHECK(!overflow);\n            secp256k1_scalar_set_b32(&y, chal[i][1], &overflow);\n            CHECK(!overflow);\n            secp256k1_scalar_set_b32(&r1, res[i][0], &overflow);\n            CHECK(!overflow);\n            secp256k1_scalar_set_b32(&r2, res[i][1], &overflow);\n            CHECK(!overflow);\n            secp256k1_scalar_mul(&z, &x, &y);\n            CHECK(!secp256k1_scalar_check_overflow(&z));\n            CHECK(secp256k1_scalar_eq(&r1, &z));\n            if (!secp256k1_scalar_is_zero(&y)) {\n                secp256k1_scalar_inverse(&zz, &y);\n                CHECK(!secp256k1_scalar_check_overflow(&zz));\n#if defined(USE_SCALAR_INV_NUM)\n                secp256k1_scalar_inverse_var(&zzv, &y);\n                CHECK(secp256k1_scalar_eq(&zzv, &zz));\n#endif\n                secp256k1_scalar_mul(&z, &z, &zz);\n                CHECK(!secp256k1_scalar_check_overflow(&z));\n                CHECK(secp256k1_scalar_eq(&x, &z));\n                secp256k1_scalar_mul(&zz, &zz, &y);\n                CHECK(!secp256k1_scalar_check_overflow(&zz));\n                CHECK(secp256k1_scalar_eq(&one, &zz));\n            }\n            secp256k1_scalar_mul(&z, &x, &x);\n            CHECK(!secp256k1_scalar_check_overflow(&z));\n            secp256k1_scalar_sqr(&zz, &x);\n            CHECK(!secp256k1_scalar_check_overflow(&zz));\n            CHECK(secp256k1_scalar_eq(&zz, &z));\n            CHECK(secp256k1_scalar_eq(&r2, &zz));\n        }\n    }\n}\n\n/***** FIELD TESTS *****/\n\nvoid random_fe(secp256k1_fe *x) {\n    unsigned char bin[32];\n    do {\n        secp256k1_rand256(bin);\n        if (secp256k1_fe_set_b32(x, bin)) {\n            return;\n        }\n    } while(1);\n}\n\nvoid random_fe_test(secp256k1_fe *x) {\n    unsigned char bin[32];\n    do {\n        secp256k1_rand256_test(bin);\n        if (secp256k1_fe_set_b32(x, bin)) {\n            return;\n        }\n    } while(1);\n}\n\nvoid random_fe_non_zero(secp256k1_fe *nz) {\n    int tries = 10;\n    while (--tries >= 0) {\n        random_fe(nz);\n        secp256k1_fe_normalize(nz);\n        if (!secp256k1_fe_is_zero(nz)) {\n            break;\n        }\n    }\n    /* Infinitesimal probability of spurious failure here */\n    CHECK(tries >= 0);\n}\n\nvoid random_fe_non_square(secp256k1_fe *ns) {\n    secp256k1_fe r;\n    random_fe_non_zero(ns);\n    if (secp256k1_fe_sqrt(&r, ns)) {\n        secp256k1_fe_negate(ns, ns, 1);\n    }\n}\n\nint check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) {\n    secp256k1_fe an = *a;\n    secp256k1_fe bn = *b;\n    secp256k1_fe_normalize_weak(&an);\n    secp256k1_fe_normalize_var(&bn);\n    return secp256k1_fe_equal_var(&an, &bn);\n}\n\nint check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai) {\n    secp256k1_fe x;\n    secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);\n    secp256k1_fe_mul(&x, a, ai);\n    return check_fe_equal(&x, &one);\n}\n\nvoid run_field_convert(void) {\n    static const unsigned char b32[32] = {\n        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n        0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n        0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,\n        0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40\n    };\n    static const secp256k1_fe_storage fes = SECP256K1_FE_STORAGE_CONST(\n        0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,\n        0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL\n    );\n    static const secp256k1_fe fe = SECP256K1_FE_CONST(\n        0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL,\n        0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL\n    );\n    secp256k1_fe fe2;\n    unsigned char b322[32];\n    secp256k1_fe_storage fes2;\n    /* Check conversions to fe. */\n    CHECK(secp256k1_fe_set_b32(&fe2, b32));\n    CHECK(secp256k1_fe_equal_var(&fe, &fe2));\n    secp256k1_fe_from_storage(&fe2, &fes);\n    CHECK(secp256k1_fe_equal_var(&fe, &fe2));\n    /* Check conversion from fe. */\n    secp256k1_fe_get_b32(b322, &fe);\n    CHECK(memcmp(b322, b32, 32) == 0);\n    secp256k1_fe_to_storage(&fes2, &fe);\n    CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0);\n}\n\nint fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b) {\n    secp256k1_fe t = *b;\n#ifdef VERIFY\n    t.magnitude = a->magnitude;\n    t.normalized = a->normalized;\n#endif\n    return memcmp(a, &t, sizeof(secp256k1_fe));\n}\n\nvoid run_field_misc(void) {\n    secp256k1_fe x;\n    secp256k1_fe y;\n    secp256k1_fe z;\n    secp256k1_fe q;\n    secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5);\n    int i, j;\n    for (i = 0; i < 5*count; i++) {\n        secp256k1_fe_storage xs, ys, zs;\n        random_fe(&x);\n        random_fe_non_zero(&y);\n        /* Test the fe equality and comparison operations. */\n        CHECK(secp256k1_fe_cmp_var(&x, &x) == 0);\n        CHECK(secp256k1_fe_equal_var(&x, &x));\n        z = x;\n        secp256k1_fe_add(&z,&y);\n        /* Test fe conditional move; z is not normalized here. */\n        q = x;\n        secp256k1_fe_cmov(&x, &z, 0);\n        VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude);\n        secp256k1_fe_cmov(&x, &x, 1);\n        CHECK(fe_memcmp(&x, &z) != 0);\n        CHECK(fe_memcmp(&x, &q) == 0);\n        secp256k1_fe_cmov(&q, &z, 1);\n        VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude);\n        CHECK(fe_memcmp(&q, &z) == 0);\n        secp256k1_fe_normalize_var(&x);\n        secp256k1_fe_normalize_var(&z);\n        CHECK(!secp256k1_fe_equal_var(&x, &z));\n        secp256k1_fe_normalize_var(&q);\n        secp256k1_fe_cmov(&q, &z, (i&1));\n        VERIFY_CHECK(q.normalized && q.magnitude == 1);\n        for (j = 0; j < 6; j++) {\n            secp256k1_fe_negate(&z, &z, j+1);\n            secp256k1_fe_normalize_var(&q);\n            secp256k1_fe_cmov(&q, &z, (j&1));\n            VERIFY_CHECK(!q.normalized && q.magnitude == (j+2));\n        }\n        secp256k1_fe_normalize_var(&z);\n        /* Test storage conversion and conditional moves. */\n        secp256k1_fe_to_storage(&xs, &x);\n        secp256k1_fe_to_storage(&ys, &y);\n        secp256k1_fe_to_storage(&zs, &z);\n        secp256k1_fe_storage_cmov(&zs, &xs, 0);\n        secp256k1_fe_storage_cmov(&zs, &zs, 1);\n        CHECK(memcmp(&xs, &zs, sizeof(xs)) != 0);\n        secp256k1_fe_storage_cmov(&ys, &xs, 1);\n        CHECK(memcmp(&xs, &ys, sizeof(xs)) == 0);\n        secp256k1_fe_from_storage(&x, &xs);\n        secp256k1_fe_from_storage(&y, &ys);\n        secp256k1_fe_from_storage(&z, &zs);\n        /* Test that mul_int, mul, and add agree. */\n        secp256k1_fe_add(&y, &x);\n        secp256k1_fe_add(&y, &x);\n        z = x;\n        secp256k1_fe_mul_int(&z, 3);\n        CHECK(check_fe_equal(&y, &z));\n        secp256k1_fe_add(&y, &x);\n        secp256k1_fe_add(&z, &x);\n        CHECK(check_fe_equal(&z, &y));\n        z = x;\n        secp256k1_fe_mul_int(&z, 5);\n        secp256k1_fe_mul(&q, &x, &fe5);\n        CHECK(check_fe_equal(&z, &q));\n        secp256k1_fe_negate(&x, &x, 1);\n        secp256k1_fe_add(&z, &x);\n        secp256k1_fe_add(&q, &x);\n        CHECK(check_fe_equal(&y, &z));\n        CHECK(check_fe_equal(&q, &y));\n    }\n}\n\nvoid run_field_inv(void) {\n    secp256k1_fe x, xi, xii;\n    int i;\n    for (i = 0; i < 10*count; i++) {\n        random_fe_non_zero(&x);\n        secp256k1_fe_inv(&xi, &x);\n        CHECK(check_fe_inverse(&x, &xi));\n        secp256k1_fe_inv(&xii, &xi);\n        CHECK(check_fe_equal(&x, &xii));\n    }\n}\n\nvoid run_field_inv_var(void) {\n    secp256k1_fe x, xi, xii;\n    int i;\n    for (i = 0; i < 10*count; i++) {\n        random_fe_non_zero(&x);\n        secp256k1_fe_inv_var(&xi, &x);\n        CHECK(check_fe_inverse(&x, &xi));\n        secp256k1_fe_inv_var(&xii, &xi);\n        CHECK(check_fe_equal(&x, &xii));\n    }\n}\n\nvoid run_field_inv_all_var(void) {\n    secp256k1_fe x[16], xi[16], xii[16];\n    int i;\n    /* Check it's safe to call for 0 elements */\n    secp256k1_fe_inv_all_var(xi, x, 0);\n    for (i = 0; i < count; i++) {\n        size_t j;\n        size_t len = secp256k1_rand_int(15) + 1;\n        for (j = 0; j < len; j++) {\n            random_fe_non_zero(&x[j]);\n        }\n        secp256k1_fe_inv_all_var(xi, x, len);\n        for (j = 0; j < len; j++) {\n            CHECK(check_fe_inverse(&x[j], &xi[j]));\n        }\n        secp256k1_fe_inv_all_var(xii, xi, len);\n        for (j = 0; j < len; j++) {\n            CHECK(check_fe_equal(&x[j], &xii[j]));\n        }\n    }\n}\n\nvoid run_sqr(void) {\n    secp256k1_fe x, s;\n\n    {\n        int i;\n        secp256k1_fe_set_int(&x, 1);\n        secp256k1_fe_negate(&x, &x, 1);\n\n        for (i = 1; i <= 512; ++i) {\n            secp256k1_fe_mul_int(&x, 2);\n            secp256k1_fe_normalize(&x);\n            secp256k1_fe_sqr(&s, &x);\n        }\n    }\n}\n\nvoid test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) {\n    secp256k1_fe r1, r2;\n    int v = secp256k1_fe_sqrt(&r1, a);\n    CHECK((v == 0) == (k == NULL));\n\n    if (k != NULL) {\n        /* Check that the returned root is +/- the given known answer */\n        secp256k1_fe_negate(&r2, &r1, 1);\n        secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k);\n        secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2);\n        CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2));\n    }\n}\n\nvoid run_sqrt(void) {\n    secp256k1_fe ns, x, s, t;\n    int i;\n\n    /* Check sqrt(0) is 0 */\n    secp256k1_fe_set_int(&x, 0);\n    secp256k1_fe_sqr(&s, &x);\n    test_sqrt(&s, &x);\n\n    /* Check sqrt of small squares (and their negatives) */\n    for (i = 1; i <= 100; i++) {\n        secp256k1_fe_set_int(&x, i);\n        secp256k1_fe_sqr(&s, &x);\n        test_sqrt(&s, &x);\n        secp256k1_fe_negate(&t, &s, 1);\n        test_sqrt(&t, NULL);\n    }\n\n    /* Consistency checks for large random values */\n    for (i = 0; i < 10; i++) {\n        int j;\n        random_fe_non_square(&ns);\n        for (j = 0; j < count; j++) {\n            random_fe(&x);\n            secp256k1_fe_sqr(&s, &x);\n            test_sqrt(&s, &x);\n            secp256k1_fe_negate(&t, &s, 1);\n            test_sqrt(&t, NULL);\n            secp256k1_fe_mul(&t, &s, &ns);\n            test_sqrt(&t, NULL);\n        }\n    }\n}\n\n/***** GROUP TESTS *****/\n\nvoid ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) {\n    CHECK(a->infinity == b->infinity);\n    if (a->infinity) {\n        return;\n    }\n    CHECK(secp256k1_fe_equal_var(&a->x, &b->x));\n    CHECK(secp256k1_fe_equal_var(&a->y, &b->y));\n}\n\n/* This compares jacobian points including their Z, not just their geometric meaning. */\nint gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) {\n    secp256k1_gej a2;\n    secp256k1_gej b2;\n    int ret = 1;\n    ret &= a->infinity == b->infinity;\n    if (ret && !a->infinity) {\n        a2 = *a;\n        b2 = *b;\n        secp256k1_fe_normalize(&a2.x);\n        secp256k1_fe_normalize(&a2.y);\n        secp256k1_fe_normalize(&a2.z);\n        secp256k1_fe_normalize(&b2.x);\n        secp256k1_fe_normalize(&b2.y);\n        secp256k1_fe_normalize(&b2.z);\n        ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0;\n        ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0;\n        ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0;\n    }\n    return ret;\n}\n\nvoid ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) {\n    secp256k1_fe z2s;\n    secp256k1_fe u1, u2, s1, s2;\n    CHECK(a->infinity == b->infinity);\n    if (a->infinity) {\n        return;\n    }\n    /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */\n    secp256k1_fe_sqr(&z2s, &b->z);\n    secp256k1_fe_mul(&u1, &a->x, &z2s);\n    u2 = b->x; secp256k1_fe_normalize_weak(&u2);\n    secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z);\n    s2 = b->y; secp256k1_fe_normalize_weak(&s2);\n    CHECK(secp256k1_fe_equal_var(&u1, &u2));\n    CHECK(secp256k1_fe_equal_var(&s1, &s2));\n}\n\nvoid test_ge(void) {\n    int i, i1;\n#ifdef USE_ENDOMORPHISM\n    int runs = 6;\n#else\n    int runs = 4;\n#endif\n    /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4).\n     * The second in each pair of identical points uses a random Z coordinate in the Jacobian form.\n     * All magnitudes are randomized.\n     * All 17*17 combinations of points are added to each other, using all applicable methods.\n     *\n     * When the endomorphism code is compiled in, p5 = lambda*p1 and p6 = lambda^2*p1 are added as well.\n     */\n    secp256k1_ge *ge = (secp256k1_ge *)malloc(sizeof(secp256k1_ge) * (1 + 4 * runs));\n    secp256k1_gej *gej = (secp256k1_gej *)malloc(sizeof(secp256k1_gej) * (1 + 4 * runs));\n    secp256k1_fe *zinv = (secp256k1_fe *)malloc(sizeof(secp256k1_fe) * (1 + 4 * runs));\n    secp256k1_fe zf;\n    secp256k1_fe zfi2, zfi3;\n\n    secp256k1_gej_set_infinity(&gej[0]);\n    secp256k1_ge_clear(&ge[0]);\n    secp256k1_ge_set_gej_var(&ge[0], &gej[0]);\n    for (i = 0; i < runs; i++) {\n        int j;\n        secp256k1_ge g;\n        random_group_element_test(&g);\n#ifdef USE_ENDOMORPHISM\n        if (i >= runs - 2) {\n            secp256k1_ge_mul_lambda(&g, &ge[1]);\n        }\n        if (i >= runs - 1) {\n            secp256k1_ge_mul_lambda(&g, &g);\n        }\n#endif\n        ge[1 + 4 * i] = g;\n        ge[2 + 4 * i] = g;\n        secp256k1_ge_neg(&ge[3 + 4 * i], &g);\n        secp256k1_ge_neg(&ge[4 + 4 * i], &g);\n        secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]);\n        random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]);\n        secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]);\n        random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]);\n        for (j = 0; j < 4; j++) {\n            random_field_element_magnitude(&ge[1 + j + 4 * i].x);\n            random_field_element_magnitude(&ge[1 + j + 4 * i].y);\n            random_field_element_magnitude(&gej[1 + j + 4 * i].x);\n            random_field_element_magnitude(&gej[1 + j + 4 * i].y);\n            random_field_element_magnitude(&gej[1 + j + 4 * i].z);\n        }\n    }\n\n    /* Compute z inverses. */\n    {\n        secp256k1_fe *zs = malloc(sizeof(secp256k1_fe) * (1 + 4 * runs));\n        for (i = 0; i < 4 * runs + 1; i++) {\n            if (i == 0) {\n                /* The point at infinity does not have a meaningful z inverse. Any should do. */\n                do {\n                    random_field_element_test(&zs[i]);\n                } while(secp256k1_fe_is_zero(&zs[i]));\n            } else {\n                zs[i] = gej[i].z;\n            }\n        }\n        secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1);\n        free(zs);\n    }\n\n    /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */\n    do {\n        random_field_element_test(&zf);\n    } while(secp256k1_fe_is_zero(&zf));\n    random_field_element_magnitude(&zf);\n    secp256k1_fe_inv_var(&zfi3, &zf);\n    secp256k1_fe_sqr(&zfi2, &zfi3);\n    secp256k1_fe_mul(&zfi3, &zfi3, &zfi2);\n\n    for (i1 = 0; i1 < 1 + 4 * runs; i1++) {\n        int i2;\n        for (i2 = 0; i2 < 1 + 4 * runs; i2++) {\n            /* Compute reference result using gej + gej (var). */\n            secp256k1_gej refj, resj;\n            secp256k1_ge ref;\n            secp256k1_fe zr;\n            secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);\n            /* Check Z ratio. */\n            if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) {\n                secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);\n                CHECK(secp256k1_fe_equal_var(&zrz, &refj.z));\n            }\n            secp256k1_ge_set_gej_var(&ref, &refj);\n\n            /* Test gej + ge with Z ratio result (var). */\n            secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);\n            ge_equals_gej(&ref, &resj);\n            if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {\n                secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);\n                CHECK(secp256k1_fe_equal_var(&zrz, &resj.z));\n            }\n\n            /* Test gej + ge (var, with additional Z factor). */\n            {\n                secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */\n                secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2);\n                secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3);\n                random_field_element_magnitude(&ge2_zfi.x);\n                random_field_element_magnitude(&ge2_zfi.y);\n                secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);\n                ge_equals_gej(&ref, &resj);\n            }\n\n            /* Test gej + ge (const). */\n            if (i2 != 0) {\n                /* secp256k1_gej_add_ge does not support its second argument being infinity. */\n                secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);\n                ge_equals_gej(&ref, &resj);\n            }\n\n            /* Test doubling (var). */\n            if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) {\n                secp256k1_fe zr2;\n                /* Normal doubling with Z ratio result. */\n                secp256k1_gej_double_var(&resj, &gej[i1], &zr2);\n                ge_equals_gej(&ref, &resj);\n                /* Check Z ratio. */\n                secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);\n                CHECK(secp256k1_fe_equal_var(&zr2, &resj.z));\n                /* Normal doubling. */\n                secp256k1_gej_double_var(&resj, &gej[i2], NULL);\n                ge_equals_gej(&ref, &resj);\n            }\n\n            /* Test adding opposites. */\n            if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) {\n                CHECK(secp256k1_ge_is_infinity(&ref));\n            }\n\n            /* Test adding infinity. */\n            if (i1 == 0) {\n                CHECK(secp256k1_ge_is_infinity(&ge[i1]));\n                CHECK(secp256k1_gej_is_infinity(&gej[i1]));\n                ge_equals_gej(&ref, &gej[i2]);\n            }\n            if (i2 == 0) {\n                CHECK(secp256k1_ge_is_infinity(&ge[i2]));\n                CHECK(secp256k1_gej_is_infinity(&gej[i2]));\n                ge_equals_gej(&ref, &gej[i1]);\n            }\n        }\n    }\n\n    /* Test adding all points together in random order equals infinity. */\n    {\n        secp256k1_gej sum = SECP256K1_GEJ_CONST_INFINITY;\n        secp256k1_gej *gej_shuffled = (secp256k1_gej *)malloc((4 * runs + 1) * sizeof(secp256k1_gej));\n        for (i = 0; i < 4 * runs + 1; i++) {\n            gej_shuffled[i] = gej[i];\n        }\n        for (i = 0; i < 4 * runs + 1; i++) {\n            int swap = i + secp256k1_rand_int(4 * runs + 1 - i);\n            if (swap != i) {\n                secp256k1_gej t = gej_shuffled[i];\n                gej_shuffled[i] = gej_shuffled[swap];\n                gej_shuffled[swap] = t;\n            }\n        }\n        for (i = 0; i < 4 * runs + 1; i++) {\n            secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL);\n        }\n        CHECK(secp256k1_gej_is_infinity(&sum));\n        free(gej_shuffled);\n    }\n\n    /* Test batch gej -> ge conversion with and without known z ratios. */\n    {\n        secp256k1_fe *zr = (secp256k1_fe *)malloc((4 * runs + 1) * sizeof(secp256k1_fe));\n        secp256k1_ge *ge_set_table = (secp256k1_ge *)malloc((4 * runs + 1) * sizeof(secp256k1_ge));\n        secp256k1_ge *ge_set_all = (secp256k1_ge *)malloc((4 * runs + 1) * sizeof(secp256k1_ge));\n        for (i = 0; i < 4 * runs + 1; i++) {\n            /* Compute gej[i + 1].z / gez[i].z (with gej[n].z taken to be 1). */\n            if (i < 4 * runs) {\n                secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z);\n            }\n        }\n        secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1);\n        secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->error_callback);\n        for (i = 0; i < 4 * runs + 1; i++) {\n            secp256k1_fe s;\n            random_fe_non_zero(&s);\n            secp256k1_gej_rescale(&gej[i], &s);\n            ge_equals_gej(&ge_set_table[i], &gej[i]);\n            ge_equals_gej(&ge_set_all[i], &gej[i]);\n        }\n        free(ge_set_table);\n        free(ge_set_all);\n        free(zr);\n    }\n\n    free(ge);\n    free(gej);\n    free(zinv);\n}\n\nvoid test_add_neg_y_diff_x(void) {\n    /* The point of this test is to check that we can add two points\n     * whose y-coordinates are negatives of each other but whose x\n     * coordinates differ. If the x-coordinates were the same, these\n     * points would be negatives of each other and their sum is\n     * infinity. This is cool because it \"covers up\" any degeneracy\n     * in the addition algorithm that would cause the xy coordinates\n     * of the sum to be wrong (since infinity has no xy coordinates).\n     * HOWEVER, if the x-coordinates are different, infinity is the\n     * wrong answer, and such degeneracies are exposed. This is the\n     * root of https://github.com/bitcoin-core/secp256k1/issues/257\n     * which this test is a regression test for.\n     *\n     * These points were generated in sage as\n     * # secp256k1 params\n     * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F)\n     * C = EllipticCurve ([F (0), F (7)])\n     * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798)\n     * N = FiniteField(G.order())\n     *\n     * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F)\n     * x = polygen(N)\n     * lam  = (1 - x^3).roots()[1][0]\n     *\n     * # random \"bad pair\"\n     * P = C.random_element()\n     * Q = -int(lam) * P\n     * print \"    P: %x %x\" % P.xy()\n     * print \"    Q: %x %x\" % Q.xy()\n     * print \"P + Q: %x %x\" % (P + Q).xy()\n     */\n    secp256k1_gej aj = SECP256K1_GEJ_CONST(\n        0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30,\n        0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb,\n        0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8,\n        0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d\n    );\n    secp256k1_gej bj = SECP256K1_GEJ_CONST(\n        0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86,\n        0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7,\n        0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57,\n        0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2\n    );\n    secp256k1_gej sumj = SECP256K1_GEJ_CONST(\n        0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027,\n        0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a,\n        0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08,\n        0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe\n    );\n    secp256k1_ge b;\n    secp256k1_gej resj;\n    secp256k1_ge res;\n    secp256k1_ge_set_gej(&b, &bj);\n\n    secp256k1_gej_add_var(&resj, &aj, &bj, NULL);\n    secp256k1_ge_set_gej(&res, &resj);\n    ge_equals_gej(&res, &sumj);\n\n    secp256k1_gej_add_ge(&resj, &aj, &b);\n    secp256k1_ge_set_gej(&res, &resj);\n    ge_equals_gej(&res, &sumj);\n\n    secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL);\n    secp256k1_ge_set_gej(&res, &resj);\n    ge_equals_gej(&res, &sumj);\n}\n\nvoid run_ge(void) {\n    int i;\n    for (i = 0; i < count * 32; i++) {\n        test_ge();\n    }\n    test_add_neg_y_diff_x();\n}\n\nvoid test_ec_combine(void) {\n    secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);\n    secp256k1_pubkey data[6];\n    const secp256k1_pubkey* d[6];\n    secp256k1_pubkey sd;\n    secp256k1_pubkey sd2;\n    secp256k1_gej Qj;\n    secp256k1_ge Q;\n    int i;\n    for (i = 1; i <= 6; i++) {\n        secp256k1_scalar s;\n        random_scalar_order_test(&s);\n        secp256k1_scalar_add(&sum, &sum, &s);\n        secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &s);\n        secp256k1_ge_set_gej(&Q, &Qj);\n        secp256k1_pubkey_save(&data[i - 1], &Q);\n        d[i - 1] = &data[i - 1];\n        secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &sum);\n        secp256k1_ge_set_gej(&Q, &Qj);\n        secp256k1_pubkey_save(&sd, &Q);\n        CHECK(secp256k1_ec_pubkey_combine(ctx, &sd2, d, i) == 1);\n        CHECK(memcmp(&sd, &sd2, sizeof(sd)) == 0);\n    }\n}\n\nvoid run_ec_combine(void) {\n    int i;\n    for (i = 0; i < count * 8; i++) {\n         test_ec_combine();\n    }\n}\n\nvoid test_group_decompress(const secp256k1_fe* x) {\n    /* The input itself, normalized. */\n    secp256k1_fe fex = *x;\n    secp256k1_fe fez;\n    /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */\n    secp256k1_ge ge_quad, ge_even, ge_odd;\n    secp256k1_gej gej_quad;\n    /* Return values of the above calls. */\n    int res_quad, res_even, res_odd;\n\n    secp256k1_fe_normalize_var(&fex);\n\n    res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex);\n    res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0);\n    res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1);\n\n    CHECK(res_quad == res_even);\n    CHECK(res_quad == res_odd);\n\n    if (res_quad) {\n        secp256k1_fe_normalize_var(&ge_quad.x);\n        secp256k1_fe_normalize_var(&ge_odd.x);\n        secp256k1_fe_normalize_var(&ge_even.x);\n        secp256k1_fe_normalize_var(&ge_quad.y);\n        secp256k1_fe_normalize_var(&ge_odd.y);\n        secp256k1_fe_normalize_var(&ge_even.y);\n\n        /* No infinity allowed. */\n        CHECK(!ge_quad.infinity);\n        CHECK(!ge_even.infinity);\n        CHECK(!ge_odd.infinity);\n\n        /* Check that the x coordinates check out. */\n        CHECK(secp256k1_fe_equal_var(&ge_quad.x, x));\n        CHECK(secp256k1_fe_equal_var(&ge_even.x, x));\n        CHECK(secp256k1_fe_equal_var(&ge_odd.x, x));\n\n        /* Check that the Y coordinate result in ge_quad is a square. */\n        CHECK(secp256k1_fe_is_quad_var(&ge_quad.y));\n\n        /* Check odd/even Y in ge_odd, ge_even. */\n        CHECK(secp256k1_fe_is_odd(&ge_odd.y));\n        CHECK(!secp256k1_fe_is_odd(&ge_even.y));\n\n        /* Check secp256k1_gej_has_quad_y_var. */\n        secp256k1_gej_set_ge(&gej_quad, &ge_quad);\n        CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));\n        do {\n            random_fe_test(&fez);\n        } while (secp256k1_fe_is_zero(&fez));\n        secp256k1_gej_rescale(&gej_quad, &fez);\n        CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));\n        secp256k1_gej_neg(&gej_quad, &gej_quad);\n        CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));\n        do {\n            random_fe_test(&fez);\n        } while (secp256k1_fe_is_zero(&fez));\n        secp256k1_gej_rescale(&gej_quad, &fez);\n        CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad));\n        secp256k1_gej_neg(&gej_quad, &gej_quad);\n        CHECK(secp256k1_gej_has_quad_y_var(&gej_quad));\n    }\n}\n\nvoid run_group_decompress(void) {\n    int i;\n    for (i = 0; i < count * 4; i++) {\n        secp256k1_fe fe;\n        random_fe_test(&fe);\n        test_group_decompress(&fe);\n    }\n}\n\n/***** ECMULT TESTS *****/\n\nvoid run_ecmult_chain(void) {\n    /* random starting point A (on the curve) */\n    secp256k1_gej a = SECP256K1_GEJ_CONST(\n        0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3,\n        0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004,\n        0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f,\n        0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f\n    );\n    /* two random initial factors xn and gn */\n    secp256k1_scalar xn = SECP256K1_SCALAR_CONST(\n        0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c,\n        0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407\n    );\n    secp256k1_scalar gn = SECP256K1_SCALAR_CONST(\n        0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9,\n        0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de\n    );\n    /* two small multipliers to be applied to xn and gn in every iteration: */\n    static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337);\n    static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113);\n    /* accumulators with the resulting coefficients to A and G */\n    secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);\n    secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);\n    /* actual points */\n    secp256k1_gej x;\n    secp256k1_gej x2;\n    int i;\n\n    /* the point being computed */\n    x = a;\n    for (i = 0; i < 200*count; i++) {\n        /* in each iteration, compute X = xn*X + gn*G; */\n        secp256k1_ecmult(&ctx->ecmult_ctx, &x, &x, &xn, &gn);\n        /* also compute ae and ge: the actual accumulated factors for A and G */\n        /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */\n        secp256k1_scalar_mul(&ae, &ae, &xn);\n        secp256k1_scalar_mul(&ge, &ge, &xn);\n        secp256k1_scalar_add(&ge, &ge, &gn);\n        /* modify xn and gn */\n        secp256k1_scalar_mul(&xn, &xn, &xf);\n        secp256k1_scalar_mul(&gn, &gn, &gf);\n\n        /* verify */\n        if (i == 19999) {\n            /* expected result after 19999 iterations */\n            secp256k1_gej rp = SECP256K1_GEJ_CONST(\n                0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE,\n                0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830,\n                0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D,\n                0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88\n            );\n\n            secp256k1_gej_neg(&rp, &rp);\n            secp256k1_gej_add_var(&rp, &rp, &x, NULL);\n            CHECK(secp256k1_gej_is_infinity(&rp));\n        }\n    }\n    /* redo the computation, but directly with the resulting ae and ge coefficients: */\n    secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge);\n    secp256k1_gej_neg(&x2, &x2);\n    secp256k1_gej_add_var(&x2, &x2, &x, NULL);\n    CHECK(secp256k1_gej_is_infinity(&x2));\n}\n\nvoid test_point_times_order(const secp256k1_gej *point) {\n    /* X * (point + G) + (order-X) * (pointer + G) = 0 */\n    secp256k1_scalar x;\n    secp256k1_scalar nx;\n    secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);\n    secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);\n    secp256k1_gej res1, res2;\n    secp256k1_ge res3;\n    unsigned char pub[65];\n    size_t psize = 65;\n    random_scalar_order_test(&x);\n    secp256k1_scalar_negate(&nx, &x);\n    secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */\n    secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */\n    secp256k1_gej_add_var(&res1, &res1, &res2, NULL);\n    CHECK(secp256k1_gej_is_infinity(&res1));\n    CHECK(secp256k1_gej_is_valid_var(&res1) == 0);\n    secp256k1_ge_set_gej(&res3, &res1);\n    CHECK(secp256k1_ge_is_infinity(&res3));\n    CHECK(secp256k1_ge_is_valid_var(&res3) == 0);\n    CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0);\n    psize = 65;\n    CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0);\n    /* check zero/one edge cases */\n    secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &zero);\n    secp256k1_ge_set_gej(&res3, &res1);\n    CHECK(secp256k1_ge_is_infinity(&res3));\n    secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &one, &zero);\n    secp256k1_ge_set_gej(&res3, &res1);\n    ge_equals_gej(&res3, point);\n    secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &one);\n    secp256k1_ge_set_gej(&res3, &res1);\n    ge_equals_ge(&res3, &secp256k1_ge_const_g);\n}\n\nvoid run_point_times_order(void) {\n    int i;\n    secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2);\n    static const secp256k1_fe xr = SECP256K1_FE_CONST(\n        0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C,\n        0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45\n    );\n    for (i = 0; i < 500; i++) {\n        secp256k1_ge p;\n        if (secp256k1_ge_set_xo_var(&p, &x, 1)) {\n            secp256k1_gej j;\n            CHECK(secp256k1_ge_is_valid_var(&p));\n            secp256k1_gej_set_ge(&j, &p);\n            CHECK(secp256k1_gej_is_valid_var(&j));\n            test_point_times_order(&j);\n        }\n        secp256k1_fe_sqr(&x, &x);\n    }\n    secp256k1_fe_normalize_var(&x);\n    CHECK(secp256k1_fe_equal_var(&x, &xr));\n}\n\nvoid ecmult_const_random_mult(void) {\n    /* random starting point A (on the curve) */\n    secp256k1_ge a = SECP256K1_GE_CONST(\n        0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b,\n        0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a,\n        0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c,\n        0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d\n    );\n    /* random initial factor xn */\n    secp256k1_scalar xn = SECP256K1_SCALAR_CONST(\n        0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327,\n        0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b\n    );\n    /* expected xn * A (from sage) */\n    secp256k1_ge expected_b = SECP256K1_GE_CONST(\n        0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd,\n        0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786,\n        0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f,\n        0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956\n    );\n    secp256k1_gej b;\n    secp256k1_ecmult_const(&b, &a, &xn);\n\n    CHECK(secp256k1_ge_is_valid_var(&a));\n    ge_equals_gej(&expected_b, &b);\n}\n\nvoid ecmult_const_commutativity(void) {\n    secp256k1_scalar a;\n    secp256k1_scalar b;\n    secp256k1_gej res1;\n    secp256k1_gej res2;\n    secp256k1_ge mid1;\n    secp256k1_ge mid2;\n    random_scalar_order_test(&a);\n    random_scalar_order_test(&b);\n\n    secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a);\n    secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b);\n    secp256k1_ge_set_gej(&mid1, &res1);\n    secp256k1_ge_set_gej(&mid2, &res2);\n    secp256k1_ecmult_const(&res1, &mid1, &b);\n    secp256k1_ecmult_const(&res2, &mid2, &a);\n    secp256k1_ge_set_gej(&mid1, &res1);\n    secp256k1_ge_set_gej(&mid2, &res2);\n    ge_equals_ge(&mid1, &mid2);\n}\n\nvoid ecmult_const_mult_zero_one(void) {\n    secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0);\n    secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1);\n    secp256k1_scalar negone;\n    secp256k1_gej res1;\n    secp256k1_ge res2;\n    secp256k1_ge point;\n    secp256k1_scalar_negate(&negone, &one);\n\n    random_group_element_test(&point);\n    secp256k1_ecmult_const(&res1, &point, &zero);\n    secp256k1_ge_set_gej(&res2, &res1);\n    CHECK(secp256k1_ge_is_infinity(&res2));\n    secp256k1_ecmult_const(&res1, &point, &one);\n    secp256k1_ge_set_gej(&res2, &res1);\n    ge_equals_ge(&res2, &point);\n    secp256k1_ecmult_const(&res1, &point, &negone);\n    secp256k1_gej_neg(&res1, &res1);\n    secp256k1_ge_set_gej(&res2, &res1);\n    ge_equals_ge(&res2, &point);\n}\n\nvoid ecmult_const_chain_multiply(void) {\n    /* Check known result (randomly generated test problem from sage) */\n    const secp256k1_scalar scalar = SECP256K1_SCALAR_CONST(\n        0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d,\n        0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b\n    );\n    const secp256k1_gej expected_point = SECP256K1_GEJ_CONST(\n        0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd,\n        0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f,\n        0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196,\n        0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435\n    );\n    secp256k1_gej point;\n    secp256k1_ge res;\n    int i;\n\n    secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g);\n    for (i = 0; i < 100; ++i) {\n        secp256k1_ge tmp;\n        secp256k1_ge_set_gej(&tmp, &point);\n        secp256k1_ecmult_const(&point, &tmp, &scalar);\n    }\n    secp256k1_ge_set_gej(&res, &point);\n    ge_equals_gej(&res, &expected_point);\n}\n\nvoid run_ecmult_const_tests(void) {\n    ecmult_const_mult_zero_one();\n    ecmult_const_random_mult();\n    ecmult_const_commutativity();\n    ecmult_const_chain_multiply();\n}\n\nvoid test_wnaf(const secp256k1_scalar *number, int w) {\n    secp256k1_scalar x, two, t;\n    int wnaf[256];\n    int zeroes = -1;\n    int i;\n    int bits;\n    secp256k1_scalar_set_int(&x, 0);\n    secp256k1_scalar_set_int(&two, 2);\n    bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w);\n    CHECK(bits <= 256);\n    for (i = bits-1; i >= 0; i--) {\n        int v = wnaf[i];\n        secp256k1_scalar_mul(&x, &x, &two);\n        if (v) {\n            CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */\n            zeroes=0;\n            CHECK((v & 1) == 1); /* check non-zero elements are odd */\n            CHECK(v <= (1 << (w-1)) - 1); /* check range below */\n            CHECK(v >= -(1 << (w-1)) - 1); /* check range above */\n        } else {\n            CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */\n            zeroes++;\n        }\n        if (v >= 0) {\n            secp256k1_scalar_set_int(&t, v);\n        } else {\n            secp256k1_scalar_set_int(&t, -v);\n            secp256k1_scalar_negate(&t, &t);\n        }\n        secp256k1_scalar_add(&x, &x, &t);\n    }\n    CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */\n}\n\nvoid test_constant_wnaf_negate(const secp256k1_scalar *number) {\n    secp256k1_scalar neg1 = *number;\n    secp256k1_scalar neg2 = *number;\n    int sign1 = 1;\n    int sign2 = 1;\n\n    if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) {\n        secp256k1_scalar_negate(&neg1, &neg1);\n        sign1 = -1;\n    }\n    sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2));\n    CHECK(sign1 == sign2);\n    CHECK(secp256k1_scalar_eq(&neg1, &neg2));\n}\n\nvoid test_constant_wnaf(const secp256k1_scalar *number, int w) {\n    secp256k1_scalar x, shift;\n    int wnaf[256] = {0};\n    int i;\n    int skew;\n    secp256k1_scalar num = *number;\n\n    secp256k1_scalar_set_int(&x, 0);\n    secp256k1_scalar_set_int(&shift, 1 << w);\n    /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */\n#ifdef USE_ENDOMORPHISM\n    for (i = 0; i < 16; ++i) {\n        secp256k1_scalar_shr_int(&num, 8);\n    }\n#endif\n    skew = secp256k1_wnaf_const(wnaf, num, w);\n\n    for (i = WNAF_SIZE(w); i >= 0; --i) {\n        secp256k1_scalar t;\n        int v = wnaf[i];\n        CHECK(v != 0); /* check nonzero */\n        CHECK(v & 1);  /* check parity */\n        CHECK(v > -(1 << w)); /* check range above */\n        CHECK(v < (1 << w));  /* check range below */\n\n        secp256k1_scalar_mul(&x, &x, &shift);\n        if (v >= 0) {\n            secp256k1_scalar_set_int(&t, v);\n        } else {\n            secp256k1_scalar_set_int(&t, -v);\n            secp256k1_scalar_negate(&t, &t);\n        }\n        secp256k1_scalar_add(&x, &x, &t);\n    }\n    /* Skew num because when encoding numbers as odd we use an offset */\n    secp256k1_scalar_cadd_bit(&num, skew == 2, 1);\n    CHECK(secp256k1_scalar_eq(&x, &num));\n}\n\nvoid run_wnaf(void) {\n    int i;\n    secp256k1_scalar n = {{0}};\n\n    /* Sanity check: 1 and 2 are the smallest odd and even numbers and should\n     *               have easier-to-diagnose failure modes  */\n    n.d[0] = 1;\n    test_constant_wnaf(&n, 4);\n    n.d[0] = 2;\n    test_constant_wnaf(&n, 4);\n    /* Random tests */\n    for (i = 0; i < count; i++) {\n        random_scalar_order(&n);\n        test_wnaf(&n, 4+(i%10));\n        test_constant_wnaf_negate(&n);\n        test_constant_wnaf(&n, 4 + (i % 10));\n    }\n    secp256k1_scalar_set_int(&n, 0);\n    CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1);\n    CHECK(secp256k1_scalar_is_zero(&n));\n    CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1);\n    CHECK(secp256k1_scalar_is_zero(&n));\n}\n\nvoid test_ecmult_constants(void) {\n    /* Test ecmult_gen() for [0..36) and [order-36..0). */\n    secp256k1_scalar x;\n    secp256k1_gej r;\n    secp256k1_ge ng;\n    int i;\n    int j;\n    secp256k1_ge_neg(&ng, &secp256k1_ge_const_g);\n    for (i = 0; i < 36; i++ ) {\n        secp256k1_scalar_set_int(&x, i);\n        secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x);\n        for (j = 0; j < i; j++) {\n            if (j == i - 1) {\n                ge_equals_gej(&secp256k1_ge_const_g, &r);\n            }\n            secp256k1_gej_add_ge(&r, &r, &ng);\n        }\n        CHECK(secp256k1_gej_is_infinity(&r));\n    }\n    for (i = 1; i <= 36; i++ ) {\n        secp256k1_scalar_set_int(&x, i);\n        secp256k1_scalar_negate(&x, &x);\n        secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x);\n        for (j = 0; j < i; j++) {\n            if (j == i - 1) {\n                ge_equals_gej(&ng, &r);\n            }\n            secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g);\n        }\n        CHECK(secp256k1_gej_is_infinity(&r));\n    }\n}\n\nvoid run_ecmult_constants(void) {\n    test_ecmult_constants();\n}\n\nvoid test_ecmult_gen_blind(void) {\n    /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */\n    secp256k1_scalar key;\n    secp256k1_scalar b;\n    unsigned char seed32[32];\n    secp256k1_gej pgej;\n    secp256k1_gej pgej2;\n    secp256k1_gej i;\n    secp256k1_ge pge;\n    random_scalar_order_test(&key);\n    secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key);\n    secp256k1_rand256(seed32);\n    b = ctx->ecmult_gen_ctx.blind;\n    i = ctx->ecmult_gen_ctx.initial;\n    secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32);\n    CHECK(!secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind));\n    secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key);\n    CHECK(!gej_xyz_equals_gej(&pgej, &pgej2));\n    CHECK(!gej_xyz_equals_gej(&i, &ctx->ecmult_gen_ctx.initial));\n    secp256k1_ge_set_gej(&pge, &pgej);\n    ge_equals_gej(&pge, &pgej2);\n}\n\nvoid test_ecmult_gen_blind_reset(void) {\n    /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */\n    secp256k1_scalar b;\n    secp256k1_gej initial;\n    secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0);\n    b = ctx->ecmult_gen_ctx.blind;\n    initial = ctx->ecmult_gen_ctx.initial;\n    secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0);\n    CHECK(secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind));\n    CHECK(gej_xyz_equals_gej(&initial, &ctx->ecmult_gen_ctx.initial));\n}\n\nvoid run_ecmult_gen_blind(void) {\n    int i;\n    test_ecmult_gen_blind_reset();\n    for (i = 0; i < 10; i++) {\n        test_ecmult_gen_blind();\n    }\n}\n\n#ifdef USE_ENDOMORPHISM\n/***** ENDOMORPHISH TESTS *****/\nvoid test_scalar_split(void) {\n    secp256k1_scalar full;\n    secp256k1_scalar s1, slam;\n    const unsigned char zero[32] = {0};\n    unsigned char tmp[32];\n\n    random_scalar_order_test(&full);\n    secp256k1_scalar_split_lambda(&s1, &slam, &full);\n\n    /* check that both are <= 128 bits in size */\n    if (secp256k1_scalar_is_high(&s1)) {\n        secp256k1_scalar_negate(&s1, &s1);\n    }\n    if (secp256k1_scalar_is_high(&slam)) {\n        secp256k1_scalar_negate(&slam, &slam);\n    }\n\n    secp256k1_scalar_get_b32(tmp, &s1);\n    CHECK(memcmp(zero, tmp, 16) == 0);\n    secp256k1_scalar_get_b32(tmp, &slam);\n    CHECK(memcmp(zero, tmp, 16) == 0);\n}\n\nvoid run_endomorphism_tests(void) {\n    test_scalar_split();\n}\n#endif\n\nvoid ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) {\n    unsigned char pubkeyc[65];\n    secp256k1_pubkey pubkey;\n    secp256k1_ge ge;\n    size_t pubkeyclen;\n    int32_t ecount;\n    ecount = 0;\n    secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount);\n    for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {\n        /* Smaller sizes are tested exhaustively elsewhere. */\n        int32_t i;\n        memcpy(&pubkeyc[1], input, 64);\n        VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen);\n        for (i = 0; i < 256; i++) {\n            /* Try all type bytes. */\n            int xpass;\n            int ypass;\n            int ysign;\n            pubkeyc[0] = i;\n            /* What sign does this point have? */\n            ysign = (input[63] & 1) + 2;\n            /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */\n            xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2);\n            /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */\n            ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) &&\n                ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65));\n            if (xpass || ypass) {\n                /* These cases must parse. */\n                unsigned char pubkeyo[65];\n                size_t outl;\n                memset(&pubkey, 0, sizeof(pubkey));\n                VG_UNDEF(&pubkey, sizeof(pubkey));\n                ecount = 0;\n                CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1);\n                VG_CHECK(&pubkey, sizeof(pubkey));\n                outl = 65;\n                VG_UNDEF(pubkeyo, 65);\n                CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1);\n                VG_CHECK(pubkeyo, outl);\n                CHECK(outl == 33);\n                CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0);\n                CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0]));\n                if (ypass) {\n                    /* This test isn't always done because we decode with alternative signs, so the y won't match. */\n                    CHECK(pubkeyo[0] == ysign);\n                    CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);\n                    memset(&pubkey, 0, sizeof(pubkey));\n                    VG_UNDEF(&pubkey, sizeof(pubkey));\n                    secp256k1_pubkey_save(&pubkey, &ge);\n                    VG_CHECK(&pubkey, sizeof(pubkey));\n                    outl = 65;\n                    VG_UNDEF(pubkeyo, 65);\n                    CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1);\n                    VG_CHECK(pubkeyo, outl);\n                    CHECK(outl == 65);\n                    CHECK(pubkeyo[0] == 4);\n                    CHECK(memcmp(&pubkeyo[1], input, 64) == 0);\n                }\n                CHECK(ecount == 0);\n            } else {\n                /* These cases must fail to parse. */\n                memset(&pubkey, 0xfe, sizeof(pubkey));\n                ecount = 0;\n                VG_UNDEF(&pubkey, sizeof(pubkey));\n                CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 0);\n                VG_CHECK(&pubkey, sizeof(pubkey));\n                CHECK(ecount == 0);\n                CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n                CHECK(ecount == 1);\n            }\n        }\n    }\n    secp256k1_context_set_illegal_callback(ctx, NULL, NULL);\n}\n\nvoid run_ec_pubkey_parse_test(void) {\n#define SECP256K1_EC_PARSE_TEST_NVALID (12)\n    const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = {\n        {\n            /* Point with leading and trailing zeros in x and y serialization. */\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83,\n            0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00\n        },\n        {\n            /* Point with x equal to a 3rd root of unity.*/\n            0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9,\n            0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee,\n            0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,\n            0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,\n        },\n        {\n            /* Point with largest x. (1/2) */\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,\n            0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e,\n            0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d,\n        },\n        {\n            /* Point with largest x. (2/2) */\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c,\n            0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1,\n            0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2,\n        },\n        {\n            /* Point with smallest x. (1/2) */\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n            0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,\n            0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,\n        },\n        {\n            /* Point with smallest x. (2/2) */\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n            0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,\n            0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,\n        },\n        {\n            /* Point with largest y. (1/3) */\n            0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,\n            0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,\n        },\n        {\n            /* Point with largest y. (2/3) */\n            0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,\n            0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,\n        },\n        {\n            /* Point with largest y. (3/3) */\n            0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,\n            0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,\n        },\n        {\n            /* Point with smallest y. (1/3) */\n            0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,\n            0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n        },\n        {\n            /* Point with smallest y. (2/3) */\n            0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,\n            0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n        },\n        {\n            /* Point with smallest y. (3/3) */\n            0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,\n            0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01\n        }\n    };\n#define SECP256K1_EC_PARSE_TEST_NXVALID (4)\n    const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = {\n        {\n            /* Valid if y overflow ignored (y = 1 mod p). (1/3) */\n            0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6,\n            0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,\n        },\n        {\n            /* Valid if y overflow ignored (y = 1 mod p). (2/3) */\n            0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c,\n            0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,\n        },\n        {\n            /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/\n            0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc,\n            0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,\n        },\n        {\n            /* x on curve, y is from y^2 = x^3 + 8. */\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03\n        }\n    };\n#define SECP256K1_EC_PARSE_TEST_NINVALID (7)\n    const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = {\n        {\n            /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */\n            0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c,\n            0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n        },\n        {\n            /* Valid if x overflow ignored (x = 1 mod p). */\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,\n            0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14,\n            0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee,\n        },\n        {\n            /* Valid if x overflow ignored (x = 1 mod p). */\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30,\n            0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb,\n            0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41,\n        },\n        {\n            /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,\n            0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f,\n            0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28,\n        },\n        {\n            /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e,\n            0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0,\n            0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07,\n        },\n        {\n            /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d,\n            0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc,\n        },\n        {\n            /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2,\n            0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53\n        }\n    };\n    const unsigned char pubkeyc[66] = {\n        /* Serialization of G. */\n        0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B,\n        0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17,\n        0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08,\n        0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4,\n        0xB8, 0x00\n    };\n    unsigned char sout[65];\n    unsigned char shortkey[2];\n    secp256k1_ge ge;\n    secp256k1_pubkey pubkey;\n    size_t len;\n    int32_t i;\n    int32_t ecount;\n    int32_t ecount2;\n    ecount = 0;\n    /* Nothing should be reading this far into pubkeyc. */\n    VG_UNDEF(&pubkeyc[65], 1);\n    secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount);\n    /* Zero length claimed, fail, zeroize, no illegal arg error. */\n    memset(&pubkey, 0xfe, sizeof(pubkey));\n    ecount = 0;\n    VG_UNDEF(shortkey, 2);\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 0) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(ecount == 0);\n    CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n    CHECK(ecount == 1);\n    /* Length one claimed, fail, zeroize, no illegal arg error. */\n    for (i = 0; i < 256 ; i++) {\n        memset(&pubkey, 0xfe, sizeof(pubkey));\n        ecount = 0;\n        shortkey[0] = i;\n        VG_UNDEF(&shortkey[1], 1);\n        VG_UNDEF(&pubkey, sizeof(pubkey));\n        CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 1) == 0);\n        VG_CHECK(&pubkey, sizeof(pubkey));\n        CHECK(ecount == 0);\n        CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n        CHECK(ecount == 1);\n    }\n    /* Length two claimed, fail, zeroize, no illegal arg error. */\n    for (i = 0; i < 65536 ; i++) {\n        memset(&pubkey, 0xfe, sizeof(pubkey));\n        ecount = 0;\n        shortkey[0] = i & 255;\n        shortkey[1] = i >> 8;\n        VG_UNDEF(&pubkey, sizeof(pubkey));\n        CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 2) == 0);\n        VG_CHECK(&pubkey, sizeof(pubkey));\n        CHECK(ecount == 0);\n        CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n        CHECK(ecount == 1);\n    }\n    memset(&pubkey, 0xfe, sizeof(pubkey));\n    ecount = 0;\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */\n    CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 33) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(ecount == 0);\n    CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n    CHECK(ecount == 1);\n    /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */\n    CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, pubkeyc, 65) == 0);\n    CHECK(ecount == 2);\n    /* NULL input string. Illegal arg and zeroize output. */\n    memset(&pubkey, 0xfe, sizeof(pubkey));\n    ecount = 0;\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, NULL, 65) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(ecount == 1);\n    CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n    CHECK(ecount == 2);\n    /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */\n    memset(&pubkey, 0xfe, sizeof(pubkey));\n    ecount = 0;\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 64) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(ecount == 0);\n    CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n    CHECK(ecount == 1);\n    /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */\n    memset(&pubkey, 0xfe, sizeof(pubkey));\n    ecount = 0;\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 66) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(ecount == 0);\n    CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0);\n    CHECK(ecount == 1);\n    /* Valid parse. */\n    memset(&pubkey, 0, sizeof(pubkey));\n    ecount = 0;\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 65) == 1);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(ecount == 0);\n    VG_UNDEF(&ge, sizeof(ge));\n    CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1);\n    VG_CHECK(&ge.x, sizeof(ge.x));\n    VG_CHECK(&ge.y, sizeof(ge.y));\n    VG_CHECK(&ge.infinity, sizeof(ge.infinity));\n    ge_equals_ge(&secp256k1_ge_const_g, &ge);\n    CHECK(ecount == 0);\n    /* secp256k1_ec_pubkey_serialize illegal args. */\n    ecount = 0;\n    len = 65;\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0);\n    CHECK(ecount == 1);\n    CHECK(len == 0);\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0);\n    CHECK(ecount == 2);\n    len = 65;\n    VG_UNDEF(sout, 65);\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED) == 0);\n    VG_CHECK(sout, 65);\n    CHECK(ecount == 3);\n    CHECK(len == 0);\n    len = 65;\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, ~0) == 0);\n    CHECK(ecount == 4);\n    CHECK(len == 0);\n    len = 65;\n    VG_UNDEF(sout, 65);\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1);\n    VG_CHECK(sout, 65);\n    CHECK(ecount == 4);\n    CHECK(len == 65);\n    /* Multiple illegal args. Should still set arg error only once. */\n    ecount = 0;\n    ecount2 = 11;\n    CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0);\n    CHECK(ecount == 1);\n    /* Does the illegal arg callback actually change the behavior? */\n    secp256k1_context_set_illegal_callback(ctx, uncounting_illegal_callback_fn, &ecount2);\n    CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0);\n    CHECK(ecount == 1);\n    CHECK(ecount2 == 10);\n    secp256k1_context_set_illegal_callback(ctx, NULL, NULL);\n    /* Try a bunch of prefabbed points with all possible encodings. */\n    for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) {\n        ec_pubkey_parse_pointtest(valid[i], 1, 1);\n    }\n    for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) {\n        ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0);\n    }\n    for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) {\n        ec_pubkey_parse_pointtest(invalid[i], 0, 0);\n    }\n}\n\nvoid run_eckey_edge_case_test(void) {\n    const unsigned char orderc[32] = {\n        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,\n        0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,\n        0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41\n    };\n    const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00};\n    unsigned char ctmp[33];\n    unsigned char ctmp2[33];\n    secp256k1_pubkey pubkey;\n    secp256k1_pubkey pubkey2;\n    secp256k1_pubkey pubkey_one;\n    secp256k1_pubkey pubkey_negone;\n    const secp256k1_pubkey *pubkeys[3];\n    size_t len;\n    int32_t ecount;\n    /* Group order is too large, reject. */\n    CHECK(secp256k1_ec_seckey_verify(ctx, orderc) == 0);\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, orderc) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    /* Maximum value is too large, reject. */\n    memset(ctmp, 255, 32);\n    CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0);\n    memset(&pubkey, 1, sizeof(pubkey));\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    /* Zero is too small, reject. */\n    memset(ctmp, 0, 32);\n    CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0);\n    memset(&pubkey, 1, sizeof(pubkey));\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    /* One must be accepted. */\n    ctmp[31] = 0x01;\n    CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1);\n    memset(&pubkey, 0, sizeof(pubkey));\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);\n    pubkey_one = pubkey;\n    /* Group order + 1 is too large, reject. */\n    memcpy(ctmp, orderc, 32);\n    ctmp[31] = 0x42;\n    CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0);\n    memset(&pubkey, 1, sizeof(pubkey));\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    /* -1 must be accepted. */\n    ctmp[31] = 0x40;\n    CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1);\n    memset(&pubkey, 0, sizeof(pubkey));\n    VG_UNDEF(&pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1);\n    VG_CHECK(&pubkey, sizeof(pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);\n    pubkey_negone = pubkey;\n    /* Tweak of zero leaves the value changed. */\n    memset(ctmp2, 0, 32);\n    CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, ctmp2) == 1);\n    CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40);\n    memcpy(&pubkey2, &pubkey, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1);\n    CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0);\n    /* Multiply tweak of zero zeroizes the output. */\n    CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, ctmp2) == 0);\n    CHECK(memcmp(zeros, ctmp, 32) == 0);\n    CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, ctmp2) == 0);\n    CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0);\n    memcpy(&pubkey, &pubkey2, sizeof(pubkey));\n    /* Overflowing key tweak zeroizes. */\n    memcpy(ctmp, orderc, 32);\n    ctmp[31] = 0x40;\n    CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, orderc) == 0);\n    CHECK(memcmp(zeros, ctmp, 32) == 0);\n    memcpy(ctmp, orderc, 32);\n    ctmp[31] = 0x40;\n    CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, orderc) == 0);\n    CHECK(memcmp(zeros, ctmp, 32) == 0);\n    memcpy(ctmp, orderc, 32);\n    ctmp[31] = 0x40;\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, orderc) == 0);\n    CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0);\n    memcpy(&pubkey, &pubkey2, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, orderc) == 0);\n    CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0);\n    memcpy(&pubkey, &pubkey2, sizeof(pubkey));\n    /* Private key tweaks results in a key of zero. */\n    ctmp2[31] = 1;\n    CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 0);\n    CHECK(memcmp(zeros, ctmp2, 32) == 0);\n    ctmp2[31] = 1;\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0);\n    CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0);\n    memcpy(&pubkey, &pubkey2, sizeof(pubkey));\n    /* Tweak computation wraps and results in a key of 1. */\n    ctmp2[31] = 2;\n    CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 1);\n    CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1);\n    ctmp2[31] = 2;\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1);\n    ctmp2[31] = 1;\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, ctmp2) == 1);\n    CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0);\n    /* Tweak mul * 2 = 1+1. */\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1);\n    ctmp2[31] = 2;\n    CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 1);\n    CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0);\n    /* Test argument errors. */\n    ecount = 0;\n    secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount);\n    CHECK(ecount == 0);\n    /* Zeroize pubkey on parse error. */\n    memset(&pubkey, 0, 32);\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0);\n    CHECK(ecount == 1);\n    CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0);\n    memcpy(&pubkey, &pubkey2, sizeof(pubkey));\n    memset(&pubkey2, 0, 32);\n    CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 0);\n    CHECK(ecount == 2);\n    CHECK(memcmp(&pubkey2, zeros, sizeof(pubkey2)) == 0);\n    /* Plain argument errors. */\n    ecount = 0;\n    CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1);\n    CHECK(ecount == 0);\n    CHECK(secp256k1_ec_seckey_verify(ctx, NULL) == 0);\n    CHECK(ecount == 1);\n    ecount = 0;\n    memset(ctmp2, 0, 32);\n    ctmp2[31] = 4;\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, NULL, ctmp2) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, NULL) == 0);\n    CHECK(ecount == 2);\n    ecount = 0;\n    memset(ctmp2, 0, 32);\n    ctmp2[31] = 4;\n    CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, NULL, ctmp2) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, NULL) == 0);\n    CHECK(ecount == 2);\n    ecount = 0;\n    memset(ctmp2, 0, 32);\n    CHECK(secp256k1_ec_privkey_tweak_add(ctx, NULL, ctmp2) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, NULL) == 0);\n    CHECK(ecount == 2);\n    ecount = 0;\n    memset(ctmp2, 0, 32);\n    ctmp2[31] = 1;\n    CHECK(secp256k1_ec_privkey_tweak_mul(ctx, NULL, ctmp2) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, NULL) == 0);\n    CHECK(ecount == 2);\n    ecount = 0;\n    CHECK(secp256k1_ec_pubkey_create(ctx, NULL, ctmp) == 0);\n    CHECK(ecount == 1);\n    memset(&pubkey, 1, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0);\n    CHECK(ecount == 2);\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    /* secp256k1_ec_pubkey_combine tests. */\n    ecount = 0;\n    pubkeys[0] = &pubkey_one;\n    VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *));\n    VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *));\n    VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *));\n    memset(&pubkey, 255, sizeof(secp256k1_pubkey));\n    VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 0) == 0);\n    VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    CHECK(ecount == 1);\n    CHECK(secp256k1_ec_pubkey_combine(ctx, NULL, pubkeys, 1) == 0);\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    CHECK(ecount == 2);\n    memset(&pubkey, 255, sizeof(secp256k1_pubkey));\n    VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, NULL, 1) == 0);\n    VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    CHECK(ecount == 3);\n    pubkeys[0] = &pubkey_negone;\n    memset(&pubkey, 255, sizeof(secp256k1_pubkey));\n    VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 1) == 1);\n    VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);\n    CHECK(ecount == 3);\n    len = 33;\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1);\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1);\n    CHECK(memcmp(ctmp, ctmp2, 33) == 0);\n    /* Result is infinity. */\n    pubkeys[0] = &pubkey_one;\n    pubkeys[1] = &pubkey_negone;\n    memset(&pubkey, 255, sizeof(secp256k1_pubkey));\n    VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 0);\n    VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);\n    CHECK(ecount == 3);\n    /* Passes through infinity but comes out one. */\n    pubkeys[2] = &pubkey_one;\n    memset(&pubkey, 255, sizeof(secp256k1_pubkey));\n    VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 3) == 1);\n    VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);\n    CHECK(ecount == 3);\n    len = 33;\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1);\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1);\n    CHECK(memcmp(ctmp, ctmp2, 33) == 0);\n    /* Adds to two. */\n    pubkeys[1] = &pubkey_one;\n    memset(&pubkey, 255, sizeof(secp256k1_pubkey));\n    VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 1);\n    VG_CHECK(&pubkey, sizeof(secp256k1_pubkey));\n    CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);\n    CHECK(ecount == 3);\n    secp256k1_context_set_illegal_callback(ctx, NULL, NULL);\n}\n\nvoid random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) {\n    secp256k1_scalar nonce;\n    do {\n        random_scalar_order_test(&nonce);\n    } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid));\n}\n\nvoid test_ecdsa_sign_verify(void) {\n    secp256k1_gej pubj;\n    secp256k1_ge pub;\n    secp256k1_scalar one;\n    secp256k1_scalar msg, key;\n    secp256k1_scalar sigr, sigs;\n    int recid;\n    int getrec;\n    random_scalar_order_test(&msg);\n    random_scalar_order_test(&key);\n    secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key);\n    secp256k1_ge_set_gej(&pub, &pubj);\n    getrec = secp256k1_rand_bits(1);\n    random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL);\n    if (getrec) {\n        CHECK(recid >= 0 && recid < 4);\n    }\n    CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg));\n    secp256k1_scalar_set_int(&one, 1);\n    secp256k1_scalar_add(&msg, &msg, &one);\n    CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg));\n}\n\nvoid run_ecdsa_sign_verify(void) {\n    int i;\n    for (i = 0; i < 10*count; i++) {\n        test_ecdsa_sign_verify();\n    }\n}\n\n/** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */\nstatic int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {\n    (void)msg32;\n    (void)key32;\n    (void)algo16;\n    memcpy(nonce32, data, 32);\n    return (counter == 0);\n}\n\nstatic int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {\n   /* Dummy nonce generator that has a fatal error on the first counter value. */\n   if (counter == 0) {\n       return 0;\n   }\n   return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1);\n}\n\nstatic int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) {\n   /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */\n   if (counter < 3) {\n       memset(nonce32, counter==0 ? 0 : 255, 32);\n       if (counter == 2) {\n           nonce32[31]--;\n       }\n       return 1;\n   }\n   if (counter < 5) {\n       static const unsigned char order[] = {\n           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n           0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,\n           0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,\n           0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41\n       };\n       memcpy(nonce32, order, 32);\n       if (counter == 4) {\n           nonce32[31]++;\n       }\n       return 1;\n   }\n   /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */\n   /* If someone does fine a case where it retries for secp256k1, we'd like to know. */\n   if (counter > 5) {\n       return 0;\n   }\n   return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5);\n}\n\nint is_empty_signature(const secp256k1_ecdsa_signature *sig) {\n    static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0};\n    return memcmp(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0;\n}\n\nvoid test_ecdsa_end_to_end(void) {\n    unsigned char extra[32] = {0x00};\n    unsigned char privkey[32];\n    unsigned char message[32];\n    unsigned char privkey2[32];\n    secp256k1_ecdsa_signature signature[6];\n    secp256k1_scalar r, s;\n    unsigned char sig[74];\n    size_t siglen = 74;\n    unsigned char pubkeyc[65];\n    size_t pubkeyclen = 65;\n    secp256k1_pubkey pubkey;\n    unsigned char seckey[300];\n    size_t seckeylen = 300;\n\n    /* Generate a random key and message. */\n    {\n        secp256k1_scalar msg, key;\n        random_scalar_order_test(&msg);\n        random_scalar_order_test(&key);\n        secp256k1_scalar_get_b32(privkey, &key);\n        secp256k1_scalar_get_b32(message, &msg);\n    }\n\n    /* Construct and verify corresponding public key. */\n    CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1);\n    CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1);\n\n    /* Verify exporting and importing public key. */\n    CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyc, &pubkeyclen, &pubkey, secp256k1_rand_bits(1) == 1 ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED));\n    memset(&pubkey, 0, sizeof(pubkey));\n    CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1);\n\n    /* Verify private key import and export. */\n    CHECK(ec_privkey_export_der(ctx, seckey, &seckeylen, privkey, secp256k1_rand_bits(1) == 1));\n    CHECK(ec_privkey_import_der(ctx, privkey2, seckey, seckeylen) == 1);\n    CHECK(memcmp(privkey, privkey2, 32) == 0);\n\n    /* Optionally tweak the keys using addition. */\n    if (secp256k1_rand_int(3) == 0) {\n        int ret1;\n        int ret2;\n        unsigned char rnd[32];\n        secp256k1_pubkey pubkey2;\n        secp256k1_rand256_test(rnd);\n        ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd);\n        ret2 = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, rnd);\n        CHECK(ret1 == ret2);\n        if (ret1 == 0) {\n            return;\n        }\n        CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1);\n        CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0);\n    }\n\n    /* Optionally tweak the keys using multiplication. */\n    if (secp256k1_rand_int(3) == 0) {\n        int ret1;\n        int ret2;\n        unsigned char rnd[32];\n        secp256k1_pubkey pubkey2;\n        secp256k1_rand256_test(rnd);\n        ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd);\n        ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, rnd);\n        CHECK(ret1 == ret2);\n        if (ret1 == 0) {\n            return;\n        }\n        CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1);\n        CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0);\n    }\n\n    /* Sign. */\n    CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1);\n    CHECK(secp256k1_ecdsa_sign(ctx, &signature[4], message, privkey, NULL, NULL) == 1);\n    CHECK(secp256k1_ecdsa_sign(ctx, &signature[1], message, privkey, NULL, extra) == 1);\n    extra[31] = 1;\n    CHECK(secp256k1_ecdsa_sign(ctx, &signature[2], message, privkey, NULL, extra) == 1);\n    extra[31] = 0;\n    extra[0] = 1;\n    CHECK(secp256k1_ecdsa_sign(ctx, &signature[3], message, privkey, NULL, extra) == 1);\n    CHECK(memcmp(&signature[0], &signature[4], sizeof(signature[0])) == 0);\n    CHECK(memcmp(&signature[0], &signature[1], sizeof(signature[0])) != 0);\n    CHECK(memcmp(&signature[0], &signature[2], sizeof(signature[0])) != 0);\n    CHECK(memcmp(&signature[0], &signature[3], sizeof(signature[0])) != 0);\n    CHECK(memcmp(&signature[1], &signature[2], sizeof(signature[0])) != 0);\n    CHECK(memcmp(&signature[1], &signature[3], sizeof(signature[0])) != 0);\n    CHECK(memcmp(&signature[2], &signature[3], sizeof(signature[0])) != 0);\n    /* Verify. */\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[1], message, &pubkey) == 1);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[2], message, &pubkey) == 1);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[3], message, &pubkey) == 1);\n    /* Test lower-S form, malleate, verify and fail, test again, malleate again */\n    CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[0]));\n    secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]);\n    secp256k1_scalar_negate(&s, &s);\n    secp256k1_ecdsa_signature_save(&signature[5], &r, &s);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 0);\n    CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5]));\n    CHECK(secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5]));\n    CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5]));\n    CHECK(!secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5]));\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1);\n    secp256k1_scalar_negate(&s, &s);\n    secp256k1_ecdsa_signature_save(&signature[5], &r, &s);\n    CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5]));\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1);\n    CHECK(memcmp(&signature[5], &signature[0], 64) == 0);\n\n    /* Serialize/parse DER and verify again */\n    CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1);\n    memset(&signature[0], 0, sizeof(signature[0]));\n    CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 1);\n    CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1);\n    /* Serialize/destroy/parse DER and verify again. */\n    siglen = 74;\n    CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1);\n    sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255);\n    CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 0 ||\n          secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 0);\n}\n\nvoid test_random_pubkeys(void) {\n    secp256k1_ge elem;\n    secp256k1_ge elem2;\n    unsigned char in[65];\n    /* Generate some randomly sized pubkeys. */\n    size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33;\n    if (secp256k1_rand_bits(2) == 0) {\n        len = secp256k1_rand_bits(6);\n    }\n    if (len == 65) {\n      in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7);\n    } else {\n      in[0] = secp256k1_rand_bits(1) ? 2 : 3;\n    }\n    if (secp256k1_rand_bits(3) == 0) {\n        in[0] = secp256k1_rand_bits(8);\n    }\n    if (len > 1) {\n        secp256k1_rand256(&in[1]);\n    }\n    if (len > 33) {\n        secp256k1_rand256(&in[33]);\n    }\n    if (secp256k1_eckey_pubkey_parse(&elem, in, len)) {\n        unsigned char out[65];\n        unsigned char firstb;\n        int res;\n        size_t size = len;\n        firstb = in[0];\n        /* If the pubkey can be parsed, it should round-trip... */\n        CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33));\n        CHECK(size == len);\n        CHECK(memcmp(&in[1], &out[1], len-1) == 0);\n        /* ... except for the type of hybrid inputs. */\n        if ((in[0] != 6) && (in[0] != 7)) {\n            CHECK(in[0] == out[0]);\n        }\n        size = 65;\n        CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));\n        CHECK(size == 65);\n        CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size));\n        ge_equals_ge(&elem,&elem2);\n        /* Check that the X9.62 hybrid type is checked. */\n        in[0] = secp256k1_rand_bits(1) ? 6 : 7;\n        res = secp256k1_eckey_pubkey_parse(&elem2, in, size);\n        if (firstb == 2 || firstb == 3) {\n            if (in[0] == firstb + 4) {\n              CHECK(res);\n            } else {\n              CHECK(!res);\n            }\n        }\n        if (res) {\n            ge_equals_ge(&elem,&elem2);\n            CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0));\n            CHECK(memcmp(&in[1], &out[1], 64) == 0);\n        }\n    }\n}\n\nvoid run_random_pubkeys(void) {\n    int i;\n    for (i = 0; i < 10*count; i++) {\n        test_random_pubkeys();\n    }\n}\n\nvoid run_ecdsa_end_to_end(void) {\n    int i;\n    for (i = 0; i < 64*count; i++) {\n        test_ecdsa_end_to_end();\n    }\n}\n\nint test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) {\n    static const unsigned char zeroes[32] = {0};\n#ifdef ENABLE_OPENSSL_TESTS\n    static const unsigned char max_scalar[32] = {\n        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,\n        0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,\n        0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40\n    };\n#endif\n\n    int ret = 0;\n\n    secp256k1_ecdsa_signature sig_der;\n    unsigned char roundtrip_der[2048];\n    unsigned char compact_der[64];\n    size_t len_der = 2048;\n    int parsed_der = 0, valid_der = 0, roundtrips_der = 0;\n\n    secp256k1_ecdsa_signature sig_der_lax;\n    unsigned char roundtrip_der_lax[2048];\n    unsigned char compact_der_lax[64];\n    size_t len_der_lax = 2048;\n    int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0;\n\n#ifdef ENABLE_OPENSSL_TESTS\n    ECDSA_SIG *sig_openssl;\n    const unsigned char *sigptr;\n    unsigned char roundtrip_openssl[2048];\n    int len_openssl = 2048;\n    int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0;\n#endif\n\n    parsed_der = secp256k1_ecdsa_signature_parse_der(ctx, &sig_der, sig, siglen);\n    if (parsed_der) {\n        ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der, &sig_der)) << 0;\n        valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0);\n    }\n    if (valid_der) {\n        ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der, &len_der, &sig_der)) << 1;\n        roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0;\n    }\n\n    parsed_der_lax = ecdsa_signature_parse_der_lax(ctx, &sig_der_lax, sig, siglen);\n    if (parsed_der_lax) {\n        ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der_lax, &sig_der_lax)) << 10;\n        valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0);\n    }\n    if (valid_der_lax) {\n        ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11;\n        roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0;\n    }\n\n    if (certainly_der) {\n        ret |= (!parsed_der) << 2;\n    }\n    if (certainly_not_der) {\n        ret |= (parsed_der) << 17;\n    }\n    if (valid_der) {\n        ret |= (!roundtrips_der) << 3;\n    }\n\n    if (valid_der) {\n        ret |= (!roundtrips_der_lax) << 12;\n        ret |= (len_der != len_der_lax) << 13;\n        ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14;\n    }\n    ret |= (roundtrips_der != roundtrips_der_lax) << 15;\n    if (parsed_der) {\n        ret |= (!parsed_der_lax) << 16;\n    }\n\n#ifdef ENABLE_OPENSSL_TESTS\n    sig_openssl = ECDSA_SIG_new();\n    sigptr = sig;\n    parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL);\n    if (parsed_openssl) {\n        valid_openssl = !BN_is_negative(sig_openssl->r) && !BN_is_negative(sig_openssl->s) && BN_num_bits(sig_openssl->r) > 0 && BN_num_bits(sig_openssl->r) <= 256 && BN_num_bits(sig_openssl->s) > 0 && BN_num_bits(sig_openssl->s) <= 256;\n        if (valid_openssl) {\n            unsigned char tmp[32] = {0};\n            BN_bn2bin(sig_openssl->r, tmp + 32 - BN_num_bytes(sig_openssl->r));\n            valid_openssl = memcmp(tmp, max_scalar, 32) < 0;\n        }\n        if (valid_openssl) {\n            unsigned char tmp[32] = {0};\n            BN_bn2bin(sig_openssl->s, tmp + 32 - BN_num_bytes(sig_openssl->s));\n            valid_openssl = memcmp(tmp, max_scalar, 32) < 0;\n        }\n    }\n    len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL);\n    if (len_openssl <= 2048) {\n        unsigned char *ptr = roundtrip_openssl;\n        CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl);\n        roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0);\n    } else {\n        len_openssl = 0;\n    }\n    ECDSA_SIG_free(sig_openssl);\n\n    ret |= (parsed_der && !parsed_openssl) << 4;\n    ret |= (valid_der && !valid_openssl) << 5;\n    ret |= (roundtrips_openssl && !parsed_der) << 6;\n    ret |= (roundtrips_der != roundtrips_openssl) << 7;\n    if (roundtrips_openssl) {\n        ret |= (len_der != (size_t)len_openssl) << 8;\n        ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9;\n    }\n#endif\n    return ret;\n}\n\nstatic void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) {\n    size_t i;\n    for (i = 0; i < ptrlen; i++) {\n        int shift = ptrlen - 1 - i;\n        if (shift >= 4) {\n            ptr[i] = 0;\n        } else {\n            ptr[i] = (val >> shift) & 0xFF;\n        }\n    }\n}\n\nstatic void damage_array(unsigned char *sig, size_t *len) {\n    int pos;\n    int action = secp256k1_rand_bits(3);\n    if (action < 1 && *len > 3) {\n        /* Delete a byte. */\n        pos = secp256k1_rand_int(*len);\n        memmove(sig + pos, sig + pos + 1, *len - pos - 1);\n        (*len)--;\n        return;\n    } else if (action < 2 && *len < 2048) {\n        /* Insert a byte. */\n        pos = secp256k1_rand_int(1 + *len);\n        memmove(sig + pos + 1, sig + pos, *len - pos);\n        sig[pos] = secp256k1_rand_bits(8);\n        (*len)++;\n        return;\n    } else if (action < 4) {\n        /* Modify a byte. */\n        sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255);\n        return;\n    } else { /* action < 8 */\n        /* Modify a bit. */\n        sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3);\n        return;\n    }\n}\n\nstatic void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) {\n    int der;\n    int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2];\n    size_t tlen, elen, glen;\n    int indet;\n    int n;\n\n    *len = 0;\n    der = secp256k1_rand_bits(2) == 0;\n    *certainly_der = der;\n    *certainly_not_der = 0;\n    indet = der ? 0 : secp256k1_rand_int(10) == 0;\n\n    for (n = 0; n < 2; n++) {\n        /* We generate two classes of numbers: nlow==1 \"low\" ones (up to 32 bytes), nlow==0 \"high\" ones (32 bytes with 129 top bits set, or larger than 32 bytes) */\n        nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0);\n        /* The length of the number in bytes (the first byte of which will always be nonzero) */\n        nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8;\n        CHECK(nlen[n] <= 232);\n        /* The top bit of the number. */\n        nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1));\n        /* The top byte of the number (after the potential hardcoded 16 0xFF characters for \"high\" 32 bytes numbers) */\n        nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127));\n        /* The number of zero bytes in front of the number (which is 0 or 1 in case of DER, otherwise we extend up to 300 bytes) */\n        nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_rand_int(3) : secp256k1_rand_int(300 - nlen[n]) * secp256k1_rand_int(8) / 8);\n        if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) {\n            *certainly_not_der = 1;\n        }\n        CHECK(nlen[n] + nzlen[n] <= 300);\n        /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */\n        nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2);\n        if (!der) {\n            /* nlenlen[n] max 127 bytes */\n            int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;\n            nlenlen[n] += add;\n            if (add != 0) {\n                *certainly_not_der = 1;\n            }\n        }\n        CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427);\n    }\n\n    /* The total length of the data to go, so far */\n    tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1];\n    CHECK(tlen <= 856);\n\n    /* The length of the garbage inside the tuple. */\n    elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8;\n    if (elen != 0) {\n        *certainly_not_der = 1;\n    }\n    tlen += elen;\n    CHECK(tlen <= 980);\n\n    /* The length of the garbage after the end of the tuple. */\n    glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8;\n    if (glen != 0) {\n        *certainly_not_der = 1;\n    }\n    CHECK(tlen + glen <= 990);\n\n    /* Write the tuple header. */\n    sig[(*len)++] = 0x30;\n    if (indet) {\n        /* Indeterminate length */\n        sig[(*len)++] = 0x80;\n        *certainly_not_der = 1;\n    } else {\n        int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2);\n        if (!der) {\n            int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256;\n            tlenlen += add;\n            if (add != 0) {\n                *certainly_not_der = 1;\n            }\n        }\n        if (tlenlen == 0) {\n            /* Short length notation */\n            sig[(*len)++] = tlen;\n        } else {\n            /* Long length notation */\n            sig[(*len)++] = 128 + tlenlen;\n            assign_big_endian(sig + *len, tlenlen, tlen);\n            *len += tlenlen;\n        }\n        tlen += tlenlen;\n    }\n    tlen += 2;\n    CHECK(tlen + glen <= 1119);\n\n    for (n = 0; n < 2; n++) {\n        /* Write the integer header. */\n        sig[(*len)++] = 0x02;\n        if (nlenlen[n] == 0) {\n            /* Short length notation */\n            sig[(*len)++] = nlen[n] + nzlen[n];\n        } else {\n            /* Long length notation. */\n            sig[(*len)++] = 128 + nlenlen[n];\n            assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]);\n            *len += nlenlen[n];\n        }\n        /* Write zero padding */\n        while (nzlen[n] > 0) {\n            sig[(*len)++] = 0x00;\n            nzlen[n]--;\n        }\n        if (nlen[n] == 32 && !nlow[n]) {\n            /* Special extra 16 0xFF bytes in \"high\" 32-byte numbers */\n            int i;\n            for (i = 0; i < 16; i++) {\n                sig[(*len)++] = 0xFF;\n            }\n            nlen[n] -= 16;\n        }\n        /* Write first byte of number */\n        if (nlen[n] > 0) {\n            sig[(*len)++] = nhbyte[n];\n            nlen[n]--;\n        }\n        /* Generate remaining random bytes of number */\n        secp256k1_rand_bytes_test(sig + *len, nlen[n]);\n        *len += nlen[n];\n        nlen[n] = 0;\n    }\n\n    /* Generate random garbage inside tuple. */\n    secp256k1_rand_bytes_test(sig + *len, elen);\n    *len += elen;\n\n    /* Generate end-of-contents bytes. */\n    if (indet) {\n        sig[(*len)++] = 0;\n        sig[(*len)++] = 0;\n        tlen += 2;\n    }\n    CHECK(tlen + glen <= 1121);\n\n    /* Generate random garbage outside tuple. */\n    secp256k1_rand_bytes_test(sig + *len, glen);\n    *len += glen;\n    tlen += glen;\n    CHECK(tlen <= 1121);\n    CHECK(tlen == *len);\n}\n\nvoid run_ecdsa_der_parse(void) {\n    int i,j;\n    for (i = 0; i < 200 * count; i++) {\n        unsigned char buffer[2048];\n        size_t buflen = 0;\n        int certainly_der = 0;\n        int certainly_not_der = 0;\n        random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der);\n        CHECK(buflen <= 2048);\n        for (j = 0; j < 16; j++) {\n            int ret = 0;\n            if (j > 0) {\n                damage_array(buffer, &buflen);\n                /* We don't know anything anymore about the DERness of the result */\n                certainly_der = 0;\n                certainly_not_der = 0;\n            }\n            ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der);\n            if (ret != 0) {\n                size_t k;\n                fprintf(stderr, \"Failure %x on \", ret);\n                for (k = 0; k < buflen; k++) {\n                    fprintf(stderr, \"%02x \", buffer[k]);\n                }\n                fprintf(stderr, \"\\n\");\n            }\n            CHECK(ret == 0);\n        }\n    }\n}\n\n/* Tests several edge cases. */\nvoid test_ecdsa_edge_cases(void) {\n    int t;\n    secp256k1_ecdsa_signature sig;\n\n    /* Test the case where ECDSA recomputes a point that is infinity. */\n    {\n        secp256k1_gej keyj;\n        secp256k1_ge key;\n        secp256k1_scalar msg;\n        secp256k1_scalar sr, ss;\n        secp256k1_scalar_set_int(&ss, 1);\n        secp256k1_scalar_negate(&ss, &ss);\n        secp256k1_scalar_inverse(&ss, &ss);\n        secp256k1_scalar_set_int(&sr, 1);\n        secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sr);\n        secp256k1_ge_set_gej(&key, &keyj);\n        msg = ss;\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0);\n    }\n\n    /* Verify signature with r of zero fails. */\n    {\n        const unsigned char pubkey_mods_zero[33] = {\n            0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,\n            0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,\n            0x41\n        };\n        secp256k1_ge key;\n        secp256k1_scalar msg;\n        secp256k1_scalar sr, ss;\n        secp256k1_scalar_set_int(&ss, 1);\n        secp256k1_scalar_set_int(&msg, 0);\n        secp256k1_scalar_set_int(&sr, 0);\n        CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33));\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0);\n    }\n\n    /* Verify signature with s of zero fails. */\n    {\n        const unsigned char pubkey[33] = {\n            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x01\n        };\n        secp256k1_ge key;\n        secp256k1_scalar msg;\n        secp256k1_scalar sr, ss;\n        secp256k1_scalar_set_int(&ss, 0);\n        secp256k1_scalar_set_int(&msg, 0);\n        secp256k1_scalar_set_int(&sr, 1);\n        CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0);\n    }\n\n    /* Verify signature with message 0 passes. */\n    {\n        const unsigned char pubkey[33] = {\n            0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x02\n        };\n        const unsigned char pubkey2[33] = {\n            0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0,\n            0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41,\n            0x43\n        };\n        secp256k1_ge key;\n        secp256k1_ge key2;\n        secp256k1_scalar msg;\n        secp256k1_scalar sr, ss;\n        secp256k1_scalar_set_int(&ss, 2);\n        secp256k1_scalar_set_int(&msg, 0);\n        secp256k1_scalar_set_int(&sr, 2);\n        CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));\n        CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1);\n        secp256k1_scalar_negate(&ss, &ss);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1);\n        secp256k1_scalar_set_int(&ss, 1);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0);\n    }\n\n    /* Verify signature with message 1 passes. */\n    {\n        const unsigned char pubkey[33] = {\n            0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22,\n            0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05,\n            0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c,\n            0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76,\n            0x25\n        };\n        const unsigned char pubkey2[33] = {\n            0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40,\n            0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae,\n            0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f,\n            0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10,\n            0x62\n        };\n        const unsigned char csr[32] = {\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n            0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,\n            0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb\n        };\n        secp256k1_ge key;\n        secp256k1_ge key2;\n        secp256k1_scalar msg;\n        secp256k1_scalar sr, ss;\n        secp256k1_scalar_set_int(&ss, 1);\n        secp256k1_scalar_set_int(&msg, 1);\n        secp256k1_scalar_set_b32(&sr, csr, NULL);\n        CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));\n        CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33));\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1);\n        secp256k1_scalar_negate(&ss, &ss);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1);\n        secp256k1_scalar_set_int(&ss, 2);\n        secp256k1_scalar_inverse_var(&ss, &ss);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0);\n    }\n\n    /* Verify signature with message -1 passes. */\n    {\n        const unsigned char pubkey[33] = {\n            0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0,\n            0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52,\n            0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27,\n            0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20,\n            0xf1\n        };\n        const unsigned char csr[32] = {\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n            0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4,\n            0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee\n        };\n        secp256k1_ge key;\n        secp256k1_scalar msg;\n        secp256k1_scalar sr, ss;\n        secp256k1_scalar_set_int(&ss, 1);\n        secp256k1_scalar_set_int(&msg, 1);\n        secp256k1_scalar_negate(&msg, &msg);\n        secp256k1_scalar_set_b32(&sr, csr, NULL);\n        CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33));\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1);\n        secp256k1_scalar_negate(&ss, &ss);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1);\n        secp256k1_scalar_set_int(&ss, 3);\n        secp256k1_scalar_inverse_var(&ss, &ss);\n        CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0);\n    }\n\n    /* Signature where s would be zero. */\n    {\n        secp256k1_pubkey pubkey;\n        size_t siglen;\n        int32_t ecount;\n        unsigned char signature[72];\n        static const unsigned char nonce[32] = {\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n        };\n        static const unsigned char nonce2[32] = {\n            0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\n            0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,\n            0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,\n            0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40\n        };\n        const unsigned char key[32] = {\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,\n        };\n        unsigned char msg[32] = {\n            0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53,\n            0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7,\n            0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,\n            0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,\n        };\n        ecount = 0;\n        secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount);\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 0);\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 0);\n        msg[31] = 0xaa;\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 1);\n        CHECK(ecount == 0);\n        CHECK(secp256k1_ecdsa_sign(ctx, NULL, msg, key, precomputed_nonce_function, nonce2) == 0);\n        CHECK(ecount == 1);\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0);\n        CHECK(ecount == 2);\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0);\n        CHECK(ecount == 3);\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 1);\n        CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, key) == 1);\n        CHECK(secp256k1_ecdsa_verify(ctx, NULL, msg, &pubkey) == 0);\n        CHECK(ecount == 4);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, NULL, &pubkey) == 0);\n        CHECK(ecount == 5);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, NULL) == 0);\n        CHECK(ecount == 6);\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 1);\n        CHECK(ecount == 6);\n        CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0);\n        CHECK(ecount == 7);\n        /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */\n        CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 0);\n        CHECK(ecount == 8);\n        siglen = 72;\n        CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, NULL, &siglen, &sig) == 0);\n        CHECK(ecount == 9);\n        CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, NULL, &sig) == 0);\n        CHECK(ecount == 10);\n        CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, NULL) == 0);\n        CHECK(ecount == 11);\n        CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 1);\n        CHECK(ecount == 11);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, NULL, signature, siglen) == 0);\n        CHECK(ecount == 12);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, NULL, siglen) == 0);\n        CHECK(ecount == 13);\n        CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, signature, siglen) == 1);\n        CHECK(ecount == 13);\n        siglen = 10;\n        /* Too little room for a signature does not fail via ARGCHECK. */\n        CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 0);\n        CHECK(ecount == 13);\n        ecount = 0;\n        CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, NULL) == 0);\n        CHECK(ecount == 1);\n        CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, NULL, &sig) == 0);\n        CHECK(ecount == 2);\n        CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, NULL) == 0);\n        CHECK(ecount == 3);\n        CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, &sig) == 1);\n        CHECK(ecount == 3);\n        CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, NULL, signature) == 0);\n        CHECK(ecount == 4);\n        CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, NULL) == 0);\n        CHECK(ecount == 5);\n        CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 1);\n        CHECK(ecount == 5);\n        memset(signature, 255, 64);\n        CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 0);\n        CHECK(ecount == 5);\n        secp256k1_context_set_illegal_callback(ctx, NULL, NULL);\n    }\n\n    /* Nonce function corner cases. */\n    for (t = 0; t < 2; t++) {\n        static const unsigned char zero[32] = {0x00};\n        int i;\n        unsigned char key[32];\n        unsigned char msg[32];\n        secp256k1_ecdsa_signature sig2;\n        secp256k1_scalar sr[512], ss;\n        const unsigned char *extra;\n        extra = t == 0 ? NULL : zero;\n        memset(msg, 0, 32);\n        msg[31] = 1;\n        /* High key results in signature failure. */\n        memset(key, 0xFF, 32);\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0);\n        CHECK(is_empty_signature(&sig));\n        /* Zero key results in signature failure. */\n        memset(key, 0, 32);\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0);\n        CHECK(is_empty_signature(&sig));\n        /* Nonce function failure results in signature failure. */\n        key[31] = 1;\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_fail, extra) == 0);\n        CHECK(is_empty_signature(&sig));\n        /* The retry loop successfully makes its way to the first good value. */\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_retry, extra) == 1);\n        CHECK(!is_empty_signature(&sig));\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, nonce_function_rfc6979, extra) == 1);\n        CHECK(!is_empty_signature(&sig2));\n        CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0);\n        /* The default nonce function is deterministic. */\n        CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1);\n        CHECK(!is_empty_signature(&sig2));\n        CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0);\n        /* The default nonce function changes output with different messages. */\n        for(i = 0; i < 256; i++) {\n            int j;\n            msg[0] = i;\n            CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1);\n            CHECK(!is_empty_signature(&sig2));\n            secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);\n            for (j = 0; j < i; j++) {\n                CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));\n            }\n        }\n        msg[0] = 0;\n        msg[31] = 2;\n        /* The default nonce function changes output with different keys. */\n        for(i = 256; i < 512; i++) {\n            int j;\n            key[0] = i - 256;\n            CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1);\n            CHECK(!is_empty_signature(&sig2));\n            secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2);\n            for (j = 0; j < i; j++) {\n                CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j]));\n            }\n        }\n        key[0] = 0;\n    }\n\n    {\n        /* Check that optional nonce arguments do not have equivalent effect. */\n        const unsigned char zeros[32] = {0};\n        unsigned char nonce[32];\n        unsigned char nonce2[32];\n        unsigned char nonce3[32];\n        unsigned char nonce4[32];\n        VG_UNDEF(nonce,32);\n        VG_UNDEF(nonce2,32);\n        VG_UNDEF(nonce3,32);\n        VG_UNDEF(nonce4,32);\n        CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1);\n        VG_CHECK(nonce,32);\n        CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1);\n        VG_CHECK(nonce2,32);\n        CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1);\n        VG_CHECK(nonce3,32);\n        CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1);\n        VG_CHECK(nonce4,32);\n        CHECK(memcmp(nonce, nonce2, 32) != 0);\n        CHECK(memcmp(nonce, nonce3, 32) != 0);\n        CHECK(memcmp(nonce, nonce4, 32) != 0);\n        CHECK(memcmp(nonce2, nonce3, 32) != 0);\n        CHECK(memcmp(nonce2, nonce4, 32) != 0);\n        CHECK(memcmp(nonce3, nonce4, 32) != 0);\n    }\n\n\n    /* Privkey export where pubkey is the point at infinity. */\n    {\n        unsigned char privkey[300];\n        unsigned char seckey[32] = {\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n            0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,\n            0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b,\n            0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,\n        };\n        size_t outlen = 300;\n        CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 0));\n        outlen = 300;\n        CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 1));\n    }\n}\n\nvoid run_ecdsa_edge_cases(void) {\n    test_ecdsa_edge_cases();\n}\n\n#ifdef ENABLE_OPENSSL_TESTS\nEC_KEY *get_openssl_key(const unsigned char *key32) {\n    unsigned char privkey[300];\n    size_t privkeylen;\n    const unsigned char* pbegin = privkey;\n    int compr = secp256k1_rand_bits(1);\n    EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);\n    CHECK(ec_privkey_export_der(ctx, privkey, &privkeylen, key32, compr));\n    CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));\n    CHECK(EC_KEY_check_key(ec_key));\n    return ec_key;\n}\n\nvoid test_ecdsa_openssl(void) {\n    secp256k1_gej qj;\n    secp256k1_ge q;\n    secp256k1_scalar sigr, sigs;\n    secp256k1_scalar one;\n    secp256k1_scalar msg2;\n    secp256k1_scalar key, msg;\n    EC_KEY *ec_key;\n    unsigned int sigsize = 80;\n    size_t secp_sigsize = 80;\n    unsigned char message[32];\n    unsigned char signature[80];\n    unsigned char key32[32];\n    secp256k1_rand256_test(message);\n    secp256k1_scalar_set_b32(&msg, message, NULL);\n    random_scalar_order_test(&key);\n    secp256k1_scalar_get_b32(key32, &key);\n    secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key);\n    secp256k1_ge_set_gej(&q, &qj);\n    ec_key = get_openssl_key(key32);\n    CHECK(ec_key != NULL);\n    CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key));\n    CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize));\n    CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg));\n    secp256k1_scalar_set_int(&one, 1);\n    secp256k1_scalar_add(&msg2, &msg, &one);\n    CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg2));\n\n    random_sign(&sigr, &sigs, &key, &msg, NULL);\n    CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs));\n    CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1);\n\n    EC_KEY_free(ec_key);\n}\n\nvoid run_ecdsa_openssl(void) {\n    int i;\n    for (i = 0; i < 10*count; i++) {\n        test_ecdsa_openssl();\n    }\n}\n#endif\n\n#ifdef ENABLE_MODULE_ECDH\n# include \"modules/ecdh/tests_impl.h\"\n#endif\n\n#ifdef ENABLE_MODULE_SCHNORR\n# include \"modules/schnorr/tests_impl.h\"\n#endif\n\n#ifdef ENABLE_MODULE_RECOVERY\n# include \"modules/recovery/tests_impl.h\"\n#endif\n\nint main(int argc, char **argv) {\n    unsigned char seed16[16] = {0};\n    unsigned char run32[32] = {0};\n    /* find iteration count */\n    if (argc > 1) {\n        count = strtol(argv[1], NULL, 0);\n    }\n\n    /* find random seed */\n    if (argc > 2) {\n        int pos = 0;\n        const char* ch = argv[2];\n        while (pos < 16 && ch[0] != 0 && ch[1] != 0) {\n            unsigned short sh;\n            if (sscanf(ch, \"%2hx\", &sh)) {\n                seed16[pos] = sh;\n            } else {\n                break;\n            }\n            ch += 2;\n            pos++;\n        }\n    } else {\n        FILE *frand = fopen(\"/dev/urandom\", \"r\");\n        if ((frand == NULL) || !fread(&seed16, sizeof(seed16), 1, frand)) {\n            uint64_t t = time(NULL) * (uint64_t)1337;\n            seed16[0] ^= t;\n            seed16[1] ^= t >> 8;\n            seed16[2] ^= t >> 16;\n            seed16[3] ^= t >> 24;\n            seed16[4] ^= t >> 32;\n            seed16[5] ^= t >> 40;\n            seed16[6] ^= t >> 48;\n            seed16[7] ^= t >> 56;\n        }\n        fclose(frand);\n    }\n    secp256k1_rand_seed(seed16);\n\n    printf(\"test count = %i\\n\", count);\n    printf(\"random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\\n\", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]);\n\n    /* initialize */\n    run_context_tests();\n    ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n    if (secp256k1_rand_bits(1)) {\n        secp256k1_rand256(run32);\n        CHECK(secp256k1_context_randomize(ctx, secp256k1_rand_bits(1) ? run32 : NULL));\n    }\n\n    run_rand_bits();\n    run_rand_int();\n\n    run_sha256_tests();\n    run_hmac_sha256_tests();\n    run_rfc6979_hmac_sha256_tests();\n\n#ifndef USE_NUM_NONE\n    /* num tests */\n    run_num_smalltests();\n#endif\n\n    /* scalar tests */\n    run_scalar_tests();\n\n    /* field tests */\n    run_field_inv();\n    run_field_inv_var();\n    run_field_inv_all_var();\n    run_field_misc();\n    run_field_convert();\n    run_sqr();\n    run_sqrt();\n\n    /* group tests */\n    run_ge();\n    run_group_decompress();\n\n    /* ecmult tests */\n    run_wnaf();\n    run_point_times_order();\n    run_ecmult_chain();\n    run_ecmult_constants();\n    run_ecmult_gen_blind();\n    run_ecmult_const_tests();\n    run_ec_combine();\n\n    /* endomorphism tests */\n#ifdef USE_ENDOMORPHISM\n    run_endomorphism_tests();\n#endif\n\n    /* EC point parser test */\n    run_ec_pubkey_parse_test();\n\n    /* EC key edge cases */\n    run_eckey_edge_case_test();\n\n#ifdef ENABLE_MODULE_ECDH\n    /* ecdh tests */\n    run_ecdh_tests();\n#endif\n\n    /* ecdsa tests */\n    run_random_pubkeys();\n    run_ecdsa_der_parse();\n    run_ecdsa_sign_verify();\n    run_ecdsa_end_to_end();\n    run_ecdsa_edge_cases();\n#ifdef ENABLE_OPENSSL_TESTS\n    run_ecdsa_openssl();\n#endif\n\n#ifdef ENABLE_MODULE_SCHNORR\n    /* Schnorr tests */\n    run_schnorr_tests();\n#endif\n\n#ifdef ENABLE_MODULE_RECOVERY\n    /* ECDSA pubkey recovery tests */\n    run_recovery_tests();\n#endif\n\n    secp256k1_rand256(run32);\n    printf(\"random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\\n\", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]);\n\n    /* shutdown */\n    secp256k1_context_destroy(ctx);\n\n    printf(\"no problems found\\n\");\n    return 0;\n}\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/tests_exhaustive.c",
    "content": "/***********************************************************************\n * Copyright (c) 2016 Andrew Poelstra                                 *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <time.h>\n\n#undef USE_ECMULT_STATIC_PRECOMPUTATION\n\n#ifndef EXHAUSTIVE_TEST_ORDER\n/* see group_impl.h for allowable values */\n#define EXHAUSTIVE_TEST_ORDER 13\n#define EXHAUSTIVE_TEST_LAMBDA 9   /* cube root of 1 mod 13 */\n#endif\n\n#include \"include/secp256k1.h\"\n#include \"group.h\"\n#include \"secp256k1.c\"\n#include \"testrand_impl.h\"\n\n#ifdef ENABLE_MODULE_RECOVERY\n#include \"src/modules/recovery/main_impl.h\"\n#include \"include/secp256k1_recovery.h\"\n#endif\n\n/** stolen from tests.c */\nvoid ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) {\n    CHECK(a->infinity == b->infinity);\n    if (a->infinity) {\n        return;\n    }\n    CHECK(secp256k1_fe_equal_var(&a->x, &b->x));\n    CHECK(secp256k1_fe_equal_var(&a->y, &b->y));\n}\n\nvoid ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) {\n    secp256k1_fe z2s;\n    secp256k1_fe u1, u2, s1, s2;\n    CHECK(a->infinity == b->infinity);\n    if (a->infinity) {\n        return;\n    }\n    /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */\n    secp256k1_fe_sqr(&z2s, &b->z);\n    secp256k1_fe_mul(&u1, &a->x, &z2s);\n    u2 = b->x; secp256k1_fe_normalize_weak(&u2);\n    secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z);\n    s2 = b->y; secp256k1_fe_normalize_weak(&s2);\n    CHECK(secp256k1_fe_equal_var(&u1, &u2));\n    CHECK(secp256k1_fe_equal_var(&s1, &s2));\n}\n\nvoid random_fe(secp256k1_fe *x) {\n    unsigned char bin[32];\n    do {\n        secp256k1_rand256(bin);\n        if (secp256k1_fe_set_b32(x, bin)) {\n            return;\n        }\n    } while(1);\n}\n/** END stolen from tests.c */\n\nint secp256k1_nonce_function_smallint(unsigned char *nonce32, const unsigned char *msg32,\n                                      const unsigned char *key32, const unsigned char *algo16,\n                                      void *data, unsigned int attempt) {\n    secp256k1_scalar s;\n    int *idata = data;\n    (void)msg32;\n    (void)key32;\n    (void)algo16;\n    /* Some nonces cannot be used because they'd cause s and/or r to be zero.\n     * The signing function has retry logic here that just re-calls the nonce\n     * function with an increased `attempt`. So if attempt > 0 this means we\n     * need to change the nonce to avoid an infinite loop. */\n    if (attempt > 0) {\n        *idata = (*idata + 1) % EXHAUSTIVE_TEST_ORDER;\n    }\n    secp256k1_scalar_set_int(&s, *idata);\n    secp256k1_scalar_get_b32(nonce32, &s);\n    return 1;\n}\n\n#ifdef USE_ENDOMORPHISM\nvoid test_exhaustive_endomorphism(const secp256k1_ge *group, int order) {\n    int i;\n    for (i = 0; i < order; i++) {\n        secp256k1_ge res;\n        secp256k1_ge_mul_lambda(&res, &group[i]);\n        ge_equals_ge(&group[i * EXHAUSTIVE_TEST_LAMBDA % EXHAUSTIVE_TEST_ORDER], &res);\n    }\n}\n#endif\n\nvoid test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_gej *groupj, int order) {\n    int i, j;\n\n    /* Sanity-check (and check infinity functions) */\n    CHECK(secp256k1_ge_is_infinity(&group[0]));\n    CHECK(secp256k1_gej_is_infinity(&groupj[0]));\n    for (i = 1; i < order; i++) {\n        CHECK(!secp256k1_ge_is_infinity(&group[i]));\n        CHECK(!secp256k1_gej_is_infinity(&groupj[i]));\n    }\n\n    /* Check all addition formulae */\n    for (j = 0; j < order; j++) {\n        secp256k1_fe fe_inv;\n        secp256k1_fe_inv(&fe_inv, &groupj[j].z);\n        for (i = 0; i < order; i++) {\n            secp256k1_ge zless_gej;\n            secp256k1_gej tmp;\n            /* add_var */\n            secp256k1_gej_add_var(&tmp, &groupj[i], &groupj[j], NULL);\n            ge_equals_gej(&group[(i + j) % order], &tmp);\n            /* add_ge */\n            if (j > 0) {\n                secp256k1_gej_add_ge(&tmp, &groupj[i], &group[j]);\n                ge_equals_gej(&group[(i + j) % order], &tmp);\n            }\n            /* add_ge_var */\n            secp256k1_gej_add_ge_var(&tmp, &groupj[i], &group[j], NULL);\n            ge_equals_gej(&group[(i + j) % order], &tmp);\n            /* add_zinv_var */\n            zless_gej.infinity = groupj[j].infinity;\n            zless_gej.x = groupj[j].x;\n            zless_gej.y = groupj[j].y;\n            secp256k1_gej_add_zinv_var(&tmp, &groupj[i], &zless_gej, &fe_inv);\n            ge_equals_gej(&group[(i + j) % order], &tmp);\n        }\n    }\n\n    /* Check doubling */\n    for (i = 0; i < order; i++) {\n        secp256k1_gej tmp;\n        if (i > 0) {\n            secp256k1_gej_double_nonzero(&tmp, &groupj[i], NULL);\n            ge_equals_gej(&group[(2 * i) % order], &tmp);\n        }\n        secp256k1_gej_double_var(&tmp, &groupj[i], NULL);\n        ge_equals_gej(&group[(2 * i) % order], &tmp);\n    }\n\n    /* Check negation */\n    for (i = 1; i < order; i++) {\n        secp256k1_ge tmp;\n        secp256k1_gej tmpj;\n        secp256k1_ge_neg(&tmp, &group[i]);\n        ge_equals_ge(&group[order - i], &tmp);\n        secp256k1_gej_neg(&tmpj, &groupj[i]);\n        ge_equals_gej(&group[order - i], &tmpj);\n    }\n}\n\nvoid test_exhaustive_ecmult(const secp256k1_context *ctx, const secp256k1_ge *group, const secp256k1_gej *groupj, int order) {\n    int i, j, r_log;\n    for (r_log = 1; r_log < order; r_log++) {\n        for (j = 0; j < order; j++) {\n            for (i = 0; i < order; i++) {\n                secp256k1_gej tmp;\n                secp256k1_scalar na, ng;\n                secp256k1_scalar_set_int(&na, i);\n                secp256k1_scalar_set_int(&ng, j);\n\n                secp256k1_ecmult(&ctx->ecmult_ctx, &tmp, &groupj[r_log], &na, &ng);\n                ge_equals_gej(&group[(i * r_log + j) % order], &tmp);\n\n                if (i > 0) {\n                    secp256k1_ecmult_const(&tmp, &group[i], &ng);\n                    ge_equals_gej(&group[(i * j) % order], &tmp);\n                }\n            }\n        }\n    }\n}\n\nvoid r_from_k(secp256k1_scalar *r, const secp256k1_ge *group, int k) {\n    secp256k1_fe x;\n    unsigned char x_bin[32];\n    k %= EXHAUSTIVE_TEST_ORDER;\n    x = group[k].x;\n    secp256k1_fe_normalize(&x);\n    secp256k1_fe_get_b32(x_bin, &x);\n    secp256k1_scalar_set_b32(r, x_bin, NULL);\n}\n\nvoid test_exhaustive_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) {\n    int s, r, msg, key;\n    for (s = 1; s < order; s++) {\n        for (r = 1; r < order; r++) {\n            for (msg = 1; msg < order; msg++) {\n                for (key = 1; key < order; key++) {\n                    secp256k1_ge nonconst_ge;\n                    secp256k1_ecdsa_signature sig;\n                    secp256k1_pubkey pk;\n                    secp256k1_scalar sk_s, msg_s, r_s, s_s;\n                    secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s;\n                    int k, should_verify;\n                    unsigned char msg32[32];\n\n                    secp256k1_scalar_set_int(&s_s, s);\n                    secp256k1_scalar_set_int(&r_s, r);\n                    secp256k1_scalar_set_int(&msg_s, msg);\n                    secp256k1_scalar_set_int(&sk_s, key);\n\n                    /* Verify by hand */\n                    /* Run through every k value that gives us this r and check that *one* works.\n                     * Note there could be none, there could be multiple, ECDSA is weird. */\n                    should_verify = 0;\n                    for (k = 0; k < order; k++) {\n                        secp256k1_scalar check_x_s;\n                        r_from_k(&check_x_s, group, k);\n                        if (r_s == check_x_s) {\n                            secp256k1_scalar_set_int(&s_times_k_s, k);\n                            secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s);\n                            secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s);\n                            secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s);\n                            should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s);\n                        }\n                    }\n                    /* nb we have a \"high s\" rule */\n                    should_verify &= !secp256k1_scalar_is_high(&s_s);\n\n                    /* Verify by calling verify */\n                    secp256k1_ecdsa_signature_save(&sig, &r_s, &s_s);\n                    memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge));\n                    secp256k1_pubkey_save(&pk, &nonconst_ge);\n                    secp256k1_scalar_get_b32(msg32, &msg_s);\n                    CHECK(should_verify ==\n                          secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk));\n                }\n            }\n        }\n    }\n}\n\nvoid test_exhaustive_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) {\n    int i, j, k;\n\n    /* Loop */\n    for (i = 1; i < order; i++) {  /* message */\n        for (j = 1; j < order; j++) {  /* key */\n            for (k = 1; k < order; k++) {  /* nonce */\n                const int starting_k = k;\n                secp256k1_ecdsa_signature sig;\n                secp256k1_scalar sk, msg, r, s, expected_r;\n                unsigned char sk32[32], msg32[32];\n                secp256k1_scalar_set_int(&msg, i);\n                secp256k1_scalar_set_int(&sk, j);\n                secp256k1_scalar_get_b32(sk32, &sk);\n                secp256k1_scalar_get_b32(msg32, &msg);\n\n                secp256k1_ecdsa_sign(ctx, &sig, msg32, sk32, secp256k1_nonce_function_smallint, &k);\n\n                secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig);\n                /* Note that we compute expected_r *after* signing -- this is important\n                 * because our nonce-computing function function might change k during\n                 * signing. */\n                r_from_k(&expected_r, group, k);\n                CHECK(r == expected_r);\n                CHECK((k * s) % order == (i + r * j) % order ||\n                      (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order);\n\n                /* Overflow means we've tried every possible nonce */\n                if (k < starting_k) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /* We would like to verify zero-knowledge here by counting how often every\n     * possible (s, r) tuple appears, but because the group order is larger\n     * than the field order, when coercing the x-values to scalar values, some\n     * appear more often than others, so we are actually not zero-knowledge.\n     * (This effect also appears in the real code, but the difference is on the\n     * order of 1/2^128th the field order, so the deviation is not useful to a\n     * computationally bounded attacker.)\n     */\n}\n\n#ifdef ENABLE_MODULE_RECOVERY\nvoid test_exhaustive_recovery_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) {\n    int i, j, k;\n\n    /* Loop */\n    for (i = 1; i < order; i++) {  /* message */\n        for (j = 1; j < order; j++) {  /* key */\n            for (k = 1; k < order; k++) {  /* nonce */\n                const int starting_k = k;\n                secp256k1_fe r_dot_y_normalized;\n                secp256k1_ecdsa_recoverable_signature rsig;\n                secp256k1_ecdsa_signature sig;\n                secp256k1_scalar sk, msg, r, s, expected_r;\n                unsigned char sk32[32], msg32[32];\n                int expected_recid;\n                int recid;\n                secp256k1_scalar_set_int(&msg, i);\n                secp256k1_scalar_set_int(&sk, j);\n                secp256k1_scalar_get_b32(sk32, &sk);\n                secp256k1_scalar_get_b32(msg32, &msg);\n\n                secp256k1_ecdsa_sign_recoverable(ctx, &rsig, msg32, sk32, secp256k1_nonce_function_smallint, &k);\n\n                /* Check directly */\n                secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, &rsig);\n                r_from_k(&expected_r, group, k);\n                CHECK(r == expected_r);\n                CHECK((k * s) % order == (i + r * j) % order ||\n                      (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order);\n                /* In computing the recid, there is an overflow condition that is disabled in\n                 * scalar_low_impl.h `secp256k1_scalar_set_b32` because almost every r.y value\n                 * will exceed the group order, and our signing code always holds out for r\n                 * values that don't overflow, so with a proper overflow check the tests would\n                 * loop indefinitely. */\n                r_dot_y_normalized = group[k].y;\n                secp256k1_fe_normalize(&r_dot_y_normalized);\n                /* Also the recovery id is flipped depending if we hit the low-s branch */\n                if ((k * s) % order == (i + r * j) % order) {\n                    expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 1 : 0;\n                } else {\n                    expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 0 : 1;\n                }\n                CHECK(recid == expected_recid);\n\n                /* Convert to a standard sig then check */\n                secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig);\n                secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig);\n                /* Note that we compute expected_r *after* signing -- this is important\n                 * because our nonce-computing function function might change k during\n                 * signing. */\n                r_from_k(&expected_r, group, k);\n                CHECK(r == expected_r);\n                CHECK((k * s) % order == (i + r * j) % order ||\n                      (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order);\n\n                /* Overflow means we've tried every possible nonce */\n                if (k < starting_k) {\n                    break;\n                }\n            }\n        }\n    }\n}\n\nvoid test_exhaustive_recovery_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) {\n    /* This is essentially a copy of test_exhaustive_verify, with recovery added */\n    int s, r, msg, key;\n    for (s = 1; s < order; s++) {\n        for (r = 1; r < order; r++) {\n            for (msg = 1; msg < order; msg++) {\n                for (key = 1; key < order; key++) {\n                    secp256k1_ge nonconst_ge;\n                    secp256k1_ecdsa_recoverable_signature rsig;\n                    secp256k1_ecdsa_signature sig;\n                    secp256k1_pubkey pk;\n                    secp256k1_scalar sk_s, msg_s, r_s, s_s;\n                    secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s;\n                    int recid = 0;\n                    int k, should_verify;\n                    unsigned char msg32[32];\n\n                    secp256k1_scalar_set_int(&s_s, s);\n                    secp256k1_scalar_set_int(&r_s, r);\n                    secp256k1_scalar_set_int(&msg_s, msg);\n                    secp256k1_scalar_set_int(&sk_s, key);\n                    secp256k1_scalar_get_b32(msg32, &msg_s);\n\n                    /* Verify by hand */\n                    /* Run through every k value that gives us this r and check that *one* works.\n                     * Note there could be none, there could be multiple, ECDSA is weird. */\n                    should_verify = 0;\n                    for (k = 0; k < order; k++) {\n                        secp256k1_scalar check_x_s;\n                        r_from_k(&check_x_s, group, k);\n                        if (r_s == check_x_s) {\n                            secp256k1_scalar_set_int(&s_times_k_s, k);\n                            secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s);\n                            secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s);\n                            secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s);\n                            should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s);\n                        }\n                    }\n                    /* nb we have a \"high s\" rule */\n                    should_verify &= !secp256k1_scalar_is_high(&s_s);\n\n                    /* We would like to try recovering the pubkey and checking that it matches,\n                     * but pubkey recovery is impossible in the exhaustive tests (the reason\n                     * being that there are 12 nonzero r values, 12 nonzero points, and no\n                     * overlap between the sets, so there are no valid signatures). */\n\n                    /* Verify by converting to a standard signature and calling verify */\n                    secp256k1_ecdsa_recoverable_signature_save(&rsig, &r_s, &s_s, recid);\n                    secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig);\n                    memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge));\n                    secp256k1_pubkey_save(&pk, &nonconst_ge);\n                    CHECK(should_verify ==\n                          secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk));\n                }\n            }\n        }\n    }\n}\n#endif\n\nint main(void) {\n    int i;\n    secp256k1_gej groupj[EXHAUSTIVE_TEST_ORDER];\n    secp256k1_ge group[EXHAUSTIVE_TEST_ORDER];\n\n    /* Build context */\n    secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n\n    /* TODO set z = 1, then do num_tests runs with random z values */\n\n    /* Generate the entire group */\n    secp256k1_gej_set_infinity(&groupj[0]);\n    secp256k1_ge_set_gej(&group[0], &groupj[0]);\n    for (i = 1; i < EXHAUSTIVE_TEST_ORDER; i++) {\n        /* Set a different random z-value for each Jacobian point */\n        secp256k1_fe z;\n        random_fe(&z);\n\n        secp256k1_gej_add_ge(&groupj[i], &groupj[i - 1], &secp256k1_ge_const_g);\n        secp256k1_ge_set_gej(&group[i], &groupj[i]);\n        secp256k1_gej_rescale(&groupj[i], &z);\n\n        /* Verify against ecmult_gen */\n        {\n            secp256k1_scalar scalar_i;\n            secp256k1_gej generatedj;\n            secp256k1_ge generated;\n\n            secp256k1_scalar_set_int(&scalar_i, i);\n            secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &generatedj, &scalar_i);\n            secp256k1_ge_set_gej(&generated, &generatedj);\n\n            CHECK(group[i].infinity == 0);\n            CHECK(generated.infinity == 0);\n            CHECK(secp256k1_fe_equal_var(&generated.x, &group[i].x));\n            CHECK(secp256k1_fe_equal_var(&generated.y, &group[i].y));\n        }\n    }\n\n    /* Run the tests */\n#ifdef USE_ENDOMORPHISM\n    test_exhaustive_endomorphism(group, EXHAUSTIVE_TEST_ORDER);\n#endif\n    test_exhaustive_addition(group, groupj, EXHAUSTIVE_TEST_ORDER);\n    test_exhaustive_ecmult(ctx, group, groupj, EXHAUSTIVE_TEST_ORDER);\n    test_exhaustive_sign(ctx, group, EXHAUSTIVE_TEST_ORDER);\n    test_exhaustive_verify(ctx, group, EXHAUSTIVE_TEST_ORDER);\n\n#ifdef ENABLE_MODULE_RECOVERY\n    test_exhaustive_recovery_sign(ctx, group, EXHAUSTIVE_TEST_ORDER);\n    test_exhaustive_recovery_verify(ctx, group, EXHAUSTIVE_TEST_ORDER);\n#endif\n\n    secp256k1_context_destroy(ctx);\n    return 0;\n}\n\n"
  },
  {
    "path": "crypto/secp256k1/libsecp256k1/src/util.h",
    "content": "/**********************************************************************\n * Copyright (c) 2013, 2014 Pieter Wuille                             *\n * Distributed under the MIT software license, see the accompanying   *\n * file COPYING or http://www.opensource.org/licenses/mit-license.php.*\n **********************************************************************/\n\n#ifndef _SECP256K1_UTIL_H_\n#define _SECP256K1_UTIL_H_\n\n#if defined HAVE_CONFIG_H\n#include \"libsecp256k1-config.h\"\n#endif\n\n#include <stdlib.h>\n#include <stdint.h>\n#include <stdio.h>\n\ntypedef struct {\n    void (*fn)(const char *text, void* data);\n    const void* data;\n} secp256k1_callback;\n\nstatic SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) {\n    cb->fn(text, (void*)cb->data);\n}\n\n#ifdef DETERMINISTIC\n#define TEST_FAILURE(msg) do { \\\n    fprintf(stderr, \"%s\\n\", msg); \\\n    abort(); \\\n} while(0);\n#else\n#define TEST_FAILURE(msg) do { \\\n    fprintf(stderr, \"%s:%d: %s\\n\", __FILE__, __LINE__, msg); \\\n    abort(); \\\n} while(0)\n#endif\n\n#ifdef HAVE_BUILTIN_EXPECT\n#define EXPECT(x,c) __builtin_expect((x),(c))\n#else\n#define EXPECT(x,c) (x)\n#endif\n\n#ifdef DETERMINISTIC\n#define CHECK(cond) do { \\\n    if (EXPECT(!(cond), 0)) { \\\n        TEST_FAILURE(\"test condition failed\"); \\\n    } \\\n} while(0)\n#else\n#define CHECK(cond) do { \\\n    if (EXPECT(!(cond), 0)) { \\\n        TEST_FAILURE(\"test condition failed: \" #cond); \\\n    } \\\n} while(0)\n#endif\n\n/* Like assert(), but when VERIFY is defined, and side-effect safe. */\n#if defined(COVERAGE)\n#define VERIFY_CHECK(check)\n#define VERIFY_SETUP(stmt)\n#elif defined(VERIFY)\n#define VERIFY_CHECK CHECK\n#define VERIFY_SETUP(stmt) do { stmt; } while(0)\n#else\n#define VERIFY_CHECK(cond) do { (void)(cond); } while(0)\n#define VERIFY_SETUP(stmt)\n#endif\n\nstatic SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) {\n    void *ret = malloc(size);\n    if (ret == NULL) {\n        secp256k1_callback_call(cb, \"Out of memory\");\n    }\n    return ret;\n}\n\n/* Macro for restrict, when available and not in a VERIFY build. */\n#if defined(SECP256K1_BUILD) && defined(VERIFY)\n# define SECP256K1_RESTRICT\n#else\n# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )\n#  if SECP256K1_GNUC_PREREQ(3,0)\n#   define SECP256K1_RESTRICT __restrict__\n#  elif (defined(_MSC_VER) && _MSC_VER >= 1400)\n#   define SECP256K1_RESTRICT __restrict\n#  else\n#   define SECP256K1_RESTRICT\n#  endif\n# else\n#  define SECP256K1_RESTRICT restrict\n# endif\n#endif\n\n#if defined(_WIN32)\n# define I64FORMAT \"I64d\"\n# define I64uFORMAT \"I64u\"\n#else\n# define I64FORMAT \"lld\"\n# define I64uFORMAT \"llu\"\n#endif\n\n#if defined(HAVE___INT128)\n# if defined(__GNUC__)\n#  define SECP256K1_GNUC_EXT __extension__\n# else\n#  define SECP256K1_GNUC_EXT\n# endif\nSECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t;\n#endif\n\n#endif\n"
  },
  {
    "path": "crypto/secp256k1/panic_cb.go",
    "content": "// Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be found in\n// the LICENSE file.\n\npackage secp256k1\n\nimport \"C\"\nimport \"unsafe\"\n\n// Callbacks for converting libsecp256k1 internal faults into\n// recoverable Go panics.\n\n//export secp256k1GoPanicIllegal\nfunc secp256k1GoPanicIllegal(msg *C.char, data unsafe.Pointer) {\n\tpanic(\"illegal argument: \" + C.GoString(msg))\n}\n\n//export secp256k1GoPanicError\nfunc secp256k1GoPanicError(msg *C.char, data unsafe.Pointer) {\n\tpanic(\"internal error: \" + C.GoString(msg))\n}\n"
  },
  {
    "path": "crypto/secp256k1/secp256.go",
    "content": "// Copyright 2015 Jeffrey Wilcke, Felix Lange, Gustav Simonsson. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be found in\n// the LICENSE file.\n\n// Package secp256k1 wraps the bitcoin secp256k1 C library.\npackage secp256k1\n\n/*\n#cgo CFLAGS: -I./libsecp256k1\n#cgo CFLAGS: -I./libsecp256k1/src/\n#define USE_NUM_NONE\n#define USE_FIELD_10X26\n#define USE_FIELD_INV_BUILTIN\n#define USE_SCALAR_8X32\n#define USE_SCALAR_INV_BUILTIN\n#define NDEBUG\n#include \"./libsecp256k1/src/secp256k1.c\"\n#include \"./libsecp256k1/src/modules/recovery/main_impl.h\"\n#include \"ext.h\"\n\ntypedef void (*callbackFunc) (const char* msg, void* data);\nextern void secp256k1GoPanicIllegal(const char* msg, void* data);\nextern void secp256k1GoPanicError(const char* msg, void* data);\n*/\nimport \"C\"\n\nimport (\n\t\"errors\"\n\t\"math/big\"\n\t\"unsafe\"\n)\n\nvar context *C.secp256k1_context\n\nfunc init() {\n\t// around 20 ms on a modern CPU.\n\tcontext = C.secp256k1_context_create_sign_verify()\n\tC.secp256k1_context_set_illegal_callback(context, C.callbackFunc(C.secp256k1GoPanicIllegal), nil)\n\tC.secp256k1_context_set_error_callback(context, C.callbackFunc(C.secp256k1GoPanicError), nil)\n}\n\nvar (\n\tErrInvalidMsgLen       = errors.New(\"invalid message length, need 32 bytes\")\n\tErrInvalidSignatureLen = errors.New(\"invalid signature length\")\n\tErrInvalidRecoveryID   = errors.New(\"invalid signature recovery id\")\n\tErrInvalidKey          = errors.New(\"invalid private key\")\n\tErrInvalidPubkey       = errors.New(\"invalid public key\")\n\tErrSignFailed          = errors.New(\"signing failed\")\n\tErrRecoverFailed       = errors.New(\"recovery failed\")\n)\n\n// Sign creates a recoverable ECDSA signature.\n// The produced signature is in the 65-byte [R || S || V] format where V is 0 or 1.\n//\n// The caller is responsible for ensuring that msg cannot be chosen\n// directly by an attacker. It is usually preferable to use a cryptographic\n// hash function on any input before handing it to this function.\nfunc Sign(msg []byte, seckey []byte) ([]byte, error) {\n\tif len(msg) != 32 {\n\t\treturn nil, ErrInvalidMsgLen\n\t}\n\tif len(seckey) != 32 {\n\t\treturn nil, ErrInvalidKey\n\t}\n\tseckeydata := (*C.uchar)(unsafe.Pointer(&seckey[0]))\n\tif C.secp256k1_ec_seckey_verify(context, seckeydata) != 1 {\n\t\treturn nil, ErrInvalidKey\n\t}\n\n\tvar (\n\t\tmsgdata   = (*C.uchar)(unsafe.Pointer(&msg[0]))\n\t\tnoncefunc = C.secp256k1_nonce_function_rfc6979\n\t\tsigstruct C.secp256k1_ecdsa_recoverable_signature\n\t)\n\tif C.secp256k1_ecdsa_sign_recoverable(context, &sigstruct, msgdata, seckeydata, noncefunc, nil) == 0 {\n\t\treturn nil, ErrSignFailed\n\t}\n\n\tvar (\n\t\tsig     = make([]byte, 65)\n\t\tsigdata = (*C.uchar)(unsafe.Pointer(&sig[0]))\n\t\trecid   C.int\n\t)\n\tC.secp256k1_ecdsa_recoverable_signature_serialize_compact(context, sigdata, &recid, &sigstruct)\n\tsig[64] = byte(recid) // add back recid to get 65 bytes sig\n\treturn sig, nil\n}\n\n// RecoverPubkey returns the the public key of the abi.\n// msg must be the 32-byte hash of the message to be signed.\n// sig must be a 65-byte compact ECDSA signature containing the\n// recovery id as the last element.\nfunc RecoverPubkey(msg []byte, sig []byte) ([]byte, error) {\n\tif len(msg) != 32 {\n\t\treturn nil, ErrInvalidMsgLen\n\t}\n\tif err := checkSignature(sig); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar (\n\t\tpubkey  = make([]byte, 65)\n\t\tsigdata = (*C.uchar)(unsafe.Pointer(&sig[0]))\n\t\tmsgdata = (*C.uchar)(unsafe.Pointer(&msg[0]))\n\t)\n\tif C.secp256k1_ext_ecdsa_recover(context, (*C.uchar)(unsafe.Pointer(&pubkey[0])), sigdata, msgdata) == 0 {\n\t\treturn nil, ErrRecoverFailed\n\t}\n\treturn pubkey, nil\n}\n\n// VerifySignature checks that the given pubkey created signature over message.\n// The signature should be in [R || S] format.\nfunc VerifySignature(pubkey, msg, signature []byte) bool {\n\tif len(msg) != 32 || len(signature) != 64 || len(pubkey) == 0 {\n\t\treturn false\n\t}\n\tsigdata := (*C.uchar)(unsafe.Pointer(&signature[0]))\n\tmsgdata := (*C.uchar)(unsafe.Pointer(&msg[0]))\n\tkeydata := (*C.uchar)(unsafe.Pointer(&pubkey[0]))\n\treturn C.secp256k1_ext_ecdsa_verify(context, sigdata, msgdata, keydata, C.size_t(len(pubkey))) != 0\n}\n\n// DecompressPubkey parses a public key in the 33-byte compressed format.\n// It returns non-nil coordinates if the public key is valid.\nfunc DecompressPubkey(pubkey []byte) (x, y *big.Int) {\n\tif len(pubkey) != 33 {\n\t\treturn nil, nil\n\t}\n\tvar (\n\t\tpubkeydata = (*C.uchar)(unsafe.Pointer(&pubkey[0]))\n\t\tpubkeylen  = C.size_t(len(pubkey))\n\t\tout        = make([]byte, 65)\n\t\toutdata    = (*C.uchar)(unsafe.Pointer(&out[0]))\n\t\toutlen     = C.size_t(len(out))\n\t)\n\tif C.secp256k1_ext_reencode_pubkey(context, outdata, outlen, pubkeydata, pubkeylen) == 0 {\n\t\treturn nil, nil\n\t}\n\treturn new(big.Int).SetBytes(out[1:33]), new(big.Int).SetBytes(out[33:])\n}\n\n// CompressPubkey encodes a public key to 33-byte compressed format.\nfunc CompressPubkey(x, y *big.Int) []byte {\n\tvar (\n\t\tpubkey     = S256().Marshal(x, y)\n\t\tpubkeydata = (*C.uchar)(unsafe.Pointer(&pubkey[0]))\n\t\tpubkeylen  = C.size_t(len(pubkey))\n\t\tout        = make([]byte, 33)\n\t\toutdata    = (*C.uchar)(unsafe.Pointer(&out[0]))\n\t\toutlen     = C.size_t(len(out))\n\t)\n\tif C.secp256k1_ext_reencode_pubkey(context, outdata, outlen, pubkeydata, pubkeylen) == 0 {\n\t\tpanic(\"libsecp256k1 error\")\n\t}\n\treturn out\n}\n\nfunc checkSignature(sig []byte) error {\n\tif len(sig) != 65 {\n\t\treturn ErrInvalidSignatureLen\n\t}\n\tif sig[64] >= 4 {\n\t\treturn ErrInvalidRecoveryID\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "crypto/sha3/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "crypto/sha3/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "crypto/sha3/doc.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package sha3 implements the SHA-3 fixed-output-length hash functions and\n// the SHAKE variable-output-length hash functions defined by FIPS-202.\n//\n// Both types of hash function use the \"sponge\" construction and the Keccak\n// permutation. For a detailed specification see http://keccak.noekeon.org/\n//\n//\n// Guidance\n//\n// If you aren't sure what function you need, use SHAKE256 with at least 64\n// bytes of output. The SHAKE instances are faster than the SHA3 instances;\n// the latter have to allocate memory to conform to the hash.Hash interface.\n//\n// If you need a secret-key MAC (message authentication code), prepend the\n// secret key to the input, hash with SHAKE256 and read at least 32 bytes of\n// output.\n//\n//\n// Security strengths\n//\n// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security\n// strength against preimage attacks of x bits. Since they only produce \"x\"\n// bits of output, their collision-resistance is only \"x/2\" bits.\n//\n// The SHAKE-256 and -128 functions have a generic security strength of 256 and\n// 128 bits against all attacks, provided that at least 2x bits of their output\n// is used.  Requesting more than 64 or 32 bytes of output, respectively, does\n// not increase the collision-resistance of the SHAKE functions.\n//\n//\n// The sponge construction\n//\n// A sponge builds a pseudo-random function from a public pseudo-random\n// permutation, by applying the permutation to a state of \"rate + capacity\"\n// bytes, but hiding \"capacity\" of the bytes.\n//\n// A sponge starts out with a zero state. To hash an input using a sponge, up\n// to \"rate\" bytes of the input are XORed into the sponge's state. The sponge\n// is then \"full\" and the permutation is applied to \"empty\" it. This process is\n// repeated until all the input has been \"absorbed\". The input is then padded.\n// The digest is \"squeezed\" from the sponge in the same way, except that output\n// output is copied out instead of input being XORed in.\n//\n// A sponge is parameterized by its generic security strength, which is equal\n// to half its capacity; capacity + rate is equal to the permutation's width.\n// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means\n// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2.\n//\n//\n// Recommendations\n//\n// The SHAKE functions are recommended for most new uses. They can produce\n// output of arbitrary length. SHAKE256, with an output length of at least\n// 64 bytes, provides 256-bit security against all attacks.  The Keccak team\n// recommends it for most applications upgrading from SHA2-512. (NIST chose a\n// much stronger, but much slower, sponge instance for SHA3-512.)\n//\n// The SHA-3 functions are \"drop-in\" replacements for the SHA-2 functions.\n// They produce output of the same length, with the same security strengths\n// against all attacks. This means, in particular, that SHA3-256 only has\n// 128-bit collision resistance, because its output length is 32 bytes.\npackage sha3\n"
  },
  {
    "path": "crypto/sha3/hashes.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage sha3\n\n// This file provides functions for creating instances of the SHA-3\n// and SHAKE hash functions, as well as utility functions for hashing\n// bytes.\n\nimport (\n\t\"hash\"\n)\n\n// NewKeccak256 creates a new Keccak-256 hash.\nfunc NewKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} }\n\n// NewKeccak512 creates a new Keccak-512 hash.\nfunc NewKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} }\n\n// New224 creates a new SHA3-224 hash.\n// Its generic security strength is 224 bits against preimage attacks,\n// and 112 bits against collision attacks.\nfunc New224() hash.Hash { return &state{rate: 144, outputLen: 28, dsbyte: 0x06} }\n\n// New256 creates a new SHA3-256 hash.\n// Its generic security strength is 256 bits against preimage attacks,\n// and 128 bits against collision attacks.\nfunc New256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x06} }\n\n// New384 creates a new SHA3-384 hash.\n// Its generic security strength is 384 bits against preimage attacks,\n// and 192 bits against collision attacks.\nfunc New384() hash.Hash { return &state{rate: 104, outputLen: 48, dsbyte: 0x06} }\n\n// New512 creates a new SHA3-512 hash.\n// Its generic security strength is 512 bits against preimage attacks,\n// and 256 bits against collision attacks.\nfunc New512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x06} }\n\n// Sum224 returns the SHA3-224 digest of the data.\nfunc Sum224(data []byte) (digest [28]byte) {\n\th := New224()\n\th.Write(data)\n\th.Sum(digest[:0])\n\treturn\n}\n\n// Sum256 returns the SHA3-256 digest of the data.\nfunc Sum256(data []byte) (digest [32]byte) {\n\th := New256()\n\th.Write(data)\n\th.Sum(digest[:0])\n\treturn\n}\n\n// Sum384 returns the SHA3-384 digest of the data.\nfunc Sum384(data []byte) (digest [48]byte) {\n\th := New384()\n\th.Write(data)\n\th.Sum(digest[:0])\n\treturn\n}\n\n// Sum512 returns the SHA3-512 digest of the data.\nfunc Sum512(data []byte) (digest [64]byte) {\n\th := New512()\n\th.Write(data)\n\th.Sum(digest[:0])\n\treturn\n}\n"
  },
  {
    "path": "crypto/sha3/keccakf.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//  +build !amd64 appengine gccgo\n\npackage sha3\n\n// rc stores the round constants for use in the ι step.\nvar rc = [24]uint64{\n\t0x0000000000000001,\n\t0x0000000000008082,\n\t0x800000000000808A,\n\t0x8000000080008000,\n\t0x000000000000808B,\n\t0x0000000080000001,\n\t0x8000000080008081,\n\t0x8000000000008009,\n\t0x000000000000008A,\n\t0x0000000000000088,\n\t0x0000000080008009,\n\t0x000000008000000A,\n\t0x000000008000808B,\n\t0x800000000000008B,\n\t0x8000000000008089,\n\t0x8000000000008003,\n\t0x8000000000008002,\n\t0x8000000000000080,\n\t0x000000000000800A,\n\t0x800000008000000A,\n\t0x8000000080008081,\n\t0x8000000000008080,\n\t0x0000000080000001,\n\t0x8000000080008008,\n}\n\n// keccakF1600 applies the Keccak permutation to a 1600b-wide\n// state represented as a slice of 25 uint64s.\nfunc keccakF1600(a *[25]uint64) {\n\t// Implementation translated from Keccak-inplace.c\n\t// in the keccak reference code.\n\tvar t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64\n\n\tfor i := 0; i < 24; i += 4 {\n\t\t// Combines the 5 steps in each round into 2 steps.\n\t\t// Unrolls 4 rounds per loop and spreads some steps across rounds.\n\n\t\t// Round 1\n\t\tbc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]\n\t\tbc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]\n\t\tbc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]\n\t\tbc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]\n\t\tbc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]\n\t\td0 = bc4 ^ (bc1<<1 | bc1>>63)\n\t\td1 = bc0 ^ (bc2<<1 | bc2>>63)\n\t\td2 = bc1 ^ (bc3<<1 | bc3>>63)\n\t\td3 = bc2 ^ (bc4<<1 | bc4>>63)\n\t\td4 = bc3 ^ (bc0<<1 | bc0>>63)\n\n\t\tbc0 = a[0] ^ d0\n\t\tt = a[6] ^ d1\n\t\tbc1 = t<<44 | t>>(64-44)\n\t\tt = a[12] ^ d2\n\t\tbc2 = t<<43 | t>>(64-43)\n\t\tt = a[18] ^ d3\n\t\tbc3 = t<<21 | t>>(64-21)\n\t\tt = a[24] ^ d4\n\t\tbc4 = t<<14 | t>>(64-14)\n\t\ta[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i]\n\t\ta[6] = bc1 ^ (bc3 &^ bc2)\n\t\ta[12] = bc2 ^ (bc4 &^ bc3)\n\t\ta[18] = bc3 ^ (bc0 &^ bc4)\n\t\ta[24] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[10] ^ d0\n\t\tbc2 = t<<3 | t>>(64-3)\n\t\tt = a[16] ^ d1\n\t\tbc3 = t<<45 | t>>(64-45)\n\t\tt = a[22] ^ d2\n\t\tbc4 = t<<61 | t>>(64-61)\n\t\tt = a[3] ^ d3\n\t\tbc0 = t<<28 | t>>(64-28)\n\t\tt = a[9] ^ d4\n\t\tbc1 = t<<20 | t>>(64-20)\n\t\ta[10] = bc0 ^ (bc2 &^ bc1)\n\t\ta[16] = bc1 ^ (bc3 &^ bc2)\n\t\ta[22] = bc2 ^ (bc4 &^ bc3)\n\t\ta[3] = bc3 ^ (bc0 &^ bc4)\n\t\ta[9] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[20] ^ d0\n\t\tbc4 = t<<18 | t>>(64-18)\n\t\tt = a[1] ^ d1\n\t\tbc0 = t<<1 | t>>(64-1)\n\t\tt = a[7] ^ d2\n\t\tbc1 = t<<6 | t>>(64-6)\n\t\tt = a[13] ^ d3\n\t\tbc2 = t<<25 | t>>(64-25)\n\t\tt = a[19] ^ d4\n\t\tbc3 = t<<8 | t>>(64-8)\n\t\ta[20] = bc0 ^ (bc2 &^ bc1)\n\t\ta[1] = bc1 ^ (bc3 &^ bc2)\n\t\ta[7] = bc2 ^ (bc4 &^ bc3)\n\t\ta[13] = bc3 ^ (bc0 &^ bc4)\n\t\ta[19] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[5] ^ d0\n\t\tbc1 = t<<36 | t>>(64-36)\n\t\tt = a[11] ^ d1\n\t\tbc2 = t<<10 | t>>(64-10)\n\t\tt = a[17] ^ d2\n\t\tbc3 = t<<15 | t>>(64-15)\n\t\tt = a[23] ^ d3\n\t\tbc4 = t<<56 | t>>(64-56)\n\t\tt = a[4] ^ d4\n\t\tbc0 = t<<27 | t>>(64-27)\n\t\ta[5] = bc0 ^ (bc2 &^ bc1)\n\t\ta[11] = bc1 ^ (bc3 &^ bc2)\n\t\ta[17] = bc2 ^ (bc4 &^ bc3)\n\t\ta[23] = bc3 ^ (bc0 &^ bc4)\n\t\ta[4] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[15] ^ d0\n\t\tbc3 = t<<41 | t>>(64-41)\n\t\tt = a[21] ^ d1\n\t\tbc4 = t<<2 | t>>(64-2)\n\t\tt = a[2] ^ d2\n\t\tbc0 = t<<62 | t>>(64-62)\n\t\tt = a[8] ^ d3\n\t\tbc1 = t<<55 | t>>(64-55)\n\t\tt = a[14] ^ d4\n\t\tbc2 = t<<39 | t>>(64-39)\n\t\ta[15] = bc0 ^ (bc2 &^ bc1)\n\t\ta[21] = bc1 ^ (bc3 &^ bc2)\n\t\ta[2] = bc2 ^ (bc4 &^ bc3)\n\t\ta[8] = bc3 ^ (bc0 &^ bc4)\n\t\ta[14] = bc4 ^ (bc1 &^ bc0)\n\n\t\t// Round 2\n\t\tbc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]\n\t\tbc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]\n\t\tbc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]\n\t\tbc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]\n\t\tbc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]\n\t\td0 = bc4 ^ (bc1<<1 | bc1>>63)\n\t\td1 = bc0 ^ (bc2<<1 | bc2>>63)\n\t\td2 = bc1 ^ (bc3<<1 | bc3>>63)\n\t\td3 = bc2 ^ (bc4<<1 | bc4>>63)\n\t\td4 = bc3 ^ (bc0<<1 | bc0>>63)\n\n\t\tbc0 = a[0] ^ d0\n\t\tt = a[16] ^ d1\n\t\tbc1 = t<<44 | t>>(64-44)\n\t\tt = a[7] ^ d2\n\t\tbc2 = t<<43 | t>>(64-43)\n\t\tt = a[23] ^ d3\n\t\tbc3 = t<<21 | t>>(64-21)\n\t\tt = a[14] ^ d4\n\t\tbc4 = t<<14 | t>>(64-14)\n\t\ta[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1]\n\t\ta[16] = bc1 ^ (bc3 &^ bc2)\n\t\ta[7] = bc2 ^ (bc4 &^ bc3)\n\t\ta[23] = bc3 ^ (bc0 &^ bc4)\n\t\ta[14] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[20] ^ d0\n\t\tbc2 = t<<3 | t>>(64-3)\n\t\tt = a[11] ^ d1\n\t\tbc3 = t<<45 | t>>(64-45)\n\t\tt = a[2] ^ d2\n\t\tbc4 = t<<61 | t>>(64-61)\n\t\tt = a[18] ^ d3\n\t\tbc0 = t<<28 | t>>(64-28)\n\t\tt = a[9] ^ d4\n\t\tbc1 = t<<20 | t>>(64-20)\n\t\ta[20] = bc0 ^ (bc2 &^ bc1)\n\t\ta[11] = bc1 ^ (bc3 &^ bc2)\n\t\ta[2] = bc2 ^ (bc4 &^ bc3)\n\t\ta[18] = bc3 ^ (bc0 &^ bc4)\n\t\ta[9] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[15] ^ d0\n\t\tbc4 = t<<18 | t>>(64-18)\n\t\tt = a[6] ^ d1\n\t\tbc0 = t<<1 | t>>(64-1)\n\t\tt = a[22] ^ d2\n\t\tbc1 = t<<6 | t>>(64-6)\n\t\tt = a[13] ^ d3\n\t\tbc2 = t<<25 | t>>(64-25)\n\t\tt = a[4] ^ d4\n\t\tbc3 = t<<8 | t>>(64-8)\n\t\ta[15] = bc0 ^ (bc2 &^ bc1)\n\t\ta[6] = bc1 ^ (bc3 &^ bc2)\n\t\ta[22] = bc2 ^ (bc4 &^ bc3)\n\t\ta[13] = bc3 ^ (bc0 &^ bc4)\n\t\ta[4] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[10] ^ d0\n\t\tbc1 = t<<36 | t>>(64-36)\n\t\tt = a[1] ^ d1\n\t\tbc2 = t<<10 | t>>(64-10)\n\t\tt = a[17] ^ d2\n\t\tbc3 = t<<15 | t>>(64-15)\n\t\tt = a[8] ^ d3\n\t\tbc4 = t<<56 | t>>(64-56)\n\t\tt = a[24] ^ d4\n\t\tbc0 = t<<27 | t>>(64-27)\n\t\ta[10] = bc0 ^ (bc2 &^ bc1)\n\t\ta[1] = bc1 ^ (bc3 &^ bc2)\n\t\ta[17] = bc2 ^ (bc4 &^ bc3)\n\t\ta[8] = bc3 ^ (bc0 &^ bc4)\n\t\ta[24] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[5] ^ d0\n\t\tbc3 = t<<41 | t>>(64-41)\n\t\tt = a[21] ^ d1\n\t\tbc4 = t<<2 | t>>(64-2)\n\t\tt = a[12] ^ d2\n\t\tbc0 = t<<62 | t>>(64-62)\n\t\tt = a[3] ^ d3\n\t\tbc1 = t<<55 | t>>(64-55)\n\t\tt = a[19] ^ d4\n\t\tbc2 = t<<39 | t>>(64-39)\n\t\ta[5] = bc0 ^ (bc2 &^ bc1)\n\t\ta[21] = bc1 ^ (bc3 &^ bc2)\n\t\ta[12] = bc2 ^ (bc4 &^ bc3)\n\t\ta[3] = bc3 ^ (bc0 &^ bc4)\n\t\ta[19] = bc4 ^ (bc1 &^ bc0)\n\n\t\t// Round 3\n\t\tbc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]\n\t\tbc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]\n\t\tbc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]\n\t\tbc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]\n\t\tbc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]\n\t\td0 = bc4 ^ (bc1<<1 | bc1>>63)\n\t\td1 = bc0 ^ (bc2<<1 | bc2>>63)\n\t\td2 = bc1 ^ (bc3<<1 | bc3>>63)\n\t\td3 = bc2 ^ (bc4<<1 | bc4>>63)\n\t\td4 = bc3 ^ (bc0<<1 | bc0>>63)\n\n\t\tbc0 = a[0] ^ d0\n\t\tt = a[11] ^ d1\n\t\tbc1 = t<<44 | t>>(64-44)\n\t\tt = a[22] ^ d2\n\t\tbc2 = t<<43 | t>>(64-43)\n\t\tt = a[8] ^ d3\n\t\tbc3 = t<<21 | t>>(64-21)\n\t\tt = a[19] ^ d4\n\t\tbc4 = t<<14 | t>>(64-14)\n\t\ta[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2]\n\t\ta[11] = bc1 ^ (bc3 &^ bc2)\n\t\ta[22] = bc2 ^ (bc4 &^ bc3)\n\t\ta[8] = bc3 ^ (bc0 &^ bc4)\n\t\ta[19] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[15] ^ d0\n\t\tbc2 = t<<3 | t>>(64-3)\n\t\tt = a[1] ^ d1\n\t\tbc3 = t<<45 | t>>(64-45)\n\t\tt = a[12] ^ d2\n\t\tbc4 = t<<61 | t>>(64-61)\n\t\tt = a[23] ^ d3\n\t\tbc0 = t<<28 | t>>(64-28)\n\t\tt = a[9] ^ d4\n\t\tbc1 = t<<20 | t>>(64-20)\n\t\ta[15] = bc0 ^ (bc2 &^ bc1)\n\t\ta[1] = bc1 ^ (bc3 &^ bc2)\n\t\ta[12] = bc2 ^ (bc4 &^ bc3)\n\t\ta[23] = bc3 ^ (bc0 &^ bc4)\n\t\ta[9] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[5] ^ d0\n\t\tbc4 = t<<18 | t>>(64-18)\n\t\tt = a[16] ^ d1\n\t\tbc0 = t<<1 | t>>(64-1)\n\t\tt = a[2] ^ d2\n\t\tbc1 = t<<6 | t>>(64-6)\n\t\tt = a[13] ^ d3\n\t\tbc2 = t<<25 | t>>(64-25)\n\t\tt = a[24] ^ d4\n\t\tbc3 = t<<8 | t>>(64-8)\n\t\ta[5] = bc0 ^ (bc2 &^ bc1)\n\t\ta[16] = bc1 ^ (bc3 &^ bc2)\n\t\ta[2] = bc2 ^ (bc4 &^ bc3)\n\t\ta[13] = bc3 ^ (bc0 &^ bc4)\n\t\ta[24] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[20] ^ d0\n\t\tbc1 = t<<36 | t>>(64-36)\n\t\tt = a[6] ^ d1\n\t\tbc2 = t<<10 | t>>(64-10)\n\t\tt = a[17] ^ d2\n\t\tbc3 = t<<15 | t>>(64-15)\n\t\tt = a[3] ^ d3\n\t\tbc4 = t<<56 | t>>(64-56)\n\t\tt = a[14] ^ d4\n\t\tbc0 = t<<27 | t>>(64-27)\n\t\ta[20] = bc0 ^ (bc2 &^ bc1)\n\t\ta[6] = bc1 ^ (bc3 &^ bc2)\n\t\ta[17] = bc2 ^ (bc4 &^ bc3)\n\t\ta[3] = bc3 ^ (bc0 &^ bc4)\n\t\ta[14] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[10] ^ d0\n\t\tbc3 = t<<41 | t>>(64-41)\n\t\tt = a[21] ^ d1\n\t\tbc4 = t<<2 | t>>(64-2)\n\t\tt = a[7] ^ d2\n\t\tbc0 = t<<62 | t>>(64-62)\n\t\tt = a[18] ^ d3\n\t\tbc1 = t<<55 | t>>(64-55)\n\t\tt = a[4] ^ d4\n\t\tbc2 = t<<39 | t>>(64-39)\n\t\ta[10] = bc0 ^ (bc2 &^ bc1)\n\t\ta[21] = bc1 ^ (bc3 &^ bc2)\n\t\ta[7] = bc2 ^ (bc4 &^ bc3)\n\t\ta[18] = bc3 ^ (bc0 &^ bc4)\n\t\ta[4] = bc4 ^ (bc1 &^ bc0)\n\n\t\t// Round 4\n\t\tbc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20]\n\t\tbc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21]\n\t\tbc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22]\n\t\tbc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23]\n\t\tbc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24]\n\t\td0 = bc4 ^ (bc1<<1 | bc1>>63)\n\t\td1 = bc0 ^ (bc2<<1 | bc2>>63)\n\t\td2 = bc1 ^ (bc3<<1 | bc3>>63)\n\t\td3 = bc2 ^ (bc4<<1 | bc4>>63)\n\t\td4 = bc3 ^ (bc0<<1 | bc0>>63)\n\n\t\tbc0 = a[0] ^ d0\n\t\tt = a[1] ^ d1\n\t\tbc1 = t<<44 | t>>(64-44)\n\t\tt = a[2] ^ d2\n\t\tbc2 = t<<43 | t>>(64-43)\n\t\tt = a[3] ^ d3\n\t\tbc3 = t<<21 | t>>(64-21)\n\t\tt = a[4] ^ d4\n\t\tbc4 = t<<14 | t>>(64-14)\n\t\ta[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3]\n\t\ta[1] = bc1 ^ (bc3 &^ bc2)\n\t\ta[2] = bc2 ^ (bc4 &^ bc3)\n\t\ta[3] = bc3 ^ (bc0 &^ bc4)\n\t\ta[4] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[5] ^ d0\n\t\tbc2 = t<<3 | t>>(64-3)\n\t\tt = a[6] ^ d1\n\t\tbc3 = t<<45 | t>>(64-45)\n\t\tt = a[7] ^ d2\n\t\tbc4 = t<<61 | t>>(64-61)\n\t\tt = a[8] ^ d3\n\t\tbc0 = t<<28 | t>>(64-28)\n\t\tt = a[9] ^ d4\n\t\tbc1 = t<<20 | t>>(64-20)\n\t\ta[5] = bc0 ^ (bc2 &^ bc1)\n\t\ta[6] = bc1 ^ (bc3 &^ bc2)\n\t\ta[7] = bc2 ^ (bc4 &^ bc3)\n\t\ta[8] = bc3 ^ (bc0 &^ bc4)\n\t\ta[9] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[10] ^ d0\n\t\tbc4 = t<<18 | t>>(64-18)\n\t\tt = a[11] ^ d1\n\t\tbc0 = t<<1 | t>>(64-1)\n\t\tt = a[12] ^ d2\n\t\tbc1 = t<<6 | t>>(64-6)\n\t\tt = a[13] ^ d3\n\t\tbc2 = t<<25 | t>>(64-25)\n\t\tt = a[14] ^ d4\n\t\tbc3 = t<<8 | t>>(64-8)\n\t\ta[10] = bc0 ^ (bc2 &^ bc1)\n\t\ta[11] = bc1 ^ (bc3 &^ bc2)\n\t\ta[12] = bc2 ^ (bc4 &^ bc3)\n\t\ta[13] = bc3 ^ (bc0 &^ bc4)\n\t\ta[14] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[15] ^ d0\n\t\tbc1 = t<<36 | t>>(64-36)\n\t\tt = a[16] ^ d1\n\t\tbc2 = t<<10 | t>>(64-10)\n\t\tt = a[17] ^ d2\n\t\tbc3 = t<<15 | t>>(64-15)\n\t\tt = a[18] ^ d3\n\t\tbc4 = t<<56 | t>>(64-56)\n\t\tt = a[19] ^ d4\n\t\tbc0 = t<<27 | t>>(64-27)\n\t\ta[15] = bc0 ^ (bc2 &^ bc1)\n\t\ta[16] = bc1 ^ (bc3 &^ bc2)\n\t\ta[17] = bc2 ^ (bc4 &^ bc3)\n\t\ta[18] = bc3 ^ (bc0 &^ bc4)\n\t\ta[19] = bc4 ^ (bc1 &^ bc0)\n\n\t\tt = a[20] ^ d0\n\t\tbc3 = t<<41 | t>>(64-41)\n\t\tt = a[21] ^ d1\n\t\tbc4 = t<<2 | t>>(64-2)\n\t\tt = a[22] ^ d2\n\t\tbc0 = t<<62 | t>>(64-62)\n\t\tt = a[23] ^ d3\n\t\tbc1 = t<<55 | t>>(64-55)\n\t\tt = a[24] ^ d4\n\t\tbc2 = t<<39 | t>>(64-39)\n\t\ta[20] = bc0 ^ (bc2 &^ bc1)\n\t\ta[21] = bc1 ^ (bc3 &^ bc2)\n\t\ta[22] = bc2 ^ (bc4 &^ bc3)\n\t\ta[23] = bc3 ^ (bc0 &^ bc4)\n\t\ta[24] = bc4 ^ (bc1 &^ bc0)\n\t}\n}\n"
  },
  {
    "path": "crypto/sha3/keccakf_amd64.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,!appengine,!gccgo\n\npackage sha3\n\n// This function is implemented in keccakf_amd64.s.\n\n//go:noescape\n\nfunc keccakF1600(state *[25]uint64)\n"
  },
  {
    "path": "crypto/sha3/keccakf_amd64.s",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,!appengine,!gccgo\n\n// This code was translated into a form compatible with 6a from the public\n// domain sources at https://github.com/gvanas/KeccakCodePackage\n\n// Offsets in state\n#define _ba  (0*8)\n#define _be  (1*8)\n#define _bi  (2*8)\n#define _bo  (3*8)\n#define _bu  (4*8)\n#define _ga  (5*8)\n#define _ge  (6*8)\n#define _gi  (7*8)\n#define _go  (8*8)\n#define _gu  (9*8)\n#define _ka (10*8)\n#define _ke (11*8)\n#define _ki (12*8)\n#define _ko (13*8)\n#define _ku (14*8)\n#define _ma (15*8)\n#define _me (16*8)\n#define _mi (17*8)\n#define _mo (18*8)\n#define _mu (19*8)\n#define _sa (20*8)\n#define _se (21*8)\n#define _si (22*8)\n#define _so (23*8)\n#define _su (24*8)\n\n// Temporary registers\n#define rT1  AX\n\n// Round vars\n#define rpState DI\n#define rpStack SP\n\n#define rDa BX\n#define rDe CX\n#define rDi DX\n#define rDo R8\n#define rDu R9\n\n#define rBa R10\n#define rBe R11\n#define rBi R12\n#define rBo R13\n#define rBu R14\n\n#define rCa SI\n#define rCe BP\n#define rCi rBi\n#define rCo rBo\n#define rCu R15\n\n#define MOVQ_RBI_RCE MOVQ rBi, rCe\n#define XORQ_RT1_RCA XORQ rT1, rCa\n#define XORQ_RT1_RCE XORQ rT1, rCe\n#define XORQ_RBA_RCU XORQ rBa, rCu\n#define XORQ_RBE_RCU XORQ rBe, rCu\n#define XORQ_RDU_RCU XORQ rDu, rCu\n#define XORQ_RDA_RCA XORQ rDa, rCa\n#define XORQ_RDE_RCE XORQ rDe, rCe\n\n#define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \\\n\t/* Prepare round */    \\\n\tMOVQ rCe, rDa;         \\\n\tROLQ $1, rDa;          \\\n\t                       \\\n\tMOVQ _bi(iState), rCi; \\\n\tXORQ _gi(iState), rDi; \\\n\tXORQ rCu, rDa;         \\\n\tXORQ _ki(iState), rCi; \\\n\tXORQ _mi(iState), rDi; \\\n\tXORQ rDi, rCi;         \\\n\t                       \\\n\tMOVQ rCi, rDe;         \\\n\tROLQ $1, rDe;          \\\n\t                       \\\n\tMOVQ _bo(iState), rCo; \\\n\tXORQ _go(iState), rDo; \\\n\tXORQ rCa, rDe;         \\\n\tXORQ _ko(iState), rCo; \\\n\tXORQ _mo(iState), rDo; \\\n\tXORQ rDo, rCo;         \\\n\t                       \\\n\tMOVQ rCo, rDi;         \\\n\tROLQ $1, rDi;          \\\n\t                       \\\n\tMOVQ rCu, rDo;         \\\n\tXORQ rCe, rDi;         \\\n\tROLQ $1, rDo;          \\\n\t                       \\\n\tMOVQ rCa, rDu;         \\\n\tXORQ rCi, rDo;         \\\n\tROLQ $1, rDu;          \\\n\t                       \\\n\t/* Result b */         \\\n\tMOVQ _ba(iState), rBa; \\\n\tMOVQ _ge(iState), rBe; \\\n\tXORQ rCo, rDu;         \\\n\tMOVQ _ki(iState), rBi; \\\n\tMOVQ _mo(iState), rBo; \\\n\tMOVQ _su(iState), rBu; \\\n\tXORQ rDe, rBe;         \\\n\tROLQ $44, rBe;         \\\n\tXORQ rDi, rBi;         \\\n\tXORQ rDa, rBa;         \\\n\tROLQ $43, rBi;         \\\n\t                       \\\n\tMOVQ rBe, rCa;         \\\n\tMOVQ rc, rT1;          \\\n\tORQ  rBi, rCa;         \\\n\tXORQ rBa, rT1;         \\\n\tXORQ rT1, rCa;         \\\n\tMOVQ rCa, _ba(oState); \\\n\t                       \\\n\tXORQ rDu, rBu;         \\\n\tROLQ $14, rBu;         \\\n\tMOVQ rBa, rCu;         \\\n\tANDQ rBe, rCu;         \\\n\tXORQ rBu, rCu;         \\\n\tMOVQ rCu, _bu(oState); \\\n\t                       \\\n\tXORQ rDo, rBo;         \\\n\tROLQ $21, rBo;         \\\n\tMOVQ rBo, rT1;         \\\n\tANDQ rBu, rT1;         \\\n\tXORQ rBi, rT1;         \\\n\tMOVQ rT1, _bi(oState); \\\n\t                       \\\n\tNOTQ rBi;              \\\n\tORQ  rBa, rBu;         \\\n\tORQ  rBo, rBi;         \\\n\tXORQ rBo, rBu;         \\\n\tXORQ rBe, rBi;         \\\n\tMOVQ rBu, _bo(oState); \\\n\tMOVQ rBi, _be(oState); \\\n\tB_RBI_RCE;             \\\n\t                       \\\n\t/* Result g */         \\\n\tMOVQ _gu(iState), rBe; \\\n\tXORQ rDu, rBe;         \\\n\tMOVQ _ka(iState), rBi; \\\n\tROLQ $20, rBe;         \\\n\tXORQ rDa, rBi;         \\\n\tROLQ $3, rBi;          \\\n\tMOVQ _bo(iState), rBa; \\\n\tMOVQ rBe, rT1;         \\\n\tORQ  rBi, rT1;         \\\n\tXORQ rDo, rBa;         \\\n\tMOVQ _me(iState), rBo; \\\n\tMOVQ _si(iState), rBu; \\\n\tROLQ $28, rBa;         \\\n\tXORQ rBa, rT1;         \\\n\tMOVQ rT1, _ga(oState); \\\n\tG_RT1_RCA;             \\\n\t                       \\\n\tXORQ rDe, rBo;         \\\n\tROLQ $45, rBo;         \\\n\tMOVQ rBi, rT1;         \\\n\tANDQ rBo, rT1;         \\\n\tXORQ rBe, rT1;         \\\n\tMOVQ rT1, _ge(oState); \\\n\tG_RT1_RCE;             \\\n\t                       \\\n\tXORQ rDi, rBu;         \\\n\tROLQ $61, rBu;         \\\n\tMOVQ rBu, rT1;         \\\n\tORQ  rBa, rT1;         \\\n\tXORQ rBo, rT1;         \\\n\tMOVQ rT1, _go(oState); \\\n\t                       \\\n\tANDQ rBe, rBa;         \\\n\tXORQ rBu, rBa;         \\\n\tMOVQ rBa, _gu(oState); \\\n\tNOTQ rBu;              \\\n\tG_RBA_RCU;             \\\n\t                       \\\n\tORQ  rBu, rBo;         \\\n\tXORQ rBi, rBo;         \\\n\tMOVQ rBo, _gi(oState); \\\n\t                       \\\n\t/* Result k */         \\\n\tMOVQ _be(iState), rBa; \\\n\tMOVQ _gi(iState), rBe; \\\n\tMOVQ _ko(iState), rBi; \\\n\tMOVQ _mu(iState), rBo; \\\n\tMOVQ _sa(iState), rBu; \\\n\tXORQ rDi, rBe;         \\\n\tROLQ $6, rBe;          \\\n\tXORQ rDo, rBi;         \\\n\tROLQ $25, rBi;         \\\n\tMOVQ rBe, rT1;         \\\n\tORQ  rBi, rT1;         \\\n\tXORQ rDe, rBa;         \\\n\tROLQ $1, rBa;          \\\n\tXORQ rBa, rT1;         \\\n\tMOVQ rT1, _ka(oState); \\\n\tK_RT1_RCA;             \\\n\t                       \\\n\tXORQ rDu, rBo;         \\\n\tROLQ $8, rBo;          \\\n\tMOVQ rBi, rT1;         \\\n\tANDQ rBo, rT1;         \\\n\tXORQ rBe, rT1;         \\\n\tMOVQ rT1, _ke(oState); \\\n\tK_RT1_RCE;             \\\n\t                       \\\n\tXORQ rDa, rBu;         \\\n\tROLQ $18, rBu;         \\\n\tNOTQ rBo;              \\\n\tMOVQ rBo, rT1;         \\\n\tANDQ rBu, rT1;         \\\n\tXORQ rBi, rT1;         \\\n\tMOVQ rT1, _ki(oState); \\\n\t                       \\\n\tMOVQ rBu, rT1;         \\\n\tORQ  rBa, rT1;         \\\n\tXORQ rBo, rT1;         \\\n\tMOVQ rT1, _ko(oState); \\\n\t                       \\\n\tANDQ rBe, rBa;         \\\n\tXORQ rBu, rBa;         \\\n\tMOVQ rBa, _ku(oState); \\\n\tK_RBA_RCU;             \\\n\t                       \\\n\t/* Result m */         \\\n\tMOVQ _ga(iState), rBe; \\\n\tXORQ rDa, rBe;         \\\n\tMOVQ _ke(iState), rBi; \\\n\tROLQ $36, rBe;         \\\n\tXORQ rDe, rBi;         \\\n\tMOVQ _bu(iState), rBa; \\\n\tROLQ $10, rBi;         \\\n\tMOVQ rBe, rT1;         \\\n\tMOVQ _mi(iState), rBo; \\\n\tANDQ rBi, rT1;         \\\n\tXORQ rDu, rBa;         \\\n\tMOVQ _so(iState), rBu; \\\n\tROLQ $27, rBa;         \\\n\tXORQ rBa, rT1;         \\\n\tMOVQ rT1, _ma(oState); \\\n\tM_RT1_RCA;             \\\n\t                       \\\n\tXORQ rDi, rBo;         \\\n\tROLQ $15, rBo;         \\\n\tMOVQ rBi, rT1;         \\\n\tORQ  rBo, rT1;         \\\n\tXORQ rBe, rT1;         \\\n\tMOVQ rT1, _me(oState); \\\n\tM_RT1_RCE;             \\\n\t                       \\\n\tXORQ rDo, rBu;         \\\n\tROLQ $56, rBu;         \\\n\tNOTQ rBo;              \\\n\tMOVQ rBo, rT1;         \\\n\tORQ  rBu, rT1;         \\\n\tXORQ rBi, rT1;         \\\n\tMOVQ rT1, _mi(oState); \\\n\t                       \\\n\tORQ  rBa, rBe;         \\\n\tXORQ rBu, rBe;         \\\n\tMOVQ rBe, _mu(oState); \\\n\t                       \\\n\tANDQ rBa, rBu;         \\\n\tXORQ rBo, rBu;         \\\n\tMOVQ rBu, _mo(oState); \\\n\tM_RBE_RCU;             \\\n\t                       \\\n\t/* Result s */         \\\n\tMOVQ _bi(iState), rBa; \\\n\tMOVQ _go(iState), rBe; \\\n\tMOVQ _ku(iState), rBi; \\\n\tXORQ rDi, rBa;         \\\n\tMOVQ _ma(iState), rBo; \\\n\tROLQ $62, rBa;         \\\n\tXORQ rDo, rBe;         \\\n\tMOVQ _se(iState), rBu; \\\n\tROLQ $55, rBe;         \\\n\t                       \\\n\tXORQ rDu, rBi;         \\\n\tMOVQ rBa, rDu;         \\\n\tXORQ rDe, rBu;         \\\n\tROLQ $2, rBu;          \\\n\tANDQ rBe, rDu;         \\\n\tXORQ rBu, rDu;         \\\n\tMOVQ rDu, _su(oState); \\\n\t                       \\\n\tROLQ $39, rBi;         \\\n\tS_RDU_RCU;             \\\n\tNOTQ rBe;              \\\n\tXORQ rDa, rBo;         \\\n\tMOVQ rBe, rDa;         \\\n\tANDQ rBi, rDa;         \\\n\tXORQ rBa, rDa;         \\\n\tMOVQ rDa, _sa(oState); \\\n\tS_RDA_RCA;             \\\n\t                       \\\n\tROLQ $41, rBo;         \\\n\tMOVQ rBi, rDe;         \\\n\tORQ  rBo, rDe;         \\\n\tXORQ rBe, rDe;         \\\n\tMOVQ rDe, _se(oState); \\\n\tS_RDE_RCE;             \\\n\t                       \\\n\tMOVQ rBo, rDi;         \\\n\tMOVQ rBu, rDo;         \\\n\tANDQ rBu, rDi;         \\\n\tORQ  rBa, rDo;         \\\n\tXORQ rBi, rDi;         \\\n\tXORQ rBo, rDo;         \\\n\tMOVQ rDi, _si(oState); \\\n\tMOVQ rDo, _so(oState)  \\\n\n// func keccakF1600(state *[25]uint64)\nTEXT ·keccakF1600(SB), 0, $200-8\n\tMOVQ state+0(FP), rpState\n\n\t// Convert the user state into an internal state\n\tNOTQ _be(rpState)\n\tNOTQ _bi(rpState)\n\tNOTQ _go(rpState)\n\tNOTQ _ki(rpState)\n\tNOTQ _mi(rpState)\n\tNOTQ _sa(rpState)\n\n\t// Execute the KeccakF permutation\n\tMOVQ _ba(rpState), rCa\n\tMOVQ _be(rpState), rCe\n\tMOVQ _bu(rpState), rCu\n\n\tXORQ _ga(rpState), rCa\n\tXORQ _ge(rpState), rCe\n\tXORQ _gu(rpState), rCu\n\n\tXORQ _ka(rpState), rCa\n\tXORQ _ke(rpState), rCe\n\tXORQ _ku(rpState), rCu\n\n\tXORQ _ma(rpState), rCa\n\tXORQ _me(rpState), rCe\n\tXORQ _mu(rpState), rCu\n\n\tXORQ _sa(rpState), rCa\n\tXORQ _se(rpState), rCe\n\tMOVQ _si(rpState), rDi\n\tMOVQ _so(rpState), rDo\n\tXORQ _su(rpState), rCu\n\n\tmKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)\n\tmKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP)\n\n\t// Revert the internal state to the user state\n\tNOTQ _be(rpState)\n\tNOTQ _bi(rpState)\n\tNOTQ _go(rpState)\n\tNOTQ _ki(rpState)\n\tNOTQ _mi(rpState)\n\tNOTQ _sa(rpState)\n\n\tRET\n"
  },
  {
    "path": "crypto/sha3/register.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build go1.4\n\npackage sha3\n\nimport (\n\t\"crypto\"\n)\n\nfunc init() {\n\tcrypto.RegisterHash(crypto.SHA3_224, New224)\n\tcrypto.RegisterHash(crypto.SHA3_256, New256)\n\tcrypto.RegisterHash(crypto.SHA3_384, New384)\n\tcrypto.RegisterHash(crypto.SHA3_512, New512)\n}\n"
  },
  {
    "path": "crypto/sha3/sha3.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage sha3\n\n// spongeDirection indicates the direction bytes are flowing through the sponge.\ntype spongeDirection int\n\nconst (\n\t// spongeAbsorbing indicates that the sponge is absorbing input.\n\tspongeAbsorbing spongeDirection = iota\n\t// spongeSqueezing indicates that the sponge is being squeezed.\n\tspongeSqueezing\n)\n\nconst (\n\t// maxRate is the maximum size of the internal buffer. SHAKE-256\n\t// currently needs the largest buffer.\n\tmaxRate = 168\n)\n\ntype state struct {\n\t// Generic sponge components.\n\ta    [25]uint64 // main state of the hash\n\tbuf  []byte     // points into storage\n\trate int        // the number of bytes of state to use\n\n\t// dsbyte contains the \"domain separation\" bits and the first bit of\n\t// the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the\n\t// SHA-3 and SHAKE functions by appending bitstrings to the message.\n\t// Using a little-endian bit-ordering convention, these are \"01\" for SHA-3\n\t// and \"1111\" for SHAKE, or 00000010b and 00001111b, respectively. Then the\n\t// padding rule from section 5.1 is applied to pad the message to a multiple\n\t// of the rate, which involves adding a \"1\" bit, zero or more \"0\" bits, and\n\t// a final \"1\" bit. We merge the first \"1\" bit from the padding into dsbyte,\n\t// giving 00000110b (0x06) and 00011111b (0x1f).\n\t// [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf\n\t//     \"Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and\n\t//      Extendable-Output Functions (May 2014)\"\n\tdsbyte  byte\n\tstorage [maxRate]byte\n\n\t// Specific to SHA-3 and SHAKE.\n\toutputLen int             // the default output size in bytes\n\tstate     spongeDirection // whether the sponge is absorbing or squeezing\n}\n\n// BlockSize returns the rate of sponge underlying this hash function.\nfunc (d *state) BlockSize() int { return d.rate }\n\n// Size returns the output size of the hash function in bytes.\nfunc (d *state) Size() int { return d.outputLen }\n\n// Reset clears the internal state by zeroing the sponge state and\n// the byte buffer, and setting Sponge.state to absorbing.\nfunc (d *state) Reset() {\n\t// Zero the permutation's state.\n\tfor i := range d.a {\n\t\td.a[i] = 0\n\t}\n\td.state = spongeAbsorbing\n\td.buf = d.storage[:0]\n}\n\nfunc (d *state) clone() *state {\n\tret := *d\n\tif ret.state == spongeAbsorbing {\n\t\tret.buf = ret.storage[:len(ret.buf)]\n\t} else {\n\t\tret.buf = ret.storage[d.rate-cap(d.buf) : d.rate]\n\t}\n\n\treturn &ret\n}\n\n// permute applies the KeccakF-1600 permutation. It handles\n// any input-output buffering.\nfunc (d *state) permute() {\n\tswitch d.state {\n\tcase spongeAbsorbing:\n\t\t// If we're absorbing, we need to xor the input into the state\n\t\t// before applying the permutation.\n\t\txorIn(d, d.buf)\n\t\td.buf = d.storage[:0]\n\t\tkeccakF1600(&d.a)\n\tcase spongeSqueezing:\n\t\t// If we're squeezing, we need to apply the permutatin before\n\t\t// copying more output.\n\t\tkeccakF1600(&d.a)\n\t\td.buf = d.storage[:d.rate]\n\t\tcopyOut(d, d.buf)\n\t}\n}\n\n// pads appends the domain separation bits in dsbyte, applies\n// the multi-bitrate 10..1 padding rule, and permutes the state.\nfunc (d *state) padAndPermute(dsbyte byte) {\n\tif d.buf == nil {\n\t\td.buf = d.storage[:0]\n\t}\n\t// Pad with this instance's domain-separator bits. We know that there's\n\t// at least one byte of space in d.buf because, if it were full,\n\t// permute would have been called to empty it. dsbyte also contains the\n\t// first one bit for the padding. See the comment in the state struct.\n\td.buf = append(d.buf, dsbyte)\n\tzerosStart := len(d.buf)\n\td.buf = d.storage[:d.rate]\n\tfor i := zerosStart; i < d.rate; i++ {\n\t\td.buf[i] = 0\n\t}\n\t// This adds the final one bit for the padding. Because of the way that\n\t// bits are numbered from the LSB upwards, the final bit is the MSB of\n\t// the last byte.\n\td.buf[d.rate-1] ^= 0x80\n\t// Apply the permutation\n\td.permute()\n\td.state = spongeSqueezing\n\td.buf = d.storage[:d.rate]\n\tcopyOut(d, d.buf)\n}\n\n// Write absorbs more data into the hash's state. It produces an error\n// if more data is written to the ShakeHash after writing\nfunc (d *state) Write(p []byte) (written int, err error) {\n\tif d.state != spongeAbsorbing {\n\t\tpanic(\"sha3: write to sponge after read\")\n\t}\n\tif d.buf == nil {\n\t\td.buf = d.storage[:0]\n\t}\n\twritten = len(p)\n\n\tfor len(p) > 0 {\n\t\tif len(d.buf) == 0 && len(p) >= d.rate {\n\t\t\t// The fast path; absorb a full \"rate\" bytes of input and apply the permutation.\n\t\t\txorIn(d, p[:d.rate])\n\t\t\tp = p[d.rate:]\n\t\t\tkeccakF1600(&d.a)\n\t\t} else {\n\t\t\t// The slow path; buffer the input until we can fill the sponge, and then xor it in.\n\t\t\ttodo := d.rate - len(d.buf)\n\t\t\tif todo > len(p) {\n\t\t\t\ttodo = len(p)\n\t\t\t}\n\t\t\td.buf = append(d.buf, p[:todo]...)\n\t\t\tp = p[todo:]\n\n\t\t\t// If the sponge is full, apply the permutation.\n\t\t\tif len(d.buf) == d.rate {\n\t\t\t\td.permute()\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\n// Read squeezes an arbitrary number of bytes from the sponge.\nfunc (d *state) Read(out []byte) (n int, err error) {\n\t// If we're still absorbing, pad and apply the permutation.\n\tif d.state == spongeAbsorbing {\n\t\td.padAndPermute(d.dsbyte)\n\t}\n\n\tn = len(out)\n\n\t// Now, do the squeezing.\n\tfor len(out) > 0 {\n\t\tn := copy(out, d.buf)\n\t\td.buf = d.buf[n:]\n\t\tout = out[n:]\n\n\t\t// Apply the permutation if we've squeezed the sponge dry.\n\t\tif len(d.buf) == 0 {\n\t\t\td.permute()\n\t\t}\n\t}\n\n\treturn\n}\n\n// Sum applies padding to the hash state and then squeezes out the desired\n// number of output bytes.\nfunc (d *state) Sum(in []byte) []byte {\n\t// Make a copy of the original hash so that caller can keep writing\n\t// and summing.\n\tdup := d.clone()\n\thash := make([]byte, dup.outputLen)\n\tdup.Read(hash)\n\treturn append(in, hash...)\n}\n"
  },
  {
    "path": "crypto/sha3/shake.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage sha3\n\n// This file defines the ShakeHash interface, and provides\n// functions for creating SHAKE instances, as well as utility\n// functions for hashing bytes to arbitrary-length output.\n\nimport (\n\t\"io\"\n)\n\n// ShakeHash defines the interface to hash functions that\n// support arbitrary-length output.\ntype ShakeHash interface {\n\t// Write absorbs more data into the hash's state. It panics if input is\n\t// written to it after output has been read from it.\n\tio.Writer\n\n\t// Read reads more output from the hash; reading affects the hash's\n\t// state. (ShakeHash.Read is thus very different from Hash.Sum)\n\t// It never returns an error.\n\tio.Reader\n\n\t// Clone returns a copy of the ShakeHash in its current state.\n\tClone() ShakeHash\n\n\t// Reset resets the ShakeHash to its initial state.\n\tReset()\n}\n\nfunc (d *state) Clone() ShakeHash {\n\treturn d.clone()\n}\n\n// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash.\n// Its generic security strength is 128 bits against all attacks if at\n// least 32 bytes of its output are used.\nfunc NewShake128() ShakeHash { return &state{rate: 168, dsbyte: 0x1f} }\n\n// NewShake256 creates a new SHAKE128 variable-output-length ShakeHash.\n// Its generic security strength is 256 bits against all attacks if\n// at least 64 bytes of its output are used.\nfunc NewShake256() ShakeHash { return &state{rate: 136, dsbyte: 0x1f} }\n\n// ShakeSum128 writes an arbitrary-length digest of data into hash.\nfunc ShakeSum128(hash, data []byte) {\n\th := NewShake128()\n\th.Write(data)\n\th.Read(hash)\n}\n\n// ShakeSum256 writes an arbitrary-length digest of data into hash.\nfunc ShakeSum256(hash, data []byte) {\n\th := NewShake256()\n\th.Write(data)\n\th.Read(hash)\n}\n"
  },
  {
    "path": "crypto/sha3/xor.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !amd64,!386,!ppc64le appengine\n\npackage sha3\n\nvar (\n\txorIn            = xorInGeneric\n\tcopyOut          = copyOutGeneric\n\txorInUnaligned   = xorInGeneric\n\tcopyOutUnaligned = copyOutGeneric\n)\n\nconst xorImplementationUnaligned = \"generic\"\n"
  },
  {
    "path": "crypto/sha3/xor_generic.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage sha3\n\nimport \"encoding/binary\"\n\n// xorInGeneric xors the bytes in buf into the state; it\n// makes no non-portable assumptions about memory layout\n// or alignment.\nfunc xorInGeneric(d *state, buf []byte) {\n\tn := len(buf) / 8\n\n\tfor i := 0; i < n; i++ {\n\t\ta := binary.LittleEndian.Uint64(buf)\n\t\td.a[i] ^= a\n\t\tbuf = buf[8:]\n\t}\n}\n\n// copyOutGeneric copies ulint64s to a byte buffer.\nfunc copyOutGeneric(d *state, b []byte) {\n\tfor i := 0; len(b) >= 8; i++ {\n\t\tbinary.LittleEndian.PutUint64(b, d.a[i])\n\t\tb = b[8:]\n\t}\n}\n"
  },
  {
    "path": "crypto/sha3/xor_unaligned.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64 386 ppc64le\n// +build !appengine\n\npackage sha3\n\nimport \"unsafe\"\n\nfunc xorInUnaligned(d *state, buf []byte) {\n\tbw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))\n\tn := len(buf)\n\tif n >= 72 {\n\t\td.a[0] ^= bw[0]\n\t\td.a[1] ^= bw[1]\n\t\td.a[2] ^= bw[2]\n\t\td.a[3] ^= bw[3]\n\t\td.a[4] ^= bw[4]\n\t\td.a[5] ^= bw[5]\n\t\td.a[6] ^= bw[6]\n\t\td.a[7] ^= bw[7]\n\t\td.a[8] ^= bw[8]\n\t}\n\tif n >= 104 {\n\t\td.a[9] ^= bw[9]\n\t\td.a[10] ^= bw[10]\n\t\td.a[11] ^= bw[11]\n\t\td.a[12] ^= bw[12]\n\t}\n\tif n >= 136 {\n\t\td.a[13] ^= bw[13]\n\t\td.a[14] ^= bw[14]\n\t\td.a[15] ^= bw[15]\n\t\td.a[16] ^= bw[16]\n\t}\n\tif n >= 144 {\n\t\td.a[17] ^= bw[17]\n\t}\n\tif n >= 168 {\n\t\td.a[18] ^= bw[18]\n\t\td.a[19] ^= bw[19]\n\t\td.a[20] ^= bw[20]\n\t}\n}\n\nfunc copyOutUnaligned(d *state, buf []byte) {\n\tab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0]))\n\tcopy(buf, ab[:])\n}\n\nvar (\n\txorIn   = xorInUnaligned\n\tcopyOut = copyOutUnaligned\n)\n"
  },
  {
    "path": "crypto/signature_cgo.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build !nacl,!js,!nocgo\n\npackage crypto\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/crypto/secp256k1\"\n)\n\n// Ecrecover returns the uncompressed public key that created the given signature.\nfunc Ecrecover(hash, sig []byte) ([]byte, error) {\n\treturn secp256k1.RecoverPubkey(hash, sig)\n}\n\n// SigToPub returns the public key that created the given signature.\nfunc SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) {\n\ts, err := Ecrecover(hash, sig)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tx, y := elliptic.Unmarshal(S256(), s)\n\treturn &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}, nil\n}\n\n// Sign calculates an ECDSA signature.\n//\n// This function is susceptible to chosen plaintext attacks that can leak\n// information about the private key that is used for signing. Callers must\n// be aware that the given hash cannot be chosen by an adversery. Common\n// solution is to hash any input before calculating the signature.\n//\n// The produced signature is in the [R || S || V] format where V is 0 or 1.\nfunc Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) {\n\tif len(hash) != 32 {\n\t\treturn nil, fmt.Errorf(\"hash is required to be exactly 32 bytes (%d)\", len(hash))\n\t}\n\tseckey := math.PaddedBigBytes(prv.D, prv.Params().BitSize/8)\n\tdefer zeroBytes(seckey)\n\treturn secp256k1.Sign(hash, seckey)\n}\n\n// VerifySignature checks that the given public key created signature over hash.\n// The public key should be in compressed (33 bytes) or uncompressed (65 bytes) format.\n// The signature should have the 64 byte [R || S] format.\nfunc VerifySignature(pubkey, hash, signature []byte) bool {\n\treturn secp256k1.VerifySignature(pubkey, hash, signature)\n}\n\n// DecompressPubkey parses a public key in the 33-byte compressed format.\nfunc DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {\n\tx, y := secp256k1.DecompressPubkey(pubkey)\n\tif x == nil {\n\t\treturn nil, fmt.Errorf(\"invalid public key\")\n\t}\n\treturn &ecdsa.PublicKey{X: x, Y: y, Curve: S256()}, nil\n}\n\n// CompressPubkey encodes a public key to the 33-byte compressed format.\nfunc CompressPubkey(pubkey *ecdsa.PublicKey) []byte {\n\treturn secp256k1.CompressPubkey(pubkey.X, pubkey.Y)\n}\n\n// S256 returns an instance of the secp256k1 curve.\nfunc S256() elliptic.Curve {\n\treturn secp256k1.S256()\n}\n"
  },
  {
    "path": "crypto/signature_nocgo.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build nacl js nocgo\n\npackage crypto\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/btcsuite/btcd/btcec\"\n)\n\n// Ecrecover returns the uncompressed public key that created the given signature.\nfunc Ecrecover(hash, sig []byte) ([]byte, error) {\n\tpub, err := SigToPub(hash, sig)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tbytes := (*btcec.PublicKey)(pub).SerializeUncompressed()\n\treturn bytes, err\n}\n\n// SigToPub returns the public key that created the given signature.\nfunc SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) {\n\t// Convert to btcec input format with 'recovery id' v at the beginning.\n\tbtcsig := make([]byte, 65)\n\tbtcsig[0] = sig[64] + 27\n\tcopy(btcsig[1:], sig)\n\n\tpub, _, err := btcec.RecoverCompact(btcec.S256(), btcsig, hash)\n\treturn (*ecdsa.PublicKey)(pub), err\n}\n\n// Sign calculates an ECDSA signature.\n//\n// This function is susceptible to chosen plaintext attacks that can leak\n// information about the private key that is used for signing. Callers must\n// be aware that the given hash cannot be chosen by an adversery. Common\n// solution is to hash any input before calculating the signature.\n//\n// The produced signature is in the [R || S || V] format where V is 0 or 1.\nfunc Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) {\n\tif len(hash) != 32 {\n\t\treturn nil, fmt.Errorf(\"hash is required to be exactly 32 bytes (%d)\", len(hash))\n\t}\n\tif prv.Curve != btcec.S256() {\n\t\treturn nil, fmt.Errorf(\"private key curve is not secp256k1\")\n\t}\n\tsig, err := btcec.SignCompact(btcec.S256(), (*btcec.PrivateKey)(prv), hash, false)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Convert to Ethereum signature format with 'recovery id' v at the end.\n\tv := sig[0] - 27\n\tcopy(sig, sig[1:])\n\tsig[64] = v\n\treturn sig, nil\n}\n\n// VerifySignature checks that the given public key created signature over hash.\n// The public key should be in compressed (33 bytes) or uncompressed (65 bytes) format.\n// The signature should have the 64 byte [R || S] format.\nfunc VerifySignature(pubkey, hash, signature []byte) bool {\n\tif len(signature) != 64 {\n\t\treturn false\n\t}\n\tsig := &btcec.Signature{R: new(big.Int).SetBytes(signature[:32]), S: new(big.Int).SetBytes(signature[32:])}\n\tkey, err := btcec.ParsePubKey(pubkey, btcec.S256())\n\tif err != nil {\n\t\treturn false\n\t}\n\t// Reject malleable signatures. libsecp256k1 does this check but btcec doesn't.\n\tif sig.S.Cmp(secp256k1halfN) > 0 {\n\t\treturn false\n\t}\n\treturn sig.Verify(hash, key)\n}\n\n// DecompressPubkey parses a public key in the 33-byte compressed format.\nfunc DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {\n\tif len(pubkey) != 33 {\n\t\treturn nil, errors.New(\"invalid compressed public key length\")\n\t}\n\tkey, err := btcec.ParsePubKey(pubkey, btcec.S256())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn key.ToECDSA(), nil\n}\n\n// CompressPubkey encodes a public key to the 33-byte compressed format.\nfunc CompressPubkey(pubkey *ecdsa.PublicKey) []byte {\n\treturn (*btcec.PublicKey)(pubkey).SerializeCompressed()\n}\n\n// S256 returns an instance of the secp256k1 curve.\nfunc S256() elliptic.Curve {\n\treturn btcec.S256()\n}\n"
  },
  {
    "path": "dashboard/README.md",
    "content": "## Go Ethereum Dashboard\n\nThe dashboard is a data visualizer integrated into gero, intended to collect and visualize useful information of an Ethereum node. It consists of two parts:\n\n* The client visualizes the collected data.\n* The server collects the data, and updates the clients.\n\nThe client's UI uses [React][React] with JSX syntax, which is validated by the [ESLint][ESLint] linter mostly according to the [Airbnb React/JSX Style Guide][Airbnb]. The style is defined in the `.eslintrc` configuration file. The resources are bundled into a single `bundle.js` file using [Webpack][Webpack], which relies on the `webpack.config.js`. The bundled file is referenced from `dashboard.html` and takes part in the `assets.go` too. The necessary dependencies for the module bundler are gathered by [Node.js][Node.js].\n\n### Development and bundling\n\nAs the dashboard depends on certain NPM packages (which are not included in the `go-sero` repo), these need to be installed first:\n\n```\n$ (cd dashboard/assets && yarn install && yarn flow)\n```\n\nNormally the dashboard assets are bundled into Geth via `go-bindata` to avoid external dependencies. Rebuilding Geth after each UI modification however is not feasible from a developer perspective. Instead, we can run `yarn dev` to watch for file system changes and refresh the browser automatically.\n\n```\n$ gero --dashboard --vmodule=dashboard=5\n$ (cd dashboard/assets && yarn dev)\n```\n\nTo bundle up the final UI into Geth, run `go generate`:\n\n```\n$ (cd dashboard && go generate)\n```\n\n### Static type checking\n\nSince JavaScript doesn't provide type safety, [Flow][Flow] is used to check types. These are only useful during development, so at the end of the process Babel will strip them.\n\nTo take advantage of static type checking, your IDE needs to be prepared for it. In case of [Atom][Atom] a configuration guide can be found [here][Atom config]: Install the [Nuclide][Nuclide] package for Flow support, making sure it installs all of its support packages by enabling `Install Recommended Packages on Startup`, and set the path of the `flow-bin` which were installed previously by `yarn`.\n\nFor more IDE support install the `linter-eslint` package too, which finds the `.eslintrc` file, and provides real-time linting. Atom warns, that these two packages are incompatible, but they seem to work well together. For third-party library errors and auto-completion [flow-typed][flow-typed] is used.\n\n### Have fun\n\n[Webpack][Webpack] offers handy tools for visualizing the bundle's dependency tree and space usage.\n\n* Generate the bundle's profile running `yarn stats`\n* For the _dependency tree_ go to [Webpack Analyze][WA], and import `stats.json`\n* For the _space usage_ go to [Webpack Visualizer][WV], and import `stats.json`\n\n[React]: https://reactjs.org/\n[ESLint]: https://eslint.org/\n[Airbnb]: https://github.com/airbnb/javascript/tree/master/react\n[Webpack]: https://webpack.github.io/\n[WA]: http://webpack.github.io/analyse/\n[WV]: http://chrisbateman.github.io/webpack-visualizer/\n[Node.js]: https://nodejs.org/en/\n[Flow]: https://flow.org/\n[Atom]: https://atom.io/\n[Atom config]: https://medium.com/@fastphrase/integrating-flow-into-a-react-project-fbbc2f130eed\n[Nuclide]: https://nuclide.io/docs/quick-start/getting-started/\n[flow-typed]: https://github.com/flowtype/flow-typed\n"
  },
  {
    "path": "dashboard/assets/.eslintrc",
    "content": "// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// React syntax style mostly according to https://github.com/airbnb/javascript/tree/master/react\n{\n    'env': {\n        'browser': true,\n        'node':    true,\n        'es6':     true,\n    },\n    'parser': 'babel-eslint',\n    'parserOptions': {\n        'sourceType':   'module',\n        'ecmaVersion':  6,\n        'ecmaFeatures': {\n            'jsx': true,\n        }\n    },\n    'extends': 'airbnb',\n    'plugins': [\n        'flowtype',\n        'react',\n    ],\n    'rules': {\n        'no-tabs':                'off',\n        'indent':                 ['error', 'tab'],\n        'react/jsx-indent':       ['error', 'tab'],\n        'react/jsx-indent-props': ['error', 'tab'],\n        'react/prefer-stateless-function': 'off',\n        'jsx-quotes':  ['error', 'prefer-single'],\n        'no-plusplus': 'off',\n        'no-console':  ['error', { allow: ['error'] }],\n\n        // Specifies the maximum length of a line.\n        'max-len': ['warn', 120, 2, {\n            'ignoreUrls':             true,\n            'ignoreComments':         false,\n            'ignoreRegExpLiterals':   true,\n            'ignoreStrings':          true,\n            'ignoreTemplateLiterals': true,\n        }],\n        // Enforces consistent spacing between keys and values in object literal properties.\n        'key-spacing': ['error', {'align': {\n            'beforeColon': false,\n            'afterColon':  true,\n            'on':          'value'\n        }}],\n        // Prohibits padding inside curly braces.\n        'object-curly-spacing': ['error', 'never'],\n        'no-use-before-define': 'off', // messageAPI\n        'default-case': 'off',\n\n        'flowtype/boolean-style':                  ['error', 'boolean'],\n        'flowtype/define-flow-type':               'warn',\n        'flowtype/generic-spacing':                ['error', 'never'],\n        'flowtype/no-primitive-constructor-types': 'error',\n        'flowtype/no-weak-types':                  'error',\n        'flowtype/object-type-delimiter':          ['error', 'comma'],\n        'flowtype/require-valid-file-annotation':  'error',\n        'flowtype/semi':                           ['error', 'always'],\n        'flowtype/space-after-type-colon':         ['error', 'always'],\n        'flowtype/space-before-generic-bracket':   ['error', 'never'],\n        'flowtype/space-before-type-colon':        ['error', 'never'],\n        'flowtype/union-intersection-spacing':     ['error', 'always'],\n        'flowtype/use-flow-type':                  'warn',\n        'flowtype/valid-syntax':                   'warn',\n    },\n    'settings': {\n        'flowtype': {\n            'onlyFilesWithFlowAnnotation': true,\n        }\n    },\n}\n"
  },
  {
    "path": "dashboard/assets/.flowconfig",
    "content": "[ignore]\n<PROJECT_ROOT>/node_modules/material-ui/.*\\.js\\.flow\n\n[libs]\n<PROJECT_ROOT>/flow-typed/\nnode_modules/jss/flow-typed\n\n[options]\ninclude_warnings=true\n"
  },
  {
    "path": "dashboard/assets/common.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\ntype ProvidedMenuProp = {|title: string, icon: string|};\nconst menuSkeletons: Array<{|id: string, menu: ProvidedMenuProp|}> = [\n\t{\n\t\tid:   'home',\n\t\tmenu: {\n\t\t\ttitle: 'Home',\n\t\t\ticon:  'home',\n\t\t},\n\t}, {\n\t\tid:   'chain',\n\t\tmenu: {\n\t\t\ttitle: 'Chain',\n\t\t\ticon:  'link',\n\t\t},\n\t}, {\n\t\tid:   'txpool',\n\t\tmenu: {\n\t\t\ttitle: 'TxPool',\n\t\t\ticon:  'credit-card',\n\t\t},\n\t}, {\n\t\tid:   'network',\n\t\tmenu: {\n\t\t\ttitle: 'Network',\n\t\t\ticon:  'globe',\n\t\t},\n\t}, {\n\t\tid:   'system',\n\t\tmenu: {\n\t\t\ttitle: 'System',\n\t\t\ticon:  'tachometer',\n\t\t},\n\t}, {\n\t\tid:   'logs',\n\t\tmenu: {\n\t\t\ttitle: 'Logs',\n\t\t\ticon:  'list',\n\t\t},\n\t},\n];\nexport type MenuProp = {|...ProvidedMenuProp, id: string|};\n// The sidebar menu and the main content are rendered based on these elements.\n// Using the id is circumstantial in some cases, so it is better to insert it also as a value.\n// This way the mistyping is prevented.\nexport const MENU: Map<string, {...MenuProp}> = new Map(menuSkeletons.map(({id, menu}) => ([id, {id, ...menu}])));\n\nexport const DURATION = 200;\n\nexport const styles = {\n\tlight: {\n\t\tcolor: 'rgba(255, 255, 255, 0.54)',\n\t},\n};\n"
  },
  {
    "path": "dashboard/assets/components/Body.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport SideBar from './SideBar';\nimport Main from './Main';\nimport type {Content} from '../types/content';\n\n// styles contains the constant styles of the component.\nconst styles = {\n\tbody: {\n\t\tdisplay: 'flex',\n\t\twidth:   '100%',\n\t\theight:  '92%',\n\t},\n};\n\nexport type Props = {\n\topened:        boolean,\n\tchangeContent: string => void,\n\tactive:        string,\n\tcontent:       Content,\n\tshouldUpdate:  Object,\n\tsend:          string => void,\n};\n\n// Body renders the body of the dashboard.\nclass Body extends Component<Props> {\n\trender() {\n\t\treturn (\n\t\t\t<div style={styles.body}>\n\t\t\t\t<SideBar\n\t\t\t\t\topened={this.props.opened}\n\t\t\t\t\tchangeContent={this.props.changeContent}\n\t\t\t\t/>\n\t\t\t\t<Main\n\t\t\t\t\tactive={this.props.active}\n\t\t\t\t\tcontent={this.props.content}\n\t\t\t\t\tshouldUpdate={this.props.shouldUpdate}\n\t\t\t\t\tsend={this.props.send}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nexport default Body;\n"
  },
  {
    "path": "dashboard/assets/components/ChartRow.jsx",
    "content": "// @flow\n\n// Copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\nimport type {ChildrenArray} from 'react';\n\nimport Grid from 'material-ui/Grid';\n\n// styles contains the constant styles of the component.\nconst styles = {\n\tcontainer: {\n\t\tflexWrap: 'nowrap',\n\t\theight:   '100%',\n\t\tmaxWidth: '100%',\n\t\tmargin:   0,\n\t},\n\titem: {\n\t\tflex:    1,\n\t\tpadding: 0,\n\t},\n}\n\nexport type Props = {\n\tchildren: ChildrenArray<React$Element<any>>,\n};\n\n// ChartRow renders a row of equally sized responsive charts.\nclass ChartRow extends Component<Props> {\n\trender() {\n\t\treturn (\n\t\t\t<Grid container direction='row' style={styles.container} justify='space-between'>\n\t\t\t\t{React.Children.map(this.props.children, child => (\n\t\t\t\t\t<Grid item xs style={styles.item}>\n\t\t\t\t\t\t{child}\n\t\t\t\t\t</Grid>\n\t\t\t\t))}\n\t\t\t</Grid>\n\t\t);\n\t}\n}\n\nexport default ChartRow;\n"
  },
  {
    "path": "dashboard/assets/components/CustomTooltip.jsx",
    "content": "// @flow\n\n// Copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport Typography from 'material-ui/Typography';\nimport {styles} from '../common';\n\n// multiplier multiplies a number by another.\nexport const multiplier = <T>(by: number = 1) => (x: number) => x * by;\n\n// percentPlotter renders a tooltip, which displays the value of the payload followed by a percent sign.\nexport const percentPlotter = <T>(text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => {\n\tconst p = mapper(payload);\n\tif (typeof p !== 'number') {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Typography type='caption' color='inherit'>\n\t\t\t<span style={styles.light}>{text}</span> {p.toFixed(2)} %\n\t\t</Typography>\n\t);\n};\n\n// unit contains the units for the bytePlotter.\nconst unit = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi'];\n\n// simplifyBytes returns the simplified version of the given value followed by the unit.\nconst simplifyBytes = (x: number) => {\n\tlet i = 0;\n\tfor (; x > 1024 && i < 8; i++) {\n\t\tx /= 1024;\n\t}\n\treturn x.toFixed(2).toString().concat(' ', unit[i], 'B');\n};\n\n// bytePlotter renders a tooltip, which displays the payload as a byte value.\nexport const bytePlotter = <T>(text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => {\n\tconst p = mapper(payload);\n\tif (typeof p !== 'number') {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Typography type='caption' color='inherit'>\n\t\t\t<span style={styles.light}>{text}</span> {simplifyBytes(p)}\n\t\t</Typography>\n\t);\n};\n\n// bytePlotter renders a tooltip, which displays the payload as a byte value followed by '/s'.\nexport const bytePerSecPlotter = <T>(text: string, mapper: (T => T) = multiplier(1)) => (payload: T) => {\n\tconst p = mapper(payload);\n\tif (typeof p !== 'number') {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Typography type='caption' color='inherit'>\n\t\t\t<span style={styles.light}>{text}</span> {simplifyBytes(p)}/s\n\t\t</Typography>\n\t);\n};\n\nexport type Props = {\n\tactive: boolean,\n\tpayload: Object,\n\ttooltip: <T>(text: string, mapper?: T => T) => (payload: mixed) => null | React$Element<any>,\n};\n\n// CustomTooltip takes a tooltip function, and uses it to plot the active value of the chart.\nclass CustomTooltip extends Component<Props> {\n\trender() {\n\t\tconst {active, payload, tooltip} = this.props;\n\t\tif (!active || typeof tooltip !== 'function' || !Array.isArray(payload) || payload.length < 1) {\n\t\t\treturn null;\n\t\t}\n\t\treturn tooltip(payload[0].value);\n\t}\n}\n\nexport default CustomTooltip;\n"
  },
  {
    "path": "dashboard/assets/components/Dashboard.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport withStyles from 'material-ui/styles/withStyles';\n\nimport Header from './Header';\nimport Body from './Body';\nimport {MENU} from '../common';\nimport type {Content} from '../types/content';\nimport {inserter as logInserter} from './Logs';\n\n// deepUpdate updates an object corresponding to the given update data, which has\n// the shape of the same structure as the original object. updater also has the same\n// structure, except that it contains functions where the original data needs to be\n// updated. These functions are used to handle the update.\n//\n// Since the messages have the same shape as the state content, this approach allows\n// the generalization of the message handling. The only necessary thing is to set a\n// handler function for every path of the state in order to maximize the flexibility\n// of the update.\nconst deepUpdate = (updater: Object, update: Object, prev: Object): $Shape<Content> => {\n\tif (typeof update === 'undefined') {\n\t\t// TODO (kurkomisi): originally this was deep copy, investigate it.\n\t\treturn prev;\n\t}\n\tif (typeof updater === 'function') {\n\t\treturn updater(update, prev);\n\t}\n\tconst updated = {};\n\tObject.keys(prev).forEach((key) => {\n\t\tupdated[key] = deepUpdate(updater[key], update[key], prev[key]);\n\t});\n\n\treturn updated;\n};\n\n// shouldUpdate returns the structure of a message. It is used to prevent unnecessary render\n// method triggerings. In the affected component's shouldComponentUpdate method it can be checked\n// whether the involved data was changed or not by checking the message structure.\n//\n// We could return the message itself too, but it's safer not to give access to it.\nconst shouldUpdate = (updater: Object, msg: Object) => {\n\tconst su = {};\n\tObject.keys(msg).forEach((key) => {\n\t\tsu[key] = typeof updater[key] !== 'function' ? shouldUpdate(updater[key], msg[key]) : true;\n\t});\n\n\treturn su;\n};\n\n// replacer is a state updater function, which replaces the original data.\nconst replacer = <T>(update: T) => update;\n\n// appender is a state updater function, which appends the update data to the\n// existing data. limit defines the maximum allowed size of the created array,\n// mapper maps the update data.\nconst appender = <T>(limit: number, mapper = replacer) => (update: Array<T>, prev: Array<T>) => [\n\t...prev,\n\t...update.map(sample => mapper(sample)),\n].slice(-limit);\n\n// defaultContent returns the initial value of the state content. Needs to be a function in order to\n// instantiate the object again, because it is used by the state, and isn't automatically cleaned\n// when a new connection is established. The state is mutated during the update in order to avoid\n// the execution of unnecessary operations (e.g. copy of the log array).\nconst defaultContent: () => Content = () => ({\n\tgeneral: {\n\t\tversion: null,\n\t\tcommit:  null,\n\t},\n\thome:    {},\n\tchain:   {},\n\ttxpool:  {},\n\tnetwork: {},\n\tsystem:  {\n\t\tactiveMemory:   [],\n\t\tvirtualMemory:  [],\n\t\tnetworkIngress: [],\n\t\tnetworkEgress:  [],\n\t\tprocessCPU:     [],\n\t\tsystemCPU:      [],\n\t\tdiskRead:       [],\n\t\tdiskWrite:      [],\n\t},\n\tlogs: {\n\t\tchunks:        [],\n\t\tendTop:        false,\n\t\tendBottom:     true,\n\t\ttopChanged:    0,\n\t\tbottomChanged: 0,\n\t},\n});\n\n// updaters contains the state updater functions for each path of the state.\n//\n// TODO (kurkomisi): Define a tricky type which embraces the content and the updaters.\nconst updaters = {\n\tgeneral: {\n\t\tversion: replacer,\n\t\tcommit:  replacer,\n\t},\n\thome:    null,\n\tchain:   null,\n\ttxpool:  null,\n\tnetwork: null,\n\tsystem:  {\n\t\tactiveMemory:   appender(200),\n\t\tvirtualMemory:  appender(200),\n\t\tnetworkIngress: appender(200),\n\t\tnetworkEgress:  appender(200),\n\t\tprocessCPU:     appender(200),\n\t\tsystemCPU:      appender(200),\n\t\tdiskRead:       appender(200),\n\t\tdiskWrite:      appender(200),\n\t},\n\tlogs: logInserter(5),\n};\n\n// styles contains the constant styles of the component.\nconst styles = {\n\tdashboard: {\n\t\tdisplay:  'flex',\n\t\tflexFlow: 'column',\n\t\twidth:    '100%',\n\t\theight:   '100%',\n\t\tzIndex:   1,\n\t\toverflow: 'hidden',\n\t},\n};\n\n// themeStyles returns the styles generated from the theme for the component.\nconst themeStyles: Object = (theme: Object) => ({\n\tdashboard: {\n\t\tbackground: theme.palette.background.default,\n\t},\n});\n\nexport type Props = {\n\tclasses: Object, // injected by withStyles()\n};\n\ntype State = {\n\tactive:       string,  // active menu\n\tsideBar:      boolean, // true if the sidebar is opened\n\tcontent:      Content, // the visualized data\n\tshouldUpdate: Object,  // labels for the components, which need to re-render based on the incoming message\n\tserver:       ?WebSocket,\n};\n\n// Dashboard is the main component, which renders the whole page, makes connection with the server and\n// listens for messages. When there is an incoming message, updates the page's content correspondingly.\nclass Dashboard extends Component<Props, State> {\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.state = {\n\t\t\tactive:       MENU.get('home').id,\n\t\t\tsideBar:      true,\n\t\t\tcontent:      defaultContent(),\n\t\t\tshouldUpdate: {},\n\t\t\tserver:       null,\n\t\t};\n\t}\n\n\t// componentDidMount initiates the establishment of the first websocket connection after the component is rendered.\n\tcomponentDidMount() {\n\t\tthis.reconnect();\n\t}\n\n\t// reconnect establishes a websocket connection with the server, listens for incoming messages\n\t// and tries to reconnect on connection loss.\n\treconnect = () => {\n\t\t// PROD is defined by webpack.\n\t\tconst server = new WebSocket(`${((window.location.protocol === 'https:') ? 'wss://' : 'ws://')}${PROD ? window.location.host : 'localhost:8080'}/api`);\n\t\tserver.onopen = () => {\n\t\t\tthis.setState({content: defaultContent(), shouldUpdate: {}, server});\n\t\t};\n\t\tserver.onmessage = (event) => {\n\t\t\tconst msg: $Shape<Content> = JSON.parse(event.data);\n\t\t\tif (!msg) {\n\t\t\t\tconsole.error(`Incoming message is ${msg}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.update(msg);\n\t\t};\n\t\tserver.onclose = () => {\n\t\t\tthis.setState({server: null});\n\t\t\tsetTimeout(this.reconnect, 3000);\n\t\t};\n\t};\n\n\t// send sends a message to the server, which can be accessed only through this function for safety reasons.\n\tsend = (msg: string) => {\n\t\tif (this.state.server != null) {\n\t\t\tthis.state.server.send(msg);\n\t\t}\n\t};\n\n\t// update updates the content corresponding to the incoming message.\n\tupdate = (msg: $Shape<Content>) => {\n\t\tthis.setState(prevState => ({\n\t\t\tcontent:      deepUpdate(updaters, msg, prevState.content),\n\t\t\tshouldUpdate: shouldUpdate(updaters, msg),\n\t\t}));\n\t};\n\n\t// changeContent sets the active label, which is used at the content rendering.\n\tchangeContent = (newActive: string) => {\n\t\tthis.setState(prevState => (prevState.active !== newActive ? {active: newActive} : {}));\n\t};\n\n\t// switchSideBar opens or closes the sidebar's state.\n\tswitchSideBar = () => {\n\t\tthis.setState(prevState => ({sideBar: !prevState.sideBar}));\n\t};\n\n\trender() {\n\t\treturn (\n\t\t\t<div className={this.props.classes.dashboard} style={styles.dashboard}>\n\t\t\t\t<Header\n\t\t\t\t\tswitchSideBar={this.switchSideBar}\n\t\t\t\t/>\n\t\t\t\t<Body\n\t\t\t\t\topened={this.state.sideBar}\n\t\t\t\t\tchangeContent={this.changeContent}\n\t\t\t\t\tactive={this.state.active}\n\t\t\t\t\tcontent={this.state.content}\n\t\t\t\t\tshouldUpdate={this.state.shouldUpdate}\n\t\t\t\t\tsend={this.send}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nexport default withStyles(themeStyles)(Dashboard);\n"
  },
  {
    "path": "dashboard/assets/components/Footer.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport withStyles from 'material-ui/styles/withStyles';\nimport Typography from 'material-ui/Typography';\nimport Grid from 'material-ui/Grid';\nimport {ResponsiveContainer, AreaChart, Area, Tooltip} from 'recharts';\n\nimport ChartRow from './ChartRow';\nimport CustomTooltip, {bytePlotter, bytePerSecPlotter, percentPlotter, multiplier} from './CustomTooltip';\nimport {styles as commonStyles} from '../common';\nimport type {General, System} from '../types/content';\n\nconst FOOTER_SYNC_ID = 'footerSyncId';\n\nconst CPU     = 'cpu';\nconst MEMORY  = 'memory';\nconst DISK    = 'disk';\nconst TRAFFIC = 'traffic';\n\nconst TOP = 'Top';\nconst BOTTOM = 'Bottom';\n\n// styles contains the constant styles of the component.\nconst styles = {\n\tfooter: {\n\t\tmaxWidth: '100%',\n\t\tflexWrap: 'nowrap',\n\t\tmargin:   0,\n\t},\n\tchartRowWrapper: {\n\t\theight:  '100%',\n\t\tpadding: 0,\n\t},\n\tdoubleChartWrapper: {\n\t\theight: '100%',\n\t\twidth:  '99%',\n\t},\n};\n\n// themeStyles returns the styles generated from the theme for the component.\nconst themeStyles: Object = (theme: Object) => ({\n\tfooter: {\n\t\tbackgroundColor: theme.palette.grey[900],\n\t\tcolor:           theme.palette.getContrastText(theme.palette.grey[900]),\n\t\tzIndex:          theme.zIndex.appBar,\n\t\theight:          theme.spacing.unit * 10,\n\t},\n});\n\nexport type Props = {\n\tclasses: Object, // injected by withStyles()\n\ttheme: Object,\n\tgeneral: General,\n\tsystem: System,\n\tshouldUpdate: Object,\n};\n\n// Footer renders the footer of the dashboard.\nclass Footer extends Component<Props> {\n\tshouldComponentUpdate(nextProps) {\n\t\treturn typeof nextProps.shouldUpdate.general !== 'undefined' || typeof nextProps.shouldUpdate.system !== 'undefined';\n\t}\n\n\t// halfHeightChart renders an area chart with half of the height of its parent.\n\thalfHeightChart = (chartProps, tooltip, areaProps) => (\n\t\t<ResponsiveContainer width='100%' height='50%'>\n\t\t\t<AreaChart {...chartProps} >\n\t\t\t\t{!tooltip || (<Tooltip cursor={false} content={<CustomTooltip tooltip={tooltip} />} />)}\n\t\t\t\t<Area isAnimationActive={false} type='monotone' {...areaProps} />\n\t\t\t</AreaChart>\n\t\t</ResponsiveContainer>\n\t);\n\n\t// doubleChart renders a pair of charts separated by the baseline.\n\tdoubleChart = (syncId, chartKey, topChart, bottomChart) => {\n\t\tif (!Array.isArray(topChart.data) || !Array.isArray(bottomChart.data)) {\n\t\t\treturn null;\n\t\t}\n\t\tconst topDefault = topChart.default || 0;\n\t\tconst bottomDefault = bottomChart.default || 0;\n\t\tconst topKey = `${chartKey}${TOP}`;\n\t\tconst bottomKey = `${chartKey}${BOTTOM}`;\n\t\tconst topColor = '#8884d8';\n\t\tconst bottomColor = '#82ca9d';\n\n\t\treturn (\n\t\t\t<div style={styles.doubleChartWrapper}>\n\t\t\t\t{this.halfHeightChart(\n\t\t\t\t\t{\n\t\t\t\t\t\tsyncId,\n\t\t\t\t\t\tdata:   topChart.data.map(({value}) => ({[topKey]: value || topDefault})),\n\t\t\t\t\t\tmargin: {top: 5, right: 5, bottom: 0, left: 5},\n\t\t\t\t\t},\n\t\t\t\t\ttopChart.tooltip,\n\t\t\t\t\t{dataKey: topKey, stroke: topColor, fill: topColor},\n\t\t\t\t)}\n\t\t\t\t{this.halfHeightChart(\n\t\t\t\t\t{\n\t\t\t\t\t\tsyncId,\n\t\t\t\t\t\tdata:   bottomChart.data.map(({value}) => ({[bottomKey]: -value || -bottomDefault})),\n\t\t\t\t\t\tmargin: {top: 0, right: 5, bottom: 5, left: 5},\n\t\t\t\t\t},\n\t\t\t\t\tbottomChart.tooltip,\n\t\t\t\t\t{dataKey: bottomKey, stroke: bottomColor, fill: bottomColor},\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\trender() {\n\t\tconst {general, system} = this.props;\n\n\t\treturn (\n\t\t\t<Grid container className={this.props.classes.footer} direction='row' alignItems='center' style={styles.footer}>\n\t\t\t\t<Grid item xs style={styles.chartRowWrapper}>\n\t\t\t\t\t<ChartRow>\n\t\t\t\t\t\t{this.doubleChart(\n\t\t\t\t\t\t\tFOOTER_SYNC_ID,\n\t\t\t\t\t\t\tCPU,\n\t\t\t\t\t\t\t{data: system.processCPU, tooltip: percentPlotter('Process load')},\n\t\t\t\t\t\t\t{data: system.systemCPU, tooltip: percentPlotter('System load', multiplier(-1))},\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{this.doubleChart(\n\t\t\t\t\t\t\tFOOTER_SYNC_ID,\n\t\t\t\t\t\t\tMEMORY,\n\t\t\t\t\t\t\t{data: system.activeMemory, tooltip: bytePlotter('Active memory')},\n\t\t\t\t\t\t\t{data: system.virtualMemory, tooltip: bytePlotter('Virtual memory', multiplier(-1))},\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{this.doubleChart(\n\t\t\t\t\t\t\tFOOTER_SYNC_ID,\n\t\t\t\t\t\t\tDISK,\n\t\t\t\t\t\t\t{data: system.diskRead, tooltip: bytePerSecPlotter('Disk read')},\n\t\t\t\t\t\t\t{data: system.diskWrite, tooltip: bytePerSecPlotter('Disk write', multiplier(-1))},\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{this.doubleChart(\n\t\t\t\t\t\t\tFOOTER_SYNC_ID,\n\t\t\t\t\t\t\tTRAFFIC,\n\t\t\t\t\t\t\t{data: system.networkIngress, tooltip: bytePerSecPlotter('Download')},\n\t\t\t\t\t\t\t{data: system.networkEgress, tooltip: bytePerSecPlotter('Upload', multiplier(-1))},\n\t\t\t\t\t\t)}\n\t\t\t\t\t</ChartRow>\n\t\t\t\t</Grid>\n\t\t\t\t<Grid item >\n\t\t\t\t\t<Typography type='caption' color='inherit'>\n\t\t\t\t\t\t<span style={commonStyles.light}>Geth</span> {general.version}\n\t\t\t\t\t</Typography>\n\t\t\t\t\t{general.commit && (\n\t\t\t\t\t\t<Typography type='caption' color='inherit'>\n\t\t\t\t\t\t\t<span style={commonStyles.light}>{'Commit '}</span>\n\t\t\t\t\t\t\t<a href={`https://github.com/ethereum/go-sero/commit/${general.commit}`} target='_blank' style={{color: 'inherit', textDecoration: 'none'}} >\n\t\t\t\t\t\t\t\t{general.commit.substring(0, 8)}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t)}\n\t\t\t\t</Grid>\n\t\t\t</Grid>\n\t\t);\n\t}\n}\n\nexport default withStyles(themeStyles)(Footer);\n"
  },
  {
    "path": "dashboard/assets/components/Header.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport withStyles from 'material-ui/styles/withStyles';\nimport AppBar from 'material-ui/AppBar';\nimport Toolbar from 'material-ui/Toolbar';\nimport IconButton from 'material-ui/IconButton';\nimport Icon from 'material-ui/Icon';\nimport MenuIcon from 'material-ui-icons/Menu';\nimport Typography from 'material-ui/Typography';\n\n// styles contains the constant styles of the component.\nconst styles = {\n\theader: {\n\t\theight: '8%',\n\t},\n\ttoolbar: {\n\t\theight: '100%',\n\t},\n};\n\n// themeStyles returns the styles generated from the theme for the component.\nconst themeStyles = (theme: Object) => ({\n\theader: {\n\t\tbackgroundColor: theme.palette.grey[900],\n\t\tcolor:           theme.palette.getContrastText(theme.palette.grey[900]),\n\t\tzIndex:          theme.zIndex.appBar,\n\t},\n\ttoolbar: {\n\t\tpaddingLeft:  theme.spacing.unit,\n\t\tpaddingRight: theme.spacing.unit,\n\t},\n\ttitle: {\n\t\tpaddingLeft: theme.spacing.unit,\n\t\tfontSize:    3 * theme.spacing.unit,\n\t},\n});\n\nexport type Props = {\n\tclasses: Object, // injected by withStyles()\n\tswitchSideBar: () => void,\n};\n\n// Header renders the header of the dashboard.\nclass Header extends Component<Props> {\n\trender() {\n\t\tconst {classes} = this.props;\n\n\t\treturn (\n\t\t\t<AppBar position='static' className={classes.header} style={styles.header}>\n\t\t\t\t<Toolbar className={classes.toolbar} style={styles.toolbar}>\n\t\t\t\t\t<IconButton onClick={this.props.switchSideBar}>\n\t\t\t\t\t\t<Icon>\n\t\t\t\t\t\t\t<MenuIcon />\n\t\t\t\t\t\t</Icon>\n\t\t\t\t\t</IconButton>\n\t\t\t\t\t<Typography type='title' color='inherit' noWrap className={classes.title}>\n\t\t\t\t\t\tGo Ethereum Dashboard\n\t\t\t\t\t</Typography>\n\t\t\t\t</Toolbar>\n\t\t\t</AppBar>\n\t\t);\n\t}\n}\n\nexport default withStyles(themeStyles)(Header);\n"
  },
  {
    "path": "dashboard/assets/components/Logs.jsx",
    "content": "// @flow\n\n// Copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport List, {ListItem} from 'material-ui/List';\nimport escapeHtml from 'escape-html';\nimport type {Record, Content, LogsMessage, Logs as LogsType} from '../types/content';\n\n// requestBand says how wide is the top/bottom zone, eg. 0.1 means 10% of the container height.\nconst requestBand = 0.05;\n\n// fieldPadding is a global map with maximum field value lengths seen until now\n// to allow padding log contexts in a bit smarter way.\nconst fieldPadding = new Map();\n\n// createChunk creates an HTML formatted object, which displays the given array similarly to\n// the server side terminal.\nconst createChunk = (records: Array<Record>) => {\n\tlet content = '';\n\trecords.forEach((record) => {\n\t\tconst {t, ctx} = record;\n\t\tlet {lvl, msg} = record;\n\t\tlet color = '#ce3c23';\n\t\tswitch (lvl) {\n\t\tcase 'trace':\n\t\tcase 'trce':\n\t\t\tlvl = 'TRACE';\n\t\t\tcolor = '#3465a4';\n\t\t\tbreak;\n\t\tcase 'debug':\n\t\tcase 'dbug':\n\t\t\tlvl = 'DEBUG';\n\t\t\tcolor = '#3d989b';\n\t\t\tbreak;\n\t\tcase 'info':\n\t\t\tlvl = 'INFO&nbsp;';\n\t\t\tcolor = '#4c8f0f';\n\t\t\tbreak;\n\t\tcase 'warn':\n\t\t\tlvl = 'WARN&nbsp;';\n\t\t\tcolor = '#b79a22';\n\t\t\tbreak;\n\t\tcase 'error':\n\t\tcase 'eror':\n\t\t\tlvl = 'ERROR';\n\t\t\tcolor = '#754b70';\n\t\t\tbreak;\n\t\tcase 'crit':\n\t\t\tlvl = 'CRIT&nbsp;';\n\t\t\tcolor = '#ce3c23';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tlvl = '';\n\t\t}\n\t\tconst time = new Date(t);\n\t\tif (lvl === '' || !(time instanceof Date) || isNaN(time) || typeof msg !== 'string' || !Array.isArray(ctx)) {\n\t\t\tcontent += '<span style=\"color:#ce3c23\">Invalid log record</span><br />';\n\t\t\treturn;\n\t\t}\n\t\tif (ctx.length > 0) {\n\t\t\tmsg += '&nbsp;'.repeat(Math.max(40 - msg.length, 0));\n\t\t}\n\t\tconst month = `0${time.getMonth() + 1}`.slice(-2);\n\t\tconst date = `0${time.getDate()}`.slice(-2);\n\t\tconst hours = `0${time.getHours()}`.slice(-2);\n\t\tconst minutes = `0${time.getMinutes()}`.slice(-2);\n\t\tconst seconds = `0${time.getSeconds()}`.slice(-2);\n\t\tcontent += `<span style=\"color:${color}\">${lvl}</span>[${month}-${date}|${hours}:${minutes}:${seconds}] ${msg}`;\n\n\t\tfor (let i = 0; i < ctx.length; i += 2) {\n\t\t\tconst key = escapeHtml(ctx[i]);\n\t\t\tconst val = escapeHtml(ctx[i + 1]);\n\t\t\tlet padding = fieldPadding.get(key);\n\t\t\tif (typeof padding !== 'number' || padding < val.length) {\n\t\t\t\tpadding = val.length;\n\t\t\t\tfieldPadding.set(key, padding);\n\t\t\t}\n\t\t\tlet p = '';\n\t\t\tif (i < ctx.length - 2) {\n\t\t\t\tp = '&nbsp;'.repeat(padding - val.length);\n\t\t\t}\n\t\t\tcontent += ` <span style=\"color:${color}\">${key}</span>=${val}${p}`;\n\t\t}\n\t\tcontent += '<br />';\n\t});\n\treturn content;\n};\n\n// ADDED, SAME and REMOVED are used to track the change of the log chunk array.\n// The scroll position is set using these values.\nconst ADDED = 1;\nconst SAME = 0;\nconst REMOVED = -1;\n\n// inserter is a state updater function for the main component, which inserts the new log chunk into the chunk array.\n// limit is the maximum length of the chunk array, used in order to prevent the browser from OOM.\nexport const inserter = (limit: number) => (update: LogsMessage, prev: LogsType) => {\n\tprev.topChanged = SAME;\n\tprev.bottomChanged = SAME;\n\tif (!Array.isArray(update.chunk) || update.chunk.length < 1) {\n\t\treturn prev;\n\t}\n\tif (!Array.isArray(prev.chunks)) {\n\t\tprev.chunks = [];\n\t}\n\tconst content = createChunk(update.chunk);\n\tif (!update.source) {\n\t\t// In case of stream chunk.\n\t\tif (!prev.endBottom) {\n\t\t\treturn prev;\n\t\t}\n\t\tif (prev.chunks.length < 1) {\n\t\t\t// This should never happen, because the first chunk is always a non-stream chunk.\n\t\t\treturn [{content, name: '00000000000000.log'}];\n\t\t}\n\t\tprev.chunks[prev.chunks.length - 1].content += content;\n\t\tprev.bottomChanged = ADDED;\n\t\treturn prev;\n\t}\n\tconst chunk = {\n\t\tcontent,\n\t\tname: update.source.name,\n\t};\n\tif (prev.chunks.length > 0 && update.source.name < prev.chunks[0].name) {\n\t\tif (update.source.last) {\n\t\t\tprev.endTop = true;\n\t\t}\n\t\tif (prev.chunks.length >= limit) {\n\t\t\tprev.endBottom = false;\n\t\t\tprev.chunks.splice(limit - 1, prev.chunks.length - limit + 1);\n\t\t\tprev.bottomChanged = REMOVED;\n\t\t}\n\t\tprev.chunks = [chunk, ...prev.chunks];\n\t\tprev.topChanged = ADDED;\n\t\treturn prev;\n\t}\n\tif (update.source.last) {\n\t\tprev.endBottom = true;\n\t}\n\tif (prev.chunks.length >= limit) {\n\t\tprev.endTop = false;\n\t\tprev.chunks.splice(0, prev.chunks.length - limit + 1);\n\t\tprev.topChanged = REMOVED;\n\t}\n\tprev.chunks = [...prev.chunks, chunk];\n\tprev.bottomChanged = ADDED;\n\treturn prev;\n};\n\n// styles contains the constant styles of the component.\nconst styles = {\n\tlogListItem: {\n\t\tpadding: 0,\n\t\tlineHeight: 1.231,\n\t},\n\tlogChunk: {\n\t\tcolor:      'white',\n\t\tfontFamily: 'monospace',\n\t\twhiteSpace: 'nowrap',\n\t\twidth:      0,\n\t},\n\twaitMsg: {\n\t\ttextAlign:  'center',\n\t\tcolor:      'white',\n\t\tfontFamily: 'monospace',\n\t},\n};\n\nexport type Props = {\n\tcontainer:    Object,\n\tcontent:      Content,\n\tshouldUpdate: Object,\n\tsend:         string => void,\n};\n\ntype State = {\n\trequestAllowed: boolean,\n};\n\n// Logs renders the log page.\nclass Logs extends Component<Props, State> {\n\tconstructor(props: Props) {\n\t\tsuper(props);\n\t\tthis.content = React.createRef();\n\t\tthis.state = {\n\t\t\trequestAllowed: true,\n\t\t};\n\t}\n\n\tcomponentDidMount() {\n\t\tconst {container} = this.props;\n\t\tif (typeof container === 'undefined') {\n\t\t\treturn;\n\t\t}\n\t\tcontainer.scrollTop = container.scrollHeight - container.clientHeight;\n\t\tconst {logs} = this.props.content;\n\t\tif (typeof this.content === 'undefined' || logs.chunks.length < 1) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.content.clientHeight < container.clientHeight && !logs.endTop) {\n\t\t\tthis.sendRequest(logs.chunks[0].name, true);\n\t\t}\n\t}\n\n\t// onScroll is triggered by the parent component's scroll event, and sends requests if the scroll position is\n\t// at the top or at the bottom.\n\tonScroll = () => {\n\t\tif (!this.state.requestAllowed || typeof this.content === 'undefined') {\n\t\t\treturn;\n\t\t}\n\t\tconst {logs} = this.props.content;\n\t\tif (logs.chunks.length < 1) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.atTop() && !logs.endTop) {\n\t\t\tthis.sendRequest(logs.chunks[0].name, true);\n\t\t} else if (this.atBottom() && !logs.endBottom) {\n\t\t\tthis.sendRequest(logs.chunks[logs.chunks.length - 1].name, false);\n\t\t}\n\t};\n\n\tsendRequest = (name: string, past: boolean) => {\n\t\tthis.setState({requestAllowed: false});\n\t\tthis.props.send(JSON.stringify({\n\t\t\tLogs: {\n\t\t\t\tName: name,\n\t\t\t\tPast: past,\n\t\t\t},\n\t\t}));\n\t};\n\n\t// atTop checks if the scroll position it at the top of the container.\n\tatTop = () => this.props.container.scrollTop <= this.props.container.scrollHeight * requestBand;\n\n\t// atBottom checks if the scroll position it at the bottom of the container.\n\tatBottom = () => {\n\t\tconst {container} = this.props;\n\t\treturn container.scrollHeight - container.scrollTop <=\n\t\t\tcontainer.clientHeight + container.scrollHeight * requestBand;\n\t};\n\n\t// beforeUpdate is called by the parent component, saves the previous scroll position\n\t// and the height of the first log chunk, which can be deleted during the insertion.\n\tbeforeUpdate = () => {\n\t\tlet firstHeight = 0;\n\t\tlet chunkList = this.content.children[1];\n\t\tif (chunkList && chunkList.children[0]) {\n\t\t\tfirstHeight = chunkList.children[0].clientHeight;\n\t\t}\n\t\treturn {\n\t\t\tscrollTop: this.props.container.scrollTop,\n\t\t\tfirstHeight,\n\t\t};\n\t};\n\n\t// didUpdate is called by the parent component, which provides the container. Sends the first request if the\n\t// visible part of the container isn't full, and resets the scroll position in order to avoid jumping when a\n\t// chunk is inserted or removed.\n\tdidUpdate = (prevProps, prevState, snapshot) => {\n\t\tif (typeof this.props.shouldUpdate.logs === 'undefined' || typeof this.content === 'undefined' || snapshot === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst {logs} = this.props.content;\n\t\tconst {container} = this.props;\n\t\tif (typeof container === 'undefined' || logs.chunks.length < 1) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.content.clientHeight < container.clientHeight) {\n\t\t\t// Only enters here at the beginning, when there aren't enough logs to fill the container\n\t\t\t// and the scroll bar doesn't appear.\n\t\t\tif (!logs.endTop) {\n\t\t\t\tthis.sendRequest(logs.chunks[0].name, true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet {scrollTop} = snapshot;\n\t\tif (logs.topChanged === ADDED) {\n\t\t\t// It would be safer to use a ref to the list, but ref doesn't work well with HOCs.\n\t\t\tscrollTop += this.content.children[1].children[0].clientHeight;\n\t\t} else if (logs.bottomChanged === ADDED) {\n\t\t\tif (logs.topChanged === REMOVED) {\n\t\t\t\tscrollTop -= snapshot.firstHeight;\n\t\t\t} else if (this.atBottom() && logs.endBottom) {\n\t\t\t\tscrollTop = container.scrollHeight - container.clientHeight;\n\t\t\t}\n\t\t}\n\t\tcontainer.scrollTop = scrollTop;\n\t\tthis.setState({requestAllowed: true});\n\t};\n\n\trender() {\n\t\treturn (\n\t\t\t<div ref={(ref) => { this.content = ref; }}>\n\t\t\t\t<div style={styles.waitMsg}>\n\t\t\t\t\t{this.props.content.logs.endTop ? 'No more logs.' : 'Waiting for server...'}\n\t\t\t\t</div>\n\t\t\t\t<List>\n\t\t\t\t\t{this.props.content.logs.chunks.map((c, index) => (\n\t\t\t\t\t\t<ListItem style={styles.logListItem} key={index}>\n\t\t\t\t\t\t\t<div style={styles.logChunk} dangerouslySetInnerHTML={{__html: c.content}} />\n\t\t\t\t\t\t</ListItem>\n\t\t\t\t\t))}\n\t\t\t\t</List>\n\t\t\t\t{this.props.content.logs.endBottom || <div style={styles.waitMsg}>Waiting for server...</div>}\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nexport default Logs;\n"
  },
  {
    "path": "dashboard/assets/components/Main.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport withStyles from 'material-ui/styles/withStyles';\n\nimport {MENU} from '../common';\nimport Logs from './Logs';\nimport Footer from './Footer';\nimport type {Content} from '../types/content';\n\n// styles contains the constant styles of the component.\nconst styles = {\n\twrapper: {\n\t\tdisplay:       'flex',\n\t\tflexDirection: 'column',\n\t\twidth:         '100%',\n\t},\n\tcontent: {\n\t\tflex:      1,\n\t\toverflow: 'auto',\n\t},\n};\n\n// themeStyles returns the styles generated from the theme for the component.\nconst themeStyles = theme => ({\n\tcontent: {\n\t\tbackgroundColor: theme.palette.background.default,\n\t\tpadding:         theme.spacing.unit * 3,\n\t},\n});\n\nexport type Props = {\n\tclasses:      Object,\n\tactive:       string,\n\tcontent:      Content,\n\tshouldUpdate: Object,\n\tsend:         string => void,\n};\n\n// Main renders the chosen content.\nclass Main extends Component<Props> {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.container = React.createRef();\n\t\tthis.content = React.createRef();\n\t}\n\n\tgetSnapshotBeforeUpdate() {\n\t\tif (this.content && typeof this.content.beforeUpdate === 'function') {\n\t\t\treturn this.content.beforeUpdate();\n\t\t}\n\t\treturn null;\n\t}\n\n\tcomponentDidUpdate(prevProps, prevState, snapshot) {\n\t\tif (this.content && typeof this.content.didUpdate === 'function') {\n\t\t\tthis.content.didUpdate(prevProps, prevState, snapshot);\n\t\t}\n\t}\n\n\tonScroll = () => {\n\t\tif (this.content && typeof this.content.onScroll === 'function') {\n\t\t\tthis.content.onScroll();\n\t\t}\n\t};\n\n\trender() {\n\t\tconst {\n\t\t\tclasses, active, content, shouldUpdate,\n\t\t} = this.props;\n\n\t\tlet children = null;\n\t\tswitch (active) {\n\t\tcase MENU.get('home').id:\n\t\tcase MENU.get('chain').id:\n\t\tcase MENU.get('txpool').id:\n\t\tcase MENU.get('network').id:\n\t\tcase MENU.get('system').id:\n\t\t\tchildren = <div>Work in progress.</div>;\n\t\t\tbreak;\n\t\tcase MENU.get('logs').id:\n\t\t\tchildren = (\n\t\t\t\t<Logs\n\t\t\t\t\tref={(ref) => { this.content = ref; }}\n\t\t\t\t\tcontainer={this.container}\n\t\t\t\t\tsend={this.props.send}\n\t\t\t\t\tcontent={this.props.content}\n\t\t\t\t\tshouldUpdate={shouldUpdate}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div style={styles.wrapper}>\n\t\t\t\t<div\n\t\t\t\t\tclassName={classes.content}\n\t\t\t\t\tstyle={styles.content}\n\t\t\t\t\tref={(ref) => { this.container = ref; }}\n\t\t\t\t\tonScroll={this.onScroll}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t\t<Footer\n\t\t\t\t\tgeneral={content.general}\n\t\t\t\t\tsystem={content.system}\n\t\t\t\t\tshouldUpdate={shouldUpdate}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nexport default withStyles(themeStyles)(Main);\n"
  },
  {
    "path": "dashboard/assets/components/SideBar.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React, {Component} from 'react';\n\nimport withStyles from 'material-ui/styles/withStyles';\nimport List, {ListItem, ListItemIcon, ListItemText} from 'material-ui/List';\nimport Icon from 'material-ui/Icon';\nimport Transition from 'react-transition-group/Transition';\nimport {Icon as FontAwesome} from 'react-fa';\n\nimport {MENU, DURATION} from '../common';\n\n// styles contains the constant styles of the component.\nconst styles = {\n\tmenu: {\n\t\tdefault: {\n\t\t\ttransition: `margin-left ${DURATION}ms`,\n\t\t},\n\t\ttransition: {\n\t\t\tentered: {marginLeft: -200},\n\t\t},\n\t},\n};\n\n// themeStyles returns the styles generated from the theme for the component.\nconst themeStyles = theme => ({\n\tlist: {\n\t\tbackground: theme.palette.grey[900],\n\t},\n\tlistItem: {\n\t\tminWidth: theme.spacing.unit * 7,\n\t},\n\ticon: {\n\t\tfontSize: theme.spacing.unit * 3,\n\t},\n});\n\nexport type Props = {\n\tclasses: Object, // injected by withStyles()\n\topened: boolean,\n\tchangeContent: string => void,\n};\n\n// SideBar renders the sidebar of the dashboard.\nclass SideBar extends Component<Props> {\n\tshouldComponentUpdate(nextProps) {\n\t\treturn nextProps.opened !== this.props.opened;\n\t}\n\n\t// clickOn returns a click event handler function for the given menu item.\n\tclickOn = menu => (event) => {\n\t\tevent.preventDefault();\n\t\tthis.props.changeContent(menu);\n\t};\n\n\t// menuItems returns the menu items corresponding to the sidebar state.\n\tmenuItems = (transitionState) => {\n\t\tconst {classes} = this.props;\n\t\tconst children = [];\n\t\tMENU.forEach((menu) => {\n\t\t\tchildren.push((\n\t\t\t\t<ListItem button key={menu.id} onClick={this.clickOn(menu.id)} className={classes.listItem}>\n\t\t\t\t\t<ListItemIcon>\n\t\t\t\t\t\t<Icon className={classes.icon}>\n\t\t\t\t\t\t\t<FontAwesome name={menu.icon} />\n\t\t\t\t\t\t</Icon>\n\t\t\t\t\t</ListItemIcon>\n\t\t\t\t\t<ListItemText\n\t\t\t\t\t\tprimary={menu.title}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...styles.menu.default,\n\t\t\t\t\t\t\t...styles.menu.transition[transitionState],\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</ListItem>\n\t\t\t));\n\t\t});\n\t\treturn children;\n\t};\n\n\t// menu renders the list of the menu items.\n\tmenu = (transitionState: Object) => (\n\t\t<div className={this.props.classes.list}>\n\t\t\t<List>\n\t\t\t\t{this.menuItems(transitionState)}\n\t\t\t</List>\n\t\t</div>\n\t);\n\n\trender() {\n\t\treturn (\n\t\t\t<Transition mountOnEnter in={this.props.opened} timeout={{enter: DURATION}}>\n\t\t\t\t{this.menu}\n\t\t\t</Transition>\n\t\t);\n\t}\n}\n\nexport default withStyles(themeStyles)(SideBar);\n"
  },
  {
    "path": "dashboard/assets/fa-only-woff-loader.js",
    "content": "// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// fa-only-woff-loader removes the .eot, .ttf, .svg dependencies of the FontAwesome library,\n// because they produce unused extra blobs.\nmodule.exports = function(content) {\n\treturn content\n\t\t.replace(/src.*url(?!.*url.*(\\.eot)).*(\\.eot)[^;]*;/,'')\n\t\t.replace(/url(?!.*url.*(\\.eot)).*(\\.eot)[^,]*,/,'')\n\t\t.replace(/url(?!.*url.*(\\.ttf)).*(\\.ttf)[^,]*,/,'')\n\t\t.replace(/,[^,]*url(?!.*url.*(\\.svg)).*(\\.svg)[^;]*;/,';');\n};\n"
  },
  {
    "path": "dashboard/assets/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" style=\"height: 100%\">\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <title>Go Ethereum Dashboard</title>\n        <link rel=\"shortcut icon\" type=\"image/ico\" href=\"https://ethereum.org/favicon.ico\" />\n        <style>\n            ::-webkit-scrollbar {\n                width: 16px;\n            }\n            ::-webkit-scrollbar-thumb {\n                background: #212121;\n            }\n            ::-webkit-scrollbar-corner {\n                background: transparent;\n            }\n        </style>\n    </head>\n    <body style=\"height: 100%; margin: 0\">\n        <div id=\"dashboard\" style=\"height: 100%\"></div>\n        <script src=\"bundle.js\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "dashboard/assets/index.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nimport React from 'react';\nimport {render} from 'react-dom';\n\nimport MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';\nimport createMuiTheme from 'material-ui/styles/createMuiTheme';\n\nimport Dashboard from './components/Dashboard';\n\nconst theme: Object = createMuiTheme({\n\tpalette: {\n\t\ttype: 'dark',\n\t},\n});\nconst dashboard = document.getElementById('dashboard');\nif (dashboard) {\n\t// Renders the whole dashboard.\n\trender(\n\t\t<MuiThemeProvider theme={theme}>\n\t\t\t<Dashboard />\n\t\t</MuiThemeProvider>,\n\t\tdashboard,\n\t);\n}\n"
  },
  {
    "path": "dashboard/assets/package.json",
    "content": "{\n    \"dependencies\": {\n        \"babel-core\": \"^6.26.0\",\n        \"babel-eslint\": \"^8.2.1\",\n        \"babel-loader\": \"^7.1.2\",\n        \"babel-plugin-transform-class-properties\": \"^6.24.1\",\n        \"babel-plugin-transform-decorators-legacy\": \"^1.3.4\",\n        \"babel-plugin-transform-flow-strip-types\": \"^6.22.0\",\n        \"babel-plugin-transform-runtime\": \"^6.23.0\",\n        \"babel-preset-env\": \"^1.6.1\",\n        \"babel-preset-react\": \"^6.24.1\",\n        \"babel-preset-stage-0\": \"^6.24.1\",\n        \"babel-runtime\": \"^6.26.0\",\n        \"classnames\": \"^2.2.5\",\n        \"css-loader\": \"^0.28.9\",\n        \"escape-html\": \"^1.0.3\",\n        \"eslint\": \"^4.16.0\",\n        \"eslint-config-airbnb\": \"^16.1.0\",\n        \"eslint-loader\": \"^2.0.0\",\n        \"eslint-plugin-flowtype\": \"^2.41.0\",\n        \"eslint-plugin-import\": \"^2.8.0\",\n        \"eslint-plugin-jsx-a11y\": \"^6.0.3\",\n        \"eslint-plugin-react\": \"^7.5.1\",\n        \"file-loader\": \"^1.1.6\",\n        \"flow-bin\": \"^0.63.1\",\n        \"flow-bin-loader\": \"^1.0.2\",\n        \"flow-typed\": \"^2.2.3\",\n        \"material-ui\": \"^1.0.0-beta.30\",\n        \"material-ui-icons\": \"^1.0.0-beta.17\",\n        \"path\": \"^0.12.7\",\n        \"react\": \"^16.2.0\",\n        \"react-dom\": \"^16.2.0\",\n        \"react-fa\": \"^5.0.0\",\n        \"react-transition-group\": \"^2.2.1\",\n        \"recharts\": \"^1.0.0-beta.9\",\n        \"style-loader\": \"^0.19.1\",\n        \"url\": \"^0.11.0\",\n        \"url-loader\": \"^0.6.2\",\n        \"webpack\": \"^3.10.0\",\n        \"webpack-dev-server\": \"^2.11.1\"\n    },\n    \"scripts\": {\n        \"build\": \"NODE_ENV=production webpack\",\n        \"stats\": \"webpack --profile --json > stats.json\",\n        \"dev\": \"webpack-dev-server --port 8081\",\n        \"flow\": \"flow-typed install\"\n    }\n}\n"
  },
  {
    "path": "dashboard/assets/types/content.jsx",
    "content": "// @flow\n\n// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nexport type Content = {\n\tgeneral: General,\n\thome:    Home,\n\tchain:   Chain,\n\ttxpool:  TxPool,\n\tnetwork: Network,\n\tsystem:  System,\n\tlogs:    Logs,\n};\n\nexport type ChartEntries = Array<ChartEntry>;\n\nexport type ChartEntry = {\n\ttime:  Date,\n\tvalue: number,\n};\n\nexport type General = {\n\tversion: ?string,\n\tcommit:  ?string,\n};\n\nexport type Home = {\n\t/* TODO (kurkomisi) */\n};\n\nexport type Chain = {\n\t/* TODO (kurkomisi) */\n};\n\nexport type TxPool = {\n\t/* TODO (kurkomisi) */\n};\n\nexport type Network = {\n\t/* TODO (kurkomisi) */\n};\n\nexport type System = {\n\tactiveMemory:   ChartEntries,\n\tvirtualMemory:  ChartEntries,\n\tnetworkIngress: ChartEntries,\n\tnetworkEgress:  ChartEntries,\n\tprocessCPU:     ChartEntries,\n\tsystemCPU:      ChartEntries,\n\tdiskRead:       ChartEntries,\n\tdiskWrite:      ChartEntries,\n};\n\nexport type Record = {\n\tt:   string,\n\tlvl: Object,\n\tmsg: string,\n\tctx: Array<string>\n};\n\nexport type Chunk = {\n\tcontent: string,\n\tname:    string,\n};\n\nexport type Logs = {\n\tchunks:        Array<Chunk>,\n\tendTop:        boolean,\n\tendBottom:     boolean,\n\ttopChanged:    number,\n\tbottomChanged: number,\n};\n\nexport type LogsMessage = {\n\tsource: ?LogFile,\n\tchunk:  Array<Record>,\n};\n\nexport type LogFile = {\n\tname: string,\n\tlast: string,\n};\n"
  },
  {
    "path": "dashboard/assets/webpack.config.js",
    "content": "// Copyright 2017 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\nconst webpack = require('webpack');\nconst path = require('path');\n\nmodule.exports = {\n\tresolve: {\n\t\textensions: ['.js', '.jsx'],\n\t},\n\tentry:  './index',\n\toutput: {\n\t\tpath:     path.resolve(__dirname, ''),\n\t\tfilename: 'bundle.js',\n\t},\n\tplugins: [\n\t\tnew webpack.optimize.UglifyJsPlugin({\n\t\t\tcomments: false,\n\t\t\tmangle:   false,\n\t\t\tbeautify: true,\n\t\t}),\n\t\tnew webpack.DefinePlugin({\n\t\t\tPROD: process.env.NODE_ENV === 'production',\n\t\t}),\n\t],\n\tmodule: {\n\t\trules: [\n\t\t\t{\n\t\t\t\ttest:    /\\.jsx$/, // regexp for JSX files\n\t\t\t\texclude: /node_modules/,\n\t\t\t\tuse:     [ // order: from bottom to top\n\t\t\t\t\t{\n\t\t\t\t\t\tloader:  'babel-loader',\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tplugins: [ // order: from top to bottom\n\t\t\t\t\t\t\t\t// 'transform-decorators-legacy', // @withStyles, @withTheme\n\t\t\t\t\t\t\t\t'transform-class-properties', // static defaultProps\n\t\t\t\t\t\t\t\t'transform-flow-strip-types',\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tpresets: [ // order: from bottom to top\n\t\t\t\t\t\t\t\t'env',\n\t\t\t\t\t\t\t\t'react',\n\t\t\t\t\t\t\t\t'stage-0',\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// 'eslint-loader', // show errors not only in the editor, but also in the console\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttest: /font-awesome\\.css$/,\n\t\t\t\tuse:  [\n\t\t\t\t\t'style-loader',\n\t\t\t\t\t'css-loader',\n\t\t\t\t\tpath.resolve(__dirname, './fa-only-woff-loader.js'),\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttest: /\\.woff2?$/, // font-awesome icons\n\t\t\t\tuse:  'url-loader',\n\t\t\t},\n\t\t],\n\t},\n};\n"
  },
  {
    "path": "dashboard/assets.go",
    "content": "// Code generated by go-bindata. DO NOT EDIT.\n// sources:\n// assets/index.html\n// assets/bundle.js\n\npackage dashboard\n\nimport (\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\ntype asset struct {\n\tbytes  []byte\n\tinfo   os.FileInfo\n\tdigest [sha256.Size]byte\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\n//nolint:misspell\nvar _indexHtml = []byte(`<!DOCTYPE html>\n<html lang=\"en\" style=\"height: 100%\">\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n        <title>Go Ethereum Dashboard</title>\n        <link rel=\"shortcut icon\" type=\"image/ico\" href=\"https://ethereum.org/favicon.ico\" />\n        <style>\n            ::-webkit-scrollbar {\n                width: 16px;\n            }\n            ::-webkit-scrollbar-thumb {\n                background: #212121;\n            }\n            ::-webkit-scrollbar-corner {\n                background: transparent;\n            }\n        </style>\n    </head>\n    <body style=\"height: 100%; margin: 0\">\n        <div id=\"dashboard\" style=\"height: 100%\"></div>\n        <script src=\"bundle.js\"></script>\n    </body>\n</html>\n`)\n\nfunc indexHtmlBytes() ([]byte, error) {\n\treturn _indexHtml, nil\n}\n\nfunc indexHtml() (*asset, error) {\n\tbytes, err := indexHtmlBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"index.html\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0x22, 0xc8, 0x3d, 0x86, 0x2f, 0xb4, 0x6a, 0x1f, 0xda, 0xd, 0x54, 0x14, 0xa3, 0x6e, 0x80, 0x56, 0x28, 0xea, 0x44, 0xcf, 0xf5, 0xf2, 0xe, 0xad, 0x19, 0xf5, 0x93, 0xd6, 0x8d, 0x6d, 0x2f, 0x35}}\n\treturn a, nil\n}\n\n//nolint:misspell\nvar _bundleJs = []byte((((((((((`!function(modules) {\n    function __webpack_require__(moduleId) {\n        if (installedModules[moduleId]) return installedModules[moduleId].exports;\n        var module = installedModules[moduleId] = {\n            i: moduleId,\n            l: !1,\n            exports: {}\n        };\n        return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), \n        module.l = !0, module.exports;\n    }\n    var installedModules = {};\n    __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) {\n        __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, {\n            configurable: !1,\n            enumerable: !0,\n            get: getter\n        });\n    }, __webpack_require__.n = function(module) {\n        var getter = module && module.__esModule ? function() {\n            return module.default;\n        } : function() {\n            return module;\n        };\n        return __webpack_require__.d(getter, \"a\", getter), getter;\n    }, __webpack_require__.o = function(object, property) {\n        return Object.prototype.hasOwnProperty.call(object, property);\n    }, __webpack_require__.p = \"\", __webpack_require__(__webpack_require__.s = 375);\n}([ function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        \"production\" === process.env.NODE_ENV ? module.exports = __webpack_require__(376) : module.exports = __webpack_require__(377);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    (function(process) {\n        if (\"production\" !== process.env.NODE_ENV) {\n            var REACT_ELEMENT_TYPE = \"function\" == typeof Symbol && Symbol.for && Symbol.for(\"react.element\") || 60103, isValidElement = function(object) {\n                return \"object\" == typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;\n            };\n            module.exports = __webpack_require__(418)(isValidElement, !0);\n        } else module.exports = __webpack_require__(419)();\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports) {\n    function defaultSetTimout() {\n        throw new Error(\"setTimeout has not been defined\");\n    }\n    function defaultClearTimeout() {\n        throw new Error(\"clearTimeout has not been defined\");\n    }\n    function runTimeout(fun) {\n        if (cachedSetTimeout === setTimeout) return setTimeout(fun, 0);\n        if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) return cachedSetTimeout = setTimeout, \n        setTimeout(fun, 0);\n        try {\n            return cachedSetTimeout(fun, 0);\n        } catch (e) {\n            try {\n                return cachedSetTimeout.call(null, fun, 0);\n            } catch (e) {\n                return cachedSetTimeout.call(this, fun, 0);\n            }\n        }\n    }\n    function runClearTimeout(marker) {\n        if (cachedClearTimeout === clearTimeout) return clearTimeout(marker);\n        if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) return cachedClearTimeout = clearTimeout, \n        clearTimeout(marker);\n        try {\n            return cachedClearTimeout(marker);\n        } catch (e) {\n            try {\n                return cachedClearTimeout.call(null, marker);\n            } catch (e) {\n                return cachedClearTimeout.call(this, marker);\n            }\n        }\n    }\n    function cleanUpNextTick() {\n        draining && currentQueue && (draining = !1, currentQueue.length ? queue = currentQueue.concat(queue) : queueIndex = -1, \n        queue.length && drainQueue());\n    }\n    function drainQueue() {\n        if (!draining) {\n            var timeout = runTimeout(cleanUpNextTick);\n            draining = !0;\n            for (var len = queue.length; len; ) {\n                for (currentQueue = queue, queue = []; ++queueIndex < len; ) currentQueue && currentQueue[queueIndex].run();\n                queueIndex = -1, len = queue.length;\n            }\n            currentQueue = null, draining = !1, runClearTimeout(timeout);\n        }\n    }\n    function Item(fun, array) {\n        this.fun = fun, this.array = array;\n    }\n    function noop() {}\n    var cachedSetTimeout, cachedClearTimeout, process = module.exports = {};\n    !function() {\n        try {\n            cachedSetTimeout = \"function\" == typeof setTimeout ? setTimeout : defaultSetTimout;\n        } catch (e) {\n            cachedSetTimeout = defaultSetTimout;\n        }\n        try {\n            cachedClearTimeout = \"function\" == typeof clearTimeout ? clearTimeout : defaultClearTimeout;\n        } catch (e) {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    }();\n    var currentQueue, queue = [], draining = !1, queueIndex = -1;\n    process.nextTick = function(fun) {\n        var args = new Array(arguments.length - 1);\n        if (arguments.length > 1) for (var i = 1; i < arguments.length; i++) args[i - 1] = arguments[i];\n        queue.push(new Item(fun, args)), 1 !== queue.length || draining || runTimeout(drainQueue);\n    }, Item.prototype.run = function() {\n        this.fun.apply(null, this.array);\n    }, process.title = \"browser\", process.browser = !0, process.env = {}, process.argv = [], \n    process.version = \"\", process.versions = {}, process.on = noop, process.addListener = noop, \n    process.once = noop, process.off = noop, process.removeListener = noop, process.removeAllListeners = noop, \n    process.emit = noop, process.prependListener = noop, process.prependOnceListener = noop, \n    process.listeners = function(name) {\n        return [];\n    }, process.binding = function(name) {\n        throw new Error(\"process.binding is not supported\");\n    }, process.cwd = function() {\n        return \"/\";\n    }, process.chdir = function(dir) {\n        throw new Error(\"process.chdir is not supported\");\n    }, process.umask = function() {\n        return 0;\n    };\n}, function(module, exports, __webpack_require__) {\n    var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;\n    !function() {\n        \"use strict\";\n        function classNames() {\n            for (var classes = [], i = 0; i < arguments.length; i++) {\n                var arg = arguments[i];\n                if (arg) {\n                    var argType = typeof arg;\n                    if (\"string\" === argType || \"number\" === argType) classes.push(arg); else if (Array.isArray(arg)) classes.push(classNames.apply(null, arg)); else if (\"object\" === argType) for (var key in arg) hasOwn.call(arg, key) && arg[key] && classes.push(key);\n                }\n            }\n            return classes.join(\" \");\n        }\n        var hasOwn = {}.hasOwnProperty;\n        void 0 !== module && module.exports ? module.exports = classNames : (__WEBPACK_AMD_DEFINE_ARRAY__ = [], \n        void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n            return classNames;\n        }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n    }();\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return PRESENTATION_ATTRIBUTES;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return EVENT_ATTRIBUTES;\n    }), __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return SCALE_TYPES;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return LEGEND_TYPES;\n    }), __webpack_require__.d(__webpack_exports__, \"j\", function() {\n        return getDisplayName;\n    }), __webpack_require__.d(__webpack_exports__, \"h\", function() {\n        return findAllByType;\n    }), __webpack_require__.d(__webpack_exports__, \"i\", function() {\n        return findChildByType;\n    }), __webpack_require__.d(__webpack_exports__, \"k\", function() {\n        return getPresentationAttributes;\n    }), __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return filterEventAttributes;\n    }), __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return filterEventsOfChild;\n    }), __webpack_require__.d(__webpack_exports__, \"q\", function() {\n        return validateWidthHeight;\n    }), __webpack_require__.d(__webpack_exports__, \"n\", function() {\n        return isSsr;\n    }), __webpack_require__.d(__webpack_exports__, \"g\", function() {\n        return filterSvgElements;\n    }), __webpack_require__.d(__webpack_exports__, \"m\", function() {\n        return isChildrenEqual;\n    }), __webpack_require__.d(__webpack_exports__, \"p\", function() {\n        return renderByOrder;\n    }), __webpack_require__.d(__webpack_exports__, \"l\", function() {\n        return getReactEventByType;\n    }), __webpack_require__.d(__webpack_exports__, \"o\", function() {\n        return parseChildIndex;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isString__), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_8__PureRender__ = __webpack_require__(5), PRESENTATION_ATTRIBUTES = {\n        alignmentBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        angle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        baselineShift: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        clip: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        clipPath: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        clipRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        color: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        colorInterpolation: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        colorInterpolationFilters: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        colorProfile: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        colorRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        cursor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        direction: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"ltr\", \"rtl\", \"inherit\" ]),\n        display: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        dominantBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        enableBackground: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        fill: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        fillOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),\n        fillRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"nonzero\", \"evenodd\", \"inherit\" ]),\n        filter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        floodColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        floodOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),\n        font: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        fontFamily: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        fontSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        fontSizeAdjust: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        fontStretch: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"normal\", \"wider\", \"narrower\", \"ultra-condensed\", \"extra-condensed\", \"condensed\", \"semi-condensed\", \"semi-expanded\", \"expanded\", \"extra-expanded\", \"ultra-expanded\", \"inherit\" ]),\n        fontStyle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"normal\", \"italic\", \"oblique\", \"inherit\" ]),\n        fontVariant: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"normal\", \"small-caps\", \"inherit\" ]),\n        fontWeight: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"normal\", \"bold\", \"bolder\", \"lighter\", 100, 200, 300, 400, 500, 600, 700, 800, 900, \"inherit\" ]),\n        glyphOrientationHorizontal: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        glyphOrientationVertical: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        imageRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"auto\", \"optimizeSpeed\", \"optimizeQuality\", \"inherit\" ]),\n        kerning: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        letterSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        lightingColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        markerEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        markerMid: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        markerStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        mask: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        opacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        overflow: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"visible\", \"hidden\", \"scroll\", \"auto\", \"inherit\" ]),\n        pointerEvents: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"visiblePainted\", \"visibleFill\", \"visibleStroke\", \"visible\", \"painted\", \"fill\", \"stroke\", \"all\", \"none\", \"inherit\" ]),\n        shapeRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"auto\", \"optimizeSpeed\", \"crispEdges\", \"geometricPrecision\", \"inherit\" ]),\n        stopColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        stopOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        stroke: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        strokeDasharray: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        strokeDashoffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        strokeLinecap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"butt\", \"round\", \"square\", \"inherit\" ]),\n        strokeLinejoin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"miter\", \"round\", \"bevel\", \"inherit\" ]),\n        strokeMiterlimit: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        strokeOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        strokeWidth: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        textAnchor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"start\", \"middle\", \"end\", \"inherit\" ]),\n        textDecoration: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"none\", \"underline\", \"overline\", \"line-through\", \"blink\", \"inherit\" ]),\n        textRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"auto\", \"optimizeSpeed\", \"optimizeLegibility\", \"geometricPrecision\", \"inherit\" ]),\n        unicodeBidi: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"normal\", \"embed\", \"bidi-override\", \"inherit\" ]),\n        visibility: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"visible\", \"hidden\", \"collapse\", \"inherit\" ]),\n        wordSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        writingMode: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"lr-tb\", \"rl-tb\", \"tb-rl\", \"lr\", \"rl\", \"tb\", \"inherit\" ]),\n        transform: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,\n        width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        dx: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        dy: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        x: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        y: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        r: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        radius: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ])\n    }, EVENT_ATTRIBUTES = {\n        onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onMouseOver: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onMouseOut: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onTouchEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onTouchMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onTouchStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onTouchCancel: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func\n    }, REACT_BROWSER_EVENT_MAP = {\n        click: \"onClick\",\n        mousedown: \"onMouseDown\",\n        mouseup: \"onMouseUp\",\n        mouseover: \"onMouseOver\",\n        mousemove: \"onMouseMove\",\n        mouseout: \"onMouseOut\",\n        mouseenter: \"onMouseEnter\",\n        mouseleave: \"onMouseLeave\",\n        touchcancel: \"onTouchCancel\",\n        touchend: \"onTouchEnd\",\n        touchmove: \"onTouchMove\",\n        touchstart: \"onTouchStart\"\n    }, SCALE_TYPES = [ \"auto\", \"linear\", \"pow\", \"sqrt\", \"log\", \"identity\", \"time\", \"band\", \"point\", \"ordinal\", \"quantile\", \"quantize\", \"utcTime\", \"sequential\", \"threshold\" ], LEGEND_TYPES = [ \"plainline\", \"line\", \"square\", \"rect\", \"circle\", \"cross\", \"diamond\", \"star\", \"triangle\", \"wye\", \"none\" ], getDisplayName = function(Comp) {\n        return Comp ? \"string\" == typeof Comp ? Comp : Comp.displayName || Comp.name || \"Component\" : \"\";\n    }, findAllByType = function(children, type) {\n        var result = [], types = [];\n        return types = __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(type) ? type.map(function(t) {\n            return getDisplayName(t);\n        }) : [ getDisplayName(type) ], __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(child) {\n            var childType = child && child.type && (child.type.displayName || child.type.name);\n            -1 !== types.indexOf(childType) && result.push(child);\n        }), result;\n    }, findChildByType = function(children, type) {\n        var result = findAllByType(children, type);\n        return result && result[0];\n    }, getPresentationAttributes = function(el) {\n        if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null;\n        var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el;\n        if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null;\n        var out = null;\n        for (var i in props) ({}).hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i] && (out || (out = {}), \n        out[i] = props[i]);\n        return out;\n    }, getEventHandlerOfElement = function(originalHandler, props) {\n        return function(e) {\n            return originalHandler(props, e), null;\n        };\n    }, filterEventAttributes = function(el, newHandler) {\n        var wrapCallback = arguments.length > 2 && void 0 !== arguments[2] && arguments[2];\n        if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null;\n        var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el;\n        if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null;\n        var out = null;\n        for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && (out || (out = {}), \n        out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i]));\n        return out;\n    }, getEventHandlerOfChild = function(originalHandler, data, index) {\n        return function(e) {\n            return originalHandler(data, index, e), null;\n        };\n    }, filterEventsOfChild = function(props, data, index) {\n        if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null;\n        var out = null;\n        for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(props[i]) && (out || (out = {}), \n        out[i] = getEventHandlerOfChild(props[i], data, index));\n        return out;\n    }, validateWidthHeight = function(el) {\n        if (!el || !el.props) return !1;\n        var _el$props = el.props, width = _el$props.width, height = _el$props.height;\n        return !(!Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(width) || width <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(height) || height <= 0);\n    }, isSsr = function() {\n        return !(\"undefined\" != typeof window && window.document && window.document.createElement && window.setTimeout);\n    }, SVG_TAGS = [ \"a\", \"altGlyph\", \"altGlyphDef\", \"altGlyphItem\", \"animate\", \"animateColor\", \"animateMotion\", \"animateTransform\", \"circle\", \"clipPath\", \"color-profile\", \"cursor\", \"defs\", \"desc\", \"ellipse\", \"feBlend\", \"feColormatrix\", \"feComponentTransfer\", \"feComposite\", \"feConvolveMatrix\", \"feDiffuseLighting\", \"feDisplacementMap\", \"feDistantLight\", \"feFlood\", \"feFuncA\", \"feFuncB\", \"feFuncG\", \"feFuncR\", \"feGaussianBlur\", \"feImage\", \"feMerge\", \"feMergeNode\", \"feMorphology\", \"feOffset\", \"fePointLight\", \"feSpecularLighting\", \"feSpotLight\", \"feTile\", \"feTurbulence\", \"filter\", \"font\", \"font-face\", \"font-face-format\", \"font-face-name\", \"font-face-url\", \"foreignObject\", \"g\", \"glyph\", \"glyphRef\", \"hkern\", \"image\", \"line\", \"lineGradient\", \"marker\", \"mask\", \"metadata\", \"missing-glyph\", \"mpath\", \"path\", \"pattern\", \"polygon\", \"polyline\", \"radialGradient\", \"rect\", \"script\", \"set\", \"stop\", \"style\", \"svg\", \"switch\", \"symbol\", \"text\", \"textPath\", \"title\", \"tref\", \"tspan\", \"use\", \"view\", \"vkern\" ], isSvgElement = function(child) {\n        return child && child.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(child.type) && SVG_TAGS.indexOf(child.type) >= 0;\n    }, filterSvgElements = function(children) {\n        var svgElements = [];\n        return __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(entry) {\n            entry && entry.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0 && svgElements.push(entry);\n        }), svgElements;\n    }, isSingleChildEqual = function(nextChild, prevChild) {\n        if (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) return !0;\n        if (!__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && !__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) {\n            var _ref = nextChild.props || {}, nextChildren = _ref.children, nextProps = _objectWithoutProperties(_ref, [ \"children\" ]), _ref2 = prevChild.props || {}, prevChildren = _ref2.children, prevProps = _objectWithoutProperties(_ref2, [ \"children\" ]);\n            return nextChildren && prevChildren ? Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren) : !nextChildren && !prevChildren && Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps);\n        }\n        return !1;\n    }, isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) {\n        if (nextChildren === prevChildren) return !0;\n        if (__WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren) !== __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(prevChildren)) return !1;\n        var count = __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren);\n        if (0 === count) return !0;\n        if (1 === count) return isSingleChildEqual(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChildren) ? nextChildren[0] : nextChildren, __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChildren) ? prevChildren[0] : prevChildren);\n        for (var i = 0; i < count; i++) {\n            var nextChild = nextChildren[i], prevChild = prevChildren[i];\n            if (__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChild) || __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChild)) {\n                if (!isChildrenEqual(nextChild, prevChild)) return !1;\n            } else if (!isSingleChildEqual(nextChild, prevChild)) return !1;\n        }\n        return !0;\n    }, renderByOrder = function(children, renderMap) {\n        var elements = [], record = {};\n        return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(child, index) {\n            if (child && isSvgElement(child)) elements.push(child); else if (child && renderMap[getDisplayName(child.type)]) {\n                var displayName = getDisplayName(child.type), _renderMap$displayNam = renderMap[displayName], handler = _renderMap$displayNam.handler, once = _renderMap$displayNam.once;\n                if (once && !record[displayName] || !once) {\n                    var results = handler(child, displayName, index);\n                    __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(results) ? elements = [ elements ].concat(_toConsumableArray(results)) : elements.push(results), \n                    record[displayName] = !0;\n                }\n            }\n        }), elements;\n    }, getReactEventByType = function(e) {\n        var type = e && e.type;\n        return type && REACT_BROWSER_EVENT_MAP[type] ? REACT_BROWSER_EVENT_MAP[type] : null;\n    }, parseChildIndex = function(child, children) {\n        var result = -1;\n        return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(entry, index) {\n            entry === child && (result = index);\n        }), result;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function shallowEqual(a, b) {\n        for (var key in a) if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) return !1;\n        for (var _key in b) if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) return !1;\n        return !0;\n    }\n    function shouldComponentUpdate(props, state) {\n        return !shallowEqual(props, this.props) || !shallowEqual(state, this.state);\n    }\n    function pureRenderDecorator(component) {\n        component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n    }\n    __webpack_exports__.b = shallowEqual, __webpack_exports__.a = pureRenderDecorator;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _assign = __webpack_require__(222), _assign2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_assign);\n    exports.default = _assign2.default || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0, exports.default = function(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    };\n}, function(module, exports, __webpack_require__) {\n    function isFunction(value) {\n        if (!isObject(value)) return !1;\n        var tag = baseGetTag(value);\n        return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n    var baseGetTag = __webpack_require__(41), isObject = __webpack_require__(32), asyncTag = \"[object AsyncFunction]\", funcTag = \"[object Function]\", genTag = \"[object GeneratorFunction]\", proxyTag = \"[object Proxy]\";\n    module.exports = isFunction;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"j\", function() {\n        return mathSign;\n    }), __webpack_require__.d(__webpack_exports__, \"i\", function() {\n        return isPercent;\n    }), __webpack_require__.d(__webpack_exports__, \"h\", function() {\n        return isNumber;\n    }), __webpack_require__.d(__webpack_exports__, \"g\", function() {\n        return isNumOrStr;\n    }), __webpack_require__.d(__webpack_exports__, \"k\", function() {\n        return uniqueId;\n    }), __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return getPercentValue;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return getAnyElementOfObject;\n    }), __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return hasDuplicate;\n    }), __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return interpolateNumber;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return findEntryInArray;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return getLinearRegression;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_0_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_get__), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__ = __webpack_require__(272), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__), __WEBPACK_IMPORTED_MODULE_4_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isString__), mathSign = function(value) {\n        return 0 === value ? 0 : value > 0 ? 1 : -1;\n    }, isPercent = function(value) {\n        return __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value) && value.indexOf(\"%\") === value.length - 1;\n    }, isNumber = function(value) {\n        return __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default()(value) && !__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value);\n    }, isNumOrStr = function(value) {\n        return isNumber(value) || __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value);\n    }, idCounter = 0, uniqueId = function(prefix) {\n        var id = ++idCounter;\n        return \"\" + (prefix || \"\") + id;\n    }, getPercentValue = function(percent, totalValue) {\n        var defaultValue = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, validate = arguments.length > 3 && void 0 !== arguments[3] && arguments[3];\n        if (!isNumber(percent) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(percent)) return defaultValue;\n        var value = void 0;\n        if (isPercent(percent)) {\n            var index = percent.indexOf(\"%\");\n            value = totalValue * parseFloat(percent.slice(0, index)) / 100;\n        } else value = +percent;\n        return __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value) && (value = defaultValue), \n        validate && value > totalValue && (value = totalValue), value;\n    }, getAnyElementOfObject = function(obj) {\n        if (!obj) return null;\n        var keys = Object.keys(obj);\n        return keys && keys.length ? obj[keys[0]] : null;\n    }, hasDuplicate = function(ary) {\n        if (!__WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default()(ary)) return !1;\n        for (var len = ary.length, cache = {}, i = 0; i < len; i++) {\n            if (cache[ary[i]]) return !0;\n            cache[ary[i]] = !0;\n        }\n        return !1;\n    }, interpolateNumber = function(numberA, numberB) {\n        return isNumber(numberA) && isNumber(numberB) ? function(t) {\n            return numberA + t * (numberB - numberA);\n        } : function() {\n            return numberB;\n        };\n    }, findEntryInArray = function(ary, specifiedKey, specifiedValue) {\n        return ary && ary.length ? ary.find(function(entry) {\n            return entry && __WEBPACK_IMPORTED_MODULE_0_lodash_get___default()(entry, specifiedKey) === specifiedValue;\n        }) : null;\n    }, getLinearRegression = function(data) {\n        if (!data || !data.length) return null;\n        for (var len = data.length, xsum = 0, ysum = 0, xysum = 0, xxsum = 0, xmin = 1 / 0, xmax = -1 / 0, i = 0; i < len; i++) xsum += data[i].cx, \n        ysum += data[i].cy, xysum += data[i].cx * data[i].cy, xxsum += data[i].cx * data[i].cx, \n        xmin = Math.min(xmin, data[i].cx), xmax = Math.max(xmax, data[i].cx);\n        var a = len * xxsum != xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0;\n        return {\n            xmin: xmin,\n            xmax: xmax,\n            a: a,\n            b: (ysum - a * xsum) / len\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function getDefaultTheme() {\n            return defaultTheme || (defaultTheme = (0, _createMuiTheme2.default)());\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.sheetsManager = void 0;\n        var _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _map = __webpack_require__(440), _map2 = _interopRequireDefault(_map), _minSafeInteger = __webpack_require__(456), _minSafeInteger2 = _interopRequireDefault(_minSafeInteger), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _hoistNonReactStatics = __webpack_require__(162), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _getDisplayName = __webpack_require__(244), _getDisplayName2 = _interopRequireDefault(_getDisplayName), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _contextTypes = __webpack_require__(459), _contextTypes2 = _interopRequireDefault(_contextTypes), _jss = __webpack_require__(246), _ns = __webpack_require__(245), ns = function(obj) {\n            if (obj && obj.__esModule) return obj;\n            var newObj = {};\n            if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);\n            return newObj.default = obj, newObj;\n        }(_ns), _jssPreset = __webpack_require__(481), _jssPreset2 = _interopRequireDefault(_jssPreset), _createMuiTheme = __webpack_require__(161), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _themeListener = __webpack_require__(160), _themeListener2 = _interopRequireDefault(_themeListener), _createGenerateClassName = __webpack_require__(494), _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName), _getStylesCreator = __webpack_require__(495), _getStylesCreator2 = _interopRequireDefault(_getStylesCreator), jss = (0, \n        _jss.create)((0, _jssPreset2.default)()), generateClassName = (0, _createGenerateClassName2.default)(), indexCounter = _minSafeInteger2.default, sheetsManager = exports.sheetsManager = new _map2.default(), noopTheme = {}, defaultTheme = void 0, withStyles = function(stylesOrCreator) {\n            var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};\n            return function(Component) {\n                var _options$withTheme = options.withTheme, withTheme = void 0 !== _options$withTheme && _options$withTheme, _options$flip = options.flip, flip = void 0 === _options$flip ? null : _options$flip, name = options.name, styleSheetOptions = (0, \n                _objectWithoutProperties3.default)(options, [ \"withTheme\", \"flip\", \"name\" ]), stylesCreator = (0, \n                _getStylesCreator2.default)(stylesOrCreator), listenToTheme = stylesCreator.themingEnabled || withTheme || \"string\" == typeof name;\n                indexCounter += 1, stylesCreator.options.index = indexCounter, \"production\" !== process.env.NODE_ENV && (0, \n                _warning2.default)(indexCounter < 0, [ \"Material-UI: you might have a memory leak.\", \"The indexCounter is not supposed to grow that much.\" ].join(\" \"));\n                var WithStyles = function(_React$Component) {\n                    function WithStyles(props, context) {\n                        (0, _classCallCheck3.default)(this, WithStyles);\n                        var _this = (0, _possibleConstructorReturn3.default)(this, (WithStyles.__proto__ || (0, \n                        _getPrototypeOf2.default)(WithStyles)).call(this, props, context));\n                        _this.state = {}, _this.disableStylesGeneration = !1, _this.jss = null, _this.sheetOptions = null, \n                        _this.sheetsManager = sheetsManager, _this.stylesCreatorSaved = null, _this.theme = null, \n                        _this.unsubscribeId = null, _this.jss = _this.context[ns.jss] || jss;\n                        var muiThemeProviderOptions = _this.context.muiThemeProviderOptions;\n                        return muiThemeProviderOptions && (muiThemeProviderOptions.sheetsManager && (_this.sheetsManager = muiThemeProviderOptions.sheetsManager), \n                        _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration), \n                        _this.stylesCreatorSaved = stylesCreator, _this.sheetOptions = (0, _extends3.default)({\n                            generateClassName: generateClassName\n                        }, _this.context[ns.sheetOptions]), _this.theme = listenToTheme ? _themeListener2.default.initial(context) || getDefaultTheme() : noopTheme, \n                        _this;\n                    }\n                    return (0, _inherits3.default)(WithStyles, _React$Component), (0, _createClass3.default)(WithStyles, [ {\n                        key: \"componentWillMount\",\n                        value: function() {\n                            this.attach(this.theme);\n                        }\n                    }, {\n                        key: \"componentDidMount\",\n                        value: function() {\n                            var _this2 = this;\n                            listenToTheme && (this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(theme) {\n                                var oldTheme = _this2.theme;\n                                _this2.theme = theme, _this2.attach(_this2.theme), _this2.setState({}, function() {\n                                    _this2.detach(oldTheme);\n                                });\n                            }));\n                        }\n                    }, {\n                        key: \"componentWillReceiveProps\",\n                        value: function() {\n                            this.stylesCreatorSaved !== stylesCreator && \"production\" !== process.env.NODE_ENV && (this.detach(this.theme), \n                            this.stylesCreatorSaved = stylesCreator, this.attach(this.theme));\n                        }\n                    }, {\n                        key: \"componentWillUnmount\",\n                        value: function() {\n                            this.detach(this.theme), null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId);\n                        }\n                    }, {\n                        key: \"attach\",\n                        value: function(theme) {\n                            if (!this.disableStylesGeneration) {\n                                var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved);\n                                sheetManager || (sheetManager = new _map2.default(), this.sheetsManager.set(stylesCreatorSaved, sheetManager));\n                                var sheetManagerTheme = sheetManager.get(theme);\n                                if (sheetManagerTheme || (sheetManagerTheme = {\n                                    refs: 0,\n                                    sheet: null\n                                }, sheetManager.set(theme, sheetManagerTheme)), 0 === sheetManagerTheme.refs) {\n                                    var styles = stylesCreatorSaved.create(theme, name), meta = name;\n                                    \"production\" === process.env.NODE_ENV || meta || (meta = (0, _getDisplayName2.default)(Component));\n                                    var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({\n                                        meta: meta,\n                                        classNamePrefix: meta,\n                                        flip: \"boolean\" == typeof flip ? flip : \"rtl\" === theme.direction,\n                                        link: !1\n                                    }, this.sheetOptions, stylesCreatorSaved.options, {\n                                        name: name\n                                    }, styleSheetOptions));\n                                    sheetManagerTheme.sheet = sheet, sheet.attach();\n                                    var sheetsRegistry = this.context[ns.sheetsRegistry];\n                                    sheetsRegistry && sheetsRegistry.add(sheet);\n                                }\n                                sheetManagerTheme.refs += 1;\n                            }\n                        }\n                    }, {\n                        key: \"detach\",\n                        value: function(theme) {\n                            if (!this.disableStylesGeneration) {\n                                var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved), sheetManagerTheme = sheetManager.get(theme);\n                                if (sheetManagerTheme.refs -= 1, 0 === sheetManagerTheme.refs) {\n                                    sheetManager.delete(theme), this.jss.removeStyleSheet(sheetManagerTheme.sheet);\n                                    var sheetsRegistry = this.context[ns.sheetsRegistry];\n                                    sheetsRegistry && sheetsRegistry.remove(sheetManagerTheme.sheet);\n                                }\n                            }\n                        }\n                    }, {\n                        key: \"render\",\n                        value: function() {\n                            var _this3 = this, _props = this.props, classesProp = _props.classes, innerRef = _props.innerRef, other = (0, \n                            _objectWithoutProperties3.default)(_props, [ \"classes\", \"innerRef\" ]), classes = void 0, renderedClasses = {};\n                            if (!this.disableStylesGeneration) {\n                                var sheetManager = this.sheetsManager.get(this.stylesCreatorSaved), sheetsManagerTheme = sheetManager.get(this.theme);\n                                renderedClasses = sheetsManagerTheme.sheet.classes;\n                            }\n                            classes = classesProp ? (0, _extends3.default)({}, renderedClasses, (0, _keys2.default)(classesProp).reduce(function(accumulator, key) {\n                                return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(renderedClasses[key] || _this3.disableStylesGeneration, [ \"Material-UI: the key ` + (\"`\" + `\" + key + \"`)) + (\"`\" + (` provided to the classes property is not implemented in \" + (0, \n                                _getDisplayName2.default)(Component) + \".\", \"You can only override one of the following: \" + (0, \n                                _keys2.default)(renderedClasses).join(\",\") ].join(\"\\n\")), \"production\" !== process.env.NODE_ENV && (0, \n                                _warning2.default)(!classesProp[key] || \"string\" == typeof classesProp[key], [ \"Material-UI: the key ` + \"`\"))) + ((`\" + key + \"` + (\"`\" + ` provided to the classes property is not valid for \" + (0, \n                                _getDisplayName2.default)(Component) + \".\", \"You need to provide a non empty string instead of: \" + classesProp[key] + \".\" ].join(\"\\n\")), \n                                classesProp[key] && (accumulator[key] = renderedClasses[key] + \" \" + classesProp[key]), \n                                accumulator;\n                            }, {})) : renderedClasses;\n                            var more = {};\n                            return withTheme && (more.theme = this.theme), _react2.default.createElement(Component, (0, \n                            _extends3.default)({\n                                classes: classes\n                            }, more, other, {\n                                ref: innerRef\n                            }));\n                        }\n                    } ]), WithStyles;\n                }(_react2.default.Component);\n                return WithStyles.propTypes = \"production\" !== process.env.NODE_ENV ? {\n                    classes: _propTypes2.default.object,\n                    innerRef: _propTypes2.default.func\n                } : {}, WithStyles.contextTypes = (0, _extends3.default)({\n                    muiThemeProviderOptions: _propTypes2.default.object\n                }, _contextTypes2.default, listenToTheme ? _themeListener2.default.contextTypes : {}), \n                \"production\" !== process.env.NODE_ENV && (WithStyles.displayName = (0, _wrapDisplayName2.default)(Component, \"WithStyles\")), \n                (0, _hoistNonReactStatics2.default)(WithStyles, Component), \"production\" !== process.env.NODE_ENV && (WithStyles.Naked = Component, \n                WithStyles.options = options), WithStyles;\n            };\n        };\n        exports.default = withStyles;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        var warning = function() {};\n        \"production\" !== process.env.NODE_ENV && (warning = function(condition, format, args) {\n            var len = arguments.length;\n            args = new Array(len > 2 ? len - 2 : 0);\n            for (var key = 2; key < len; key++) args[key - 2] = arguments[key];\n            if (void 0 === format) throw new Error(\"`)) + (\"`\" + (`warning(condition, format, ...args)` + \"`\")))) + (((` requires a warning message argument\");\n            if (format.length < 10 || /^[s\\W]*$/.test(format)) throw new Error(\"The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: \" + format);\n            if (!condition) {\n                var argIndex = 0, message = \"Warning: \" + format.replace(/%s/g, function() {\n                    return args[argIndex++];\n                });\n                \"undefined\" != typeof console && console.error(message);\n                try {\n                    throw new Error(message);\n                } catch (x) {}\n            }\n        }), module.exports = warning;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_defineProperty);\n    exports.default = function(obj, key, value) {\n        return key in obj ? (0, _defineProperty2.default)(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    };\n}, function(module, exports) {\n    var isArray = Array.isArray;\n    module.exports = isArray;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function Layer(props) {\n        var children = props.children, className = props.className, others = _objectWithoutProperties(props, [ \"children\", \"className\" ]), layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()(\"recharts-layer\", className);\n        return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"g\", _extends({\n            className: layerClass\n        }, others), children);\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, propTypes = {\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ])\n    };\n    Layer.propTypes = propTypes, __webpack_exports__.a = Layer;\n}, function(module, exports, __webpack_require__) {\n    var global = __webpack_require__(167), core = __webpack_require__(168), hide = __webpack_require__(266), redefine = __webpack_require__(581), ctx = __webpack_require__(584), $export = function(type, name, source) {\n        var key, own, out, exp, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {}).prototype, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype || (exports.prototype = {});\n        IS_GLOBAL && (source = name);\n        for (key in source) own = !IS_FORCED && target && void 0 !== target[key], out = (own ? target : source)[key], \n        exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && \"function\" == typeof out ? ctx(Function.call, out) : out, \n        target && redefine(target, key, out, type & $export.U), exports[key] != out && hide(exports, key, exp), \n        IS_PROTO && expProto[key] != out && (expProto[key] = out);\n    };\n    global.core = core, $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, \n    $export.B = 16, $export.W = 32, $export.U = 64, $export.R = 128, module.exports = $export;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    __webpack_require__.d(__webpack_exports__, \"w\", function() {\n        return getValueByDataKey;\n    }), __webpack_require__.d(__webpack_exports__, \"n\", function() {\n        return getDomainOfDataByKey;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return calculateActiveTickIndex;\n    }), __webpack_require__.d(__webpack_exports__, \"r\", function() {\n        return getMainColorOfGraphicItem;\n    }), __webpack_require__.d(__webpack_exports__, \"q\", function() {\n        return getLegendProps;\n    }), __webpack_require__.d(__webpack_exports__, \"i\", function() {\n        return getBarSizeList;\n    }), __webpack_require__.d(__webpack_exports__, \"h\", function() {\n        return getBarPosition;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return appendOffsetOfLegend;\n    }), __webpack_require__.d(__webpack_exports__, \"z\", function() {\n        return parseErrorBarsOfAxis;\n    }), __webpack_require__.d(__webpack_exports__, \"o\", function() {\n        return getDomainOfItemsWithSameAxis;\n    }), __webpack_require__.d(__webpack_exports__, \"x\", function() {\n        return isCategorialAxis;\n    }), __webpack_require__.d(__webpack_exports__, \"m\", function() {\n        return getCoordinatesOfGrid;\n    }), __webpack_require__.d(__webpack_exports__, \"u\", function() {\n        return getTicksOfAxis;\n    }), __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return combineEventHandlers;\n    }), __webpack_require__.d(__webpack_exports__, \"A\", function() {\n        return parseScale;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return checkDomainOfScale;\n    }), __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return findPositionOfBar;\n    }), __webpack_require__.d(__webpack_exports__, \"C\", function() {\n        return truncateByDomain;\n    }), __webpack_require__.d(__webpack_exports__, \"s\", function() {\n        return getStackGroupsByAxisId;\n    }), __webpack_require__.d(__webpack_exports__, \"v\", function() {\n        return getTicksOfScale;\n    }), __webpack_require__.d(__webpack_exports__, \"l\", function() {\n        return getCateCoordinateOfLine;\n    }), __webpack_require__.d(__webpack_exports__, \"k\", function() {\n        return getCateCoordinateOfBar;\n    }), __webpack_require__.d(__webpack_exports__, \"j\", function() {\n        return getBaseValueOfBar;\n    }), __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return detectReferenceElementsDomain;\n    }), __webpack_require__.d(__webpack_exports__, \"t\", function() {\n        return getStackedDataOfItem;\n    }), __webpack_require__.d(__webpack_exports__, \"p\", function() {\n        return getDomainOfStackGroups;\n    }), __webpack_require__.d(__webpack_exports__, \"B\", function() {\n        return parseSpecifiedDomain;\n    }), __webpack_require__.d(__webpack_exports__, \"D\", function() {\n        return validateCoordinateInRange;\n    }), __webpack_require__.d(__webpack_exports__, \"g\", function() {\n        return getBandSizeOfAxis;\n    }), __webpack_require__.d(__webpack_exports__, \"y\", function() {\n        return parseDomainOfCategoryAxis;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_3_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isString__), __WEBPACK_IMPORTED_MODULE_4_lodash_max__ = __webpack_require__(841), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_max__), __WEBPACK_IMPORTED_MODULE_5_lodash_min__ = __webpack_require__(328), __WEBPACK_IMPORTED_MODULE_5_lodash_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_lodash_min__), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__ = __webpack_require__(842), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_9_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_9_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9_lodash_get__), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_10_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_11_recharts_scale__ = __webpack_require__(844), __WEBPACK_IMPORTED_MODULE_12_d3_scale__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__), \n    __webpack_require__(331)), __WEBPACK_IMPORTED_MODULE_13_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_14__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__ = __webpack_require__(364), __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__ = __webpack_require__(365), __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__ = __webpack_require__(366), __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__ = __webpack_require__(95), __WEBPACK_IMPORTED_MODULE_19__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_20__ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, getValueByDataKey = function(obj, dataKey, defaultValue) {\n        return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(obj) || __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(dataKey) ? defaultValue : Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(dataKey) ? __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(obj, dataKey, defaultValue) : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(dataKey) ? dataKey(obj) : defaultValue;\n    }, getDomainOfDataByKey = function(data, key, type, filterNil) {\n        var flattenData = __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default()(data, function(entry) {\n            return getValueByDataKey(entry, key);\n        });\n        if (\"number\" === type) {\n            var domain = flattenData.filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h);\n            return [ Math.min.apply(null, domain), Math.max.apply(null, domain) ];\n        }\n        return (filterNil ? flattenData.filter(function(entry) {\n            return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry);\n        }) : flattenData).map(function(entry) {\n            return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(entry) ? entry : \"\";\n        });\n    }, calculateActiveTickIndex = function(coordinate, ticks, unsortedTicks, axis) {\n        var index = -1, len = ticks.length;\n        if (len > 1) {\n            if (axis && \"angleAxis\" === axis.axisType && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) for (var range = axis.range, i = 0; i < len; i++) {\n                var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate, cur = unsortedTicks[i].coordinate, after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate, sameDirectionCoord = void 0;\n                if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(cur - before) !== Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur)) {\n                    var diffInterval = [];\n                    if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur) === Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[1] - range[0])) {\n                        sameDirectionCoord = after;\n                        var curInRange = cur + range[1] - range[0];\n                        diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2), diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2);\n                    } else {\n                        sameDirectionCoord = before;\n                        var afterInRange = after + range[1] - range[0];\n                        diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2), diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2);\n                    }\n                    var sameInterval = [ Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2) ];\n                    if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) {\n                        index = unsortedTicks[i].index;\n                        break;\n                    }\n                } else {\n                    var min = Math.min(before, after), max = Math.max(before, after);\n                    if (coordinate > (min + cur) / 2 && coordinate <= (max + cur) / 2) {\n                        index = unsortedTicks[i].index;\n                        break;\n                    }\n                }\n            } else for (var _i = 0; _i < len; _i++) if (0 === _i && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) {\n                index = ticks[_i].index;\n                break;\n            }\n        } else index = 0;\n        return index;\n    }, getMainColorOfGraphicItem = function(item) {\n        var displayName = item.type.displayName, result = void 0;\n        switch (displayName) {\n          case \"Line\":\n          case \"Area\":\n          case \"Radar\":\n            result = item.props.stroke;\n            break;\n\n          default:\n            result = item.props.fill;\n        }\n        return result;\n    }, getLegendProps = function(_ref) {\n        var children = _ref.children, formatedGraphicalItems = _ref.formatedGraphicalItems, legendWidth = _ref.legendWidth, legendContent = _ref.legendContent, legendItem = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a);\n        if (!legendItem) return null;\n        var legendData = void 0;\n        return legendData = legendItem.props && legendItem.props.payload ? legendItem.props && legendItem.props.payload : \"children\" === legendContent ? (formatedGraphicalItems || []).reduce(function(result, _ref2) {\n            var item = _ref2.item, props = _ref2.props, data = props.sectors || props.data || [];\n            return result.concat(data.map(function(entry) {\n                return {\n                    type: legendItem.props.iconType || item.props.legendType,\n                    value: entry.name,\n                    color: entry.fill,\n                    payload: entry\n                };\n            }));\n        }, []) : (formatedGraphicalItems || []).map(function(_ref3) {\n            var item = _ref3.item, _item$props = item.props, dataKey = _item$props.dataKey, name = _item$props.name, legendType = _item$props.legendType;\n            return {\n                inactive: _item$props.hide,\n                dataKey: dataKey,\n                type: legendItem.props.iconType || legendType || \"square\",\n                color: getMainColorOfGraphicItem(item),\n                value: name || dataKey,\n                payload: item.props\n            };\n        }), _extends({}, legendItem.props, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a.getWithHeight(legendItem, legendWidth), {\n            payload: legendData,\n            item: legendItem\n        });\n    }, getBarSizeList = function(_ref4) {\n        var globalSize = _ref4.barSize, _ref4$stackGroups = _ref4.stackGroups, stackGroups = void 0 === _ref4$stackGroups ? {} : _ref4$stackGroups;\n        if (!stackGroups) return {};\n        for (var result = {}, numericAxisIds = Object.keys(stackGroups), i = 0, len = numericAxisIds.length; i < len; i++) for (var sgs = stackGroups[numericAxisIds[i]].stackGroups, stackIds = Object.keys(sgs), j = 0, sLen = stackIds.length; j < sLen; j++) {\n            var _sgs$stackIds$j = sgs[stackIds[j]], items = _sgs$stackIds$j.items, cateAxisId = _sgs$stackIds$j.cateAxisId, barItems = items.filter(function(item) {\n                return Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.j)(item.type).indexOf(\"Bar\") >= 0;\n            });\n            if (barItems && barItems.length) {\n                var selfSize = barItems[0].props.barSize, cateId = barItems[0].props[cateAxisId];\n                result[cateId] || (result[cateId] = []), result[cateId].push({\n                    item: barItems[0],\n                    stackList: barItems.slice(1),\n                    barSize: __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(selfSize) ? globalSize : selfSize\n                });\n            }\n        }\n        return result;\n    }, getBarPosition = function(_ref5) {\n        var barGap = _ref5.barGap, barCategoryGap = _ref5.barCategoryGap, bandSize = _ref5.bandSize, _ref5$sizeList = _ref5.sizeList, sizeList = void 0 === _ref5$sizeList ? [] : _ref5$sizeList, maxBarSize = _ref5.maxBarSize, len = sizeList.length;\n        if (len < 1) return null;\n        var realBarGap = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barGap, bandSize, 0, !0), result = void 0;\n        if (sizeList[0].barSize === +sizeList[0].barSize) {\n            var useFull = !1, fullBarSize = bandSize / len, sum = sizeList.reduce(function(res, entry) {\n                return res + entry.barSize || 0;\n            }, 0);\n            sum += (len - 1) * realBarGap, sum >= bandSize && (sum -= (len - 1) * realBarGap, \n            realBarGap = 0), sum >= bandSize && fullBarSize > 0 && (useFull = !0, fullBarSize *= .9, \n            sum = len * fullBarSize);\n            var offset = (bandSize - sum) / 2 >> 0, prev = {\n                offset: offset - realBarGap,\n                size: 0\n            };\n            result = sizeList.reduce(function(res, entry) {\n                var newRes = [].concat(_toConsumableArray(res), [ {\n                    item: entry.item,\n                    position: {\n                        offset: prev.offset + prev.size + realBarGap,\n                        size: useFull ? fullBarSize : entry.barSize\n                    }\n                } ]);\n                return prev = newRes[newRes.length - 1].position, entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) {\n                    newRes.push({\n                        item: item,\n                        position: prev\n                    });\n                }), newRes;\n            }, []);\n        } else {\n            var _offset = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barCategoryGap, bandSize, 0, !0);\n            bandSize - 2 * _offset - (len - 1) * realBarGap <= 0 && (realBarGap = 0);\n            var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len;\n            originalSize > 1 && (originalSize >>= 0);\n            var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize;\n            result = sizeList.reduce(function(res, entry, i) {\n                var newRes = [].concat(_toConsumableArray(res), [ {\n                    item: entry.item,\n                    position: {\n                        offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2,\n                        size: size\n                    }\n                } ]);\n                return entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) {\n                    newRes.push({\n                        item: item,\n                        position: newRes[newRes.length - 1].position\n                    });\n                }), newRes;\n            }, []);\n        }\n        return result;\n    }, appendOffsetOfLegend = function(offset, items, props, legendBox) {\n        var children = props.children, width = props.width, height = props.height, margin = props.margin, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), legendProps = getLegendProps({\n            children: children,\n            items: items,\n            legendWidth: legendWidth,\n            legendHeight: legendHeight\n        }), newOffset = offset;\n        if (legendProps) {\n            var box = legendBox || {}, align = legendProps.align, verticalAlign = legendProps.verticalAlign, layout = legendProps.layout;\n            (\"vertical\" === layout || \"horizontal\" === layout && \"center\" === verticalAlign) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[align]) && (newOffset = _extends({}, offset, _defineProperty({}, align, newOffset[align] + (box.width || 0)))), \n            (\"horizontal\" === layout || \"vertical\" === layout && \"center\" === align) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[verticalAlign]) && (newOffset = _extends({}, offset, _defineProperty({}, verticalAlign, newOffset[verticalAlign] + (box.height || 0))));\n        }\n        return newOffset;\n    }, getDomainOfErrorBars = function(data, item, dataKey, axisType) {\n        var children = item.props.children, errorBars = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__.a).filter(function(errorBarChild) {\n            var direction = errorBarChild.props.direction;\n            return !(!__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(direction) && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(axisType)) || axisType.indexOf(direction) >= 0;\n        });\n        if (errorBars && errorBars.length) {\n            var keys = errorBars.map(function(errorBarChild) {\n                return errorBarChild.props.dataKey;\n            });\n            return data.reduce(function(result, entry) {\n                var entryValue = getValueByDataKey(entry, dataKey, 0), mainValue = __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(entryValue) ? [ __WEBPACK_IMPORTED_MODULE_5_lodash_min___default()(entryValue), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default()(entryValue) ] : [ entryValue, entryValue ], errorDomain = keys.reduce(function(prevErrorArr, k) {\n                    var errorValue = getValueByDataKey(entry, k, 0), lowerValue = mainValue[0] - Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[0] : errorValue), upperValue = mainValue[1] + Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[1] : errorValue);\n                    return [ Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1]) ];\n                }, [ 1 / 0, -1 / 0 ]);\n                return [ Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1]) ];\n            }, [ 1 / 0, -1 / 0 ]);\n        }\n        return null;\n    }, parseErrorBarsOfAxis = function(data, items, dataKey, axisType) {\n        var domains = items.map(function(item) {\n            return getDomainOfErrorBars(data, item, dataKey, axisType);\n        }).filter(function(entry) {\n            return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry);\n        });\n        return domains && domains.length ? domains.reduce(function(result, entry) {\n            return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ];\n        }, [ 1 / 0, -1 / 0 ]) : null;\n    }, getDomainOfItemsWithSameAxis = function(data, items, type, filterNil) {\n        var domains = items.map(function(item) {\n            var dataKey = item.props.dataKey;\n            return \"number\" === type && dataKey ? getDomainOfErrorBars(data, item, dataKey) || getDomainOfDataByKey(data, dataKey, type, filterNil) : getDomainOfDataByKey(data, dataKey, type, filterNil);\n        });\n        if (\"number\" === type) return domains.reduce(function(result, entry) {\n            return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ];\n        }, [ 1 / 0, -1 / 0 ]);\n        var tag = {};\n        return domains.reduce(function(result, entry) {\n            for (var i = 0, len = entry.length; i < len; i++) tag[entry[i]] || (tag[entry[i]] = !0, \n            result.push(entry[i]));\n            return result;\n        }, []);\n    }, isCategorialAxis = function(layout, axisType) {\n        return \"horizontal\" === layout && \"xAxis\" === axisType || \"vertical\" === layout && \"yAxis\" === axisType || \"centric\" === layout && \"angleAxis\" === axisType || \"radial\" === layout && \"radiusAxis\" === axisType;\n    }, getCoordinatesOfGrid = function(ticks, min, max) {\n        var hasMin = void 0, hasMax = void 0, values = ticks.map(function(entry) {\n            return entry.coordinate === min && (hasMin = !0), entry.coordinate === max && (hasMax = !0), \n            entry.coordinate;\n        });\n        return hasMin || values.push(min), hasMax || values.push(max), values;\n    }, getTicksOfAxis = function(axis, isGrid, isAll) {\n        if (!axis) return null;\n        var scale = axis.scale, duplicateDomain = axis.duplicateDomain, type = axis.type, range = axis.range, offset = (isGrid || isAll) && \"category\" === type && scale.bandwidth ? scale.bandwidth() / 2 : 0;\n        return offset = \"angleAxis\" === axis.axisType ? 2 * Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[0] - range[1]) * offset : offset, \n        isGrid && (axis.ticks || axis.niceTicks) ? (axis.ticks || axis.niceTicks).map(function(entry) {\n            var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry;\n            return {\n                coordinate: scale(scaleContent) + offset,\n                value: entry,\n                offset: offset\n            };\n        }) : axis.isCategorial && axis.categoricalDomain ? axis.categoricalDomain.map(function(entry, index) {\n            return {\n                coordinate: scale(entry),\n                value: entry,\n                index: index,\n                offset: offset\n            };\n        }) : scale.ticks && !isAll ? scale.ticks(axis.tickCount).map(function(entry) {\n            return {\n                coordinate: scale(entry) + offset,\n                value: entry,\n                offset: offset\n            };\n        }) : scale.domain().map(function(entry, index) {\n            return {\n                coordinate: scale(entry) + offset,\n                value: duplicateDomain ? duplicateDomain[entry] : entry,\n                index: index,\n                offset: offset\n            };\n        });\n    }, combineEventHandlers = function(defaultHandler, parentHandler, childHandler) {\n        var customizedHandler = void 0;\n        return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(childHandler) ? customizedHandler = childHandler : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(parentHandler) && (customizedHandler = parentHandler), \n        __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) || customizedHandler ? function(arg1, arg2, arg3, arg4) {\n            __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) && defaultHandler(arg1, arg2, arg3, arg4), \n            __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(customizedHandler) && customizedHandler(arg1, arg2, arg3, arg4);\n        } : null;\n    }, parseScale = function(axis, chartType) {\n        var scale = axis.scale, type = axis.type, layout = axis.layout, axisType = axis.axisType;\n        if (\"auto\" === scale) return \"radial\" === layout && \"radiusAxis\" === axisType ? {\n            scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(),\n            realScaleType: \"band\"\n        } : \"radial\" === layout && \"angleAxis\" === axisType ? {\n            scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(),\n            realScaleType: \"linear\"\n        } : \"category\" === type && chartType && (chartType.indexOf(\"LineChart\") >= 0 || chartType.indexOf(\"AreaChart\") >= 0) ? {\n            scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(),\n            realScaleType: \"point\"\n        } : \"category\" === type ? {\n            scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(),\n            realScaleType: \"band\"\n        } : {\n            scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(),\n            realScaleType: \"linear\"\n        };\n        if (__WEBPACK_IMPORTED_MODULE_3_lodash_isString___default()(scale)) {\n            var name = \"scale\" + scale.slice(0, 1).toUpperCase() + scale.slice(1);\n            return {\n                scale: (__WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] || __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint)(),\n                realScaleType: __WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] ? name : \"point\"\n            };\n        }\n        return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(scale) ? {\n            scale: scale\n        } : {\n            scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(),\n            realScaleType: \"point\"\n        };\n    }, checkDomainOfScale = function(scale) {\n        var domain = scale.domain();\n        if (domain && !(domain.length <= 2)) {\n            var len = domain.length, range = scale.range(), min = Math.min(range[0], range[1]) - 1e-4, max = Math.max(range[0], range[1]) + 1e-4, first = scale(domain[0]), last = scale(domain[len - 1]);\n            (first < min || first > max || last < min || last > max) && scale.domain([ domain[0], domain[len - 1] ]);\n        }\n    }, findPositionOfBar = function(barPosition, child) {\n        if (!barPosition) return null;\n        for (var i = 0, len = barPosition.length; i < len; i++) if (barPosition[i].item === child) return barPosition[i].position;\n        return null;\n    }, truncateByDomain = function(value, domain) {\n        if (!domain || 2 !== domain.length || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[0]) || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[1])) return value;\n        var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]), result = [ value[0], value[1] ];\n        return (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[0]) || value[0] < min) && (result[0] = min), \n        (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[1]) || value[1] > max) && (result[1] = max), \n        result[0] > max && (result[0] = max), result[1] < min && (result[1] = min), result;\n    }, offsetSign = function(series) {\n        var n = series.length;\n        if (!(n <= 0)) for (var j = 0, m = series[0].length; j < m; ++j) for (var positive = 0, negative = 0, i = 0; i < n; ++i) {\n            var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(series[i][j][1]) ? series[i][j][0] : series[i][j][1];\n            value >= 0 ? (series[i][j][0] = positive, series[i][j][1] = positive + value, positive = series[i][j][1]) : (series[i][j][0] = negative, \n            series[i][j][1] = negative + value, negative = series[i][j][1]);\n        }\n    }, STACK_OFFSET_MAP = {\n        sign: offsetSign,\n        expand: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.o,\n        none: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.p,\n        silhouette: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.q,\n        wiggle: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.r\n    }, getStackedData = function(data, stackItems, offsetType) {\n        var dataKeys = stackItems.map(function(item) {\n            return item.props.dataKey;\n        });\n        return Object(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.n)().keys(dataKeys).value(function(d, key) {\n            return +getValueByDataKey(d, key, 0);\n        }).order(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.s).offset(STACK_OFFSET_MAP[offsetType])(data);\n    }, getStackGroupsByAxisId = function(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) {\n        if (!data) return null;\n        var items = reverseStackOrder ? _items.reverse() : _items, stackGroups = items.reduce(function(result, item) {\n            var _item$props2 = item.props, stackId = _item$props2.stackId;\n            if (_item$props2.hide) return result;\n            var axisId = item.props[numericAxisId], parentGroup = result[axisId] || {\n                hasStack: !1,\n                stackGroups: {}\n            };\n            if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) {\n                var childGroup = parentGroup.stackGroups[stackId] || {\n                    numericAxisId: numericAxisId,\n                    cateAxisId: cateAxisId,\n                    items: []\n                };\n                childGroup.items.push(item), parentGroup.hasStack = !0, parentGroup.stackGroups[stackId] = childGroup;\n            } else parentGroup.stackGroups[Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.k)(\"_stackId_\")] = {\n                numericAxisId: numericAxisId,\n                cateAxisId: cateAxisId,\n                items: [ item ]\n            };\n            return _extends({}, result, _defineProperty({}, axisId, parentGroup));\n        }, {});\n        return Object.keys(stackGroups).reduce(function(result, axisId) {\n            var group = stackGroups[axisId];\n            return group.hasStack && (group.stackGroups = Object.keys(group.stackGroups).reduce(function(res, stackId) {\n                var g = group.stackGroups[stackId];\n                return _extends({}, res, _defineProperty({}, stackId, {\n                    numericAxisId: numericAxisId,\n                    cateAxisId: cateAxisId,\n                    items: g.items,\n                    stackedData: getStackedData(data, g.items, offsetType)\n                }));\n            }, {})), _extends({}, result, _defineProperty({}, axisId, group));\n        }, {});\n    }, calculateDomainOfTicks = function(ticks, type) {\n        return \"number\" === type ? [ Math.min.apply(null, ticks), Math.max.apply(null, ticks) ] : ticks;\n    }, getTicksOfScale = function(scale, opts) {\n        var realScaleType = opts.realScaleType, type = opts.type, tickCount = opts.tickCount, originalDomain = opts.originalDomain, allowDecimals = opts.allowDecimals, scaleType = realScaleType || opts.scale;\n        if (\"auto\" !== scaleType && \"linear\" !== scaleType) return null;\n        if (tickCount && \"number\" === type && originalDomain && (\"auto\" === originalDomain[0] || \"auto\" === originalDomain[1])) {\n            var domain = scale.domain(), tickValues = Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getNiceTickValues)(domain, tickCount, allowDecimals);\n            return scale.domain(calculateDomainOfTicks(tickValues, type)), {\n                niceTicks: tickValues\n            };\n        }\n        if (tickCount && \"number\" === type) {\n            var _domain = scale.domain();\n            return {\n                niceTicks: Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getTickValuesFixedDomain)(_domain, tickCount, allowDecimals)\n            };\n        }\n        return null;\n    }, getCateCoordinateOfLine = function(_ref6) {\n        var axis = _ref6.axis, ticks = _ref6.ticks, bandSize = _ref6.bandSize, entry = _ref6.entry, index = _ref6.index;\n        if (\"category\" === axis.type) {\n            if (!axis.allowDuplicatedCategory && axis.dataKey && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry[axis.dataKey])) {\n                var matchedTick = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.a)(ticks, \"value\", entry[axis.dataKey]);\n                if (matchedTick) return matchedTick.coordinate + bandSize / 2;\n            }\n            return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null;\n        }\n        var value = getValueByDataKey(entry, axis.dataKey);\n        return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value);\n    }, getCateCoordinateOfBar = function(_ref7) {\n        var axis = _ref7.axis, ticks = _ref7.ticks, offset = _ref7.offset, bandSize = _ref7.bandSize, entry = _ref7.entry, index = _ref7.index;\n        if (\"category\" === axis.type) return ticks[index] ? ticks[index].coordinate + offset : null;\n        var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]);\n        return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value) - bandSize / 2 + offset;\n    }, getBaseValueOfBar = function(_ref8) {\n        var numericAxis = _ref8.numericAxis, domain = numericAxis.scale.domain();\n        if (\"number\" === numericAxis.type) {\n            var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]);\n            return min <= 0 && max >= 0 ? 0 : max < 0 ? max : min;\n        }\n        return domain[0];\n    }, detectReferenceElementsDomain = function(children, domain, axisId, axisType, specifiedTicks) {\n        var lines = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__.a), dots = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__.a), elements = lines.concat(dots), areas = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__.a), idKey = axisType + \"Id\", valueKey = axisType[0], finalDomain = domain;\n        if (elements.length && (finalDomain = elements.reduce(function(result, el) {\n            if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[valueKey])) {\n                var value = el.props[valueKey];\n                return [ Math.min(result[0], value), Math.max(result[1], value) ];\n            }\n            return result;\n        }, finalDomain)), areas.length) {\n            var key1 = valueKey + \"1\", key2 = valueKey + \"2\";\n            finalDomain = areas.reduce(function(result, el) {\n                if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key1]) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key2])) {\n                    var value1 = el.props[key1], value2 = el.props[key2];\n                    return [ Math.min(result[0], value1, value2), Math.max(result[1], value1, value2) ];\n                }\n                return result;\n            }, finalDomain);\n        }\n        return specifiedTicks && specifiedTicks.length && (finalDomain = specifiedTicks.reduce(function(result, tick) {\n            return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(tick) ? [ Math.min(result[0], tick), Math.max(result[1], tick) ] : result;\n        }, finalDomain)), finalDomain;\n    }, getStackedDataOfItem = function(item, stackGroups) {\n        var stackId = item.props.stackId;\n        if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) {\n            var group = stackGroups[stackId];\n            if (group && group.items.length) {\n                for (var itemIndex = -1, i = 0, len = group.items.length; i < len; i++) if (group.items[i] === item) {\n                    itemIndex = i;\n                    break;\n                }\n                return itemIndex >= 0 ? group.stackedData[itemIndex] : null;\n            }\n        }\n        return null;\n    }, getDomainOfSingle = function(data) {\n        return data.reduce(function(result, entry) {\n            return [ Math.min.apply(null, entry.concat([ result[0] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)), Math.max.apply(null, entry.concat([ result[1] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)) ];\n        }, [ 1 / 0, -1 / 0 ]);\n    }, getDomainOfStackGroups = function(stackGroups, startIndex, endIndex) {\n        return Object.keys(stackGroups).reduce(function(result, stackId) {\n            var group = stackGroups[stackId], stackedData = group.stackedData, domain = stackedData.reduce(function(res, entry) {\n                var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1));\n                return [ Math.min(res[0], s[0]), Math.max(res[1], s[1]) ];\n            }, [ 1 / 0, -1 / 0 ]);\n            return [ Math.min(domain[0], result[0]), Math.max(domain[1], result[1]) ];\n        }, [ 1 / 0, -1 / 0 ]).map(function(result) {\n            return result === 1 / 0 || result === -1 / 0 ? 0 : result;\n        });\n    }, MIN_VALUE_REG = /^dataMin[\\s]*-[\\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, MAX_VALUE_REG = /^dataMax[\\s]*\\+[\\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, parseSpecifiedDomain = function(specifiedDomain, dataDomain, allowDataOverflow) {\n        if (!__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(specifiedDomain)) return dataDomain;\n        var domain = [];\n        if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[0])) domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]); else if (MIN_VALUE_REG.test(specifiedDomain[0])) {\n            var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1];\n            domain[0] = dataDomain[0] - value;\n        } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[0]) ? domain[0] = specifiedDomain[0](dataDomain[0]) : domain[0] = dataDomain[0];\n        if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[1])) domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]); else if (MAX_VALUE_REG.test(specifiedDomain[1])) {\n            var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1];\n            domain[1] = dataDomain[1] + _value;\n        } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[1]) ? domain[1] = specifiedDomain[1](dataDomain[1]) : domain[1] = dataDomain[1];\n        return domain;\n    }, validateCoordinateInRange = function(coordinate, scale) {\n        if (!scale) return !1;\n        var range = scale.range(), first = range[0], last = range[range.length - 1];\n        return first <= last ? coordinate >= first && coordinate <= last : coordinate >= last && coordinate <= first;\n    }, getBandSizeOfAxis = function(axis, ticks) {\n        if (axis && axis.scale && axis.scale.bandwidth) return axis.scale.bandwidth();\n        if (axis && ticks && ticks.length >= 2) {\n            for (var orderedTicks = __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default()(ticks, function(o) {\n                return o.coordinate;\n            }), bandSize = 1 / 0, i = 1, len = orderedTicks.length; i < len; i++) {\n                var cur = orderedTicks[i], prev = orderedTicks[i - 1];\n                bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize);\n            }\n            return bandSize === 1 / 0 ? 0 : bandSize;\n        }\n        return 0;\n    }, parseDomainOfCategoryAxis = function(specifiedDomain, calculatedDomain, axisChild) {\n        return specifiedDomain && specifiedDomain.length ? __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(specifiedDomain, __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(axisChild, \"type.defaultProps.domain\")) ? calculatedDomain : specifiedDomain : calculatedDomain;\n    };\n}, function(module, exports) {\n    var core = module.exports = {\n        version: \"2.5.7\"\n    };\n    \"number\" == typeof __e && (__e = core);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function newInterval(floori, offseti, count, field) {\n        function interval(date) {\n            return floori(date = new Date(+date)), date;\n        }\n        return interval.floor = interval, interval.ceil = function(date) {\n            return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;\n        }, interval.round = function(date) {\n            var d0 = interval(date), d1 = interval.ceil(date);\n            return date - d0 < d1 - date ? d0 : d1;\n        }, interval.offset = function(date, step) {\n            return offseti(date = new Date(+date), null == step ? 1 : Math.floor(step)), date;\n        }, interval.range = function(start, stop, step) {\n            var previous, range = [];\n            if (start = interval.ceil(start), step = null == step ? 1 : Math.floor(step), !(start < stop && step > 0)) return range;\n            do {\n                range.push(previous = new Date(+start)), offseti(start, step), floori(start);\n            } while (previous < start && start < stop);\n            return range;\n        }, interval.filter = function(test) {\n            return newInterval(function(date) {\n                if (date >= date) for (;floori(date), !test(date); ) date.setTime(date - 1);\n            }, function(date, step) {\n                if (date >= date) if (step < 0) for (;++step <= 0; ) for (;offseti(date, -1), !test(date); ) ; else for (;--step >= 0; ) for (;offseti(date, 1), \n                !test(date); ) ;\n            });\n        }, count && (interval.count = function(start, end) {\n            return t0.setTime(+start), t1.setTime(+end), floori(t0), floori(t1), Math.floor(count(t0, t1));\n        }, interval.every = function(step) {\n            return step = Math.floor(step), isFinite(step) && step > 0 ? step > 1 ? interval.filter(field ? function(d) {\n                return field(d) % step == 0;\n            } : function(d) {\n                return interval.count(0, d) % step == 0;\n            }) : interval : null;\n        }), interval;\n    }\n    __webpack_exports__.a = newInterval;\n    var t0 = new Date(), t1 = new Date();\n}, function(module, exports, __webpack_require__) {\n    var global = __webpack_require__(24), core = __webpack_require__(17), ctx = __webpack_require__(51), hide = __webpack_require__(39), has = __webpack_require__(54), $export = function(type, name, source) {\n        var key, own, out, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, IS_WRAP = type & $export.W, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {}).prototype;\n        IS_GLOBAL && (source = name);\n        for (key in source) (own = !IS_FORCED && target && void 0 !== target[key]) && has(exports, key) || (out = own ? target[key] : source[key], \n        exports[key] = IS_GLOBAL && \"function\" != typeof target[key] ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function(C) {\n            var F = function(a, b, c) {\n                if (this instanceof C) {\n                    switch (arguments.length) {\n                      case 0:\n                        return new C();\n\n                      case 1:\n                        return new C(a);\n\n                      case 2:\n                        return new C(a, b);\n                    }\n                    return new C(a, b, c);\n                }\n                return C.apply(this, arguments);\n            };\n            return F.prototype = C.prototype, F;\n        }(out) : IS_PROTO && \"function\" == typeof out ? ctx(Function.call, out) : out, IS_PROTO && ((exports.virtual || (exports.virtual = {}))[key] = out, \n        type & $export.R && expProto && !expProto[key] && hide(expProto, key, out)));\n    };\n    $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, $export.B = 16, $export.W = 32, \n    $export.U = 64, $export.R = 128, module.exports = $export;\n}, function(module, exports) {\n    function isNil(value) {\n        return null == value;\n    }\n    module.exports = isNil;\n}, function(module, exports, __webpack_require__) {\n    var store = __webpack_require__(151)(\"wks\"), uid = __webpack_require__(103), Symbol = __webpack_require__(24).Symbol, USE_SYMBOL = \"function\" == typeof Symbol;\n    (module.exports = function(name) {\n        return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)(\"Symbol.\" + name));\n    }).store = store;\n}, function(module, exports, __webpack_require__) {\n    var anObject = __webpack_require__(52), IE8_DOM_DEFINE = __webpack_require__(224), toPrimitive = __webpack_require__(145), dP = Object.defineProperty;\n    exports.f = __webpack_require__(25) ? Object.defineProperty : function(O, P, Attributes) {\n        if (anObject(O), P = toPrimitive(P, !0), anObject(Attributes), IE8_DOM_DEFINE) try {\n            return dP(O, P, Attributes);\n        } catch (e) {}\n        if (\"get\" in Attributes || \"set\" in Attributes) throw TypeError(\"Accessors not supported!\");\n        return \"value\" in Attributes && (O[P] = Attributes.value), O;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return RADIAN;\n    }), __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return polarToCartesian;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return getMaxRadius;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return formatAxisMap;\n    }), __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return inRangeOfSector;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_2__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, RADIAN = Math.PI / 180, radianToDegree = function(angleInRadian) {\n        return 180 * angleInRadian / Math.PI;\n    }, polarToCartesian = function(cx, cy, radius, angle) {\n        return {\n            x: cx + Math.cos(-RADIAN * angle) * radius,\n            y: cy + Math.sin(-RADIAN * angle) * radius\n        };\n    }, getMaxRadius = function(width, height) {\n        var offset = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0\n        };\n        return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2;\n    }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) {\n        var width = props.width, height = props.height, startAngle = props.startAngle, endAngle = props.endAngle, cx = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cx, width, width / 2), cy = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cy, height, height / 2), maxRadius = getMaxRadius(width, height, offset), innerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.innerRadius, maxRadius, 0), outerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.outerRadius, maxRadius, .8 * maxRadius);\n        return Object.keys(axisMap).reduce(function(result, id) {\n            var axis = axisMap[id], domain = axis.domain, reversed = axis.reversed, range = void 0;\n            __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(axis.range) ? (\"angleAxis\" === axisType ? range = [ startAngle, endAngle ] : \"radiusAxis\" === axisType && (range = [ innerRadius, outerRadius ]), \n            reversed && (range = [ range[1], range[0] ])) : (range = axis.range, startAngle = range[0], \n            endAngle = range[1]);\n            var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.A)(axis, chartName), realScaleType = _parseScale.realScaleType, scale = _parseScale.scale;\n            scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.c)(scale);\n            var ticks = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.v)(scale, _extends({}, axis, {\n                realScaleType: realScaleType\n            })), finalAxis = _extends({}, axis, ticks, {\n                range: range,\n                radius: outerRadius,\n                realScaleType: realScaleType,\n                scale: scale,\n                cx: cx,\n                cy: cy,\n                innerRadius: innerRadius,\n                outerRadius: outerRadius,\n                startAngle: startAngle,\n                endAngle: endAngle\n            });\n            return _extends({}, result, _defineProperty({}, id, finalAxis));\n        }, {});\n    }, distanceBetweenPoints = function(point, anotherPoint) {\n        var x1 = point.x, y1 = point.y, x2 = anotherPoint.x, y2 = anotherPoint.y;\n        return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));\n    }, getAngleOfPoint = function(_ref, _ref2) {\n        var x = _ref.x, y = _ref.y, cx = _ref2.cx, cy = _ref2.cy, radius = distanceBetweenPoints({\n            x: x,\n            y: y\n        }, {\n            x: cx,\n            y: cy\n        });\n        if (radius <= 0) return {\n            radius: radius\n        };\n        var cos = (x - cx) / radius, angleInRadian = Math.acos(cos);\n        return y > cy && (angleInRadian = 2 * Math.PI - angleInRadian), {\n            radius: radius,\n            angle: radianToDegree(angleInRadian),\n            angleInRadian: angleInRadian\n        };\n    }, formatAngleOfSector = function(_ref3) {\n        var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360), min = Math.min(startCnt, endCnt);\n        return {\n            startAngle: startAngle - 360 * min,\n            endAngle: endAngle - 360 * min\n        };\n    }, reverseFormatAngleOfSetor = function(angle, _ref4) {\n        var startAngle = _ref4.startAngle, endAngle = _ref4.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360);\n        return angle + 360 * Math.min(startCnt, endCnt);\n    }, inRangeOfSector = function(_ref5, sector) {\n        var x = _ref5.x, y = _ref5.y, _getAngleOfPoint = getAngleOfPoint({\n            x: x,\n            y: y\n        }, sector), radius = _getAngleOfPoint.radius, angle = _getAngleOfPoint.angle, innerRadius = sector.innerRadius, outerRadius = sector.outerRadius;\n        if (radius < innerRadius || radius > outerRadius) return !1;\n        if (0 === radius) return !0;\n        var _formatAngleOfSector = formatAngleOfSector(sector), startAngle = _formatAngleOfSector.startAngle, endAngle = _formatAngleOfSector.endAngle, formatAngle = angle, inRange = void 0;\n        if (startAngle <= endAngle) {\n            for (;formatAngle > endAngle; ) formatAngle -= 360;\n            for (;formatAngle < startAngle; ) formatAngle += 360;\n            inRange = formatAngle >= startAngle && formatAngle <= endAngle;\n        } else {\n            for (;formatAngle > startAngle; ) formatAngle -= 360;\n            for (;formatAngle < endAngle; ) formatAngle += 360;\n            inRange = formatAngle >= endAngle && formatAngle <= startAngle;\n        }\n        return inRange ? _extends({}, sector, {\n            radius: radius,\n            angle: reverseFormatAngleOfSetor(formatAngle, sector)\n        }) : null;\n    };\n}, function(module, exports) {\n    var global = module.exports = \"undefined\" != typeof window && window.Math == Math ? window : \"undefined\" != typeof self && self.Math == Math ? self : Function(\"return this\")();\n    \"number\" == typeof __g && (__g = global);\n}, function(module, exports, __webpack_require__) {\n    module.exports = !__webpack_require__(53)(function() {\n        return 7 != Object.defineProperty({}, \"a\", {\n            get: function() {\n                return 7;\n            }\n        }).a;\n    });\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(394),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0, exports.default = function(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_defineProperty);\n    exports.default = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }();\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _typeof2 = __webpack_require__(105), _typeof3 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_typeof2);\n    exports.default = function(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" !== (void 0 === call ? \"undefined\" : (0, _typeof3.default)(call)) && \"function\" != typeof call ? self : call;\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    exports.__esModule = !0;\n    var _setPrototypeOf = __webpack_require__(411), _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf), _create = __webpack_require__(415), _create2 = _interopRequireDefault(_create), _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2);\n    exports.default = function(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + (void 0 === superClass ? \"undefined\" : (0, \n        _typeof3.default)(superClass)));\n        subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (_setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass);\n    };\n}, function(module, exports, __webpack_require__) {\n    var freeGlobal = __webpack_require__(268), freeSelf = \"object\" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function(\"return this\")();\n    module.exports = root;\n}, function(module, exports) {\n    function isObject(value) {\n        var type = typeof value;\n        return null != value && (\"object\" == type || \"function\" == type);\n    }\n    module.exports = isObject;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.translateStyle = exports.AnimateGroup = exports.configBezier = exports.configSpring = void 0;\n    var _Animate = __webpack_require__(287), _Animate2 = _interopRequireDefault(_Animate), _easing = __webpack_require__(305), _util = __webpack_require__(132), _AnimateGroup = __webpack_require__(762), _AnimateGroup2 = _interopRequireDefault(_AnimateGroup);\n    exports.configSpring = _easing.configSpring, exports.configBezier = _easing.configBezier, \n    exports.AnimateGroup = _AnimateGroup2.default, exports.translateStyle = _util.translateStyle, \n    exports.default = _Animate2.default;\n}, function(module, exports) {\n    var isArray = Array.isArray;\n    module.exports = isArray;\n}, function(module, exports) {\n    module.exports = function(it) {\n        return \"object\" == typeof it ? null !== it : \"function\" == typeof it;\n    };\n}, function(module, exports, __webpack_require__) {\n    var freeGlobal = __webpack_require__(292), freeSelf = \"object\" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function(\"return this\")();\n    module.exports = root;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__src_bisect__ = __webpack_require__(332);\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_bisect__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_1__src_ascending__ = __webpack_require__(69);\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__src_ascending__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_2__src_bisector__ = __webpack_require__(333);\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_bisector__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_18__src_quantile__ = (__webpack_require__(848), __webpack_require__(849), \n    __webpack_require__(335), __webpack_require__(337), __webpack_require__(850), __webpack_require__(853), \n    __webpack_require__(854), __webpack_require__(341), __webpack_require__(855), __webpack_require__(856), \n    __webpack_require__(857), __webpack_require__(858), __webpack_require__(342), __webpack_require__(334), \n    __webpack_require__(859), __webpack_require__(204));\n    __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return __WEBPACK_IMPORTED_MODULE_18__src_quantile__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_19__src_range__ = __webpack_require__(339);\n    __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return __WEBPACK_IMPORTED_MODULE_19__src_range__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_23__src_ticks__ = (__webpack_require__(860), __webpack_require__(861), \n    __webpack_require__(862), __webpack_require__(340));\n    __webpack_require__.d(__webpack_exports__, \"h\", function() {\n        return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"g\", function() {\n        return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.c;\n    });\n    __webpack_require__(343), __webpack_require__(336), __webpack_require__(863);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return durationSecond;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return durationMinute;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return durationHour;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return durationDay;\n    }), __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return durationWeek;\n    });\n    var durationSecond = 1e3, durationMinute = 6e4, durationHour = 36e5, durationDay = 864e5, durationWeek = 6048e5;\n}, function(module, exports, __webpack_require__) {\n    var dP = __webpack_require__(22), createDesc = __webpack_require__(75);\n    module.exports = __webpack_require__(25) ? function(object, key, value) {\n        return dP.f(object, key, createDesc(1, value));\n    } : function(object, key, value) {\n        return object[key] = value, object;\n    };\n}, function(module, exports) {\n    var g;\n    g = function() {\n        return this;\n    }();\n    try {\n        g = g || Function(\"return this\")() || (0, eval)(\"this\");\n    } catch (e) {\n        \"object\" == typeof window && (g = window);\n    }\n    module.exports = g;\n}, function(module, exports, __webpack_require__) {\n    function baseGetTag(value) {\n        return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);\n    }\n    var Symbol = __webpack_require__(83), getRawTag = __webpack_require__(603), objectToString = __webpack_require__(604), nullTag = \"[object Null]\", undefinedTag = \"[object Undefined]\", symToStringTag = Symbol ? Symbol.toStringTag : void 0;\n    module.exports = baseGetTag;\n}, function(module, exports) {\n    function isObjectLike(value) {\n        return null != value && \"object\" == typeof value;\n    }\n    module.exports = isObjectLike;\n}, function(module, exports) {\n    function isObjectLike(value) {\n        return null != value && \"object\" == typeof value;\n    }\n    module.exports = isObjectLike;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function Label(props) {\n        var viewBox = props.viewBox, position = props.position, value = props.value, children = props.children, content = props.content, _props$className = props.className, className = void 0 === _props$className ? \"\" : _props$className;\n        if (!viewBox || __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) && __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(children) && !Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content) && !__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) return null;\n        if (Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content)) return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(content, props);\n        var label = void 0;\n        if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) {\n            if (label = content(props), Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label)) return label;\n        } else label = getLabel(props);\n        var isPolarLabel = isPolar(viewBox), attrs = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(props);\n        if (isPolarLabel && (\"insideStart\" === position || \"insideEnd\" === position || \"end\" === position)) return renderRadialLabel(props, label, attrs);\n        var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props);\n        return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__Text__.a, _extends({\n            className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()(\"recharts-label\", className)\n        }, attrs, positionAttrs), label);\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, cartesianViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({\n        x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number\n    }), polarViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({\n        cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        innerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        outerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        startAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        endAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number\n    }), propTypes = {\n        viewBox: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ cartesianViewBoxShape, polarViewBoxShape ]),\n        formatter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,\n        value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),\n        offset: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        position: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"top\", \"left\", \"right\", \"bottom\", \"inside\", \"outside\", \"insideLeft\", \"insideRight\", \"insideTop\", \"insideBottom\", \"insideTopLeft\", \"insideBottomLeft\", \"insideTopRight\", \"insideBottomRight\", \"insideStart\", \"insideEnd\", \"end\", \"center\" ]),\n        children: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node ]),\n        className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,\n        content: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ])\n    }, defaultProps = {\n        offset: 5\n    }, getLabel = function(props) {\n        var value = props.value, formatter = props.formatter, label = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(props.children) ? value : props.children;\n        return __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(formatter) ? formatter(label) : label;\n    }, getDeltaAngle = function(startAngle, endAngle) {\n        return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.j)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360);\n    }, renderRadialLabel = function(labelProps, label, attrs) {\n        var position = labelProps.position, viewBox = labelProps.viewBox, offset = labelProps.offset, className = labelProps.className, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, clockWise = viewBox.clockWise, radius = (innerRadius + outerRadius) / 2, deltaAngle = getDeltaAngle(startAngle, endAngle), sign = deltaAngle >= 0 ? 1 : -1, labelAngle = void 0, direction = void 0;\n        \"insideStart\" === position ? (labelAngle = startAngle + sign * offset, direction = clockWise) : \"insideEnd\" === position ? (labelAngle = endAngle - sign * offset, \n        direction = !clockWise) : \"end\" === position && (labelAngle = endAngle + sign * offset, \n        direction = clockWise), direction = deltaAngle <= 0 ? direction : !direction;\n        var startPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle + 359 * (direction ? 1 : -1)), path = \"M\" + startPoint.x + \",\" + startPoint.y + \"\\n    A\" + radius + \",\" + radius + \",0,1,\" + (direction ? 0 : 1) + \",\\n    \" + endPoint.x + \",\" + endPoint.y, id = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(labelProps.id) ? Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.k)(\"recharts-radial-line-\") : labelProps.id;\n        return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"text\", _extends({}, attrs, {\n            dominantBaseline: \"central\",\n            className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()(\"recharts-radial-bar-label\", className)\n        }), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"defs\", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"path\", {\n            id: id,\n            d: path\n        })), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"textPath\", {\n            xlinkHref: \"#\" + id\n        }, label));\n    }, getAttrsOfPolarLabel = function(props) {\n        var viewBox = props.viewBox, offset = props.offset, position = props.position, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, midAngle = (startAngle + endAngle) / 2;\n        if (\"outside\" === position) {\n            var _polarToCartesian = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, outerRadius + offset, midAngle), _x = _polarToCartesian.x;\n            return {\n                x: _x,\n                y: _polarToCartesian.y,\n                textAnchor: _x >= cx ? \"start\" : \"end\",\n                verticalAnchor: \"middle\"\n            };\n        }\n        if (\"center\" === position) return {\n            x: cx,\n            y: cy,\n            textAnchor: \"middle\",\n            verticalAnchor: \"middle\"\n        };\n        var r = (innerRadius + outerRadius) / 2, _polarToCartesian2 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, r, midAngle);\n        return {\n            x: _polarToCartesian2.x,\n            y: _polarToCartesian2.y,\n            textAnchor: \"middle\",\n            verticalAnchor: \"middle\"\n        };\n    }, getAttrsOfCartesianLabel = function(props) {\n        var viewBox = props.viewBox, offset = props.offset, position = props.position, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sign = height >= 0 ? 1 : -1;\n        return \"top\" === position ? {\n            x: x + width / 2,\n            y: y - sign * offset,\n            textAnchor: \"middle\",\n            verticalAnchor: \"end\"\n        } : \"bottom\" === position ? {\n            x: x + width / 2,\n            y: y + height + sign * offset,\n            textAnchor: \"middle\",\n            verticalAnchor: \"start\"\n        } : \"left\" === position ? {\n            x: x - offset,\n            y: y + height / 2,\n            textAnchor: \"end\",\n            verticalAnchor: \"middle\"\n        } : \"right\" === position ? {\n            x: x + width + offset,\n            y: y + height / 2,\n            textAnchor: \"start\",\n            verticalAnchor: \"middle\"\n        } : \"insideLeft\" === position ? {\n            x: x + offset,\n            y: y + height / 2,\n            textAnchor: \"start\",\n            verticalAnchor: \"middle\"\n        } : \"insideRight\" === position ? {\n            x: x + width - offset,\n            y: y + height / 2,\n            textAnchor: \"end\",\n            verticalAnchor: \"middle\"\n        } : \"insideTop\" === position ? {\n            x: x + width / 2,\n            y: y + sign * offset,\n            textAnchor: \"middle\",\n            verticalAnchor: \"start\"\n        } : \"insideBottom\" === position ? {\n            x: x + width / 2,\n            y: y + height - sign * offset,\n            textAnchor: \"middle\",\n            verticalAnchor: \"end\"\n        } : \"insideTopLeft\" === position ? {\n            x: x + offset,\n            y: y + sign * offset,\n            textAnchor: \"start\",\n            verticalAnchor: \"start\"\n        } : \"insideTopRight\" === position ? {\n            x: x + width - offset,\n            y: y + sign * offset,\n            textAnchor: \"end\",\n            verticalAnchor: \"start\"\n        } : \"insideBottomLeft\" === position ? {\n            x: x + offset,\n            y: y + height - sign * offset,\n            textAnchor: \"start\",\n            verticalAnchor: \"end\"\n        } : \"insideBottomRight\" === position ? {\n            x: x + width - offset,\n            y: y + height - sign * offset,\n            textAnchor: \"end\",\n            verticalAnchor: \"end\"\n        } : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(position) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.x) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.x)) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.y) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.y)) ? {\n            x: x + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.x, width),\n            y: y + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.y, height),\n            textAnchor: \"end\",\n            verticalAnchor: \"end\"\n        } : {\n            x: x + width / 2,\n            y: y + height / 2,\n            textAnchor: \"middle\",\n            verticalAnchor: \"middle\"\n        };\n    }, isPolar = function(viewBox) {\n        return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(viewBox.cx);\n    };\n    Label.displayName = \"Label\", Label.defaultProps = defaultProps, Label.propTypes = propTypes;\n    var parseViewBox = function(props) {\n        var cx = props.cx, cy = props.cy, angle = props.angle, startAngle = props.startAngle, endAngle = props.endAngle, r = props.r, radius = props.radius, innerRadius = props.innerRadius, outerRadius = props.outerRadius, x = props.x, y = props.y, top = props.top, left = props.left, width = props.width, height = props.height, clockWise = props.clockWise;\n        if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(width) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(height)) {\n            if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y)) return {\n                x: x,\n                y: y,\n                width: width,\n                height: height\n            };\n            if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(top) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(left)) return {\n                x: top,\n                y: left,\n                width: width,\n                height: height\n            };\n        }\n        return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y) ? {\n            x: x,\n            y: y,\n            width: 0,\n            height: 0\n        } : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cx) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cy) ? {\n            cx: cx,\n            cy: cy,\n            startAngle: startAngle || angle || 0,\n            endAngle: endAngle || angle || 0,\n            innerRadius: innerRadius || 0,\n            outerRadius: outerRadius || radius || r || 0,\n            clockWise: clockWise\n        } : props.viewBox ? props.viewBox : {};\n    }, parseLabel = function(label, viewBox) {\n        return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, {\n            key: \"label-implicit\",\n            viewBox: viewBox\n        }) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, {\n            key: \"label-implicit\",\n            viewBox: viewBox,\n            value: label\n        }) : Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, {\n            key: \"label-implicit\",\n            content: label,\n            viewBox: viewBox\n        }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, _extends({\n            viewBox: viewBox\n        }, label, {\n            key: \"label-implicit\"\n        })) : null : null;\n    }, renderCallByParent = function(parentProps, viewBox) {\n        var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2];\n        if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null;\n        var children = parentProps.children, parentViewBox = parseViewBox(parentProps), explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.h)(children, Label).map(function(child, index) {\n            return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(child, {\n                viewBox: viewBox || parentViewBox,\n                key: \"label-\" + index\n            });\n        });\n        return ckeckPropsLabel ? [ parseLabel(parentProps.label, viewBox || parentViewBox) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren;\n    };\n    Label.parseViewBox = parseViewBox, Label.renderCallByParent = renderCallByParent, \n    __webpack_exports__.a = Label;\n}, function(module, exports, __webpack_require__) {\n    function isEqual(value, other) {\n        return baseIsEqual(value, other);\n    }\n    var baseIsEqual = __webpack_require__(199);\n    module.exports = isEqual;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__src_color__ = __webpack_require__(207);\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_color__.e;\n    }), __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_color__.g;\n    }), __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_color__.f;\n    });\n    var __WEBPACK_IMPORTED_MODULE_1__src_lab__ = __webpack_require__(871);\n    __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__src_lab__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__src_lab__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__ = __webpack_require__(872);\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__.a;\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function LabelList(props) {\n        var data = props.data, valueAccessor = props.valueAccessor, dataKey = props.dataKey, clockWise = props.clockWise, id = props.id, others = _objectWithoutProperties(props, [ \"data\", \"valueAccessor\", \"dataKey\", \"clockWise\", \"id\" ]);\n        return data && data.length ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n            className: \"recharts-label-list\"\n        }, data.map(function(entry, index) {\n            var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(dataKey) ? valueAccessor(entry, index) : Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry && entry.payload, dataKey), idProps = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? {} : {\n                id: id + \"-\" + index\n            };\n            return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__Label__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(entry), others, idProps, {\n                index: index,\n                value: value,\n                viewBox: __WEBPACK_IMPORTED_MODULE_7__Label__.a.parseViewBox(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(clockWise) ? entry : _extends({}, entry, {\n                    clockWise: clockWise\n                })),\n                key: \"label-\" + index\n            }));\n        })) : null;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_lodash_last__ = __webpack_require__(922), __WEBPACK_IMPORTED_MODULE_3_lodash_last___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_last__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, propTypes = {\n        id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object),\n        valueAccessor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        clockWise: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n        dataKey: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ])\n    }, defaultProps = {\n        valueAccessor: function(entry) {\n            return __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(entry.value) ? __WEBPACK_IMPORTED_MODULE_3_lodash_last___default()(entry.value) : entry.value;\n        }\n    };\n    LabelList.propTypes = propTypes, LabelList.displayName = \"LabelList\";\n    var parseLabelList = function(label, data) {\n        return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, {\n            key: \"labelList-implicit\",\n            data: data\n        }) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, {\n            key: \"labelList-implicit\",\n            data: data,\n            content: label\n        }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, _extends({\n            data: data\n        }, label, {\n            key: \"labelList-implicit\"\n        })) : null : null;\n    }, renderCallByParent = function(parentProps, data) {\n        var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2];\n        if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null;\n        var children = parentProps.children, explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.h)(children, LabelList).map(function(child, index) {\n            return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(child, {\n                data: data,\n                key: \"labelList-\" + index\n            });\n        });\n        return ckeckPropsLabel ? [ parseLabelList(parentProps.label, data) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren;\n    };\n    LabelList.renderCallByParent = renderCallByParent, LabelList.defaultProps = defaultProps, \n    __webpack_exports__.a = LabelList;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_range__ = __webpack_require__(373), __WEBPACK_IMPORTED_MODULE_2_lodash_range___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_range__), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle__ = __webpack_require__(933), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_throttle__), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8__container_Surface__ = __webpack_require__(82), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_11__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_12__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_13__shape_Cross__ = __webpack_require__(367), __WEBPACK_IMPORTED_MODULE_14__shape_Sector__ = __webpack_require__(139), __WEBPACK_IMPORTED_MODULE_15__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__ = __webpack_require__(70), __WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__ = __webpack_require__(374), __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__ = __webpack_require__(372), __WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__ = __webpack_require__(198), __WEBPACK_IMPORTED_MODULE_21__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_24__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_25__util_Events__ = __webpack_require__(934), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), ORIENT_MAP = {\n        xAxis: [ \"bottom\", \"top\" ],\n        yAxis: [ \"left\", \"right\" ]\n    }, originCoordinate = {\n        x: 0,\n        y: 0\n    }, generateCategoricalChart = function(_ref) {\n        var _class, _temp, _initialiseProps, chartName = _ref.chartName, GraphicalChild = _ref.GraphicalChild, _ref$eventType = _ref.eventType, eventType = void 0 === _ref$eventType ? \"axis\" : _ref$eventType, axisComponents = _ref.axisComponents, legendContent = _ref.legendContent, formatAxisMap = _ref.formatAxisMap, defaultProps = _ref.defaultProps, propTypes = _ref.propTypes;\n        return _temp = _class = function(_Component) {\n            function CategoricalChartWrapper(props) {\n                _classCallCheck(this, CategoricalChartWrapper);\n                var _this = _possibleConstructorReturn(this, (CategoricalChartWrapper.__proto__ || Object.getPrototypeOf(CategoricalChartWrapper)).call(this, props));\n                _initialiseProps.call(_this);\n                var defaultState = _this.constructor.createDefaultState(props);\n                return _this.state = _extends({}, defaultState, {\n                    updateId: 0\n                }, _this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({\n                    props: props\n                }, defaultState, {\n                    updateId: 0\n                }))), _this.uniqueChartId = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(props.id) ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.k)(\"recharts\") : props.id, \n                props.throttleDelay && (_this.triggeredAfterMouseMove = __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default()(_this.triggeredAfterMouseMove, props.throttleDelay)), \n                _this;\n            }\n            return _inherits(CategoricalChartWrapper, _Component), _createClass(CategoricalChartWrapper, [ {\n                key: \"componentDidMount\",\n                value: function() {\n                    __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.addListener();\n                }\n            }, {\n                key: \"componentWillReceiveProps\",\n                value: function(nextProps) {\n                    var _props = this.props, data = _props.data, children = _props.children, width = _props.width, height = _props.height, layout = _props.layout, stackOffset = _props.stackOffset, margin = _props.margin, updateId = this.state.updateId;\n                    if (nextProps.data === data && nextProps.width === width && nextProps.height === height && nextProps.layout === layout && nextProps.stackOffset === stackOffset && Object(__WEBPACK_IMPORTED_MODULE_24__util_PureRender__.b)(nextProps.margin, margin)) {\n                        if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.m)(nextProps.children, children)) {\n                            var hasGlobalData = !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.data), newUpdateId = hasGlobalData ? updateId : updateId + 1, _state = this.state, dataStartIndex = _state.dataStartIndex, dataEndIndex = _state.dataEndIndex, _defaultState = _extends({}, this.constructor.createDefaultState(nextProps), {\n                                dataEndIndex: dataEndIndex,\n                                dataStartIndex: dataStartIndex\n                            });\n                            this.setState(_extends({}, _defaultState, {\n                                updateId: newUpdateId\n                            }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({\n                                props: nextProps\n                            }, _defaultState, {\n                                updateId: newUpdateId\n                            }))));\n                        }\n                    } else {\n                        var defaultState = this.constructor.createDefaultState(nextProps);\n                        this.setState(_extends({}, defaultState, {\n                            updateId: updateId + 1\n                        }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({\n                            props: nextProps\n                        }, defaultState, {\n                            updateId: updateId + 1\n                        }))));\n                    }\n                    __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.addListener(), \n                    !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.removeListener();\n                }\n            }, {\n                key: \"componentWillUnmount\",\n                value: function() {\n                    __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.removeListener(), \n                    \"function\" == typeof this.triggeredAfterMouseMove.cancel && this.triggeredAfterMouseMove.cancel();\n                }\n            }, {\n                key: \"getAxisMap\",\n                value: function(props, _ref2) {\n                    var _ref2$axisType = _ref2.axisType, axisType = void 0 === _ref2$axisType ? \"xAxis\" : _ref2$axisType, AxisComp = _ref2.AxisComp, graphicalItems = _ref2.graphicalItems, stackGroups = _ref2.stackGroups, dataStartIndex = _ref2.dataStartIndex, dataEndIndex = _ref2.dataEndIndex, children = props.children, axisIdKey = axisType + \"Id\", axes = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, AxisComp), axisMap = {};\n                    return axes && axes.length ? axisMap = this.getAxisMapByAxes(props, {\n                        axes: axes,\n                        graphicalItems: graphicalItems,\n                        axisType: axisType,\n                        axisIdKey: axisIdKey,\n                        stackGroups: stackGroups,\n                        dataStartIndex: dataStartIndex,\n                        dataEndIndex: dataEndIndex\n                    }) : graphicalItems && graphicalItems.length && (axisMap = this.getAxisMapByItems(props, {\n                        Axis: AxisComp,\n                        graphicalItems: graphicalItems,\n                        axisType: axisType,\n                        axisIdKey: axisIdKey,\n                        stackGroups: stackGroups,\n                        dataStartIndex: dataStartIndex,\n                        dataEndIndex: dataEndIndex\n                    })), axisMap;\n                }\n            }, {\n                key: \"getAxisMapByAxes\",\n                value: function(props, _ref3) {\n                    var _this2 = this, axes = _ref3.axes, graphicalItems = _ref3.graphicalItems, axisType = _ref3.axisType, axisIdKey = _ref3.axisIdKey, stackGroups = _ref3.stackGroups, dataStartIndex = _ref3.dataStartIndex, dataEndIndex = _ref3.dataEndIndex, layout = props.layout, children = props.children, stackOffset = props.stackOffset, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType);\n                    return axes.reduce(function(result, child) {\n                        var _child$props = child.props, type = _child$props.type, dataKey = _child$props.dataKey, allowDataOverflow = _child$props.allowDataOverflow, allowDuplicatedCategory = _child$props.allowDuplicatedCategory, scale = _child$props.scale, ticks = _child$props.ticks, axisId = child.props[axisIdKey], displayedData = _this2.constructor.getDisplayedData(props, {\n                            graphicalItems: graphicalItems.filter(function(item) {\n                                return item.props[axisIdKey] === axisId;\n                            }),\n                            dataStartIndex: dataStartIndex,\n                            dataEndIndex: dataEndIndex\n                        }), len = displayedData.length;\n                        if (!result[axisId]) {\n                            var domain = void 0, duplicateDomain = void 0, categoricalDomain = void 0;\n                            if (dataKey) {\n                                if (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, type), \n                                \"category\" === type && isCategorial) {\n                                    var duplicate = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.e)(domain);\n                                    allowDuplicatedCategory && duplicate ? (duplicateDomain = domain, domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len)) : allowDuplicatedCategory || (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) {\n                                        return finalDomain.indexOf(entry) >= 0 ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]);\n                                    }, []));\n                                } else if (\"category\" === type) domain = allowDuplicatedCategory ? domain.filter(function(entry) {\n                                    return \"\" !== entry && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry);\n                                }) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) {\n                                    return finalDomain.indexOf(entry) >= 0 || \"\" === entry || __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry) ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]);\n                                }, []); else if (\"number\" === type) {\n                                    var errorBarsDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.z)(displayedData, graphicalItems.filter(function(item) {\n                                        return item.props[axisIdKey] === axisId && !item.props.hide;\n                                    }), dataKey, axisType);\n                                    errorBarsDomain && (domain = errorBarsDomain);\n                                }\n                                !isCategorial || \"number\" !== type && \"auto\" === scale || (categoricalDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, \"category\"));\n                            } else domain = isCategorial ? __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack && \"number\" === type ? \"expand\" === stackOffset ? [ 0, 1 ] : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) {\n                                return item.props[axisIdKey] === axisId && !item.props.hide;\n                            }), type, !0);\n                            return \"number\" === type && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType, ticks), \n                            child.props.domain && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(child.props.domain, domain, allowDataOverflow))), \n                            _extends({}, result, _defineProperty({}, axisId, _extends({}, child.props, {\n                                axisType: axisType,\n                                domain: domain,\n                                categoricalDomain: categoricalDomain,\n                                duplicateDomain: duplicateDomain,\n                                originalDomain: child.props.domain,\n                                isCategorial: isCategorial,\n                                layout: layout\n                            })));\n                        }\n                        return result;\n                    }, {});\n                }\n            }, {\n                key: \"getAxisMapByItems\",\n                value: function(props, _ref4) {\n                    var graphicalItems = _ref4.graphicalItems, Axis = _ref4.Axis, axisType = _ref4.axisType, axisIdKey = _ref4.axisIdKey, stackGroups = _ref4.stackGroups, dataStartIndex = _ref4.dataStartIndex, dataEndIndex = _ref4.dataEndIndex, layout = props.layout, children = props.children, displayedData = this.constructor.getDisplayedData(props, {\n                        graphicalItems: graphicalItems,\n                        dataStartIndex: dataStartIndex,\n                        dataEndIndex: dataEndIndex\n                    }), len = displayedData.length, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType), index = -1;\n                    return graphicalItems.reduce(function(result, child) {\n                        var axisId = child.props[axisIdKey];\n                        if (!result[axisId]) {\n                            index++;\n                            var domain = void 0;\n                            return isCategorial ? domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack ? (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex), \n                            domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)) : (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(Axis.defaultProps.domain, Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) {\n                                return item.props[axisIdKey] === axisId && !item.props.hide;\n                            }), \"number\"), Axis.defaultProps.allowDataOverflow), domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)), \n                            _extends({}, result, _defineProperty({}, axisId, _extends({\n                                axisType: axisType\n                            }, Axis.defaultProps, {\n                                hide: !0,\n                                orientation: ORIENT_MAP[axisType] && ORIENT_MAP[axisType][index % 2],\n                                domain: domain,\n                                originalDomain: Axis.defaultProps.domain,\n                                isCategorial: isCategorial,\n                                layout: layout\n                            })));\n                        }\n                        return result;\n                    }, {});\n                }\n            }, {\n                key: \"getActiveCoordinate\",\n                value: function(tooltipTicks, activeIndex, rangeObj) {\n                    var layout = this.props.layout, entry = tooltipTicks.find(function(tick) {\n                        return tick && tick.index === activeIndex;\n                    });\n                    if (entry) {\n                        if (\"horizontal\" === layout) return {\n                            x: entry.coordinate,\n                            y: rangeObj.y\n                        };\n                        if (\"vertical\" === layout) return {\n                            x: rangeObj.x,\n                            y: entry.coordinate\n                        };\n                        if (\"centric\" === layout) {\n                            var _angle = entry.coordinate, _radius = rangeObj.radius;\n                            return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, _radius, _angle), {\n                                angle: _angle,\n                                radius: _radius\n                            });\n                        }\n                        var radius = entry.coordinate, angle = rangeObj.angle;\n                        return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, radius, angle), {\n                            angle: angle,\n                            radius: radius\n                        });\n                    }\n                    return originCoordinate;\n                }\n            }, {\n                key: \"getMouseInfo\",\n                value: function(event) {\n                    if (!this.container) return null;\n                    var containerOffset = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.b)(this.container), e = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.a)(event, containerOffset), rangeObj = this.inRange(e.chartX, e.chartY);\n                    if (!rangeObj) return null;\n                    var _state2 = this.state, xAxisMap = _state2.xAxisMap, yAxisMap = _state2.yAxisMap;\n                    if (\"axis\" !== eventType && xAxisMap && yAxisMap) {\n                        var xScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap).scale, yScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap).scale, xValue = xScale && xScale.invert ? xScale.invert(e.chartX) : null, yValue = yScale && yScale.invert ? yScale.invert(e.chartY) : null;\n                        return _extends({}, e, {\n                            xValue: xValue,\n                            yValue: yValue\n                        });\n                    }\n                    var _state3 = this.state, ticks = _state3.orderedTooltipTicks, axis = _state3.tooltipAxis, tooltipTicks = _state3.tooltipTicks, pos = this.calculateTooltipPos(rangeObj), activeIndex = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.b)(pos, ticks, tooltipTicks, axis);\n                    if (activeIndex >= 0 && tooltipTicks) {\n                        var activeLabel = tooltipTicks[activeIndex] && tooltipTicks[activeIndex].value, activePayload = this.getTooltipContent(activeIndex, activeLabel), activeCoordinate = this.getActiveCoordinate(ticks, activeIndex, rangeObj);\n                        return _extends({}, e, {\n                            activeTooltipIndex: activeIndex,\n                            activeLabel: activeLabel,\n                            activePayload: activePayload,\n                            activeCoordinate: activeCoordinate\n                        });\n                    }\n                    return null;\n                }\n            }, {\n                key: \"getTooltipContent\",\n                value: function(activeIndex, activeLabel) {\n                    var _state4 = this.state, graphicalItems = _state4.graphicalItems, tooltipAxis = _state4.tooltipAxis, displayedData = this.constructor.getDisplayedData(this.props, this.state);\n                    return activeIndex < 0 || !graphicalItems || !graphicalItems.length || activeIndex >= displayedData.length ? null : graphicalItems.reduce(function(result, child) {\n                        if (child.props.hide) return result;\n                        var _child$props2 = child.props, dataKey = _child$props2.dataKey, name = _child$props2.name, unit = _child$props2.unit, formatter = _child$props2.formatter, data = _child$props2.data, payload = void 0;\n                        return payload = tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(data || displayedData, tooltipAxis.dataKey, activeLabel) : displayedData[activeIndex], \n                        payload ? [].concat(_toConsumableArray(result), [ _extends({}, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(child), {\n                            dataKey: dataKey,\n                            unit: unit,\n                            formatter: formatter,\n                            name: name || dataKey,\n                            color: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(child),\n                            value: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.w)(payload, dataKey),\n                            payload: payload\n                        }) ]) : result;\n                    }, []);\n                }\n            }, {\n                key: \"getFormatItems\",\n                value: function(props, currentState) {\n                    var _this3 = this, graphicalItems = currentState.graphicalItems, stackGroups = currentState.stackGroups, offset = currentState.offset, updateId = currentState.updateId, dataStartIndex = currentState.dataStartIndex, dataEndIndex = currentState.dataEndIndex, barSize = props.barSize, layout = props.layout, barGap = props.barGap, barCategoryGap = props.barCategoryGap, globalMaxBarSize = props.maxBarSize, _getAxisNameByLayout = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout.numericAxisName, cateAxisName = _getAxisNameByLayout.cateAxisName, hasBar = this.constructor.hasBar(graphicalItems), sizeList = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.i)({\n                        barSize: barSize,\n                        stackGroups: stackGroups\n                    }), formatedItems = [];\n                    return graphicalItems.forEach(function(item, index) {\n                        var displayedData = _this3.constructor.getDisplayedData(props, {\n                            dataStartIndex: dataStartIndex,\n                            dataEndIndex: dataEndIndex\n                        }, item), _item$props = item.props, dataKey = _item$props.dataKey, childMaxBarSize = _item$props.maxBarSize, numericAxisId = item.props[numericAxisName + \"Id\"], cateAxisId = item.props[cateAxisName + \"Id\"], axisObj = axisComponents.reduce(function(result, entry) {\n                            var _extends4, axisMap = currentState[entry.axisType + \"Map\"], id = item.props[entry.axisType + \"Id\"], axis = axisMap && axisMap[id];\n                            return _extends({}, result, (_extends4 = {}, _defineProperty(_extends4, entry.axisType, axis), \n                            _defineProperty(_extends4, entry.axisType + \"Ticks\", Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis)), \n                            _extends4));\n                        }, {}), cateAxis = axisObj[cateAxisName], cateTicks = axisObj[cateAxisName + \"Ticks\"], stackedData = stackGroups && stackGroups[numericAxisId] && stackGroups[numericAxisId].hasStack && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.t)(item, stackGroups[numericAxisId].stackGroups), bandSize = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(cateAxis, cateTicks), maxBarSize = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(childMaxBarSize) ? globalMaxBarSize : childMaxBarSize, barPosition = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.h)({\n                            barGap: barGap,\n                            barCategoryGap: barCategoryGap,\n                            bandSize: bandSize,\n                            sizeList: sizeList[cateAxisId],\n                            maxBarSize: maxBarSize\n                        }), componsedFn = item && item.type && item.type.getComposedData;\n                        if (componsedFn) {\n                            var _extends5;\n                            formatedItems.push({\n                                props: _extends({}, componsedFn(_extends({}, axisObj, {\n                                    displayedData: displayedData,\n                                    props: props,\n                                    dataKey: dataKey,\n                                    item: item,\n                                    bandSize: bandSize,\n                                    barPosition: barPosition,\n                                    offset: offset,\n                                    stackedData: stackedData,\n                                    layout: layout,\n                                    dataStartIndex: dataStartIndex,\n                                    dataEndIndex: dataEndIndex,\n                                    onItemMouseLeave: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseLeave, null, item.props.onMouseLeave),\n                                    onItemMouseEnter: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseEnter, null, item.props.onMouseEnter)\n                                })), (_extends5 = {\n                                    key: item.key || \"item-\" + index\n                                }, _defineProperty(_extends5, numericAxisName, axisObj[numericAxisName]), _defineProperty(_extends5, cateAxisName, axisObj[cateAxisName]), \n                                _defineProperty(_extends5, \"animationId\", updateId), _extends5)),\n                                childIndex: Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.o)(item, props.children),\n                                item: item\n                            });\n                        }\n                    }), formatedItems;\n                }\n            }, {\n                key: \"getCursorRectangle\",\n                value: function() {\n                    var layout = this.props.layout, _state5 = this.state, activeCoordinate = _state5.activeCoordinate, offset = _state5.offset, tooltipAxisBandSize = _state5.tooltipAxisBandSize, halfSize = tooltipAxisBandSize / 2;\n                    return {\n                        stroke: \"none\",\n                        fill: \"#ccc\",\n                        x: \"horizontal\" === layout ? activeCoordinate.x - halfSize : offset.left + .5,\n                        y: \"horizontal\" === layout ? offset.top + .5 : activeCoordinate.y - halfSize,\n                        width: \"horizontal\" === layout ? tooltipAxisBandSize : offset.width - 1,\n                        height: \"horizontal\" === layout ? offset.height - 1 : tooltipAxisBandSize\n                    };\n                }\n            }, {\n                key: \"getCursorPoints\",\n                value: function() {\n                    var layout = this.props.layout, _state6 = this.state, activeCoordinate = _state6.activeCoordinate, offset = _state6.offset, x1 = void 0, y1 = void 0, x2 = void 0, y2 = void 0;\n                    if (\"horizontal\" === layout) x1 = activeCoordinate.x, x2 = x1, y1 = offset.top, \n                    y2 = offset.top + offset.height; else if (\"vertical\" === layout) y1 = activeCoordinate.y, \n                    y2 = y1, x1 = offset.left, x2 = offset.left + offset.width; else if (!__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cx) || !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cy)) {\n                        if (\"centric\" !== layout) {\n                            var _cx = activeCoordinate.cx, _cy = activeCoordinate.cy, radius = activeCoordinate.radius, startAngle = activeCoordinate.startAngle, endAngle = activeCoordinate.endAngle, startPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, startAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, endAngle);\n                            return {\n                                points: [ startPoint, endPoint ],\n                                cx: _cx,\n                                cy: _cy,\n                                radius: radius,\n                                startAngle: startAngle,\n                                endAngle: endAngle\n                            };\n                        }\n                        var cx = activeCoordinate.cx, cy = activeCoordinate.cy, innerRadius = activeCoordinate.innerRadius, outerRadius = activeCoordinate.outerRadius, angle = activeCoordinate.angle, innerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, innerRadius, angle), outerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, outerRadius, angle);\n                        x1 = innerPoint.x, y1 = innerPoint.y, x2 = outerPoint.x, y2 = outerPoint.y;\n                    }\n                    return [ {\n                        x: x1,\n                        y: y1\n                    }, {\n                        x: x2,\n                        y: y2\n                    } ];\n                }\n            }, {\n                key: \"getAxisNameByLayout\",\n                value: function(layout) {\n                    return \"horizontal\" === layout ? {\n                        numericAxisName: \"yAxis\",\n                        cateAxisName: \"xAxis\"\n                    } : \"vertical\" === layout ? {\n                        numericAxisName: \"xAxis\",\n                        cateAxisName: \"yAxis\"\n                    } : \"centric\" === layout ? {\n                        numericAxisName: \"radiusAxis\",\n                        cateAxisName: \"angleAxis\"\n                    } : {\n                        numericAxisName: \"angleAxis\",\n                        cateAxisName: \"radiusAxis\"\n                    };\n                }\n            }, {\n                key: \"calculateTooltipPos\",\n                value: function(rangeObj) {\n                    var layout = this.props.layout;\n                    return \"horizontal\" === layout ? rangeObj.x : \"vertical\" === layout ? rangeObj.y : \"centric\" === layout ? rangeObj.angle : rangeObj.radius;\n                }\n            }, {\n                key: \"inRange\",\n                value: function(x, y) {\n                    var layout = this.props.layout;\n                    if (\"horizontal\" === layout || \"vertical\" === layout) {\n                        var offset = this.state.offset;\n                        return x >= offset.left && x <= offset.left + offset.width && y >= offset.top && y <= offset.top + offset.height ? {\n                            x: x,\n                            y: y\n                        } : null;\n                    }\n                    var _state7 = this.state, angleAxisMap = _state7.angleAxisMap, radiusAxisMap = _state7.radiusAxisMap;\n                    if (angleAxisMap && radiusAxisMap) {\n                        var angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap);\n                        return Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.d)({\n                            x: x,\n                            y: y\n                        }, angleAxis);\n                    }\n                    return null;\n                }\n            }, {\n                key: \"parseEventsOfWrapper\",\n                value: function() {\n                    var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), tooltipEvents = tooltipItem && \"axis\" === eventType ? {\n                        onMouseEnter: this.handleMouseEnter,\n                        onMouseMove: this.handleMouseMove,\n                        onMouseLeave: this.handleMouseLeave,\n                        onTouchMove: this.handleTouchMove\n                    } : {}, outerEvents = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(this.props, this.handleOuterEvent);\n                    return _extends({}, outerEvents, tooltipEvents);\n                }\n            }, {\n                key: \"updateStateOfAxisMapsOffsetAndStackGroups\",\n                value: function(_ref5) {\n                    var _this4 = this, props = _ref5.props, dataStartIndex = _ref5.dataStartIndex, dataEndIndex = _ref5.dataEndIndex, updateId = _ref5.updateId;\n                    if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)({\n                        props: props\n                    })) return null;\n                    var children = props.children, layout = props.layout, stackOffset = props.stackOffset, data = props.data, reverseStackOrder = props.reverseStackOrder, _getAxisNameByLayout2 = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout2.numericAxisName, cateAxisName = _getAxisNameByLayout2.cateAxisName, graphicalItems = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, GraphicalChild), stackGroups = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.s)(data, graphicalItems, numericAxisName + \"Id\", cateAxisName + \"Id\", stackOffset, reverseStackOrder), axisObj = axisComponents.reduce(function(result, entry) {\n                        var name = entry.axisType + \"Map\";\n                        return _extends({}, result, _defineProperty({}, name, _this4.getAxisMap(props, _extends({}, entry, {\n                            graphicalItems: graphicalItems,\n                            stackGroups: entry.axisType === numericAxisName && stackGroups,\n                            dataStartIndex: dataStartIndex,\n                            dataEndIndex: dataEndIndex\n                        }))));\n                    }, {}), offset = this.calculateOffset(_extends({}, axisObj, {\n                        props: props,\n                        graphicalItems: graphicalItems\n                    }));\n                    Object.keys(axisObj).forEach(function(key) {\n                        axisObj[key] = formatAxisMap(props, axisObj[key], offset, key.replace(\"Map\", \"\"), chartName);\n                    });\n                    var cateAxisMap = axisObj[cateAxisName + \"Map\"], ticksObj = this.tooltipTicksGenerator(cateAxisMap), formatedGraphicalItems = this.getFormatItems(props, _extends({}, axisObj, {\n                        dataStartIndex: dataStartIndex,\n                        dataEndIndex: dataEndIndex,\n                        updateId: updateId,\n                        graphicalItems: graphicalItems,\n                        stackGroups: stackGroups,\n                        offset: offset\n                    }));\n                    return _extends({\n                        formatedGraphicalItems: formatedGraphicalItems,\n                        graphicalItems: graphicalItems,\n                        offset: offset,\n                        stackGroups: stackGroups\n                    }, ticksObj, axisObj);\n                }\n            }, {\n                key: \"addListener\",\n                value: function() {\n                    __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.on(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), \n                    __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners + 1);\n                }\n            }, {\n                key: \"removeListener\",\n                value: function() {\n                    __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.removeListener(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), \n                    __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners - 1);\n                }\n            }, {\n                key: \"calculateOffset\",\n                value: function(_ref6) {\n                    var props = _ref6.props, graphicalItems = _ref6.graphicalItems, _ref6$xAxisMap = _ref6.xAxisMap, xAxisMap = void 0 === _ref6$xAxisMap ? {} : _ref6$xAxisMap, _ref6$yAxisMap = _ref6.yAxisMap, yAxisMap = void 0 === _ref6$yAxisMap ? {} : _ref6$yAxisMap, width = props.width, height = props.height, children = props.children, margin = props.margin || {}, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a), legendItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_11__component_Legend__.a), offsetH = Object.keys(yAxisMap).reduce(function(result, id) {\n                        var entry = yAxisMap[id], orientation = entry.orientation;\n                        return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.width));\n                    }, {\n                        left: margin.left || 0,\n                        right: margin.right || 0\n                    }), offsetV = Object.keys(xAxisMap).reduce(function(result, id) {\n                        var entry = xAxisMap[id], orientation = entry.orientation;\n                        return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.height));\n                    }, {\n                        top: margin.top || 0,\n                        bottom: margin.bottom || 0\n                    }), offset = _extends({}, offsetV, offsetH), brushBottom = offset.bottom;\n                    if (brushItem && (offset.bottom += brushItem.props.height || __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a.defaultProps.height), \n                    legendItem && this.legendInstance) {\n                        var legendBox = this.legendInstance.getBBox();\n                        offset = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.a)(offset, graphicalItems, props, legendBox);\n                    }\n                    return _extends({\n                        brushBottom: brushBottom\n                    }, offset, {\n                        width: width - offset.left - offset.right,\n                        height: height - offset.top - offset.bottom\n                    });\n                }\n            }, {\n                key: \"triggerSyncEvent\",\n                value: function(data) {\n                    var syncId = this.props.syncId;\n                    __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(syncId) || __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.emit(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, syncId, this.uniqueChartId, data);\n                }\n            }, {\n                key: \"filterFormatItem\",\n                value: function(item, displayName, childIndex) {\n                    for (var formatedGraphicalItems = this.state.formatedGraphicalItems, i = 0, len = formatedGraphicalItems.length; i < len; i++) {\n                        var entry = formatedGraphicalItems[i];\n                        if (entry.item === item || entry.props.key === item.key || displayName === Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(entry.item.type) && childIndex === entry.childIndex) return entry;\n                    }\n                    return null;\n                }\n            }, {\n                key: \"renderAxis\",\n                value: function(axisOptions, element, displayName, index) {\n                    var _props2 = this.props, width = _props2.width, height = _props2.height;\n                    return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a, _extends({}, axisOptions, {\n                        className: \"recharts-\" + axisOptions.axisType + \" \" + axisOptions.axisType,\n                        key: element.key || displayName + \"-\" + index,\n                        viewBox: {\n                            x: 0,\n                            y: 0,\n                            width: width,\n                            height: height\n                        },\n                        ticksGenerator: this.axesTicksGenerator\n                    }));\n                }\n            }, {\n                key: \"renderLegend\",\n                value: function() {\n                    var _this5 = this, formatedGraphicalItems = this.state.formatedGraphicalItems, _props3 = this.props, children = _props3.children, width = _props3.width, height = _props3.height, margin = this.props.margin || {}, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), props = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.q)({\n                        children: children,\n                        formatedGraphicalItems: formatedGraphicalItems,\n                        legendWidth: legendWidth,\n                        legendHeight: legendHeight,\n                        legendContent: legendContent\n                    });\n                    if (!props) return null;\n                    var item = props.item, otherProps = _objectWithoutProperties(props, [ \"item\" ]);\n                    return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(item, _extends({}, otherProps, {\n                        chartWidth: width,\n                        chartHeight: height,\n                        margin: margin,\n                        ref: function(legend) {\n                            _this5.legendInstance = legend;\n                        },\n                        onBBoxUpdate: this.handleLegendBBoxUpdate\n                    }));\n                }\n            }, {\n                key: \"renderTooltip\",\n                value: function() {\n                    var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a);\n                    if (!tooltipItem) return null;\n                    var _state8 = this.state, isTooltipActive = _state8.isTooltipActive, activeCoordinate = _state8.activeCoordinate, activePayload = _state8.activePayload, activeLabel = _state8.activeLabel, offset = _state8.offset;\n                    return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(tooltipItem, {\n                        viewBox: _extends({}, offset, {\n                            x: offset.left,\n                            y: offset.top\n                        }),\n                        active: isTooltipActive,\n                        label: activeLabel,\n                        payload: isTooltipActive ? activePayload : [],\n                        coordinate: activeCoordinate\n                    });\n                }\n            }, {\n                key: \"renderActiveDot\",\n                value: function(option, props) {\n                    var dot = void 0;\n                    return dot = Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(option) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_15__shape_Dot__.a, props), \n                    __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {\n                        className: \"recharts-active-dot\",\n                        key: props.key\n                    }, dot);\n                }\n            }, {\n                key: \"renderActivePoints\",\n                value: function(_ref7) {\n                    var item = _ref7.item, activePoint = _ref7.activePoint, basePoint = _ref7.basePoint, childIndex = _ref7.childIndex, isRange = _ref7.isRange, result = [], key = item.props.key, _item$item$props = item.item.props, activeDot = _item$item$props.activeDot, dataKey = _item$item$props.dataKey, dotProps = _extends({\n                        index: childIndex,\n                        dataKey: dataKey,\n                        cx: activePoint.x,\n                        cy: activePoint.y,\n                        r: 4,\n                        fill: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(item.item),\n                        strokeWidth: 2,\n                        stroke: \"#fff\",\n                        payload: activePoint.payload,\n                        value: activePoint.value,\n                        key: key + \"-activePoint-\" + childIndex\n                    }, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(activeDot), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(activeDot));\n                    return result.push(this.renderActiveDot(activeDot, dotProps, childIndex)), basePoint ? result.push(this.renderActiveDot(activeDot, _extends({}, dotProps, {\n                        cx: basePoint.x,\n                        cy: basePoint.y,\n                        key: key + \"-basePoint-\" + childIndex\n                    }), childIndex)) : isRange && result.push(null), result;\n                }\n            }, {\n                key: \"render\",\n                value: function() {\n                    var _this6 = this;\n                    if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)(this)) return null;\n                    var _props4 = this.props, children = _props4.children, className = _props4.className, width = _props4.width, height = _props4.height, style = _props4.style, compact = _props4.compact, others = _objectWithoutProperties(_props4, [ \"children\", \"className\", \"width\", \"height\", \"style\", \"compact\" ]), attrs = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(others), map = {\n                        CartesianGrid: {\n                            handler: this.renderGrid,\n                            once: !0\n                        },\n                        ReferenceArea: {\n                            handler: this.renderReferenceElement\n                        },\n                        ReferenceLine: {\n                            handler: this.renderReferenceElement\n                        },\n                        ReferenceDot: {\n                            handler: this.renderReferenceElement\n                        },\n                        XAxis: {\n                            handler: this.renderXAxis\n                        },\n                        YAxis: {\n                            handler: this.renderYAxis\n                        },\n                        Brush: {\n                            handler: this.renderBrush,\n                            once: !0\n                        },\n                        Bar: {\n                            handler: this.renderGraphicChild\n                        },\n                        Line: {\n                            handler: this.renderGraphicChild\n                        },\n                        Area: {\n                            handler: this.renderGraphicChild\n                        },\n                        Radar: {\n                            handler: this.renderGraphicChild\n                        },\n                        RadialBar: {\n                            handler: this.renderGraphicChild\n                        },\n                        Scatter: {\n                            handler: this.renderGraphicChild\n                        },\n                        Pie: {\n                            handler: this.renderGraphicChild\n                        },\n                        Tooltip: {\n                            handler: this.renderCursor,\n                            once: !0\n                        },\n                        PolarGrid: {\n                            handler: this.renderPolarGrid,\n                            once: !0\n                        },\n                        PolarAngleAxis: {\n                            handler: this.renderPolarAxis\n                        },\n                        PolarRadiusAxis: {\n                            handler: this.renderPolarAxis\n                        }\n                    };\n                    if (compact) return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, {\n                        width: width,\n                        height: height\n                    }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map));\n                    var events = this.parseEventsOfWrapper();\n                    return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"div\", _extends({\n                        className: __WEBPACK_IMPORTED_MODULE_7_classnames___default()(\"recharts-wrapper\", className),\n                        style: _extends({}, style, {\n                            position: \"relative\",\n                            cursor: \"default\",\n                            width: width,\n                            height: height\n                        })\n                    }, events, {\n                        ref: function(node) {\n                            _this6.container = node;\n                        }\n                    }), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, {\n                        width: width,\n                        height: height\n                    }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)), this.renderLegend(), this.renderTooltip());\n                }\n            } ]), CategoricalChartWrapper;\n        }(__WEBPACK_IMPORTED_MODULE_5_react__.Component), _class.displayName = chartName, \n        _class.propTypes = _extends({\n            syncId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),\n            compact: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n            width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n            height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n            data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object),\n            layout: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"horizontal\", \"vertical\" ]),\n            stackOffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"sign\", \"expand\", \"none\", \"wiggle\", \"silhouette\" ]),\n            throttleDelay: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n            margin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.shape({\n                top: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n                right: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n                bottom: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n                left: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number\n            }),\n            barCategoryGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n            barGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n            barSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n            maxBarSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n            style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,\n            className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n            children: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node ]),\n            onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n            onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n            onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n            onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n            onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n            onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n            reverseStackOrder: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n            id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string\n        }, propTypes), _class.defaultProps = _extends({\n            layout: \"horizontal\",\n            stackOffset: \"none\",\n            barCategoryGap: \"10%\",\n            barGap: 4,\n            margin: {\n                top: 5,\n                right: 5,\n                bottom: 5,\n                left: 5\n            },\n            reverseStackOrder: !1\n        }, defaultProps), _class.createDefaultState = function(props) {\n            var children = props.children, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a);\n            return {\n                chartX: 0,\n                chartY: 0,\n                dataStartIndex: brushItem && brushItem.props && brushItem.props.startIndex || 0,\n                dataEndIndex: brushItem && brushItem.props && brushItem.props.endIndex || props.data && props.data.length - 1 || 0,\n                activeTooltipIndex: -1,\n                isTooltipActive: !1\n            };\n        }, _class.hasBar = function(graphicalItems) {\n            return !(!graphicalItems || !graphicalItems.length) && graphicalItems.some(function(item) {\n                var name = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(item && item.type);\n                return name && name.indexOf(\"Bar\") >= 0;\n            });\n        }, _class.getDisplayedData = function(props, _ref8, item) {\n            var graphicalItems = _ref8.graphicalItems, dataStartIndex = _ref8.dataStartIndex, dataEndIndex = _ref8.dataEndIndex, itemsData = (graphicalItems || []).reduce(function(result, child) {\n                var itemData = child.props.data;\n                return itemData && itemData.length ? [].concat(_toConsumableArray(result), _toConsumableArray(itemData)) : result;\n            }, []);\n            if (itemsData && itemsData.length > 0) return itemsData;\n            if (item && item.props && item.props.data && item.props.data.length > 0) return item.props.data;\n            var data = props.data;\n            return data && data.length && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataStartIndex) && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataEndIndex) ? data.slice(dataStartIndex, dataEndIndex + 1) : [];\n        }, _initialiseProps = function() {\n            var _this7 = this;\n            this.handleLegendBBoxUpdate = function(box) {\n                if (box && _this7.legendInstance) {\n                    var _state9 = _this7.state, dataStartIndex = _state9.dataStartIndex, dataEndIndex = _state9.dataEndIndex, updateId = _state9.updateId;\n                    _this7.setState(_this7.updateStateOfAxisMapsOffsetAndStackGroups({\n                        props: _this7.props,\n                        dataStartIndex: dataStartIndex,\n                        dataEndIndex: dataEndIndex,\n                        updateId: updateId\n                    }));\n                }\n            }, this.handleReceiveSyncEvent = function(cId, chartId, data) {\n                var _props5 = _this7.props, syncId = _props5.syncId, layout = _props5.layout, updateId = _this7.state.updateId;\n                if (syncId === cId && chartId !== _this7.uniqueChartId) {\n                    var dataStartIndex = data.dataStartIndex, dataEndIndex = data.dataEndIndex;\n                    if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataStartIndex) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataEndIndex)) if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.activeTooltipIndex)) _this7.setState(data); else {\n                        var chartX = data.chartX, chartY = data.chartY, activeTooltipIndex = data.activeTooltipIndex, _state10 = _this7.state, offset = _state10.offset, tooltipTicks = _state10.tooltipTicks;\n                        if (!offset) return;\n                        var viewBox = _extends({}, offset, {\n                            x: offset.left,\n                            y: offset.top\n                        }), validateChartX = Math.min(chartX, viewBox.x + viewBox.width), validateChartY = Math.min(chartY, viewBox.y + viewBox.height), activeLabel = tooltipTicks[activeTooltipIndex] && tooltipTicks[activeTooltipIndex].value, activePayload = _this7.getTooltipContent(activeTooltipIndex), activeCoordinate = tooltipTicks[activeTooltipIndex] ? {\n                            x: \"horizontal\" === layout ? tooltipTicks[activeTooltipIndex].coordinate : validateChartX,\n                            y: \"horizontal\" === layout ? validateChartY : tooltipTicks[activeTooltipIndex].coordinate\n                        } : originCoordinate;\n                        _this7.setState(_extends({}, data, {\n                            activeLabel: activeLabel,\n                            activeCoordinate: activeCoordinate,\n                            activePayload: activePayload\n                        }));\n                    } else _this7.setState(_extends({\n                        dataStartIndex: dataStartIndex,\n                        dataEndIndex: dataEndIndex\n                    }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({\n                        props: _this7.props,\n                        dataStartIndex: dataStartIndex,\n                        dataEndIndex: dataEndIndex,\n                        updateId: updateId\n                    })));\n                }\n            }, this.handleBrushChange = function(_ref9) {\n                var startIndex = _ref9.startIndex, endIndex = _ref9.endIndex;\n                if (startIndex !== _this7.state.dataStartIndex || endIndex !== _this7.state.dataEndIndex) {\n                    var updateId = _this7.state.updateId;\n                    _this7.setState(function() {\n                        return _extends({\n                            dataStartIndex: startIndex,\n                            dataEndIndex: endIndex\n                        }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({\n                            props: _this7.props,\n                            dataStartIndex: startIndex,\n                            dataEndIndex: endIndex,\n                            updateId: updateId\n                        }));\n                    }), _this7.triggerSyncEvent({\n                        dataStartIndex: startIndex,\n                        dataEndIndex: endIndex\n                    });\n                }\n            }, this.handleMouseEnter = function(e) {\n                var onMouseEnter = _this7.props.onMouseEnter, mouse = _this7.getMouseInfo(e);\n                if (mouse) {\n                    var nextState = _extends({}, mouse, {\n                        isTooltipActive: !0\n                    });\n                    _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseEnter) && onMouseEnter(nextState, e);\n                }\n            }, this.triggeredAfterMouseMove = function(e) {\n                var onMouseMove = _this7.props.onMouseMove, mouse = _this7.getMouseInfo(e), nextState = mouse ? _extends({}, mouse, {\n                    isTooltipActive: !0\n                }) : {\n                    isTooltipActive: !1\n                };\n                _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseMove) && onMouseMove(nextState, e);\n            }, this.handleItemMouseEnter = function(el) {\n                _this7.setState(function() {\n                    return {\n                        isTooltipActive: !0,\n                        activeItem: el,\n                        activePayload: el.tooltipPayload,\n                        activeCoordinate: el.tooltipPosition || {\n                            x: el.cx,\n                            y: el.cy\n                        }\n                    };\n                });\n            }, this.handleItemMouseLeave = function() {\n                _this7.setState(function() {\n                    return {\n                        isTooltipActive: !1\n                    };\n                });\n            }, this.handleMouseMove = function(e) {\n                e && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(e.persist) && e.persist(), \n                _this7.triggeredAfterMouseMove(e);\n            }, this.handleMouseLeave = function(e) {\n                var onMouseLeave = _this7.props.onMouseLeave, nextState = {\n                    isTooltipActive: !1\n                };\n                _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseLeave) && onMouseLeave(nextState, e);\n            }, this.handleOuterEvent = function(e) {\n                var eventName = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.l)(e);\n                if (eventName && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(_this7.props[eventName])) {\n                    var mouse = _this7.getMouseInfo(e);\n                    (0, _this7.props[eventName])(mouse, e);\n                }\n            }, this.handleClick = function(e) {\n                var onClick = _this7.props.onClick;\n                if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onClick)) {\n                    onClick(_this7.getMouseInfo(e), e);\n                }\n            }, this.handleMouseDown = function(e) {\n                var onMouseDown = _this7.props.onMouseDown;\n                if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseDown)) {\n                    onMouseDown(_this7.getMouseInfo(e), e);\n                }\n            }, this.handleMouseUp = function(e) {\n                var onMouseUp = _this7.props.onMouseUp;\n                if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseUp)) {\n                    onMouseUp(_this7.getMouseInfo(e), e);\n                }\n            }, this.handleTouchMove = function(e) {\n                null != e.changedTouches && e.changedTouches.length > 0 && _this7.handleMouseMove(e.changedTouches[0]);\n            }, this.verticalCoordinatesGenerator = function(_ref10) {\n                var xAxis = _ref10.xAxis, width = _ref10.width, height = _ref10.height, offset = _ref10.offset;\n                return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, xAxis, {\n                    ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(xAxis, !0),\n                    viewBox: {\n                        x: 0,\n                        y: 0,\n                        width: width,\n                        height: height\n                    }\n                })), offset.left, offset.left + offset.width);\n            }, this.horizontalCoordinatesGenerator = function(_ref11) {\n                var yAxis = _ref11.yAxis, width = _ref11.width, height = _ref11.height, offset = _ref11.offset;\n                return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, yAxis, {\n                    ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(yAxis, !0),\n                    viewBox: {\n                        x: 0,\n                        y: 0,\n                        width: width,\n                        height: height\n                    }\n                })), offset.top, offset.top + offset.height);\n            }, this.axesTicksGenerator = function(axis) {\n                return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !0);\n            }, this.tooltipTicksGenerator = function(axisMap) {\n                var axis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(axisMap), tooltipTicks = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !1, !0);\n                return {\n                    tooltipTicks: tooltipTicks,\n                    orderedTooltipTicks: __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default()(tooltipTicks, function(o) {\n                        return o.coordinate;\n                    }),\n                    tooltipAxis: axis,\n                    tooltipAxisBandSize: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(axis)\n                };\n            }, this.renderCursor = function(element) {\n                var _state11 = _this7.state, isTooltipActive = _state11.isTooltipActive, activeCoordinate = _state11.activeCoordinate, activePayload = _state11.activePayload, offset = _state11.offset;\n                if (!(element && element.props.cursor && isTooltipActive && activeCoordinate)) return null;\n                var layout = _this7.props.layout, restProps = void 0, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a;\n                if (\"ScatterChart\" === chartName) restProps = activeCoordinate, cursorComp = __WEBPACK_IMPORTED_MODULE_13__shape_Cross__.a; else if (\"BarChart\" === chartName) restProps = _this7.getCursorRectangle(), \n                cursorComp = __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__.a; else if (\"radial\" === layout) {\n                    var _getCursorPoints = _this7.getCursorPoints(), cx = _getCursorPoints.cx, cy = _getCursorPoints.cy, radius = _getCursorPoints.radius, startAngle = _getCursorPoints.startAngle, endAngle = _getCursorPoints.endAngle;\n                    restProps = {\n                        cx: cx,\n                        cy: cy,\n                        startAngle: startAngle,\n                        endAngle: endAngle,\n                        innerRadius: radius,\n                        outerRadius: radius\n                    }, cursorComp = __WEBPACK_IMPORTED_MODULE_14__shape_Sector__.a;\n                } else restProps = {\n                    points: _this7.getCursorPoints()\n                }, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a;\n                var key = element.key || \"_recharts-cursor\", cursorProps = _extends({\n                    stroke: \"#ccc\"\n                }, offset, restProps, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(element.props.cursor), {\n                    payload: activePayload,\n                    key: key,\n                    className: \"recharts-tooltip-cursor\"\n                });\n                return Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(element.props.cursor) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element.props.cursor, cursorProps) : Object(__WEBPACK_IMPORTED_MODULE_5_react__.createElement)(cursorComp, cursorProps);\n            }, this.renderPolarAxis = function(element, displayName, index) {\n                var axisType = element.type.axisType, axisMap = _this7.state[axisType + \"Map\"], axisOption = axisMap[element.props[axisType + \"Id\"]];\n                return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, _extends({}, axisOption, {\n                    className: axisType,\n                    key: element.key || displayName + \"-\" + index,\n                    ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axisOption, !0)\n                }));\n            }, this.renderXAxis = function(element, displayName, index) {\n                var xAxisMap = _this7.state.xAxisMap, axisObj = xAxisMap[element.props.xAxisId];\n                return _this7.renderAxis(axisObj, element, displayName, index);\n            }, this.renderYAxis = function(element, displayName, index) {\n                var yAxisMap = _this7.state.yAxisMap, axisObj = yAxisMap[element.props.yAxisId];\n                return _this7.renderAxis(axisObj, element, displayName, index);\n            }, this.renderGrid = function(element) {\n                var _state12 = _this7.state, xAxisMap = _state12.xAxisMap, yAxisMap = _state12.yAxisMap, offset = _state12.offset, _props6 = _this7.props, width = _props6.width, height = _props6.height, xAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap), yAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap), props = element.props || {};\n                return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {\n                    key: element.key || \"grid\",\n                    x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.x) ? props.x : offset.left,\n                    y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.y) ? props.y : offset.top,\n                    width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.width) ? props.width : offset.width,\n                    height: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.height) ? props.height : offset.height,\n                    xAxis: xAxis,\n                    yAxis: yAxis,\n                    offset: offset,\n                    chartWidth: width,\n                    chartHeight: height,\n                    verticalCoordinatesGenerator: _this7.verticalCoordinatesGenerator,\n                    horizontalCoordinatesGenerator: _this7.horizontalCoordinatesGenerator\n                });\n            }, this.renderPolarGrid = function(element) {\n                var _state13 = _this7.state, radiusAxisMap = _state13.radiusAxisMap, angleAxisMap = _state13.angleAxisMap, radiusAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(radiusAxisMap), angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap), cx = angleAxis.cx, cy = angleAxis.cy, innerRadius = angleAxis.innerRadius, outerRadius = angleAxis.outerRadius;\n                return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {\n                    polarAngles: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(angleAxis, !0).map(function(entry) {\n                        return entry.coordinate;\n                    }),\n                    polarRadius: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(radiusAxis, !0).map(function(entry) {\n                        return entry.coordinate;\n                    }),\n                    cx: cx,\n                    cy: cy,\n                    innerRadius: innerRadius,\n                    outerRadius: outerRadius,\n                    key: element.key || \"polar-grid\"\n                });\n            }, this.renderBrush = function(element) {\n                var _props7 = _this7.props, margin = _props7.margin, data = _props7.data, _state14 = _this7.state, offset = _state14.offset, dataStartIndex = _state14.dataStartIndex, dataEndIndex = _state14.dataEndIndex, updateId = _state14.updateId;\n                return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {\n                    key: element.key || \"_recharts-brush\",\n                    onChange: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this7.handleBrushChange, null, element.props.onChange),\n                    data: data,\n                    x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.x) ? element.props.x : offset.left,\n                    y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.y) ? element.props.y : offset.top + offset.height + offset.brushBottom - (margin.bottom || 0),\n                    width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.width) ? element.props.width : offset.width,\n                    startIndex: dataStartIndex,\n                    endIndex: dataEndIndex,\n                    updateId: \"brush-\" + updateId\n                });\n            }, this.renderReferenceElement = function(element, displayName, index) {\n                if (!element) return null;\n                var _state15 = _this7.state, xAxisMap = _state15.xAxisMap, yAxisMap = _state15.yAxisMap, offset = _state15.offset, _element$props = element.props, xAxisId = _element$props.xAxisId, yAxisId = _element$props.yAxisId;\n                return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, {\n                    key: element.key || displayName + \"-\" + index,\n                    xAxis: xAxisMap[xAxisId],\n                    yAxis: yAxisMap[yAxisId],\n                    viewBox: {\n                        x: offset.left,\n                        y: offset.top,\n                        width: offset.width,\n                        height: offset.height\n                    }\n                });\n            }, this.renderGraphicChild = function(element, displayName, index) {\n                var item = _this7.filterFormatItem(element, displayName, index);\n                if (!item) return null;\n                var graphicalItem = Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, item.props), _state16 = _this7.state, isTooltipActive = _state16.isTooltipActive, tooltipAxis = _state16.tooltipAxis, activeTooltipIndex = _state16.activeTooltipIndex, activeLabel = _state16.activeLabel, children = _this7.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), _item$props2 = item.props, points = _item$props2.points, isRange = _item$props2.isRange, baseLine = _item$props2.baseLine, _item$item$props2 = item.item.props, activeDot = _item$item$props2.activeDot;\n                if (!_item$item$props2.hide && isTooltipActive && tooltipItem && activeDot && activeTooltipIndex >= 0) {\n                    var activePoint = void 0, basePoint = void 0;\n                    if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? (activePoint = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(points, \"payload.\" + tooltipAxis.dataKey, activeLabel), \n                    basePoint = isRange && baseLine && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(baseLine, \"payload.\" + tooltipAxis.dataKey, activeLabel)) : (activePoint = points[activeTooltipIndex], \n                    basePoint = isRange && baseLine && baseLine[activeTooltipIndex]), !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activePoint)) return [ graphicalItem ].concat(_toConsumableArray(_this7.renderActivePoints({\n                        item: item,\n                        activePoint: activePoint,\n                        basePoint: basePoint,\n                        childIndex: activeTooltipIndex,\n                        isRange: isRange\n                    })));\n                }\n                return isRange ? [ graphicalItem, null, null ] : [ graphicalItem, null ];\n            };\n        }, _temp;\n    };\n    __webpack_exports__.a = generateCategoricalChart;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function invariant(condition, format, a, b, c, d, e, f) {\n            if (validateFormat(format), !condition) {\n                var error;\n                if (void 0 === format) error = new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\"); else {\n                    var args = [ a, b, c, d, e, f ], argIndex = 0;\n                    error = new Error(format.replace(/%s/g, function() {\n                        return args[argIndex++];\n                    })), error.name = \"Invariant Violation\";\n                }\n                throw error.framesToPop = 1, error;\n            }\n        }\n        var validateFormat = function(format) {};\n        \"production\" !== process.env.NODE_ENV && (validateFormat = function(format) {\n            if (void 0 === format) throw new Error(\"invariant requires an error message argument\");\n        }), module.exports = invariant;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function makeEmptyFunction(arg) {\n        return function() {\n            return arg;\n        };\n    }\n    var emptyFunction = function() {};\n    emptyFunction.thatReturns = makeEmptyFunction, emptyFunction.thatReturnsFalse = makeEmptyFunction(!1), \n    emptyFunction.thatReturnsTrue = makeEmptyFunction(!0), emptyFunction.thatReturnsNull = makeEmptyFunction(null), \n    emptyFunction.thatReturnsThis = function() {\n        return this;\n    }, emptyFunction.thatReturnsArgument = function(arg) {\n        return arg;\n    }, module.exports = emptyFunction;\n}, function(module, exports, __webpack_require__) {\n    var aFunction = __webpack_require__(223);\n    module.exports = function(fn, that, length) {\n        if (aFunction(fn), void 0 === that) return fn;\n        switch (length) {\n          case 1:\n            return function(a) {\n                return fn.call(that, a);\n            };\n\n          case 2:\n            return function(a, b) {\n                return fn.call(that, a, b);\n            };\n\n          case 3:\n            return function(a, b, c) {\n                return fn.call(that, a, b, c);\n            };\n        }\n        return function() {\n            return fn.apply(that, arguments);\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(35);\n    module.exports = function(it) {\n        if (!isObject(it)) throw TypeError(it + \" is not an object!\");\n        return it;\n    };\n}, function(module, exports) {\n    module.exports = function(exec) {\n        try {\n            return !!exec();\n        } catch (e) {\n            return !0;\n        }\n    };\n}, function(module, exports) {\n    var hasOwnProperty = {}.hasOwnProperty;\n    module.exports = function(it, key) {\n        return hasOwnProperty.call(it, key);\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(421),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function capitalize(string) {\n            if (\"production\" !== process.env.NODE_ENV && \"string\" != typeof string) throw new Error(\"Material-UI: capitalize(string) expects a string argument.\");\n            return string.charAt(0).toUpperCase() + string.slice(1);\n        }\n        function contains(obj, pred) {\n            return (0, _keys2.default)(pred).every(function(key) {\n                return obj.hasOwnProperty(key) && obj[key] === pred[key];\n            });\n        }\n        function findIndex(arr, pred) {\n            for (var predType = void 0 === pred ? \"undefined\" : (0, _typeof3.default)(pred), i = 0; i < arr.length; i += 1) {\n                if (\"function\" === predType && !0 == !!pred(arr[i], i, arr)) return i;\n                if (\"object\" === predType && contains(arr[i], pred)) return i;\n                if (-1 !== [ \"string\", \"number\", \"boolean\" ].indexOf(predType)) return arr.indexOf(pred);\n            }\n            return -1;\n        }\n        function find(arr, pred) {\n            var index = findIndex(arr, pred);\n            return index > -1 ? arr[index] : void 0;\n        }\n        function createChainedFunction() {\n            for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) funcs[_key] = arguments[_key];\n            return funcs.filter(function(func) {\n                return null != func;\n            }).reduce(function(acc, func) {\n                return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(\"function\" == typeof func, \"Material-UI: invalid Argument Type, must only provide functions, undefined, or null.\"), \n                function() {\n                    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2];\n                    acc.apply(this, args), func.apply(this, args);\n                };\n            }, function() {});\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2), _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys);\n        exports.capitalize = capitalize, exports.contains = contains, exports.findIndex = findIndex, \n        exports.find = find, exports.createChainedFunction = createChainedFunction;\n        var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    function getNative(object, key) {\n        var value = getValue(object, key);\n        return baseIsNative(value) ? value : void 0;\n    }\n    var baseIsNative = __webpack_require__(611), getValue = __webpack_require__(614);\n    module.exports = getNative;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return function() {\n            return x;\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    function getNative(object, key) {\n        var value = getValue(object, key);\n        return baseIsNative(value) ? value : void 0;\n    }\n    var baseIsNative = __webpack_require__(668), getValue = __webpack_require__(673);\n    module.exports = getNative;\n}, function(module, exports, __webpack_require__) {\n    function baseGetTag(value) {\n        return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);\n    }\n    var Symbol = __webpack_require__(128), getRawTag = __webpack_require__(669), objectToString = __webpack_require__(670), nullTag = \"[object Null]\", undefinedTag = \"[object Undefined]\", symToStringTag = Symbol ? Symbol.toStringTag : void 0;\n    module.exports = baseGetTag;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__ = __webpack_require__(771), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__), __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__ = __webpack_require__(198), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), BREAKING_SPACES = /[ \\f\\n\\r\\t\\v\\u2028\\u2029]+/, calculateWordWidths = function(props) {\n        try {\n            return {\n                wordsWithComputedWidth: (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES)).map(function(word) {\n                    return {\n                        word: word,\n                        width: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(word, props.style).width\n                    };\n                }),\n                spaceWidth: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(\" \", props.style).width\n            };\n        } catch (e) {\n            return null;\n        }\n    }, Text = (_temp2 = _class = function(_Component) {\n        function Text() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Text);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Text.__proto__ || Object.getPrototypeOf(Text)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                wordsByLines: []\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Text, _Component), _createClass(Text, [ {\n            key: \"componentWillMount\",\n            value: function() {\n                this.updateWordsByLines(this.props, !0);\n            }\n        }, {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var needCalculate = this.props.children !== nextProps.children || this.props.style !== nextProps.style;\n                this.updateWordsByLines(nextProps, needCalculate);\n            }\n        }, {\n            key: \"updateWordsByLines\",\n            value: function(props, needCalculate) {\n                if (!props.width && !props.scaleToFit || Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.n)()) this.updateWordsWithoutCalculate(props); else {\n                    if (needCalculate) {\n                        var wordWidths = calculateWordWidths(props);\n                        if (!wordWidths) return void this.updateWordsWithoutCalculate(props);\n                        var wordsWithComputedWidth = wordWidths.wordsWithComputedWidth, spaceWidth = wordWidths.spaceWidth;\n                        this.wordsWithComputedWidth = wordsWithComputedWidth, this.spaceWidth = spaceWidth;\n                    }\n                    var wordsByLines = this.calculateWordsByLines(this.wordsWithComputedWidth, this.spaceWidth, props.width);\n                    this.setState({\n                        wordsByLines: wordsByLines\n                    });\n                }\n            }\n        }, {\n            key: \"updateWordsWithoutCalculate\",\n            value: function(props) {\n                var words = __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES);\n                this.setState({\n                    wordsByLines: [ {\n                        words: words\n                    } ]\n                });\n            }\n        }, {\n            key: \"calculateWordsByLines\",\n            value: function(wordsWithComputedWidth, spaceWidth, lineWidth) {\n                var scaleToFit = this.props.scaleToFit;\n                return wordsWithComputedWidth.reduce(function(result, _ref2) {\n                    var word = _ref2.word, width = _ref2.width, currentLine = result[result.length - 1];\n                    if (currentLine && (null == lineWidth || scaleToFit || currentLine.width + width + spaceWidth < lineWidth)) currentLine.words.push(word), \n                    currentLine.width += width + spaceWidth; else {\n                        var newLine = {\n                            words: [ word ],\n                            width: width\n                        };\n                        result.push(newLine);\n                    }\n                    return result;\n                }, []);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, dx = _props.dx, dy = _props.dy, textAnchor = _props.textAnchor, verticalAnchor = _props.verticalAnchor, scaleToFit = _props.scaleToFit, angle = _props.angle, lineHeight = _props.lineHeight, capHeight = _props.capHeight, className = _props.className, textProps = _objectWithoutProperties(_props, [ \"dx\", \"dy\", \"textAnchor\", \"verticalAnchor\", \"scaleToFit\", \"angle\", \"lineHeight\", \"capHeight\", \"className\" ]), wordsByLines = this.state.wordsByLines;\n                if (!Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.x) || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.y)) return null;\n                var x = textProps.x + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dx) ? dx : 0), y = textProps.y + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dy) ? dy : 0), startDy = void 0;\n                switch (verticalAnchor) {\n                  case \"start\":\n                    startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()(\"calc(\" + capHeight + \")\");\n                    break;\n\n                  case \"middle\":\n                    startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()(\"calc(\" + (wordsByLines.length - 1) / 2 + \" * -\" + lineHeight + \" + (\" + capHeight + \" / 2))\");\n                    break;\n\n                  default:\n                    startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()(\"calc(\" + (wordsByLines.length - 1) + \" * -\" + lineHeight + \")\");\n                }\n                var transforms = [];\n                if (scaleToFit) {\n                    var lineWidth = wordsByLines[0].width;\n                    transforms.push(\"scale(\" + this.props.width / lineWidth + \")\");\n                }\n                return angle && transforms.push(\"rotate(\" + angle + \", \" + x + \", \" + y + \")\"), \n                transforms.length && (textProps.transform = transforms.join(\" \")), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"text\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.k)(textProps), {\n                    x: x,\n                    y: y,\n                    className: __WEBPACK_IMPORTED_MODULE_4_classnames___default()(\"recharts-text\", className),\n                    textAnchor: textAnchor\n                }), wordsByLines.map(function(line, index) {\n                    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"tspan\", {\n                        x: x,\n                        dy: 0 === index ? startDy : lineHeight,\n                        key: index\n                    }, line.words.join(\" \"));\n                }));\n            }\n        } ]), Text;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.c, {\n        scaleToFit: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        angle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        textAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"start\", \"middle\", \"end\", \"inherit\" ]),\n        verticalAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"start\", \"middle\", \"end\" ]),\n        style: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object\n    }), _class.defaultProps = {\n        x: 0,\n        y: 0,\n        lineHeight: \"1em\",\n        capHeight: \"0.71em\",\n        scaleToFit: !1,\n        textAnchor: \"start\",\n        verticalAnchor: \"end\"\n    }, _temp2);\n    __webpack_exports__.a = Text;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return map;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return slice;\n    });\n    var array = Array.prototype, map = array.map, slice = array.slice;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Dot = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Dot() {\n            return _classCallCheck(this, Dot), _possibleConstructorReturn(this, (Dot.__proto__ || Object.getPrototypeOf(Dot)).apply(this, arguments));\n        }\n        return _inherits(Dot, _Component), _createClass(Dot, [ {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, cx = _props.cx, cy = _props.cy, r = _props.r, className = _props.className, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()(\"recharts-dot\", className);\n                return cx === +cx && cy === +cy && r === +r ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"circle\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props, null, !0), {\n                    className: layerClass,\n                    cx: cx,\n                    cy: cy,\n                    r: r\n                })) : null;\n            }\n        } ]), Dot;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"Dot\", _class2.propTypes = {\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        r: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = Dot;\n}, function(module, exports, __webpack_require__) {\n    var IObject = __webpack_require__(146), defined = __webpack_require__(148);\n    module.exports = function(it) {\n        return IObject(defined(it));\n    };\n}, function(module, exports, __webpack_require__) {\n    var defined = __webpack_require__(148);\n    module.exports = function(it) {\n        return Object(defined(it));\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _toCss = __webpack_require__(163), _toCss2 = _interopRequireDefault(_toCss), _toCssValue = __webpack_require__(110), _toCssValue2 = _interopRequireDefault(_toCssValue), StyleRule = function() {\n        function StyleRule(key, style, options) {\n            _classCallCheck(this, StyleRule), this.type = \"style\", this.isProcessed = !1;\n            var sheet = options.sheet, Renderer = options.Renderer, selector = options.selector;\n            this.key = key, this.options = options, this.style = style, selector && (this.selectorText = selector), \n            this.renderer = sheet ? sheet.renderer : new Renderer();\n        }\n        return _createClass(StyleRule, [ {\n            key: \"prop\",\n            value: function(name, value) {\n                if (void 0 === value) return this.style[name];\n                if (this.style[name] === value) return this;\n                value = this.options.jss.plugins.onChangeValue(value, name, this);\n                var isEmpty = null == value || !1 === value, isDefined = name in this.style;\n                if (isEmpty && !isDefined) return this;\n                var remove = isEmpty && isDefined;\n                if (remove ? delete this.style[name] : this.style[name] = value, this.renderable) return remove ? this.renderer.removeProperty(this.renderable, name) : this.renderer.setProperty(this.renderable, name, value), \n                this;\n                var sheet = this.options.sheet;\n                return sheet && sheet.attached && (0, _warning2.default)(!1, 'Rule is not linked. Missing sheet option \"link: true\".'), \n                this;\n            }\n        }, {\n            key: \"applyTo\",\n            value: function(renderable) {\n                var json = this.toJSON();\n                for (var prop in json) this.renderer.setProperty(renderable, prop, json[prop]);\n                return this;\n            }\n        }, {\n            key: \"toJSON\",\n            value: function() {\n                var json = {};\n                for (var prop in this.style) {\n                    var value = this.style[prop];\n                    \"object\" !== (void 0 === value ? \"undefined\" : _typeof(value)) ? json[prop] = value : Array.isArray(value) && (json[prop] = (0, \n                    _toCssValue2.default)(value));\n                }\n                return json;\n            }\n        }, {\n            key: \"toString\",\n            value: function(options) {\n                var sheet = this.options.sheet, link = !!sheet && sheet.options.link, opts = link ? _extends({}, options, {\n                    allowEmpty: !0\n                }) : options;\n                return (0, _toCss2.default)(this.selector, this.style, opts);\n            }\n        }, {\n            key: \"selector\",\n            set: function(selector) {\n                if (selector !== this.selectorText && (this.selectorText = selector, this.renderable)) {\n                    if (!this.renderer.setSelector(this.renderable, selector) && this.renderable) {\n                        var renderable = this.renderer.replaceRule(this.renderable, this);\n                        renderable && (this.renderable = renderable);\n                    }\n                }\n            },\n            get: function() {\n                return this.selectorText;\n            }\n        } ]), StyleRule;\n    }();\n    exports.default = StyleRule;\n}, function(module, exports, __webpack_require__) {\n    function isSymbol(value) {\n        return \"symbol\" == typeof value || isObjectLike(value) && baseGetTag(value) == symbolTag;\n    }\n    var baseGetTag = __webpack_require__(41), isObjectLike = __webpack_require__(42), symbolTag = \"[object Symbol]\";\n    module.exports = isSymbol;\n}, function(module, exports) {\n    function identity(value) {\n        return value;\n    }\n    module.exports = identity;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(a, b) {\n        return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_3_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react_smooth__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), getRectangePath = function(x, y, width, height, radius) {\n        var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2), sign = height >= 0 ? 1 : -1, clockWise = height >= 0 ? 1 : 0, path = void 0;\n        if (maxRadius > 0 && radius instanceof Array) {\n            for (var newRadius = [], i = 0; i < 4; i++) newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i];\n            path = \"M\" + x + \",\" + (y + sign * newRadius[0]), newRadius[0] > 0 && (path += \"A \" + newRadius[0] + \",\" + newRadius[0] + \",0,0,\" + clockWise + \",\" + (x + newRadius[0]) + \",\" + y), \n            path += \"L \" + (x + width - newRadius[1]) + \",\" + y, newRadius[1] > 0 && (path += \"A \" + newRadius[1] + \",\" + newRadius[1] + \",0,0,\" + clockWise + \",\\n        \" + (x + width) + \",\" + (y + sign * newRadius[1])), \n            path += \"L \" + (x + width) + \",\" + (y + height - sign * newRadius[2]), newRadius[2] > 0 && (path += \"A \" + newRadius[2] + \",\" + newRadius[2] + \",0,0,\" + clockWise + \",\\n        \" + (x + width - newRadius[2]) + \",\" + (y + height)), \n            path += \"L \" + (x + newRadius[3]) + \",\" + (y + height), newRadius[3] > 0 && (path += \"A \" + newRadius[3] + \",\" + newRadius[3] + \",0,0,\" + clockWise + \",\\n        \" + x + \",\" + (y + height - sign * newRadius[3])), \n            path += \"Z\";\n        } else if (maxRadius > 0 && radius === +radius && radius > 0) {\n            var _newRadius = Math.min(maxRadius, radius);\n            path = \"M \" + x + \",\" + (y + sign * _newRadius) + \"\\n            A \" + _newRadius + \",\" + _newRadius + \",0,0,\" + clockWise + \",\" + (x + _newRadius) + \",\" + y + \"\\n            L \" + (x + width - _newRadius) + \",\" + y + \"\\n            A \" + _newRadius + \",\" + _newRadius + \",0,0,\" + clockWise + \",\" + (x + width) + \",\" + (y + sign * _newRadius) + \"\\n            L \" + (x + width) + \",\" + (y + height - sign * _newRadius) + \"\\n            A \" + _newRadius + \",\" + _newRadius + \",0,0,\" + clockWise + \",\" + (x + width - _newRadius) + \",\" + (y + height) + \"\\n            L \" + (x + _newRadius) + \",\" + (y + height) + \"\\n            A \" + _newRadius + \",\" + _newRadius + \",0,0,\" + clockWise + \",\" + x + \",\" + (y + height - sign * _newRadius) + \" Z\";\n        } else path = \"M \" + x + \",\" + y + \" h \" + width + \" v \" + height + \" h \" + -width + \" Z\";\n        return path;\n    }, Rectangle = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Rectangle() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Rectangle);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Rectangle.__proto__ || Object.getPrototypeOf(Rectangle)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                totalLength: -1\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Rectangle, _Component), _createClass(Rectangle, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                if (this.node && this.node.getTotalLength) try {\n                    var totalLength = this.node.getTotalLength();\n                    totalLength && this.setState({\n                        totalLength: totalLength\n                    });\n                } catch (err) {}\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this, _props = this.props, x = _props.x, y = _props.y, width = _props.width, height = _props.height, radius = _props.radius, className = _props.className, totalLength = this.state.totalLength, _props2 = this.props, animationEasing = _props2.animationEasing, animationDuration = _props2.animationDuration, animationBegin = _props2.animationBegin, isAnimationActive = _props2.isAnimationActive, isUpdateAnimationActive = _props2.isUpdateAnimationActive;\n                if (x !== +x || y !== +y || width !== +width || height !== +height || 0 === width || 0 === height) return null;\n                var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()(\"recharts-rectangle\", className);\n                return isUpdateAnimationActive ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, {\n                    canBegin: totalLength > 0,\n                    from: {\n                        width: width,\n                        height: height,\n                        x: x,\n                        y: y\n                    },\n                    to: {\n                        width: width,\n                        height: height,\n                        x: x,\n                        y: y\n                    },\n                    duration: animationDuration,\n                    animationEasing: animationEasing,\n                    isActive: isUpdateAnimationActive\n                }, function(_ref2) {\n                    var currWidth = _ref2.width, currHeight = _ref2.height, currX = _ref2.x, currY = _ref2.y;\n                    return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, {\n                        canBegin: totalLength > 0,\n                        from: \"0px \" + (-1 === totalLength ? 1 : totalLength) + \"px\",\n                        to: totalLength + \"px 0px\",\n                        attributeName: \"strokeDasharray\",\n                        begin: animationBegin,\n                        duration: animationDuration,\n                        isActive: isAnimationActive,\n                        easing: animationEasing\n                    }, __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(_this2.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(_this2.props), {\n                        className: layerClass,\n                        d: getRectangePath(currX, currY, currWidth, currHeight, radius),\n                        ref: function(node) {\n                            _this2.node = node;\n                        }\n                    })));\n                }) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(this.props), {\n                    className: layerClass,\n                    d: getRectangePath(x, y, width, height, radius)\n                }));\n            }\n        } ]), Rectangle;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"Rectangle\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.a, {\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        radius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array ]),\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        isUpdateAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ])\n    }), _class2.defaultProps = {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        radius: 0,\n        isAnimationActive: !1,\n        isUpdateAnimationActive: !1,\n        animationBegin: 0,\n        animationDuration: 1500,\n        animationEasing: \"ease\"\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Rectangle;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), CURVE_FACTORIES = {\n        curveBasisClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.c,\n        curveBasisOpen: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.d,\n        curveBasis: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.b,\n        curveLinearClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.f,\n        curveLinear: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e,\n        curveMonotoneX: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.g,\n        curveMonotoneY: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.h,\n        curveNatural: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.i,\n        curveStep: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.j,\n        curveStepAfter: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.k,\n        curveStepBefore: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.l\n    }, defined = function(p) {\n        return p.x === +p.x && p.y === +p.y;\n    }, getX = function(p) {\n        return p.x;\n    }, getY = function(p) {\n        return p.y;\n    }, getCurveFactory = function(type, layout) {\n        if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(type)) return type;\n        var name = \"curve\" + type.slice(0, 1).toUpperCase() + type.slice(1);\n        return \"curveMonotone\" === name && layout ? CURVE_FACTORIES[name + (\"vertical\" === layout ? \"Y\" : \"X\")] : CURVE_FACTORIES[name] || __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e;\n    }, Curve = Object(__WEBPACK_IMPORTED_MODULE_6__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Curve() {\n            return _classCallCheck(this, Curve), _possibleConstructorReturn(this, (Curve.__proto__ || Object.getPrototypeOf(Curve)).apply(this, arguments));\n        }\n        return _inherits(Curve, _Component), _createClass(Curve, [ {\n            key: \"getPath\",\n            value: function() {\n                var _props = this.props, type = _props.type, points = _props.points, baseLine = _props.baseLine, layout = _props.layout, connectNulls = _props.connectNulls, curveFactory = getCurveFactory(type, layout), formatPoints = connectNulls ? points.filter(function(entry) {\n                    return defined(entry);\n                }) : points, lineFunction = void 0;\n                if (__WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default()(baseLine)) {\n                    var areaPoints = formatPoints.map(function(entry, index) {\n                        return _extends({}, entry, {\n                            base: baseLine[index]\n                        });\n                    });\n                    return lineFunction = \"vertical\" === layout ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(function(d) {\n                        return d.base.x;\n                    }) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(function(d) {\n                        return d.base.y;\n                    }), lineFunction.defined(defined).curve(curveFactory), lineFunction(areaPoints);\n                }\n                return lineFunction = \"vertical\" === layout && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.m)().x(getX).y(getY), \n                lineFunction.defined(defined).curve(curveFactory), lineFunction(formatPoints);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, className = _props2.className, points = _props2.points, path = _props2.path, pathRef = _props2.pathRef;\n                if (!(points && points.length || path)) return null;\n                var realPath = points && points.length ? this.getPath() : path;\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"path\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.e)(this.props, null, !0), {\n                    className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()(\"recharts-curve\", className),\n                    d: realPath,\n                    ref: pathRef\n                }));\n            }\n        } ]), Curve;\n    }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = \"Curve\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, {\n        className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        type: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ \"basis\", \"basisClosed\", \"basisOpen\", \"linear\", \"linearClosed\", \"natural\", \"monotoneX\", \"monotoneY\", \"monotone\", \"step\", \"stepBefore\", \"stepAfter\" ]), __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),\n        layout: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ \"horizontal\", \"vertical\" ]),\n        baseLine: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array ]),\n        points: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object),\n        connectNulls: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        path: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        pathRef: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func\n    }), _class2.defaultProps = {\n        type: \"linear\",\n        points: [],\n        connectNulls: !1\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = Curve;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), \n    __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), XAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function XAxis() {\n            return _classCallCheck(this, XAxis), _possibleConstructorReturn(this, (XAxis.__proto__ || Object.getPrototypeOf(XAxis)).apply(this, arguments));\n        }\n        return _inherits(XAxis, _Component), _createClass(XAxis, [ {\n            key: \"render\",\n            value: function() {\n                return null;\n            }\n        } ]), XAxis;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"XAxis\", \n    _class2.propTypes = {\n        allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        xAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"auto\", \"dataMin\", \"dataMax\" ]) ])),\n        dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),\n        width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"top\", \"bottom\" ]),\n        type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"number\", \"category\" ]),\n        ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array,\n        tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,\n        padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({\n            left: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n            right: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number\n        }),\n        allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.d), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),\n        tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]),\n        axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),\n        tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),\n        minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"preserveStart\", \"preserveEnd\", \"preserveStartEnd\" ]) ]),\n        reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool\n    }, _class2.defaultProps = {\n        allowDecimals: !0,\n        hide: !1,\n        orientation: \"bottom\",\n        width: 0,\n        height: 30,\n        mirror: !1,\n        xAxisId: 0,\n        tickCount: 5,\n        type: \"category\",\n        domain: [ 0, \"auto\" ],\n        padding: {\n            left: 0,\n            right: 0\n        },\n        allowDataOverflow: !1,\n        scale: \"auto\",\n        reversed: !1,\n        allowDuplicatedCategory: !0\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = XAxis;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), \n    __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), YAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function YAxis() {\n            return _classCallCheck(this, YAxis), _possibleConstructorReturn(this, (YAxis.__proto__ || Object.getPrototypeOf(YAxis)).apply(this, arguments));\n        }\n        return _inherits(YAxis, _Component), _createClass(YAxis, [ {\n            key: \"render\",\n            value: function() {\n                return null;\n            }\n        } ]), YAxis;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"YAxis\", \n    _class2.propTypes = {\n        allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"auto\", \"dataMin\", \"dataMax\" ]) ])),\n        dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),\n        ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array,\n        tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,\n        width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"left\", \"right\" ]),\n        type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"number\", \"category\" ]),\n        padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({\n            top: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n            bottom: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number\n        }),\n        allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool,\n        scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"auto\", \"linear\", \"pow\", \"sqrt\", \"log\", \"identity\", \"time\", \"band\", \"point\", \"ordinal\", \"quantile\", \"quantize\", \"utcTime\", \"sequential\", \"threshold\" ]), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),\n        tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]),\n        axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),\n        tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]),\n        minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"preserveStart\", \"preserveEnd\", \"preserveStartEnd\" ]) ]),\n        reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool\n    }, _class2.defaultProps = {\n        allowDuplicatedCategory: !0,\n        allowDecimals: !0,\n        hide: !1,\n        orientation: \"left\",\n        width: 60,\n        height: 0,\n        mirror: !1,\n        yAxisId: 0,\n        tickCount: 5,\n        type: \"number\",\n        domain: [ 0, \"auto\" ],\n        padding: {\n            top: 0,\n            bottom: 0\n        },\n        allowDataOverflow: !1,\n        scale: \"auto\",\n        reversed: !1\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = YAxis;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function toObject(val) {\n        if (null === val || void 0 === val) throw new TypeError(\"Object.assign cannot be called with null or undefined\");\n        return Object(val);\n    }\n    var getOwnPropertySymbols = Object.getOwnPropertySymbols, hasOwnProperty = Object.prototype.hasOwnProperty, propIsEnumerable = Object.prototype.propertyIsEnumerable;\n    module.exports = function() {\n        try {\n            if (!Object.assign) return !1;\n            var test1 = new String(\"abc\");\n            if (test1[5] = \"de\", \"5\" === Object.getOwnPropertyNames(test1)[0]) return !1;\n            for (var test2 = {}, i = 0; i < 10; i++) test2[\"_\" + String.fromCharCode(i)] = i;\n            if (\"0123456789\" !== Object.getOwnPropertyNames(test2).map(function(n) {\n                return test2[n];\n            }).join(\"\")) return !1;\n            var test3 = {};\n            return \"abcdefghijklmnopqrst\".split(\"\").forEach(function(letter) {\n                test3[letter] = letter;\n            }), \"abcdefghijklmnopqrst\" === Object.keys(Object.assign({}, test3)).join(\"\");\n        } catch (err) {\n            return !1;\n        }\n    }() ? Object.assign : function(target, source) {\n        for (var from, symbols, to = toObject(target), s = 1; s < arguments.length; s++) {\n            from = Object(arguments[s]);\n            for (var key in from) hasOwnProperty.call(from, key) && (to[key] = from[key]);\n            if (getOwnPropertySymbols) {\n                symbols = getOwnPropertySymbols(from);\n                for (var i = 0; i < symbols.length; i++) propIsEnumerable.call(from, symbols[i]) && (to[symbols[i]] = from[symbols[i]]);\n            }\n        }\n        return to;\n    };\n}, function(module, exports) {\n    module.exports = function(bitmap, value) {\n        return {\n            enumerable: !(1 & bitmap),\n            configurable: !(2 & bitmap),\n            writable: !(4 & bitmap),\n            value: value\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    var $keys = __webpack_require__(226), enumBugKeys = __webpack_require__(152);\n    module.exports = Object.keys || function(O) {\n        return $keys(O, enumBugKeys);\n    };\n}, function(module, exports) {\n    module.exports = {};\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function createBreakpoints(breakpoints) {\n        function up(key) {\n            return \"@media (min-width:\" + (\"number\" == typeof values[key] ? values[key] : key) + unit + \")\";\n        }\n        function down(key) {\n            var endIndex = keys.indexOf(key) + 1, upperbound = values[keys[endIndex]];\n            return endIndex === keys.length ? up(\"xs\") : \"@media (max-width:\" + ((\"number\" == typeof upperbound && endIndex > 0 ? upperbound : key) - step / 100) + unit + \")\";\n        }\n        function between(start, end) {\n            var endIndex = keys.indexOf(end) + 1;\n            return endIndex === keys.length ? up(start) : \"@media (min-width:\" + values[start] + unit + \") and (max-width:\" + (values[keys[endIndex]] - step / 100) + unit + \")\";\n        }\n        function only(key) {\n            return between(key, key);\n        }\n        function width(key) {\n            return values[key];\n        }\n        var _breakpoints$values = breakpoints.values, values = void 0 === _breakpoints$values ? {\n            xs: 0,\n            sm: 600,\n            md: 960,\n            lg: 1280,\n            xl: 1920\n        } : _breakpoints$values, _breakpoints$unit = breakpoints.unit, unit = void 0 === _breakpoints$unit ? \"px\" : _breakpoints$unit, _breakpoints$step = breakpoints.step, step = void 0 === _breakpoints$step ? 5 : _breakpoints$step, other = (0, \n        _objectWithoutProperties3.default)(breakpoints, [ \"values\", \"unit\", \"step\" ]);\n        return (0, _extends3.default)({\n            keys: keys,\n            values: values,\n            up: up,\n            down: down,\n            between: between,\n            only: only,\n            width: width\n        }, other);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.keys = void 0;\n    var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);\n    exports.default = createBreakpoints;\n    var keys = exports.keys = [ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ];\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _getDisplayName = __webpack_require__(244), _getDisplayName2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_getDisplayName), wrapDisplayName = function(BaseComponent, hocName) {\n        return hocName + \"(\" + (0, _getDisplayName2.default)(BaseComponent) + \")\";\n    };\n    exports.default = wrapDisplayName;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _createRule = __webpack_require__(111), _createRule2 = _interopRequireDefault(_createRule), _linkRule = __webpack_require__(249), _linkRule2 = _interopRequireDefault(_linkRule), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _escape = __webpack_require__(467), _escape2 = _interopRequireDefault(_escape), RuleList = function() {\n        function RuleList(options) {\n            _classCallCheck(this, RuleList), this.map = {}, this.raw = {}, this.index = [], \n            this.options = options, this.classes = options.classes;\n        }\n        return _createClass(RuleList, [ {\n            key: \"add\",\n            value: function(name, decl, options) {\n                var _options = this.options, parent = _options.parent, sheet = _options.sheet, jss = _options.jss, Renderer = _options.Renderer, generateClassName = _options.generateClassName;\n                options = _extends({\n                    classes: this.classes,\n                    parent: parent,\n                    sheet: sheet,\n                    jss: jss,\n                    Renderer: Renderer,\n                    generateClassName: generateClassName\n                }, options), !options.selector && this.classes[name] && (options.selector = \".\" + (0, \n                _escape2.default)(this.classes[name])), this.raw[name] = decl;\n                var rule = (0, _createRule2.default)(name, decl, options), className = void 0;\n                !options.selector && rule instanceof _StyleRule2.default && (className = generateClassName(rule, sheet), \n                rule.selector = \".\" + (0, _escape2.default)(className)), this.register(rule, className);\n                var index = void 0 === options.index ? this.index.length : options.index;\n                return this.index.splice(index, 0, rule), rule;\n            }\n        }, {\n            key: \"get\",\n            value: function(name) {\n                return this.map[name];\n            }\n        }, {\n            key: \"remove\",\n            value: function(rule) {\n                this.unregister(rule), this.index.splice(this.indexOf(rule), 1);\n            }\n        }, {\n            key: \"indexOf\",\n            value: function(rule) {\n                return this.index.indexOf(rule);\n            }\n        }, {\n            key: \"process\",\n            value: function() {\n                var plugins = this.options.jss.plugins;\n                this.index.slice(0).forEach(plugins.onProcessRule, plugins);\n            }\n        }, {\n            key: \"register\",\n            value: function(rule, className) {\n                this.map[rule.key] = rule, rule instanceof _StyleRule2.default && (this.map[rule.selector] = rule, \n                className && (this.classes[rule.key] = className));\n            }\n        }, {\n            key: \"unregister\",\n            value: function(rule) {\n                delete this.map[rule.key], rule instanceof _StyleRule2.default && (delete this.map[rule.selector], \n                delete this.classes[rule.key]);\n            }\n        }, {\n            key: \"update\",\n            value: function(name, data) {\n                var _options2 = this.options, plugins = _options2.jss.plugins, sheet = _options2.sheet;\n                if (\"string\" == typeof name) return void plugins.onUpdate(data, this.get(name), sheet);\n                for (var index = 0; index < this.index.length; index++) plugins.onUpdate(name, this.index[index], sheet);\n            }\n        }, {\n            key: \"link\",\n            value: function(cssRules) {\n                for (var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index), i = 0; i < cssRules.length; i++) {\n                    var cssRule = cssRules[i], _key = this.options.sheet.renderer.getKey(cssRule);\n                    map[_key] && (_key = map[_key]);\n                    var rule = this.map[_key];\n                    rule && (0, _linkRule2.default)(rule, cssRule);\n                }\n            }\n        }, {\n            key: \"toString\",\n            value: function(options) {\n                for (var str = \"\", sheet = this.options.sheet, link = !!sheet && sheet.options.link, index = 0; index < this.index.length; index++) {\n                    var rule = this.index[index], css = rule.toString(options);\n                    (css || link) && (str && (str += \"\\n\"), str += css);\n                }\n                return str;\n            }\n        } ]), RuleList;\n    }();\n    exports.default = RuleList;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, menuSkeletons = [ {\n        id: \"home\",\n        menu: {\n            title: \"Home\",\n            icon: \"home\"\n        }\n    }, {\n        id: \"chain\",\n        menu: {\n            title: \"Chain\",\n            icon: \"link\"\n        }\n    }, {\n        id: \"txpool\",\n        menu: {\n            title: \"TxPool\",\n            icon: \"credit-card\"\n        }\n    }, {\n        id: \"network\",\n        menu: {\n            title: \"Network\",\n            icon: \"globe\"\n        }\n    }, {\n        id: \"system\",\n        menu: {\n            title: \"System\",\n            icon: \"tachometer\"\n        }\n    }, {\n        id: \"logs\",\n        menu: {\n            title: \"Logs\",\n            icon: \"list\"\n        }\n    } ];\n    exports.MENU = new Map(menuSkeletons.map(function(_ref) {\n        var id = _ref.id, menu = _ref.menu;\n        return [ id, _extends({\n            id: id\n        }, menu) ];\n    })), exports.DURATION = 200, exports.styles = {\n        light: {\n            color: \"rgba(255, 255, 255, 0.54)\"\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function Surface(props) {\n        var children = props.children, width = props.width, height = props.height, viewBox = props.viewBox, className = props.className, style = props.style, others = _objectWithoutProperties(props, [ \"children\", \"width\", \"height\", \"viewBox\", \"className\", \"style\" ]), svgView = viewBox || {\n            width: width,\n            height: height,\n            x: 0,\n            y: 0\n        }, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()(\"recharts-surface\", className), attrs = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others);\n        return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"svg\", _extends({}, attrs, {\n            className: layerClass,\n            width: width,\n            height: height,\n            style: style,\n            viewBox: svgView.x + \" \" + svgView.y + \" \" + svgView.width + \" \" + svgView.height,\n            version: \"1.1\"\n        }), children);\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, propTypes = {\n        width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired,\n        height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired,\n        viewBox: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n            width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n            height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number\n        }),\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        style: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,\n        children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ])\n    };\n    Surface.propTypes = propTypes, __webpack_exports__.a = Surface;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(31), Symbol = root.Symbol;\n    module.exports = Symbol;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__src_path__ = __webpack_require__(633);\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_path__.a;\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function acos(x) {\n        return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n    }\n    function asin(x) {\n        return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n    }\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return abs;\n    }), __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return atan2;\n    }), __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return cos;\n    }), __webpack_require__.d(__webpack_exports__, \"h\", function() {\n        return max;\n    }), __webpack_require__.d(__webpack_exports__, \"i\", function() {\n        return min;\n    }), __webpack_require__.d(__webpack_exports__, \"k\", function() {\n        return sin;\n    }), __webpack_require__.d(__webpack_exports__, \"l\", function() {\n        return sqrt;\n    }), __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return epsilon;\n    }), __webpack_require__.d(__webpack_exports__, \"j\", function() {\n        return pi;\n    }), __webpack_require__.d(__webpack_exports__, \"g\", function() {\n        return halfPi;\n    }), __webpack_require__.d(__webpack_exports__, \"m\", function() {\n        return tau;\n    }), __webpack_exports__.b = acos, __webpack_exports__.c = asin;\n    var abs = Math.abs, atan2 = Math.atan2, cos = Math.cos, max = Math.max, min = Math.min, sin = Math.sin, sqrt = Math.sqrt, epsilon = 1e-12, pi = Math.PI, halfPi = pi / 2, tau = 2 * pi;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(series, order) {\n        if ((n = series.length) > 1) for (var j, s0, n, i = 1, s1 = series[order[0]], m = s1.length; i < n; ++i) for (s0 = s1, \n        s1 = series[order[i]], j = 0; j < m; ++j) s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(series) {\n        for (var n = series.length, o = new Array(n); --n >= 0; ) o[n] = n;\n        return o;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Cell() {\n        return null;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), \n    __webpack_require__(4)), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    };\n    Cell.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__.c), \n    Cell.displayName = \"Cell\", __webpack_exports__.a = Cell;\n}, function(module, exports, __webpack_require__) {\n    function baseIteratee(value) {\n        return \"function\" == typeof value ? value : null == value ? identity : \"object\" == typeof value ? isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value) : property(value);\n    }\n    var baseMatches = __webpack_require__(815), baseMatchesProperty = __webpack_require__(818), identity = __webpack_require__(68), isArray = __webpack_require__(13), property = __webpack_require__(822);\n    module.exports = baseIteratee;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return null === x ? NaN : +x;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function linearish(scale) {\n        var domain = scale.domain;\n        return scale.ticks = function(count) {\n            var d = domain();\n            return Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.h)(d[0], d[d.length - 1], null == count ? 10 : count);\n        }, scale.tickFormat = function(count, specifier) {\n            return Object(__WEBPACK_IMPORTED_MODULE_3__tickFormat__.a)(domain(), count, specifier);\n        }, scale.nice = function(count) {\n            null == count && (count = 10);\n            var step, d = domain(), i0 = 0, i1 = d.length - 1, start = d[i0], stop = d[i1];\n            return stop < start && (step = start, start = stop, stop = step, step = i0, i0 = i1, \n            i1 = step), step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count), \n            step > 0 ? (start = Math.floor(start / step) * step, stop = Math.ceil(stop / step) * step, \n            step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)) : step < 0 && (start = Math.ceil(start * step) / step, \n            stop = Math.floor(stop * step) / step, step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)), \n            step > 0 ? (d[i0] = Math.floor(start / step) * step, d[i1] = Math.ceil(stop / step) * step, \n            domain(d)) : step < 0 && (d[i0] = Math.ceil(start * step) / step, d[i1] = Math.floor(stop * step) / step, \n            domain(d)), scale;\n        }, scale;\n    }\n    function linear() {\n        var scale = Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.b)(__WEBPACK_IMPORTED_MODULE_2__continuous__.c, __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.c);\n        return scale.copy = function() {\n            return Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.a)(scale, linear());\n        }, linearish(scale);\n    }\n    __webpack_exports__.b = linearish, __webpack_exports__.a = linear;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92), __WEBPACK_IMPORTED_MODULE_2__continuous__ = __webpack_require__(137), __WEBPACK_IMPORTED_MODULE_3__tickFormat__ = __webpack_require__(883);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__src_value__ = __webpack_require__(206);\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_value__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_5__src_number__ = (__webpack_require__(349), __webpack_require__(209), \n    __webpack_require__(347), __webpack_require__(350), __webpack_require__(136));\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return __WEBPACK_IMPORTED_MODULE_5__src_number__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_7__src_round__ = (__webpack_require__(351), __webpack_require__(873));\n    __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return __WEBPACK_IMPORTED_MODULE_7__src_round__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = (__webpack_require__(352), __webpack_require__(874), \n    __webpack_require__(877), __webpack_require__(346), __webpack_require__(878), __webpack_require__(879), \n    __webpack_require__(880), __webpack_require__(881));\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__.a;\n    });\n    __webpack_require__(882);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function linear(a, d) {\n        return function(t) {\n            return a + t * d;\n        };\n    }\n    function exponential(a, b, y) {\n        return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n            return Math.pow(a + t * b, y);\n        };\n    }\n    function hue(a, b) {\n        var d = b - a;\n        return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a);\n    }\n    function gamma(y) {\n        return 1 == (y = +y) ? nogamma : function(a, b) {\n            return b - a ? exponential(a, b, y) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a);\n        };\n    }\n    function nogamma(a, b) {\n        var d = b - a;\n        return d ? linear(a, d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a);\n    }\n    __webpack_exports__.c = hue, __webpack_exports__.b = gamma, __webpack_exports__.a = nogamma;\n    var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(348);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(s) {\n        return s.match(/.{6}/g).map(function(x) {\n            return \"#\" + x;\n        });\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), ErrorBar = (_temp = _class = function(_Component) {\n        function ErrorBar() {\n            return _classCallCheck(this, ErrorBar), _possibleConstructorReturn(this, (ErrorBar.__proto__ || Object.getPrototypeOf(ErrorBar)).apply(this, arguments));\n        }\n        return _inherits(ErrorBar, _Component), _createClass(ErrorBar, [ {\n            key: \"renderErrorBars\",\n            value: function() {\n                var _props = this.props, offset = _props.offset, layout = _props.layout, width = _props.width, dataKey = _props.dataKey, data = _props.data, dataPointFormatter = _props.dataPointFormatter, xAxis = _props.xAxis, yAxis = _props.yAxis, others = _objectWithoutProperties(_props, [ \"offset\", \"layout\", \"width\", \"dataKey\", \"data\", \"dataPointFormatter\", \"xAxis\", \"yAxis\" ]), props = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others);\n                return data.map(function(entry, i) {\n                    var _dataPointFormatter = dataPointFormatter(entry, dataKey), x = _dataPointFormatter.x, y = _dataPointFormatter.y, value = _dataPointFormatter.value, errorVal = _dataPointFormatter.errorVal;\n                    if (!errorVal) return null;\n                    var xMid = void 0, yMid = void 0, xMin = void 0, yMin = void 0, xMax = void 0, yMax = void 0, scale = void 0, coordsTop = void 0, coordsMid = void 0, coordsBot = void 0, lowBound = void 0, highBound = void 0;\n                    return Array.isArray(errorVal) ? (lowBound = errorVal[0], highBound = errorVal[1]) : (lowBound = errorVal, \n                    highBound = errorVal), \"vertical\" === layout ? (scale = xAxis.scale, xMid = value, \n                    yMid = y + offset, xMin = scale(xMid - lowBound), yMin = yMid + width, xMax = scale(xMid + highBound), \n                    yMax = yMid - width, coordsTop = {\n                        x1: xMax,\n                        y1: yMin,\n                        x2: xMax,\n                        y2: yMax\n                    }, coordsMid = {\n                        x1: xMin,\n                        y1: yMid,\n                        x2: xMax,\n                        y2: yMid\n                    }, coordsBot = {\n                        x1: xMin,\n                        y1: yMin,\n                        x2: xMin,\n                        y2: yMax\n                    }) : \"horizontal\" === layout && (scale = yAxis.scale, xMid = x + offset, yMid = value, \n                    xMin = xMid - width, xMax = xMid + width, yMin = scale(yMid - lowBound), yMax = scale(yMid + highBound), \n                    coordsTop = {\n                        x1: xMin,\n                        y1: yMax,\n                        x2: xMax,\n                        y2: yMax\n                    }, coordsMid = {\n                        x1: xMid,\n                        y1: yMin,\n                        x2: xMid,\n                        y2: yMax\n                    }, coordsBot = {\n                        x1: xMin,\n                        y1: yMin,\n                        x2: xMax,\n                        y2: yMin\n                    }), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, _extends({\n                        className: \"recharts-errorBar\",\n                        key: i\n                    }, props), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"line\", coordsTop), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"line\", coordsMid), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"line\", coordsBot));\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, {\n                    className: \"recharts-errorBars\"\n                }, this.renderErrorBars());\n            }\n        } ]), ErrorBar;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class.propTypes = {\n        dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]).isRequired,\n        data: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array,\n        xAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,\n        yAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object,\n        layout: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        dataPointFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,\n        stroke: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        strokeWidth: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        offset: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number\n    }, _class.defaultProps = {\n        stroke: \"black\",\n        strokeWidth: 1.5,\n        width: 5,\n        offset: 0,\n        layout: \"horizontal\"\n    }, _temp);\n    __webpack_exports__.a = ErrorBar;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return formatAxisMap;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) {\n        var width = props.width, height = props.height, layout = props.layout, ids = Object.keys(axisMap), steps = {\n            left: offset.left,\n            leftMirror: offset.left,\n            right: width - offset.right,\n            rightMirror: width - offset.right,\n            top: offset.top,\n            topMirror: offset.top,\n            bottom: height - offset.bottom,\n            bottomMirror: height - offset.bottom\n        };\n        return ids.reduce(function(result, id) {\n            var axis = axisMap[id], orientation = axis.orientation, domain = axis.domain, _axis$padding = axis.padding, padding = void 0 === _axis$padding ? {} : _axis$padding, mirror = axis.mirror, reversed = axis.reversed, offsetKey = orientation + (mirror ? \"Mirror\" : \"\"), range = void 0, x = void 0, y = void 0, needSpace = void 0;\n            range = \"xAxis\" === axisType ? [ offset.left + (padding.left || 0), offset.left + offset.width - (padding.right || 0) ] : \"yAxis\" === axisType ? \"horizontal\" === layout ? [ offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0) ] : [ offset.top + (padding.top || 0), offset.top + offset.height - (padding.bottom || 0) ] : axis.range, \n            reversed && (range = [ range[1], range[0] ]);\n            var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.A)(axis, chartName), scale = _parseScale.scale, realScaleType = _parseScale.realScaleType;\n            scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.c)(scale);\n            var ticks = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.v)(scale, _extends({}, axis, {\n                realScaleType: realScaleType\n            }));\n            \"xAxis\" === axisType ? (needSpace = \"top\" === orientation && !mirror || \"bottom\" === orientation && mirror, \n            x = offset.left, y = steps[offsetKey] - needSpace * axis.height) : \"yAxis\" === axisType && (needSpace = \"left\" === orientation && !mirror || \"right\" === orientation && mirror, \n            x = steps[offsetKey] - needSpace * axis.width, y = offset.top);\n            var finalAxis = _extends({}, axis, ticks, {\n                realScaleType: realScaleType,\n                x: x,\n                y: y,\n                scale: scale,\n                width: \"xAxis\" === axisType ? offset.width : axis.width,\n                height: \"yAxis\" === axisType ? offset.height : axis.height\n            });\n            return finalAxis.bandSize = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.g)(finalAxis, ticks), \n            axis.hide || \"xAxis\" !== axisType ? axis.hide || (steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width) : steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height, \n            _extends({}, result, _defineProperty({}, id, finalAxis));\n        }, {});\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        var emptyObject = {};\n        \"production\" !== process.env.NODE_ENV && Object.freeze(emptyObject), module.exports = emptyObject;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        var emptyFunction = __webpack_require__(50), warning = emptyFunction;\n        if (\"production\" !== process.env.NODE_ENV) {\n            var printWarning = function(format) {\n                for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];\n                var argIndex = 0, message = \"Warning: \" + format.replace(/%s/g, function() {\n                    return args[argIndex++];\n                });\n                \"undefined\" != typeof console && console.error(message);\n                try {\n                    throw new Error(message);\n                } catch (x) {}\n            };\n            warning = function(condition, format) {\n                if (void 0 === format) throw new Error(\"` + (\"`\" + `warning(condition, format, ...args)`)) + (\"`\" + (` requires a warning message argument\");\n                if (0 !== format.indexOf(\"Failed Composite propType: \") && !condition) {\n                    for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2];\n                    printWarning.apply(void 0, [ format ].concat(args));\n                }\n            };\n        }\n        module.exports = warning;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function checkDCE() {\n            if (\"undefined\" != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && \"function\" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE) {\n                if (\"production\" !== process.env.NODE_ENV) throw new Error(\"^_^\");\n                try {\n                    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n                } catch (err) {\n                    console.error(err);\n                }\n            }\n        }\n        \"production\" === process.env.NODE_ENV ? (checkDCE(), module.exports = __webpack_require__(378)) : module.exports = __webpack_require__(381);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function is(x, y) {\n        return x === y ? 0 !== x || 0 !== y || 1 / x == 1 / y : x !== x && y !== y;\n    }\n    function shallowEqual(objA, objB) {\n        if (is(objA, objB)) return !0;\n        if (\"object\" != typeof objA || null === objA || \"object\" != typeof objB || null === objB) return !1;\n        var keysA = Object.keys(objA), keysB = Object.keys(objB);\n        if (keysA.length !== keysB.length) return !1;\n        for (var i = 0; i < keysA.length; i++) if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) return !1;\n        return !0;\n    }\n    var hasOwnProperty = Object.prototype.hasOwnProperty;\n    module.exports = shallowEqual;\n}, function(module, exports, __webpack_require__) {\n    var toInteger = __webpack_require__(149), min = Math.min;\n    module.exports = function(it) {\n        return it > 0 ? min(toInteger(it), 9007199254740991) : 0;\n    };\n}, function(module, exports) {\n    module.exports = !0;\n}, function(module, exports) {\n    var id = 0, px = Math.random();\n    module.exports = function(key) {\n        return \"Symbol(\".concat(void 0 === key ? \"\" : key, \")_\", (++id + px).toString(36));\n    };\n}, function(module, exports) {\n    exports.f = {}.propertyIsEnumerable;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    exports.__esModule = !0;\n    var _iterator = __webpack_require__(396), _iterator2 = _interopRequireDefault(_iterator), _symbol = __webpack_require__(404), _symbol2 = _interopRequireDefault(_symbol), _typeof = \"function\" == typeof _symbol2.default && \"symbol\" == typeof _iterator2.default ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj;\n    };\n    exports.default = \"function\" == typeof _symbol2.default && \"symbol\" === _typeof(_iterator2.default) ? function(obj) {\n        return void 0 === obj ? \"undefined\" : _typeof(obj);\n    } : function(obj) {\n        return obj && \"function\" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : void 0 === obj ? \"undefined\" : _typeof(obj);\n    };\n}, function(module, exports, __webpack_require__) {\n    var anObject = __webpack_require__(52), dPs = __webpack_require__(400), enumBugKeys = __webpack_require__(152), IE_PROTO = __webpack_require__(150)(\"IE_PROTO\"), Empty = function() {}, createDict = function() {\n        var iframeDocument, iframe = __webpack_require__(225)(\"iframe\"), i = enumBugKeys.length;\n        for (iframe.style.display = \"none\", __webpack_require__(401).appendChild(iframe), \n        iframe.src = \"javascript:\", iframeDocument = iframe.contentWindow.document, iframeDocument.open(), \n        iframeDocument.write(\"<script>document.F=Object<\\/script>\"), iframeDocument.close(), \n        createDict = iframeDocument.F; i--; ) delete createDict.prototype[enumBugKeys[i]];\n        return createDict();\n    };\n    module.exports = Object.create || function(O, Properties) {\n        var result;\n        return null !== O ? (Empty.prototype = anObject(O), result = new Empty(), Empty.prototype = null, \n        result[IE_PROTO] = O) : result = createDict(), void 0 === Properties ? result : dPs(result, Properties);\n    };\n}, function(module, exports, __webpack_require__) {\n    var def = __webpack_require__(22).f, has = __webpack_require__(54), TAG = __webpack_require__(21)(\"toStringTag\");\n    module.exports = function(it, tag, stat) {\n        it && !has(it = stat ? it : it.prototype, TAG) && def(it, TAG, {\n            configurable: !0,\n            value: tag\n        });\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function isNonNullObject(value) {\n        return !!value && \"object\" == typeof value;\n    }\n    function isSpecial(value) {\n        var stringValue = Object.prototype.toString.call(value);\n        return \"[object RegExp]\" === stringValue || \"[object Date]\" === stringValue || isReactElement(value);\n    }\n    function isReactElement(value) {\n        return value.$$typeof === REACT_ELEMENT_TYPE;\n    }\n    function emptyTarget(val) {\n        return Array.isArray(val) ? [] : {};\n    }\n    function cloneUnlessOtherwiseSpecified(value, optionsArgument) {\n        return optionsArgument && !1 === optionsArgument.clone || !isMergeableObject(value) ? value : deepmerge(emptyTarget(value), value, optionsArgument);\n    }\n    function defaultArrayMerge(target, source, optionsArgument) {\n        return target.concat(source).map(function(element) {\n            return cloneUnlessOtherwiseSpecified(element, optionsArgument);\n        });\n    }\n    function mergeObject(target, source, optionsArgument) {\n        var destination = {};\n        return isMergeableObject(target) && Object.keys(target).forEach(function(key) {\n            destination[key] = cloneUnlessOtherwiseSpecified(target[key], optionsArgument);\n        }), Object.keys(source).forEach(function(key) {\n            isMergeableObject(source[key]) && target[key] ? destination[key] = deepmerge(target[key], source[key], optionsArgument) : destination[key] = cloneUnlessOtherwiseSpecified(source[key], optionsArgument);\n        }), destination;\n    }\n    function deepmerge(target, source, optionsArgument) {\n        var sourceIsArray = Array.isArray(source), targetIsArray = Array.isArray(target), options = optionsArgument || {\n            arrayMerge: defaultArrayMerge\n        };\n        if (sourceIsArray === targetIsArray) return sourceIsArray ? (options.arrayMerge || defaultArrayMerge)(target, source, optionsArgument) : mergeObject(target, source, optionsArgument);\n        return cloneUnlessOtherwiseSpecified(source, optionsArgument);\n    }\n    Object.defineProperty(__webpack_exports__, \"__esModule\", {\n        value: !0\n    });\n    var isMergeableObject = function(value) {\n        return isNonNullObject(value) && !isSpecial(value);\n    }, canUseSymbol = \"function\" == typeof Symbol && Symbol.for, REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for(\"react.element\") : 60103;\n    deepmerge.all = function(array, optionsArgument) {\n        if (!Array.isArray(array)) throw new Error(\"first argument should be an array\");\n        return array.reduce(function(prev, next) {\n            return deepmerge(prev, next, optionsArgument);\n        }, {});\n    };\n    var deepmerge_1 = deepmerge;\n    __webpack_exports__.default = deepmerge_1;\n}, function(module, exports, __webpack_require__) {\n    var ctx = __webpack_require__(51), call = __webpack_require__(239), isArrayIter = __webpack_require__(240), anObject = __webpack_require__(52), toLength = __webpack_require__(101), getIterFn = __webpack_require__(241), BREAK = {}, RETURN = {}, exports = module.exports = function(iterable, entries, fn, that, ITERATOR) {\n        var length, step, iterator, result, iterFn = ITERATOR ? function() {\n            return iterable;\n        } : getIterFn(iterable), f = ctx(fn, that, entries ? 2 : 1), index = 0;\n        if (\"function\" != typeof iterFn) throw TypeError(iterable + \" is not iterable!\");\n        if (isArrayIter(iterFn)) {\n            for (length = toLength(iterable.length); length > index; index++) if ((result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index])) === BREAK || result === RETURN) return result;\n        } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done; ) if ((result = call(iterator, f, step.value, entries)) === BREAK || result === RETURN) return result;\n    };\n    exports.BREAK = BREAK, exports.RETURN = RETURN;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function toCssValue(value) {\n        var ignoreImportant = arguments.length > 1 && void 0 !== arguments[1] && arguments[1];\n        if (!Array.isArray(value)) return value;\n        var cssValue = \"\";\n        if (Array.isArray(value[0])) for (var i = 0; i < value.length && \"!important\" !== value[i]; i++) cssValue && (cssValue += \", \"), \n        cssValue += join(value[i], \" \"); else cssValue = join(value, \", \");\n        return ignoreImportant || \"!important\" !== value[value.length - 1] || (cssValue += \" !important\"), \n        cssValue;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = toCssValue;\n    var join = function(value, by) {\n        for (var result = \"\", i = 0; i < value.length && \"!important\" !== value[i]; i++) result && (result += by), \n        result += value[i];\n        return result;\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function createRule() {\n        var name = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : \"unnamed\", decl = arguments[1], options = arguments[2], jss = options.jss, declCopy = (0, \n        _cloneStyle2.default)(decl), rule = jss.plugins.onCreateRule(name, declCopy, options);\n        return rule || (\"@\" === name[0] && (0, _warning2.default)(!1, \"[JSS] Unknown at-rule %s\", name), \n        new _StyleRule2.default(name, declCopy, options));\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = createRule;\n    var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _cloneStyle = __webpack_require__(463), _cloneStyle2 = _interopRequireDefault(_cloneStyle);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(__webpack_exports__, \"__esModule\", {\n        value: !0\n    }), __webpack_require__.d(__webpack_exports__, \"isBrowser\", function() {\n        return isBrowser;\n    });\n    var _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, isBrowser = \"object\" === (\"undefined\" == typeof window ? \"undefined\" : _typeof(window)) && \"object\" === (\"undefined\" == typeof document ? \"undefined\" : _typeof(document)) && 9 === document.nodeType;\n    __webpack_exports__.default = isBrowser;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _Typography = __webpack_require__(528);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_Typography).default;\n        }\n    });\n}, function(module, exports) {\n    module.exports = function(exec) {\n        try {\n            return !!exec();\n        } catch (e) {\n            return !0;\n        }\n    };\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(57), nativeCreate = getNative(Object, \"create\");\n    module.exports = nativeCreate;\n}, function(module, exports, __webpack_require__) {\n    function ListCache(entries) {\n        var index = -1, length = null == entries ? 0 : entries.length;\n        for (this.clear(); ++index < length; ) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n    var listCacheClear = __webpack_require__(619), listCacheDelete = __webpack_require__(620), listCacheGet = __webpack_require__(621), listCacheHas = __webpack_require__(622), listCacheSet = __webpack_require__(623);\n    ListCache.prototype.clear = listCacheClear, ListCache.prototype.delete = listCacheDelete, \n    ListCache.prototype.get = listCacheGet, ListCache.prototype.has = listCacheHas, \n    ListCache.prototype.set = listCacheSet, module.exports = ListCache;\n}, function(module, exports, __webpack_require__) {\n    function assocIndexOf(array, key) {\n        for (var length = array.length; length--; ) if (eq(array[length][0], key)) return length;\n        return -1;\n    }\n    var eq = __webpack_require__(177);\n    module.exports = assocIndexOf;\n}, function(module, exports, __webpack_require__) {\n    function getMapData(map, key) {\n        var data = map.__data__;\n        return isKeyable(key) ? data[\"string\" == typeof key ? \"string\" : \"hash\"] : data.map;\n    }\n    var isKeyable = __webpack_require__(625);\n    module.exports = getMapData;\n}, function(module, exports, __webpack_require__) {\n    function toKey(value) {\n        if (\"string\" == typeof value || isSymbol(value)) return value;\n        var result = value + \"\";\n        return \"0\" == result && 1 / value == -INFINITY ? \"-0\" : result;\n    }\n    var isSymbol = __webpack_require__(67), INFINITY = 1 / 0;\n    module.exports = toKey;\n}, function(module, exports, __webpack_require__) {\n    function isNaN(value) {\n        return isNumber(value) && value != +value;\n    }\n    var isNumber = __webpack_require__(272);\n    module.exports = isNaN;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Linear(context) {\n        this._context = context;\n    }\n    Linear.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._point = 0;\n        },\n        lineEnd: function() {\n            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n\n              case 1:\n                this._point = 2;\n\n              default:\n                this._context.lineTo(x, y);\n            }\n        }\n    }, __webpack_exports__.a = function(context) {\n        return new Linear(context);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function() {};\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function point(that, x, y) {\n        that._context.bezierCurveTo((2 * that._x0 + that._x1) / 3, (2 * that._y0 + that._y1) / 3, (that._x0 + 2 * that._x1) / 3, (that._y0 + 2 * that._y1) / 3, (that._x0 + 4 * that._x1 + x) / 6, (that._y0 + 4 * that._y1 + y) / 6);\n    }\n    function Basis(context) {\n        this._context = context;\n    }\n    __webpack_exports__.c = point, __webpack_exports__.a = Basis, Basis.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0;\n        },\n        lineEnd: function() {\n            switch (this._point) {\n              case 3:\n                point(this, this._x1, this._y1);\n\n              case 2:\n                this._context.lineTo(this._x1, this._y1);\n            }\n            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n\n              case 1:\n                this._point = 2;\n                break;\n\n              case 2:\n                this._point = 3, this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6);\n\n              default:\n                point(this, x, y);\n            }\n            this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;\n        }\n    }, __webpack_exports__.b = function(context) {\n        return new Basis(context);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function point(that, x, y) {\n        that._context.bezierCurveTo(that._x1 + that._k * (that._x2 - that._x0), that._y1 + that._k * (that._y2 - that._y0), that._x2 + that._k * (that._x1 - x), that._y2 + that._k * (that._y1 - y), that._x2, that._y2);\n    }\n    function Cardinal(context, tension) {\n        this._context = context, this._k = (1 - tension) / 6;\n    }\n    __webpack_exports__.b = point, __webpack_exports__.a = Cardinal, Cardinal.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0;\n        },\n        lineEnd: function() {\n            switch (this._point) {\n              case 2:\n                this._context.lineTo(this._x2, this._y2);\n                break;\n\n              case 3:\n                point(this, this._x1, this._y1);\n            }\n            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n\n              case 1:\n                this._point = 2, this._x1 = x, this._y1 = y;\n                break;\n\n              case 2:\n                this._point = 3;\n\n              default:\n                point(this, x, y);\n            }\n            this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, \n            this._y2 = y;\n        }\n    };\n    !function custom(tension) {\n        function cardinal(context) {\n            return new Cardinal(context, tension);\n        }\n        return cardinal.tension = function(tension) {\n            return custom(+tension);\n        }, cardinal;\n    }(0);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_5__DefaultTooltipContent__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_smooth__), \n    __webpack_require__(765)), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_8__util_PureRender__ = __webpack_require__(5), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), propTypes = {\n        content: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),\n        viewBox: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            width: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            height: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number\n        }),\n        active: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        separator: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        formatter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        offset: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        itemStyle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,\n        labelStyle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,\n        wrapperStyle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,\n        cursor: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object ]),\n        coordinate: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number\n        }),\n        position: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number\n        }),\n        label: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.any,\n        payload: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({\n            name: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.any,\n            value: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array ]),\n            unit: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.any\n        })),\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ]),\n        itemSorter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        filterNull: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        useTranslate3d: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool\n    }, defaultProps = {\n        active: !1,\n        offset: 10,\n        viewBox: {\n            x1: 0,\n            x2: 0,\n            y1: 0,\n            y2: 0\n        },\n        coordinate: {\n            x: 0,\n            y: 0\n        },\n        cursorStyle: {},\n        separator: \" : \",\n        wrapperStyle: {},\n        itemStyle: {},\n        labelStyle: {},\n        cursor: !0,\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.n)(),\n        animationEasing: \"ease\",\n        animationDuration: 400,\n        itemSorter: function() {\n            return -1;\n        },\n        filterNull: !0,\n        useTranslate3d: !1\n    }, renderContent = function(content, props) {\n        return __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(content) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(content, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content) ? content(props) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__DefaultTooltipContent__.a, props);\n    }, Tooltip = Object(__WEBPACK_IMPORTED_MODULE_8__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Tooltip() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Tooltip);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Tooltip.__proto__ || Object.getPrototypeOf(Tooltip)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                boxWidth: -1,\n                boxHeight: -1\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Tooltip, _Component), _createClass(Tooltip, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                this.updateBBox();\n            }\n        }, {\n            key: \"componentDidUpdate\",\n            value: function() {\n                this.updateBBox();\n            }\n        }, {\n            key: \"updateBBox\",\n            value: function() {\n                var _state = this.state, boxWidth = _state.boxWidth, boxHeight = _state.boxHeight;\n                if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {\n                    var box = this.wrapperNode.getBoundingClientRect();\n                    (Math.abs(box.width - boxWidth) > 1 || Math.abs(box.height - boxHeight) > 1) && this.setState({\n                        boxWidth: box.width,\n                        boxHeight: box.height\n                    });\n                } else -1 === boxWidth && -1 === boxHeight || this.setState({\n                    boxWidth: -1,\n                    boxHeight: -1\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this, _props = this.props, payload = _props.payload, isAnimationActive = _props.isAnimationActive, animationDuration = _props.animationDuration, animationEasing = _props.animationEasing, filterNull = _props.filterNull, finalPayload = filterNull && payload && payload.length ? payload.filter(function(entry) {\n                    return !__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(entry.value);\n                }) : payload, hasPayload = finalPayload && finalPayload.length, _props2 = this.props, content = _props2.content, viewBox = _props2.viewBox, coordinate = _props2.coordinate, position = _props2.position, active = _props2.active, offset = _props2.offset, wrapperStyle = _props2.wrapperStyle, outerStyle = _extends({\n                    pointerEvents: \"none\",\n                    visibility: active && hasPayload ? \"visible\" : \"hidden\",\n                    position: \"absolute\",\n                    top: 0\n                }, wrapperStyle), translateX = void 0, translateY = void 0;\n                if (position && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.h)(position.x) && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.h)(position.y)) translateX = position.x, \n                translateY = position.y; else {\n                    var _state2 = this.state, boxWidth = _state2.boxWidth, boxHeight = _state2.boxHeight;\n                    boxWidth > 0 && boxHeight > 0 && coordinate ? (translateX = position && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.h)(position.x) ? position.x : Math.max(coordinate.x + boxWidth + offset > viewBox.x + viewBox.width ? coordinate.x - boxWidth - offset : coordinate.x + offset, viewBox.x), \n                    translateY = position && Object(__WEBPACK_IMPORTED_MODULE_7__util_DataUtils__.h)(position.y) ? position.y : Math.max(coordinate.y + boxHeight + offset > viewBox.y + viewBox.height ? coordinate.y - boxHeight - offset : coordinate.y + offset, viewBox.y)) : outerStyle.visibility = \"hidden\";\n                }\n                return outerStyle = _extends({}, outerStyle, Object(__WEBPACK_IMPORTED_MODULE_4_react_smooth__.translateStyle)({\n                    transform: this.props.useTranslate3d ? \"translate3d(\" + translateX + \"px, \" + translateY + \"px, 0)\" : \"translate(\" + translateX + \"px, \" + translateY + \"px)\"\n                })), isAnimationActive && active && (outerStyle = _extends({}, outerStyle, Object(__WEBPACK_IMPORTED_MODULE_4_react_smooth__.translateStyle)({\n                    transition: \"transform \" + animationDuration + \"ms \" + animationEasing\n                }))), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"div\", {\n                    className: \"recharts-tooltip-wrapper\",\n                    style: outerStyle,\n                    ref: function(node) {\n                        _this2.wrapperNode = node;\n                    }\n                }, renderContent(content, _extends({}, this.props, {\n                    payload: finalPayload\n                })));\n            }\n        } ]), Tooltip;\n    }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = \"Tooltip\", \n    _class2.propTypes = propTypes, _class2.defaultProps = defaultProps, _class = _temp2)) || _class;\n    __webpack_exports__.a = Tooltip;\n}, function(module, exports, __webpack_require__) {\n    function ListCache(entries) {\n        var index = -1, length = null == entries ? 0 : entries.length;\n        for (this.clear(); ++index < length; ) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n    var listCacheClear = __webpack_require__(658), listCacheDelete = __webpack_require__(659), listCacheGet = __webpack_require__(660), listCacheHas = __webpack_require__(661), listCacheSet = __webpack_require__(662);\n    ListCache.prototype.clear = listCacheClear, ListCache.prototype.delete = listCacheDelete, \n    ListCache.prototype.get = listCacheGet, ListCache.prototype.has = listCacheHas, \n    ListCache.prototype.set = listCacheSet, module.exports = ListCache;\n}, function(module, exports, __webpack_require__) {\n    function assocIndexOf(array, key) {\n        for (var length = array.length; length--; ) if (eq(array[length][0], key)) return length;\n        return -1;\n    }\n    var eq = __webpack_require__(290);\n    module.exports = assocIndexOf;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(36), Symbol = root.Symbol;\n    module.exports = Symbol;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(59), nativeCreate = getNative(Object, \"create\");\n    module.exports = nativeCreate;\n}, function(module, exports, __webpack_require__) {\n    function getMapData(map, key) {\n        var data = map.__data__;\n        return isKeyable(key) ? data[\"string\" == typeof key ? \"string\" : \"hash\"] : data.map;\n    }\n    var isKeyable = __webpack_require__(682);\n    module.exports = getMapData;\n}, function(module, exports) {\n    module.exports = function(module) {\n        return module.webpackPolyfill || (module.deprecate = function() {}, module.paths = [], \n        module.children || (module.children = []), Object.defineProperty(module, \"loaded\", {\n            enumerable: !0,\n            get: function() {\n                return module.l;\n            }\n        }), Object.defineProperty(module, \"id\", {\n            enumerable: !0,\n            get: function() {\n                return module.i;\n            }\n        }), module.webpackPolyfill = 1), module;\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _defineProperty(obj, key, value) {\n            return key in obj ? Object.defineProperty(obj, key, {\n                value: value,\n                enumerable: !0,\n                configurable: !0,\n                writable: !0\n            }) : obj[key] = value, obj;\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.warn = exports.getTransitionVal = exports.compose = exports.translateStyle = exports.mapObject = exports.debugf = exports.debug = exports.log = exports.generatePrefixStyle = exports.getDashCase = exports.identity = exports.getIntersectionKeys = void 0;\n        var _intersection2 = __webpack_require__(719), _intersection3 = function(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }(_intersection2), _extends = Object.assign || function(target) {\n            for (var i = 1; i < arguments.length; i++) {\n                var source = arguments[i];\n                for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n            }\n            return target;\n        }, PREFIX_LIST = [ \"Webkit\", \"Moz\", \"O\", \"ms\" ], IN_LINE_PREFIX_LIST = [ \"-webkit-\", \"-moz-\", \"-o-\", \"-ms-\" ], IN_COMPATIBLE_PROPERTY = [ \"transform\", \"transformOrigin\", \"transition\" ], identity = (exports.getIntersectionKeys = function(preObj, nextObj) {\n            return (0, _intersection3.default)(Object.keys(preObj), Object.keys(nextObj));\n        }, exports.identity = function(param) {\n            return param;\n        }), getDashCase = exports.getDashCase = function(name) {\n            return name.replace(/([A-Z])/g, function(v) {\n                return \"-\" + v.toLowerCase();\n            });\n        }, generatePrefixStyle = exports.generatePrefixStyle = function(name, value) {\n            if (-1 === IN_COMPATIBLE_PROPERTY.indexOf(name)) return _defineProperty({}, name, value);\n            var isTransition = \"transition\" === name, camelName = name.replace(/(\\w)/, function(v) {\n                return v.toUpperCase();\n            }), styleVal = value;\n            return PREFIX_LIST.reduce(function(result, property, i) {\n                return isTransition && (styleVal = value.replace(/(transform|transform-origin)/gim, IN_LINE_PREFIX_LIST[i] + \"$1\")), \n                _extends({}, result, _defineProperty({}, property + camelName, styleVal));\n            }, {});\n        }, log = exports.log = function() {\n            var _console;\n            (_console = console).log.apply(_console, arguments);\n        }, isDev = (exports.debug = function(name) {\n            return function(item) {\n                return log(name, item), item;\n            };\n        }, exports.debugf = function(tag, f) {\n            return function() {\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n                var res = f.apply(void 0, args), name = tag || f.name || \"anonymous function\", argNames = \"(\" + args.map(JSON.stringify).join(\", \") + \")\";\n                return log(name + \": \" + argNames + \" => \" + JSON.stringify(res)), res;\n            };\n        }, exports.mapObject = function(fn, obj) {\n            return Object.keys(obj).reduce(function(res, key) {\n                return _extends({}, res, _defineProperty({}, key, fn(key, obj[key])));\n            }, {});\n        }, exports.translateStyle = function(style) {\n            return Object.keys(style).reduce(function(res, key) {\n                return _extends({}, res, generatePrefixStyle(key, res[key]));\n            }, style);\n        }, exports.compose = function() {\n            for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2];\n            if (!args.length) return identity;\n            var fns = args.reverse(), firstFn = fns[0], tailsFn = fns.slice(1);\n            return function() {\n                return tailsFn.reduce(function(res, fn) {\n                    return fn(res);\n                }, firstFn.apply(void 0, arguments));\n            };\n        }, exports.getTransitionVal = function(props, duration, easing) {\n            return props.map(function(prop) {\n                return getDashCase(prop) + \" \" + duration + \"ms \" + easing;\n            }).join(\",\");\n        }, \"production\" !== process.env.NODE_ENV);\n        exports.warn = function(condition, format, a, b, c, d, e, f) {\n            if (isDev && \"undefined\" != typeof console && console.warn && (void 0 === format && console.warn(\"LogUtils requires an error message argument\"), \n            !condition)) if (void 0 === format) console.warn(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\"); else {\n                var args = [ a, b, c, d, e, f ], argIndex = 0;\n                console.warn(format.replace(/%s/g, function() {\n                    return args[argIndex++];\n                }));\n            }\n        };\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    function toKey(value) {\n        if (\"string\" == typeof value || isSymbol(value)) return value;\n        var result = value + \"\";\n        return \"0\" == result && 1 / value == -INFINITY ? \"-0\" : result;\n    }\n    var isSymbol = __webpack_require__(197), INFINITY = 1 / 0;\n    module.exports = toKey;\n}, function(module, exports, __webpack_require__) {\n    function isArrayLike(value) {\n        return null != value && isLength(value.length) && !isFunction(value);\n    }\n    var isFunction = __webpack_require__(8), isLength = __webpack_require__(203);\n    module.exports = isArrayLike;\n}, function(module, exports, __webpack_require__) {\n    function baseExtremum(array, iteratee, comparator) {\n        for (var index = -1, length = array.length; ++index < length; ) {\n            var value = array[index], current = iteratee(value);\n            if (null != current && (void 0 === computed ? current === current && !isSymbol(current) : comparator(current, computed))) var computed = current, result = value;\n        }\n        return result;\n    }\n    var isSymbol = __webpack_require__(67);\n    module.exports = baseExtremum;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(a, b) {\n        return a = +a, b -= a, function(t) {\n            return a + b * t;\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function deinterpolateLinear(a, b) {\n        return (b -= a = +a) ? function(x) {\n            return (x - a) / b;\n        } : Object(__WEBPACK_IMPORTED_MODULE_3__constant__.a)(b);\n    }\n    function deinterpolateClamp(deinterpolate) {\n        return function(a, b) {\n            var d = deinterpolate(a = +a, b = +b);\n            return function(x) {\n                return x <= a ? 0 : x >= b ? 1 : d(x);\n            };\n        };\n    }\n    function reinterpolateClamp(reinterpolate) {\n        return function(a, b) {\n            var r = reinterpolate(a = +a, b = +b);\n            return function(t) {\n                return t <= 0 ? a : t >= 1 ? b : r(t);\n            };\n        };\n    }\n    function bimap(domain, range, deinterpolate, reinterpolate) {\n        var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n        return d1 < d0 ? (d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0)) : (d0 = deinterpolate(d0, d1), \n        r0 = reinterpolate(r0, r1)), function(x) {\n            return r0(d0(x));\n        };\n    }\n    function polymap(domain, range, deinterpolate, reinterpolate) {\n        var j = Math.min(domain.length, range.length) - 1, d = new Array(j), r = new Array(j), i = -1;\n        for (domain[j] < domain[0] && (domain = domain.slice().reverse(), range = range.slice().reverse()); ++i < j; ) d[i] = deinterpolate(domain[i], domain[i + 1]), \n        r[i] = reinterpolate(range[i], range[i + 1]);\n        return function(x) {\n            var i = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(domain, x, 1, j) - 1;\n            return r[i](d[i](x));\n        };\n    }\n    function copy(source, target) {\n        return target.domain(source.domain()).range(source.range()).interpolate(source.interpolate()).clamp(source.clamp());\n    }\n    function continuous(deinterpolate, reinterpolate) {\n        function rescale() {\n            return piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap, \n            output = input = null, scale;\n        }\n        function scale(x) {\n            return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate)))(+x);\n        }\n        var piecewise, output, input, domain = unit, range = unit, interpolate = __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.a, clamp = !1;\n        return scale.invert = function(y) {\n            return (input || (input = piecewise(range, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);\n        }, scale.domain = function(_) {\n            return arguments.length ? (domain = __WEBPACK_IMPORTED_MODULE_2__array__.a.call(_, __WEBPACK_IMPORTED_MODULE_4__number__.a), \n            rescale()) : domain.slice();\n        }, scale.range = function(_) {\n            return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_2__array__.b.call(_), \n            rescale()) : range.slice();\n        }, scale.rangeRound = function(_) {\n            return range = __WEBPACK_IMPORTED_MODULE_2__array__.b.call(_), interpolate = __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.d, \n            rescale();\n        }, scale.clamp = function(_) {\n            return arguments.length ? (clamp = !!_, rescale()) : clamp;\n        }, scale.interpolate = function(_) {\n            return arguments.length ? (interpolate = _, rescale()) : interpolate;\n        }, rescale();\n    }\n    __webpack_exports__.c = deinterpolateLinear, __webpack_exports__.a = copy, __webpack_exports__.b = continuous;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92), __WEBPACK_IMPORTED_MODULE_2__array__ = __webpack_require__(62), __WEBPACK_IMPORTED_MODULE_3__constant__ = __webpack_require__(210), __WEBPACK_IMPORTED_MODULE_4__number__ = __webpack_require__(353), unit = [ 0, 1 ];\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__formatDecimal__ = __webpack_require__(211);\n    __webpack_exports__.a = function(x) {\n        return x = Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(Math.abs(x)), \n        x ? x[1] : NaN;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_6__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), getDeltaAngle = function(startAngle, endAngle) {\n        return Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.j)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 359.999);\n    }, getTangentCircle = function(_ref) {\n        var cx = _ref.cx, cy = _ref.cy, radius = _ref.radius, angle = _ref.angle, sign = _ref.sign, isExternal = _ref.isExternal, cornerRadius = _ref.cornerRadius, centerRadius = cornerRadius * (isExternal ? 1 : -1) + radius, theta = Math.asin(cornerRadius / centerRadius) / __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.a, centerAngle = angle + sign * theta;\n        return {\n            center: Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, centerRadius, centerAngle),\n            circleTangency: Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, radius, centerAngle),\n            lineTangency: Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, centerRadius * Math.cos(theta * __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.a), angle),\n            theta: theta\n        };\n    }, getSectorPath = function(_ref2) {\n        var cx = _ref2.cx, cy = _ref2.cy, innerRadius = _ref2.innerRadius, outerRadius = _ref2.outerRadius, startAngle = _ref2.startAngle, endAngle = _ref2.endAngle, angle = getDeltaAngle(startAngle, endAngle), tempEndAngle = startAngle + angle, outerStartPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, outerRadius, startAngle), outerEndPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, outerRadius, tempEndAngle), path = \"M \" + outerStartPoint.x + \",\" + outerStartPoint.y + \"\\n    A \" + outerRadius + \",\" + outerRadius + \",0,\\n    \" + +(Math.abs(angle) > 180) + \",\" + +(startAngle > tempEndAngle) + \",\\n    \" + outerEndPoint.x + \",\" + outerEndPoint.y + \"\\n  \";\n        if (innerRadius > 0) {\n            var innerStartPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, innerRadius, startAngle), innerEndPoint = Object(__WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.e)(cx, cy, innerRadius, tempEndAngle);\n            path += \"L \" + innerEndPoint.x + \",\" + innerEndPoint.y + \"\\n            A \" + innerRadius + \",\" + innerRadius + \",0,\\n            \" + +(Math.abs(angle) > 180) + \",\" + +(startAngle <= tempEndAngle) + \",\\n            \" + innerStartPoint.x + \",\" + innerStartPoint.y + \" Z\";\n        } else path += \"L \" + cx + \",\" + cy + \" Z\";\n        return path;\n    }, getSectorWithCorner = function(_ref3) {\n        var cx = _ref3.cx, cy = _ref3.cy, innerRadius = _ref3.innerRadius, outerRadius = _ref3.outerRadius, cornerRadius = _ref3.cornerRadius, startAngle = _ref3.startAngle, endAngle = _ref3.endAngle, sign = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.j)(endAngle - startAngle), _getTangentCircle = getTangentCircle({\n            cx: cx,\n            cy: cy,\n            radius: outerRadius,\n            angle: startAngle,\n            sign: sign,\n            cornerRadius: cornerRadius\n        }), soct = _getTangentCircle.circleTangency, solt = _getTangentCircle.lineTangency, sot = _getTangentCircle.theta, _getTangentCircle2 = getTangentCircle({\n            cx: cx,\n            cy: cy,\n            radius: outerRadius,\n            angle: endAngle,\n            sign: -sign,\n            cornerRadius: cornerRadius\n        }), eoct = _getTangentCircle2.circleTangency, eolt = _getTangentCircle2.lineTangency, eot = _getTangentCircle2.theta, outerArcAngle = Math.abs(startAngle - endAngle) - sot - eot;\n        if (outerArcAngle < 0) return getSectorPath({\n            cx: cx,\n            cy: cy,\n            innerRadius: innerRadius,\n            outerRadius: outerRadius,\n            startAngle: startAngle,\n            endAngle: endAngle\n        });\n        var path = \"M \" + solt.x + \",\" + solt.y + \"\\n    A\" + cornerRadius + \",\" + cornerRadius + \",0,0,\" + +(sign < 0) + \",\" + soct.x + \",\" + soct.y + \"\\n    A\" + outerRadius + \",\" + outerRadius + \",0,\" + +(outerArcAngle > 180) + \",\" + +(sign < 0) + \",\" + eoct.x + \",\" + eoct.y + \"\\n    A\" + cornerRadius + \",\" + cornerRadius + \",0,0,\" + +(sign < 0) + \",\" + eolt.x + \",\" + eolt.y + \"\\n  \";\n        if (innerRadius > 0) {\n            var _getTangentCircle3 = getTangentCircle({\n                cx: cx,\n                cy: cy,\n                radius: innerRadius,\n                angle: startAngle,\n                sign: sign,\n                isExternal: !0,\n                cornerRadius: cornerRadius\n            }), sict = _getTangentCircle3.circleTangency, silt = _getTangentCircle3.lineTangency, sit = _getTangentCircle3.theta, _getTangentCircle4 = getTangentCircle({\n                cx: cx,\n                cy: cy,\n                radius: innerRadius,\n                angle: endAngle,\n                sign: -sign,\n                isExternal: !0,\n                cornerRadius: cornerRadius\n            }), eict = _getTangentCircle4.circleTangency, eilt = _getTangentCircle4.lineTangency, eit = _getTangentCircle4.theta, innerArcAngle = Math.abs(startAngle - endAngle) - sit - eit;\n            if (innerArcAngle < 0) return path + \"L\" + cx + \",\" + cy + \"Z\";\n            path += \"L\" + eilt.x + \",\" + eilt.y + \"\\n      A\" + cornerRadius + \",\" + cornerRadius + \",0,0,\" + +(sign < 0) + \",\" + eict.x + \",\" + eict.y + \"\\n      A\" + innerRadius + \",\" + innerRadius + \",0,\" + +(innerArcAngle > 180) + \",\" + +(sign > 0) + \",\" + sict.x + \",\" + sict.y + \"\\n      A\" + cornerRadius + \",\" + cornerRadius + \",0,0,\" + +(sign < 0) + \",\" + silt.x + \",\" + silt.y + \"Z\";\n        } else path += \"L\" + cx + \",\" + cy + \"Z\";\n        return path;\n    }, Sector = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Sector() {\n            return _classCallCheck(this, Sector), _possibleConstructorReturn(this, (Sector.__proto__ || Object.getPrototypeOf(Sector)).apply(this, arguments));\n        }\n        return _inherits(Sector, _Component), _createClass(Sector, [ {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, cx = _props.cx, cy = _props.cy, innerRadius = _props.innerRadius, outerRadius = _props.outerRadius, cornerRadius = _props.cornerRadius, startAngle = _props.startAngle, endAngle = _props.endAngle, className = _props.className;\n                if (outerRadius < innerRadius || startAngle === endAngle) return null;\n                var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()(\"recharts-sector\", className), deltaRadius = outerRadius - innerRadius, cr = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.d)(cornerRadius, deltaRadius, 0, !0), path = void 0;\n                return path = cr > 0 && Math.abs(startAngle - endAngle) < 360 ? getSectorWithCorner({\n                    cx: cx,\n                    cy: cy,\n                    innerRadius: innerRadius,\n                    outerRadius: outerRadius,\n                    cornerRadius: Math.min(cr, deltaRadius / 2),\n                    startAngle: startAngle,\n                    endAngle: endAngle\n                }) : getSectorPath({\n                    cx: cx,\n                    cy: cy,\n                    innerRadius: innerRadius,\n                    outerRadius: outerRadius,\n                    startAngle: startAngle,\n                    endAngle: endAngle\n                }), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props), {\n                    className: layerClass,\n                    d: path\n                }));\n            }\n        } ]), Sector;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"Sector\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        innerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        outerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        startAngle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        endAngle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        cornerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string ])\n    }), _class2.defaultProps = {\n        cx: 0,\n        cy: 0,\n        innerRadius: 0,\n        outerRadius: 0,\n        startAngle: 0,\n        endAngle: 0,\n        cornerRadius: 0\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = Sector;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_lodash_minBy__ = __webpack_require__(924), __WEBPACK_IMPORTED_MODULE_1_lodash_minBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_minBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_maxBy__ = __webpack_require__(368), __WEBPACK_IMPORTED_MODULE_2_lodash_maxBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_maxBy__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_6__component_Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_7__component_Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), PolarRadiusAxis = Object(__WEBPACK_IMPORTED_MODULE_5__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function PolarRadiusAxis() {\n            return _classCallCheck(this, PolarRadiusAxis), _possibleConstructorReturn(this, (PolarRadiusAxis.__proto__ || Object.getPrototypeOf(PolarRadiusAxis)).apply(this, arguments));\n        }\n        return _inherits(PolarRadiusAxis, _Component), _createClass(PolarRadiusAxis, [ {\n            key: \"getTickValueCoord\",\n            value: function(_ref) {\n                var coordinate = _ref.coordinate, _props = this.props, angle = _props.angle, cx = _props.cx, cy = _props.cy;\n                return Object(__WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__.e)(cx, cy, coordinate, angle);\n            }\n        }, {\n            key: \"getTickTextAnchor\",\n            value: function() {\n                var orientation = this.props.orientation, textAnchor = void 0;\n                switch (orientation) {\n                  case \"left\":\n                    textAnchor = \"end\";\n                    break;\n\n                  case \"right\":\n                    textAnchor = \"start\";\n                    break;\n\n                  default:\n                    textAnchor = \"middle\";\n                }\n                return textAnchor;\n            }\n        }, {\n            key: \"getViewBox\",\n            value: function() {\n                var _props2 = this.props, cx = _props2.cx, cy = _props2.cy, angle = _props2.angle, ticks = _props2.ticks, maxRadiusTick = __WEBPACK_IMPORTED_MODULE_2_lodash_maxBy___default()(ticks, function(entry) {\n                    return entry.coordinate || 0;\n                });\n                return {\n                    cx: cx,\n                    cy: cy,\n                    startAngle: angle,\n                    endAngle: angle,\n                    innerRadius: __WEBPACK_IMPORTED_MODULE_1_lodash_minBy___default()(ticks, function(entry) {\n                        return entry.coordinate || 0;\n                    }).coordinate || 0,\n                    outerRadius: maxRadiusTick.coordinate || 0\n                };\n            }\n        }, {\n            key: \"renderAxisLine\",\n            value: function() {\n                var _props3 = this.props, cx = _props3.cx, cy = _props3.cy, angle = _props3.angle, ticks = _props3.ticks, axisLine = _props3.axisLine, others = _objectWithoutProperties(_props3, [ \"cx\", \"cy\", \"angle\", \"ticks\", \"axisLine\" ]), extent = ticks.reduce(function(result, entry) {\n                    return [ Math.min(result[0], entry.coordinate), Math.max(result[1], entry.coordinate) ];\n                }, [ 1 / 0, -1 / 0 ]), point0 = Object(__WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__.e)(cx, cy, extent[0], angle), point1 = Object(__WEBPACK_IMPORTED_MODULE_10__util_PolarUtils__.e)(cx, cy, extent[1], angle), props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others), {\n                    fill: \"none\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(axisLine), {\n                    x1: point0.x,\n                    y1: point0.y,\n                    x2: point1.x,\n                    y2: point1.y\n                });\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"line\", _extends({\n                    className: \"recharts-polar-radius-axis-line\"\n                }, props));\n            }\n        }, {\n            key: \"renderTickItem\",\n            value: function(option, props, value) {\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__component_Text__.a, _extends({}, props, {\n                    className: \"recharts-polar-radius-axis-tick-value\"\n                }), value);\n            }\n        }, {\n            key: \"renderTicks\",\n            value: function() {\n                var _this2 = this, _props4 = this.props, ticks = _props4.ticks, tick = _props4.tick, angle = _props4.angle, tickFormatter = _props4.tickFormatter, stroke = _props4.stroke, others = _objectWithoutProperties(_props4, [ \"ticks\", \"tick\", \"angle\", \"tickFormatter\", \"stroke\" ]), textAnchor = this.getTickTextAnchor(), axisProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others), customTickProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(tick), items = ticks.map(function(entry, i) {\n                    var coord = _this2.getTickValueCoord(entry), tickProps = _extends({\n                        textAnchor: textAnchor,\n                        transform: \"rotate(\" + (90 - angle) + \", \" + coord.x + \", \" + coord.y + \")\"\n                    }, axisProps, {\n                        stroke: \"none\",\n                        fill: stroke\n                    }, customTickProps, {\n                        index: i\n                    }, coord, {\n                        payload: entry\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({\n                        className: \"recharts-polar-radius-axis-tick\",\n                        key: \"tick-\" + i\n                    }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this2.props, entry, i)), _this2.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value) : entry.value));\n                });\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-polar-radius-axis-ticks\"\n                }, items);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props5 = this.props, ticks = _props5.ticks, axisLine = _props5.axisLine, tick = _props5.tick;\n                return ticks && ticks.length ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-polar-radius-axis\"\n                }, axisLine && this.renderAxisLine(), tick && this.renderTicks(), __WEBPACK_IMPORTED_MODULE_7__component_Label__.a.renderCallByParent(this.props, this.getViewBox())) : null;\n            }\n        } ]), PolarRadiusAxis;\n    }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = \"PolarRadiusAxis\", \n    _class2.axisType = \"radiusAxis\", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.a, {\n        type: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"number\", \"category\" ]),\n        cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        radiusAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        angle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        tickCount: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        ticks: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({\n            value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.any,\n            coordinate: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number\n        })),\n        orientation: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"left\", \"right\", \"middle\" ]),\n        axisLine: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object ]),\n        tick: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),\n        stroke: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,\n        tickFormatter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,\n        domain: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"auto\", \"dataMin\", \"dataMax\" ]) ])),\n        scale: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"auto\", \"linear\", \"pow\", \"sqrt\", \"log\", \"identity\", \"time\", \"band\", \"point\", \"ordinal\", \"quantile\", \"quantize\", \"utcTime\", \"sequential\", \"threshold\" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),\n        allowDataOverflow: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool\n    }), _class2.defaultProps = {\n        type: \"number\",\n        radiusAxisId: 0,\n        cx: 0,\n        cy: 0,\n        angle: 0,\n        orientation: \"right\",\n        stroke: \"#ccc\",\n        axisLine: !0,\n        tick: !0,\n        tickCount: 5,\n        domain: [ 0, \"auto\" ],\n        allowDataOverflow: !1,\n        scale: \"auto\",\n        allowDuplicatedCategory: !0\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = PolarRadiusAxis;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_6__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_7__shape_Polygon__ = __webpack_require__(214), __WEBPACK_IMPORTED_MODULE_8__component_Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), RADIAN = Math.PI / 180, PolarAngleAxis = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function PolarAngleAxis() {\n            return _classCallCheck(this, PolarAngleAxis), _possibleConstructorReturn(this, (PolarAngleAxis.__proto__ || Object.getPrototypeOf(PolarAngleAxis)).apply(this, arguments));\n        }\n        return _inherits(PolarAngleAxis, _Component), _createClass(PolarAngleAxis, [ {\n            key: \"getTickLineCoord\",\n            value: function(data) {\n                var _props = this.props, cx = _props.cx, cy = _props.cy, radius = _props.radius, orientation = _props.orientation, tickLine = _props.tickLine, tickLineSize = tickLine && tickLine.size || 8, p1 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, data.coordinate), p2 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius + (\"inner\" === orientation ? -1 : 1) * tickLineSize, data.coordinate);\n                return {\n                    x1: p1.x,\n                    y1: p1.y,\n                    x2: p2.x,\n                    y2: p2.y\n                };\n            }\n        }, {\n            key: \"getTickTextAnchor\",\n            value: function(data) {\n                var orientation = this.props.orientation, cos = Math.cos(-data.coordinate * RADIAN);\n                return cos > 1e-5 ? \"outer\" === orientation ? \"start\" : \"end\" : cos < -1e-5 ? \"outer\" === orientation ? \"end\" : \"start\" : \"middle\";\n            }\n        }, {\n            key: \"renderAxisLine\",\n            value: function() {\n                var _props2 = this.props, cx = _props2.cx, cy = _props2.cy, radius = _props2.radius, axisLine = _props2.axisLine, axisLineType = _props2.axisLineType, props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), {\n                    fill: \"none\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(axisLine));\n                if (\"circle\" === axisLineType) return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__shape_Dot__.a, _extends({\n                    className: \"recharts-polar-angle-axis-line\"\n                }, props, {\n                    cx: cx,\n                    cy: cy,\n                    r: radius\n                }));\n                var ticks = this.props.ticks, points = ticks.map(function(entry) {\n                    return Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, entry.coordinate);\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__shape_Polygon__.a, _extends({\n                    className: \"recharts-polar-angle-axis-line\"\n                }, props, {\n                    points: points\n                }));\n            }\n        }, {\n            key: \"renderTickItem\",\n            value: function(option, props, value) {\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__component_Text__.a, _extends({}, props, {\n                    className: \"recharts-polar-angle-axis-tick-value\"\n                }), value);\n            }\n        }, {\n            key: \"renderTicks\",\n            value: function() {\n                var _this2 = this, _props3 = this.props, ticks = _props3.ticks, tick = _props3.tick, tickLine = _props3.tickLine, tickFormatter = _props3.tickFormatter, stroke = _props3.stroke, axisProps = Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), customTickProps = Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(tick), tickLineProps = _extends({}, axisProps, {\n                    fill: \"none\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(tickLine)), items = ticks.map(function(entry, i) {\n                    var lineCoord = _this2.getTickLineCoord(entry), textAnchor = _this2.getTickTextAnchor(entry), tickProps = _extends({\n                        textAnchor: textAnchor\n                    }, axisProps, {\n                        stroke: \"none\",\n                        fill: stroke\n                    }, customTickProps, {\n                        index: i,\n                        payload: entry,\n                        x: lineCoord.x2,\n                        y: lineCoord.y2\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Layer__.a, _extends({\n                        className: \"recharts-polar-angle-axis-tick\",\n                        key: \"tick-\" + i\n                    }, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.f)(_this2.props, entry, i)), tickLine && __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"line\", _extends({\n                        className: \"recharts-polar-angle-axis-tick-line\"\n                    }, tickLineProps, lineCoord)), tick && _this2.renderTickItem(tick, tickProps, tickFormatter ? tickFormatter(entry.value) : entry.value));\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Layer__.a, {\n                    className: \"recharts-polar-angle-axis-ticks\"\n                }, items);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props4 = this.props, ticks = _props4.ticks, radius = _props4.radius, axisLine = _props4.axisLine;\n                return radius <= 0 || !ticks || !ticks.length ? null : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Layer__.a, {\n                    className: \"recharts-polar-angle-axis\"\n                }, axisLine && this.renderAxisLine(), this.renderTicks());\n            }\n        } ]), PolarAngleAxis;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = \"PolarAngleAxis\", \n    _class2.axisType = \"angleAxis\", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.a, {\n        type: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"number\", \"category\" ]),\n        angleAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        dataKey: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func ]),\n        cx: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        cy: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        radius: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        hide: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        scale: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.d), __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func ]),\n        axisLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),\n        axisLineType: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"polygon\", \"circle\" ]),\n        tickLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),\n        tick: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ]),\n        ticks: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            value: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,\n            coordinate: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number\n        })),\n        stroke: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,\n        orientation: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"inner\", \"outer\" ]),\n        tickFormatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool\n    }), _class2.defaultProps = {\n        type: \"category\",\n        angleAxisId: 0,\n        scale: \"auto\",\n        cx: 0,\n        cy: 0,\n        domain: [ 0, \"auto\" ],\n        orientation: \"outer\",\n        axisLine: !0,\n        tickLine: !0,\n        tick: !0,\n        hide: !1,\n        allowDuplicatedCategory: !0\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = PolarAngleAxis;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), \n    __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), ZAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function ZAxis() {\n            return _classCallCheck(this, ZAxis), _possibleConstructorReturn(this, (ZAxis.__proto__ || Object.getPrototypeOf(ZAxis)).apply(this, arguments));\n        }\n        return _inherits(ZAxis, _Component), _createClass(ZAxis, [ {\n            key: \"render\",\n            value: function() {\n                return null;\n            }\n        } ]), ZAxis;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"ZAxis\", \n    _class2.propTypes = {\n        type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"number\", \"category\" ]),\n        name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        zAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]),\n        dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]),\n        range: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number),\n        scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"auto\", \"linear\", \"pow\", \"sqrt\", \"log\", \"identity\", \"time\", \"band\", \"point\", \"ordinal\", \"quantile\", \"quantize\", \"utcTime\", \"sequential\", \"threshold\" ]), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ])\n    }, _class2.defaultProps = {\n        zAxisId: 0,\n        range: [ 64, 64 ],\n        scale: \"auto\",\n        type: \"number\"\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = ZAxis;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n            if (\"production\" !== process.env.NODE_ENV) for (var typeSpecName in typeSpecs) if (typeSpecs.hasOwnProperty(typeSpecName)) {\n                var error;\n                try {\n                    invariant(\"function\" == typeof typeSpecs[typeSpecName], \"%s: %s type ` + \"`\"))) + ((`%s` + (\"`\" + ` is invalid; it must be a function, usually from the `)) + (\"`\" + (`prop-types` + \"`\"))))) + ((((` package, but received ` + (\"`\" + `%s`)) + (\"`\" + (`.\", componentName || \"React class\", location, typeSpecName, typeof typeSpecs[typeSpecName]), \n                    error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n                } catch (ex) {\n                    error = ex;\n                }\n                if (warning(!error || error instanceof Error, \"%s: type specification of %s ` + \"`\"))) + ((`%s` + (\"`\" + ` is invalid; the type checker function must return `)) + (\"`\" + (`null` + \"`\")))) + (((` or an ` + (\"`\" + `Error`)) + (\"`\" + (` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).\", componentName || \"React class\", location, typeSpecName, typeof error), \n                error instanceof Error && !(error.message in loggedTypeFailures)) {\n                    loggedTypeFailures[error.message] = !0;\n                    var stack = getStack ? getStack() : \"\";\n                    warning(!1, \"Failed %s type: %s%s\", location, error.message, null != stack ? stack : \"\");\n                }\n            }\n        }\n        if (\"production\" !== process.env.NODE_ENV) var invariant = __webpack_require__(49), warning = __webpack_require__(98), ReactPropTypesSecret = __webpack_require__(144), loggedTypeFailures = {};\n        module.exports = checkPropTypes;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    module.exports = \"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED\";\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(35);\n    module.exports = function(it, S) {\n        if (!isObject(it)) return it;\n        var fn, val;\n        if (S && \"function\" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;\n        if (\"function\" == typeof (fn = it.valueOf) && !isObject(val = fn.call(it))) return val;\n        if (!S && \"function\" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;\n        throw TypeError(\"Can't convert object to primitive value\");\n    };\n}, function(module, exports, __webpack_require__) {\n    var cof = __webpack_require__(147);\n    module.exports = Object(\"z\").propertyIsEnumerable(0) ? Object : function(it) {\n        return \"String\" == cof(it) ? it.split(\"\") : Object(it);\n    };\n}, function(module, exports) {\n    var toString = {}.toString;\n    module.exports = function(it) {\n        return toString.call(it).slice(8, -1);\n    };\n}, function(module, exports) {\n    module.exports = function(it) {\n        if (void 0 == it) throw TypeError(\"Can't call method on  \" + it);\n        return it;\n    };\n}, function(module, exports) {\n    var ceil = Math.ceil, floor = Math.floor;\n    module.exports = function(it) {\n        return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n    };\n}, function(module, exports, __webpack_require__) {\n    var shared = __webpack_require__(151)(\"keys\"), uid = __webpack_require__(103);\n    module.exports = function(key) {\n        return shared[key] || (shared[key] = uid(key));\n    };\n}, function(module, exports, __webpack_require__) {\n    var core = __webpack_require__(17), global = __webpack_require__(24), store = global[\"__core-js_shared__\"] || (global[\"__core-js_shared__\"] = {});\n    (module.exports = function(key, value) {\n        return store[key] || (store[key] = void 0 !== value ? value : {});\n    })(\"versions\", []).push({\n        version: core.version,\n        mode: __webpack_require__(102) ? \"pure\" : \"global\",\n        copyright: \"© 2018 Denis Pushkarev (zloirock.ru)\"\n    });\n}, function(module, exports) {\n    module.exports = \"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\");\n}, function(module, exports) {\n    exports.f = Object.getOwnPropertySymbols;\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(392),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var $at = __webpack_require__(398)(!0);\n    __webpack_require__(156)(String, \"String\", function(iterated) {\n        this._t = String(iterated), this._i = 0;\n    }, function() {\n        var point, O = this._t, index = this._i;\n        return index >= O.length ? {\n            value: void 0,\n            done: !0\n        } : (point = $at(O, index), this._i += point.length, {\n            value: point,\n            done: !1\n        });\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var LIBRARY = __webpack_require__(102), $export = __webpack_require__(19), redefine = __webpack_require__(229), hide = __webpack_require__(39), Iterators = __webpack_require__(77), $iterCreate = __webpack_require__(399), setToStringTag = __webpack_require__(107), getPrototypeOf = __webpack_require__(227), ITERATOR = __webpack_require__(21)(\"iterator\"), BUGGY = !([].keys && \"next\" in [].keys()), returnThis = function() {\n        return this;\n    };\n    module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n        $iterCreate(Constructor, NAME, next);\n        var methods, key, IteratorPrototype, getMethod = function(kind) {\n            if (!BUGGY && kind in proto) return proto[kind];\n            switch (kind) {\n              case \"keys\":\n              case \"values\":\n                return function() {\n                    return new Constructor(this, kind);\n                };\n            }\n            return function() {\n                return new Constructor(this, kind);\n            };\n        }, TAG = NAME + \" Iterator\", DEF_VALUES = \"values\" == DEFAULT, VALUES_BUG = !1, proto = Base.prototype, $native = proto[ITERATOR] || proto[\"@@iterator\"] || DEFAULT && proto[DEFAULT], $default = $native || getMethod(DEFAULT), $entries = DEFAULT ? DEF_VALUES ? getMethod(\"entries\") : $default : void 0, $anyNative = \"Array\" == NAME ? proto.entries || $native : $native;\n        if ($anyNative && (IteratorPrototype = getPrototypeOf($anyNative.call(new Base()))) !== Object.prototype && IteratorPrototype.next && (setToStringTag(IteratorPrototype, TAG, !0), \n        LIBRARY || \"function\" == typeof IteratorPrototype[ITERATOR] || hide(IteratorPrototype, ITERATOR, returnThis)), \n        DEF_VALUES && $native && \"values\" !== $native.name && (VALUES_BUG = !0, $default = function() {\n            return $native.call(this);\n        }), LIBRARY && !FORCED || !BUGGY && !VALUES_BUG && proto[ITERATOR] || hide(proto, ITERATOR, $default), \n        Iterators[NAME] = $default, Iterators[TAG] = returnThis, DEFAULT) if (methods = {\n            values: DEF_VALUES ? $default : getMethod(\"values\"),\n            keys: IS_SET ? $default : getMethod(\"keys\"),\n            entries: $entries\n        }, FORCED) for (key in methods) key in proto || redefine(proto, key, methods[key]); else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n        return methods;\n    };\n}, function(module, exports, __webpack_require__) {\n    exports.f = __webpack_require__(21);\n}, function(module, exports, __webpack_require__) {\n    var META = __webpack_require__(103)(\"meta\"), isObject = __webpack_require__(35), has = __webpack_require__(54), setDesc = __webpack_require__(22).f, id = 0, isExtensible = Object.isExtensible || function() {\n        return !0;\n    }, FREEZE = !__webpack_require__(53)(function() {\n        return isExtensible(Object.preventExtensions({}));\n    }), setMeta = function(it) {\n        setDesc(it, META, {\n            value: {\n                i: \"O\" + ++id,\n                w: {}\n            }\n        });\n    }, fastKey = function(it, create) {\n        if (!isObject(it)) return \"symbol\" == typeof it ? it : (\"string\" == typeof it ? \"S\" : \"P\") + it;\n        if (!has(it, META)) {\n            if (!isExtensible(it)) return \"F\";\n            if (!create) return \"E\";\n            setMeta(it);\n        }\n        return it[META].i;\n    }, getWeak = function(it, create) {\n        if (!has(it, META)) {\n            if (!isExtensible(it)) return !0;\n            if (!create) return !1;\n            setMeta(it);\n        }\n        return it[META].w;\n    }, onFreeze = function(it) {\n        return FREEZE && meta.NEED && isExtensible(it) && !has(it, META) && setMeta(it), \n        it;\n    }, meta = module.exports = {\n        KEY: META,\n        NEED: !1,\n        fastKey: fastKey,\n        getWeak: getWeak,\n        onFreeze: onFreeze\n    };\n}, function(module, exports, __webpack_require__) {\n    var global = __webpack_require__(24), core = __webpack_require__(17), LIBRARY = __webpack_require__(102), wksExt = __webpack_require__(157), defineProperty = __webpack_require__(22).f;\n    module.exports = function(name) {\n        var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n        \"_\" == name.charAt(0) || name in $Symbol || defineProperty($Symbol, name, {\n            value: wksExt.f(name)\n        });\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.CHANNEL = void 0;\n    var _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), CHANNEL = exports.CHANNEL = \"__THEMING__\", themeListener = {\n        contextTypes: (0, _defineProperty3.default)({}, CHANNEL, _propTypes2.default.object),\n        initial: function(context) {\n            return context[CHANNEL] ? context[CHANNEL].getState() : null;\n        },\n        subscribe: function(context, cb) {\n            return context[CHANNEL] ? context[CHANNEL].subscribe(cb) : null;\n        },\n        unsubscribe: function(context, subscriptionId) {\n            context[CHANNEL] && context[CHANNEL].unsubscribe(subscriptionId);\n        }\n    };\n    exports.default = themeListener;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function createMuiTheme() {\n            var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, _options$palette = options.palette, paletteInput = void 0 === _options$palette ? {} : _options$palette, _options$breakpoints = options.breakpoints, breakpointsInput = void 0 === _options$breakpoints ? {} : _options$breakpoints, _options$mixins = options.mixins, mixinsInput = void 0 === _options$mixins ? {} : _options$mixins, _options$typography = options.typography, typographyInput = void 0 === _options$typography ? {} : _options$typography, shadowsInput = options.shadows, other = (0, \n            _objectWithoutProperties3.default)(options, [ \"palette\", \"breakpoints\", \"mixins\", \"typography\", \"shadows\" ]), palette = (0, \n            _createPalette2.default)(paletteInput), breakpoints = (0, _createBreakpoints2.default)(breakpointsInput), muiTheme = (0, \n            _extends3.default)({\n                direction: \"ltr\",\n                palette: palette,\n                typography: (0, _createTypography2.default)(palette, typographyInput),\n                mixins: (0, _createMixins2.default)(breakpoints, _spacing2.default, mixinsInput),\n                breakpoints: breakpoints,\n                shadows: shadowsInput || _shadows2.default\n            }, (0, _deepmerge2.default)({\n                transitions: _transitions2.default,\n                spacing: _spacing2.default,\n                zIndex: _zIndex2.default\n            }, other));\n            return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(25 === muiTheme.shadows.length, \"Material-UI: the shadows array provided to createMuiTheme should support 25 elevations.\"), \n            muiTheme;\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _deepmerge = __webpack_require__(108), _deepmerge2 = _interopRequireDefault(_deepmerge), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _createTypography = __webpack_require__(423), _createTypography2 = _interopRequireDefault(_createTypography), _createBreakpoints = __webpack_require__(78), _createBreakpoints2 = _interopRequireDefault(_createBreakpoints), _createPalette = __webpack_require__(424), _createPalette2 = _interopRequireDefault(_createPalette), _createMixins = __webpack_require__(431), _createMixins2 = _interopRequireDefault(_createMixins), _shadows = __webpack_require__(432), _shadows2 = _interopRequireDefault(_shadows), _transitions = __webpack_require__(433), _transitions2 = _interopRequireDefault(_transitions), _zIndex = __webpack_require__(437), _zIndex2 = _interopRequireDefault(_zIndex), _spacing = __webpack_require__(438), _spacing2 = _interopRequireDefault(_spacing);\n        exports.default = createMuiTheme;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    !function(global, factory) {\n        module.exports = factory();\n    }(0, function() {\n        \"use strict\";\n        var REACT_STATICS = {\n            childContextTypes: !0,\n            contextTypes: !0,\n            defaultProps: !0,\n            displayName: !0,\n            getDefaultProps: !0,\n            getDerivedStateFromProps: !0,\n            mixins: !0,\n            propTypes: !0,\n            type: !0\n        }, KNOWN_STATICS = {\n            name: !0,\n            length: !0,\n            prototype: !0,\n            caller: !0,\n            callee: !0,\n            arguments: !0,\n            arity: !0\n        }, defineProperty = Object.defineProperty, getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, getPrototypeOf = Object.getPrototypeOf, objectPrototype = getPrototypeOf && getPrototypeOf(Object);\n        return function hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n            if (\"string\" != typeof sourceComponent) {\n                if (objectPrototype) {\n                    var inheritedComponent = getPrototypeOf(sourceComponent);\n                    inheritedComponent && inheritedComponent !== objectPrototype && hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n                }\n                var keys = getOwnPropertyNames(sourceComponent);\n                getOwnPropertySymbols && (keys = keys.concat(getOwnPropertySymbols(sourceComponent)));\n                for (var i = 0; i < keys.length; ++i) {\n                    var key = keys[i];\n                    if (!(REACT_STATICS[key] || KNOWN_STATICS[key] || blacklist && blacklist[key])) {\n                        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n                        try {\n                            defineProperty(targetComponent, key, descriptor);\n                        } catch (e) {}\n                    }\n                }\n                return targetComponent;\n            }\n            return targetComponent;\n        };\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function indentStr(str, indent) {\n        for (var result = \"\", index = 0; index < indent; index++) result += \"  \";\n        return result + str;\n    }\n    function toCss(selector, style) {\n        var options = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, result = \"\";\n        if (!style) return result;\n        var _options$indent = options.indent, indent = void 0 === _options$indent ? 0 : _options$indent, fallbacks = style.fallbacks;\n        if (indent++, fallbacks) if (Array.isArray(fallbacks)) for (var index = 0; index < fallbacks.length; index++) {\n            var fallback = fallbacks[index];\n            for (var prop in fallback) {\n                var value = fallback[prop];\n                null != value && (result += \"\\n\" + indentStr(prop + \": \" + (0, _toCssValue2.default)(value) + \";\", indent));\n            }\n        } else for (var _prop in fallbacks) {\n            var _value = fallbacks[_prop];\n            null != _value && (result += \"\\n\" + indentStr(_prop + \": \" + (0, _toCssValue2.default)(_value) + \";\", indent));\n        }\n        for (var _prop2 in style) {\n            var _value2 = style[_prop2];\n            null != _value2 && \"fallbacks\" !== _prop2 && (result += \"\\n\" + indentStr(_prop2 + \": \" + (0, \n            _toCssValue2.default)(_value2) + \";\", indent));\n        }\n        return result || options.allowEmpty ? (indent--, result = indentStr(selector + \" {\" + result + \"\\n\", indent) + indentStr(\"}\", indent)) : result;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = toCss;\n    var _toCssValue = __webpack_require__(110), _toCssValue2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_toCssValue);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _SheetsRegistry = __webpack_require__(247), _SheetsRegistry2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_SheetsRegistry);\n    exports.default = new _SheetsRegistry2.default();\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _isInBrowser = __webpack_require__(112), _isInBrowser2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_isInBrowser), js = \"\", css = \"\";\n    if (_isInBrowser2.default) {\n        var jsCssMap = {\n            Moz: \"-moz-\",\n            ms: \"-ms-\",\n            O: \"-o-\",\n            Webkit: \"-webkit-\"\n        }, style = document.createElement(\"p\").style;\n        for (var key in jsCssMap) if (key + \"Transform\" in style) {\n            js = key, css = jsCssMap[key];\n            break;\n        }\n    }\n    exports.default = {\n        js: js,\n        css: css\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function _objectWithoutProperties(obj, keys) {\n            var target = {};\n            for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n            return target;\n        }\n        function _classCallCheck(instance, Constructor) {\n            if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n        }\n        function _possibleConstructorReturn(self, call) {\n            if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n            return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n        }\n        function _inherits(subClass, superClass) {\n            if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n            subClass.prototype = Object.create(superClass && superClass.prototype, {\n                constructor: {\n                    value: subClass,\n                    enumerable: !1,\n                    writable: !0,\n                    configurable: !0\n                }\n            }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n        }\n        function noop() {}\n        exports.__esModule = !0, exports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = void 0;\n        var _propTypes = __webpack_require__(1), PropTypes = function(obj) {\n            if (obj && obj.__esModule) return obj;\n            var newObj = {};\n            if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);\n            return newObj.default = obj, newObj;\n        }(_propTypes), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _reactDom = __webpack_require__(99), _reactDom2 = _interopRequireDefault(_reactDom), _PropTypes = __webpack_require__(519), UNMOUNTED = exports.UNMOUNTED = \"unmounted\", EXITED = exports.EXITED = \"exited\", ENTERING = exports.ENTERING = \"entering\", ENTERED = exports.ENTERED = \"entered\", EXITING = exports.EXITING = \"exiting\", Transition = function(_React$Component) {\n            function Transition(props, context) {\n                _classCallCheck(this, Transition);\n                var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context)), parentGroup = context.transitionGroup, appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear, initialStatus = void 0;\n                return _this.nextStatus = null, props.in ? appear ? (initialStatus = EXITED, _this.nextStatus = ENTERING) : initialStatus = ENTERED : initialStatus = props.unmountOnExit || props.mountOnEnter ? UNMOUNTED : EXITED, \n                _this.state = {\n                    status: initialStatus\n                }, _this.nextCallback = null, _this;\n            }\n            return _inherits(Transition, _React$Component), Transition.prototype.getChildContext = function() {\n                return {\n                    transitionGroup: null\n                };\n            }, Transition.prototype.componentDidMount = function() {\n                this.updateStatus(!0);\n            }, Transition.prototype.componentWillReceiveProps = function(nextProps) {\n                var _ref = this.pendingState || this.state, status = _ref.status;\n                nextProps.in ? (status === UNMOUNTED && this.setState({\n                    status: EXITED\n                }), status !== ENTERING && status !== ENTERED && (this.nextStatus = ENTERING)) : status !== ENTERING && status !== ENTERED || (this.nextStatus = EXITING);\n            }, Transition.prototype.componentDidUpdate = function() {\n                this.updateStatus();\n            }, Transition.prototype.componentWillUnmount = function() {\n                this.cancelNextCallback();\n            }, Transition.prototype.getTimeouts = function() {\n                var timeout = this.props.timeout, exit = void 0, enter = void 0, appear = void 0;\n                return exit = enter = appear = timeout, null != timeout && \"number\" != typeof timeout && (exit = timeout.exit, \n                enter = timeout.enter, appear = timeout.appear), {\n                    exit: exit,\n                    enter: enter,\n                    appear: appear\n                };\n            }, Transition.prototype.updateStatus = function() {\n                var mounting = arguments.length > 0 && void 0 !== arguments[0] && arguments[0], nextStatus = this.nextStatus;\n                if (null !== nextStatus) {\n                    this.nextStatus = null, this.cancelNextCallback();\n                    var node = _reactDom2.default.findDOMNode(this);\n                    nextStatus === ENTERING ? this.performEnter(node, mounting) : this.performExit(node);\n                } else this.props.unmountOnExit && this.state.status === EXITED && this.setState({\n                    status: UNMOUNTED\n                });\n            }, Transition.prototype.performEnter = function(node, mounting) {\n                var _this2 = this, enter = this.props.enter, appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting, timeouts = this.getTimeouts();\n                if (!mounting && !enter) return void this.safeSetState({\n                    status: ENTERED\n                }, function() {\n                    _this2.props.onEntered(node);\n                });\n                this.props.onEnter(node, appearing), this.safeSetState({\n                    status: ENTERING\n                }, function() {\n                    _this2.props.onEntering(node, appearing), _this2.onTransitionEnd(node, timeouts.enter, function() {\n                        _this2.safeSetState({\n                            status: ENTERED\n                        }, function() {\n                            _this2.props.onEntered(node, appearing);\n                        });\n                    });\n                });\n            }, Transition.prototype.performExit = function(node) {\n                var _this3 = this, exit = this.props.exit, timeouts = this.getTimeouts();\n                if (!exit) return void this.safeSetState({\n                    status: EXITED\n                }, function() {\n                    _this3.props.onExited(node);\n                });\n                this.props.onExit(node), this.safeSetState({\n                    status: EXITING\n                }, function() {\n                    _this3.props.onExiting(node), _this3.onTransitionEnd(node, timeouts.exit, function() {\n                        _this3.safeSetState({\n                            status: EXITED\n                        }, function() {\n                            _this3.props.onExited(node);\n                        });\n                    });\n                });\n            }, Transition.prototype.cancelNextCallback = function() {\n                null !== this.nextCallback && (this.nextCallback.cancel(), this.nextCallback = null);\n            }, Transition.prototype.safeSetState = function(nextState, callback) {\n                var _this4 = this;\n                this.pendingState = nextState, callback = this.setNextCallback(callback), this.setState(nextState, function() {\n                    _this4.pendingState = null, callback();\n                });\n            }, Transition.prototype.setNextCallback = function(callback) {\n                var _this5 = this, active = !0;\n                return this.nextCallback = function(event) {\n                    active && (active = !1, _this5.nextCallback = null, callback(event));\n                }, this.nextCallback.cancel = function() {\n                    active = !1;\n                }, this.nextCallback;\n            }, Transition.prototype.onTransitionEnd = function(node, timeout, handler) {\n                this.setNextCallback(handler), node ? (this.props.addEndListener && this.props.addEndListener(node, this.nextCallback), \n                null != timeout && setTimeout(this.nextCallback, timeout)) : setTimeout(this.nextCallback, 0);\n            }, Transition.prototype.render = function() {\n                var status = this.state.status;\n                if (status === UNMOUNTED) return null;\n                var _props = this.props, children = _props.children, childProps = _objectWithoutProperties(_props, [ \"children\" ]);\n                if (delete childProps.in, delete childProps.mountOnEnter, delete childProps.unmountOnExit, \n                delete childProps.appear, delete childProps.enter, delete childProps.exit, delete childProps.timeout, \n                delete childProps.addEndListener, delete childProps.onEnter, delete childProps.onEntering, \n                delete childProps.onEntered, delete childProps.onExit, delete childProps.onExiting, \n                delete childProps.onExited, \"function\" == typeof children) return children(status, childProps);\n                var child = _react2.default.Children.only(children);\n                return _react2.default.cloneElement(child, childProps);\n            }, Transition;\n        }(_react2.default.Component);\n        Transition.contextTypes = {\n            transitionGroup: PropTypes.object\n        }, Transition.childContextTypes = {\n            transitionGroup: function() {}\n        }, Transition.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: PropTypes.oneOfType([ PropTypes.func.isRequired, PropTypes.element.isRequired ]).isRequired,\n            in: PropTypes.bool,\n            mountOnEnter: PropTypes.bool,\n            unmountOnExit: PropTypes.bool,\n            appear: PropTypes.bool,\n            enter: PropTypes.bool,\n            exit: PropTypes.bool,\n            timeout: function(props) {\n                for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];\n                var pt = _PropTypes.timeoutsShape;\n                return props.addEndListener || (pt = pt.isRequired), pt.apply(void 0, [ props ].concat(args));\n            },\n            addEndListener: PropTypes.func,\n            onEnter: PropTypes.func,\n            onEntering: PropTypes.func,\n            onEntered: PropTypes.func,\n            onExit: PropTypes.func,\n            onExiting: PropTypes.func,\n            onExited: PropTypes.func\n        } : {}, Transition.defaultProps = {\n            in: !1,\n            mountOnEnter: !1,\n            unmountOnExit: !1,\n            appear: !1,\n            enter: !0,\n            exit: !0,\n            onEnter: noop,\n            onEntering: noop,\n            onEntered: noop,\n            onExit: noop,\n            onExiting: noop,\n            onExited: noop\n        }, Transition.UNMOUNTED = 0, Transition.EXITED = 1, Transition.ENTERING = 2, Transition.ENTERED = 3, \n        Transition.EXITING = 4, exports.default = Transition;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports) {\n    var global = module.exports = \"undefined\" != typeof window && window.Math == Math ? window : \"undefined\" != typeof self && self.Math == Math ? self : Function(\"return this\")();\n    \"number\" == typeof __g && (__g = global);\n}, function(module, exports) {\n    var core = module.exports = {\n        version: \"2.5.1\"\n    };\n    \"number\" == typeof __e && (__e = core);\n}, function(module, exports) {\n    module.exports = function(it) {\n        return \"object\" == typeof it ? null !== it : \"function\" == typeof it;\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = !__webpack_require__(114)(function() {\n        return 7 != Object.defineProperty({}, \"a\", {\n            get: function() {\n                return 7;\n            }\n        }).a;\n    });\n}, function(module, exports) {\n    module.exports = Math.sign || function(x) {\n        return 0 == (x = +x) || x != x ? x : x < 0 ? -1 : 1;\n    };\n}, function(module, exports) {\n    var $expm1 = Math.expm1;\n    module.exports = !$expm1 || $expm1(10) > 22025.465794806718 || $expm1(10) < 22025.465794806718 || -2e-17 != $expm1(-2e-17) ? function(x) {\n        return 0 == (x = +x) ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n    } : $expm1;\n}, function(module, exports, __webpack_require__) {\n    function isString(value) {\n        return \"string\" == typeof value || !isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag;\n    }\n    var baseGetTag = __webpack_require__(41), isArray = __webpack_require__(13), isObjectLike = __webpack_require__(42), stringTag = \"[object String]\";\n    module.exports = isString;\n}, function(module, exports, __webpack_require__) {\n    function get(object, path, defaultValue) {\n        var result = null == object ? void 0 : baseGet(object, path);\n        return void 0 === result ? defaultValue : result;\n    }\n    var baseGet = __webpack_require__(269);\n    module.exports = get;\n}, function(module, exports, __webpack_require__) {\n    function isKey(value, object) {\n        if (isArray(value)) return !1;\n        var type = typeof value;\n        return !(\"number\" != type && \"symbol\" != type && \"boolean\" != type && null != value && !isSymbol(value)) || (reIsPlainProp.test(value) || !reIsDeepProp.test(value) || null != object && value in Object(object));\n    }\n    var isArray = __webpack_require__(13), isSymbol = __webpack_require__(67), reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/, reIsPlainProp = /^\\w*$/;\n    module.exports = isKey;\n}, function(module, exports, __webpack_require__) {\n    function MapCache(entries) {\n        var index = -1, length = null == entries ? 0 : entries.length;\n        for (this.clear(); ++index < length; ) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n    var mapCacheClear = __webpack_require__(608), mapCacheDelete = __webpack_require__(624), mapCacheGet = __webpack_require__(626), mapCacheHas = __webpack_require__(627), mapCacheSet = __webpack_require__(628);\n    MapCache.prototype.clear = mapCacheClear, MapCache.prototype.delete = mapCacheDelete, \n    MapCache.prototype.get = mapCacheGet, MapCache.prototype.has = mapCacheHas, MapCache.prototype.set = mapCacheSet, \n    module.exports = MapCache;\n}, function(module, exports) {\n    function eq(value, other) {\n        return value === other || value !== value && other !== other;\n    }\n    module.exports = eq;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(57), root = __webpack_require__(31), Map = getNative(root, \"Map\");\n    module.exports = Map;\n}, function(module, exports) {\n    function arrayMap(array, iteratee) {\n        for (var index = -1, length = null == array ? 0 : array.length, result = Array(length); ++index < length; ) result[index] = iteratee(array[index], index, array);\n        return result;\n    }\n    module.exports = arrayMap;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__DefaultLegendContent__ = __webpack_require__(631), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), renderContent = function(content, props) {\n        return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(content) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(content, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(content) ? content(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__DefaultLegendContent__.a, props);\n    }, ICON_TYPES = __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b.filter(function(type) {\n        return \"none\" !== type;\n    }), Legend = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Legend() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Legend);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Legend.__proto__ || Object.getPrototypeOf(Legend)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                boxWidth: -1,\n                boxHeight: -1\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Legend, _Component), _createClass(Legend, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                this.updateBBox();\n            }\n        }, {\n            key: \"componentDidUpdate\",\n            value: function() {\n                this.updateBBox();\n            }\n        }, {\n            key: \"getBBox\",\n            value: function() {\n                var _state = this.state, boxWidth = _state.boxWidth, boxHeight = _state.boxHeight;\n                return boxWidth >= 0 && boxHeight >= 0 ? {\n                    width: boxWidth,\n                    height: boxHeight\n                } : null;\n            }\n        }, {\n            key: \"getDefaultPosition\",\n            value: function(style) {\n                var _props = this.props, layout = _props.layout, align = _props.align, verticalAlign = _props.verticalAlign, margin = _props.margin, chartWidth = _props.chartWidth, chartHeight = _props.chartHeight, hPos = void 0, vPos = void 0;\n                if (!style || (void 0 === style.left || null === style.left) && (void 0 === style.right || null === style.right)) if (\"center\" === align && \"vertical\" === layout) {\n                    var box = this.getBBox() || {\n                        width: 0\n                    };\n                    hPos = {\n                        left: ((chartWidth || 0) - box.width) / 2\n                    };\n                } else hPos = \"right\" === align ? {\n                    right: margin && margin.right || 0\n                } : {\n                    left: margin && margin.left || 0\n                };\n                if (!style || (void 0 === style.top || null === style.top) && (void 0 === style.bottom || null === style.bottom)) if (\"middle\" === verticalAlign) {\n                    var _box = this.getBBox() || {\n                        height: 0\n                    };\n                    vPos = {\n                        top: ((chartHeight || 0) - _box.height) / 2\n                    };\n                } else vPos = \"bottom\" === verticalAlign ? {\n                    bottom: margin && margin.bottom || 0\n                } : {\n                    top: margin && margin.top || 0\n                };\n                return _extends({}, hPos, vPos);\n            }\n        }, {\n            key: \"updateBBox\",\n            value: function() {\n                var _state2 = this.state, boxWidth = _state2.boxWidth, boxHeight = _state2.boxHeight, onBBoxUpdate = this.props.onBBoxUpdate;\n                if (this.wrapperNode && this.wrapperNode.getBoundingClientRect) {\n                    var box = this.wrapperNode.getBoundingClientRect();\n                    (Math.abs(box.width - boxWidth) > 1 || Math.abs(box.height - boxHeight) > 1) && this.setState({\n                        boxWidth: box.width,\n                        boxHeight: box.height\n                    }, function() {\n                        onBBoxUpdate && onBBoxUpdate(box);\n                    });\n                } else -1 === boxWidth && -1 === boxHeight || this.setState({\n                    boxWidth: -1,\n                    boxHeight: -1\n                }, function() {\n                    onBBoxUpdate && onBBoxUpdate(null);\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this, _props2 = this.props, content = _props2.content, width = _props2.width, height = _props2.height, wrapperStyle = _props2.wrapperStyle, outerStyle = _extends({\n                    position: \"absolute\",\n                    width: width || \"auto\",\n                    height: height || \"auto\"\n                }, this.getDefaultPosition(wrapperStyle), wrapperStyle);\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"div\", {\n                    className: \"recharts-legend-wrapper\",\n                    style: outerStyle,\n                    ref: function(node) {\n                        _this2.wrapperNode = node;\n                    }\n                }, renderContent(content, this.props));\n            }\n        } ], [ {\n            key: \"getWithHeight\",\n            value: function(item, chartWidth) {\n                var layout = item.props.layout;\n                return \"vertical\" === layout && Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(item.props.height) ? {\n                    height: item.props.height\n                } : \"horizontal\" === layout ? {\n                    width: item.props.width || chartWidth\n                } : null;\n            }\n        } ]), Legend;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = \"Legend\", \n    _class2.propTypes = {\n        content: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func ]),\n        wrapperStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        chartWidth: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        chartHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        iconSize: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        iconType: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf(ICON_TYPES),\n        layout: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"horizontal\", \"vertical\" ]),\n        align: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"center\", \"left\", \"right\" ]),\n        verticalAlign: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"top\", \"bottom\", \"middle\" ]),\n        margin: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            top: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            left: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            bottom: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            right: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number\n        }),\n        payload: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            value: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,\n            id: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,\n            type: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b)\n        })),\n        formatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        onMouseEnter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        onMouseLeave: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        onClick: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        onBBoxUpdate: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func\n    }, _class2.defaultProps = {\n        iconSize: 14,\n        layout: \"horizontal\",\n        align: \"center\",\n        verticalAlign: \"bottom\"\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Legend;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), SYMBOL_FACTORIES = {\n        symbolCircle: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.u,\n        symbolCross: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.v,\n        symbolDiamond: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.w,\n        symbolSquare: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.x,\n        symbolStar: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.y,\n        symbolTriangle: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.z,\n        symbolWye: __WEBPACK_IMPORTED_MODULE_2_d3_shape__.A\n    }, RADIAN = Math.PI / 180, getSymbolFactory = function(type) {\n        var name = \"symbol\" + type.slice(0, 1).toUpperCase() + type.slice(1);\n        return SYMBOL_FACTORIES[name] || __WEBPACK_IMPORTED_MODULE_2_d3_shape__.u;\n    }, calculateAreaSize = function(size, sizeType, type) {\n        if (\"area\" === sizeType) return size;\n        switch (type) {\n          case \"cross\":\n            return 5 * size * size / 9;\n\n          case \"diamond\":\n            return .5 * size * size / Math.sqrt(3);\n\n          case \"square\":\n            return size * size;\n\n          case \"star\":\n            var angle = 18 * RADIAN;\n            return 1.25 * size * size * (Math.tan(angle) - Math.tan(2 * angle) * Math.pow(Math.tan(angle), 2));\n\n          case \"triangle\":\n            return Math.sqrt(3) * size * size / 4;\n\n          case \"wye\":\n            return (21 - 10 * Math.sqrt(3)) * size * size / 8;\n\n          default:\n            return Math.PI * size * size / 4;\n        }\n    }, Symbols = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Symbols() {\n            return _classCallCheck(this, Symbols), _possibleConstructorReturn(this, (Symbols.__proto__ || Object.getPrototypeOf(Symbols)).apply(this, arguments));\n        }\n        return _inherits(Symbols, _Component), _createClass(Symbols, [ {\n            key: \"getPath\",\n            value: function() {\n                var _props = this.props, size = _props.size, sizeType = _props.sizeType, type = _props.type, symbolFactory = getSymbolFactory(type);\n                return Object(__WEBPACK_IMPORTED_MODULE_2_d3_shape__.t)().type(symbolFactory).size(calculateAreaSize(size, sizeType, type))();\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, className = _props2.className, cx = _props2.cx, cy = _props2.cy, size = _props2.size;\n                return cx === +cx && cy === +cy && size === +size ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(this.props), {\n                    className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()(\"recharts-symbols\", className),\n                    transform: \"translate(\" + cx + \", \" + cy + \")\",\n                    d: this.getPath()\n                })) : null;\n            }\n        } ]), Symbols;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"Symbols\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, {\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"circle\", \"cross\", \"diamond\", \"square\", \"star\", \"triangle\", \"wye\" ]),\n        cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        size: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        sizeType: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"area\", \"diameter\" ])\n    }), _class2.defaultProps = {\n        type: \"circle\",\n        size: 64,\n        sizeType: \"area\"\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = Symbols;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_1__src_area__ = (__webpack_require__(632), __webpack_require__(273));\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__src_area__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_2__src_line__ = __webpack_require__(183);\n    __webpack_require__.d(__webpack_exports__, \"m\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_line__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_8__src_symbol__ = (__webpack_require__(634), __webpack_require__(637), \n    __webpack_require__(275), __webpack_require__(276), __webpack_require__(638), __webpack_require__(639));\n    __webpack_require__.d(__webpack_exports__, \"t\", function() {\n        return __WEBPACK_IMPORTED_MODULE_8__src_symbol__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_9__src_symbol_circle__ = __webpack_require__(278);\n    __webpack_require__.d(__webpack_exports__, \"u\", function() {\n        return __WEBPACK_IMPORTED_MODULE_9__src_symbol_circle__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_10__src_symbol_cross__ = __webpack_require__(279);\n    __webpack_require__.d(__webpack_exports__, \"v\", function() {\n        return __WEBPACK_IMPORTED_MODULE_10__src_symbol_cross__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_11__src_symbol_diamond__ = __webpack_require__(280);\n    __webpack_require__.d(__webpack_exports__, \"w\", function() {\n        return __WEBPACK_IMPORTED_MODULE_11__src_symbol_diamond__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_12__src_symbol_square__ = __webpack_require__(282);\n    __webpack_require__.d(__webpack_exports__, \"x\", function() {\n        return __WEBPACK_IMPORTED_MODULE_12__src_symbol_square__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_13__src_symbol_star__ = __webpack_require__(281);\n    __webpack_require__.d(__webpack_exports__, \"y\", function() {\n        return __WEBPACK_IMPORTED_MODULE_13__src_symbol_star__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_14__src_symbol_triangle__ = __webpack_require__(283);\n    __webpack_require__.d(__webpack_exports__, \"z\", function() {\n        return __WEBPACK_IMPORTED_MODULE_14__src_symbol_triangle__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_15__src_symbol_wye__ = __webpack_require__(284);\n    __webpack_require__.d(__webpack_exports__, \"A\", function() {\n        return __WEBPACK_IMPORTED_MODULE_15__src_symbol_wye__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_16__src_curve_basisClosed__ = __webpack_require__(640);\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return __WEBPACK_IMPORTED_MODULE_16__src_curve_basisClosed__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_17__src_curve_basisOpen__ = __webpack_require__(641);\n    __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return __WEBPACK_IMPORTED_MODULE_17__src_curve_basisOpen__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_18__src_curve_basis__ = __webpack_require__(123);\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_18__src_curve_basis__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_26__src_curve_linearClosed__ = (__webpack_require__(642), \n    __webpack_require__(285), __webpack_require__(286), __webpack_require__(124), __webpack_require__(643), \n    __webpack_require__(644), __webpack_require__(185), __webpack_require__(645));\n    __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return __WEBPACK_IMPORTED_MODULE_26__src_curve_linearClosed__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_27__src_curve_linear__ = __webpack_require__(121);\n    __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return __WEBPACK_IMPORTED_MODULE_27__src_curve_linear__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_28__src_curve_monotone__ = __webpack_require__(646);\n    __webpack_require__.d(__webpack_exports__, \"g\", function() {\n        return __WEBPACK_IMPORTED_MODULE_28__src_curve_monotone__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"h\", function() {\n        return __WEBPACK_IMPORTED_MODULE_28__src_curve_monotone__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_29__src_curve_natural__ = __webpack_require__(647);\n    __webpack_require__.d(__webpack_exports__, \"i\", function() {\n        return __WEBPACK_IMPORTED_MODULE_29__src_curve_natural__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_30__src_curve_step__ = __webpack_require__(648);\n    __webpack_require__.d(__webpack_exports__, \"j\", function() {\n        return __WEBPACK_IMPORTED_MODULE_30__src_curve_step__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"k\", function() {\n        return __WEBPACK_IMPORTED_MODULE_30__src_curve_step__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"l\", function() {\n        return __WEBPACK_IMPORTED_MODULE_30__src_curve_step__.c;\n    });\n    var __WEBPACK_IMPORTED_MODULE_31__src_stack__ = __webpack_require__(649);\n    __webpack_require__.d(__webpack_exports__, \"n\", function() {\n        return __WEBPACK_IMPORTED_MODULE_31__src_stack__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_32__src_offset_expand__ = __webpack_require__(650);\n    __webpack_require__.d(__webpack_exports__, \"o\", function() {\n        return __WEBPACK_IMPORTED_MODULE_32__src_offset_expand__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_34__src_offset_none__ = (__webpack_require__(651), \n    __webpack_require__(86));\n    __webpack_require__.d(__webpack_exports__, \"p\", function() {\n        return __WEBPACK_IMPORTED_MODULE_34__src_offset_none__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_35__src_offset_silhouette__ = __webpack_require__(652);\n    __webpack_require__.d(__webpack_exports__, \"q\", function() {\n        return __WEBPACK_IMPORTED_MODULE_35__src_offset_silhouette__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_36__src_offset_wiggle__ = __webpack_require__(653);\n    __webpack_require__.d(__webpack_exports__, \"r\", function() {\n        return __WEBPACK_IMPORTED_MODULE_36__src_offset_wiggle__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_40__src_order_none__ = (__webpack_require__(186), \n    __webpack_require__(654), __webpack_require__(655), __webpack_require__(87));\n    __webpack_require__.d(__webpack_exports__, \"s\", function() {\n        return __WEBPACK_IMPORTED_MODULE_40__src_order_none__.a;\n    });\n    __webpack_require__(656);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_d3_path__ = __webpack_require__(84), __WEBPACK_IMPORTED_MODULE_1__constant__ = __webpack_require__(58), __WEBPACK_IMPORTED_MODULE_2__curve_linear__ = __webpack_require__(121), __WEBPACK_IMPORTED_MODULE_3__point__ = __webpack_require__(184);\n    __webpack_exports__.a = function() {\n        function line(data) {\n            var i, d, buffer, n = data.length, defined0 = !1;\n            for (null == context && (output = curve(buffer = Object(__WEBPACK_IMPORTED_MODULE_0_d3_path__.a)())), \n            i = 0; i <= n; ++i) !(i < n && defined(d = data[i], i, data)) === defined0 && ((defined0 = !defined0) ? output.lineStart() : output.lineEnd()), \n            defined0 && output.point(+x(d, i, data), +y(d, i, data));\n            if (buffer) return output = null, buffer + \"\" || null;\n        }\n        var x = __WEBPACK_IMPORTED_MODULE_3__point__.a, y = __WEBPACK_IMPORTED_MODULE_3__point__.b, defined = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!0), context = null, curve = __WEBPACK_IMPORTED_MODULE_2__curve_linear__.a, output = null;\n        return line.x = function(_) {\n            return arguments.length ? (x = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            line) : x;\n        }, line.y = function(_) {\n            return arguments.length ? (y = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            line) : y;\n        }, line.defined = function(_) {\n            return arguments.length ? (defined = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!!_), \n            line) : defined;\n        }, line.curve = function(_) {\n            return arguments.length ? (curve = _, null != context && (output = curve(context)), \n            line) : curve;\n        }, line.context = function(_) {\n            return arguments.length ? (null == _ ? context = output = null : output = curve(context = _), \n            line) : context;\n        }, line;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function x(p) {\n        return p[0];\n    }\n    function y(p) {\n        return p[1];\n    }\n    __webpack_exports__.a = x, __webpack_exports__.b = y;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function point(that, x, y) {\n        var x1 = that._x1, y1 = that._y1, x2 = that._x2, y2 = that._y2;\n        if (that._l01_a > __WEBPACK_IMPORTED_MODULE_0__math__.f) {\n            var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n            x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n, y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n        }\n        if (that._l23_a > __WEBPACK_IMPORTED_MODULE_0__math__.f) {\n            var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n            x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m, y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n        }\n        that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n    }\n    function CatmullRom(context, alpha) {\n        this._context = context, this._alpha = alpha;\n    }\n    __webpack_exports__.a = point;\n    var __WEBPACK_IMPORTED_MODULE_0__math__ = __webpack_require__(85), __WEBPACK_IMPORTED_MODULE_1__cardinal__ = __webpack_require__(124);\n    CatmullRom.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n        },\n        lineEnd: function() {\n            switch (this._point) {\n              case 2:\n                this._context.lineTo(this._x2, this._y2);\n                break;\n\n              case 3:\n                this.point(this._x2, this._y2);\n            }\n            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            if (x = +x, y = +y, this._point) {\n                var x23 = this._x2 - x, y23 = this._y2 - y;\n                this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n            }\n            switch (this._point) {\n              case 0:\n                this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n\n              case 1:\n                this._point = 2;\n                break;\n\n              case 2:\n                this._point = 3;\n\n              default:\n                point(this, x, y);\n            }\n            this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, \n            this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, \n            this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n        }\n    };\n    !function custom(alpha) {\n        function catmullRom(context) {\n            return alpha ? new CatmullRom(context, alpha) : new __WEBPACK_IMPORTED_MODULE_1__cardinal__.a(context, 0);\n        }\n        return catmullRom.alpha = function(alpha) {\n            return custom(+alpha);\n        }, catmullRom;\n    }(.5);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function sum(series) {\n        for (var v, s = 0, i = -1, n = series.length; ++i < n; ) (v = +series[i][1]) && (s += v);\n        return s;\n    }\n    __webpack_exports__.b = sum;\n    var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(87);\n    __webpack_exports__.a = function(series) {\n        var sums = series.map(sum);\n        return Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series).sort(function(a, b) {\n            return sums[a] - sums[b];\n        });\n    };\n}, function(module, exports, __webpack_require__) {\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n        return value === other || (null == value || null == other || !isObjectLike(value) && !isObjectLike(other) ? value !== value && other !== other : baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack));\n    }\n    var baseIsEqualDeep = __webpack_require__(657), isObjectLike = __webpack_require__(43);\n    module.exports = baseIsEqual;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(59), root = __webpack_require__(36), Map = getNative(root, \"Map\");\n    module.exports = Map;\n}, function(module, exports) {\n    function isObject(value) {\n        var type = typeof value;\n        return null != value && (\"object\" == type || \"function\" == type);\n    }\n    module.exports = isObject;\n}, function(module, exports, __webpack_require__) {\n    function MapCache(entries) {\n        var index = -1, length = null == entries ? 0 : entries.length;\n        for (this.clear(); ++index < length; ) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n    var mapCacheClear = __webpack_require__(674), mapCacheDelete = __webpack_require__(681), mapCacheGet = __webpack_require__(683), mapCacheHas = __webpack_require__(684), mapCacheSet = __webpack_require__(685);\n    MapCache.prototype.clear = mapCacheClear, MapCache.prototype.delete = mapCacheDelete, \n    MapCache.prototype.get = mapCacheGet, MapCache.prototype.has = mapCacheHas, MapCache.prototype.set = mapCacheSet, \n    module.exports = MapCache;\n}, function(module, exports, __webpack_require__) {\n    function keys(object) {\n        return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n    var arrayLikeKeys = __webpack_require__(699), baseKeys = __webpack_require__(705), isArrayLike = __webpack_require__(193);\n    module.exports = keys;\n}, function(module, exports) {\n    function isLength(value) {\n        return \"number\" == typeof value && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n    var MAX_SAFE_INTEGER = 9007199254740991;\n    module.exports = isLength;\n}, function(module, exports, __webpack_require__) {\n    function isArrayLike(value) {\n        return null != value && isLength(value.length) && !isFunction(value);\n    }\n    var isFunction = __webpack_require__(291), isLength = __webpack_require__(192);\n    module.exports = isArrayLike;\n}, function(module, exports) {\n    function arrayMap(array, iteratee) {\n        for (var index = -1, length = null == array ? 0 : array.length, result = Array(length); ++index < length; ) result[index] = iteratee(array[index], index, array);\n        return result;\n    }\n    module.exports = arrayMap;\n}, function(module, exports) {\n    function identity(value) {\n        return value;\n    }\n    module.exports = identity;\n}, function(module, exports, __webpack_require__) {\n    function isKey(value, object) {\n        if (isArray(value)) return !1;\n        var type = typeof value;\n        return !(\"number\" != type && \"symbol\" != type && \"boolean\" != type && null != value && !isSymbol(value)) || (reIsPlainProp.test(value) || !reIsDeepProp.test(value) || null != object && value in Object(object));\n    }\n    var isArray = __webpack_require__(34), isSymbol = __webpack_require__(197), reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/, reIsPlainProp = /^\\w*$/;\n    module.exports = isKey;\n}, function(module, exports, __webpack_require__) {\n    function isSymbol(value) {\n        return \"symbol\" == typeof value || isObjectLike(value) && baseGetTag(value) == symbolTag;\n    }\n    var baseGetTag = __webpack_require__(60), isObjectLike = __webpack_require__(43), symbolTag = \"[object Symbol]\";\n    module.exports = isSymbol;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function autoCompleteStyle(name, value) {\n        return STYLE_LIST.indexOf(name) >= 0 && value === +value ? value + \"px\" : value;\n    }\n    function camelToMiddleLine(text) {\n        return text.split(\"\").reduce(function(result, entry) {\n            return entry === entry.toUpperCase() ? [].concat(_toConsumableArray(result), [ \"-\", entry.toLowerCase() ]) : [].concat(_toConsumableArray(result), [ entry ]);\n        }, []).join(\"\");\n    }\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return getStringSize;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return getOffset;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return calculateChartCoordinate;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0__ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, stringCache = {\n        widthCache: {},\n        cacheCount: 0\n    }, SPAN_STYLE = {\n        position: \"absolute\",\n        top: \"-20000px\",\n        left: 0,\n        padding: 0,\n        margin: 0,\n        border: \"none\",\n        whiteSpace: \"pre\"\n    }, STYLE_LIST = [ \"minWidth\", \"maxWidth\", \"width\", \"minHeight\", \"maxHeight\", \"height\", \"top\", \"left\", \"fontSize\", \"lineHeight\", \"padding\", \"margin\", \"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\", \"marginLeft\", \"marginRight\", \"marginTop\", \"marginBottom\" ], getStyleString = function(style) {\n        return Object.keys(style).reduce(function(result, s) {\n            return \"\" + result + camelToMiddleLine(s) + \":\" + autoCompleteStyle(s, style[s]) + \";\";\n        }, \"\");\n    }, getStringSize = function(text) {\n        var style = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};\n        if (void 0 === text || null === text || Object(__WEBPACK_IMPORTED_MODULE_0__ReactUtils__.n)()) return {\n            width: 0,\n            height: 0\n        };\n        var str = \"\" + text, styleString = getStyleString(style), cacheKey = str + \"-\" + styleString;\n        if (stringCache.widthCache[cacheKey]) return stringCache.widthCache[cacheKey];\n        try {\n            var measurementSpan = document.getElementById(\"recharts_measurement_span\");\n            measurementSpan || (measurementSpan = document.createElement(\"span\"), measurementSpan.setAttribute(\"id\", \"recharts_measurement_span\"), \n            document.body.appendChild(measurementSpan));\n            var measurementSpanStyle = _extends({}, SPAN_STYLE, style);\n            Object.keys(measurementSpanStyle).map(function(styleKey) {\n                return measurementSpan.style[styleKey] = measurementSpanStyle[styleKey], styleKey;\n            }), measurementSpan.textContent = str;\n            var rect = measurementSpan.getBoundingClientRect(), result = {\n                width: rect.width,\n                height: rect.height\n            };\n            return stringCache.widthCache[cacheKey] = result, ++stringCache.cacheCount > 2e3 && (stringCache.cacheCount = 0, \n            stringCache.widthCache = {}), result;\n        } catch (e) {\n            return {\n                width: 0,\n                height: 0\n            };\n        }\n    }, getOffset = function(el) {\n        var html = el.ownerDocument.documentElement, box = {\n            top: 0,\n            left: 0\n        };\n        return void 0 !== el.getBoundingClientRect && (box = el.getBoundingClientRect()), \n        {\n            top: box.top + window.pageYOffset - html.clientTop,\n            left: box.left + window.pageXOffset - html.clientLeft\n        };\n    }, calculateChartCoordinate = function(event, offset) {\n        return {\n            chartX: Math.round(event.pageX - offset.left),\n            chartY: Math.round(event.pageY - offset.top)\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n        return value === other || (null == value || null == other || !isObjectLike(value) && !isObjectLike(other) ? value !== value && other !== other : baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack));\n    }\n    var baseIsEqualDeep = __webpack_require__(778), isObjectLike = __webpack_require__(42);\n    module.exports = baseIsEqual;\n}, function(module, exports, __webpack_require__) {\n    function keys(object) {\n        return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n    var arrayLikeKeys = __webpack_require__(799), baseKeys = __webpack_require__(805), isArrayLike = __webpack_require__(134);\n    module.exports = keys;\n}, function(module, exports, __webpack_require__) {\n    var baseIsArguments = __webpack_require__(801), isObjectLike = __webpack_require__(42), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty, propertyIsEnumerable = objectProto.propertyIsEnumerable, isArguments = baseIsArguments(function() {\n        return arguments;\n    }()) ? baseIsArguments : function(value) {\n        return isObjectLike(value) && hasOwnProperty.call(value, \"callee\") && !propertyIsEnumerable.call(value, \"callee\");\n    };\n    module.exports = isArguments;\n}, function(module, exports) {\n    function isIndex(value, length) {\n        var type = typeof value;\n        return !!(length = null == length ? MAX_SAFE_INTEGER : length) && (\"number\" == type || \"symbol\" != type && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;\n    }\n    var MAX_SAFE_INTEGER = 9007199254740991, reIsUint = /^(?:0|[1-9]\\d*)$/;\n    module.exports = isIndex;\n}, function(module, exports) {\n    function isLength(value) {\n        return \"number\" == typeof value && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n    var MAX_SAFE_INTEGER = 9007199254740991;\n    module.exports = isLength;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(90);\n    __webpack_exports__.a = function(values, p, valueof) {\n        if (null == valueof && (valueof = __WEBPACK_IMPORTED_MODULE_0__number__.a), n = values.length) {\n            if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);\n            if (p >= 1) return +valueof(values[n - 1], n - 1, values);\n            var n, i = (n - 1) * p, i0 = Math.floor(i), value0 = +valueof(values[i0], i0, values);\n            return value0 + (+valueof(values[i0 + 1], i0 + 1, values) - value0) * (i - i0);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Map() {}\n    function map(object, f) {\n        var map = new Map();\n        if (object instanceof Map) object.each(function(value, key) {\n            map.set(key, value);\n        }); else if (Array.isArray(object)) {\n            var o, i = -1, n = object.length;\n            if (null == f) for (;++i < n; ) map.set(i, object[i]); else for (;++i < n; ) map.set(f(o = object[i], i, object), o);\n        } else if (object) for (var key in object) map.set(key, object[key]);\n        return map;\n    }\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return prefix;\n    });\n    var prefix = \"$\";\n    Map.prototype = map.prototype = {\n        constructor: Map,\n        has: function(key) {\n            return prefix + key in this;\n        },\n        get: function(key) {\n            return this[prefix + key];\n        },\n        set: function(key, value) {\n            return this[prefix + key] = value, this;\n        },\n        remove: function(key) {\n            var property = prefix + key;\n            return property in this && delete this[property];\n        },\n        clear: function() {\n            for (var property in this) property[0] === prefix && delete this[property];\n        },\n        keys: function() {\n            var keys = [];\n            for (var property in this) property[0] === prefix && keys.push(property.slice(1));\n            return keys;\n        },\n        values: function() {\n            var values = [];\n            for (var property in this) property[0] === prefix && values.push(this[property]);\n            return values;\n        },\n        entries: function() {\n            var entries = [];\n            for (var property in this) property[0] === prefix && entries.push({\n                key: property.slice(1),\n                value: this[property]\n            });\n            return entries;\n        },\n        size: function() {\n            var size = 0;\n            for (var property in this) property[0] === prefix && ++size;\n            return size;\n        },\n        empty: function() {\n            for (var property in this) if (property[0] === prefix) return !1;\n            return !0;\n        },\n        each: function(f) {\n            for (var property in this) property[0] === prefix && f(this[property], property.slice(1), this);\n        }\n    }, __webpack_exports__.a = map;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__rgb__ = __webpack_require__(346), __WEBPACK_IMPORTED_MODULE_2__array__ = __webpack_require__(349), __WEBPACK_IMPORTED_MODULE_3__date__ = __webpack_require__(350), __WEBPACK_IMPORTED_MODULE_4__number__ = __webpack_require__(136), __WEBPACK_IMPORTED_MODULE_5__object__ = __webpack_require__(351), __WEBPACK_IMPORTED_MODULE_6__string__ = __webpack_require__(352), __WEBPACK_IMPORTED_MODULE_7__constant__ = __webpack_require__(348);\n    __webpack_exports__.a = function(a, b) {\n        var c, t = typeof b;\n        return null == b || \"boolean\" === t ? Object(__WEBPACK_IMPORTED_MODULE_7__constant__.a)(b) : (\"number\" === t ? __WEBPACK_IMPORTED_MODULE_4__number__.a : \"string\" === t ? (c = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.a)(b)) ? (b = c, \n        __WEBPACK_IMPORTED_MODULE_1__rgb__.a) : __WEBPACK_IMPORTED_MODULE_6__string__.a : b instanceof __WEBPACK_IMPORTED_MODULE_0_d3_color__.a ? __WEBPACK_IMPORTED_MODULE_1__rgb__.a : b instanceof Date ? __WEBPACK_IMPORTED_MODULE_3__date__.a : Array.isArray(b) ? __WEBPACK_IMPORTED_MODULE_2__array__.a : \"function\" != typeof b.valueOf && \"function\" != typeof b.toString || isNaN(b) ? __WEBPACK_IMPORTED_MODULE_5__object__.a : __WEBPACK_IMPORTED_MODULE_4__number__.a)(a, b);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Color() {}\n    function color(format) {\n        var m;\n        return format = (format + \"\").trim().toLowerCase(), (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), \n        new Rgb(m >> 8 & 15 | m >> 4 & 240, m >> 4 & 15 | 240 & m, (15 & m) << 4 | 15 & m, 1)) : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) : (m = reRgbPercent.exec(format)) ? new Rgb(255 * m[1] / 100, 255 * m[2] / 100, 255 * m[3] / 100, 1) : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) : (m = reRgbaPercent.exec(format)) ? rgba(255 * m[1] / 100, 255 * m[2] / 100, 255 * m[3] / 100, m[4]) : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) : named.hasOwnProperty(format) ? rgbn(named[format]) : \"transparent\" === format ? new Rgb(NaN, NaN, NaN, 0) : null;\n    }\n    function rgbn(n) {\n        return new Rgb(n >> 16 & 255, n >> 8 & 255, 255 & n, 1);\n    }\n    function rgba(r, g, b, a) {\n        return a <= 0 && (r = g = b = NaN), new Rgb(r, g, b, a);\n    }\n    function rgbConvert(o) {\n        return o instanceof Color || (o = color(o)), o ? (o = o.rgb(), new Rgb(o.r, o.g, o.b, o.opacity)) : new Rgb();\n    }\n    function rgb(r, g, b, opacity) {\n        return 1 === arguments.length ? rgbConvert(r) : new Rgb(r, g, b, null == opacity ? 1 : opacity);\n    }\n    function Rgb(r, g, b, opacity) {\n        this.r = +r, this.g = +g, this.b = +b, this.opacity = +opacity;\n    }\n    function hsla(h, s, l, a) {\n        return a <= 0 ? h = s = l = NaN : l <= 0 || l >= 1 ? h = s = NaN : s <= 0 && (h = NaN), \n        new Hsl(h, s, l, a);\n    }\n    function hslConvert(o) {\n        if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n        if (o instanceof Color || (o = color(o)), !o) return new Hsl();\n        if (o instanceof Hsl) return o;\n        o = o.rgb();\n        var r = o.r / 255, g = o.g / 255, b = o.b / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), h = NaN, s = max - min, l = (max + min) / 2;\n        return s ? (h = r === max ? (g - b) / s + 6 * (g < b) : g === max ? (b - r) / s + 2 : (r - g) / s + 4, \n        s /= l < .5 ? max + min : 2 - max - min, h *= 60) : s = l > 0 && l < 1 ? 0 : h, \n        new Hsl(h, s, l, o.opacity);\n    }\n    function hsl(h, s, l, opacity) {\n        return 1 === arguments.length ? hslConvert(h) : new Hsl(h, s, l, null == opacity ? 1 : opacity);\n    }\n    function Hsl(h, s, l, opacity) {\n        this.h = +h, this.s = +s, this.l = +l, this.opacity = +opacity;\n    }\n    function hsl2rgb(h, m1, m2) {\n        return 255 * (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1);\n    }\n    __webpack_exports__.a = Color, __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return darker;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return brighter;\n    }), __webpack_exports__.e = color, __webpack_exports__.h = rgbConvert, __webpack_exports__.g = rgb, \n    __webpack_exports__.b = Rgb, __webpack_exports__.f = hsl;\n    var __WEBPACK_IMPORTED_MODULE_0__define__ = __webpack_require__(208), darker = .7, brighter = 1 / darker, reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\", reN = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\", reP = \"\\\\s*([+-]?\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\", reHex3 = /^#([0-9a-f]{3})$/, reHex6 = /^#([0-9a-f]{6})$/, reRgbInteger = new RegExp(\"^rgb\\\\(\" + [ reI, reI, reI ] + \"\\\\)$\"), reRgbPercent = new RegExp(\"^rgb\\\\(\" + [ reP, reP, reP ] + \"\\\\)$\"), reRgbaInteger = new RegExp(\"^rgba\\\\(\" + [ reI, reI, reI, reN ] + \"\\\\)$\"), reRgbaPercent = new RegExp(\"^rgba\\\\(\" + [ reP, reP, reP, reN ] + \"\\\\)$\"), reHslPercent = new RegExp(\"^hsl\\\\(\" + [ reN, reP, reP ] + \"\\\\)$\"), reHslaPercent = new RegExp(\"^hsla\\\\(\" + [ reN, reP, reP, reN ] + \"\\\\)$\"), named = {\n        aliceblue: 15792383,\n        antiquewhite: 16444375,\n        aqua: 65535,\n        aquamarine: 8388564,\n        azure: 15794175,\n        beige: 16119260,\n        bisque: 16770244,\n        black: 0,\n        blanchedalmond: 16772045,\n        blue: 255,\n        blueviolet: 9055202,\n        brown: 10824234,\n        burlywood: 14596231,\n        cadetblue: 6266528,\n        chartreuse: 8388352,\n        chocolate: 13789470,\n        coral: 16744272,\n        cornflowerblue: 6591981,\n        cornsilk: 16775388,\n        crimson: 14423100,\n        cyan: 65535,\n        darkblue: 139,\n        darkcyan: 35723,\n        darkgoldenrod: 12092939,\n        darkgray: 11119017,\n        darkgreen: 25600,\n        darkgrey: 11119017,\n        darkkhaki: 12433259,\n        darkmagenta: 9109643,\n        darkolivegreen: 5597999,\n        darkorange: 16747520,\n        darkorchid: 10040012,\n        darkred: 9109504,\n        darksalmon: 15308410,\n        darkseagreen: 9419919,\n        darkslateblue: 4734347,\n        darkslategray: 3100495,\n        darkslategrey: 3100495,\n        darkturquoise: 52945,\n        darkviolet: 9699539,\n        deeppink: 16716947,\n        deepskyblue: 49151,\n        dimgray: 6908265,\n        dimgrey: 6908265,\n        dodgerblue: 2003199,\n        firebrick: 11674146,\n        floralwhite: 16775920,\n        forestgreen: 2263842,\n        fuchsia: 16711935,\n        gainsboro: 14474460,\n        ghostwhite: 16316671,\n        gold: 16766720,\n        goldenrod: 14329120,\n        gray: 8421504,\n        green: 32768,\n        greenyellow: 11403055,\n        grey: 8421504,\n        honeydew: 15794160,\n        hotpink: 16738740,\n        indianred: 13458524,\n        indigo: 4915330,\n        ivory: 16777200,\n        khaki: 15787660,\n        lavender: 15132410,\n        lavenderblush: 16773365,\n        lawngreen: 8190976,\n        lemonchiffon: 16775885,\n        lightblue: 11393254,\n        lightcoral: 15761536,\n        lightcyan: 14745599,\n        lightgoldenrodyellow: 16448210,\n        lightgray: 13882323,\n        lightgreen: 9498256,\n        lightgrey: 13882323,\n        lightpink: 16758465,\n        lightsalmon: 16752762,\n        lightseagreen: 2142890,\n        lightskyblue: 8900346,\n        lightslategray: 7833753,\n        lightslategrey: 7833753,\n        lightsteelblue: 11584734,\n        lightyellow: 16777184,\n        lime: 65280,\n        limegreen: 3329330,\n        linen: 16445670,\n        magenta: 16711935,\n        maroon: 8388608,\n        mediumaquamarine: 6737322,\n        mediumblue: 205,\n        mediumorchid: 12211667,\n        mediumpurple: 9662683,\n        mediumseagreen: 3978097,\n        mediumslateblue: 8087790,\n        mediumspringgreen: 64154,\n        mediumturquoise: 4772300,\n        mediumvioletred: 13047173,\n        midnightblue: 1644912,\n        mintcream: 16121850,\n        mistyrose: 16770273,\n        moccasin: 16770229,\n        navajowhite: 16768685,\n        navy: 128,\n        oldlace: 16643558,\n        olive: 8421376,\n        olivedrab: 7048739,\n        orange: 16753920,\n        orangered: 16729344,\n        orchid: 14315734,\n        palegoldenrod: 15657130,\n        palegreen: 10025880,\n        paleturquoise: 11529966,\n        palevioletred: 14381203,\n        papayawhip: 16773077,\n        peachpuff: 16767673,\n        peru: 13468991,\n        pink: 16761035,\n        plum: 14524637,\n        powderblue: 11591910,\n        purple: 8388736,\n        rebeccapurple: 6697881,\n        red: 16711680,\n        rosybrown: 12357519,\n        royalblue: 4286945,\n        saddlebrown: 9127187,\n        salmon: 16416882,\n        sandybrown: 16032864,\n        seagreen: 3050327,\n        seashell: 16774638,\n        sienna: 10506797,\n        silver: 12632256,\n        skyblue: 8900331,\n        slateblue: 6970061,\n        slategray: 7372944,\n        slategrey: 7372944,\n        snow: 16775930,\n        springgreen: 65407,\n        steelblue: 4620980,\n        tan: 13808780,\n        teal: 32896,\n        thistle: 14204888,\n        tomato: 16737095,\n        turquoise: 4251856,\n        violet: 15631086,\n        wheat: 16113331,\n        white: 16777215,\n        whitesmoke: 16119285,\n        yellow: 16776960,\n        yellowgreen: 10145074\n    };\n    Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Color, color, {\n        displayable: function() {\n            return this.rgb().displayable();\n        },\n        toString: function() {\n            return this.rgb() + \"\";\n        }\n    }), Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Rgb, rgb, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(Color, {\n        brighter: function(k) {\n            return k = null == k ? brighter : Math.pow(brighter, k), new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n        },\n        darker: function(k) {\n            return k = null == k ? darker : Math.pow(darker, k), new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n        },\n        rgb: function() {\n            return this;\n        },\n        displayable: function() {\n            return 0 <= this.r && this.r <= 255 && 0 <= this.g && this.g <= 255 && 0 <= this.b && this.b <= 255 && 0 <= this.opacity && this.opacity <= 1;\n        },\n        toString: function() {\n            var a = this.opacity;\n            return a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)), (1 === a ? \"rgb(\" : \"rgba(\") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + \", \" + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (1 === a ? \")\" : \", \" + a + \")\");\n        }\n    })), Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Hsl, hsl, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(Color, {\n        brighter: function(k) {\n            return k = null == k ? brighter : Math.pow(brighter, k), new Hsl(this.h, this.s, this.l * k, this.opacity);\n        },\n        darker: function(k) {\n            return k = null == k ? darker : Math.pow(darker, k), new Hsl(this.h, this.s, this.l * k, this.opacity);\n        },\n        rgb: function() {\n            var h = this.h % 360 + 360 * (this.h < 0), s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < .5 ? l : 1 - l) * s, m1 = 2 * l - m2;\n            return new Rgb(hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), hsl2rgb(h, m1, m2), hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), this.opacity);\n        },\n        displayable: function() {\n            return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1;\n        }\n    }));\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function extend(parent, definition) {\n        var prototype = Object.create(parent.prototype);\n        for (var key in definition) prototype[key] = definition[key];\n        return prototype;\n    }\n    __webpack_exports__.b = extend, __webpack_exports__.a = function(constructor, factory, prototype) {\n        constructor.prototype = factory.prototype = prototype, prototype.constructor = constructor;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function basis(t1, v0, v1, v2, v3) {\n        var t2 = t1 * t1, t3 = t2 * t1;\n        return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6;\n    }\n    __webpack_exports__.a = basis, __webpack_exports__.b = function(values) {\n        var n = values.length - 1;\n        return function(t) {\n            var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n            return basis((t - i / n) * n, v0, v1, v2, v3);\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return function() {\n            return x;\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x, p) {\n        if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null;\n        var i, coefficient = x.slice(0, i);\n        return [ coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, +x.slice(i + 1) ];\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_1__src_millisecond__ = (__webpack_require__(18), __webpack_require__(898));\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__src_millisecond__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"n\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__src_millisecond__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_2__src_second__ = __webpack_require__(899);\n    __webpack_require__.d(__webpack_exports__, \"g\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_second__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"r\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_second__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_3__src_minute__ = __webpack_require__(900);\n    __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return __WEBPACK_IMPORTED_MODULE_3__src_minute__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_4__src_hour__ = __webpack_require__(901);\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_4__src_hour__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_5__src_day__ = __webpack_require__(902);\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_5__src_day__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_6__src_week__ = __webpack_require__(903);\n    __webpack_require__.d(__webpack_exports__, \"j\", function() {\n        return __WEBPACK_IMPORTED_MODULE_6__src_week__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"h\", function() {\n        return __WEBPACK_IMPORTED_MODULE_6__src_week__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return __WEBPACK_IMPORTED_MODULE_6__src_week__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"i\", function() {\n        return __WEBPACK_IMPORTED_MODULE_6__src_week__.c;\n    });\n    var __WEBPACK_IMPORTED_MODULE_7__src_month__ = __webpack_require__(904);\n    __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return __WEBPACK_IMPORTED_MODULE_7__src_month__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_8__src_year__ = __webpack_require__(905);\n    __webpack_require__.d(__webpack_exports__, \"k\", function() {\n        return __WEBPACK_IMPORTED_MODULE_8__src_year__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_9__src_utcMinute__ = __webpack_require__(906);\n    __webpack_require__.d(__webpack_exports__, \"o\", function() {\n        return __WEBPACK_IMPORTED_MODULE_9__src_utcMinute__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_10__src_utcHour__ = __webpack_require__(907);\n    __webpack_require__.d(__webpack_exports__, \"m\", function() {\n        return __WEBPACK_IMPORTED_MODULE_10__src_utcHour__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_11__src_utcDay__ = __webpack_require__(908);\n    __webpack_require__.d(__webpack_exports__, \"l\", function() {\n        return __WEBPACK_IMPORTED_MODULE_11__src_utcDay__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__ = __webpack_require__(909);\n    __webpack_require__.d(__webpack_exports__, \"u\", function() {\n        return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"s\", function() {\n        return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"p\", function() {\n        return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"t\", function() {\n        return __WEBPACK_IMPORTED_MODULE_12__src_utcWeek__.c;\n    });\n    var __WEBPACK_IMPORTED_MODULE_13__src_utcMonth__ = __webpack_require__(910);\n    __webpack_require__.d(__webpack_exports__, \"q\", function() {\n        return __WEBPACK_IMPORTED_MODULE_13__src_utcMonth__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_14__src_utcYear__ = __webpack_require__(911);\n    __webpack_require__.d(__webpack_exports__, \"v\", function() {\n        return __WEBPACK_IMPORTED_MODULE_14__src_utcYear__.a;\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return timeFormat;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return utcFormat;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return utcParse;\n    });\n    var locale, timeFormat, timeParse, utcFormat, utcParse, __WEBPACK_IMPORTED_MODULE_0__locale__ = __webpack_require__(362);\n    !function(definition) {\n        locale = Object(__WEBPACK_IMPORTED_MODULE_0__locale__.a)(definition), timeFormat = locale.format, \n        timeParse = locale.parse, utcFormat = locale.utcFormat, utcParse = locale.utcParse;\n    }({\n        dateTime: \"%x, %X\",\n        date: \"%-m/%-d/%Y\",\n        time: \"%-I:%M:%S %p\",\n        periods: [ \"AM\", \"PM\" ],\n        days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n        shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n        months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n        shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), getPolygonPoints = function(points) {\n        return points.reduce(function(result, entry) {\n            return entry.x === +entry.x && entry.y === +entry.y && result.push([ entry.x, entry.y ]), \n            result;\n        }, []).join(\" \");\n    }, Polygon = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Polygon() {\n            return _classCallCheck(this, Polygon), _possibleConstructorReturn(this, (Polygon.__proto__ || Object.getPrototypeOf(Polygon)).apply(this, arguments));\n        }\n        return _inherits(Polygon, _Component), _createClass(Polygon, [ {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, points = _props.points, className = _props.className;\n                if (!points || !points.length) return null;\n                var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()(\"recharts-polygon\", className);\n                return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"polygon\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props), {\n                    className: layerClass,\n                    points: getPolygonPoints(points)\n                }));\n            }\n        } ]), Polygon;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"Polygon\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        points: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number\n        }))\n    }), _class = _temp)) || _class;\n    __webpack_exports__.a = Polygon;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_5_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react_smooth__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_9__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_10__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_11__component_LabelList__ = __webpack_require__(47), __WEBPACK_IMPORTED_MODULE_12__ErrorBar__ = __webpack_require__(95), __WEBPACK_IMPORTED_MODULE_13__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Line = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Line() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Line);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Line.__proto__ || Object.getPrototypeOf(Line)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isAnimationFinished: !0,\n                totalLength: 0\n            }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.k)(\"recharts-line-\"), \n            _this.cachePrevData = function(points) {\n                _this.setState({\n                    prevPoints: points\n                });\n            }, _this.pathRef = function(node) {\n                _this.mainCurve = node;\n            }, _this.handleAnimationEnd = function() {\n                _this.setState({\n                    isAnimationFinished: !0\n                }), _this.props.onAnimationEnd();\n            }, _this.handleAnimationStart = function() {\n                _this.setState({\n                    isAnimationFinished: !1\n                }), _this.props.onAnimationStart();\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Line, _Component), _createClass(Line, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                if (this.props.isAnimationActive) {\n                    var totalLength = this.getTotalLength();\n                    this.setState({\n                        totalLength: totalLength\n                    });\n                }\n            }\n        }, {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, animationId = _props.animationId, points = _props.points;\n                nextProps.animationId !== animationId && this.cachePrevData(points);\n            }\n        }, {\n            key: \"getTotalLength\",\n            value: function() {\n                var curveDom = this.mainCurve;\n                try {\n                    return curveDom && curveDom.getTotalLength && curveDom.getTotalLength() || 0;\n                } catch (err) {\n                    return 0;\n                }\n            }\n        }, {\n            key: \"getStrokeDasharray\",\n            value: function(length, totalLength, lines) {\n                for (var lineLength = lines.reduce(function(pre, next) {\n                    return pre + next;\n                }), count = parseInt(length / lineLength, 10), remainLength = length % lineLength, restLength = totalLength - length, remainLines = [], i = 0, sum = 0; ;sum += lines[i], \n                ++i) if (sum + lines[i] > remainLength) {\n                    remainLines = [].concat(_toConsumableArray(lines.slice(0, i)), [ remainLength - sum ]);\n                    break;\n                }\n                var emptyLines = remainLines.length % 2 == 0 ? [ 0, restLength ] : [ restLength ];\n                return [].concat(_toConsumableArray(this.repeat(lines, count)), _toConsumableArray(remainLines), emptyLines).map(function(line) {\n                    return line + \"px\";\n                }).join(\", \");\n            }\n        }, {\n            key: \"repeat\",\n            value: function(lines, count) {\n                for (var linesUnit = lines.length % 2 != 0 ? [].concat(_toConsumableArray(lines), [ 0 ]) : lines, result = [], i = 0; i < count; ++i) result = [].concat(_toConsumableArray(result), _toConsumableArray(linesUnit));\n                return result;\n            }\n        }, {\n            key: \"renderErrorBar\",\n            value: function() {\n                function dataPointFormatter(dataPoint, dataKey) {\n                    return {\n                        x: dataPoint.x,\n                        y: dataPoint.y,\n                        value: dataPoint.value,\n                        errorVal: Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.w)(dataPoint.payload, dataKey)\n                    };\n                }\n                if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;\n                var _props2 = this.props, points = _props2.points, xAxis = _props2.xAxis, yAxis = _props2.yAxis, layout = _props2.layout, children = _props2.children, errorBarItems = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_12__ErrorBar__.a);\n                return errorBarItems ? errorBarItems.map(function(item, i) {\n                    return __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(item, {\n                        key: i,\n                        data: points,\n                        xAxis: xAxis,\n                        yAxis: yAxis,\n                        layout: layout,\n                        dataPointFormatter: dataPointFormatter\n                    });\n                }) : null;\n            }\n        }, {\n            key: \"renderDotItem\",\n            value: function(option, props) {\n                var dotItem = void 0;\n                if (__WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(option)) dotItem = __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(option, props); else if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option)) dotItem = option(props); else {\n                    var className = __WEBPACK_IMPORTED_MODULE_6_classnames___default()(\"recharts-line-dot\", option ? option.className : \"\");\n                    dotItem = __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Dot__.a, _extends({}, props, {\n                        className: className\n                    }));\n                }\n                return dotItem;\n            }\n        }, {\n            key: \"renderDots\",\n            value: function() {\n                var _this2 = this;\n                if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;\n                var _props3 = this.props, dot = _props3.dot, points = _props3.points, dataKey = _props3.dataKey, lineProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), customDotProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(dot), dotEvents = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.e)(dot), dots = points.map(function(entry, i) {\n                    var dotProps = _extends({\n                        key: \"dot-\" + i,\n                        r: 3\n                    }, lineProps, customDotProps, dotEvents, {\n                        value: entry.value,\n                        dataKey: dataKey,\n                        cx: entry.x,\n                        cy: entry.y,\n                        index: i,\n                        payload: entry.payload\n                    });\n                    return _this2.renderDotItem(dot, dotProps);\n                });\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__container_Layer__.a, {\n                    className: \"recharts-line-dots\",\n                    key: \"dots\"\n                }, dots);\n            }\n        }, {\n            key: \"renderCurveStatically\",\n            value: function(points, needClip, props) {\n                var _props4 = this.props, type = _props4.type, layout = _props4.layout, connectNulls = _props4.connectNulls, id = _props4.id, clipPathId = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? this.id : id, curveProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.e)(this.props), {\n                    fill: \"none\",\n                    className: \"recharts-line-curve\",\n                    clipPath: needClip ? \"url(#clipPath-\" + clipPathId + \")\" : null,\n                    points: points\n                }, props, {\n                    type: type,\n                    layout: layout,\n                    connectNulls: connectNulls\n                });\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__shape_Curve__.a, _extends({}, curveProps, {\n                    pathRef: this.pathRef\n                }));\n            }\n        }, {\n            key: \"renderCurveWithAnimation\",\n            value: function(needClip) {\n                var _this3 = this, _props5 = this.props, points = _props5.points, strokeDasharray = _props5.strokeDasharray, isAnimationActive = _props5.isAnimationActive, animationBegin = _props5.animationBegin, animationDuration = _props5.animationDuration, animationEasing = _props5.animationEasing, animationId = _props5.animationId, width = _props5.width, height = _props5.height, _state = (_objectWithoutProperties(_props5, [ \"points\", \"strokeDasharray\", \"isAnimationActive\", \"animationBegin\", \"animationDuration\", \"animationEasing\", \"animationId\", \"width\", \"height\" ]), \n                this.state), prevPoints = _state.prevPoints, totalLength = _state.totalLength;\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5_react_smooth___default.a, {\n                    begin: animationBegin,\n                    duration: animationDuration,\n                    isActive: isAnimationActive,\n                    easing: animationEasing,\n                    from: {\n                        t: 0\n                    },\n                    to: {\n                        t: 1\n                    },\n                    key: \"line-\" + animationId,\n                    onAnimationEnd: this.handleAnimationEnd,\n                    onAnimationStart: this.handleAnimationStart\n                }, function(_ref2) {\n                    var t = _ref2.t;\n                    if (prevPoints) {\n                        var stepData = points.map(function(entry, index) {\n                            if (prevPoints[index]) {\n                                var prev = prevPoints[index], _interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(prev.x, entry.x), _interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(prev.y, entry.y);\n                                return _extends({}, entry, {\n                                    x: _interpolatorX(t),\n                                    y: _interpolatorY(t)\n                                });\n                            }\n                            var interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(2 * width, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(height / 2, entry.y);\n                            return _extends({}, entry, {\n                                x: interpolatorX(t),\n                                y: interpolatorY(t)\n                            });\n                        });\n                        return _this3.renderCurveStatically(stepData, needClip);\n                    }\n                    var interpolator = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(0, totalLength), curLength = interpolator(t), currentStrokeDasharray = void 0;\n                    if (strokeDasharray) {\n                        var lines = strokeDasharray.split(/[,\\s]+/gim).map(function(num) {\n                            return parseFloat(num);\n                        });\n                        currentStrokeDasharray = _this3.getStrokeDasharray(curLength, totalLength, lines);\n                    } else currentStrokeDasharray = curLength + \"px \" + (totalLength - curLength) + \"px\";\n                    return _this3.renderCurveStatically(points, needClip, {\n                        strokeDasharray: currentStrokeDasharray\n                    });\n                });\n            }\n        }, {\n            key: \"renderCurve\",\n            value: function(needClip) {\n                var _props6 = this.props, points = _props6.points, isAnimationActive = _props6.isAnimationActive, _state2 = this.state, prevPoints = _state2.prevPoints, totalLength = _state2.totalLength;\n                return isAnimationActive && points && points.length && (!prevPoints && totalLength > 0 || !__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points)) ? this.renderCurveWithAnimation(needClip) : this.renderCurveStatically(points, needClip);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props7 = this.props, hide = _props7.hide, dot = _props7.dot, points = _props7.points, className = _props7.className, xAxis = _props7.xAxis, yAxis = _props7.yAxis, top = _props7.top, left = _props7.left, width = _props7.width, height = _props7.height, isAnimationActive = _props7.isAnimationActive, id = _props7.id;\n                if (hide || !points || !points.length) return null;\n                var isAnimationFinished = this.state.isAnimationFinished, hasSinglePoint = 1 === points.length, layerClass = __WEBPACK_IMPORTED_MODULE_6_classnames___default()(\"recharts-line\", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? this.id : id;\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__container_Layer__.a, {\n                    className: layerClass\n                }, needClip ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"defs\", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"clipPath\", {\n                    id: \"clipPath-\" + clipPathId\n                }, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"rect\", {\n                    x: left,\n                    y: top,\n                    width: width,\n                    height: height\n                }))) : null, !hasSinglePoint && this.renderCurve(needClip), this.renderErrorBar(), (hasSinglePoint || dot) && this.renderDots(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_11__component_LabelList__.a.renderCallByParent(this.props, points));\n            }\n        } ]), Line;\n    }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = \"Line\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.a, {\n        className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,\n        type: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"basis\", \"basisClosed\", \"basisOpen\", \"linear\", \"linearClosed\", \"natural\", \"monotoneX\", \"monotoneY\", \"monotone\", \"step\", \"stepBefore\", \"stepAfter\" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),\n        unit: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        name: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        xAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        yAxis: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object,\n        xAxis: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object,\n        legendType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.b),\n        layout: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"horizontal\", \"vertical\" ]),\n        connectNulls: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        activeDot: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool ]),\n        dot: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool ]),\n        top: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        left: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        points: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.value\n        })),\n        onAnimationStart: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,\n        onAnimationEnd: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ]),\n        animationId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        id: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string\n    }), _class2.defaultProps = {\n        xAxisId: 0,\n        yAxisId: 0,\n        connectNulls: !1,\n        activeDot: !0,\n        dot: !0,\n        legendType: \"line\",\n        stroke: \"#3182bd\",\n        strokeWidth: 1,\n        fill: \"#fff\",\n        points: [],\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.n)(),\n        animationBegin: 0,\n        animationDuration: 1500,\n        animationEasing: \"ease\",\n        hide: !1,\n        onAnimationStart: function() {},\n        onAnimationEnd: function() {}\n    }, _class2.getComposedData = function(_ref3) {\n        var props = _ref3.props, xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, xAxisTicks = _ref3.xAxisTicks, yAxisTicks = _ref3.yAxisTicks, dataKey = _ref3.dataKey, bandSize = _ref3.bandSize, displayedData = _ref3.displayedData, offset = _ref3.offset, layout = props.layout, points = displayedData.map(function(entry, index) {\n            var value = Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.w)(entry, dataKey);\n            return \"horizontal\" === layout ? {\n                x: Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.l)({\n                    axis: xAxis,\n                    ticks: xAxisTicks,\n                    bandSize: bandSize,\n                    entry: entry,\n                    index: index\n                }),\n                y: __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) ? null : yAxis.scale(value),\n                value: value,\n                payload: entry\n            } : {\n                x: __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) ? null : xAxis.scale(value),\n                y: Object(__WEBPACK_IMPORTED_MODULE_15__util_ChartUtils__.l)({\n                    axis: yAxis,\n                    ticks: yAxisTicks,\n                    bandSize: bandSize,\n                    entry: entry,\n                    index: index\n                }),\n                value: value,\n                payload: entry\n            };\n        });\n        return _extends({\n            points: points,\n            layout: layout\n        }, offset);\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Line;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_8_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_react_smooth__), __WEBPACK_IMPORTED_MODULE_9__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_10__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_11__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_12__component_LabelList__ = __webpack_require__(47), __WEBPACK_IMPORTED_MODULE_13__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_15__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Area = Object(__WEBPACK_IMPORTED_MODULE_13__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Area() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Area);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Area.__proto__ || Object.getPrototypeOf(Area)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isAnimationFinished: !0\n            }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.k)(\"recharts-area-\"), \n            _this.cachePrevData = function(points, baseLine) {\n                _this.setState({\n                    prevPoints: points,\n                    prevBaseLine: baseLine\n                });\n            }, _this.handleAnimationEnd = function() {\n                var onAnimationEnd = _this.props.onAnimationEnd;\n                _this.setState({\n                    isAnimationFinished: !0\n                }), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(onAnimationEnd) && onAnimationEnd();\n            }, _this.handleAnimationStart = function() {\n                var onAnimationStart = _this.props.onAnimationStart;\n                _this.setState({\n                    isAnimationFinished: !1\n                }), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(onAnimationStart) && onAnimationStart();\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Area, _Component), _createClass(Area, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, animationId = _props.animationId, points = _props.points, baseLine = _props.baseLine;\n                nextProps.animationId !== animationId && this.cachePrevData(points, baseLine);\n            }\n        }, {\n            key: \"renderDots\",\n            value: function() {\n                var _this2 = this;\n                if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;\n                var _props2 = this.props, dot = _props2.dot, points = _props2.points, dataKey = _props2.dataKey, areaProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), customDotProps = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(dot), dotEvents = Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.e)(dot), dots = points.map(function(entry, i) {\n                    var dotProps = _extends({\n                        key: \"dot-\" + i,\n                        r: 3\n                    }, areaProps, customDotProps, dotEvents, {\n                        dataKey: dataKey,\n                        cx: entry.x,\n                        cy: entry.y,\n                        index: i,\n                        value: entry.value,\n                        payload: entry.payload\n                    });\n                    return _this2.constructor.renderDotItem(dot, dotProps);\n                });\n                return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {\n                    className: \"recharts-area-dots\"\n                }, dots);\n            }\n        }, {\n            key: \"renderHorizontalRect\",\n            value: function(alpha) {\n                var _props3 = this.props, baseLine = _props3.baseLine, points = _props3.points, strokeWidth = _props3.strokeWidth, startX = points[0].x, endX = points[points.length - 1].x, width = alpha * Math.abs(startX - endX), maxY = Math.max.apply(null, points.map(function(entry) {\n                    return entry.y || 0;\n                }));\n                return Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.h)(baseLine) ? maxY = Math.max(baseLine, maxY) : baseLine && __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(baseLine) && baseLine.length && (maxY = Math.max(Math.max.apply(null, baseLine.map(function(entry) {\n                    return entry.y || 0;\n                })), maxY)), Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.h)(maxY) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"rect\", {\n                    x: startX < endX ? startX : startX - width,\n                    y: 0,\n                    width: width,\n                    height: maxY + (strokeWidth || 1)\n                }) : null;\n            }\n        }, {\n            key: \"renderVerticalRect\",\n            value: function(alpha) {\n                var _props4 = this.props, baseLine = _props4.baseLine, points = _props4.points, strokeWidth = _props4.strokeWidth, startY = points[0].y, endY = points[points.length - 1].y, height = alpha * Math.abs(startY - endY), maxX = Math.max.apply(null, points.map(function(entry) {\n                    return entry.x || 0;\n                }));\n                return Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.h)(baseLine) ? maxX = Math.max(baseLine, maxX) : baseLine && __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(baseLine) && baseLine.length && (maxX = Math.max(Math.max.apply(null, baseLine.map(function(entry) {\n                    return entry.x || 0;\n                })), maxX)), Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.h)(maxX) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"rect\", {\n                    x: 0,\n                    y: startY < endY ? startY : startY - height,\n                    width: maxX + (strokeWidth || 1),\n                    height: height\n                }) : null;\n            }\n        }, {\n            key: \"renderClipRect\",\n            value: function(alpha) {\n                return \"vertical\" === this.props.layout ? this.renderVerticalRect(alpha) : this.renderHorizontalRect(alpha);\n            }\n        }, {\n            key: \"renderAreaStatically\",\n            value: function(points, baseLine, needClip) {\n                var _props5 = this.props, layout = _props5.layout, type = _props5.type, stroke = _props5.stroke, connectNulls = _props5.connectNulls, isRange = _props5.isRange;\n                return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {\n                    clipPath: needClip ? \"url(#clipPath-\" + this.id + \")\" : null\n                }, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Curve__.a, _extends({}, this.props, {\n                    points: points,\n                    baseLine: baseLine,\n                    stroke: \"none\",\n                    className: \"recharts-area-area\"\n                })), \"none\" !== stroke && __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Curve__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), {\n                    className: \"recharts-area-curve\",\n                    layout: layout,\n                    type: type,\n                    connectNulls: connectNulls,\n                    fill: \"none\",\n                    points: points\n                })), \"none\" !== stroke && isRange && __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__shape_Curve__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.k)(this.props), {\n                    className: \"recharts-area-curve\",\n                    layout: layout,\n                    type: type,\n                    connectNulls: connectNulls,\n                    fill: \"none\",\n                    points: baseLine\n                })));\n            }\n        }, {\n            key: \"renderAreaWithAnimation\",\n            value: function(needClip) {\n                var _this3 = this, _props6 = this.props, points = _props6.points, baseLine = _props6.baseLine, isAnimationActive = _props6.isAnimationActive, animationBegin = _props6.animationBegin, animationDuration = _props6.animationDuration, animationEasing = _props6.animationEasing, animationId = _props6.animationId, id = _props6.id, _state = this.state, prevPoints = _state.prevPoints, prevBaseLine = _state.prevBaseLine, clipPathId = __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(id) ? this.id : id;\n                return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8_react_smooth___default.a, {\n                    begin: animationBegin,\n                    duration: animationDuration,\n                    isActive: isAnimationActive,\n                    easing: animationEasing,\n                    from: {\n                        t: 0\n                    },\n                    to: {\n                        t: 1\n                    },\n                    key: \"area-\" + animationId,\n                    onAnimationEnd: this.handleAnimationEnd,\n                    onAnimationStart: this.handleAnimationStart\n                }, function(_ref2) {\n                    var t = _ref2.t;\n                    if (prevPoints) {\n                        var stepPoints = points.map(function(entry, index) {\n                            if (prevPoints[index]) {\n                                var prev = prevPoints[index], interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.f)(prev.x, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.f)(prev.y, entry.y);\n                                return _extends({}, entry, {\n                                    x: interpolatorX(t),\n                                    y: interpolatorY(t)\n                                });\n                            }\n                            return entry;\n                        }), stepBaseLine = void 0;\n                        if (Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.h)(baseLine)) {\n                            stepBaseLine = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.f)(prevBaseLine, baseLine)(t);\n                        } else if (__WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(baseLine) || __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default()(baseLine)) {\n                            var _interpolator = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.f)(prevBaseLine, 0);\n                            stepBaseLine = _interpolator(t);\n                        } else stepBaseLine = baseLine.map(function(entry, index) {\n                            if (prevBaseLine[index]) {\n                                var prev = prevBaseLine[index], interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.f)(prev.x, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.f)(prev.y, entry.y);\n                                return _extends({}, entry, {\n                                    x: interpolatorX(t),\n                                    y: interpolatorY(t)\n                                });\n                            }\n                            return entry;\n                        });\n                        return _this3.renderAreaStatically(stepPoints, stepBaseLine, needClip);\n                    }\n                    return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, null, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"defs\", null, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"clipPath\", {\n                        id: \"animationClipPath-\" + clipPathId\n                    }, _this3.renderClipRect(t))), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {\n                        clipPath: \"url(#animationClipPath-\" + clipPathId + \")\"\n                    }, _this3.renderAreaStatically(points, baseLine, needClip)));\n                });\n            }\n        }, {\n            key: \"renderArea\",\n            value: function(needClip) {\n                var _props7 = this.props, points = _props7.points, baseLine = _props7.baseLine, isAnimationActive = _props7.isAnimationActive, _state2 = this.state, prevPoints = _state2.prevPoints, prevBaseLine = _state2.prevBaseLine, totalLength = _state2.totalLength;\n                return isAnimationActive && points && points.length && (!prevPoints && totalLength > 0 || !__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points) || !__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevBaseLine, baseLine)) ? this.renderAreaWithAnimation(needClip) : this.renderAreaStatically(points, baseLine, needClip);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props8 = this.props, hide = _props8.hide, dot = _props8.dot, points = _props8.points, className = _props8.className, top = _props8.top, left = _props8.left, xAxis = _props8.xAxis, yAxis = _props8.yAxis, width = _props8.width, height = _props8.height, isAnimationActive = _props8.isAnimationActive, id = _props8.id;\n                if (hide || !points || !points.length) return null;\n                var isAnimationFinished = this.state.isAnimationFinished, hasSinglePoint = 1 === points.length, layerClass = __WEBPACK_IMPORTED_MODULE_7_classnames___default()(\"recharts-area\", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(id) ? this.id : id;\n                return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__container_Layer__.a, {\n                    className: layerClass\n                }, needClip ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"defs\", null, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"clipPath\", {\n                    id: \"clipPath-\" + clipPathId\n                }, __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(\"rect\", {\n                    x: left,\n                    y: top,\n                    width: width,\n                    height: height\n                }))) : null, hasSinglePoint ? null : this.renderArea(needClip), (dot || hasSinglePoint) && this.renderDots(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_12__component_LabelList__.a.renderCallByParent(this.props, points));\n            }\n        } ]), Area;\n    }(__WEBPACK_IMPORTED_MODULE_5_react__.Component), _class2.displayName = \"Area\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.a, {\n        className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string,\n        dataKey: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ]).isRequired,\n        type: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"basis\", \"basisClosed\", \"basisOpen\", \"linear\", \"linearClosed\", \"natural\", \"monotoneX\", \"monotoneY\", \"monotone\", \"step\", \"stepBefore\", \"stepAfter\" ]), __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ]),\n        unit: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),\n        name: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),\n        xAxisId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]),\n        yAxis: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,\n        xAxis: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object,\n        stackId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]),\n        legendType: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.b),\n        connectNulls: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n        activeDot: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool ]),\n        dot: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool ]),\n        label: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool ]),\n        hide: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n        layout: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"horizontal\", \"vertical\" ]),\n        baseLine: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ]),\n        isRange: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n        points: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n            value: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ])\n        })),\n        onAnimationStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        onAnimationEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func,\n        animationId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ]),\n        id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string\n    }), _class2.defaultProps = {\n        stroke: \"#3182bd\",\n        fill: \"#3182bd\",\n        fillOpacity: .6,\n        xAxisId: 0,\n        yAxisId: 0,\n        legendType: \"line\",\n        connectNulls: !1,\n        points: [],\n        dot: !1,\n        activeDot: !0,\n        hide: !1,\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_14__util_ReactUtils__.n)(),\n        animationBegin: 0,\n        animationDuration: 1500,\n        animationEasing: \"ease\"\n    }, _class2.getBaseValue = function(props, xAxis, yAxis) {\n        var layout = props.layout, baseValue = props.baseValue;\n        if (Object(__WEBPACK_IMPORTED_MODULE_15__util_DataUtils__.h)(baseValue)) return baseValue;\n        var numericAxis = \"horizontal\" === layout ? yAxis : xAxis, domain = numericAxis.scale.domain();\n        if (\"number\" === numericAxis.type) {\n            var max = Math.max(domain[0], domain[1]), min = Math.min(domain[0], domain[1]);\n            return \"dataMin\" === baseValue ? min : \"dataMax\" === baseValue ? max : max < 0 ? max : Math.max(Math.min(domain[0], domain[1]), 0);\n        }\n        return \"dataMin\" === baseValue ? domain[0] : \"dataMax\" === baseValue ? domain[1] : domain[0];\n    }, _class2.getComposedData = function(_ref3) {\n        var props = _ref3.props, xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, xAxisTicks = _ref3.xAxisTicks, yAxisTicks = _ref3.yAxisTicks, bandSize = _ref3.bandSize, dataKey = _ref3.dataKey, stackedData = _ref3.stackedData, dataStartIndex = _ref3.dataStartIndex, displayedData = _ref3.displayedData, offset = _ref3.offset, layout = props.layout, hasStack = stackedData && stackedData.length, baseValue = Area.getBaseValue(props, xAxis, yAxis), isRange = !1, points = displayedData.map(function(entry, index) {\n            var value = void 0;\n            return hasStack ? value = stackedData[dataStartIndex + index] : (value = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.w)(entry, dataKey), \n            __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(value) ? isRange = !0 : value = [ baseValue, value ]), \n            \"horizontal\" === layout ? {\n                x: Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.l)({\n                    axis: xAxis,\n                    ticks: xAxisTicks,\n                    bandSize: bandSize,\n                    entry: entry,\n                    index: index\n                }),\n                y: __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(value[1]) ? null : yAxis.scale(value[1]),\n                value: value,\n                payload: entry\n            } : {\n                x: __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(value[1]) ? null : xAxis.scale(value[1]),\n                y: Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.l)({\n                    axis: yAxis,\n                    ticks: yAxisTicks,\n                    bandSize: bandSize,\n                    entry: entry,\n                    index: index\n                }),\n                value: value,\n                payload: entry\n            };\n        }), baseLine = void 0;\n        return baseLine = hasStack || isRange ? points.map(function(entry) {\n            return {\n                x: \"horizontal\" === layout ? entry.x : xAxis.scale(entry && entry.value[0]),\n                y: \"horizontal\" === layout ? yAxis.scale(entry && entry.value[0]) : entry.y\n            };\n        }) : \"horizontal\" === layout ? yAxis.scale(baseValue) : xAxis.scale(baseValue), \n        _extends({\n            points: points,\n            baseLine: baseLine,\n            layout: layout,\n            isRange: isRange\n        }, offset);\n    }, _class2.renderDotItem = function(option, props) {\n        return __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Dot__.a, _extends({}, props, {\n            className: \"recharts-area-dot\"\n        }));\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Area;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_1_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_3_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_3_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_4_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_4_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react__), __WEBPACK_IMPORTED_MODULE_5_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_5_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_prop_types__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_7_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_react_smooth__), __WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__ = __webpack_require__(70), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__ErrorBar__ = __webpack_require__(95), __WEBPACK_IMPORTED_MODULE_11__component_Cell__ = __webpack_require__(88), __WEBPACK_IMPORTED_MODULE_12__component_LabelList__ = __webpack_require__(47), __WEBPACK_IMPORTED_MODULE_13__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_14__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Bar = Object(__WEBPACK_IMPORTED_MODULE_13__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Bar() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Bar);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Bar.__proto__ || Object.getPrototypeOf(Bar)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isAnimationFinished: !1\n            }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.k)(\"recharts-bar-\"), \n            _this.cachePrevData = function(data) {\n                _this.setState({\n                    prevData: data\n                });\n            }, _this.handleAnimationEnd = function() {\n                _this.setState({\n                    isAnimationFinished: !0\n                }), _this.props.onAnimationEnd();\n            }, _this.handleAnimationStart = function() {\n                _this.setState({\n                    isAnimationFinished: !1\n                }), _this.props.onAnimationStart();\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Bar, _Component), _createClass(Bar, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, animationId = _props.animationId, data = _props.data;\n                nextProps.animationId !== animationId && this.cachePrevData(data);\n            }\n        }, {\n            key: \"renderRectangle\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__.a, props);\n            }\n        }, {\n            key: \"renderRectanglesStatically\",\n            value: function(data) {\n                var _this2 = this, shape = this.props.shape, baseProps = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.k)(this.props);\n                return data && data.map(function(entry, i) {\n                    var props = _extends({}, baseProps, entry, {\n                        index: i\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, _extends({\n                        className: \"recharts-bar-rectangle\"\n                    }, Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.f)(_this2.props, entry, i), {\n                        key: \"rectangle-\" + i\n                    }), _this2.renderRectangle(shape, props));\n                });\n            }\n        }, {\n            key: \"renderRectanglesWithAnimation\",\n            value: function() {\n                var _this3 = this, _props2 = this.props, data = _props2.data, layout = _props2.layout, isAnimationActive = _props2.isAnimationActive, animationBegin = _props2.animationBegin, animationDuration = _props2.animationDuration, animationEasing = _props2.animationEasing, animationId = _props2.animationId, prevData = (_props2.width, \n                this.state.prevData);\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7_react_smooth___default.a, {\n                    begin: animationBegin,\n                    duration: animationDuration,\n                    isActive: isAnimationActive,\n                    easing: animationEasing,\n                    from: {\n                        t: 0\n                    },\n                    to: {\n                        t: 1\n                    },\n                    key: \"bar-\" + animationId,\n                    onAnimationEnd: this.handleAnimationEnd,\n                    onAnimationStart: this.handleAnimationStart\n                }, function(_ref2) {\n                    var t = _ref2.t, stepData = data.map(function(entry, index) {\n                        var prev = prevData && prevData[index];\n                        if (prev) {\n                            var interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.f)(prev.x, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.f)(prev.y, entry.y), interpolatorWidth = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.f)(prev.width, entry.width), interpolatorHeight = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.f)(prev.height, entry.height);\n                            return _extends({}, entry, {\n                                x: interpolatorX(t),\n                                y: interpolatorY(t),\n                                width: interpolatorWidth(t),\n                                height: interpolatorHeight(t)\n                            });\n                        }\n                        if (\"horizontal\" === layout) {\n                            var _interpolatorHeight = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.f)(0, entry.height), h = _interpolatorHeight(t);\n                            return _extends({}, entry, {\n                                y: entry.y + entry.height - h,\n                                height: h\n                            });\n                        }\n                        var interpolator = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.f)(0, entry.width), w = interpolator(t);\n                        return _extends({}, entry, {\n                            width: w\n                        });\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, null, _this3.renderRectanglesStatically(stepData));\n                });\n            }\n        }, {\n            key: \"renderRectangles\",\n            value: function() {\n                var _props3 = this.props, data = _props3.data, isAnimationActive = _props3.isAnimationActive, prevData = this.state.prevData;\n                return !(isAnimationActive && data && data.length) || prevData && __WEBPACK_IMPORTED_MODULE_1_lodash_isEqual___default()(prevData, data) ? this.renderRectanglesStatically(data) : this.renderRectanglesWithAnimation();\n            }\n        }, {\n            key: \"renderBackground\",\n            value: function(sectors) {\n                var _this4 = this, data = this.props.data, backgroundProps = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.k)(this.props.background);\n                return data.map(function(entry, i) {\n                    var background = (entry.value, entry.background), rest = _objectWithoutProperties(entry, [ \"value\", \"background\" ]);\n                    if (!background) return null;\n                    var props = _extends({}, rest, {\n                        fill: \"#eee\"\n                    }, background, backgroundProps, Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.f)(_this4.props, entry, i), {\n                        index: i,\n                        key: \"background-bar-\" + i,\n                        className: \"recharts-bar-background-rectangle\"\n                    });\n                    return _this4.renderRectangle(background, props);\n                });\n            }\n        }, {\n            key: \"renderErrorBar\",\n            value: function() {\n                function dataPointFormatter(dataPoint, dataKey) {\n                    return {\n                        x: dataPoint.x,\n                        y: dataPoint.y,\n                        value: dataPoint.value,\n                        errorVal: Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.w)(dataPoint, dataKey)\n                    };\n                }\n                if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;\n                var _props4 = this.props, data = _props4.data, xAxis = _props4.xAxis, yAxis = _props4.yAxis, layout = _props4.layout, children = _props4.children, errorBarItems = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_10__ErrorBar__.a);\n                if (!errorBarItems) return null;\n                var offset = \"vertical\" === layout ? data[0].height / 2 : data[0].width / 2;\n                return errorBarItems.map(function(item, i) {\n                    return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(item, {\n                        key: i,\n                        data: data,\n                        xAxis: xAxis,\n                        yAxis: yAxis,\n                        layout: layout,\n                        offset: offset,\n                        dataPointFormatter: dataPointFormatter\n                    });\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props5 = this.props, hide = _props5.hide, data = _props5.data, className = _props5.className, xAxis = _props5.xAxis, yAxis = _props5.yAxis, left = _props5.left, top = _props5.top, width = _props5.width, height = _props5.height, isAnimationActive = _props5.isAnimationActive, background = _props5.background, id = _props5.id;\n                if (hide || !data || !data.length) return null;\n                var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_6_classnames___default()(\"recharts-bar\", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(id) ? this.id : id;\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {\n                    className: layerClass\n                }, needClip ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(\"defs\", null, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(\"clipPath\", {\n                    id: \"clipPath-\" + clipPathId\n                }, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(\"rect\", {\n                    x: left,\n                    y: top,\n                    width: width,\n                    height: height\n                }))) : null, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {\n                    className: \"recharts-bar-rectangles\",\n                    clipPath: needClip ? \"url(#clipPath-\" + clipPathId + \")\" : null\n                }, background ? this.renderBackground() : null, this.renderRectangles()), this.renderErrorBar(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_12__component_LabelList__.a.renderCallByParent(this.props, data));\n            }\n        } ]), Bar;\n    }(__WEBPACK_IMPORTED_MODULE_4_react__.Component), _class2.displayName = \"Bar\", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.a, {\n        className: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string,\n        layout: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf([ \"vertical\", \"horizontal\" ]),\n        xAxisId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        yAxis: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object,\n        xAxis: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object,\n        stackId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        barSize: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        unit: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number ]),\n        name: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number ]),\n        dataKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]).isRequired,\n        legendType: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.b),\n        minPointSize: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        maxBarSize: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        hide: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,\n        shape: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element ]),\n        data: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n            width: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n            height: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n            radius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.array ]),\n            value: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.array ])\n        })),\n        onAnimationStart: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func,\n        onAnimationEnd: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func,\n        animationId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ]),\n        id: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string\n    }), _class2.defaultProps = {\n        xAxisId: 0,\n        yAxisId: 0,\n        legendType: \"rect\",\n        minPointSize: 0,\n        hide: !1,\n        data: [],\n        layout: \"vertical\",\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.n)(),\n        animationBegin: 0,\n        animationDuration: 400,\n        animationEasing: \"ease\",\n        onAnimationStart: function() {},\n        onAnimationEnd: function() {}\n    }, _class2.getComposedData = function(_ref3) {\n        var props = _ref3.props, item = _ref3.item, barPosition = _ref3.barPosition, bandSize = _ref3.bandSize, xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, xAxisTicks = _ref3.xAxisTicks, yAxisTicks = _ref3.yAxisTicks, stackedData = _ref3.stackedData, dataStartIndex = _ref3.dataStartIndex, displayedData = _ref3.displayedData, offset = _ref3.offset, pos = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.f)(barPosition, item);\n        if (!pos) return [];\n        var layout = props.layout, _item$props = item.props, dataKey = _item$props.dataKey, children = _item$props.children, minPointSize = _item$props.minPointSize, numericAxis = \"horizontal\" === layout ? yAxis : xAxis, stackedDomain = stackedData ? numericAxis.scale.domain() : null, baseValue = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.j)({\n            props: props,\n            numericAxis: numericAxis\n        }), cells = Object(__WEBPACK_IMPORTED_MODULE_15__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_11__component_Cell__.a), rects = displayedData.map(function(entry, index) {\n            var value = void 0, x = void 0, y = void 0, width = void 0, height = void 0, background = void 0;\n            if (stackedData ? value = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.C)(stackedData[dataStartIndex + index], stackedDomain) : (value = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.w)(entry, dataKey), \n            __WEBPACK_IMPORTED_MODULE_3_lodash_isArray___default()(value) || (value = [ baseValue, value ])), \n            \"horizontal\" === layout) {\n                if (x = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.k)({\n                    axis: xAxis,\n                    ticks: xAxisTicks,\n                    bandSize: bandSize,\n                    offset: pos.offset,\n                    entry: entry,\n                    index: index\n                }), y = yAxis.scale(value[1]), width = pos.size, height = yAxis.scale(value[0]) - yAxis.scale(value[1]), \n                background = {\n                    x: x,\n                    y: yAxis.y,\n                    width: width,\n                    height: yAxis.height\n                }, Math.abs(minPointSize) > 0 && Math.abs(height) < Math.abs(minPointSize)) {\n                    var delta = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.j)(height || minPointSize) * (Math.abs(minPointSize) - Math.abs(height));\n                    y -= delta, height += delta;\n                }\n            } else if (x = xAxis.scale(value[0]), y = Object(__WEBPACK_IMPORTED_MODULE_16__util_ChartUtils__.k)({\n                axis: yAxis,\n                ticks: yAxisTicks,\n                bandSize: bandSize,\n                offset: pos.offset,\n                entry: entry,\n                index: index\n            }), width = xAxis.scale(value[1]) - xAxis.scale(value[0]), height = pos.size, background = {\n                x: xAxis.x,\n                y: y,\n                width: xAxis.width,\n                height: height\n            }, Math.abs(minPointSize) > 0 && Math.abs(width) < Math.abs(minPointSize)) {\n                var _delta = Object(__WEBPACK_IMPORTED_MODULE_14__util_DataUtils__.j)(width || minPointSize) * (Math.abs(minPointSize) - Math.abs(width));\n                width += _delta;\n            }\n            return _extends({}, entry, {\n                x: x,\n                y: y,\n                width: width,\n                height: height,\n                value: stackedData ? value : value[1],\n                payload: entry,\n                background: background\n            }, cells && cells[index] && cells[index].props);\n        });\n        return _extends({\n            data: rects,\n            layout: layout\n        }, offset);\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Bar;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_5_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react_smooth__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__component_LabelList__ = __webpack_require__(47), __WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_11__ZAxis__ = __webpack_require__(142), __WEBPACK_IMPORTED_MODULE_12__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_13__shape_Symbols__ = __webpack_require__(181), __WEBPACK_IMPORTED_MODULE_14__ErrorBar__ = __webpack_require__(95), __WEBPACK_IMPORTED_MODULE_15__component_Cell__ = __webpack_require__(88), __WEBPACK_IMPORTED_MODULE_16__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Scatter = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Scatter() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Scatter);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Scatter.__proto__ || Object.getPrototypeOf(Scatter)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isAnimationFinished: !1\n            }, _this.cachePrevPoints = function(points) {\n                _this.setState({\n                    prevPoints: points\n                });\n            }, _this.handleAnimationEnd = function() {\n                _this.setState({\n                    isAnimationFinished: !0\n                });\n            }, _this.handleAnimationStart = function() {\n                _this.setState({\n                    isAnimationFinished: !1\n                });\n            }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.k)(\"recharts-scatter-\"), \n            _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Scatter, _Component), _createClass(Scatter, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, animationId = _props.animationId, points = _props.points;\n                nextProps.animationId !== animationId && this.cachePrevPoints(points);\n            }\n        }, {\n            key: \"renderSymbolItem\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__shape_Symbols__.a, _extends({}, props, {\n                    type: option\n                }));\n            }\n        }, {\n            key: \"renderSymbolsStatically\",\n            value: function(points) {\n                var _this2 = this, _props2 = this.props, shape = _props2.shape, activeShape = _props2.activeShape, activeIndex = _props2.activeIndex, baseProps = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.k)(this.props);\n                return points.map(function(entry, i) {\n                    var props = _extends({\n                        key: \"symbol-\" + i\n                    }, baseProps, entry);\n                    return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({\n                        className: \"recharts-scatter-symbol\"\n                    }, Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.f)(_this2.props, entry, i), {\n                        key: \"symbol-\" + i\n                    }), _this2.renderSymbolItem(activeIndex === i ? activeShape : shape, props));\n                });\n            }\n        }, {\n            key: \"renderSymbolsWithAnimation\",\n            value: function() {\n                var _this3 = this, _props3 = this.props, points = _props3.points, isAnimationActive = _props3.isAnimationActive, animationBegin = _props3.animationBegin, animationDuration = _props3.animationDuration, animationEasing = _props3.animationEasing, animationId = _props3.animationId, prevPoints = this.state.prevPoints;\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5_react_smooth___default.a, {\n                    begin: animationBegin,\n                    duration: animationDuration,\n                    isActive: isAnimationActive,\n                    easing: animationEasing,\n                    from: {\n                        t: 0\n                    },\n                    to: {\n                        t: 1\n                    },\n                    key: \"pie-\" + animationId,\n                    onAnimationEnd: this.handleAnimationEnd,\n                    onAnimationStart: this.handleAnimationStart\n                }, function(_ref2) {\n                    var t = _ref2.t, stepData = points.map(function(entry, index) {\n                        var prev = prevPoints && prevPoints[index];\n                        if (prev) {\n                            var interpolatorCx = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.f)(prev.cx, entry.cx), interpolatorCy = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.f)(prev.cy, entry.cy), interpolatorSize = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.f)(prev.size, entry.size);\n                            return _extends({}, entry, {\n                                cx: interpolatorCx(t),\n                                cy: interpolatorCy(t),\n                                size: interpolatorSize(t)\n                            });\n                        }\n                        var interpolator = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.f)(0, entry.size);\n                        return _extends({}, entry, {\n                            size: interpolator(t)\n                        });\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, null, _this3.renderSymbolsStatically(stepData));\n                });\n            }\n        }, {\n            key: \"renderSymbols\",\n            value: function() {\n                var _props4 = this.props, points = _props4.points, isAnimationActive = _props4.isAnimationActive, prevPoints = this.state.prevPoints;\n                return !(isAnimationActive && points && points.length) || prevPoints && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points) ? this.renderSymbolsStatically(points) : this.renderSymbolsWithAnimation();\n            }\n        }, {\n            key: \"renderErrorBar\",\n            value: function() {\n                function dataPointFormatterY(dataPoint, dataKey) {\n                    return {\n                        x: dataPoint.cx,\n                        y: dataPoint.cy,\n                        value: dataPoint.y,\n                        errorVal: Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.w)(dataPoint, dataKey)\n                    };\n                }\n                function dataPointFormatterX(dataPoint, dataKey) {\n                    return {\n                        x: dataPoint.cx,\n                        y: dataPoint.cy,\n                        value: dataPoint.x,\n                        errorVal: Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.w)(dataPoint, dataKey)\n                    };\n                }\n                if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;\n                var _props5 = this.props, points = _props5.points, xAxis = _props5.xAxis, yAxis = _props5.yAxis, children = _props5.children, errorBarItems = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_14__ErrorBar__.a);\n                return errorBarItems ? errorBarItems.map(function(item, i) {\n                    var direction = item.props.direction;\n                    return __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(item, {\n                        key: i,\n                        data: points,\n                        xAxis: xAxis,\n                        yAxis: yAxis,\n                        layout: \"x\" === direction ? \"vertical\" : \"horizontal\",\n                        dataPointFormatter: \"x\" === direction ? dataPointFormatterX : dataPointFormatterY\n                    });\n                }) : null;\n            }\n        }, {\n            key: \"renderLine\",\n            value: function() {\n                var _props6 = this.props, points = _props6.points, line = _props6.line, lineType = _props6.lineType, lineJointType = _props6.lineJointType, scatterProps = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.k)(this.props), customLineProps = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.k)(line), linePoints = void 0, lineItem = void 0;\n                if (\"joint\" === lineType) linePoints = points.map(function(entry) {\n                    return {\n                        x: entry.cx,\n                        y: entry.cy\n                    };\n                }); else if (\"fitting\" === lineType) {\n                    var _getLinearRegression = Object(__WEBPACK_IMPORTED_MODULE_16__util_DataUtils__.c)(points), xmin = _getLinearRegression.xmin, xmax = _getLinearRegression.xmax, a = _getLinearRegression.a, b = _getLinearRegression.b, linearExp = function(x) {\n                        return a * x + b;\n                    };\n                    linePoints = [ {\n                        x: xmin,\n                        y: linearExp(xmin)\n                    }, {\n                        x: xmax,\n                        y: linearExp(xmax)\n                    } ];\n                }\n                var lineProps = _extends({}, scatterProps, {\n                    fill: \"none\",\n                    stroke: scatterProps && scatterProps.fill\n                }, customLineProps, {\n                    points: linePoints\n                });\n                return lineItem = __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(line) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(line, lineProps) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(line) ? line(lineProps) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a, _extends({}, lineProps, {\n                    type: lineJointType\n                })), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-scatter-line\",\n                    key: \"recharts-scatter-line\"\n                }, lineItem);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props7 = this.props, hide = _props7.hide, points = _props7.points, line = _props7.line, className = _props7.className, xAxis = _props7.xAxis, yAxis = _props7.yAxis, left = _props7.left, top = _props7.top, width = _props7.width, height = _props7.height, id = _props7.id;\n                if (hide || !points || !points.length) return null;\n                var _state = this.state, isAnimationActive = _state.isAnimationActive, isAnimationFinished = _state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_6_classnames___default()(\"recharts-scatter\", className), needClip = xAxis && xAxis.allowDataOverflow || yAxis && yAxis.allowDataOverflow, clipPathId = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? this.id : id;\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: layerClass,\n                    clipPath: needClip ? \"url(#clipPath-\" + clipPathId + \")\" : null\n                }, needClip ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"defs\", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"clipPath\", {\n                    id: \"clipPath-\" + clipPathId\n                }, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(\"rect\", {\n                    x: left,\n                    y: top,\n                    width: width,\n                    height: height\n                }))) : null, line && this.renderLine(), this.renderErrorBar(), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    key: \"recharts-scatter-symbols\"\n                }, this.renderSymbols()), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_9__component_LabelList__.a.renderCallByParent(this.props, points));\n            }\n        } ]), Scatter;\n    }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = \"Scatter\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.a, __WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.c, {\n        xAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        zAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        line: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),\n        lineType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"fitting\", \"joint\" ]),\n        lineJointType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"basis\", \"basisClosed\", \"basisOpen\", \"linear\", \"linearClosed\", \"natural\", \"monotoneX\", \"monotoneY\", \"monotone\", \"step\", \"stepBefore\", \"stepAfter\" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),\n        legendType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.b),\n        className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,\n        name: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        activeIndex: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        activeShape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),\n        shape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"circle\", \"cross\", \"diamond\", \"square\", \"star\", \"triangle\", \"wye\" ]), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]),\n        points: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({\n            cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            size: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            node: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({\n                x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),\n                y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),\n                z: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ])\n            }),\n            payload: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.any\n        })),\n        hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        animationId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ])\n    }), _class2.defaultProps = {\n        xAxisId: 0,\n        yAxisId: 0,\n        zAxisId: 0,\n        legendType: \"circle\",\n        lineType: \"joint\",\n        lineJointType: \"linear\",\n        data: [],\n        shape: \"circle\",\n        hide: !1,\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.n)(),\n        animationBegin: 0,\n        animationDuration: 400,\n        animationEasing: \"linear\"\n    }, _class2.getComposedData = function(_ref3) {\n        var xAxis = _ref3.xAxis, yAxis = _ref3.yAxis, zAxis = _ref3.zAxis, item = _ref3.item, displayedData = _ref3.displayedData, onItemMouseLeave = _ref3.onItemMouseLeave, onItemMouseEnter = _ref3.onItemMouseEnter, offset = _ref3.offset, xAxisTicks = _ref3.xAxisTicks, cells = Object(__WEBPACK_IMPORTED_MODULE_10__util_ReactUtils__.h)(item.props.children, __WEBPACK_IMPORTED_MODULE_15__component_Cell__.a), xAxisDataKey = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(xAxis.dataKey) ? item.props.dataKey : xAxis.dataKey, yAxisDataKey = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(yAxis.dataKey) ? item.props.dataKey : yAxis.dataKey, zAxisDataKey = zAxis && zAxis.dataKey, defaultRangeZ = zAxis ? zAxis.range : __WEBPACK_IMPORTED_MODULE_11__ZAxis__.a.defaultProps.range, defaultZ = defaultRangeZ && defaultRangeZ[0], xBandSize = xAxis.scale.bandwidth ? xAxis.scale.bandwidth() : 0, yBandSize = yAxis.scale.bandwidth ? yAxis.scale.bandwidth() : 0, points = displayedData.map(function(entry, index) {\n            var x = entry[xAxisDataKey], y = entry[yAxisDataKey], z = !__WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(zAxisDataKey) && entry[zAxisDataKey] || \"-\", tooltipPayload = [ {\n                name: xAxis.name || xAxis.dataKey,\n                unit: xAxis.unit || \"\",\n                value: x,\n                payload: entry\n            }, {\n                name: yAxis.name || yAxis.dataKey,\n                unit: yAxis.unit || \"\",\n                value: y,\n                payload: entry\n            } ];\n            \"-\" !== z && tooltipPayload.push({\n                name: zAxis.name || zAxis.dataKey,\n                unit: zAxis.unit || \"\",\n                value: z,\n                payload: entry\n            });\n            var cx = Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.l)({\n                axis: xAxis,\n                ticks: xAxisTicks,\n                bandSize: xBandSize,\n                entry: entry,\n                index: index\n            }), cy = Object(__WEBPACK_IMPORTED_MODULE_17__util_ChartUtils__.l)({\n                axis: yAxis,\n                ticks: xAxisTicks,\n                bandSize: yBandSize,\n                entry: entry,\n                index: index\n            }), size = \"-\" !== z ? zAxis.scale(z) : defaultZ, radius = Math.sqrt(Math.max(size, 0) / Math.PI);\n            return _extends({}, entry, {\n                cx: cx,\n                cy: cy,\n                x: cx - radius,\n                y: cy - radius,\n                xAxis: xAxis,\n                yAxis: yAxis,\n                zAxis: zAxis,\n                width: 2 * radius,\n                height: 2 * radius,\n                size: size,\n                node: {\n                    x: x,\n                    y: y,\n                    z: z\n                },\n                tooltipPayload: tooltipPayload,\n                tooltipPosition: {\n                    x: cx,\n                    y: cy\n                },\n                payload: entry\n            }, cells && cells[index] && cells[index].props);\n        });\n        return _extends({\n            onMouseLeave: onItemMouseLeave,\n            onMouseEnter: onItemMouseEnter,\n            points: points\n        }, offset);\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Scatter;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var canUseDOM = !(\"undefined\" == typeof window || !window.document || !window.document.createElement), ExecutionEnvironment = {\n        canUseDOM: canUseDOM,\n        canUseWorkers: \"undefined\" != typeof Worker,\n        canUseEventListeners: canUseDOM && !(!window.addEventListener && !window.attachEvent),\n        canUseViewport: canUseDOM && !!window.screen,\n        isInWorker: !canUseDOM\n    };\n    module.exports = ExecutionEnvironment;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function getActiveElement(doc) {\n        if (void 0 === (doc = doc || (\"undefined\" != typeof document ? document : void 0))) return null;\n        try {\n            return doc.activeElement || doc.body;\n        } catch (e) {\n            return doc.body;\n        }\n    }\n    module.exports = getActiveElement;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function containsNode(outerNode, innerNode) {\n        return !(!outerNode || !innerNode) && (outerNode === innerNode || !isTextNode(outerNode) && (isTextNode(innerNode) ? containsNode(outerNode, innerNode.parentNode) : \"contains\" in outerNode ? outerNode.contains(innerNode) : !!outerNode.compareDocumentPosition && !!(16 & outerNode.compareDocumentPosition(innerNode))));\n    }\n    var isTextNode = __webpack_require__(379);\n    module.exports = containsNode;\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(387),\n        __esModule: !0\n    };\n}, function(module, exports) {\n    module.exports = function(it) {\n        if (\"function\" != typeof it) throw TypeError(it + \" is not a function!\");\n        return it;\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = !__webpack_require__(25) && !__webpack_require__(53)(function() {\n        return 7 != Object.defineProperty(__webpack_require__(225)(\"div\"), \"a\", {\n            get: function() {\n                return 7;\n            }\n        }).a;\n    });\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(35), document = __webpack_require__(24).document, is = isObject(document) && isObject(document.createElement);\n    module.exports = function(it) {\n        return is ? document.createElement(it) : {};\n    };\n}, function(module, exports, __webpack_require__) {\n    var has = __webpack_require__(54), toIObject = __webpack_require__(64), arrayIndexOf = __webpack_require__(390)(!1), IE_PROTO = __webpack_require__(150)(\"IE_PROTO\");\n    module.exports = function(object, names) {\n        var key, O = toIObject(object), i = 0, result = [];\n        for (key in O) key != IE_PROTO && has(O, key) && result.push(key);\n        for (;names.length > i; ) has(O, key = names[i++]) && (~arrayIndexOf(result, key) || result.push(key));\n        return result;\n    };\n}, function(module, exports, __webpack_require__) {\n    var has = __webpack_require__(54), toObject = __webpack_require__(65), IE_PROTO = __webpack_require__(150)(\"IE_PROTO\"), ObjectProto = Object.prototype;\n    module.exports = Object.getPrototypeOf || function(O) {\n        return O = toObject(O), has(O, IE_PROTO) ? O[IE_PROTO] : \"function\" == typeof O.constructor && O instanceof O.constructor ? O.constructor.prototype : O instanceof Object ? ObjectProto : null;\n    };\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19), core = __webpack_require__(17), fails = __webpack_require__(53);\n    module.exports = function(KEY, exec) {\n        var fn = (core.Object || {})[KEY] || Object[KEY], exp = {};\n        exp[KEY] = exec(fn), $export($export.S + $export.F * fails(function() {\n            fn(1);\n        }), \"Object\", exp);\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = __webpack_require__(39);\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(402);\n    for (var global = __webpack_require__(24), hide = __webpack_require__(39), Iterators = __webpack_require__(77), TO_STRING_TAG = __webpack_require__(21)(\"toStringTag\"), DOMIterables = \"CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList\".split(\",\"), i = 0; i < DOMIterables.length; i++) {\n        var NAME = DOMIterables[i], Collection = global[NAME], proto = Collection && Collection.prototype;\n        proto && !proto[TO_STRING_TAG] && hide(proto, TO_STRING_TAG, NAME), Iterators[NAME] = Iterators.Array;\n    }\n}, function(module, exports) {\n    module.exports = function(done, value) {\n        return {\n            value: value,\n            done: !!done\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    var cof = __webpack_require__(147);\n    module.exports = Array.isArray || function(arg) {\n        return \"Array\" == cof(arg);\n    };\n}, function(module, exports, __webpack_require__) {\n    var $keys = __webpack_require__(226), hiddenKeys = __webpack_require__(152).concat(\"length\", \"prototype\");\n    exports.f = Object.getOwnPropertyNames || function(O) {\n        return $keys(O, hiddenKeys);\n    };\n}, function(module, exports, __webpack_require__) {\n    var pIE = __webpack_require__(104), createDesc = __webpack_require__(75), toIObject = __webpack_require__(64), toPrimitive = __webpack_require__(145), has = __webpack_require__(54), IE8_DOM_DEFINE = __webpack_require__(224), gOPD = Object.getOwnPropertyDescriptor;\n    exports.f = __webpack_require__(25) ? gOPD : function(O, P) {\n        if (O = toIObject(O), P = toPrimitive(P, !0), IE8_DOM_DEFINE) try {\n            return gOPD(O, P);\n        } catch (e) {}\n        if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n    };\n}, function(module, exports) {}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function exactProp(propTypes, componentNameInError) {\n        return (0, _extends4.default)({}, propTypes, (0, _defineProperty3.default)({}, specialProperty, function(props) {\n            var unknownProps = (0, _keys2.default)(props).filter(function(prop) {\n                return !propTypes.hasOwnProperty(prop);\n            });\n            return unknownProps.length > 0 ? new TypeError(componentNameInError + \": unknown props found: \" + unknownProps.join(\", \") + \". Please remove the unknown properties.\") : null;\n        }));\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.specialProperty = void 0;\n    var _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _extends3 = __webpack_require__(6), _extends4 = _interopRequireDefault(_extends3);\n    exports.default = exactProp;\n    var specialProperty = exports.specialProperty = \"exact-prop: ​\";\n}, function(module, exports, __webpack_require__) {\n    var hide = __webpack_require__(39);\n    module.exports = function(target, src, safe) {\n        for (var key in src) safe && target[key] ? target[key] = src[key] : hide(target, key, src[key]);\n        return target;\n    };\n}, function(module, exports) {\n    module.exports = function(it, Constructor, name, forbiddenField) {\n        if (!(it instanceof Constructor) || void 0 !== forbiddenField && forbiddenField in it) throw TypeError(name + \": incorrect invocation!\");\n        return it;\n    };\n}, function(module, exports, __webpack_require__) {\n    var anObject = __webpack_require__(52);\n    module.exports = function(iterator, fn, value, entries) {\n        try {\n            return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n        } catch (e) {\n            var ret = iterator.return;\n            throw void 0 !== ret && anObject(ret.call(iterator)), e;\n        }\n    };\n}, function(module, exports, __webpack_require__) {\n    var Iterators = __webpack_require__(77), ITERATOR = __webpack_require__(21)(\"iterator\"), ArrayProto = Array.prototype;\n    module.exports = function(it) {\n        return void 0 !== it && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n    };\n}, function(module, exports, __webpack_require__) {\n    var classof = __webpack_require__(242), ITERATOR = __webpack_require__(21)(\"iterator\"), Iterators = __webpack_require__(77);\n    module.exports = __webpack_require__(17).getIteratorMethod = function(it) {\n        if (void 0 != it) return it[ITERATOR] || it[\"@@iterator\"] || Iterators[classof(it)];\n    };\n}, function(module, exports, __webpack_require__) {\n    var cof = __webpack_require__(147), TAG = __webpack_require__(21)(\"toStringTag\"), ARG = \"Arguments\" == cof(function() {\n        return arguments;\n    }()), tryGet = function(it, key) {\n        try {\n            return it[key];\n        } catch (e) {}\n    };\n    module.exports = function(it) {\n        var O, T, B;\n        return void 0 === it ? \"Undefined\" : null === it ? \"Null\" : \"string\" == typeof (T = tryGet(O = Object(it), TAG)) ? T : ARG ? cof(O) : \"Object\" == (B = cof(O)) && \"function\" == typeof O.callee ? \"Arguments\" : B;\n    };\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(35);\n    module.exports = function(it, TYPE) {\n        if (!isObject(it) || it._t !== TYPE) throw TypeError(\"Incompatible receiver, \" + TYPE + \" required!\");\n        return it;\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var getDisplayName = function(Component) {\n        if (\"string\" == typeof Component) return Component;\n        if (Component) return Component.displayName || Component.name || \"Component\";\n    };\n    exports.default = getDisplayName;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    exports.jss = \"64a55d578f856d258dc345b094a2a2b3\", exports.sheetsRegistry = \"d4bd0baacbc52bbd48bbb9eb24344ecd\", \n    exports.managers = \"b768b78919504fba9de2c03545c5cd3a\", exports.sheetOptions = \"6fc570d6bd61383819d0f9e7407c452d\";\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.create = exports.createGenerateClassName = exports.sheets = exports.RuleList = exports.SheetsManager = exports.SheetsRegistry = exports.toCssValue = exports.getDynamicStyles = void 0;\n    var _getDynamicStyles = __webpack_require__(461);\n    Object.defineProperty(exports, \"getDynamicStyles\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_getDynamicStyles).default;\n        }\n    });\n    var _toCssValue = __webpack_require__(110);\n    Object.defineProperty(exports, \"toCssValue\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_toCssValue).default;\n        }\n    });\n    var _SheetsRegistry = __webpack_require__(247);\n    Object.defineProperty(exports, \"SheetsRegistry\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_SheetsRegistry).default;\n        }\n    });\n    var _SheetsManager = __webpack_require__(462);\n    Object.defineProperty(exports, \"SheetsManager\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_SheetsManager).default;\n        }\n    });\n    var _RuleList = __webpack_require__(80);\n    Object.defineProperty(exports, \"RuleList\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_RuleList).default;\n        }\n    });\n    var _sheets = __webpack_require__(164);\n    Object.defineProperty(exports, \"sheets\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_sheets).default;\n        }\n    });\n    var _createGenerateClassName = __webpack_require__(250);\n    Object.defineProperty(exports, \"createGenerateClassName\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_createGenerateClassName).default;\n        }\n    });\n    var _Jss = __webpack_require__(469), _Jss2 = _interopRequireDefault(_Jss), create = exports.create = function(options) {\n        return new _Jss2.default(options);\n    };\n    exports.default = create();\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), SheetsRegistry = function() {\n        function SheetsRegistry() {\n            _classCallCheck(this, SheetsRegistry), this.registry = [];\n        }\n        return _createClass(SheetsRegistry, [ {\n            key: \"add\",\n            value: function(sheet) {\n                var registry = this.registry, index = sheet.options.index;\n                if (-1 === registry.indexOf(sheet)) {\n                    if (0 === registry.length || index >= this.index) return void registry.push(sheet);\n                    for (var i = 0; i < registry.length; i++) if (registry[i].options.index > index) return void registry.splice(i, 0, sheet);\n                }\n            }\n        }, {\n            key: \"reset\",\n            value: function() {\n                this.registry = [];\n            }\n        }, {\n            key: \"remove\",\n            value: function(sheet) {\n                var index = this.registry.indexOf(sheet);\n                this.registry.splice(index, 1);\n            }\n        }, {\n            key: \"toString\",\n            value: function(options) {\n                return this.registry.filter(function(sheet) {\n                    return sheet.attached;\n                }).map(function(sheet) {\n                    return sheet.toString(options);\n                }).join(\"\\n\");\n            }\n        }, {\n            key: \"index\",\n            get: function() {\n                return 0 === this.registry.length ? 0 : this.registry[this.registry.length - 1].options.index;\n            }\n        } ]), SheetsRegistry;\n    }();\n    exports.default = SheetsRegistry;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _symbolObservable = __webpack_require__(464), _symbolObservable2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_symbolObservable);\n    exports.default = function(value) {\n        return value && value[_symbolObservable2.default] && value === value[_symbolObservable2.default]();\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function linkRule(rule, cssRule) {\n        rule.renderable = cssRule, rule.rules && cssRule.cssRules && rule.rules.link(cssRule.cssRules);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = linkRule;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _StyleSheet = __webpack_require__(251), _moduleId = (_interopRequireDefault(_StyleSheet), \n        __webpack_require__(468)), _moduleId2 = _interopRequireDefault(_moduleId), env = process.env.NODE_ENV;\n        exports.default = function() {\n            var ruleCounter = 0, defaultPrefix = \"production\" === env ? \"c\" : \"\";\n            return function(rule, sheet) {\n                (ruleCounter += 1) > 1e10 && (0, _warning2.default)(!1, \"[JSS] You might have a memory leak. Rule counter is at %s.\", ruleCounter);\n                var prefix = defaultPrefix, jssId = \"\";\n                return sheet && (prefix = sheet.options.classNamePrefix || defaultPrefix, null != sheet.options.jss.id && (jssId += sheet.options.jss.id)), \n                \"production\" === env ? \"\" + prefix + _moduleId2.default + jssId + ruleCounter : prefix + rule.key + \"-\" + _moduleId2.default + (jssId && \"-\" + jssId) + \"-\" + ruleCounter;\n            };\n        };\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _linkRule = __webpack_require__(249), _linkRule2 = _interopRequireDefault(_linkRule), _RuleList = __webpack_require__(80), _RuleList2 = _interopRequireDefault(_RuleList), StyleSheet = function() {\n        function StyleSheet(styles, options) {\n            _classCallCheck(this, StyleSheet), this.attached = !1, this.deployed = !1, this.linked = !1, \n            this.classes = {}, this.options = _extends({}, options, {\n                sheet: this,\n                parent: this,\n                classes: this.classes\n            }), this.renderer = new options.Renderer(this), this.rules = new _RuleList2.default(this.options);\n            for (var name in styles) this.rules.add(name, styles[name]);\n            this.rules.process();\n        }\n        return _createClass(StyleSheet, [ {\n            key: \"attach\",\n            value: function() {\n                return this.attached ? this : (this.deployed || this.deploy(), this.renderer.attach(), \n                !this.linked && this.options.link && this.link(), this.attached = !0, this);\n            }\n        }, {\n            key: \"detach\",\n            value: function() {\n                return this.attached ? (this.renderer.detach(), this.attached = !1, this) : this;\n            }\n        }, {\n            key: \"addRule\",\n            value: function(name, decl, options) {\n                var queue = this.queue;\n                this.attached && !queue && (this.queue = []);\n                var rule = this.rules.add(name, decl, options);\n                return this.options.jss.plugins.onProcessRule(rule), this.attached ? this.deployed ? (queue ? queue.push(rule) : (this.insertRule(rule), \n                this.queue && (this.queue.forEach(this.insertRule, this), this.queue = void 0)), \n                rule) : rule : (this.deployed = !1, rule);\n            }\n        }, {\n            key: \"insertRule\",\n            value: function(rule) {\n                var renderable = this.renderer.insertRule(rule);\n                renderable && this.options.link && (0, _linkRule2.default)(rule, renderable);\n            }\n        }, {\n            key: \"addRules\",\n            value: function(styles, options) {\n                var added = [];\n                for (var name in styles) added.push(this.addRule(name, styles[name], options));\n                return added;\n            }\n        }, {\n            key: \"getRule\",\n            value: function(name) {\n                return this.rules.get(name);\n            }\n        }, {\n            key: \"deleteRule\",\n            value: function(name) {\n                var rule = this.rules.get(name);\n                return !!rule && (this.rules.remove(rule), !this.attached || !rule.renderable || this.renderer.deleteRule(rule.renderable));\n            }\n        }, {\n            key: \"indexOf\",\n            value: function(rule) {\n                return this.rules.indexOf(rule);\n            }\n        }, {\n            key: \"deploy\",\n            value: function() {\n                return this.renderer.deploy(), this.deployed = !0, this;\n            }\n        }, {\n            key: \"link\",\n            value: function() {\n                var cssRules = this.renderer.getRules();\n                return cssRules && this.rules.link(cssRules), this.linked = !0, this;\n            }\n        }, {\n            key: \"update\",\n            value: function(name, data) {\n                return this.rules.update(name, data), this;\n            }\n        }, {\n            key: \"toString\",\n            value: function(options) {\n                return this.rules.toString(options);\n            }\n        } ]), StyleSheet;\n    }();\n    exports.default = StyleSheet;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _ButtonBase = __webpack_require__(505);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_ButtonBase).default;\n        }\n    });\n}, function(module, exports) {\n    exports = module.exports = function(searchInput) {\n        if (searchInput && \"object\" == typeof searchInput) {\n            var hasKeyCode = searchInput.which || searchInput.keyCode || searchInput.charCode;\n            hasKeyCode && (searchInput = hasKeyCode);\n        }\n        if (\"number\" == typeof searchInput) return names[searchInput];\n        var search = String(searchInput), foundNamedKey = codes[search.toLowerCase()];\n        if (foundNamedKey) return foundNamedKey;\n        var foundNamedKey = aliases[search.toLowerCase()];\n        return foundNamedKey || (1 === search.length ? search.charCodeAt(0) : void 0);\n    };\n    var codes = exports.code = exports.codes = {\n        backspace: 8,\n        tab: 9,\n        enter: 13,\n        shift: 16,\n        ctrl: 17,\n        alt: 18,\n        \"pause/break\": 19,\n        \"caps lock\": 20,\n        esc: 27,\n        space: 32,\n        \"page up\": 33,\n        \"page down\": 34,\n        end: 35,\n        home: 36,\n        left: 37,\n        up: 38,\n        right: 39,\n        down: 40,\n        insert: 45,\n        delete: 46,\n        command: 91,\n        \"left command\": 91,\n        \"right command\": 93,\n        \"numpad *\": 106,\n        \"numpad +\": 107,\n        \"numpad -\": 109,\n        \"numpad .\": 110,\n        \"numpad /\": 111,\n        \"num lock\": 144,\n        \"scroll lock\": 145,\n        \"my computer\": 182,\n        \"my calculator\": 183,\n        \";\": 186,\n        \"=\": 187,\n        \",\": 188,\n        \"-\": 189,\n        \".\": 190,\n        \"/\": 191,\n        \"` + \"`\"))) + ((`\": 192,\n        \"[\": 219,\n        \"\\\\\": 220,\n        \"]\": 221,\n        \"'\": 222\n    }, aliases = exports.aliases = {\n        windows: 91,\n        \"⇧\": 16,\n        \"⌥\": 18,\n        \"⌃\": 17,\n        \"⌘\": 91,\n        ctl: 17,\n        control: 17,\n        option: 18,\n        pause: 19,\n        break: 19,\n        caps: 20,\n        return: 13,\n        escape: 27,\n        spc: 32,\n        pgup: 33,\n        pgdn: 34,\n        ins: 45,\n        del: 46,\n        cmd: 91\n    };\n    for (i = 97; i < 123; i++) codes[String.fromCharCode(i)] = i - 32;\n    for (var i = 48; i < 58; i++) codes[i - 48] = i;\n    for (i = 1; i < 13; i++) codes[\"f\" + i] = i + 111;\n    for (i = 0; i < 10; i++) codes[\"numpad \" + i] = i + 96;\n    var names = exports.names = exports.title = {};\n    for (i in codes) names[codes[i]] = i;\n    for (var alias in aliases) codes[alias] = aliases[alias];\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function ownerDocument(node) {\n        return node && node.ownerDocument || document;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = ownerDocument, module.exports = exports.default;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function _objectWithoutProperties(obj, keys) {\n            var target = {};\n            for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n            return target;\n        }\n        function _classCallCheck(instance, Constructor) {\n            if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n        }\n        function _possibleConstructorReturn(self, call) {\n            if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n            return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n        }\n        function _inherits(subClass, superClass) {\n            if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n            subClass.prototype = Object.create(superClass && superClass.prototype, {\n                constructor: {\n                    value: subClass,\n                    enumerable: !1,\n                    writable: !0,\n                    configurable: !0\n                }\n            }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n        }\n        exports.__esModule = !0;\n        var _extends = Object.assign || function(target) {\n            for (var i = 1; i < arguments.length; i++) {\n                var source = arguments[i];\n                for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n            }\n            return target;\n        }, _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _ChildMapping = __webpack_require__(517), values = Object.values || function(obj) {\n            return Object.keys(obj).map(function(k) {\n                return obj[k];\n            });\n        }, propTypes = {\n            component: _propTypes2.default.any,\n            children: _propTypes2.default.node,\n            appear: _propTypes2.default.bool,\n            enter: _propTypes2.default.bool,\n            exit: _propTypes2.default.bool,\n            childFactory: _propTypes2.default.func\n        }, defaultProps = {\n            component: \"div\",\n            childFactory: function(child) {\n                return child;\n            }\n        }, TransitionGroup = function(_React$Component) {\n            function TransitionGroup(props, context) {\n                _classCallCheck(this, TransitionGroup);\n                var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));\n                return _this.handleExited = function(key, node, originalHandler) {\n                    var currentChildMapping = (0, _ChildMapping.getChildMapping)(_this.props.children);\n                    key in currentChildMapping || (originalHandler && originalHandler(node), _this.setState(function(state) {\n                        var children = _extends({}, state.children);\n                        return delete children[key], {\n                            children: children\n                        };\n                    }));\n                }, _this.state = {\n                    children: (0, _ChildMapping.getChildMapping)(props.children, function(child) {\n                        var onExited = function(node) {\n                            _this.handleExited(child.key, node, child.props.onExited);\n                        };\n                        return (0, _react.cloneElement)(child, {\n                            onExited: onExited,\n                            in: !0,\n                            appear: _this.getProp(child, \"appear\"),\n                            enter: _this.getProp(child, \"enter\"),\n                            exit: _this.getProp(child, \"exit\")\n                        });\n                    })\n                }, _this;\n            }\n            return _inherits(TransitionGroup, _React$Component), TransitionGroup.prototype.getChildContext = function() {\n                return {\n                    transitionGroup: {\n                        isMounting: !this.appeared\n                    }\n                };\n            }, TransitionGroup.prototype.getProp = function(child, prop) {\n                var props = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : this.props;\n                return null != props[prop] ? props[prop] : child.props[prop];\n            }, TransitionGroup.prototype.componentDidMount = function() {\n                this.appeared = !0;\n            }, TransitionGroup.prototype.componentWillReceiveProps = function(nextProps) {\n                var _this2 = this, prevChildMapping = this.state.children, nextChildMapping = (0, \n                _ChildMapping.getChildMapping)(nextProps.children), children = (0, _ChildMapping.mergeChildMappings)(prevChildMapping, nextChildMapping);\n                Object.keys(children).forEach(function(key) {\n                    var child = children[key];\n                    if ((0, _react.isValidElement)(child)) {\n                        var onExited = function(node) {\n                            _this2.handleExited(child.key, node, child.props.onExited);\n                        }, hasPrev = key in prevChildMapping, hasNext = key in nextChildMapping, prevChild = prevChildMapping[key], isLeaving = (0, \n                        _react.isValidElement)(prevChild) && !prevChild.props.in;\n                        !hasNext || hasPrev && !isLeaving ? hasNext || !hasPrev || isLeaving ? hasNext && hasPrev && (0, \n                        _react.isValidElement)(prevChild) && (children[key] = (0, _react.cloneElement)(child, {\n                            onExited: onExited,\n                            in: prevChild.props.in,\n                            exit: _this2.getProp(child, \"exit\", nextProps),\n                            enter: _this2.getProp(child, \"enter\", nextProps)\n                        })) : children[key] = (0, _react.cloneElement)(child, {\n                            in: !1\n                        }) : children[key] = (0, _react.cloneElement)(child, {\n                            onExited: onExited,\n                            in: !0,\n                            exit: _this2.getProp(child, \"exit\", nextProps),\n                            enter: _this2.getProp(child, \"enter\", nextProps)\n                        });\n                    }\n                }), this.setState({\n                    children: children\n                });\n            }, TransitionGroup.prototype.render = function() {\n                var _props = this.props, Component = _props.component, childFactory = _props.childFactory, props = _objectWithoutProperties(_props, [ \"component\", \"childFactory\" ]), children = this.state.children;\n                return delete props.appear, delete props.enter, delete props.exit, _react2.default.createElement(Component, props, values(children).map(childFactory));\n            }, TransitionGroup;\n        }(_react2.default.Component);\n        TransitionGroup.childContextTypes = {\n            transitionGroup: _propTypes2.default.object.isRequired\n        }, TransitionGroup.propTypes = \"production\" !== process.env.NODE_ENV ? propTypes : {}, \n        TransitionGroup.defaultProps = defaultProps, exports.default = TransitionGroup, \n        module.exports = exports.default;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function cloneChildrenWithClassName(children, className) {\n        return _react2.default.Children.map(children, function(child) {\n            return _react2.default.isValidElement(child) && _react2.default.cloneElement(child, {\n                className: (0, _classnames2.default)(child.props.className, className)\n            });\n        });\n    }\n    function isMuiElement(element, muiNames) {\n        return _react2.default.isValidElement(element) && -1 !== muiNames.indexOf(element.type.muiName);\n    }\n    function isMuiComponent(element, muiNames) {\n        return -1 !== muiNames.indexOf(element.muiName);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.cloneChildrenWithClassName = cloneChildrenWithClassName, exports.isMuiElement = isMuiElement, \n    exports.isMuiComponent = isMuiComponent;\n    var _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _SvgIcon = __webpack_require__(521);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_SvgIcon).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _Icon = __webpack_require__(522);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_Icon).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _setStatic = __webpack_require__(526), _setStatic2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_setStatic), setDisplayName = function(displayName) {\n        return (0, _setStatic2.default)(\"displayName\", displayName);\n    };\n    exports.default = setDisplayName;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _List = __webpack_require__(531);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_List).default;\n        }\n    });\n    var _ListItem = __webpack_require__(532);\n    Object.defineProperty(exports, \"ListItem\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_ListItem).default;\n        }\n    });\n    var _ListItemAvatar = __webpack_require__(533);\n    Object.defineProperty(exports, \"ListItemAvatar\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_ListItemAvatar).default;\n        }\n    });\n    var _ListItemText = __webpack_require__(534);\n    Object.defineProperty(exports, \"ListItemText\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_ListItemText).default;\n        }\n    });\n    var _ListItemIcon = __webpack_require__(535);\n    Object.defineProperty(exports, \"ListItemIcon\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_ListItemIcon).default;\n        }\n    });\n    var _ListItemSecondaryAction = __webpack_require__(536);\n    Object.defineProperty(exports, \"ListItemSecondaryAction\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_ListItemSecondaryAction).default;\n        }\n    });\n    var _ListSubheader = __webpack_require__(537);\n    Object.defineProperty(exports, \"ListSubheader\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_ListSubheader).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.inserter = void 0;\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _List = __webpack_require__(260), _List2 = _interopRequireDefault(_List), _escapeHtml = __webpack_require__(550), _escapeHtml2 = _interopRequireDefault(_escapeHtml), requestBand = .05, fieldPadding = new Map(), createChunk = function(records) {\n        var content = \"\";\n        return records.forEach(function(record) {\n            var t = record.t, ctx = record.ctx, lvl = record.lvl, msg = record.msg, color = \"#ce3c23\";\n            switch (lvl) {\n              case \"trace\":\n              case \"trce\":\n                lvl = \"TRACE\", color = \"#3465a4\";\n                break;\n\n              case \"debug\":\n              case \"dbug\":\n                lvl = \"DEBUG\", color = \"#3d989b\";\n                break;\n\n              case \"info\":\n                lvl = \"INFO&nbsp;\", color = \"#4c8f0f\";\n                break;\n\n              case \"warn\":\n                lvl = \"WARN&nbsp;\", color = \"#b79a22\";\n                break;\n\n              case \"error\":\n              case \"eror\":\n                lvl = \"ERROR\", color = \"#754b70\";\n                break;\n\n              case \"crit\":\n                lvl = \"CRIT&nbsp;\", color = \"#ce3c23\";\n                break;\n\n              default:\n                lvl = \"\";\n            }\n            var time = new Date(t);\n            if (\"\" === lvl || !(time instanceof Date) || isNaN(time) || \"string\" != typeof msg || !Array.isArray(ctx)) return void (content += '<span style=\"color:#ce3c23\">Invalid log record</span><br />');\n            ctx.length > 0 && (msg += \"&nbsp;\".repeat(Math.max(40 - msg.length, 0)));\n            var month = (\"0\" + (time.getMonth() + 1)).slice(-2), date = (\"0\" + time.getDate()).slice(-2), hours = (\"0\" + time.getHours()).slice(-2), minutes = (\"0\" + time.getMinutes()).slice(-2), seconds = (\"0\" + time.getSeconds()).slice(-2);\n            content += '<span style=\"color:' + color + '\">' + lvl + \"</span>[\" + month + \"-\" + date + \"|\" + hours + \":\" + minutes + \":\" + seconds + \"] \" + msg;\n            for (var i = 0; i < ctx.length; i += 2) {\n                var key = (0, _escapeHtml2.default)(ctx[i]), val = (0, _escapeHtml2.default)(ctx[i + 1]), padding = fieldPadding.get(key);\n                (\"number\" != typeof padding || padding < val.length) && (padding = val.length, fieldPadding.set(key, padding));\n                var p = \"\";\n                i < ctx.length - 2 && (p = \"&nbsp;\".repeat(padding - val.length)), content += ' <span style=\"color:' + color + '\">' + key + \"</span>=\" + val + p;\n            }\n            content += \"<br />\";\n        }), content;\n    }, ADDED = 1, REMOVED = -1, styles = (exports.inserter = function(limit) {\n        return function(update, prev) {\n            if (prev.topChanged = 0, prev.bottomChanged = 0, !Array.isArray(update.chunk) || update.chunk.length < 1) return prev;\n            Array.isArray(prev.chunks) || (prev.chunks = []);\n            var content = createChunk(update.chunk);\n            if (!update.source) return prev.endBottom ? prev.chunks.length < 1 ? [ {\n                content: content,\n                name: \"00000000000000.log\"\n            } ] : (prev.chunks[prev.chunks.length - 1].content += content, prev.bottomChanged = ADDED, \n            prev) : prev;\n            var chunk = {\n                content: content,\n                name: update.source.name\n            };\n            return prev.chunks.length > 0 && update.source.name < prev.chunks[0].name ? (update.source.last && (prev.endTop = !0), \n            prev.chunks.length >= limit && (prev.endBottom = !1, prev.chunks.splice(limit - 1, prev.chunks.length - limit + 1), \n            prev.bottomChanged = REMOVED), prev.chunks = [ chunk ].concat(_toConsumableArray(prev.chunks)), \n            prev.topChanged = ADDED, prev) : (update.source.last && (prev.endBottom = !0), prev.chunks.length >= limit && (prev.endTop = !1, \n            prev.chunks.splice(0, prev.chunks.length - limit + 1), prev.topChanged = REMOVED), \n            prev.chunks = [].concat(_toConsumableArray(prev.chunks), [ chunk ]), prev.bottomChanged = ADDED, \n            prev);\n        };\n    }, {\n        logListItem: {\n            padding: 0,\n            lineHeight: 1.231\n        },\n        logChunk: {\n            color: \"white\",\n            fontFamily: \"monospace\",\n            whiteSpace: \"nowrap\",\n            width: 0\n        },\n        waitMsg: {\n            textAlign: \"center\",\n            color: \"white\",\n            fontFamily: \"monospace\"\n        }\n    }), Logs = function(_Component) {\n        function Logs(props) {\n            _classCallCheck(this, Logs);\n            var _this = _possibleConstructorReturn(this, (Logs.__proto__ || Object.getPrototypeOf(Logs)).call(this, props));\n            return _this.onScroll = function() {\n                if (_this.state.requestAllowed && void 0 !== _this.content) {\n                    var logs = _this.props.content.logs;\n                    logs.chunks.length < 1 || (_this.atTop() && !logs.endTop ? _this.sendRequest(logs.chunks[0].name, !0) : _this.atBottom() && !logs.endBottom && _this.sendRequest(logs.chunks[logs.chunks.length - 1].name, !1));\n                }\n            }, _this.sendRequest = function(name, past) {\n                _this.setState({\n                    requestAllowed: !1\n                }), _this.props.send(JSON.stringify({\n                    Logs: {\n                        Name: name,\n                        Past: past\n                    }\n                }));\n            }, _this.atTop = function() {\n                return _this.props.container.scrollTop <= _this.props.container.scrollHeight * requestBand;\n            }, _this.atBottom = function() {\n                var container = _this.props.container;\n                return container.scrollHeight - container.scrollTop <= container.clientHeight + container.scrollHeight * requestBand;\n            }, _this.beforeUpdate = function() {\n                var firstHeight = 0, chunkList = _this.content.children[1];\n                return chunkList && chunkList.children[0] && (firstHeight = chunkList.children[0].clientHeight), \n                {\n                    scrollTop: _this.props.container.scrollTop,\n                    firstHeight: firstHeight\n                };\n            }, _this.didUpdate = function(prevProps, prevState, snapshot) {\n                if (void 0 !== _this.props.shouldUpdate.logs && void 0 !== _this.content && null !== snapshot) {\n                    var logs = _this.props.content.logs, container = _this.props.container;\n                    if (!(void 0 === container || logs.chunks.length < 1)) {\n                        if (_this.content.clientHeight < container.clientHeight) return void (logs.endTop || _this.sendRequest(logs.chunks[0].name, !0));\n                        var scrollTop = snapshot.scrollTop;\n                        logs.topChanged === ADDED ? scrollTop += _this.content.children[1].children[0].clientHeight : logs.bottomChanged === ADDED && (logs.topChanged === REMOVED ? scrollTop -= snapshot.firstHeight : _this.atBottom() && logs.endBottom && (scrollTop = container.scrollHeight - container.clientHeight)), \n                        container.scrollTop = scrollTop, _this.setState({\n                            requestAllowed: !0\n                        });\n                    }\n                }\n            }, _this.content = _react2.default.createRef(), _this.state = {\n                requestAllowed: !0\n            }, _this;\n        }\n        return _inherits(Logs, _Component), _createClass(Logs, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                var container = this.props.container;\n                if (void 0 !== container) {\n                    container.scrollTop = container.scrollHeight - container.clientHeight;\n                    var logs = this.props.content.logs;\n                    void 0 === this.content || logs.chunks.length < 1 || this.content.clientHeight < container.clientHeight && !logs.endTop && this.sendRequest(logs.chunks[0].name, !0);\n                }\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this;\n                return _react2.default.createElement(\"div\", {\n                    ref: function(_ref) {\n                        _this2.content = _ref;\n                    }\n                }, _react2.default.createElement(\"div\", {\n                    style: styles.waitMsg\n                }, this.props.content.logs.endTop ? \"No more logs.\" : \"Waiting for server...\"), _react2.default.createElement(_List2.default, null, this.props.content.logs.chunks.map(function(c, index) {\n                    return _react2.default.createElement(_List.ListItem, {\n                        style: styles.logListItem,\n                        key: index\n                    }, _react2.default.createElement(\"div\", {\n                        style: styles.logChunk,\n                        dangerouslySetInnerHTML: {\n                            __html: c.content\n                        }\n                    }));\n                })), this.props.content.logs.endBottom || _react2.default.createElement(\"div\", {\n                    style: styles.waitMsg\n                }, \"Waiting for server...\"));\n            }\n        } ]), Logs;\n    }(_react.Component);\n    exports.default = Logs;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _Grid = __webpack_require__(552);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_Grid).default;\n        }\n    });\n}, function(module, exports) {\n    function isObject(value) {\n        var type = typeof value;\n        return null != value && (\"object\" == type || \"function\" == type);\n    }\n    module.exports = isObject;\n}, function(module, exports, __webpack_require__) {\n    var freeGlobal = __webpack_require__(562), freeSelf = \"object\" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function(\"return this\")();\n    module.exports = root;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(264), Symbol = root.Symbol;\n    module.exports = Symbol;\n}, function(module, exports, __webpack_require__) {\n    var dP = __webpack_require__(575), createDesc = __webpack_require__(580);\n    module.exports = __webpack_require__(170) ? function(object, key, value) {\n        return dP.f(object, key, createDesc(1, value));\n    } : function(object, key, value) {\n        return object[key] = value, object;\n    };\n}, function(module, exports) {\n    module.exports = Math.log1p || function(x) {\n        return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n    };\n}, function(module, exports, __webpack_require__) {\n    (function(global) {\n        var freeGlobal = \"object\" == typeof global && global && global.Object === Object && global;\n        module.exports = freeGlobal;\n    }).call(exports, __webpack_require__(40));\n}, function(module, exports, __webpack_require__) {\n    function baseGet(object, path) {\n        path = castPath(path, object);\n        for (var index = 0, length = path.length; null != object && index < length; ) object = object[toKey(path[index++])];\n        return index && index == length ? object : void 0;\n    }\n    var castPath = __webpack_require__(270), toKey = __webpack_require__(119);\n    module.exports = baseGet;\n}, function(module, exports, __webpack_require__) {\n    function castPath(value, object) {\n        return isArray(value) ? value : isKey(value, object) ? [ value ] : stringToPath(toString(value));\n    }\n    var isArray = __webpack_require__(13), isKey = __webpack_require__(175), stringToPath = __webpack_require__(605), toString = __webpack_require__(629);\n    module.exports = castPath;\n}, function(module, exports) {\n    function toSource(func) {\n        if (null != func) {\n            try {\n                return funcToString.call(func);\n            } catch (e) {}\n            try {\n                return func + \"\";\n            } catch (e) {}\n        }\n        return \"\";\n    }\n    var funcProto = Function.prototype, funcToString = funcProto.toString;\n    module.exports = toSource;\n}, function(module, exports, __webpack_require__) {\n    function isNumber(value) {\n        return \"number\" == typeof value || isObjectLike(value) && baseGetTag(value) == numberTag;\n    }\n    var baseGetTag = __webpack_require__(41), isObjectLike = __webpack_require__(42), numberTag = \"[object Number]\";\n    module.exports = isNumber;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_d3_path__ = __webpack_require__(84), __WEBPACK_IMPORTED_MODULE_1__constant__ = __webpack_require__(58), __WEBPACK_IMPORTED_MODULE_2__curve_linear__ = __webpack_require__(121), __WEBPACK_IMPORTED_MODULE_3__line__ = __webpack_require__(183), __WEBPACK_IMPORTED_MODULE_4__point__ = __webpack_require__(184);\n    __webpack_exports__.a = function() {\n        function area(data) {\n            var i, j, k, d, buffer, n = data.length, defined0 = !1, x0z = new Array(n), y0z = new Array(n);\n            for (null == context && (output = curve(buffer = Object(__WEBPACK_IMPORTED_MODULE_0_d3_path__.a)())), \n            i = 0; i <= n; ++i) {\n                if (!(i < n && defined(d = data[i], i, data)) === defined0) if (defined0 = !defined0) j = i, \n                output.areaStart(), output.lineStart(); else {\n                    for (output.lineEnd(), output.lineStart(), k = i - 1; k >= j; --k) output.point(x0z[k], y0z[k]);\n                    output.lineEnd(), output.areaEnd();\n                }\n                defined0 && (x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data), output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]));\n            }\n            if (buffer) return output = null, buffer + \"\" || null;\n        }\n        function arealine() {\n            return Object(__WEBPACK_IMPORTED_MODULE_3__line__.a)().defined(defined).curve(curve).context(context);\n        }\n        var x0 = __WEBPACK_IMPORTED_MODULE_4__point__.a, x1 = null, y0 = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(0), y1 = __WEBPACK_IMPORTED_MODULE_4__point__.b, defined = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!0), context = null, curve = __WEBPACK_IMPORTED_MODULE_2__curve_linear__.a, output = null;\n        return area.x = function(_) {\n            return arguments.length ? (x0 = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            x1 = null, area) : x0;\n        }, area.x0 = function(_) {\n            return arguments.length ? (x0 = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            area) : x0;\n        }, area.x1 = function(_) {\n            return arguments.length ? (x1 = null == _ ? null : \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            area) : x1;\n        }, area.y = function(_) {\n            return arguments.length ? (y0 = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            y1 = null, area) : y0;\n        }, area.y0 = function(_) {\n            return arguments.length ? (y0 = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            area) : y0;\n        }, area.y1 = function(_) {\n            return arguments.length ? (y1 = null == _ ? null : \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            area) : y1;\n        }, area.lineX0 = area.lineY0 = function() {\n            return arealine().x(x0).y(y0);\n        }, area.lineY1 = function() {\n            return arealine().x(x0).y(y1);\n        }, area.lineX1 = function() {\n            return arealine().x(x1).y(y0);\n        }, area.defined = function(_) {\n            return arguments.length ? (defined = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(!!_), \n            area) : defined;\n        }, area.curve = function(_) {\n            return arguments.length ? (curve = _, null != context && (output = curve(context)), \n            area) : curve;\n        }, area.context = function(_) {\n            return arguments.length ? (null == _ ? context = output = null : output = curve(context = _), \n            area) : context;\n        }, area;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Radial(curve) {\n        this._curve = curve;\n    }\n    function curveRadial(curve) {\n        function radial(context) {\n            return new Radial(curve(context));\n        }\n        return radial._curve = curve, radial;\n    }\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return curveRadialLinear;\n    }), __webpack_exports__.b = curveRadial;\n    var __WEBPACK_IMPORTED_MODULE_0__linear__ = __webpack_require__(121), curveRadialLinear = curveRadial(__WEBPACK_IMPORTED_MODULE_0__linear__.a);\n    Radial.prototype = {\n        areaStart: function() {\n            this._curve.areaStart();\n        },\n        areaEnd: function() {\n            this._curve.areaEnd();\n        },\n        lineStart: function() {\n            this._curve.lineStart();\n        },\n        lineEnd: function() {\n            this._curve.lineEnd();\n        },\n        point: function(a, r) {\n            this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function lineRadial(l) {\n        var c = l.curve;\n        return l.angle = l.x, delete l.x, l.radius = l.y, delete l.y, l.curve = function(_) {\n            return arguments.length ? c(Object(__WEBPACK_IMPORTED_MODULE_0__curve_radial__.b)(_)) : c()._curve;\n        }, l;\n    }\n    __webpack_exports__.a = lineRadial;\n    var __WEBPACK_IMPORTED_MODULE_0__curve_radial__ = __webpack_require__(274);\n    __webpack_require__(183);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x, y) {\n        return [ (y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x) ];\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return slice;\n    });\n    var slice = Array.prototype.slice;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__math__ = __webpack_require__(85);\n    __webpack_exports__.a = {\n        draw: function(context, size) {\n            var r = Math.sqrt(size / __WEBPACK_IMPORTED_MODULE_0__math__.j);\n            context.moveTo(r, 0), context.arc(0, 0, r, 0, __WEBPACK_IMPORTED_MODULE_0__math__.m);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = {\n        draw: function(context, size) {\n            var r = Math.sqrt(size / 5) / 2;\n            context.moveTo(-3 * r, -r), context.lineTo(-r, -r), context.lineTo(-r, -3 * r), \n            context.lineTo(r, -3 * r), context.lineTo(r, -r), context.lineTo(3 * r, -r), context.lineTo(3 * r, r), \n            context.lineTo(r, r), context.lineTo(r, 3 * r), context.lineTo(-r, 3 * r), context.lineTo(-r, r), \n            context.lineTo(-3 * r, r), context.closePath();\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var tan30 = Math.sqrt(1 / 3), tan30_2 = 2 * tan30;\n    __webpack_exports__.a = {\n        draw: function(context, size) {\n            var y = Math.sqrt(size / tan30_2), x = y * tan30;\n            context.moveTo(0, -y), context.lineTo(x, 0), context.lineTo(0, y), context.lineTo(-x, 0), \n            context.closePath();\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__math__ = __webpack_require__(85), kr = Math.sin(__WEBPACK_IMPORTED_MODULE_0__math__.j / 10) / Math.sin(7 * __WEBPACK_IMPORTED_MODULE_0__math__.j / 10), kx = Math.sin(__WEBPACK_IMPORTED_MODULE_0__math__.m / 10) * kr, ky = -Math.cos(__WEBPACK_IMPORTED_MODULE_0__math__.m / 10) * kr;\n    __webpack_exports__.a = {\n        draw: function(context, size) {\n            var r = Math.sqrt(.8908130915292852 * size), x = kx * r, y = ky * r;\n            context.moveTo(0, -r), context.lineTo(x, y);\n            for (var i = 1; i < 5; ++i) {\n                var a = __WEBPACK_IMPORTED_MODULE_0__math__.m * i / 5, c = Math.cos(a), s = Math.sin(a);\n                context.lineTo(s * r, -c * r), context.lineTo(c * x - s * y, s * x + c * y);\n            }\n            context.closePath();\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = {\n        draw: function(context, size) {\n            var w = Math.sqrt(size), x = -w / 2;\n            context.rect(x, x, w, w);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var sqrt3 = Math.sqrt(3);\n    __webpack_exports__.a = {\n        draw: function(context, size) {\n            var y = -Math.sqrt(size / (3 * sqrt3));\n            context.moveTo(0, 2 * y), context.lineTo(-sqrt3 * y, -y), context.lineTo(sqrt3 * y, -y), \n            context.closePath();\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var c = -.5, s = Math.sqrt(3) / 2, k = 1 / Math.sqrt(12), a = 3 * (k / 2 + 1);\n    __webpack_exports__.a = {\n        draw: function(context, size) {\n            var r = Math.sqrt(size / a), x0 = r / 2, y0 = r * k, x1 = x0, y1 = r * k + r, x2 = -x1, y2 = y1;\n            context.moveTo(x0, y0), context.lineTo(x1, y1), context.lineTo(x2, y2), context.lineTo(c * x0 - s * y0, s * x0 + c * y0), \n            context.lineTo(c * x1 - s * y1, s * x1 + c * y1), context.lineTo(c * x2 - s * y2, s * x2 + c * y2), \n            context.lineTo(c * x0 + s * y0, c * y0 - s * x0), context.lineTo(c * x1 + s * y1, c * y1 - s * x1), \n            context.lineTo(c * x2 + s * y2, c * y2 - s * x2), context.closePath();\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function CardinalClosed(context, tension) {\n        this._context = context, this._k = (1 - tension) / 6;\n    }\n    __webpack_exports__.a = CardinalClosed;\n    var __WEBPACK_IMPORTED_MODULE_0__noop__ = __webpack_require__(122), __WEBPACK_IMPORTED_MODULE_1__cardinal__ = __webpack_require__(124);\n    CardinalClosed.prototype = {\n        areaStart: __WEBPACK_IMPORTED_MODULE_0__noop__.a,\n        areaEnd: __WEBPACK_IMPORTED_MODULE_0__noop__.a,\n        lineStart: function() {\n            this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, \n            this._point = 0;\n        },\n        lineEnd: function() {\n            switch (this._point) {\n              case 1:\n                this._context.moveTo(this._x3, this._y3), this._context.closePath();\n                break;\n\n              case 2:\n                this._context.lineTo(this._x3, this._y3), this._context.closePath();\n                break;\n\n              case 3:\n                this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5);\n            }\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1, this._x3 = x, this._y3 = y;\n                break;\n\n              case 1:\n                this._point = 2, this._context.moveTo(this._x4 = x, this._y4 = y);\n                break;\n\n              case 2:\n                this._point = 3, this._x5 = x, this._y5 = y;\n                break;\n\n              default:\n                Object(__WEBPACK_IMPORTED_MODULE_1__cardinal__.b)(this, x, y);\n            }\n            this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, \n            this._y2 = y;\n        }\n    };\n    !function custom(tension) {\n        function cardinal(context) {\n            return new CardinalClosed(context, tension);\n        }\n        return cardinal.tension = function(tension) {\n            return custom(+tension);\n        }, cardinal;\n    }(0);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function CardinalOpen(context, tension) {\n        this._context = context, this._k = (1 - tension) / 6;\n    }\n    __webpack_exports__.a = CardinalOpen;\n    var __WEBPACK_IMPORTED_MODULE_0__cardinal__ = __webpack_require__(124);\n    CardinalOpen.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0;\n        },\n        lineEnd: function() {\n            (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1;\n                break;\n\n              case 1:\n                this._point = 2;\n                break;\n\n              case 2:\n                this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n                break;\n\n              case 3:\n                this._point = 4;\n\n              default:\n                Object(__WEBPACK_IMPORTED_MODULE_0__cardinal__.b)(this, x, y);\n            }\n            this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, this._y0 = this._y1, this._y1 = this._y2, \n            this._y2 = y;\n        }\n    };\n    !function custom(tension) {\n        function cardinal(context) {\n            return new CardinalOpen(context, tension);\n        }\n        return cardinal.tension = function(tension) {\n            return custom(+tension);\n        }, cardinal;\n    }(0);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _class, _class2, _temp, _isEqual2 = __webpack_require__(288), _isEqual3 = _interopRequireDefault(_isEqual2), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _AnimateManager = __webpack_require__(713), _AnimateManager2 = _interopRequireDefault(_AnimateManager), _PureRender = __webpack_require__(716), _PureRender2 = _interopRequireDefault(_PureRender), _easing = __webpack_require__(305), _configUpdate = __webpack_require__(737), _configUpdate2 = _interopRequireDefault(_configUpdate), _util = __webpack_require__(132), Animate = (0, \n    _PureRender2.default)((_temp = _class2 = function(_Component) {\n        function Animate(props, context) {\n            _classCallCheck(this, Animate);\n            var _this = _possibleConstructorReturn(this, (Animate.__proto__ || Object.getPrototypeOf(Animate)).call(this, props, context)), _this$props = _this.props, isActive = _this$props.isActive, attributeName = _this$props.attributeName, from = _this$props.from, to = _this$props.to, steps = _this$props.steps, children = _this$props.children;\n            if (_this.handleStyleChange = _this.handleStyleChange.bind(_this), _this.changeStyle = _this.changeStyle.bind(_this), \n            !isActive) return _this.state = {\n                style: {}\n            }, \"function\" == typeof children && (_this.state = {\n                style: to\n            }), _possibleConstructorReturn(_this);\n            if (steps && steps.length) _this.state = {\n                style: steps[0].style\n            }; else if (from) {\n                if (\"function\" == typeof children) return _this.state = {\n                    style: from\n                }, _possibleConstructorReturn(_this);\n                _this.state = {\n                    style: attributeName ? _defineProperty({}, attributeName, from) : from\n                };\n            } else _this.state = {\n                style: {}\n            };\n            return _this;\n        }\n        return _inherits(Animate, _Component), _createClass(Animate, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                var _props = this.props, isActive = _props.isActive, canBegin = _props.canBegin;\n                this.mounted = !0, isActive && canBegin && this.runAnimation(this.props);\n            }\n        }, {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var isActive = nextProps.isActive, canBegin = nextProps.canBegin, attributeName = nextProps.attributeName, shouldReAnimate = nextProps.shouldReAnimate;\n                if (canBegin) {\n                    if (!isActive) return void this.setState({\n                        style: attributeName ? _defineProperty({}, attributeName, nextProps.to) : nextProps.to\n                    });\n                    if (!((0, _isEqual3.default)(this.props.to, nextProps.to) && this.props.canBegin && this.props.isActive)) {\n                        var isTriggered = !this.props.canBegin || !this.props.isActive;\n                        this.manager && this.manager.stop(), this.stopJSAnimation && this.stopJSAnimation();\n                        var from = isTriggered || shouldReAnimate ? nextProps.from : this.props.to;\n                        this.setState({\n                            style: attributeName ? _defineProperty({}, attributeName, from) : from\n                        }), this.runAnimation(_extends({}, nextProps, {\n                            from: from,\n                            begin: 0\n                        }));\n                    }\n                }\n            }\n        }, {\n            key: \"componentWillUnmount\",\n            value: function() {\n                this.mounted = !1, this.unSubscribe && this.unSubscribe(), this.manager && (this.manager.stop(), \n                this.manager = null), this.stopJSAnimation && this.stopJSAnimation();\n            }\n        }, {\n            key: \"runJSAnimation\",\n            value: function(props) {\n                var _this2 = this, from = props.from, to = props.to, duration = props.duration, easing = props.easing, begin = props.begin, onAnimationEnd = props.onAnimationEnd, onAnimationStart = props.onAnimationStart, startAnimation = (0, \n                _configUpdate2.default)(from, to, (0, _easing.configEasing)(easing), duration, this.changeStyle), finalStartAnimation = function() {\n                    _this2.stopJSAnimation = startAnimation();\n                };\n                this.manager.start([ onAnimationStart, begin, finalStartAnimation, duration, onAnimationEnd ]);\n            }\n        }, {\n            key: \"runStepAnimation\",\n            value: function(props) {\n                var _this3 = this, steps = props.steps, begin = props.begin, onAnimationStart = props.onAnimationStart, _steps$ = steps[0], initialStyle = _steps$.style, _steps$$duration = _steps$.duration, initialTime = void 0 === _steps$$duration ? 0 : _steps$$duration, addStyle = function(sequence, nextItem, index) {\n                    if (0 === index) return sequence;\n                    var duration = nextItem.duration, _nextItem$easing = nextItem.easing, easing = void 0 === _nextItem$easing ? \"ease\" : _nextItem$easing, style = nextItem.style, nextProperties = nextItem.properties, onAnimationEnd = nextItem.onAnimationEnd, preItem = index > 0 ? steps[index - 1] : nextItem, properties = nextProperties || Object.keys(style);\n                    if (\"function\" == typeof easing || \"spring\" === easing) return [].concat(_toConsumableArray(sequence), [ _this3.runJSAnimation.bind(_this3, {\n                        from: preItem.style,\n                        to: style,\n                        duration: duration,\n                        easing: easing\n                    }), duration ]);\n                    var transition = (0, _util.getTransitionVal)(properties, duration, easing), newStyle = _extends({}, preItem.style, style, {\n                        transition: transition\n                    });\n                    return [].concat(_toConsumableArray(sequence), [ newStyle, duration, onAnimationEnd ]).filter(_util.identity);\n                };\n                return this.manager.start([ onAnimationStart ].concat(_toConsumableArray(steps.reduce(addStyle, [ initialStyle, Math.max(initialTime, begin) ])), [ props.onAnimationEnd ]));\n            }\n        }, {\n            key: \"runAnimation\",\n            value: function(props) {\n                this.manager || (this.manager = (0, _AnimateManager2.default)());\n                var begin = props.begin, duration = props.duration, attributeName = props.attributeName, propsTo = (props.from, \n                props.to), easing = props.easing, onAnimationStart = props.onAnimationStart, onAnimationEnd = props.onAnimationEnd, steps = props.steps, children = props.children, manager = this.manager;\n                if (this.unSubscribe = manager.subscribe(this.handleStyleChange), \"function\" == typeof easing || \"function\" == typeof children || \"spring\" === easing) return void this.runJSAnimation(props);\n                if (steps.length > 1) return void this.runStepAnimation(props);\n                var to = attributeName ? _defineProperty({}, attributeName, propsTo) : propsTo, transition = (0, \n                _util.getTransitionVal)(Object.keys(to), duration, easing);\n                manager.start([ onAnimationStart, begin, _extends({}, to, {\n                    transition: transition\n                }), duration, onAnimationEnd ]);\n            }\n        }, {\n            key: \"handleStyleChange\",\n            value: function(style) {\n                this.changeStyle(style);\n            }\n        }, {\n            key: \"changeStyle\",\n            value: function(style) {\n                this.mounted && this.setState({\n                    style: style\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, children = _props2.children, isActive = (_props2.begin, \n                _props2.duration, _props2.attributeName, _props2.easing, _props2.isActive), others = (_props2.steps, \n                _props2.from, _props2.to, _props2.canBegin, _props2.onAnimationEnd, _props2.shouldReAnimate, \n                _props2.onAnimationReStart, _objectWithoutProperties(_props2, [ \"children\", \"begin\", \"duration\", \"attributeName\", \"easing\", \"isActive\", \"steps\", \"from\", \"to\", \"canBegin\", \"onAnimationEnd\", \"shouldReAnimate\", \"onAnimationReStart\" ])), count = _react.Children.count(children), stateStyle = (0, \n                _util.translateStyle)(this.state.style);\n                if (\"function\" == typeof children) return children(stateStyle);\n                if (!isActive || 0 === count) return children;\n                var cloneContainer = function(container) {\n                    var _container$props = container.props, _container$props$styl = _container$props.style, style = void 0 === _container$props$styl ? {} : _container$props$styl, className = _container$props.className;\n                    return (0, _react.cloneElement)(container, _extends({}, others, {\n                        style: _extends({}, style, stateStyle),\n                        className: className\n                    }));\n                };\n                if (1 === count) {\n                    _react.Children.only(children);\n                    return cloneContainer(_react.Children.only(children));\n                }\n                return _react2.default.createElement(\"div\", null, _react.Children.map(children, function(child) {\n                    return cloneContainer(child);\n                }));\n            }\n        } ]), Animate;\n    }(_react.Component), _class2.displayName = \"Animate\", _class2.propTypes = {\n        from: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.string ]),\n        to: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.string ]),\n        attributeName: _propTypes2.default.string,\n        duration: _propTypes2.default.number,\n        begin: _propTypes2.default.number,\n        easing: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n        steps: _propTypes2.default.arrayOf(_propTypes2.default.shape({\n            duration: _propTypes2.default.number.isRequired,\n            style: _propTypes2.default.object.isRequired,\n            easing: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ]), _propTypes2.default.func ]),\n            properties: _propTypes2.default.arrayOf(\"string\"),\n            onAnimationEnd: _propTypes2.default.func\n        })),\n        children: _propTypes2.default.oneOfType([ _propTypes2.default.node, _propTypes2.default.func ]),\n        isActive: _propTypes2.default.bool,\n        canBegin: _propTypes2.default.bool,\n        onAnimationEnd: _propTypes2.default.func,\n        shouldReAnimate: _propTypes2.default.bool,\n        onAnimationStart: _propTypes2.default.func,\n        onAnimationReStart: _propTypes2.default.func\n    }, _class2.defaultProps = {\n        begin: 0,\n        duration: 1e3,\n        from: \"\",\n        to: \"\",\n        attributeName: \"\",\n        easing: \"ease\",\n        isActive: !0,\n        canBegin: !0,\n        steps: [],\n        onAnimationEnd: function() {},\n        onAnimationStart: function() {}\n    }, _class = _temp)) || _class;\n    exports.default = Animate;\n}, function(module, exports, __webpack_require__) {\n    function isEqual(value, other) {\n        return baseIsEqual(value, other);\n    }\n    var baseIsEqual = __webpack_require__(187);\n    module.exports = isEqual;\n}, function(module, exports, __webpack_require__) {\n    function Stack(entries) {\n        var data = this.__data__ = new ListCache(entries);\n        this.size = data.size;\n    }\n    var ListCache = __webpack_require__(126), stackClear = __webpack_require__(663), stackDelete = __webpack_require__(664), stackGet = __webpack_require__(665), stackHas = __webpack_require__(666), stackSet = __webpack_require__(667);\n    Stack.prototype.clear = stackClear, Stack.prototype.delete = stackDelete, Stack.prototype.get = stackGet, \n    Stack.prototype.has = stackHas, Stack.prototype.set = stackSet, module.exports = Stack;\n}, function(module, exports) {\n    function eq(value, other) {\n        return value === other || value !== value && other !== other;\n    }\n    module.exports = eq;\n}, function(module, exports, __webpack_require__) {\n    function isFunction(value) {\n        if (!isObject(value)) return !1;\n        var tag = baseGetTag(value);\n        return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n    var baseGetTag = __webpack_require__(60), isObject = __webpack_require__(189), asyncTag = \"[object AsyncFunction]\", funcTag = \"[object Function]\", genTag = \"[object GeneratorFunction]\", proxyTag = \"[object Proxy]\";\n    module.exports = isFunction;\n}, function(module, exports, __webpack_require__) {\n    (function(global) {\n        var freeGlobal = \"object\" == typeof global && global && global.Object === Object && global;\n        module.exports = freeGlobal;\n    }).call(exports, __webpack_require__(40));\n}, function(module, exports) {\n    function toSource(func) {\n        if (null != func) {\n            try {\n                return funcToString.call(func);\n            } catch (e) {}\n            try {\n                return func + \"\";\n            } catch (e) {}\n        }\n        return \"\";\n    }\n    var funcProto = Function.prototype, funcToString = funcProto.toString;\n    module.exports = toSource;\n}, function(module, exports, __webpack_require__) {\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length;\n        if (arrLength != othLength && !(isPartial && othLength > arrLength)) return !1;\n        var stacked = stack.get(array);\n        if (stacked && stack.get(other)) return stacked == other;\n        var index = -1, result = !0, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : void 0;\n        for (stack.set(array, other), stack.set(other, array); ++index < arrLength; ) {\n            var arrValue = array[index], othValue = other[index];\n            if (customizer) var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);\n            if (void 0 !== compared) {\n                if (compared) continue;\n                result = !1;\n                break;\n            }\n            if (seen) {\n                if (!arraySome(other, function(othValue, othIndex) {\n                    if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) return seen.push(othIndex);\n                })) {\n                    result = !1;\n                    break;\n                }\n            } else if (arrValue !== othValue && !equalFunc(arrValue, othValue, bitmask, customizer, stack)) {\n                result = !1;\n                break;\n            }\n        }\n        return stack.delete(array), stack.delete(other), result;\n    }\n    var SetCache = __webpack_require__(295), arraySome = __webpack_require__(688), cacheHas = __webpack_require__(296), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;\n    module.exports = equalArrays;\n}, function(module, exports, __webpack_require__) {\n    function SetCache(values) {\n        var index = -1, length = null == values ? 0 : values.length;\n        for (this.__data__ = new MapCache(); ++index < length; ) this.add(values[index]);\n    }\n    var MapCache = __webpack_require__(190), setCacheAdd = __webpack_require__(686), setCacheHas = __webpack_require__(687);\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd, SetCache.prototype.has = setCacheHas, \n    module.exports = SetCache;\n}, function(module, exports) {\n    function cacheHas(cache, key) {\n        return cache.has(key);\n    }\n    module.exports = cacheHas;\n}, function(module, exports) {\n    function arrayFilter(array, predicate) {\n        for (var index = -1, length = null == array ? 0 : array.length, resIndex = 0, result = []; ++index < length; ) {\n            var value = array[index];\n            predicate(value, index, array) && (result[resIndex++] = value);\n        }\n        return result;\n    }\n    module.exports = arrayFilter;\n}, function(module, exports, __webpack_require__) {\n    var baseIsArguments = __webpack_require__(701), isObjectLike = __webpack_require__(43), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty, propertyIsEnumerable = objectProto.propertyIsEnumerable, isArguments = baseIsArguments(function() {\n        return arguments;\n    }()) ? baseIsArguments : function(value) {\n        return isObjectLike(value) && hasOwnProperty.call(value, \"callee\") && !propertyIsEnumerable.call(value, \"callee\");\n    };\n    module.exports = isArguments;\n}, function(module, exports, __webpack_require__) {\n    (function(module) {\n        var root = __webpack_require__(36), stubFalse = __webpack_require__(702), freeExports = \"object\" == typeof exports && exports && !exports.nodeType && exports, freeModule = freeExports && \"object\" == typeof module && module && !module.nodeType && module, moduleExports = freeModule && freeModule.exports === freeExports, Buffer = moduleExports ? root.Buffer : void 0, nativeIsBuffer = Buffer ? Buffer.isBuffer : void 0, isBuffer = nativeIsBuffer || stubFalse;\n        module.exports = isBuffer;\n    }).call(exports, __webpack_require__(131)(module));\n}, function(module, exports) {\n    function isIndex(value, length) {\n        var type = typeof value;\n        return !!(length = null == length ? MAX_SAFE_INTEGER : length) && (\"number\" == type || \"symbol\" != type && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;\n    }\n    var MAX_SAFE_INTEGER = 9007199254740991, reIsUint = /^(?:0|[1-9]\\d*)$/;\n    module.exports = isIndex;\n}, function(module, exports, __webpack_require__) {\n    var baseIsTypedArray = __webpack_require__(703), baseUnary = __webpack_require__(302), nodeUtil = __webpack_require__(704), nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray, isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n    module.exports = isTypedArray;\n}, function(module, exports) {\n    function baseUnary(func) {\n        return function(value) {\n            return func(value);\n        };\n    }\n    module.exports = baseUnary;\n}, function(module, exports) {\n    function overArg(func, transform) {\n        return function(arg) {\n            return func(transform(arg));\n        };\n    }\n    module.exports = overArg;\n}, function(module, exports, __webpack_require__) {\n    (function(global) {\n        for (var now = __webpack_require__(715), root = \"undefined\" == typeof window ? global : window, vendors = [ \"moz\", \"webkit\" ], suffix = \"AnimationFrame\", raf = root[\"request\" + suffix], caf = root[\"cancel\" + suffix] || root[\"cancelRequest\" + suffix], i = 0; !raf && i < vendors.length; i++) raf = root[vendors[i] + \"Request\" + suffix], \n        caf = root[vendors[i] + \"Cancel\" + suffix] || root[vendors[i] + \"CancelRequest\" + suffix];\n        if (!raf || !caf) {\n            var last = 0, id = 0, queue = [];\n            raf = function(callback) {\n                if (0 === queue.length) {\n                    var _now = now(), next = Math.max(0, 1e3 / 60 - (_now - last));\n                    last = next + _now, setTimeout(function() {\n                        var cp = queue.slice(0);\n                        queue.length = 0;\n                        for (var i = 0; i < cp.length; i++) if (!cp[i].cancelled) try {\n                            cp[i].callback(last);\n                        } catch (e) {\n                            setTimeout(function() {\n                                throw e;\n                            }, 0);\n                        }\n                    }, Math.round(next));\n                }\n                return queue.push({\n                    handle: ++id,\n                    callback: callback,\n                    cancelled: !1\n                }), id;\n            }, caf = function(handle) {\n                for (var i = 0; i < queue.length; i++) queue[i].handle === handle && (queue[i].cancelled = !0);\n            };\n        }\n        module.exports = function(fn) {\n            return raf.call(root, fn);\n        }, module.exports.cancel = function() {\n            caf.apply(root, arguments);\n        }, module.exports.polyfill = function(object) {\n            object || (object = root), object.requestAnimationFrame = raf, object.cancelAnimationFrame = caf;\n        };\n    }).call(exports, __webpack_require__(40));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.configEasing = exports.configSpring = exports.configBezier = void 0;\n    var _util = __webpack_require__(132), cubicBezierFactor = function(c1, c2) {\n        return [ 0, 3 * c1, 3 * c2 - 6 * c1, 3 * c1 - 3 * c2 + 1 ];\n    }, multyTime = function(params, t) {\n        return params.map(function(param, i) {\n            return param * Math.pow(t, i);\n        }).reduce(function(pre, curr) {\n            return pre + curr;\n        });\n    }, cubicBezier = function(c1, c2) {\n        return function(t) {\n            var params = cubicBezierFactor(c1, c2);\n            return multyTime(params, t);\n        };\n    }, derivativeCubicBezier = function(c1, c2) {\n        return function(t) {\n            var params = cubicBezierFactor(c1, c2), newParams = [].concat(_toConsumableArray(params.map(function(param, i) {\n                return param * i;\n            }).slice(1)), [ 0 ]);\n            return multyTime(newParams, t);\n        };\n    }, configBezier = exports.configBezier = function() {\n        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n        var x1 = args[0], y1 = args[1], x2 = args[2], y2 = args[3];\n        if (1 === args.length) switch (args[0]) {\n          case \"linear\":\n            x1 = 0, y1 = 0, x2 = 1, y2 = 1;\n            break;\n\n          case \"ease\":\n            x1 = .25, y1 = .1, x2 = .25, y2 = 1;\n            break;\n\n          case \"ease-in\":\n            x1 = .42, y1 = 0, x2 = 1, y2 = 1;\n            break;\n\n          case \"ease-out\":\n            x1 = .42, y1 = 0, x2 = .58, y2 = 1;\n            break;\n\n          case \"ease-in-out\":\n            x1 = 0, y1 = 0, x2 = .58, y2 = 1;\n            break;\n\n          default:\n            (0, _util.warn)(!1, \"[configBezier]: arguments should be one of oneOf 'linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', instead received %s\", args);\n        }\n        (0, _util.warn)([ x1, x2, y1, y2 ].every(function(num) {\n            return \"number\" == typeof num && num >= 0 && num <= 1;\n        }), \"[configBezier]: arguments should be x1, y1, x2, y2 of [0, 1] instead received %s\", args);\n        var curveX = cubicBezier(x1, x2), curveY = cubicBezier(y1, y2), derCurveX = derivativeCubicBezier(x1, x2), rangeValue = function(value) {\n            return value > 1 ? 1 : value < 0 ? 0 : value;\n        }, bezier = function(_t) {\n            for (var t = _t > 1 ? 1 : _t, x = t, i = 0; i < 8; ++i) {\n                var evalT = curveX(x) - t, derVal = derCurveX(x);\n                if (Math.abs(evalT - t) < 1e-4 || derVal < 1e-4) return curveY(x);\n                x = rangeValue(x - evalT / derVal);\n            }\n            return curveY(x);\n        };\n        return bezier.isStepper = !1, bezier;\n    }, configSpring = exports.configSpring = function() {\n        var config = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, _config$stiff = config.stiff, stiff = void 0 === _config$stiff ? 100 : _config$stiff, _config$damping = config.damping, damping = void 0 === _config$damping ? 8 : _config$damping, _config$dt = config.dt, dt = void 0 === _config$dt ? 17 : _config$dt, stepper = function(currX, destX, currV) {\n            var FSpring = -(currX - destX) * stiff, FDamping = currV * damping, newV = currV + (FSpring - FDamping) * dt / 1e3, newX = currV * dt / 1e3 + currX;\n            return Math.abs(newX - destX) < 1e-4 && Math.abs(newV) < 1e-4 ? [ destX, 0 ] : [ newX, newV ];\n        };\n        return stepper.isStepper = !0, stepper.dt = dt, stepper;\n    };\n    exports.configEasing = function() {\n        for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2];\n        var easing = args[0];\n        if (\"string\" == typeof easing) switch (easing) {\n          case \"ease\":\n          case \"ease-in-out\":\n          case \"ease-out\":\n          case \"ease-in\":\n          case \"linear\":\n            return configBezier(easing);\n\n          case \"spring\":\n            return configSpring();\n\n          default:\n            (0, _util.warn)(!1, \"[configEasing]: first argument should be one of 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear' and 'spring', instead  received %s\", args);\n        }\n        return \"function\" == typeof easing ? easing : ((0, _util.warn)(!1, \"[configEasing]: first argument type should be function or string, instead received %s\", args), \n        null);\n    };\n}, function(module, exports, __webpack_require__) {\n    function isStrictComparable(value) {\n        return value === value && !isObject(value);\n    }\n    var isObject = __webpack_require__(189);\n    module.exports = isStrictComparable;\n}, function(module, exports) {\n    function matchesStrictComparable(key, srcValue) {\n        return function(object) {\n            return null != object && (object[key] === srcValue && (void 0 !== srcValue || key in Object(object)));\n        };\n    }\n    module.exports = matchesStrictComparable;\n}, function(module, exports, __webpack_require__) {\n    function baseGet(object, path) {\n        path = castPath(path, object);\n        for (var index = 0, length = path.length; null != object && index < length; ) object = object[toKey(path[index++])];\n        return index && index == length ? object : void 0;\n    }\n    var castPath = __webpack_require__(309), toKey = __webpack_require__(133);\n    module.exports = baseGet;\n}, function(module, exports, __webpack_require__) {\n    function castPath(value, object) {\n        return isArray(value) ? value : isKey(value, object) ? [ value ] : stringToPath(toString(value));\n    }\n    var isArray = __webpack_require__(34), isKey = __webpack_require__(196), stringToPath = __webpack_require__(751), toString = __webpack_require__(754);\n    module.exports = castPath;\n}, function(module, exports, __webpack_require__) {\n    function debounce(func, wait, options) {\n        function invokeFunc(time) {\n            var args = lastArgs, thisArg = lastThis;\n            return lastArgs = lastThis = void 0, lastInvokeTime = time, result = func.apply(thisArg, args);\n        }\n        function leadingEdge(time) {\n            return lastInvokeTime = time, timerId = setTimeout(timerExpired, wait), leading ? invokeFunc(time) : result;\n        }\n        function remainingWait(time) {\n            var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;\n            return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;\n        }\n        function shouldInvoke(time) {\n            var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;\n            return void 0 === lastCallTime || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;\n        }\n        function timerExpired() {\n            var time = now();\n            if (shouldInvoke(time)) return trailingEdge(time);\n            timerId = setTimeout(timerExpired, remainingWait(time));\n        }\n        function trailingEdge(time) {\n            return timerId = void 0, trailing && lastArgs ? invokeFunc(time) : (lastArgs = lastThis = void 0, \n            result);\n        }\n        function cancel() {\n            void 0 !== timerId && clearTimeout(timerId), lastInvokeTime = 0, lastArgs = lastCallTime = lastThis = timerId = void 0;\n        }\n        function flush() {\n            return void 0 === timerId ? result : trailingEdge(now());\n        }\n        function debounced() {\n            var time = now(), isInvoking = shouldInvoke(time);\n            if (lastArgs = arguments, lastThis = this, lastCallTime = time, isInvoking) {\n                if (void 0 === timerId) return leadingEdge(lastCallTime);\n                if (maxing) return timerId = setTimeout(timerExpired, wait), invokeFunc(lastCallTime);\n            }\n            return void 0 === timerId && (timerId = setTimeout(timerExpired, wait)), result;\n        }\n        var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = !1, maxing = !1, trailing = !0;\n        if (\"function\" != typeof func) throw new TypeError(FUNC_ERROR_TEXT);\n        return wait = toNumber(wait) || 0, isObject(options) && (leading = !!options.leading, \n        maxing = \"maxWait\" in options, maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait, \n        trailing = \"trailing\" in options ? !!options.trailing : trailing), debounced.cancel = cancel, \n        debounced.flush = flush, debounced;\n    }\n    var isObject = __webpack_require__(32), now = __webpack_require__(767), toNumber = __webpack_require__(311), FUNC_ERROR_TEXT = \"Expected a function\", nativeMax = Math.max, nativeMin = Math.min;\n    module.exports = debounce;\n}, function(module, exports, __webpack_require__) {\n    function toNumber(value) {\n        if (\"number\" == typeof value) return value;\n        if (isSymbol(value)) return NAN;\n        if (isObject(value)) {\n            var other = \"function\" == typeof value.valueOf ? value.valueOf() : value;\n            value = isObject(other) ? other + \"\" : other;\n        }\n        if (\"string\" != typeof value) return 0 === value ? value : +value;\n        value = value.replace(reTrim, \"\");\n        var isBinary = reIsBinary.test(value);\n        return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;\n    }\n    var isObject = __webpack_require__(32), isSymbol = __webpack_require__(67), NAN = NaN, reTrim = /^\\s+|\\s+$/g, reIsBadHex = /^[-+]0x[0-9a-f]+$/i, reIsBinary = /^0b[01]+$/i, reIsOctal = /^0o[0-7]+$/i, freeParseInt = parseInt;\n    module.exports = toNumber;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        __webpack_require__.d(__webpack_exports__, \"a\", function() {\n            return warn;\n        });\n        var isDev = \"production\" !== process.env.NODE_ENV, warn = function(condition, format, a, b, c, d, e, f) {\n            if (isDev && \"undefined\" != typeof console && console.warn && (void 0 === format && console.warn(\"LogUtils requires an error message argument\"), \n            !condition)) if (void 0 === format) console.warn(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\"); else {\n                var args = [ a, b, c, d, e, f ], argIndex = 0;\n                console.warn(format.replace(/%s/g, function() {\n                    return args[argIndex++];\n                }));\n            }\n        };\n    }).call(__webpack_exports__, __webpack_require__(2));\n}, function(module, exports) {\n    function balanced(a, b, str) {\n        a instanceof RegExp && (a = maybeMatch(a, str)), b instanceof RegExp && (b = maybeMatch(b, str));\n        var r = range(a, b, str);\n        return r && {\n            start: r[0],\n            end: r[1],\n            pre: str.slice(0, r[0]),\n            body: str.slice(r[0] + a.length, r[1]),\n            post: str.slice(r[1] + b.length)\n        };\n    }\n    function maybeMatch(reg, str) {\n        var m = str.match(reg);\n        return m ? m[0] : null;\n    }\n    function range(a, b, str) {\n        var begs, beg, left, right, result, ai = str.indexOf(a), bi = str.indexOf(b, ai + 1), i = ai;\n        if (ai >= 0 && bi > 0) {\n            for (begs = [], left = str.length; i >= 0 && !result; ) i == ai ? (begs.push(i), \n            ai = str.indexOf(a, i + 1)) : 1 == begs.length ? result = [ begs.pop(), bi ] : (beg = begs.pop(), \n            beg < left && (left = beg, right = bi), bi = str.indexOf(b, i + 1)), i = ai < bi && ai >= 0 ? ai : bi;\n            begs.length && (result = [ left, right ]);\n        }\n        return result;\n    }\n    module.exports = balanced, balanced.range = range;\n}, function(module, exports, __webpack_require__) {\n    function Stack(entries) {\n        var data = this.__data__ = new ListCache(entries);\n        this.size = data.size;\n    }\n    var ListCache = __webpack_require__(116), stackClear = __webpack_require__(779), stackDelete = __webpack_require__(780), stackGet = __webpack_require__(781), stackHas = __webpack_require__(782), stackSet = __webpack_require__(783);\n    Stack.prototype.clear = stackClear, Stack.prototype.delete = stackDelete, Stack.prototype.get = stackGet, \n    Stack.prototype.has = stackHas, Stack.prototype.set = stackSet, module.exports = Stack;\n}, function(module, exports, __webpack_require__) {\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length;\n        if (arrLength != othLength && !(isPartial && othLength > arrLength)) return !1;\n        var stacked = stack.get(array);\n        if (stacked && stack.get(other)) return stacked == other;\n        var index = -1, result = !0, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : void 0;\n        for (stack.set(array, other), stack.set(other, array); ++index < arrLength; ) {\n            var arrValue = array[index], othValue = other[index];\n            if (customizer) var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);\n            if (void 0 !== compared) {\n                if (compared) continue;\n                result = !1;\n                break;\n            }\n            if (seen) {\n                if (!arraySome(other, function(othValue, othIndex) {\n                    if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) return seen.push(othIndex);\n                })) {\n                    result = !1;\n                    break;\n                }\n            } else if (arrValue !== othValue && !equalFunc(arrValue, othValue, bitmask, customizer, stack)) {\n                result = !1;\n                break;\n            }\n        }\n        return stack.delete(array), stack.delete(other), result;\n    }\n    var SetCache = __webpack_require__(784), arraySome = __webpack_require__(787), cacheHas = __webpack_require__(788), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;\n    module.exports = equalArrays;\n}, function(module, exports) {\n    function arrayPush(array, values) {\n        for (var index = -1, length = values.length, offset = array.length; ++index < length; ) array[offset + index] = values[index];\n        return array;\n    }\n    module.exports = arrayPush;\n}, function(module, exports, __webpack_require__) {\n    (function(module) {\n        var root = __webpack_require__(31), stubFalse = __webpack_require__(802), freeExports = \"object\" == typeof exports && exports && !exports.nodeType && exports, freeModule = freeExports && \"object\" == typeof module && module && !module.nodeType && module, moduleExports = freeModule && freeModule.exports === freeExports, Buffer = moduleExports ? root.Buffer : void 0, nativeIsBuffer = Buffer ? Buffer.isBuffer : void 0, isBuffer = nativeIsBuffer || stubFalse;\n        module.exports = isBuffer;\n    }).call(exports, __webpack_require__(131)(module));\n}, function(module, exports, __webpack_require__) {\n    var baseIsTypedArray = __webpack_require__(803), baseUnary = __webpack_require__(319), nodeUtil = __webpack_require__(804), nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray, isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n    module.exports = isTypedArray;\n}, function(module, exports) {\n    function baseUnary(func) {\n        return function(value) {\n            return func(value);\n        };\n    }\n    module.exports = baseUnary;\n}, function(module, exports) {\n    function overArg(func, transform) {\n        return function(arg) {\n            return func(transform(arg));\n        };\n    }\n    module.exports = overArg;\n}, function(module, exports, __webpack_require__) {\n    var baseFlatten = __webpack_require__(322), baseOrderBy = __webpack_require__(814), baseRest = __webpack_require__(833), isIterateeCall = __webpack_require__(326), sortBy = baseRest(function(collection, iteratees) {\n        if (null == collection) return [];\n        var length = iteratees.length;\n        return length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1]) ? iteratees = [] : length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2]) && (iteratees = [ iteratees[0] ]), \n        baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n    module.exports = sortBy;\n}, function(module, exports, __webpack_require__) {\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n        var index = -1, length = array.length;\n        for (predicate || (predicate = isFlattenable), result || (result = []); ++index < length; ) {\n            var value = array[index];\n            depth > 0 && predicate(value) ? depth > 1 ? baseFlatten(value, depth - 1, predicate, isStrict, result) : arrayPush(result, value) : isStrict || (result[result.length] = value);\n        }\n        return result;\n    }\n    var arrayPush = __webpack_require__(316), isFlattenable = __webpack_require__(813);\n    module.exports = baseFlatten;\n}, function(module, exports, __webpack_require__) {\n    function isStrictComparable(value) {\n        return value === value && !isObject(value);\n    }\n    var isObject = __webpack_require__(32);\n    module.exports = isStrictComparable;\n}, function(module, exports) {\n    function matchesStrictComparable(key, srcValue) {\n        return function(object) {\n            return null != object && (object[key] === srcValue && (void 0 !== srcValue || key in Object(object)));\n        };\n    }\n    module.exports = matchesStrictComparable;\n}, function(module, exports, __webpack_require__) {\n    function baseMap(collection, iteratee) {\n        var index = -1, result = isArrayLike(collection) ? Array(collection.length) : [];\n        return baseEach(collection, function(value, key, collection) {\n            result[++index] = iteratee(value, key, collection);\n        }), result;\n    }\n    var baseEach = __webpack_require__(825), isArrayLike = __webpack_require__(134);\n    module.exports = baseMap;\n}, function(module, exports, __webpack_require__) {\n    function isIterateeCall(value, index, object) {\n        if (!isObject(object)) return !1;\n        var type = typeof index;\n        return !!(\"number\" == type ? isArrayLike(object) && isIndex(index, object.length) : \"string\" == type && index in object) && eq(object[index], value);\n    }\n    var eq = __webpack_require__(177), isArrayLike = __webpack_require__(134), isIndex = __webpack_require__(202), isObject = __webpack_require__(32);\n    module.exports = isIterateeCall;\n}, function(module, exports) {\n    function baseGt(value, other) {\n        return value > other;\n    }\n    module.exports = baseGt;\n}, function(module, exports, __webpack_require__) {\n    function min(array) {\n        return array && array.length ? baseExtremum(array, identity, baseLt) : void 0;\n    }\n    var baseExtremum = __webpack_require__(135), baseLt = __webpack_require__(329), identity = __webpack_require__(68);\n    module.exports = min;\n}, function(module, exports) {\n    function baseLt(value, other) {\n        return value < other;\n    }\n    module.exports = baseLt;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var identity = function(i) {\n        return i;\n    }, PLACE_HOLDER = exports.PLACE_HOLDER = {\n        \"@@functional/placeholder\": !0\n    }, isPlaceHolder = function(val) {\n        return val === PLACE_HOLDER;\n    }, curry0 = function(fn) {\n        return function _curried() {\n            return 0 === arguments.length || 1 === arguments.length && isPlaceHolder(arguments.length <= 0 ? void 0 : arguments[0]) ? _curried : fn.apply(void 0, arguments);\n        };\n    }, curryN = function curryN(n, fn) {\n        return 1 === n ? fn : curry0(function() {\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            var argsLength = args.filter(function(arg) {\n                return arg !== PLACE_HOLDER;\n            }).length;\n            return argsLength >= n ? fn.apply(void 0, args) : curryN(n - argsLength, curry0(function() {\n                for (var _len2 = arguments.length, restArgs = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) restArgs[_key2] = arguments[_key2];\n                var newArgs = args.map(function(arg) {\n                    return isPlaceHolder(arg) ? restArgs.shift() : arg;\n                });\n                return fn.apply(void 0, _toConsumableArray(newArgs).concat(restArgs));\n            }));\n        });\n    }, curry = exports.curry = function(fn) {\n        return curryN(fn.length, fn);\n    };\n    exports.range = function(begin, end) {\n        for (var arr = [], i = begin; i < end; ++i) arr[i - begin] = i;\n        return arr;\n    }, exports.map = curry(function(fn, arr) {\n        return Array.isArray(arr) ? arr.map(fn) : Object.keys(arr).map(function(key) {\n            return arr[key];\n        }).map(fn);\n    }), exports.compose = function() {\n        for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) args[_key3] = arguments[_key3];\n        if (!args.length) return identity;\n        var fns = args.reverse(), firstFn = fns[0], tailsFn = fns.slice(1);\n        return function() {\n            return tailsFn.reduce(function(res, fn) {\n                return fn(res);\n            }, firstFn.apply(void 0, arguments));\n        };\n    }, exports.reverse = function(arr) {\n        return Array.isArray(arr) ? arr.reverse() : arr.split(\"\").reverse.join(\"\");\n    }, exports.memoize = function(fn) {\n        var lastArgs = null, lastResult = null;\n        return function() {\n            for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) args[_key4] = arguments[_key4];\n            return lastArgs && args.every(function(val, i) {\n                return val === lastArgs[i];\n            }) ? lastResult : (lastArgs = args, lastResult = fn.apply(void 0, args));\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(__webpack_exports__, \"__esModule\", {\n        value: !0\n    });\n    var __WEBPACK_IMPORTED_MODULE_0__src_band__ = __webpack_require__(847);\n    __webpack_require__.d(__webpack_exports__, \"scaleBand\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_band__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"scalePoint\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_band__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_1__src_identity__ = __webpack_require__(870);\n    __webpack_require__.d(__webpack_exports__, \"scaleIdentity\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__src_identity__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_2__src_linear__ = __webpack_require__(91);\n    __webpack_require__.d(__webpack_exports__, \"scaleLinear\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_linear__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_3__src_log__ = __webpack_require__(893);\n    __webpack_require__.d(__webpack_exports__, \"scaleLog\", function() {\n        return __WEBPACK_IMPORTED_MODULE_3__src_log__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_4__src_ordinal__ = __webpack_require__(344);\n    __webpack_require__.d(__webpack_exports__, \"scaleOrdinal\", function() {\n        return __WEBPACK_IMPORTED_MODULE_4__src_ordinal__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"scaleImplicit\", function() {\n        return __WEBPACK_IMPORTED_MODULE_4__src_ordinal__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_5__src_pow__ = __webpack_require__(894);\n    __webpack_require__.d(__webpack_exports__, \"scalePow\", function() {\n        return __WEBPACK_IMPORTED_MODULE_5__src_pow__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"scaleSqrt\", function() {\n        return __WEBPACK_IMPORTED_MODULE_5__src_pow__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_6__src_quantile__ = __webpack_require__(895);\n    __webpack_require__.d(__webpack_exports__, \"scaleQuantile\", function() {\n        return __WEBPACK_IMPORTED_MODULE_6__src_quantile__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_7__src_quantize__ = __webpack_require__(896);\n    __webpack_require__.d(__webpack_exports__, \"scaleQuantize\", function() {\n        return __WEBPACK_IMPORTED_MODULE_7__src_quantize__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_8__src_threshold__ = __webpack_require__(897);\n    __webpack_require__.d(__webpack_exports__, \"scaleThreshold\", function() {\n        return __WEBPACK_IMPORTED_MODULE_8__src_threshold__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_9__src_time__ = __webpack_require__(360);\n    __webpack_require__.d(__webpack_exports__, \"scaleTime\", function() {\n        return __WEBPACK_IMPORTED_MODULE_9__src_time__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_10__src_utcTime__ = __webpack_require__(913);\n    __webpack_require__.d(__webpack_exports__, \"scaleUtc\", function() {\n        return __WEBPACK_IMPORTED_MODULE_10__src_utcTime__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_11__src_category10__ = __webpack_require__(914);\n    __webpack_require__.d(__webpack_exports__, \"schemeCategory10\", function() {\n        return __WEBPACK_IMPORTED_MODULE_11__src_category10__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_12__src_category20b__ = __webpack_require__(915);\n    __webpack_require__.d(__webpack_exports__, \"schemeCategory20b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_12__src_category20b__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_13__src_category20c__ = __webpack_require__(916);\n    __webpack_require__.d(__webpack_exports__, \"schemeCategory20c\", function() {\n        return __WEBPACK_IMPORTED_MODULE_13__src_category20c__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_14__src_category20__ = __webpack_require__(917);\n    __webpack_require__.d(__webpack_exports__, \"schemeCategory20\", function() {\n        return __WEBPACK_IMPORTED_MODULE_14__src_category20__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = __webpack_require__(918);\n    __webpack_require__.d(__webpack_exports__, \"interpolateCubehelixDefault\", function() {\n        return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_16__src_rainbow__ = __webpack_require__(919);\n    __webpack_require__.d(__webpack_exports__, \"interpolateRainbow\", function() {\n        return __WEBPACK_IMPORTED_MODULE_16__src_rainbow__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"interpolateWarm\", function() {\n        return __WEBPACK_IMPORTED_MODULE_16__src_rainbow__.c;\n    }), __webpack_require__.d(__webpack_exports__, \"interpolateCool\", function() {\n        return __WEBPACK_IMPORTED_MODULE_16__src_rainbow__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_17__src_viridis__ = __webpack_require__(920);\n    __webpack_require__.d(__webpack_exports__, \"interpolateViridis\", function() {\n        return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"interpolateMagma\", function() {\n        return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.c;\n    }), __webpack_require__.d(__webpack_exports__, \"interpolateInferno\", function() {\n        return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.b;\n    }), __webpack_require__.d(__webpack_exports__, \"interpolatePlasma\", function() {\n        return __WEBPACK_IMPORTED_MODULE_17__src_viridis__.d;\n    });\n    var __WEBPACK_IMPORTED_MODULE_18__src_sequential__ = __webpack_require__(921);\n    __webpack_require__.d(__webpack_exports__, \"scaleSequential\", function() {\n        return __WEBPACK_IMPORTED_MODULE_18__src_sequential__.a;\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__ascending__ = __webpack_require__(69), __WEBPACK_IMPORTED_MODULE_1__bisector__ = __webpack_require__(333), ascendingBisect = Object(__WEBPACK_IMPORTED_MODULE_1__bisector__.a)(__WEBPACK_IMPORTED_MODULE_0__ascending__.a), bisectRight = ascendingBisect.right;\n    ascendingBisect.left;\n    __webpack_exports__.a = bisectRight;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function ascendingComparator(f) {\n        return function(d, x) {\n            return Object(__WEBPACK_IMPORTED_MODULE_0__ascending__.a)(f(d), x);\n        };\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__ascending__ = __webpack_require__(69);\n    __webpack_exports__.a = function(compare) {\n        return 1 === compare.length && (compare = ascendingComparator(compare)), {\n            left: function(a, x, lo, hi) {\n                for (null == lo && (lo = 0), null == hi && (hi = a.length); lo < hi; ) {\n                    var mid = lo + hi >>> 1;\n                    compare(a[mid], x) < 0 ? lo = mid + 1 : hi = mid;\n                }\n                return lo;\n            },\n            right: function(a, x, lo, hi) {\n                for (null == lo && (lo = 0), null == hi && (hi = a.length); lo < hi; ) {\n                    var mid = lo + hi >>> 1;\n                    compare(a[mid], x) > 0 ? hi = mid : lo = mid + 1;\n                }\n                return lo;\n            }\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function pair(a, b) {\n        return [ a, b ];\n    }\n    __webpack_exports__.a = pair;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__variance__ = __webpack_require__(336);\n    __webpack_exports__.a = function(array, f) {\n        var v = Object(__WEBPACK_IMPORTED_MODULE_0__variance__.a)(array, f);\n        return v ? Math.sqrt(v) : v;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(90);\n    __webpack_exports__.a = function(values, valueof) {\n        var value, delta, n = values.length, m = 0, i = -1, mean = 0, sum = 0;\n        if (null == valueof) for (;++i < n; ) isNaN(value = Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(values[i])) || (delta = value - mean, \n        mean += delta / ++m, sum += delta * (value - mean)); else for (;++i < n; ) isNaN(value = Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(valueof(values[i], i, values))) || (delta = value - mean, \n        mean += delta / ++m, sum += delta * (value - mean));\n        if (m > 1) return sum / (m - 1);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(values, valueof) {\n        var value, min, max, n = values.length, i = -1;\n        if (null == valueof) {\n            for (;++i < n; ) if (null != (value = values[i]) && value >= value) for (min = max = value; ++i < n; ) null != (value = values[i]) && (min > value && (min = value), \n            max < value && (max = value));\n        } else for (;++i < n; ) if (null != (value = valueof(values[i], i, values)) && value >= value) for (min = max = value; ++i < n; ) null != (value = valueof(values[i], i, values)) && (min > value && (min = value), \n        max < value && (max = value));\n        return [ min, max ];\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return slice;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return map;\n    });\n    var array = Array.prototype, slice = array.slice, map = array.map;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(start, stop, step) {\n        start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, \n        start = 0, 1) : n < 3 ? 1 : +step;\n        for (var i = -1, n = 0 | Math.max(0, Math.ceil((stop - start) / step)), range = new Array(n); ++i < n; ) range[i] = start + i * step;\n        return range;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function tickIncrement(start, stop, count) {\n        var step = (stop - start) / Math.max(0, count), power = Math.floor(Math.log(step) / Math.LN10), error = step / Math.pow(10, power);\n        return power >= 0 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n    }\n    function tickStep(start, stop, count) {\n        var step0 = Math.abs(stop - start) / Math.max(0, count), step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), error = step0 / step1;\n        return error >= e10 ? step1 *= 10 : error >= e5 ? step1 *= 5 : error >= e2 && (step1 *= 2), \n        stop < start ? -step1 : step1;\n    }\n    __webpack_exports__.b = tickIncrement, __webpack_exports__.c = tickStep;\n    var e10 = Math.sqrt(50), e5 = Math.sqrt(10), e2 = Math.sqrt(2);\n    __webpack_exports__.a = function(start, stop, count) {\n        var reverse, n, ticks, step, i = -1;\n        if (stop = +stop, start = +start, count = +count, start === stop && count > 0) return [ start ];\n        if ((reverse = stop < start) && (n = start, start = stop, stop = n), 0 === (step = tickIncrement(start, stop, count)) || !isFinite(step)) return [];\n        if (step > 0) for (start = Math.ceil(start / step), stop = Math.floor(stop / step), \n        ticks = new Array(n = Math.ceil(stop - start + 1)); ++i < n; ) ticks[i] = (start + i) * step; else for (start = Math.floor(start * step), \n        stop = Math.ceil(stop * step), ticks = new Array(n = Math.ceil(start - stop + 1)); ++i < n; ) ticks[i] = (start - i) / step;\n        return reverse && ticks.reverse(), ticks;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(values) {\n        return Math.ceil(Math.log(values.length) / Math.LN2) + 1;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(values, valueof) {\n        var value, min, n = values.length, i = -1;\n        if (null == valueof) {\n            for (;++i < n; ) if (null != (value = values[i]) && value >= value) for (min = value; ++i < n; ) null != (value = values[i]) && min > value && (min = value);\n        } else for (;++i < n; ) if (null != (value = valueof(values[i], i, values)) && value >= value) for (min = value; ++i < n; ) null != (value = valueof(values[i], i, values)) && min > value && (min = value);\n        return min;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function length(d) {\n        return d.length;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__min__ = __webpack_require__(342);\n    __webpack_exports__.a = function(matrix) {\n        if (!(n = matrix.length)) return [];\n        for (var i = -1, m = Object(__WEBPACK_IMPORTED_MODULE_0__min__.a)(matrix, length), transpose = new Array(m); ++i < m; ) for (var n, j = -1, row = transpose[i] = new Array(n); ++j < n; ) row[j] = matrix[j][i];\n        return transpose;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function ordinal(range) {\n        function scale(d) {\n            var key = d + \"\", i = index.get(key);\n            if (!i) {\n                if (unknown !== implicit) return unknown;\n                index.set(key, i = domain.push(d));\n            }\n            return range[(i - 1) % range.length];\n        }\n        var index = Object(__WEBPACK_IMPORTED_MODULE_0_d3_collection__.a)(), domain = [], unknown = implicit;\n        return range = null == range ? [] : __WEBPACK_IMPORTED_MODULE_1__array__.b.call(range), \n        scale.domain = function(_) {\n            if (!arguments.length) return domain.slice();\n            domain = [], index = Object(__WEBPACK_IMPORTED_MODULE_0_d3_collection__.a)();\n            for (var d, key, i = -1, n = _.length; ++i < n; ) index.has(key = (d = _[i]) + \"\") || index.set(key, domain.push(d));\n            return scale;\n        }, scale.range = function(_) {\n            return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_), \n            scale) : range.slice();\n        }, scale.unknown = function(_) {\n            return arguments.length ? (unknown = _, scale) : unknown;\n        }, scale.copy = function() {\n            return ordinal().domain(domain).range(range).unknown(unknown);\n        }, scale;\n    }\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return implicit;\n    }), __webpack_exports__.a = ordinal;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_collection__ = __webpack_require__(864), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(62), implicit = {\n        name: \"implicit\"\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return deg2rad;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return rad2deg;\n    });\n    var deg2rad = Math.PI / 180, rad2deg = 180 / Math.PI;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function rgbSpline(spline) {\n        return function(colors) {\n            var i, color, n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n);\n            for (i = 0; i < n; ++i) color = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.f)(colors[i]), \n            r[i] = color.r || 0, g[i] = color.g || 0, b[i] = color.b || 0;\n            return r = spline(r), g = spline(g), b = spline(b), color.opacity = 1, function(t) {\n                return color.r = r(t), color.g = g(t), color.b = b(t), color + \"\";\n            };\n        };\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__basis__ = __webpack_require__(209), __WEBPACK_IMPORTED_MODULE_2__basisClosed__ = __webpack_require__(347), __WEBPACK_IMPORTED_MODULE_3__color__ = __webpack_require__(93);\n    __webpack_exports__.a = function rgbGamma(y) {\n        function rgb(start, end) {\n            var r = color((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.f)(start)).r, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.f)(end)).r), g = color(start.g, end.g), b = color(start.b, end.b), opacity = Object(__WEBPACK_IMPORTED_MODULE_3__color__.a)(start.opacity, end.opacity);\n            return function(t) {\n                return start.r = r(t), start.g = g(t), start.b = b(t), start.opacity = opacity(t), \n                start + \"\";\n            };\n        }\n        var color = Object(__WEBPACK_IMPORTED_MODULE_3__color__.b)(y);\n        return rgb.gamma = rgbGamma, rgb;\n    }(1);\n    rgbSpline(__WEBPACK_IMPORTED_MODULE_1__basis__.b), rgbSpline(__WEBPACK_IMPORTED_MODULE_2__basisClosed__.a);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__basis__ = __webpack_require__(209);\n    __webpack_exports__.a = function(values) {\n        var n = values.length;\n        return function(t) {\n            var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n];\n            return Object(__WEBPACK_IMPORTED_MODULE_0__basis__.a)((t - i / n) * n, v0, v1, v2, v3);\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return function() {\n            return x;\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__value__ = __webpack_require__(206);\n    __webpack_exports__.a = function(a, b) {\n        var i, nb = b ? b.length : 0, na = a ? Math.min(nb, a.length) : 0, x = new Array(na), c = new Array(nb);\n        for (i = 0; i < na; ++i) x[i] = Object(__WEBPACK_IMPORTED_MODULE_0__value__.a)(a[i], b[i]);\n        for (;i < nb; ++i) c[i] = b[i];\n        return function(t) {\n            for (i = 0; i < na; ++i) c[i] = x[i](t);\n            return c;\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(a, b) {\n        var d = new Date();\n        return a = +a, b -= a, function(t) {\n            return d.setTime(a + b * t), d;\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__value__ = __webpack_require__(206);\n    __webpack_exports__.a = function(a, b) {\n        var k, i = {}, c = {};\n        null !== a && \"object\" == typeof a || (a = {}), null !== b && \"object\" == typeof b || (b = {});\n        for (k in b) k in a ? i[k] = Object(__WEBPACK_IMPORTED_MODULE_0__value__.a)(a[k], b[k]) : c[k] = b[k];\n        return function(t) {\n            for (k in i) c[k] = i[k](t);\n            return c;\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function zero(b) {\n        return function() {\n            return b;\n        };\n    }\n    function one(b) {\n        return function(t) {\n            return b(t) + \"\";\n        };\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(136), reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, reB = new RegExp(reA.source, \"g\");\n    __webpack_exports__.a = function(a, b) {\n        var am, bm, bs, bi = reA.lastIndex = reB.lastIndex = 0, i = -1, s = [], q = [];\n        for (a += \"\", b += \"\"; (am = reA.exec(a)) && (bm = reB.exec(b)); ) (bs = bm.index) > bi && (bs = b.slice(bi, bs), \n        s[i] ? s[i] += bs : s[++i] = bs), (am = am[0]) === (bm = bm[0]) ? s[i] ? s[i] += bm : s[++i] = bm : (s[++i] = null, \n        q.push({\n            i: i,\n            x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(am, bm)\n        })), bi = reB.lastIndex;\n        return bi < b.length && (bs = b.slice(bi), s[i] ? s[i] += bs : s[++i] = bs), s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, \n        function(t) {\n            for (var o, i = 0; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n            return s.join(\"\");\n        });\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return +x;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__ = __webpack_require__(884);\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.b;\n    });\n    var __WEBPACK_IMPORTED_MODULE_2__src_formatSpecifier__ = (__webpack_require__(355), \n    __webpack_require__(356));\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_formatSpecifier__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_3__src_precisionFixed__ = __webpack_require__(890);\n    __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return __WEBPACK_IMPORTED_MODULE_3__src_precisionFixed__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_4__src_precisionPrefix__ = __webpack_require__(891);\n    __webpack_require__.d(__webpack_exports__, \"e\", function() {\n        return __WEBPACK_IMPORTED_MODULE_4__src_precisionPrefix__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_5__src_precisionRound__ = __webpack_require__(892);\n    __webpack_require__.d(__webpack_exports__, \"f\", function() {\n        return __WEBPACK_IMPORTED_MODULE_5__src_precisionRound__.a;\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(138), __WEBPACK_IMPORTED_MODULE_1__formatGroup__ = __webpack_require__(885), __WEBPACK_IMPORTED_MODULE_2__formatNumerals__ = __webpack_require__(886), __WEBPACK_IMPORTED_MODULE_3__formatSpecifier__ = __webpack_require__(356), __WEBPACK_IMPORTED_MODULE_4__formatTypes__ = __webpack_require__(357), __WEBPACK_IMPORTED_MODULE_5__formatPrefixAuto__ = __webpack_require__(358), __WEBPACK_IMPORTED_MODULE_6__identity__ = __webpack_require__(889), prefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ];\n    __webpack_exports__.a = function(locale) {\n        function newFormat(specifier) {\n            function format(value) {\n                var i, n, c, valuePrefix = prefix, valueSuffix = suffix;\n                if (\"c\" === type) valueSuffix = formatType(value) + valueSuffix, value = \"\"; else {\n                    value = +value;\n                    var valueNegative = value < 0;\n                    if (value = formatType(Math.abs(value), precision), valueNegative && 0 == +value && (valueNegative = !1), \n                    valuePrefix = (valueNegative ? \"(\" === sign ? sign : \"-\" : \"-\" === sign || \"(\" === sign ? \"\" : sign) + valuePrefix, \n                    valueSuffix = (\"s\" === type ? prefixes[8 + __WEBPACK_IMPORTED_MODULE_5__formatPrefixAuto__.b / 3] : \"\") + valueSuffix + (valueNegative && \"(\" === sign ? \")\" : \"\"), \n                    maybeSuffix) for (i = -1, n = value.length; ++i < n; ) if (48 > (c = value.charCodeAt(i)) || c > 57) {\n                        valueSuffix = (46 === c ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix, \n                        value = value.slice(0, i);\n                        break;\n                    }\n                }\n                comma && !zero && (value = group(value, 1 / 0));\n                var length = valuePrefix.length + value.length + valueSuffix.length, padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n                switch (comma && zero && (value = group(padding + value, padding.length ? width - valueSuffix.length : 1 / 0), \n                padding = \"\"), align) {\n                  case \"<\":\n                    value = valuePrefix + value + valueSuffix + padding;\n                    break;\n\n                  case \"=\":\n                    value = valuePrefix + padding + value + valueSuffix;\n                    break;\n\n                  case \"^\":\n                    value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length);\n                    break;\n\n                  default:\n                    value = padding + valuePrefix + value + valueSuffix;\n                }\n                return numerals(value);\n            }\n            specifier = Object(__WEBPACK_IMPORTED_MODULE_3__formatSpecifier__.a)(specifier);\n            var fill = specifier.fill, align = specifier.align, sign = specifier.sign, symbol = specifier.symbol, zero = specifier.zero, width = specifier.width, comma = specifier.comma, precision = specifier.precision, type = specifier.type, prefix = \"$\" === symbol ? currency[0] : \"#\" === symbol && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\", suffix = \"$\" === symbol ? currency[1] : /[%p]/.test(type) ? percent : \"\", formatType = __WEBPACK_IMPORTED_MODULE_4__formatTypes__.a[type], maybeSuffix = !type || /[defgprs%]/.test(type);\n            return precision = null == precision ? type ? 6 : 12 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) : Math.max(0, Math.min(20, precision)), \n            format.toString = function() {\n                return specifier + \"\";\n            }, format;\n        }\n        function formatPrefix(specifier, value) {\n            var f = newFormat((specifier = Object(__WEBPACK_IMPORTED_MODULE_3__formatSpecifier__.a)(specifier), \n            specifier.type = \"f\", specifier)), e = 3 * Math.max(-8, Math.min(8, Math.floor(Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(value) / 3))), k = Math.pow(10, -e), prefix = prefixes[8 + e / 3];\n            return function(value) {\n                return f(k * value) + prefix;\n            };\n        }\n        var group = locale.grouping && locale.thousands ? Object(__WEBPACK_IMPORTED_MODULE_1__formatGroup__.a)(locale.grouping, locale.thousands) : __WEBPACK_IMPORTED_MODULE_6__identity__.a, currency = locale.currency, decimal = locale.decimal, numerals = locale.numerals ? Object(__WEBPACK_IMPORTED_MODULE_2__formatNumerals__.a)(locale.numerals) : __WEBPACK_IMPORTED_MODULE_6__identity__.a, percent = locale.percent || \"%\";\n        return {\n            format: newFormat,\n            formatPrefix: formatPrefix\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function formatSpecifier(specifier) {\n        return new FormatSpecifier(specifier);\n    }\n    function FormatSpecifier(specifier) {\n        if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n        var match, fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zero = !!match[5], width = match[6] && +match[6], comma = !!match[7], precision = match[8] && +match[8].slice(1), type = match[9] || \"\";\n        \"n\" === type ? (comma = !0, type = \"g\") : __WEBPACK_IMPORTED_MODULE_0__formatTypes__.a[type] || (type = \"\"), \n        (zero || \"0\" === fill && \"=\" === align) && (zero = !0, fill = \"0\", align = \"=\"), \n        this.fill = fill, this.align = align, this.sign = sign, this.symbol = symbol, this.zero = zero, \n        this.width = width, this.comma = comma, this.precision = precision, this.type = type;\n    }\n    __webpack_exports__.a = formatSpecifier;\n    var __WEBPACK_IMPORTED_MODULE_0__formatTypes__ = __webpack_require__(357), re = /^(?:(.)?([<>=^]))?([+\\-\\( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?([a-z%])?$/i;\n    formatSpecifier.prototype = FormatSpecifier.prototype, FormatSpecifier.prototype.toString = function() {\n        return this.fill + this.align + this.sign + this.symbol + (this.zero ? \"0\" : \"\") + (null == this.width ? \"\" : Math.max(1, 0 | this.width)) + (this.comma ? \",\" : \"\") + (null == this.precision ? \"\" : \".\" + Math.max(0, 0 | this.precision)) + this.type;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__formatDefault__ = __webpack_require__(887), __WEBPACK_IMPORTED_MODULE_1__formatPrefixAuto__ = __webpack_require__(358), __WEBPACK_IMPORTED_MODULE_2__formatRounded__ = __webpack_require__(888);\n    __webpack_exports__.a = {\n        \"\": __WEBPACK_IMPORTED_MODULE_0__formatDefault__.a,\n        \"%\": function(x, p) {\n            return (100 * x).toFixed(p);\n        },\n        b: function(x) {\n            return Math.round(x).toString(2);\n        },\n        c: function(x) {\n            return x + \"\";\n        },\n        d: function(x) {\n            return Math.round(x).toString(10);\n        },\n        e: function(x, p) {\n            return x.toExponential(p);\n        },\n        f: function(x, p) {\n            return x.toFixed(p);\n        },\n        g: function(x, p) {\n            return x.toPrecision(p);\n        },\n        o: function(x) {\n            return Math.round(x).toString(8);\n        },\n        p: function(x, p) {\n            return Object(__WEBPACK_IMPORTED_MODULE_2__formatRounded__.a)(100 * x, p);\n        },\n        r: __WEBPACK_IMPORTED_MODULE_2__formatRounded__.a,\n        s: __WEBPACK_IMPORTED_MODULE_1__formatPrefixAuto__.a,\n        X: function(x) {\n            return Math.round(x).toString(16).toUpperCase();\n        },\n        x: function(x) {\n            return Math.round(x).toString(16);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return prefixExponent;\n    });\n    var prefixExponent, __WEBPACK_IMPORTED_MODULE_0__formatDecimal__ = __webpack_require__(211);\n    __webpack_exports__.a = function(x, p) {\n        var d = Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(x, p);\n        if (!d) return x + \"\";\n        var coefficient = d[0], exponent = d[1], i = exponent - (prefixExponent = 3 * Math.max(-8, Math.min(8, Math.floor(exponent / 3)))) + 1, n = coefficient.length;\n        return i === n ? coefficient : i > n ? coefficient + new Array(i - n + 1).join(\"0\") : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i) : \"0.\" + new Array(1 - i).join(\"0\") + Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(x, Math.max(0, p + i - 1))[0];\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(domain, interval) {\n        domain = domain.slice();\n        var t, i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1];\n        return x1 < x0 && (t = i0, i0 = i1, i1 = t, t = x0, x0 = x1, x1 = t), domain[i0] = interval.floor(x0), \n        domain[i1] = interval.ceil(x1), domain;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function date(t) {\n        return new Date(t);\n    }\n    function number(t) {\n        return t instanceof Date ? +t : +new Date(+t);\n    }\n    function calendar(year, month, week, day, hour, minute, second, millisecond, format) {\n        function tickFormat(date) {\n            return (second(date) < date ? formatMillisecond : minute(date) < date ? formatSecond : hour(date) < date ? formatMinute : day(date) < date ? formatHour : month(date) < date ? week(date) < date ? formatDay : formatWeek : year(date) < date ? formatMonth : formatYear)(date);\n        }\n        function tickInterval(interval, start, stop, step) {\n            if (null == interval && (interval = 10), \"number\" == typeof interval) {\n                var target = Math.abs(stop - start) / interval, i = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.c)(function(i) {\n                    return i[2];\n                }).right(tickIntervals, target);\n                i === tickIntervals.length ? (step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.g)(start / durationYear, stop / durationYear, interval), \n                interval = year) : i ? (i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i], \n                step = i[1], interval = i[0]) : (step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.g)(start, stop, interval), \n                interval = millisecond);\n            }\n            return null == step ? interval : interval.every(step);\n        }\n        var scale = Object(__WEBPACK_IMPORTED_MODULE_5__continuous__.b)(__WEBPACK_IMPORTED_MODULE_5__continuous__.c, __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.c), invert = scale.invert, domain = scale.domain, formatMillisecond = format(\".%L\"), formatSecond = format(\":%S\"), formatMinute = format(\"%I:%M\"), formatHour = format(\"%I %p\"), formatDay = format(\"%a %d\"), formatWeek = format(\"%b %d\"), formatMonth = format(\"%B\"), formatYear = format(\"%Y\"), tickIntervals = [ [ second, 1, durationSecond ], [ second, 5, 5 * durationSecond ], [ second, 15, 15 * durationSecond ], [ second, 30, 30 * durationSecond ], [ minute, 1, durationMinute ], [ minute, 5, 5 * durationMinute ], [ minute, 15, 15 * durationMinute ], [ minute, 30, 30 * durationMinute ], [ hour, 1, durationHour ], [ hour, 3, 3 * durationHour ], [ hour, 6, 6 * durationHour ], [ hour, 12, 12 * durationHour ], [ day, 1, durationDay ], [ day, 2, 2 * durationDay ], [ week, 1, durationWeek ], [ month, 1, durationMonth ], [ month, 3, 3 * durationMonth ], [ year, 1, durationYear ] ];\n        return scale.invert = function(y) {\n            return new Date(invert(y));\n        }, scale.domain = function(_) {\n            return arguments.length ? domain(__WEBPACK_IMPORTED_MODULE_4__array__.a.call(_, number)) : domain().map(date);\n        }, scale.ticks = function(interval, step) {\n            var t, d = domain(), t0 = d[0], t1 = d[d.length - 1], r = t1 < t0;\n            return r && (t = t0, t0 = t1, t1 = t), t = tickInterval(interval, t0, t1, step), \n            t = t ? t.range(t0, t1 + 1) : [], r ? t.reverse() : t;\n        }, scale.tickFormat = function(count, specifier) {\n            return null == specifier ? tickFormat : format(specifier);\n        }, scale.nice = function(interval, step) {\n            var d = domain();\n            return (interval = tickInterval(interval, d[0], d[d.length - 1], step)) ? domain(Object(__WEBPACK_IMPORTED_MODULE_6__nice__.a)(d, interval)) : scale;\n        }, scale.copy = function() {\n            return Object(__WEBPACK_IMPORTED_MODULE_5__continuous__.a)(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));\n        }, scale;\n    }\n    __webpack_exports__.a = calendar;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92), __WEBPACK_IMPORTED_MODULE_2_d3_time__ = __webpack_require__(212), __WEBPACK_IMPORTED_MODULE_3_d3_time_format__ = __webpack_require__(361), __WEBPACK_IMPORTED_MODULE_4__array__ = __webpack_require__(62), __WEBPACK_IMPORTED_MODULE_5__continuous__ = __webpack_require__(137), __WEBPACK_IMPORTED_MODULE_6__nice__ = __webpack_require__(359), durationSecond = 1e3, durationMinute = 60 * durationSecond, durationHour = 60 * durationMinute, durationDay = 24 * durationHour, durationWeek = 7 * durationDay, durationMonth = 30 * durationDay, durationYear = 365 * durationDay;\n    __webpack_exports__.b = function() {\n        return calendar(__WEBPACK_IMPORTED_MODULE_2_d3_time__.k, __WEBPACK_IMPORTED_MODULE_2_d3_time__.f, __WEBPACK_IMPORTED_MODULE_2_d3_time__.j, __WEBPACK_IMPORTED_MODULE_2_d3_time__.a, __WEBPACK_IMPORTED_MODULE_2_d3_time__.b, __WEBPACK_IMPORTED_MODULE_2_d3_time__.d, __WEBPACK_IMPORTED_MODULE_2_d3_time__.g, __WEBPACK_IMPORTED_MODULE_2_d3_time__.c, __WEBPACK_IMPORTED_MODULE_3_d3_time_format__.a).domain([ new Date(2e3, 0, 1), new Date(2e3, 0, 2) ]);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__ = __webpack_require__(213);\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.a;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return __WEBPACK_IMPORTED_MODULE_0__src_defaultLocale__.b;\n    });\n    __webpack_require__(362), __webpack_require__(363), __webpack_require__(912);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function localDate(d) {\n        if (0 <= d.y && d.y < 100) {\n            var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);\n            return date.setFullYear(d.y), date;\n        }\n        return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);\n    }\n    function utcDate(d) {\n        if (0 <= d.y && d.y < 100) {\n            var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));\n            return date.setUTCFullYear(d.y), date;\n        }\n        return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));\n    }\n    function newYear(y) {\n        return {\n            y: y,\n            m: 0,\n            d: 1,\n            H: 0,\n            M: 0,\n            S: 0,\n            L: 0\n        };\n    }\n    function formatLocale(locale) {\n        function newFormat(specifier, formats) {\n            return function(date) {\n                var c, pad, format, string = [], i = -1, j = 0, n = specifier.length;\n                for (date instanceof Date || (date = new Date(+date)); ++i < n; ) 37 === specifier.charCodeAt(i) && (string.push(specifier.slice(j, i)), \n                null != (pad = pads[c = specifier.charAt(++i)]) ? c = specifier.charAt(++i) : pad = \"e\" === c ? \" \" : \"0\", \n                (format = formats[c]) && (c = format(date, pad)), string.push(c), j = i + 1);\n                return string.push(specifier.slice(j, i)), string.join(\"\");\n            };\n        }\n        function newParse(specifier, newDate) {\n            return function(string) {\n                var week, day, d = newYear(1900), i = parseSpecifier(d, specifier, string += \"\", 0);\n                if (i != string.length) return null;\n                if (\"Q\" in d) return new Date(d.Q);\n                if (\"p\" in d && (d.H = d.H % 12 + 12 * d.p), \"V\" in d) {\n                    if (d.V < 1 || d.V > 53) return null;\n                    \"w\" in d || (d.w = 1), \"Z\" in d ? (week = utcDate(newYear(d.y)), day = week.getUTCDay(), \n                    week = day > 4 || 0 === day ? __WEBPACK_IMPORTED_MODULE_0_d3_time__.p.ceil(week) : Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.p)(week), \n                    week = __WEBPACK_IMPORTED_MODULE_0_d3_time__.l.offset(week, 7 * (d.V - 1)), d.y = week.getUTCFullYear(), \n                    d.m = week.getUTCMonth(), d.d = week.getUTCDate() + (d.w + 6) % 7) : (week = newDate(newYear(d.y)), \n                    day = week.getDay(), week = day > 4 || 0 === day ? __WEBPACK_IMPORTED_MODULE_0_d3_time__.e.ceil(week) : Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.e)(week), \n                    week = __WEBPACK_IMPORTED_MODULE_0_d3_time__.a.offset(week, 7 * (d.V - 1)), d.y = week.getFullYear(), \n                    d.m = week.getMonth(), d.d = week.getDate() + (d.w + 6) % 7);\n                } else (\"W\" in d || \"U\" in d) && (\"w\" in d || (d.w = \"u\" in d ? d.u % 7 : \"W\" in d ? 1 : 0), \n                day = \"Z\" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay(), \n                d.m = 0, d.d = \"W\" in d ? (d.w + 6) % 7 + 7 * d.W - (day + 5) % 7 : d.w + 7 * d.U - (day + 6) % 7);\n                return \"Z\" in d ? (d.H += d.Z / 100 | 0, d.M += d.Z % 100, utcDate(d)) : newDate(d);\n            };\n        }\n        function parseSpecifier(d, specifier, string, j) {\n            for (var c, parse, i = 0, n = specifier.length, m = string.length; i < n; ) {\n                if (j >= m) return -1;\n                if (37 === (c = specifier.charCodeAt(i++))) {\n                    if (c = specifier.charAt(i++), !(parse = parses[c in pads ? specifier.charAt(i++) : c]) || (j = parse(d, string, j)) < 0) return -1;\n                } else if (c != string.charCodeAt(j++)) return -1;\n            }\n            return j;\n        }\n        function parsePeriod(d, string, i) {\n            var n = periodRe.exec(string.slice(i));\n            return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n        }\n        function parseShortWeekday(d, string, i) {\n            var n = shortWeekdayRe.exec(string.slice(i));\n            return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n        }\n        function parseWeekday(d, string, i) {\n            var n = weekdayRe.exec(string.slice(i));\n            return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n        }\n        function parseShortMonth(d, string, i) {\n            var n = shortMonthRe.exec(string.slice(i));\n            return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n        }\n        function parseMonth(d, string, i) {\n            var n = monthRe.exec(string.slice(i));\n            return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;\n        }\n        function parseLocaleDateTime(d, string, i) {\n            return parseSpecifier(d, locale_dateTime, string, i);\n        }\n        function parseLocaleDate(d, string, i) {\n            return parseSpecifier(d, locale_date, string, i);\n        }\n        function parseLocaleTime(d, string, i) {\n            return parseSpecifier(d, locale_time, string, i);\n        }\n        function formatShortWeekday(d) {\n            return locale_shortWeekdays[d.getDay()];\n        }\n        function formatWeekday(d) {\n            return locale_weekdays[d.getDay()];\n        }\n        function formatShortMonth(d) {\n            return locale_shortMonths[d.getMonth()];\n        }\n        function formatMonth(d) {\n            return locale_months[d.getMonth()];\n        }\n        function formatPeriod(d) {\n            return locale_periods[+(d.getHours() >= 12)];\n        }\n        function formatUTCShortWeekday(d) {\n            return locale_shortWeekdays[d.getUTCDay()];\n        }\n        function formatUTCWeekday(d) {\n            return locale_weekdays[d.getUTCDay()];\n        }\n        function formatUTCShortMonth(d) {\n            return locale_shortMonths[d.getUTCMonth()];\n        }\n        function formatUTCMonth(d) {\n            return locale_months[d.getUTCMonth()];\n        }\n        function formatUTCPeriod(d) {\n            return locale_periods[+(d.getUTCHours() >= 12)];\n        }\n        var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_weekdays = locale.days, locale_shortWeekdays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths, periodRe = formatRe(locale_periods), periodLookup = formatLookup(locale_periods), weekdayRe = formatRe(locale_weekdays), weekdayLookup = formatLookup(locale_weekdays), shortWeekdayRe = formatRe(locale_shortWeekdays), shortWeekdayLookup = formatLookup(locale_shortWeekdays), monthRe = formatRe(locale_months), monthLookup = formatLookup(locale_months), shortMonthRe = formatRe(locale_shortMonths), shortMonthLookup = formatLookup(locale_shortMonths), formats = {\n            a: formatShortWeekday,\n            A: formatWeekday,\n            b: formatShortMonth,\n            B: formatMonth,\n            c: null,\n            d: formatDayOfMonth,\n            e: formatDayOfMonth,\n            f: formatMicroseconds,\n            H: formatHour24,\n            I: formatHour12,\n            j: formatDayOfYear,\n            L: formatMilliseconds,\n            m: formatMonthNumber,\n            M: formatMinutes,\n            p: formatPeriod,\n            Q: formatUnixTimestamp,\n            s: formatUnixTimestampSeconds,\n            S: formatSeconds,\n            u: formatWeekdayNumberMonday,\n            U: formatWeekNumberSunday,\n            V: formatWeekNumberISO,\n            w: formatWeekdayNumberSunday,\n            W: formatWeekNumberMonday,\n            x: null,\n            X: null,\n            y: formatYear,\n            Y: formatFullYear,\n            Z: formatZone,\n            \"%\": formatLiteralPercent\n        }, utcFormats = {\n            a: formatUTCShortWeekday,\n            A: formatUTCWeekday,\n            b: formatUTCShortMonth,\n            B: formatUTCMonth,\n            c: null,\n            d: formatUTCDayOfMonth,\n            e: formatUTCDayOfMonth,\n            f: formatUTCMicroseconds,\n            H: formatUTCHour24,\n            I: formatUTCHour12,\n            j: formatUTCDayOfYear,\n            L: formatUTCMilliseconds,\n            m: formatUTCMonthNumber,\n            M: formatUTCMinutes,\n            p: formatUTCPeriod,\n            Q: formatUnixTimestamp,\n            s: formatUnixTimestampSeconds,\n            S: formatUTCSeconds,\n            u: formatUTCWeekdayNumberMonday,\n            U: formatUTCWeekNumberSunday,\n            V: formatUTCWeekNumberISO,\n            w: formatUTCWeekdayNumberSunday,\n            W: formatUTCWeekNumberMonday,\n            x: null,\n            X: null,\n            y: formatUTCYear,\n            Y: formatUTCFullYear,\n            Z: formatUTCZone,\n            \"%\": formatLiteralPercent\n        }, parses = {\n            a: parseShortWeekday,\n            A: parseWeekday,\n            b: parseShortMonth,\n            B: parseMonth,\n            c: parseLocaleDateTime,\n            d: parseDayOfMonth,\n            e: parseDayOfMonth,\n            f: parseMicroseconds,\n            H: parseHour24,\n            I: parseHour24,\n            j: parseDayOfYear,\n            L: parseMilliseconds,\n            m: parseMonthNumber,\n            M: parseMinutes,\n            p: parsePeriod,\n            Q: parseUnixTimestamp,\n            s: parseUnixTimestampSeconds,\n            S: parseSeconds,\n            u: parseWeekdayNumberMonday,\n            U: parseWeekNumberSunday,\n            V: parseWeekNumberISO,\n            w: parseWeekdayNumberSunday,\n            W: parseWeekNumberMonday,\n            x: parseLocaleDate,\n            X: parseLocaleTime,\n            y: parseYear,\n            Y: parseFullYear,\n            Z: parseZone,\n            \"%\": parseLiteralPercent\n        };\n        return formats.x = newFormat(locale_date, formats), formats.X = newFormat(locale_time, formats), \n        formats.c = newFormat(locale_dateTime, formats), utcFormats.x = newFormat(locale_date, utcFormats), \n        utcFormats.X = newFormat(locale_time, utcFormats), utcFormats.c = newFormat(locale_dateTime, utcFormats), \n        {\n            format: function(specifier) {\n                var f = newFormat(specifier += \"\", formats);\n                return f.toString = function() {\n                    return specifier;\n                }, f;\n            },\n            parse: function(specifier) {\n                var p = newParse(specifier += \"\", localDate);\n                return p.toString = function() {\n                    return specifier;\n                }, p;\n            },\n            utcFormat: function(specifier) {\n                var f = newFormat(specifier += \"\", utcFormats);\n                return f.toString = function() {\n                    return specifier;\n                }, f;\n            },\n            utcParse: function(specifier) {\n                var p = newParse(specifier, utcDate);\n                return p.toString = function() {\n                    return specifier;\n                }, p;\n            }\n        };\n    }\n    function pad(value, fill, width) {\n        var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n        return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n    }\n    function requote(s) {\n        return s.replace(requoteRe, \"\\\\$&\");\n    }\n    function formatRe(names) {\n        return new RegExp(\"^(?:\" + names.map(requote).join(\"|\") + \")\", \"i\");\n    }\n    function formatLookup(names) {\n        for (var map = {}, i = -1, n = names.length; ++i < n; ) map[names[i].toLowerCase()] = i;\n        return map;\n    }\n    function parseWeekdayNumberSunday(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 1));\n        return n ? (d.w = +n[0], i + n[0].length) : -1;\n    }\n    function parseWeekdayNumberMonday(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 1));\n        return n ? (d.u = +n[0], i + n[0].length) : -1;\n    }\n    function parseWeekNumberSunday(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.U = +n[0], i + n[0].length) : -1;\n    }\n    function parseWeekNumberISO(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.V = +n[0], i + n[0].length) : -1;\n    }\n    function parseWeekNumberMonday(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.W = +n[0], i + n[0].length) : -1;\n    }\n    function parseFullYear(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 4));\n        return n ? (d.y = +n[0], i + n[0].length) : -1;\n    }\n    function parseYear(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2e3), i + n[0].length) : -1;\n    }\n    function parseZone(d, string, i) {\n        var n = /^(Z)|([+-]\\d\\d)(?::?(\\d\\d))?/.exec(string.slice(i, i + 6));\n        return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || \"00\")), i + n[0].length) : -1;\n    }\n    function parseMonthNumber(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.m = n[0] - 1, i + n[0].length) : -1;\n    }\n    function parseDayOfMonth(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.d = +n[0], i + n[0].length) : -1;\n    }\n    function parseDayOfYear(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 3));\n        return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;\n    }\n    function parseHour24(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.H = +n[0], i + n[0].length) : -1;\n    }\n    function parseMinutes(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.M = +n[0], i + n[0].length) : -1;\n    }\n    function parseSeconds(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 2));\n        return n ? (d.S = +n[0], i + n[0].length) : -1;\n    }\n    function parseMilliseconds(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 3));\n        return n ? (d.L = +n[0], i + n[0].length) : -1;\n    }\n    function parseMicroseconds(d, string, i) {\n        var n = numberRe.exec(string.slice(i, i + 6));\n        return n ? (d.L = Math.floor(n[0] / 1e3), i + n[0].length) : -1;\n    }\n    function parseLiteralPercent(d, string, i) {\n        var n = percentRe.exec(string.slice(i, i + 1));\n        return n ? i + n[0].length : -1;\n    }\n    function parseUnixTimestamp(d, string, i) {\n        var n = numberRe.exec(string.slice(i));\n        return n ? (d.Q = +n[0], i + n[0].length) : -1;\n    }\n    function parseUnixTimestampSeconds(d, string, i) {\n        var n = numberRe.exec(string.slice(i));\n        return n ? (d.Q = 1e3 * +n[0], i + n[0].length) : -1;\n    }\n    function formatDayOfMonth(d, p) {\n        return pad(d.getDate(), p, 2);\n    }\n    function formatHour24(d, p) {\n        return pad(d.getHours(), p, 2);\n    }\n    function formatHour12(d, p) {\n        return pad(d.getHours() % 12 || 12, p, 2);\n    }\n    function formatDayOfYear(d, p) {\n        return pad(1 + __WEBPACK_IMPORTED_MODULE_0_d3_time__.a.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d), p, 3);\n    }\n    function formatMilliseconds(d, p) {\n        return pad(d.getMilliseconds(), p, 3);\n    }\n    function formatMicroseconds(d, p) {\n        return formatMilliseconds(d, p) + \"000\";\n    }\n    function formatMonthNumber(d, p) {\n        return pad(d.getMonth() + 1, p, 2);\n    }\n    function formatMinutes(d, p) {\n        return pad(d.getMinutes(), p, 2);\n    }\n    function formatSeconds(d, p) {\n        return pad(d.getSeconds(), p, 2);\n    }\n    function formatWeekdayNumberMonday(d) {\n        var day = d.getDay();\n        return 0 === day ? 7 : day;\n    }\n    function formatWeekNumberSunday(d, p) {\n        return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.h.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d), p, 2);\n    }\n    function formatWeekNumberISO(d, p) {\n        var day = d.getDay();\n        return d = day >= 4 || 0 === day ? Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.i)(d) : __WEBPACK_IMPORTED_MODULE_0_d3_time__.i.ceil(d), \n        pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.i.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d) + (4 === Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d).getDay()), p, 2);\n    }\n    function formatWeekdayNumberSunday(d) {\n        return d.getDay();\n    }\n    function formatWeekNumberMonday(d, p) {\n        return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.e.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.k)(d), d), p, 2);\n    }\n    function formatYear(d, p) {\n        return pad(d.getFullYear() % 100, p, 2);\n    }\n    function formatFullYear(d, p) {\n        return pad(d.getFullYear() % 1e4, p, 4);\n    }\n    function formatZone(d) {\n        var z = d.getTimezoneOffset();\n        return (z > 0 ? \"-\" : (z *= -1, \"+\")) + pad(z / 60 | 0, \"0\", 2) + pad(z % 60, \"0\", 2);\n    }\n    function formatUTCDayOfMonth(d, p) {\n        return pad(d.getUTCDate(), p, 2);\n    }\n    function formatUTCHour24(d, p) {\n        return pad(d.getUTCHours(), p, 2);\n    }\n    function formatUTCHour12(d, p) {\n        return pad(d.getUTCHours() % 12 || 12, p, 2);\n    }\n    function formatUTCDayOfYear(d, p) {\n        return pad(1 + __WEBPACK_IMPORTED_MODULE_0_d3_time__.l.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d), p, 3);\n    }\n    function formatUTCMilliseconds(d, p) {\n        return pad(d.getUTCMilliseconds(), p, 3);\n    }\n    function formatUTCMicroseconds(d, p) {\n        return formatUTCMilliseconds(d, p) + \"000\";\n    }\n    function formatUTCMonthNumber(d, p) {\n        return pad(d.getUTCMonth() + 1, p, 2);\n    }\n    function formatUTCMinutes(d, p) {\n        return pad(d.getUTCMinutes(), p, 2);\n    }\n    function formatUTCSeconds(d, p) {\n        return pad(d.getUTCSeconds(), p, 2);\n    }\n    function formatUTCWeekdayNumberMonday(d) {\n        var dow = d.getUTCDay();\n        return 0 === dow ? 7 : dow;\n    }\n    function formatUTCWeekNumberSunday(d, p) {\n        return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.s.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d), p, 2);\n    }\n    function formatUTCWeekNumberISO(d, p) {\n        var day = d.getUTCDay();\n        return d = day >= 4 || 0 === day ? Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.t)(d) : __WEBPACK_IMPORTED_MODULE_0_d3_time__.t.ceil(d), \n        pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.t.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d) + (4 === Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d).getUTCDay()), p, 2);\n    }\n    function formatUTCWeekdayNumberSunday(d) {\n        return d.getUTCDay();\n    }\n    function formatUTCWeekNumberMonday(d, p) {\n        return pad(__WEBPACK_IMPORTED_MODULE_0_d3_time__.p.count(Object(__WEBPACK_IMPORTED_MODULE_0_d3_time__.v)(d), d), p, 2);\n    }\n    function formatUTCYear(d, p) {\n        return pad(d.getUTCFullYear() % 100, p, 2);\n    }\n    function formatUTCFullYear(d, p) {\n        return pad(d.getUTCFullYear() % 1e4, p, 4);\n    }\n    function formatUTCZone() {\n        return \"+0000\";\n    }\n    function formatLiteralPercent() {\n        return \"%\";\n    }\n    function formatUnixTimestamp(d) {\n        return +d;\n    }\n    function formatUnixTimestampSeconds(d) {\n        return Math.floor(+d / 1e3);\n    }\n    __webpack_exports__.a = formatLocale;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_time__ = __webpack_require__(212), pads = {\n        \"-\": \"\",\n        _: \" \",\n        \"0\": \"0\"\n    }, numberRe = /^\\s*\\d+/, percentRe = /^%/, requoteRe = /[\\\\^$*+?|[\\]().{}]/g;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function formatIsoNative(date) {\n        return date.toISOString();\n    }\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return isoSpecifier;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0__defaultLocale__ = __webpack_require__(213), isoSpecifier = \"%Y-%m-%dT%H:%M:%S.%LZ\";\n    Date.prototype.toISOString || Object(__WEBPACK_IMPORTED_MODULE_0__defaultLocale__.b)(isoSpecifier);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_6__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__component_Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_9__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), ReferenceDot = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function ReferenceDot() {\n            return _classCallCheck(this, ReferenceDot), _possibleConstructorReturn(this, (ReferenceDot.__proto__ || Object.getPrototypeOf(ReferenceDot)).apply(this, arguments));\n        }\n        return _inherits(ReferenceDot, _Component), _createClass(ReferenceDot, [ {\n            key: \"getCoordinate\",\n            value: function() {\n                var _props = this.props, x = _props.x, y = _props.y, xAxis = _props.xAxis, yAxis = _props.yAxis, xScale = xAxis.scale, yScale = yAxis.scale, result = {\n                    cx: xScale(x) + (xScale.bandwidth ? xScale.bandwidth() / 2 : 0),\n                    cy: yScale(y) + (yScale.bandwidth ? yScale.bandwidth() / 2 : 0)\n                };\n                return Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.D)(result.cx, xScale) && Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.D)(result.cy, yScale) ? result : null;\n            }\n        }, {\n            key: \"renderDot\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__shape_Dot__.a, _extends({}, props, {\n                    cx: props.cx,\n                    cy: props.cy,\n                    className: \"recharts-reference-dot-dot\"\n                }));\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, x = _props2.x, y = _props2.y, r = _props2.r, isX = Object(__WEBPACK_IMPORTED_MODULE_9__util_DataUtils__.g)(x), isY = Object(__WEBPACK_IMPORTED_MODULE_9__util_DataUtils__.g)(y);\n                if (!isX || !isY) return null;\n                var coordinate = this.getCoordinate();\n                if (!coordinate) return null;\n                var _props3 = this.props, shape = _props3.shape, className = _props3.className, dotProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.e)(this.props), coordinate);\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__container_Layer__.a, {\n                    className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()(\"recharts-reference-dot\", className)\n                }, this.renderDot(shape, dotProps), __WEBPACK_IMPORTED_MODULE_8__component_Label__.a.renderCallByParent(this.props, {\n                    x: coordinate.cx - r,\n                    y: coordinate.cy - r,\n                    width: 2 * r,\n                    height: 2 * r\n                }));\n            }\n        } ]), ReferenceDot;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = \"ReferenceDot\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.a, {\n        r: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            scale: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func\n        }),\n        yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            scale: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func\n        }),\n        isFront: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        alwaysShow: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        xAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        shape: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ])\n    }), _class2.defaultProps = {\n        isFront: !1,\n        alwaysShow: !1,\n        xAxisId: 0,\n        yAxisId: 0,\n        r: 10,\n        fill: \"#fff\",\n        stroke: \"#ccc\",\n        fillOpacity: 1,\n        strokeWidth: 1\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = ReferenceDot;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__component_Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__ = __webpack_require__(16), _slicedToArray = function() {\n        function sliceIterator(arr, i) {\n            var _arr = [], _n = !0, _d = !1, _e = void 0;\n            try {\n                for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value), \n                !i || _arr.length !== i); _n = !0) ;\n            } catch (err) {\n                _d = !0, _e = err;\n            } finally {\n                try {\n                    !_n && _i.return && _i.return();\n                } finally {\n                    if (_d) throw _e;\n                }\n            }\n            return _arr;\n        }\n        return function(arr, i) {\n            if (Array.isArray(arr)) return arr;\n            if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);\n            throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n        };\n    }(), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, renderLine = function(option, props) {\n        return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"line\", _extends({}, props, {\n            className: \"recharts-reference-line-line\"\n        }));\n    }, ReferenceLine = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function ReferenceLine() {\n            return _classCallCheck(this, ReferenceLine), _possibleConstructorReturn(this, (ReferenceLine.__proto__ || Object.getPrototypeOf(ReferenceLine)).apply(this, arguments));\n        }\n        return _inherits(ReferenceLine, _Component), _createClass(ReferenceLine, [ {\n            key: \"getEndPoints\",\n            value: function(isX, isY) {\n                var _props = this.props, xAxis = _props.xAxis, yAxis = _props.yAxis, viewBox = _props.viewBox, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height;\n                if (isY) {\n                    var value = this.props.y, scale = yAxis.scale, offset = scale.bandwidth ? scale.bandwidth() / 2 : 0, coord = scale(value) + offset;\n                    if (Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(coord, scale)) return \"left\" === yAxis.orientation ? [ {\n                        x: x,\n                        y: coord\n                    }, {\n                        x: x + width,\n                        y: coord\n                    } ] : [ {\n                        x: x + width,\n                        y: coord\n                    }, {\n                        x: x,\n                        y: coord\n                    } ];\n                } else if (isX) {\n                    var _value = this.props.x, _scale = xAxis.scale, _offset = _scale.bandwidth ? _scale.bandwidth() / 2 : 0, _coord = _scale(_value) + _offset;\n                    if (Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(_coord, _scale)) return \"top\" === xAxis.orientation ? [ {\n                        x: _coord,\n                        y: y\n                    }, {\n                        x: _coord,\n                        y: y + height\n                    } ] : [ {\n                        x: _coord,\n                        y: y + height\n                    }, {\n                        x: _coord,\n                        y: y\n                    } ];\n                }\n                return null;\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, x = _props2.x, y = _props2.y, shape = _props2.shape, className = _props2.className, isX = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(x), isY = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(y);\n                if (!isX && !isY) return null;\n                var endPoints = this.getEndPoints(isX, isY);\n                if (!endPoints) return null;\n                var _endPoints = _slicedToArray(endPoints, 2), start = _endPoints[0], end = _endPoints[1], props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.e)(this.props), {\n                    x1: start.x,\n                    y1: start.y,\n                    x2: end.x,\n                    y2: end.y\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__container_Layer__.a, {\n                    className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()(\"recharts-reference-line\", className)\n                }, renderLine(shape, props), __WEBPACK_IMPORTED_MODULE_7__component_Label__.a.renderCallByParent(this.props, {\n                    x: Math.min(props.x1, props.x2),\n                    y: Math.min(props.y1, props.y2),\n                    width: Math.abs(props.x2 - props.x1),\n                    height: Math.abs(props.y2 - props.y1)\n                }));\n            }\n        } ]), ReferenceLine;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = \"ReferenceLine\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.c, {\n        viewBox: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number\n        }),\n        xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        isFront: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        alwaysShow: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        xAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        shape: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func\n    }), _class2.defaultProps = {\n        isFront: !1,\n        alwaysShow: !1,\n        xAxisId: 0,\n        yAxisId: 0,\n        fill: \"none\",\n        stroke: \"#ccc\",\n        fillOpacity: 1,\n        strokeWidth: 1\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = ReferenceLine;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_6__component_Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__ = __webpack_require__(70), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), ReferenceArea = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function ReferenceArea() {\n            return _classCallCheck(this, ReferenceArea), _possibleConstructorReturn(this, (ReferenceArea.__proto__ || Object.getPrototypeOf(ReferenceArea)).apply(this, arguments));\n        }\n        return _inherits(ReferenceArea, _Component), _createClass(ReferenceArea, [ {\n            key: \"getRect\",\n            value: function(hasX1, hasX2, hasY1, hasY2) {\n                var _props = this.props, xValue1 = _props.x1, xValue2 = _props.x2, yValue1 = _props.y1, yValue2 = _props.y2, xAxis = _props.xAxis, yAxis = _props.yAxis, xScale = xAxis.scale, yScale = yAxis.scale, xOffset = xScale.bandwidth ? xScale.bandwidth() / 2 : 0, yOffset = yScale.bandwidth ? yScale.bandwidth() / 2 : 0, xRange = xScale.range(), yRange = yScale.range(), x1 = void 0, x2 = void 0, y1 = void 0, y2 = void 0;\n                return x1 = hasX1 ? xScale(xValue1) + xOffset : xRange[0], x2 = hasX2 ? xScale(xValue2) + xOffset : xRange[1], \n                y1 = hasY1 ? yScale(yValue1) + yOffset : yRange[0], y2 = hasY2 ? yScale(yValue2) + yOffset : yRange[1], \n                Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(x1, xScale) && Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(x2, xScale) && Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(y1, yScale) && Object(__WEBPACK_IMPORTED_MODULE_9__util_ChartUtils__.D)(y2, yScale) ? {\n                    x: Math.min(x1, x2),\n                    y: Math.min(y1, y2),\n                    width: Math.abs(x2 - x1),\n                    height: Math.abs(y2 - y1)\n                } : null;\n            }\n        }, {\n            key: \"renderRect\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__.a, _extends({}, props, {\n                    className: \"recharts-reference-area-rect\"\n                }));\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, x1 = _props2.x1, x2 = _props2.x2, y1 = _props2.y1, y2 = _props2.y2, className = _props2.className, hasX1 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(x1), hasX2 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(x2), hasY1 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(y1), hasY2 = Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(y2);\n                if (!(hasX1 || hasX2 || hasY1 || hasY2)) return null;\n                var rect = this.getRect(hasX1, hasX2, hasY1, hasY2);\n                if (!rect) return null;\n                var shape = this.props.shape;\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__container_Layer__.a, {\n                    className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()(\"recharts-reference-area\", className)\n                }, this.renderRect(shape, _extends({}, this.props, rect)), __WEBPACK_IMPORTED_MODULE_6__component_Label__.a.renderCallByParent(this.props, rect));\n            }\n        } ]), ReferenceArea;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = \"ReferenceArea\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, {\n        viewBox: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number\n        }),\n        xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        isFront: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        alwaysShow: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        x1: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        x2: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        y1: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        y2: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string ]),\n        yAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        xAxisId: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        shape: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ])\n    }), _class2.defaultProps = {\n        isFront: !1,\n        alwaysShow: !1,\n        xAxisId: 0,\n        yAxisId: 0,\n        r: 10,\n        fill: \"#ccc\",\n        fillOpacity: .5,\n        stroke: \"none\",\n        strokeWidth: 1\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = ReferenceArea;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Cross = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Cross() {\n            return _classCallCheck(this, Cross), _possibleConstructorReturn(this, (Cross.__proto__ || Object.getPrototypeOf(Cross)).apply(this, arguments));\n        }\n        return _inherits(Cross, _Component), _createClass(Cross, [ {\n            key: \"getPath\",\n            value: function(x, y, width, height, top, left) {\n                return \"M\" + x + \",\" + top + \"v\" + height + \"M\" + left + \",\" + y + \"h\" + width;\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, x = _props.x, y = _props.y, width = _props.width, height = _props.height, top = _props.top, left = _props.left, className = _props.className;\n                return Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.h)(y) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.h)(width) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.h)(height) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.h)(top) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.h)(left) ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), {\n                    className: __WEBPACK_IMPORTED_MODULE_2_classnames___default()(\"recharts-cross\", className),\n                    d: this.getPath(x, y, width, height, top, left)\n                })) : null;\n            }\n        } ]), Cross;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"Cross\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, {\n        x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        top: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        left: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string\n    }), _class2.defaultProps = {\n        x: 0,\n        y: 0,\n        top: 0,\n        left: 0,\n        width: 0,\n        height: 0\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = Cross;\n}, function(module, exports, __webpack_require__) {\n    function maxBy(array, iteratee) {\n        return array && array.length ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt) : void 0;\n    }\n    var baseExtremum = __webpack_require__(135), baseGt = __webpack_require__(327), baseIteratee = __webpack_require__(89);\n    module.exports = maxBy;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject__ = __webpack_require__(925), __WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject__), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_4_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_4_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react__), __WEBPACK_IMPORTED_MODULE_5_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_5_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_prop_types__), __WEBPACK_IMPORTED_MODULE_6_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_6_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react_smooth__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__shape_Sector__ = __webpack_require__(139), __WEBPACK_IMPORTED_MODULE_11__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_12__component_Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_13__component_Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_14__component_LabelList__ = __webpack_require__(47), __WEBPACK_IMPORTED_MODULE_15__component_Cell__ = __webpack_require__(88), __WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_18__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_20__util_LogUtils__ = __webpack_require__(312), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Pie = Object(__WEBPACK_IMPORTED_MODULE_8__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Pie() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Pie);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Pie.__proto__ || Object.getPrototypeOf(Pie)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isAnimationFinished: !1,\n                isAnimationStarted: !1\n            }, _this.id = Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.k)(\"recharts-pie-\"), \n            _this.cachePrevData = function(sectors) {\n                _this.setState({\n                    prevSectors: sectors\n                });\n            }, _this.handleAnimationEnd = function() {\n                _this.setState({\n                    isAnimationFinished: !0\n                });\n            }, _this.handleAnimationStart = function() {\n                _this.setState({\n                    isAnimationStarted: !0\n                });\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Pie, _Component), _createClass(Pie, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, animationId = _props.animationId, sectors = _props.sectors;\n                nextProps.isAnimationActive !== this.props.isAnimationActive ? this.cachePrevData([]) : nextProps.animationId !== animationId && this.cachePrevData(sectors);\n            }\n        }, {\n            key: \"getTextAnchor\",\n            value: function(x, cx) {\n                return x > cx ? \"start\" : x < cx ? \"end\" : \"middle\";\n            }\n        }, {\n            key: \"isActiveIndex\",\n            value: function(i) {\n                var activeIndex = this.props.activeIndex;\n                return Array.isArray(activeIndex) ? -1 !== activeIndex.indexOf(i) : i === activeIndex;\n            }\n        }, {\n            key: \"renderLabelLineItem\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__shape_Curve__.a, _extends({}, props, {\n                    type: \"linear\",\n                    className: \"recharts-pie-label-line\"\n                }));\n            }\n        }, {\n            key: \"renderLabelItem\",\n            value: function(option, props, value) {\n                if (__WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option)) return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props);\n                var label = value;\n                return __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) && (label = option(props), \n                __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(label)) ? label : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_12__component_Text__.a, _extends({}, props, {\n                    alignmentBaseline: \"middle\",\n                    className: \"recharts-pie-label-text\"\n                }), label);\n            }\n        }, {\n            key: \"renderLabels\",\n            value: function(sectors) {\n                var _this2 = this;\n                if (this.props.isAnimationActive && !this.state.isAnimationFinished) return null;\n                var _props2 = this.props, label = _props2.label, labelLine = _props2.labelLine, dataKey = _props2.dataKey, valueKey = _props2.valueKey, pieProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(this.props), customLabelProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(label), customLabelLineProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(labelLine), offsetRadius = label && label.offsetRadius || 20, labels = sectors.map(function(entry, i) {\n                    var midAngle = (entry.startAngle + entry.endAngle) / 2, endPoint = Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.e)(entry.cx, entry.cy, entry.outerRadius + offsetRadius, midAngle), labelProps = _extends({}, pieProps, entry, {\n                        stroke: \"none\"\n                    }, customLabelProps, {\n                        index: i,\n                        textAnchor: _this2.getTextAnchor(endPoint.x, entry.cx)\n                    }, endPoint), lineProps = _extends({}, pieProps, entry, {\n                        fill: \"none\",\n                        stroke: entry.fill\n                    }, customLabelLineProps, {\n                        index: i,\n                        points: [ Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.e)(entry.cx, entry.cy, entry.outerRadius, midAngle), endPoint ]\n                    }), realDataKey = dataKey;\n                    return __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(valueKey) ? realDataKey = \"value\" : __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && (realDataKey = valueKey), \n                    __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {\n                        key: \"label-\" + i\n                    }, labelLine && _this2.renderLabelLineItem(labelLine, lineProps), _this2.renderLabelItem(label, labelProps, Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey)));\n                });\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {\n                    className: \"recharts-pie-labels\"\n                }, labels);\n            }\n        }, {\n            key: \"renderSectorItem\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_2_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isPlainObject___default()(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Sector__.a, _extends({}, props, option)) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Sector__.a, props);\n            }\n        }, {\n            key: \"renderSectorsStatically\",\n            value: function(sectors) {\n                var _this3 = this, activeShape = this.props.activeShape;\n                return sectors.map(function(entry, i) {\n                    return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, _extends({\n                        className: \"recharts-pie-sector\"\n                    }, Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.f)(_this3.props, entry, i), {\n                        key: \"sector-\" + i\n                    }), _this3.renderSectorItem(_this3.isActiveIndex(i) ? activeShape : null, entry));\n                });\n            }\n        }, {\n            key: \"renderSectorsWithAnimation\",\n            value: function() {\n                var _this4 = this, _props3 = this.props, sectors = _props3.sectors, isAnimationActive = _props3.isAnimationActive, animationBegin = _props3.animationBegin, animationDuration = _props3.animationDuration, animationEasing = _props3.animationEasing, animationId = _props3.animationId, prevSectors = this.state.prevSectors;\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6_react_smooth___default.a, {\n                    begin: animationBegin,\n                    duration: animationDuration,\n                    isActive: isAnimationActive,\n                    easing: animationEasing,\n                    from: {\n                        t: 0\n                    },\n                    to: {\n                        t: 1\n                    },\n                    key: \"pie-\" + animationId,\n                    onAnimationEnd: this.handleAnimationEnd\n                }, function(_ref2) {\n                    var t = _ref2.t, stepData = [], first = sectors && sectors[0], curAngle = first.startAngle;\n                    return sectors.forEach(function(entry, index) {\n                        var prev = prevSectors && prevSectors[index], paddingAngle = index > 0 ? entry.paddingAngle : 0;\n                        if (prev) {\n                            var angleIp = Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.f)(prev.endAngle - prev.startAngle, entry.endAngle - entry.startAngle), latest = _extends({}, entry, {\n                                startAngle: curAngle + paddingAngle,\n                                endAngle: curAngle + angleIp(t) + paddingAngle\n                            });\n                            stepData.push(latest), curAngle = latest.endAngle;\n                        } else {\n                            var endAngle = entry.endAngle, startAngle = entry.startAngle, interpolatorAngle = Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.f)(0, endAngle - startAngle), deltaAngle = interpolatorAngle(t), _latest = _extends({}, entry, {\n                                startAngle: curAngle + paddingAngle,\n                                endAngle: curAngle + deltaAngle + paddingAngle\n                            });\n                            stepData.push(_latest), curAngle = _latest.endAngle;\n                        }\n                    }), __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, null, _this4.renderSectorsStatically(stepData));\n                });\n            }\n        }, {\n            key: \"renderSectors\",\n            value: function() {\n                var _props4 = this.props, sectors = _props4.sectors, isAnimationActive = _props4.isAnimationActive, prevSectors = this.state.prevSectors;\n                return !(isAnimationActive && sectors && sectors.length) || prevSectors && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevSectors, sectors) ? this.renderSectorsStatically(sectors) : this.renderSectorsWithAnimation();\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props5 = this.props, hide = _props5.hide, sectors = _props5.sectors, className = _props5.className, label = _props5.label, cx = _props5.cx, cy = _props5.cy, innerRadius = _props5.innerRadius, outerRadius = _props5.outerRadius, isAnimationActive = _props5.isAnimationActive, id = _props5.id;\n                if (hide || !sectors || !sectors.length || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.h)(cx) || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.h)(cy) || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.h)(innerRadius) || !Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.h)(outerRadius)) return null;\n                var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_7_classnames___default()(\"recharts-pie\", className);\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, {\n                    className: layerClass\n                }, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(\"g\", {\n                    clipPath: \"url(#\" + (__WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(id) ? this.id : id) + \")\"\n                }, this.renderSectors()), label && this.renderLabels(sectors), __WEBPACK_IMPORTED_MODULE_13__component_Label__.a.renderCallByParent(this.props, null, !1), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_14__component_LabelList__.a.renderCallByParent(this.props, sectors, !1));\n            }\n        } ]), Pie;\n    }(__WEBPACK_IMPORTED_MODULE_4_react__.Component), _class2.displayName = \"Pie\", _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.a, {\n        className: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string,\n        animationId: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        cx: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        cy: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        startAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        endAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        paddingAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        innerRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        outerRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        cornerRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string ]),\n        dataKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]).isRequired,\n        nameKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),\n        valueKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),\n        data: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object),\n        minAngle: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        legendType: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.b),\n        maxRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        sectors: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object),\n        hide: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,\n        labelLine: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool ]),\n        label: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({\n            offsetRadius: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number\n        }), __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool ]),\n        activeShape: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element ]),\n        activeIndex: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number) ]),\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.bool,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"spring\", \"linear\" ]),\n        id: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string\n    }), _class2.defaultProps = {\n        stroke: \"#fff\",\n        fill: \"#808080\",\n        legendType: \"rect\",\n        cx: \"50%\",\n        cy: \"50%\",\n        startAngle: 0,\n        endAngle: 360,\n        innerRadius: 0,\n        outerRadius: \"80%\",\n        paddingAngle: 0,\n        labelLine: !0,\n        hide: !1,\n        minAngle: 0,\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.n)(),\n        animationBegin: 400,\n        animationDuration: 1500,\n        animationEasing: \"ease\",\n        nameKey: \"name\"\n    }, _class2.parseDeltaAngle = function(_ref3) {\n        var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle;\n        return Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.j)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360);\n    }, _class2.getRealPieData = function(item) {\n        var _item$props = item.props, data = _item$props.data, children = _item$props.children, presentationProps = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.k)(item.props), cells = Object(__WEBPACK_IMPORTED_MODULE_16__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_15__component_Cell__.a);\n        return data && data.length ? data.map(function(entry, index) {\n            return _extends({\n                payload: entry\n            }, presentationProps, entry, cells && cells[index] && cells[index].props);\n        }) : cells && cells.length ? cells.map(function(cell) {\n            return _extends({}, presentationProps, cell.props);\n        }) : [];\n    }, _class2.parseCoordinateOfPie = function(item, offset) {\n        var top = offset.top, left = offset.left, width = offset.width, height = offset.height, maxPieRadius = Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.c)(width, height);\n        return {\n            cx: left + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.d)(item.props.cx, width, width / 2),\n            cy: top + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.d)(item.props.cy, height, height / 2),\n            innerRadius: Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.d)(item.props.innerRadius, maxPieRadius, 0),\n            outerRadius: Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.d)(item.props.outerRadius, maxPieRadius, .8 * maxPieRadius),\n            maxRadius: item.props.maxRadius || Math.sqrt(width * width + height * height) / 2\n        };\n    }, _class2.getComposedData = function(_ref4) {\n        var item = _ref4.item, offset = _ref4.offset, onItemMouseLeave = _ref4.onItemMouseLeave, onItemMouseEnter = _ref4.onItemMouseEnter, pieData = Pie.getRealPieData(item);\n        if (!pieData || !pieData.length) return [];\n        var _item$props2 = item.props, cornerRadius = _item$props2.cornerRadius, startAngle = _item$props2.startAngle, endAngle = _item$props2.endAngle, paddingAngle = _item$props2.paddingAngle, dataKey = _item$props2.dataKey, nameKey = _item$props2.nameKey, valueKey = _item$props2.valueKey, minAngle = Math.abs(item.props.minAngle), coordinate = Pie.parseCoordinateOfPie(item, offset), len = pieData.length, deltaAngle = Pie.parseDeltaAngle({\n            startAngle: startAngle,\n            endAngle: endAngle\n        }), absDeltaAngle = Math.abs(deltaAngle), totalPadingAngle = (absDeltaAngle >= 360 ? len : len - 1) * paddingAngle, realTotalAngle = absDeltaAngle - len * minAngle - totalPadingAngle, realDataKey = dataKey;\n        __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(valueKey) ? (Object(__WEBPACK_IMPORTED_MODULE_20__util_LogUtils__.a)(!1, 'Use \"dataKey\" to specify the value of pie,\\n      the props \"valueKey\" will be deprecated in 1.1.0'), \n        realDataKey = \"value\") : __WEBPACK_IMPORTED_MODULE_3_lodash_isNil___default()(dataKey) && (Object(__WEBPACK_IMPORTED_MODULE_20__util_LogUtils__.a)(!1, 'Use \"dataKey\" to specify the value of pie,\\n      the props \"valueKey\" will be deprecated in 1.1.0'), \n        realDataKey = valueKey);\n        var sum = pieData.reduce(function(result, entry) {\n            var val = Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey, 0);\n            return result + (Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.h)(val) ? val : 0);\n        }, 0), sectors = void 0;\n        if (sum > 0) {\n            var prev = void 0;\n            sectors = pieData.map(function(entry, i) {\n                var val = Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey, 0), name = Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, nameKey, i), percent = (Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.h)(val) ? val : 0) / sum, tempStartAngle = void 0;\n                tempStartAngle = i ? prev.endAngle + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.j)(deltaAngle) * paddingAngle : startAngle;\n                var tempEndAngle = tempStartAngle + Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.j)(deltaAngle) * (minAngle + percent * realTotalAngle), midAngle = (tempStartAngle + tempEndAngle) / 2, middleRadius = (coordinate.innerRadius + coordinate.outerRadius) / 2, tooltipPayload = [ {\n                    name: name,\n                    value: val,\n                    payload: entry\n                } ], tooltipPosition = Object(__WEBPACK_IMPORTED_MODULE_17__util_PolarUtils__.e)(coordinate.cx, coordinate.cy, middleRadius, midAngle);\n                return prev = _extends({\n                    percent: percent,\n                    cornerRadius: cornerRadius,\n                    name: name,\n                    tooltipPayload: tooltipPayload,\n                    midAngle: midAngle,\n                    middleRadius: middleRadius,\n                    tooltipPosition: tooltipPosition\n                }, entry, coordinate, {\n                    value: Object(__WEBPACK_IMPORTED_MODULE_19__util_ChartUtils__.w)(entry, realDataKey),\n                    startAngle: tempStartAngle,\n                    endAngle: tempEndAngle,\n                    payload: entry,\n                    paddingAngle: Object(__WEBPACK_IMPORTED_MODULE_18__util_DataUtils__.j)(deltaAngle) * paddingAngle\n                });\n            });\n        }\n        return _extends({}, coordinate, {\n            sectors: sectors,\n            data: pieData,\n            onMouseLeave: onItemMouseLeave,\n            onMouseEnter: onItemMouseEnter\n        });\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Pie;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_4_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_smooth__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_11__shape_Polygon__ = __webpack_require__(214), __WEBPACK_IMPORTED_MODULE_12__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_13__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_14__component_LabelList__ = __webpack_require__(47), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Radar = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Radar() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Radar);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Radar.__proto__ || Object.getPrototypeOf(Radar)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isAnimationFinished: !1\n            }, _this.cachePrevData = function(points) {\n                _this.setState({\n                    prevPoints: points\n                });\n            }, _this.handleAnimationEnd = function() {\n                _this.setState({\n                    isAnimationFinished: !0\n                });\n            }, _this.handleAnimationStart = function() {\n                _this.setState({\n                    isAnimationFinished: !1\n                });\n            }, _this.handleMouseEnter = function(e) {\n                var onMouseEnter = _this.props.onMouseEnter;\n                onMouseEnter && onMouseEnter(_this.props, e);\n            }, _this.handleMouseLeave = function(e) {\n                var onMouseLeave = _this.props.onMouseLeave;\n                onMouseLeave && onMouseLeave(_this.props, e);\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Radar, _Component), _createClass(Radar, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, animationId = _props.animationId, points = _props.points;\n                nextProps.animationId !== animationId && this.cachePrevData(points);\n            }\n        }, {\n            key: \"renderDotItem\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_12__shape_Dot__.a, _extends({}, props, {\n                    className: \"recharts-radar-dot\"\n                }));\n            }\n        }, {\n            key: \"renderDots\",\n            value: function(points) {\n                var _this2 = this, _props2 = this.props, dot = _props2.dot, dataKey = _props2.dataKey, baseProps = Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.k)(this.props), customDotProps = Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.k)(dot), dots = points.map(function(entry, i) {\n                    var dotProps = _extends({\n                        key: \"dot-\" + i,\n                        r: 3\n                    }, baseProps, customDotProps, {\n                        dataKey: dataKey,\n                        cx: entry.x,\n                        cy: entry.y,\n                        index: i,\n                        playload: entry\n                    });\n                    return _this2.renderDotItem(dot, dotProps);\n                });\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__container_Layer__.a, {\n                    className: \"recharts-radar-dots\"\n                }, dots);\n            }\n        }, {\n            key: \"renderPolygonStatically\",\n            value: function(points) {\n                var _props3 = this.props, shape = _props3.shape, dot = _props3.dot, radar = void 0;\n                return radar = __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(shape) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(shape, _extends({}, this.props, {\n                    points: points\n                })) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(shape) ? shape(_extends({}, this.props, {\n                    points: points\n                })) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_11__shape_Polygon__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.e)(this.props), {\n                    onMouseEnter: this.handleMouseEnter,\n                    onMouseLeave: this.handleMouseLeave\n                }, Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.k)(this.props), {\n                    points: points\n                })), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__container_Layer__.a, {\n                    className: \"recharts-radar-polygon\"\n                }, radar, dot ? this.renderDots(points) : null);\n            }\n        }, {\n            key: \"renderPolygonWithAnimation\",\n            value: function() {\n                var _this3 = this, _props4 = this.props, points = _props4.points, isAnimationActive = _props4.isAnimationActive, animationBegin = _props4.animationBegin, animationDuration = _props4.animationDuration, animationEasing = _props4.animationEasing, animationId = _props4.animationId, prevPoints = this.state.prevPoints;\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_smooth___default.a, {\n                    begin: animationBegin,\n                    duration: animationDuration,\n                    isActive: isAnimationActive,\n                    easing: animationEasing,\n                    from: {\n                        t: 0\n                    },\n                    to: {\n                        t: 1\n                    },\n                    key: \"radar-\" + animationId,\n                    onAnimationEnd: this.handleAnimationEnd,\n                    onAnimationStart: this.handleAnimationStart\n                }, function(_ref2) {\n                    var t = _ref2.t, stepData = points.map(function(entry, index) {\n                        var prev = prevPoints && prevPoints[index];\n                        if (prev) {\n                            var _interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.f)(prev.x, entry.x), _interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.f)(prev.y, entry.y);\n                            return _extends({}, entry, {\n                                x: _interpolatorX(t),\n                                y: _interpolatorY(t)\n                            });\n                        }\n                        var interpolatorX = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.f)(entry.cx, entry.x), interpolatorY = Object(__WEBPACK_IMPORTED_MODULE_6__util_DataUtils__.f)(entry.cy, entry.y);\n                        return _extends({}, entry, {\n                            x: interpolatorX(t),\n                            y: interpolatorY(t)\n                        });\n                    });\n                    return _this3.renderPolygonStatically(stepData);\n                });\n            }\n        }, {\n            key: \"renderPolygon\",\n            value: function() {\n                var _props5 = this.props, points = _props5.points, isAnimationActive = _props5.isAnimationActive, prevPoints = this.state.prevPoints;\n                return !(isAnimationActive && points && points.length) || prevPoints && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevPoints, points) ? this.renderPolygonStatically(points) : this.renderPolygonWithAnimation();\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props6 = this.props, hide = _props6.hide, className = _props6.className, points = _props6.points, isAnimationActive = _props6.isAnimationActive;\n                if (hide || !points || !points.length) return null;\n                var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_5_classnames___default()(\"recharts-radar\", className);\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_13__container_Layer__.a, {\n                    className: layerClass\n                }, this.renderPolygon(), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_14__component_LabelList__.a.renderCallByParent(this.props, points));\n            }\n        } ]), Radar;\n    }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = \"Radar\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.c, {\n        className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        dataKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]).isRequired,\n        angleAxisId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number ]),\n        radiusAxisId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number ]),\n        points: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            cx: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            cy: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            angle: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            radius: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            value: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            payload: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object\n        })),\n        shape: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),\n        activeDot: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool ]),\n        dot: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool ]),\n        label: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool ]),\n        legendType: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.b),\n        hide: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        onMouseEnter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        onMouseLeave: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        onClick: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        animationId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ])\n    }), _class2.defaultProps = {\n        angleAxisId: 0,\n        radiusAxisId: 0,\n        hide: !1,\n        activeDot: !0,\n        dot: !1,\n        legendType: \"rect\",\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_8__util_ReactUtils__.n)(),\n        animationBegin: 0,\n        animationDuration: 1500,\n        animationEasing: \"ease\"\n    }, _class2.getComposedData = function(_ref3) {\n        var radiusAxis = _ref3.radiusAxis, angleAxis = _ref3.angleAxis, displayedData = _ref3.displayedData, dataKey = _ref3.dataKey, bandSize = _ref3.bandSize, cx = angleAxis.cx, cy = angleAxis.cy;\n        return {\n            points: displayedData.map(function(entry, i) {\n                var name = Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry, angleAxis.dataKey, i), value = Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry, dataKey, 0), angle = angleAxis.scale(name) + (bandSize || 0), radius = radiusAxis.scale(value);\n                return _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, angle), {\n                    name: name,\n                    value: value,\n                    cx: cx,\n                    cy: cy,\n                    radius: radius,\n                    angle: angle,\n                    payload: entry\n                });\n            })\n        };\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Radar;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_2_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_6_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react_smooth__), __WEBPACK_IMPORTED_MODULE_7__shape_Sector__ = __webpack_require__(139), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_11__component_LabelList__ = __webpack_require__(47), __WEBPACK_IMPORTED_MODULE_12__component_Cell__ = __webpack_require__(88), __WEBPACK_IMPORTED_MODULE_13__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), RadialBar = Object(__WEBPACK_IMPORTED_MODULE_10__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function RadialBar() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, RadialBar);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = RadialBar.__proto__ || Object.getPrototypeOf(RadialBar)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isAnimationFinished: !1\n            }, _this.cachePrevData = function(data) {\n                _this.setState({\n                    prevData: data\n                });\n            }, _this.handleAnimationEnd = function() {\n                _this.setState({\n                    isAnimationFinished: !0\n                });\n            }, _this.handleAnimationStart = function() {\n                _this.setState({\n                    isAnimationFinished: !1\n                });\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(RadialBar, _Component), _createClass(RadialBar, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, animationId = _props.animationId, data = _props.data;\n                nextProps.animationId !== animationId && this.cachePrevData(data);\n            }\n        }, {\n            key: \"getDeltaAngle\",\n            value: function() {\n                var _props2 = this.props, startAngle = _props2.startAngle, endAngle = _props2.endAngle;\n                return Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.j)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360);\n            }\n        }, {\n            key: \"renderSectorShape\",\n            value: function(shape, props) {\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.isValidElement(shape) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.cloneElement(shape, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(shape) ? shape(props) : __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__shape_Sector__.a, props);\n            }\n        }, {\n            key: \"renderSectorsStatically\",\n            value: function(sectors) {\n                var _this2 = this, _props3 = this.props, shape = _props3.shape, activeShape = _props3.activeShape, activeIndex = _props3.activeIndex, cornerRadius = _props3.cornerRadius, others = _objectWithoutProperties(_props3, [ \"shape\", \"activeShape\", \"activeIndex\", \"cornerRadius\" ]), baseProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others);\n                return sectors.map(function(entry, i) {\n                    var props = _extends({}, baseProps, {\n                        cornerRadius: cornerRadius\n                    }, entry, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this2.props, entry, i), {\n                        key: \"sector-\" + i,\n                        className: \"recharts-radial-bar-sector\"\n                    });\n                    return _this2.renderSectorShape(i === activeIndex ? activeShape : shape, props);\n                });\n            }\n        }, {\n            key: \"renderSectorsWithAnimation\",\n            value: function() {\n                var _this3 = this, _props4 = this.props, data = _props4.data, isAnimationActive = _props4.isAnimationActive, animationBegin = _props4.animationBegin, animationDuration = _props4.animationDuration, animationEasing = _props4.animationEasing, animationId = _props4.animationId, prevData = this.state.prevData;\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6_react_smooth___default.a, {\n                    begin: animationBegin,\n                    duration: animationDuration,\n                    isActive: isAnimationActive,\n                    easing: animationEasing,\n                    from: {\n                        t: 0\n                    },\n                    to: {\n                        t: 1\n                    },\n                    key: \"radialBar-\" + animationId,\n                    onAnimationStart: this.handleAnimationStart,\n                    onAnimationEnd: this.handleAnimationEnd\n                }, function(_ref2) {\n                    var t = _ref2.t, stepData = data.map(function(entry, index) {\n                        var prev = prevData && prevData[index];\n                        if (prev) {\n                            var interpolatorStartAngle = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(prev.startAngle, entry.startAngle), interpolatorEndAngle = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(prev.endAngle, entry.endAngle);\n                            return _extends({}, entry, {\n                                startAngle: interpolatorStartAngle(t),\n                                endAngle: interpolatorEndAngle(t)\n                            });\n                        }\n                        var endAngle = entry.endAngle, startAngle = entry.startAngle, interpolator = Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.f)(startAngle, endAngle);\n                        return _extends({}, entry, {\n                            endAngle: interpolator(t)\n                        });\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, null, _this3.renderSectorsStatically(stepData));\n                });\n            }\n        }, {\n            key: \"renderSectors\",\n            value: function() {\n                var _props5 = this.props, data = _props5.data, isAnimationActive = _props5.isAnimationActive, prevData = this.state.prevData;\n                return !(isAnimationActive && data && data.length) || prevData && __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(prevData, data) ? this.renderSectorsStatically(data) : this.renderSectorsWithAnimation();\n            }\n        }, {\n            key: \"renderBackground\",\n            value: function(sectors) {\n                var _this4 = this, cornerRadius = this.props.cornerRadius, backgroundProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props.background);\n                return sectors.map(function(entry, i) {\n                    var background = (entry.value, entry.background), rest = _objectWithoutProperties(entry, [ \"value\", \"background\" ]);\n                    if (!background) return null;\n                    var props = _extends({\n                        cornerRadius: cornerRadius\n                    }, rest, {\n                        fill: \"#eee\"\n                    }, background, backgroundProps, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this4.props, entry, i), {\n                        index: i,\n                        key: \"sector-\" + i,\n                        className: \"recharts-radial-bar-background-sector\"\n                    });\n                    return _this4.renderSectorShape(background, props);\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props6 = this.props, hide = _props6.hide, data = _props6.data, className = _props6.className, background = _props6.background, isAnimationActive = _props6.isAnimationActive;\n                if (hide || !data || !data.length) return null;\n                var isAnimationFinished = this.state.isAnimationFinished, layerClass = __WEBPACK_IMPORTED_MODULE_5_classnames___default()(\"recharts-area\", className);\n                return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: layerClass\n                }, background && __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-radial-bar-background\"\n                }, this.renderBackground(data)), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-radial-bar-sectors\"\n                }, this.renderSectors(data)), (!isAnimationActive || isAnimationFinished) && __WEBPACK_IMPORTED_MODULE_11__component_LabelList__.a.renderCallByParent(_extends({}, this.props, {\n                    clockWise: this.getDeltaAngle() < 0\n                }), data));\n            }\n        } ]), RadialBar;\n    }(__WEBPACK_IMPORTED_MODULE_3_react__.Component), _class2.displayName = \"RadialBar\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.c, {\n        className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string,\n        angleAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        radiusAxisId: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number ]),\n        shape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),\n        activeShape: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),\n        activeIndex: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        dataKey: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]).isRequired,\n        cornerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]),\n        minPointSize: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        maxBarSize: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        data: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({\n            cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            innerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            outerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n            value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.value\n        })),\n        legendType: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.b),\n        label: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object ]),\n        background: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element ]),\n        hide: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        onMouseEnter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,\n        onMouseLeave: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,\n        onClick: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func,\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.bool,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\", \"spring\" ])\n    }), _class2.defaultProps = {\n        angleAxisId: 0,\n        radiusAxisId: 0,\n        minPointSize: 0,\n        hide: !1,\n        legendType: \"rect\",\n        data: [],\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)(),\n        animationBegin: 0,\n        animationDuration: 1500,\n        animationEasing: \"ease\"\n    }, _class2.getComposedData = function(_ref3) {\n        var item = _ref3.item, props = _ref3.props, radiusAxis = _ref3.radiusAxis, radiusAxisTicks = _ref3.radiusAxisTicks, angleAxis = _ref3.angleAxis, angleAxisTicks = _ref3.angleAxisTicks, displayedData = _ref3.displayedData, dataKey = _ref3.dataKey, stackedData = _ref3.stackedData, barPosition = _ref3.barPosition, bandSize = _ref3.bandSize, dataStartIndex = _ref3.dataStartIndex, pos = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.f)(barPosition, item);\n        if (!pos) return [];\n        var cx = angleAxis.cx, cy = angleAxis.cy, layout = props.layout, _item$props = item.props, children = _item$props.children, minPointSize = _item$props.minPointSize, numericAxis = \"radial\" === layout ? angleAxis : radiusAxis, stackedDomain = stackedData ? numericAxis.scale.domain() : null, baseValue = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.j)({\n            props: props,\n            numericAxis: numericAxis\n        }), cells = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_12__component_Cell__.a);\n        return {\n            data: displayedData.map(function(entry, index) {\n                var value = void 0, innerRadius = void 0, outerRadius = void 0, startAngle = void 0, endAngle = void 0, backgroundSector = void 0;\n                if (stackedData ? value = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.C)(stackedData[dataStartIndex + index], stackedDomain) : (value = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.w)(entry, dataKey), \n                __WEBPACK_IMPORTED_MODULE_2_lodash_isArray___default()(value) || (value = [ baseValue, value ])), \n                \"radial\" === layout) {\n                    innerRadius = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.k)({\n                        axis: radiusAxis,\n                        ticks: radiusAxisTicks,\n                        bandSize: bandSize,\n                        offset: pos.offset,\n                        entry: entry,\n                        index: index\n                    }), endAngle = angleAxis.scale(value[1]), startAngle = angleAxis.scale(value[0]), \n                    outerRadius = innerRadius + pos.size;\n                    var deltaAngle = endAngle - startAngle;\n                    if (Math.abs(minPointSize) > 0 && Math.abs(deltaAngle) < Math.abs(minPointSize)) {\n                        endAngle += Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.j)(deltaAngle || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaAngle));\n                    }\n                    backgroundSector = {\n                        background: {\n                            cx: cx,\n                            cy: cy,\n                            innerRadius: innerRadius,\n                            outerRadius: outerRadius,\n                            startAngle: props.startAngle,\n                            endAngle: props.endAngle\n                        }\n                    };\n                } else {\n                    innerRadius = radiusAxis.scale(value[0]), outerRadius = radiusAxis.scale(value[1]), \n                    startAngle = Object(__WEBPACK_IMPORTED_MODULE_14__util_ChartUtils__.k)({\n                        axis: angleAxis,\n                        ticks: angleAxisTicks,\n                        bandSize: bandSize,\n                        offset: pos.offset,\n                        entry: entry,\n                        index: index\n                    }), endAngle = startAngle + pos.size;\n                    var deltaRadius = outerRadius - innerRadius;\n                    if (Math.abs(minPointSize) > 0 && Math.abs(deltaRadius) < Math.abs(minPointSize)) {\n                        outerRadius += Object(__WEBPACK_IMPORTED_MODULE_13__util_DataUtils__.j)(deltaRadius || minPointSize) * (Math.abs(minPointSize) - Math.abs(deltaRadius));\n                    }\n                }\n                return _extends({}, entry, backgroundSector, {\n                    payload: entry,\n                    value: stackedData ? value : value[1],\n                    cx: cx,\n                    cy: cy,\n                    innerRadius: innerRadius,\n                    outerRadius: outerRadius,\n                    startAngle: startAngle,\n                    endAngle: endAngle\n                }, cells && cells[index] && cells[index].props);\n            }),\n            layout: layout\n        };\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = RadialBar;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_range__ = __webpack_require__(373), __WEBPACK_IMPORTED_MODULE_0_lodash_range___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_range__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__), __WEBPACK_IMPORTED_MODULE_5_d3_scale__ = __webpack_require__(331), __WEBPACK_IMPORTED_MODULE_6__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_7__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__component_Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_10__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_11__util_CssPrefixUtils__ = __webpack_require__(930), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), Brush = Object(__WEBPACK_IMPORTED_MODULE_7__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Brush(props) {\n            _classCallCheck(this, Brush);\n            var _this = _possibleConstructorReturn(this, (Brush.__proto__ || Object.getPrototypeOf(Brush)).call(this, props));\n            return _this.handleDrag = function(e) {\n                _this.leaveTimer && (clearTimeout(_this.leaveTimer), _this.leaveTimer = null), _this.state.isTravellerMoving ? _this.handleTravellerMove(e) : _this.state.isSlideMoving && _this.handleSlideDrag(e);\n            }, _this.handleTouchMove = function(e) {\n                null != e.changedTouches && e.changedTouches.length > 0 && _this.handleDrag(e.changedTouches[0]);\n            }, _this.handleDragEnd = function() {\n                _this.setState({\n                    isTravellerMoving: !1,\n                    isSlideMoving: !1\n                });\n            }, _this.handleLeaveWrapper = function() {\n                (_this.state.isTravellerMoving || _this.state.isSlideMoving) && (_this.leaveTimer = setTimeout(_this.handleDragEnd, 1e3));\n            }, _this.handleEnterSlideOrTraveller = function() {\n                _this.setState({\n                    isTextActive: !0\n                });\n            }, _this.handleLeaveSlideOrTraveller = function() {\n                _this.setState({\n                    isTextActive: !1\n                });\n            }, _this.handleSlideDragStart = function(e) {\n                var event = e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : e;\n                _this.setState({\n                    isTravellerMoving: !1,\n                    isSlideMoving: !0,\n                    slideMoveStartX: event.pageX\n                });\n            }, _this.travellerDragStartHandlers = {\n                startX: _this.handleTravellerDragStart.bind(_this, \"startX\"),\n                endX: _this.handleTravellerDragStart.bind(_this, \"endX\")\n            }, _this.state = props.data && props.data.length ? _this.updateScale(props) : {}, \n            _this;\n        }\n        return _inherits(Brush, _Component), _createClass(Brush, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _this2 = this, _props = this.props, data = _props.data, width = _props.width, x = _props.x, travellerWidth = _props.travellerWidth, updateId = _props.updateId;\n                (nextProps.data !== data || nextProps.updateId !== updateId) && nextProps.data && nextProps.data.length ? this.setState(this.updateScale(nextProps)) : nextProps.width === width && nextProps.x === x && nextProps.travellerWidth === travellerWidth || (this.scale.range([ nextProps.x, nextProps.x + nextProps.width - nextProps.travellerWidth ]), \n                this.scaleValues = this.scale.domain().map(function(entry) {\n                    return _this2.scale(entry);\n                }), this.setState({\n                    startX: this.scale(nextProps.startIndex),\n                    endX: this.scale(nextProps.endIndex)\n                }));\n            }\n        }, {\n            key: \"componentWillUnmount\",\n            value: function() {\n                this.scale = null, this.scaleValues = null, this.leaveTimer && (clearTimeout(this.leaveTimer), \n                this.leaveTimer = null);\n            }\n        }, {\n            key: \"getIndexInRange\",\n            value: function(range, x) {\n                for (var len = range.length, start = 0, end = len - 1; end - start > 1; ) {\n                    var middle = Math.floor((start + end) / 2);\n                    range[middle] > x ? end = middle : start = middle;\n                }\n                return x >= range[end] ? end : start;\n            }\n        }, {\n            key: \"getIndex\",\n            value: function(_ref) {\n                var startX = _ref.startX, endX = _ref.endX, _props2 = this.props, gap = _props2.gap, data = _props2.data, lastIndex = data.length - 1, min = Math.min(startX, endX), max = Math.max(startX, endX), minIndex = this.getIndexInRange(this.scaleValues, min), maxIndex = this.getIndexInRange(this.scaleValues, max);\n                return {\n                    startIndex: minIndex - minIndex % gap,\n                    endIndex: maxIndex === lastIndex ? lastIndex : maxIndex - maxIndex % gap\n                };\n            }\n        }, {\n            key: \"getTextOfTick\",\n            value: function(index) {\n                var _props3 = this.props, data = _props3.data, tickFormatter = _props3.tickFormatter, dataKey = _props3.dataKey, text = Object(__WEBPACK_IMPORTED_MODULE_6__util_ChartUtils__.w)(data[index], dataKey, index);\n                return __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(tickFormatter) ? tickFormatter(text) : text;\n            }\n        }, {\n            key: \"handleSlideDrag\",\n            value: function(e) {\n                var _state = this.state, slideMoveStartX = _state.slideMoveStartX, startX = _state.startX, endX = _state.endX, _props4 = this.props, x = _props4.x, width = _props4.width, travellerWidth = _props4.travellerWidth, startIndex = _props4.startIndex, endIndex = _props4.endIndex, onChange = _props4.onChange, delta = e.pageX - slideMoveStartX;\n                delta > 0 ? delta = Math.min(delta, x + width - travellerWidth - endX, x + width - travellerWidth - startX) : delta < 0 && (delta = Math.max(delta, x - startX, x - endX));\n                var newIndex = this.getIndex({\n                    startX: startX + delta,\n                    endX: endX + delta\n                });\n                newIndex.startIndex === startIndex && newIndex.endIndex === endIndex || !onChange || onChange(newIndex), \n                this.setState({\n                    startX: startX + delta,\n                    endX: endX + delta,\n                    slideMoveStartX: e.pageX\n                });\n            }\n        }, {\n            key: \"handleTravellerDragStart\",\n            value: function(id, e) {\n                var event = e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : e;\n                this.setState({\n                    isSlideMoving: !1,\n                    isTravellerMoving: !0,\n                    movingTravellerId: id,\n                    brushMoveStartX: event.pageX\n                });\n            }\n        }, {\n            key: \"handleTravellerMove\",\n            value: function(e) {\n                var _setState, _state2 = this.state, brushMoveStartX = _state2.brushMoveStartX, movingTravellerId = _state2.movingTravellerId, endX = _state2.endX, startX = _state2.startX, prevValue = this.state[movingTravellerId], _props5 = this.props, x = _props5.x, width = _props5.width, travellerWidth = _props5.travellerWidth, onChange = _props5.onChange, gap = _props5.gap, data = _props5.data, params = {\n                    startX: this.state.startX,\n                    endX: this.state.endX\n                }, delta = e.pageX - brushMoveStartX;\n                delta > 0 ? delta = Math.min(delta, x + width - travellerWidth - prevValue) : delta < 0 && (delta = Math.max(delta, x - prevValue)), \n                params[movingTravellerId] = prevValue + delta;\n                var newIndex = this.getIndex(params), startIndex = newIndex.startIndex, endIndex = newIndex.endIndex, isFullGap = function() {\n                    var lastIndex = data.length - 1;\n                    return \"startX\" === movingTravellerId && (endX > startX ? startIndex % gap == 0 : endIndex % gap == 0) || endX < startX && endIndex === lastIndex || \"endX\" === movingTravellerId && (endX > startX ? endIndex % gap == 0 : startIndex % gap == 0) || endX > startX && endIndex === lastIndex;\n                };\n                this.setState((_setState = {}, _defineProperty(_setState, movingTravellerId, prevValue + delta), \n                _defineProperty(_setState, \"brushMoveStartX\", e.pageX), _setState), function() {\n                    onChange && isFullGap() && onChange(newIndex);\n                });\n            }\n        }, {\n            key: \"updateScale\",\n            value: function(props) {\n                var _this3 = this, data = props.data, startIndex = props.startIndex, endIndex = props.endIndex, x = props.x, width = props.width, travellerWidth = props.travellerWidth, len = data.length;\n                return this.scale = Object(__WEBPACK_IMPORTED_MODULE_5_d3_scale__.scalePoint)().domain(__WEBPACK_IMPORTED_MODULE_0_lodash_range___default()(0, len)).range([ x, x + width - travellerWidth ]), \n                this.scaleValues = this.scale.domain().map(function(entry) {\n                    return _this3.scale(entry);\n                }), {\n                    isTextActive: !1,\n                    isSlideMoving: !1,\n                    isTravellerMoving: !1,\n                    startX: this.scale(startIndex),\n                    endX: this.scale(endIndex)\n                };\n            }\n        }, {\n            key: \"renderBackground\",\n            value: function() {\n                var _props6 = this.props, x = _props6.x, y = _props6.y, width = _props6.width, height = _props6.height, fill = _props6.fill, stroke = _props6.stroke;\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"rect\", {\n                    stroke: stroke,\n                    fill: fill,\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height\n                });\n            }\n        }, {\n            key: \"renderPanorama\",\n            value: function() {\n                var _props7 = this.props, x = _props7.x, y = _props7.y, width = _props7.width, height = _props7.height, data = _props7.data, children = _props7.children, padding = _props7.padding, chartElement = __WEBPACK_IMPORTED_MODULE_2_react__.Children.only(children);\n                return chartElement ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(chartElement, {\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height,\n                    margin: padding,\n                    compact: !0,\n                    data: data\n                }) : null;\n            }\n        }, {\n            key: \"renderTraveller\",\n            value: function(travellerX, id) {\n                var _props8 = this.props, y = _props8.y, travellerWidth = _props8.travellerWidth, height = _props8.height, stroke = _props8.stroke, lineY = Math.floor(y + height / 2) - 1, x = Math.max(travellerX, this.props.x);\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-brush-traveller\",\n                    onMouseEnter: this.handleEnterSlideOrTraveller,\n                    onMouseLeave: this.handleLeaveSlideOrTraveller,\n                    onMouseDown: this.travellerDragStartHandlers[id],\n                    onTouchStart: this.travellerDragStartHandlers[id],\n                    style: {\n                        cursor: \"col-resize\"\n                    }\n                }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"rect\", {\n                    x: x,\n                    y: y,\n                    width: travellerWidth,\n                    height: height,\n                    fill: stroke,\n                    stroke: \"none\"\n                }), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"line\", {\n                    x1: x + 1,\n                    y1: lineY,\n                    x2: x + travellerWidth - 1,\n                    y2: lineY,\n                    fill: \"none\",\n                    stroke: \"#fff\"\n                }), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"line\", {\n                    x1: x + 1,\n                    y1: lineY + 2,\n                    x2: x + travellerWidth - 1,\n                    y2: lineY + 2,\n                    fill: \"none\",\n                    stroke: \"#fff\"\n                }));\n            }\n        }, {\n            key: \"renderSlide\",\n            value: function(startX, endX) {\n                var _props9 = this.props, y = _props9.y, height = _props9.height, stroke = _props9.stroke;\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"rect\", {\n                    className: \"recharts-brush-slide\",\n                    onMouseEnter: this.handleEnterSlideOrTraveller,\n                    onMouseLeave: this.handleLeaveSlideOrTraveller,\n                    onMouseDown: this.handleSlideDragStart,\n                    onTouchStart: this.handleSlideDragStart,\n                    style: {\n                        cursor: \"move\"\n                    },\n                    stroke: \"none\",\n                    fill: stroke,\n                    fillOpacity: .2,\n                    x: Math.min(startX, endX),\n                    y: y,\n                    width: Math.abs(endX - startX),\n                    height: height\n                });\n            }\n        }, {\n            key: \"renderText\",\n            value: function() {\n                var _props10 = this.props, startIndex = _props10.startIndex, endIndex = _props10.endIndex, y = _props10.y, height = _props10.height, travellerWidth = _props10.travellerWidth, stroke = _props10.stroke, _state3 = this.state, startX = _state3.startX, endX = _state3.endX, attrs = {\n                    pointerEvents: \"none\",\n                    fill: stroke\n                };\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-brush-texts\"\n                }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__component_Text__.a, _extends({\n                    textAnchor: \"end\",\n                    verticalAnchor: \"middle\",\n                    x: Math.min(startX, endX) - 5,\n                    y: y + height / 2\n                }, attrs), this.getTextOfTick(startIndex)), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__component_Text__.a, _extends({\n                    textAnchor: \"start\",\n                    verticalAnchor: \"middle\",\n                    x: Math.max(startX, endX) + travellerWidth + 5,\n                    y: y + height / 2\n                }, attrs), this.getTextOfTick(endIndex)));\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props11 = this.props, data = _props11.data, className = _props11.className, children = _props11.children, x = _props11.x, y = _props11.y, width = _props11.width, height = _props11.height, _state4 = this.state, startX = _state4.startX, endX = _state4.endX, isTextActive = _state4.isTextActive, isSlideMoving = _state4.isSlideMoving, isTravellerMoving = _state4.isTravellerMoving;\n                if (!data || !data.length || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.h)(x) || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.h)(y) || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.h)(width) || !Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.h)(height) || width <= 0 || height <= 0) return null;\n                var layerClass = __WEBPACK_IMPORTED_MODULE_4_classnames___default()(\"recharts-brush\", className), isPanoramic = 1 === __WEBPACK_IMPORTED_MODULE_2_react___default.a.Children.count(children), style = Object(__WEBPACK_IMPORTED_MODULE_11__util_CssPrefixUtils__.a)(\"userSelect\", \"none\");\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: layerClass,\n                    onMouseMove: this.handleDrag,\n                    onMouseLeave: this.handleLeaveWrapper,\n                    onMouseUp: this.handleDragEnd,\n                    onTouchEnd: this.handleDragEnd,\n                    onTouchMove: this.handleTouchMove,\n                    style: style\n                }, this.renderBackground(), isPanoramic && this.renderPanorama(), this.renderSlide(startX, endX), this.renderTraveller(startX, \"startX\"), this.renderTraveller(endX, \"endX\"), (isTextActive || isSlideMoving || isTravellerMoving) && this.renderText());\n            }\n        } ]), Brush;\n    }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = \"Brush\", \n    _class2.propTypes = {\n        className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        fill: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        stroke: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        x: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        y: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number.isRequired,\n        travellerWidth: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        gap: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        padding: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.shape({\n            top: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            right: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            bottom: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n            left: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number\n        }),\n        dataKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),\n        data: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array,\n        startIndex: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        endIndex: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        tickFormatter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        children: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node,\n        onChange: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        updateId: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number ])\n    }, _class2.defaultProps = {\n        height: 40,\n        travellerWidth: 5,\n        gap: 1,\n        fill: \"#fff\",\n        stroke: \"#666\",\n        padding: {\n            top: 1,\n            right: 1,\n            bottom: 1,\n            left: 1\n        }\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = Brush;\n}, function(module, exports, __webpack_require__) {\n    var createRange = __webpack_require__(927), range = createRange();\n    module.exports = range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__ = __webpack_require__(198), __WEBPACK_IMPORTED_MODULE_6__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_7__component_Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_8__component_Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), CartesianAxis = (_temp = _class = function(_Component) {\n        function CartesianAxis() {\n            return _classCallCheck(this, CartesianAxis), _possibleConstructorReturn(this, (CartesianAxis.__proto__ || Object.getPrototypeOf(CartesianAxis)).apply(this, arguments));\n        }\n        return _inherits(CartesianAxis, _Component), _createClass(CartesianAxis, [ {\n            key: \"shouldComponentUpdate\",\n            value: function(_ref, state) {\n                var viewBox = _ref.viewBox, restProps = _objectWithoutProperties(_ref, [ \"viewBox\" ]), _props = this.props, viewBoxOld = _props.viewBox, restPropsOld = _objectWithoutProperties(_props, [ \"viewBox\" ]);\n                return !Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.b)(viewBox, viewBoxOld) || !Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.b)(restProps, restPropsOld) || !Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.b)(state, this.state);\n            }\n        }, {\n            key: \"getTickLineCoord\",\n            value: function(data) {\n                var _props2 = this.props, x = _props2.x, y = _props2.y, width = _props2.width, height = _props2.height, orientation = _props2.orientation, tickSize = _props2.tickSize, mirror = _props2.mirror, tickMargin = _props2.tickMargin, x1 = void 0, x2 = void 0, y1 = void 0, y2 = void 0, tx = void 0, ty = void 0, sign = mirror ? -1 : 1, finalTickSize = data.tickSize || tickSize, tickCoord = Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.h)(data.tickCoord) ? data.tickCoord : data.coordinate;\n                switch (orientation) {\n                  case \"top\":\n                    x1 = x2 = data.coordinate, y2 = y + !mirror * height, y1 = y2 - sign * finalTickSize, \n                    ty = y1 - sign * tickMargin, tx = tickCoord;\n                    break;\n\n                  case \"left\":\n                    y1 = y2 = data.coordinate, x2 = x + !mirror * width, x1 = x2 - sign * finalTickSize, \n                    tx = x1 - sign * tickMargin, ty = tickCoord;\n                    break;\n\n                  case \"right\":\n                    y1 = y2 = data.coordinate, x2 = x + mirror * width, x1 = x2 + sign * finalTickSize, \n                    tx = x1 + sign * tickMargin, ty = tickCoord;\n                    break;\n\n                  default:\n                    x1 = x2 = data.coordinate, y2 = y + mirror * height, y1 = y2 + sign * finalTickSize, \n                    ty = y1 + sign * tickMargin, tx = tickCoord;\n                }\n                return {\n                    line: {\n                        x1: x1,\n                        y1: y1,\n                        x2: x2,\n                        y2: y2\n                    },\n                    tick: {\n                        x: tx,\n                        y: ty\n                    }\n                };\n            }\n        }, {\n            key: \"getTickTextAnchor\",\n            value: function() {\n                var _props3 = this.props, orientation = _props3.orientation, mirror = _props3.mirror, textAnchor = void 0;\n                switch (orientation) {\n                  case \"left\":\n                    textAnchor = mirror ? \"start\" : \"end\";\n                    break;\n\n                  case \"right\":\n                    textAnchor = mirror ? \"end\" : \"start\";\n                    break;\n\n                  default:\n                    textAnchor = \"middle\";\n                }\n                return textAnchor;\n            }\n        }, {\n            key: \"getTickVerticalAnchor\",\n            value: function() {\n                var _props4 = this.props, orientation = _props4.orientation, mirror = _props4.mirror, verticalAnchor = \"end\";\n                switch (orientation) {\n                  case \"left\":\n                  case \"right\":\n                    verticalAnchor = \"middle\";\n                    break;\n\n                  case \"top\":\n                    verticalAnchor = mirror ? \"start\" : \"end\";\n                    break;\n\n                  default:\n                    verticalAnchor = mirror ? \"end\" : \"start\";\n                }\n                return verticalAnchor;\n            }\n        }, {\n            key: \"renderAxisLine\",\n            value: function() {\n                var _props5 = this.props, x = _props5.x, y = _props5.y, width = _props5.width, height = _props5.height, orientation = _props5.orientation, axisLine = _props5.axisLine, mirror = _props5.mirror, props = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props), {\n                    fill: \"none\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(axisLine));\n                if (\"top\" === orientation || \"bottom\" === orientation) {\n                    var needHeight = \"top\" === orientation && !mirror || \"bottom\" === orientation && mirror;\n                    props = _extends({}, props, {\n                        x1: x,\n                        y1: y + needHeight * height,\n                        x2: x + width,\n                        y2: y + needHeight * height\n                    });\n                } else {\n                    var needWidth = \"left\" === orientation && !mirror || \"right\" === orientation && mirror;\n                    props = _extends({}, props, {\n                        x1: x + needWidth * width,\n                        y1: y,\n                        x2: x + needWidth * width,\n                        y2: y + height\n                    });\n                }\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"line\", _extends({\n                    className: \"recharts-cartesian-axis-line\"\n                }, props));\n            }\n        }, {\n            key: \"renderTickItem\",\n            value: function(option, props, value) {\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__component_Text__.a, _extends({}, props, {\n                    className: \"recharts-cartesian-axis-tick-value\"\n                }), value);\n            }\n        }, {\n            key: \"renderTicks\",\n            value: function(ticks) {\n                var _this2 = this, _props6 = this.props, tickLine = _props6.tickLine, stroke = _props6.stroke, tick = _props6.tick, tickFormatter = _props6.tickFormatter, unit = _props6.unit, finalTicks = CartesianAxis.getTicks(_extends({}, this.props, {\n                    ticks: ticks\n                })), textAnchor = this.getTickTextAnchor(), verticalAnchor = this.getTickVerticalAnchor(), axisProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props), customTickProps = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(tick), tickLineProps = _extends({}, axisProps, {\n                    fill: \"none\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(tickLine)), items = finalTicks.map(function(entry, i) {\n                    var _getTickLineCoord = _this2.getTickLineCoord(entry), lineCoord = _getTickLineCoord.line, tickCoord = _getTickLineCoord.tick, tickProps = _extends({\n                        textAnchor: textAnchor,\n                        verticalAnchor: verticalAnchor\n                    }, axisProps, {\n                        stroke: \"none\",\n                        fill: stroke\n                    }, customTickProps, tickCoord, {\n                        index: i,\n                        payload: entry,\n                        visibleTicksCount: finalTicks.length\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__container_Layer__.a, _extends({\n                        className: \"recharts-cartesian-axis-tick\",\n                        key: \"tick-\" + i\n                    }, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.f)(_this2.props, entry, i)), tickLine && __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"line\", _extends({\n                        className: \"recharts-cartesian-axis-tick-line\"\n                    }, tickLineProps, lineCoord)), tick && _this2.renderTickItem(tick, tickProps, \"\" + (__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(entry.value) : entry.value) + (unit || \"\")));\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"g\", {\n                    className: \"recharts-cartesian-axis-ticks\"\n                }, items);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props7 = this.props, axisLine = _props7.axisLine, width = _props7.width, height = _props7.height, ticksGenerator = _props7.ticksGenerator, className = _props7.className;\n                if (_props7.hide) return null;\n                var _props8 = this.props, ticks = _props8.ticks, noTicksProps = _objectWithoutProperties(_props8, [ \"ticks\" ]), finalTicks = ticks;\n                return __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(ticksGenerator) && (finalTicks = ticksGenerator(ticks && ticks.length > 0 ? this.props : noTicksProps)), \n                width <= 0 || height <= 0 || !finalTicks || !finalTicks.length ? null : __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__container_Layer__.a, {\n                    className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()(\"recharts-cartesian-axis\", className)\n                }, axisLine && this.renderAxisLine(), this.renderTicks(finalTicks), __WEBPACK_IMPORTED_MODULE_8__component_Label__.a.renderCallByParent(this.props));\n            }\n        } ], [ {\n            key: \"getTicks\",\n            value: function(props) {\n                var tick = props.tick, ticks = props.ticks, viewBox = props.viewBox, minTickGap = props.minTickGap, orientation = props.orientation, interval = props.interval, tickFormatter = props.tickFormatter, unit = props.unit;\n                return ticks && ticks.length && tick ? Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.h)(interval) || Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)() ? CartesianAxis.getNumberIntervalTicks(ticks, Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.h)(interval) ? interval : 0) : \"preserveStartEnd\" === interval ? CartesianAxis.getTicksStart({\n                    ticks: ticks,\n                    tickFormatter: tickFormatter,\n                    viewBox: viewBox,\n                    orientation: orientation,\n                    minTickGap: minTickGap,\n                    unit: unit\n                }, !0) : \"preserveStart\" === interval ? CartesianAxis.getTicksStart({\n                    ticks: ticks,\n                    tickFormatter: tickFormatter,\n                    viewBox: viewBox,\n                    orientation: orientation,\n                    minTickGap: minTickGap,\n                    unit: unit\n                }) : CartesianAxis.getTicksEnd({\n                    ticks: ticks,\n                    tickFormatter: tickFormatter,\n                    viewBox: viewBox,\n                    orientation: orientation,\n                    minTickGap: minTickGap,\n                    unit: unit\n                }) : [];\n            }\n        }, {\n            key: \"getNumberIntervalTicks\",\n            value: function(ticks, interval) {\n                return ticks.filter(function(entry, i) {\n                    return i % (interval + 1) == 0;\n                });\n            }\n        }, {\n            key: \"getTicksStart\",\n            value: function(_ref2, preserveEnd) {\n                var ticks = _ref2.ticks, tickFormatter = _ref2.tickFormatter, viewBox = _ref2.viewBox, orientation = _ref2.orientation, minTickGap = _ref2.minTickGap, unit = _ref2.unit, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sizeKey = \"top\" === orientation || \"bottom\" === orientation ? \"width\" : \"height\", result = (ticks || []).slice(), unitSize = unit ? Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(unit)[sizeKey] : 0, len = result.length, sign = len >= 2 ? Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.j)(result[1].coordinate - result[0].coordinate) : 1, start = void 0, end = void 0;\n                if (1 === sign ? (start = \"width\" === sizeKey ? x : y, end = \"width\" === sizeKey ? x + width : y + height) : (start = \"width\" === sizeKey ? x + width : y + height, \n                end = \"width\" === sizeKey ? x : y), preserveEnd) {\n                    var tail = ticks[len - 1], tailContent = __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(tail.value) : tail.value, tailSize = Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(tailContent)[sizeKey] + unitSize, tailGap = sign * (tail.coordinate + sign * tailSize / 2 - end);\n                    result[len - 1] = tail = _extends({}, tail, {\n                        tickCoord: tailGap > 0 ? tail.coordinate - tailGap * sign : tail.coordinate\n                    });\n                    sign * (tail.tickCoord - sign * tailSize / 2 - start) >= 0 && sign * (tail.tickCoord + sign * tailSize / 2 - end) <= 0 && (end = tail.tickCoord - sign * (tailSize / 2 + minTickGap), \n                    result[len - 1] = _extends({}, tail, {\n                        isShow: !0\n                    }));\n                }\n                for (var count = preserveEnd ? len - 1 : len, i = 0; i < count; i++) {\n                    var entry = result[i], content = __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(entry.value) : entry.value, size = Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(content)[sizeKey] + unitSize;\n                    if (0 === i) {\n                        var gap = sign * (entry.coordinate - sign * size / 2 - start);\n                        result[i] = entry = _extends({}, entry, {\n                            tickCoord: gap < 0 ? entry.coordinate - gap * sign : entry.coordinate\n                        });\n                    } else result[i] = entry = _extends({}, entry, {\n                        tickCoord: entry.coordinate\n                    });\n                    sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0 && (start = entry.tickCoord + sign * (size / 2 + minTickGap), \n                    result[i] = _extends({}, entry, {\n                        isShow: !0\n                    }));\n                }\n                return result.filter(function(entry) {\n                    return entry.isShow;\n                });\n            }\n        }, {\n            key: \"getTicksEnd\",\n            value: function(_ref3) {\n                var ticks = _ref3.ticks, tickFormatter = _ref3.tickFormatter, viewBox = _ref3.viewBox, orientation = _ref3.orientation, minTickGap = _ref3.minTickGap, unit = _ref3.unit, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sizeKey = \"top\" === orientation || \"bottom\" === orientation ? \"width\" : \"height\", unitSize = unit ? Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(unit)[sizeKey] : 0, result = (ticks || []).slice(), len = result.length, sign = len >= 2 ? Object(__WEBPACK_IMPORTED_MODULE_10__util_DataUtils__.j)(result[1].coordinate - result[0].coordinate) : 1, start = void 0, end = void 0;\n                1 === sign ? (start = \"width\" === sizeKey ? x : y, end = \"width\" === sizeKey ? x + width : y + height) : (start = \"width\" === sizeKey ? x + width : y + height, \n                end = \"width\" === sizeKey ? x : y);\n                for (var i = len - 1; i >= 0; i--) {\n                    var entry = result[i], content = __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(tickFormatter) ? tickFormatter(entry.value) : entry.value, size = Object(__WEBPACK_IMPORTED_MODULE_5__util_DOMUtils__.c)(content)[sizeKey] + unitSize;\n                    if (i === len - 1) {\n                        var gap = sign * (entry.coordinate + sign * size / 2 - end);\n                        result[i] = entry = _extends({}, entry, {\n                            tickCoord: gap > 0 ? entry.coordinate - gap * sign : entry.coordinate\n                        });\n                    } else result[i] = entry = _extends({}, entry, {\n                        tickCoord: entry.coordinate\n                    });\n                    sign * (entry.tickCoord - sign * size / 2 - start) >= 0 && sign * (entry.tickCoord + sign * size / 2 - end) <= 0 && (end = entry.tickCoord - sign * (size / 2 + minTickGap), \n                    result[i] = _extends({}, entry, {\n                        isShow: !0\n                    }));\n                }\n                return result.filter(function(entry) {\n                    return entry.isShow;\n                });\n            }\n        } ]), CartesianAxis;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.displayName = \"CartesianAxis\", \n    _class.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.a, {\n        className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,\n        x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        orientation: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"top\", \"bottom\", \"left\", \"right\" ]),\n        viewBox: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n            height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number\n        }),\n        tick: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element ]),\n        axisLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),\n        tickLine: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object ]),\n        mirror: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool,\n        tickMargin: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number.isRequired,\n        minTickGap: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        ticks: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.array,\n        tickSize: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        stroke: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,\n        tickFormatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        ticksGenerator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        interval: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ \"preserveStart\", \"preserveEnd\", \"preserveStartEnd\" ]) ])\n    }), _class.defaultProps = {\n        x: 0,\n        y: 0,\n        width: 0,\n        height: 0,\n        viewBox: {\n            x: 0,\n            y: 0,\n            width: 0,\n            height: 0\n        },\n        orientation: \"bottom\",\n        ticks: [],\n        stroke: \"#666\",\n        tickLine: !0,\n        axisLine: !0,\n        tick: !0,\n        mirror: !1,\n        minTickGap: 5,\n        tickSize: 6,\n        tickMargin: 2,\n        interval: \"preserveEnd\"\n    }, _temp);\n    __webpack_exports__.a = CartesianAxis;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    var _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _reactDom = __webpack_require__(99), _MuiThemeProvider = __webpack_require__(386), _MuiThemeProvider2 = _interopRequireDefault(_MuiThemeProvider), _createMuiTheme = __webpack_require__(161), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _Dashboard = __webpack_require__(439), _Dashboard2 = _interopRequireDefault(_Dashboard), theme = (0, \n    _createMuiTheme2.default)({\n        palette: {\n            type: \"dark\"\n        }\n    }), dashboard = document.getElementById(\"dashboard\");\n    dashboard && (0, _reactDom.render)(_react2.default.createElement(_MuiThemeProvider2.default, {\n        theme: theme\n    }, _react2.default.createElement(_Dashboard2.default, null)), dashboard);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function D(a) {\n        for (var b = arguments.length - 1, e = \"https://reactjs.org/docs/error-decoder.html?invariant=\" + a, c = 0; c < b; c++) e += \"&args[]=\" + encodeURIComponent(arguments[c + 1]);\n        n(!1, \"Minified React error #\" + a + \"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \", e);\n    }\n    function F(a, b, e) {\n        this.props = a, this.context = b, this.refs = p, this.updater = e || E;\n    }\n    function G() {}\n    function H(a, b, e) {\n        this.props = a, this.context = b, this.refs = p, this.updater = e || E;\n    }\n    function M(a, b, e) {\n        var c = void 0, d = {}, g = null, h = null;\n        if (null != b) for (c in void 0 !== b.ref && (h = b.ref), void 0 !== b.key && (g = \"\" + b.key), \n        b) K.call(b, c) && !L.hasOwnProperty(c) && (d[c] = b[c]);\n        var f = arguments.length - 2;\n        if (1 === f) d.children = e; else if (1 < f) {\n            for (var l = Array(f), m = 0; m < f; m++) l[m] = arguments[m + 2];\n            d.children = l;\n        }\n        if (a && a.defaultProps) for (c in f = a.defaultProps) void 0 === d[c] && (d[c] = f[c]);\n        return {\n            $$typeof: t,\n            type: a,\n            key: g,\n            ref: h,\n            props: d,\n            _owner: J.current\n        };\n    }\n    function N(a) {\n        return \"object\" == typeof a && null !== a && a.$$typeof === t;\n    }\n    function escape(a) {\n        var b = {\n            \"=\": \"=0\",\n            \":\": \"=2\"\n        };\n        return \"$\" + (\"\" + a).replace(/[=:]/g, function(a) {\n            return b[a];\n        });\n    }\n    function Q(a, b, e, c) {\n        if (P.length) {\n            var d = P.pop();\n            return d.result = a, d.keyPrefix = b, d.func = e, d.context = c, d.count = 0, d;\n        }\n        return {\n            result: a,\n            keyPrefix: b,\n            func: e,\n            context: c,\n            count: 0\n        };\n    }\n    function R(a) {\n        a.result = null, a.keyPrefix = null, a.func = null, a.context = null, a.count = 0, \n        10 > P.length && P.push(a);\n    }\n    function S(a, b, e, c) {\n        var d = typeof a;\n        \"undefined\" !== d && \"boolean\" !== d || (a = null);\n        var g = !1;\n        if (null === a) g = !0; else switch (d) {\n          case \"string\":\n          case \"number\":\n            g = !0;\n            break;\n\n          case \"object\":\n            switch (a.$$typeof) {\n              case t:\n              case u:\n                g = !0;\n            }\n        }\n        if (g) return e(c, a, \"\" === b ? \".\" + T(a, 0) : b), 1;\n        if (g = 0, b = \"\" === b ? \".\" : b + \":\", Array.isArray(a)) for (var h = 0; h < a.length; h++) {\n            d = a[h];\n            var f = b + T(d, h);\n            g += S(d, f, e, c);\n        } else if (null === a || void 0 === a ? f = null : (f = C && a[C] || a[\"@@iterator\"], \n        f = \"function\" == typeof f ? f : null), \"function\" == typeof f) for (a = f.call(a), \n        h = 0; !(d = a.next()).done; ) d = d.value, f = b + T(d, h++), g += S(d, f, e, c); else \"object\" === d && (e = \"\" + a, \n        D(\"31\", \"[object Object]\" === e ? \"object with keys {\" + Object.keys(a).join(\", \") + \"}\" : e, \"\"));\n        return g;\n    }\n    function T(a, b) {\n        return \"object\" == typeof a && null !== a && null != a.key ? escape(a.key) : b.toString(36);\n    }\n    function U(a, b) {\n        a.func.call(a.context, b, a.count++);\n    }\n    function V(a, b, e) {\n        var c = a.result, d = a.keyPrefix;\n        a = a.func.call(a.context, b, a.count++), Array.isArray(a) ? W(a, c, e, q.thatReturnsArgument) : null != a && (N(a) && (b = d + (!a.key || b && b.key === a.key ? \"\" : (\"\" + a.key).replace(O, \"$&/\") + \"/\") + e, \n        a = {\n            $$typeof: t,\n            type: a.type,\n            key: b,\n            ref: a.ref,\n            props: a.props,\n            _owner: a._owner\n        }), c.push(a));\n    }\n    function W(a, b, e, c, d) {\n        var g = \"\";\n        null != e && (g = (\"\" + e).replace(O, \"$&/\") + \"/\"), b = Q(b, g, c, d), null == a || S(a, \"\", V, b), \n        R(b);\n    }\n    var k = __webpack_require__(74), n = __webpack_require__(49), p = __webpack_require__(97), q = __webpack_require__(50), r = \"function\" == typeof Symbol && Symbol.for, t = r ? Symbol.for(\"react.element\") : 60103, u = r ? Symbol.for(\"react.portal\") : 60106, v = r ? Symbol.for(\"react.fragment\") : 60107, w = r ? Symbol.for(\"react.strict_mode\") : 60108, x = r ? Symbol.for(\"react.profiler\") : 60114, y = r ? Symbol.for(\"react.provider\") : 60109, z = r ? Symbol.for(\"react.context\") : 60110, A = r ? Symbol.for(\"react.async_mode\") : 60111, B = r ? Symbol.for(\"react.forward_ref\") : 60112;\n    r && Symbol.for(\"react.timeout\");\n    var C = \"function\" == typeof Symbol && Symbol.iterator, E = {\n        isMounted: function() {\n            return !1;\n        },\n        enqueueForceUpdate: function() {},\n        enqueueReplaceState: function() {},\n        enqueueSetState: function() {}\n    };\n    F.prototype.isReactComponent = {}, F.prototype.setState = function(a, b) {\n        \"object\" != typeof a && \"function\" != typeof a && null != a && D(\"85\"), this.updater.enqueueSetState(this, a, b, \"setState\");\n    }, F.prototype.forceUpdate = function(a) {\n        this.updater.enqueueForceUpdate(this, a, \"forceUpdate\");\n    }, G.prototype = F.prototype;\n    var I = H.prototype = new G();\n    I.constructor = H, k(I, F.prototype), I.isPureReactComponent = !0;\n    var J = {\n        current: null\n    }, K = Object.prototype.hasOwnProperty, L = {\n        key: !0,\n        ref: !0,\n        __self: !0,\n        __source: !0\n    }, O = /\\/+/g, P = [], X = {\n        Children: {\n            map: function(a, b, e) {\n                if (null == a) return a;\n                var c = [];\n                return W(a, c, null, b, e), c;\n            },\n            forEach: function(a, b, e) {\n                if (null == a) return a;\n                b = Q(null, null, b, e), null == a || S(a, \"\", U, b), R(b);\n            },\n            count: function(a) {\n                return null == a ? 0 : S(a, \"\", q.thatReturnsNull, null);\n            },\n            toArray: function(a) {\n                var b = [];\n                return W(a, b, null, q.thatReturnsArgument), b;\n            },\n            only: function(a) {\n                return N(a) || D(\"143\"), a;\n            }\n        },\n        createRef: function() {\n            return {\n                current: null\n            };\n        },\n        Component: F,\n        PureComponent: H,\n        createContext: function(a, b) {\n            return void 0 === b && (b = null), a = {\n                $$typeof: z,\n                _calculateChangedBits: b,\n                _defaultValue: a,\n                _currentValue: a,\n                _currentValue2: a,\n                _changedBits: 0,\n                _changedBits2: 0,\n                Provider: null,\n                Consumer: null\n            }, a.Provider = {\n                $$typeof: y,\n                _context: a\n            }, a.Consumer = a;\n        },\n        forwardRef: function(a) {\n            return {\n                $$typeof: B,\n                render: a\n            };\n        },\n        Fragment: v,\n        StrictMode: w,\n        unstable_AsyncMode: A,\n        unstable_Profiler: x,\n        createElement: M,\n        cloneElement: function(a, b, e) {\n            (null === a || void 0 === a) && D(\"267\", a);\n            var c = void 0, d = k({}, a.props), g = a.key, h = a.ref, f = a._owner;\n            if (null != b) {\n                void 0 !== b.ref && (h = b.ref, f = J.current), void 0 !== b.key && (g = \"\" + b.key);\n                var l = void 0;\n                a.type && a.type.defaultProps && (l = a.type.defaultProps);\n                for (c in b) K.call(b, c) && !L.hasOwnProperty(c) && (d[c] = void 0 === b[c] && void 0 !== l ? l[c] : b[c]);\n            }\n            if (1 === (c = arguments.length - 2)) d.children = e; else if (1 < c) {\n                l = Array(c);\n                for (var m = 0; m < c; m++) l[m] = arguments[m + 2];\n                d.children = l;\n            }\n            return {\n                $$typeof: t,\n                type: a.type,\n                key: g,\n                ref: h,\n                props: d,\n                _owner: f\n            };\n        },\n        createFactory: function(a) {\n            var b = M.bind(null, a);\n            return b.type = a, b;\n        },\n        isValidElement: N,\n        version: \"16.4.0\",\n        __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n            ReactCurrentOwner: J,\n            assign: k\n        }\n    }, Y = {\n        default: X\n    }, Z = Y && X || Y;\n    module.exports = Z.default ? Z.default : Z;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        \"production\" !== process.env.NODE_ENV && function() {\n            function getIteratorFn(maybeIterable) {\n                if (null === maybeIterable || void 0 === maybeIterable) return null;\n                var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n                return \"function\" == typeof maybeIterator ? maybeIterator : null;\n            }\n            function warnNoop(publicInstance, callerName) {\n                var _constructor = publicInstance.constructor, componentName = _constructor && (_constructor.displayName || _constructor.name) || \"ReactClass\", warningKey = componentName + \".\" + callerName;\n                didWarnStateUpdateForUnmountedComponent[warningKey] || (warning(!1, \"Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to ` + (\"`\" + `this.state`)) + (\"`\" + (` directly or define a ` + \"`\")))))) + (((((`state = {};` + (\"`\" + ` class property with the desired state in the %s component.\", callerName, componentName), \n                didWarnStateUpdateForUnmountedComponent[warningKey] = !0);\n            }\n            function Component(props, context, updater) {\n                this.props = props, this.context = context, this.refs = emptyObject, this.updater = updater || ReactNoopUpdateQueue;\n            }\n            function ComponentDummy() {}\n            function PureComponent(props, context, updater) {\n                this.props = props, this.context = context, this.refs = emptyObject, this.updater = updater || ReactNoopUpdateQueue;\n            }\n            function createRef() {\n                var refObject = {\n                    current: null\n                };\n                return Object.seal(refObject), refObject;\n            }\n            function hasValidRef(config) {\n                if (hasOwnProperty.call(config, \"ref\")) {\n                    var getter = Object.getOwnPropertyDescriptor(config, \"ref\").get;\n                    if (getter && getter.isReactWarning) return !1;\n                }\n                return void 0 !== config.ref;\n            }\n            function hasValidKey(config) {\n                if (hasOwnProperty.call(config, \"key\")) {\n                    var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n                    if (getter && getter.isReactWarning) return !1;\n                }\n                return void 0 !== config.key;\n            }\n            function defineKeyPropWarningGetter(props, displayName) {\n                var warnAboutAccessingKey = function() {\n                    specialPropKeyWarningShown || (specialPropKeyWarningShown = !0, warning(!1, \"%s: `)) + (\"`\" + (`key` + \"`\"))) + ((` is not a prop. Trying to access it will result in ` + (\"`\" + `undefined`)) + (\"`\" + (` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)\", displayName));\n                };\n                warnAboutAccessingKey.isReactWarning = !0, Object.defineProperty(props, \"key\", {\n                    get: warnAboutAccessingKey,\n                    configurable: !0\n                });\n            }\n            function defineRefPropWarningGetter(props, displayName) {\n                var warnAboutAccessingRef = function() {\n                    specialPropRefWarningShown || (specialPropRefWarningShown = !0, warning(!1, \"%s: ` + \"`\")))) + (((`ref` + (\"`\" + ` is not a prop. Trying to access it will result in `)) + (\"`\" + (`undefined` + \"`\"))) + ((` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)\", displayName));\n                };\n                warnAboutAccessingRef.isReactWarning = !0, Object.defineProperty(props, \"ref\", {\n                    get: warnAboutAccessingRef,\n                    configurable: !0\n                });\n            }\n            function createElement(type, config, children) {\n                var propName = void 0, props = {}, key = null, ref = null, self = null, source = null;\n                if (null != config) {\n                    hasValidRef(config) && (ref = config.ref), hasValidKey(config) && (key = \"\" + config.key), \n                    self = void 0 === config.__self ? null : config.__self, source = void 0 === config.__source ? null : config.__source;\n                    for (propName in config) hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName) && (props[propName] = config[propName]);\n                }\n                var childrenLength = arguments.length - 2;\n                if (1 === childrenLength) props.children = children; else if (childrenLength > 1) {\n                    for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++) childArray[i] = arguments[i + 2];\n                    Object.freeze && Object.freeze(childArray), props.children = childArray;\n                }\n                if (type && type.defaultProps) {\n                    var defaultProps = type.defaultProps;\n                    for (propName in defaultProps) void 0 === props[propName] && (props[propName] = defaultProps[propName]);\n                }\n                if ((key || ref) && (void 0 === props.$$typeof || props.$$typeof !== REACT_ELEMENT_TYPE)) {\n                    var displayName = \"function\" == typeof type ? type.displayName || type.name || \"Unknown\" : type;\n                    key && defineKeyPropWarningGetter(props, displayName), ref && defineRefPropWarningGetter(props, displayName);\n                }\n                return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n            }\n            function cloneAndReplaceKey(oldElement, newKey) {\n                return ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n            }\n            function cloneElement(element, config, children) {\n                (null === element || void 0 === element) && invariant(!1, \"React.cloneElement(...): The argument must be a React element, but you passed %s.\", element);\n                var propName = void 0, props = _assign({}, element.props), key = element.key, ref = element.ref, self = element._self, source = element._source, owner = element._owner;\n                if (null != config) {\n                    hasValidRef(config) && (ref = config.ref, owner = ReactCurrentOwner.current), hasValidKey(config) && (key = \"\" + config.key);\n                    var defaultProps = void 0;\n                    element.type && element.type.defaultProps && (defaultProps = element.type.defaultProps);\n                    for (propName in config) hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName) && (void 0 === config[propName] && void 0 !== defaultProps ? props[propName] = defaultProps[propName] : props[propName] = config[propName]);\n                }\n                var childrenLength = arguments.length - 2;\n                if (1 === childrenLength) props.children = children; else if (childrenLength > 1) {\n                    for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++) childArray[i] = arguments[i + 2];\n                    props.children = childArray;\n                }\n                return ReactElement(element.type, key, ref, self, source, owner, props);\n            }\n            function isValidElement(object) {\n                return \"object\" == typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;\n            }\n            function escape(key) {\n                var escaperLookup = {\n                    \"=\": \"=0\",\n                    \":\": \"=2\"\n                };\n                return \"$\" + (\"\" + key).replace(/[=:]/g, function(match) {\n                    return escaperLookup[match];\n                });\n            }\n            function escapeUserProvidedKey(text) {\n                return (\"\" + text).replace(userProvidedKeyEscapeRegex, \"$&/\");\n            }\n            function getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {\n                if (traverseContextPool.length) {\n                    var traverseContext = traverseContextPool.pop();\n                    return traverseContext.result = mapResult, traverseContext.keyPrefix = keyPrefix, \n                    traverseContext.func = mapFunction, traverseContext.context = mapContext, traverseContext.count = 0, \n                    traverseContext;\n                }\n                return {\n                    result: mapResult,\n                    keyPrefix: keyPrefix,\n                    func: mapFunction,\n                    context: mapContext,\n                    count: 0\n                };\n            }\n            function releaseTraverseContext(traverseContext) {\n                traverseContext.result = null, traverseContext.keyPrefix = null, traverseContext.func = null, \n                traverseContext.context = null, traverseContext.count = 0, traverseContextPool.length < POOL_SIZE && traverseContextPool.push(traverseContext);\n            }\n            function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n                var type = typeof children;\n                \"undefined\" !== type && \"boolean\" !== type || (children = null);\n                var invokeCallback = !1;\n                if (null === children) invokeCallback = !0; else switch (type) {\n                  case \"string\":\n                  case \"number\":\n                    invokeCallback = !0;\n                    break;\n\n                  case \"object\":\n                    switch (children.$$typeof) {\n                      case REACT_ELEMENT_TYPE:\n                      case REACT_PORTAL_TYPE:\n                        invokeCallback = !0;\n                    }\n                }\n                if (invokeCallback) return callback(traverseContext, children, \"\" === nameSoFar ? SEPARATOR + getComponentKey(children, 0) : nameSoFar), \n                1;\n                var child = void 0, nextName = void 0, subtreeCount = 0, nextNamePrefix = \"\" === nameSoFar ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n                if (Array.isArray(children)) for (var i = 0; i < children.length; i++) child = children[i], \n                nextName = nextNamePrefix + getComponentKey(child, i), subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); else {\n                    var iteratorFn = getIteratorFn(children);\n                    if (\"function\" == typeof iteratorFn) {\n                        iteratorFn === children.entries && (didWarnAboutMaps || warning(!1, \"Using Maps as children is unsupported and will likely yield unexpected results. Convert it to a sequence/iterable of keyed ReactElements instead.%s\", ReactDebugCurrentFrame.getStackAddendum()), \n                        didWarnAboutMaps = !0);\n                        for (var iterator = iteratorFn.call(children), step = void 0, ii = 0; !(step = iterator.next()).done; ) child = step.value, \n                        nextName = nextNamePrefix + getComponentKey(child, ii++), subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n                    } else if (\"object\" === type) {\n                        var addendum = \"\";\n                        addendum = \" If you meant to render a collection of children, use an array instead.\" + ReactDebugCurrentFrame.getStackAddendum();\n                        var childrenString = \"\" + children;\n                        invariant(!1, \"Objects are not valid as a React child (found: %s).%s\", \"[object Object]\" === childrenString ? \"object with keys {\" + Object.keys(children).join(\", \") + \"}\" : childrenString, addendum);\n                    }\n                }\n                return subtreeCount;\n            }\n            function traverseAllChildren(children, callback, traverseContext) {\n                return null == children ? 0 : traverseAllChildrenImpl(children, \"\", callback, traverseContext);\n            }\n            function getComponentKey(component, index) {\n                return \"object\" == typeof component && null !== component && null != component.key ? escape(component.key) : index.toString(36);\n            }\n            function forEachSingleChild(bookKeeping, child, name) {\n                var func = bookKeeping.func, context = bookKeeping.context;\n                func.call(context, child, bookKeeping.count++);\n            }\n            function forEachChildren(children, forEachFunc, forEachContext) {\n                if (null == children) return children;\n                var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);\n                traverseAllChildren(children, forEachSingleChild, traverseContext), releaseTraverseContext(traverseContext);\n            }\n            function mapSingleChildIntoContext(bookKeeping, child, childKey) {\n                var result = bookKeeping.result, keyPrefix = bookKeeping.keyPrefix, func = bookKeeping.func, context = bookKeeping.context, mappedChild = func.call(context, child, bookKeeping.count++);\n                Array.isArray(mappedChild) ? mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument) : null != mappedChild && (isValidElement(mappedChild) && (mappedChild = cloneAndReplaceKey(mappedChild, keyPrefix + (!mappedChild.key || child && child.key === mappedChild.key ? \"\" : escapeUserProvidedKey(mappedChild.key) + \"/\") + childKey)), \n                result.push(mappedChild));\n            }\n            function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n                var escapedPrefix = \"\";\n                null != prefix && (escapedPrefix = escapeUserProvidedKey(prefix) + \"/\");\n                var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);\n                traverseAllChildren(children, mapSingleChildIntoContext, traverseContext), releaseTraverseContext(traverseContext);\n            }\n            function mapChildren(children, func, context) {\n                if (null == children) return children;\n                var result = [];\n                return mapIntoWithKeyPrefixInternal(children, result, null, func, context), result;\n            }\n            function countChildren(children) {\n                return traverseAllChildren(children, emptyFunction.thatReturnsNull, null);\n            }\n            function toArray(children) {\n                var result = [];\n                return mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument), \n                result;\n            }\n            function onlyChild(children) {\n                return isValidElement(children) || invariant(!1, \"React.Children.only expected to receive a single React element child.\"), \n                children;\n            }\n            function createContext(defaultValue, calculateChangedBits) {\n                void 0 === calculateChangedBits ? calculateChangedBits = null : null !== calculateChangedBits && \"function\" != typeof calculateChangedBits && warning(!1, \"createContext: Expected the optional second argument to be a function. Instead received: %s\", calculateChangedBits);\n                var context = {\n                    $$typeof: REACT_CONTEXT_TYPE,\n                    _calculateChangedBits: calculateChangedBits,\n                    _defaultValue: defaultValue,\n                    _currentValue: defaultValue,\n                    _currentValue2: defaultValue,\n                    _changedBits: 0,\n                    _changedBits2: 0,\n                    Provider: null,\n                    Consumer: null\n                };\n                return context.Provider = {\n                    $$typeof: REACT_PROVIDER_TYPE,\n                    _context: context\n                }, context.Consumer = context, context._currentRenderer = null, context._currentRenderer2 = null, \n                context;\n            }\n            function forwardRef(render) {\n                return \"function\" != typeof render && warning(!1, \"forwardRef requires a render function but was given %s.\", null === render ? \"null\" : typeof render), \n                null != render && (null != render.defaultProps || null != render.propTypes) && warning(!1, \"forwardRef render functions do not support propTypes or defaultProps. Did you accidentally pass a React component?\"), \n                {\n                    $$typeof: REACT_FORWARD_REF_TYPE,\n                    render: render\n                };\n            }\n            function isValidElementType(type) {\n                return \"string\" == typeof type || \"function\" == typeof type || type === REACT_FRAGMENT_TYPE || type === REACT_ASYNC_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_TIMEOUT_TYPE || \"object\" == typeof type && null !== type && (type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE);\n            }\n            function getComponentName(fiber) {\n                var type = fiber.type;\n                if (\"function\" == typeof type) return type.displayName || type.name;\n                if (\"string\" == typeof type) return type;\n                switch (type) {\n                  case REACT_ASYNC_MODE_TYPE:\n                    return \"AsyncMode\";\n\n                  case REACT_CONTEXT_TYPE:\n                    return \"Context.Consumer\";\n\n                  case REACT_FRAGMENT_TYPE:\n                    return \"ReactFragment\";\n\n                  case REACT_PORTAL_TYPE:\n                    return \"ReactPortal\";\n\n                  case REACT_PROFILER_TYPE:\n                    return \"Profiler(\" + fiber.pendingProps.id + \")\";\n\n                  case REACT_PROVIDER_TYPE:\n                    return \"Context.Provider\";\n\n                  case REACT_STRICT_MODE_TYPE:\n                    return \"StrictMode\";\n\n                  case REACT_TIMEOUT_TYPE:\n                    return \"Timeout\";\n                }\n                if (\"object\" == typeof type && null !== type) switch (type.$$typeof) {\n                  case REACT_FORWARD_REF_TYPE:\n                    var functionName = type.render.displayName || type.render.name || \"\";\n                    return \"\" !== functionName ? \"ForwardRef(\" + functionName + \")\" : \"ForwardRef\";\n                }\n                return null;\n            }\n            function getDeclarationErrorAddendum() {\n                if (ReactCurrentOwner.current) {\n                    var name = getComponentName(ReactCurrentOwner.current);\n                    if (name) return \"\\n\\nCheck the render method of ` + (\"`\" + `\" + name + \"`)) + (\"`\" + (`.\";\n                }\n                return \"\";\n            }\n            function getSourceInfoErrorAddendum(elementProps) {\n                if (null !== elementProps && void 0 !== elementProps && void 0 !== elementProps.__source) {\n                    var source = elementProps.__source;\n                    return \"\\n\\nCheck your code at \" + source.fileName.replace(/^.*[\\\\\\/]/, \"\") + \":\" + source.lineNumber + \".\";\n                }\n                return \"\";\n            }\n            function getCurrentComponentErrorInfo(parentType) {\n                var info = getDeclarationErrorAddendum();\n                if (!info) {\n                    var parentName = \"string\" == typeof parentType ? parentType : parentType.displayName || parentType.name;\n                    parentName && (info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\");\n                }\n                return info;\n            }\n            function validateExplicitKey(element, parentType) {\n                if (element._store && !element._store.validated && null == element.key) {\n                    element._store.validated = !0;\n                    var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n                    if (!ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n                        ownerHasKeyUseWarning[currentComponentErrorInfo] = !0;\n                        var childOwner = \"\";\n                        element && element._owner && element._owner !== ReactCurrentOwner.current && (childOwner = \" It was passed a child from \" + getComponentName(element._owner) + \".\"), \n                        currentlyValidatingElement = element, warning(!1, 'Each child in an array or iterator should have a unique \"key\" prop.%s%s See https://fb.me/react-warning-keys for more information.%s', currentComponentErrorInfo, childOwner, getStackAddendum()), \n                        currentlyValidatingElement = null;\n                    }\n                }\n            }\n            function validateChildKeys(node, parentType) {\n                if (\"object\" == typeof node) if (Array.isArray(node)) for (var i = 0; i < node.length; i++) {\n                    var child = node[i];\n                    isValidElement(child) && validateExplicitKey(child, parentType);\n                } else if (isValidElement(node)) node._store && (node._store.validated = !0); else if (node) {\n                    var iteratorFn = getIteratorFn(node);\n                    if (\"function\" == typeof iteratorFn && iteratorFn !== node.entries) for (var iterator = iteratorFn.call(node), step = void 0; !(step = iterator.next()).done; ) isValidElement(step.value) && validateExplicitKey(step.value, parentType);\n                }\n            }\n            function validatePropTypes(element) {\n                var componentClass = element.type;\n                if (\"function\" == typeof componentClass) {\n                    var name = componentClass.displayName || componentClass.name, propTypes = componentClass.propTypes;\n                    propTypes ? (currentlyValidatingElement = element, checkPropTypes(propTypes, element.props, \"prop\", name, getStackAddendum), \n                    currentlyValidatingElement = null) : void 0 === componentClass.PropTypes || propTypesMisspellWarningShown || (propTypesMisspellWarningShown = !0, \n                    warning(!1, \"Component %s declared ` + \"`\"))))) + ((((`PropTypes` + (\"`\" + ` instead of `)) + (\"`\" + (`propTypes` + \"`\"))) + ((`. Did you misspell the property assignment?\", name || \"Unknown\")), \n                    \"function\" == typeof componentClass.getDefaultProps && (componentClass.getDefaultProps.isReactClassApproved || warning(!1, \"getDefaultProps is only used on classic React.createClass definitions. Use a static property named ` + (\"`\" + `defaultProps`)) + (\"`\" + (` instead.\"));\n                }\n            }\n            function validateFragmentProps(fragment) {\n                currentlyValidatingElement = fragment;\n                for (var keys = Object.keys(fragment.props), i = 0; i < keys.length; i++) {\n                    var key = keys[i];\n                    if (\"children\" !== key && \"key\" !== key) {\n                        warning(!1, \"Invalid prop ` + \"`\")))) + (((`%s` + (\"`\" + ` supplied to `)) + (\"`\" + (`React.Fragment` + \"`\"))) + ((`. React.Fragment can only have ` + (\"`\" + `key`)) + (\"`\" + (` and ` + \"`\"))))))) + ((((((`children` + (\"`\" + ` props.%s\", key, getStackAddendum());\n                        break;\n                    }\n                }\n                null !== fragment.ref && warning(!1, \"Invalid attribute `)) + (\"`\" + (`ref` + \"`\"))) + ((` supplied to ` + (\"`\" + `React.Fragment`)) + (\"`\" + (`.%s\", getStackAddendum()), \n                currentlyValidatingElement = null;\n            }\n            function createElementWithValidation(type, props, children) {\n                var validType = isValidElementType(type);\n                if (!validType) {\n                    var info = \"\";\n                    (void 0 === type || \"object\" == typeof type && null !== type && 0 === Object.keys(type).length) && (info += \" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.\");\n                    var sourceInfo = getSourceInfoErrorAddendum(props);\n                    info += sourceInfo || getDeclarationErrorAddendum(), info += getStackAddendum() || \"\";\n                    var typeString = void 0;\n                    typeString = null === type ? \"null\" : Array.isArray(type) ? \"array\" : typeof type, \n                    warning(!1, \"React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\", typeString, info);\n                }\n                var element = createElement.apply(this, arguments);\n                if (null == element) return element;\n                if (validType) for (var i = 2; i < arguments.length; i++) validateChildKeys(arguments[i], type);\n                return type === REACT_FRAGMENT_TYPE ? validateFragmentProps(element) : validatePropTypes(element), \n                element;\n            }\n            function createFactoryWithValidation(type) {\n                var validatedFactory = createElementWithValidation.bind(null, type);\n                return validatedFactory.type = type, Object.defineProperty(validatedFactory, \"type\", {\n                    enumerable: !1,\n                    get: function() {\n                        return lowPriorityWarning$1(!1, \"Factory.type is deprecated. Access the class directly before passing it to createFactory.\"), \n                        Object.defineProperty(this, \"type\", {\n                            value: type\n                        }), type;\n                    }\n                }), validatedFactory;\n            }\n            function cloneElementWithValidation(element, props, children) {\n                for (var newElement = cloneElement.apply(this, arguments), i = 2; i < arguments.length; i++) validateChildKeys(arguments[i], newElement.type);\n                return validatePropTypes(newElement), newElement;\n            }\n            var _assign = __webpack_require__(74), invariant = __webpack_require__(49), emptyObject = __webpack_require__(97), warning = __webpack_require__(98), emptyFunction = __webpack_require__(50), checkPropTypes = __webpack_require__(143), hasSymbol = \"function\" == typeof Symbol && Symbol.for, REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for(\"react.element\") : 60103, REACT_PORTAL_TYPE = hasSymbol ? Symbol.for(\"react.portal\") : 60106, REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for(\"react.fragment\") : 60107, REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for(\"react.strict_mode\") : 60108, REACT_PROFILER_TYPE = hasSymbol ? Symbol.for(\"react.profiler\") : 60114, REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for(\"react.provider\") : 60109, REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for(\"react.context\") : 60110, REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for(\"react.async_mode\") : 60111, REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for(\"react.forward_ref\") : 60112, REACT_TIMEOUT_TYPE = hasSymbol ? Symbol.for(\"react.timeout\") : 60113, MAYBE_ITERATOR_SYMBOL = \"function\" == typeof Symbol && Symbol.iterator, FAUX_ITERATOR_SYMBOL = \"@@iterator\", lowPriorityWarning = function() {}, printWarning = function(format) {\n                for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];\n                var argIndex = 0, message = \"Warning: \" + format.replace(/%s/g, function() {\n                    return args[argIndex++];\n                });\n                \"undefined\" != typeof console && console.warn(message);\n                try {\n                    throw new Error(message);\n                } catch (x) {}\n            };\n            lowPriorityWarning = function(condition, format) {\n                if (void 0 === format) throw new Error(\"` + \"`\")))) + (((`warning(condition, format, ...args)` + (\"`\" + ` requires a warning message argument\");\n                if (!condition) {\n                    for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2];\n                    printWarning.apply(void 0, [ format ].concat(args));\n                }\n            };\n            var lowPriorityWarning$1 = lowPriorityWarning, didWarnStateUpdateForUnmountedComponent = {}, ReactNoopUpdateQueue = {\n                isMounted: function(publicInstance) {\n                    return !1;\n                },\n                enqueueForceUpdate: function(publicInstance, callback, callerName) {\n                    warnNoop(publicInstance, \"forceUpdate\");\n                },\n                enqueueReplaceState: function(publicInstance, completeState, callback, callerName) {\n                    warnNoop(publicInstance, \"replaceState\");\n                },\n                enqueueSetState: function(publicInstance, partialState, callback, callerName) {\n                    warnNoop(publicInstance, \"setState\");\n                }\n            };\n            Component.prototype.isReactComponent = {}, Component.prototype.setState = function(partialState, callback) {\n                \"object\" != typeof partialState && \"function\" != typeof partialState && null != partialState && invariant(!1, \"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\"), \n                this.updater.enqueueSetState(this, partialState, callback, \"setState\");\n            }, Component.prototype.forceUpdate = function(callback) {\n                this.updater.enqueueForceUpdate(this, callback, \"forceUpdate\");\n            };\n            var deprecatedAPIs = {\n                isMounted: [ \"isMounted\", \"Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks.\" ],\n                replaceState: [ \"replaceState\", \"Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236).\" ]\n            };\n            for (var fnName in deprecatedAPIs) deprecatedAPIs.hasOwnProperty(fnName) && function(methodName, info) {\n                Object.defineProperty(Component.prototype, methodName, {\n                    get: function() {\n                        lowPriorityWarning$1(!1, \"%s(...) is deprecated in plain JavaScript React classes. %s\", info[0], info[1]);\n                    }\n                });\n            }(fnName, deprecatedAPIs[fnName]);\n            ComponentDummy.prototype = Component.prototype;\n            var pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\n            pureComponentPrototype.constructor = PureComponent, _assign(pureComponentPrototype, Component.prototype), \n            pureComponentPrototype.isPureReactComponent = !0;\n            var ReactCurrentOwner = {\n                current: null\n            }, hasOwnProperty = Object.prototype.hasOwnProperty, RESERVED_PROPS = {\n                key: !0,\n                ref: !0,\n                __self: !0,\n                __source: !0\n            }, specialPropKeyWarningShown = void 0, specialPropRefWarningShown = void 0, ReactElement = function(type, key, ref, self, source, owner, props) {\n                var element = {\n                    $$typeof: REACT_ELEMENT_TYPE,\n                    type: type,\n                    key: key,\n                    ref: ref,\n                    props: props,\n                    _owner: owner\n                };\n                return element._store = {}, Object.defineProperty(element._store, \"validated\", {\n                    configurable: !1,\n                    enumerable: !1,\n                    writable: !0,\n                    value: !1\n                }), Object.defineProperty(element, \"_self\", {\n                    configurable: !1,\n                    enumerable: !1,\n                    writable: !1,\n                    value: self\n                }), Object.defineProperty(element, \"_source\", {\n                    configurable: !1,\n                    enumerable: !1,\n                    writable: !1,\n                    value: source\n                }), Object.freeze && (Object.freeze(element.props), Object.freeze(element)), element;\n            }, ReactDebugCurrentFrame = {};\n            ReactDebugCurrentFrame.getCurrentStack = null, ReactDebugCurrentFrame.getStackAddendum = function() {\n                var impl = ReactDebugCurrentFrame.getCurrentStack;\n                return impl ? impl() : null;\n            };\n            var SEPARATOR = \".\", SUBSEPARATOR = \":\", didWarnAboutMaps = !1, userProvidedKeyEscapeRegex = /\\/+/g, POOL_SIZE = 10, traverseContextPool = [], describeComponentFrame = function(name, source, ownerName) {\n                return \"\\n    in \" + (name || \"Unknown\") + (source ? \" (at \" + source.fileName.replace(/^.*[\\\\\\/]/, \"\") + \":\" + source.lineNumber + \")\" : ownerName ? \" (created by \" + ownerName + \")\" : \"\");\n            }, currentlyValidatingElement = void 0, propTypesMisspellWarningShown = void 0, getDisplayName = function() {}, getStackAddendum = function() {};\n            currentlyValidatingElement = null, propTypesMisspellWarningShown = !1, getDisplayName = function(element) {\n                return null == element ? \"#empty\" : \"string\" == typeof element || \"number\" == typeof element ? \"#text\" : \"string\" == typeof element.type ? element.type : element.type === REACT_FRAGMENT_TYPE ? \"React.Fragment\" : element.type.displayName || element.type.name || \"Unknown\";\n            }, getStackAddendum = function() {\n                var stack = \"\";\n                if (currentlyValidatingElement) {\n                    var name = getDisplayName(currentlyValidatingElement), owner = currentlyValidatingElement._owner;\n                    stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner));\n                }\n                return stack += ReactDebugCurrentFrame.getStackAddendum() || \"\";\n            };\n            var ownerHasKeyUseWarning = {}, React = {\n                Children: {\n                    map: mapChildren,\n                    forEach: forEachChildren,\n                    count: countChildren,\n                    toArray: toArray,\n                    only: onlyChild\n                },\n                createRef: createRef,\n                Component: Component,\n                PureComponent: PureComponent,\n                createContext: createContext,\n                forwardRef: forwardRef,\n                Fragment: REACT_FRAGMENT_TYPE,\n                StrictMode: REACT_STRICT_MODE_TYPE,\n                unstable_AsyncMode: REACT_ASYNC_MODE_TYPE,\n                unstable_Profiler: REACT_PROFILER_TYPE,\n                createElement: createElementWithValidation,\n                cloneElement: cloneElementWithValidation,\n                createFactory: createFactoryWithValidation,\n                isValidElement: isValidElement,\n                version: \"16.4.0\",\n                __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n                    ReactCurrentOwner: ReactCurrentOwner,\n                    assign: _assign\n                }\n            };\n            _assign(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {\n                ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n                ReactComponentTreeHook: {}\n            });\n            var React$2 = Object.freeze({\n                default: React\n            }), React$3 = React$2 && React || React$2, react = React$3.default ? React$3.default : React$3;\n            module.exports = react;\n        }();\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function A(a) {\n        for (var b = arguments.length - 1, c = \"https://reactjs.org/docs/error-decoder.html?invariant=\" + a, d = 0; d < b; d++) c += \"&args[]=\" + encodeURIComponent(arguments[d + 1]);\n        aa(!1, \"Minified React error #\" + a + \"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \", c);\n    }\n    function ia(a, b, c, d, e, f, g, h, k) {\n        this._hasCaughtError = !1, this._caughtError = null;\n        var n = Array.prototype.slice.call(arguments, 3);\n        try {\n            b.apply(c, n);\n        } catch (r) {\n            this._caughtError = r, this._hasCaughtError = !0;\n        }\n    }\n    function ka() {\n        if (B._hasRethrowError) {\n            var a = B._rethrowError;\n            throw B._rethrowError = null, B._hasRethrowError = !1, a;\n        }\n    }\n    function na() {\n        if (la) for (var a in ma) {\n            var b = ma[a], c = la.indexOf(a);\n            if (-1 < c || A(\"96\", a), !oa[c]) {\n                b.extractEvents || A(\"97\", a), oa[c] = b, c = b.eventTypes;\n                for (var d in c) {\n                    var e = void 0, f = c[d], g = b, h = d;\n                    pa.hasOwnProperty(h) && A(\"99\", h), pa[h] = f;\n                    var k = f.phasedRegistrationNames;\n                    if (k) {\n                        for (e in k) k.hasOwnProperty(e) && qa(k[e], g, h);\n                        e = !0;\n                    } else f.registrationName ? (qa(f.registrationName, g, h), e = !0) : e = !1;\n                    e || A(\"98\", d, a);\n                }\n            }\n        }\n    }\n    function qa(a, b, c) {\n        ra[a] && A(\"100\", a), ra[a] = b, sa[a] = b.eventTypes[c].dependencies;\n    }\n    function ta(a) {\n        la && A(\"101\"), la = Array.prototype.slice.call(a), na();\n    }\n    function ua(a) {\n        var c, b = !1;\n        for (c in a) if (a.hasOwnProperty(c)) {\n            var d = a[c];\n            ma.hasOwnProperty(c) && ma[c] === d || (ma[c] && A(\"102\", c), ma[c] = d, b = !0);\n        }\n        b && na();\n    }\n    function za(a, b, c, d) {\n        b = a.type || \"unknown-event\", a.currentTarget = ya(d), B.invokeGuardedCallbackAndCatchFirstError(b, c, void 0, a), \n        a.currentTarget = null;\n    }\n    function Aa(a, b) {\n        return null == b && A(\"30\"), null == a ? b : Array.isArray(a) ? Array.isArray(b) ? (a.push.apply(a, b), \n        a) : (a.push(b), a) : Array.isArray(b) ? [ a ].concat(b) : [ a, b ];\n    }\n    function Ba(a, b, c) {\n        Array.isArray(a) ? a.forEach(b, c) : a && b.call(c, a);\n    }\n    function Da(a, b) {\n        if (a) {\n            var c = a._dispatchListeners, d = a._dispatchInstances;\n            if (Array.isArray(c)) for (var e = 0; e < c.length && !a.isPropagationStopped(); e++) za(a, b, c[e], d[e]); else c && za(a, b, c, d);\n            a._dispatchListeners = null, a._dispatchInstances = null, a.isPersistent() || a.constructor.release(a);\n        }\n    }\n    function Ea(a) {\n        return Da(a, !0);\n    }\n    function Fa(a) {\n        return Da(a, !1);\n    }\n    function Ha(a, b) {\n        var c = a.stateNode;\n        if (!c) return null;\n        var d = wa(c);\n        if (!d) return null;\n        c = d[b];\n        a: switch (b) {\n          case \"onClick\":\n          case \"onClickCapture\":\n          case \"onDoubleClick\":\n          case \"onDoubleClickCapture\":\n          case \"onMouseDown\":\n          case \"onMouseDownCapture\":\n          case \"onMouseMove\":\n          case \"onMouseMoveCapture\":\n          case \"onMouseUp\":\n          case \"onMouseUpCapture\":\n            (d = !d.disabled) || (a = a.type, d = !(\"button\" === a || \"input\" === a || \"select\" === a || \"textarea\" === a)), \n            a = !d;\n            break a;\n\n          default:\n            a = !1;\n        }\n        return a ? null : (c && \"function\" != typeof c && A(\"231\", b, typeof c), c);\n    }\n    function Ia(a, b) {\n        null !== a && (Ca = Aa(Ca, a)), a = Ca, Ca = null, a && (b ? Ba(a, Ea) : Ba(a, Fa), \n        Ca && A(\"95\"), B.rethrowCaughtError());\n    }\n    function Ja(a, b, c, d) {\n        for (var e = null, f = 0; f < oa.length; f++) {\n            var g = oa[f];\n            g && (g = g.extractEvents(a, b, c, d)) && (e = Aa(e, g));\n        }\n        Ia(e, !1);\n    }\n    function Na(a) {\n        if (a[C]) return a[C];\n        for (;!a[C]; ) {\n            if (!a.parentNode) return null;\n            a = a.parentNode;\n        }\n        return a = a[C], 5 === a.tag || 6 === a.tag ? a : null;\n    }\n    function Oa(a) {\n        if (5 === a.tag || 6 === a.tag) return a.stateNode;\n        A(\"33\");\n    }\n    function Pa(a) {\n        return a[Ma] || null;\n    }\n    function F(a) {\n        do {\n            a = a.return;\n        } while (a && 5 !== a.tag);\n        return a || null;\n    }\n    function Ra(a, b, c) {\n        for (var d = []; a; ) d.push(a), a = F(a);\n        for (a = d.length; 0 < a--; ) b(d[a], \"captured\", c);\n        for (a = 0; a < d.length; a++) b(d[a], \"bubbled\", c);\n    }\n    function Sa(a, b, c) {\n        (b = Ha(a, c.dispatchConfig.phasedRegistrationNames[b])) && (c._dispatchListeners = Aa(c._dispatchListeners, b), \n        c._dispatchInstances = Aa(c._dispatchInstances, a));\n    }\n    function Ta(a) {\n        a && a.dispatchConfig.phasedRegistrationNames && Ra(a._targetInst, Sa, a);\n    }\n    function Ua(a) {\n        if (a && a.dispatchConfig.phasedRegistrationNames) {\n            var b = a._targetInst;\n            b = b ? F(b) : null, Ra(b, Sa, a);\n        }\n    }\n    function Va(a, b, c) {\n        a && c && c.dispatchConfig.registrationName && (b = Ha(a, c.dispatchConfig.registrationName)) && (c._dispatchListeners = Aa(c._dispatchListeners, b), \n        c._dispatchInstances = Aa(c._dispatchInstances, a));\n    }\n    function Xa(a) {\n        a && a.dispatchConfig.registrationName && Va(a._targetInst, null, a);\n    }\n    function Ya(a) {\n        Ba(a, Ta);\n    }\n    function Za(a, b, c, d) {\n        if (c && d) a: {\n            for (var e = c, f = d, g = 0, h = e; h; h = F(h)) g++;\n            h = 0;\n            for (var k = f; k; k = F(k)) h++;\n            for (;0 < g - h; ) e = F(e), g--;\n            for (;0 < h - g; ) f = F(f), h--;\n            for (;g--; ) {\n                if (e === f || e === f.alternate) break a;\n                e = F(e), f = F(f);\n            }\n            e = null;\n        } else e = null;\n        for (f = e, e = []; c && c !== f && (null === (g = c.alternate) || g !== f); ) e.push(c), \n        c = F(c);\n        for (c = []; d && d !== f && (null === (g = d.alternate) || g !== f); ) c.push(d), \n        d = F(d);\n        for (d = 0; d < e.length; d++) Va(e[d], \"bubbled\", a);\n        for (a = c.length; 0 < a--; ) Va(c[a], \"captured\", b);\n    }\n    function ab(a, b) {\n        var c = {};\n        return c[a.toLowerCase()] = b.toLowerCase(), c[\"Webkit\" + a] = \"webkit\" + b, c[\"Moz\" + a] = \"moz\" + b, \n        c[\"ms\" + a] = \"MS\" + b, c[\"O\" + a] = \"o\" + b.toLowerCase(), c;\n    }\n    function eb(a) {\n        if (cb[a]) return cb[a];\n        if (!bb[a]) return a;\n        var c, b = bb[a];\n        for (c in b) if (b.hasOwnProperty(c) && c in db) return cb[a] = b[c];\n        return a;\n    }\n    function lb() {\n        return !kb && m.canUseDOM && (kb = \"textContent\" in document.documentElement ? \"textContent\" : \"innerText\"), \n        kb;\n    }\n    function mb() {\n        if (G._fallbackText) return G._fallbackText;\n        var a, d, b = G._startText, c = b.length, e = nb(), f = e.length;\n        for (a = 0; a < c && b[a] === e[a]; a++) ;\n        var g = c - a;\n        for (d = 1; d <= g && b[c - d] === e[f - d]; d++) ;\n        return G._fallbackText = e.slice(a, 1 < d ? 1 - d : void 0), G._fallbackText;\n    }\n    function nb() {\n        return \"value\" in G._root ? G._root.value : G._root[lb()];\n    }\n    function H(a, b, c, d) {\n        this.dispatchConfig = a, this._targetInst = b, this.nativeEvent = c, a = this.constructor.Interface;\n        for (var e in a) a.hasOwnProperty(e) && ((b = a[e]) ? this[e] = b(c) : \"target\" === e ? this.target = d : this[e] = c[e]);\n        return this.isDefaultPrevented = (null != c.defaultPrevented ? c.defaultPrevented : !1 === c.returnValue) ? v.thatReturnsTrue : v.thatReturnsFalse, \n        this.isPropagationStopped = v.thatReturnsFalse, this;\n    }\n    function rb(a, b, c, d) {\n        if (this.eventPool.length) {\n            var e = this.eventPool.pop();\n            return this.call(e, a, b, c, d), e;\n        }\n        return new this(a, b, c, d);\n    }\n    function sb(a) {\n        a instanceof this || A(\"223\"), a.destructor(), 10 > this.eventPool.length && this.eventPool.push(a);\n    }\n    function qb(a) {\n        a.eventPool = [], a.getPooled = rb, a.release = sb;\n    }\n    function Db(a, b) {\n        switch (a) {\n          case \"keyup\":\n            return -1 !== vb.indexOf(b.keyCode);\n\n          case \"keydown\":\n            return 229 !== b.keyCode;\n\n          case \"keypress\":\n          case \"mousedown\":\n          case \"blur\":\n            return !0;\n\n          default:\n            return !1;\n        }\n    }\n    function Eb(a) {\n        return a = a.detail, \"object\" == typeof a && \"data\" in a ? a.data : null;\n    }\n    function Gb(a, b) {\n        switch (a) {\n          case \"compositionend\":\n            return Eb(b);\n\n          case \"keypress\":\n            return 32 !== b.which ? null : (Cb = !0, Ab);\n\n          case \"textInput\":\n            return a = b.data, a === Ab && Cb ? null : a;\n\n          default:\n            return null;\n        }\n    }\n    function Hb(a, b) {\n        if (Fb) return \"compositionend\" === a || !wb && Db(a, b) ? (a = mb(), G._root = null, \n        G._startText = null, G._fallbackText = null, Fb = !1, a) : null;\n        switch (a) {\n          case \"paste\":\n            return null;\n\n          case \"keypress\":\n            if (!(b.ctrlKey || b.altKey || b.metaKey) || b.ctrlKey && b.altKey) {\n                if (b.char && 1 < b.char.length) return b.char;\n                if (b.which) return String.fromCharCode(b.which);\n            }\n            return null;\n\n          case \"compositionend\":\n            return zb ? null : b.data;\n\n          default:\n            return null;\n        }\n    }\n    function Nb(a) {\n        if (a = xa(a)) {\n            Jb && \"function\" == typeof Jb.restoreControlledState || A(\"194\");\n            var b = wa(a.stateNode);\n            Jb.restoreControlledState(a.stateNode, a.type, b);\n        }\n    }\n    function Ob(a) {\n        Lb ? Mb ? Mb.push(a) : Mb = [ a ] : Lb = a;\n    }\n    function Pb() {\n        return null !== Lb || null !== Mb;\n    }\n    function Qb() {\n        if (Lb) {\n            var a = Lb, b = Mb;\n            if (Mb = Lb = null, Nb(a), b) for (a = 0; a < b.length; a++) Nb(b[a]);\n        }\n    }\n    function Sb(a, b) {\n        return a(b);\n    }\n    function Tb(a, b, c) {\n        return a(b, c);\n    }\n    function Ub() {}\n    function Wb(a, b) {\n        if (Vb) return a(b);\n        Vb = !0;\n        try {\n            return Sb(a, b);\n        } finally {\n            Vb = !1, Pb() && (Ub(), Qb());\n        }\n    }\n    function Yb(a) {\n        var b = a && a.nodeName && a.nodeName.toLowerCase();\n        return \"input\" === b ? !!Xb[a.type] : \"textarea\" === b;\n    }\n    function Zb(a) {\n        return a = a.target || window, a.correspondingUseElement && (a = a.correspondingUseElement), \n        3 === a.nodeType ? a.parentNode : a;\n    }\n    function $b(a, b) {\n        return !(!m.canUseDOM || b && !(\"addEventListener\" in document)) && (a = \"on\" + a, \n        b = a in document, b || (b = document.createElement(\"div\"), b.setAttribute(a, \"return;\"), \n        b = \"function\" == typeof b[a]), b);\n    }\n    function ac(a) {\n        var b = a.type;\n        return (a = a.nodeName) && \"input\" === a.toLowerCase() && (\"checkbox\" === b || \"radio\" === b);\n    }\n    function bc(a) {\n        var b = ac(a) ? \"checked\" : \"value\", c = Object.getOwnPropertyDescriptor(a.constructor.prototype, b), d = \"\" + a[b];\n        if (!a.hasOwnProperty(b) && void 0 !== c && \"function\" == typeof c.get && \"function\" == typeof c.set) {\n            var e = c.get, f = c.set;\n            return Object.defineProperty(a, b, {\n                configurable: !0,\n                get: function() {\n                    return e.call(this);\n                },\n                set: function(a) {\n                    d = \"\" + a, f.call(this, a);\n                }\n            }), Object.defineProperty(a, b, {\n                enumerable: c.enumerable\n            }), {\n                getValue: function() {\n                    return d;\n                },\n                setValue: function(a) {\n                    d = \"\" + a;\n                },\n                stopTracking: function() {\n                    a._valueTracker = null, delete a[b];\n                }\n            };\n        }\n    }\n    function cc(a) {\n        a._valueTracker || (a._valueTracker = bc(a));\n    }\n    function dc(a) {\n        if (!a) return !1;\n        var b = a._valueTracker;\n        if (!b) return !0;\n        var c = b.getValue(), d = \"\";\n        return a && (d = ac(a) ? a.checked ? \"true\" : \"false\" : a.value), (a = d) !== c && (b.setValue(a), \n        !0);\n    }\n    function sc(a) {\n        return null === a || void 0 === a ? null : (a = rc && a[rc] || a[\"@@iterator\"], \n        \"function\" == typeof a ? a : null);\n    }\n    function tc(a) {\n        var b = a.type;\n        if (\"function\" == typeof b) return b.displayName || b.name;\n        if (\"string\" == typeof b) return b;\n        switch (b) {\n          case oc:\n            return \"AsyncMode\";\n\n          case nc:\n            return \"Context.Consumer\";\n\n          case hc:\n            return \"ReactFragment\";\n\n          case gc:\n            return \"ReactPortal\";\n\n          case jc:\n            return \"Profiler(\" + a.pendingProps.id + \")\";\n\n          case mc:\n            return \"Context.Provider\";\n\n          case ic:\n            return \"StrictMode\";\n\n          case qc:\n            return \"Timeout\";\n        }\n        if (\"object\" == typeof b && null !== b) switch (b.$$typeof) {\n          case pc:\n            return a = b.render.displayName || b.render.name || \"\", \"\" !== a ? \"ForwardRef(\" + a + \")\" : \"ForwardRef\";\n        }\n        return null;\n    }\n    function vc(a) {\n        var b = \"\";\n        do {\n            a: switch (a.tag) {\n              case 0:\n              case 1:\n              case 2:\n              case 5:\n                var c = a._debugOwner, d = a._debugSource, e = tc(a), f = null;\n                c && (f = tc(c)), c = d, e = \"\\n    in \" + (e || \"Unknown\") + (c ? \" (at \" + c.fileName.replace(/^.*[\\\\\\/]/, \"\") + \":\" + c.lineNumber + \")\" : f ? \" (created by \" + f + \")\" : \"\");\n                break a;\n\n              default:\n                e = \"\";\n            }\n            b += e, a = a.return;\n        } while (a);\n        return b;\n    }\n    function zc(a) {\n        return !!yc.hasOwnProperty(a) || !xc.hasOwnProperty(a) && (wc.test(a) ? yc[a] = !0 : (xc[a] = !0, \n        !1));\n    }\n    function Ac(a, b, c, d) {\n        if (null !== c && 0 === c.type) return !1;\n        switch (typeof b) {\n          case \"function\":\n          case \"symbol\":\n            return !0;\n\n          case \"boolean\":\n            return !d && (null !== c ? !c.acceptsBooleans : \"data-\" !== (a = a.toLowerCase().slice(0, 5)) && \"aria-\" !== a);\n\n          default:\n            return !1;\n        }\n    }\n    function Bc(a, b, c, d) {\n        if (null === b || void 0 === b || Ac(a, b, c, d)) return !0;\n        if (d) return !1;\n        if (null !== c) switch (c.type) {\n          case 3:\n            return !b;\n\n          case 4:\n            return !1 === b;\n\n          case 5:\n            return isNaN(b);\n\n          case 6:\n            return isNaN(b) || 1 > b;\n        }\n        return !1;\n    }\n    function J(a, b, c, d, e) {\n        this.acceptsBooleans = 2 === b || 3 === b || 4 === b, this.attributeName = d, this.attributeNamespace = e, \n        this.mustUseProperty = c, this.propertyName = a, this.type = b;\n    }\n    function Dc(a) {\n        return a[1].toUpperCase();\n    }\n    function Ec(a, b, c, d) {\n        var e = K.hasOwnProperty(b) ? K[b] : null;\n        (null !== e ? 0 === e.type : !d && (2 < b.length && (\"o\" === b[0] || \"O\" === b[0]) && (\"n\" === b[1] || \"N\" === b[1]))) || (Bc(b, c, e, d) && (c = null), \n        d || null === e ? zc(b) && (null === c ? a.removeAttribute(b) : a.setAttribute(b, \"\" + c)) : e.mustUseProperty ? a[e.propertyName] = null === c ? 3 !== e.type && \"\" : c : (b = e.attributeName, \n        d = e.attributeNamespace, null === c ? a.removeAttribute(b) : (e = e.type, c = 3 === e || 4 === e && !0 === c ? \"\" : \"\" + c, \n        d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c))));\n    }\n    function Fc(a, b) {\n        var c = b.checked;\n        return p({}, b, {\n            defaultChecked: void 0,\n            defaultValue: void 0,\n            value: void 0,\n            checked: null != c ? c : a._wrapperState.initialChecked\n        });\n    }\n    function Gc(a, b) {\n        var c = null == b.defaultValue ? \"\" : b.defaultValue, d = null != b.checked ? b.checked : b.defaultChecked;\n        c = Hc(null != b.value ? b.value : c), a._wrapperState = {\n            initialChecked: d,\n            initialValue: c,\n            controlled: \"checkbox\" === b.type || \"radio\" === b.type ? null != b.checked : null != b.value\n        };\n    }\n    function Ic(a, b) {\n        null != (b = b.checked) && Ec(a, \"checked\", b, !1);\n    }\n    function Jc(a, b) {\n        Ic(a, b);\n        var c = Hc(b.value);\n        null != c && (\"number\" === b.type ? (0 === c && \"\" === a.value || a.value != c) && (a.value = \"\" + c) : a.value !== \"\" + c && (a.value = \"\" + c)), \n        b.hasOwnProperty(\"value\") ? Kc(a, b.type, c) : b.hasOwnProperty(\"defaultValue\") && Kc(a, b.type, Hc(b.defaultValue)), \n        null == b.checked && null != b.defaultChecked && (a.defaultChecked = !!b.defaultChecked);\n    }\n    function Lc(a, b) {\n        (b.hasOwnProperty(\"value\") || b.hasOwnProperty(\"defaultValue\")) && (\"\" === a.value && (a.value = \"\" + a._wrapperState.initialValue), \n        a.defaultValue = \"\" + a._wrapperState.initialValue), b = a.name, \"\" !== b && (a.name = \"\"), \n        a.defaultChecked = !a.defaultChecked, a.defaultChecked = !a.defaultChecked, \"\" !== b && (a.name = b);\n    }\n    function Kc(a, b, c) {\n        \"number\" === b && a.ownerDocument.activeElement === a || (null == c ? a.defaultValue = \"\" + a._wrapperState.initialValue : a.defaultValue !== \"\" + c && (a.defaultValue = \"\" + c));\n    }\n    function Hc(a) {\n        switch (typeof a) {\n          case \"boolean\":\n          case \"number\":\n          case \"object\":\n          case \"string\":\n          case \"undefined\":\n            return a;\n\n          default:\n            return \"\";\n        }\n    }\n    function Nc(a, b, c) {\n        return a = H.getPooled(Mc.change, a, b, c), a.type = \"change\", Ob(c), Ya(a), a;\n    }\n    function Qc(a) {\n        Ia(a, !1);\n    }\n    function Rc(a) {\n        if (dc(Oa(a))) return a;\n    }\n    function Sc(a, b) {\n        if (\"change\" === a) return b;\n    }\n    function Uc() {\n        Oc && (Oc.detachEvent(\"onpropertychange\", Vc), Pc = Oc = null);\n    }\n    function Vc(a) {\n        \"value\" === a.propertyName && Rc(Pc) && (a = Nc(Pc, a, Zb(a)), Wb(Qc, a));\n    }\n    function Wc(a, b, c) {\n        \"focus\" === a ? (Uc(), Oc = b, Pc = c, Oc.attachEvent(\"onpropertychange\", Vc)) : \"blur\" === a && Uc();\n    }\n    function Xc(a) {\n        if (\"selectionchange\" === a || \"keyup\" === a || \"keydown\" === a) return Rc(Pc);\n    }\n    function Yc(a, b) {\n        if (\"click\" === a) return Rc(b);\n    }\n    function Zc(a, b) {\n        if (\"input\" === a || \"change\" === a) return Rc(b);\n    }\n    function cd(a) {\n        var b = this.nativeEvent;\n        return b.getModifierState ? b.getModifierState(a) : !!(a = bd[a]) && !!b[a];\n    }\n    function dd() {\n        return cd;\n    }\n    function id(a) {\n        var b = a;\n        if (a.alternate) for (;b.return; ) b = b.return; else {\n            if (0 != (2 & b.effectTag)) return 1;\n            for (;b.return; ) if (b = b.return, 0 != (2 & b.effectTag)) return 1;\n        }\n        return 3 === b.tag ? 2 : 3;\n    }\n    function jd(a) {\n        2 !== id(a) && A(\"188\");\n    }\n    function kd(a) {\n        var b = a.alternate;\n        if (!b) return b = id(a), 3 === b && A(\"188\"), 1 === b ? null : a;\n        for (var c = a, d = b; ;) {\n            var e = c.return, f = e ? e.alternate : null;\n            if (!e || !f) break;\n            if (e.child === f.child) {\n                for (var g = e.child; g; ) {\n                    if (g === c) return jd(e), a;\n                    if (g === d) return jd(e), b;\n                    g = g.sibling;\n                }\n                A(\"188\");\n            }\n            if (c.return !== d.return) c = e, d = f; else {\n                g = !1;\n                for (var h = e.child; h; ) {\n                    if (h === c) {\n                        g = !0, c = e, d = f;\n                        break;\n                    }\n                    if (h === d) {\n                        g = !0, d = e, c = f;\n                        break;\n                    }\n                    h = h.sibling;\n                }\n                if (!g) {\n                    for (h = f.child; h; ) {\n                        if (h === c) {\n                            g = !0, c = f, d = e;\n                            break;\n                        }\n                        if (h === d) {\n                            g = !0, d = f, c = e;\n                            break;\n                        }\n                        h = h.sibling;\n                    }\n                    g || A(\"189\");\n                }\n            }\n            c.alternate !== d && A(\"190\");\n        }\n        return 3 !== c.tag && A(\"188\"), c.stateNode.current === c ? a : b;\n    }\n    function ld(a) {\n        if (!(a = kd(a))) return null;\n        for (var b = a; ;) {\n            if (5 === b.tag || 6 === b.tag) return b;\n            if (b.child) b.child.return = b, b = b.child; else {\n                if (b === a) break;\n                for (;!b.sibling; ) {\n                    if (!b.return || b.return === a) return null;\n                    b = b.return;\n                }\n                b.sibling.return = b.return, b = b.sibling;\n            }\n        }\n        return null;\n    }\n    function md(a) {\n        if (!(a = kd(a))) return null;\n        for (var b = a; ;) {\n            if (5 === b.tag || 6 === b.tag) return b;\n            if (b.child && 4 !== b.tag) b.child.return = b, b = b.child; else {\n                if (b === a) break;\n                for (;!b.sibling; ) {\n                    if (!b.return || b.return === a) return null;\n                    b = b.return;\n                }\n                b.sibling.return = b.return, b = b.sibling;\n            }\n        }\n        return null;\n    }\n    function qd(a) {\n        var b = a.keyCode;\n        return \"charCode\" in a ? 0 === (a = a.charCode) && 13 === b && (a = 13) : a = b, \n        10 === a && (a = 13), 32 <= a || 13 === a ? a : 0;\n    }\n    function Bd(a, b) {\n        var c = a[0];\n        a = a[1];\n        var d = \"on\" + (a[0].toUpperCase() + a.slice(1));\n        b = {\n            phasedRegistrationNames: {\n                bubbled: d,\n                captured: d + \"Capture\"\n            },\n            dependencies: [ c ],\n            isInteractive: b\n        }, zd[a] = b, Ad[c] = b;\n    }\n    function Fd(a) {\n        var b = a.targetInst;\n        do {\n            if (!b) {\n                a.ancestors.push(b);\n                break;\n            }\n            var c;\n            for (c = b; c.return; ) c = c.return;\n            if (!(c = 3 !== c.tag ? null : c.stateNode.containerInfo)) break;\n            a.ancestors.push(b), b = Na(c);\n        } while (b);\n        for (c = 0; c < a.ancestors.length; c++) b = a.ancestors[c], Ja(a.topLevelType, b, a.nativeEvent, Zb(a.nativeEvent));\n    }\n    function Id(a) {\n        Gd = !!a;\n    }\n    function L(a, b) {\n        if (!b) return null;\n        var c = (Dd(a) ? Jd : Kd).bind(null, a);\n        b.addEventListener(a, c, !1);\n    }\n    function Ld(a, b) {\n        if (!b) return null;\n        var c = (Dd(a) ? Jd : Kd).bind(null, a);\n        b.addEventListener(a, c, !0);\n    }\n    function Jd(a, b) {\n        Tb(Kd, a, b);\n    }\n    function Kd(a, b) {\n        if (Gd) {\n            var c = Zb(b);\n            if (c = Na(c), null === c || \"number\" != typeof c.tag || 2 === id(c) || (c = null), \n            Ed.length) {\n                var d = Ed.pop();\n                d.topLevelType = a, d.nativeEvent = b, d.targetInst = c, a = d;\n            } else a = {\n                topLevelType: a,\n                nativeEvent: b,\n                targetInst: c,\n                ancestors: []\n            };\n            try {\n                Wb(Fd, a);\n            } finally {\n                a.topLevelType = null, a.nativeEvent = null, a.targetInst = null, a.ancestors.length = 0, \n                10 > Ed.length && Ed.push(a);\n            }\n        }\n    }\n    function Qd(a) {\n        return Object.prototype.hasOwnProperty.call(a, Pd) || (a[Pd] = Od++, Nd[a[Pd]] = {}), \n        Nd[a[Pd]];\n    }\n    function Rd(a) {\n        for (;a && a.firstChild; ) a = a.firstChild;\n        return a;\n    }\n    function Sd(a, b) {\n        var c = Rd(a);\n        a = 0;\n        for (var d; c; ) {\n            if (3 === c.nodeType) {\n                if (d = a + c.textContent.length, a <= b && d >= b) return {\n                    node: c,\n                    offset: b - a\n                };\n                a = d;\n            }\n            a: {\n                for (;c; ) {\n                    if (c.nextSibling) {\n                        c = c.nextSibling;\n                        break a;\n                    }\n                    c = c.parentNode;\n                }\n                c = void 0;\n            }\n            c = Rd(c);\n        }\n    }\n    function Td(a) {\n        var b = a && a.nodeName && a.nodeName.toLowerCase();\n        return b && (\"input\" === b && \"text\" === a.type || \"textarea\" === b || \"true\" === a.contentEditable);\n    }\n    function $d(a, b) {\n        if (Zd || null == Wd || Wd !== da()) return null;\n        var c = Wd;\n        return \"selectionStart\" in c && Td(c) ? c = {\n            start: c.selectionStart,\n            end: c.selectionEnd\n        } : window.getSelection ? (c = window.getSelection(), c = {\n            anchorNode: c.anchorNode,\n            anchorOffset: c.anchorOffset,\n            focusNode: c.focusNode,\n            focusOffset: c.focusOffset\n        }) : c = void 0, Yd && ea(Yd, c) ? null : (Yd = c, a = H.getPooled(Vd.select, Xd, a, b), \n        a.type = \"select\", a.target = Wd, Ya(a), a);\n    }\n    function te(a) {\n        var b = \"\";\n        return ca.Children.forEach(a, function(a) {\n            null == a || \"string\" != typeof a && \"number\" != typeof a || (b += a);\n        }), b;\n    }\n    function ue(a, b) {\n        return a = p({\n            children: void 0\n        }, b), (b = te(b.children)) && (a.children = b), a;\n    }\n    function ve(a, b, c, d) {\n        if (a = a.options, b) {\n            b = {};\n            for (var e = 0; e < c.length; e++) b[\"$\" + c[e]] = !0;\n            for (c = 0; c < a.length; c++) e = b.hasOwnProperty(\"$\" + a[c].value), a[c].selected !== e && (a[c].selected = e), \n            e && d && (a[c].defaultSelected = !0);\n        } else {\n            for (c = \"\" + c, b = null, e = 0; e < a.length; e++) {\n                if (a[e].value === c) return a[e].selected = !0, void (d && (a[e].defaultSelected = !0));\n                null !== b || a[e].disabled || (b = a[e]);\n            }\n            null !== b && (b.selected = !0);\n        }\n    }\n    function we(a, b) {\n        var c = b.value;\n        a._wrapperState = {\n            initialValue: null != c ? c : b.defaultValue,\n            wasMultiple: !!b.multiple\n        };\n    }\n    function xe(a, b) {\n        return null != b.dangerouslySetInnerHTML && A(\"91\"), p({}, b, {\n            value: void 0,\n            defaultValue: void 0,\n            children: \"\" + a._wrapperState.initialValue\n        });\n    }\n    function ye(a, b) {\n        var c = b.value;\n        null == c && (c = b.defaultValue, b = b.children, null != b && (null != c && A(\"92\"), \n        Array.isArray(b) && (1 >= b.length || A(\"93\"), b = b[0]), c = \"\" + b), null == c && (c = \"\")), \n        a._wrapperState = {\n            initialValue: \"\" + c\n        };\n    }\n    function ze(a, b) {\n        var c = b.value;\n        null != c && (c = \"\" + c, c !== a.value && (a.value = c), null == b.defaultValue && (a.defaultValue = c)), \n        null != b.defaultValue && (a.defaultValue = b.defaultValue);\n    }\n    function Ae(a) {\n        var b = a.textContent;\n        b === a._wrapperState.initialValue && (a.value = b);\n    }\n    function Ce(a) {\n        switch (a) {\n          case \"svg\":\n            return \"http://www.w3.org/2000/svg\";\n\n          case \"math\":\n            return \"http://www.w3.org/1998/Math/MathML\";\n\n          default:\n            return \"http://www.w3.org/1999/xhtml\";\n        }\n    }\n    function De(a, b) {\n        return null == a || \"http://www.w3.org/1999/xhtml\" === a ? Ce(b) : \"http://www.w3.org/2000/svg\" === a && \"foreignObject\" === b ? \"http://www.w3.org/1999/xhtml\" : a;\n    }\n    function Ge(a, b) {\n        if (b) {\n            var c = a.firstChild;\n            if (c && c === a.lastChild && 3 === c.nodeType) return void (c.nodeValue = b);\n        }\n        a.textContent = b;\n    }\n    function Je(a, b) {\n        a = a.style;\n        for (var c in b) if (b.hasOwnProperty(c)) {\n            var d = 0 === c.indexOf(\"--\"), e = c, f = b[c];\n            e = null == f || \"boolean\" == typeof f || \"\" === f ? \"\" : d || \"number\" != typeof f || 0 === f || He.hasOwnProperty(e) && He[e] ? (\"\" + f).trim() : f + \"px\", \n            \"float\" === c && (c = \"cssFloat\"), d ? a.setProperty(c, e) : a[c] = e;\n        }\n    }\n    function Le(a, b, c) {\n        b && (Ke[a] && (null != b.children || null != b.dangerouslySetInnerHTML) && A(\"137\", a, c()), \n        null != b.dangerouslySetInnerHTML && (null != b.children && A(\"60\"), \"object\" == typeof b.dangerouslySetInnerHTML && \"__html\" in b.dangerouslySetInnerHTML || A(\"61\")), \n        null != b.style && \"object\" != typeof b.style && A(\"62\", c()));\n    }\n    function Me(a, b) {\n        if (-1 === a.indexOf(\"-\")) return \"string\" == typeof b.is;\n        switch (a) {\n          case \"annotation-xml\":\n          case \"color-profile\":\n          case \"font-face\":\n          case \"font-face-src\":\n          case \"font-face-uri\":\n          case \"font-face-format\":\n          case \"font-face-name\":\n          case \"missing-glyph\":\n            return !1;\n\n          default:\n            return !0;\n        }\n    }\n    function Oe(a, b) {\n        a = 9 === a.nodeType || 11 === a.nodeType ? a : a.ownerDocument;\n        var c = Qd(a);\n        b = sa[b];\n        for (var d = 0; d < b.length; d++) {\n            var e = b[d];\n            if (!c.hasOwnProperty(e) || !c[e]) {\n                switch (e) {\n                  case \"scroll\":\n                    Ld(\"scroll\", a);\n                    break;\n\n                  case \"focus\":\n                  case \"blur\":\n                    Ld(\"focus\", a), Ld(\"blur\", a), c.blur = !0, c.focus = !0;\n                    break;\n\n                  case \"cancel\":\n                  case \"close\":\n                    $b(e, !0) && Ld(e, a);\n                    break;\n\n                  case \"invalid\":\n                  case \"submit\":\n                  case \"reset\":\n                    break;\n\n                  default:\n                    -1 === jb.indexOf(e) && L(e, a);\n                }\n                c[e] = !0;\n            }\n        }\n    }\n    function Pe(a, b, c, d) {\n        return c = 9 === c.nodeType ? c : c.ownerDocument, d === Be.html && (d = Ce(a)), \n        d === Be.html ? \"script\" === a ? (a = c.createElement(\"div\"), a.innerHTML = \"<script><\\/script>\", \n        a = a.removeChild(a.firstChild)) : a = \"string\" == typeof b.is ? c.createElement(a, {\n            is: b.is\n        }) : c.createElement(a) : a = c.createElementNS(d, a), a;\n    }\n    function Qe(a, b) {\n        return (9 === b.nodeType ? b : b.ownerDocument).createTextNode(a);\n    }\n    function Re(a, b, c, d) {\n        var e = Me(b, c);\n        switch (b) {\n          case \"iframe\":\n          case \"object\":\n            L(\"load\", a);\n            var f = c;\n            break;\n\n          case \"video\":\n          case \"audio\":\n            for (f = 0; f < jb.length; f++) L(jb[f], a);\n            f = c;\n            break;\n\n          case \"source\":\n            L(\"error\", a), f = c;\n            break;\n\n          case \"img\":\n          case \"image\":\n          case \"link\":\n            L(\"error\", a), L(\"load\", a), f = c;\n            break;\n\n          case \"form\":\n            L(\"reset\", a), L(\"submit\", a), f = c;\n            break;\n\n          case \"details\":\n            L(\"toggle\", a), f = c;\n            break;\n\n          case \"input\":\n            Gc(a, c), f = Fc(a, c), L(\"invalid\", a), Oe(d, \"onChange\");\n            break;\n\n          case \"option\":\n            f = ue(a, c);\n            break;\n\n          case \"select\":\n            we(a, c), f = p({}, c, {\n                value: void 0\n            }), L(\"invalid\", a), Oe(d, \"onChange\");\n            break;\n\n          case \"textarea\":\n            ye(a, c), f = xe(a, c), L(\"invalid\", a), Oe(d, \"onChange\");\n            break;\n\n          default:\n            f = c;\n        }\n        Le(b, f, Ne);\n        var h, g = f;\n        for (h in g) if (g.hasOwnProperty(h)) {\n            var k = g[h];\n            \"style\" === h ? Je(a, k, Ne) : \"dangerouslySetInnerHTML\" === h ? null != (k = k ? k.__html : void 0) && Fe(a, k) : \"children\" === h ? \"string\" == typeof k ? (\"textarea\" !== b || \"\" !== k) && Ge(a, k) : \"number\" == typeof k && Ge(a, \"\" + k) : \"suppressContentEditableWarning\" !== h && \"suppressHydrationWarning\" !== h && \"autoFocus\" !== h && (ra.hasOwnProperty(h) ? null != k && Oe(d, h) : null != k && Ec(a, h, k, e));\n        }\n        switch (b) {\n          case \"input\":\n            cc(a), Lc(a, c);\n            break;\n\n          case \"textarea\":\n            cc(a), Ae(a, c);\n            break;\n\n          case \"option\":\n            null != c.value && a.setAttribute(\"value\", c.value);\n            break;\n\n          case \"select\":\n            a.multiple = !!c.multiple, b = c.value, null != b ? ve(a, !!c.multiple, b, !1) : null != c.defaultValue && ve(a, !!c.multiple, c.defaultValue, !0);\n            break;\n\n          default:\n            \"function\" == typeof f.onClick && (a.onclick = v);\n        }\n    }\n    function Se(a, b, c, d, e) {\n        var f = null;\n        switch (b) {\n          case \"input\":\n            c = Fc(a, c), d = Fc(a, d), f = [];\n            break;\n\n          case \"option\":\n            c = ue(a, c), d = ue(a, d), f = [];\n            break;\n\n          case \"select\":\n            c = p({}, c, {\n                value: void 0\n            }), d = p({}, d, {\n                value: void 0\n            }), f = [];\n            break;\n\n          case \"textarea\":\n            c = xe(a, c), d = xe(a, d), f = [];\n            break;\n\n          default:\n            \"function\" != typeof c.onClick && \"function\" == typeof d.onClick && (a.onclick = v);\n        }\n        Le(b, d, Ne), b = a = void 0;\n        var g = null;\n        for (a in c) if (!d.hasOwnProperty(a) && c.hasOwnProperty(a) && null != c[a]) if (\"style\" === a) {\n            var h = c[a];\n            for (b in h) h.hasOwnProperty(b) && (g || (g = {}), g[b] = \"\");\n        } else \"dangerouslySetInnerHTML\" !== a && \"children\" !== a && \"suppressContentEditableWarning\" !== a && \"suppressHydrationWarning\" !== a && \"autoFocus\" !== a && (ra.hasOwnProperty(a) ? f || (f = []) : (f = f || []).push(a, null));\n        for (a in d) {\n            var k = d[a];\n            if (h = null != c ? c[a] : void 0, d.hasOwnProperty(a) && k !== h && (null != k || null != h)) if (\"style\" === a) if (h) {\n                for (b in h) !h.hasOwnProperty(b) || k && k.hasOwnProperty(b) || (g || (g = {}), \n                g[b] = \"\");\n                for (b in k) k.hasOwnProperty(b) && h[b] !== k[b] && (g || (g = {}), g[b] = k[b]);\n            } else g || (f || (f = []), f.push(a, g)), g = k; else \"dangerouslySetInnerHTML\" === a ? (k = k ? k.__html : void 0, \n            h = h ? h.__html : void 0, null != k && h !== k && (f = f || []).push(a, \"\" + k)) : \"children\" === a ? h === k || \"string\" != typeof k && \"number\" != typeof k || (f = f || []).push(a, \"\" + k) : \"suppressContentEditableWarning\" !== a && \"suppressHydrationWarning\" !== a && (ra.hasOwnProperty(a) ? (null != k && Oe(e, a), \n            f || h === k || (f = [])) : (f = f || []).push(a, k));\n        }\n        return g && (f = f || []).push(\"style\", g), f;\n    }\n    function Te(a, b, c, d, e) {\n        \"input\" === c && \"radio\" === e.type && null != e.name && Ic(a, e), Me(c, d), d = Me(c, e);\n        for (var f = 0; f < b.length; f += 2) {\n            var g = b[f], h = b[f + 1];\n            \"style\" === g ? Je(a, h, Ne) : \"dangerouslySetInnerHTML\" === g ? Fe(a, h) : \"children\" === g ? Ge(a, h) : Ec(a, g, h, d);\n        }\n        switch (c) {\n          case \"input\":\n            Jc(a, e);\n            break;\n\n          case \"textarea\":\n            ze(a, e);\n            break;\n\n          case \"select\":\n            a._wrapperState.initialValue = void 0, b = a._wrapperState.wasMultiple, a._wrapperState.wasMultiple = !!e.multiple, \n            c = e.value, null != c ? ve(a, !!e.multiple, c, !1) : b !== !!e.multiple && (null != e.defaultValue ? ve(a, !!e.multiple, e.defaultValue, !0) : ve(a, !!e.multiple, e.multiple ? [] : \"\", !1));\n        }\n    }\n    function Ue(a, b, c, d, e) {\n        switch (b) {\n          case \"iframe\":\n          case \"object\":\n            L(\"load\", a);\n            break;\n\n          case \"video\":\n          case \"audio\":\n            for (d = 0; d < jb.length; d++) L(jb[d], a);\n            break;\n\n          case \"source\":\n            L(\"error\", a);\n            break;\n\n          case \"img\":\n          case \"image\":\n          case \"link\":\n            L(\"error\", a), L(\"load\", a);\n            break;\n\n          case \"form\":\n            L(\"reset\", a), L(\"submit\", a);\n            break;\n\n          case \"details\":\n            L(\"toggle\", a);\n            break;\n\n          case \"input\":\n            Gc(a, c), L(\"invalid\", a), Oe(e, \"onChange\");\n            break;\n\n          case \"select\":\n            we(a, c), L(\"invalid\", a), Oe(e, \"onChange\");\n            break;\n\n          case \"textarea\":\n            ye(a, c), L(\"invalid\", a), Oe(e, \"onChange\");\n        }\n        Le(b, c, Ne), d = null;\n        for (var f in c) if (c.hasOwnProperty(f)) {\n            var g = c[f];\n            \"children\" === f ? \"string\" == typeof g ? a.textContent !== g && (d = [ \"children\", g ]) : \"number\" == typeof g && a.textContent !== \"\" + g && (d = [ \"children\", \"\" + g ]) : ra.hasOwnProperty(f) && null != g && Oe(e, f);\n        }\n        switch (b) {\n          case \"input\":\n            cc(a), Lc(a, c);\n            break;\n\n          case \"textarea\":\n            cc(a), Ae(a, c);\n            break;\n\n          case \"select\":\n          case \"option\":\n            break;\n\n          default:\n            \"function\" == typeof c.onClick && (a.onclick = v);\n        }\n        return d;\n    }\n    function Ve(a, b) {\n        return a.nodeValue !== b;\n    }\n    function Ze(a, b) {\n        switch (a) {\n          case \"button\":\n          case \"input\":\n          case \"select\":\n          case \"textarea\":\n            return !!b.autoFocus;\n        }\n        return !1;\n    }\n    function $e(a, b) {\n        return \"textarea\" === a || \"string\" == typeof b.children || \"number\" == typeof b.children || \"object\" == typeof b.dangerouslySetInnerHTML && null !== b.dangerouslySetInnerHTML && \"string\" == typeof b.dangerouslySetInnerHTML.__html;\n    }\n    function df(a) {\n        for (a = a.nextSibling; a && 1 !== a.nodeType && 3 !== a.nodeType; ) a = a.nextSibling;\n        return a;\n    }\n    function ef(a) {\n        for (a = a.firstChild; a && 1 !== a.nodeType && 3 !== a.nodeType; ) a = a.nextSibling;\n        return a;\n    }\n    function hf(a) {\n        return {\n            current: a\n        };\n    }\n    function M(a) {\n        0 > gf || (a.current = ff[gf], ff[gf] = null, gf--);\n    }\n    function N(a, b) {\n        gf++, ff[gf] = a.current, a.current = b;\n    }\n    function lf(a) {\n        return mf(a) ? kf : jf.current;\n    }\n    function nf(a, b) {\n        var c = a.type.contextTypes;\n        if (!c) return ha;\n        var d = a.stateNode;\n        if (d && d.__reactInternalMemoizedUnmaskedChildContext === b) return d.__reactInternalMemoizedMaskedChildContext;\n        var f, e = {};\n        for (f in c) e[f] = b[f];\n        return d && (a = a.stateNode, a.__reactInternalMemoizedUnmaskedChildContext = b, \n        a.__reactInternalMemoizedMaskedChildContext = e), e;\n    }\n    function mf(a) {\n        return 2 === a.tag && null != a.type.childContextTypes;\n    }\n    function of(a) {\n        mf(a) && (M(O, a), M(jf, a));\n    }\n    function pf(a) {\n        M(O, a), M(jf, a);\n    }\n    function qf(a, b, c) {\n        jf.current !== ha && A(\"168\"), N(jf, b, a), N(O, c, a);\n    }\n    function rf(a, b) {\n        var c = a.stateNode, d = a.type.childContextTypes;\n        if (\"function\" != typeof c.getChildContext) return b;\n        c = c.getChildContext();\n        for (var e in c) e in d || A(\"108\", tc(a) || \"Unknown\", e);\n        return p({}, b, c);\n    }\n    function sf(a) {\n        if (!mf(a)) return !1;\n        var b = a.stateNode;\n        return b = b && b.__reactInternalMemoizedMergedChildContext || ha, kf = jf.current, \n        N(jf, b, a), N(O, O.current, a), !0;\n    }\n    function tf(a, b) {\n        var c = a.stateNode;\n        if (c || A(\"169\"), b) {\n            var d = rf(a, kf);\n            c.__reactInternalMemoizedMergedChildContext = d, M(O, a), M(jf, a), N(jf, d, a);\n        } else M(O, a);\n        N(O, b, a);\n    }\n    function uf(a, b, c, d) {\n        this.tag = a, this.key = c, this.sibling = this.child = this.return = this.stateNode = this.type = null, \n        this.index = 0, this.ref = null, this.pendingProps = b, this.memoizedState = this.updateQueue = this.memoizedProps = null, \n        this.mode = d, this.effectTag = 0, this.lastEffect = this.firstEffect = this.nextEffect = null, \n        this.expirationTime = 0, this.alternate = null;\n    }\n    function vf(a, b, c) {\n        var d = a.alternate;\n        return null === d ? (d = new uf(a.tag, b, a.key, a.mode), d.type = a.type, d.stateNode = a.stateNode, \n        d.alternate = a, a.alternate = d) : (d.pendingProps = b, d.effectTag = 0, d.nextEffect = null, \n        d.firstEffect = null, d.lastEffect = null), d.expirationTime = c, d.child = a.child, \n        d.memoizedProps = a.memoizedProps, d.memoizedState = a.memoizedState, d.updateQueue = a.updateQueue, \n        d.sibling = a.sibling, d.index = a.index, d.ref = a.ref, d;\n    }\n    function wf(a, b, c) {\n        var d = a.type, e = a.key;\n        if (a = a.props, \"function\" == typeof d) var f = d.prototype && d.prototype.isReactComponent ? 2 : 0; else if (\"string\" == typeof d) f = 5; else switch (d) {\n          case hc:\n            return xf(a.children, b, c, e);\n\n          case oc:\n            f = 11, b |= 3;\n            break;\n\n          case ic:\n            f = 11, b |= 2;\n            break;\n\n          case jc:\n            return d = new uf(15, a, e, 4 | b), d.type = jc, d.expirationTime = c, d;\n\n          case qc:\n            f = 16, b |= 2;\n            break;\n\n          default:\n            a: {\n                switch (\"object\" == typeof d && null !== d ? d.$$typeof : null) {\n                  case mc:\n                    f = 13;\n                    break a;\n\n                  case nc:\n                    f = 12;\n                    break a;\n\n                  case pc:\n                    f = 14;\n                    break a;\n\n                  default:\n                    A(\"130\", null == d ? d : typeof d, \"\");\n                }\n                f = void 0;\n            }\n        }\n        return b = new uf(f, a, e, b), b.type = d, b.expirationTime = c, b;\n    }\n    function xf(a, b, c, d) {\n        return a = new uf(10, a, d, b), a.expirationTime = c, a;\n    }\n    function yf(a, b, c) {\n        return a = new uf(6, a, null, b), a.expirationTime = c, a;\n    }\n    function zf(a, b, c) {\n        return b = new uf(4, null !== a.children ? a.children : [], a.key, b), b.expirationTime = c, \n        b.stateNode = {\n            containerInfo: a.containerInfo,\n            pendingChildren: null,\n            implementation: a.implementation\n        }, b;\n    }\n    function Af(a, b, c) {\n        return b = new uf(3, null, null, b ? 3 : 0), a = {\n            current: b,\n            containerInfo: a,\n            pendingChildren: null,\n            earliestPendingTime: 0,\n            latestPendingTime: 0,\n            earliestSuspendedTime: 0,\n            latestSuspendedTime: 0,\n            latestPingedTime: 0,\n            pendingCommitExpirationTime: 0,\n            finishedWork: null,\n            context: null,\n            pendingContext: null,\n            hydrate: c,\n            remainingExpirationTime: 0,\n            firstBatch: null,\n            nextScheduledRoot: null\n        }, b.stateNode = a;\n    }\n    function Df(a) {\n        return function(b) {\n            try {\n                return a(b);\n            } catch (c) {}\n        };\n    }\n    function Ef(a) {\n        if (\"undefined\" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;\n        var b = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n        if (b.isDisabled || !b.supportsFiber) return !0;\n        try {\n            var c = b.inject(a);\n            Bf = Df(function(a) {\n                return b.onCommitFiberRoot(c, a);\n            }), Cf = Df(function(a) {\n                return b.onCommitFiberUnmount(c, a);\n            });\n        } catch (d) {}\n        return !0;\n    }\n    function Ff(a) {\n        \"function\" == typeof Bf && Bf(a);\n    }\n    function Gf(a) {\n        \"function\" == typeof Cf && Cf(a);\n    }\n    function If(a) {\n        return {\n            expirationTime: 0,\n            baseState: a,\n            firstUpdate: null,\n            lastUpdate: null,\n            firstCapturedUpdate: null,\n            lastCapturedUpdate: null,\n            firstEffect: null,\n            lastEffect: null,\n            firstCapturedEffect: null,\n            lastCapturedEffect: null\n        };\n    }\n    function Jf(a) {\n        return {\n            expirationTime: a.expirationTime,\n            baseState: a.baseState,\n            firstUpdate: a.firstUpdate,\n            lastUpdate: a.lastUpdate,\n            firstCapturedUpdate: null,\n            lastCapturedUpdate: null,\n            firstEffect: null,\n            lastEffect: null,\n            firstCapturedEffect: null,\n            lastCapturedEffect: null\n        };\n    }\n    function Kf(a) {\n        return {\n            expirationTime: a,\n            tag: 0,\n            payload: null,\n            callback: null,\n            next: null,\n            nextEffect: null\n        };\n    }\n    function Lf(a, b, c) {\n        null === a.lastUpdate ? a.firstUpdate = a.lastUpdate = b : (a.lastUpdate.next = b, \n        a.lastUpdate = b), (0 === a.expirationTime || a.expirationTime > c) && (a.expirationTime = c);\n    }\n    function Mf(a, b, c) {\n        var d = a.alternate;\n        if (null === d) {\n            var e = a.updateQueue, f = null;\n            null === e && (e = a.updateQueue = If(a.memoizedState));\n        } else e = a.updateQueue, f = d.updateQueue, null === e ? null === f ? (e = a.updateQueue = If(a.memoizedState), \n        f = d.updateQueue = If(d.memoizedState)) : e = a.updateQueue = Jf(f) : null === f && (f = d.updateQueue = Jf(e));\n        null === f || e === f ? Lf(e, b, c) : null === e.lastUpdate || null === f.lastUpdate ? (Lf(e, b, c), \n        Lf(f, b, c)) : (Lf(e, b, c), f.lastUpdate = b);\n    }\n    function Nf(a, b, c) {\n        var d = a.updateQueue;\n        d = null === d ? a.updateQueue = If(a.memoizedState) : Of(a, d), null === d.lastCapturedUpdate ? d.firstCapturedUpdate = d.lastCapturedUpdate = b : (d.lastCapturedUpdate.next = b, \n        d.lastCapturedUpdate = b), (0 === d.expirationTime || d.expirationTime > c) && (d.expirationTime = c);\n    }\n    function Of(a, b) {\n        var c = a.alternate;\n        return null !== c && b === c.updateQueue && (b = a.updateQueue = Jf(b)), b;\n    }\n    function Pf(a, b, c, d, e, f) {\n        switch (c.tag) {\n          case 1:\n            return a = c.payload, \"function\" == typeof a ? a.call(f, d, e) : a;\n\n          case 3:\n            a.effectTag = -1025 & a.effectTag | 64;\n\n          case 0:\n            if (a = c.payload, null === (e = \"function\" == typeof a ? a.call(f, d, e) : a) || void 0 === e) break;\n            return p({}, d, e);\n\n          case 2:\n            Hf = !0;\n        }\n        return d;\n    }\n    function Qf(a, b, c, d, e) {\n        if (Hf = !1, !(0 === b.expirationTime || b.expirationTime > e)) {\n            b = Of(a, b);\n            for (var f = b.baseState, g = null, h = 0, k = b.firstUpdate, n = f; null !== k; ) {\n                var r = k.expirationTime;\n                r > e ? (null === g && (g = k, f = n), (0 === h || h > r) && (h = r)) : (n = Pf(a, b, k, n, c, d), \n                null !== k.callback && (a.effectTag |= 32, k.nextEffect = null, null === b.lastEffect ? b.firstEffect = b.lastEffect = k : (b.lastEffect.nextEffect = k, \n                b.lastEffect = k))), k = k.next;\n            }\n            for (r = null, k = b.firstCapturedUpdate; null !== k; ) {\n                var w = k.expirationTime;\n                w > e ? (null === r && (r = k, null === g && (f = n)), (0 === h || h > w) && (h = w)) : (n = Pf(a, b, k, n, c, d), \n                null !== k.callback && (a.effectTag |= 32, k.nextEffect = null, null === b.lastCapturedEffect ? b.firstCapturedEffect = b.lastCapturedEffect = k : (b.lastCapturedEffect.nextEffect = k, \n                b.lastCapturedEffect = k))), k = k.next;\n            }\n            null === g && (b.lastUpdate = null), null === r ? b.lastCapturedUpdate = null : a.effectTag |= 32, \n            null === g && null === r && (f = n), b.baseState = f, b.firstUpdate = g, b.firstCapturedUpdate = r, \n            b.expirationTime = h, a.memoizedState = n;\n        }\n    }\n    function Rf(a, b) {\n        \"function\" != typeof a && A(\"191\", a), a.call(b);\n    }\n    function Sf(a, b, c) {\n        for (null !== b.firstCapturedUpdate && (null !== b.lastUpdate && (b.lastUpdate.next = b.firstCapturedUpdate, \n        b.lastUpdate = b.lastCapturedUpdate), b.firstCapturedUpdate = b.lastCapturedUpdate = null), \n        a = b.firstEffect, b.firstEffect = b.lastEffect = null; null !== a; ) {\n            var d = a.callback;\n            null !== d && (a.callback = null, Rf(d, c)), a = a.nextEffect;\n        }\n        for (a = b.firstCapturedEffect, b.firstCapturedEffect = b.lastCapturedEffect = null; null !== a; ) b = a.callback, \n        null !== b && (a.callback = null, Rf(b, c)), a = a.nextEffect;\n    }\n    function Tf(a, b) {\n        return {\n            value: a,\n            source: b,\n            stack: vc(b)\n        };\n    }\n    function Xf(a) {\n        var b = a.type._context;\n        N(Wf, b._changedBits, a), N(Vf, b._currentValue, a), N(Uf, a, a), b._currentValue = a.pendingProps.value, \n        b._changedBits = a.stateNode;\n    }\n    function Yf(a) {\n        var b = Wf.current, c = Vf.current;\n        M(Uf, a), M(Vf, a), M(Wf, a), a = a.type._context, a._currentValue = c, a._changedBits = b;\n    }\n    function cg(a) {\n        return a === Zf && A(\"174\"), a;\n    }\n    function dg(a, b) {\n        N(bg, b, a), N(ag, a, a), N($f, Zf, a);\n        var c = b.nodeType;\n        switch (c) {\n          case 9:\n          case 11:\n            b = (b = b.documentElement) ? b.namespaceURI : De(null, \"\");\n            break;\n\n          default:\n            c = 8 === c ? b.parentNode : b, b = c.namespaceURI || null, c = c.tagName, b = De(b, c);\n        }\n        M($f, a), N($f, b, a);\n    }\n    function eg(a) {\n        M($f, a), M(ag, a), M(bg, a);\n    }\n    function fg(a) {\n        ag.current === a && (M($f, a), M(ag, a));\n    }\n    function hg(a, b, c) {\n        var d = a.memoizedState;\n        b = b(c, d), d = null === b || void 0 === b ? d : p({}, d, b), a.memoizedState = d, \n        null !== (a = a.updateQueue) && 0 === a.expirationTime && (a.baseState = d);\n    }\n    function mg(a, b, c, d, e, f) {\n        var g = a.stateNode;\n        return a = a.type, \"function\" == typeof g.shouldComponentUpdate ? g.shouldComponentUpdate(c, e, f) : !a.prototype || !a.prototype.isPureReactComponent || (!ea(b, c) || !ea(d, e));\n    }\n    function ng(a, b, c, d) {\n        a = b.state, \"function\" == typeof b.componentWillReceiveProps && b.componentWillReceiveProps(c, d), \n        \"function\" == typeof b.UNSAFE_componentWillReceiveProps && b.UNSAFE_componentWillReceiveProps(c, d), \n        b.state !== a && lg.enqueueReplaceState(b, b.state, null);\n    }\n    function og(a, b) {\n        var c = a.type, d = a.stateNode, e = a.pendingProps, f = lf(a);\n        d.props = e, d.state = a.memoizedState, d.refs = ha, d.context = nf(a, f), f = a.updateQueue, \n        null !== f && (Qf(a, f, e, d, b), d.state = a.memoizedState), f = a.type.getDerivedStateFromProps, \n        \"function\" == typeof f && (hg(a, f, e), d.state = a.memoizedState), \"function\" == typeof c.getDerivedStateFromProps || \"function\" == typeof d.getSnapshotBeforeUpdate || \"function\" != typeof d.UNSAFE_componentWillMount && \"function\" != typeof d.componentWillMount || (c = d.state, \n        \"function\" == typeof d.componentWillMount && d.componentWillMount(), \"function\" == typeof d.UNSAFE_componentWillMount && d.UNSAFE_componentWillMount(), \n        c !== d.state && lg.enqueueReplaceState(d, d.state, null), null !== (f = a.updateQueue) && (Qf(a, f, e, d, b), \n        d.state = a.memoizedState)), \"function\" == typeof d.componentDidMount && (a.effectTag |= 4);\n    }\n    function qg(a, b, c) {\n        if (null !== (a = c.ref) && \"function\" != typeof a && \"object\" != typeof a) {\n            if (c._owner) {\n                c = c._owner;\n                var d = void 0;\n                c && (2 !== c.tag && A(\"110\"), d = c.stateNode), d || A(\"147\", a);\n                var e = \"\" + a;\n                return null !== b && null !== b.ref && \"function\" == typeof b.ref && b.ref._stringRef === e ? b.ref : (b = function(a) {\n                    var b = d.refs === ha ? d.refs = {} : d.refs;\n                    null === a ? delete b[e] : b[e] = a;\n                }, b._stringRef = e, b);\n            }\n            \"string\" != typeof a && A(\"148\"), c._owner || A(\"254\", a);\n        }\n        return a;\n    }\n    function rg(a, b) {\n        \"textarea\" !== a.type && A(\"31\", \"[object Object]\" === Object.prototype.toString.call(b) ? \"object with keys {\" + Object.keys(b).join(\", \") + \"}\" : b, \"\");\n    }\n    function sg(a) {\n        function b(b, c) {\n            if (a) {\n                var d = b.lastEffect;\n                null !== d ? (d.nextEffect = c, b.lastEffect = c) : b.firstEffect = b.lastEffect = c, \n                c.nextEffect = null, c.effectTag = 8;\n            }\n        }\n        function c(c, d) {\n            if (!a) return null;\n            for (;null !== d; ) b(c, d), d = d.sibling;\n            return null;\n        }\n        function d(a, b) {\n            for (a = new Map(); null !== b; ) null !== b.key ? a.set(b.key, b) : a.set(b.index, b), \n            b = b.sibling;\n            return a;\n        }\n        function e(a, b, c) {\n            return a = vf(a, b, c), a.index = 0, a.sibling = null, a;\n        }\n        function f(b, c, d) {\n            return b.index = d, a ? null !== (d = b.alternate) ? (d = d.index, d < c ? (b.effectTag = 2, \n            c) : d) : (b.effectTag = 2, c) : c;\n        }\n        function g(b) {\n            return a && null === b.alternate && (b.effectTag = 2), b;\n        }\n        function h(a, b, c, d) {\n            return null === b || 6 !== b.tag ? (b = yf(c, a.mode, d), b.return = a, b) : (b = e(b, c, d), \n            b.return = a, b);\n        }\n        function k(a, b, c, d) {\n            return null !== b && b.type === c.type ? (d = e(b, c.props, d), d.ref = qg(a, b, c), \n            d.return = a, d) : (d = wf(c, a.mode, d), d.ref = qg(a, b, c), d.return = a, d);\n        }\n        function n(a, b, c, d) {\n            return null === b || 4 !== b.tag || b.stateNode.containerInfo !== c.containerInfo || b.stateNode.implementation !== c.implementation ? (b = zf(c, a.mode, d), \n            b.return = a, b) : (b = e(b, c.children || [], d), b.return = a, b);\n        }\n        function r(a, b, c, d, f) {\n            return null === b || 10 !== b.tag ? (b = xf(c, a.mode, d, f), b.return = a, b) : (b = e(b, c, d), \n            b.return = a, b);\n        }\n        function w(a, b, c) {\n            if (\"string\" == typeof b || \"number\" == typeof b) return b = yf(\"\" + b, a.mode, c), \n            b.return = a, b;\n            if (\"object\" == typeof b && null !== b) {\n                switch (b.$$typeof) {\n                  case fc:\n                    return c = wf(b, a.mode, c), c.ref = qg(a, null, b), c.return = a, c;\n\n                  case gc:\n                    return b = zf(b, a.mode, c), b.return = a, b;\n                }\n                if (pg(b) || sc(b)) return b = xf(b, a.mode, c, null), b.return = a, b;\n                rg(a, b);\n            }\n            return null;\n        }\n        function P(a, b, c, d) {\n            var e = null !== b ? b.key : null;\n            if (\"string\" == typeof c || \"number\" == typeof c) return null !== e ? null : h(a, b, \"\" + c, d);\n            if (\"object\" == typeof c && null !== c) {\n                switch (c.$$typeof) {\n                  case fc:\n                    return c.key === e ? c.type === hc ? r(a, b, c.props.children, d, e) : k(a, b, c, d) : null;\n\n                  case gc:\n                    return c.key === e ? n(a, b, c, d) : null;\n                }\n                if (pg(c) || sc(c)) return null !== e ? null : r(a, b, c, d, null);\n                rg(a, c);\n            }\n            return null;\n        }\n        function kc(a, b, c, d, e) {\n            if (\"string\" == typeof d || \"number\" == typeof d) return a = a.get(c) || null, h(b, a, \"\" + d, e);\n            if (\"object\" == typeof d && null !== d) {\n                switch (d.$$typeof) {\n                  case fc:\n                    return a = a.get(null === d.key ? c : d.key) || null, d.type === hc ? r(b, a, d.props.children, e, d.key) : k(b, a, d, e);\n\n                  case gc:\n                    return a = a.get(null === d.key ? c : d.key) || null, n(b, a, d, e);\n                }\n                if (pg(d) || sc(d)) return a = a.get(c) || null, r(b, a, d, e, null);\n                rg(b, d);\n            }\n            return null;\n        }\n        function Hd(e, g, h, k) {\n            for (var u = null, x = null, t = g, q = g = 0, n = null; null !== t && q < h.length; q++) {\n                t.index > q ? (n = t, t = null) : n = t.sibling;\n                var l = P(e, t, h[q], k);\n                if (null === l) {\n                    null === t && (t = n);\n                    break;\n                }\n                a && t && null === l.alternate && b(e, t), g = f(l, g, q), null === x ? u = l : x.sibling = l, \n                x = l, t = n;\n            }\n            if (q === h.length) return c(e, t), u;\n            if (null === t) {\n                for (;q < h.length; q++) (t = w(e, h[q], k)) && (g = f(t, g, q), null === x ? u = t : x.sibling = t, \n                x = t);\n                return u;\n            }\n            for (t = d(e, t); q < h.length; q++) (n = kc(t, e, q, h[q], k)) && (a && null !== n.alternate && t.delete(null === n.key ? q : n.key), \n            g = f(n, g, q), null === x ? u = n : x.sibling = n, x = n);\n            return a && t.forEach(function(a) {\n                return b(e, a);\n            }), u;\n        }\n        function E(e, g, h, k) {\n            var t = sc(h);\n            \"function\" != typeof t && A(\"150\"), null == (h = t.call(h)) && A(\"151\");\n            for (var u = t = null, n = g, x = g = 0, y = null, l = h.next(); null !== n && !l.done; x++, \n            l = h.next()) {\n                n.index > x ? (y = n, n = null) : y = n.sibling;\n                var r = P(e, n, l.value, k);\n                if (null === r) {\n                    n || (n = y);\n                    break;\n                }\n                a && n && null === r.alternate && b(e, n), g = f(r, g, x), null === u ? t = r : u.sibling = r, \n                u = r, n = y;\n            }\n            if (l.done) return c(e, n), t;\n            if (null === n) {\n                for (;!l.done; x++, l = h.next()) null !== (l = w(e, l.value, k)) && (g = f(l, g, x), \n                null === u ? t = l : u.sibling = l, u = l);\n                return t;\n            }\n            for (n = d(e, n); !l.done; x++, l = h.next()) null !== (l = kc(n, e, x, l.value, k)) && (a && null !== l.alternate && n.delete(null === l.key ? x : l.key), \n            g = f(l, g, x), null === u ? t = l : u.sibling = l, u = l);\n            return a && n.forEach(function(a) {\n                return b(e, a);\n            }), t;\n        }\n        return function(a, d, f, h) {\n            \"object\" == typeof f && null !== f && f.type === hc && null === f.key && (f = f.props.children);\n            var k = \"object\" == typeof f && null !== f;\n            if (k) switch (f.$$typeof) {\n              case fc:\n                a: {\n                    var n = f.key;\n                    for (k = d; null !== k; ) {\n                        if (k.key === n) {\n                            if (10 === k.tag ? f.type === hc : k.type === f.type) {\n                                c(a, k.sibling), d = e(k, f.type === hc ? f.props.children : f.props, h), d.ref = qg(a, k, f), \n                                d.return = a, a = d;\n                                break a;\n                            }\n                            c(a, k);\n                            break;\n                        }\n                        b(a, k), k = k.sibling;\n                    }\n                    f.type === hc ? (d = xf(f.props.children, a.mode, h, f.key), d.return = a, a = d) : (h = wf(f, a.mode, h), \n                    h.ref = qg(a, d, f), h.return = a, a = h);\n                }\n                return g(a);\n\n              case gc:\n                a: {\n                    for (k = f.key; null !== d; ) {\n                        if (d.key === k) {\n                            if (4 === d.tag && d.stateNode.containerInfo === f.containerInfo && d.stateNode.implementation === f.implementation) {\n                                c(a, d.sibling), d = e(d, f.children || [], h), d.return = a, a = d;\n                                break a;\n                            }\n                            c(a, d);\n                            break;\n                        }\n                        b(a, d), d = d.sibling;\n                    }\n                    d = zf(f, a.mode, h), d.return = a, a = d;\n                }\n                return g(a);\n            }\n            if (\"string\" == typeof f || \"number\" == typeof f) return f = \"\" + f, null !== d && 6 === d.tag ? (c(a, d.sibling), \n            d = e(d, f, h), d.return = a, a = d) : (c(a, d), d = yf(f, a.mode, h), d.return = a, \n            a = d), g(a);\n            if (pg(f)) return Hd(a, d, f, h);\n            if (sc(f)) return E(a, d, f, h);\n            if (k && rg(a, f), void 0 === f) switch (a.tag) {\n              case 2:\n              case 1:\n                h = a.type, A(\"152\", h.displayName || h.name || \"Component\");\n            }\n            return c(a, d);\n        };\n    }\n    function yg(a, b) {\n        var c = new uf(5, null, null, 0);\n        c.type = \"DELETED\", c.stateNode = b, c.return = a, c.effectTag = 8, null !== a.lastEffect ? (a.lastEffect.nextEffect = c, \n        a.lastEffect = c) : a.firstEffect = a.lastEffect = c;\n    }\n    function zg(a, b) {\n        switch (a.tag) {\n          case 5:\n            var c = a.type;\n            return null !== (b = 1 !== b.nodeType || c.toLowerCase() !== b.nodeName.toLowerCase() ? null : b) && (a.stateNode = b, \n            !0);\n\n          case 6:\n            return null !== (b = \"\" === a.pendingProps || 3 !== b.nodeType ? null : b) && (a.stateNode = b, \n            !0);\n\n          default:\n            return !1;\n        }\n    }\n    function Ag(a) {\n        if (xg) {\n            var b = wg;\n            if (b) {\n                var c = b;\n                if (!zg(a, b)) {\n                    if (!(b = df(c)) || !zg(a, b)) return a.effectTag |= 2, xg = !1, void (vg = a);\n                    yg(vg, c);\n                }\n                vg = a, wg = ef(b);\n            } else a.effectTag |= 2, xg = !1, vg = a;\n        }\n    }\n    function Bg(a) {\n        for (a = a.return; null !== a && 5 !== a.tag && 3 !== a.tag; ) a = a.return;\n        vg = a;\n    }\n    function Cg(a) {\n        if (a !== vg) return !1;\n        if (!xg) return Bg(a), xg = !0, !1;\n        var b = a.type;\n        if (5 !== a.tag || \"head\" !== b && \"body\" !== b && !$e(b, a.memoizedProps)) for (b = wg; b; ) yg(a, b), \n        b = df(b);\n        return Bg(a), wg = vg ? df(a.stateNode) : null, !0;\n    }\n    function Dg() {\n        wg = vg = null, xg = !1;\n    }\n    function Q(a, b, c) {\n        Eg(a, b, c, b.expirationTime);\n    }\n    function Eg(a, b, c, d) {\n        b.child = null === a ? ug(b, null, c, d) : tg(b, a.child, c, d);\n    }\n    function Fg(a, b) {\n        var c = b.ref;\n        (null === a && null !== c || null !== a && a.ref !== c) && (b.effectTag |= 128);\n    }\n    function Gg(a, b, c, d, e) {\n        Fg(a, b);\n        var f = 0 != (64 & b.effectTag);\n        if (!c && !f) return d && tf(b, !1), R(a, b);\n        c = b.stateNode, ec.current = b;\n        var g = f ? null : c.render();\n        return b.effectTag |= 1, f && (Eg(a, b, null, e), b.child = null), Eg(a, b, g, e), \n        b.memoizedState = c.state, b.memoizedProps = c.props, d && tf(b, !0), b.child;\n    }\n    function Hg(a) {\n        var b = a.stateNode;\n        b.pendingContext ? qf(a, b.pendingContext, b.pendingContext !== b.context) : b.context && qf(a, b.context, !1), \n        dg(a, b.containerInfo);\n    }\n    function Ig(a, b, c, d) {\n        var e = a.child;\n        for (null !== e && (e.return = a); null !== e; ) {\n            switch (e.tag) {\n              case 12:\n                var f = 0 | e.stateNode;\n                if (e.type === b && 0 != (f & c)) {\n                    for (f = e; null !== f; ) {\n                        var g = f.alternate;\n                        if (0 === f.expirationTime || f.expirationTime > d) f.expirationTime = d, null !== g && (0 === g.expirationTime || g.expirationTime > d) && (g.expirationTime = d); else {\n                            if (null === g || !(0 === g.expirationTime || g.expirationTime > d)) break;\n                            g.expirationTime = d;\n                        }\n                        f = f.return;\n                    }\n                    f = null;\n                } else f = e.child;\n                break;\n\n              case 13:\n                f = e.type === a.type ? null : e.child;\n                break;\n\n              default:\n                f = e.child;\n            }\n            if (null !== f) f.return = e; else for (f = e; null !== f; ) {\n                if (f === a) {\n                    f = null;\n                    break;\n                }\n                if (null !== (e = f.sibling)) {\n                    e.return = f.return, f = e;\n                    break;\n                }\n                f = f.return;\n            }\n            e = f;\n        }\n    }\n    function Jg(a, b, c) {\n        var d = b.type._context, e = b.pendingProps, f = b.memoizedProps, g = !0;\n        if (O.current) g = !1; else if (f === e) return b.stateNode = 0, Xf(b), R(a, b);\n        var h = e.value;\n        if (b.memoizedProps = e, null === f) h = 1073741823; else if (f.value === e.value) {\n            if (f.children === e.children && g) return b.stateNode = 0, Xf(b), R(a, b);\n            h = 0;\n        } else {\n            var k = f.value;\n            if (k === h && (0 !== k || 1 / k == 1 / h) || k !== k && h !== h) {\n                if (f.children === e.children && g) return b.stateNode = 0, Xf(b), R(a, b);\n                h = 0;\n            } else if (h = \"function\" == typeof d._calculateChangedBits ? d._calculateChangedBits(k, h) : 1073741823, \n            0 === (h |= 0)) {\n                if (f.children === e.children && g) return b.stateNode = 0, Xf(b), R(a, b);\n            } else Ig(b, d, h, c);\n        }\n        return b.stateNode = h, Xf(b), Q(a, b, e.children), b.child;\n    }\n    function R(a, b) {\n        if (null !== a && b.child !== a.child && A(\"153\"), null !== b.child) {\n            a = b.child;\n            var c = vf(a, a.pendingProps, a.expirationTime);\n            for (b.child = c, c.return = b; null !== a.sibling; ) a = a.sibling, c = c.sibling = vf(a, a.pendingProps, a.expirationTime), \n            c.return = b;\n            c.sibling = null;\n        }\n        return b.child;\n    }\n    function Kg(a, b, c) {\n        if (0 === b.expirationTime || b.expirationTime > c) {\n            switch (b.tag) {\n              case 3:\n                Hg(b);\n                break;\n\n              case 2:\n                sf(b);\n                break;\n\n              case 4:\n                dg(b, b.stateNode.containerInfo);\n                break;\n\n              case 13:\n                Xf(b);\n            }\n            return null;\n        }\n        switch (b.tag) {\n          case 0:\n            null !== a && A(\"155\");\n            var d = b.type, e = b.pendingProps, f = lf(b);\n            return f = nf(b, f), d = d(e, f), b.effectTag |= 1, \"object\" == typeof d && null !== d && \"function\" == typeof d.render && void 0 === d.$$typeof ? (f = b.type, \n            b.tag = 2, b.memoizedState = null !== d.state && void 0 !== d.state ? d.state : null, \n            f = f.getDerivedStateFromProps, \"function\" == typeof f && hg(b, f, e), e = sf(b), \n            d.updater = lg, b.stateNode = d, d._reactInternalFiber = b, og(b, c), a = Gg(a, b, !0, e, c)) : (b.tag = 1, \n            Q(a, b, d), b.memoizedProps = e, a = b.child), a;\n\n          case 1:\n            return e = b.type, c = b.pendingProps, O.current || b.memoizedProps !== c ? (d = lf(b), \n            d = nf(b, d), e = e(c, d), b.effectTag |= 1, Q(a, b, e), b.memoizedProps = c, a = b.child) : a = R(a, b), \n            a;\n\n          case 2:\n            if (e = sf(b), null === a) if (null === b.stateNode) {\n                var g = b.pendingProps, h = b.type;\n                d = lf(b);\n                var k = 2 === b.tag && null != b.type.contextTypes;\n                f = k ? nf(b, d) : ha, g = new h(g, f), b.memoizedState = null !== g.state && void 0 !== g.state ? g.state : null, \n                g.updater = lg, b.stateNode = g, g._reactInternalFiber = b, k && (k = b.stateNode, \n                k.__reactInternalMemoizedUnmaskedChildContext = d, k.__reactInternalMemoizedMaskedChildContext = f), \n                og(b, c), d = !0;\n            } else {\n                h = b.type, d = b.stateNode, k = b.memoizedProps, f = b.pendingProps, d.props = k;\n                var n = d.context;\n                g = lf(b), g = nf(b, g);\n                var r = h.getDerivedStateFromProps;\n                (h = \"function\" == typeof r || \"function\" == typeof d.getSnapshotBeforeUpdate) || \"function\" != typeof d.UNSAFE_componentWillReceiveProps && \"function\" != typeof d.componentWillReceiveProps || (k !== f || n !== g) && ng(b, d, f, g), \n                Hf = !1;\n                var w = b.memoizedState;\n                n = d.state = w;\n                var P = b.updateQueue;\n                null !== P && (Qf(b, P, f, d, c), n = b.memoizedState), k !== f || w !== n || O.current || Hf ? (\"function\" == typeof r && (hg(b, r, f), \n                n = b.memoizedState), (k = Hf || mg(b, k, f, w, n, g)) ? (h || \"function\" != typeof d.UNSAFE_componentWillMount && \"function\" != typeof d.componentWillMount || (\"function\" == typeof d.componentWillMount && d.componentWillMount(), \n                \"function\" == typeof d.UNSAFE_componentWillMount && d.UNSAFE_componentWillMount()), \n                \"function\" == typeof d.componentDidMount && (b.effectTag |= 4)) : (\"function\" == typeof d.componentDidMount && (b.effectTag |= 4), \n                b.memoizedProps = f, b.memoizedState = n), d.props = f, d.state = n, d.context = g, \n                d = k) : (\"function\" == typeof d.componentDidMount && (b.effectTag |= 4), d = !1);\n            } else h = b.type, d = b.stateNode, f = b.memoizedProps, k = b.pendingProps, d.props = f, \n            n = d.context, g = lf(b), g = nf(b, g), r = h.getDerivedStateFromProps, (h = \"function\" == typeof r || \"function\" == typeof d.getSnapshotBeforeUpdate) || \"function\" != typeof d.UNSAFE_componentWillReceiveProps && \"function\" != typeof d.componentWillReceiveProps || (f !== k || n !== g) && ng(b, d, k, g), \n            Hf = !1, n = b.memoizedState, w = d.state = n, P = b.updateQueue, null !== P && (Qf(b, P, k, d, c), \n            w = b.memoizedState), f !== k || n !== w || O.current || Hf ? (\"function\" == typeof r && (hg(b, r, k), \n            w = b.memoizedState), (r = Hf || mg(b, f, k, n, w, g)) ? (h || \"function\" != typeof d.UNSAFE_componentWillUpdate && \"function\" != typeof d.componentWillUpdate || (\"function\" == typeof d.componentWillUpdate && d.componentWillUpdate(k, w, g), \n            \"function\" == typeof d.UNSAFE_componentWillUpdate && d.UNSAFE_componentWillUpdate(k, w, g)), \n            \"function\" == typeof d.componentDidUpdate && (b.effectTag |= 4), \"function\" == typeof d.getSnapshotBeforeUpdate && (b.effectTag |= 256)) : (\"function\" != typeof d.componentDidUpdate || f === a.memoizedProps && n === a.memoizedState || (b.effectTag |= 4), \n            \"function\" != typeof d.getSnapshotBeforeUpdate || f === a.memoizedProps && n === a.memoizedState || (b.effectTag |= 256), \n            b.memoizedProps = k, b.memoizedState = w), d.props = k, d.state = w, d.context = g, \n            d = r) : (\"function\" != typeof d.componentDidUpdate || f === a.memoizedProps && n === a.memoizedState || (b.effectTag |= 4), \n            \"function\" != typeof d.getSnapshotBeforeUpdate || f === a.memoizedProps && n === a.memoizedState || (b.effectTag |= 256), \n            d = !1);\n            return Gg(a, b, d, e, c);\n\n          case 3:\n            return Hg(b), e = b.updateQueue, null !== e ? (d = b.memoizedState, d = null !== d ? d.element : null, \n            Qf(b, e, b.pendingProps, null, c), (e = b.memoizedState.element) === d ? (Dg(), \n            a = R(a, b)) : (d = b.stateNode, (d = (null === a || null === a.child) && d.hydrate) && (wg = ef(b.stateNode.containerInfo), \n            vg = b, d = xg = !0), d ? (b.effectTag |= 2, b.child = ug(b, null, e, c)) : (Dg(), \n            Q(a, b, e)), a = b.child)) : (Dg(), a = R(a, b)), a;\n\n          case 5:\n            return cg(bg.current), e = cg($f.current), d = De(e, b.type), e !== d && (N(ag, b, b), \n            N($f, d, b)), null === a && Ag(b), e = b.type, k = b.memoizedProps, d = b.pendingProps, \n            f = null !== a ? a.memoizedProps : null, O.current || k !== d || ((k = 1 & b.mode && !!d.hidden) && (b.expirationTime = 1073741823), \n            k && 1073741823 === c) ? (k = d.children, $e(e, d) ? k = null : f && $e(e, f) && (b.effectTag |= 16), \n            Fg(a, b), 1073741823 !== c && 1 & b.mode && d.hidden ? (b.expirationTime = 1073741823, \n            b.memoizedProps = d, a = null) : (Q(a, b, k), b.memoizedProps = d, a = b.child)) : a = R(a, b), \n            a;\n\n          case 6:\n            return null === a && Ag(b), b.memoizedProps = b.pendingProps, null;\n\n          case 16:\n            return null;\n\n          case 4:\n            return dg(b, b.stateNode.containerInfo), e = b.pendingProps, O.current || b.memoizedProps !== e ? (null === a ? b.child = tg(b, null, e, c) : Q(a, b, e), \n            b.memoizedProps = e, a = b.child) : a = R(a, b), a;\n\n          case 14:\n            return e = b.type.render, c = b.pendingProps, d = b.ref, O.current || b.memoizedProps !== c || d !== (null !== a ? a.ref : null) ? (e = e(c, d), \n            Q(a, b, e), b.memoizedProps = c, a = b.child) : a = R(a, b), a;\n\n          case 10:\n            return c = b.pendingProps, O.current || b.memoizedProps !== c ? (Q(a, b, c), b.memoizedProps = c, \n            a = b.child) : a = R(a, b), a;\n\n          case 11:\n            return c = b.pendingProps.children, O.current || null !== c && b.memoizedProps !== c ? (Q(a, b, c), \n            b.memoizedProps = c, a = b.child) : a = R(a, b), a;\n\n          case 15:\n            return c = b.pendingProps, b.memoizedProps === c ? a = R(a, b) : (Q(a, b, c.children), \n            b.memoizedProps = c, a = b.child), a;\n\n          case 13:\n            return Jg(a, b, c);\n\n          case 12:\n            a: if (d = b.type, f = b.pendingProps, k = b.memoizedProps, e = d._currentValue, \n            g = d._changedBits, O.current || 0 !== g || k !== f) {\n                if (b.memoizedProps = f, h = f.unstable_observedBits, void 0 !== h && null !== h || (h = 1073741823), \n                b.stateNode = h, 0 != (g & h)) Ig(b, d, g, c); else if (k === f) {\n                    a = R(a, b);\n                    break a;\n                }\n                c = f.children, c = c(e), b.effectTag |= 1, Q(a, b, c), a = b.child;\n            } else a = R(a, b);\n            return a;\n\n          default:\n            A(\"156\");\n        }\n    }\n    function Lg(a) {\n        a.effectTag |= 4;\n    }\n    function Sg(a, b) {\n        var c = b.pendingProps;\n        switch (b.tag) {\n          case 1:\n            return null;\n\n          case 2:\n            return of(b), null;\n\n          case 3:\n            eg(b), pf(b);\n            var d = b.stateNode;\n            return d.pendingContext && (d.context = d.pendingContext, d.pendingContext = null), \n            null !== a && null !== a.child || (Cg(b), b.effectTag &= -3), Pg(b), null;\n\n          case 5:\n            fg(b), d = cg(bg.current);\n            var e = b.type;\n            if (null !== a && null != b.stateNode) {\n                var f = a.memoizedProps, g = b.stateNode, h = cg($f.current);\n                g = Se(g, e, f, c, d), Qg(a, b, g, e, f, c, d, h), a.ref !== b.ref && (b.effectTag |= 128);\n            } else {\n                if (!c) return null === b.stateNode && A(\"166\"), null;\n                if (a = cg($f.current), Cg(b)) c = b.stateNode, e = b.type, f = b.memoizedProps, \n                c[C] = b, c[Ma] = f, d = Ue(c, e, f, a, d), b.updateQueue = d, null !== d && Lg(b); else {\n                    a = Pe(e, c, d, a), a[C] = b, a[Ma] = c;\n                    a: for (f = b.child; null !== f; ) {\n                        if (5 === f.tag || 6 === f.tag) a.appendChild(f.stateNode); else if (4 !== f.tag && null !== f.child) {\n                            f.child.return = f, f = f.child;\n                            continue;\n                        }\n                        if (f === b) break;\n                        for (;null === f.sibling; ) {\n                            if (null === f.return || f.return === b) break a;\n                            f = f.return;\n                        }\n                        f.sibling.return = f.return, f = f.sibling;\n                    }\n                    Re(a, e, c, d), Ze(e, c) && Lg(b), b.stateNode = a;\n                }\n                null !== b.ref && (b.effectTag |= 128);\n            }\n            return null;\n\n          case 6:\n            if (a && null != b.stateNode) Rg(a, b, a.memoizedProps, c); else {\n                if (\"string\" != typeof c) return null === b.stateNode && A(\"166\"), null;\n                d = cg(bg.current), cg($f.current), Cg(b) ? (d = b.stateNode, c = b.memoizedProps, \n                d[C] = b, Ve(d, c) && Lg(b)) : (d = Qe(c, d), d[C] = b, b.stateNode = d);\n            }\n            return null;\n\n          case 14:\n          case 16:\n          case 10:\n          case 11:\n          case 15:\n            return null;\n\n          case 4:\n            return eg(b), Pg(b), null;\n\n          case 13:\n            return Yf(b), null;\n\n          case 12:\n            return null;\n\n          case 0:\n            A(\"167\");\n\n          default:\n            A(\"156\");\n        }\n    }\n    function Tg(a, b) {\n        var c = b.source;\n        null === b.stack && null !== c && vc(c), null !== c && tc(c), b = b.value, null !== a && 2 === a.tag && tc(a);\n        try {\n            b && b.suppressReactErrorLogging || console.error(b);\n        } catch (d) {\n            d && d.suppressReactErrorLogging || console.error(d);\n        }\n    }\n    function Ug(a) {\n        var b = a.ref;\n        if (null !== b) if (\"function\" == typeof b) try {\n            b(null);\n        } catch (c) {\n            Vg(a, c);\n        } else b.current = null;\n    }\n    function Wg(a) {\n        switch (\"function\" == typeof Gf && Gf(a), a.tag) {\n          case 2:\n            Ug(a);\n            var b = a.stateNode;\n            if (\"function\" == typeof b.componentWillUnmount) try {\n                b.props = a.memoizedProps, b.state = a.memoizedState, b.componentWillUnmount();\n            } catch (c) {\n                Vg(a, c);\n            }\n            break;\n\n          case 5:\n            Ug(a);\n            break;\n\n          case 4:\n            Xg(a);\n        }\n    }\n    function Yg(a) {\n        return 5 === a.tag || 3 === a.tag || 4 === a.tag;\n    }\n    function Zg(a) {\n        a: {\n            for (var b = a.return; null !== b; ) {\n                if (Yg(b)) {\n                    var c = b;\n                    break a;\n                }\n                b = b.return;\n            }\n            A(\"160\"), c = void 0;\n        }\n        var d = b = void 0;\n        switch (c.tag) {\n          case 5:\n            b = c.stateNode, d = !1;\n            break;\n\n          case 3:\n          case 4:\n            b = c.stateNode.containerInfo, d = !0;\n            break;\n\n          default:\n            A(\"161\");\n        }\n        16 & c.effectTag && (Ge(b, \"\"), c.effectTag &= -17);\n        a: b: for (c = a; ;) {\n            for (;null === c.sibling; ) {\n                if (null === c.return || Yg(c.return)) {\n                    c = null;\n                    break a;\n                }\n                c = c.return;\n            }\n            for (c.sibling.return = c.return, c = c.sibling; 5 !== c.tag && 6 !== c.tag; ) {\n                if (2 & c.effectTag) continue b;\n                if (null === c.child || 4 === c.tag) continue b;\n                c.child.return = c, c = c.child;\n            }\n            if (!(2 & c.effectTag)) {\n                c = c.stateNode;\n                break a;\n            }\n        }\n        for (var e = a; ;) {\n            if (5 === e.tag || 6 === e.tag) if (c) if (d) {\n                var f = b, g = e.stateNode, h = c;\n                8 === f.nodeType ? f.parentNode.insertBefore(g, h) : f.insertBefore(g, h);\n            } else b.insertBefore(e.stateNode, c); else d ? (f = b, g = e.stateNode, 8 === f.nodeType ? f.parentNode.insertBefore(g, f) : f.appendChild(g)) : b.appendChild(e.stateNode); else if (4 !== e.tag && null !== e.child) {\n                e.child.return = e, e = e.child;\n                continue;\n            }\n            if (e === a) break;\n            for (;null === e.sibling; ) {\n                if (null === e.return || e.return === a) return;\n                e = e.return;\n            }\n            e.sibling.return = e.return, e = e.sibling;\n        }\n    }\n    function Xg(a) {\n        for (var b = a, c = !1, d = void 0, e = void 0; ;) {\n            if (!c) {\n                c = b.return;\n                a: for (;;) {\n                    switch (null === c && A(\"160\"), c.tag) {\n                      case 5:\n                        d = c.stateNode, e = !1;\n                        break a;\n\n                      case 3:\n                      case 4:\n                        d = c.stateNode.containerInfo, e = !0;\n                        break a;\n                    }\n                    c = c.return;\n                }\n                c = !0;\n            }\n            if (5 === b.tag || 6 === b.tag) {\n                a: for (var f = b, g = f; ;) if (Wg(g), null !== g.child && 4 !== g.tag) g.child.return = g, \n                g = g.child; else {\n                    if (g === f) break;\n                    for (;null === g.sibling; ) {\n                        if (null === g.return || g.return === f) break a;\n                        g = g.return;\n                    }\n                    g.sibling.return = g.return, g = g.sibling;\n                }\n                e ? (f = d, g = b.stateNode, 8 === f.nodeType ? f.parentNode.removeChild(g) : f.removeChild(g)) : d.removeChild(b.stateNode);\n            } else if (4 === b.tag ? d = b.stateNode.containerInfo : Wg(b), null !== b.child) {\n                b.child.return = b, b = b.child;\n                continue;\n            }\n            if (b === a) break;\n            for (;null === b.sibling; ) {\n                if (null === b.return || b.return === a) return;\n                b = b.return, 4 === b.tag && (c = !1);\n            }\n            b.sibling.return = b.return, b = b.sibling;\n        }\n    }\n    function $g(a, b) {\n        switch (b.tag) {\n          case 2:\n            break;\n\n          case 5:\n            var c = b.stateNode;\n            if (null != c) {\n                var d = b.memoizedProps;\n                a = null !== a ? a.memoizedProps : d;\n                var e = b.type, f = b.updateQueue;\n                b.updateQueue = null, null !== f && (c[Ma] = d, Te(c, f, e, a, d));\n            }\n            break;\n\n          case 6:\n            null === b.stateNode && A(\"162\"), b.stateNode.nodeValue = b.memoizedProps;\n            break;\n\n          case 3:\n          case 15:\n          case 16:\n            break;\n\n          default:\n            A(\"163\");\n        }\n    }\n    function ah(a, b, c) {\n        c = Kf(c), c.tag = 3, c.payload = {\n            element: null\n        };\n        var d = b.value;\n        return c.callback = function() {\n            bh(d), Tg(a, b);\n        }, c;\n    }\n    function ch(a, b, c) {\n        c = Kf(c), c.tag = 3;\n        var d = a.stateNode;\n        return null !== d && \"function\" == typeof d.componentDidCatch && (c.callback = function() {\n            null === dh ? dh = new Set([ this ]) : dh.add(this);\n            var c = b.value, d = b.stack;\n            Tg(a, b), this.componentDidCatch(c, {\n                componentStack: null !== d ? d : \"\"\n            });\n        }), c;\n    }\n    function eh(a, b, c, d, e, f) {\n        c.effectTag |= 512, c.firstEffect = c.lastEffect = null, d = Tf(d, c), a = b;\n        do {\n            switch (a.tag) {\n              case 3:\n                return a.effectTag |= 1024, d = ah(a, d, f), void Nf(a, d, f);\n\n              case 2:\n                if (b = d, c = a.stateNode, 0 == (64 & a.effectTag) && null !== c && \"function\" == typeof c.componentDidCatch && (null === dh || !dh.has(c))) return a.effectTag |= 1024, \n                d = ch(a, b, f), void Nf(a, d, f);\n            }\n            a = a.return;\n        } while (null !== a);\n    }\n    function fh(a) {\n        switch (a.tag) {\n          case 2:\n            of(a);\n            var b = a.effectTag;\n            return 1024 & b ? (a.effectTag = -1025 & b | 64, a) : null;\n\n          case 3:\n            return eg(a), pf(a), b = a.effectTag, 1024 & b ? (a.effectTag = -1025 & b | 64, \n            a) : null;\n\n          case 5:\n            return fg(a), null;\n\n          case 16:\n            return b = a.effectTag, 1024 & b ? (a.effectTag = -1025 & b | 64, a) : null;\n\n          case 4:\n            return eg(a), null;\n\n          case 13:\n            return Yf(a), null;\n\n          default:\n            return null;\n        }\n    }\n    function rh() {\n        if (null !== S) for (var a = S.return; null !== a; ) {\n            var b = a;\n            switch (b.tag) {\n              case 2:\n                of(b);\n                break;\n\n              case 3:\n                eg(b), pf(b);\n                break;\n\n              case 5:\n                fg(b);\n                break;\n\n              case 4:\n                eg(b);\n                break;\n\n              case 13:\n                Yf(b);\n            }\n            a = a.return;\n        }\n        mh = null, T = 0, nh = -1, oh = !1, S = null, qh = !1;\n    }\n    function sh(a) {\n        for (;;) {\n            var b = a.alternate, c = a.return, d = a.sibling;\n            if (0 == (512 & a.effectTag)) {\n                b = Sg(b, a, T);\n                var e = a;\n                if (1073741823 === T || 1073741823 !== e.expirationTime) {\n                    var f = 0;\n                    switch (e.tag) {\n                      case 3:\n                      case 2:\n                        var g = e.updateQueue;\n                        null !== g && (f = g.expirationTime);\n                    }\n                    for (g = e.child; null !== g; ) 0 !== g.expirationTime && (0 === f || f > g.expirationTime) && (f = g.expirationTime), \n                    g = g.sibling;\n                    e.expirationTime = f;\n                }\n                if (null !== b) return b;\n                if (null !== c && 0 == (512 & c.effectTag) && (null === c.firstEffect && (c.firstEffect = a.firstEffect), \n                null !== a.lastEffect && (null !== c.lastEffect && (c.lastEffect.nextEffect = a.firstEffect), \n                c.lastEffect = a.lastEffect), 1 < a.effectTag && (null !== c.lastEffect ? c.lastEffect.nextEffect = a : c.firstEffect = a, \n                c.lastEffect = a)), null !== d) return d;\n                if (null === c) {\n                    qh = !0;\n                    break;\n                }\n                a = c;\n            } else {\n                if (null !== (a = fh(a, oh, T))) return a.effectTag &= 511, a;\n                if (null !== c && (c.firstEffect = c.lastEffect = null, c.effectTag |= 512), null !== d) return d;\n                if (null === c) break;\n                a = c;\n            }\n        }\n        return null;\n    }\n    function th(a) {\n        var b = Kg(a.alternate, a, T);\n        return null === b && (b = sh(a)), ec.current = null, b;\n    }\n    function uh(a, b, c) {\n        lh && A(\"243\"), lh = !0, b === T && a === mh && null !== S || (rh(), mh = a, T = b, \n        nh = -1, S = vf(mh.current, null, T), a.pendingCommitExpirationTime = 0);\n        var d = !1;\n        for (oh = !c || T <= hh; ;) {\n            try {\n                if (c) for (;null !== S && !vh(); ) S = th(S); else for (;null !== S; ) S = th(S);\n            } catch (f) {\n                if (null === S) d = !0, bh(f); else {\n                    null === S && A(\"271\"), c = S;\n                    var e = c.return;\n                    if (null === e) {\n                        d = !0, bh(f);\n                        break;\n                    }\n                    eh(a, e, c, f, oh, T, ih), S = sh(c);\n                }\n            }\n            break;\n        }\n        if (lh = !1, d) return null;\n        if (null === S) {\n            if (qh) return a.pendingCommitExpirationTime = b, a.current.alternate;\n            oh && A(\"262\"), 0 <= nh && setTimeout(function() {\n                var b = a.current.expirationTime;\n                0 !== b && (0 === a.remainingExpirationTime || a.remainingExpirationTime < b) && wh(a, b);\n            }, nh), xh(a.current.expirationTime);\n        }\n        return null;\n    }\n    function Vg(a, b) {\n        var c;\n        a: {\n            for (lh && !ph && A(\"263\"), c = a.return; null !== c; ) {\n                switch (c.tag) {\n                  case 2:\n                    var d = c.stateNode;\n                    if (\"function\" == typeof c.type.getDerivedStateFromCatch || \"function\" == typeof d.componentDidCatch && (null === dh || !dh.has(d))) {\n                        a = Tf(b, a), a = ch(c, a, 1), Mf(c, a, 1), kg(c, 1), c = void 0;\n                        break a;\n                    }\n                    break;\n\n                  case 3:\n                    a = Tf(b, a), a = ah(c, a, 1), Mf(c, a, 1), kg(c, 1), c = void 0;\n                    break a;\n                }\n                c = c.return;\n            }\n            3 === a.tag && (c = Tf(b, a), c = ah(a, c, 1), Mf(a, c, 1), kg(a, 1)), c = void 0;\n        }\n        return c;\n    }\n    function yh() {\n        var a = 2 + 25 * (1 + ((ig() - 2 + 500) / 25 | 0));\n        return a <= jh && (a = jh + 1), jh = a;\n    }\n    function jg(a, b) {\n        return a = 0 !== kh ? kh : lh ? ph ? 1 : T : 1 & b.mode ? zh ? 2 + 10 * (1 + ((a - 2 + 15) / 10 | 0)) : 2 + 25 * (1 + ((a - 2 + 500) / 25 | 0)) : 1, \n        zh && (0 === Ah || a > Ah) && (Ah = a), a;\n    }\n    function kg(a, b) {\n        for (;null !== a; ) {\n            if ((0 === a.expirationTime || a.expirationTime > b) && (a.expirationTime = b), \n            null !== a.alternate && (0 === a.alternate.expirationTime || a.alternate.expirationTime > b) && (a.alternate.expirationTime = b), \n            null === a.return) {\n                if (3 !== a.tag) break;\n                var c = a.stateNode;\n                !lh && 0 !== T && b < T && rh();\n                var d = c.current.expirationTime;\n                lh && !ph && mh === c || wh(c, d), Bh > Ch && A(\"185\");\n            }\n            a = a.return;\n        }\n    }\n    function ig() {\n        return ih = af() - gh, hh = 2 + (ih / 10 | 0);\n    }\n    function Dh(a) {\n        var b = kh;\n        kh = 2 + 25 * (1 + ((ig() - 2 + 500) / 25 | 0));\n        try {\n            return a();\n        } finally {\n            kh = b;\n        }\n    }\n    function Eh(a, b, c, d, e) {\n        var f = kh;\n        kh = 1;\n        try {\n            return a(b, c, d, e);\n        } finally {\n            kh = f;\n        }\n    }\n    function Ph(a) {\n        if (0 !== Gh) {\n            if (a > Gh) return;\n            cf(Hh);\n        }\n        var b = af() - gh;\n        Gh = a, Hh = bf(Qh, {\n            timeout: 10 * (a - 2) - b\n        });\n    }\n    function wh(a, b) {\n        if (null === a.nextScheduledRoot) a.remainingExpirationTime = b, null === V ? (Fh = V = a, \n        a.nextScheduledRoot = a) : (V = V.nextScheduledRoot = a, V.nextScheduledRoot = Fh); else {\n            var c = a.remainingExpirationTime;\n            (0 === c || b < c) && (a.remainingExpirationTime = b);\n        }\n        W || (Z ? Mh && (X = a, Y = 1, Rh(a, 1, !1)) : 1 === b ? Sh() : Ph(b));\n    }\n    function Th() {\n        var a = 0, b = null;\n        if (null !== V) for (var c = V, d = Fh; null !== d; ) {\n            var e = d.remainingExpirationTime;\n            if (0 === e) {\n                if ((null === c || null === V) && A(\"244\"), d === d.nextScheduledRoot) {\n                    Fh = V = d.nextScheduledRoot = null;\n                    break;\n                }\n                if (d === Fh) Fh = e = d.nextScheduledRoot, V.nextScheduledRoot = e, d.nextScheduledRoot = null; else {\n                    if (d === V) {\n                        V = c, V.nextScheduledRoot = Fh, d.nextScheduledRoot = null;\n                        break;\n                    }\n                    c.nextScheduledRoot = d.nextScheduledRoot, d.nextScheduledRoot = null;\n                }\n                d = c.nextScheduledRoot;\n            } else {\n                if ((0 === a || e < a) && (a = e, b = d), d === V) break;\n                c = d, d = d.nextScheduledRoot;\n            }\n        }\n        c = X, null !== c && c === b && 1 === a ? Bh++ : Bh = 0, X = b, Y = a;\n    }\n    function Qh(a) {\n        Uh(0, !0, a);\n    }\n    function Sh() {\n        Uh(1, !1, null);\n    }\n    function Uh(a, b, c) {\n        if (Lh = c, Th(), b) for (;null !== X && 0 !== Y && (0 === a || a >= Y) && (!Ih || ig() >= Y); ) ig(), \n        Rh(X, Y, !Ih), Th(); else for (;null !== X && 0 !== Y && (0 === a || a >= Y); ) Rh(X, Y, !1), \n        Th();\n        null !== Lh && (Gh = 0, Hh = -1), 0 !== Y && Ph(Y), Lh = null, Ih = !1, Vh();\n    }\n    function Wh(a, b) {\n        W && A(\"253\"), X = a, Y = b, Rh(a, b, !1), Sh(), Vh();\n    }\n    function Vh() {\n        if (Bh = 0, null !== Nh) {\n            var a = Nh;\n            Nh = null;\n            for (var b = 0; b < a.length; b++) {\n                var c = a[b];\n                try {\n                    c._onComplete();\n                } catch (d) {\n                    Jh || (Jh = !0, Kh = d);\n                }\n            }\n        }\n        if (Jh) throw a = Kh, Kh = null, Jh = !1, a;\n    }\n    function Rh(a, b, c) {\n        W && A(\"245\"), W = !0, c ? (c = a.finishedWork, null !== c ? Xh(a, c, b) : (a.finishedWork = null, \n        null !== (c = uh(a, b, !0)) && (vh() ? a.finishedWork = c : Xh(a, c, b)))) : (c = a.finishedWork, \n        null !== c ? Xh(a, c, b) : (a.finishedWork = null, null !== (c = uh(a, b, !1)) && Xh(a, c, b))), \n        W = !1;\n    }\n    function Xh(a, b, c) {\n        var d = a.firstBatch;\n        if (null !== d && d._expirationTime <= c && (null === Nh ? Nh = [ d ] : Nh.push(d), \n        d._defer)) return a.finishedWork = b, void (a.remainingExpirationTime = 0);\n        if (a.finishedWork = null, ph = lh = !0, c = b.stateNode, c.current === b && A(\"177\"), \n        d = c.pendingCommitExpirationTime, 0 === d && A(\"261\"), c.pendingCommitExpirationTime = 0, \n        ig(), ec.current = null, 1 < b.effectTag) if (null !== b.lastEffect) {\n            b.lastEffect.nextEffect = b;\n            var e = b.firstEffect;\n        } else e = b; else e = b.firstEffect;\n        Xe = Gd;\n        var f = da();\n        if (Td(f)) {\n            if (\"selectionStart\" in f) var g = {\n                start: f.selectionStart,\n                end: f.selectionEnd\n            }; else a: {\n                var h = window.getSelection && window.getSelection();\n                if (h && 0 !== h.rangeCount) {\n                    g = h.anchorNode;\n                    var k = h.anchorOffset, n = h.focusNode;\n                    h = h.focusOffset;\n                    try {\n                        g.nodeType, n.nodeType;\n                    } catch (Wa) {\n                        g = null;\n                        break a;\n                    }\n                    var r = 0, w = -1, P = -1, kc = 0, Hd = 0, E = f, t = null;\n                    b: for (;;) {\n                        for (var x; E !== g || 0 !== k && 3 !== E.nodeType || (w = r + k), E !== n || 0 !== h && 3 !== E.nodeType || (P = r + h), \n                        3 === E.nodeType && (r += E.nodeValue.length), null !== (x = E.firstChild); ) t = E, \n                        E = x;\n                        for (;;) {\n                            if (E === f) break b;\n                            if (t === g && ++kc === k && (w = r), t === n && ++Hd === h && (P = r), null !== (x = E.nextSibling)) break;\n                            E = t, t = E.parentNode;\n                        }\n                        E = x;\n                    }\n                    g = -1 === w || -1 === P ? null : {\n                        start: w,\n                        end: P\n                    };\n                } else g = null;\n            }\n            g = g || {\n                start: 0,\n                end: 0\n            };\n        } else g = null;\n        for (Ye = {\n            focusedElem: f,\n            selectionRange: g\n        }, Id(!1), U = e; null !== U; ) {\n            f = !1, g = void 0;\n            try {\n                for (;null !== U; ) {\n                    if (256 & U.effectTag) {\n                        var u = U.alternate;\n                        switch (k = U, k.tag) {\n                          case 2:\n                            if (256 & k.effectTag && null !== u) {\n                                var y = u.memoizedProps, D = u.memoizedState, ja = k.stateNode;\n                                ja.props = k.memoizedProps, ja.state = k.memoizedState;\n                                var hi = ja.getSnapshotBeforeUpdate(y, D);\n                                ja.__reactInternalSnapshotBeforeUpdate = hi;\n                            }\n                            break;\n\n                          case 3:\n                          case 5:\n                          case 6:\n                          case 4:\n                            break;\n\n                          default:\n                            A(\"163\");\n                        }\n                    }\n                    U = U.nextEffect;\n                }\n            } catch (Wa) {\n                f = !0, g = Wa;\n            }\n            f && (null === U && A(\"178\"), Vg(U, g), null !== U && (U = U.nextEffect));\n        }\n        for (U = e; null !== U; ) {\n            u = !1, y = void 0;\n            try {\n                for (;null !== U; ) {\n                    var q = U.effectTag;\n                    if (16 & q && Ge(U.stateNode, \"\"), 128 & q) {\n                        var z = U.alternate;\n                        if (null !== z) {\n                            var l = z.ref;\n                            null !== l && (\"function\" == typeof l ? l(null) : l.current = null);\n                        }\n                    }\n                    switch (14 & q) {\n                      case 2:\n                        Zg(U), U.effectTag &= -3;\n                        break;\n\n                      case 6:\n                        Zg(U), U.effectTag &= -3, $g(U.alternate, U);\n                        break;\n\n                      case 4:\n                        $g(U.alternate, U);\n                        break;\n\n                      case 8:\n                        D = U, Xg(D), D.return = null, D.child = null, D.alternate && (D.alternate.child = null, \n                        D.alternate.return = null);\n                    }\n                    U = U.nextEffect;\n                }\n            } catch (Wa) {\n                u = !0, y = Wa;\n            }\n            u && (null === U && A(\"178\"), Vg(U, y), null !== U && (U = U.nextEffect));\n        }\n        if (l = Ye, z = da(), q = l.focusedElem, u = l.selectionRange, z !== q && fa(document.documentElement, q)) {\n            Td(q) && (z = u.start, l = u.end, void 0 === l && (l = z), \"selectionStart\" in q ? (q.selectionStart = z, \n            q.selectionEnd = Math.min(l, q.value.length)) : window.getSelection && (z = window.getSelection(), \n            y = q[lb()].length, l = Math.min(u.start, y), u = void 0 === u.end ? l : Math.min(u.end, y), \n            !z.extend && l > u && (y = u, u = l, l = y), y = Sd(q, l), D = Sd(q, u), y && D && (1 !== z.rangeCount || z.anchorNode !== y.node || z.anchorOffset !== y.offset || z.focusNode !== D.node || z.focusOffset !== D.offset) && (ja = document.createRange(), \n            ja.setStart(y.node, y.offset), z.removeAllRanges(), l > u ? (z.addRange(ja), z.extend(D.node, D.offset)) : (ja.setEnd(D.node, D.offset), \n            z.addRange(ja))))), z = [];\n            for (l = q; l = l.parentNode; ) 1 === l.nodeType && z.push({\n                element: l,\n                left: l.scrollLeft,\n                top: l.scrollTop\n            });\n            for (q.focus(), q = 0; q < z.length; q++) l = z[q], l.element.scrollLeft = l.left, \n            l.element.scrollTop = l.top;\n        }\n        for (Ye = null, Id(Xe), Xe = null, c.current = b, U = e; null !== U; ) {\n            e = !1, q = void 0;\n            try {\n                for (z = d; null !== U; ) {\n                    var gg = U.effectTag;\n                    if (36 & gg) {\n                        var lc = U.alternate;\n                        switch (l = U, u = z, l.tag) {\n                          case 2:\n                            var ba = l.stateNode;\n                            if (4 & l.effectTag) if (null === lc) ba.props = l.memoizedProps, ba.state = l.memoizedState, \n                            ba.componentDidMount(); else {\n                                var ri = lc.memoizedProps, si = lc.memoizedState;\n                                ba.props = l.memoizedProps, ba.state = l.memoizedState, ba.componentDidUpdate(ri, si, ba.__reactInternalSnapshotBeforeUpdate);\n                            }\n                            var Mg = l.updateQueue;\n                            null !== Mg && (ba.props = l.memoizedProps, ba.state = l.memoizedState, Sf(l, Mg, ba, u));\n                            break;\n\n                          case 3:\n                            var Ng = l.updateQueue;\n                            if (null !== Ng) {\n                                if (y = null, null !== l.child) switch (l.child.tag) {\n                                  case 5:\n                                    y = l.child.stateNode;\n                                    break;\n\n                                  case 2:\n                                    y = l.child.stateNode;\n                                }\n                                Sf(l, Ng, y, u);\n                            }\n                            break;\n\n                          case 5:\n                            var ti = l.stateNode;\n                            null === lc && 4 & l.effectTag && Ze(l.type, l.memoizedProps) && ti.focus();\n                            break;\n\n                          case 6:\n                          case 4:\n                          case 15:\n                          case 16:\n                            break;\n\n                          default:\n                            A(\"163\");\n                        }\n                    }\n                    if (128 & gg) {\n                        l = void 0;\n                        var uc = U.ref;\n                        if (null !== uc) {\n                            var Og = U.stateNode;\n                            switch (U.tag) {\n                              case 5:\n                                l = Og;\n                                break;\n\n                              default:\n                                l = Og;\n                            }\n                            \"function\" == typeof uc ? uc(l) : uc.current = l;\n                        }\n                    }\n                    var ui = U.nextEffect;\n                    U.nextEffect = null, U = ui;\n                }\n            } catch (Wa) {\n                e = !0, q = Wa;\n            }\n            e && (null === U && A(\"178\"), Vg(U, q), null !== U && (U = U.nextEffect));\n        }\n        lh = ph = !1, \"function\" == typeof Ff && Ff(b.stateNode), b = c.current.expirationTime, \n        0 === b && (dh = null), a.remainingExpirationTime = b;\n    }\n    function vh() {\n        return !(null === Lh || Lh.timeRemaining() > Oh) && (Ih = !0);\n    }\n    function bh(a) {\n        null === X && A(\"246\"), X.remainingExpirationTime = 0, Jh || (Jh = !0, Kh = a);\n    }\n    function xh(a) {\n        null === X && A(\"246\"), X.remainingExpirationTime = a;\n    }\n    function Yh(a, b) {\n        var c = Z;\n        Z = !0;\n        try {\n            return a(b);\n        } finally {\n            (Z = c) || W || Sh();\n        }\n    }\n    function Zh(a, b) {\n        if (Z && !Mh) {\n            Mh = !0;\n            try {\n                return a(b);\n            } finally {\n                Mh = !1;\n            }\n        }\n        return a(b);\n    }\n    function $h(a, b) {\n        W && A(\"187\");\n        var c = Z;\n        Z = !0;\n        try {\n            return Eh(a, b);\n        } finally {\n            Z = c, Sh();\n        }\n    }\n    function ai(a) {\n        var b = Z;\n        Z = !0;\n        try {\n            Eh(a);\n        } finally {\n            (Z = b) || W || Uh(1, !1, null);\n        }\n    }\n    function bi(a, b, c, d, e) {\n        var f = b.current;\n        if (c) {\n            c = c._reactInternalFiber;\n            var g;\n            b: {\n                for (2 === id(c) && 2 === c.tag || A(\"170\"), g = c; 3 !== g.tag; ) {\n                    if (mf(g)) {\n                        g = g.stateNode.__reactInternalMemoizedMergedChildContext;\n                        break b;\n                    }\n                    (g = g.return) || A(\"171\");\n                }\n                g = g.stateNode.context;\n            }\n            c = mf(c) ? rf(c, g) : g;\n        } else c = ha;\n        return null === b.context ? b.context = c : b.pendingContext = c, b = e, e = Kf(d), \n        e.payload = {\n            element: a\n        }, b = void 0 === b ? null : b, null !== b && (e.callback = b), Mf(f, e, d), kg(f, d), \n        d;\n    }\n    function ci(a) {\n        var b = a._reactInternalFiber;\n        return void 0 === b && (\"function\" == typeof a.render ? A(\"188\") : A(\"268\", Object.keys(a))), \n        a = ld(b), null === a ? null : a.stateNode;\n    }\n    function di(a, b, c, d) {\n        var e = b.current;\n        return e = jg(ig(), e), bi(a, b, c, e, d);\n    }\n    function ei(a) {\n        if (a = a.current, !a.child) return null;\n        switch (a.child.tag) {\n          case 5:\n          default:\n            return a.child.stateNode;\n        }\n    }\n    function fi(a) {\n        var b = a.findFiberByHostInstance;\n        return Ef(p({}, a, {\n            findHostInstanceByFiber: function(a) {\n                return a = ld(a), null === a ? null : a.stateNode;\n            },\n            findFiberByHostInstance: function(a) {\n                return b ? b(a) : null;\n            }\n        }));\n    }\n    function ii(a, b, c) {\n        var d = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n        return {\n            $$typeof: gc,\n            key: null == d ? null : \"\" + d,\n            children: a,\n            containerInfo: b,\n            implementation: c\n        };\n    }\n    function ji(a) {\n        this._expirationTime = yh(), this._root = a, this._callbacks = this._next = null, \n        this._hasChildren = this._didComplete = !1, this._children = null, this._defer = !0;\n    }\n    function ki() {\n        this._callbacks = null, this._didCommit = !1, this._onCommit = this._onCommit.bind(this);\n    }\n    function li(a, b, c) {\n        this._internalRoot = Af(a, b, c);\n    }\n    function mi(a) {\n        return !(!a || 1 !== a.nodeType && 9 !== a.nodeType && 11 !== a.nodeType && (8 !== a.nodeType || \" react-mount-point-unstable \" !== a.nodeValue));\n    }\n    function ni(a, b) {\n        if (b || (b = a ? 9 === a.nodeType ? a.documentElement : a.firstChild : null, b = !(!b || 1 !== b.nodeType || !b.hasAttribute(\"data-reactroot\"))), \n        !b) for (var c; c = a.lastChild; ) a.removeChild(c);\n        return new li(a, !1, b);\n    }\n    function oi(a, b, c, d, e) {\n        mi(c) || A(\"200\");\n        var f = c._reactRootContainer;\n        if (f) {\n            if (\"function\" == typeof e) {\n                var g = e;\n                e = function() {\n                    var a = ei(f._internalRoot);\n                    g.call(a);\n                };\n            }\n            null != a ? f.legacy_renderSubtreeIntoContainer(a, b, e) : f.render(b, e);\n        } else {\n            if (f = c._reactRootContainer = ni(c, d), \"function\" == typeof e) {\n                var h = e;\n                e = function() {\n                    var a = ei(f._internalRoot);\n                    h.call(a);\n                };\n            }\n            Zh(function() {\n                null != a ? f.legacy_renderSubtreeIntoContainer(a, b, e) : f.render(b, e);\n            });\n        }\n        return ei(f._internalRoot);\n    }\n    function pi(a, b) {\n        var c = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n        return mi(b) || A(\"200\"), ii(a, b, null, c);\n    }\n    var aa = __webpack_require__(49), ca = __webpack_require__(0), m = __webpack_require__(219), p = __webpack_require__(74), v = __webpack_require__(50), da = __webpack_require__(220), ea = __webpack_require__(100), fa = __webpack_require__(221), ha = __webpack_require__(97);\n    ca || A(\"227\");\n    var B = {\n        _caughtError: null,\n        _hasCaughtError: !1,\n        _rethrowError: null,\n        _hasRethrowError: !1,\n        invokeGuardedCallback: function(a, b, c, d, e, f, g, h, k) {\n            ia.apply(B, arguments);\n        },\n        invokeGuardedCallbackAndCatchFirstError: function(a, b, c, d, e, f, g, h, k) {\n            if (B.invokeGuardedCallback.apply(this, arguments), B.hasCaughtError()) {\n                var n = B.clearCaughtError();\n                B._hasRethrowError || (B._hasRethrowError = !0, B._rethrowError = n);\n            }\n        },\n        rethrowCaughtError: function() {\n            return ka.apply(B, arguments);\n        },\n        hasCaughtError: function() {\n            return B._hasCaughtError;\n        },\n        clearCaughtError: function() {\n            if (B._hasCaughtError) {\n                var a = B._caughtError;\n                return B._caughtError = null, B._hasCaughtError = !1, a;\n            }\n            A(\"198\");\n        }\n    }, la = null, ma = {}, oa = [], pa = {}, ra = {}, sa = {}, va = {\n        plugins: oa,\n        eventNameDispatchConfigs: pa,\n        registrationNameModules: ra,\n        registrationNameDependencies: sa,\n        possibleRegistrationNames: null,\n        injectEventPluginOrder: ta,\n        injectEventPluginsByName: ua\n    }, wa = null, xa = null, ya = null, Ca = null, Ga = {\n        injectEventPluginOrder: ta,\n        injectEventPluginsByName: ua\n    }, Ka = {\n        injection: Ga,\n        getListener: Ha,\n        runEventsInBatch: Ia,\n        runExtractedEventsInBatch: Ja\n    }, La = Math.random().toString(36).slice(2), C = \"__reactInternalInstance$\" + La, Ma = \"__reactEventHandlers$\" + La, Qa = {\n        precacheFiberNode: function(a, b) {\n            b[C] = a;\n        },\n        getClosestInstanceFromNode: Na,\n        getInstanceFromNode: function(a) {\n            return a = a[C], !a || 5 !== a.tag && 6 !== a.tag ? null : a;\n        },\n        getNodeFromInstance: Oa,\n        getFiberCurrentPropsFromNode: Pa,\n        updateFiberProps: function(a, b) {\n            a[Ma] = b;\n        }\n    }, $a = {\n        accumulateTwoPhaseDispatches: Ya,\n        accumulateTwoPhaseDispatchesSkipTarget: function(a) {\n            Ba(a, Ua);\n        },\n        accumulateEnterLeaveDispatches: Za,\n        accumulateDirectDispatches: function(a) {\n            Ba(a, Xa);\n        }\n    }, bb = {\n        animationend: ab(\"Animation\", \"AnimationEnd\"),\n        animationiteration: ab(\"Animation\", \"AnimationIteration\"),\n        animationstart: ab(\"Animation\", \"AnimationStart\"),\n        transitionend: ab(\"Transition\", \"TransitionEnd\")\n    }, cb = {}, db = {};\n    m.canUseDOM && (db = document.createElement(\"div\").style, \"AnimationEvent\" in window || (delete bb.animationend.animation, \n    delete bb.animationiteration.animation, delete bb.animationstart.animation), \"TransitionEvent\" in window || delete bb.transitionend.transition);\n    var fb = eb(\"animationend\"), gb = eb(\"animationiteration\"), hb = eb(\"animationstart\"), ib = eb(\"transitionend\"), jb = \"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"), kb = null, G = {\n        _root: null,\n        _startText: null,\n        _fallbackText: null\n    }, ob = \"dispatchConfig _targetInst nativeEvent isDefaultPrevented isPropagationStopped _dispatchListeners _dispatchInstances\".split(\" \"), pb = {\n        type: null,\n        target: null,\n        currentTarget: v.thatReturnsNull,\n        eventPhase: null,\n        bubbles: null,\n        cancelable: null,\n        timeStamp: function(a) {\n            return a.timeStamp || Date.now();\n        },\n        defaultPrevented: null,\n        isTrusted: null\n    };\n    p(H.prototype, {\n        preventDefault: function() {\n            this.defaultPrevented = !0;\n            var a = this.nativeEvent;\n            a && (a.preventDefault ? a.preventDefault() : \"unknown\" != typeof a.returnValue && (a.returnValue = !1), \n            this.isDefaultPrevented = v.thatReturnsTrue);\n        },\n        stopPropagation: function() {\n            var a = this.nativeEvent;\n            a && (a.stopPropagation ? a.stopPropagation() : \"unknown\" != typeof a.cancelBubble && (a.cancelBubble = !0), \n            this.isPropagationStopped = v.thatReturnsTrue);\n        },\n        persist: function() {\n            this.isPersistent = v.thatReturnsTrue;\n        },\n        isPersistent: v.thatReturnsFalse,\n        destructor: function() {\n            var b, a = this.constructor.Interface;\n            for (b in a) this[b] = null;\n            for (a = 0; a < ob.length; a++) this[ob[a]] = null;\n        }\n    }), H.Interface = pb, H.extend = function(a) {\n        function b() {}\n        function c() {\n            return d.apply(this, arguments);\n        }\n        var d = this;\n        b.prototype = d.prototype;\n        var e = new b();\n        return p(e, c.prototype), c.prototype = e, c.prototype.constructor = c, c.Interface = p({}, d.Interface, a), \n        c.extend = d.extend, qb(c), c;\n    }, qb(H);\n    var tb = H.extend({\n        data: null\n    }), ub = H.extend({\n        data: null\n    }), vb = [ 9, 13, 27, 32 ], wb = m.canUseDOM && \"CompositionEvent\" in window, xb = null;\n    m.canUseDOM && \"documentMode\" in document && (xb = document.documentMode);\n    var yb = m.canUseDOM && \"TextEvent\" in window && !xb, zb = m.canUseDOM && (!wb || xb && 8 < xb && 11 >= xb), Ab = String.fromCharCode(32), Bb = {\n        beforeInput: {\n            phasedRegistrationNames: {\n                bubbled: \"onBeforeInput\",\n                captured: \"onBeforeInputCapture\"\n            },\n            dependencies: [ \"compositionend\", \"keypress\", \"textInput\", \"paste\" ]\n        },\n        compositionEnd: {\n            phasedRegistrationNames: {\n                bubbled: \"onCompositionEnd\",\n                captured: \"onCompositionEndCapture\"\n            },\n            dependencies: \"blur compositionend keydown keypress keyup mousedown\".split(\" \")\n        },\n        compositionStart: {\n            phasedRegistrationNames: {\n                bubbled: \"onCompositionStart\",\n                captured: \"onCompositionStartCapture\"\n            },\n            dependencies: \"blur compositionstart keydown keypress keyup mousedown\".split(\" \")\n        },\n        compositionUpdate: {\n            phasedRegistrationNames: {\n                bubbled: \"onCompositionUpdate\",\n                captured: \"onCompositionUpdateCapture\"\n            },\n            dependencies: \"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")\n        }\n    }, Cb = !1, Fb = !1, Ib = {\n        eventTypes: Bb,\n        extractEvents: function(a, b, c, d) {\n            var e = void 0, f = void 0;\n            if (wb) b: {\n                switch (a) {\n                  case \"compositionstart\":\n                    e = Bb.compositionStart;\n                    break b;\n\n                  case \"compositionend\":\n                    e = Bb.compositionEnd;\n                    break b;\n\n                  case \"compositionupdate\":\n                    e = Bb.compositionUpdate;\n                    break b;\n                }\n                e = void 0;\n            } else Fb ? Db(a, c) && (e = Bb.compositionEnd) : \"keydown\" === a && 229 === c.keyCode && (e = Bb.compositionStart);\n            return e ? (zb && (Fb || e !== Bb.compositionStart ? e === Bb.compositionEnd && Fb && (f = mb()) : (G._root = d, \n            G._startText = nb(), Fb = !0)), e = tb.getPooled(e, b, c, d), f ? e.data = f : null !== (f = Eb(c)) && (e.data = f), \n            Ya(e), f = e) : f = null, (a = yb ? Gb(a, c) : Hb(a, c)) ? (b = ub.getPooled(Bb.beforeInput, b, c, d), \n            b.data = a, Ya(b)) : b = null, null === f ? b : null === b ? f : [ f, b ];\n        }\n    }, Jb = null, Kb = {\n        injectFiberControlledHostComponent: function(a) {\n            Jb = a;\n        }\n    }, Lb = null, Mb = null, Rb = {\n        injection: Kb,\n        enqueueStateRestore: Ob,\n        needsStateRestore: Pb,\n        restoreStateIfNeeded: Qb\n    }, Vb = !1, Xb = {\n        color: !0,\n        date: !0,\n        datetime: !0,\n        \"datetime-local\": !0,\n        email: !0,\n        month: !0,\n        number: !0,\n        password: !0,\n        range: !0,\n        search: !0,\n        tel: !0,\n        text: !0,\n        time: !0,\n        url: !0,\n        week: !0\n    }, ec = ca.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, I = \"function\" == typeof Symbol && Symbol.for, fc = I ? Symbol.for(\"react.element\") : 60103, gc = I ? Symbol.for(\"react.portal\") : 60106, hc = I ? Symbol.for(\"react.fragment\") : 60107, ic = I ? Symbol.for(\"react.strict_mode\") : 60108, jc = I ? Symbol.for(\"react.profiler\") : 60114, mc = I ? Symbol.for(\"react.provider\") : 60109, nc = I ? Symbol.for(\"react.context\") : 60110, oc = I ? Symbol.for(\"react.async_mode\") : 60111, pc = I ? Symbol.for(\"react.forward_ref\") : 60112, qc = I ? Symbol.for(\"react.timeout\") : 60113, rc = \"function\" == typeof Symbol && Symbol.iterator, wc = /^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/, xc = {}, yc = {}, K = {};\n    \"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a) {\n        K[a] = new J(a, 0, !1, a, null);\n    }), [ [ \"acceptCharset\", \"accept-charset\" ], [ \"className\", \"class\" ], [ \"htmlFor\", \"for\" ], [ \"httpEquiv\", \"http-equiv\" ] ].forEach(function(a) {\n        var b = a[0];\n        K[b] = new J(b, 1, !1, a[1], null);\n    }), [ \"contentEditable\", \"draggable\", \"spellCheck\", \"value\" ].forEach(function(a) {\n        K[a] = new J(a, 2, !1, a.toLowerCase(), null);\n    }), [ \"autoReverse\", \"externalResourcesRequired\", \"preserveAlpha\" ].forEach(function(a) {\n        K[a] = new J(a, 2, !1, a, null);\n    }), \"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a) {\n        K[a] = new J(a, 3, !1, a.toLowerCase(), null);\n    }), [ \"checked\", \"multiple\", \"muted\", \"selected\" ].forEach(function(a) {\n        K[a] = new J(a, 3, !0, a.toLowerCase(), null);\n    }), [ \"capture\", \"download\" ].forEach(function(a) {\n        K[a] = new J(a, 4, !1, a.toLowerCase(), null);\n    }), [ \"cols\", \"rows\", \"size\", \"span\" ].forEach(function(a) {\n        K[a] = new J(a, 6, !1, a.toLowerCase(), null);\n    }), [ \"rowSpan\", \"start\" ].forEach(function(a) {\n        K[a] = new J(a, 5, !1, a.toLowerCase(), null);\n    });\n    var Cc = /[\\-:]([a-z])/g;\n    \"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a) {\n        var b = a.replace(Cc, Dc);\n        K[b] = new J(b, 1, !1, a, null);\n    }), \"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a) {\n        var b = a.replace(Cc, Dc);\n        K[b] = new J(b, 1, !1, a, \"http://www.w3.org/1999/xlink\");\n    }), [ \"xml:base\", \"xml:lang\", \"xml:space\" ].forEach(function(a) {\n        var b = a.replace(Cc, Dc);\n        K[b] = new J(b, 1, !1, a, \"http://www.w3.org/XML/1998/namespace\");\n    }), K.tabIndex = new J(\"tabIndex\", 1, !1, \"tabindex\", null);\n    var Mc = {\n        change: {\n            phasedRegistrationNames: {\n                bubbled: \"onChange\",\n                captured: \"onChangeCapture\"\n            },\n            dependencies: \"blur change click focus input keydown keyup selectionchange\".split(\" \")\n        }\n    }, Oc = null, Pc = null, Tc = !1;\n    m.canUseDOM && (Tc = $b(\"input\") && (!document.documentMode || 9 < document.documentMode));\n    var $c = {\n        eventTypes: Mc,\n        _isInputEventSupported: Tc,\n        extractEvents: function(a, b, c, d) {\n            var e = b ? Oa(b) : window, f = void 0, g = void 0, h = e.nodeName && e.nodeName.toLowerCase();\n            if (\"select\" === h || \"input\" === h && \"file\" === e.type ? f = Sc : Yb(e) ? Tc ? f = Zc : (f = Xc, \n            g = Wc) : (h = e.nodeName) && \"input\" === h.toLowerCase() && (\"checkbox\" === e.type || \"radio\" === e.type) && (f = Yc), \n            f && (f = f(a, b))) return Nc(f, c, d);\n            g && g(a, e, b), \"blur\" === a && null != b && (a = b._wrapperState || e._wrapperState) && a.controlled && \"number\" === e.type && Kc(e, \"number\", e.value);\n        }\n    }, ad = H.extend({\n        view: null,\n        detail: null\n    }), bd = {\n        Alt: \"altKey\",\n        Control: \"ctrlKey\",\n        Meta: \"metaKey\",\n        Shift: \"shiftKey\"\n    }, ed = ad.extend({\n        screenX: null,\n        screenY: null,\n        clientX: null,\n        clientY: null,\n        pageX: null,\n        pageY: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        getModifierState: dd,\n        button: null,\n        buttons: null,\n        relatedTarget: function(a) {\n            return a.relatedTarget || (a.fromElement === a.srcElement ? a.toElement : a.fromElement);\n        }\n    }), fd = ed.extend({\n        pointerId: null,\n        width: null,\n        height: null,\n        pressure: null,\n        tiltX: null,\n        tiltY: null,\n        pointerType: null,\n        isPrimary: null\n    }), gd = {\n        mouseEnter: {\n            registrationName: \"onMouseEnter\",\n            dependencies: [ \"mouseout\", \"mouseover\" ]\n        },\n        mouseLeave: {\n            registrationName: \"onMouseLeave\",\n            dependencies: [ \"mouseout\", \"mouseover\" ]\n        },\n        pointerEnter: {\n            registrationName: \"onPointerEnter\",\n            dependencies: [ \"pointerout\", \"pointerover\" ]\n        },\n        pointerLeave: {\n            registrationName: \"onPointerLeave\",\n            dependencies: [ \"pointerout\", \"pointerover\" ]\n        }\n    }, hd = {\n        eventTypes: gd,\n        extractEvents: function(a, b, c, d) {\n            var e = \"mouseover\" === a || \"pointerover\" === a, f = \"mouseout\" === a || \"pointerout\" === a;\n            if (e && (c.relatedTarget || c.fromElement) || !f && !e) return null;\n            if (e = d.window === d ? d : (e = d.ownerDocument) ? e.defaultView || e.parentWindow : window, \n            f ? (f = b, b = (b = c.relatedTarget || c.toElement) ? Na(b) : null) : f = null, \n            f === b) return null;\n            var g = void 0, h = void 0, k = void 0, n = void 0;\n            return \"mouseout\" === a || \"mouseover\" === a ? (g = ed, h = gd.mouseLeave, k = gd.mouseEnter, \n            n = \"mouse\") : \"pointerout\" !== a && \"pointerover\" !== a || (g = fd, h = gd.pointerLeave, \n            k = gd.pointerEnter, n = \"pointer\"), a = null == f ? e : Oa(f), e = null == b ? e : Oa(b), \n            h = g.getPooled(h, f, c, d), h.type = n + \"leave\", h.target = a, h.relatedTarget = e, \n            c = g.getPooled(k, b, c, d), c.type = n + \"enter\", c.target = e, c.relatedTarget = a, \n            Za(h, c, f, b), [ h, c ];\n        }\n    }, nd = H.extend({\n        animationName: null,\n        elapsedTime: null,\n        pseudoElement: null\n    }), od = H.extend({\n        clipboardData: function(a) {\n            return \"clipboardData\" in a ? a.clipboardData : window.clipboardData;\n        }\n    }), pd = ad.extend({\n        relatedTarget: null\n    }), rd = {\n        Esc: \"Escape\",\n        Spacebar: \" \",\n        Left: \"ArrowLeft\",\n        Up: \"ArrowUp\",\n        Right: \"ArrowRight\",\n        Down: \"ArrowDown\",\n        Del: \"Delete\",\n        Win: \"OS\",\n        Menu: \"ContextMenu\",\n        Apps: \"ContextMenu\",\n        Scroll: \"ScrollLock\",\n        MozPrintableKey: \"Unidentified\"\n    }, sd = {\n        8: \"Backspace\",\n        9: \"Tab\",\n        12: \"Clear\",\n        13: \"Enter\",\n        16: \"Shift\",\n        17: \"Control\",\n        18: \"Alt\",\n        19: \"Pause\",\n        20: \"CapsLock\",\n        27: \"Escape\",\n        32: \" \",\n        33: \"PageUp\",\n        34: \"PageDown\",\n        35: \"End\",\n        36: \"Home\",\n        37: \"ArrowLeft\",\n        38: \"ArrowUp\",\n        39: \"ArrowRight\",\n        40: \"ArrowDown\",\n        45: \"Insert\",\n        46: \"Delete\",\n        112: \"F1\",\n        113: \"F2\",\n        114: \"F3\",\n        115: \"F4\",\n        116: \"F5\",\n        117: \"F6\",\n        118: \"F7\",\n        119: \"F8\",\n        120: \"F9\",\n        121: \"F10\",\n        122: \"F11\",\n        123: \"F12\",\n        144: \"NumLock\",\n        145: \"ScrollLock\",\n        224: \"Meta\"\n    }, td = ad.extend({\n        key: function(a) {\n            if (a.key) {\n                var b = rd[a.key] || a.key;\n                if (\"Unidentified\" !== b) return b;\n            }\n            return \"keypress\" === a.type ? (a = qd(a), 13 === a ? \"Enter\" : String.fromCharCode(a)) : \"keydown\" === a.type || \"keyup\" === a.type ? sd[a.keyCode] || \"Unidentified\" : \"\";\n        },\n        location: null,\n        ctrlKey: null,\n        shiftKey: null,\n        altKey: null,\n        metaKey: null,\n        repeat: null,\n        locale: null,\n        getModifierState: dd,\n        charCode: function(a) {\n            return \"keypress\" === a.type ? qd(a) : 0;\n        },\n        keyCode: function(a) {\n            return \"keydown\" === a.type || \"keyup\" === a.type ? a.keyCode : 0;\n        },\n        which: function(a) {\n            return \"keypress\" === a.type ? qd(a) : \"keydown\" === a.type || \"keyup\" === a.type ? a.keyCode : 0;\n        }\n    }), ud = ed.extend({\n        dataTransfer: null\n    }), vd = ad.extend({\n        touches: null,\n        targetTouches: null,\n        changedTouches: null,\n        altKey: null,\n        metaKey: null,\n        ctrlKey: null,\n        shiftKey: null,\n        getModifierState: dd\n    }), wd = H.extend({\n        propertyName: null,\n        elapsedTime: null,\n        pseudoElement: null\n    }), xd = ed.extend({\n        deltaX: function(a) {\n            return \"deltaX\" in a ? a.deltaX : \"wheelDeltaX\" in a ? -a.wheelDeltaX : 0;\n        },\n        deltaY: function(a) {\n            return \"deltaY\" in a ? a.deltaY : \"wheelDeltaY\" in a ? -a.wheelDeltaY : \"wheelDelta\" in a ? -a.wheelDelta : 0;\n        },\n        deltaZ: null,\n        deltaMode: null\n    }), yd = [ [ \"abort\", \"abort\" ], [ fb, \"animationEnd\" ], [ gb, \"animationIteration\" ], [ hb, \"animationStart\" ], [ \"canplay\", \"canPlay\" ], [ \"canplaythrough\", \"canPlayThrough\" ], [ \"drag\", \"drag\" ], [ \"dragenter\", \"dragEnter\" ], [ \"dragexit\", \"dragExit\" ], [ \"dragleave\", \"dragLeave\" ], [ \"dragover\", \"dragOver\" ], [ \"durationchange\", \"durationChange\" ], [ \"emptied\", \"emptied\" ], [ \"encrypted\", \"encrypted\" ], [ \"ended\", \"ended\" ], [ \"error\", \"error\" ], [ \"gotpointercapture\", \"gotPointerCapture\" ], [ \"load\", \"load\" ], [ \"loadeddata\", \"loadedData\" ], [ \"loadedmetadata\", \"loadedMetadata\" ], [ \"loadstart\", \"loadStart\" ], [ \"lostpointercapture\", \"lostPointerCapture\" ], [ \"mousemove\", \"mouseMove\" ], [ \"mouseout\", \"mouseOut\" ], [ \"mouseover\", \"mouseOver\" ], [ \"playing\", \"playing\" ], [ \"pointermove\", \"pointerMove\" ], [ \"pointerout\", \"pointerOut\" ], [ \"pointerover\", \"pointerOver\" ], [ \"progress\", \"progress\" ], [ \"scroll\", \"scroll\" ], [ \"seeking\", \"seeking\" ], [ \"stalled\", \"stalled\" ], [ \"suspend\", \"suspend\" ], [ \"timeupdate\", \"timeUpdate\" ], [ \"toggle\", \"toggle\" ], [ \"touchmove\", \"touchMove\" ], [ ib, \"transitionEnd\" ], [ \"waiting\", \"waiting\" ], [ \"wheel\", \"wheel\" ] ], zd = {}, Ad = {};\n    [ [ \"blur\", \"blur\" ], [ \"cancel\", \"cancel\" ], [ \"click\", \"click\" ], [ \"close\", \"close\" ], [ \"contextmenu\", \"contextMenu\" ], [ \"copy\", \"copy\" ], [ \"cut\", \"cut\" ], [ \"dblclick\", \"doubleClick\" ], [ \"dragend\", \"dragEnd\" ], [ \"dragstart\", \"dragStart\" ], [ \"drop\", \"drop\" ], [ \"focus\", \"focus\" ], [ \"input\", \"input\" ], [ \"invalid\", \"invalid\" ], [ \"keydown\", \"keyDown\" ], [ \"keypress\", \"keyPress\" ], [ \"keyup\", \"keyUp\" ], [ \"mousedown\", \"mouseDown\" ], [ \"mouseup\", \"mouseUp\" ], [ \"paste\", \"paste\" ], [ \"pause\", \"pause\" ], [ \"play\", \"play\" ], [ \"pointercancel\", \"pointerCancel\" ], [ \"pointerdown\", \"pointerDown\" ], [ \"pointerup\", \"pointerUp\" ], [ \"ratechange\", \"rateChange\" ], [ \"reset\", \"reset\" ], [ \"seeked\", \"seeked\" ], [ \"submit\", \"submit\" ], [ \"touchcancel\", \"touchCancel\" ], [ \"touchend\", \"touchEnd\" ], [ \"touchstart\", \"touchStart\" ], [ \"volumechange\", \"volumeChange\" ] ].forEach(function(a) {\n        Bd(a, !0);\n    }), yd.forEach(function(a) {\n        Bd(a, !1);\n    });\n    var Cd = {\n        eventTypes: zd,\n        isInteractiveTopLevelEventType: function(a) {\n            return void 0 !== (a = Ad[a]) && !0 === a.isInteractive;\n        },\n        extractEvents: function(a, b, c, d) {\n            var e = Ad[a];\n            if (!e) return null;\n            switch (a) {\n              case \"keypress\":\n                if (0 === qd(c)) return null;\n\n              case \"keydown\":\n              case \"keyup\":\n                a = td;\n                break;\n\n              case \"blur\":\n              case \"focus\":\n                a = pd;\n                break;\n\n              case \"click\":\n                if (2 === c.button) return null;\n\n              case \"dblclick\":\n              case \"mousedown\":\n              case \"mousemove\":\n              case \"mouseup\":\n              case \"mouseout\":\n              case \"mouseover\":\n              case \"contextmenu\":\n                a = ed;\n                break;\n\n              case \"drag\":\n              case \"dragend\":\n              case \"dragenter\":\n              case \"dragexit\":\n              case \"dragleave\":\n              case \"dragover\":\n              case \"dragstart\":\n              case \"drop\":\n                a = ud;\n                break;\n\n              case \"touchcancel\":\n              case \"touchend\":\n              case \"touchmove\":\n              case \"touchstart\":\n                a = vd;\n                break;\n\n              case fb:\n              case gb:\n              case hb:\n                a = nd;\n                break;\n\n              case ib:\n                a = wd;\n                break;\n\n              case \"scroll\":\n                a = ad;\n                break;\n\n              case \"wheel\":\n                a = xd;\n                break;\n\n              case \"copy\":\n              case \"cut\":\n              case \"paste\":\n                a = od;\n                break;\n\n              case \"gotpointercapture\":\n              case \"lostpointercapture\":\n              case \"pointercancel\":\n              case \"pointerdown\":\n              case \"pointermove\":\n              case \"pointerout\":\n              case \"pointerover\":\n              case \"pointerup\":\n                a = fd;\n                break;\n\n              default:\n                a = H;\n            }\n            return b = a.getPooled(e, b, c, d), Ya(b), b;\n        }\n    }, Dd = Cd.isInteractiveTopLevelEventType, Ed = [], Gd = !0, Md = {\n        get _enabled() {\n            return Gd;\n        },\n        setEnabled: Id,\n        isEnabled: function() {\n            return Gd;\n        },\n        trapBubbledEvent: L,\n        trapCapturedEvent: Ld,\n        dispatchEvent: Kd\n    }, Nd = {}, Od = 0, Pd = \"_reactListenersID\" + (\"\" + Math.random()).slice(2), Ud = m.canUseDOM && \"documentMode\" in document && 11 >= document.documentMode, Vd = {\n        select: {\n            phasedRegistrationNames: {\n                bubbled: \"onSelect\",\n                captured: \"onSelectCapture\"\n            },\n            dependencies: \"blur contextmenu focus keydown keyup mousedown mouseup selectionchange\".split(\" \")\n        }\n    }, Wd = null, Xd = null, Yd = null, Zd = !1, ae = {\n        eventTypes: Vd,\n        extractEvents: function(a, b, c, d) {\n            var f, e = d.window === d ? d.document : 9 === d.nodeType ? d : d.ownerDocument;\n            if (!(f = !e)) {\n                a: {\n                    e = Qd(e), f = sa.onSelect;\n                    for (var g = 0; g < f.length; g++) {\n                        var h = f[g];\n                        if (!e.hasOwnProperty(h) || !e[h]) {\n                            e = !1;\n                            break a;\n                        }\n                    }\n                    e = !0;\n                }\n                f = !e;\n            }\n            if (f) return null;\n            switch (e = b ? Oa(b) : window, a) {\n              case \"focus\":\n                (Yb(e) || \"true\" === e.contentEditable) && (Wd = e, Xd = b, Yd = null);\n                break;\n\n              case \"blur\":\n                Yd = Xd = Wd = null;\n                break;\n\n              case \"mousedown\":\n                Zd = !0;\n                break;\n\n              case \"contextmenu\":\n              case \"mouseup\":\n                return Zd = !1, $d(c, d);\n\n              case \"selectionchange\":\n                if (Ud) break;\n\n              case \"keydown\":\n              case \"keyup\":\n                return $d(c, d);\n            }\n            return null;\n        }\n    };\n    Ga.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \")), \n    wa = Qa.getFiberCurrentPropsFromNode, xa = Qa.getInstanceFromNode, ya = Qa.getNodeFromInstance, \n    Ga.injectEventPluginsByName({\n        SimpleEventPlugin: Cd,\n        EnterLeaveEventPlugin: hd,\n        ChangeEventPlugin: $c,\n        SelectEventPlugin: ae,\n        BeforeInputEventPlugin: Ib\n    });\n    var be = void 0;\n    be = \"object\" == typeof performance && \"function\" == typeof performance.now ? function() {\n        return performance.now();\n    } : function() {\n        return Date.now();\n    };\n    var ce = void 0, de = void 0;\n    if (m.canUseDOM) {\n        var ee = [], fe = 0, ge = {}, he = -1, ie = !1, je = !1, ke = 0, le = 33, me = 33, ne = {\n            didTimeout: !1,\n            timeRemaining: function() {\n                var a = ke - be();\n                return 0 < a ? a : 0;\n            }\n        }, oe = function(a, b) {\n            if (ge[b]) try {\n                a(ne);\n            } finally {\n                delete ge[b];\n            }\n        }, pe = \"__reactIdleCallback$\" + Math.random().toString(36).slice(2);\n        window.addEventListener(\"message\", function(a) {\n            if (a.source === window && a.data === pe && (ie = !1, 0 !== ee.length)) {\n                if (0 !== ee.length && (a = be(), !(-1 === he || he > a))) {\n                    he = -1, ne.didTimeout = !0;\n                    for (var b = 0, c = ee.length; b < c; b++) {\n                        var d = ee[b], e = d.timeoutTime;\n                        -1 !== e && e <= a ? oe(d.scheduledCallback, d.callbackId) : -1 !== e && (-1 === he || e < he) && (he = e);\n                    }\n                }\n                for (a = be(); 0 < ke - a && 0 < ee.length; ) a = ee.shift(), ne.didTimeout = !1, \n                oe(a.scheduledCallback, a.callbackId), a = be();\n                0 < ee.length && !je && (je = !0, requestAnimationFrame(qe));\n            }\n        }, !1);\n        var qe = function(a) {\n            je = !1;\n            var b = a - ke + me;\n            b < me && le < me ? (8 > b && (b = 8), me = b < le ? le : b) : le = b, ke = a + me, \n            ie || (ie = !0, window.postMessage(pe, \"*\"));\n        };\n        ce = function(a, b) {\n            var c = -1;\n            return null != b && \"number\" == typeof b.timeout && (c = be() + b.timeout), (-1 === he || -1 !== c && c < he) && (he = c), \n            fe++, b = fe, ee.push({\n                scheduledCallback: a,\n                callbackId: b,\n                timeoutTime: c\n            }), ge[b] = !0, je || (je = !0, requestAnimationFrame(qe)), b;\n        }, de = function(a) {\n            delete ge[a];\n        };\n    } else {\n        var re = 0, se = {};\n        ce = function(a) {\n            var b = re++, c = setTimeout(function() {\n                a({\n                    timeRemaining: function() {\n                        return 1 / 0;\n                    },\n                    didTimeout: !1\n                });\n            });\n            return se[b] = c, b;\n        }, de = function(a) {\n            var b = se[a];\n            delete se[a], clearTimeout(b);\n        };\n    }\n    var Be = {\n        html: \"http://www.w3.org/1999/xhtml\",\n        mathml: \"http://www.w3.org/1998/Math/MathML\",\n        svg: \"http://www.w3.org/2000/svg\"\n    }, Ee = void 0, Fe = function(a) {\n        return \"undefined\" != typeof MSApp && MSApp.execUnsafeLocalFunction ? function(b, c, d, e) {\n            MSApp.execUnsafeLocalFunction(function() {\n                return a(b, c);\n            });\n        } : a;\n    }(function(a, b) {\n        if (a.namespaceURI !== Be.svg || \"innerHTML\" in a) a.innerHTML = b; else {\n            for (Ee = Ee || document.createElement(\"div\"), Ee.innerHTML = \"<svg>\" + b + \"</svg>\", \n            b = Ee.firstChild; a.firstChild; ) a.removeChild(a.firstChild);\n            for (;b.firstChild; ) a.appendChild(b.firstChild);\n        }\n    }), He = {\n        animationIterationCount: !0,\n        borderImageOutset: !0,\n        borderImageSlice: !0,\n        borderImageWidth: !0,\n        boxFlex: !0,\n        boxFlexGroup: !0,\n        boxOrdinalGroup: !0,\n        columnCount: !0,\n        columns: !0,\n        flex: !0,\n        flexGrow: !0,\n        flexPositive: !0,\n        flexShrink: !0,\n        flexNegative: !0,\n        flexOrder: !0,\n        gridRow: !0,\n        gridRowEnd: !0,\n        gridRowSpan: !0,\n        gridRowStart: !0,\n        gridColumn: !0,\n        gridColumnEnd: !0,\n        gridColumnSpan: !0,\n        gridColumnStart: !0,\n        fontWeight: !0,\n        lineClamp: !0,\n        lineHeight: !0,\n        opacity: !0,\n        order: !0,\n        orphans: !0,\n        tabSize: !0,\n        widows: !0,\n        zIndex: !0,\n        zoom: !0,\n        fillOpacity: !0,\n        floodOpacity: !0,\n        stopOpacity: !0,\n        strokeDasharray: !0,\n        strokeDashoffset: !0,\n        strokeMiterlimit: !0,\n        strokeOpacity: !0,\n        strokeWidth: !0\n    }, Ie = [ \"Webkit\", \"ms\", \"Moz\", \"O\" ];\n    Object.keys(He).forEach(function(a) {\n        Ie.forEach(function(b) {\n            b = b + a.charAt(0).toUpperCase() + a.substring(1), He[b] = He[a];\n        });\n    });\n    var Ke = p({\n        menuitem: !0\n    }, {\n        area: !0,\n        base: !0,\n        br: !0,\n        col: !0,\n        embed: !0,\n        hr: !0,\n        img: !0,\n        input: !0,\n        keygen: !0,\n        link: !0,\n        meta: !0,\n        param: !0,\n        source: !0,\n        track: !0,\n        wbr: !0\n    }), Ne = v.thatReturns(\"\"), We = {\n        createElement: Pe,\n        createTextNode: Qe,\n        setInitialProperties: Re,\n        diffProperties: Se,\n        updateProperties: Te,\n        diffHydratedProperties: Ue,\n        diffHydratedText: Ve,\n        warnForUnmatchedText: function() {},\n        warnForDeletedHydratableElement: function() {},\n        warnForDeletedHydratableText: function() {},\n        warnForInsertedHydratedElement: function() {},\n        warnForInsertedHydratedText: function() {},\n        restoreControlledState: function(a, b, c) {\n            switch (b) {\n              case \"input\":\n                if (Jc(a, c), b = c.name, \"radio\" === c.type && null != b) {\n                    for (c = a; c.parentNode; ) c = c.parentNode;\n                    for (c = c.querySelectorAll(\"input[name=\" + JSON.stringify(\"\" + b) + '][type=\"radio\"]'), \n                    b = 0; b < c.length; b++) {\n                        var d = c[b];\n                        if (d !== a && d.form === a.form) {\n                            var e = Pa(d);\n                            e || A(\"90\"), dc(d), Jc(d, e);\n                        }\n                    }\n                }\n                break;\n\n              case \"textarea\":\n                ze(a, c);\n                break;\n\n              case \"select\":\n                null != (b = c.value) && ve(a, !!c.multiple, b, !1);\n            }\n        }\n    }, Xe = null, Ye = null, af = be, bf = ce, cf = de;\n    new Set();\n    var ff = [], gf = -1, jf = hf(ha), O = hf(!1), kf = ha, Bf = null, Cf = null, Hf = !1, Uf = hf(null), Vf = hf(null), Wf = hf(0), Zf = {}, $f = hf(Zf), ag = hf(Zf), bg = hf(Zf), lg = {\n        isMounted: function(a) {\n            return !!(a = a._reactInternalFiber) && 2 === id(a);\n        },\n        enqueueSetState: function(a, b, c) {\n            a = a._reactInternalFiber;\n            var d = ig();\n            d = jg(d, a);\n            var e = Kf(d);\n            e.payload = b, void 0 !== c && null !== c && (e.callback = c), Mf(a, e, d), kg(a, d);\n        },\n        enqueueReplaceState: function(a, b, c) {\n            a = a._reactInternalFiber;\n            var d = ig();\n            d = jg(d, a);\n            var e = Kf(d);\n            e.tag = 1, e.payload = b, void 0 !== c && null !== c && (e.callback = c), Mf(a, e, d), \n            kg(a, d);\n        },\n        enqueueForceUpdate: function(a, b) {\n            a = a._reactInternalFiber;\n            var c = ig();\n            c = jg(c, a);\n            var d = Kf(c);\n            d.tag = 2, void 0 !== b && null !== b && (d.callback = b), Mf(a, d, c), kg(a, c);\n        }\n    }, pg = Array.isArray, tg = sg(!0), ug = sg(!1), vg = null, wg = null, xg = !1, Pg = void 0, Qg = void 0, Rg = void 0;\n    Pg = function() {}, Qg = function(a, b, c) {\n        (b.updateQueue = c) && Lg(b);\n    }, Rg = function(a, b, c, d) {\n        c !== d && Lg(b);\n    };\n    var gh = af(), hh = 2, ih = gh, jh = 0, kh = 0, lh = !1, S = null, mh = null, T = 0, nh = -1, oh = !1, U = null, ph = !1, qh = !1, dh = null, Fh = null, V = null, Gh = 0, Hh = -1, W = !1, X = null, Y = 0, Ah = 0, Ih = !1, Jh = !1, Kh = null, Lh = null, Z = !1, Mh = !1, zh = !1, Nh = null, Ch = 1e3, Bh = 0, Oh = 1, gi = {\n        updateContainerAtExpirationTime: bi,\n        createContainer: function(a, b, c) {\n            return Af(a, b, c);\n        },\n        updateContainer: di,\n        flushRoot: Wh,\n        requestWork: wh,\n        computeUniqueAsyncExpiration: yh,\n        batchedUpdates: Yh,\n        unbatchedUpdates: Zh,\n        deferredUpdates: Dh,\n        syncUpdates: Eh,\n        interactiveUpdates: function(a, b, c) {\n            if (zh) return a(b, c);\n            Z || W || 0 === Ah || (Uh(Ah, !1, null), Ah = 0);\n            var d = zh, e = Z;\n            Z = zh = !0;\n            try {\n                return a(b, c);\n            } finally {\n                zh = d, (Z = e) || W || Sh();\n            }\n        },\n        flushInteractiveUpdates: function() {\n            W || 0 === Ah || (Uh(Ah, !1, null), Ah = 0);\n        },\n        flushControlled: ai,\n        flushSync: $h,\n        getPublicRootInstance: ei,\n        findHostInstance: ci,\n        findHostInstanceWithNoPortals: function(a) {\n            return a = md(a), null === a ? null : a.stateNode;\n        },\n        injectIntoDevTools: fi\n    };\n    Kb.injectFiberControlledHostComponent(We), ji.prototype.render = function(a) {\n        this._defer || A(\"250\"), this._hasChildren = !0, this._children = a;\n        var b = this._root._internalRoot, c = this._expirationTime, d = new ki();\n        return bi(a, b, null, c, d._onCommit), d;\n    }, ji.prototype.then = function(a) {\n        if (this._didComplete) a(); else {\n            var b = this._callbacks;\n            null === b && (b = this._callbacks = []), b.push(a);\n        }\n    }, ji.prototype.commit = function() {\n        var a = this._root._internalRoot, b = a.firstBatch;\n        if (this._defer && null !== b || A(\"251\"), this._hasChildren) {\n            var c = this._expirationTime;\n            if (b !== this) {\n                this._hasChildren && (c = this._expirationTime = b._expirationTime, this.render(this._children));\n                for (var d = null, e = b; e !== this; ) d = e, e = e._next;\n                null === d && A(\"251\"), d._next = e._next, this._next = b, a.firstBatch = this;\n            }\n            this._defer = !1, Wh(a, c), b = this._next, this._next = null, b = a.firstBatch = b, \n            null !== b && b._hasChildren && b.render(b._children);\n        } else this._next = null, this._defer = !1;\n    }, ji.prototype._onComplete = function() {\n        if (!this._didComplete) {\n            this._didComplete = !0;\n            var a = this._callbacks;\n            if (null !== a) for (var b = 0; b < a.length; b++) (0, a[b])();\n        }\n    }, ki.prototype.then = function(a) {\n        if (this._didCommit) a(); else {\n            var b = this._callbacks;\n            null === b && (b = this._callbacks = []), b.push(a);\n        }\n    }, ki.prototype._onCommit = function() {\n        if (!this._didCommit) {\n            this._didCommit = !0;\n            var a = this._callbacks;\n            if (null !== a) for (var b = 0; b < a.length; b++) {\n                var c = a[b];\n                \"function\" != typeof c && A(\"191\", c), c();\n            }\n        }\n    }, li.prototype.render = function(a, b) {\n        var c = this._internalRoot, d = new ki();\n        return b = void 0 === b ? null : b, null !== b && d.then(b), di(a, c, null, d._onCommit), \n        d;\n    }, li.prototype.unmount = function(a) {\n        var b = this._internalRoot, c = new ki();\n        return a = void 0 === a ? null : a, null !== a && c.then(a), di(null, b, null, c._onCommit), \n        c;\n    }, li.prototype.legacy_renderSubtreeIntoContainer = function(a, b, c) {\n        var d = this._internalRoot, e = new ki();\n        return c = void 0 === c ? null : c, null !== c && e.then(c), di(b, d, a, e._onCommit), \n        e;\n    }, li.prototype.createBatch = function() {\n        var a = new ji(this), b = a._expirationTime, c = this._internalRoot, d = c.firstBatch;\n        if (null === d) c.firstBatch = a, a._next = null; else {\n            for (c = null; null !== d && d._expirationTime <= b; ) c = d, d = d._next;\n            a._next = d, null !== c && (c._next = a);\n        }\n        return a;\n    }, Sb = gi.batchedUpdates, Tb = gi.interactiveUpdates, Ub = gi.flushInteractiveUpdates;\n    var qi = {\n        createPortal: pi,\n        findDOMNode: function(a) {\n            return null == a ? null : 1 === a.nodeType ? a : ci(a);\n        },\n        hydrate: function(a, b, c) {\n            return oi(null, a, b, !0, c);\n        },\n        render: function(a, b, c) {\n            return oi(null, a, b, !1, c);\n        },\n        unstable_renderSubtreeIntoContainer: function(a, b, c, d) {\n            return (null == a || void 0 === a._reactInternalFiber) && A(\"38\"), oi(a, b, c, !1, d);\n        },\n        unmountComponentAtNode: function(a) {\n            return mi(a) || A(\"40\"), !!a._reactRootContainer && (Zh(function() {\n                oi(null, null, a, !1, function() {\n                    a._reactRootContainer = null;\n                });\n            }), !0);\n        },\n        unstable_createPortal: function() {\n            return pi.apply(void 0, arguments);\n        },\n        unstable_batchedUpdates: Yh,\n        unstable_deferredUpdates: Dh,\n        flushSync: $h,\n        unstable_flushControlled: ai,\n        __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n            EventPluginHub: Ka,\n            EventPluginRegistry: va,\n            EventPropagators: $a,\n            ReactControlledComponent: Rb,\n            ReactDOMComponentTree: Qa,\n            ReactDOMEventListener: Md\n        },\n        unstable_createRoot: function(a, b) {\n            return new li(a, !0, null != b && !0 === b.hydrate);\n        }\n    };\n    fi({\n        findFiberByHostInstance: Na,\n        bundleType: 0,\n        version: \"16.4.0\",\n        rendererPackageName: \"react-dom\"\n    });\n    var vi = {\n        default: qi\n    }, wi = vi && qi || vi;\n    module.exports = wi.default ? wi.default : wi;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function isTextNode(object) {\n        return isNode(object) && 3 == object.nodeType;\n    }\n    var isNode = __webpack_require__(380);\n    module.exports = isTextNode;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function isNode(object) {\n        var doc = object ? object.ownerDocument || object : document, defaultView = doc.defaultView || window;\n        return !(!object || !(\"function\" == typeof defaultView.Node ? object instanceof defaultView.Node : \"object\" == typeof object && \"number\" == typeof object.nodeType && \"string\" == typeof object.nodeName));\n    }\n    module.exports = isNode;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        \"production\" !== process.env.NODE_ENV && function() {\n            function recomputePluginOrdering() {\n                if (eventPluginOrder) for (var pluginName in namesToPlugins) {\n                    var pluginModule = namesToPlugins[pluginName], pluginIndex = eventPluginOrder.indexOf(pluginName);\n                    if (pluginIndex > -1 || invariant(!1, \"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `)) + (\"`\" + (`%s` + \"`\"))) + ((`.\", pluginName), \n                    !plugins[pluginIndex]) {\n                        pluginModule.extractEvents || invariant(!1, \"EventPluginRegistry: Event plugins must implement an ` + (\"`\" + `extractEvents`)) + (\"`\" + (` method, but ` + \"`\"))))) + ((((`%s` + (\"`\" + ` does not.\", pluginName), \n                        plugins[pluginIndex] = pluginModule;\n                        var publishedEvents = pluginModule.eventTypes;\n                        for (var eventName in publishedEvents) publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) || invariant(!1, \"EventPluginRegistry: Failed to publish event `)) + (\"`\" + (`%s` + \"`\"))) + ((` for plugin ` + (\"`\" + `%s`)) + (\"`\" + (`.\", eventName, pluginName);\n                    }\n                }\n            }\n            function publishEventForPlugin(dispatchConfig, pluginModule, eventName) {\n                eventNameDispatchConfigs.hasOwnProperty(eventName) && invariant(!1, \"EventPluginHub: More than one plugin attempted to publish the same event name, ` + \"`\")))) + (((`%s` + (\"`\" + `.\", eventName), \n                eventNameDispatchConfigs[eventName] = dispatchConfig;\n                var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n                if (phasedRegistrationNames) {\n                    for (var phaseName in phasedRegistrationNames) if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n                        var phasedRegistrationName = phasedRegistrationNames[phaseName];\n                        publishRegistrationName(phasedRegistrationName, pluginModule, eventName);\n                    }\n                    return !0;\n                }\n                return !!dispatchConfig.registrationName && (publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName), \n                !0);\n            }\n            function publishRegistrationName(registrationName, pluginModule, eventName) {\n                registrationNameModules[registrationName] && invariant(!1, \"EventPluginHub: More than one plugin attempted to publish the same registration name, `)) + (\"`\" + (`%s` + \"`\"))) + ((`.\", registrationName), \n                registrationNameModules[registrationName] = pluginModule, registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;\n                var lowerCasedName = registrationName.toLowerCase();\n                possibleRegistrationNames[lowerCasedName] = registrationName, \"onDoubleClick\" === registrationName && (possibleRegistrationNames.ondblclick = registrationName);\n            }\n            function injectEventPluginOrder(injectedEventPluginOrder) {\n                eventPluginOrder && invariant(!1, \"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.\"), \n                eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder), recomputePluginOrdering();\n            }\n            function injectEventPluginsByName(injectedNamesToPlugins) {\n                var isOrderingDirty = !1;\n                for (var pluginName in injectedNamesToPlugins) if (injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n                    var pluginModule = injectedNamesToPlugins[pluginName];\n                    namesToPlugins.hasOwnProperty(pluginName) && namesToPlugins[pluginName] === pluginModule || (namesToPlugins[pluginName] && invariant(!1, \"EventPluginRegistry: Cannot inject two different event plugins using the same name, ` + (\"`\" + `%s`)) + (\"`\" + (`.\", pluginName), \n                    namesToPlugins[pluginName] = pluginModule, isOrderingDirty = !0);\n                }\n                isOrderingDirty && recomputePluginOrdering();\n            }\n            function executeDispatch(event, simulated, listener, inst) {\n                var type = event.type || \"unknown-event\";\n                event.currentTarget = getNodeFromInstance(inst), ReactErrorUtils.invokeGuardedCallbackAndCatchFirstError(type, listener, void 0, event), \n                event.currentTarget = null;\n            }\n            function executeDispatchesInOrder(event, simulated) {\n                var dispatchListeners = event._dispatchListeners, dispatchInstances = event._dispatchInstances;\n                if (validateEventDispatches(event), Array.isArray(dispatchListeners)) for (var i = 0; i < dispatchListeners.length && !event.isPropagationStopped(); i++) executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]); else dispatchListeners && executeDispatch(event, simulated, dispatchListeners, dispatchInstances);\n                event._dispatchListeners = null, event._dispatchInstances = null;\n            }\n            function accumulateInto(current, next) {\n                return null == next && invariant(!1, \"accumulateInto(...): Accumulated items must not be null or undefined.\"), \n                null == current ? next : Array.isArray(current) ? Array.isArray(next) ? (current.push.apply(current, next), \n                current) : (current.push(next), current) : Array.isArray(next) ? [ current ].concat(next) : [ current, next ];\n            }\n            function forEachAccumulated(arr, cb, scope) {\n                Array.isArray(arr) ? arr.forEach(cb, scope) : arr && cb.call(scope, arr);\n            }\n            function isInteractive(tag) {\n                return \"button\" === tag || \"input\" === tag || \"select\" === tag || \"textarea\" === tag;\n            }\n            function shouldPreventMouseEvent(name, type, props) {\n                switch (name) {\n                  case \"onClick\":\n                  case \"onClickCapture\":\n                  case \"onDoubleClick\":\n                  case \"onDoubleClickCapture\":\n                  case \"onMouseDown\":\n                  case \"onMouseDownCapture\":\n                  case \"onMouseMove\":\n                  case \"onMouseMoveCapture\":\n                  case \"onMouseUp\":\n                  case \"onMouseUpCapture\":\n                    return !(!props.disabled || !isInteractive(type));\n\n                  default:\n                    return !1;\n                }\n            }\n            function getListener(inst, registrationName) {\n                var listener = void 0, stateNode = inst.stateNode;\n                if (!stateNode) return null;\n                var props = getFiberCurrentPropsFromNode(stateNode);\n                return props ? (listener = props[registrationName], shouldPreventMouseEvent(registrationName, inst.type, props) ? null : (listener && \"function\" != typeof listener && invariant(!1, \"Expected ` + \"`\")))))) + (((((`%s` + (\"`\" + ` listener to be a function, instead got a value of `)) + (\"`\" + (`%s` + \"`\"))) + ((` type.\", registrationName, typeof listener), \n                listener)) : null;\n            }\n            function extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                for (var events = null, i = 0; i < plugins.length; i++) {\n                    var possiblePlugin = plugins[i];\n                    if (possiblePlugin) {\n                        var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n                        extractedEvents && (events = accumulateInto(events, extractedEvents));\n                    }\n                }\n                return events;\n            }\n            function runEventsInBatch(events, simulated) {\n                null !== events && (eventQueue = accumulateInto(eventQueue, events));\n                var processingEventQueue = eventQueue;\n                eventQueue = null, processingEventQueue && (simulated ? forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated) : forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel), \n                eventQueue && invariant(!1, \"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.\"), \n                ReactErrorUtils.rethrowCaughtError());\n            }\n            function runExtractedEventsInBatch(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                runEventsInBatch(extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget), !1);\n            }\n            function precacheFiberNode(hostInst, node) {\n                node[internalInstanceKey] = hostInst;\n            }\n            function getClosestInstanceFromNode(node) {\n                if (node[internalInstanceKey]) return node[internalInstanceKey];\n                for (;!node[internalInstanceKey]; ) {\n                    if (!node.parentNode) return null;\n                    node = node.parentNode;\n                }\n                var inst = node[internalInstanceKey];\n                return inst.tag === HostComponent || inst.tag === HostText ? inst : null;\n            }\n            function getInstanceFromNode$1(node) {\n                var inst = node[internalInstanceKey];\n                return inst && (inst.tag === HostComponent || inst.tag === HostText) ? inst : null;\n            }\n            function getNodeFromInstance$1(inst) {\n                if (inst.tag === HostComponent || inst.tag === HostText) return inst.stateNode;\n                invariant(!1, \"getNodeFromInstance: Invalid argument.\");\n            }\n            function getFiberCurrentPropsFromNode$1(node) {\n                return node[internalEventHandlersKey] || null;\n            }\n            function updateFiberProps(node, props) {\n                node[internalEventHandlersKey] = props;\n            }\n            function getParent(inst) {\n                do {\n                    inst = inst.return;\n                } while (inst && inst.tag !== HostComponent);\n                return inst || null;\n            }\n            function getLowestCommonAncestor(instA, instB) {\n                for (var depthA = 0, tempA = instA; tempA; tempA = getParent(tempA)) depthA++;\n                for (var depthB = 0, tempB = instB; tempB; tempB = getParent(tempB)) depthB++;\n                for (;depthA - depthB > 0; ) instA = getParent(instA), depthA--;\n                for (;depthB - depthA > 0; ) instB = getParent(instB), depthB--;\n                for (var depth = depthA; depth--; ) {\n                    if (instA === instB || instA === instB.alternate) return instA;\n                    instA = getParent(instA), instB = getParent(instB);\n                }\n                return null;\n            }\n            function getParentInstance(inst) {\n                return getParent(inst);\n            }\n            function traverseTwoPhase(inst, fn, arg) {\n                for (var path = []; inst; ) path.push(inst), inst = getParent(inst);\n                var i = void 0;\n                for (i = path.length; i-- > 0; ) fn(path[i], \"captured\", arg);\n                for (i = 0; i < path.length; i++) fn(path[i], \"bubbled\", arg);\n            }\n            function traverseEnterLeave(from, to, fn, argFrom, argTo) {\n                for (var common = from && to ? getLowestCommonAncestor(from, to) : null, pathFrom = []; ;) {\n                    if (!from) break;\n                    if (from === common) break;\n                    var alternate = from.alternate;\n                    if (null !== alternate && alternate === common) break;\n                    pathFrom.push(from), from = getParent(from);\n                }\n                for (var pathTo = []; ;) {\n                    if (!to) break;\n                    if (to === common) break;\n                    var _alternate = to.alternate;\n                    if (null !== _alternate && _alternate === common) break;\n                    pathTo.push(to), to = getParent(to);\n                }\n                for (var i = 0; i < pathFrom.length; i++) fn(pathFrom[i], \"bubbled\", argFrom);\n                for (var _i = pathTo.length; _i-- > 0; ) fn(pathTo[_i], \"captured\", argTo);\n            }\n            function listenerAtPhase(inst, event, propagationPhase) {\n                return getListener(inst, event.dispatchConfig.phasedRegistrationNames[propagationPhase]);\n            }\n            function accumulateDirectionalDispatches(inst, phase, event) {\n                inst || warning(!1, \"Dispatching inst must not be null\");\n                var listener = listenerAtPhase(inst, event, phase);\n                listener && (event._dispatchListeners = accumulateInto(event._dispatchListeners, listener), \n                event._dispatchInstances = accumulateInto(event._dispatchInstances, inst));\n            }\n            function accumulateTwoPhaseDispatchesSingle(event) {\n                event && event.dispatchConfig.phasedRegistrationNames && traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);\n            }\n            function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {\n                if (event && event.dispatchConfig.phasedRegistrationNames) {\n                    var targetInst = event._targetInst;\n                    traverseTwoPhase(targetInst ? getParentInstance(targetInst) : null, accumulateDirectionalDispatches, event);\n                }\n            }\n            function accumulateDispatches(inst, ignoredDirection, event) {\n                if (inst && event && event.dispatchConfig.registrationName) {\n                    var registrationName = event.dispatchConfig.registrationName, listener = getListener(inst, registrationName);\n                    listener && (event._dispatchListeners = accumulateInto(event._dispatchListeners, listener), \n                    event._dispatchInstances = accumulateInto(event._dispatchInstances, inst));\n                }\n            }\n            function accumulateDirectDispatchesSingle(event) {\n                event && event.dispatchConfig.registrationName && accumulateDispatches(event._targetInst, null, event);\n            }\n            function accumulateTwoPhaseDispatches(events) {\n                forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n            }\n            function accumulateTwoPhaseDispatchesSkipTarget(events) {\n                forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);\n            }\n            function accumulateEnterLeaveDispatches(leave, enter, from, to) {\n                traverseEnterLeave(from, to, accumulateDispatches, leave, enter);\n            }\n            function accumulateDirectDispatches(events) {\n                forEachAccumulated(events, accumulateDirectDispatchesSingle);\n            }\n            function unsafeCastStringToDOMTopLevelType(topLevelType) {\n                return topLevelType;\n            }\n            function unsafeCastDOMTopLevelTypeToString(topLevelType) {\n                return topLevelType;\n            }\n            function makePrefixMap(styleProp, eventName) {\n                var prefixes = {};\n                return prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(), prefixes[\"Webkit\" + styleProp] = \"webkit\" + eventName, \n                prefixes[\"Moz\" + styleProp] = \"moz\" + eventName, prefixes[\"ms\" + styleProp] = \"MS\" + eventName, \n                prefixes[\"O\" + styleProp] = \"o\" + eventName.toLowerCase(), prefixes;\n            }\n            function getVendorPrefixedEventName(eventName) {\n                if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];\n                if (!vendorPrefixes[eventName]) return eventName;\n                var prefixMap = vendorPrefixes[eventName];\n                for (var styleProp in prefixMap) if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) return prefixedEventNames[eventName] = prefixMap[styleProp];\n                return eventName;\n            }\n            function getRawEventName(topLevelType) {\n                return unsafeCastDOMTopLevelTypeToString(topLevelType);\n            }\n            function getTextContentAccessor() {\n                return !contentKey && ExecutionEnvironment.canUseDOM && (contentKey = \"textContent\" in document.documentElement ? \"textContent\" : \"innerText\"), \n                contentKey;\n            }\n            function initialize(nativeEventTarget) {\n                return compositionState._root = nativeEventTarget, compositionState._startText = getText(), \n                !0;\n            }\n            function reset() {\n                compositionState._root = null, compositionState._startText = null, compositionState._fallbackText = null;\n            }\n            function getData() {\n                if (compositionState._fallbackText) return compositionState._fallbackText;\n                var start = void 0, startValue = compositionState._startText, startLength = startValue.length, end = void 0, endValue = getText(), endLength = endValue.length;\n                for (start = 0; start < startLength && startValue[start] === endValue[start]; start++) ;\n                var minEnd = startLength - start;\n                for (end = 1; end <= minEnd && startValue[startLength - end] === endValue[endLength - end]; end++) ;\n                var sliceTail = end > 1 ? 1 - end : void 0;\n                return compositionState._fallbackText = endValue.slice(start, sliceTail), compositionState._fallbackText;\n            }\n            function getText() {\n                return \"value\" in compositionState._root ? compositionState._root.value : compositionState._root[getTextContentAccessor()];\n            }\n            function SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {\n                delete this.nativeEvent, delete this.preventDefault, delete this.stopPropagation, \n                this.dispatchConfig = dispatchConfig, this._targetInst = targetInst, this.nativeEvent = nativeEvent;\n                var Interface = this.constructor.Interface;\n                for (var propName in Interface) if (Interface.hasOwnProperty(propName)) {\n                    delete this[propName];\n                    var normalize = Interface[propName];\n                    normalize ? this[propName] = normalize(nativeEvent) : \"target\" === propName ? this.target = nativeEventTarget : this[propName] = nativeEvent[propName];\n                }\n                var defaultPrevented = null != nativeEvent.defaultPrevented ? nativeEvent.defaultPrevented : !1 === nativeEvent.returnValue;\n                return this.isDefaultPrevented = defaultPrevented ? emptyFunction.thatReturnsTrue : emptyFunction.thatReturnsFalse, \n                this.isPropagationStopped = emptyFunction.thatReturnsFalse, this;\n            }\n            function getPooledWarningPropertyDefinition(propName, getVal) {\n                function set(val) {\n                    return warn(isFunction ? \"setting the method\" : \"setting the property\", \"This is effectively a no-op\"), \n                    val;\n                }\n                function get() {\n                    return warn(isFunction ? \"accessing the method\" : \"accessing the property\", isFunction ? \"This is a no-op function\" : \"This is set to null\"), \n                    getVal;\n                }\n                function warn(action, result) {\n                    warning(!1, \"This synthetic event is reused for performance reasons. If you're seeing this, you're %s ` + (\"`\" + `%s`)) + (\"`\" + (` on a released/nullified synthetic event. %s. If you must keep the original synthetic event around, use event.persist(). See https://fb.me/react-event-pooling for more information.\", action, propName, result);\n                }\n                var isFunction = \"function\" == typeof getVal;\n                return {\n                    configurable: !0,\n                    set: set,\n                    get: get\n                };\n            }\n            function getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {\n                var EventConstructor = this;\n                if (EventConstructor.eventPool.length) {\n                    var instance = EventConstructor.eventPool.pop();\n                    return EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst), \n                    instance;\n                }\n                return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);\n            }\n            function releasePooledEvent(event) {\n                var EventConstructor = this;\n                event instanceof EventConstructor || invariant(!1, \"Trying to release an event instance  into a pool of a different type.\"), \n                event.destructor(), EventConstructor.eventPool.length < EVENT_POOL_SIZE && EventConstructor.eventPool.push(event);\n            }\n            function addEventPoolingTo(EventConstructor) {\n                EventConstructor.eventPool = [], EventConstructor.getPooled = getPooledEvent, EventConstructor.release = releasePooledEvent;\n            }\n            function isKeypressCommand(nativeEvent) {\n                return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && !(nativeEvent.ctrlKey && nativeEvent.altKey);\n            }\n            function getCompositionEventType(topLevelType) {\n                switch (topLevelType) {\n                  case TOP_COMPOSITION_START:\n                    return eventTypes.compositionStart;\n\n                  case TOP_COMPOSITION_END:\n                    return eventTypes.compositionEnd;\n\n                  case TOP_COMPOSITION_UPDATE:\n                    return eventTypes.compositionUpdate;\n                }\n            }\n            function isFallbackCompositionStart(topLevelType, nativeEvent) {\n                return topLevelType === TOP_KEY_DOWN && nativeEvent.keyCode === START_KEYCODE;\n            }\n            function isFallbackCompositionEnd(topLevelType, nativeEvent) {\n                switch (topLevelType) {\n                  case TOP_KEY_UP:\n                    return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);\n\n                  case TOP_KEY_DOWN:\n                    return nativeEvent.keyCode !== START_KEYCODE;\n\n                  case TOP_KEY_PRESS:\n                  case TOP_MOUSE_DOWN:\n                  case TOP_BLUR:\n                    return !0;\n\n                  default:\n                    return !1;\n                }\n            }\n            function getDataFromCustomEvent(nativeEvent) {\n                var detail = nativeEvent.detail;\n                return \"object\" == typeof detail && \"data\" in detail ? detail.data : null;\n            }\n            function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                var eventType = void 0, fallbackData = void 0;\n                if (canUseCompositionEvent ? eventType = getCompositionEventType(topLevelType) : isComposing ? isFallbackCompositionEnd(topLevelType, nativeEvent) && (eventType = eventTypes.compositionEnd) : isFallbackCompositionStart(topLevelType, nativeEvent) && (eventType = eventTypes.compositionStart), \n                !eventType) return null;\n                useFallbackCompositionData && (isComposing || eventType !== eventTypes.compositionStart ? eventType === eventTypes.compositionEnd && isComposing && (fallbackData = getData()) : isComposing = initialize(nativeEventTarget));\n                var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);\n                if (fallbackData) event.data = fallbackData; else {\n                    var customData = getDataFromCustomEvent(nativeEvent);\n                    null !== customData && (event.data = customData);\n                }\n                return accumulateTwoPhaseDispatches(event), event;\n            }\n            function getNativeBeforeInputChars(topLevelType, nativeEvent) {\n                switch (topLevelType) {\n                  case TOP_COMPOSITION_END:\n                    return getDataFromCustomEvent(nativeEvent);\n\n                  case TOP_KEY_PRESS:\n                    return nativeEvent.which !== SPACEBAR_CODE ? null : (hasSpaceKeypress = !0, SPACEBAR_CHAR);\n\n                  case TOP_TEXT_INPUT:\n                    var chars = nativeEvent.data;\n                    return chars === SPACEBAR_CHAR && hasSpaceKeypress ? null : chars;\n\n                  default:\n                    return null;\n                }\n            }\n            function getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n                if (isComposing) {\n                    if (topLevelType === TOP_COMPOSITION_END || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n                        var chars = getData();\n                        return reset(), isComposing = !1, chars;\n                    }\n                    return null;\n                }\n                switch (topLevelType) {\n                  case TOP_PASTE:\n                    return null;\n\n                  case TOP_KEY_PRESS:\n                    if (!isKeypressCommand(nativeEvent)) {\n                        if (nativeEvent.char && nativeEvent.char.length > 1) return nativeEvent.char;\n                        if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);\n                    }\n                    return null;\n\n                  case TOP_COMPOSITION_END:\n                    return useFallbackCompositionData ? null : nativeEvent.data;\n\n                  default:\n                    return null;\n                }\n            }\n            function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                var chars = void 0;\n                if (!(chars = canUseTextInputEvent ? getNativeBeforeInputChars(topLevelType, nativeEvent) : getFallbackBeforeInputChars(topLevelType, nativeEvent))) return null;\n                var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);\n                return event.data = chars, accumulateTwoPhaseDispatches(event), event;\n            }\n            function restoreStateOfTarget(target) {\n                var internalInstance = getInstanceFromNode(target);\n                if (internalInstance) {\n                    fiberHostComponent && \"function\" == typeof fiberHostComponent.restoreControlledState || invariant(!1, \"Fiber needs to be injected to handle a fiber target for controlled events. This error is likely caused by a bug in React. Please file an issue.\");\n                    var props = getFiberCurrentPropsFromNode(internalInstance.stateNode);\n                    fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);\n                }\n            }\n            function enqueueStateRestore(target) {\n                restoreTarget ? restoreQueue ? restoreQueue.push(target) : restoreQueue = [ target ] : restoreTarget = target;\n            }\n            function needsStateRestore() {\n                return null !== restoreTarget || null !== restoreQueue;\n            }\n            function restoreStateIfNeeded() {\n                if (restoreTarget) {\n                    var target = restoreTarget, queuedTargets = restoreQueue;\n                    if (restoreTarget = null, restoreQueue = null, restoreStateOfTarget(target), queuedTargets) for (var i = 0; i < queuedTargets.length; i++) restoreStateOfTarget(queuedTargets[i]);\n                }\n            }\n            function batchedUpdates(fn, bookkeeping) {\n                if (isBatching) return fn(bookkeeping);\n                isBatching = !0;\n                try {\n                    return _batchedUpdates(fn, bookkeeping);\n                } finally {\n                    isBatching = !1;\n                    needsStateRestore() && (_flushInteractiveUpdates(), restoreStateIfNeeded());\n                }\n            }\n            function interactiveUpdates(fn, a, b) {\n                return _interactiveUpdates(fn, a, b);\n            }\n            function isTextInputElement(elem) {\n                var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n                return \"input\" === nodeName ? !!supportedInputTypes[elem.type] : \"textarea\" === nodeName;\n            }\n            function getEventTarget(nativeEvent) {\n                var target = nativeEvent.target || window;\n                return target.correspondingUseElement && (target = target.correspondingUseElement), \n                target.nodeType === TEXT_NODE ? target.parentNode : target;\n            }\n            function isEventSupported(eventNameSuffix, capture) {\n                if (!ExecutionEnvironment.canUseDOM || capture && !(\"addEventListener\" in document)) return !1;\n                var eventName = \"on\" + eventNameSuffix, isSupported = eventName in document;\n                if (!isSupported) {\n                    var element = document.createElement(\"div\");\n                    element.setAttribute(eventName, \"return;\"), isSupported = \"function\" == typeof element[eventName];\n                }\n                return isSupported;\n            }\n            function isCheckable(elem) {\n                var type = elem.type, nodeName = elem.nodeName;\n                return nodeName && \"input\" === nodeName.toLowerCase() && (\"checkbox\" === type || \"radio\" === type);\n            }\n            function getTracker(node) {\n                return node._valueTracker;\n            }\n            function detachTracker(node) {\n                node._valueTracker = null;\n            }\n            function getValueFromNode(node) {\n                var value = \"\";\n                return node ? value = isCheckable(node) ? node.checked ? \"true\" : \"false\" : node.value : value;\n            }\n            function trackValueOnNode(node) {\n                var valueField = isCheckable(node) ? \"checked\" : \"value\", descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField), currentValue = \"\" + node[valueField];\n                if (!node.hasOwnProperty(valueField) && void 0 !== descriptor && \"function\" == typeof descriptor.get && \"function\" == typeof descriptor.set) {\n                    var get = descriptor.get, set = descriptor.set;\n                    Object.defineProperty(node, valueField, {\n                        configurable: !0,\n                        get: function() {\n                            return get.call(this);\n                        },\n                        set: function(value) {\n                            currentValue = \"\" + value, set.call(this, value);\n                        }\n                    }), Object.defineProperty(node, valueField, {\n                        enumerable: descriptor.enumerable\n                    });\n                    return {\n                        getValue: function() {\n                            return currentValue;\n                        },\n                        setValue: function(value) {\n                            currentValue = \"\" + value;\n                        },\n                        stopTracking: function() {\n                            detachTracker(node), delete node[valueField];\n                        }\n                    };\n                }\n            }\n            function track(node) {\n                getTracker(node) || (node._valueTracker = trackValueOnNode(node));\n            }\n            function updateValueIfChanged(node) {\n                if (!node) return !1;\n                var tracker = getTracker(node);\n                if (!tracker) return !0;\n                var lastValue = tracker.getValue(), nextValue = getValueFromNode(node);\n                return nextValue !== lastValue && (tracker.setValue(nextValue), !0);\n            }\n            function getIteratorFn(maybeIterable) {\n                if (null === maybeIterable || void 0 === maybeIterable) return null;\n                var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n                return \"function\" == typeof maybeIterator ? maybeIterator : null;\n            }\n            function getComponentName(fiber) {\n                var type = fiber.type;\n                if (\"function\" == typeof type) return type.displayName || type.name;\n                if (\"string\" == typeof type) return type;\n                switch (type) {\n                  case REACT_ASYNC_MODE_TYPE:\n                    return \"AsyncMode\";\n\n                  case REACT_CONTEXT_TYPE:\n                    return \"Context.Consumer\";\n\n                  case REACT_FRAGMENT_TYPE:\n                    return \"ReactFragment\";\n\n                  case REACT_PORTAL_TYPE:\n                    return \"ReactPortal\";\n\n                  case REACT_PROFILER_TYPE:\n                    return \"Profiler(\" + fiber.pendingProps.id + \")\";\n\n                  case REACT_PROVIDER_TYPE:\n                    return \"Context.Provider\";\n\n                  case REACT_STRICT_MODE_TYPE:\n                    return \"StrictMode\";\n\n                  case REACT_TIMEOUT_TYPE:\n                    return \"Timeout\";\n                }\n                if (\"object\" == typeof type && null !== type) switch (type.$$typeof) {\n                  case REACT_FORWARD_REF_TYPE:\n                    var functionName = type.render.displayName || type.render.name || \"\";\n                    return \"\" !== functionName ? \"ForwardRef(\" + functionName + \")\" : \"ForwardRef\";\n                }\n                return null;\n            }\n            function describeFiber(fiber) {\n                switch (fiber.tag) {\n                  case IndeterminateComponent:\n                  case FunctionalComponent:\n                  case ClassComponent:\n                  case HostComponent:\n                    var owner = fiber._debugOwner, source = fiber._debugSource, name = getComponentName(fiber), ownerName = null;\n                    return owner && (ownerName = getComponentName(owner)), describeComponentFrame(name, source, ownerName);\n\n                  default:\n                    return \"\";\n                }\n            }\n            function getStackAddendumByWorkInProgressFiber(workInProgress) {\n                var info = \"\", node = workInProgress;\n                do {\n                    info += describeFiber(node), node = node.return;\n                } while (node);\n                return info;\n            }\n            function getCurrentFiberOwnerName$1() {\n                var fiber = ReactDebugCurrentFiber.current;\n                if (null === fiber) return null;\n                var owner = fiber._debugOwner;\n                return null !== owner && void 0 !== owner ? getComponentName(owner) : null;\n            }\n            function getCurrentFiberStackAddendum$1() {\n                var fiber = ReactDebugCurrentFiber.current;\n                return null === fiber ? null : getStackAddendumByWorkInProgressFiber(fiber);\n            }\n            function resetCurrentFiber() {\n                ReactDebugCurrentFrame.getCurrentStack = null, ReactDebugCurrentFiber.current = null, \n                ReactDebugCurrentFiber.phase = null;\n            }\n            function setCurrentFiber(fiber) {\n                ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackAddendum$1, ReactDebugCurrentFiber.current = fiber, \n                ReactDebugCurrentFiber.phase = null;\n            }\n            function setCurrentPhase(phase) {\n                ReactDebugCurrentFiber.phase = phase;\n            }\n            function isAttributeNameSafe(attributeName) {\n                return !!validatedAttributeNameCache.hasOwnProperty(attributeName) || !illegalAttributeNameCache.hasOwnProperty(attributeName) && (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName) ? (validatedAttributeNameCache[attributeName] = !0, \n                !0) : (illegalAttributeNameCache[attributeName] = !0, warning(!1, \"Invalid attribute name: ` + \"`\")))) + (((`%s` + (\"`\" + `\", attributeName), \n                !1));\n            }\n            function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {\n                return null !== propertyInfo ? propertyInfo.type === RESERVED : !isCustomComponentTag && (name.length > 2 && (\"o\" === name[0] || \"O\" === name[0]) && (\"n\" === name[1] || \"N\" === name[1]));\n            }\n            function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {\n                if (null !== propertyInfo && propertyInfo.type === RESERVED) return !1;\n                switch (typeof value) {\n                  case \"function\":\n                  case \"symbol\":\n                    return !0;\n\n                  case \"boolean\":\n                    if (isCustomComponentTag) return !1;\n                    if (null !== propertyInfo) return !propertyInfo.acceptsBooleans;\n                    var prefix = name.toLowerCase().slice(0, 5);\n                    return \"data-\" !== prefix && \"aria-\" !== prefix;\n\n                  default:\n                    return !1;\n                }\n            }\n            function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {\n                if (null === value || void 0 === value) return !0;\n                if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) return !0;\n                if (isCustomComponentTag) return !1;\n                if (null !== propertyInfo) switch (propertyInfo.type) {\n                  case BOOLEAN:\n                    return !value;\n\n                  case OVERLOADED_BOOLEAN:\n                    return !1 === value;\n\n                  case NUMERIC:\n                    return isNaN(value);\n\n                  case POSITIVE_NUMERIC:\n                    return isNaN(value) || value < 1;\n                }\n                return !1;\n            }\n            function getPropertyInfo(name) {\n                return properties.hasOwnProperty(name) ? properties[name] : null;\n            }\n            function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace) {\n                this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN, \n                this.attributeName = attributeName, this.attributeNamespace = attributeNamespace, \n                this.mustUseProperty = mustUseProperty, this.propertyName = name, this.type = type;\n            }\n            function getValueForProperty(node, name, expected, propertyInfo) {\n                if (propertyInfo.mustUseProperty) {\n                    return node[propertyInfo.propertyName];\n                }\n                var attributeName = propertyInfo.attributeName, stringValue = null;\n                if (propertyInfo.type === OVERLOADED_BOOLEAN) {\n                    if (node.hasAttribute(attributeName)) {\n                        var value = node.getAttribute(attributeName);\n                        return \"\" === value || (shouldRemoveAttribute(name, expected, propertyInfo, !1) ? value : value === \"\" + expected ? expected : value);\n                    }\n                } else if (node.hasAttribute(attributeName)) {\n                    if (shouldRemoveAttribute(name, expected, propertyInfo, !1)) return node.getAttribute(attributeName);\n                    if (propertyInfo.type === BOOLEAN) return expected;\n                    stringValue = node.getAttribute(attributeName);\n                }\n                return shouldRemoveAttribute(name, expected, propertyInfo, !1) ? null === stringValue ? expected : stringValue : stringValue === \"\" + expected ? expected : stringValue;\n            }\n            function getValueForAttribute(node, name, expected) {\n                if (isAttributeNameSafe(name)) {\n                    if (!node.hasAttribute(name)) return void 0 === expected ? void 0 : null;\n                    var value = node.getAttribute(name);\n                    return value === \"\" + expected ? expected : value;\n                }\n            }\n            function setValueForProperty(node, name, value, isCustomComponentTag) {\n                var propertyInfo = getPropertyInfo(name);\n                if (!shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) && (value = null), \n                isCustomComponentTag || null === propertyInfo) {\n                    if (isAttributeNameSafe(name)) {\n                        var _attributeName = name;\n                        null === value ? node.removeAttribute(_attributeName) : node.setAttribute(_attributeName, \"\" + value);\n                    }\n                } else {\n                    var mustUseProperty = propertyInfo.mustUseProperty;\n                    if (mustUseProperty) {\n                        var propertyName = propertyInfo.propertyName;\n                        if (null === value) {\n                            var type = propertyInfo.type;\n                            node[propertyName] = type !== BOOLEAN && \"\";\n                        } else node[propertyName] = value;\n                    } else {\n                        var attributeName = propertyInfo.attributeName, attributeNamespace = propertyInfo.attributeNamespace;\n                        if (null === value) node.removeAttribute(attributeName); else {\n                            var _type = propertyInfo.type, attributeValue = void 0;\n                            attributeValue = _type === BOOLEAN || _type === OVERLOADED_BOOLEAN && !0 === value ? \"\" : \"\" + value, \n                            attributeNamespace ? node.setAttributeNS(attributeNamespace, attributeName, attributeValue) : node.setAttribute(attributeName, attributeValue);\n                        }\n                    }\n                }\n            }\n            function isControlled(props) {\n                return \"checkbox\" === props.type || \"radio\" === props.type ? null != props.checked : null != props.value;\n            }\n            function getHostProps(element, props) {\n                var node = element, checked = props.checked;\n                return _assign({}, props, {\n                    defaultChecked: void 0,\n                    defaultValue: void 0,\n                    value: void 0,\n                    checked: null != checked ? checked : node._wrapperState.initialChecked\n                });\n            }\n            function initWrapperState(element, props) {\n                ReactControlledValuePropTypes.checkPropTypes(\"input\", props, getCurrentFiberStackAddendum), \n                void 0 === props.checked || void 0 === props.defaultChecked || didWarnCheckedDefaultChecked || (warning(!1, \"%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components\", getCurrentFiberOwnerName() || \"A component\", props.type), \n                didWarnCheckedDefaultChecked = !0), void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue || (warning(!1, \"%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components\", getCurrentFiberOwnerName() || \"A component\", props.type), \n                didWarnValueDefaultValue = !0);\n                var node = element, defaultValue = null == props.defaultValue ? \"\" : props.defaultValue;\n                node._wrapperState = {\n                    initialChecked: null != props.checked ? props.checked : props.defaultChecked,\n                    initialValue: getSafeValue(null != props.value ? props.value : defaultValue),\n                    controlled: isControlled(props)\n                };\n            }\n            function updateChecked(element, props) {\n                var node = element, checked = props.checked;\n                null != checked && setValueForProperty(node, \"checked\", checked, !1);\n            }\n            function updateWrapper(element, props) {\n                var node = element, _controlled = isControlled(props);\n                node._wrapperState.controlled || !_controlled || didWarnUncontrolledToControlled || (warning(!1, \"A component is changing an uncontrolled input of type %s to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s\", props.type, getCurrentFiberStackAddendum()), \n                didWarnUncontrolledToControlled = !0), !node._wrapperState.controlled || _controlled || didWarnControlledToUncontrolled || (warning(!1, \"A component is changing a controlled input of type %s to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s\", props.type, getCurrentFiberStackAddendum()), \n                didWarnControlledToUncontrolled = !0), updateChecked(element, props);\n                var value = getSafeValue(props.value);\n                null != value && (\"number\" === props.type ? (0 === value && \"\" === node.value || node.value != value) && (node.value = \"\" + value) : node.value !== \"\" + value && (node.value = \"\" + value)), \n                props.hasOwnProperty(\"value\") ? setDefaultValue(node, props.type, value) : props.hasOwnProperty(\"defaultValue\") && setDefaultValue(node, props.type, getSafeValue(props.defaultValue)), \n                null == props.checked && null != props.defaultChecked && (node.defaultChecked = !!props.defaultChecked);\n            }\n            function postMountWrapper(element, props) {\n                var node = element;\n                (props.hasOwnProperty(\"value\") || props.hasOwnProperty(\"defaultValue\")) && (\"\" === node.value && (node.value = \"\" + node._wrapperState.initialValue), \n                node.defaultValue = \"\" + node._wrapperState.initialValue);\n                var name = node.name;\n                \"\" !== name && (node.name = \"\"), node.defaultChecked = !node.defaultChecked, node.defaultChecked = !node.defaultChecked, \n                \"\" !== name && (node.name = name);\n            }\n            function restoreControlledState(element, props) {\n                var node = element;\n                updateWrapper(node, props), updateNamedCousins(node, props);\n            }\n            function updateNamedCousins(rootNode, props) {\n                var name = props.name;\n                if (\"radio\" === props.type && null != name) {\n                    for (var queryRoot = rootNode; queryRoot.parentNode; ) queryRoot = queryRoot.parentNode;\n                    for (var group = queryRoot.querySelectorAll(\"input[name=\" + JSON.stringify(\"\" + name) + '][type=\"radio\"]'), i = 0; i < group.length; i++) {\n                        var otherNode = group[i];\n                        if (otherNode !== rootNode && otherNode.form === rootNode.form) {\n                            var otherProps = getFiberCurrentPropsFromNode$1(otherNode);\n                            otherProps || invariant(!1, \"ReactDOMInput: Mixing React and non-React radio inputs with the same `)) + (\"`\" + (`name` + \"`\"))) + ((` is not supported.\"), \n                            updateValueIfChanged(otherNode), updateWrapper(otherNode, otherProps);\n                        }\n                    }\n                }\n            }\n            function setDefaultValue(node, type, value) {\n                \"number\" === type && node.ownerDocument.activeElement === node || (null == value ? node.defaultValue = \"\" + node._wrapperState.initialValue : node.defaultValue !== \"\" + value && (node.defaultValue = \"\" + value));\n            }\n            function getSafeValue(value) {\n                switch (typeof value) {\n                  case \"boolean\":\n                  case \"number\":\n                  case \"object\":\n                  case \"string\":\n                  case \"undefined\":\n                    return value;\n\n                  default:\n                    return \"\";\n                }\n            }\n            function createAndAccumulateChangeEvent(inst, nativeEvent, target) {\n                var event = SyntheticEvent$1.getPooled(eventTypes$1.change, inst, nativeEvent, target);\n                return event.type = \"change\", enqueueStateRestore(target), accumulateTwoPhaseDispatches(event), \n                event;\n            }\n            function shouldUseChangeEvent(elem) {\n                var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n                return \"select\" === nodeName || \"input\" === nodeName && \"file\" === elem.type;\n            }\n            function manualDispatchChangeEvent(nativeEvent) {\n                batchedUpdates(runEventInBatch, createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)));\n            }\n            function runEventInBatch(event) {\n                runEventsInBatch(event, !1);\n            }\n            function getInstIfValueChanged(targetInst) {\n                if (updateValueIfChanged(getNodeFromInstance$1(targetInst))) return targetInst;\n            }\n            function getTargetInstForChangeEvent(topLevelType, targetInst) {\n                if (topLevelType === TOP_CHANGE) return targetInst;\n            }\n            function startWatchingForValueChange(target, targetInst) {\n                activeElement = target, activeElementInst = targetInst, activeElement.attachEvent(\"onpropertychange\", handlePropertyChange);\n            }\n            function stopWatchingForValueChange() {\n                activeElement && (activeElement.detachEvent(\"onpropertychange\", handlePropertyChange), \n                activeElement = null, activeElementInst = null);\n            }\n            function handlePropertyChange(nativeEvent) {\n                \"value\" === nativeEvent.propertyName && getInstIfValueChanged(activeElementInst) && manualDispatchChangeEvent(nativeEvent);\n            }\n            function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {\n                topLevelType === TOP_FOCUS ? (stopWatchingForValueChange(), startWatchingForValueChange(target, targetInst)) : topLevelType === TOP_BLUR && stopWatchingForValueChange();\n            }\n            function getTargetInstForInputEventPolyfill(topLevelType, targetInst) {\n                if (topLevelType === TOP_SELECTION_CHANGE || topLevelType === TOP_KEY_UP || topLevelType === TOP_KEY_DOWN) return getInstIfValueChanged(activeElementInst);\n            }\n            function shouldUseClickEvent(elem) {\n                var nodeName = elem.nodeName;\n                return nodeName && \"input\" === nodeName.toLowerCase() && (\"checkbox\" === elem.type || \"radio\" === elem.type);\n            }\n            function getTargetInstForClickEvent(topLevelType, targetInst) {\n                if (topLevelType === TOP_CLICK) return getInstIfValueChanged(targetInst);\n            }\n            function getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {\n                if (topLevelType === TOP_INPUT || topLevelType === TOP_CHANGE) return getInstIfValueChanged(targetInst);\n            }\n            function handleControlledInputBlur(inst, node) {\n                if (null != inst) {\n                    var state = inst._wrapperState || node._wrapperState;\n                    state && state.controlled && \"number\" === node.type && setDefaultValue(node, \"number\", node.value);\n                }\n            }\n            function modifierStateGetter(keyArg) {\n                var syntheticEvent = this, nativeEvent = syntheticEvent.nativeEvent;\n                if (nativeEvent.getModifierState) return nativeEvent.getModifierState(keyArg);\n                var keyProp = modifierKeyToProp[keyArg];\n                return !!keyProp && !!nativeEvent[keyProp];\n            }\n            function getEventModifierState(nativeEvent) {\n                return modifierStateGetter;\n            }\n            function get(key) {\n                return key._reactInternalFiber;\n            }\n            function has(key) {\n                return void 0 !== key._reactInternalFiber;\n            }\n            function set(key, value) {\n                key._reactInternalFiber = value;\n            }\n            function isFiberMountedImpl(fiber) {\n                var node = fiber;\n                if (fiber.alternate) for (;node.return; ) node = node.return; else {\n                    if ((node.effectTag & Placement) !== NoEffect) return MOUNTING;\n                    for (;node.return; ) if (node = node.return, (node.effectTag & Placement) !== NoEffect) return MOUNTING;\n                }\n                return node.tag === HostRoot ? MOUNTED : UNMOUNTED;\n            }\n            function isFiberMounted(fiber) {\n                return isFiberMountedImpl(fiber) === MOUNTED;\n            }\n            function isMounted(component) {\n                var owner = ReactCurrentOwner.current;\n                if (null !== owner && owner.tag === ClassComponent) {\n                    var ownerFiber = owner, instance = ownerFiber.stateNode;\n                    instance._warnedAboutRefsInRender || warning(!1, \"%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.\", getComponentName(ownerFiber) || \"A component\"), \n                    instance._warnedAboutRefsInRender = !0;\n                }\n                var fiber = get(component);\n                return !!fiber && isFiberMountedImpl(fiber) === MOUNTED;\n            }\n            function assertIsMounted(fiber) {\n                isFiberMountedImpl(fiber) !== MOUNTED && invariant(!1, \"Unable to find node on an unmounted component.\");\n            }\n            function findCurrentFiberUsingSlowPath(fiber) {\n                var alternate = fiber.alternate;\n                if (!alternate) {\n                    var state = isFiberMountedImpl(fiber);\n                    return state === UNMOUNTED && invariant(!1, \"Unable to find node on an unmounted component.\"), \n                    state === MOUNTING ? null : fiber;\n                }\n                for (var a = fiber, b = alternate; ;) {\n                    var parentA = a.return, parentB = parentA ? parentA.alternate : null;\n                    if (!parentA || !parentB) break;\n                    if (parentA.child === parentB.child) {\n                        for (var child = parentA.child; child; ) {\n                            if (child === a) return assertIsMounted(parentA), fiber;\n                            if (child === b) return assertIsMounted(parentA), alternate;\n                            child = child.sibling;\n                        }\n                        invariant(!1, \"Unable to find node on an unmounted component.\");\n                    }\n                    if (a.return !== b.return) a = parentA, b = parentB; else {\n                        for (var didFindChild = !1, _child = parentA.child; _child; ) {\n                            if (_child === a) {\n                                didFindChild = !0, a = parentA, b = parentB;\n                                break;\n                            }\n                            if (_child === b) {\n                                didFindChild = !0, b = parentA, a = parentB;\n                                break;\n                            }\n                            _child = _child.sibling;\n                        }\n                        if (!didFindChild) {\n                            for (_child = parentB.child; _child; ) {\n                                if (_child === a) {\n                                    didFindChild = !0, a = parentB, b = parentA;\n                                    break;\n                                }\n                                if (_child === b) {\n                                    didFindChild = !0, b = parentB, a = parentA;\n                                    break;\n                                }\n                                _child = _child.sibling;\n                            }\n                            didFindChild || invariant(!1, \"Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.\");\n                        }\n                    }\n                    a.alternate !== b && invariant(!1, \"Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n                return a.tag !== HostRoot && invariant(!1, \"Unable to find node on an unmounted component.\"), \n                a.stateNode.current === a ? fiber : alternate;\n            }\n            function findCurrentHostFiber(parent) {\n                var currentParent = findCurrentFiberUsingSlowPath(parent);\n                if (!currentParent) return null;\n                for (var node = currentParent; ;) {\n                    if (node.tag === HostComponent || node.tag === HostText) return node;\n                    if (node.child) node.child.return = node, node = node.child; else {\n                        if (node === currentParent) return null;\n                        for (;!node.sibling; ) {\n                            if (!node.return || node.return === currentParent) return null;\n                            node = node.return;\n                        }\n                        node.sibling.return = node.return, node = node.sibling;\n                    }\n                }\n                return null;\n            }\n            function findCurrentHostFiberWithNoPortals(parent) {\n                var currentParent = findCurrentFiberUsingSlowPath(parent);\n                if (!currentParent) return null;\n                for (var node = currentParent; ;) {\n                    if (node.tag === HostComponent || node.tag === HostText) return node;\n                    if (node.child && node.tag !== HostPortal) node.child.return = node, node = node.child; else {\n                        if (node === currentParent) return null;\n                        for (;!node.sibling; ) {\n                            if (!node.return || node.return === currentParent) return null;\n                            node = node.return;\n                        }\n                        node.sibling.return = node.return, node = node.sibling;\n                    }\n                }\n                return null;\n            }\n            function addEventBubbleListener(element, eventType, listener) {\n                element.addEventListener(eventType, listener, !1);\n            }\n            function addEventCaptureListener(element, eventType, listener) {\n                element.addEventListener(eventType, listener, !0);\n            }\n            function getEventCharCode(nativeEvent) {\n                var charCode = void 0, keyCode = nativeEvent.keyCode;\n                return \"charCode\" in nativeEvent ? 0 === (charCode = nativeEvent.charCode) && 13 === keyCode && (charCode = 13) : charCode = keyCode, \n                10 === charCode && (charCode = 13), charCode >= 32 || 13 === charCode ? charCode : 0;\n            }\n            function getEventKey(nativeEvent) {\n                if (nativeEvent.key) {\n                    var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n                    if (\"Unidentified\" !== key) return key;\n                }\n                if (\"keypress\" === nativeEvent.type) {\n                    var charCode = getEventCharCode(nativeEvent);\n                    return 13 === charCode ? \"Enter\" : String.fromCharCode(charCode);\n                }\n                return \"keydown\" === nativeEvent.type || \"keyup\" === nativeEvent.type ? translateToKey[nativeEvent.keyCode] || \"Unidentified\" : \"\";\n            }\n            function addEventTypeNameToConfig(_ref, isInteractive) {\n                var topEvent = _ref[0], event = _ref[1], capitalizedEvent = event[0].toUpperCase() + event.slice(1), onEvent = \"on\" + capitalizedEvent, type = {\n                    phasedRegistrationNames: {\n                        bubbled: onEvent,\n                        captured: onEvent + \"Capture\"\n                    },\n                    dependencies: [ topEvent ],\n                    isInteractive: isInteractive\n                };\n                eventTypes$4[event] = type, topLevelEventsToDispatchConfig[topEvent] = type;\n            }\n            function findRootContainerNode(inst) {\n                for (;inst.return; ) inst = inst.return;\n                return inst.tag !== HostRoot ? null : inst.stateNode.containerInfo;\n            }\n            function getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst) {\n                if (callbackBookkeepingPool.length) {\n                    var instance = callbackBookkeepingPool.pop();\n                    return instance.topLevelType = topLevelType, instance.nativeEvent = nativeEvent, \n                    instance.targetInst = targetInst, instance;\n                }\n                return {\n                    topLevelType: topLevelType,\n                    nativeEvent: nativeEvent,\n                    targetInst: targetInst,\n                    ancestors: []\n                };\n            }\n            function releaseTopLevelCallbackBookKeeping(instance) {\n                instance.topLevelType = null, instance.nativeEvent = null, instance.targetInst = null, \n                instance.ancestors.length = 0, callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE && callbackBookkeepingPool.push(instance);\n            }\n            function handleTopLevel(bookKeeping) {\n                var targetInst = bookKeeping.targetInst, ancestor = targetInst;\n                do {\n                    if (!ancestor) {\n                        bookKeeping.ancestors.push(ancestor);\n                        break;\n                    }\n                    var root = findRootContainerNode(ancestor);\n                    if (!root) break;\n                    bookKeeping.ancestors.push(ancestor), ancestor = getClosestInstanceFromNode(root);\n                } while (ancestor);\n                for (var i = 0; i < bookKeeping.ancestors.length; i++) targetInst = bookKeeping.ancestors[i], \n                runExtractedEventsInBatch(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));\n            }\n            function setEnabled(enabled) {\n                _enabled = !!enabled;\n            }\n            function isEnabled() {\n                return _enabled;\n            }\n            function trapBubbledEvent(topLevelType, element) {\n                if (!element) return null;\n                var dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent;\n                addEventBubbleListener(element, getRawEventName(topLevelType), dispatch.bind(null, topLevelType));\n            }\n            function trapCapturedEvent(topLevelType, element) {\n                if (!element) return null;\n                var dispatch = isInteractiveTopLevelEventType(topLevelType) ? dispatchInteractiveEvent : dispatchEvent;\n                addEventCaptureListener(element, getRawEventName(topLevelType), dispatch.bind(null, topLevelType));\n            }\n            function dispatchInteractiveEvent(topLevelType, nativeEvent) {\n                interactiveUpdates(dispatchEvent, topLevelType, nativeEvent);\n            }\n            function dispatchEvent(topLevelType, nativeEvent) {\n                if (_enabled) {\n                    var nativeEventTarget = getEventTarget(nativeEvent), targetInst = getClosestInstanceFromNode(nativeEventTarget);\n                    null === targetInst || \"number\" != typeof targetInst.tag || isFiberMounted(targetInst) || (targetInst = null);\n                    var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst);\n                    try {\n                        batchedUpdates(handleTopLevel, bookKeeping);\n                    } finally {\n                        releaseTopLevelCallbackBookKeeping(bookKeeping);\n                    }\n                }\n            }\n            function getListeningForDocument(mountAt) {\n                return Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey) || (mountAt[topListenersIDKey] = reactTopListenersCounter++, \n                alreadyListeningTo[mountAt[topListenersIDKey]] = {}), alreadyListeningTo[mountAt[topListenersIDKey]];\n            }\n            function listenTo(registrationName, mountAt) {\n                for (var isListening = getListeningForDocument(mountAt), dependencies = registrationNameDependencies[registrationName], i = 0; i < dependencies.length; i++) {\n                    var dependency = dependencies[i];\n                    if (!isListening.hasOwnProperty(dependency) || !isListening[dependency]) {\n                        switch (dependency) {\n                          case TOP_SCROLL:\n                            trapCapturedEvent(TOP_SCROLL, mountAt);\n                            break;\n\n                          case TOP_FOCUS:\n                          case TOP_BLUR:\n                            trapCapturedEvent(TOP_FOCUS, mountAt), trapCapturedEvent(TOP_BLUR, mountAt), isListening[TOP_BLUR] = !0, \n                            isListening[TOP_FOCUS] = !0;\n                            break;\n\n                          case TOP_CANCEL:\n                          case TOP_CLOSE:\n                            isEventSupported(getRawEventName(dependency), !0) && trapCapturedEvent(dependency, mountAt);\n                            break;\n\n                          case TOP_INVALID:\n                          case TOP_SUBMIT:\n                          case TOP_RESET:\n                            break;\n\n                          default:\n                            -1 !== mediaEventTypes.indexOf(dependency) || trapBubbledEvent(dependency, mountAt);\n                        }\n                        isListening[dependency] = !0;\n                    }\n                }\n            }\n            function isListeningToAllDependencies(registrationName, mountAt) {\n                for (var isListening = getListeningForDocument(mountAt), dependencies = registrationNameDependencies[registrationName], i = 0; i < dependencies.length; i++) {\n                    var dependency = dependencies[i];\n                    if (!isListening.hasOwnProperty(dependency) || !isListening[dependency]) return !1;\n                }\n                return !0;\n            }\n            function getLeafNode(node) {\n                for (;node && node.firstChild; ) node = node.firstChild;\n                return node;\n            }\n            function getSiblingNode(node) {\n                for (;node; ) {\n                    if (node.nextSibling) return node.nextSibling;\n                    node = node.parentNode;\n                }\n            }\n            function getNodeForCharacterOffset(root, offset) {\n                for (var node = getLeafNode(root), nodeStart = 0, nodeEnd = 0; node; ) {\n                    if (node.nodeType === TEXT_NODE) {\n                        if (nodeEnd = nodeStart + node.textContent.length, nodeStart <= offset && nodeEnd >= offset) return {\n                            node: node,\n                            offset: offset - nodeStart\n                        };\n                        nodeStart = nodeEnd;\n                    }\n                    node = getLeafNode(getSiblingNode(node));\n                }\n            }\n            function getOffsets(outerNode) {\n                var selection = window.getSelection && window.getSelection();\n                if (!selection || 0 === selection.rangeCount) return null;\n                var anchorNode = selection.anchorNode, anchorOffset = selection.anchorOffset, focusNode = selection.focusNode, focusOffset = selection.focusOffset;\n                try {\n                    anchorNode.nodeType, focusNode.nodeType;\n                } catch (e) {\n                    return null;\n                }\n                return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);\n            }\n            function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {\n                var length = 0, start = -1, end = -1, indexWithinAnchor = 0, indexWithinFocus = 0, node = outerNode, parentNode = null;\n                outer: for (;;) {\n                    for (var next = null; ;) {\n                        if (node !== anchorNode || 0 !== anchorOffset && node.nodeType !== TEXT_NODE || (start = length + anchorOffset), \n                        node !== focusNode || 0 !== focusOffset && node.nodeType !== TEXT_NODE || (end = length + focusOffset), \n                        node.nodeType === TEXT_NODE && (length += node.nodeValue.length), null === (next = node.firstChild)) break;\n                        parentNode = node, node = next;\n                    }\n                    for (;;) {\n                        if (node === outerNode) break outer;\n                        if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset && (start = length), \n                        parentNode === focusNode && ++indexWithinFocus === focusOffset && (end = length), \n                        null !== (next = node.nextSibling)) break;\n                        node = parentNode, parentNode = node.parentNode;\n                    }\n                    node = next;\n                }\n                return -1 === start || -1 === end ? null : {\n                    start: start,\n                    end: end\n                };\n            }\n            function setOffsets(node, offsets) {\n                if (window.getSelection) {\n                    var selection = window.getSelection(), length = node[getTextContentAccessor()].length, start = Math.min(offsets.start, length), end = void 0 === offsets.end ? start : Math.min(offsets.end, length);\n                    if (!selection.extend && start > end) {\n                        var temp = end;\n                        end = start, start = temp;\n                    }\n                    var startMarker = getNodeForCharacterOffset(node, start), endMarker = getNodeForCharacterOffset(node, end);\n                    if (startMarker && endMarker) {\n                        if (1 === selection.rangeCount && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) return;\n                        var range = document.createRange();\n                        range.setStart(startMarker.node, startMarker.offset), selection.removeAllRanges(), \n                        start > end ? (selection.addRange(range), selection.extend(endMarker.node, endMarker.offset)) : (range.setEnd(endMarker.node, endMarker.offset), \n                        selection.addRange(range));\n                    }\n                }\n            }\n            function isInDocument(node) {\n                return containsNode(document.documentElement, node);\n            }\n            function hasSelectionCapabilities(elem) {\n                var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n                return nodeName && (\"input\" === nodeName && \"text\" === elem.type || \"textarea\" === nodeName || \"true\" === elem.contentEditable);\n            }\n            function getSelectionInformation() {\n                var focusedElem = getActiveElement();\n                return {\n                    focusedElem: focusedElem,\n                    selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection$1(focusedElem) : null\n                };\n            }\n            function restoreSelection(priorSelectionInformation) {\n                var curFocusedElem = getActiveElement(), priorFocusedElem = priorSelectionInformation.focusedElem, priorSelectionRange = priorSelectionInformation.selectionRange;\n                if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n                    hasSelectionCapabilities(priorFocusedElem) && setSelection(priorFocusedElem, priorSelectionRange);\n                    for (var ancestors = [], ancestor = priorFocusedElem; ancestor = ancestor.parentNode; ) ancestor.nodeType === ELEMENT_NODE && ancestors.push({\n                        element: ancestor,\n                        left: ancestor.scrollLeft,\n                        top: ancestor.scrollTop\n                    });\n                    priorFocusedElem.focus();\n                    for (var i = 0; i < ancestors.length; i++) {\n                        var info = ancestors[i];\n                        info.element.scrollLeft = info.left, info.element.scrollTop = info.top;\n                    }\n                }\n            }\n            function getSelection$1(input) {\n                return (\"selectionStart\" in input ? {\n                    start: input.selectionStart,\n                    end: input.selectionEnd\n                } : getOffsets(input)) || {\n                    start: 0,\n                    end: 0\n                };\n            }\n            function setSelection(input, offsets) {\n                var start = offsets.start, end = offsets.end;\n                void 0 === end && (end = start), \"selectionStart\" in input ? (input.selectionStart = start, \n                input.selectionEnd = Math.min(end, input.value.length)) : setOffsets(input, offsets);\n            }\n            function getSelection(node) {\n                if (\"selectionStart\" in node && hasSelectionCapabilities(node)) return {\n                    start: node.selectionStart,\n                    end: node.selectionEnd\n                };\n                if (window.getSelection) {\n                    var selection = window.getSelection();\n                    return {\n                        anchorNode: selection.anchorNode,\n                        anchorOffset: selection.anchorOffset,\n                        focusNode: selection.focusNode,\n                        focusOffset: selection.focusOffset\n                    };\n                }\n            }\n            function constructSelectEvent(nativeEvent, nativeEventTarget) {\n                if (mouseDown || null == activeElement$1 || activeElement$1 !== getActiveElement()) return null;\n                var currentSelection = getSelection(activeElement$1);\n                if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n                    lastSelection = currentSelection;\n                    var syntheticEvent = SyntheticEvent$1.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);\n                    return syntheticEvent.type = \"select\", syntheticEvent.target = activeElement$1, \n                    accumulateTwoPhaseDispatches(syntheticEvent), syntheticEvent;\n                }\n                return null;\n            }\n            function flattenChildren(children) {\n                var content = \"\";\n                return React.Children.forEach(children, function(child) {\n                    null != child && (\"string\" != typeof child && \"number\" != typeof child || (content += child));\n                }), content;\n            }\n            function validateProps(element, props) {\n                null == props.selected || didWarnSelectedSetOnOption || (warning(!1, \"Use the ` + (\"`\" + `defaultValue`)) + (\"`\" + (` or ` + \"`\"))))) + ((((`value` + (\"`\" + ` props on <select> instead of setting `)) + (\"`\" + (`selected` + \"`\"))) + ((` on <option>.\"), \n                didWarnSelectedSetOnOption = !0);\n            }\n            function postMountWrapper$1(element, props) {\n                null != props.value && element.setAttribute(\"value\", props.value);\n            }\n            function getHostProps$1(element, props) {\n                var hostProps = _assign({\n                    children: void 0\n                }, props), content = flattenChildren(props.children);\n                return content && (hostProps.children = content), hostProps;\n            }\n            function getDeclarationErrorAddendum() {\n                var ownerName = getCurrentFiberOwnerName$3();\n                return ownerName ? \"\\n\\nCheck the render method of ` + (\"`\" + `\" + ownerName + \"`)) + (\"`\" + (`.\" : \"\";\n            }\n            function checkSelectPropTypes(props) {\n                ReactControlledValuePropTypes.checkPropTypes(\"select\", props, getCurrentFiberStackAddendum$3);\n                for (var i = 0; i < valuePropNames.length; i++) {\n                    var propName = valuePropNames[i];\n                    if (null != props[propName]) {\n                        var isArray = Array.isArray(props[propName]);\n                        props.multiple && !isArray ? warning(!1, \"The ` + \"`\")))) + (((`%s` + (\"`\" + ` prop supplied to <select> must be an array if `)) + (\"`\" + (`multiple` + \"`\"))) + ((` is true.%s\", propName, getDeclarationErrorAddendum()) : !props.multiple && isArray && warning(!1, \"The ` + (\"`\" + `%s`)) + ((\"`\" + ` prop supplied to <select> must be a scalar value if `) + (\"`\" + `multiple`)))))))) + (((((((\"`\" + (` is false.%s\", propName, getDeclarationErrorAddendum());\n                    }\n                }\n            }\n            function updateOptions(node, multiple, propValue, setDefaultSelected) {\n                var options = node.options;\n                if (multiple) {\n                    for (var selectedValues = propValue, selectedValue = {}, i = 0; i < selectedValues.length; i++) selectedValue[\"$\" + selectedValues[i]] = !0;\n                    for (var _i = 0; _i < options.length; _i++) {\n                        var selected = selectedValue.hasOwnProperty(\"$\" + options[_i].value);\n                        options[_i].selected !== selected && (options[_i].selected = selected), selected && setDefaultSelected && (options[_i].defaultSelected = !0);\n                    }\n                } else {\n                    for (var _selectedValue = \"\" + propValue, defaultSelected = null, _i2 = 0; _i2 < options.length; _i2++) {\n                        if (options[_i2].value === _selectedValue) return options[_i2].selected = !0, void (setDefaultSelected && (options[_i2].defaultSelected = !0));\n                        null !== defaultSelected || options[_i2].disabled || (defaultSelected = options[_i2]);\n                    }\n                    null !== defaultSelected && (defaultSelected.selected = !0);\n                }\n            }\n            function getHostProps$2(element, props) {\n                return _assign({}, props, {\n                    value: void 0\n                });\n            }\n            function initWrapperState$1(element, props) {\n                var node = element;\n                checkSelectPropTypes(props);\n                var value = props.value;\n                node._wrapperState = {\n                    initialValue: null != value ? value : props.defaultValue,\n                    wasMultiple: !!props.multiple\n                }, void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue$1 || (warning(!1, \"Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://fb.me/react-controlled-components\"), \n                didWarnValueDefaultValue$1 = !0);\n            }\n            function postMountWrapper$2(element, props) {\n                var node = element;\n                node.multiple = !!props.multiple;\n                var value = props.value;\n                null != value ? updateOptions(node, !!props.multiple, value, !1) : null != props.defaultValue && updateOptions(node, !!props.multiple, props.defaultValue, !0);\n            }\n            function postUpdateWrapper(element, props) {\n                var node = element;\n                node._wrapperState.initialValue = void 0;\n                var wasMultiple = node._wrapperState.wasMultiple;\n                node._wrapperState.wasMultiple = !!props.multiple;\n                var value = props.value;\n                null != value ? updateOptions(node, !!props.multiple, value, !1) : wasMultiple !== !!props.multiple && (null != props.defaultValue ? updateOptions(node, !!props.multiple, props.defaultValue, !0) : updateOptions(node, !!props.multiple, props.multiple ? [] : \"\", !1));\n            }\n            function restoreControlledState$2(element, props) {\n                var node = element, value = props.value;\n                null != value && updateOptions(node, !!props.multiple, value, !1);\n            }\n            function getHostProps$3(element, props) {\n                var node = element;\n                return null != props.dangerouslySetInnerHTML && invariant(!1, \"` + \"`\")) + (`dangerouslySetInnerHTML` + (\"`\" + ` does not make sense on <textarea>.\"), \n                _assign({}, props, {\n                    value: void 0,\n                    defaultValue: void 0,\n                    children: \"\" + node._wrapperState.initialValue\n                });\n            }\n            function initWrapperState$2(element, props) {\n                var node = element;\n                ReactControlledValuePropTypes.checkPropTypes(\"textarea\", props, getCurrentFiberStackAddendum$4), \n                void 0 === props.value || void 0 === props.defaultValue || didWarnValDefaultVal || (warning(!1, \"Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://fb.me/react-controlled-components\"), \n                didWarnValDefaultVal = !0);\n                var initialValue = props.value;\n                if (null == initialValue) {\n                    var defaultValue = props.defaultValue, children = props.children;\n                    null != children && (warning(!1, \"Use the `))) + ((\"`\" + (`defaultValue` + \"`\")) + (` or ` + (\"`\" + `value`)))) + (((\"`\" + (` props instead of setting children on <textarea>.\"), \n                    null != defaultValue && invariant(!1, \"If you supply ` + \"`\")) + (`defaultValue` + (\"`\" + ` on a <textarea>, do not pass children.\"), \n                    Array.isArray(children) && (children.length <= 1 || invariant(!1, \"<textarea> can only have at most one child.\"), \n                    children = children[0]), defaultValue = \"\" + children), null == defaultValue && (defaultValue = \"\"), \n                    initialValue = defaultValue;\n                }\n                node._wrapperState = {\n                    initialValue: \"\" + initialValue\n                };\n            }\n            function updateWrapper$1(element, props) {\n                var node = element, value = props.value;\n                if (null != value) {\n                    var newValue = \"\" + value;\n                    newValue !== node.value && (node.value = newValue), null == props.defaultValue && (node.defaultValue = newValue);\n                }\n                null != props.defaultValue && (node.defaultValue = props.defaultValue);\n            }\n            function postMountWrapper$3(element, props) {\n                var node = element, textContent = node.textContent;\n                textContent === node._wrapperState.initialValue && (node.value = textContent);\n            }\n            function restoreControlledState$3(element, props) {\n                updateWrapper$1(element, props);\n            }\n            function getIntrinsicNamespace(type) {\n                switch (type) {\n                  case \"svg\":\n                    return SVG_NAMESPACE;\n\n                  case \"math\":\n                    return MATH_NAMESPACE;\n\n                  default:\n                    return HTML_NAMESPACE$1;\n                }\n            }\n            function getChildNamespace(parentNamespace, type) {\n                return null == parentNamespace || parentNamespace === HTML_NAMESPACE$1 ? getIntrinsicNamespace(type) : parentNamespace === SVG_NAMESPACE && \"foreignObject\" === type ? HTML_NAMESPACE$1 : parentNamespace;\n            }\n            function prefixKey(prefix, key) {\n                return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n            }\n            function dangerousStyleValue(name, value, isCustomProperty) {\n                return null == value || \"boolean\" == typeof value || \"\" === value ? \"\" : isCustomProperty || \"number\" != typeof value || 0 === value || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name] ? (\"\" + value).trim() : value + \"px\";\n            }\n            function createDangerousStringForStyles(styles) {\n                var serialized = \"\", delimiter = \"\";\n                for (var styleName in styles) if (styles.hasOwnProperty(styleName)) {\n                    var styleValue = styles[styleName];\n                    if (null != styleValue) {\n                        var isCustomProperty = 0 === styleName.indexOf(\"--\");\n                        serialized += delimiter + hyphenateStyleName(styleName) + \":\", serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty), \n                        delimiter = \";\";\n                    }\n                }\n                return serialized || null;\n            }\n            function setValueForStyles(node, styles, getStack) {\n                var style = node.style;\n                for (var styleName in styles) if (styles.hasOwnProperty(styleName)) {\n                    var isCustomProperty = 0 === styleName.indexOf(\"--\");\n                    isCustomProperty || warnValidStyle$1(styleName, styles[styleName], getStack);\n                    var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);\n                    \"float\" === styleName && (styleName = \"cssFloat\"), isCustomProperty ? style.setProperty(styleName, styleValue) : style[styleName] = styleValue;\n                }\n            }\n            function assertValidProps(tag, props, getStack) {\n                props && (voidElementTags[tag] && (null != props.children || null != props.dangerouslySetInnerHTML) && invariant(!1, \"%s is a void element tag and must neither have `))) + ((\"`\" + (`children` + \"`\")) + (` nor use ` + (\"`\" + `dangerouslySetInnerHTML`))))) + ((((\"`\" + (`.%s\", tag, getStack()), \n                null != props.dangerouslySetInnerHTML && (null != props.children && invariant(!1, \"Can only set one of ` + \"`\")) + (`children` + (\"`\" + ` or `))) + ((\"`\" + (`props.dangerouslySetInnerHTML` + \"`\")) + (`.\"), \n                \"object\" == typeof props.dangerouslySetInnerHTML && HTML$1 in props.dangerouslySetInnerHTML || invariant(!1, \"` + (\"`\" + `props.dangerouslySetInnerHTML`)))) + (((\"`\" + (` must be in the form ` + \"`\")) + (`{__html: ...}` + (\"`\" + `. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.\")), \n                !props.suppressContentEditableWarning && props.contentEditable && null != props.children && warning(!1, \"A component is `))) + ((\"`\" + (`contentEditable` + \"`\")) + (` and contains ` + (\"`\" + `children`)))))) + (((((\"`\" + (` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.%s\", getStack()), \n                null != props.style && \"object\" != typeof props.style && invariant(!1, \"The ` + \"`\")) + (`style` + (\"`\" + ` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.%s\", getStack()));\n            }\n            function isCustomComponent(tagName, props) {\n                if (-1 === tagName.indexOf(\"-\")) return \"string\" == typeof props.is;\n                switch (tagName) {\n                  case \"annotation-xml\":\n                  case \"color-profile\":\n                  case \"font-face\":\n                  case \"font-face-src\":\n                  case \"font-face-uri\":\n                  case \"font-face-format\":\n                  case \"font-face-name\":\n                  case \"missing-glyph\":\n                    return !1;\n\n                  default:\n                    return !0;\n                }\n            }\n            function getStackAddendum() {\n                var stack = ReactDebugCurrentFrame.getStackAddendum();\n                return null != stack ? stack : \"\";\n            }\n            function validateProperty(tagName, name) {\n                if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) return !0;\n                if (rARIACamel.test(name)) {\n                    var ariaName = \"aria-\" + name.slice(4).toLowerCase(), correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null;\n                    if (null == correctName) return warning(!1, \"Invalid ARIA attribute `))) + ((\"`\" + (`%s` + \"`\")) + (`. ARIA attributes follow the pattern aria-* and must be lowercase.%s\", name, getStackAddendum()), \n                    warnedProperties[name] = !0, !0;\n                    if (name !== correctName) return warning(!1, \"Invalid ARIA attribute ` + (\"`\" + `%s`)))) + (((\"`\" + (`. Did you mean ` + \"`\")) + (`%s` + (\"`\" + `?%s\", name, correctName, getStackAddendum()), \n                    warnedProperties[name] = !0, !0;\n                }\n                if (rARIA.test(name)) {\n                    var lowerCasedName = name.toLowerCase(), standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null;\n                    if (null == standardName) return warnedProperties[name] = !0, !1;\n                    if (name !== standardName) return warning(!1, \"Unknown ARIA attribute `))) + ((\"`\" + (`%s` + \"`\")) + (`. Did you mean ` + (\"`\" + `%s`))))) + ((((\"`\" + (`?%s\", name, standardName, getStackAddendum()), \n                    warnedProperties[name] = !0, !0;\n                }\n                return !0;\n            }\n            function warnInvalidARIAProps(type, props) {\n                var invalidProps = [];\n                for (var key in props) {\n                    validateProperty(type, key) || invalidProps.push(key);\n                }\n                var unknownPropString = invalidProps.map(function(prop) {\n                    return \"` + \"`\")) + (`\" + prop + \"` + (\"`\" + `\";\n                }).join(\", \");\n                1 === invalidProps.length ? warning(!1, \"Invalid aria prop %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s\", unknownPropString, type, getStackAddendum()) : invalidProps.length > 1 && warning(!1, \"Invalid aria props %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s\", unknownPropString, type, getStackAddendum());\n            }\n            function validateProperties(type, props) {\n                isCustomComponent(type, props) || warnInvalidARIAProps(type, props);\n            }\n            function getStackAddendum$1() {\n                var stack = ReactDebugCurrentFrame.getStackAddendum();\n                return null != stack ? stack : \"\";\n            }\n            function validateProperties$1(type, props) {\n                \"input\" !== type && \"textarea\" !== type && \"select\" !== type || null == props || null !== props.value || didWarnValueNull || (didWarnValueNull = !0, \n                \"select\" === type && props.multiple ? warning(!1, \"`))) + ((\"`\" + (`value` + \"`\")) + (` prop on ` + (\"`\" + `%s`)))) + (((\"`\" + (` should not be null. Consider using an empty array when ` + \"`\")) + (`multiple` + (\"`\" + ` is set to `))) + ((\"`\" + (`true` + \"`\")) + ((` to clear the component or ` + \"`\") + (`undefined` + \"`\"))))))) + ((((((` for uncontrolled components.%s\", type, getStackAddendum$1()) : warning(!1, \"` + (\"`\" + `value`)) + (\"`\" + (` prop on ` + \"`\"))) + ((`%s` + (\"`\" + ` should not be null. Consider using an empty string to clear the component or `)) + (\"`\" + (`undefined` + \"`\")))) + (((` for uncontrolled components.%s\", type, getStackAddendum$1()));\n            }\n            function getStackAddendum$2() {\n                var stack = ReactDebugCurrentFrame.getStackAddendum();\n                return null != stack ? stack : \"\";\n            }\n            function validateProperties$2(type, props, canUseEventSystem) {\n                isCustomComponent(type, props) || warnUnknownProperties(type, props, canUseEventSystem);\n            }\n            function ensureListeningTo(rootContainerElement, registrationName) {\n                listenTo(registrationName, rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument);\n            }\n            function getOwnerDocumentFromRootContainer(rootContainerElement) {\n                return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;\n            }\n            function trapClickOnNonInteractiveElement(node) {\n                node.onclick = emptyFunction;\n            }\n            function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {\n                for (var propKey in nextProps) if (nextProps.hasOwnProperty(propKey)) {\n                    var nextProp = nextProps[propKey];\n                    if (propKey === STYLE) nextProp && Object.freeze(nextProp), setValueForStyles(domElement, nextProp, getStack); else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n                        var nextHtml = nextProp ? nextProp[HTML] : void 0;\n                        null != nextHtml && setInnerHTML(domElement, nextHtml);\n                    } else if (propKey === CHILDREN) if (\"string\" == typeof nextProp) {\n                        var canSetTextContent = \"textarea\" !== tag || \"\" !== nextProp;\n                        canSetTextContent && setTextContent(domElement, nextProp);\n                    } else \"number\" == typeof nextProp && setTextContent(domElement, \"\" + nextProp); else propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || propKey === AUTOFOCUS || (registrationNameModules.hasOwnProperty(propKey) ? null != nextProp && (\"function\" != typeof nextProp && warnForInvalidEventListener(propKey, nextProp), \n                    ensureListeningTo(rootContainerElement, propKey)) : null != nextProp && setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag));\n                }\n            }\n            function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {\n                for (var i = 0; i < updatePayload.length; i += 2) {\n                    var propKey = updatePayload[i], propValue = updatePayload[i + 1];\n                    propKey === STYLE ? setValueForStyles(domElement, propValue, getStack) : propKey === DANGEROUSLY_SET_INNER_HTML ? setInnerHTML(domElement, propValue) : propKey === CHILDREN ? setTextContent(domElement, propValue) : setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);\n                }\n            }\n            function createElement$1(type, props, rootContainerElement, parentNamespace) {\n                var isCustomComponentTag = void 0, ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement), domElement = void 0, namespaceURI = parentNamespace;\n                if (namespaceURI === HTML_NAMESPACE && (namespaceURI = getIntrinsicNamespace(type)), \n                namespaceURI === HTML_NAMESPACE) if ((isCustomComponentTag = isCustomComponent(type, props)) || type === type.toLowerCase() || warning(!1, \"<%s /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements.\", type), \n                \"script\" === type) {\n                    var div = ownerDocument.createElement(\"div\");\n                    div.innerHTML = \"<script><\\/script>\";\n                    var firstChild = div.firstChild;\n                    domElement = div.removeChild(firstChild);\n                } else domElement = \"string\" == typeof props.is ? ownerDocument.createElement(type, {\n                    is: props.is\n                }) : ownerDocument.createElement(type); else domElement = ownerDocument.createElementNS(namespaceURI, type);\n                return namespaceURI === HTML_NAMESPACE && (isCustomComponentTag || \"[object HTMLUnknownElement]\" !== Object.prototype.toString.call(domElement) || Object.prototype.hasOwnProperty.call(warnedUnknownTags, type) || (warnedUnknownTags[type] = !0, \n                warning(!1, \"The tag <%s> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.\", type))), \n                domElement;\n            }\n            function createTextNode$1(text, rootContainerElement) {\n                return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);\n            }\n            function setInitialProperties$1(domElement, tag, rawProps, rootContainerElement) {\n                var isCustomComponentTag = isCustomComponent(tag, rawProps);\n                validatePropertiesInDevelopment(tag, rawProps), isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot && (warning(!1, \"%s is using shady DOM. Using shady DOM with React can cause things to break subtly.\", getCurrentFiberOwnerName$2() || \"A component\"), \n                didWarnShadyDOM = !0);\n                var props = void 0;\n                switch (tag) {\n                  case \"iframe\":\n                  case \"object\":\n                    trapBubbledEvent(TOP_LOAD, domElement), props = rawProps;\n                    break;\n\n                  case \"video\":\n                  case \"audio\":\n                    for (var i = 0; i < mediaEventTypes.length; i++) trapBubbledEvent(mediaEventTypes[i], domElement);\n                    props = rawProps;\n                    break;\n\n                  case \"source\":\n                    trapBubbledEvent(TOP_ERROR, domElement), props = rawProps;\n                    break;\n\n                  case \"img\":\n                  case \"image\":\n                  case \"link\":\n                    trapBubbledEvent(TOP_ERROR, domElement), trapBubbledEvent(TOP_LOAD, domElement), \n                    props = rawProps;\n                    break;\n\n                  case \"form\":\n                    trapBubbledEvent(TOP_RESET, domElement), trapBubbledEvent(TOP_SUBMIT, domElement), \n                    props = rawProps;\n                    break;\n\n                  case \"details\":\n                    trapBubbledEvent(TOP_TOGGLE, domElement), props = rawProps;\n                    break;\n\n                  case \"input\":\n                    initWrapperState(domElement, rawProps), props = getHostProps(domElement, rawProps), \n                    trapBubbledEvent(TOP_INVALID, domElement), ensureListeningTo(rootContainerElement, \"onChange\");\n                    break;\n\n                  case \"option\":\n                    validateProps(domElement, rawProps), props = getHostProps$1(domElement, rawProps);\n                    break;\n\n                  case \"select\":\n                    initWrapperState$1(domElement, rawProps), props = getHostProps$2(domElement, rawProps), \n                    trapBubbledEvent(TOP_INVALID, domElement), ensureListeningTo(rootContainerElement, \"onChange\");\n                    break;\n\n                  case \"textarea\":\n                    initWrapperState$2(domElement, rawProps), props = getHostProps$3(domElement, rawProps), \n                    trapBubbledEvent(TOP_INVALID, domElement), ensureListeningTo(rootContainerElement, \"onChange\");\n                    break;\n\n                  default:\n                    props = rawProps;\n                }\n                switch (assertValidProps(tag, props, getStack), setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag), \n                tag) {\n                  case \"input\":\n                    track(domElement), postMountWrapper(domElement, rawProps);\n                    break;\n\n                  case \"textarea\":\n                    track(domElement), postMountWrapper$3(domElement, rawProps);\n                    break;\n\n                  case \"option\":\n                    postMountWrapper$1(domElement, rawProps);\n                    break;\n\n                  case \"select\":\n                    postMountWrapper$2(domElement, rawProps);\n                    break;\n\n                  default:\n                    \"function\" == typeof props.onClick && trapClickOnNonInteractiveElement(domElement);\n                }\n            }\n            function diffProperties$1(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {\n                validatePropertiesInDevelopment(tag, nextRawProps);\n                var updatePayload = null, lastProps = void 0, nextProps = void 0;\n                switch (tag) {\n                  case \"input\":\n                    lastProps = getHostProps(domElement, lastRawProps), nextProps = getHostProps(domElement, nextRawProps), \n                    updatePayload = [];\n                    break;\n\n                  case \"option\":\n                    lastProps = getHostProps$1(domElement, lastRawProps), nextProps = getHostProps$1(domElement, nextRawProps), \n                    updatePayload = [];\n                    break;\n\n                  case \"select\":\n                    lastProps = getHostProps$2(domElement, lastRawProps), nextProps = getHostProps$2(domElement, nextRawProps), \n                    updatePayload = [];\n                    break;\n\n                  case \"textarea\":\n                    lastProps = getHostProps$3(domElement, lastRawProps), nextProps = getHostProps$3(domElement, nextRawProps), \n                    updatePayload = [];\n                    break;\n\n                  default:\n                    lastProps = lastRawProps, nextProps = nextRawProps, \"function\" != typeof lastProps.onClick && \"function\" == typeof nextProps.onClick && trapClickOnNonInteractiveElement(domElement);\n                }\n                assertValidProps(tag, nextProps, getStack);\n                var propKey = void 0, styleName = void 0, styleUpdates = null;\n                for (propKey in lastProps) if (!nextProps.hasOwnProperty(propKey) && lastProps.hasOwnProperty(propKey) && null != lastProps[propKey]) if (propKey === STYLE) {\n                    var lastStyle = lastProps[propKey];\n                    for (styleName in lastStyle) lastStyle.hasOwnProperty(styleName) && (styleUpdates || (styleUpdates = {}), \n                    styleUpdates[styleName] = \"\");\n                } else propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN || propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || propKey === AUTOFOCUS || (registrationNameModules.hasOwnProperty(propKey) ? updatePayload || (updatePayload = []) : (updatePayload = updatePayload || []).push(propKey, null));\n                for (propKey in nextProps) {\n                    var nextProp = nextProps[propKey], lastProp = null != lastProps ? lastProps[propKey] : void 0;\n                    if (nextProps.hasOwnProperty(propKey) && nextProp !== lastProp && (null != nextProp || null != lastProp)) if (propKey === STYLE) if (nextProp && Object.freeze(nextProp), \n                    lastProp) {\n                        for (styleName in lastProp) !lastProp.hasOwnProperty(styleName) || nextProp && nextProp.hasOwnProperty(styleName) || (styleUpdates || (styleUpdates = {}), \n                        styleUpdates[styleName] = \"\");\n                        for (styleName in nextProp) nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName] && (styleUpdates || (styleUpdates = {}), \n                        styleUpdates[styleName] = nextProp[styleName]);\n                    } else styleUpdates || (updatePayload || (updatePayload = []), updatePayload.push(propKey, styleUpdates)), \n                    styleUpdates = nextProp; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n                        var nextHtml = nextProp ? nextProp[HTML] : void 0, lastHtml = lastProp ? lastProp[HTML] : void 0;\n                        null != nextHtml && lastHtml !== nextHtml && (updatePayload = updatePayload || []).push(propKey, \"\" + nextHtml);\n                    } else propKey === CHILDREN ? lastProp === nextProp || \"string\" != typeof nextProp && \"number\" != typeof nextProp || (updatePayload = updatePayload || []).push(propKey, \"\" + nextProp) : propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || (registrationNameModules.hasOwnProperty(propKey) ? (null != nextProp && (\"function\" != typeof nextProp && warnForInvalidEventListener(propKey, nextProp), \n                    ensureListeningTo(rootContainerElement, propKey)), updatePayload || lastProp === nextProp || (updatePayload = [])) : (updatePayload = updatePayload || []).push(propKey, nextProp));\n                }\n                return styleUpdates && (updatePayload = updatePayload || []).push(STYLE, styleUpdates), \n                updatePayload;\n            }\n            function updateProperties$1(domElement, updatePayload, tag, lastRawProps, nextRawProps) {\n                switch (\"input\" === tag && \"radio\" === nextRawProps.type && null != nextRawProps.name && updateChecked(domElement, nextRawProps), \n                updateDOMProperties(domElement, updatePayload, isCustomComponent(tag, lastRawProps), isCustomComponent(tag, nextRawProps)), \n                tag) {\n                  case \"input\":\n                    updateWrapper(domElement, nextRawProps);\n                    break;\n\n                  case \"textarea\":\n                    updateWrapper$1(domElement, nextRawProps);\n                    break;\n\n                  case \"select\":\n                    postUpdateWrapper(domElement, nextRawProps);\n                }\n            }\n            function getPossibleStandardName(propName) {\n                var lowerCasedName = propName.toLowerCase();\n                return possibleStandardNames.hasOwnProperty(lowerCasedName) ? possibleStandardNames[lowerCasedName] || null : null;\n            }\n            function diffHydratedProperties$1(domElement, tag, rawProps, parentNamespace, rootContainerElement) {\n                var isCustomComponentTag = void 0, extraAttributeNames = void 0;\n                switch (suppressHydrationWarning = !0 === rawProps[SUPPRESS_HYDRATION_WARNING$1], \n                isCustomComponentTag = isCustomComponent(tag, rawProps), validatePropertiesInDevelopment(tag, rawProps), \n                isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot && (warning(!1, \"%s is using shady DOM. Using shady DOM with React can cause things to break subtly.\", getCurrentFiberOwnerName$2() || \"A component\"), \n                didWarnShadyDOM = !0), tag) {\n                  case \"iframe\":\n                  case \"object\":\n                    trapBubbledEvent(TOP_LOAD, domElement);\n                    break;\n\n                  case \"video\":\n                  case \"audio\":\n                    for (var i = 0; i < mediaEventTypes.length; i++) trapBubbledEvent(mediaEventTypes[i], domElement);\n                    break;\n\n                  case \"source\":\n                    trapBubbledEvent(TOP_ERROR, domElement);\n                    break;\n\n                  case \"img\":\n                  case \"image\":\n                  case \"link\":\n                    trapBubbledEvent(TOP_ERROR, domElement), trapBubbledEvent(TOP_LOAD, domElement);\n                    break;\n\n                  case \"form\":\n                    trapBubbledEvent(TOP_RESET, domElement), trapBubbledEvent(TOP_SUBMIT, domElement);\n                    break;\n\n                  case \"details\":\n                    trapBubbledEvent(TOP_TOGGLE, domElement);\n                    break;\n\n                  case \"input\":\n                    initWrapperState(domElement, rawProps), trapBubbledEvent(TOP_INVALID, domElement), \n                    ensureListeningTo(rootContainerElement, \"onChange\");\n                    break;\n\n                  case \"option\":\n                    validateProps(domElement, rawProps);\n                    break;\n\n                  case \"select\":\n                    initWrapperState$1(domElement, rawProps), trapBubbledEvent(TOP_INVALID, domElement), \n                    ensureListeningTo(rootContainerElement, \"onChange\");\n                    break;\n\n                  case \"textarea\":\n                    initWrapperState$2(domElement, rawProps), trapBubbledEvent(TOP_INVALID, domElement), \n                    ensureListeningTo(rootContainerElement, \"onChange\");\n                }\n                assertValidProps(tag, rawProps, getStack), extraAttributeNames = new Set();\n                for (var attributes = domElement.attributes, _i = 0; _i < attributes.length; _i++) {\n                    switch (attributes[_i].name.toLowerCase()) {\n                      case \"data-reactroot\":\n                      case \"value\":\n                      case \"checked\":\n                      case \"selected\":\n                        break;\n\n                      default:\n                        extraAttributeNames.add(attributes[_i].name);\n                    }\n                }\n                var updatePayload = null;\n                for (var propKey in rawProps) if (rawProps.hasOwnProperty(propKey)) {\n                    var nextProp = rawProps[propKey];\n                    if (propKey === CHILDREN) \"string\" == typeof nextProp ? domElement.textContent !== nextProp && (suppressHydrationWarning || warnForTextDifference(domElement.textContent, nextProp), \n                    updatePayload = [ CHILDREN, nextProp ]) : \"number\" == typeof nextProp && domElement.textContent !== \"\" + nextProp && (suppressHydrationWarning || warnForTextDifference(domElement.textContent, nextProp), \n                    updatePayload = [ CHILDREN, \"\" + nextProp ]); else if (registrationNameModules.hasOwnProperty(propKey)) null != nextProp && (\"function\" != typeof nextProp && warnForInvalidEventListener(propKey, nextProp), \n                    ensureListeningTo(rootContainerElement, propKey)); else if (\"boolean\" == typeof isCustomComponentTag) {\n                        var serverValue = void 0, propertyInfo = getPropertyInfo(propKey);\n                        if (suppressHydrationWarning) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 || \"value\" === propKey || \"checked\" === propKey || \"selected\" === propKey) ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n                            var rawHtml = nextProp ? nextProp[HTML] || \"\" : \"\", serverHTML = domElement.innerHTML, expectedHTML = normalizeHTML(domElement, rawHtml);\n                            expectedHTML !== serverHTML && warnForPropDifference(propKey, serverHTML, expectedHTML);\n                        } else if (propKey === STYLE) {\n                            extraAttributeNames.delete(propKey);\n                            var expectedStyle = createDangerousStringForStyles(nextProp);\n                            serverValue = domElement.getAttribute(\"style\"), expectedStyle !== serverValue && warnForPropDifference(propKey, serverValue, expectedStyle);\n                        } else if (isCustomComponentTag) extraAttributeNames.delete(propKey.toLowerCase()), \n                        serverValue = getValueForAttribute(domElement, propKey, nextProp), nextProp !== serverValue && warnForPropDifference(propKey, serverValue, nextProp); else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {\n                            var isMismatchDueToBadCasing = !1;\n                            if (null !== propertyInfo) extraAttributeNames.delete(propertyInfo.attributeName), \n                            serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo); else {\n                                var ownNamespace = parentNamespace;\n                                if (ownNamespace === HTML_NAMESPACE && (ownNamespace = getIntrinsicNamespace(tag)), \n                                ownNamespace === HTML_NAMESPACE) extraAttributeNames.delete(propKey.toLowerCase()); else {\n                                    var standardName = getPossibleStandardName(propKey);\n                                    null !== standardName && standardName !== propKey && (isMismatchDueToBadCasing = !0, \n                                    extraAttributeNames.delete(standardName)), extraAttributeNames.delete(propKey);\n                                }\n                                serverValue = getValueForAttribute(domElement, propKey, nextProp);\n                            }\n                            nextProp === serverValue || isMismatchDueToBadCasing || warnForPropDifference(propKey, serverValue, nextProp);\n                        }\n                    }\n                }\n                switch (extraAttributeNames.size > 0 && !suppressHydrationWarning && warnForExtraAttributes(extraAttributeNames), \n                tag) {\n                  case \"input\":\n                    track(domElement), postMountWrapper(domElement, rawProps);\n                    break;\n\n                  case \"textarea\":\n                    track(domElement), postMountWrapper$3(domElement, rawProps);\n                    break;\n\n                  case \"select\":\n                  case \"option\":\n                    break;\n\n                  default:\n                    \"function\" == typeof rawProps.onClick && trapClickOnNonInteractiveElement(domElement);\n                }\n                return updatePayload;\n            }\n            function diffHydratedText$1(textNode, text) {\n                return textNode.nodeValue !== text;\n            }\n            function warnForUnmatchedText$1(textNode, text) {\n                warnForTextDifference(textNode.nodeValue, text);\n            }\n            function warnForDeletedHydratableElement$1(parentNode, child) {\n                didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, \"Did not expect server HTML to contain a <%s> in <%s>.\", child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase()));\n            }\n            function warnForDeletedHydratableText$1(parentNode, child) {\n                didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, 'Did not expect server HTML to contain the text node \"%s\" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase()));\n            }\n            function warnForInsertedHydratedElement$1(parentNode, tag, props) {\n                didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, \"Expected server HTML to contain a matching <%s> in <%s>.\", tag, parentNode.nodeName.toLowerCase()));\n            }\n            function warnForInsertedHydratedText$1(parentNode, text) {\n                \"\" !== text && (didWarnInvalidHydration || (didWarnInvalidHydration = !0, warning(!1, 'Expected server HTML to contain a matching text node for \"%s\" in <%s>.', text, parentNode.nodeName.toLowerCase())));\n            }\n            function restoreControlledState$1(domElement, tag, props) {\n                switch (tag) {\n                  case \"input\":\n                    return void restoreControlledState(domElement, props);\n\n                  case \"textarea\":\n                    return void restoreControlledState$3(domElement, props);\n\n                  case \"select\":\n                    return void restoreControlledState$2(domElement, props);\n                }\n            }\n            function shim() {\n                invariant(!1, \"The current renderer does not support persistence. This error is likely caused by a bug in React. Please file an issue.\");\n            }\n            function shouldAutoFocusHostComponent(type, props) {\n                switch (type) {\n                  case \"button\":\n                  case \"input\":\n                  case \"select\":\n                  case \"textarea\":\n                    return !!props.autoFocus;\n                }\n                return !1;\n            }\n            function getRootHostContext(rootContainerInstance) {\n                var type = void 0, namespace = void 0, nodeType = rootContainerInstance.nodeType;\n                switch (nodeType) {\n                  case DOCUMENT_NODE:\n                  case DOCUMENT_FRAGMENT_NODE:\n                    type = nodeType === DOCUMENT_NODE ? \"#document\" : \"#fragment\";\n                    var root = rootContainerInstance.documentElement;\n                    namespace = root ? root.namespaceURI : getChildNamespace(null, \"\");\n                    break;\n\n                  default:\n                    var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance, ownNamespace = container.namespaceURI || null;\n                    type = container.tagName, namespace = getChildNamespace(ownNamespace, type);\n                }\n                var validatedTag = type.toLowerCase();\n                return {\n                    namespace: namespace,\n                    ancestorInfo: updatedAncestorInfo(null, validatedTag, null)\n                };\n            }\n            function getChildHostContext(parentHostContext, type, rootContainerInstance) {\n                var parentHostContextDev = parentHostContext;\n                return {\n                    namespace: getChildNamespace(parentHostContextDev.namespace, type),\n                    ancestorInfo: updatedAncestorInfo(parentHostContextDev.ancestorInfo, type, null)\n                };\n            }\n            function getPublicInstance(instance) {\n                return instance;\n            }\n            function prepareForCommit(containerInfo) {\n                eventsEnabled = isEnabled(), selectionInformation = getSelectionInformation(), setEnabled(!1);\n            }\n            function resetAfterCommit(containerInfo) {\n                restoreSelection(selectionInformation), selectionInformation = null, setEnabled(eventsEnabled), \n                eventsEnabled = null;\n            }\n            function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n                var parentNamespace = void 0, hostContextDev = hostContext;\n                if (validateDOMNesting$1(type, null, hostContextDev.ancestorInfo), \"string\" == typeof props.children || \"number\" == typeof props.children) {\n                    var string = \"\" + props.children, ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);\n                    validateDOMNesting$1(null, string, ownAncestorInfo);\n                }\n                parentNamespace = hostContextDev.namespace;\n                var domElement = createElement(type, props, rootContainerInstance, parentNamespace);\n                return precacheFiberNode$1(internalInstanceHandle, domElement), updateFiberProps$1(domElement, props), \n                domElement;\n            }\n            function appendInitialChild(parentInstance, child) {\n                parentInstance.appendChild(child);\n            }\n            function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {\n                return setInitialProperties(domElement, type, props, rootContainerInstance), shouldAutoFocusHostComponent(type, props);\n            }\n            function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {\n                var hostContextDev = hostContext;\n                if (typeof newProps.children != typeof oldProps.children && (\"string\" == typeof newProps.children || \"number\" == typeof newProps.children)) {\n                    var string = \"\" + newProps.children, ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);\n                    validateDOMNesting$1(null, string, ownAncestorInfo);\n                }\n                return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);\n            }\n            function shouldSetTextContent(type, props) {\n                return \"textarea\" === type || \"string\" == typeof props.children || \"number\" == typeof props.children || \"object\" == typeof props.dangerouslySetInnerHTML && null !== props.dangerouslySetInnerHTML && \"string\" == typeof props.dangerouslySetInnerHTML.__html;\n            }\n            function shouldDeprioritizeSubtree(type, props) {\n                return !!props.hidden;\n            }\n            function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {\n                validateDOMNesting$1(null, text, hostContext.ancestorInfo);\n                var textNode = createTextNode(text, rootContainerInstance);\n                return precacheFiberNode$1(internalInstanceHandle, textNode), textNode;\n            }\n            function commitMount(domElement, type, newProps, internalInstanceHandle) {\n                shouldAutoFocusHostComponent(type, newProps) && domElement.focus();\n            }\n            function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {\n                updateFiberProps$1(domElement, newProps), updateProperties(domElement, updatePayload, type, oldProps, newProps);\n            }\n            function resetTextContent(domElement) {\n                setTextContent(domElement, \"\");\n            }\n            function commitTextUpdate(textInstance, oldText, newText) {\n                textInstance.nodeValue = newText;\n            }\n            function appendChild(parentInstance, child) {\n                parentInstance.appendChild(child);\n            }\n            function appendChildToContainer(container, child) {\n                container.nodeType === COMMENT_NODE ? container.parentNode.insertBefore(child, container) : container.appendChild(child);\n            }\n            function insertBefore(parentInstance, child, beforeChild) {\n                parentInstance.insertBefore(child, beforeChild);\n            }\n            function insertInContainerBefore(container, child, beforeChild) {\n                container.nodeType === COMMENT_NODE ? container.parentNode.insertBefore(child, beforeChild) : container.insertBefore(child, beforeChild);\n            }\n            function removeChild(parentInstance, child) {\n                parentInstance.removeChild(child);\n            }\n            function removeChildFromContainer(container, child) {\n                container.nodeType === COMMENT_NODE ? container.parentNode.removeChild(child) : container.removeChild(child);\n            }\n            function canHydrateInstance(instance, type, props) {\n                return instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase() ? null : instance;\n            }\n            function canHydrateTextInstance(instance, text) {\n                return \"\" === text || instance.nodeType !== TEXT_NODE ? null : instance;\n            }\n            function getNextHydratableSibling(instance) {\n                for (var node = instance.nextSibling; node && node.nodeType !== ELEMENT_NODE && node.nodeType !== TEXT_NODE; ) node = node.nextSibling;\n                return node;\n            }\n            function getFirstHydratableChild(parentInstance) {\n                for (var next = parentInstance.firstChild; next && next.nodeType !== ELEMENT_NODE && next.nodeType !== TEXT_NODE; ) next = next.nextSibling;\n                return next;\n            }\n            function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n                precacheFiberNode$1(internalInstanceHandle, instance), updateFiberProps$1(instance, props);\n                var parentNamespace = void 0;\n                return parentNamespace = hostContext.namespace, diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);\n            }\n            function hydrateTextInstance(textInstance, text, internalInstanceHandle) {\n                return precacheFiberNode$1(internalInstanceHandle, textInstance), diffHydratedText(textInstance, text);\n            }\n            function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) {\n                warnForUnmatchedText(textInstance, text);\n            }\n            function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) {\n                !0 !== parentProps[SUPPRESS_HYDRATION_WARNING] && warnForUnmatchedText(textInstance, text);\n            }\n            function didNotHydrateContainerInstance(parentContainer, instance) {\n                1 === instance.nodeType ? warnForDeletedHydratableElement(parentContainer, instance) : warnForDeletedHydratableText(parentContainer, instance);\n            }\n            function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) {\n                !0 !== parentProps[SUPPRESS_HYDRATION_WARNING] && (1 === instance.nodeType ? warnForDeletedHydratableElement(parentInstance, instance) : warnForDeletedHydratableText(parentInstance, instance));\n            }\n            function didNotFindHydratableContainerInstance(parentContainer, type, props) {\n                warnForInsertedHydratedElement(parentContainer, type, props);\n            }\n            function didNotFindHydratableContainerTextInstance(parentContainer, text) {\n                warnForInsertedHydratedText(parentContainer, text);\n            }\n            function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) {\n                !0 !== parentProps[SUPPRESS_HYDRATION_WARNING] && warnForInsertedHydratedElement(parentInstance, type, props);\n            }\n            function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) {\n                !0 !== parentProps[SUPPRESS_HYDRATION_WARNING] && warnForInsertedHydratedText(parentInstance, text);\n            }\n            function recordEffect() {\n                enableUserTimingAPI && effectCountInCurrentCommit++;\n            }\n            function recordScheduleUpdate() {\n                enableUserTimingAPI && (isCommitting && (hasScheduledUpdateInCurrentCommit = !0), \n                null !== currentPhase && \"componentWillMount\" !== currentPhase && \"componentWillReceiveProps\" !== currentPhase && (hasScheduledUpdateInCurrentPhase = !0));\n            }\n            function startRequestCallbackTimer() {\n                enableUserTimingAPI && supportsUserTiming && !isWaitingForCallback && (isWaitingForCallback = !0, \n                beginMark(\"(Waiting for async callback...)\"));\n            }\n            function stopRequestCallbackTimer(didExpire, expirationTime) {\n                if (enableUserTimingAPI && supportsUserTiming) {\n                    isWaitingForCallback = !1;\n                    endMark(\"(Waiting for async callback... will force flush in \" + expirationTime + \" ms)\", \"(Waiting for async callback...)\", didExpire ? \"React was blocked by main thread\" : null);\n                }\n            }\n            function startWorkTimer(fiber) {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;\n                    if (currentFiber = fiber, !beginFiberMark(fiber, null)) return;\n                    fiber._debugIsCurrentlyTiming = !0;\n                }\n            }\n            function cancelWorkTimer(fiber) {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;\n                    fiber._debugIsCurrentlyTiming = !1, clearFiberMark(fiber, null);\n                }\n            }\n            function stopWorkTimer(fiber) {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;\n                    if (currentFiber = fiber.return, !fiber._debugIsCurrentlyTiming) return;\n                    fiber._debugIsCurrentlyTiming = !1, endFiberMark(fiber, null, null);\n                }\n            }\n            function stopFailedWorkTimer(fiber) {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming || shouldIgnoreFiber(fiber)) return;\n                    if (currentFiber = fiber.return, !fiber._debugIsCurrentlyTiming) return;\n                    fiber._debugIsCurrentlyTiming = !1;\n                    endFiberMark(fiber, null, \"An error was thrown inside this error boundary\");\n                }\n            }\n            function startPhaseTimer(fiber, phase) {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    if (clearPendingPhaseMeasurement(), !beginFiberMark(fiber, phase)) return;\n                    currentPhaseFiber = fiber, currentPhase = phase;\n                }\n            }\n            function stopPhaseTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    if (null !== currentPhase && null !== currentPhaseFiber) {\n                        endFiberMark(currentPhaseFiber, currentPhase, hasScheduledUpdateInCurrentPhase ? \"Scheduled a cascading update\" : null);\n                    }\n                    currentPhase = null, currentPhaseFiber = null;\n                }\n            }\n            function startWorkLoopTimer(nextUnitOfWork) {\n                if (enableUserTimingAPI) {\n                    if (currentFiber = nextUnitOfWork, !supportsUserTiming) return;\n                    commitCountInCurrentWorkLoop = 0, beginMark(\"(React Tree Reconciliation)\"), resumeTimers();\n                }\n            }\n            function stopWorkLoopTimer(interruptedBy, didCompleteRoot) {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    var warning$$1 = null;\n                    if (null !== interruptedBy) if (interruptedBy.tag === HostRoot) warning$$1 = \"A top-level update interrupted the previous render\"; else {\n                        var componentName = getComponentName(interruptedBy) || \"Unknown\";\n                        warning$$1 = \"An update to \" + componentName + \" interrupted the previous render\";\n                    } else commitCountInCurrentWorkLoop > 1 && (warning$$1 = \"There were cascading updates\");\n                    commitCountInCurrentWorkLoop = 0;\n                    var label = didCompleteRoot ? \"(React Tree Reconciliation: Completed Root)\" : \"(React Tree Reconciliation: Yielded)\";\n                    pauseTimers(), endMark(label, \"(React Tree Reconciliation)\", warning$$1);\n                }\n            }\n            function startCommitTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    isCommitting = !0, hasScheduledUpdateInCurrentCommit = !1, labelsInCurrentCommit.clear(), \n                    beginMark(\"(Committing Changes)\");\n                }\n            }\n            function stopCommitTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    var warning$$1 = null;\n                    hasScheduledUpdateInCurrentCommit ? warning$$1 = \"Lifecycle hook scheduled a cascading update\" : commitCountInCurrentWorkLoop > 0 && (warning$$1 = \"Caused by a cascading update in earlier commit\"), \n                    hasScheduledUpdateInCurrentCommit = !1, commitCountInCurrentWorkLoop++, isCommitting = !1, \n                    labelsInCurrentCommit.clear(), endMark(\"(Committing Changes)\", \"(Committing Changes)\", warning$$1);\n                }\n            }\n            function startCommitSnapshotEffectsTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    effectCountInCurrentCommit = 0, beginMark(\"(Committing Snapshot Effects)\");\n                }\n            }\n            function stopCommitSnapshotEffectsTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    var count = effectCountInCurrentCommit;\n                    effectCountInCurrentCommit = 0, endMark(\"(Committing Snapshot Effects: \" + count + \" Total)\", \"(Committing Snapshot Effects)\", null);\n                }\n            }\n            function startCommitHostEffectsTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    effectCountInCurrentCommit = 0, beginMark(\"(Committing Host Effects)\");\n                }\n            }\n            function stopCommitHostEffectsTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    var count = effectCountInCurrentCommit;\n                    effectCountInCurrentCommit = 0, endMark(\"(Committing Host Effects: \" + count + \" Total)\", \"(Committing Host Effects)\", null);\n                }\n            }\n            function startCommitLifeCyclesTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    effectCountInCurrentCommit = 0, beginMark(\"(Calling Lifecycle Methods)\");\n                }\n            }\n            function stopCommitLifeCyclesTimer() {\n                if (enableUserTimingAPI) {\n                    if (!supportsUserTiming) return;\n                    var count = effectCountInCurrentCommit;\n                    effectCountInCurrentCommit = 0, endMark(\"(Calling Lifecycle Methods: \" + count + \" Total)\", \"(Calling Lifecycle Methods)\", null);\n                }\n            }\n            function createCursor(defaultValue) {\n                return {\n                    current: defaultValue\n                };\n            }\n            function pop(cursor, fiber) {\n                if (index < 0) return void warning(!1, \"Unexpected pop.\");\n                fiber !== fiberStack[index] && warning(!1, \"Unexpected Fiber popped.\"), cursor.current = valueStack[index], \n                valueStack[index] = null, fiberStack[index] = null, index--;\n            }\n            function push(cursor, value, fiber) {\n                index++, valueStack[index] = cursor.current, fiberStack[index] = fiber, cursor.current = value;\n            }\n            function checkThatStackIsEmpty() {\n                -1 !== index && warning(!1, \"Expected an empty stack. Something was not reset properly.\");\n            }\n            function resetStackAfterFatalErrorInDev() {\n                index = -1, valueStack.length = 0, fiberStack.length = 0;\n            }\n            function getUnmaskedContext(workInProgress) {\n                return isContextProvider(workInProgress) ? previousContext : contextStackCursor.current;\n            }\n            function cacheContext(workInProgress, unmaskedContext, maskedContext) {\n                var instance = workInProgress.stateNode;\n                instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext, instance.__reactInternalMemoizedMaskedChildContext = maskedContext;\n            }\n            function getMaskedContext(workInProgress, unmaskedContext) {\n                var type = workInProgress.type, contextTypes = type.contextTypes;\n                if (!contextTypes) return emptyObject;\n                var instance = workInProgress.stateNode;\n                if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) return instance.__reactInternalMemoizedMaskedChildContext;\n                var context = {};\n                for (var key in contextTypes) context[key] = unmaskedContext[key];\n                var name = getComponentName(workInProgress) || \"Unknown\";\n                return checkPropTypes(contextTypes, context, \"context\", name, ReactDebugCurrentFiber.getCurrentFiberStackAddendum), \n                instance && cacheContext(workInProgress, unmaskedContext, context), context;\n            }\n            function hasContextChanged() {\n                return didPerformWorkStackCursor.current;\n            }\n            function isContextConsumer(fiber) {\n                return fiber.tag === ClassComponent && null != fiber.type.contextTypes;\n            }\n            function isContextProvider(fiber) {\n                return fiber.tag === ClassComponent && null != fiber.type.childContextTypes;\n            }\n            function popContextProvider(fiber) {\n                isContextProvider(fiber) && (pop(didPerformWorkStackCursor, fiber), pop(contextStackCursor, fiber));\n            }\n            function popTopLevelContextObject(fiber) {\n                pop(didPerformWorkStackCursor, fiber), pop(contextStackCursor, fiber);\n            }\n            function pushTopLevelContextObject(fiber, context, didChange) {\n                contextStackCursor.current !== emptyObject && invariant(!1, \"Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.\"), \n                push(contextStackCursor, context, fiber), push(didPerformWorkStackCursor, didChange, fiber);\n            }\n            function processChildContext(fiber, parentContext) {\n                var instance = fiber.stateNode, childContextTypes = fiber.type.childContextTypes;\n                if (\"function\" != typeof instance.getChildContext) {\n                    var componentName = getComponentName(fiber) || \"Unknown\";\n                    return warnedAboutMissingGetChildContext[componentName] || (warnedAboutMissingGetChildContext[componentName] = !0, \n                    warning(!1, \"%s.childContextTypes is specified but there is no getChildContext() method on the instance. You can either define getChildContext() on %s or remove childContextTypes from it.\", componentName, componentName)), \n                    parentContext;\n                }\n                var childContext = void 0;\n                ReactDebugCurrentFiber.setCurrentPhase(\"getChildContext\"), startPhaseTimer(fiber, \"getChildContext\"), \n                childContext = instance.getChildContext(), stopPhaseTimer(), ReactDebugCurrentFiber.setCurrentPhase(null);\n                for (var contextKey in childContext) contextKey in childContextTypes || invariant(!1, '%s.getChildContext(): key \"%s\" is not defined in childContextTypes.', getComponentName(fiber) || \"Unknown\", contextKey);\n                var name = getComponentName(fiber) || \"Unknown\";\n                return checkPropTypes(childContextTypes, childContext, \"child context\", name, ReactDebugCurrentFiber.getCurrentFiberStackAddendum), \n                _assign({}, parentContext, childContext);\n            }\n            function pushContextProvider(workInProgress) {\n                if (!isContextProvider(workInProgress)) return !1;\n                var instance = workInProgress.stateNode, memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyObject;\n                return previousContext = contextStackCursor.current, push(contextStackCursor, memoizedMergedChildContext, workInProgress), \n                push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress), \n                !0;\n            }\n            function invalidateContextProvider(workInProgress, didChange) {\n                var instance = workInProgress.stateNode;\n                if (instance || invariant(!1, \"Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.\"), \n                didChange) {\n                    var mergedContext = processChildContext(workInProgress, previousContext);\n                    instance.__reactInternalMemoizedMergedChildContext = mergedContext, pop(didPerformWorkStackCursor, workInProgress), \n                    pop(contextStackCursor, workInProgress), push(contextStackCursor, mergedContext, workInProgress), \n                    push(didPerformWorkStackCursor, didChange, workInProgress);\n                } else pop(didPerformWorkStackCursor, workInProgress), push(didPerformWorkStackCursor, didChange, workInProgress);\n            }\n            function findCurrentUnmaskedContext(fiber) {\n                isFiberMounted(fiber) && fiber.tag === ClassComponent || invariant(!1, \"Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.\");\n                for (var node = fiber; node.tag !== HostRoot; ) {\n                    if (isContextProvider(node)) return node.stateNode.__reactInternalMemoizedMergedChildContext;\n                    var parent = node.return;\n                    parent || invariant(!1, \"Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.\"), \n                    node = parent;\n                }\n                return node.stateNode.context;\n            }\n            function msToExpirationTime(ms) {\n                return (ms / UNIT_SIZE | 0) + MAGIC_NUMBER_OFFSET;\n            }\n            function expirationTimeToMs(expirationTime) {\n                return (expirationTime - MAGIC_NUMBER_OFFSET) * UNIT_SIZE;\n            }\n            function ceiling(num, precision) {\n                return (1 + (num / precision | 0)) * precision;\n            }\n            function computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {\n                return MAGIC_NUMBER_OFFSET + ceiling(currentTime - MAGIC_NUMBER_OFFSET + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);\n            }\n            function FiberNode(tag, pendingProps, key, mode) {\n                this.tag = tag, this.key = key, this.type = null, this.stateNode = null, this.return = null, \n                this.child = null, this.sibling = null, this.index = 0, this.ref = null, this.pendingProps = pendingProps, \n                this.memoizedProps = null, this.updateQueue = null, this.memoizedState = null, this.mode = mode, \n                this.effectTag = NoEffect, this.nextEffect = null, this.firstEffect = null, this.lastEffect = null, \n                this.expirationTime = NoWork, this.alternate = null, enableProfilerTimer && (this.selfBaseTime = 0, \n                this.treeBaseTime = 0), this._debugID = debugCounter++, this._debugSource = null, \n                this._debugOwner = null, this._debugIsCurrentlyTiming = !1, hasBadMapPolyfill || \"function\" != typeof Object.preventExtensions || Object.preventExtensions(this);\n            }\n            function shouldConstruct(Component) {\n                return !(!Component.prototype || !Component.prototype.isReactComponent);\n            }\n            function createWorkInProgress(current, pendingProps, expirationTime) {\n                var workInProgress = current.alternate;\n                return null === workInProgress ? (workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode), \n                workInProgress.type = current.type, workInProgress.stateNode = current.stateNode, \n                workInProgress._debugID = current._debugID, workInProgress._debugSource = current._debugSource, \n                workInProgress._debugOwner = current._debugOwner, workInProgress.alternate = current, \n                current.alternate = workInProgress) : (workInProgress.pendingProps = pendingProps, \n                workInProgress.effectTag = NoEffect, workInProgress.nextEffect = null, workInProgress.firstEffect = null, \n                workInProgress.lastEffect = null), workInProgress.expirationTime = expirationTime, \n                workInProgress.child = current.child, workInProgress.memoizedProps = current.memoizedProps, \n                workInProgress.memoizedState = current.memoizedState, workInProgress.updateQueue = current.updateQueue, \n                workInProgress.sibling = current.sibling, workInProgress.index = current.index, \n                workInProgress.ref = current.ref, enableProfilerTimer && (workInProgress.selfBaseTime = current.selfBaseTime, \n                workInProgress.treeBaseTime = current.treeBaseTime), workInProgress;\n            }\n            function createHostRootFiber(isAsync) {\n                return createFiber(HostRoot, null, null, isAsync ? AsyncMode | StrictMode : NoContext);\n            }\n            function createFiberFromElement(element, mode, expirationTime) {\n                var owner = null;\n                owner = element._owner;\n                var fiber = void 0, type = element.type, key = element.key, pendingProps = element.props, fiberTag = void 0;\n                if (\"function\" == typeof type) fiberTag = shouldConstruct(type) ? ClassComponent : IndeterminateComponent; else if (\"string\" == typeof type) fiberTag = HostComponent; else switch (type) {\n                  case REACT_FRAGMENT_TYPE:\n                    return createFiberFromFragment(pendingProps.children, mode, expirationTime, key);\n\n                  case REACT_ASYNC_MODE_TYPE:\n                    fiberTag = Mode, mode |= AsyncMode | StrictMode;\n                    break;\n\n                  case REACT_STRICT_MODE_TYPE:\n                    fiberTag = Mode, mode |= StrictMode;\n                    break;\n\n                  case REACT_PROFILER_TYPE:\n                    return createFiberFromProfiler(pendingProps, mode, expirationTime, key);\n\n                  case REACT_TIMEOUT_TYPE:\n                    fiberTag = TimeoutComponent, mode |= StrictMode;\n                    break;\n\n                  default:\n                    fiberTag = getFiberTagFromObjectType(type, owner);\n                }\n                return fiber = createFiber(fiberTag, pendingProps, key, mode), fiber.type = type, \n                fiber.expirationTime = expirationTime, fiber._debugSource = element._source, fiber._debugOwner = element._owner, \n                fiber;\n            }\n            function getFiberTagFromObjectType(type, owner) {\n                switch (\"object\" == typeof type && null !== type ? type.$$typeof : null) {\n                  case REACT_PROVIDER_TYPE:\n                    return ContextProvider;\n\n                  case REACT_CONTEXT_TYPE:\n                    return ContextConsumer;\n\n                  case REACT_FORWARD_REF_TYPE:\n                    return ForwardRef;\n\n                  default:\n                    var info = \"\";\n                    (void 0 === type || \"object\" == typeof type && null !== type && 0 === Object.keys(type).length) && (info += \" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.\");\n                    var ownerName = owner ? getComponentName(owner) : null;\n                    ownerName && (info += \"\\n\\nCheck the render method of ` + (\"`\" + `\" + ownerName + \"`)) + (\"`\" + (`.\"), invariant(!1, \"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s\", null == type ? type : typeof type, info);\n                }\n            }\n            function createFiberFromFragment(elements, mode, expirationTime, key) {\n                var fiber = createFiber(Fragment, elements, key, mode);\n                return fiber.expirationTime = expirationTime, fiber;\n            }\n            function createFiberFromProfiler(pendingProps, mode, expirationTime, key) {\n                \"string\" == typeof pendingProps.id && \"function\" == typeof pendingProps.onRender || invariant(!1, 'Profiler must specify an \"id\" string and \"onRender\" function as props');\n                var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);\n                return fiber.type = REACT_PROFILER_TYPE, fiber.expirationTime = expirationTime, \n                enableProfilerTimer && (fiber.stateNode = {\n                    elapsedPauseTimeAtStart: 0,\n                    duration: 0,\n                    startTime: 0\n                }), fiber;\n            }\n            function createFiberFromText(content, mode, expirationTime) {\n                var fiber = createFiber(HostText, content, null, mode);\n                return fiber.expirationTime = expirationTime, fiber;\n            }\n            function createFiberFromHostInstanceForDeletion() {\n                var fiber = createFiber(HostComponent, null, null, NoContext);\n                return fiber.type = \"DELETED\", fiber;\n            }\n            function createFiberFromPortal(portal, mode, expirationTime) {\n                var pendingProps = null !== portal.children ? portal.children : [], fiber = createFiber(HostPortal, pendingProps, portal.key, mode);\n                return fiber.expirationTime = expirationTime, fiber.stateNode = {\n                    containerInfo: portal.containerInfo,\n                    pendingChildren: null,\n                    implementation: portal.implementation\n                }, fiber;\n            }\n            function assignFiberPropertiesInDEV(target, source) {\n                return null === target && (target = createFiber(IndeterminateComponent, null, null, NoContext)), \n                target.tag = source.tag, target.key = source.key, target.type = source.type, target.stateNode = source.stateNode, \n                target.return = source.return, target.child = source.child, target.sibling = source.sibling, \n                target.index = source.index, target.ref = source.ref, target.pendingProps = source.pendingProps, \n                target.memoizedProps = source.memoizedProps, target.updateQueue = source.updateQueue, \n                target.memoizedState = source.memoizedState, target.mode = source.mode, target.effectTag = source.effectTag, \n                target.nextEffect = source.nextEffect, target.firstEffect = source.firstEffect, \n                target.lastEffect = source.lastEffect, target.expirationTime = source.expirationTime, \n                target.alternate = source.alternate, enableProfilerTimer && (target.selfBaseTime = source.selfBaseTime, \n                target.treeBaseTime = source.treeBaseTime), target._debugID = source._debugID, target._debugSource = source._debugSource, \n                target._debugOwner = source._debugOwner, target._debugIsCurrentlyTiming = source._debugIsCurrentlyTiming, \n                target;\n            }\n            function createFiberRoot(containerInfo, isAsync, hydrate) {\n                var uninitializedFiber = createHostRootFiber(isAsync), root = {\n                    current: uninitializedFiber,\n                    containerInfo: containerInfo,\n                    pendingChildren: null,\n                    earliestPendingTime: NoWork,\n                    latestPendingTime: NoWork,\n                    earliestSuspendedTime: NoWork,\n                    latestSuspendedTime: NoWork,\n                    latestPingedTime: NoWork,\n                    pendingCommitExpirationTime: NoWork,\n                    finishedWork: null,\n                    context: null,\n                    pendingContext: null,\n                    hydrate: hydrate,\n                    remainingExpirationTime: NoWork,\n                    firstBatch: null,\n                    nextScheduledRoot: null\n                };\n                return uninitializedFiber.stateNode = root, root;\n            }\n            function catchErrors(fn) {\n                return function(arg) {\n                    try {\n                        return fn(arg);\n                    } catch (err) {\n                        hasLoggedError || (hasLoggedError = !0, warning(!1, \"React DevTools encountered an error: %s\", err));\n                    }\n                };\n            }\n            function injectInternals(internals) {\n                if (\"undefined\" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;\n                var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n                if (hook.isDisabled) return !0;\n                if (!hook.supportsFiber) return warning(!1, \"The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://fb.me/react-devtools\"), \n                !0;\n                try {\n                    var rendererID = hook.inject(internals);\n                    onCommitFiberRoot = catchErrors(function(root) {\n                        return hook.onCommitFiberRoot(rendererID, root);\n                    }), onCommitFiberUnmount = catchErrors(function(fiber) {\n                        return hook.onCommitFiberUnmount(rendererID, fiber);\n                    });\n                } catch (err) {\n                    warning(!1, \"React DevTools encountered an error: %s.\", err);\n                }\n                return !0;\n            }\n            function onCommitRoot(root) {\n                \"function\" == typeof onCommitFiberRoot && onCommitFiberRoot(root);\n            }\n            function onCommitUnmount(fiber) {\n                \"function\" == typeof onCommitFiberUnmount && onCommitFiberUnmount(fiber);\n            }\n            function markPendingPriorityLevel(root, expirationTime) {\n                if (enableSuspense) {\n                    var earliestPendingTime = root.earliestPendingTime;\n                    if (earliestPendingTime === NoWork) root.earliestPendingTime = root.latestPendingTime = expirationTime; else if (earliestPendingTime > expirationTime) root.earliestPendingTime = expirationTime; else {\n                        var latestPendingTime = root.latestPendingTime;\n                        latestPendingTime < expirationTime && (root.latestPendingTime = expirationTime);\n                    }\n                }\n            }\n            function markCommittedPriorityLevels(root, currentTime, earliestRemainingTime) {\n                if (enableSuspense) {\n                    if (earliestRemainingTime === NoWork) return root.earliestPendingTime = NoWork, \n                    root.latestPendingTime = NoWork, root.earliestSuspendedTime = NoWork, root.latestSuspendedTime = NoWork, \n                    void (root.latestPingedTime = NoWork);\n                    var latestPendingTime = root.latestPendingTime;\n                    if (latestPendingTime !== NoWork) if (latestPendingTime < earliestRemainingTime) root.earliestPendingTime = root.latestPendingTime = NoWork; else {\n                        var earliestPendingTime = root.earliestPendingTime;\n                        earliestPendingTime < earliestRemainingTime && (root.earliestPendingTime = root.latestPendingTime);\n                    }\n                    var earliestSuspendedTime = root.earliestSuspendedTime;\n                    if (earliestSuspendedTime === NoWork) return void markPendingPriorityLevel(root, earliestRemainingTime);\n                    if (earliestRemainingTime > root.latestSuspendedTime) return root.earliestSuspendedTime = NoWork, \n                    root.latestSuspendedTime = NoWork, root.latestPingedTime = NoWork, void markPendingPriorityLevel(root, earliestRemainingTime);\n                    if (earliestRemainingTime < earliestSuspendedTime) return void markPendingPriorityLevel(root, earliestRemainingTime);\n                }\n            }\n            function markSuspendedPriorityLevel(root, suspendedTime) {\n                if (enableSuspense) {\n                    var earliestPendingTime = root.earliestPendingTime, latestPendingTime = root.latestPendingTime;\n                    earliestPendingTime === suspendedTime ? root.earliestPendingTime = latestPendingTime === suspendedTime ? root.latestPendingTime = NoWork : latestPendingTime : latestPendingTime === suspendedTime && (root.latestPendingTime = earliestPendingTime);\n                    var latestSuspendedTime = root.latestSuspendedTime;\n                    latestSuspendedTime === suspendedTime && (root.latestPingedTime = NoWork);\n                    var earliestSuspendedTime = root.earliestSuspendedTime;\n                    earliestSuspendedTime === NoWork ? root.earliestSuspendedTime = root.latestSuspendedTime = suspendedTime : earliestSuspendedTime > suspendedTime ? root.earliestSuspendedTime = suspendedTime : latestSuspendedTime < suspendedTime && (root.latestSuspendedTime = suspendedTime);\n                }\n            }\n            function markPingedPriorityLevel(root, pingedTime) {\n                if (enableSuspense) {\n                    var latestSuspendedTime = root.latestSuspendedTime;\n                    if (latestSuspendedTime !== NoWork && latestSuspendedTime <= pingedTime) {\n                        var latestPingedTime = root.latestPingedTime;\n                        (latestPingedTime === NoWork || latestPingedTime < pingedTime) && (root.latestPingedTime = pingedTime);\n                    }\n                }\n            }\n            function findNextPendingPriorityLevel(root) {\n                if (enableSuspense) {\n                    var earliestSuspendedTime = root.earliestSuspendedTime, earliestPendingTime = root.earliestPendingTime;\n                    return earliestSuspendedTime === NoWork ? earliestPendingTime : earliestPendingTime !== NoWork ? earliestPendingTime : root.latestPingedTime;\n                }\n                return root.current.expirationTime;\n            }\n            function createUpdateQueue(baseState) {\n                return {\n                    expirationTime: NoWork,\n                    baseState: baseState,\n                    firstUpdate: null,\n                    lastUpdate: null,\n                    firstCapturedUpdate: null,\n                    lastCapturedUpdate: null,\n                    firstEffect: null,\n                    lastEffect: null,\n                    firstCapturedEffect: null,\n                    lastCapturedEffect: null\n                };\n            }\n            function cloneUpdateQueue(currentQueue) {\n                return {\n                    expirationTime: currentQueue.expirationTime,\n                    baseState: currentQueue.baseState,\n                    firstUpdate: currentQueue.firstUpdate,\n                    lastUpdate: currentQueue.lastUpdate,\n                    firstCapturedUpdate: null,\n                    lastCapturedUpdate: null,\n                    firstEffect: null,\n                    lastEffect: null,\n                    firstCapturedEffect: null,\n                    lastCapturedEffect: null\n                };\n            }\n            function createUpdate(expirationTime) {\n                return {\n                    expirationTime: expirationTime,\n                    tag: UpdateState,\n                    payload: null,\n                    callback: null,\n                    next: null,\n                    nextEffect: null\n                };\n            }\n            function appendUpdateToQueue(queue, update, expirationTime) {\n                null === queue.lastUpdate ? queue.firstUpdate = queue.lastUpdate = update : (queue.lastUpdate.next = update, \n                queue.lastUpdate = update), (queue.expirationTime === NoWork || queue.expirationTime > expirationTime) && (queue.expirationTime = expirationTime);\n            }\n            function enqueueUpdate(fiber, update, expirationTime) {\n                var alternate = fiber.alternate, queue1 = void 0, queue2 = void 0;\n                null === alternate ? (queue1 = fiber.updateQueue, queue2 = null, null === queue1 && (queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState))) : (queue1 = fiber.updateQueue, \n                queue2 = alternate.updateQueue, null === queue1 ? null === queue2 ? (queue1 = fiber.updateQueue = createUpdateQueue(fiber.memoizedState), \n                queue2 = alternate.updateQueue = createUpdateQueue(alternate.memoizedState)) : queue1 = fiber.updateQueue = cloneUpdateQueue(queue2) : null === queue2 && (queue2 = alternate.updateQueue = cloneUpdateQueue(queue1))), \n                null === queue2 || queue1 === queue2 ? appendUpdateToQueue(queue1, update, expirationTime) : null === queue1.lastUpdate || null === queue2.lastUpdate ? (appendUpdateToQueue(queue1, update, expirationTime), \n                appendUpdateToQueue(queue2, update, expirationTime)) : (appendUpdateToQueue(queue1, update, expirationTime), \n                queue2.lastUpdate = update), fiber.tag !== ClassComponent || currentlyProcessingQueue !== queue1 && (null === queue2 || currentlyProcessingQueue !== queue2) || didWarnUpdateInsideUpdate || (warning(!1, \"An update (setState, replaceState, or forceUpdate) was scheduled from inside an update function. Update functions should be pure, with zero side-effects. Consider using componentDidUpdate or a callback.\"), \n                didWarnUpdateInsideUpdate = !0);\n            }\n            function enqueueCapturedUpdate(workInProgress, update, renderExpirationTime) {\n                var workInProgressQueue = workInProgress.updateQueue;\n                workInProgressQueue = null === workInProgressQueue ? workInProgress.updateQueue = createUpdateQueue(workInProgress.memoizedState) : ensureWorkInProgressQueueIsAClone(workInProgress, workInProgressQueue), \n                null === workInProgressQueue.lastCapturedUpdate ? workInProgressQueue.firstCapturedUpdate = workInProgressQueue.lastCapturedUpdate = update : (workInProgressQueue.lastCapturedUpdate.next = update, \n                workInProgressQueue.lastCapturedUpdate = update), (workInProgressQueue.expirationTime === NoWork || workInProgressQueue.expirationTime > renderExpirationTime) && (workInProgressQueue.expirationTime = renderExpirationTime);\n            }\n            function ensureWorkInProgressQueueIsAClone(workInProgress, queue) {\n                var current = workInProgress.alternate;\n                return null !== current && queue === current.updateQueue && (queue = workInProgress.updateQueue = cloneUpdateQueue(queue)), \n                queue;\n            }\n            function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {\n                switch (update.tag) {\n                  case ReplaceState:\n                    var _payload = update.payload;\n                    return \"function\" == typeof _payload ? ((debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) && _payload.call(instance, prevState, nextProps), \n                    _payload.call(instance, prevState, nextProps)) : _payload;\n\n                  case CaptureUpdate:\n                    workInProgress.effectTag = workInProgress.effectTag & ~ShouldCapture | DidCapture;\n\n                  case UpdateState:\n                    var _payload2 = update.payload, partialState = void 0;\n                    return \"function\" == typeof _payload2 ? ((debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) && _payload2.call(instance, prevState, nextProps), \n                    partialState = _payload2.call(instance, prevState, nextProps)) : partialState = _payload2, \n                    null === partialState || void 0 === partialState ? prevState : _assign({}, prevState, partialState);\n\n                  case ForceUpdate:\n                    return hasForceUpdate = !0, prevState;\n                }\n                return prevState;\n            }\n            function processUpdateQueue(workInProgress, queue, props, instance, renderExpirationTime) {\n                if (hasForceUpdate = !1, !(queue.expirationTime === NoWork || queue.expirationTime > renderExpirationTime)) {\n                    queue = ensureWorkInProgressQueueIsAClone(workInProgress, queue), currentlyProcessingQueue = queue;\n                    for (var newBaseState = queue.baseState, newFirstUpdate = null, newExpirationTime = NoWork, update = queue.firstUpdate, resultState = newBaseState; null !== update; ) {\n                        var updateExpirationTime = update.expirationTime;\n                        if (updateExpirationTime > renderExpirationTime) null === newFirstUpdate && (newFirstUpdate = update, \n                        newBaseState = resultState), (newExpirationTime === NoWork || newExpirationTime > updateExpirationTime) && (newExpirationTime = updateExpirationTime); else {\n                            resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);\n                            null !== update.callback && (workInProgress.effectTag |= Callback, update.nextEffect = null, \n                            null === queue.lastEffect ? queue.firstEffect = queue.lastEffect = update : (queue.lastEffect.nextEffect = update, \n                            queue.lastEffect = update));\n                        }\n                        update = update.next;\n                    }\n                    var newFirstCapturedUpdate = null;\n                    for (update = queue.firstCapturedUpdate; null !== update; ) {\n                        var _updateExpirationTime = update.expirationTime;\n                        if (_updateExpirationTime > renderExpirationTime) null === newFirstCapturedUpdate && (newFirstCapturedUpdate = update, \n                        null === newFirstUpdate && (newBaseState = resultState)), (newExpirationTime === NoWork || newExpirationTime > _updateExpirationTime) && (newExpirationTime = _updateExpirationTime); else {\n                            resultState = getStateFromUpdate(workInProgress, queue, update, resultState, props, instance);\n                            null !== update.callback && (workInProgress.effectTag |= Callback, update.nextEffect = null, \n                            null === queue.lastCapturedEffect ? queue.firstCapturedEffect = queue.lastCapturedEffect = update : (queue.lastCapturedEffect.nextEffect = update, \n                            queue.lastCapturedEffect = update));\n                        }\n                        update = update.next;\n                    }\n                    null === newFirstUpdate && (queue.lastUpdate = null), null === newFirstCapturedUpdate ? queue.lastCapturedUpdate = null : workInProgress.effectTag |= Callback, \n                    null === newFirstUpdate && null === newFirstCapturedUpdate && (newBaseState = resultState), \n                    queue.baseState = newBaseState, queue.firstUpdate = newFirstUpdate, queue.firstCapturedUpdate = newFirstCapturedUpdate, \n                    queue.expirationTime = newExpirationTime, workInProgress.memoizedState = resultState, \n                    currentlyProcessingQueue = null;\n                }\n            }\n            function callCallback(callback, context) {\n                \"function\" != typeof callback && invariant(!1, \"Invalid argument passed as callback. Expected a function. Instead received: %s\", callback), \n                callback.call(context);\n            }\n            function resetHasForceUpdateBeforeProcessing() {\n                hasForceUpdate = !1;\n            }\n            function checkHasForceUpdateAfterProcessing() {\n                return hasForceUpdate;\n            }\n            function commitUpdateQueue(finishedWork, finishedQueue, instance, renderExpirationTime) {\n                null !== finishedQueue.firstCapturedUpdate && (null !== finishedQueue.lastUpdate && (finishedQueue.lastUpdate.next = finishedQueue.firstCapturedUpdate, \n                finishedQueue.lastUpdate = finishedQueue.lastCapturedUpdate), finishedQueue.firstCapturedUpdate = finishedQueue.lastCapturedUpdate = null);\n                var effect = finishedQueue.firstEffect;\n                for (finishedQueue.firstEffect = finishedQueue.lastEffect = null; null !== effect; ) {\n                    var _callback3 = effect.callback;\n                    null !== _callback3 && (effect.callback = null, callCallback(_callback3, instance)), \n                    effect = effect.nextEffect;\n                }\n                for (effect = finishedQueue.firstCapturedEffect, finishedQueue.firstCapturedEffect = finishedQueue.lastCapturedEffect = null; null !== effect; ) {\n                    var _callback4 = effect.callback;\n                    null !== _callback4 && (effect.callback = null, callCallback(_callback4, instance)), \n                    effect = effect.nextEffect;\n                }\n            }\n            function createCapturedValue(value, source) {\n                return {\n                    value: value,\n                    source: source,\n                    stack: getStackAddendumByWorkInProgressFiber(source)\n                };\n            }\n            function pushProvider(providerFiber) {\n                var context = providerFiber.type._context;\n                isPrimaryRenderer ? (push(changedBitsCursor, context._changedBits, providerFiber), \n                push(valueCursor, context._currentValue, providerFiber), push(providerCursor, providerFiber, providerFiber), \n                context._currentValue = providerFiber.pendingProps.value, context._changedBits = providerFiber.stateNode, \n                void 0 !== context._currentRenderer && null !== context._currentRenderer && context._currentRenderer !== rendererSigil && warning(!1, \"Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported.\"), \n                context._currentRenderer = rendererSigil) : (push(changedBitsCursor, context._changedBits2, providerFiber), \n                push(valueCursor, context._currentValue2, providerFiber), push(providerCursor, providerFiber, providerFiber), \n                context._currentValue2 = providerFiber.pendingProps.value, context._changedBits2 = providerFiber.stateNode, \n                void 0 !== context._currentRenderer2 && null !== context._currentRenderer2 && context._currentRenderer2 !== rendererSigil && warning(!1, \"Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported.\"), \n                context._currentRenderer2 = rendererSigil);\n            }\n            function popProvider(providerFiber) {\n                var changedBits = changedBitsCursor.current, currentValue = valueCursor.current;\n                pop(providerCursor, providerFiber), pop(valueCursor, providerFiber), pop(changedBitsCursor, providerFiber);\n                var context = providerFiber.type._context;\n                isPrimaryRenderer ? (context._currentValue = currentValue, context._changedBits = changedBits) : (context._currentValue2 = currentValue, \n                context._changedBits2 = changedBits);\n            }\n            function getContextCurrentValue(context) {\n                return isPrimaryRenderer ? context._currentValue : context._currentValue2;\n            }\n            function getContextChangedBits(context) {\n                return isPrimaryRenderer ? context._changedBits : context._changedBits2;\n            }\n            function requiredContext(c) {\n                return c === NO_CONTEXT && invariant(!1, \"Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.\"), \n                c;\n            }\n            function getRootHostContainer() {\n                return requiredContext(rootInstanceStackCursor.current);\n            }\n            function pushHostContainer(fiber, nextRootInstance) {\n                push(rootInstanceStackCursor, nextRootInstance, fiber), push(contextFiberStackCursor, fiber, fiber), \n                push(contextStackCursor$1, NO_CONTEXT, fiber);\n                var nextRootContext = getRootHostContext(nextRootInstance);\n                pop(contextStackCursor$1, fiber), push(contextStackCursor$1, nextRootContext, fiber);\n            }\n            function popHostContainer(fiber) {\n                pop(contextStackCursor$1, fiber), pop(contextFiberStackCursor, fiber), pop(rootInstanceStackCursor, fiber);\n            }\n            function getHostContext() {\n                return requiredContext(contextStackCursor$1.current);\n            }\n            function pushHostContext(fiber) {\n                var rootInstance = requiredContext(rootInstanceStackCursor.current), context = requiredContext(contextStackCursor$1.current), nextContext = getChildHostContext(context, fiber.type, rootInstance);\n                context !== nextContext && (push(contextFiberStackCursor, fiber, fiber), push(contextStackCursor$1, nextContext, fiber));\n            }\n            function popHostContext(fiber) {\n                contextFiberStackCursor.current === fiber && (pop(contextStackCursor$1, fiber), \n                pop(contextFiberStackCursor, fiber));\n            }\n            function getCommitTime() {\n                return commitTime;\n            }\n            function recordCommitTime() {\n                enableProfilerTimer && (commitTime = now());\n            }\n            function checkActualRenderTimeStackEmpty() {\n                enableProfilerTimer && 0 !== fiberStack$1.length && warning(!1, \"Expected an empty stack. Something was not reset properly.\");\n            }\n            function markActualRenderTimeStarted(fiber) {\n                if (enableProfilerTimer) {\n                    fiberStack$1.push(fiber);\n                    var stateNode = fiber.stateNode;\n                    stateNode.elapsedPauseTimeAtStart = totalElapsedPauseTime, stateNode.startTime = now();\n                }\n            }\n            function pauseActualRenderTimerIfRunning() {\n                enableProfilerTimer && 0 === timerPausedAt && (timerPausedAt = now());\n            }\n            function recordElapsedActualRenderTime(fiber) {\n                if (enableProfilerTimer) {\n                    fiber !== fiberStack$1.pop() && warning(!1, \"Unexpected Fiber popped.\");\n                    var stateNode = fiber.stateNode;\n                    stateNode.duration += now() - (totalElapsedPauseTime - stateNode.elapsedPauseTimeAtStart) - stateNode.startTime;\n                }\n            }\n            function resetActualRenderTimer() {\n                enableProfilerTimer && (totalElapsedPauseTime = 0);\n            }\n            function resumeActualRenderTimerIfPaused() {\n                enableProfilerTimer && timerPausedAt > 0 && (totalElapsedPauseTime += now() - timerPausedAt, \n                timerPausedAt = 0);\n            }\n            function recordElapsedBaseRenderTimeIfRunning(fiber) {\n                enableProfilerTimer && -1 !== baseStartTime && (fiber.selfBaseTime = now() - baseStartTime);\n            }\n            function startBaseRenderTimer() {\n                enableProfilerTimer && (-1 !== baseStartTime && warning(!1, \"Cannot start base timer that is already running. This error is likely caused by a bug in React. Please file an issue.\"), \n                baseStartTime = now());\n            }\n            function stopBaseRenderTimerIfRunning() {\n                enableProfilerTimer && (baseStartTime = -1);\n            }\n            function applyDerivedStateFromProps(workInProgress, getDerivedStateFromProps, nextProps) {\n                var prevState = workInProgress.memoizedState;\n                (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) && getDerivedStateFromProps(nextProps, prevState);\n                var partialState = getDerivedStateFromProps(nextProps, prevState);\n                warnOnUndefinedDerivedState(workInProgress, partialState);\n                var memoizedState = null === partialState || void 0 === partialState ? prevState : _assign({}, prevState, partialState);\n                workInProgress.memoizedState = memoizedState;\n                var updateQueue = workInProgress.updateQueue;\n                null !== updateQueue && updateQueue.expirationTime === NoWork && (updateQueue.baseState = memoizedState);\n            }\n            function checkShouldComponentUpdate(workInProgress, oldProps, newProps, oldState, newState, newContext) {\n                var instance = workInProgress.stateNode, ctor = workInProgress.type;\n                if (\"function\" == typeof instance.shouldComponentUpdate) {\n                    startPhaseTimer(workInProgress, \"shouldComponentUpdate\");\n                    var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, newContext);\n                    return stopPhaseTimer(), void 0 === shouldUpdate && warning(!1, \"%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.\", getComponentName(workInProgress) || \"Component\"), \n                    shouldUpdate;\n                }\n                return !ctor.prototype || !ctor.prototype.isPureReactComponent || (!shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState));\n            }\n            function checkClassInstance(workInProgress) {\n                var instance = workInProgress.stateNode, type = workInProgress.type, name = getComponentName(workInProgress) || \"Component\";\n                instance.render || (type.prototype && \"function\" == typeof type.prototype.render ? warning(!1, \"%s(...): No ` + \"`\"))) + ((`render` + (\"`\" + ` method found on the returned component instance: did you accidentally return an object from the constructor?\", name) : warning(!1, \"%s(...): No `)) + (\"`\" + (`render` + \"`\"))))) + ((((` method found on the returned component instance: you may have forgotten to define ` + (\"`\" + `render`)) + (\"`\" + (`.\", name)), \n                !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state || warning(!1, \"getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?\", name), \n                !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved || warning(!1, \"getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.\", name), \n                !instance.propTypes || warning(!1, \"propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.\", name), \n                !instance.contextTypes || warning(!1, \"contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.\", name), \n                \"function\" != typeof instance.componentShouldUpdate || warning(!1, \"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.\", name), \n                type.prototype && type.prototype.isPureReactComponent && void 0 !== instance.shouldComponentUpdate && warning(!1, \"%s has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.\", getComponentName(workInProgress) || \"A pure component\"), \n                \"function\" != typeof instance.componentDidUnmount || warning(!1, \"%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?\", name), \n                \"function\" != typeof instance.componentDidReceiveProps || warning(!1, \"%s has a method called componentDidReceiveProps(). But there is no such lifecycle method. If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate().\", name), \n                \"function\" != typeof instance.componentWillRecieveProps || warning(!1, \"%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?\", name), \n                \"function\" != typeof instance.UNSAFE_componentWillRecieveProps || warning(!1, \"%s has a method called UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?\", name);\n                var hasMutatedProps = instance.props !== workInProgress.pendingProps;\n                void 0 !== instance.props && hasMutatedProps && warning(!1, \"%s(...): When calling super() in ` + \"`\"))) + ((`%s` + (\"`\" + `, make sure to pass up the same props that your component's constructor was passed.\", name, name), \n                !instance.defaultProps || warning(!1, \"Setting defaultProps as an instance property on %s is not supported and will be ignored. Instead, define defaultProps as a static property on %s.\", name, name), \n                \"function\" != typeof instance.getSnapshotBeforeUpdate || \"function\" == typeof instance.componentDidUpdate || didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(type) || (didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(type), \n                warning(!1, \"%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). This component defines getSnapshotBeforeUpdate() only.\", getComponentName(workInProgress))), \n                \"function\" != typeof instance.getDerivedStateFromProps || warning(!1, \"%s: getDerivedStateFromProps() is defined as an instance method and will be ignored. Instead, declare it as a static method.\", name), \n                \"function\" != typeof instance.getDerivedStateFromCatch || warning(!1, \"%s: getDerivedStateFromCatch() is defined as an instance method and will be ignored. Instead, declare it as a static method.\", name), \n                \"function\" != typeof type.getSnapshotBeforeUpdate || warning(!1, \"%s: getSnapshotBeforeUpdate() is defined as a static method and will be ignored. Instead, declare it as an instance method.\", name);\n                var _state = instance.state;\n                _state && (\"object\" != typeof _state || isArray(_state)) && warning(!1, \"%s.state: must be set to an object or null\", name), \n                \"function\" == typeof instance.getChildContext && \"object\" != typeof type.childContextTypes && warning(!1, \"%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().\", name);\n            }\n            function adoptClassInstance(workInProgress, instance) {\n                instance.updater = classComponentUpdater, workInProgress.stateNode = instance, set(instance, workInProgress), \n                instance._reactInternalInstance = fakeInternalInstance;\n            }\n            function constructClassInstance(workInProgress, props, renderExpirationTime) {\n                var ctor = workInProgress.type, unmaskedContext = getUnmaskedContext(workInProgress), needsContext = isContextConsumer(workInProgress), context = needsContext ? getMaskedContext(workInProgress, unmaskedContext) : emptyObject;\n                (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) && new ctor(props, context);\n                var instance = new ctor(props, context), state = workInProgress.memoizedState = null !== instance.state && void 0 !== instance.state ? instance.state : null;\n                if (adoptClassInstance(workInProgress, instance), \"function\" == typeof ctor.getDerivedStateFromProps && null === state) {\n                    var componentName = getComponentName(workInProgress) || \"Component\";\n                    didWarnAboutUninitializedState.has(componentName) || (didWarnAboutUninitializedState.add(componentName), \n                    warning(!1, \"%s: Did not properly initialize state during construction. Expected state to be an object, but it was %s.\", componentName, null === instance.state ? \"null\" : \"undefined\"));\n                }\n                if (\"function\" == typeof ctor.getDerivedStateFromProps || \"function\" == typeof instance.getSnapshotBeforeUpdate) {\n                    var foundWillMountName = null, foundWillReceivePropsName = null, foundWillUpdateName = null;\n                    if (\"function\" == typeof instance.componentWillMount && !0 !== instance.componentWillMount.__suppressDeprecationWarning ? foundWillMountName = \"componentWillMount\" : \"function\" == typeof instance.UNSAFE_componentWillMount && (foundWillMountName = \"UNSAFE_componentWillMount\"), \n                    \"function\" == typeof instance.componentWillReceiveProps && !0 !== instance.componentWillReceiveProps.__suppressDeprecationWarning ? foundWillReceivePropsName = \"componentWillReceiveProps\" : \"function\" == typeof instance.UNSAFE_componentWillReceiveProps && (foundWillReceivePropsName = \"UNSAFE_componentWillReceiveProps\"), \n                    \"function\" == typeof instance.componentWillUpdate && !0 !== instance.componentWillUpdate.__suppressDeprecationWarning ? foundWillUpdateName = \"componentWillUpdate\" : \"function\" == typeof instance.UNSAFE_componentWillUpdate && (foundWillUpdateName = \"UNSAFE_componentWillUpdate\"), \n                    null !== foundWillMountName || null !== foundWillReceivePropsName || null !== foundWillUpdateName) {\n                        var _componentName = getComponentName(workInProgress) || \"Component\", newApiName = \"function\" == typeof ctor.getDerivedStateFromProps ? \"getDerivedStateFromProps()\" : \"getSnapshotBeforeUpdate()\";\n                        didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName) || (didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName), \n                        warning(!1, \"Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n%s uses %s but also contains the following legacy lifecycles:%s%s%s\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\nhttps://fb.me/react-async-component-lifecycle-hooks\", _componentName, newApiName, null !== foundWillMountName ? \"\\n  \" + foundWillMountName : \"\", null !== foundWillReceivePropsName ? \"\\n  \" + foundWillReceivePropsName : \"\", null !== foundWillUpdateName ? \"\\n  \" + foundWillUpdateName : \"\"));\n                    }\n                }\n                return needsContext && cacheContext(workInProgress, unmaskedContext, context), instance;\n            }\n            function callComponentWillMount(workInProgress, instance) {\n                startPhaseTimer(workInProgress, \"componentWillMount\");\n                var oldState = instance.state;\n                \"function\" == typeof instance.componentWillMount && instance.componentWillMount(), \n                \"function\" == typeof instance.UNSAFE_componentWillMount && instance.UNSAFE_componentWillMount(), \n                stopPhaseTimer(), oldState !== instance.state && (warning(!1, \"%s.componentWillMount(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.\", getComponentName(workInProgress) || \"Component\"), \n                classComponentUpdater.enqueueReplaceState(instance, instance.state, null));\n            }\n            function callComponentWillReceiveProps(workInProgress, instance, newProps, newContext) {\n                var oldState = instance.state;\n                if (startPhaseTimer(workInProgress, \"componentWillReceiveProps\"), \"function\" == typeof instance.componentWillReceiveProps && instance.componentWillReceiveProps(newProps, newContext), \n                \"function\" == typeof instance.UNSAFE_componentWillReceiveProps && instance.UNSAFE_componentWillReceiveProps(newProps, newContext), \n                stopPhaseTimer(), instance.state !== oldState) {\n                    var componentName = getComponentName(workInProgress) || \"Component\";\n                    didWarnAboutStateAssignmentForComponent.has(componentName) || (didWarnAboutStateAssignmentForComponent.add(componentName), \n                    warning(!1, \"%s.componentWillReceiveProps(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.\", componentName)), \n                    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n                }\n            }\n            function mountClassInstance(workInProgress, renderExpirationTime) {\n                var ctor = workInProgress.type;\n                checkClassInstance(workInProgress);\n                var instance = workInProgress.stateNode, props = workInProgress.pendingProps, unmaskedContext = getUnmaskedContext(workInProgress);\n                instance.props = props, instance.state = workInProgress.memoizedState, instance.refs = emptyObject, \n                instance.context = getMaskedContext(workInProgress, unmaskedContext), workInProgress.mode & StrictMode && (ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance), \n                ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance)), warnAboutDeprecatedLifecycles && ReactStrictModeWarnings.recordDeprecationWarnings(workInProgress, instance);\n                var updateQueue = workInProgress.updateQueue;\n                null !== updateQueue && (processUpdateQueue(workInProgress, updateQueue, props, instance, renderExpirationTime), \n                instance.state = workInProgress.memoizedState);\n                var getDerivedStateFromProps = workInProgress.type.getDerivedStateFromProps;\n                \"function\" == typeof getDerivedStateFromProps && (applyDerivedStateFromProps(workInProgress, getDerivedStateFromProps, props), \n                instance.state = workInProgress.memoizedState), \"function\" == typeof ctor.getDerivedStateFromProps || \"function\" == typeof instance.getSnapshotBeforeUpdate || \"function\" != typeof instance.UNSAFE_componentWillMount && \"function\" != typeof instance.componentWillMount || (callComponentWillMount(workInProgress, instance), \n                null !== (updateQueue = workInProgress.updateQueue) && (processUpdateQueue(workInProgress, updateQueue, props, instance, renderExpirationTime), \n                instance.state = workInProgress.memoizedState)), \"function\" == typeof instance.componentDidMount && (workInProgress.effectTag |= Update);\n            }\n            function resumeMountClassInstance(workInProgress, renderExpirationTime) {\n                var ctor = workInProgress.type, instance = workInProgress.stateNode, oldProps = workInProgress.memoizedProps, newProps = workInProgress.pendingProps;\n                instance.props = oldProps;\n                var oldContext = instance.context, newUnmaskedContext = getUnmaskedContext(workInProgress), newContext = getMaskedContext(workInProgress, newUnmaskedContext), getDerivedStateFromProps = ctor.getDerivedStateFromProps, hasNewLifecycles = \"function\" == typeof getDerivedStateFromProps || \"function\" == typeof instance.getSnapshotBeforeUpdate;\n                hasNewLifecycles || \"function\" != typeof instance.UNSAFE_componentWillReceiveProps && \"function\" != typeof instance.componentWillReceiveProps || oldProps === newProps && oldContext === newContext || callComponentWillReceiveProps(workInProgress, instance, newProps, newContext), \n                resetHasForceUpdateBeforeProcessing();\n                var oldState = workInProgress.memoizedState, newState = instance.state = oldState, updateQueue = workInProgress.updateQueue;\n                if (null !== updateQueue && (processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime), \n                newState = workInProgress.memoizedState), oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) return \"function\" == typeof instance.componentDidMount && (workInProgress.effectTag |= Update), \n                !1;\n                \"function\" == typeof getDerivedStateFromProps && (applyDerivedStateFromProps(workInProgress, getDerivedStateFromProps, newProps), \n                newState = workInProgress.memoizedState);\n                var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, oldProps, newProps, oldState, newState, newContext);\n                return shouldUpdate ? (hasNewLifecycles || \"function\" != typeof instance.UNSAFE_componentWillMount && \"function\" != typeof instance.componentWillMount || (startPhaseTimer(workInProgress, \"componentWillMount\"), \n                \"function\" == typeof instance.componentWillMount && instance.componentWillMount(), \n                \"function\" == typeof instance.UNSAFE_componentWillMount && instance.UNSAFE_componentWillMount(), \n                stopPhaseTimer()), \"function\" == typeof instance.componentDidMount && (workInProgress.effectTag |= Update)) : (\"function\" == typeof instance.componentDidMount && (workInProgress.effectTag |= Update), \n                workInProgress.memoizedProps = newProps, workInProgress.memoizedState = newState), \n                instance.props = newProps, instance.state = newState, instance.context = newContext, \n                shouldUpdate;\n            }\n            function updateClassInstance(current, workInProgress, renderExpirationTime) {\n                var ctor = workInProgress.type, instance = workInProgress.stateNode, oldProps = workInProgress.memoizedProps, newProps = workInProgress.pendingProps;\n                instance.props = oldProps;\n                var oldContext = instance.context, newUnmaskedContext = getUnmaskedContext(workInProgress), newContext = getMaskedContext(workInProgress, newUnmaskedContext), getDerivedStateFromProps = ctor.getDerivedStateFromProps, hasNewLifecycles = \"function\" == typeof getDerivedStateFromProps || \"function\" == typeof instance.getSnapshotBeforeUpdate;\n                hasNewLifecycles || \"function\" != typeof instance.UNSAFE_componentWillReceiveProps && \"function\" != typeof instance.componentWillReceiveProps || oldProps === newProps && oldContext === newContext || callComponentWillReceiveProps(workInProgress, instance, newProps, newContext), \n                resetHasForceUpdateBeforeProcessing();\n                var oldState = workInProgress.memoizedState, newState = instance.state = oldState, updateQueue = workInProgress.updateQueue;\n                if (null !== updateQueue && (processUpdateQueue(workInProgress, updateQueue, newProps, instance, renderExpirationTime), \n                newState = workInProgress.memoizedState), oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) return \"function\" == typeof instance.componentDidUpdate && (oldProps === current.memoizedProps && oldState === current.memoizedState || (workInProgress.effectTag |= Update)), \n                \"function\" == typeof instance.getSnapshotBeforeUpdate && (oldProps === current.memoizedProps && oldState === current.memoizedState || (workInProgress.effectTag |= Snapshot)), \n                !1;\n                \"function\" == typeof getDerivedStateFromProps && (fireGetDerivedStateFromPropsOnStateUpdates || oldProps !== newProps) && (applyDerivedStateFromProps(workInProgress, getDerivedStateFromProps, newProps), \n                newState = workInProgress.memoizedState);\n                var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, oldProps, newProps, oldState, newState, newContext);\n                return shouldUpdate ? (hasNewLifecycles || \"function\" != typeof instance.UNSAFE_componentWillUpdate && \"function\" != typeof instance.componentWillUpdate || (startPhaseTimer(workInProgress, \"componentWillUpdate\"), \n                \"function\" == typeof instance.componentWillUpdate && instance.componentWillUpdate(newProps, newState, newContext), \n                \"function\" == typeof instance.UNSAFE_componentWillUpdate && instance.UNSAFE_componentWillUpdate(newProps, newState, newContext), \n                stopPhaseTimer()), \"function\" == typeof instance.componentDidUpdate && (workInProgress.effectTag |= Update), \n                \"function\" == typeof instance.getSnapshotBeforeUpdate && (workInProgress.effectTag |= Snapshot)) : (\"function\" == typeof instance.componentDidUpdate && (oldProps === current.memoizedProps && oldState === current.memoizedState || (workInProgress.effectTag |= Update)), \n                \"function\" == typeof instance.getSnapshotBeforeUpdate && (oldProps === current.memoizedProps && oldState === current.memoizedState || (workInProgress.effectTag |= Snapshot)), \n                workInProgress.memoizedProps = newProps, workInProgress.memoizedState = newState), \n                instance.props = newProps, instance.state = newState, instance.context = newContext, \n                shouldUpdate;\n            }\n            function coerceRef(returnFiber, current, element) {\n                var mixedRef = element.ref;\n                if (null !== mixedRef && \"function\" != typeof mixedRef && \"object\" != typeof mixedRef) {\n                    if (returnFiber.mode & StrictMode) {\n                        var componentName = getComponentName(returnFiber) || \"Component\";\n                        didWarnAboutStringRefInStrictMode[componentName] || (warning(!1, 'A string ref, \"%s\", has been found within a strict mode tree. String refs are a source of potential bugs and should be avoided. We recommend using createRef() instead.\\n%s\\n\\nLearn more about using refs safely here:\\nhttps://fb.me/react-strict-mode-string-ref', mixedRef, getStackAddendumByWorkInProgressFiber(returnFiber)), \n                        didWarnAboutStringRefInStrictMode[componentName] = !0);\n                    }\n                    if (element._owner) {\n                        var owner = element._owner, inst = void 0;\n                        if (owner) {\n                            var ownerFiber = owner;\n                            ownerFiber.tag !== ClassComponent && invariant(!1, \"Stateless function components cannot have refs.\"), \n                            inst = ownerFiber.stateNode;\n                        }\n                        inst || invariant(!1, \"Missing owner for string ref %s. This error is likely caused by a bug in React. Please file an issue.\", mixedRef);\n                        var stringRef = \"\" + mixedRef;\n                        if (null !== current && null !== current.ref && \"function\" == typeof current.ref && current.ref._stringRef === stringRef) return current.ref;\n                        var ref = function(value) {\n                            var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;\n                            null === value ? delete refs[stringRef] : refs[stringRef] = value;\n                        };\n                        return ref._stringRef = stringRef, ref;\n                    }\n                    \"string\" != typeof mixedRef && invariant(!1, \"Expected ref to be a function or a string.\"), \n                    element._owner || invariant(!1, \"Element ref was specified as a string (%s) but no owner was set. This could happen for one of the following reasons:\\n1. You may be adding a ref to a functional component\\n2. You may be adding a ref to a component that was not created inside a component's render method\\n3. You have multiple copies of React loaded\\nSee https://fb.me/react-refs-must-have-owner for more information.\", mixedRef);\n                }\n                return mixedRef;\n            }\n            function throwOnInvalidObjectType(returnFiber, newChild) {\n                if (\"textarea\" !== returnFiber.type) {\n                    var addendum = \"\";\n                    addendum = \" If you meant to render a collection of children, use an array instead.\" + (getCurrentFiberStackAddendum$7() || \"\"), \n                    invariant(!1, \"Objects are not valid as a React child (found: %s).%s\", \"[object Object]\" === Object.prototype.toString.call(newChild) ? \"object with keys {\" + Object.keys(newChild).join(\", \") + \"}\" : newChild, addendum);\n                }\n            }\n            function warnOnFunctionType() {\n                var currentComponentErrorInfo = \"Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.\" + (getCurrentFiberStackAddendum$7() || \"\");\n                ownerHasFunctionTypeWarning[currentComponentErrorInfo] || (ownerHasFunctionTypeWarning[currentComponentErrorInfo] = !0, \n                warning(!1, \"Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.%s\", getCurrentFiberStackAddendum$7() || \"\"));\n            }\n            function ChildReconciler(shouldTrackSideEffects) {\n                function deleteChild(returnFiber, childToDelete) {\n                    if (shouldTrackSideEffects) {\n                        var last = returnFiber.lastEffect;\n                        null !== last ? (last.nextEffect = childToDelete, returnFiber.lastEffect = childToDelete) : returnFiber.firstEffect = returnFiber.lastEffect = childToDelete, \n                        childToDelete.nextEffect = null, childToDelete.effectTag = Deletion;\n                    }\n                }\n                function deleteRemainingChildren(returnFiber, currentFirstChild) {\n                    if (!shouldTrackSideEffects) return null;\n                    for (var childToDelete = currentFirstChild; null !== childToDelete; ) deleteChild(returnFiber, childToDelete), \n                    childToDelete = childToDelete.sibling;\n                    return null;\n                }\n                function mapRemainingChildren(returnFiber, currentFirstChild) {\n                    for (var existingChildren = new Map(), existingChild = currentFirstChild; null !== existingChild; ) null !== existingChild.key ? existingChildren.set(existingChild.key, existingChild) : existingChildren.set(existingChild.index, existingChild), \n                    existingChild = existingChild.sibling;\n                    return existingChildren;\n                }\n                function useFiber(fiber, pendingProps, expirationTime) {\n                    var clone = createWorkInProgress(fiber, pendingProps, expirationTime);\n                    return clone.index = 0, clone.sibling = null, clone;\n                }\n                function placeChild(newFiber, lastPlacedIndex, newIndex) {\n                    if (newFiber.index = newIndex, !shouldTrackSideEffects) return lastPlacedIndex;\n                    var current = newFiber.alternate;\n                    if (null !== current) {\n                        var oldIndex = current.index;\n                        return oldIndex < lastPlacedIndex ? (newFiber.effectTag = Placement, lastPlacedIndex) : oldIndex;\n                    }\n                    return newFiber.effectTag = Placement, lastPlacedIndex;\n                }\n                function placeSingleChild(newFiber) {\n                    return shouldTrackSideEffects && null === newFiber.alternate && (newFiber.effectTag = Placement), \n                    newFiber;\n                }\n                function updateTextNode(returnFiber, current, textContent, expirationTime) {\n                    if (null === current || current.tag !== HostText) {\n                        var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n                        return created.return = returnFiber, created;\n                    }\n                    var existing = useFiber(current, textContent, expirationTime);\n                    return existing.return = returnFiber, existing;\n                }\n                function updateElement(returnFiber, current, element, expirationTime) {\n                    if (null !== current && current.type === element.type) {\n                        var existing = useFiber(current, element.props, expirationTime);\n                        return existing.ref = coerceRef(returnFiber, current, element), existing.return = returnFiber, \n                        existing._debugSource = element._source, existing._debugOwner = element._owner, \n                        existing;\n                    }\n                    var created = createFiberFromElement(element, returnFiber.mode, expirationTime);\n                    return created.ref = coerceRef(returnFiber, current, element), created.return = returnFiber, \n                    created;\n                }\n                function updatePortal(returnFiber, current, portal, expirationTime) {\n                    if (null === current || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {\n                        var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n                        return created.return = returnFiber, created;\n                    }\n                    var existing = useFiber(current, portal.children || [], expirationTime);\n                    return existing.return = returnFiber, existing;\n                }\n                function updateFragment(returnFiber, current, fragment, expirationTime, key) {\n                    if (null === current || current.tag !== Fragment) {\n                        var created = createFiberFromFragment(fragment, returnFiber.mode, expirationTime, key);\n                        return created.return = returnFiber, created;\n                    }\n                    var existing = useFiber(current, fragment, expirationTime);\n                    return existing.return = returnFiber, existing;\n                }\n                function createChild(returnFiber, newChild, expirationTime) {\n                    if (\"string\" == typeof newChild || \"number\" == typeof newChild) {\n                        var created = createFiberFromText(\"\" + newChild, returnFiber.mode, expirationTime);\n                        return created.return = returnFiber, created;\n                    }\n                    if (\"object\" == typeof newChild && null !== newChild) {\n                        switch (newChild.$$typeof) {\n                          case REACT_ELEMENT_TYPE:\n                            var _created = createFiberFromElement(newChild, returnFiber.mode, expirationTime);\n                            return _created.ref = coerceRef(returnFiber, null, newChild), _created.return = returnFiber, \n                            _created;\n\n                          case REACT_PORTAL_TYPE:\n                            var _created2 = createFiberFromPortal(newChild, returnFiber.mode, expirationTime);\n                            return _created2.return = returnFiber, _created2;\n                        }\n                        if (isArray$1(newChild) || getIteratorFn(newChild)) {\n                            var _created3 = createFiberFromFragment(newChild, returnFiber.mode, expirationTime, null);\n                            return _created3.return = returnFiber, _created3;\n                        }\n                        throwOnInvalidObjectType(returnFiber, newChild);\n                    }\n                    return \"function\" == typeof newChild && warnOnFunctionType(), null;\n                }\n                function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {\n                    var key = null !== oldFiber ? oldFiber.key : null;\n                    if (\"string\" == typeof newChild || \"number\" == typeof newChild) return null !== key ? null : updateTextNode(returnFiber, oldFiber, \"\" + newChild, expirationTime);\n                    if (\"object\" == typeof newChild && null !== newChild) {\n                        switch (newChild.$$typeof) {\n                          case REACT_ELEMENT_TYPE:\n                            return newChild.key === key ? newChild.type === REACT_FRAGMENT_TYPE ? updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key) : updateElement(returnFiber, oldFiber, newChild, expirationTime) : null;\n\n                          case REACT_PORTAL_TYPE:\n                            return newChild.key === key ? updatePortal(returnFiber, oldFiber, newChild, expirationTime) : null;\n                        }\n                        if (isArray$1(newChild) || getIteratorFn(newChild)) return null !== key ? null : updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);\n                        throwOnInvalidObjectType(returnFiber, newChild);\n                    }\n                    return \"function\" == typeof newChild && warnOnFunctionType(), null;\n                }\n                function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {\n                    if (\"string\" == typeof newChild || \"number\" == typeof newChild) {\n                        return updateTextNode(returnFiber, existingChildren.get(newIdx) || null, \"\" + newChild, expirationTime);\n                    }\n                    if (\"object\" == typeof newChild && null !== newChild) {\n                        switch (newChild.$$typeof) {\n                          case REACT_ELEMENT_TYPE:\n                            var _matchedFiber = existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null;\n                            return newChild.type === REACT_FRAGMENT_TYPE ? updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key) : updateElement(returnFiber, _matchedFiber, newChild, expirationTime);\n\n                          case REACT_PORTAL_TYPE:\n                            return updatePortal(returnFiber, existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null, newChild, expirationTime);\n                        }\n                        if (isArray$1(newChild) || getIteratorFn(newChild)) {\n                            return updateFragment(returnFiber, existingChildren.get(newIdx) || null, newChild, expirationTime, null);\n                        }\n                        throwOnInvalidObjectType(returnFiber, newChild);\n                    }\n                    return \"function\" == typeof newChild && warnOnFunctionType(), null;\n                }\n                function warnOnInvalidKey(child, knownKeys) {\n                    if (\"object\" != typeof child || null === child) return knownKeys;\n                    switch (child.$$typeof) {\n                      case REACT_ELEMENT_TYPE:\n                      case REACT_PORTAL_TYPE:\n                        warnForMissingKey(child);\n                        var key = child.key;\n                        if (\"string\" != typeof key) break;\n                        if (null === knownKeys) {\n                            knownKeys = new Set(), knownKeys.add(key);\n                            break;\n                        }\n                        if (!knownKeys.has(key)) {\n                            knownKeys.add(key);\n                            break;\n                        }\n                        warning(!1, \"Encountered two children with the same key, `)) + (\"`\" + (`%s` + \"`\")))) + (((`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.%s\", key, getCurrentFiberStackAddendum$7());\n                    }\n                    return knownKeys;\n                }\n                function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {\n                    for (var knownKeys = null, i = 0; i < newChildren.length; i++) {\n                        knownKeys = warnOnInvalidKey(newChildren[i], knownKeys);\n                    }\n                    for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, lastPlacedIndex = 0, newIdx = 0, nextOldFiber = null; null !== oldFiber && newIdx < newChildren.length; newIdx++) {\n                        oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling;\n                        var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);\n                        if (null === newFiber) {\n                            null === oldFiber && (oldFiber = nextOldFiber);\n                            break;\n                        }\n                        shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber), \n                        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber, \n                        previousNewFiber = newFiber, oldFiber = nextOldFiber;\n                    }\n                    if (newIdx === newChildren.length) return deleteRemainingChildren(returnFiber, oldFiber), \n                    resultingFirstChild;\n                    if (null === oldFiber) {\n                        for (;newIdx < newChildren.length; newIdx++) {\n                            var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);\n                            _newFiber && (lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx), \n                            null === previousNewFiber ? resultingFirstChild = _newFiber : previousNewFiber.sibling = _newFiber, \n                            previousNewFiber = _newFiber);\n                        }\n                        return resultingFirstChild;\n                    }\n                    for (var existingChildren = mapRemainingChildren(returnFiber, oldFiber); newIdx < newChildren.length; newIdx++) {\n                        var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);\n                        _newFiber2 && (shouldTrackSideEffects && null !== _newFiber2.alternate && existingChildren.delete(null === _newFiber2.key ? newIdx : _newFiber2.key), \n                        lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = _newFiber2 : previousNewFiber.sibling = _newFiber2, \n                        previousNewFiber = _newFiber2);\n                    }\n                    return shouldTrackSideEffects && existingChildren.forEach(function(child) {\n                        return deleteChild(returnFiber, child);\n                    }), resultingFirstChild;\n                }\n                function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {\n                    var iteratorFn = getIteratorFn(newChildrenIterable);\n                    \"function\" != typeof iteratorFn && invariant(!1, \"An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.\"), \n                    newChildrenIterable.entries === iteratorFn && (didWarnAboutMaps || warning(!1, \"Using Maps as children is unsupported and will likely yield unexpected results. Convert it to a sequence/iterable of keyed ReactElements instead.%s\", getCurrentFiberStackAddendum$7()), \n                    didWarnAboutMaps = !0);\n                    var _newChildren = iteratorFn.call(newChildrenIterable);\n                    if (_newChildren) for (var knownKeys = null, _step = _newChildren.next(); !_step.done; _step = _newChildren.next()) {\n                        var child = _step.value;\n                        knownKeys = warnOnInvalidKey(child, knownKeys);\n                    }\n                    var newChildren = iteratorFn.call(newChildrenIterable);\n                    null == newChildren && invariant(!1, \"An iterable object provided no iterator.\");\n                    for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, lastPlacedIndex = 0, newIdx = 0, nextOldFiber = null, step = newChildren.next(); null !== oldFiber && !step.done; newIdx++, \n                    step = newChildren.next()) {\n                        oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling;\n                        var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);\n                        if (null === newFiber) {\n                            oldFiber || (oldFiber = nextOldFiber);\n                            break;\n                        }\n                        shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber), \n                        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber, \n                        previousNewFiber = newFiber, oldFiber = nextOldFiber;\n                    }\n                    if (step.done) return deleteRemainingChildren(returnFiber, oldFiber), resultingFirstChild;\n                    if (null === oldFiber) {\n                        for (;!step.done; newIdx++, step = newChildren.next()) {\n                            var _newFiber3 = createChild(returnFiber, step.value, expirationTime);\n                            null !== _newFiber3 && (lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx), \n                            null === previousNewFiber ? resultingFirstChild = _newFiber3 : previousNewFiber.sibling = _newFiber3, \n                            previousNewFiber = _newFiber3);\n                        }\n                        return resultingFirstChild;\n                    }\n                    for (var existingChildren = mapRemainingChildren(returnFiber, oldFiber); !step.done; newIdx++, \n                    step = newChildren.next()) {\n                        var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);\n                        null !== _newFiber4 && (shouldTrackSideEffects && null !== _newFiber4.alternate && existingChildren.delete(null === _newFiber4.key ? newIdx : _newFiber4.key), \n                        lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx), null === previousNewFiber ? resultingFirstChild = _newFiber4 : previousNewFiber.sibling = _newFiber4, \n                        previousNewFiber = _newFiber4);\n                    }\n                    return shouldTrackSideEffects && existingChildren.forEach(function(child) {\n                        return deleteChild(returnFiber, child);\n                    }), resultingFirstChild;\n                }\n                function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {\n                    if (null !== currentFirstChild && currentFirstChild.tag === HostText) {\n                        deleteRemainingChildren(returnFiber, currentFirstChild.sibling);\n                        var existing = useFiber(currentFirstChild, textContent, expirationTime);\n                        return existing.return = returnFiber, existing;\n                    }\n                    deleteRemainingChildren(returnFiber, currentFirstChild);\n                    var created = createFiberFromText(textContent, returnFiber.mode, expirationTime);\n                    return created.return = returnFiber, created;\n                }\n                function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {\n                    for (var key = element.key, child = currentFirstChild; null !== child; ) {\n                        if (child.key === key) {\n                            if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.type === element.type) {\n                                deleteRemainingChildren(returnFiber, child.sibling);\n                                var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);\n                                return existing.ref = coerceRef(returnFiber, child, element), existing.return = returnFiber, \n                                existing._debugSource = element._source, existing._debugOwner = element._owner, \n                                existing;\n                            }\n                            deleteRemainingChildren(returnFiber, child);\n                            break;\n                        }\n                        deleteChild(returnFiber, child), child = child.sibling;\n                    }\n                    if (element.type === REACT_FRAGMENT_TYPE) {\n                        var created = createFiberFromFragment(element.props.children, returnFiber.mode, expirationTime, element.key);\n                        return created.return = returnFiber, created;\n                    }\n                    var _created4 = createFiberFromElement(element, returnFiber.mode, expirationTime);\n                    return _created4.ref = coerceRef(returnFiber, currentFirstChild, element), _created4.return = returnFiber, \n                    _created4;\n                }\n                function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {\n                    for (var key = portal.key, child = currentFirstChild; null !== child; ) {\n                        if (child.key === key) {\n                            if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {\n                                deleteRemainingChildren(returnFiber, child.sibling);\n                                var existing = useFiber(child, portal.children || [], expirationTime);\n                                return existing.return = returnFiber, existing;\n                            }\n                            deleteRemainingChildren(returnFiber, child);\n                            break;\n                        }\n                        deleteChild(returnFiber, child), child = child.sibling;\n                    }\n                    var created = createFiberFromPortal(portal, returnFiber.mode, expirationTime);\n                    return created.return = returnFiber, created;\n                }\n                function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {\n                    \"object\" == typeof newChild && null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && (newChild = newChild.props.children);\n                    var isObject = \"object\" == typeof newChild && null !== newChild;\n                    if (isObject) switch (newChild.$$typeof) {\n                      case REACT_ELEMENT_TYPE:\n                        return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));\n\n                      case REACT_PORTAL_TYPE:\n                        return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));\n                    }\n                    if (\"string\" == typeof newChild || \"number\" == typeof newChild) return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, \"\" + newChild, expirationTime));\n                    if (isArray$1(newChild)) return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);\n                    if (getIteratorFn(newChild)) return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);\n                    if (isObject && throwOnInvalidObjectType(returnFiber, newChild), \"function\" == typeof newChild && warnOnFunctionType(), \n                    void 0 === newChild) switch (returnFiber.tag) {\n                      case ClassComponent:\n                        if (returnFiber.stateNode.render._isMockFunction) break;\n\n                      case FunctionalComponent:\n                        var Component = returnFiber.type;\n                        invariant(!1, \"%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.\", Component.displayName || Component.name || \"Component\");\n                    }\n                    return deleteRemainingChildren(returnFiber, currentFirstChild);\n                }\n                return reconcileChildFibers;\n            }\n            function cloneChildFibers(current, workInProgress) {\n                if (null !== current && workInProgress.child !== current.child && invariant(!1, \"Resuming work not yet implemented.\"), \n                null !== workInProgress.child) {\n                    var currentChild = workInProgress.child, newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);\n                    for (workInProgress.child = newChild, newChild.return = workInProgress; null !== currentChild.sibling; ) currentChild = currentChild.sibling, \n                    newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime), \n                    newChild.return = workInProgress;\n                    newChild.sibling = null;\n                }\n            }\n            function enterHydrationState(fiber) {\n                if (!supportsHydration) return !1;\n                var parentInstance = fiber.stateNode.containerInfo;\n                return nextHydratableInstance = getFirstHydratableChild(parentInstance), hydrationParentFiber = fiber, \n                isHydrating = !0, !0;\n            }\n            function deleteHydratableInstance(returnFiber, instance) {\n                switch (returnFiber.tag) {\n                  case HostRoot:\n                    didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);\n                    break;\n\n                  case HostComponent:\n                    didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);\n                }\n                var childToDelete = createFiberFromHostInstanceForDeletion();\n                childToDelete.stateNode = instance, childToDelete.return = returnFiber, childToDelete.effectTag = Deletion, \n                null !== returnFiber.lastEffect ? (returnFiber.lastEffect.nextEffect = childToDelete, \n                returnFiber.lastEffect = childToDelete) : returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n            }\n            function insertNonHydratedInstance(returnFiber, fiber) {\n                switch (fiber.effectTag |= Placement, returnFiber.tag) {\n                  case HostRoot:\n                    var parentContainer = returnFiber.stateNode.containerInfo;\n                    switch (fiber.tag) {\n                      case HostComponent:\n                        didNotFindHydratableContainerInstance(parentContainer, fiber.type, fiber.pendingProps);\n                        break;\n\n                      case HostText:\n                        didNotFindHydratableContainerTextInstance(parentContainer, fiber.pendingProps);\n                    }\n                    break;\n\n                  case HostComponent:\n                    var parentType = returnFiber.type, parentProps = returnFiber.memoizedProps, parentInstance = returnFiber.stateNode;\n                    switch (fiber.tag) {\n                      case HostComponent:\n                        didNotFindHydratableInstance(parentType, parentProps, parentInstance, fiber.type, fiber.pendingProps);\n                        break;\n\n                      case HostText:\n                        didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, fiber.pendingProps);\n                    }\n                    break;\n\n                  default:\n                    return;\n                }\n            }\n            function tryHydrate(fiber, nextInstance) {\n                switch (fiber.tag) {\n                  case HostComponent:\n                    var type = fiber.type, props = fiber.pendingProps, instance = canHydrateInstance(nextInstance, type, props);\n                    return null !== instance && (fiber.stateNode = instance, !0);\n\n                  case HostText:\n                    var text = fiber.pendingProps, textInstance = canHydrateTextInstance(nextInstance, text);\n                    return null !== textInstance && (fiber.stateNode = textInstance, !0);\n\n                  default:\n                    return !1;\n                }\n            }\n            function tryToClaimNextHydratableInstance(fiber) {\n                if (isHydrating) {\n                    var nextInstance = nextHydratableInstance;\n                    if (!nextInstance) return insertNonHydratedInstance(hydrationParentFiber, fiber), \n                    isHydrating = !1, void (hydrationParentFiber = fiber);\n                    var firstAttemptedInstance = nextInstance;\n                    if (!tryHydrate(fiber, nextInstance)) {\n                        if (!(nextInstance = getNextHydratableSibling(firstAttemptedInstance)) || !tryHydrate(fiber, nextInstance)) return insertNonHydratedInstance(hydrationParentFiber, fiber), \n                        isHydrating = !1, void (hydrationParentFiber = fiber);\n                        deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance);\n                    }\n                    hydrationParentFiber = fiber, nextHydratableInstance = getFirstHydratableChild(nextInstance);\n                }\n            }\n            function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {\n                supportsHydration || invariant(!1, \"Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.\");\n                var instance = fiber.stateNode, updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber);\n                return fiber.updateQueue = updatePayload, null !== updatePayload;\n            }\n            function prepareToHydrateHostTextInstance(fiber) {\n                supportsHydration || invariant(!1, \"Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.\");\n                var textInstance = fiber.stateNode, textContent = fiber.memoizedProps, shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);\n                if (shouldUpdate) {\n                    var returnFiber = hydrationParentFiber;\n                    if (null !== returnFiber) switch (returnFiber.tag) {\n                      case HostRoot:\n                        didNotMatchHydratedContainerTextInstance(returnFiber.stateNode.containerInfo, textInstance, textContent);\n                        break;\n\n                      case HostComponent:\n                        didNotMatchHydratedTextInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, textInstance, textContent);\n                    }\n                }\n                return shouldUpdate;\n            }\n            function popToNextHostParent(fiber) {\n                for (var parent = fiber.return; null !== parent && parent.tag !== HostComponent && parent.tag !== HostRoot; ) parent = parent.return;\n                hydrationParentFiber = parent;\n            }\n            function popHydrationState(fiber) {\n                if (!supportsHydration) return !1;\n                if (fiber !== hydrationParentFiber) return !1;\n                if (!isHydrating) return popToNextHostParent(fiber), isHydrating = !0, !1;\n                var type = fiber.type;\n                if (fiber.tag !== HostComponent || \"head\" !== type && \"body\" !== type && !shouldSetTextContent(type, fiber.memoizedProps)) for (var nextInstance = nextHydratableInstance; nextInstance; ) deleteHydratableInstance(fiber, nextInstance), \n                nextInstance = getNextHydratableSibling(nextInstance);\n                return popToNextHostParent(fiber), nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null, \n                !0;\n            }\n            function resetHydrationState() {\n                supportsHydration && (hydrationParentFiber = null, nextHydratableInstance = null, \n                isHydrating = !1);\n            }\n            function reconcileChildren(current, workInProgress, nextChildren) {\n                reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, workInProgress.expirationTime);\n            }\n            function reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, renderExpirationTime) {\n                workInProgress.child = null === current ? mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime) : reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);\n            }\n            function updateForwardRef(current, workInProgress) {\n                var render = workInProgress.type.render, nextProps = workInProgress.pendingProps, ref = workInProgress.ref;\n                if (hasContextChanged()) ; else if (workInProgress.memoizedProps === nextProps) {\n                    var currentRef = null !== current ? current.ref : null;\n                    if (ref === currentRef) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                }\n                var nextChildren = void 0;\n                return ReactCurrentOwner.current = workInProgress, ReactDebugCurrentFiber.setCurrentPhase(\"render\"), \n                nextChildren = render(nextProps, ref), ReactDebugCurrentFiber.setCurrentPhase(null), \n                reconcileChildren(current, workInProgress, nextChildren), memoizeProps(workInProgress, nextProps), \n                workInProgress.child;\n            }\n            function updateFragment(current, workInProgress) {\n                var nextChildren = workInProgress.pendingProps;\n                if (hasContextChanged()) ; else if (workInProgress.memoizedProps === nextChildren) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                return reconcileChildren(current, workInProgress, nextChildren), memoizeProps(workInProgress, nextChildren), \n                workInProgress.child;\n            }\n            function updateMode(current, workInProgress) {\n                var nextChildren = workInProgress.pendingProps.children;\n                if (hasContextChanged()) ; else if (null === nextChildren || workInProgress.memoizedProps === nextChildren) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                return reconcileChildren(current, workInProgress, nextChildren), memoizeProps(workInProgress, nextChildren), \n                workInProgress.child;\n            }\n            function updateProfiler(current, workInProgress) {\n                var nextProps = workInProgress.pendingProps;\n                return enableProfilerTimer && (markActualRenderTimeStarted(workInProgress), workInProgress.effectTag |= Update), \n                workInProgress.memoizedProps === nextProps ? bailoutOnAlreadyFinishedWork(current, workInProgress) : (reconcileChildren(current, workInProgress, nextProps.children), \n                memoizeProps(workInProgress, nextProps), workInProgress.child);\n            }\n            function markRef(current, workInProgress) {\n                var ref = workInProgress.ref;\n                (null === current && null !== ref || null !== current && current.ref !== ref) && (workInProgress.effectTag |= Ref);\n            }\n            function updateFunctionalComponent(current, workInProgress) {\n                var fn = workInProgress.type, nextProps = workInProgress.pendingProps;\n                if (hasContextChanged()) ; else if (workInProgress.memoizedProps === nextProps) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                var unmaskedContext = getUnmaskedContext(workInProgress), context = getMaskedContext(workInProgress, unmaskedContext), nextChildren = void 0;\n                return ReactCurrentOwner.current = workInProgress, ReactDebugCurrentFiber.setCurrentPhase(\"render\"), \n                nextChildren = fn(nextProps, context), ReactDebugCurrentFiber.setCurrentPhase(null), \n                workInProgress.effectTag |= PerformedWork, reconcileChildren(current, workInProgress, nextChildren), \n                memoizeProps(workInProgress, nextProps), workInProgress.child;\n            }\n            function updateClassComponent(current, workInProgress, renderExpirationTime) {\n                var hasContext = pushContextProvider(workInProgress), shouldUpdate = void 0;\n                return null === current ? null === workInProgress.stateNode ? (constructClassInstance(workInProgress, workInProgress.pendingProps, renderExpirationTime), \n                mountClassInstance(workInProgress, renderExpirationTime), shouldUpdate = !0) : shouldUpdate = resumeMountClassInstance(workInProgress, renderExpirationTime) : shouldUpdate = updateClassInstance(current, workInProgress, renderExpirationTime), \n                finishClassComponent(current, workInProgress, shouldUpdate, hasContext, renderExpirationTime);\n            }\n            function finishClassComponent(current, workInProgress, shouldUpdate, hasContext, renderExpirationTime) {\n                markRef(current, workInProgress);\n                var didCaptureError = (workInProgress.effectTag & DidCapture) !== NoEffect;\n                if (!shouldUpdate && !didCaptureError) return hasContext && invalidateContextProvider(workInProgress, !1), \n                bailoutOnAlreadyFinishedWork(current, workInProgress);\n                var ctor = workInProgress.type, instance = workInProgress.stateNode;\n                ReactCurrentOwner.current = workInProgress;\n                var nextChildren = void 0;\n                return !didCaptureError || enableGetDerivedStateFromCatch && \"function\" == typeof ctor.getDerivedStateFromCatch ? (ReactDebugCurrentFiber.setCurrentPhase(\"render\"), \n                nextChildren = instance.render(), (debugRenderPhaseSideEffects || debugRenderPhaseSideEffectsForStrictMode && workInProgress.mode & StrictMode) && instance.render(), \n                ReactDebugCurrentFiber.setCurrentPhase(null)) : (nextChildren = null, enableProfilerTimer && stopBaseRenderTimerIfRunning()), \n                workInProgress.effectTag |= PerformedWork, didCaptureError && (reconcileChildrenAtExpirationTime(current, workInProgress, null, renderExpirationTime), \n                workInProgress.child = null), reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, renderExpirationTime), \n                memoizeState(workInProgress, instance.state), memoizeProps(workInProgress, instance.props), \n                hasContext && invalidateContextProvider(workInProgress, !0), workInProgress.child;\n            }\n            function pushHostRootContext(workInProgress) {\n                var root = workInProgress.stateNode;\n                root.pendingContext ? pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context) : root.context && pushTopLevelContextObject(workInProgress, root.context, !1), \n                pushHostContainer(workInProgress, root.containerInfo);\n            }\n            function updateHostRoot(current, workInProgress, renderExpirationTime) {\n                pushHostRootContext(workInProgress);\n                var updateQueue = workInProgress.updateQueue;\n                if (null !== updateQueue) {\n                    var nextProps = workInProgress.pendingProps, prevState = workInProgress.memoizedState, prevChildren = null !== prevState ? prevState.element : null;\n                    processUpdateQueue(workInProgress, updateQueue, nextProps, null, renderExpirationTime);\n                    var nextState = workInProgress.memoizedState, nextChildren = nextState.element;\n                    if (nextChildren === prevChildren) return resetHydrationState(), bailoutOnAlreadyFinishedWork(current, workInProgress);\n                    var root = workInProgress.stateNode;\n                    return (null === current || null === current.child) && root.hydrate && enterHydrationState(workInProgress) ? (workInProgress.effectTag |= Placement, \n                    workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime)) : (resetHydrationState(), \n                    reconcileChildren(current, workInProgress, nextChildren)), workInProgress.child;\n                }\n                return resetHydrationState(), bailoutOnAlreadyFinishedWork(current, workInProgress);\n            }\n            function updateHostComponent(current, workInProgress, renderExpirationTime) {\n                pushHostContext(workInProgress), null === current && tryToClaimNextHydratableInstance(workInProgress);\n                var type = workInProgress.type, memoizedProps = workInProgress.memoizedProps, nextProps = workInProgress.pendingProps, prevProps = null !== current ? current.memoizedProps : null;\n                if (hasContextChanged()) ; else if (memoizedProps === nextProps) {\n                    var isHidden = workInProgress.mode & AsyncMode && shouldDeprioritizeSubtree(type, nextProps);\n                    if (isHidden && (workInProgress.expirationTime = Never), !isHidden || renderExpirationTime !== Never) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                }\n                var nextChildren = nextProps.children;\n                return shouldSetTextContent(type, nextProps) ? nextChildren = null : prevProps && shouldSetTextContent(type, prevProps) && (workInProgress.effectTag |= ContentReset), \n                markRef(current, workInProgress), renderExpirationTime !== Never && workInProgress.mode & AsyncMode && shouldDeprioritizeSubtree(type, nextProps) ? (workInProgress.expirationTime = Never, \n                workInProgress.memoizedProps = nextProps, null) : (reconcileChildren(current, workInProgress, nextChildren), \n                memoizeProps(workInProgress, nextProps), workInProgress.child);\n            }\n            function updateHostText(current, workInProgress) {\n                return null === current && tryToClaimNextHydratableInstance(workInProgress), memoizeProps(workInProgress, workInProgress.pendingProps), \n                null;\n            }\n            function mountIndeterminateComponent(current, workInProgress, renderExpirationTime) {\n                null !== current && invariant(!1, \"An indeterminate component should never have mounted. This error is likely caused by a bug in React. Please file an issue.\");\n                var fn = workInProgress.type, props = workInProgress.pendingProps, unmaskedContext = getUnmaskedContext(workInProgress), context = getMaskedContext(workInProgress, unmaskedContext), value = void 0;\n                if (fn.prototype && \"function\" == typeof fn.prototype.render) {\n                    var componentName = getComponentName(workInProgress) || \"Unknown\";\n                    didWarnAboutBadClass[componentName] || (warning(!1, \"The <%s /> component appears to have a render method, but doesn't extend React.Component. This is likely to cause errors. Change %s to extend React.Component instead.\", componentName, componentName), \n                    didWarnAboutBadClass[componentName] = !0);\n                }\n                if (workInProgress.mode & StrictMode && ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null), \n                ReactCurrentOwner.current = workInProgress, value = fn(props, context), workInProgress.effectTag |= PerformedWork, \n                \"object\" == typeof value && null !== value && \"function\" == typeof value.render && void 0 === value.$$typeof) {\n                    var Component = workInProgress.type;\n                    workInProgress.tag = ClassComponent, workInProgress.memoizedState = null !== value.state && void 0 !== value.state ? value.state : null;\n                    var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n                    \"function\" == typeof getDerivedStateFromProps && applyDerivedStateFromProps(workInProgress, getDerivedStateFromProps, props);\n                    var hasContext = pushContextProvider(workInProgress);\n                    return adoptClassInstance(workInProgress, value), mountClassInstance(workInProgress, renderExpirationTime), \n                    finishClassComponent(current, workInProgress, !0, hasContext, renderExpirationTime);\n                }\n                workInProgress.tag = FunctionalComponent;\n                var _Component = workInProgress.type;\n                if (_Component && _Component.childContextTypes && warning(!1, \"%s(...): childContextTypes cannot be defined on a functional component.\", _Component.displayName || _Component.name || \"Component\"), \n                null !== workInProgress.ref) {\n                    var info = \"\", ownerName = ReactDebugCurrentFiber.getCurrentFiberOwnerName();\n                    ownerName && (info += \"\\n\\nCheck the render method of ` + (\"`\" + `\" + ownerName + \"`)) + (\"`\" + (`.\");\n                    var warningKey = ownerName || workInProgress._debugID || \"\", debugSource = workInProgress._debugSource;\n                    debugSource && (warningKey = debugSource.fileName + \":\" + debugSource.lineNumber), \n                    didWarnAboutStatelessRefs[warningKey] || (didWarnAboutStatelessRefs[warningKey] = !0, \n                    warning(!1, \"Stateless function components cannot be given refs. Attempts to access this ref will fail.%s%s\", info, ReactDebugCurrentFiber.getCurrentFiberStackAddendum()));\n                }\n                if (\"function\" == typeof fn.getDerivedStateFromProps) {\n                    var _componentName = getComponentName(workInProgress) || \"Unknown\";\n                    didWarnAboutGetDerivedStateOnFunctionalComponent[_componentName] || (warning(!1, \"%s: Stateless functional components do not support getDerivedStateFromProps.\", _componentName), \n                    didWarnAboutGetDerivedStateOnFunctionalComponent[_componentName] = !0);\n                }\n                return reconcileChildren(current, workInProgress, value), memoizeProps(workInProgress, props), \n                workInProgress.child;\n            }\n            function updateTimeoutComponent(current, workInProgress, renderExpirationTime) {\n                if (enableSuspense) {\n                    var nextProps = workInProgress.pendingProps, prevProps = workInProgress.memoizedProps, prevDidTimeout = workInProgress.memoizedState, alreadyCaptured = (workInProgress.effectTag & DidCapture) === NoEffect, nextDidTimeout = !alreadyCaptured;\n                    if (hasContextChanged()) ; else if (nextProps === prevProps && nextDidTimeout === prevDidTimeout) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                    var render = nextProps.children, nextChildren = render(nextDidTimeout);\n                    return workInProgress.memoizedProps = nextProps, workInProgress.memoizedState = nextDidTimeout, \n                    reconcileChildren(current, workInProgress, nextChildren), workInProgress.child;\n                }\n                return null;\n            }\n            function updatePortalComponent(current, workInProgress, renderExpirationTime) {\n                pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n                var nextChildren = workInProgress.pendingProps;\n                if (hasContextChanged()) ; else if (workInProgress.memoizedProps === nextChildren) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                return null === current ? (workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime), \n                memoizeProps(workInProgress, nextChildren)) : (reconcileChildren(current, workInProgress, nextChildren), \n                memoizeProps(workInProgress, nextChildren)), workInProgress.child;\n            }\n            function propagateContextChange(workInProgress, context, changedBits, renderExpirationTime) {\n                var fiber = workInProgress.child;\n                for (null !== fiber && (fiber.return = workInProgress); null !== fiber; ) {\n                    var nextFiber = void 0;\n                    switch (fiber.tag) {\n                      case ContextConsumer:\n                        var observedBits = 0 | fiber.stateNode;\n                        if (fiber.type === context && 0 != (observedBits & changedBits)) {\n                            for (var node = fiber; null !== node; ) {\n                                var alternate = node.alternate;\n                                if (node.expirationTime === NoWork || node.expirationTime > renderExpirationTime) node.expirationTime = renderExpirationTime, \n                                null !== alternate && (alternate.expirationTime === NoWork || alternate.expirationTime > renderExpirationTime) && (alternate.expirationTime = renderExpirationTime); else {\n                                    if (null === alternate || !(alternate.expirationTime === NoWork || alternate.expirationTime > renderExpirationTime)) break;\n                                    alternate.expirationTime = renderExpirationTime;\n                                }\n                                node = node.return;\n                            }\n                            nextFiber = null;\n                        } else nextFiber = fiber.child;\n                        break;\n\n                      case ContextProvider:\n                        nextFiber = fiber.type === workInProgress.type ? null : fiber.child;\n                        break;\n\n                      default:\n                        nextFiber = fiber.child;\n                    }\n                    if (null !== nextFiber) nextFiber.return = fiber; else for (nextFiber = fiber; null !== nextFiber; ) {\n                        if (nextFiber === workInProgress) {\n                            nextFiber = null;\n                            break;\n                        }\n                        var sibling = nextFiber.sibling;\n                        if (null !== sibling) {\n                            sibling.return = nextFiber.return, nextFiber = sibling;\n                            break;\n                        }\n                        nextFiber = nextFiber.return;\n                    }\n                    fiber = nextFiber;\n                }\n            }\n            function updateContextProvider(current, workInProgress, renderExpirationTime) {\n                var providerType = workInProgress.type, context = providerType._context, newProps = workInProgress.pendingProps, oldProps = workInProgress.memoizedProps, canBailOnProps = !0;\n                if (hasContextChanged()) canBailOnProps = !1; else if (oldProps === newProps) return workInProgress.stateNode = 0, \n                pushProvider(workInProgress), bailoutOnAlreadyFinishedWork(current, workInProgress);\n                var newValue = newProps.value;\n                workInProgress.memoizedProps = newProps;\n                var providerPropTypes = workInProgress.type.propTypes;\n                providerPropTypes && checkPropTypes(providerPropTypes, newProps, \"prop\", \"Context.Provider\", getCurrentFiberStackAddendum$6);\n                var changedBits = void 0;\n                if (null === oldProps) changedBits = MAX_SIGNED_31_BIT_INT; else if (oldProps.value === newProps.value) {\n                    if (oldProps.children === newProps.children && canBailOnProps) return workInProgress.stateNode = 0, \n                    pushProvider(workInProgress), bailoutOnAlreadyFinishedWork(current, workInProgress);\n                    changedBits = 0;\n                } else {\n                    var oldValue = oldProps.value;\n                    if (oldValue === newValue && (0 !== oldValue || 1 / oldValue == 1 / newValue) || oldValue !== oldValue && newValue !== newValue) {\n                        if (oldProps.children === newProps.children && canBailOnProps) return workInProgress.stateNode = 0, \n                        pushProvider(workInProgress), bailoutOnAlreadyFinishedWork(current, workInProgress);\n                        changedBits = 0;\n                    } else if (changedBits = \"function\" == typeof context._calculateChangedBits ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT, \n                    (changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits && warning(!1, \"calculateChangedBits: Expected the return value to be a 31-bit integer. Instead received: %s\", changedBits), \n                    0 === (changedBits |= 0)) {\n                        if (oldProps.children === newProps.children && canBailOnProps) return workInProgress.stateNode = 0, \n                        pushProvider(workInProgress), bailoutOnAlreadyFinishedWork(current, workInProgress);\n                    } else propagateContextChange(workInProgress, context, changedBits, renderExpirationTime);\n                }\n                return workInProgress.stateNode = changedBits, pushProvider(workInProgress), reconcileChildren(current, workInProgress, newProps.children), \n                workInProgress.child;\n            }\n            function updateContextConsumer(current, workInProgress, renderExpirationTime) {\n                var context = workInProgress.type, newProps = workInProgress.pendingProps, oldProps = workInProgress.memoizedProps, newValue = getContextCurrentValue(context), changedBits = getContextChangedBits(context);\n                if (hasContextChanged()) ; else if (0 === changedBits && oldProps === newProps) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                workInProgress.memoizedProps = newProps;\n                var observedBits = newProps.unstable_observedBits;\n                if (void 0 !== observedBits && null !== observedBits || (observedBits = MAX_SIGNED_31_BIT_INT), \n                workInProgress.stateNode = observedBits, 0 != (changedBits & observedBits)) propagateContextChange(workInProgress, context, changedBits, renderExpirationTime); else if (oldProps === newProps) return bailoutOnAlreadyFinishedWork(current, workInProgress);\n                var render = newProps.children;\n                \"function\" != typeof render && warning(!1, \"A context consumer was rendered with multiple children, or a child that isn't a function. A context consumer expects a single child that is a function. If you did pass a function, make sure there is no trailing or leading whitespace around it.\");\n                var newChildren = void 0;\n                return ReactCurrentOwner.current = workInProgress, ReactDebugCurrentFiber.setCurrentPhase(\"render\"), \n                newChildren = render(newValue), ReactDebugCurrentFiber.setCurrentPhase(null), workInProgress.effectTag |= PerformedWork, \n                reconcileChildren(current, workInProgress, newChildren), workInProgress.child;\n            }\n            function bailoutOnAlreadyFinishedWork(current, workInProgress) {\n                return cancelWorkTimer(workInProgress), enableProfilerTimer && stopBaseRenderTimerIfRunning(), \n                cloneChildFibers(current, workInProgress), workInProgress.child;\n            }\n            function bailoutOnLowPriority(current, workInProgress) {\n                switch (cancelWorkTimer(workInProgress), enableProfilerTimer && stopBaseRenderTimerIfRunning(), \n                workInProgress.tag) {\n                  case HostRoot:\n                    pushHostRootContext(workInProgress);\n                    break;\n\n                  case ClassComponent:\n                    pushContextProvider(workInProgress);\n                    break;\n\n                  case HostPortal:\n                    pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n                    break;\n\n                  case ContextProvider:\n                    pushProvider(workInProgress);\n                    break;\n\n                  case Profiler:\n                    enableProfilerTimer && markActualRenderTimeStarted(workInProgress);\n                }\n                return null;\n            }\n            function memoizeProps(workInProgress, nextProps) {\n                workInProgress.memoizedProps = nextProps;\n            }\n            function memoizeState(workInProgress, nextState) {\n                workInProgress.memoizedState = nextState;\n            }\n            function beginWork(current, workInProgress, renderExpirationTime) {\n                if (workInProgress.expirationTime === NoWork || workInProgress.expirationTime > renderExpirationTime) return bailoutOnLowPriority(current, workInProgress);\n                switch (workInProgress.tag) {\n                  case IndeterminateComponent:\n                    return mountIndeterminateComponent(current, workInProgress, renderExpirationTime);\n\n                  case FunctionalComponent:\n                    return updateFunctionalComponent(current, workInProgress);\n\n                  case ClassComponent:\n                    return updateClassComponent(current, workInProgress, renderExpirationTime);\n\n                  case HostRoot:\n                    return updateHostRoot(current, workInProgress, renderExpirationTime);\n\n                  case HostComponent:\n                    return updateHostComponent(current, workInProgress, renderExpirationTime);\n\n                  case HostText:\n                    return updateHostText(current, workInProgress);\n\n                  case TimeoutComponent:\n                    return updateTimeoutComponent(current, workInProgress, renderExpirationTime);\n\n                  case HostPortal:\n                    return updatePortalComponent(current, workInProgress, renderExpirationTime);\n\n                  case ForwardRef:\n                    return updateForwardRef(current, workInProgress);\n\n                  case Fragment:\n                    return updateFragment(current, workInProgress);\n\n                  case Mode:\n                    return updateMode(current, workInProgress);\n\n                  case Profiler:\n                    return updateProfiler(current, workInProgress);\n\n                  case ContextProvider:\n                    return updateContextProvider(current, workInProgress, renderExpirationTime);\n\n                  case ContextConsumer:\n                    return updateContextConsumer(current, workInProgress, renderExpirationTime);\n\n                  default:\n                    invariant(!1, \"Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n            }\n            function markUpdate(workInProgress) {\n                workInProgress.effectTag |= Update;\n            }\n            function markRef$1(workInProgress) {\n                workInProgress.effectTag |= Ref;\n            }\n            function appendAllChildren(parent, workInProgress) {\n                for (var node = workInProgress.child; null !== node; ) {\n                    if (node.tag === HostComponent || node.tag === HostText) appendInitialChild(parent, node.stateNode); else if (node.tag === HostPortal) ; else if (null !== node.child) {\n                        node.child.return = node, node = node.child;\n                        continue;\n                    }\n                    if (node === workInProgress) return;\n                    for (;null === node.sibling; ) {\n                        if (null === node.return || node.return === workInProgress) return;\n                        node = node.return;\n                    }\n                    node.sibling.return = node.return, node = node.sibling;\n                }\n            }\n            function completeWork(current, workInProgress, renderExpirationTime) {\n                var newProps = workInProgress.pendingProps;\n                switch (workInProgress.tag) {\n                  case FunctionalComponent:\n                    return null;\n\n                  case ClassComponent:\n                    return popContextProvider(workInProgress), null;\n\n                  case HostRoot:\n                    popHostContainer(workInProgress), popTopLevelContextObject(workInProgress);\n                    var fiberRoot = workInProgress.stateNode;\n                    return fiberRoot.pendingContext && (fiberRoot.context = fiberRoot.pendingContext, \n                    fiberRoot.pendingContext = null), null !== current && null !== current.child || (popHydrationState(workInProgress), \n                    workInProgress.effectTag &= ~Placement), updateHostContainer(workInProgress), null;\n\n                  case HostComponent:\n                    popHostContext(workInProgress);\n                    var rootContainerInstance = getRootHostContainer(), type = workInProgress.type;\n                    if (null !== current && null != workInProgress.stateNode) {\n                        var oldProps = current.memoizedProps, instance = workInProgress.stateNode, currentHostContext = getHostContext(), updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);\n                        updateHostComponent$1(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance, currentHostContext), \n                        current.ref !== workInProgress.ref && markRef$1(workInProgress);\n                    } else {\n                        if (!newProps) return null === workInProgress.stateNode && invariant(!1, \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\"), \n                        null;\n                        var _currentHostContext = getHostContext();\n                        if (popHydrationState(workInProgress)) prepareToHydrateHostInstance(workInProgress, rootContainerInstance, _currentHostContext) && markUpdate(workInProgress); else {\n                            var _instance = createInstance(type, newProps, rootContainerInstance, _currentHostContext, workInProgress);\n                            appendAllChildren(_instance, workInProgress), finalizeInitialChildren(_instance, type, newProps, rootContainerInstance, _currentHostContext) && markUpdate(workInProgress), \n                            workInProgress.stateNode = _instance;\n                        }\n                        null !== workInProgress.ref && markRef$1(workInProgress);\n                    }\n                    return null;\n\n                  case HostText:\n                    var newText = newProps;\n                    if (current && null != workInProgress.stateNode) {\n                        var oldText = current.memoizedProps;\n                        updateHostText$1(current, workInProgress, oldText, newText);\n                    } else {\n                        if (\"string\" != typeof newText) return null === workInProgress.stateNode && invariant(!1, \"We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.\"), \n                        null;\n                        var _rootContainerInstance = getRootHostContainer(), _currentHostContext2 = getHostContext();\n                        popHydrationState(workInProgress) ? prepareToHydrateHostTextInstance(workInProgress) && markUpdate(workInProgress) : workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext2, workInProgress);\n                    }\n                    return null;\n\n                  case ForwardRef:\n                  case TimeoutComponent:\n                  case Fragment:\n                  case Mode:\n                    return null;\n\n                  case Profiler:\n                    return enableProfilerTimer && recordElapsedActualRenderTime(workInProgress), null;\n\n                  case HostPortal:\n                    return popHostContainer(workInProgress), updateHostContainer(workInProgress), null;\n\n                  case ContextProvider:\n                    return popProvider(workInProgress), null;\n\n                  case ContextConsumer:\n                    return null;\n\n                  case IndeterminateComponent:\n                    invariant(!1, \"An indeterminate component should have become determinate before completing. This error is likely caused by a bug in React. Please file an issue.\");\n\n                  default:\n                    invariant(!1, \"Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n            }\n            function showErrorDialog(capturedError) {\n                return !0;\n            }\n            function logCapturedError(capturedError) {\n                if (!1 !== showErrorDialog(capturedError)) {\n                    var error = capturedError.error;\n                    if (!error || !error.suppressReactErrorLogging) {\n                        var componentName = capturedError.componentName, componentStack = capturedError.componentStack, errorBoundaryName = capturedError.errorBoundaryName, errorBoundaryFound = capturedError.errorBoundaryFound, willRetry = capturedError.willRetry, componentNameMessage = componentName ? \"The above error occurred in the <\" + componentName + \"> component:\" : \"The above error occurred in one of your React components:\", errorBoundaryMessage = void 0;\n                        errorBoundaryMessage = errorBoundaryFound && errorBoundaryName ? willRetry ? \"React will try to recreate this component tree from scratch using the error boundary you provided, \" + errorBoundaryName + \".\" : \"This error was initially handled by the error boundary \" + errorBoundaryName + \".\\nRecreating the tree from scratch failed so React will unmount the tree.\" : \"Consider adding an error boundary to your tree to customize error handling behavior.\\nVisit https://fb.me/react-error-boundaries to learn more about error boundaries.\";\n                        var combinedMessage = \"\" + componentNameMessage + componentStack + \"\\n\\n\" + errorBoundaryMessage;\n                        console.error(combinedMessage);\n                    }\n                }\n            }\n            function logError(boundary, errorInfo) {\n                var source = errorInfo.source, stack = errorInfo.stack;\n                null === stack && null !== source && (stack = getStackAddendumByWorkInProgressFiber(source));\n                var capturedError = {\n                    componentName: null !== source ? getComponentName(source) : null,\n                    componentStack: null !== stack ? stack : \"\",\n                    error: errorInfo.value,\n                    errorBoundary: null,\n                    errorBoundaryName: null,\n                    errorBoundaryFound: !1,\n                    willRetry: !1\n                };\n                null !== boundary && boundary.tag === ClassComponent && (capturedError.errorBoundary = boundary.stateNode, \n                capturedError.errorBoundaryName = getComponentName(boundary), capturedError.errorBoundaryFound = !0, \n                capturedError.willRetry = !0);\n                try {\n                    logCapturedError(capturedError);\n                } catch (e) {\n                    var suppressLogging = e && e.suppressReactErrorLogging;\n                    suppressLogging || console.error(e);\n                }\n            }\n            function safelyCallComponentWillUnmount(current, instance) {\n                if (invokeGuardedCallback$3(null, callComponentWillUnmountWithTimer, null, current, instance), \n                hasCaughtError$1()) {\n                    captureCommitPhaseError(current, clearCaughtError$1());\n                }\n            }\n            function safelyDetachRef(current) {\n                var ref = current.ref;\n                if (null !== ref) if (\"function\" == typeof ref) {\n                    if (invokeGuardedCallback$3(null, ref, null, null), hasCaughtError$1()) {\n                        var refError = clearCaughtError$1();\n                        captureCommitPhaseError(current, refError);\n                    }\n                } else ref.current = null;\n            }\n            function commitBeforeMutationLifeCycles(current, finishedWork) {\n                switch (finishedWork.tag) {\n                  case ClassComponent:\n                    if (finishedWork.effectTag & Snapshot && null !== current) {\n                        var prevProps = current.memoizedProps, prevState = current.memoizedState;\n                        startPhaseTimer(finishedWork, \"getSnapshotBeforeUpdate\");\n                        var instance = finishedWork.stateNode;\n                        instance.props = finishedWork.memoizedProps, instance.state = finishedWork.memoizedState;\n                        var snapshot = instance.getSnapshotBeforeUpdate(prevProps, prevState), didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;\n                        void 0 !== snapshot || didWarnSet.has(finishedWork.type) || (didWarnSet.add(finishedWork.type), \n                        warning(!1, \"%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.\", getComponentName(finishedWork))), \n                        instance.__reactInternalSnapshotBeforeUpdate = snapshot, stopPhaseTimer();\n                    }\n                    return;\n\n                  case HostRoot:\n                  case HostComponent:\n                  case HostText:\n                  case HostPortal:\n                    return;\n\n                  default:\n                    invariant(!1, \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n            }\n            function commitLifeCycles(finishedRoot, current, finishedWork, currentTime, committedExpirationTime) {\n                switch (finishedWork.tag) {\n                  case ClassComponent:\n                    var instance = finishedWork.stateNode;\n                    if (finishedWork.effectTag & Update) if (null === current) startPhaseTimer(finishedWork, \"componentDidMount\"), \n                    instance.props = finishedWork.memoizedProps, instance.state = finishedWork.memoizedState, \n                    instance.componentDidMount(), stopPhaseTimer(); else {\n                        var prevProps = current.memoizedProps, prevState = current.memoizedState;\n                        startPhaseTimer(finishedWork, \"componentDidUpdate\"), instance.props = finishedWork.memoizedProps, \n                        instance.state = finishedWork.memoizedState, instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate), \n                        stopPhaseTimer();\n                    }\n                    var updateQueue = finishedWork.updateQueue;\n                    return void (null !== updateQueue && (instance.props = finishedWork.memoizedProps, \n                    instance.state = finishedWork.memoizedState, commitUpdateQueue(finishedWork, updateQueue, instance, committedExpirationTime)));\n\n                  case HostRoot:\n                    var _updateQueue = finishedWork.updateQueue;\n                    if (null !== _updateQueue) {\n                        var _instance = null;\n                        if (null !== finishedWork.child) switch (finishedWork.child.tag) {\n                          case HostComponent:\n                            _instance = getPublicInstance(finishedWork.child.stateNode);\n                            break;\n\n                          case ClassComponent:\n                            _instance = finishedWork.child.stateNode;\n                        }\n                        commitUpdateQueue(finishedWork, _updateQueue, _instance, committedExpirationTime);\n                    }\n                    return;\n\n                  case HostComponent:\n                    var _instance2 = finishedWork.stateNode;\n                    if (null === current && finishedWork.effectTag & Update) {\n                        commitMount(_instance2, finishedWork.type, finishedWork.memoizedProps, finishedWork);\n                    }\n                    return;\n\n                  case HostText:\n                  case HostPortal:\n                  case Profiler:\n                  case TimeoutComponent:\n                    return;\n\n                  default:\n                    invariant(!1, \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n            }\n            function commitAttachRef(finishedWork) {\n                var ref = finishedWork.ref;\n                if (null !== ref) {\n                    var instance = finishedWork.stateNode, instanceToUse = void 0;\n                    switch (finishedWork.tag) {\n                      case HostComponent:\n                        instanceToUse = getPublicInstance(instance);\n                        break;\n\n                      default:\n                        instanceToUse = instance;\n                    }\n                    \"function\" == typeof ref ? ref(instanceToUse) : (ref.hasOwnProperty(\"current\") || warning(!1, \"Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().%s\", getComponentName(finishedWork), getStackAddendumByWorkInProgressFiber(finishedWork)), \n                    ref.current = instanceToUse);\n                }\n            }\n            function commitDetachRef(current) {\n                var currentRef = current.ref;\n                null !== currentRef && (\"function\" == typeof currentRef ? currentRef(null) : currentRef.current = null);\n            }\n            function commitUnmount(current) {\n                switch (\"function\" == typeof onCommitUnmount && onCommitUnmount(current), current.tag) {\n                  case ClassComponent:\n                    safelyDetachRef(current);\n                    var instance = current.stateNode;\n                    return void (\"function\" == typeof instance.componentWillUnmount && safelyCallComponentWillUnmount(current, instance));\n\n                  case HostComponent:\n                    return void safelyDetachRef(current);\n\n                  case HostPortal:\n                    return void (supportsMutation ? unmountHostComponents(current) : supportsPersistence && emptyPortalContainer(current));\n                }\n            }\n            function commitNestedUnmounts(root) {\n                for (var node = root; ;) if (commitUnmount(node), null === node.child || supportsMutation && node.tag === HostPortal) {\n                    if (node === root) return;\n                    for (;null === node.sibling; ) {\n                        if (null === node.return || node.return === root) return;\n                        node = node.return;\n                    }\n                    node.sibling.return = node.return, node = node.sibling;\n                } else node.child.return = node, node = node.child;\n            }\n            function detachFiber(current) {\n                current.return = null, current.child = null, current.alternate && (current.alternate.child = null, \n                current.alternate.return = null);\n            }\n            function emptyPortalContainer(current) {\n                if (supportsPersistence) {\n                    var portal = current.stateNode, containerInfo = portal.containerInfo, emptyChildSet = createContainerChildSet(containerInfo);\n                    replaceContainerChildren(containerInfo, emptyChildSet);\n                }\n            }\n            function commitContainer(finishedWork) {\n                if (supportsPersistence) switch (finishedWork.tag) {\n                  case ClassComponent:\n                  case HostComponent:\n                  case HostText:\n                    return;\n\n                  case HostRoot:\n                  case HostPortal:\n                    var portalOrRoot = finishedWork.stateNode, containerInfo = portalOrRoot.containerInfo, _pendingChildren = portalOrRoot.pendingChildren;\n                    return void replaceContainerChildren(containerInfo, _pendingChildren);\n\n                  default:\n                    invariant(!1, \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n            }\n            function getHostParentFiber(fiber) {\n                for (var parent = fiber.return; null !== parent; ) {\n                    if (isHostParent(parent)) return parent;\n                    parent = parent.return;\n                }\n                invariant(!1, \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\");\n            }\n            function isHostParent(fiber) {\n                return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;\n            }\n            function getHostSibling(fiber) {\n                var node = fiber;\n                siblings: for (;;) {\n                    for (;null === node.sibling; ) {\n                        if (null === node.return || isHostParent(node.return)) return null;\n                        node = node.return;\n                    }\n                    for (node.sibling.return = node.return, node = node.sibling; node.tag !== HostComponent && node.tag !== HostText; ) {\n                        if (node.effectTag & Placement) continue siblings;\n                        if (null === node.child || node.tag === HostPortal) continue siblings;\n                        node.child.return = node, node = node.child;\n                    }\n                    if (!(node.effectTag & Placement)) return node.stateNode;\n                }\n            }\n            function commitPlacement(finishedWork) {\n                if (supportsMutation) {\n                    var parentFiber = getHostParentFiber(finishedWork), parent = void 0, isContainer = void 0;\n                    switch (parentFiber.tag) {\n                      case HostComponent:\n                        parent = parentFiber.stateNode, isContainer = !1;\n                        break;\n\n                      case HostRoot:\n                      case HostPortal:\n                        parent = parentFiber.stateNode.containerInfo, isContainer = !0;\n                        break;\n\n                      default:\n                        invariant(!1, \"Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.\");\n                    }\n                    parentFiber.effectTag & ContentReset && (resetTextContent(parent), parentFiber.effectTag &= ~ContentReset);\n                    for (var before = getHostSibling(finishedWork), node = finishedWork; ;) {\n                        if (node.tag === HostComponent || node.tag === HostText) before ? isContainer ? insertInContainerBefore(parent, node.stateNode, before) : insertBefore(parent, node.stateNode, before) : isContainer ? appendChildToContainer(parent, node.stateNode) : appendChild(parent, node.stateNode); else if (node.tag === HostPortal) ; else if (null !== node.child) {\n                            node.child.return = node, node = node.child;\n                            continue;\n                        }\n                        if (node === finishedWork) return;\n                        for (;null === node.sibling; ) {\n                            if (null === node.return || node.return === finishedWork) return;\n                            node = node.return;\n                        }\n                        node.sibling.return = node.return, node = node.sibling;\n                    }\n                }\n            }\n            function unmountHostComponents(current) {\n                for (var node = current, currentParentIsValid = !1, currentParent = void 0, currentParentIsContainer = void 0; ;) {\n                    if (!currentParentIsValid) {\n                        var parent = node.return;\n                        findParent: for (;;) {\n                            switch (null === parent && invariant(!1, \"Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.\"), \n                            parent.tag) {\n                              case HostComponent:\n                                currentParent = parent.stateNode, currentParentIsContainer = !1;\n                                break findParent;\n\n                              case HostRoot:\n                              case HostPortal:\n                                currentParent = parent.stateNode.containerInfo, currentParentIsContainer = !0;\n                                break findParent;\n                            }\n                            parent = parent.return;\n                        }\n                        currentParentIsValid = !0;\n                    }\n                    if (node.tag === HostComponent || node.tag === HostText) commitNestedUnmounts(node), \n                    currentParentIsContainer ? removeChildFromContainer(currentParent, node.stateNode) : removeChild(currentParent, node.stateNode); else if (node.tag === HostPortal) {\n                        if (currentParent = node.stateNode.containerInfo, null !== node.child) {\n                            node.child.return = node, node = node.child;\n                            continue;\n                        }\n                    } else if (commitUnmount(node), null !== node.child) {\n                        node.child.return = node, node = node.child;\n                        continue;\n                    }\n                    if (node === current) return;\n                    for (;null === node.sibling; ) {\n                        if (null === node.return || node.return === current) return;\n                        node = node.return, node.tag === HostPortal && (currentParentIsValid = !1);\n                    }\n                    node.sibling.return = node.return, node = node.sibling;\n                }\n            }\n            function commitDeletion(current) {\n                supportsMutation ? unmountHostComponents(current) : commitNestedUnmounts(current), \n                detachFiber(current);\n            }\n            function commitWork(current, finishedWork) {\n                if (!supportsMutation) return void commitContainer(finishedWork);\n                switch (finishedWork.tag) {\n                  case ClassComponent:\n                    return;\n\n                  case HostComponent:\n                    var instance = finishedWork.stateNode;\n                    if (null != instance) {\n                        var newProps = finishedWork.memoizedProps, oldProps = null !== current ? current.memoizedProps : newProps, type = finishedWork.type, updatePayload = finishedWork.updateQueue;\n                        finishedWork.updateQueue = null, null !== updatePayload && commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);\n                    }\n                    return;\n\n                  case HostText:\n                    null === finishedWork.stateNode && invariant(!1, \"This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.\");\n                    var textInstance = finishedWork.stateNode, newText = finishedWork.memoizedProps;\n                    return void commitTextUpdate(textInstance, null !== current ? current.memoizedProps : newText, newText);\n\n                  case HostRoot:\n                    return;\n\n                  case Profiler:\n                    if (enableProfilerTimer) {\n                        (0, finishedWork.memoizedProps.onRender)(finishedWork.memoizedProps.id, null === current ? \"mount\" : \"update\", finishedWork.stateNode.duration, finishedWork.treeBaseTime, finishedWork.stateNode.startTime, getCommitTime()), \n                        finishedWork.stateNode.duration = 0;\n                    }\n                    return;\n\n                  case TimeoutComponent:\n                    return;\n\n                  default:\n                    invariant(!1, \"This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n            }\n            function commitResetTextContent(current) {\n                supportsMutation && resetTextContent(current.stateNode);\n            }\n            function createRootErrorUpdate(fiber, errorInfo, expirationTime) {\n                var update = createUpdate(expirationTime);\n                update.tag = CaptureUpdate, update.payload = {\n                    element: null\n                };\n                var error = errorInfo.value;\n                return update.callback = function() {\n                    onUncaughtError(error), logError(fiber, errorInfo);\n                }, update;\n            }\n            function createClassErrorUpdate(fiber, errorInfo, expirationTime) {\n                var update = createUpdate(expirationTime);\n                update.tag = CaptureUpdate;\n                var getDerivedStateFromCatch = fiber.type.getDerivedStateFromCatch;\n                if (enableGetDerivedStateFromCatch && \"function\" == typeof getDerivedStateFromCatch) {\n                    var error = errorInfo.value;\n                    update.payload = function() {\n                        return getDerivedStateFromCatch(error);\n                    };\n                }\n                var inst = fiber.stateNode;\n                return null !== inst && \"function\" == typeof inst.componentDidCatch && (update.callback = function() {\n                    enableGetDerivedStateFromCatch && \"function\" === getDerivedStateFromCatch || markLegacyErrorBoundaryAsFailed(this);\n                    var error = errorInfo.value, stack = errorInfo.stack;\n                    logError(fiber, errorInfo), this.componentDidCatch(error, {\n                        componentStack: null !== stack ? stack : \"\"\n                    });\n                }), update;\n            }\n            function schedulePing(finishedWork) {\n                var currentTime = recalculateCurrentTime(), expirationTime = computeExpirationForFiber(currentTime, finishedWork);\n                enqueueUpdate(finishedWork, createUpdate(expirationTime), expirationTime), scheduleWork$1(finishedWork, expirationTime);\n            }\n            function throwException(root, returnFiber, sourceFiber, value, renderIsExpired, renderExpirationTime, currentTimeMs) {\n                if (sourceFiber.effectTag |= Incomplete, sourceFiber.firstEffect = sourceFiber.lastEffect = null, \n                enableSuspense && null !== value && \"object\" == typeof value && \"function\" == typeof value.then) {\n                    var thenable = value, expirationTimeMs = expirationTimeToMs(renderExpirationTime), startTimeMs = expirationTimeMs - 5e3, elapsedMs = currentTimeMs - startTimeMs;\n                    elapsedMs < 0 && (elapsedMs = 0);\n                    var remainingTimeMs = expirationTimeMs - currentTimeMs, _workInProgress = returnFiber, earliestTimeoutMs = -1;\n                    searchForEarliestTimeout: do {\n                        if (_workInProgress.tag === TimeoutComponent) {\n                            var current = _workInProgress.alternate;\n                            if (null !== current && !0 === current.memoizedState) {\n                                earliestTimeoutMs = 0;\n                                break searchForEarliestTimeout;\n                            }\n                            var timeoutPropMs = _workInProgress.pendingProps.ms;\n                            if (\"number\" == typeof timeoutPropMs) {\n                                if (timeoutPropMs <= 0) {\n                                    earliestTimeoutMs = 0;\n                                    break searchForEarliestTimeout;\n                                }\n                                (-1 === earliestTimeoutMs || timeoutPropMs < earliestTimeoutMs) && (earliestTimeoutMs = timeoutPropMs);\n                            } else -1 === earliestTimeoutMs && (earliestTimeoutMs = remainingTimeMs);\n                        }\n                        _workInProgress = _workInProgress.return;\n                    } while (null !== _workInProgress);\n                    var msUntilTimeout = earliestTimeoutMs - elapsedMs;\n                    if (renderExpirationTime === Never || msUntilTimeout > 0) {\n                        suspendRoot(root, thenable, msUntilTimeout, renderExpirationTime);\n                        var onResolveOrReject = function() {\n                            retrySuspendedRoot(root, renderExpirationTime);\n                        };\n                        return void thenable.then(onResolveOrReject, onResolveOrReject);\n                    }\n                    _workInProgress = returnFiber;\n                    do {\n                        switch (_workInProgress.tag) {\n                          case HostRoot:\n                            var message = renderExpirationTime === Sync ? \"A synchronous update was suspended, but no fallback UI was provided.\" : \"An update was suspended for longer than the timeout, but no fallback UI was provided.\";\n                            value = new Error(message);\n                            break;\n\n                          case TimeoutComponent:\n                            if ((_workInProgress.effectTag & DidCapture) === NoEffect) {\n                                _workInProgress.effectTag |= ShouldCapture;\n                                var _onResolveOrReject = schedulePing.bind(null, _workInProgress);\n                                return void thenable.then(_onResolveOrReject, _onResolveOrReject);\n                            }\n                        }\n                        _workInProgress = _workInProgress.return;\n                    } while (null !== _workInProgress);\n                }\n                value = createCapturedValue(value, sourceFiber);\n                var workInProgress = returnFiber;\n                do {\n                    switch (workInProgress.tag) {\n                      case HostRoot:\n                        var _errorInfo = value;\n                        workInProgress.effectTag |= ShouldCapture;\n                        return void enqueueCapturedUpdate(workInProgress, createRootErrorUpdate(workInProgress, _errorInfo, renderExpirationTime), renderExpirationTime);\n\n                      case ClassComponent:\n                        var errorInfo = value, ctor = workInProgress.type, instance = workInProgress.stateNode;\n                        if ((workInProgress.effectTag & DidCapture) === NoEffect && (\"function\" == typeof ctor.getDerivedStateFromCatch && enableGetDerivedStateFromCatch || null !== instance && \"function\" == typeof instance.componentDidCatch && !isAlreadyFailedLegacyErrorBoundary(instance))) {\n                            workInProgress.effectTag |= ShouldCapture;\n                            return void enqueueCapturedUpdate(workInProgress, createClassErrorUpdate(workInProgress, errorInfo, renderExpirationTime), renderExpirationTime);\n                        }\n                    }\n                    workInProgress = workInProgress.return;\n                } while (null !== workInProgress);\n            }\n            function unwindWork(workInProgress, renderIsExpired, renderExpirationTime) {\n                switch (workInProgress.tag) {\n                  case ClassComponent:\n                    popContextProvider(workInProgress);\n                    var effectTag = workInProgress.effectTag;\n                    return effectTag & ShouldCapture ? (workInProgress.effectTag = effectTag & ~ShouldCapture | DidCapture, \n                    workInProgress) : null;\n\n                  case HostRoot:\n                    popHostContainer(workInProgress), popTopLevelContextObject(workInProgress);\n                    var _effectTag = workInProgress.effectTag;\n                    return _effectTag & ShouldCapture ? (workInProgress.effectTag = _effectTag & ~ShouldCapture | DidCapture, \n                    workInProgress) : null;\n\n                  case HostComponent:\n                    return popHostContext(workInProgress), null;\n\n                  case TimeoutComponent:\n                    var _effectTag2 = workInProgress.effectTag;\n                    return _effectTag2 & ShouldCapture ? (workInProgress.effectTag = _effectTag2 & ~ShouldCapture | DidCapture, \n                    workInProgress) : null;\n\n                  case HostPortal:\n                    return popHostContainer(workInProgress), null;\n\n                  case ContextProvider:\n                    return popProvider(workInProgress), null;\n\n                  default:\n                    return null;\n                }\n            }\n            function unwindInterruptedWork(interruptedWork) {\n                switch (interruptedWork.tag) {\n                  case ClassComponent:\n                    popContextProvider(interruptedWork);\n                    break;\n\n                  case HostRoot:\n                    popHostContainer(interruptedWork), popTopLevelContextObject(interruptedWork);\n                    break;\n\n                  case HostComponent:\n                    popHostContext(interruptedWork);\n                    break;\n\n                  case HostPortal:\n                    popHostContainer(interruptedWork);\n                    break;\n\n                  case ContextProvider:\n                    popProvider(interruptedWork);\n                    break;\n\n                  case Profiler:\n                    enableProfilerTimer && (resumeActualRenderTimerIfPaused(), recordElapsedActualRenderTime(interruptedWork));\n                }\n            }\n            function resetStack() {\n                if (null !== nextUnitOfWork) for (var interruptedWork = nextUnitOfWork.return; null !== interruptedWork; ) unwindInterruptedWork(interruptedWork), \n                interruptedWork = interruptedWork.return;\n                ReactStrictModeWarnings.discardPendingWarnings(), checkThatStackIsEmpty(), nextRoot = null, \n                nextRenderExpirationTime = NoWork, nextLatestTimeoutMs = -1, nextRenderIsExpired = !1, \n                nextUnitOfWork = null, isRootReadyForCommit = !1;\n            }\n            function commitAllHostEffects() {\n                for (;null !== nextEffect; ) {\n                    ReactDebugCurrentFiber.setCurrentFiber(nextEffect), recordEffect();\n                    var effectTag = nextEffect.effectTag;\n                    if (effectTag & ContentReset && commitResetTextContent(nextEffect), effectTag & Ref) {\n                        var current = nextEffect.alternate;\n                        null !== current && commitDetachRef(current);\n                    }\n                    switch (effectTag & (Placement | Update | Deletion)) {\n                      case Placement:\n                        commitPlacement(nextEffect), nextEffect.effectTag &= ~Placement;\n                        break;\n\n                      case PlacementAndUpdate:\n                        commitPlacement(nextEffect), nextEffect.effectTag &= ~Placement;\n                        commitWork(nextEffect.alternate, nextEffect);\n                        break;\n\n                      case Update:\n                        commitWork(nextEffect.alternate, nextEffect);\n                        break;\n\n                      case Deletion:\n                        commitDeletion(nextEffect);\n                    }\n                    nextEffect = nextEffect.nextEffect;\n                }\n                ReactDebugCurrentFiber.resetCurrentFiber();\n            }\n            function commitBeforeMutationLifecycles() {\n                for (;null !== nextEffect; ) {\n                    if (nextEffect.effectTag & Snapshot) {\n                        recordEffect();\n                        commitBeforeMutationLifeCycles(nextEffect.alternate, nextEffect);\n                    }\n                    nextEffect = nextEffect.nextEffect;\n                }\n            }\n            function commitAllLifeCycles(finishedRoot, currentTime, committedExpirationTime) {\n                for (ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings(), warnAboutDeprecatedLifecycles && ReactStrictModeWarnings.flushPendingDeprecationWarnings(), \n                warnAboutLegacyContextAPI && ReactStrictModeWarnings.flushLegacyContextWarning(); null !== nextEffect; ) {\n                    var effectTag = nextEffect.effectTag;\n                    if (effectTag & (Update | Callback)) {\n                        recordEffect();\n                        commitLifeCycles(finishedRoot, nextEffect.alternate, nextEffect, currentTime, committedExpirationTime);\n                    }\n                    effectTag & Ref && (recordEffect(), commitAttachRef(nextEffect));\n                    var next = nextEffect.nextEffect;\n                    nextEffect.nextEffect = null, nextEffect = next;\n                }\n            }\n            function isAlreadyFailedLegacyErrorBoundary(instance) {\n                return null !== legacyErrorBoundariesThatAlreadyFailed && legacyErrorBoundariesThatAlreadyFailed.has(instance);\n            }\n            function markLegacyErrorBoundaryAsFailed(instance) {\n                null === legacyErrorBoundariesThatAlreadyFailed ? legacyErrorBoundariesThatAlreadyFailed = new Set([ instance ]) : legacyErrorBoundariesThatAlreadyFailed.add(instance);\n            }\n            function commitRoot(finishedWork) {\n                isWorking = !0, isCommitting$1 = !0, startCommitTimer();\n                var root = finishedWork.stateNode;\n                root.current === finishedWork && invariant(!1, \"Cannot commit the same tree as before. This is probably a bug related to the return field. This error is likely caused by a bug in React. Please file an issue.\");\n                var committedExpirationTime = root.pendingCommitExpirationTime;\n                committedExpirationTime === NoWork && invariant(!1, \"Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue.\"), \n                root.pendingCommitExpirationTime = NoWork;\n                var currentTime = recalculateCurrentTime();\n                ReactCurrentOwner.current = null;\n                var firstEffect = void 0;\n                for (finishedWork.effectTag > PerformedWork ? null !== finishedWork.lastEffect ? (finishedWork.lastEffect.nextEffect = finishedWork, \n                firstEffect = finishedWork.firstEffect) : firstEffect = finishedWork : firstEffect = finishedWork.firstEffect, \n                prepareForCommit(root.containerInfo), nextEffect = firstEffect, startCommitSnapshotEffectsTimer(); null !== nextEffect; ) {\n                    var didError = !1, error = void 0;\n                    invokeGuardedCallback$2(null, commitBeforeMutationLifecycles, null), hasCaughtError() && (didError = !0, \n                    error = clearCaughtError()), didError && (null === nextEffect && invariant(!1, \"Should have next effect. This error is likely caused by a bug in React. Please file an issue.\"), \n                    captureCommitPhaseError(nextEffect, error), null !== nextEffect && (nextEffect = nextEffect.nextEffect));\n                }\n                for (stopCommitSnapshotEffectsTimer(), enableProfilerTimer && recordCommitTime(), \n                nextEffect = firstEffect, startCommitHostEffectsTimer(); null !== nextEffect; ) {\n                    var _didError = !1, _error = void 0;\n                    invokeGuardedCallback$2(null, commitAllHostEffects, null), hasCaughtError() && (_didError = !0, \n                    _error = clearCaughtError()), _didError && (null === nextEffect && invariant(!1, \"Should have next effect. This error is likely caused by a bug in React. Please file an issue.\"), \n                    captureCommitPhaseError(nextEffect, _error), null !== nextEffect && (nextEffect = nextEffect.nextEffect));\n                }\n                for (stopCommitHostEffectsTimer(), resetAfterCommit(root.containerInfo), root.current = finishedWork, \n                nextEffect = firstEffect, startCommitLifeCyclesTimer(); null !== nextEffect; ) {\n                    var _didError2 = !1, _error2 = void 0;\n                    invokeGuardedCallback$2(null, commitAllLifeCycles, null, root, currentTime, committedExpirationTime), \n                    hasCaughtError() && (_didError2 = !0, _error2 = clearCaughtError()), _didError2 && (null === nextEffect && invariant(!1, \"Should have next effect. This error is likely caused by a bug in React. Please file an issue.\"), \n                    captureCommitPhaseError(nextEffect, _error2), null !== nextEffect && (nextEffect = nextEffect.nextEffect));\n                }\n                enableProfilerTimer && (checkActualRenderTimeStackEmpty(), resetActualRenderTimer()), \n                isCommitting$1 = !1, isWorking = !1, stopCommitLifeCyclesTimer(), stopCommitTimer(), \n                \"function\" == typeof onCommitRoot && onCommitRoot(finishedWork.stateNode), ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCommitWork(finishedWork), \n                markCommittedPriorityLevels(root, currentTime, root.current.expirationTime);\n                var remainingTime = findNextPendingPriorityLevel(root);\n                return remainingTime === NoWork && (legacyErrorBoundariesThatAlreadyFailed = null), \n                remainingTime;\n            }\n            function resetExpirationTime(workInProgress, renderTime) {\n                if (renderTime === Never || workInProgress.expirationTime !== Never) {\n                    var newExpirationTime = NoWork;\n                    switch (workInProgress.tag) {\n                      case HostRoot:\n                      case ClassComponent:\n                        var updateQueue = workInProgress.updateQueue;\n                        null !== updateQueue && (newExpirationTime = updateQueue.expirationTime);\n                    }\n                    if (enableProfilerTimer && workInProgress.mode & ProfileMode) {\n                        for (var treeBaseTime = workInProgress.selfBaseTime, child = workInProgress.child; null !== child; ) treeBaseTime += child.treeBaseTime, \n                        child.expirationTime !== NoWork && (newExpirationTime === NoWork || newExpirationTime > child.expirationTime) && (newExpirationTime = child.expirationTime), \n                        child = child.sibling;\n                        workInProgress.treeBaseTime = treeBaseTime;\n                    } else for (var _child = workInProgress.child; null !== _child; ) _child.expirationTime !== NoWork && (newExpirationTime === NoWork || newExpirationTime > _child.expirationTime) && (newExpirationTime = _child.expirationTime), \n                    _child = _child.sibling;\n                    workInProgress.expirationTime = newExpirationTime;\n                }\n            }\n            function completeUnitOfWork(workInProgress) {\n                for (;;) {\n                    var current = workInProgress.alternate;\n                    ReactDebugCurrentFiber.setCurrentFiber(workInProgress);\n                    var returnFiber = workInProgress.return, siblingFiber = workInProgress.sibling;\n                    if ((workInProgress.effectTag & Incomplete) === NoEffect) {\n                        var next = completeWork(current, workInProgress, nextRenderExpirationTime);\n                        if (stopWorkTimer(workInProgress), resetExpirationTime(workInProgress, nextRenderExpirationTime), \n                        ReactDebugCurrentFiber.resetCurrentFiber(), null !== next) return stopWorkTimer(workInProgress), \n                        ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress), \n                        next;\n                        if (null !== returnFiber && (returnFiber.effectTag & Incomplete) === NoEffect) {\n                            null === returnFiber.firstEffect && (returnFiber.firstEffect = workInProgress.firstEffect), \n                            null !== workInProgress.lastEffect && (null !== returnFiber.lastEffect && (returnFiber.lastEffect.nextEffect = workInProgress.firstEffect), \n                            returnFiber.lastEffect = workInProgress.lastEffect);\n                            workInProgress.effectTag > PerformedWork && (null !== returnFiber.lastEffect ? returnFiber.lastEffect.nextEffect = workInProgress : returnFiber.firstEffect = workInProgress, \n                            returnFiber.lastEffect = workInProgress);\n                        }\n                        if (ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress), \n                        null !== siblingFiber) return siblingFiber;\n                        if (null !== returnFiber) {\n                            workInProgress = returnFiber;\n                            continue;\n                        }\n                        return isRootReadyForCommit = !0, null;\n                    }\n                    var _next = unwindWork(workInProgress, nextRenderIsExpired, nextRenderExpirationTime);\n                    if (workInProgress.effectTag & DidCapture ? stopFailedWorkTimer(workInProgress) : stopWorkTimer(workInProgress), \n                    ReactDebugCurrentFiber.resetCurrentFiber(), null !== _next) return stopWorkTimer(workInProgress), \n                    ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress), \n                    _next.effectTag &= HostEffectMask, _next;\n                    if (null !== returnFiber && (returnFiber.firstEffect = returnFiber.lastEffect = null, \n                    returnFiber.effectTag |= Incomplete), ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress), \n                    null !== siblingFiber) return siblingFiber;\n                    if (null === returnFiber) return null;\n                    workInProgress = returnFiber;\n                }\n                return null;\n            }\n            function performUnitOfWork(workInProgress) {\n                var current = workInProgress.alternate;\n                startWorkTimer(workInProgress), ReactDebugCurrentFiber.setCurrentFiber(workInProgress), \n                replayFailedUnitOfWorkWithInvokeGuardedCallback && (stashedWorkInProgressProperties = assignFiberPropertiesInDEV(stashedWorkInProgressProperties, workInProgress));\n                var next = void 0;\n                return enableProfilerTimer ? (workInProgress.mode & ProfileMode && startBaseRenderTimer(), \n                next = beginWork(current, workInProgress, nextRenderExpirationTime), workInProgress.mode & ProfileMode && (recordElapsedBaseRenderTimeIfRunning(workInProgress), \n                stopBaseRenderTimerIfRunning())) : next = beginWork(current, workInProgress, nextRenderExpirationTime), \n                ReactDebugCurrentFiber.resetCurrentFiber(), isReplayingFailedUnitOfWork && rethrowOriginalError(), \n                ReactFiberInstrumentation_1.debugTool && ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress), \n                null === next && (next = completeUnitOfWork(workInProgress)), ReactCurrentOwner.current = null, \n                next;\n            }\n            function workLoop(isAsync) {\n                if (isAsync) {\n                    for (;null !== nextUnitOfWork && !shouldYield(); ) nextUnitOfWork = performUnitOfWork(nextUnitOfWork);\n                    enableProfilerTimer && pauseActualRenderTimerIfRunning();\n                } else for (;null !== nextUnitOfWork; ) nextUnitOfWork = performUnitOfWork(nextUnitOfWork);\n            }\n            function renderRoot(root, expirationTime, isAsync) {\n                isWorking && invariant(!1, \"renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.\"), \n                isWorking = !0, expirationTime === nextRenderExpirationTime && root === nextRoot && null !== nextUnitOfWork || (resetStack(), \n                nextRoot = root, nextRenderExpirationTime = expirationTime, nextLatestTimeoutMs = -1, \n                nextUnitOfWork = createWorkInProgress(nextRoot.current, null, nextRenderExpirationTime), \n                root.pendingCommitExpirationTime = NoWork);\n                var didFatal = !1;\n                for (nextRenderIsExpired = !isAsync || nextRenderExpirationTime <= mostRecentCurrentTime, \n                startWorkLoopTimer(nextUnitOfWork); ;) {\n                    try {\n                        workLoop(isAsync);\n                    } catch (thrownValue) {\n                        if (enableProfilerTimer && stopBaseRenderTimerIfRunning(), null === nextUnitOfWork) didFatal = !0, \n                        onUncaughtError(thrownValue); else {\n                            resetCurrentlyProcessingQueue();\n                            var failedUnitOfWork = nextUnitOfWork;\n                            replayFailedUnitOfWorkWithInvokeGuardedCallback && replayUnitOfWork(failedUnitOfWork, thrownValue, isAsync), \n                            null === nextUnitOfWork && invariant(!1, \"Failed to replay rendering after an error. This is likely caused by a bug in React. Please file an issue with a reproducing case to help us find it.\");\n                            var sourceFiber = nextUnitOfWork, returnFiber = sourceFiber.return;\n                            if (null === returnFiber) {\n                                didFatal = !0, onUncaughtError(thrownValue);\n                                break;\n                            }\n                            throwException(root, returnFiber, sourceFiber, thrownValue, nextRenderIsExpired, nextRenderExpirationTime, mostRecentCurrentTimeMs), \n                            nextUnitOfWork = completeUnitOfWork(sourceFiber);\n                        }\n                    }\n                    break;\n                }\n                var didCompleteRoot = !1;\n                if (isWorking = !1, didFatal) return stopWorkLoopTimer(interruptedBy, didCompleteRoot), \n                interruptedBy = null, resetStackAfterFatalErrorInDev(), null;\n                if (null === nextUnitOfWork) {\n                    if (isRootReadyForCommit) {\n                        didCompleteRoot = !0, stopWorkLoopTimer(interruptedBy, didCompleteRoot), interruptedBy = null, \n                        root.pendingCommitExpirationTime = expirationTime;\n                        return root.current.alternate;\n                    }\n                    stopWorkLoopTimer(interruptedBy, didCompleteRoot), interruptedBy = null, nextRenderIsExpired && invariant(!1, \"Expired work should have completed. This error is likely caused by a bug in React. Please file an issue.\"), \n                    markSuspendedPriorityLevel(root, expirationTime), nextLatestTimeoutMs >= 0 && setTimeout(function() {\n                        retrySuspendedRoot(root, expirationTime);\n                    }, nextLatestTimeoutMs);\n                    return onBlock(findNextPendingPriorityLevel(root)), null;\n                }\n                return stopWorkLoopTimer(interruptedBy, didCompleteRoot), interruptedBy = null, \n                null;\n            }\n            function dispatch(sourceFiber, value, expirationTime) {\n                isWorking && !isCommitting$1 && invariant(!1, \"dispatch: Cannot dispatch during the render phase.\");\n                for (var fiber = sourceFiber.return; null !== fiber; ) {\n                    switch (fiber.tag) {\n                      case ClassComponent:\n                        var ctor = fiber.type, instance = fiber.stateNode;\n                        if (\"function\" == typeof ctor.getDerivedStateFromCatch || \"function\" == typeof instance.componentDidCatch && !isAlreadyFailedLegacyErrorBoundary(instance)) {\n                            return enqueueUpdate(fiber, createClassErrorUpdate(fiber, createCapturedValue(value, sourceFiber), expirationTime), expirationTime), \n                            void scheduleWork$1(fiber, expirationTime);\n                        }\n                        break;\n\n                      case HostRoot:\n                        return enqueueUpdate(fiber, createRootErrorUpdate(fiber, createCapturedValue(value, sourceFiber), expirationTime), expirationTime), \n                        void scheduleWork$1(fiber, expirationTime);\n                    }\n                    fiber = fiber.return;\n                }\n                if (sourceFiber.tag === HostRoot) {\n                    var rootFiber = sourceFiber;\n                    enqueueUpdate(rootFiber, createRootErrorUpdate(rootFiber, createCapturedValue(value, rootFiber), expirationTime), expirationTime), \n                    scheduleWork$1(rootFiber, expirationTime);\n                }\n            }\n            function captureCommitPhaseError(fiber, error) {\n                return dispatch(fiber, error, Sync);\n            }\n            function computeAsyncExpiration(currentTime) {\n                return computeExpirationBucket(currentTime, 5e3, 250);\n            }\n            function computeInteractiveExpiration(currentTime) {\n                var expirationMs = void 0;\n                expirationMs = 500;\n                return computeExpirationBucket(currentTime, expirationMs, 100);\n            }\n            function computeUniqueAsyncExpiration() {\n                var currentTime = recalculateCurrentTime(), result = computeAsyncExpiration(currentTime);\n                return result <= lastUniqueAsyncExpiration && (result = lastUniqueAsyncExpiration + 1), \n                lastUniqueAsyncExpiration = result;\n            }\n            function computeExpirationForFiber(currentTime, fiber) {\n                var expirationTime = void 0;\n                return expirationTime = expirationContext !== NoWork ? expirationContext : isWorking ? isCommitting$1 ? Sync : nextRenderExpirationTime : fiber.mode & AsyncMode ? isBatchingInteractiveUpdates ? computeInteractiveExpiration(currentTime) : computeAsyncExpiration(currentTime) : Sync, \n                isBatchingInteractiveUpdates && (lowestPendingInteractiveExpirationTime === NoWork || expirationTime > lowestPendingInteractiveExpirationTime) && (lowestPendingInteractiveExpirationTime = expirationTime), \n                expirationTime;\n            }\n            function suspendRoot(root, thenable, timeoutMs, suspendedTime) {\n                timeoutMs >= 0 && nextLatestTimeoutMs < timeoutMs && (nextLatestTimeoutMs = timeoutMs);\n            }\n            function retrySuspendedRoot(root, suspendedTime) {\n                markPingedPriorityLevel(root, suspendedTime);\n                var retryTime = findNextPendingPriorityLevel(root);\n                retryTime !== NoWork && requestRetry(root, retryTime);\n            }\n            function scheduleWork$1(fiber, expirationTime) {\n                if (recordScheduleUpdate(), fiber.tag === ClassComponent) {\n                    var instance = fiber.stateNode;\n                    warnAboutInvalidUpdates(instance);\n                }\n                for (var node = fiber; null !== node; ) {\n                    if ((node.expirationTime === NoWork || node.expirationTime > expirationTime) && (node.expirationTime = expirationTime), \n                    null !== node.alternate && (node.alternate.expirationTime === NoWork || node.alternate.expirationTime > expirationTime) && (node.alternate.expirationTime = expirationTime), \n                    null === node.return) {\n                        if (node.tag !== HostRoot) return void (fiber.tag === ClassComponent && warnAboutUpdateOnUnmounted(fiber));\n                        var root = node.stateNode;\n                        !isWorking && nextRenderExpirationTime !== NoWork && expirationTime < nextRenderExpirationTime && (interruptedBy = fiber, \n                        resetStack()), markPendingPriorityLevel(root, expirationTime);\n                        var nextExpirationTimeToWorkOn = findNextPendingPriorityLevel(root);\n                        isWorking && !isCommitting$1 && nextRoot === root || requestWork(root, nextExpirationTimeToWorkOn), \n                        nestedUpdateCount > NESTED_UPDATE_LIMIT && invariant(!1, \"Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.\");\n                    }\n                    node = node.return;\n                }\n            }\n            function recalculateCurrentTime() {\n                return mostRecentCurrentTimeMs = now() - originalStartTimeMs, mostRecentCurrentTime = msToExpirationTime(mostRecentCurrentTimeMs);\n            }\n            function deferredUpdates(fn) {\n                var previousExpirationContext = expirationContext, currentTime = recalculateCurrentTime();\n                expirationContext = computeAsyncExpiration(currentTime);\n                try {\n                    return fn();\n                } finally {\n                    expirationContext = previousExpirationContext;\n                }\n            }\n            function syncUpdates(fn, a, b, c, d) {\n                var previousExpirationContext = expirationContext;\n                expirationContext = Sync;\n                try {\n                    return fn(a, b, c, d);\n                } finally {\n                    expirationContext = previousExpirationContext;\n                }\n            }\n            function scheduleCallbackWithExpiration(expirationTime) {\n                if (callbackExpirationTime !== NoWork) {\n                    if (expirationTime > callbackExpirationTime) return;\n                    cancelDeferredCallback(callbackID);\n                } else startRequestCallbackTimer();\n                var currentMs = now() - originalStartTimeMs, expirationMs = expirationTimeToMs(expirationTime), timeout = expirationMs - currentMs;\n                callbackExpirationTime = expirationTime, callbackID = scheduleDeferredCallback(performAsyncWork, {\n                    timeout: timeout\n                });\n            }\n            function requestRetry(root, expirationTime) {\n                (root.remainingExpirationTime === NoWork || root.remainingExpirationTime < expirationTime) && requestWork(root, expirationTime);\n            }\n            function requestWork(root, expirationTime) {\n                if (addRootToSchedule(root, expirationTime), !isRendering) return isBatchingUpdates ? void (isUnbatchingUpdates && (nextFlushedRoot = root, \n                nextFlushedExpirationTime = Sync, performWorkOnRoot(root, Sync, !1))) : void (expirationTime === Sync ? performSyncWork() : scheduleCallbackWithExpiration(expirationTime));\n            }\n            function addRootToSchedule(root, expirationTime) {\n                if (null === root.nextScheduledRoot) root.remainingExpirationTime = expirationTime, \n                null === lastScheduledRoot ? (firstScheduledRoot = lastScheduledRoot = root, root.nextScheduledRoot = root) : (lastScheduledRoot.nextScheduledRoot = root, \n                lastScheduledRoot = root, lastScheduledRoot.nextScheduledRoot = firstScheduledRoot); else {\n                    var remainingExpirationTime = root.remainingExpirationTime;\n                    (remainingExpirationTime === NoWork || expirationTime < remainingExpirationTime) && (root.remainingExpirationTime = expirationTime);\n                }\n            }\n            function findHighestPriorityRoot() {\n                var highestPriorityWork = NoWork, highestPriorityRoot = null;\n                if (null !== lastScheduledRoot) for (var previousScheduledRoot = lastScheduledRoot, root = firstScheduledRoot; null !== root; ) {\n                    var remainingExpirationTime = root.remainingExpirationTime;\n                    if (remainingExpirationTime === NoWork) {\n                        if ((null === previousScheduledRoot || null === lastScheduledRoot) && invariant(!1, \"Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue.\"), \n                        root === root.nextScheduledRoot) {\n                            root.nextScheduledRoot = null, firstScheduledRoot = lastScheduledRoot = null;\n                            break;\n                        }\n                        if (root === firstScheduledRoot) {\n                            var next = root.nextScheduledRoot;\n                            firstScheduledRoot = next, lastScheduledRoot.nextScheduledRoot = next, root.nextScheduledRoot = null;\n                        } else {\n                            if (root === lastScheduledRoot) {\n                                lastScheduledRoot = previousScheduledRoot, lastScheduledRoot.nextScheduledRoot = firstScheduledRoot, \n                                root.nextScheduledRoot = null;\n                                break;\n                            }\n                            previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot, root.nextScheduledRoot = null;\n                        }\n                        root = previousScheduledRoot.nextScheduledRoot;\n                    } else {\n                        if ((highestPriorityWork === NoWork || remainingExpirationTime < highestPriorityWork) && (highestPriorityWork = remainingExpirationTime, \n                        highestPriorityRoot = root), root === lastScheduledRoot) break;\n                        previousScheduledRoot = root, root = root.nextScheduledRoot;\n                    }\n                }\n                var previousFlushedRoot = nextFlushedRoot;\n                null !== previousFlushedRoot && previousFlushedRoot === highestPriorityRoot && highestPriorityWork === Sync ? nestedUpdateCount++ : nestedUpdateCount = 0, \n                nextFlushedRoot = highestPriorityRoot, nextFlushedExpirationTime = highestPriorityWork;\n            }\n            function performAsyncWork(dl) {\n                performWork(NoWork, !0, dl);\n            }\n            function performSyncWork() {\n                performWork(Sync, !1, null);\n            }\n            function performWork(minExpirationTime, isAsync, dl) {\n                if (deadline = dl, findHighestPriorityRoot(), enableProfilerTimer && resumeActualRenderTimerIfPaused(), \n                enableUserTimingAPI && null !== deadline) {\n                    stopRequestCallbackTimer(nextFlushedExpirationTime < recalculateCurrentTime(), expirationTimeToMs(nextFlushedExpirationTime));\n                }\n                if (isAsync) for (;null !== nextFlushedRoot && nextFlushedExpirationTime !== NoWork && (minExpirationTime === NoWork || minExpirationTime >= nextFlushedExpirationTime) && (!deadlineDidExpire || recalculateCurrentTime() >= nextFlushedExpirationTime); ) recalculateCurrentTime(), \n                performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, !deadlineDidExpire), \n                findHighestPriorityRoot(); else for (;null !== nextFlushedRoot && nextFlushedExpirationTime !== NoWork && (minExpirationTime === NoWork || minExpirationTime >= nextFlushedExpirationTime); ) performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime, !1), \n                findHighestPriorityRoot();\n                null !== deadline && (callbackExpirationTime = NoWork, callbackID = -1), nextFlushedExpirationTime !== NoWork && scheduleCallbackWithExpiration(nextFlushedExpirationTime), \n                deadline = null, deadlineDidExpire = !1, finishRendering();\n            }\n            function flushRoot(root, expirationTime) {\n                isRendering && invariant(!1, \"work.commit(): Cannot commit while already rendering. This likely means you attempted to commit from inside a lifecycle method.\"), \n                nextFlushedRoot = root, nextFlushedExpirationTime = expirationTime, performWorkOnRoot(root, expirationTime, !1), \n                performSyncWork(), finishRendering();\n            }\n            function finishRendering() {\n                if (nestedUpdateCount = 0, null !== completedBatches) {\n                    var batches = completedBatches;\n                    completedBatches = null;\n                    for (var i = 0; i < batches.length; i++) {\n                        var batch = batches[i];\n                        try {\n                            batch._onComplete();\n                        } catch (error) {\n                            hasUnhandledError || (hasUnhandledError = !0, unhandledError = error);\n                        }\n                    }\n                }\n                if (hasUnhandledError) {\n                    var error = unhandledError;\n                    throw unhandledError = null, hasUnhandledError = !1, error;\n                }\n            }\n            function performWorkOnRoot(root, expirationTime, isAsync) {\n                if (isRendering && invariant(!1, \"performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.\"), \n                isRendering = !0, isAsync) {\n                    var _finishedWork = root.finishedWork;\n                    null !== _finishedWork ? completeRoot(root, _finishedWork, expirationTime) : (root.finishedWork = null, \n                    null !== (_finishedWork = renderRoot(root, expirationTime, !0)) && (shouldYield() ? (root.finishedWork = _finishedWork, \n                    enableProfilerTimer && pauseActualRenderTimerIfRunning()) : completeRoot(root, _finishedWork, expirationTime)));\n                } else {\n                    var finishedWork = root.finishedWork;\n                    null !== finishedWork ? completeRoot(root, finishedWork, expirationTime) : (root.finishedWork = null, \n                    null !== (finishedWork = renderRoot(root, expirationTime, !1)) && completeRoot(root, finishedWork, expirationTime));\n                }\n                isRendering = !1;\n            }\n            function completeRoot(root, finishedWork, expirationTime) {\n                var firstBatch = root.firstBatch;\n                if (null !== firstBatch && firstBatch._expirationTime <= expirationTime && (null === completedBatches ? completedBatches = [ firstBatch ] : completedBatches.push(firstBatch), \n                firstBatch._defer)) return root.finishedWork = finishedWork, void (root.remainingExpirationTime = NoWork);\n                root.finishedWork = null, root.remainingExpirationTime = commitRoot(finishedWork);\n            }\n            function shouldYield() {\n                return null !== deadline && (!(deadline.timeRemaining() > timeHeuristicForUnitOfWork) && (deadlineDidExpire = !0, \n                !0));\n            }\n            function onUncaughtError(error) {\n                null === nextFlushedRoot && invariant(!1, \"Should be working on a root. This error is likely caused by a bug in React. Please file an issue.\"), \n                nextFlushedRoot.remainingExpirationTime = NoWork, hasUnhandledError || (hasUnhandledError = !0, \n                unhandledError = error);\n            }\n            function onBlock(remainingExpirationTime) {\n                null === nextFlushedRoot && invariant(!1, \"Should be working on a root. This error is likely caused by a bug in React. Please file an issue.\"), \n                nextFlushedRoot.remainingExpirationTime = remainingExpirationTime;\n            }\n            function batchedUpdates$1(fn, a) {\n                var previousIsBatchingUpdates = isBatchingUpdates;\n                isBatchingUpdates = !0;\n                try {\n                    return fn(a);\n                } finally {\n                    isBatchingUpdates = previousIsBatchingUpdates, isBatchingUpdates || isRendering || performSyncWork();\n                }\n            }\n            function unbatchedUpdates(fn, a) {\n                if (isBatchingUpdates && !isUnbatchingUpdates) {\n                    isUnbatchingUpdates = !0;\n                    try {\n                        return fn(a);\n                    } finally {\n                        isUnbatchingUpdates = !1;\n                    }\n                }\n                return fn(a);\n            }\n            function flushSync(fn, a) {\n                isRendering && invariant(!1, \"flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.\");\n                var previousIsBatchingUpdates = isBatchingUpdates;\n                isBatchingUpdates = !0;\n                try {\n                    return syncUpdates(fn, a);\n                } finally {\n                    isBatchingUpdates = previousIsBatchingUpdates, performSyncWork();\n                }\n            }\n            function interactiveUpdates$1(fn, a, b) {\n                if (isBatchingInteractiveUpdates) return fn(a, b);\n                isBatchingUpdates || isRendering || lowestPendingInteractiveExpirationTime === NoWork || (performWork(lowestPendingInteractiveExpirationTime, !1, null), \n                lowestPendingInteractiveExpirationTime = NoWork);\n                var previousIsBatchingInteractiveUpdates = isBatchingInteractiveUpdates, previousIsBatchingUpdates = isBatchingUpdates;\n                isBatchingInteractiveUpdates = !0, isBatchingUpdates = !0;\n                try {\n                    return fn(a, b);\n                } finally {\n                    isBatchingInteractiveUpdates = previousIsBatchingInteractiveUpdates, isBatchingUpdates = previousIsBatchingUpdates, \n                    isBatchingUpdates || isRendering || performSyncWork();\n                }\n            }\n            function flushInteractiveUpdates$1() {\n                isRendering || lowestPendingInteractiveExpirationTime === NoWork || (performWork(lowestPendingInteractiveExpirationTime, !1, null), \n                lowestPendingInteractiveExpirationTime = NoWork);\n            }\n            function flushControlled(fn) {\n                var previousIsBatchingUpdates = isBatchingUpdates;\n                isBatchingUpdates = !0;\n                try {\n                    syncUpdates(fn);\n                } finally {\n                    isBatchingUpdates = previousIsBatchingUpdates, isBatchingUpdates || isRendering || performWork(Sync, !1, null);\n                }\n            }\n            function getContextForSubtree(parentComponent) {\n                if (!parentComponent) return emptyObject;\n                var fiber = get(parentComponent), parentContext = findCurrentUnmaskedContext(fiber);\n                return isContextProvider(fiber) ? processChildContext(fiber, parentContext) : parentContext;\n            }\n            function scheduleRootUpdate(current, element, expirationTime, callback) {\n                \"render\" !== ReactDebugCurrentFiber.phase || null === ReactDebugCurrentFiber.current || didWarnAboutNestedUpdates || (didWarnAboutNestedUpdates = !0, \n                warning(!1, \"Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\\n\\nCheck the render method of %s.\", getComponentName(ReactDebugCurrentFiber.current) || \"Unknown\"));\n                var update = createUpdate(expirationTime);\n                return update.payload = {\n                    element: element\n                }, callback = void 0 === callback ? null : callback, null !== callback && (\"function\" != typeof callback && warning(!1, \"render(...): Expected the last optional ` + \"`\"))) + ((`callback` + (\"`\" + ` argument to be a function. Instead received: %s.\", callback), \n                update.callback = callback), enqueueUpdate(current, update, expirationTime), scheduleWork$1(current, expirationTime), \n                expirationTime;\n            }\n            function updateContainerAtExpirationTime(element, container, parentComponent, expirationTime, callback) {\n                var current = container.current;\n                ReactFiberInstrumentation_1.debugTool && (null === current.alternate ? ReactFiberInstrumentation_1.debugTool.onMountContainer(container) : null === element ? ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container) : ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container));\n                var context = getContextForSubtree(parentComponent);\n                return null === container.context ? container.context = context : container.pendingContext = context, \n                scheduleRootUpdate(current, element, expirationTime, callback);\n            }\n            function findHostInstance(component) {\n                var fiber = get(component);\n                void 0 === fiber && (\"function\" == typeof component.render ? invariant(!1, \"Unable to find node on an unmounted component.\") : invariant(!1, \"Argument appears to not be a ReactComponent. Keys: %s\", Object.keys(component)));\n                var hostFiber = findCurrentHostFiber(fiber);\n                return null === hostFiber ? null : hostFiber.stateNode;\n            }\n            function createContainer(containerInfo, isAsync, hydrate) {\n                return createFiberRoot(containerInfo, isAsync, hydrate);\n            }\n            function updateContainer(element, container, parentComponent, callback) {\n                var current = container.current;\n                return updateContainerAtExpirationTime(element, container, parentComponent, computeExpirationForFiber(recalculateCurrentTime(), current), callback);\n            }\n            function getPublicRootInstance(container) {\n                var containerFiber = container.current;\n                if (!containerFiber.child) return null;\n                switch (containerFiber.child.tag) {\n                  case HostComponent:\n                    return getPublicInstance(containerFiber.child.stateNode);\n\n                  default:\n                    return containerFiber.child.stateNode;\n                }\n            }\n            function findHostInstanceWithNoPortals(fiber) {\n                var hostFiber = findCurrentHostFiberWithNoPortals(fiber);\n                return null === hostFiber ? null : hostFiber.stateNode;\n            }\n            function injectIntoDevTools(devToolsConfig) {\n                var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;\n                return injectInternals(_assign({}, devToolsConfig, {\n                    findHostInstanceByFiber: function(fiber) {\n                        var hostFiber = findCurrentHostFiber(fiber);\n                        return null === hostFiber ? null : hostFiber.stateNode;\n                    },\n                    findFiberByHostInstance: function(instance) {\n                        return findFiberByHostInstance ? findFiberByHostInstance(instance) : null;\n                    }\n                }));\n            }\n            function createPortal$1(children, containerInfo, implementation) {\n                var key = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : null;\n                return {\n                    $$typeof: REACT_PORTAL_TYPE,\n                    key: null == key ? null : \"\" + key,\n                    children: children,\n                    containerInfo: containerInfo,\n                    implementation: implementation\n                };\n            }\n            function ReactBatch(root) {\n                var expirationTime = computeUniqueAsyncExpiration();\n                this._expirationTime = expirationTime, this._root = root, this._next = null, this._callbacks = null, \n                this._didComplete = !1, this._hasChildren = !1, this._children = null, this._defer = !0;\n            }\n            function ReactWork() {\n                this._callbacks = null, this._didCommit = !1, this._onCommit = this._onCommit.bind(this);\n            }\n            function ReactRoot(container, isAsync, hydrate) {\n                var root = createContainer(container, isAsync, hydrate);\n                this._internalRoot = root;\n            }\n            function isValidContainer(node) {\n                return !(!node || node.nodeType !== ELEMENT_NODE && node.nodeType !== DOCUMENT_NODE && node.nodeType !== DOCUMENT_FRAGMENT_NODE && (node.nodeType !== COMMENT_NODE || \" react-mount-point-unstable \" !== node.nodeValue));\n            }\n            function getReactRootElementInContainer(container) {\n                return container ? container.nodeType === DOCUMENT_NODE ? container.documentElement : container.firstChild : null;\n            }\n            function shouldHydrateDueToLegacyHeuristic(container) {\n                var rootElement = getReactRootElementInContainer(container);\n                return !(!rootElement || rootElement.nodeType !== ELEMENT_NODE || !rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));\n            }\n            function legacyCreateRootFromDOMContainer(container, forceHydrate) {\n                var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container);\n                if (!shouldHydrate) for (var warned = !1, rootSibling = void 0; rootSibling = container.lastChild; ) !warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME) && (warned = !0, \n                warning(!1, \"render(): Target node has markup rendered by React, but there are unrelated nodes as well. This is most commonly caused by white-space inserted around server-rendered markup.\")), \n                container.removeChild(rootSibling);\n                !shouldHydrate || forceHydrate || warnedAboutHydrateAPI || (warnedAboutHydrateAPI = !0, \n                lowPriorityWarning$1(!1, \"render(): Calling ReactDOM.render() to hydrate server-rendered markup will stop working in React v17. Replace the ReactDOM.render() call with ReactDOM.hydrate() if you want React to attach to the server HTML.\"));\n                return new ReactRoot(container, !1, shouldHydrate);\n            }\n            function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {\n                isValidContainer(container) || invariant(!1, \"Target container is not a DOM element.\"), \n                topLevelUpdateWarnings(container);\n                var root = container._reactRootContainer;\n                if (root) {\n                    if (\"function\" == typeof callback) {\n                        var _originalCallback = callback;\n                        callback = function() {\n                            var instance = getPublicRootInstance(root._internalRoot);\n                            _originalCallback.call(instance);\n                        };\n                    }\n                    null != parentComponent ? root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback) : root.render(children, callback);\n                } else {\n                    if (root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate), \n                    \"function\" == typeof callback) {\n                        var originalCallback = callback;\n                        callback = function() {\n                            var instance = getPublicRootInstance(root._internalRoot);\n                            originalCallback.call(instance);\n                        };\n                    }\n                    unbatchedUpdates(function() {\n                        null != parentComponent ? root.legacy_renderSubtreeIntoContainer(parentComponent, children, callback) : root.render(children, callback);\n                    });\n                }\n                return getPublicRootInstance(root._internalRoot);\n            }\n            function createPortal(children, container) {\n                var key = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null;\n                return isValidContainer(container) || invariant(!1, \"Target container is not a DOM element.\"), \n                createPortal$1(children, container, null, key);\n            }\n            var invariant = __webpack_require__(49), React = __webpack_require__(0), warning = __webpack_require__(98), ExecutionEnvironment = __webpack_require__(219), _assign = __webpack_require__(74), emptyFunction = __webpack_require__(50), checkPropTypes = __webpack_require__(143), getActiveElement = __webpack_require__(220), shallowEqual = __webpack_require__(100), containsNode = __webpack_require__(221), emptyObject = __webpack_require__(97), hyphenateStyleName = __webpack_require__(382), camelizeStyleName = __webpack_require__(384);\n            React || invariant(!1, \"ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.\");\n            var invokeGuardedCallback = function(name, func, context, a, b, c, d, e, f) {\n                this._hasCaughtError = !1, this._caughtError = null;\n                var funcArgs = Array.prototype.slice.call(arguments, 3);\n                try {\n                    func.apply(context, funcArgs);\n                } catch (error) {\n                    this._caughtError = error, this._hasCaughtError = !0;\n                }\n            };\n            if (\"undefined\" != typeof window && \"function\" == typeof window.dispatchEvent && \"undefined\" != typeof document && \"function\" == typeof document.createEvent) {\n                var fakeNode = document.createElement(\"react\");\n                invokeGuardedCallback = function(name, func, context, a, b, c, d, e, f) {\n                    function callCallback() {\n                        fakeNode.removeEventListener(evtType, callCallback, !1), func.apply(context, funcArgs), \n                        didError = !1;\n                    }\n                    function onError(event) {\n                        error = event.error, didSetError = !0, null === error && 0 === event.colno && 0 === event.lineno && (isCrossOriginError = !0);\n                    }\n                    \"undefined\" == typeof document && invariant(!1, \"The `)) + (\"`\" + (`document` + \"`\")))))) + (((((` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in ` + (\"`\" + `componentWillUnmount`)) + (\"`\" + (`), or you can change the test itself to be asynchronous.\");\n                    var evt = document.createEvent(\"Event\"), didError = !0, funcArgs = Array.prototype.slice.call(arguments, 3), error = void 0, didSetError = !1, isCrossOriginError = !1, evtType = \"react-\" + (name || \"invokeguardedcallback\");\n                    window.addEventListener(\"error\", onError), fakeNode.addEventListener(evtType, callCallback, !1), \n                    evt.initEvent(evtType, !1, !1), fakeNode.dispatchEvent(evt), didError ? (didSetError ? isCrossOriginError && (error = new Error(\"A cross-origin error was thrown. React doesn't have access to the actual error object in development. See https://fb.me/react-crossorigin-error for more information.\")) : error = new Error(\"An error was thrown inside one of your components, but React doesn't know what it was. This is likely due to browser flakiness. React does its best to preserve the \\\"Pause on exceptions\\\" behavior of the DevTools, which requires some DEV-mode only tricks. It's possible that these don't work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue.\"), \n                    this._hasCaughtError = !0, this._caughtError = error) : (this._hasCaughtError = !1, \n                    this._caughtError = null), window.removeEventListener(\"error\", onError);\n                };\n            }\n            var invokeGuardedCallback$1 = invokeGuardedCallback, ReactErrorUtils = {\n                _caughtError: null,\n                _hasCaughtError: !1,\n                _rethrowError: null,\n                _hasRethrowError: !1,\n                invokeGuardedCallback: function(name, func, context, a, b, c, d, e, f) {\n                    invokeGuardedCallback$1.apply(ReactErrorUtils, arguments);\n                },\n                invokeGuardedCallbackAndCatchFirstError: function(name, func, context, a, b, c, d, e, f) {\n                    if (ReactErrorUtils.invokeGuardedCallback.apply(this, arguments), ReactErrorUtils.hasCaughtError()) {\n                        var error = ReactErrorUtils.clearCaughtError();\n                        ReactErrorUtils._hasRethrowError || (ReactErrorUtils._hasRethrowError = !0, ReactErrorUtils._rethrowError = error);\n                    }\n                },\n                rethrowCaughtError: function() {\n                    return rethrowCaughtError.apply(ReactErrorUtils, arguments);\n                },\n                hasCaughtError: function() {\n                    return ReactErrorUtils._hasCaughtError;\n                },\n                clearCaughtError: function() {\n                    if (ReactErrorUtils._hasCaughtError) {\n                        var error = ReactErrorUtils._caughtError;\n                        return ReactErrorUtils._caughtError = null, ReactErrorUtils._hasCaughtError = !1, \n                        error;\n                    }\n                    invariant(!1, \"clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.\");\n                }\n            }, rethrowCaughtError = function() {\n                if (ReactErrorUtils._hasRethrowError) {\n                    var error = ReactErrorUtils._rethrowError;\n                    throw ReactErrorUtils._rethrowError = null, ReactErrorUtils._hasRethrowError = !1, \n                    error;\n                }\n            }, eventPluginOrder = null, namesToPlugins = {}, plugins = [], eventNameDispatchConfigs = {}, registrationNameModules = {}, registrationNameDependencies = {}, possibleRegistrationNames = {}, EventPluginRegistry = Object.freeze({\n                plugins: plugins,\n                eventNameDispatchConfigs: eventNameDispatchConfigs,\n                registrationNameModules: registrationNameModules,\n                registrationNameDependencies: registrationNameDependencies,\n                possibleRegistrationNames: possibleRegistrationNames,\n                injectEventPluginOrder: injectEventPluginOrder,\n                injectEventPluginsByName: injectEventPluginsByName\n            }), getFiberCurrentPropsFromNode = null, getInstanceFromNode = null, getNodeFromInstance = null, injection$1 = {\n                injectComponentTree: function(Injected) {\n                    getFiberCurrentPropsFromNode = Injected.getFiberCurrentPropsFromNode, getInstanceFromNode = Injected.getInstanceFromNode, \n                    (getNodeFromInstance = Injected.getNodeFromInstance) && getInstanceFromNode || warning(!1, \"EventPluginUtils.injection.injectComponentTree(...): Injected module is missing getNodeFromInstance or getInstanceFromNode.\");\n                }\n            }, validateEventDispatches = void 0;\n            validateEventDispatches = function(event) {\n                var dispatchListeners = event._dispatchListeners, dispatchInstances = event._dispatchInstances, listenersIsArr = Array.isArray(dispatchListeners), listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0, instancesIsArr = Array.isArray(dispatchInstances), instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;\n                (instancesIsArr !== listenersIsArr || instancesLen !== listenersLen) && warning(!1, \"EventPluginUtils: Invalid ` + \"`\"))) + ((`event` + (\"`\" + `.\");\n            };\n            var eventQueue = null, executeDispatchesAndRelease = function(event, simulated) {\n                event && (executeDispatchesInOrder(event, simulated), event.isPersistent() || event.constructor.release(event));\n            }, executeDispatchesAndReleaseSimulated = function(e) {\n                return executeDispatchesAndRelease(e, !0);\n            }, executeDispatchesAndReleaseTopLevel = function(e) {\n                return executeDispatchesAndRelease(e, !1);\n            }, injection = {\n                injectEventPluginOrder: injectEventPluginOrder,\n                injectEventPluginsByName: injectEventPluginsByName\n            }, EventPluginHub = Object.freeze({\n                injection: injection,\n                getListener: getListener,\n                runEventsInBatch: runEventsInBatch,\n                runExtractedEventsInBatch: runExtractedEventsInBatch\n            }), IndeterminateComponent = 0, FunctionalComponent = 1, ClassComponent = 2, HostRoot = 3, HostPortal = 4, HostComponent = 5, HostText = 6, Fragment = 10, Mode = 11, ContextConsumer = 12, ContextProvider = 13, ForwardRef = 14, Profiler = 15, TimeoutComponent = 16, randomKey = Math.random().toString(36).slice(2), internalInstanceKey = \"__reactInternalInstance$\" + randomKey, internalEventHandlersKey = \"__reactEventHandlers$\" + randomKey, ReactDOMComponentTree = Object.freeze({\n                precacheFiberNode: precacheFiberNode,\n                getClosestInstanceFromNode: getClosestInstanceFromNode,\n                getInstanceFromNode: getInstanceFromNode$1,\n                getNodeFromInstance: getNodeFromInstance$1,\n                getFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode$1,\n                updateFiberProps: updateFiberProps\n            }), EventPropagators = Object.freeze({\n                accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,\n                accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,\n                accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches,\n                accumulateDirectDispatches: accumulateDirectDispatches\n            }), vendorPrefixes = {\n                animationend: makePrefixMap(\"Animation\", \"AnimationEnd\"),\n                animationiteration: makePrefixMap(\"Animation\", \"AnimationIteration\"),\n                animationstart: makePrefixMap(\"Animation\", \"AnimationStart\"),\n                transitionend: makePrefixMap(\"Transition\", \"TransitionEnd\")\n            }, prefixedEventNames = {}, style = {};\n            ExecutionEnvironment.canUseDOM && (style = document.createElement(\"div\").style, \n            \"AnimationEvent\" in window || (delete vendorPrefixes.animationend.animation, delete vendorPrefixes.animationiteration.animation, \n            delete vendorPrefixes.animationstart.animation), \"TransitionEvent\" in window || delete vendorPrefixes.transitionend.transition);\n            var TOP_ABORT = unsafeCastStringToDOMTopLevelType(\"abort\"), TOP_ANIMATION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName(\"animationend\")), TOP_ANIMATION_ITERATION = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName(\"animationiteration\")), TOP_ANIMATION_START = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName(\"animationstart\")), TOP_BLUR = unsafeCastStringToDOMTopLevelType(\"blur\"), TOP_CAN_PLAY = unsafeCastStringToDOMTopLevelType(\"canplay\"), TOP_CAN_PLAY_THROUGH = unsafeCastStringToDOMTopLevelType(\"canplaythrough\"), TOP_CANCEL = unsafeCastStringToDOMTopLevelType(\"cancel\"), TOP_CHANGE = unsafeCastStringToDOMTopLevelType(\"change\"), TOP_CLICK = unsafeCastStringToDOMTopLevelType(\"click\"), TOP_CLOSE = unsafeCastStringToDOMTopLevelType(\"close\"), TOP_COMPOSITION_END = unsafeCastStringToDOMTopLevelType(\"compositionend\"), TOP_COMPOSITION_START = unsafeCastStringToDOMTopLevelType(\"compositionstart\"), TOP_COMPOSITION_UPDATE = unsafeCastStringToDOMTopLevelType(\"compositionupdate\"), TOP_CONTEXT_MENU = unsafeCastStringToDOMTopLevelType(\"contextmenu\"), TOP_COPY = unsafeCastStringToDOMTopLevelType(\"copy\"), TOP_CUT = unsafeCastStringToDOMTopLevelType(\"cut\"), TOP_DOUBLE_CLICK = unsafeCastStringToDOMTopLevelType(\"dblclick\"), TOP_DRAG = unsafeCastStringToDOMTopLevelType(\"drag\"), TOP_DRAG_END = unsafeCastStringToDOMTopLevelType(\"dragend\"), TOP_DRAG_ENTER = unsafeCastStringToDOMTopLevelType(\"dragenter\"), TOP_DRAG_EXIT = unsafeCastStringToDOMTopLevelType(\"dragexit\"), TOP_DRAG_LEAVE = unsafeCastStringToDOMTopLevelType(\"dragleave\"), TOP_DRAG_OVER = unsafeCastStringToDOMTopLevelType(\"dragover\"), TOP_DRAG_START = unsafeCastStringToDOMTopLevelType(\"dragstart\"), TOP_DROP = unsafeCastStringToDOMTopLevelType(\"drop\"), TOP_DURATION_CHANGE = unsafeCastStringToDOMTopLevelType(\"durationchange\"), TOP_EMPTIED = unsafeCastStringToDOMTopLevelType(\"emptied\"), TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType(\"encrypted\"), TOP_ENDED = unsafeCastStringToDOMTopLevelType(\"ended\"), TOP_ERROR = unsafeCastStringToDOMTopLevelType(\"error\"), TOP_FOCUS = unsafeCastStringToDOMTopLevelType(\"focus\"), TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType(\"gotpointercapture\"), TOP_INPUT = unsafeCastStringToDOMTopLevelType(\"input\"), TOP_INVALID = unsafeCastStringToDOMTopLevelType(\"invalid\"), TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType(\"keydown\"), TOP_KEY_PRESS = unsafeCastStringToDOMTopLevelType(\"keypress\"), TOP_KEY_UP = unsafeCastStringToDOMTopLevelType(\"keyup\"), TOP_LOAD = unsafeCastStringToDOMTopLevelType(\"load\"), TOP_LOAD_START = unsafeCastStringToDOMTopLevelType(\"loadstart\"), TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType(\"loadeddata\"), TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType(\"loadedmetadata\"), TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType(\"lostpointercapture\"), TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType(\"mousedown\"), TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType(\"mousemove\"), TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType(\"mouseout\"), TOP_MOUSE_OVER = unsafeCastStringToDOMTopLevelType(\"mouseover\"), TOP_MOUSE_UP = unsafeCastStringToDOMTopLevelType(\"mouseup\"), TOP_PASTE = unsafeCastStringToDOMTopLevelType(\"paste\"), TOP_PAUSE = unsafeCastStringToDOMTopLevelType(\"pause\"), TOP_PLAY = unsafeCastStringToDOMTopLevelType(\"play\"), TOP_PLAYING = unsafeCastStringToDOMTopLevelType(\"playing\"), TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType(\"pointercancel\"), TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType(\"pointerdown\"), TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType(\"pointermove\"), TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType(\"pointerout\"), TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType(\"pointerover\"), TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType(\"pointerup\"), TOP_PROGRESS = unsafeCastStringToDOMTopLevelType(\"progress\"), TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType(\"ratechange\"), TOP_RESET = unsafeCastStringToDOMTopLevelType(\"reset\"), TOP_SCROLL = unsafeCastStringToDOMTopLevelType(\"scroll\"), TOP_SEEKED = unsafeCastStringToDOMTopLevelType(\"seeked\"), TOP_SEEKING = unsafeCastStringToDOMTopLevelType(\"seeking\"), TOP_SELECTION_CHANGE = unsafeCastStringToDOMTopLevelType(\"selectionchange\"), TOP_STALLED = unsafeCastStringToDOMTopLevelType(\"stalled\"), TOP_SUBMIT = unsafeCastStringToDOMTopLevelType(\"submit\"), TOP_SUSPEND = unsafeCastStringToDOMTopLevelType(\"suspend\"), TOP_TEXT_INPUT = unsafeCastStringToDOMTopLevelType(\"textInput\"), TOP_TIME_UPDATE = unsafeCastStringToDOMTopLevelType(\"timeupdate\"), TOP_TOGGLE = unsafeCastStringToDOMTopLevelType(\"toggle\"), TOP_TOUCH_CANCEL = unsafeCastStringToDOMTopLevelType(\"touchcancel\"), TOP_TOUCH_END = unsafeCastStringToDOMTopLevelType(\"touchend\"), TOP_TOUCH_MOVE = unsafeCastStringToDOMTopLevelType(\"touchmove\"), TOP_TOUCH_START = unsafeCastStringToDOMTopLevelType(\"touchstart\"), TOP_TRANSITION_END = unsafeCastStringToDOMTopLevelType(getVendorPrefixedEventName(\"transitionend\")), TOP_VOLUME_CHANGE = unsafeCastStringToDOMTopLevelType(\"volumechange\"), TOP_WAITING = unsafeCastStringToDOMTopLevelType(\"waiting\"), TOP_WHEEL = unsafeCastStringToDOMTopLevelType(\"wheel\"), mediaEventTypes = [ TOP_ABORT, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_VOLUME_CHANGE, TOP_WAITING ], contentKey = null, compositionState = {\n                _root: null,\n                _startText: null,\n                _fallbackText: null\n            }, didWarnForAddedNewProperty = !1, EVENT_POOL_SIZE = 10, shouldBeReleasedProperties = [ \"dispatchConfig\", \"_targetInst\", \"nativeEvent\", \"isDefaultPrevented\", \"isPropagationStopped\", \"_dispatchListeners\", \"_dispatchInstances\" ], EventInterface = {\n                type: null,\n                target: null,\n                currentTarget: emptyFunction.thatReturnsNull,\n                eventPhase: null,\n                bubbles: null,\n                cancelable: null,\n                timeStamp: function(event) {\n                    return event.timeStamp || Date.now();\n                },\n                defaultPrevented: null,\n                isTrusted: null\n            };\n            _assign(SyntheticEvent.prototype, {\n                preventDefault: function() {\n                    this.defaultPrevented = !0;\n                    var event = this.nativeEvent;\n                    event && (event.preventDefault ? event.preventDefault() : \"unknown\" != typeof event.returnValue && (event.returnValue = !1), \n                    this.isDefaultPrevented = emptyFunction.thatReturnsTrue);\n                },\n                stopPropagation: function() {\n                    var event = this.nativeEvent;\n                    event && (event.stopPropagation ? event.stopPropagation() : \"unknown\" != typeof event.cancelBubble && (event.cancelBubble = !0), \n                    this.isPropagationStopped = emptyFunction.thatReturnsTrue);\n                },\n                persist: function() {\n                    this.isPersistent = emptyFunction.thatReturnsTrue;\n                },\n                isPersistent: emptyFunction.thatReturnsFalse,\n                destructor: function() {\n                    var Interface = this.constructor.Interface;\n                    for (var propName in Interface) Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));\n                    for (var i = 0; i < shouldBeReleasedProperties.length; i++) this[shouldBeReleasedProperties[i]] = null;\n                    Object.defineProperty(this, \"nativeEvent\", getPooledWarningPropertyDefinition(\"nativeEvent\", null)), \n                    Object.defineProperty(this, \"preventDefault\", getPooledWarningPropertyDefinition(\"preventDefault\", emptyFunction)), \n                    Object.defineProperty(this, \"stopPropagation\", getPooledWarningPropertyDefinition(\"stopPropagation\", emptyFunction));\n                }\n            }), SyntheticEvent.Interface = EventInterface, SyntheticEvent.extend = function(Interface) {\n                function Class() {\n                    return Super.apply(this, arguments);\n                }\n                var Super = this, E = function() {};\n                E.prototype = Super.prototype;\n                var prototype = new E();\n                return _assign(prototype, Class.prototype), Class.prototype = prototype, Class.prototype.constructor = Class, \n                Class.Interface = _assign({}, Super.Interface, Interface), Class.extend = Super.extend, \n                addEventPoolingTo(Class), Class;\n            }, \"function\" == typeof Proxy && !Object.isSealed(new Proxy({}, {})) && (SyntheticEvent = new Proxy(SyntheticEvent, {\n                construct: function(target, args) {\n                    return this.apply(target, Object.create(target.prototype), args);\n                },\n                apply: function(constructor, that, args) {\n                    return new Proxy(constructor.apply(that, args), {\n                        set: function(target, prop, value) {\n                            return \"isPersistent\" === prop || target.constructor.Interface.hasOwnProperty(prop) || -1 !== shouldBeReleasedProperties.indexOf(prop) || (didWarnForAddedNewProperty || target.isPersistent() || warning(!1, \"This synthetic event is reused for performance reasons. If you're seeing this, you're adding a new property in the synthetic event object. The property is never released. See https://fb.me/react-event-pooling for more information.\"), \n                            didWarnForAddedNewProperty = !0), target[prop] = value, !0;\n                        }\n                    });\n                }\n            })), addEventPoolingTo(SyntheticEvent);\n            var SyntheticEvent$1 = SyntheticEvent, SyntheticCompositionEvent = SyntheticEvent$1.extend({\n                data: null\n            }), SyntheticInputEvent = SyntheticEvent$1.extend({\n                data: null\n            }), END_KEYCODES = [ 9, 13, 27, 32 ], START_KEYCODE = 229, canUseCompositionEvent = ExecutionEnvironment.canUseDOM && \"CompositionEvent\" in window, documentMode = null;\n            ExecutionEnvironment.canUseDOM && \"documentMode\" in document && (documentMode = document.documentMode);\n            var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && \"TextEvent\" in window && !documentMode, useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11), SPACEBAR_CODE = 32, SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE), eventTypes = {\n                beforeInput: {\n                    phasedRegistrationNames: {\n                        bubbled: \"onBeforeInput\",\n                        captured: \"onBeforeInputCapture\"\n                    },\n                    dependencies: [ TOP_COMPOSITION_END, TOP_KEY_PRESS, TOP_TEXT_INPUT, TOP_PASTE ]\n                },\n                compositionEnd: {\n                    phasedRegistrationNames: {\n                        bubbled: \"onCompositionEnd\",\n                        captured: \"onCompositionEndCapture\"\n                    },\n                    dependencies: [ TOP_BLUR, TOP_COMPOSITION_END, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN ]\n                },\n                compositionStart: {\n                    phasedRegistrationNames: {\n                        bubbled: \"onCompositionStart\",\n                        captured: \"onCompositionStartCapture\"\n                    },\n                    dependencies: [ TOP_BLUR, TOP_COMPOSITION_START, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN ]\n                },\n                compositionUpdate: {\n                    phasedRegistrationNames: {\n                        bubbled: \"onCompositionUpdate\",\n                        captured: \"onCompositionUpdateCapture\"\n                    },\n                    dependencies: [ TOP_BLUR, TOP_COMPOSITION_UPDATE, TOP_KEY_DOWN, TOP_KEY_PRESS, TOP_KEY_UP, TOP_MOUSE_DOWN ]\n                }\n            }, hasSpaceKeypress = !1, isComposing = !1, BeforeInputEventPlugin = {\n                eventTypes: eventTypes,\n                extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                    var composition = extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), beforeInput = extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n                    return null === composition ? beforeInput : null === beforeInput ? composition : [ composition, beforeInput ];\n                }\n            }, fiberHostComponent = null, ReactControlledComponentInjection = {\n                injectFiberControlledHostComponent: function(hostComponentImpl) {\n                    fiberHostComponent = hostComponentImpl;\n                }\n            }, restoreTarget = null, restoreQueue = null, injection$2 = ReactControlledComponentInjection, ReactControlledComponent = Object.freeze({\n                injection: injection$2,\n                enqueueStateRestore: enqueueStateRestore,\n                needsStateRestore: needsStateRestore,\n                restoreStateIfNeeded: restoreStateIfNeeded\n            }), _batchedUpdates = function(fn, bookkeeping) {\n                return fn(bookkeeping);\n            }, _interactiveUpdates = function(fn, a, b) {\n                return fn(a, b);\n            }, _flushInteractiveUpdates = function() {}, isBatching = !1, injection$3 = {\n                injectRenderer: function(renderer) {\n                    _batchedUpdates = renderer.batchedUpdates, _interactiveUpdates = renderer.interactiveUpdates, \n                    _flushInteractiveUpdates = renderer.flushInteractiveUpdates;\n                }\n            }, supportedInputTypes = {\n                color: !0,\n                date: !0,\n                datetime: !0,\n                \"datetime-local\": !0,\n                email: !0,\n                month: !0,\n                number: !0,\n                password: !0,\n                range: !0,\n                search: !0,\n                tel: !0,\n                text: !0,\n                time: !0,\n                url: !0,\n                week: !0\n            }, ELEMENT_NODE = 1, TEXT_NODE = 3, COMMENT_NODE = 8, DOCUMENT_NODE = 9, DOCUMENT_FRAGMENT_NODE = 11, ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, ReactCurrentOwner = ReactInternals.ReactCurrentOwner, ReactDebugCurrentFrame = ReactInternals.ReactDebugCurrentFrame, describeComponentFrame = function(name, source, ownerName) {\n                return \"\\n    in \" + (name || \"Unknown\") + (source ? \" (at \" + source.fileName.replace(/^.*[\\\\\\/]/, \"\") + \":\" + source.lineNumber + \")\" : ownerName ? \" (created by \" + ownerName + \")\" : \"\");\n            }, hasSymbol = \"function\" == typeof Symbol && Symbol.for, REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for(\"react.element\") : 60103, REACT_PORTAL_TYPE = hasSymbol ? Symbol.for(\"react.portal\") : 60106, REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for(\"react.fragment\") : 60107, REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for(\"react.strict_mode\") : 60108, REACT_PROFILER_TYPE = hasSymbol ? Symbol.for(\"react.profiler\") : 60114, REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for(\"react.provider\") : 60109, REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for(\"react.context\") : 60110, REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for(\"react.async_mode\") : 60111, REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for(\"react.forward_ref\") : 60112, REACT_TIMEOUT_TYPE = hasSymbol ? Symbol.for(\"react.timeout\") : 60113, MAYBE_ITERATOR_SYMBOL = \"function\" == typeof Symbol && Symbol.iterator, FAUX_ITERATOR_SYMBOL = \"@@iterator\", ReactDebugCurrentFiber = {\n                current: null,\n                phase: null,\n                resetCurrentFiber: resetCurrentFiber,\n                setCurrentFiber: setCurrentFiber,\n                setCurrentPhase: setCurrentPhase,\n                getCurrentFiberOwnerName: getCurrentFiberOwnerName$1,\n                getCurrentFiberStackAddendum: getCurrentFiberStackAddendum$1\n            }, RESERVED = 0, BOOLEANISH_STRING = 2, BOOLEAN = 3, OVERLOADED_BOOLEAN = 4, NUMERIC = 5, POSITIVE_NUMERIC = 6, ATTRIBUTE_NAME_START_CHAR = \":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\", ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + \"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\", ROOT_ATTRIBUTE_NAME = \"data-reactroot\", VALID_ATTRIBUTE_NAME_REGEX = new RegExp(\"^[\" + ATTRIBUTE_NAME_START_CHAR + \"][\" + ATTRIBUTE_NAME_CHAR + \"]*$\"), illegalAttributeNameCache = {}, validatedAttributeNameCache = {}, properties = {};\n            [ \"children\", \"dangerouslySetInnerHTML\", \"defaultValue\", \"defaultChecked\", \"innerHTML\", \"suppressContentEditableWarning\", \"suppressHydrationWarning\", \"style\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, RESERVED, !1, name, null);\n            }), [ [ \"acceptCharset\", \"accept-charset\" ], [ \"className\", \"class\" ], [ \"htmlFor\", \"for\" ], [ \"httpEquiv\", \"http-equiv\" ] ].forEach(function(_ref) {\n                var name = _ref[0], attributeName = _ref[1];\n                properties[name] = new PropertyInfoRecord(name, 1, !1, attributeName, null);\n            }), [ \"contentEditable\", \"draggable\", \"spellCheck\", \"value\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, !1, name.toLowerCase(), null);\n            }), [ \"autoReverse\", \"externalResourcesRequired\", \"preserveAlpha\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, !1, name, null);\n            }), [ \"allowFullScreen\", \"async\", \"autoFocus\", \"autoPlay\", \"controls\", \"default\", \"defer\", \"disabled\", \"formNoValidate\", \"hidden\", \"loop\", \"noModule\", \"noValidate\", \"open\", \"playsInline\", \"readOnly\", \"required\", \"reversed\", \"scoped\", \"seamless\", \"itemScope\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, BOOLEAN, !1, name.toLowerCase(), null);\n            }), [ \"checked\", \"multiple\", \"muted\", \"selected\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, BOOLEAN, !0, name.toLowerCase(), null);\n            }), [ \"capture\", \"download\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, !1, name.toLowerCase(), null);\n            }), [ \"cols\", \"rows\", \"size\", \"span\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, !1, name.toLowerCase(), null);\n            }), [ \"rowSpan\", \"start\" ].forEach(function(name) {\n                properties[name] = new PropertyInfoRecord(name, NUMERIC, !1, name.toLowerCase(), null);\n            });\n            var CAMELIZE = /[\\-\\:]([a-z])/g, capitalize = function(token) {\n                return token[1].toUpperCase();\n            };\n            [ \"accent-height\", \"alignment-baseline\", \"arabic-form\", \"baseline-shift\", \"cap-height\", \"clip-path\", \"clip-rule\", \"color-interpolation\", \"color-interpolation-filters\", \"color-profile\", \"color-rendering\", \"dominant-baseline\", \"enable-background\", \"fill-opacity\", \"fill-rule\", \"flood-color\", \"flood-opacity\", \"font-family\", \"font-size\", \"font-size-adjust\", \"font-stretch\", \"font-style\", \"font-variant\", \"font-weight\", \"glyph-name\", \"glyph-orientation-horizontal\", \"glyph-orientation-vertical\", \"horiz-adv-x\", \"horiz-origin-x\", \"image-rendering\", \"letter-spacing\", \"lighting-color\", \"marker-end\", \"marker-mid\", \"marker-start\", \"overline-position\", \"overline-thickness\", \"paint-order\", \"panose-1\", \"pointer-events\", \"rendering-intent\", \"shape-rendering\", \"stop-color\", \"stop-opacity\", \"strikethrough-position\", \"strikethrough-thickness\", \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\", \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-anchor\", \"text-decoration\", \"text-rendering\", \"underline-position\", \"underline-thickness\", \"unicode-bidi\", \"unicode-range\", \"units-per-em\", \"v-alphabetic\", \"v-hanging\", \"v-ideographic\", \"v-mathematical\", \"vector-effect\", \"vert-adv-y\", \"vert-origin-x\", \"vert-origin-y\", \"word-spacing\", \"writing-mode\", \"xmlns:xlink\", \"x-height\" ].forEach(function(attributeName) {\n                var name = attributeName.replace(CAMELIZE, capitalize);\n                properties[name] = new PropertyInfoRecord(name, 1, !1, attributeName, null);\n            }), [ \"xlink:actuate\", \"xlink:arcrole\", \"xlink:href\", \"xlink:role\", \"xlink:show\", \"xlink:title\", \"xlink:type\" ].forEach(function(attributeName) {\n                var name = attributeName.replace(CAMELIZE, capitalize);\n                properties[name] = new PropertyInfoRecord(name, 1, !1, attributeName, \"http://www.w3.org/1999/xlink\");\n            }), [ \"xml:base\", \"xml:lang\", \"xml:space\" ].forEach(function(attributeName) {\n                var name = attributeName.replace(CAMELIZE, capitalize);\n                properties[name] = new PropertyInfoRecord(name, 1, !1, attributeName, \"http://www.w3.org/XML/1998/namespace\");\n            }), properties.tabIndex = new PropertyInfoRecord(\"tabIndex\", 1, !1, \"tabindex\", null);\n            var ReactControlledValuePropTypes = {\n                checkPropTypes: null\n            }, hasReadOnlyValue = {\n                button: !0,\n                checkbox: !0,\n                image: !0,\n                hidden: !0,\n                radio: !0,\n                reset: !0,\n                submit: !0\n            }, propTypes = {\n                value: function(props, propName, componentName) {\n                    return !props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled ? null : new Error(\"You provided a `)) + (\"`\" + (`value` + \"`\")))) + (((` prop to a form field without an ` + (\"`\" + `onChange`)) + (\"`\" + (` handler. This will render a read-only field. If the field should be mutable use ` + \"`\"))) + ((`defaultValue` + (\"`\" + `. Otherwise, set either `)) + (\"`\" + (`onChange` + \"`\"))))) + ((((` or ` + (\"`\" + `readOnly`)) + (\"`\" + (`.\");\n                },\n                checked: function(props, propName, componentName) {\n                    return !props[propName] || props.onChange || props.readOnly || props.disabled ? null : new Error(\"You provided a ` + \"`\"))) + ((`checked` + (\"`\" + ` prop to a form field without an `)) + (\"`\" + (`onChange` + \"`\")))) + (((` handler. This will render a read-only field. If the field should be mutable use ` + (\"`\" + `defaultChecked`)) + (\"`\" + (`. Otherwise, set either ` + \"`\"))) + ((`onChange` + (\"`\" + ` or `)) + ((\"`\" + `readOnly`) + (\"`\" + `.\");\n                }\n            };\n            ReactControlledValuePropTypes.checkPropTypes = function(tagName, props, getStack) {\n                checkPropTypes(propTypes, props, \"prop\", tagName, getStack);\n            };\n            var getCurrentFiberOwnerName = ReactDebugCurrentFiber.getCurrentFiberOwnerName, getCurrentFiberStackAddendum = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnValueDefaultValue = !1, didWarnCheckedDefaultChecked = !1, didWarnControlledToUncontrolled = !1, didWarnUncontrolledToControlled = !1, eventTypes$1 = {\n                change: {\n                    phasedRegistrationNames: {\n                        bubbled: \"onChange\",\n                        captured: \"onChangeCapture\"\n                    },\n                    dependencies: [ TOP_BLUR, TOP_CHANGE, TOP_CLICK, TOP_FOCUS, TOP_INPUT, TOP_KEY_DOWN, TOP_KEY_UP, TOP_SELECTION_CHANGE ]\n                }\n            }, activeElement = null, activeElementInst = null, isInputEventSupported = !1;\n            ExecutionEnvironment.canUseDOM && (isInputEventSupported = isEventSupported(\"input\") && (!document.documentMode || document.documentMode > 9));\n            var ChangeEventPlugin = {\n                eventTypes: eventTypes$1,\n                _isInputEventSupported: isInputEventSupported,\n                extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window, getTargetInstFunc = void 0, handleEventFunc = void 0;\n                    if (shouldUseChangeEvent(targetNode) ? getTargetInstFunc = getTargetInstForChangeEvent : isTextInputElement(targetNode) ? isInputEventSupported ? getTargetInstFunc = getTargetInstForInputOrChangeEvent : (getTargetInstFunc = getTargetInstForInputEventPolyfill, \n                    handleEventFunc = handleEventsForInputEventPolyfill) : shouldUseClickEvent(targetNode) && (getTargetInstFunc = getTargetInstForClickEvent), \n                    getTargetInstFunc) {\n                        var inst = getTargetInstFunc(topLevelType, targetInst);\n                        if (inst) {\n                            return createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);\n                        }\n                    }\n                    handleEventFunc && handleEventFunc(topLevelType, targetNode, targetInst), topLevelType === TOP_BLUR && handleControlledInputBlur(targetInst, targetNode);\n                }\n            }, DOMEventPluginOrder = [ \"ResponderEventPlugin\", \"SimpleEventPlugin\", \"TapEventPlugin\", \"EnterLeaveEventPlugin\", \"ChangeEventPlugin\", \"SelectEventPlugin\", \"BeforeInputEventPlugin\" ], SyntheticUIEvent = SyntheticEvent$1.extend({\n                view: null,\n                detail: null\n            }), modifierKeyToProp = {\n                Alt: \"altKey\",\n                Control: \"ctrlKey\",\n                Meta: \"metaKey\",\n                Shift: \"shiftKey\"\n            }, SyntheticMouseEvent = SyntheticUIEvent.extend({\n                screenX: null,\n                screenY: null,\n                clientX: null,\n                clientY: null,\n                pageX: null,\n                pageY: null,\n                ctrlKey: null,\n                shiftKey: null,\n                altKey: null,\n                metaKey: null,\n                getModifierState: getEventModifierState,\n                button: null,\n                buttons: null,\n                relatedTarget: function(event) {\n                    return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n                }\n            }), SyntheticPointerEvent = SyntheticMouseEvent.extend({\n                pointerId: null,\n                width: null,\n                height: null,\n                pressure: null,\n                tiltX: null,\n                tiltY: null,\n                pointerType: null,\n                isPrimary: null\n            }), eventTypes$2 = {\n                mouseEnter: {\n                    registrationName: \"onMouseEnter\",\n                    dependencies: [ TOP_MOUSE_OUT, TOP_MOUSE_OVER ]\n                },\n                mouseLeave: {\n                    registrationName: \"onMouseLeave\",\n                    dependencies: [ TOP_MOUSE_OUT, TOP_MOUSE_OVER ]\n                },\n                pointerEnter: {\n                    registrationName: \"onPointerEnter\",\n                    dependencies: [ TOP_POINTER_OUT, TOP_POINTER_OVER ]\n                },\n                pointerLeave: {\n                    registrationName: \"onPointerLeave\",\n                    dependencies: [ TOP_POINTER_OUT, TOP_POINTER_OVER ]\n                }\n            }, EnterLeaveEventPlugin = {\n                eventTypes: eventTypes$2,\n                extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                    var isOverEvent = topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER, isOutEvent = topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;\n                    if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) return null;\n                    if (!isOutEvent && !isOverEvent) return null;\n                    var win = void 0;\n                    if (nativeEventTarget.window === nativeEventTarget) win = nativeEventTarget; else {\n                        var doc = nativeEventTarget.ownerDocument;\n                        win = doc ? doc.defaultView || doc.parentWindow : window;\n                    }\n                    var from = void 0, to = void 0;\n                    if (isOutEvent) {\n                        from = targetInst;\n                        var related = nativeEvent.relatedTarget || nativeEvent.toElement;\n                        to = related ? getClosestInstanceFromNode(related) : null;\n                    } else from = null, to = targetInst;\n                    if (from === to) return null;\n                    var eventInterface = void 0, leaveEventType = void 0, enterEventType = void 0, eventTypePrefix = void 0;\n                    topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER ? (eventInterface = SyntheticMouseEvent, \n                    leaveEventType = eventTypes$2.mouseLeave, enterEventType = eventTypes$2.mouseEnter, \n                    eventTypePrefix = \"mouse\") : topLevelType !== TOP_POINTER_OUT && topLevelType !== TOP_POINTER_OVER || (eventInterface = SyntheticPointerEvent, \n                    leaveEventType = eventTypes$2.pointerLeave, enterEventType = eventTypes$2.pointerEnter, \n                    eventTypePrefix = \"pointer\");\n                    var fromNode = null == from ? win : getNodeFromInstance$1(from), toNode = null == to ? win : getNodeFromInstance$1(to), leave = eventInterface.getPooled(leaveEventType, from, nativeEvent, nativeEventTarget);\n                    leave.type = eventTypePrefix + \"leave\", leave.target = fromNode, leave.relatedTarget = toNode;\n                    var enter = eventInterface.getPooled(enterEventType, to, nativeEvent, nativeEventTarget);\n                    return enter.type = eventTypePrefix + \"enter\", enter.target = toNode, enter.relatedTarget = fromNode, \n                    accumulateEnterLeaveDispatches(leave, enter, from, to), [ leave, enter ];\n                }\n            }, NoEffect = 0, PerformedWork = 1, Placement = 2, Update = 4, PlacementAndUpdate = 6, Deletion = 8, ContentReset = 16, Callback = 32, DidCapture = 64, Ref = 128, Snapshot = 256, HostEffectMask = 511, Incomplete = 512, ShouldCapture = 1024, MOUNTING = 1, MOUNTED = 2, UNMOUNTED = 3, SyntheticAnimationEvent = SyntheticEvent$1.extend({\n                animationName: null,\n                elapsedTime: null,\n                pseudoElement: null\n            }), SyntheticClipboardEvent = SyntheticEvent$1.extend({\n                clipboardData: function(event) {\n                    return \"clipboardData\" in event ? event.clipboardData : window.clipboardData;\n                }\n            }), SyntheticFocusEvent = SyntheticUIEvent.extend({\n                relatedTarget: null\n            }), normalizeKey = {\n                Esc: \"Escape\",\n                Spacebar: \" \",\n                Left: \"ArrowLeft\",\n                Up: \"ArrowUp\",\n                Right: \"ArrowRight\",\n                Down: \"ArrowDown\",\n                Del: \"Delete\",\n                Win: \"OS\",\n                Menu: \"ContextMenu\",\n                Apps: \"ContextMenu\",\n                Scroll: \"ScrollLock\",\n                MozPrintableKey: \"Unidentified\"\n            }, translateToKey = {\n                \"8\": \"Backspace\",\n                \"9\": \"Tab\",\n                \"12\": \"Clear\",\n                \"13\": \"Enter\",\n                \"16\": \"Shift\",\n                \"17\": \"Control\",\n                \"18\": \"Alt\",\n                \"19\": \"Pause\",\n                \"20\": \"CapsLock\",\n                \"27\": \"Escape\",\n                \"32\": \" \",\n                \"33\": \"PageUp\",\n                \"34\": \"PageDown\",\n                \"35\": \"End\",\n                \"36\": \"Home\",\n                \"37\": \"ArrowLeft\",\n                \"38\": \"ArrowUp\",\n                \"39\": \"ArrowRight\",\n                \"40\": \"ArrowDown\",\n                \"45\": \"Insert\",\n                \"46\": \"Delete\",\n                \"112\": \"F1\",\n                \"113\": \"F2\",\n                \"114\": \"F3\",\n                \"115\": \"F4\",\n                \"116\": \"F5\",\n                \"117\": \"F6\",\n                \"118\": \"F7\",\n                \"119\": \"F8\",\n                \"120\": \"F9\",\n                \"121\": \"F10\",\n                \"122\": \"F11\",\n                \"123\": \"F12\",\n                \"144\": \"NumLock\",\n                \"145\": \"ScrollLock\",\n                \"224\": \"Meta\"\n            }, SyntheticKeyboardEvent = SyntheticUIEvent.extend({\n                key: getEventKey,\n                location: null,\n                ctrlKey: null,\n                shiftKey: null,\n                altKey: null,\n                metaKey: null,\n                repeat: null,\n                locale: null,\n                getModifierState: getEventModifierState,\n                charCode: function(event) {\n                    return \"keypress\" === event.type ? getEventCharCode(event) : 0;\n                },\n                keyCode: function(event) {\n                    return \"keydown\" === event.type || \"keyup\" === event.type ? event.keyCode : 0;\n                },\n                which: function(event) {\n                    return \"keypress\" === event.type ? getEventCharCode(event) : \"keydown\" === event.type || \"keyup\" === event.type ? event.keyCode : 0;\n                }\n            }), SyntheticDragEvent = SyntheticMouseEvent.extend({\n                dataTransfer: null\n            }), SyntheticTouchEvent = SyntheticUIEvent.extend({\n                touches: null,\n                targetTouches: null,\n                changedTouches: null,\n                altKey: null,\n                metaKey: null,\n                ctrlKey: null,\n                shiftKey: null,\n                getModifierState: getEventModifierState\n            }), SyntheticTransitionEvent = SyntheticEvent$1.extend({\n                propertyName: null,\n                elapsedTime: null,\n                pseudoElement: null\n            }), SyntheticWheelEvent = SyntheticMouseEvent.extend({\n                deltaX: function(event) {\n                    return \"deltaX\" in event ? event.deltaX : \"wheelDeltaX\" in event ? -event.wheelDeltaX : 0;\n                },\n                deltaY: function(event) {\n                    return \"deltaY\" in event ? event.deltaY : \"wheelDeltaY\" in event ? -event.wheelDeltaY : \"wheelDelta\" in event ? -event.wheelDelta : 0;\n                },\n                deltaZ: null,\n                deltaMode: null\n            }), interactiveEventTypeNames = [ [ TOP_BLUR, \"blur\" ], [ TOP_CANCEL, \"cancel\" ], [ TOP_CLICK, \"click\" ], [ TOP_CLOSE, \"close\" ], [ TOP_CONTEXT_MENU, \"contextMenu\" ], [ TOP_COPY, \"copy\" ], [ TOP_CUT, \"cut\" ], [ TOP_DOUBLE_CLICK, \"doubleClick\" ], [ TOP_DRAG_END, \"dragEnd\" ], [ TOP_DRAG_START, \"dragStart\" ], [ TOP_DROP, \"drop\" ], [ TOP_FOCUS, \"focus\" ], [ TOP_INPUT, \"input\" ], [ TOP_INVALID, \"invalid\" ], [ TOP_KEY_DOWN, \"keyDown\" ], [ TOP_KEY_PRESS, \"keyPress\" ], [ TOP_KEY_UP, \"keyUp\" ], [ TOP_MOUSE_DOWN, \"mouseDown\" ], [ TOP_MOUSE_UP, \"mouseUp\" ], [ TOP_PASTE, \"paste\" ], [ TOP_PAUSE, \"pause\" ], [ TOP_PLAY, \"play\" ], [ TOP_POINTER_CANCEL, \"pointerCancel\" ], [ TOP_POINTER_DOWN, \"pointerDown\" ], [ TOP_POINTER_UP, \"pointerUp\" ], [ TOP_RATE_CHANGE, \"rateChange\" ], [ TOP_RESET, \"reset\" ], [ TOP_SEEKED, \"seeked\" ], [ TOP_SUBMIT, \"submit\" ], [ TOP_TOUCH_CANCEL, \"touchCancel\" ], [ TOP_TOUCH_END, \"touchEnd\" ], [ TOP_TOUCH_START, \"touchStart\" ], [ TOP_VOLUME_CHANGE, \"volumeChange\" ] ], nonInteractiveEventTypeNames = [ [ TOP_ABORT, \"abort\" ], [ TOP_ANIMATION_END, \"animationEnd\" ], [ TOP_ANIMATION_ITERATION, \"animationIteration\" ], [ TOP_ANIMATION_START, \"animationStart\" ], [ TOP_CAN_PLAY, \"canPlay\" ], [ TOP_CAN_PLAY_THROUGH, \"canPlayThrough\" ], [ TOP_DRAG, \"drag\" ], [ TOP_DRAG_ENTER, \"dragEnter\" ], [ TOP_DRAG_EXIT, \"dragExit\" ], [ TOP_DRAG_LEAVE, \"dragLeave\" ], [ TOP_DRAG_OVER, \"dragOver\" ], [ TOP_DURATION_CHANGE, \"durationChange\" ], [ TOP_EMPTIED, \"emptied\" ], [ TOP_ENCRYPTED, \"encrypted\" ], [ TOP_ENDED, \"ended\" ], [ TOP_ERROR, \"error\" ], [ TOP_GOT_POINTER_CAPTURE, \"gotPointerCapture\" ], [ TOP_LOAD, \"load\" ], [ TOP_LOADED_DATA, \"loadedData\" ], [ TOP_LOADED_METADATA, \"loadedMetadata\" ], [ TOP_LOAD_START, \"loadStart\" ], [ TOP_LOST_POINTER_CAPTURE, \"lostPointerCapture\" ], [ TOP_MOUSE_MOVE, \"mouseMove\" ], [ TOP_MOUSE_OUT, \"mouseOut\" ], [ TOP_MOUSE_OVER, \"mouseOver\" ], [ TOP_PLAYING, \"playing\" ], [ TOP_POINTER_MOVE, \"pointerMove\" ], [ TOP_POINTER_OUT, \"pointerOut\" ], [ TOP_POINTER_OVER, \"pointerOver\" ], [ TOP_PROGRESS, \"progress\" ], [ TOP_SCROLL, \"scroll\" ], [ TOP_SEEKING, \"seeking\" ], [ TOP_STALLED, \"stalled\" ], [ TOP_SUSPEND, \"suspend\" ], [ TOP_TIME_UPDATE, \"timeUpdate\" ], [ TOP_TOGGLE, \"toggle\" ], [ TOP_TOUCH_MOVE, \"touchMove\" ], [ TOP_TRANSITION_END, \"transitionEnd\" ], [ TOP_WAITING, \"waiting\" ], [ TOP_WHEEL, \"wheel\" ] ], eventTypes$4 = {}, topLevelEventsToDispatchConfig = {};\n            interactiveEventTypeNames.forEach(function(eventTuple) {\n                addEventTypeNameToConfig(eventTuple, !0);\n            }), nonInteractiveEventTypeNames.forEach(function(eventTuple) {\n                addEventTypeNameToConfig(eventTuple, !1);\n            });\n            var knownHTMLTopLevelTypes = [ TOP_ABORT, TOP_CANCEL, TOP_CAN_PLAY, TOP_CAN_PLAY_THROUGH, TOP_CLOSE, TOP_DURATION_CHANGE, TOP_EMPTIED, TOP_ENCRYPTED, TOP_ENDED, TOP_ERROR, TOP_INPUT, TOP_INVALID, TOP_LOAD, TOP_LOADED_DATA, TOP_LOADED_METADATA, TOP_LOAD_START, TOP_PAUSE, TOP_PLAY, TOP_PLAYING, TOP_PROGRESS, TOP_RATE_CHANGE, TOP_RESET, TOP_SEEKED, TOP_SEEKING, TOP_STALLED, TOP_SUBMIT, TOP_SUSPEND, TOP_TIME_UPDATE, TOP_TOGGLE, TOP_VOLUME_CHANGE, TOP_WAITING ], SimpleEventPlugin = {\n                eventTypes: eventTypes$4,\n                isInteractiveTopLevelEventType: function(topLevelType) {\n                    var config = topLevelEventsToDispatchConfig[topLevelType];\n                    return void 0 !== config && !0 === config.isInteractive;\n                },\n                extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                    var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];\n                    if (!dispatchConfig) return null;\n                    var EventConstructor = void 0;\n                    switch (topLevelType) {\n                      case TOP_KEY_PRESS:\n                        if (0 === getEventCharCode(nativeEvent)) return null;\n\n                      case TOP_KEY_DOWN:\n                      case TOP_KEY_UP:\n                        EventConstructor = SyntheticKeyboardEvent;\n                        break;\n\n                      case TOP_BLUR:\n                      case TOP_FOCUS:\n                        EventConstructor = SyntheticFocusEvent;\n                        break;\n\n                      case TOP_CLICK:\n                        if (2 === nativeEvent.button) return null;\n\n                      case TOP_DOUBLE_CLICK:\n                      case TOP_MOUSE_DOWN:\n                      case TOP_MOUSE_MOVE:\n                      case TOP_MOUSE_UP:\n                      case TOP_MOUSE_OUT:\n                      case TOP_MOUSE_OVER:\n                      case TOP_CONTEXT_MENU:\n                        EventConstructor = SyntheticMouseEvent;\n                        break;\n\n                      case TOP_DRAG:\n                      case TOP_DRAG_END:\n                      case TOP_DRAG_ENTER:\n                      case TOP_DRAG_EXIT:\n                      case TOP_DRAG_LEAVE:\n                      case TOP_DRAG_OVER:\n                      case TOP_DRAG_START:\n                      case TOP_DROP:\n                        EventConstructor = SyntheticDragEvent;\n                        break;\n\n                      case TOP_TOUCH_CANCEL:\n                      case TOP_TOUCH_END:\n                      case TOP_TOUCH_MOVE:\n                      case TOP_TOUCH_START:\n                        EventConstructor = SyntheticTouchEvent;\n                        break;\n\n                      case TOP_ANIMATION_END:\n                      case TOP_ANIMATION_ITERATION:\n                      case TOP_ANIMATION_START:\n                        EventConstructor = SyntheticAnimationEvent;\n                        break;\n\n                      case TOP_TRANSITION_END:\n                        EventConstructor = SyntheticTransitionEvent;\n                        break;\n\n                      case TOP_SCROLL:\n                        EventConstructor = SyntheticUIEvent;\n                        break;\n\n                      case TOP_WHEEL:\n                        EventConstructor = SyntheticWheelEvent;\n                        break;\n\n                      case TOP_COPY:\n                      case TOP_CUT:\n                      case TOP_PASTE:\n                        EventConstructor = SyntheticClipboardEvent;\n                        break;\n\n                      case TOP_GOT_POINTER_CAPTURE:\n                      case TOP_LOST_POINTER_CAPTURE:\n                      case TOP_POINTER_CANCEL:\n                      case TOP_POINTER_DOWN:\n                      case TOP_POINTER_MOVE:\n                      case TOP_POINTER_OUT:\n                      case TOP_POINTER_OVER:\n                      case TOP_POINTER_UP:\n                        EventConstructor = SyntheticPointerEvent;\n                        break;\n\n                      default:\n                        -1 === knownHTMLTopLevelTypes.indexOf(topLevelType) && warning(!1, \"SimpleEventPlugin: Unhandled event type, `))))))))) + ((((((((\"`\" + (`%s` + \"`\")) + (`. This warning is likely caused by a bug in React. Please file an issue.\", topLevelType), \n                        EventConstructor = SyntheticEvent$1;\n                    }\n                    var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);\n                    return accumulateTwoPhaseDispatches(event), event;\n                }\n            }, isInteractiveTopLevelEventType = SimpleEventPlugin.isInteractiveTopLevelEventType, CALLBACK_BOOKKEEPING_POOL_SIZE = 10, callbackBookkeepingPool = [], _enabled = !0, ReactDOMEventListener = Object.freeze({\n                get _enabled() {\n                    return _enabled;\n                },\n                setEnabled: setEnabled,\n                isEnabled: isEnabled,\n                trapBubbledEvent: trapBubbledEvent,\n                trapCapturedEvent: trapCapturedEvent,\n                dispatchEvent: dispatchEvent\n            }), alreadyListeningTo = {}, reactTopListenersCounter = 0, topListenersIDKey = \"_reactListenersID\" + (\"\" + Math.random()).slice(2), skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && \"documentMode\" in document && document.documentMode <= 11, eventTypes$3 = {\n                select: {\n                    phasedRegistrationNames: {\n                        bubbled: \"onSelect\",\n                        captured: \"onSelectCapture\"\n                    },\n                    dependencies: [ TOP_BLUR, TOP_CONTEXT_MENU, TOP_FOCUS, TOP_KEY_DOWN, TOP_KEY_UP, TOP_MOUSE_DOWN, TOP_MOUSE_UP, TOP_SELECTION_CHANGE ]\n                }\n            }, activeElement$1 = null, activeElementInst$1 = null, lastSelection = null, mouseDown = !1, SelectEventPlugin = {\n                eventTypes: eventTypes$3,\n                extractEvents: function(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n                    var doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : nativeEventTarget.nodeType === DOCUMENT_NODE ? nativeEventTarget : nativeEventTarget.ownerDocument;\n                    if (!doc || !isListeningToAllDependencies(\"onSelect\", doc)) return null;\n                    var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n                    switch (topLevelType) {\n                      case TOP_FOCUS:\n                        (isTextInputElement(targetNode) || \"true\" === targetNode.contentEditable) && (activeElement$1 = targetNode, \n                        activeElementInst$1 = targetInst, lastSelection = null);\n                        break;\n\n                      case TOP_BLUR:\n                        activeElement$1 = null, activeElementInst$1 = null, lastSelection = null;\n                        break;\n\n                      case TOP_MOUSE_DOWN:\n                        mouseDown = !0;\n                        break;\n\n                      case TOP_CONTEXT_MENU:\n                      case TOP_MOUSE_UP:\n                        return mouseDown = !1, constructSelectEvent(nativeEvent, nativeEventTarget);\n\n                      case TOP_SELECTION_CHANGE:\n                        if (skipSelectionChangeEvent) break;\n\n                      case TOP_KEY_DOWN:\n                      case TOP_KEY_UP:\n                        return constructSelectEvent(nativeEvent, nativeEventTarget);\n                    }\n                    return null;\n                }\n            };\n            injection.injectEventPluginOrder(DOMEventPluginOrder), injection$1.injectComponentTree(ReactDOMComponentTree), \n            injection.injectEventPluginsByName({\n                SimpleEventPlugin: SimpleEventPlugin,\n                EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n                ChangeEventPlugin: ChangeEventPlugin,\n                SelectEventPlugin: SelectEventPlugin,\n                BeforeInputEventPlugin: BeforeInputEventPlugin\n            }), ExecutionEnvironment.canUseDOM && \"function\" != typeof requestAnimationFrame && warning(!1, \"React depends on requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\");\n            var hasNativePerformanceNow = \"object\" == typeof performance && \"function\" == typeof performance.now, now$1 = void 0;\n            now$1 = hasNativePerformanceNow ? function() {\n                return performance.now();\n            } : function() {\n                return Date.now();\n            };\n            var scheduleWork = void 0, cancelScheduledWork = void 0;\n            if (ExecutionEnvironment.canUseDOM) {\n                var pendingCallbacks = [], _callbackIdCounter = 0, getCallbackId = function() {\n                    return ++_callbackIdCounter;\n                }, registeredCallbackIds = {}, nextSoonestTimeoutTime = -1, isIdleScheduled = !1, isAnimationFrameScheduled = !1, frameDeadline = 0, previousFrameTime = 33, activeFrameTime = 33, frameDeadlineObject = {\n                    didTimeout: !1,\n                    timeRemaining: function() {\n                        var remaining = frameDeadline - now$1();\n                        return remaining > 0 ? remaining : 0;\n                    }\n                }, safelyCallScheduledCallback = function(callback, callbackId) {\n                    if (registeredCallbackIds[callbackId]) try {\n                        callback(frameDeadlineObject);\n                    } finally {\n                        delete registeredCallbackIds[callbackId];\n                    }\n                }, callTimedOutCallbacks = function() {\n                    if (0 !== pendingCallbacks.length) {\n                        var currentTime = now$1();\n                        if (!(-1 === nextSoonestTimeoutTime || nextSoonestTimeoutTime > currentTime)) {\n                            nextSoonestTimeoutTime = -1, frameDeadlineObject.didTimeout = !0;\n                            for (var i = 0, len = pendingCallbacks.length; i < len; i++) {\n                                var currentCallbackConfig = pendingCallbacks[i], _timeoutTime = currentCallbackConfig.timeoutTime;\n                                if (-1 !== _timeoutTime && _timeoutTime <= currentTime) {\n                                    var _callback = currentCallbackConfig.scheduledCallback;\n                                    safelyCallScheduledCallback(_callback, currentCallbackConfig.callbackId);\n                                } else -1 !== _timeoutTime && (-1 === nextSoonestTimeoutTime || _timeoutTime < nextSoonestTimeoutTime) && (nextSoonestTimeoutTime = _timeoutTime);\n                            }\n                        }\n                    }\n                }, messageKey = \"__reactIdleCallback$\" + Math.random().toString(36).slice(2), idleTick = function(event) {\n                    if (event.source === window && event.data === messageKey && (isIdleScheduled = !1, \n                    0 !== pendingCallbacks.length)) {\n                        callTimedOutCallbacks();\n                        for (var currentTime = now$1(); frameDeadline - currentTime > 0 && pendingCallbacks.length > 0; ) {\n                            var latestCallbackConfig = pendingCallbacks.shift();\n                            frameDeadlineObject.didTimeout = !1;\n                            var latestCallback = latestCallbackConfig.scheduledCallback, newCallbackId = latestCallbackConfig.callbackId;\n                            safelyCallScheduledCallback(latestCallback, newCallbackId), currentTime = now$1();\n                        }\n                        pendingCallbacks.length > 0 && (isAnimationFrameScheduled || (isAnimationFrameScheduled = !0, \n                        requestAnimationFrame(animationTick)));\n                    }\n                };\n                window.addEventListener(\"message\", idleTick, !1);\n                var animationTick = function(rafTime) {\n                    isAnimationFrameScheduled = !1;\n                    var nextFrameTime = rafTime - frameDeadline + activeFrameTime;\n                    nextFrameTime < activeFrameTime && previousFrameTime < activeFrameTime ? (nextFrameTime < 8 && (nextFrameTime = 8), \n                    activeFrameTime = nextFrameTime < previousFrameTime ? previousFrameTime : nextFrameTime) : previousFrameTime = nextFrameTime, \n                    frameDeadline = rafTime + activeFrameTime, isIdleScheduled || (isIdleScheduled = !0, \n                    window.postMessage(messageKey, \"*\"));\n                };\n                scheduleWork = function(callback, options) {\n                    var timeoutTime = -1;\n                    null != options && \"number\" == typeof options.timeout && (timeoutTime = now$1() + options.timeout), \n                    (-1 === nextSoonestTimeoutTime || -1 !== timeoutTime && timeoutTime < nextSoonestTimeoutTime) && (nextSoonestTimeoutTime = timeoutTime);\n                    var newCallbackId = getCallbackId(), scheduledCallbackConfig = {\n                        scheduledCallback: callback,\n                        callbackId: newCallbackId,\n                        timeoutTime: timeoutTime\n                    };\n                    return pendingCallbacks.push(scheduledCallbackConfig), registeredCallbackIds[newCallbackId] = !0, \n                    isAnimationFrameScheduled || (isAnimationFrameScheduled = !0, requestAnimationFrame(animationTick)), \n                    newCallbackId;\n                }, cancelScheduledWork = function(callbackId) {\n                    delete registeredCallbackIds[callbackId];\n                };\n            } else {\n                var callbackIdCounter = 0, timeoutIds = {};\n                scheduleWork = function(callback, options) {\n                    var callbackId = callbackIdCounter++, timeoutId = setTimeout(function() {\n                        callback({\n                            timeRemaining: function() {\n                                return 1 / 0;\n                            },\n                            didTimeout: !1\n                        });\n                    });\n                    return timeoutIds[callbackId] = timeoutId, callbackId;\n                }, cancelScheduledWork = function(callbackId) {\n                    var timeoutId = timeoutIds[callbackId];\n                    delete timeoutIds[callbackId], clearTimeout(timeoutId);\n                };\n            }\n            var didWarnSelectedSetOnOption = !1, getCurrentFiberOwnerName$3 = ReactDebugCurrentFiber.getCurrentFiberOwnerName, getCurrentFiberStackAddendum$3 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnValueDefaultValue$1 = void 0;\n            didWarnValueDefaultValue$1 = !1;\n            var valuePropNames = [ \"value\", \"defaultValue\" ], getCurrentFiberStackAddendum$4 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnValDefaultVal = !1, HTML_NAMESPACE$1 = \"http://www.w3.org/1999/xhtml\", MATH_NAMESPACE = \"http://www.w3.org/1998/Math/MathML\", SVG_NAMESPACE = \"http://www.w3.org/2000/svg\", Namespaces = {\n                html: HTML_NAMESPACE$1,\n                mathml: MATH_NAMESPACE,\n                svg: SVG_NAMESPACE\n            }, reusableSVGContainer = void 0, setInnerHTML = function(func) {\n                return \"undefined\" != typeof MSApp && MSApp.execUnsafeLocalFunction ? function(arg0, arg1, arg2, arg3) {\n                    MSApp.execUnsafeLocalFunction(function() {\n                        return func(arg0, arg1, arg2, arg3);\n                    });\n                } : func;\n            }(function(node, html) {\n                if (node.namespaceURI !== Namespaces.svg || \"innerHTML\" in node) node.innerHTML = html; else {\n                    reusableSVGContainer = reusableSVGContainer || document.createElement(\"div\"), reusableSVGContainer.innerHTML = \"<svg>\" + html + \"</svg>\";\n                    for (var svgNode = reusableSVGContainer.firstChild; node.firstChild; ) node.removeChild(node.firstChild);\n                    for (;svgNode.firstChild; ) node.appendChild(svgNode.firstChild);\n                }\n            }), setTextContent = function(node, text) {\n                if (text) {\n                    var firstChild = node.firstChild;\n                    if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) return void (firstChild.nodeValue = text);\n                }\n                node.textContent = text;\n            }, isUnitlessNumber = {\n                animationIterationCount: !0,\n                borderImageOutset: !0,\n                borderImageSlice: !0,\n                borderImageWidth: !0,\n                boxFlex: !0,\n                boxFlexGroup: !0,\n                boxOrdinalGroup: !0,\n                columnCount: !0,\n                columns: !0,\n                flex: !0,\n                flexGrow: !0,\n                flexPositive: !0,\n                flexShrink: !0,\n                flexNegative: !0,\n                flexOrder: !0,\n                gridRow: !0,\n                gridRowEnd: !0,\n                gridRowSpan: !0,\n                gridRowStart: !0,\n                gridColumn: !0,\n                gridColumnEnd: !0,\n                gridColumnSpan: !0,\n                gridColumnStart: !0,\n                fontWeight: !0,\n                lineClamp: !0,\n                lineHeight: !0,\n                opacity: !0,\n                order: !0,\n                orphans: !0,\n                tabSize: !0,\n                widows: !0,\n                zIndex: !0,\n                zoom: !0,\n                fillOpacity: !0,\n                floodOpacity: !0,\n                stopOpacity: !0,\n                strokeDasharray: !0,\n                strokeDashoffset: !0,\n                strokeMiterlimit: !0,\n                strokeOpacity: !0,\n                strokeWidth: !0\n            }, prefixes = [ \"Webkit\", \"ms\", \"Moz\", \"O\" ];\n            Object.keys(isUnitlessNumber).forEach(function(prop) {\n                prefixes.forEach(function(prefix) {\n                    isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n                });\n            });\n            var warnValidStyle = emptyFunction, badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/, badStyleValueWithSemicolonPattern = /;\\s*$/, warnedStyleNames = {}, warnedStyleValues = {}, warnedForNaNValue = !1, warnedForInfinityValue = !1, warnHyphenatedStyleName = function(name, getStack) {\n                warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name] || (warnedStyleNames[name] = !0, \n                warning(!1, \"Unsupported style property %s. Did you mean %s?%s\", name, camelizeStyleName(name), getStack()));\n            }, warnBadVendoredStyleName = function(name, getStack) {\n                warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name] || (warnedStyleNames[name] = !0, \n                warning(!1, \"Unsupported vendor-prefixed style property %s. Did you mean %s?%s\", name, name.charAt(0).toUpperCase() + name.slice(1), getStack()));\n            }, warnStyleValueWithSemicolon = function(name, value, getStack) {\n                warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value] || (warnedStyleValues[value] = !0, \n                warning(!1, 'Style property values shouldn\\'t contain a semicolon. Try \"%s: %s\" instead.%s', name, value.replace(badStyleValueWithSemicolonPattern, \"\"), getStack()));\n            }, warnStyleValueIsNaN = function(name, value, getStack) {\n                warnedForNaNValue || (warnedForNaNValue = !0, warning(!1, \"` + (\"`\" + `NaN`))) + ((\"`\" + (` is an invalid value for the ` + \"`\")) + (`%s` + (\"`\" + ` css style property.%s\", name, getStack()));\n            }, warnStyleValueIsInfinity = function(name, value, getStack) {\n                warnedForInfinityValue || (warnedForInfinityValue = !0, warning(!1, \"`)))) + (((\"`\" + (`Infinity` + \"`\")) + (` is an invalid value for the ` + (\"`\" + `%s`))) + ((\"`\" + (` css style property.%s\", name, getStack()));\n            };\n            warnValidStyle = function(name, value, getStack) {\n                name.indexOf(\"-\") > -1 ? warnHyphenatedStyleName(name, getStack) : badVendoredStyleNamePattern.test(name) ? warnBadVendoredStyleName(name, getStack) : badStyleValueWithSemicolonPattern.test(value) && warnStyleValueWithSemicolon(name, value, getStack), \n                \"number\" == typeof value && (isNaN(value) ? warnStyleValueIsNaN(name, 0, getStack) : isFinite(value) || warnStyleValueIsInfinity(name, 0, getStack));\n            };\n            var warnValidStyle$1 = warnValidStyle, omittedCloseTags = {\n                area: !0,\n                base: !0,\n                br: !0,\n                col: !0,\n                embed: !0,\n                hr: !0,\n                img: !0,\n                input: !0,\n                keygen: !0,\n                link: !0,\n                meta: !0,\n                param: !0,\n                source: !0,\n                track: !0,\n                wbr: !0\n            }, voidElementTags = _assign({\n                menuitem: !0\n            }, omittedCloseTags), HTML$1 = \"__html\", possibleStandardNames = {\n                accept: \"accept\",\n                acceptcharset: \"acceptCharset\",\n                \"accept-charset\": \"acceptCharset\",\n                accesskey: \"accessKey\",\n                action: \"action\",\n                allowfullscreen: \"allowFullScreen\",\n                alt: \"alt\",\n                as: \"as\",\n                async: \"async\",\n                autocapitalize: \"autoCapitalize\",\n                autocomplete: \"autoComplete\",\n                autocorrect: \"autoCorrect\",\n                autofocus: \"autoFocus\",\n                autoplay: \"autoPlay\",\n                autosave: \"autoSave\",\n                capture: \"capture\",\n                cellpadding: \"cellPadding\",\n                cellspacing: \"cellSpacing\",\n                challenge: \"challenge\",\n                charset: \"charSet\",\n                checked: \"checked\",\n                children: \"children\",\n                cite: \"cite\",\n                class: \"className\",\n                classid: \"classID\",\n                classname: \"className\",\n                cols: \"cols\",\n                colspan: \"colSpan\",\n                content: \"content\",\n                contenteditable: \"contentEditable\",\n                contextmenu: \"contextMenu\",\n                controls: \"controls\",\n                controlslist: \"controlsList\",\n                coords: \"coords\",\n                crossorigin: \"crossOrigin\",\n                dangerouslysetinnerhtml: \"dangerouslySetInnerHTML\",\n                data: \"data\",\n                datetime: \"dateTime\",\n                default: \"default\",\n                defaultchecked: \"defaultChecked\",\n                defaultvalue: \"defaultValue\",\n                defer: \"defer\",\n                dir: \"dir\",\n                disabled: \"disabled\",\n                download: \"download\",\n                draggable: \"draggable\",\n                enctype: \"encType\",\n                for: \"htmlFor\",\n                form: \"form\",\n                formmethod: \"formMethod\",\n                formaction: \"formAction\",\n                formenctype: \"formEncType\",\n                formnovalidate: \"formNoValidate\",\n                formtarget: \"formTarget\",\n                frameborder: \"frameBorder\",\n                headers: \"headers\",\n                height: \"height\",\n                hidden: \"hidden\",\n                high: \"high\",\n                href: \"href\",\n                hreflang: \"hrefLang\",\n                htmlfor: \"htmlFor\",\n                httpequiv: \"httpEquiv\",\n                \"http-equiv\": \"httpEquiv\",\n                icon: \"icon\",\n                id: \"id\",\n                innerhtml: \"innerHTML\",\n                inputmode: \"inputMode\",\n                integrity: \"integrity\",\n                is: \"is\",\n                itemid: \"itemID\",\n                itemprop: \"itemProp\",\n                itemref: \"itemRef\",\n                itemscope: \"itemScope\",\n                itemtype: \"itemType\",\n                keyparams: \"keyParams\",\n                keytype: \"keyType\",\n                kind: \"kind\",\n                label: \"label\",\n                lang: \"lang\",\n                list: \"list\",\n                loop: \"loop\",\n                low: \"low\",\n                manifest: \"manifest\",\n                marginwidth: \"marginWidth\",\n                marginheight: \"marginHeight\",\n                max: \"max\",\n                maxlength: \"maxLength\",\n                media: \"media\",\n                mediagroup: \"mediaGroup\",\n                method: \"method\",\n                min: \"min\",\n                minlength: \"minLength\",\n                multiple: \"multiple\",\n                muted: \"muted\",\n                name: \"name\",\n                nomodule: \"noModule\",\n                nonce: \"nonce\",\n                novalidate: \"noValidate\",\n                open: \"open\",\n                optimum: \"optimum\",\n                pattern: \"pattern\",\n                placeholder: \"placeholder\",\n                playsinline: \"playsInline\",\n                poster: \"poster\",\n                preload: \"preload\",\n                profile: \"profile\",\n                radiogroup: \"radioGroup\",\n                readonly: \"readOnly\",\n                referrerpolicy: \"referrerPolicy\",\n                rel: \"rel\",\n                required: \"required\",\n                reversed: \"reversed\",\n                role: \"role\",\n                rows: \"rows\",\n                rowspan: \"rowSpan\",\n                sandbox: \"sandbox\",\n                scope: \"scope\",\n                scoped: \"scoped\",\n                scrolling: \"scrolling\",\n                seamless: \"seamless\",\n                selected: \"selected\",\n                shape: \"shape\",\n                size: \"size\",\n                sizes: \"sizes\",\n                span: \"span\",\n                spellcheck: \"spellCheck\",\n                src: \"src\",\n                srcdoc: \"srcDoc\",\n                srclang: \"srcLang\",\n                srcset: \"srcSet\",\n                start: \"start\",\n                step: \"step\",\n                style: \"style\",\n                summary: \"summary\",\n                tabindex: \"tabIndex\",\n                target: \"target\",\n                title: \"title\",\n                type: \"type\",\n                usemap: \"useMap\",\n                value: \"value\",\n                width: \"width\",\n                wmode: \"wmode\",\n                wrap: \"wrap\",\n                about: \"about\",\n                accentheight: \"accentHeight\",\n                \"accent-height\": \"accentHeight\",\n                accumulate: \"accumulate\",\n                additive: \"additive\",\n                alignmentbaseline: \"alignmentBaseline\",\n                \"alignment-baseline\": \"alignmentBaseline\",\n                allowreorder: \"allowReorder\",\n                alphabetic: \"alphabetic\",\n                amplitude: \"amplitude\",\n                arabicform: \"arabicForm\",\n                \"arabic-form\": \"arabicForm\",\n                ascent: \"ascent\",\n                attributename: \"attributeName\",\n                attributetype: \"attributeType\",\n                autoreverse: \"autoReverse\",\n                azimuth: \"azimuth\",\n                basefrequency: \"baseFrequency\",\n                baselineshift: \"baselineShift\",\n                \"baseline-shift\": \"baselineShift\",\n                baseprofile: \"baseProfile\",\n                bbox: \"bbox\",\n                begin: \"begin\",\n                bias: \"bias\",\n                by: \"by\",\n                calcmode: \"calcMode\",\n                capheight: \"capHeight\",\n                \"cap-height\": \"capHeight\",\n                clip: \"clip\",\n                clippath: \"clipPath\",\n                \"clip-path\": \"clipPath\",\n                clippathunits: \"clipPathUnits\",\n                cliprule: \"clipRule\",\n                \"clip-rule\": \"clipRule\",\n                color: \"color\",\n                colorinterpolation: \"colorInterpolation\",\n                \"color-interpolation\": \"colorInterpolation\",\n                colorinterpolationfilters: \"colorInterpolationFilters\",\n                \"color-interpolation-filters\": \"colorInterpolationFilters\",\n                colorprofile: \"colorProfile\",\n                \"color-profile\": \"colorProfile\",\n                colorrendering: \"colorRendering\",\n                \"color-rendering\": \"colorRendering\",\n                contentscripttype: \"contentScriptType\",\n                contentstyletype: \"contentStyleType\",\n                cursor: \"cursor\",\n                cx: \"cx\",\n                cy: \"cy\",\n                d: \"d\",\n                datatype: \"datatype\",\n                decelerate: \"decelerate\",\n                descent: \"descent\",\n                diffuseconstant: \"diffuseConstant\",\n                direction: \"direction\",\n                display: \"display\",\n                divisor: \"divisor\",\n                dominantbaseline: \"dominantBaseline\",\n                \"dominant-baseline\": \"dominantBaseline\",\n                dur: \"dur\",\n                dx: \"dx\",\n                dy: \"dy\",\n                edgemode: \"edgeMode\",\n                elevation: \"elevation\",\n                enablebackground: \"enableBackground\",\n                \"enable-background\": \"enableBackground\",\n                end: \"end\",\n                exponent: \"exponent\",\n                externalresourcesrequired: \"externalResourcesRequired\",\n                fill: \"fill\",\n                fillopacity: \"fillOpacity\",\n                \"fill-opacity\": \"fillOpacity\",\n                fillrule: \"fillRule\",\n                \"fill-rule\": \"fillRule\",\n                filter: \"filter\",\n                filterres: \"filterRes\",\n                filterunits: \"filterUnits\",\n                floodopacity: \"floodOpacity\",\n                \"flood-opacity\": \"floodOpacity\",\n                floodcolor: \"floodColor\",\n                \"flood-color\": \"floodColor\",\n                focusable: \"focusable\",\n                fontfamily: \"fontFamily\",\n                \"font-family\": \"fontFamily\",\n                fontsize: \"fontSize\",\n                \"font-size\": \"fontSize\",\n                fontsizeadjust: \"fontSizeAdjust\",\n                \"font-size-adjust\": \"fontSizeAdjust\",\n                fontstretch: \"fontStretch\",\n                \"font-stretch\": \"fontStretch\",\n                fontstyle: \"fontStyle\",\n                \"font-style\": \"fontStyle\",\n                fontvariant: \"fontVariant\",\n                \"font-variant\": \"fontVariant\",\n                fontweight: \"fontWeight\",\n                \"font-weight\": \"fontWeight\",\n                format: \"format\",\n                from: \"from\",\n                fx: \"fx\",\n                fy: \"fy\",\n                g1: \"g1\",\n                g2: \"g2\",\n                glyphname: \"glyphName\",\n                \"glyph-name\": \"glyphName\",\n                glyphorientationhorizontal: \"glyphOrientationHorizontal\",\n                \"glyph-orientation-horizontal\": \"glyphOrientationHorizontal\",\n                glyphorientationvertical: \"glyphOrientationVertical\",\n                \"glyph-orientation-vertical\": \"glyphOrientationVertical\",\n                glyphref: \"glyphRef\",\n                gradienttransform: \"gradientTransform\",\n                gradientunits: \"gradientUnits\",\n                hanging: \"hanging\",\n                horizadvx: \"horizAdvX\",\n                \"horiz-adv-x\": \"horizAdvX\",\n                horizoriginx: \"horizOriginX\",\n                \"horiz-origin-x\": \"horizOriginX\",\n                ideographic: \"ideographic\",\n                imagerendering: \"imageRendering\",\n                \"image-rendering\": \"imageRendering\",\n                in2: \"in2\",\n                in: \"in\",\n                inlist: \"inlist\",\n                intercept: \"intercept\",\n                k1: \"k1\",\n                k2: \"k2\",\n                k3: \"k3\",\n                k4: \"k4\",\n                k: \"k\",\n                kernelmatrix: \"kernelMatrix\",\n                kernelunitlength: \"kernelUnitLength\",\n                kerning: \"kerning\",\n                keypoints: \"keyPoints\",\n                keysplines: \"keySplines\",\n                keytimes: \"keyTimes\",\n                lengthadjust: \"lengthAdjust\",\n                letterspacing: \"letterSpacing\",\n                \"letter-spacing\": \"letterSpacing\",\n                lightingcolor: \"lightingColor\",\n                \"lighting-color\": \"lightingColor\",\n                limitingconeangle: \"limitingConeAngle\",\n                local: \"local\",\n                markerend: \"markerEnd\",\n                \"marker-end\": \"markerEnd\",\n                markerheight: \"markerHeight\",\n                markermid: \"markerMid\",\n                \"marker-mid\": \"markerMid\",\n                markerstart: \"markerStart\",\n                \"marker-start\": \"markerStart\",\n                markerunits: \"markerUnits\",\n                markerwidth: \"markerWidth\",\n                mask: \"mask\",\n                maskcontentunits: \"maskContentUnits\",\n                maskunits: \"maskUnits\",\n                mathematical: \"mathematical\",\n                mode: \"mode\",\n                numoctaves: \"numOctaves\",\n                offset: \"offset\",\n                opacity: \"opacity\",\n                operator: \"operator\",\n                order: \"order\",\n                orient: \"orient\",\n                orientation: \"orientation\",\n                origin: \"origin\",\n                overflow: \"overflow\",\n                overlineposition: \"overlinePosition\",\n                \"overline-position\": \"overlinePosition\",\n                overlinethickness: \"overlineThickness\",\n                \"overline-thickness\": \"overlineThickness\",\n                paintorder: \"paintOrder\",\n                \"paint-order\": \"paintOrder\",\n                panose1: \"panose1\",\n                \"panose-1\": \"panose1\",\n                pathlength: \"pathLength\",\n                patterncontentunits: \"patternContentUnits\",\n                patterntransform: \"patternTransform\",\n                patternunits: \"patternUnits\",\n                pointerevents: \"pointerEvents\",\n                \"pointer-events\": \"pointerEvents\",\n                points: \"points\",\n                pointsatx: \"pointsAtX\",\n                pointsaty: \"pointsAtY\",\n                pointsatz: \"pointsAtZ\",\n                prefix: \"prefix\",\n                preservealpha: \"preserveAlpha\",\n                preserveaspectratio: \"preserveAspectRatio\",\n                primitiveunits: \"primitiveUnits\",\n                property: \"property\",\n                r: \"r\",\n                radius: \"radius\",\n                refx: \"refX\",\n                refy: \"refY\",\n                renderingintent: \"renderingIntent\",\n                \"rendering-intent\": \"renderingIntent\",\n                repeatcount: \"repeatCount\",\n                repeatdur: \"repeatDur\",\n                requiredextensions: \"requiredExtensions\",\n                requiredfeatures: \"requiredFeatures\",\n                resource: \"resource\",\n                restart: \"restart\",\n                result: \"result\",\n                results: \"results\",\n                rotate: \"rotate\",\n                rx: \"rx\",\n                ry: \"ry\",\n                scale: \"scale\",\n                security: \"security\",\n                seed: \"seed\",\n                shaperendering: \"shapeRendering\",\n                \"shape-rendering\": \"shapeRendering\",\n                slope: \"slope\",\n                spacing: \"spacing\",\n                specularconstant: \"specularConstant\",\n                specularexponent: \"specularExponent\",\n                speed: \"speed\",\n                spreadmethod: \"spreadMethod\",\n                startoffset: \"startOffset\",\n                stddeviation: \"stdDeviation\",\n                stemh: \"stemh\",\n                stemv: \"stemv\",\n                stitchtiles: \"stitchTiles\",\n                stopcolor: \"stopColor\",\n                \"stop-color\": \"stopColor\",\n                stopopacity: \"stopOpacity\",\n                \"stop-opacity\": \"stopOpacity\",\n                strikethroughposition: \"strikethroughPosition\",\n                \"strikethrough-position\": \"strikethroughPosition\",\n                strikethroughthickness: \"strikethroughThickness\",\n                \"strikethrough-thickness\": \"strikethroughThickness\",\n                string: \"string\",\n                stroke: \"stroke\",\n                strokedasharray: \"strokeDasharray\",\n                \"stroke-dasharray\": \"strokeDasharray\",\n                strokedashoffset: \"strokeDashoffset\",\n                \"stroke-dashoffset\": \"strokeDashoffset\",\n                strokelinecap: \"strokeLinecap\",\n                \"stroke-linecap\": \"strokeLinecap\",\n                strokelinejoin: \"strokeLinejoin\",\n                \"stroke-linejoin\": \"strokeLinejoin\",\n                strokemiterlimit: \"strokeMiterlimit\",\n                \"stroke-miterlimit\": \"strokeMiterlimit\",\n                strokewidth: \"strokeWidth\",\n                \"stroke-width\": \"strokeWidth\",\n                strokeopacity: \"strokeOpacity\",\n                \"stroke-opacity\": \"strokeOpacity\",\n                suppresscontenteditablewarning: \"suppressContentEditableWarning\",\n                suppresshydrationwarning: \"suppressHydrationWarning\",\n                surfacescale: \"surfaceScale\",\n                systemlanguage: \"systemLanguage\",\n                tablevalues: \"tableValues\",\n                targetx: \"targetX\",\n                targety: \"targetY\",\n                textanchor: \"textAnchor\",\n                \"text-anchor\": \"textAnchor\",\n                textdecoration: \"textDecoration\",\n                \"text-decoration\": \"textDecoration\",\n                textlength: \"textLength\",\n                textrendering: \"textRendering\",\n                \"text-rendering\": \"textRendering\",\n                to: \"to\",\n                transform: \"transform\",\n                typeof: \"typeof\",\n                u1: \"u1\",\n                u2: \"u2\",\n                underlineposition: \"underlinePosition\",\n                \"underline-position\": \"underlinePosition\",\n                underlinethickness: \"underlineThickness\",\n                \"underline-thickness\": \"underlineThickness\",\n                unicode: \"unicode\",\n                unicodebidi: \"unicodeBidi\",\n                \"unicode-bidi\": \"unicodeBidi\",\n                unicoderange: \"unicodeRange\",\n                \"unicode-range\": \"unicodeRange\",\n                unitsperem: \"unitsPerEm\",\n                \"units-per-em\": \"unitsPerEm\",\n                unselectable: \"unselectable\",\n                valphabetic: \"vAlphabetic\",\n                \"v-alphabetic\": \"vAlphabetic\",\n                values: \"values\",\n                vectoreffect: \"vectorEffect\",\n                \"vector-effect\": \"vectorEffect\",\n                version: \"version\",\n                vertadvy: \"vertAdvY\",\n                \"vert-adv-y\": \"vertAdvY\",\n                vertoriginx: \"vertOriginX\",\n                \"vert-origin-x\": \"vertOriginX\",\n                vertoriginy: \"vertOriginY\",\n                \"vert-origin-y\": \"vertOriginY\",\n                vhanging: \"vHanging\",\n                \"v-hanging\": \"vHanging\",\n                videographic: \"vIdeographic\",\n                \"v-ideographic\": \"vIdeographic\",\n                viewbox: \"viewBox\",\n                viewtarget: \"viewTarget\",\n                visibility: \"visibility\",\n                vmathematical: \"vMathematical\",\n                \"v-mathematical\": \"vMathematical\",\n                vocab: \"vocab\",\n                widths: \"widths\",\n                wordspacing: \"wordSpacing\",\n                \"word-spacing\": \"wordSpacing\",\n                writingmode: \"writingMode\",\n                \"writing-mode\": \"writingMode\",\n                x1: \"x1\",\n                x2: \"x2\",\n                x: \"x\",\n                xchannelselector: \"xChannelSelector\",\n                xheight: \"xHeight\",\n                \"x-height\": \"xHeight\",\n                xlinkactuate: \"xlinkActuate\",\n                \"xlink:actuate\": \"xlinkActuate\",\n                xlinkarcrole: \"xlinkArcrole\",\n                \"xlink:arcrole\": \"xlinkArcrole\",\n                xlinkhref: \"xlinkHref\",\n                \"xlink:href\": \"xlinkHref\",\n                xlinkrole: \"xlinkRole\",\n                \"xlink:role\": \"xlinkRole\",\n                xlinkshow: \"xlinkShow\",\n                \"xlink:show\": \"xlinkShow\",\n                xlinktitle: \"xlinkTitle\",\n                \"xlink:title\": \"xlinkTitle\",\n                xlinktype: \"xlinkType\",\n                \"xlink:type\": \"xlinkType\",\n                xmlbase: \"xmlBase\",\n                \"xml:base\": \"xmlBase\",\n                xmllang: \"xmlLang\",\n                \"xml:lang\": \"xmlLang\",\n                xmlns: \"xmlns\",\n                \"xml:space\": \"xmlSpace\",\n                xmlnsxlink: \"xmlnsXlink\",\n                \"xmlns:xlink\": \"xmlnsXlink\",\n                xmlspace: \"xmlSpace\",\n                y1: \"y1\",\n                y2: \"y2\",\n                y: \"y\",\n                ychannelselector: \"yChannelSelector\",\n                z: \"z\",\n                zoomandpan: \"zoomAndPan\"\n            }, ariaProperties = {\n                \"aria-current\": 0,\n                \"aria-details\": 0,\n                \"aria-disabled\": 0,\n                \"aria-hidden\": 0,\n                \"aria-invalid\": 0,\n                \"aria-keyshortcuts\": 0,\n                \"aria-label\": 0,\n                \"aria-roledescription\": 0,\n                \"aria-autocomplete\": 0,\n                \"aria-checked\": 0,\n                \"aria-expanded\": 0,\n                \"aria-haspopup\": 0,\n                \"aria-level\": 0,\n                \"aria-modal\": 0,\n                \"aria-multiline\": 0,\n                \"aria-multiselectable\": 0,\n                \"aria-orientation\": 0,\n                \"aria-placeholder\": 0,\n                \"aria-pressed\": 0,\n                \"aria-readonly\": 0,\n                \"aria-required\": 0,\n                \"aria-selected\": 0,\n                \"aria-sort\": 0,\n                \"aria-valuemax\": 0,\n                \"aria-valuemin\": 0,\n                \"aria-valuenow\": 0,\n                \"aria-valuetext\": 0,\n                \"aria-atomic\": 0,\n                \"aria-busy\": 0,\n                \"aria-live\": 0,\n                \"aria-relevant\": 0,\n                \"aria-dropeffect\": 0,\n                \"aria-grabbed\": 0,\n                \"aria-activedescendant\": 0,\n                \"aria-colcount\": 0,\n                \"aria-colindex\": 0,\n                \"aria-colspan\": 0,\n                \"aria-controls\": 0,\n                \"aria-describedby\": 0,\n                \"aria-errormessage\": 0,\n                \"aria-flowto\": 0,\n                \"aria-labelledby\": 0,\n                \"aria-owns\": 0,\n                \"aria-posinset\": 0,\n                \"aria-rowcount\": 0,\n                \"aria-rowindex\": 0,\n                \"aria-rowspan\": 0,\n                \"aria-setsize\": 0\n            }, warnedProperties = {}, rARIA = new RegExp(\"^(aria)-[\" + ATTRIBUTE_NAME_CHAR + \"]*$\"), rARIACamel = new RegExp(\"^(aria)[A-Z][\" + ATTRIBUTE_NAME_CHAR + \"]*$\"), hasOwnProperty = Object.prototype.hasOwnProperty, didWarnValueNull = !1, validateProperty$1 = function() {}, warnedProperties$1 = {}, _hasOwnProperty = Object.prototype.hasOwnProperty, EVENT_NAME_REGEX = /^on./, INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/, rARIA$1 = new RegExp(\"^(aria)-[\" + ATTRIBUTE_NAME_CHAR + \"]*$\"), rARIACamel$1 = new RegExp(\"^(aria)[A-Z][\" + ATTRIBUTE_NAME_CHAR + \"]*$\");\n            validateProperty$1 = function(tagName, name, value, canUseEventSystem) {\n                if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) return !0;\n                var lowerCasedName = name.toLowerCase();\n                if (\"onfocusin\" === lowerCasedName || \"onfocusout\" === lowerCasedName) return warning(!1, \"React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React.\"), \n                warnedProperties$1[name] = !0, !0;\n                if (canUseEventSystem) {\n                    if (registrationNameModules.hasOwnProperty(name)) return !0;\n                    var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;\n                    if (null != registrationName) return warning(!1, \"Invalid event handler property ` + \"`\")) + (`%s` + (\"`\" + `. Did you mean `))))) + ((((\"`\" + (`%s` + \"`\")) + (`?%s\", name, registrationName, getStackAddendum$2()), \n                    warnedProperties$1[name] = !0, !0;\n                    if (EVENT_NAME_REGEX.test(name)) return warning(!1, \"Unknown event handler property ` + (\"`\" + `%s`))) + ((\"`\" + (`. It will be ignored.%s\", name, getStackAddendum$2()), \n                    warnedProperties$1[name] = !0, !0;\n                } else if (EVENT_NAME_REGEX.test(name)) return INVALID_EVENT_NAME_REGEX.test(name) && warning(!1, \"Invalid event handler property ` + \"`\")) + (`%s` + (\"`\" + `. React events use the camelCase naming convention, for example `)))) + (((\"`\" + (`onClick` + \"`\")) + (`.%s\", name, getStackAddendum$2()), \n                warnedProperties$1[name] = !0, !0;\n                if (rARIA$1.test(name) || rARIACamel$1.test(name)) return !0;\n                if (\"innerhtml\" === lowerCasedName) return warning(!1, \"Directly setting property ` + (\"`\" + `innerHTML`))) + ((\"`\" + (` is not permitted. For more information, lookup documentation on ` + \"`\")) + (`dangerouslySetInnerHTML` + (\"`\" + `.\"), \n                warnedProperties$1[name] = !0, !0;\n                if (\"aria\" === lowerCasedName) return warning(!1, \"The `)))))) + (((((\"`\" + (`aria` + \"`\")) + (` attribute is reserved for future use in React. Pass individual ` + (\"`\" + `aria-`))) + ((\"`\" + (` attributes instead.\"), \n                warnedProperties$1[name] = !0, !0;\n                if (\"is\" === lowerCasedName && null !== value && void 0 !== value && \"string\" != typeof value) return warning(!1, \"Received a ` + \"`\")) + (`%s` + (\"`\" + ` for a string attribute `)))) + (((\"`\" + (`is` + \"`\")) + (`. If this is expected, cast the value to a string.%s\", typeof value, getStackAddendum$2()), \n                warnedProperties$1[name] = !0, !0;\n                if (\"number\" == typeof value && isNaN(value)) return warning(!1, \"Received NaN for the ` + (\"`\" + `%s`))) + ((\"`\" + (` attribute. If this is expected, cast the value to a string.%s\", name, getStackAddendum$2()), \n                warnedProperties$1[name] = !0, !0;\n                var propertyInfo = getPropertyInfo(name), isReserved = null !== propertyInfo && propertyInfo.type === RESERVED;\n                if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n                    var standardName = possibleStandardNames[lowerCasedName];\n                    if (standardName !== name) return warning(!1, \"Invalid DOM property ` + \"`\")) + (`%s` + (\"`\" + `. Did you mean `))))) + ((((\"`\" + (`%s` + \"`\")) + (`?%s\", name, standardName, getStackAddendum$2()), \n                    warnedProperties$1[name] = !0, !0;\n                } else if (!isReserved && name !== lowerCasedName) return warning(!1, \"React does not recognize the ` + (\"`\" + `%s`))) + ((\"`\" + (` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase ` + \"`\")) + (`%s` + (\"`\" + ` instead. If you accidentally passed it from a parent component, remove it from the DOM element.%s\", name, lowerCasedName, getStackAddendum$2()), \n                warnedProperties$1[name] = !0, !0;\n                return \"boolean\" == typeof value && shouldRemoveAttributeWithWarning(name, value, propertyInfo, !1) ? (value ? warning(!1, 'Received `)))) + (((\"`\" + (`%s` + \"`\")) + (` for a non-boolean attribute ` + (\"`\" + `%s`))) + ((\"`\" + (`.\\n\\nIf you want to write it to the DOM, pass a string instead: %s=\"%s\" or %s={value.toString()}.%s', value, name, name, value, name, getStackAddendum$2()) : warning(!1, 'Received ` + \"`\")) + ((`%s` + \"`\") + (` for a non-boolean attribute ` + \"`\"))))))) + ((((((`%s` + (\"`\" + `.\\n\\nIf you want to write it to the DOM, pass a string instead: %s=\"%s\" or %s={value.toString()}.\\n\\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.%s', value, name, name, value, name, name, name, getStackAddendum$2()), \n                warnedProperties$1[name] = !0, !0) : !!isReserved || (!shouldRemoveAttributeWithWarning(name, value, propertyInfo, !1) || (warnedProperties$1[name] = !0, \n                !1));\n            };\n            var warnUnknownProperties = function(type, props, canUseEventSystem) {\n                var unknownProps = [];\n                for (var key in props) {\n                    validateProperty$1(type, key, props[key], canUseEventSystem) || unknownProps.push(key);\n                }\n                var unknownPropString = unknownProps.map(function(prop) {\n                    return \"`)) + (\"`\" + (`\" + prop + \"` + \"`\"))) + ((`\";\n                }).join(\", \");\n                1 === unknownProps.length ? warning(!1, \"Invalid value for prop %s on <%s> tag. Either remove it from the element, or pass a string or number value to keep it in the DOM. For details, see https://fb.me/react-attribute-behavior%s\", unknownPropString, type, getStackAddendum$2()) : unknownProps.length > 1 && warning(!1, \"Invalid values for props %s on <%s> tag. Either remove them from the element, or pass a string or number value to keep them in the DOM. For details, see https://fb.me/react-attribute-behavior%s\", unknownPropString, type, getStackAddendum$2());\n            }, getCurrentFiberOwnerName$2 = ReactDebugCurrentFiber.getCurrentFiberOwnerName, getCurrentFiberStackAddendum$2 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnInvalidHydration = !1, didWarnShadyDOM = !1, DANGEROUSLY_SET_INNER_HTML = \"dangerouslySetInnerHTML\", SUPPRESS_CONTENT_EDITABLE_WARNING = \"suppressContentEditableWarning\", SUPPRESS_HYDRATION_WARNING$1 = \"suppressHydrationWarning\", AUTOFOCUS = \"autoFocus\", CHILDREN = \"children\", STYLE = \"style\", HTML = \"__html\", HTML_NAMESPACE = Namespaces.html, getStack = emptyFunction.thatReturns(\"\"), warnedUnknownTags = void 0, suppressHydrationWarning = void 0, validatePropertiesInDevelopment = void 0, warnForTextDifference = void 0, warnForPropDifference = void 0, warnForExtraAttributes = void 0, warnForInvalidEventListener = void 0, normalizeMarkupForTextOrAttribute = void 0, normalizeHTML = void 0;\n            getStack = getCurrentFiberStackAddendum$2, warnedUnknownTags = {\n                time: !0,\n                dialog: !0\n            }, validatePropertiesInDevelopment = function(type, props) {\n                validateProperties(type, props), validateProperties$1(type, props), validateProperties$2(type, props, !0);\n            };\n            var NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g, NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\n            normalizeMarkupForTextOrAttribute = function(markup) {\n                return (\"string\" == typeof markup ? markup : \"\" + markup).replace(NORMALIZE_NEWLINES_REGEX, \"\\n\").replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, \"\");\n            }, warnForTextDifference = function(serverText, clientText) {\n                if (!didWarnInvalidHydration) {\n                    var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText), normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);\n                    normalizedServerText !== normalizedClientText && (didWarnInvalidHydration = !0, \n                    warning(!1, 'Text content did not match. Server: \"%s\" Client: \"%s\"', normalizedServerText, normalizedClientText));\n                }\n            }, warnForPropDifference = function(propName, serverValue, clientValue) {\n                if (!didWarnInvalidHydration) {\n                    var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue), normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);\n                    normalizedServerValue !== normalizedClientValue && (didWarnInvalidHydration = !0, \n                    warning(!1, \"Prop ` + (\"`\" + `%s`)) + (\"`\" + (` did not match. Server: %s Client: %s\", propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue)));\n                }\n            }, warnForExtraAttributes = function(attributeNames) {\n                if (!didWarnInvalidHydration) {\n                    didWarnInvalidHydration = !0;\n                    var names = [];\n                    attributeNames.forEach(function(name) {\n                        names.push(name);\n                    }), warning(!1, \"Extra attributes from the server: %s\", names);\n                }\n            }, warnForInvalidEventListener = function(registrationName, listener) {\n                !1 === listener ? warning(!1, \"Expected ` + \"`\")))) + (((`%s` + (\"`\" + ` listener to be a function, instead got `)) + (\"`\" + (`false` + \"`\"))) + ((`.\\n\\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.%s\", registrationName, registrationName, registrationName, getCurrentFiberStackAddendum$2()) : warning(!1, \"Expected ` + (\"`\" + `%s`)) + (\"`\" + (` listener to be a function, instead got a value of ` + \"`\"))))) + ((((`%s` + (\"`\" + ` type.%s\", registrationName, typeof listener, getCurrentFiberStackAddendum$2());\n            }, normalizeHTML = function(parent, html) {\n                var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);\n                return testElement.innerHTML = html, testElement.innerHTML;\n            };\n            var ReactDOMFiberComponent = Object.freeze({\n                createElement: createElement$1,\n                createTextNode: createTextNode$1,\n                setInitialProperties: setInitialProperties$1,\n                diffProperties: diffProperties$1,\n                updateProperties: updateProperties$1,\n                diffHydratedProperties: diffHydratedProperties$1,\n                diffHydratedText: diffHydratedText$1,\n                warnForUnmatchedText: warnForUnmatchedText$1,\n                warnForDeletedHydratableElement: warnForDeletedHydratableElement$1,\n                warnForDeletedHydratableText: warnForDeletedHydratableText$1,\n                warnForInsertedHydratedElement: warnForInsertedHydratedElement$1,\n                warnForInsertedHydratedText: warnForInsertedHydratedText$1,\n                restoreControlledState: restoreControlledState$1\n            }), getCurrentFiberStackAddendum$5 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, validateDOMNesting = emptyFunction, specialTags = [ \"address\", \"applet\", \"area\", \"article\", \"aside\", \"base\", \"basefont\", \"bgsound\", \"blockquote\", \"body\", \"br\", \"button\", \"caption\", \"center\", \"col\", \"colgroup\", \"dd\", \"details\", \"dir\", \"div\", \"dl\", \"dt\", \"embed\", \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"frame\", \"frameset\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"iframe\", \"img\", \"input\", \"isindex\", \"li\", \"link\", \"listing\", \"main\", \"marquee\", \"menu\", \"menuitem\", \"meta\", \"nav\", \"noembed\", \"noframes\", \"noscript\", \"object\", \"ol\", \"p\", \"param\", \"plaintext\", \"pre\", \"script\", \"section\", \"select\", \"source\", \"style\", \"summary\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"title\", \"tr\", \"track\", \"ul\", \"wbr\", \"xmp\" ], inScopeTags = [ \"applet\", \"caption\", \"html\", \"table\", \"td\", \"th\", \"marquee\", \"object\", \"template\", \"foreignObject\", \"desc\", \"title\" ], buttonScopeTags = inScopeTags.concat([ \"button\" ]), impliedEndTags = [ \"dd\", \"dt\", \"li\", \"option\", \"optgroup\", \"p\", \"rp\", \"rt\" ], emptyAncestorInfo = {\n                current: null,\n                formTag: null,\n                aTagInScope: null,\n                buttonTagInScope: null,\n                nobrTagInScope: null,\n                pTagInButtonScope: null,\n                listItemTagAutoclosing: null,\n                dlItemTagAutoclosing: null\n            }, updatedAncestorInfo$1 = function(oldInfo, tag, instance) {\n                var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo), info = {\n                    tag: tag,\n                    instance: instance\n                };\n                return -1 !== inScopeTags.indexOf(tag) && (ancestorInfo.aTagInScope = null, ancestorInfo.buttonTagInScope = null, \n                ancestorInfo.nobrTagInScope = null), -1 !== buttonScopeTags.indexOf(tag) && (ancestorInfo.pTagInButtonScope = null), \n                -1 !== specialTags.indexOf(tag) && \"address\" !== tag && \"div\" !== tag && \"p\" !== tag && (ancestorInfo.listItemTagAutoclosing = null, \n                ancestorInfo.dlItemTagAutoclosing = null), ancestorInfo.current = info, \"form\" === tag && (ancestorInfo.formTag = info), \n                \"a\" === tag && (ancestorInfo.aTagInScope = info), \"button\" === tag && (ancestorInfo.buttonTagInScope = info), \n                \"nobr\" === tag && (ancestorInfo.nobrTagInScope = info), \"p\" === tag && (ancestorInfo.pTagInButtonScope = info), \n                \"li\" === tag && (ancestorInfo.listItemTagAutoclosing = info), \"dd\" !== tag && \"dt\" !== tag || (ancestorInfo.dlItemTagAutoclosing = info), \n                ancestorInfo;\n            }, isTagValidWithParent = function(tag, parentTag) {\n                switch (parentTag) {\n                  case \"select\":\n                    return \"option\" === tag || \"optgroup\" === tag || \"#text\" === tag;\n\n                  case \"optgroup\":\n                    return \"option\" === tag || \"#text\" === tag;\n\n                  case \"option\":\n                    return \"#text\" === tag;\n\n                  case \"tr\":\n                    return \"th\" === tag || \"td\" === tag || \"style\" === tag || \"script\" === tag || \"template\" === tag;\n\n                  case \"tbody\":\n                  case \"thead\":\n                  case \"tfoot\":\n                    return \"tr\" === tag || \"style\" === tag || \"script\" === tag || \"template\" === tag;\n\n                  case \"colgroup\":\n                    return \"col\" === tag || \"template\" === tag;\n\n                  case \"table\":\n                    return \"caption\" === tag || \"colgroup\" === tag || \"tbody\" === tag || \"tfoot\" === tag || \"thead\" === tag || \"style\" === tag || \"script\" === tag || \"template\" === tag;\n\n                  case \"head\":\n                    return \"base\" === tag || \"basefont\" === tag || \"bgsound\" === tag || \"link\" === tag || \"meta\" === tag || \"title\" === tag || \"noscript\" === tag || \"noframes\" === tag || \"style\" === tag || \"script\" === tag || \"template\" === tag;\n\n                  case \"html\":\n                    return \"head\" === tag || \"body\" === tag;\n\n                  case \"#document\":\n                    return \"html\" === tag;\n                }\n                switch (tag) {\n                  case \"h1\":\n                  case \"h2\":\n                  case \"h3\":\n                  case \"h4\":\n                  case \"h5\":\n                  case \"h6\":\n                    return \"h1\" !== parentTag && \"h2\" !== parentTag && \"h3\" !== parentTag && \"h4\" !== parentTag && \"h5\" !== parentTag && \"h6\" !== parentTag;\n\n                  case \"rp\":\n                  case \"rt\":\n                    return -1 === impliedEndTags.indexOf(parentTag);\n\n                  case \"body\":\n                  case \"caption\":\n                  case \"col\":\n                  case \"colgroup\":\n                  case \"frame\":\n                  case \"head\":\n                  case \"html\":\n                  case \"tbody\":\n                  case \"td\":\n                  case \"tfoot\":\n                  case \"th\":\n                  case \"thead\":\n                  case \"tr\":\n                    return null == parentTag;\n                }\n                return !0;\n            }, findInvalidAncestorForTag = function(tag, ancestorInfo) {\n                switch (tag) {\n                  case \"address\":\n                  case \"article\":\n                  case \"aside\":\n                  case \"blockquote\":\n                  case \"center\":\n                  case \"details\":\n                  case \"dialog\":\n                  case \"dir\":\n                  case \"div\":\n                  case \"dl\":\n                  case \"fieldset\":\n                  case \"figcaption\":\n                  case \"figure\":\n                  case \"footer\":\n                  case \"header\":\n                  case \"hgroup\":\n                  case \"main\":\n                  case \"menu\":\n                  case \"nav\":\n                  case \"ol\":\n                  case \"p\":\n                  case \"section\":\n                  case \"summary\":\n                  case \"ul\":\n                  case \"pre\":\n                  case \"listing\":\n                  case \"table\":\n                  case \"hr\":\n                  case \"xmp\":\n                  case \"h1\":\n                  case \"h2\":\n                  case \"h3\":\n                  case \"h4\":\n                  case \"h5\":\n                  case \"h6\":\n                    return ancestorInfo.pTagInButtonScope;\n\n                  case \"form\":\n                    return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n                  case \"li\":\n                    return ancestorInfo.listItemTagAutoclosing;\n\n                  case \"dd\":\n                  case \"dt\":\n                    return ancestorInfo.dlItemTagAutoclosing;\n\n                  case \"button\":\n                    return ancestorInfo.buttonTagInScope;\n\n                  case \"a\":\n                    return ancestorInfo.aTagInScope;\n\n                  case \"nobr\":\n                    return ancestorInfo.nobrTagInScope;\n                }\n                return null;\n            }, didWarn = {};\n            validateDOMNesting = function(childTag, childText, ancestorInfo) {\n                ancestorInfo = ancestorInfo || emptyAncestorInfo;\n                var parentInfo = ancestorInfo.current, parentTag = parentInfo && parentInfo.tag;\n                null != childText && (null != childTag && warning(!1, \"validateDOMNesting: when childText is passed, childTag should be null\"), \n                childTag = \"#text\");\n                var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo, invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo), invalidParentOrAncestor = invalidParent || invalidAncestor;\n                if (invalidParentOrAncestor) {\n                    var ancestorTag = invalidParentOrAncestor.tag, addendum = getCurrentFiberStackAddendum$5(), warnKey = !!invalidParent + \"|\" + childTag + \"|\" + ancestorTag + \"|\" + addendum;\n                    if (!didWarn[warnKey]) {\n                        didWarn[warnKey] = !0;\n                        var tagDisplayName = childTag, whitespaceInfo = \"\";\n                        if (\"#text\" === childTag ? /\\S/.test(childText) ? tagDisplayName = \"Text nodes\" : (tagDisplayName = \"Whitespace text nodes\", \n                        whitespaceInfo = \" Make sure you don't have any extra whitespace between tags on each line of your source code.\") : tagDisplayName = \"<\" + childTag + \">\", \n                        invalidParent) {\n                            var info = \"\";\n                            \"table\" === ancestorTag && \"tr\" === childTag && (info += \" Add a <tbody> to your code to match the DOM tree generated by the browser.\"), \n                            warning(!1, \"validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s\", tagDisplayName, ancestorTag, whitespaceInfo, info, addendum);\n                        } else warning(!1, \"validateDOMNesting(...): %s cannot appear as a descendant of <%s>.%s\", tagDisplayName, ancestorTag, addendum);\n                    }\n                }\n            }, validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo$1;\n            var validateDOMNesting$1 = validateDOMNesting, supportsPersistence = !1, cloneInstance = shim, createContainerChildSet = shim, appendChildToContainerChildSet = shim, finalizeContainerChildren = shim, replaceContainerChildren = shim, createElement = createElement$1, createTextNode = createTextNode$1, setInitialProperties = setInitialProperties$1, diffProperties = diffProperties$1, updateProperties = updateProperties$1, diffHydratedProperties = diffHydratedProperties$1, diffHydratedText = diffHydratedText$1, warnForUnmatchedText = warnForUnmatchedText$1, warnForDeletedHydratableElement = warnForDeletedHydratableElement$1, warnForDeletedHydratableText = warnForDeletedHydratableText$1, warnForInsertedHydratedElement = warnForInsertedHydratedElement$1, warnForInsertedHydratedText = warnForInsertedHydratedText$1, updatedAncestorInfo = validateDOMNesting$1.updatedAncestorInfo, precacheFiberNode$1 = precacheFiberNode, updateFiberProps$1 = updateFiberProps, SUPPRESS_HYDRATION_WARNING = void 0;\n            SUPPRESS_HYDRATION_WARNING = \"suppressHydrationWarning\";\n            var eventsEnabled = null, selectionInformation = null, now = now$1, isPrimaryRenderer = !0, scheduleDeferredCallback = scheduleWork, cancelDeferredCallback = cancelScheduledWork, supportsMutation = !0, supportsHydration = !0, enableUserTimingAPI = !0, enableGetDerivedStateFromCatch = !1, enableSuspense = !1, debugRenderPhaseSideEffects = !1, debugRenderPhaseSideEffectsForStrictMode = !0, replayFailedUnitOfWorkWithInvokeGuardedCallback = !0, warnAboutDeprecatedLifecycles = !1, warnAboutLegacyContextAPI = !1, enableProfilerTimer = !0, fireGetDerivedStateFromPropsOnStateUpdates = !0, supportsUserTiming = \"undefined\" != typeof performance && \"function\" == typeof performance.mark && \"function\" == typeof performance.clearMarks && \"function\" == typeof performance.measure && \"function\" == typeof performance.clearMeasures, currentFiber = null, currentPhase = null, currentPhaseFiber = null, isCommitting = !1, hasScheduledUpdateInCurrentCommit = !1, hasScheduledUpdateInCurrentPhase = !1, commitCountInCurrentWorkLoop = 0, effectCountInCurrentCommit = 0, isWaitingForCallback = !1, labelsInCurrentCommit = new Set(), formatMarkName = function(markName) {\n                return \"⚛ \" + markName;\n            }, formatLabel = function(label, warning$$1) {\n                return (warning$$1 ? \"⛔ \" : \"⚛ \") + label + (warning$$1 ? \" Warning: \" + warning$$1 : \"\");\n            }, beginMark = function(markName) {\n                performance.mark(formatMarkName(markName));\n            }, clearMark = function(markName) {\n                performance.clearMarks(formatMarkName(markName));\n            }, endMark = function(label, markName, warning$$1) {\n                var formattedMarkName = formatMarkName(markName), formattedLabel = formatLabel(label, warning$$1);\n                try {\n                    performance.measure(formattedLabel, formattedMarkName);\n                } catch (err) {}\n                performance.clearMarks(formattedMarkName), performance.clearMeasures(formattedLabel);\n            }, getFiberMarkName = function(label, debugID) {\n                return label + \" (#\" + debugID + \")\";\n            }, getFiberLabel = function(componentName, isMounted, phase) {\n                return null === phase ? componentName + \" [\" + (isMounted ? \"update\" : \"mount\") + \"]\" : componentName + \".\" + phase;\n            }, beginFiberMark = function(fiber, phase) {\n                var componentName = getComponentName(fiber) || \"Unknown\", debugID = fiber._debugID, isMounted = null !== fiber.alternate, label = getFiberLabel(componentName, isMounted, phase);\n                if (isCommitting && labelsInCurrentCommit.has(label)) return !1;\n                labelsInCurrentCommit.add(label);\n                var markName = getFiberMarkName(label, debugID);\n                return beginMark(markName), !0;\n            }, clearFiberMark = function(fiber, phase) {\n                var componentName = getComponentName(fiber) || \"Unknown\", debugID = fiber._debugID, isMounted = null !== fiber.alternate, label = getFiberLabel(componentName, isMounted, phase), markName = getFiberMarkName(label, debugID);\n                clearMark(markName);\n            }, endFiberMark = function(fiber, phase, warning$$1) {\n                var componentName = getComponentName(fiber) || \"Unknown\", debugID = fiber._debugID, isMounted = null !== fiber.alternate, label = getFiberLabel(componentName, isMounted, phase), markName = getFiberMarkName(label, debugID);\n                endMark(label, markName, warning$$1);\n            }, shouldIgnoreFiber = function(fiber) {\n                switch (fiber.tag) {\n                  case HostRoot:\n                  case HostComponent:\n                  case HostText:\n                  case HostPortal:\n                  case Fragment:\n                  case ContextProvider:\n                  case ContextConsumer:\n                  case Mode:\n                    return !0;\n\n                  default:\n                    return !1;\n                }\n            }, clearPendingPhaseMeasurement = function() {\n                null !== currentPhase && null !== currentPhaseFiber && clearFiberMark(currentPhaseFiber, currentPhase), \n                currentPhaseFiber = null, currentPhase = null, hasScheduledUpdateInCurrentPhase = !1;\n            }, pauseTimers = function() {\n                for (var fiber = currentFiber; fiber; ) fiber._debugIsCurrentlyTiming && endFiberMark(fiber, null, null), \n                fiber = fiber.return;\n            }, resumeTimersRecursively = function(fiber) {\n                null !== fiber.return && resumeTimersRecursively(fiber.return), fiber._debugIsCurrentlyTiming && beginFiberMark(fiber, null);\n            }, resumeTimers = function() {\n                null !== currentFiber && resumeTimersRecursively(currentFiber);\n            }, valueStack = [], fiberStack = void 0;\n            fiberStack = [];\n            var index = -1, warnedAboutMissingGetChildContext = void 0;\n            warnedAboutMissingGetChildContext = {};\n            var contextStackCursor = createCursor(emptyObject), didPerformWorkStackCursor = createCursor(!1), previousContext = emptyObject, MAX_SIGNED_31_BIT_INT = 1073741823, NoWork = 0, Sync = 1, Never = MAX_SIGNED_31_BIT_INT, UNIT_SIZE = 10, MAGIC_NUMBER_OFFSET = 2, NoContext = 0, AsyncMode = 1, StrictMode = 2, ProfileMode = 4, hasBadMapPolyfill = void 0;\n            hasBadMapPolyfill = !1;\n            try {\n                var nonExtensibleObject = Object.preventExtensions({}), testMap = new Map([ [ nonExtensibleObject, null ] ]), testSet = new Set([ nonExtensibleObject ]);\n                testMap.set(0, 0), testSet.add(0);\n            } catch (e) {\n                hasBadMapPolyfill = !0;\n            }\n            var debugCounter = void 0;\n            debugCounter = 1;\n            var createFiber = function(tag, pendingProps, key, mode) {\n                return new FiberNode(tag, pendingProps, key, mode);\n            }, onCommitFiberRoot = null, onCommitFiberUnmount = null, hasLoggedError = !1, lowPriorityWarning = function() {}, printWarning = function(format) {\n                for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];\n                var argIndex = 0, message = \"Warning: \" + format.replace(/%s/g, function() {\n                    return args[argIndex++];\n                });\n                \"undefined\" != typeof console && console.warn(message);\n                try {\n                    throw new Error(message);\n                } catch (x) {}\n            };\n            lowPriorityWarning = function(condition, format) {\n                if (void 0 === format) throw new Error(\"`)) + (\"`\" + (`warning(condition, format, ...args)` + \"`\"))) + ((` requires a warning message argument\");\n                if (!condition) {\n                    for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2];\n                    printWarning.apply(void 0, [ format ].concat(args));\n                }\n            };\n            var lowPriorityWarning$1 = lowPriorityWarning, ReactStrictModeWarnings = {\n                discardPendingWarnings: function() {},\n                flushPendingDeprecationWarnings: function() {},\n                flushPendingUnsafeLifecycleWarnings: function() {},\n                recordDeprecationWarnings: function(fiber, instance) {},\n                recordUnsafeLifecycleWarnings: function(fiber, instance) {},\n                recordLegacyContextWarning: function(fiber, instance) {},\n                flushLegacyContextWarning: function() {}\n            }, LIFECYCLE_SUGGESTIONS = {\n                UNSAFE_componentWillMount: \"componentDidMount\",\n                UNSAFE_componentWillReceiveProps: \"static getDerivedStateFromProps\",\n                UNSAFE_componentWillUpdate: \"componentDidUpdate\"\n            }, pendingComponentWillMountWarnings = [], pendingComponentWillReceivePropsWarnings = [], pendingComponentWillUpdateWarnings = [], pendingUnsafeLifecycleWarnings = new Map(), pendingLegacyContextWarning = new Map(), didWarnAboutDeprecatedLifecycles = new Set(), didWarnAboutUnsafeLifecycles = new Set(), didWarnAboutLegacyContext = new Set(), setToSortedString = function(set) {\n                var array = [];\n                return set.forEach(function(value) {\n                    array.push(value);\n                }), array.sort().join(\", \");\n            };\n            ReactStrictModeWarnings.discardPendingWarnings = function() {\n                pendingComponentWillMountWarnings = [], pendingComponentWillReceivePropsWarnings = [], \n                pendingComponentWillUpdateWarnings = [], pendingUnsafeLifecycleWarnings = new Map(), \n                pendingLegacyContextWarning = new Map();\n            }, ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function() {\n                pendingUnsafeLifecycleWarnings.forEach(function(lifecycleWarningsMap, strictRoot) {\n                    var lifecyclesWarningMesages = [];\n                    if (Object.keys(lifecycleWarningsMap).forEach(function(lifecycle) {\n                        var lifecycleWarnings = lifecycleWarningsMap[lifecycle];\n                        if (lifecycleWarnings.length > 0) {\n                            var componentNames = new Set();\n                            lifecycleWarnings.forEach(function(fiber) {\n                                componentNames.add(getComponentName(fiber) || \"Component\"), didWarnAboutUnsafeLifecycles.add(fiber.type);\n                            });\n                            var formatted = lifecycle.replace(\"UNSAFE_\", \"\"), suggestion = LIFECYCLE_SUGGESTIONS[lifecycle], sortedComponentNames = setToSortedString(componentNames);\n                            lifecyclesWarningMesages.push(formatted + \": Please update the following components to use \" + suggestion + \" instead: \" + sortedComponentNames);\n                        }\n                    }), lifecyclesWarningMesages.length > 0) {\n                        var strictRootComponentStack = getStackAddendumByWorkInProgressFiber(strictRoot);\n                        warning(!1, \"Unsafe lifecycle methods were found within a strict-mode tree:%s\\n\\n%s\\n\\nLearn more about this warning here:\\nhttps://fb.me/react-strict-mode-warnings\", strictRootComponentStack, lifecyclesWarningMesages.join(\"\\n\\n\"));\n                    }\n                }), pendingUnsafeLifecycleWarnings = new Map();\n            };\n            var findStrictRoot = function(fiber) {\n                for (var maybeStrictRoot = null, node = fiber; null !== node; ) node.mode & StrictMode && (maybeStrictRoot = node), \n                node = node.return;\n                return maybeStrictRoot;\n            };\n            ReactStrictModeWarnings.flushPendingDeprecationWarnings = function() {\n                if (pendingComponentWillMountWarnings.length > 0) {\n                    var uniqueNames = new Set();\n                    pendingComponentWillMountWarnings.forEach(function(fiber) {\n                        uniqueNames.add(getComponentName(fiber) || \"Component\"), didWarnAboutDeprecatedLifecycles.add(fiber.type);\n                    });\n                    var sortedNames = setToSortedString(uniqueNames);\n                    lowPriorityWarning$1(!1, \"componentWillMount is deprecated and will be removed in the next major version. Use componentDidMount instead. As a temporary workaround, you can rename to UNSAFE_componentWillMount.\\n\\nPlease update the following components: %s\\n\\nLearn more about this warning here:\\nhttps://fb.me/react-async-component-lifecycle-hooks\", sortedNames), \n                    pendingComponentWillMountWarnings = [];\n                }\n                if (pendingComponentWillReceivePropsWarnings.length > 0) {\n                    var _uniqueNames = new Set();\n                    pendingComponentWillReceivePropsWarnings.forEach(function(fiber) {\n                        _uniqueNames.add(getComponentName(fiber) || \"Component\"), didWarnAboutDeprecatedLifecycles.add(fiber.type);\n                    });\n                    var _sortedNames = setToSortedString(_uniqueNames);\n                    lowPriorityWarning$1(!1, \"componentWillReceiveProps is deprecated and will be removed in the next major version. Use static getDerivedStateFromProps instead.\\n\\nPlease update the following components: %s\\n\\nLearn more about this warning here:\\nhttps://fb.me/react-async-component-lifecycle-hooks\", _sortedNames), \n                    pendingComponentWillReceivePropsWarnings = [];\n                }\n                if (pendingComponentWillUpdateWarnings.length > 0) {\n                    var _uniqueNames2 = new Set();\n                    pendingComponentWillUpdateWarnings.forEach(function(fiber) {\n                        _uniqueNames2.add(getComponentName(fiber) || \"Component\"), didWarnAboutDeprecatedLifecycles.add(fiber.type);\n                    });\n                    var _sortedNames2 = setToSortedString(_uniqueNames2);\n                    lowPriorityWarning$1(!1, \"componentWillUpdate is deprecated and will be removed in the next major version. Use componentDidUpdate instead. As a temporary workaround, you can rename to UNSAFE_componentWillUpdate.\\n\\nPlease update the following components: %s\\n\\nLearn more about this warning here:\\nhttps://fb.me/react-async-component-lifecycle-hooks\", _sortedNames2), \n                    pendingComponentWillUpdateWarnings = [];\n                }\n            }, ReactStrictModeWarnings.recordDeprecationWarnings = function(fiber, instance) {\n                didWarnAboutDeprecatedLifecycles.has(fiber.type) || (\"function\" == typeof instance.componentWillMount && !0 !== instance.componentWillMount.__suppressDeprecationWarning && pendingComponentWillMountWarnings.push(fiber), \n                \"function\" == typeof instance.componentWillReceiveProps && !0 !== instance.componentWillReceiveProps.__suppressDeprecationWarning && pendingComponentWillReceivePropsWarnings.push(fiber), \n                \"function\" == typeof instance.componentWillUpdate && !0 !== instance.componentWillUpdate.__suppressDeprecationWarning && pendingComponentWillUpdateWarnings.push(fiber));\n            }, ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function(fiber, instance) {\n                var strictRoot = findStrictRoot(fiber);\n                if (null === strictRoot) return void warning(!1, \"Expected to find a StrictMode component in a strict mode tree. This error is likely caused by a bug in React. Please file an issue.\");\n                if (!didWarnAboutUnsafeLifecycles.has(fiber.type)) {\n                    var warningsForRoot = void 0;\n                    pendingUnsafeLifecycleWarnings.has(strictRoot) ? warningsForRoot = pendingUnsafeLifecycleWarnings.get(strictRoot) : (warningsForRoot = {\n                        UNSAFE_componentWillMount: [],\n                        UNSAFE_componentWillReceiveProps: [],\n                        UNSAFE_componentWillUpdate: []\n                    }, pendingUnsafeLifecycleWarnings.set(strictRoot, warningsForRoot));\n                    var unsafeLifecycles = [];\n                    (\"function\" == typeof instance.componentWillMount && !0 !== instance.componentWillMount.__suppressDeprecationWarning || \"function\" == typeof instance.UNSAFE_componentWillMount) && unsafeLifecycles.push(\"UNSAFE_componentWillMount\"), \n                    (\"function\" == typeof instance.componentWillReceiveProps && !0 !== instance.componentWillReceiveProps.__suppressDeprecationWarning || \"function\" == typeof instance.UNSAFE_componentWillReceiveProps) && unsafeLifecycles.push(\"UNSAFE_componentWillReceiveProps\"), \n                    (\"function\" == typeof instance.componentWillUpdate && !0 !== instance.componentWillUpdate.__suppressDeprecationWarning || \"function\" == typeof instance.UNSAFE_componentWillUpdate) && unsafeLifecycles.push(\"UNSAFE_componentWillUpdate\"), \n                    unsafeLifecycles.length > 0 && unsafeLifecycles.forEach(function(lifecycle) {\n                        warningsForRoot[lifecycle].push(fiber);\n                    });\n                }\n            }, ReactStrictModeWarnings.recordLegacyContextWarning = function(fiber, instance) {\n                var strictRoot = findStrictRoot(fiber);\n                if (null === strictRoot) return void warning(!1, \"Expected to find a StrictMode component in a strict mode tree. This error is likely caused by a bug in React. Please file an issue.\");\n                if (!didWarnAboutLegacyContext.has(fiber.type)) {\n                    var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);\n                    (null != fiber.type.contextTypes || null != fiber.type.childContextTypes || null !== instance && \"function\" == typeof instance.getChildContext) && (void 0 === warningsForRoot && (warningsForRoot = [], \n                    pendingLegacyContextWarning.set(strictRoot, warningsForRoot)), warningsForRoot.push(fiber));\n                }\n            }, ReactStrictModeWarnings.flushLegacyContextWarning = function() {\n                pendingLegacyContextWarning.forEach(function(fiberArray, strictRoot) {\n                    var uniqueNames = new Set();\n                    fiberArray.forEach(function(fiber) {\n                        uniqueNames.add(getComponentName(fiber) || \"Component\"), didWarnAboutLegacyContext.add(fiber.type);\n                    });\n                    var sortedNames = setToSortedString(uniqueNames), strictRootComponentStack = getStackAddendumByWorkInProgressFiber(strictRoot);\n                    warning(!1, \"Legacy context API has been detected within a strict-mode tree: %s\\n\\nPlease update the following components: %s\\n\\nLearn more about this warning here:\\nhttps://fb.me/react-strict-mode-warnings\", strictRootComponentStack, sortedNames);\n                });\n            };\n            var ReactFiberInstrumentation = {\n                debugTool: null\n            }, ReactFiberInstrumentation_1 = ReactFiberInstrumentation, UpdateState = 0, ReplaceState = 1, ForceUpdate = 2, CaptureUpdate = 3, hasForceUpdate = !1, didWarnUpdateInsideUpdate = void 0, currentlyProcessingQueue = void 0, resetCurrentlyProcessingQueue = void 0;\n            didWarnUpdateInsideUpdate = !1, currentlyProcessingQueue = null, resetCurrentlyProcessingQueue = function() {\n                currentlyProcessingQueue = null;\n            };\n            var providerCursor = createCursor(null), valueCursor = createCursor(null), changedBitsCursor = createCursor(0), rendererSigil = void 0;\n            rendererSigil = {};\n            var NO_CONTEXT = {}, contextStackCursor$1 = createCursor(NO_CONTEXT), contextFiberStackCursor = createCursor(NO_CONTEXT), rootInstanceStackCursor = createCursor(NO_CONTEXT), commitTime = 0, fiberStack$1 = void 0;\n            fiberStack$1 = [];\n            var timerPausedAt = 0, totalElapsedPauseTime = 0, baseStartTime = -1, fakeInternalInstance = {}, isArray = Array.isArray, didWarnAboutStateAssignmentForComponent = void 0, didWarnAboutUninitializedState = void 0, didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = void 0, didWarnAboutLegacyLifecyclesAndDerivedState = void 0, didWarnAboutUndefinedDerivedState = void 0, warnOnUndefinedDerivedState = void 0, warnOnInvalidCallback$1 = void 0;\n            didWarnAboutStateAssignmentForComponent = new Set(), didWarnAboutUninitializedState = new Set(), \n            didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set(), didWarnAboutLegacyLifecyclesAndDerivedState = new Set(), \n            didWarnAboutUndefinedDerivedState = new Set();\n            var didWarnOnInvalidCallback = new Set();\n            warnOnInvalidCallback$1 = function(callback, callerName) {\n                if (null !== callback && \"function\" != typeof callback) {\n                    var key = callerName + \"_\" + callback;\n                    didWarnOnInvalidCallback.has(key) || (didWarnOnInvalidCallback.add(key), warning(!1, \"%s(...): Expected the last optional ` + (\"`\" + `callback`)) + (\"`\" + (` argument to be a function. Instead received: %s.\", callerName, callback));\n                }\n            }, warnOnUndefinedDerivedState = function(workInProgress, partialState) {\n                if (void 0 === partialState) {\n                    var componentName = getComponentName(workInProgress) || \"Component\";\n                    didWarnAboutUndefinedDerivedState.has(componentName) || (didWarnAboutUndefinedDerivedState.add(componentName), \n                    warning(!1, \"%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. You have returned undefined.\", componentName));\n                }\n            }, Object.defineProperty(fakeInternalInstance, \"_processChildContext\", {\n                enumerable: !1,\n                value: function() {\n                    invariant(!1, \"_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).\");\n                }\n            }), Object.freeze(fakeInternalInstance);\n            var classComponentUpdater = {\n                isMounted: isMounted,\n                enqueueSetState: function(inst, payload, callback) {\n                    var fiber = get(inst), currentTime = recalculateCurrentTime(), expirationTime = computeExpirationForFiber(currentTime, fiber), update = createUpdate(expirationTime);\n                    update.payload = payload, void 0 !== callback && null !== callback && (warnOnInvalidCallback$1(callback, \"setState\"), \n                    update.callback = callback), enqueueUpdate(fiber, update, expirationTime), scheduleWork$1(fiber, expirationTime);\n                },\n                enqueueReplaceState: function(inst, payload, callback) {\n                    var fiber = get(inst), currentTime = recalculateCurrentTime(), expirationTime = computeExpirationForFiber(currentTime, fiber), update = createUpdate(expirationTime);\n                    update.tag = ReplaceState, update.payload = payload, void 0 !== callback && null !== callback && (warnOnInvalidCallback$1(callback, \"replaceState\"), \n                    update.callback = callback), enqueueUpdate(fiber, update, expirationTime), scheduleWork$1(fiber, expirationTime);\n                },\n                enqueueForceUpdate: function(inst, callback) {\n                    var fiber = get(inst), currentTime = recalculateCurrentTime(), expirationTime = computeExpirationForFiber(currentTime, fiber), update = createUpdate(expirationTime);\n                    update.tag = ForceUpdate, void 0 !== callback && null !== callback && (warnOnInvalidCallback$1(callback, \"forceUpdate\"), \n                    update.callback = callback), enqueueUpdate(fiber, update, expirationTime), scheduleWork$1(fiber, expirationTime);\n                }\n            }, getCurrentFiberStackAddendum$7 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnAboutMaps = void 0, didWarnAboutStringRefInStrictMode = void 0, ownerHasKeyUseWarning = void 0, ownerHasFunctionTypeWarning = void 0, warnForMissingKey = function(child) {};\n            didWarnAboutMaps = !1, didWarnAboutStringRefInStrictMode = {}, ownerHasKeyUseWarning = {}, \n            ownerHasFunctionTypeWarning = {}, warnForMissingKey = function(child) {\n                if (null !== child && \"object\" == typeof child && child._store && !child._store.validated && null == child.key) {\n                    \"object\" != typeof child._store && invariant(!1, \"React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.\"), \n                    child._store.validated = !0;\n                    var currentComponentErrorInfo = 'Each child in an array or iterator should have a unique \"key\" prop. See https://fb.me/react-warning-keys for more information.' + (getCurrentFiberStackAddendum$7() || \"\");\n                    ownerHasKeyUseWarning[currentComponentErrorInfo] || (ownerHasKeyUseWarning[currentComponentErrorInfo] = !0, \n                    warning(!1, 'Each child in an array or iterator should have a unique \"key\" prop. See https://fb.me/react-warning-keys for more information.%s', getCurrentFiberStackAddendum$7()));\n                }\n            };\n            var isArray$1 = Array.isArray, reconcileChildFibers = ChildReconciler(!0), mountChildFibers = ChildReconciler(!1), hydrationParentFiber = null, nextHydratableInstance = null, isHydrating = !1, getCurrentFiberStackAddendum$6 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum, didWarnAboutBadClass = void 0, didWarnAboutGetDerivedStateOnFunctionalComponent = void 0, didWarnAboutStatelessRefs = void 0;\n            didWarnAboutBadClass = {}, didWarnAboutGetDerivedStateOnFunctionalComponent = {}, \n            didWarnAboutStatelessRefs = {};\n            var updateHostContainer = void 0, updateHostComponent$1 = void 0, updateHostText$1 = void 0;\n            if (supportsMutation) updateHostContainer = function(workInProgress) {}, updateHostComponent$1 = function(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance, currentHostContext) {\n                workInProgress.updateQueue = updatePayload, updatePayload && markUpdate(workInProgress);\n            }, updateHostText$1 = function(current, workInProgress, oldText, newText) {\n                oldText !== newText && markUpdate(workInProgress);\n            }; else if (supportsPersistence) {\n                var appendAllChildrenToContainer = function(containerChildSet, workInProgress) {\n                    for (var node = workInProgress.child; null !== node; ) {\n                        if (node.tag === HostComponent || node.tag === HostText) appendChildToContainerChildSet(containerChildSet, node.stateNode); else if (node.tag === HostPortal) ; else if (null !== node.child) {\n                            node.child.return = node, node = node.child;\n                            continue;\n                        }\n                        if (node === workInProgress) return;\n                        for (;null === node.sibling; ) {\n                            if (null === node.return || node.return === workInProgress) return;\n                            node = node.return;\n                        }\n                        node.sibling.return = node.return, node = node.sibling;\n                    }\n                };\n                updateHostContainer = function(workInProgress) {\n                    var portalOrRoot = workInProgress.stateNode;\n                    if (null === workInProgress.firstEffect) ; else {\n                        var container = portalOrRoot.containerInfo, newChildSet = createContainerChildSet(container);\n                        appendAllChildrenToContainer(newChildSet, workInProgress), portalOrRoot.pendingChildren = newChildSet, \n                        markUpdate(workInProgress), finalizeContainerChildren(container, newChildSet);\n                    }\n                }, updateHostComponent$1 = function(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance, currentHostContext) {\n                    var childrenUnchanged = null === workInProgress.firstEffect, currentInstance = current.stateNode;\n                    if (childrenUnchanged && null === updatePayload) workInProgress.stateNode = currentInstance; else {\n                        var recyclableInstance = workInProgress.stateNode, newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);\n                        finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance, currentHostContext) && markUpdate(workInProgress), \n                        workInProgress.stateNode = newInstance, childrenUnchanged ? markUpdate(workInProgress) : appendAllChildren(newInstance, workInProgress);\n                    }\n                }, updateHostText$1 = function(current, workInProgress, oldText, newText) {\n                    if (oldText !== newText) {\n                        var rootContainerInstance = getRootHostContainer(), currentHostContext = getHostContext();\n                        workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress), \n                        markUpdate(workInProgress);\n                    }\n                };\n            } else updateHostContainer = function(workInProgress) {}, updateHostComponent$1 = function(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance, currentHostContext) {}, \n            updateHostText$1 = function(current, workInProgress, oldText, newText) {};\n            var invokeGuardedCallback$3 = ReactErrorUtils.invokeGuardedCallback, hasCaughtError$1 = ReactErrorUtils.hasCaughtError, clearCaughtError$1 = ReactErrorUtils.clearCaughtError, didWarnAboutUndefinedSnapshotBeforeUpdate = null;\n            didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();\n            var callComponentWillUnmountWithTimer = function(current, instance) {\n                startPhaseTimer(current, \"componentWillUnmount\"), instance.props = current.memoizedProps, \n                instance.state = current.memoizedState, instance.componentWillUnmount(), stopPhaseTimer();\n            }, invokeGuardedCallback$2 = ReactErrorUtils.invokeGuardedCallback, hasCaughtError = ReactErrorUtils.hasCaughtError, clearCaughtError = ReactErrorUtils.clearCaughtError, didWarnAboutStateTransition = void 0, didWarnSetStateChildContext = void 0, warnAboutUpdateOnUnmounted = void 0, warnAboutInvalidUpdates = void 0;\n            didWarnAboutStateTransition = !1, didWarnSetStateChildContext = !1;\n            var didWarnStateUpdateForUnmountedComponent = {};\n            warnAboutUpdateOnUnmounted = function(fiber) {\n                var componentName = getComponentName(fiber) || \"ReactClass\";\n                didWarnStateUpdateForUnmountedComponent[componentName] || (warning(!1, \"Can't call setState (or forceUpdate) on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.%s\", getStackAddendumByWorkInProgressFiber(fiber)), \n                didWarnStateUpdateForUnmountedComponent[componentName] = !0);\n            }, warnAboutInvalidUpdates = function(instance) {\n                switch (ReactDebugCurrentFiber.phase) {\n                  case \"getChildContext\":\n                    if (didWarnSetStateChildContext) return;\n                    warning(!1, \"setState(...): Cannot call setState() inside getChildContext()\"), didWarnSetStateChildContext = !0;\n                    break;\n\n                  case \"render\":\n                    if (didWarnAboutStateTransition) return;\n                    warning(!1, \"Cannot update during an existing state transition (such as within ` + \"`\")))) + (((`render` + (\"`\" + ` or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to `)) + (\"`\" + (`componentWillMount` + \"`\"))) + ((`.\"), \n                    didWarnAboutStateTransition = !0;\n                }\n            };\n            var originalStartTimeMs = now(), mostRecentCurrentTime = msToExpirationTime(0), mostRecentCurrentTimeMs = originalStartTimeMs, lastUniqueAsyncExpiration = 0, expirationContext = NoWork, isWorking = !1, nextUnitOfWork = null, nextRoot = null, nextRenderExpirationTime = NoWork, nextLatestTimeoutMs = -1, nextRenderIsExpired = !1, nextEffect = null, isCommitting$1 = !1, isRootReadyForCommit = !1, legacyErrorBoundariesThatAlreadyFailed = null, interruptedBy = null, stashedWorkInProgressProperties = void 0, replayUnitOfWork = void 0, isReplayingFailedUnitOfWork = void 0, originalReplayError = void 0, rethrowOriginalError = void 0;\n            replayFailedUnitOfWorkWithInvokeGuardedCallback && (stashedWorkInProgressProperties = null, \n            isReplayingFailedUnitOfWork = !1, originalReplayError = null, replayUnitOfWork = function(failedUnitOfWork, thrownValue, isAsync) {\n                if (null === thrownValue || \"object\" != typeof thrownValue || \"function\" != typeof thrownValue.then) {\n                    if (null === stashedWorkInProgressProperties) return void warning(!1, \"Could not replay rendering after an error. This is likely a bug in React. Please file an issue.\");\n                    switch (assignFiberPropertiesInDEV(failedUnitOfWork, stashedWorkInProgressProperties), \n                    failedUnitOfWork.tag) {\n                      case HostRoot:\n                        popHostContainer(failedUnitOfWork), popTopLevelContextObject(failedUnitOfWork);\n                        break;\n\n                      case HostComponent:\n                        popHostContext(failedUnitOfWork);\n                        break;\n\n                      case ClassComponent:\n                        popContextProvider(failedUnitOfWork);\n                        break;\n\n                      case HostPortal:\n                        popHostContainer(failedUnitOfWork);\n                        break;\n\n                      case ContextProvider:\n                        popProvider(failedUnitOfWork);\n                    }\n                    isReplayingFailedUnitOfWork = !0, originalReplayError = thrownValue, invokeGuardedCallback$2(null, workLoop, null, isAsync), \n                    isReplayingFailedUnitOfWork = !1, originalReplayError = null, hasCaughtError() ? (clearCaughtError(), \n                    enableProfilerTimer && stopBaseRenderTimerIfRunning()) : nextUnitOfWork = failedUnitOfWork;\n                }\n            }, rethrowOriginalError = function() {\n                throw originalReplayError;\n            });\n            var firstScheduledRoot = null, lastScheduledRoot = null, callbackExpirationTime = NoWork, callbackID = -1, isRendering = !1, nextFlushedRoot = null, nextFlushedExpirationTime = NoWork, lowestPendingInteractiveExpirationTime = NoWork, deadlineDidExpire = !1, hasUnhandledError = !1, unhandledError = null, deadline = null, isBatchingUpdates = !1, isUnbatchingUpdates = !1, isBatchingInteractiveUpdates = !1, completedBatches = null, NESTED_UPDATE_LIMIT = 1e3, nestedUpdateCount = 0, timeHeuristicForUnitOfWork = 1, didWarnAboutNestedUpdates = void 0;\n            didWarnAboutNestedUpdates = !1;\n            var DOMRenderer = Object.freeze({\n                updateContainerAtExpirationTime: updateContainerAtExpirationTime,\n                createContainer: createContainer,\n                updateContainer: updateContainer,\n                flushRoot: flushRoot,\n                requestWork: requestWork,\n                computeUniqueAsyncExpiration: computeUniqueAsyncExpiration,\n                batchedUpdates: batchedUpdates$1,\n                unbatchedUpdates: unbatchedUpdates,\n                deferredUpdates: deferredUpdates,\n                syncUpdates: syncUpdates,\n                interactiveUpdates: interactiveUpdates$1,\n                flushInteractiveUpdates: flushInteractiveUpdates$1,\n                flushControlled: flushControlled,\n                flushSync: flushSync,\n                getPublicRootInstance: getPublicRootInstance,\n                findHostInstance: findHostInstance,\n                findHostInstanceWithNoPortals: findHostInstanceWithNoPortals,\n                injectIntoDevTools: injectIntoDevTools\n            }), topLevelUpdateWarnings = void 0, warnOnInvalidCallback = void 0, didWarnAboutUnstableCreatePortal = !1;\n            \"function\" == typeof Map && null != Map.prototype && \"function\" == typeof Map.prototype.forEach && \"function\" == typeof Set && null != Set.prototype && \"function\" == typeof Set.prototype.clear && \"function\" == typeof Set.prototype.forEach || warning(!1, \"React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"), \n            topLevelUpdateWarnings = function(container) {\n                if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {\n                    var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current);\n                    hostInstance && hostInstance.parentNode !== container && warning(!1, \"render(...): It looks like the React-rendered content of this container was removed without using React. This is not supported and will cause errors. Instead, call ReactDOM.unmountComponentAtNode to empty a container.\");\n                }\n                var isRootRenderedBySomeReact = !!container._reactRootContainer, rootEl = getReactRootElementInContainer(container);\n                !(!rootEl || !getInstanceFromNode$1(rootEl)) && !isRootRenderedBySomeReact && warning(!1, \"render(...): Replacing React-rendered children with a new root component. If you intended to update the children of this node, you should instead have the existing children update their state and render the new components instead of calling ReactDOM.render.\"), \n                container.nodeType === ELEMENT_NODE && container.tagName && \"BODY\" === container.tagName.toUpperCase() && warning(!1, \"render(): Rendering components directly into document.body is discouraged, since its children are often manipulated by third-party scripts and browser extensions. This may lead to subtle reconciliation issues. Try rendering into a container element created for your app.\");\n            }, warnOnInvalidCallback = function(callback, callerName) {\n                null !== callback && \"function\" != typeof callback && warning(!1, \"%s(...): Expected the last optional ` + (\"`\" + `callback`)) + (\"`\" + (` argument to be a function. Instead received: %s.\", callerName, callback);\n            }, injection$2.injectFiberControlledHostComponent(ReactDOMFiberComponent), ReactBatch.prototype.render = function(children) {\n                this._defer || invariant(!1, \"batch.render: Cannot render a batch that already committed.\"), \n                this._hasChildren = !0, this._children = children;\n                var internalRoot = this._root._internalRoot, expirationTime = this._expirationTime, work = new ReactWork();\n                return updateContainerAtExpirationTime(children, internalRoot, null, expirationTime, work._onCommit), \n                work;\n            }, ReactBatch.prototype.then = function(onComplete) {\n                if (this._didComplete) return void onComplete();\n                var callbacks = this._callbacks;\n                null === callbacks && (callbacks = this._callbacks = []), callbacks.push(onComplete);\n            }, ReactBatch.prototype.commit = function() {\n                var internalRoot = this._root._internalRoot, firstBatch = internalRoot.firstBatch;\n                if (this._defer && null !== firstBatch || invariant(!1, \"batch.commit: Cannot commit a batch multiple times.\"), \n                !this._hasChildren) return this._next = null, void (this._defer = !1);\n                var expirationTime = this._expirationTime;\n                if (firstBatch !== this) {\n                    this._hasChildren && (expirationTime = this._expirationTime = firstBatch._expirationTime, \n                    this.render(this._children));\n                    for (var previous = null, batch = firstBatch; batch !== this; ) previous = batch, \n                    batch = batch._next;\n                    null === previous && invariant(!1, \"batch.commit: Cannot commit a batch multiple times.\"), \n                    previous._next = batch._next, this._next = firstBatch, firstBatch = internalRoot.firstBatch = this;\n                }\n                this._defer = !1, flushRoot(internalRoot, expirationTime);\n                var next = this._next;\n                this._next = null, null !== (firstBatch = internalRoot.firstBatch = next) && firstBatch._hasChildren && firstBatch.render(firstBatch._children);\n            }, ReactBatch.prototype._onComplete = function() {\n                if (!this._didComplete) {\n                    this._didComplete = !0;\n                    var callbacks = this._callbacks;\n                    if (null !== callbacks) for (var i = 0; i < callbacks.length; i++) {\n                        var _callback = callbacks[i];\n                        _callback();\n                    }\n                }\n            }, ReactWork.prototype.then = function(onCommit) {\n                if (this._didCommit) return void onCommit();\n                var callbacks = this._callbacks;\n                null === callbacks && (callbacks = this._callbacks = []), callbacks.push(onCommit);\n            }, ReactWork.prototype._onCommit = function() {\n                if (!this._didCommit) {\n                    this._didCommit = !0;\n                    var callbacks = this._callbacks;\n                    if (null !== callbacks) for (var i = 0; i < callbacks.length; i++) {\n                        var _callback2 = callbacks[i];\n                        \"function\" != typeof _callback2 && invariant(!1, \"Invalid argument passed as callback. Expected a function. Instead received: %s\", _callback2), \n                        _callback2();\n                    }\n                }\n            }, ReactRoot.prototype.render = function(children, callback) {\n                var root = this._internalRoot, work = new ReactWork();\n                return callback = void 0 === callback ? null : callback, warnOnInvalidCallback(callback, \"render\"), \n                null !== callback && work.then(callback), updateContainer(children, root, null, work._onCommit), \n                work;\n            }, ReactRoot.prototype.unmount = function(callback) {\n                var root = this._internalRoot, work = new ReactWork();\n                return callback = void 0 === callback ? null : callback, warnOnInvalidCallback(callback, \"render\"), \n                null !== callback && work.then(callback), updateContainer(null, root, null, work._onCommit), \n                work;\n            }, ReactRoot.prototype.legacy_renderSubtreeIntoContainer = function(parentComponent, children, callback) {\n                var root = this._internalRoot, work = new ReactWork();\n                return callback = void 0 === callback ? null : callback, warnOnInvalidCallback(callback, \"render\"), \n                null !== callback && work.then(callback), updateContainer(children, root, parentComponent, work._onCommit), \n                work;\n            }, ReactRoot.prototype.createBatch = function() {\n                var batch = new ReactBatch(this), expirationTime = batch._expirationTime, internalRoot = this._internalRoot, firstBatch = internalRoot.firstBatch;\n                if (null === firstBatch) internalRoot.firstBatch = batch, batch._next = null; else {\n                    for (var insertAfter = null, insertBefore = firstBatch; null !== insertBefore && insertBefore._expirationTime <= expirationTime; ) insertAfter = insertBefore, \n                    insertBefore = insertBefore._next;\n                    batch._next = insertBefore, null !== insertAfter && (insertAfter._next = batch);\n                }\n                return batch;\n            }, injection$3.injectRenderer(DOMRenderer);\n            var warnedAboutHydrateAPI = !1, ReactDOM = {\n                createPortal: createPortal,\n                findDOMNode: function(componentOrElement) {\n                    var owner = ReactCurrentOwner.current;\n                    if (null !== owner && null !== owner.stateNode) {\n                        owner.stateNode._warnedAboutRefsInRender || warning(!1, \"%s is accessing findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.\", getComponentName(owner) || \"A component\"), \n                        owner.stateNode._warnedAboutRefsInRender = !0;\n                    }\n                    return null == componentOrElement ? null : componentOrElement.nodeType === ELEMENT_NODE ? componentOrElement : findHostInstance(componentOrElement);\n                },\n                hydrate: function(element, container, callback) {\n                    return legacyRenderSubtreeIntoContainer(null, element, container, !0, callback);\n                },\n                render: function(element, container, callback) {\n                    return legacyRenderSubtreeIntoContainer(null, element, container, !1, callback);\n                },\n                unstable_renderSubtreeIntoContainer: function(parentComponent, element, containerNode, callback) {\n                    return null != parentComponent && has(parentComponent) || invariant(!1, \"parentComponent must be a valid React Component\"), \n                    legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, !1, callback);\n                },\n                unmountComponentAtNode: function(container) {\n                    if (isValidContainer(container) || invariant(!1, \"unmountComponentAtNode(...): Target container is not a DOM element.\"), \n                    container._reactRootContainer) {\n                        var rootEl = getReactRootElementInContainer(container);\n                        return rootEl && !getInstanceFromNode$1(rootEl) && warning(!1, \"unmountComponentAtNode(): The node you're attempting to unmount was rendered by another copy of React.\"), \n                        unbatchedUpdates(function() {\n                            legacyRenderSubtreeIntoContainer(null, null, container, !1, function() {\n                                container._reactRootContainer = null;\n                            });\n                        }), !0;\n                    }\n                    var _rootEl = getReactRootElementInContainer(container), hasNonRootReactChild = !(!_rootEl || !getInstanceFromNode$1(_rootEl)), isContainerReactRoot = 1 === container.nodeType && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;\n                    return hasNonRootReactChild && warning(!1, \"unmountComponentAtNode(): The node you're attempting to unmount was rendered by React and is not a top-level container. %s\", isContainerReactRoot ? \"You may have accidentally passed in a React root node instead of its container.\" : \"Instead, have the parent component update its state and rerender in order to remove this component.\"), \n                    !1;\n                },\n                unstable_createPortal: function() {\n                    return didWarnAboutUnstableCreatePortal || (didWarnAboutUnstableCreatePortal = !0, \n                    lowPriorityWarning$1(!1, 'The ReactDOM.unstable_createPortal() alias has been deprecated, and will be removed in React 17+. Update your code to use ReactDOM.createPortal() instead. It has the exact same API, but without the \"unstable_\" prefix.')), \n                    createPortal.apply(void 0, arguments);\n                },\n                unstable_batchedUpdates: batchedUpdates$1,\n                unstable_deferredUpdates: deferredUpdates,\n                flushSync: flushSync,\n                unstable_flushControlled: flushControlled,\n                __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n                    EventPluginHub: EventPluginHub,\n                    EventPluginRegistry: EventPluginRegistry,\n                    EventPropagators: EventPropagators,\n                    ReactControlledComponent: ReactControlledComponent,\n                    ReactDOMComponentTree: ReactDOMComponentTree,\n                    ReactDOMEventListener: ReactDOMEventListener\n                }\n            };\n            if (ReactDOM.unstable_createRoot = function(container, options) {\n                return new ReactRoot(container, !0, null != options && !0 === options.hydrate);\n            }, !injectIntoDevTools({\n                findFiberByHostInstance: getClosestInstanceFromNode,\n                bundleType: 1,\n                version: \"16.4.0\",\n                rendererPackageName: \"react-dom\"\n            }) && ExecutionEnvironment.canUseDOM && window.top === window.self && (navigator.userAgent.indexOf(\"Chrome\") > -1 && -1 === navigator.userAgent.indexOf(\"Edge\") || navigator.userAgent.indexOf(\"Firefox\") > -1)) {\n                var protocol = window.location.protocol;\n                /^(https?|file):$/.test(protocol) && console.info(\"%cDownload the React DevTools for a better development experience: https://fb.me/react-devtools\" + (\"file:\" === protocol ? \"\\nYou might need to use a local HTTP server (instead of file://): https://fb.me/react-devtools-faq\" : \"\"), \"font-weight:bold\");\n            }\n            var ReactDOM$2 = Object.freeze({\n                default: ReactDOM\n            }), ReactDOM$3 = ReactDOM$2 && ReactDOM || ReactDOM$2, reactDom = ReactDOM$3.default ? ReactDOM$3.default : ReactDOM$3;\n            module.exports = reactDom;\n        }();\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function hyphenateStyleName(string) {\n        return hyphenate(string).replace(msPattern, \"-ms-\");\n    }\n    var hyphenate = __webpack_require__(383), msPattern = /^ms-/;\n    module.exports = hyphenateStyleName;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function hyphenate(string) {\n        return string.replace(_uppercasePattern, \"-$1\").toLowerCase();\n    }\n    var _uppercasePattern = /([A-Z])/g;\n    module.exports = hyphenate;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function camelizeStyleName(string) {\n        return camelize(string.replace(msPattern, \"ms-\"));\n    }\n    var camelize = __webpack_require__(385), msPattern = /^-ms-/;\n    module.exports = camelizeStyleName;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function camelize(string) {\n        return string.replace(_hyphenPattern, function(_, character) {\n            return character.toUpperCase();\n        });\n    }\n    var _hyphenPattern = /-(.)/g;\n    module.exports = camelize;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _brcast = __webpack_require__(420), _brcast2 = _interopRequireDefault(_brcast), _themeListener = __webpack_require__(160), _themeListener2 = _interopRequireDefault(_themeListener), _exactProp = __webpack_require__(236), _exactProp2 = _interopRequireDefault(_exactProp), MuiThemeProvider = function(_React$Component) {\n            function MuiThemeProvider(props, context) {\n                (0, _classCallCheck3.default)(this, MuiThemeProvider);\n                var _this = (0, _possibleConstructorReturn3.default)(this, (MuiThemeProvider.__proto__ || (0, \n                _getPrototypeOf2.default)(MuiThemeProvider)).call(this, props, context));\n                return _this.broadcast = (0, _brcast2.default)(), _this.unsubscribeId = null, _this.outerTheme = null, \n                _this.outerTheme = _themeListener2.default.initial(context), _this.broadcast.setState(_this.mergeOuterLocalTheme(_this.props.theme)), \n                _this;\n            }\n            return (0, _inherits3.default)(MuiThemeProvider, _React$Component), (0, _createClass3.default)(MuiThemeProvider, [ {\n                key: \"getChildContext\",\n                value: function() {\n                    var _ref, _props = this.props, sheetsManager = _props.sheetsManager, disableStylesGeneration = _props.disableStylesGeneration, muiThemeProviderOptions = this.context.muiThemeProviderOptions || {};\n                    return void 0 !== sheetsManager && (muiThemeProviderOptions.sheetsManager = sheetsManager), \n                    void 0 !== disableStylesGeneration && (muiThemeProviderOptions.disableStylesGeneration = disableStylesGeneration), \n                    _ref = {}, (0, _defineProperty3.default)(_ref, _themeListener.CHANNEL, this.broadcast), \n                    (0, _defineProperty3.default)(_ref, \"muiThemeProviderOptions\", muiThemeProviderOptions), \n                    _ref;\n                }\n            }, {\n                key: \"componentDidMount\",\n                value: function() {\n                    var _this2 = this;\n                    this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(outerTheme) {\n                        _this2.outerTheme = outerTheme, _this2.broadcast.setState(_this2.mergeOuterLocalTheme(_this2.props.theme));\n                    });\n                }\n            }, {\n                key: \"componentWillReceiveProps\",\n                value: function(nextProps) {\n                    this.props.theme !== nextProps.theme && this.broadcast.setState(this.mergeOuterLocalTheme(nextProps.theme));\n                }\n            }, {\n                key: \"componentWillUnmount\",\n                value: function() {\n                    null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId);\n                }\n            }, {\n                key: \"mergeOuterLocalTheme\",\n                value: function(localTheme) {\n                    return \"function\" == typeof localTheme ? (\"production\" !== process.env.NODE_ENV && (0, \n                    _warning2.default)(this.outerTheme, [ \"Material-UI: you are providing a theme function property to the MuiThemeProvider component:\", \"<MuiThemeProvider theme={outerTheme => outerTheme} />\", \"\", \"However, no outer theme is present.\", \"Make sure a theme is already injected higher in the React tree or provide a theme object.\" ].join(\"\\n\")), \n                    localTheme(this.outerTheme)) : this.outerTheme ? (0, _extends3.default)({}, this.outerTheme, localTheme) : localTheme;\n                }\n            }, {\n                key: \"render\",\n                value: function() {\n                    return this.props.children;\n                }\n            } ]), MuiThemeProvider;\n        }(_react2.default.Component);\n        MuiThemeProvider.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node.isRequired,\n            disableStylesGeneration: _propTypes2.default.bool,\n            sheetsManager: _propTypes2.default.object,\n            theme: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.func ]).isRequired\n        } : {}, MuiThemeProvider.propTypes = \"production\" !== process.env.NODE_ENV ? (0, \n        _exactProp2.default)(MuiThemeProvider.propTypes, \"MuiThemeProvider\") : {}, MuiThemeProvider.childContextTypes = (0, \n        _extends3.default)({}, _themeListener2.default.contextTypes, {\n            muiThemeProviderOptions: _propTypes2.default.object\n        }), MuiThemeProvider.contextTypes = (0, _extends3.default)({}, _themeListener2.default.contextTypes, {\n            muiThemeProviderOptions: _propTypes2.default.object\n        }), exports.default = MuiThemeProvider;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(388), module.exports = __webpack_require__(17).Object.assign;\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19);\n    $export($export.S + $export.F, \"Object\", {\n        assign: __webpack_require__(389)\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var getKeys = __webpack_require__(76), gOPS = __webpack_require__(153), pIE = __webpack_require__(104), toObject = __webpack_require__(65), IObject = __webpack_require__(146), $assign = Object.assign;\n    module.exports = !$assign || __webpack_require__(53)(function() {\n        var A = {}, B = {}, S = Symbol(), K = \"abcdefghijklmnopqrst\";\n        return A[S] = 7, K.split(\"\").forEach(function(k) {\n            B[k] = k;\n        }), 7 != $assign({}, A)[S] || Object.keys($assign({}, B)).join(\"\") != K;\n    }) ? function(target, source) {\n        for (var T = toObject(target), aLen = arguments.length, index = 1, getSymbols = gOPS.f, isEnum = pIE.f; aLen > index; ) for (var key, S = IObject(arguments[index++]), keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S), length = keys.length, j = 0; length > j; ) isEnum.call(S, key = keys[j++]) && (T[key] = S[key]);\n        return T;\n    } : $assign;\n}, function(module, exports, __webpack_require__) {\n    var toIObject = __webpack_require__(64), toLength = __webpack_require__(101), toAbsoluteIndex = __webpack_require__(391);\n    module.exports = function(IS_INCLUDES) {\n        return function($this, el, fromIndex) {\n            var value, O = toIObject($this), length = toLength(O.length), index = toAbsoluteIndex(fromIndex, length);\n            if (IS_INCLUDES && el != el) {\n                for (;length > index; ) if ((value = O[index++]) != value) return !0;\n            } else for (;length > index; index++) if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n            return !IS_INCLUDES && -1;\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    var toInteger = __webpack_require__(149), max = Math.max, min = Math.min;\n    module.exports = function(index, length) {\n        return index = toInteger(index), index < 0 ? max(index + length, 0) : min(index, length);\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(393);\n    var $Object = __webpack_require__(17).Object;\n    module.exports = function(it, key, desc) {\n        return $Object.defineProperty(it, key, desc);\n    };\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19);\n    $export($export.S + $export.F * !__webpack_require__(25), \"Object\", {\n        defineProperty: __webpack_require__(22).f\n    });\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(395), module.exports = __webpack_require__(17).Object.getPrototypeOf;\n}, function(module, exports, __webpack_require__) {\n    var toObject = __webpack_require__(65), $getPrototypeOf = __webpack_require__(227);\n    __webpack_require__(228)(\"getPrototypeOf\", function() {\n        return function(it) {\n            return $getPrototypeOf(toObject(it));\n        };\n    });\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(397),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(155), __webpack_require__(230), module.exports = __webpack_require__(157).f(\"iterator\");\n}, function(module, exports, __webpack_require__) {\n    var toInteger = __webpack_require__(149), defined = __webpack_require__(148);\n    module.exports = function(TO_STRING) {\n        return function(that, pos) {\n            var a, b, s = String(defined(that)), i = toInteger(pos), l = s.length;\n            return i < 0 || i >= l ? TO_STRING ? \"\" : void 0 : (a = s.charCodeAt(i), a < 55296 || a > 56319 || i + 1 === l || (b = s.charCodeAt(i + 1)) < 56320 || b > 57343 ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : b - 56320 + (a - 55296 << 10) + 65536);\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var create = __webpack_require__(106), descriptor = __webpack_require__(75), setToStringTag = __webpack_require__(107), IteratorPrototype = {};\n    __webpack_require__(39)(IteratorPrototype, __webpack_require__(21)(\"iterator\"), function() {\n        return this;\n    }), module.exports = function(Constructor, NAME, next) {\n        Constructor.prototype = create(IteratorPrototype, {\n            next: descriptor(1, next)\n        }), setToStringTag(Constructor, NAME + \" Iterator\");\n    };\n}, function(module, exports, __webpack_require__) {\n    var dP = __webpack_require__(22), anObject = __webpack_require__(52), getKeys = __webpack_require__(76);\n    module.exports = __webpack_require__(25) ? Object.defineProperties : function(O, Properties) {\n        anObject(O);\n        for (var P, keys = getKeys(Properties), length = keys.length, i = 0; length > i; ) dP.f(O, P = keys[i++], Properties[P]);\n        return O;\n    };\n}, function(module, exports, __webpack_require__) {\n    var document = __webpack_require__(24).document;\n    module.exports = document && document.documentElement;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var addToUnscopables = __webpack_require__(403), step = __webpack_require__(231), Iterators = __webpack_require__(77), toIObject = __webpack_require__(64);\n    module.exports = __webpack_require__(156)(Array, \"Array\", function(iterated, kind) {\n        this._t = toIObject(iterated), this._i = 0, this._k = kind;\n    }, function() {\n        var O = this._t, kind = this._k, index = this._i++;\n        return !O || index >= O.length ? (this._t = void 0, step(1)) : \"keys\" == kind ? step(0, index) : \"values\" == kind ? step(0, O[index]) : step(0, [ index, O[index] ]);\n    }, \"values\"), Iterators.Arguments = Iterators.Array, addToUnscopables(\"keys\"), addToUnscopables(\"values\"), \n    addToUnscopables(\"entries\");\n}, function(module, exports) {\n    module.exports = function() {};\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(405),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(406), __webpack_require__(235), __webpack_require__(409), __webpack_require__(410), \n    module.exports = __webpack_require__(17).Symbol;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var global = __webpack_require__(24), has = __webpack_require__(54), DESCRIPTORS = __webpack_require__(25), $export = __webpack_require__(19), redefine = __webpack_require__(229), META = __webpack_require__(158).KEY, $fails = __webpack_require__(53), shared = __webpack_require__(151), setToStringTag = __webpack_require__(107), uid = __webpack_require__(103), wks = __webpack_require__(21), wksExt = __webpack_require__(157), wksDefine = __webpack_require__(159), enumKeys = __webpack_require__(407), isArray = __webpack_require__(232), anObject = __webpack_require__(52), isObject = __webpack_require__(35), toIObject = __webpack_require__(64), toPrimitive = __webpack_require__(145), createDesc = __webpack_require__(75), _create = __webpack_require__(106), gOPNExt = __webpack_require__(408), $GOPD = __webpack_require__(234), $DP = __webpack_require__(22), $keys = __webpack_require__(76), gOPD = $GOPD.f, dP = $DP.f, gOPN = gOPNExt.f, $Symbol = global.Symbol, $JSON = global.JSON, _stringify = $JSON && $JSON.stringify, HIDDEN = wks(\"_hidden\"), TO_PRIMITIVE = wks(\"toPrimitive\"), isEnum = {}.propertyIsEnumerable, SymbolRegistry = shared(\"symbol-registry\"), AllSymbols = shared(\"symbols\"), OPSymbols = shared(\"op-symbols\"), ObjectProto = Object.prototype, USE_NATIVE = \"function\" == typeof $Symbol, QObject = global.QObject, setter = !QObject || !QObject.prototype || !QObject.prototype.findChild, setSymbolDesc = DESCRIPTORS && $fails(function() {\n        return 7 != _create(dP({}, \"a\", {\n            get: function() {\n                return dP(this, \"a\", {\n                    value: 7\n                }).a;\n            }\n        })).a;\n    }) ? function(it, key, D) {\n        var protoDesc = gOPD(ObjectProto, key);\n        protoDesc && delete ObjectProto[key], dP(it, key, D), protoDesc && it !== ObjectProto && dP(ObjectProto, key, protoDesc);\n    } : dP, wrap = function(tag) {\n        var sym = AllSymbols[tag] = _create($Symbol.prototype);\n        return sym._k = tag, sym;\n    }, isSymbol = USE_NATIVE && \"symbol\" == typeof $Symbol.iterator ? function(it) {\n        return \"symbol\" == typeof it;\n    } : function(it) {\n        return it instanceof $Symbol;\n    }, $defineProperty = function(it, key, D) {\n        return it === ObjectProto && $defineProperty(OPSymbols, key, D), anObject(it), key = toPrimitive(key, !0), \n        anObject(D), has(AllSymbols, key) ? (D.enumerable ? (has(it, HIDDEN) && it[HIDDEN][key] && (it[HIDDEN][key] = !1), \n        D = _create(D, {\n            enumerable: createDesc(0, !1)\n        })) : (has(it, HIDDEN) || dP(it, HIDDEN, createDesc(1, {})), it[HIDDEN][key] = !0), \n        setSymbolDesc(it, key, D)) : dP(it, key, D);\n    }, $defineProperties = function(it, P) {\n        anObject(it);\n        for (var key, keys = enumKeys(P = toIObject(P)), i = 0, l = keys.length; l > i; ) $defineProperty(it, key = keys[i++], P[key]);\n        return it;\n    }, $create = function(it, P) {\n        return void 0 === P ? _create(it) : $defineProperties(_create(it), P);\n    }, $propertyIsEnumerable = function(key) {\n        var E = isEnum.call(this, key = toPrimitive(key, !0));\n        return !(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) && (!(E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key]) || E);\n    }, $getOwnPropertyDescriptor = function(it, key) {\n        if (it = toIObject(it), key = toPrimitive(key, !0), it !== ObjectProto || !has(AllSymbols, key) || has(OPSymbols, key)) {\n            var D = gOPD(it, key);\n            return !D || !has(AllSymbols, key) || has(it, HIDDEN) && it[HIDDEN][key] || (D.enumerable = !0), \n            D;\n        }\n    }, $getOwnPropertyNames = function(it) {\n        for (var key, names = gOPN(toIObject(it)), result = [], i = 0; names.length > i; ) has(AllSymbols, key = names[i++]) || key == HIDDEN || key == META || result.push(key);\n        return result;\n    }, $getOwnPropertySymbols = function(it) {\n        for (var key, IS_OP = it === ObjectProto, names = gOPN(IS_OP ? OPSymbols : toIObject(it)), result = [], i = 0; names.length > i; ) !has(AllSymbols, key = names[i++]) || IS_OP && !has(ObjectProto, key) || result.push(AllSymbols[key]);\n        return result;\n    };\n    USE_NATIVE || ($Symbol = function() {\n        if (this instanceof $Symbol) throw TypeError(\"Symbol is not a constructor!\");\n        var tag = uid(arguments.length > 0 ? arguments[0] : void 0), $set = function(value) {\n            this === ObjectProto && $set.call(OPSymbols, value), has(this, HIDDEN) && has(this[HIDDEN], tag) && (this[HIDDEN][tag] = !1), \n            setSymbolDesc(this, tag, createDesc(1, value));\n        };\n        return DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {\n            configurable: !0,\n            set: $set\n        }), wrap(tag);\n    }, redefine($Symbol.prototype, \"toString\", function() {\n        return this._k;\n    }), $GOPD.f = $getOwnPropertyDescriptor, $DP.f = $defineProperty, __webpack_require__(233).f = gOPNExt.f = $getOwnPropertyNames, \n    __webpack_require__(104).f = $propertyIsEnumerable, __webpack_require__(153).f = $getOwnPropertySymbols, \n    DESCRIPTORS && !__webpack_require__(102) && redefine(ObjectProto, \"propertyIsEnumerable\", $propertyIsEnumerable, !0), \n    wksExt.f = function(name) {\n        return wrap(wks(name));\n    }), $export($export.G + $export.W + $export.F * !USE_NATIVE, {\n        Symbol: $Symbol\n    });\n    for (var es6Symbols = \"hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables\".split(\",\"), j = 0; es6Symbols.length > j; ) wks(es6Symbols[j++]);\n    for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k; ) wksDefine(wellKnownSymbols[k++]);\n    $export($export.S + $export.F * !USE_NATIVE, \"Symbol\", {\n        for: function(key) {\n            return has(SymbolRegistry, key += \"\") ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);\n        },\n        keyFor: function(sym) {\n            if (!isSymbol(sym)) throw TypeError(sym + \" is not a symbol!\");\n            for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n        },\n        useSetter: function() {\n            setter = !0;\n        },\n        useSimple: function() {\n            setter = !1;\n        }\n    }), $export($export.S + $export.F * !USE_NATIVE, \"Object\", {\n        create: $create,\n        defineProperty: $defineProperty,\n        defineProperties: $defineProperties,\n        getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n        getOwnPropertyNames: $getOwnPropertyNames,\n        getOwnPropertySymbols: $getOwnPropertySymbols\n    }), $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function() {\n        var S = $Symbol();\n        return \"[null]\" != _stringify([ S ]) || \"{}\" != _stringify({\n            a: S\n        }) || \"{}\" != _stringify(Object(S));\n    })), \"JSON\", {\n        stringify: function(it) {\n            for (var replacer, $replacer, args = [ it ], i = 1; arguments.length > i; ) args.push(arguments[i++]);\n            if ($replacer = replacer = args[1], (isObject(replacer) || void 0 !== it) && !isSymbol(it)) return isArray(replacer) || (replacer = function(key, value) {\n                if (\"function\" == typeof $replacer && (value = $replacer.call(this, key, value)), \n                !isSymbol(value)) return value;\n            }), args[1] = replacer, _stringify.apply($JSON, args);\n        }\n    }), $Symbol.prototype[TO_PRIMITIVE] || __webpack_require__(39)($Symbol.prototype, TO_PRIMITIVE, $Symbol.prototype.valueOf), \n    setToStringTag($Symbol, \"Symbol\"), setToStringTag(Math, \"Math\", !0), setToStringTag(global.JSON, \"JSON\", !0);\n}, function(module, exports, __webpack_require__) {\n    var getKeys = __webpack_require__(76), gOPS = __webpack_require__(153), pIE = __webpack_require__(104);\n    module.exports = function(it) {\n        var result = getKeys(it), getSymbols = gOPS.f;\n        if (getSymbols) for (var key, symbols = getSymbols(it), isEnum = pIE.f, i = 0; symbols.length > i; ) isEnum.call(it, key = symbols[i++]) && result.push(key);\n        return result;\n    };\n}, function(module, exports, __webpack_require__) {\n    var toIObject = __webpack_require__(64), gOPN = __webpack_require__(233).f, toString = {}.toString, windowNames = \"object\" == typeof window && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [], getWindowNames = function(it) {\n        try {\n            return gOPN(it);\n        } catch (e) {\n            return windowNames.slice();\n        }\n    };\n    module.exports.f = function(it) {\n        return windowNames && \"[object Window]\" == toString.call(it) ? getWindowNames(it) : gOPN(toIObject(it));\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(159)(\"asyncIterator\");\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(159)(\"observable\");\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(412),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(413), module.exports = __webpack_require__(17).Object.setPrototypeOf;\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19);\n    $export($export.S, \"Object\", {\n        setPrototypeOf: __webpack_require__(414).set\n    });\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(35), anObject = __webpack_require__(52), check = function(O, proto) {\n        if (anObject(O), !isObject(proto) && null !== proto) throw TypeError(proto + \": can't set as prototype!\");\n    };\n    module.exports = {\n        set: Object.setPrototypeOf || (\"__proto__\" in {} ? function(test, buggy, set) {\n            try {\n                set = __webpack_require__(51)(Function.call, __webpack_require__(234).f(Object.prototype, \"__proto__\").set, 2), \n                set(test, []), buggy = !(test instanceof Array);\n            } catch (e) {\n                buggy = !0;\n            }\n            return function(O, proto) {\n                return check(O, proto), buggy ? O.__proto__ = proto : set(O, proto), O;\n            };\n        }({}, !1) : void 0),\n        check: check\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(416),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(417);\n    var $Object = __webpack_require__(17).Object;\n    module.exports = function(P, D) {\n        return $Object.create(P, D);\n    };\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19);\n    $export($export.S, \"Object\", {\n        create: __webpack_require__(106)\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        var emptyFunction = __webpack_require__(50), invariant = __webpack_require__(49), warning = __webpack_require__(98), assign = __webpack_require__(74), ReactPropTypesSecret = __webpack_require__(144), checkPropTypes = __webpack_require__(143);\n        module.exports = function(isValidElement, throwOnDirectAccess) {\n            function getIteratorFn(maybeIterable) {\n                var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n                if (\"function\" == typeof iteratorFn) return iteratorFn;\n            }\n            function is(x, y) {\n                return x === y ? 0 !== x || 1 / x == 1 / y : x !== x && y !== y;\n            }\n            function PropTypeError(message) {\n                this.message = message, this.stack = \"\";\n            }\n            function createChainableTypeChecker(validate) {\n                function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n                    if (componentName = componentName || ANONYMOUS, propFullName = propFullName || propName, \n                    secret !== ReactPropTypesSecret) if (throwOnDirectAccess) invariant(!1, \"Calling PropTypes validators directly is not supported by the ` + \"`\")))))) + (((((`prop-types` + (\"`\" + ` package. Use `)) + (\"`\" + (`PropTypes.checkPropTypes()` + \"`\"))) + ((` to call them. Read more at http://fb.me/use-check-prop-types\"); else if (\"production\" !== process.env.NODE_ENV && \"undefined\" != typeof console) {\n                        var cacheKey = componentName + \":\" + propName;\n                        !manualPropTypeCallCache[cacheKey] && manualPropTypeWarningCount < 3 && (warning(!1, \"You are manually calling a React.PropTypes validation function for the ` + (\"`\" + `%s`)) + (\"`\" + (` prop on ` + \"`\")))) + (((`%s` + (\"`\" + `. This is deprecated and will throw in the standalone `)) + (\"`\" + (`prop-types` + \"`\"))) + ((` package. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.\", propFullName, componentName), \n                        manualPropTypeCallCache[cacheKey] = !0, manualPropTypeWarningCount++);\n                    }\n                    return null == props[propName] ? isRequired ? new PropTypeError(null === props[propName] ? \"The \" + location + \" ` + (\"`\" + `\" + propFullName + \"`)) + (\"`\" + (` is marked as required in ` + \"`\"))))) + ((((`\" + componentName + \"` + (\"`\" + `, but its value is `)) + (\"`\" + (`null` + \"`\"))) + ((`.\" : \"The \" + location + \" ` + (\"`\" + `\" + propFullName + \"`)) + (\"`\" + (` is marked as required in ` + \"`\")))) + (((`\" + componentName + \"` + (\"`\" + `, but its value is `)) + (\"`\" + (`undefined` + \"`\"))) + ((`.\") : null : validate(props, propName, componentName, location, propFullName);\n                }\n                if (\"production\" !== process.env.NODE_ENV) var manualPropTypeCallCache = {}, manualPropTypeWarningCount = 0;\n                var chainedCheckType = checkType.bind(null, !1);\n                return chainedCheckType.isRequired = checkType.bind(null, !0), chainedCheckType;\n            }\n            function createPrimitiveTypeChecker(expectedType) {\n                function validate(props, propName, componentName, location, propFullName, secret) {\n                    var propValue = props[propName];\n                    if (getPropType(propValue) !== expectedType) return new PropTypeError(\"Invalid \" + location + \" ` + (\"`\" + `\" + propFullName + \"`)) + ((\"`\" + ` of type `) + (\"`\" + `\" + getPreciseType(propValue) + \"`)))))))) + (((((((\"`\" + (` supplied to ` + \"`\")) + (`\" + componentName + \"` + (\"`\" + `, expected `))) + ((\"`\" + (`\" + expectedType + \"` + \"`\")) + (`.\");\n                    return null;\n                }\n                return createChainableTypeChecker(validate);\n            }\n            function createArrayOfTypeChecker(typeChecker) {\n                function validate(props, propName, componentName, location, propFullName) {\n                    if (\"function\" != typeof typeChecker) return new PropTypeError(\"Property ` + (\"`\" + `\" + propFullName + \"`)))) + (((\"`\" + (` of component ` + \"`\")) + (`\" + componentName + \"` + (\"`\" + ` has invalid PropType notation inside arrayOf.\");\n                    var propValue = props[propName];\n                    if (!Array.isArray(propValue)) {\n                        return new PropTypeError(\"Invalid \" + location + \" `))) + ((\"`\" + (`\" + propFullName + \"` + \"`\")) + (` of type ` + (\"`\" + `\" + getPropType(propValue) + \"`))))) + ((((\"`\" + (` supplied to ` + \"`\")) + (`\" + componentName + \"` + (\"`\" + `, expected an array.\");\n                    }\n                    for (var i = 0; i < propValue.length; i++) {\n                        var error = typeChecker(propValue, i, componentName, location, propFullName + \"[\" + i + \"]\", ReactPropTypesSecret);\n                        if (error instanceof Error) return error;\n                    }\n                    return null;\n                }\n                return createChainableTypeChecker(validate);\n            }\n            function createInstanceTypeChecker(expectedClass) {\n                function validate(props, propName, componentName, location, propFullName) {\n                    if (!(props[propName] instanceof expectedClass)) {\n                        var expectedClassName = expectedClass.name || ANONYMOUS;\n                        return new PropTypeError(\"Invalid \" + location + \" `))) + ((\"`\" + (`\" + propFullName + \"` + \"`\")) + (` of type ` + (\"`\" + `\" + getClassName(props[propName]) + \"`)))) + (((\"`\" + (` supplied to ` + \"`\")) + (`\" + componentName + \"` + (\"`\" + `, expected instance of `))) + ((\"`\" + (`\" + expectedClassName + \"` + \"`\")) + (`.\");\n                    }\n                    return null;\n                }\n                return createChainableTypeChecker(validate);\n            }\n            function createEnumTypeChecker(expectedValues) {\n                function validate(props, propName, componentName, location, propFullName) {\n                    for (var propValue = props[propName], i = 0; i < expectedValues.length; i++) if (is(propValue, expectedValues[i])) return null;\n                    return new PropTypeError(\"Invalid \" + location + \" ` + (\"`\" + `\" + propFullName + \"`)))))) + (((((\"`\" + (` of value ` + \"`\")) + (`\" + propValue + \"` + (\"`\" + ` supplied to `))) + ((\"`\" + (`\" + componentName + \"` + \"`\")) + (`, expected one of \" + JSON.stringify(expectedValues) + \".\");\n                }\n                return Array.isArray(expectedValues) ? createChainableTypeChecker(validate) : (\"production\" !== process.env.NODE_ENV && warning(!1, \"Invalid argument supplied to oneOf, expected an instance of array.\"), \n                emptyFunction.thatReturnsNull);\n            }\n            function createObjectOfTypeChecker(typeChecker) {\n                function validate(props, propName, componentName, location, propFullName) {\n                    if (\"function\" != typeof typeChecker) return new PropTypeError(\"Property ` + (\"`\" + `\" + propFullName + \"`)))) + (((\"`\" + (` of component ` + \"`\")) + (`\" + componentName + \"` + (\"`\" + ` has invalid PropType notation inside objectOf.\");\n                    var propValue = props[propName], propType = getPropType(propValue);\n                    if (\"object\" !== propType) return new PropTypeError(\"Invalid \" + location + \" `))) + ((\"`\" + (`\" + propFullName + \"` + \"`\")) + (` of type ` + (\"`\" + `\" + propType + \"`))))) + ((((\"`\" + (` supplied to ` + \"`\")) + (`\" + componentName + \"` + (\"`\" + `, expected an object.\");\n                    for (var key in propValue) if (propValue.hasOwnProperty(key)) {\n                        var error = typeChecker(propValue, key, componentName, location, propFullName + \".\" + key, ReactPropTypesSecret);\n                        if (error instanceof Error) return error;\n                    }\n                    return null;\n                }\n                return createChainableTypeChecker(validate);\n            }\n            function createUnionTypeChecker(arrayOfTypeCheckers) {\n                function validate(props, propName, componentName, location, propFullName) {\n                    for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n                        if (null == (0, arrayOfTypeCheckers[i])(props, propName, componentName, location, propFullName, ReactPropTypesSecret)) return null;\n                    }\n                    return new PropTypeError(\"Invalid \" + location + \" `))) + ((\"`\" + (`\" + propFullName + \"` + \"`\")) + (` supplied to ` + (\"`\" + `\" + componentName + \"`)))) + (((\"`\" + (`.\");\n                }\n                if (!Array.isArray(arrayOfTypeCheckers)) return \"production\" !== process.env.NODE_ENV && warning(!1, \"Invalid argument supplied to oneOfType, expected an instance of array.\"), \n                emptyFunction.thatReturnsNull;\n                for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n                    var checker = arrayOfTypeCheckers[i];\n                    if (\"function\" != typeof checker) return warning(!1, \"Invalid argument supplied to oneOfType. Expected an array of check functions, but received %s at index %s.\", getPostfixForTypeWarning(checker), i), \n                    emptyFunction.thatReturnsNull;\n                }\n                return createChainableTypeChecker(validate);\n            }\n            function createShapeTypeChecker(shapeTypes) {\n                function validate(props, propName, componentName, location, propFullName) {\n                    var propValue = props[propName], propType = getPropType(propValue);\n                    if (\"object\" !== propType) return new PropTypeError(\"Invalid \" + location + \" ` + \"`\")) + (`\" + propFullName + \"` + (\"`\" + ` of type `))) + ((\"`\" + (`\" + propType + \"` + \"`\")) + ((` supplied to ` + \"`\") + (`\" + componentName + \"` + \"`\"))))))) + ((((((`, expected ` + (\"`\" + `object`)) + (\"`\" + (`.\");\n                    for (var key in shapeTypes) {\n                        var checker = shapeTypes[key];\n                        if (checker) {\n                            var error = checker(propValue, key, componentName, location, propFullName + \".\" + key, ReactPropTypesSecret);\n                            if (error) return error;\n                        }\n                    }\n                    return null;\n                }\n                return createChainableTypeChecker(validate);\n            }\n            function createStrictShapeTypeChecker(shapeTypes) {\n                function validate(props, propName, componentName, location, propFullName) {\n                    var propValue = props[propName], propType = getPropType(propValue);\n                    if (\"object\" !== propType) return new PropTypeError(\"Invalid \" + location + \" ` + \"`\"))) + ((`\" + propFullName + \"` + (\"`\" + ` of type `)) + (\"`\" + (`\" + propType + \"` + \"`\")))) + (((` supplied to ` + (\"`\" + `\" + componentName + \"`)) + (\"`\" + (`, expected ` + \"`\"))) + ((`object` + (\"`\" + `.\");\n                    var allKeys = assign({}, props[propName], shapeTypes);\n                    for (var key in allKeys) {\n                        var checker = shapeTypes[key];\n                        if (!checker) return new PropTypeError(\"Invalid \" + location + \" `)) + (\"`\" + (`\" + propFullName + \"` + \"`\"))))) + ((((` key ` + (\"`\" + `\" + key + \"`)) + (\"`\" + (` supplied to ` + \"`\"))) + ((`\" + componentName + \"` + (\"`\" + `.\\nBad object: \" + JSON.stringify(props[propName], null, \"  \") + \"\\nValid keys: \" + JSON.stringify(Object.keys(shapeTypes), null, \"  \"));\n                        var error = checker(propValue, key, componentName, location, propFullName + \".\" + key, ReactPropTypesSecret);\n                        if (error) return error;\n                    }\n                    return null;\n                }\n                return createChainableTypeChecker(validate);\n            }\n            function isNode(propValue) {\n                switch (typeof propValue) {\n                  case \"number\":\n                  case \"string\":\n                  case \"undefined\":\n                    return !0;\n\n                  case \"boolean\":\n                    return !propValue;\n\n                  case \"object\":\n                    if (Array.isArray(propValue)) return propValue.every(isNode);\n                    if (null === propValue || isValidElement(propValue)) return !0;\n                    var iteratorFn = getIteratorFn(propValue);\n                    if (!iteratorFn) return !1;\n                    var step, iterator = iteratorFn.call(propValue);\n                    if (iteratorFn !== propValue.entries) {\n                        for (;!(step = iterator.next()).done; ) if (!isNode(step.value)) return !1;\n                    } else for (;!(step = iterator.next()).done; ) {\n                        var entry = step.value;\n                        if (entry && !isNode(entry[1])) return !1;\n                    }\n                    return !0;\n\n                  default:\n                    return !1;\n                }\n            }\n            function isSymbol(propType, propValue) {\n                return \"symbol\" === propType || (\"Symbol\" === propValue[\"@@toStringTag\"] || \"function\" == typeof Symbol && propValue instanceof Symbol);\n            }\n            function getPropType(propValue) {\n                var propType = typeof propValue;\n                return Array.isArray(propValue) ? \"array\" : propValue instanceof RegExp ? \"object\" : isSymbol(propType, propValue) ? \"symbol\" : propType;\n            }\n            function getPreciseType(propValue) {\n                if (void 0 === propValue || null === propValue) return \"\" + propValue;\n                var propType = getPropType(propValue);\n                if (\"object\" === propType) {\n                    if (propValue instanceof Date) return \"date\";\n                    if (propValue instanceof RegExp) return \"regexp\";\n                }\n                return propType;\n            }\n            function getPostfixForTypeWarning(value) {\n                var type = getPreciseType(value);\n                switch (type) {\n                  case \"array\":\n                  case \"object\":\n                    return \"an \" + type;\n\n                  case \"boolean\":\n                  case \"date\":\n                  case \"regexp\":\n                    return \"a \" + type;\n\n                  default:\n                    return type;\n                }\n            }\n            function getClassName(propValue) {\n                return propValue.constructor && propValue.constructor.name ? propValue.constructor.name : ANONYMOUS;\n            }\n            var ITERATOR_SYMBOL = \"function\" == typeof Symbol && Symbol.iterator, FAUX_ITERATOR_SYMBOL = \"@@iterator\", ANONYMOUS = \"<<anonymous>>\", ReactPropTypes = {\n                array: createPrimitiveTypeChecker(\"array\"),\n                bool: createPrimitiveTypeChecker(\"boolean\"),\n                func: createPrimitiveTypeChecker(\"function\"),\n                number: createPrimitiveTypeChecker(\"number\"),\n                object: createPrimitiveTypeChecker(\"object\"),\n                string: createPrimitiveTypeChecker(\"string\"),\n                symbol: createPrimitiveTypeChecker(\"symbol\"),\n                any: function() {\n                    return createChainableTypeChecker(emptyFunction.thatReturnsNull);\n                }(),\n                arrayOf: createArrayOfTypeChecker,\n                element: function() {\n                    function validate(props, propName, componentName, location, propFullName) {\n                        var propValue = props[propName];\n                        if (!isValidElement(propValue)) {\n                            return new PropTypeError(\"Invalid \" + location + \" `)) + (\"`\" + (`\" + propFullName + \"` + \"`\")))) + (((` of type ` + (\"`\" + `\" + getPropType(propValue) + \"`)) + (\"`\" + (` supplied to ` + \"`\"))) + ((`\" + componentName + \"` + (\"`\" + `, expected a single ReactElement.\");\n                        }\n                        return null;\n                    }\n                    return createChainableTypeChecker(validate);\n                }(),\n                instanceOf: createInstanceTypeChecker,\n                node: function() {\n                    function validate(props, propName, componentName, location, propFullName) {\n                        return isNode(props[propName]) ? null : new PropTypeError(\"Invalid \" + location + \" `)) + (\"`\" + (`\" + propFullName + \"` + \"`\")))))) + (((((` supplied to ` + (\"`\" + `\" + componentName + \"`)) + (\"`\" + (`, expected a ReactNode.\");\n                    }\n                    return createChainableTypeChecker(validate);\n                }(),\n                objectOf: createObjectOfTypeChecker,\n                oneOf: createEnumTypeChecker,\n                oneOfType: createUnionTypeChecker,\n                shape: createShapeTypeChecker,\n                exact: createStrictShapeTypeChecker\n            };\n            return PropTypeError.prototype = Error.prototype, ReactPropTypes.checkPropTypes = checkPropTypes, \n            ReactPropTypes.PropTypes = ReactPropTypes, ReactPropTypes;\n        };\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var emptyFunction = __webpack_require__(50), invariant = __webpack_require__(49), ReactPropTypesSecret = __webpack_require__(144);\n    module.exports = function() {\n        function shim(props, propName, componentName, location, propFullName, secret) {\n            secret !== ReactPropTypesSecret && invariant(!1, \"Calling PropTypes validators directly is not supported by the ` + \"`\"))) + ((`prop-types` + (\"`\" + ` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types\");\n        }\n        function getShim() {\n            return shim;\n        }\n        shim.isRequired = shim;\n        var ReactPropTypes = {\n            array: shim,\n            bool: shim,\n            func: shim,\n            number: shim,\n            object: shim,\n            string: shim,\n            symbol: shim,\n            any: shim,\n            arrayOf: getShim,\n            element: shim,\n            instanceOf: getShim,\n            node: shim,\n            objectOf: getShim,\n            oneOf: getShim,\n            oneOfType: getShim,\n            shape: getShim,\n            exact: getShim\n        };\n        return ReactPropTypes.checkPropTypes = emptyFunction, ReactPropTypes.PropTypes = ReactPropTypes, \n        ReactPropTypes;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function createBroadcast(initialState) {\n        function getState() {\n            return _state;\n        }\n        function setState(state) {\n            _state = state;\n            for (var keys = Object.keys(listeners), i = 0, len = keys.length; i < len; i++) listeners[keys[i]] && listeners[keys[i]](state);\n        }\n        function subscribe(listener) {\n            if (\"function\" != typeof listener) throw new Error(\"listener must be a function.\");\n            var currentId = id;\n            return listeners[currentId] = listener, id += 1, currentId;\n        }\n        function unsubscribe(id) {\n            listeners[id] = void 0;\n        }\n        var listeners = {}, id = 1, _state = initialState;\n        return {\n            getState: getState,\n            setState: setState,\n            subscribe: subscribe,\n            unsubscribe: unsubscribe\n        };\n    }\n    Object.defineProperty(__webpack_exports__, \"__esModule\", {\n        value: !0\n    }), __webpack_exports__.default = createBroadcast;\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(422), module.exports = __webpack_require__(17).Object.keys;\n}, function(module, exports, __webpack_require__) {\n    var toObject = __webpack_require__(65), $keys = __webpack_require__(76);\n    __webpack_require__(228)(\"keys\", function() {\n        return function(it) {\n            return $keys(toObject(it));\n        };\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function round(value) {\n        return Math.round(1e5 * value) / 1e5;\n    }\n    function createTypography(palette, typography) {\n        function pxToRem(value) {\n            return value / htmlFontSize + \"rem\";\n        }\n        var _ref = \"function\" == typeof typography ? typography(palette) : typography, _ref$fontFamily = _ref.fontFamily, fontFamily = void 0 === _ref$fontFamily ? '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif' : _ref$fontFamily, _ref$fontSize = _ref.fontSize, fontSize = void 0 === _ref$fontSize ? 14 : _ref$fontSize, _ref$fontWeightLight = _ref.fontWeightLight, fontWeightLight = void 0 === _ref$fontWeightLight ? 300 : _ref$fontWeightLight, _ref$fontWeightRegula = _ref.fontWeightRegular, fontWeightRegular = void 0 === _ref$fontWeightRegula ? 400 : _ref$fontWeightRegula, _ref$fontWeightMedium = _ref.fontWeightMedium, fontWeightMedium = void 0 === _ref$fontWeightMedium ? 500 : _ref$fontWeightMedium, _ref$htmlFontSize = _ref.htmlFontSize, htmlFontSize = void 0 === _ref$htmlFontSize ? 16 : _ref$htmlFontSize, other = (0, \n        _objectWithoutProperties3.default)(_ref, [ \"fontFamily\", \"fontSize\", \"fontWeightLight\", \"fontWeightRegular\", \"fontWeightMedium\", \"htmlFontSize\" ]);\n        return (0, _deepmerge2.default)({\n            pxToRem: pxToRem,\n            round: round,\n            fontFamily: fontFamily,\n            fontSize: fontSize,\n            fontWeightLight: fontWeightLight,\n            fontWeightRegular: fontWeightRegular,\n            fontWeightMedium: fontWeightMedium,\n            display4: {\n                fontSize: pxToRem(112),\n                fontWeight: fontWeightLight,\n                fontFamily: fontFamily,\n                letterSpacing: \"-.04em\",\n                lineHeight: round(128 / 112) + \"em\",\n                marginLeft: \"-.06em\",\n                color: palette.text.secondary\n            },\n            display3: {\n                fontSize: pxToRem(56),\n                fontWeight: fontWeightRegular,\n                fontFamily: fontFamily,\n                letterSpacing: \"-.02em\",\n                lineHeight: round(73 / 56) + \"em\",\n                marginLeft: \"-.04em\",\n                color: palette.text.secondary\n            },\n            display2: {\n                fontSize: pxToRem(45),\n                fontWeight: fontWeightRegular,\n                fontFamily: fontFamily,\n                lineHeight: round(48 / 45) + \"em\",\n                marginLeft: \"-.04em\",\n                color: palette.text.secondary\n            },\n            display1: {\n                fontSize: pxToRem(34),\n                fontWeight: fontWeightRegular,\n                fontFamily: fontFamily,\n                lineHeight: round(41 / 34) + \"em\",\n                marginLeft: \"-.04em\",\n                color: palette.text.secondary\n            },\n            headline: {\n                fontSize: pxToRem(24),\n                fontWeight: fontWeightRegular,\n                fontFamily: fontFamily,\n                lineHeight: round(32.5 / 24) + \"em\",\n                color: palette.text.primary\n            },\n            title: {\n                fontSize: pxToRem(21),\n                fontWeight: fontWeightMedium,\n                fontFamily: fontFamily,\n                lineHeight: round(24.5 / 21) + \"em\",\n                color: palette.text.primary\n            },\n            subheading: {\n                fontSize: pxToRem(16),\n                fontWeight: fontWeightRegular,\n                fontFamily: fontFamily,\n                lineHeight: round(1.5) + \"em\",\n                color: palette.text.primary\n            },\n            body2: {\n                fontSize: pxToRem(14),\n                fontWeight: fontWeightMedium,\n                fontFamily: fontFamily,\n                lineHeight: round(24 / 14) + \"em\",\n                color: palette.text.primary\n            },\n            body1: {\n                fontSize: pxToRem(14),\n                fontWeight: fontWeightRegular,\n                fontFamily: fontFamily,\n                lineHeight: round(20.5 / 14) + \"em\",\n                color: palette.text.primary\n            },\n            caption: {\n                fontSize: pxToRem(12),\n                fontWeight: fontWeightRegular,\n                fontFamily: fontFamily,\n                lineHeight: round(1.375) + \"em\",\n                color: palette.text.secondary\n            },\n            button: {\n                fontSize: pxToRem(fontSize),\n                textTransform: \"uppercase\",\n                fontWeight: fontWeightMedium,\n                fontFamily: fontFamily\n            }\n        }, other, {\n            clone: !1\n        });\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);\n    exports.default = createTypography;\n    var _deepmerge = __webpack_require__(108), _deepmerge2 = _interopRequireDefault(_deepmerge);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function addLightOrDark(intent, direction, shade, tonalOffset) {\n            intent[direction] || (intent.hasOwnProperty(shade) ? intent[direction] = intent[shade] : \"light\" === direction ? intent.light = (0, \n            _colorManipulator.lighten)(intent.main, tonalOffset) : \"dark\" === direction && (intent.dark = (0, \n            _colorManipulator.darken)(intent.main, 1.5 * tonalOffset)));\n        }\n        function createPalette(palette) {\n            function getContrastText(background) {\n                var contrastText = (0, _colorManipulator.getContrastRatio)(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;\n                if (\"production\" !== process.env.NODE_ENV) {\n                    var contrast = (0, _colorManipulator.getContrastRatio)(background, contrastText);\n                    \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(contrast >= 3, [ \"Material-UI: the contrast ratio of \" + contrast + \":1 for \" + contrastText + \" on \" + background, \"falls below the WACG recommended absolute minimum contrast ratio of 3:1.\", \"https://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast\" ].join(\"\\n\"));\n                }\n                return contrastText;\n            }\n            function augmentColor(color, mainShade, lightShade, darkShade) {\n                !color.main && color[mainShade] && (color.main = color[mainShade]), addLightOrDark(color, \"light\", lightShade, tonalOffset), \n                addLightOrDark(color, \"dark\", darkShade, tonalOffset), color.contrastText || (color.contrastText = getContrastText(color.main));\n            }\n            var _palette$primary = palette.primary, primary = void 0 === _palette$primary ? {\n                light: _indigo2.default[300],\n                main: _indigo2.default[500],\n                dark: _indigo2.default[700]\n            } : _palette$primary, _palette$secondary = palette.secondary, secondary = void 0 === _palette$secondary ? {\n                light: _pink2.default.A200,\n                main: _pink2.default.A400,\n                dark: _pink2.default.A700\n            } : _palette$secondary, _palette$error = palette.error, error = void 0 === _palette$error ? {\n                light: _red2.default[300],\n                main: _red2.default[500],\n                dark: _red2.default[700]\n            } : _palette$error, _palette$type = palette.type, type = void 0 === _palette$type ? \"light\" : _palette$type, _palette$contrastThre = palette.contrastThreshold, contrastThreshold = void 0 === _palette$contrastThre ? 3 : _palette$contrastThre, _palette$tonalOffset = palette.tonalOffset, tonalOffset = void 0 === _palette$tonalOffset ? .2 : _palette$tonalOffset, other = (0, \n            _objectWithoutProperties3.default)(palette, [ \"primary\", \"secondary\", \"error\", \"type\", \"contrastThreshold\", \"tonalOffset\" ]);\n            augmentColor(primary, 500, 300, 700), augmentColor(secondary, \"A400\", \"A200\", \"A700\"), \n            augmentColor(error, 500, 300, 700);\n            var types = {\n                dark: dark,\n                light: light\n            };\n            return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(types[type], \"Material-UI: the palette type `)) + (\"`\" + (`\" + type + \"` + \"`\")))) + (((` is not supported.\"), \n            (0, _deepmerge2.default)((0, _extends3.default)({\n                common: _common2.default,\n                type: type,\n                primary: primary,\n                secondary: secondary,\n                error: error,\n                grey: _grey2.default,\n                contrastThreshold: contrastThreshold,\n                getContrastText: getContrastText,\n                tonalOffset: tonalOffset\n            }, types[type]), other, {\n                clone: !1\n            });\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.dark = exports.light = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);\n        exports.default = createPalette;\n        var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _deepmerge = __webpack_require__(108), _deepmerge2 = _interopRequireDefault(_deepmerge), _indigo = __webpack_require__(425), _indigo2 = _interopRequireDefault(_indigo), _pink = __webpack_require__(426), _pink2 = _interopRequireDefault(_pink), _grey = __webpack_require__(427), _grey2 = _interopRequireDefault(_grey), _red = __webpack_require__(428), _red2 = _interopRequireDefault(_red), _common = __webpack_require__(429), _common2 = _interopRequireDefault(_common), _colorManipulator = __webpack_require__(430), light = exports.light = {\n            text: {\n                primary: \"rgba(0, 0, 0, 0.87)\",\n                secondary: \"rgba(0, 0, 0, 0.54)\",\n                disabled: \"rgba(0, 0, 0, 0.38)\",\n                hint: \"rgba(0, 0, 0, 0.38)\"\n            },\n            divider: \"rgba(0, 0, 0, 0.12)\",\n            background: {\n                paper: _common2.default.white,\n                default: _grey2.default[50]\n            },\n            action: {\n                active: \"rgba(0, 0, 0, 0.54)\",\n                hover: \"rgba(0, 0, 0, 0.08)\",\n                selected: \"rgba(0, 0, 0, 0.14)\",\n                disabled: \"rgba(0, 0, 0, 0.26)\",\n                disabledBackground: \"rgba(0, 0, 0, 0.12)\"\n            }\n        }, dark = exports.dark = {\n            text: {\n                primary: _common2.default.white,\n                secondary: \"rgba(255, 255, 255, 0.7)\",\n                disabled: \"rgba(255, 255, 255, 0.5)\",\n                hint: \"rgba(255, 255, 255, 0.5)\",\n                icon: \"rgba(255, 255, 255, 0.5)\"\n            },\n            divider: \"rgba(255, 255, 255, 0.12)\",\n            background: {\n                paper: _grey2.default[800],\n                default: \"#303030\"\n            },\n            action: {\n                active: _common2.default.white,\n                hover: \"rgba(255, 255, 255, 0.1)\",\n                selected: \"rgba(255, 255, 255, 0.2)\",\n                disabled: \"rgba(255, 255, 255, 0.3)\",\n                disabledBackground: \"rgba(255, 255, 255, 0.12)\"\n            }\n        };\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var indigo = {\n        50: \"#e8eaf6\",\n        100: \"#c5cae9\",\n        200: \"#9fa8da\",\n        300: \"#7986cb\",\n        400: \"#5c6bc0\",\n        500: \"#3f51b5\",\n        600: \"#3949ab\",\n        700: \"#303f9f\",\n        800: \"#283593\",\n        900: \"#1a237e\",\n        A100: \"#8c9eff\",\n        A200: \"#536dfe\",\n        A400: \"#3d5afe\",\n        A700: \"#304ffe\"\n    };\n    exports.default = indigo;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var pink = {\n        50: \"#fce4ec\",\n        100: \"#f8bbd0\",\n        200: \"#f48fb1\",\n        300: \"#f06292\",\n        400: \"#ec407a\",\n        500: \"#e91e63\",\n        600: \"#d81b60\",\n        700: \"#c2185b\",\n        800: \"#ad1457\",\n        900: \"#880e4f\",\n        A100: \"#ff80ab\",\n        A200: \"#ff4081\",\n        A400: \"#f50057\",\n        A700: \"#c51162\"\n    };\n    exports.default = pink;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var grey = {\n        50: \"#fafafa\",\n        100: \"#f5f5f5\",\n        200: \"#eeeeee\",\n        300: \"#e0e0e0\",\n        400: \"#bdbdbd\",\n        500: \"#9e9e9e\",\n        600: \"#757575\",\n        700: \"#616161\",\n        800: \"#424242\",\n        900: \"#212121\",\n        A100: \"#d5d5d5\",\n        A200: \"#aaaaaa\",\n        A400: \"#303030\",\n        A700: \"#616161\"\n    };\n    exports.default = grey;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var red = {\n        50: \"#ffebee\",\n        100: \"#ffcdd2\",\n        200: \"#ef9a9a\",\n        300: \"#e57373\",\n        400: \"#ef5350\",\n        500: \"#f44336\",\n        600: \"#e53935\",\n        700: \"#d32f2f\",\n        800: \"#c62828\",\n        900: \"#b71c1c\",\n        A100: \"#ff8a80\",\n        A200: \"#ff5252\",\n        A400: \"#ff1744\",\n        A700: \"#d50000\"\n    };\n    exports.default = red;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var common = {\n        black: \"#000\",\n        white: \"#fff\"\n    };\n    exports.default = common;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function clamp(value) {\n            var min = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, max = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 1;\n            return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(value >= min && value <= max, \"Material-UI: the value provided \" + value + \" is out of range [\" + min + \", \" + max + \"].\"), \n            value < min ? min : value > max ? max : value;\n        }\n        function convertHexToRGB(color) {\n            color = color.substr(1);\n            var re = new RegExp(\".{1,\" + color.length / 3 + \"}\", \"g\"), colors = color.match(re);\n            return colors && 1 === colors[0].length && (colors = colors.map(function(n) {\n                return n + n;\n            })), colors ? \"rgb(\" + colors.map(function(n) {\n                return parseInt(n, 16);\n            }).join(\", \") + \")\" : \"\";\n        }\n        function decomposeColor(color) {\n            if (\"#\" === color.charAt(0)) return decomposeColor(convertHexToRGB(color));\n            var marker = color.indexOf(\"(\"), type = color.substring(0, marker), values = color.substring(marker + 1, color.length - 1).split(\",\");\n            return values = values.map(function(value) {\n                return parseFloat(value);\n            }), {\n                type: type,\n                values: values\n            };\n        }\n        function recomposeColor(color) {\n            var type = color.type, values = color.values;\n            return type.indexOf(\"rgb\") > -1 && (values = values.map(function(n, i) {\n                return i < 3 ? parseInt(n, 10) : n;\n            })), type.indexOf(\"hsl\") > -1 && (values[1] = values[1] + \"%\", values[2] = values[2] + \"%\"), \n            color.type + \"(\" + values.join(\", \") + \")\";\n        }\n        function getContrastRatio(foreground, background) {\n            var lumA = getLuminance(foreground), lumB = getLuminance(background);\n            return (Math.max(lumA, lumB) + .05) / (Math.min(lumA, lumB) + .05);\n        }\n        function getLuminance(color) {\n            var decomposedColor = decomposeColor(color);\n            if (decomposedColor.type.indexOf(\"rgb\") > -1) {\n                var rgb = decomposedColor.values.map(function(val) {\n                    return val /= 255, val <= .03928 ? val / 12.92 : Math.pow((val + .055) / 1.055, 2.4);\n                });\n                return Number((.2126 * rgb[0] + .7152 * rgb[1] + .0722 * rgb[2]).toFixed(3));\n            }\n            if (decomposedColor.type.indexOf(\"hsl\") > -1) return decomposedColor.values[2] / 100;\n            throw new Error(\"Material-UI: unsupported ` + (\"`\" + `\" + color + \"`)) + (\"`\" + (` color.\");\n        }\n        function emphasize(color) {\n            var coefficient = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : .15;\n            return getLuminance(color) > .5 ? darken(color, coefficient) : lighten(color, coefficient);\n        }\n        function fade(color, value) {\n            return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(color, \"Material-UI: missing color argument in fade(\" + color + \", \" + value + \").\"), \n            color ? (color = decomposeColor(color), value = clamp(value), \"rgb\" !== color.type && \"hsl\" !== color.type || (color.type += \"a\"), \n            color.values[3] = value, recomposeColor(color)) : color;\n        }\n        function darken(color, coefficient) {\n            if (\"production\" !== process.env.NODE_ENV && (0, _warning2.default)(color, \"Material-UI: missing color argument in darken(\" + color + \", \" + coefficient + \").\"), \n            !color) return color;\n            if (color = decomposeColor(color), coefficient = clamp(coefficient), color.type.indexOf(\"hsl\") > -1) color.values[2] *= 1 - coefficient; else if (color.type.indexOf(\"rgb\") > -1) for (var i = 0; i < 3; i += 1) color.values[i] *= 1 - coefficient;\n            return recomposeColor(color);\n        }\n        function lighten(color, coefficient) {\n            if (\"production\" !== process.env.NODE_ENV && (0, _warning2.default)(color, \"Material-UI: missing color argument in lighten(\" + color + \", \" + coefficient + \").\"), \n            !color) return color;\n            if (color = decomposeColor(color), coefficient = clamp(coefficient), color.type.indexOf(\"hsl\") > -1) color.values[2] += (100 - color.values[2]) * coefficient; else if (color.type.indexOf(\"rgb\") > -1) for (var i = 0; i < 3; i += 1) color.values[i] += (255 - color.values[i]) * coefficient;\n            return recomposeColor(color);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.convertHexToRGB = convertHexToRGB, exports.decomposeColor = decomposeColor, \n        exports.recomposeColor = recomposeColor, exports.getContrastRatio = getContrastRatio, \n        exports.getLuminance = getLuminance, exports.emphasize = emphasize, exports.fade = fade, \n        exports.darken = darken, exports.lighten = lighten;\n        var _warning = __webpack_require__(11), _warning2 = function(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }(_warning);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function createMixins(breakpoints, spacing, mixins) {\n        var _toolbar;\n        return (0, _extends4.default)({\n            gutters: function(styles) {\n                return (0, _extends4.default)({\n                    paddingLeft: 2 * spacing.unit,\n                    paddingRight: 2 * spacing.unit\n                }, styles, (0, _defineProperty3.default)({}, breakpoints.up(\"sm\"), (0, _extends4.default)({\n                    paddingLeft: 3 * spacing.unit,\n                    paddingRight: 3 * spacing.unit\n                }, styles[breakpoints.up(\"sm\")])));\n            },\n            toolbar: (_toolbar = {\n                minHeight: 56\n            }, (0, _defineProperty3.default)(_toolbar, breakpoints.up(\"xs\") + \" and (orientation: landscape)\", {\n                minHeight: 48\n            }), (0, _defineProperty3.default)(_toolbar, breakpoints.up(\"sm\"), {\n                minHeight: 64\n            }), _toolbar)\n        }, mixins);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _extends3 = __webpack_require__(6), _extends4 = _interopRequireDefault(_extends3);\n    exports.default = createMixins;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function createShadow() {\n        return [ (arguments.length <= 0 ? void 0 : arguments[0]) + \"px \" + (arguments.length <= 1 ? void 0 : arguments[1]) + \"px \" + (arguments.length <= 2 ? void 0 : arguments[2]) + \"px \" + (arguments.length <= 3 ? void 0 : arguments[3]) + \"px rgba(0, 0, 0, \" + shadowKeyUmbraOpacity + \")\", (arguments.length <= 4 ? void 0 : arguments[4]) + \"px \" + (arguments.length <= 5 ? void 0 : arguments[5]) + \"px \" + (arguments.length <= 6 ? void 0 : arguments[6]) + \"px \" + (arguments.length <= 7 ? void 0 : arguments[7]) + \"px rgba(0, 0, 0, \" + shadowKeyPenumbraOpacity + \")\", (arguments.length <= 8 ? void 0 : arguments[8]) + \"px \" + (arguments.length <= 9 ? void 0 : arguments[9]) + \"px \" + (arguments.length <= 10 ? void 0 : arguments[10]) + \"px \" + (arguments.length <= 11 ? void 0 : arguments[11]) + \"px rgba(0, 0, 0, \" + shadowAmbientShadowOpacity + \")\" ].join(\",\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var shadowKeyUmbraOpacity = .2, shadowKeyPenumbraOpacity = .14, shadowAmbientShadowOpacity = .12, shadows = [ \"none\", createShadow(0, 1, 3, 0, 0, 1, 1, 0, 0, 2, 1, -1), createShadow(0, 1, 5, 0, 0, 2, 2, 0, 0, 3, 1, -2), createShadow(0, 1, 8, 0, 0, 3, 4, 0, 0, 3, 3, -2), createShadow(0, 2, 4, -1, 0, 4, 5, 0, 0, 1, 10, 0), createShadow(0, 3, 5, -1, 0, 5, 8, 0, 0, 1, 14, 0), createShadow(0, 3, 5, -1, 0, 6, 10, 0, 0, 1, 18, 0), createShadow(0, 4, 5, -2, 0, 7, 10, 1, 0, 2, 16, 1), createShadow(0, 5, 5, -3, 0, 8, 10, 1, 0, 3, 14, 2), createShadow(0, 5, 6, -3, 0, 9, 12, 1, 0, 3, 16, 2), createShadow(0, 6, 6, -3, 0, 10, 14, 1, 0, 4, 18, 3), createShadow(0, 6, 7, -4, 0, 11, 15, 1, 0, 4, 20, 3), createShadow(0, 7, 8, -4, 0, 12, 17, 2, 0, 5, 22, 4), createShadow(0, 7, 8, -4, 0, 13, 19, 2, 0, 5, 24, 4), createShadow(0, 7, 9, -4, 0, 14, 21, 2, 0, 5, 26, 4), createShadow(0, 8, 9, -5, 0, 15, 22, 2, 0, 6, 28, 5), createShadow(0, 8, 10, -5, 0, 16, 24, 2, 0, 6, 30, 5), createShadow(0, 8, 11, -5, 0, 17, 26, 2, 0, 6, 32, 5), createShadow(0, 9, 11, -5, 0, 18, 28, 2, 0, 7, 34, 6), createShadow(0, 9, 12, -6, 0, 19, 29, 2, 0, 7, 36, 6), createShadow(0, 10, 13, -6, 0, 20, 31, 3, 0, 8, 38, 7), createShadow(0, 10, 13, -6, 0, 21, 33, 3, 0, 8, 40, 7), createShadow(0, 10, 14, -6, 0, 22, 35, 3, 0, 8, 42, 7), createShadow(0, 11, 14, -7, 0, 23, 36, 3, 0, 9, 44, 8), createShadow(0, 11, 15, -7, 0, 24, 38, 3, 0, 9, 46, 8) ];\n    exports.default = shadows;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.isNumber = exports.isString = exports.formatMs = exports.duration = exports.easing = void 0;\n        var _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _isNan = __webpack_require__(434), _isNan2 = _interopRequireDefault(_isNan), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), easing = exports.easing = {\n            easeInOut: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n            easeOut: \"cubic-bezier(0.0, 0, 0.2, 1)\",\n            easeIn: \"cubic-bezier(0.4, 0, 1, 1)\",\n            sharp: \"cubic-bezier(0.4, 0, 0.6, 1)\"\n        }, duration = exports.duration = {\n            shortest: 150,\n            shorter: 200,\n            short: 250,\n            standard: 300,\n            complex: 375,\n            enteringScreen: 225,\n            leavingScreen: 195\n        }, formatMs = exports.formatMs = function(milliseconds) {\n            return Math.round(milliseconds) + \"ms\";\n        }, isString = exports.isString = function(value) {\n            return \"string\" == typeof value;\n        }, isNumber = exports.isNumber = function(value) {\n            return !(0, _isNan2.default)(parseFloat(value));\n        };\n        exports.default = {\n            easing: easing,\n            duration: duration,\n            create: function() {\n                var props = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [ \"all\" ], options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, _options$duration = options.duration, durationOption = void 0 === _options$duration ? duration.standard : _options$duration, _options$easing = options.easing, easingOption = void 0 === _options$easing ? easing.easeInOut : _options$easing, _options$delay = options.delay, delay = void 0 === _options$delay ? 0 : _options$delay, other = (0, \n                _objectWithoutProperties3.default)(options, [ \"duration\", \"easing\", \"delay\" ]);\n                return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(isString(props) || Array.isArray(props), 'Material-UI: argument \"props\" must be a string or Array.'), \n                \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(isNumber(durationOption) || isString(durationOption), 'Material-UI: argument \"duration\" must be a number or a string but found ' + durationOption + \".\"), \n                \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(isString(easingOption), 'Material-UI: argument \"easing\" must be a string.'), \n                \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(isNumber(delay) || isString(delay), 'Material-UI: argument \"delay\" must be a number or a string.'), \n                \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(0 === (0, _keys2.default)(other).length, \"Material-UI: unrecognized argument(s) [\" + (0, \n                _keys2.default)(other).join(\",\") + \"]\"), (Array.isArray(props) ? props : [ props ]).map(function(animatedProp) {\n                    return animatedProp + \" \" + (\"string\" == typeof durationOption ? durationOption : formatMs(durationOption)) + \" \" + easingOption + \" \" + (\"string\" == typeof delay ? delay : formatMs(delay));\n                }).join(\",\");\n            },\n            getAutoHeightDuration: function(height) {\n                if (!height) return 0;\n                var constant = height / 36;\n                return Math.round(10 * (4 + 15 * Math.pow(constant, .25) + constant / 5));\n            }\n        };\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(435),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(436), module.exports = __webpack_require__(17).Number.isNaN;\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19);\n    $export($export.S, \"Number\", {\n        isNaN: function(number) {\n            return number != number;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var zIndex = {\n        mobileStepper: 1e3,\n        appBar: 1100,\n        drawer: 1200,\n        modal: 1300,\n        snackbar: 1400,\n        tooltip: 1500\n    };\n    exports.default = zIndex;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = {\n        unit: 8\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Header = __webpack_require__(496), _Header2 = _interopRequireDefault(_Header), _Body = __webpack_require__(529), _Body2 = _interopRequireDefault(_Body), _common = __webpack_require__(81), _Logs = __webpack_require__(261), deepUpdate = function deepUpdate(updater, update, prev) {\n        if (void 0 === update) return prev;\n        if (\"function\" == typeof updater) return updater(update, prev);\n        var updated = {};\n        return Object.keys(prev).forEach(function(key) {\n            updated[key] = deepUpdate(updater[key], update[key], prev[key]);\n        }), updated;\n    }, shouldUpdate = function shouldUpdate(updater, msg) {\n        var su = {};\n        return Object.keys(msg).forEach(function(key) {\n            su[key] = \"function\" == typeof updater[key] || shouldUpdate(updater[key], msg[key]);\n        }), su;\n    }, replacer = function(update) {\n        return update;\n    }, appender = function(limit) {\n        var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : replacer;\n        return function(update, prev) {\n            return [].concat(_toConsumableArray(prev), _toConsumableArray(update.map(function(sample) {\n                return mapper(sample);\n            }))).slice(-limit);\n        };\n    }, defaultContent = function() {\n        return {\n            general: {\n                version: null,\n                commit: null\n            },\n            home: {},\n            chain: {},\n            txpool: {},\n            network: {},\n            system: {\n                activeMemory: [],\n                virtualMemory: [],\n                networkIngress: [],\n                networkEgress: [],\n                processCPU: [],\n                systemCPU: [],\n                diskRead: [],\n                diskWrite: []\n            },\n            logs: {\n                chunks: [],\n                endTop: !1,\n                endBottom: !0,\n                topChanged: 0,\n                bottomChanged: 0\n            }\n        };\n    }, updaters = {\n        general: {\n            version: replacer,\n            commit: replacer\n        },\n        home: null,\n        chain: null,\n        txpool: null,\n        network: null,\n        system: {\n            activeMemory: appender(200),\n            virtualMemory: appender(200),\n            networkIngress: appender(200),\n            networkEgress: appender(200),\n            processCPU: appender(200),\n            systemCPU: appender(200),\n            diskRead: appender(200),\n            diskWrite: appender(200)\n        },\n        logs: (0, _Logs.inserter)(5)\n    }, styles = {\n        dashboard: {\n            display: \"flex\",\n            flexFlow: \"column\",\n            width: \"100%\",\n            height: \"100%\",\n            zIndex: 1,\n            overflow: \"hidden\"\n        }\n    }, themeStyles = function(theme) {\n        return {\n            dashboard: {\n                background: theme.palette.background.default\n            }\n        };\n    }, Dashboard = function(_Component) {\n        function Dashboard(props) {\n            _classCallCheck(this, Dashboard);\n            var _this = _possibleConstructorReturn(this, (Dashboard.__proto__ || Object.getPrototypeOf(Dashboard)).call(this, props));\n            return _this.reconnect = function() {\n                var server = new WebSocket((\"https:\" === window.location.protocol ? \"wss://\" : \"ws://\") + window.location.host + \"/api\");\n                server.onopen = function() {\n                    _this.setState({\n                        content: defaultContent(),\n                        shouldUpdate: {},\n                        server: server\n                    });\n                }, server.onmessage = function(event) {\n                    var msg = JSON.parse(event.data);\n                    if (!msg) return void console.error(\"Incoming message is \" + msg);\n                    _this.update(msg);\n                }, server.onclose = function() {\n                    _this.setState({\n                        server: null\n                    }), setTimeout(_this.reconnect, 3e3);\n                };\n            }, _this.send = function(msg) {\n                null != _this.state.server && _this.state.server.send(msg);\n            }, _this.update = function(msg) {\n                _this.setState(function(prevState) {\n                    return {\n                        content: deepUpdate(updaters, msg, prevState.content),\n                        shouldUpdate: shouldUpdate(updaters, msg)\n                    };\n                });\n            }, _this.changeContent = function(newActive) {\n                _this.setState(function(prevState) {\n                    return prevState.active !== newActive ? {\n                        active: newActive\n                    } : {};\n                });\n            }, _this.switchSideBar = function() {\n                _this.setState(function(prevState) {\n                    return {\n                        sideBar: !prevState.sideBar\n                    };\n                });\n            }, _this.state = {\n                active: _common.MENU.get(\"home\").id,\n                sideBar: !0,\n                content: defaultContent(),\n                shouldUpdate: {},\n                server: null\n            }, _this;\n        }\n        return _inherits(Dashboard, _Component), _createClass(Dashboard, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                this.reconnect();\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                return _react2.default.createElement(\"div\", {\n                    className: this.props.classes.dashboard,\n                    style: styles.dashboard\n                }, _react2.default.createElement(_Header2.default, {\n                    switchSideBar: this.switchSideBar\n                }), _react2.default.createElement(_Body2.default, {\n                    opened: this.state.sideBar,\n                    changeContent: this.changeContent,\n                    active: this.state.active,\n                    content: this.state.content,\n                    shouldUpdate: this.state.shouldUpdate,\n                    send: this.send\n                }));\n            }\n        } ]), Dashboard;\n    }(_react.Component);\n    exports.default = (0, _withStyles2.default)(themeStyles)(Dashboard);\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(441),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(235), __webpack_require__(155), __webpack_require__(230), __webpack_require__(442), \n    __webpack_require__(449), __webpack_require__(452), __webpack_require__(454), module.exports = __webpack_require__(17).Map;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var strong = __webpack_require__(443), validate = __webpack_require__(243);\n    module.exports = __webpack_require__(445)(\"Map\", function(get) {\n        return function() {\n            return get(this, arguments.length > 0 ? arguments[0] : void 0);\n        };\n    }, {\n        get: function(key) {\n            var entry = strong.getEntry(validate(this, \"Map\"), key);\n            return entry && entry.v;\n        },\n        set: function(key, value) {\n            return strong.def(validate(this, \"Map\"), 0 === key ? 0 : key, value);\n        }\n    }, strong, !0);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var dP = __webpack_require__(22).f, create = __webpack_require__(106), redefineAll = __webpack_require__(237), ctx = __webpack_require__(51), anInstance = __webpack_require__(238), forOf = __webpack_require__(109), $iterDefine = __webpack_require__(156), step = __webpack_require__(231), setSpecies = __webpack_require__(444), DESCRIPTORS = __webpack_require__(25), fastKey = __webpack_require__(158).fastKey, validate = __webpack_require__(243), SIZE = DESCRIPTORS ? \"_s\" : \"size\", getEntry = function(that, key) {\n        var entry, index = fastKey(key);\n        if (\"F\" !== index) return that._i[index];\n        for (entry = that._f; entry; entry = entry.n) if (entry.k == key) return entry;\n    };\n    module.exports = {\n        getConstructor: function(wrapper, NAME, IS_MAP, ADDER) {\n            var C = wrapper(function(that, iterable) {\n                anInstance(that, C, NAME, \"_i\"), that._t = NAME, that._i = create(null), that._f = void 0, \n                that._l = void 0, that[SIZE] = 0, void 0 != iterable && forOf(iterable, IS_MAP, that[ADDER], that);\n            });\n            return redefineAll(C.prototype, {\n                clear: function() {\n                    for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) entry.r = !0, \n                    entry.p && (entry.p = entry.p.n = void 0), delete data[entry.i];\n                    that._f = that._l = void 0, that[SIZE] = 0;\n                },\n                delete: function(key) {\n                    var that = validate(this, NAME), entry = getEntry(that, key);\n                    if (entry) {\n                        var next = entry.n, prev = entry.p;\n                        delete that._i[entry.i], entry.r = !0, prev && (prev.n = next), next && (next.p = prev), \n                        that._f == entry && (that._f = next), that._l == entry && (that._l = prev), that[SIZE]--;\n                    }\n                    return !!entry;\n                },\n                forEach: function(callbackfn) {\n                    validate(this, NAME);\n                    for (var entry, f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : void 0, 3); entry = entry ? entry.n : this._f; ) for (f(entry.v, entry.k, this); entry && entry.r; ) entry = entry.p;\n                },\n                has: function(key) {\n                    return !!getEntry(validate(this, NAME), key);\n                }\n            }), DESCRIPTORS && dP(C.prototype, \"size\", {\n                get: function() {\n                    return validate(this, NAME)[SIZE];\n                }\n            }), C;\n        },\n        def: function(that, key, value) {\n            var prev, index, entry = getEntry(that, key);\n            return entry ? entry.v = value : (that._l = entry = {\n                i: index = fastKey(key, !0),\n                k: key,\n                v: value,\n                p: prev = that._l,\n                n: void 0,\n                r: !1\n            }, that._f || (that._f = entry), prev && (prev.n = entry), that[SIZE]++, \"F\" !== index && (that._i[index] = entry)), \n            that;\n        },\n        getEntry: getEntry,\n        setStrong: function(C, NAME, IS_MAP) {\n            $iterDefine(C, NAME, function(iterated, kind) {\n                this._t = validate(iterated, NAME), this._k = kind, this._l = void 0;\n            }, function() {\n                for (var that = this, kind = that._k, entry = that._l; entry && entry.r; ) entry = entry.p;\n                return that._t && (that._l = entry = entry ? entry.n : that._t._f) ? \"keys\" == kind ? step(0, entry.k) : \"values\" == kind ? step(0, entry.v) : step(0, [ entry.k, entry.v ]) : (that._t = void 0, \n                step(1));\n            }, IS_MAP ? \"entries\" : \"values\", !IS_MAP, !0), setSpecies(NAME);\n        }\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var global = __webpack_require__(24), core = __webpack_require__(17), dP = __webpack_require__(22), DESCRIPTORS = __webpack_require__(25), SPECIES = __webpack_require__(21)(\"species\");\n    module.exports = function(KEY) {\n        var C = \"function\" == typeof core[KEY] ? core[KEY] : global[KEY];\n        DESCRIPTORS && C && !C[SPECIES] && dP.f(C, SPECIES, {\n            configurable: !0,\n            get: function() {\n                return this;\n            }\n        });\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var global = __webpack_require__(24), $export = __webpack_require__(19), meta = __webpack_require__(158), fails = __webpack_require__(53), hide = __webpack_require__(39), redefineAll = __webpack_require__(237), forOf = __webpack_require__(109), anInstance = __webpack_require__(238), isObject = __webpack_require__(35), setToStringTag = __webpack_require__(107), dP = __webpack_require__(22).f, each = __webpack_require__(446)(0), DESCRIPTORS = __webpack_require__(25);\n    module.exports = function(NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n        var Base = global[NAME], C = Base, ADDER = IS_MAP ? \"set\" : \"add\", proto = C && C.prototype, O = {};\n        return DESCRIPTORS && \"function\" == typeof C && (IS_WEAK || proto.forEach && !fails(function() {\n            new C().entries().next();\n        })) ? (C = wrapper(function(target, iterable) {\n            anInstance(target, C, NAME, \"_c\"), target._c = new Base(), void 0 != iterable && forOf(iterable, IS_MAP, target[ADDER], target);\n        }), each(\"add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON\".split(\",\"), function(KEY) {\n            var IS_ADDER = \"add\" == KEY || \"set\" == KEY;\n            KEY in proto && (!IS_WEAK || \"clear\" != KEY) && hide(C.prototype, KEY, function(a, b) {\n                if (anInstance(this, C, KEY), !IS_ADDER && IS_WEAK && !isObject(a)) return \"get\" == KEY && void 0;\n                var result = this._c[KEY](0 === a ? 0 : a, b);\n                return IS_ADDER ? this : result;\n            });\n        }), IS_WEAK || dP(C.prototype, \"size\", {\n            get: function() {\n                return this._c.size;\n            }\n        })) : (C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER), redefineAll(C.prototype, methods), \n        meta.NEED = !0), setToStringTag(C, NAME), O[NAME] = C, $export($export.G + $export.W + $export.F, O), \n        IS_WEAK || common.setStrong(C, NAME, IS_MAP), C;\n    };\n}, function(module, exports, __webpack_require__) {\n    var ctx = __webpack_require__(51), IObject = __webpack_require__(146), toObject = __webpack_require__(65), toLength = __webpack_require__(101), asc = __webpack_require__(447);\n    module.exports = function(TYPE, $create) {\n        var IS_MAP = 1 == TYPE, IS_FILTER = 2 == TYPE, IS_SOME = 3 == TYPE, IS_EVERY = 4 == TYPE, IS_FIND_INDEX = 6 == TYPE, NO_HOLES = 5 == TYPE || IS_FIND_INDEX, create = $create || asc;\n        return function($this, callbackfn, that) {\n            for (var val, res, O = toObject($this), self = IObject(O), f = ctx(callbackfn, that, 3), length = toLength(self.length), index = 0, result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : void 0; length > index; index++) if ((NO_HOLES || index in self) && (val = self[index], \n            res = f(val, index, O), TYPE)) if (IS_MAP) result[index] = res; else if (res) switch (TYPE) {\n              case 3:\n                return !0;\n\n              case 5:\n                return val;\n\n              case 6:\n                return index;\n\n              case 2:\n                result.push(val);\n            } else if (IS_EVERY) return !1;\n            return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    var speciesConstructor = __webpack_require__(448);\n    module.exports = function(original, length) {\n        return new (speciesConstructor(original))(length);\n    };\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(35), isArray = __webpack_require__(232), SPECIES = __webpack_require__(21)(\"species\");\n    module.exports = function(original) {\n        var C;\n        return isArray(original) && (C = original.constructor, \"function\" != typeof C || C !== Array && !isArray(C.prototype) || (C = void 0), \n        isObject(C) && null === (C = C[SPECIES]) && (C = void 0)), void 0 === C ? Array : C;\n    };\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19);\n    $export($export.P + $export.R, \"Map\", {\n        toJSON: __webpack_require__(450)(\"Map\")\n    });\n}, function(module, exports, __webpack_require__) {\n    var classof = __webpack_require__(242), from = __webpack_require__(451);\n    module.exports = function(NAME) {\n        return function() {\n            if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n            return from(this);\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    var forOf = __webpack_require__(109);\n    module.exports = function(iter, ITERATOR) {\n        var result = [];\n        return forOf(iter, !1, result.push, result, ITERATOR), result;\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(453)(\"Map\");\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var $export = __webpack_require__(19);\n    module.exports = function(COLLECTION) {\n        $export($export.S, COLLECTION, {\n            of: function() {\n                for (var length = arguments.length, A = new Array(length); length--; ) A[length] = arguments[length];\n                return new this(A);\n            }\n        });\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(455)(\"Map\");\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var $export = __webpack_require__(19), aFunction = __webpack_require__(223), ctx = __webpack_require__(51), forOf = __webpack_require__(109);\n    module.exports = function(COLLECTION) {\n        $export($export.S, COLLECTION, {\n            from: function(source) {\n                var mapping, A, n, cb, mapFn = arguments[1];\n                return aFunction(this), mapping = void 0 !== mapFn, mapping && aFunction(mapFn), \n                void 0 == source ? new this() : (A = [], mapping ? (n = 0, cb = ctx(mapFn, arguments[2], 2), \n                forOf(source, !1, function(nextItem) {\n                    A.push(cb(nextItem, n++));\n                })) : forOf(source, !1, A.push, A), new this(A));\n            }\n        });\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(457),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(458), module.exports = -9007199254740991;\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(19);\n    $export($export.S, \"Number\", {\n        MIN_SAFE_INTEGER: -9007199254740991\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _ns$jss$ns$sheetOptio, _propTypes = __webpack_require__(1), _ns = __webpack_require__(245), ns = function(obj) {\n        if (obj && obj.__esModule) return obj;\n        var newObj = {};\n        if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);\n        return newObj.default = obj, newObj;\n    }(_ns), _propTypes2 = __webpack_require__(460), _propTypes3 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_propTypes2);\n    exports.default = (_ns$jss$ns$sheetOptio = {}, _defineProperty(_ns$jss$ns$sheetOptio, ns.jss, _propTypes3.default.jss), \n    _defineProperty(_ns$jss$ns$sheetOptio, ns.sheetOptions, _propTypes.object), _defineProperty(_ns$jss$ns$sheetOptio, ns.sheetsRegistry, _propTypes3.default.registry), \n    _defineProperty(_ns$jss$ns$sheetOptio, ns.managers, _propTypes.object), _ns$jss$ns$sheetOptio);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _propTypes = __webpack_require__(1);\n    exports.default = {\n        jss: (0, _propTypes.shape)({\n            options: (0, _propTypes.shape)({\n                createGenerateClassName: _propTypes.func.isRequired\n            }).isRequired,\n            createStyleSheet: _propTypes.func.isRequired,\n            removeStyleSheet: _propTypes.func.isRequired\n        }),\n        registry: (0, _propTypes.shape)({\n            add: _propTypes.func.isRequired,\n            toString: _propTypes.func.isRequired\n        })\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n    exports.default = function(styles) {\n        function extract(styles) {\n            var to = null;\n            for (var key in styles) {\n                var value = styles[key], type = void 0 === value ? \"undefined\" : _typeof(value);\n                if (\"function\" === type) to || (to = {}), to[key] = value; else if (\"object\" === type && null !== value && !Array.isArray(value)) {\n                    var extracted = extract(value);\n                    extracted && (to || (to = {}), to[key] = extracted);\n                }\n            }\n            return to;\n        }\n        return extract(styles);\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _warning = __webpack_require__(11), _warning2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_warning), SheetsManager = function() {\n        function SheetsManager() {\n            _classCallCheck(this, SheetsManager), this.sheets = [], this.refs = [], this.keys = [];\n        }\n        return _createClass(SheetsManager, [ {\n            key: \"get\",\n            value: function(key) {\n                var index = this.keys.indexOf(key);\n                return this.sheets[index];\n            }\n        }, {\n            key: \"add\",\n            value: function(key, sheet) {\n                var sheets = this.sheets, refs = this.refs, keys = this.keys, index = sheets.indexOf(sheet);\n                return -1 !== index ? index : (sheets.push(sheet), refs.push(0), keys.push(key), \n                sheets.length - 1);\n            }\n        }, {\n            key: \"manage\",\n            value: function(key) {\n                var index = this.keys.indexOf(key), sheet = this.sheets[index];\n                return 0 === this.refs[index] && sheet.attach(), this.refs[index]++, this.keys[index] || this.keys.splice(index, 0, key), \n                sheet;\n            }\n        }, {\n            key: \"unmanage\",\n            value: function(key) {\n                var index = this.keys.indexOf(key);\n                if (-1 === index) return void (0, _warning2.default)(!1, \"SheetsManager: can't find sheet to unmanage\");\n                this.refs[index] > 0 && 0 === --this.refs[index] && this.sheets[index].detach();\n            }\n        }, {\n            key: \"size\",\n            get: function() {\n                return this.keys.length;\n            }\n        } ]), SheetsManager;\n    }();\n    exports.default = SheetsManager;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function cloneStyle(style) {\n        if (null == style) return style;\n        var typeOfStyle = void 0 === style ? \"undefined\" : _typeof(style);\n        if (\"string\" === typeOfStyle || \"number\" === typeOfStyle || \"function\" === typeOfStyle) return style;\n        if (isArray(style)) return style.map(cloneStyle);\n        if ((0, _isObservable2.default)(style)) return style;\n        var newStyle = {};\n        for (var name in style) {\n            var value = style[name];\n            \"object\" !== (void 0 === value ? \"undefined\" : _typeof(value)) ? newStyle[name] = value : newStyle[name] = cloneStyle(value);\n        }\n        return newStyle;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n    exports.default = cloneStyle;\n    var _isObservable = __webpack_require__(248), _isObservable2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_isObservable), isArray = Array.isArray;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(__webpack_exports__, \"__esModule\", {\n        value: !0\n    }), function(global, module) {\n        var root, __WEBPACK_IMPORTED_MODULE_0__ponyfill_js__ = __webpack_require__(466);\n        root = \"undefined\" != typeof self ? self : \"undefined\" != typeof window ? window : void 0 !== global ? global : module;\n        var result = Object(__WEBPACK_IMPORTED_MODULE_0__ponyfill_js__.a)(root);\n        __webpack_exports__.default = result;\n    }.call(__webpack_exports__, __webpack_require__(40), __webpack_require__(465)(module));\n}, function(module, exports) {\n    module.exports = function(originalModule) {\n        if (!originalModule.webpackPolyfill) {\n            var module = Object.create(originalModule);\n            module.children || (module.children = []), Object.defineProperty(module, \"loaded\", {\n                enumerable: !0,\n                get: function() {\n                    return module.l;\n                }\n            }), Object.defineProperty(module, \"id\", {\n                enumerable: !0,\n                get: function() {\n                    return module.i;\n                }\n            }), Object.defineProperty(module, \"exports\", {\n                enumerable: !0\n            }), module.webpackPolyfill = 1;\n        }\n        return module;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function symbolObservablePonyfill(root) {\n        var result, Symbol = root.Symbol;\n        return \"function\" == typeof Symbol ? Symbol.observable ? result = Symbol.observable : (result = Symbol(\"observable\"), \n        Symbol.observable = result) : result = \"@@observable\", result;\n    }\n    __webpack_exports__.a = symbolObservablePonyfill;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(global, process) {\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var CSS = global.CSS, env = process.env.NODE_ENV, escapeRegex = /([[\\].#*$><+~=|^:(),\"'` + \"`\"))) + ((`])/g;\n        exports.default = function(str) {\n            return \"production\" === env ? str : CSS && CSS.escape ? CSS.escape(str) : str.replace(escapeRegex, \"\\\\$1\");\n        };\n    }).call(exports, __webpack_require__(40), __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(global) {\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var ns = \"2f1acc6c3a606b082e5eef5e54414ffb\";\n        null == global[ns] && (global[ns] = 0), exports.default = global[ns]++;\n    }).call(exports, __webpack_require__(40));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    }, _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _isInBrowser = __webpack_require__(112), _isInBrowser2 = _interopRequireDefault(_isInBrowser), _StyleSheet = __webpack_require__(251), _StyleSheet2 = _interopRequireDefault(_StyleSheet), _PluginsRegistry = __webpack_require__(470), _PluginsRegistry2 = _interopRequireDefault(_PluginsRegistry), _rules = __webpack_require__(471), _rules2 = _interopRequireDefault(_rules), _observables = __webpack_require__(477), _observables2 = _interopRequireDefault(_observables), _functions = __webpack_require__(478), _functions2 = _interopRequireDefault(_functions), _sheets = __webpack_require__(164), _sheets2 = _interopRequireDefault(_sheets), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _createGenerateClassName = __webpack_require__(250), _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName), _createRule2 = __webpack_require__(111), _createRule3 = _interopRequireDefault(_createRule2), _DomRenderer = __webpack_require__(479), _DomRenderer2 = _interopRequireDefault(_DomRenderer), _VirtualRenderer = __webpack_require__(480), _VirtualRenderer2 = _interopRequireDefault(_VirtualRenderer), defaultPlugins = _rules2.default.concat([ _observables2.default, _functions2.default ]), instanceCounter = 0, Jss = function() {\n        function Jss(options) {\n            _classCallCheck(this, Jss), this.id = instanceCounter++, this.version = \"9.8.0\", \n            this.plugins = new _PluginsRegistry2.default(), this.options = {\n                createGenerateClassName: _createGenerateClassName2.default,\n                Renderer: _isInBrowser2.default ? _DomRenderer2.default : _VirtualRenderer2.default,\n                plugins: []\n            }, this.generateClassName = (0, _createGenerateClassName2.default)(), this.use.apply(this, defaultPlugins), \n            this.setup(options);\n        }\n        return _createClass(Jss, [ {\n            key: \"setup\",\n            value: function() {\n                var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};\n                return options.createGenerateClassName && (this.options.createGenerateClassName = options.createGenerateClassName, \n                this.generateClassName = options.createGenerateClassName()), null != options.insertionPoint && (this.options.insertionPoint = options.insertionPoint), \n                (options.virtual || options.Renderer) && (this.options.Renderer = options.Renderer || (options.virtual ? _VirtualRenderer2.default : _DomRenderer2.default)), \n                options.plugins && this.use.apply(this, options.plugins), this;\n            }\n        }, {\n            key: \"createStyleSheet\",\n            value: function(styles) {\n                var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, index = options.index;\n                \"number\" != typeof index && (index = 0 === _sheets2.default.index ? 0 : _sheets2.default.index + 1);\n                var sheet = new _StyleSheet2.default(styles, _extends({}, options, {\n                    jss: this,\n                    generateClassName: options.generateClassName || this.generateClassName,\n                    insertionPoint: this.options.insertionPoint,\n                    Renderer: this.options.Renderer,\n                    index: index\n                }));\n                return this.plugins.onProcessSheet(sheet), sheet;\n            }\n        }, {\n            key: \"removeStyleSheet\",\n            value: function(sheet) {\n                return sheet.detach(), _sheets2.default.remove(sheet), this;\n            }\n        }, {\n            key: \"createRule\",\n            value: function(name) {\n                var style = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, options = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {};\n                \"object\" === (void 0 === name ? \"undefined\" : _typeof(name)) && (options = style, \n                style = name, name = void 0);\n                var ruleOptions = options;\n                ruleOptions.jss = this, ruleOptions.Renderer = this.options.Renderer, ruleOptions.generateClassName || (ruleOptions.generateClassName = this.generateClassName), \n                ruleOptions.classes || (ruleOptions.classes = {});\n                var rule = (0, _createRule3.default)(name, style, ruleOptions);\n                return !ruleOptions.selector && rule instanceof _StyleRule2.default && (rule.selector = \".\" + ruleOptions.generateClassName(rule)), \n                this.plugins.onProcessRule(rule), rule;\n            }\n        }, {\n            key: \"use\",\n            value: function() {\n                for (var _this = this, _len = arguments.length, plugins = Array(_len), _key = 0; _key < _len; _key++) plugins[_key] = arguments[_key];\n                return plugins.forEach(function(plugin) {\n                    -1 === _this.options.plugins.indexOf(plugin) && (_this.options.plugins.push(plugin), \n                    _this.plugins.use(plugin));\n                }), this;\n            }\n        } ]), Jss;\n    }();\n    exports.default = Jss;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _warning = __webpack_require__(11), _warning2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_warning), PluginsRegistry = function() {\n        function PluginsRegistry() {\n            _classCallCheck(this, PluginsRegistry), this.hooks = {\n                onCreateRule: [],\n                onProcessRule: [],\n                onProcessStyle: [],\n                onProcessSheet: [],\n                onChangeValue: [],\n                onUpdate: []\n            };\n        }\n        return _createClass(PluginsRegistry, [ {\n            key: \"onCreateRule\",\n            value: function(name, decl, options) {\n                for (var i = 0; i < this.hooks.onCreateRule.length; i++) {\n                    var rule = this.hooks.onCreateRule[i](name, decl, options);\n                    if (rule) return rule;\n                }\n                return null;\n            }\n        }, {\n            key: \"onProcessRule\",\n            value: function(rule) {\n                if (!rule.isProcessed) {\n                    for (var sheet = rule.options.sheet, i = 0; i < this.hooks.onProcessRule.length; i++) this.hooks.onProcessRule[i](rule, sheet);\n                    rule.style && this.onProcessStyle(rule.style, rule, sheet), rule.isProcessed = !0;\n                }\n            }\n        }, {\n            key: \"onProcessStyle\",\n            value: function(style, rule, sheet) {\n                for (var nextStyle = style, i = 0; i < this.hooks.onProcessStyle.length; i++) nextStyle = this.hooks.onProcessStyle[i](nextStyle, rule, sheet), \n                rule.style = nextStyle;\n            }\n        }, {\n            key: \"onProcessSheet\",\n            value: function(sheet) {\n                for (var i = 0; i < this.hooks.onProcessSheet.length; i++) this.hooks.onProcessSheet[i](sheet);\n            }\n        }, {\n            key: \"onUpdate\",\n            value: function(data, rule, sheet) {\n                for (var i = 0; i < this.hooks.onUpdate.length; i++) this.hooks.onUpdate[i](data, rule, sheet);\n            }\n        }, {\n            key: \"onChangeValue\",\n            value: function(value, prop, rule) {\n                for (var processedValue = value, i = 0; i < this.hooks.onChangeValue.length; i++) processedValue = this.hooks.onChangeValue[i](processedValue, prop, rule);\n                return processedValue;\n            }\n        }, {\n            key: \"use\",\n            value: function(plugin) {\n                for (var name in plugin) this.hooks[name] ? this.hooks[name].push(plugin[name]) : (0, \n                _warning2.default)(!1, '[JSS] Unknown hook \"%s\".', name);\n            }\n        } ]), PluginsRegistry;\n    }();\n    exports.default = PluginsRegistry;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _SimpleRule = __webpack_require__(472), _SimpleRule2 = _interopRequireDefault(_SimpleRule), _KeyframesRule = __webpack_require__(473), _KeyframesRule2 = _interopRequireDefault(_KeyframesRule), _ConditionalRule = __webpack_require__(474), _ConditionalRule2 = _interopRequireDefault(_ConditionalRule), _FontFaceRule = __webpack_require__(475), _FontFaceRule2 = _interopRequireDefault(_FontFaceRule), _ViewportRule = __webpack_require__(476), _ViewportRule2 = _interopRequireDefault(_ViewportRule), classes = {\n        \"@charset\": _SimpleRule2.default,\n        \"@import\": _SimpleRule2.default,\n        \"@namespace\": _SimpleRule2.default,\n        \"@keyframes\": _KeyframesRule2.default,\n        \"@media\": _ConditionalRule2.default,\n        \"@supports\": _ConditionalRule2.default,\n        \"@font-face\": _FontFaceRule2.default,\n        \"@viewport\": _ViewportRule2.default,\n        \"@-ms-viewport\": _ViewportRule2.default\n    };\n    exports.default = Object.keys(classes).map(function(key) {\n        var re = new RegExp(\"^\" + key);\n        return {\n            onCreateRule: function(name, decl, options) {\n                return re.test(name) ? new classes[key](name, decl, options) : null;\n            }\n        };\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), SimpleRule = function() {\n        function SimpleRule(key, value, options) {\n            _classCallCheck(this, SimpleRule), this.type = \"simple\", this.isProcessed = !1, \n            this.key = key, this.value = value, this.options = options;\n        }\n        return _createClass(SimpleRule, [ {\n            key: \"toString\",\n            value: function(options) {\n                if (Array.isArray(this.value)) {\n                    for (var str = \"\", index = 0; index < this.value.length; index++) str += this.key + \" \" + this.value[index] + \";\", \n                    this.value[index + 1] && (str += \"\\n\");\n                    return str;\n                }\n                return this.key + \" \" + this.value + \";\";\n            }\n        } ]), SimpleRule;\n    }();\n    exports.default = SimpleRule;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _RuleList = __webpack_require__(80), _RuleList2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_RuleList), KeyframesRule = function() {\n        function KeyframesRule(key, frames, options) {\n            _classCallCheck(this, KeyframesRule), this.type = \"keyframes\", this.isProcessed = !1, \n            this.key = key, this.options = options, this.rules = new _RuleList2.default(_extends({}, options, {\n                parent: this\n            }));\n            for (var name in frames) this.rules.add(name, frames[name], _extends({}, this.options, {\n                parent: this,\n                selector: name\n            }));\n            this.rules.process();\n        }\n        return _createClass(KeyframesRule, [ {\n            key: \"toString\",\n            value: function() {\n                var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {\n                    indent: 1\n                }, inner = this.rules.toString(options);\n                return inner && (inner += \"\\n\"), this.key + \" {\\n\" + inner + \"}\";\n            }\n        } ]), KeyframesRule;\n    }();\n    exports.default = KeyframesRule;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _RuleList = __webpack_require__(80), _RuleList2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_RuleList), ConditionalRule = function() {\n        function ConditionalRule(key, styles, options) {\n            _classCallCheck(this, ConditionalRule), this.type = \"conditional\", this.isProcessed = !1, \n            this.key = key, this.options = options, this.rules = new _RuleList2.default(_extends({}, options, {\n                parent: this\n            }));\n            for (var name in styles) this.rules.add(name, styles[name]);\n            this.rules.process();\n        }\n        return _createClass(ConditionalRule, [ {\n            key: \"getRule\",\n            value: function(name) {\n                return this.rules.get(name);\n            }\n        }, {\n            key: \"indexOf\",\n            value: function(rule) {\n                return this.rules.indexOf(rule);\n            }\n        }, {\n            key: \"addRule\",\n            value: function(name, style, options) {\n                var rule = this.rules.add(name, style, options);\n                return this.options.jss.plugins.onProcessRule(rule), rule;\n            }\n        }, {\n            key: \"toString\",\n            value: function() {\n                var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {\n                    indent: 1\n                }, inner = this.rules.toString(options);\n                return inner ? this.key + \" {\\n\" + inner + \"\\n}\" : \"\";\n            }\n        } ]), ConditionalRule;\n    }();\n    exports.default = ConditionalRule;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _toCss = __webpack_require__(163), _toCss2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_toCss), FontFaceRule = function() {\n        function FontFaceRule(key, style, options) {\n            _classCallCheck(this, FontFaceRule), this.type = \"font-face\", this.isProcessed = !1, \n            this.key = key, this.style = style, this.options = options;\n        }\n        return _createClass(FontFaceRule, [ {\n            key: \"toString\",\n            value: function(options) {\n                if (Array.isArray(this.style)) {\n                    for (var str = \"\", index = 0; index < this.style.length; index++) str += (0, _toCss2.default)(this.key, this.style[index]), \n                    this.style[index + 1] && (str += \"\\n\");\n                    return str;\n                }\n                return (0, _toCss2.default)(this.key, this.style, options);\n            }\n        } ]), FontFaceRule;\n    }();\n    exports.default = FontFaceRule;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _toCss = __webpack_require__(163), _toCss2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_toCss), ViewportRule = function() {\n        function ViewportRule(key, style, options) {\n            _classCallCheck(this, ViewportRule), this.type = \"viewport\", this.isProcessed = !1, \n            this.key = key, this.style = style, this.options = options;\n        }\n        return _createClass(ViewportRule, [ {\n            key: \"toString\",\n            value: function(options) {\n                return (0, _toCss2.default)(this.key, this.style, options);\n            }\n        } ]), ViewportRule;\n    }();\n    exports.default = ViewportRule;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _createRule = __webpack_require__(111), _createRule2 = _interopRequireDefault(_createRule), _isObservable = __webpack_require__(248), _isObservable2 = _interopRequireDefault(_isObservable);\n    exports.default = {\n        onCreateRule: function(name, decl, options) {\n            if (!(0, _isObservable2.default)(decl)) return null;\n            var style$ = decl, rule = (0, _createRule2.default)(name, {}, options);\n            return style$.subscribe(function(style) {\n                for (var prop in style) rule.prop(prop, style[prop]);\n            }), rule;\n        },\n        onProcessRule: function(rule) {\n            if (rule instanceof _StyleRule2.default) {\n                var styleRule = rule, style = styleRule.style;\n                for (var prop in style) {\n                    (function(prop) {\n                        var value = style[prop];\n                        if (!(0, _isObservable2.default)(value)) return \"continue\";\n                        delete style[prop], value.subscribe({\n                            next: function(nextValue) {\n                                styleRule.prop(prop, nextValue);\n                            }\n                        });\n                    })(prop);\n                }\n            }\n        }\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _RuleList = __webpack_require__(80), _RuleList2 = _interopRequireDefault(_RuleList), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _createRule = __webpack_require__(111), _createRule2 = _interopRequireDefault(_createRule), now = Date.now(), fnValuesNs = \"fnValues\" + now, fnStyleNs = \"fnStyle\" + ++now;\n    exports.default = {\n        onCreateRule: function(name, decl, options) {\n            if (\"function\" != typeof decl) return null;\n            var rule = (0, _createRule2.default)(name, {}, options);\n            return rule[fnStyleNs] = decl, rule;\n        },\n        onProcessStyle: function(style, rule) {\n            var fn = {};\n            for (var prop in style) {\n                var value = style[prop];\n                \"function\" == typeof value && (delete style[prop], fn[prop] = value);\n            }\n            return rule = rule, rule[fnValuesNs] = fn, style;\n        },\n        onUpdate: function(data, rule) {\n            if (rule.rules instanceof _RuleList2.default) return void rule.rules.update(data);\n            if (rule instanceof _StyleRule2.default) {\n                if (rule = rule, rule[fnValuesNs]) for (var prop in rule[fnValuesNs]) rule.prop(prop, rule[fnValuesNs][prop](data));\n                rule = rule;\n                var fnStyle = rule[fnStyleNs];\n                if (fnStyle) {\n                    var style = fnStyle(data);\n                    for (var _prop in style) rule.prop(_prop, style[_prop]);\n                }\n            }\n        }\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function getPropertyValue(cssRule, prop) {\n        try {\n            return cssRule.style.getPropertyValue(prop);\n        } catch (err) {\n            return \"\";\n        }\n    }\n    function setProperty(cssRule, prop, value) {\n        try {\n            var cssValue = value;\n            if (Array.isArray(value) && (cssValue = (0, _toCssValue2.default)(value, !0), \"!important\" === value[value.length - 1])) return cssRule.style.setProperty(prop, cssValue, \"important\"), \n            !0;\n            cssRule.style.setProperty(prop, cssValue);\n        } catch (err) {\n            return !1;\n        }\n        return !0;\n    }\n    function removeProperty(cssRule, prop) {\n        try {\n            cssRule.style.removeProperty(prop);\n        } catch (err) {\n            (0, _warning2.default)(!1, '[JSS] DOMException \"%s\" was thrown. Tried to remove property \"%s\".', err.message, prop);\n        }\n    }\n    function setSelector(cssRule, selectorText) {\n        return cssRule.selectorText = selectorText, cssRule.selectorText === selectorText;\n    }\n    function findHigherSheet(registry, options) {\n        for (var i = 0; i < registry.length; i++) {\n            var sheet = registry[i];\n            if (sheet.attached && sheet.options.index > options.index && sheet.options.insertionPoint === options.insertionPoint) return sheet;\n        }\n        return null;\n    }\n    function findHighestSheet(registry, options) {\n        for (var i = registry.length - 1; i >= 0; i--) {\n            var sheet = registry[i];\n            if (sheet.attached && sheet.options.insertionPoint === options.insertionPoint) return sheet;\n        }\n        return null;\n    }\n    function findCommentNode(text) {\n        for (var head = getHead(), i = 0; i < head.childNodes.length; i++) {\n            var node = head.childNodes[i];\n            if (8 === node.nodeType && node.nodeValue.trim() === text) return node;\n        }\n        return null;\n    }\n    function findPrevNode(options) {\n        var registry = _sheets2.default.registry;\n        if (registry.length > 0) {\n            var sheet = findHigherSheet(registry, options);\n            if (sheet) return sheet.renderer.element;\n            if (sheet = findHighestSheet(registry, options)) return sheet.renderer.element.nextElementSibling;\n        }\n        var insertionPoint = options.insertionPoint;\n        if (insertionPoint && \"string\" == typeof insertionPoint) {\n            var comment = findCommentNode(insertionPoint);\n            if (comment) return comment.nextSibling;\n            (0, _warning2.default)(\"jss\" === insertionPoint, '[JSS] Insertion point \"%s\" not found.', insertionPoint);\n        }\n        return null;\n    }\n    function insertStyle(style, options) {\n        var insertionPoint = options.insertionPoint, prevNode = findPrevNode(options);\n        if (prevNode) {\n            var parentNode = prevNode.parentNode;\n            return void (parentNode && parentNode.insertBefore(style, prevNode));\n        }\n        if (insertionPoint && \"number\" == typeof insertionPoint.nodeType) {\n            var insertionPointElement = insertionPoint, _parentNode = insertionPointElement.parentNode;\n            return void (_parentNode ? _parentNode.insertBefore(style, insertionPointElement.nextSibling) : (0, \n            _warning2.default)(!1, \"[JSS] Insertion point is not in the DOM.\"));\n        }\n        getHead().insertBefore(style, prevNode);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _sheets = __webpack_require__(164), _sheets2 = _interopRequireDefault(_sheets), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _toCssValue = __webpack_require__(110), _toCssValue2 = _interopRequireDefault(_toCssValue), memoize = function(fn) {\n        var value = void 0;\n        return function() {\n            return value || (value = fn()), value;\n        };\n    }, CSSRuleTypes = {\n        STYLE_RULE: 1,\n        KEYFRAMES_RULE: 7\n    }, getKey = function() {\n        var extractKey = function(cssText) {\n            var from = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0;\n            return cssText.substr(from, cssText.indexOf(\"{\") - 1);\n        };\n        return function(cssRule) {\n            if (cssRule.type === CSSRuleTypes.STYLE_RULE) return cssRule.selectorText;\n            if (cssRule.type === CSSRuleTypes.KEYFRAMES_RULE) {\n                var name = cssRule.name;\n                if (name) return \"@keyframes \" + name;\n                var cssText = cssRule.cssText;\n                return \"@\" + extractKey(cssText, cssText.indexOf(\"keyframes\"));\n            }\n            return extractKey(cssRule.cssText);\n        };\n    }(), getHead = memoize(function() {\n        return document.head || document.getElementsByTagName(\"head\")[0];\n    }), getUnescapedKeysMap = function() {\n        var style = void 0, isAttached = !1;\n        return function(rules) {\n            var map = {};\n            style || (style = document.createElement(\"style\"));\n            for (var i = 0; i < rules.length; i++) {\n                var rule = rules[i];\n                if (rule instanceof _StyleRule2.default) {\n                    var selector = rule.selector;\n                    if (selector && -1 !== selector.indexOf(\"\\\\\")) {\n                        isAttached || (getHead().appendChild(style), isAttached = !0), style.textContent = selector + \" {}\";\n                        var _style = style, sheet = _style.sheet;\n                        if (sheet) {\n                            var cssRules = sheet.cssRules;\n                            cssRules && (map[cssRules[0].selectorText] = rule.key);\n                        }\n                    }\n                }\n            }\n            return isAttached && (getHead().removeChild(style), isAttached = !1), map;\n        };\n    }(), getNonce = memoize(function() {\n        var node = document.querySelector('meta[property=\"csp-nonce\"]');\n        return node ? node.getAttribute(\"content\") : null;\n    }), DomRenderer = function() {\n        function DomRenderer(sheet) {\n            _classCallCheck(this, DomRenderer), this.getPropertyValue = getPropertyValue, this.setProperty = setProperty, \n            this.removeProperty = removeProperty, this.setSelector = setSelector, this.getKey = getKey, \n            this.getUnescapedKeysMap = getUnescapedKeysMap, this.hasInsertedRules = !1, sheet && _sheets2.default.add(sheet), \n            this.sheet = sheet;\n            var _ref = this.sheet ? this.sheet.options : {}, media = _ref.media, meta = _ref.meta, element = _ref.element;\n            this.element = element || document.createElement(\"style\"), this.element.type = \"text/css\", \n            this.element.setAttribute(\"data-jss\", \"\"), media && this.element.setAttribute(\"media\", media), \n            meta && this.element.setAttribute(\"data-meta\", meta);\n            var nonce = getNonce();\n            nonce && this.element.setAttribute(\"nonce\", nonce);\n        }\n        return _createClass(DomRenderer, [ {\n            key: \"attach\",\n            value: function() {\n                !this.element.parentNode && this.sheet && (this.hasInsertedRules && (this.deploy(), \n                this.hasInsertedRules = !1), insertStyle(this.element, this.sheet.options));\n            }\n        }, {\n            key: \"detach\",\n            value: function() {\n                this.element.parentNode.removeChild(this.element);\n            }\n        }, {\n            key: \"deploy\",\n            value: function() {\n                this.sheet && (this.element.textContent = \"\\n\" + this.sheet.toString() + \"\\n\");\n            }\n        }, {\n            key: \"insertRule\",\n            value: function(rule, index) {\n                var sheet = this.element.sheet, cssRules = sheet.cssRules, str = rule.toString();\n                if (index || (index = cssRules.length), !str) return !1;\n                try {\n                    sheet.insertRule(str, index);\n                } catch (err) {\n                    return (0, _warning2.default)(!1, \"[JSS] Can not insert an unsupported rule \\n\\r%s\", rule), \n                    !1;\n                }\n                return this.hasInsertedRules = !0, cssRules[index];\n            }\n        }, {\n            key: \"deleteRule\",\n            value: function(cssRule) {\n                var sheet = this.element.sheet, index = this.indexOf(cssRule);\n                return -1 !== index && (sheet.deleteRule(index), !0);\n            }\n        }, {\n            key: \"indexOf\",\n            value: function(cssRule) {\n                for (var cssRules = this.element.sheet.cssRules, _index = 0; _index < cssRules.length; _index++) if (cssRule === cssRules[_index]) return _index;\n                return -1;\n            }\n        }, {\n            key: \"replaceRule\",\n            value: function(cssRule, rule) {\n                var index = this.indexOf(cssRule), newCssRule = this.insertRule(rule, index);\n                return this.element.sheet.deleteRule(index), newCssRule;\n            }\n        }, {\n            key: \"getRules\",\n            value: function() {\n                return this.element.sheet.cssRules;\n            }\n        } ]), DomRenderer;\n    }();\n    exports.default = DomRenderer;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), VirtualRenderer = function() {\n        function VirtualRenderer() {\n            _classCallCheck(this, VirtualRenderer);\n        }\n        return _createClass(VirtualRenderer, [ {\n            key: \"setProperty\",\n            value: function() {\n                return !0;\n            }\n        }, {\n            key: \"getPropertyValue\",\n            value: function() {\n                return \"\";\n            }\n        }, {\n            key: \"removeProperty\",\n            value: function() {}\n        }, {\n            key: \"setSelector\",\n            value: function() {\n                return !0;\n            }\n        }, {\n            key: \"getKey\",\n            value: function() {\n                return \"\";\n            }\n        }, {\n            key: \"attach\",\n            value: function() {}\n        }, {\n            key: \"detach\",\n            value: function() {}\n        }, {\n            key: \"deploy\",\n            value: function() {}\n        }, {\n            key: \"insertRule\",\n            value: function() {\n                return !1;\n            }\n        }, {\n            key: \"deleteRule\",\n            value: function() {\n                return !0;\n            }\n        }, {\n            key: \"replaceRule\",\n            value: function() {\n                return !1;\n            }\n        }, {\n            key: \"getRules\",\n            value: function() {}\n        }, {\n            key: \"indexOf\",\n            value: function() {\n                return -1;\n            }\n        } ]), VirtualRenderer;\n    }();\n    exports.default = VirtualRenderer;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function jssPreset() {\n        return {\n            plugins: [ (0, _jssGlobal2.default)(), (0, _jssNested2.default)(), (0, _jssCamelCase2.default)(), (0, \n            _jssDefaultUnit2.default)(), (0, _jssVendorPrefixer2.default)(), (0, _jssPropsSort2.default)() ]\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _jssGlobal = __webpack_require__(482), _jssGlobal2 = _interopRequireDefault(_jssGlobal), _jssNested = __webpack_require__(483), _jssNested2 = _interopRequireDefault(_jssNested), _jssCamelCase = __webpack_require__(484), _jssCamelCase2 = _interopRequireDefault(_jssCamelCase), _jssDefaultUnit = __webpack_require__(486), _jssDefaultUnit2 = _interopRequireDefault(_jssDefaultUnit), _jssVendorPrefixer = __webpack_require__(488), _jssVendorPrefixer2 = _interopRequireDefault(_jssVendorPrefixer), _jssPropsSort = __webpack_require__(493), _jssPropsSort2 = _interopRequireDefault(_jssPropsSort);\n    exports.default = jssPreset;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function addScope(selector, scope) {\n        for (var parts = selector.split(separatorRegExp), scoped = \"\", i = 0; i < parts.length; i++) scoped += scope + \" \" + parts[i].trim(), \n        parts[i + 1] && (scoped += \", \");\n        return scoped;\n    }\n    function handleNestedGlobalContainerRule(rule) {\n        var options = rule.options, style = rule.style, rules = style[propKey];\n        if (rules) {\n            for (var name in rules) options.sheet.addRule(name, rules[name], _extends({}, options, {\n                selector: addScope(name, rule.selector)\n            }));\n            delete style[propKey];\n        }\n    }\n    function handlePrefixedGlobalRule(rule) {\n        var options = rule.options, style = rule.style;\n        for (var prop in style) if (prop.substr(0, propKey.length) === propKey) {\n            var selector = addScope(prop.substr(propKey.length), rule.selector);\n            options.sheet.addRule(selector, style[prop], _extends({}, options, {\n                selector: selector\n            })), delete style[prop];\n        }\n    }\n    function jssGlobal() {\n        function onCreateRule(name, styles, options) {\n            if (name === propKey) return new GlobalContainerRule(name, styles, options);\n            if (\"@\" === name[0] && name.substr(0, prefixKey.length) === prefixKey) return new GlobalPrefixedRule(name, styles, options);\n            var parent = options.parent;\n            return parent && (\"global\" !== parent.type && \"global\" !== parent.options.parent.type || (options.global = !0)), \n            options.global && (options.selector = name), null;\n        }\n        function onProcessRule(rule) {\n            \"style\" === rule.type && (handleNestedGlobalContainerRule(rule), handlePrefixedGlobalRule(rule));\n        }\n        return {\n            onCreateRule: onCreateRule,\n            onProcessRule: onProcessRule\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }();\n    exports.default = jssGlobal;\n    var _jss = __webpack_require__(246), propKey = \"@global\", prefixKey = \"@global \", GlobalContainerRule = function() {\n        function GlobalContainerRule(key, styles, options) {\n            _classCallCheck(this, GlobalContainerRule), this.type = \"global\", this.key = key, \n            this.options = options, this.rules = new _jss.RuleList(_extends({}, options, {\n                parent: this\n            }));\n            for (var selector in styles) this.rules.add(selector, styles[selector], {\n                selector: selector\n            });\n            this.rules.process();\n        }\n        return _createClass(GlobalContainerRule, [ {\n            key: \"getRule\",\n            value: function(name) {\n                return this.rules.get(name);\n            }\n        }, {\n            key: \"addRule\",\n            value: function(name, style, options) {\n                var rule = this.rules.add(name, style, options);\n                return this.options.jss.plugins.onProcessRule(rule), rule;\n            }\n        }, {\n            key: \"indexOf\",\n            value: function(rule) {\n                return this.rules.indexOf(rule);\n            }\n        }, {\n            key: \"toString\",\n            value: function() {\n                return this.rules.toString();\n            }\n        } ]), GlobalContainerRule;\n    }(), GlobalPrefixedRule = function() {\n        function GlobalPrefixedRule(name, style, options) {\n            _classCallCheck(this, GlobalPrefixedRule), this.name = name, this.options = options;\n            var selector = name.substr(prefixKey.length);\n            this.rule = options.jss.createRule(selector, style, _extends({}, options, {\n                parent: this,\n                selector: selector\n            }));\n        }\n        return _createClass(GlobalPrefixedRule, [ {\n            key: \"toString\",\n            value: function(options) {\n                return this.rule.toString(options);\n            }\n        } ]), GlobalPrefixedRule;\n    }(), separatorRegExp = /\\s*,\\s*/g;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function jssNested() {\n        function getReplaceRef(container) {\n            return function(match, key) {\n                var rule = container.getRule(key);\n                return rule ? rule.selector : ((0, _warning2.default)(!1, \"[JSS] Could not find the referenced rule %s in %s.\", key, container.options.meta || container), \n                key);\n            };\n        }\n        function replaceParentRefs(nestedProp, parentProp) {\n            for (var parentSelectors = parentProp.split(separatorRegExp), nestedSelectors = nestedProp.split(separatorRegExp), result = \"\", i = 0; i < parentSelectors.length; i++) for (var parent = parentSelectors[i], j = 0; j < nestedSelectors.length; j++) {\n                var nested = nestedSelectors[j];\n                result && (result += \", \"), result += hasAnd(nested) ? nested.replace(parentRegExp, parent) : parent + \" \" + nested;\n            }\n            return result;\n        }\n        function getOptions(rule, container, options) {\n            if (options) return _extends({}, options, {\n                index: options.index + 1\n            });\n            var nestingLevel = rule.options.nestingLevel;\n            return nestingLevel = void 0 === nestingLevel ? 1 : nestingLevel + 1, _extends({}, rule.options, {\n                nestingLevel: nestingLevel,\n                index: container.indexOf(rule) + 1\n            });\n        }\n        function onProcessStyle(style, rule) {\n            if (\"style\" !== rule.type) return style;\n            var container = rule.options.parent, options = void 0, replaceRef = void 0;\n            for (var prop in style) {\n                var isNested = hasAnd(prop), isNestedConditional = \"@\" === prop[0];\n                if (isNested || isNestedConditional) {\n                    if (options = getOptions(rule, container, options), isNested) {\n                        var selector = replaceParentRefs(prop, rule.selector);\n                        replaceRef || (replaceRef = getReplaceRef(container)), selector = selector.replace(refRegExp, replaceRef), \n                        container.addRule(selector, style[prop], _extends({}, options, {\n                            selector: selector\n                        }));\n                    } else isNestedConditional && container.addRule(prop, null, options).addRule(rule.key, style[prop], {\n                        selector: rule.selector\n                    });\n                    delete style[prop];\n                }\n            }\n            return style;\n        }\n        var hasAnd = function(str) {\n            return -1 !== str.indexOf(\"&\");\n        };\n        return {\n            onProcessStyle: onProcessStyle\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    };\n    exports.default = jssNested;\n    var _warning = __webpack_require__(11), _warning2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_warning), separatorRegExp = /\\s*,\\s*/g, parentRegExp = /&/g, refRegExp = /\\$([\\w-]+)/g;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function convertCase(style) {\n        var converted = {};\n        for (var prop in style) converted[(0, _hyphenateStyleName2.default)(prop)] = style[prop];\n        return style.fallbacks && (Array.isArray(style.fallbacks) ? converted.fallbacks = style.fallbacks.map(convertCase) : converted.fallbacks = convertCase(style.fallbacks)), \n        converted;\n    }\n    function camelCase() {\n        function onProcessStyle(style) {\n            if (Array.isArray(style)) {\n                for (var index = 0; index < style.length; index++) style[index] = convertCase(style[index]);\n                return style;\n            }\n            return convertCase(style);\n        }\n        function onChangeValue(value, prop, rule) {\n            var hyphenatedProp = (0, _hyphenateStyleName2.default)(prop);\n            return prop === hyphenatedProp ? value : (rule.prop(hyphenatedProp, value), null);\n        }\n        return {\n            onProcessStyle: onProcessStyle,\n            onChangeValue: onChangeValue\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = camelCase;\n    var _hyphenateStyleName = __webpack_require__(485), _hyphenateStyleName2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_hyphenateStyleName);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function hyphenateStyleName(string) {\n        return string in cache ? cache[string] : cache[string] = string.replace(uppercasePattern, \"-$&\").toLowerCase().replace(msPattern, \"-ms-\");\n    }\n    var uppercasePattern = /[A-Z]/g, msPattern = /^ms-/, cache = {};\n    module.exports = hyphenateStyleName;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function addCamelCasedVersion(obj) {\n        var regExp = /(-[a-z])/g, replace = function(str) {\n            return str[1].toUpperCase();\n        }, newObj = {};\n        for (var key in obj) newObj[key] = obj[key], newObj[key.replace(regExp, replace)] = obj[key];\n        return newObj;\n    }\n    function iterate(prop, value, options) {\n        if (!value) return value;\n        var convertedValue = value, type = void 0 === value ? \"undefined\" : _typeof(value);\n        switch (\"object\" === type && Array.isArray(value) && (type = \"array\"), type) {\n          case \"object\":\n            if (\"fallbacks\" === prop) {\n                for (var innerProp in value) value[innerProp] = iterate(innerProp, value[innerProp], options);\n                break;\n            }\n            for (var _innerProp in value) value[_innerProp] = iterate(prop + \"-\" + _innerProp, value[_innerProp], options);\n            break;\n\n          case \"array\":\n            for (var i = 0; i < value.length; i++) value[i] = iterate(prop, value[i], options);\n            break;\n\n          case \"number\":\n            0 !== value && (convertedValue = value + (options[prop] || units[prop] || \"\"));\n        }\n        return convertedValue;\n    }\n    function defaultUnit() {\n        function onProcessStyle(style, rule) {\n            if (\"style\" !== rule.type) return style;\n            for (var prop in style) style[prop] = iterate(prop, style[prop], camelCasedOptions);\n            return style;\n        }\n        function onChangeValue(value, prop) {\n            return iterate(prop, value, camelCasedOptions);\n        }\n        var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, camelCasedOptions = addCamelCasedVersion(options);\n        return {\n            onProcessStyle: onProcessStyle,\n            onChangeValue: onChangeValue\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n    exports.default = defaultUnit;\n    var _defaultUnits = __webpack_require__(487), _defaultUnits2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_defaultUnits), units = addCamelCasedVersion(_defaultUnits2.default);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = {\n        \"animation-delay\": \"ms\",\n        \"animation-duration\": \"ms\",\n        \"background-position\": \"px\",\n        \"background-position-x\": \"px\",\n        \"background-position-y\": \"px\",\n        \"background-size\": \"px\",\n        border: \"px\",\n        \"border-bottom\": \"px\",\n        \"border-bottom-left-radius\": \"px\",\n        \"border-bottom-right-radius\": \"px\",\n        \"border-bottom-width\": \"px\",\n        \"border-left\": \"px\",\n        \"border-left-width\": \"px\",\n        \"border-radius\": \"px\",\n        \"border-right\": \"px\",\n        \"border-right-width\": \"px\",\n        \"border-spacing\": \"px\",\n        \"border-top\": \"px\",\n        \"border-top-left-radius\": \"px\",\n        \"border-top-right-radius\": \"px\",\n        \"border-top-width\": \"px\",\n        \"border-width\": \"px\",\n        \"border-after-width\": \"px\",\n        \"border-before-width\": \"px\",\n        \"border-end-width\": \"px\",\n        \"border-horizontal-spacing\": \"px\",\n        \"border-start-width\": \"px\",\n        \"border-vertical-spacing\": \"px\",\n        bottom: \"px\",\n        \"box-shadow\": \"px\",\n        \"column-gap\": \"px\",\n        \"column-rule\": \"px\",\n        \"column-rule-width\": \"px\",\n        \"column-width\": \"px\",\n        \"flex-basis\": \"px\",\n        \"font-size\": \"px\",\n        \"font-size-delta\": \"px\",\n        height: \"px\",\n        left: \"px\",\n        \"letter-spacing\": \"px\",\n        \"logical-height\": \"px\",\n        \"logical-width\": \"px\",\n        margin: \"px\",\n        \"margin-after\": \"px\",\n        \"margin-before\": \"px\",\n        \"margin-bottom\": \"px\",\n        \"margin-left\": \"px\",\n        \"margin-right\": \"px\",\n        \"margin-top\": \"px\",\n        \"max-height\": \"px\",\n        \"max-width\": \"px\",\n        \"margin-end\": \"px\",\n        \"margin-start\": \"px\",\n        \"mask-position-x\": \"px\",\n        \"mask-position-y\": \"px\",\n        \"mask-size\": \"px\",\n        \"max-logical-height\": \"px\",\n        \"max-logical-width\": \"px\",\n        \"min-height\": \"px\",\n        \"min-width\": \"px\",\n        \"min-logical-height\": \"px\",\n        \"min-logical-width\": \"px\",\n        motion: \"px\",\n        \"motion-offset\": \"px\",\n        outline: \"px\",\n        \"outline-offset\": \"px\",\n        \"outline-width\": \"px\",\n        padding: \"px\",\n        \"padding-bottom\": \"px\",\n        \"padding-left\": \"px\",\n        \"padding-right\": \"px\",\n        \"padding-top\": \"px\",\n        \"padding-after\": \"px\",\n        \"padding-before\": \"px\",\n        \"padding-end\": \"px\",\n        \"padding-start\": \"px\",\n        \"perspective-origin-x\": \"%\",\n        \"perspective-origin-y\": \"%\",\n        perspective: \"px\",\n        right: \"px\",\n        \"shape-margin\": \"px\",\n        size: \"px\",\n        \"text-indent\": \"px\",\n        \"text-stroke\": \"px\",\n        \"text-stroke-width\": \"px\",\n        top: \"px\",\n        \"transform-origin\": \"%\",\n        \"transform-origin-x\": \"%\",\n        \"transform-origin-y\": \"%\",\n        \"transform-origin-z\": \"%\",\n        \"transition-delay\": \"ms\",\n        \"transition-duration\": \"ms\",\n        \"vertical-align\": \"px\",\n        width: \"px\",\n        \"word-spacing\": \"px\",\n        \"box-shadow-x\": \"px\",\n        \"box-shadow-y\": \"px\",\n        \"box-shadow-blur\": \"px\",\n        \"box-shadow-spread\": \"px\",\n        \"font-line-height\": \"px\",\n        \"text-shadow-x\": \"px\",\n        \"text-shadow-y\": \"px\",\n        \"text-shadow-blur\": \"px\"\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function jssVendorPrefixer() {\n        function onProcessRule(rule) {\n            \"keyframes\" === rule.type && (rule.key = \"@\" + vendor.prefix.css + rule.key.substr(1));\n        }\n        function onProcessStyle(style, rule) {\n            if (\"style\" !== rule.type) return style;\n            for (var prop in style) {\n                var value = style[prop], changeProp = !1, supportedProp = vendor.supportedProperty(prop);\n                supportedProp && supportedProp !== prop && (changeProp = !0);\n                var changeValue = !1, supportedValue = vendor.supportedValue(supportedProp, value);\n                supportedValue && supportedValue !== value && (changeValue = !0), (changeProp || changeValue) && (changeProp && delete style[prop], \n                style[supportedProp || prop] = supportedValue || value);\n            }\n            return style;\n        }\n        function onChangeValue(value, prop) {\n            return vendor.supportedValue(prop, value);\n        }\n        return {\n            onProcessRule: onProcessRule,\n            onProcessStyle: onProcessStyle,\n            onChangeValue: onChangeValue\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = jssVendorPrefixer;\n    var _cssVendor = __webpack_require__(489), vendor = function(obj) {\n        if (obj && obj.__esModule) return obj;\n        var newObj = {};\n        if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);\n        return newObj.default = obj, newObj;\n    }(_cssVendor);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.supportedValue = exports.supportedProperty = exports.prefix = void 0;\n    var _prefix = __webpack_require__(165), _prefix2 = _interopRequireDefault(_prefix), _supportedProperty = __webpack_require__(490), _supportedProperty2 = _interopRequireDefault(_supportedProperty), _supportedValue = __webpack_require__(492), _supportedValue2 = _interopRequireDefault(_supportedValue);\n    exports.default = {\n        prefix: _prefix2.default,\n        supportedProperty: _supportedProperty2.default,\n        supportedValue: _supportedValue2.default\n    }, exports.prefix = _prefix2.default, exports.supportedProperty = _supportedProperty2.default, \n    exports.supportedValue = _supportedValue2.default;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function supportedProperty(prop) {\n        return el ? null != cache[prop] ? cache[prop] : ((0, _camelize2.default)(prop) in el.style ? cache[prop] = prop : _prefix2.default.js + (0, \n        _camelize2.default)(\"-\" + prop) in el.style ? cache[prop] = _prefix2.default.css + prop : cache[prop] = !1, \n        cache[prop]) : prop;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = supportedProperty;\n    var _isInBrowser = __webpack_require__(112), _isInBrowser2 = _interopRequireDefault(_isInBrowser), _prefix = __webpack_require__(165), _prefix2 = _interopRequireDefault(_prefix), _camelize = __webpack_require__(491), _camelize2 = _interopRequireDefault(_camelize), el = void 0, cache = {};\n    if (_isInBrowser2.default) {\n        el = document.createElement(\"p\");\n        var computed = window.getComputedStyle(document.documentElement, \"\");\n        for (var key in computed) isNaN(key) || (cache[computed[key]] = computed[key]);\n    }\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function camelize(str) {\n        return str.replace(regExp, toUpper);\n    }\n    function toUpper(match, c) {\n        return c ? c.toUpperCase() : \"\";\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = camelize;\n    var regExp = /[-\\s]+(.)?/g;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function supportedValue(property, value) {\n        if (!el) return value;\n        if (\"string\" != typeof value || !isNaN(parseInt(value, 10))) return value;\n        var cacheKey = property + value;\n        if (null != cache[cacheKey]) return cache[cacheKey];\n        try {\n            el.style[property] = value;\n        } catch (err) {\n            return cache[cacheKey] = !1, !1;\n        }\n        return \"\" !== el.style[property] ? cache[cacheKey] = value : (value = _prefix2.default.css + value, \n        \"-ms-flex\" === value && (value = \"-ms-flexbox\"), el.style[property] = value, \"\" !== el.style[property] && (cache[cacheKey] = value)), \n        cache[cacheKey] || (cache[cacheKey] = !1), el.style[property] = \"\", cache[cacheKey];\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = supportedValue;\n    var _isInBrowser = __webpack_require__(112), _isInBrowser2 = _interopRequireDefault(_isInBrowser), _prefix = __webpack_require__(165), _prefix2 = _interopRequireDefault(_prefix), cache = {}, el = void 0;\n    _isInBrowser2.default && (el = document.createElement(\"p\"));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function jssPropsSort() {\n        function sort(prop0, prop1) {\n            return prop0.length - prop1.length;\n        }\n        function onProcessStyle(style, rule) {\n            if (\"style\" !== rule.type) return style;\n            var newStyle = {}, props = Object.keys(style).sort(sort);\n            for (var prop in props) newStyle[props[prop]] = style[props[prop]];\n            return newStyle;\n        }\n        return {\n            onProcessStyle: onProcessStyle\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = jssPropsSort;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function createGenerateClassName() {\n            var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, _options$dangerouslyU = options.dangerouslyUseGlobalCSS, dangerouslyUseGlobalCSS = void 0 !== _options$dangerouslyU && _options$dangerouslyU, _options$productionPr = options.productionPrefix, productionPrefix = void 0 === _options$productionPr ? \"jss\" : _options$productionPr, escapeRegex = /([[\\].#*$><+~=|^:(),\"'` + (\"`\" + `\\s])/g, ruleCounter = 0;\n            return \"production\" === process.env.NODE_ENV && \"undefined\" != typeof window && \"jss\" === productionPrefix && (generatorCounter += 1) > 2 && console.error([ \"Material-UI: we have detected more than needed creation of the class name generator.\", \"You should only use one class name generator on the client side.\", \"If you do otherwise, you take the risk to have conflicting class names in production.\" ].join(\"\\n\")), \n            function(rule, styleSheet) {\n                if (ruleCounter += 1, \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(ruleCounter < 1e10, [ \"Material-UI: you might have a memory leak.\", \"The ruleCounter is not supposed to grow that much.\" ].join(\"\")), \n                dangerouslyUseGlobalCSS) {\n                    if (styleSheet && styleSheet.options.classNamePrefix) {\n                        var prefix = styleSheet.options.classNamePrefix;\n                        if (prefix = prefix.replace(escapeRegex, \"-\"), prefix.match(/^Mui/)) return prefix + \"-\" + rule.key;\n                        if (\"production\" !== process.env.NODE_ENV) return prefix + \"-\" + rule.key + \"-\" + ruleCounter;\n                    }\n                    return \"production\" === process.env.NODE_ENV ? \"\" + productionPrefix + ruleCounter : rule.key + \"-\" + ruleCounter;\n                }\n                if (\"production\" === process.env.NODE_ENV) return \"\" + productionPrefix + ruleCounter;\n                if (styleSheet && styleSheet.options.classNamePrefix) {\n                    var _prefix = styleSheet.options.classNamePrefix;\n                    return (_prefix = _prefix.replace(escapeRegex, \"-\")) + \"-\" + rule.key + \"-\" + ruleCounter;\n                }\n                return rule.key + \"-\" + ruleCounter;\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.default = createGenerateClassName;\n        var _warning = __webpack_require__(11), _warning2 = function(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }(_warning), generatorCounter = 0;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function getStylesCreator(stylesOrCreator) {\n            function create(theme, name) {\n                var styles = themingEnabled ? stylesOrCreator(theme) : stylesOrCreator;\n                if (!theme.overrides || !name || !theme.overrides[name]) return styles;\n                var overrides = theme.overrides[name], stylesWithOverrides = (0, _extends3.default)({}, styles);\n                return (0, _keys2.default)(overrides).forEach(function(key) {\n                    \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(stylesWithOverrides[key], [ \"Material-UI: you are trying to override a style that does not exist.\", \"Fix the `)) + (\"`\" + (`\" + key + \"` + \"`\"))))) + ((((` key of ` + (\"`\" + `theme.overrides.\" + name + \"`)) + (\"`\" + (`.\" ].join(\"\\n\")), \n                    stylesWithOverrides[key] = (0, _deepmerge2.default)(stylesWithOverrides[key], overrides[key]);\n                }), stylesWithOverrides;\n            }\n            var themingEnabled = \"function\" == typeof stylesOrCreator;\n            return {\n                create: create,\n                options: {},\n                themingEnabled: themingEnabled\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _deepmerge = __webpack_require__(108), _deepmerge2 = _interopRequireDefault(_deepmerge);\n        exports.default = getStylesCreator;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _AppBar = __webpack_require__(497), _AppBar2 = _interopRequireDefault(_AppBar), _Toolbar = __webpack_require__(501), _Toolbar2 = _interopRequireDefault(_Toolbar), _IconButton = __webpack_require__(503), _IconButton2 = _interopRequireDefault(_IconButton), _Icon = __webpack_require__(258), _Icon2 = _interopRequireDefault(_Icon), _Menu = __webpack_require__(523), _Menu2 = _interopRequireDefault(_Menu), _Typography = __webpack_require__(113), _Typography2 = _interopRequireDefault(_Typography), styles = {\n        header: {\n            height: \"8%\"\n        },\n        toolbar: {\n            height: \"100%\"\n        }\n    }, themeStyles = function(theme) {\n        return {\n            header: {\n                backgroundColor: theme.palette.grey[900],\n                color: theme.palette.getContrastText(theme.palette.grey[900]),\n                zIndex: theme.zIndex.appBar\n            },\n            toolbar: {\n                paddingLeft: theme.spacing.unit,\n                paddingRight: theme.spacing.unit\n            },\n            title: {\n                paddingLeft: theme.spacing.unit,\n                fontSize: 3 * theme.spacing.unit\n            }\n        };\n    }, Header = function(_Component) {\n        function Header() {\n            return _classCallCheck(this, Header), _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments));\n        }\n        return _inherits(Header, _Component), _createClass(Header, [ {\n            key: \"render\",\n            value: function() {\n                var classes = this.props.classes;\n                return _react2.default.createElement(_AppBar2.default, {\n                    position: \"static\",\n                    className: classes.header,\n                    style: styles.header\n                }, _react2.default.createElement(_Toolbar2.default, {\n                    className: classes.toolbar,\n                    style: styles.toolbar\n                }, _react2.default.createElement(_IconButton2.default, {\n                    onClick: this.props.switchSideBar\n                }, _react2.default.createElement(_Icon2.default, null, _react2.default.createElement(_Menu2.default, null))), _react2.default.createElement(_Typography2.default, {\n                    type: \"title\",\n                    color: \"inherit\",\n                    noWrap: !0,\n                    className: classes.title\n                }, \"Go Ethereum Dashboard\")));\n            }\n        } ]), Header;\n    }(_react.Component);\n    exports.default = (0, _withStyles2.default)(themeStyles)(Header);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _AppBar = __webpack_require__(498);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_AppBar).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function AppBar(props) {\n            var _classNames, children = props.children, classes = props.classes, classNameProp = props.className, color = props.color, position = props.position, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\", \"color\", \"position\" ]), className = (0, \n            _classnames2.default)(classes.root, classes[\"position\" + (0, _helpers.capitalize)(position)], (_classNames = {}, \n            (0, _defineProperty3.default)(_classNames, classes[\"color\" + (0, _helpers.capitalize)(color)], \"inherit\" !== color), \n            (0, _defineProperty3.default)(_classNames, \"mui-fixed\", \"fixed\" === position), _classNames), classNameProp);\n            return _react2.default.createElement(_Paper2.default, (0, _extends3.default)({\n                square: !0,\n                component: \"header\",\n                elevation: 4,\n                className: className\n            }, other), children);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(56), _Paper = __webpack_require__(499), _Paper2 = _interopRequireDefault(_Paper), styles = exports.styles = function(theme) {\n            var backgroundColorDefault = \"light\" === theme.palette.type ? theme.palette.grey[100] : theme.palette.grey[900];\n            return {\n                root: {\n                    display: \"flex\",\n                    flexDirection: \"column\",\n                    width: \"100%\",\n                    boxSizing: \"border-box\",\n                    zIndex: theme.zIndex.appBar,\n                    flexShrink: 0\n                },\n                positionFixed: {\n                    position: \"fixed\",\n                    top: 0,\n                    left: \"auto\",\n                    right: 0\n                },\n                positionAbsolute: {\n                    position: \"absolute\",\n                    top: 0,\n                    left: \"auto\",\n                    right: 0\n                },\n                positionSticky: {\n                    position: \"sticky\",\n                    top: 0,\n                    left: \"auto\",\n                    right: 0\n                },\n                positionStatic: {\n                    position: \"static\"\n                },\n                colorDefault: {\n                    backgroundColor: backgroundColorDefault,\n                    color: theme.palette.getContrastText(backgroundColorDefault)\n                },\n                colorPrimary: {\n                    backgroundColor: theme.palette.primary.main,\n                    color: theme.palette.primary.contrastText\n                },\n                colorSecondary: {\n                    backgroundColor: theme.palette.secondary.main,\n                    color: theme.palette.secondary.contrastText\n                }\n            };\n        };\n        AppBar.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node.isRequired,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            color: _propTypes2.default.oneOf([ \"inherit\", \"primary\", \"secondary\", \"default\" ]),\n            position: _propTypes2.default.oneOf([ \"fixed\", \"absolute\", \"sticky\", \"static\" ])\n        } : {}, AppBar.defaultProps = {\n            color: \"primary\",\n            position: \"fixed\"\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiAppBar\"\n        })(AppBar);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _Paper = __webpack_require__(500);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_Paper).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function Paper(props) {\n            var classes = props.classes, classNameProp = props.className, Component = props.component, square = props.square, elevation = props.elevation, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"classes\", \"className\", \"component\", \"square\", \"elevation\" ]);\n            \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(elevation >= 0 && elevation < 25, \"Material-UI: this elevation ` + \"`\"))) + ((`\" + elevation + \"` + (\"`\" + ` is not implemented.\");\n            var className = (0, _classnames2.default)(classes.root, classes[\"shadow\" + elevation], (0, \n            _defineProperty3.default)({}, classes.rounded, !square), classNameProp);\n            return _react2.default.createElement(Component, (0, _extends3.default)({\n                className: className\n            }, other));\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {\n            var shadows = {};\n            return theme.shadows.forEach(function(shadow, index) {\n                shadows[\"shadow\" + index] = {\n                    boxShadow: shadow\n                };\n            }), (0, _extends3.default)({\n                root: {\n                    backgroundColor: theme.palette.background.paper\n                },\n                rounded: {\n                    borderRadius: 2\n                }\n            }, shadows);\n        };\n        Paper.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            elevation: _propTypes2.default.number,\n            square: _propTypes2.default.bool\n        } : {}, Paper.defaultProps = {\n            component: \"div\",\n            elevation: 2,\n            square: !1\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiPaper\"\n        })(Paper);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _Toolbar = __webpack_require__(502);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_Toolbar).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function Toolbar(props) {\n            var children = props.children, classes = props.classes, classNameProp = props.className, disableGutters = props.disableGutters, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\", \"disableGutters\" ]), className = (0, \n            _classnames2.default)(classes.root, (0, _defineProperty3.default)({}, classes.gutters, !disableGutters), classNameProp);\n            return _react2.default.createElement(\"div\", (0, _extends3.default)({\n                className: className\n            }, other), children);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {\n            return {\n                root: (0, _extends3.default)({\n                    position: \"relative\",\n                    display: \"flex\",\n                    alignItems: \"center\"\n                }, theme.mixins.toolbar),\n                gutters: theme.mixins.gutters({})\n            };\n        };\n        Toolbar.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            disableGutters: _propTypes2.default.bool\n        } : {}, Toolbar.defaultProps = {\n            disableGutters: !1\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiToolbar\"\n        })(Toolbar);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _IconButton = __webpack_require__(504);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_IconButton).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function IconButton(props) {\n            var _classNames, children = props.children, classes = props.classes, className = props.className, color = props.color, disabled = props.disabled, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\", \"color\", \"disabled\" ]);\n            return _react2.default.createElement(_ButtonBase2.default, (0, _extends3.default)({\n                className: (0, _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes[\"color\" + (0, \n                _helpers.capitalize)(color)], \"default\" !== color), (0, _defineProperty3.default)(_classNames, classes.disabled, disabled), \n                _classNames), className),\n                centerRipple: !0,\n                focusRipple: !0,\n                disabled: disabled\n            }, other), _react2.default.createElement(\"span\", {\n                className: classes.label\n            }, _react2.default.Children.map(children, function(child) {\n                return (0, _reactHelpers.isMuiElement)(child, [ \"Icon\", \"SvgIcon\" ]) ? _react2.default.cloneElement(child, {\n                    fontSize: !0\n                }) : child;\n            })));\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _ButtonBase = __webpack_require__(252), _ButtonBase2 = _interopRequireDefault(_ButtonBase), _helpers = __webpack_require__(56), _reactHelpers = __webpack_require__(256);\n        __webpack_require__(257);\n        var styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    textAlign: \"center\",\n                    flex: \"0 0 auto\",\n                    fontSize: theme.typography.pxToRem(24),\n                    width: 6 * theme.spacing.unit,\n                    height: 6 * theme.spacing.unit,\n                    padding: 0,\n                    borderRadius: \"50%\",\n                    color: theme.palette.action.active,\n                    transition: theme.transitions.create(\"background-color\", {\n                        duration: theme.transitions.duration.shortest\n                    })\n                },\n                colorInherit: {\n                    color: \"inherit\"\n                },\n                colorPrimary: {\n                    color: theme.palette.primary.main\n                },\n                colorSecondary: {\n                    color: theme.palette.secondary.main\n                },\n                disabled: {\n                    color: theme.palette.action.disabled\n                },\n                label: {\n                    width: \"100%\",\n                    display: \"flex\",\n                    alignItems: \"inherit\",\n                    justifyContent: \"inherit\"\n                }\n            };\n        };\n        IconButton.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            color: _propTypes2.default.oneOf([ \"default\", \"inherit\", \"primary\", \"secondary\" ]),\n            disabled: _propTypes2.default.bool,\n            disableRipple: _propTypes2.default.bool\n        } : {}, IconButton.defaultProps = {\n            color: \"default\",\n            disabled: !1,\n            disableRipple: !1\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiIconButton\"\n        })(IconButton);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _reactDom = __webpack_require__(99), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _keycode = __webpack_require__(253), _keycode2 = _interopRequireDefault(_keycode), _ownerWindow = __webpack_require__(506), _ownerWindow2 = _interopRequireDefault(_ownerWindow), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _keyboardFocus = __webpack_require__(507), _TouchRipple = __webpack_require__(510), _TouchRipple2 = _interopRequireDefault(_TouchRipple), _createRippleHandler = __webpack_require__(520), _createRippleHandler2 = _interopRequireDefault(_createRippleHandler), styles = exports.styles = {\n            root: {\n                display: \"inline-flex\",\n                alignItems: \"center\",\n                justifyContent: \"center\",\n                position: \"relative\",\n                WebkitTapHighlightColor: \"transparent\",\n                backgroundColor: \"transparent\",\n                outline: \"none\",\n                border: 0,\n                margin: 0,\n                borderRadius: 0,\n                padding: 0,\n                cursor: \"pointer\",\n                userSelect: \"none\",\n                verticalAlign: \"middle\",\n                \"-moz-appearance\": \"none\",\n                \"-webkit-appearance\": \"none\",\n                textDecoration: \"none\",\n                color: \"inherit\",\n                \"&::-moz-focus-inner\": {\n                    borderStyle: \"none\"\n                }\n            },\n            disabled: {\n                pointerEvents: \"none\",\n                cursor: \"default\"\n            }\n        }, ButtonBase = function(_React$Component) {\n            function ButtonBase() {\n                var _ref, _temp, _this, _ret;\n                (0, _classCallCheck3.default)(this, ButtonBase);\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n                return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = ButtonBase.__proto__ || (0, \n                _getPrototypeOf2.default)(ButtonBase)).call.apply(_ref, [ this ].concat(args))), \n                _this.state = {\n                    keyboardFocused: !1\n                }, _this.onKeyboardFocusHandler = function(event) {\n                    _this.keyDown = !1, _this.setState({\n                        keyboardFocused: !0\n                    }), _this.props.onKeyboardFocus && _this.props.onKeyboardFocus(event);\n                }, _this.onRippleRef = function(node) {\n                    _this.ripple = node;\n                }, _this.ripple = null, _this.keyDown = !1, _this.button = null, _this.keyboardFocusTimeout = null, \n                _this.keyboardFocusCheckTime = 50, _this.keyboardFocusMaxCheckTimes = 5, _this.handleKeyDown = function(event) {\n                    var _this$props = _this.props, component = _this$props.component, focusRipple = _this$props.focusRipple, onKeyDown = _this$props.onKeyDown, onClick = _this$props.onClick, key = (0, \n                    _keycode2.default)(event);\n                    focusRipple && !_this.keyDown && _this.state.keyboardFocused && _this.ripple && \"space\" === key && (_this.keyDown = !0, \n                    event.persist(), _this.ripple.stop(event, function() {\n                        _this.ripple.start(event);\n                    })), onKeyDown && onKeyDown(event), event.target !== event.currentTarget || !component || \"button\" === component || \"space\" !== key && \"enter\" !== key || (event.preventDefault(), \n                    onClick && onClick(event));\n                }, _this.handleKeyUp = function(event) {\n                    _this.props.focusRipple && \"space\" === (0, _keycode2.default)(event) && _this.ripple && _this.state.keyboardFocused && (_this.keyDown = !1, \n                    event.persist(), _this.ripple.stop(event, function() {\n                        return _this.ripple.pulsate(event);\n                    })), _this.props.onKeyUp && _this.props.onKeyUp(event);\n                }, _this.handleMouseDown = (0, _createRippleHandler2.default)(_this, \"MouseDown\", \"start\", function() {\n                    clearTimeout(_this.keyboardFocusTimeout), (0, _keyboardFocus.focusKeyPressed)(!1), \n                    _this.state.keyboardFocused && _this.setState({\n                        keyboardFocused: !1\n                    });\n                }), _this.handleMouseUp = (0, _createRippleHandler2.default)(_this, \"MouseUp\", \"stop\"), \n                _this.handleMouseLeave = (0, _createRippleHandler2.default)(_this, \"MouseLeave\", \"stop\", function(event) {\n                    _this.state.keyboardFocused && event.preventDefault();\n                }), _this.handleTouchStart = (0, _createRippleHandler2.default)(_this, \"TouchStart\", \"start\"), \n                _this.handleTouchEnd = (0, _createRippleHandler2.default)(_this, \"TouchEnd\", \"stop\"), \n                _this.handleTouchMove = (0, _createRippleHandler2.default)(_this, \"TouchEnd\", \"stop\"), \n                _this.handleBlur = (0, _createRippleHandler2.default)(_this, \"Blur\", \"stop\", function() {\n                    clearTimeout(_this.keyboardFocusTimeout), (0, _keyboardFocus.focusKeyPressed)(!1), \n                    _this.setState({\n                        keyboardFocused: !1\n                    });\n                }), _this.handleFocus = function(event) {\n                    _this.props.disabled || (_this.button || (_this.button = event.currentTarget), event.persist(), \n                    (0, _keyboardFocus.detectKeyboardFocus)(_this, _this.button, function() {\n                        _this.onKeyboardFocusHandler(event);\n                    }), _this.props.onFocus && _this.props.onFocus(event));\n                }, _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);\n            }\n            return (0, _inherits3.default)(ButtonBase, _React$Component), (0, _createClass3.default)(ButtonBase, [ {\n                key: \"componentDidMount\",\n                value: function() {\n                    this.button = (0, _reactDom.findDOMNode)(this), (0, _keyboardFocus.listenForFocusKeys)((0, \n                    _ownerWindow2.default)(this.button));\n                }\n            }, {\n                key: \"componentWillReceiveProps\",\n                value: function(nextProps) {\n                    !this.props.disabled && nextProps.disabled && this.state.keyboardFocused && this.setState({\n                        keyboardFocused: !1\n                    });\n                }\n            }, {\n                key: \"componentWillUpdate\",\n                value: function(nextProps, nextState) {\n                    this.props.focusRipple && nextState.keyboardFocused && !this.state.keyboardFocused && !this.props.disableRipple && this.ripple.pulsate();\n                }\n            }, {\n                key: \"componentWillUnmount\",\n                value: function() {\n                    this.button = null, clearTimeout(this.keyboardFocusTimeout);\n                }\n            }, {\n                key: \"render\",\n                value: function() {\n                    var _classNames, _props = this.props, buttonRef = _props.buttonRef, centerRipple = _props.centerRipple, children = _props.children, classes = _props.classes, classNameProp = _props.className, component = _props.component, disabled = _props.disabled, disableRipple = _props.disableRipple, keyboardFocusedClassName = (_props.focusRipple, \n                    _props.keyboardFocusedClassName), tabIndex = (_props.onBlur, _props.onFocus, _props.onKeyboardFocus, \n                    _props.onKeyDown, _props.onKeyUp, _props.onMouseDown, _props.onMouseLeave, _props.onMouseUp, \n                    _props.onTouchEnd, _props.onTouchMove, _props.onTouchStart, _props.tabIndex), type = _props.type, other = (0, \n                    _objectWithoutProperties3.default)(_props, [ \"buttonRef\", \"centerRipple\", \"children\", \"classes\", \"className\", \"component\", \"disabled\", \"disableRipple\", \"focusRipple\", \"keyboardFocusedClassName\", \"onBlur\", \"onFocus\", \"onKeyboardFocus\", \"onKeyDown\", \"onKeyUp\", \"onMouseDown\", \"onMouseLeave\", \"onMouseUp\", \"onTouchEnd\", \"onTouchMove\", \"onTouchStart\", \"tabIndex\", \"type\" ]), className = (0, \n                    _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.disabled, disabled), \n                    (0, _defineProperty3.default)(_classNames, keyboardFocusedClassName || \"\", this.state.keyboardFocused), \n                    _classNames), classNameProp), buttonProps = {}, ComponentProp = component;\n                    return ComponentProp || (ComponentProp = other.href ? \"a\" : \"button\"), \"button\" === ComponentProp ? (buttonProps.type = type || \"button\", \n                    buttonProps.disabled = disabled) : buttonProps.role = \"button\", _react2.default.createElement(ComponentProp, (0, \n                    _extends3.default)({\n                        onBlur: this.handleBlur,\n                        onFocus: this.handleFocus,\n                        onKeyDown: this.handleKeyDown,\n                        onKeyUp: this.handleKeyUp,\n                        onMouseDown: this.handleMouseDown,\n                        onMouseLeave: this.handleMouseLeave,\n                        onMouseUp: this.handleMouseUp,\n                        onTouchEnd: this.handleTouchEnd,\n                        onTouchMove: this.handleTouchMove,\n                        onTouchStart: this.handleTouchStart,\n                        tabIndex: disabled ? \"-1\" : tabIndex,\n                        className: className,\n                        ref: buttonRef\n                    }, buttonProps, other), children, disableRipple || disabled ? null : _react2.default.createElement(_TouchRipple2.default, {\n                        innerRef: this.onRippleRef,\n                        center: centerRipple\n                    }));\n                }\n            } ]), ButtonBase;\n        }(_react2.default.Component);\n        ButtonBase.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            buttonRef: _propTypes2.default.func,\n            centerRipple: _propTypes2.default.bool,\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            disabled: _propTypes2.default.bool,\n            disableRipple: _propTypes2.default.bool,\n            focusRipple: _propTypes2.default.bool,\n            keyboardFocusedClassName: _propTypes2.default.string,\n            onBlur: _propTypes2.default.func,\n            onClick: _propTypes2.default.func,\n            onFocus: _propTypes2.default.func,\n            onKeyboardFocus: _propTypes2.default.func,\n            onKeyDown: _propTypes2.default.func,\n            onKeyUp: _propTypes2.default.func,\n            onMouseDown: _propTypes2.default.func,\n            onMouseLeave: _propTypes2.default.func,\n            onMouseUp: _propTypes2.default.func,\n            onTouchEnd: _propTypes2.default.func,\n            onTouchMove: _propTypes2.default.func,\n            onTouchStart: _propTypes2.default.func,\n            role: _propTypes2.default.string,\n            tabIndex: _propTypes2.default.oneOfType([ _propTypes2.default.number, _propTypes2.default.string ]),\n            type: _propTypes2.default.string\n        } : {}, ButtonBase.defaultProps = {\n            centerRipple: !1,\n            disableRipple: !1,\n            focusRipple: !1,\n            tabIndex: \"0\",\n            type: \"button\"\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiButtonBase\"\n        })(ButtonBase);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function ownerWindow(node) {\n        var doc = (0, _ownerDocument2.default)(node);\n        return doc && doc.defaultView || doc.parentWindow;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = ownerWindow;\n    var _ownerDocument = __webpack_require__(254), _ownerDocument2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_ownerDocument);\n    module.exports = exports.default;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function focusKeyPressed(pressed) {\n            return void 0 !== pressed && (internal.focusKeyPressed = Boolean(pressed)), internal.focusKeyPressed;\n        }\n        function detectKeyboardFocus(instance, element, callback) {\n            var attempt = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 1;\n            \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(instance.keyboardFocusCheckTime, \"Material-UI: missing instance.keyboardFocusCheckTime\"), \n            \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(instance.keyboardFocusMaxCheckTimes, \"Material-UI: missing instance.keyboardFocusMaxCheckTimes\"), \n            instance.keyboardFocusTimeout = setTimeout(function() {\n                var doc = (0, _ownerDocument2.default)(element);\n                focusKeyPressed() && (doc.activeElement === element || (0, _contains2.default)(element, doc.activeElement)) ? callback() : attempt < instance.keyboardFocusMaxCheckTimes && detectKeyboardFocus(instance, element, callback, attempt + 1);\n            }, instance.keyboardFocusCheckTime);\n        }\n        function isFocusKey(event) {\n            return -1 !== FOCUS_KEYS.indexOf((0, _keycode2.default)(event));\n        }\n        function listenForFocusKeys(win) {\n            win.addEventListener(\"keyup\", handleKeyUpEvent);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.focusKeyPressed = focusKeyPressed, exports.detectKeyboardFocus = detectKeyboardFocus, \n        exports.listenForFocusKeys = listenForFocusKeys;\n        var _keycode = __webpack_require__(253), _keycode2 = _interopRequireDefault(_keycode), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _contains = __webpack_require__(508), _contains2 = _interopRequireDefault(_contains), _ownerDocument = __webpack_require__(254), _ownerDocument2 = _interopRequireDefault(_ownerDocument), internal = {\n            focusKeyPressed: !1\n        }, FOCUS_KEYS = [ \"tab\", \"enter\", \"space\", \"esc\", \"up\", \"down\", \"left\", \"right\" ], handleKeyUpEvent = function(event) {\n            isFocusKey(event) && (internal.focusKeyPressed = !0);\n        };\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function fallback(context, node) {\n        if (node) do {\n            if (node === context) return !0;\n        } while (node = node.parentNode);\n        return !1;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _inDOM = __webpack_require__(509), _inDOM2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_inDOM);\n    exports.default = function() {\n        return _inDOM2.default ? function(context, node) {\n            return context.contains ? context.contains(node) : context.compareDocumentPosition ? context === node || !!(16 & context.compareDocumentPosition(node)) : fallback(context, node);\n        } : fallback;\n    }(), module.exports = exports.default;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = !(\"undefined\" == typeof window || !window.document || !window.document.createElement), \n    module.exports = exports.default;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = exports.DELAY_RIPPLE = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _toConsumableArray2 = __webpack_require__(511), _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _reactDom = __webpack_require__(99), _reactDom2 = _interopRequireDefault(_reactDom), _TransitionGroup = __webpack_require__(255), _TransitionGroup2 = _interopRequireDefault(_TransitionGroup), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Ripple = __webpack_require__(518), _Ripple2 = _interopRequireDefault(_Ripple), DURATION = 550, DELAY_RIPPLE = exports.DELAY_RIPPLE = 80, styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    display: \"block\",\n                    position: \"absolute\",\n                    overflow: \"hidden\",\n                    borderRadius: \"inherit\",\n                    width: \"100%\",\n                    height: \"100%\",\n                    left: 0,\n                    top: 0,\n                    pointerEvents: \"none\",\n                    zIndex: 0\n                },\n                wrapper: {\n                    opacity: 1\n                },\n                wrapperLeaving: {\n                    opacity: 0,\n                    animation: \"mui-ripple-exit \" + DURATION + \"ms \" + theme.transitions.easing.easeInOut\n                },\n                wrapperPulsating: {\n                    position: \"absolute\",\n                    left: 0,\n                    top: 0,\n                    display: \"block\",\n                    width: \"100%\",\n                    height: \"100%\",\n                    animation: \"mui-ripple-pulsate 2500ms \" + theme.transitions.easing.easeInOut + \" 200ms infinite\"\n                },\n                \"@keyframes mui-ripple-enter\": {\n                    \"0%\": {\n                        transform: \"scale(0)\"\n                    },\n                    \"100%\": {\n                        transform: \"scale(1)\"\n                    }\n                },\n                \"@keyframes mui-ripple-exit\": {\n                    \"0%\": {\n                        opacity: 1\n                    },\n                    \"100%\": {\n                        opacity: 0\n                    }\n                },\n                \"@keyframes mui-ripple-pulsate\": {\n                    \"0%\": {\n                        transform: \"scale(1)\"\n                    },\n                    \"50%\": {\n                        transform: \"scale(0.92)\"\n                    },\n                    \"100%\": {\n                        transform: \"scale(1)\"\n                    }\n                },\n                ripple: {\n                    width: 50,\n                    height: 50,\n                    left: 0,\n                    top: 0,\n                    opacity: 0,\n                    position: \"absolute\",\n                    borderRadius: \"50%\",\n                    background: \"currentColor\"\n                },\n                rippleVisible: {\n                    opacity: .3,\n                    transform: \"scale(1)\",\n                    animation: \"mui-ripple-enter \" + DURATION + \"ms \" + theme.transitions.easing.easeInOut\n                },\n                rippleFast: {\n                    animationDuration: \"200ms\"\n                }\n            };\n        }, TouchRipple = function(_React$Component) {\n            function TouchRipple() {\n                var _ref, _temp, _this, _ret;\n                (0, _classCallCheck3.default)(this, TouchRipple);\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n                return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = TouchRipple.__proto__ || (0, \n                _getPrototypeOf2.default)(TouchRipple)).call.apply(_ref, [ this ].concat(args))), \n                _this.state = {\n                    nextKey: 0,\n                    ripples: []\n                }, _this.ignoringMouseDown = !1, _this.startTimer = null, _this.startTimerCommit = null, \n                _this.pulsate = function() {\n                    _this.start({}, {\n                        pulsate: !0\n                    });\n                }, _this.start = function() {\n                    var event = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, cb = arguments[2], _options$pulsate = options.pulsate, pulsate = void 0 !== _options$pulsate && _options$pulsate, _options$center = options.center, center = void 0 === _options$center ? _this.props.center || options.pulsate : _options$center, _options$fakeElement = options.fakeElement, fakeElement = void 0 !== _options$fakeElement && _options$fakeElement;\n                    if (\"mousedown\" === event.type && _this.ignoringMouseDown) return void (_this.ignoringMouseDown = !1);\n                    \"touchstart\" === event.type && (_this.ignoringMouseDown = !0);\n                    var element = fakeElement ? null : _reactDom2.default.findDOMNode(_this), rect = element ? element.getBoundingClientRect() : {\n                        width: 0,\n                        height: 0,\n                        left: 0,\n                        top: 0\n                    }, rippleX = void 0, rippleY = void 0, rippleSize = void 0;\n                    if (center || 0 === event.clientX && 0 === event.clientY || !event.clientX && !event.touches) rippleX = Math.round(rect.width / 2), \n                    rippleY = Math.round(rect.height / 2); else {\n                        var clientX = event.clientX ? event.clientX : event.touches[0].clientX, clientY = event.clientY ? event.clientY : event.touches[0].clientY;\n                        rippleX = Math.round(clientX - rect.left), rippleY = Math.round(clientY - rect.top);\n                    }\n                    if (center) (rippleSize = Math.sqrt((2 * Math.pow(rect.width, 2) + Math.pow(rect.height, 2)) / 3)) % 2 == 0 && (rippleSize += 1); else {\n                        var sizeX = 2 * Math.max(Math.abs((element ? element.clientWidth : 0) - rippleX), rippleX) + 2, sizeY = 2 * Math.max(Math.abs((element ? element.clientHeight : 0) - rippleY), rippleY) + 2;\n                        rippleSize = Math.sqrt(Math.pow(sizeX, 2) + Math.pow(sizeY, 2));\n                    }\n                    event.touches ? (_this.startTimerCommit = function() {\n                        _this.startCommit({\n                            pulsate: pulsate,\n                            rippleX: rippleX,\n                            rippleY: rippleY,\n                            rippleSize: rippleSize,\n                            cb: cb\n                        });\n                    }, _this.startTimer = setTimeout(function() {\n                        _this.startTimerCommit(), _this.startTimerCommit = null;\n                    }, DELAY_RIPPLE)) : _this.startCommit({\n                        pulsate: pulsate,\n                        rippleX: rippleX,\n                        rippleY: rippleY,\n                        rippleSize: rippleSize,\n                        cb: cb\n                    });\n                }, _this.startCommit = function(params) {\n                    var pulsate = params.pulsate, rippleX = params.rippleX, rippleY = params.rippleY, rippleSize = params.rippleSize, cb = params.cb, ripples = _this.state.ripples;\n                    ripples = [].concat((0, _toConsumableArray3.default)(ripples), [ _react2.default.createElement(_Ripple2.default, {\n                        key: _this.state.nextKey,\n                        classes: _this.props.classes,\n                        timeout: {\n                            exit: DURATION,\n                            enter: DURATION\n                        },\n                        pulsate: pulsate,\n                        rippleX: rippleX,\n                        rippleY: rippleY,\n                        rippleSize: rippleSize\n                    }) ]), _this.setState({\n                        nextKey: _this.state.nextKey + 1,\n                        ripples: ripples\n                    }, cb);\n                }, _this.stop = function(event, cb) {\n                    clearTimeout(_this.startTimer);\n                    var ripples = _this.state.ripples;\n                    if (\"touchend\" === event.type && _this.startTimerCommit) return event.persist(), \n                    _this.startTimerCommit(), _this.startTimerCommit = null, void (_this.startTimer = setTimeout(function() {\n                        _this.stop(event, cb);\n                    }, 0));\n                    _this.startTimerCommit = null, ripples && ripples.length && _this.setState({\n                        ripples: ripples.slice(1)\n                    }, cb);\n                }, _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);\n            }\n            return (0, _inherits3.default)(TouchRipple, _React$Component), (0, _createClass3.default)(TouchRipple, [ {\n                key: \"componentWillUnmount\",\n                value: function() {\n                    clearTimeout(this.startTimer);\n                }\n            }, {\n                key: \"render\",\n                value: function() {\n                    var _props = this.props, classes = (_props.center, _props.classes), className = _props.className, other = (0, \n                    _objectWithoutProperties3.default)(_props, [ \"center\", \"classes\", \"className\" ]);\n                    return _react2.default.createElement(_TransitionGroup2.default, (0, _extends3.default)({\n                        component: \"span\",\n                        enter: !0,\n                        exit: !0,\n                        className: (0, _classnames2.default)(classes.root, className)\n                    }, other), this.state.ripples);\n                }\n            } ]), TouchRipple;\n        }(_react2.default.Component);\n        TouchRipple.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            center: _propTypes2.default.bool,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string\n        } : {}, TouchRipple.defaultProps = {\n            center: !1\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            flip: !1,\n            name: \"MuiTouchRipple\"\n        })(TouchRipple);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _from = __webpack_require__(512), _from2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_from);\n    exports.default = function(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return (0, _from2.default)(arr);\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = {\n        default: __webpack_require__(513),\n        __esModule: !0\n    };\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(155), __webpack_require__(514), module.exports = __webpack_require__(17).Array.from;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var ctx = __webpack_require__(51), $export = __webpack_require__(19), toObject = __webpack_require__(65), call = __webpack_require__(239), isArrayIter = __webpack_require__(240), toLength = __webpack_require__(101), createProperty = __webpack_require__(515), getIterFn = __webpack_require__(241);\n    $export($export.S + $export.F * !__webpack_require__(516)(function(iter) {\n        Array.from(iter);\n    }), \"Array\", {\n        from: function(arrayLike) {\n            var length, result, step, iterator, O = toObject(arrayLike), C = \"function\" == typeof this ? this : Array, aLen = arguments.length, mapfn = aLen > 1 ? arguments[1] : void 0, mapping = void 0 !== mapfn, index = 0, iterFn = getIterFn(O);\n            if (mapping && (mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : void 0, 2)), void 0 == iterFn || C == Array && isArrayIter(iterFn)) for (length = toLength(O.length), \n            result = new C(length); length > index; index++) createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); else for (iterator = iterFn.call(O), \n            result = new C(); !(step = iterator.next()).done; index++) createProperty(result, index, mapping ? call(iterator, mapfn, [ step.value, index ], !0) : step.value);\n            return result.length = index, result;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    var $defineProperty = __webpack_require__(22), createDesc = __webpack_require__(75);\n    module.exports = function(object, index, value) {\n        index in object ? $defineProperty.f(object, index, createDesc(0, value)) : object[index] = value;\n    };\n}, function(module, exports, __webpack_require__) {\n    var ITERATOR = __webpack_require__(21)(\"iterator\"), SAFE_CLOSING = !1;\n    try {\n        var riter = [ 7 ][ITERATOR]();\n        riter.return = function() {\n            SAFE_CLOSING = !0;\n        }, Array.from(riter, function() {\n            throw 2;\n        });\n    } catch (e) {}\n    module.exports = function(exec, skipClosing) {\n        if (!skipClosing && !SAFE_CLOSING) return !1;\n        var safe = !1;\n        try {\n            var arr = [ 7 ], iter = arr[ITERATOR]();\n            iter.next = function() {\n                return {\n                    done: safe = !0\n                };\n            }, arr[ITERATOR] = function() {\n                return iter;\n            }, exec(arr);\n        } catch (e) {}\n        return safe;\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function getChildMapping(children, mapFn) {\n        var mapper = function(child) {\n            return mapFn && (0, _react.isValidElement)(child) ? mapFn(child) : child;\n        }, result = Object.create(null);\n        return children && _react.Children.map(children, function(c) {\n            return c;\n        }).forEach(function(child) {\n            result[child.key] = mapper(child);\n        }), result;\n    }\n    function mergeChildMappings(prev, next) {\n        function getValueForKey(key) {\n            return key in next ? next[key] : prev[key];\n        }\n        prev = prev || {}, next = next || {};\n        var nextKeysPending = Object.create(null), pendingKeys = [];\n        for (var prevKey in prev) prevKey in next ? pendingKeys.length && (nextKeysPending[prevKey] = pendingKeys, \n        pendingKeys = []) : pendingKeys.push(prevKey);\n        var i = void 0, childMapping = {};\n        for (var nextKey in next) {\n            if (nextKeysPending[nextKey]) for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n                var pendingNextKey = nextKeysPending[nextKey][i];\n                childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n            }\n            childMapping[nextKey] = getValueForKey(nextKey);\n        }\n        for (i = 0; i < pendingKeys.length; i++) childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n        return childMapping;\n    }\n    exports.__esModule = !0, exports.getChildMapping = getChildMapping, exports.mergeChildMappings = mergeChildMappings;\n    var _react = __webpack_require__(0);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _Transition = __webpack_require__(166), _Transition2 = _interopRequireDefault(_Transition), Ripple = function(_React$Component) {\n            function Ripple() {\n                var _ref, _temp, _this, _ret;\n                (0, _classCallCheck3.default)(this, Ripple);\n                for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n                return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = Ripple.__proto__ || (0, \n                _getPrototypeOf2.default)(Ripple)).call.apply(_ref, [ this ].concat(args))), _this.state = {\n                    rippleVisible: !1,\n                    rippleLeaving: !1\n                }, _this.handleEnter = function() {\n                    _this.setState({\n                        rippleVisible: !0\n                    });\n                }, _this.handleExit = function() {\n                    _this.setState({\n                        rippleLeaving: !0\n                    });\n                }, _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);\n            }\n            return (0, _inherits3.default)(Ripple, _React$Component), (0, _createClass3.default)(Ripple, [ {\n                key: \"render\",\n                value: function() {\n                    var _classNames, _classNames2, _props = this.props, classes = _props.classes, classNameProp = _props.className, pulsate = _props.pulsate, rippleX = _props.rippleX, rippleY = _props.rippleY, rippleSize = _props.rippleSize, other = (0, \n                    _objectWithoutProperties3.default)(_props, [ \"classes\", \"className\", \"pulsate\", \"rippleX\", \"rippleY\", \"rippleSize\" ]), _state = this.state, rippleVisible = _state.rippleVisible, rippleLeaving = _state.rippleLeaving, className = (0, \n                    _classnames2.default)(classes.wrapper, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.wrapperLeaving, rippleLeaving), \n                    (0, _defineProperty3.default)(_classNames, classes.wrapperPulsating, pulsate), _classNames), classNameProp), rippleClassName = (0, \n                    _classnames2.default)(classes.ripple, (_classNames2 = {}, (0, _defineProperty3.default)(_classNames2, classes.rippleVisible, rippleVisible), \n                    (0, _defineProperty3.default)(_classNames2, classes.rippleFast, pulsate), _classNames2)), rippleStyles = {\n                        width: rippleSize,\n                        height: rippleSize,\n                        top: -rippleSize / 2 + rippleY,\n                        left: -rippleSize / 2 + rippleX\n                    };\n                    return _react2.default.createElement(_Transition2.default, (0, _extends3.default)({\n                        onEnter: this.handleEnter,\n                        onExit: this.handleExit\n                    }, other), _react2.default.createElement(\"span\", {\n                        className: className\n                    }, _react2.default.createElement(\"span\", {\n                        className: rippleClassName,\n                        style: rippleStyles\n                    })));\n                }\n            } ]), Ripple;\n        }(_react2.default.Component);\n        Ripple.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            pulsate: _propTypes2.default.bool,\n            rippleSize: _propTypes2.default.number,\n            rippleX: _propTypes2.default.number,\n            rippleY: _propTypes2.default.number\n        } : {}, Ripple.defaultProps = {\n            pulsate: !1\n        }, exports.default = Ripple;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function transitionTimeout(transitionType) {\n        var timeoutPropName = \"transition\" + transitionType + \"Timeout\", enabledPropName = \"transition\" + transitionType;\n        return function(props) {\n            if (props[enabledPropName]) {\n                if (null == props[timeoutPropName]) return new Error(timeoutPropName + \" wasn't supplied to CSSTransitionGroup: this can cause unreliable animations and won't be supported in a future version of React. See https://fb.me/react-animation-transition-group-timeout for more information.\");\n                if (\"number\" != typeof props[timeoutPropName]) return new Error(timeoutPropName + \" must be a number (in milliseconds)\");\n            }\n            return null;\n        };\n    }\n    exports.__esModule = !0, exports.classNamesShape = exports.timeoutsShape = void 0, \n    exports.transitionTimeout = transitionTimeout;\n    var _propTypes = __webpack_require__(1), _propTypes2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_propTypes);\n    exports.timeoutsShape = _propTypes2.default.oneOfType([ _propTypes2.default.number, _propTypes2.default.shape({\n        enter: _propTypes2.default.number,\n        exit: _propTypes2.default.number\n    }).isRequired ]), exports.classNamesShape = _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.shape({\n        enter: _propTypes2.default.string,\n        exit: _propTypes2.default.string,\n        active: _propTypes2.default.string\n    }), _propTypes2.default.shape({\n        enter: _propTypes2.default.string,\n        enterActive: _propTypes2.default.string,\n        exit: _propTypes2.default.string,\n        exitActive: _propTypes2.default.string\n    }) ]);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function createRippleHandler(instance, eventName, action, cb) {\n        return function(event) {\n            return cb && cb.call(instance, event), !event.defaultPrevented && (instance.ripple && instance.ripple[action](event), \n            instance.props && \"function\" == typeof instance.props[\"on\" + eventName] && instance.props[\"on\" + eventName](event), \n            !0);\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = createRippleHandler;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function SvgIcon(props) {\n            var _classNames, children = props.children, classes = props.classes, classNameProp = props.className, color = props.color, fontSize = props.fontSize, nativeColor = props.nativeColor, titleAccess = props.titleAccess, viewBox = props.viewBox, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\", \"color\", \"fontSize\", \"nativeColor\", \"titleAccess\", \"viewBox\" ]), className = (0, \n            _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes[\"color\" + (0, \n            _helpers.capitalize)(color)], \"inherit\" !== color), (0, _defineProperty3.default)(_classNames, classes.fontSize, fontSize), \n            _classNames), classNameProp);\n            return _react2.default.createElement(\"svg\", (0, _extends3.default)({\n                className: className,\n                focusable: \"false\",\n                viewBox: viewBox,\n                color: nativeColor,\n                \"aria-hidden\": titleAccess ? \"false\" : \"true\"\n            }, other), titleAccess ? _react2.default.createElement(\"title\", null, titleAccess) : null, children);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(56), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    display: \"inline-block\",\n                    fill: \"currentColor\",\n                    height: 24,\n                    width: 24,\n                    userSelect: \"none\",\n                    flexShrink: 0,\n                    transition: theme.transitions.create(\"fill\", {\n                        duration: theme.transitions.duration.shorter\n                    })\n                },\n                colorPrimary: {\n                    color: theme.palette.primary.main\n                },\n                colorSecondary: {\n                    color: theme.palette.secondary.main\n                },\n                colorAction: {\n                    color: theme.palette.action.active\n                },\n                colorDisabled: {\n                    color: theme.palette.action.disabled\n                },\n                colorError: {\n                    color: theme.palette.error.main\n                },\n                fontSize: {\n                    width: \"1em\",\n                    height: \"1em\"\n                }\n            };\n        };\n        SvgIcon.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node.isRequired,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            color: _propTypes2.default.oneOf([ \"action\", \"disabled\", \"error\", \"inherit\", \"primary\", \"secondary\" ]),\n            fontSize: _propTypes2.default.bool,\n            nativeColor: _propTypes2.default.string,\n            titleAccess: _propTypes2.default.string,\n            viewBox: _propTypes2.default.string\n        } : {}, SvgIcon.defaultProps = {\n            color: \"inherit\",\n            fontSize: !1,\n            viewBox: \"0 0 24 24\"\n        }, SvgIcon.muiName = \"SvgIcon\", exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiSvgIcon\"\n        })(SvgIcon);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function Icon(props) {\n            var _classNames, children = props.children, classes = props.classes, classNameProp = props.className, color = props.color, fontSize = props.fontSize, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\", \"color\", \"fontSize\" ]), className = (0, \n            _classnames2.default)(\"material-icons\", classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes[\"color\" + (0, \n            _helpers.capitalize)(color)], \"inherit\" !== color), (0, _defineProperty3.default)(_classNames, classes.fontSize, fontSize), \n            _classNames), classNameProp);\n            return _react2.default.createElement(\"span\", (0, _extends3.default)({\n                className: className,\n                \"aria-hidden\": \"true\"\n            }, other), children);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(56), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    userSelect: \"none\"\n                },\n                colorPrimary: {\n                    color: theme.palette.primary.main\n                },\n                colorSecondary: {\n                    color: theme.palette.secondary.main\n                },\n                colorAction: {\n                    color: theme.palette.action.active\n                },\n                colorDisabled: {\n                    color: theme.palette.action.disabled\n                },\n                colorError: {\n                    color: theme.palette.error.main\n                },\n                fontSize: {\n                    width: \"1em\",\n                    height: \"1em\"\n                }\n            };\n        };\n        Icon.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            color: _propTypes2.default.oneOf([ \"inherit\", \"secondary\", \"action\", \"disabled\", \"error\", \"primary\" ]),\n            fontSize: _propTypes2.default.bool\n        } : {}, Icon.defaultProps = {\n            color: \"inherit\",\n            fontSize: !1\n        }, Icon.muiName = \"Icon\", exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiIcon\"\n        })(Icon);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(global) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _pure = __webpack_require__(524), _pure2 = _interopRequireDefault(_pure), _SvgIcon = __webpack_require__(257), _SvgIcon2 = _interopRequireDefault(_SvgIcon), SvgIconCustom = global.__MUI_SvgIcon__ || _SvgIcon2.default, _ref = _react2.default.createElement(\"path\", {\n            d: \"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z\"\n        }), Menu = function(props) {\n            return _react2.default.createElement(SvgIconCustom, props, _ref);\n        };\n        Menu = (0, _pure2.default)(Menu), Menu.muiName = \"SvgIcon\", exports.default = Menu;\n    }).call(exports, __webpack_require__(40));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        exports.__esModule = !0;\n        var _shouldUpdate = __webpack_require__(525), _shouldUpdate2 = _interopRequireDefault(_shouldUpdate), _shallowEqual = __webpack_require__(527), _shallowEqual2 = _interopRequireDefault(_shallowEqual), _setDisplayName = __webpack_require__(259), _setDisplayName2 = _interopRequireDefault(_setDisplayName), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), pure = function(BaseComponent) {\n            var hoc = (0, _shouldUpdate2.default)(function(props, nextProps) {\n                return !(0, _shallowEqual2.default)(props, nextProps);\n            });\n            return \"production\" !== process.env.NODE_ENV ? (0, _setDisplayName2.default)((0, \n            _wrapDisplayName2.default)(BaseComponent, \"pure\"))(hoc(BaseComponent)) : hoc(BaseComponent);\n        };\n        exports.default = pure;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function _classCallCheck(instance, Constructor) {\n            if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n        }\n        function _possibleConstructorReturn(self, call) {\n            if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n            return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n        }\n        function _inherits(subClass, superClass) {\n            if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n            subClass.prototype = Object.create(superClass && superClass.prototype, {\n                constructor: {\n                    value: subClass,\n                    enumerable: !1,\n                    writable: !0,\n                    configurable: !0\n                }\n            }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n        }\n        exports.__esModule = !0;\n        var _react = __webpack_require__(0), _setDisplayName = __webpack_require__(259), _setDisplayName2 = _interopRequireDefault(_setDisplayName), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), shouldUpdate = function(test) {\n            return function(BaseComponent) {\n                var factory = (0, _react.createFactory)(BaseComponent), ShouldUpdate = function(_Component) {\n                    function ShouldUpdate() {\n                        return _classCallCheck(this, ShouldUpdate), _possibleConstructorReturn(this, _Component.apply(this, arguments));\n                    }\n                    return _inherits(ShouldUpdate, _Component), ShouldUpdate.prototype.shouldComponentUpdate = function(nextProps) {\n                        return test(this.props, nextProps);\n                    }, ShouldUpdate.prototype.render = function() {\n                        return factory(this.props);\n                    }, ShouldUpdate;\n                }(_react.Component);\n                return \"production\" !== process.env.NODE_ENV ? (0, _setDisplayName2.default)((0, \n                _wrapDisplayName2.default)(BaseComponent, \"shouldUpdate\"))(ShouldUpdate) : ShouldUpdate;\n            };\n        };\n        exports.default = shouldUpdate;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var setStatic = function(key, value) {\n        return function(BaseComponent) {\n            return BaseComponent[key] = value, BaseComponent;\n        };\n    };\n    exports.default = setStatic;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    exports.__esModule = !0;\n    var _shallowEqual = __webpack_require__(100), _shallowEqual2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_shallowEqual);\n    exports.default = _shallowEqual2.default;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function Typography(props) {\n            var _classNames, align = props.align, classes = props.classes, classNameProp = props.className, componentProp = props.component, color = props.color, gutterBottom = props.gutterBottom, headlineMapping = props.headlineMapping, noWrap = props.noWrap, paragraph = props.paragraph, variant = props.variant, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"align\", \"classes\", \"className\", \"component\", \"color\", \"gutterBottom\", \"headlineMapping\", \"noWrap\", \"paragraph\", \"variant\" ]), className = (0, \n            _classnames2.default)(classes.root, classes[variant], (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes[\"color\" + (0, \n            _helpers.capitalize)(color)], \"default\" !== color), (0, _defineProperty3.default)(_classNames, classes.noWrap, noWrap), \n            (0, _defineProperty3.default)(_classNames, classes.gutterBottom, gutterBottom), \n            (0, _defineProperty3.default)(_classNames, classes.paragraph, paragraph), (0, _defineProperty3.default)(_classNames, classes[\"align\" + (0, \n            _helpers.capitalize)(align)], \"inherit\" !== align), _classNames), classNameProp), Component = componentProp || (paragraph ? \"p\" : headlineMapping[variant]) || \"span\";\n            return _react2.default.createElement(Component, (0, _extends3.default)({\n                className: className\n            }, other));\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(56), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    display: \"block\",\n                    margin: 0\n                },\n                display4: theme.typography.display4,\n                display3: theme.typography.display3,\n                display2: theme.typography.display2,\n                display1: theme.typography.display1,\n                headline: theme.typography.headline,\n                title: theme.typography.title,\n                subheading: theme.typography.subheading,\n                body2: theme.typography.body2,\n                body1: theme.typography.body1,\n                caption: theme.typography.caption,\n                button: theme.typography.button,\n                alignLeft: {\n                    textAlign: \"left\"\n                },\n                alignCenter: {\n                    textAlign: \"center\"\n                },\n                alignRight: {\n                    textAlign: \"right\"\n                },\n                alignJustify: {\n                    textAlign: \"justify\"\n                },\n                noWrap: {\n                    overflow: \"hidden\",\n                    textOverflow: \"ellipsis\",\n                    whiteSpace: \"nowrap\"\n                },\n                gutterBottom: {\n                    marginBottom: \"0.35em\"\n                },\n                paragraph: {\n                    marginBottom: 2 * theme.spacing.unit\n                },\n                colorInherit: {\n                    color: \"inherit\"\n                },\n                colorPrimary: {\n                    color: theme.palette.primary.main\n                },\n                colorSecondary: {\n                    color: theme.palette.secondary.main\n                },\n                colorTextSecondary: {\n                    color: theme.palette.text.secondary\n                },\n                colorError: {\n                    color: theme.palette.error.main\n                }\n            };\n        };\n        Typography.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            align: _propTypes2.default.oneOf([ \"inherit\", \"left\", \"center\", \"right\", \"justify\" ]),\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            color: _propTypes2.default.oneOf([ \"inherit\", \"primary\", \"textSecondary\", \"secondary\", \"error\", \"default\" ]),\n            component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            gutterBottom: _propTypes2.default.bool,\n            headlineMapping: _propTypes2.default.object,\n            noWrap: _propTypes2.default.bool,\n            paragraph: _propTypes2.default.bool,\n            variant: _propTypes2.default.oneOf([ \"display4\", \"display3\", \"display2\", \"display1\", \"headline\", \"title\", \"subheading\", \"body2\", \"body1\", \"caption\", \"button\" ])\n        } : {}, Typography.defaultProps = {\n            align: \"inherit\",\n            color: \"default\",\n            gutterBottom: !1,\n            headlineMapping: {\n                display4: \"h1\",\n                display3: \"h1\",\n                display2: \"h1\",\n                display1: \"h1\",\n                headline: \"h1\",\n                title: \"h2\",\n                subheading: \"h3\",\n                body2: \"aside\",\n                body1: \"p\"\n            },\n            noWrap: !1,\n            paragraph: !1,\n            variant: \"body1\"\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiTypography\"\n        })(Typography);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _SideBar = __webpack_require__(530), _SideBar2 = _interopRequireDefault(_SideBar), _Main = __webpack_require__(549), _Main2 = _interopRequireDefault(_Main), styles = {\n        body: {\n            display: \"flex\",\n            width: \"100%\",\n            height: \"92%\"\n        }\n    }, Body = function(_Component) {\n        function Body() {\n            return _classCallCheck(this, Body), _possibleConstructorReturn(this, (Body.__proto__ || Object.getPrototypeOf(Body)).apply(this, arguments));\n        }\n        return _inherits(Body, _Component), _createClass(Body, [ {\n            key: \"render\",\n            value: function() {\n                return _react2.default.createElement(\"div\", {\n                    style: styles.body\n                }, _react2.default.createElement(_SideBar2.default, {\n                    opened: this.props.opened,\n                    changeContent: this.props.changeContent\n                }), _react2.default.createElement(_Main2.default, {\n                    active: this.props.active,\n                    content: this.props.content,\n                    shouldUpdate: this.props.shouldUpdate,\n                    send: this.props.send\n                }));\n            }\n        } ]), Body;\n    }(_react.Component);\n    exports.default = Body;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _List = __webpack_require__(260), _List2 = _interopRequireDefault(_List), _Icon = __webpack_require__(258), _Icon2 = _interopRequireDefault(_Icon), _Transition = __webpack_require__(166), _Transition2 = _interopRequireDefault(_Transition), _reactFa = __webpack_require__(538), _common = __webpack_require__(81), styles = {\n        menu: {\n            default: {\n                transition: \"margin-left \" + _common.DURATION + \"ms\"\n            },\n            transition: {\n                entered: {\n                    marginLeft: -200\n                }\n            }\n        }\n    }, themeStyles = function(theme) {\n        return {\n            list: {\n                background: theme.palette.grey[900]\n            },\n            listItem: {\n                minWidth: 7 * theme.spacing.unit\n            },\n            icon: {\n                fontSize: 3 * theme.spacing.unit\n            }\n        };\n    }, SideBar = function(_Component) {\n        function SideBar() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, SideBar);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = SideBar.__proto__ || Object.getPrototypeOf(SideBar)).call.apply(_ref, [ this ].concat(args))), \n            _this.clickOn = function(menu) {\n                return function(event) {\n                    event.preventDefault(), _this.props.changeContent(menu);\n                };\n            }, _this.menuItems = function(transitionState) {\n                var classes = _this.props.classes, children = [];\n                return _common.MENU.forEach(function(menu) {\n                    children.push(_react2.default.createElement(_List.ListItem, {\n                        button: !0,\n                        key: menu.id,\n                        onClick: _this.clickOn(menu.id),\n                        className: classes.listItem\n                    }, _react2.default.createElement(_List.ListItemIcon, null, _react2.default.createElement(_Icon2.default, {\n                        className: classes.icon\n                    }, _react2.default.createElement(_reactFa.Icon, {\n                        name: menu.icon\n                    }))), _react2.default.createElement(_List.ListItemText, {\n                        primary: menu.title,\n                        style: _extends({}, styles.menu.default, styles.menu.transition[transitionState], {\n                            padding: 0\n                        })\n                    })));\n                }), children;\n            }, _this.menu = function(transitionState) {\n                return _react2.default.createElement(\"div\", {\n                    className: _this.props.classes.list\n                }, _react2.default.createElement(_List2.default, null, _this.menuItems(transitionState)));\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(SideBar, _Component), _createClass(SideBar, [ {\n            key: \"shouldComponentUpdate\",\n            value: function(nextProps) {\n                return nextProps.opened !== this.props.opened;\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                return _react2.default.createElement(_Transition2.default, {\n                    mountOnEnter: !0,\n                    in: this.props.opened,\n                    timeout: {\n                        enter: _common.DURATION\n                    }\n                }, this.menu);\n            }\n        } ]), SideBar;\n    }(_react.Component);\n    exports.default = (0, _withStyles2.default)(themeStyles)(SideBar);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    listStyle: \"none\",\n                    margin: 0,\n                    padding: 0,\n                    position: \"relative\"\n                },\n                padding: {\n                    paddingTop: theme.spacing.unit,\n                    paddingBottom: theme.spacing.unit\n                },\n                dense: {\n                    paddingTop: theme.spacing.unit / 2,\n                    paddingBottom: theme.spacing.unit / 2\n                },\n                subheader: {\n                    paddingTop: 0\n                }\n            };\n        }, List = function(_React$Component) {\n            function List() {\n                return (0, _classCallCheck3.default)(this, List), (0, _possibleConstructorReturn3.default)(this, (List.__proto__ || (0, \n                _getPrototypeOf2.default)(List)).apply(this, arguments));\n            }\n            return (0, _inherits3.default)(List, _React$Component), (0, _createClass3.default)(List, [ {\n                key: \"getChildContext\",\n                value: function() {\n                    return {\n                        dense: this.props.dense\n                    };\n                }\n            }, {\n                key: \"render\",\n                value: function() {\n                    var _classNames, _props = this.props, children = _props.children, classes = _props.classes, classNameProp = _props.className, Component = _props.component, dense = _props.dense, disablePadding = _props.disablePadding, subheader = _props.subheader, other = (0, \n                    _objectWithoutProperties3.default)(_props, [ \"children\", \"classes\", \"className\", \"component\", \"dense\", \"disablePadding\", \"subheader\" ]), className = (0, \n                    _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.dense, dense && !disablePadding), \n                    (0, _defineProperty3.default)(_classNames, classes.padding, !disablePadding), (0, \n                    _defineProperty3.default)(_classNames, classes.subheader, subheader), _classNames), classNameProp);\n                    return _react2.default.createElement(Component, (0, _extends3.default)({\n                        className: className\n                    }, other), subheader, children);\n                }\n            } ]), List;\n        }(_react2.default.Component);\n        List.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            dense: _propTypes2.default.bool,\n            disablePadding: _propTypes2.default.bool,\n            subheader: _propTypes2.default.node\n        } : {}, List.defaultProps = {\n            component: \"ul\",\n            dense: !1,\n            disablePadding: !1\n        }, List.childContextTypes = {\n            dense: _propTypes2.default.bool\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiList\"\n        })(List);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _ButtonBase = __webpack_require__(252), _ButtonBase2 = _interopRequireDefault(_ButtonBase), _reactHelpers = __webpack_require__(256), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    display: \"flex\",\n                    justifyContent: \"flex-start\",\n                    alignItems: \"center\",\n                    position: \"relative\",\n                    textDecoration: \"none\",\n                    width: \"100%\",\n                    boxSizing: \"border-box\",\n                    textAlign: \"left\"\n                },\n                container: {\n                    position: \"relative\"\n                },\n                keyboardFocused: {\n                    backgroundColor: theme.palette.action.hover\n                },\n                default: {\n                    paddingTop: 12,\n                    paddingBottom: 12\n                },\n                dense: {\n                    paddingTop: theme.spacing.unit,\n                    paddingBottom: theme.spacing.unit\n                },\n                disabled: {\n                    opacity: .5\n                },\n                divider: {\n                    borderBottom: \"1px solid \" + theme.palette.divider,\n                    backgroundClip: \"padding-box\"\n                },\n                gutters: {\n                    paddingLeft: 2 * theme.spacing.unit,\n                    paddingRight: 2 * theme.spacing.unit\n                },\n                button: {\n                    transition: theme.transitions.create(\"background-color\", {\n                        duration: theme.transitions.duration.shortest\n                    }),\n                    \"&:hover\": {\n                        textDecoration: \"none\",\n                        backgroundColor: theme.palette.action.hover,\n                        \"@media (hover: none)\": {\n                            backgroundColor: \"transparent\"\n                        }\n                    }\n                },\n                secondaryAction: {\n                    paddingRight: 4 * theme.spacing.unit\n                }\n            };\n        }, ListItem = function(_React$Component) {\n            function ListItem() {\n                return (0, _classCallCheck3.default)(this, ListItem), (0, _possibleConstructorReturn3.default)(this, (ListItem.__proto__ || (0, \n                _getPrototypeOf2.default)(ListItem)).apply(this, arguments));\n            }\n            return (0, _inherits3.default)(ListItem, _React$Component), (0, _createClass3.default)(ListItem, [ {\n                key: \"getChildContext\",\n                value: function() {\n                    return {\n                        dense: this.props.dense || this.context.dense || !1\n                    };\n                }\n            }, {\n                key: \"render\",\n                value: function() {\n                    var _classNames, _props = this.props, button = _props.button, childrenProp = _props.children, classes = _props.classes, classNameProp = _props.className, componentProp = _props.component, ContainerComponent = _props.ContainerComponent, ContainerProps = _props.ContainerProps, dense = _props.dense, disabled = _props.disabled, disableGutters = _props.disableGutters, divider = _props.divider, other = (0, \n                    _objectWithoutProperties3.default)(_props, [ \"button\", \"children\", \"classes\", \"className\", \"component\", \"ContainerComponent\", \"ContainerProps\", \"dense\", \"disabled\", \"disableGutters\", \"divider\" ]), isDense = dense || this.context.dense || !1, children = _react2.default.Children.toArray(childrenProp), hasAvatar = children.some(function(value) {\n                        return (0, _reactHelpers.isMuiElement)(value, [ \"ListItemAvatar\" ]);\n                    }), hasSecondaryAction = children.length && (0, _reactHelpers.isMuiElement)(children[children.length - 1], [ \"ListItemSecondaryAction\" ]), className = (0, \n                    _classnames2.default)(classes.root, isDense || hasAvatar ? classes.dense : classes.default, (_classNames = {}, \n                    (0, _defineProperty3.default)(_classNames, classes.gutters, !disableGutters), (0, \n                    _defineProperty3.default)(_classNames, classes.divider, divider), (0, _defineProperty3.default)(_classNames, classes.disabled, disabled), \n                    (0, _defineProperty3.default)(_classNames, classes.button, button), (0, _defineProperty3.default)(_classNames, classes.secondaryAction, hasSecondaryAction), \n                    _classNames), classNameProp), componentProps = (0, _extends3.default)({\n                        className: className,\n                        disabled: disabled\n                    }, other), Component = componentProp || \"li\";\n                    return button && (componentProps.component = componentProp || \"div\", componentProps.keyboardFocusedClassName = classes.keyboardFocused, \n                    Component = _ButtonBase2.default), hasSecondaryAction ? (Component = Component === _ButtonBase2.default || componentProp ? Component : \"div\", \n                    _react2.default.createElement(ContainerComponent, (0, _extends3.default)({\n                        className: classes.container\n                    }, ContainerProps), _react2.default.createElement(Component, componentProps, children), children.pop())) : _react2.default.createElement(Component, componentProps, children);\n                }\n            } ]), ListItem;\n        }(_react2.default.Component);\n        ListItem.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            button: _propTypes2.default.bool,\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            ContainerComponent: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            ContainerProps: _propTypes2.default.object,\n            dense: _propTypes2.default.bool,\n            disabled: _propTypes2.default.bool,\n            disableGutters: _propTypes2.default.bool,\n            divider: _propTypes2.default.bool\n        } : {}, ListItem.defaultProps = {\n            button: !1,\n            ContainerComponent: \"li\",\n            dense: !1,\n            disabled: !1,\n            disableGutters: !1,\n            divider: !1\n        }, ListItem.contextTypes = {\n            dense: _propTypes2.default.bool\n        }, ListItem.childContextTypes = {\n            dense: _propTypes2.default.bool\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiListItem\"\n        })(ListItem);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function ListItemAvatar(props, context) {\n            var children = props.children, classes = props.classes, classNameProp = props.className, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\" ]);\n            return void 0 === context.dense ? (\"production\" !== process.env.NODE_ENV && (0, \n            _warning2.default)(!1, \"Material-UI: <ListItemAvatar> is a simple wrapper to apply the dense styles\\n      to <Avatar>. You do not need it unless you are controlling the <List> dense property.\"), \n            props.children) : _react2.default.cloneElement(children, (0, _extends3.default)({\n                className: (0, _classnames2.default)((0, _defineProperty3.default)({}, classes.root, context.dense), classNameProp, children.props.className),\n                childrenClassName: (0, _classnames2.default)((0, _defineProperty3.default)({}, classes.icon, context.dense), children.props.childrenClassName)\n            }, other));\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    width: 36,\n                    height: 36,\n                    fontSize: theme.typography.pxToRem(18),\n                    marginRight: 4\n                },\n                icon: {\n                    width: 20,\n                    height: 20,\n                    fontSize: theme.typography.pxToRem(20)\n                }\n            };\n        };\n        ListItemAvatar.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.element.isRequired,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string\n        } : {}, ListItemAvatar.contextTypes = {\n            dense: _propTypes2.default.bool\n        }, ListItemAvatar.muiName = \"ListItemAvatar\", exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiListItemAvatar\"\n        })(ListItemAvatar);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function ListItemText(props, context) {\n            var _classNames, classes = props.classes, classNameProp = props.className, disableTypography = props.disableTypography, inset = props.inset, primary = props.primary, secondary = props.secondary, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"classes\", \"className\", \"disableTypography\", \"inset\", \"primary\", \"secondary\" ]), dense = context.dense, className = (0, \n            _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.dense, dense), \n            (0, _defineProperty3.default)(_classNames, classes.inset, inset), _classNames), classNameProp);\n            return _react2.default.createElement(\"div\", (0, _extends3.default)({\n                className: className\n            }, other), primary && (disableTypography ? primary : _react2.default.createElement(_Typography2.default, {\n                variant: \"subheading\",\n                className: (0, _classnames2.default)(classes.primary, (0, _defineProperty3.default)({}, classes.textDense, dense))\n            }, primary)), secondary && (disableTypography ? secondary : _react2.default.createElement(_Typography2.default, {\n                variant: \"body1\",\n                className: (0, _classnames2.default)(classes.secondary, (0, _defineProperty3.default)({}, classes.textDense, dense)),\n                color: \"textSecondary\"\n            }, secondary)));\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Typography = __webpack_require__(113), _Typography2 = _interopRequireDefault(_Typography), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    flex: \"1 1 auto\",\n                    minWidth: 0,\n                    padding: \"0 16px\",\n                    \"&:first-child\": {\n                        paddingLeft: 0\n                    }\n                },\n                inset: {\n                    \"&:first-child\": {\n                        paddingLeft: 7 * theme.spacing.unit\n                    }\n                },\n                dense: {\n                    fontSize: theme.typography.pxToRem(13)\n                },\n                primary: {\n                    \"&$textDense\": {\n                        fontSize: \"inherit\"\n                    }\n                },\n                secondary: {\n                    \"&$textDense\": {\n                        fontSize: \"inherit\"\n                    }\n                },\n                textDense: {}\n            };\n        };\n        ListItemText.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            disableTypography: _propTypes2.default.bool,\n            inset: _propTypes2.default.bool,\n            primary: _propTypes2.default.node,\n            secondary: _propTypes2.default.node\n        } : {}, ListItemText.defaultProps = {\n            disableTypography: !1,\n            inset: !1,\n            primary: !1,\n            secondary: !1\n        }, ListItemText.contextTypes = {\n            dense: _propTypes2.default.bool\n        }, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiListItemText\"\n        })(ListItemText);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function ListItemIcon(props) {\n            var children = props.children, classes = props.classes, classNameProp = props.className, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\" ]);\n            return _react2.default.cloneElement(children, (0, _extends3.default)({\n                className: (0, _classnames2.default)(classes.root, classNameProp, children.props.className)\n            }, other));\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    height: 24,\n                    marginRight: 2 * theme.spacing.unit,\n                    width: 24,\n                    color: theme.palette.action.active,\n                    flexShrink: 0\n                }\n            };\n        };\n        ListItemIcon.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.element.isRequired,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string\n        } : {}, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiListItemIcon\"\n        })(ListItemIcon);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function ListItemSecondaryAction(props) {\n            var children = props.children, classes = props.classes, className = props.className, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\" ]);\n            return _react2.default.createElement(\"div\", (0, _extends3.default)({\n                className: (0, _classnames2.default)(classes.root, className)\n            }, other), children);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    position: \"absolute\",\n                    right: 4,\n                    top: \"50%\",\n                    marginTop: 3 * -theme.spacing.unit\n                }\n            };\n        };\n        ListItemSecondaryAction.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string\n        } : {}, ListItemSecondaryAction.muiName = \"ListItemSecondaryAction\", exports.default = (0, \n        _withStyles2.default)(styles, {\n            name: \"MuiListItemSecondaryAction\"\n        })(ListItemSecondaryAction);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function ListSubheader(props) {\n            var _classNames, classes = props.classes, classNameProp = props.className, color = props.color, Component = props.component, disableSticky = props.disableSticky, inset = props.inset, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"classes\", \"className\", \"color\", \"component\", \"disableSticky\", \"inset\" ]), className = (0, \n            _classnames2.default)(classes.root, (_classNames = {}, (0, _defineProperty3.default)(_classNames, classes[\"color\" + (0, \n            _helpers.capitalize)(color)], \"default\" !== color), (0, _defineProperty3.default)(_classNames, classes.inset, inset), \n            (0, _defineProperty3.default)(_classNames, classes.sticky, !disableSticky), _classNames), classNameProp);\n            return _react2.default.createElement(Component, (0, _extends3.default)({\n                className: className\n            }, other));\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _helpers = __webpack_require__(56), styles = exports.styles = function(theme) {\n            return {\n                root: {\n                    boxSizing: \"border-box\",\n                    lineHeight: \"48px\",\n                    listStyle: \"none\",\n                    paddingLeft: 2 * theme.spacing.unit,\n                    paddingRight: 2 * theme.spacing.unit,\n                    color: theme.palette.text.secondary,\n                    fontFamily: theme.typography.fontFamily,\n                    fontWeight: theme.typography.fontWeightMedium,\n                    fontSize: theme.typography.pxToRem(theme.typography.fontSize)\n                },\n                colorPrimary: {\n                    color: theme.palette.primary.main\n                },\n                colorInherit: {\n                    color: \"inherit\"\n                },\n                inset: {\n                    paddingLeft: 9 * theme.spacing.unit\n                },\n                sticky: {\n                    position: \"sticky\",\n                    top: 0,\n                    zIndex: 1,\n                    backgroundColor: \"inherit\"\n                }\n            };\n        };\n        ListSubheader.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            color: _propTypes2.default.oneOf([ \"default\", \"primary\", \"inherit\" ]),\n            component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            disableSticky: _propTypes2.default.bool,\n            inset: _propTypes2.default.bool\n        } : {}, ListSubheader.defaultProps = {\n            color: \"default\",\n            component: \"li\",\n            disableSticky: !1,\n            inset: !1\n        }, ListSubheader.muiName = \"ListSubheader\", exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiListSubheader\"\n        })(ListSubheader);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.IconStack = exports.Icon = exports.default = void 0, __webpack_require__(539);\n    var _Icon = __webpack_require__(547), _Icon2 = _interopRequireDefault(_Icon), _IconStack = __webpack_require__(548), _IconStack2 = _interopRequireDefault(_IconStack);\n    exports.default = _Icon2.default, exports.Icon = _Icon2.default, exports.IconStack = _IconStack2.default;\n}, function(module, exports, __webpack_require__) {\n    var content = __webpack_require__(540);\n    \"string\" == typeof content && (content = [ [ module.i, content, \"\" ] ]);\n    var options = {\n        hmr: !0\n    };\n    options.transform = void 0;\n    __webpack_require__(545)(content, options);\n    content.locals && (module.exports = content.locals);\n}, function(module, exports, __webpack_require__) {\n    var escape = __webpack_require__(541);\n    exports = module.exports = __webpack_require__(542)(!1), exports.push([ module.i, \"/*!\\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\\n */\\n/* FONT PATH\\n * -------------------------- */\\n@font-face {\\n  font-family: 'FontAwesome';\\n  \\n  src:  url(\" + escape(__webpack_require__(543)) + \") format('woff2'), url(\" + escape(__webpack_require__(544)) + ') format(\\'woff\\');\\n  font-weight: normal;\\n  font-style: normal;\\n}\\n.fa {\\n  display: inline-block;\\n  font: normal normal normal 14px/1 FontAwesome;\\n  font-size: inherit;\\n  text-rendering: auto;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n/* makes the font 33% larger relative to the icon container */\\n.fa-lg {\\n  font-size: 1.33333333em;\\n  line-height: 0.75em;\\n  vertical-align: -15%;\\n}\\n.fa-2x {\\n  font-size: 2em;\\n}\\n.fa-3x {\\n  font-size: 3em;\\n}\\n.fa-4x {\\n  font-size: 4em;\\n}\\n.fa-5x {\\n  font-size: 5em;\\n}\\n.fa-fw {\\n  width: 1.28571429em;\\n  text-align: center;\\n}\\n.fa-ul {\\n  padding-left: 0;\\n  margin-left: 2.14285714em;\\n  list-style-type: none;\\n}\\n.fa-ul > li {\\n  position: relative;\\n}\\n.fa-li {\\n  position: absolute;\\n  left: -2.14285714em;\\n  width: 2.14285714em;\\n  top: 0.14285714em;\\n  text-align: center;\\n}\\n.fa-li.fa-lg {\\n  left: -1.85714286em;\\n}\\n.fa-border {\\n  padding: .2em .25em .15em;\\n  border: solid 0.08em #eeeeee;\\n  border-radius: .1em;\\n}\\n.fa-pull-left {\\n  float: left;\\n}\\n.fa-pull-right {\\n  float: right;\\n}\\n.fa.fa-pull-left {\\n  margin-right: .3em;\\n}\\n.fa.fa-pull-right {\\n  margin-left: .3em;\\n}\\n/* Deprecated as of 4.4.0 */\\n.pull-right {\\n  float: right;\\n}\\n.pull-left {\\n  float: left;\\n}\\n.fa.pull-left {\\n  margin-right: .3em;\\n}\\n.fa.pull-right {\\n  margin-left: .3em;\\n}\\n.fa-spin {\\n  -webkit-animation: fa-spin 2s infinite linear;\\n  animation: fa-spin 2s infinite linear;\\n}\\n.fa-pulse {\\n  -webkit-animation: fa-spin 1s infinite steps(8);\\n  animation: fa-spin 1s infinite steps(8);\\n}\\n@-webkit-keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(359deg);\\n    transform: rotate(359deg);\\n  }\\n}\\n@keyframes fa-spin {\\n  0% {\\n    -webkit-transform: rotate(0deg);\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    -webkit-transform: rotate(359deg);\\n    transform: rotate(359deg);\\n  }\\n}\\n.fa-rotate-90 {\\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)\";\\n  -webkit-transform: rotate(90deg);\\n  -ms-transform: rotate(90deg);\\n  transform: rotate(90deg);\\n}\\n.fa-rotate-180 {\\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)\";\\n  -webkit-transform: rotate(180deg);\\n  -ms-transform: rotate(180deg);\\n  transform: rotate(180deg);\\n}\\n.fa-rotate-270 {\\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)\";\\n  -webkit-transform: rotate(270deg);\\n  -ms-transform: rotate(270deg);\\n  transform: rotate(270deg);\\n}\\n.fa-flip-horizontal {\\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)\";\\n  -webkit-transform: scale(-1, 1);\\n  -ms-transform: scale(-1, 1);\\n  transform: scale(-1, 1);\\n}\\n.fa-flip-vertical {\\n  -ms-filter: \"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)\";\\n  -webkit-transform: scale(1, -1);\\n  -ms-transform: scale(1, -1);\\n  transform: scale(1, -1);\\n}\\n:root .fa-rotate-90,\\n:root .fa-rotate-180,\\n:root .fa-rotate-270,\\n:root .fa-flip-horizontal,\\n:root .fa-flip-vertical {\\n  filter: none;\\n}\\n.fa-stack {\\n  position: relative;\\n  display: inline-block;\\n  width: 2em;\\n  height: 2em;\\n  line-height: 2em;\\n  vertical-align: middle;\\n}\\n.fa-stack-1x,\\n.fa-stack-2x {\\n  position: absolute;\\n  left: 0;\\n  width: 100%;\\n  text-align: center;\\n}\\n.fa-stack-1x {\\n  line-height: inherit;\\n}\\n.fa-stack-2x {\\n  font-size: 2em;\\n}\\n.fa-inverse {\\n  color: #ffffff;\\n}\\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\\n   readers do not read off random characters that represent icons */\\n.fa-glass:before {\\n  content: \"\\\\F000\";\\n}\\n.fa-music:before {\\n  content: \"\\\\F001\";\\n}\\n.fa-search:before {\\n  content: \"\\\\F002\";\\n}\\n.fa-envelope-o:before {\\n  content: \"\\\\F003\";\\n}\\n.fa-heart:before {\\n  content: \"\\\\F004\";\\n}\\n.fa-star:before {\\n  content: \"\\\\F005\";\\n}\\n.fa-star-o:before {\\n  content: \"\\\\F006\";\\n}\\n.fa-user:before {\\n  content: \"\\\\F007\";\\n}\\n.fa-film:before {\\n  content: \"\\\\F008\";\\n}\\n.fa-th-large:before {\\n  content: \"\\\\F009\";\\n}\\n.fa-th:before {\\n  content: \"\\\\F00A\";\\n}\\n.fa-th-list:before {\\n  content: \"\\\\F00B\";\\n}\\n.fa-check:before {\\n  content: \"\\\\F00C\";\\n}\\n.fa-remove:before,\\n.fa-close:before,\\n.fa-times:before {\\n  content: \"\\\\F00D\";\\n}\\n.fa-search-plus:before {\\n  content: \"\\\\F00E\";\\n}\\n.fa-search-minus:before {\\n  content: \"\\\\F010\";\\n}\\n.fa-power-off:before {\\n  content: \"\\\\F011\";\\n}\\n.fa-signal:before {\\n  content: \"\\\\F012\";\\n}\\n.fa-gear:before,\\n.fa-cog:before {\\n  content: \"\\\\F013\";\\n}\\n.fa-trash-o:before {\\n  content: \"\\\\F014\";\\n}\\n.fa-home:before {\\n  content: \"\\\\F015\";\\n}\\n.fa-file-o:before {\\n  content: \"\\\\F016\";\\n}\\n.fa-clock-o:before {\\n  content: \"\\\\F017\";\\n}\\n.fa-road:before {\\n  content: \"\\\\F018\";\\n}\\n.fa-download:before {\\n  content: \"\\\\F019\";\\n}\\n.fa-arrow-circle-o-down:before {\\n  content: \"\\\\F01A\";\\n}\\n.fa-arrow-circle-o-up:before {\\n  content: \"\\\\F01B\";\\n}\\n.fa-inbox:before {\\n  content: \"\\\\F01C\";\\n}\\n.fa-play-circle-o:before {\\n  content: \"\\\\F01D\";\\n}\\n.fa-rotate-right:before,\\n.fa-repeat:before {\\n  content: \"\\\\F01E\";\\n}\\n.fa-refresh:before {\\n  content: \"\\\\F021\";\\n}\\n.fa-list-alt:before {\\n  content: \"\\\\F022\";\\n}\\n.fa-lock:before {\\n  content: \"\\\\F023\";\\n}\\n.fa-flag:before {\\n  content: \"\\\\F024\";\\n}\\n.fa-headphones:before {\\n  content: \"\\\\F025\";\\n}\\n.fa-volume-off:before {\\n  content: \"\\\\F026\";\\n}\\n.fa-volume-down:before {\\n  content: \"\\\\F027\";\\n}\\n.fa-volume-up:before {\\n  content: \"\\\\F028\";\\n}\\n.fa-qrcode:before {\\n  content: \"\\\\F029\";\\n}\\n.fa-barcode:before {\\n  content: \"\\\\F02A\";\\n}\\n.fa-tag:before {\\n  content: \"\\\\F02B\";\\n}\\n.fa-tags:before {\\n  content: \"\\\\F02C\";\\n}\\n.fa-book:before {\\n  content: \"\\\\F02D\";\\n}\\n.fa-bookmark:before {\\n  content: \"\\\\F02E\";\\n}\\n.fa-print:before {\\n  content: \"\\\\F02F\";\\n}\\n.fa-camera:before {\\n  content: \"\\\\F030\";\\n}\\n.fa-font:before {\\n  content: \"\\\\F031\";\\n}\\n.fa-bold:before {\\n  content: \"\\\\F032\";\\n}\\n.fa-italic:before {\\n  content: \"\\\\F033\";\\n}\\n.fa-text-height:before {\\n  content: \"\\\\F034\";\\n}\\n.fa-text-width:before {\\n  content: \"\\\\F035\";\\n}\\n.fa-align-left:before {\\n  content: \"\\\\F036\";\\n}\\n.fa-align-center:before {\\n  content: \"\\\\F037\";\\n}\\n.fa-align-right:before {\\n  content: \"\\\\F038\";\\n}\\n.fa-align-justify:before {\\n  content: \"\\\\F039\";\\n}\\n.fa-list:before {\\n  content: \"\\\\F03A\";\\n}\\n.fa-dedent:before,\\n.fa-outdent:before {\\n  content: \"\\\\F03B\";\\n}\\n.fa-indent:before {\\n  content: \"\\\\F03C\";\\n}\\n.fa-video-camera:before {\\n  content: \"\\\\F03D\";\\n}\\n.fa-photo:before,\\n.fa-image:before,\\n.fa-picture-o:before {\\n  content: \"\\\\F03E\";\\n}\\n.fa-pencil:before {\\n  content: \"\\\\F040\";\\n}\\n.fa-map-marker:before {\\n  content: \"\\\\F041\";\\n}\\n.fa-adjust:before {\\n  content: \"\\\\F042\";\\n}\\n.fa-tint:before {\\n  content: \"\\\\F043\";\\n}\\n.fa-edit:before,\\n.fa-pencil-square-o:before {\\n  content: \"\\\\F044\";\\n}\\n.fa-share-square-o:before {\\n  content: \"\\\\F045\";\\n}\\n.fa-check-square-o:before {\\n  content: \"\\\\F046\";\\n}\\n.fa-arrows:before {\\n  content: \"\\\\F047\";\\n}\\n.fa-step-backward:before {\\n  content: \"\\\\F048\";\\n}\\n.fa-fast-backward:before {\\n  content: \"\\\\F049\";\\n}\\n.fa-backward:before {\\n  content: \"\\\\F04A\";\\n}\\n.fa-play:before {\\n  content: \"\\\\F04B\";\\n}\\n.fa-pause:before {\\n  content: \"\\\\F04C\";\\n}\\n.fa-stop:before {\\n  content: \"\\\\F04D\";\\n}\\n.fa-forward:before {\\n  content: \"\\\\F04E\";\\n}\\n.fa-fast-forward:before {\\n  content: \"\\\\F050\";\\n}\\n.fa-step-forward:before {\\n  content: \"\\\\F051\";\\n}\\n.fa-eject:before {\\n  content: \"\\\\F052\";\\n}\\n.fa-chevron-left:before {\\n  content: \"\\\\F053\";\\n}\\n.fa-chevron-right:before {\\n  content: \"\\\\F054\";\\n}\\n.fa-plus-circle:before {\\n  content: \"\\\\F055\";\\n}\\n.fa-minus-circle:before {\\n  content: \"\\\\F056\";\\n}\\n.fa-times-circle:before {\\n  content: \"\\\\F057\";\\n}\\n.fa-check-circle:before {\\n  content: \"\\\\F058\";\\n}\\n.fa-question-circle:before {\\n  content: \"\\\\F059\";\\n}\\n.fa-info-circle:before {\\n  content: \"\\\\F05A\";\\n}\\n.fa-crosshairs:before {\\n  content: \"\\\\F05B\";\\n}\\n.fa-times-circle-o:before {\\n  content: \"\\\\F05C\";\\n}\\n.fa-check-circle-o:before {\\n  content: \"\\\\F05D\";\\n}\\n.fa-ban:before {\\n  content: \"\\\\F05E\";\\n}\\n.fa-arrow-left:before {\\n  content: \"\\\\F060\";\\n}\\n.fa-arrow-right:before {\\n  content: \"\\\\F061\";\\n}\\n.fa-arrow-up:before {\\n  content: \"\\\\F062\";\\n}\\n.fa-arrow-down:before {\\n  content: \"\\\\F063\";\\n}\\n.fa-mail-forward:before,\\n.fa-share:before {\\n  content: \"\\\\F064\";\\n}\\n.fa-expand:before {\\n  content: \"\\\\F065\";\\n}\\n.fa-compress:before {\\n  content: \"\\\\F066\";\\n}\\n.fa-plus:before {\\n  content: \"\\\\F067\";\\n}\\n.fa-minus:before {\\n  content: \"\\\\F068\";\\n}\\n.fa-asterisk:before {\\n  content: \"\\\\F069\";\\n}\\n.fa-exclamation-circle:before {\\n  content: \"\\\\F06A\";\\n}\\n.fa-gift:before {\\n  content: \"\\\\F06B\";\\n}\\n.fa-leaf:before {\\n  content: \"\\\\F06C\";\\n}\\n.fa-fire:before {\\n  content: \"\\\\F06D\";\\n}\\n.fa-eye:before {\\n  content: \"\\\\F06E\";\\n}\\n.fa-eye-slash:before {\\n  content: \"\\\\F070\";\\n}\\n.fa-warning:before,\\n.fa-exclamation-triangle:before {\\n  content: \"\\\\F071\";\\n}\\n.fa-plane:before {\\n  content: \"\\\\F072\";\\n}\\n.fa-calendar:before {\\n  content: \"\\\\F073\";\\n}\\n.fa-random:before {\\n  content: \"\\\\F074\";\\n}\\n.fa-comment:before {\\n  content: \"\\\\F075\";\\n}\\n.fa-magnet:before {\\n  content: \"\\\\F076\";\\n}\\n.fa-chevron-up:before {\\n  content: \"\\\\F077\";\\n}\\n.fa-chevron-down:before {\\n  content: \"\\\\F078\";\\n}\\n.fa-retweet:before {\\n  content: \"\\\\F079\";\\n}\\n.fa-shopping-cart:before {\\n  content: \"\\\\F07A\";\\n}\\n.fa-folder:before {\\n  content: \"\\\\F07B\";\\n}\\n.fa-folder-open:before {\\n  content: \"\\\\F07C\";\\n}\\n.fa-arrows-v:before {\\n  content: \"\\\\F07D\";\\n}\\n.fa-arrows-h:before {\\n  content: \"\\\\F07E\";\\n}\\n.fa-bar-chart-o:before,\\n.fa-bar-chart:before {\\n  content: \"\\\\F080\";\\n}\\n.fa-twitter-square:before {\\n  content: \"\\\\F081\";\\n}\\n.fa-facebook-square:before {\\n  content: \"\\\\F082\";\\n}\\n.fa-camera-retro:before {\\n  content: \"\\\\F083\";\\n}\\n.fa-key:before {\\n  content: \"\\\\F084\";\\n}\\n.fa-gears:before,\\n.fa-cogs:before {\\n  content: \"\\\\F085\";\\n}\\n.fa-comments:before {\\n  content: \"\\\\F086\";\\n}\\n.fa-thumbs-o-up:before {\\n  content: \"\\\\F087\";\\n}\\n.fa-thumbs-o-down:before {\\n  content: \"\\\\F088\";\\n}\\n.fa-star-half:before {\\n  content: \"\\\\F089\";\\n}\\n.fa-heart-o:before {\\n  content: \"\\\\F08A\";\\n}\\n.fa-sign-out:before {\\n  content: \"\\\\F08B\";\\n}\\n.fa-linkedin-square:before {\\n  content: \"\\\\F08C\";\\n}\\n.fa-thumb-tack:before {\\n  content: \"\\\\F08D\";\\n}\\n.fa-external-link:before {\\n  content: \"\\\\F08E\";\\n}\\n.fa-sign-in:before {\\n  content: \"\\\\F090\";\\n}\\n.fa-trophy:before {\\n  content: \"\\\\F091\";\\n}\\n.fa-github-square:before {\\n  content: \"\\\\F092\";\\n}\\n.fa-upload:before {\\n  content: \"\\\\F093\";\\n}\\n.fa-lemon-o:before {\\n  content: \"\\\\F094\";\\n}\\n.fa-phone:before {\\n  content: \"\\\\F095\";\\n}\\n.fa-square-o:before {\\n  content: \"\\\\F096\";\\n}\\n.fa-bookmark-o:before {\\n  content: \"\\\\F097\";\\n}\\n.fa-phone-square:before {\\n  content: \"\\\\F098\";\\n}\\n.fa-twitter:before {\\n  content: \"\\\\F099\";\\n}\\n.fa-facebook-f:before,\\n.fa-facebook:before {\\n  content: \"\\\\F09A\";\\n}\\n.fa-github:before {\\n  content: \"\\\\F09B\";\\n}\\n.fa-unlock:before {\\n  content: \"\\\\F09C\";\\n}\\n.fa-credit-card:before {\\n  content: \"\\\\F09D\";\\n}\\n.fa-feed:before,\\n.fa-rss:before {\\n  content: \"\\\\F09E\";\\n}\\n.fa-hdd-o:before {\\n  content: \"\\\\F0A0\";\\n}\\n.fa-bullhorn:before {\\n  content: \"\\\\F0A1\";\\n}\\n.fa-bell:before {\\n  content: \"\\\\F0F3\";\\n}\\n.fa-certificate:before {\\n  content: \"\\\\F0A3\";\\n}\\n.fa-hand-o-right:before {\\n  content: \"\\\\F0A4\";\\n}\\n.fa-hand-o-left:before {\\n  content: \"\\\\F0A5\";\\n}\\n.fa-hand-o-up:before {\\n  content: \"\\\\F0A6\";\\n}\\n.fa-hand-o-down:before {\\n  content: \"\\\\F0A7\";\\n}\\n.fa-arrow-circle-left:before {\\n  content: \"\\\\F0A8\";\\n}\\n.fa-arrow-circle-right:before {\\n  content: \"\\\\F0A9\";\\n}\\n.fa-arrow-circle-up:before {\\n  content: \"\\\\F0AA\";\\n}\\n.fa-arrow-circle-down:before {\\n  content: \"\\\\F0AB\";\\n}\\n.fa-globe:before {\\n  content: \"\\\\F0AC\";\\n}\\n.fa-wrench:before {\\n  content: \"\\\\F0AD\";\\n}\\n.fa-tasks:before {\\n  content: \"\\\\F0AE\";\\n}\\n.fa-filter:before {\\n  content: \"\\\\F0B0\";\\n}\\n.fa-briefcase:before {\\n  content: \"\\\\F0B1\";\\n}\\n.fa-arrows-alt:before {\\n  content: \"\\\\F0B2\";\\n}\\n.fa-group:before,\\n.fa-users:before {\\n  content: \"\\\\F0C0\";\\n}\\n.fa-chain:before,\\n.fa-link:before {\\n  content: \"\\\\F0C1\";\\n}\\n.fa-cloud:before {\\n  content: \"\\\\F0C2\";\\n}\\n.fa-flask:before {\\n  content: \"\\\\F0C3\";\\n}\\n.fa-cut:before,\\n.fa-scissors:before {\\n  content: \"\\\\F0C4\";\\n}\\n.fa-copy:before,\\n.fa-files-o:before {\\n  content: \"\\\\F0C5\";\\n}\\n.fa-paperclip:before {\\n  content: \"\\\\F0C6\";\\n}\\n.fa-save:before,\\n.fa-floppy-o:before {\\n  content: \"\\\\F0C7\";\\n}\\n.fa-square:before {\\n  content: \"\\\\F0C8\";\\n}\\n.fa-navicon:before,\\n.fa-reorder:before,\\n.fa-bars:before {\\n  content: \"\\\\F0C9\";\\n}\\n.fa-list-ul:before {\\n  content: \"\\\\F0CA\";\\n}\\n.fa-list-ol:before {\\n  content: \"\\\\F0CB\";\\n}\\n.fa-strikethrough:before {\\n  content: \"\\\\F0CC\";\\n}\\n.fa-underline:before {\\n  content: \"\\\\F0CD\";\\n}\\n.fa-table:before {\\n  content: \"\\\\F0CE\";\\n}\\n.fa-magic:before {\\n  content: \"\\\\F0D0\";\\n}\\n.fa-truck:before {\\n  content: \"\\\\F0D1\";\\n}\\n.fa-pinterest:before {\\n  content: \"\\\\F0D2\";\\n}\\n.fa-pinterest-square:before {\\n  content: \"\\\\F0D3\";\\n}\\n.fa-google-plus-square:before {\\n  content: \"\\\\F0D4\";\\n}\\n.fa-google-plus:before {\\n  content: \"\\\\F0D5\";\\n}\\n.fa-money:before {\\n  content: \"\\\\F0D6\";\\n}\\n.fa-caret-down:before {\\n  content: \"\\\\F0D7\";\\n}\\n.fa-caret-up:before {\\n  content: \"\\\\F0D8\";\\n}\\n.fa-caret-left:before {\\n  content: \"\\\\F0D9\";\\n}\\n.fa-caret-right:before {\\n  content: \"\\\\F0DA\";\\n}\\n.fa-columns:before {\\n  content: \"\\\\F0DB\";\\n}\\n.fa-unsorted:before,\\n.fa-sort:before {\\n  content: \"\\\\F0DC\";\\n}\\n.fa-sort-down:before,\\n.fa-sort-desc:before {\\n  content: \"\\\\F0DD\";\\n}\\n.fa-sort-up:before,\\n.fa-sort-asc:before {\\n  content: \"\\\\F0DE\";\\n}\\n.fa-envelope:before {\\n  content: \"\\\\F0E0\";\\n}\\n.fa-linkedin:before {\\n  content: \"\\\\F0E1\";\\n}\\n.fa-rotate-left:before,\\n.fa-undo:before {\\n  content: \"\\\\F0E2\";\\n}\\n.fa-legal:before,\\n.fa-gavel:before {\\n  content: \"\\\\F0E3\";\\n}\\n.fa-dashboard:before,\\n.fa-tachometer:before {\\n  content: \"\\\\F0E4\";\\n}\\n.fa-comment-o:before {\\n  content: \"\\\\F0E5\";\\n}\\n.fa-comments-o:before {\\n  content: \"\\\\F0E6\";\\n}\\n.fa-flash:before,\\n.fa-bolt:before {\\n  content: \"\\\\F0E7\";\\n}\\n.fa-sitemap:before {\\n  content: \"\\\\F0E8\";\\n}\\n.fa-umbrella:before {\\n  content: \"\\\\F0E9\";\\n}\\n.fa-paste:before,\\n.fa-clipboard:before {\\n  content: \"\\\\F0EA\";\\n}\\n.fa-lightbulb-o:before {\\n  content: \"\\\\F0EB\";\\n}\\n.fa-exchange:before {\\n  content: \"\\\\F0EC\";\\n}\\n.fa-cloud-download:before {\\n  content: \"\\\\F0ED\";\\n}\\n.fa-cloud-upload:before {\\n  content: \"\\\\F0EE\";\\n}\\n.fa-user-md:before {\\n  content: \"\\\\F0F0\";\\n}\\n.fa-stethoscope:before {\\n  content: \"\\\\F0F1\";\\n}\\n.fa-suitcase:before {\\n  content: \"\\\\F0F2\";\\n}\\n.fa-bell-o:before {\\n  content: \"\\\\F0A2\";\\n}\\n.fa-coffee:before {\\n  content: \"\\\\F0F4\";\\n}\\n.fa-cutlery:before {\\n  content: \"\\\\F0F5\";\\n}\\n.fa-file-text-o:before {\\n  content: \"\\\\F0F6\";\\n}\\n.fa-building-o:before {\\n  content: \"\\\\F0F7\";\\n}\\n.fa-hospital-o:before {\\n  content: \"\\\\F0F8\";\\n}\\n.fa-ambulance:before {\\n  content: \"\\\\F0F9\";\\n}\\n.fa-medkit:before {\\n  content: \"\\\\F0FA\";\\n}\\n.fa-fighter-jet:before {\\n  content: \"\\\\F0FB\";\\n}\\n.fa-beer:before {\\n  content: \"\\\\F0FC\";\\n}\\n.fa-h-square:before {\\n  content: \"\\\\F0FD\";\\n}\\n.fa-plus-square:before {\\n  content: \"\\\\F0FE\";\\n}\\n.fa-angle-double-left:before {\\n  content: \"\\\\F100\";\\n}\\n.fa-angle-double-right:before {\\n  content: \"\\\\F101\";\\n}\\n.fa-angle-double-up:before {\\n  content: \"\\\\F102\";\\n}\\n.fa-angle-double-down:before {\\n  content: \"\\\\F103\";\\n}\\n.fa-angle-left:before {\\n  content: \"\\\\F104\";\\n}\\n.fa-angle-right:before {\\n  content: \"\\\\F105\";\\n}\\n.fa-angle-up:before {\\n  content: \"\\\\F106\";\\n}\\n.fa-angle-down:before {\\n  content: \"\\\\F107\";\\n}\\n.fa-desktop:before {\\n  content: \"\\\\F108\";\\n}\\n.fa-laptop:before {\\n  content: \"\\\\F109\";\\n}\\n.fa-tablet:before {\\n  content: \"\\\\F10A\";\\n}\\n.fa-mobile-phone:before,\\n.fa-mobile:before {\\n  content: \"\\\\F10B\";\\n}\\n.fa-circle-o:before {\\n  content: \"\\\\F10C\";\\n}\\n.fa-quote-left:before {\\n  content: \"\\\\F10D\";\\n}\\n.fa-quote-right:before {\\n  content: \"\\\\F10E\";\\n}\\n.fa-spinner:before {\\n  content: \"\\\\F110\";\\n}\\n.fa-circle:before {\\n  content: \"\\\\F111\";\\n}\\n.fa-mail-reply:before,\\n.fa-reply:before {\\n  content: \"\\\\F112\";\\n}\\n.fa-github-alt:before {\\n  content: \"\\\\F113\";\\n}\\n.fa-folder-o:before {\\n  content: \"\\\\F114\";\\n}\\n.fa-folder-open-o:before {\\n  content: \"\\\\F115\";\\n}\\n.fa-smile-o:before {\\n  content: \"\\\\F118\";\\n}\\n.fa-frown-o:before {\\n  content: \"\\\\F119\";\\n}\\n.fa-meh-o:before {\\n  content: \"\\\\F11A\";\\n}\\n.fa-gamepad:before {\\n  content: \"\\\\F11B\";\\n}\\n.fa-keyboard-o:before {\\n  content: \"\\\\F11C\";\\n}\\n.fa-flag-o:before {\\n  content: \"\\\\F11D\";\\n}\\n.fa-flag-checkered:before {\\n  content: \"\\\\F11E\";\\n}\\n.fa-terminal:before {\\n  content: \"\\\\F120\";\\n}\\n.fa-code:before {\\n  content: \"\\\\F121\";\\n}\\n.fa-mail-reply-all:before,\\n.fa-reply-all:before {\\n  content: \"\\\\F122\";\\n}\\n.fa-star-half-empty:before,\\n.fa-star-half-full:before,\\n.fa-star-half-o:before {\\n  content: \"\\\\F123\";\\n}\\n.fa-location-arrow:before {\\n  content: \"\\\\F124\";\\n}\\n.fa-crop:before {\\n  content: \"\\\\F125\";\\n}\\n.fa-code-fork:before {\\n  content: \"\\\\F126\";\\n}\\n.fa-unlink:before,\\n.fa-chain-broken:before {\\n  content: \"\\\\F127\";\\n}\\n.fa-question:before {\\n  content: \"\\\\F128\";\\n}\\n.fa-info:before {\\n  content: \"\\\\F129\";\\n}\\n.fa-exclamation:before {\\n  content: \"\\\\F12A\";\\n}\\n.fa-superscript:before {\\n  content: \"\\\\F12B\";\\n}\\n.fa-subscript:before {\\n  content: \"\\\\F12C\";\\n}\\n.fa-eraser:before {\\n  content: \"\\\\F12D\";\\n}\\n.fa-puzzle-piece:before {\\n  content: \"\\\\F12E\";\\n}\\n.fa-microphone:before {\\n  content: \"\\\\F130\";\\n}\\n.fa-microphone-slash:before {\\n  content: \"\\\\F131\";\\n}\\n.fa-shield:before {\\n  content: \"\\\\F132\";\\n}\\n.fa-calendar-o:before {\\n  content: \"\\\\F133\";\\n}\\n.fa-fire-extinguisher:before {\\n  content: \"\\\\F134\";\\n}\\n.fa-rocket:before {\\n  content: \"\\\\F135\";\\n}\\n.fa-maxcdn:before {\\n  content: \"\\\\F136\";\\n}\\n.fa-chevron-circle-left:before {\\n  content: \"\\\\F137\";\\n}\\n.fa-chevron-circle-right:before {\\n  content: \"\\\\F138\";\\n}\\n.fa-chevron-circle-up:before {\\n  content: \"\\\\F139\";\\n}\\n.fa-chevron-circle-down:before {\\n  content: \"\\\\F13A\";\\n}\\n.fa-html5:before {\\n  content: \"\\\\F13B\";\\n}\\n.fa-css3:before {\\n  content: \"\\\\F13C\";\\n}\\n.fa-anchor:before {\\n  content: \"\\\\F13D\";\\n}\\n.fa-unlock-alt:before {\\n  content: \"\\\\F13E\";\\n}\\n.fa-bullseye:before {\\n  content: \"\\\\F140\";\\n}\\n.fa-ellipsis-h:before {\\n  content: \"\\\\F141\";\\n}\\n.fa-ellipsis-v:before {\\n  content: \"\\\\F142\";\\n}\\n.fa-rss-square:before {\\n  content: \"\\\\F143\";\\n}\\n.fa-play-circle:before {\\n  content: \"\\\\F144\";\\n}\\n.fa-ticket:before {\\n  content: \"\\\\F145\";\\n}\\n.fa-minus-square:before {\\n  content: \"\\\\F146\";\\n}\\n.fa-minus-square-o:before {\\n  content: \"\\\\F147\";\\n}\\n.fa-level-up:before {\\n  content: \"\\\\F148\";\\n}\\n.fa-level-down:before {\\n  content: \"\\\\F149\";\\n}\\n.fa-check-square:before {\\n  content: \"\\\\F14A\";\\n}\\n.fa-pencil-square:before {\\n  content: \"\\\\F14B\";\\n}\\n.fa-external-link-square:before {\\n  content: \"\\\\F14C\";\\n}\\n.fa-share-square:before {\\n  content: \"\\\\F14D\";\\n}\\n.fa-compass:before {\\n  content: \"\\\\F14E\";\\n}\\n.fa-toggle-down:before,\\n.fa-caret-square-o-down:before {\\n  content: \"\\\\F150\";\\n}\\n.fa-toggle-up:before,\\n.fa-caret-square-o-up:before {\\n  content: \"\\\\F151\";\\n}\\n.fa-toggle-right:before,\\n.fa-caret-square-o-right:before {\\n  content: \"\\\\F152\";\\n}\\n.fa-euro:before,\\n.fa-eur:before {\\n  content: \"\\\\F153\";\\n}\\n.fa-gbp:before {\\n  content: \"\\\\F154\";\\n}\\n.fa-dollar:before,\\n.fa-usd:before {\\n  content: \"\\\\F155\";\\n}\\n.fa-rupee:before,\\n.fa-inr:before {\\n  content: \"\\\\F156\";\\n}\\n.fa-cny:before,\\n.fa-rmb:before,\\n.fa-yen:before,\\n.fa-jpy:before {\\n  content: \"\\\\F157\";\\n}\\n.fa-ruble:before,\\n.fa-rouble:before,\\n.fa-rub:before {\\n  content: \"\\\\F158\";\\n}\\n.fa-won:before,\\n.fa-krw:before {\\n  content: \"\\\\F159\";\\n}\\n.fa-bitcoin:before,\\n.fa-btc:before {\\n  content: \"\\\\F15A\";\\n}\\n.fa-file:before {\\n  content: \"\\\\F15B\";\\n}\\n.fa-file-text:before {\\n  content: \"\\\\F15C\";\\n}\\n.fa-sort-alpha-asc:before {\\n  content: \"\\\\F15D\";\\n}\\n.fa-sort-alpha-desc:before {\\n  content: \"\\\\F15E\";\\n}\\n.fa-sort-amount-asc:before {\\n  content: \"\\\\F160\";\\n}\\n.fa-sort-amount-desc:before {\\n  content: \"\\\\F161\";\\n}\\n.fa-sort-numeric-asc:before {\\n  content: \"\\\\F162\";\\n}\\n.fa-sort-numeric-desc:before {\\n  content: \"\\\\F163\";\\n}\\n.fa-thumbs-up:before {\\n  content: \"\\\\F164\";\\n}\\n.fa-thumbs-down:before {\\n  content: \"\\\\F165\";\\n}\\n.fa-youtube-square:before {\\n  content: \"\\\\F166\";\\n}\\n.fa-youtube:before {\\n  content: \"\\\\F167\";\\n}\\n.fa-xing:before {\\n  content: \"\\\\F168\";\\n}\\n.fa-xing-square:before {\\n  content: \"\\\\F169\";\\n}\\n.fa-youtube-play:before {\\n  content: \"\\\\F16A\";\\n}\\n.fa-dropbox:before {\\n  content: \"\\\\F16B\";\\n}\\n.fa-stack-overflow:before {\\n  content: \"\\\\F16C\";\\n}\\n.fa-instagram:before {\\n  content: \"\\\\F16D\";\\n}\\n.fa-flickr:before {\\n  content: \"\\\\F16E\";\\n}\\n.fa-adn:before {\\n  content: \"\\\\F170\";\\n}\\n.fa-bitbucket:before {\\n  content: \"\\\\F171\";\\n}\\n.fa-bitbucket-square:before {\\n  content: \"\\\\F172\";\\n}\\n.fa-tumblr:before {\\n  content: \"\\\\F173\";\\n}\\n.fa-tumblr-square:before {\\n  content: \"\\\\F174\";\\n}\\n.fa-long-arrow-down:before {\\n  content: \"\\\\F175\";\\n}\\n.fa-long-arrow-up:before {\\n  content: \"\\\\F176\";\\n}\\n.fa-long-arrow-left:before {\\n  content: \"\\\\F177\";\\n}\\n.fa-long-arrow-right:before {\\n  content: \"\\\\F178\";\\n}\\n.fa-apple:before {\\n  content: \"\\\\F179\";\\n}\\n.fa-windows:before {\\n  content: \"\\\\F17A\";\\n}\\n.fa-android:before {\\n  content: \"\\\\F17B\";\\n}\\n.fa-linux:before {\\n  content: \"\\\\F17C\";\\n}\\n.fa-dribbble:before {\\n  content: \"\\\\F17D\";\\n}\\n.fa-skype:before {\\n  content: \"\\\\F17E\";\\n}\\n.fa-foursquare:before {\\n  content: \"\\\\F180\";\\n}\\n.fa-trello:before {\\n  content: \"\\\\F181\";\\n}\\n.fa-female:before {\\n  content: \"\\\\F182\";\\n}\\n.fa-male:before {\\n  content: \"\\\\F183\";\\n}\\n.fa-gittip:before,\\n.fa-gratipay:before {\\n  content: \"\\\\F184\";\\n}\\n.fa-sun-o:before {\\n  content: \"\\\\F185\";\\n}\\n.fa-moon-o:before {\\n  content: \"\\\\F186\";\\n}\\n.fa-archive:before {\\n  content: \"\\\\F187\";\\n}\\n.fa-bug:before {\\n  content: \"\\\\F188\";\\n}\\n.fa-vk:before {\\n  content: \"\\\\F189\";\\n}\\n.fa-weibo:before {\\n  content: \"\\\\F18A\";\\n}\\n.fa-renren:before {\\n  content: \"\\\\F18B\";\\n}\\n.fa-pagelines:before {\\n  content: \"\\\\F18C\";\\n}\\n.fa-stack-exchange:before {\\n  content: \"\\\\F18D\";\\n}\\n.fa-arrow-circle-o-right:before {\\n  content: \"\\\\F18E\";\\n}\\n.fa-arrow-circle-o-left:before {\\n  content: \"\\\\F190\";\\n}\\n.fa-toggle-left:before,\\n.fa-caret-square-o-left:before {\\n  content: \"\\\\F191\";\\n}\\n.fa-dot-circle-o:before {\\n  content: \"\\\\F192\";\\n}\\n.fa-wheelchair:before {\\n  content: \"\\\\F193\";\\n}\\n.fa-vimeo-square:before {\\n  content: \"\\\\F194\";\\n}\\n.fa-turkish-lira:before,\\n.fa-try:before {\\n  content: \"\\\\F195\";\\n}\\n.fa-plus-square-o:before {\\n  content: \"\\\\F196\";\\n}\\n.fa-space-shuttle:before {\\n  content: \"\\\\F197\";\\n}\\n.fa-slack:before {\\n  content: \"\\\\F198\";\\n}\\n.fa-envelope-square:before {\\n  content: \"\\\\F199\";\\n}\\n.fa-wordpress:before {\\n  content: \"\\\\F19A\";\\n}\\n.fa-openid:before {\\n  content: \"\\\\F19B\";\\n}\\n.fa-institution:before,\\n.fa-bank:before,\\n.fa-university:before {\\n  content: \"\\\\F19C\";\\n}\\n.fa-mortar-board:before,\\n.fa-graduation-cap:before {\\n  content: \"\\\\F19D\";\\n}\\n.fa-yahoo:before {\\n  content: \"\\\\F19E\";\\n}\\n.fa-google:before {\\n  content: \"\\\\F1A0\";\\n}\\n.fa-reddit:before {\\n  content: \"\\\\F1A1\";\\n}\\n.fa-reddit-square:before {\\n  content: \"\\\\F1A2\";\\n}\\n.fa-stumbleupon-circle:before {\\n  content: \"\\\\F1A3\";\\n}\\n.fa-stumbleupon:before {\\n  content: \"\\\\F1A4\";\\n}\\n.fa-delicious:before {\\n  content: \"\\\\F1A5\";\\n}\\n.fa-digg:before {\\n  content: \"\\\\F1A6\";\\n}\\n.fa-pied-piper-pp:before {\\n  content: \"\\\\F1A7\";\\n}\\n.fa-pied-piper-alt:before {\\n  content: \"\\\\F1A8\";\\n}\\n.fa-drupal:before {\\n  content: \"\\\\F1A9\";\\n}\\n.fa-joomla:before {\\n  content: \"\\\\F1AA\";\\n}\\n.fa-language:before {\\n  content: \"\\\\F1AB\";\\n}\\n.fa-fax:before {\\n  content: \"\\\\F1AC\";\\n}\\n.fa-building:before {\\n  content: \"\\\\F1AD\";\\n}\\n.fa-child:before {\\n  content: \"\\\\F1AE\";\\n}\\n.fa-paw:before {\\n  content: \"\\\\F1B0\";\\n}\\n.fa-spoon:before {\\n  content: \"\\\\F1B1\";\\n}\\n.fa-cube:before {\\n  content: \"\\\\F1B2\";\\n}\\n.fa-cubes:before {\\n  content: \"\\\\F1B3\";\\n}\\n.fa-behance:before {\\n  content: \"\\\\F1B4\";\\n}\\n.fa-behance-square:before {\\n  content: \"\\\\F1B5\";\\n}\\n.fa-steam:before {\\n  content: \"\\\\F1B6\";\\n}\\n.fa-steam-square:before {\\n  content: \"\\\\F1B7\";\\n}\\n.fa-recycle:before {\\n  content: \"\\\\F1B8\";\\n}\\n.fa-automobile:before,\\n.fa-car:before {\\n  content: \"\\\\F1B9\";\\n}\\n.fa-cab:before,\\n.fa-taxi:before {\\n  content: \"\\\\F1BA\";\\n}\\n.fa-tree:before {\\n  content: \"\\\\F1BB\";\\n}\\n.fa-spotify:before {\\n  content: \"\\\\F1BC\";\\n}\\n.fa-deviantart:before {\\n  content: \"\\\\F1BD\";\\n}\\n.fa-soundcloud:before {\\n  content: \"\\\\F1BE\";\\n}\\n.fa-database:before {\\n  content: \"\\\\F1C0\";\\n}\\n.fa-file-pdf-o:before {\\n  content: \"\\\\F1C1\";\\n}\\n.fa-file-word-o:before {\\n  content: \"\\\\F1C2\";\\n}\\n.fa-file-excel-o:before {\\n  content: \"\\\\F1C3\";\\n}\\n.fa-file-powerpoint-o:before {\\n  content: \"\\\\F1C4\";\\n}\\n.fa-file-photo-o:before,\\n.fa-file-picture-o:before,\\n.fa-file-image-o:before {\\n  content: \"\\\\F1C5\";\\n}\\n.fa-file-zip-o:before,\\n.fa-file-archive-o:before {\\n  content: \"\\\\F1C6\";\\n}\\n.fa-file-sound-o:before,\\n.fa-file-audio-o:before {\\n  content: \"\\\\F1C7\";\\n}\\n.fa-file-movie-o:before,\\n.fa-file-video-o:before {\\n  content: \"\\\\F1C8\";\\n}\\n.fa-file-code-o:before {\\n  content: \"\\\\F1C9\";\\n}\\n.fa-vine:before {\\n  content: \"\\\\F1CA\";\\n}\\n.fa-codepen:before {\\n  content: \"\\\\F1CB\";\\n}\\n.fa-jsfiddle:before {\\n  content: \"\\\\F1CC\";\\n}\\n.fa-life-bouy:before,\\n.fa-life-buoy:before,\\n.fa-life-saver:before,\\n.fa-support:before,\\n.fa-life-ring:before {\\n  content: \"\\\\F1CD\";\\n}\\n.fa-circle-o-notch:before {\\n  content: \"\\\\F1CE\";\\n}\\n.fa-ra:before,\\n.fa-resistance:before,\\n.fa-rebel:before {\\n  content: \"\\\\F1D0\";\\n}\\n.fa-ge:before,\\n.fa-empire:before {\\n  content: \"\\\\F1D1\";\\n}\\n.fa-git-square:before {\\n  content: \"\\\\F1D2\";\\n}\\n.fa-git:before {\\n  content: \"\\\\F1D3\";\\n}\\n.fa-y-combinator-square:before,\\n.fa-yc-square:before,\\n.fa-hacker-news:before {\\n  content: \"\\\\F1D4\";\\n}\\n.fa-tencent-weibo:before {\\n  content: \"\\\\F1D5\";\\n}\\n.fa-qq:before {\\n  content: \"\\\\F1D6\";\\n}\\n.fa-wechat:before,\\n.fa-weixin:before {\\n  content: \"\\\\F1D7\";\\n}\\n.fa-send:before,\\n.fa-paper-plane:before {\\n  content: \"\\\\F1D8\";\\n}\\n.fa-send-o:before,\\n.fa-paper-plane-o:before {\\n  content: \"\\\\F1D9\";\\n}\\n.fa-history:before {\\n  content: \"\\\\F1DA\";\\n}\\n.fa-circle-thin:before {\\n  content: \"\\\\F1DB\";\\n}\\n.fa-header:before {\\n  content: \"\\\\F1DC\";\\n}\\n.fa-paragraph:before {\\n  content: \"\\\\F1DD\";\\n}\\n.fa-sliders:before {\\n  content: \"\\\\F1DE\";\\n}\\n.fa-share-alt:before {\\n  content: \"\\\\F1E0\";\\n}\\n.fa-share-alt-square:before {\\n  content: \"\\\\F1E1\";\\n}\\n.fa-bomb:before {\\n  content: \"\\\\F1E2\";\\n}\\n.fa-soccer-ball-o:before,\\n.fa-futbol-o:before {\\n  content: \"\\\\F1E3\";\\n}\\n.fa-tty:before {\\n  content: \"\\\\F1E4\";\\n}\\n.fa-binoculars:before {\\n  content: \"\\\\F1E5\";\\n}\\n.fa-plug:before {\\n  content: \"\\\\F1E6\";\\n}\\n.fa-slideshare:before {\\n  content: \"\\\\F1E7\";\\n}\\n.fa-twitch:before {\\n  content: \"\\\\F1E8\";\\n}\\n.fa-yelp:before {\\n  content: \"\\\\F1E9\";\\n}\\n.fa-newspaper-o:before {\\n  content: \"\\\\F1EA\";\\n}\\n.fa-wifi:before {\\n  content: \"\\\\F1EB\";\\n}\\n.fa-calculator:before {\\n  content: \"\\\\F1EC\";\\n}\\n.fa-paypal:before {\\n  content: \"\\\\F1ED\";\\n}\\n.fa-google-wallet:before {\\n  content: \"\\\\F1EE\";\\n}\\n.fa-cc-visa:before {\\n  content: \"\\\\F1F0\";\\n}\\n.fa-cc-mastercard:before {\\n  content: \"\\\\F1F1\";\\n}\\n.fa-cc-discover:before {\\n  content: \"\\\\F1F2\";\\n}\\n.fa-cc-amex:before {\\n  content: \"\\\\F1F3\";\\n}\\n.fa-cc-paypal:before {\\n  content: \"\\\\F1F4\";\\n}\\n.fa-cc-stripe:before {\\n  content: \"\\\\F1F5\";\\n}\\n.fa-bell-slash:before {\\n  content: \"\\\\F1F6\";\\n}\\n.fa-bell-slash-o:before {\\n  content: \"\\\\F1F7\";\\n}\\n.fa-trash:before {\\n  content: \"\\\\F1F8\";\\n}\\n.fa-copyright:before {\\n  content: \"\\\\F1F9\";\\n}\\n.fa-at:before {\\n  content: \"\\\\F1FA\";\\n}\\n.fa-eyedropper:before {\\n  content: \"\\\\F1FB\";\\n}\\n.fa-paint-brush:before {\\n  content: \"\\\\F1FC\";\\n}\\n.fa-birthday-cake:before {\\n  content: \"\\\\F1FD\";\\n}\\n.fa-area-chart:before {\\n  content: \"\\\\F1FE\";\\n}\\n.fa-pie-chart:before {\\n  content: \"\\\\F200\";\\n}\\n.fa-line-chart:before {\\n  content: \"\\\\F201\";\\n}\\n.fa-lastfm:before {\\n  content: \"\\\\F202\";\\n}\\n.fa-lastfm-square:before {\\n  content: \"\\\\F203\";\\n}\\n.fa-toggle-off:before {\\n  content: \"\\\\F204\";\\n}\\n.fa-toggle-on:before {\\n  content: \"\\\\F205\";\\n}\\n.fa-bicycle:before {\\n  content: \"\\\\F206\";\\n}\\n.fa-bus:before {\\n  content: \"\\\\F207\";\\n}\\n.fa-ioxhost:before {\\n  content: \"\\\\F208\";\\n}\\n.fa-angellist:before {\\n  content: \"\\\\F209\";\\n}\\n.fa-cc:before {\\n  content: \"\\\\F20A\";\\n}\\n.fa-shekel:before,\\n.fa-sheqel:before,\\n.fa-ils:before {\\n  content: \"\\\\F20B\";\\n}\\n.fa-meanpath:before {\\n  content: \"\\\\F20C\";\\n}\\n.fa-buysellads:before {\\n  content: \"\\\\F20D\";\\n}\\n.fa-connectdevelop:before {\\n  content: \"\\\\F20E\";\\n}\\n.fa-dashcube:before {\\n  content: \"\\\\F210\";\\n}\\n.fa-forumbee:before {\\n  content: \"\\\\F211\";\\n}\\n.fa-leanpub:before {\\n  content: \"\\\\F212\";\\n}\\n.fa-sellsy:before {\\n  content: \"\\\\F213\";\\n}\\n.fa-shirtsinbulk:before {\\n  content: \"\\\\F214\";\\n}\\n.fa-simplybuilt:before {\\n  content: \"\\\\F215\";\\n}\\n.fa-skyatlas:before {\\n  content: \"\\\\F216\";\\n}\\n.fa-cart-plus:before {\\n  content: \"\\\\F217\";\\n}\\n.fa-cart-arrow-down:before {\\n  content: \"\\\\F218\";\\n}\\n.fa-diamond:before {\\n  content: \"\\\\F219\";\\n}\\n.fa-ship:before {\\n  content: \"\\\\F21A\";\\n}\\n.fa-user-secret:before {\\n  content: \"\\\\F21B\";\\n}\\n.fa-motorcycle:before {\\n  content: \"\\\\F21C\";\\n}\\n.fa-street-view:before {\\n  content: \"\\\\F21D\";\\n}\\n.fa-heartbeat:before {\\n  content: \"\\\\F21E\";\\n}\\n.fa-venus:before {\\n  content: \"\\\\F221\";\\n}\\n.fa-mars:before {\\n  content: \"\\\\F222\";\\n}\\n.fa-mercury:before {\\n  content: \"\\\\F223\";\\n}\\n.fa-intersex:before,\\n.fa-transgender:before {\\n  content: \"\\\\F224\";\\n}\\n.fa-transgender-alt:before {\\n  content: \"\\\\F225\";\\n}\\n.fa-venus-double:before {\\n  content: \"\\\\F226\";\\n}\\n.fa-mars-double:before {\\n  content: \"\\\\F227\";\\n}\\n.fa-venus-mars:before {\\n  content: \"\\\\F228\";\\n}\\n.fa-mars-stroke:before {\\n  content: \"\\\\F229\";\\n}\\n.fa-mars-stroke-v:before {\\n  content: \"\\\\F22A\";\\n}\\n.fa-mars-stroke-h:before {\\n  content: \"\\\\F22B\";\\n}\\n.fa-neuter:before {\\n  content: \"\\\\F22C\";\\n}\\n.fa-genderless:before {\\n  content: \"\\\\F22D\";\\n}\\n.fa-facebook-official:before {\\n  content: \"\\\\F230\";\\n}\\n.fa-pinterest-p:before {\\n  content: \"\\\\F231\";\\n}\\n.fa-whatsapp:before {\\n  content: \"\\\\F232\";\\n}\\n.fa-server:before {\\n  content: \"\\\\F233\";\\n}\\n.fa-user-plus:before {\\n  content: \"\\\\F234\";\\n}\\n.fa-user-times:before {\\n  content: \"\\\\F235\";\\n}\\n.fa-hotel:before,\\n.fa-bed:before {\\n  content: \"\\\\F236\";\\n}\\n.fa-viacoin:before {\\n  content: \"\\\\F237\";\\n}\\n.fa-train:before {\\n  content: \"\\\\F238\";\\n}\\n.fa-subway:before {\\n  content: \"\\\\F239\";\\n}\\n.fa-medium:before {\\n  content: \"\\\\F23A\";\\n}\\n.fa-yc:before,\\n.fa-y-combinator:before {\\n  content: \"\\\\F23B\";\\n}\\n.fa-optin-monster:before {\\n  content: \"\\\\F23C\";\\n}\\n.fa-opencart:before {\\n  content: \"\\\\F23D\";\\n}\\n.fa-expeditedssl:before {\\n  content: \"\\\\F23E\";\\n}\\n.fa-battery-4:before,\\n.fa-battery:before,\\n.fa-battery-full:before {\\n  content: \"\\\\F240\";\\n}\\n.fa-battery-3:before,\\n.fa-battery-three-quarters:before {\\n  content: \"\\\\F241\";\\n}\\n.fa-battery-2:before,\\n.fa-battery-half:before {\\n  content: \"\\\\F242\";\\n}\\n.fa-battery-1:before,\\n.fa-battery-quarter:before {\\n  content: \"\\\\F243\";\\n}\\n.fa-battery-0:before,\\n.fa-battery-empty:before {\\n  content: \"\\\\F244\";\\n}\\n.fa-mouse-pointer:before {\\n  content: \"\\\\F245\";\\n}\\n.fa-i-cursor:before {\\n  content: \"\\\\F246\";\\n}\\n.fa-object-group:before {\\n  content: \"\\\\F247\";\\n}\\n.fa-object-ungroup:before {\\n  content: \"\\\\F248\";\\n}\\n.fa-sticky-note:before {\\n  content: \"\\\\F249\";\\n}\\n.fa-sticky-note-o:before {\\n  content: \"\\\\F24A\";\\n}\\n.fa-cc-jcb:before {\\n  content: \"\\\\F24B\";\\n}\\n.fa-cc-diners-club:before {\\n  content: \"\\\\F24C\";\\n}\\n.fa-clone:before {\\n  content: \"\\\\F24D\";\\n}\\n.fa-balance-scale:before {\\n  content: \"\\\\F24E\";\\n}\\n.fa-hourglass-o:before {\\n  content: \"\\\\F250\";\\n}\\n.fa-hourglass-1:before,\\n.fa-hourglass-start:before {\\n  content: \"\\\\F251\";\\n}\\n.fa-hourglass-2:before,\\n.fa-hourglass-half:before {\\n  content: \"\\\\F252\";\\n}\\n.fa-hourglass-3:before,\\n.fa-hourglass-end:before {\\n  content: \"\\\\F253\";\\n}\\n.fa-hourglass:before {\\n  content: \"\\\\F254\";\\n}\\n.fa-hand-grab-o:before,\\n.fa-hand-rock-o:before {\\n  content: \"\\\\F255\";\\n}\\n.fa-hand-stop-o:before,\\n.fa-hand-paper-o:before {\\n  content: \"\\\\F256\";\\n}\\n.fa-hand-scissors-o:before {\\n  content: \"\\\\F257\";\\n}\\n.fa-hand-lizard-o:before {\\n  content: \"\\\\F258\";\\n}\\n.fa-hand-spock-o:before {\\n  content: \"\\\\F259\";\\n}\\n.fa-hand-pointer-o:before {\\n  content: \"\\\\F25A\";\\n}\\n.fa-hand-peace-o:before {\\n  content: \"\\\\F25B\";\\n}\\n.fa-trademark:before {\\n  content: \"\\\\F25C\";\\n}\\n.fa-registered:before {\\n  content: \"\\\\F25D\";\\n}\\n.fa-creative-commons:before {\\n  content: \"\\\\F25E\";\\n}\\n.fa-gg:before {\\n  content: \"\\\\F260\";\\n}\\n.fa-gg-circle:before {\\n  content: \"\\\\F261\";\\n}\\n.fa-tripadvisor:before {\\n  content: \"\\\\F262\";\\n}\\n.fa-odnoklassniki:before {\\n  content: \"\\\\F263\";\\n}\\n.fa-odnoklassniki-square:before {\\n  content: \"\\\\F264\";\\n}\\n.fa-get-pocket:before {\\n  content: \"\\\\F265\";\\n}\\n.fa-wikipedia-w:before {\\n  content: \"\\\\F266\";\\n}\\n.fa-safari:before {\\n  content: \"\\\\F267\";\\n}\\n.fa-chrome:before {\\n  content: \"\\\\F268\";\\n}\\n.fa-firefox:before {\\n  content: \"\\\\F269\";\\n}\\n.fa-opera:before {\\n  content: \"\\\\F26A\";\\n}\\n.fa-internet-explorer:before {\\n  content: \"\\\\F26B\";\\n}\\n.fa-tv:before,\\n.fa-television:before {\\n  content: \"\\\\F26C\";\\n}\\n.fa-contao:before {\\n  content: \"\\\\F26D\";\\n}\\n.fa-500px:before {\\n  content: \"\\\\F26E\";\\n}\\n.fa-amazon:before {\\n  content: \"\\\\F270\";\\n}\\n.fa-calendar-plus-o:before {\\n  content: \"\\\\F271\";\\n}\\n.fa-calendar-minus-o:before {\\n  content: \"\\\\F272\";\\n}\\n.fa-calendar-times-o:before {\\n  content: \"\\\\F273\";\\n}\\n.fa-calendar-check-o:before {\\n  content: \"\\\\F274\";\\n}\\n.fa-industry:before {\\n  content: \"\\\\F275\";\\n}\\n.fa-map-pin:before {\\n  content: \"\\\\F276\";\\n}\\n.fa-map-signs:before {\\n  content: \"\\\\F277\";\\n}\\n.fa-map-o:before {\\n  content: \"\\\\F278\";\\n}\\n.fa-map:before {\\n  content: \"\\\\F279\";\\n}\\n.fa-commenting:before {\\n  content: \"\\\\F27A\";\\n}\\n.fa-commenting-o:before {\\n  content: \"\\\\F27B\";\\n}\\n.fa-houzz:before {\\n  content: \"\\\\F27C\";\\n}\\n.fa-vimeo:before {\\n  content: \"\\\\F27D\";\\n}\\n.fa-black-tie:before {\\n  content: \"\\\\F27E\";\\n}\\n.fa-fonticons:before {\\n  content: \"\\\\F280\";\\n}\\n.fa-reddit-alien:before {\\n  content: \"\\\\F281\";\\n}\\n.fa-edge:before {\\n  content: \"\\\\F282\";\\n}\\n.fa-credit-card-alt:before {\\n  content: \"\\\\F283\";\\n}\\n.fa-codiepie:before {\\n  content: \"\\\\F284\";\\n}\\n.fa-modx:before {\\n  content: \"\\\\F285\";\\n}\\n.fa-fort-awesome:before {\\n  content: \"\\\\F286\";\\n}\\n.fa-usb:before {\\n  content: \"\\\\F287\";\\n}\\n.fa-product-hunt:before {\\n  content: \"\\\\F288\";\\n}\\n.fa-mixcloud:before {\\n  content: \"\\\\F289\";\\n}\\n.fa-scribd:before {\\n  content: \"\\\\F28A\";\\n}\\n.fa-pause-circle:before {\\n  content: \"\\\\F28B\";\\n}\\n.fa-pause-circle-o:before {\\n  content: \"\\\\F28C\";\\n}\\n.fa-stop-circle:before {\\n  content: \"\\\\F28D\";\\n}\\n.fa-stop-circle-o:before {\\n  content: \"\\\\F28E\";\\n}\\n.fa-shopping-bag:before {\\n  content: \"\\\\F290\";\\n}\\n.fa-shopping-basket:before {\\n  content: \"\\\\F291\";\\n}\\n.fa-hashtag:before {\\n  content: \"\\\\F292\";\\n}\\n.fa-bluetooth:before {\\n  content: \"\\\\F293\";\\n}\\n.fa-bluetooth-b:before {\\n  content: \"\\\\F294\";\\n}\\n.fa-percent:before {\\n  content: \"\\\\F295\";\\n}\\n.fa-gitlab:before {\\n  content: \"\\\\F296\";\\n}\\n.fa-wpbeginner:before {\\n  content: \"\\\\F297\";\\n}\\n.fa-wpforms:before {\\n  content: \"\\\\F298\";\\n}\\n.fa-envira:before {\\n  content: \"\\\\F299\";\\n}\\n.fa-universal-access:before {\\n  content: \"\\\\F29A\";\\n}\\n.fa-wheelchair-alt:before {\\n  content: \"\\\\F29B\";\\n}\\n.fa-question-circle-o:before {\\n  content: \"\\\\F29C\";\\n}\\n.fa-blind:before {\\n  content: \"\\\\F29D\";\\n}\\n.fa-audio-description:before {\\n  content: \"\\\\F29E\";\\n}\\n.fa-volume-control-phone:before {\\n  content: \"\\\\F2A0\";\\n}\\n.fa-braille:before {\\n  content: \"\\\\F2A1\";\\n}\\n.fa-assistive-listening-systems:before {\\n  content: \"\\\\F2A2\";\\n}\\n.fa-asl-interpreting:before,\\n.fa-american-sign-language-interpreting:before {\\n  content: \"\\\\F2A3\";\\n}\\n.fa-deafness:before,\\n.fa-hard-of-hearing:before,\\n.fa-deaf:before {\\n  content: \"\\\\F2A4\";\\n}\\n.fa-glide:before {\\n  content: \"\\\\F2A5\";\\n}\\n.fa-glide-g:before {\\n  content: \"\\\\F2A6\";\\n}\\n.fa-signing:before,\\n.fa-sign-language:before {\\n  content: \"\\\\F2A7\";\\n}\\n.fa-low-vision:before {\\n  content: \"\\\\F2A8\";\\n}\\n.fa-viadeo:before {\\n  content: \"\\\\F2A9\";\\n}\\n.fa-viadeo-square:before {\\n  content: \"\\\\F2AA\";\\n}\\n.fa-snapchat:before {\\n  content: \"\\\\F2AB\";\\n}\\n.fa-snapchat-ghost:before {\\n  content: \"\\\\F2AC\";\\n}\\n.fa-snapchat-square:before {\\n  content: \"\\\\F2AD\";\\n}\\n.fa-pied-piper:before {\\n  content: \"\\\\F2AE\";\\n}\\n.fa-first-order:before {\\n  content: \"\\\\F2B0\";\\n}\\n.fa-yoast:before {\\n  content: \"\\\\F2B1\";\\n}\\n.fa-themeisle:before {\\n  content: \"\\\\F2B2\";\\n}\\n.fa-google-plus-circle:before,\\n.fa-google-plus-official:before {\\n  content: \"\\\\F2B3\";\\n}\\n.fa-fa:before,\\n.fa-font-awesome:before {\\n  content: \"\\\\F2B4\";\\n}\\n.fa-handshake-o:before {\\n  content: \"\\\\F2B5\";\\n}\\n.fa-envelope-open:before {\\n  content: \"\\\\F2B6\";\\n}\\n.fa-envelope-open-o:before {\\n  content: \"\\\\F2B7\";\\n}\\n.fa-linode:before {\\n  content: \"\\\\F2B8\";\\n}\\n.fa-address-book:before {\\n  content: \"\\\\F2B9\";\\n}\\n.fa-address-book-o:before {\\n  content: \"\\\\F2BA\";\\n}\\n.fa-vcard:before,\\n.fa-address-card:before {\\n  content: \"\\\\F2BB\";\\n}\\n.fa-vcard-o:before,\\n.fa-address-card-o:before {\\n  content: \"\\\\F2BC\";\\n}\\n.fa-user-circle:before {\\n  content: \"\\\\F2BD\";\\n}\\n.fa-user-circle-o:before {\\n  content: \"\\\\F2BE\";\\n}\\n.fa-user-o:before {\\n  content: \"\\\\F2C0\";\\n}\\n.fa-id-badge:before {\\n  content: \"\\\\F2C1\";\\n}\\n.fa-drivers-license:before,\\n.fa-id-card:before {\\n  content: \"\\\\F2C2\";\\n}\\n.fa-drivers-license-o:before,\\n.fa-id-card-o:before {\\n  content: \"\\\\F2C3\";\\n}\\n.fa-quora:before {\\n  content: \"\\\\F2C4\";\\n}\\n.fa-free-code-camp:before {\\n  content: \"\\\\F2C5\";\\n}\\n.fa-telegram:before {\\n  content: \"\\\\F2C6\";\\n}\\n.fa-thermometer-4:before,\\n.fa-thermometer:before,\\n.fa-thermometer-full:before {\\n  content: \"\\\\F2C7\";\\n}\\n.fa-thermometer-3:before,\\n.fa-thermometer-three-quarters:before {\\n  content: \"\\\\F2C8\";\\n}\\n.fa-thermometer-2:before,\\n.fa-thermometer-half:before {\\n  content: \"\\\\F2C9\";\\n}\\n.fa-thermometer-1:before,\\n.fa-thermometer-quarter:before {\\n  content: \"\\\\F2CA\";\\n}\\n.fa-thermometer-0:before,\\n.fa-thermometer-empty:before {\\n  content: \"\\\\F2CB\";\\n}\\n.fa-shower:before {\\n  content: \"\\\\F2CC\";\\n}\\n.fa-bathtub:before,\\n.fa-s15:before,\\n.fa-bath:before {\\n  content: \"\\\\F2CD\";\\n}\\n.fa-podcast:before {\\n  content: \"\\\\F2CE\";\\n}\\n.fa-window-maximize:before {\\n  content: \"\\\\F2D0\";\\n}\\n.fa-window-minimize:before {\\n  content: \"\\\\F2D1\";\\n}\\n.fa-window-restore:before {\\n  content: \"\\\\F2D2\";\\n}\\n.fa-times-rectangle:before,\\n.fa-window-close:before {\\n  content: \"\\\\F2D3\";\\n}\\n.fa-times-rectangle-o:before,\\n.fa-window-close-o:before {\\n  content: \"\\\\F2D4\";\\n}\\n.fa-bandcamp:before {\\n  content: \"\\\\F2D5\";\\n}\\n.fa-grav:before {\\n  content: \"\\\\F2D6\";\\n}\\n.fa-etsy:before {\\n  content: \"\\\\F2D7\";\\n}\\n.fa-imdb:before {\\n  content: \"\\\\F2D8\";\\n}\\n.fa-ravelry:before {\\n  content: \"\\\\F2D9\";\\n}\\n.fa-eercast:before {\\n  content: \"\\\\F2DA\";\\n}\\n.fa-microchip:before {\\n  content: \"\\\\F2DB\";\\n}\\n.fa-snowflake-o:before {\\n  content: \"\\\\F2DC\";\\n}\\n.fa-superpowers:before {\\n  content: \"\\\\F2DD\";\\n}\\n.fa-wpexplorer:before {\\n  content: \"\\\\F2DE\";\\n}\\n.fa-meetup:before {\\n  content: \"\\\\F2E0\";\\n}\\n.sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  border: 0;\\n}\\n.sr-only-focusable:active,\\n.sr-only-focusable:focus {\\n  position: static;\\n  width: auto;\\n  height: auto;\\n  margin: 0;\\n  overflow: visible;\\n  clip: auto;\\n}\\n', \"\" ]);\n}, function(module, exports) {\n    module.exports = function(url) {\n        return \"string\" != typeof url ? url : (/^['\"].*['\"]$/.test(url) && (url = url.slice(1, -1)), \n        /[\"'() \\t\\n]/.test(url) ? '\"' + url.replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\") + '\"' : url);\n    };\n}, function(module, exports) {\n    function cssWithMappingToString(item, useSourceMap) {\n        var content = item[1] || \"\", cssMapping = item[3];\n        if (!cssMapping) return content;\n        if (useSourceMap && \"function\" == typeof btoa) {\n            var sourceMapping = toComment(cssMapping);\n            return [ content ].concat(cssMapping.sources.map(function(source) {\n                return \"/*# sourceURL=\" + cssMapping.sourceRoot + source + \" */\";\n            })).concat([ sourceMapping ]).join(\"\\n\");\n        }\n        return [ content ].join(\"\\n\");\n    }\n    function toComment(sourceMap) {\n        return \"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + \" */\";\n    }\n    module.exports = function(useSourceMap) {\n        var list = [];\n        return list.toString = function() {\n            return this.map(function(item) {\n                var content = cssWithMappingToString(item, useSourceMap);\n                return item[2] ? \"@media \" + item[2] + \"{\" + content + \"}\" : content;\n            }).join(\"\");\n        }, list.i = function(modules, mediaQuery) {\n            \"string\" == typeof modules && (modules = [ [ null, modules, \"\" ] ]);\n            for (var alreadyImportedModules = {}, i = 0; i < this.length; i++) {\n                var id = this[i][0];\n                \"number\" == typeof id && (alreadyImportedModules[id] = !0);\n            }\n            for (i = 0; i < modules.length; i++) {\n                var item = modules[i];\n                \"number\" == typeof item[0] && alreadyImportedModules[item[0]] || (mediaQuery && !item[2] ? item[2] = mediaQuery : mediaQuery && (item[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\"), \n                list.push(item));\n            }\n        }, list;\n    };\n}, function(module, exports) {\n    module.exports = \"data:font/woff2;base64,d09GMgABAAAAAS1oAA0AAAAChpgAAS0OAAQBywAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGiAGYACFchEIComZKIe2WAE2AiQDlXALlhAABCAFiQYHtHVbUglyR2H3kYQqug2BJ+096zq1GibTzT1ytyoKAhnlGvH2XQR0B9xFqm6jsv/////kpDFG2w7cQODV9Pt8rYoUCGaTbZJgmyTYkaFAZFtCUREkKFtVPCsorbhAUNA1HuRggbAO2j72UBAaO+EokdExs/1s2/5o1Kiiwimf3Fl5lPJKaenrF62Fznwl24G3XqwUR4KiM7gSbp6V6LraldwKxM2QRIqecFxZciCUTN9Q9A6NG4N0pSnLEZjvE6c2UsJeIlMLTH7xWVLXQ1hSFQmKNIGO5kb6eVxbv+g3bqHirnwdc+C7jHEeo027jiVLyf8XLtu6DiwL+oT3+EzQdP8n9hCQyU0dLBEVY/eIK2L6xNeH50/9c/le2CSFhtd6Lgf1bcWgDPxoJmdi3vDhdu2H8wEOySeKDzajOrC7w/Nz622jYowx2KhtMCLHghqwvypWjKiNHqNjoyQsMEFUUFS0MRID+/SsPAvtO+3z0mAQ5rYn8UgOP/Fzzqk6kQ9ORJ+o/KkQSRGkJIwEVBSLW4GCYjSKEc38f+rs7yyvzrzX772jYmw2kboLSUzpaX3bjCbgNOOUbSwnyxbL8yO916Wzf1J3AaJidcC2LEuWC8YGm+J2iwPbCG1fLcDA5lxIi537jkhI/qrzk+oHxsI/mJbTbfMLOVCIrdgpOedKqIYkxr2InOex9Dj46Mfazs5+uTvEchWNbr89JBEatR+UTmRkbhshJ66m8OM7s/SsOJm8J9lOpu0eIX8tGAZKGcq20y7g2PqR7livPQwsEgQOkJseImA6GKL/Gw8JCSB7je+e3OC8EstLISefAKEtRkiUnAmJIyR+m1pfhLmdEBK1A041VlU4RsivHKKOJRRQ1Pvdq9rb+wYIDIZDcAgCJARRGaK0u9oQnXKs7KLKvZvuumu7a9obpzPZtxPROlIRJR4QtoEye/SH3qn1kh1oJbspOMkR9gD48QEPGApJTEuQNnb0I+37s+7+Biw70KY2h6BOmjLOaHa3Dw4I/u9/zf7rDE9Pkad0IxaFBuJ4VInvqkJmAp2ehHFeFiOcrp+WP3v+NWKKSeLgJS1XWpDruWKkQaMTDF7kMc3ZbjUZ+a7pitemTlGdWSf65t3NEpYE/JFTBNwYH6YhdCIgBmBiM+n3JZMH9O8zNbsCFNFmdjurndXObM6s7jmcOmpnZj9ncpv1cP94nyCAD3wS/CAkCCBlEpQcEpRaFCjFFCR3KFpyU5DodiubWtkcz9Zx9k2i7B6b7s3q3ZltPyZzW/bldJlTklNqjqc5nK/j9z+tfNrqDfHwxT5HDswGLBBiRNW3Xqn0ql6px90bOmyKM469TkGaYKs1C5wyNrMBTPlwU/IJQd+nL1XrCsLWmLS8s7QnOVy0p9WGdLiFEK8h3/b2+rca/RuBbAAGhSBQTVK0mpA5boAKzWAVEhMoyhBA0iBIeSlN0mRNyg2QHDXp1KQTSCfSkZoc8m1TPPro23Ema7wpXM97O+4xxcNt+QebONt74YvVWIQx3S0zx5qQkSmCQiiEkSz7JfWTELC2to0ExAsFBd3923efb36+mHTt8EhXOGyQ1FoRCXKk47//PWWzGuzfMSvmBwUvyY4xVz/WsHLuEg44OVBMxtIBPnVvOSDFGDEgdMOYq8N1Y6edke7EQLP5XUsUEFLvf2JO/7uSdvuTtNQaqqgouCKKg3nrvbt7HAxjrv+P5vNzY3qmGSaucDWn5QShLGqzbiCia07EIYMug25e9/hVdR8AQHz8GD92tT73B7kdudwckXIYVWHcSFIgCxqPEPq51/jVkQCT80kNRInfy4tRv71+cOkKgNyNOzu4bvn5jUwYFyShdPkJOgloRkNZoe3eVE+gRk4dTn59F/ExImCzqPyf2GHPB8sozT9IIBGXlocfxFyWzeV1yjATTNS19fEnte26vb7NlFBibm1Pv5jrtt39jb8CGEpsiz8CAQie5XOr5wWIMCwOOIx4yULy+va+QhnH5ZFGiRAUn1/fG1JpWh34/7fUfmUjFWqwEbF3/WhPYyomRjYMrFlxwZIFe4l9P8nzPvd1Hvu2LvM0Ds5oJQVnlGAEpybX5yC4yxIpqaxSNRjlSIx9saf/y6Swa9yp2xyQJ0qZ3k+/AEmI2xO2nV/vs38FkXFPYifWSMefAEJZRU2jAxw2yHaEgTWqEE5KDeUVAU+ITgcaRgtOeCgxkjoBXLrfq0Pga45joGI4BVH0CRNk4RhbTBQoZWwcKzJ1Le7QYdaYZKKONTuiTiTU9iKiSKqPEKtTRrpv6zJpqCKK2VyzaAQ3SYz2oDxTQ08CrRm4lsiQSKAe4kV3IQEuH9fp/SFCUxJDqmcexJ2JY+MOueRzKtWnc4koNW2UPXHGyoplovvxWZELJOtcPhBmTjiAcZeMeOojdgqlNnVt7wngGZ2wYNtOTS1KAFz0EEa3x3LpRAKAHrVa0zCTByMn6qWIbuwR0kdqTILahlgUG8qMokGqnfFnWXOZKrJZytwHx17ZtZg7ItgdJGhifz25FhnPmxOYMN52SDyXVnZ/gWObXwBcWYoD7KPodztkQhYCg4sDToOEMxshJM7n57Tn4t5JfFCYIH4TJhPkA2TFLsgDG9Sw6QItYQfz+mEZCSsrwhOSOboubVL46TTjY3mvnrkji1XVwkZX7gh1vQ3cCRdpL/Ccr5RmfoA03fBsg+sOWFP0OcOEG/cxRZ3wvTNAkP3aaxOI3BVAFycjo7y2Y6y92W7qqSC68RXvU187rCX77kmK0MEru/gu80wa2EMCeLHr7h4evvrqhrF3CdrNVtuCgIG6qOGkwMP5RXhmfkhgvekwH7whZJToQFF7T2gxiRcXsUjBtkbDq9V6cxqNN/Pdibazxpx0D3J2zOip0mudu4ZoZVMzt9uHdpk5hHF8q0+C75dLKZVVXPKWQdIlo7m7AsRvHntsPIbbS7j/up3NjqKkjmmzj/FI60eASYV6nT02mldXbzDr2Qt8Fd4lQfcaamREKSENgKlwd67I7l+Cs+s7uPGm22OXRCPp/8uBTZDA3k56nPIFtwRwsF6PQ0R43sJ4aimENU/IOfsNoWDR0kVEWO548Y0g3ZJHVcjA7cuvDsSZqgSp79baiZwuJQ23v7bOiLF+DOPx+j3/CBoWQxNvpikNRoQ388rnJFqk/Si3Z8Hrb0Ktpw3bxpzAQN7lJvLD2mXuewbq4uWOo6AIbKCwZopfxlJ4mU5bp10MrpsHOGAtM5lztKbBknt/UGoB3hm4V3VjOe+FuK6phBtbPh3qLZ8uRKLcjln6H/ebFQ+AHmSHDM/C2AeisisYXnuTrrlD7veJsW3gxNnwLKaxQE48spAd2tnQ+PKJrx9/Di6NlFbx5k3w2hFT7CvTXESeK6LaUqJ80Ta1C+IncVxU4N0CppXzHB45h0SEBlg8fyTtcImA3gciu+mFppL8JJvStwveLPlwH7tz+aVU084a3f6vYrv/1E5rSZEeX+ahYNXmCkboiB/qV5OfVv+UJdnRdwitfqmkxETUkNnCy90q87N4afIeuHlbclqqhwCZW1MltEeb3BhzYEY844WjhbOsIKLBVosr/vMhK62W9/WKuNiNizl5n2vFwWZikTgy3gZz3n1sO1spZSTE+IlUnYaWa62DkuApmnaPtqk5rAGE4xune9N1E/J1j3SPyN6zQEXj9D58Q/baPFw0JQiXUnbhDKW26eXE6Kra9EDXukPMOFyR+H4pFCNrfL65LmHrb6q62gO6MDBHlHEwHRQl8fzwE6GZaHCLqboNTP+c3iKMKz6O7Oa1JaoLXk3LiphOmnPTyAZxjrQ9lRKwD77u5eSmhrBLETRy5y0q7+cl6NpoI9clO3BQ6aaUaNZDPffO+traDZca5SYUKaliYYTGS0z4QL/5nuR0uiGifjLtU11yWWy6WjbQM9GeSt5vtJhPo1b1O7loJmdPNZJSVIgvffnB0sZ7rqXyFxdBWtImhxlT8+LZdNjK+ZzPAwvNrwHpolDq60OhpBSiMBMItLZELPtwYnDQt9R6KacgXYBJ9z4aAA5RXEJswSK6l14zUj5y/Sr7uwRDPsAeHoOn4Rd4UFW6eh6tfVkRPQIP9cyVFrx99dC2xxCaGQrnDRw2LWAvIkgLCm+FJpJEl0kw/0UyWGGJlS0fqXsONcCBmTwNLH2U0RNgYDb6x+0YkGppounYaW08VXVqWala+moOQlxAjGfLM0VqZnCW+JifOrra7eoQV9vHrp+62d+zjpyUznClxLMzYW+v+xGBMYhkYYv4IJwDt92rpf2ImUqC17I/IGrOcTeuvk3D5s5mZplZtWbLHNRzAh6wGySbnAmElUj9kRTmrGyllvW5v8CIlyglLptyBuPSdz8D8r5tPX4LgnmyY1mRYmcpPMtXhCAvVngW2muptJIk5/OPDELwcn7xhgGn0/A5E942jTDRJv6ZX3ZNAFnCJYST0p175kV/iTY8w+mVx8Lt2yWLJas0rYuO36BP3kDv807h+QihgqoiWrcY309Ee3UzUw+Mx1eLTbCVUqftM3M8w/UZp5HYsw2jgKbxsFxJDjCNqy6gxS0y3a3sz+OErTuvCeyDMNUOtn1Oqy9i9fYajk57hEmZs3xiX3LEZfidX3BTaYPjyhQPPhIn3HesNfzb+lJGLNGHiCUeU1mWhLvGV2ijNkxfaeyDoz2am75pMfEz/llJN064Q3CNScnwxJS+wxIoD6hyr769MKvde2qJGfe6hXKLS7yemeXQom8pbNnE9IczbmG/VDF/XKfDSRlFKOltvfeyvd+Dm5PCRPRs+qx/ZbOzx+Ykw4Xfd1ieiMxVrPwoQJWErvdN9WEibqwOLOQqdkezHZYcicyoE3i5iq4+lUfZDFOCEYOA7r1nwMyJIpRRy3akYhQwKnrbyFBF9HnByYmMPzevJBMLwY7Y8CWeHYlHh9LR5HDJZFnIJmbiByHt+8dhNpSOfKgIKb8OO3U3I8IzyTSQbUrEs9v4Cm/39olP+HCtyIGidjhqoOqZ/HgoS8svWtxkuwOKj3jJxYP9bTdW0V9cp2bXTOU3DHCbWPN6Fh7shUg3vi2rDpa1LCgxS0hirWWQqCxyLRkco6ARcKFMy+/G7aAzPeZUmALGMql0kTLZvFiWazqptLX/CFqANcDPcwWJDnAOiNJTc1SruAUa1es6Ll21t0QilECw9S22RbfMkQYhEJQTQY3wkTK6ybYt8EYZfbHLkoAyQseDko1RGpnVF+AFKXTFw6d82iM0hHzcXPfjqIDwyGC3ZmMQLLafI9QHZ4npMTrZLdYWq6G5dHkXINtd+4eY4OQyr1p+ArGEAC4p4+mu8/Sz1wLHjODWHrWh3CVSpUuNmKu/KHmQAmCROJa2QxrXx9aN+rfL93qTuh2KSy1OjgyE8wEO9WBeK6b1i55uCKKoizO528+0GP4C5fSAnRaVVIHyM4J0UeHYo6kGCDQ8PjpKMMOIJeXdkVphYmDovQPqds2s/IZh9lQvWgEC+hScYd6dx9CTSWkJm1cxkBb88f2DX6mQED4pw/qXvkgilIr54+lwkusLg3w3bRRGtV5az81+ZosRFzBK8epeAMlJkRfcM1a5IekYpdx70zxlzC89znBg2tcM3nGtngA4XvbU2dPBSzjM60/NOfZ3MNPqWpC0fB6K3AR2P5FuwxQJ4Awzl4FmgSH9y9+30X6V/FSKIB+n5B37wcryIErTm6X7hAcRHN811wvBcKaPFLpWCbzfM4fLq7jF1/MPLj3G8czugS19p9xbzmflUuE1q/Od827so0I44ZH3g5kzLrsI0jgUCVlnoSMw3ya4va9ThC8uZmdcChpF4mbnfQ6QyCxrh6KU6ZNn/AYU+yQDuT9YWZMHKo/6lKm6Ebwxr5BwrZdFKL/X6/JSU5KkUbqYdJ7uAzYsoFHjalwI8OM8CC9dTq5z+80dpTvNJwwYSFhdjkWYMh45kIdkpmtZ/Q3ZapCOwlI20dTt9wNREiGYygDq7vcgVoa7mQolIggVXtBgl04zT/KMog/6hoOsW/EddjrgyoQ62ehe2pxy17/nEUDq0uwKjUbFX67XEeUBCE5jzELSF/H9wzhwo1xpr6K11zfP7otn5a0DKu6P0c39LINDq50awg7hW4c2tFSSP7q6tRaFJfJ6+8VAAQYYakFwQk418J4iNFSepeD0IpZ9MHVK9IePnpbInH4z9h7ZDtF7fQJ1V/aM4O5Nkx5q+jnILYJdE/WrnRGZJ2xTsiAv8FI+PKUr50+fldvYH2VCI5VCY9Ia2cAC6GpMXBESo8QtvlpolVvX+kk8jar8D/GEGHGodt5+lmtdm0fDztVURL8/U6nL2dYvGsYt1Ncl3ZKJlNnoNwyI/nemaXxDFstJocRx8XdjqIBXAZsUeAyasSDPDC83BIF4rIJITy+u5bUd8G9dkZ4PlEddinmP34Pr/If7I4WHHzepj2LN4ySTdMccqlLbJCAGvpjpf13jtGE3G81Go9Gur7KPLG4hcsvfSXwywBC847g46pJ4/zbnmWdTpmixCbKTUl5ek0Qu+HiKTdFNUz/mvJ4nR/oj/H7hK52susTsCHY0imQhRnlU3DnxLbJmVmE3aPtCrssXNP6rn5boFyypMrzGicT9FSZ2VEhNcXDwNBQ/AlJctL2yqr5YYTyR2DQQ7pYcQE1prEjURF++6AmbRRFnqs9SiXmxTZrT0WxU/tigSt2uDauWeQ9jys4imUhK9CwgNop19i/atJviDq2dBMAPi5TpiXmOAJdWy9nmbkpu259IXFDFUqNCZHzTFDS5X+iOJGvunMvGwMYuuZp3EuqWyhvCmRQBSaBwU739JOT8HJZ8fWrO1vQ5yNrkpOkTw/4RoW2HfIMx0d+Ynre3/G6+OTODOb4fAevurJDUNXECU/p8hpufeFftORPa3OzN6kKyllZaIbqZuMttp0sv+0xuO2mr7nWz7STmFSrOdDMQ1s22E4zXQH0AFLCktEJ79Vnv4rjkn9SRlBR6qzJK53VA32H3FlwZTfuJhw5SN2+z8xhkeuigFaigm2Wz8jfeLyQ0XV6Vwb8ya4ocaCSMEz0cJQCJ5THuSedC0tiDIIPPSHwIAvhOLlvJTVwLTJeM+2La7drpMU1n5vIaOp1OVi5fMLEALJ4rFuEsuKRo3XQ3tGw4jXN+SVZeDU7ly7xN8rLDf/jYkWrk3NmDLaIJb9yuxa9R5MFvEFttf4igauk9cgOc/G0+8X56NCRNmuEXG316INXvm4BzAItoIiKeh+x1N7dWe1LDu92mALhPES2ehUQ5VtbZpWeGScqOS+xMZ9u2QhD/VA+o81C1J4dLF8/KzKbvCg5xVwWE1pLzM2W2s6USBP9w5IYmkJaI25KJ5kyLGGhws6qn1U6DYVOuowx3+aEKJpjU4oU7ZSiHLC0CN3bKeKMtv9t3JFepF89uWPNVn56HhbiJ6vfGdDiJmxG1kZkDWecRiro/S02fY3S7WdiDvnAq1YeO+okFi+It7YQc7svQkWZMrHzCW25MiuecDX00iXs12RjpoKCjM+GnjB0VC4huirCUJCQsK6NETgfUhC1I7VY+mNdIpo6Y2vlPc1wItwX/lS3RO8BXNgBO+JVNid04sp1GaZWR1Du+jaU3GWvzMrE2JQLWkswPHGFdLDohjcqy2r1FLB2f3ntVhP4BC25hd7ux+YVOZ6GGLq3ySQc5cjpqoIQV/5KMGrA8SRNFtTHwYCRgTGJyx5KEgded6s5dEeV44h05PVIZdiYqUTXogAQwen8e88v4eTyI4AHqg2BNfPbUmZpkT4bZpWlaruMZxSSu7hm7KyMeS0jIRgqNw+nE6u2+gwCnjgnuyBj4iR+njyktCb4GOk0ky3ljoK5FwCVBaZWSBTJdlpgIzGzltqiQiRyaGc04hkkavHmy0gVaF0dKs4MaogauXNUeMhrWmVhiGL9Mvvbwn0nCQS39R3JSACHNMKAToNtMK8BRaKpT81nU0hPX8lO/Nf1fHtgopQYOcG9GmqdUiYcRryNrHE7bvupsfHKHbgazZNdIoAceltx5E9uK5vnu5Mgm24YXeONwsMH34eVb6RY4RxqG/tlkdKyirKOxeuywg9mmBgk4tLRCva5LUCJAMmWMZQPmlAuseeYeeOenHtpqvbicBpVKS8KIaMFYxaxC7H3qEaY2CPnDov+1YD+1aRCRKrxbOWUrYtFWTO9hTM2ZE7Omn+lkDAJCWXAus8+ICsZuXDTs57OFxqSK3B6NZOwRPHeg31ciBgXP0z8gnye5TyUSj2EBMhlO/zkfi60sud+fobYP6iGbxeJ/LtN5f5da+a8l8jT2VcT1XvrLdaDPhuJnoCkCTSWWAOdD9c4aVumpB5qeyk0hetQmkJ287dl8FkTCLKZp9X5SLCWx+nxPIr772Qzkzx1oXDMrf6Py/GGrvRqc4ucEgIOeBYjQaTiTgh5cFCQDITGZTIrlYTZztg16EitNwlKtYufSF18Ka+C1dstqxN3pjRtV+K/oo5ItgsNqWPpHdB+VC5i/wKaVYph+iMuawJMb6pa6d3TR+a2KzZ2nUxJrUNYy/4ygKD1jdnTzoiKeWzOZyRcmtq1o6kROBYgIPbfyiI6LUMmb9EG0RxSS+cInE1/oUiOoxk06LtfsEZ8zgAnF7tZ0Sn4XnOQzend4IMCU2DuYN7rpAk+kHAs4nMlZKQrJRFNF+K6E3y+ApBPUzDeXaQ/gDI0hd3nKNsDqtCSgE404RTDqVGHejPt8QAjG/w1n+urXD/EuO23JHQe07zngOcFz3UhyTB43JqqkB5KRjjMbQnME4I58W28QASYSb3XaU2f31a0Yrit7oUFFv9/la1riCaQiTuKKZOoZNYOiOpqYSVa1otqKlT6rRu1irEuFx86oZikqY5amRzU888xDoJgAn5UuZ/QVXQSo669rlpIKGbalgRcgQTDjvi2+09mjFqapdn8EhlQguAUGD2Q0SyioFsVZcWCyqpsodd3leyy9OjAqJHwy7A6DmosvBEm6yyyTYEW8hujYFPF4UBuusyNxhLCvz8xgAJvgL+s66oDI0tPWJzuN2YlWBocRRCnLtAzOC3LJ/OOP9jg5vneifVsB+oZGrIjLCOui+d6cF863Dpy+oR0r5dLCmmieS0jeXODHmlWKjh2o5KyCSsBWJHBVapl8YzDL7tx7r97HTPPrQavaP+hW5j2nNI3y71O6GcW0dGD1xcZkmf+Jb/zZZKViBlVQBpQXzALwSqV4E9FnpK5KUvhynU+Fuc9zCfMdxsGRodoYNE13mKncHg0P6CIi9jQUMvfh6OBgTcQa8US6L04hidV2gjPVubfygeEujBVmK5NAeE+XVshx6ptqXtdD36qpS22u958RLOKxOEgEOYxaqKw8JrhvtoUfKNFA/7BrqfEe39ZNNZvzH42hXbFNhbhVMgw9EHZwQjZEWGpgqXKq8jz1d5XGMeaZWdA61SDnb5E8vwA5ojuMAZ34jkbA1fqTJBw7Mtac12q0sRD63rrseCwWEssayoGdQwTFUsSJdBgWuLASJIMcVkpmHsFmiMU5xykAr2GZOVCJqybg+NHFNk9vvtYDF2ypPJ3U8+ICGfIZ72RzPSMBM8VzFo+1UC3QYkSg1PwijQ/sWzqwd8m6Xmr5idOBu9BRZWpgjIuXVHGSBT2i+rGUSCajb48boRtrxIlMRN5XoU/7hsL5lOvKKkozc1sZzjadajHwQNnYbnI8rs6+24eGI4nN0kAJiDC/m2MGCaKdHwWZP++1nTwyikTV06YJv+h9r7BUc83ZU8790CLiC1LNCq6VpC59329a3s0Y44f5Rm8qmJWn3ZeHtv+3lrU63fTWG8GTvME3ye33SMLy5I2aDqV4obRdxdvHYRk2HnY17RJS/aDMvmUxh+0kWEyFm7rDCkqJYWGaERPdhizG8+yEkMwaIjMtz0fkIRzLpTizt/I4CnzgVDpT3lCTjAIfuLb18XAcTVKuWd5i9Oale+8ru0/9ZdubMvby12cFp6nTda7n91Y9+lU+LcUBa2I2VZ8SkpLQqXBa4k290E+oYP+y3CRX6ETBeRuOEbnxQd+7o1vANAWN/GGR/Ep/P65mRD89l++RiWSwryhLROS0sTrinEQeky9b5SOif/UkQQzF+yNLSC4ROpWeeD8l5ttW9HK3FUABW0IkzH2eY/FvGOGT21M2YExQZk0myZSAm0E8OooHrnaQnsOaClHSflDfGxB3oZLvW+vtKwj3nhStkYaP+wFgK2qjIFbfxyuPnlIq4wG2tXWjbH8hFA6j/up8/isnr0tZ/jabNrbNXwbrlnVk0n1fA4es3Fv/eXXbmJVqjqUAsLtvJMbjWT2geWpSnBFpKYsWmQZikNSLTGFEKL1Y/VXKd0kIq9q7WoAWJPQ3Atq77jkaufomf5nWNFrD3dYnjJNERp/13RBbTl3FfuZkGEQ/VvD2F1GVV6HNzbKBfXZTPsFODgNt98nDKwNT3nHwuA5IsP9h//rKVSH3zpKv5oYaF4naV2JfK6WrjZnoVfT+T12KXhu/7Aj8bDUHOQlAxeQx5id/6+DZQZ9e/oNt7KoS/ckRsm+xEjqbwTm416OjcxkOmy0T3QBOOhq7EZiAdEQBLcZ6a1O36mq1YTTtn3JjtH96D0b727sg3r/hhHj/2naI9zdbALzDpEM4liM3tnA13yuzhrMgHOJ+HSqFYkpKWdx61rN3K/y1zdkC7xAtyOpwmS9MzExbY2fY99HNbvRsY7iTYf9QiYbUy0irRue/Aru+myR90jlgf6Ohy9YYsJFcCoL0Dzgz5hJZbfAxYj6/fsa9Sq752IKvz4/J/HlCcz0ikobozMNm7Sh6S4kFHPdNf8UijRoISGDlxncItWO9RWSF6jpiOK42KAI5sBiJPO8QyWP/bI3dmB4vhb0W/BBrnZtn6gxHpLS9jAGRsMna4F4CRVNFKTXWR+tfXr2Pa9+HC/J2ib/VzJrTEX1UM/87NvEMIFd2FVRDUF+g9tBr88LqjC5fZbzg0ZROStNMAHtUySGzijaTaj5o+Jww3Qy6I+eG3dlbr+rjl5qpwIbMS8MBsXqTLP4h2hMziKbSMpjnBoG2OjZkPh2lBWhpbUXWXMw98EgMutQcWit7NpysQFfKyq8mEWxDJxLCLJIQEdByWCAUEgchFRo4nyhc48ytMpgtwVA4Dmjo70AOkhRDNAuajTx+s6EG2e5aN2olKQxl/rTF62VGy/xwWuonMTWxC9NeNhpCg80FyDO4bmOZbyMUfrqIwsKycZivUttAIdWh99AgesNe3UtzXVTeQINUTrNUIIUsUypAATfQE9kXQ76vicSr28mFmA/2k5JMDp2oaVGGTpUcLITECSM65c5S0aq7iKVq+JIXFzmXBRXiMYAtglmZl1DHTsK/AIpcJrl5TDiv07nN94kmMMtjksF2CBTwxolcjsCKofJKtUHKzTuk8lE7HJVdhYn9SbRNOAnZc68CqtgUTWb0P9SwBxyhSRIYmrJyG7tyIdJLhjnRjzhw2X1Rv+y9jYvnZ/sthCoPc221fsVYBtdQGjBk+E1eCLXwP0TFGGRJgm08hqhwO6F/BnmOBiwi26amNq3kdspwB1RcXspu9Nv3vn8FM22kPjikZUOu8dxOfRCtzertY8Og5tmtJHM327wT+pwj1bU8U0YtQbqnoBTkhvl6rNLiibETzwqAQoEJKnu4BjZjZx2Jh7FUeq1HB1gfMiuTgs322Rn/YQe2nDCbARuGpP8HO+YcIJ1FRWFHmGTxzpgABte/wFvvqk0AvKsG4QquafAbntMPZ/TSOkKIW8QJVfq5rRIzvRlKOd0NMAjKD5pJBr4yJwlvq/2T0BYSXGWgJTReNX2jhrYeAuY1gtQLHf0g0jA9B/MTDZ7BSsd9bX8f5BN5sBImqaipzyKR/i5j1oIJVrvxfWXnSt/a6zo0MnFgR8xP9KabLRMUlfKcr8HjLUKUi+6ZSpdGuOlZw9u+ojN8/8V8KcnkDorg8wasuur2SUfuzMFhvukPnqIIK+8qve90dFARYu/2gu9B3R0YRG8/BEMQjqFntHTztPXQO/K4xEnLXUcdhZgyUkU8XpVtSzOUrPcUpyvhE6w73w2aW4uqFsszy9r5jxlbMbC8wb15hHa4hY8KFyN/D6rccN88atRpQ9NhZuZ+XOcbR6QDQ6U0G+7C3mR1YnQgQqBLl8L10LFRbb0TPc5hm6abVHE8rfZeeufYofGvKMveuZZHflHbvFpvTxj41mPnhuCUD3I+UqV7Yrq5NKb3y3ZNnXGEsxGDbCk8i1aUe8Sb5pmQsTJQmQD6VBmAJx1E2AwKVnS7ApC8zvIVnYdvUK1hVZLJ4zZgiKAB/yLCgYFRZe9dawRhLd9ePHhqnzzkRy7b2dV+raW21+vF6fQ127m9269d01b6Hb5gOM+mvo4Rl/glub27ctceeaN20fQOAhgCm/OSnDvj23Bj/xn3heq1HP3om/zK091gAJvZmL110pnB7RY5cbnvcRCbRanEf6kZ0rnmzexCxRnS5xUUpwfbNtjHkQNht2XcwbZF9dirT+JZlPqtx5EjOnnrEnAcAoAQxukvIS8cpb81c5GnllUnISDgf+sifIeNpULjoaqoCuMPdFwbj1QjGeLz0tKdTY4kKzJuX8Xk3iCRur5i09ocHOJepyb1sZCSqpmPyGUXw+kUaZkbpmPgSeo9FRWE+gV1JUUWpqOMyK3z1pMfCs3K02ZqsGHYuNaQoJPOzUXA053gE+KrX9FlAvac4ChyffKebW85Gbr7VVA2ekgkZ7A0BPHZujapUPP3QEDiWA0oMc3OmM0Af+F4XwlKeb17lTPa5hMDrScsvoPx403rMW6b2BWFPnbwT+r0htWzhv34xGr+3xKY1rByzTHjZjRjc7pfJXYlbJPjS99aTmmSK1b47jPfJ7ekxNTgfueU606bTeBHQEjv5B1C7mIr0/3K7qd23VZGcUAYm92xdUtanWiqcEDs7UUw9/iBv+R1YYGXzvJTWGSE7oVVuJOYS33Ur9I4R4FYx0sCGWlJBKyC7aMlmgvH+4MABxl1UimxRZ7gkkktqNqWOJzGfA4xB9YSy0cSgM6e4OZmNuvIgO49IRZLwEY2klFmHltYsRXS2n7AEPSXX4/gaqJcXurNi14Ua4WUmp1gk4j++UT4tXP1BQUGR11+luOkm3kTB28QAgGKfY5/0TsraSWLCBpOfYdRvJwwv+X+1KXtVb/JdSlNtt1bxlpgIp83DbniGg4/L1tD5HvMbPGCKfIkGE1yifXAmnxeugSRCWGZu+K3EAP+pzqIoM0i6daKndthCcJsAvI+G95oAMfheaJ/gBRh0c57njI+r/5DUK6JkLBMxQ8QIJpqP9FuCHRn5Z7Y010DphbhU4i4+Ph74bVV04cFkSgns7Vi56MnZo/mZzDTg93qGJXETFBBpU10ZBUHzCnjszLDuuNZIdZ2AI4mYG+Fr/4yElBbCxudYd6UhLs1+8AMU4d8IyuAsgE3SgWkigojG8i4zF+r1WRVqaQ2I1YZRK6GwJtCIkuD99Z8ohq4wMEZFoApAm+Q0BCqdGv9bAOa5sgsrhT7bBHooesP81Uf7CnduWWYNYE8QboIsB5cMJzrnl/sN9jZ9u1efnvYJA1xUoLOsGaTEwH761AKEGEaIWaXtPkWWFWDsrNoWBvyomzbvV7B8ToonwNtoD+SxUA9Ymhnmd1PzZZ7LZNp0DqSJ7RBFYs4P2fC8HpIRnowERD3Ww9EI+OQQYwZLvbguiUntoB3rT0yDzMapMm4t51aJ/KhSHiGk6q77psmB0mdkjTQMUnvnUpppK2/m2XoepTaG8zTzY+X/W/i2bSbj3uDqYH+sGnnw584HQkwW8tLuC/uAx9uKu2oYTXzEdLt4bCJEOosYwKQmKzo+5gYsRLXK5rVQb63B0JEcmxEb7ifEfEiJB9UaNpUF7WZiqI55q4kxuWyo+n+J/fy9rz44RAwVognfOMizwWSmOLrgPShHArAkddTlkEPSiGU1Y/fkdI2xkY2UlyKNhRcv7s5tAgXLfhfPabBUbMiOUlXLlwuDnpta3rLRs21VfR4Dzw539DJkaokxjdp/EZT6e/P4f7Kp2LfgkD+26jqlH36z3XlAfRv9qH+z768Ed7Rqg8HEGq9ND2k7v6646VvZVVLC+Z4ZOlXmOu7uDFuRKVYzfWY5XmWIo2u6TXlgJjAyoKC1xSV1UsBlewX0fukvxQtpG83QiK04BLEmykemKV1Vwzi0R9FwWg5rBABwGIpGlDkJS6WJIRHnMEoQCgWkRHxdaPWUo0b7GZMVCAGz6obSjYN6c7qKQ9IKnnT3/EL6J89ztLMUQsvq93S2HVJLr0IujyP2++QwRgslrByI4J5BHy+AwZsyTxg+sZR+QfqPcT71PnrqUYkG+ir0kGSdOmYjTLa7JRkNgFjzPOCV8el5IejNH72Je92G2IZ/GH/0JVfQ9Wu41nebIfMqM52GnGkGoBzECRtOrBH3/TjXLxXW/azqbNDCRnlbPH0fQ/TUsVenzJKqUk23lj8bDmh6K898f/7gxGMYHQH/dOR7xUv9ReUGYNQrNlqZXMinKlfrA1MGY3Ed6dtq8t+wKZYFLrizU77Fk3vMXi/1RZ/qtmbIwK46k5telMP740lYreWHyzv8uOgxb2bfrJCne4JYP857/VWdTZVqn3Wukemfx0MrHXxbot3T761A68csOccZnNDl1wcgbIIvRzP/tvPZ/0atBOHuP65s1aX686mro9Am7b94qw6ql9gYyt98f3+TJU80Vu0kCNVq9YqH3zQ5q26W5PbW+Wnmeu61KdvuMrJvAK5v1w9R1L4SywhWzyLvkjjP46FO4U54fjGBYE6kdRJzaMrvsxh/pj5Ib+37SqPyD8jkidH0AfjPZ/txFE2FZssGuNny20mO7aHiNTz187rudlY5pWFMPL14Qr5wB+Akw6d7AuPO3FXqXHNJ6s0jK5JC/AMQ7Vn7dzxzoNZrWDGE34dYDZpeBEwDk9HuhlnYM7u3lt+k+A/TkPgUUDq+MiENuaQTs6BhKqeQX1qwI5CYfPBHDPtxaUp6hXDz8u0OnG6SasA7a+ewR1nWr4IMs92GmxmLN8Q0KOizn9Zv/OH0a7s3WLUqeoc+Z4Z2Vhvw0kSxJfLnN1YqIGiDl8nAcQS8sM19ccVXRpKhLj8MlDSCDkysKhDzYn61P8M/UDxmaZDpaCG+ZsYNhRFn2XRAEJAiwsG6KzfQZE5lN+HwwLn5se06HkGXQD1BUjxCQeJAy0c4CDbYraoOQ3R8E8e9RkwDHV3p6xJ4sjxpgI3SqZ4lcWrMq/zXMoZVmY9blaRVoCrpNAiIzmTrNZ2OHgK+7ZtFQ8UcEFo9tMT6HnikTOCu3BRCQ4l5NB0Xq+R2CB8g8KCXZ1ZQjhqQ9esbsQjBybLyYcL7vy98Mq0dqzLklChPhWWTwN/oamnBJOTrwOJebVVQXQy0F+34P3u8dHuAwvybjUzZSqDgzG7k5N29BWwtN4oS19ItXZWy8qJM30SByzVxkG0Q+BVxo3YghKUQ3UImavJdA6s+WnOLV25YOYFztbp+RvMN4RdUuYPDSF6c7JO+5Z0owSKkSa+xcyJzIRrKbzOU0ylzfSbD4TMua55ETeCqiS0sM+lREquTh/KZOXsIonU+X85HOkK5jMxIEnNF5daKF4oDWx3Ng0v9UCOWYpCjl7e2Nl9sE9UfjljvmPC8o5d+ZqVe+Ipy9197rlEOO0kE3sT+/DeE8d5Y5YsEsqkgHv2dEG6VzN6EEhJuqttw/BExjTcpFUE/dpUM2SmD0nSDp3zRJIpDRKM4EnbrI0uAWTrfulbDC37S5ZeMoBaYwyT2grdOP2Ddb4sWem0XlzZX6as1IHBX/gr2hdjSqXaHCSjXDI6WlfmDNVi1EKg7Xc919pbMSdOA59ZVno0kx47s/wol2Z6TqfEf+BVgfNmKH9w1pngIXjXI4OX4LbPTKk9IxbFi1TlaG4F02KL5GHLsyLWxSzMVOJcb9QhgvBAQHNOJabWGHwKlcfndOjkWGq7CWobs9MJv1FvNbr9ip0amLmz7W+PZUYDKRlvEPn0gZAg6znLt8864WgqJ2NK5fXlrY+YvFvO2XsSyIQGTmalbnqZXThGEb8v6qcbfJK6Mcp27Qz/Z0DUSjqxWczv1bZOddo6omTq5mhIrKLw9m8Kofi/u3S8TZDGYISEUsyNv1L092nBOnxO219QIqCi/YhCQLC5tMggbWBhnvWLojpN/QuL0AISCWMyy8WoPMgVpv3Yk7SWVQiPT41TApJcnYEAJWFcQQW6cOf0DOT46oSv8rG9ZcZc5shBkqypqZsuzLB7p9brrHeGx79+PGRYSWjB/VJOvWdrGnbg5m/ce26m1JyifY3X7h5IfGWsaVaVV6mh2BzHP6HMHCPNKEs6tLkHbR1gEe8m5kz+eF5GrpIBKyel3QOZ6x7G2Jxa5oWJspTFjxoeMT9e6wdFDgSmKKDdnR74ROCpyHXkiRbyNq/hVMKY7/uQE+3BoUxTjrs2T7Fhbe/aZOsHypkOeccy+ND6mXySXthTEt5L8KS9fSqMMkwvxZgEKRnPAGgIfvebwvJcMe3JIA1EucyFjPfoJKYY1TGTRy/OlW+pgDADXgzq2/qH+198cSzBrQx8q/xg/ty3BwYqevB8lKbGJ+x1HHN2FYNqKB9x4KtSq4l6TD7RzTb/jrqZv4gJ+Bw7CHMygxTFi2D4sYVXi2D9VHlQ92eoAWVlMBaH9wwR7fQwMOp9L8eUvI07aFt0R/lEuzXWXkW/xiPjaPfIjTpmPwn7BXUzejDv2o7vJOpUqKieXlTPQWh6BRKXCZd4CuhJew+B3TUbpujO3cCMi/gn5HLC/BmlSwqAm3qObyBs1qI8up7VTmyyjJ0QZqinTX8qzH7QVcqPh1fz2l+fBD8HlnYeOyhBgBmFqM262lLDXv8gM7c9NtI2PTLmbut+fWOvvRUHkE83k1gMhpXgZLqsAUoZ1nyP3kxQnN6dfg/Nhan68TiaK1FE7PTgXK/U5tKtC8OtU8MXXKc991XZdswNTeSFmh5jImH7q0s7z0GuHBY91KjEmqmUudZrgQFKhE6AcJvoTSVBUmDR2Yg72PkoE/u9hzXDEFeavds9tQiLhlkgnWct5F4IdjSB0Fh/rtmJ+oVK2EDu1z34Y8czxer87H3KKikSCHWS1sr/Yhu8VLkTRpobJ9N8uU4zl8G55kXf3gCyzjmJu9qqKTGQ0CESR9savfdrOJKtNpRE7wp+SK+4vUdwwAQlqEZ6M+4ywcRNGt9KomFa3tY/q2ON4G4wnik/i2jhBE4XgMB1ns8fmgWyHf4LbTMfSI5+ssEf28oxckT8J72s1tcx+57gx9V/kUtynXSbcwFK1EoPc76j2fazpn++1rhV1wXMz831BRCeMrT1FHJeoCtoTnpnlrFsMCdcHC9lkdt0WNSQ03adbCDJaudjbX0hUdYdz7yO43Qj1OZ6iLYjXRbb1dofoR/PldfeT5zR14dqReE6kyMJ9zaBbjo8kU7nEM3RdcdpsaaN4RjJe4V63hgPtdcxyp6k6v7jo+tVVsnybP0MK9Fhwk7wwler5I3JaLvLKU+nMnltRWzZpK9B1tU3H6Slq1lRcPAV9gaxZkKsijw4ip+FuzsCxh8Fj+X0lvgnZ0tSNW6Z9swG5r0LwVRACa5uvCq2F4MhPRZhNX+JnqyioYOIsFp+Q1eX0VBeRFgtWGanauj8ToDFsRC9cTT/TxIGwUlAFfnoU9IS+sD7ffJYaC/tPtwsYpbj5/M4ObXJ9O4tOkd8BVcFkZIp3d5i3x/7Qcfq+DVHk948KtmV29o6xJ+jBiEUXWdqfqtPB98m/4tVh07rork419sgrviU5YcTZ/EMXQctVxpXfyhX7IdOSbwzusMaTtLGDmdy454zfLeSbQ3ybY2gJz1bbpTtnqxNLD/mjCSwCNFIRK6TRLItrttPGD81dQhYrV3Lk+wU0zP6Eh83+T6rFyrmh3eAAWc/mqiVKiGS6fj6SnlUokALVbNnztN6xdFJ8bqVz18XpAaFN9Im8lx0jBB/8EguH1nxWuYoNFkn62TCDNdUhw2RRrjSc7wt7HF5umGtEjcb0w1bjYQ2N0smw0qILyTgsWMvw9R4jBD3vVsXxAGhgOG2jw47f/fEqqJ6MRpGdvinXUeEJ9qP6lGvQlNPwgP7iQ6V5bvt6f3QhiTQARN5mSjeE/BUU5P8LRgeO5ZoxbF6vswRVJrIJUTho9d0cwSgiCKJiT3qZ3dVEoF1RD9ioRgkGh5aFnL8Oej3R7zO6zyZjCb8w5FhPMV2NZ+TMNFdGWYlUxfyiQieYR9/birx1+vYip2dHbNv0Lxi2s79gjhwSjmfwYLY4qCawieYLXPOQIZy0PDrhIW8qVSwuqVBWIGkBkkM0Vw4bV17g09mC5VgIxzK1hNYs1ReZroZNffUJycb2ezE7NAYFvhXyjLPtyB2xXNF4lx/nu2IURhztZ4omcuQQEHoFGpSFB4qWuj8GbDlYZGIzLPoHFNsAdGWolKMW8vcnGS8Kimdyam7nMAMUOTCosS9SHQYo2/9vDWc9DiJyS6Ewl3AaMtcc+DQhtiL4QvaAxDm1z8Y9VZz8djoaC1VgyeJI0X2Z/KJum1d9MQyTmpXbBn2cm2pWs3jEpejw8MjMuf2QkUYNzVeXoekA2E0B9oExXdVqe1LyydnP2dlk3/I3xMyMTPO5ue4zMe4m29g1NdsS3pQNl6XIIgk9yQ5ToqQFItXdmcy+UgCz4+Tr+ZDUu/fnGE3Rg6hL+O58TPxXDit+61GhFy5L3oMUMzvLz/9vewe6Afup+n1e3jW49O8912vD7O+uwD5iesXL7QXXjn6QDdjo3/epQ4aRxs8SBdvfpdGivIhzDaUOoZqmSqar05i2mxOebqJ18NDxGNHodxkMltkN4ZXNF3TCtE1wDRpzTKppsEqGoDdaNHv+3C5HCqCHR45287W+W1Zbdi3ih63a2giEsmLxYqjV94LIfmoQfCKYW762UqufOtW1064Y3yHdarbH+9qK60n+h3T0Bk3tBgVjsgUC7jk0igndGNuVoTjZBOqG1VjngyM6vcpkEnilbXA4xs4KCn1S98PGc6WOdtVJ9ccGLSP1brBGmqE5j9W16RAQpIdT89F4BBHDRks4GNDpCJRW2K4JN/1FTkZdGTShok9lORYpiDgZEyDkOoXTf/l6c2LCLKCaN3ps36IyfjKbKNjji4U5s/Qtpx06HHVDD9ZJ3sSJ96I6kHkY1Px/VaBTRj2JalrRJgNrHvGpu0YWOQ93jrrxip8pM28ZSLu7tHa5uV+wORPdgk7r0dfUhrPnv30XLzU3EeRJDQ8FKuJaWXFZjN/vdLGUGi0SLb7YjDS6DbEjlW6vpIYt3P7wbK0TNOonxqXqFEe83xfUObRyufcM8Uwnn+Zucv2G0QerebiQ77TBEjvoaEcounGLH9BMV4n3000i5Ibi+jkAttdJe1FSjUzzuiVgg0rzapCUB/JXiRSusZSCkRCK8lNLe2yCbFzAtrgYoxSDIhWRmVQBZ87N4u6gq5J+ROrb5fbbbXCXqzUTaWK/Ypr3wzFKytfm5WioMBbOUuekhHGEthXpINSugN2CxB/26etFxQ/ZshxMsoFc6rhnn2/WAS5QHmaZquzqrrCydoWxUjKLz33mJsb+8rWr4xBfiD+rDAG1cycCPUZeHJhoSBHRL92q2y/AFGsrulaXFyRRCxolWm/SuIUGV0mKEEvjSJGYtwXE4Bh0caavggNDIjpbTKjbF2C5Yl4JOz7kuhFNXjNw5AxeLWTe5mQ1wUBueFBhTE+XjKf4OZflsbCQmWaO2KWon7z1oMpx86MMrNqgIvQIA6VcvE4XSeHN9rzsA31i4nJIGKMQ99ox/pU5sVkl4fumLUM/SkEpisLkonFB21EKbL11S41hzHRLRQArvwbznxZefXxkuAqEgGxum+N2qQc8kwTIKQG3/I0QeWluT0CCsTx9lSDmLhAfMxYJKYVaRpuLkvcSXzuUoQCoPdA31CChv7mQIWR3FCP470cKrGWG4phspfD9QS2a0AMztufjA+Vf6+jlJftPUmahAngPZtsF5vBAbuOW7ypvNeSIsRo7Fgwj1HSnAhmAaf7y5Lc4u2Olvdj3B48HSM5YHxjT30kbwE+ZalYPIxgLPpvvpARqV+x6EuJMwvnDIyNjoMVcJZ7WRKxBYeV4R5BblvtGTmrTdsIDalUKCEivqgGP1qwXQODaQVFxG2yC8Sewj7VJ5aGmeV7R8h0nRqvIKrXKhF+pvzrmnm5letgiSerQfs/2ZgjAfzUKQK3EG/GKCTi9ePIiduVTJ+N1Px2WU8xbx28nPNfPOwvx5C4AU3KKLmAtBRXf+iv6JeRUZEnXuobIzD6TXyXM314N3SRyTyIzmH+1kC+zLsAy0idbI8xxz6BwB6fJiAuE9Rt83aimiEq4PQpJPN6n9xtcsfYdL2FtBUoiDoesLeDR4gcR4diZVamd6JpJEO+TzH0+BAgkNDbY+da3FrsPEdjPHqs/kCxOgOrSi3A1cTfX2DoqQM4gKGZfg6A2oaIDORNFooJp6kD6CkNdUWNtLORAnNZMfKNjEK1ozcW1zR33zDrR5fTNYnBeo3CBUEwH+980KCWn1un5ECcxFb3z9yf7P2fUc0WcV5AVwGcci2O/dJVjJ5P7bcD2f7FJDkn58hJQmpmYDUNmyIU0aYOWXjI+Frv9CCBVe5PLyY4M9/cLMg4zg5rrDLi+h4mp74gJ5k/mmVFdockzhnVTGCPQhCJJbY9s1SHvWZ0RjXlr744kS7Fzxu/PDE9Po4wy0fGIAg3AgF6QEp5lq9+wuVwKWcf1Cxn7dlZG0wuJLksH6sF9yCXxi3ePKB/axfO+dL5e85/efxjKjCuMsYvcTGntc7h8rvBq6KTEr9nwg/ruhaBg+DkSxa+lfFNJsBSPOgO5cc3eEPmnnlbTfSWypsNI826+QCOo+dEGHlhuf6pM1yup3dmnndyyBFGPEeaVz7ZxLi/t00Ts10LXLOoTvjYHrBzsVfdjWSdPNOh+9IAg1flALydCKowNjTf/nQH1ci079B28Mi7MD7UrwzMBIjv0DsgBAi9kylmryOvKgmiMjwC+w5o/c0g9x9+J0IYwnesC5IPum2iSC/iGZy90+y3A5Cv4XdxTbAdD/AUydj2b+5nDBMQG0MpzLU2N9sj5YhCxlOQ+D5fLRVbzcRMfFK+Us/xkMvRbBRRg33uHFxUvkgpCp85RmGxuyJe4GKmQTqR3bNRNLG7JyDKPb1zTwkPoQMQw/EngxsZQAIumujZWSY4egqKLGk3FRqytaPq/TN52ME7jYHrVX1wL99JnwwB6/8LeFb5eNbeaWz4Rr1axepmm//L+WhY2mOHmNTsHi5iDOjqQiqsfCa/4o98Z6u3ZS/Ka8h1u/52XF9Ih7aenmKCoAwH+mTZcOFHm74v60GaffPACOOsrCfs93jInK7Vi+G5O9ZF8N3Y6QrLIVe43N/oBAeAaszMe6rtnNlaSSTfer57T94UcK8eO+d4phKwPde6mHHee/3T9aD1yTX6bDK4M0+ODOU9ARn5QO0TaoZqIwwT+EdZv1STbqE++SberA6vzSODz0NCz6n/ekwedXm1+d1sf1MfAu9hvWGXpe4wx0xUdoLAM5biLIwyCuVzZFQBcudVfUXdA5Wc3WwAMeC3eqJgWA9hKmh7H5pxGml1VeNc3hoWqiJM/rrQtED5VJXWWNlSVYe+RgNn9l1z5cTdF0XBzhSzNatWMN/LWKzSFi/G73XrtcZrunqFnUL1vCcH2YPASrp4GRuizOffHAnmSXrz7gGA0jf6ipH1jZLSWf6GzpXtMXS0v7Z5r4i3zppffYGhfLR4beNbBMB4Akp9evxs88j+RJvXVpf7hnLz12NzZHNxunblW5HjtyYRjo5gn29Vtn+4vmzrPwc8HGrbQ/QhCU9lEnFCDpO2PZlK3FycHmCexExyseWtiOFkMU1oHfdvq3fR0blLaQbqxKPqZIqVKjteGNKLyxi/JLW1eEix7xjHVbizVWBdR7VrQ63qhoLm7PezAwaasf1PmO1RU4VDleJ3k2+PFgtnfuEfeUc4UO+Ze3tIrr8uJPX7F98VNsUhFhF9CBxkNCxxHz7kYBaABGxstVVNQlKTuVBlAoYy5kGNMVKEueJI/HG84WwIQpBRv6amJNJXoyWJx2Lit2hCibL5DsOaVhxAKD/8HR22f0b3CJ5BmFF9PEdE9DIcwho6rA9lQJBm1CQiA40XOOK998iNRvqXpplm8+u3NWC86nupFcCCDEv09XV23Fymz1jntSuYn/IMdghqE4XgtgJeND3ezzAzT5ODKODp+r7aMC1Jh41mS9H1UqARyMdvsJuCT6i8zWnjMhMGwinYhgcUs0fyx54KWDzREseYZcds5+oabaPFU81coOf2h1DM3CEh+m947iTDKwwXiQiDBD5kbO3F4CuM551iipsQ4U5JTQMWw2RUIisYDoLGjLmwGG8w7cVgxBg4OcH+18/8XHw1IN6j9LvYpijH+pOgi5LYeQvxaqVxlBltKLLs94Dm0zxcR5EJFd4y1wfp8WRUnhjzUJyXMK/06CSIp7Zuz+UfQKEKAsSSIQHXWAy/47qVn5aWHI3TTumDxhlr1bOteGlraZD23vOcf92dzajRmyIwP85eMuW2WEbnjSx7c8Dmcl9lEEBWrvoVksHxknmfZ4iSFP4aEwzOTspf52n0CI6X+3cCcb07WNrIHEVEg6Bcoa1iMRoeR6OSKLakEI2KUnPXwJKqVMXL3fQ8G1zaiVH++ZECMnRUCYM7l58LYJLV3FsbB9kssOpBa76jS6PqYkRsI+NiOM0sXZlpXKybsf58a0OJ2eXQeExxfnIW3QrUzoY+fIt6zIy7D0KK3MPJYZ/oYsT3P2HfEPCAh2EOZzO8MKDoDtLjKAlq6twiRrVBKu1736PLZLRdxZkrWEjmlHrAc//Z1vcL5QtaqQJT6eJMHQ/gDnU6p5nLheEp0tKywN1uuEocjkVCD25TvvbsD7Q+xKbxAhOT+sLNCW39aCzyUs37593SVIp+fek5LAmQL4Klp77i+7WvLu6EAuH9qkiAfoUhxeCFy2DS1wJF+bsPvBh4GfsU+BRP+duWINsbbQR3AUmwbOqntNGRVXqdevZrKr0qfG3lmcoCKgsuP/31937l/L4NyOVj6/i5wAJocNfTP2XNWZdduSpIfMybMc/0kfnIZT+pVjsJ2KcJDjIRmlBRVoi8kmxXNm0cNU8RpDMbJwPbXv2iqxx4ExLgLKjSuRuzYSlU7JnzpWVV+65zMTCr29kWhGZ0ORcTgPyAw/4c/FS7rnvSIbCKTMCn0UDvT0yOl9V0x70hyQ76uV7jTCF0reZpIPakll64+TpDEvjMUu7WCYK9mfBLnP0NEj8yVMnqWXj/26lGcSMdMIWKsAo88r0Wr2jRrc76mvXDKZkG9a4ba2VzuWG9VJNs1fENeIO1qsn/ATm08b3SZI/JJSv+s2I4WP1ayiDryDtnnQN2OAxuFzeTz7vU2GGTgCa9XhyKwdRvnGJ7dwlPT+ED+xU3v2rPr7fYss6ewAXDLOl+ovNXWRa+8Ni7ccOOep0bsI6zVm/Ou+lnxic1wo33KKvqItWlDMMK/kGW04MGW506lNNQv/F8udOSKz6k8iPRBjI/JE1uZL116sCoZdFTn0oln4yt/hJl2J5+nf1Vn3GX1fEYmgq83rPZ0oh62QVSbuDQvyw3hAWLy7Ho9xK199HFxT5gF8UVBgrNL+t1RhJnh4cTT2cpUOeVSvSFXClYG78EayBWRiLx6ANcdPbX2Mpy0gIj8th3RV2zcxqsOlmgI26HmjjBgAtMbSI2RBuL2gqOHFYAG8ShrkhgUSDgr6Kq4KjSr+6tURdrRwzT/10B8jwykk6IP52RpOBVDefQJuQZ8nyGYZW5vQJfR9yPsX2bZGmfIZA6YMi+BeWF0cEbofj1WwTtXCxZqcRdSrO6/hnpz7nfkIisxMOsfru2l08QEZOeHN5BJT6dC7bxmQRd1eQTMlCZbDVwuOBPk8PRkAj2gVvKgDRPQJ/CoREsAMcA0qyKh4MtgywZmTS9HexYN58tIz+QM5K4BH97Hh+L/akWTc6H30O/jTHOOKMVYb2vHlkps02/ImvqE61h5l89NKdKcU2F5T+izG5oNo5rih3JnJgQnVD/GiAQCZoyoDuJMwyzZ4I0AR7VjVrQptOpp0da7GsobY0McLZ2q+umDHJpWhFGzX2KuItpOskv6/uaEB2MY3pQn8V1VsVROUWN0iYnzC/sC4eRduWc8q35BDyAMobf9NuK3vaMFoXpWVEpgmouGs34SE6s+6LaFzExmXPN1cqXremS59iL4HvmDZ2lJ3yta4OqbFSrJe8x8uqqix1Dpc/dZ/ZRVUpb7ifyxFX62JT7zJ2X1rZ7vzgx6SAfio1ypW6a7+Ka0rmFEs19HbrOCgU6ExEALMTQudz3NhpYN6Sfru+sZqzBGmWbJwUNB05NGaEVMnB8gjTZ9HA2BZC2AlZu65OBcCZTPchbLSDfnvHgv36dTmrGSZ6wnFn1L2NgWUFxNpot/YtZrjMwI1Z+GmgHc4b+RVBUO6F1HZfwYjbW+IZXRCPFB04xbz7BGeopzpip/0MbeDSMJLUvaghsMfcKeZcu2C+brfIsl+7yjVJy1/njltD3W1lFKkcQ0JXiS20v/Xw3/cfu/Avv/N9TSbjqglPGl7hxpkbV1+ONufiMqDb9zBUFOgVj5vpWcwfCC0DY6neagCvaa/8xgcRjzRzP9WHDreLpyf6k4XceMAs6WTXNUbQiCsCK6p8rFmciEiUqHqMyGgHpdMv1mmCNR6WQ3bSlDcBmOmhOM+wWM8YWXgWGfjxQEANN+r9aAMsEKneC+cbP1tKQ8kkwoBZwISJggVBT5gILTOgDFTYLCjasT9zUE3sDJri8rWAoiQLbhZITBb+5TXELtGFQyAbM2Nk9UJvrWl9do95wdvVXkX97ba9oOg31VQx1BiwKQemHajn0XverKu+l1QQ3I+3AQ69mpQWcXbcRjBAUZ3KLe05ZvLK0IDWsjxTEHiSgT4AIZf4NR27FxnOY4SSKjFwG72n7YONE1tjZ0e0/tN++BTvyAOrod9zM6zVVgnhqfu60zKbW3LWGqqf01p2fPod506nf9uApHNJvKWwq3u6RSPAtHZY7+8j0AwMr2XyRGNIrW6WKLdnYFVpHrhNY+WZ+PEaJhsRfzvTMneEc9/2Of3IdvWZeBRBSzAW+Dd+CizQvKSuO2DFMYTFQFUV2fhqSOitMPo4STcZllWI3DzWkt9NbCd5IbxZ9cBADaTh/8TsdYH+UJJA3vZh+71l3ojT35VJ5cAZKknOIoqoDgr3gwYeGAn3YISpZZtd+kbDxsOqmV/mBXbRUS1YY4DBGefnabIMbiSQimc9c1vnCQRq7g0U//qLUBFcNLN1bYvISHjBx+eYQ0y77fJfMeLVaHo0vysuBBMGV/12S8NVQKjQaA5QkKiiTlMGJCBlSN9EBtEygJr6i4BLlYGdvEFTckS4ZoiScVsyHiWgWtVXuTPBIbqhlvvppX60igZPYA2/fgQD9FrdlKm1i7p3kRDKao5Z1e/T0Ht250YgN37ZcG5+oie/Yv+ip7ITZ7VqnRMfcmsb0Cnboev4OMVVshxDgUmwtd2syVvl42dWRO53YgDT9MDCFPdSReI9+3r3aqwMD0dcMbzICUtttf9SUuNc9f970X3+d0XLXH/uWWiaW158vfxvfuKedr6GrKOfNW83hQ3voJWJbZgOFLuHMPE5jMEcyuNq8aqv3fkiS5WlEUJzCY2Xef3w6UNw3acUvcRiX1dct2o+nG81/+lzsYtE3UvQ+r1xsJH3tVhG1+ILL99qGH1X2n8gdKkIz/WyUDhRSUGbrCdFkA68nDr76zTxqxsEOFEWt7MLLH3j8C/ezfcQ2Zq1z0BcoxLBTyMsb7mV+ATSeBFXY4OgpEdNDMeVpi3MlQ/WscqMaSCL3M9jmDtrYgx4pCZSLTFvY6NOpKcxtagwUpQHmA1XthhsD29mcIvz+xdlJiadSC/C3xjbNVzOulm5QpdfRSI2HtdXfmzVRN3Nc6kC/jhNTd5WvrlJoFMaE+GVx6tyNRzA/3r1+/NiRWhs+1Q7e1gJHTO7u5dvRxWMBW8Nk/U4KjSVDOYtYpTz6Ue3tXmn5u9rvi3AsVSDIkRQXCx9Uw4n2fpHtVa4yFygnd3zWL5qrQjMUAMLqsdfo50oILLt0Cuoe3PGsV2dMTiTyIFvIVuP8Dnzevpl2wGgwWJ1Y/gzp7JrP0Dzbao5o5/mcthmJajDQzntyTE5ts63mW1tMHvYzU7EkWQiDEfel8cqIE34N34elf5KRS56wuq3xGN0h1VFFKNiLmpOLw9lQOiZ/l/l7r8a806w0c8WTiYVXTDNBjDaFUg0RaXYtFTcFUxA6n0yxM62wZQaa8e65PV6qi4mvGaLFpjTLs780BsJPQ9/pUn7ckIyFTkswK2MkJjOWTbH81ul1PDqlIhVak5ToACydisduMk6WxtTORUeWEOvRJVfVqSFgEN0DNNmJwof6Gw+6X9rOHGDV6oB9tC7xS3Hf9MV+m0rHa6andLnKa832U8N5KssNs8r7KfdJjPlrJFHuhoze9oZy1XEziVSUtX8pQQpSc/7IPVtEuApqORxxqu/idh5/z0Pcbm8D4p1LUh4yhnbfKcbN1DFknGN9RJkyazw5P8BdDjvEOP2hf/q6QlIpePbLoztI02m0fXvNNzSezcoXNM+PWxbECwzeOmeaVgctfUC4IN2hGl/XgEpQehels4/6h42VWDuXKWFESs0/pY+cXBUjWJLB7HLpmud38G2+yc3+QfPQjjJcqQ3dPRHmNjlqiVLwC0xtiqGLAi5JwmVH47X8oFKwJ5yIdvckmAlQ0Bk+NWgMXwqAqgFj1dKgV64/vIYr+sLgAPX/vPfjYN6Dz4eyI0O9gJfLCBjFQuqb6VcnQqvDfrOrgs39Y+FiDQAT0v7v2jV+fWDw1UHWRSgSKHKiG3sybWU1+xQKdD5gdrPDAwPvZAIsDHAqPa7Plca8ARgn2OG5ByBvjiTdpao7ZvJgosyi2Px0sbnJn0qvJN/746pIH/7lWuUABBJLlcPUioOxHM9rA8ArEEwBbe2tFN7f71IyHqTlrjH0LLBx4cfD9YiVh0Ye7wvBo3CSzLktl71KJWLH6x+glc89Z/VW9aONXol5gZC9fs8Xw9e89RUwfi1Qx8/Xqnv8xptCovjGMliyWto/6whvRyF4zW4uytt9Ja59TxtvCV++P2K4G0rcEuGJ506++XYbsiRibDt66c5ghiZLq4d4Xl0iEZLlFcNkmA8rEeRnCwFlSTKA+a+LBPYg8oEUQiPwKGlqTk4+U3dGwQxXANMMoXyXA2K4GAn+AojAV/lvV15ccRMajz+/pjE+BEIATNAvPdFpUv/bLL7r+ODIY3lrV74YWinHQlW8oI7Wa2p51Rs0WP71x0vD5iwNM/EK7kYAAvvlvDkY4nBL63WOr7DVt4MLl4zZcZBA95yYT0F2/nlHNPD6kMve3i4sbbmjI0QiXszRo4cBOGykUVr1pTH184Kr0EOUrp/oXKs0b0rcqIzo7Z6KD5WmoIUdk/1kRDbnaFumvHwamddM0Rxd1Vb4foEuhtc6tukOjMYSzNQweioFGBz6GRWaSFjXLIDPv883n5F6rvZV9FFOvGUuNyQ6uobFLs3KMNajTb3larkT6zn/F2eqC3sy2qxDjRv+G6tPGb2i5aK40/v/kE7ZmH/DQC6L1FfUMQVEsQd6HFsQwbDiW7BNJVbmNexyITQmVZlyqw1z4qA3JXl/AOdO2UooP6VuWW2JHiJUE/pDjU1tcvsuBO6Y3bR7YlNOVIwd7F0qGX3okht2YKqkmPuilTHqXkid5e6L03aTTm/uVduGQVM2V5lP2YllC1so2s5CEQPlos2dHoV0bzFiz6sVWkiC57x70cD1pH7LToB9Vh3Li9m5AG+ykhU8iz4jx/2ib6rw7r5URkQi7xslN+8zrqzXLvUoPxW+ZreSg4rl5l3f0vVgIfWcwLH8wL+8MSVV7/RxTDronKeoz7h8kgT7QDgn8xcrrvVWqLZXHnXboIKdMH+LC8t9ICtUL4nuUW7pE6DibBDqnn6GY7vye5dwq/5h7T2m6KNWOiN2bfjpfpDiyDHugc/tkPZ0CTCNU1BIgV22L8hq4mcvIbuSiBt7LxujYyDlap3Q98lokYXiW+M9khBV1fpAyo1xi0lnNs5Nlq3/+h+XlW1x6fslWTjsvmRjf9VgIheN2liRdK6k5QGznROkrz6dFwciA7f7e+KFxXJpuMUU6VCdTz/7rDA9hi+/ObPSRgHtE24eVn2mT1lbEtWcDxu9ta8iSe7ZCul7R0V6CWAp04dyyhLswR22T29L8f9ZAuq6p/5T7+nHApU0AzugpbuUvuu31B5MJ/SxuaI+4bBj6MThkk5AGZW94KrxOCDhF8qLinvsgpV6FGL2BDgFX3gIVuLU8NPc2igeWCJdzpSsxJtNNnf+LKRm6GdmlNMrzZwpVKrVShtVCHQ+DS3oXXp9AxuGb6MqkW1HB8W2H5YxiVPNHYw8u7G6u9u15Yf8tyaqhRU6F5eZUYN68Ujt4Wq6vWwapmr+uUwB7hwN2EYs+//B8PiPYehZqiInTMushsm0pbJiSnB79ryXNq3Vq+akDmiT5tFdE7+NEG2qDf1F0j2uC9J+kupmobvaBEZ2HIrf6odFu2BFV2luFnV44DghR1ZZ5z8/N0te9hUrm1syt5bdJV+sbXfkunPDWrXq6U1aP9x24myes5M5o7lmpIhPygzPexz5sqossyc5qy8bfRUADVR95cwb68rnNtneVut6w7T/dlUSuVvi0WRUHixfdepWyu2j5EXNK0IWOoF44uFhj1kuTDSNct1QyzHyIhGtoW6v72pbKVhz1hE1NI31AdsgyTRz5VPKNt3Bq6LyDHuZKAUsiWtXqocQ+wqrOhpEbaoz/Iiwji8K8FTFKt0f1wWpeiepMR62b/EnM/8Y+G+Kd3zQixSlqT3KWYc8EAoEYZ5EqG2CHj9GX6NZM+dmAl63TBKVZutmJxoVQNQYJk03t0Ywe4KM55USR6eKsVTIQsTRztMvrx9muNV6cWP4XS5MLkkRsm5eHr2k2dJXoWuU1ijtEGgait1jpCHInPrrrnziiiXYPyXA0Fz9hDbdFVHGwLRuKrmZMMAC5LMnGKsZJ4qNjtNXrmjEqeOfPfsA7sWdTJYa3ENnCFIE8ZuZjImmOVbulOrnjqvYm0GlENOaVL9R9a55zAXEjSZp/dmjaPWc41FKLCP2fGTpqboFes3K8aJ8eVlItMjn7tF7qkZJEiWZrE/YEegUghZSRJIm1mvqJ84JF/WRKKis/fFr1c23X9x14VhUBYGwNINK3RRvrYHddMeggPUdYBJYs3/oC+zziGwE2i+E3i3d1KmqrK7BGQoUVEJJaqLUmy8DnQqC+ErAbjAspsSnWELE991Vup5I1Wgd1xdGZagCJQzWNo4lDNQvEsbBtcYCFDomekxssRlkS1S19AqxXrxHds2KosoPU0E0ijrkRMEESYEG+d4Dr8qvkfDoPLgLliEulDE/Hm5U5Z7gGch6HQdo1JPlsLUMn1qIQuQYqvKpF5bO74evQ24W0u6XtR/57kmdngD4j7OJfgMr2+9zAm2mOLlUf7DFPWYhY7comksbSPeK6oNTrcvoSDchTPBTvy5ExAI054sk/tl+Xcva2bRhvEfpAppzr2kISzeQwOAif2TPuH2/rIm1mnyfe52p2NywUZI33nItD8odeaf7x+CIzIJ6qxVSYVbOXQh2NHS8lp6gj4u/sAUy+gjt5AT6wi3mx+iuqFlEjtuMGe1T2ECqJV/RQihG1hPj3UhrZX8lJgQ1+9U9J7wbakYsp/f7mLpH9fRvV/gQOeg7/Cjv2qSQwfdY0DN6YPdmnU2D1Dy1ft8x6sv5YlL0NnSm6BQwbL111kaaqb5JahHLr/vjyx5Kb6uIScxxqLm2xLQQKIUbrmN/A8eYx1XvyED0uqvb0R3RoiMCZc0mm7FWlbP3qczzeSgY+gnye8ynS3Wkz+GYV0sTZQGUkFoKXj4od0RJphmS2xIV37l9eMjeCv7axrriNbxnWYBHMqYcMg/I0/smi/P7ngzTc8+DIXEZgMpcCaHBnrysjI4ZQ91QJVWLDWZi6xP1BfdTta/l2ie1SIVMYmnMLJxzteRGA8C59DbkBKauN9+8ROQK5qZnHcyjb0dhKWroUy0mnT43lNJ5xs/nFR5DQ86WCGniXQBNUhyToLsMQfEajzCZ8AwNS2aTtEY9eguMxmcEZ4oDr3RmmzcXS3ggkFvQEuWrHwxMXi5bs6bUrT7zWtEBY/sZN+QWEweNhTM2/hZjHs2XmddxzAeyd6y5KkND+VY8t/wOXSlFjR3DOZqfKajPm8owbJRTTesfLiT0YkFTmOqWSGliEyV67LJx3ZNWEAPdzxvet8qAGDfk9is44Pp7ClziSKZB4VoeACNblzjEBaQwnirGDNFyH1stnHN3G27beFAr7pSoSEVs+xmH5VkuL91rNncZS2KuP/s41jhH9kkHAS7fC3WhAZa3ct68mWw5jw9Fad6c+AESooaZYIYigsaDnpGPyIefy7rz9iZ2ocxJzNsE1aJ1KkpcW9VeA2VuBvRRBSVqCT97625XK5sQszELgrJagNjcQ6vyCRbSJK/XM/evIdvuNur3laP+L6VTR8cgQKk0zowdGUW4IcNSGmSeHjhoZz+D00p+EY8QorJ1PwtaaaG/RBiDhzSj7Ut7aiUYKYgnGbcFeJrpTWH+/1l2a0V0gixs1gTFAf0TYzrJw3fhhVhrfHwy85yFEuskwi5FeYY9HwZ4kscqLUxNmrlfFr6273hDg9PTewXAdNPniDQCLp+mPBmgBFDwcvHNmZnhEXO5Mbm8L5wW1U4dOLB1daK9LtO/U6pfcoRqq124XK2lmmF2XpXkG6Kp4XP281ERiJ4MWsWc9S3F1ESMAHW1U90PGI1nizaDhA+Gsnske+YWcg+mMtrP8AD+NfM+tvgbhSwJk4doD2OmGxZisUrWis8/JHtvdZVvPs2o/qR2Q2yhkii2wjzcLzDnePsoDkQnf2HUp9hSmTDc3yLgb0CahqikPk4ImznfllG5XbbiqBp9uLcAM4EoiyB6Hl4pKNKuZbQIfUUxF1wEAt9wGp1CgCh5+5VmzLcTxUjw8c/IWYTEL0hJ/o0AOyz/p5QIccKrPZWn/ARk1sZ/PHpssGhpIGZ8QZfRZsBnXXlcxegPOmXU5P3OfY8fi8fVrxPnRq7ZTbEuTRelLUzaQ6PkRYhm6bqsv6x17eJcUSgUS43bhKBSaq2ruVL7EseP0e8vtfBbzQS3dQ5UT2IOpItEOxND2LdjAo1Fu5a9RcZUU3HD3fxoM2SU2y17BfxmWHAWxMPwNqetaA9dornbVqNIYTM8rdXcAHaZ1EpAWKbi6b7n9s1NxHpkUspMYgWjM6KRL5gC9AiYh7hkeqgil/jzP9SAAx9n2jpEX6Ud0cJQqL43va3CX9mgy1NjFX2+FaGWwv/fqPTKlfwwkCT5nTACpaBz+7vgm01HJV77lljiyQM1093+VG47m73APiYCEVSmBDzljRaZKTMIU2ZWMfPl2pMnrP3UdmiSyspE5vSk/AvuboYkNG6rtbcn3HJ9YhIw7+RE23hv/FbqC8ED0PxVnUpnSR8YTv6JnKd9BrLWNIO7LxLBG+6KfN+lXJTsJE2VjHmBuyKZaqZ9BWqPuQDokcNpCH9i0/kh1A9O070QU0K2dvNDOa53cJ03ferKNbH9+KyEHnEy6NGq4MbStAD3VcONuyzr1em8gRtJnRb1ff877d1ZzZzInZRESm1b8Pbl0E+srXPepSRGbOVYio5+pj0vXxi74VPpTOyx7BdKxNPdJqjHXigNcXd2I+vjvwke7+qSjvv/LtFQ39nlFjpiQvixZhpWiDJxy2duidmZC6+LBWw4VtOFuLRi0eW0MBeDYUctT1RsTz1BjGaTsVfsT9etT0qf/h17m9XMkc2yuWfG8CBrGTqH4fntSf7nM+TPKnoQFeabQSQR/4fzlb3Mimu+UA3JYObms271Rkd4KetH/1JQRSW9NcRc/X23rtoSwLypM9u1UnV1m94IV+ctzOjxH5n+mN/6MtQU1Ob7ufr0pUeJohL+qw+dkov0Gg4lds1vTf/dzWsgeAeG70L4dUaO6U4314JrVikxMvBkQiEINA354K4uCpKKTpEDOE8sZr36pxKcfzJUaVYNdYux5MRk20zyru16eaf5G8p1mGfR8MKSzDumGUtz3ycPXqSnEqB5K4MaN1VVT52o+0KZ+NC26iutJLQlT7s5ZWzVpSqR2mNAqokFRokE9WM2FGdnBfRNVX9f2X4xZoSmdr1WuzUNiRDzLVYNm9wwHY8YwSAXKV9E8Xu989SzYjEbGZYjUXzmg2ueOT2tP4f35FBvmcGeY9Zzux8fgyQm8RadfdNCb1dUh+IiTcIMp7w9oER5JCxJnNcITgEs2oaxCXeZA0nNePtFjY8RpzaQvXjgbqFD1EMfLaH4HJksnc+V0trMslkNOt15pX6xzMqdyxfYjKiOPVmiB8PinmPPLFR4ZaFxVaJr5+DdKk/r5lRx9FyxRRzYB6yAKoTiLwDYki+Jqk5T5H9VHmY67PWJlmKN/D/VxKunSNJ0AyTZtlVmdYeGZEgihRqkJLYya1EMzC+Lrc9XF2lY+/7NGk4b7rbOeA0csHI2/Zy6X3l7PzLCF9q9zfNDfnuT7tp11TjlmRt8hg7cgRy5U2aV6Svjou97BpbqMxeYMGC7dxdiY0Pz1Q+RUdj0K3rGqlxUn38tDxzpH3v4Xd4Co86+NtXRrsJjkT/COJZafnyCJsRlE/McrkSdljlxV5MyUixZK5a9E7h5PGBPd+9BmmJ6Nny2Xdw6cafkWt9PF/dW1mdN8dLMpWljzGtKyzAFwD0snvqJ8szSNNosYW0i0x2IGqb0UkMj+NssY+EMZqKsGspaHjZSY0e9xaI6uikRH2WMCQn9msJlSRe9Fhvdcg82LuoQ9Fo7l81QsCtP0ymI0yQWXMF3SaJW7MIoaO/2YHq0eyXPZnC6+3hsCX3opRpvn9FuG3INsZU3miXTp/8cuHueH68NmxPheAOqbaEdpwa9MW/QkrP0aYPxcROw5CASStbK3E+arydWIYmZIrcSsD2JJBUKDdGXNITC+EtTuivqkcLKJlra25mDkSek5oalWY4O4NBe2xa3BWW+BQLM5n7///d94pYshcJ4JyJzo2/frmSxx/2xH6PfvX17Lgjna+jIyFRKWTtmZuqW74WO12qnS1aSuBy8Qu8r0fZqxdwBHXFNrldMryKbG2X1L53Xtrvfu1lmmf2M9Hh3okn18jpr65FJ6+hxLoaHx7IInGRMV2lt7vy4s10eAMmX9cLH+10NZs/iuCmCQuHqe2yy1ru3wR1g7oyxymrWfqPeht7przvEgTt+rTexxS16QcHv2NdYwSeszg50Yp+N2ByDV0/VLpjLHyQA9AZHUzBSyeQTEWGhESPlUbje/gj9UModT8l82lBbqpsMhuP5JWBDEilj/5rFwCIX1s29ZEQxyn94cF9zKjXFYWM8m3Yf+shQCx/b7GObcWB7RDiGU2h2EJLskGkg+/rOVwPZCafzd/pwa+7g5lISfBj2vRpPmjIvbtBAkjZN4bIAzVLo1atCfKkQmFwVVW6hpAtew2yvc93CBbQ9EFt7rJcepUEDrgU/svEMekpfEFI2AgSt/lNBg+W/4wm/jPqPoLX8b5io/3dutpb7fuHhnkdLDyv3KHVoS7k32QMB+uEULLkHBg/OFudIgQz/4rqUx/nIEYdRuNsvsJosv6e/Wov0eZIoTlro/Yz2eQqIi/u6yae1s+b2ZSt1zmitQ748xi/vLHMJd3movyPxatfYSefwwKbor7Wfe/HSjhL+tPrJLNm/8iXupYPOYAVTIls7tN39X35gGyE+7F363I4TKs7adF04Spl1G9e3D811T8ENidUO1aFIPoiKCGjvTGtxN2fiErhSMhb2LMqqkboYWl3GfKCQJKxDWqWs5G0Nttbu9K3D8nGiFwNYAaeBCZxMclP5j99LYh+fzO2Znv6XEtMlSL6JhS+6zswad40+D0ebOcIofPJ27XYP86BObk52WA1OCtCAYHC70scOwxnRKwPJeyiku3UDXB+cIHMEjLtRyPqzcAuHDt2oM7mZccVckvbNn5zoJBIZ0e+1p4o7UdhTxZl6wQ6JW2psCYo2bpggBjiFRFTkG3216bnjlKj2UIpFAgklgbpCV/D+r9itFhSOWasadxeFty7A7R3R4rTliSGhnL2nLxResm1kU1p+aj24KlFnZP3iqI7RMHTDxhyxXYafBQWigcNxFsEt7i5Qp0pCcJbqMQng2KvgxGF0/2yJL/qD8XnycNf5ccZ7fsfR+FRPSNMFjKY29wTX+7QdCXWFTqL/o3dZuXzD9gpBmFZyz+x3RAhoNEtrlhai8cErDeEvvkANQNXGTx6c+wf9GZS+SvzsAVpCMVuHP2x7+UrVivyjrRtxpDlQdq1vAFk2x0NKsIK6uIP3qf3MDtLJ5yS1t5RIYDcGRWmNr6gpKmVLwaPYglkIOH+pl3tWu6KrKWKn0AxwTnYvQdkl5YI73XUdaIcod8yDvGx9oirRNMt5fHVWOgcm4CpQO0zxGFHumfPzZyp9T77NVzsTeFS/Ibi62PZGglsMpfmtb+kNbJWIvir6GrCntMBLBgGVhEuH4lV2tty8xozZq05ZNJskR2QrhDOVJEvAVlrRGL4OuEYmEUZ1Uvalai5HTpus25bKNca0yghyZRkTdnYWnxl2pfz6BcisMk366kNbzCnPGHzI3wFlR3liEBine/gp2rsDjr2QLhVJe2zaMaem/KBDwAaXZYVzWuh0EY3DaNHGybuRUsOmAUdwxsMVNz+9uCinZLHGV4RePbcNCAqgxNkm9WbwVgO78c2eB7dpz58SXBu0h5FHF871mjYk3gWwJJK4dVA9B2/ndTg3v9QeveydW54lPmA8FQ6eLvfLJMdNdNOXtkIpR6pqU65R4+bGVWT8YI7oU7YiuKcfM7eZHcm9hX1N17GzVAt0aD/0FzefsQbtXZvh0PeE8pdpokVI5RWJn3rFn/3lfBWnLZ/BGRTVdGSGp7/bkSz9OstEzweaG5KpFtBqN2zB3QREADbZpxct/IaPArfUwSunfVpVNJ9erud4T7XdvJ2fZsX82FEeSPgbFBALjcLqVTsiSXv3KZHcMYUEjVrAsPgaLvXYF8UH4ZQSQPOImzLzhJapYgMrcbp681bwmwuBc17GPp8fHq8EAlZbxbWl78UtHxg1zna+gKG08V3omq6Wl9pjpvsi/I0iZoj5xFyl36yv45w8jNuLY3kerZgjtsVRap82ZHJ/IwGnyJGzgt4USu3LNGwSGvJPFgbu38YoeQ6HFu9O9c19JG2ODFuaBC3LfPOT1Igq/REdlFPxilz30ZyN/uiHiUAS/wvLQArd4KQIqGllJ5ptgp8ncSSdtBJzJ0IDmn+BxuCpu0GpuWTzKfbwLgaIKgn5X3m2jiN6XxcZ0Ktf7g/P8fR7vRPqX2GsXz0r5IqS04zPnidQ9Ny6dw1H1Eru1mwui7r9cqhx+1rIdh9EKJ1EQxkYR48m40Pp2LHDIRGh8pOvPZLHo3o0hYKKdiijJDsDvHsGiBsyGhQUIECPaceY/HXf7gdwY9JFwxTsChoJaGgACXPkzz4NE4HWTLZe66Jm79q7d74NVFfen7b/B1LZDcwvX7lJHqrEpsRNJ0J/Lp602CxQmi3o+kjKain9/iVQf/m9vvREcDLbyF7tXneNYEvWq4FL6ANQYT7Ovu+rpWrPqGfq+Cn9S1P809m8Eu5kR0ZZR8wkkxWqlRX4WGCIDDclktKAY7JLkdpRFk+5G8GPgSJC1aEbQpUnq+i2XhAu62Ai8IY7ykd/ogbT/4DIbGXUkq1PXmyJgzqZURmhPuw0NWUbFvgaPVs3JHq9pwWDtH8M4Wm/5UbwXCpC9A4UJ8edxkGWDAVrb94CuJDnTUZjvMDdEL6EhacCFzN8gNOsJXbxoj4h0hy0r13YwoCln9j2iSchCfAe7306eGmJFy/qeGNSsV4BV6WLSav2hrbf4UP675um33rk819gfmP+oppWpu9GdmaPXTVPbhT7rEOC8j/F3dK3ujesOaGfJ12mL2d9oeeC1oNpBIHeVUnIg6muT5J0Ftrwvq3MkgbCP83Va4zn5xcCOtLI1dBb+dw+VFNpw/ShEKAEmJucHEU8N/caRS3vTgnYkHc7521ECI2vddbH5FvFHerKxdMGesQrOarJZ19QGk8kH97LVVlOlIFbuyNqraLc+w9JJvXD0zOWXGU0boXP1xGFKR1SdmN46y/0VtJDxD/dS/WHnYmbZ3sfR7n6WPmSsrYiYhes4yjjNs4LvMqbvXy6qfbyCVLwctFJnMngJsAtTtWx3M/5Kqc/joYyQnBFWVAL0RdbAKTdLv+ghXI//WdPowFokr8vJWzkr/1ST7gTRbwNumYdIE49ZCb+dV9xYsA/DFjCsILcE2YEOtjMSi+sC5N9Pyh1iza+i6PPUJgi+LNMftdpVi3fZzHt6FlCHGeCBgkUmBzcGBT8DP7spH0XSKRLMqA0Bem1lnIpCKnbocgjfHRpCOtAQKMdhkrmUhhbxRnEaw14ppPJD9hjAgNFXvHg7A7ySTLfuLBkVm+VcVDNH4e5a1phMtvXSIIvjhs9KLhjW2xXJWnWG7gfo7djWACCY4gPwaNoUMZxt9PpNokSGWP8TfI/vgt9H2lTaIdSbdDoXR750BU2O/Son5aN2j8nr6zyBINCfWfF2U2rbfTux57r7MtDaix2tJzP1LGvoD6J+qcPl0fwwBZ/kit6WWw/R+jcpip7grESLuxtN+RBx1SqXjFE5SKlO1KOVXLwoBCEImJo+KYObHF3JJKx1C9neb5Sv21acIclFIswQs4Vz50jNP9iwejoXHEwbu0ICe5OXU2JPL5x64jOTpfU9XvUiIbNaMxA/vwxP7vbfot0+fLA6sI2zZzY2sFUnbhrp47VzIYPHtKZGQ/Sh/tcTQgA5XzAdCAQ0zVPPDQ+IEoO532+3hks/1EdclEqza/2m0FcFSf1KXkFetQnhh0TS2TYrgZEjfZXZGm8QGd6dScxXBV9u15xwefPSTwGPmVe1mgpyFEqHrn0FGx6rX9CgGw/C2fc+bIB1PeKi8oDzUfW7lqbGhqCvjBgErMH5X773QfqkzmjPCE6BJWIziuSqXjboyIicKpbhVfFffePFSLiWXzKkpGqPvcvaWUrVbZyrx9Xl+nRV3M2CpRn7SqdRH3seoF5bivhiIV3VdOL1onrzWapFA9HvwMlIam7iExbI/6DItFoMplmbWj/0nxGcWJ9KpVIiAipI3qctLEfblbLtICZXfZ4QSCYMY2uoqVtAbepH2uxCgnXglYSEHw9CMRAuz2FwU9CB7B6xlC8ZPPAyTVWcmwkAL2h0VrVhDiQu4O0OF7Pj5hxcCg6QTZKNVBZMgkJw6hWHpm1DidHlInOzHBl5uGdrVy2qmhqkxYfHQ6i0nChMWGEjsp3xcqTU7lBAwgkE9N8vUjB9UUjN9GH1dLgtNx8/tBwst4cKurKxAqbB2DlRF1a85SMQi2SgFw2yxNpVw94zIhHjQT6kPr+7w5HR5IQoNeufo1ZukqpvlQ3TXFewui6I4Iwgafk2MO1cYe+BBrz18vqYoswmktWb3TxWw2KGdWWbREOXudrIBdrtLotZMtw2t2ff/+vXgxK9N1k9jOix92VRhoTj0bPVObPutuXnTlvk1xT4wI45wMZ0XFrEOoigQLPg3hMXzqv+BxQnIpMaMClMCHc3mnLjA7UF3vo6DgbtTq5nvN6RQ0EIBiuT3n6q4sv0JjgbA0sKfO0R76G8ueNxXHO8lG2FJgbUhnzDmCBsFwVC0r5PluLGwCUpqFpcCbVgEChrPGtGq6xDa6pACSviQU6wRBROLKioEJ0OkBgez68p4UWJ/th596ddTkH5+n+9zkQ8J4noAEIqUweEvlj0LjKxJFIaJH0ZM2e8ofr4VlHj2aZqQEEtqvBEtbfL58JTuYCPfD4U2a7MFSrO1dKJsMgxkmcCzK4tPL6AuwzMZEA22vDiXJgyNR9spJBzLau/Jm+qxOBg9T862QIhLyUQB0MXHEtEJ45KNZC7KwsdhHRo60SQUxYwnGqSFupIclm5IUtdHz475/ZBIluuVDOpFIDXrBiwuzV+MNHT59mhQA9K6WMpOVo/rSwV/BEO0tm3ngxgsheFwtVq12SM6BAavxLOHtW2y4gIms1AoEPHRGw0f5opUfCvrVwQ+m5krMq+TYEBmmq01Mr0L+4dTQ0OTXqZGqQKwyGnUtrudJOcelCpRkCBZRN8IgTDisrP3sHxjITTYObTkp/VvF1EPw5MNEkI2RWnC/VLCmRzw1BazCUxoJeG4yHgflGHJTfm80FwNzcbrECi/f7upQ8JaIRnEqtwJz3jHZxACScm+oen8nor2QJQOR3d/W4P50E5VLA/RhzkApEMatGEy2gX/FFMX39emPjkRbGnVqMGWjQ9FvcER4HlMbPJMP9nSYFAERXeBgmZmXFJentIH4pCX6OEoNYTLd0y5vd0oWWjkoGS90vLyiXRlsMmEtZPTvKH8rYlWL/+peDfiRWZLhdmqI42tx81PcaAoFiStMWKTp2IP/6oxgzUoZSl1G0jwR9y7rkf0/tDNYJawbFVVDEwYt9s59TVpWv/QzMf3h/cwBRynJvr7GfMx6j/3rnkDKJRhCkjNL6J9avo9jdbk4/8B7XeyJd9TEWQisfxNW1pQ3jsDsqqwqK7dFlT13C3dYtztJOfrW/+DL1zJzyo3UlbMUoWr6tu6OdYn+hOU2ZaF1aHw4zJymiFDmgI4c+zCrXAzxjjDvaHNSafWw+4qf7Jfspt1ZgEGxlWRfuLjUq0A/ZD6VEfuotDIn2B2Q1SuHGWvUhUQO1udOmp15mAVCAoy9mar4LgVTKWJESogRYJihmIQiIw51eE/KYZy9qPAmzL9rH66WDUydK1pM14VZeCf6V+t+fv55exBltvHugjwYyvqw7oqUNMGk3BCQB4A8HFibiqbX+07WOjY2rj1hFT1PoH8B4xjUOHsexvdmKdCKOFWiqEYh2569fQ9oWg+VTlZu9fkEkujyGQAvRAbzlHmaKXDtTzGGMKZqmNkPR0V+d3t/OigxnMCg0aS1rwhM8BQojNXSLXENDo6sZaPU+DDuPIWC2CJCpqAsgM6rzLdcABTaVaHQPiURdG+lTsGVOh6jq6w2NfYN9jY2LqOYird7OzxMjUW6Tt7IWumBGOp/DGRAEPhWhNzkkbFbazGV+zMvHzIgWShBh+iWTiXF+1tyjs8u0r6deD2yHQ7H0swMNZisvDq4Luf7htGVCYbvoEzztuie0IFwqAEbzmUPbO62NfByEYw23htqAmE66f/ZmviHg//lMMml+gTxbDcXYxe1w64QIJprRlUG+a27ubrqQcr7ti6f97Okbbia7Zhd/dhxuam6ULc3oMh/cNSgh7NHyovTV3cRyQ36H5IpEBLKXzSJgXFSfJ2oJvsxQYJIwaRrcT82a551G7GtyZu11yZn3otqpalwnrx4zgyFCuklFbN9RP6bzbTEyPFS/p/MSUuekpXzAWH3f9ecL73aFq2bpKrc/X4hLfElZ9d7E+6OShXu9JW1gKhA13ES7pNFgjIdOgZ85JCOTY72HpAzYFKAFGHrhS4vKzxeEdLHYgB8LZIK6a9iB3TfzB+xbgzOoA3qiGdyQLJ6mwb1iPPcafFM8l37Yui1WRYlsD8ykqgLtaUFAT1u22C41PsRwUfWlpeJliz6W4VLHd+fYqkTnLtuL0N7kDVhOI7EnTqKkympqAaKR0L40F9UhBpmxdEtfveKTy2alUoDAIUDmo7xDEpRKLagSamHJHkgq9s0M4/uNgZ1O7stwtEB3l1a0Wzu73Q3d6uKehHPsccLl0UiKpGyBttqcQbs/1P55rQkiumr9IYDkhNY8f9xVtD/daL3lwOV/pmvhpzGxpm9h3rv429Zl6f04U4CcMffQneSLhLYEjCHT87riOZNohdhJDRiH1kKO6woHETlLq29fKABbAWYZMLe4iG8h/AuFkvkzMR2eQ7e+wTtYDpZJaCSlyYDnprlAhMVAMFdsDR/dEV2GJilzNvDgqDR38aRZkDNjLvzjTQJnC168FMgx0sfpuU+zcXMjTXPxgjNaTkxNafZ98PDGDaE5jX9Vgn6H6LN4fnsWriQ2ugicqANG1cmsUa9Fae4yV3aGWRRGpgxB2+eeVhBsqAsUuAbt1uQEVkRYZXLiKLTAsFq6ZZ6S682wkBYzKdvKXHQAGor5NVxe4SJy8hnQqOdzswrcd+4dUOQ1jqpmN6FO30skZrPIXnF7sCJMjZ3cXa+IGXpgQPiVRFFol8wE5jZmsp0WlRx+aKtHqTXGdVUEN0fk8O3ruMQVfvcKwbjj9S6IIzPxUBMLjvpUVsohvB9uf6yv79qYBVBmNqDViT5s2zYJOUDd0pb3ppkej6UC4DXPmjYy8vl0QDcKnuFMjs4yCR321xcgdPz17SfUr8BiSMrk79S8AYh3EsvmV2by8bfJijc9zNv8Lj1ieA0lBWQ/Dbp/we6NYbPKyyCSOeBl/3CQp4u9SI/SqQxLyOX3XPCQxduP+52EnoSMJKCwmOObQyWWMKiWHMHmDcnGygXmgwGd3W50dqO8OoC1Tchg4bORQoSN22FzcJMmCykCIi0ScWODo6oJm5NAqUnix+jzYmvc2RS5nanMBTNlUJwWRjjdAYlabVVMKNkRKHFQMDW/GW4ZJ7ylwUP4x8JWibWKacC1qpvaEpOhjmqV0PDJvwRYP3HpZ14605vAW1tQsFY4qZwZsguhnzakANo9ScmJKAi1YwbNR5aaFdtAqRUXveBMYiFst2wF3MY436xNdtr5+p12VmL1cd9+FdzSEi+k2s0lx0lpH4iFwLbSgs+h1qNU8509+iFCs4MEUAZTBjqmbZ11rHaL0AQFUASfyHPPz6XvO6e/F6bPWgR8cywWR4UPyzrgxnBI9oqvZ9npVhV1gKMXWghSPmbmzECd4gBlFOKLrkBGwzw2482y4C4dBZO6TIEN1hAvgSmTWJQLBDMiTE4+lF6CbQvUFJh3J9bB5RWVqT7b+tQbXONDPOvxhUP9S2Jgnigu9u511sHWsJqBpdZUnhgnyCCCb+/VBvNNR/SYex14uCQKdgasG/o57wqrfOieRrCNyXjKyoBhEEBRSdvWp/Mn7X89z3p8Uflv2PxeQuxm0/+iLLNaZvpX+gE05qkjnQgHNJPOeYFJrAeVmDkj2/Q1DA5a2q0ORQyn2ebAMh0H4rdwkyfG2xZCh6R+u6X2VbhqfRUa26MQV3dF/WDuCQ0RbfcnP+gWIaxAIACAg0MgMkPZHvnRAHBjrcQIbBPdu0/Fodgfeyi+QzIOyeBrQ4mD8dFrgfYnjFWYIq4W6UM/CL8MVPJRXpDuDNqduKRrS/HmbcUzzult7OokutudFoEAjh/NrrC0XeA8aSgAUSZ3bGRtWd0xnyAPc7voM+yVaE8BSqal//E6nE6JSaKVN07B2CSpehbauLr0CyMjHARvdDR6z4q5cOPk6amanDCPpGv+eOUMyKxVqre2GM/DnEZ+Oih8tkK5jvyUy27p6W3GCWBOCy2rlY9kzf5snZ05oy8ZXFTMJjGJzMIDvhcBOZtWPHZuHwYDtzp9O0Ir14cOZN5TjlxIoBHaCAzJbDUU7SBqi6imZmVfiIzW6eZOzIFhxDi/gnx8Z/WAwHjM1FdGjGnwyCURQ89GASPt9k1rp4wxl+j0sREGnndKJSKDEVzTvjfF28MXpFINGBnr3Da9O5R7PLFVS5E5YNw7JOrRvrU84bt7YvFhKk13ZtSxurOoT1/uZ6gyww8O+UUXBmqJXVYRFgHk1zTyWJUMKo/pZ+9TMIxL97yIY/7rjkGkgVQa7VD53Y+4YH6PZT+hFkb6W766brpqWMxu2LHbVZSVNVogGxq8IqCSDnCIc3OZtNY0MdhAt4TPAQaU1hBHacA8StvEPHumyXrT5QGfDgveok3WfaAMYZvPIUJlOuHcjW+5YC2TQ1zYLnlrrBr+JAP27IJleMezgE7wSJUBHtLokCiBy8hfjKO9nQEhy0tGs6vXCG90dlfV2Hct5cRztEwA0j6JzF05YvOwCYhKbhKZKXNunHRf8vIZ618PeEVLrZRElAYgpbxCCZkkZ1mYQb9WPh9nJJUlTNAwTCPu43sbJs6dmJZGdA9k61zApVCUEz2c0hthNOLKDY8fDzginDzcnYqLc/xMXl5O39zyRWOcx3a5rO1ILV8+6Zfyp/HWi9ja+AI7fCuHY6nIIYupBL+2v97qCzi+H08v0i7op4TB90puxji8Jqgs7BGBliXrc/N0kF02KAtrB5ZINvEMiUZxIyjbiVuWeZeMj6Z7+8EwKJNe4MoL1r/BYtb469ejrMWsDgODkoDkFxQA3NoLnZ39tJEmZobOekNxSYnPEhAV3TzOnCSSqygoaFzSRUTpQ9H0HwEdFa3dHNzz6WNf6Hj2L8GDRYIuOuQc/fxpXvjGK4rOn54xfxjXpsnz0oJKaTRAYGyHeBBO70wk5pCYNsPSVJeqxRIunZY/0OqP5A80B10MjVikMWh8fWc4PDHIpDwL7kBLAo2aLxbH9aIvC+Ol0TXtcAHIf9ecym/r6JF0kq5whxBhIGrppXTgYkWREpwLRal59rcm0KY0YNivEYm9tSTSTIcEnfkiq4V/reeDSnZpvgzBbO4AaqNaJT0nKb6WOJYYZeaIFMjhYDj8VMrhx+wqj03nOPWbuy6sgIe7jdZ3uH4PyeL1XChIlHSkdgtyqyJqRG+9RxBHDeaYaQP+soRsA0hljIYlaWEmObNkibbPHGQ+8/wOLWkNt2xNEu6+3LDZFqFUQe+UJLacVkhHfOez7AqIFyTHDwsL6vk6HccSMVIMFXNc8FogFCSRUGrX24e9j13Zi8Zn2Dhg57CGIBb7et+S8qTLVtRYjxkVo92VeLpydFgvoEHRcNcytA8IXlsxflJ77wjrmqyXGbK8yYeiOmsOQxFVEic1bpiQHCWhJ9dDWAJQMDZHg9uukftsW+k8lhtOg3NjT0ZlUfrKLZJnaSTzGFJO6BOy/W8ZN9JXepoNX3S6uSI/6no8UdXrbCa1kUIsNeylIvp9ElzZEdtpXpN8fcPwsaJSn5y92BnotGwPO38kiYzRu/knZHh34fJBKsbNujEPX3fwZiRvcpd3plalFSQKyOlUHdtIBmn58wP68tNMFtviFvzkbFYHY1ygp7y+N08L7IqaDrf0xblShkQp113u+LyMQu7RAdPktj0zlejpcUbJTU3J6MiThkLK/Ge3ydjbCq1PTVv61LBgEhD0rVdbcELOiXQMu98Cacpc9vFg3nsZWOrR8S8p08apY0S7Uqf/UHZ67ot4n+6mNDlIE4Zfn8HZh4Uj6boxovkm0+tQwi/W1dahp9Umrn9VnKh1jqjgKZbvbDn20K32OiHlfcmRvD1b8hIqspk7p62yAYR1e7C0sQPrLhqklnARveIi6iHq4gYs/rx8HHYOqw9uThmbSwwT7TYzdQBkPoP2NoyXBLvPeS9IFqJ93BMekvHRkYMCe3FMgR2c8SSS8g0K55zgLcTE9GGhj1uO/vlzdAvdblOMbjKOxJ/gQKF/ku4a0beKjQ+/Dg+PjHhITnDBoonH47XeEB7SMvHQ4wgmBOHpCzMDCafxhPORzcDGZoz3eOMPKef6DBEBV1AnaII3ZvI+kdoglgJzIag7FfxwgdUmUf2xt85jDk4fBD5PZ2RI90XeMXUJEHuEzF7L2q/8VuR98ejjMttA50rKSAWVU+EWHvYUPiF+9RabTOleZBsQCZjmcsDSNS/nHZBHeU4PV/4ILfVgBaSxG+LkyZpMSgOeiz2p1ChSpVYyw8iP7E07vjqLLc/sQQgwPBnIpAlMwwcxTDxGKNJK7q30FEwOhu5DbKhZ9/bDTo/8A1837QA6KpVcOM2P3ncIoOoLDWQ1J0yy38/lpu71SPdzNU0gnjJJRI4lnrZXUFxweXKifoWD0o3pKXFOMAfFRfd8KYko9UAB/NYoIjuRSkdakCGjo5dVpdssV0yKI0XXrNJFtq2EhxwYmU81Lkv6wZGxkab5mVNsc28CjMV6iWSSEzfj6dOzOyUFbjyPDzX/Ko8UD/fZaXW4jrY/b4yTbUmWlyJtkPcuHecUWEzz3vfGRqWRtbWRjhly4sf1cwzqlgu9n/m0jg04syGiyMt7TpNjxnnZl6PtBIr5TmaA5zLj/SH8bhsiNWhVxEb4hkon0GSEQgDEMuXyc3Y1Ed4J1tfli/DKQ6FyEz5+GC6BrBy13KQQiWtnx89MaW5O8WSbkI/zvXUnrfLS42ZdoR7xtUL7cxRMt7dByQE1U4do1Uujduacdm4tyl9lvDkQZfVWByJtk68HiUISOu9HA86rvnjWY/VaWAquvslvGhvp2nn+5fkA8sJIEEtnVJwcfmNOB8K4F+3iAIdPWks63GLcQQeAJTlDCV2dw2/yFcqXF5i5yNV32zGN3SkbKKN0uJhesj+xgXWAxqaYAy0UQQGduoo5rxmLowCn6TlO1tmEHUyt9sG9I9pBMll12unh4b01x8YvXx4fPWYScWwUysdq9sbl3oeIvxG+y6E/dfb9QXKpWpmaFs0C0V3TQetYIBRf1XbvTQ+8jzFWHJa/JhlQXO/qHcU2WKOTMuvrnW035KWxW2zSjye7HkGpyVE2UrsLUwvtUX3r65StU4fsZX+V7O9THFxELXdMclRDXbnTjm9ybHm93YJYpc3bSl5mb+6jDC2K6Qvwy7CHlSiVWDPTUj5c1iPqlgk54haJVlDppZhR1ZDbkR4sHmH5ZaTP5KZYmyO/KoXf52dW7FRucfmPzUdMlyiYwlop02+ETfPBaY7lISNa0RgEykgFLoPQJPGJyYBX+vW0oK9csHCpuBXQKsi29Y0LFy8PlJUuZ77SeSA5k+9MMpeBGnCnKNEjWi0paY7BuPO13WrrtNJq1K0ZPR8avDBik/PyG2BuozDgYV2cazKTSSm6WO1F2zhmlm5Esc63uyU4kkNTLt5v2hWLxJsY9k5n3yd/ZN1wrS2d2UqTPWG6ir1ZPGzc7MegDKNPGllkYslIbF9MAUMKBl4bXcfK0h3Rbw6q8cfgjz6rybnYqKj8TmuxWQmlkdS1PYGa1MPj9RdmhedOpazsA0jOXpW5A5/OGZ9m46g8lpcfiSh84kXT5ChTTLXXXPmfij6cdcI0D3ZkTpfpvvV+tEhO8gCrW7FuRMTMymVoL9qIKDKpMaJoZV/KlFFuVj2RQ+T28JKo+Uj/HBt/RY3vZxtpfqclqkKl4zE1/sbgY3rFlQt2DYE+YetZgPElsWW+JmMhoIkVcElCDcs40LNdfkEtbKE2NMMxpZiSLxWwW1wSXFoIDEn1ClQ00BxXufnwYWE4J2z6iHhSWazfTpJl+wDGajM63O0tBjpHkNs2F+UZdtPhYWQkJGCDTSzclEP09r4EevAztyFxhjGTmPeP4F3Ti9kX324jeI61Qg6NyufGwGxduL5Lw163D3QOlfS51sITX0BZ0PwXdeycZ1P6tWuu513QAk/GpJcmdjr1mB9Og9th+kwZ2BFld8mLnvUtaFl9Oh6owXhpIE+5BSCVinh8K16Lw7GyQ3EBJYR/A+a4XXtbWxse2HEimgnceEBMB9Z1cNWUHdXDarvqgwsL3NYtAd3oo1s9yX+LwPWT2KayXAzxZYmLanFb/iXvHLNeV6WHlBoZJ+JIatN5wmPq9CVKOIoYSW14lcLlPehDL/pdLibBdzTNRN7DLMaYF84Tyhwz+bnqlCK2epYUn4NgxVWpkBbqwQ18TTofM1FjIZNfx6Pl8VcoARhXaoeQ0/lx69ZT8iNmKEc0R96XST60p9TgheRu1dqERZIGDvzZqf/3jfJehJuSgOaXy5eL2jxEJD5u8UhHW8cWTYknyUPUJpLHuCdv+HJVbQgFgByKxhH7zU7Lz92+f3dKAT+JEuU2l1xBPIiPTsG29w5aSzUSokTBKZj8he8dSGk9F4Jp2XFsUwXO1TqcQhoytiZ5WZHtXhvZBhdi2K51feYQWStsf2P8vlrbbUzH1SU5pBXjpnPBxsyqWe9P8jHp37pZRDIOTLYKv/2/yqIl+KL1YxUrN50HVpRfLnJzSXENcBvXqfC55bogPhAEyWJH7E56lcW9MrJxlliT/UT5Sa7WYYr2ltonSP8QVoNUoq3snLyZnx+VRcl0j3z62ke1M5YoDW9PdHJKbA+XEnMCPOU71fLcMylZUfnogWBnd4c4BSJvvSbv3zc+F+5j0a2CiF6i9UAmC+bRdOpUkwcSfWe7HLEkgn2I7LAwaLpovRMpiEdU+gG+AMdzlON5NHLsxwANIBQAf2/qDU3ySDsLzqZ36n58qiAhKOvv8vfP+Qv2htngthn3YWTYByIJuZEL2y1zUWcj4iwxTbAWnHyvrS+pdc1o9lKUsdMtxy5rJEf4SyzdhTFhFT1hq/yMWVDHQcYscZQlIRHW/wpPTgUVenZONtdepcYDPvDuxqxB6XbcSodG8NO9zSmwyQovnZmK3qpszJKpQjNHTRmcrydbGJAaLG5cFr7njFwda97Row1tMQWlaG20b7U+IdMa9Lvw1WpNMEMgPKbp5//zB+WftYC5345cvby7u5G+YEt/fAdfeE70ERFgx4CcuJ5wVx0dSgzoDGpITPZND6k8lOpflJKJPQf5f5+qkEMFFKiKBk1AB1fehc4l6om3Frj9x4aC9OGTZhSXf6OOJeSnTW7YcOahC1oA1DP9QD4n9k288GQN/lm6LEIEVLOXdbHCSvU6+QMbg+bYbz6vtWJeHdW54ciRkt6LR3iOul9X62DPBEgMBI+SIj20z5+j/gF6Jj3eBQgcQP4l04xI2fPYcWmTeBewREi6WHjPauqEr0sBIBZ8QAAEUVQWsMZQqOQrBxjjOnUe7rJj3X3Qnr1UspvLC6HwhUI1jNqoygI4MYLWaMipqqqcp2G3mUZ19lhMY1uhbk7XqHh0Tt9Em1jYxSoRTjgEAv3wxtzhw3M3HgIWiRV8+PYYhs0yDX+QBVJ7Pn03OPjYLsfhuUeOnQTVeRHVgrCfT2fBI/hRDpaRmnHzJ6BnEgrPZpKquBLCBxhL+FmItGCyOY9o8zLqwoTJNtr9JH2THq4OHiCXgyjDVD+777IYfUGtYPcPNxvUBTiU6IAYTBlIRlISA4lHigoLRf1GSghYdyFTw0vScoYdjgAE3kBFS2H63DLL9ie+6bHKjJQldlvYn1s3voIfU65Gs2q8AehqhhSHWzXoaKFNBnQsobnhXv+h0mkj2uFDb6+0znHCp/tap2Xo5vOavXSsv2XjGVdp/pW3h+5wX9d0qP9eKj6yuLH5Vmxo8fkXWppRo2pYB6fPHELf46iqgjmpcQI31kD5GbGLgq+4J7QS0O0WHuOe4fodq1s9ZR4cicRIK17Rl7rF3uphL/VHhRM2jHrVPPA2KXnQtoflREjkd0bLz/PjE3bl+voybka9KSXDZPjz7wO57i6dKeEIFMbblVA2XsO3cgmN4wR7qmj3yDyKTMo/s0loLqe3mI60ZGh0WySd5R7jFl0J7OKyZsWYsDkmNC7aOwDmczuPQoyvlf32ChKaa/b1Gdzm9fWVfs8+qGopz7B5IlTL4528ar1NVRuBAulkzoJNvN2xrbRb/4RE8Wc0D3saK+HdnR+pjAKhFzqqPIM5cakCtwH+Qc9/FAIFf6EVdwcJTH27xUE9wqM2Exuv26BldvjdQXURlCtV+l//H/ZR3jNm3j+f5OKVG1K3XJcIMAVSxgAYfw2kUl4g8yz3mOtW0XeF3FeiGx0Vgn+y7jLiYEEJH+V2qUepPDkLD5PKNG5YO6E/uwuJP/KnGyp1VjD7q+S00+0De1sBNCKuEMPOgiy2F8TughUacdO8sec87OeSUkuaK4IIB98dhms1yFd4Y0bshPAYUAhP/H8fPSrC8KU7RRL7gwWZ1RhEg36/zzoX1AmSbVxBtr5w+LLa/cvrGVxYWKcIZLf/q/Urv0gOazb7/1pi3uzfV3NYDOSsL9TNAyRfuq1RhBMS8YRaX5epvWhokEz1dXzXxhA4+Q0JwtbkWpSmwtR98UlIwjrGi29LfbuMCsxhLy3Va6PzeFZxMMQCwnLKzn9MQ5Bf4IQIFEQQNmgm6LuTU6VxfXDfqPI9mhi4fjM4vhCh8V54jlPfoWO+qNU4VW0RsfdlfjewuLYe9JlWVVrHOvR2xq8L5Ftt6T6FvxOAP9MN0QjgcBt99F8G4fkQZ0sGQt30ofrDXwol61+kZz33SWh8Lt2lxIXy/lYOXjHkk7owCSJ7k5Y3hoNthnPQOcgP6pums/TRQuD17E6elEnBE3CHzGl7Cl1KrCDqEPY6TbiqpdJ55CWJxXWG59UGAL/6R+YEzf9W1oGhArUL5tIBawJrPG8pGs57PB1P8UdK16WheENOajMty6obqu/xEFctNxczOYofQsaSKFQKYNpQDB6qr4hYH+m+aYqRC3cIUeU65Z3XwdvwgDbjuCkSIlMRICMTFrct6I8MCI8sriJ2CQj1hFzuGupkfm4VsJEycnIyT2K7NoJbllSB1tIKUhgPq0tjy1nz54qL+K80Y12RPrQUpI0GjHB54KfmgWoGcDoaBEddr1rQ6NjIJBIwCov0+l/qTitNN/pZMhhsFQpAB3iH6jYHcZ3hCbedNJ/V3zU5T9TQopx9EVSTkHL8ZjX6nzL/axYgdAGq37K6fbtwxFVc0nVyupu3sXNWbLjXqoVhh/W83rKODX1Wbdrxx34z/2dtho3NLBhcN219lS2OwYQq45oQLEVIm3ED5yRZeLg9DkUVmPz+X1YnnvZD6hmyUplph05Etfo59QOdkS8AC0MZYrKzwdj4eJ2hQDhgwTJJzKosIfHRwgNm3YSybkXx8zjeYvH6KxJRkJQy7KqY671DWl4/R/f4Vmbi7PbnoLGyBPsXKELr4Ell8/wrFIk5rRbuOg1BDA4Lw/Wc7wr/vHaopdTQNNRSQrdIINd659Gzeex8/3gbvq6c1qPbVz+ARRv7Ehp0tNBGTw7P3JThk2Me+5Q99ZoxReUkVihU85Ka18F9C+arclkYDqMhSBxoUSEuRi8NZBCe9vTVq0e0g54w/+/U0TtqFwc4NnQd/sDE6qrFFq7s0Ak43NV55PgL31FHtP0vWrWQYTMGPQYKy8/0T4Gqh8Jf1dikSpqZUNeSokmxUnOjWj2OkHzavEEjkYysrIzwDiORc3Xr7uabuzsu6+ndGga7+i50itepOupLFklUJxeBNpgalcptN5jSIvI67xrs4r5zBwPFYhLHcdd5TOJAWixZrwliZ5iO3cUswf6/bp8G+4mYew5PuDtdk8mqIV/jIj1jF/jTugKGmoJkaWqbMqRH7EK/WLUkgOO14Hypqxd/adshsaGCKm5U7gElmwIT+zvPFSrqxfbkXjPOL2PtrrlFwJ8Tc58INPa6QwN3TGp9KRmx+eI8KIaeWXBId+Ld81eLXpL9SEyMLQt2y9twhPnEkUABd97E0J9wxcy5nVX6S7iXwKE+Meu3gPHETMu+qWbiBDBwidDOjpcbPdRf64zxnyELCTn+ccZburrBxq2u+XSELWNcDdUJQNVx8V2ykuBDQUq0r3DNUGFvfB55qWxO3uqRew9GhvMqM7NG0PjLeEx/VHaitNAw1JtWLJGQu+Te+/PUakj1QShcyfTUeOIH+vufvgd4dFC9DfWvqlKlXqnX5eUAU7/vaCKRSLDG/UpuI19wvy7CJK2yAhmNczLwaajx+0LM5ubxe1TRdVpLC3Rc1EwaSYcZJb7t8SqaC4y/UPg9Fnv5YuAiVbhRhyJW01J9CT5agtbxitIMpYHFik6xs1bdrgLpLftKyexoAgzPg+HNDcNeqdnVwQwRjDuSpkZRw9QsKivorSL1ItUwMCm2Ojs6VpSnElA4KmUoN9JKbJe9joubMG9IZV7GiuLleSWBYLyTHTSnx1nSW2VYFn2yNkv8SgXLqYSREswAAF4jPMmdyQjPSd9fL+6uMjMtQLFsszSWy/tgyuxQ4j0B5ksmPS4p6c3VnFh2TKqIxWaxb9kLnYtCR13ero0W0isC8ovm2IJQebjQSY5uqVZg5mstflOMxWTQ7RFk/QLYY1W3ly7aZ8aXJ90gMU6K/fWtMFAh9AAIoc6vgodIle2oXUhmsBKeD1u0WsJ4yx3ixQVcLsIgkeCAvSuiXF8WNBNimKZPdq8a/4KKkiO7rvaxiMV2IYJszAQs1Hg87BpEE3hJTgItRhOC7GUsL4lcbYLe02S0UHmYEsRJcoaDx5AmJIoRRxu8S/FLthaE1ocxxHESl3pHnyGvo7K1QQXtu8ARuTM4rRHMjc0EOTdVO8i0VmXmZyCw6d2MHr9Mu/jOkG+cdHCSUjxzmuVrMARV4C0LgqLAgrDmnD1DmMsBvkOxnp7R9hxXakGcsrUM2k9pw+2fjKWSaWwwBxhHdGM9B1SjCax1NZ082YTxhfonTYo+IwWOqw3uQadEiBaiw+S2hRCiKehtgyLHm/EZWCEQDi3ql86cYb5SHpWqgrmZX630kX0pO807NhPF79CfsiiOjm861pT8cUNe/fnHle2p+63btemtQT2OevkaT+8HYsoJhWSEfvjKxdvb+7aN1+5oepduL0p+mMeqxaR6U+gsSoKmSiMyxa3D8xBpC+H/Wn5fontju4weXW8HlmJSOvR2Ouuj4vY/ZT8JdFpd1rjf1aDfZ9WqTWsO6hYUJo56ep9xsx/lJcNVQ1dcWd7au2Vz9baGN2l2ouQHuaxal2TvCBoUEZ9UqRZW5qxRzEOOHCRtBMSMa8BpDN13tMa/BRIj8+avOw/N+MyLyQklectHH604QDU6eXEptKisfOKMrE7d5z39tMbsxd1C1oHFXlz+qVP5OF0HAuv1ql2aP3u8oHJX+bXy0lt/Ley5K1cPGKRx2SleMtX43/3HLcjMG0tLoBQwZzSJTNK87iZP+bJTULxk7eACncWeLW2yFYAFxz73uN3zgIdu7HgbylF5WeW0jgBi4RziiXmmQxJRmgibzsf6QQDPGZMpCJiPQsvrRGA8YJKI7JnB1xizsbLwBem//jeeyQeRuyVmIqVZiRaTFY37PraS2dCoR13cVH3qX/Pi+p3D6shUGMQsYX/S7N9eJnjUoKuR5yx2pTSYRXBX8MK2n/JThEEU/U7v4oWtCGdq3ineyeziJqqKZJkADLo1C7g0rX/k/ijaBAjn5CTB/eNzROJC3aZ4nfBPn2gRqlhRn8xM4rJ3mAWKYO0fcY5uHVDuiHNUoRdz29UnQMdUesC9LO0yH8zoSrUqbmreiPs0X5h9M7m4F52cu9eZx2rF0qstqyVp+ajypb3pCoDytwG9wlCST/OkRj+PrWtqU9sj7QcER/on68pwG/Yx5o4dvUrDGG3qYgba9s3VYVvvMu+x5T9rS3EBHKeyIYyIQC1eWTk39yqdlm8w8IGRacVN0mzkPfXfuvy2tO2qv6WS9r4o6Tdnqby/X6vfx5nHBFfl2KOk0y4u+40KjA5wzdse6GukjAOfrgvuIw+s8/j4wWNdBkDg+QPul5KNcQOLb5pzFl2sdkuOwGld00MVKx2aSzbWCy3tLydTosvoe1aq4UYjcAXGpnVPJuHlZx70eompdfLgdJKqeGVMlC6KqHbec9xNZu/Rn0Av484p9nWVsO/IG0HjKRswIdu9+AApL1m4CKLGXyRtVT9Tf14V3glHcdEB2ssTyFbEi2oudt3W8VVIofMwwcptx5XW2CozEqi8h9BiB3QzgKPaySjhzyRGI7HEUINoelqYsrJvEbYU2lyiyGT55rKgcG0cTJF+9kwMag4TYhDLbRBtS+XQxwmocXNO8bYiUV9RaDnRCS2RG9vjs59DVc8DAdGf/Y9P6j3ehvZ51DXxhNEMWWvI7dQfisNOLmUcdZtprSN1ueXakuCgoLmtknDVDCqT2CGh9ENf37szjNVR2nCDYXoEbaZnGuctloyZCbkt5Ynz9AcAAmsKCziJq1oHxMPojqcWlllQlGTMH02qnLHxYFRHvLXQHGjRpF06q2T41NBWTs12AmOqVzp3mRPrjXxr0oEuOtOrHo1P3dqRc4B3HCBwAFQSytIfDIC2JXrOgdmHwSrsMCnYDOoeQQcmM6+SE1BQUV9pLt4tWukh4Y3R9r0l0VR09qj4ZjPra9e03iu08LT/ZoPQ3TaLneO1B6ULq9U2bVDQ0Y9INLHXhxiFwzL+1fwKsXVtTUPNpQbnoXBtKlnLrauL0jkOAcJfu53y4hVKEVvE8/O6Ljm01ybz4SxygEi4ad+DOMmFoO9hws3WyN8Zl1u/Th6YbrP+PI5DcnhMte9y+Uoy4nZjGBT+5D54zQn8nO7WEeRKHoIjdeOkB7c6blmTFp2YfRps9HrC06606V5ZO5625LF6tOqzF9OJrDHAYDd6g3Yvmphf55yTsMoOe5DPGz0nVIcgYErZvF0YAvjIh1XLAilLe3b7W6WEFLDVnXmsYNctMC3TP52awV6Cmv/HW8ltAw9TxpAewj35A08jX0StrZ1xyHEajm1SHzAOzRrC0ymVCmmiYhFKnbF9587t+Dzdd/hv4mGBARk2ulue9oG7XkSF3hyEWnpgr6uc4My2LkTmS8/yp3/NGj1isQUJm8bi7mKIAOSdbK3esnftl4JN4hia0wY3ZBjWhqWjCIWAFYDtI3dRXSGw9tjLmJgU82cxfUJK2jmJhvrEwtSO8Umu8z1DVlKNuSXOTNVNVaJdQyj1KyNP9zFRrmRqyjK+uX4SJsdCJ9mpcL7ZY/BR3hw0zBsxI7CWmnEdyrhMj8nMrq5Mm+KekhYIm4YZDkdadCpqGJYeSbZg6BbbUbWijS/QAkhKZX/WbLnoh9If6LGOlZuUeFswlESj1owxwsBTVEuJYWbUO6IM+NkzYBdMmLB95I172KdKESY1s4CxxNnqSoRet/z1tEe9j4ahhusm9faeeK3usiVuhnEjI+lHs6E3lqT/cCgvOPmEndfKtkobR3nRG772ONE/lqT/sMgrPkkItKWu+I8Q5YWLV+K7VNxtCkFqmPcvYogHpoizWUZOR/91F2P+BPe1jlyuwYuIzzrraSW6luFmVSxwF+aCSeyNcCD/ll55tuuVHwj3QsBjeMIyitDsG/fKFg1WYuCnNk4Bv2QL1tmN05lUgOTmnWwUxleGe3TEiFR78JboUxEeL6VRlVn+pUv9jhXVN7fkIxKuu3AWUWNHb5He8Gf7UaCARz9lPIDztOgFdBmG/edKoPjprDi3M9dZtbXeqPxGXjqezIrjfO6Oypo4YHJ94FHnwWhG6TTV66K6aiKzOmuiMjtro84uLO8m/tZ621RJRrdUefg9nUuZwjvCcHICJNzRsoA4Zl+bk1RJH1ZbhYpbAbLFumD2wuYuTg8wzlW4qeM4SQBZnpcNx0Q1D5U39m8tChwh8212OamPHFwvtUtSmZ2x4iH9Hoz/Nv+IDIFi6R7JXLUrJ0nnZS+xnWH2ykZ6G823EPu1e+2L8/BQfPO1d43DNGVqLaWgdMLboF7CXN9TS9crJ7xK5vtSm4JT9I4AHWaZ8A7I5oIDNL6W1JYrxmX50Mci04PWahpckfPKjOBFzS4CxT5wtubtlyHNXOy+9UL14LjDfXbahk4hByJmxeu641KLMHLWR8Dfu8AqudD9HyCtxvaVjS9KleTz4jYbmE2a/vFu/+vKfourfX0YPPHtjh1vE+Gw4JjnbM+4+3Dv/L1mJe3e/xBuft3YV9VY7lXhvGwRQSG5y40h06vC/f0462lEKrl6EjPJ2UC4hUVZb8oFStJO8UM4ZqQEt5IsA+NSHRIJnMaPg23Wd/CsRRsOwfEoyWn9d0yMBd9l7uM363jQrLvy0zLt50x6AKwgQqIIwSzkJxpcbkBP3qRsC+/3/xhvPGmRveNZVcjXyqOWOoc4lt5w7IB1o4ha5RM487kmPuZzNFBjWKFZ+xOWxd/P7wvlEY99dPKscI8ttAmJjnlDHCbqH4N6pbHKCg5aYDehKao8aZ8dqaI2T2dndH94vApoVEm6H3cxYe5yzMzeMztlrhceu5nlMHT+0Ov8Hv1Zc212y1lF9o3ewxp7Ka5LHpKS9lkbaAH0ox0mjduRx7aF9xtYnu7W4bE+VCmrMP9qSqL52NevjyQ3CqC/k6KA27dvEsFVY2uXsXfx1Fk7OKC2PszrgPErZ9E2dyYkHdE+3oJ1y+u27vo+G8IK3VZa68GISrQFo5EatLhngsu/5T2K/oM+T4sB5Wnptl1AnMkB/+VRWdb3hvmn99hP2uba8r/Sxr0MQUmuTiVGKJ3gmgRZ/jnMOaPeStVDCDTOUUBK/bi2OaDhda4zcD0FgjBBo4oxCrjkLF4Z9T4FhCi12khSqdRCeI21TNSHiGotGPDt72HacDOt//s3dWID8E5WNHwHEXWHoOegi2FsZQyNmnoIovaoSkDq1TX6q+J5uEMXB41RQFJScYJP+aewPC8d5CbxHUlHJgItcEBfUy+7bW6m9b/YwgNjppBaNTv1PHkECRjjyxgv6aqeUJbIZX8g4J22+oGtAvCiBJTTB5ZQLldr9FmJRDTOATztH0GK+qXTF6aQTseslZppxUSV9g5OJH/CNyDt9y6GINIry8BnHEmcZ6HGOrUjP+G4pFB1R5cXcSs1PCiTGc/ari1Iu0pEnxuvuOBVMSZn7LvOviNZuQIYI33Eg5CJBy2Uc6MVPEmayrmNYM57NsKBcNhTpPuadUHrnG1tFotHg3A8EO2Z3Ppz+E9pYzACyraCdb8Y+AWdlJxmHsI1byMPrJKckh/a1S7vb12FbK48KH9J69WWK9AgWxRELZax0xJkofEEv3Ed6p274SkZyzxVUHF5b1FeNDlLHJsSIwkqwb/xJV7+5vaPIlYfdoQcKi3C5upz2XkxIk6kIcM0xgjwXFUk0Z/Ki1utzMBNfYHfkU++f3ICPZn1Sy2RBwqJvzgySeWt/t4rkQjKKLEdWWRtaK+mxZCInAVMYaC8JFWZVJeuCvaUQ/coBg8Evtrlih2OHScgSCgEeA4IGcsVtQr2AwPKPZ6qPFhVl65RlKTKA4nCBUwOKUZNi4deqz6GwryFcMXeGIXvMQPMQriParAqvQ4IGU/ygO18T7EODBQsgu4Civ2R7jDJ37CvyrkC0L3ziCwcde6JgMPohPzAwgq0SHP+EjW93sSy2cpSpdXqKKWH8/WNK6TQRrtMxx8/RmgjfkoX9PK9MQ/1lJaWAhwLlLShEHApTyLNLUrIEv1xEA2bAsmDN8d1NpXXKNuEor/3q+z/7pYhUECB6gg+GsOBMZQKAKQmFBknjnMzrdmHhlgs6zlZgxd8v3Maq9NByENFdnDGfMy6JRSYswQzuDcff5RfKnhD6+Y4zwo8oyKMHxsnIkfBtfHn0iEH3cKjxBCk51b167Op4HPAJjw2RC1tno/Bm6GLDoF0rnSeeuhxNf63Im33jK+8Suvc7H1f/CheDr1t7SdWoLObm3MS3gLbtEb3PhIPfSpz1lbJFdOHAxYisKagzPdt/Le3rQbv/Pyo1Rb0qTlvcai5p7rR+XvBlG+skCEMPA6if113B79AYQ7wI2GMxOm5WddZfWnBopTEfCPScu/SXPYG8omXSQwClF/fmYlXK9vLIu2Rjv/cTtyegjCXfJfnpzmnOOjWvQouxXlmkKS4CO9u7P5zy6EA6GKYv85+HXAqNUUjAfIFcwrLdk7eOT7QY8nk6LNRR9Uh64DDmscPgTj+/NCKkXmzNiaqygy9LTKzflH7lssAgVv0YeG5lpjr0L4pNdUf4+PZ6V9bl5F6719pHu90quXzYijfrR4aT6SNPehDL/rJ4JwM7Q6wGVA0PwwPOeZUyywC7jEAoq/VrNIUhjnRzSL1Zr3gyVDurKZdU7v12x/UnH8oHzB2NPtzz0oHc2K1mW5Rt3vp7PwGfc0MI8FApP3y9+7Jj6DxnxmYVdnB+xO9pl6+nFIrGIEvNvcnChKkl5AZi4sRyEtop/ct7d9G+HOBNZNY/rTellj8eVhR9zOI1f4H0ukNgLid7VdL/YrUYiKNqCbLw6LRe9Zb7W0TlnDb2hpaor7i1rYvyrKWw1pby9taLWwk3k6KZZRXSFcGz03IXxjRClbTp+R45nOT5ICxWA0p5NYcH5lvwUMmqTbZbJhrdElwiaFdAC5AP3caU7mehmiXcy3ihiThOezobrFQWwO2n/j1sI5wg1mP07JH5vUfOvWlr/X1mUXrdNHX5+4DYia4PA2YRehf6/HRcNEwSnR6H8BYDKetQrSy9awuUvbt+vUKLkXC4sSOoJR1LTBPU0LDvhhtCeLb1ceinKDx4pPsGgdddpQW32SdYLd/y8OdWBn/UP/gnOL6m1sNF4zqVu5D0zRPEJGMkbWQv/cwJnrNzXWgwDTGJtEQ1EWhypkndNlB7vbNQsG1Jdorh0TLjkccf35B7XjWHvC8Q1BLWqoAl24WrJ/nvlJnvLx4wivO9BtpfBu4b/HKnOLxkjist2+cF3FKs2ADnBTr/EcU3OF+DIaJyZVvIFAK5zgQsHkPdXGC66K12cIIzPrW8JCgtfqZp42Nn5nVjD3Gtp8Tm1TcwrduMnCtErm/YUEdL+FGWw1dK3BetrVGtRebxCjK8/3CP8msM2dnAfOz9dkOBOxRKbQBw8TEirUORExtNPeYRzu/Pzgx11vRq9RU2D4gPbFROBrjE6opypLeNcGoY2srZ2RSvvYAhogdwxJBfIZ25Oz9Yequa0Jjev/t5VuV6clDOJReJ7PVpIbUz08HgFMwt4MqICmbNXKP63yfgMikipNezD/4en23W/CiwIFTVwdV970e9huxBOxUfRqBjT9M18D2+Q5VzV67wIzNfRhMCdI2aLg42w3uYuKNx45F2rACbrwvhE0B0dlBhQ4E7DbK4uv7tpM2TWsUPOnMdTmNbzUpP3GpCSPGMDE5daNBLsptWAIWqWnIqvJmZ8ZRfxqTt7pXb/H+Z61AxusYdaw7wwnJbxcjCJalzPUmj280jhFPkTpvbtP0TV6pnaI7Pp7ncoIwti4nmn0XvClY9eQMIqI5mbpP5wywiot+qS43QDO8tPLxmr9ffkkq+o+VYPqFDuvWo8GxEnGtFMHKXgxRKFSGlc8D2ATfoDH3YGAGwvN3Mo2+3sZ1raTgr9WTBa/XBdijCMvaxTAGEoxG77UoemM8uchtTKloY/L1LXATFIY6knxtA+neLseiuVZmaEri6k34fpog7VvQtbR9/PRyisoyiwS4fvzooHd6SgWQOtWNe+lzCRCeMxH293jUutcsR7cgnU1LZLyasHYXJWLtsW++g38H1nwC4Pyt2mw2pXoJXmFDRzt6Vmy4DiB8X/XDD6b9beCvt0WpWlFsnO5aHOvuPme36RBzU2+YrL9sB5sDh/NQj+SuGzj/Q+g0PkAVmo/ygGUxYhTPgh/cHZzgCSAO/sx60Nf34EYIXbU1tgNRxoOML1kN4XZBZkfbVxJKO/+oPd55dxZAvFK/2+X+cboZXAMSa0swezJ0du0wBj0idw0wf8RO3heUA/W8cg2vRO5u2gaDSmAzxDf5JS8twyqdUp7ugC5VK/xbbK9RnYY3SMIWf8HX8zB4G/gve8eGAXGwkME4PjZGsr4OJzAqCEdc8lHbYdckOwOeaIlmFABFQtf8p5lDErqWhLctYBkwgd0BKfCPg3mUW2jKkZH2E7/EVuqVCkgynnBDihm0eFG1UMKl8Og5mhI+Jnpn4YCtjyqVK2vJvIQnxRS/yldfpH5J+bWOwVBnX/cQQ097YvHizsyWiaOqYdW387ZOycgg8ND0Cqf7fkEnDpUvAknZ5e2Mn2+ymfXqHyKnDNrcrBoqMHcCp8G587CB645LGqNPTHiL+4lpMcBNKn/LgHrcl7F7mSCbbc1lSrohLE8n9qhaMk6KbQ7CDwbiOqi0jtyiKkfHYOD0eF1z0rYjZkRcmBD9AfK6FaPERkmCnUh38+1dEquqAJJJC/uikT+4NyMVyIJViS7xNXc1ya7OUj83+9YXkA+u5DAckTq9M6m/bhMBcCY5JudWdXCwHbSkQUZzkBSbjBtVYztJfbshXI8YrlV2whu05X2ohAFigr8PmXo6zc3OOXke3CEgUtnU2NfOvpPuk978qcoKTkApiTDfl0RkOyhBsFhytFtC+RJO/mEdHyuW43vHzT9YgYcT/t8vp6pK2r3VnHbW3bbDNvZs0qRnjLSHTyW6pcFQCijFL1arzSDqag6E/j5NVI3yYzc0YsmkXux+XuwoKXnHFEm9isfY0IRlN2EneIxVJHU4lZHmL6Gc4pz0TvLOqCcWbrrgzmjotJGeNTHb6Bk7vl5uNIs4677fllPNcc9GO+IgSngOiaTcyvBd8F3m5v5ZIO4d1k1HLVdNqMbVX8kJSw/jpsfpVqRnR2cXx+Tj0z6Eld1XJvrCGRlpvSYN+wzJmdujzro1y1iYbrwT1hdGPmdsYdHip7KPMMPmEcJ4KXuT5RviONzcfT47fM7EOQlpuCA3P8TJa07BvBvOwVe2vabm/xbis/wg+dVB8vJQ+UVq9odw5aZZ0nLSitIT8h2SShbhEnAYN8N+VqG72sC3OOC0y2+fP5ej2u+7y9f+6yCHq9rnrfwzI0pGCTtTbDYQUUGAaRLdf6sEpPEFQ98P7GZ/VDBZ8nceAsJJ+/e0K37UHrRbl7BrQh2xBeKTNNExTPmoW6Eq88Y7L2rT+kwBQU0wWOV9Pv0QsbmksvUu5HTYunUVyMN0H2qNssRpWo246jbE7KEp4xCxpHUR7B5k+Jr4buOu/ATAuZWrv55/P5S02crKFe4Kg3xuNG9au/M4SNsvo9Bo1SGr3QQGfYNJPqnXFh/e/N9k/uQJ5H9f4xUIWfYzo3JEkHdjNtNa+bXPS+UF2Kz498ZBHr87+J9UyfidBQEgR1gZS2I07nAAOkk56Ottjcp7Iz97/8dYJfalQ7CHS0074YzrwgBFjSh7dlQSNgtMYZtZfcZq40+TjNGtVPbQsr9gEHUgsbkAhJXtu8sfSsTa24P1MmaEMfbfRJrp464vn00a/OhSjTGzQ2KHFiBAIw/EXiR5SCK2YwPhJRvfgBvkwJDiLhNNdL7YQpvJbDcg6pTVXoSnyF1dXb0qlwK/CBAYEmXCZ14xOo6zCXYidKq8xTLt5T1NQGZd5026zJ9EX5zxd2B00Zj87wKGwf+mbZ2sqpXIdR5Kd6UiQmibloW0TzuTGxv81r0ELoSFd4kzLMNlSvtWS20ExEMyTEMUedOdT9gHEUz9gVWVe8ovXCKI5vHvS7EJaIGekKoJv2J4GlqIv+tMUhK+mrppvU/HKD3utnzS7aT8x1Z9iLop8LXXvp3gW1sB6R/aUPZbz/Pu8W4dzPPkMuw2WRedS6qVCb9VGEwTmn0DklcZMCR/2oNSOqCnDKVPAP0zSWq6KM6SH1LWhUqNgAvwkSmnndQW+e23prGxBfsGSJtJ+4PZbpxTtyjLZ5hL6nALpajvMptcn4+mDm9O3e+BHXlh6Lua9q/BnjiUJ+SQ2nC2DrElG3/XAUurRUWpZ08YxVs6KszXuBAAzw9wupjis4cEV94f3vr8GcfIRsvkdPi1IQNX5W/j9tqngiKyy7IiQ9aAb4jFb77lQq1K5mSGlzsnS82S4F9f9vqeaKF26ivb85MXDAyBZMCBA7bkyN6NiosgJwF/l6ych5KGVpSv4bhtrBmzDqpJLl7Fy4UJwbweON/wQp/jr3N/rWaJRzDY/jjj1bwasirKriC8mRTqqZCtEVTSlYSjY74bszaIc374B6DuAkppbbAXFumxFqR4WX6t6lbTKYlJurfGmxWvwCsI1OEeaBf884HKzpzFO131nkWexNAcQgFB0JAFUZmJbCKUVdXaf4bwtSzeQ+wp/hDkJ2abQ3vcS0SGXdpwIygcBV7xzt8eFbrlefcOcz28mRg9Vbncam8Wbv4Q8GxWZRT2dcn4aUorJM/aZMVV3SO6O/W2BU/r7ZwKCT85rzKcC5U81zuycT5vCVSvcqQeeCbWClu1uyct0nimcKgwaqdb8DszDpxJd+mKDry1gDZOPzubsTxtJyqMeETX/T8kQeDKgvEaOA+JZiIiMMbvu8paSfk7jKMgX9+iVRJjR2uoIskMBiOYKwtRRQn6oHAPm1hkC3zErcynxiF4M6NmMvb5W9D0RoOH18lL4BHBb2EAneYMrUt+ttu3Uqk2CdxZw2Nq/NM8hJdMXegXgyWh0hHSVFPLtlLnT42eV8O2YmO7wqPHZdBQhH2OUwwCFr2uvBBcFvXcCh7e4ftUhB/d9tF14aQgaMGMudCra6a7LngIBvt/ewfI6AjfE3paCUoOVG+MO8c45s1IyxCviQ6Ay1AfXkVzVAoSJ0ucQMHkBu7PBPcMCoR09oFC8yVGauRkQ9N/g9fXqgYWDW+xHaOuhkBYViuuF+PqsHouBZMHVK0UBPMiISKmxhuN1MNCw56y4AK6zEbziy5+i1+HHJlhY6hhCxs7odgADRD0OyUjCU82kEyb9z1CDR5kWJiZ4W/awAoI9N+hvHPq7+VMniEuiEEynVL3IA8gmzQKoxmpmII6HWe1X40qW3QEl4j0Uypdjr82FewsgRtPObszA6ak47bfNf632JYjXqGebIMb6YFtvBcEk1vKZaKF0J++qAVXqAoHPeg2OHXHULwb3aTkX5fnDdnHTe7UcIIiB0uOfXEUndxmGW6OVn0UW+BboCFxqGWLrqMqYGcgaWbN8qB8FlTsEdsvXAt3hEcz6wmVuXpD6lVsco65s+K6zs0TUUjkJHH+fXJglpP6b2ceqtWaZ8lPM8sZPemqxPq6K+V/G7wb3Pke9sa7gd97AATfTp9iAdzzLXCpZ1ty7zqm9I+Dva/r7JbwfkRmGiywFSGzPqERqUsGmqOaOVlSMrrwdvFy+UQz78Qn+grD+JkPS7Zn1YI/aD/Lcl/61PhLJgxgdM2h8Z+eiajO7Xk3hdQmLp8+/XT1AfR15zSY35vNFEe3Crnu3TroXhZNinB2hO932rTcWXp+HNqH1bH3Tdmq5SHBUlebZMU7syP03wleg3oc18qIg7TwxQZRFanbDHRco1d5ArtcFE9KFzE0vsc6NdJcsv4M8JdTWFSFt90g3ZMSHJr5Z+d2tx5WOY9Va1gsbbZpTbJc6ui2/g/G7ihujp4+RZ1JD6EgYbu370nnaYVfFB+TvSyDmNrix+ofKPcNFTsuc54psD01nkGeSZ7pKNzLd1ihZ6d9NFmTlLGRRHDENJesexrqanEoUQrMt1pKslWNWmaxS7H1KsV4AEN+cCLSEjKvrHKDI+skIQ6MSh6GHeR6WgVZ0S4OoF58EmjQ/X2gnch6jsAbslhh444VSaeLqEWqWGfQdF40q1J7/rNmFBqKTMkRedN/cAjR4ZqayQYAMd6ofLBPBw3eFDLb4DXeIgwM8nTJVeOSQenel/KVQPb/EXX7G1Lkof1QGgROtljGMaJaTgaB/v8vqNyov3im9v2qlUlRr8OXBwaWw18DBI55NpBFS/iqoaUgL7y6oRG198cgY3VElm+/uoA31aSvCdD8B9Yd23wy/NBW5vxD5QvOZitIjL0KtTpgvnef+QFp8sR52/9+d2u45ZPWdEDLNE9FXSz7PLv6/8nNpj8Pc+YSoWIYMS2rhA3ySr+S38NBnLSnqIzS8f5BMuDSLT2GyXTt7LmZQ8LDtcyN4H868MAPCumdQmGzOwX1VxfpkkNFos6eFnL/5XvnYMkmicQsHyf023T/3ewVjopbOMEXceGJde74Ci0ox0rsXbuYNA2o2vOZsuvKuTWr5/Bhefy3Cmho+lmx/Zm4Lu/+yzSdB2omsLYakzTf8oK2YfYcovYLg3HLJyiaC4U14JcVEx2E8rgUcxqKWMNH9GpXQpnsht5+rZKFyWNtCNu2GIwv/ZkuATYdymH/XxtBNbz9+ys9ZLzc4ww+xLlfLhnuqmjPz8joOHRC4XO46DDED0hKxh+KbJzhoWxbVUg09nYuCbvKPl3GKAprjDkuoCBVlEE6LEEtFay/xnfmhXnKsJDSicvxVuBqVlUMnF6+mIF9sHx3f1RIwdOYLB8DQXHIMDss81pEKq7cI3ufvK1szEg34NViHlJY7zBDgcdkzXVC0aL1NdJkqD3NVrBcVD2bUTMAE4s3bwvtcRNBzJBB+4zrT/z8Bmzu3L+in+ch+617X3VEDEdfk63Ocmv2r9+YVJRemJCifVfQbykYLjgamJispXxnVw9QlUNl7kqfvfaceO42TrLT/v8H3x8ow352B/xfmTuizp4Oqv7gUz8Ii5mLVyMYTfzLv9/XXorbf1PpyBahz21H/w0bzrhKf5/tUTUwBwYg5ZlpujylJiuuyDsXHoXxVj30S65yVYS8CpwfZQ+TtoOg5sQj9gKnLMsQdKyeRqRqw6uqws6TGphVsgTJfE4ndUyk4sMcodF4pYcmiikKqTZ3cnJvR+agNAEXDbG+3kzbUre6CWdulIhaYZ+jucCUI3QrFTLkPmlmIQh/Es+lvRwRKce++T4wJCbbywRxpMC82O1xSllckqfaSQLWUyily6Q3uF4cKw+tJ9XA1hmDxHeU2ZrqemUMAo0h+GWVhi3L4c/dmXuYhWG6BY53HAPPhMT8GCCk7b1LHCKrSmQNweYdTHkiRonN1bsP41CMABxuiCkPh9C289z1DHeXLVlVuP82TPo4Irgh0aH/Gd58zkYV/Go9Y/ToyKDswIDs4IFFne32yM5S+tDDeiH5PKtuVRc8pFFjquaM5/Da8Pf3byvx/C1gKHzJjSCHyO6hTyzwinQcCxZjUtKHE5/Thq6eBYovauRu7UA8l1GgZ9gamxir+fc09Pw2n6GfVz1ajdqSkjmZrp00Y0uottYme57b3n3uOCNa81jzHu1XVRdVK+n8UUfO0flR89zG3+QzLOTrL+AlikVvnKMCjt/D3ocOFNW86A7n9JVkzTd6fQQNIx1Pt3R7eUQiM+GsC7vC9EuezmSulfAge0N1N/2QJ9INGkMpboQwex7PNKxrpq2QKHwJdSg1/ZV1KSLrfLYUViD+lFdyFJ6c8GWuFPFu3X9uk97rWFeETx6ke4+EkkJ1mVdVhwYfqZIsMkwhjSiLS324ouSK9j3v86OGCbJb/01QKeJzMvHbbKI2JeAYag0jXEp/ZzFhXhw5UewaHx4XLpn92EbOLwr2Cnl8eKTk+CaOPnrUfCUlTqmIe5AGObS1Y9eJUydJ5iPm+sDcsyaRUUa+5YxutuC5lZISGaEMIRpKxoRlA5llkW8cfSzd0FjWTTBj7H8Cczld6ZjDZQMwOHX4eKzk48Hevv1C5KaCwOJAaH5UJMUlCj/uzy0m7Lk9pd3ERXObAqZuz6jb7GYnJIL20IRgOeXPd6ej3+X7dsiSnN+W09LiJHNOebE3etSv6TMuyYlBuz6F8mO+n/KxLHaZ/EHo4sU/cC0/2vUj/kfOdsunpmhtLN0UUXaWpkeiPUvUvgmG/268a0BwKoM7cvTeUfv8s3ecWroq2pP4x6TN5vQg+jPOvZPVpXdS8gEthWBRelzv06eNdukAgWP0jzyAcwgAibjQKil/4sbfJW3nv2dO3Kbuuq1JebJ+I+flK1Vg7re5foJVj87t8q/njatsJ+N/LQdxEvQnEomE1qOi1QGP22gmyZoCLNhCv0wTpAfAPK9n5E1JTX8JANmnAOX7jhIYCOHOwkBuZuAAhlyg+H3BtGQeHG+YwoeJjO2MWxc2W65CJKy6OS23nlJd1YKT4gYGVM197XUSQSSbK8Fl0qIUNMZrAPq7jnYn7+rp/J+WXksIzuzSyhwYNg1hOzhkLXgrtdXhSgdfhnUVXzIMzqJHrwEHynIDZT0dnT/A3PvbKLb9/QOBihN3h5QbLy+UKMcCX2C9Nfp3zi+eLys6WH23WvxY1sIucnXIkFGWgJeBVybtA9xlVXM/f4F68H9Og9J8amoEGl/ITXczMYfkxxEfDyNxFkpbdf9XRvB4+dSOsH0IB9p5fU2Fcr0uKXLovjEriRu1FykJ86VRbrUifEQfwlUXKV44czbc/u0M/WOrxCP7kg+oQew7fZcvC98Ko8IJzxu50j/vG9ZLf+TwgM64xLvsR5+f+k1n3Wm9oA85XiMw88872I6XEkpiGIuP6piZ2Nr2I7I8n+jrTet6fR50dW3+uGv7jnCHlmFTFqyYrp7TFiAy83AYLkFeUzGeXy53Rx9hbyU3rixTVVeplNWVCjfnbWS0JUX2PSzbUIXe6qlb0rDT5YqaqvXtbIrt5/FLkD0zuj5oOnBaN3/Xnx+7Z37/3iPvitQ7HHhEr3Tb30+7pv582d500rp91NUmWTn95+cUusaucGJ1VVtdkInxmFS6otjOuSPC4apV1kZvf375FnnO1aWqpWrYzGBh7rLq5YXLfqouOxUmXFVCwUSuyAgZvZM84aIS8ANqwJrBNXmk0YNv5Slduo3vsSy9hLYr6F3HKtFEjKw4ObvFvOKa9hWmoG1Tit1UpUnM9jniurkD4+zbIqr+rcRfS0tnaMXwJsNcXmE9pAsSWIanHhDG/SiJHHVg7rMdpW1nTxssi9OJhgJofYH7kt55qAYkmQPbkhKkJAzfRcb7W9PpYpLH5gyzXB3aish4bH5bxfC+ANHTbDqyDumIvPYstRKz3c1nA59caoEbEa1nWRPqCY6IJwe0HOUmZinhi0dMfJ/GrSrhhxxR29xwcqWjg37uGjvOWvG0kn/DSV2s3Q0hPPlhUH9Ct0nu8w5iuENVeNCPHA72/UVn/8ZDf/8opjwVf2e3ZO/b19Cgck17TFfSrkcHaBI3/DmzV/dGyZwsc1IGhcvflXpIN9J6z5nMRnJjSEv8//ga328ZU67h40ZhMBnDFq16soGVaMdDqhzO1zorBi+hna/V0q39Wy1XmMAgcAKUBMDQMxR26O1cdXHHR0cr1JtEWCnd4J4DJ9YG47cmTet1GcaX08ObfkWtvN6IjFd/F3Cn9ts1AkrZcEfVoNPS9LQwzOqMX9XUjaqOAN9xV//EmJSYCn9dNZh4DJIAyfagnhbg+THLeXXSJuanDq84SMiPJxOf/juk0kC7PFHudvU4uYSMrb51Vqw8Hua3yaZFWSkWK5nvdG65sXzO37LVS7X0lQzUH93ptdUzKonLFqjqItv8tgL23qsjIxv6HvC42w2S0I5O2WkiTUOjRphawXVUCArdwYOmN/TtEOp5XD330Ya+0ZFjBJUPWFkkKuZe2klO62jucRwFwYdoyTyHsOyHotLqHFu3AOethpG1JcGJxVVZ9s5B7kf0OJxtG16O0HMfrbJ1F9bCtpOTJDYJecA3WVZQs9++1MDQAwL2dEbzKGp/kTqor8HauOcVJGoaGsHC76CFltF7dyVwaBHsQrZMkd0e8Vw9QJIiMB24i+E0KVUWEKoMd/EEJyCqT6p3HjQHysr1Ix/imfBOPnGiptmY7O4Lrz7E6jBTfNtfQWWRZ648Msw4EP1ArSvpsTWUCTP7Z0twOtbp8KxFB+pM3v9Cdv9Lr66LiWr7OuK97iomeoWU3eCp+jDiDlYgCz4Ooc1HtFgd/kNKo+pJ8k+y90VysgOy8OMQE1ff7cYC7WKVJJ9XK8JeapLJkqz7+/b1z5b2nhCIhTbgHUjTWCMxOAuNy4w1mJEV1gMUl9SLovSW2WCi1qmOd0euVRfKAyzwt5/+MDMJj6Cr7Kv02ufMtTELwdBRmSbIHqKcZzshj9BddppY5ut+MJxh9rkLuZvB1QmP+Fy9TYG4/KGGRjRDJmjimSCNVtTTvtOXfI6sruaAmXc56qN9wZw5jS+17UiGFFm8tKWaMermlcuatVcFhSjUdTJpZxZv1H05qH4hVjcb1judOkipCfN4x5fXE34I47K/p4oPdgVX3Niy+2qhyw37d48kGeLEa8qqZZq+iDFaXp1XJFPXK8S80ZosqS2rM63WByHsY23umWgW/Lo5lY6boSUGIFEqOyWBX5YP7gCoOIhGViiz1fiGm3P437dmzDgUZPWbnRefEJzYtGdtNUBAN1bWibXJISmR3sJeYKzWI22ME9yKpbu+h0exa4IhvQbjBnnDdeiophmz5NQoK8tx/tE63sKt0UTdiTUvgMtijbN3Ge2e6/DyifnUyGIrGe1iDxaf+OGOgZrtu9c2zn3rSK/Qm4dtJJyadGXWMS0exJsK7vy1vLsIR11pudyY8KiZ4Lkku7pROm4acHnr/nOGx6mJ6ULZ4HE4+aZ/SK9yLTuhLWP/Tr8q75qNpRJys0pdFWPE8vPo/UfWG1n5zu11Y3lVa9t1DNTKGL9EUaAaKY2fOjRenJ6tSzx851hFld6aLhRIeKNy5LqeqWrJ+M6axqHxhgX74y2bXf3JZVU2pf+jeKxia64XE+QeoF9sb58Y0+Kwr3V2prhvTA6UekEr1CRe0pVcd+oCJT7qW6FQoI9HPKqamakyGpXT4vaPPL1Vx+Tlju53sJWcmK4rPdynVPMyYnfdoHd4tr2f8grIYXmZI0fl5cGo53TGcyvHc6rkisrK8Q+WW/KrVdFZMYvNbh4spiwopzSc92MkoVXMU5nrOZORnULnjCXFWv1Iq1xS6LcV1671whlt6FlahCxd4UtIklvaRbcQw7/H5C9sO99mvesSCuifJIA2qMIhW2FChXLv69ZkB7da9QyMzFbPem/ZkogEgW7QSO+l9qUdS7BWFlWFJbbOD9LDKUeSjkKZJL5FN1xm/FnWtVTkru24xwr1Bktn3t/JtzuiNxvvIHevqUJo/in5a4XNzTSyjZf/6Vzzs3I8wnp1wat0q1Plb9f5PygYI60IIqQqR4SZDLYdugc8Sz++JwM8aevz+JxUP/qZmu9abQ1syxUVlNex/n9rpsawQ9LrZLUJQNJQtkrqixoe+vWUrHVVuSA3IkMIKokAqKbJbM5lvNUQgPFBtUkY5pDgyBHlzK5CWnxH1X4Q25nnB9ngUba+AqzvZWMpWEio3yMPu8CV+pVrhrqe6eYzpJNLVsMgPVsS3fTy41jAX8bH35Dm/e/pVx/WQ2+nmP/YRqt4tiMpyIF0OOatNutdm+VIr853MywRa3mrlNGheK28woHKLEGG17cJZeKpyyOGhS/U6P1023N1rJ0j+pzCOImz5+bL4fk7Z8yXDJ3aXcf+HFuHf2RgFMZvs65BgQhsiPsYZyO3IG/9QN5eHvPRdkkOo0O1uYYS4c8X4GvP4xFyAoj8a4hNcAsW1dSA4fNLnY3ObW4OSvg2pNHNIcQJe4V6UUlWTp5ygXJFzlqWunDktdJXpXcoW3ka+R35q7INKgpO+UP5U8UOgyF/IX/D2KNj1O6QhKP+wsItca290B5Vd0r7PWoswhvwBZ3Q2Ou90GwAHu2xW15zTe4c5HXnizvXm86nvzp94b3SnPUJ8QlxZ/vhuQa2+84X4mNOaJv7lP1Uwn921ylXm+NkwskZ7V3HXccdKknZHccdxhKcbr6kD8HlTfM6xTKx0rGBdXjkdoc+6w+nqhmLRqGsbuNEIeokAVOreDiQoDutisTPO8UoupMApX4bDapXb3W6XBjLHQdIdNoqR8SeDnbKOqrTW+O+TNdymN4toKupefxH0G0Ka4MtNksXvz2COQHYRD65R2v2vuIOm2FEGO5sOeA8at0bVZgUcq+dADcLjKzg9Gq0uSrtBk5spbvAFI+TFyk4wRFqkDKU0GLi6VPLwB4tYYqbc/Pv6DRkICwZpgFgBII4BgEbHmowX0ZDKrgSNqUUp4kqv1skX1wgcSc7GEMybETWSdL5Ez0j4hfxOt5WcC0oX5vpSGHMuSSkJD13vyMWbQZDKkHhMUqLGdVQuSWac+BkKqc61OElCX3ouuvRNKpBUjjuvMQFBoWZk/h6H8O4p8HHwD2BP0V1LHEtEReutdijgYLDzMO3pa71LCGWcI/iTtD+mTq+C9rFkDXZ7LlWgEk0qpSihj8+qypLMoPNFIvtSjhPc/zTHr+PsvVQIuWBmRPzYk7bJa4NvhYEcO4GeGPIzE6SJmEIeY17f02LbMaqBzMeI0yNbU7MlSbVPhjs9LM0dxLNENjVmd6owxeGlhh8M5Hg5JbafSutZdX/fYfo/qbhjfj6X4PIENcsvixBy0zo43W0W5manPkdz7JRSjXaJ3qZlQ+aQE7Unc9azImnRUTOQKMoUFZkbJOsXDhO6SYsnLApSV22ZKvmpE7z/s/eWRY4K7vKnupfuwZ3oATO++z/deKliuw41yP75CvzMQJk7ThzNoGSA/Wex6wbfeWjrwyf4tH0VXmL8mZjkMGZuCvK1PshKY3IprPeMZu3Fb5b57JO67D06td9M8euSUes23Vdjtt4ft5ehcqUmDQKnZmbcWTp5pgDuFsePpQse+yuMSPxXjOq70lE75vrPetxBySxJfKgyaXC8zpBKoHeQ2cKC1LJwcRADJVClIZI/Y6YQOQhHlRu/ZsV2ne2bOLNy63wFdhhCBSxXe7N88msssMR9AN6NRObC7XSGPEIe3rfFsXxMdIEUiaAj2yeXFfRn5T7Z4LwmACSRUnZkXQphx6iCIQ4kFKoVHAqA1lNm9qLm0ZmUr44VpdZwmJKaXIWNUbEjQlONGWsZ0glpzyQ2bylDYS8CG6KasxjKnaEnTzhp7wVIC/vq+PiVfbbamFvLmxHBYvlknZBs3ZQwAKy8gTYoIRaq2qqifvqObdJZEHg53bqxok8n48Lak/v6zO1r2oaD4k1z0to9GkDTXR8sgaoB2Vu3yo9LUEAQorzmAVR9fiV8B7XjS58pyI/qePDj3O57p3YXFre5fsbJdL+G2eS83QyXkyQIztLnjA+O7Ifw84hkJMS+VNTSdXH/AQhIa/VB0iHPqBT1RTOfLxCvs+1xbUeUU6vCCwkqxYsSu/LLAGtn3nzYY4+QaLwAvciVAfgU+iDTZ3P1g5Llr7+0e0HIsNJ7KuInCupOzul07zopVvv6eE1kK0qXuWeMSGJ3TsAbcktLT93Yl5lmaJDaehPFXvlKoKdA9lO+EMv+o3vLk1/43Mn+M4LH7UMtvTQZit2mlP4J+vMmIgMgQIKVOtrT/RIjEyWxFTacFKkj3MZhyMyBByUWd/WFECwMrzmgU73Nl5Umr8pdVvMFT40KG4j4xEqd5/CskpintLd/64kyKSV1kYP+lR4TTMEEywiJg303LR5ts9XbRvCAQLHwIHODOeq/mshb78gqoQJ5Rb6LAsSy5LSZb6qjaw2mUeMR1xyXVUyJbboOMxXSO+F5bAKQ/3ZHKLEUW/lqKOWKbOfwCrpW3piwzLlbqOu/LXNtKguQ0w/m9xn+p9s0zLbXPWUI6cuV5iq8llg6R0eV0eBwT5yOPSOphPuZTEbirrP+u5qrslC883j/fMN/9VVlZi/cTilYHsfbF9kPEPJaB1qrGiwu3zRdvtvHePQTDmmocDf+xdnigat8eSHhKhiyCW8JreyaMgg3njA1kygrSl7CxcoZm/2m3/sUJtIGZbrnsd+bBeWkx3x2DiiIC1z6rQzuyghzd/dQ2sZYquFw2VykQpBx0XSSNXz0Iptx3G12KDMrpB4ghm2wCs5JlaeHMtITGHEAsoOsvXn4GpLIyMwY5Vlo8VbYWJozUD2Lzna8+Tx3Ep5HDGeTUv8uzrkNWKcb06+S8JUkr9oHnfa59hRHpfGF38JurAp5Z2B3SgKvWmYx7YXJnA5kZyQmJzdHkajZPdJgMD2U/CferHV1KKl5wLWdXGbFxVn3t206VZE0Vr0JmD/V546Ou0qwv5e6yHdVsYA/3B9nYWZn/lhExmB55XrLD8Mt/DnOJDQEBYH5pmb/EuGnl+Vr7U3zGfiPwTQcpsRVy5V5VvW5BzFY+o+mOc5KVy+PK26/rFywS4tlQ8HXogNoEJ0UkDku82TxmadBDjxd/HRBQE8X0nI7oLArRgFYc7At8LGnxAYzKIE+LMowYERQ5tVggPcLymrXFLWDn773h+CP37bqArDv7dkWgzr7ata25VHxpCD3hgRkYD7cmfCD9nxt0pwX/0ifftJZc/1Z6asuq69zJIWNi0XBEfuO5vRy+IOSwvGPqkBJG7fHN7W7fgMyiv/skzBW4CRb90ioE6fPvSJjfG2r2Xr0FmRZhqCm0Mtm70CXFF6hPQlgexzZewdHWe0p4OsQJ+5Je2p8PP5ByAWSfPF/rZe2IStvM/8i9jzuSrN06yIlRzl7B5E54AGmDySrcP1iuUhqtgw6U8hDfR3IfWVhqnennv7f8EbwLxE61Oa4+zTci6g+n6n//5Ctnrj5iuFH0Ia6m1B6ir2K3m9rwv7HdkoawDDyBP49XfrX+0zZNwf3uIWVq67ef7U+TQv3LrC31mtgJloc5J2hHpK3gUw72HhFHA2Gzefmli93jaknq/FCZ7pecVuAc5vFaP/m31sp4ZrAfKDjm6ecjcKeXloEN1EpWJLpfRT609SNXClOB/spy5UrGFbDKuRWbtoS0hDSl1jQLkv5YlzAS0dYM+8uKKLRbaOYaRHa6ZZcpoByoeFSzzzRcPBCGWOm1fwVgOQUlCthfx0rEcrJO+N0LT3ILSK8eVSsJNioM3Nhx5Q4MdURVtq0oWPDd4O9Oi9EBgqsYW1TlW2plqa8nsBplY8ytX3jvS2DK0cUfHmyv7grdh3/CqTP5vTgzdO6pUMc/tPo4IUCWqTJIAwYNux+8GXLxwOkU6cSx2fXc+rkl0NaVo/Oxo6d4iB2f4fPILG9Ien9dP6N9KGw9KHlR+836a02agfblbud2znfUTFyUGEJfx5do+YBIgrhHckLMbIWGwbDz7dL2r9HTHDJw8kWacQRp2XD/Vc/IMoCP34yEHQg+pdeO/BafFaa5Cw4yQ1oOwFVdyIiD8DWqq1Tv4DOjXcWr+/AQJD5gUnWurcpMp9HxR3oafafkhF494BrVZOJ/NPOqlSxf0YqHxKJawSFNihGALM1EMuXuC5x9qO5WDL2mfNkCgzIbaPYQ2MWzDJmA4QwrsAI6CoY11qodsbKZiBYBIb79Jyc0ohpSpqtgUSE2P1CGZgFJS9b8sr5g2u7+0dGRkbO214qLy4eP+BILUcMjxzxhU11fqOQINIVMJ9ia9ejeBQgcg6FXV7/R6sUCe11+3Z+C+1uq0+PQ19CEpLb6ublRkNYQrlqepYTua6LeEEvku6AzsUeExAQB3BtomUYR2L8CwE4onIEaiqzHVdHc+6qZ1VLFn2O0ntYdjLr6wlFnnLwlwJiBzAI7kyIqBkucERiWFF3rU+UJV+rz9uxaB2XXdaxO/MWdesAs7vjrGw8IC3YSmI5t4znTN0MtDx4+8P961U/v3bt01O7/g2Pe2cP0PdudPekIEHZP99MfAZeSI59WdW4BUOysuaIVoxA7FxeibfV7qxd5WNLWajUpwIhEN8Sw/CPh0Owf6oJ99jdwBBP2A2JCzYfEPDa9md7eQw6S0+XPcjqMu9yPfC1e+f9DVLHO+wTGnSVG9t8cxcW9qpTkpYdY596pW1B9uhGJJ4/cbDW0A0q3WrCatnhvf38vuhAOJAwB2L/Cv6IoAFk1IuE0FTkFSbK64HOFMHgJmxM3IKUCxx3ZVWXoRmBboA3dNimfbanV1kfGuwChp4dFEL3MOkPaITOuIIBHFDL9G+30v6NuQ5QM4RzKa0/zjbg40pr+M2Bm3Va4/Pix+FEnp7iXb9tbXFQxIL6+1HE636H9Z228ygZPi8hQ1sQxGIyIfnYJdoFpaVcoCxpK78AC66U6ceRttt7tilPjLtkYi6lW78mVyPeQqWvNkzw2vYGpA0M2KRP++C7HPNTmqXhuTph/pUhYgSmeYl0mG/KbT59jKfELJ9HjcK/brqIEmUnewKfUE2bYUibyeCaUxJjB2eSQ81+bx54JfjPwCBhIeBfK/WVWUth9KizGhi6+c9z6oGE9uxX9ICKieAe52IEGidHjNyvOrQB7N5IjqWVUA+53HC23xK2f8h7Pm1gJX2146675jtp7Q3MhBazp28zQldgnAfGyV9BY4ZgCxyCeRUD4OW5cSBZbN12jEndA6EzJZY+23k2alYJDpEbD6AT8Xy6uoFHvP+7YVLWB1bkju29OGENEXLaCHIQkGty99qF68TWsk8fDpmsRuhogOsXgOLT5vvaDWtgAFhlSD18PyAhK/5S7KTqb3lhHUbkIWdpC9iA3qsdJqAd36bOGkk+ahvb6PvdLJeBDNRP3LV7UzListmrPdvy80ISQ9uz/VI2BWZzR1p2XFVZ2fqjeUp04emFGke9S0aYav9dWnMyzQsYXueIG6+WSSwuJv5SO1rShlj1M5KCAE4QIl0MUGSeY/q+6U4o1JRziko5w3BcXL+PLXC6asnVMT/lDJRVUW+81SIqIcUvxeiDNSrCp7p0ipEPCEElBLipZhg8pSrBbldkjBe36IrPcer9apJfAlevhJP/WF4o7snl+OJRNBUUxJSPD2eTysSXy7Fy+OoirEHowi4u2T1lyfy5Ql0bPw5ibqnZTWm5CzGmRJPdicHegV6uHvEU8Jd8heqpnjjC70IqttqCkRdgR3DoktxbyIKqY+nTX6rEBOK/jf38LsqADXXrwjl/O0WU4VwuUWNy/FCPldWLUoo8vS4WVdafl3PXtUFzG8fUOU2ewqeW6XE6T08b3oRUQ8lHq/BCGeEZngLGfcQjwc+kgXyAN/KpMMFxpTal4vyiT76ohn5gh3hIcH+iEMFsC/hORegmYZree55mXKtTCs+O6OaypKxmK+1W+Mv8LH4CQXPZvdu65AD2j7RTzwLgzHoIxRyycp5F+p3hQAZNzAiAaKQE9hhwRpZTYC4MH9JYr44SF4tcuRprQ1hDAWb3rRCjOKQADeRTjmzIbX4Z0kgMuuDBGlPQh+5rAu6KnvIqiG9JrpG3BBzqMFToZ/v4ehtdNMqVsbqkWNofLWSyqKMJhBFPaOtRQSWK4LTQkqgJlEiL3HCZJHlIos4WW7Z/aO2hIAknjoQ7+8ZpIpXBrt8DqY4nYuaYcElCeNGjoLlqOvW7n69XNfa2Opc4yDKBLAFgQc9D/bpoXfAjhbluJnkIqrkaao04Mh9QpWpVzOZ36zu4+5bbzRZZrnMIosd/tLSMzEDRH9v2pS9wHLBXUODqoRwz7xBeWywomvJN1MgTK7NasGqDfVA2T79+XP6Jf/x6jDbKXURtUG6IN05/YgtXnsaI3j4L6HepkxbFmDiMC+tliiJ3D/CqFnNKYbYm2EKjHdJe+KtZM1kQwgxr5W22d347dqQ2kfwjGSFEmqJvDyW44DxGvKkUq/rMPAqZVlDsU5zSSh+LuS4EUQ8gZ9vdQ93z6ov259FUJtxAtz3e4IL22PbiVgkNgLj4usfE9Bp3eCLRQYA8+z3mII8qC22jYC1b+VtcO9W8xcFdFjX+2LRS73Nu/kOkaUXL9Vtamj16KhvqecyLDtXnsyBzHi/SZZnxq3YjDkwc9n0UfCmThNP8gz3IKFIHlAEsjHomP4nvAFnS6QsLcjezCL4ejLx89eY2m2ltIRxEgpaiShFepJRTmWWc0SkEhEcq6M91YY77AcsY6tQmF8iYnB5sR4HSQxrPMaJdJIsX4LwQqWmjuot93GSmJcgoOzckC6YX7YVBtPW/69oiyJ72Bj5Z/JH2xFqrt3nFOF5EAbhwhWthzshWIw7isYbg/wWQwpIqJIqZ/ZyLZD+OzJJO7KB8GTj+lSS11jqxCUSXN1mF1Ss9weVm8eaUnOg3235EMct7i8sjh3LwjtVsL1Vstvf+bEQxHYte4Wnkz2Vbk8JOYIAnfJrgB8RVa7rlZCdqu7ikxIeBO6LEuH/KPpuF2R6tklp/hMM/sNQX+2tDaZrrZBhihW3NmQ+Kjuf7wIJ2rvre5VW2uDV/nHQzVOCB/0b6ocCW5hC7k/vbF15V57pTVJawSQuqd0lmJKb+K+ncWoitsyZsd0u7905Ku23q6cHFKudSCruOpxIqMlmY6FFcN/mUrWWb6W+uVEjImjV4nRMwslcl1aXCbCowU9m9dri2s/AlH0FPVFdr5pMvaXxvkivl3ybPGznmCWKy0PTNgdo/yVgdDSoNXvbKc9EvBck70Odgr1XMk2FsuqgRpeYy0SFq5dwjpeY/lZJNGVAlCC0DImsRyL5wZ3GwgVTs119s6fbhfONgviWTchi5EbcKb1LdN24z3+VGpqymU1xOSVxG2Mrj4+iObqxusBzZvgK0baynPmmYhiSIRPzdIpPZa0NyV43dXzPUK3c44H6kF5nLWoS0YooQpQJcQ0FAjf/fsbUxhA/Vlx4XaJvRoZvZyaedzVPp9Zv6ywzlduqbExU/Z/Ww7XcGYZObgX5VWB6p1xU5OzD5GQaka1T9OnpXPqva8be+ytdKFBYnNHxmPR4JTKKul/K5Z6Y5zJnQP5FwJ+XyWeGpEhqu8t06U3t+w6JTRHqNvZGTr4N22NeusoF8NmyvO2t8mOR1eusfy1K4ETUX8cFLivxoUxRbIFPkQMIwmTlAGB1k7unH7w7qeHWplX9Yu1omCvoEX1PkF3m5rPx7sHwEw7aicO1IcwZf2JomAnF/OIf0wYSjsd5Mi/2JH0tNAO+rZAtAoH3Eqii2xx9luAZfJB+XMfPL23p2ojPscAEIF6EJDIDns2U4jUj3Oe+wFwPgVBcgmtYs7QOjL90eE2sKcaVFE9sBsApXvhWOWYr+xR0c41qvBHayMuXIyPz867CgXj16tU/Z+FCG+X/mFB8wUN2Dd62sRNx0z8vuSbttdX7yuiS7Ah5dLtnIrlnJ10Rq09JafBX6XZkFewWjS+/H5r2zW7fELDy8SnQ+TCk++tQI1gyP/lCx4azEakpizUL45NzYvJie3SqY4Z6Y843+1XrFEEZH/3UkjEpIaLYKL2Nk5FT+c7xLIQXNJDyH+RI+EOOJG5wPyTBPYLHAmlbnu5+xdeJq50PtaPBWViWhQPEQSOTXzCCFpKoipZqhSUdFyNKyfM4X6W8mWYu5+/EyOEtzopexi7g1icKjGR1wf7s4oPQeAgsPXL/7pyyI5FlsZO2pYHyKkFazcrdhcUTW1Mqawyh9bXE7LSA9OhITr0EF1SysiX5RZ2EHZUW+XaMQYLmyGOKUt9ZlDaA4gBk68y7q1ncsgGlABsUhw4C/PTK74Efio1HJgf/GWMDiDzj9G+el5Am4mzzd3WMvT9MSFqUs5RunI2rTSlEL/NVnHHWsju/G/a8O+oPBQ2P7I+M7gy8xvZnHo23sxGbuN0pAcrR3aKqn6WM/7m3eQ53fF5+ZN9sA68WJsm+QOPjwVMKCP1s1ocHFxwGxs6NcrhTHu9aHrYuYn6I6wrFEH6OlGV5+XllveK/xWb6H2n9tokIUwff1cDUkURUupUXnpWVTRXiGMkAgU8l5SwlEWQsf+5M9D3OQv2pLYOCMeo7LIKPe+p9F4Qs0pzcPa2/c4/eboyJPce6T0k79iR/qu7ScPLtwidpJmuMH9w3rtn6vUcu7vaxEub9jboP3fbNdPQAFDDqG3IFtegNJx2t/GJcOYOqcn+R2+4NbGdqT9zaLXIM3P6SbPEDYxLF7IvDN2ljbSvTIRWrRJdd1fSJzmExPdGkNXGBi2wGf44PrQ5s79sG1aOjJRGVkbQa0pH9asQJR/dkVArCD3YCL6P0+Qn1iCP27I8fqb1O3r7VXsEMeJOc7EKuOsbB3FcYqdq8yY8ImBukRdF2UjRxzwNVPXpqVWRBUksW1l3kldDUFO+5aGwh1VeZn9h1Qujrog1tDyhjD9rnJwpIAmWOqHTt3BVve1KWfSRvRRRi+7E/mcPZFYHLrO6jQaEPeRWzZtv+mrFDL86fnHvd1rN1N3rkko8djxqT0FhHtnahstX+2tstVz6/ua1ffplrz6OUyPGPiJSU7r+qdu5yyJtpgiYhryopgbMIHXJJ9ezSYkDl7KqWJU010J1zkyFOm73rPdUzaMQlYIEdVTMGso6P9XlWfAyOjeRwiA8I02ssNq7W1a2KXSt7E/b0xkXOl1zAE9Re2dMEytYDeW7blC4qHVF6lU1Ps/PVv//pEETvEe7dJ+xUlf9TXKIwmFdVJzX7lL46mSPhaM6FQRUlykVat8qcNWK10pyrFDZNLvtecefV7dO22ljX2yiSpgIxhafYXWyH7tQoNBccoqdB1OaY4o3Sou3bi8DCAhOtVlhrdile25rcbjbjq2WlCFGifu6AcWDrYTRFpJuVrdTbbBHZWnshnrPO3mWn2bkQCAzCUruWZm2lhHfFoRd8tfjaTvZ3AGRheyVR9Aljn3nY0WeR/VKznqCcxUE5eu+gWLUHQk6efDX52ZGzEYdPnPs0OV937JzOOaW1kKCvuxAcLgeZ6OWi/2btb/qxKPsbRN/mmVwTAxxFUGydnH6LULyEy6JBqyel98ePbZ2ypMMgEHzF1inMXcuNg9oxj988fGApe9nt+Hk/y0o7fMaT5RU97djIBH9KN7axTeXl/U1Bvr3vfndl+4KkjUj4rWJezb4r5s402PeW9VQbs+KJMRrnurLRs+onWk5XUqhmEMMdWqZ4qZINUrfNHq99HpMIzPfUzR6rRdfaonVewPetfdsNmaywF/891rwz5LFDQexsQ1zjoydFDs6pKdcui2IuLfrH90dC/LTunNiE8u5IQXxaRYd5jMut03nxSOfcOv8M+ySNhhMniliF9nYfyTMmu3nzAlZRSi+5uf+aSV7p08XbCeonNFrv/1lbGX0+/MSTbhafnNjrxNGt5hnFo3boq/5Ub+R3KPJreMeC1SDP8tS/rV5nV3rbvLhyxjFrDX1QY/AuZvrFnen2EvtMQOS3XoMt3dA38HBqhG+psbuccs2k8PpE4ra0C3BwS3TygcIDchT6j1V9yiRnbUp0kEFQg7TDdq3dywwcaBMq2bLlzZst97X9WtB2JsVkSKtqfDS3UMYOOaDz+7HeP11df3oFdxsY2+4CIBEAgAgad/j/o0yb4Q8HmMDaes0gesCF6R64oNCpIdX4LgUrJyx6nGI4++4Ig6cPKt+uJIve6obOas6GLIK1N+piQ+aFARXj65Jvni/a913BRaxoKx66ErcjUE6qGcg6DR/SxzyfROJTEF9TNBA7Ds7WTEcfrK6Z3e+z7FZf/SFHs6k4l4jKnCWw9wIdrWdxXbB3WLncwhsYElx6C12IQpdXsPsMh86713r97FRT+Xag9GzTyvDwyhCFhla4KyP6iuGhnKq1p6UGtwLmFfofDPJMIPSUvhW+V/+n/rrPmz3ddTUO0mYehl3qWTrdNXRncThoxKIpo6qhqCup2zweNWSstFCvOjnbP3R1biThrntgHOf7HlmsEKu0PyHFJl3cs5LfcKNhgYa7UrIcPNTSsaVua33LRHB6YXdZgdYk1noV+jqh35OJSBl67ObVERuD769kWZwQR2qxYe9yzT7x7/dxzbhFQMrYR+OsNI3eE5u/2ivugPzU2+2TArfzNXyo2SLDRUCfn+Lgz+I4H/14j3k+18FYA3FJp6YzJeU0Jo2VxVVl0aN4jN6cKx/WG1ZbCle4Dj/SJP5VjKSLmTepiuxInZXskDKx3JjubQqHJhrnrnt9tDMD8X2dvfeM1/WiHZZgUgdVBc7VPX1paSr2oyJROrPrLCAhOKnzoDaL3KRQpSfgVJRzpOvWcnZ3pqyDTRIAREtPeO/byWluTYInXFenrQltRpOI2WaKUIKqT8QcVqYNCbvmXISz08pgvg6V45ETJX7ySsL5SnZDbaI4j2sddjm9BUWKt2fdZnaeR9mhzncy77Ew8STbLadc5rTGSZhNRDecTxbbutLjrXJV+gzKFDpR2oObMTw70gktq5jrOhjheuuv+l4l8XGQvEK+WkuKUUTr6MZ7BdKXlnjHb2UltCpwDNcOFjd8tS10PF7deNij0GJU/u0qbgyV5X3O25lv0MrLntco890B77Syg6cE19pctp+nXijvHlpuxNEzoGaC8bFapCwyy+2HOoOnr6oiuhfQbrtAe/O21Tgspi2iXriddxJRs7eDUh7rk+Dt0EV+p3/q6wsFwCc+0RVAXlW2Pv+S3Vc1C4DAJTMjWIk19AYi37bnuLXobXd/DK636CMs6H8ssUP1OOmWhZ1Xjs9PPcS74oYY3Ej3Gzfr4z3OtsXMGjor0Q3hk54oTuWsPM3CbiJdO9ms4UQKCgorh019BLVZYNbnKkwQl+d2bCAAi3HBqoeeWmaj/LZ1Jq3KLX+Yo0E4s02y+9TugMAQHLfm6tbKNnUKdBMQMml75jXwleL+BMZrEL4c9/kNCcF2QL6+5dlKZx12OzFwaLcCBFACddoyW+twjAe/Q5GVVW2jlwqpXkiFv26qfDrMfeXq9EoIdKAeON3hMkWepLCebD3rVS2706196NXbEJMwFRPkxHOpCS4+Uf0WoKYaz3inoFSu5hkWYTck7m0S+n0ciTthw7//bWsuxDTTHtznN6rxtgO4S3Tdi5RC+3v8EN7PH/OeuVo9o5F/+yv4SaEX+qbh5Jf3d/T96ZNvTqkur5BS8SJrrk81aLK8FWG5vUOVS5AwG0+viv0fUKskhC+7e3HLdVvBEtbAX2brXyIukHfkeSTsOCkib1iIOzPANFon5PKTokcmnqz0b9nsNRug8mfIrAlb5O2RgnCueKMkflZsWXnSP0E6p08wTy4/SXbCewWx134MbJZ6XSXyvuB4gfnVpK4xn0cy9bINza8e9zRgCzF3+aGzuQ9e+A6xIkL2ftnOPNeOa9Vo+jql+78m9TlEg8mXH/zZQAnxuoFJuMjiNDzsbJxDIu1gv8g25/ylwd43FtCLley9gHvvlYXtpz1WnyuvlQ1gl+FUA/h/D1UQMOuUjqCxcypPyo8bEu28sHRqjeHUeegyls+gisJ8KgUoVHfYbKlktsVi4m5RL8jLN1pbm2l9D5pow61tXombV6NMtm2nP+QBLC9va2sCWMVGdAa7FQKHthO7sSudLc/ke1aaqrpYN4xORmQM9xT9F84zOcTIkYVWvdF7B1yPFKhvzBSsbx/9yv2XNyoPHzrEXssuZp3iPWf2o60KOzp1UFuwdZ0rz1rq5QdQBMnuz7jldX4oe5y5tLfLzcr9nghSpPzuypHQsyWkP85M2OEnbaNPI43IABs4tHgKgPQPJBpOPsB8kt+WXh65qh95fnIH2xaJj9eu25l81ix5La5u+79REemg35ZC007PIm4P9/wGjSU7VHPTA5URQtatZuwgPTPoRVhYmTekVxcN+cZzFAnslP8SmGkqKCorIkFDLsLV2qUY7bgrnTqPgp/TV1JebZFTUU3DwJ8YeiuDDC6lIO5zU9rmECHaRl3++2JaeEy3fU7I4k6PCoEBJOvQcGd2nYdFngzpbUF+RK+MglBoI+OiLuQwa7PDD8jjsqfEb+K3bo1/8z/vzdatbP8PjYkvFU94v/kkXZMM10yiYBouXCimUACCKzpyanvUeH1jT/ru6/0jViCiBvsdzKUpnToMz+5moJ6oKMO98lEe6vAgHPTHgN4qqcpbw9W1n5Ks4X7ELWBo+MAxKTq/iMMFhtKZnBi3wm4PQC3Izt2B2ic+YxMosp/x788+LKapsZFVMI4uUZ/ur3/u2y+MpHNVKrZrot6RUjEmJjt7nD08pB4JUQGlFrWQZMOFUhUYJaSVHaWxUq8JwKS9xeKnRkAiEonO+HqGhkVHMeNN6308KjpR3xU1CYPVeleawaML1Z+okPhEFosO10tqfh/cB1++8P8fDB7zz/8MgcJbI6nXx8zhELxaBrfu2i/AhBA5WE1Gnajbh3sS4MHcN/L+HgLImZCxnNqp5PTP4hu3K4oFaIazw8P/c0RmISEv18XaecbZC3vcuPTQPfXuZzA8iRXM7ynlOKA0sAdU7E3Kpnpqt15LIhnDfwPiJEyfK8rcj78hXqWGXCqS/GQlXMH/JR6gik65GMxzu+TGJITNy/haG5aUOsu8GASNhiaFLBPAdAwnVdx9lH60I87O4gq9XBHosumA9MmduIwvIS3sbVnCVvNCLUVpOMm3OazQyTI8x8hTfk4JS9upxHDTJ4fDgqCHB4AqkRXWnNZ3Y1dG3/Zjpx6onks/wlpBShDZxrqlcDfUt7zzYiDRaYf49stLTNJgXcfrZ8mOcCRsKYdx/Au5osGx0o1WsUIfpkOPKmPvgPxLr2lyen8hkTPo2oe2HLazfDDj30azig1g9Adam0IEmVFenvZ6fSIh1alNj674ciILv1veGVKyjBrvkcBNP+3H8A+GuCATvR83luwL4QmHZExkHEgrWNPp91Rwnbu29ZcfO52M37tXtc/P2zOPhms+avqnV12gW/cFAfrRgpdRVH74Bzc5tUWdPJtyBZWjo2pPAj7CM69T0aeKQjCPbiv5D1xxxFxYaB3AO2VkkYfgSeZ49uU25T7xpyChoVhDp/2gVh1yAZNwTqZGrxOVS+98OTlRUOeY9hpiYS39fgokFQKRRxZuWJCAPzphLnABZi4fHgILIcKuQ+FmiACE34RaDyT53O+A+r4XCurh1t2eXNiJara0q41ydtJimzH65MBGNAsKJUIgEAgfuUINayK9crIsHSSn9CTsyf1ciTdLla013nP3825fxAy+0Sv19bGjFXa1vacgivJQJJLPqTPML6GlGHi+HT5KgoZhdy/L8lTOabtY6oZGkU6thylAH9fMHh7UhUH8oQL1pEskcj76R9duYwlR7lJdDaG/XWVcFUMgEHcQXurKus0A8JGer1c23qp9TEJ8+ejSsZmoszYx851SDA200XBuPZKHDB0MYhCUHT5Aawaz/hZEtlLX18aMQgzAPGTrFkTMT0ud595nekrrMoVtbwW/3XpNbgVF531FS0fAV5Tkt5RIoUODCWmnovMzs7UFPAVJPu1NGVH7gZuCboVo4O6pHjXrMK0WcWI5agtDX8B+UOpv1vXwYa2ZyoDAMfCUPmLXqYqR09xp1naG/5s2Mxl1XwicyTtmah4DuC8xJ3mwGTm3RDibYdEgBa26bisWLlrA8hhmcf+5PsFaDszD81SQmhbOn86sBPVzNqfq6csaDdfuH+2gd6NWDB+sQCn4weoIgfbgdxcxqBH+u7Ng0mjvCQOmfFp3spCLqob3VbP/afO3Dx5hrn97+F3nsv4iqpcQNQuIWPcgr033oURYZmx8Ns9ipskzz9JaHz1joWT4x4YvwOJiV0/80MXi2mcWxEwgFQsM2MOBXrAMftCHb5Q7THif1DBlt18IylqakiyZkLtDw7XdtyX3IpjECIe5ESgbe8EWmsw+1O05gjYHP8LBgwSlA5i8Bfz774XpQ4eOYAYZGS+HoMZ9vUfXKBABBj8EpAARlAyaWmm0Fwm5Nv1t/fK5CXZ7TK/HM+xaq1tho5B4t8rZ+iewOTYSIae0MbYysRcn6XC9wMjNpeZbpMuUxh4pzSmxTEDGmVZ+K3KYnq4yn9XKkQdra4O1OfIDWu3mCTBOR7uFhssygzVy2WFRShYLDsMjzv1/K44WWsEsqk+o6c9o7U8N6Dr6GtZYFQc9YKdPv+YwiMEMjhTfixwcjLxXPPJOHcw7wMp7W7O+Hpz8HNNlMMVet0fnyM7drMAteww6viYc3Jb1VqEWGU8ePXRdhvO8tcfR9jTGj0tGfTFRrFcBUMp54hNAT6V+a/fxplvvK4G5Y58RDATAFESZxsr3t95A+Y1rLL8VVULUI8WxJtZyQ4y4ZdYs5C9hdFsQWE9k69Saey3+QPJhC6QUGWlgIFHuvC+wDaIGqUKCWO4YSfVIVYgsfaPIpF20C095qiyuqt7t9LkbdEdkCBS3ip8uQOeH676EjKwA9n3v24D57hrHDzlTrVUSr1cAgSFPyhqi0pWk6WBowLo/my+YPZ+k8wog8G/H+SL3mRoGjzo4gvhBNgJWS8YjppFYrh+2iKCJSXH0cY9LhY7t3Hks0biDOl5QQXUQft/d8luwAbk1oIDfPItgZJGZbDJ12Nod/3YNNp01YtL9C5nHra2wgUvT93br/O3RFo9vC4iAiq7LDZ1vE6OZCknRkKU4EIroEDCK6MhNjPz57Ql/U3/J2BcSTh/2/AWW1CZR/SXCwtn4trZ4Wx4iuqU6hnbLRQhiDkrak/UwkJRLIpBg5Ed/Xrqk4CHx3L71FDMjR7LMx/2LV1SgYvhBw70nmvL47zQUSc7DSW++oTX1S0CzZCnGu6JIOWVXGplgnKNwklvL8Sc67fFxzlx93gGOxzQ97rBARDd/4FrA8xOZd7YWWTXl5p7e6RswFDaT/77TmM3q0JKBILQqKQOz6OyA83q3RxbqUzwBLkY5IufgQ2HOIXqErqOKW75+xVA+mpLdtGMDkdhaQv+PYsw0bB4QwpLZn+Pdc5+d65vUs9y7WYkWp4FqKEqVtNWcG7I6iHFabyU5IiCMFZ/J4oVdYyw6t1pyFfSgUEE80wVAcBHEL44i+5zG1A2fj2fLXb9bdRGzb8VXnCi+Qce4M2FJg0wcL7EIjyleasGLXxPZ7nMTk8c7kV8TIv6ArdUUS5VZtQkJbRHEhJoiuG9q6c09MUj2nmbGzqQ7RiDP2Q1VXFY+s/Afe8DFOVljNkqcP3jezIBX8zBNLaulN9IaH9iZnqLuSHJWqDIKt5EUHUnqtO48++AI6+LmKLfc5rkVBu0PnA01dXl3akJ0hcv/5RyKBkGRsK/Wj28XD4b1XGUbM1nhjvq1TFzuyrprbCNz/3PQy3+UDsuvzBsURxMO6GL/L2vm0MRCWjCW8nIVzkS5aIVE2BpxOeH+V+vzn9J6s0MdjB04IECsyRMA00MX6gU0kYS24pzxFYouN6PCVZt7X6dc0RCAj199IyF8epQoMTK4T4ePna8EurFk2UD6Qz/5eDfuC04uP3mTanZHQ/T9AuXSjIq5IgX7ypoUWbxsQ6pgvYbIMusnJRLG9+yAYltp3Ks2h4npaExGkgqtGUhPXb3+hIbe56MNjU0VneHuItvcVe3SMZ9Q4NUKD1sQ8h65jTmvsqTIEwb7/ZbSwlisnQ0UuXxV7q+16sNC2PG5HInpIFN+enwuwjT80+9UUL6Dey71pWI5jnDeecwtvn4AXnqsswr6XPrWQBVKqMpYYG7uYhBEV3BrDjlfYywaOrEy41lhARGIykbOvNKm160UYtQxuvr2RExj9mH1dSLSnVTpVAyTNytvdv0EeqAf04DGoww8jm7Lc2lEdx7ZoS+zxaMHw/qbsfDVEzNtVy7JezIrB9inrO7LdJIXYvCAlcVKnYIElmPXCwQi6r3LBTkLxc7D5MqTGZui8wu50zjjbMmtQLWc0aTMpCWuPmnw6xb6jgWnTxfg9AECx8CB3tnfFPZ+l9l9JLno+mZ9Zabz512m1LcOu+85k6Q5eTKpNldM4rr/+Ld15VMLTXb6icbacaHSOXTZKWlH14nj6DCmzu+HNvjypadHCS0wSeUAI8gXGXXgyRMxl419xa1bY7QCwZN6qZShNhJXxYEhLXBpPxZLoaSknDj+J2C4UENycrvx7BnTE8fPcFz8jZtCO/lrFskDaf6FfjjU369JiId7J9FEBYnxg9HyyqrxnErgEyJhbUAhr0KVtlPSgrGx/CCPPx8fe77jHQHmxYIaa33upE1xuleFxc5X3iwvv/UboFIrT9jsQ/1bEsb8kVl3M3xjf/jNwvzkaz19C1G+/7bbYztZqTTA5eIZ+/bOzBWHB/tlZDZuqn+R7ZP72q9sY2Dj1yy9yanfpEAVBw83aU2PkT2Zy+JHc56tNGcD6ueFJdZyR44Gpt1w9EjqqkMcAwg1cL4js4JTL9qdKpGm5AnPk10FNvIPgx8cfRf8TuB4/py87buhy/e9vI2Ly0VyrlA/U3LK7mK3/Y9P1hx7FlGArXCJydhoKky1/tQWD2LO/e+OzPxZDFPrbssNL/tCWvw7C33WbX45Ybk0spkdrKItwmisW4cLstf06c2OH8+tlkokxTGzBZgATscmzXwnu2PH5KylL8q66ef8JuGnpbMspxq5L545NOydCuKzZ4eRKRleRAYUgg4Ixy+tFVAiuNyIRWTTvQsfJh0IUyOW1QJwS6DI74BEHpjbAUT8pAr7yJoL/PDqGk2IOULWxTRH4R7zZUDxZo5+3rs7A2F+t1dPawrXQ0wB6PGOIFSG55V8oDuW3XboKeKQs2FIFpK3DJbAufB6rj1seU76FKJTXvrrBt94R4fprzAYqgVm38Z4IWW4A8a4Lpo5labA4lwoCgf/KG5vQWlP+UB1dDopk1PYUNZVNr8mKr3f9kLydvXd7XAMRn6zW8XDwRq6o0AOiwiH4RxdHNzP7UqBFRiYYTDIyGRUpXjNilqt0KELjZjkcRwwLo5XMnbhzffCMWhkjS1DWvGkv1bVQUC1R4TDsXxnO+7lPRlF1hg0yidLPPxArbp8CIuYNF6AcQl85Vzlf/uGVhUf4u0bnzFwoA8lW8YjU9Tv4CPsRumL+uL3z9gjsqgtpkOkSfHazO3Mpb4rXBYpLO1XeXnyOiPs33Pt91GlvKiY5VBePPHy30X+L+tQmJ6slE55h4S684j/356SPymB6GXA/VP9kn9iOglqHnelbmGmjdLuXLhUx/ddbj4ssuZKeqO7jUYgIuepvKLGuTAtvMnhaIsAh5b6y3HztLMoQj/W6eZaCHspsrHLNnuzb6uNm92U7pjaMldDwQbddMuLgt1ngjXzVDi+w/aOsL4sK0/NZTAbSFXg3LoHt3ZSckHWRI8Nmac2kYYS28WZqf8hFugCBIZEKW46qZ9uYwmlYYvqtT0ytt2r7+odd3M59E/dWdhWQF6N41hJ+wN7K4sS6vsL1SOW52Kfrp6J7beqV/UWG6B5FSsCQCUNsaowLrl7uid+e2SEetJy7dMvEd3bjmzzf56/5Z1Mjf4YKmLb2WTSXwe9v6ASnA5FY71m/9fu4RVhkyLDc9i14i0J+512BRTnJJUOOTWGXdwmLKfMi99QF6zLTK5Z4d8kOPDAoD720g/RPfjCW8fWd9w8BioJQxh+ziQCXJilnlnJWTf/m1ckWeGTf7GsXpCcceJGJUWF1tnXQdMUVxOyUakUN8p71fDordFFSDKHQwbmKUPaG451zZS85/oSLnc5QcVZFMiTkkuasRLW/4GcuGPq65nryeflZArRScyjlzzlGwzxjtfjHXeClBpUUE7lkP0Id2Kyj7vUobyisiJ+SKfQNsg2yl8CEN4wd25ES0FBTo6R3mU5uL7O0hip02lGVmcEtD/8+KwPwiPA0d58n8/n2uDWvF4OMqV8iMWae+iEQSbwWBCEfLTjrFtRaFmIXqGQy29HfL6d4SNXKoOKZmVgLcbeo6xcBgcWAIU2xmn1hcu6ry50dS9e7bLRHnn8+eC1a0GolPXtyQUCHp+vL+HLmYLUNZnsbtFu1556110x59raWlvPnW9tFVY5NQ/LhQhf4TbjnAllXuVewc8hTeXqGxkGzU2x/elIoQjRh1Z4XW0k79rVj5FLSk3PDzRGLauXGG9R60Mbnaq22jLRx+2zBrozcS+DVJ9dvSnxHRY8Ni5qeG+/L3xDQV6mW2NC6jKp43xBCbl7b3/QMa2VS3vxBjJBFWBPrfEMG0Y4u8I7p9UnIL6LORIEEsaAQGJSw13ulKPKt9FxLFbabxefPCrwkvr4bL0RXpTcq7UYUWNUpIpfFJEUNT8ks1XYEDBfOdeKIGbJ0SkW/AMchhJDwsUF16WVtCmnjAvz15nohFCmWyJxLDaZF8YKFrqo3TxzHlqNbU52Lg2DsoEuJ6Drug0f1JyWEbnf1fx9OYm1UMyCvCQN/LnIaD/69+rLgxsyPffzgisLLsUjRz13T5OZHEc+hCPMYcgA5uqbAGNkJKBcHsfZgIfunfi17927+orhZ+O1ebRaumeL63aMYp+899S3YXoCOBape8ibfQ5CaNJBt3ttRAP+hq6FhS6DHPQnKku4208baWs7op1EIJYjmROBgJ0cri8AaJCGkLo7k0Aa/+DCsQ0h9Nsr/9qrDswtshZjnGtuLvrL73YZliQ/OovviaaB79yX38XA/mLHe98TzWF6A8BLwMPq3qNkmUdreVbWtrzBhada+a/NpTq3zCdajhVzZ5suArsBT1wXLyvfafsuhKU1aso+KKGOCz2C/z7yCMt2Hgrb9Hc9N1yDNL4f2eDfiHnx+n4p2MlxGU5LAQIXAnOpc37yOX88otgLaw2c4Ld7ZAGGpt/Wb/nDnjuftcda6I2EsATmQcRSiTSndnLDrU3NgZbRsvkSyoCel4sm8l8+tXA8YVwmEN1SFvNfcZ+/zW8NQFgiUF1UVd4web/ovnYZ4Ha0C3fW6v2ldMpd5VXVlxbtad8LhzwVQ9Pi8WmueD1jMXY3OYooZvkK7E3qa/PahDqTJ9qqCrtJ6ooMlQb3YHx5zgg5RO28pvE1km6O8FUOOrpDKy8+OVXHRigjZUmUfJVLIbra4dCSk2wwqKQzNrHZbsdMR5dlKjZOZQ0vy4wa7dSO18WqamrVmuN3+rSt82X1xTdyfNGCkOCElOTWlJTW5OQEmajorp7s3Q2DQeqaWs1TqkNyCtaUQuNJm7JudIfa1n61Lc0jWuNWu3+72sh2+tYdG0yyrEIBG3L5pyI5xZc1ntjDOeAegDhWBr7quHisB2jqX2ReyzqTfHhtVwEon7d+q98N+k3qeYErpSkjEiXKgrWZH3X9qoWdgn7er74W+4fRiYsqt/Skt8VLE6OUWI6Dr+88+M/RZ6v7NwB8YBCAzdrWehKwxkgwlRy0z2lrWZg9MscWFuTh7/vlbg1f+9d1/1i//kdXVtK5jo6zgVldL0s8Su5UZG4Wnbi4WbPt5vVKTTZA4Ody3Y2cG/NO+2Jqvu/TRB04tXwgzcIn5CteDrdqjYt0fYzzB/vOgbRiRkFHxIqQpL3Mg/npoi+vnWOWRKc7J2a0e3OIKXmxwBgn+gn5SzE3tPqTReXTbfromLfSlNN/G2vhPCP6BOv9r+HqqI9T1PhJuMBWkDrgCcdl8PgbOB5amSh0IGm790A+BvY4W4TmwOs0WEzv/fD7h3uiwEou/hfKFC4KNXxFvM9eXXPSnWOdQxF+6eEbB9gSTED+IT3hSaUUF3V/euptDprKkF6920lVOpQQgOmYZP+Nw92MEmEOP2EyaAIvkLDEae55xTvY124GUbqJ+OdvINjvkJMoi/6B+dEbJgufPVg7Ldk/j3ZrQ8op/J+dCxtmbTnZ3NKfRfOV7GZeHRqi8IUtTdeWSsvnPe40byxxl8uSoWlegVhcbFjes9zbk4aRl5cPey06f66dsuXD++3951Z7FOIP2j8/9SbcDvMqX2n48K+SXaLFokC3kMHjVH4R3DkZe8zsHVW0cK38Tf3ZWB3XkKEFavrEyVPpm6lXOjrv0UBWFJNW2b6vqj0tvb19X2X7m+N5DgN7isSOnV6/Zx7UaWbnaOhqonIPltSuDJ3y1zAoicd3FDkws46ke+ZU1ixPVOE8fg2KisgMERKOPs+3WBhWWBXQF50YsDi8s150zqqs8byZxC+tmKSnhnkKt0YeJsCRJFpMxO0DpOTIjyFECOLmxgfKSG7LgzjhbbHJHhK31uhMupD5tzqPZO1KBCeqIQZjXD/TPMa2fcQcv45AfeHfHc4A3snazubR3YEKIgIn4Xx8yzL5X32w+FcJMzqY5OupB6B9NilYtC646YKIl0mTAp+rZYxtBsWbzQBb0DrenRe35nKIbayMTCNoZCCYlmNeb6WAEaYAoDvRNuHA4Yph1Pghbaz3GLXTTNpTiYUd4wo+lm7Eyk4tuubwAGon3DkYQlD5Qt/fIjfVJRwipszPSp889IuT4Q4FFFqnr98pjAp9pwZCCeJbAVP9hIr59GfUk2QlgZGjHDcN2U+yC02gEBRtZvGbWo1kUT/B8qc4a5Se0OcNsLM4VuKAGtBqV7u7e3raAAqTNRu5etWEkZTx/39mZjIhD4Nd80rFGDe6/Jft5TPG3wECQ8aFMlAHt+/01iyoTXeIj8e5n9fWKimpqTVI2On58xigwCUBIHOCOdKPdO5J8VQLSObJJwUIiQ5+HKMGaWOH3UsBFtscIrp+WLDrPX5LSKBe6SFP/AAEGXEm/grkIooaXq748n9TOWMqbGB0yeqBMTK6MspRhWQW+QxAGsC/2Vox0E6W/6NbCjr+qJCsSFzBzHTchtAC4xrog0Nll1OsU/BSfEQWyw4V4pBYRUN5ZOmDaHDhOUAGADwo+Sv589/43cgkzJk0psDFOy4ZOeuMiyk1mfdkp2UZpXPXt3okAb+y3/5Vm9dmH+rd0NJ7f/7lPCbddgjSJJQIouli8ilLv4ELV/OJ5FT/sczy3xISUro4WcFqk6X5J6m8P39LXkdXgdh7mG8OJTju84z51WR3tQejssN/tc1K6wcGZ9xN/HoJMy6cijdTzVv9Xqhuhz/B1KMD0AGKbL7ezUM5oFhkvxPSQz8cBJLLNXsv9sLtlczsey/u29V7wiDDFjJEe0QNded3b4zpr8Xq/8ynD+AbgpAN9IH8f0McaptjhuuU+dhU3CPImgzbEwa9rut5K0yR80B3Mcjw/enR9Z1jwEDPXd3pP+ylfP6dw0sM9os5r4NkzFixg4nb22Uscoz3ujc1NYXnz+u8vNDZkJjR11xcNUGz1OsJ3jeKCYFb881C/n64tcHRYukFjXMcz153+UUeKWBzT3LRjyll3qYFbENa3EBLZ/6xnt+dnb96juYvbWmxTSkbunwZRBHfUp3Rv5OvPaWoyi/sDvx8ugTHcHpXpFBDPMH8eNl1Hz0oOZYWbTht2Iq3LUxXrrAubjqxWn135p2gNroKd+CCJCKdBdlPNabwdIg1/77pjMDlTtaB9DsmzKLtpQMgJ3xeMN/86gzV9VKrLvJUKHwkcIL5yLKbGKfLIb6FTTrADXRvVMSmS/6ZlE1IJ4LSHZO6lelPiot8MrU2Tq8174lrIDFKLdkxEepZWXP1uh1WaVXbOG8Y+QTCZllwyXMbsCqVbAnJL9ZFdnMySqriL4A/HXywt8W4g0akYi3RVkFjRu/rOqLUwcxs6mzN73vnsbsT+xUuS/T5vk0oGDZNWRdXv9UsM7oeq3cMl5eXRWPCqRlRneHBi+wbPAqRqdhDVD/fbPw3VVq23xz3rYoq0RrMewRFjfJpcENUtDS+Yylm2SgxLwb2CFoRLPFPoKIQLAu8yFSaZUXW+8YWQ5X60GvYlhIc980SS/ws8Q5LSDqnJsjwIxtI97EA6UQ1bXJIr/HB4z8zsVHfRiKtv7xE09CJj6TCNtjxisW3UM8+uN/iCSG8FVVxhnXyLu/dZtxj517ktHTd78CAWKxcWlrjSrOwOQBWXa3QsdmIKw9882bv5HGBLMTn0o/x5UGuXy/lhJjlKCPrIDqUzpOJlWuAUdxuz8t+Q6EKmZubmhY8r8+zTfdmjYHJpaYkBDw7E4Xl65QOZY+i5M7apDEYHSWJiWnL89FFVQ5n8XEqO/OPUubmMT1YjsNoV2CHVlXYcje3784uWRIiznH3pgJ5zVezKJ8DTazuJp/+cbT+z4j3lwdi8r7+FSn/Yw+AtvLW1UFuat5J21c0eaUamXQH0p3XMaja7FHKFgLcg4p/7Gr2CTYDyxyM91chaO5kNxcXN/KLIk64vK/LtPj0jjruQ/FNXAB0hLtpMXKxqFseP9CDb8x7441URXq9crIJ4zarF+NrP1q6/KxRW7vr3zfPL4yIwIoZyFb/ey7XCD3VrtwishUrm6r20zk96yBL00xlLGBT6Qyyd805b1fNocmT/GzG2goduBlf1NJHl9eGYVKSMLqYZcPiydIaX8eBH3X2ibYDNQWTy1gyhexrnj4WCKaZ01u3On+CBRL+a+HRly83OvNZw5KU9PQrVy4xQWTWD2U7wWbt85009riJrY1ZLpTK2+ZIOqboAV6ew8rKzrhgIho8nUjkp/xXn932RyGXdbhNxywZHeqmWkBMFFQ33WNDg8LdEq/ejobAkgq5Ht4+0Rw3JTG1sCRFNZSaOkSWa1CpvOCNhYwycqITQIimg9j7NX+FE7b9qpLdlSuKWoX6mBKrZn2kykfGDQs3m5rijFIdPbk0R09i+udUy7eyCn+548+OkwcjX/t3qwxUYdKzpmr6pqN0vcNbmsz9jMn6SL8JgS0EeXOJ7uJHsGQYyBNomUF1LlqRNTROXr4Dsvrr67NS4dOyE0fbMlHRkfX6XEkWh5gfvd4+GfOOXXocUM/F4Nc96D4nO7S9cpvL6pg/vjhExXhbazVqkzRJCLpUp1UJs1frMLAqq6OnqhZo2qzYRmel/UxSZ/pYLM3H3GNBjCGK7+zmKvzsfSWT5AtzFfdZfPp7BMhGu93r5yuR/M51Xfgk2F9vSaxyEisHc8W6Gf12OL2Y7rmoc7vnf4+WUoKo3D8sJRhfirknTiwXgzgrIMvZBLFrxKfxRt9nZC8kW4Y1lw4nnK5azsehHimVm7QaQeJ7UJOg6A17rTJk/tZm3KXpt0MoqIO/UVWZZzHOcvlcO+JI+YsIYr7NFWLXCwfPhPSF/x+u4B6Uo2UrbEmPItwi99OcpJUNrH8uvD8Ik6k+aWvt59HlVjJZ1nIULo/CNunRi888GtxPRn1L3+VsY8YrJKcjy6cIe8mYCjZTsDnSkHW00+bhZITp0WD77ukqtBLZlQRYz+y51TXcPfr8Zefo9L8Sb3U3fv801C3SeP3IZrnLJp9827xj5a3/o7c7wrylLLta7Zxf3aXDJmvjr6nC/entC1wm9a9jd0bwCJFjFuugrjfqHofYlP78zldLxfeLXdp9UYFZpzrS3EgMEkE9ci9LdVdU0hY3/bLMVm9ppQGwnvngrcztO+QH1Y2MvRwYK6wZ3ZZPP2WTvo+/6sptiyvXOVeWp/8qhjOti9UGTaqTdT0CF5u7LfhaUinCx+fAhohRiXYhRRCgUWG4KDmXFVArQnbHe0DUBUUcEjWWKhNxrV0/rNMf/8nPdlOS2A6JIVfjkLjENxkUZyHaToyC58KjSXK4hldPsOa8xwTUh2QWbWKDrpJX0EK7lL5NxCHjuP31KkmYsD4FdNMzPFobq/FvxtkzMFjguf6fhoMWBn+9mNynAP4/i3mcpQtJPbg1YNW8pTTcav1NLIqPQ3mqPfBv3YmvVHBHWMrORm/8tM1+Vf5vjLQGmitabUfR7P56LfVWGC2Sloo7H3rtaY+mm8qBQKU1GX5jOHvut5n28u5u1lBM41See5D+oCvTPB35VDTqjuxC4+Yt3L5bpUBBptJkL3lAZbbzQfcqbcVoyZuWiDAz6A5OPuc5oSDzM/foRKDWy5O1f5geHIbKrAjv3+oGHqOD0eB5AuwqH3srDO5JGfRmRCQCNXe/CBiUoKJbRQaLRxOmZZOGTN9lvnVygEjy4LoPyecCMYydEbQblR+8VP9+zqcddFd5d7MkdnNqGBKsZjIo/WTo2+9G12dda1N6IX6gJ10eOjQFYASJbHlpMZ9ZyriAwDd58witVOGjxCkSSUrR8pt1i80glrKlvl7EwgPVsxKDxLeYJ15EoR/ndtLU0NH3g9NJd057KyQ+x3wM8tTYv/N67EZk+RfeGZzeYQztHrqRzOaiBE+832JETB/Re8ys97VvwL6dPDV8/8qQloAtREmfoN+aa/mt13nrtUJvV8Ur92+Vy8le6MQnXk4/8cHoIBY9OFx8N3JwMOJ+SXHAC4dYvPaKmuyq+rOjyjOtCliUntpkeXrArGyZyckwrUUYmAtwKfXbSxWMZK0eykLElCyLROVLhKELzp5rg7n9bf/x7j9eJIcMZlJkOU0iUajIJfjrp8ao0aNm9Eiqx8Onh13pOV9S3PlVm7BBcfN9PNzY+YTWPYBe8cZGLdqL1Faau/K8BuyavVZxvirEnaovf3PcAHKUmuf83QcPpLDrzRl1IWBE69ze8ltJ63f4PSkJRWuKdt4aq9ZryL9nb3X9U5QsYPnn69EqDuezozqIC2c8hE63o4mRz74ke9ap2pdtmL7flZ3Luzo3bcpMzJ1WUKgJifkPhFpvnXjjhvRc2WInQ/jaTH16cSE9FUV3ogpoOKqYk3SKklvBRjNYY4TV4VhydfAuvSQES3zYM4pik9M4pfWZcgWl0our/ds/TRx6Yt6oqkEf49SnP8prK1GzGeoQPYpKWjtU+Gdy+b9dTRoTe0PUfUJLxNQVJjCfjEZ+fqJZ6+M6jVBdmlzI5ApCtoySVKQqJrH9LEYfn3UE9FW3eZem42BIgf1usw1uHrGaDQtG/uPAfMpLj2xuhtF4wIoZXC7ljfCY3kh8rsPSSW2OLMVpXbMmGqcBK0OKuTnz+KcbRA5aiYbogTeDK+b7Z/2PkMdEc8HuPpyphfABngSGiuSz1gxtYph/fHvshntxgE91eWXih9qsKCs3BN/kb8qIejAn8CMysVZRB7Ke2MeXFE2GRbOvfZ4KHB+rh0xL7zTUCNZ+9kmJOp3WsseMNSdK0GU5d3NlPntoUJmKZ42LFpQsq4hmIaZr5cvY5ZyfXtjCxoaM6Gx8wHf8dXzDkd+sujxl1PISzZvU+AbUnXx3WkBP4mkaUMnyrgmAbPQGbnPRHZ5TDI/WlLmhpEzOyRZ8kvvGQnLK4CVJlNCgo3XWoTtF28xSLI77xU1qN6ubl2x9vi1bwc4SgGAU5HD24frB/MmuvBgw2YEudZ8Pw0kWInURQ0MRNqdMAJmZFblOf+XmLZJKHaVizDtChCHBIJrpfimLmIrmNGRukmROajdzmie2RQlvjjlK448LCW4wiJKQcNwzngM7k76168yd0TAVNypdFPhS3Ye1xonoBUPXHPsg3Jk8P9zBf5A0+qShPxi2e3SacauesqqzosD4G57GYtdY4bAf0N2wH3+88/GBEGUPEOHCbfU3t5YJlwl35L92uUOof7Js5Pz1V4Zq3G0MJ+Z8W2S2HPY+yRumpkSRUZN4BTNDa99wFim7nPNlDq+ejUM+qOXUniQe2jJmPeHk/ObxOkjK+mg12qIIEqH6aEbs/JzhTLYsQJi+OpyQn6OyGEWYsn43geZCVj9RI5GYvDNRQeYu0ZjarJDueFftdWrNVAOCYTccYE66IqMqjGtLYlnAy0pEHLU6Cp6JFCxU+rO/zjNzccglzYMhTI5vDAQSb1CMTbxafjhfHkJV655ovTJ8pfVIFECVh4TzvfJt4q1Fal08FK/WbR/IGO67CXdGyYe7fOohW6PKJKwF5lGLpSPPevWWmOsAVN4a1p5O6Mo2EoQJCe/oro6hSA8dTmIhG2InFnLIVuHKxSFSBZVuHq8mPne+id13/qy72h6YuKoppHJSGWDyPjxcuud88aZhAJEgCcEQkCuPjlF/27lvo+7wvj1/AmIkSmiTmdySIkHkuISjdXU/+QQEXB7vnsRoRyHuNxXKy70mSz6qrnA1MKtFmasq5dTafiM+xKRSlD5wOCXfHXH8m3v/zX3LIwu78nCHidPEcZPNv8ZmT0dbcFZhoOZyEU7gdsj/CkBgSJRy6nK3nVVIa5rOrXx6rJhnLHT/8FGy8ODsza3oTmL8Bw60KeXtWRjEMEfffXdzPZd/PxEx/V0G+M6fHi4659Pm0VgMAYnv07sko8wcVrfejdqBc3fXBS+M4kCtQAEF6u7ee1csfXbinKUi1Lh60AP01NZFSR8HSUuQHVXtAIHFj0llm1AAkWCJm2ZxmDTqkoA8RXS0XHwPNDpDKHoPHW2oO24JlGloHTA3mLkVMSiLWFj/Yj7ZeV0lXfC6IJoILRwi1ZM5EeFzh+Z6EBhSaRGVIA3Zqh/TjeufpDETjCGkU2rxMw33x16spy1TYFk5AASEnB+xBIAlzKXKkoE+ojKXLr4tfbdw0bfp8zf3uV4W5i1SuNUy6VXvs1vi8vcOS1aPH161to+7avHQXRLuTueJhR6BYY7GIn36trot6ex89rL6srogax/dMmH6Al6moJ6UIWIpLUS00hUqNQ/PN2hv2dGg++iCSv7y0j9czrZuPBr0b//xUZv+tDBepjA2niUGZ/IVPinAZt7HVcwqNwXdwsdV6P2c/ye5f4hNJCvrz/3GNl83CdSkoPofWdUHfGr19POMwWlw+v9Vese1QZDbE6rI+8/W8o+0DlvSDAyTki4QYAj0ewxmuyJb6qiDo/ac30gxN9Ywg651IGVlybJIuWsukr7CYTA80WJHUdBKaZkluZFfyish19PofVf3atuRdShHa2bi3EVzRpgvo3LZAXl5xSOKWH812kaZzxNI4sauNRD7nxpZy2WZ6jg88jEeZ+2cqBqYfWZQq33VLC2mXl+KStrGHs+3Jn0k8ds2x3bGuNvupAKx/2XX/tbEb5Ewr4seP+sfCgF71GTCluEiAOL2KwaVFD2Z+JK+KqfaY4wUearieHnLWiWtPXZTI0PG6TkKcCI4KuxeHVp4xN03U9bNijvP2cX6c7y5uF8ilcyvab/XIyfJKyrHcTIaE0kF0h6UeWwlC5eKRY64pKNeW8aJ+IU3sDhBrC0C0xY0HPPji7L8Lqv4QdN1HkbqjUVPWpph3hg7UjNHBdVG5+TGGBjpfhQDI5HCnhjoiVS6XVx7amehV/SMD1gHswh+9jwMm3BEbbFFyt2t4vTtUYYajke9DEMEGw/y8Ij45z1wiSRzQ6tUIruRjFkftHVHP9zWMXrLoHir/GkBtXaRNTroaKxg0giH5LqfI58qHZCQkZqMLPe6oxjrkmYGEPgjFT4zZbNUde2T1HUrKO+BbIU608sqb9h3xuTQ/gP6UZP75cqRj9NHd0W/Aq04+IXxsHeum6+/VZWy1Zv8buunD0uMLbcg2wvNjkuhTe2y43KGOb9drWF5+rYr9NAytrbecCvSue4frLqoeKSXP+RfUXv4jCjHtg47fwrdLRchmOQxRlIbOW7/FGaLDPchrdCa2scPmqoR65E/buv4COaMCgAgYwNEJD1LjrZuLFCJWWf+yxp4cc/NqdEnQ/HQBiAK3n3WR+ElM0NnrVH505xjDiTWbvclbGNm6KxVy4ygTuq3Dl723qQeugijTYYt7idLVrzPms05uHmR82XyerFiUQOmvsi1oRCzxo94VONS0FGml6Y1fg1enY11OWcR5vAz/xxmIMx7ia4mI1SKiHXTSJ1/BDglFfim3TJ08ik69U4j44dzmj8/JZLrqD8wNaUSp7bS0Zm0VCqtA1K7A6xn0ylT15B5GiLSh1NB3LvK6Yyqrxcpcf73pVLTSz1XEJdIxBKQnT2wvC4oPL/Uyz5Mff8szhk38Oaxq83GjhqXuFCnnp8gf3PtKx7mZkkCvdBYXGiWj547c8ZiKfS9LlYA4a/TxKYs7NV8cFX3/JnpWVm1GA21rn3SMNOQVKR6FvutcdpNnmVScAz8CxHAzxYtTgJTXCDgwC7jXfALk+35SIdkj3YHx2nfZEs5fe9kcXqBD+LiS8oQNfNuWCBlh+cQ/DViRr+gwTapyo1th0PK1EA75T+3e++IrlIsbLA93vqahnDE/WWZ8Igo7xavRk0t39djFsQ8uzoLR8jQnRtuyNHllooF3uYU29wmGFLGYVJWztV6FCovg9K0VJkj85xINgisgPGh7HbZ9K202yPKD0ndKNfh2+lWIVHSoITNGEfn8H/p34SdBBcreMRtMmszqKYDGLvhelXmMzXVsKcDhfeyMm8amX5HcYjrcpR2IA8EwbO+gvMPKuMNpbVb1ZLhQ+qsW346620mld0k3gc0aWql70I4rzR8l7r62I1wSNzmcp8b19UrxrpRKana+9iCmUneCvI8RG0eaN3OCWyzuUge4zdJeQyqQ47lF2qz+c/8vfxBR6FAG7DEyl7kclUEZTWQ9sO0Y/pHGyNbIUPJIkoD6VTcu3I3K0wDVcq7+pB8Je8jToBNtzbVdD8SJrKD+EL98K1EvW/6hTvlBjw+ydBnskilUwfL6q5iYS11aS2BH8Zs/6Hb9Pgv0L7QMKZcTct9S/g/5EZkRJOWez3IezwH1I0ff+XvCIpe0aCS74w78IoV93x4u92LCZca8vldHTk0avvM3BsRRhFh+qFm33wSxmxcFhu8UbMhjnI1ufQzTN0fYxs2mj9h42H2ucM132ONzUd8ry34AcfAh9lsc17X86vEOJolyxc2deCbT4bnOeNRuL7HnwuXjm5YSXiv/Y3yNHBh3L0aZr3Ott32S37KPxwrMnlJBWIporE75ij5GuVK/JGOzpXQRki66pH48c7YK+CEKjEmIsmw4eHJjayw3VACxmHOJSdvBpFmP70clYRjT8pPwUsL5Owd38I4nFZ66uxNlYzDqZFjZ4jO1qcT9Rw2WV999wnbDm/8lG288/8remdUfO6FVlE/J6n1EY7pmSKReKYYF+RSjztnT17UTNvEODvU3nHG3N5hsIffmGytTGKMTFz6V3fIPmuw+YZ+W2d3a+PxBTrb0T4EMn1ai0Kfe52jVxMKLPKRd70m2lOuIGvXyxYXYUCW1LjzP7k2PjOjobaRbj0pP3vAMvjcAaWEyu7w9IaaxkgyHSwLKXGTwkgIYAz6vt6VujNqa1TEnkIZHvqYyD+SEt5RbSQl3Cn6kJT04X1iVdpxX+WxY75xWQkthBvX1MsTCF/MMdOBvilq1j8VqKeHRT03PqfjLTnkNuVsn5AEky6qmyBz8ZaCeCLhaOCWgo1jvre4W8DPeZ67N4c/rE4NLf4WsYDVErQYoiBU5PEQS8340sUFgvT3N/cEOeV8sdGweBh6lGrSZ21oHORJ9263SN9vkmcp64h2h6rZftoW9e+zG+sNQ/87EEyaSnHtnRp1C/Ob0nCvBf1tV+c8Ffe2s8uXPRdsKyiEbENQ/PEZnm0tl1tJs0j3SEsohZN8TFFr4GcPgcKqP0P4RRFCeLi/fVFO4CLN8Tu2sEZOVbGKY0UP7KlcazVF4UcK0L3IEl5Kdtg8hCuXp0RrvQuFz3KuS+xDrU4Nf713wrkqrnuM8cF/wva4q8+a8ak+6AYWjWqh42j4/8OJvVd+f3uvfPRrm8O/q88kBmH/Pbmx/sjjZ/Ux2WkPeufdwINm0oZNrItts6UGIAHrDPDRH3pg0vusMBpYEP8qtMsrR+N/qG4a0dEgP0oPHQzrPgPIBgBbU3SBZLA+KReNEgNgemRNH5G4tCvIOYLBrixaJywgxK8+GRBjdX1uwKptxJDYTumQPZl6OAEkEVIC1aPMM/JjDLGoFzEBTUUQrMRLpFm9JLe2jYuj0/CG2ASh1A016grkXRxZPHqIKLCNs7upOh7PT2LqTqi9QZtFjAM12KUsu44vngHQDgcALaSx3kQM2cqw5gGyAROtc1WEMgpizEM9h4eVKLBGyXNVAdc7y48oLvMV5CaJ70DDtxE/S5YqFwHYlcoxpPy4RTyHCg+JfGfXPLQlDnUiCpOwmgRrQ/BEGSXKq5HNcIB6Rald72g/pCpks1BnyFz7HhFSCkTbxIcA6lW6JEbAoybRaajmqYfxr1o+Xj0VeNyg5ohLSFVOeRiPnKqIeFW0wfYEcZrmWckCyPhkKtVnZ+ttAm5MFbglroNyFuSwvCHaQJTUWiITxvKcWx4iKPLNmHBm6s9rrpYbInaHguAbJA6+z4E5Jn9Mm0m0URyhke/gVvw6vr2yV0la1GuKN+YC41RUviHMWJs1MlGpqNxJwenBZSiLWoQFpoZQm/gEFQpip8V9TEzdz7DfOtYuJ6/PAoEYVBIvDIlriFMWLYs+qsGcbKyRVBLREsc10X1UBNdyAwWK6iPEZeQop/xTnEePnDoWridXEW2aUCAAOPnhn29WlVbH9b/QHRrujjdTfyqqigIXNuKLq4OSLYL/qDdrw0ngNVB8Led30Q+YheBTnFiq0cntvegtEmek1fILYCgI2lSsj3pJfygTahLbYVqSY16Udy6ZljivmhRnLclmVpnC9qxdaGz2My55T4V1HOIyJvba2/euF7qlBzhFQUR8THxa2jO4yaGl0NEy1l3p25H1NexLcU+fW6HYtNy1LAQf1YQ+3WsqmdXEatYetA5zzq2aCSqN3tGufFztD0FbCpbHVO+uywULialPzN09Na5AJ/0P4dLWepzmAj1dWihDG0cGRenfZhFNtu04HZRH8oNXh8lQK3GxTkWAt23vRjA24zhaOhJiN7nPxS2MGtCsm7Qlf8Z7mM1DaMcZsKPvhDGd9150xd5tLFKsqR9cjwXoSOIMVAGjWiN4sOOuvYmXyGDf7FmzJ+7c97J9P7G89p4YfQGj7GlvdTjMS9jWUDHrwvIIu73jpZnlpIZDsrnKAJoev+3i2+uwwJJakSKzOAaNs6yn1thAeNcKGMK1Lc9gYJxQaox9Nkxsl1Ka+fv0VVzu+4M2WwzN0UNarbefu4hO3CId9MgqWbPRG/U9Hh0zQ5PIvjPF8/SW2qOB3Xh+r9AS+yxjH2UbvUcHip4UCzuXLDXOUj5Vs3fmiDbUvLRTQVI3fARhcffpdQSH8F7Y2oEYO1ayYNu8PK6uVpH2vfGS76BW00jJqkUt6jPiEo90OcmFaJYRhkfrO8bhmn4ZE1bobjxyAS3LpdbmyO5/E4iGVsTWP8AligNhc1L9MbeUPjqXmISZe9h+25R4/Qg5OtY3Ttv7K20x3d7W42Y3NWQZRxdyz8d62e+XWkbdrCg6298lt1CfFgo58ruoR6yGYZx4TEngA3JsMn2J0do+Fk2sbj/Wz0v7d0Uv2ROSOlTjQNcCv1lft8fvk2Hu7u9eTwD6BU1FXjOgCb+Ij5hPp5BcELjQA4GTnMCBl3MKDV/mDF6cyTkcJC0X8JGRUeYOrck1jKV5uQ4nrcttsNMPcwcS6cnnutGBDQLDY9x24VYg5QRJqIm0wt+HnCETP+YcSYTmAtkkN8rcoepcw7NkW64jha7LbUig4dyBzvSz/+5Gf8beJjgc7yQQKrWksAD2cMrWdyzmhI/saGkbaMyndN8tBiw2EcMAaTCyqg5JHOleryxgj8WaBjek8Ht+qjVR/FILPD9PyIpjJVOHkIoomqBEPBEb00PJk86s4sfu1yqZBgKichqc9/xXL748NfOZSVSYh64s/XmLH1Do/wn58vU0nU1ev1bLv7fXj6+rZT8x5E0c9/xCT8NQuq08cUJUfavXGDZaCXwHLjx/o5sMHDNwyEfLMnGvWm/duZhwfFVOYlVxa+jEd35trBW5OWDGTJZF1UVAS2F9lsohDCwFtIwvipABcLegmTeKlfVii60gXd4Q4UcTtXvgyO2xkLOwTzG+GFIx3NkNO8SNjORB0dz2Jpq9pHUdwrNGqpwAP4dtCcL+xhrCnV2A6xwxm+v30gzPmxS+R2cf/drD2euPvvz/SVmkleW4xoMR+yNKsqJqumFatuN6ACJMKONCen4QRnGitLFplhdlVTdt1w/jNC/rth/ndT/v5wBAEBgChcERSBQag8XhCUQSmUKl0RlMFpvD5fEFwjB9Kr5YIpXJFUqVWqPV6Q1Gk9litdkdTpfbx+PrBUAIRlAMJ0iKZliOF0RJVlRNN0zLdlzPD8IoTtIsL8qqbtquH8ZpXtZtP87rft7f3w/CKE7SLC/Kqm7argcQYUIZF1JpY90wTvOybvtxXvfzfj+xqHlk9ew9IxQ/pKJquhHK37Rsx/V8AIRgBMVwguTxBUKRWELRDCuVyRVKlVqj1ekNRpPZYrXZHU6X2+P1cQAgCAyBwuAIJAqNweLwBCIpAKBQaXQGk8XmcHl8gVAklkhlcoVSpdZodXqD0WS2WG12h9Pl9vH4egFAEBgChcERSBQag8XhCUQSmUKlWZ7OYLLYHC6PLxCKxBKpTK5QqtQarU5vMJrMFqvN7nC63B6vnz9fIBSJJVKZXKFUqTVanR4AIRhBMZwgKZphOYPRZLZYbXaH0+X2eH1+hAllXEiljXUemxUD07Jdbsfj9Sm/FgARJpRxIT0/CKM4UdrYNMuLsqqbtuuHcZqXdduP87qf93MACMEIiuEESdEMy/GCKMmKqumGadmO6/lBGMVJmuVFWdVN2/XDOM3Luu3Hed2f5/sCIAQjKIYTJEUzLMcLoiQrqqYbpmU7rucHYRQnaZYXZVU3bdcfzi8hmNVtKWhyWXpimv4zGu0z3lOOSGBdQcJNeDFBsq6APl2BiPo1nWqBnV4dRuVptVRcPzhFfNOVibFfk2XV729Ie1WOj8Sg/adU6SZMoS0z4FFXzW69ktSkAhF1Bf7rtQerjk21/pGIv/oqCtult6Oq7qK2q0Tc1iseiCW7ajvoYuDNrqAHJyBZD7I+DSjYn5Y0ju4LF3fzXXwX9B/4rC+ZwvuGSlcjyKQAxvVaY2E3xMGeiJK7Qic4OnvefSCR2k4d7PUkgjilb5KYE1F8V4G/nvwg0G1Pbky3FCn4jFFeIR1XnLBDTTiHfTpOj2jbkWMmNNmdcbZvkH+/pl/u1kCWeN6JGwH7yZC7xTUFsu+GyNoNUbcrFJYGdO8qXNoBwV0Di3cJ1PpDIcNX0cNeIoB5d8bebv7Q8geFwuaXEWXsqy/r+NxSqj2YYL8atu4qpeKGNWL9Sq4E0feSnXqvA013WqqB+B5OCWjdwQz+UAgOUZk3f960FNbhFoQtveKQnKFF0t9n9ryPnAHZQ6UyOcryKljf3X8TxvfuWUu4VWvEJgVE8g8Dje0IXMw0nqqA/F3NB2F/d48tng41xCZfa0TwiUDGO4ONr0kxZrXNq7N7zkOKW8WPWX1FqQOBeBVk9VPPOcmHiNz9QPR+srokHu+XYINL/NxQuKPzBZhLfcj0kso9BZJ3dheN1f5aUgo/ULqpaHunJbCev1pkz5nmJx+2YmmmEQGDeXMtS2hPlMO8nvYaANUXLvzmIFt/NC8lMHmVXdR8FOEfKIWU54+rRJ33zgVCy4AonkSN0xXrurnyHSLxY8Xln2Z3hog4sbVOZ6JQF5Rt+5Ech3pk7m8MKsSiajZo6YluzmlbAdB912lZCkzo2bHxRY5m/Dnd8xplRro446Nk/cejk9dP86Jrn0CXcJTC7esjHUJc+xmp5CcCTW8G/j20KQWnDXXEkEW9Qj466s36NlFsb4WbqswVlDa19JBdp1oqIKQp5A3LuGvJARHWv/iQ9cHpIN0vhmQ/NhzuDVHXG9LIN0SQf9Z4qvbj4ydleTrzyh9L/e+6FUNhTYHbvdVUJv11Zs/rVIHJBOPMeF+Br76aF7pX/kTFKXs16lBKN5tBtgWGzO+3DIMyg7p3V5ZxlPtvLUO072cqk9Lf1Nl0G2X/DfSXitfEagteIt1+7zToeztmby29V/I/g5Mqd6NX5DG4e8XLEvN81cT28WupLlG4WiLG/ApY8i30kuhKyP6SL36tGebPDJj9D9zbtY9kcLiRO/EAPFeusQLF8TTVTdRTvPUPL9zyK6lFbpPrtdbYtOYw7TuYjj23606q9dEde5gzjf2rpCG/USk5XT0kfZOa6N61ydXMMuMPl8UXm0scvaJQEx1nKNurUFmRKWvn5o+aoGYTCJMsrn36ZUsC/NRmaNQYwA8jD+m1KoMzV+CLqq1BK/y4hOrbCHh2/KBmZRa3mCsR+yvcLJixZlRy7n5q67jxKQnyh7pbVBZuks3h6Crj7Y80cMjvhV2n97pXMceznyUMtma0pzUqef7wxufv91cbCeOK9AlAWdg5fpn86arqw4v34djJhJhUFzXYWM/Zs2lfjhdxIyD+Gjud/N0P64XKSygdrTU2rTlM+w5GUcwAL/x/Usby70wDsKFFRSZSC3qnxE/8RRtLvtAtnVF9WZcOawV23eDlDQiF7aSbsM7xpgHhcXNPG0xj90cZpA8yye6jvxBo0sncBbtu4qq7pyA6YAgIoNalo+Eki5rykX/Yx5g3VdGschyUsMtfSv9RIXdKhZeiqYeqOjb11c5t0Oe6j2gZ9SWw62KftjS0ErDP3wmSVIdN1P6uXwKjM1xqwnqZ6kZzMWf2LhH8YwWOYp2MR5tkPzJSWWABb+3SO8TU9reGqzJ1o5gluXuZuF5yf7kpYCvwducdFbXbs52L4AX50d0390ZzPYkfoNlDdUPwvXveQy7VPRtaOGtWwFllBIaSGdhg9tSuX1mJ6pOjVXVA0GnAhFIbfDqRgAUUXtB5r9Qlq5iL9YJ9LtOAH1Q0T4e9wgMuXXFxpVotdi4bd+muZYj1ab3aw38bkb+0wOZv+465OsL6G+ZmLx4xSXxG3WLithPj2UTSWP+P4uUHQ0WszT97nv+LVfstTnj+5PO5MIt3ipaNNtt+VRy9fn0uePiokJ7v+WPZ02bsniEBFbE293i9PuJ9ngMAAAALV0FEPGnb6zP88rbXtCmPPvR8UcS3jeZ+2vqKlIYOhYpYm7G7QwLe7fz43s7vfcLz3zxBjz4UoKLlA9fvzxmFNmMOAFTE2sw7a63d9psjNy57N2Ou6qI4nARUxNr83dP9X5vj/Mw0gIpYm7E7QgIqYm3G7ozpIyIiIiqllFJKKUVERERExMzMzMybPzmqpzfN1sd0M1prrWeBExERERER0YGoaHr2ir8c/beM/nQm3q93Lo7D4VmbTvnLi9W+GbtnSEBFrM3YHSEBFbE2j4329RZ+GWKVct20wZ/IetvJXURERERERERmZmZmZmZmVlVVVVVVVVWzabq6e3r7ppOcf4Q2vU5krQEA\";\n}, function(module, exports) {\n    module.exports = \"data:font/woff;base64,d09GRgABAAAAAX7oAA0AAAAChqwABAAHAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABMAAAABwAAAAca75HuUdERUYAAAFMAAAAHwAAACAC8AAET1MvMgAAAWwAAAA+AAAAYIgyekBjbWFwAAABrAAAAWkAAALyCr86f2dhc3AAAAMYAAAACAAAAAj//wADZ2x5ZgAAAyAAAV95AAJMvI/3rk1oZWFkAAFinAAAADMAAAA2EInlLWhoZWEAAWLQAAAAHwAAACQPAwq1aG10eAABYvAAAAL0AAAK8EV5GIVsb2NhAAFl5AAABxYAAAsQAvWiXG1heHAAAWz8AAAAHwAAACADLAIcbmFtZQABbRwAAAJEAAAEhuOXi6xwb3N0AAFvYAAAD4UAABp1r4+boQAAAAEAAAAAzD2izwAAAADLTzwwAAAAANQxaLl4nGNgZGBg4ANiCQYQYGJgZGBkOgQkWcA8BgAMuAD3AHicY2Bmy2ScwMDKwMDSw2LMwMDQBqGZihkYGLsY8ICCyqJiBgcGha8MbAz/gXw2BkaQMCOSEgUGRgDQywhuAAB4nM2S30ricRDF52dqZeb5PsAi6gNEvYDIPoAIe9NFiE8gPoH4BOITiJcbLCLRdche7KUIW1tb+cPdavtvc6b11l+/Teii6yU6MGc4MMwHhhGRBZnXB/FCF+8uTN5zjnrDsNekIDFZl4xsS1d25ZscZXO5dK6iKU1rXota1qrWtalt7eqODtTXic6YYpprzLPIMquss8k2u9zjgD4nnFnK0pa3opWtanVrWtu6tmcD820ylSAIyRn5/Ioo6jSrBS1pRWva0JZ2tKd9HepYlULHDNdZYIkV1thgix322OeQY6qJOctawUpWsZo1rGUd61nfhjb+RwzOgq1gM/gUfAw2/KvR/eiLW3VJl3DLbskturiLuahbcBFM8RePMBCKB0xwjzvc4gbXuMIl/uAC5zjDb/zCGD5GOMUJjvETRzjEDxxgH99Xv86v/bby4vKC9SKhRV4PzF/hPSgeSyxGk0vLK/957xNi+cPzAAAAAAAAAf//AAJ4nLy9CYBU1ZUw/O69b6l9e7V1dXV3VVfVq+pu6G5qbXotmp1udgQExBZFkUVBQRAXSiEqiBso4t5oRMkyYxbzJUacyqaTRWISYja/+dokJpm4jJPkNxG6Ht+591VVVzcN6Mz8H3S9d/f13HvPOfec8zjMbeY4YhPhwUkclwnag8QetA+hvJrdjAc3C4FTm0XuFEf/Ie6SM5z4jJDjasDjlJA9GHc7xVCwXkmmE0E7UlLJbpQIxmuR+ExT4S6U9SmKbzhHnyhbuKspHPMIOU8sLMwIQXSBU5IK/BEO72gKeap1umpaBwd1cFBHE3jsTguub8bJbpyIe+zCaG8ynUHpRNwtctPWXbXiqnXT4DXx6mWF0V6llmRNtlibEDg9GJ/X5HI1zbsCXlFc9X6hozKAvFaXMCCOb+Mwa0MO2iBxQei3jQvQH4Ku1kcRPMIKtjnS4QDvdrhgGNx8Tv1YvVf9GEnoOiL1J9Nh9dhX3rpPPX382muPIwHVIuH4tTejZREMCZCkJVZzyX4FLb15JMW1x9XT9731FfVYhM4GdyYncQLH+bgubi7HReyixEsW3AQjgKJKRInanW4Y67S9EzcTmAPR5fS4PbV8B453k0w6040ydm1yUnY6PTBQuUBE/duTieymVoRaN2UTT6p/iwRks5A3y0gQTbpTWbN88FtviO31mWYnQs7mTH27+Ma30pfkVveeyvauXt0r5HtXBwgXrj2xp6l10qTWpj0nasMFzizLfAw79HadQZDNz289/KwwyRdxOCK+ScKzh5seGDidp7l5WoY2x7RvOc7PcTwMaTOfghbGa7Gnm8CE0jEljyYdhfsNof7OFnWo+7ZrF4TDC669rXtIfafwQM6BV+jCl15x79S3/tE0OxsOZ2c3/eOt//1O4Xmt7C/C3A1x9RqMylAcnbeIAE8A0IxMwTQTkdNxjyzAmPjUh5Yil1N2qT1qD0yoCy9VH6xqQx+9LXfKb6OP2siNbp/6pGqSzK4a03vvmWpcogX9Da2pdkX0s9FrDQ3q5Nl6uj5wuW49hV49ihhhaklEKLXj3M3gt6C4uuL4cXUFis9GO9GN6DXWroZzNws7UUM3ulW9vVv9hbrytdeIodTM+HlaSduYE+jYu+gqjhQhJAkD7w5k4rWEs4kBxZYOCNwty4c/t/wWe/PMbf270cbd/dtmNtvPcG+r3377bdS9d9Pjj2+66OFHNk3P5aZveuRh8i0t/G0YByNdPxJdP1aujmvherj53KXctdwu7j7uKe6fOU5IJZUmVC/WIKe7AwEIX8CP7EmFQXgR5NHY+E+Z/kL1jV04KKf42C52jgfPKb4CRz0EnsPcSIxQkVPNVaa6UJmw5D5mi0aERZMtR6FHx3MWfJgVrNInPxJ+esRJKpOo45ZS4XzpFKtbYAuWp8AtVs4n3ZlHjVAVGjNiF4gnXH9S5ZL9/UnMniNukjtXDOboltmfRPSJf1ThGf7RuWI4tjDZXnM2LHLIpbWqC2mtso/xj43/n/aPrQ9zbTE1H2tri6EsfY64ca7SV8idO+6Tp6x0owBz0gf6ZdlZGHGScUMvmKCiMAChcefif3wWPvmoChAzzMIIhJ3mzh1X6f4vjtWooYBz6kbOIt7Jf5lzgw/OB0msb0FISfYgOBH08KhD4p3+woS7/Av8d6mH/H7qQAq+n/rJXxawKP9daD31+/3qr/AD4IVyrznzgeDgD3Ahjgs7rUisj+oRLVtJZvSjy3c7JT0SHKxk9dfqr7WSkAKuYm1IKZb+awg9b6y/XIqGu2j7RQjOwWnaDDdpDzotIW1uOmBbhkfcXYPg7EdFLIs7F5bFc7J5SDYDijIE6MaIcxTu1Zc6F+6Fh87KSZ1/qEDIXlzfdw6ErLJPVs7DtZ4FtZ+s/YU8rRVnP12rWXs/cUuLZ7xIl1sDl6JYEBb5ALQmlXRk0m6PW5Qs0PpawBMhSIk2I8AVPW4H3bO1HZri1DtPqL9X/1X9/YmdRw40XV0XsDau2bBw3/E3ju9buGFNozVQt77xwJFCrn9dP/zh3OM05c4TyP/411DvpoClqfHqwJw3b1wHySHXuhvfnBO4urHJEtikvoLnFNgGjdkGDf+EMj44si9wkTK4aEASsWt+2r7x/OhCfs5hyVsc7IFyn849UHI4rlOZE2Xh+ZcCc2PqRtcN05eF0CD0l1PMI1DPyHwweuIa8CeVetHpjlMIgvUpwYw4YUZCsEZFCf7TVsNyjUoUkJQoRRMBl4egZkQHAxZwphSagFWcBlyf9RAWtCcDaDRQARSFtiAJgmoB7g6dPHToJD5kM31DdoZmGfTV97tNln0TWmxmqebfLC7kn9Rwj8FqMd4alXTWWY5qy/8y22zGlyxVsakGve8Bt9k8OvG9eqvZdFuYJfZZITF20xoOoU3/ZnJjfzoSX27yGSL36jd6rHfF/Xbz122uDXrjdWmD2WR0rayKT6rGLjNL29w8eaHJZDCH7zNsqExs2J7QWbTErX7sYmcH4K0jOEgHN5W7SsNDKmdZuIBfBtrWWUtp1G6EgjC6QVESGKSVEZZQaU1nGC0LY8jOEIeFzSk80DncueGcxUpIllgthQGUb5UM6ncMErnWYRlY3TsM+NQAA53UDOs8esLMs85AKYuDBCrAyHIOd6GWfHW4H2DeHuHnbNNjrH8Igof7F9+4bTH5Oqv9uUgyGXnOoa1/HwzYlQLhZLb+Wdeg40X8K6VH7gwAWoidDFEKa5SSBlAq7scuuwc2FcBP1dwZwLkAV8U9uAf9n26dmZh1hf5Cv8lk1nXrsAH/OLA88De2NH5jwDigBihiSxFdNIR4hH6tKnjKHD2W8JTCv+gQ1s8xVOvwMp/vR9+hfVPXfY3S/NreSqdYhpbDuQVQ6xqDQHoke1CJwpmj9SJoF172x9pip9iZSnKxAf8etMNgUl8zocvVAUB8OH6PfyB2OkfjRTi7Y/5p6l01JjTZdMrBw9mOBhlTg5TXphP27gkjmK227xTBhrM1o4AF2WpRIM3ZMOymsLXDzk5gk9B2hCENHAYPnFJ/eerAgVModgpdd0J9Sl2tPnXiBLoMPY0uI0NqGW4oLBRUSHWgmANfWpn0xAk2j3HAl+bB9mgHaOdQijQjSqZIxCVqdI4zBNRNFIIptSMREaidetgYEIXcerq5sGR05wjRMURufpkXOc0vmZ3Iixymv5kc+KPmQtbsQE4IVj+EcCdymAvZZh86ogs70WIIsULIUUhihSRosTOsQ0d82M8jdjKped5kswFtKZsRZQOYz8Bzdrqbd8p+2aztm2Zwnn6vu0RHiBQJtHIRrgswlOJeWHrLo6bd44730NWH3BLFY5CSoWwmDSBc9mBc0DhISGGvowAODElDP7mz/fH2u9AbsTb1m/Y6NetIO9Rsnd3eiIA0Q5T44hqPJrVc9A8FRvC+u9rgD9sbatSsLKN8TUMU5RndlK2AFS8XZjiAs9yuMqi47AnYLorA0o1sCl8BL/yAQf2W0WtU81adzp1nCwf+flSGmQMHzoIaPGAyqd/S61HWJjsZ3FjUQQeOV0Da8bNAZ5y2anucthlqLAiKCaJzt3V1RQsNqAeajbLWn563qQ861UG2yQ04LCYT6tHr1bwNfXyepmIGExQFMLOVH2xGURIkcHgFPcHICDRkZG039shucgZ1IoJOFjpPwgt1XoqyeEDxnYKNquoDQ8pHsr6U4YMqnCVGjD5UbfDKP63WMi7kb7u7cKyqvr6q8MuuijGyctVcVMPD2aFLK0zD2Jxj2fODgcKQ1W6zBQLBOhw476LHz85xqHm9To7gXER2yGr+h+db9ajcpkR5L4oqPUgJ1Vsw4GyJOD3v4/Rgl0S+jGQm4jyc/YDacRRSG+32un0Pfr+EfG0/OVuyWQ179Ui3Sf3BF0ZQtYNI3nA7QLjAqVmfEovW7ttbRPHWXWrA+n26KsOeB2hK1Ib8J3Zeu/Y2WESV+EyYm8lWAeaC9WFAWEb2a6A84JiNl5GT0sJOsq6U8Zwu5OCCrO1wVv8RZdV16gcH1P/YcJucpNMFK0/eO/Orl93xpxnGRgBHs1xF+weh0L1i4GtmeQp6FMkHkHPD7ZANDQlY/Zv6lWuuvE3WilCS8t7eWbdfZ7/CIxOZZoeQfXu1ALOETGgudE1WKCjqzskv4NAYjDR1Af9YujR1Ab88hmsln8WF0giBcz14iB9mHsLIjPHdkOgU81Cu7yi+LhooF/fXcVyF8QIrohOEuYdpffzcSoYvW+O8xk+vo2s8RXd7VyWPiNKCcP5SStANy5mirCRbIroDSIc2I10g1ka4/PpDh9arQwW2X2OIzn8d6dR/fD3fRuEyW6Qj7FyGwWV5w4PtLq1hgxSrbsaheo0PS9c5xZkBZU7E6bUC1J5lHcr2re8T8lXVv3i065ZVd8/Oqx/abT6lztX+3jc2vHSrEk/vumSx2acI3CzltIV2nP+LMivV17etIFRVW7ZOSE44oFd8+A8Bj6VmR3uH3JhsVBjdX+Kl9dEWWjEg/q7ROGoN/GBBpJIYthrsctbR47yMmpVgDGgEDL0qEphirtP5Dffe5SPY6Mwb6qfVvKD+Qv2y+osXaqbV3zBzJG75Xvc3nJ13DKEk6kfJoTvwvqMPTgou3hAYQT4DMztNl655EImPP66eenDNpabOmYERpDSwYXFw0oNHH0be13fufF39k9avAOH4IcDh2L4Fx2IZduGgcRM4q2X1K+optg+LaC4sVX7wNF3haC6EUDRzrrYGKbwE+Bwra+L4pXHaRDLGdbKZsOsDz7h1oNxFMwxWn+Ktr/fSn+KzGmaMU7HqOLzbL0SqXTWuqpbelip4V0eEaga6sN99A+ZsJmvPbG7Dp2kTHKnFUHYnA/Q2I97GxgGFB4DosOEoJcjLKT5xj9BFn9tvNlUr0TbnnMWL5zjboorPbN6PPqf+zAxgGpXqpObwTfv23RRuBieL/NknH4WMekItdAiKL+qssaaf+fozaWuNMwrQ3/E1NanuWgkxYQ9v5qt8K5ENxZFtpa8KvJ4wJFnJmRiRT2Ge3jEaYWeVOQ+cuHVw4rfAOUfXqiuUkuEXhB9itIo9SN+A7ttRMRxot1TIHrIHXYkU0pLYUQ7+kRyQXpTsoD/C0ecZrpDjczkarebYuwD/BfjRIMLRbMMI7ULFfDQW51QWTvnMEIhZQhpMfxy7ByydDWf3I8o1FfvSQfnjiZA9If83fj3wLxBYXVf3BPx1d99aV9fD/p7o6YG/W9nf6p6e46tX02Q9PULu1G3Crv/Sj86LdqY/JLzL9uiaCh5FESMCCqJMiSE3ysPm2LeevyGiuqLJVKSQUlL9STSYyin4hxHeSCP71GwqojojEfyjSC6FBpP9KaWQjpZw04ekDcW6UheqTdBCgfqDPZHGhRKfoBUox4LDzbXozQiNy6WGPkH7kizQXweZoDL8AyWlNZtwBsB5boQ2L+Gu4LYCxAJNYqF0FyznTBLWrpLpxmwZK/Q51gFRokdiXSrmk0QPO+YBDY+6BZG5e1BaGSHlKvziVTG3+r58/ZThtXPv83vdIoIzEZtcomeCjgiY+ImrkUcSz4d5uYVHOowtblFnN8vOYNSPFDP+eM4Ct/pBeOYlw49VG40G7w7yWE1ahyZIWDn9Pm+y4AFzFe8CR2EQHOvOCuHrJ88aviG7bMO8qZ18s0VXLRqd1QZlg2KI6Yz1Ynhzvb5ZMIcE3zZFF9LrnD6dKRKMVrmRSPSb5wzfsH261VY9o85HfuMOWWvLaIuaLzu1u9uHheK9MIp7NC4AY4PpGVxoYAHnNb/f4wpGo0G5qjWkzlRnhls0v8sj5PTmtvpTf69vM+sC6Hl1eZD6BT349aW9PCdqe5EJaP5OjmvQNhPG9wmWQDFjL7KsNQwtVDqei2BZx1gUFF2A3WcYfoP0roXPaYSobB7ScJchs7xlPuAxeDA24D/sj2Xnb0Ec3XPaYoMFjfbMqgNmeZBiM4NAQg/O34IDlFlx2D8QO8NtKcoBaDRzkGuAHlCRC8Cji8jACAJVZlcV+dA2MvuDY8c+OEaGKMp0KkefQwl5bQpzqbVyonDVCD+ZDByjSfHsQ+uHWToCz7smzZw56a7TOVSWWRjhLWu43AKYJRIHxCmjQO18RkYdiBJoDpg5KoqAKB9SdNUDws9LgPjHu4VUEg63iAhYTS1JUC4ljRRDIv7554I/niwry4Z/gD29rQnF9D7y9qV05PXggQbr0hqnVd5nFVGPmu1X/xzldyOPzqU3C92LkNrtW+vvUPoJwu3/3q6LkAXkJ2o3jwvDN8yXjAY5WofX4ZMWSQ3MUx+5tP5/t080WWtERRbsvM2CmkJ+Ac5gg0lnO/JtgtvV96vcdQ6g1qJ6h1NnKdLR7OxywQ5/GcdF3ImAPRltBtpLgs45xVpEGO4IXcM0jPXZyRZ+N9+JUjZI24IoiQbJaonLaSESAA+8QmxkcNOcXrSjoXp676Wz22f7EUY6sXHqop1rEu1XbO2NL9Chwu+xdX9YMooCcvPhVHNC4Neg3+/2rPDM+MzNq9qCE5d0px59fca2p55fNeGFCevVa6wBNP+63gmdQTtvSJ1M6rbPuQS/Kfl6ti6ZcXWH3xz/QaJ6va95ePNq3ms11Ub8La64QN5s0pn1Ao8WYxn52pfc0pdcNrk94A29+tAVT1053S+6NdqUp+uzneNcdE+DtehD0VQzjmYoaQpdpncLEvRQxPCkHGlRqqebd4jOs909f0q134x2rkfernmyHPynW9pb197jFyy190V0JlGPq2+0Y7fDgpD9eWI2Nhlrtvr3TUt8/daLJFm2hHolnMTGUJXZKJCrsF4Q9DgaN0Ssckuw3fxg4e0l+jWLLrI6+OoJGeLEjhF4PQVtruZugdmLu63abRhdy9CuHu0mjDJHEKUBKC1Al1E3Bnh1MxAVJUDJcLSZ0H7QvdjjdMAclwAcygtTGIZdgo6IPYkpQUfhnBG6FgzZ7eIbQYfzVmc7/BzBBQsqPR//JG16DeYtfF8YRcRao8uia+SdPBaiNVU1xGZGokmWarD98vi8gB7xgmCIPR8WSH2/+vspMJPEfvFGrywizBPjw8EdTrk26Gu05CK+p33wF+G5kmuY489Uw/wiJJiNCG0eWlBj4Scs0c+bjnR6ghHi+YWZ1YWvHrFdOyvoarLFDBYrwk5HAumrAz5LI7poLXpw7TZc7fE7eZPXYt5+FfY50C5tjAnjB1zGPcRxcnEcw7zHPWYQUwodFDaIdSjlpMvgHOPYjZOAAzOBstEjiaiYEL0wgeXTDAOdCjrdTnp7AlOkAB5N6F0irMBgUoG8C7WxnYEuQ9z2oKdyYC0Gu9BVe+uCjY16BItu3HGV9AQJdMR448MNf7NpYyvUmjozWd7n47OZTpPZKpBhjghW89hQnoYKu2DMMeJRoGLI585AZhFjXliYOZzMvPr0rPGH3Lb1n+/8ApFqdNKcWQvTgqnaaNq+jo35qTPRCWnianOR9ISoK1wXwjhUF3aNG8hpfNdRPA12u/bfuWOXOMX3MZMWEYuSLaeZdInAmKuK7xTziVwxjqXk4ZkfETa58gLO/0ft1sQTSa7YbuYTStI6zIf/f2j3WBmFC/lHt7tytCvH+r880v9P2nxh96ds83l4dWNvj+0X8I8HN+eLv1DfESebGWp7jocI8aeYRwDk9xR3rphzuYfKpaHrx3MO/7Xs5McNHT8bu4s/a0w1PjS950hqErefdjTOGp2cbLbo1SG9HgX0FrMsgP9j1kORNeU0e/LZse6RNGSIilLQ7H76uHDPKjs5bh+LvH+Nn0MlZP67fRygHWScQQs0UTj2abuIT/hpCZq4CLhU/afoosZnZPLDdWz+GBVV6lOJuK5BiHGZJC5qNlU71E3Hthey248d247z24+hg45qkzlKmUSNdkFGB4+WYo5tfxYdAAS6TE9JGj1g4Wq5ZjqSlD5Jx4GsSiEYyAqWNlSseMawtXFu8+DmzYP85lM5lB3EgE18zPoh0pE4WCkFydtows2FvJrNs6QoAIPHBoyHLIHTjJXN54syi4C3vyts4ESg8qq4CMcFM1HJlXChJGDpCFB0oFuA9Ib22REgH4iygQETRBtWvrsyh29wG6TCbyV44lopjQaH8+qA8G7kqDpwNJxOKe9GINWGHBl001QGN031A3VgOI8G8VAqchQNPqsof44W8U9ek/3wjOZ0WBDlaSiM8U00IQ10KKg+aOuZ1WNVDwbRBPQ8mkCKshXcphnDp4KKEiTijE0n0QT15Ci5EplKiNezu6pRF9Tcg/SuiTw45lZqgM9qN1D4P8++O9T49ZyQB5qH8l+B2iFRpZ6h9S5ofDpC78op05IAlRMHBI543Jhzohq3X+KB1vMDZDn71vdhTj2pLldPLhS3XHyNXx9PJnT+ay7eIi5EuXAQNQUzHpvNkwk2oWA41df34kkV+nXygdv1z9z9q0tq6+trL/nV3c/od2nrVfwH9FMEGJvMdXOzoFXabHIKzKU7g+TRoE1lYKxUuKHyQgWWJqD7bsKmXIIJZzJwZMfWw1sHMBewq0/bA3a0euGx7cMMykm2J20lxDTJ4vC4hxkYEgAxfdYaG0CBwoA6xK9apQ6t8i8Ach0NQDFtAzhfLqfw41e0UrYfq5JsdihGFDVBkNW9t5qhFBt+XR0qQFHYvwoFVvmhlAXl8Wf35E3cirGytpPiGjpNj6fKnlFazOOWtfvLLhQKSKLsZqueStd3S/SGhUkHQZeFXKmL3Bmz7JvbZhA3l3rn8Ptssut9NcdW/6B6/PrtE4lHx9sMBvfkxpDkCnXMu3bfi+sHYcvwybCT45BaKPVTNlcLvnq+1Ms3ZYPZa9Pp0VtqDvaLxvzuveoLHiM2W+qvGtjTNmnJwILFU9qjbrbBQJJkqe+7YK5bmOSgfbxppV08e2LpTiZr9/GjpRxHulueUYOZiKPn1GAWRecfh3/q7fWqi7zea+CNJHwnvK7x4tXqt0dPpQGXp1KFqTQQHToJeb3on1gGr/oxZKWFaHozVB6eyrdMLZ4zjNVE2UclAQLGWgq6nGLplKWbM+NJla7pmYxSkF5jeRAs9zOcnAQcFVAh5qQPQIwAaWVOGXHsooBGUyd9QDSi0YjDj3669PLo2ir4AFQPKM34UNDs6BhZK5c9nSE/k30+udCu5yuk5fXC9bLJdyrrM8n4Vb2hsKKEcwPGvcKgr9APaRpb/jmqYYnSGbFc29l14ldl31k1t5+jCZDY5Cu0s7bsLPK7qsZpS7Jc8+LKmmX5PLXB6I4Uz/p6s7BL2EO1JvRIZN1ia3TdqTc8waBHaPXgywq1ZqdPyPucZnCFK2Q8izjMWfL4wljVH64o+c+0AIZzlT4hO0L1VFJASgl2S/WcVYs4imIaVc5IXlEbO0+5a55iDyXWW1GaSIcOBoinT5kOHwwdHTnosImOqQG/yhwwcvAw+fCrBn25/BKcnFW+xz76ypRWNV6No8Hk3LWD4+jIAOGjBn1lY0atidFtGduIcu2V9Y6ucUxFbL6hBhEJIsBJNcfJ2qbAZgNVzAitxzICYxT2hFcrpgVPLA2xr/AHTRZK8Z2Bpzaej555lD8q/AEwJk6P3Zr0eHE/ohspf7DwPpZl+SidCR9A+R/AcVTmf1Z4v/A+c2pB8KBptDJXQJlXFss8SxCdFroYitLyylAKKxwKwAdpDcwD/7UENOEo2Kf3hxzV7gkF7ZoKj8se1PR4EkG7psyTssMJMUp6J0+7zMb9DOs/0jxMMCw7VnwnW4w5Ow9qOluWqUKeqNiuUmvObkOFLtC4tRZp3rG1VPa/id2dJlsQFRdooZI1VsYss1L8tg5J7OlOxHsYbxNGfFQbbpFffFGWV8jVPurwVYPz7BC0e0zb0JPnS14MQSfOOTYeJudFWwtoOKCVrK0e2koqt1jRPoF3rIR5V9f9Fp4rHQ60nlaB6xzDY+Uq6/0OqFm9+rdQtcMPhMwhmaabM6YNlfJe7dwMwJjH6o0lmxEQByIbs6JgCJzJkgWVUsD5m+nmw2NEQMsy49y1R5f9NWf17JFMNn0qWJ9s7Yu19lzNIpuCgfr2uiqUG9P6wbJwOf6n5YcW/dzruEI0TfN6k0Gl2e3fNjVMo+Uu2eGa1DKnaywwjPSJ0l7tpT7ZR0CP8bnLQEjGdHmUxB/nsAyUBFoHNGllcFd0EJ/V+EEI5GgsONQ8eznIvYPFEMe3xrZ3BA5amO5PWRekGUXLPBcLkhIUAaL+WuQpq4l0I40vA/HltJCvXEY3ypTTQj4og//iJrqQNgWObGTLaeORwNgAdL3iuy/y7hHmPfJu5D4aPyYAc+fKXQ5AE86dvRgwWi4zxKTYOU3xR9I2xh5YEEntSqJInVhh5TrT55JDnH3A4DPs3QuPAwb6Nozxv34+yUT0/fEzlf1V5xdPPlt2Wl+Bfdeh4qFxTiHKg+oKurx/LctXwvsgopv8lfLO8wpT/gzyyEhhKVkWmvfUJ2znZzg952B6wckoYnd2ApOrBKCChmk6MkWNHSGwrGDZO3jt9w8sHa7Cf73zWSCjhcDO19Xfqf+q/o4KPcGW0IZqXse7j9xRsF687MAPX8Z/WXlg+MGnUY/6qvpbJmFZi9pRDXXRczB7JgVt6IORKuoOsdnV+GopjbHGVLIQQ6ymJAtZFFGUPiqGUNgWieC76X1In6Kov8H55BScy6X61F+HN4b7IW4/E1bYpyhzlPWQoE/DR1JCvlifxttiRy8q86i0iWIUoZCPFLZFk4kolI8ihWxyypQkzqu/gfqVZErBd0dwNh2hzeiDClCkLwW1IwVqhwyFbXRD51Iwxn1ClmrMo1LHyliPdvAXu0kRlz4oiWo9/ZoVxToCReG7Q5l0hFaXOk9baFs13CJ15kWoM1fS9S4NZrFbZdyrOLZQKe1lCp4wUtSBlP5kLtmPFDp+fRGch7itdDwpj6cvElF/DWPd30/nQoG+R0dwzjyF9yItR+WpLQIcYs6irnkzjmLoqyOYsJfoNZVSUENrHntky5rukCDYrTaTZLKSXamn8feHgMrCHAGqTKVkF+JMdemLtg2uzUwTQ3qr0673wUlZc/S1O9BBiolAKm7UedqitcTjHsHOS8uPyam1oBLeRbcXjen2V4P61ftlTZgWqr8f9cOiv454qFv9KnUbDKj//qIELXrfx9KXhXJpekg+m8ni0gyQ3scyJJWiDJ/5zD3CX4Xrtfadqx3najeTexunIedoN86O2xB8cNxmcyU5TEHTUSyuxzKwlldIGYAoRUV1ZweY/ibVL6EKJMyDBmNtJDBeKEtfrAtDXUSjocbwiWm5p5mYK58vllRSEtVoT0o/pZhOjBUOvuiI3psgaqo7E+EM7IGzzyOU2xtJU20wURKEHzRX+7K+q5rVjxikqx81XwX+6mZkAKcWhQzaIjAUo9SP0B8g+BqIfkR9nalSJx6B8Gsg/tFHSzEowbSzXy/HVJ4HlEaZyKQ4HaUdf6wOPpGTURoAOKqsheAWbcsubfn4yw5z3ux0wsOBHQaD5S2LwWB3Wr5hkYWxeMjp/3jFIjvNr5idMroSbzKJOp1oKhw0WK2luy1oV5Yzc26gludQLMmeCrrsriLel2A3zE53OMmQ50Rc0xur1AnTKCxm6YSdzgnN9EncTQbVfNif94fVtu/c6muCmcO/bIs1+W75dgy9AHgUTC9Mp4ZNff2S3bsv2dCVy3VtoC70dYvjq23oZD6vTmirqq4ma4/UtS1og7+6I4MUDSvBlKZxuPul3XOffXYuvBwan0zS7DjMY3zlUD0vMv4soK5U6CycoFxmkdN4gIjqD1AhOiqYqul90st1TOV2unlqe0MAHOcL6lu/2wmry+uqXu3ci6Sv+bDibFbf/c2bQw/usx7w2FqaumuaGqqwjpDuOd1+rF/28CubMl/9ypcfihqizvqoN9oTsBElqVx+7E6XF1acd7V88zokXrpmSP32po0twpxsfzbUyFtEsxSam26X+WmGROr6nz61PeywEn00YojaPfpVe7aWeBzQQ5GDdZOA1Tr2hsXJNt2ohzE4BdjBPdFant4ljdyTneEmzR8YmD9pKo9W7N+7IqP5eonmGyxLr/PyvD2XLJ41a2ViIIdQw5Ktt31hTSlk9e3FkCIuQcedpzLmQW4SrEslCru+xg8XJTcAO5sLjVHOpHg5OgsBjkonpOHtEXOH3+nSBK+63jn8GfQAOokeKLzod97yFX/Mv3Opk2x07lejhb+o0f1O5370K2xBv9qPs+9tW3fjN6jK8DduXLftvdf/+lc8Oeb/yi1Ov9+5dKf602mhP6jvIvc7oWmhd5Bb/fM7TK92UKIy2XquiuvipnIXAeRnmhFrqmNsOyO0nUXuKqSgYhe0xcE40yqlPH4ZaCHk5hn7mYeTOpxRohlAtHHTvGVroC/P4b0jvUB3ovXqqqsnGRymnbYJ9/3ncqfzEfQqMl+8Mm1wCL5wbZDYIk/ejrw6lHdGZxxSt/3bnJPo6huvf67n0n+e/P17evIbaD9VFV8z0s3/kPDxgunli20zoNi+Kb/cW9df9y6y2S+zmWSHjA1q693vxNFHE/fMqM8u/MIrexwfvPyV6zdnv3ypNnc22J8+ZPAUpBA1lv47e08iyC2VpTwRvezgK+5qYVcyG98ymou7kplwoYi9o/4UV99hj4QIZ++c0XkENibZQh9oD/qhSTIaJYuaMZjN5IVTuZ6emvr6Giq+WxcOF8+kjcJGqvcH27cVySVud1SPGOe7CVGxf6oQxLYhPdLcHgGWvDAwIdt/ZFCw5yQTT6yi+u9qISWYB/QWbNUfHzZiZAC3iL+NiMpbCDbmLDb8yGB/XhhI5vuPFGbJlgERETMaVgvftlsG9Ng4fFyymU2X6VEKEeTR2WzGnFl4arA/S0+yM9odxdmy0CUp6Pnc9RznKUpyR8a8UaW/zLwp7scV6TJj4iKjhB7L5F6wwpaAO4cC6hAaQFk1rw6OdeMh5s7RJ+FoiOZWB0dUaSBNORyx0gIjkSjXnzzFNNhzq3uzvauR9oIQrd5AlmXLZlFgGMpHee0NoTiAAkzqlRofGP4iS0Iz5CuC555mBk8EeA7Q64UB7dlfpGNgPQtDQMVkuC1Up09q5ivEFEp32F0IiJpmMZrO1PKJoKZKgBzlyCAcBbCELZUSDkyYr1ssp8aPds511yYSfROGmHrrKUHUq3l6nx1Y37Yi2R/vTbZXdxSTUC3okrofTXKGa53X2egNNNc0TO1adsmOaVoZYwJLufi6VS9OzMxqqGEshmGLn5YC6wshIlk89c1d0Uu+yuKpHqL6LbK9lKC2s6e5e1Pvih0LliaCLPOoEC35yP0LbIcUNQWEBFaUKMAepkRTSlqhh6CQoeYRuhFVpJO4D9Ur/jaj71X11KQp9mqeCMiATVhqdTV4a41PvHjvh6j/a39Dj5Nm9bPqrz6v++epFh12OxBv463EgnUpT1vzrNjFSDx0+/tfWPv50TR/gmnyupwMKyqdZLD/1JJ4NymfbBfk5n9PPaLOUo98T9PcaOlc1NzYvKizRfNSA0QqYyBSHz/Kh/O576uvvPgi6v2+xmJM9itunndTQojyh68cSVqZrcgfXsG5xKN8gPJyI1KlZZHSHdVBxho+ixv8+rMl7u6zckrG78hyoVpOlfjDQ+JR8m6JP3zW7Z14kPGHz+IG419CGbSsFBQqa4zpZ1mhGm6UgzM6QrWsNBtXzaQTdaFRmq+a3n+Q3fqXLuJS2k2cRq0ywx7ED6Q+vasTOKpHpzNKPAZawoqycqeMslbFl8dZm35Qwjmrmne2O9U8DSvkaRjVuSvlgDXOG0S76ESDaBBwLDvKud1qzu6lwmbGvAE95LWrOY8HsSCUM+X1xpEs6kAF/ygnaDrU7dTGiyZtwRffVGtQEugdcdk4H8PzqLSx1iHew6QumOUO8iP2+lHQe/o9s5ccpvM9DDSmzVaNv/QjjdFtq7KYeAnxX/IpSWbtQ/sjeZXzRsjOToOtlYqy+4wNdZMEkgG32VHnUqTSHVBR38159v1RDeN15PasOp1dtWfPKgRPPLhqDxksMD/J02dgT/lOXFoG5chco0bta+dySd2dSiVRTQkkJUeXLy2rU19oeqz3dL4+VYcWgIvP1qfUY8P51Se61H8WULHiAPxm1YXUrYmZvtq6ENoPb9Q+eOksdavI2/mKxlBeDofzIpOt4RgQjb3KHbm4xXlYZGOuaSuuWflfJ+l6rbiF5bnypas2figrcSSv1VW6Ox57Uzz6XnjcAkdufcfc8hZvdYt2WHQl/SYzYLguOmdBu6aFFbQn7CUfzsEIwE/g/sEBMGoeqkBF5XeGgeI6nYMd7xTQvAWOamSdpqtxhGfRymXZ6ZUGPFRDQj2AbtKXEgWE1ENxHsAr6Yvy6YBkiabP2hS5tinTqqZM71q17Cbhtt/Or1nZkrpido3b7HNtmLb1AZ/3wX/a/N39aycBbdx4bPswk2si+e3HyJNV+thcxdx707IaWdp6Wbztui5Uhfu2WXR8zyK0gqyeuf2xY0sc+okIj+Q6NuouNEz1U4qXevZEJkS3ikxKYXz2kCtRsrSR4Ido/pdfq32nZdrOnuvveuZf/7XwHg1iIglQOF78pwfb2tCP9YMHPv+nwhe1ujQSY8QmDsWrqIZZM9ddpPQqsPZ0SdoqmApyNiUg2twB6iZBABOpUoVeM7wGtCQV8nC0xSx/YTJHw4eofU8+VzTsN/w21YiDbg5/N1u4Wcz1pU5xqb6+lAhP/GW/Y3UvPctjbTomljT87RyqQ91v08w8zH/+hn253GmWQaBPNuezxIOMTp1ZlH+i08zIbdoFOsHMsmYzjkqeIgNNk8RLOsJFa5CZkjplLU+ymwc3yw2NCzYX3+Q7a+z6aH0TGXjLP68x5i9c9sLxZ15/BcUHn3l9N7p8gDTXB9bYzQZxwZKLJ5MXBjdvXtDYIG8uvlXOviYAhwNkjjXO8+Ondr/+zCCKv/L6M8dfUJ8YIE1wyNnXGMS5i1b0amwE7oxVygkfwgzZYV52cce509yIXJfWP+iZveyqsPPjOo+hn09v5qfCyA9iMkFMMogS+bA50HpYdoWKA1HxIFYWVXH2wF4B5WslQKvs/53MJMegiByCI6FvfZ/2VHMW/WNGV32bJHm2y0bD9ZGY0SR5XjI6kKe+4QbJbDTcLxm6bR7TYYOlnNS9gyatb6pMqjPRpKZOq8cISXHuIZMjwe/Eun6L0+m09OvwTj7hMD30kNme4PnutmJEokHkd/AJu/mhT5u+aMroDEPCAYD5VNGh3v8Ng4y8oYbWqUa9SardLq2QTRtbvFbDIwbXxZLuM9V6g2Wee4LiRXZjZVJd7Q3SCodlY3NFUp3R1u9urfdge2Fov81aXbWliiczV7swdq2eSXjwVlttEFHjoRE4HLgEomY24Bk0zlNjJR/+V3KV5UYYLhxhUq82kWHDzBwQTHYSMOFunrEI6D0ILEwJ8IVakUIaVVyOiqEAXbFhgEpYu9RM0MvqN/9l6YqbHw3HiVHGgLRjgYhICNtqXIab730ZTUe3oum4896bDa4aW1hAItVXhGROUzz86M0rlqr/+f322iMotvWWOzy3HSJ3q39+b69teUwPlCeRRJGXCBXbcEVi3lk/3X73e3v3Fvbu+MksbyziUkQEkbwoSsRiQ5I+tty2h1+xZNWHd8ztm/lmGe9munOd3KYRazOI3o4m0/R+vkwJwREOPaUkJvSrG8GBQ3lksCKdbGWwn9iE6SCN7Kd0UVLKieqcQAIqGq2ZpOGPzourgwPZAZ830uDO8ErVhHBD1BYImCM1LZ5W4We7b8wLtSFHymkNNOUm6RXATr9wT/iSgW/etNWtDtH9EznCa9sneT1KUzSx5I4ZrS+sO6zZrMG5xNz2H3asWe274TNNnmlCPJAKhR2FnChZdXY8+zlfrW32nEB8elWXHa0KXzwnGJ471eVeO/fuIxObYn0pnEv1eXf3papu3NMYmbJv2yWXH+bKNpiYLGk3pS0rdrQom2s2HmmNYyJZBG3EBKrnhz10I1dSVJmVnoilbY6JjVIbW+XjB6CGbmGSqzyk5fFqClidKUeoVlizLLf7Z0Krp6UmYg4EbNGG8IQqhc+4GyJeHwwoGojPyx1e90JrKHTHkkS0Pmb0yq0da8PqB2zQAu6tuVeu3rz/i6iTKPpJvKZkqXKhVcjeVTU9XqdEZttqfRctmo3tOqskFnKOcCgViAvTPE2fucG3ek3HD9vnxq86fPklN0ybPiUSXLN4qSs+d7dXG7fYhAlP7hXmrnW7ps4NB2cXcYIvkiyjyQFXOsu6L8mOtd4rDJ363tnmeSvXJtV/nUxvKZsJo9TpQNZbCBybQBNlinjmGJvJYq5p6sCqdTvWzvI6uh3eWWt3rFs1MLXpm3g6nvZy7p3CA45z2FMmX1h48+xmW2LuVL/b7Z86N2Frnn3zwue/WXgDt7z8PDWq7BjP3HIZJxcDsJfEKD4XcbotuBLXcBUDinKa7biWlG/Mysm0GzKcw0iwmlUmpUktSxW9lPeBqOVtu2jgyaBcGKKCiFlGmOTptVlggA+4fGZNMF02M8/q3kK2dzXmJSOOJ2kWSBwo2jgIALJbGCrpAWu4LrVFBXRjJmEPwc7HTm3tVoBKUdRLiVTITcDNDmLXWDT0/T/+8SM0Y+vsmZNRxyw8+48Hdtw1G/+RkD9K1s4JW9HJStRzJ/7am8lp05KJ6dOHn0P3PvrktrW9hf1oj+IITXoCX1+JbTLeN7OZYqQy9UhDJ+wMn6ANIBZqCixKGAWUTtiLxB2l+OywCw0Bhgd/GOhMdXEC202oWuhXN/qUJy4vm15MXv4EHkRMtIPZJVP/CQjRGpO9Gr2j+G76HuY0Ok/lvlemv+heGh3P/m+NZt+3UtC/bIVxvHu/EZFczBpQyJblj5l5NCp4+kJhq3b9h/e/IGuiinhAzZcEcVnCkhAuM8hIFlGhRpaP3QLSfPQ6csTGlIfC6TlgUF/uU1IBTKeorRAKNmKKfGpBbn48EETXH9tOFdkZzCLWE3WoCLPFMMD0Hx0fFFGikK2AXJzXIFengXWZ3qey72ZuNr1vSAH1546kgk4JTieXUzvBELv4Kc2DdkfCdmVqT6TIWEpVUMXoB3POcMf575zh5txzPLf4nte3NKaUmq6pfdsclmGYkm19U7tqlFTjltfvWdwWQwFoGWV1BmJt+J6nfzIw7/mPBn7ydM3zJ3Iz7986X0g31M9NpOesnK5ZmJm+ck46Mbe+IS3M33r/zFysTeNh0stQfYXOAqVs6gCeJnBx7jbuASpfG1WoWQTtmUlHi35PGrrB3sxfS1U4nBkakkZUe8LldIATzigLprcW0GF2IkNCZoCKzl9GydA7UZjnbuxx07PHQiRNVRsqcoyFZyzxkl6An0cAHEQSxBYsSYhIOjdGRNQJ4kps1PPwazYZurAbYye+XdN1+O6jDjsS5eSEJp2nHgtGYrSIjkaTrWlCwCL5Js2ZFU15a+SZVb72/e3GUL9c4035m7JdSgjZHY9+F3GV+wVaIEpQtyQ1S4TX6Qg/iecxLxAsIwlLOkmcKfFEgh9vs1mhxToeTWeqISefU/+/JLGZkk2IIH2dr8OKBKNO4qvdfr8ktrjFqtTlM+a3d88Rq202u11y14pzutvnT16WCtv4umxsDTbZSBIZ8Z2Ve1LJdkKezR3bB85vv48Z2kxnKLhp9+taFLVoVmTBncuC3+ddl3chrutyF/o8M+LXSIUvqeTlGY4aN0N5B8xZvk45hxG/tlmz2trwQKy0TGOAqeZlWc3Wls9Z4QzA4CTucnrOMtVkig+ya2Cmlg+EFdU4djGRDmdJMZwiMI6ME2uGfrS0LKPGY9MkBrW0DLTgdAYUeZfFaDLoDAZeL89zdv6po+mqqW17pwzsmlTl9rq9l1VNfnvyi1fd9vPtuf3Dj938g8m/bYOw2WvdVeHZuaXzHv32zs4/tsv9zoVz4AQ0YZsDvzrh7upa/0SfZ6U74kD6Vo/XnZ40+9//47bYYINn2YQad1144i+Q8+5n1W+ezkyoqbl2tne5J3ak4dqfn/jalI6uea2GtUs8Kzxmrz7Ax56olIWgun5ORpsCPc6QN44uJ75ovIjZlqV9wnTbKXbPU0s001nUiamGhpBzGl1rV6+qTvbULdCvmbtL/WB+a4jUGh1Soi1etazaIjlCRiVgJTWWyVMnGyQX6v/uXlxvqdY72uKdTktNI181eYY8QyQoVr2sKt6WkBzGWhJqnY8cu+au0S+o60lWr1q91mV0EhHSTa7iG2sszs54m0NfbanHe7/bj1ySAcq21BBrQDGGHFLpDCvbkOUupJjGD4zoh6z+txEVku3HBK507tC4wZEI7dzWbJiImj1DO8p4kHxeYya5YQ49d/HF6DnTOa2acKcVdOiii9T1worz2zcZ4bHN5JYxHJKPUrsU9PKfGjFAZQEA6hQAvWG2oIHy4Ty1AjPYdzajjQ9Map4oCn63wdoUbjBLsslNLr+3DZtFqWFSg8FJiNdX7TEYW1PN0wTBLDlwJ5r8WbHV0VAVtk0+6HKP2daWGQ2eap+XEKcB8kuiGWfuu5y4TbJkbgg3WQ1uvyBObJ4U4N2ug5Nt4aoGR6v4WfW1TuyQzIIwrTlFJlfuS4jKYolL4HyfxLiKsPawBfEapUrvsbVXF3J72N23m/cU7WtR/mNaXDL1UtT/2JvqT7+g/ufboaa3X7j6aF3Q39S4+eC0eb3zJtyIVr6qO37H/oFNA5GrL+HXrZlu8d+uFj74X5se4PfhWy4TjJ4vbeMVMuHexcv7HvqKQQnfcfxK1+TrewyMPrj0TI78C+BNjP/NOIRBEqL2ZuzaXRv5lyeWdqJIVFVPnOHOvPHFg8Lf1H/MmnVc/WVBj/+OYr9+6XWO6TqfeY7N6xJuFXcFt4G7ntvJ3c7dpUnZuJycJGpbUbSbp9QaHJhWKmLdDOiBh25FxEPRBCoBgloAya1FlG8EP9KD2CYHaz2VdMjlI7fyPcpLj+akVO9yZuIZGlcS3FF/86dqH0pOXnnZlIb5kYn+9VHlklcvsaWu80+MzG/IXrZyctTgau2d4pE7nE6XTTRJkrvJYDB3z5rq9iBf9Z/U35y4iBgMhBj0IUlvEOEX1ut1er0jrjOZdHqzaQqxAY1rnWq32W3t2GbjA0wS6Cen1WvnCl4HOdh12UTRm56/+6Lty1Zu0ce8Xp/PGJio37Jy2faLbl+Q9orhqQZDU0MgxhO9xSIIhjaPR2kxI55X1vIOrzAXPXD6J+iy4V2SQAQ4en2CUS8KRoMimcyS4AvrjCY9/GxGgXfzomTGRjN2GTHx6kbddURGWaZW6KQnRtvrodgYYC5iTvHBGXXo5KGBkY8MAFbObO6QfEnXgNrkybfFKqwefoOa5Cnx7IvfWqkq2iEr8abLdbkY1FF2h53pQ9BNL5OidtSCLnGI7mOakq1ZFnOy2Sx/DM8BxOUQlLu6d0StFoKHhszyaU4244HCoFmm5tJymkyMoOkAB6lV37IGsFtjctJjhHE1KQcTVp/bIZRjMBceiTMxO/SaQjDejGVHzZ1VYexWv/lOVdBl9wmDKLzlujuxGTsd/vt8EWT6svo79ZZfVIWcDh9BIvo/L33zTaRpCavf8ztdwap30HQ3DlfdWeOwm++8bov61tPVTmeo6hdoN6r5shlFqu4DQsn85jdfUoNFPVOueLdWxzVQDIcbc7/mGfttmWDJ/HLFvllhrZa3tfS2tPSiFvZ6qlJh+XScf/wJ3msZ/ovFy/Nf0kba9j37qgyxZFbZv2dDl/Vq2ejfhyWDy1TV+330W7Pdbi7cWiSRs1VxvDrV25sqPB1nZ8Buxkdo5pIMGihVCD8uYoE90ILgmLYgeq6nM2Vr5wEKNMTOCXZezFFWSn9SvVTd1t7LK07RMalFqXn2C83SRLmaGOw7WZ1D6Cvo9WR/Tr1B3YduJDnG9032o5VBefWGaHBKoqOhtj1e3ei5rfOGJVvSq3upjdFcf3I4TF5Sf9qg/qWR8Z2yZziR3qUZAX6nAGGeZDhVPaVnUJCzJ5sBMcAuGyNs2AcK6BDTPc6R0ax6UjaSg25w5H5bx0WBq2YXbhCc6ketKx556ZEVrXweOpKFBaZmk/3xRcu7on9+Rde2oE33yp+jXcsXvRC4qMNmm30VakUTsDOxcU1Pz5qNicJ76slkP111/cnGVQc/95e7DyPBLzvp8nPKfvX04bv/8rmDq9iax4BLqsItjDYDykK0sicV6ZeYzLXETKzTZw9jodJnJq0965jVR/r0uLUnzQ35hYF9tQZT7OWUqa6m4aVWQ4NJqnPeeae/scHQ+lJDTZ0p9XLMZKjdNyZVQ82dd9Y0jE6Dc2OyYTfNZmwYydboH110g8FUd/fdtUbDqDTlb5LRdZ7i1o3lpzKpQqo+IxVvNyiDEPa9Sn5qiUUoFhmqRU3eEq7RLVA8k9dufYJlbqpwdF68kK8N114809vrNcdmzaydPjMQmPXK9xYeL3JRUR9A4sNXH+ODjJP6meOf7SiyUQMGj9dVbfHiKSFzrL6lR7nlGTe6oZKZ6pycWtw0tevuCa7swoVVkwu5bLaSidqfuvpw92SNgzq9Q2ME6mW73+onczKuRd3Z0B07p3Ue5irGJwW74BaOiyTsml0i9p+aDGM0gYt9rA12D4p6eUR638mo9240hoxiVEYP0i5iNFIjEdRQFyqO56kVGX42EAiEpnTGanT8rJjFi2SH26WbeTEMVyEfn9efRH0aZ5W/bNmSV19B6zRSqy+lDnV89pVd976AUBcJ8seufvjwOnSD+5lblJ6W+pg5NAV7LdUur8eAAqm+HM55441BvbAw6wbCIKh4uqY2LU5Nds5NJPsZYzUwZ7bNG7hoUTarFAe2AOPUMf2x/UL/lW7X5O7DV191uHPazjtC2e5FrswcAuNnl/V9XKX9/yJc8aVhoKYamlE9uyOW7NrNp52Z79W+dsf+s6ONMerFilOvWShSLmntW4GMOQL4C8X6SmTn0VHTnDwLEjBAQo5OeWH8Kb9qBDBWaJ8y7KyEx3MB7dJPAJ1lUB41Pkmuk36vkeqpMSEAxvuh/y28BkE4YWfEaspOcV43rDbqw2WrE7Aviey+h92zUnXUosFaJv1VoUVKqbhstnCeWW+ePDLpuSIVX5zs9BQ62ek5N945ZrLZ2umYjrMAiLMuBLUhDWhJFxvawjQNUmul80NqEa5H00J1DCti+piZdFH1UBKddQjRLwzQkDH6mVQYWjUcl+WV9NsBh1Y6HCvRenCC4zj6iGqEjqexeVxTVKTpIal6CHKB4/j5dThZ27gk/fgT1YWERpV1RlkT3fEMylRqHAoCK1trjGpgGOJHxaai9SuReWzT1qZZ64uN8Y00FFKr59TTLLYrquloIq0pPaisVcs+zhAera95Vs/LlSHL2FZdyVrrOEdfChdqVwsbrrJwqKZI6vQg1qxRNlCoHuk4PXewUTm7XVeMzPI4MMCdOZ8enBH9Enu50XoPFiTFNevOcL4rlI3Sg0Ql6pSSihgtkeT1FhRSYDVDYkpppZVogkVJQKe53PR4oFFAh7kt2Eqzw3+J/mjqbpSi15AhN5P7hyPXnY66WQrRo1gQraGeFpmmBTLsz02N6YluidLGlBik0s1pJoIjaYV4Mm6PQoUCgH6M0iOd8n0ybinNsBPaLncGthTJA2+xyBRC4KHGHhkfKJPWDFnHa6EiFhuKuzVuEbP3RxkNUFRGi6OEuDuTTolRQPco45rlpaMkuurpJWw3URg/jspsUhq+G7FQ5GZCEiF3mtKkSsadYZXDrkfb2Y0A8UqmIIN2SxuNZ+oBV0/TrJS7TF/pJJuQdIixm2GM6FshaSb+Hk0X7T5KFuKhTEJm3VKBBBaeuqAltQzbozYh4W+sBguZhq0iFgQk2ixKvR17CPESbDIiUW/BBoOIsBUjQgRRJyEiEhETI7HaDKKeSAKyOokuCW8Jmf088QE5KmEkCjwxypQvLQrhqqAoSiaCiR6ZJBKyCmZeb5AFC9Gb9DxvsuoMyG7TIb2g0xG/Qa6WqkUBGQ1mbBGx2QA1CoKOSAED77ULPI8IbyHNraIo2HC9TrCIEnRIwrzVorOJBy6WBB4DYS6iJhkTM7IhIknQOkzsZnMQWu4wQZU67EGIIFJFEOZF7LNiImCsg1zEYHFi0abTu0VBxNhschKhWmcw2QWrXwrLWDBKWPAJkNCps9Q5BIIxr8ciQk4suAVihnHCSC9io0mWEL3yr5fMMhUmMPGYNh6GEUlNolUSsOAlVQKBngkGbNRJOkT/WSWDAVnsvEuUeATDrZcEQdCbdJJQRyRMeDe2E+IwG2zEpCd2bHXbj594gMjEISJJbyPYwBtFiU4VRi6rYNIbRQHDYhKIVW/hzRjmDsuYJ5JcjXmbDZ2loKR+D9mRwYQknSjqZOxGABZuZDMDSGEYer2XCNATSRQMBowQjCtGgsgj3ibyeh0W9Lyol4loESS7WWfjdS6R3QPA2FirBJ3ebNYLyGIloodOrNXEWwUvjKWBKlc4oAIAB+QBuKtCVp0FmawwZpJegkADj2BeeScvVPF6gqAFOmgGDLfVB03QI4sk2PQ8EUWTSCwwkgvulRCyQReMyG/nYc4sMI0oEOWRaSIhMR3ClF8SEkW/HjYzmgc7G6t4wcUTqE1y2dxYrHbpdWFRMosGDIPOQ1/reVmHzA4jER0iL+i8mNRYg0gPcCM5eJ2X6DFAMUAA4Ao2swlaIBOrjhDM6xpthqDdhq0EUfulAI1ELxrNyC5UOwhPAHyJYDHEwGU3Sjq9Xkccsh4JOl626aEmI7Fhk0GnkyQRw6gKOmTksRl6ACsNYYMoDN8efgTqAWTBRFurg2mmkEagAlhWWBQAiqtEWLlGrCe8DTpDDHFznb3K6ualah3TjnCdcYm3MprJRTUhSyi+vqiRS+VXawHMmcQEZ+PYtyickuDyaJ+j0FAr/LnCUqqjul5R8LHow/gtT8u792jKQO27Jths6m++JTx4k95qL96F/B6SRzZSLVZ8bM3DaH906h3PaUylYK2x3nhsaANZOdPJVX6TU9PjqIbTtQMol2AqiEq/C3zLdayf5yjur+Z4bhhcVJoQfyJLkMxMP/wNZ0tsL2r+4g/n8lDaWwDa+yaBY3Kqbqls5o4qHLNvRcWFm+x1qsys253hZFWmH4ESuEb+Vw01qlzwMcN2nOxDf0Dv1zRQpWK+fM9NmNxlC/teScUYBF0lm1MhV5B9h2Ds1SqmXxDg+OK3VegVPP0Q+sAZKPtjbnUvGtBYeGigd7XA5QqcGtDYKYO0a4MwBFTxJNe7WjMKXvpedpGnz+kxZRO4Rr4MpGcnUInxlKZKQVLpI0aazSwrBEW18aAZWaxA1CfQ5fdDp0sfDLpffUJ94n46QMWPAd2PLocA2WcyxegdGkuDLodM7EtaeZ/CLICR342frzY6Jhc1AEZz0RSsbpaC1i3Imlwlx+yc27lJ3GRuCreYW8m4+ZRAsWmchAw1rF2WaReo9It28ySUuHSlr1cz0xFMXIkJEENeXEyBFz591R2LNt8s9u3omNor8LkDNw4fuvGA5AqkZ6ztMvQuuOOuOxb0GrrWzkgHXNKwZpePLC1Kx5Lg5kV3XPX0QqF3aseOPvFmTfgRAxQunIcua2zyRGruLlh23H33jtTabVdcOjXWlGqCv9jUS6/YtlaIM9lCta74qezCU/MW3iRsu7sm4mlqROtZZElP7X5xs/AhF+SmclcXraUAKVzLM7INSLERwy5pVDL8UgrLlESDiCfNaZr42j4TLdoAKCqPUR6Lh7mEF/xv+GONtSRglKW2mLXKZ6ojQf+J6oaY/6C/MMV/wh+L1hz0+9+obhibiuy66ODiHTcuPrF4+fKlO3cseWPJGD/KxqD0AKkz+aqssTZJNoK7Meb/cbXvgB//CRz+6gP+KCSqrhudqPD2h4sPLL7ox4t33LR0+XIoebS3aOMyx2x7cxpccNRACzWpSD+IpV3DSrVIyr391Ok8bJf3bsVowsknEeqYMbD+UMNtz6PcU2/DHrrnN2m/9SSa8MK93YfW9/XU/gTojethzZmZfn2QWn1nUJfRJPuLkjZN9BgIomjKHrK7hL+3TV9/Ord+ehv6e7ZkWkvxZdX31A/xv6ofOnPLL96162JShe4ryqRtmaYuRl+si6D71C0RbdtBRdlMiZvHreLWczu4O7j9XNnmv4AYf5HtcQw5txSXOsPZE0wwl8lo1rNvyLDraIZtUyHh4qRT5mKameFm5EQiTrqZySAoi/qotRUohFlxRxLkiiKXxIz5gztDayUa4wxtRKf9RKjNmW12S2HeNToecOI1i/c8cNfSFUZpzaI9BxZP05t37jTrpy0+sGfRGkloaLpo7wN7Fq+RIKXuGvxli91mztUKxH96VXN84aor5kS1V/PCeHN0zhWrtBeyDAQt833EIgCe9IsBPAQ75qAecD4L7yMDucI/voSNWDskfep1znDIlgWUb3cvjya1zr0ntWTekpv6700tqTPrZ8/Wm+uWpO7t79gYnb8kee/c1kmI70W7dVLWFgo79zXuSXSE6aPQkdjTGGYPPNhuDDt1LT5iA7QI/XsAZ7Pqwi0DOszzNt6n5rPo8D7Ca/cw2rlRx9VzES5Bvywx6h6meEKWtFVc9nRCQkE9Csr0ECl+ojOZLnvEwdKNUGGIfhEC0U9CULsC0zpz6s9RU4E9v4s6VWaZAHMx8kvNyZdNCqBA8dsTkBnKUL8e+7n6c/x59efqZ1En1SmiX61AXGxg+B98TvMxnjZ/Zo9ws3AzswLtLFnV0Cx3FAX0i1obiDGbkhV+15j0ws1PbrvziuG/b3nrqSevx5cYumxmQ+Hp+VeuP9BPdD2Lskt6Ct/01dcoVehRQ7fNZFCv7Llu0fIuPP2Kh7c9eQXRXf/4U/+2pfC0wWTrMuBL5x5af3X/8N97lmQX9eDpXqUmUK1eCXHdBvRo1/JF10Fha0bJ9lEd7enaNz6YPB/7fsyIXr89UWJ5jdVBHatz56FYGv0gEEdyOadB/aOh1ardyOVguAkMt5qr0AzOlb9Nyobf64+xjxPlLJMMqMrgLCn2n+Y0SxGYq7jdkYdZrMC+Wqr+yT8wSvdkXDt8ldfr/MBotRXtfo7da2n2jj+1Ze/Rdv7O5a6w3v2H8ZzsjM9L1A6Ddr8W5TIUoylpsDlKt4ZjaufOEX62VWl2b6j9CR9W3rSdyo0TWOl+g2VD92sGhgfLhpTJ78aGoBFL09qwWplu6d+5Wljx/bBrb+Ruhu2ArYKMtjqkaDfOpOrFEPuQFZxHsivImK7afUm0m10OU2ZuInW2IfJgKpGk2KYoRTMJ+wUH4ZZNC9f3Tp40uabpap9uUli2TbGtR3MvTXRi9ZDY0tvbUlPVHLrIe2n77CumLZqOdgl/1sbBYdEGSv3SBoR1jTPvWi+8VxlTOVpLFqzqXT6xxp/VtRmmNjgQTh1efr1pDs4+FXYkliSbJniqqts7EpMXz4wvbs5Udarf0sbM4pDJDZdf3nCkwWSP9O9SN6q3lCPGjOvIXYqVS3Fr2V46SrgxoinHpDWjsNoHJKgyDTvYypcDJFi0llu6jdMUWijenMpo0kqeoq03Kv0lMkXlj5kUI/qO39N6x2cQH9/We63BaBFMSyzx1PKd102b2tv78+nr2iPvocekBk9rZNaC2Qtuum7h/slWHaUbr7TWWoXQxKbujtnZvrkTWxbW49zIt/eyoYlrVryY2yWbwsqCmzod1UBTPtS2sqN9+eypU7udzX7vGS6aunZtW2uoudXh8sRsJp3FvLG1VolMwPVzFN3kSNjlrvZ1dk1bMrumgi96OdW2l5UWzRAu61M8I3lcojYgbpdHruit1uNmbcisCEDL4854yoNF07tl98jIaXdYsOFElbF2DVsjOmKu7kzuqV+6aGttWy3CndlO2YyQRZwY6lp+8bplbU2t9rDdJVmB5pbrm66w4CWv9+8AWn9idLZoJTqL6LL6lDl9GzYdeG7b9s4ut81eJSx1WEY+oy4EMV6OeIkAjW/J6vVVlhvMUfEd9U83z+sItvgdwbC/rX324/PXHFzaMdUVQpgsNRAzVsyS14SMotUnxYyyeud3NvU3T2mfHAg2t/T1b1/wBJr7clX41O2luXFwnKEswzH2mwL3cU9pFiMq+24f4x87Nv/T/rH1jf1GKP1OecUn6ivco2NU7txxnzxlpZuSu0wWQaAicWWbhujeslMdcRLLeKEXTFBRGJpX+YVRug9Xn3msaI9CZvqSTdTCBxC+KMzkvVvKdkwjnv/L25sAtlGcfeM7s5fOlbSry5It67Akx2dsWZJvK7FzOHES507IZXI6DpCbQEKCCKGQcIUA4SbmKtCQQrl5Ca3aAqXc4YVSWmhNS3kLLUfblwKxtfnPzK4OHyG87//7Poi1s7uzuzOzszPPM8/z/H54pGgD4DRb5ocguEH+PSwTT54UY+KLoshyeHvylZUrPR70By56/vnmZvRH/0E9kr5TTdDPkmvfieFr0aUxfK344nXkpGelPESua34+vVw9Aj1qgqw9JLLyv5lyUjPyLOwYCxqreNmwHItVYEIBxSGC/CIBTFH8kCDTSmNAKAKPEckFe8uvguSdRu0vtazi2g+6NJLgM4RprJRiTTZBhw0+QdIgxR0wWsn4otTm7g+5GKTJKLEAEAmL6Hpj+sdkl0kNUSaHoKUBwL4S+A8AWis4TBjTVBOzV7v96CaulAIgkJNhplEZHAY8EGHVHocYEZAiGsf/KkYIlQVTESkxh15UjX110JwD4zVg6w6HLXEnNm5okrSV1r6WC3/au+NP16x/8uIl5d0zPBpogJwlcuLBmx7cv6FlmqAJOmK1rQsKVlmY1+UMeuhssk7rXTbF/5Nww/4vD295aU9jz+4ftPfe6TV4+fGcw9py1k3v3Xvpjz5f2BLYvri4duKW+Z018vLJG5aAiz45oViBcnXrypP7M7UTFXIwtXJk8P3OymXwppT44XT5fIe2wra++Ym/TN71ZF/vE7vPKp81w2hjdCxnqX3j/hvvv7yvGVfOHq1pme9c6bQ8lR9jvHOR/+FwPQj/ad4dF3Y29Oy6bOLa272sTqiwOKTWRYffufuSB/6+sNm/fWFxzYTNc6fWyCtX35oNRM7ZttxEXsPYiT5bRFDhBGodcVxqMxZ0gpFoIIpkHFvEFhkpodI3cvLh92j3+PmxVVddtWppS+85N/YPDPTf9wpYfO6556H/gJgvw8IdrtA+Z10scM1L1zStWY1XX97agbOdBy8bJt3i+e8eLcUuU7GArTCPFNvr4Ikrt5X0MDrui/rsQRsWwwLRSDRiY+/4sfzTN2+Uv3x+27bngflG4HntV9sf3nVi584Tu+ZeeVZ7MYf0qscN9KoTb5048Rbc+Kb87FM4IygD5ue3pX62+aJ3ht65qGrSopmBobY2nOfEiewaIsZoMFCFVAXRBAl1Ke+I4SCjEiTq+atgXSusRTqFRfmCcdiOzVc3akTH0fPJLTfMKDPidcWyGXsO75lRpmxgWd/hwST+7pjk4U9Drm/JigOPAYWTPSC1vztolQc+vurgRTNnXnRQ2chlkMIXyOSXTuT4gkIq1gCD9BvKmImSIXgGqBgMJckJjNaZkAhZEn0WSUsgJdVlcB6Q2kjRCeVaUgUVAQEDkAwRzIEUxhxIAeIrISkO+cq1CSoJMUKAMcusq0IbYM0+9yAmkX8fKcOnnIQJJq/MCpCgA8AEKbPyLBx+kyl8SH3u8NiaIoqK+IhvZBDzQY6eW/thTzopseemk7BHoc7OzndMcrDfKHmZnsGkxLyWz0OC+2eKUbDn3CNbVRzRTsPbODSi2X6X1xJjtCF5DnrcGd/dsBup19KUWsYzvDt65HNz8cQujEaS++7tDsbhgU2Q2L6DMQwdRvECUw5JYEEJseKqNFHKQnlFA+i7vGHK+REAIudPafgRmNpQvrJTvmKpbkJ5S8yBpudYS/kE3RL5R/7W8+bOYFMTVtCNQx8TL3xXTejfq8qqa2qqy3b9IQwWzDoYkQcTfHVRiSiWFFXzic+cZde3zexdTt75I2g8O4fE/ZWr+BZ2xVUXexOSFX2Fot5m8YnmauCzBUiIJVgmPwlWgHXz4JzV6364mrlWfmr2grb5Nr38FBL7QSe0lk1Z13b0TfraIR/9R1DbuXJl57Szzx76IP0SFNfvmBTxRNLvgmvBl+PHH/SOry/+c+a9KeNrHZkTcTh2STiEw/8jeNUN+/SQuYPjRyzzY4A/BqnmO1+XP7r9Ifnlc3mg2a8zmfnOt3f0Pndg9uwDz/WufHzy/ryV+b0bgHT97aDwdbpQfkn+6PWd1+3TFWgOaKFuRS/K/ia6asrEA3kr95es2bjzdVTG0lM27m/sb7FPm28YaC0OTvVwON6XVY+1MiQcmnWoXaiKw8gBrLp2JDAktIQNY+zbDBbs34IbCO/ujaHyU9QeoVSANsbMaOhC2q13iS5jaaHcW6jV2vUe2hPSmS06C2eFggCWjpUV3DxG1j2AKserVBuC0eA5wSDAlrFygJ4lQCuHMpl1IXSB3q7VkpUyI7qV3o1uqkE3t0H0GPSs0VlRqcbIuucUVY7qEs5heCj+xJi9FVs2pudiq7PCnBSrAjiKnfh7YC7hkhE5Mh5xwMwrdh9LhvkdJAkLMtArm6/XcO7aKn5N83KztfvWA1ZzBVxJzqRfIRuo5rvyailw8gcB6WqMZgXOAV1fXgPImelQpUc+Ava4KgW3S97LzmiecaC0e0bzFkHJ8QrZbFfypeTBPxQVfQC4J/FNrvlSfjwzLiiYW3Y8/1FIUEOyD4ak52MKGn1JzBxicmBcGH5gOBoXAYnuknvlO05cu3eh21l1867yhkktr4JVJ06A2XkYXazJOQqk60twO/gruJ1JXvn3/ZtemVbbs2R22zkhTnPl34H491/lgLtsljFwu34MwkeP5tYgcOxGI7U6vxbZOtSF8Fv4DhQF8N34CUj8oxfLr8v/vqOv5+yAv7AiOnP6LUB3xx3pOzFuwvEzoCuwjd8LVeEaJtn76No5N9fXz7NKxTqh99FXH/3r/r+fAWph8JszoyzsuuAEGh/AKYq+CI1hPsUOqxgg4hKrGCdUZ3g0StBBHPCyXdSnPzIWMTqLhXlB7mM0olFkf804zWCq5GKPgqs0jES/bHUO7iqAbKGZLl0D9CYn3SCIBRaNTq5ZCfO5P+YPXw9FSg+ST0eSI495jBhuA7kJXsHzsflUFEGeqi9VQgp7ZIqsyI6511UHlX0SeFjaAzFyX2l9fjhiKpXJPcZeXVcqcy0+muqqS9XnZJMU0mZnUYtVuSjj8I6RcyyxWmWVEatNXMYUhL3JwIhdMpkpuAQxCs8a2CQEbCE/T25HJ29+8+ZQXWjm6pm+VtonGfWGmkWNHReU8zZGbxH1jI0v33HFDrIrWsjuBR2Ni2oMeqMEKqlTYP5PrwLGgft8IE2VVZRh39/n08d7b765F4swtTNn1sIOfcgo6aqqpjXrSjiLhSvRNU/LT1dV6SQjC58Cliu6r//zAQjfWgnhSiyUMlm7igZpxG6sgbA+xZbiG7VY4svGcLcMJ0Uhq/c0kmzxurucxOyMabKaCVOoDhQol9+BVM7YUl/KoJTNhOeCJF7KB/3Am8WKTZ+L8s9Pk3feryzTY9OK0YTmg56sXEm4YMxUKbWU2CZJWLmqM6HmV6MarApTdiRG9N24FXu4ZaExsGZIArbIm8v8YXfyKFEdIByQXNI5dbhctaum90/aePmByzdO6tCN0yWNHxmTaNuRXFfZ1MxUFxRUGtuqrN3Lu61VbcbKgoJqprmpct3i65766VPXLabJymtVLbqbt6tu6kWzKitnXTR1zSx9hf6W6667BW1mrbltc03X1trCWNDtDtYVOZxVtRV1dRW1VU5HUR0+Fius3dpVs/m2VUc3T5iw+SgZ/xXsWReJQSHL1DnbkMIjSdwlzHm4lKFcoLoCZ2Y82S8ZDQb551otSBCqyB5MhkhQJk/2E5TfHgVFEvSgWqB/OpQPMy4mMEKkBH0ZsEiytJyFhMxgBBJuoiiJAS7PWYAytixMEMh+h12ZpURhgNx4AJNR9mAyyhU6mLE2X3U+tjbfDuimKSv6Do/bez/sEUTQQ+w8/YQBsx9Va4XhbWKD3vt+3GN8G1T8+GDr4b6u1uITo8sYJo7LCj5F1g83oiJCnLaM+DGoFe7S5RX2O8rYL+CaoPwGgyDKpI1BjyR/dppCZvq7Gv+1iOrJWXTYrK8GHUdfKQEpUEAJcBSmN446AP56M2hmYTIcDdsPheuwD6aHyTp2KKZeJqS4beiDjb0d9sbJm/o3TWko2Acm7yvoO+yt7673dvV2ke2kJgAYnaajtzGol1OqG8fviAl794UHDlzYsefw1iWmuo5XrKtbujdt6m5ZbX2ltbi3t7g1cbhvcVEZ/rjLihZjvIzcXscOv25CcV2ZZFqy9fAe+reqQ0c2tlxpixk5SS+O1B+LlfGWYMISlWKUmH3IF4HepTem+OKTNSHl7eFwYZtyhkgStdmwhSkNCnz0ve+HXJzO0hzAbu++4uNAc7zYh9OBZouOc4XevxcfapiCWodWnA4SrStt8vYjH354ZJ/1twcJpIanBElxonweWb07JKKdEg/E/GAHf2vdRw5eaVvZippG5fpU7KpYmw0qvlFsDh4d6U6RrCuUiqEeyXhEyf0E1ZHpH6KSigsUpPYtTaCDTBKDxu1bSqP0IJK3FM+ngaHU0n0stQ+1aS5GLDIiQuz7R4XRie8ZCPa9Ar8U2TChyvZ+8qZJZYFP6fSow5aP4Fvlkpu6E4nub7/kqcN9g1TfYT7x4ZHEvqUY7RIvwhyhx/dvkpPpFHo+o0V9yovbCw5gdq4cFnolNVGRBvhshKnSpUiXsSvYK8PTbDZnnrQDk1MaCPB/w5R8GAUcxUKR42iYOL4Pu9qxqXQSfRZDX+GPgNajDwUq8LA9xBmvf2T6W8KZAdHoTXv3HVfsvkr8ioRmAwUDdy5hNLCNNLLzFh/mRAXqDG/JAeQq+dgRVsCRVkH2OPZzUC3vydKewn3gAp1B/pUBrCLuDRQGHc5AzggiHMik8o+KArOvsKd0MInvwhErfId8RZEBNBhOigyFxYGTFN2TMRoJ/Tnr3ikql8YR31n8+tG2pIepn1FvUH+kvkASlAkUg0rQMpq3Ojpinx2xPzL/SN7qkefPtP//+voz5R9ZX4wIbsl4W47CYsK80lkxLYfXTeXSp/LS9GmOny79fyM/PM3x4WXG+Km4bgQYi8pnfx/I1vRfoyuedyz9rzEOjpX6P5VRHutg7ufk9Rh0dEAR4PLcgfEK5Hd8M09Rv6e++n//lfxvemnWLyOvvxaADN9AIDrc26gFRGyj8e0jvqwG83+ld3/f3ncKa8JoHMRppReSU3nlSar3y/RNkECjJObBSfwf66Nn6FFD1zNJLx6wvYNJ0q/olFLQnp6sY5WSrsx9PoBcIQ+EkNCRyPKYY9trM0YGyre+EgjXjDgnkdeXZY8IZCgkbNm3WRtTACCGGWhDxDobU2yz2WmYLLvJr4DknYLmlzxkKXLgFSStE1O3gp2fSWKuylTGXku+G5f0opRw9StWHHUJD2m4kP+lQZc+RvZp76j74CSswuafjOUW+3T2uxLobsRfPZTBllBw68NUDfoWO5UoyjNW/XtJhUR7GqOKaUVaTBLph0kNpvpz0qIXHQT9Y9fm8+8UIjP4HAQXHlsqOCPgA4oIXk5HI5YAHwhjq2A0HI1jQ2Y0HnGgo9EmqPj6goiDRdo6nwTyh3L/QEL+/STc/D39iUR/qsfrTaZSSa+3J4X3iTA0CQQTA6AneVADE170P1LDBK0X9A94U16NM+nUoO0A6PdqsSKY8BaO1xH9IaH6n3CoFxLrBBZzbb5onLRnOO6L+5CYhPG2p0cZNDEkk0c+THjBgJdOeRM43uIUFZ0uJ1Kp1IdHQCKRTKa8QwPDOFMx80mOLnWE36MCD0LwD0fhABE/PpnK8dbCDHNqvu02pdiuMAVGxoaFBwQZewHQ/zHCN3FEub4Pl+tY5ZJTStlSyrOUUiVGlkwhc00opRt+AWwcXjCI5OwZ9L+YCJLixmGNdiQXLq8FzFgH4VZdrc6lk6t0OvAWStTqdPIOsB8cGPPwMZIiR9CPkmWHvEM39mFSLiMq139mykXlfFtynLrMWAfhXPxw5b770RPITcFbqFxjHYYzlLKSvf1gv1riKt3Yh3G5ZlBXMxFm7rD2Gs4PIY51kImcqdbDDn82qqj4+eD8MQ9TSrmOoXJtzW+vERwT4lgHUblOW90xDsNjo18uyoELNsZhPBah/gW3kveIS6UFI+mWUUdScw/rN/RnYzcWGd9Q34Bzs/f83p3gdG+b3HMGMDIReq5yz//BCwTnnu6d4HtWontuzZXzezY+XXma5lTt0IrcWK3gpeaj9Ci2fKsnq5HXtYJo3hiClxq/JSIClyC2/fSA16uQpHu9aQKRxOFgLi9NZIohnJWegV3QgrNbjHgMEZq7Qzl3tDwfEBOJWMdj23BLQwDkYc/hsmIRUJUZI2xtHRoBrRHQn3VymzjYLxkZ8vjBFF4I7Vdgm/rpTWZzv9kMKAU9VEG/pXtyC9zS0FyyWN2DZqmsPzijyDoONLNn5ZzgmK2Wv2Sg4Dz8UG0BI600Vg4Lby1ZQBhQVpSHcAno14Y56jFKAci6iUPxRj/d0yFpgiYwksIAvEkAkahTSKqjSB3Rbwo3QT8Y31UnU8rqQ13XCgU3iTSBst5Pz/B6vUMkA4N/8+cfPSoPRalMta1AMU5mWZ5vyJLSHjo0ipaW6c8jrX1uLKwHdU73EfafXH1aYRPIEB1nacjy6X7GzkBTm7rlZPcmbOIns1mi73B96UD3Jjp5mhMwgQ9v6oYp7BpApr7DfUj4VbKPcZwas9wCzFNzkKxH5ul8mqLvzkBTowq2qRskcblPc4JJpRMjSwxIiU9zHBdZg2T5BFkv1FIWgoqGv78mNdZAwdGpzUYMZqILrMryay7eYOwcitceFKZH67qm98EWxbh+JdkwaUIV0Dd9qHn5vuXL9zFfqqZ3BdBs776lmPVx6b5f9k3HGeX/UqR1xZCevgbfcPp0+h/40uXpe5STSkiCvEW5MiPHZvsslY90wY1EJVF9G/M64zD+WmClMaSCCmKK/cHZ8uH+VzZLxCuh0fFi2mTgDWaThWUDrSs333LbSkxaK1MS1iHRBw9/fXcU9P9Q/jPvd2ktVpM2wHXE1/Rvnx8rNuCYXZIN/2AUV/ncH2SxZCny3dVQi/BMIAB/FagjLHt5aYeCKuUPK/6RHhrTldGSlReYgL+KCWcsY8q6OV5WJ4u/MFnQMq+lAP/AW7LJZw6cP+7WKQ9Nubn8/AOJlYd+MOeBOT84tDIx0BK6/PqfH146M3n/gSv6fK1XuCPn3Lvh+rtv2Lf+3g0R9xWgt3teR8e84T8XXfCATa+3PXDBokunVwpC5fRLgeaNi2Zsag5oOWlc6+oJu9787MicRdvWzpoX8M6ZuXbbwtn9w78rB34L6riHv5rvHH0VtiSkiqcTOfMzJo0dRaA0AMm5RBZSEP51JKOSwmO5ncU8lmEcIQXqFBA71MIEtBfEgr7oyIIhxZXNMS/ll4tYzB127qvoYKp0iUv+nRhlEqVLC0BIHLySpjLYhbjQgKo4yDZUye+VH2ofTGXLjTS7VOwsuwkuC5QXyzc6zYGKYrDB/nh/ripHQVN00j2tjfKN0Um5yiztr6ki8xqbx0deSJVQdYRliJhQQwRuhOBBtwIPGAnqR5mroFeAZg9EI7+YT1J+XvBl+eWgxukqqNYUXP7A5QWa8bVOWaf40kxXfGmmrz36mTz02dG1aAuYz45+PJJo/bULb7jhQnQDdJvuVau6XU5zNXijT7mafPoyvmxt7jZouB7x3Y5dNzuB8VPs/djjAn8u/4O6aZy149VaVRe4nBpcVzn+P6tbpKDanKmWBt0GVRVq/7d10xPf/XJs5c/4IeIu9v2rlAy50kTfhEmXHPqf1UQxCoIn/keFV+U8tFFmmfbvt0LCjPDvKjFTAX84wCkQEL5aOiEKKVFICqIS8ZBJwoRaGXUjv/126tD7h1Jvy2+Dirfp5NsgNeoanFxHqqN6eBGc8mQSVIAHAGYxN2XXRfBYjP2o8Vw5l1pBbaB2UJeSldd7qMeIFR/VCQ0HqB7xvHQ4L43yoPeG0qgWwdPnOePx06XZ/LQlm47ifYmwk420CZh7zOhf0jxgRv/UPYYyDyGBke4xp7PnyQaMvZvZypS6n9ui227CF3yLptXp0W8JdiZG0ASbSI4v837TX446JI+xo26AslH/yf0knxnHnw4l8R9+EI1/FZE6oa7V2akyagGW1jK+QbyF8IQQbAAwwmyoWgcz0XHY0ZTJokfEidtrJmIMDe7JB/fPaVv9wPJjH391PH72qni8sKLhgsFzA0XE3lUUQH2LTQV0/O9uWjS5MDF5U+Na+asVJtFs9hYHFl59b+emX2wKRXYet2uLi4vB32DvEm9N/OL0g5tNwQK3YKc3BxotgwKxv/3T0oiN2tvTbFhkmW0BwecpXNSo1UhB+HHAaitvCbXGpU0G1ixacexPpu4s6sFlVC01mdqCv0OOt8Uk8ovS4SgaKrWoOWykUg4bqhc6iepqs///ahY68cQrrz320Nvv0p/87UarxNYba6UqV0Wgwu5wSWuf2CBZy2ouOPbg/krfDYMP/a/aCjpT5jXP9IBHXtCc/9xGuf7pbZUDnJYu5Jy8xOkZhv5DY1TLHbdA/rklmufLwOf/u4bEa0tILiHrByUKG+eI9QO7dWT8Kewca0FBx1SKwhAxhNJ41Bo39iqKXJkXeYf7cOWp6/m5zGfk+Q0qx+jw5TW7VYtmdEyShgPpMYT1mMWE68dabdPBSfKVjMPQajQyYLuSgFePWYH9Y69EMb6TX6GLLYzDyOqVRLp37MrlfOOfpWwYUwfYMvA0uEIYt5IA1mEiCsVPUsTueiMy2dATkChLEGwUcbtoXFjeKkmc0V8eLeQ0Vo4ugOU3Jt65a3gecNvxB8GLkzG6iip7Y0fwSfIWHAkwo/Gm3bvrDRagcYGD902ZZRwckU8+WfjzY4qsCk8d4/awA5SOKkV1qERtT1scLB3WAongtwYJ5xFmPIphwiMkgUusBzB3AyDfPtFzpAm0NhvAV/KNC1i7w+KQ2+Q2tLGzC+QbvGIl+PeH1qJC24fg35UibD9Zp2sGE4daih8AqyaCqHynbPAFDX//uyHow1xJ3jiPqZLGyQ2dfJzKYO8miY8xlQPV9/kx4BtQsC/YC9NJSymrs7vTKXtAJ1pZymh2iyaeuWeQCkA2YIcJd0WpDiZ5SRiXwdrEsjlEo0k9QfDXAp9iAcya+XyqL4Wi6OZIqOOo9+F1POL0UgnnppPo7xiTzJgqhvqHWS7ouf9G/UWr/ZoYdlDW36G/njzrBt2TZ+H4WqtFuf89dEykVP4iJsejMj23jiKO8BnHvkcKR0wRIAtgRN2LZ8Y5Gx77kFjMRtUDAPtNZf7Bp8nm5roKONB+RXJuRR3SRusq1E1sdXxCV1nYQnad5BLmabKZSn576hYXyB9eHCovbZ3kKlhchxV3dIiuy6Vlk6vYUhAsa56lHlSw7pMkltOItPcgknSXUr3UNmqvyhCsrjzarQ7FJ5b4uITy5EU2G6MQxuBaaFDAzv9xOxoZAJ8Fy3EAPkScEdvUQAQm7xYg79bssIeCp05ReqdeqwUUfnn9CtPSQF4sLAsVCBz5UZvtC2Bxz3FfX1gofy4GbKB7XvqmL+QvVDgdIKJj8iMqYg6YaYPX5N0m/U/l1uCmYQ8E2lMU6QmAbCJ54bgDJH//BRgmB8yyBUT5czdQwHWA9IUNPWoBXC4CUQXckT//0oaKtOB8coH8E9t6hTSKyrvlfcMehseDHvSRDJF1zWbFr3OY5RuPZkL+UeLorsJCk7kUxEUfdl5NOZE04yQ/oLk4PKUiPC6O9ky2vTObape1TCgPTDWKBuO9RlbTD8Z33713DnBmLnDCqbHlTc1uu2NegaU4KFXOvT7gbqwuSxQVnGXW7NZ5jEDX2ntTRteG+Hv2YB6tfOQLhaY3M5HZ8DdLj5zdksoacMiVSGSosFEiqXDRKEBkWdgLkFQNY+lUiFlLDEtK4CukVqIfT5Z3ZMRDJFrRp8N0SI3hzr+9pxCE8W4YFIIgtswGgXcAn8Q/DJcmGWkCiIZHLIqV2Q3om5mG6xrA0f2E4tAEfNGIRAeiPgJ5EIm1QZ8tQEvA5iPuxEzmHYUVDhsSqROJ0pd8c8SpoWlAM0Bnuk2Wky88sx9Yr4Q2dJDWFFwFwO6nX4WfpmWaqZt51sy6pnGRKsG+3hWcu/68K2qmL+qK03+9//6hMq2B5rXQ6jx5PwgA8wMfMSGtQWso++gB+Sv5t/D+192FYqKvva2q1ReqCevdS4NFE3asql/e1Fje7OtW5iEW+5DRe1HdOr9f3djT143+/nX7e1pm6OF16z7nvCsmrVo9jTlz1d573V0JRtds4vr2xo5wN6kXQLrXxayCN0cFsQ+7HS/DkB4RIvMYXjlNgu40JT/CfWXSFwwlQ41pKtRmRmkapWmUJjh7TNQ/vXCIqhjnR1sGbZX1vvfJWNqrYGQR9GyMJ2vz85gUJhSty8UeY2IfNW6gGvjD/qgFY2RgQRcHMGcClgktEqaKseHmx1gbCgEQUhAWzxrXWdkRPM8L7Hr/xb1VLfMC4wLnzJ53vifoqQp2rzisDWqNAEJYHKQPr+gOVqHj58/vPgflmteS+Gs1YFngDFRU2htqusvnLAFPzsanLgrfHGaR2KGLNgQ7KjvHzVq8ZE55d02DvbIi4IQMhAAw1IhL1ZI0RD0jnqbKZUyScNlFyPdI8TZfhi2dOKCHKPx1kpV3yqum8ZTgJVOC184k5ffeIzCE6noDoN6T38PLBwRkESVOUcflb45j/1s6kfxAfsa5T3Gu3OcEUz5QhgwFv5Gg5KyVqX3Hj++D+Bd71yK5Zivxd23HMzu6YbY4WqB40fOo0fMKOaoCYT4f88BuDQIFBB2Y1uAQDWa9fNPxffFYz9nnPEPKO6o+u8+T0bg/R6dj3iJbeWf6+uP71t4HZ61Zt1GpQBR65JuS+45LPRG1Iq5hVTV2yDp0pQvfAm/RHXANz8/6SSs8SX7FzwF9nZLFKrCE8DKLRc4k5MSO5X9Lta/av21P1GwoNJije7btX9WuOLzABEwOXts27Wn6kTS14MFLL5rT6cKMba7OORdd+uACZWBU5SUqiw8RwLYAh8/iC47wfhi9PyJiSBX0sinUomhyOYk+v5zjJ53nBIoJL04StsXk8omYQU/ZoCNIeksBLwHRIPJdXnrmIDFRsTiSiDDnKb9dpN1oIvMOILmvK+dfHlRhHYNVONRpuGNtPIqRB9TPGselZR2kfehkkMDFQMWznP6hQWNgaDmhF05RG69TJr/dq7xNm6a0WBlLqdnosBhYqX7C+vqC5fuWC6BK0IMUzaCrWOWd98gps5YHPVDUr3U8snWITFW0t+9Bz8bqpmk+TYA31Dp13ukTJollFbhWvmK9CHsAr8V1Kznl5RS7ZGWubsCKpVcas/ARBB+kamRTuPzxWAk2PvUTQRU4b3p09hYrFOQkrzXoE0Z2vvxf8t9pTtAmLIYBnRns6uk+DuYBVrAyisQKkt/KNz7W3SNfZtYNMFr80qygYD7QJiQrSArQumX2s9dIGf8h7oSibwDah7mSyvHWh/5oH8G35k7cKz/6qLHQXf/gq/Kjr8p/wr+3MENrftLUXAYH0yydqPf6hqbQz+A/MGV2Z+fPhvvB4AGHCsZjdUjDymDVcyQaJd/UQ1+9VpLk10BEktZija5RksCLUh38wYhVzavxWRBB+eokfEWjkhm+e1p8deX56NFhFZDeoVXB3/OfD19Dj1Nuh24LIvJrpCD05JHPx6XCRVOK+RrKh6840/NBPJaJdlEg8LUjns9cnVcbKVdJMLIBgNICIwsLRhZgjHeQaX5tpiFGvoPKUfVSXsLIpeXPSCOMfGFwxxhtkCCxIxbSw+KoZ2FImoDERqJByRcGPpoNMn3moauq4Wr7C88bH7aDPgasq01fZJLr2WQy/dP0L+ijD6c//SgavUr+dDVYBb1PgHdOrrz7btJ/DacS3H+rGHI+LZR8PIvuK/niPiCxH8r/Hno/PXkKGFcEfgg+7hic2sg8Exqcioa3V+SvgB6svv6uu8BcMO5naluZeYWzY37et6qMQ9WAQ60UHoVD6wGOPLU5TwG1RTJWbksriGfAaumUMiqttWoYg37ZDnmzXCdv3rFMKzAaKxoxe+wajWl1+1c3KsJ24+TDbx+e3Kjs3PhV+2qTRmMHPYLIfEzGpqF+ud+ugdpl195//7XLtFA5aZXMq5fstsLLifR+j3/7ZOwNOXm7/x5yIH2hdfeS1WbJKirfP5EbAqM4trA/J2EiVZEECFsv482RenlVyUCl+8qZxAgWcILweT2DS46fLqeG27MUHZ9IKzmk25CXM9u9lJlS/05nE1EgbIFdjX0CZytEpWT5/6EzGEXgpwpk7dmg9UN8PZyXvbQiveeMlh2ynoJE9ySdwdMapTGO9J0e5UudrC8l7ZTCHqBjp2lvJjXmT9bnBeRwvUaVw3KG/fxyjPUDcmUAvx0rmc85zVNuKoqtrlnfF0y0SexEhCMBENkjBKtACWZxIMftjKicGM3QCBWXYfAjo/zMJ4LVYrz1fT0QjUmjFVzMrv3JJ/KHtwpanWh8FSw9wZMTOj0ozveMVCL6/Z+AKUZgRedFoH//VqPFarwVFH/yk7Us0OnIUf6EfO+rRlGnpV8b6S+Zs+FhnJN8BgwylBNyHqJLjGJJeBS7WBX7vF6z2WIahZyfvkmcJoKEJErBdDIoabToXcZORblX2JeJLIfepZbNzRZ4kFaWhGOobflwRgImK2EOuxUpCs3p5+XnwXrYhwZkzD2SPozG7T4xRl85tD24IbinflN//e5gkL4S7ezGO3uCTLP8fBpjreKr6nBufFUdvh5eO7QtiC7q34TybQjSB4LoIrSzO7hhWLsouv/IkOUxfFkVh1l6lF8t8V5VlhiGe6vm+Pfy+vawFYYz+HXhBcohsuZDK0huOYeuZD7vKRzIrtfLtYQWVclJ782nQEXjJCoRfZK9mCrEftblIAdWjr3BAzn6X/qkWJrCQVc2jcbQrzWDRKpUtLhAQmxFr9xN3xfEK6ai1ZTSw2QwWAySdruc9JK5DMnB6BkU7m1SZv1GdSXEVIIWH5EQY17s/pUqLXHLKXRTOeWyoEfKKUHfb9RqWUoShu6a5pXRfUGyOBSESX1KsErDZYGSPFkAhHOywKjP8Bhcq87ulf+pigNYJlqb/xY/g2tVWQDlUTLfKtE/yH+fuXGfQyO7TX2nDh47pRN4BdJ+WtoCVDIj02gfuRturqvvAW8JFvkDi1GwgIBFHoReeSA9QCeXFhbeXNhduBT2D2Nlfejmup568B9GfIlgxJekE9AL0LcpD8CepeiKmwsLl/ac7rsvwP61qt8lzxVnGIPiQFlAGNNr20vg4dOfKg0B7QdFt8EYHtHtewBSIsLjinA+0nIon8RaYFl+SXLlCOJYaW1m0CkCfoFVlijisTDEJMbK3iiEss9AD3op/Z5w6Y5fXHp2vU93v17gOTtd0Vf1wFWlBoMLhoY112MoPxoJerC5pD/ctqJn55rmJ/5ooLVOsHJHXXV/mYWFqWGNlRv/IXqzIuUh9hRgARY0eQPV83AYDRUO5MBBNzJFe/NcDEc5IIJUMglmpf90ikIa+QfESVHJDVeMmJJzeG4Y8apSxetQPhrUDCNHipGtxFwoOuSUNFGSUw7RUgqTpTerfp5G7PM5/M3RywLFcsLtBqniQCDtHeYUOmL8GlEmZbhQB4kzl8lSmk6WWkQHmiUmSiDh2H76MoF7AoFAMUi53XKiWP7d9y8T8VNW7L8xBzhjmRL4/gHlWb/Pt4WO6Nx35TWlBbdt+u80GYnJFfTrw3mOsSDzL1SmHjQiOeycCQh8wE+FsyJ1KJ5NxijC1o2EbmIuZTEIiCKEo4JyDiWJF54JxhTTho2N9JsB2qBnGaPkdKMXIH0q3922AjfQREi340KtbAdnD6xdqtdydDltNzKMyVrgLhb2vFQL3jZrdbSTdctOmgavmJCE4ISiXt49/pWLxZLiQpuZYY1Gw1+OGGyYpoVjWZaBgP1AMm42Sg3jRWGLIL4FKAd6vvEINs8CmqFpmNxkMAhbXMEOg8G0SW/avp9m0IUAsjyv6uP0EGqPtpxX7fCVfQXlBRsCcfgWR6iwOdVhTYFcV1dy6CHU5B2CKBnPXoFruuLrnz1zGKkI67RGo44t66mc3wtqSCDZG+BOUbgbvchr5etwzsOoi10sGS8VxD8e/cNuTYHuYj2AWrawZHnXu6JwqVGSL3tCATUGVN0pin4L6Q8rFZ71rIiJvRjbMPCTY7wC0YvXW+lwlQYb6rJrTZilW62GSiWJoYXot351RBQuN0oTd3V3FLAW0zrebNLCzXuDwdm7PMHuuli4cmb1xHFVBZbn75CMlwtiw4b2ZpGzGGZrTIKRdsRbF5atuMBSFpxeVR2t74lPCrrAils+cD2MW+NhbUVlxImedbkOQj1c5dIsmFVY6x/nsJnFgLtiXEPTtHEH3vQ8jmGiH+H8vjIzJ1oPmQCto8VAkWNBh6si7A5IotVRHWqdsEh9Z3vRO2vNyOAC4O0qU3CYCmedh+NZASaUkcMzoeDlwO7A1pq9ovCA4+0f3Q9KBJ3G9kuzVn4dY31s2neXXZ5P1tTuaPjP63DRaPL9fVJtOYq0wbK1gnjwceuj8q1mUTSAja9qjRcbpQVzRAGd2CwZL8N5UbJlrkhADZGogcqLpHVfQAXyV2FKst1NETlqMcIyUl8lkkbjaiTTzWy5Dmfl4JKHUKcgMYrAq2x/I/9Mo9GJv5B070pB3Tj+Zxrbzyw6rUb+1bukz/0B+JUtqgqYJgrrjNJ8Ueg1SnCi2WwW5YWhhc5FFnCvZBYs6eckY68gzpeM6wRRftIoqbz3it5RT3R13PExV0p+ybKdMffpZFPKqMZIe/twVFcf2Jh+SX4IfEsWLHnJeH/GRJ2xW0P3S/S6ly6SE+Auec9/nz/SkQ0duBGVfbsg5vEPaSgDknYK0Gh7HuoZUkCyWx11MSnuc/gi4QA+gJQg5YCiI9Kkx9ABWmGSprOlzY2HdOa9+KRhWztPZxcceGyrh7OPTAcAbAvI73vBXVcGJoMjM++ejY5s9MnvEvzud+7lnUec/A9P3I+2egvsfxPX52HfNXhz7mJWpzPvd7FngXVn8849Tn4lOHcZ69pv1unYJRtxluv8j6ExYz4oR+ozgxm+Hkomk2mkSsvvoB106Fgy6UW9NH2z0wl70a+gg71E1lZWlsEik9HglG8GvU7l12A0yQ+oGbB+W3+KYv6K2jFCTSWYQ3ZMfCIwvC0Q9YdtAYsffUZxJAVZIqGABTsoOmrj0YgthoFQPTRdV8X4CQhpbSuHd9DUgHZaOeZa8cbt24x8ZOa2i+fc2l12qzhVeql4Y63GzOmMXRvfTvhunVN666ydvS0nPBVTmhfVztJoGkMdNROqajzSlIKS5trO8gk82+SfWNEUKhHp5JNdhYevnHLO5Go7c2oQDFGnwFMRcAiA4o57ARj6Gn41xBc3nZ2+o6S+pMDAQfnHgGYNZpe/Cnzji/gcOg4A+TU0PWgER3GVgotBsCXUeEls5HewSsxg3pTMUHYB3CwI6QfqS6E3CxHhRergbwVB7hXs3tL6wYEM4oPC55G9byn6bqbiNnX4LBhUfniMttUunQGme+Q+exw9s9QudOQXpf6lsaAoRqaZEsGOi5x+PldajFmV9mZ1MyCMlcTypx/VaTeHUc5LqInUHFSjCKYGCvBoMgIKDlNGfVImHaJVsZjoKtYGMIUB9oLBLAYACR82nDEqYYaCcICP4K0UkZj7fzLVgKnwmPSXOvnnOqNBL6fwSlyK+LJgt5eO9NNgs0GLSdMM4l8vgHH5Ws6kF7S2b96SB6ZX/6t6uvzh5I/v/pjp/V21mbECv2HQkwGBMktWlkBvnOwXL/vkLGgRtVoa0Fv/sjj9uUbUQwh30Jf09R082NcHD6f7FNtPfr3rcL2DuXqzp603GFEz+jvb4XvU+45htZNO2wrZav9prFrLQ7nqMRePagIdkr92oP7rV3HTsF7WQHViDLngd7zi4SsGIx0hzrQPB8auMuPNX1nAqn6SdOQk2ZFJ5wQpsnOKIjvot2esWudBv//zDEllusvU35Sr/8hanr49Rq2gnGGfGVYB2Tt2a8D+EXUe1hq5dvJmq7JlrKYAW87cAKTPs6+rfb4dewQHiZGfWO5P3+eDVgztHQ6F44ocGg9gXkI16gl/ABjAAMkI2O0C85GwExc11bV2dtROTt95mkp/7qrv3j6ptcophk3mYGjeGjO0za7o+8HBc3fd65HL7weQ14itc1K7/tjWN21LV2zBWHWOt+44d06NWcNv5hnj9oWOwmvXrD/0HKzesgU8wjtZs8EoNi54Jr2FGlX3OPGGztX9u8e5EdWTvqs5vkfd38yv3y+/oyEYtfKDPxqr9kMjq8lGxmyPDG5kQl2HXZp564rDxsh1PxajDNp5O+ES43iMzQwIbS8xGxNIQgzHChVEX5sVk4JBHi8vUSGXOxh0u0L9IZdMbLzA6wox/XETXWWxmMLaxsRlJV2WibcvnLEr4AqVFDh7azp8okur5fWFVslV1VntM2mBJIm0oGGAbeYWYrVB94TubAAH+l3QVuHtaqlvaQhumtQFi92ucgCCLnhJQRDCLYmFPrE5WBauaLZKtuLa0maPM9RV4eecVmGLuuaPxv0EiTFzqziM2Zc3UoMP2m1EG4YO7ARD4Iwx+S9UaIzVJsHt0URjDjXyx1tP1xDr42DzTPlvjEagRdEKtCZfdWeVS7IW6nmt1iX6Omp6nQUlIVdg14yFt0+0dJVclmjUhk0WSxVNZ1oi/RelDUh7PNyyaOYWwerkgqUzQk5Pc2ltsU2yNleEy4LNom9hYguEwQJ4iSsIQLnLXQy7Jm0KNqCG6/JiFPrMWoaW2JHKqRbUGqupi6mrqDupR6lfEF4T7BmPV8kiGFotiARG9H+URX+qES+iLt9bWNVHCGXB4iNeZbBZMywxaEAkTrBFIGCzotx1sTrMaYSDNGpBHaGl83kJOqkKfukl/QyJ93w4QMAwbRFMdEo8tpC4pCzcYSAOi1qOgFqOUQt4NxVZzGZL0dMTJ6Zf6J42E/ykPRz0abmJAAhWO2jjDeMCvvZ2b8k4Az8IaYM7Wldksxatddsu8zs5IF+SSECbpJtYfoX8d/mzKyom6KxW3YTy/TC0vxyl08azpkeiM3mvJqCfBny2opqI22ZzR2qKbE+0txM463ZOj+4Ovs5f4PnkjlrzgPmoPxL562R5Mbh/8h75utLKQksQ+OV/OqGpGDg3HqqzlY0rAZ/dVVpme1JbJNjF0pC76ZImdyhU1NA1IeICBpuerr89Erm9Lk3/ZG5FE2sysU0VC489Mq+8Gaeby+fRTaD0l790LHWsi//6gr2NRejaRrJxN4Mt8l+KzdAJzPLvg6K7EmiGr+GirwONl38h8bKZ/rGEWkXtpvZTt1EPEz0doxSid80ioaeuNhjBeLqWiG+M15J5eVHUO6Lk5QWjAdJhWkBk1IuNY4YbP9qtJQy4POclXQRDhqNe4SU9BERodHcMnhyRMn1P6We47wXH6KH0K2GH3e4IgzlnnTXUuEF+af1q4F282OMWabBYY6gaHwPHtJZYbfnixZXjYxYtmLMEDWtVj7nD7R3hwqLwpKlIUYHp/gUL4BsuYVHj02nX042LjS6UbnoKfkzSQ661F64WqoOFfVPAk4WhjvZQYWGovSNUCGYtidZWGTVLAC26PaDkP9vtoNLeUVXVcXj58vSvwOfyD8pstBecI19Y4wy2LH+h01Ufey+9fnw87p5rjOhKJi1cNysYiQRnHUObqNutpX/x1qRJb01OL/x0W1M3Z7Nx3U2bPsdp3mrlUZoR5M3yP4Bp2oF18+RvJz88G10d6n64G99kjmyMtwadEXBAvs4H7eVgt+JLiXlz/01JOPofcIoGHZdqwxmFGa8K2zKLMiAG8EE4X/e1O/SFzapLA3CXQa91fFHqol/W69Nfgm69Tmf/oswpHxMhKAj/w06vEeVpVX7MW4BeoclUCVabbUNngfQtVoupEp7npa+pzIzRytgkZflF8HoPtiDYaM6BvbDigBwBdkD2YmGAxHDHKOPLHlvx06KG1+x+XqvVmJ8plug4b3nWI8lrkLpt9T4t8hqtPARu0fx+2CI1DT7w6w2W3wL5h4JgLKFnGwLpMJR9AaRgg/cB/E/zFaMxaygdTzH/RqlOsoYv1TLFAIPeK2z2RQBTc5qAgPQEX6ikGiozCerZLSBE+OZbuUgM/gp8JBc+8wBo6OwEXsHn9HoETgqjUgIg8SWCIHi8Th8aIQblK96Q3xhfU1ISnOAcnUPwgkFw88k0WKdlGZrmdGaHiStYGk9cN670iuuuiy9GE7LDpONoWsIs1Qyr8xaMOm/G50VKwcHiUuwBYlvFDMjFaFhgbMAW5qMg6kD/4jatASnsn8s/ku1shWxH+rjjerAAALAwPRsskEX5x2wVmCM75AfBQvCJ/GNZpFvkN+Q/gzb5o3Pk3xM+9uA5PaAQs6XJHzG/lf8svwkE+Z/yP+SfgyJ6j/xz+Z9gPBLe9Whc+or4mOjRyKSUB+M/ByzoLxhneUxJiv9owGux5xurHby7n72zf2iOjzb50ova4Tvt6f9eC9eufQ98kJQD6Udpbw8YSCdhsuKO+26HrkPysevgk7vSp3bRu9IX98BLTt515MgYvhezqHU5L5cMGG0G57bEH0JyEZaOaLuVU/qAh47V2rH0BOKtdIig2GI5gqbMeeOcOTfMZdw0vB/LT3/8MZgK5sS6YrEueYpw5dQL5xfVdln1Jha3HGvSW7tqi+ZfOPXK05+C57G6j95cJMcWvfmRjiVp8DJOQztx6AD3Kk/5mDwklvyetx1+Sj5v9P1Jeth3bSI4HyP9ZSLZyNdMtAqhOlK+NHDrRY9cdNEj8BGyyfAYKV/g0AP4mPov/zkQzV6YB1zysREtiMR9w1y1qF/L58HYcjkqR5f3Qh0YHImUcEh+fQA+lp7RD2rGik/uZi9h70H6BI6ubMd9Adi5MI4ziqF3V4XJctFLRG9TQu+5hEW9ATtOI2lRIvEQSIak0fzVBpC44wGcxBHchSA6zOAzmDMjXsJi3w+6WrM9Gi4qDJV0xjcKL65sm04z1y9dsvMj69SKGvkD+bPyqoToWRpv/uj9tujSBRqTsaJkwRsvrKuaMidhLfBy4h9hfMDGmZ9wzWcryn1D8q3fHDLZjCwPtQGbS0sX+etLPLuPg11g3G3NZgDva+vyWubMsYiGJsuGLRWFF05aktRoboY73QGtprqG1/ldhQEtX1So0QSGRNea9k7r+GraorH6o4Ge583aG27g/PX00/fLTk9doWVPyL3JUDTOXaetfWnXQ1NdlR6PSV8lBhdWdVlbCQ6s8q40ZLRvRDo5YbcOESriWJyEs5NQfQm3Dx4zsfKBRlWpLhYKo4/GBAiHIW7YGOZTYDleaWsPjY4zWFcRRwmG3XNKykF5eN40zaJ9fTSMV06+9klre7jitgcrQu02Y5Xf8+JbvpLaej1rukvuvdvAukzVd3z7mN9julxrKd/0W/kf+5aHyiOMxl7CAQ0nGtc/BugnnMXFzHhQOsyad2t5ld26XnTEWiaeZ1jaXrPIWjwHNNpcHGu1cnyBVXLySLFg+YI0zYcLmL4+znBr/Wx31SppQh/8VdQe97W5DX6Tdbyn46qXS9g6q1/fbS1cYrSGbEAPakfMQ4DqwDFgqFn92B6Ih5UqGkliUdSfCMKgz+azWD2oBelHuh2PLO49tmmm74GpWzrGW1nAM/8NZsiPGr3t42e+8VmgFcD6pRdc0Ai977oWLtu4sJLl5UVD6ZOeuqgHwHw7v8IgG0ZTWxWMWnxR7NCBBj4eCYT4Wa1glC10U2tFU0ldgQ6AU9RxDWALoms69pYvvG3VpMvB3fntN/0pO3CUjnOAa34BJusqFvQuKLhPXt6wrW8CBOOZ6uG2UPpUAqZR3TFqj31slR5+ZTbKd+uMgk6+w6jRWlW8QKS0meWkTgeSZkliiM1iMONTQsE0m8L3VP1WsrDJcTVIDKaz97GZjWA5vjtYZWQkaZA4cDMDITNAN5eTZuUdJQDNU3Sa3DODgp/BwHco4Bk8hUswolBwYPgzVgqkBoofMqC5lHpPxS49HD0fs+qkcBFGlApeipriTkGTXwXUQFl//M2oPUMk6lFV57CwHvDTMKpK21hmJxqfwhEKMtyqCtGdw2pnN4fnXZKsWbJgQsvs2ZGbb7x+8+ajU9f3+itXrp2yY3ld3azAhAPyh0Wetlgs2E5Pn/YIoNEMM2H37ue9Xp8f7bD//OjQQY/H759QkmiPLN980YvMzpbp09tiop678ZwN42gzzRiy/vwEi1yRDihgCVoIm5O6hT9KL8B/XHJoO3btgmJ6+3JYCf8rfS6MpncMfb4b3kifN/QxvAO7dSu4s+weMt8XIkl0BtKBKKo2RuYnRt2yyiymdG4FypIEVLZgdZcsLoSJjRAHWmLveuzJWozdGHCgOE++DPXDqLWDD7wOh9cOjnvtdq9jaLCsuWlBczMzK1E5vXlB84Hm8rJmMK0qAX+8ITm0KnnOFN5g5KeueHvFVN5o4MFhfL65rLyZKXLg+yj/3mguk+eUNzeXgx+XNUvptVWJP+O9Pyu/iSp4K7gx/sL27S/ELzXynGFfWdk+A8cb0zdmripvakLzKJa7viWcGybKDzRIFQiCCOgE/yB4KgFM6VTr4EI8qhQI4XGH5/D43Uo3gxAS4LHAo8g7eJkEncSSD5npQjF1OQUP8mjUj8fqougw57AGqlA3xsT0HOZAwpohTwKgHLV2jgSvkimWxmM/jacEoHCcoFkipMwIaPrEwSMCXrHB3oZWAZIh0Y6z4PdASkm8K8nVHmiLoRkGDVjoahLIjzMQA24Mz0GRVqRw4ALZ7I5ankO6L64So0xV4To05/tx0mFFF9dhYS4gYLEfTfv4DrUx4IG4OIBAs9AEvAgNk2GlKfADcCNg6RBESRFx4WjeihqSlBCvu5HVuBA+SdbhUL3jyvwYIWA2vJrXTiRPclvURrhZ1RurLe1h4U16LcNK7FLGpHNqaPk2pAXQNK/TMhYGQAggPT/O8DQNeaAFumkBp2+hTx8uNgG91iYajUDwF9gZxqoPm5o4DWcvCBbq9CKSKiwFdvMGEWjHFdDAX+gugkBr4XUco+ctAFidFisAdq0mDIysTrDr3PbqOCxze1mtnqW1BmuntsJVEEPTgrmgzBLy+9x2I4Qcp+eNdOGsmN1WZqeBp8goOmZpIOA0Ni8DOYaFsKSKLWWsD2jNdLFHUyZUhRkjB2irruqCyyocegNEz+RstANCC7SbSkD7zPRdtJ7TQlpH03oa3AO1Fo7VshykhTJRq39cZ6A5hqEFRgNjrJE2abUsDYEOMoxG0ACzAONWO+SdjqArpAmtKLSsDYkOnd9TsUDqslZMKYkUFt2bkBIl5U5W5wcADeE6YYHF47RFvRG/1ihCA8sAP037rZcEnKsnOMrLadGqu3B8R6WeQYOf6OE1QXvIep5gYGBdd3hCtK+kYRKL5IRV8cUmJG7odW53zC+6Ra0A7SHRbJV09WeVNrV0Rsfrw16fjxaAYHKZ3cwaIAHOgHZNtN7IyXOAxsKyGj1qXx2twS8cyreKTlOB21yk8/Pl7PjzrNa2u7eVQqZyZ1W4uVg0gNY5nhK7bYJfQ3sAqK0D9MQCycQzCdZTatPSmj0mpEDyDRMBaCg2VRRDWq8FRZLdA8pKGJNgcADBxWocJj2AFmDQWrQCh0pCc8WMxCAJlGFMDgAMZsmkZbSQZRmO5oHQ7DLoW4u1NF/QNr6jiHugQVyrcdqK2woLJQCYCWsMXsZxudZUVUqbmmqqnB0aswayWr7ObJoa0nBVBe1I3Za2eW3rF7vEoFdPl1lcEGpZYLL+QsPTDK3jeADNcQaIA3qLBjAMYNw0Cz+FnAaagNHIMUaWo1G7AebkS4YCh91usRpFRprmNvOitsiOejJ6S4XeAgCajahnGyx6x0K9eXywRGtgdKLf3+mzsrTRVMY5DXa9qUOwaLkCDecVaK6ibkLY8tO6aX6t02wvwnTea2Md1mvrNr141q5yGyhylx3pWLFj8/qmNxfWTCmF0B9Era6RDEVsUJgXn7x7whTWVxMoQNUq0OunTTEURzxuvUmNj8eymEB5kRxdRdVSrdQC7FUUDNEBbPTHHGN0KMz48CztUOiA0ViCBgovG+LxIAf8fIzF8zvaYaRQGF9FRpNWUOthHLFhEQRlKyE0x27Yc0XA9PSn+1psXvnX8mGwqLv2+gO7QkFGXHfBRQdSXlBFv//WrxaO23jD0D/QpA5nPfNN16xLt07aOaXZ9BF9CGit7dN3TyrAqxAlMyZ3NEfLPbqdI/SwEnwlZ5ux8JoZ+sPw+prWZbxw0YeLF9+2vEMwAvY379w34Z83fdFc/MXH0/9CnwvAdfdKP3rbNSnWbJP9f30UGAoSDZ2F0TLWiboXjbQDFr40Fh6j2n6t1HKsf1TR1QBzJ0dqPbTie4WZiCGOhy0GhFsex83SGTtKK1SItzjCNKugz2GpKIYJGUWMPcfcGG5cNKOm11NYJpoOlneUllS4qhs2PdTTkdzYHpq2oPnQWXZv94TI7Jqy2qLayH8/2PmDjRPBhg+P7O2d0XmtPPjcRnO3ugNYvAPeq50bq3DqnTxvNrssM5w+vzNRGV9cVdy2sbNlSXNQKLEL1tJwxFtZ6W2uXHppcPL2g0c+7DZvfA6w13bO6N2r7MiDeIfo5xVId3iFxLK0UR0k4ipjD4kTfPJaQlMcyrNyxuKcDruUEAdfgAntsvCpdMwF6L8G2UJbut5RzIGAw+P7wu6hnUam2Cb/Dq9Gg7NE/8emGa0Mx9ndtT75H0atRl5u7zTEu+bQF6xI2O9kWmcwM3/h8Putg4+hB/S4TEWmvS02dG1ZUdD9eae8W/6VxW6rsFt1WtldwGvtXeze+Iq+vqFPLaABXEqNWHdQNJVRnppnwDjFdmkiM4MB1WKb3esPuU4SkwyLflMMsfcOUYSYHBJLLrHn0kIuUygTV4b9rwYI/6NihQrTAZtkJ35Mw8hZ6uJSNECrbG0k9hvJ8pmYH5aqL40U/bnya23IlZpY1V81MeUKab+u/HNRpLTeDKjOdSC5rhNQZrnn0v+49NL/AAOl9eVg/j55jUl0heQvqyZOrALmkEs0gdv2yUfL60uLnCC5YYOcdNI9+IJLlbIyuKxB4omrCruB02yVNsvis1H13fWJiUsnkj+U3tQNk92b5AFSGjohKzx5PUObSEnelMfjLX1QJhh/oL970ybwWq4cynu0YVbBIOqSoXAow2qHF9vsjpL8BR4WLDdbiqpLF7Q4S5qbSpwtC8ZVFVnMzKIRA8yn4D37tJ5iF5JXSksL/cBV3DPNfs0YY0QF0i/eZk+hftSJV/4IYRsaEGpbQRANKzjOLRwkMdYscQsOhrALJ5Yz40HiI8zGCdk8wfBhiSOuw86mltz2zqfv3LZE2YCNjFl+32gS5Pcf13l1j8vvCyaj/L6ZYbWPP65lGTMoQSdByeNav/ZxUIJOghL1JNTnboM2URPbI79u1um45d8Yjd8s53Q6M6jtYU0WwzffGM3oLKhVzhoMyln5dXTWbPzmG4Oq+/2UvZgSUQ+lgnhcw8MaR0bASG1JkGPUoU6MlRBJGUN8YMdhIokzn8fqn5Rffrz316fWHv1s70E0X4aWy5cN3I4pZre+AMRbKiyib8GSQydvOP+8ccUC/wmqTezJ1H3N8o/f3fvZ0bW7fvnKv3a+DgpvvwU4Xt3NwXHjime+sfWGk4ciYrFQqmCbcSnVpl2uejASc75vlB//qNiWRB6aBlyb/wWjMyfJGQ7zYP1Qgf+jhgjSB7HCgh/mcDgIjof3VD/Xw6aoidgbjCL8DrzDbiXdAI2L6LPwV8HqDPViG1BJH5qAJYy/j2KCEKQCBAEfBhLgekKugfY3JUmMiS+y1sTEleOTkTWdTYLpKWuhU5Joy8uNCtzHMSlUJx2ju45JdSHp2IBLnpxOPgt0z8Kz6kJHd5yQ6iRJeoE1j/O6MDicOxw2Cm/YzGLU+uct/bhiIeVC5Tby7yB12bPPog/81CkK8LuZKdRlxGcQr6fhpUusWUCk6rFcCM2NNBr1HVZCgYGXffARpGYR4BwksuA5Ev966Np4K0OwI4jChXsK0mmsBA+GrIrj1TzF/gEdQaTD8Lsdx5zjSj3FvFTlZ8DVtTTPa8pCpyhnwmr1dDdMcNI6p2QCPMOIga1TDm9e5izQBc7pvbqZoxlTGRANdpY1a6x1JnNRrLy00Ag5UatjocBzBc1G0WyP/secqNUt8BAJ9JxF0Ij+stZgczWDRHLIWXXAG67l6G8SH3ujkbIGdxkSaeGlZ7GmkKeAYa0Gg23BpGoNYJ2BSeWmAo6VaGbchHanU1d6TT/grjbbWU5CsiZD6221GwqLmhfVFLJAU9LY21k60Wjwa6Fd0rsgMLCWYl9j3eKQvtVfXayFjKt8SWvvhToTBh+hAWRNWsIV/CPua3Y6pSMjXjU1n1pPXYy+xqxOjGdjkkT6pyOD94kaNVgFSniOwR9iPFYSRHovGhVxbK2IdrE66MFOa9gojz5bolpCD1ABQ2NIu1RUyiA5Rg6hE1hlxyo6vAebfmfa7GLH7G0arVEo4i0ewfNE5Z82bphdXX2ib+MKpCP2y6cO/VH+vaDtB+DQH0EQhKYd/Lmclj+W//udvVcmHwSLp02oZDjBxHFX/qaqshKygs7QsLRj27wCSVPuQAWzLmpzljGsy9kM5i+MhLW1MZemsKS19aGFheMNxYW7/jnkn2wSXD7/JK/7NqObZfXGYoHVL1/bU+J/ZsWype6iJ5p7bpgsOD47pGyu6bj20t7W9h1PnbMVMMkHfzAtcZ1gQL0ANrW0bTUKetShGtfDFct31aOnozK09RjR053jWOOsnvRWt0usdc95vGNSVOSK66s51/R82WILpaUkzBdP+G2Rpu3Ba56Qx6TMJcDMo4HSYmdE5tyjLzx/9MAv/YFfyrelX33iflDCRJ94Nf0YKLnfv3z5wm8OHvyGbZHdQ/LZq94FzmfBpN+ky+S/vrsKHBkCf/H8Rn5WWetDssNOJKdtwGsvNBZVOYonKB9oLBYgNh8A9HHFcJrFabYYxKJVLNL7GQFpOGh4wmsjAv6QOZxkd3oXLe9dtXxWs9myWT7ypuRyScdA+dqSqcsXrVww17flpcu3tBVEXbx9SseKOQsSldzki1cuaIn47Cxj0Lin1NcJoUjnuc0lLGcVNTxSj4Tq2KIVl3TAcMvM+fO6miwWRy3nnN69Y9s14Cfd21q8tOAp0Ok+kr8FrlABeOe4IGqMFdP2zK22BmZ2VVzaD2hIW4rqp22dXGiRxjW1tdWYzDs7OeukaZs2X91R0Nl91qK5k2MmE7PUxTvaoo3F0DHz4jktHhF9PvT1V/COpqoQrEFiiw3JLn9jKeJJbiXxVUTCAorPPrD5LPgvaMswMjF/2zq7QR5KfzF7K/ObwbLM39bZ9MzZW4F74vwd8r+Accf8iWDyKeoUmIp+rmpvn7djR56ciRHKatT4oDFpTO2nCe5ikiqRaYZkUyEyffC7Ar3gNWPwmR79roCvYTKxWtbhbKz5ZKziacuKOUtxAXNUrJjJtP87CzugFhG0YWZUhZFVPvWdpR0lvytrprlijpTfR1kbqJDLalHCzixWHEP7HQFqKexbZVDDxgyhoRe/RzwYj7794lwcvngaxgDVnlv2XbwBanQ98H4nfYDq474MyeQ2KoYjQYk4hqWxuAPPrVQEC6UOMhrRCpBYnJCLYkuD5LP5cLSXRJ9a2yi/+ezt8te3nfiRZechwD+z553t0N14ijKaSy1fyKXOIN0DNcKC2MTlvR1BcL+83gx+VWr5CCx79bE/3Aa0tz8Bylovjf3xsmfkb/d+4NqS5APgA5+T1lsKIm3LJ046m5f/mEwG5IZhOrbC6xMLh2j0+njsPqksauKlUYcSm4XtCpI4yjvRoDv6X7MrQvP1zFWB8rDR69nbtN59jruuS99Qa2o2dfTc8af3Tw57n3t/y2nkf0k9De8/GPv1cwZ+mbPH2V73WPz38cdACLjBxcMsaCqeAyoj1n+tkFHUsKyDURuI5qczYVhIcClCch9ryyQsMUo9ySSfk4//rF8Q36U5ndbo+CSzFQV0EOwwuRzyDnVzHDDkKEz9TD7+nCjAVRMBpzMnHZopy7Kpk1irfGIba8V7Fy7LJOQCI7D+FHv65mK/Ayr6tE0NM1Iqkx2Mslax7xkPLiuslnI/UX57lBiUnjNGh4/KT+70XdHialysBuN4hgnjX7difYsqSnAVUGiNsY896i0+IsEQV1TAx9Hk5sCRvj6O9yPxFAigHNCRWjogYYhe4GEirC8EzznvziT6pPnGGTMaecmYSN55HrO47BLz4p2VlTsXmy8p46LR2R0dg/Ppr9/7omGTu1AecC2u7FlWdMcdRct6qha5gJcRqms7S8BLQ9ptoD+RqPY5C6DFaYEFTl91IsHbaVOkoqQiYqLt/FDJphLP+BvGy78JlY13OrFXKHgTDIA3sYcoY/QV2LoT6veBsUTmEP9k/LFiDVGxIiGlMpfMEDS0ATqXDKturEjDzCVVeDvUEFI8BoI0y37ROnfZQ/X8vKbqGaa4/HJcM6+5ussUv6XI1jI7XnH7+ttd9uY58Yo7osqJGIjFNPNx5ujdNnvz/OaKO9bf6xwaArH18svwm9ktZ/ua7re5mhbEKu/ru9fpwIl7otruFnTt/0fbd8BHVWX/v3vfe/Omtze9ZvqkJzOZmfROgJCEEHpooXcJIB1haGIDFaWoKFERG3YsKLpZ+1pQF7fgz4K7uLu2tRcgc/nf+95MCMj+dD///z8w7936yn23nHPPOd8TA2Vx6Qhyldg+i7lydDy/Z24PKZLIuz0hGV6RP1QTRy+WStHpuaBi/oV7NdmCJtUFOiJAl3ZkXwbSruxD6R6b6cBpvAxJpJpNBKrBQCUS+oTb430pNq2+flrhc4XKHHlpmK4Nlyay+3rDpVWBwsdDtEPt4C1Gg9HC4xANFL6a83VNzpwAh3wG0zr/oEFZq7KkQSlqIc4UZmaXl4YDw61ZS2yQl+lkROkFn3j4oHk4lZElCrYHLO7Ng6kR1FRqMUXxeAULQgEhkxZEP0GNuKdBeCe+P8kb9MX9xIW3aOKJqX2WN5mFNRB/W8jx8VgJlcXgpRoSkJ0gXm7iVJY/juNB4gMEx03rG8CiF//NSlmN1M60oM8Kcng1z785bL1SJ6E1yvaV96B/pdO4LPlcMPLlG4BirjzRzDBKiR735hok+RIw6zZ0z6XXTHn7oc8r+u4AC0DL19u3f40OoRvRIRICo0EnqPrkiis+QS+gA+gFEoLJO3f18VPApUDKhyodnaqzFF1Os9DjBHIgA0o9rwZS9BSS0rWZ1J5n5nWNSCgtvF3jUvrZ+cdSqyRsXhbT8eAL76B9s+CBe+fnwJLzbtwiPMypJ6/4BFRd8AyZtUdofz3RFwM6NugnY8SfMEoYo4Ex6wAfSARDMcbMVKOvT6Jr/vwHMOn4cfQpiH1GPxBIfXfDituB8Q3iojRp2J/acc1P+20Hgyeu3fMPF9uOatDqJSObnAc9azM65oLfKSUVpIoI8oDRl+7Cvhjw6KK6Ab9z2HFsJhile+neZLbjtNyRnQR4TUpm/lc4sk/hjAoJDvyMAxIKJUUEkLNUCt/43E+EJyUe7ZIZX9FJmWi7TugF3iR0lATPmiKJtL+tALG6NRo4Pq3jiXPJZBtPBDJ+vST/1jMH0Z/RfvTng4weVptKTEy76UwPo2RSl+aWSmrKy6FcpunVyOSwvLxOMRY9ZjIxXTib6YJH0IuDlg/C/0Hl4xwHtQVShHnDo95bZvqHDgqi4WoF/lODR4KDhgbfWjNHWiAFXQCgHvz+C88m2RtEnRbAEwEFH6QgkWdgNktvrqYTJFhMAO3oCarq3OxaVRidfXhSeSSvoWbb73MC13euLIzHSssdtb42+Q7YkKpSKOALg8BLIHy1RrPoS/xkVZ/e8OZYtTo0vfxy3c9pnzjsx8IaSgEPGWXifhceWf5olpnDTyEQeZjOohMemoJ/Uj6BHnrvVnTy6KpVR4HjVpD3l3fWPLnhf5LJ/9kwdsfkJo8EtcB/N1QdR/f3kgKgHDiOrvrDH1Zs/Aj9/NHGoiETOwKiXpk4TxC7Vy/VJkgjTEQ5MCgo0ZP9tYg/DdgcYdMUpylBgG2CId5MPHwL2KaYnqIlXNrQw4wPTDTij5VgbtA/YJbAs4OJGazVVqN/V2u1Er2kaNXKYokeHStpjsWawe9izSU4dKZphn/j4zWvksRA3PYBLxl0aIOvJNIUcEuA5aWXgYVz+cGsi4xHsFirqa7WaCWS4mLJu/hiuC91Bsg1SzqKm/ydEmDPD5TEmmORYtaIXuU6A03FvnKN3bn9tde2Z1k1Zc9ccEEcOh8HSyN4cyLzqdBO3nQ7kWYKZJrJxPaHEkLjBEMJM/l2/6GpRGv70C/1luj7VarYFzGVitWyOUdzWC1CBdUF+bX5oEM8/6UyN8e9+Ob4/SDfTeQuRcZndUzlzYtcebmVWTb263vv+1pidYPoefgTu/FF8TUlkpwcyS53QYFQM30enFPpbmO+C2Xl4avn5rB69L2kNasyxxVRWc2rH3hgtdWiKgYnL86XuPDsQxCZE2nwsX61FOEFRZUTJ2BjaUWVKsCFjKQDnacmOa3z0p5LHUH77qUdI5baDbwdXLmLnDorL71jKRhxIf9y2F49vHvRcPSJwW43rFzdsWRxO8CLqYOPf7R6ncHu4NfYHGvalywBD1zI1ZA56k4uyU4SnlvARRIfWjSx73deLzw0x3oyOeaEmMUEK0dV9j3y6BkwBAdSDz3c9wK4Fgw58+gjfZtewCl06XKiHpPa+9DPZx4FcnQ6t6IiFy64/9vvD15Rfjv68dEzpx4Gyqpy9G1ORUXOQH6F4H1QAeJmXHSPehH6mO1N1aKsSZtgLzgxaVPtwO/bA07A3k2TUFaqdhPjPF9hT4p/NinF/AP3aBm+j06wdg8IuDlkefBYgU8H8EpBG6MxnmBT4H8BHU4bGB7yRuoLMGQNuOnNN9/sgMbU52AIeook3AwNOGcwOgwGr2H+0ZcND+O8xehaXGYwPAxcb7yB/tbXcWfHfjGxPzhgfMkEbNQi4luIEthuYvMxIKRNA3lzugSx7YBC3CdGfsGIm1piuXZHTgz9kA7AdQ9fZuDNibFrj0XrL7v7kcuaG54+lqi6jDafp0TZmOzUAKMOjEhOIOdUMVA+R7eVT5GkNmcf5eFcHPX3PYWD4Ofz21dOZZ+VcW/i+XQjdYR6jTpKvU/9nfon9Sn1JfUV4UFdNFHQV0OugPURTVIX5wYmHA2KBiQliWqIpwfCogqaN4xIbJMlEc/7AkdtzlDYUJJG6SCCkhCZQAQbOXNCTZsTBVyoAOYQ1yuYLHXBGmA0Y+JOWiPqLBGFVcyl0eSC+IkEyi5h5oAITB2qhlE8NEkmH8WpMaMG1EDm5WFXTp9dl+uZUDmoaNVef16lPVQwfahcwsgkeZyb1dMSAAAn1dG+zVkhD6RhRQKPRP/uKuvMbofEiFxurUWnBv+QKoy8nWXMEo2Nu1Oms+o0TwBwl6nwusJEobwxl+2ozkvkGIxyizJCh/N9oIrVcWqJnJMxnMamL1Svm6ANN9Y4B0uVWVkmpemntY68bKtX7VPkSjmYPbzvkLo0T0fn/hQ6HJfZnWYrXLWmqhadKlo4FNxO+8qipQxnHF7nQIO6JPJ8JX/MLc+mVwFI/k2hC5tWTB1SOi9R5UrUaAN7HziycypkWBkb4JxKlzVg8thqsltwn5Br3c0mVVmVEdpik9bdZGBs3SatxkzPU5tUcoaFQJWlC5h0GhMd1tqe7Cn2e2mDRavn84basrS0WuV31zqs4TBUaP7MGqUaCSbgIc2AXJfHVmAfKZPlOwBegaZMMfpD5nxdGd+ikcXG3PVyLi2Ty/g4p+gbZct1xwtK2XwF7Vc+UoTe1gBOo5ByIBeqOHipQQeUqbUjlZJiAIQrizyuHo+xf1NmTJNNojbhZS2Y3g0h+rNkI1+wthTUmsVRJqjUcbiTCLrlcVBC0GuI+h2RxwBBmY0oIwhacYLGlyG91sdKcL8TumwizR8x17K8a0nzhlpWqtBwQOqdPy2SPTaXU+bxBnOs0OIstqllOjOtkahlWjWvsPsUUjkrN4NOuTnf5Ulu9NuHDh/XnVi6H8IWZ0NT2a7lq7NsbXWDDb7CLIcztvZt9Dl6G/3jT8lQRcewjkJe3eyrcvnzpBvK8g7mGv2jG0YmQhFebfIWYw7DIM9y0DTjsXPKzYVqjVyZZzFIOQNUMXJGQkONWqOTMEpQaMrPd4wcBcLl5WEAbpnZXWLQ1bXWAlA1tBrQ3oLslUf3o3/+bsHSV4CjZ/zdaxcPq3XKpQFD2OIYP+KWoLPNrrIMGrJ83f3UQOwtF14lO6mVeD7QQDUIZex5E0HMVZs5iQGTEzU0bcaEgldicNNcISwAiQIRRwiPf5NoRBoi2+kJMyHACumEm0hUXIA2SDiTYDlMtEU1dKgGVhOFGlyRKejZ7ap7YLS2e+joleMHmQrqlLsVgUBgTsC1+/bnlHuUgTnNAeeent2373Y15tmbOleOblmqHHU/PXvl6OYl6jHPNCp2C2Vce3rwP2dtobFlJpzVYitoUOKM5jlCxu17nA1PjVEsbRu9ErzVs8dVW2Bs6lw1eki3dsyDdco9isCcYIAUhHpyx+a55I74n6vh8FgNfrBV05oNhWd2jl41ebAjr1EoMid9Q1ftA6MVSxlz66WK0U82pJ83ndWQbxs2a5Xot0PEzBhEjaMmUFOo2dQ86krqTrKfEywUXNWFRGXOUFpDMREk06HEICpy4n+C0THRvcRjgciFBB1PUWWTFhQ0faRUQpCGJSKsOQQCOhaY6RCeds2A1eFPSG4hIMKI+yJCXWK6jQcX0Ami7FBJSCdotyR0bCQPZxp1cDswGwx5uVwj09AwwsK4aUmLcYNa1wils6QhF4SAtZktejkDJAFFeeEMKK9XyKwMA2mrg7aW1CovYxnVWzSnDLpcNrOaAbTHUOTndfC5mqvP/AyfSDUzx2c9PuOvs/KPoQJYhU7fFg9v3FHuGTX8mxqpXMo4PMzQBwZPuW60xh2Qg519p9WpAk7FEoVoDWZ/CyBmdCsYA3iN5qQyg5ONwdltUzSQgcw4yxN215Uy4IUKKdG7k7Mcx+gkOiihtVof9DG0HAClEUbK2MgIh6QEgmJwQqMya5S0WWPDw5BRK+GOv+ekbvoXI/00FXfD692pf7kvqaMrngJrT+tUPfUjrcq2Ak6Gpw49DBQ7/ZwOM9LJM3/4UfKdCkAmLgMS1q8GyZcvmW9EkwV74wz2ArHpG0yNxT1hBbWV2k3dTT1J9fbv9PQ7h2XPhywn9APx7WQ850ZPxGPX/Ur8/3d5XgQW8+hAFtnPTJIDe6K8ade8vp76yaVh2BPucuxxhFNZAtDRfzwA6v8uv6snXJpKMsnJ9ee8K9/pXT4oRc3bNbleQoVLw/gxusJnkv3VgPpiQXTR1P+mANgOqNJwD6KIN2+iQy+h0rKbGmo4ngMWUesFD4IPUb+j3qI+wpTYWaABblAIai6y49fvJFFsd91/Gaf/y+/5W/rHhUA+/7fX+3/5fKygrHJG1FLpPed24H8/JH9rwXMHSA3wTPSbawHqv7+ThAraTgn7XBJ8RAMgZ7/9teCj/cGLQyBdPHhGwEwRDvC/qNb3X5Q9D4YJ85q1Z7VML9uFR0mI7BheoFRHZJ0ZZSGzyZCxMmX2o/fTunXofYfDOdxxEnSfdLQ7HKhHVLB7H73f96qgWpdESUG1rhT4SQHHyZOkwieibh2b9r1M9lOcgtRoBJF/iXwPph0JXwJEXzEgvYSyEUZPLCrw7Ofz4gziNCYwoDTBBgkIvmFEcgrTZ8rguKqWtZX42LqmEt03qrVlU5NwAFctB/qnvDX1uY1f1dSnmp/svvttMKRqXLByTSs5rgUzWkc1bWohByZcOb9t6d6h5HhL6lj78kV7m9tXLLq18AX06dKCKqeic/yOMcceXH6sbX5l8y1L8XHo3qVzVrQ37120vL351kXE/uosBYkvcKOIucib0sbu4sPjZ4e9S6bkQ7+t1+aH+VOWjN51367R9NfXvxToe13QBIsFXro++d2tt353DlMkY3fkxlQ80LGhfKAiH1FEUk1jhQibqJhqScJkKlkLn041pZrY0353qtZR70jVuv0FQdhryjPB3mDBJDAJrv10MUIIpihfpQ4ltVqQ1FX6aCpcrwaUVHqWUteLUHn4/lLRj8k5q2icxQaE52BB+hzKxMlzsWTHF9OsYiD9gAHhgJ9SWHzxAQpOhGrBjWgBWsC+OyCSJ4YPo8FoMHsq6EG11lorqmVoyKaDnmCuDzyKf73muBn0+nLBo/6crl5Qvr/7gQceSG3LhFbeBeT7u5999tlUFeryV2tPqNUnIP4jZ221H/QEa7VPg+vwsVcu79XWBlH309paUaaCpBQL8XvLcLsHqQKqjuzWGj00QTYN0pjCi0KPFzM/lNgjOY/BFPBEYiU+T8xDeHWfJ0A8j+EcocPSPg9XigA429fZLQF79Adqlus+mIEO/zkF2KNXvTkTpi5ZeiYOwm++gv4IrG0TnkN96HPYMfaKZTUHl1xaPHJJsil1K/PAWvTHuZ0vpJ6sTaA3gfQvbwP+ig+v1LkWrYrcfei5oa3X/cXRsG7C4x1ZB1YNWzOq3Jb+hpn9TBcVoPLwmwwW/PxcsBrywu4T2VsgGw20L4YpVUP6xOIynnjsHLoPgSaiI2YfHnq4UQZKwo6hbWDdsp5r54eaR7U+fOeKqYefXQvljUPALWDnhuT+2y5/s/oqxdDixQrENM0DNej350vB0PV9Xy5dfFtOSXfZ8Bwdev6pzsnokeOL52S1DJIbNj9ycOPW/b/zhsElq0vrgbw1w2txGZz7EEFn7fdaIOzBmjP6ZyFCmYMBCEUJA+UDwhxSiMeVoD5DgGwpScG1r1177WupbTvm2O1zWuvc7j0txg5D1vLBc+i3H1u3/rHH1q97bBf64Qgapnx+86qnrf8AW4ZPVpkIxoDimSNAwbhJ/WvPPPf2DkmOe3dLa61b6pFWDqU/WvcYrv/oo+ufRT+i3294dM+lE8EDtxZBsPsZIEU/UOfxjlL8Pg1UaxoJgGyfUiI3KJgvx/FDx89thFVlGI9AJP2dOJq8fSCzvyy2CWEO31vSs3hxD9Je2lE62VpSULnSaolWdZgMHXSf+CUOGm6YMudmORi/69ixXTf+EX4s44dVo7+IH+in7a9u2zZj5jY6u2fxkuHti9GrB5aWFxkM+BqVKy0eFi4UP+ZNgyauvGZ237Gdu469cyN6DgRWgHdxOuqZsW3bq9u3EbTxs2MkX7FnKRXul/mYTx4moCbRXEAQvmIGymTHHDOtATTRbo0nQoBYGwHModE8aQEgoQMhnmglskTqxKlZLohTEnQgQRTX2Dim6k10owaiiXjsKziNzAvb8g7dUDO1yE0zz+kgJ/UNv0aSPKIs5vWDb5T+4xh339/KUqHC99AL/MeG9rCl2FdkKYK739UrTKqwv8rTpPD+E5St3f4+mrTb2zGoUqcDO91xpSIEFqHrTE66LGAvbfZP5JSwHG2ZOOT6uaOMRjDTVqnT11w2JvUZusnpoxmO3Q8WgXkPaE0m+tEadM0zSjDD7WCgwZRnjaOX0M5Am8/gNZnkenoIWPDClyPR1YYx42+e1KBSAdqu0VSJfaRWKvZ5sq/bcA4tgvfg1iJEJNefMtBw1JMxIM04EsHtR7qHmagwgBOTN0+evHkj/fN4aJGlKJkFsrSQhPTqru6e7j4KH7rU+k2THHPNd0yjqWl3mOc6Jm0C60ihyeAEmCnleWnKKkYphEn2JHG9mRSPmJ5L4tJ3Tl6/fjKatEm0q5WS6TZKVWA+vnUAr/a/PLCIs+xJe8Qy8xm7WXDu3dMpXNakTRd99KSIipckL3DqtPi4Mwa8N+MR0mBy0yTyErXk8WvF47mXOEHIrBPkVVCW0Exgo9gAfc8IUUwPZGEe5YTwfpSfDFRXBuuPbAIR92kJ8mb9R9GfMFEiFI/siaANRYDcb0W9Vr8coIgtyIMdnwjHl8gxSWDhk3zQ9hLYgY+fgB2dJUHdtqDV57MGt+mCOPeG/kOS5xGuEEQLhcOAucZI5VKNgi5MGjRJnOXTZtjxBE71DEjNElJ5nOoX9hP7SzOCez4wUDVttuv3aMvNOXYTm7V50d/u59W8o8v3JfrDTbuKfFbOtXoDML9jUVt9C8Lr0KMPv9Fjdme7Fc4tD+4D+bONvDP3zQvh55uy+KVeWa7BKbXPVti/CBu35aiiVp/Us1blA7pC89BhhVzA5c6RBhqrlNkTLhAGAdGXLf4mPKGGiV82juYwjx3CoQSf8DAUescCzIjN2+5Cx0ChBX0KzuAwyGfeST3tRlNd6CsXKISDXWCfC+hceOzp8O8aGcVcSqnxCks82ldSQ6hR1DRqOrUYc6TbqOuo26iDVC/1LvG2RXqplxiNkhkbR3EzkrblaIM54zwgRnYHvYXEtjdhJoo4sVCiBM/2tJkz+IT0KKbZz2W404o7OIJzZIDnDIJnJOIi2ZS4MCZGRLvwMkCTbLIG8kSMae6PYXrVxHPFQgzysXjaGF/AbxaoOpJACUIKWotJSJVcplargUpmAjkKpUqqlaqAXCGRqRUy2ZkvDAaohjodVI+z2aBUZjbLpMB2xGpVyKHRCOWKyWYzVKqMRpWyC8fVEpnBIJOowQb0kdEo57QQ80taTj6Z5xVSHMJxqWIaTjPwOKKSypTgypc1Gg1mCdRqjUEzXa3WmrRAqQRak+ZPar1NDyQSJZTLFFJODZlZB5b1/Vuld4zuegG4dLGyZQf2fwMVcrVanvrhG7mq5Bhs1kpZVqqVpJ4FnwM5p5BxKrAguU4mW5eUNb31ukz+2lsyPDI//+FLheLLH5Rs3/cq1fd9KvdnP2pl3I+fSWTIBBeizT9yCv2PYK1eMRzlfS9V8N+Dd3lFFpJ8azR+C07LVKqUDn6G4FdyjVrxFUAKtdqFDF8otFrFF+ALpVaLpP9U6fWqJcvgWloj41ipPnXjsrugXkVvMsu96FSv6QCVwSegBB/GdgGBlKKy/Ak81ZAd+ipg+t9jjABOLUZL4pAH74G9K46i21AXuu3oCrD3V+KHQQ+YdjQTP0pTY0bdJ+pj3Deq774BEZAzIMLk4FNSjOHTgP1cnrJRPmoyHjuX4rGzFc9Jv9yvM3M6D/GnLChbExEuEKRlZBNXwhnFPXMOCn77iD07INYhRrIHS2wOKmBEsL/Hr40PmLJQAyAx40mOmLzH8L+QgaNJ0RC5ioQN+siYLGGPOML9AMrJcJdjM1gpV6JXlGA6sTVLURB5ohXlN7i0aggkdUWX13xw/03jNSoLYOWMbPJotQyWJBr9FpVK4TYCs1IvI8bwygSyl4yODgUbNCr8OAJChRKs3boTmtiWqL3UBVdYLm0pUjPMZmGLLQPDHHY0oiucSlCmPK1nKGLQdpqCI2wurtiEmSsAgmGPpQKd5pSAkdvCs/NlGghHd1+xruOWSFhjLJRAmnWtGbQf2S2Xh8fRq3M6uQAdZhiA65pwe6Tmxu2YKG5YOGZRqcLiAIA6r5+J32jUb/s2vJEAGuPWj0XJ5joOC5B+tEQDfCUFxDUbAVYntJ0Ptzgdjf1qS89t2r8vydGQoQFLJ/ftb0Lvdk5nIWTw00vgdUuugyxgGAjZ6Z2/odno5PzUfPCJwaaVWmivDNnhzvnzUbPBZiTOdtksGfSkPpK5JUajzQCemP/Ldhj529qBmAL4CKgnkQZDN/CROC02hgDhRsQNhUCI8/SvNgLIB9Zhs1k5i1+agSxHz28BvsbeFxrQp82zGSWNexcjUcxrQR82Pvv8b2iGz+bNu53jpYyE4WTM7fPmAR2wzZ+/j+MZGl9HuQ+3ydfok4yOzMD3LxV0gX9rC2COUvTTjSkNguwIfDoycgnY4q+/cxYYPOnKlpyG4c01RR3ouomAXbGyxF1a7f5tL3i3xpzsGLHSzs9P/QlYgFLv6Rjv1lzsnXKoyG+ceXSeWMIMGFFdyvCrr8Ak+6hesvnR3tONadLf8NygF/X2kirJblKFIGdmnjWzL0OeN0E1CyjrMZ+Rjfmc6bPx19/BR8DFdUCwEBa0oON8LEqcJMI0GQ2TREmQ/OjK//XtkklEwW3zpdd/eL3UOD053OQ9Ivh6Y5ID/sCvvXEyiaeyd9CdduvIhQtHWu01oDWZtCGb4J+xX+d1wLcqo1oEbbbftE4YM14j+x03JOIE6FEbEpHVTFoBdSUUIV5BCwBJMQgpv945MZFDfEce2EQYg00HtOCQm9+wQRs3GFndjBk61qh/1m4YO1YfD0K+pISHvOG3zE4FUlPqBHElebewb3y3JjXYsg/s2WeU6HQx4xr0/BpjTKu50TCpbxIP/TFD2Y1lhphed5E+Hf2t4/TCvSE202oCGmY08utLoeCFGAlHegFpFrUM/QRkst+0jtHJTF2AjxC/fy95fyDvBHLZRb5/ghpG8JN+05tVE9tRQLTfiYWpYL7iMXG04LcIEFV3Yr6IqVxMKPBiWZIZ+vWP3yW1KaIKWvrEE1IaB2zSv6nxy6rVf7swHS1XaeBV0KSqSZ9/U4vgKwTxlb77Dl8hiK8E8nn8h45dmJ6S4CvS5NJyHOj7PQ5gnid0djd7HLcX0dDF5JEEio595JjrMdkI7ZQI9ntcx4OAqCQN3O5jj8+cWveHOwrbOxx1c2cs7RprB3bbuFWrh9+7fPsdbx969LlyztpQUad3l0ditX+8oxq+9LL5CvTt7bb8Il1sybUfAw5c8tZ7aDf66uWue78cAsKHe3841rtvPWCUoazZI8Z2Tp/w9F/SMn1OnNcklBxzU3rMmVoJNgAPdAE2EZKBQGbDGfNuOjaAaRSdIe1UjLAkIgv9VzgBPYoe//3v6SgOfYcebQVavHh9fTVoS93FvPl79DhQpe6io96+N415xr43vV46igM4ASxCl4DZH/k3bOh7H+w49NHlTzzxxKSPwGx0CfpqA4D+Q2AHuik39WG2OfWhSgW95mzozTZDL6bkPzRn8Frxi7Arcb8cK/ZJYdfO58mFgoSjH8CD6N3rcSYQmGeirZDBC3ex0fQuHpfRAfN5Ra9a0kVXfnE3o6HPDAaQve+LSyYq9y+b0joMhB47ACx3gtNv3LP2ytnaGmVDa6K1NZY3oq5u6IjFdavuvmfNtdMm1beUtDeX5Q6vqx/asahm9X2wr+CV1fs/BfJ/3nXJ0/FQ7tI7ym8+cjv64k6JBX29evt0w1B1XUM81pjT2NHRmHPtilXbpy6orY+WDRITtp1vfyBibxKrmgThP843GvBn4VeJmBMgESxJhCRaKgsfvSFOnxUXfMuyZjwBcyYDfO2Xqv+wF22+//mO+zqeP/PN8w7H852wHqwVE15Lu4qlZzzf2fm8Q0JdRFNY3Ukq4aqkwv1oc+o5IQEEPxYrS5+/X7ycsF+TJTnB/oWgQIBzCk56osxPEXyCrGqy5R+KmRi95MSV/0S9qAf1/vPK50H70Q/QB2m/trPQBx8cBe3Pw+TDJPPKf4Lah/8Eln7tPpmPev6xUXRju/EfoCv/pPtrtI3ohPN4Pvs3bsPpuKfH9YlIMR6FjKBMIhiwA2LmTjY1E8R8Iy5oAxGCkWQKAbVgFS8auxcwmOuJmopdUrM+rVvOS//6Eguk4dpSDzt0SGROa7VWG3Jo7Cq1PDs/R62aE2oz8CBkNNze4wnRjGm4wzE7r4Pn3V5DoWf8iMEmY+VQC5OVU5ytVqk5eTh/eHFjbpGDB/SH6JKzh9Ghz7fAXcfBajxCpNFZK/bsPDA4EtK6ddropiUzXE5rsccmkSzVNdnsRYuy3E8+XrDY6wkM1umWqoc4naW3HK7Ndxs8Om1s7Yq13bNHVul0KtrprY+0N8+as3EwSqEZ/7jxZ9Ah0j1CX1NiPjdMtVOTqAXUKupK6ibibyPoJ54T8H/M1HH4GNQmzBKOqF0TK0YuFk+E4glznOaIIZeEqO6YcRdMBENEa5t0S5KLjxF8AXwZPFGmi4XifkqLj6LuJa6QIFWEWqQrUAOMYRjROOY8NXh63tvotnnlzry6G9/X1aX+NtJkL5s2rczFd/hYafk8dNvbpXW692+sy1v9qVr9L3fD4bLOopKJJUWdZYcb3P9Sqz/11B+uGFeUtyCvaFzF4XqUU1dKigd9ZfNAF6OdVmY3jfT7OnhXmanMFyQ3Ka17B3QB1daT6EV0AL14cuvWk6ASdILKk49dZIDMqpe8ddBbHCm7J2+MEuoclSWeQ+DmQ57SUseM7oXoX96Db0nqgXJM3j1lETihPWdMTvvE1jsa9N/I5d/oG+5onSgkTWq5o1H/tVz+tb7xjhYYrIeKMTn3luaUeg6+lbofzTrkKal0zF7YPcNRWuoJenDGvTljFBDfGq+d5Mm2DnxauO9i2vnnZFkcpcVU3yBqLrWUaDcGDERKHI3Q6bMpEZP4Mmr3RoL+Tw4EXoSwHWQaFjiQUJyPCquGj9A3bEzEjY+YojEfSSNuBcj0GzX6cGVaEB6Jgpj4hS5QYdOk+dNm+ZtbW/3BA21lkcoxyyvygtmLw40tuSe62uzFxa2d8sDgKyG8kganXXial/lkc+lrmEo/oLWYe9O7S4O16NWiIcWRpmI4Y6BI7GR9TS3YOXpUZzRwmdO5ZExkjobWNcYsdGBWfoNPe6ShVs26LXlSzSXDLQ4ZmmpPgE0FZnMRWhmRrTJ2fAyXdRgs7sJlNIDHA/GKoAW+50/EA/5YfOQFGK8SqhHPQ0cEDGytsIe5gFpBvHr4vMS/Ak1WJBIgI0PwpC4gs7BGrccrqCbHCPMQS8vxzRHgI1r1oShRtQ8YBVSrmC4a8wqI/QSeH+dEjcRVmM6Q1vwW1z848q7bDu6uqKxYu3YFUPlztTvWhkP5g8eMGZyPdg5afUndEw01Q6Y8d01XxzTwxIcM8yEDJw2eXd0ZcUohZ5EYg12Sv0vu15SpR4+tSn3dVlbePryi3DRjzkx6YlXH9VvBm68p5bnZ6x8zS4Mhd7bZ6MofWYbetpbNb76rkskevdDBWO4dcfXhwr7n8sfDqZO9ngmpW8Y/8mIoXNk1rgJMYaDkuZa4L3vtcwy6YROjvnTs2PKKcdQv/FLLgI/GkwftA7roL+w9soG8+1aLIeeWlYCbCf9ynlK6AXyHu0LeRFCKeHSEvup837NlZynmFfyNnAJWkAgOxkEiASPbXkERuZGYpBALcQEbRoCdJNq7IrAQ2WQWwI+JYgUmQujmJcMro9Wxn/KB3cjiYaI2Bpsaw1WDtYt7wL/3ou9uq20wmlnWb4yWTX002dKSfPR5fCqRq4LZ8tpJe/+6/DagYgw9i30Nw9E2ZDF5oN2w7rvfPb6xsnOYL6d9cQEe2N/vVbMBfGdGla6OT1OXzDGEDWp+zfYVf907cS9eB/XpdZAgNacVZRMEWoRYbkvcRGudjGNgTFNVBIXSxxF4TbOI1pR2KSMo2uLeJjqWIfvpAlAMEVWIjRTTArXUpAI69eHLrj68ZUtxR2XE6zYoQUJPM61jQ36ZUWdUaAEmsiqGGkYmpJBha/8dWzqiViNV10qzH+jwNS4fVWdwKyoMjBzCopUqlpHqh2YDhqHN8D3eYyjXmqqVV4PcyvqEMV7e1jS9vZwd2aAuUQKWBUv+sCB3icaQZXRDwNw8yBAoyGEskql6E89CBoD8MK2xxQPhkBOaAISQVjxbTRuyGxgZiBcAPkN3VWM683kBJ9yDaeShAobsOaJ9oKgbXjwZ4CBD+oMwOENcwk9QRQiyHNFeMYugc1qBUjXBxkh2bn19bjZtjYbt+fn2cPSLYjEFHiwJkZRQCfrRHboXnbzT7PPYiqrtHbLUEPThC6D1pYdB2TG46MpliVd2NZICdwLHvbcDx/2MvCMSDYeiaIojL9/uyM8DX12YcB9zMzq1t62ZpuWMDq5/73Xgvhc47tz8aapm2Z/GPr4wsO1b4Pp227bvRPwSyVncNK60r2GBZw3QIkRSDPMMBDlLwHaQnPRIzlKsXa1TqFDFt3q3Ssab6a4zx9CyAA29kqQGrwg/WMKnKadWyh5Gx80M5zGASYyvb/od6uwwT/fKzuElnGV/wpxo1nl3BZm7pu8JeMDKwMD7pr5Bf9Y71TLehMIBmvZJkj70+genZ4F2egrynrv7X9Bho3D3F3+vzg4Z6F7jaTWb2/fSlXB939/Pm3dKhDmB0B/4y4m8bNSUVt0XNPrxVzVxmZlIgAsWPi57vkNb0XxfQq0+ik7uPYheW8gB6ZVyjZYb+u6KOc9eNWLEVc/OmXao6UrijhrV2oLhkGvjfMDfsBc4jqZOZ5T3TghKaLQDvUqwua7fLLdKr5JB+ZQ5uPrb+CqD669yhcJEl5B45t4wc9Hqo3tQvzZfV0Z/7Zz+ip3wFWqoFehwbQE4z5psI+oTKWuBBJ91P7j+AsEhS+HMgYXQk7+QDVbjez2P77UF05Np7TNhlsQzCBHTCWCERtpgdtFprm5giRBuN4I8DDJun/AIE7g3onVu5Iloz0PmIr4kVAAvXkK4rmRH3iP5eQ/nWWzevHKtBwBVIDUpqAIgoK2NhK2WwsMFufflmK3u7LjGQ7AvWalapqks8FssBYcLcu7NsVq9uaUaH65og89YcUWffkTUasWXzD2Ya7X68stxpldbWei3JDku2+p2MXK5cQXYapQzjNyItm03ySXA6bblcVyOxeVi5XLzyjI6ny6wR7whi0TOOIS8PJvLDiVy49Wo16igaYUR1F6NA+ZgOtMBWLn5qr4RK4xyDjpdtjwBY8hyNskg3MZ5afwIwfzknIK2rz9ElO9FO+F4NsG7QAFLhLFJaL91gdV/rc+2wOa7Ydq6+tpx41YtAhHwkdXPNgx11gKJVRE7k7T6/Vbm+TPV5Ay+VhaWr1q2/cDK5dkBv8BHkD5FDfA7QjSIG6jBmNoxemKBX2gKe2K80RcjZ/rCvAv3ynA54qYSdKEeKLjXSuO69fT1nDghoVJZJ84l0slzYVh74kRfD9khHQAiFwQ4Dqlksg//mPNyEDUwli4myrfTvumJNgXxHoLbkODs4Zkcr6MB0jmzcDqenVjMCbFxpnfLM8+gH5+BaM/EdTi4Zd1EMAcSuDcSRHsgBHMmQooUeWaL0nRoDMkac8ikFKvhkAUnnjdWA1SMovyiDWwcs0ymqLiVjJcaLuMcLyEYxP7ClI+lLhs3quobCL+pGjXussseXge/qR6JA+NGVn8D1z0MLhtIKqUeXle+UqvWrixf9zAuwmlXll328GVlK7XcuMvoEwPpJq6fd9Thb11NtVDjqBmYe6AoYdtX2OEVBBOJODATnD2NgIBwjpGLElz1iBvwwuZxWmvWhJfOgbG42HeF+TOUVl0RpOoitkuJCI1mgIMMRdYFB/LkBqtKkaP3bhhlpZ8q+L6R52vHE9xU9DcCyyrAqT5xey0f4xvPyJUq+QSZTG6Td8rfV1gUnXK5zC6bIMvSqwXgky71g3qHHv/fPYEUleNiNrmMvjlikOcdWGAtkrPhURu8CvBAwXeN+IK1tz9xbeYewEVwX8fX8nwjyEtXxFe2fyUcZULKM8K1e9K30usHZe6PnyiNS0DalqEM5MuDAEt74AVbQCBOzIB5czBkZgMJCZfgiVGwOcHynCmSCPEBOBW4gXshupX95R4Qs3DnrK9rLt/1VQx9jD6OfbVra/XXs3a6QNPVly77cdmlV4Mm+Pbbb6OHmeRFGNwzQ14/Q48/ARqUR1vW7tu3tuWoEj17Yjx95vXNYfTnQaHQIJATpgTfdWn/0BmbgqGC1xCyw3AH9Sh1hMwOGc/VaVfuF8TBr+QHMkpNvl8r+ev5nlgJywjADtUMXgFdjO6CIrp+x6FA9BIpuoo8F4S1F01OPe8IQhi0w7P/TS2QTCG0EW1MIV20fdtjQAWqgfLQtvao7lyZoB0l7cET/TrwA7yLoiUXS90RtG/YYA+m/osq4CqVfA4EM+UqXUnLsNbyQKC8dVhLCRp7rsQofEl84X65XxoXwSBo75SlccD65yWeIBoRQV8mQRAlRMygH9qN7Q/B3qAtaEN4Qj7FWeC/CLytGMUz+T0Wru84gToCWQTsNxNielM4PyUsFZCi55pTtbC3L4nSiwJeJCgzSKTdnZOjSOcKz+wkFKeBI9pCTAjgBSqorwFmQASRnHCW/E8ggBbt6rkTVRxGux4H89YW3tmzC1wXnNccQN2fgeuD85iK4Nwg6sZlCtcKRQ6Dl0iZ6wPN83Hdz8B1AUH2bz2rlPxT8NtnpMoFr0QDURAu4uvSxWLqJi7Ae8bNEResZvGo14vWdwlaEPun/SXwgvMFFzCn1wCjLhE30XPXP7oe/wc/ruscv379+M51H9cOP3PPyIrcCYMnRMc7RsNGu4Sx+bhFbI25MTg4OrSq+eVVZ0bNr182p20MA6QeDjBjh89ZVjd35JlV1pwQo6EnNzCfNkw2hnJox8gVK0aOWr58VPqMfoa3jB3aODE1xew1aXBN4JDQVtsEgppPSxRas9uyczb6+6HFvqzC6GLQBKAUoAeXRAqz/EsOAfvsnYESO5TT8Ikhs2YNSTVr7CWkzWbg9XBvWk5L8CRwzxLcien4BLHBNyaADng4In7l6eT10H399akzY0DTcUw0t6Gnjx9HSxYybagNPEp+KSmi7Wf+efw4c1+fArXh8+XAI/bh8WcBex+bwpxgLp612qiZZKaCpKkFIkrkggUAz5BEAxjBrjGI43gxIiIuQBbAUJAWwDnTfh4I5oXg5MZPvqCexVEWT9oSEW1VUKnBxWgWsMpQ/KxPxQCWqdwNKjTFVot9F128En2p8/FKVqrP8ameHZw3ymyly7h7owGb+r5CNavzFYHlr7dJHalOtqK8FF0utWeD1vKwjA7CW2inBr3cYAHmArXLBZovi8gcgaJdkuPr0fuqLKlsco7GqFTLmx9r4hUyefBkQhMaB73WSMvjjbDVqffKctGR+J8NaqMcGFuNEWOuDoTq7ZwJjphl0I2DY3z23EkauU+f+v2rIYO8RSOFmCApDIOZ99dLeJ35gzLBvl+U4yTPs32wUz5MtxKfNfjrCVSeToB5jJ33IzSssEno0Rm48yAdPDGGQkSSnxIsNVgKYaLp3A8TecGSoCR5mlKwr2Oarrv9VLK9G1Ck0llM3dGUUI/ql8cLv75aulcEEmZqz/R63EHmvTOCripTm8RVcygV92cBb8GN57YRmC5Lj1qjIeHFzEraiiZB9P0EIDAB/8rnJc6IBfIbry1COo8pGBxO44KdS2cM4R2XdVw2B7as37h+GK3fLW/74h9ftMl3U2cVyiv+tWf0/etnlEPdLvlmsBIkwcrN8l1IoXgMrUelaP1jCoVut/wZyEAbZJ6R71bdYMjKy8syrI3gv116lbx13LhWuUq/C2ilc6fnVVfn7dIr5Zt37NgsV+JEjezWfftulZGCT7/xxtOkINGCE+xmhH3MgVKpGmoYNZKaTs2n1uDBeYFPOOq/PBNsSBHVLhIfmDYQ6047QAd7II0LksOIXgR4XTgh8UQPGxi7aCI9rGVOC/6PMvUz5ngsPgpJr7eUnBYk5yw+xuaJtcl/8LpwQq8PjF00MZUE56T38KyY1SvAUov8BrpLSKOp0xQpJyFH4hHvLMV+JSG4eoOEfRDo8RGYPAIfIBhBkY3JCiC4vxEmEKJkIbp0MvhCmAmkhSZKZDTSMVH6ld40FnnzrEGWSUA2ZD1jtNAyn94vY4Obtsx+qHtWzKIANMMMv6mg/cPFV3d2ztDDkUCBjpuc9L/YfCcc411fNH8xvXrUStTosfHogMbmcRlLT3R/VBqA5tDcKbubaiQ0oCsem7/h044wBKBLmvpR7jGxv3MGbXz2fjKHh9JrrZzS4xk8TLgqM8V7IB3EzJ+Eg3Q8oef1JEUGtDTxbxMUdQ/04LCHB/IuVL/+a6XeQO8vbhn+SJg59vHnINeHqrIRxcyZ2YDet45geC2YbfSxS+kuG6ZdZ4HDoETrQ7e88jyIA8cHJ9FBcC06kuLRYngTHUr1onFoLSyCCpAP7FqrzYBmi7IRmWg3oqEslAPzOIIfeuCLEwliwszSuG9yTEBwC8RHAR3lfaxgKULAHYyiijBnipqIure4iR93gwBm4ehoImoyRy/sxdyTV6lLaEZJK09vLFfUou8hSADNHTrb8iFbHwJs4MCcA3DPoPY1ewHYURSsDI1pMpmbF228FV5TnFdc0BTXgN5knenHB33vspqbky0lPwvdSYqP0BvYLpNnyRMrQSiuGj4RNY9vWuFEEG5IrYMbtfblk2cNMfuNriyP4jovWDljXqPVazR5gFV6Szx1qMvUTD9/RrgYK/RNS3/bEGuJXCpK1WJOfxyeCWZTi6nV1F7qKeoV6hPqFFAAK27TStAMxoE14GqyC51xzoGZwyDUJyRQb47rYcikh5ywpx4T9tVANOYzRo0VMEZ8SxujMXM0QRtzQawCGKOhSDQRLykE3lwciUX9Jf1CfX/E7GPEuRjH4umQ1+wNeYOCNAVPs8WRmKDaWmw2moycg/iL90kCUSLJ8nKi92N81ZJoxAmEk9EcJVBMGTa7BuA7B0mGOSHu/Ar76JgdJc8fFzZ5ibdkH74MeQXiSDtj5UXyQuRO0XN3wVcxpTNDokmRcN0Lb3pehXRmJo/z+siWD9kNMAibkwnCGCeIcDUYIu0U/AW+z5TkTbOfvWLEiCuOzLkpuWnylDvXTZywfv2EiZM2Tpm8KXnTnCMk79nZN8GZnI6jnQwrkbC0hGGlkKYJKIrwBwEe7GdMJl5vMul5cFcl2wS2mjB9w+tPm/1ms38r0Zkk5cieO2CgUAmC00dcTmuWRu22aFwuj8vpcR1wOnU24mjEoXm0UG22mg1Kk8fmKlRZ3FaDyupxejZKVSq+qMjlcBQaZzqDIZfHpNYbvdxM/yaz0uVyyqUymT7kcfJqvU5vNut5rdrg8Bx1uTR2ZyjkdKi3mJVOJykmXe90akpDIYdT3UY0hiGhSCFDM5DEhCckTz174ABi7h+Nm2o2aZbR80EVqBw5HR1D706fDvJA/pr56AX0wjxSYs5sXKLvOE3rDCqVQaNSoTJIy1lAWkHF5gUtVj1vGZvlFgNWv5WcnIARngKK7UOUbskz4IcYjfMsFoN26zC/fxj5NTZoDeHqsMHilUBGrlFY1BaDhwR1arPOorZypip7dra9KrI97M4K8SaNR5kVwvVbfIyDwRW1FhWwBC1Ki/bqzKVWZ7Kvblw92JBdmW2gyRcjLQKFpyB/5JtDQZcaMJ8MnApE//TCXCDHswHZ+aunxlLTqHl4JriMuoq6WfBySBBhBYffBiHAEkN4XcY5PJuWIcfPDSnBUaiIcS2MKkGWnFb0iWUGBdCpgRKynnP0QkDwRM8nyOhL/0BU0Lwit4v9QmoIyvzOSp2uyuGXfF3LG2pOjZwxfMqU5vxKV10dqM1OOI12o9PizS7Lq/QXBKS8w1RkzskbHK0FpkB2cU1NQW4wHG6ePas5h/mpbh96Ed2LDAhJPLZg3wPzds2btwvA6wZ3jh+8/e2nVixduuIpsLV9bkt16dQ6GfC0Jn6WJlpbE9zPiVb4U9Rje9/uVpXMXNI8CT0WjI4Hrf8K5xnkerXWaM8LJMK+bK1KojQZ7Hnh2qrs1kBdpKgh2GqYuWNm6kmoCY/bseGaoiB8kdx0nhSMOXEC3Scr7SxtLkOPXaNtKyxBj22B/jPK0ra2UuZ7fCTkuL7/20FMkasxH+rA9HgQc6PDqQnUUepveAZngQz4QQ2YRlF8NAQSZDLG81rAHDOXkOk3EhBPQDyx0RBx6s75QkZfyMf5eLzKRc0JYFAz3iCeEEMcJvTNCVzN6NNFjeLF+o24dHhhNAtzPSb7ExGyF+OC8UyizmcMkf/CVEjWXiHG9fO4Qgb+eYz4c5MfJ9gg4bq4p5GFQsRJT5CHNkg4F3BiDp90DfIoEUFEJ6SVxAtoIdFMdoUGPCZBcBM7MEG8KxBRpY1Ehm+Ku0DCKMnkSQR5RDrPBWhdpjm8sRKc6g2qGQH7IiG0TmzF+HxY19x05/btoGr6s+FRI7OBJ6djRC76jBzB6+Pz+kz1k8smb7ZutTZd2nXJvNGtcI9C57CELNmyde0jz1KAae94ayH64PjxPTfeyL4r9q1F1oT1PX6xATrlcmA212aPlllLrX/3PnHIeth8alD4oKU4dU1u7sume9vEbrgy6nokYUYvukvfMTd+Fo+gO8HYRMkxY4X7QamUgboy9z2VqXyLyaqvs3gH1d1cVI4+txptujqAmVazvqn2pmLMl/z1r7tvvBF9WQ9/mrVunddbHPGWhDeu8PuKi31fWWovu8xjDeQGrLHwhuX+8uE3Tly92Xa5ddiGLTVcjsat1EnsfufEqQunL6HHLEhdPnx4cSLedsnxSs+gsLMKfOusDC4oRN+8i/8qK4EGnQXgqadS7xpcBhUHwYTOTqAZP76vFGjKcL3UO58khg9PwANVVQUFhYXTgXqMWakEsKqqvByszsN/Jvw3dWpe3mNgKymZ6jSl/8rL0eUVFeNVs6Yz0rEWyxlzWCbzOuP5HuN0oHGBeyw47nHFZD6NSc5NAxrgTF2K71qK7wrvRd8ATerSMeVWrZwL+kM5ZVatDEgC6pm+cqtKCVhFwEUSDYwE1qNvX3+9snLLVRV4dpXrnHww/Cf8NakjR8j4VPSPTwXmunx4XI6kLqG2UPuoB6nD1B/S3qjS+0S4S/s4whEQxIeB6QLoCEdLCOYI0WcTpGQsHxeSB1hv4zMuQQnFNSAkQJWQ3msWMxLgN1/JINbgYyVCeU6AO0kQ03DxAU0XzsPw02jA6YsEHAFah5lVHVToTTYLmBL1O/0k9fQ9rdU9PKwDUkmLAeqBUq810WOmgVg2SVHT9sYhMweVOyr1jGoQD56Xsq0Kbl4eqxvGSkP5oEOFo9RZsK61ep9BuEiHkvnlRWyDyEXwekAu8oGqWSEUrefhqaFsDp5JoIIP+7kl59HVywPFWY5A1LMyxwXmKxjjvf6IEN9eEePRHImcv0Qqp+HUvwFWIveEFwytaLIYlDItMMpl8r27tDIWLtnMdEtVctBdmq6iuvSXVYCW0YKDQK1AXZCV8YD3mfDtzOCj85ZissfSvxZrqAg1BK/EE6gF1KXU1dQt4jqMF1RC/bK+uLAKC+tuetnl0ojchJYNCstuIg4SvpiGjqbNKEWFLlZYgPHkq4sSXEleWMEFK9dQGk0ycY6BFzIk6foC+RsMRX+BySmpMvIes97pKANPXCKJRE99Ud/ozwqW1+sbOloLiuoaQu4iZ4dbP6RrRFEUM1tdG/QFuuq84NCswixlDrhSo8oqlMs37bKVagt37YKX5IcH18akm3f5s0ZGq1BeQX1BQT39cFFkcteimsS8mRXassG5BjP7MzyfS1o1KOCTnXCNmfZpRZ1VZVLbPN1ZwVBTeZ1Fbda6rfrF2YFs4Fu01bhEOvt/RvldiuVc5CXr1XSWqxRlg4gbPQT+8uHqspLSwtQa625FaR14kdy5EH2+uKZ285JkZSI8283zhWr4yHkfjqbUmCf+VkIJ45wgK+nNpIHIfnCIjZQIY5msMsBEYEoIGluc+KeqZogbiczmE168zETVXmKq+rKlBNXuencnAJRWWzE6azYTlQL5zw/L7dJROPA0H+kYVxX67DlpaXupdO1zMXAHzoEH0d5XS1rm7do576Gs0RVa7dDZklq5XXbqPimUd+ECt2d5cybecN+3V+8BrIM3EP16A6/fMAnMxwVEe7Zz72HCdEQb2RXqf/ioDKRdM2pB/9slPEE6oSfWA7/6Yoz4KkNTP9ELcx7fMummziKmN/OiO+EPB6oWVYGGUb/6og+nXw58Dn8et6xm2oIoSqJa8cU3PAO0U9Fe5p6u3/ri/RjHbLJfzpUgmkPEd6EwhepEtKdfiwMPHhoeCcdm/AqKA8SX8QGREPdx3MTTC6QuDtM0MJw6AXqLODl6Qc7Ri/TqLtGBgyBwBLEmTVsY1IbbNE0gptb3QEGUkxKq/ocw/e9lMghlO3G4r2XkqmUj6aeE29wdKCkJ3K0fgGWcJ2g6El0EAjlEiZAutJNQTt6qgdpSGbEa/E86KMy6oUtXlb2JvgTa170jZ3eUapdrNw255pEntzdeI5OskMj7fk1HBRxdGGnLxePmrdeBVmbPHpK/UKttyi1+csful4pymjiZjM79NS2WgXJ4NfHTKrwD2cQQbPNZomziFWe29NavXkCbrBE9cZpNeMUkZXGn1lIer/CuZI4kcBoCnuIAuHKKfmP+5JrV06rmT+3qGQ1LmtdcM0zCc1MKHWzJvsm3P7L5b1vGXhGECiBjl7NSFq5krVmO8nH1RWg/ej+jCX/yEYVNmi0FUD7rzBbBj5/gnw+MA/fAUwtWVy04MLV79ZZXdIsOTotCEPNE6sf97sFbgfyWwbV8qUSpYBWpmy2WkA3IQlXL2zD1PzHTRNfJoKJYqVTJRnaSS4JS4Di6Go3r19sS9vV8ZE+PMmmJTZBBA4g8n3gEYUM88YqZFtoTfxcyEAJGSeORyR/Pkcv/KLfJ56buCsReP0vVJgNwwlwxbc5Hk/pegrW9qV4JdQT9NOmjOTjxj3KhbLIWUK/HhLJC2pyPJ5+uFcr2pvXIkCCHzE776OCozF47iAuOG0yUj2jaEl3kRDUjGd40Nx8d2jJ11brHJ8J1FX1Ph7aOBAz64S9rnltazjWWVmuy1da65llzJNSkpppxqavXTDi8PjkKNsTP/NiywDT4T+j7SXe8sZyNhLyB+kkVfs158tD8fjQ9AaE6ImBoihCXMCrEIOk2gpfKNGCxC/JGooMpYsdyAoTXxSOEkyGaZp7+fyJHI2pTMbFzMsVfRjjqFJXfHnS4cn2WsMnk9LcX5Lf7XUZzyOLLdTmC7Z1ipleI5KfL5Be0+50mU5iU+WUVIRfX6W6vJX4RxH+17d1nqCGlsWG8w+vgg53wP0aSRKjjsFvsJrWWt9ocTquV16pNOMEhpAohUNsr5jpsYu4FBW1Wu6m3vRv0otrMr5vWto4cFnPmWbLc5cEbW/5jRBzzgryKJXS4x0i8QGC2Hf+k1M8Ung4AdSoJemEtDp5OMlRfEuK+l+rt943SK6yDWrwSUpj8F7w+4VktynuIHxD8/Rk9TUHvPPTJre+I8807z9DsygX7U9Q7eN6Bl6c+XLAyMwulqFvRJ/PgHTSFJ7jzns2deTayZJCRRoZbSBhhxPiOLBnC83JUSLsqtRUPlE9RVy8cSgLg7VVanRE8ptaL73ACtRp1QqlMIbFMSJ/2t8RRzFiqi1CSBLeYEXWGJSHiXbkftES0EcFrFxTVoYkTFBFtWyKAuhIpp88FzVwwJBCSrFIud5X4A2DQsZ0Vc9taImWuYkVWxbiVHV0PzvrTrY+MKLWP0jjBJnT2hh+uGHv9K3PHXjd7bHlFTrmt68oRS4M1HWPHNZcq6IcWtY0uAkqTi9lgc5ibi5voWonPmW1XySd8s+P3gfiU9vXDL3eMmDsuvOjRrp6vptTE9nj9YM9tAOyY+9ruicHqaTMuX7oj/urU9pzKLLc5v2Juk1Z3yX6GNuco7Pns9GIjMNaftxaMFWT2RPcwVJLZvvKZMCkdEvFIDALyLV74TILiKkvayGwU5/5EP3SxMMy56EVw6vd85vOHZQws9sd1wMBPCsk9g6Lta6F26gxnOGIHIyumNpnLQoOGJ0fOfGIezUx6cOHTkwyKypwl45fu2T+n+9ICqc+U7U+UtuTM3zPnPD8GJx+ol6sCDqhSQH+hRuMfHJc7DUvbOW3XOKdU48i2seVN1xXunLViSHH3UzPAgicWX2K3LGwf8uCyuffMX2GcUj6hrDFkvxp+cr7BA52W8YoYolHqfM+7frKx7yEqTJwHR/VaPIMRQwct7iUePA0yybQeq3iiBa1YtG7F1VevABvnPHvVO2RtS1GZVY4mIWg5VyFz6kTfozfQ950jrgJ3X0AfDLAnpAS0fMoCxLvD9NMApl+tH7O+/feZ1X9v5tHz7ghQ+tIZGuL68x5GmP+Jigc+EetLC6aOCCoX/s41RBQi0ZKxEYpiMh94OJOZEUD5ie2B4A+O0A1ZeArJIj7KEiGyjJJ+g1MIzya4p43i0R9KhwjgWjQCT6OXwz7Lkbohm48c2bz04Tuf1peBxSALZU2fa2TZI5srqx7UyE0ao0//4KQjQAoq0Sm0HZ0a3lSH9uk9L5n77jmMTgHu8JKZVwqqlSAJHhv9oagY6TEAxYSZh0GyKeuM+wj6+cj1X42uuREkN8/e+SKQHrGgPnOJWuEEzJSNm48A4br4SlMfqJmGcm373wccWAK4xJPBkmCSiOYdqDtvoF01J/ScXIKnR10gT+YzYFS0RJAFw/P8CPsuxLfSlRDJJzEXM/MZ+TAjym6dQ1ifuW+e2ccOYYMuJugK/tNhSCUNDocBJg3gICmcovAhaZ0tewTYwRhgf0Q21wwUA+S/UAmSZqfTjJKuggJ4SdjhCDtSE1J3JWPDhsWS4hFO6F4EXm5bXlm5vA2VzxLWhStw3/sZrwsFBFuAEoe88O0wDy3iWEU9BAVKMCPwiIIsj4khkjFAGANRiRL3gZA4f1QAgeD0E+ggPJewT0b8qXp/JOKHz/mB1NyXQ8L0NePQew88go49ZKb/TBL6Lh0HQg9s/vbBOWBpxL9Jt+l99NbdP6L5058luZtxHBTf8wPYOf2IPwL/3hSNNkXHjBkV8fkj197zEHr3kUx49kPfgM2+yOjRd6O3PtgE5McjfiEGij/YhH48HiF2FYqzFPND+tvacf9fJmCK02Z9DPOGgq10AX41gqVkJhB7ElpwTk2EV2RdkdBpkVZcV0KsUfziRoWLSUQE+CQRkhyPEyNODoYkvrTrNUzkmdILj7Bdcc5QWFQV503malYQG9JESRyKaP6QPrxk2V3BMnSNiw54lTk+9OY+XZamctWwIt4wfPZmr9qcpQqW1TsN0dusFadu/fste/B3KkV/WBpQKnMbx47rcGo5i1bDOBqrsmrHB2jmSpnUA0fEO+71lEhbS5XOh5y58SWjJztWVzmz7+xo2/S8BEoKshuqhwcGd+yrGh5UT76vb8+i7p3vMZejp4zghYbSvu52aY4Vchy9ZRoaL2fBlPd9fT/4D1xjU1vastqn1cbRrdk11++/714Ac4ta9MUxBevyljh4hoE873fYTJaCKwa5l7qUSig/Cjl1bOjeEV5PrXKOTun9cHxi5lpbs6t6tQYcnds+M/WMTqJdf8n1M4dMG7oANWmqJ0+q3YX6nrskpwyozvn7I+ufjYoLOPEUiA5czHzp1Y8sdIH/mBMPkM0nGAp6sgiIvPAFiX8PE+PJImDv1YDHNCyte0t978Y7Dj99zY33qF5nq6JlNXJbPDQF/vmo+p5M+htMdYSkx0LFCbDQnS/ROOCY1K2pa0ezVp0k3+XKl+jNkjywFfBw2ljWomMLXL0/U1B72+P/evX5zx/sqW1ataxoSIP/6gsTWp5469UqqVIPa2oYjUpa+co7b79SJVWrWU9WHaNWyypfpl8/TaatzLrCduF2cVIVosZjGiA9OMCjozDSBY/DapBZ7DOeHeOZCH1C8C3Z042+FgKYYX9768ktILnl5FZUROI4EWi7e4QAfR3SCmW+7u45kyQhFrPlW07+H+a+O7CJI/t/Z4tWvRdblmXJsiRXuciSbINl2ZhibMCYZrrppptOgIDoJEBCT4BAuBBSCCnkm94wuUtCChzJQQ4Skji5NO6SXL65Sw5safjNzEq2bLjcfe/7/eMH1u7s7OzszOzMmzdv3vs8UBPZgZ7SKhlhEU8daWFaBBsQNsEGJEg0eKie2rGcgFXNxwGrUVz81q2unL5ORR1yL4a33oOjSUtJeifJYkGHFGis9G2stliq1/kqDQHEuk9Ishj8RkvSJMTdBwz0oCofvOarQsG0ilO+qtVbmjrON23Z0sQWNG2hn1uIc8EH2O6rLC6u9LUbjV/juK87z0sP+CorfXC6wfBMdiV9qOvpLYm+C2k0NWMtQnsKsOP/kpvsCnfDj3ZfBQH4ChwAXwEBsIaedXxpJLT0+PGlTOvS4+B12h25B3H/FCijH+qKP467g6kTj3EQNYKaRDVTc6mF1HK0CtxA3UHtpPZR91FHqAeph6nj1JPUC9TL1GvUaepdAeuYIRahTGwX1C7CP4GuMcTglhHQD3TFOEoXo212P/4JsBM6gqOLjqhiDoDuABJrCmjcIh7YTU6UJ4YB5R0BBphAQGcHfs6LVjgmI2MPABXw+nijRo8fMmkCGhPIB7wm4BY5HZzJIKGdbg3He4FJl0+jXsO43BLax+gcOsBXAOKOTgZMfjFl1p9lkvWnGXtSshq2aIo1cIHGbEpnT+uTmXP65BT9WyD9fTbdZNaCbWq/GtylxXd/b7LxL+uSI26wER6/Gx4HzdrsyFhAn1e98rJCTT8CV71GZ8Nv1bn0k4ANaazGCLxUAZapK+EIMEgcaeHASLiVRaNkVwi+e+j00UdYIH7Muh9kffYZe/aUiFmmju6+CP+IvmdmdOUW8HX2COD8YQMDjOJLnBjWAn+k9Sj6x5YXrMv8Pc08tnYQR681pLHwPolEj05PisWmdK1er7cnieVgCJuml0jAVC5Nj9KARsCCDBWYLRUn2Q3onz1JJIcHgN2oUMJX2LTIWTAZHlYzFlYi5eC9orfA2NfFNGg9c0bdMVzEVQ+ZCaTwbAjusAA/fJRVodQnRRxYXgUqH/rk1ZNixgdooFacBAoZfPsQKPvuUzG8NvBtWt72eQ58A54GXtV2+OUnuWBLB40awoDaCywHLCyEL4JfPoNfR+6AX4GUP/2pH5gpZdFnzoze18AI8hKC/48x7yjS/TsHA/rWCYp4z6+nvwZNz6+P/H398+z5p0IeaPGEKvOYxvWnwPT2qg2vvbYh4xnwKMYwh3pPH4HerEfj7XZKSjx7Y3kMSzGYcUF8C4fYXnSBFplASzmFCw4jxfmpgIg3Mg/B38L0ZfqzoOl8A5g6vj9cGX1j/vhgC+2HRxfRGjAlUwmvwNCyGczvTz+x+eBcMPA9Q30lN+s2mApPjx51Hkw6e2flmAXR03DlgDFgHV3W0RtMpfVLx81YDoPwY6W+qHK46SyonXfvhidjtEFMsf8gur+YkusELz9khyQH6PyIzfZ7bVi5k4nHM3ihixgZwTkdT7xDmfwmftrB9avPnP5iz54vTp8Jr+IOtgH66oEDVwEN/3vtuUOrHnujbd++tjceWzXztqfGvHPixE+BP+y599Onjixc9f6S94+deIdd3iEuHbtnz9hS9tqaWbM6HiqtZKKDt28fHGFych1z5qQzW9l7DlZFhnmLps/mBD76GJqbx3baW4z7n8uhb7ruAlhNQFohtMUKuCtW/Xi9lRzgl1b9NBxGB3jl1mFuy3cPdWQ89N3qmdLfLJg+OA9kv7o3slu5+cQx+hOD1WqIOnBCWoeP0e/xETyOj3AYCc8i4X3o+NBD33330OI3itLdC37T5/k/747srSqxf0xhbUnqRlAk2M4IftoMxFObnfhqy6MKKR9VSpVTlVRfqgbR5aGIMo+mxiPqPIOaTc2nFlHLqJWIQm9EFHo7otF7qf3UMeoiGhFY9OMkR5/dgK3XTD1/AROf+MMuiRJ/AOOC/coP3/caAv/krgnrsxj4W/yccQ6LgN9Yab+gjubo1KcDIpeA9W80eQMeERZei6jItaiYu6/9DL2XPtp+Zqgz/q9CNVOVhn5Wcm5WDZmpmrkc/W6LnSOVC4F+ETAsAvqF5C8W7njBueiBnvE/Dl7UmbEzumXtCy+sXff88/Cyu3d1b3fLJDOT1mdiaqDEEagfEsjKNKTXqBA3niGxKs1GeWrAZxdR7TvgE6ChkjkcmQw/4jLffht+uGjRnoS/u9Pz7cp0Tzr+Keye9HSPPX+CJ92Df+Pz0z3s+xk9/sETQxZ1j1k0JKNbnujP8fw6obTg9owsCQd0hkJvRbbUmJvmyeeBTG9IEhlNZUDFyBgRLTXlxf0LLELjbzvBe8jusYa9lXFezI0sZjQm3t92+HAbAw+33X9/G2iryLt2Ka+iIg88mRuifwrlgifzKsAWfO8wTtiy4DBb0v5KbkVFLleNj7/5DTrG+NBMRL8uo/MYRL24ONwR37U/TwTNGB+QFbxEUIkQSTHNAZ+wyRFXZRce8HP7ALvng48OjziwYmHzjIXL7x124Lfn7596aQRns4iVht7T4M9rNn6+GaScW37x8M6Nm46Nmb5x7UTrDI0+TfPH+8tmlxeJVYbkXk9NOAXZUubF997Ydej9wLjlGzYuHxd4fv+hl2rL2VSdQZnka5yz+MNNZ4F61NaHH9k6auW0iWGnVa8drL//vDPXaVDpUvrUdLzmTFXFeFnsfxzbEuRgjCiiwkB8UqYCoirWCxCQEYxFEseyZ2NnHfGwQPwKoI8QJ3VBEGDiMhUri5fhLHbQi6UWxIcvCUS/FnTIBVXyd23JHd8Bnkti7sVJIpTZZXTSJ98TxCbqZJWM5QF70uxiuueCA9FExXKmFVJJTmYFn5okVRdgjD6z0lvNMgEUVGjTjE7e1YVrj+st6OMPE3qbKq5GTzygmYCxKAD+0zpzlKtYtxu9djdiMnWAwtDYVHT3f1xr3S7gxDfgx7t0KOcblA7nl/4/r7vgR0Pg37E3TjmxNUO3dBLG7tbZJbTdaWcIQ+8UtsyJZw+MU2AvukDPhxfAVTA+2u+O92A7bGOiKObVyOv08ffgD/R8MAa2wXYwGoSVtDoS0pZpIyE1rQRhrZ0N2xkqOoPeH4kwLPG3EfmG3k8CIDwdUtp8TYTS61lKk6+lKWzHiSrJf4/mohrqHsTpUxwWy/NuAkX964eAYBz7Tw/OxEQaBm+ba7zYzagBQ4BiHw2Mpiv1v3olMDg5H55meB36yOExw4Zp/dphw1D4nx5wol+7P6w9LyFV6AON3noyLGwDhU9a9ZoPdIk5/errQAhgEx+I+ouQoe6f/X7l7m34bkODTtcQAk5QZi6XloEcbBwOL5ZJy83wTfixFt1s+NVMWLMAuRkff1zcl0sfailF2XWoJXUqAGJOINNjviAFN44S7IAaa2cxKCAWDKM7xx4TcHsxoRWILcZnMRYRkBZAgFyNvJe3MnSoqQk3RLgJUDQtHdlvEm/hJ/UbKSV6ujL0x8g5hUyjNSkyPDqpQiaXKaQ6T4bCpNXIFJyckZFU4IFdt0X23bZLkuoZ6hvzoZF+/QNN3wxbrnVO7znWXFtGX80Hr/MpHzZUjM5Wg9ZwCJtIhcJ0EUuLdTStE9OsVsLwPGsXm8V6Xs6yyY705OR0RzLLynk9irSzPM9IIkdvu/PO28oX3jFvkvlKKCTXZ5aUZgd3ZDuDQWf2jmB2aUnm0CGf29ccuTu2bxBFtKwOcawt2NpFSWOrChfZKCEiUEeC4NvVaRNupU12L5aEBsheO+7uMaEEYtVNeK8JcbABu+AinYjbM4H/Jhm7OCqvXvfyjN98r5YPGdK/aZ4z5QbVt1MMXleXtPJZYg4WHrxpSm4qTS0a8anVxbGupKhd32+hLmUavvlfi9bvuPudaxcWPWWCbzr0Ws3u/NwNr7zChYH4le4yd/D3Gae21PGyL4/Mf6v/7Pov16W445LxlLx5iNSlFKUaw3lWk9Uyc6EOvdbsOlGRYr4c7dg5P82WhlZ0WPD+Sk9xe8y/ERfm2hCPOwTPhHa9krZ5aAFPw4iVbJQsb2WxJ3QCrEFMGBlBVpWocdKplxebMbjwyrM/w/afz66sWry8vzmX5dLMZU2lmSrAFExed+rCqXWTCxigyixtKjOncWyuuf/yxVUw7DKHBBMn1Hq1PhD21TYRX1cV08rT0sqnVRQO8TvkKCuUoTQlyaRmZWkOq15vzUiTs8okU4oU5YTykzv8Q5ghEDsUCwv7Efjnq60Fjwg+sehOnzUpRHvKjiH8BAxLtx19/xQg+HLRmYwAzXkYmFbEy9CMgHcT7DGMSNoUZLAAnQKFnJRloju1xdroDk4NFhgdXL/XROlGQ7poV4mWds+Ad88XO3R5srW/Ezly07nFcPQM2BZcO78+I6N+/tpgG6QpkYRho49otfQYWptiAMnRaXqzWQ++anGAEzsPfqLR01wWbKCf0JtTDLDg4M4r13JqQhkZoZqca5iHo29QbJiLENsaCugpXuON9+pOQV0n3q7GA2jifZbVZuC9IvRjw/Dy5bYu0BghuO9va+WyrZ9vPA6yn4hQQo/Dez9M6yfwRdSXEpIK6kSs+gmgPbjp610q3S74Z62wm4OfStwHxbaA3X1CEm/IdLqHJhvAJhADwvEKZaPUXKvZRV4A160ee/Diny8eHItOS969D6yGHURYOSNeNHidQ18bCmpLIrj2vneXCKnxQ6vBapJNe7irLp26KCymzeWC7ZzWgJrQ8CtN6HNRROMMURyssmPFVINQEl4ULzQT3HkSNaqA2EBeKwQvw8sndx6rEOk0fQ3i3NbvWnPFqeUanagi+mBXJdjfDYB/eRi38oaER0lwQxLo/8nDwDCg6aQ6RT9r3bpZ+hT1yY4rCVUi/YHMNVXUQLznHFN4j1cDg8f9i/rhLuKnMBFw4vEdrxRLYZv5+NdYfav67f3bOrka2N5deqWRurFJqY1uTvg2qLOgr0O6zKYbh9++dQVRJ9IcfA/kmJRV/aBW2dGU+LXoTtvS2Rg95D+pG/52ATffCTls6CZtj08GgU6kYr+teyNw/7oR0EdeXTxNYpYWSIFk5nxyBxEhG765cdbI2I0xpYfBrsP/YSvhbvD2Yd98KRDnilOki1o2kT4fL9fsCbEbU0pWr76pFbHsh8b6TlyUKqGCVC3VQHZmjLToVqTD/k+ICO4haNY0UmiSdIvUTBFhSFxk4gUaLJPTgCIURvMnYUtEUL72b/sSKAakepAbDXCfPffYY+fOAndkN2JdWhfNOHBgxiIys9LX71i27A469CKuxYvkBvPXg/CHJ9TdSNHNBOkcyNMZFi0y6OAfou+sB3PWr4d74C+lx75oe7hUaHLEkLOqIUNUMAJitKH04bYvjpVivg3cEPG4v/Wj6qkJ1Jxb9TnEPosoXpTh9jABYep0duphdu+cptiAAsWEUTEFgVNvNKFWowJ4twvRRQobFpJObAWibj2trsKYBn96/gN4tM+S87vrxZI7v9i89OPRpP8kpuuV/twuEgkp9oGP0F8k/OkxBijf9X2yGTUk04oaEEXAn1AE25TY1yb+EH4ORsypH50SzTj66bLNf96rEsZgKDHVwImSRSgOHtG7ktsfJodHIqZU6wegwrl8F7we4REXhGIsaR/A0ygGtaEotq8xELXhOKr5V9oQ9Zl/izARdyNCU5K+R1i9gEuNe19nn1OjLhfu0YQ2+I9nP3tpydabxuzB67ebkoHipbaXdj3xdmxUUmEMFYCqs2TagQPTlrzIlAqdj1x2H6eo7Z6BkZT0VYNVNw9WzYsg/YGXgSo1fdUkMhq/iXVDMB93v9KHQevDpZHOrgdDD5d20x3qRZDjE+dMvlNZku8+ewa6NCb/6Tx6cZtE4kFEaNvg7vPp4BNC/ImLvz6vfrhNakYJJduHdJ9fB58Q4k9c/CfzLH2DJfNsKfHnaKQMepol27paf8DX9ZF5AdRJqEa8nl3dgo7Vhw5fBu4n4IfHN36+VYYpC9n8PDJOKMQ7aC34jlCfccKN6121YVYlwRc/eRj+eZdOtevrTQeB9gm18NmOjROeeVune1vIaNwxcqMj3H0eQis6PsyujteFoKALpU4glyIK6/EJ3JbR5PXFN0HtcTCq+Lfh5+p08CNJiiRPKn0RfhSj8f+kjMD1olSahxJ3hLqqRM9FFYYfCTdeFKggmoeeANmd7SNEvii8JfL9TfMq+TZYPiTwkJ1AcBReESCWt5MNwOwiKQl6QezjR/mE1iUMYvQ+ohM+Fc9UsV4SfbfHOxGBDbMYTxiDt8eYUaqzO2MtLwpe7+QjN3f1VnQCCXMm7euKRycqAYctI8HXpsYbwIqv3gBRJcQAw15NJ3DcY46iIge87S3rV/nVKyoWbTl65kzUjuO4cJGj/bijiB727Z6SEvB7yZFdj30bfRzdGOkoomLv4jB9q8M7YXhdwBqJ09F0l1spwsZR6KXaQJfYXdAFZ4nQlACbC7u2HqZ2w4k3ZxwG6uOuhqUnZlRvSpVmyKzG7CKnUqLKGcPbmuvLqxvHhAITKgpTFB8/dQb+PTk12WqkVd4hOUbmsTmn7mou3giPNL1wfO2gUIl7d86UnIaaIk56KG3cV2CMtbJ52K6hwar2YMWwopHNS2bmP34aRt/KbSjIkVjGMKqG2XPjcukVqO02ofVEECOWUAIyCdE9J+vsgOCOzEi0EQGpEMEZQhFMIs4tHzBq4zBkGO9OR5SPmPfMj3K0Rj0vv3Tj5B11AwDTP8kiSuJ1KrG4qC+XXl0yUS5Vtay5+sjUqY9chei0fMhPhxFZB6Z3li9/B17d/9vjcOKWOcvfoYsaJZzUnuP2BfN2tcweJR7bx8goDPotvKFGyotrQr4CHg6JZYJOa949dnVQMzcdZwLPwavvLJ+wCex9+g/7Uc7Er0sMf0zAC9IRGbEbtQJasQTsPrsG/TpNlRLC2k6cEeKPhvywii+FfyJbSX1JSX17UsKF8HfvdQrrUuNfmIDS3EtusLZ4iBZSRm1YYEhTXcfOfUeCxZ2DLWcom0uNcQVBjIVN0CKJzwP2uPYIcXBuiAuTOG98BYM1UrFnvInw9c8xOj8dAk0KnU4Bj+gUrQodPIIvQBO5iNrqigFVPQOLhniDzd9vWrlOP+Sep+8ZotdtGPFZcR0djgH8w/tvflrIN9paXPdD0Z23+aYtmTqxT6amHP3TNNUVx3Wi+X+Q+nmpkQn1wz1RBQS0DAEL0FdcQYYYRlslMh18xP2V4wncQmJFjTZSTcJ8ddXz2esSyRaJQim5fl2iVKAgDvSIiRqedTqHGUzdKnwADDyg11lSLWZnZ32jn/3zTLpinnX6fc5hTFflV6zQiFI8dr8zQS9WS5kJ/SKskqCnH/uE8a5n79SkAZQIze83qHZEyIkQiA7tu7Bv3wVu5Of3R0PoEiOhhQAm8wTrDBrx3X2h+z9H4XAXli6mY0ai5cJ4DXbebrBLcF93231ehqi86NCs1toKfwiAGjgNHkT/p4GaAPyhtRVQoA9YAfpAas4lEQVDreHWSCuDT6A1iqqFpqs4fRHeg+caB6bPLKbPiKchn6pCcKud4dXGPYuierOY7+945qJabexoM6rVF5/pQHzZj8SJE8oZ0fqXN0bC617g3lFlZqre4V5Yx4Q3vtzeSnw2gfMY3qkTby7h3TmCNOLW76cT3k/9y7J8IfgsDUXbGCi4NA1hK5RbFktw9Qpex8WKJl7E92ruRHRoKfG/YiGYNxoyQcTceWMhidEkobEPebcTz9USIETSI5KTNGqYb0jV65RWcIMJ0cbon9nZlgIT7E8nR2/kwhWgWuNQyulUlh3bMTvZIb4qzTexi/UW1Q2KmRE5DKR0v44vktMUV5ivmMip/vQKWmURwZ/obvjqqp746nZNT0z1dqoHkjp7XNB+S6KG3xCJH+RuxOyU86lqahAVASKgBSnAieh8b9AfDAUTwBywDPwXeB1cBlcBpBXo82GkNBfBSTNyWNqNPTG7XaIACROnZiIhDVZA8BuBN52Pgeu4Y9uZxS601OKDtBUAI+KdjUKOrJM4qcbY7XhxETsWC+tbky827eG9UMTG4akuCLD4x10c8MSeQ6s+vZUxYYAlF08wljysOwPDLAW8QQZbd5kEkSrgDVgLFZUYJ/IGgZXcISioDj3vF95pwKh9qIAmP9DjI64ZXiQJXhTRMindbTQVodpzRNHCRXxnmVDDFGK7MvxEAHEePpGJtJMVy24DLirmP8FXzLh4n8goxLs49HP7RA7BjYlTRDxco/QiHhWANfkzUHMUB0E5MJA3E8xAt1LsELmVDEbDcQsxeMFvZPwYWdClBCbh8xCFXfwUYhKMBG7KgcpkYomLehF5xmEocuJq8X6fAJeHfUCirDi/gA2rF4oJPhW7tMk+GjSkoEoV8y5dsg/Qw1KMxlLFqPS8gZsLMvPbFypGCkEP/TbIcqSk+13FFq5lSH1LS9uUv61KmX/70qH0T2IdD8aG/QWNxujQ6O9MowpHvgxoTicWJStTeInMkmpVmCwOs1Yv432NMolENZhOd1k4hUfJ0NIsqUplqgbBBRabQaweaCpjGJrluZTCgqLMFfnl03feoc8utgfl9DDgm9x7RAbgeJamAVNmqtGiicMyv3f/JKVGli0BrDpXwVlc6fQQpUQsb/RJeaDXmh0Wk9JuTpFJxRaFCf4sabCyKRa9bbAjWdHHquCYEq9qoFWZLTMY1dbrr1kbJHadJSUztVqR7HCqvAFW8pKyly4jz2NOZi6LNQyj0GTmgiTY9u1DD337kH/mLMBLU9emSVgO/iRmWPoCzYpEsvRN8F51VqlKyzBSru/rjHMDMD10AhgO2hlAa6pU5hJvGsfyUlok4eVitVjHzipl5Va1RcT8VxLtz8+VizWSslQwlNFUu7Nua+Qc6/zekQoT+9s3Jh+bJDLRaRJ5rlQHaEY3gtbT0+ATdfVicWXo/HkA2CNsklIHGJUqWylJo9Xy9/7rTbqJa1ye7eqrYaQjvf51W9VOXpKsM1ZxrNeQEG5MqZQoHHbPXI4bkZ4QZqtU4rwUR1GOSTdw5sw9Mz+am9end40oc277FVmaSVOyoB9N52cnJ2cV0MzBYUZtmkwqMaamSqRKvTJVLLegT6aqoaV9fa6coF3jlCZrOS3DAg7IRJmMiKXtaRktJat9alMqMKuTlIyS9lhYrafMV6MQqxRiJbMa/mP4nVIdo0xSKZWWJE3x6tIWh81OS+ksTo7y4RiUY5LYpbFVZGb5+knowiQV6kQWucSi1iokUovVIGaeTE22TXWuTNWxS7M3lilsSmVomlolBYtWMdWbCqfaklO1rC515dY0ZdnGbJFKPbVSU7lqPovacvRsxu3artPyYv363jS9/tjiJceOLVkMXagjpixFg0rGDOjzEtvYiJpdP7yBU9Fnei1LFou06j2p9DqTYvubgcLX9ysMNINBfGgejMlGQ1KsKOTEIg67tgQSvUYnY2igKa2QiD0KRWoGapboBqW6/1KZ3Dfb76un6d5XKkoWlBdvmcRKgIjW6kwyhWxYn/SzBsPuQoeRYQyW3mGQ769y2cGgOtR/kvRalmPFr03otc0/2yeXLeunVhai4tcLPEMfCeBeJZx5L+LPu5uWArCidvUWWVlMkvgg50GnDA/P/b1py6RJW6KLJm1patoSHVM6e/Mdvz0L3KD00tY/3DMpj8nuP2fVoBenpU4c39TPJR9yAJ58BF658uq6RdXV9vwc/NAk8ugkrrD36FpvpknJSU22/JIBQ6fNqTw0xrt44vSh9b29aWqGVluLvQN7DQ8MjescxPxypRFU0FpqBvbmQnX3VIQRHbvBNOuKECuC+HY0z3tZsljkO8UJWPmGtrHauM2zziDo3Akg14jrj1+5bKKeWIhsFnwCvvfZhg2fgWLQAIpxKDr3ZqTnhWq1Ta0GK2fVOlLJEj/VMVSwbI6bSn9Aote/tJ6cz8Er55gmlzkSjgOqc60bPoPv9Xjb726BCx0drIb4XW3qUK3PUaZZiOUFCzVlDh9T28MwG/4giNPGr18/XgjtOncuchdNUBEJVG/cnkwi4MqbCF+H12JejaNHU/gIN2XoqVpVZOTD18M8WotpldeIEjxPbORrfROqrrVWTZhQxYeqJvhqWQrzstFWEBYE+hHB9v0IDPtqj+BkDEl8pJbqUaaUzjLF5BE9imBIBjcVFbH1HEUT+6DEUvQoIioORbfW+noUIdrUvYzA9n9RHgYtbf9/Kg+NONL/s/LQneUxoVFL/U9KIv71UjD/1vuxLIljVyK6YSEonui1urirTOLRxBXz/G5i5xL3H+veluqTTiYXyE7BMzqzXJ6ZKZenaMH3VncmzEDRteg2+B26x2myubZsDacT8KsZLOvDPgpsBoxYpdHb0dHmFtkdPq/Np0FHTTEJm/zoDhOCreEwCIVC8MeWFvhjKARC4TBsRWd1SwtQh7hwG2wKR9vawrt2hdtoWxgcIUGhOeN2DXFvDzkE9aIXkZxiXBiiiKTBIxWdfXbOQJww+zQ+h8GJCkI0WlEpiT/dmME6PhP7dYMYjVgY7qAgdm4b5iiAsXqxSEWEfh3CGaLYCErFhLFz1CjqwTdQeuwLWHiKpUDcP247FvqjCMHnAw5FKdKDwjTuRfgBSsDOQRVDdUrrlBF5Yz4sRnWvVfe6aRzxGoLEWjoMXqe9q6rYe7Ad/VA/89ljWaHVuE9C6oprgv6EojNYdIQ1nlCto1S4HUVy6NeBbqAqCH4pcET8EYbAGAvP4h9NzjDmHJgcO2JNQZPtj6hwB7Vb7J24AbrWghqM7wk0iaMDXYhMdtxreZaKNGEAFC6UWUJcFIPbVUUvFDUAG2wSYksyI00lAxpQpIpKtLUREb/KFHYCVwH8zrj0A9Nu7HCxm6XQ8mup8hfl8Cdg60AduwScybS8YGnKjFDxVwPqmhSlOMSgDgFsmSXMEXSvCSXKjBUC91NRAn5WEvqmldRwaiqxuuwEJPR3ho1eI0ecpaAxacDgEDanD+N9F5P1InZ35SKWzAFiuuYTPG5jP6Qa+82mTvz9aSaxdP9+qdiksJoY+datjAyYOmZ+Wddnzm2+LVnZYAD9zpRpc1asmDNtSkGzxbLm+cm5uZOfXzONqRlZVRpqqELsJCwFfxk4sTtEUXGxk6O30dyTReksWAvYNlAM3yur6dWiUgNgX1DMiye/NFnMe1vkKpoWZdY3LW6qzxSxd/n7coy4jydQxaB1dw3j74Y/xHW2E8Y6MFMeKoh7gBLxHxmokho/RTyfeYjrThsLiCE3sVDVsqi2Qfomq6kxszZsoCdvmDULjD0Ef7p/2eVD4w+hbxwEStoy/4W/rYd/eApefvIJkP0EyFv78wvzQWNiLYGbfjbr1T+/iv6yogOzwPvwdfgTyuHysvuB8tAhWLf154eaHoAfvvQY/Pj4tEe/Y0TdcbCYbrwa4i25HrT9Jvxog6PLgM1IcPu6sKnCOkVHK5ZusiGFLjyhqoOQehZNB2jsxO8dORKPbMLJYtHsoK7EE0DwyJH4nXAsLubvVYxpN9Zl9VHl1AhqLpbFYCkdxpHXdMp/O6W+aPndeUFQxuNJ2LhMS9hxIYqF/iKTleV6RohaEe2krmMKSoFnlRWZNOHC2snsRjdlViihgcxgfzFMXjXZAP5Ctg8rqvLzq/LZHePv2r1h913j+y2c2sxq67Rs89SF/TqoW8WyIex9IRpiwijL9p+74Ik4GXopCZX2719KAup8nH1kUs3iKru9anGNbNv7z73E2+38S8+9v012y9hEGWceNQj1WjXNG7VxlYcuF1xqbcBFaxI28cltEGR8djSmTVZscadkDHbUtd0elIQLXzxy5KLQJqTITZ3XnGBPeeegHYv6Rah+i3YM0plMOnzFxq+4MOyA82fNgvNhRwI6Ewd2ohGxE3AJKE29U9c8/dOGDT89vSaVt2fa+e6XibLVPDIf/c9qmAPsepMdm07Tbgeq37+sVluEkjA/SKoXbKv7um7bgup/vyZVwfL2Puv+enJNWtqak39d110ujMve6z8rO4N6uwONg3+n6COYkSNK/c/P+HrG8/5/v+Tnnn46otz+dnb229u796f+/7v+JOLtrv+sM90xm35l9h3/u47k3bnTK3ShhO+gokqxRzuuB0kJBMUBj9htV4p5q9ik63GXa+sq+WTGnF5WWF88OjcnJ3d0cX1hWbqZYSO3ip3c9VRIqwzjMzqEAs0jG0O1eZVWi8VamVcbahzZHLhVHNaViT+UoDtBoVl8FvouZLc35lJd4xYCqNQmvE9EaDwqekDnjwGOCWndiUF3EfEFTg7oQQLSJUwKQKh2kUkw42PQ4sgWKvBUkYMD+N0uM42WxdI5UhJb5FZK0KmyiBMPryyt6tWcnmKbuk0xV9RSHw0PnwPfq9s+RcaJtk4s9gxgw7W+8PiCPlUeOMx6Ap/b8h3wkrsCL3uTszLAMxlZv+Bo2+2ZlWK6yhNe4R3EgXBRur+Qv3vqL95SWJeUX9+yZDjIrJneNmU7mLjO0Ldrr6cJfeNCCgNy4WZxCLYgySAOwghIy6Bm8cWsRBwJ58628OMlEs8ILJkbxKz+hG0KP3N4XJWtalzVAVfIV4tVcUP0U+l+vo6rEuJtz2xZlKYzTdk+8x5xnfL2odH63nMzYNi7b9bgou1TTLo0LlzlibbQamweGv3xBnXWW+vLSYeUNzcd7LWlgJ+I3eiP8QT0Ds/r/cvZ7VM0om0zoTIzB84Z0hzIp6nqkbP2pYOnp2xny+P7QIIOsAvNogOpydiPMYfXV4KYJWAXVMY7kaa5mLoSz4kYzH8K8EV4Q4Z0GZ4jGL04KggYZxyWmjPEMEcCeHuSIXcFG38+5ruiHHiJaSQW9HBs4cmjFaZgDQc7Zu3bN2tB7sCx+2Z58ujFaADvmzMSPj7u7oNHrRlVHrMeNBRWgBAOwU8t2hy1uqJIrwVN1oxvo0uTjL7aPCetjJIVKW266pk/p6EGDMvxoyXoe1sycLuXFvf1uOA74e2FPs66pK9Luu/CPo1lff2sfZq/7psVndq41TDCRL/Vf6AyYPdUSQ9I64tuUCiwQSE2G5zGopDkiDLAaK6Ja32ZVcozodpZtbPerMiZHqF0I2R9c+n7fLWr7YXwkifYz3P+fL9c8VBf9gDN9s6+R9aDGQQfD/Uk0OnErxw4O5kV/BHcQhhoilHXIiwXxpjF4IYGeww1yWsnWhWxVQEe1rjfmjiMzhwTfq0pn5dB917aUg/D9S3wi+in9S2PLgMPZkcbpu4WV7bUi1rHR3/rDkUqzS5GrZF605hQpBWFxQPy6PDYzBIuJC1Kg32rJqCxXKhWgPKkVKxUbnaJqJLCyN/uPwMPYY8vJ+9uqbctezS8ecqQGbb6luutYMqhNYyi2GW2OTz6NJfNZc5V5paVZKpUranOCVU2s4s/rPCkvEEEWAImHubtiqjFmGahNT8aTeTgj0G8pYAY1Bs2qGVikCTYZMnBYO10BxMHk9IlBFGD6XAzFQWAYKjHc75iMwjEwU4Yhw4HwbuDbtNNU3CL+VXjNetHDVunHzZDv27Y6I3Kccv5ldKAsSC9MHnmvtIiyFWPKHSVSx5cs1NS7ioIMRvMUyRBV34Vs5hnxVPFxXb6uex00FFSW4yG6tnQAIYN5bvLJYvN+5iKG9TEWrCz1JtnBJ+kWMdvkY6YM2MofBCcGDpj0SjpneOTHJDic9RWmWzPzGCLC27wisIFruhIeoyroCpfpYh+Au51eqs8SjlMtyy2wvm2LDNYmdOnuMb89Z9YIAeZCq0sv7rABa10i1JZUB3b88Xt6iUIJFMIEtetKV254GTc4UuYB4QAGrVuQu68ZCbomghuJny6mJcp/MOyu3uyqooHCsTvnNHBjUsqqS8RpoiBfjRZDPTP3muUThmYX7ygf0rqhHWWcermqmiRQAj3zuzfa9+fbcCG/zg0H0AKht/x1xUTIphiAC1Nky9n9S7JLMfzQGhMYEitr4kuCwwJH5x9he5rGMVvnnB58Vy4IzRUIIMz73HQjln72mN2aMIvYV/cSbzYTqLWEU8riVX0aZiYClMaELBWMaCvkU8XqQgUIelEpnQlE0OwFKYO1K9QFzRg/fhAfPoQuiaItThDUF/cwrraTxZWKoCXXpy4d/520wjD1sbo1Fn7/qrZN6t+vUWDCFWKoe+Sl+wB5cD+gaJ6RJuqnjQ6DWaxYoO0yoOij0hCHZXia9NzKt5EVKk2dEZZlemrZS25fWUjdNs1A7J9Q8W5/c6f9/QLeuClQvvqWh9zm6ni6MkJ4+DjI+fsQ7wSvTjPM2vf2IG5CzAhhh1cTSDDevRgRSFo0Js9VZvV6hytBX6KwxlW0KTVF1WAGcak6NK+8z1XaROmu9EwrXTm1bb/xZ8DhtU0jIXvuDx9i0vxrJexBb7nq+3EgeGfYSkqmfCPhltr7hQZOZ2RJ7FuGcb1Skcn4tjH7fLpBOBQHdmU1gmYMKN1CvihVrFZoYN/VOi0SiZZoWOVg4BEqtgk1wLPq2LDcr3klTyglW9WSCWD0fkuveSKVMoo2E8k+u0KLdO2RKGNXCAP52oVS5RanTRSoZBJNXK6Do7S6cBj0aflGqlUyZyWa3TRa0kpvENCi3WauA6DsKaWUNlUmWCH4BbcOPhNsbq4mS5vswIgmTAPGukemyRUwgYJ3jBhtb3tw1c+UDWg+KxYItbdqxe/flCrFPSgXeHgiMkjakR58AL88Y0lS94AapAL1CT00S12IZjKRrsWfjPwMtyqUao1YC58AOeDYXCS0u6bPm53hpTxL3kD/tgjP1jbIyMUSqx3HqI1xNMVKAr487GRH5qguE54ozTsiqkCcYceVuAV7P9espuapsf+ET1+f7NSlifSqmUsq9KnWJ26uslNA5191WqZSi32KVSMOtfXkLfnd68zcpRUmifW/Iuku9943X1zY0YfvHnzCOQ3a7UNCpZWMKxcpZTzUwfVTbEolTJAywfrdaw6LVl/eseuUziVkvlXqdjCWzQ7MNziG+JxFLrRxrdyNqJTQklYE++WgICEcQdMEsCj/3QbJnTRJvrII00DoA20nYaf0UfoI9EmdA3aoO00sDfBMN2GhZz4BkmGo9Nwolgy/NjnTSBMdZMb4Xe6EelEbzLxEmAKuCVcwB2QADffs+vSZ4EKXm1sbYJXgSlz1BpYxuSCN2EZ/G9gQrHABK9mjmLqblHJ57AxSuMplAQ/GEaPVIE30aP/jbI7hbJDDzaC67folFhWfUVCcRmonDrKEvOy2ZcahnpouLtXgPiuKhdTL/MTJ8LEVwpJhal+RizkFdTslYAAsAEMzVVkpQ3FQTquyauzK4l6OpYGYo0OtDQn8MW0j6jN2Inzc3prwOUOBNyuALsuMDgQGBxxLziyAP2xaxfUD1m44Eik79FFi48++PVRdt3RxYuOoovIZ/C/T91+YdWqC7efYh6D8AN4Gi65sH/sqL3n6KHwJ7gOu1QAq1mwJjcomXcAXju48dv6/AbZCFv91Y0H4bUD8yTBXDB3L7jvizZwJ50ivD5A47f7J+B3LlgASBlayYuPAvT7+ijMBKuBatXF9ourWNn8eWMPXFiy6P17J0R5HI0+A3oty3rXeO956T54bX/LlJKVxtucUxbsB+L7XroHxU9d0IL6zPQbFHuA0EUd1hcmYI3oYNB3KecAK8AeyXlTTPkdrT5jyuUBrHXkYQQ9JCuLaClWLLICpjfcAn8BUrAcSOG+F9avf2E9yFWwisw896IzNUBmtcrTRqb1OQN/ThuJgmlANuDdhe68TJREmlEQsnP6qgEtpWMfcrrsoYIMegmQvvwKyumXV14GB9ePH7d+/bjx0YdT8jKy7Mk1hgEkF4XVWn0G/t2KAiNxfoaaZHtWRl6K3qrUmlmlw2z0JiebtUprAn4YT/mpINFWje/ae4CIV9LprnwSwppHJqwkhJ1koRkVXaKjvzifxvwvrXbZRGqj7Sbx8f3jN4wfvwF4pRm90qSuVeuWpqSk9cqQGjP7DLvbe1eh0SgxlhtPLRyEjhKj8VTx9uF9Mvu/Bv/+2mtATq9IhDplIM5pfPQXfRKXLE7KzNBqk7kkfV6vXJ+y+K6CWAaL6oQsXytW+nJ7AS2Qv4ZzA992xzcVZBAvoHprBb91eJFDNKEROYg5L+/kyCWgkxUVpVaO2fIVPP3kU/D011vGhejT+Q6wx9m3EK39X4WvOjyFfTPAXjsXHlsZvf4UbP168+avQegpmg+N67hkxwCLhX3t8B3gt/ct9KbDVfaYjvq9iAbMwH2OA9jUxuVzURgQutjlsxuUtMlImbCSOo16m48zCApcRL3OX+wrQqsOFMUzRq0JeGiUAH8miuc+hJeT4c+VwNcAj400jF2cC+j+7qHFajO4PS/tI6Puw1TXURr07mOwz7HNq0iqnghCF3frggvtFxVf8eBFZf9eZvAeAFuD0Z/sM+jnC6M3NgIATjP6d4oWjeRc4iLaUuboFdkxtRwczHaDL3196SKQT3s8/f5a/eHeQCHNZ4gAKKSDRbCfPQo1zHVXoRIgqpLLbu8I1SbgaUupJGoh4mp3JVA8vPJUsjwIsk49j7GxUfujWpJVQRrZbsWAOAQyG9Ersl5SYT4/gDEJ0UU+8eyHOd18si4QEfdtVuwPGA3lCjQwBQ2PxBm722zAPGtPNrvSi1C2EyRLNm2dyMCj/PIN2ybQdzYzlmRW0WvgJ+vViCEQAfWAgW89DpJ0CjRI6AWH0/pKZVy1ci5tT2EVyXr9oLYNKlqB0qn6V7z3pFsuc87fn1YilbGlyhFrPoSX4Evw0odr1nwIMkE/kPnhZ7eYYOj1Zhcujn0Y3Vc8d9W6saLoK/y8levH9n77OK1VKaTpLYdsfVCW1aqZtNPKKlIzmdrPN6gYOX7tgD7nHgdGtVykk8tbDlhROq5KMbdEogjVfrpOTuMqKAZ8Q16+JrFA9Np/xkeB2NxqpNIxOg7AO2tOF/pc/gwJMLIBxoVmErXTqKURxXACP+3OwPgkiLAwt//4h2+XR81H4N+98LswmIcWjUMHAOOBry/Ah94S/a6MmXru7q/h38HeRtk0WNJ+8mT7SRFFr9j0g1vy8C7wyP2PwznRmXfvSYXl9utgzRUgC+yDp+An0WEblfT89aBiqegkfgiPKxr3L+5tsptgo9wuGi2smSAWUQTwGGKIzifNm9wiKzYEwlgbShbNg24rwGZBHhwwobKzlM5IKwHLbIZfwb5zyrT97p0hky1UZH+/2L+eT671jhCrZMmcaUyJaqvW4K3P8k6ocZaXStDyyZhl7v3o7QNPHtk7OyVH3Cdv1NQU1c47ACIpLD3igUvw6g0K5F1bD4aDviBnPPxGyWiGLqTzft9bjBg/wA118KYC6at9cgaVpPASr5tmyzJoXqsQMxOHyspz0mqm+8a++4TLNaz/cTBm/iA4G76x5gZ15cSUuCwnhuMfEPw1skTFFWt/ovkpQAw/XJjgYdjZXui7AT1NoBT8Wl8x7Sa+FbXcxWOvH4TfTa8dzbKja6cD/cHXj90Gzz6aqnwS/u7LTbhvPMc8AgrBgwe2NC+9Y+mBt948sGzzstmb7+Es83atGd++PXt7+/g1u+bNWQ7Ee34A1Sefwz0JLItca4WPra4YXgImf/knMLl0WOXt8ERsfaJG3+1HKofyURVUP+Lvxi6sWhHbgkuNCol1LQJap4jRUmh1goHMMAyOkSEkG383QGR+WMEV2MmiFhHFjrUf75nyeBF4uOQreO6Rlx/98qHv8zTj3gL6F/5WAV4EyVYVdePpUPOIgtpp/WYNn7Prtnf7eq+/OWnkontWPO+ZDK7Rl7hLd+/4Iz2qpGDXG+OH3//3jcMWA37Rkd6PguZfhsDv0YQzESwxByZXLT7+HHhq2OR++Y/O39yxauT4YQM+3XSWHnjXa6/F5WxhXvAzgnEBbrmrabhpv9CXuDFN6RTXyY6lSNjNjNoA2YiIkI0I0BS14Q1LUahqArAxJGEE72cyZyOC/kt8vyEc03kRymVE8+KfUblMeOdY58V7aYISNPofe3tWp7mjn+GwTp+bbLUJrq/RqHK67nyjX0mGR8kkaXUs7bWWToQ/FlRXs9+CYnQqePqCGubQ+uxBgZV1tuzydIdBqtWP6J03qNTr0IAL1Vw4NKJk6cbZhyaO1kl+GPtYc3UBl4QfbP+2oPoDMGVa3sB+hXJzVUr1a0ePnhnsygop5DJTfqFt6pPC+lZ5g+JuI/KSftRj1BtoVuUFiBBBFRorkGMl7phZFFnE4SBaIRj5m61XAjHTFZOR0xOI4nSSic9B8jF5NTGLK0GVHUWmgTjsseCLSRNDbxMu0RoSt1bsM+qx5VsMJwaXgTHqO4uKUxPNdjIQUY0W7Dpw9Ni9e+YvCGbL2WIvB7SWoumTwxt23L0xPEkkVckNGdBQVWGwaFRSSbCKk6rUtFZcVaW2ahUivrJSa00Bb3nyhtZ/+NOH9Q05KiApLpI6ewNmysw9u8+/v6vMb1Gp0WrPJWveMaB/8+z+oXkbmp7eVLN921tntvmSaLHUbjSkGTTMXKs1chFkrvLMXXHbh/VD8zxpEpnMrJDws6aF92xcm6JFpE+x7tEH771DJloQDIUqWlp2zRhpEYstgBnTd9X0yf6SkgAqMcvonHQDKbG0vIpT0yolL62sUqdquapKjTVl4NJ5M4fWjxtX39Bs51M0asuUajCM3tI049yu3efVsiKvmGFEd8+Y1q9//YBGOKVPzaanJr65fds2Xzotk0jFnElFP6IyzYOp2cN1nnH1Q2e2gPNivVph5sdmlxRK85MVarY0VIb7TOoNSvS5CGOPBanFWMLm9Bv1aDpwpHuwW2DilNnEOv1OjDaDODTU2RG3r6QdSiabFgBu/EaM2ZeGGRIsLVAyZJueCwhfHg0UJzFAtDIGoCfGCP5yoGREKpVRpQiu3f/Z0mU/PHNsarqYFUkVXOscsBEceA3cK9Po070arcSQr+EMdnOuLgeIlGIJJ8L6v6JZRZ5VcEOK06VU/ClzsE4nU7qWbdmxvjlY0nj78m1Tigzpo0SG3sW9tfCj3DGrT06f+sCkyuRoU7+qmuFWZa/muZW9RaJUnTowtE9hcOyS8VkSlYQD7JLCp0ZmfqCeXTgsSynV5e038hLsQlRwFkvT6gIRLwePplUVZctkbc5Ber3M2GtUpqhg2N1jh28bX5NlkdBrKm0+2uhsCKT0XjqnobCoZvyQ9Ojhkfm5xuTJeSUP0Pr8iZ02P2EyR3mJhtbsBJvQOKpyl21uZ8gZw7T0xTAuuR7Xgn7pr1irx4y1iIvumGNwRAgxsRRONxIdMCWE2XB7mKESkAwSghxVV9ylv9KEyW9T7CjYogsahQnhdi02PaRDPXMiwW7toyJeDrxEg82QOCcUGbG+3b/GAv0XDYraikWTQlRQG0FFiKBVIZZEd1WdSfRPFb5lq6EYcCSeRhv9gKVab6qzEB5864aq694n3IhzIX3C2QVx5iJUudP3UMwO3WTU/5+1wyhsZf7KK4KN+auvClbn8etXXpFEbP9Z09xz6+w6r2Hb/6699GgdlUmVYKxYiQCaFGulmLX+/1UDcSZISc1S2CYU/QoQ6tLR9J81C90bUhIJsAkNgnIj2UbL/oPGAJ08b2qMjgAyNcdPCdIJ0Gp20UkaU/zoMl8nevIiymWObASPK11mKJw6hHh0FOSKrLD2IV5HqKJAp5w8Dn7gJDslnSIjP3htQ5CYfQ4Hj4BceAE2wgs0hSuz65zWon0UtKqiC/Ar6LvZQuE2yAWP1KF753bhZMseFWSaTvSdPyZzlJPo4BARVJe4petjYaSmeLG6qGkMuAGzkQbR+1LpdktmO7E3pUOCVSqVaYm8AgQTVYbgpLW3Zlq2k5Q0alv2j+irb7dgQEiCBOYyhywdV4iOv5lpFQDCUHKcprVVkLeLKa6D6BXjsUwJe8k8ELmdXFxj2h9A3Bfn9HMaTuNE/wE6819ajNpoOCkpem/0XqlSp0GXNLqkm+lmW0cSHepoom1sW7SN+1lvbw/rbfwNSib75RdOprdz+BKQS8WBDunX7C+KDull9pf2KPvL5Q5pomxYg0rli883eKOWtCQqj/0WMfGNcDyscLFpSqHTQBsvRifQxrPfdrvseEQsoimtTiEWQXQSIWa9PaQXo86jQ3O7XgxwoGcMc4OS6toRk84AFOAQzx7fr7HxeJhj+xoThRVie3hUiZ8F7U63iBMRU8xAkA9gJQms6kkLjlPAu91PP8Kpf5837XHYXpwu1zNsEudU2lVmpYrb9fCP4D7wLbiPrk2A9RT+gAc+CC8/pn28RMoApUxl5OxKp7mgoI97TPTuJ4D7scc67XkTyu0hiK49bIPiZ7x3gsZLGsZzQ/w45ssz/GoX0HdWCMupfS6/C7uU4ALEJxV2CmMFt6zZVdgMD71/97pRKUmee1fmlPYtfw9Mef99MBRXuF/tm7C9sJJTJbEMB6S0nOYLDFlJVtmhZ7tEHfSzN9c7vPW7O1reHVjUNHZoxRyXSLz1O6D9Dm59AjWG+Mk+SjGiM6yaVSG2UOwzlXgGZI4Gon3rvj8xbdqJ78l3lLAU9w/UA0WUlFJgKq1BfyAZkDM244XoP01+aMCNBu7oSXiJWRY9CTLZwzhMD4GXcSyRGzbcaBU9zoWIHboIUI50xsXQ2HtrMGb1qhXWNwE/itRyRtHjUvga/K+v7pqc2zhghHbuoKRHPPeNmLjYlGsMVHpnTBMrVpSGloNhHUz7d3ASHAr4I6AKiOomG+7JvFMsWbsVfj7y+m9+M2KrGdwhE3euY0UCLoOUIGvbAaOzow4sotoptvyTT6KbPvkElKOJgQLH6GUgC/4xegc8H+/X8We1VCU1IvY8TzC3A+6AGzva5tBKN4DVlGOgINgGC62hDHYfWnVijR1vwJGOOeniIA18REnPp7GjlVwsHS4Hs01em5Y8e3ZyWq18os/mg/tsyeAJR9WAwo0bmur0UkUNaN0r4mgATrm+EbEsI0+hl/p5jobfm4aZ5Mp+uPhsq33YwuTS0uSFw+xNTUdt+YZArVO56PYBYTFcp5QDvnGkEgCWlXJgfVgkYupTUlJlkd+OREshRi6ixdOMvB7epZTQkpFC3acSGoT3e4ZiL6NYz5BsyNhimzAxiHanLghMHFEtwWPF52RYouAA8OxC5hngRwuM9NjCFK0Z9YLnQVccBlrPU72K5BfhDlgPd16UeYOLh43o/RHIWswkKcEC7YCcYGPjqlHw6WaQ+3HZiGGL2x8YtaqxMVjeyCD2XmqVZR05ciRLZpXKZDn3TGiccI9x1ajG8mAj/XTZxGRP0UF4bf9+ID6Yn588qaxhScW9UlqiUDNDnXkol1HBgTBTck/5EvgNeUkjbJJZZVJpdmZmtlQqTZPlFEkkRdfwy0atIn267w1a9DJqlwIsfQgyeBsKazrYrQzq1BqRHLF+GJQooAS83e9h89EKqi9Qj9j5GgB7vgHz5jd3HAQzH/nDH9+uGQe/hw9sf/VnmvnyDwW91fRKsS04pKHaaNx8/c0D9Ferv3l378g/vPnyjVfmH22wmft44ebAQNpfA5p+9xMYPrn3+gmDVg8qMasA4IasuyfeX4luvYBGn0JRqKfFWArcIbERSSez5JVQE6quIQYHG3FgMxUR4lH+geJsdFMUq5iDdGLCgrigtraqCZ26nS8Tu5UCPL87yZYc7giCP8kA8SYlCKwReUQsHmVPcDhqYhzYPqXICpRAVPDRwJ+37762Y8TOt+atv1r3x3nw/nd+Az+6sHr1BeD6zUWwAIboZxfDWvjDc3EJ73OABcduv9/dtMWWJ5fm/TJ/+Z07ru2a99bOEbfNuf3R1tUX4EeIeqAsPqT7wSNR+FEXrYQ/X4WLjwBiToLayYbq0RbD043hEQTswK0BaYjO0XbA7Y4eGMeMan/2BfZ+/e7od2AclEceBVOZXmDdPZFPFzNjoslNEyMPgSH0msindK9424S5H8l+7u2ooxCP5J0uazrDHLZEIZos6IyuEb8aP/s6z0Ha6NV0+iQ2CHA56Jgq7D4gYmko8lvpbs+gs0EjnOmwukmN/mgqfo6GW460RHF054+T82pgs+fabXkuwyC1pjev7peirdFlFgE1L+cS09LqNnXXX1QNQlhhDbbSP6rVLXQLOpCfiMcGv5tVDpPNZnKoNFKVSv2BSqGSbwSA4UUtsYTRHS1qwccj6auzBAQsgd0qB3ajycoRvj4O8iasJFE/47CXLjtR+BG8PGGpVSAo6gVixAfPwI50JYvVobH7RzEqH2wViyW8OvKQ06PWpJnSbJomxKkTnh+ipWSTrSzXY3FrdSZLbl4SvNd4ZyNW2mm809iclJdrMem0bosnt8w22zA5iCsdnGyYrbGhfDRqj5MdY1PTH4td4laOlWrDZbOdGUFbhropnrlW2aRP8bvq3Fm+0pr04XP2Xdg3Z3h6Takvy13n8qfoS/ujr9K/VJ1hC2Y4Z5eFtXpZd90AHo1iO+FJiPILpcY2QF4S6qHUsnpISTRaAujn18Mhz0TX0Ztvpa0SbBkMFPAfgH0hEgYKMPMWmyeYhlxG38WNuOEyahA1ifggdovi+E14H0uQVRtNmNy7hS1+ogHX5b1D8BFnBSbBDTx+TO12ERFVhrozCoudCBcgmlvt49V8VpJcnmaRmlZ8sHLTF/459cbckKl2Jv4crHHI/P1v39Xx50d/PLM3CIK//QsYa1q8v32SKStJZ5Zr+/fXyosrtJMAtcmUZdKZFdo5c7QKszmoBc/1mmjIy0+yMNJSa/8BK99fses2y2BTKNdYu/fC3vmD7zrz10f3f2l84Uv422+SX77tyR12habC3AzoZnMwQ2G+qxomvZWu0AbND77+2wfMFRqtPAXxFBk3KO4K2Yefh9hIMuvhsSrgMmIPCBw2f8GCNKyemwaIT1LWjbfffXERG8H4cmQDD0ssvohXUytjsoq5K6ufWbPmmdVXFx2077o694WVk/0OucSSN2xWQ26K2GSZ485ctE+b558wvsaiWnzXjKyssZveWrH8zNoxLmuOP1dDi3Tm4gyPRa9qdDqrp2RLXdWrR9XdPr6mIF0npRWj16wZPWbNmlOqJ5cODA3O7jNyeINXqcuv9GY48nu5len5KVYaTG8w5+W6ivLSFXxgzMI7JgzesX5SaXHDrJleT01OqlSqdflH+dU6AIKDnUkuf0Gv1ORSfyjQz1/jTbTDE+zXb9o9cPa4TnTETbdqlTfI2hOgI+h+Fe7pc7uJJiO5SygUC4MbPTxrd/Fygr5NgFjTd1rDU7YgUHvQAh6ojc5EX2mJsobYNZ3f3aYdHAaZ7bt2tcNL6Ah+wGVo7SoUOXA9C97xxK72zqcGdyt6Qrgb/4o9Gt7Ukt1cmIcScwCtv9ZWN7UP06N9/mnrBBJtNf9Va8zrqs//oAl66kc5qXLEa+iIQTOBVweIgSda3IISfOe5yIiFQ4InPNJGQthvM4o+cTA6Xer1cKpOxzhE40deHz6SyUgGFFk04QOVnAHXu4pdiEajI4bjCsO3LEaDwWgBpUz/yHWGT7Inety0/+YGJfiewBQqHr7/889jdnb4ZCAIRb2oGmxnB/AUlQPiOr8xDxho7nIzHsQRETVrZ7zkRmGUdIZ1fqzjwojwpOcHjIPobcY+A9GfxXqxOXGUf0yfSSlVi8QDPB2UZ4B4kQpfg2lmB22js4rx0ZkMjmDHF8UuEI6dm2y0ozgL3XOYuWRnx+rxG6bpto15WNBXf3jMNt20DeNlffMexrBfKCKvL4NbMDrL07u3h96HgpE2OssMjpgdbJYZNiWnh1AYwyw0kebpChtQOIt14IssOp39CE4FLzbOx7fnN8L+4L7cEhwuQf3fjvrlZ2QNNgR7yHIwePPLztiLTEYiXGKINijqFY7OEO4lRI6UECJg20ae8XaGcA7MZyEYYmAJnwRfDIGASiplSzgzfHEon9SmlkqYwRCFPleR0Nv4hFKC/iEcJilB/6F8cpsqljIWwvlIsDjqBgWutSXdoORKZVsSfAFNb2pQEj+jQ1sSEO6BATgOnomf5XJh/TkbzTN7Y/aaGmJxb+I1Jp6RMBoG6woCNP6JtSUapARlk6nZs3fvnvXgPDwHimDBjfEgBFvHUzfo34fmHz/9y+nj80PxAPjTnr3Mtr17IpPAeVCE/p+PHqJujIen4Cn0AGhBY/Wtt1cVFq56G5Si8VoqhIWxmXmDYi51lotyBtyagFuHJQVYcRKd6OGPo382MDX6FfzjHLAYbpsDsuiUBSdOgHknTkT/G94X/ZJ+C16aA5aAJXPgJfqt6JeCXU1M1wvLY7KoQorqlBx1SpBEBM1Ph6VfRH6IpV+YOLOxOxxV11xX1xytIye27nMBqW+toqNNZ0M9UMHayDnaFLvzHk5Xx5DkdTAtDuzXqte2o05u1ms5dHo5Fk3kRsyN/qIo9yKRkqhRSVOxPxjs9kWXBUAhJk/+IoDdPkhAIQ6bmpmkyH1aJT8NnKP3wOeiP74Ji94UF3EF03ilNnIfk0QuxUwwIqGXKnIMoDgiEY2N3kdPNUU3wvcMOYroncw/0JUpQd7Whr4E3nUpxH5RfQ5AbMjdGPCKIExyerxcF9Qn0wXlScHtB54s0Fx65AjTt3nr5utNoPHanrUwk2AbhKeMhtEXVpwr09Xpys6teAFGR0/5ERwCX4NDP9KtbdEL4zJoMLG2qX4SALe3tb58bPqaQ5/ObASgceanh9ZMP/by+8JkEMduiMtPhHWWjspE/IBg821w+HTEE5m960dE/cDNE+OT2BSHVmYc+uuht0czkUiE+Qk+BkZgtdxoE+OWi21w0wcfwE02sVwuZi+J0ZLtRTiL3voJOnwxMtiRGRw5MsheCo6kF4TD1I01ayBGP6CEcORB/MQN6rHH0JgUd2SiPNgJ+/bt03c9NrKbzkoanpVAbMNelAawto7JyuJ9UxxDAw9Hu21yFI/B2QzAAZS0h2bCzSVbz6dnjJa63cFpjb5cCZtbv3jR7tr9ABT5LIPegw11C4b1KvPUutEwOg18V+9ssHJKhQL0aYbfGLc2n9j7En3+dw3vLNZpMtXWtJxpGyYM14iH33l83RJblYhJzzCUoZG/uve6Q/deeRMUbRnQcvKRr47/adnw4Sb4Ikilk5S0bSSVoNuWT3awiId5ygN41uZ0KclespJG9JUoICAKGvBidXJvUSCIoe9pN+bxYyOS7bEW6YlS1HOtwk2V55lhB/wWdpjz5Cnm1+fSKWaLRGpMlihz1WK/JlvjF6tzlZJko1RiMafQc183w+eJgJPeOv9V9OQXsOPV+fNfBRywAu5VWAvPwC/PrVhxDlhACbCQ0JlbrX9GFKeIgkFRSnGeyCM//Ono/obkAimbpd+6fPlWfRYrLUg29B/96WG5R3SUiFMX9HgTDs1ZcQ5+2eOFsOBWamio11cj+v1yrI0HoBgjMYchqx8dgbV3xzQ4UXuibi/yAKKTixEa0eTmpAWlaT0oCpBVBbYtxHqCRm5VNZfLlmeJmNxSxnF3YM8dY8/u3DT9juUPAvHeZ+2NZZztr+ZqK/g2Q67JOQsWZe1pbt4zM/LRrDFbd726p2PX4q29z9K/9MuPXs4uAUyfXPC4eMGaS/fdMW3TznPj7lyYAnJH/cbKVTWmXjTxWviVIb9P0bd68Ggzzqb9tfKti3e173llz9bGuTvPUj19/A4mvuB6+PjFKAG8khY2u0l0kPl/1X0JfBvF2ffO7KX7Wmll3bJOy4dkS7Lk24rtOIkdJ45zx4nj3PcJOUmIIeTghgRSIORqgHC2JdBwFRqgJZQWSLkbWpoE3raUEiiUtpBo883Myo7thNK+7/f+ft+XWDs7s7Ozs7PPzDzPzPM8/zTxa0Fgi4g2S1RWMoFeHTS4obcOIpazP39LL89BFO/HbnnctUUhr8tKYhZHwuMqL56YrAi7EkqDWrFYxfDrP7zq/TPSuU8fmjv3oU8BQ0Jw62CmuL23RBM4HW+vcltMZqee7OM1+asDfoPWFvAUVjvM9Rqug7erjj4GGlFx/YuVnhjESqP2CJ+n2clEPqxDXEs3tpHtXc1BLRDCCGGob3mAQBNdDSINO7B2D+lzSEikBdknpwfw2AejBxMEJo+wH/vyIYB6WKUDiFg1qBz8oGfq1J5OcENNo066ldcxNK9eDw402vTaeLnLRsMX2fF+RmUy87zgMaqZ6JvWKa1ecD/PI2ZKWlLUmZcX4NQxf10B9rW2gd7poZVqM7dS+iWtoGk184vOIZnOzsyQrD/uF63giIaHtEJ7vbRXSh8ttHN2m7bGYYSTwf57PsgLCFoAaY05Tw8RP7rRV5D9B6uhgfa+FScr0tO8zQ5R4xUMSjBdeqRMwUJWHVE9DD4GDIRKBfF9RlMfKinGiUZaNeKey6hWag61Cc9wNJvM2QABoQ9dgsgEIRluDXMA/eYIRHM078fuM5NROpxw055/I8UK/vkQoCfN6U4lOxdnXwCC7j2dIP0urTJJX1kELSxWmsBInZmuPntM+kJnNuuA5mVwB9A7a4sSoUq7AQCgs1eEiiJ1LiN8CqXXXUi39aYfyeWvGJgOoBso75u4UNqwEryS1eDS68boA0b4lc78knTlb1Ef+pvOLM1WBxbNWFNUsmZBp8OhcHVO3VwdWztvst3+H6bL+59sD/sF1UJNRRLK1WhawMD32Kk+AWcMozYJJdPYkQdZgSRo6TBn3c4TZ3lYJLRe0FSrAwIas+SlHUTvVhERqujDheAFIJJi4OUEJFKGckloluDhAjviLBRKpT5g7crzaTkVqwDBIFCwKk7ry+uyBvRKpQLAgH2i14zkisrR9S4PR5eFQmUVjvrLaTrjs5m9E/fZQ0IwiDH/WlstT6ZMgrB8OY7t2nUQR6bMmDEFR5dcfvmSO9Vda5VMiUOhU6tZi+BieqQeDAnJqtU6haOEUa7tUou1GoXJGBufbtTwi05IX5xYtD7cGQDApNDU0odC5UIQvSmGLGx9q1X4McaZWwlqVuKEXdKkXS/jhM4/A+rPnThpCZryfiX9ifhJN+ODoqeP1/UQbKM0VY/mYoynNR3Nx8uoNYjyt1E3U9+j9hE7e7KjEsiFMBcOTv/WfIN2NL8t/l3ht90PoOy5+PskkP/g9/unZb9/cY6vvcTLMlxOAmn5JWKsHGQHxC6ZMxcD3V0XngDlQOq6OG1A5Jxuv3w3/gO3XBw5Kwf0gNilMsp/Od9l3DmO6vMIP5IaRy2grqBuQKxArtVSvUiZgAe9FlTybElb+oylUgRWDXc9Yu1D1huJvNfb9kE5TVbqkJcjvWJQxp3DDKqMvyayYq/uZi5Blvv/QI5jATUFSayPkAj82JoM+D2ukP7UPiyJL9xlTQR8BeGAjJmA8vRiN2RJftCMgs3Tpl6DgtdA4DVwHeHnhHy+6W6LwmBMWp4AQaXFptYUG6a+KvIGQ9LyyX1k0eEueemh5Dw1BVDb5AhVPWtSLOIP1TVE9p3CqzILK2eMLw1HkzPSMooKrlMOGOJ9cgvR9sAuHnG447XXbsasnSgcXoUehCpw7RbC6p3ZjaLo6Tk9XPo8pcjm9CzmUT8i/HzO8p1wuynsgStGrGty4Ip49tER028+LqvE4haNE818NN+FwkEZ6g+jZAopUzrlxqZJfCqHiYfOiMf8IHHMR3OyNjteBU/3fityLvOIdUTNIO3ru5DIJVdD0criQZlRVNuMdcHy1oDKVxqsM9rgZb1n1bkr0gTjSH/d8EQpraWn7ikwOgImi8UUcBgL9kzlDE7pg890+gLjfrVO/PVtxtvXeUbHeU9z7IpbCuoZtrRgXGu0/LJ5ATv9aF8Ou7/EZZPzMIpAun8u0794FNA5gR8/C2ZguS/cWl6Rr/CEfeVX50JIUoHJbzd6jGD22ECrUak0tgbGzobQsZb3g4y1TLsGqHcD42wbXzfKXj10nBE9G9VTVaKKm1o3SEdxDumr3dJns0W/R84BSgN9OQLfUvYAm2OBakI87FS83020o0LePj0pxJwSbAoSIz0RiXa5fsoR9X+5n9J4jwRx8b12dxhvhw6Fsaob48UdRPrtayi45slr5uMuhAmeQJsEwgW+QMK6ayGm4X2n9CGXxx9IWjt3Z184nX1W49Pcr9FwGXT42D6s4arO17U+eDRH7jty5A8+xHA8OCL3k/SMZDRcOn5G5UKyrLkv0lAX8kdik2ZVo96TvQEXi0r1aTgOHbUf24bduaDzdU3/NXwzNYmgLmEID9nPeG6PB2/x51iBMGblMUsAie2+rIXu9+G9DjQ/4h6Vc3pSR3yJ5xTGExd7R6NnahFDiLhCs7oq2dzktDqN4A+jtBZt5zZIl32RV9x1e8uBnTbAiLrWkkKLyy3yeUM9/krbvIkdOyZbOIGl1auXlI4GNKt8coBxXtbRGH85rqYBnJWZ9HBIly9V6q5gFW1QPD3kY85460+m79jLQd/Y5MxYXsxrQ52TF11NHb5JixfuaBcnixquxgSUUD/QTA9xqUHEQ51gz1M2xKdSxF8dkmggBmZBDYStdEwy+mpYvkJakfb7+mDSzZiAcNPQaURshbJKF0HRTHiNZsjLroHcAP6J0bqs4fCCxcbA0Bjj1JhV0JAxCPALvYIT2zOeQ0/qOZVLYe3afLh7277wxFToHpAfjXrzvSXt5UUiy6tUKvDhN0OveHZpMgVWj2TpOQcniB5hPfN6nsujt1ZJ/7i2eOyoGACsRtUGyts6s4d4LaANymkKIXC9p/PRO7oObS/vWdDoBNZwfHgov6B+2uruQiWkwVenF59+4UZBKd0xU/p+gK6s0/I/RTQE0Py3iT1L1VIdiI+hMGoqXkbAUjAqOUdI2GcL9lBSAuSxDbBBcoId51jjsoEcFpB4awzSvYrsHuyvjhOBgBeB9QBbv5NxmqflLUUlkEMhFxdQC+JMqTQisnqv44Pash0F6uFczJv9q7RfGa5MhQAjZSKVENaEwdPZf0TiHFcZVIFT0oFQKcel/JwOHP0NYIBVb37ar7M5LE+fYANnAA3y1F5Pi+MmyAGvib5Xz+hLNemFMLKjPPOBrzAR/MSm8+W35QGV9I3FEvS3mv+6XW/xBUcZn5+jcOcBDayIhCvo6abbCiofjNZIs7xFTIW3oiCYYr01kXASZNhMxF9S06WqDwZKYHcQRLUbrWPyQ69sDMIQ4AALPKNsVrVzJ2BhyWJwSPr7iJb3q52putiDtYW3WYOgIn8M4rq90n5wzN8umPJ80lQwxj/KKNhD0oyf6Vmz4WSkBlTKY6Cbp9iZ6GtNQ/IAYmGCMngBokcOTYV4rZXYmqSwNodIRgQiiyLxHRKX/3YgR8No1sMQXX5snUsTwALBHLQGBBgkbhooTPFibiRFny0YtoLRkJlwb6WFYVS8jjPBJ4FmqfFyjUm1YepsoAKv7zSbO89/DyWpBdWGjNTEV0Xof55RaqsraakiXJQHNqh11zILTxb7oJf/EZ0sA8ZHH5c+bhzeJS11miesdxY4D19pBh1K/nFY+aOp7rDSbDBrRIWVPrvyJa2gyhj+S5A+/ZNnpOem32de0pqVKGENneTzrKyUkobTSObl6RHOgqJsI6Mq5n4O9pSX08Ua6SnV3M5lwAQsyzMPTF34LKwucK6fYHY6zVceNjJ8rx7Z9xiJXYC4/BjBy8WjqaxeSgYBK8fn1HG9WHJKpcWwGeqBL4xhnsJi2BIKu5FghRfdsFqRPPzigVQGVmLsO2/7w5927Nz+xc7uCV6+oe3Qh6dAx0lvQ2XkV/v26Vz5YzcNL9HT6fSILZOWZMe2nRguwMIXF/l99uiy6i5HS553BfjBu/sOHNj37s5/7PDUZZx/v//BTz99cHKbNjCz9aj02mzAem+8/40fdg717f8+fOd09Xnpqda1m4JC1622VHVwnL3YbRhfteC2JbVti3r9Y5G5w05FqCiaT8cRDx5EfYzLuQvAOBkEJdmbogngFS9Wg5QRzxZhkU0SjQMCcojfOMeKDZosGLszUize9afdd19WXsJYa4bc9frrIPn6YajyxCdWWiyq90NMe9VUcFUiMnZoe17LFhdzY1OyKjHKYgQj+k8O4LNRQ23KeGbVwYOrLntAKCq2/EZ65a23QTYvVr/21stmiPT1wHD5kvYnwndH5g6fYBWGDikIGmcPSa4JJVvKCz+/aE7off/RRG8u2duHoMyhY/vF3LSIbX2tskoPJ2N54fUg7JkKEoUfHBDdKjJ1DtzuPS82znXx4Vg4aNYUqBkFawxsHX9spJFlVJoClcWPrvCZreK1UKE3aBI6f6Z4WKRoeFHGr0toDToFvBaAwath14isflJG4PSixiUKNgOcLoz2j5p4r3+0MB3q88wWl0bUc8J1LlaMimyhoHT73ehPYS5gRXB28DoYoPSoHVagdsCtkJJxwGRFJoI7SBxwWXPwYFDWa8rZM8nNJDebTOpYgwLKjiYS8Rx4Od2+9e1Kh1KnMzWYXKn61npNcPNoZ9L5Pq8wW83jxKDNW5eqm5JKTq5N1XnswbyxRptZwb+PsozaEtDUj6xPuvQNZpNO6ci8x/aA66+oWhe7hXcEnN5iIezUOzu252vUnKs5X10R1LKsP1LgcBRE/CyrD1ap85tdnFrjvW4Myhg2F3kcQTt/U+n6qmvXD6KB6f9XaWCwBwOWkukgiuhAXaAhdLBlwkttJk6FF9fMiPEgdHAdVOgM2oTWP0SmgyF+bVKr1yvAdYAa0BkQEegmDcFa0zkiqE+OCiAiCLWFRkKDTSYCtQ4TQQwTgUomAqVQRIu0elBfALJOIuKr8ainY2X2B71ggOX4OlAP8OISS+QnmgsTC2AuCmMgWZ5En9lEoddnrek6BjHVSmro8oZyUaRVCau+eUi7IjZfekj6/dQ3Y6MM+mFPjt0y8mnEcyvVHPeC3ttzeodEbe/Y2l6oAdx1Hx8FS37BCpXlzRVJ3VwYSgybkWzYsKaBo6JTm0cUxjjTp1FXfaiY87yse7j8SoOb5x2t3qDWE6I5US0dcvF5kyFwRn1GAACXBktBDVDqfSUjoo8ybd1X3DKkY01Lfj8/WM2IZ+6iZhPdNjMfRuN7v58vnOZD/X94VR+N7f1+aHjk0+KAXxIG/ET4wOQQMAlEL9soq2eTA1vI/uWkEH7n0eL6PfNqR4/WhUaGdKNaGubtqS47/E5YOPkpy545hTNEa/fOaxyBBvdwSM6xtzb66NtBC8rh3iN9uXfNe3umTt3z3pq9QLtnRHZZdhm8Ff4sW5OtYX+WJfgFsKfEoxs1ogndGDv8blD86HOOO3NaKHj3cNGQvfOHDh+tK/T5C3WjRzTO34dzoIf/heM+PSUUvHM4Vrtvft3oUTpPdD/Q75m258TaNSewx2Y9dGehdBXYBCWw6etfgrvpNNgtzTn3C7rzXI+UAUfpHnC0T8+S2BJFqBTGN+Nz+jBIoOh1phxMAB3HY7NX1MdAQgDG/FQa612G024AxsLH7Nl5S/esm2ZtLbnh2DH69/+Q3FZ/unzk2MV1ByvNZunDj56hJ5z7r6AC3jer3TZnIxsavnfpuez02wV2+Ms30PQNL5/45ova8ctGjinLhy/a706Wp5Lwd9knwBdnH0ibGN34G1yNvseoXl/vOV0+M5VPlVCVaDRcSq2lbqH+eMHaAIlJoZz3QTTTXToy8BxwOTfZaTRUmHq9yllTva5GTWEskHFYCEvLHtXQ0EEUSsjdOSW+3itkREb9kcX29Yy+F/WK2LGHiURCRqx0KExGXzKS0WQSxxIdlLl1ItThgZ24pORFOYEe56vw+SqujtQURFzuyMMFNZGI2xX5QQSFNb0B0IyT3vvhFW/f0mGZf/Vad22F25tGv6Ved4WzTLv86puGG93TU6fdYw/vWDZLKzVnZmbqZ9fDVa3fm9l2S7q0c2755IAxUc60jgfWxpoq6UwnU12UKyCNfrGKKYtXT0slVwz1hie3Hi3NM5UMWdxQLQpWaKZV9jzDxK+3+x3VE8dWshotIpeQYU+BzV+SnsL8qSoWq4p9M26lu6jIvdJdXOz+l2fwlf3H5j10cu2kCT989/vSW3Mq4+Sfx9YFhMdaOeHLCas33bbrd82l8HB89Oh4YvRo6WT3fYubq/ctmb9Q4CqSdnPTiyuXSZ80ZPbYwcqijHx/Y2lTOxA83Xz06MqK+ZXX3n3luKTLRps5fTRkXnYNk6lkedaoFwCXp0Hz8+fusvb+MryNChItgWQ435LoU6C15jgwRGXBRLm/3G/xWxKWxIA9t9s5addvNBvbZ91ww6xpNfMX377/5Mn99/4STF6yZCn6B0yDWAi4Jt9zzcjJN790c/Wc2Vi/4o01S0nG1YO5Azw3BHPjZZig1GFqRYMcb/QbozkngRjBRl4xI5sLiEw5quwH94yQPhx/z2v760f2HOkZWf/cnbNm6V5Mtk1SX2e2hxjq3FOlumR1qfQDdpJteVNnT09n03JbU7EeRkwQ+8rE4/QYgtPBot44gZpK3UZRpngKdQ42yoZlkLh6EIWoPnrgN8axzwCy+Y0xybBdNZmKQ9aE0Y/d0qFM2KQBTWYpNwajJlwNQ8qTJ2t54USHPVghLgD0Td5YdRl1G3Rwc9ix+h3tXm+7l1OqKu1xf1TcOPZseyWoelSsCo5UT23Yu5v1ahw6iwJELls+Kla5zNhSbvZCVX5Rk4e/pnvanoZ5hyZX/trpKNpa/LwNya6GdrNrkToJKFIsUITs0ijH0ub86enCjQ0111yxrFQ6Jd1FFLPu1TW4qgtrMoFVszo6Zh3yZ8pS/oQDsd6z7CHQk8lkOG2LL1OYtN7QxXQPPdz0mloNYMPe7EmApDu1Qvrtspi5opKLm9JWVWFmdB6kHh/Z+GX+uPwEjJ+w0gmPMCkvcL2+oQUVhbXR7aEhY1WljZrySsanDjfFgD1kh/vtIV2TM2l1qisqNMaAvdwzxBAaoHMRJFzEBQYojcRSrGcLragBRRCQtROwiZaO9uFtrHCIk5UYWDcTr6N5qqvhm0xDl1pRZ2luXn/vUnZ6aXtVe3wqt/Te9c3NljqFOvsrwHeoaUVIYVf/cTnbVYaul3WxT+9R21Eare4AvKo9PqqtpW1MaQe98lyUQLK8oVfyaWNV+bR17czw/GDQ18y2r5tWXmVM88rs/T+tVdjUSVToA2NofDV/OL31clRWUm1T1P5UUeMrEcWYt36g3mMZ1Y4lcJDzAaOji7Cil+zJIocI6KarIVaBD6RTomBELxuM4lxkqx21wcUIBBj+vA7fhFsMolZ5IaygVUWHrmTChaNbggAEW0YVh9i1h8KoskGFQ931FttWPDQPgLyhxW0sgGm1/aUpQzuld+j2wmac3FzYTr/7i6pyHY+NBImbD9zAkSvAS1wg2taKy2xtiwaKTp+eFIHLEuiNfVfNoL3euNUaz/cw065yk7ZhlCMOMnUen89Tx7xUrKCzIXr/2IqWP8AGt9/vboD37SuLa/hzGPqVfuQcsaal91eEVoIZrNtflpdX5ncHHj7SgcmFUlOW8xT7ST/7DjvlpnxUCMmicWo1IiNrDFUrzAIrHQZBGoUxNKdy2EYbsHQQpHkrSU6HeaKHkdbDMI9NWWNYo53l/KHycIgO1QPsZFc+poNxKytaBGLobbFiHxtpbMuKXW1gQRbdDFpe8b0HTMCklt6SznxY+hViImt10n5w43Q4D0Jm1Hg+Ww+oJuljZq7+DzB7CqwSpMn0XebT8BYO8gC6HzMLwxTMn3l+Js9I7zNQ8RGThnxtFxgOFV1bYDdUgkdZGtRyZm71lSy7juXG0exrHPsVA/Vm5qcceOcvb0uJE1+9C7a+DYb9Knv6HdD0snSw/bPRQK+kk80c3Psy+PUjZx/78z2fwxUvgKcOnnvm45sWTGfYNVM/6Pkov2wVSz/DsmMPsPSfIQRfMMDIM8EJHJjOsyWzFeANFb0N3MmwUhlP146H3BUtDFOxlKOvpOltDLdyG83CO9n+PJwLjfzjyaop7dcxWPDzyauhiGzpC8yKJeciYSDm1gXnCQPOmEfVntL2BJd2J2LRWMKd5hLtpR71uFqYqR33yJ3v3In+4AaTrrur4WyGIGYcbegiJhvdfUdQWDl7zrASJt+Qp1LlGfKZkmFzZleOmDED7l58xx2LF91xhzT6qM50Et/OEtiNk0TTuyd3zO0nkHdUUkXUZGoBsZ/LaYGgEYvpfR3ER1UDNxuvYy7xLn3OIS56c8tFGG2M/Gql0RExr4Ef3ZA92jBa6SwZU87ycUuJKxKKuEoscfiYoO0mAMq544BW0ArnKUF7lqCKMKg30xvQqy5Cryw96asdMXlkpHHevMbSzoVtScajtirRP6vaAxjU7Qkys3zs3yq4MJa49sFWw0IOJ0ch8yT5aIwbQo2hVmF74SjsowBI3gj2gmXn4FJ6/XEbvyMuTw/lstMAYurWe9Zv5YgyRdoruVJHcWFhYbGjlKtsj5haUpBKjd3yky1bfsL4+qvSW/TZl/UWix5W6C0DVOzRbCLt7++AQyLQLBx6dzC+Z9GsSsapNyuVZr2TqZy1qGc8rMeFb5H+0OeAApgqcMn4ANQXUkfhb9KfJuXv0yVjA17cfluIJIGJBFvikakuHXcD2LufPMgfR/l3xIUBtHUJFwuXwLVhqJaURKVaLm7Y6/+DJkUU9HVGxvru758BQ36jmeXrTF/zvt0z/qIWBs+Q5s129zXkmb7W/aov7VycIQSJqbx/EwvMqxd6QtfAuRhraBSgeYM4IfXJILmER5adSlKGXs+MvSqOX4qb1zQ+9dpTjWs2iwtBC7gStFyb0zaGp276THr8iSMDFAZ/vvtVQ8vYsS2GV3fv+uEP4WEZDfwUSEm3ST/+6yDFwgv1MlABqpjYaogmi/mCmiV2DJlzHmgxW00J0ZuOh3KVha/IJd2IFSR3SI9/hspkltx+Qa3x9obPN4PFmz9/IFdhjsK6lEd+jCp8801/Ba3k9rPDXv3mblnXUvro7m9eBcN6eg7kaj0Qj8UjW9uAAUNeuleBwWKmSK1SBgFvBcAw5w1zZBeReTQ2flpD8cs3nnvwxpeLG6aNj40ec92zx5+9bgySOGRd7KJJG/fsvFW6+tadezZOgp/rSmdueXPzXe+/f9fmN7fMLNVt3Dkf5UY3zd8JhdzLfHPq5rmfATO/aRMv/eWzuTf3+ZtmZX8LNsqP9Xr79SYxPqArYYPaSwA79aFpDugKYyra32uvGBPZvu25bdueAwfOodGVlrmkc4TWMJkfxfSNSHpCz4QJPYtnV7a2Vs4GTxFSPruf7f4GIzmxr36T6R1WcyMChnnvHQuwbkkRVU21Up3UHDyekn1IJL7L29W4ut82nA6OB/vGS/mNLhpe+1Dj8wfv3fbofU2xzJOZWJNPX18MHiyu7yGqMMxy1MVJ/4PoXaWeXuNIQJyu5EykZJOpvlwYTNOk+xrF+YEdvyk1bWI8k4lPnJZKt7WBg0TXRjp5Yezs8+fS79AvESwl7de/q/+rduwj2RwhwG8bU4OD4uwgDdiLx9hLExJux/piaUJxfb/W/O+3Y8/XiOS4o4OHzybUdum+lgTvkFbMXnCM9MUlGvFC2rnDTPdZTJYDh0xIfJSdRv3ITtAZDdDvg0aDCTs5ZIiSM1mZAgkRb4AjQYaTvdli546ySSReOUogXuaPb5z64PjxD1oqRV+qfEQkml+24KFrDjU2gq2rkLgy4sapw9ZMbcifsXiX9OHvtm37ALhuX/fJsTsnHLguNq2qtgF+isSjSukl6UXpZ9IvjEU1zUUuw4zOxXNul7Y42pd2Dgm1dKQdl/8CRB54EBS9cvnwG579+trnpJ8vah7R2jsezFFS7G7KiySGO6mfEhtPojaFXkcgyxC5RXoD0fkP9lm+ku9nvqAm0etVD3VCsqSGsvRXiLCQzX9ZexJvlhLEGKIzQZbY8MIHYzW7WaJZEiJxwBou6A+kU0aCL4TtTWVnmEiC+bnXAjT1s069HV4eErz1M8vWXBGfAG06s5Kt97vOHrOH/C6m0h56t9E2OWxQ84ZQFKUYaX2RtYFWaatElqG9oVR5qNAVNwBg4hxr7igb1lxmczmESLwmUhN2GhQcrVBpjCqrs0DlaBheC9+8TqgaNc5rcFeNVj4RSVYtgKJaUCu8QvOVM7s1cI4ln9ZvBE6wHYwHxsQCh+Con9tx7Bvpj2+Mn0TbDTZxgyscsqMfHLF1VmiMWaXhlIXx8dGRqUJWE9OK9pH6Kr3NYqsEDANL3cG6aLQuOLOuyMyykDaoi55fn163ZPGaZHmk1KDUmF1CItGSKcX+pCyi2mm1jTM3j9y/TTrzX972abUeg37YWPUfQMnm44vWLKEtGqvRrBTyH9gsffRwYf/1hjwy6wupEI+EOBG7qbKKPKgEfBx7gLnICPvencqw99x+l8WQ9zsILGpeLc1AFLL4ZAYuvoQ9wn/BHxeHNNJjaqeNHwoadQpWJV37kTj/3gDcfSmDAq7Pt5OW7CQnCA4qldP9S6WNCaMbWDGKomw4SEjMm0qbiZ/wNDGEtBhFIWd5g38QjyzNVT1VzT1NNei0pukZoHqmR1by6yHnPUfJP2z8XjPbQl9/bpVldk3b1hKawklZqmRr25ZnntnylPQ14J86shkew7Fs5WZwnWxcQwxs/p+oO7w++/9t3cH10v9K3csTlv/1ul9//X+n5v3rriTzslz7vrqjueQ/rzf6+3dqPXrFitH/cY0NfRhMeKUJe6tvpkZRE6guai61lFpNXUltpW6idlF7ZY8XoNdXYBSkZWy5fGPOkUpKtGLsTJhzSc3k7IBSvfHeMCmnBAanD87/Lff33scNCtk7VarsTSq7qkOlKh4uVLTMXbjrPIUZ6YXPDet6raMYXcqXFXWnkEBW5M3el1PelTWCqQGJ/TNKJ/pHchlkC+Qp/Y4sj56D6oGqYVcVd/5p1rBdC88iRh1z9R0tYdeQYpVKOkTum3LRMUmK6PmWqycuSgldlIItW/t89QWpEoKYOpRqozYieftG6nZqD3Uv9Qj1Y+pZ7MEX73j1sXzEUL0vhv6oQdreoVwoDoqHLsFdVoMcHp5IlhXRBMQhuulPNnGR+pZyvq38wem9ca5Hdo5YPyRLDakXtNhxM8yYnCaTs4Mco+S4o9+5fGQ6ZG4dSSa7Fi4eGZ0fEdXqQrVaeokEYkDpDCbKWzG+47mei+5+41+myE8DR48+sOoF/ITVorjUaLUan171wFHwA3zNFO13NF2Uku0TD2DPwl2jBJ13YOWil8f9GHPJBI5edG/Hv0yR/wjPiHUdKVZC42yGGk6tkHW8eCTOElbOC8wYNgGrvuL/2H15APFxhGPDPCRe5kfcH1YXTQXSKSTP95lVmGVfedhbHsCKxYS7JPZgeEspSvZfU25AnzZ68kTpnJjnMYKj0C397T0FRl1gIFDse/6I9PKPN5w+MB2An+3jIU0DBQR6xW2n1yn41T8F9M33gNj7m7OnNz+9efPT4OCiaQrE21h5VVXDqpdWbDmqVTUOUfF5LDQopi+C9DUfXH3LP28FkyYse3fmlCkz31068X5AfS5tmEBrlKUmr15JjwHxJx8HJfer+MWP/HHjk9Lro2mlJU8Z0yg1TNXvQdmhmwH7/HqlasVx6f0gfubm89T6t4dxClWyQKVK7ehY9vQMjf5nW6beX6NSRZJKBddyYuPm09dy/Na/5nyTy3bFApoPCJr7IJRlNEycRd9D3o2Q5WYMP9zdX14BcjkA2y1Sg+U3fsC9J8lyZm5hiO7z70BTGjTWUxFgjEA0esvrsjkUrgvV6asTTWURoWAoeCTv0+gB2f29CwGwW3ZyDlGm8+gKpHC6vJ6I0/EKQVefX3b87tjXLhVMp5IxQA4hnx6EQ2QvEjspzKGgWJHEP3il7ns7VKqPP1apdqBhFYV21aA4vKz/q7/7bdlycUbo36Z0v/rJ6z7/tl/cQbX8GD/ngQfk56BQNSh+TnvxJwYPXDpvX1x6laG6B8qsvWM8oSUMhH0RWx8F8exK6TW2+xI8PJgLk9lfgeOX4td5UjYkuh/YF2uUaqR+Rr2FrUx06LXrAMvJpnHYTs7a10Ryw4R7r4nmIOnmBLUH9XghRbYA+TrgAakw3vDEciDe6UQX0TiC9czSobCPaFdhWRNbn3DoAr6OcS7RcINRcvBGdjoK+TomIRI9GVG+zorWUFjHoAEmZSI6ptiifTD2CKvWF2jUuqRBmqKw8goFb1Xwe/0avzak0cjBOpzEK0QDuN63MxWKMi1tmRAUeYHT0SzNv0hbvT6uYNJQoVCjgQEO0HRRBadaOK5msdPNBxKekgk6Z41BGw8LUa1Wqyop00LIg6DbJvrn+PKnHDEAlV5vKSqMDBeg0mu0VuR5LFqdgi9YyAKnVsu4RY+gh0o/FG2Fgk4rlLz0hGfCakds0fz68N/Rh3wMfbHHyBdrQ1+s7XMmYDQWmIxs4C2FQiHiVxI7/FptSOvT+jWasMa/GqcrFAZxSqYo5GybOcHsDkALZ1FZ9KI5TzKZXTqzaljaoFUDUFJijqhUeR3xcVtUfKIsMbslpWcyFYtXWtRCnh2AuBPd5GJo5/Try3WiYUks6ntimEGtMdmqRKNQ64acErB6lgd8JFg+t3Te5a5CjuPjkfrqxgZ3yp7nToWKvWrbYaDsTm6qmDZ+LA3BukvaoIO+dViMEGgUiX15PUjQgp9oJOYWoeoYlMZBjFTjz2fL8XcXTGHsl6qczY+nMWHg/HjdD3LzHg0Gm0qM+fN0/DyXviY1UfrHxClgjr+sNhYvNE2bzCXYHZ+UFGdvkLZvaiwDCloNY02bwFr43PWfcAaGneb1TGjO/tapZ0dkVwCWpmHJ8Juk56TnNzXFgSL71qhWRm0L1xW+F5Q6alkOaObatKVpuBns+LI2qs2bq3E0ZadN3bBulTG3H0J0XIxUMVWKeO6xuZU7JA/oGL8x7qadgMURSBSua2jMYpPEhNEP0I8Phf1IhBMSAou6C+vz+4qAMZ4QU+EQWy7bc5SjDOlL2qvcBQBkFTqlEknvENQAwKgVSpahGY7lFCwNzn6wfj04vHCf06zZu6hkZBF4gKUNJq8lYrQomE5z4IEKGoBaRu9zRT2rlvLuWNz7eP8tOfjhEUZUGHgFDcqhgjaw4qx1wKrQc0rVbqji1RwGGODUrO4MeE8qAO/97rYRKKiQXgb1ukarwWbQsDRKSOyu27fF5fXrfXdJBe5ALW0atNfBUqXnoaKV/Sea0SyUHbXizSgxFCZey0QKDysxrNMv4NEE4M0FoqrJ19HY8wUfwkpfEI1psF5GIuDR+4exgTUePNBN2NKN58Kc30vRvpCfwzAEojVKx0AU5YPWHGOEh7IAg7giZg3HaqNXLlrlMe5tAB3StPttXpoZF2TXF/mK3ez+DW9KH+zbKf1toVtfc9/3tkUK8guUDH3lLw+ub2b0Fb4rvn781mBQ9NsZXflxKbvtSOS67RvD4ZvXvnimRWdv/v3rpb7hnYEgRstpAYikjf4gGjyiwxbFXTRkKwsayhI+hVB/MAPVYyPbnOV6n3cv8IPKXb89/XNAK9yzlzw0kfa9Lb0Dq50jn0iVd9w0BJZmxkVFae8BEHhr44LuqrmJIRaOoYErGFSpLQ1tNYEVX1ZxkYYmW55BKdhm5M0ImpnuA9OGqDXW0CywASi3tR2XPrksX21X0WAK0IL4xgWddrumOXTtzZsLC6FFb89zODQqT43Ce/uNrxy8bJbTp2+pCY26TGpG3y94XsO9x/6NsqJekKEmEo9TqVA4B42GFT74FNBBJoC5zDo6zdmBBiBWkzdDM/EhRDZkABsFxegCB60hWMcQfHk6RYWxXyU3o6PRB2drXcMmVG2bY9Lo/VZPlSNQXxTMM2vVKrAi+fxfpC+kbz5/fB4L9KoQk5j/BRgHusGUy83wyzHbf3L8J9vHyAFYPuSP0qfSL6X3JelIu7uMHXnTs6c++/vp11rzq2o00rv/VEBo3/jG9m6Ldfatp7YvfubATPh58UOVYZfZYVWxNKNXaYPBgkB+nhZkf7np6Rl5ic1HgfWeyMTIWu1xaask3aU5cI9Dy0DP8efwJtBzcsDtPD5LMebRv0v3HDsASv72xvfmRKzj77ksfpN01d/ApCYWlTz1tmd//fpPdkyG7tk7Xpf1ScgYQ/YB8RpKPdHpXkZtQn1kH/VDihIsfh/2UIl4R+y5MvE/jQ/mhdBYVkR+5dgFaCJe/j+MH11uKDWgv+XfETI/qig4dxT7TKUzBRWIMfruW0gIqB6DweBFv3/3bP83GfwYFj/srAKnoCuff0co6xDG0Pw2Bn2bWzCvKdvhxrA0FQrTQaMVa9+EYoDYndTia8TFipGldViE7lX1I/gpVrYEsMTqoDfFg43NRKvAGmWAlRx0sQtbp7mx2ZkR+z4W9UC27tUD8jg0zQS1IIgtfzn3oaetWq0ubn06rY0P086V/nrcAPPyI4bloWRouSGSnwcNx6W/ztUOi2vTT1vjOq3W+vQhl11Z6AIpAgz5CqN0+Bi7AxdkT4q5coD+EuUA/aByHHbG51Ay0isE0zLlKlTawcH8RdqEFVVq4f5QQhUExXdLx86YCj2CwtTzDtYFfKfHpBA8haYzoPJu6a2gKhHavxCVZk1oF+Vz0Vg+V7dnTx0IFBeyuKSoTicXJL11N6i8dEHSsbtB8cCC2MLiAMAFcfmxaK/NjMyHm7BEBTCTiycVDs8qAZMSiCY0hzA8C0JYRkbjVoB9nm/fcXzV5e/fu4BHZ79etRuYHwbDpINr16nUR6S3jpyzgU5yDkqOHIJ3wemrf3NgDs+Puvn1VeRMuZ06z9RK96ySXrnvCenlY7ZrQOflIH3fk6DimE2cJK8/5vD/dKheIqpZivigUwO/EE5becS8lAArHw6iH/NdcH2PH0z88KGyx0ZZPrdIQ0Hp1dJxcOLzeZ+BTT/teA7W4glNekH64M0NG94EPkRtvjf/cil545z0BOiSvg9W55fNjcMFqJSr18z7bO6UMc+N6SJ3behfElxzCa4QyaznAT+FPU9NomZSi6k11FXUQ9QT1AvUq9R71EfUGfSO2AanDoRlSGEaW+KgeRqLGLTs7wqbPXNEhCBSglWUVyVSZDHCGifzPZ51UowoL1/UASDqADkRqdy6Bda3E0mXxAqMIroljLPk1juiMJXG3Y7glaYQk4HYYpArTb6BlEdgjXCyXAzoe57YP3NYzoFS2RQTS5bQ7MgWVjevxE0zkKd5lsc+0NUKtZpzBxzAoLRo1Cl3ZKHVEA8WiWOa3RETfwvLeXQODs4EXKLZzIxt58wWFwM38Zp4mbGpNX5uCGfQ62w0bXDCiRreF9Go0SFrCdSjSdxkQkeWETQVQ0Iah3PINUPLF09ZYr5qb60GzPvbsDg9dk1hqC7AlC9s8m7d9+iw4dvXTYpxyWaL9+xKndIslGnJ8WHG5HMytGAwOpl7GYtZ8CksZnN+drFB73TUGgz6VB38hjHo9bgaqDI/0StFMeVWFZeDaJ4Z5NljTz0angOBEUJAA5qhoZZVsRwNWIMV6HkkYzm0pmih88YNt4Chsxloz9eCVQq1jteHTF+qQ0FrSHH/PqULhAzS187y2XlKLe253y0/zM5JJ4yRPIURH+hUSiOYMnaHxiRkgbMxpKloMAsamFkhfT2ynm7vYtNKMKxk/ohO3YqbD1TVbF85Vjn+ykpr2sIPmb5thKGjex5cbi7TobcmR1RBl0IwotdmhHPVZh/DWAp8LGOlFzrq0Ws7nHU+Q3ac3sbQRp3ejupzWkwZ9KrilFf1fwBUC+G2AAAAeJxjYGRgYGBhPD3hfEVkPL/NVwZudgYQuGJ81ghG////n4GTkQ3E5WBgYgDqAABkIwvXAHicY2BkYGBj+M/AwMDJ8B8IOBkZgCLIgGkrAHsKBc4AeJyNVktrFEEQrnn0PIybLIYVNQRWSUyULIqo6EXmsB69iB4MiCLiRSKCJ3Nq/Bn+D8Gjv0q8rVUzVT3ftJOsSz6qu7q63tWTzNNn4l/6kij5RVTSf+F1wbTwPU/WAid7PzxjfHWePplMYXcYruNdK3TPd++ZzBjkXt7pbkQu031r2/d61YcLzvwEmRzsr41VfcmppxhvOeSdOvQdzouUEvblO+P4rNhG0KieB4Ky50+cD7k7xdxYDhRTF9VC5Y5beIijy2UjMlWUb8sD2KfMQx76moS4kZqvrj8/4py8CTmyWHp7EneKPp8JTzON20W1nyr9wvxEZfK4lxhbA7897ZSWd0WtOnOtZeqpSTVvxsOeUt2H2Eecr8TyhT1TQvxQuwZzEs58Vx+NK/jIuhaMCdfgmYB9WzDC3mzkXY0xVsv1sKejfoHZtLNG52/C+4XeTdnH1HKi9K3kifGO7zsByyeF+sLyE5tPXmdM98bqrXm5aLNvvMQP8v3Q+Gw3E6ybL6jd/ewb04xyp3EzfQQ9dkPA/BaFwUOvE+1ID0Y9vBHHoXaX7Qzxn0DzafNscuEu+3KkNLxDpfK0DvPSr1b4prLsbGRWwqyKTAX+W71l9utO/gTf6TBX1L8P5W+6Fc+T+mlvcxtXjXd6Oq16/tzqUa+pWYQD81n9nzO2wcZS/XnM60sghz4/4fMrI+9CjKuM93z+Sv2+rXpqpge1+h6D5TYF+F1AvVVELb9Qh3bNPm7gu4x1wDuDtdZX99sF6NQeT62v4L1NZUZZvtCzlNftXNhsQJ2DriryIe6J6g+9qHU/lifrbYy7gPOSzu8NzCfmsvwxOAv9yPY+tHd/9vpD/MOaXGa5Taa7Y32h7/h+Nc5/Hvn3FGzNzReIbW8sLtV9nfcfWe+h8rNyqFvWS51/6cfMZlz1B3m3ov1Cv0cO7Xnawh6xb5We79dDW7Oov/7pDeDv2t18BPC/RRLPRUAKve7pruRcfbwTZDzdFHre7y/1CnzxeJyllntUz2ccx9/P404uuYYQGmnNQpFkihBiIeMQi7kzs2mbTYaJZYwk17k0l61NyD3kHic0cg+5h5BpriHsZf/4f+uc9/n+vs/zubzf78/zfU7Sv38e/wExkqkIFkg2AmRIhYJBnlQ4VCrqCq5IxUdKJcYC9kuyXsoNnJIcoqTSA6UyCVJZ3svx7khZx8VSeXIq0KNCplRxIiiQKtGvspdUpZzkRJ5TulR1tFQtCMRJ1ennzHoN8moWB3CqRS+XGQBOteOlOp5SXRfJlRhXuNULlOpnS270bAA3d/LcU5BHD49H0nv0b+gPeL4fDtjzRLPnSqkRPRvDqQk9veDlxbs3tb3h650sNeV30zBATjM4NkOnjwOgjs8mqTleNefpOxTkSi32SH7oaQk+8APwasVeK3r7k+9PnQD4B1C7dS+QL7Whdxu4B1IrkPi27LXjvT1x7bOkIOp2QH9HH6lTohRMTGdyuqC/Czy74PuHSVIInELg1xUdXfGpGzy7MYPuxHVnvqHs96BmT3zsRd3e+NQHX/pQOwyuYXDpS1w//O5Hj4+pEY6OAeQPwMeBhQFcBoUAzsHgVGkINYfQcxjch6F9OLMYQd8RcBoJt0+pP4r8z9gfzdn4HM+/oPcYzlIE84kg90tyxlEnknMTiT/jWR9P3HfR0gTmMZG1SU4AnpPxMIrZRVF/CrlT4DkVjT/QJxru0+AwnfwZadJPxM9kbxY5Mcwxhr3ZnI9Y+MWyFgufWNZiOZdz6D+HnDg0xlErDo/mwn8e53E+81/ArBY6S4vguoj5/EyvxfizhHpL2VuKd8uYWTz7v+DPcjQvR8MKZrYCniuZ1yrqJHDWVuN7IrUS8XIN72typLX0WofGdcwxCW5JnOv1eLSe72MD3DfwHWyA30Z6bWQWm5jLZvzaTN0t1NqCH1s5h1vhnUzeNuK3wWl7+lvsgEcKmneibxc6d1NvDzPchx/78Go//FLplYrfB/DwADoP4n8aZyYNPofodYg6h6lzBL5HWEuHy5/EHKXnUXQcg38GtY6j/zjzO4HWEzxP0uMk6yfRfApPTrN/Gr/O4PsZ8s4yp0x0Z6LhHGvn4HUeb8/D4QK+XKBHFryz4HyR2IvovISWy+xd5pu4AuerrF/Dl+touM65yIbjDeJvMuNbxN2idw7rt/kW74C7IBff7nGW/+JM3mfvAb48RNMjch/zHT3BhyfwfEp+Pt7nU+sZZ+I5vV7Qs4BvpQCOL9H3Et4v4f8Kza9Ye11cRhVlimySKfpIpli+TPEMmRIDZUqWAwtkSjnJOBQGK2VKe8iU4SouGy3jyG/HeJny6TIVfEA213SMTCU3QGzlXqBApsoeGacomapjZapFylQPlXE+JVPDH/CsSU4t6tdiz4W82sTXIbYu3OqOlHFlz5Ue9YfKuOXIuAfLeFCjIc9GEQDeja/INPEESTJeCTLerDclppmrDHehaR4k44se3zyZFvTzg49fpkwrOPo7ywTQs3WaTBsQuFimLfHtQPvRMkE8O8CnowtAYyc4B6O7M750QUMI4C4z3eDQPVAmlLgecPsoHBDbkx69vAAxvdHSG+/64G8f4sPQ3Bce/dgLj5PpT6/+KTID4PkJeQMTZQahZTDah2TJDGVOw8JkhsNnFBpG03sMdb5C29dwH4u2b6j/7QyZceRE8hyPPu4qM4G8CcxzAjOeiK+TqPs98ZPhNpn9KPKn4N9UfkezN43cH5nr9DeA30w0zcTbWfgaQ7/ZnJs55MfxnIuuucx6HrXnE7sQXYuot5i4JcxxCRqXsrYMz5Yxw/hUmeXMZQW9V6JlFX1/nSjzGz0S4MsdZBJy3+J3vPiDc7Uab1dzFhLxZQ1c1vK+Fr3r6L+O9yT8SOJ9Cx5uRWMy3nDPmO3sb8ffHZyHHehLgVMKfXfSb9cbsLabWnvwfy8c98JvPzn7mXcqeg6g+SD9D8IlDd6HwGH6HGEvHc1H4XyM+hn0PM5sTzCrkyGAvdPM6Qy9znKWzuJRJuf1PPwvUDMLXKQWd4W5RL3LcLmKD9fIy4bHDfZu+sncgtct9OXAP4czdZs+d+h5h9934ZiLj7nJgNr3qHUffffRlIeGPPz6G20P4POQvIf4/5i6T/h+n3Dun8LtKT7lw+8Za895f4FnBcQUoIV7w7zkLLyix5v74nWGrPGStc6yhTxkCw+VLXJKtliIbAnWS/Lb4Yps6TzZsk6y5VhzzJat4CdbkfhKgP+vbBVPWScf2aqustWiZavzu8Ym2ZqhIF3WJVK2NrXrJMq6Bsu+Q3y9INn6xLo9km0wQ9adNfcs2XfjZD14NqRWw1xZT9AoSraxPyiQbZIs6xUh681+U3Kbu8j6ku8L1xYOgJp+biBTtiXcWhHvv0A2AB1t4mUDqdGO96BwQH4H+AWn/B/8A2W9n3QAAHicY2BkYGA6zCTJoM4AAkxAzAiEDAwOYD4DAB0oAU0AeJyVk99qE0EUxr/dpE1rpGDRUryQQUTBi920lBaCN9s/6U1oYgilV+o2O0mWJrthdpKQa19A8AXEKx9AvBe89FUEH8FvJ2MTsUJNSOY3Z+b8+c7ZBbDtPIWD+cfHG8sOyvhk2UUJ3ywXcA8/LRdRdh5aXsGmU7e8SvvUcgkv3WeW13DXfW95HXfcL5bLeOD+sLyBR4WAWZziOnevTMacHWzhnWWXtz5bLuAxvlsuYstxLa/gCXXNeZX215ZL+Oi8tbyGbXdmeR333Q+Wy3jufrW8gReFAo6QYoQZFGL00IeGwDFCTCBJp6QEEc8FdlHBDvbhkQMM+BVLXpnZSa6Sa+4d8SaO0tFMxb2+FsfhRIrTMIlmYreys++JYDAQ5igTSmZSTWREhxrrSRgvwNRESzHkilqa6GAqs3TITYuWHsasIGQutGRvPAhV7tvAGdqo0/sQVe7atJ3gAk1yizvUGmftenBYbbRrJxfNRqt9u4znRlVGtfldgT1qO+CvstQXnEuVxWki9rwDr2JE3i54k0IkpWSm5XkTuyadoF9q/vvm5KZR5T4d0u/CulzVkk/X5s8tijkiWoembVe0hbRqE++S7VxESbjmu46pmVNpDmSYSc6pK5XQqdB9KRajzWRH58K7qTInXaoTWoWRHIbqSoRaq/hybK4kqY47MrODVqayv3qjtLhuzk3PIhbPEkwfNPtS5SvuX+sN/4jpGWXoaz2q+n5eXjiP78Xp/0TwOal5VxLTef8fMf0BRSaZ9PELz4vYEXicfVcFdOPIsnVVmWInGVimt8yU2JacLE9gmZm9st22NZYtjSAwy8zMzMyPmfYxv33MzLCPmaqk9kzm/HN+TtIk3b7dfW9XKSlM/b8/+BoXkMIUpW5KXZ+6LnVj6pbUrakbUrelbgYEgjRkIAs5yMMQFKAIwzACo7AMlsMKWAkbwcawCWwKm8HmsAVsCVvB1rANvAm2he1ge9gBdoSdYGfYBXaF3WB32AP2hL1gb9gH9oUxGIcSlKECBphQhQmYhP1gfzgADoSD4GA4BFbBFEzDDMzCoXAYHA5HwJFwFBwNx8CxcBwcDyfAiXASnAynwKlwGpwOZ8CZcBacDefAuVCD88CCemo09UZqBBrQBAUtaEMHbFgNXXCgB31wwYM14EMAIUQwB/OwAIuwFs6HC+BCuAguhkvgUrgMLocr4Eq4Cq6Ga+BauA6uhxvgRrgJboZb4Fa4DW6HO+BOuAvuhnvgXrgP7ocH4EF4CB6GR+BReAwehyfgSXgKnoZn4Fl4Dp6HF+BFeAlehlfgVXgzvAXeCm+Dt8M74J3wLng3vAfeC++D98MH4IPwIfgwvAYfgY/Cx+Dj8An4JHwKPg2fgc/C5+Dz8AX4IrwOX4Ivw1fgq/A1+Dp8A74J34Jvw3fgu/A9+D78AH4IP4Ifw0/gp/Az+Dn8An4Jv4Jfw2/gt/AG/A5+D3+AP8Kf4M/wF/gr/A3+Dv+Af8K/4N/wH/gvphAQkTCNGcxiDvOpHXAIC1jEYRzBUVyGy3EFrsSNcGPcBDfFzXBz3AK3xK1wa9wG34Tb4na4Pe6AO+JOuDPugrvibrg77oF74l64N+6D++IYjmMJy1hBA02s4gRO4n64Px6AB+JBeDAegqtwCqdxBmfxUDwMD8cj8Eg8Co/GY/BYPA6PxxPwRDwp9TqejKfgqXgano5n4Jl4Fp6N5+C5WMPz0MI6NrCJClvYxg7auBq76GAP++iih2vQxwBDjHAO53EBF3Etno8X4IV4EV6Ml+CleBlejlfglXgVXo3X4LV4HV6PN+CNeBPejLfgrXgb3o534J14F96N9+C9eB/ejw/gg/gQPoyP4KP4GD6OT+CT+BQ+jc/gs/gcPo8v4Iv4Er6Mr+Cr+GZ8C74V34Zvx3fgO/Fd+G58D74X34fvxw/gB/FD+GF8DT+CH8WP4cfxE/hJ/BR+Gj+Dn8XP4efxC/hFfB2/hF/Gr+BX8Wv4dfwGfhO/hd/G7+B38Xv4ffwB/hB/hD/Gn+BP8Wf4c/wF/hJ/hb/G3+Bv8Q38Hf4e/4B/xD/hn/Ev+Ff8G/4d/4H/xH/hv/E/+F9KERASUZoylKUc5WmIClSkYRqhUVpGy2kFraSNaGPahDalzWhz2oK2pK1oa9qG3kTb0na0Pe1AO9JOtDPtQrvSbrQ77UF70l60N+1D+9IYjVOJylQhg0yq0gRN0n60Px1AB9JBdDAdQqtoiqZphmbpUDqMDqcj6Eg6io6mY+hYOo6OpxPoRDqJTqZT6FQ6jU6nM+hMOovOpnPoXKrReWRRnRrUJEUtalOHbFpNXXKoR31yyaM15FNAIUU0R/O0QIu0ls6nC+hCuogupkvoUrqMLqcr6Eq6iq6ma+hauo6upxvoRrqJbqZb6Fa6jW6nO+hOuovupnvoXrqP7qcH6EF6iB6mR+hReowepyfoSXqKnqZn6Fl6jp6nF+hFeoleplfo1dQdmbZjBUGmFwV2Ixsoy2908qo/pxzXU5kO98N0EFp+QYqa6nnhYjoKlJ9u2U4vH3ZqjuW3FYadnLTtIES3m/VVz51TubWu26vZ/Xxcu1FIbquVDex233Ko4bYzoW8FnXTH7ak8z6ZqlhOmQ7un0r5rNYeb7nzf4YYM5wedbORJlbH7dXeh6DnWYq1h+w1HMaenrDDnq5avgk5elhJP6LiNbrrlWO0Cb6bpddy+CgpzrhP1VI3XU9RNIRjS7cjLrvEbblPl6lZcU2i10/wXpOuu281L0bP8bsbz7X6YbVg95VvpltsP+bnTzNqh5diNYqgWwlpH2e1OWIjb83Yz7BT4Wbtfc1QrHE6aDdUPlV9MOr68PpK0V0dBaLcW07KXot1v8nsJTrfjd0dbVkPJqdXm7KZyc57dCCNfZT3Vb9hOoWd5NVmr8rNWUybkE+Z1qqYdZoKO5atMo6P4hESwkSBUXq1uNbrzlt8caVl8hINeftBIy6FnPItNwMZwvVzL9WV8OH590Iln0p2MWq0a4TDzzPlusvORQSfewpDnREFNjFHo2X3dLCYmits5txvXI2sixUfCOOkN2f2Wm8CChq9UP+i44YiGJa4YYmDSKtSt/qBp+b47H6+jmDTjVeSTduTp57Ej4iMSH/FyAnutqrUixxnW7aBnOc5ytdBwrJ61blnptt1i2ymrxXfEV3m1yEZjNYak0XDcQA3zqfTtfjt+PcPn2Vf5huWoftPys77Vb7q9XMPt9VjjbM9q91VYGJxX5K07R1kf2z2cVyoc4a17nkzZ4As73GIXKj8hK+qOLGGZXvic8kObGVfofsf17bVsX8sZYsfXGh2ZJJy3Q/ZlcvBiMrF93BtOHF9jct+lrlpM820O8nrJwUjYiXr1gNcqB7dM92S50h+KA0nHclrFOLokMSUn83KIGHHsfpfNmRxlzouCDm9rhG+P8jls1ORxHELsfpbJvc5isW0zQz3xQRIdhCbjsA/4cOW+F2OLJ0Sjg8ubdAvxCwmZ3nB+sNdsMnM26ksMKbLF+NLIATfJDwLqNPlSsBv48PrpunKcYkOOtcUHG6pCh2XU7o6b4rZc3Iq8ZEQOZEXiyNp6R67cYCSeYNkGQ5G3IUim4Rju1lV23uc738mEVtANshxReTNDdd9WrYYVqII4N7knmbbvRl5azjLDHoma2bqyOEJQIwpZSo9PxfJi/9heOrDmVEHOp1Zno3bZca7PfsLIQdfhiOHbXRV2eMJ2ZyjiuOTztIrXUHdUhs1rNzjMR43uEMvI6+HrO7quFR/78rbrtnk362JAcclAhjVUiwU+cxXGO80nTb6kSSO+xEkzPiu+NxzC+0E6cH22GhfJPYlbfHkGmS1OKgOvpXndLhumzf5vckqqu6xxUdtZ3hweWDvOKBzjQ/ZrqDi25tnbPmtvcUTkmFdwZBE1tkU9z3GBdW6r0fiIa4MMNpx0E6fmJJXWes0iY8OOG/Dhq3wQ2aEolhdTCWO2wYlKKc4wLkdlyZRxOpEt1CPb4R208wz2JO8MWT1mt/oNle2pZtcOiy1ZErOsVrx0xXmgk4Sp1lhLrWi6UV2s1JcTj/23wUjivw2G2H8b9GVfhfX44hJgfoAorH8111RBl9NG1rE8qWKjhMM9ty77im/jsPZ37LfCmsgN9dRJM9GZd9vv82aSdzOc/Z3Fgg4FfDDLl4bAOAwtCYPSL6gFT25hoi4L6CXvZYIeLyTT4qvVp57q5Noc6zyrmecwF/siL98S8uZo3IhDC7u5mecz5uxlOWn5YhiKF8SvOcvWxTsdgDiYJMkivr/pBkexIYFIuuxKsGFXpmul6mRxSWYpBhHfSL6+tse2jupJi1+bKA970dq1cna2aihOoDKhHOPo+mYt/vDq2Mppjg4STbKaFZKiauwm9lBkBx0+UZ+DnZLEs9BocoDS2SYYfLSs3GBEB6ilQxKglvbjANUJe46RbgRBOcve5JBZSKKqNjFHJs6OG7HfbS+wgyUJacW6sUHSStfKY+Wh+NNP5s/yIK93dP2XQ5yuk5AfD+YdxZdebJg0Yscmz+PPiDisx1eiVh4vFZKUH2cEvvZ8rSWzJQZZ7xS2rrxdJRX51K57FAVNsvs+rfYWyY/q1PXnqR425DNZDa27s8vjOFQXY3gdq843slYuTa5cNxpyOK1HoQo2/b9Dsq2RwXAcg1ds0ItjU61crkhhDC9yNo3qeiO6k15gmYcWBp8e696Rw8w12Sz8Uc0hnb/0BsGLv7G43/atXrbF37Rdn6wmh47x6vho3Q7rkRy9loEjoeMXkyoeWua4TLQ+S40s6Ufe0qfiq+VL+skVn+fPXHc+yPE19V27meGLES3wMu265Jagu+hxUnMjP1gTsWL8OcBWcbMtDsuOSkshCTy0PQoikdY0c/LPjT2nqB61ca6bmVd23eV/HPr8yy9US6Px3muDzctYZZNkSYOc6yQ5Rx6Zo003XPJAxiaG5/hTnL9K4zXxyMTYSJLZ4oGaK0MlKcpSiFYThhSmFFUpJqSYzEV9+9DxVWN81tY4j0wKaLIsXQFNCmhSQJMCmhTQ5GS6VhmLEXVplaQoS1FJZpsal44pRVWKCSkEND4mhTwdF9C4gMYrUhhSCGJcEOOCGNdrmx7TteBKgisJriS4kuBKgisJriS4kjCVhaksiLIgyoIo6+XN6AlnxnUdvyHQsqacMXRt6lomr8gcFWGtCGtFWCvxA4FWNHRWiA0hNmRaQ0CGgAwBGQIyBGQIyJClmoIwBWEKwhSEqZd6aPxMQGaVz7sVPxNQVR5UBVQVUFUeVIWmKjRVU15uSEtoqoKYEMSEIMQXFfFFRXxREV9UxBcV8UVFfFGZEMSkICYFIaaoTApispJulWIZ2RTcih8IQkxhsCm4GJeiJEVZiooUhhSmFFUpJqSYzMwpDpvcFEsYMpchljDEEoZYwhBLGGIJQyxhjAtJSUhKghAzGGIGQ8xgiBkMMYMhZjDEDIaYwRAzGGIGQ8xgiBkMCV9GWRBlQZQFIR4wyoKoCKIiiIogRHpDpDdEekOkN0R6Q6Q3KoIwBCG6G6K7IboborshuhuiuyG6G6K7IboborshuhuiuyG6G6YgTEGI6IYpCFMQLHqrxAguBMGic0sQIrohohtVQVQFIaIbIrohohsiuiGiGyK6IaIbIrohohsiuiGiGyK6IaIbIrohohsiujEpCIkEhkQCQyKBwaK3SlUV27Q0MaZrxpkivSnSmzoelCYMXZsyWJViQgrmM8VLpuhviv6m6G+K/qbob4r+puhviv6m6G+K/qbob4r+puhviv6m6G+K/qbob4r+Zim5lqVVeoWrxnVd0nVZ13qpq/RSV5m6rup6QteD+VbpekrX07qe0fVsUk9p3inNO6V5pzTvlOad0rxTmndK805p3inNO6V5pzTvlOad0rxTmlcHzdK05p3WvNOad1rzTmveac07rXmnNe+05p3WvNOad1rzTmveac2rY2tJx9bSjOad0bwzmldH2JKOsKUZzTujeWc074zmndG8M5p3RvPOaN5ZzTureWc176zmndW8s5p3VvPOilMmNemsJp3VpLOadFaTzmrS2dn/AboJB4wAAAA=\";\n}, function(module, exports, __webpack_require__) {\n    function addStylesToDom(styles, options) {\n        for (var i = 0; i < styles.length; i++) {\n            var item = styles[i], domStyle = stylesInDom[item.id];\n            if (domStyle) {\n                domStyle.refs++;\n                for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j](item.parts[j]);\n                for (;j < item.parts.length; j++) domStyle.parts.push(addStyle(item.parts[j], options));\n            } else {\n                for (var parts = [], j = 0; j < item.parts.length; j++) parts.push(addStyle(item.parts[j], options));\n                stylesInDom[item.id] = {\n                    id: item.id,\n                    refs: 1,\n                    parts: parts\n                };\n            }\n        }\n    }\n    function listToStyles(list, options) {\n        for (var styles = [], newStyles = {}, i = 0; i < list.length; i++) {\n            var item = list[i], id = options.base ? item[0] + options.base : item[0], css = item[1], media = item[2], sourceMap = item[3], part = {\n                css: css,\n                media: media,\n                sourceMap: sourceMap\n            };\n            newStyles[id] ? newStyles[id].parts.push(part) : styles.push(newStyles[id] = {\n                id: id,\n                parts: [ part ]\n            });\n        }\n        return styles;\n    }\n    function insertStyleElement(options, style) {\n        var target = getElement(options.insertInto);\n        if (!target) throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\");\n        var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];\n        if (\"top\" === options.insertAt) lastStyleElementInsertedAtTop ? lastStyleElementInsertedAtTop.nextSibling ? target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling) : target.appendChild(style) : target.insertBefore(style, target.firstChild), \n        stylesInsertedAtTop.push(style); else if (\"bottom\" === options.insertAt) target.appendChild(style); else {\n            if (\"object\" != typeof options.insertAt || !options.insertAt.before) throw new Error(\"[Style Loader]\\n\\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\\n Must be 'top', 'bottom', or Object.\\n (https://github.com/webpack-contrib/style-loader#insertat)\\n\");\n            var nextSibling = getElement(options.insertInto + \" \" + options.insertAt.before);\n            target.insertBefore(style, nextSibling);\n        }\n    }\n    function removeStyleElement(style) {\n        if (null === style.parentNode) return !1;\n        style.parentNode.removeChild(style);\n        var idx = stylesInsertedAtTop.indexOf(style);\n        idx >= 0 && stylesInsertedAtTop.splice(idx, 1);\n    }\n    function createStyleElement(options) {\n        var style = document.createElement(\"style\");\n        return options.attrs.type = \"text/css\", addAttrs(style, options.attrs), insertStyleElement(options, style), \n        style;\n    }\n    function createLinkElement(options) {\n        var link = document.createElement(\"link\");\n        return options.attrs.type = \"text/css\", options.attrs.rel = \"stylesheet\", addAttrs(link, options.attrs), \n        insertStyleElement(options, link), link;\n    }\n    function addAttrs(el, attrs) {\n        Object.keys(attrs).forEach(function(key) {\n            el.setAttribute(key, attrs[key]);\n        });\n    }\n    function addStyle(obj, options) {\n        var style, update, remove, result;\n        if (options.transform && obj.css) {\n            if (!(result = options.transform(obj.css))) return function() {};\n            obj.css = result;\n        }\n        if (options.singleton) {\n            var styleIndex = singletonCounter++;\n            style = singleton || (singleton = createStyleElement(options)), update = applyToSingletonTag.bind(null, style, styleIndex, !1), \n            remove = applyToSingletonTag.bind(null, style, styleIndex, !0);\n        } else obj.sourceMap && \"function\" == typeof URL && \"function\" == typeof URL.createObjectURL && \"function\" == typeof URL.revokeObjectURL && \"function\" == typeof Blob && \"function\" == typeof btoa ? (style = createLinkElement(options), \n        update = updateLink.bind(null, style, options), remove = function() {\n            removeStyleElement(style), style.href && URL.revokeObjectURL(style.href);\n        }) : (style = createStyleElement(options), update = applyToTag.bind(null, style), \n        remove = function() {\n            removeStyleElement(style);\n        });\n        return update(obj), function(newObj) {\n            if (newObj) {\n                if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) return;\n                update(obj = newObj);\n            } else remove();\n        };\n    }\n    function applyToSingletonTag(style, index, remove, obj) {\n        var css = remove ? \"\" : obj.css;\n        if (style.styleSheet) style.styleSheet.cssText = replaceText(index, css); else {\n            var cssNode = document.createTextNode(css), childNodes = style.childNodes;\n            childNodes[index] && style.removeChild(childNodes[index]), childNodes.length ? style.insertBefore(cssNode, childNodes[index]) : style.appendChild(cssNode);\n        }\n    }\n    function applyToTag(style, obj) {\n        var css = obj.css, media = obj.media;\n        if (media && style.setAttribute(\"media\", media), style.styleSheet) style.styleSheet.cssText = css; else {\n            for (;style.firstChild; ) style.removeChild(style.firstChild);\n            style.appendChild(document.createTextNode(css));\n        }\n    }\n    function updateLink(link, options, obj) {\n        var css = obj.css, sourceMap = obj.sourceMap, autoFixUrls = void 0 === options.convertToAbsoluteUrls && sourceMap;\n        (options.convertToAbsoluteUrls || autoFixUrls) && (css = fixUrls(css)), sourceMap && (css += \"\\n/*# sourceMappingURL=data:application/json;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + \" */\");\n        var blob = new Blob([ css ], {\n            type: \"text/css\"\n        }), oldSrc = link.href;\n        link.href = URL.createObjectURL(blob), oldSrc && URL.revokeObjectURL(oldSrc);\n    }\n    var stylesInDom = {}, isOldIE = function(fn) {\n        var memo;\n        return function() {\n            return void 0 === memo && (memo = fn.apply(this, arguments)), memo;\n        };\n    }(function() {\n        return window && document && document.all && !window.atob;\n    }), getElement = function(fn) {\n        var memo = {};\n        return function(selector) {\n            if (void 0 === memo[selector]) {\n                var styleTarget = fn.call(this, selector);\n                if (styleTarget instanceof window.HTMLIFrameElement) try {\n                    styleTarget = styleTarget.contentDocument.head;\n                } catch (e) {\n                    styleTarget = null;\n                }\n                memo[selector] = styleTarget;\n            }\n            return memo[selector];\n        };\n    }(function(target) {\n        return document.querySelector(target);\n    }), singleton = null, singletonCounter = 0, stylesInsertedAtTop = [], fixUrls = __webpack_require__(546);\n    module.exports = function(list, options) {\n        if (\"undefined\" != typeof DEBUG && DEBUG && \"object\" != typeof document) throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n        options = options || {}, options.attrs = \"object\" == typeof options.attrs ? options.attrs : {}, \n        options.singleton || \"boolean\" == typeof options.singleton || (options.singleton = isOldIE()), \n        options.insertInto || (options.insertInto = \"head\"), options.insertAt || (options.insertAt = \"bottom\");\n        var styles = listToStyles(list, options);\n        return addStylesToDom(styles, options), function(newList) {\n            for (var mayRemove = [], i = 0; i < styles.length; i++) {\n                var item = styles[i], domStyle = stylesInDom[item.id];\n                domStyle.refs--, mayRemove.push(domStyle);\n            }\n            if (newList) {\n                addStylesToDom(listToStyles(newList, options), options);\n            }\n            for (var i = 0; i < mayRemove.length; i++) {\n                var domStyle = mayRemove[i];\n                if (0 === domStyle.refs) {\n                    for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();\n                    delete stylesInDom[domStyle.id];\n                }\n            }\n        };\n    };\n    var replaceText = function() {\n        var textStore = [];\n        return function(index, replacement) {\n            return textStore[index] = replacement, textStore.filter(Boolean).join(\"\\n\");\n        };\n    }();\n}, function(module, exports) {\n    module.exports = function(css) {\n        var location = \"undefined\" != typeof window && window.location;\n        if (!location) throw new Error(\"fixUrls requires window.location\");\n        if (!css || \"string\" != typeof css) return css;\n        var baseUrl = location.protocol + \"//\" + location.host, currentDir = baseUrl + location.pathname.replace(/\\/[^\\/]*$/, \"/\");\n        return css.replace(/url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi, function(fullMatch, origUrl) {\n            var unquotedOrigUrl = origUrl.trim().replace(/^\"(.*)\"$/, function(o, $1) {\n                return $1;\n            }).replace(/^'(.*)'$/, function(o, $1) {\n                return $1;\n            });\n            if (/^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/)/i.test(unquotedOrigUrl)) return fullMatch;\n            var newUrl;\n            return newUrl = 0 === unquotedOrigUrl.indexOf(\"//\") ? unquotedOrigUrl : 0 === unquotedOrigUrl.indexOf(\"/\") ? baseUrl + unquotedOrigUrl : currentDir + unquotedOrigUrl.replace(/^\\.\\//, \"\"), \n            \"url(\" + JSON.stringify(newUrl) + \")\";\n        });\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), React = function(obj) {\n        if (obj && obj.__esModule) return obj;\n        var newObj = {};\n        if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);\n        return newObj.default = obj, newObj;\n    }(_react), _propTypes = __webpack_require__(1), _propTypes2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_propTypes), Icon = function(_React$Component) {\n        function Icon() {\n            return _classCallCheck(this, Icon), _possibleConstructorReturn(this, (Icon.__proto__ || Object.getPrototypeOf(Icon)).apply(this, arguments));\n        }\n        return _inherits(Icon, _React$Component), _createClass(Icon, [ {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, Component = _props.Component, name = _props.name, size = _props.size, rotate = _props.rotate, flip = _props.flip, spin = _props.spin, fixedWidth = _props.fixedWidth, stack = _props.stack, inverse = _props.inverse, pulse = _props.pulse, className = _props.className, props = _objectWithoutProperties(_props, [ \"Component\", \"name\", \"size\", \"rotate\", \"flip\", \"spin\", \"fixedWidth\", \"stack\", \"inverse\", \"pulse\", \"className\" ]), classNames = \"fa fa-\" + name;\n                return size && (classNames = classNames + \" fa-\" + size), rotate && (classNames = classNames + \" fa-rotate-\" + rotate), \n                flip && (classNames = classNames + \" fa-flip-\" + flip), fixedWidth && (classNames += \" fa-fw\"), \n                spin && (classNames += \" fa-spin\"), pulse && (classNames += \" fa-pulse\"), stack && (classNames = classNames + \" fa-stack-\" + stack), \n                inverse && (classNames += \" fa-inverse\"), className && (classNames = classNames + \" \" + className), \n                React.createElement(Component, _extends({}, props, {\n                    className: classNames\n                }));\n            }\n        } ]), Icon;\n    }(React.Component);\n    Icon.propTypes = {\n        name: _propTypes2.default.string.isRequired,\n        className: _propTypes2.default.string,\n        size: _propTypes2.default.oneOf([ \"lg\", \"2x\", \"3x\", \"4x\", \"5x\" ]),\n        rotate: _propTypes2.default.oneOf([ \"45\", \"90\", \"135\", \"180\", \"225\", \"270\", \"315\" ]),\n        flip: _propTypes2.default.oneOf([ \"horizontal\", \"vertical\" ]),\n        fixedWidth: _propTypes2.default.bool,\n        spin: _propTypes2.default.bool,\n        pulse: _propTypes2.default.bool,\n        stack: _propTypes2.default.oneOf([ \"1x\", \"2x\" ]),\n        inverse: _propTypes2.default.bool,\n        Component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ])\n    }, Icon.defaultProps = {\n        Component: \"span\"\n    }, exports.default = Icon;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), React = function(obj) {\n        if (obj && obj.__esModule) return obj;\n        var newObj = {};\n        if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]);\n        return newObj.default = obj, newObj;\n    }(_react), _propTypes = __webpack_require__(1), _propTypes2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_propTypes), IconStack = function(_React$Component) {\n        function IconStack() {\n            return _classCallCheck(this, IconStack), _possibleConstructorReturn(this, (IconStack.__proto__ || Object.getPrototypeOf(IconStack)).apply(this, arguments));\n        }\n        return _inherits(IconStack, _React$Component), _createClass(IconStack, [ {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, className = _props.className, size = _props.size, children = _props.children, props = _objectWithoutProperties(_props, [ \"className\", \"size\", \"children\" ]), classNames = [ \"fa-stack\" ];\n                size && classNames.push(\"fa-\" + size), className && classNames.push(className);\n                var iconStackClassName = classNames.join(\" \");\n                return React.createElement(\"span\", _extends({}, props, {\n                    className: iconStackClassName\n                }), children);\n            }\n        } ]), IconStack;\n    }(React.Component);\n    IconStack.propTypes = {\n        className: _propTypes2.default.string,\n        size: _propTypes2.default.oneOf([ \"lg\", \"2x\", \"3x\", \"4x\", \"5x\" ]),\n        children: _propTypes2.default.node.isRequired\n    }, exports.default = IconStack;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _common = __webpack_require__(81), _Logs = __webpack_require__(261), _Logs2 = _interopRequireDefault(_Logs), _Footer = __webpack_require__(551), _Footer2 = _interopRequireDefault(_Footer), styles = {\n        wrapper: {\n            display: \"flex\",\n            flexDirection: \"column\",\n            width: \"100%\"\n        },\n        content: {\n            flex: 1,\n            overflow: \"auto\"\n        }\n    }, themeStyles = function(theme) {\n        return {\n            content: {\n                backgroundColor: theme.palette.background.default,\n                padding: 3 * theme.spacing.unit\n            }\n        };\n    }, Main = function(_Component) {\n        function Main(props) {\n            _classCallCheck(this, Main);\n            var _this = _possibleConstructorReturn(this, (Main.__proto__ || Object.getPrototypeOf(Main)).call(this, props));\n            return _this.onScroll = function() {\n                _this.content && \"function\" == typeof _this.content.onScroll && _this.content.onScroll();\n            }, _this.container = _react2.default.createRef(), _this.content = _react2.default.createRef(), \n            _this;\n        }\n        return _inherits(Main, _Component), _createClass(Main, [ {\n            key: \"getSnapshotBeforeUpdate\",\n            value: function() {\n                return this.content && \"function\" == typeof this.content.beforeUpdate ? this.content.beforeUpdate() : null;\n            }\n        }, {\n            key: \"componentDidUpdate\",\n            value: function(prevProps, prevState, snapshot) {\n                this.content && \"function\" == typeof this.content.didUpdate && this.content.didUpdate(prevProps, prevState, snapshot);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this, _props = this.props, classes = _props.classes, active = _props.active, content = _props.content, shouldUpdate = _props.shouldUpdate, children = null;\n                switch (active) {\n                  case _common.MENU.get(\"home\").id:\n                  case _common.MENU.get(\"chain\").id:\n                  case _common.MENU.get(\"txpool\").id:\n                  case _common.MENU.get(\"network\").id:\n                  case _common.MENU.get(\"system\").id:\n                    children = _react2.default.createElement(\"div\", null, \"Work in progress.\");\n                    break;\n\n                  case _common.MENU.get(\"logs\").id:\n                    children = _react2.default.createElement(_Logs2.default, {\n                        ref: function(_ref) {\n                            _this2.content = _ref;\n                        },\n                        container: this.container,\n                        send: this.props.send,\n                        content: this.props.content,\n                        shouldUpdate: shouldUpdate\n                    });\n                }\n                return _react2.default.createElement(\"div\", {\n                    style: styles.wrapper\n                }, _react2.default.createElement(\"div\", {\n                    className: classes.content,\n                    style: styles.content,\n                    ref: function(_ref2) {\n                        _this2.container = _ref2;\n                    },\n                    onScroll: this.onScroll\n                }, children), _react2.default.createElement(_Footer2.default, {\n                    general: content.general,\n                    system: content.system,\n                    shouldUpdate: shouldUpdate\n                }));\n            }\n        } ]), Main;\n    }(_react.Component);\n    exports.default = (0, _withStyles2.default)(themeStyles)(Main);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function escapeHtml(string) {\n        var str = \"\" + string, match = matchHtmlRegExp.exec(str);\n        if (!match) return str;\n        var escape, html = \"\", index = 0, lastIndex = 0;\n        for (index = match.index; index < str.length; index++) {\n            switch (str.charCodeAt(index)) {\n              case 34:\n                escape = \"&quot;\";\n                break;\n\n              case 38:\n                escape = \"&amp;\";\n                break;\n\n              case 39:\n                escape = \"&#39;\";\n                break;\n\n              case 60:\n                escape = \"&lt;\";\n                break;\n\n              case 62:\n                escape = \"&gt;\";\n                break;\n\n              default:\n                continue;\n            }\n            lastIndex !== index && (html += str.substring(lastIndex, index)), lastIndex = index + 1, \n            html += escape;\n        }\n        return lastIndex !== index ? html + str.substring(lastIndex, index) : html;\n    }\n    var matchHtmlRegExp = /[\"'&<>]/;\n    module.exports = escapeHtml;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _Typography = __webpack_require__(113), _Typography2 = _interopRequireDefault(_Typography), _Grid = __webpack_require__(262), _Grid2 = _interopRequireDefault(_Grid), _recharts = __webpack_require__(571), _ChartRow = __webpack_require__(947), _ChartRow2 = _interopRequireDefault(_ChartRow), _CustomTooltip = __webpack_require__(948), _CustomTooltip2 = _interopRequireDefault(_CustomTooltip), _common = __webpack_require__(81), TOP = \"Top\", BOTTOM = \"Bottom\", styles = {\n        footer: {\n            maxWidth: \"100%\",\n            flexWrap: \"nowrap\",\n            margin: 0\n        },\n        chartRowWrapper: {\n            height: \"100%\",\n            padding: 0\n        },\n        doubleChartWrapper: {\n            height: \"100%\",\n            width: \"99%\"\n        }\n    }, themeStyles = function(theme) {\n        return {\n            footer: {\n                backgroundColor: theme.palette.grey[900],\n                color: theme.palette.getContrastText(theme.palette.grey[900]),\n                zIndex: theme.zIndex.appBar,\n                height: 10 * theme.spacing.unit\n            }\n        };\n    }, Footer = function(_Component) {\n        function Footer() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, Footer);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = Footer.__proto__ || Object.getPrototypeOf(Footer)).call.apply(_ref, [ this ].concat(args))), \n            _this.halfHeightChart = function(chartProps, tooltip, areaProps) {\n                return _react2.default.createElement(_recharts.ResponsiveContainer, {\n                    width: \"100%\",\n                    height: \"50%\"\n                }, _react2.default.createElement(_recharts.AreaChart, chartProps, !tooltip || _react2.default.createElement(_recharts.Tooltip, {\n                    cursor: !1,\n                    content: _react2.default.createElement(_CustomTooltip2.default, {\n                        tooltip: tooltip\n                    })\n                }), _react2.default.createElement(_recharts.Area, _extends({\n                    isAnimationActive: !1,\n                    type: \"monotone\"\n                }, areaProps))));\n            }, _this.doubleChart = function(syncId, chartKey, topChart, bottomChart) {\n                if (!Array.isArray(topChart.data) || !Array.isArray(bottomChart.data)) return null;\n                var topDefault = topChart.default || 0, bottomDefault = bottomChart.default || 0, topKey = \"\" + chartKey + TOP, bottomKey = \"\" + chartKey + BOTTOM;\n                return _react2.default.createElement(\"div\", {\n                    style: styles.doubleChartWrapper\n                }, _this.halfHeightChart({\n                    syncId: syncId,\n                    data: topChart.data.map(function(_ref2) {\n                        var value = _ref2.value;\n                        return _defineProperty({}, topKey, value || topDefault);\n                    }),\n                    margin: {\n                        top: 5,\n                        right: 5,\n                        bottom: 0,\n                        left: 5\n                    }\n                }, topChart.tooltip, {\n                    dataKey: topKey,\n                    stroke: \"#8884d8\",\n                    fill: \"#8884d8\"\n                }), _this.halfHeightChart({\n                    syncId: syncId,\n                    data: bottomChart.data.map(function(_ref4) {\n                        var value = _ref4.value;\n                        return _defineProperty({}, bottomKey, -value || -bottomDefault);\n                    }),\n                    margin: {\n                        top: 0,\n                        right: 5,\n                        bottom: 5,\n                        left: 5\n                    }\n                }, bottomChart.tooltip, {\n                    dataKey: bottomKey,\n                    stroke: \"#82ca9d\",\n                    fill: \"#82ca9d\"\n                }));\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Footer, _Component), _createClass(Footer, [ {\n            key: \"shouldComponentUpdate\",\n            value: function(nextProps) {\n                return void 0 !== nextProps.shouldUpdate.general || void 0 !== nextProps.shouldUpdate.system;\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, general = _props.general, system = _props.system;\n                return _react2.default.createElement(_Grid2.default, {\n                    container: !0,\n                    className: this.props.classes.footer,\n                    direction: \"row\",\n                    alignItems: \"center\",\n                    style: styles.footer\n                }, _react2.default.createElement(_Grid2.default, {\n                    item: !0,\n                    xs: !0,\n                    style: styles.chartRowWrapper\n                }, _react2.default.createElement(_ChartRow2.default, null, this.doubleChart(\"footerSyncId\", \"cpu\", {\n                    data: system.processCPU,\n                    tooltip: (0, _CustomTooltip.percentPlotter)(\"Process load\")\n                }, {\n                    data: system.systemCPU,\n                    tooltip: (0, _CustomTooltip.percentPlotter)(\"System load\", (0, _CustomTooltip.multiplier)(-1))\n                }), this.doubleChart(\"footerSyncId\", \"memory\", {\n                    data: system.activeMemory,\n                    tooltip: (0, _CustomTooltip.bytePlotter)(\"Active memory\")\n                }, {\n                    data: system.virtualMemory,\n                    tooltip: (0, _CustomTooltip.bytePlotter)(\"Virtual memory\", (0, _CustomTooltip.multiplier)(-1))\n                }), this.doubleChart(\"footerSyncId\", \"disk\", {\n                    data: system.diskRead,\n                    tooltip: (0, _CustomTooltip.bytePerSecPlotter)(\"Disk read\")\n                }, {\n                    data: system.diskWrite,\n                    tooltip: (0, _CustomTooltip.bytePerSecPlotter)(\"Disk write\", (0, _CustomTooltip.multiplier)(-1))\n                }), this.doubleChart(\"footerSyncId\", \"traffic\", {\n                    data: system.networkIngress,\n                    tooltip: (0, _CustomTooltip.bytePerSecPlotter)(\"Download\")\n                }, {\n                    data: system.networkEgress,\n                    tooltip: (0, _CustomTooltip.bytePerSecPlotter)(\"Upload\", (0, _CustomTooltip.multiplier)(-1))\n                }))), _react2.default.createElement(_Grid2.default, {\n                    item: !0\n                }, _react2.default.createElement(_Typography2.default, {\n                    type: \"caption\",\n                    color: \"inherit\"\n                }, _react2.default.createElement(\"span\", {\n                    style: _common.styles.light\n                }, \"Geth\"), \" \", general.version), general.commit && _react2.default.createElement(_Typography2.default, {\n                    type: \"caption\",\n                    color: \"inherit\"\n                }, _react2.default.createElement(\"span\", {\n                    style: _common.styles.light\n                }, \"Commit \"), _react2.default.createElement(\"a\", {\n                    href: \"https://github.com/sero-cash/go-sero/commit/\" + general.commit,\n                    target: \"_blank\",\n                    style: {\n                        color: \"inherit\",\n                        textDecoration: \"none\"\n                    }\n                }, general.commit.substring(0, 8)))));\n            }\n        } ]), Footer;\n    }(_react.Component);\n    exports.default = (0, _withStyles2.default)(themeStyles)(Footer);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function generateGrid(globalStyles, theme, breakpoint) {\n            var styles = (0, _defineProperty3.default)({}, \"grid-\" + breakpoint, {\n                flexBasis: 0,\n                flexGrow: 1,\n                maxWidth: \"100%\"\n            });\n            GRID_SIZES.forEach(function(size) {\n                if (\"boolean\" != typeof size) {\n                    var width = Math.round(size / 12 * 1e7) / 1e5 + \"%\";\n                    styles[\"grid-\" + breakpoint + \"-\" + size] = {\n                        flexBasis: width,\n                        maxWidth: width\n                    };\n                }\n            }), \"xs\" === breakpoint ? (0, _extends3.default)(globalStyles, styles) : globalStyles[theme.breakpoints.up(breakpoint)] = styles;\n        }\n        function generateGutter(theme, breakpoint) {\n            var styles = {};\n            return GUTTERS.forEach(function(spacing, index) {\n                0 !== index && (styles[\"spacing-\" + breakpoint + \"-\" + spacing] = {\n                    margin: -spacing / 2,\n                    width: \"calc(100% + \" + spacing + \"px)\",\n                    \"& > $typeItem\": {\n                        padding: spacing / 2\n                    }\n                });\n            }), styles;\n        }\n        function Grid(props) {\n            var _classNames, alignContent = props.alignContent, alignItems = props.alignItems, classes = props.classes, classNameProp = props.className, Component = props.component, container = props.container, direction = props.direction, hidden = props.hidden, item = props.item, justify = props.justify, lg = props.lg, md = props.md, zeroMinWidth = props.zeroMinWidth, sm = props.sm, spacing = props.spacing, wrap = props.wrap, xl = props.xl, xs = props.xs, other = (0, \n            _objectWithoutProperties3.default)(props, [ \"alignContent\", \"alignItems\", \"classes\", \"className\", \"component\", \"container\", \"direction\", \"hidden\", \"item\", \"justify\", \"lg\", \"md\", \"zeroMinWidth\", \"sm\", \"spacing\", \"wrap\", \"xl\", \"xs\" ]), className = (0, \n            _classnames2.default)((_classNames = {}, (0, _defineProperty3.default)(_classNames, classes.typeContainer, container), \n            (0, _defineProperty3.default)(_classNames, classes.typeItem, item), (0, _defineProperty3.default)(_classNames, classes.zeroMinWidth, zeroMinWidth), \n            (0, _defineProperty3.default)(_classNames, classes[\"spacing-xs-\" + String(spacing)], container && 0 !== spacing), \n            (0, _defineProperty3.default)(_classNames, classes[\"direction-xs-\" + String(direction)], direction !== Grid.defaultProps.direction), \n            (0, _defineProperty3.default)(_classNames, classes[\"wrap-xs-\" + String(wrap)], wrap !== Grid.defaultProps.wrap), \n            (0, _defineProperty3.default)(_classNames, classes[\"align-items-xs-\" + String(alignItems)], alignItems !== Grid.defaultProps.alignItems), \n            (0, _defineProperty3.default)(_classNames, classes[\"align-content-xs-\" + String(alignContent)], alignContent !== Grid.defaultProps.alignContent), \n            (0, _defineProperty3.default)(_classNames, classes[\"justify-xs-\" + String(justify)], justify !== Grid.defaultProps.justify), \n            (0, _defineProperty3.default)(_classNames, classes[\"grid-xs\"], !0 === xs), (0, _defineProperty3.default)(_classNames, classes[\"grid-xs-\" + String(xs)], xs && !0 !== xs), \n            (0, _defineProperty3.default)(_classNames, classes[\"grid-sm\"], !0 === sm), (0, _defineProperty3.default)(_classNames, classes[\"grid-sm-\" + String(sm)], sm && !0 !== sm), \n            (0, _defineProperty3.default)(_classNames, classes[\"grid-md\"], !0 === md), (0, _defineProperty3.default)(_classNames, classes[\"grid-md-\" + String(md)], md && !0 !== md), \n            (0, _defineProperty3.default)(_classNames, classes[\"grid-lg\"], !0 === lg), (0, _defineProperty3.default)(_classNames, classes[\"grid-lg-\" + String(lg)], lg && !0 !== lg), \n            (0, _defineProperty3.default)(_classNames, classes[\"grid-xl\"], !0 === xl), (0, _defineProperty3.default)(_classNames, classes[\"grid-xl-\" + String(xl)], xl && !0 !== xl), \n            _classNames), classNameProp), gridProps = (0, _extends3.default)({\n                className: className\n            }, other);\n            return hidden ? _react2.default.createElement(_Hidden2.default, hidden, _react2.default.createElement(Component, gridProps)) : _react2.default.createElement(Component, gridProps);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.styles = void 0;\n        var _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _classnames = __webpack_require__(3), _classnames2 = _interopRequireDefault(_classnames), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), _createBreakpoints = __webpack_require__(78), _requirePropFactory = __webpack_require__(553), _requirePropFactory2 = _interopRequireDefault(_requirePropFactory), _Hidden = __webpack_require__(554), _Hidden2 = _interopRequireDefault(_Hidden), GUTTERS = [ 0, 8, 16, 24, 40 ], GRID_SIZES = [ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ], styles = exports.styles = function(theme) {\n            return (0, _extends3.default)({\n                typeContainer: {\n                    boxSizing: \"border-box\",\n                    display: \"flex\",\n                    flexWrap: \"wrap\",\n                    width: \"100%\"\n                },\n                typeItem: {\n                    boxSizing: \"border-box\",\n                    flex: \"0 0 auto\",\n                    margin: \"0\"\n                },\n                zeroMinWidth: {\n                    minWidth: 0\n                },\n                \"direction-xs-column\": {\n                    flexDirection: \"column\"\n                },\n                \"direction-xs-column-reverse\": {\n                    flexDirection: \"column-reverse\"\n                },\n                \"direction-xs-row-reverse\": {\n                    flexDirection: \"row-reverse\"\n                },\n                \"wrap-xs-nowrap\": {\n                    flexWrap: \"nowrap\"\n                },\n                \"wrap-xs-wrap-reverse\": {\n                    flexWrap: \"wrap-reverse\"\n                },\n                \"align-items-xs-center\": {\n                    alignItems: \"center\"\n                },\n                \"align-items-xs-flex-start\": {\n                    alignItems: \"flex-start\"\n                },\n                \"align-items-xs-flex-end\": {\n                    alignItems: \"flex-end\"\n                },\n                \"align-items-xs-baseline\": {\n                    alignItems: \"baseline\"\n                },\n                \"align-content-xs-center\": {\n                    alignContent: \"center\"\n                },\n                \"align-content-xs-flex-start\": {\n                    alignContent: \"flex-start\"\n                },\n                \"align-content-xs-flex-end\": {\n                    alignContent: \"flex-end\"\n                },\n                \"align-content-xs-space-between\": {\n                    alignContent: \"space-between\"\n                },\n                \"align-content-xs-space-around\": {\n                    alignContent: \"space-around\"\n                },\n                \"justify-xs-center\": {\n                    justifyContent: \"center\"\n                },\n                \"justify-xs-flex-end\": {\n                    justifyContent: \"flex-end\"\n                },\n                \"justify-xs-space-between\": {\n                    justifyContent: \"space-between\"\n                },\n                \"justify-xs-space-around\": {\n                    justifyContent: \"space-around\"\n                }\n            }, generateGutter(theme, \"xs\"), _createBreakpoints.keys.reduce(function(accumulator, key) {\n                return generateGrid(accumulator, theme, key), accumulator;\n            }, {}));\n        };\n        Grid.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            alignContent: _propTypes2.default.oneOf([ \"stretch\", \"center\", \"flex-start\", \"flex-end\", \"space-between\", \"space-around\" ]),\n            alignItems: _propTypes2.default.oneOf([ \"flex-start\", \"center\", \"flex-end\", \"stretch\", \"baseline\" ]),\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            component: _propTypes2.default.oneOfType([ _propTypes2.default.string, _propTypes2.default.func ]),\n            container: _propTypes2.default.bool,\n            direction: _propTypes2.default.oneOf([ \"row\", \"row-reverse\", \"column\", \"column-reverse\" ]),\n            hidden: _propTypes2.default.object,\n            item: _propTypes2.default.bool,\n            justify: _propTypes2.default.oneOf([ \"flex-start\", \"center\", \"flex-end\", \"space-between\", \"space-around\" ]),\n            lg: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),\n            md: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),\n            sm: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),\n            spacing: _propTypes2.default.oneOf(GUTTERS),\n            wrap: _propTypes2.default.oneOf([ \"nowrap\", \"wrap\", \"wrap-reverse\" ]),\n            xl: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),\n            xs: _propTypes2.default.oneOf([ !0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]),\n            zeroMinWidth: _propTypes2.default.bool\n        } : {}, Grid.defaultProps = {\n            alignContent: \"stretch\",\n            alignItems: \"stretch\",\n            component: \"div\",\n            container: !1,\n            direction: \"row\",\n            item: !1,\n            justify: \"flex-start\",\n            zeroMinWidth: !1,\n            spacing: 16,\n            wrap: \"wrap\"\n        };\n        var GridWrapper = Grid;\n        if (\"production\" !== process.env.NODE_ENV) {\n            GridWrapper = function(props) {\n                return _react2.default.createElement(Grid, props);\n            };\n            var requireProp = (0, _requirePropFactory2.default)(\"Grid\");\n            GridWrapper.propTypes = {\n                alignContent: requireProp(\"container\"),\n                alignItems: requireProp(\"container\"),\n                direction: requireProp(\"container\"),\n                justify: requireProp(\"container\"),\n                lg: requireProp(\"item\"),\n                md: requireProp(\"item\"),\n                sm: requireProp(\"item\"),\n                spacing: requireProp(\"container\"),\n                wrap: requireProp(\"container\"),\n                xs: requireProp(\"item\"),\n                zeroMinWidth: requireProp(\"zeroMinWidth\")\n            };\n        }\n        exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiGrid\"\n        })(GridWrapper);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var requirePropFactory = function(componentNameInError) {\n        return function(requiredProp) {\n            return function(props, propName, componentName, location, propFullName) {\n                var propFullNameSafe = propFullName || propName;\n                return void 0 === props[propName] || props[requiredProp] ? null : new Error(\"The property `)) + (\"`\" + (`\" + propFullNameSafe + \"` + \"`\")))) + (((` of ` + (\"`\" + `\" + componentNameInError + \"`)) + (\"`\" + (` must be used on ` + \"`\"))) + ((`\" + requiredProp + \"` + (\"`\" + `.\");\n            };\n        };\n    };\n    exports.default = requirePropFactory;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _Hidden = __webpack_require__(555);\n    Object.defineProperty(exports, \"default\", {\n        enumerable: !0,\n        get: function() {\n            return _interopRequireDefault(_Hidden).default;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function Hidden(props) {\n            var implementation = props.implementation, other = (0, _objectWithoutProperties3.default)(props, [ \"implementation\" ]);\n            return \"js\" === implementation ? _react2.default.createElement(_HiddenJs2.default, other) : _react2.default.createElement(_HiddenCss2.default, other);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _HiddenJs = __webpack_require__(556), _HiddenJs2 = _interopRequireDefault(_HiddenJs), _HiddenCss = __webpack_require__(570), _HiddenCss2 = _interopRequireDefault(_HiddenCss);\n        Hidden.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            className: _propTypes2.default.string,\n            implementation: _propTypes2.default.oneOf([ \"js\", \"css\" ]),\n            initialWidth: _propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ]),\n            lgDown: _propTypes2.default.bool,\n            lgUp: _propTypes2.default.bool,\n            mdDown: _propTypes2.default.bool,\n            mdUp: _propTypes2.default.bool,\n            only: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ]), _propTypes2.default.arrayOf(_propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ])) ]),\n            smDown: _propTypes2.default.bool,\n            smUp: _propTypes2.default.bool,\n            xlDown: _propTypes2.default.bool,\n            xlUp: _propTypes2.default.bool,\n            xsDown: _propTypes2.default.bool,\n            xsUp: _propTypes2.default.bool\n        } : {}, Hidden.defaultProps = {\n            implementation: \"js\",\n            lgDown: !1,\n            lgUp: !1,\n            mdDown: !1,\n            mdUp: !1,\n            smDown: !1,\n            smUp: !1,\n            xlDown: !1,\n            xlUp: !1,\n            xsDown: !1,\n            xsUp: !1\n        }, exports.default = Hidden;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function HiddenJs(props) {\n        var children = props.children, only = props.only, width = props.width, visible = !0;\n        if (only) if (Array.isArray(only)) for (var i = 0; i < only.length; i += 1) {\n            var breakpoint = only[i];\n            if (width === breakpoint) {\n                visible = !1;\n                break;\n            }\n        } else only && width === only && (visible = !1);\n        if (visible) for (var _i = 0; _i < _createBreakpoints.keys.length; _i += 1) {\n            var _breakpoint = _createBreakpoints.keys[_i], breakpointUp = props[_breakpoint + \"Up\"], breakpointDown = props[_breakpoint + \"Down\"];\n            if (breakpointUp && (0, _withWidth.isWidthUp)(_breakpoint, width) || breakpointDown && (0, \n            _withWidth.isWidthDown)(_breakpoint, width)) {\n                visible = !1;\n                break;\n            }\n        }\n        return visible ? children : null;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _createBreakpoints = __webpack_require__(78), _withWidth = __webpack_require__(557), _withWidth2 = _interopRequireDefault(_withWidth), _exactProp = __webpack_require__(236), _exactProp2 = _interopRequireDefault(_exactProp);\n    HiddenJs.propTypes = {\n        children: _propTypes2.default.node,\n        className: _propTypes2.default.string,\n        implementation: _propTypes2.default.oneOf([ \"js\", \"css\" ]),\n        initialWidth: _propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ]),\n        lgDown: _propTypes2.default.bool,\n        lgUp: _propTypes2.default.bool,\n        mdDown: _propTypes2.default.bool,\n        mdUp: _propTypes2.default.bool,\n        only: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ]), _propTypes2.default.arrayOf(_propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ])) ]),\n        smDown: _propTypes2.default.bool,\n        smUp: _propTypes2.default.bool,\n        width: _propTypes2.default.string.isRequired,\n        xlDown: _propTypes2.default.bool,\n        xlUp: _propTypes2.default.bool,\n        xsDown: _propTypes2.default.bool,\n        xsUp: _propTypes2.default.bool\n    }, HiddenJs.propTypes = (0, _exactProp2.default)(HiddenJs.propTypes, \"HiddenJs\"), \n    exports.default = (0, _withWidth2.default)()(HiddenJs);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        }), exports.isWidthDown = exports.isWidthUp = void 0;\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _reactEventListener = __webpack_require__(558), _reactEventListener2 = _interopRequireDefault(_reactEventListener), _debounce = __webpack_require__(560), _debounce2 = _interopRequireDefault(_debounce), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _hoistNonReactStatics = __webpack_require__(162), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _withTheme = __webpack_require__(569), _withTheme2 = _interopRequireDefault(_withTheme), _createBreakpoints = __webpack_require__(78), withWidth = (exports.isWidthUp = function(breakpoint, width) {\n            return arguments.length > 2 && void 0 !== arguments[2] && !arguments[2] ? _createBreakpoints.keys.indexOf(breakpoint) < _createBreakpoints.keys.indexOf(width) : _createBreakpoints.keys.indexOf(breakpoint) <= _createBreakpoints.keys.indexOf(width);\n        }, exports.isWidthDown = function(breakpoint, width) {\n            return arguments.length > 2 && void 0 !== arguments[2] && !arguments[2] ? _createBreakpoints.keys.indexOf(width) < _createBreakpoints.keys.indexOf(breakpoint) : _createBreakpoints.keys.indexOf(width) <= _createBreakpoints.keys.indexOf(breakpoint);\n        }, function() {\n            var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {};\n            return function(Component) {\n                var _options$resizeInterv = options.resizeInterval, resizeInterval = void 0 === _options$resizeInterv ? 166 : _options$resizeInterv, _options$withTheme = options.withTheme, withThemeOption = void 0 !== _options$withTheme && _options$withTheme, WithWidth = function(_React$Component) {\n                    function WithWidth() {\n                        var _ref, _temp, _this, _ret;\n                        (0, _classCallCheck3.default)(this, WithWidth);\n                        for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n                        return _temp = _this = (0, _possibleConstructorReturn3.default)(this, (_ref = WithWidth.__proto__ || (0, \n                        _getPrototypeOf2.default)(WithWidth)).call.apply(_ref, [ this ].concat(args))), \n                        _this.state = {\n                            width: void 0\n                        }, _this.handleResize = (0, _debounce2.default)(function() {\n                            _this.updateWidth(window.innerWidth);\n                        }, resizeInterval), _ret = _temp, (0, _possibleConstructorReturn3.default)(_this, _ret);\n                    }\n                    return (0, _inherits3.default)(WithWidth, _React$Component), (0, _createClass3.default)(WithWidth, [ {\n                        key: \"componentDidMount\",\n                        value: function() {\n                            this.updateWidth(window.innerWidth);\n                        }\n                    }, {\n                        key: \"componentWillUnmount\",\n                        value: function() {\n                            this.handleResize.cancel();\n                        }\n                    }, {\n                        key: \"updateWidth\",\n                        value: function(innerWidth) {\n                            for (var breakpoints = this.props.theme.breakpoints, width = null, index = 1; null === width && index < _createBreakpoints.keys.length; ) {\n                                var currentWidth = _createBreakpoints.keys[index];\n                                if (innerWidth < breakpoints.values[currentWidth]) {\n                                    width = _createBreakpoints.keys[index - 1];\n                                    break;\n                                }\n                                index += 1;\n                            }\n                            (width = width || \"xl\") !== this.state.width && this.setState({\n                                width: width\n                            });\n                        }\n                    }, {\n                        key: \"render\",\n                        value: function() {\n                            var _props = this.props, initialWidth = _props.initialWidth, theme = _props.theme, width = _props.width, other = (0, \n                            _objectWithoutProperties3.default)(_props, [ \"initialWidth\", \"theme\", \"width\" ]), props = (0, \n                            _extends3.default)({\n                                width: width || this.state.width || initialWidth\n                            }, other), more = {};\n                            return withThemeOption && (more.theme = theme), void 0 === props.width ? null : _react2.default.createElement(_reactEventListener2.default, {\n                                target: \"window\",\n                                onResize: this.handleResize\n                            }, _react2.default.createElement(Component, (0, _extends3.default)({}, more, props)));\n                        }\n                    } ]), WithWidth;\n                }(_react2.default.Component);\n                return WithWidth.propTypes = \"production\" !== process.env.NODE_ENV ? {\n                    initialWidth: _propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ]),\n                    theme: _propTypes2.default.object.isRequired,\n                    width: _propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ])\n                } : {}, \"production\" !== process.env.NODE_ENV && (WithWidth.displayName = (0, _wrapDisplayName2.default)(Component, \"WithWidth\")), \n                (0, _hoistNonReactStatics2.default)(WithWidth, Component), (0, _withTheme2.default)()(WithWidth);\n            };\n        });\n        exports.default = withWidth;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function mergeDefaultEventOptions(options) {\n            return (0, _assign2.default)({}, defaultEventOptions, options);\n        }\n        function getEventListenerArgs(eventName, callback, options) {\n            var args = [ eventName, callback ];\n            return args.push(_supports.passiveOption ? options : options.capture), args;\n        }\n        function on(target, eventName, callback, options) {\n            target.addEventListener.apply(target, getEventListenerArgs(eventName, callback, options));\n        }\n        function off(target, eventName, callback, options) {\n            target.removeEventListener.apply(target, getEventListenerArgs(eventName, callback, options));\n        }\n        function forEachListener(props, iteratee) {\n            var eventProps = (props.children, props.target, (0, _objectWithoutProperties3.default)(props, [ \"children\", \"target\" ]));\n            (0, _keys2.default)(eventProps).forEach(function(name) {\n                if (\"on\" === name.substring(0, 2)) {\n                    var prop = eventProps[name], type = void 0 === prop ? \"undefined\" : (0, _typeof3.default)(prop), isObject = \"object\" === type, isFunction = \"function\" === type;\n                    if (isObject || isFunction) {\n                        var capture = \"capture\" === name.substr(-7).toLowerCase(), eventName = name.substring(2).toLowerCase();\n                        eventName = capture ? eventName.substring(0, eventName.length - 7) : eventName, \n                        isObject ? iteratee(eventName, prop.handler, prop.options) : iteratee(eventName, prop, mergeDefaultEventOptions({\n                            capture: capture\n                        }));\n                    }\n                }\n            });\n        }\n        function withOptions(handler, options) {\n            return \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(options, \"react-event-listener: should be specified options in withOptions.\"), \n            {\n                handler: handler,\n                options: mergeDefaultEventOptions(options)\n            };\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2), _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _assign = __webpack_require__(222), _assign2 = _interopRequireDefault(_assign);\n        exports.withOptions = withOptions;\n        var _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _shallowEqual = __webpack_require__(100), _shallowEqual2 = _interopRequireDefault(_shallowEqual), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _supports = __webpack_require__(559), defaultEventOptions = {\n            capture: !1,\n            passive: !1\n        }, EventListener = function(_React$Component) {\n            function EventListener() {\n                return (0, _classCallCheck3.default)(this, EventListener), (0, _possibleConstructorReturn3.default)(this, (EventListener.__proto__ || (0, \n                _getPrototypeOf2.default)(EventListener)).apply(this, arguments));\n            }\n            return (0, _inherits3.default)(EventListener, _React$Component), (0, _createClass3.default)(EventListener, [ {\n                key: \"componentDidMount\",\n                value: function() {\n                    this.addListeners();\n                }\n            }, {\n                key: \"shouldComponentUpdate\",\n                value: function(nextProps) {\n                    return !(0, _shallowEqual2.default)(this.props, nextProps);\n                }\n            }, {\n                key: \"componentWillUpdate\",\n                value: function() {\n                    this.removeListeners();\n                }\n            }, {\n                key: \"componentDidUpdate\",\n                value: function() {\n                    this.addListeners();\n                }\n            }, {\n                key: \"componentWillUnmount\",\n                value: function() {\n                    this.removeListeners();\n                }\n            }, {\n                key: \"addListeners\",\n                value: function() {\n                    this.applyListeners(on);\n                }\n            }, {\n                key: \"removeListeners\",\n                value: function() {\n                    this.applyListeners(off);\n                }\n            }, {\n                key: \"applyListeners\",\n                value: function(onOrOff) {\n                    var target = this.props.target;\n                    if (target) {\n                        var element = target;\n                        \"string\" == typeof target && (element = window[target]), forEachListener(this.props, onOrOff.bind(null, element));\n                    }\n                }\n            }, {\n                key: \"render\",\n                value: function() {\n                    return this.props.children || null;\n                }\n            } ]), EventListener;\n        }(_react2.default.Component);\n        EventListener.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            target: _propTypes2.default.oneOfType([ _propTypes2.default.object, _propTypes2.default.string ]).isRequired\n        } : {}, exports.default = EventListener;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function defineProperty(object, property, attr) {\n        return (0, _defineProperty2.default)(object, property, attr);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.passiveOption = void 0;\n    var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_defineProperty);\n    exports.passiveOption = function() {\n        var cache = null;\n        return function() {\n            if (null !== cache) return cache;\n            var supportsPassiveOption = !1;\n            try {\n                window.addEventListener(\"test\", null, defineProperty({}, \"passive\", {\n                    get: function() {\n                        supportsPassiveOption = !0;\n                    }\n                }));\n            } catch (err) {}\n            return cache = supportsPassiveOption, supportsPassiveOption;\n        }();\n    }();\n    exports.default = {};\n}, function(module, exports, __webpack_require__) {\n    function debounce(func, wait, options) {\n        function invokeFunc(time) {\n            var args = lastArgs, thisArg = lastThis;\n            return lastArgs = lastThis = void 0, lastInvokeTime = time, result = func.apply(thisArg, args);\n        }\n        function leadingEdge(time) {\n            return lastInvokeTime = time, timerId = setTimeout(timerExpired, wait), leading ? invokeFunc(time) : result;\n        }\n        function remainingWait(time) {\n            var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;\n            return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;\n        }\n        function shouldInvoke(time) {\n            var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;\n            return void 0 === lastCallTime || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;\n        }\n        function timerExpired() {\n            var time = now();\n            if (shouldInvoke(time)) return trailingEdge(time);\n            timerId = setTimeout(timerExpired, remainingWait(time));\n        }\n        function trailingEdge(time) {\n            return timerId = void 0, trailing && lastArgs ? invokeFunc(time) : (lastArgs = lastThis = void 0, \n            result);\n        }\n        function cancel() {\n            void 0 !== timerId && clearTimeout(timerId), lastInvokeTime = 0, lastArgs = lastCallTime = lastThis = timerId = void 0;\n        }\n        function flush() {\n            return void 0 === timerId ? result : trailingEdge(now());\n        }\n        function debounced() {\n            var time = now(), isInvoking = shouldInvoke(time);\n            if (lastArgs = arguments, lastThis = this, lastCallTime = time, isInvoking) {\n                if (void 0 === timerId) return leadingEdge(lastCallTime);\n                if (maxing) return timerId = setTimeout(timerExpired, wait), invokeFunc(lastCallTime);\n            }\n            return void 0 === timerId && (timerId = setTimeout(timerExpired, wait)), result;\n        }\n        var lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = !1, maxing = !1, trailing = !0;\n        if (\"function\" != typeof func) throw new TypeError(FUNC_ERROR_TEXT);\n        return wait = toNumber(wait) || 0, isObject(options) && (leading = !!options.leading, \n        maxing = \"maxWait\" in options, maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait, \n        trailing = \"trailing\" in options ? !!options.trailing : trailing), debounced.cancel = cancel, \n        debounced.flush = flush, debounced;\n    }\n    var isObject = __webpack_require__(263), now = __webpack_require__(561), toNumber = __webpack_require__(563), FUNC_ERROR_TEXT = \"Expected a function\", nativeMax = Math.max, nativeMin = Math.min;\n    module.exports = debounce;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(264), now = function() {\n        return root.Date.now();\n    };\n    module.exports = now;\n}, function(module, exports, __webpack_require__) {\n    (function(global) {\n        var freeGlobal = \"object\" == typeof global && global && global.Object === Object && global;\n        module.exports = freeGlobal;\n    }).call(exports, __webpack_require__(40));\n}, function(module, exports, __webpack_require__) {\n    function toNumber(value) {\n        if (\"number\" == typeof value) return value;\n        if (isSymbol(value)) return NAN;\n        if (isObject(value)) {\n            var other = \"function\" == typeof value.valueOf ? value.valueOf() : value;\n            value = isObject(other) ? other + \"\" : other;\n        }\n        if (\"string\" != typeof value) return 0 === value ? value : +value;\n        value = value.replace(reTrim, \"\");\n        var isBinary = reIsBinary.test(value);\n        return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;\n    }\n    var isObject = __webpack_require__(263), isSymbol = __webpack_require__(564), NAN = NaN, reTrim = /^\\s+|\\s+$/g, reIsBadHex = /^[-+]0x[0-9a-f]+$/i, reIsBinary = /^0b[01]+$/i, reIsOctal = /^0o[0-7]+$/i, freeParseInt = parseInt;\n    module.exports = toNumber;\n}, function(module, exports, __webpack_require__) {\n    function isSymbol(value) {\n        return \"symbol\" == typeof value || isObjectLike(value) && baseGetTag(value) == symbolTag;\n    }\n    var baseGetTag = __webpack_require__(565), isObjectLike = __webpack_require__(568), symbolTag = \"[object Symbol]\";\n    module.exports = isSymbol;\n}, function(module, exports, __webpack_require__) {\n    function baseGetTag(value) {\n        return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value);\n    }\n    var Symbol = __webpack_require__(265), getRawTag = __webpack_require__(566), objectToString = __webpack_require__(567), nullTag = \"[object Null]\", undefinedTag = \"[object Undefined]\", symToStringTag = Symbol ? Symbol.toStringTag : void 0;\n    module.exports = baseGetTag;\n}, function(module, exports, __webpack_require__) {\n    function getRawTag(value) {\n        var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];\n        try {\n            value[symToStringTag] = void 0;\n            var unmasked = !0;\n        } catch (e) {}\n        var result = nativeObjectToString.call(value);\n        return unmasked && (isOwn ? value[symToStringTag] = tag : delete value[symToStringTag]), \n        result;\n    }\n    var Symbol = __webpack_require__(265), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty, nativeObjectToString = objectProto.toString, symToStringTag = Symbol ? Symbol.toStringTag : void 0;\n    module.exports = getRawTag;\n}, function(module, exports) {\n    function objectToString(value) {\n        return nativeObjectToString.call(value);\n    }\n    var objectProto = Object.prototype, nativeObjectToString = objectProto.toString;\n    module.exports = objectToString;\n}, function(module, exports) {\n    function isObjectLike(value) {\n        return null != value && \"object\" == typeof value;\n    }\n    module.exports = isObjectLike;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function getDefaultTheme() {\n            return defaultTheme || (defaultTheme = (0, _createMuiTheme2.default)());\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _hoistNonReactStatics = __webpack_require__(162), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _createMuiTheme = __webpack_require__(161), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _themeListener = __webpack_require__(160), _themeListener2 = _interopRequireDefault(_themeListener), defaultTheme = void 0, withTheme = function() {\n            return function(Component) {\n                var WithTheme = function(_React$Component) {\n                    function WithTheme(props, context) {\n                        (0, _classCallCheck3.default)(this, WithTheme);\n                        var _this = (0, _possibleConstructorReturn3.default)(this, (WithTheme.__proto__ || (0, \n                        _getPrototypeOf2.default)(WithTheme)).call(this, props, context));\n                        return _this.state = {}, _this.unsubscribeId = null, _this.state = {\n                            theme: _themeListener2.default.initial(context) || getDefaultTheme()\n                        }, _this;\n                    }\n                    return (0, _inherits3.default)(WithTheme, _React$Component), (0, _createClass3.default)(WithTheme, [ {\n                        key: \"componentDidMount\",\n                        value: function() {\n                            var _this2 = this;\n                            this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(theme) {\n                                _this2.setState({\n                                    theme: theme\n                                });\n                            });\n                        }\n                    }, {\n                        key: \"componentWillUnmount\",\n                        value: function() {\n                            null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId);\n                        }\n                    }, {\n                        key: \"render\",\n                        value: function() {\n                            return _react2.default.createElement(Component, (0, _extends3.default)({\n                                theme: this.state.theme\n                            }, this.props));\n                        }\n                    } ]), WithTheme;\n                }(_react2.default.Component);\n                return WithTheme.contextTypes = _themeListener2.default.contextTypes, \"production\" !== process.env.NODE_ENV && (WithTheme.displayName = (0, \n                _wrapDisplayName2.default)(Component, \"WithTheme\")), (0, _hoistNonReactStatics2.default)(WithTheme, Component), \n                \"production\" !== process.env.NODE_ENV && (WithTheme.Naked = Component), WithTheme;\n            };\n        };\n        exports.default = withTheme;\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    (function(process) {\n        function _interopRequireDefault(obj) {\n            return obj && obj.__esModule ? obj : {\n                default: obj\n            };\n        }\n        function HiddenCss(props) {\n            var children = props.children, classes = props.classes, className = props.className, only = (props.lgDown, \n            props.lgUp, props.mdDown, props.mdUp, props.only), other = (props.smDown, props.smUp, \n            props.xlDown, props.xlUp, props.xsDown, props.xsUp, (0, _objectWithoutProperties3.default)(props, [ \"children\", \"classes\", \"className\", \"lgDown\", \"lgUp\", \"mdDown\", \"mdUp\", \"only\", \"smDown\", \"smUp\", \"xlDown\", \"xlUp\", \"xsDown\", \"xsUp\" ]));\n            \"production\" !== process.env.NODE_ENV && (0, _warning2.default)(0 === (0, _keys2.default)(other).length || 1 === (0, \n            _keys2.default)(other).length && other.hasOwnProperty(\"ref\"), \"Material-UI: unsupported properties received \" + (0, \n            _keys2.default)(other).join(\", \") + \" by `)) + ((\"`\" + `<Hidden />`) + (\"`\" + `.\");\n            var classNames = [];\n            className && classNames.push(className);\n            for (var i = 0; i < _createBreakpoints.keys.length; i += 1) {\n                var breakpoint = _createBreakpoints.keys[i], breakpointUp = props[breakpoint + \"Up\"], breakpointDown = props[breakpoint + \"Down\"];\n                breakpointUp && classNames.push(classes[breakpoint + \"Up\"]), breakpointDown && classNames.push(classes[breakpoint + \"Down\"]);\n            }\n            if (only) {\n                (Array.isArray(only) ? only : [ only ]).forEach(function(breakpoint) {\n                    classNames.push(classes[\"only\" + (0, _helpers.capitalize)(breakpoint)]);\n                });\n            }\n            return _react2.default.createElement(\"div\", {\n                className: classNames.join(\" \")\n            }, children);\n        }\n        Object.defineProperty(exports, \"__esModule\", {\n            value: !0\n        });\n        var _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _defineProperty2 = __webpack_require__(12), _defineProperty3 = _interopRequireDefault(_defineProperty2), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _createBreakpoints = __webpack_require__(78), _helpers = __webpack_require__(56), _withStyles = __webpack_require__(10), _withStyles2 = _interopRequireDefault(_withStyles), styles = function(theme) {\n            var hidden = {\n                display: \"none\"\n            };\n            return _createBreakpoints.keys.reduce(function(acc, key) {\n                return acc[\"only\" + (0, _helpers.capitalize)(key)] = (0, _defineProperty3.default)({}, theme.breakpoints.only(key), hidden), \n                acc[key + \"Up\"] = (0, _defineProperty3.default)({}, theme.breakpoints.up(key), hidden), \n                acc[key + \"Down\"] = (0, _defineProperty3.default)({}, theme.breakpoints.down(key), hidden), \n                acc;\n            }, {});\n        };\n        HiddenCss.propTypes = \"production\" !== process.env.NODE_ENV ? {\n            children: _propTypes2.default.node,\n            classes: _propTypes2.default.object.isRequired,\n            className: _propTypes2.default.string,\n            implementation: _propTypes2.default.oneOf([ \"js\", \"css\" ]),\n            lgDown: _propTypes2.default.bool,\n            lgUp: _propTypes2.default.bool,\n            mdDown: _propTypes2.default.bool,\n            mdUp: _propTypes2.default.bool,\n            only: _propTypes2.default.oneOfType([ _propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ]), _propTypes2.default.arrayOf(_propTypes2.default.oneOf([ \"xs\", \"sm\", \"md\", \"lg\", \"xl\" ])) ]),\n            smDown: _propTypes2.default.bool,\n            smUp: _propTypes2.default.bool,\n            xlDown: _propTypes2.default.bool,\n            xlUp: _propTypes2.default.bool,\n            xsDown: _propTypes2.default.bool,\n            xsUp: _propTypes2.default.bool\n        } : {}, exports.default = (0, _withStyles2.default)(styles, {\n            name: \"MuiHiddenCss\"\n        })(HiddenCss);\n    }).call(exports, __webpack_require__(2));\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(__webpack_exports__, \"__esModule\", {\n        value: !0\n    });\n    var __WEBPACK_IMPORTED_MODULE_1__container_Surface__ = (__webpack_require__(572), \n    __webpack_require__(82));\n    __webpack_require__.d(__webpack_exports__, \"Surface\", function() {\n        return __WEBPACK_IMPORTED_MODULE_1__container_Surface__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_2__container_Layer__ = __webpack_require__(14);\n    __webpack_require__.d(__webpack_exports__, \"Layer\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__container_Layer__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_3__component_Legend__ = __webpack_require__(180);\n    __webpack_require__.d(__webpack_exports__, \"Legend\", function() {\n        return __WEBPACK_IMPORTED_MODULE_3__component_Legend__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_4__component_Tooltip__ = __webpack_require__(125);\n    __webpack_require__.d(__webpack_exports__, \"Tooltip\", function() {\n        return __WEBPACK_IMPORTED_MODULE_4__component_Tooltip__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_5__component_ResponsiveContainer__ = __webpack_require__(766);\n    __webpack_require__.d(__webpack_exports__, \"ResponsiveContainer\", function() {\n        return __WEBPACK_IMPORTED_MODULE_5__component_ResponsiveContainer__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_6__component_Cell__ = __webpack_require__(88);\n    __webpack_require__.d(__webpack_exports__, \"Cell\", function() {\n        return __WEBPACK_IMPORTED_MODULE_6__component_Cell__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_7__component_Text__ = __webpack_require__(61);\n    __webpack_require__.d(__webpack_exports__, \"Text\", function() {\n        return __WEBPACK_IMPORTED_MODULE_7__component_Text__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_8__component_Label__ = __webpack_require__(44);\n    __webpack_require__.d(__webpack_exports__, \"Label\", function() {\n        return __WEBPACK_IMPORTED_MODULE_8__component_Label__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_9__component_LabelList__ = __webpack_require__(47);\n    __webpack_require__.d(__webpack_exports__, \"LabelList\", function() {\n        return __WEBPACK_IMPORTED_MODULE_9__component_LabelList__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_10__shape_Sector__ = __webpack_require__(139);\n    __webpack_require__.d(__webpack_exports__, \"Sector\", function() {\n        return __WEBPACK_IMPORTED_MODULE_10__shape_Sector__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_11__shape_Curve__ = __webpack_require__(71);\n    __webpack_require__.d(__webpack_exports__, \"Curve\", function() {\n        return __WEBPACK_IMPORTED_MODULE_11__shape_Curve__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_12__shape_Rectangle__ = __webpack_require__(70);\n    __webpack_require__.d(__webpack_exports__, \"Rectangle\", function() {\n        return __WEBPACK_IMPORTED_MODULE_12__shape_Rectangle__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_13__shape_Polygon__ = __webpack_require__(214);\n    __webpack_require__.d(__webpack_exports__, \"Polygon\", function() {\n        return __WEBPACK_IMPORTED_MODULE_13__shape_Polygon__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_14__shape_Dot__ = __webpack_require__(63);\n    __webpack_require__.d(__webpack_exports__, \"Dot\", function() {\n        return __WEBPACK_IMPORTED_MODULE_14__shape_Dot__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_15__shape_Cross__ = __webpack_require__(367);\n    __webpack_require__.d(__webpack_exports__, \"Cross\", function() {\n        return __WEBPACK_IMPORTED_MODULE_15__shape_Cross__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_16__shape_Symbols__ = __webpack_require__(181);\n    __webpack_require__.d(__webpack_exports__, \"Symbols\", function() {\n        return __WEBPACK_IMPORTED_MODULE_16__shape_Symbols__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_17__polar_PolarGrid__ = __webpack_require__(923);\n    __webpack_require__.d(__webpack_exports__, \"PolarGrid\", function() {\n        return __WEBPACK_IMPORTED_MODULE_17__polar_PolarGrid__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_18__polar_PolarRadiusAxis__ = __webpack_require__(140);\n    __webpack_require__.d(__webpack_exports__, \"PolarRadiusAxis\", function() {\n        return __WEBPACK_IMPORTED_MODULE_18__polar_PolarRadiusAxis__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_19__polar_PolarAngleAxis__ = __webpack_require__(141);\n    __webpack_require__.d(__webpack_exports__, \"PolarAngleAxis\", function() {\n        return __WEBPACK_IMPORTED_MODULE_19__polar_PolarAngleAxis__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_20__polar_Pie__ = __webpack_require__(369);\n    __webpack_require__.d(__webpack_exports__, \"Pie\", function() {\n        return __WEBPACK_IMPORTED_MODULE_20__polar_Pie__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_21__polar_Radar__ = __webpack_require__(370);\n    __webpack_require__.d(__webpack_exports__, \"Radar\", function() {\n        return __WEBPACK_IMPORTED_MODULE_21__polar_Radar__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_22__polar_RadialBar__ = __webpack_require__(371);\n    __webpack_require__.d(__webpack_exports__, \"RadialBar\", function() {\n        return __WEBPACK_IMPORTED_MODULE_22__polar_RadialBar__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_23__cartesian_Brush__ = __webpack_require__(372);\n    __webpack_require__.d(__webpack_exports__, \"Brush\", function() {\n        return __WEBPACK_IMPORTED_MODULE_23__cartesian_Brush__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_24__cartesian_ReferenceLine__ = __webpack_require__(365);\n    __webpack_require__.d(__webpack_exports__, \"ReferenceLine\", function() {\n        return __WEBPACK_IMPORTED_MODULE_24__cartesian_ReferenceLine__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_25__cartesian_ReferenceDot__ = __webpack_require__(364);\n    __webpack_require__.d(__webpack_exports__, \"ReferenceDot\", function() {\n        return __WEBPACK_IMPORTED_MODULE_25__cartesian_ReferenceDot__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_26__cartesian_ReferenceArea__ = __webpack_require__(366);\n    __webpack_require__.d(__webpack_exports__, \"ReferenceArea\", function() {\n        return __WEBPACK_IMPORTED_MODULE_26__cartesian_ReferenceArea__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_27__cartesian_CartesianAxis__ = __webpack_require__(374);\n    __webpack_require__.d(__webpack_exports__, \"CartesianAxis\", function() {\n        return __WEBPACK_IMPORTED_MODULE_27__cartesian_CartesianAxis__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_28__cartesian_CartesianGrid__ = __webpack_require__(931);\n    __webpack_require__.d(__webpack_exports__, \"CartesianGrid\", function() {\n        return __WEBPACK_IMPORTED_MODULE_28__cartesian_CartesianGrid__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_29__cartesian_Line__ = __webpack_require__(215);\n    __webpack_require__.d(__webpack_exports__, \"Line\", function() {\n        return __WEBPACK_IMPORTED_MODULE_29__cartesian_Line__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_30__cartesian_Area__ = __webpack_require__(216);\n    __webpack_require__.d(__webpack_exports__, \"Area\", function() {\n        return __WEBPACK_IMPORTED_MODULE_30__cartesian_Area__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_31__cartesian_Bar__ = __webpack_require__(217);\n    __webpack_require__.d(__webpack_exports__, \"Bar\", function() {\n        return __WEBPACK_IMPORTED_MODULE_31__cartesian_Bar__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_32__cartesian_Scatter__ = __webpack_require__(218);\n    __webpack_require__.d(__webpack_exports__, \"Scatter\", function() {\n        return __WEBPACK_IMPORTED_MODULE_32__cartesian_Scatter__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_33__cartesian_XAxis__ = __webpack_require__(72);\n    __webpack_require__.d(__webpack_exports__, \"XAxis\", function() {\n        return __WEBPACK_IMPORTED_MODULE_33__cartesian_XAxis__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_34__cartesian_YAxis__ = __webpack_require__(73);\n    __webpack_require__.d(__webpack_exports__, \"YAxis\", function() {\n        return __WEBPACK_IMPORTED_MODULE_34__cartesian_YAxis__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_35__cartesian_ZAxis__ = __webpack_require__(142);\n    __webpack_require__.d(__webpack_exports__, \"ZAxis\", function() {\n        return __WEBPACK_IMPORTED_MODULE_35__cartesian_ZAxis__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_36__cartesian_ErrorBar__ = __webpack_require__(95);\n    __webpack_require__.d(__webpack_exports__, \"ErrorBar\", function() {\n        return __WEBPACK_IMPORTED_MODULE_36__cartesian_ErrorBar__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_37__chart_LineChart__ = __webpack_require__(932);\n    __webpack_require__.d(__webpack_exports__, \"LineChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_37__chart_LineChart__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_38__chart_BarChart__ = __webpack_require__(936);\n    __webpack_require__.d(__webpack_exports__, \"BarChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_38__chart_BarChart__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_39__chart_PieChart__ = __webpack_require__(937);\n    __webpack_require__.d(__webpack_exports__, \"PieChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_39__chart_PieChart__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_40__chart_Treemap__ = __webpack_require__(938);\n    __webpack_require__.d(__webpack_exports__, \"Treemap\", function() {\n        return __WEBPACK_IMPORTED_MODULE_40__chart_Treemap__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_41__chart_Sankey__ = __webpack_require__(939);\n    __webpack_require__.d(__webpack_exports__, \"Sankey\", function() {\n        return __WEBPACK_IMPORTED_MODULE_41__chart_Sankey__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_42__chart_RadarChart__ = __webpack_require__(942);\n    __webpack_require__.d(__webpack_exports__, \"RadarChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_42__chart_RadarChart__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_43__chart_ScatterChart__ = __webpack_require__(943);\n    __webpack_require__.d(__webpack_exports__, \"ScatterChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_43__chart_ScatterChart__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_44__chart_AreaChart__ = __webpack_require__(944);\n    __webpack_require__.d(__webpack_exports__, \"AreaChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_44__chart_AreaChart__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_45__chart_RadialBarChart__ = __webpack_require__(945);\n    __webpack_require__.d(__webpack_exports__, \"RadialBarChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_45__chart_RadialBarChart__.a;\n    });\n    var __WEBPACK_IMPORTED_MODULE_46__chart_ComposedChart__ = __webpack_require__(946);\n    __webpack_require__.d(__webpack_exports__, \"ComposedChart\", function() {\n        return __WEBPACK_IMPORTED_MODULE_46__chart_ComposedChart__.a;\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_core_js_es6_math__ = __webpack_require__(573), testObject = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_core_js_es6_math__), \n    {});\n    if (!Object.setPrototypeOf && !testObject.__proto__) {\n        var nativeGetPrototypeOf = Object.getPrototypeOf;\n        Object.getPrototypeOf = function(object) {\n            return object.__proto__ ? object.__proto__ : nativeGetPrototypeOf.call(Object, object);\n        };\n    }\n}, function(module, exports, __webpack_require__) {\n    __webpack_require__(574), __webpack_require__(586), __webpack_require__(587), __webpack_require__(588), \n    __webpack_require__(589), __webpack_require__(590), __webpack_require__(591), __webpack_require__(592), \n    __webpack_require__(594), __webpack_require__(595), __webpack_require__(596), __webpack_require__(597), \n    __webpack_require__(598), __webpack_require__(599), __webpack_require__(600), __webpack_require__(601), \n    __webpack_require__(602), module.exports = __webpack_require__(168).Math;\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), log1p = __webpack_require__(267), sqrt = Math.sqrt, $acosh = Math.acosh;\n    $export($export.S + $export.F * !($acosh && 710 == Math.floor($acosh(Number.MAX_VALUE)) && $acosh(1 / 0) == 1 / 0), \"Math\", {\n        acosh: function(x) {\n            return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var anObject = __webpack_require__(576), IE8_DOM_DEFINE = __webpack_require__(577), toPrimitive = __webpack_require__(579), dP = Object.defineProperty;\n    exports.f = __webpack_require__(170) ? Object.defineProperty : function(O, P, Attributes) {\n        if (anObject(O), P = toPrimitive(P, !0), anObject(Attributes), IE8_DOM_DEFINE) try {\n            return dP(O, P, Attributes);\n        } catch (e) {}\n        if (\"get\" in Attributes || \"set\" in Attributes) throw TypeError(\"Accessors not supported!\");\n        return \"value\" in Attributes && (O[P] = Attributes.value), O;\n    };\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(169);\n    module.exports = function(it) {\n        if (!isObject(it)) throw TypeError(it + \" is not an object!\");\n        return it;\n    };\n}, function(module, exports, __webpack_require__) {\n    module.exports = !__webpack_require__(170) && !__webpack_require__(114)(function() {\n        return 7 != Object.defineProperty(__webpack_require__(578)(\"div\"), \"a\", {\n            get: function() {\n                return 7;\n            }\n        }).a;\n    });\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(169), document = __webpack_require__(167).document, is = isObject(document) && isObject(document.createElement);\n    module.exports = function(it) {\n        return is ? document.createElement(it) : {};\n    };\n}, function(module, exports, __webpack_require__) {\n    var isObject = __webpack_require__(169);\n    module.exports = function(it, S) {\n        if (!isObject(it)) return it;\n        var fn, val;\n        if (S && \"function\" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;\n        if (\"function\" == typeof (fn = it.valueOf) && !isObject(val = fn.call(it))) return val;\n        if (!S && \"function\" == typeof (fn = it.toString) && !isObject(val = fn.call(it))) return val;\n        throw TypeError(\"Can't convert object to primitive value\");\n    };\n}, function(module, exports) {\n    module.exports = function(bitmap, value) {\n        return {\n            enumerable: !(1 & bitmap),\n            configurable: !(2 & bitmap),\n            writable: !(4 & bitmap),\n            value: value\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    var global = __webpack_require__(167), hide = __webpack_require__(266), has = __webpack_require__(582), SRC = __webpack_require__(583)(\"src\"), $toString = Function.toString, TPL = (\"\" + $toString).split(\"toString\");\n    __webpack_require__(168).inspectSource = function(it) {\n        return $toString.call(it);\n    }, (module.exports = function(O, key, val, safe) {\n        var isFunction = \"function\" == typeof val;\n        isFunction && (has(val, \"name\") || hide(val, \"name\", key)), O[key] !== val && (isFunction && (has(val, SRC) || hide(val, SRC, O[key] ? \"\" + O[key] : TPL.join(String(key)))), \n        O === global ? O[key] = val : safe ? O[key] ? O[key] = val : hide(O, key, val) : (delete O[key], \n        hide(O, key, val)));\n    })(Function.prototype, \"toString\", function() {\n        return \"function\" == typeof this && this[SRC] || $toString.call(this);\n    });\n}, function(module, exports) {\n    var hasOwnProperty = {}.hasOwnProperty;\n    module.exports = function(it, key) {\n        return hasOwnProperty.call(it, key);\n    };\n}, function(module, exports) {\n    var id = 0, px = Math.random();\n    module.exports = function(key) {\n        return \"Symbol(\".concat(void 0 === key ? \"\" : key, \")_\", (++id + px).toString(36));\n    };\n}, function(module, exports, __webpack_require__) {\n    var aFunction = __webpack_require__(585);\n    module.exports = function(fn, that, length) {\n        if (aFunction(fn), void 0 === that) return fn;\n        switch (length) {\n          case 1:\n            return function(a) {\n                return fn.call(that, a);\n            };\n\n          case 2:\n            return function(a, b) {\n                return fn.call(that, a, b);\n            };\n\n          case 3:\n            return function(a, b, c) {\n                return fn.call(that, a, b, c);\n            };\n        }\n        return function() {\n            return fn.apply(that, arguments);\n        };\n    };\n}, function(module, exports) {\n    module.exports = function(it) {\n        if (\"function\" != typeof it) throw TypeError(it + \" is not a function!\");\n        return it;\n    };\n}, function(module, exports, __webpack_require__) {\n    function asinh(x) {\n        return isFinite(x = +x) && 0 != x ? x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1)) : x;\n    }\n    var $export = __webpack_require__(15), $asinh = Math.asinh;\n    $export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), \"Math\", {\n        asinh: asinh\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), $atanh = Math.atanh;\n    $export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), \"Math\", {\n        atanh: function(x) {\n            return 0 == (x = +x) ? x : Math.log((1 + x) / (1 - x)) / 2;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), sign = __webpack_require__(171);\n    $export($export.S, \"Math\", {\n        cbrt: function(x) {\n            return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15);\n    $export($export.S, \"Math\", {\n        clz32: function(x) {\n            return (x >>>= 0) ? 31 - Math.floor(Math.log(x + .5) * Math.LOG2E) : 32;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), exp = Math.exp;\n    $export($export.S, \"Math\", {\n        cosh: function(x) {\n            return (exp(x = +x) + exp(-x)) / 2;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), $expm1 = __webpack_require__(172);\n    $export($export.S + $export.F * ($expm1 != Math.expm1), \"Math\", {\n        expm1: $expm1\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15);\n    $export($export.S, \"Math\", {\n        fround: __webpack_require__(593)\n    });\n}, function(module, exports, __webpack_require__) {\n    var sign = __webpack_require__(171), pow = Math.pow, EPSILON = pow(2, -52), EPSILON32 = pow(2, -23), MAX32 = pow(2, 127) * (2 - EPSILON32), MIN32 = pow(2, -126), roundTiesToEven = function(n) {\n        return n + 1 / EPSILON - 1 / EPSILON;\n    };\n    module.exports = Math.fround || function(x) {\n        var a, result, $abs = Math.abs(x), $sign = sign(x);\n        return $abs < MIN32 ? $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32 : (a = (1 + EPSILON32 / EPSILON) * $abs, \n        result = a - (a - $abs), result > MAX32 || result != result ? $sign * (1 / 0) : $sign * result);\n    };\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), abs = Math.abs;\n    $export($export.S, \"Math\", {\n        hypot: function(value1, value2) {\n            for (var arg, div, sum = 0, i = 0, aLen = arguments.length, larg = 0; i < aLen; ) arg = abs(arguments[i++]), \n            larg < arg ? (div = larg / arg, sum = sum * div * div + 1, larg = arg) : arg > 0 ? (div = arg / larg, \n            sum += div * div) : sum += arg;\n            return larg === 1 / 0 ? 1 / 0 : larg * Math.sqrt(sum);\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), $imul = Math.imul;\n    $export($export.S + $export.F * __webpack_require__(114)(function() {\n        return -5 != $imul(4294967295, 5) || 2 != $imul.length;\n    }), \"Math\", {\n        imul: function(x, y) {\n            var xn = +x, yn = +y, xl = 65535 & xn, yl = 65535 & yn;\n            return 0 | xl * yl + ((65535 & xn >>> 16) * yl + xl * (65535 & yn >>> 16) << 16 >>> 0);\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15);\n    $export($export.S, \"Math\", {\n        log10: function(x) {\n            return Math.log(x) * Math.LOG10E;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15);\n    $export($export.S, \"Math\", {\n        log1p: __webpack_require__(267)\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15);\n    $export($export.S, \"Math\", {\n        log2: function(x) {\n            return Math.log(x) / Math.LN2;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15);\n    $export($export.S, \"Math\", {\n        sign: __webpack_require__(171)\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), expm1 = __webpack_require__(172), exp = Math.exp;\n    $export($export.S + $export.F * __webpack_require__(114)(function() {\n        return -2e-17 != !Math.sinh(-2e-17);\n    }), \"Math\", {\n        sinh: function(x) {\n            return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15), expm1 = __webpack_require__(172), exp = Math.exp;\n    $export($export.S, \"Math\", {\n        tanh: function(x) {\n            var a = expm1(x = +x), b = expm1(-x);\n            return a == 1 / 0 ? 1 : b == 1 / 0 ? -1 : (a - b) / (exp(x) + exp(-x));\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    var $export = __webpack_require__(15);\n    $export($export.S, \"Math\", {\n        trunc: function(it) {\n            return (it > 0 ? Math.floor : Math.ceil)(it);\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    function getRawTag(value) {\n        var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];\n        try {\n            value[symToStringTag] = void 0;\n            var unmasked = !0;\n        } catch (e) {}\n        var result = nativeObjectToString.call(value);\n        return unmasked && (isOwn ? value[symToStringTag] = tag : delete value[symToStringTag]), \n        result;\n    }\n    var Symbol = __webpack_require__(83), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty, nativeObjectToString = objectProto.toString, symToStringTag = Symbol ? Symbol.toStringTag : void 0;\n    module.exports = getRawTag;\n}, function(module, exports) {\n    function objectToString(value) {\n        return nativeObjectToString.call(value);\n    }\n    var objectProto = Object.prototype, nativeObjectToString = objectProto.toString;\n    module.exports = objectToString;\n}, function(module, exports, __webpack_require__) {\n    var memoizeCapped = __webpack_require__(606), rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g, reEscapeChar = /\\\\(\\\\)?/g, stringToPath = memoizeCapped(function(string) {\n        var result = [];\n        return 46 === string.charCodeAt(0) && result.push(\"\"), string.replace(rePropName, function(match, number, quote, subString) {\n            result.push(quote ? subString.replace(reEscapeChar, \"$1\") : number || match);\n        }), result;\n    });\n    module.exports = stringToPath;\n}, function(module, exports, __webpack_require__) {\n    function memoizeCapped(func) {\n        var result = memoize(func, function(key) {\n            return cache.size === MAX_MEMOIZE_SIZE && cache.clear(), key;\n        }), cache = result.cache;\n        return result;\n    }\n    var memoize = __webpack_require__(607), MAX_MEMOIZE_SIZE = 500;\n    module.exports = memoizeCapped;\n}, function(module, exports, __webpack_require__) {\n    function memoize(func, resolver) {\n        if (\"function\" != typeof func || null != resolver && \"function\" != typeof resolver) throw new TypeError(FUNC_ERROR_TEXT);\n        var memoized = function() {\n            var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;\n            if (cache.has(key)) return cache.get(key);\n            var result = func.apply(this, args);\n            return memoized.cache = cache.set(key, result) || cache, result;\n        };\n        return memoized.cache = new (memoize.Cache || MapCache)(), memoized;\n    }\n    var MapCache = __webpack_require__(176), FUNC_ERROR_TEXT = \"Expected a function\";\n    memoize.Cache = MapCache, module.exports = memoize;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheClear() {\n        this.size = 0, this.__data__ = {\n            hash: new Hash(),\n            map: new (Map || ListCache)(),\n            string: new Hash()\n        };\n    }\n    var Hash = __webpack_require__(609), ListCache = __webpack_require__(116), Map = __webpack_require__(178);\n    module.exports = mapCacheClear;\n}, function(module, exports, __webpack_require__) {\n    function Hash(entries) {\n        var index = -1, length = null == entries ? 0 : entries.length;\n        for (this.clear(); ++index < length; ) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n    var hashClear = __webpack_require__(610), hashDelete = __webpack_require__(615), hashGet = __webpack_require__(616), hashHas = __webpack_require__(617), hashSet = __webpack_require__(618);\n    Hash.prototype.clear = hashClear, Hash.prototype.delete = hashDelete, Hash.prototype.get = hashGet, \n    Hash.prototype.has = hashHas, Hash.prototype.set = hashSet, module.exports = Hash;\n}, function(module, exports, __webpack_require__) {\n    function hashClear() {\n        this.__data__ = nativeCreate ? nativeCreate(null) : {}, this.size = 0;\n    }\n    var nativeCreate = __webpack_require__(115);\n    module.exports = hashClear;\n}, function(module, exports, __webpack_require__) {\n    function baseIsNative(value) {\n        return !(!isObject(value) || isMasked(value)) && (isFunction(value) ? reIsNative : reIsHostCtor).test(toSource(value));\n    }\n    var isFunction = __webpack_require__(8), isMasked = __webpack_require__(612), isObject = __webpack_require__(32), toSource = __webpack_require__(271), reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g, reIsHostCtor = /^\\[object .+?Constructor\\]$/, funcProto = Function.prototype, objectProto = Object.prototype, funcToString = funcProto.toString, hasOwnProperty = objectProto.hasOwnProperty, reIsNative = RegExp(\"^\" + funcToString.call(hasOwnProperty).replace(reRegExpChar, \"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, \"$1.*?\") + \"$\");\n    module.exports = baseIsNative;\n}, function(module, exports, __webpack_require__) {\n    function isMasked(func) {\n        return !!maskSrcKey && maskSrcKey in func;\n    }\n    var coreJsData = __webpack_require__(613), maskSrcKey = function() {\n        var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || \"\");\n        return uid ? \"Symbol(src)_1.\" + uid : \"\";\n    }();\n    module.exports = isMasked;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(31), coreJsData = root[\"__core-js_shared__\"];\n    module.exports = coreJsData;\n}, function(module, exports) {\n    function getValue(object, key) {\n        return null == object ? void 0 : object[key];\n    }\n    module.exports = getValue;\n}, function(module, exports) {\n    function hashDelete(key) {\n        var result = this.has(key) && delete this.__data__[key];\n        return this.size -= result ? 1 : 0, result;\n    }\n    module.exports = hashDelete;\n}, function(module, exports, __webpack_require__) {\n    function hashGet(key) {\n        var data = this.__data__;\n        if (nativeCreate) {\n            var result = data[key];\n            return result === HASH_UNDEFINED ? void 0 : result;\n        }\n        return hasOwnProperty.call(data, key) ? data[key] : void 0;\n    }\n    var nativeCreate = __webpack_require__(115), HASH_UNDEFINED = \"__lodash_hash_undefined__\", objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = hashGet;\n}, function(module, exports, __webpack_require__) {\n    function hashHas(key) {\n        var data = this.__data__;\n        return nativeCreate ? void 0 !== data[key] : hasOwnProperty.call(data, key);\n    }\n    var nativeCreate = __webpack_require__(115), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = hashHas;\n}, function(module, exports, __webpack_require__) {\n    function hashSet(key, value) {\n        var data = this.__data__;\n        return this.size += this.has(key) ? 0 : 1, data[key] = nativeCreate && void 0 === value ? HASH_UNDEFINED : value, \n        this;\n    }\n    var nativeCreate = __webpack_require__(115), HASH_UNDEFINED = \"__lodash_hash_undefined__\";\n    module.exports = hashSet;\n}, function(module, exports) {\n    function listCacheClear() {\n        this.__data__ = [], this.size = 0;\n    }\n    module.exports = listCacheClear;\n}, function(module, exports, __webpack_require__) {\n    function listCacheDelete(key) {\n        var data = this.__data__, index = assocIndexOf(data, key);\n        return !(index < 0) && (index == data.length - 1 ? data.pop() : splice.call(data, index, 1), \n        --this.size, !0);\n    }\n    var assocIndexOf = __webpack_require__(117), arrayProto = Array.prototype, splice = arrayProto.splice;\n    module.exports = listCacheDelete;\n}, function(module, exports, __webpack_require__) {\n    function listCacheGet(key) {\n        var data = this.__data__, index = assocIndexOf(data, key);\n        return index < 0 ? void 0 : data[index][1];\n    }\n    var assocIndexOf = __webpack_require__(117);\n    module.exports = listCacheGet;\n}, function(module, exports, __webpack_require__) {\n    function listCacheHas(key) {\n        return assocIndexOf(this.__data__, key) > -1;\n    }\n    var assocIndexOf = __webpack_require__(117);\n    module.exports = listCacheHas;\n}, function(module, exports, __webpack_require__) {\n    function listCacheSet(key, value) {\n        var data = this.__data__, index = assocIndexOf(data, key);\n        return index < 0 ? (++this.size, data.push([ key, value ])) : data[index][1] = value, \n        this;\n    }\n    var assocIndexOf = __webpack_require__(117);\n    module.exports = listCacheSet;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheDelete(key) {\n        var result = getMapData(this, key).delete(key);\n        return this.size -= result ? 1 : 0, result;\n    }\n    var getMapData = __webpack_require__(118);\n    module.exports = mapCacheDelete;\n}, function(module, exports) {\n    function isKeyable(value) {\n        var type = typeof value;\n        return \"string\" == type || \"number\" == type || \"symbol\" == type || \"boolean\" == type ? \"__proto__\" !== value : null === value;\n    }\n    module.exports = isKeyable;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheGet(key) {\n        return getMapData(this, key).get(key);\n    }\n    var getMapData = __webpack_require__(118);\n    module.exports = mapCacheGet;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheHas(key) {\n        return getMapData(this, key).has(key);\n    }\n    var getMapData = __webpack_require__(118);\n    module.exports = mapCacheHas;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheSet(key, value) {\n        var data = getMapData(this, key), size = data.size;\n        return data.set(key, value), this.size += data.size == size ? 0 : 1, this;\n    }\n    var getMapData = __webpack_require__(118);\n    module.exports = mapCacheSet;\n}, function(module, exports, __webpack_require__) {\n    function toString(value) {\n        return null == value ? \"\" : baseToString(value);\n    }\n    var baseToString = __webpack_require__(630);\n    module.exports = toString;\n}, function(module, exports, __webpack_require__) {\n    function baseToString(value) {\n        if (\"string\" == typeof value) return value;\n        if (isArray(value)) return arrayMap(value, baseToString) + \"\";\n        if (isSymbol(value)) return symbolToString ? symbolToString.call(value) : \"\";\n        var result = value + \"\";\n        return \"0\" == result && 1 / value == -INFINITY ? \"-0\" : result;\n    }\n    var Symbol = __webpack_require__(83), arrayMap = __webpack_require__(179), isArray = __webpack_require__(13), isSymbol = __webpack_require__(67), INFINITY = 1 / 0, symbolProto = Symbol ? Symbol.prototype : void 0, symbolToString = symbolProto ? symbolProto.toString : void 0;\n    module.exports = baseToString;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__container_Surface__ = __webpack_require__(82), __WEBPACK_IMPORTED_MODULE_5__shape_Symbols__ = __webpack_require__(181), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), ICON_TYPES = __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b.filter(function(type) {\n        return \"none\" !== type;\n    }), DefaultLegendContent = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function DefaultLegendContent() {\n            return _classCallCheck(this, DefaultLegendContent), _possibleConstructorReturn(this, (DefaultLegendContent.__proto__ || Object.getPrototypeOf(DefaultLegendContent)).apply(this, arguments));\n        }\n        return _inherits(DefaultLegendContent, _Component), _createClass(DefaultLegendContent, [ {\n            key: \"renderIcon\",\n            value: function(data) {\n                var inactiveColor = this.props.inactiveColor, color = data.inactive ? inactiveColor : data.color;\n                return \"plainline\" === data.type ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"line\", {\n                    strokeWidth: 4,\n                    fill: \"none\",\n                    stroke: color,\n                    strokeDasharray: data.payload.strokeDasharray,\n                    x1: 0,\n                    y1: 16,\n                    x2: 32,\n                    y2: 16,\n                    className: \"recharts-legend-icon\"\n                }) : \"line\" === data.type ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", {\n                    strokeWidth: 4,\n                    fill: \"none\",\n                    stroke: color,\n                    d: \"M0,16h\" + 32 / 3 + \"\\n            A\" + 32 / 6 + \",\" + 32 / 6 + \",0,1,1,\" + 32 / 3 * 2 + \",16\\n            H32M\" + 32 / 3 * 2 + \",16\\n            A\" + 32 / 6 + \",\" + 32 / 6 + \",0,1,1,\" + 32 / 3 + \",16\",\n                    className: \"recharts-legend-icon\"\n                }) : \"rect\" === data.type ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", {\n                    stroke: \"none\",\n                    fill: color,\n                    d: \"M0,4h32v24h-32z\",\n                    className: \"recharts-legend-icon\"\n                }) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5__shape_Symbols__.a, {\n                    fill: color,\n                    cx: 16,\n                    cy: 16,\n                    size: 32,\n                    sizeType: \"diameter\",\n                    type: data.type\n                });\n            }\n        }, {\n            key: \"renderItems\",\n            value: function() {\n                var _this2 = this, _props = this.props, payload = _props.payload, iconSize = _props.iconSize, layout = _props.layout, formatter = _props.formatter, viewBox = {\n                    x: 0,\n                    y: 0,\n                    width: 32,\n                    height: 32\n                }, itemStyle = {\n                    display: \"horizontal\" === layout ? \"inline-block\" : \"block\",\n                    marginRight: 10\n                }, svgStyle = {\n                    display: \"inline-block\",\n                    verticalAlign: \"middle\",\n                    marginRight: 4\n                };\n                return payload.map(function(entry, i) {\n                    var _classNames, finalFormatter = entry.formatter || formatter, className = __WEBPACK_IMPORTED_MODULE_2_classnames___default()((_classNames = {\n                        \"recharts-legend-item\": !0\n                    }, _defineProperty(_classNames, \"legend-item-\" + i, !0), _defineProperty(_classNames, \"inactive\", entry.inactive), \n                    _classNames));\n                    return \"none\" === entry.type ? null : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"li\", _extends({\n                        className: className,\n                        style: itemStyle,\n                        key: \"legend-item-\" + i\n                    }, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.f)(_this2.props, entry, i)), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4__container_Surface__.a, {\n                        width: iconSize,\n                        height: iconSize,\n                        viewBox: viewBox,\n                        style: svgStyle\n                    }, _this2.renderIcon(entry)), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"span\", {\n                        className: \"recharts-legend-item-text\"\n                    }, finalFormatter ? finalFormatter(entry.value, entry, i) : entry.value));\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, payload = _props2.payload, layout = _props2.layout, align = _props2.align;\n                if (!payload || !payload.length) return null;\n                var finalStyle = {\n                    padding: 0,\n                    margin: 0,\n                    textAlign: \"horizontal\" === layout ? align : \"left\"\n                };\n                return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"ul\", {\n                    className: \"recharts-default-legend\",\n                    style: finalStyle\n                }, this.renderItems());\n            }\n        } ]), DefaultLegendContent;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"Legend\", \n    _class2.propTypes = {\n        content: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element,\n        iconSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        iconType: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(ICON_TYPES),\n        layout: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"horizontal\", \"vertical\" ]),\n        align: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"center\", \"left\", \"right\" ]),\n        verticalAlign: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"top\", \"bottom\", \"middle\" ]),\n        payload: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({\n            value: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any,\n            id: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any,\n            type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.b)\n        })),\n        inactiveColor: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string,\n        formatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,\n        onMouseEnter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,\n        onMouseLeave: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func,\n        onClick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func\n    }, _class2.defaultProps = {\n        iconSize: 14,\n        layout: \"horizontal\",\n        align: \"center\",\n        verticalAlign: \"middle\",\n        inactiveColor: \"#ccc\"\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = DefaultLegendContent;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(84), __webpack_require__(58), __webpack_require__(85);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Path() {\n        this._x0 = this._y0 = this._x1 = this._y1 = null, this._ = \"\";\n    }\n    function path() {\n        return new Path();\n    }\n    var pi = Math.PI, tau = 2 * pi, tauEpsilon = tau - 1e-6;\n    Path.prototype = path.prototype = {\n        constructor: Path,\n        moveTo: function(x, y) {\n            this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n        },\n        closePath: function() {\n            null !== this._x1 && (this._x1 = this._x0, this._y1 = this._y0, this._ += \"Z\");\n        },\n        lineTo: function(x, y) {\n            this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n        },\n        quadraticCurveTo: function(x1, y1, x, y) {\n            this._ += \"Q\" + +x1 + \",\" + +y1 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n        },\n        bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n            this._ += \"C\" + +x1 + \",\" + +y1 + \",\" + +x2 + \",\" + +y2 + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n        },\n        arcTo: function(x1, y1, x2, y2, r) {\n            x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n            var x0 = this._x1, y0 = this._y1, x21 = x2 - x1, y21 = y2 - y1, x01 = x0 - x1, y01 = y0 - y1, l01_2 = x01 * x01 + y01 * y01;\n            if (r < 0) throw new Error(\"negative radius: \" + r);\n            if (null === this._x1) this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1); else if (l01_2 > 1e-6) if (Math.abs(y01 * x21 - y21 * x01) > 1e-6 && r) {\n                var x20 = x2 - x0, y20 = y2 - y0, l21_2 = x21 * x21 + y21 * y21, l20_2 = x20 * x20 + y20 * y20, l21 = Math.sqrt(l21_2), l01 = Math.sqrt(l01_2), l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), t01 = l / l01, t21 = l / l21;\n                Math.abs(t01 - 1) > 1e-6 && (this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01)), \n                this._ += \"A\" + r + \",\" + r + \",0,0,\" + +(y01 * x20 > x01 * y20) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n            } else this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1); else ;\n        },\n        arc: function(x, y, r, a0, a1, ccw) {\n            x = +x, y = +y, r = +r;\n            var dx = r * Math.cos(a0), dy = r * Math.sin(a0), x0 = x + dx, y0 = y + dy, cw = 1 ^ ccw, da = ccw ? a0 - a1 : a1 - a0;\n            if (r < 0) throw new Error(\"negative radius: \" + r);\n            null === this._x1 ? this._ += \"M\" + x0 + \",\" + y0 : (Math.abs(this._x1 - x0) > 1e-6 || Math.abs(this._y1 - y0) > 1e-6) && (this._ += \"L\" + x0 + \",\" + y0), \n            r && (da < 0 && (da = da % tau + tau), da > tauEpsilon ? this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0) : da > 1e-6 && (this._ += \"A\" + r + \",\" + r + \",0,\" + +(da >= pi) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1))));\n        },\n        rect: function(x, y, w, h) {\n            this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + +w + \"v\" + +h + \"h\" + -w + \"Z\";\n        },\n        toString: function() {\n            return this._;\n        }\n    }, __webpack_exports__.a = path;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(58), __webpack_require__(635), __webpack_require__(636), __webpack_require__(85);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(a, b) {\n        return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(d) {\n        return d;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(274), __webpack_require__(273), __webpack_require__(275);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(84), __webpack_require__(277), __webpack_require__(58), __webpack_require__(184), \n    __webpack_require__(276);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_d3_path__ = __webpack_require__(84), __WEBPACK_IMPORTED_MODULE_1__symbol_circle__ = __webpack_require__(278), __WEBPACK_IMPORTED_MODULE_2__symbol_cross__ = __webpack_require__(279), __WEBPACK_IMPORTED_MODULE_3__symbol_diamond__ = __webpack_require__(280), __WEBPACK_IMPORTED_MODULE_4__symbol_star__ = __webpack_require__(281), __WEBPACK_IMPORTED_MODULE_5__symbol_square__ = __webpack_require__(282), __WEBPACK_IMPORTED_MODULE_6__symbol_triangle__ = __webpack_require__(283), __WEBPACK_IMPORTED_MODULE_7__symbol_wye__ = __webpack_require__(284), __WEBPACK_IMPORTED_MODULE_8__constant__ = __webpack_require__(58);\n    __WEBPACK_IMPORTED_MODULE_1__symbol_circle__.a, __WEBPACK_IMPORTED_MODULE_2__symbol_cross__.a, \n    __WEBPACK_IMPORTED_MODULE_3__symbol_diamond__.a, __WEBPACK_IMPORTED_MODULE_5__symbol_square__.a, \n    __WEBPACK_IMPORTED_MODULE_4__symbol_star__.a, __WEBPACK_IMPORTED_MODULE_6__symbol_triangle__.a, \n    __WEBPACK_IMPORTED_MODULE_7__symbol_wye__.a;\n    __webpack_exports__.a = function() {\n        function symbol() {\n            var buffer;\n            if (context || (context = buffer = Object(__WEBPACK_IMPORTED_MODULE_0_d3_path__.a)()), \n            type.apply(this, arguments).draw(context, +size.apply(this, arguments)), buffer) return context = null, \n            buffer + \"\" || null;\n        }\n        var type = Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(__WEBPACK_IMPORTED_MODULE_1__symbol_circle__.a), size = Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(64), context = null;\n        return symbol.type = function(_) {\n            return arguments.length ? (type = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(_), \n            symbol) : type;\n        }, symbol.size = function(_) {\n            return arguments.length ? (size = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_8__constant__.a)(+_), \n            symbol) : size;\n        }, symbol.context = function(_) {\n            return arguments.length ? (context = null == _ ? null : _, symbol) : context;\n        }, symbol;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function BasisClosed(context) {\n        this._context = context;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__noop__ = __webpack_require__(122), __WEBPACK_IMPORTED_MODULE_1__basis__ = __webpack_require__(123);\n    BasisClosed.prototype = {\n        areaStart: __WEBPACK_IMPORTED_MODULE_0__noop__.a,\n        areaEnd: __WEBPACK_IMPORTED_MODULE_0__noop__.a,\n        lineStart: function() {\n            this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN, \n            this._point = 0;\n        },\n        lineEnd: function() {\n            switch (this._point) {\n              case 1:\n                this._context.moveTo(this._x2, this._y2), this._context.closePath();\n                break;\n\n              case 2:\n                this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3), \n                this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3), \n                this._context.closePath();\n                break;\n\n              case 3:\n                this.point(this._x2, this._y2), this.point(this._x3, this._y3), this.point(this._x4, this._y4);\n            }\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1, this._x2 = x, this._y2 = y;\n                break;\n\n              case 1:\n                this._point = 2, this._x3 = x, this._y3 = y;\n                break;\n\n              case 2:\n                this._point = 3, this._x4 = x, this._y4 = y, this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6);\n                break;\n\n              default:\n                Object(__WEBPACK_IMPORTED_MODULE_1__basis__.c)(this, x, y);\n            }\n            this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;\n        }\n    }, __webpack_exports__.a = function(context) {\n        return new BasisClosed(context);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function BasisOpen(context) {\n        this._context = context;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__basis__ = __webpack_require__(123);\n    BasisOpen.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0;\n        },\n        lineEnd: function() {\n            (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1;\n                break;\n\n              case 1:\n                this._point = 2;\n                break;\n\n              case 2:\n                this._point = 3;\n                var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6;\n                this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0);\n                break;\n\n              case 3:\n                this._point = 4;\n\n              default:\n                Object(__WEBPACK_IMPORTED_MODULE_0__basis__.c)(this, x, y);\n            }\n            this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y;\n        }\n    }, __webpack_exports__.a = function(context) {\n        return new BasisOpen(context);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Bundle(context, beta) {\n        this._basis = new __WEBPACK_IMPORTED_MODULE_0__basis__.a(context), this._beta = beta;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__basis__ = __webpack_require__(123);\n    Bundle.prototype = {\n        lineStart: function() {\n            this._x = [], this._y = [], this._basis.lineStart();\n        },\n        lineEnd: function() {\n            var x = this._x, y = this._y, j = x.length - 1;\n            if (j > 0) for (var t, x0 = x[0], y0 = y[0], dx = x[j] - x0, dy = y[j] - y0, i = -1; ++i <= j; ) t = i / j, \n            this._basis.point(this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), this._beta * y[i] + (1 - this._beta) * (y0 + t * dy));\n            this._x = this._y = null, this._basis.lineEnd();\n        },\n        point: function(x, y) {\n            this._x.push(+x), this._y.push(+y);\n        }\n    };\n    !function custom(beta) {\n        function bundle(context) {\n            return 1 === beta ? new __WEBPACK_IMPORTED_MODULE_0__basis__.a(context) : new Bundle(context, beta);\n        }\n        return bundle.beta = function(beta) {\n            return custom(+beta);\n        }, bundle;\n    }(.85);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function CatmullRomClosed(context, alpha) {\n        this._context = context, this._alpha = alpha;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__cardinalClosed__ = __webpack_require__(285), __WEBPACK_IMPORTED_MODULE_1__noop__ = __webpack_require__(122), __WEBPACK_IMPORTED_MODULE_2__catmullRom__ = __webpack_require__(185);\n    CatmullRomClosed.prototype = {\n        areaStart: __WEBPACK_IMPORTED_MODULE_1__noop__.a,\n        areaEnd: __WEBPACK_IMPORTED_MODULE_1__noop__.a,\n        lineStart: function() {\n            this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, \n            this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n        },\n        lineEnd: function() {\n            switch (this._point) {\n              case 1:\n                this._context.moveTo(this._x3, this._y3), this._context.closePath();\n                break;\n\n              case 2:\n                this._context.lineTo(this._x3, this._y3), this._context.closePath();\n                break;\n\n              case 3:\n                this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5);\n            }\n        },\n        point: function(x, y) {\n            if (x = +x, y = +y, this._point) {\n                var x23 = this._x2 - x, y23 = this._y2 - y;\n                this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n            }\n            switch (this._point) {\n              case 0:\n                this._point = 1, this._x3 = x, this._y3 = y;\n                break;\n\n              case 1:\n                this._point = 2, this._context.moveTo(this._x4 = x, this._y4 = y);\n                break;\n\n              case 2:\n                this._point = 3, this._x5 = x, this._y5 = y;\n                break;\n\n              default:\n                Object(__WEBPACK_IMPORTED_MODULE_2__catmullRom__.a)(this, x, y);\n            }\n            this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, \n            this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, \n            this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n        }\n    };\n    !function custom(alpha) {\n        function catmullRom(context) {\n            return alpha ? new CatmullRomClosed(context, alpha) : new __WEBPACK_IMPORTED_MODULE_0__cardinalClosed__.a(context, 0);\n        }\n        return catmullRom.alpha = function(alpha) {\n            return custom(+alpha);\n        }, catmullRom;\n    }(.5);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function CatmullRomOpen(context, alpha) {\n        this._context = context, this._alpha = alpha;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__cardinalOpen__ = __webpack_require__(286), __WEBPACK_IMPORTED_MODULE_1__catmullRom__ = __webpack_require__(185);\n    CatmullRomOpen.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0;\n        },\n        lineEnd: function() {\n            (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            if (x = +x, y = +y, this._point) {\n                var x23 = this._x2 - x, y23 = this._y2 - y;\n                this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n            }\n            switch (this._point) {\n              case 0:\n                this._point = 1;\n                break;\n\n              case 1:\n                this._point = 2;\n                break;\n\n              case 2:\n                this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);\n                break;\n\n              case 3:\n                this._point = 4;\n\n              default:\n                Object(__WEBPACK_IMPORTED_MODULE_1__catmullRom__.a)(this, x, y);\n            }\n            this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, \n            this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = x, \n            this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n        }\n    };\n    !function custom(alpha) {\n        function catmullRom(context) {\n            return alpha ? new CatmullRomOpen(context, alpha) : new __WEBPACK_IMPORTED_MODULE_0__cardinalOpen__.a(context, 0);\n        }\n        return catmullRom.alpha = function(alpha) {\n            return custom(+alpha);\n        }, catmullRom;\n    }(.5);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function LinearClosed(context) {\n        this._context = context;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__noop__ = __webpack_require__(122);\n    LinearClosed.prototype = {\n        areaStart: __WEBPACK_IMPORTED_MODULE_0__noop__.a,\n        areaEnd: __WEBPACK_IMPORTED_MODULE_0__noop__.a,\n        lineStart: function() {\n            this._point = 0;\n        },\n        lineEnd: function() {\n            this._point && this._context.closePath();\n        },\n        point: function(x, y) {\n            x = +x, y = +y, this._point ? this._context.lineTo(x, y) : (this._point = 1, this._context.moveTo(x, y));\n        }\n    }, __webpack_exports__.a = function(context) {\n        return new LinearClosed(context);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function sign(x) {\n        return x < 0 ? -1 : 1;\n    }\n    function slope3(that, x2, y2) {\n        var h0 = that._x1 - that._x0, h1 = x2 - that._x1, s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), p = (s0 * h1 + s1 * h0) / (h0 + h1);\n        return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), .5 * Math.abs(p)) || 0;\n    }\n    function slope2(that, t) {\n        var h = that._x1 - that._x0;\n        return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n    }\n    function point(that, t0, t1) {\n        var x0 = that._x0, y0 = that._y0, x1 = that._x1, y1 = that._y1, dx = (x1 - x0) / 3;\n        that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n    }\n    function MonotoneX(context) {\n        this._context = context;\n    }\n    function MonotoneY(context) {\n        this._context = new ReflectContext(context);\n    }\n    function ReflectContext(context) {\n        this._context = context;\n    }\n    function monotoneX(context) {\n        return new MonotoneX(context);\n    }\n    function monotoneY(context) {\n        return new MonotoneY(context);\n    }\n    __webpack_exports__.a = monotoneX, __webpack_exports__.b = monotoneY, MonotoneX.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN, this._point = 0;\n        },\n        lineEnd: function() {\n            switch (this._point) {\n              case 2:\n                this._context.lineTo(this._x1, this._y1);\n                break;\n\n              case 3:\n                point(this, this._t0, slope2(this, this._t0));\n            }\n            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), \n            this._line = 1 - this._line;\n        },\n        point: function(x, y) {\n            var t1 = NaN;\n            if (x = +x, y = +y, x !== this._x1 || y !== this._y1) {\n                switch (this._point) {\n                  case 0:\n                    this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                    break;\n\n                  case 1:\n                    this._point = 2;\n                    break;\n\n                  case 2:\n                    this._point = 3, point(this, slope2(this, t1 = slope3(this, x, y)), t1);\n                    break;\n\n                  default:\n                    point(this, this._t0, t1 = slope3(this, x, y));\n                }\n                this._x0 = this._x1, this._x1 = x, this._y0 = this._y1, this._y1 = y, this._t0 = t1;\n            }\n        }\n    }, (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n        MonotoneX.prototype.point.call(this, y, x);\n    }, ReflectContext.prototype = {\n        moveTo: function(x, y) {\n            this._context.moveTo(y, x);\n        },\n        closePath: function() {\n            this._context.closePath();\n        },\n        lineTo: function(x, y) {\n            this._context.lineTo(y, x);\n        },\n        bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n            this._context.bezierCurveTo(y1, x1, y2, x2, y, x);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Natural(context) {\n        this._context = context;\n    }\n    function controlPoints(x) {\n        var i, m, n = x.length - 1, a = new Array(n), b = new Array(n), r = new Array(n);\n        for (a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1], i = 1; i < n - 1; ++i) a[i] = 1, \n        b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n        for (a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n], i = 1; i < n; ++i) m = a[i] / b[i - 1], \n        b[i] -= m, r[i] -= m * r[i - 1];\n        for (a[n - 1] = r[n - 1] / b[n - 1], i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n        for (b[n - 1] = (x[n] + a[n - 1]) / 2, i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n        return [ a, b ];\n    }\n    Natural.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x = [], this._y = [];\n        },\n        lineEnd: function() {\n            var x = this._x, y = this._y, n = x.length;\n            if (n) if (this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]), \n            2 === n) this._context.lineTo(x[1], y[1]); else for (var px = controlPoints(x), py = controlPoints(y), i0 = 0, i1 = 1; i1 < n; ++i0, \n            ++i1) this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n            (this._line || 0 !== this._line && 1 === n) && this._context.closePath(), this._line = 1 - this._line, \n            this._x = this._y = null;\n        },\n        point: function(x, y) {\n            this._x.push(+x), this._y.push(+y);\n        }\n    }, __webpack_exports__.a = function(context) {\n        return new Natural(context);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Step(context, t) {\n        this._context = context, this._t = t;\n    }\n    function stepBefore(context) {\n        return new Step(context, 0);\n    }\n    function stepAfter(context) {\n        return new Step(context, 1);\n    }\n    __webpack_exports__.c = stepBefore, __webpack_exports__.b = stepAfter, Step.prototype = {\n        areaStart: function() {\n            this._line = 0;\n        },\n        areaEnd: function() {\n            this._line = NaN;\n        },\n        lineStart: function() {\n            this._x = this._y = NaN, this._point = 0;\n        },\n        lineEnd: function() {\n            0 < this._t && this._t < 1 && 2 === this._point && this._context.lineTo(this._x, this._y), \n            (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), \n            this._line >= 0 && (this._t = 1 - this._t, this._line = 1 - this._line);\n        },\n        point: function(x, y) {\n            switch (x = +x, y = +y, this._point) {\n              case 0:\n                this._point = 1, this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y);\n                break;\n\n              case 1:\n                this._point = 2;\n\n              default:\n                if (this._t <= 0) this._context.lineTo(this._x, y), this._context.lineTo(x, y); else {\n                    var x1 = this._x * (1 - this._t) + x * this._t;\n                    this._context.lineTo(x1, this._y), this._context.lineTo(x1, y);\n                }\n            }\n            this._x = x, this._y = y;\n        }\n    }, __webpack_exports__.a = function(context) {\n        return new Step(context, .5);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function stackValue(d, key) {\n        return d[key];\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__array__ = __webpack_require__(277), __WEBPACK_IMPORTED_MODULE_1__constant__ = __webpack_require__(58), __WEBPACK_IMPORTED_MODULE_2__offset_none__ = __webpack_require__(86), __WEBPACK_IMPORTED_MODULE_3__order_none__ = __webpack_require__(87);\n    __webpack_exports__.a = function() {\n        function stack(data) {\n            var i, oz, kz = keys.apply(this, arguments), m = data.length, n = kz.length, sz = new Array(n);\n            for (i = 0; i < n; ++i) {\n                for (var sij, ki = kz[i], si = sz[i] = new Array(m), j = 0; j < m; ++j) si[j] = sij = [ 0, +value(data[j], ki, j, data) ], \n                sij.data = data[j];\n                si.key = ki;\n            }\n            for (i = 0, oz = order(sz); i < n; ++i) sz[oz[i]].index = i;\n            return offset(sz, oz), sz;\n        }\n        var keys = Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)([]), order = __WEBPACK_IMPORTED_MODULE_3__order_none__.a, offset = __WEBPACK_IMPORTED_MODULE_2__offset_none__.a, value = stackValue;\n        return stack.keys = function(_) {\n            return arguments.length ? (keys = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(__WEBPACK_IMPORTED_MODULE_0__array__.a.call(_)), \n            stack) : keys;\n        }, stack.value = function(_) {\n            return arguments.length ? (value = \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(+_), \n            stack) : value;\n        }, stack.order = function(_) {\n            return arguments.length ? (order = null == _ ? __WEBPACK_IMPORTED_MODULE_3__order_none__.a : \"function\" == typeof _ ? _ : Object(__WEBPACK_IMPORTED_MODULE_1__constant__.a)(__WEBPACK_IMPORTED_MODULE_0__array__.a.call(_)), \n            stack) : order;\n        }, stack.offset = function(_) {\n            return arguments.length ? (offset = null == _ ? __WEBPACK_IMPORTED_MODULE_2__offset_none__.a : _, \n            stack) : offset;\n        }, stack;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(86);\n    __webpack_exports__.a = function(series, order) {\n        if ((n = series.length) > 0) {\n            for (var i, n, y, j = 0, m = series[0].length; j < m; ++j) {\n                for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;\n                if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;\n            }\n            Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series, order);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(86);\n    __webpack_exports__.a = function(series, order) {\n        if ((n = series.length) > 0) {\n            for (var n, j = 0, s0 = series[order[0]], m = s0.length; j < m; ++j) {\n                for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;\n                s0[j][1] += s0[j][0] = -y / 2;\n            }\n            Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series, order);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__none__ = __webpack_require__(86);\n    __webpack_exports__.a = function(series, order) {\n        if ((n = series.length) > 0 && (m = (s0 = series[order[0]]).length) > 0) {\n            for (var s0, m, n, y = 0, j = 1; j < m; ++j) {\n                for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {\n                    for (var si = series[order[i]], sij0 = si[j][1] || 0, sij1 = si[j - 1][1] || 0, s3 = (sij0 - sij1) / 2, k = 0; k < i; ++k) {\n                        var sk = series[order[k]];\n                        s3 += (sk[j][1] || 0) - (sk[j - 1][1] || 0);\n                    }\n                    s1 += sij0, s2 += s3 * sij0;\n                }\n                s0[j - 1][1] += s0[j - 1][0] = y, s1 && (y -= s2 / s1);\n            }\n            s0[j - 1][1] += s0[j - 1][0] = y, Object(__WEBPACK_IMPORTED_MODULE_0__none__.a)(series, order);\n        }\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(186);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(87), __webpack_require__(186);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(87);\n}, function(module, exports, __webpack_require__) {\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n        var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other);\n        objTag = objTag == argsTag ? objectTag : objTag, othTag = othTag == argsTag ? objectTag : othTag;\n        var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;\n        if (isSameTag && isBuffer(object)) {\n            if (!isBuffer(other)) return !1;\n            objIsArr = !0, objIsObj = !1;\n        }\n        if (isSameTag && !objIsObj) return stack || (stack = new Stack()), objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n        if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n            var objIsWrapped = objIsObj && hasOwnProperty.call(object, \"__wrapped__\"), othIsWrapped = othIsObj && hasOwnProperty.call(other, \"__wrapped__\");\n            if (objIsWrapped || othIsWrapped) {\n                var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;\n                return stack || (stack = new Stack()), equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n            }\n        }\n        return !!isSameTag && (stack || (stack = new Stack()), equalObjects(object, other, bitmask, customizer, equalFunc, stack));\n    }\n    var Stack = __webpack_require__(289), equalArrays = __webpack_require__(294), equalByTag = __webpack_require__(689), equalObjects = __webpack_require__(693), getTag = __webpack_require__(708), isArray = __webpack_require__(34), isBuffer = __webpack_require__(299), isTypedArray = __webpack_require__(301), COMPARE_PARTIAL_FLAG = 1, argsTag = \"[object Arguments]\", arrayTag = \"[object Array]\", objectTag = \"[object Object]\", objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = baseIsEqualDeep;\n}, function(module, exports) {\n    function listCacheClear() {\n        this.__data__ = [], this.size = 0;\n    }\n    module.exports = listCacheClear;\n}, function(module, exports, __webpack_require__) {\n    function listCacheDelete(key) {\n        var data = this.__data__, index = assocIndexOf(data, key);\n        return !(index < 0) && (index == data.length - 1 ? data.pop() : splice.call(data, index, 1), \n        --this.size, !0);\n    }\n    var assocIndexOf = __webpack_require__(127), arrayProto = Array.prototype, splice = arrayProto.splice;\n    module.exports = listCacheDelete;\n}, function(module, exports, __webpack_require__) {\n    function listCacheGet(key) {\n        var data = this.__data__, index = assocIndexOf(data, key);\n        return index < 0 ? void 0 : data[index][1];\n    }\n    var assocIndexOf = __webpack_require__(127);\n    module.exports = listCacheGet;\n}, function(module, exports, __webpack_require__) {\n    function listCacheHas(key) {\n        return assocIndexOf(this.__data__, key) > -1;\n    }\n    var assocIndexOf = __webpack_require__(127);\n    module.exports = listCacheHas;\n}, function(module, exports, __webpack_require__) {\n    function listCacheSet(key, value) {\n        var data = this.__data__, index = assocIndexOf(data, key);\n        return index < 0 ? (++this.size, data.push([ key, value ])) : data[index][1] = value, \n        this;\n    }\n    var assocIndexOf = __webpack_require__(127);\n    module.exports = listCacheSet;\n}, function(module, exports, __webpack_require__) {\n    function stackClear() {\n        this.__data__ = new ListCache(), this.size = 0;\n    }\n    var ListCache = __webpack_require__(126);\n    module.exports = stackClear;\n}, function(module, exports) {\n    function stackDelete(key) {\n        var data = this.__data__, result = data.delete(key);\n        return this.size = data.size, result;\n    }\n    module.exports = stackDelete;\n}, function(module, exports) {\n    function stackGet(key) {\n        return this.__data__.get(key);\n    }\n    module.exports = stackGet;\n}, function(module, exports) {\n    function stackHas(key) {\n        return this.__data__.has(key);\n    }\n    module.exports = stackHas;\n}, function(module, exports, __webpack_require__) {\n    function stackSet(key, value) {\n        var data = this.__data__;\n        if (data instanceof ListCache) {\n            var pairs = data.__data__;\n            if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) return pairs.push([ key, value ]), \n            this.size = ++data.size, this;\n            data = this.__data__ = new MapCache(pairs);\n        }\n        return data.set(key, value), this.size = data.size, this;\n    }\n    var ListCache = __webpack_require__(126), Map = __webpack_require__(188), MapCache = __webpack_require__(190), LARGE_ARRAY_SIZE = 200;\n    module.exports = stackSet;\n}, function(module, exports, __webpack_require__) {\n    function baseIsNative(value) {\n        return !(!isObject(value) || isMasked(value)) && (isFunction(value) ? reIsNative : reIsHostCtor).test(toSource(value));\n    }\n    var isFunction = __webpack_require__(291), isMasked = __webpack_require__(671), isObject = __webpack_require__(189), toSource = __webpack_require__(293), reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g, reIsHostCtor = /^\\[object .+?Constructor\\]$/, funcProto = Function.prototype, objectProto = Object.prototype, funcToString = funcProto.toString, hasOwnProperty = objectProto.hasOwnProperty, reIsNative = RegExp(\"^\" + funcToString.call(hasOwnProperty).replace(reRegExpChar, \"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, \"$1.*?\") + \"$\");\n    module.exports = baseIsNative;\n}, function(module, exports, __webpack_require__) {\n    function getRawTag(value) {\n        var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];\n        try {\n            value[symToStringTag] = void 0;\n            var unmasked = !0;\n        } catch (e) {}\n        var result = nativeObjectToString.call(value);\n        return unmasked && (isOwn ? value[symToStringTag] = tag : delete value[symToStringTag]), \n        result;\n    }\n    var Symbol = __webpack_require__(128), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty, nativeObjectToString = objectProto.toString, symToStringTag = Symbol ? Symbol.toStringTag : void 0;\n    module.exports = getRawTag;\n}, function(module, exports) {\n    function objectToString(value) {\n        return nativeObjectToString.call(value);\n    }\n    var objectProto = Object.prototype, nativeObjectToString = objectProto.toString;\n    module.exports = objectToString;\n}, function(module, exports, __webpack_require__) {\n    function isMasked(func) {\n        return !!maskSrcKey && maskSrcKey in func;\n    }\n    var coreJsData = __webpack_require__(672), maskSrcKey = function() {\n        var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || \"\");\n        return uid ? \"Symbol(src)_1.\" + uid : \"\";\n    }();\n    module.exports = isMasked;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(36), coreJsData = root[\"__core-js_shared__\"];\n    module.exports = coreJsData;\n}, function(module, exports) {\n    function getValue(object, key) {\n        return null == object ? void 0 : object[key];\n    }\n    module.exports = getValue;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheClear() {\n        this.size = 0, this.__data__ = {\n            hash: new Hash(),\n            map: new (Map || ListCache)(),\n            string: new Hash()\n        };\n    }\n    var Hash = __webpack_require__(675), ListCache = __webpack_require__(126), Map = __webpack_require__(188);\n    module.exports = mapCacheClear;\n}, function(module, exports, __webpack_require__) {\n    function Hash(entries) {\n        var index = -1, length = null == entries ? 0 : entries.length;\n        for (this.clear(); ++index < length; ) {\n            var entry = entries[index];\n            this.set(entry[0], entry[1]);\n        }\n    }\n    var hashClear = __webpack_require__(676), hashDelete = __webpack_require__(677), hashGet = __webpack_require__(678), hashHas = __webpack_require__(679), hashSet = __webpack_require__(680);\n    Hash.prototype.clear = hashClear, Hash.prototype.delete = hashDelete, Hash.prototype.get = hashGet, \n    Hash.prototype.has = hashHas, Hash.prototype.set = hashSet, module.exports = Hash;\n}, function(module, exports, __webpack_require__) {\n    function hashClear() {\n        this.__data__ = nativeCreate ? nativeCreate(null) : {}, this.size = 0;\n    }\n    var nativeCreate = __webpack_require__(129);\n    module.exports = hashClear;\n}, function(module, exports) {\n    function hashDelete(key) {\n        var result = this.has(key) && delete this.__data__[key];\n        return this.size -= result ? 1 : 0, result;\n    }\n    module.exports = hashDelete;\n}, function(module, exports, __webpack_require__) {\n    function hashGet(key) {\n        var data = this.__data__;\n        if (nativeCreate) {\n            var result = data[key];\n            return result === HASH_UNDEFINED ? void 0 : result;\n        }\n        return hasOwnProperty.call(data, key) ? data[key] : void 0;\n    }\n    var nativeCreate = __webpack_require__(129), HASH_UNDEFINED = \"__lodash_hash_undefined__\", objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = hashGet;\n}, function(module, exports, __webpack_require__) {\n    function hashHas(key) {\n        var data = this.__data__;\n        return nativeCreate ? void 0 !== data[key] : hasOwnProperty.call(data, key);\n    }\n    var nativeCreate = __webpack_require__(129), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = hashHas;\n}, function(module, exports, __webpack_require__) {\n    function hashSet(key, value) {\n        var data = this.__data__;\n        return this.size += this.has(key) ? 0 : 1, data[key] = nativeCreate && void 0 === value ? HASH_UNDEFINED : value, \n        this;\n    }\n    var nativeCreate = __webpack_require__(129), HASH_UNDEFINED = \"__lodash_hash_undefined__\";\n    module.exports = hashSet;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheDelete(key) {\n        var result = getMapData(this, key).delete(key);\n        return this.size -= result ? 1 : 0, result;\n    }\n    var getMapData = __webpack_require__(130);\n    module.exports = mapCacheDelete;\n}, function(module, exports) {\n    function isKeyable(value) {\n        var type = typeof value;\n        return \"string\" == type || \"number\" == type || \"symbol\" == type || \"boolean\" == type ? \"__proto__\" !== value : null === value;\n    }\n    module.exports = isKeyable;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheGet(key) {\n        return getMapData(this, key).get(key);\n    }\n    var getMapData = __webpack_require__(130);\n    module.exports = mapCacheGet;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheHas(key) {\n        return getMapData(this, key).has(key);\n    }\n    var getMapData = __webpack_require__(130);\n    module.exports = mapCacheHas;\n}, function(module, exports, __webpack_require__) {\n    function mapCacheSet(key, value) {\n        var data = getMapData(this, key), size = data.size;\n        return data.set(key, value), this.size += data.size == size ? 0 : 1, this;\n    }\n    var getMapData = __webpack_require__(130);\n    module.exports = mapCacheSet;\n}, function(module, exports) {\n    function setCacheAdd(value) {\n        return this.__data__.set(value, HASH_UNDEFINED), this;\n    }\n    var HASH_UNDEFINED = \"__lodash_hash_undefined__\";\n    module.exports = setCacheAdd;\n}, function(module, exports) {\n    function setCacheHas(value) {\n        return this.__data__.has(value);\n    }\n    module.exports = setCacheHas;\n}, function(module, exports) {\n    function arraySome(array, predicate) {\n        for (var index = -1, length = null == array ? 0 : array.length; ++index < length; ) if (predicate(array[index], index, array)) return !0;\n        return !1;\n    }\n    module.exports = arraySome;\n}, function(module, exports, __webpack_require__) {\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n        switch (tag) {\n          case dataViewTag:\n            if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) return !1;\n            object = object.buffer, other = other.buffer;\n\n          case arrayBufferTag:\n            return !(object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other)));\n\n          case boolTag:\n          case dateTag:\n          case numberTag:\n            return eq(+object, +other);\n\n          case errorTag:\n            return object.name == other.name && object.message == other.message;\n\n          case regexpTag:\n          case stringTag:\n            return object == other + \"\";\n\n          case mapTag:\n            var convert = mapToArray;\n\n          case setTag:\n            var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n            if (convert || (convert = setToArray), object.size != other.size && !isPartial) return !1;\n            var stacked = stack.get(object);\n            if (stacked) return stacked == other;\n            bitmask |= COMPARE_UNORDERED_FLAG, stack.set(object, other);\n            var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n            return stack.delete(object), result;\n\n          case symbolTag:\n            if (symbolValueOf) return symbolValueOf.call(object) == symbolValueOf.call(other);\n        }\n        return !1;\n    }\n    var Symbol = __webpack_require__(128), Uint8Array = __webpack_require__(690), eq = __webpack_require__(290), equalArrays = __webpack_require__(294), mapToArray = __webpack_require__(691), setToArray = __webpack_require__(692), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2, boolTag = \"[object Boolean]\", dateTag = \"[object Date]\", errorTag = \"[object Error]\", mapTag = \"[object Map]\", numberTag = \"[object Number]\", regexpTag = \"[object RegExp]\", setTag = \"[object Set]\", stringTag = \"[object String]\", symbolTag = \"[object Symbol]\", arrayBufferTag = \"[object ArrayBuffer]\", dataViewTag = \"[object DataView]\", symbolProto = Symbol ? Symbol.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;\n    module.exports = equalByTag;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(36), Uint8Array = root.Uint8Array;\n    module.exports = Uint8Array;\n}, function(module, exports) {\n    function mapToArray(map) {\n        var index = -1, result = Array(map.size);\n        return map.forEach(function(value, key) {\n            result[++index] = [ key, value ];\n        }), result;\n    }\n    module.exports = mapToArray;\n}, function(module, exports) {\n    function setToArray(set) {\n        var index = -1, result = Array(set.size);\n        return set.forEach(function(value) {\n            result[++index] = value;\n        }), result;\n    }\n    module.exports = setToArray;\n}, function(module, exports, __webpack_require__) {\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length;\n        if (objLength != getAllKeys(other).length && !isPartial) return !1;\n        for (var index = objLength; index--; ) {\n            var key = objProps[index];\n            if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) return !1;\n        }\n        var stacked = stack.get(object);\n        if (stacked && stack.get(other)) return stacked == other;\n        var result = !0;\n        stack.set(object, other), stack.set(other, object);\n        for (var skipCtor = isPartial; ++index < objLength; ) {\n            key = objProps[index];\n            var objValue = object[key], othValue = other[key];\n            if (customizer) var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);\n            if (!(void 0 === compared ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {\n                result = !1;\n                break;\n            }\n            skipCtor || (skipCtor = \"constructor\" == key);\n        }\n        if (result && !skipCtor) {\n            var objCtor = object.constructor, othCtor = other.constructor;\n            objCtor != othCtor && \"constructor\" in object && \"constructor\" in other && !(\"function\" == typeof objCtor && objCtor instanceof objCtor && \"function\" == typeof othCtor && othCtor instanceof othCtor) && (result = !1);\n        }\n        return stack.delete(object), stack.delete(other), result;\n    }\n    var getAllKeys = __webpack_require__(694), COMPARE_PARTIAL_FLAG = 1, objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = equalObjects;\n}, function(module, exports, __webpack_require__) {\n    function getAllKeys(object) {\n        return baseGetAllKeys(object, keys, getSymbols);\n    }\n    var baseGetAllKeys = __webpack_require__(695), getSymbols = __webpack_require__(697), keys = __webpack_require__(191);\n    module.exports = getAllKeys;\n}, function(module, exports, __webpack_require__) {\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n        var result = keysFunc(object);\n        return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n    var arrayPush = __webpack_require__(696), isArray = __webpack_require__(34);\n    module.exports = baseGetAllKeys;\n}, function(module, exports) {\n    function arrayPush(array, values) {\n        for (var index = -1, length = values.length, offset = array.length; ++index < length; ) array[offset + index] = values[index];\n        return array;\n    }\n    module.exports = arrayPush;\n}, function(module, exports, __webpack_require__) {\n    var arrayFilter = __webpack_require__(297), stubArray = __webpack_require__(698), objectProto = Object.prototype, propertyIsEnumerable = objectProto.propertyIsEnumerable, nativeGetSymbols = Object.getOwnPropertySymbols, getSymbols = nativeGetSymbols ? function(object) {\n        return null == object ? [] : (object = Object(object), arrayFilter(nativeGetSymbols(object), function(symbol) {\n            return propertyIsEnumerable.call(object, symbol);\n        }));\n    } : stubArray;\n    module.exports = getSymbols;\n}, function(module, exports) {\n    function stubArray() {\n        return [];\n    }\n    module.exports = stubArray;\n}, function(module, exports, __webpack_require__) {\n    function arrayLikeKeys(value, inherited) {\n        var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length;\n        for (var key in value) !inherited && !hasOwnProperty.call(value, key) || skipIndexes && (\"length\" == key || isBuff && (\"offset\" == key || \"parent\" == key) || isType && (\"buffer\" == key || \"byteLength\" == key || \"byteOffset\" == key) || isIndex(key, length)) || result.push(key);\n        return result;\n    }\n    var baseTimes = __webpack_require__(700), isArguments = __webpack_require__(298), isArray = __webpack_require__(34), isBuffer = __webpack_require__(299), isIndex = __webpack_require__(300), isTypedArray = __webpack_require__(301), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = arrayLikeKeys;\n}, function(module, exports) {\n    function baseTimes(n, iteratee) {\n        for (var index = -1, result = Array(n); ++index < n; ) result[index] = iteratee(index);\n        return result;\n    }\n    module.exports = baseTimes;\n}, function(module, exports, __webpack_require__) {\n    function baseIsArguments(value) {\n        return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n    var baseGetTag = __webpack_require__(60), isObjectLike = __webpack_require__(43), argsTag = \"[object Arguments]\";\n    module.exports = baseIsArguments;\n}, function(module, exports) {\n    function stubFalse() {\n        return !1;\n    }\n    module.exports = stubFalse;\n}, function(module, exports, __webpack_require__) {\n    function baseIsTypedArray(value) {\n        return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n    var baseGetTag = __webpack_require__(60), isLength = __webpack_require__(192), isObjectLike = __webpack_require__(43), typedArrayTags = {};\n    typedArrayTags[\"[object Float32Array]\"] = typedArrayTags[\"[object Float64Array]\"] = typedArrayTags[\"[object Int8Array]\"] = typedArrayTags[\"[object Int16Array]\"] = typedArrayTags[\"[object Int32Array]\"] = typedArrayTags[\"[object Uint8Array]\"] = typedArrayTags[\"[object Uint8ClampedArray]\"] = typedArrayTags[\"[object Uint16Array]\"] = typedArrayTags[\"[object Uint32Array]\"] = !0, \n    typedArrayTags[\"[object Arguments]\"] = typedArrayTags[\"[object Array]\"] = typedArrayTags[\"[object ArrayBuffer]\"] = typedArrayTags[\"[object Boolean]\"] = typedArrayTags[\"[object DataView]\"] = typedArrayTags[\"[object Date]\"] = typedArrayTags[\"[object Error]\"] = typedArrayTags[\"[object Function]\"] = typedArrayTags[\"[object Map]\"] = typedArrayTags[\"[object Number]\"] = typedArrayTags[\"[object Object]\"] = typedArrayTags[\"[object RegExp]\"] = typedArrayTags[\"[object Set]\"] = typedArrayTags[\"[object String]\"] = typedArrayTags[\"[object WeakMap]\"] = !1, \n    module.exports = baseIsTypedArray;\n}, function(module, exports, __webpack_require__) {\n    (function(module) {\n        var freeGlobal = __webpack_require__(292), freeExports = \"object\" == typeof exports && exports && !exports.nodeType && exports, freeModule = freeExports && \"object\" == typeof module && module && !module.nodeType && module, moduleExports = freeModule && freeModule.exports === freeExports, freeProcess = moduleExports && freeGlobal.process, nodeUtil = function() {\n            try {\n                return freeProcess && freeProcess.binding && freeProcess.binding(\"util\");\n            } catch (e) {}\n        }();\n        module.exports = nodeUtil;\n    }).call(exports, __webpack_require__(131)(module));\n}, function(module, exports, __webpack_require__) {\n    function baseKeys(object) {\n        if (!isPrototype(object)) return nativeKeys(object);\n        var result = [];\n        for (var key in Object(object)) hasOwnProperty.call(object, key) && \"constructor\" != key && result.push(key);\n        return result;\n    }\n    var isPrototype = __webpack_require__(706), nativeKeys = __webpack_require__(707), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = baseKeys;\n}, function(module, exports) {\n    function isPrototype(value) {\n        var Ctor = value && value.constructor;\n        return value === (\"function\" == typeof Ctor && Ctor.prototype || objectProto);\n    }\n    var objectProto = Object.prototype;\n    module.exports = isPrototype;\n}, function(module, exports, __webpack_require__) {\n    var overArg = __webpack_require__(303), nativeKeys = overArg(Object.keys, Object);\n    module.exports = nativeKeys;\n}, function(module, exports, __webpack_require__) {\n    var DataView = __webpack_require__(709), Map = __webpack_require__(188), Promise = __webpack_require__(710), Set = __webpack_require__(711), WeakMap = __webpack_require__(712), baseGetTag = __webpack_require__(60), toSource = __webpack_require__(293), dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap), getTag = baseGetTag;\n    (DataView && \"[object DataView]\" != getTag(new DataView(new ArrayBuffer(1))) || Map && \"[object Map]\" != getTag(new Map()) || Promise && \"[object Promise]\" != getTag(Promise.resolve()) || Set && \"[object Set]\" != getTag(new Set()) || WeakMap && \"[object WeakMap]\" != getTag(new WeakMap())) && (getTag = function(value) {\n        var result = baseGetTag(value), Ctor = \"[object Object]\" == result ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : \"\";\n        if (ctorString) switch (ctorString) {\n          case dataViewCtorString:\n            return \"[object DataView]\";\n\n          case mapCtorString:\n            return \"[object Map]\";\n\n          case promiseCtorString:\n            return \"[object Promise]\";\n\n          case setCtorString:\n            return \"[object Set]\";\n\n          case weakMapCtorString:\n            return \"[object WeakMap]\";\n        }\n        return result;\n    }), module.exports = getTag;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(59), root = __webpack_require__(36), DataView = getNative(root, \"DataView\");\n    module.exports = DataView;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(59), root = __webpack_require__(36), Promise = getNative(root, \"Promise\");\n    module.exports = Promise;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(59), root = __webpack_require__(36), Set = getNative(root, \"Set\");\n    module.exports = Set;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(59), root = __webpack_require__(36), WeakMap = getNative(root, \"WeakMap\");\n    module.exports = WeakMap;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _toArray(arr) {\n        return Array.isArray(arr) ? arr : Array.from(arr);\n    }\n    function createAnimateManager() {\n        var currStyle = {}, handleChange = function() {\n            return null;\n        }, shouldStop = !1, setStyle = function setStyle(_style) {\n            if (!shouldStop) {\n                if (Array.isArray(_style)) {\n                    if (!_style.length) return;\n                    var styles = _style, _styles = _toArray(styles), curr = _styles[0], restStyles = _styles.slice(1);\n                    return \"number\" == typeof curr ? void (0, _setRafTimeout2.default)(setStyle.bind(null, restStyles), curr) : (setStyle(curr), \n                    void (0, _setRafTimeout2.default)(setStyle.bind(null, restStyles)));\n                }\n                \"object\" === (void 0 === _style ? \"undefined\" : _typeof(_style)) && (currStyle = _style, \n                handleChange(currStyle)), \"function\" == typeof _style && _style();\n            }\n        };\n        return {\n            stop: function() {\n                shouldStop = !0;\n            },\n            start: function(style) {\n                shouldStop = !1, setStyle(style);\n            },\n            subscribe: function(_handleChange) {\n                return handleChange = _handleChange, function() {\n                    handleChange = function() {\n                        return null;\n                    };\n                };\n            }\n        };\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n    exports.default = createAnimateManager;\n    var _setRafTimeout = __webpack_require__(714), _setRafTimeout2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_setRafTimeout);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function setRafTimeout(callback) {\n        var timeout = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, currTime = -1, shouldUpdate = function shouldUpdate(now) {\n            currTime < 0 && (currTime = now), now - currTime > timeout ? (callback(now), currTime = -1) : (0, \n            _raf2.default)(shouldUpdate);\n        };\n        (0, _raf2.default)(shouldUpdate);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.default = setRafTimeout;\n    var _raf = __webpack_require__(304), _raf2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_raf);\n}, function(module, exports, __webpack_require__) {\n    (function(process) {\n        (function() {\n            var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n            \"undefined\" != typeof performance && null !== performance && performance.now ? module.exports = function() {\n                return performance.now();\n            } : void 0 !== process && null !== process && process.hrtime ? (module.exports = function() {\n                return (getNanoSeconds() - nodeLoadTime) / 1e6;\n            }, hrtime = process.hrtime, getNanoSeconds = function() {\n                var hr;\n                return hr = hrtime(), 1e9 * hr[0] + hr[1];\n            }, moduleLoadTime = getNanoSeconds(), upTime = 1e9 * process.uptime(), nodeLoadTime = moduleLoadTime - upTime) : Date.now ? (module.exports = function() {\n                return Date.now() - loadTime;\n            }, loadTime = Date.now()) : (module.exports = function() {\n                return new Date().getTime() - loadTime;\n            }, loadTime = new Date().getTime());\n        }).call(this);\n    }).call(exports, __webpack_require__(2));\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function shallowEqual(objA, objB) {\n        if (objA === objB) return !0;\n        if (\"object\" !== (void 0 === objA ? \"undefined\" : _typeof(objA)) || null === objA || \"object\" !== (void 0 === objB ? \"undefined\" : _typeof(objB)) || null === objB) return !1;\n        var keysA = Object.keys(objA), keysB = Object.keys(objB);\n        if (keysA.length !== keysB.length) return !1;\n        for (var bHasOwnProperty = hasOwnProperty.bind(objB), i = 0; i < keysA.length; i++) {\n            var keyA = keysA[i];\n            if (objA[keyA] !== objB[keyA]) if ((0, _isArray3.default)(objA[keyA])) {\n                if (!(0, _isArray3.default)(objB[keyA]) || objA[keyA].length !== objB[keyA].length) return !1;\n                if (!(0, _isEqual3.default)(objA[keyA], objB[keyA])) return !1;\n            } else if ((0, _isPlainObject3.default)(objA[keyA])) {\n                if (!(0, _isPlainObject3.default)(objB[keyA]) || !(0, _isEqual3.default)(objA[keyA], objB[keyA])) return !1;\n            } else if (!bHasOwnProperty(keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) return !1;\n        }\n        return !0;\n    }\n    function shallowCompare(instance, nextProps, nextState) {\n        return !shallowEqual(instance.props, nextProps) || !shallowEqual(instance.state, nextState);\n    }\n    function shouldComponentUpdate(nextProps, nextState) {\n        return shallowCompare(this, nextProps, nextState);\n    }\n    function pureRenderDecorator(component) {\n        component.prototype.shouldComponentUpdate = shouldComponentUpdate;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.shallowEqual = void 0;\n    var _isPlainObject2 = __webpack_require__(717), _isPlainObject3 = _interopRequireDefault(_isPlainObject2), _isEqual2 = __webpack_require__(288), _isEqual3 = _interopRequireDefault(_isEqual2), _isArray2 = __webpack_require__(34), _isArray3 = _interopRequireDefault(_isArray2), _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function(obj) {\n        return typeof obj;\n    } : function(obj) {\n        return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n    exports.shallowEqual = shallowEqual, exports.default = pureRenderDecorator;\n}, function(module, exports, __webpack_require__) {\n    function isPlainObject(value) {\n        if (!isObjectLike(value) || baseGetTag(value) != objectTag) return !1;\n        var proto = getPrototype(value);\n        if (null === proto) return !0;\n        var Ctor = hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n        return \"function\" == typeof Ctor && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;\n    }\n    var baseGetTag = __webpack_require__(60), getPrototype = __webpack_require__(718), isObjectLike = __webpack_require__(43), objectTag = \"[object Object]\", funcProto = Function.prototype, objectProto = Object.prototype, funcToString = funcProto.toString, hasOwnProperty = objectProto.hasOwnProperty, objectCtorString = funcToString.call(Object);\n    module.exports = isPlainObject;\n}, function(module, exports, __webpack_require__) {\n    var overArg = __webpack_require__(303), getPrototype = overArg(Object.getPrototypeOf, Object);\n    module.exports = getPrototype;\n}, function(module, exports, __webpack_require__) {\n    var arrayMap = __webpack_require__(194), baseIntersection = __webpack_require__(720), baseRest = __webpack_require__(727), castArrayLikeObject = __webpack_require__(735), intersection = baseRest(function(arrays) {\n        var mapped = arrayMap(arrays, castArrayLikeObject);\n        return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];\n    });\n    module.exports = intersection;\n}, function(module, exports, __webpack_require__) {\n    function baseIntersection(arrays, iteratee, comparator) {\n        for (var includes = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array(othLength), maxLength = 1 / 0, result = []; othIndex--; ) {\n            var array = arrays[othIndex];\n            othIndex && iteratee && (array = arrayMap(array, baseUnary(iteratee))), maxLength = nativeMin(array.length, maxLength), \n            caches[othIndex] = !comparator && (iteratee || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : void 0;\n        }\n        array = arrays[0];\n        var index = -1, seen = caches[0];\n        outer: for (;++index < length && result.length < maxLength; ) {\n            var value = array[index], computed = iteratee ? iteratee(value) : value;\n            if (value = comparator || 0 !== value ? value : 0, !(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) {\n                for (othIndex = othLength; --othIndex; ) {\n                    var cache = caches[othIndex];\n                    if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) continue outer;\n                }\n                seen && seen.push(computed), result.push(value);\n            }\n        }\n        return result;\n    }\n    var SetCache = __webpack_require__(295), arrayIncludes = __webpack_require__(721), arrayIncludesWith = __webpack_require__(726), arrayMap = __webpack_require__(194), baseUnary = __webpack_require__(302), cacheHas = __webpack_require__(296), nativeMin = Math.min;\n    module.exports = baseIntersection;\n}, function(module, exports, __webpack_require__) {\n    function arrayIncludes(array, value) {\n        return !!(null == array ? 0 : array.length) && baseIndexOf(array, value, 0) > -1;\n    }\n    var baseIndexOf = __webpack_require__(722);\n    module.exports = arrayIncludes;\n}, function(module, exports, __webpack_require__) {\n    function baseIndexOf(array, value, fromIndex) {\n        return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);\n    }\n    var baseFindIndex = __webpack_require__(723), baseIsNaN = __webpack_require__(724), strictIndexOf = __webpack_require__(725);\n    module.exports = baseIndexOf;\n}, function(module, exports) {\n    function baseFindIndex(array, predicate, fromIndex, fromRight) {\n        for (var length = array.length, index = fromIndex + (fromRight ? 1 : -1); fromRight ? index-- : ++index < length; ) if (predicate(array[index], index, array)) return index;\n        return -1;\n    }\n    module.exports = baseFindIndex;\n}, function(module, exports) {\n    function baseIsNaN(value) {\n        return value !== value;\n    }\n    module.exports = baseIsNaN;\n}, function(module, exports) {\n    function strictIndexOf(array, value, fromIndex) {\n        for (var index = fromIndex - 1, length = array.length; ++index < length; ) if (array[index] === value) return index;\n        return -1;\n    }\n    module.exports = strictIndexOf;\n}, function(module, exports) {\n    function arrayIncludesWith(array, value, comparator) {\n        for (var index = -1, length = null == array ? 0 : array.length; ++index < length; ) if (comparator(value, array[index])) return !0;\n        return !1;\n    }\n    module.exports = arrayIncludesWith;\n}, function(module, exports, __webpack_require__) {\n    function baseRest(func, start) {\n        return setToString(overRest(func, start, identity), func + \"\");\n    }\n    var identity = __webpack_require__(195), overRest = __webpack_require__(728), setToString = __webpack_require__(730);\n    module.exports = baseRest;\n}, function(module, exports, __webpack_require__) {\n    function overRest(func, start, transform) {\n        return start = nativeMax(void 0 === start ? func.length - 1 : start, 0), function() {\n            for (var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array(length); ++index < length; ) array[index] = args[start + index];\n            index = -1;\n            for (var otherArgs = Array(start + 1); ++index < start; ) otherArgs[index] = args[index];\n            return otherArgs[start] = transform(array), apply(func, this, otherArgs);\n        };\n    }\n    var apply = __webpack_require__(729), nativeMax = Math.max;\n    module.exports = overRest;\n}, function(module, exports) {\n    function apply(func, thisArg, args) {\n        switch (args.length) {\n          case 0:\n            return func.call(thisArg);\n\n          case 1:\n            return func.call(thisArg, args[0]);\n\n          case 2:\n            return func.call(thisArg, args[0], args[1]);\n\n          case 3:\n            return func.call(thisArg, args[0], args[1], args[2]);\n        }\n        return func.apply(thisArg, args);\n    }\n    module.exports = apply;\n}, function(module, exports, __webpack_require__) {\n    var baseSetToString = __webpack_require__(731), shortOut = __webpack_require__(734), setToString = shortOut(baseSetToString);\n    module.exports = setToString;\n}, function(module, exports, __webpack_require__) {\n    var constant = __webpack_require__(732), defineProperty = __webpack_require__(733), identity = __webpack_require__(195), baseSetToString = defineProperty ? function(func, string) {\n        return defineProperty(func, \"toString\", {\n            configurable: !0,\n            enumerable: !1,\n            value: constant(string),\n            writable: !0\n        });\n    } : identity;\n    module.exports = baseSetToString;\n}, function(module, exports) {\n    function constant(value) {\n        return function() {\n            return value;\n        };\n    }\n    module.exports = constant;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(59), defineProperty = function() {\n        try {\n            var func = getNative(Object, \"defineProperty\");\n            return func({}, \"\", {}), func;\n        } catch (e) {}\n    }();\n    module.exports = defineProperty;\n}, function(module, exports) {\n    function shortOut(func) {\n        var count = 0, lastCalled = 0;\n        return function() {\n            var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);\n            if (lastCalled = stamp, remaining > 0) {\n                if (++count >= HOT_COUNT) return arguments[0];\n            } else count = 0;\n            return func.apply(void 0, arguments);\n        };\n    }\n    var HOT_COUNT = 800, HOT_SPAN = 16, nativeNow = Date.now;\n    module.exports = shortOut;\n}, function(module, exports, __webpack_require__) {\n    function castArrayLikeObject(value) {\n        return isArrayLikeObject(value) ? value : [];\n    }\n    var isArrayLikeObject = __webpack_require__(736);\n    module.exports = castArrayLikeObject;\n}, function(module, exports, __webpack_require__) {\n    function isArrayLikeObject(value) {\n        return isObjectLike(value) && isArrayLike(value);\n    }\n    var isArrayLike = __webpack_require__(193), isObjectLike = __webpack_require__(43);\n    module.exports = isArrayLikeObject;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _filter2 = __webpack_require__(738), _filter3 = _interopRequireDefault(_filter2), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _slicedToArray = function() {\n        function sliceIterator(arr, i) {\n            var _arr = [], _n = !0, _d = !1, _e = void 0;\n            try {\n                for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value), \n                !i || _arr.length !== i); _n = !0) ;\n            } catch (err) {\n                _d = !0, _e = err;\n            } finally {\n                try {\n                    !_n && _i.return && _i.return();\n                } finally {\n                    if (_d) throw _e;\n                }\n            }\n            return _arr;\n        }\n        return function(arr, i) {\n            if (Array.isArray(arr)) return arr;\n            if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);\n            throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n        };\n    }(), _raf = __webpack_require__(304), _raf2 = _interopRequireDefault(_raf), _util = __webpack_require__(132), alpha = function(begin, end, k) {\n        return begin + (end - begin) * k;\n    }, needContinue = function(_ref) {\n        return _ref.from !== _ref.to;\n    }, calStepperVals = function calStepperVals(easing, preVals, steps) {\n        var nextStepVals = (0, _util.mapObject)(function(key, val) {\n            if (needContinue(val)) {\n                var _easing = easing(val.from, val.to, val.velocity), _easing2 = _slicedToArray(_easing, 2), newX = _easing2[0], newV = _easing2[1];\n                return _extends({}, val, {\n                    from: newX,\n                    velocity: newV\n                });\n            }\n            return val;\n        }, preVals);\n        return steps < 1 ? (0, _util.mapObject)(function(key, val) {\n            return needContinue(val) ? _extends({}, val, {\n                velocity: alpha(val.velocity, nextStepVals[key].velocity, steps),\n                from: alpha(val.from, nextStepVals[key].from, steps)\n            }) : val;\n        }, preVals) : calStepperVals(easing, nextStepVals, steps - 1);\n    };\n    exports.default = function(from, to, easing, duration, render) {\n        var interKeys = (0, _util.getIntersectionKeys)(from, to), timingStyle = interKeys.reduce(function(res, key) {\n            return _extends({}, res, _defineProperty({}, key, [ from[key], to[key] ]));\n        }, {}), stepperStyle = interKeys.reduce(function(res, key) {\n            return _extends({}, res, _defineProperty({}, key, {\n                from: from[key],\n                velocity: 0,\n                to: to[key]\n            }));\n        }, {}), cafId = -1, preTime = void 0, beginTime = void 0, update = function() {\n            return null;\n        }, getCurrStyle = function() {\n            return (0, _util.mapObject)(function(key, val) {\n                return val.from;\n            }, stepperStyle);\n        }, shouldStopAnimation = function() {\n            return !(0, _filter3.default)(stepperStyle, needContinue).length;\n        }, stepperUpdate = function(now) {\n            preTime || (preTime = now);\n            var deltaTime = now - preTime, steps = deltaTime / easing.dt;\n            stepperStyle = calStepperVals(easing, stepperStyle, steps), render(_extends({}, from, to, getCurrStyle())), \n            preTime = now, shouldStopAnimation() || (cafId = (0, _raf2.default)(update));\n        }, timingUpdate = function(now) {\n            beginTime || (beginTime = now);\n            var t = (now - beginTime) / duration, currStyle = (0, _util.mapObject)(function(key, val) {\n                return alpha.apply(void 0, _toConsumableArray(val).concat([ easing(t) ]));\n            }, timingStyle);\n            if (render(_extends({}, from, to, currStyle)), t < 1) cafId = (0, _raf2.default)(update); else {\n                var finalStyle = (0, _util.mapObject)(function(key, val) {\n                    return alpha.apply(void 0, _toConsumableArray(val).concat([ easing(1) ]));\n                }, timingStyle);\n                render(_extends({}, from, to, finalStyle));\n            }\n        };\n        return update = easing.isStepper ? stepperUpdate : timingUpdate, function() {\n            return (0, _raf2.default)(update), function() {\n                (0, _raf.cancel)(cafId);\n            };\n        };\n    };\n}, function(module, exports, __webpack_require__) {\n    function filter(collection, predicate) {\n        return (isArray(collection) ? arrayFilter : baseFilter)(collection, baseIteratee(predicate, 3));\n    }\n    var arrayFilter = __webpack_require__(297), baseFilter = __webpack_require__(739), baseIteratee = __webpack_require__(745), isArray = __webpack_require__(34);\n    module.exports = filter;\n}, function(module, exports, __webpack_require__) {\n    function baseFilter(collection, predicate) {\n        var result = [];\n        return baseEach(collection, function(value, index, collection) {\n            predicate(value, index, collection) && result.push(value);\n        }), result;\n    }\n    var baseEach = __webpack_require__(740);\n    module.exports = baseFilter;\n}, function(module, exports, __webpack_require__) {\n    var baseForOwn = __webpack_require__(741), createBaseEach = __webpack_require__(744), baseEach = createBaseEach(baseForOwn);\n    module.exports = baseEach;\n}, function(module, exports, __webpack_require__) {\n    function baseForOwn(object, iteratee) {\n        return object && baseFor(object, iteratee, keys);\n    }\n    var baseFor = __webpack_require__(742), keys = __webpack_require__(191);\n    module.exports = baseForOwn;\n}, function(module, exports, __webpack_require__) {\n    var createBaseFor = __webpack_require__(743), baseFor = createBaseFor();\n    module.exports = baseFor;\n}, function(module, exports) {\n    function createBaseFor(fromRight) {\n        return function(object, iteratee, keysFunc) {\n            for (var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; length--; ) {\n                var key = props[fromRight ? length : ++index];\n                if (!1 === iteratee(iterable[key], key, iterable)) break;\n            }\n            return object;\n        };\n    }\n    module.exports = createBaseFor;\n}, function(module, exports, __webpack_require__) {\n    function createBaseEach(eachFunc, fromRight) {\n        return function(collection, iteratee) {\n            if (null == collection) return collection;\n            if (!isArrayLike(collection)) return eachFunc(collection, iteratee);\n            for (var length = collection.length, index = fromRight ? length : -1, iterable = Object(collection); (fromRight ? index-- : ++index < length) && !1 !== iteratee(iterable[index], index, iterable); ) ;\n            return collection;\n        };\n    }\n    var isArrayLike = __webpack_require__(193);\n    module.exports = createBaseEach;\n}, function(module, exports, __webpack_require__) {\n    function baseIteratee(value) {\n        return \"function\" == typeof value ? value : null == value ? identity : \"object\" == typeof value ? isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value) : property(value);\n    }\n    var baseMatches = __webpack_require__(746), baseMatchesProperty = __webpack_require__(749), identity = __webpack_require__(195), isArray = __webpack_require__(34), property = __webpack_require__(759);\n    module.exports = baseIteratee;\n}, function(module, exports, __webpack_require__) {\n    function baseMatches(source) {\n        var matchData = getMatchData(source);\n        return 1 == matchData.length && matchData[0][2] ? matchesStrictComparable(matchData[0][0], matchData[0][1]) : function(object) {\n            return object === source || baseIsMatch(object, source, matchData);\n        };\n    }\n    var baseIsMatch = __webpack_require__(747), getMatchData = __webpack_require__(748), matchesStrictComparable = __webpack_require__(307);\n    module.exports = baseMatches;\n}, function(module, exports, __webpack_require__) {\n    function baseIsMatch(object, source, matchData, customizer) {\n        var index = matchData.length, length = index, noCustomizer = !customizer;\n        if (null == object) return !length;\n        for (object = Object(object); index--; ) {\n            var data = matchData[index];\n            if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) return !1;\n        }\n        for (;++index < length; ) {\n            data = matchData[index];\n            var key = data[0], objValue = object[key], srcValue = data[1];\n            if (noCustomizer && data[2]) {\n                if (void 0 === objValue && !(key in object)) return !1;\n            } else {\n                var stack = new Stack();\n                if (customizer) var result = customizer(objValue, srcValue, key, object, source, stack);\n                if (!(void 0 === result ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result)) return !1;\n            }\n        }\n        return !0;\n    }\n    var Stack = __webpack_require__(289), baseIsEqual = __webpack_require__(187), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;\n    module.exports = baseIsMatch;\n}, function(module, exports, __webpack_require__) {\n    function getMatchData(object) {\n        for (var result = keys(object), length = result.length; length--; ) {\n            var key = result[length], value = object[key];\n            result[length] = [ key, value, isStrictComparable(value) ];\n        }\n        return result;\n    }\n    var isStrictComparable = __webpack_require__(306), keys = __webpack_require__(191);\n    module.exports = getMatchData;\n}, function(module, exports, __webpack_require__) {\n    function baseMatchesProperty(path, srcValue) {\n        return isKey(path) && isStrictComparable(srcValue) ? matchesStrictComparable(toKey(path), srcValue) : function(object) {\n            var objValue = get(object, path);\n            return void 0 === objValue && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n        };\n    }\n    var baseIsEqual = __webpack_require__(187), get = __webpack_require__(750), hasIn = __webpack_require__(756), isKey = __webpack_require__(196), isStrictComparable = __webpack_require__(306), matchesStrictComparable = __webpack_require__(307), toKey = __webpack_require__(133), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;\n    module.exports = baseMatchesProperty;\n}, function(module, exports, __webpack_require__) {\n    function get(object, path, defaultValue) {\n        var result = null == object ? void 0 : baseGet(object, path);\n        return void 0 === result ? defaultValue : result;\n    }\n    var baseGet = __webpack_require__(308);\n    module.exports = get;\n}, function(module, exports, __webpack_require__) {\n    var memoizeCapped = __webpack_require__(752), rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g, reEscapeChar = /\\\\(\\\\)?/g, stringToPath = memoizeCapped(function(string) {\n        var result = [];\n        return 46 === string.charCodeAt(0) && result.push(\"\"), string.replace(rePropName, function(match, number, quote, subString) {\n            result.push(quote ? subString.replace(reEscapeChar, \"$1\") : number || match);\n        }), result;\n    });\n    module.exports = stringToPath;\n}, function(module, exports, __webpack_require__) {\n    function memoizeCapped(func) {\n        var result = memoize(func, function(key) {\n            return cache.size === MAX_MEMOIZE_SIZE && cache.clear(), key;\n        }), cache = result.cache;\n        return result;\n    }\n    var memoize = __webpack_require__(753), MAX_MEMOIZE_SIZE = 500;\n    module.exports = memoizeCapped;\n}, function(module, exports, __webpack_require__) {\n    function memoize(func, resolver) {\n        if (\"function\" != typeof func || null != resolver && \"function\" != typeof resolver) throw new TypeError(FUNC_ERROR_TEXT);\n        var memoized = function() {\n            var args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;\n            if (cache.has(key)) return cache.get(key);\n            var result = func.apply(this, args);\n            return memoized.cache = cache.set(key, result) || cache, result;\n        };\n        return memoized.cache = new (memoize.Cache || MapCache)(), memoized;\n    }\n    var MapCache = __webpack_require__(190), FUNC_ERROR_TEXT = \"Expected a function\";\n    memoize.Cache = MapCache, module.exports = memoize;\n}, function(module, exports, __webpack_require__) {\n    function toString(value) {\n        return null == value ? \"\" : baseToString(value);\n    }\n    var baseToString = __webpack_require__(755);\n    module.exports = toString;\n}, function(module, exports, __webpack_require__) {\n    function baseToString(value) {\n        if (\"string\" == typeof value) return value;\n        if (isArray(value)) return arrayMap(value, baseToString) + \"\";\n        if (isSymbol(value)) return symbolToString ? symbolToString.call(value) : \"\";\n        var result = value + \"\";\n        return \"0\" == result && 1 / value == -INFINITY ? \"-0\" : result;\n    }\n    var Symbol = __webpack_require__(128), arrayMap = __webpack_require__(194), isArray = __webpack_require__(34), isSymbol = __webpack_require__(197), INFINITY = 1 / 0, symbolProto = Symbol ? Symbol.prototype : void 0, symbolToString = symbolProto ? symbolProto.toString : void 0;\n    module.exports = baseToString;\n}, function(module, exports, __webpack_require__) {\n    function hasIn(object, path) {\n        return null != object && hasPath(object, path, baseHasIn);\n    }\n    var baseHasIn = __webpack_require__(757), hasPath = __webpack_require__(758);\n    module.exports = hasIn;\n}, function(module, exports) {\n    function baseHasIn(object, key) {\n        return null != object && key in Object(object);\n    }\n    module.exports = baseHasIn;\n}, function(module, exports, __webpack_require__) {\n    function hasPath(object, path, hasFunc) {\n        path = castPath(path, object);\n        for (var index = -1, length = path.length, result = !1; ++index < length; ) {\n            var key = toKey(path[index]);\n            if (!(result = null != object && hasFunc(object, key))) break;\n            object = object[key];\n        }\n        return result || ++index != length ? result : !!(length = null == object ? 0 : object.length) && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));\n    }\n    var castPath = __webpack_require__(309), isArguments = __webpack_require__(298), isArray = __webpack_require__(34), isIndex = __webpack_require__(300), isLength = __webpack_require__(192), toKey = __webpack_require__(133);\n    module.exports = hasPath;\n}, function(module, exports, __webpack_require__) {\n    function property(path) {\n        return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n    var baseProperty = __webpack_require__(760), basePropertyDeep = __webpack_require__(761), isKey = __webpack_require__(196), toKey = __webpack_require__(133);\n    module.exports = property;\n}, function(module, exports) {\n    function baseProperty(key) {\n        return function(object) {\n            return null == object ? void 0 : object[key];\n        };\n    }\n    module.exports = baseProperty;\n}, function(module, exports, __webpack_require__) {\n    function basePropertyDeep(path) {\n        return function(object) {\n            return baseGet(object, path);\n        };\n    }\n    var baseGet = __webpack_require__(308);\n    module.exports = basePropertyDeep;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _class, _temp, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _TransitionGroup = __webpack_require__(255), _TransitionGroup2 = _interopRequireDefault(_TransitionGroup), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _AnimateGroupChild = __webpack_require__(763), _AnimateGroupChild2 = _interopRequireDefault(_AnimateGroupChild), AnimateGroup = (_temp = _class = function(_Component) {\n        function AnimateGroup() {\n            return _classCallCheck(this, AnimateGroup), _possibleConstructorReturn(this, (AnimateGroup.__proto__ || Object.getPrototypeOf(AnimateGroup)).apply(this, arguments));\n        }\n        return _inherits(AnimateGroup, _Component), _createClass(AnimateGroup, [ {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, component = _props.component, children = _props.children, appear = _props.appear, enter = _props.enter, leave = _props.leave;\n                return _react2.default.createElement(_TransitionGroup2.default, {\n                    component: component\n                }, _react.Children.map(children, function(child, index) {\n                    return _react2.default.createElement(_AnimateGroupChild2.default, {\n                        appearOptions: appear,\n                        enterOptions: enter,\n                        leaveOptions: leave,\n                        key: \"child-\" + index\n                    }, child);\n                }));\n            }\n        } ]), AnimateGroup;\n    }(_react.Component), _class.propTypes = {\n        appear: _propTypes2.default.object,\n        enter: _propTypes2.default.object,\n        leave: _propTypes2.default.object,\n        children: _propTypes2.default.oneOfType([ _propTypes2.default.array, _propTypes2.default.element ]),\n        component: _propTypes2.default.any\n    }, _class.defaultProps = {\n        component: \"span\"\n    }, _temp);\n    exports.default = AnimateGroup;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _class, _temp2, _isNumber2 = __webpack_require__(764), _isNumber3 = _interopRequireDefault(_isNumber2), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _Transition = __webpack_require__(166), _Transition2 = _interopRequireDefault(_Transition), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _Animate = __webpack_require__(287), _Animate2 = _interopRequireDefault(_Animate), parseDurationOfSingleTransition = function() {\n        var options = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, steps = options.steps, duration = options.duration;\n        return steps && steps.length ? steps.reduce(function(result, entry) {\n            return result + ((0, _isNumber3.default)(entry.duration) && entry.duration > 0 ? entry.duration : 0);\n        }, 0) : (0, _isNumber3.default)(duration) ? duration : 0;\n    }, AnimateGroupChild = (_temp2 = _class = function(_Component) {\n        function AnimateGroupChild() {\n            var _ref, _temp, _this, _ret;\n            _classCallCheck(this, AnimateGroupChild);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref = AnimateGroupChild.__proto__ || Object.getPrototypeOf(AnimateGroupChild)).call.apply(_ref, [ this ].concat(args))), \n            _this.state = {\n                isActive: !1\n            }, _this.handleEnter = function(node, isAppearing) {\n                var _this$props = _this.props, appearOptions = _this$props.appearOptions, enterOptions = _this$props.enterOptions;\n                _this.handleStyleActive(isAppearing ? appearOptions : enterOptions);\n            }, _this.handleExit = function() {\n                _this.handleStyleActive(_this.props.leaveOptions);\n            }, _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(AnimateGroupChild, _Component), _createClass(AnimateGroupChild, [ {\n            key: \"handleStyleActive\",\n            value: function(style) {\n                if (style) {\n                    var onAnimationEnd = style.onAnimationEnd ? function() {\n                        style.onAnimationEnd();\n                    } : null;\n                    this.setState(_extends({}, style, {\n                        onAnimationEnd: onAnimationEnd,\n                        isActive: !0\n                    }));\n                }\n            }\n        }, {\n            key: \"parseTimeout\",\n            value: function() {\n                var _props = this.props, appearOptions = _props.appearOptions, enterOptions = _props.enterOptions, leaveOptions = _props.leaveOptions;\n                return parseDurationOfSingleTransition(appearOptions) + parseDurationOfSingleTransition(enterOptions) + parseDurationOfSingleTransition(leaveOptions);\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this, _props2 = this.props, children = _props2.children, props = (_props2.appearOptions, \n                _props2.enterOptions, _props2.leaveOptions, _objectWithoutProperties(_props2, [ \"children\", \"appearOptions\", \"enterOptions\", \"leaveOptions\" ]));\n                return _react2.default.createElement(_Transition2.default, _extends({}, props, {\n                    onEnter: this.handleEnter,\n                    onExit: this.handleExit,\n                    timeout: this.parseTimeout()\n                }), function(transitionState) {\n                    return _react2.default.createElement(_Animate2.default, _this2.state, _react.Children.only(children));\n                });\n            }\n        } ]), AnimateGroupChild;\n    }(_react.Component), _class.propTypes = {\n        appearOptions: _propTypes2.default.object,\n        enterOptions: _propTypes2.default.object,\n        leaveOptions: _propTypes2.default.object,\n        children: _propTypes2.default.element\n    }, _temp2);\n    exports.default = AnimateGroupChild;\n}, function(module, exports, __webpack_require__) {\n    function isNumber(value) {\n        return \"number\" == typeof value || isObjectLike(value) && baseGetTag(value) == numberTag;\n    }\n    var baseGetTag = __webpack_require__(60), isObjectLike = __webpack_require__(43), numberTag = \"[object Number]\";\n    module.exports = isNumber;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), defaultFormatter = function(value) {\n        return __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default()(value) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(value[0]) && Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(value[1]) ? value.join(\" ~ \") : value;\n    }, DefaultTooltipContent = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function DefaultTooltipContent() {\n            return _classCallCheck(this, DefaultTooltipContent), _possibleConstructorReturn(this, (DefaultTooltipContent.__proto__ || Object.getPrototypeOf(DefaultTooltipContent)).apply(this, arguments));\n        }\n        return _inherits(DefaultTooltipContent, _Component), _createClass(DefaultTooltipContent, [ {\n            key: \"renderContent\",\n            value: function() {\n                var _props = this.props, payload = _props.payload, separator = _props.separator, formatter = _props.formatter, itemStyle = _props.itemStyle, itemSorter = _props.itemSorter;\n                if (payload && payload.length) {\n                    var listStyle = {\n                        padding: 0,\n                        margin: 0\n                    }, items = payload.sort(itemSorter).map(function(entry, i) {\n                        var finalItemStyle = _extends({\n                            display: \"block\",\n                            paddingTop: 4,\n                            paddingBottom: 4,\n                            color: entry.color || \"#000\"\n                        }, itemStyle), hasName = Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(entry.name), finalFormatter = entry.formatter || formatter || defaultFormatter;\n                        return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"li\", {\n                            className: \"recharts-tooltip-item\",\n                            key: \"tooltip-item-\" + i,\n                            style: finalItemStyle\n                        }, hasName ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"span\", {\n                            className: \"recharts-tooltip-item-name\"\n                        }, entry.name) : null, hasName ? __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"span\", {\n                            className: \"recharts-tooltip-item-separator\"\n                        }, separator) : null, __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"span\", {\n                            className: \"recharts-tooltip-item-value\"\n                        }, finalFormatter ? finalFormatter(entry.value, entry.name, entry, i) : entry.value), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"span\", {\n                            className: \"recharts-tooltip-item-unit\"\n                        }, entry.unit || \"\"));\n                    });\n                    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"ul\", {\n                        className: \"recharts-tooltip-item-list\",\n                        style: listStyle\n                    }, items);\n                }\n                return null;\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props2 = this.props, labelStyle = _props2.labelStyle, label = _props2.label, labelFormatter = _props2.labelFormatter, wrapperStyle = _props2.wrapperStyle, finalStyle = _extends({\n                    margin: 0,\n                    padding: 10,\n                    backgroundColor: \"#fff\",\n                    border: \"1px solid #ccc\",\n                    whiteSpace: \"nowrap\"\n                }, wrapperStyle), finalLabelStyle = _extends({\n                    margin: 0\n                }, labelStyle), hasLabel = Object(__WEBPACK_IMPORTED_MODULE_4__util_DataUtils__.g)(label), finalLabel = hasLabel ? label : \"\";\n                return hasLabel && labelFormatter && (finalLabel = labelFormatter(label)), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"div\", {\n                    className: \"recharts-default-tooltip\",\n                    style: finalStyle\n                }, __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"p\", {\n                    className: \"recharts-tooltip-label\",\n                    style: finalLabelStyle\n                }, finalLabel), this.renderContent());\n            }\n        } ]), DefaultTooltipContent;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = \"DefaultTooltipContent\", \n    _class2.propTypes = {\n        separator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string,\n        formatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        wrapperStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        itemStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        labelStyle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        labelFormatter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        label: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,\n        payload: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.shape({\n            name: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any,\n            value: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.array ]),\n            unit: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.any\n        })),\n        itemSorter: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func\n    }, _class2.defaultProps = {\n        separator: \" : \",\n        itemStyle: {},\n        labelStyle: {}\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = DefaultTooltipContent;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_debounce__ = __webpack_require__(310), __WEBPACK_IMPORTED_MODULE_0_lodash_debounce___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_debounce__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_3_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_classnames__), __WEBPACK_IMPORTED_MODULE_4_react_resize_detector__ = __webpack_require__(768), __WEBPACK_IMPORTED_MODULE_4_react_resize_detector___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_resize_detector__), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_LogUtils__ = __webpack_require__(312), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), ResponsiveContainer = (_temp = _class = function(_Component) {\n        function ResponsiveContainer(props) {\n            _classCallCheck(this, ResponsiveContainer);\n            var _this = _possibleConstructorReturn(this, (ResponsiveContainer.__proto__ || Object.getPrototypeOf(ResponsiveContainer)).call(this, props));\n            return _this.updateDimensionsImmediate = function() {\n                if (_this.mounted) {\n                    var newSize = _this.getContainerSize();\n                    if (newSize) {\n                        var _this$state = _this.state, oldWidth = _this$state.containerWidth, oldHeight = _this$state.containerHeight, containerWidth = newSize.containerWidth, containerHeight = newSize.containerHeight;\n                        containerWidth === oldWidth && containerHeight === oldHeight || _this.setState({\n                            containerWidth: containerWidth,\n                            containerHeight: containerHeight\n                        });\n                    }\n                }\n            }, _this.state = {\n                containerWidth: -1,\n                containerHeight: -1\n            }, _this.handleResize = props.debounce > 0 ? __WEBPACK_IMPORTED_MODULE_0_lodash_debounce___default()(_this.updateDimensionsImmediate, props.debounce) : _this.updateDimensionsImmediate, \n            _this;\n        }\n        return _inherits(ResponsiveContainer, _Component), _createClass(ResponsiveContainer, [ {\n            key: \"componentDidMount\",\n            value: function() {\n                this.mounted = !0;\n                var size = this.getContainerSize();\n                size && this.setState(size);\n            }\n        }, {\n            key: \"componentWillUnmount\",\n            value: function() {\n                this.mounted = !1;\n            }\n        }, {\n            key: \"getContainerSize\",\n            value: function() {\n                return this.container ? {\n                    containerWidth: this.container.clientWidth,\n                    containerHeight: this.container.clientHeight\n                } : null;\n            }\n        }, {\n            key: \"renderChart\",\n            value: function() {\n                var _state = this.state, containerWidth = _state.containerWidth, containerHeight = _state.containerHeight;\n                if (containerWidth < 0 || containerHeight < 0) return null;\n                var _props = this.props, aspect = _props.aspect, width = _props.width, height = _props.height, minWidth = _props.minWidth, minHeight = _props.minHeight, maxHeight = _props.maxHeight, children = _props.children;\n                Object(__WEBPACK_IMPORTED_MODULE_6__util_LogUtils__.a)(Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.i)(width) || Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.i)(height), \"The width(%s) and height(%s) are both fixed numbers,\\n       maybe you don't need to use a ResponsiveContainer.\", width, height), \n                Object(__WEBPACK_IMPORTED_MODULE_6__util_LogUtils__.a)(!aspect || aspect > 0, \"The aspect(%s) must be greater than zero.\", aspect);\n                var calculatedWidth = Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.i)(width) ? containerWidth : width, calculatedHeight = Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.i)(height) ? containerHeight : height;\n                return aspect && aspect > 0 && (calculatedHeight = calculatedWidth / aspect, maxHeight && calculatedHeight > maxHeight && (calculatedHeight = maxHeight)), \n                Object(__WEBPACK_IMPORTED_MODULE_6__util_LogUtils__.a)(calculatedWidth > 0 || calculatedHeight > 0, \"The width(%s) and height(%s) of chart should be greater than 0,\\n       please check the style of container, or the props width(%s) and height(%s),\\n       or add a minWidth(%s) or minHeight(%s) or use aspect(%s) to control the\\n       height and width.\", calculatedWidth, calculatedHeight, width, height, minWidth, minHeight, aspect), \n                __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(children, {\n                    width: calculatedWidth,\n                    height: calculatedHeight\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this, _props2 = this.props, minWidth = _props2.minWidth, minHeight = _props2.minHeight, width = _props2.width, height = _props2.height, maxHeight = _props2.maxHeight, id = _props2.id, className = _props2.className, style = {\n                    width: width,\n                    height: height,\n                    minWidth: minWidth,\n                    minHeight: minHeight,\n                    maxHeight: maxHeight\n                };\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"div\", {\n                    id: id,\n                    className: __WEBPACK_IMPORTED_MODULE_3_classnames___default()(\"recharts-responsive-container\", className),\n                    style: style,\n                    ref: function(node) {\n                        _this2.container = node;\n                    }\n                }, this.renderChart(), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_resize_detector___default.a, {\n                    handleWidth: !0,\n                    handleHeight: !0,\n                    onResize: this.handleResize\n                }));\n            }\n        } ]), ResponsiveContainer;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.displayName = \"ResponsiveContainer\", \n    _class.propTypes = {\n        aspect: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        minHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        minWidth: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        maxHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        children: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.node.isRequired,\n        debounce: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        id: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ]),\n        className: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number ])\n    }, _class.defaultProps = {\n        width: \"100%\",\n        height: \"100%\",\n        debounce: 0\n    }, _temp);\n    __webpack_exports__.a = ResponsiveContainer;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(31), now = function() {\n        return root.Date.now();\n    };\n    module.exports = now;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _ResizeDetector = __webpack_require__(769), _ResizeDetector2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_ResizeDetector);\n    exports.default = _ResizeDetector2.default;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _slicedToArray = function() {\n        function sliceIterator(arr, i) {\n            var _arr = [], _n = !0, _d = !1, _e = void 0;\n            try {\n                for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value), \n                !i || _arr.length !== i); _n = !0) ;\n            } catch (err) {\n                _d = !0, _e = err;\n            } finally {\n                try {\n                    !_n && _i.return && _i.return();\n                } finally {\n                    if (_d) throw _e;\n                }\n            }\n            return _arr;\n        }\n        return function(arr, i) {\n            if (Array.isArray(arr)) return arr;\n            if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);\n            throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n        };\n    }(), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _resizeDetectorStyles = __webpack_require__(770), ResizeDetector = function(_Component) {\n        function ResizeDetector() {\n            _classCallCheck(this, ResizeDetector);\n            var _this = _possibleConstructorReturn(this, (ResizeDetector.__proto__ || Object.getPrototypeOf(ResizeDetector)).call(this));\n            return _this.state = {\n                expandChildHeight: 0,\n                expandChildWidth: 0,\n                expandScrollLeft: 0,\n                expandScrollTop: 0,\n                shrinkScrollTop: 0,\n                shrinkScrollLeft: 0,\n                lastWidth: 0,\n                lastHeight: 0\n            }, _this.reset = _this.reset.bind(_this), _this.handleScroll = _this.handleScroll.bind(_this), \n            _this;\n        }\n        return _inherits(ResizeDetector, _Component), _createClass(ResizeDetector, [ {\n            key: \"componentWillMount\",\n            value: function() {\n                this.forceUpdate();\n            }\n        }, {\n            key: \"componentDidMount\",\n            value: function() {\n                var _containerSize = this.containerSize(), _containerSize2 = _slicedToArray(_containerSize, 2), width = _containerSize2[0], height = _containerSize2[1];\n                this.reset(width, height), this.props.onResize(width, height);\n            }\n        }, {\n            key: \"shouldComponentUpdate\",\n            value: function(nextProps, nextState) {\n                return this.props !== nextProps || this.state !== nextState;\n            }\n        }, {\n            key: \"componentDidUpdate\",\n            value: function() {\n                this.expand.scrollLeft = this.expand.scrollWidth, this.expand.scrollTop = this.expand.scrollHeight, \n                this.shrink.scrollLeft = this.shrink.scrollWidth, this.shrink.scrollTop = this.shrink.scrollHeight;\n            }\n        }, {\n            key: \"containerSize\",\n            value: function() {\n                return [ this.props.handleWidth && this.container.parentElement.offsetWidth, this.props.handleHeight && this.container.parentElement.offsetHeight ];\n            }\n        }, {\n            key: \"reset\",\n            value: function(containerWidth, containerHeight) {\n                if (\"undefined\" != typeof window) {\n                    var parent = this.container.parentElement, position = \"static\";\n                    parent.currentStyle ? position = parent.currentStyle.position : window.getComputedStyle && (position = window.getComputedStyle(parent).position), \n                    \"static\" === position && (parent.style.position = \"relative\"), this.setState({\n                        expandChildHeight: this.expand.offsetHeight + 10,\n                        expandChildWidth: this.expand.offsetWidth + 10,\n                        lastWidth: containerWidth,\n                        lastHeight: containerHeight\n                    });\n                }\n            }\n        }, {\n            key: \"handleScroll\",\n            value: function(e) {\n                if (\"undefined\" != typeof window) {\n                    e.preventDefault(), e.stopPropagation();\n                    var state = this.state, _containerSize3 = this.containerSize(), _containerSize4 = _slicedToArray(_containerSize3, 2), width = _containerSize4[0], height = _containerSize4[1];\n                    width === state.lastWidth && height === state.lastHeight || this.props.onResize(width, height), \n                    this.reset(width, height);\n                }\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _this2 = this, state = this.state, expandStyle = _extends({}, _resizeDetectorStyles.expandChildStyle, {\n                    width: state.expandChildWidth,\n                    height: state.expandChildHeight\n                });\n                return _react2.default.createElement(\"div\", {\n                    style: _resizeDetectorStyles.parentStyle,\n                    ref: function(e) {\n                        _this2.container = e;\n                    }\n                }, _react2.default.createElement(\"div\", {\n                    style: _resizeDetectorStyles.parentStyle,\n                    onScroll: this.handleScroll,\n                    ref: function(e) {\n                        _this2.expand = e;\n                    }\n                }, _react2.default.createElement(\"div\", {\n                    style: expandStyle\n                })), _react2.default.createElement(\"div\", {\n                    style: _resizeDetectorStyles.parentStyle,\n                    onScroll: this.handleScroll,\n                    ref: function(e) {\n                        _this2.shrink = e;\n                    }\n                }, _react2.default.createElement(\"div\", {\n                    style: _resizeDetectorStyles.shrinkChildStyle\n                })));\n            }\n        } ]), ResizeDetector;\n    }(_react.Component);\n    exports.default = ResizeDetector, ResizeDetector.propTypes = {\n        handleWidth: _propTypes2.default.bool,\n        handleHeight: _propTypes2.default.bool,\n        onResize: _propTypes2.default.func\n    }, ResizeDetector.defaultProps = {\n        handleWidth: !1,\n        handleHeight: !1,\n        onResize: function(e) {\n            return e;\n        }\n    };\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    exports.parentStyle = {\n        position: \"absolute\",\n        left: 0,\n        top: 0,\n        right: 0,\n        bottom: 0,\n        overflow: \"hidden\",\n        zIndex: -1,\n        visibility: \"hidden\"\n    }, exports.shrinkChildStyle = {\n        position: \"absolute\",\n        left: 0,\n        top: 0,\n        width: \"200%\",\n        height: \"200%\"\n    }, exports.expandChildStyle = {\n        position: \"absolute\",\n        left: 0,\n        top: 0,\n        width: \"100%\",\n        height: \"100%\"\n    };\n}, function(module, exports, __webpack_require__) {\n    function reduceCSSCalc(value, decimalPrecision) {\n        function evaluateExpression(expression, functionIdentifier, call) {\n            if (stack++ > MAX_STACK) throw stack = 0, new Error(\"Call stack overflow for \" + call);\n            if (\"\" === expression) throw new Error(functionIdentifier + \"(): '\" + call + \"' must contain a non-whitespace string\");\n            expression = evaluateNestedExpression(expression, call);\n            var units = getUnitsInExpression(expression);\n            if (units.length > 1 || expression.indexOf(\"var(\") > -1) return functionIdentifier + \"(\" + expression + \")\";\n            var unit = units[0] || \"\";\n            \"%\" === unit && (expression = expression.replace(/\\b[0-9\\.]+%/g, function(percent) {\n                return .01 * parseFloat(percent.slice(0, -1));\n            }));\n            var result, toEvaluate = expression.replace(new RegExp(unit, \"gi\"), \"\");\n            try {\n                result = mexp.eval(toEvaluate);\n            } catch (e) {\n                return functionIdentifier + \"(\" + expression + \")\";\n            }\n            return \"%\" === unit && (result *= 100), (functionIdentifier.length || \"%\" === unit) && (result = Math.round(result * decimalPrecision) / decimalPrecision), \n            result += unit;\n        }\n        function evaluateNestedExpression(expression, call) {\n            expression = expression.replace(/((?:\\-[a-z]+\\-)?calc)/g, \"\");\n            for (var matches, evaluatedPart = \"\", nonEvaluatedPart = expression; matches = NESTED_CALC_RE.exec(nonEvaluatedPart); ) {\n                matches[0].index > 0 && (evaluatedPart += nonEvaluatedPart.substring(0, matches[0].index));\n                var balancedExpr = balanced(\"(\", \")\", nonEvaluatedPart.substring([ 0 ].index));\n                if (\"\" === balancedExpr.body) throw new Error(\"'\" + expression + \"' must contain a non-whitespace string\");\n                var evaluated = evaluateExpression(balancedExpr.body, \"\", call);\n                evaluatedPart += balancedExpr.pre + evaluated, nonEvaluatedPart = balancedExpr.post;\n            }\n            return evaluatedPart + nonEvaluatedPart;\n        }\n        return stack = 0, decimalPrecision = Math.pow(10, void 0 === decimalPrecision ? 5 : decimalPrecision), \n        value = value.replace(/\\n+/g, \" \"), reduceFunctionCall(value, /((?:\\-[a-z]+\\-)?calc)\\(/, evaluateExpression);\n    }\n    function getUnitsInExpression(expression) {\n        for (var uniqueUnits = [], uniqueLowerCaseUnits = [], unitRegEx = /[\\.0-9]([%a-z]+)/gi, matches = unitRegEx.exec(expression); matches; ) matches && matches[1] && (-1 === uniqueLowerCaseUnits.indexOf(matches[1].toLowerCase()) && (uniqueUnits.push(matches[1]), \n        uniqueLowerCaseUnits.push(matches[1].toLowerCase())), matches = unitRegEx.exec(expression));\n        return uniqueUnits;\n    }\n    var stack, balanced = __webpack_require__(313), reduceFunctionCall = __webpack_require__(772), mexp = __webpack_require__(773), MAX_STACK = 100, NESTED_CALC_RE = /(\\+|\\-|\\*|\\\\|[^a-z]|)(\\s*)(\\()/g;\n    module.exports = reduceCSSCalc;\n}, function(module, exports, __webpack_require__) {\n    function reduceFunctionCall(string, functionRE, callback) {\n        var call = string;\n        return getFunctionCalls(string, functionRE).reduce(function(string, obj) {\n            return string.replace(obj.functionIdentifier + \"(\" + obj.matches.body + \")\", evalFunctionCall(obj.matches.body, obj.functionIdentifier, callback, call, functionRE));\n        }, string);\n    }\n    function getFunctionCalls(call, functionRE) {\n        var expressions = [], fnRE = \"string\" == typeof functionRE ? new RegExp(\"\\\\b(\" + functionRE + \")\\\\(\") : functionRE;\n        do {\n            var searchMatch = fnRE.exec(call);\n            if (!searchMatch) return expressions;\n            if (void 0 === searchMatch[1]) throw new Error(\"Missing the first couple of parenthesis to get the function identifier in \" + functionRE);\n            var fn = searchMatch[1], startIndex = searchMatch.index, matches = balanced(\"(\", \")\", call.substring(startIndex));\n            if (!matches || matches.start !== searchMatch[0].length - 1) throw new SyntaxError(fn + \"(): missing closing ')' in the value '\" + call + \"'\");\n            expressions.push({\n                matches: matches,\n                functionIdentifier: fn\n            }), call = matches.post;\n        } while (fnRE.test(call));\n        return expressions;\n    }\n    function evalFunctionCall(string, functionIdentifier, callback, call, functionRE) {\n        return callback(reduceFunctionCall(string, functionRE, callback), functionIdentifier, call);\n    }\n    var balanced = __webpack_require__(313);\n    module.exports = reduceFunctionCall;\n}, function(module, exports, __webpack_require__) {\n    var Mexp = __webpack_require__(774);\n    Mexp.prototype.formulaEval = function() {\n        \"use strict\";\n        for (var pop1, pop2, pop3, disp = [], arr = this.value, i = 0; i < arr.length; i++) 1 === arr[i].type || 3 === arr[i].type ? disp.push({\n            value: 3 === arr[i].type ? arr[i].show : arr[i].value,\n            type: 1\n        }) : 13 === arr[i].type ? disp.push({\n            value: arr[i].show,\n            type: 1\n        }) : 0 === arr[i].type ? disp[disp.length - 1] = {\n            value: arr[i].show + (\"-\" != arr[i].show ? \"(\" : \"\") + disp[disp.length - 1].value + (\"-\" != arr[i].show ? \")\" : \"\"),\n            type: 0\n        } : 7 === arr[i].type ? disp[disp.length - 1] = {\n            value: (1 != disp[disp.length - 1].type ? \"(\" : \"\") + disp[disp.length - 1].value + (1 != disp[disp.length - 1].type ? \")\" : \"\") + arr[i].show,\n            type: 7\n        } : 10 === arr[i].type ? (pop1 = disp.pop(), pop2 = disp.pop(), \"P\" === arr[i].show || \"C\" === arr[i].show ? disp.push({\n            value: \"<sup>\" + pop2.value + \"</sup>\" + arr[i].show + \"<sub>\" + pop1.value + \"</sub>\",\n            type: 10\n        }) : disp.push({\n            value: (1 != pop2.type ? \"(\" : \"\") + pop2.value + (1 != pop2.type ? \")\" : \"\") + \"<sup>\" + pop1.value + \"</sup>\",\n            type: 1\n        })) : 2 === arr[i].type || 9 === arr[i].type ? (pop1 = disp.pop(), pop2 = disp.pop(), \n        disp.push({\n            value: (1 != pop2.type ? \"(\" : \"\") + pop2.value + (1 != pop2.type ? \")\" : \"\") + arr[i].show + (1 != pop1.type ? \"(\" : \"\") + pop1.value + (1 != pop1.type ? \")\" : \"\"),\n            type: arr[i].type\n        })) : 12 === arr[i].type && (pop1 = disp.pop(), pop2 = disp.pop(), pop3 = disp.pop(), \n        disp.push({\n            value: arr[i].show + \"(\" + pop3.value + \",\" + pop2.value + \",\" + pop1.value + \")\",\n            type: 12\n        }));\n        return disp[0].value;\n    }, module.exports = Mexp;\n}, function(module, exports, __webpack_require__) {\n    var Mexp = __webpack_require__(775);\n    Mexp.prototype.postfixEval = function(UserDefined) {\n        \"use strict\";\n        UserDefined = UserDefined || {}, UserDefined.PI = Math.PI, UserDefined.E = Math.E;\n        for (var pop1, pop2, pop3, stack = [], arr = this.value, bool = void 0 !== UserDefined.n, i = 0; i < arr.length; i++) 1 === arr[i].type ? stack.push({\n            value: arr[i].value,\n            type: 1\n        }) : 3 === arr[i].type ? stack.push({\n            value: UserDefined[arr[i].value],\n            type: 1\n        }) : 0 === arr[i].type ? void 0 === stack[stack.length - 1].type ? stack[stack.length - 1].value.push(arr[i]) : stack[stack.length - 1].value = arr[i].value(stack[stack.length - 1].value) : 7 === arr[i].type ? void 0 === stack[stack.length - 1].type ? stack[stack.length - 1].value.push(arr[i]) : stack[stack.length - 1].value = arr[i].value(stack[stack.length - 1].value) : 8 === arr[i].type ? (pop1 = stack.pop(), \n        pop2 = stack.pop(), stack.push({\n            type: 1,\n            value: arr[i].value(pop2.value, pop1.value)\n        })) : 10 === arr[i].type ? (pop1 = stack.pop(), pop2 = stack.pop(), void 0 === pop2.type ? (pop2.value = pop2.concat(pop1), \n        pop2.value.push(arr[i]), stack.push(pop2)) : void 0 === pop1.type ? (pop1.unshift(pop2), \n        pop1.push(arr[i]), stack.push(pop1)) : stack.push({\n            type: 1,\n            value: arr[i].value(pop2.value, pop1.value)\n        })) : 2 === arr[i].type || 9 === arr[i].type ? (pop1 = stack.pop(), pop2 = stack.pop(), \n        void 0 === pop2.type ? (console.log(pop2), pop2 = pop2.concat(pop1), pop2.push(arr[i]), \n        stack.push(pop2)) : void 0 === pop1.type ? (pop1.unshift(pop2), pop1.push(arr[i]), \n        stack.push(pop1)) : stack.push({\n            type: 1,\n            value: arr[i].value(pop2.value, pop1.value)\n        })) : 12 === arr[i].type ? (pop1 = stack.pop(), void 0 !== pop1.type && (pop1 = [ pop1 ]), \n        pop2 = stack.pop(), pop3 = stack.pop(), stack.push({\n            type: 1,\n            value: arr[i].value(pop3.value, pop2.value, new Mexp(pop1))\n        })) : 13 === arr[i].type && (bool ? stack.push({\n            value: UserDefined[arr[i].value],\n            type: 3\n        }) : stack.push([ arr[i] ]));\n        if (stack.length > 1) throw new Mexp.exception(\"Uncaught Syntax error\");\n        return stack[0].value > 1e15 ? \"Infinity\" : parseFloat(stack[0].value.toFixed(15));\n    }, Mexp.eval = function(str, tokens, obj) {\n        return void 0 === tokens ? this.lex(str).toPostfix().postfixEval() : void 0 === obj ? void 0 !== tokens.length ? this.lex(str, tokens).toPostfix().postfixEval() : this.lex(str).toPostfix().postfixEval(tokens) : this.lex(str, tokens).toPostfix().postfixEval(obj);\n    }, module.exports = Mexp;\n}, function(module, exports, __webpack_require__) {\n    var Mexp = __webpack_require__(776);\n    Mexp.prototype.toPostfix = function() {\n        \"use strict\";\n        for (var elem, popped, prep, pre, ele, post = [], stack = [ {\n            value: \"(\",\n            type: 4,\n            pre: 0\n        } ], arr = this.value, i = 1; i < arr.length; i++) if (1 === arr[i].type || 3 === arr[i].type || 13 === arr[i].type) 1 === arr[i].type && (arr[i].value = Number(arr[i].value)), \n        post.push(arr[i]); else if (4 === arr[i].type) stack.push(arr[i]); else if (5 === arr[i].type) for (;4 !== (popped = stack.pop()).type; ) post.push(popped); else if (11 === arr[i].type) {\n            for (;4 !== (popped = stack.pop()).type; ) post.push(popped);\n            stack.push(popped);\n        } else {\n            elem = arr[i], pre = elem.pre, ele = stack[stack.length - 1], prep = ele.pre;\n            var flag = \"Math.pow\" == ele.value && \"Math.pow\" == elem.value;\n            if (pre > prep) stack.push(elem); else {\n                for (;prep >= pre && !flag || flag && pre < prep; ) popped = stack.pop(), ele = stack[stack.length - 1], \n                post.push(popped), prep = ele.pre, flag = \"Math.pow\" == elem.value && \"Math.pow\" == ele.value;\n                stack.push(elem);\n            }\n        }\n        return new Mexp(post);\n    }, module.exports = Mexp;\n}, function(module, exports, __webpack_require__) {\n    function inc(arr, val) {\n        for (var i = 0; i < arr.length; i++) arr[i] += val;\n        return arr;\n    }\n    function match(str1, str2, i, x) {\n        for (var f = 0; f < x; f++) if (str1[i + f] !== str2[f]) return !1;\n        return !0;\n    }\n    var Mexp = __webpack_require__(777), token = [ \"sin\", \"cos\", \"tan\", \"pi\", \"(\", \")\", \"P\", \"C\", \"asin\", \"acos\", \"atan\", \"7\", \"8\", \"9\", \"int\", \"cosh\", \"acosh\", \"ln\", \"^\", \"root\", \"4\", \"5\", \"6\", \"/\", \"!\", \"tanh\", \"atanh\", \"Mod\", \"1\", \"2\", \"3\", \"*\", \"sinh\", \"asinh\", \"e\", \"log\", \"0\", \".\", \"+\", \"-\", \",\", \"Sigma\", \"n\", \"Pi\", \"pow\" ], show = [ \"sin\", \"cos\", \"tan\", \"&pi;\", \"(\", \")\", \"P\", \"C\", \"asin\", \"acos\", \"atan\", \"7\", \"8\", \"9\", \"Int\", \"cosh\", \"acosh\", \" ln\", \"^\", \"root\", \"4\", \"5\", \"6\", \"&divide;\", \"!\", \"tanh\", \"atanh\", \" Mod \", \"1\", \"2\", \"3\", \"&times;\", \"sinh\", \"asinh\", \"e\", \" log\", \"0\", \".\", \"+\", \"-\", \",\", \"&Sigma;\", \"n\", \"&Pi;\", \"pow\" ], eva = [ Mexp.math.sin, Mexp.math.cos, Mexp.math.tan, \"PI\", \"(\", \")\", Mexp.math.P, Mexp.math.C, Mexp.math.asin, Mexp.math.acos, Mexp.math.atan, \"7\", \"8\", \"9\", Math.floor, Mexp.math.cosh, Mexp.math.acosh, Math.log, Math.pow, Math.sqrt, \"4\", \"5\", \"6\", Mexp.math.div, Mexp.math.fact, Mexp.math.tanh, Mexp.math.atanh, Mexp.math.mod, \"1\", \"2\", \"3\", Mexp.math.mul, Mexp.math.sinh, Mexp.math.asinh, \"E\", Mexp.math.log, \"0\", \".\", Mexp.math.add, Mexp.math.sub, \",\", Mexp.math.sigma, \"n\", Mexp.math.Pi, Math.pow ], preced = {\n        0: 11,\n        1: 0,\n        2: 3,\n        3: 0,\n        4: 0,\n        5: 0,\n        6: 0,\n        7: 11,\n        8: 11,\n        9: 1,\n        10: 10,\n        11: 0,\n        12: 11,\n        13: 0\n    }, type = [ 0, 0, 0, 3, 4, 5, 10, 10, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 10, 0, 1, 1, 1, 2, 7, 0, 0, 2, 1, 1, 1, 2, 0, 0, 3, 0, 1, 6, 9, 9, 11, 12, 13, 12, 8 ], type0 = {\n        0: !0,\n        1: !0,\n        3: !0,\n        4: !0,\n        6: !0,\n        8: !0,\n        9: !0,\n        12: !0,\n        13: !0\n    }, type1 = {\n        0: !0,\n        1: !0,\n        2: !0,\n        3: !0,\n        4: !0,\n        5: !0,\n        6: !0,\n        7: !0,\n        8: !0,\n        9: !0,\n        10: !0,\n        11: !0,\n        12: !0,\n        13: !0\n    }, type_1 = {\n        0: !0,\n        3: !0,\n        4: !0,\n        8: !0,\n        12: !0,\n        13: !0\n    }, empty = {}, type_3 = {\n        0: !0,\n        1: !0,\n        3: !0,\n        4: !0,\n        6: !0,\n        8: !0,\n        12: !0,\n        13: !0\n    }, type6 = {\n        1: !0\n    }, newAr = [ [], [ \"1\", \"2\", \"3\", \"7\", \"8\", \"9\", \"4\", \"5\", \"6\", \"+\", \"-\", \"*\", \"/\", \"(\", \")\", \"^\", \"!\", \"P\", \"C\", \"e\", \"0\", \".\", \",\", \"n\" ], [ \"pi\", \"ln\", \"Pi\" ], [ \"sin\", \"cos\", \"tan\", \"Del\", \"int\", \"Mod\", \"log\", \"pow\" ], [ \"asin\", \"acos\", \"atan\", \"cosh\", \"root\", \"tanh\", \"sinh\" ], [ \"acosh\", \"atanh\", \"asinh\", \"Sigma\" ] ];\n    Mexp.addToken = function(tokens) {\n        for (i = 0; i < tokens.length; i++) {\n            x = tokens[i].token.length;\n            var temp = -1;\n            if (x < newAr.length) for (y = 0; y < newAr[x].length; y++) if (tokens[i].token === newAr[x][y]) {\n                temp = token.indexOf(newAr[x][y]);\n                break;\n            }\n            -1 === temp ? (token.push(tokens[i].token), type.push(tokens[i].type), newAr.length <= tokens[i].token.length && (newAr[tokens[i].token.length] = []), \n            newAr[tokens[i].token.length].push(tokens[i].token), eva.push(tokens[i].value), \n            show.push(tokens[i].show)) : (token[temp] = tokens[i].token, type[temp] = tokens[i].type, \n            eva[temp] = tokens[i].value, show[temp] = tokens[i].show);\n        }\n    }, Mexp.lex = function(inp, tokens) {\n        \"use strict\";\n        var key, i, x, y, str = [ {\n            type: 4,\n            value: \"(\",\n            show: \"(\",\n            pre: 0\n        } ], ptc = [], inpStr = inp, pcounter = 0, allowed = type0, bracToClose = 0, asterick = empty, prevKey = \"\";\n        void 0 !== tokens && Mexp.addToken(tokens);\n        var obj = {};\n        for (i = 0; i < inpStr.length; i++) if (\" \" != inpStr[i]) {\n            key = \"\";\n            sec: for (x = inpStr.length - i > newAr.length - 2 ? newAr.length - 1 : inpStr.length - i; x > 0; x--) for (y = 0; y < newAr[x].length; y++) if (match(inpStr, newAr[x][y], i, x)) {\n                key = newAr[x][y];\n                break sec;\n            }\n            if (i += key.length - 1, \"\" === key) throw new Mexp.exception(\"Can't understand after \" + inpStr.slice(i));\n            var index = token.indexOf(key), cToken = key, cType = type[index], cEv = eva[index], cPre = preced[cType], cShow = show[index], pre = str[str.length - 1];\n            for (j = ptc.length; j--; ) if (0 === ptc[j] && -1 !== [ 0, 2, 3, 5, 9, 11, 12, 13 ].indexOf(cType)) {\n                if (!0 !== allowed[cType]) throw new Mexp.exception(key + \" is not allowed after \" + prevKey);\n                str.push({\n                    value: \")\",\n                    type: 5,\n                    pre: 0,\n                    show: \")\"\n                }), allowed = type1, asterick = type_3, inc(ptc, -1).pop();\n            }\n            if (!0 !== allowed[cType]) throw new Mexp.exception(key + \" is not allowed after \" + prevKey);\n            if (!0 === asterick[cType] && (cType = 2, cEv = Mexp.math.mul, cShow = \"&times;\", \n            cPre = 3, i -= key.length), obj = {\n                value: cEv,\n                type: cType,\n                pre: cPre,\n                show: cShow\n            }, 0 === cType) allowed = type0, asterick = empty, inc(ptc, 2).push(2), str.push(obj), \n            str.push({\n                value: \"(\",\n                type: 4,\n                pre: 0,\n                show: \"(\"\n            }); else if (1 === cType) 1 === pre.type ? (pre.value += cEv, inc(ptc, 1)) : str.push(obj), \n            allowed = type1, asterick = type_1; else if (2 === cType) allowed = type0, asterick = empty, \n            inc(ptc, 2), str.push(obj); else if (3 === cType) str.push(obj), allowed = type1, \n            asterick = type_3; else if (4 === cType) pcounter += ptc.length, ptc = [], bracToClose++, \n            allowed = type0, asterick = empty, str.push(obj); else if (5 === cType) {\n                if (!bracToClose) throw new Mexp.exception(\"Closing parenthesis are more than opening one, wait What!!!\");\n                for (;pcounter--; ) str.push({\n                    value: \")\",\n                    type: 5,\n                    pre: 0,\n                    show: \")\"\n                });\n                pcounter = 0, bracToClose--, allowed = type1, asterick = type_3, str.push(obj);\n            } else if (6 === cType) {\n                if (pre.hasDec) throw new Mexp.exception(\"Two decimals are not allowed in one number\");\n                1 !== pre.type && (pre = {\n                    value: 0,\n                    type: 1,\n                    pre: 0\n                }, str.push(pre), inc(ptc, -1)), allowed = type6, inc(ptc, 1), asterick = empty, \n                pre.value += cEv, pre.hasDec = !0;\n            } else 7 === cType && (allowed = type1, asterick = type_3, inc(ptc, 1), str.push(obj));\n            8 === cType ? (allowed = type0, asterick = empty, inc(ptc, 4).push(4), str.push(obj), \n            str.push({\n                value: \"(\",\n                type: 4,\n                pre: 0,\n                show: \"(\"\n            })) : 9 === cType ? (9 === pre.type ? pre.value === Mexp.math.add ? (pre.value = cEv, \n            pre.show = cShow, inc(ptc, 1)) : pre.value === Mexp.math.sub && \"-\" === cShow && (pre.value = Mexp.math.add, \n            pre.show = \"+\", inc(ptc, 1)) : 5 !== pre.type && 7 !== pre.type && 1 !== pre.type && 3 !== pre.type && 13 !== pre.type ? \"-\" === cToken && (allowed = type0, \n            asterick = empty, inc(ptc, 2).push(2), str.push({\n                value: Mexp.math.changeSign,\n                type: 0,\n                pre: 21,\n                show: \"-\"\n            }), str.push({\n                value: \"(\",\n                type: 4,\n                pre: 0,\n                show: \"(\"\n            })) : (str.push(obj), inc(ptc, 2)), allowed = type0, asterick = empty) : 10 === cType ? (allowed = type0, \n            asterick = empty, inc(ptc, 2), str.push(obj)) : 11 === cType ? (allowed = type0, \n            asterick = empty, str.push(obj)) : 12 === cType ? (allowed = type0, asterick = empty, \n            inc(ptc, 6).push(6), str.push(obj), str.push({\n                value: \"(\",\n                type: 4,\n                pre: 0\n            })) : 13 === cType && (allowed = type1, asterick = type_3, str.push(obj)), inc(ptc, -1), \n            prevKey = key;\n        }\n        for (var j = ptc.length; j--; ) 0 === ptc[j] && (str.push({\n            value: \")\",\n            show: \")\",\n            type: 5,\n            pre: 3\n        }), inc(ptc, -1).pop());\n        if (!0 !== allowed[5]) throw new Mexp.exception(\"complete the expression\");\n        for (;bracToClose--; ) str.push({\n            value: \")\",\n            show: \")\",\n            type: 5,\n            pre: 3\n        });\n        return str.push({\n            type: 5,\n            value: \")\",\n            show: \")\",\n            pre: 0\n        }), new Mexp(str);\n    }, module.exports = Mexp;\n}, function(module, exports) {\n    var Mexp = function(parsed) {\n        this.value = parsed;\n    };\n    Mexp.math = {\n        isDegree: !0,\n        acos: function(x) {\n            return Mexp.math.isDegree ? 180 / Math.PI * Math.acos(x) : Math.acos(x);\n        },\n        add: function(a, b) {\n            return a + b;\n        },\n        asin: function(x) {\n            return Mexp.math.isDegree ? 180 / Math.PI * Math.asin(x) : Math.asin(x);\n        },\n        atan: function(x) {\n            return Mexp.math.isDegree ? 180 / Math.PI * Math.atan(x) : Math.atan(x);\n        },\n        acosh: function(x) {\n            return Math.log(x + Math.sqrt(x * x - 1));\n        },\n        asinh: function(x) {\n            return Math.log(x + Math.sqrt(x * x + 1));\n        },\n        atanh: function(x) {\n            return Math.log((1 + x) / (1 - x));\n        },\n        C: function(n, r) {\n            var pro = 1, other = n - r, choice = r;\n            choice < other && (choice = other, other = r);\n            for (var i = choice + 1; i <= n; i++) pro *= i;\n            return pro / Mexp.math.fact(other);\n        },\n        changeSign: function(x) {\n            return -x;\n        },\n        cos: function(x) {\n            return Mexp.math.isDegree && (x = Mexp.math.toRadian(x)), Math.cos(x);\n        },\n        cosh: function(x) {\n            return (Math.pow(Math.E, x) + Math.pow(Math.E, -1 * x)) / 2;\n        },\n        div: function(a, b) {\n            return a / b;\n        },\n        fact: function(n) {\n            if (n % 1 != 0) return \"NAN\";\n            for (var pro = 1, i = 2; i <= n; i++) pro *= i;\n            return pro;\n        },\n        inverse: function(x) {\n            return 1 / x;\n        },\n        log: function(i) {\n            return Math.log(i) / Math.log(10);\n        },\n        mod: function(a, b) {\n            return a % b;\n        },\n        mul: function(a, b) {\n            return a * b;\n        },\n        P: function(n, r) {\n            for (var pro = 1, i = Math.floor(n) - Math.floor(r) + 1; i <= Math.floor(n); i++) pro *= i;\n            return pro;\n        },\n        Pi: function(low, high, ex) {\n            for (var pro = 1, i = low; i <= high; i++) pro *= Number(ex.postfixEval({\n                n: i\n            }));\n            return pro;\n        },\n        pow10x: function(e) {\n            for (var x = 1; e--; ) x *= 10;\n            return x;\n        },\n        sigma: function(low, high, ex) {\n            for (var sum = 0, i = low; i <= high; i++) sum += Number(ex.postfixEval({\n                n: i\n            }));\n            return sum;\n        },\n        sin: function(x) {\n            return Mexp.math.isDegree && (x = Mexp.math.toRadian(x)), Math.sin(x);\n        },\n        sinh: function(x) {\n            return (Math.pow(Math.E, x) - Math.pow(Math.E, -1 * x)) / 2;\n        },\n        sub: function(a, b) {\n            return a - b;\n        },\n        tan: function(x) {\n            return Mexp.math.isDegree && (x = Mexp.math.toRadian(x)), Math.tan(x);\n        },\n        tanh: function(x) {\n            return Mexp.sinha(x) / Mexp.cosha(x);\n        },\n        toRadian: function(x) {\n            return x * Math.PI / 180;\n        }\n    }, Mexp.exception = function(message) {\n        this.message = message;\n    }, module.exports = Mexp;\n}, function(module, exports, __webpack_require__) {\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n        var objIsArr = isArray(object), othIsArr = isArray(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other);\n        objTag = objTag == argsTag ? objectTag : objTag, othTag = othTag == argsTag ? objectTag : othTag;\n        var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;\n        if (isSameTag && isBuffer(object)) {\n            if (!isBuffer(other)) return !1;\n            objIsArr = !0, objIsObj = !1;\n        }\n        if (isSameTag && !objIsObj) return stack || (stack = new Stack()), objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n        if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n            var objIsWrapped = objIsObj && hasOwnProperty.call(object, \"__wrapped__\"), othIsWrapped = othIsObj && hasOwnProperty.call(other, \"__wrapped__\");\n            if (objIsWrapped || othIsWrapped) {\n                var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;\n                return stack || (stack = new Stack()), equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n            }\n        }\n        return !!isSameTag && (stack || (stack = new Stack()), equalObjects(object, other, bitmask, customizer, equalFunc, stack));\n    }\n    var Stack = __webpack_require__(314), equalArrays = __webpack_require__(315), equalByTag = __webpack_require__(789), equalObjects = __webpack_require__(793), getTag = __webpack_require__(808), isArray = __webpack_require__(13), isBuffer = __webpack_require__(317), isTypedArray = __webpack_require__(318), COMPARE_PARTIAL_FLAG = 1, argsTag = \"[object Arguments]\", arrayTag = \"[object Array]\", objectTag = \"[object Object]\", objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = baseIsEqualDeep;\n}, function(module, exports, __webpack_require__) {\n    function stackClear() {\n        this.__data__ = new ListCache(), this.size = 0;\n    }\n    var ListCache = __webpack_require__(116);\n    module.exports = stackClear;\n}, function(module, exports) {\n    function stackDelete(key) {\n        var data = this.__data__, result = data.delete(key);\n        return this.size = data.size, result;\n    }\n    module.exports = stackDelete;\n}, function(module, exports) {\n    function stackGet(key) {\n        return this.__data__.get(key);\n    }\n    module.exports = stackGet;\n}, function(module, exports) {\n    function stackHas(key) {\n        return this.__data__.has(key);\n    }\n    module.exports = stackHas;\n}, function(module, exports, __webpack_require__) {\n    function stackSet(key, value) {\n        var data = this.__data__;\n        if (data instanceof ListCache) {\n            var pairs = data.__data__;\n            if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) return pairs.push([ key, value ]), \n            this.size = ++data.size, this;\n            data = this.__data__ = new MapCache(pairs);\n        }\n        return data.set(key, value), this.size = data.size, this;\n    }\n    var ListCache = __webpack_require__(116), Map = __webpack_require__(178), MapCache = __webpack_require__(176), LARGE_ARRAY_SIZE = 200;\n    module.exports = stackSet;\n}, function(module, exports, __webpack_require__) {\n    function SetCache(values) {\n        var index = -1, length = null == values ? 0 : values.length;\n        for (this.__data__ = new MapCache(); ++index < length; ) this.add(values[index]);\n    }\n    var MapCache = __webpack_require__(176), setCacheAdd = __webpack_require__(785), setCacheHas = __webpack_require__(786);\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd, SetCache.prototype.has = setCacheHas, \n    module.exports = SetCache;\n}, function(module, exports) {\n    function setCacheAdd(value) {\n        return this.__data__.set(value, HASH_UNDEFINED), this;\n    }\n    var HASH_UNDEFINED = \"__lodash_hash_undefined__\";\n    module.exports = setCacheAdd;\n}, function(module, exports) {\n    function setCacheHas(value) {\n        return this.__data__.has(value);\n    }\n    module.exports = setCacheHas;\n}, function(module, exports) {\n    function arraySome(array, predicate) {\n        for (var index = -1, length = null == array ? 0 : array.length; ++index < length; ) if (predicate(array[index], index, array)) return !0;\n        return !1;\n    }\n    module.exports = arraySome;\n}, function(module, exports) {\n    function cacheHas(cache, key) {\n        return cache.has(key);\n    }\n    module.exports = cacheHas;\n}, function(module, exports, __webpack_require__) {\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n        switch (tag) {\n          case dataViewTag:\n            if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) return !1;\n            object = object.buffer, other = other.buffer;\n\n          case arrayBufferTag:\n            return !(object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other)));\n\n          case boolTag:\n          case dateTag:\n          case numberTag:\n            return eq(+object, +other);\n\n          case errorTag:\n            return object.name == other.name && object.message == other.message;\n\n          case regexpTag:\n          case stringTag:\n            return object == other + \"\";\n\n          case mapTag:\n            var convert = mapToArray;\n\n          case setTag:\n            var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n            if (convert || (convert = setToArray), object.size != other.size && !isPartial) return !1;\n            var stacked = stack.get(object);\n            if (stacked) return stacked == other;\n            bitmask |= COMPARE_UNORDERED_FLAG, stack.set(object, other);\n            var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n            return stack.delete(object), result;\n\n          case symbolTag:\n            if (symbolValueOf) return symbolValueOf.call(object) == symbolValueOf.call(other);\n        }\n        return !1;\n    }\n    var Symbol = __webpack_require__(83), Uint8Array = __webpack_require__(790), eq = __webpack_require__(177), equalArrays = __webpack_require__(315), mapToArray = __webpack_require__(791), setToArray = __webpack_require__(792), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2, boolTag = \"[object Boolean]\", dateTag = \"[object Date]\", errorTag = \"[object Error]\", mapTag = \"[object Map]\", numberTag = \"[object Number]\", regexpTag = \"[object RegExp]\", setTag = \"[object Set]\", stringTag = \"[object String]\", symbolTag = \"[object Symbol]\", arrayBufferTag = \"[object ArrayBuffer]\", dataViewTag = \"[object DataView]\", symbolProto = Symbol ? Symbol.prototype : void 0, symbolValueOf = symbolProto ? symbolProto.valueOf : void 0;\n    module.exports = equalByTag;\n}, function(module, exports, __webpack_require__) {\n    var root = __webpack_require__(31), Uint8Array = root.Uint8Array;\n    module.exports = Uint8Array;\n}, function(module, exports) {\n    function mapToArray(map) {\n        var index = -1, result = Array(map.size);\n        return map.forEach(function(value, key) {\n            result[++index] = [ key, value ];\n        }), result;\n    }\n    module.exports = mapToArray;\n}, function(module, exports) {\n    function setToArray(set) {\n        var index = -1, result = Array(set.size);\n        return set.forEach(function(value) {\n            result[++index] = value;\n        }), result;\n    }\n    module.exports = setToArray;\n}, function(module, exports, __webpack_require__) {\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length;\n        if (objLength != getAllKeys(other).length && !isPartial) return !1;\n        for (var index = objLength; index--; ) {\n            var key = objProps[index];\n            if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) return !1;\n        }\n        var stacked = stack.get(object);\n        if (stacked && stack.get(other)) return stacked == other;\n        var result = !0;\n        stack.set(object, other), stack.set(other, object);\n        for (var skipCtor = isPartial; ++index < objLength; ) {\n            key = objProps[index];\n            var objValue = object[key], othValue = other[key];\n            if (customizer) var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);\n            if (!(void 0 === compared ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {\n                result = !1;\n                break;\n            }\n            skipCtor || (skipCtor = \"constructor\" == key);\n        }\n        if (result && !skipCtor) {\n            var objCtor = object.constructor, othCtor = other.constructor;\n            objCtor != othCtor && \"constructor\" in object && \"constructor\" in other && !(\"function\" == typeof objCtor && objCtor instanceof objCtor && \"function\" == typeof othCtor && othCtor instanceof othCtor) && (result = !1);\n        }\n        return stack.delete(object), stack.delete(other), result;\n    }\n    var getAllKeys = __webpack_require__(794), COMPARE_PARTIAL_FLAG = 1, objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = equalObjects;\n}, function(module, exports, __webpack_require__) {\n    function getAllKeys(object) {\n        return baseGetAllKeys(object, keys, getSymbols);\n    }\n    var baseGetAllKeys = __webpack_require__(795), getSymbols = __webpack_require__(796), keys = __webpack_require__(200);\n    module.exports = getAllKeys;\n}, function(module, exports, __webpack_require__) {\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n        var result = keysFunc(object);\n        return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n    var arrayPush = __webpack_require__(316), isArray = __webpack_require__(13);\n    module.exports = baseGetAllKeys;\n}, function(module, exports, __webpack_require__) {\n    var arrayFilter = __webpack_require__(797), stubArray = __webpack_require__(798), objectProto = Object.prototype, propertyIsEnumerable = objectProto.propertyIsEnumerable, nativeGetSymbols = Object.getOwnPropertySymbols, getSymbols = nativeGetSymbols ? function(object) {\n        return null == object ? [] : (object = Object(object), arrayFilter(nativeGetSymbols(object), function(symbol) {\n            return propertyIsEnumerable.call(object, symbol);\n        }));\n    } : stubArray;\n    module.exports = getSymbols;\n}, function(module, exports) {\n    function arrayFilter(array, predicate) {\n        for (var index = -1, length = null == array ? 0 : array.length, resIndex = 0, result = []; ++index < length; ) {\n            var value = array[index];\n            predicate(value, index, array) && (result[resIndex++] = value);\n        }\n        return result;\n    }\n    module.exports = arrayFilter;\n}, function(module, exports) {\n    function stubArray() {\n        return [];\n    }\n    module.exports = stubArray;\n}, function(module, exports, __webpack_require__) {\n    function arrayLikeKeys(value, inherited) {\n        var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length;\n        for (var key in value) !inherited && !hasOwnProperty.call(value, key) || skipIndexes && (\"length\" == key || isBuff && (\"offset\" == key || \"parent\" == key) || isType && (\"buffer\" == key || \"byteLength\" == key || \"byteOffset\" == key) || isIndex(key, length)) || result.push(key);\n        return result;\n    }\n    var baseTimes = __webpack_require__(800), isArguments = __webpack_require__(201), isArray = __webpack_require__(13), isBuffer = __webpack_require__(317), isIndex = __webpack_require__(202), isTypedArray = __webpack_require__(318), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = arrayLikeKeys;\n}, function(module, exports) {\n    function baseTimes(n, iteratee) {\n        for (var index = -1, result = Array(n); ++index < n; ) result[index] = iteratee(index);\n        return result;\n    }\n    module.exports = baseTimes;\n}, function(module, exports, __webpack_require__) {\n    function baseIsArguments(value) {\n        return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n    var baseGetTag = __webpack_require__(41), isObjectLike = __webpack_require__(42), argsTag = \"[object Arguments]\";\n    module.exports = baseIsArguments;\n}, function(module, exports) {\n    function stubFalse() {\n        return !1;\n    }\n    module.exports = stubFalse;\n}, function(module, exports, __webpack_require__) {\n    function baseIsTypedArray(value) {\n        return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n    var baseGetTag = __webpack_require__(41), isLength = __webpack_require__(203), isObjectLike = __webpack_require__(42), typedArrayTags = {};\n    typedArrayTags[\"[object Float32Array]\"] = typedArrayTags[\"[object Float64Array]\"] = typedArrayTags[\"[object Int8Array]\"] = typedArrayTags[\"[object Int16Array]\"] = typedArrayTags[\"[object Int32Array]\"] = typedArrayTags[\"[object Uint8Array]\"] = typedArrayTags[\"[object Uint8ClampedArray]\"] = typedArrayTags[\"[object Uint16Array]\"] = typedArrayTags[\"[object Uint32Array]\"] = !0, \n    typedArrayTags[\"[object Arguments]\"] = typedArrayTags[\"[object Array]\"] = typedArrayTags[\"[object ArrayBuffer]\"] = typedArrayTags[\"[object Boolean]\"] = typedArrayTags[\"[object DataView]\"] = typedArrayTags[\"[object Date]\"] = typedArrayTags[\"[object Error]\"] = typedArrayTags[\"[object Function]\"] = typedArrayTags[\"[object Map]\"] = typedArrayTags[\"[object Number]\"] = typedArrayTags[\"[object Object]\"] = typedArrayTags[\"[object RegExp]\"] = typedArrayTags[\"[object Set]\"] = typedArrayTags[\"[object String]\"] = typedArrayTags[\"[object WeakMap]\"] = !1, \n    module.exports = baseIsTypedArray;\n}, function(module, exports, __webpack_require__) {\n    (function(module) {\n        var freeGlobal = __webpack_require__(268), freeExports = \"object\" == typeof exports && exports && !exports.nodeType && exports, freeModule = freeExports && \"object\" == typeof module && module && !module.nodeType && module, moduleExports = freeModule && freeModule.exports === freeExports, freeProcess = moduleExports && freeGlobal.process, nodeUtil = function() {\n            try {\n                return freeProcess && freeProcess.binding && freeProcess.binding(\"util\");\n            } catch (e) {}\n        }();\n        module.exports = nodeUtil;\n    }).call(exports, __webpack_require__(131)(module));\n}, function(module, exports, __webpack_require__) {\n    function baseKeys(object) {\n        if (!isPrototype(object)) return nativeKeys(object);\n        var result = [];\n        for (var key in Object(object)) hasOwnProperty.call(object, key) && \"constructor\" != key && result.push(key);\n        return result;\n    }\n    var isPrototype = __webpack_require__(806), nativeKeys = __webpack_require__(807), objectProto = Object.prototype, hasOwnProperty = objectProto.hasOwnProperty;\n    module.exports = baseKeys;\n}, function(module, exports) {\n    function isPrototype(value) {\n        var Ctor = value && value.constructor;\n        return value === (\"function\" == typeof Ctor && Ctor.prototype || objectProto);\n    }\n    var objectProto = Object.prototype;\n    module.exports = isPrototype;\n}, function(module, exports, __webpack_require__) {\n    var overArg = __webpack_require__(320), nativeKeys = overArg(Object.keys, Object);\n    module.exports = nativeKeys;\n}, function(module, exports, __webpack_require__) {\n    var DataView = __webpack_require__(809), Map = __webpack_require__(178), Promise = __webpack_require__(810), Set = __webpack_require__(811), WeakMap = __webpack_require__(812), baseGetTag = __webpack_require__(41), toSource = __webpack_require__(271), dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap), getTag = baseGetTag;\n    (DataView && \"[object DataView]\" != getTag(new DataView(new ArrayBuffer(1))) || Map && \"[object Map]\" != getTag(new Map()) || Promise && \"[object Promise]\" != getTag(Promise.resolve()) || Set && \"[object Set]\" != getTag(new Set()) || WeakMap && \"[object WeakMap]\" != getTag(new WeakMap())) && (getTag = function(value) {\n        var result = baseGetTag(value), Ctor = \"[object Object]\" == result ? value.constructor : void 0, ctorString = Ctor ? toSource(Ctor) : \"\";\n        if (ctorString) switch (ctorString) {\n          case dataViewCtorString:\n            return \"[object DataView]\";\n\n          case mapCtorString:\n            return \"[object Map]\";\n\n          case promiseCtorString:\n            return \"[object Promise]\";\n\n          case setCtorString:\n            return \"[object Set]\";\n\n          case weakMapCtorString:\n            return \"[object WeakMap]\";\n        }\n        return result;\n    }), module.exports = getTag;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(57), root = __webpack_require__(31), DataView = getNative(root, \"DataView\");\n    module.exports = DataView;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(57), root = __webpack_require__(31), Promise = getNative(root, \"Promise\");\n    module.exports = Promise;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(57), root = __webpack_require__(31), Set = getNative(root, \"Set\");\n    module.exports = Set;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(57), root = __webpack_require__(31), WeakMap = getNative(root, \"WeakMap\");\n    module.exports = WeakMap;\n}, function(module, exports, __webpack_require__) {\n    function isFlattenable(value) {\n        return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n    var Symbol = __webpack_require__(83), isArguments = __webpack_require__(201), isArray = __webpack_require__(13), spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : void 0;\n    module.exports = isFlattenable;\n}, function(module, exports, __webpack_require__) {\n    function baseOrderBy(collection, iteratees, orders) {\n        var index = -1;\n        iteratees = arrayMap(iteratees.length ? iteratees : [ identity ], baseUnary(baseIteratee));\n        var result = baseMap(collection, function(value, key, collection) {\n            return {\n                criteria: arrayMap(iteratees, function(iteratee) {\n                    return iteratee(value);\n                }),\n                index: ++index,\n                value: value\n            };\n        });\n        return baseSortBy(result, function(object, other) {\n            return compareMultiple(object, other, orders);\n        });\n    }\n    var arrayMap = __webpack_require__(179), baseIteratee = __webpack_require__(89), baseMap = __webpack_require__(325), baseSortBy = __webpack_require__(830), baseUnary = __webpack_require__(319), compareMultiple = __webpack_require__(831), identity = __webpack_require__(68);\n    module.exports = baseOrderBy;\n}, function(module, exports, __webpack_require__) {\n    function baseMatches(source) {\n        var matchData = getMatchData(source);\n        return 1 == matchData.length && matchData[0][2] ? matchesStrictComparable(matchData[0][0], matchData[0][1]) : function(object) {\n            return object === source || baseIsMatch(object, source, matchData);\n        };\n    }\n    var baseIsMatch = __webpack_require__(816), getMatchData = __webpack_require__(817), matchesStrictComparable = __webpack_require__(324);\n    module.exports = baseMatches;\n}, function(module, exports, __webpack_require__) {\n    function baseIsMatch(object, source, matchData, customizer) {\n        var index = matchData.length, length = index, noCustomizer = !customizer;\n        if (null == object) return !length;\n        for (object = Object(object); index--; ) {\n            var data = matchData[index];\n            if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) return !1;\n        }\n        for (;++index < length; ) {\n            data = matchData[index];\n            var key = data[0], objValue = object[key], srcValue = data[1];\n            if (noCustomizer && data[2]) {\n                if (void 0 === objValue && !(key in object)) return !1;\n            } else {\n                var stack = new Stack();\n                if (customizer) var result = customizer(objValue, srcValue, key, object, source, stack);\n                if (!(void 0 === result ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result)) return !1;\n            }\n        }\n        return !0;\n    }\n    var Stack = __webpack_require__(314), baseIsEqual = __webpack_require__(199), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;\n    module.exports = baseIsMatch;\n}, function(module, exports, __webpack_require__) {\n    function getMatchData(object) {\n        for (var result = keys(object), length = result.length; length--; ) {\n            var key = result[length], value = object[key];\n            result[length] = [ key, value, isStrictComparable(value) ];\n        }\n        return result;\n    }\n    var isStrictComparable = __webpack_require__(323), keys = __webpack_require__(200);\n    module.exports = getMatchData;\n}, function(module, exports, __webpack_require__) {\n    function baseMatchesProperty(path, srcValue) {\n        return isKey(path) && isStrictComparable(srcValue) ? matchesStrictComparable(toKey(path), srcValue) : function(object) {\n            var objValue = get(object, path);\n            return void 0 === objValue && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n        };\n    }\n    var baseIsEqual = __webpack_require__(199), get = __webpack_require__(174), hasIn = __webpack_require__(819), isKey = __webpack_require__(175), isStrictComparable = __webpack_require__(323), matchesStrictComparable = __webpack_require__(324), toKey = __webpack_require__(119), COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;\n    module.exports = baseMatchesProperty;\n}, function(module, exports, __webpack_require__) {\n    function hasIn(object, path) {\n        return null != object && hasPath(object, path, baseHasIn);\n    }\n    var baseHasIn = __webpack_require__(820), hasPath = __webpack_require__(821);\n    module.exports = hasIn;\n}, function(module, exports) {\n    function baseHasIn(object, key) {\n        return null != object && key in Object(object);\n    }\n    module.exports = baseHasIn;\n}, function(module, exports, __webpack_require__) {\n    function hasPath(object, path, hasFunc) {\n        path = castPath(path, object);\n        for (var index = -1, length = path.length, result = !1; ++index < length; ) {\n            var key = toKey(path[index]);\n            if (!(result = null != object && hasFunc(object, key))) break;\n            object = object[key];\n        }\n        return result || ++index != length ? result : !!(length = null == object ? 0 : object.length) && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object));\n    }\n    var castPath = __webpack_require__(270), isArguments = __webpack_require__(201), isArray = __webpack_require__(13), isIndex = __webpack_require__(202), isLength = __webpack_require__(203), toKey = __webpack_require__(119);\n    module.exports = hasPath;\n}, function(module, exports, __webpack_require__) {\n    function property(path) {\n        return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n    var baseProperty = __webpack_require__(823), basePropertyDeep = __webpack_require__(824), isKey = __webpack_require__(175), toKey = __webpack_require__(119);\n    module.exports = property;\n}, function(module, exports) {\n    function baseProperty(key) {\n        return function(object) {\n            return null == object ? void 0 : object[key];\n        };\n    }\n    module.exports = baseProperty;\n}, function(module, exports, __webpack_require__) {\n    function basePropertyDeep(path) {\n        return function(object) {\n            return baseGet(object, path);\n        };\n    }\n    var baseGet = __webpack_require__(269);\n    module.exports = basePropertyDeep;\n}, function(module, exports, __webpack_require__) {\n    var baseForOwn = __webpack_require__(826), createBaseEach = __webpack_require__(829), baseEach = createBaseEach(baseForOwn);\n    module.exports = baseEach;\n}, function(module, exports, __webpack_require__) {\n    function baseForOwn(object, iteratee) {\n        return object && baseFor(object, iteratee, keys);\n    }\n    var baseFor = __webpack_require__(827), keys = __webpack_require__(200);\n    module.exports = baseForOwn;\n}, function(module, exports, __webpack_require__) {\n    var createBaseFor = __webpack_require__(828), baseFor = createBaseFor();\n    module.exports = baseFor;\n}, function(module, exports) {\n    function createBaseFor(fromRight) {\n        return function(object, iteratee, keysFunc) {\n            for (var index = -1, iterable = Object(object), props = keysFunc(object), length = props.length; length--; ) {\n                var key = props[fromRight ? length : ++index];\n                if (!1 === iteratee(iterable[key], key, iterable)) break;\n            }\n            return object;\n        };\n    }\n    module.exports = createBaseFor;\n}, function(module, exports, __webpack_require__) {\n    function createBaseEach(eachFunc, fromRight) {\n        return function(collection, iteratee) {\n            if (null == collection) return collection;\n            if (!isArrayLike(collection)) return eachFunc(collection, iteratee);\n            for (var length = collection.length, index = fromRight ? length : -1, iterable = Object(collection); (fromRight ? index-- : ++index < length) && !1 !== iteratee(iterable[index], index, iterable); ) ;\n            return collection;\n        };\n    }\n    var isArrayLike = __webpack_require__(134);\n    module.exports = createBaseEach;\n}, function(module, exports) {\n    function baseSortBy(array, comparer) {\n        var length = array.length;\n        for (array.sort(comparer); length--; ) array[length] = array[length].value;\n        return array;\n    }\n    module.exports = baseSortBy;\n}, function(module, exports, __webpack_require__) {\n    function compareMultiple(object, other, orders) {\n        for (var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length; ++index < length; ) {\n            var result = compareAscending(objCriteria[index], othCriteria[index]);\n            if (result) {\n                if (index >= ordersLength) return result;\n                return result * (\"desc\" == orders[index] ? -1 : 1);\n            }\n        }\n        return object.index - other.index;\n    }\n    var compareAscending = __webpack_require__(832);\n    module.exports = compareMultiple;\n}, function(module, exports, __webpack_require__) {\n    function compareAscending(value, other) {\n        if (value !== other) {\n            var valIsDefined = void 0 !== value, valIsNull = null === value, valIsReflexive = value === value, valIsSymbol = isSymbol(value), othIsDefined = void 0 !== other, othIsNull = null === other, othIsReflexive = other === other, othIsSymbol = isSymbol(other);\n            if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) return 1;\n            if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) return -1;\n        }\n        return 0;\n    }\n    var isSymbol = __webpack_require__(67);\n    module.exports = compareAscending;\n}, function(module, exports, __webpack_require__) {\n    function baseRest(func, start) {\n        return setToString(overRest(func, start, identity), func + \"\");\n    }\n    var identity = __webpack_require__(68), overRest = __webpack_require__(834), setToString = __webpack_require__(836);\n    module.exports = baseRest;\n}, function(module, exports, __webpack_require__) {\n    function overRest(func, start, transform) {\n        return start = nativeMax(void 0 === start ? func.length - 1 : start, 0), function() {\n            for (var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array(length); ++index < length; ) array[index] = args[start + index];\n            index = -1;\n            for (var otherArgs = Array(start + 1); ++index < start; ) otherArgs[index] = args[index];\n            return otherArgs[start] = transform(array), apply(func, this, otherArgs);\n        };\n    }\n    var apply = __webpack_require__(835), nativeMax = Math.max;\n    module.exports = overRest;\n}, function(module, exports) {\n    function apply(func, thisArg, args) {\n        switch (args.length) {\n          case 0:\n            return func.call(thisArg);\n\n          case 1:\n            return func.call(thisArg, args[0]);\n\n          case 2:\n            return func.call(thisArg, args[0], args[1]);\n\n          case 3:\n            return func.call(thisArg, args[0], args[1], args[2]);\n        }\n        return func.apply(thisArg, args);\n    }\n    module.exports = apply;\n}, function(module, exports, __webpack_require__) {\n    var baseSetToString = __webpack_require__(837), shortOut = __webpack_require__(840), setToString = shortOut(baseSetToString);\n    module.exports = setToString;\n}, function(module, exports, __webpack_require__) {\n    var constant = __webpack_require__(838), defineProperty = __webpack_require__(839), identity = __webpack_require__(68), baseSetToString = defineProperty ? function(func, string) {\n        return defineProperty(func, \"toString\", {\n            configurable: !0,\n            enumerable: !1,\n            value: constant(string),\n            writable: !0\n        });\n    } : identity;\n    module.exports = baseSetToString;\n}, function(module, exports) {\n    function constant(value) {\n        return function() {\n            return value;\n        };\n    }\n    module.exports = constant;\n}, function(module, exports, __webpack_require__) {\n    var getNative = __webpack_require__(57), defineProperty = function() {\n        try {\n            var func = getNative(Object, \"defineProperty\");\n            return func({}, \"\", {}), func;\n        } catch (e) {}\n    }();\n    module.exports = defineProperty;\n}, function(module, exports) {\n    function shortOut(func) {\n        var count = 0, lastCalled = 0;\n        return function() {\n            var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);\n            if (lastCalled = stamp, remaining > 0) {\n                if (++count >= HOT_COUNT) return arguments[0];\n            } else count = 0;\n            return func.apply(void 0, arguments);\n        };\n    }\n    var HOT_COUNT = 800, HOT_SPAN = 16, nativeNow = Date.now;\n    module.exports = shortOut;\n}, function(module, exports, __webpack_require__) {\n    function max(array) {\n        return array && array.length ? baseExtremum(array, identity, baseGt) : void 0;\n    }\n    var baseExtremum = __webpack_require__(135), baseGt = __webpack_require__(327), identity = __webpack_require__(68);\n    module.exports = max;\n}, function(module, exports, __webpack_require__) {\n    function flatMap(collection, iteratee) {\n        return baseFlatten(map(collection, iteratee), 1);\n    }\n    var baseFlatten = __webpack_require__(322), map = __webpack_require__(843);\n    module.exports = flatMap;\n}, function(module, exports, __webpack_require__) {\n    function map(collection, iteratee) {\n        return (isArray(collection) ? arrayMap : baseMap)(collection, baseIteratee(iteratee, 3));\n    }\n    var arrayMap = __webpack_require__(179), baseIteratee = __webpack_require__(89), baseMap = __webpack_require__(325), isArray = __webpack_require__(13);\n    module.exports = map;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _getNiceTickValues = __webpack_require__(845);\n    Object.defineProperty(exports, \"getTickValues\", {\n        enumerable: !0,\n        get: function() {\n            return _getNiceTickValues.getTickValues;\n        }\n    }), Object.defineProperty(exports, \"getNiceTickValues\", {\n        enumerable: !0,\n        get: function() {\n            return _getNiceTickValues.getNiceTickValues;\n        }\n    }), Object.defineProperty(exports, \"getTickValuesFixedDomain\", {\n        enumerable: !0,\n        get: function() {\n            return _getNiceTickValues.getTickValuesFixedDomain;\n        }\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _toConsumableArray(arr) {\n        if (Array.isArray(arr)) {\n            for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n            return arr2;\n        }\n        return Array.from(arr);\n    }\n    function getValidInterval(_ref) {\n        var _ref2 = _slicedToArray(_ref, 2), min = _ref2[0], max = _ref2[1], validMin = min, validMax = max;\n        return min > max && (validMin = max, validMax = min), [ validMin, validMax ];\n    }\n    function getFormatStep(roughStep, allowDecimals, correctionFactor) {\n        if (roughStep <= 0) return 0;\n        var digitCount = _arithmetic2.default.getDigitCount(roughStep), stepRatio = roughStep / Math.pow(10, digitCount), amendStepRatio = 1 !== digitCount ? _arithmetic2.default.multiply(Math.ceil(stepRatio / .05) + correctionFactor, .05) : _arithmetic2.default.multiply(Math.ceil(stepRatio / .1) + correctionFactor, .1), formatStep = _arithmetic2.default.multiply(amendStepRatio, Math.pow(10, digitCount));\n        return allowDecimals ? formatStep : Math.ceil(formatStep);\n    }\n    function getTickOfSingleValue(value, tickCount, allowDecimals) {\n        var isFlt = _arithmetic2.default.isFloat(value), step = 1, middle = value;\n        if (isFlt && allowDecimals) {\n            var absVal = Math.abs(value);\n            absVal < 1 ? (step = Math.pow(10, _arithmetic2.default.getDigitCount(value) - 1), \n            middle = _arithmetic2.default.multiply(Math.floor(value / step), step)) : absVal > 1 && (middle = Math.floor(value));\n        } else 0 === value ? middle = Math.floor((tickCount - 1) / 2) : allowDecimals || (middle = Math.floor(value));\n        var middleIndex = Math.floor((tickCount - 1) / 2);\n        return (0, _utils.compose)((0, _utils.map)(function(n) {\n            return _arithmetic2.default.sum(middle, _arithmetic2.default.multiply(n - middleIndex, step));\n        }), _utils.range)(0, tickCount);\n    }\n    function calculateStep(min, max, tickCount, allowDecimals) {\n        var correctionFactor = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : 0, step = getFormatStep((max - min) / (tickCount - 1), allowDecimals, correctionFactor), middle = void 0;\n        min <= 0 && max >= 0 ? middle = 0 : (middle = _arithmetic2.default.divide(_arithmetic2.default.sum(min, max), 2), \n        middle = _arithmetic2.default.minus(middle, _arithmetic2.default.modulo(middle, step)), \n        middle = _arithmetic2.default.strip(middle, 16));\n        var belowCount = Math.ceil((middle - min) / step), upCount = Math.ceil((max - middle) / step), scaleCount = belowCount + upCount + 1;\n        return scaleCount > tickCount ? calculateStep(min, max, tickCount, allowDecimals, correctionFactor + 1) : (scaleCount < tickCount && (upCount = max > 0 ? upCount + (tickCount - scaleCount) : upCount, \n        belowCount = max > 0 ? belowCount : belowCount + (tickCount - scaleCount)), {\n            step: step,\n            tickMin: _arithmetic2.default.minus(middle, _arithmetic2.default.multiply(belowCount, step)),\n            tickMax: _arithmetic2.default.sum(middle, _arithmetic2.default.multiply(upCount, step))\n        });\n    }\n    function getNiceTickValuesFn(_ref3) {\n        var _ref4 = _slicedToArray(_ref3, 2), min = _ref4[0], max = _ref4[1], tickCount = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 6, allowDecimals = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], count = Math.max(tickCount, 2), _getValidInterval = getValidInterval([ min, max ]), _getValidInterval2 = _slicedToArray(_getValidInterval, 2), cormin = _getValidInterval2[0], cormax = _getValidInterval2[1];\n        if (cormin === cormax) return getTickOfSingleValue(cormin, tickCount, allowDecimals);\n        var _calculateStep = calculateStep(cormin, cormax, count, allowDecimals), step = _calculateStep.step, tickMin = _calculateStep.tickMin, tickMax = _calculateStep.tickMax, values = _arithmetic2.default.rangeStep(tickMin, tickMax + .1 * step, step);\n        return min > max ? (0, _utils.reverse)(values) : values;\n    }\n    function getTickValuesFn(_ref5) {\n        var _ref6 = _slicedToArray(_ref5, 2), min = _ref6[0], max = _ref6[1], tickCount = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 6, allowDecimals = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], count = Math.max(tickCount, 2), _getValidInterval3 = getValidInterval([ min, max ]), _getValidInterval4 = _slicedToArray(_getValidInterval3, 2), cormin = _getValidInterval4[0], cormax = _getValidInterval4[1];\n        if (cormin === cormax) return getTickOfSingleValue(cormin, tickCount, allowDecimals);\n        var step = getFormatStep((cormax - cormin) / (count - 1), allowDecimals, 0), fn = (0, \n        _utils.compose)((0, _utils.map)(function(n) {\n            return cormin + n * step;\n        }), _utils.range), values = fn(0, count).filter(function(entry) {\n            return entry >= cormin && entry <= cormax;\n        });\n        return min > max ? (0, _utils.reverse)(values) : values;\n    }\n    function getTickValuesFixedDomainFn(_ref7, tickCount) {\n        var _ref8 = _slicedToArray(_ref7, 2), min = _ref8[0], max = _ref8[1], allowDecimals = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], _getValidInterval5 = getValidInterval([ min, max ]), _getValidInterval6 = _slicedToArray(_getValidInterval5, 2), cormin = _getValidInterval6[0], cormax = _getValidInterval6[1];\n        if (cormin === cormax) return [ cormin ];\n        var count = Math.max(tickCount, 2), step = getFormatStep((cormax - cormin) / (count - 1), allowDecimals, 0), values = [].concat(_toConsumableArray(_arithmetic2.default.rangeStep(cormin, cormax - .99 * step, step)), [ cormax ]);\n        return min > max ? (0, _utils.reverse)(values) : values;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.getTickValuesFixedDomain = exports.getTickValues = exports.getNiceTickValues = void 0;\n    var _slicedToArray = function() {\n        function sliceIterator(arr, i) {\n            var _arr = [], _n = !0, _d = !1, _e = void 0;\n            try {\n                for (var _s, _i = arr[Symbol.iterator](); !(_n = (_s = _i.next()).done) && (_arr.push(_s.value), \n                !i || _arr.length !== i); _n = !0) ;\n            } catch (err) {\n                _d = !0, _e = err;\n            } finally {\n                try {\n                    !_n && _i.return && _i.return();\n                } finally {\n                    if (_d) throw _e;\n                }\n            }\n            return _arr;\n        }\n        return function(arr, i) {\n            if (Array.isArray(arr)) return arr;\n            if (Symbol.iterator in Object(arr)) return sliceIterator(arr, i);\n            throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n        };\n    }(), _utils = __webpack_require__(330), _arithmetic = __webpack_require__(846), _arithmetic2 = function(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }(_arithmetic);\n    exports.getNiceTickValues = (0, _utils.memoize)(getNiceTickValuesFn), exports.getTickValues = (0, \n    _utils.memoize)(getTickValuesFn), exports.getTickValuesFixedDomain = (0, _utils.memoize)(getTickValuesFixedDomainFn);\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function strip(num) {\n        var precision = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 12;\n        return +parseFloat(num.toPrecision(precision));\n    }\n    function isFloat(num) {\n        return /^([+-]?)\\d*\\.\\d+$/.test(num);\n    }\n    function getDigitCount(value) {\n        var abs = Math.abs(value);\n        return 0 === value ? 1 : Math.floor(Math.log(abs) / Math.log(10)) + 1;\n    }\n    function getDecimalDigitCount(a) {\n        var str = a ? \"\" + a : \"\";\n        if (str.indexOf(\"e\") >= 0) return Math.abs(parseInt(str.slice(str.indexOf(\"e\") + 1), 10));\n        var ary = str.split(\".\");\n        return ary.length > 1 ? ary[1].length : 0;\n    }\n    function multiply(a, b) {\n        var intA = parseInt((\"\" + a).replace(\".\", \"\"), 10), intB = parseInt((\"\" + b).replace(\".\", \"\"), 10), count = getDecimalDigitCount(a) + getDecimalDigitCount(b);\n        return intA * intB / Math.pow(10, count);\n    }\n    function sum(a, b) {\n        var count = Math.max(getDecimalDigitCount(a), getDecimalDigitCount(b));\n        return count = Math.pow(10, count), (multiply(a, count) + multiply(b, count)) / count;\n    }\n    function minus(a, b) {\n        return sum(a, -b);\n    }\n    function divide(a, b) {\n        var ca = getDecimalDigitCount(a), cb = getDecimalDigitCount(b);\n        return parseInt((\"\" + a).replace(\".\", \"\"), 10) / parseInt((\"\" + b).replace(\".\", \"\"), 10) * Math.pow(10, cb - ca);\n    }\n    function modulo(a, b) {\n        var mod = Math.abs(b);\n        return b <= 0 ? a : minus(a, multiply(mod, Math.floor(a / mod)));\n    }\n    function rangeStep(start, end, step) {\n        for (var num = start, result = []; num < end; ) result.push(num), num = sum(num, step);\n        return result;\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _utils = __webpack_require__(330), interpolateNumber = (0, _utils.curry)(function(a, b, t) {\n        var newA = +a;\n        return newA + t * (+b - newA);\n    }), uninterpolateNumber = (0, _utils.curry)(function(a, b, x) {\n        var diff = b - +a;\n        return diff = diff || 1 / 0, (x - a) / diff;\n    }), uninterpolateTruncation = (0, _utils.curry)(function(a, b, x) {\n        var diff = b - +a;\n        return diff = diff || 1 / 0, Math.max(0, Math.min(1, (x - a) / diff));\n    });\n    exports.default = {\n        rangeStep: rangeStep,\n        isFloat: isFloat,\n        getDigitCount: getDigitCount,\n        getDecimalDigitCount: getDecimalDigitCount,\n        sum: sum,\n        minus: minus,\n        multiply: multiply,\n        divide: divide,\n        modulo: modulo,\n        strip: strip,\n        interpolateNumber: interpolateNumber,\n        uninterpolateNumber: uninterpolateNumber,\n        uninterpolateTruncation: uninterpolateTruncation\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function band() {\n        function rescale() {\n            var n = domain().length, reverse = range[1] < range[0], start = range[reverse - 0], stop = range[1 - reverse];\n            step = (stop - start) / Math.max(1, n - paddingInner + 2 * paddingOuter), round && (step = Math.floor(step)), \n            start += (stop - start - step * (n - paddingInner)) * align, bandwidth = step * (1 - paddingInner), \n            round && (start = Math.round(start), bandwidth = Math.round(bandwidth));\n            var values = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.e)(n).map(function(i) {\n                return start + step * i;\n            });\n            return ordinalRange(reverse ? values.reverse() : values);\n        }\n        var step, bandwidth, scale = Object(__WEBPACK_IMPORTED_MODULE_1__ordinal__.a)().unknown(void 0), domain = scale.domain, ordinalRange = scale.range, range = [ 0, 1 ], round = !1, paddingInner = 0, paddingOuter = 0, align = .5;\n        return delete scale.unknown, scale.domain = function(_) {\n            return arguments.length ? (domain(_), rescale()) : domain();\n        }, scale.range = function(_) {\n            return arguments.length ? (range = [ +_[0], +_[1] ], rescale()) : range.slice();\n        }, scale.rangeRound = function(_) {\n            return range = [ +_[0], +_[1] ], round = !0, rescale();\n        }, scale.bandwidth = function() {\n            return bandwidth;\n        }, scale.step = function() {\n            return step;\n        }, scale.round = function(_) {\n            return arguments.length ? (round = !!_, rescale()) : round;\n        }, scale.padding = function(_) {\n            return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), \n            rescale()) : paddingInner;\n        }, scale.paddingInner = function(_) {\n            return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;\n        }, scale.paddingOuter = function(_) {\n            return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;\n        }, scale.align = function(_) {\n            return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;\n        }, scale.copy = function() {\n            return band().domain(domain()).range(range).round(round).paddingInner(paddingInner).paddingOuter(paddingOuter).align(align);\n        }, rescale();\n    }\n    function pointish(scale) {\n        var copy = scale.copy;\n        return scale.padding = scale.paddingOuter, delete scale.paddingInner, delete scale.paddingOuter, \n        scale.copy = function() {\n            return pointish(copy());\n        }, scale;\n    }\n    function point() {\n        return pointish(band().paddingInner(1));\n    }\n    __webpack_exports__.a = band, __webpack_exports__.b = point;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__ordinal__ = __webpack_require__(344);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(334);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(338), __webpack_require__(332), __webpack_require__(851), __webpack_require__(337), \n    __webpack_require__(852), __webpack_require__(339), __webpack_require__(340), __webpack_require__(341);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return function() {\n            return x;\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return x;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(338), __webpack_require__(69), __webpack_require__(90), __webpack_require__(204);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(335);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(90);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(69), __webpack_require__(90), __webpack_require__(204);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(69);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(343);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_2__src_map__ = (__webpack_require__(865), __webpack_require__(866), \n    __webpack_require__(205));\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return __WEBPACK_IMPORTED_MODULE_2__src_map__.a;\n    });\n    __webpack_require__(867), __webpack_require__(868), __webpack_require__(869);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(205);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function Set() {}\n    function set(object, f) {\n        var set = new Set();\n        if (object instanceof Set) object.each(function(value) {\n            set.add(value);\n        }); else if (object) {\n            var i = -1, n = object.length;\n            if (null == f) for (;++i < n; ) set.add(object[i]); else for (;++i < n; ) set.add(f(object[i], i, object));\n        }\n        return set;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__map__ = __webpack_require__(205), proto = __WEBPACK_IMPORTED_MODULE_0__map__.a.prototype;\n    Set.prototype = set.prototype = {\n        constructor: Set,\n        has: proto.has,\n        add: function(value) {\n            return value += \"\", this[__WEBPACK_IMPORTED_MODULE_0__map__.b + value] = value, \n            this;\n        },\n        remove: proto.remove,\n        clear: proto.clear,\n        values: proto.keys,\n        size: proto.size,\n        empty: proto.empty,\n        each: proto.each\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function identity() {\n        function scale(x) {\n            return +x;\n        }\n        var domain = [ 0, 1 ];\n        return scale.invert = scale, scale.domain = scale.range = function(_) {\n            return arguments.length ? (domain = __WEBPACK_IMPORTED_MODULE_0__array__.a.call(_, __WEBPACK_IMPORTED_MODULE_2__number__.a), \n            scale) : domain.slice();\n        }, scale.copy = function() {\n            return identity().domain(domain);\n        }, Object(__WEBPACK_IMPORTED_MODULE_1__linear__.b)(scale);\n    }\n    __webpack_exports__.a = identity;\n    var __WEBPACK_IMPORTED_MODULE_0__array__ = __webpack_require__(62), __WEBPACK_IMPORTED_MODULE_1__linear__ = __webpack_require__(91), __WEBPACK_IMPORTED_MODULE_2__number__ = __webpack_require__(353);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function labConvert(o) {\n        if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);\n        if (o instanceof Hcl) {\n            var h = o.h * __WEBPACK_IMPORTED_MODULE_2__math__.a;\n            return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);\n        }\n        o instanceof __WEBPACK_IMPORTED_MODULE_1__color__.b || (o = Object(__WEBPACK_IMPORTED_MODULE_1__color__.h)(o));\n        var b = rgb2xyz(o.r), a = rgb2xyz(o.g), l = rgb2xyz(o.b), x = xyz2lab((.4124564 * b + .3575761 * a + .1804375 * l) / Xn), y = xyz2lab((.2126729 * b + .7151522 * a + .072175 * l) / Yn);\n        return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - xyz2lab((.0193339 * b + .119192 * a + .9503041 * l) / Zn)), o.opacity);\n    }\n    function lab(l, a, b, opacity) {\n        return 1 === arguments.length ? labConvert(l) : new Lab(l, a, b, null == opacity ? 1 : opacity);\n    }\n    function Lab(l, a, b, opacity) {\n        this.l = +l, this.a = +a, this.b = +b, this.opacity = +opacity;\n    }\n    function xyz2lab(t) {\n        return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;\n    }\n    function lab2xyz(t) {\n        return t > t1 ? t * t * t : t2 * (t - t0);\n    }\n    function xyz2rgb(x) {\n        return 255 * (x <= .0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - .055);\n    }\n    function rgb2xyz(x) {\n        return (x /= 255) <= .04045 ? x / 12.92 : Math.pow((x + .055) / 1.055, 2.4);\n    }\n    function hclConvert(o) {\n        if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);\n        o instanceof Lab || (o = labConvert(o));\n        var h = Math.atan2(o.b, o.a) * __WEBPACK_IMPORTED_MODULE_2__math__.b;\n        return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);\n    }\n    function hcl(h, c, l, opacity) {\n        return 1 === arguments.length ? hclConvert(h) : new Hcl(h, c, l, null == opacity ? 1 : opacity);\n    }\n    function Hcl(h, c, l, opacity) {\n        this.h = +h, this.c = +c, this.l = +l, this.opacity = +opacity;\n    }\n    __webpack_exports__.a = lab, __webpack_exports__.b = hcl;\n    var __WEBPACK_IMPORTED_MODULE_0__define__ = __webpack_require__(208), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(207), __WEBPACK_IMPORTED_MODULE_2__math__ = __webpack_require__(345), Xn = .95047, Yn = 1, Zn = 1.08883, t0 = 4 / 29, t1 = 6 / 29, t2 = 3 * t1 * t1, t3 = t1 * t1 * t1;\n    Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Lab, lab, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(__WEBPACK_IMPORTED_MODULE_1__color__.a, {\n        brighter: function(k) {\n            return new Lab(this.l + 18 * (null == k ? 1 : k), this.a, this.b, this.opacity);\n        },\n        darker: function(k) {\n            return new Lab(this.l - 18 * (null == k ? 1 : k), this.a, this.b, this.opacity);\n        },\n        rgb: function() {\n            var y = (this.l + 16) / 116, x = isNaN(this.a) ? y : y + this.a / 500, z = isNaN(this.b) ? y : y - this.b / 200;\n            return y = Yn * lab2xyz(y), x = Xn * lab2xyz(x), z = Zn * lab2xyz(z), new __WEBPACK_IMPORTED_MODULE_1__color__.b(xyz2rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), xyz2rgb(-.969266 * x + 1.8760108 * y + .041556 * z), xyz2rgb(.0556434 * x - .2040259 * y + 1.0572252 * z), this.opacity);\n        }\n    })), Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Hcl, hcl, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(__WEBPACK_IMPORTED_MODULE_1__color__.a, {\n        brighter: function(k) {\n            return new Hcl(this.h, this.c, this.l + 18 * (null == k ? 1 : k), this.opacity);\n        },\n        darker: function(k) {\n            return new Hcl(this.h, this.c, this.l - 18 * (null == k ? 1 : k), this.opacity);\n        },\n        rgb: function() {\n            return labConvert(this).rgb();\n        }\n    }));\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function cubehelixConvert(o) {\n        if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);\n        o instanceof __WEBPACK_IMPORTED_MODULE_1__color__.b || (o = Object(__WEBPACK_IMPORTED_MODULE_1__color__.h)(o));\n        var r = o.r / 255, g = o.g / 255, b = o.b / 255, l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), bl = b - l, k = (E * (g - l) - C * bl) / D, s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), h = s ? Math.atan2(k, bl) * __WEBPACK_IMPORTED_MODULE_2__math__.b - 120 : NaN;\n        return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);\n    }\n    function cubehelix(h, s, l, opacity) {\n        return 1 === arguments.length ? cubehelixConvert(h) : new Cubehelix(h, s, l, null == opacity ? 1 : opacity);\n    }\n    function Cubehelix(h, s, l, opacity) {\n        this.h = +h, this.s = +s, this.l = +l, this.opacity = +opacity;\n    }\n    __webpack_exports__.a = cubehelix;\n    var __WEBPACK_IMPORTED_MODULE_0__define__ = __webpack_require__(208), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(207), __WEBPACK_IMPORTED_MODULE_2__math__ = __webpack_require__(345), A = -.14861, B = 1.78277, C = -.29227, D = -.90649, E = 1.97294, ED = E * D, EB = E * B, BC_DA = B * C - D * A;\n    Object(__WEBPACK_IMPORTED_MODULE_0__define__.a)(Cubehelix, cubehelix, Object(__WEBPACK_IMPORTED_MODULE_0__define__.b)(__WEBPACK_IMPORTED_MODULE_1__color__.a, {\n        brighter: function(k) {\n            return k = null == k ? __WEBPACK_IMPORTED_MODULE_1__color__.c : Math.pow(__WEBPACK_IMPORTED_MODULE_1__color__.c, k), \n            new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n        },\n        darker: function(k) {\n            return k = null == k ? __WEBPACK_IMPORTED_MODULE_1__color__.d : Math.pow(__WEBPACK_IMPORTED_MODULE_1__color__.d, k), \n            new Cubehelix(this.h, this.s, this.l * k, this.opacity);\n        },\n        rgb: function() {\n            var h = isNaN(this.h) ? 0 : (this.h + 120) * __WEBPACK_IMPORTED_MODULE_2__math__.a, l = +this.l, a = isNaN(this.s) ? 0 : this.s * l * (1 - l), cosh = Math.cos(h), sinh = Math.sin(h);\n            return new __WEBPACK_IMPORTED_MODULE_1__color__.b(255 * (l + a * (A * cosh + B * sinh)), 255 * (l + a * (C * cosh + D * sinh)), 255 * (l + a * (E * cosh)), this.opacity);\n        }\n    }));\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(a, b) {\n        return a = +a, b -= a, function(t) {\n            return Math.round(a + b * t);\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function interpolateTransform(parse, pxComma, pxParen, degParen) {\n        function pop(s) {\n            return s.length ? s.pop() + \" \" : \"\";\n        }\n        function translate(xa, ya, xb, yb, s, q) {\n            if (xa !== xb || ya !== yb) {\n                var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n                q.push({\n                    i: i - 4,\n                    x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(xa, xb)\n                }, {\n                    i: i - 2,\n                    x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(ya, yb)\n                });\n            } else (xb || yb) && s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n        }\n        function rotate(a, b, s, q) {\n            a !== b ? (a - b > 180 ? b += 360 : b - a > 180 && (a += 360), q.push({\n                i: s.push(pop(s) + \"rotate(\", null, degParen) - 2,\n                x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(a, b)\n            })) : b && s.push(pop(s) + \"rotate(\" + b + degParen);\n        }\n        function skewX(a, b, s, q) {\n            a !== b ? q.push({\n                i: s.push(pop(s) + \"skewX(\", null, degParen) - 2,\n                x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(a, b)\n            }) : b && s.push(pop(s) + \"skewX(\" + b + degParen);\n        }\n        function scale(xa, ya, xb, yb, s, q) {\n            if (xa !== xb || ya !== yb) {\n                var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n                q.push({\n                    i: i - 4,\n                    x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(xa, xb)\n                }, {\n                    i: i - 2,\n                    x: Object(__WEBPACK_IMPORTED_MODULE_0__number__.a)(ya, yb)\n                });\n            } else 1 === xb && 1 === yb || s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n        }\n        return function(a, b) {\n            var s = [], q = [];\n            return a = parse(a), b = parse(b), translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q), \n            rotate(a.rotate, b.rotate, s, q), skewX(a.skewX, b.skewX, s, q), scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q), \n            a = b = null, function(t) {\n                for (var o, i = -1, n = q.length; ++i < n; ) s[(o = q[i]).i] = o.x(t);\n                return s.join(\"\");\n            };\n        };\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__number__ = __webpack_require__(136), __WEBPACK_IMPORTED_MODULE_1__parse__ = __webpack_require__(875);\n    interpolateTransform(__WEBPACK_IMPORTED_MODULE_1__parse__.a, \"px, \", \"px)\", \"deg)\"), \n    interpolateTransform(__WEBPACK_IMPORTED_MODULE_1__parse__.b, \", \", \")\", \")\");\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function parseCss(value) {\n        return \"none\" === value ? __WEBPACK_IMPORTED_MODULE_0__decompose__.b : (cssNode || (cssNode = document.createElement(\"DIV\"), \n        cssRoot = document.documentElement, cssView = document.defaultView), cssNode.style.transform = value, \n        value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue(\"transform\"), \n        cssRoot.removeChild(cssNode), value = value.slice(7, -1).split(\",\"), Object(__WEBPACK_IMPORTED_MODULE_0__decompose__.a)(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]));\n    }\n    function parseSvg(value) {\n        return null == value ? __WEBPACK_IMPORTED_MODULE_0__decompose__.b : (svgNode || (svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\")), \n        svgNode.setAttribute(\"transform\", value), (value = svgNode.transform.baseVal.consolidate()) ? (value = value.matrix, \n        Object(__WEBPACK_IMPORTED_MODULE_0__decompose__.a)(value.a, value.b, value.c, value.d, value.e, value.f)) : __WEBPACK_IMPORTED_MODULE_0__decompose__.b);\n    }\n    __webpack_exports__.a = parseCss, __webpack_exports__.b = parseSvg;\n    var cssNode, cssRoot, cssView, svgNode, __WEBPACK_IMPORTED_MODULE_0__decompose__ = __webpack_require__(876);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return identity;\n    });\n    var degrees = 180 / Math.PI, identity = {\n        translateX: 0,\n        translateY: 0,\n        rotate: 0,\n        skewX: 0,\n        scaleX: 1,\n        scaleY: 1\n    };\n    __webpack_exports__.a = function(a, b, c, d, e, f) {\n        var scaleX, scaleY, skewX;\n        return (scaleX = Math.sqrt(a * a + b * b)) && (a /= scaleX, b /= scaleX), (skewX = a * c + b * d) && (c -= a * skewX, \n        d -= b * skewX), (scaleY = Math.sqrt(c * c + d * d)) && (c /= scaleY, d /= scaleY, \n        skewX /= scaleY), a * d < b * c && (a = -a, b = -b, skewX = -skewX, scaleX = -scaleX), \n        {\n            translateX: e,\n            translateY: f,\n            rotate: Math.atan2(b, a) * degrees,\n            skewX: Math.atan(skewX) * degrees,\n            scaleX: scaleX,\n            scaleY: scaleY\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    Math.SQRT2;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function hsl(hue) {\n        return function(start, end) {\n            var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.d)(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.d)(end)).h), s = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.s, end.s), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.opacity, end.opacity);\n            return function(t) {\n                return start.h = h(t), start.s = s(t), start.l = l(t), start.opacity = opacity(t), \n                start + \"\";\n            };\n        };\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(93);\n    hsl(__WEBPACK_IMPORTED_MODULE_1__color__.c), hsl(__WEBPACK_IMPORTED_MODULE_1__color__.a);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__(46), __webpack_require__(93);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function hcl(hue) {\n        return function(start, end) {\n            var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.c)(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.c)(end)).h), c = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.c, end.c), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.opacity, end.opacity);\n            return function(t) {\n                return start.h = h(t), start.c = c(t), start.l = l(t), start.opacity = opacity(t), \n                start + \"\";\n            };\n        };\n    }\n    var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(93);\n    hcl(__WEBPACK_IMPORTED_MODULE_1__color__.c), hcl(__WEBPACK_IMPORTED_MODULE_1__color__.a);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function cubehelix(hue) {\n        return function cubehelixGamma(y) {\n            function cubehelix(start, end) {\n                var h = hue((start = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(start)).h, (end = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(end)).h), s = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.s, end.s), l = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.l, end.l), opacity = Object(__WEBPACK_IMPORTED_MODULE_1__color__.a)(start.opacity, end.opacity);\n                return function(t) {\n                    return start.h = h(t), start.s = s(t), start.l = l(Math.pow(t, y)), start.opacity = opacity(t), \n                    start + \"\";\n                };\n            }\n            return y = +y, cubehelix.gamma = cubehelixGamma, cubehelix;\n        }(1);\n    }\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return cubehelixLong;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1__color__ = __webpack_require__(93), cubehelixLong = (cubehelix(__WEBPACK_IMPORTED_MODULE_1__color__.c), \n    cubehelix(__WEBPACK_IMPORTED_MODULE_1__color__.a));\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_format__ = __webpack_require__(354);\n    __webpack_exports__.a = function(domain, count, specifier) {\n        var precision, start = domain[0], stop = domain[domain.length - 1], step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.g)(start, stop, null == count ? 10 : count);\n        switch (specifier = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.c)(null == specifier ? \",f\" : specifier), \n        specifier.type) {\n          case \"s\":\n            var value = Math.max(Math.abs(start), Math.abs(stop));\n            return null != specifier.precision || isNaN(precision = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.e)(step, value)) || (specifier.precision = precision), \n            Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.b)(specifier, value);\n\n          case \"\":\n          case \"e\":\n          case \"g\":\n          case \"p\":\n          case \"r\":\n            null != specifier.precision || isNaN(precision = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.f)(step, Math.max(Math.abs(start), Math.abs(stop)))) || (specifier.precision = precision - (\"e\" === specifier.type));\n            break;\n\n          case \"f\":\n          case \"%\":\n            null != specifier.precision || isNaN(precision = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.d)(step)) || (specifier.precision = precision - 2 * (\"%\" === specifier.type));\n        }\n        return Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.a)(specifier);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return format;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return formatPrefix;\n    });\n    var locale, format, formatPrefix, __WEBPACK_IMPORTED_MODULE_0__locale__ = __webpack_require__(355);\n    !function(definition) {\n        locale = Object(__WEBPACK_IMPORTED_MODULE_0__locale__.a)(definition), format = locale.format, \n        formatPrefix = locale.formatPrefix;\n    }({\n        decimal: \".\",\n        thousands: \",\",\n        grouping: [ 3 ],\n        currency: [ \"$\", \"\" ]\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(grouping, thousands) {\n        return function(value, width) {\n            for (var i = value.length, t = [], j = 0, g = grouping[0], length = 0; i > 0 && g > 0 && (length + g + 1 > width && (g = Math.max(1, width - length)), \n            t.push(value.substring(i -= g, i + g)), !((length += g + 1) > width)); ) g = grouping[j = (j + 1) % grouping.length];\n            return t.reverse().join(thousands);\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(numerals) {\n        return function(value) {\n            return value.replace(/[0-9]/g, function(i) {\n                return numerals[+i];\n            });\n        };\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x, p) {\n        x = x.toPrecision(p);\n        out: for (var i1, n = x.length, i = 1, i0 = -1; i < n; ++i) switch (x[i]) {\n          case \".\":\n            i0 = i1 = i;\n            break;\n\n          case \"0\":\n            0 === i0 && (i0 = i), i1 = i;\n            break;\n\n          case \"e\":\n            break out;\n\n          default:\n            i0 > 0 && (i0 = 0);\n        }\n        return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__formatDecimal__ = __webpack_require__(211);\n    __webpack_exports__.a = function(x, p) {\n        var d = Object(__WEBPACK_IMPORTED_MODULE_0__formatDecimal__.a)(x, p);\n        if (!d) return x + \"\";\n        var coefficient = d[0], exponent = d[1];\n        return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1) : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_exports__.a = function(x) {\n        return x;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(138);\n    __webpack_exports__.a = function(step) {\n        return Math.max(0, -Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(Math.abs(step)));\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(138);\n    __webpack_exports__.a = function(step, value) {\n        return Math.max(0, 3 * Math.max(-8, Math.min(8, Math.floor(Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(value) / 3))) - Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(Math.abs(step)));\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__exponent__ = __webpack_require__(138);\n    __webpack_exports__.a = function(step, max) {\n        return step = Math.abs(step), max = Math.abs(max) - step, Math.max(0, Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(max) - Object(__WEBPACK_IMPORTED_MODULE_0__exponent__.a)(step)) + 1;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function deinterpolate(a, b) {\n        return (b = Math.log(b / a)) ? function(x) {\n            return Math.log(x / a) / b;\n        } : Object(__WEBPACK_IMPORTED_MODULE_2__constant__.a)(b);\n    }\n    function reinterpolate(a, b) {\n        return a < 0 ? function(t) {\n            return -Math.pow(-b, t) * Math.pow(-a, 1 - t);\n        } : function(t) {\n            return Math.pow(b, t) * Math.pow(a, 1 - t);\n        };\n    }\n    function pow10(x) {\n        return isFinite(x) ? +(\"1e\" + x) : x < 0 ? 0 : x;\n    }\n    function powp(base) {\n        return 10 === base ? pow10 : base === Math.E ? Math.exp : function(x) {\n            return Math.pow(base, x);\n        };\n    }\n    function logp(base) {\n        return base === Math.E ? Math.log : 10 === base && Math.log10 || 2 === base && Math.log2 || (base = Math.log(base), \n        function(x) {\n            return Math.log(x) / base;\n        });\n    }\n    function reflect(f) {\n        return function(x) {\n            return -f(-x);\n        };\n    }\n    function log() {\n        function rescale() {\n            return logs = logp(base), pows = powp(base), domain()[0] < 0 && (logs = reflect(logs), \n            pows = reflect(pows)), scale;\n        }\n        var scale = Object(__WEBPACK_IMPORTED_MODULE_4__continuous__.b)(deinterpolate, reinterpolate).domain([ 1, 10 ]), domain = scale.domain, base = 10, logs = logp(10), pows = powp(10);\n        return scale.base = function(_) {\n            return arguments.length ? (base = +_, rescale()) : base;\n        }, scale.domain = function(_) {\n            return arguments.length ? (domain(_), rescale()) : domain();\n        }, scale.ticks = function(count) {\n            var r, d = domain(), u = d[0], v = d[d.length - 1];\n            (r = v < u) && (i = u, u = v, v = i);\n            var p, k, t, i = logs(u), j = logs(v), n = null == count ? 10 : +count, z = [];\n            if (!(base % 1) && j - i < n) {\n                if (i = Math.round(i) - 1, j = Math.round(j) + 1, u > 0) {\n                    for (;i < j; ++i) for (k = 1, p = pows(i); k < base; ++k) if (!((t = p * k) < u)) {\n                        if (t > v) break;\n                        z.push(t);\n                    }\n                } else for (;i < j; ++i) for (k = base - 1, p = pows(i); k >= 1; --k) if (!((t = p * k) < u)) {\n                    if (t > v) break;\n                    z.push(t);\n                }\n            } else z = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.h)(i, j, Math.min(j - i, n)).map(pows);\n            return r ? z.reverse() : z;\n        }, scale.tickFormat = function(count, specifier) {\n            if (null == specifier && (specifier = 10 === base ? \".0e\" : \",\"), \"function\" != typeof specifier && (specifier = Object(__WEBPACK_IMPORTED_MODULE_1_d3_format__.a)(specifier)), \n            count === 1 / 0) return specifier;\n            null == count && (count = 10);\n            var k = Math.max(1, base * count / scale.ticks().length);\n            return function(d) {\n                var i = d / pows(Math.round(logs(d)));\n                return i * base < base - .5 && (i *= base), i <= k ? specifier(d) : \"\";\n            };\n        }, scale.nice = function() {\n            return domain(Object(__WEBPACK_IMPORTED_MODULE_3__nice__.a)(domain(), {\n                floor: function(x) {\n                    return pows(Math.floor(logs(x)));\n                },\n                ceil: function(x) {\n                    return pows(Math.ceil(logs(x)));\n                }\n            }));\n        }, scale.copy = function() {\n            return Object(__WEBPACK_IMPORTED_MODULE_4__continuous__.a)(scale, log().base(base));\n        }, scale;\n    }\n    __webpack_exports__.a = log;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_format__ = __webpack_require__(354), __WEBPACK_IMPORTED_MODULE_2__constant__ = __webpack_require__(210), __WEBPACK_IMPORTED_MODULE_3__nice__ = __webpack_require__(359), __WEBPACK_IMPORTED_MODULE_4__continuous__ = __webpack_require__(137);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function raise(x, exponent) {\n        return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n    }\n    function pow() {\n        function deinterpolate(a, b) {\n            return (b = raise(b, exponent) - (a = raise(a, exponent))) ? function(x) {\n                return (raise(x, exponent) - a) / b;\n            } : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(b);\n        }\n        function reinterpolate(a, b) {\n            return b = raise(b, exponent) - (a = raise(a, exponent)), function(t) {\n                return raise(a + b * t, 1 / exponent);\n            };\n        }\n        var exponent = 1, scale = Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.b)(deinterpolate, reinterpolate), domain = scale.domain;\n        return scale.exponent = function(_) {\n            return arguments.length ? (exponent = +_, domain(domain())) : exponent;\n        }, scale.copy = function() {\n            return Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.a)(scale, pow().exponent(exponent));\n        }, Object(__WEBPACK_IMPORTED_MODULE_1__linear__.b)(scale);\n    }\n    function sqrt() {\n        return pow().exponent(.5);\n    }\n    __webpack_exports__.a = pow, __webpack_exports__.b = sqrt;\n    var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(210), __WEBPACK_IMPORTED_MODULE_1__linear__ = __webpack_require__(91), __WEBPACK_IMPORTED_MODULE_2__continuous__ = __webpack_require__(137);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function quantile() {\n        function rescale() {\n            var i = 0, n = Math.max(1, range.length);\n            for (thresholds = new Array(n - 1); ++i < n; ) thresholds[i - 1] = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.d)(domain, i / n);\n            return scale;\n        }\n        function scale(x) {\n            if (!isNaN(x = +x)) return range[Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(thresholds, x)];\n        }\n        var domain = [], range = [], thresholds = [];\n        return scale.invertExtent = function(y) {\n            var i = range.indexOf(y);\n            return i < 0 ? [ NaN, NaN ] : [ i > 0 ? thresholds[i - 1] : domain[0], i < thresholds.length ? thresholds[i] : domain[domain.length - 1] ];\n        }, scale.domain = function(_) {\n            if (!arguments.length) return domain.slice();\n            domain = [];\n            for (var d, i = 0, n = _.length; i < n; ++i) null == (d = _[i]) || isNaN(d = +d) || domain.push(d);\n            return domain.sort(__WEBPACK_IMPORTED_MODULE_0_d3_array__.a), rescale();\n        }, scale.range = function(_) {\n            return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_), \n            rescale()) : range.slice();\n        }, scale.quantiles = function() {\n            return thresholds.slice();\n        }, scale.copy = function() {\n            return quantile().domain(domain).range(range);\n        }, scale;\n    }\n    __webpack_exports__.a = quantile;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(62);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function quantize() {\n        function scale(x) {\n            if (x <= x) return range[Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(domain, x, 0, n)];\n        }\n        function rescale() {\n            var i = -1;\n            for (domain = new Array(n); ++i < n; ) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n            return scale;\n        }\n        var x0 = 0, x1 = 1, n = 1, domain = [ .5 ], range = [ 0, 1 ];\n        return scale.domain = function(_) {\n            return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [ x0, x1 ];\n        }, scale.range = function(_) {\n            return arguments.length ? (n = (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_)).length - 1, \n            rescale()) : range.slice();\n        }, scale.invertExtent = function(y) {\n            var i = range.indexOf(y);\n            return i < 0 ? [ NaN, NaN ] : i < 1 ? [ x0, domain[0] ] : i >= n ? [ domain[n - 1], x1 ] : [ domain[i - 1], domain[i] ];\n        }, scale.copy = function() {\n            return quantize().domain([ x0, x1 ]).range(range);\n        }, Object(__WEBPACK_IMPORTED_MODULE_2__linear__.b)(scale);\n    }\n    __webpack_exports__.a = quantize;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(62), __WEBPACK_IMPORTED_MODULE_2__linear__ = __webpack_require__(91);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function threshold() {\n        function scale(x) {\n            if (x <= x) return range[Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.b)(domain, x, 0, n)];\n        }\n        var domain = [ .5 ], range = [ 0, 1 ], n = 1;\n        return scale.domain = function(_) {\n            return arguments.length ? (domain = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_), \n            n = Math.min(domain.length, range.length - 1), scale) : domain.slice();\n        }, scale.range = function(_) {\n            return arguments.length ? (range = __WEBPACK_IMPORTED_MODULE_1__array__.b.call(_), \n            n = Math.min(domain.length, range.length - 1), scale) : range.slice();\n        }, scale.invertExtent = function(y) {\n            var i = range.indexOf(y);\n            return [ domain[i - 1], domain[i] ];\n        }, scale.copy = function() {\n            return threshold().domain(domain).range(range);\n        }, scale;\n    }\n    __webpack_exports__.a = threshold;\n    var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1__array__ = __webpack_require__(62);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), millisecond = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function() {}, function(date, step) {\n        date.setTime(+date + step);\n    }, function(start, end) {\n        return end - start;\n    });\n    millisecond.every = function(k) {\n        return k = Math.floor(k), isFinite(k) && k > 0 ? k > 1 ? Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n            date.setTime(Math.floor(date / k) * k);\n        }, function(date, step) {\n            date.setTime(+date + step * k);\n        }, function(start, end) {\n            return (end - start) / k;\n        }) : millisecond : null;\n    }, __webpack_exports__.a = millisecond;\n    millisecond.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), second = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setTime(Math.floor(date / __WEBPACK_IMPORTED_MODULE_1__duration__.d) * __WEBPACK_IMPORTED_MODULE_1__duration__.d);\n    }, function(date, step) {\n        date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.d);\n    }, function(start, end) {\n        return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.d;\n    }, function(date) {\n        return date.getUTCSeconds();\n    });\n    __webpack_exports__.a = second;\n    second.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), minute = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setTime(Math.floor(date / __WEBPACK_IMPORTED_MODULE_1__duration__.c) * __WEBPACK_IMPORTED_MODULE_1__duration__.c);\n    }, function(date, step) {\n        date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.c);\n    }, function(start, end) {\n        return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.c;\n    }, function(date) {\n        return date.getMinutes();\n    });\n    __webpack_exports__.a = minute;\n    minute.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), hour = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        var offset = date.getTimezoneOffset() * __WEBPACK_IMPORTED_MODULE_1__duration__.c % __WEBPACK_IMPORTED_MODULE_1__duration__.b;\n        offset < 0 && (offset += __WEBPACK_IMPORTED_MODULE_1__duration__.b), date.setTime(Math.floor((+date - offset) / __WEBPACK_IMPORTED_MODULE_1__duration__.b) * __WEBPACK_IMPORTED_MODULE_1__duration__.b + offset);\n    }, function(date, step) {\n        date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.b);\n    }, function(start, end) {\n        return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.b;\n    }, function(date) {\n        return date.getHours();\n    });\n    __webpack_exports__.a = hour;\n    hour.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), day = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setDate(date.getDate() + step);\n    }, function(start, end) {\n        return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * __WEBPACK_IMPORTED_MODULE_1__duration__.c) / __WEBPACK_IMPORTED_MODULE_1__duration__.a;\n    }, function(date) {\n        return date.getDate() - 1;\n    });\n    __webpack_exports__.a = day;\n    day.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function weekday(i) {\n        return Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n            date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7), date.setHours(0, 0, 0, 0);\n        }, function(date, step) {\n            date.setDate(date.getDate() + 7 * step);\n        }, function(start, end) {\n            return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * __WEBPACK_IMPORTED_MODULE_1__duration__.c) / __WEBPACK_IMPORTED_MODULE_1__duration__.e;\n        });\n    }\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return sunday;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return monday;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return thursday;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), sunday = weekday(0), monday = weekday(1), tuesday = weekday(2), wednesday = weekday(3), thursday = weekday(4), friday = weekday(5), saturday = weekday(6);\n    sunday.range, monday.range, tuesday.range, wednesday.range, thursday.range, friday.range, \n    saturday.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), month = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setDate(1), date.setHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setMonth(date.getMonth() + step);\n    }, function(start, end) {\n        return end.getMonth() - start.getMonth() + 12 * (end.getFullYear() - start.getFullYear());\n    }, function(date) {\n        return date.getMonth();\n    });\n    __webpack_exports__.a = month;\n    month.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), year = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setMonth(0, 1), date.setHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setFullYear(date.getFullYear() + step);\n    }, function(start, end) {\n        return end.getFullYear() - start.getFullYear();\n    }, function(date) {\n        return date.getFullYear();\n    });\n    year.every = function(k) {\n        return isFinite(k = Math.floor(k)) && k > 0 ? Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n            date.setFullYear(Math.floor(date.getFullYear() / k) * k), date.setMonth(0, 1), date.setHours(0, 0, 0, 0);\n        }, function(date, step) {\n            date.setFullYear(date.getFullYear() + step * k);\n        }) : null;\n    }, __webpack_exports__.a = year;\n    year.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcMinute = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setUTCSeconds(0, 0);\n    }, function(date, step) {\n        date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.c);\n    }, function(start, end) {\n        return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.c;\n    }, function(date) {\n        return date.getUTCMinutes();\n    });\n    __webpack_exports__.a = utcMinute;\n    utcMinute.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcHour = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setUTCMinutes(0, 0, 0);\n    }, function(date, step) {\n        date.setTime(+date + step * __WEBPACK_IMPORTED_MODULE_1__duration__.b);\n    }, function(start, end) {\n        return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.b;\n    }, function(date) {\n        return date.getUTCHours();\n    });\n    __webpack_exports__.a = utcHour;\n    utcHour.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcDay = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setUTCHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setUTCDate(date.getUTCDate() + step);\n    }, function(start, end) {\n        return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.a;\n    }, function(date) {\n        return date.getUTCDate() - 1;\n    });\n    __webpack_exports__.a = utcDay;\n    utcDay.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function utcWeekday(i) {\n        return Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n            date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7), date.setUTCHours(0, 0, 0, 0);\n        }, function(date, step) {\n            date.setUTCDate(date.getUTCDate() + 7 * step);\n        }, function(start, end) {\n            return (end - start) / __WEBPACK_IMPORTED_MODULE_1__duration__.e;\n        });\n    }\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return utcSunday;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return utcMonday;\n    }), __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return utcThursday;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), __WEBPACK_IMPORTED_MODULE_1__duration__ = __webpack_require__(38), utcSunday = utcWeekday(0), utcMonday = utcWeekday(1), utcTuesday = utcWeekday(2), utcWednesday = utcWeekday(3), utcThursday = utcWeekday(4), utcFriday = utcWeekday(5), utcSaturday = utcWeekday(6);\n    utcSunday.range, utcMonday.range, utcTuesday.range, utcWednesday.range, utcThursday.range, \n    utcFriday.range, utcSaturday.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), utcMonth = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setUTCDate(1), date.setUTCHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setUTCMonth(date.getUTCMonth() + step);\n    }, function(start, end) {\n        return end.getUTCMonth() - start.getUTCMonth() + 12 * (end.getUTCFullYear() - start.getUTCFullYear());\n    }, function(date) {\n        return date.getUTCMonth();\n    });\n    __webpack_exports__.a = utcMonth;\n    utcMonth.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__interval__ = __webpack_require__(18), utcYear = Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n        date.setUTCMonth(0, 1), date.setUTCHours(0, 0, 0, 0);\n    }, function(date, step) {\n        date.setUTCFullYear(date.getUTCFullYear() + step);\n    }, function(start, end) {\n        return end.getUTCFullYear() - start.getUTCFullYear();\n    }, function(date) {\n        return date.getUTCFullYear();\n    });\n    utcYear.every = function(k) {\n        return isFinite(k = Math.floor(k)) && k > 0 ? Object(__WEBPACK_IMPORTED_MODULE_0__interval__.a)(function(date) {\n            date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k), date.setUTCMonth(0, 1), \n            date.setUTCHours(0, 0, 0, 0);\n        }, function(date, step) {\n            date.setUTCFullYear(date.getUTCFullYear() + step * k);\n        }) : null;\n    }, __webpack_exports__.a = utcYear;\n    utcYear.range;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function parseIsoNative(string) {\n        var date = new Date(string);\n        return isNaN(date) ? null : date;\n    }\n    var __WEBPACK_IMPORTED_MODULE_0__isoFormat__ = __webpack_require__(363), __WEBPACK_IMPORTED_MODULE_1__defaultLocale__ = __webpack_require__(213);\n    +new Date(\"2000-01-01T00:00:00.000Z\") || Object(__WEBPACK_IMPORTED_MODULE_1__defaultLocale__.c)(__WEBPACK_IMPORTED_MODULE_0__isoFormat__.a);\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__time__ = __webpack_require__(360), __WEBPACK_IMPORTED_MODULE_1_d3_time_format__ = __webpack_require__(361), __WEBPACK_IMPORTED_MODULE_2_d3_time__ = __webpack_require__(212);\n    __webpack_exports__.a = function() {\n        return Object(__WEBPACK_IMPORTED_MODULE_0__time__.a)(__WEBPACK_IMPORTED_MODULE_2_d3_time__.v, __WEBPACK_IMPORTED_MODULE_2_d3_time__.q, __WEBPACK_IMPORTED_MODULE_2_d3_time__.u, __WEBPACK_IMPORTED_MODULE_2_d3_time__.l, __WEBPACK_IMPORTED_MODULE_2_d3_time__.m, __WEBPACK_IMPORTED_MODULE_2_d3_time__.o, __WEBPACK_IMPORTED_MODULE_2_d3_time__.r, __WEBPACK_IMPORTED_MODULE_2_d3_time__.n, __WEBPACK_IMPORTED_MODULE_1_d3_time_format__.b).domain([ Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2) ]);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(94);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf\");\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(94);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6\");\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(94);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9\");\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(94);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5\");\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.b)(Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(300, .5, 0), Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(-240, .5, 1));\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return warm;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return cool;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0_d3_color__ = __webpack_require__(46), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92), warm = Object(__WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.b)(Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(-100, .75, .35), Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(80, 1.5, .8)), cool = Object(__WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.b)(Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(260, .75, .35), Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)(80, 1.5, .8)), rainbow = Object(__WEBPACK_IMPORTED_MODULE_0_d3_color__.b)();\n    __webpack_exports__.b = function(t) {\n        (t < 0 || t > 1) && (t -= Math.floor(t));\n        var ts = Math.abs(t - .5);\n        return rainbow.h = 360 * t - 100, rainbow.s = 1.5 - 1.5 * ts, rainbow.l = .8 - .9 * ts, \n        rainbow + \"\";\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function ramp(range) {\n        var n = range.length;\n        return function(t) {\n            return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];\n        };\n    }\n    __webpack_require__.d(__webpack_exports__, \"c\", function() {\n        return magma;\n    }), __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return inferno;\n    }), __webpack_require__.d(__webpack_exports__, \"d\", function() {\n        return plasma;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0__colors__ = __webpack_require__(94);\n    __webpack_exports__.a = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725\"));\n    var magma = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf\")), inferno = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4\")), plasma = ramp(Object(__WEBPACK_IMPORTED_MODULE_0__colors__.a)(\"0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921\"));\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function sequential(interpolator) {\n        function scale(x) {\n            var t = (x - x0) / (x1 - x0);\n            return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);\n        }\n        var x0 = 0, x1 = 1, clamp = !1;\n        return scale.domain = function(_) {\n            return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [ x0, x1 ];\n        }, scale.clamp = function(_) {\n            return arguments.length ? (clamp = !!_, scale) : clamp;\n        }, scale.interpolator = function(_) {\n            return arguments.length ? (interpolator = _, scale) : interpolator;\n        }, scale.copy = function() {\n            return sequential(interpolator).domain([ x0, x1 ]).clamp(clamp);\n        }, Object(__WEBPACK_IMPORTED_MODULE_0__linear__.b)(scale);\n    }\n    __webpack_exports__.a = sequential;\n    var __WEBPACK_IMPORTED_MODULE_0__linear__ = __webpack_require__(91);\n}, function(module, exports) {\n    function last(array) {\n        var length = null == array ? 0 : array.length;\n        return length ? array[length - 1] : void 0;\n    }\n    module.exports = last;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), PolarGrid = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function PolarGrid() {\n            return _classCallCheck(this, PolarGrid), _possibleConstructorReturn(this, (PolarGrid.__proto__ || Object.getPrototypeOf(PolarGrid)).apply(this, arguments));\n        }\n        return _inherits(PolarGrid, _Component), _createClass(PolarGrid, [ {\n            key: \"getPolygonPath\",\n            value: function(radius) {\n                var _props = this.props, cx = _props.cx, cy = _props.cy, polarAngles = _props.polarAngles, path = \"\";\n                return polarAngles.forEach(function(angle, i) {\n                    var point = Object(__WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__.e)(cx, cy, radius, angle);\n                    path += i ? \"L \" + point.x + \",\" + point.y : \"M \" + point.x + \",\" + point.y;\n                }), path += \"Z\";\n            }\n        }, {\n            key: \"renderPolarAngles\",\n            value: function() {\n                var _props2 = this.props, cx = _props2.cx, cy = _props2.cy, innerRadius = _props2.innerRadius, outerRadius = _props2.outerRadius, polarAngles = _props2.polarAngles;\n                if (!polarAngles || !polarAngles.length) return null;\n                var props = _extends({\n                    stroke: \"#ccc\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props));\n                return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"g\", {\n                    className: \"recharts-polar-grid-angle\"\n                }, polarAngles.map(function(entry, i) {\n                    var start = Object(__WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__.e)(cx, cy, innerRadius, entry), end = Object(__WEBPACK_IMPORTED_MODULE_3__util_PolarUtils__.e)(cx, cy, outerRadius, entry);\n                    return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"line\", _extends({}, props, {\n                        key: \"line-\" + i,\n                        x1: start.x,\n                        y1: start.y,\n                        x2: end.x,\n                        y2: end.y\n                    }));\n                }));\n            }\n        }, {\n            key: \"renderConcentricCircle\",\n            value: function(radius, index, extraProps) {\n                var _props3 = this.props, cx = _props3.cx, cy = _props3.cy, props = _extends({\n                    stroke: \"#ccc\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), {\n                    fill: \"none\"\n                }, extraProps);\n                return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"circle\", _extends({}, props, {\n                    className: \"recharts-polar-grid-concentric-circle\",\n                    key: \"circle-\" + index,\n                    cx: cx,\n                    cy: cy,\n                    r: radius\n                }));\n            }\n        }, {\n            key: \"renderConcentricPolygon\",\n            value: function(radius, index, extraProps) {\n                var props = _extends({\n                    stroke: \"#ccc\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), {\n                    fill: \"none\"\n                }, extraProps);\n                return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"path\", _extends({}, props, {\n                    className: \"recharts-polar-grid-concentric-polygon\",\n                    key: \"path-\" + index,\n                    d: this.getPolygonPath(radius)\n                }));\n            }\n        }, {\n            key: \"renderConcentricPath\",\n            value: function() {\n                var _this2 = this, _props4 = this.props, polarRadius = _props4.polarRadius, gridType = _props4.gridType;\n                return polarRadius && polarRadius.length ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"g\", {\n                    className: \"recharts-polar-grid-concentric\"\n                }, polarRadius.map(function(entry, i) {\n                    return \"circle\" === gridType ? _this2.renderConcentricCircle(entry, i) : _this2.renderConcentricPolygon(entry, i);\n                })) : null;\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                return this.props.outerRadius <= 0 ? null : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(\"g\", {\n                    className: \"recharts-polar-grid\"\n                }, this.renderPolarAngles(), this.renderConcentricPath());\n            }\n        } ]), PolarGrid;\n    }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = \"PolarGrid\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {\n        cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        innerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        outerRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number,\n        polarAngles: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number),\n        polarRadius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number),\n        gridType: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ \"polygon\", \"circle\" ])\n    }), _class2.defaultProps = {\n        cx: 0,\n        cy: 0,\n        innerRadius: 0,\n        outerRadius: 0,\n        gridType: \"polygon\"\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = PolarGrid;\n}, function(module, exports, __webpack_require__) {\n    function minBy(array, iteratee) {\n        return array && array.length ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt) : void 0;\n    }\n    var baseExtremum = __webpack_require__(135), baseIteratee = __webpack_require__(89), baseLt = __webpack_require__(329);\n    module.exports = minBy;\n}, function(module, exports, __webpack_require__) {\n    function isPlainObject(value) {\n        if (!isObjectLike(value) || baseGetTag(value) != objectTag) return !1;\n        var proto = getPrototype(value);\n        if (null === proto) return !0;\n        var Ctor = hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n        return \"function\" == typeof Ctor && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;\n    }\n    var baseGetTag = __webpack_require__(41), getPrototype = __webpack_require__(926), isObjectLike = __webpack_require__(42), objectTag = \"[object Object]\", funcProto = Function.prototype, objectProto = Object.prototype, funcToString = funcProto.toString, hasOwnProperty = objectProto.hasOwnProperty, objectCtorString = funcToString.call(Object);\n    module.exports = isPlainObject;\n}, function(module, exports, __webpack_require__) {\n    var overArg = __webpack_require__(320), getPrototype = overArg(Object.getPrototypeOf, Object);\n    module.exports = getPrototype;\n}, function(module, exports, __webpack_require__) {\n    function createRange(fromRight) {\n        return function(start, end, step) {\n            return step && \"number\" != typeof step && isIterateeCall(start, end, step) && (end = step = void 0), \n            start = toFinite(start), void 0 === end ? (end = start, start = 0) : end = toFinite(end), \n            step = void 0 === step ? start < end ? 1 : -1 : toFinite(step), baseRange(start, end, step, fromRight);\n        };\n    }\n    var baseRange = __webpack_require__(928), isIterateeCall = __webpack_require__(326), toFinite = __webpack_require__(929);\n    module.exports = createRange;\n}, function(module, exports) {\n    function baseRange(start, end, step, fromRight) {\n        for (var index = -1, length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result = Array(length); length--; ) result[fromRight ? length : ++index] = start, \n        start += step;\n        return result;\n    }\n    var nativeCeil = Math.ceil, nativeMax = Math.max;\n    module.exports = baseRange;\n}, function(module, exports, __webpack_require__) {\n    function toFinite(value) {\n        if (!value) return 0 === value ? value : 0;\n        if ((value = toNumber(value)) === INFINITY || value === -INFINITY) {\n            return (value < 0 ? -1 : 1) * MAX_INTEGER;\n        }\n        return value === value ? value : 0;\n    }\n    var toNumber = __webpack_require__(311), INFINITY = 1 / 0, MAX_INTEGER = 1.7976931348623157e308;\n    module.exports = toFinite;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _defineProperty(obj, key, value) {\n        return key in obj ? Object.defineProperty(obj, key, {\n            value: value,\n            enumerable: !0,\n            configurable: !0,\n            writable: !0\n        }) : obj[key] = value, obj;\n    }\n    __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return generatePrefixStyle;\n    });\n    var _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, PREFIX_LIST = [ \"Webkit\", \"Moz\", \"O\", \"ms\" ], generatePrefixStyle = function(name, value) {\n        if (!name) return null;\n        var camelName = name.replace(/(\\w)/, function(v) {\n            return v.toUpperCase();\n        }), result = PREFIX_LIST.reduce(function(res, entry) {\n            return _extends({}, res, _defineProperty({}, entry + camelName, value));\n        }, {});\n        return result[name] = value, result;\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), CartesianGrid = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function CartesianGrid() {\n            return _classCallCheck(this, CartesianGrid), _possibleConstructorReturn(this, (CartesianGrid.__proto__ || Object.getPrototypeOf(CartesianGrid)).apply(this, arguments));\n        }\n        return _inherits(CartesianGrid, _Component), _createClass(CartesianGrid, [ {\n            key: \"renderLineItem\",\n            value: function(option, props) {\n                var lineItem = void 0;\n                if (__WEBPACK_IMPORTED_MODULE_1_react___default.a.isValidElement(option)) lineItem = __WEBPACK_IMPORTED_MODULE_1_react___default.a.cloneElement(option, props); else if (__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option)) lineItem = option(props); else {\n                    var x1 = props.x1, y1 = props.y1, x2 = props.x2, y2 = props.y2, key = props.key, others = _objectWithoutProperties(props, [ \"x1\", \"y1\", \"x2\", \"y2\", \"key\" ]);\n                    lineItem = __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"line\", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(others), {\n                        x1: x1,\n                        y1: y1,\n                        x2: x2,\n                        y2: y2,\n                        fill: \"none\",\n                        key: key\n                    }));\n                }\n                return lineItem;\n            }\n        }, {\n            key: \"renderHorizontal\",\n            value: function(horizontalPoints) {\n                var _this2 = this, _props = this.props, x = _props.x, width = _props.width, horizontal = _props.horizontal;\n                if (!horizontalPoints || !horizontalPoints.length) return null;\n                var items = horizontalPoints.map(function(entry, i) {\n                    var props = _extends({}, _this2.props, {\n                        x1: x,\n                        y1: entry,\n                        x2: x + width,\n                        y2: entry,\n                        key: \"line-\" + i,\n                        index: i\n                    });\n                    return _this2.renderLineItem(horizontal, props);\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"g\", {\n                    className: \"recharts-cartesian-grid-horizontal\"\n                }, items);\n            }\n        }, {\n            key: \"renderVertical\",\n            value: function(verticalPoints) {\n                var _this3 = this, _props2 = this.props, y = _props2.y, height = _props2.height, vertical = _props2.vertical;\n                if (!verticalPoints || !verticalPoints.length) return null;\n                var items = verticalPoints.map(function(entry, i) {\n                    var props = _extends({}, _this3.props, {\n                        x1: entry,\n                        y1: y,\n                        x2: entry,\n                        y2: y + height,\n                        key: \"line-\" + i,\n                        index: i\n                    });\n                    return _this3.renderLineItem(vertical, props);\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"g\", {\n                    className: \"recharts-cartesian-grid-vertical\"\n                }, items);\n            }\n        }, {\n            key: \"renderVerticalStripes\",\n            value: function(verticalPoints) {\n                var verticalFill = this.props.verticalFill;\n                if (!verticalFill || !verticalFill.length) return null;\n                var _props3 = this.props, fillOpacity = _props3.fillOpacity, x = _props3.x, y = _props3.y, width = _props3.width, height = _props3.height, verticalPointsUpdated = verticalPoints.slice().sort(function(a, b) {\n                    return a - b > 0;\n                });\n                x !== verticalPointsUpdated[0] && verticalPointsUpdated.unshift(0);\n                var items = verticalPointsUpdated.map(function(entry, i) {\n                    var lineWidth = verticalPointsUpdated[i + 1] ? verticalPointsUpdated[i + 1] - entry : x + width - entry;\n                    if (lineWidth <= 0) return null;\n                    var colorIndex = i % verticalFill.length;\n                    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"rect\", {\n                        key: i,\n                        x: Math.round(entry + x - x),\n                        y: y,\n                        width: lineWidth,\n                        height: height,\n                        stroke: \"none\",\n                        fill: verticalFill[colorIndex],\n                        fillOpacity: fillOpacity,\n                        className: \"recharts-cartesian-grid-bg\"\n                    });\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"g\", {\n                    className: \"recharts-cartesian-gridstripes-vertical\"\n                }, items);\n            }\n        }, {\n            key: \"renderHorizontalStripes\",\n            value: function(horizontalPoints) {\n                var horizontalFill = this.props.horizontalFill;\n                if (!horizontalFill || !horizontalFill.length) return null;\n                var _props4 = this.props, fillOpacity = _props4.fillOpacity, x = _props4.x, y = _props4.y, width = _props4.width, height = _props4.height, horizontalPointsUpdated = horizontalPoints.slice().sort(function(a, b) {\n                    return a - b > 0;\n                });\n                y !== horizontalPointsUpdated[0] && horizontalPointsUpdated.unshift(0);\n                var items = horizontalPointsUpdated.map(function(entry, i) {\n                    var lineHeight = horizontalPointsUpdated[i + 1] ? horizontalPointsUpdated[i + 1] - entry : y + height - entry;\n                    if (lineHeight <= 0) return null;\n                    var colorIndex = i % horizontalFill.length;\n                    return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"rect\", {\n                        key: i,\n                        y: Math.round(entry + y - y),\n                        x: x,\n                        height: lineHeight,\n                        width: width,\n                        stroke: \"none\",\n                        fill: horizontalFill[colorIndex],\n                        fillOpacity: fillOpacity,\n                        className: \"recharts-cartesian-grid-bg\"\n                    });\n                });\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"g\", {\n                    className: \"recharts-cartesian-gridstripes-horizontal\"\n                }, items);\n            }\n        }, {\n            key: \"renderBackground\",\n            value: function() {\n                var fill = this.props.fill;\n                if (!fill || \"none\" === fill) return null;\n                var _props5 = this.props, fillOpacity = _props5.fillOpacity, x = _props5.x, y = _props5.y, width = _props5.width, height = _props5.height;\n                return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"rect\", {\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height,\n                    stroke: \"none\",\n                    fill: fill,\n                    fillOpacity: fillOpacity,\n                    className: \"recharts-cartesian-grid-bg\"\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                var _props6 = this.props, x = _props6.x, y = _props6.y, width = _props6.width, height = _props6.height, horizontal = _props6.horizontal, vertical = _props6.vertical, horizontalCoordinatesGenerator = _props6.horizontalCoordinatesGenerator, verticalCoordinatesGenerator = _props6.verticalCoordinatesGenerator, xAxis = _props6.xAxis, yAxis = _props6.yAxis, offset = _props6.offset, chartWidth = _props6.chartWidth, chartHeight = _props6.chartHeight;\n                if (!Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(width) || width <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(height) || height <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(x) || x !== +x || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(y) || y !== +y) return null;\n                var _props7 = this.props, horizontalPoints = _props7.horizontalPoints, verticalPoints = _props7.verticalPoints;\n                return horizontalPoints && horizontalPoints.length || !__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(horizontalCoordinatesGenerator) || (horizontalPoints = horizontalCoordinatesGenerator({\n                    yAxis: yAxis,\n                    width: chartWidth,\n                    height: chartHeight,\n                    offset: offset\n                })), verticalPoints && verticalPoints.length || !__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(verticalCoordinatesGenerator) || (verticalPoints = verticalCoordinatesGenerator({\n                    xAxis: xAxis,\n                    width: chartWidth,\n                    height: chartHeight,\n                    offset: offset\n                })), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement(\"g\", {\n                    className: \"recharts-cartesian-grid\"\n                }, this.renderBackground(), horizontal && this.renderHorizontal(horizontalPoints), vertical && this.renderVertical(verticalPoints), horizontal && this.renderHorizontalStripes(horizontalPoints), vertical && this.renderVerticalStripes(verticalPoints));\n            }\n        } ]), CartesianGrid;\n    }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class2.displayName = \"CartesianGrid\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.c, {\n        x: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        y: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        width: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        horizontal: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool ]),\n        vertical: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool ]),\n        horizontalPoints: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number),\n        verticalPoints: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number),\n        horizontalCoordinatesGenerator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        verticalCoordinatesGenerator: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.func,\n        xAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        yAxis: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        offset: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object,\n        chartWidth: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        chartHeight: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number,\n        verticalFill: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string),\n        horizontalFill: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.string)\n    }), _class2.defaultProps = {\n        horizontal: !0,\n        vertical: !0,\n        horizontalPoints: [],\n        verticalPoints: [],\n        stroke: \"#ccc\",\n        fill: \"none\",\n        verticalFill: [],\n        horizontalFill: []\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = CartesianGrid;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_1__cartesian_Line__ = __webpack_require__(215), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(72), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(73), __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__ = __webpack_require__(96);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({\n        chartName: \"LineChart\",\n        GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Line__.a,\n        axisComponents: [ {\n            axisType: \"xAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a\n        }, {\n            axisType: \"yAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__.a\n    });\n}, function(module, exports, __webpack_require__) {\n    function throttle(func, wait, options) {\n        var leading = !0, trailing = !0;\n        if (\"function\" != typeof func) throw new TypeError(FUNC_ERROR_TEXT);\n        return isObject(options) && (leading = \"leading\" in options ? !!options.leading : leading, \n        trailing = \"trailing\" in options ? !!options.trailing : trailing), debounce(func, wait, {\n            leading: leading,\n            maxWait: wait,\n            trailing: trailing\n        });\n    }\n    var debounce = __webpack_require__(310), isObject = __webpack_require__(32), FUNC_ERROR_TEXT = \"Expected a function\";\n    module.exports = throttle;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    __webpack_require__.d(__webpack_exports__, \"b\", function() {\n        return eventCenter;\n    }), __webpack_require__.d(__webpack_exports__, \"a\", function() {\n        return SYNC_EVENT;\n    });\n    var __WEBPACK_IMPORTED_MODULE_0_events__ = __webpack_require__(935), __WEBPACK_IMPORTED_MODULE_0_events___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_events__), eventCenter = new __WEBPACK_IMPORTED_MODULE_0_events___default.a();\n    eventCenter.setMaxListeners && eventCenter.setMaxListeners(10);\n    var SYNC_EVENT = \"recharts.syncMouseEvents\";\n}, function(module, exports) {\n    function EventEmitter() {\n        this._events = this._events || {}, this._maxListeners = this._maxListeners || void 0;\n    }\n    function isFunction(arg) {\n        return \"function\" == typeof arg;\n    }\n    function isNumber(arg) {\n        return \"number\" == typeof arg;\n    }\n    function isObject(arg) {\n        return \"object\" == typeof arg && null !== arg;\n    }\n    function isUndefined(arg) {\n        return void 0 === arg;\n    }\n    module.exports = EventEmitter, EventEmitter.EventEmitter = EventEmitter, EventEmitter.prototype._events = void 0, \n    EventEmitter.prototype._maxListeners = void 0, EventEmitter.defaultMaxListeners = 10, \n    EventEmitter.prototype.setMaxListeners = function(n) {\n        if (!isNumber(n) || n < 0 || isNaN(n)) throw TypeError(\"n must be a positive number\");\n        return this._maxListeners = n, this;\n    }, EventEmitter.prototype.emit = function(type) {\n        var er, handler, len, args, i, listeners;\n        if (this._events || (this._events = {}), \"error\" === type && (!this._events.error || isObject(this._events.error) && !this._events.error.length)) {\n            if ((er = arguments[1]) instanceof Error) throw er;\n            var err = new Error('Uncaught, unspecified \"error\" event. (' + er + \")\");\n            throw err.context = er, err;\n        }\n        if (handler = this._events[type], isUndefined(handler)) return !1;\n        if (isFunction(handler)) switch (arguments.length) {\n          case 1:\n            handler.call(this);\n            break;\n\n          case 2:\n            handler.call(this, arguments[1]);\n            break;\n\n          case 3:\n            handler.call(this, arguments[1], arguments[2]);\n            break;\n\n          default:\n            args = Array.prototype.slice.call(arguments, 1), handler.apply(this, args);\n        } else if (isObject(handler)) for (args = Array.prototype.slice.call(arguments, 1), \n        listeners = handler.slice(), len = listeners.length, i = 0; i < len; i++) listeners[i].apply(this, args);\n        return !0;\n    }, EventEmitter.prototype.addListener = function(type, listener) {\n        var m;\n        if (!isFunction(listener)) throw TypeError(\"listener must be a function\");\n        return this._events || (this._events = {}), this._events.newListener && this.emit(\"newListener\", type, isFunction(listener.listener) ? listener.listener : listener), \n        this._events[type] ? isObject(this._events[type]) ? this._events[type].push(listener) : this._events[type] = [ this._events[type], listener ] : this._events[type] = listener, \n        isObject(this._events[type]) && !this._events[type].warned && (m = isUndefined(this._maxListeners) ? EventEmitter.defaultMaxListeners : this._maxListeners) && m > 0 && this._events[type].length > m && (this._events[type].warned = !0, \n        console.error(\"(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.\", this._events[type].length), \n        \"function\" == typeof console.trace && console.trace()), this;\n    }, EventEmitter.prototype.on = EventEmitter.prototype.addListener, EventEmitter.prototype.once = function(type, listener) {\n        function g() {\n            this.removeListener(type, g), fired || (fired = !0, listener.apply(this, arguments));\n        }\n        if (!isFunction(listener)) throw TypeError(\"listener must be a function\");\n        var fired = !1;\n        return g.listener = listener, this.on(type, g), this;\n    }, EventEmitter.prototype.removeListener = function(type, listener) {\n        var list, position, length, i;\n        if (!isFunction(listener)) throw TypeError(\"listener must be a function\");\n        if (!this._events || !this._events[type]) return this;\n        if (list = this._events[type], length = list.length, position = -1, list === listener || isFunction(list.listener) && list.listener === listener) delete this._events[type], \n        this._events.removeListener && this.emit(\"removeListener\", type, listener); else if (isObject(list)) {\n            for (i = length; i-- > 0; ) if (list[i] === listener || list[i].listener && list[i].listener === listener) {\n                position = i;\n                break;\n            }\n            if (position < 0) return this;\n            1 === list.length ? (list.length = 0, delete this._events[type]) : list.splice(position, 1), \n            this._events.removeListener && this.emit(\"removeListener\", type, listener);\n        }\n        return this;\n    }, EventEmitter.prototype.removeAllListeners = function(type) {\n        var key, listeners;\n        if (!this._events) return this;\n        if (!this._events.removeListener) return 0 === arguments.length ? this._events = {} : this._events[type] && delete this._events[type], \n        this;\n        if (0 === arguments.length) {\n            for (key in this._events) \"removeListener\" !== key && this.removeAllListeners(key);\n            return this.removeAllListeners(\"removeListener\"), this._events = {}, this;\n        }\n        if (listeners = this._events[type], isFunction(listeners)) this.removeListener(type, listeners); else if (listeners) for (;listeners.length; ) this.removeListener(type, listeners[listeners.length - 1]);\n        return delete this._events[type], this;\n    }, EventEmitter.prototype.listeners = function(type) {\n        return this._events && this._events[type] ? isFunction(this._events[type]) ? [ this._events[type] ] : this._events[type].slice() : [];\n    }, EventEmitter.prototype.listenerCount = function(type) {\n        if (this._events) {\n            var evlistener = this._events[type];\n            if (isFunction(evlistener)) return 1;\n            if (evlistener) return evlistener.length;\n        }\n        return 0;\n    }, EventEmitter.listenerCount = function(emitter, type) {\n        return emitter.listenerCount(type);\n    };\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_1__cartesian_Bar__ = __webpack_require__(217), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(72), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(73), __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__ = __webpack_require__(96);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({\n        chartName: \"BarChart\",\n        GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Bar__.a,\n        axisComponents: [ {\n            axisType: \"xAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a\n        }, {\n            axisType: \"yAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__.a\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_0_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_prop_types__), __WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__ = __webpack_require__(141), __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__ = __webpack_require__(140), __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_5__polar_Pie__ = __webpack_require__(369);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__.a)({\n        chartName: \"PieChart\",\n        GraphicalChild: __WEBPACK_IMPORTED_MODULE_5__polar_Pie__.a,\n        eventType: \"item\",\n        legendContent: \"children\",\n        axisComponents: [ {\n            axisType: \"angleAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__.a\n        }, {\n            axisType: \"radiusAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__.b,\n        defaultProps: {\n            layout: \"centric\",\n            startAngle: 0,\n            endAngle: 360,\n            cx: \"50%\",\n            cy: \"50%\",\n            innerRadius: 0,\n            outerRadius: \"80%\"\n        },\n        propTypes: {\n            layout: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOf([ \"centric\" ]),\n            startAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,\n            endAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,\n            cx: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            cy: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            innerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            outerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ])\n        }\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_4_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react_smooth__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__container_Surface__ = __webpack_require__(82), __WEBPACK_IMPORTED_MODULE_7__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__ = __webpack_require__(70), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_11__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_12__util_ChartUtils__ = __webpack_require__(16), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, computeNode = function computeNode(_ref) {\n        var depth = _ref.depth, node = _ref.node, index = _ref.index, valueKey = _ref.valueKey, children = node.children, childDepth = depth + 1, computedChildren = children && children.length ? children.map(function(child, i) {\n            return computeNode({\n                depth: childDepth,\n                node: child,\n                index: i,\n                valueKey: valueKey\n            });\n        }) : null, value = void 0;\n        return value = children && children.length ? computedChildren.reduce(function(result, child) {\n            return result + child.value;\n        }, 0) : __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default()(node[valueKey]) || node[valueKey] <= 0 ? 0 : node[valueKey], \n        _extends({}, node, {\n            children: computedChildren,\n            value: value,\n            depth: depth,\n            index: index\n        });\n    }, filterRect = function(node) {\n        return {\n            x: node.x,\n            y: node.y,\n            width: node.width,\n            height: node.height\n        };\n    }, getAreaOfChildren = function(children, areaValueRatio) {\n        var ratio = areaValueRatio < 0 ? 0 : areaValueRatio;\n        return children.map(function(child) {\n            var area = child.value * ratio;\n            return _extends({}, child, {\n                area: __WEBPACK_IMPORTED_MODULE_1_lodash_isNaN___default()(area) || area <= 0 ? 0 : area\n            });\n        });\n    }, getWorstScore = function(row, parentSize, aspectRatio) {\n        var parentArea = parentSize * parentSize, rowArea = row.area * row.area, _row$reduce = row.reduce(function(result, child) {\n            return {\n                min: Math.min(result.min, child.area),\n                max: Math.max(result.max, child.area)\n            };\n        }, {\n            min: 1 / 0,\n            max: 0\n        }), min = _row$reduce.min, max = _row$reduce.max;\n        return rowArea ? Math.max(parentArea * max * aspectRatio / rowArea, rowArea / (parentArea * min * aspectRatio)) : 1 / 0;\n    }, horizontalPosition = function(row, parentSize, parentRect, isFlush) {\n        var rowHeight = parentSize ? Math.round(row.area / parentSize) : 0;\n        (isFlush || rowHeight > parentRect.height) && (rowHeight = parentRect.height);\n        for (var curX = parentRect.x, child = void 0, i = 0, len = row.length; i < len; i++) child = row[i], \n        child.x = curX, child.y = parentRect.y, child.height = rowHeight, child.width = Math.min(rowHeight ? Math.round(child.area / rowHeight) : 0, parentRect.x + parentRect.width - curX), \n        curX += child.width;\n        return child.z = !0, child.width += parentRect.x + parentRect.width - curX, _extends({}, parentRect, {\n            y: parentRect.y + rowHeight,\n            height: parentRect.height - rowHeight\n        });\n    }, verticalPosition = function(row, parentSize, parentRect, isFlush) {\n        var rowWidth = parentSize ? Math.round(row.area / parentSize) : 0;\n        (isFlush || rowWidth > parentRect.width) && (rowWidth = parentRect.width);\n        for (var curY = parentRect.y, child = void 0, i = 0, len = row.length; i < len; i++) child = row[i], \n        child.x = parentRect.x, child.y = curY, child.width = rowWidth, child.height = Math.min(rowWidth ? Math.round(child.area / rowWidth) : 0, parentRect.y + parentRect.height - curY), \n        curY += child.height;\n        return child.z = !1, child.height += parentRect.y + parentRect.height - curY, _extends({}, parentRect, {\n            x: parentRect.x + rowWidth,\n            width: parentRect.width - rowWidth\n        });\n    }, position = function(row, parentSize, parentRect, isFlush) {\n        return parentSize === parentRect.width ? horizontalPosition(row, parentSize, parentRect, isFlush) : verticalPosition(row, parentSize, parentRect, isFlush);\n    }, squarify = function squarify(node, aspectRatio) {\n        var children = node.children;\n        if (children && children.length) {\n            var rect = filterRect(node), row = [], best = 1 / 0, child = void 0, score = void 0, size = Math.min(rect.width, rect.height), scaleChildren = getAreaOfChildren(children, rect.width * rect.height / node.value), tempChildren = scaleChildren.slice();\n            for (row.area = 0; tempChildren.length > 0; ) row.push(child = tempChildren[0]), \n            row.area += child.area, score = getWorstScore(row, size, aspectRatio), score <= best ? (tempChildren.shift(), \n            best = score) : (row.area -= row.pop().area, rect = position(row, size, rect, !1), \n            size = Math.min(rect.width, rect.height), row.length = row.area = 0, best = 1 / 0);\n            return row.length && (rect = position(row, size, rect, !0), row.length = row.area = 0), \n            _extends({}, node, {\n                children: scaleChildren.map(function(c) {\n                    return squarify(c, aspectRatio);\n                })\n            });\n        }\n        return node;\n    }, Treemap = Object(__WEBPACK_IMPORTED_MODULE_11__util_PureRender__.a)((_temp2 = _class2 = function(_Component) {\n        function Treemap() {\n            var _ref2, _temp, _this, _ret;\n            _classCallCheck(this, Treemap);\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];\n            return _temp = _this = _possibleConstructorReturn(this, (_ref2 = Treemap.__proto__ || Object.getPrototypeOf(Treemap)).call.apply(_ref2, [ this ].concat(args))), \n            _this.state = _this.createDefaultState(), _ret = _temp, _possibleConstructorReturn(_this, _ret);\n        }\n        return _inherits(Treemap, _Component), _createClass(Treemap, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                nextProps.data !== this.props.data && this.setState(this.createDefaultState());\n            }\n        }, {\n            key: \"createDefaultState\",\n            value: function() {\n                return {\n                    isTooltipActive: !1,\n                    activeNode: null\n                };\n            }\n        }, {\n            key: \"handleMouseEnter\",\n            value: function(node, e) {\n                var _props = this.props, onMouseEnter = _props.onMouseEnter, children = _props.children;\n                Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a) ? this.setState({\n                    isTooltipActive: !0,\n                    activeNode: node\n                }, function() {\n                    onMouseEnter && onMouseEnter(node, e);\n                }) : onMouseEnter && onMouseEnter(node, e);\n            }\n        }, {\n            key: \"handleMouseLeave\",\n            value: function(node, e) {\n                var _props2 = this.props, onMouseLeave = _props2.onMouseLeave, children = _props2.children;\n                Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a) ? this.setState({\n                    isTooltipActive: !1,\n                    activeNode: null\n                }, function() {\n                    onMouseLeave && onMouseLeave(node, e);\n                }) : onMouseLeave && onMouseLeave(node, e);\n            }\n        }, {\n            key: \"handleClick\",\n            value: function(node) {\n                var onClick = this.props.onClick;\n                onClick && onClick(node);\n            }\n        }, {\n            key: \"renderAnimatedItem\",\n            value: function(content, nodeProps, isLeaf) {\n                var _this2 = this, _props3 = this.props, isAnimationActive = _props3.isAnimationActive, animationBegin = _props3.animationBegin, animationDuration = _props3.animationDuration, animationEasing = _props3.animationEasing, isUpdateAnimationActive = _props3.isUpdateAnimationActive, width = nodeProps.width, height = nodeProps.height, x = nodeProps.x, y = nodeProps.y, translateX = parseInt((2 * Math.random() - 1) * width, 10), event = {};\n                return isLeaf && (event = {\n                    onMouseEnter: this.handleMouseEnter.bind(this, nodeProps),\n                    onMouseLeave: this.handleMouseLeave.bind(this, nodeProps),\n                    onClick: this.handleClick.bind(this, nodeProps)\n                }), __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_smooth___default.a, {\n                    from: {\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    },\n                    to: {\n                        x: x,\n                        y: y,\n                        width: width,\n                        height: height\n                    },\n                    duration: animationDuration,\n                    easing: animationEasing,\n                    isActive: isUpdateAnimationActive\n                }, function(_ref3) {\n                    var currX = _ref3.x, currY = _ref3.y, currWidth = _ref3.width, currHeight = _ref3.height;\n                    return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_4_react_smooth___default.a, {\n                        from: \"translate(\" + translateX + \"px, \" + translateX + \"px)\",\n                        to: \"translate(0, 0)\",\n                        attributeName: \"transform\",\n                        begin: animationBegin,\n                        easing: animationEasing,\n                        isActive: isAnimationActive,\n                        duration: animationDuration\n                    }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__container_Layer__.a, event, _this2.renderContentItem(content, _extends({}, nodeProps, {\n                        isAnimationActive: isAnimationActive,\n                        isUpdateAnimationActive: !isUpdateAnimationActive,\n                        width: currWidth,\n                        height: currHeight,\n                        x: currX,\n                        y: currY\n                    }))));\n                });\n            }\n        }, {\n            key: \"renderContentItem\",\n            value: function(content, nodeProps) {\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.isValidElement(content) ? __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(content, nodeProps) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(content) ? content(nodeProps) : __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__shape_Rectangle__.a, _extends({\n                    fill: \"#fff\",\n                    stroke: \"#000\"\n                }, nodeProps));\n            }\n        }, {\n            key: \"renderNode\",\n            value: function(root, node, i) {\n                var _this3 = this, content = this.props.content, nodeProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(this.props), node, {\n                    root: root\n                }), isLeaf = !node.children || !node.children.length;\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__container_Layer__.a, {\n                    key: \"recharts-treemap-node-\" + i,\n                    className: \"recharts-treemap-depth-\" + node.depth\n                }, this.renderAnimatedItem(content, nodeProps, isLeaf), node.children && node.children.length ? node.children.map(function(child, index) {\n                    return _this3.renderNode(node, child, index);\n                }) : null);\n            }\n        }, {\n            key: \"renderAllNodes\",\n            value: function() {\n                var _props4 = this.props, width = _props4.width, height = _props4.height, data = _props4.data, dataKey = _props4.dataKey, aspectRatio = _props4.aspectRatio, root = computeNode({\n                    depth: 0,\n                    node: {\n                        children: data,\n                        x: 0,\n                        y: 0,\n                        width: width,\n                        height: height\n                    },\n                    index: 0,\n                    valueKey: dataKey\n                }), formatRoot = squarify(root, aspectRatio);\n                return this.renderNode(formatRoot, formatRoot, 0);\n            }\n        }, {\n            key: \"renderTooltip\",\n            value: function() {\n                var _props5 = this.props, children = _props5.children, nameKey = _props5.nameKey, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a);\n                if (!tooltipItem) return null;\n                var _props6 = this.props, width = _props6.width, height = _props6.height, dataKey = _props6.dataKey, _state = this.state, isTooltipActive = _state.isTooltipActive, activeNode = _state.activeNode, viewBox = {\n                    x: 0,\n                    y: 0,\n                    width: width,\n                    height: height\n                }, coordinate = activeNode ? {\n                    x: activeNode.x + activeNode.width / 2,\n                    y: activeNode.y + activeNode.height / 2\n                } : null, payload = isTooltipActive && activeNode ? [ {\n                    payload: activeNode,\n                    name: Object(__WEBPACK_IMPORTED_MODULE_12__util_ChartUtils__.w)(activeNode, nameKey, \"\"),\n                    value: Object(__WEBPACK_IMPORTED_MODULE_12__util_ChartUtils__.w)(activeNode, dataKey)\n                } ] : [];\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.cloneElement(tooltipItem, {\n                    viewBox: viewBox,\n                    active: isTooltipActive,\n                    coordinate: coordinate,\n                    label: \"\",\n                    payload: payload\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                if (!Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.q)(this)) return null;\n                var _props7 = this.props, width = _props7.width, height = _props7.height, className = _props7.className, style = _props7.style, children = _props7.children, others = _objectWithoutProperties(_props7, [ \"width\", \"height\", \"className\", \"style\", \"children\" ]), attrs = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(others);\n                return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(\"div\", {\n                    className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()(\"recharts-wrapper\", className),\n                    style: _extends({}, style, {\n                        position: \"relative\",\n                        cursor: \"default\",\n                        width: width,\n                        height: height\n                    })\n                }, __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__container_Surface__.a, _extends({}, attrs, {\n                    width: width,\n                    height: height\n                }), this.renderAllNodes(), Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.g)(children)), this.renderTooltip());\n            }\n        } ]), Treemap;\n    }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = \"Treemap\", \n    _class2.propTypes = {\n        width: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        data: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array,\n        style: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object,\n        aspectRatio: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        content: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),\n        fill: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        stroke: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string,\n        nameKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),\n        dataKey: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]),\n        children: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.node ]),\n        onMouseEnter: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        onMouseLeave: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        onClick: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func,\n        isAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        isUpdateAnimationActive: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool,\n        animationBegin: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        animationDuration: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number,\n        animationEasing: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"linear\" ])\n    }, _class2.defaultProps = {\n        dataKey: \"value\",\n        aspectRatio: .5 * (1 + Math.sqrt(5)),\n        isAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)(),\n        isUpdateAnimationActive: !Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.n)(),\n        animationBegin: 0,\n        animationDuration: 1500,\n        animationEasing: \"linear\"\n    }, _class = _temp2)) || _class;\n    __webpack_exports__.a = Treemap;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    function _objectWithoutProperties(obj, keys) {\n        var target = {};\n        for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]);\n        return target;\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_1_lodash_sumBy__ = __webpack_require__(940), __WEBPACK_IMPORTED_MODULE_1_lodash_sumBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_sumBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_min__ = __webpack_require__(328), __WEBPACK_IMPORTED_MODULE_2_lodash_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_min__), __WEBPACK_IMPORTED_MODULE_3_lodash_maxBy__ = __webpack_require__(368), __WEBPACK_IMPORTED_MODULE_3_lodash_maxBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_maxBy__), __WEBPACK_IMPORTED_MODULE_4_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_4_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_react__), __WEBPACK_IMPORTED_MODULE_5_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_5_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_prop_types__), __WEBPACK_IMPORTED_MODULE_6_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_6_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_classnames__), __WEBPACK_IMPORTED_MODULE_7__container_Surface__ = __webpack_require__(82), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__ = __webpack_require__(70), __WEBPACK_IMPORTED_MODULE_11__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__ = __webpack_require__(16), _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _extends = Object.assign || function(target) {\n        for (var i = 1; i < arguments.length; i++) {\n            var source = arguments[i];\n            for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]);\n        }\n        return target;\n    }, defaultCoordinateOfTooltip = {\n        x: 0,\n        y: 0\n    }, interpolationGenerator = function(a, b) {\n        var ka = +a, kb = b - ka;\n        return function(t) {\n            return ka + kb * t;\n        };\n    }, centerY = function(node) {\n        return node.y + node.dy / 2;\n    }, getValue = function(entry) {\n        return entry && entry.value || 0;\n    }, getSumOfIds = function(links, ids) {\n        return ids.reduce(function(result, id) {\n            return result + getValue(links[id]);\n        }, 0);\n    }, getSumWithWeightedSource = function(tree, links, ids) {\n        return ids.reduce(function(result, id) {\n            var link = links[id], sourceNode = tree[link.source];\n            return result + centerY(sourceNode) * getValue(links[id]);\n        }, 0);\n    }, getSumWithWeightedTarget = function(tree, links, ids) {\n        return ids.reduce(function(result, id) {\n            var link = links[id], targetNode = tree[link.target];\n            return result + centerY(targetNode) * getValue(links[id]);\n        }, 0);\n    }, ascendingY = function(a, b) {\n        return a.y - b.y;\n    }, searchTargetsAndSources = function(links, id) {\n        for (var sourceNodes = [], sourceLinks = [], targetNodes = [], targetLinks = [], i = 0, len = links.length; i < len; i++) {\n            var link = links[i];\n            link.source === id && (targetNodes.push(link.target), targetLinks.push(i)), link.target === id && (sourceNodes.push(link.source), \n            sourceLinks.push(i));\n        }\n        return {\n            sourceNodes: sourceNodes,\n            sourceLinks: sourceLinks,\n            targetLinks: targetLinks,\n            targetNodes: targetNodes\n        };\n    }, updateDepthOfTargets = function updateDepthOfTargets(tree, curNode) {\n        for (var targetNodes = curNode.targetNodes, i = 0, len = targetNodes.length; i < len; i++) {\n            var target = tree[targetNodes[i]];\n            target && (target.depth = Math.max(curNode.depth + 1, target.depth), updateDepthOfTargets(tree, target));\n        }\n    }, getNodesTree = function(_ref, width, nodeWidth) {\n        for (var nodes = _ref.nodes, links = _ref.links, tree = nodes.map(function(entry, index) {\n            var result = searchTargetsAndSources(links, index);\n            return _extends({}, entry, result, {\n                value: Math.max(getSumOfIds(links, result.sourceLinks), getSumOfIds(links, result.targetLinks)),\n                depth: 0\n            });\n        }), i = 0, len = tree.length; i < len; i++) {\n            var node = tree[i];\n            node.sourceNodes.length || updateDepthOfTargets(tree, node);\n        }\n        var maxDepth = __WEBPACK_IMPORTED_MODULE_3_lodash_maxBy___default()(tree, function(entry) {\n            return entry.depth;\n        }).depth;\n        if (maxDepth >= 1) for (var childWidth = (width - nodeWidth) / maxDepth, _i = 0, _len = tree.length; _i < _len; _i++) {\n            var _node = tree[_i];\n            _node.targetNodes.length || (_node.depth = maxDepth), _node.x = _node.depth * childWidth, \n            _node.dx = nodeWidth;\n        }\n        return {\n            tree: tree,\n            maxDepth: maxDepth\n        };\n    }, getDepthTree = function(tree) {\n        for (var result = [], i = 0, len = tree.length; i < len; i++) {\n            var node = tree[i];\n            result[node.depth] || (result[node.depth] = []), result[node.depth].push(node);\n        }\n        return result;\n    }, updateYOfTree = function(depthTree, height, nodePadding, links) {\n        for (var yRatio = __WEBPACK_IMPORTED_MODULE_2_lodash_min___default()(depthTree.map(function(nodes) {\n            return (height - (nodes.length - 1) * nodePadding) / __WEBPACK_IMPORTED_MODULE_1_lodash_sumBy___default()(nodes, getValue);\n        })), d = 0, maxDepth = depthTree.length; d < maxDepth; d++) for (var i = 0, len = depthTree[d].length; i < len; i++) {\n            var node = depthTree[d][i];\n            node.y = i, node.dy = node.value * yRatio;\n        }\n        return links.map(function(link) {\n            return _extends({}, link, {\n                dy: getValue(link) * yRatio\n            });\n        });\n    }, resolveCollisions = function(depthTree, height, nodePadding) {\n        for (var i = 0, len = depthTree.length; i < len; i++) {\n            var nodes = depthTree[i], n = nodes.length;\n            nodes.sort(ascendingY);\n            for (var y0 = 0, j = 0; j < n; j++) {\n                var node = nodes[j], dy = y0 - node.y;\n                dy > 0 && (node.y += dy), y0 = node.y + node.dy + nodePadding;\n            }\n            y0 = height + nodePadding;\n            for (var _j = n - 1; _j >= 0; _j--) {\n                var _node2 = nodes[_j], _dy = _node2.y + _node2.dy + nodePadding - y0;\n                if (!(_dy > 0)) break;\n                _node2.y -= _dy, y0 = _node2.y;\n            }\n        }\n    }, relaxLeftToRight = function(tree, depthTree, links, alpha) {\n        for (var i = 0, maxDepth = depthTree.length; i < maxDepth; i++) for (var nodes = depthTree[i], j = 0, len = nodes.length; j < len; j++) {\n            var node = nodes[j];\n            if (node.sourceLinks.length) {\n                var sourceSum = getSumOfIds(links, node.sourceLinks), weightedSum = getSumWithWeightedSource(tree, links, node.sourceLinks), y = weightedSum / sourceSum;\n                node.y += (y - centerY(node)) * alpha;\n            }\n        }\n    }, relaxRightToLeft = function(tree, depthTree, links, alpha) {\n        for (var i = depthTree.length - 1; i >= 0; i--) for (var nodes = depthTree[i], j = 0, len = nodes.length; j < len; j++) {\n            var node = nodes[j];\n            if (node.targetLinks.length) {\n                var targetSum = getSumOfIds(links, node.targetLinks), weightedSum = getSumWithWeightedTarget(tree, links, node.targetLinks), y = weightedSum / targetSum;\n                node.y += (y - centerY(node)) * alpha;\n            }\n        }\n    }, updateYOfLinks = function(tree, links) {\n        for (var i = 0, len = tree.length; i < len; i++) {\n            var node = tree[i], sy = 0, ty = 0;\n            node.targetLinks.sort(function(a, b) {\n                return tree[links[a].target].y - tree[links[b].target].y;\n            }), node.sourceLinks.sort(function(a, b) {\n                return tree[links[a].source].y - tree[links[b].source].y;\n            });\n            for (var j = 0, tLen = node.targetLinks.length; j < tLen; j++) {\n                var link = links[node.targetLinks[j]];\n                link && (link.sy = sy, sy += link.dy);\n            }\n            for (var _j2 = 0, sLen = node.sourceLinks.length; _j2 < sLen; _j2++) {\n                var _link = links[node.sourceLinks[_j2]];\n                _link && (_link.ty = ty, ty += _link.dy);\n            }\n        }\n    }, computeData = function(_ref2) {\n        var data = _ref2.data, width = _ref2.width, height = _ref2.height, iterations = _ref2.iterations, nodeWidth = _ref2.nodeWidth, nodePadding = _ref2.nodePadding, links = data.links, _getNodesTree = getNodesTree(data, width, nodeWidth), tree = _getNodesTree.tree, depthTree = getDepthTree(tree), newLinks = updateYOfTree(depthTree, height, nodePadding, links);\n        resolveCollisions(depthTree, height, nodePadding);\n        for (var alpha = 1, i = 1; i <= iterations; i++) relaxRightToLeft(tree, depthTree, newLinks, alpha *= .99), \n        resolveCollisions(depthTree, height, nodePadding), relaxLeftToRight(tree, depthTree, newLinks, alpha), \n        resolveCollisions(depthTree, height, nodePadding);\n        return updateYOfLinks(tree, newLinks), {\n            nodes: tree,\n            links: newLinks\n        };\n    }, getCoordinateOfTooltip = function(el, type) {\n        return \"node\" === type ? {\n            x: el.x + el.width / 2,\n            y: el.y + el.height / 2\n        } : {\n            x: (el.sourceX + el.targetX) / 2,\n            y: (el.sourceY + el.targetY) / 2\n        };\n    }, getPayloadOfTooltip = function(el, type, nameKey) {\n        var payload = el.payload;\n        if (\"node\" === type) return [ {\n            payload: el,\n            name: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload, nameKey, \"\"),\n            value: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload, \"value\")\n        } ];\n        if (payload.source && payload.target) {\n            return [ {\n                payload: el,\n                name: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload.source, nameKey, \"\") + \" - \" + Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload.target, nameKey, \"\"),\n                value: Object(__WEBPACK_IMPORTED_MODULE_13__util_ChartUtils__.w)(payload, \"value\")\n            } ];\n        }\n        return [];\n    }, Sankey = Object(__WEBPACK_IMPORTED_MODULE_11__util_PureRender__.a)((_temp = _class2 = function(_Component) {\n        function Sankey(props) {\n            _classCallCheck(this, Sankey);\n            var _this = _possibleConstructorReturn(this, (Sankey.__proto__ || Object.getPrototypeOf(Sankey)).call(this, props));\n            return _this.state = _this.createDefaultState(props), _this;\n        }\n        return _inherits(Sankey, _Component), _createClass(Sankey, [ {\n            key: \"componentWillReceiveProps\",\n            value: function(nextProps) {\n                var _props = this.props, data = _props.data, width = _props.width, height = _props.height, margin = _props.margin, iterations = _props.iterations, nodeWidth = _props.nodeWidth, nodePadding = _props.nodePadding, nameKey = _props.nameKey;\n                nextProps.data === data && nextProps.width === width && nextProps.height === height && Object(__WEBPACK_IMPORTED_MODULE_11__util_PureRender__.b)(nextProps.margin, margin) && nextProps.iterations === iterations && nextProps.nodeWidth === nodeWidth && nextProps.nodePadding === nodePadding && nextProps.nameKey === nameKey || this.setState(this.createDefaultState(nextProps));\n            }\n        }, {\n            key: \"createDefaultState\",\n            value: function(props) {\n                var data = props.data, width = props.width, height = props.height, margin = props.margin, iterations = props.iterations, nodeWidth = props.nodeWidth, nodePadding = props.nodePadding, contentWidth = width - (margin && margin.left || 0) - (margin && margin.right || 0), contentHeight = height - (margin && margin.top || 0) - (margin && margin.bottom || 0), _computeData = computeData({\n                    data: data,\n                    width: contentWidth,\n                    height: contentHeight,\n                    iterations: iterations,\n                    nodeWidth: nodeWidth,\n                    nodePadding: nodePadding\n                }), links = _computeData.links;\n                return {\n                    activeElement: null,\n                    activeElementType: null,\n                    isTooltipActive: !1,\n                    nodes: _computeData.nodes,\n                    links: links\n                };\n            }\n        }, {\n            key: \"handleMouseEnter\",\n            value: function(el, type, e) {\n                var _props2 = this.props, onMouseEnter = _props2.onMouseEnter, children = _props2.children;\n                Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__.a) ? this.setState({\n                    activeElement: el,\n                    activeElementType: type,\n                    isTooltipActive: !0\n                }, function() {\n                    onMouseEnter && onMouseEnter(el, type, e);\n                }) : onMouseEnter && onMouseEnter(el, type, e);\n            }\n        }, {\n            key: \"handleMouseLeave\",\n            value: function(el, type, e) {\n                var _props3 = this.props, onMouseLeave = _props3.onMouseLeave, children = _props3.children;\n                Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__.a) ? this.setState({\n                    isTooltipActive: !1\n                }, function() {\n                    onMouseLeave && onMouseLeave(el, type, e);\n                }) : onMouseLeave && onMouseLeave(el, type, e);\n            }\n        }, {\n            key: \"renderLinkItem\",\n            value: function(option, props) {\n                if (__WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option)) return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props);\n                if (__WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option)) return option(props);\n                var sourceX = props.sourceX, sourceY = props.sourceY, sourceControlX = props.sourceControlX, targetX = props.targetX, targetY = props.targetY, targetControlX = props.targetControlX, linkWidth = props.linkWidth, others = _objectWithoutProperties(props, [ \"sourceX\", \"sourceY\", \"sourceControlX\", \"targetX\", \"targetY\", \"targetControlX\", \"linkWidth\" ]);\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(\"path\", _extends({\n                    className: \"recharts-sankey-link\",\n                    d: \"\\n          M\" + sourceX + \",\" + sourceY + \"\\n          C\" + sourceControlX + \",\" + sourceY + \" \" + targetControlX + \",\" + targetY + \" \" + targetX + \",\" + targetY + \"\\n        \",\n                    fill: \"none\",\n                    stroke: \"#333\",\n                    strokeWidth: linkWidth,\n                    strokeOpacity: \"0.2\"\n                }, Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(others)));\n            }\n        }, {\n            key: \"renderLinks\",\n            value: function(links, nodes) {\n                var _this2 = this, _props4 = this.props, linkCurvature = _props4.linkCurvature, linkContent = _props4.link, margin = _props4.margin, top = margin.top || 0, left = margin.left || 0;\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-sankey-links\",\n                    key: \"recharts-sankey-links\"\n                }, links.map(function(link, i) {\n                    var sourceRelativeY = link.sy, targetRelativeY = link.ty, linkWidth = link.dy, source = nodes[link.source], target = nodes[link.target], sourceX = source.x + source.dx + left, targetX = target.x + left, interpolationFunc = interpolationGenerator(sourceX, targetX), sourceControlX = interpolationFunc(linkCurvature), targetControlX = interpolationFunc(1 - linkCurvature), sourceY = source.y + sourceRelativeY + linkWidth / 2 + top, targetY = target.y + targetRelativeY + linkWidth / 2 + top, linkProps = _extends({\n                        sourceX: sourceX,\n                        targetX: targetX,\n                        sourceY: sourceY,\n                        targetY: targetY,\n                        sourceControlX: sourceControlX,\n                        targetControlX: targetControlX,\n                        sourceRelativeY: sourceRelativeY,\n                        targetRelativeY: targetRelativeY,\n                        linkWidth: linkWidth,\n                        index: i,\n                        payload: _extends({}, link, {\n                            source: source,\n                            target: target\n                        })\n                    }, Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(linkContent)), events = {\n                        onMouseEnter: _this2.handleMouseEnter.bind(_this2, linkProps, \"link\"),\n                        onMouseLeave: _this2.handleMouseLeave.bind(_this2, linkProps, \"link\")\n                    };\n                    return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({\n                        key: \"link\" + i\n                    }, events), _this2.renderLinkItem(linkContent, linkProps));\n                }));\n            }\n        }, {\n            key: \"renderNodeItem\",\n            value: function(option, props) {\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.isValidElement(option) ? __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(option, props) : __WEBPACK_IMPORTED_MODULE_0_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_10__shape_Rectangle__.a, _extends({\n                    className: \"recharts-sankey-node\",\n                    fill: \"#0088fe\",\n                    fillOpacity: \"0.8\"\n                }, props));\n            }\n        }, {\n            key: \"renderNodes\",\n            value: function(nodes) {\n                var _this3 = this, _props5 = this.props, nodeContent = _props5.node, margin = _props5.margin, top = margin.top || 0, left = margin.left || 0;\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, {\n                    className: \"recharts-sankey-nodes\",\n                    key: \"recharts-sankey-nodes\"\n                }, nodes.map(function(node, i) {\n                    var x = node.x, y = node.y, dx = node.dx, dy = node.dy, nodeProps = _extends({}, Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(nodeContent), {\n                        x: x + left,\n                        y: y + top,\n                        width: dx,\n                        height: dy,\n                        index: i,\n                        payload: node\n                    }), events = {\n                        onMouseEnter: _this3.handleMouseEnter.bind(_this3, nodeProps, \"node\"),\n                        onMouseLeave: _this3.handleMouseLeave.bind(_this3, nodeProps, \"node\")\n                    };\n                    return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, _extends({\n                        key: \"node\" + i\n                    }, events), _this3.renderNodeItem(nodeContent, nodeProps));\n                }));\n            }\n        }, {\n            key: \"renderTooltip\",\n            value: function() {\n                var _props6 = this.props, children = _props6.children, width = _props6.width, height = _props6.height, nameKey = _props6.nameKey, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_9__component_Tooltip__.a);\n                if (!tooltipItem) return null;\n                var _state = this.state, isTooltipActive = _state.isTooltipActive, activeElement = _state.activeElement, activeElementType = _state.activeElementType, viewBox = {\n                    x: 0,\n                    y: 0,\n                    width: width,\n                    height: height\n                }, coordinate = activeElement ? getCoordinateOfTooltip(activeElement, activeElementType) : defaultCoordinateOfTooltip, payload = activeElement ? getPayloadOfTooltip(activeElement, activeElementType, nameKey) : [];\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.cloneElement(tooltipItem, {\n                    viewBox: viewBox,\n                    active: isTooltipActive,\n                    coordinate: coordinate,\n                    label: \"\",\n                    payload: payload\n                });\n            }\n        }, {\n            key: \"render\",\n            value: function() {\n                if (!Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.q)(this)) return null;\n                var _props7 = this.props, width = _props7.width, height = _props7.height, className = _props7.className, style = _props7.style, children = _props7.children, others = _objectWithoutProperties(_props7, [ \"width\", \"height\", \"className\", \"style\", \"children\" ]), _state2 = this.state, links = _state2.links, nodes = _state2.nodes, attrs = Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.k)(others);\n                return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(\"div\", {\n                    className: __WEBPACK_IMPORTED_MODULE_6_classnames___default()(\"recharts-wrapper\", className),\n                    style: _extends({}, style, {\n                        position: \"relative\",\n                        cursor: \"default\",\n                        width: width,\n                        height: height\n                    })\n                }, __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__container_Surface__.a, _extends({}, attrs, {\n                    width: width,\n                    height: height\n                }), Object(__WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.g)(children), this.renderLinks(links, nodes), this.renderNodes(nodes)), this.renderTooltip());\n            }\n        } ]), Sankey;\n    }(__WEBPACK_IMPORTED_MODULE_4_react__.Component), _class2.displayName = \"Sankey\", \n    _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_12__util_ReactUtils__.a, {\n        nameKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),\n        dataKey: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),\n        width: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        height: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        data: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({\n            nodes: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.array,\n            links: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({\n                target: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n                source: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n                value: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number\n            }))\n        }),\n        nodePadding: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        nodeWidth: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        linkCurvature: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        iterations: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n        node: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),\n        link: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.func ]),\n        style: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.object,\n        className: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.string,\n        children: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.node ]),\n        margin: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.shape({\n            top: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n            right: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n            bottom: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number,\n            left: __WEBPACK_IMPORTED_MODULE_5_prop_types___default.a.number\n        })\n    }), _class2.defaultProps = {\n        nodePadding: 10,\n        nodeWidth: 10,\n        nameKey: \"name\",\n        dataKey: \"value\",\n        linkCurvature: .5,\n        iterations: 32,\n        margin: {\n            top: 5,\n            right: 5,\n            bottom: 5,\n            left: 5\n        }\n    }, _class = _temp)) || _class;\n    __webpack_exports__.a = Sankey;\n}, function(module, exports, __webpack_require__) {\n    function sumBy(array, iteratee) {\n        return array && array.length ? baseSum(array, baseIteratee(iteratee, 2)) : 0;\n    }\n    var baseIteratee = __webpack_require__(89), baseSum = __webpack_require__(941);\n    module.exports = sumBy;\n}, function(module, exports) {\n    function baseSum(array, iteratee) {\n        for (var result, index = -1, length = array.length; ++index < length; ) {\n            var current = iteratee(array[index]);\n            void 0 !== current && (result = void 0 === result ? current : result + current);\n        }\n        return result;\n    }\n    module.exports = baseSum;\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_0_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_prop_types__), __WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_2__polar_Radar__ = __webpack_require__(370), __WEBPACK_IMPORTED_MODULE_3__polar_PolarAngleAxis__ = __webpack_require__(141), __WEBPACK_IMPORTED_MODULE_4__polar_PolarRadiusAxis__ = __webpack_require__(140), __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__ = __webpack_require__(23);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__.a)({\n        chartName: \"RadarChart\",\n        GraphicalChild: __WEBPACK_IMPORTED_MODULE_2__polar_Radar__.a,\n        axisComponents: [ {\n            axisType: \"angleAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_3__polar_PolarAngleAxis__.a\n        }, {\n            axisType: \"radiusAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_4__polar_PolarRadiusAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_5__util_PolarUtils__.b,\n        defaultProps: {\n            layout: \"centric\",\n            startAngle: 90,\n            endAngle: -270,\n            cx: \"50%\",\n            cy: \"50%\",\n            innerRadius: 0,\n            outerRadius: \"80%\"\n        },\n        propTypes: {\n            layout: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOf([ \"centric\" ]),\n            startAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,\n            endAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,\n            cx: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            cy: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            innerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            outerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ])\n        }\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_1__cartesian_Scatter__ = __webpack_require__(218), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(72), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(73), __WEBPACK_IMPORTED_MODULE_4__cartesian_ZAxis__ = __webpack_require__(142), __WEBPACK_IMPORTED_MODULE_5__util_CartesianUtils__ = __webpack_require__(96);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({\n        chartName: \"ScatterChart\",\n        GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Scatter__.a,\n        eventType: \"single\",\n        axisComponents: [ {\n            axisType: \"xAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a\n        }, {\n            axisType: \"yAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a\n        }, {\n            axisType: \"zAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_4__cartesian_ZAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_5__util_CartesianUtils__.a\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__ = __webpack_require__(216), __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__ = __webpack_require__(72), __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__ = __webpack_require__(73), __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__ = __webpack_require__(96);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({\n        chartName: \"AreaChart\",\n        GraphicalChild: __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__.a,\n        axisComponents: [ {\n            axisType: \"xAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_2__cartesian_XAxis__.a\n        }, {\n            axisType: \"yAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_3__cartesian_YAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_CartesianUtils__.a\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_0_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_prop_types__), __WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__ = __webpack_require__(141), __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__ = __webpack_require__(140), __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_5__polar_RadialBar__ = __webpack_require__(371);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_1__generateCategoricalChart__.a)({\n        chartName: \"RadialBarChart\",\n        GraphicalChild: __WEBPACK_IMPORTED_MODULE_5__polar_RadialBar__.a,\n        legendContent: \"children\",\n        axisComponents: [ {\n            axisType: \"angleAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_2__polar_PolarAngleAxis__.a\n        }, {\n            axisType: \"radiusAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_3__polar_PolarRadiusAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_4__util_PolarUtils__.b,\n        defaultProps: {\n            layout: \"radial\",\n            startAngle: 0,\n            endAngle: 360,\n            cx: \"50%\",\n            cy: \"50%\",\n            innerRadius: 0,\n            outerRadius: \"80%\"\n        },\n        propTypes: {\n            layout: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOf([ \"radial\" ]),\n            startAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,\n            endAngle: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number,\n            cx: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            cy: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            innerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ]),\n            outerRadius: __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_0_prop_types___default.a.string ])\n        }\n    });\n}, function(module, __webpack_exports__, __webpack_require__) {\n    \"use strict\";\n    var __WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__ = __webpack_require__(48), __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__ = __webpack_require__(216), __WEBPACK_IMPORTED_MODULE_2__cartesian_Bar__ = __webpack_require__(217), __WEBPACK_IMPORTED_MODULE_3__cartesian_Line__ = __webpack_require__(215), __WEBPACK_IMPORTED_MODULE_4__cartesian_Scatter__ = __webpack_require__(218), __WEBPACK_IMPORTED_MODULE_5__cartesian_XAxis__ = __webpack_require__(72), __WEBPACK_IMPORTED_MODULE_6__cartesian_YAxis__ = __webpack_require__(73), __WEBPACK_IMPORTED_MODULE_7__cartesian_ZAxis__ = __webpack_require__(142), __WEBPACK_IMPORTED_MODULE_8__util_CartesianUtils__ = __webpack_require__(96);\n    __webpack_exports__.a = Object(__WEBPACK_IMPORTED_MODULE_0__generateCategoricalChart__.a)({\n        chartName: \"ComposedChart\",\n        GraphicalChild: [ __WEBPACK_IMPORTED_MODULE_3__cartesian_Line__.a, __WEBPACK_IMPORTED_MODULE_1__cartesian_Area__.a, __WEBPACK_IMPORTED_MODULE_2__cartesian_Bar__.a, __WEBPACK_IMPORTED_MODULE_4__cartesian_Scatter__.a ],\n        axisComponents: [ {\n            axisType: \"xAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_5__cartesian_XAxis__.a\n        }, {\n            axisType: \"yAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_6__cartesian_YAxis__.a\n        }, {\n            axisType: \"zAxis\",\n            AxisComp: __WEBPACK_IMPORTED_MODULE_7__cartesian_ZAxis__.a\n        } ],\n        formatAxisMap: __WEBPACK_IMPORTED_MODULE_8__util_CartesianUtils__.a\n    });\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    });\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _Grid = __webpack_require__(262), _Grid2 = _interopRequireDefault(_Grid), styles = {\n        container: {\n            flexWrap: \"nowrap\",\n            height: \"100%\",\n            maxWidth: \"100%\",\n            margin: 0\n        },\n        item: {\n            flex: 1,\n            padding: 0\n        }\n    }, ChartRow = function(_Component) {\n        function ChartRow() {\n            return _classCallCheck(this, ChartRow), _possibleConstructorReturn(this, (ChartRow.__proto__ || Object.getPrototypeOf(ChartRow)).apply(this, arguments));\n        }\n        return _inherits(ChartRow, _Component), _createClass(ChartRow, [ {\n            key: \"render\",\n            value: function() {\n                return _react2.default.createElement(_Grid2.default, {\n                    container: !0,\n                    direction: \"row\",\n                    style: styles.container,\n                    justify: \"space-between\"\n                }, _react2.default.Children.map(this.props.children, function(child) {\n                    return _react2.default.createElement(_Grid2.default, {\n                        item: !0,\n                        xs: !0,\n                        style: styles.item\n                    }, child);\n                }));\n            }\n        } ]), ChartRow;\n    }(_react.Component);\n    exports.default = ChartRow;\n}, function(module, exports, __webpack_require__) {\n    \"use strict\";\n    function _interopRequireDefault(obj) {\n        return obj && obj.__esModule ? obj : {\n            default: obj\n        };\n    }\n    function _classCallCheck(instance, Constructor) {\n        if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n    }\n    function _possibleConstructorReturn(self, call) {\n        if (!self) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n        return !call || \"object\" != typeof call && \"function\" != typeof call ? self : call;\n    }\n    function _inherits(subClass, superClass) {\n        if (\"function\" != typeof superClass && null !== superClass) throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n        subClass.prototype = Object.create(superClass && superClass.prototype, {\n            constructor: {\n                value: subClass,\n                enumerable: !1,\n                writable: !0,\n                configurable: !0\n            }\n        }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass);\n    }\n    Object.defineProperty(exports, \"__esModule\", {\n        value: !0\n    }), exports.bytePerSecPlotter = exports.bytePlotter = exports.percentPlotter = exports.multiplier = void 0;\n    var _createClass = function() {\n        function defineProperties(target, props) {\n            for (var i = 0; i < props.length; i++) {\n                var descriptor = props[i];\n                descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, \n                \"value\" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor);\n            }\n        }\n        return function(Constructor, protoProps, staticProps) {\n            return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), \n            Constructor;\n        };\n    }(), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _Typography = __webpack_require__(113), _Typography2 = _interopRequireDefault(_Typography), _common = __webpack_require__(81), multiplier = exports.multiplier = function() {\n        var by = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 1;\n        return function(x) {\n            return x * by;\n        };\n    }, unit = (exports.percentPlotter = function(text) {\n        var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1);\n        return function(payload) {\n            var p = mapper(payload);\n            return \"number\" != typeof p ? null : _react2.default.createElement(_Typography2.default, {\n                type: \"caption\",\n                color: \"inherit\"\n            }, _react2.default.createElement(\"span\", {\n                style: _common.styles.light\n            }, text), \" \", p.toFixed(2), \" %\");\n        };\n    }, [ \"\", \"Ki\", \"Mi\", \"Gi\", \"Ti\", \"Pi\", \"Ei\", \"Zi\", \"Yi\" ]), simplifyBytes = function(x) {\n        for (var i = 0; x > 1024 && i < 8; i++) x /= 1024;\n        return x.toFixed(2).toString().concat(\" \", unit[i], \"B\");\n    }, CustomTooltip = (exports.bytePlotter = function(text) {\n        var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1);\n        return function(payload) {\n            var p = mapper(payload);\n            return \"number\" != typeof p ? null : _react2.default.createElement(_Typography2.default, {\n                type: \"caption\",\n                color: \"inherit\"\n            }, _react2.default.createElement(\"span\", {\n                style: _common.styles.light\n            }, text), \" \", simplifyBytes(p));\n        };\n    }, exports.bytePerSecPlotter = function(text) {\n        var mapper = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : multiplier(1);\n        return function(payload) {\n            var p = mapper(payload);\n            return \"number\" != typeof p ? null : _react2.default.createElement(_Typography2.default, {\n                type: \"caption\",\n                color: \"inherit\"\n            }, _react2.default.createElement(\"span\", {\n                style: _common.styles.light\n            }, text), \" \", simplifyBytes(p), \"/s\");\n        };\n    }, function(_Component) {\n        function CustomTooltip() {\n            return _classCallCheck(this, CustomTooltip), _possibleConstructorReturn(this, (CustomTooltip.__proto__ || Object.getPrototypeOf(CustomTooltip)).apply(this, arguments));\n        }\n        return _inherits(CustomTooltip, _Component), _createClass(CustomTooltip, [ {\n            key: \"render\",\n            value: function() {\n                var _props = this.props, active = _props.active, payload = _props.payload, tooltip = _props.tooltip;\n                return !active || \"function\" != typeof tooltip || !Array.isArray(payload) || payload.length < 1 ? null : tooltip(payload[0].value);\n            }\n        } ]), CustomTooltip;\n    }(_react.Component));\n    exports.default = CustomTooltip;\n} ]);`)))))))))))\n\nfunc bundleJsBytes() ([]byte, error) {\n\treturn _bundleJs, nil\n}\n\nfunc bundleJs() (*asset, error) {\n\tbytes, err := bundleJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"bundle.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0xef, 0x26, 0x2b, 0x98, 0x2d, 0xce, 0x9a, 0x8f, 0x9a, 0x5e, 0x37, 0x64, 0x5c, 0x70, 0xa2, 0xeb, 0x44, 0xb1, 0x6d, 0x8b, 0x8e, 0x95, 0x34, 0x14, 0x7a, 0x79, 0x4f, 0x8, 0xc3, 0xb3, 0x5, 0x3}}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// AssetString returns the asset contents as a string (instead of a []byte).\nfunc AssetString(name string) (string, error) {\n\tdata, err := Asset(name)\n\treturn string(data), err\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// MustAssetString is like AssetString but panics when Asset would return an\n// error. It simplifies safe initialization of global variables.\nfunc MustAssetString(name string) string {\n\treturn string(MustAsset(name))\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetDigest returns the digest of the file with the given name. It returns an\n// error if the asset could not be found or the digest could not be loaded.\nfunc AssetDigest(name string) ([sha256.Size]byte, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn [sha256.Size]byte{}, fmt.Errorf(\"AssetDigest %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.digest, nil\n\t}\n\treturn [sha256.Size]byte{}, fmt.Errorf(\"AssetDigest %s not found\", name)\n}\n\n// Digests returns a map of all known files and their checksums.\nfunc Digests() (map[string][sha256.Size]byte, error) {\n\tmp := make(map[string][sha256.Size]byte, len(_bindata))\n\tfor name := range _bindata {\n\t\ta, err := _bindata[name]()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmp[name] = a.digest\n\t}\n\treturn mp, nil\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"index.html\": indexHtml,\n\n\t\"bundle.js\": bundleJs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"},\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"},\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error, and\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif len(name) != 0 {\n\t\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\t\tpathList := strings.Split(canonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"bundle.js\":  {bundleJs, map[string]*bintree{}},\n\t\"index.html\": {indexHtml, map[string]*bintree{}},\n}}\n\n// RestoreAsset restores an asset under the given directory.\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n}\n\n// RestoreAssets restores an asset under the given directory recursively.\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\treturn filepath.Join(append([]string{dir}, strings.Split(canonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "dashboard/config.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage dashboard\n\nimport \"time\"\n\n// DefaultConfig contains default settings for the dashboard.\nvar DefaultConfig = Config{\n\tHost:    \"localhost\",\n\tPort:    8080,\n\tRefresh: 5 * time.Second,\n}\n\n// Config contains the configuration parameters of the dashboard.\ntype Config struct {\n\t// Host is the host interface on which to start the dashboard server. If this\n\t// field is empty, no dashboard will be started.\n\tHost string `toml:\",omitempty\"`\n\n\t// Port is the TCP port number on which to start the dashboard server. The\n\t// default zero value is/ valid and will pick a port number randomly (useful\n\t// for ephemeral nodes).\n\tPort int `toml:\",omitempty\"`\n\n\t// Refresh is the refresh rate of the data updates, the chartEntry will be collected this often.\n\tRefresh time.Duration `toml:\",omitempty\"`\n}\n"
  },
  {
    "path": "dashboard/cpu.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build !windows\n\npackage dashboard\n\nimport (\n\t\"syscall\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// getProcessCPUTime retrieves the process' CPU time since program startup.\nfunc getProcessCPUTime() float64 {\n\tvar usage syscall.Rusage\n\tif err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil {\n\t\tlog.Warn(\"Failed to retrieve CPU time\", \"err\", err)\n\t\treturn 0\n\t}\n\treturn float64(usage.Utime.Sec+usage.Stime.Sec) + float64(usage.Utime.Usec+usage.Stime.Usec)/1000000\n}\n"
  },
  {
    "path": "dashboard/cpu_windows.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage dashboard\n\n// getProcessCPUTime returns 0 on Windows as there is no system call to resolve\n// the actual process' CPU time.\nfunc getProcessCPUTime() float64 {\n\treturn 0\n}\n"
  },
  {
    "path": "dashboard/dashboard.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage dashboard\n\n//go:generate yarn --cwd ./assets install\n//go:generate yarn --cwd ./assets build\n//go:generate go-bindata -nometadata -o assets.go -prefix assets -nocompress -pkg dashboard assets/index.html assets/bundle.js\n//go:generate sh -c \"sed 's#var _bundleJs#//nolint:misspell\\\\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go\"\n//go:generate sh -c \"sed 's#var _indexHtml#//nolint:misspell\\\\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go\"\n//go:generate gofmt -w -s assets.go\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"io\"\n\n\t\"github.com/elastic/gosigar\"\n\t\"github.com/mohae/deepcopy\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"golang.org/x/net/websocket\"\n)\n\nconst (\n\tactiveMemorySampleLimit   = 200 // Maximum number of active memory data samples\n\tvirtualMemorySampleLimit  = 200 // Maximum number of virtual memory data samples\n\tnetworkIngressSampleLimit = 200 // Maximum number of network ingress data samples\n\tnetworkEgressSampleLimit  = 200 // Maximum number of network egress data samples\n\tprocessCPUSampleLimit     = 200 // Maximum number of process cpu data samples\n\tsystemCPUSampleLimit      = 200 // Maximum number of system cpu data samples\n\tdiskReadSampleLimit       = 200 // Maximum number of disk read data samples\n\tdiskWriteSampleLimit      = 200 // Maximum number of disk write data samples\n)\n\nvar nextID uint32 // Next connection id\n\n// Dashboard contains the dashboard internals.\ntype Dashboard struct {\n\tconfig *Config\n\n\tlistener net.Listener\n\tconns    map[uint32]*client // Currently live websocket connections\n\thistory  *Message\n\tlock     sync.RWMutex // Lock protecting the dashboard's internals\n\n\tlogdir string\n\n\tquit chan chan error // Channel used for graceful exit\n\twg   sync.WaitGroup\n}\n\n// client represents active websocket connection with a remote browser.\ntype client struct {\n\tconn   *websocket.Conn // Particular live websocket connection\n\tmsg    chan *Message   // Message queue for the update messages\n\tlogger log.Logger      // Logger for the particular live websocket connection\n}\n\n// New creates a new dashboard instance with the given configuration.\nfunc New(config *Config, commit string, logdir string) *Dashboard {\n\tnow := time.Now()\n\tversionMeta := \"\"\n\tif len(params.VersionMeta) > 0 {\n\t\tversionMeta = fmt.Sprintf(\" (%s)\", params.VersionMeta)\n\t}\n\treturn &Dashboard{\n\t\tconns:  make(map[uint32]*client),\n\t\tconfig: config,\n\t\tquit:   make(chan chan error),\n\t\thistory: &Message{\n\t\t\tGeneral: &GeneralMessage{\n\t\t\t\tCommit:  commit,\n\t\t\t\tVersion: fmt.Sprintf(\"v%d.%d.%d%s\", params.VersionMajor, params.VersionMinor, params.VersionPatch, versionMeta),\n\t\t\t},\n\t\t\tSystem: &SystemMessage{\n\t\t\t\tActiveMemory:   emptyChartEntries(now, activeMemorySampleLimit, config.Refresh),\n\t\t\t\tVirtualMemory:  emptyChartEntries(now, virtualMemorySampleLimit, config.Refresh),\n\t\t\t\tNetworkIngress: emptyChartEntries(now, networkIngressSampleLimit, config.Refresh),\n\t\t\t\tNetworkEgress:  emptyChartEntries(now, networkEgressSampleLimit, config.Refresh),\n\t\t\t\tProcessCPU:     emptyChartEntries(now, processCPUSampleLimit, config.Refresh),\n\t\t\t\tSystemCPU:      emptyChartEntries(now, systemCPUSampleLimit, config.Refresh),\n\t\t\t\tDiskRead:       emptyChartEntries(now, diskReadSampleLimit, config.Refresh),\n\t\t\t\tDiskWrite:      emptyChartEntries(now, diskWriteSampleLimit, config.Refresh),\n\t\t\t},\n\t\t},\n\t\tlogdir: logdir,\n\t}\n}\n\n// emptyChartEntries returns a ChartEntry array containing limit number of empty samples.\nfunc emptyChartEntries(t time.Time, limit int, refresh time.Duration) ChartEntries {\n\tce := make(ChartEntries, limit)\n\tfor i := 0; i < limit; i++ {\n\t\tce[i] = &ChartEntry{\n\t\t\tTime: t.Add(-time.Duration(i) * refresh),\n\t\t}\n\t}\n\treturn ce\n}\n\n// Protocols implements the node.Service interface.\nfunc (db *Dashboard) Protocols() []p2p.Protocol { return nil }\n\n// APIs implements the node.Service interface.\nfunc (db *Dashboard) APIs() []rpc.API { return nil }\n\n// Start starts the data collection thread and the listening server of the dashboard.\n// Implements the node.Service interface.\nfunc (db *Dashboard) Start(server *p2p.Server) error {\n\tlog.Info(\"Starting dashboard\")\n\n\tdb.wg.Add(2)\n\tgo db.collectData()\n\tgo db.streamLogs()\n\n\thttp.HandleFunc(\"/\", db.webHandler)\n\thttp.Handle(\"/api\", websocket.Handler(db.apiHandler))\n\n\tlistener, err := net.Listen(\"tcp\", fmt.Sprintf(\"%s:%d\", db.config.Host, db.config.Port))\n\tif err != nil {\n\t\treturn err\n\t}\n\tdb.listener = listener\n\n\tgo http.Serve(listener, nil)\n\n\treturn nil\n}\n\n// Stop stops the data collection thread and the connection listener of the dashboard.\n// Implements the node.Service interface.\nfunc (db *Dashboard) Stop() error {\n\t// Close the connection listener.\n\tvar errs []error\n\tif err := db.listener.Close(); err != nil {\n\t\terrs = append(errs, err)\n\t}\n\t// Close the collectors.\n\terrc := make(chan error, 1)\n\tfor i := 0; i < 2; i++ {\n\t\tdb.quit <- errc\n\t\tif err := <-errc; err != nil {\n\t\t\terrs = append(errs, err)\n\t\t}\n\t}\n\t// Close the connections.\n\tdb.lock.Lock()\n\tfor _, c := range db.conns {\n\t\tif err := c.conn.Close(); err != nil {\n\t\t\tc.logger.Warn(\"Failed to close connection\", \"err\", err)\n\t\t}\n\t}\n\tdb.lock.Unlock()\n\n\t// Wait until every goroutine terminates.\n\tdb.wg.Wait()\n\tlog.Info(\"Dashboard stopped\")\n\n\tvar err error\n\tif len(errs) > 0 {\n\t\terr = fmt.Errorf(\"%v\", errs)\n\t}\n\n\treturn err\n}\n\n// webHandler handles all non-api requests, simply flattening and returning the dashboard website.\nfunc (db *Dashboard) webHandler(w http.ResponseWriter, r *http.Request) {\n\tlog.Debug(\"Request\", \"URL\", r.URL)\n\n\tpath := r.URL.String()\n\tif path == \"/\" {\n\t\tpath = \"/index.html\"\n\t}\n\tblob, err := Asset(path[1:])\n\tif err != nil {\n\t\tlog.Warn(\"Failed to load the asset\", \"path\", path, \"err\", err)\n\t\thttp.Error(w, \"not found\", http.StatusNotFound)\n\t\treturn\n\t}\n\tw.Write(blob)\n}\n\n// apiHandler handles requests for the dashboard.\nfunc (db *Dashboard) apiHandler(conn *websocket.Conn) {\n\tid := atomic.AddUint32(&nextID, 1)\n\tclient := &client{\n\t\tconn:   conn,\n\t\tmsg:    make(chan *Message, 128),\n\t\tlogger: log.New(\"id\", id),\n\t}\n\tdone := make(chan struct{})\n\n\t// Start listening for messages to send.\n\tdb.wg.Add(1)\n\tgo func() {\n\t\tdefer db.wg.Done()\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-done:\n\t\t\t\treturn\n\t\t\tcase msg := <-client.msg:\n\t\t\t\tif err := websocket.JSON.Send(client.conn, msg); err != nil {\n\t\t\t\t\tclient.logger.Warn(\"Failed to send the message\", \"msg\", msg, \"err\", err)\n\t\t\t\t\tclient.conn.Close()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\tdb.lock.Lock()\n\t// Send the past data.\n\tclient.msg <- deepcopy.Copy(db.history).(*Message)\n\t// Start tracking the connection and drop at connection loss.\n\tdb.conns[id] = client\n\tdb.lock.Unlock()\n\tdefer func() {\n\t\tdb.lock.Lock()\n\t\tdelete(db.conns, id)\n\t\tdb.lock.Unlock()\n\t}()\n\tfor {\n\t\tr := new(Request)\n\t\tif err := websocket.JSON.Receive(conn, r); err != nil {\n\t\t\tif err != io.EOF {\n\t\t\t\tclient.logger.Warn(\"Failed to receive request\", \"err\", err)\n\t\t\t}\n\t\t\tclose(done)\n\t\t\treturn\n\t\t}\n\t\tif r.Logs != nil {\n\t\t\tdb.handleLogRequest(r.Logs, client)\n\t\t}\n\t}\n}\n\n// meterCollector returns a function, which retrieves a specific meter.\nfunc meterCollector(name string) func() int64 {\n\tif metric := metrics.DefaultRegistry.Get(name); metric != nil {\n\t\tm := metric.(metrics.Meter)\n\t\treturn func() int64 {\n\t\t\treturn m.Count()\n\t\t}\n\t}\n\treturn func() int64 {\n\t\treturn 0\n\t}\n}\n\n// collectData collects the required data to plot on the dashboard.\nfunc (db *Dashboard) collectData() {\n\tdefer db.wg.Done()\n\n\tsystemCPUUsage := gosigar.Cpu{}\n\tsystemCPUUsage.Get()\n\tvar (\n\t\tmem runtime.MemStats\n\n\t\tcollectNetworkIngress = meterCollector(\"p2p/InboundTraffic\")\n\t\tcollectNetworkEgress  = meterCollector(\"p2p/OutboundTraffic\")\n\t\tcollectDiskRead       = meterCollector(\"sero/db/chaindata/disk/read\")\n\t\tcollectDiskWrite      = meterCollector(\"sero/db/chaindata/disk/write\")\n\n\t\tprevNetworkIngress = collectNetworkIngress()\n\t\tprevNetworkEgress  = collectNetworkEgress()\n\t\tprevProcessCPUTime = getProcessCPUTime()\n\t\tprevSystemCPUUsage = systemCPUUsage\n\t\tprevDiskRead       = collectDiskRead()\n\t\tprevDiskWrite      = collectDiskWrite()\n\n\t\tfrequency = float64(db.config.Refresh / time.Second)\n\t\tnumCPU    = float64(runtime.NumCPU())\n\t)\n\n\tfor {\n\t\tselect {\n\t\tcase errc := <-db.quit:\n\t\t\terrc <- nil\n\t\t\treturn\n\t\tcase <-time.After(db.config.Refresh):\n\t\t\tsystemCPUUsage.Get()\n\t\t\tvar (\n\t\t\t\tcurNetworkIngress = collectNetworkIngress()\n\t\t\t\tcurNetworkEgress  = collectNetworkEgress()\n\t\t\t\tcurProcessCPUTime = getProcessCPUTime()\n\t\t\t\tcurSystemCPUUsage = systemCPUUsage\n\t\t\t\tcurDiskRead       = collectDiskRead()\n\t\t\t\tcurDiskWrite      = collectDiskWrite()\n\n\t\t\t\tdeltaNetworkIngress = float64(curNetworkIngress - prevNetworkIngress)\n\t\t\t\tdeltaNetworkEgress  = float64(curNetworkEgress - prevNetworkEgress)\n\t\t\t\tdeltaProcessCPUTime = curProcessCPUTime - prevProcessCPUTime\n\t\t\t\tdeltaSystemCPUUsage = curSystemCPUUsage.Delta(prevSystemCPUUsage)\n\t\t\t\tdeltaDiskRead       = curDiskRead - prevDiskRead\n\t\t\t\tdeltaDiskWrite      = curDiskWrite - prevDiskWrite\n\t\t\t)\n\t\t\tprevNetworkIngress = curNetworkIngress\n\t\t\tprevNetworkEgress = curNetworkEgress\n\t\t\tprevProcessCPUTime = curProcessCPUTime\n\t\t\tprevSystemCPUUsage = curSystemCPUUsage\n\t\t\tprevDiskRead = curDiskRead\n\t\t\tprevDiskWrite = curDiskWrite\n\n\t\t\tnow := time.Now()\n\n\t\t\truntime.ReadMemStats(&mem)\n\t\t\tactiveMemory := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: float64(mem.Alloc) / frequency,\n\t\t\t}\n\t\t\tvirtualMemory := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: float64(mem.Sys) / frequency,\n\t\t\t}\n\t\t\tnetworkIngress := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: deltaNetworkIngress / frequency,\n\t\t\t}\n\t\t\tnetworkEgress := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: deltaNetworkEgress / frequency,\n\t\t\t}\n\t\t\tprocessCPU := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: deltaProcessCPUTime / frequency / numCPU * 100,\n\t\t\t}\n\t\t\tsystemCPU := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: float64(deltaSystemCPUUsage.Sys+deltaSystemCPUUsage.User) / frequency / numCPU,\n\t\t\t}\n\t\t\tdiskRead := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: float64(deltaDiskRead) / frequency,\n\t\t\t}\n\t\t\tdiskWrite := &ChartEntry{\n\t\t\t\tTime:  now,\n\t\t\t\tValue: float64(deltaDiskWrite) / frequency,\n\t\t\t}\n\t\t\tsys := db.history.System\n\t\t\tdb.lock.Lock()\n\t\t\tsys.ActiveMemory = append(sys.ActiveMemory[1:], activeMemory)\n\t\t\tsys.VirtualMemory = append(sys.VirtualMemory[1:], virtualMemory)\n\t\t\tsys.NetworkIngress = append(sys.NetworkIngress[1:], networkIngress)\n\t\t\tsys.NetworkEgress = append(sys.NetworkEgress[1:], networkEgress)\n\t\t\tsys.ProcessCPU = append(sys.ProcessCPU[1:], processCPU)\n\t\t\tsys.SystemCPU = append(sys.SystemCPU[1:], systemCPU)\n\t\t\tsys.DiskRead = append(sys.DiskRead[1:], diskRead)\n\t\t\tsys.DiskWrite = append(sys.DiskWrite[1:], diskWrite)\n\t\t\tdb.lock.Unlock()\n\n\t\t\tdb.sendToAll(&Message{\n\t\t\t\tSystem: &SystemMessage{\n\t\t\t\t\tActiveMemory:   ChartEntries{activeMemory},\n\t\t\t\t\tVirtualMemory:  ChartEntries{virtualMemory},\n\t\t\t\t\tNetworkIngress: ChartEntries{networkIngress},\n\t\t\t\t\tNetworkEgress:  ChartEntries{networkEgress},\n\t\t\t\t\tProcessCPU:     ChartEntries{processCPU},\n\t\t\t\t\tSystemCPU:      ChartEntries{systemCPU},\n\t\t\t\t\tDiskRead:       ChartEntries{diskRead},\n\t\t\t\t\tDiskWrite:      ChartEntries{diskWrite},\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n\n// sendToAll sends the given message to the active dashboards.\nfunc (db *Dashboard) sendToAll(msg *Message) {\n\tdb.lock.Lock()\n\tfor _, c := range db.conns {\n\t\tselect {\n\t\tcase c.msg <- msg:\n\t\tdefault:\n\t\t\tc.conn.Close()\n\t\t}\n\t}\n\tdb.lock.Unlock()\n}\n"
  },
  {
    "path": "dashboard/log.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage dashboard\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/mohae/deepcopy\"\n\t\"github.com/rjeczalik/notify\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nvar emptyChunk = json.RawMessage(\"[]\")\n\n// prepLogs creates a JSON array from the given log record buffer.\n// Returns the prepared array and the position of the last '\\n'\n// character in the original buffer, or -1 if it doesn't contain any.\nfunc prepLogs(buf []byte) (json.RawMessage, int) {\n\tb := make(json.RawMessage, 1, len(buf)+1)\n\tb[0] = '['\n\tb = append(b, buf...)\n\tlast := -1\n\tfor i := 1; i < len(b); i++ {\n\t\tif b[i] == '\\n' {\n\t\t\tb[i] = ','\n\t\t\tlast = i\n\t\t}\n\t}\n\tif last < 0 {\n\t\treturn emptyChunk, -1\n\t}\n\tb[last] = ']'\n\treturn b[:last+1], last - 1\n}\n\n// handleLogRequest searches for the log file specified by the timestamp of the\n// request, creates a JSON array out of it and sends it to the requesting client.\nfunc (db *Dashboard) handleLogRequest(r *LogsRequest, c *client) {\n\tfiles, err := ioutil.ReadDir(db.logdir)\n\tif err != nil {\n\t\tlog.Warn(\"Failed to open logdir\", \"path\", db.logdir, \"err\", err)\n\t\treturn\n\t}\n\tre := regexp.MustCompile(`\\.log$`)\n\tfileNames := make([]string, 0, len(files))\n\tfor _, f := range files {\n\t\tif f.Mode().IsRegular() && re.MatchString(f.Name()) {\n\t\t\tfileNames = append(fileNames, f.Name())\n\t\t}\n\t}\n\tif len(fileNames) < 1 {\n\t\tlog.Warn(\"No log files in logdir\", \"path\", db.logdir)\n\t\treturn\n\t}\n\tidx := sort.Search(len(fileNames), func(idx int) bool {\n\t\t// Returns the smallest index such as fileNames[idx] >= r.Name,\n\t\t// if there is no such index, returns n.\n\t\treturn fileNames[idx] >= r.Name\n\t})\n\n\tswitch {\n\tcase idx < 0:\n\t\treturn\n\tcase idx == 0 && r.Past:\n\t\treturn\n\tcase idx >= len(fileNames):\n\t\treturn\n\tcase r.Past:\n\t\tidx--\n\tcase idx == len(fileNames)-1 && fileNames[idx] == r.Name:\n\t\treturn\n\tcase idx == len(fileNames)-1 || (idx == len(fileNames)-2 && fileNames[idx] == r.Name):\n\t\t// The last file is continuously updated, and its chunks are streamed,\n\t\t// so in order to avoid log record duplication on the client side, it is\n\t\t// handled differently. Its actual content is always saved in the history.\n\t\tdb.lock.Lock()\n\t\tif db.history.Logs != nil {\n\t\t\tc.msg <- &Message{\n\t\t\t\tLogs: db.history.Logs,\n\t\t\t}\n\t\t}\n\t\tdb.lock.Unlock()\n\t\treturn\n\tcase fileNames[idx] == r.Name:\n\t\tidx++\n\t}\n\n\tpath := filepath.Join(db.logdir, fileNames[idx])\n\tvar buf []byte\n\tif buf, err = ioutil.ReadFile(path); err != nil {\n\t\tlog.Warn(\"Failed to read file\", \"path\", path, \"err\", err)\n\t\treturn\n\t}\n\tchunk, end := prepLogs(buf)\n\tif end < 0 {\n\t\tlog.Warn(\"The file doesn't contain valid logs\", \"path\", path)\n\t\treturn\n\t}\n\tc.msg <- &Message{\n\t\tLogs: &LogsMessage{\n\t\t\tSource: &LogFile{\n\t\t\t\tName: fileNames[idx],\n\t\t\t\tLast: r.Past && idx == 0,\n\t\t\t},\n\t\t\tChunk: chunk,\n\t\t},\n\t}\n}\n\n// streamLogs watches the file system, and when the logger writes\n// the new log records into the files, picks them up, then makes\n// JSON array out of them and sends them to the clients.\nfunc (db *Dashboard) streamLogs() {\n\tdefer db.wg.Done()\n\tvar (\n\t\terr  error\n\t\terrc chan error\n\t)\n\tdefer func() {\n\t\tif errc == nil {\n\t\t\terrc = <-db.quit\n\t\t}\n\t\terrc <- err\n\t}()\n\n\tfiles, err := ioutil.ReadDir(db.logdir)\n\tif err != nil {\n\t\tlog.Warn(\"Failed to open logdir\", \"path\", db.logdir, \"err\", err)\n\t\treturn\n\t}\n\tvar (\n\t\topened *os.File // File descriptor for the opened active log file.\n\t\tbuf    []byte   // Contains the recently written log chunks, which are not sent to the clients yet.\n\t)\n\n\t// The log records are always written into the last file in alphabetical order, because of the timestamp.\n\tre := regexp.MustCompile(`\\.log$`)\n\ti := len(files) - 1\n\tfor i >= 0 && (!files[i].Mode().IsRegular() || !re.MatchString(files[i].Name())) {\n\t\ti--\n\t}\n\tif i < 0 {\n\t\tlog.Warn(\"No log files in logdir\", \"path\", db.logdir)\n\t\treturn\n\t}\n\tif opened, err = os.OpenFile(filepath.Join(db.logdir, files[i].Name()), os.O_RDONLY, 0600); err != nil {\n\t\tlog.Warn(\"Failed to open file\", \"name\", files[i].Name(), \"err\", err)\n\t\treturn\n\t}\n\tdefer opened.Close() // Close the lastly opened file.\n\tfi, err := opened.Stat()\n\tif err != nil {\n\t\tlog.Warn(\"Problem with file\", \"name\", opened.Name(), \"err\", err)\n\t\treturn\n\t}\n\tdb.lock.Lock()\n\tdb.history.Logs = &LogsMessage{\n\t\tSource: &LogFile{\n\t\t\tName: fi.Name(),\n\t\t\tLast: true,\n\t\t},\n\t\tChunk: emptyChunk,\n\t}\n\tdb.lock.Unlock()\n\n\twatcher := make(chan notify.EventInfo, 10)\n\tif err := notify.Watch(db.logdir, watcher, notify.Create); err != nil {\n\t\tlog.Warn(\"Failed to create file system watcher\", \"err\", err)\n\t\treturn\n\t}\n\tdefer notify.Stop(watcher)\n\n\tticker := time.NewTicker(db.config.Refresh)\n\tdefer ticker.Stop()\n\nloop:\n\tfor err == nil || errc == nil {\n\t\tselect {\n\t\tcase event := <-watcher:\n\t\t\t// Make sure that new log file was created.\n\t\t\tif !re.Match([]byte(event.Path())) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif opened == nil {\n\t\t\t\tlog.Warn(\"The last log file is not opened\")\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\t// The new log file's name is always greater,\n\t\t\t// because it is created using the actual log record's time.\n\t\t\tif opened.Name() >= event.Path() {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Read the rest of the previously opened file.\n\t\t\tchunk, err := ioutil.ReadAll(opened)\n\t\t\tif err != nil {\n\t\t\t\tlog.Warn(\"Failed to read file\", \"name\", opened.Name(), \"err\", err)\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tbuf = append(buf, chunk...)\n\t\t\topened.Close()\n\n\t\t\tif chunk, last := prepLogs(buf); last >= 0 {\n\t\t\t\t// Send the rest of the previously opened file.\n\t\t\t\tdb.sendToAll(&Message{\n\t\t\t\t\tLogs: &LogsMessage{\n\t\t\t\t\t\tChunk: chunk,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}\n\t\t\tif opened, err = os.OpenFile(event.Path(), os.O_RDONLY, 0600); err != nil {\n\t\t\t\tlog.Warn(\"Failed to open file\", \"name\", event.Path(), \"err\", err)\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tbuf = buf[:0]\n\n\t\t\t// Change the last file in the history.\n\t\t\tfi, err := opened.Stat()\n\t\t\tif err != nil {\n\t\t\t\tlog.Warn(\"Problem with file\", \"name\", opened.Name(), \"err\", err)\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tdb.lock.Lock()\n\t\t\tdb.history.Logs.Source.Name = fi.Name()\n\t\t\tdb.history.Logs.Chunk = emptyChunk\n\t\t\tdb.lock.Unlock()\n\t\tcase <-ticker.C: // Send log updates to the client.\n\t\t\tif opened == nil {\n\t\t\t\tlog.Warn(\"The last log file is not opened\")\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\t// Read the new logs created since the last read.\n\t\t\tchunk, err := ioutil.ReadAll(opened)\n\t\t\tif err != nil {\n\t\t\t\tlog.Warn(\"Failed to read file\", \"name\", opened.Name(), \"err\", err)\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tb := append(buf, chunk...)\n\n\t\t\tchunk, last := prepLogs(b)\n\t\t\tif last < 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Only keep the invalid part of the buffer, which can be valid after the next read.\n\t\t\tbuf = b[last+1:]\n\n\t\t\tvar l *LogsMessage\n\t\t\t// Update the history.\n\t\t\tdb.lock.Lock()\n\t\t\tif bytes.Equal(db.history.Logs.Chunk, emptyChunk) {\n\t\t\t\tdb.history.Logs.Chunk = chunk\n\t\t\t\tl = deepcopy.Copy(db.history.Logs).(*LogsMessage)\n\t\t\t} else {\n\t\t\t\tb = make([]byte, len(db.history.Logs.Chunk)+len(chunk)-1)\n\t\t\t\tcopy(b, db.history.Logs.Chunk)\n\t\t\t\tb[len(db.history.Logs.Chunk)-1] = ','\n\t\t\t\tcopy(b[len(db.history.Logs.Chunk):], chunk[1:])\n\t\t\t\tdb.history.Logs.Chunk = b\n\t\t\t\tl = &LogsMessage{Chunk: chunk}\n\t\t\t}\n\t\t\tdb.lock.Unlock()\n\n\t\t\tdb.sendToAll(&Message{Logs: l})\n\t\tcase errc = <-db.quit:\n\t\t\tbreak loop\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "dashboard/message.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage dashboard\n\nimport (\n\t\"encoding/json\"\n\t\"time\"\n)\n\ntype Message struct {\n\tGeneral *GeneralMessage `json:\"general,omitempty\"`\n\tHome    *HomeMessage    `json:\"home,omitempty\"`\n\tChain   *ChainMessage   `json:\"chain,omitempty\"`\n\tTxPool  *TxPoolMessage  `json:\"txpool,omitempty\"`\n\tNetwork *NetworkMessage `json:\"network,omitempty\"`\n\tSystem  *SystemMessage  `json:\"system,omitempty\"`\n\tLogs    *LogsMessage    `json:\"logs,omitempty\"`\n}\n\ntype ChartEntries []*ChartEntry\n\ntype ChartEntry struct {\n\tTime  time.Time `json:\"time,omitempty\"`\n\tValue float64   `json:\"value,omitempty\"`\n}\n\ntype GeneralMessage struct {\n\tVersion string `json:\"version,omitempty\"`\n\tCommit  string `json:\"commit,omitempty\"`\n}\n\ntype HomeMessage struct {\n\t/* TODO (kurkomisi) */\n}\n\ntype ChainMessage struct {\n\t/* TODO (kurkomisi) */\n}\n\ntype TxPoolMessage struct {\n\t/* TODO (kurkomisi) */\n}\n\ntype NetworkMessage struct {\n\t/* TODO (kurkomisi) */\n}\n\ntype SystemMessage struct {\n\tActiveMemory   ChartEntries `json:\"activeMemory,omitempty\"`\n\tVirtualMemory  ChartEntries `json:\"virtualMemory,omitempty\"`\n\tNetworkIngress ChartEntries `json:\"networkIngress,omitempty\"`\n\tNetworkEgress  ChartEntries `json:\"networkEgress,omitempty\"`\n\tProcessCPU     ChartEntries `json:\"processCPU,omitempty\"`\n\tSystemCPU      ChartEntries `json:\"systemCPU,omitempty\"`\n\tDiskRead       ChartEntries `json:\"diskRead,omitempty\"`\n\tDiskWrite      ChartEntries `json:\"diskWrite,omitempty\"`\n}\n\n// LogsMessage wraps up a log chunk. If Source isn't present, the chunk is a stream chunk.\ntype LogsMessage struct {\n\tSource *LogFile        `json:\"source,omitempty\"` // Attributes of the log file.\n\tChunk  json.RawMessage `json:\"chunk\"`            // Contains log records.\n}\n\n// LogFile contains the attributes of a log file.\ntype LogFile struct {\n\tName string `json:\"name\"` // The name of the file.\n\tLast bool   `json:\"last\"` // Denotes if the actual log file is the last one in the directory.\n}\n\n// Request represents the client request.\ntype Request struct {\n\tLogs *LogsRequest `json:\"logs,omitempty\"`\n}\n\ntype LogsRequest struct {\n\tName string `json:\"name\"` // The request handler searches for log file based on this file name.\n\tPast bool   `json:\"past\"` // Denotes whether the client wants the previous or the next file.\n}\n"
  },
  {
    "path": "event/event.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package event deals with subscriptions to real-time events.\npackage event\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sync\"\n\t\"time\"\n)\n\n// TypeMuxEvent is a time-tagged notification pushed to subscribers.\ntype TypeMuxEvent struct {\n\tTime time.Time\n\tData interface{}\n}\n\n// A TypeMux dispatches events to registered receivers. Receivers can be\n// registered to handle events of certain type. Any operation\n// called after mux is stopped will return ErrMuxClosed.\n//\n// The zero value is ready to use.\n//\n// Deprecated: use Feed\ntype TypeMux struct {\n\tmutex   sync.RWMutex\n\tsubm    map[reflect.Type][]*TypeMuxSubscription\n\tstopped bool\n}\n\n// ErrMuxClosed is returned when Posting on a closed TypeMux.\nvar ErrMuxClosed = errors.New(\"event: mux closed\")\n\n// Subscribe creates a subscription for events of the given types. The\n// subscription's channel is closed when it is unsubscribed\n// or the mux is closed.\nfunc (mux *TypeMux) Subscribe(types ...interface{}) *TypeMuxSubscription {\n\tsub := newsub(mux)\n\tmux.mutex.Lock()\n\tdefer mux.mutex.Unlock()\n\tif mux.stopped {\n\t\t// set the status to closed so that calling Unsubscribe after this\n\t\t// call will short circuit.\n\t\tsub.closed = true\n\t\tclose(sub.postC)\n\t} else {\n\t\tif mux.subm == nil {\n\t\t\tmux.subm = make(map[reflect.Type][]*TypeMuxSubscription)\n\t\t}\n\t\tfor _, t := range types {\n\t\t\trtyp := reflect.TypeOf(t)\n\t\t\toldsubs := mux.subm[rtyp]\n\t\t\tif find(oldsubs, sub) != -1 {\n\t\t\t\tpanic(fmt.Sprintf(\"event: duplicate type %s in Subscribe\", rtyp))\n\t\t\t}\n\t\t\tsubs := make([]*TypeMuxSubscription, len(oldsubs)+1)\n\t\t\tcopy(subs, oldsubs)\n\t\t\tsubs[len(oldsubs)] = sub\n\t\t\tmux.subm[rtyp] = subs\n\t\t}\n\t}\n\treturn sub\n}\n\n// Post sends an event to all receivers registered for the given type.\n// It returns ErrMuxClosed if the mux has been stopped.\nfunc (mux *TypeMux) Post(ev interface{}) error {\n\tevent := &TypeMuxEvent{\n\t\tTime: time.Now(),\n\t\tData: ev,\n\t}\n\trtyp := reflect.TypeOf(ev)\n\tmux.mutex.RLock()\n\tif mux.stopped {\n\t\tmux.mutex.RUnlock()\n\t\treturn ErrMuxClosed\n\t}\n\tsubs := mux.subm[rtyp]\n\tmux.mutex.RUnlock()\n\tfor _, sub := range subs {\n\t\tsub.deliver(event)\n\t}\n\treturn nil\n}\n\n// Stop closes a mux. The mux can no longer be used.\n// Future Post calls will fail with ErrMuxClosed.\n// Stop blocks until all current deliveries have finished.\nfunc (mux *TypeMux) Stop() {\n\tmux.mutex.Lock()\n\tfor _, subs := range mux.subm {\n\t\tfor _, sub := range subs {\n\t\t\tsub.closewait()\n\t\t}\n\t}\n\tmux.subm = nil\n\tmux.stopped = true\n\tmux.mutex.Unlock()\n}\n\nfunc (mux *TypeMux) del(s *TypeMuxSubscription) {\n\tmux.mutex.Lock()\n\tfor typ, subs := range mux.subm {\n\t\tif pos := find(subs, s); pos >= 0 {\n\t\t\tif len(subs) == 1 {\n\t\t\t\tdelete(mux.subm, typ)\n\t\t\t} else {\n\t\t\t\tmux.subm[typ] = posdelete(subs, pos)\n\t\t\t}\n\t\t}\n\t}\n\ts.mux.mutex.Unlock()\n}\n\nfunc find(slice []*TypeMuxSubscription, item *TypeMuxSubscription) int {\n\tfor i, v := range slice {\n\t\tif v == item {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\nfunc posdelete(slice []*TypeMuxSubscription, pos int) []*TypeMuxSubscription {\n\tnews := make([]*TypeMuxSubscription, len(slice)-1)\n\tcopy(news[:pos], slice[:pos])\n\tcopy(news[pos:], slice[pos+1:])\n\treturn news\n}\n\n// TypeMuxSubscription is a subscription established through TypeMux.\ntype TypeMuxSubscription struct {\n\tmux     *TypeMux\n\tcreated time.Time\n\tcloseMu sync.Mutex\n\tclosing chan struct{}\n\tclosed  bool\n\n\t// these two are the same channel. they are stored separately so\n\t// postC can be set to nil without affecting the return value of\n\t// Chan.\n\tpostMu sync.RWMutex\n\treadC  <-chan *TypeMuxEvent\n\tpostC  chan<- *TypeMuxEvent\n}\n\nfunc newsub(mux *TypeMux) *TypeMuxSubscription {\n\tc := make(chan *TypeMuxEvent)\n\treturn &TypeMuxSubscription{\n\t\tmux:     mux,\n\t\tcreated: time.Now(),\n\t\treadC:   c,\n\t\tpostC:   c,\n\t\tclosing: make(chan struct{}),\n\t}\n}\n\nfunc (s *TypeMuxSubscription) Chan() <-chan *TypeMuxEvent {\n\treturn s.readC\n}\n\nfunc (s *TypeMuxSubscription) Unsubscribe() {\n\ts.mux.del(s)\n\ts.closewait()\n}\n\nfunc (s *TypeMuxSubscription) Closed() bool {\n\ts.closeMu.Lock()\n\tdefer s.closeMu.Unlock()\n\treturn s.closed\n}\n\nfunc (s *TypeMuxSubscription) closewait() {\n\ts.closeMu.Lock()\n\tdefer s.closeMu.Unlock()\n\tif s.closed {\n\t\treturn\n\t}\n\tclose(s.closing)\n\ts.closed = true\n\n\ts.postMu.Lock()\n\tclose(s.postC)\n\ts.postC = nil\n\ts.postMu.Unlock()\n}\n\nfunc (s *TypeMuxSubscription) deliver(event *TypeMuxEvent) {\n\t// Short circuit delivery if stale event\n\tif s.created.After(event.Time) {\n\t\treturn\n\t}\n\t// Otherwise deliver the event\n\ts.postMu.RLock()\n\tdefer s.postMu.RUnlock()\n\n\tselect {\n\tcase s.postC <- event:\n\tcase <-s.closing:\n\t}\n}\n"
  },
  {
    "path": "event/feed.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage event\n\nimport (\n\t\"errors\"\n\t\"reflect\"\n\t\"sync\"\n)\n\nvar errBadChannel = errors.New(\"event: Subscribe argument does not have sendable channel type\")\n\n// Feed implements one-to-many subscriptions where the carrier of events is a channel.\n// Values sent to a Feed are delivered to all subscribed channels simultaneously.\n//\n// Feeds can only be used with a single type. The type is determined by the first Send or\n// Subscribe operation. Subsequent calls to these methods panic if the type does not\n// match.\n//\n// The zero value is ready to use.\ntype Feed struct {\n\tonce      sync.Once        // ensures that init only runs once\n\tsendLock  chan struct{}    // sendLock has a one-element buffer and is empty when held.It protects sendCases.\n\tremoveSub chan interface{} // interrupts Send\n\tsendCases caseList         // the active set of select cases used by Send\n\n\t// The inbox holds newly subscribed channels until they are added to sendCases.\n\tmu     sync.Mutex\n\tinbox  caseList\n\tetype  reflect.Type\n\tclosed bool\n}\n\n// This is the index of the first actual subscription channel in sendCases.\n// sendCases[0] is a SelectRecv case for the removeSub channel.\nconst firstSubSendCase = 1\n\ntype feedTypeError struct {\n\tgot, want reflect.Type\n\top        string\n}\n\nfunc (e feedTypeError) Error() string {\n\treturn \"event: wrong type in \" + e.op + \" got \" + e.got.String() + \", want \" + e.want.String()\n}\n\nfunc (f *Feed) init() {\n\tf.removeSub = make(chan interface{})\n\tf.sendLock = make(chan struct{}, 1)\n\tf.sendLock <- struct{}{}\n\tf.sendCases = caseList{{Chan: reflect.ValueOf(f.removeSub), Dir: reflect.SelectRecv}}\n}\n\n// Subscribe adds a channel to the feed. Future sends will be delivered on the channel\n// until the subscription is canceled. All channels added must have the same element type.\n//\n// The channel should have ample buffer space to avoid blocking other subscribers.\n// Slow subscribers are not dropped.\nfunc (f *Feed) Subscribe(channel interface{}) Subscription {\n\tf.once.Do(f.init)\n\n\tchanval := reflect.ValueOf(channel)\n\tchantyp := chanval.Type()\n\tif chantyp.Kind() != reflect.Chan || chantyp.ChanDir()&reflect.SendDir == 0 {\n\t\tpanic(errBadChannel)\n\t}\n\tsub := &feedSub{feed: f, channel: chanval, err: make(chan error, 1)}\n\n\tf.mu.Lock()\n\tdefer f.mu.Unlock()\n\tif !f.typecheck(chantyp.Elem()) {\n\t\tpanic(feedTypeError{op: \"Subscribe\", got: chantyp, want: reflect.ChanOf(reflect.SendDir, f.etype)})\n\t}\n\t// Add the select case to the inbox.\n\t// The next Send will add it to f.sendCases.\n\tcas := reflect.SelectCase{Dir: reflect.SelectSend, Chan: chanval}\n\tf.inbox = append(f.inbox, cas)\n\treturn sub\n}\n\n// note: callers must hold f.mu\nfunc (f *Feed) typecheck(typ reflect.Type) bool {\n\tif f.etype == nil {\n\t\tf.etype = typ\n\t\treturn true\n\t}\n\treturn f.etype == typ\n}\n\nfunc (f *Feed) remove(sub *feedSub) {\n\t// Delete from inbox first, which covers channels\n\t// that have not been added to f.sendCases yet.\n\tch := sub.channel.Interface()\n\tf.mu.Lock()\n\tindex := f.inbox.find(ch)\n\tif index != -1 {\n\t\tf.inbox = f.inbox.delete(index)\n\t\tf.mu.Unlock()\n\t\treturn\n\t}\n\tf.mu.Unlock()\n\n\tselect {\n\tcase f.removeSub <- ch:\n\t\t// Send will remove the channel from f.sendCases.\n\tcase <-f.sendLock:\n\t\t// No Send is in progress, delete the channel now that we have the send lock.\n\t\tf.sendCases = f.sendCases.delete(f.sendCases.find(ch))\n\t\tf.sendLock <- struct{}{}\n\t}\n}\n\n// Send delivers to all subscribed channels simultaneously.\n// It returns the number of subscribers that the value was sent to.\nfunc (f *Feed) Send(value interface{}) (nsent int) {\n\trvalue := reflect.ValueOf(value)\n\n\tf.once.Do(f.init)\n\t<-f.sendLock\n\n\t// Add new cases from the inbox after taking the send lock.\n\tf.mu.Lock()\n\tf.sendCases = append(f.sendCases, f.inbox...)\n\tf.inbox = nil\n\n\tif !f.typecheck(rvalue.Type()) {\n\t\tf.sendLock <- struct{}{}\n\t\tpanic(feedTypeError{op: \"Send\", got: rvalue.Type(), want: f.etype})\n\t}\n\tf.mu.Unlock()\n\n\t// Set the sent value on all channels.\n\tfor i := firstSubSendCase; i < len(f.sendCases); i++ {\n\t\tf.sendCases[i].Send = rvalue\n\t}\n\n\t// Send until all channels except removeSub have been chosen. 'cases' tracks a prefix\n\t// of sendCases. When a send succeeds, the corresponding case moves to the end of\n\t// 'cases' and it shrinks by one element.\n\tcases := f.sendCases\n\tfor {\n\t\t// Fast path: try sending without blocking before adding to the select set.\n\t\t// This should usually succeed if subscribers are fast enough and have free\n\t\t// buffer space.\n\t\tfor i := firstSubSendCase; i < len(cases); i++ {\n\t\t\tif cases[i].Chan.TrySend(rvalue) {\n\t\t\t\tnsent++\n\t\t\t\tcases = cases.deactivate(i)\n\t\t\t\ti--\n\t\t\t}\n\t\t}\n\t\tif len(cases) == firstSubSendCase {\n\t\t\tbreak\n\t\t}\n\t\t// Select on all the receivers, waiting for them to unblock.\n\t\tchosen, recv, _ := reflect.Select(cases)\n\t\tif chosen == 0 /* <-f.removeSub */ {\n\t\t\tindex := f.sendCases.find(recv.Interface())\n\t\t\tf.sendCases = f.sendCases.delete(index)\n\t\t\tif index >= 0 && index < len(cases) {\n\t\t\t\t// Shrink 'cases' too because the removed case was still active.\n\t\t\t\tcases = f.sendCases[:len(cases)-1]\n\t\t\t}\n\t\t} else {\n\t\t\tcases = cases.deactivate(chosen)\n\t\t\tnsent++\n\t\t}\n\t}\n\n\t// Forget about the sent value and hand off the send lock.\n\tfor i := firstSubSendCase; i < len(f.sendCases); i++ {\n\t\tf.sendCases[i].Send = reflect.Value{}\n\t}\n\tf.sendLock <- struct{}{}\n\treturn nsent\n}\n\ntype feedSub struct {\n\tfeed    *Feed\n\tchannel reflect.Value\n\terrOnce sync.Once\n\terr     chan error\n}\n\nfunc (sub *feedSub) Unsubscribe() {\n\tsub.errOnce.Do(func() {\n\t\tsub.feed.remove(sub)\n\t\tclose(sub.err)\n\t})\n}\n\nfunc (sub *feedSub) Err() <-chan error {\n\treturn sub.err\n}\n\ntype caseList []reflect.SelectCase\n\n// find returns the index of a case containing the given channel.\nfunc (cs caseList) find(channel interface{}) int {\n\tfor i, cas := range cs {\n\t\tif cas.Chan.Interface() == channel {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\n// delete removes the given case from cs.\nfunc (cs caseList) delete(index int) caseList {\n\treturn append(cs[:index], cs[index+1:]...)\n}\n\n// deactivate moves the case at index into the non-accessible portion of the cs slice.\nfunc (cs caseList) deactivate(index int) caseList {\n\tlast := len(cs) - 1\n\tcs[index], cs[last] = cs[last], cs[index]\n\treturn cs[:last]\n}\n\n// func (cs caseList) String() string {\n//     s := \"[\"\n//     for i, cas := range cs {\n//             if i != 0 {\n//                     s += \", \"\n//             }\n//             switch cas.Dir {\n//             case reflect.SelectSend:\n//                     s += fmt.Sprintf(\"%v<-\", cas.Chan.Interface())\n//             case reflect.SelectRecv:\n//                     s += fmt.Sprintf(\"<-%v\", cas.Chan.Interface())\n//             }\n//     }\n//     return s + \"]\"\n// }\n"
  },
  {
    "path": "event/filter/filter.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package filter implements event filters.\npackage filter\n\nimport \"reflect\"\n\ntype Filter interface {\n\tCompare(Filter) bool\n\tTrigger(data interface{})\n}\n\ntype FilterEvent struct {\n\tfilter Filter\n\tdata   interface{}\n}\n\ntype Filters struct {\n\tid       int\n\twatchers map[int]Filter\n\tch       chan FilterEvent\n\n\tquit chan struct{}\n}\n\nfunc New() *Filters {\n\treturn &Filters{\n\t\tch:       make(chan FilterEvent),\n\t\twatchers: make(map[int]Filter),\n\t\tquit:     make(chan struct{}),\n\t}\n}\n\nfunc (f *Filters) Start() {\n\tgo f.loop()\n}\n\nfunc (f *Filters) Stop() {\n\tclose(f.quit)\n}\n\nfunc (f *Filters) Notify(filter Filter, data interface{}) {\n\tf.ch <- FilterEvent{filter, data}\n}\n\nfunc (f *Filters) Install(watcher Filter) int {\n\tf.watchers[f.id] = watcher\n\tf.id++\n\n\treturn f.id - 1\n}\n\nfunc (f *Filters) Uninstall(id int) {\n\tdelete(f.watchers, id)\n}\n\nfunc (f *Filters) loop() {\nout:\n\tfor {\n\t\tselect {\n\t\tcase <-f.quit:\n\t\t\tbreak out\n\t\tcase event := <-f.ch:\n\t\t\tfor _, watcher := range f.watchers {\n\t\t\t\tif reflect.TypeOf(watcher) == reflect.TypeOf(event.filter) {\n\t\t\t\t\tif watcher.Compare(event.filter) {\n\t\t\t\t\t\twatcher.Trigger(event.data)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (f *Filters) Match(a, b Filter) bool {\n\treturn reflect.TypeOf(a) == reflect.TypeOf(b) && a.Compare(b)\n}\n\nfunc (f *Filters) Get(i int) Filter {\n\treturn f.watchers[i]\n}\n"
  },
  {
    "path": "event/filter/generic_filter.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage filter\n\ntype Generic struct {\n\tStr1, Str2, Str3 string\n\tData             map[string]struct{}\n\n\tFn func(data interface{})\n}\n\n// self = registered, f = incoming\nfunc (self Generic) Compare(f Filter) bool {\n\tvar strMatch, dataMatch = true, true\n\n\tfilter := f.(Generic)\n\tif (len(self.Str1) > 0 && filter.Str1 != self.Str1) ||\n\t\t(len(self.Str2) > 0 && filter.Str2 != self.Str2) ||\n\t\t(len(self.Str3) > 0 && filter.Str3 != self.Str3) {\n\t\tstrMatch = false\n\t}\n\n\tfor k := range self.Data {\n\t\tif _, ok := filter.Data[k]; !ok {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn strMatch && dataMatch\n}\n\nfunc (self Generic) Trigger(data interface{}) {\n\tself.Fn(data)\n}\n"
  },
  {
    "path": "event/subscription.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage event\n\nimport (\n\t\"context\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n)\n\n// Subscription represents a stream of events. The carrier of the events is typically a\n// channel, but isn't part of the interface.\n//\n// Subscriptions can fail while established. Failures are reported through an error\n// channel. It receives a value if there is an issue with the subscription (e.g. the\n// network connection delivering the events has been closed). Only one value will ever be\n// sent.\n//\n// The error channel is closed when the subscription ends successfully (i.e. when the\n// source of events is closed). It is also closed when Unsubscribe is called.\n//\n// The Unsubscribe method cancels the sending of events. You must call Unsubscribe in all\n// cases to ensure that resources related to the subscription are released. It can be\n// called any number of times.\ntype Subscription interface {\n\tErr() <-chan error // returns the error channel\n\tUnsubscribe()      // cancels sending of events, closing the error channel\n}\n\n// NewSubscription runs a producer function as a subscription in a new goroutine. The\n// channel given to the producer is closed when Unsubscribe is called. If fn returns an\n// error, it is sent on the subscription's error channel.\nfunc NewSubscription(producer func(<-chan struct{}) error) Subscription {\n\ts := &funcSub{unsub: make(chan struct{}), err: make(chan error, 1)}\n\tgo func() {\n\t\tdefer close(s.err)\n\t\terr := producer(s.unsub)\n\t\ts.mu.Lock()\n\t\tdefer s.mu.Unlock()\n\t\tif !s.unsubscribed {\n\t\t\tif err != nil {\n\t\t\t\ts.err <- err\n\t\t\t}\n\t\t\ts.unsubscribed = true\n\t\t}\n\t}()\n\treturn s\n}\n\ntype funcSub struct {\n\tunsub        chan struct{}\n\terr          chan error\n\tmu           sync.Mutex\n\tunsubscribed bool\n}\n\nfunc (s *funcSub) Unsubscribe() {\n\ts.mu.Lock()\n\tif s.unsubscribed {\n\t\ts.mu.Unlock()\n\t\treturn\n\t}\n\ts.unsubscribed = true\n\tclose(s.unsub)\n\ts.mu.Unlock()\n\t// Wait for producer shutdown.\n\t<-s.err\n}\n\nfunc (s *funcSub) Err() <-chan error {\n\treturn s.err\n}\n\n// Resubscribe calls fn repeatedly to keep a subscription established. When the\n// subscription is established, Resubscribe waits for it to fail and calls fn again. This\n// process repeats until Unsubscribe is called or the active subscription ends\n// successfully.\n//\n// Resubscribe applies backoff between calls to fn. The time between calls is adapted\n// based on the error rate, but will never exceed backoffMax.\nfunc Resubscribe(backoffMax time.Duration, fn ResubscribeFunc) Subscription {\n\ts := &resubscribeSub{\n\t\twaitTime:   backoffMax / 10,\n\t\tbackoffMax: backoffMax,\n\t\tfn:         fn,\n\t\terr:        make(chan error),\n\t\tunsub:      make(chan struct{}),\n\t}\n\tgo s.loop()\n\treturn s\n}\n\n// A ResubscribeFunc attempts to establish a subscription.\ntype ResubscribeFunc func(context.Context) (Subscription, error)\n\ntype resubscribeSub struct {\n\tfn                   ResubscribeFunc\n\terr                  chan error\n\tunsub                chan struct{}\n\tunsubOnce            sync.Once\n\tlastTry              mclock.AbsTime\n\twaitTime, backoffMax time.Duration\n}\n\nfunc (s *resubscribeSub) Unsubscribe() {\n\ts.unsubOnce.Do(func() {\n\t\ts.unsub <- struct{}{}\n\t\t<-s.err\n\t})\n}\n\nfunc (s *resubscribeSub) Err() <-chan error {\n\treturn s.err\n}\n\nfunc (s *resubscribeSub) loop() {\n\tdefer close(s.err)\n\tvar done bool\n\tfor !done {\n\t\tsub := s.subscribe()\n\t\tif sub == nil {\n\t\t\tbreak\n\t\t}\n\t\tdone = s.waitForError(sub)\n\t\tsub.Unsubscribe()\n\t}\n}\n\nfunc (s *resubscribeSub) subscribe() Subscription {\n\tsubscribed := make(chan error)\n\tvar sub Subscription\nretry:\n\tfor {\n\t\ts.lastTry = mclock.Now()\n\t\tctx, cancel := context.WithCancel(context.Background())\n\t\tgo func() {\n\t\t\trsub, err := s.fn(ctx)\n\t\t\tsub = rsub\n\t\t\tsubscribed <- err\n\t\t}()\n\t\tselect {\n\t\tcase err := <-subscribed:\n\t\t\tcancel()\n\t\t\tif err != nil {\n\t\t\t\t// Subscribing failed, wait before launching the next try.\n\t\t\t\tif s.backoffWait() {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tcontinue retry\n\t\t\t}\n\t\t\tif sub == nil {\n\t\t\t\tpanic(\"event: ResubscribeFunc returned nil subscription and no error\")\n\t\t\t}\n\t\t\treturn sub\n\t\tcase <-s.unsub:\n\t\t\tcancel()\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc (s *resubscribeSub) waitForError(sub Subscription) bool {\n\tdefer sub.Unsubscribe()\n\tselect {\n\tcase err := <-sub.Err():\n\t\treturn err == nil\n\tcase <-s.unsub:\n\t\treturn true\n\t}\n}\n\nfunc (s *resubscribeSub) backoffWait() bool {\n\tif time.Duration(mclock.Now()-s.lastTry) > s.backoffMax {\n\t\ts.waitTime = s.backoffMax / 10\n\t} else {\n\t\ts.waitTime *= 2\n\t\tif s.waitTime > s.backoffMax {\n\t\t\ts.waitTime = s.backoffMax\n\t\t}\n\t}\n\n\tt := time.NewTimer(s.waitTime)\n\tdefer t.Stop()\n\tselect {\n\tcase <-t.C:\n\t\treturn false\n\tcase <-s.unsub:\n\t\treturn true\n\t}\n}\n\n// SubscriptionScope provides a facility to unsubscribe multiple subscriptions at once.\n//\n// For code that handle more than one subscription, a scope can be used to conveniently\n// unsubscribe all of them with a single call. The example demonstrates a typical use in a\n// larger program.\n//\n// The zero value is ready to use.\ntype SubscriptionScope struct {\n\tmu     sync.Mutex\n\tsubs   map[*scopeSub]struct{}\n\tclosed bool\n}\n\ntype scopeSub struct {\n\tsc *SubscriptionScope\n\ts  Subscription\n}\n\n// Track starts tracking a subscription. If the scope is closed, Track returns nil. The\n// returned subscription is a wrapper. Unsubscribing the wrapper removes it from the\n// scope.\nfunc (sc *SubscriptionScope) Track(s Subscription) Subscription {\n\tsc.mu.Lock()\n\tdefer sc.mu.Unlock()\n\tif sc.closed {\n\t\treturn nil\n\t}\n\tif sc.subs == nil {\n\t\tsc.subs = make(map[*scopeSub]struct{})\n\t}\n\tss := &scopeSub{sc, s}\n\tsc.subs[ss] = struct{}{}\n\treturn ss\n}\n\n// Close calls Unsubscribe on all tracked subscriptions and prevents further additions to\n// the tracked set. Calls to Track after Close return nil.\nfunc (sc *SubscriptionScope) Close() {\n\tsc.mu.Lock()\n\tdefer sc.mu.Unlock()\n\tif sc.closed {\n\t\treturn\n\t}\n\tsc.closed = true\n\tfor s := range sc.subs {\n\t\ts.s.Unsubscribe()\n\t}\n\tsc.subs = nil\n}\n\n// Count returns the number of tracked subscriptions.\n// It is meant to be used for debugging.\nfunc (sc *SubscriptionScope) Count() int {\n\tsc.mu.Lock()\n\tdefer sc.mu.Unlock()\n\treturn len(sc.subs)\n}\n\nfunc (s *scopeSub) Unsubscribe() {\n\ts.s.Unsubscribe()\n\ts.sc.mu.Lock()\n\tdefer s.sc.mu.Unlock()\n\tdelete(s.sc.subs, s)\n}\n\nfunc (s *scopeSub) Err() <-chan error {\n\treturn s.s.Err()\n}\n"
  },
  {
    "path": "interfaces.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package ethereum defines interfaces for interacting with Ethereum.\npackage sero\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\n// NotFound is returned by API methods if the requested item does not exist.\nvar NotFound = errors.New(\"not found\")\n\n// TODO: move subscription to package event\n\n// Subscription represents an event subscription where events are\n// delivered on a data channel.\ntype Subscription interface {\n\t// Unsubscribe cancels the sending of events to the data channel\n\t// and closes the error channel.\n\tUnsubscribe()\n\t// Err returns the subscription error channel. The error channel receives\n\t// a value if there is an issue with the subscription (e.g. the network connection\n\t// delivering the events has been closed). Only one value will ever be sent.\n\t// The error channel is closed by Unsubscribe.\n\tErr() <-chan error\n}\n\n// ChainReader provides access to the blockchain. The methods in this interface access raw\n// data from either the canonical chain (when requesting by block number) or any\n// blockchain fork that was previously downloaded and processed by the node. The block\n// number argument can be nil to select the latest canonical block. Reading block headers\n// should be preferred over full blocks whenever possible.\n//\n// The returned error is NotFound if the requested item does not exist.\ntype ChainReader interface {\n\tBlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error)\n\tBlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error)\n\tHeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error)\n\tHeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error)\n\tTransactionCount(ctx context.Context, blockHash common.Hash) (uint, error)\n\tTransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error)\n\n\t// This method subscribes to notifications about changes of the head block of\n\t// the canonical chain.\n\tSubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (Subscription, error)\n}\n\n// TransactionReader provides access to past transactions and their receipts.\n// Implementations may impose arbitrary restrictions on the transactions and receipts that\n// can be retrieved. Historic transactions may not be available.\n//\n// Avoid relying on this interface if possible. Contract logs (through the LogFilterer\n// interface) are more reliable and usually safer in the presence of chain\n// reorganisations.\n//\n// The returned error is NotFound if the requested item does not exist.\ntype TransactionReader interface {\n\t// TransactionByHash checks the pool of pending transactions in addition to the\n\t// blockchain. The isPending return value indicates whether the transaction has been\n\t// mined yet. Note that the transaction may not be part of the canonical chain even if\n\t// it's not pending.\n\tTransactionByHash(ctx context.Context, txHash common.Hash) (tx *types.Transaction, isPending bool, err error)\n\t// TransactionReceipt returns the receipt of a mined transaction. Note that the\n\t// transaction may not be included in the current canonical chain even if a receipt\n\t// exists.\n\tTransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error)\n}\n\n// ChainStateReader wraps access to the state trie of the canonical blockchain. Note that\n// implementations of the interface may be unable to return state values for old blocks.\n// In many cases, using CallContract can be preferable to reading raw contract storage.\ntype ChainStateReader interface {\n\tBalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error)\n\tStorageAt(ctx context.Context, account common.Address, key common.Hash, blockNumber *big.Int) ([]byte, error)\n\tCodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)\n\tNonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error)\n}\n\n// SyncProgress gives progress indications when the node is synchronising with\n// the Ethereum network.\ntype SyncProgress struct {\n\tStartingBlock uint64 // Block number where sync began\n\tCurrentBlock  uint64 // Current block number where sync is at\n\tHighestBlock  uint64 // Highest alleged block number in the chain\n\tPulledStates  uint64 // Number of state trie entries already downloaded\n\tKnownStates   uint64 // Total number of state trie entries known about\n}\n\n// ChainSyncReader wraps access to the node's current sync status. If there's no\n// sync currently running, it returns nil.\ntype ChainSyncReader interface {\n\tSyncProgress(ctx context.Context) (*SyncProgress, error)\n}\n\n// CallMsg contains parameters for contract calls.\ntype CallMsg struct {\n\tFrom     address.PKAddress\n\tFromPKr  *c_type.PKr     // the sender of the 'transaction'\n\tTo       *common.Address // the destination contract (nil for contract creation)\n\tGas      uint64          // if 0, the call executes with near-infinite gas\n\tGasPrice *big.Int        // wei <-> gas exchange ratio\n\tValue    *big.Int        // amount of wei sent along with the call\n\tData     []byte          // input data, usually an ABI-encoded contract method invocation\n\tCurrency string\n\tCategory string\n\tTkt      *common.Hash\n}\n\n// A ContractCaller provides contract calls, essentially transactions that are executed by\n// the EVM but not mined into the blockchain. ContractCall is a low-level method to\n// execute such calls. For applications which are structured around specific contracts,\n// the abigen tool provides a nicer, properly typed way to perform calls.\ntype ContractCaller interface {\n\tCallContract(ctx context.Context, call CallMsg, blockNumber *big.Int) ([]byte, error)\n}\n\n// FilterQuery contains options for contract log filtering.\ntype FilterQuery struct {\n\tBlockHash *common.Hash     // used by sero_getLogs, return logs only from block with this hash\n\tFromBlock *big.Int         // beginning of the queried range, nil means genesis block\n\tToBlock   *big.Int         // end of the range, nil means latest block\n\tAddresses []common.Address // restricts matches to events created by specific contracts\n\n\t// The Topic list restricts matches to particular event topics. Each event has a list\n\t// of topics. Topics matches a prefix of that list. An empty element slice matches any\n\t// topic. Non-empty elements represent an alternative that matches any of the\n\t// contained topics.\n\t//\n\t// Examples:\n\t// {} or nil          matches any topic list\n\t// {{A}}              matches topic A in first position\n\t// {{}, {B}}          matches any topic in first position, B in second position\n\t// {{A}, {B}}         matches topic A in first position, B in second position\n\t// {{A, B}}, {C, D}}  matches topic (A OR B) in first position, (C OR D) in second position\n\tTopics [][]common.Hash\n}\n\n// LogFilterer provides access to contract log events using a one-off query or continuous\n// event subscription.\n//\n// Logs received through a streaming query subscription may have Removed set to true,\n// indicating that the log was reverted due to a chain reorganisation.\ntype LogFilterer interface {\n\tFilterLogs(ctx context.Context, q FilterQuery) ([]types.Log, error)\n\tSubscribeFilterLogs(ctx context.Context, q FilterQuery, ch chan<- types.Log) (Subscription, error)\n}\n\n// TransactionSender wraps transaction sending. The SendTransaction method injects a\n// signed transaction into the pending transaction pool for execution. If the transaction\n// was a contract creation, the TransactionReceipt method can be used to retrieve the\n// contract address after the transaction has been mined.\n//\n// The transaction must be signed and have a valid nonce to be included. Consumers of the\n// API can use package accounts to maintain local private keys and need can retrieve the\n// next available nonce using PendingNonceAt.\ntype TransactionSender interface {\n\tCommitTx(ctx context.Context, arg *txtool.GTx) error\n}\n\n// GasPricer wraps the gas price oracle, which monitors the blockchain to determine the\n// optimal gas price given current fee market conditions.\ntype GasPricer interface {\n\tSuggestGasPrice(ctx context.Context) (*big.Int, error)\n}\n\n// A PendingStateReader provides access to the pending state, which is the result of all\n// known executable transactions which have not yet been included in the blockchain. It is\n// commonly used to display the result of ’unconfirmed’ actions (e.g. wallet value\n// transfers) initiated by the user. The PendingNonceAt operation is a good way to\n// retrieve the next available transaction nonce for a specific account.\ntype PendingStateReader interface {\n\tPendingBalanceAt(ctx context.Context, account common.Address) (*big.Int, error)\n\tPendingStorageAt(ctx context.Context, account common.Address, key common.Hash) ([]byte, error)\n\tPendingCodeAt(ctx context.Context, account common.Address) ([]byte, error)\n\tPendingNonceAt(ctx context.Context, account common.Address) (uint64, error)\n\tPendingTransactionCount(ctx context.Context) (uint, error)\n}\n\n// PendingContractCaller can be used to perform calls against the pending state.\ntype PendingContractCaller interface {\n\tPendingCallContract(ctx context.Context, call CallMsg) ([]byte, error)\n}\n\n// GasEstimator wraps EstimateGas, which tries to estimate the gas needed to execute a\n// specific transaction based on the pending state. There is no guarantee that this is the\n// true gas limit requirement as other transactions may be added or removed by miners, but\n// it should provide a basis for setting a reasonable default.\ntype GasEstimator interface {\n\tEstimateGas(ctx context.Context, call CallMsg) (uint64, error)\n}\n\n// A PendingStateEventer provides access to real time notifications about changes to the\n// pending state.\ntype PendingStateEventer interface {\n\tSubscribePendingTransactions(ctx context.Context, ch chan<- *types.Transaction) (Subscription, error)\n}\n"
  },
  {
    "path": "internal/build/archive.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage build\n\nimport (\n\t\"archive/tar\"\n\t\"archive/zip\"\n\t\"compress/gzip\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\ntype Archive interface {\n\t// Directory adds a new directory entry to the archive and sets the\n\t// directory for subsequent calls to Header.\n\tDirectory(name string) error\n\n\t// Header adds a new file to the archive. The file is added to the directory\n\t// set by Directory. The content of the file must be written to the returned\n\t// writer.\n\tHeader(os.FileInfo) (io.Writer, error)\n\n\t// Close flushes the archive and closes the underlying file.\n\tClose() error\n}\n\nfunc NewArchive(file *os.File) (Archive, string) {\n\tswitch {\n\tcase strings.HasSuffix(file.Name(), \".zip\"):\n\t\treturn NewZipArchive(file), strings.TrimSuffix(file.Name(), \".zip\")\n\tcase strings.HasSuffix(file.Name(), \".tar.gz\"):\n\t\treturn NewTarballArchive(file), strings.TrimSuffix(file.Name(), \".tar.gz\")\n\tdefault:\n\t\treturn nil, \"\"\n\t}\n}\n\n// AddFile appends an existing file to an archive.\nfunc AddFile(a Archive, file string) error {\n\tfd, err := os.Open(file)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer fd.Close()\n\tfi, err := fd.Stat()\n\tif err != nil {\n\t\treturn err\n\t}\n\tw, err := a.Header(fi)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err := io.Copy(w, fd); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// WriteArchive creates an archive containing the given files.\nfunc WriteArchive(name string, files []string) (err error) {\n\tarchfd, err := os.Create(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tdefer func() {\n\t\tarchfd.Close()\n\t\t// Remove the half-written archive on failure.\n\t\tif err != nil {\n\t\t\tos.Remove(name)\n\t\t}\n\t}()\n\tarchive, basename := NewArchive(archfd)\n\tif archive == nil {\n\t\treturn fmt.Errorf(\"unknown archive extension\")\n\t}\n\tfmt.Println(name)\n\tif err := archive.Directory(basename); err != nil {\n\t\treturn err\n\t}\n\tfor _, file := range files {\n\t\tfmt.Println(\"   +\", filepath.Base(file))\n\t\tif err := AddFile(archive, file); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn archive.Close()\n}\n\ntype ZipArchive struct {\n\tdir  string\n\tzipw *zip.Writer\n\tfile io.Closer\n}\n\nfunc NewZipArchive(w io.WriteCloser) Archive {\n\treturn &ZipArchive{\"\", zip.NewWriter(w), w}\n}\n\nfunc (a *ZipArchive) Directory(name string) error {\n\ta.dir = name + \"/\"\n\treturn nil\n}\n\nfunc (a *ZipArchive) Header(fi os.FileInfo) (io.Writer, error) {\n\thead, err := zip.FileInfoHeader(fi)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't make zip header: %v\", err)\n\t}\n\thead.Name = a.dir + head.Name\n\thead.Method = zip.Deflate\n\tw, err := a.zipw.CreateHeader(head)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't add zip header: %v\", err)\n\t}\n\treturn w, nil\n}\n\nfunc (a *ZipArchive) Close() error {\n\tif err := a.zipw.Close(); err != nil {\n\t\treturn err\n\t}\n\treturn a.file.Close()\n}\n\ntype TarballArchive struct {\n\tdir  string\n\ttarw *tar.Writer\n\tgzw  *gzip.Writer\n\tfile io.Closer\n}\n\nfunc NewTarballArchive(w io.WriteCloser) Archive {\n\tgzw := gzip.NewWriter(w)\n\ttarw := tar.NewWriter(gzw)\n\treturn &TarballArchive{\"\", tarw, gzw, w}\n}\n\nfunc (a *TarballArchive) Directory(name string) error {\n\ta.dir = name + \"/\"\n\treturn a.tarw.WriteHeader(&tar.Header{\n\t\tName:     a.dir,\n\t\tMode:     0755,\n\t\tTypeflag: tar.TypeDir,\n\t})\n}\n\nfunc (a *TarballArchive) Header(fi os.FileInfo) (io.Writer, error) {\n\thead, err := tar.FileInfoHeader(fi, \"\")\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"can't make tar header: %v\", err)\n\t}\n\thead.Name = a.dir + head.Name\n\tif err := a.tarw.WriteHeader(head); err != nil {\n\t\treturn nil, fmt.Errorf(\"can't add tar header: %v\", err)\n\t}\n\treturn a.tarw, nil\n}\n\nfunc (a *TarballArchive) Close() error {\n\tif err := a.tarw.Close(); err != nil {\n\t\treturn err\n\t}\n\tif err := a.gzw.Close(); err != nil {\n\t\treturn err\n\t}\n\treturn a.file.Close()\n}\n"
  },
  {
    "path": "internal/build/azure.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage build\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"github.com/Azure/azure-storage-blob-go/2018-03-28/azblob\"\n)\n\n// AzureBlobstoreConfig is an authentication and configuration struct containing\n// the data needed by the Azure SDK to interact with a speicifc container in the\n// blobstore.\ntype AzureBlobstoreConfig struct {\n\tAccount   string // Account name to authorize API requests with\n\tToken     string // Access token for the above account\n\tContainer string // Blob container to upload files into\n}\n\n// AzureBlobstoreUpload uploads a local file to the Azure Blob Storage. Note, this\n// method assumes a max file size of 64MB (Azure limitation). Larger files will\n// need a multi API call approach implemented.\n//\n// See: https://msdn.microsoft.com/en-us/library/azure/dd179451.aspx#Anchor_3\nfunc AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) error {\n\tif *DryRunFlag {\n\t\tfmt.Printf(\"would upload %q to %s/%s/%s\\n\", path, config.Account, config.Container, name)\n\t\treturn nil\n\t}\n\t// Create an authenticated client against the Azure cloud\n\tcredential := azblob.NewSharedKeyCredential(config.Account, config.Token)\n\tpipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{})\n\n\tu, _ := url.Parse(fmt.Sprintf(\"https://%s.blob.core.windows.net\", config.Account))\n\tservice := azblob.NewServiceURL(*u, pipeline)\n\n\tcontainer := service.NewContainerURL(config.Container)\n\tblockblob := container.NewBlockBlobURL(name)\n\n\t// Stream the file to upload into the designated blobstore container\n\tin, err := os.Open(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer in.Close()\n\n\t_, err = blockblob.Upload(context.Background(), in, azblob.BlobHTTPHeaders{}, azblob.Metadata{}, azblob.BlobAccessConditions{})\n\treturn err\n}\n\n// AzureBlobstoreList lists all the files contained within an azure blobstore.\nfunc AzureBlobstoreList(config AzureBlobstoreConfig) ([]azblob.BlobItem, error) {\n\tcredential := azblob.NewSharedKeyCredential(config.Account, config.Token)\n\tpipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{})\n\n\tu, _ := url.Parse(fmt.Sprintf(\"https://%s.blob.core.windows.net\", config.Account))\n\tservice := azblob.NewServiceURL(*u, pipeline)\n\n\t// List all the blobs from the container and return them\n\tcontainer := service.NewContainerURL(config.Container)\n\n\tres, err := container.ListBlobsFlatSegment(context.Background(), azblob.Marker{}, azblob.ListBlobsSegmentOptions{\n\t\tMaxResults: 1024 * 1024 * 1024, // Yes, fetch all of them\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn res.Segment.BlobItems, nil\n}\n\n// AzureBlobstoreDelete iterates over a list of files to delete and removes them\n// from the blobstore.\nfunc AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []azblob.BlobItem) error {\n\tif *DryRunFlag {\n\t\tfor _, blob := range blobs {\n\t\t\tfmt.Printf(\"would delete %s (%s) from %s/%s\\n\", blob.Name, blob.Properties.LastModified, config.Account, config.Container)\n\t\t}\n\t\treturn nil\n\t}\n\t// Create an authenticated client against the Azure cloud\n\tcredential := azblob.NewSharedKeyCredential(config.Account, config.Token)\n\tpipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{})\n\n\tu, _ := url.Parse(fmt.Sprintf(\"https://%s.blob.core.windows.net\", config.Account))\n\tservice := azblob.NewServiceURL(*u, pipeline)\n\n\tcontainer := service.NewContainerURL(config.Container)\n\n\t// Iterate over the blobs and delete them\n\tfor _, blob := range blobs {\n\t\tblockblob := container.NewBlockBlobURL(blob.Name)\n\t\tif _, err := blockblob.Delete(context.Background(), azblob.DeleteSnapshotsOptionInclude, azblob.BlobAccessConditions{}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/build/env.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage build\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\nvar (\n\t// These flags override values in build env.\n\tGitCommitFlag   = flag.String(\"git-commit\", \"\", `Overrides git commit hash embedded into executables`)\n\tGitBranchFlag   = flag.String(\"git-branch\", \"\", `Overrides git branch being built`)\n\tGitTagFlag      = flag.String(\"git-tag\", \"\", `Overrides git tag being built`)\n\tBuildnumFlag    = flag.String(\"buildnum\", \"\", `Overrides CI build number`)\n\tPullRequestFlag = flag.Bool(\"pull-request\", false, `Overrides pull request status of the build`)\n\tCronJobFlag     = flag.Bool(\"cron-job\", false, `Overrides cron job status of the build`)\n)\n\n// Environment contains metadata provided by the build environment.\ntype Environment struct {\n\tName                string // name of the environment\n\tRepo                string // name of GitHub repo\n\tCommit, Branch, Tag string // Git info\n\tBuildnum            string\n\tIsPullRequest       bool\n\tIsCronJob           bool\n}\n\nfunc (env Environment) String() string {\n\treturn fmt.Sprintf(\"%s env (commit:%s branch:%s tag:%s buildnum:%s pr:%t)\",\n\t\tenv.Name, env.Commit, env.Branch, env.Tag, env.Buildnum, env.IsPullRequest)\n}\n\n// Env returns metadata about the current CI environment, falling back to LocalEnv\n// if not running on CI.\nfunc Env() Environment {\n\tswitch {\n\tcase os.Getenv(\"CI\") == \"true\" && os.Getenv(\"TRAVIS\") == \"true\":\n\t\treturn Environment{\n\t\t\tName:          \"travis\",\n\t\t\tRepo:          os.Getenv(\"TRAVIS_REPO_SLUG\"),\n\t\t\tCommit:        os.Getenv(\"TRAVIS_COMMIT\"),\n\t\t\tBranch:        os.Getenv(\"TRAVIS_BRANCH\"),\n\t\t\tTag:           os.Getenv(\"TRAVIS_TAG\"),\n\t\t\tBuildnum:      os.Getenv(\"TRAVIS_BUILD_NUMBER\"),\n\t\t\tIsPullRequest: os.Getenv(\"TRAVIS_PULL_REQUEST\") != \"false\",\n\t\t\tIsCronJob:     os.Getenv(\"TRAVIS_EVENT_TYPE\") == \"cron\",\n\t\t}\n\tcase os.Getenv(\"CI\") == \"True\" && os.Getenv(\"APPVEYOR\") == \"True\":\n\t\treturn Environment{\n\t\t\tName:          \"appveyor\",\n\t\t\tRepo:          os.Getenv(\"APPVEYOR_REPO_NAME\"),\n\t\t\tCommit:        os.Getenv(\"APPVEYOR_REPO_COMMIT\"),\n\t\t\tBranch:        os.Getenv(\"APPVEYOR_REPO_BRANCH\"),\n\t\t\tTag:           os.Getenv(\"APPVEYOR_REPO_TAG_NAME\"),\n\t\t\tBuildnum:      os.Getenv(\"APPVEYOR_BUILD_NUMBER\"),\n\t\t\tIsPullRequest: os.Getenv(\"APPVEYOR_PULL_REQUEST_NUMBER\") != \"\",\n\t\t\tIsCronJob:     os.Getenv(\"APPVEYOR_SCHEDULED_BUILD\") == \"True\",\n\t\t}\n\tdefault:\n\t\treturn LocalEnv()\n\t}\n}\n\n// LocalEnv returns build environment metadata gathered from git.\nfunc LocalEnv() Environment {\n\tenv := applyEnvFlags(Environment{Name: \"local\", Repo: \"sero-cash/go-sero\"})\n\n\thead := readGitFile(\"HEAD\")\n\tif splits := strings.Split(head, \" \"); len(splits) == 2 {\n\t\thead = splits[1]\n\t} else {\n\t\treturn env\n\t}\n\tif env.Commit == \"\" {\n\t\tenv.Commit = readGitFile(head)\n\t}\n\tif env.Branch == \"\" {\n\t\tif head != \"HEAD\" {\n\t\t\tenv.Branch = strings.TrimPrefix(head, \"refs/heads/\")\n\t\t}\n\t}\n\tif info, err := os.Stat(\".git/objects\"); err == nil && info.IsDir() && env.Tag == \"\" {\n\t\tenv.Tag = firstLine(RunGit(\"tag\", \"-l\", \"--points-at\", \"HEAD\"))\n\t}\n\treturn env\n}\n\nfunc firstLine(s string) string {\n\treturn strings.Split(s, \"\\n\")[0]\n}\n\nfunc applyEnvFlags(env Environment) Environment {\n\tif !flag.Parsed() {\n\t\tpanic(\"you need to call flag.Parse before Env or LocalEnv\")\n\t}\n\tif *GitCommitFlag != \"\" {\n\t\tenv.Commit = *GitCommitFlag\n\t}\n\tif *GitBranchFlag != \"\" {\n\t\tenv.Branch = *GitBranchFlag\n\t}\n\tif *GitTagFlag != \"\" {\n\t\tenv.Tag = *GitTagFlag\n\t}\n\tif *BuildnumFlag != \"\" {\n\t\tenv.Buildnum = *BuildnumFlag\n\t}\n\tif *PullRequestFlag {\n\t\tenv.IsPullRequest = true\n\t}\n\tif *CronJobFlag {\n\t\tenv.IsCronJob = true\n\t}\n\treturn env\n}\n"
  },
  {
    "path": "internal/build/pgp.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// signFile reads the contents of an input file and signs it (in armored format)\n// with the key provided, placing the signature into the output file.\n\npackage build\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"golang.org/x/crypto/openpgp\"\n)\n\n// PGPSignFile parses a PGP private key from the specified string and creates a\n// signature file into the output parameter of the input file.\n//\n// Note, this method assumes a single key will be container in the pgpkey arg,\n// furthermore that it is in armored format.\nfunc PGPSignFile(input string, output string, pgpkey string) error {\n\t// Parse the keyring and make sure we only have a single private key in it\n\tkeys, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(pgpkey))\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(keys) != 1 {\n\t\treturn fmt.Errorf(\"key count mismatch: have %d, want %d\", len(keys), 1)\n\t}\n\t// Create the input and output streams for signing\n\tin, err := os.Open(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer in.Close()\n\n\tout, err := os.Create(output)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer out.Close()\n\n\t// Generate the signature and return\n\treturn openpgp.ArmoredDetachSign(out, keys[0], in, nil)\n}\n\n// PGPKeyID parses an armored key and returns the key ID.\nfunc PGPKeyID(pgpkey string) (string, error) {\n\tkeys, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(pgpkey))\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif len(keys) != 1 {\n\t\treturn \"\", fmt.Errorf(\"key count mismatch: have %d, want %d\", len(keys), 1)\n\t}\n\treturn keys[0].PrimaryKey.KeyIdString(), nil\n}\n"
  },
  {
    "path": "internal/build/util.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage build\n\nimport (\n\t\"bytes\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"text/template\"\n)\n\nvar DryRunFlag = flag.Bool(\"n\", false, \"dry run, don't execute commands\")\n\n// MustRun executes the given command and exits the host process for\n// any error.\nfunc MustRun(cmd *exec.Cmd) {\n\tfmt.Println(\">>>\", strings.Join(cmd.Args, \" \"))\n\tif !*DryRunFlag {\n\t\tcmd.Stderr = os.Stderr\n\t\tcmd.Stdout = os.Stdout\n\t\tif err := cmd.Run(); err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t}\n}\n\nfunc MustRunCommand(cmd string, args ...string) {\n\tMustRun(exec.Command(cmd, args...))\n}\n\n// GOPATH returns the value that the GOPATH environment\n// variable should be set to.\nfunc GOPATH() string {\n\tif os.Getenv(\"GOPATH\") == \"\" {\n\t\tlog.Fatal(\"GOPATH is not set\")\n\t}\n\treturn os.Getenv(\"GOPATH\")\n}\n\nvar warnedAboutGit bool\n\n// RunGit runs a git subcommand and returns its output.\n// The command must complete successfully.\nfunc RunGit(args ...string) string {\n\tcmd := exec.Command(\"git\", args...)\n\tvar stdout, stderr bytes.Buffer\n\tcmd.Stdout, cmd.Stderr = &stdout, &stderr\n\tif err := cmd.Run(); err == exec.ErrNotFound {\n\t\tif !warnedAboutGit {\n\t\t\tlog.Println(\"Warning: can't find 'git' in PATH\")\n\t\t\twarnedAboutGit = true\n\t\t}\n\t\treturn \"\"\n\t} else if err != nil {\n\t\tlog.Fatal(strings.Join(cmd.Args, \" \"), \": \", err, \"\\n\", stderr.String())\n\t}\n\treturn strings.TrimSpace(stdout.String())\n}\n\n// readGitFile returns content of file in .git directory.\nfunc readGitFile(file string) string {\n\tcontent, err := ioutil.ReadFile(path.Join(\".git\", file))\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn strings.TrimSpace(string(content))\n}\n\n// Render renders the given template file into outputFile.\nfunc Render(templateFile, outputFile string, outputPerm os.FileMode, x interface{}) {\n\ttpl := template.Must(template.ParseFiles(templateFile))\n\trender(tpl, outputFile, outputPerm, x)\n}\n\n// RenderString renders the given template string into outputFile.\nfunc RenderString(templateContent, outputFile string, outputPerm os.FileMode, x interface{}) {\n\ttpl := template.Must(template.New(\"\").Parse(templateContent))\n\trender(tpl, outputFile, outputPerm, x)\n}\n\nfunc render(tpl *template.Template, outputFile string, outputPerm os.FileMode, x interface{}) {\n\tif err := os.MkdirAll(filepath.Dir(outputFile), 0755); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tout, err := os.OpenFile(outputFile, os.O_CREATE|os.O_WRONLY|os.O_EXCL, outputPerm)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tif err := tpl.Execute(out, x); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tif err := out.Close(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\n// CopyFile copies a file.\nfunc CopyFile(dst, src string, mode os.FileMode) {\n\tif err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdestFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, mode)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer destFile.Close()\n\n\tsrcFile, err := os.Open(src)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer srcFile.Close()\n\n\tif _, err := io.Copy(destFile, srcFile); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\n// GoTool returns the command that runs a go tool. This uses go from GOROOT instead of PATH\n// so that go commands executed by build use the same version of Go as the 'host' that runs\n// build code. e.g.\n//\n//     /usr/lib/go-1.8/bin/go run build/ci.go ...\n//\n// runs using go 1.8 and invokes go 1.8 tools from the same GOROOT. This is also important\n// because runtime.Version checks on the host should match the tools that are run.\nfunc GoTool(tool string, args ...string) *exec.Cmd {\n\targs = append([]string{tool}, args...)\n\treturn exec.Command(filepath.Join(runtime.GOROOT(), \"bin\", \"go\"), args...)\n}\n\n// ExpandPackagesNoVendor expands a cmd/go import path pattern, skipping\n// vendored packages.\nfunc ExpandPackagesNoVendor(patterns []string) []string {\n\texpand := false\n\tfor _, pkg := range patterns {\n\t\tif strings.Contains(pkg, \"...\") {\n\t\t\texpand = true\n\t\t}\n\t}\n\tif expand {\n\t\tcmd := GoTool(\"list\", patterns...)\n\t\tout, err := cmd.CombinedOutput()\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"package listing failed: %v\\n%s\", err, string(out))\n\t\t}\n\t\tvar packages []string\n\t\tfor _, line := range strings.Split(string(out), \"\\n\") {\n\t\t\tif !strings.Contains(line, \"/vendor/\") {\n\t\t\t\tpackages = append(packages, strings.TrimSpace(line))\n\t\t\t}\n\t\t}\n\t\treturn packages\n\t}\n\treturn patterns\n}\n"
  },
  {
    "path": "internal/cmdtest/test_cmd.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage cmdtest\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"text/template\"\n\t\"time\"\n\n\t\"github.com/docker/docker/pkg/reexec\"\n)\n\nfunc NewTestCmd(t *testing.T, data interface{}) *TestCmd {\n\treturn &TestCmd{T: t, Data: data}\n}\n\ntype TestCmd struct {\n\t// For total convenience, all testing methods are available.\n\t*testing.T\n\n\tFunc    template.FuncMap\n\tData    interface{}\n\tCleanup func()\n\n\tcmd    *exec.Cmd\n\tstdout *bufio.Reader\n\tstdin  io.WriteCloser\n\tstderr *testlogger\n}\n\n// Run exec's the current binary using name as argv[0] which will trigger the\n// reexec init function for that name (e.g. \"gero-test\" in cmd/gero/run_test.go)\nfunc (tt *TestCmd) Run(name string, args ...string) {\n\ttt.stderr = &testlogger{t: tt.T}\n\ttt.cmd = &exec.Cmd{\n\t\tPath:   reexec.Self(),\n\t\tArgs:   append([]string{name}, args...),\n\t\tStderr: tt.stderr,\n\t}\n\tstdout, err := tt.cmd.StdoutPipe()\n\tif err != nil {\n\t\ttt.Fatal(err)\n\t}\n\ttt.stdout = bufio.NewReader(stdout)\n\tif tt.stdin, err = tt.cmd.StdinPipe(); err != nil {\n\t\ttt.Fatal(err)\n\t}\n\tif err := tt.cmd.Start(); err != nil {\n\t\ttt.Fatal(err)\n\t}\n}\n\n// InputLine writes the given text to the childs stdin.\n// This method can also be called from an expect template, e.g.:\n//\n//     gero.expect(`Passphrase: {{.InputLine \"password\"}}`)\nfunc (tt *TestCmd) InputLine(s string) string {\n\tio.WriteString(tt.stdin, s+\"\\n\")\n\treturn \"\"\n}\n\nfunc (tt *TestCmd) SetTemplateFunc(name string, fn interface{}) {\n\tif tt.Func == nil {\n\t\ttt.Func = make(map[string]interface{})\n\t}\n\ttt.Func[name] = fn\n}\n\n// Expect runs its argument as a template, then expects the\n// child process to output the result of the template within 5s.\n//\n// If the template starts with a newline, the newline is removed\n// before matching.\nfunc (tt *TestCmd) Expect(tplsource string) {\n\t// Generate the expected output by running the template.\n\ttpl := template.Must(template.New(\"\").Funcs(tt.Func).Parse(tplsource))\n\twantbuf := new(bytes.Buffer)\n\tif err := tpl.Execute(wantbuf, tt.Data); err != nil {\n\t\tpanic(err)\n\t}\n\t// Trim exactly one newline at the beginning. This makes tests look\n\t// much nicer because all expect strings are at column 0.\n\twant := bytes.TrimPrefix(wantbuf.Bytes(), []byte(\"\\n\"))\n\tif err := tt.matchExactOutput(want); err != nil {\n\t\ttt.Fatal(err)\n\t}\n\ttt.Logf(\"Matched stdout text:\\n%s\", want)\n}\n\nfunc (tt *TestCmd) matchExactOutput(want []byte) error {\n\tbuf := make([]byte, len(want))\n\tn := 0\n\ttt.withKillTimeout(func() { n, _ = io.ReadFull(tt.stdout, buf) })\n\tbuf = buf[:n]\n\tif n < len(want) || !bytes.Equal(buf, want) {\n\t\t// Grab any additional buffered output in case of mismatch\n\t\t// because it might help with debugging.\n\t\tbuf = append(buf, make([]byte, tt.stdout.Buffered())...)\n\t\ttt.stdout.Read(buf[n:])\n\t\t// Find the mismatch position.\n\t\tfor i := 0; i < n; i++ {\n\t\t\tif want[i] != buf[i] {\n\t\t\t\treturn fmt.Errorf(\"Output mismatch at ◊:\\n---------------- (stdout text)\\n%s◊%s\\n---------------- (expected text)\\n%s\",\n\t\t\t\t\tbuf[:i], buf[i:n], want)\n\t\t\t}\n\t\t}\n\t\tif n < len(want) {\n\t\t\treturn fmt.Errorf(\"Not enough output, got until ◊:\\n---------------- (stdout text)\\n%s\\n---------------- (expected text)\\n%s◊%s\",\n\t\t\t\tbuf, want[:n], want[n:])\n\t\t}\n\t}\n\treturn nil\n}\n\n// ExpectRegexp expects the child process to output text matching the\n// given regular expression within 5s.\n//\n// Note that an arbitrary amount of output may be consumed by the\n// regular expression. This usually means that expect cannot be used\n// after ExpectRegexp.\nfunc (tt *TestCmd) ExpectRegexp(regex string) (*regexp.Regexp, []string) {\n\tregex = strings.TrimPrefix(regex, \"\\n\")\n\tvar (\n\t\tre      = regexp.MustCompile(regex)\n\t\trtee    = &runeTee{in: tt.stdout}\n\t\tmatches []int\n\t)\n\ttt.withKillTimeout(func() { matches = re.FindReaderSubmatchIndex(rtee) })\n\toutput := rtee.buf.Bytes()\n\tif matches == nil {\n\t\ttt.Fatalf(\"Output did not match:\\n---------------- (stdout text)\\n%s\\n---------------- (regular expression)\\n%s\",\n\t\t\toutput, regex)\n\t\treturn re, nil\n\t}\n\ttt.Logf(\"Matched stdout text:\\n%s\", output)\n\tvar submatches []string\n\tfor i := 0; i < len(matches); i += 2 {\n\t\tsubmatch := string(output[matches[i]:matches[i+1]])\n\t\tsubmatches = append(submatches, submatch)\n\t}\n\treturn re, submatches\n}\n\n// ExpectExit expects the child process to exit within 5s without\n// printing any additional text on stdout.\nfunc (tt *TestCmd) ExpectExit() {\n\tvar output []byte\n\ttt.withKillTimeout(func() {\n\t\toutput, _ = ioutil.ReadAll(tt.stdout)\n\t})\n\ttt.WaitExit()\n\tif tt.Cleanup != nil {\n\t\ttt.Cleanup()\n\t}\n\tif len(output) > 0 {\n\t\ttt.Errorf(\"Unmatched stdout text:\\n%s\", output)\n\t}\n}\n\nfunc (tt *TestCmd) WaitExit() {\n\ttt.cmd.Wait()\n}\n\nfunc (tt *TestCmd) Interrupt() {\n\ttt.cmd.Process.Signal(os.Interrupt)\n}\n\n// StderrText returns any stderr output written so far.\n// The returned text holds all log lines after ExpectExit has\n// returned.\nfunc (tt *TestCmd) StderrText() string {\n\ttt.stderr.mu.Lock()\n\tdefer tt.stderr.mu.Unlock()\n\treturn tt.stderr.buf.String()\n}\n\nfunc (tt *TestCmd) CloseStdin() {\n\ttt.stdin.Close()\n}\n\nfunc (tt *TestCmd) Kill() {\n\ttt.cmd.Process.Kill()\n\tif tt.Cleanup != nil {\n\t\ttt.Cleanup()\n\t}\n}\n\nfunc (tt *TestCmd) withKillTimeout(fn func()) {\n\ttimeout := time.AfterFunc(5*time.Second, func() {\n\t\ttt.Log(\"killing the child process (timeout)\")\n\t\ttt.Kill()\n\t})\n\tdefer timeout.Stop()\n\tfn()\n}\n\n// testlogger logs all written lines via t.Log and also\n// collects them for later inspection.\ntype testlogger struct {\n\tt   *testing.T\n\tmu  sync.Mutex\n\tbuf bytes.Buffer\n}\n\nfunc (tl *testlogger) Write(b []byte) (n int, err error) {\n\tlines := bytes.Split(b, []byte(\"\\n\"))\n\tfor _, line := range lines {\n\t\tif len(line) > 0 {\n\t\t\ttl.t.Logf(\"(stderr) %s\", line)\n\t\t}\n\t}\n\ttl.mu.Lock()\n\ttl.buf.Write(b)\n\ttl.mu.Unlock()\n\treturn len(b), err\n}\n\n// runeTee collects text read through it into buf.\ntype runeTee struct {\n\tin interface {\n\t\tio.Reader\n\t\tio.ByteReader\n\t\tio.RuneReader\n\t}\n\tbuf bytes.Buffer\n}\n\nfunc (rtee *runeTee) Read(b []byte) (n int, err error) {\n\tn, err = rtee.in.Read(b)\n\trtee.buf.Write(b[:n])\n\treturn n, err\n}\n\nfunc (rtee *runeTee) ReadRune() (r rune, size int, err error) {\n\tr, size, err = rtee.in.ReadRune()\n\tif err == nil {\n\t\trtee.buf.WriteRune(r)\n\t}\n\treturn r, size, err\n}\n\nfunc (rtee *runeTee) ReadByte() (b byte, err error) {\n\tb, err = rtee.in.ReadByte()\n\tif err == nil {\n\t\trtee.buf.WriteByte(b)\n\t}\n\treturn b, err\n}\n"
  },
  {
    "path": "internal/debug/api.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package debug interfaces Go runtime debugging facilities.\n// This package is mostly glue code making these facilities available\n// through the CLI and RPC subsystem. If you want to use them from Go code,\n// use package runtime instead.\npackage debug\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"runtime/pprof\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// Handler is the global debugging handler.\nvar Handler = new(HandlerT)\n\n// HandlerT implements the debugging API.\n// Do not create values of this type, use the one\n// in the Handler variable instead.\ntype HandlerT struct {\n\tmu        sync.Mutex\n\tcpuW      io.WriteCloser\n\tcpuFile   string\n\ttraceW    io.WriteCloser\n\ttraceFile string\n}\n\n// Verbosity sets the log verbosity ceiling. The verbosity of individual packages\n// and source files can be raised using Vmodule.\nfunc (*HandlerT) Verbosity(level int) {\n\tglogger.Verbosity(log.Lvl(level))\n}\n\n// Vmodule sets the log verbosity pattern. See package log for details on the\n// pattern syntax.\nfunc (*HandlerT) Vmodule(pattern string) error {\n\treturn glogger.Vmodule(pattern)\n}\n\n// BacktraceAt sets the log backtrace location. See package log for details on\n// the pattern syntax.\nfunc (*HandlerT) BacktraceAt(location string) error {\n\treturn glogger.BacktraceAt(location)\n}\n\n// MemStats returns detailed runtime memory statistics.\nfunc (*HandlerT) MemStats() *runtime.MemStats {\n\ts := new(runtime.MemStats)\n\truntime.ReadMemStats(s)\n\treturn s\n}\n\n// GcStats returns GC statistics.\nfunc (*HandlerT) GcStats() *debug.GCStats {\n\ts := new(debug.GCStats)\n\tdebug.ReadGCStats(s)\n\treturn s\n}\n\n// CpuProfile turns on CPU profiling for nsec seconds and writes\n// profile data to file.\nfunc (h *HandlerT) CpuProfile(file string, nsec uint) error {\n\tif err := h.StartCPUProfile(file); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(time.Duration(nsec) * time.Second)\n\th.StopCPUProfile()\n\treturn nil\n}\n\n// StartCPUProfile turns on CPU profiling, writing to the given file.\nfunc (h *HandlerT) StartCPUProfile(file string) error {\n\th.mu.Lock()\n\tdefer h.mu.Unlock()\n\tif h.cpuW != nil {\n\t\treturn errors.New(\"CPU profiling already in progress\")\n\t}\n\tf, err := os.Create(expandHome(file))\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := pprof.StartCPUProfile(f); err != nil {\n\t\tf.Close()\n\t\treturn err\n\t}\n\th.cpuW = f\n\th.cpuFile = file\n\tlog.Info(\"CPU profiling started\", \"dump\", h.cpuFile)\n\treturn nil\n}\n\n// StopCPUProfile stops an ongoing CPU profile.\nfunc (h *HandlerT) StopCPUProfile() error {\n\th.mu.Lock()\n\tdefer h.mu.Unlock()\n\tpprof.StopCPUProfile()\n\tif h.cpuW == nil {\n\t\treturn errors.New(\"CPU profiling not in progress\")\n\t}\n\tlog.Info(\"Done writing CPU profile\", \"dump\", h.cpuFile)\n\th.cpuW.Close()\n\th.cpuW = nil\n\th.cpuFile = \"\"\n\treturn nil\n}\n\n// GoTrace turns on tracing for nsec seconds and writes\n// trace data to file.\nfunc (h *HandlerT) GoTrace(file string, nsec uint) error {\n\tif err := h.StartGoTrace(file); err != nil {\n\t\treturn err\n\t}\n\ttime.Sleep(time.Duration(nsec) * time.Second)\n\th.StopGoTrace()\n\treturn nil\n}\n\n// BlockProfile turns on goroutine profiling for nsec seconds and writes profile data to\n// file. It uses a profile rate of 1 for most accurate information. If a different rate is\n// desired, set the rate and write the profile manually.\nfunc (*HandlerT) BlockProfile(file string, nsec uint) error {\n\truntime.SetBlockProfileRate(1)\n\ttime.Sleep(time.Duration(nsec) * time.Second)\n\tdefer runtime.SetBlockProfileRate(0)\n\treturn writeProfile(\"block\", file)\n}\n\n// SetBlockProfileRate sets the rate of goroutine block profile data collection.\n// rate 0 disables block profiling.\nfunc (*HandlerT) SetBlockProfileRate(rate int) {\n\truntime.SetBlockProfileRate(rate)\n}\n\n// WriteBlockProfile writes a goroutine blocking profile to the given file.\nfunc (*HandlerT) WriteBlockProfile(file string) error {\n\treturn writeProfile(\"block\", file)\n}\n\n// MutexProfile turns on mutex profiling for nsec seconds and writes profile data to file.\n// It uses a profile rate of 1 for most accurate information. If a different rate is\n// desired, set the rate and write the profile manually.\nfunc (*HandlerT) MutexProfile(file string, nsec uint) error {\n\truntime.SetMutexProfileFraction(1)\n\ttime.Sleep(time.Duration(nsec) * time.Second)\n\tdefer runtime.SetMutexProfileFraction(0)\n\treturn writeProfile(\"mutex\", file)\n}\n\n// SetMutexProfileFraction sets the rate of mutex profiling.\nfunc (*HandlerT) SetMutexProfileFraction(rate int) {\n\truntime.SetMutexProfileFraction(rate)\n}\n\n// WriteMutexProfile writes a goroutine blocking profile to the given file.\nfunc (*HandlerT) WriteMutexProfile(file string) error {\n\treturn writeProfile(\"mutex\", file)\n}\n\n// WriteMemProfile writes an allocation profile to the given file.\n// Note that the profiling rate cannot be set through the API,\n// it must be set on the command line.\nfunc (*HandlerT) WriteMemProfile(file string) error {\n\treturn writeProfile(\"heap\", file)\n}\n\n// Stacks returns a printed representation of the stacks of all goroutines.\nfunc (*HandlerT) Stacks() string {\n\tbuf := new(bytes.Buffer)\n\tpprof.Lookup(\"goroutine\").WriteTo(buf, 2)\n\treturn buf.String()\n}\n\n// FreeOSMemory returns unused memory to the OS.\nfunc (*HandlerT) FreeOSMemory() {\n\tdebug.FreeOSMemory()\n}\n\n// SetGCPercent sets the garbage collection target percentage. It returns the previous\n// setting. A negative value disables GC.\nfunc (*HandlerT) SetGCPercent(v int) int {\n\treturn debug.SetGCPercent(v)\n}\n\nfunc writeProfile(name, file string) error {\n\tp := pprof.Lookup(name)\n\tlog.Info(\"Writing profile records\", \"count\", p.Count(), \"type\", name, \"dump\", file)\n\tf, err := os.Create(expandHome(file))\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\treturn p.WriteTo(f, 0)\n}\n\n// expands home directory in file paths.\n// ~someuser/tmp will not be expanded.\nfunc expandHome(p string) string {\n\tif strings.HasPrefix(p, \"~/\") || strings.HasPrefix(p, \"~\\\\\") {\n\t\thome := os.Getenv(\"HOME\")\n\t\tif home == \"\" {\n\t\t\tif usr, err := user.Current(); err == nil {\n\t\t\t\thome = usr.HomeDir\n\t\t\t}\n\t\t}\n\t\tif home != \"\" {\n\t\t\tp = home + p[1:]\n\t\t}\n\t}\n\treturn filepath.Clean(p)\n}\n"
  },
  {
    "path": "internal/debug/flags.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage debug\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t_ \"net/http/pprof\"\n\t\"os\"\n\t\"runtime\"\n\n\t\"github.com/fjl/memsize/memsizeui\"\n\tcolorable \"github.com/mattn/go-colorable\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/log/term\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/metrics/exp\"\n\t\"gopkg.in/urfave/cli.v1\"\n)\n\nvar Memsize memsizeui.Handler\n\nvar (\n\tverbosityFlag = cli.IntFlag{\n\t\tName:  \"verbosity\",\n\t\tUsage: \"Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail\",\n\t\tValue: 3,\n\t}\n\tvmoduleFlag = cli.StringFlag{\n\t\tName:  \"vmodule\",\n\t\tUsage: \"Per-module verbosity: comma-separated list of <pattern>=<level> (e.g. sero/*=5,p2p=4)\",\n\t\tValue: \"\",\n\t}\n\tbacktraceAtFlag = cli.StringFlag{\n\t\tName:  \"backtrace\",\n\t\tUsage: \"Request a stack trace at a specific logging statement (e.g. \\\"block.go:271\\\")\",\n\t\tValue: \"\",\n\t}\n\tdebugFlag = cli.BoolFlag{\n\t\tName:  \"debug\",\n\t\tUsage: \"Prepends log messages with call-site location (file and line number)\",\n\t}\n\tpprofFlag = cli.BoolFlag{\n\t\tName:  \"pprof\",\n\t\tUsage: \"Enable the pprof HTTP server\",\n\t}\n\tpprofPortFlag = cli.IntFlag{\n\t\tName:  \"pprofport\",\n\t\tUsage: \"pprof HTTP server listening port\",\n\t\tValue: 6060,\n\t}\n\tpprofAddrFlag = cli.StringFlag{\n\t\tName:  \"pprofaddr\",\n\t\tUsage: \"pprof HTTP server listening interface\",\n\t\tValue: \"127.0.0.1\",\n\t}\n\tmemprofilerateFlag = cli.IntFlag{\n\t\tName:  \"memprofilerate\",\n\t\tUsage: \"Turn on memory profiling with the given rate\",\n\t\tValue: runtime.MemProfileRate,\n\t}\n\tblockprofilerateFlag = cli.IntFlag{\n\t\tName:  \"blockprofilerate\",\n\t\tUsage: \"Turn on block profiling with the given rate\",\n\t}\n\tcpuprofileFlag = cli.StringFlag{\n\t\tName:  \"cpuprofile\",\n\t\tUsage: \"Write CPU profile to the given file\",\n\t}\n\ttraceFlag = cli.StringFlag{\n\t\tName:  \"trace\",\n\t\tUsage: \"Write execution trace to the given file\",\n\t}\n)\n\n// Flags holds all command-line flags required for debugging.\nvar Flags = []cli.Flag{\n\tverbosityFlag, vmoduleFlag, backtraceAtFlag, debugFlag,\n\tpprofFlag, pprofAddrFlag, pprofPortFlag,\n\tmemprofilerateFlag, blockprofilerateFlag, cpuprofileFlag, traceFlag,\n}\n\nvar (\n\tostream log.Handler\n\tglogger *log.GlogHandler\n)\n\nfunc init() {\n\tusecolor := term.IsTty(os.Stderr.Fd()) && os.Getenv(\"TERM\") != \"dumb\"\n\toutput := io.Writer(os.Stderr)\n\tif usecolor {\n\t\toutput = colorable.NewColorableStderr()\n\t}\n\tostream = log.StreamHandler(output, log.TerminalFormat(usecolor))\n\tglogger = log.NewGlogHandler(ostream)\n}\n\n// Setup initializes profiling and logging based on the CLI flags.\n// It should be called as early as possible in the program.\nfunc Setup(ctx *cli.Context, logdir string) error {\n\t// logging\n\tlog.PrintOrigins(ctx.GlobalBool(debugFlag.Name))\n\tif logdir != \"\" {\n\t\trfh, err := log.RotatingFileHandler(\n\t\t\tlogdir,\n\t\t\t262144,\n\t\t\tlog.JSONFormatOrderedEx(false, true),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tglogger.SetHandler(log.MultiHandler(ostream, rfh))\n\t}\n\tglogger.Verbosity(log.Lvl(ctx.GlobalInt(verbosityFlag.Name)))\n\tglogger.Vmodule(ctx.GlobalString(vmoduleFlag.Name))\n\tglogger.BacktraceAt(ctx.GlobalString(backtraceAtFlag.Name))\n\tlog.Root().SetHandler(glogger)\n\n\t// profiling, tracing\n\truntime.MemProfileRate = ctx.GlobalInt(memprofilerateFlag.Name)\n\tHandler.SetBlockProfileRate(ctx.GlobalInt(blockprofilerateFlag.Name))\n\tif traceFile := ctx.GlobalString(traceFlag.Name); traceFile != \"\" {\n\t\tif err := Handler.StartGoTrace(traceFile); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif cpuFile := ctx.GlobalString(cpuprofileFlag.Name); cpuFile != \"\" {\n\t\tif err := Handler.StartCPUProfile(cpuFile); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// pprof server\n\tif ctx.GlobalBool(pprofFlag.Name) {\n\t\taddress := fmt.Sprintf(\"%s:%d\", ctx.GlobalString(pprofAddrFlag.Name), ctx.GlobalInt(pprofPortFlag.Name))\n\t\tStartPProf(address)\n\t}\n\treturn nil\n}\n\nfunc StartPProf(address string) {\n\t// Hook go-metrics into expvar on any /debug/metrics request, load all vars\n\t// from the registry into expvar, and execute regular expvar handler.\n\texp.Exp(metrics.DefaultRegistry)\n\thttp.Handle(\"/memsize/\", http.StripPrefix(\"/memsize\", &Memsize))\n\tlog.Info(\"Starting pprof server\", \"addr\", fmt.Sprintf(\"http://%s/debug/pprof\", address))\n\tgo func() {\n\t\tif err := http.ListenAndServe(address, nil); err != nil {\n\t\t\tlog.Error(\"Failure in running pprof server\", \"err\", err)\n\t\t}\n\t}()\n}\n\n// Exit stops all running profiles, flushing their output to the\n// respective file.\nfunc Exit() {\n\tHandler.StopCPUProfile()\n\tHandler.StopGoTrace()\n}\n"
  },
  {
    "path": "internal/debug/loudpanic.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build go1.6\n\npackage debug\n\nimport \"runtime/debug\"\n\n// LoudPanic panics in a way that gets all goroutine stacks printed on stderr.\nfunc LoudPanic(x interface{}) {\n\tdebug.SetTraceback(\"all\")\n\tpanic(x)\n}\n"
  },
  {
    "path": "internal/debug/loudpanic_fallback.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build !go1.6\n\npackage debug\n\n// LoudPanic panics in a way that gets all goroutine stacks printed on stderr.\nfunc LoudPanic(x interface{}) {\n\tpanic(x)\n}\n"
  },
  {
    "path": "internal/debug/trace.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n//+build go1.5\n\npackage debug\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"runtime/trace\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// StartGoTrace turns on tracing, writing to the given file.\nfunc (h *HandlerT) StartGoTrace(file string) error {\n\th.mu.Lock()\n\tdefer h.mu.Unlock()\n\tif h.traceW != nil {\n\t\treturn errors.New(\"trace already in progress\")\n\t}\n\tf, err := os.Create(expandHome(file))\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := trace.Start(f); err != nil {\n\t\tf.Close()\n\t\treturn err\n\t}\n\th.traceW = f\n\th.traceFile = file\n\tlog.Info(\"Go tracing started\", \"dump\", h.traceFile)\n\treturn nil\n}\n\n// StopTrace stops an ongoing trace.\nfunc (h *HandlerT) StopGoTrace() error {\n\th.mu.Lock()\n\tdefer h.mu.Unlock()\n\ttrace.Stop()\n\tif h.traceW == nil {\n\t\treturn errors.New(\"trace not in progress\")\n\t}\n\tlog.Info(\"Done writing Go trace\", \"dump\", h.traceFile)\n\th.traceW.Close()\n\th.traceW = nil\n\th.traceFile = \"\"\n\treturn nil\n}\n"
  },
  {
    "path": "internal/debug/trace_fallback.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n//+build !go1.5\n\n// no-op implementation of tracing methods for Go < 1.5.\n\npackage debug\n\nimport \"errors\"\n\nfunc (*HandlerT) StartGoTrace(string) error {\n\treturn errors.New(\"tracing is not supported on Go < 1.5\")\n}\n\nfunc (*HandlerT) StopGoTrace() error {\n\treturn errors.New(\"tracing is not supported on Go < 1.5\")\n}\n"
  },
  {
    "path": "internal/ethapi/SRC20Api.go",
    "content": "package ethapi\n\nimport (\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n)\n\nconst getDecimalByNameDefinition = `[{\n\t\"constant\": false,\n\t\"inputs\": [{\n\t\t\"name\": \"name\",\n\t\t\"type\": \"string\"\n\t}],\n\t\"name\": \"getDecimal\",\n\t\"outputs\": [{\n\t\t\"name\": \"\",\n\t\t\"type\": \"uint8\"\n\t}],\n\t\"payable\": false,\n\t\"type\": \"function\"\n\t}]`\nconst getDecimalDefinition = `[{\n\t\"constant\": true,\n\t\"inputs\": [],\n\t\"name\": \"getDecimal\",\n\t\"outputs\": [{\n\t\t\"name\": \"\",\n\t\t\"type\": \"uint8\"\n\t}],\n\t\"payable\": false,\n\t\"type\": \"function\"\n    }]`\n\nconst decimalsDefinition = `[{\n\t\"constant\": true,\n\t\"inputs\": [],\n\t\"name\": \"decimals\",\n\t\"outputs\": [{\n\t\t\"name\": \"\",\n\t\t\"type\": \"uint8\"\n\t}],\n\t\"payable\": false,\n\t\"type\": \"function\"\n    }]`\n\ntype SRC20Decimal struct {\n\ttokenName  string\n\tdefinition string\n\tmethod     string\n}\n\nfunc NewSRC20Decimal(tokenName string) []SRC20Decimal {\n\tresult := []SRC20Decimal{\n\t\t{tokenName, decimalsDefinition, \"decimals\"},\n\t\t{tokenName, getDecimalByNameDefinition, \"getDecimal\"},\n\t\t{tokenName, getDecimalDefinition, \"getDecimal\"},\n\t}\n\treturn result\n}\n\ntype SRCAbi interface {\n\tPack() ([]byte, error)\n\tUnpack(outData []byte) (*uint8, error)\n}\n\nfunc packDecimalData(out []byte) []byte {\n\tprefix := [18]byte{}\n\trand := c_type.RandUint128()\n\tcopy(prefix[:], rand[:])\n\tl := 18 + len(out)\n\tresult := make([]byte, l)\n\tcopy(result[:18], prefix[:])\n\tcopy(result[18:], out[:])\n\treturn result[:]\n}\n\nfunc (d SRC20Decimal) Pack() ([]byte, error) {\n\tabi, err := abi.JSON(strings.NewReader(d.definition))\n\tif err != nil {\n\t\treturn []byte{}, err\n\t}\n\tmethod := abi.Methods[d.method]\n\tvar out []byte\n\tif len(method.Inputs) > 0 {\n\t\tout, err = abi.Pack(d.method, d.tokenName)\n\t} else {\n\t\tout, err = abi.Pack(d.method)\n\t}\n\tif err != nil {\n\t\treturn []byte{}, err\n\t}\n\treturn packDecimalData(out[:]), nil\n\n}\n\nfunc (d SRC20Decimal) Unpack(outData []byte) (*uint8, error) {\n\tabi, err := abi.JSON(strings.NewReader(d.definition))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar decimal uint8\n\terr = abi.Unpack(&decimal, d.method, outData)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &decimal, nil\n\n}\n"
  },
  {
    "path": "internal/ethapi/addrlock.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethapi\n\nimport (\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\ntype AddrLocker struct {\n\tmu    sync.Mutex\n\tlocks map[common.Address]*sync.Mutex\n}\n\n// lock returns the lock of the given address.\nfunc (l *AddrLocker) lock(address common.Address) *sync.Mutex {\n\tl.mu.Lock()\n\tdefer l.mu.Unlock()\n\tif l.locks == nil {\n\t\tl.locks = make(map[common.Address]*sync.Mutex)\n\t}\n\tif _, ok := l.locks[address]; !ok {\n\t\tl.locks[address] = new(sync.Mutex)\n\t}\n\treturn l.locks[address]\n}\n\n// LockAddr locks an account's mutex. This is used to prevent another tx getting the\n// same nonce until the lock is released. The mutex prevents the (an identical nonce) from\n// being read again during the time that the first transaction is being signed.\nfunc (l *AddrLocker) LockAddr(address common.Address) {\n\tl.lock(address).Lock()\n}\n\n// UnlockAddr unlocks the mutex of the given account.\nfunc (l *AddrLocker) UnlockAddr(address common.Address) {\n\tl.lock(address).Unlock()\n}\n"
  },
  {
    "path": "internal/ethapi/api.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage ethapi\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-sero/zero/wallet/exchange\"\n\n\t\"github.com/tyler-smith/go-bip39\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/accounts/keystore\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\tztx \"github.com/sero-cash/go-sero/zero/txs/tx\"\n\t\"github.com/syndtr/goleveldb/leveldb\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nconst (\n\tdefaultGasPrice = params.Gta\n)\n\nvar (\n\tzerobyte = string([]byte{0})\n)\n\n// PublicEthereumAPI provides an API to access Ethereum related information.\n// It offers only methods that operate on public data that is freely available to anyone.\ntype PublicEthereumAPI struct {\n\tb Backend\n}\n\n// NewPublicEthereumAPI creates a new Ethereum protocol API.\nfunc NewPublicEthereumAPI(b Backend) *PublicEthereumAPI {\n\treturn &PublicEthereumAPI{b}\n}\n\n// GasPrice returns a suggestion for a gas price.\nfunc (s *PublicEthereumAPI) GasPrice(ctx context.Context) (*hexutil.Big, error) {\n\tprice, err := s.b.SuggestPrice(ctx)\n\treturn (*hexutil.Big)(price), err\n}\n\n// ProtocolVersion returns the current Ethereum protocol version this node supports\nfunc (s *PublicEthereumAPI) ProtocolVersion() hexutil.Uint {\n\treturn hexutil.Uint(s.b.ProtocolVersion())\n}\n\n// Syncing returns false in case the node is currently not syncing with the network. It can be up to date or has not\n// yet received the latest block headers from its pears. In case it is synchronizing:\n// - startingBlock: block number this node started to synchronise from\n// - currentBlock:  block number this node is currently importing\n// - highestBlock:  block number of the highest block header this node has received from peers\n// - pulledStates:  number of state entries processed until now\n// - knownStates:   number of known state entries that still need to be pulled\nfunc (s *PublicEthereumAPI) Syncing() (interface{}, error) {\n\tprogress := s.b.Downloader().Progress()\n\n\t// Return not syncing if the synchronisation already completed\n\tif progress.CurrentBlock >= progress.HighestBlock {\n\t\treturn false, nil\n\t}\n\t// Otherwise gather the block sync stats\n\treturn map[string]interface{}{\n\t\t\"startingBlock\": hexutil.Uint64(progress.StartingBlock),\n\t\t\"currentBlock\":  hexutil.Uint64(progress.CurrentBlock),\n\t\t\"highestBlock\":  hexutil.Uint64(progress.HighestBlock),\n\t\t\"pulledStates\":  hexutil.Uint64(progress.PulledStates),\n\t\t\"knownStates\":   hexutil.Uint64(progress.KnownStates),\n\t}, nil\n}\n\n// PublicTxPoolAPI offers and API for the transaction pool. It only operates on data that is non confidential.\ntype PublicTxPoolAPI struct {\n\tb Backend\n}\n\n// NewPublicTxPoolAPI creates a new tx pool service that gives information about the transaction pool.\nfunc NewPublicTxPoolAPI(b Backend) *PublicTxPoolAPI {\n\treturn &PublicTxPoolAPI{b}\n}\n\n// Content returns the transactions contained within the transaction pool.\n\nfunc (s *PublicTxPoolAPI) Content() map[string]map[string]*RPCTransaction {\n\tcontent := map[string]map[string]*RPCTransaction{\n\t\t\"pending\": make(map[string]*RPCTransaction),\n\t\t\"queued\":  make(map[string]*RPCTransaction),\n\t\t\"all\":     make(map[string]*RPCTransaction),\n\t}\n\tpending, queue, all := s.b.TxPoolContent()\n\n\t// Flatten the pending transactions\n\n\tdump := make(map[string]*RPCTransaction)\n\tfor _, tx := range pending {\n\t\tdump[tx.Hash().Hex()] = newRPCPendingTransaction(tx)\n\t}\n\tcontent[\"pending\"] = dump\n\n\t// Flatten the queued transactions\n\n\tqdump := make(map[string]*RPCTransaction)\n\tfor _, tx := range queue {\n\t\tqdump[tx.Hash().Hex()] = newRPCPendingTransaction(tx)\n\t}\n\tcontent[\"queued\"] = qdump\n\n\tadump := make(map[string]*RPCTransaction)\n\tfor _, tx := range all {\n\t\tadump[tx.Hash().Hex()] = newRPCPendingTransaction(tx)\n\t}\n\tcontent[\"all\"] = adump\n\n\treturn content\n}\n\n// Status returns the number of pending and queued transaction in the pool.\nfunc (s *PublicTxPoolAPI) Status() map[string]hexutil.Uint {\n\tpending, queue, all, total := s.b.Stats()\n\treturn map[string]hexutil.Uint{\n\t\t\"pending\": hexutil.Uint(pending),\n\t\t\"queued\":  hexutil.Uint(queue),\n\t\t\"all\":     hexutil.Uint(all),\n\t\t\"total\":   hexutil.Uint(total),\n\t}\n}\n\n// Inspect retrieves the content of the transaction pool and flattens it into an\n// easily inspectable list.\n\nfunc (s *PublicTxPoolAPI) Inspect() map[string]map[string]string {\n\tcontent := map[string]map[string]string{\n\t\t\"pending\": make(map[string]string),\n\t\t\"queued\":  make(map[string]string),\n\t}\n\t/*pending, queue := s.b.TxPoolContent()\n\n\t// Define a formatter to flatten a transaction into a string\n\tvar format = func(tx *types.Transaction) string {\n\t\tif to := tx.To(); to != nil {\n\t\t\treturn fmt.Sprintf(\"%s:  %v gas × %v wei\", tx.To().Base58(), tx.Gas(), tx.GasPrice())\n\t\t}\n\t\treturn fmt.Sprintf(\"contract creation: %v gas × %v wei\", tx.Gas(), tx.GasPrice())\n\t}\n\t// Flatten the pending transactions\n\n\tdump := make(map[string]string)\n\tfor _, tx := range pending {\n\t\tdump[fmt.Sprintf(\"%s\", tx.Hash())] = format(tx)\n\t}\n\tcontent[\"pending\"] = dump\n\n\t// Flatten the queued transactions\n\tqdump := make(map[string]string)\n\tfor _, tx := range queue {\n\t\tqdump[fmt.Sprintf(\"%s\", tx.Hash())] = format(tx)\n\t}\n\tcontent[\"queued\"] = qdump*/\n\treturn content\n}\n\n// PublicAccountAPI provides an API to access accounts managed by this node.\n// It offers only methods that can retrieve accounts.\ntype PublicAccountAPI struct {\n\tam *accounts.Manager\n}\n\n// NewPublicAccountAPI creates a new PublicAccountAPI.\nfunc NewPublicAccountAPI(am *accounts.Manager) *PublicAccountAPI {\n\treturn &PublicAccountAPI{am: am}\n}\n\n// Accounts returns the collection of accounts this node manages\nfunc (s *PublicAccountAPI) Accounts() []address.PKAddress {\n\taddresses := make([]address.PKAddress, 0) // return [] instead of nil if empty\n\tfor _, wallet := range s.am.Wallets() {\n\t\tfor _, account := range wallet.Accounts() {\n\t\t\taddresses = append(addresses, account.Address)\n\t\t}\n\t}\n\treturn addresses\n}\n\nfunc (s *PublicAccountAPI) GetTk(addr address.MixBase58Adrress) address.TKAddress {\n\tvar pkr = addr.ToPkr()\n\taccount, err := s.am.FindAccountByPkr(pkr)\n\tif err != nil {\n\t\treturn address.TKAddress{}\n\t}\n\treturn account.Tk\n}\n\nfunc (s *PublicAccountAPI) IsMinePKr(Pkr PKrAddress) *address.PKAddress {\n\tvar pkr = Pkr.ToPKr()\n\taccount, err := s.am.FindAccountByPkr(*pkr)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn &account.Address\n\n}\n\n// PrivateAccountAPI provides an API to access accounts managed by this node.\n// It offers methods to create, (un)lock en list accounts. Some methods accept\n// passwords and are therefore considered private by default.\ntype PrivateAccountAPI struct {\n\tam        *accounts.Manager\n\tnonceLock *AddrLocker\n\tb         Backend\n}\n\n// NewPrivateAccountAPI create a new PrivateAccountAPI.\nfunc NewPrivateAccountAPI(b Backend, nonceLock *AddrLocker) *PrivateAccountAPI {\n\treturn &PrivateAccountAPI{\n\t\tam:        b.AccountManager(),\n\t\tnonceLock: nonceLock,\n\t\tb:         b,\n\t}\n}\n\n// ListAccounts will return a list of addresses for accounts this node manages.\nfunc (s *PrivateAccountAPI) ListAccounts() []address.PKAddress {\n\taddresses := make([]address.PKAddress, 0) // return [] instead of nil if empty\n\tfor _, wallet := range s.am.Wallets() {\n\t\tfor _, account := range wallet.Accounts() {\n\t\t\taddresses = append(addresses, account.Address)\n\t\t}\n\t}\n\treturn addresses\n}\n\n// rawWallet is a JSON representation of an accounts.Wallet interface, with its\n// data contents extracted into plain fields.\ntype rawWallet struct {\n\tURL      string             `json:\"url\"`\n\tStatus   string             `json:\"status\"`\n\tFailure  string             `json:\"failure,omitempty\"`\n\tAccounts []accounts.Account `json:\"accounts,omitempty\"`\n}\n\n// ListWallets will return a list of wallets this node manages.\nfunc (s *PrivateAccountAPI) ListWallets() []rawWallet {\n\twallets := make([]rawWallet, 0) // return [] instead of nil if empty\n\tfor _, wallet := range s.am.Wallets() {\n\t\tstatus, failure := wallet.Status()\n\n\t\traw := rawWallet{\n\t\t\tURL:      wallet.URL().String(),\n\t\t\tStatus:   status,\n\t\t\tAccounts: wallet.Accounts(),\n\t\t}\n\t\tif failure != nil {\n\t\t\traw.Failure = failure.Error()\n\t\t}\n\t\twallets = append(wallets, raw)\n\t}\n\treturn wallets\n}\n\nfunc getMaxBlockNumer(b Backend) uint64 {\n\tmaxNumber := b.Downloader().Progress().HighestBlock\n\tcurrent := b.CurrentBlock()\n\tif current != nil {\n\t\tif maxNumber < current.NumberU64() {\n\t\t\tmaxNumber = current.NumberU64()\n\t\t}\n\t}\n\treturn maxNumber\n}\n\n// NewAccount will create a new account and returns the address for the new account.\nfunc (s *PrivateAccountAPI) NewAccount(password string) (address.PKAddress, error) {\n\tmaxNumber := s.b.Downloader().Progress().HighestBlock\n\tcurrent := s.b.CurrentBlock()\n\tat := uint64(0)\n\tif current != nil {\n\t\tif maxNumber < current.NumberU64() {\n\t\t\tmaxNumber = current.NumberU64()\n\t\t}\n\t}\n\tat = maxNumber\n\tif seroparam.Is_Dev() {\n\t\tat = uint64(0)\n\t}\n\tversion := 1\n\tif maxNumber >= seroparam.SIP5() {\n\t\tversion = 2\n\t}\n\tacc, err := fetchKeystore(s.am).NewAccount(password, at, version)\n\tif err != nil {\n\t\treturn address.PKAddress{}, err\n\t}\n\n\tif seroparam.Is_Dev() {\n\t\tfetchKeystore(s.am).TimedUnlock(acc, password, 0)\n\t}\n\treturn acc.Address, nil\n}\n\n// NewAccount will create a new account and returns the mnemonic 、address for the new account.\nfunc (s *PrivateAccountAPI) NewAccountWithMnemonic(password string) (map[string]interface{}, error) {\n\tmaxNumber := s.b.Downloader().Progress().HighestBlock\n\tcurrent := s.b.CurrentBlock()\n\tat := uint64(0)\n\tif current != nil {\n\t\tif maxNumber < current.NumberU64() {\n\t\t\tmaxNumber = current.NumberU64()\n\t\t}\n\t}\n\tat = maxNumber\n\tif seroparam.Is_Dev() {\n\t\tat = uint64(0)\n\t}\n\tversion := 1\n\tif maxNumber >= seroparam.SIP5() {\n\t\tversion = 2\n\t}\n\tmnemonic, acc, err := fetchKeystore(s.am).NewAccountWithMnemonic(password, at, version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif seroparam.Is_Dev() {\n\t\tfetchKeystore(s.am).TimedUnlock(acc, password, 0)\n\t}\n\tresult := map[string]interface{}{}\n\tresult[\"mnemonic\"] = mnemonic\n\tresult[\"address\"] = acc.Address\n\treturn result, nil\n}\n\n// fetchKeystore retrives the encrypted keystore from the account manager.\nfunc fetchKeystore(am *accounts.Manager) *keystore.KeyStore {\n\treturn am.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore)\n}\n\n// ImportRawKey stores the given hex encoded ECDSA key into the key directory,\n// encrypting it with the passphrase.\nfunc (s *PrivateAccountAPI) ImportRawKey(privkey string, password string, v *int, a *uint64) (address.PKAddress, error) {\n\tif common.Is0xPrefixHex(privkey) {\n\t\tprivkey = privkey[2:]\n\t}\n\n\tkey, err := crypto.HexToECDSA(privkey)\n\tif err != nil {\n\t\treturn address.PKAddress{}, err\n\t}\n\tversion := 1\n\tif v != nil {\n\t\tversion = *v\n\t}\n\tmaxBlockNumber := getMaxBlockNumer(s.b)\n\tif maxBlockNumber < seroparam.SIP5() {\n\t\tif version == 2 {\n\t\t\treturn address.PKAddress{}, errors.New(fmt.Sprintf(\"account version is 2 must be after SIP5=%v\", seroparam.SIP5()))\n\t\t}\n\t}\n\tif version != 1 && version != 2 {\n\t\treturn address.PKAddress{}, errors.New(\"account version is only be 1 or 2 \")\n\t}\n\tat := uint64(0)\n\tif a != nil {\n\t\tat = *a\n\t}\n\tif version == 2 {\n\t\tif at < seroparam.SIP5() {\n\t\t\tat = seroparam.SIP5()\n\t\t}\n\t}\n\tacc, err := fetchKeystore(s.am).ImportECDSA(key, password, at, version)\n\treturn acc.Address, err\n}\n\nfunc (s *PrivateAccountAPI) ImportTk(tk address.TKAddress, a *uint64) (address.PKAddress, error) {\n\tat := uint64(0)\n\tif a != nil {\n\t\tat = *a\n\t}\n\tmaxBlockNumber := getMaxBlockNumer(s.b)\n\tif c_superzk.IsFlagSet(tk[:]) {\n\t\tif at < seroparam.SIP5() {\n\t\t\tat = seroparam.SIP5()\n\t\t}\n\t\tif maxBlockNumber < seroparam.SIP5() {\n\t\t\treturn address.PKAddress{}, errors.New(fmt.Sprintf(\"account version is 2 must be after SIP5=%v\", seroparam.SIP5()))\n\t\t}\n\t}\n\tacc, err := fetchKeystore(s.am).ImportTk(tk.ToTk(), at)\n\treturn acc.Address, err\n}\n\nfunc (s *PrivateAccountAPI) ImportMnemonic(mnemonic string, password string, a *uint64) (address.PKAddress, error) {\n\tmnemonicSlice := strings.Split(mnemonic, \" \")\n\tversion := 1\n\tif len(mnemonicSlice) == 25 {\n\t\tif mnemonicSlice[0] == \"v2\" {\n\t\t\tversion = 2\n\t\t\tmnemonic = strings.Join(mnemonicSlice[1:], \" \")\n\t\t} else {\n\t\t\treturn address.PKAddress{}, errors.New(\"invalid mnemnoic\")\n\t\t}\n\t}\n\t_, err := bip39.MnemonicToByteArray(mnemonic)\n\tif err != nil {\n\t\treturn address.PKAddress{}, err\n\t}\n\tseed, err := bip39.EntropyFromMnemonic(mnemonic)\n\tif err != nil {\n\t\treturn address.PKAddress{}, err\n\t}\n\tif len(seed) != 32 {\n\t\treturn address.PKAddress{}, errors.New(\"EntropyFromMnemonic error seed not 256bits\")\n\t}\n\tkey, err := crypto.ToECDSA(seed[:32])\n\tif err != nil {\n\t\treturn address.PKAddress{}, err\n\t}\n\n\tat := uint64(0)\n\tif a != nil {\n\t\tat = *a\n\t}\n\tmaxBlockNumber := getMaxBlockNumer(s.b)\n\tif maxBlockNumber < seroparam.SIP5() {\n\t\tif version == 2 {\n\t\t\treturn address.PKAddress{}, errors.New(fmt.Sprintf(\"account version is 2 must be after SIP5=%v\", seroparam.SIP5()))\n\t\t}\n\t}\n\tif version == 2 {\n\t\tif at < seroparam.SIP5() {\n\t\t\tat = seroparam.SIP5()\n\t\t}\n\t}\n\tacc, err := fetchKeystore(s.am).ImportECDSA(key, password, at, version)\n\treturn acc.Address, err\n}\n\n// UnlockAccount will unlock the account associated with the given address with\n// the given password for duration seconds. If duration is nil it will use a\n// default of 300 seconds. It returns an indication if the account was unlocked.\nfunc (s *PrivateAccountAPI) UnlockAccount(addr address.MixBase58Adrress, password string, duration *uint64) (bool, error) {\n\tconst max = uint64(time.Duration(math.MaxInt64) / time.Second)\n\tvar d time.Duration\n\tif duration == nil {\n\t\td = 300 * time.Second\n\t} else if *duration > max {\n\t\treturn false, errors.New(\"unlock duration too large\")\n\t} else {\n\t\td = time.Duration(*duration) * time.Second\n\t}\n\tif seroparam.Is_Dev() {\n\t\td = 0\n\t}\n\taccount, err := s.am.FindAccountByPkr(addr.ToPkr())\n\tif err != nil {\n\t\treturn false, err\n\t}\n\terr = fetchKeystore(s.am).TimedUnlock(account, password, d)\n\treturn err == nil, err\n}\n\nfunc (s *PrivateAccountAPI) ExportMnemonic(addr address.MixBase58Adrress, password string) (string, error) {\n\taccount, err := s.am.FindAccountByPkr(addr.ToPkr())\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fetchKeystore(s.am).ExportMnemonic(account, password)\n}\n\nfunc (s *PrivateAccountAPI) ExportRawKey(addr address.MixBase58Adrress, password string) (hexutil.Bytes, error) {\n\taccount, err := s.am.FindAccountByPkr(addr.ToPkr())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tseed, err := fetchKeystore(s.am).ExportRewKey(account, password)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn hexutil.Bytes(seed), nil\n}\n\nfunc (s *PrivateAccountAPI) GenSeed() (hexutil.Bytes, error) {\n\tentropy, err := bip39.NewEntropy(256)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn hexutil.Bytes(entropy), nil\n}\n\n// LockAccount will lock the account associated with the given address when it's unlocked.\nfunc (s *PrivateAccountAPI) LockAccount(addr address.MixBase58Adrress) bool {\n\taccount, err := s.am.FindAccountByPkr(addr.ToPkr())\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn fetchKeystore(s.am).Lock(account.Address) == nil\n}\n\n// signTransactions sets defaults and signs the given transaction\n// NOTE: the caller needs to ensure that the nonceLock is held, if applicable,\n// and release it after the transaction has been submitted to the tx pool\nfunc (s *PrivateAccountAPI) signTransaction(ctx context.Context, args SendTxArgs, passwd string) (pretx *txtool.GTxParam, tx *types.Transaction, e error) {\n\ts.nonceLock.mu.Lock()\n\tdefer s.nonceLock.mu.Unlock()\n\t// Look up the wallet containing the requested abi\n\tfromAccount, err := s.am.FindAccountByPkr(args.From.ToPkr())\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\twallet, _ := s.am.Find(fromAccount)\n\t// Set some sanity defaults and terminate on failure\n\tif err := args.setDefaults(ctx, s.b); err != nil {\n\t\te = err\n\t\treturn\n\t}\n\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\n\tif err != nil {\n\t\te = err\n\t\treturn\n\t}\n\n\tif !seroparam.IsExchange() {\n\t\te = errors.New(\"not support\")\n\t\treturn\n\t} else {\n\t\tif pretx, e = s.b.GenTx(args.toTxParam(state, fromAccount)); e != nil {\n\t\t\treturn\n\t\t}\n\t\tlog.Info(\"ToTxParam\", \"utxos\", len(pretx.Ins))\n\t\tseed, err := wallet.GetSeedWithPassphrase(passwd)\n\t\tif err != nil {\n\t\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t\tsk := superzk.Seed2Sk(seed.SeedToUint256(), wallet.Accounts()[0].Version)\n\t\tgtx, err := flight.SignTx(&sk, pretx)\n\t\tif err != nil {\n\t\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t\tgasPrice := big.Int(gtx.GasPrice)\n\t\tgas := uint64(gtx.Gas)\n\t\ttx = types.NewTxWithGTx(gas, &gasPrice, &gtx.Tx)\n\t\treturn\n\n\t}\n\n}\n\n// SendTransaction will create a transaction from the given arguments and\n// tries to sign it with the key associated with args.To. If the given passwd isn't\n// able to decrypt the key it fails.\nfunc (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs, passwd string) (common.Hash, error) {\n\t/*if args.Nonce == nil {\n\t\t// Hold the addresse's mutex around signing to prevent concurrent assignment of\n\t\t// the same nonce to multiple accounts.\n\t\ts.nonceLock.LockAddr(args.From)\n\t\tdefer s.nonceLock.UnlockAddr(args.From)\n\t}*/\n\tpretx, signed, err := s.signTransaction(ctx, args, passwd)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tif err := s.b.SendTx(ctx, signed); err != nil {\n\t\tif pretx != nil {\n\t\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\t}\n\t\treturn common.Hash{}, err\n\t}\n\tif pretx != nil {\n\t\tlog.Info(\"Submitted transaction\", \"fullhash\", signed.Hash().Hex(), \"recipient\", args.To, \"utxo\", len(pretx.Ins))\n\t} else {\n\t\tlog.Info(\"Submitted transaction\", \"fullhash\", signed.Hash().Hex(), \"recipient\", args.To)\n\t}\n\treturn signed.Hash(), nil\n}\n\n// SignAndSendTransaction was renamed to SendTransaction. This method is deprecated\n// and will be removed in the future. It primary goal is to give clients time to update.\nfunc (s *PrivateAccountAPI) SignAndSendTransaction(ctx context.Context, args SendTxArgs, passwd string) (common.Hash, error) {\n\treturn s.SendTransaction(ctx, args, passwd)\n}\n\n// PublicBlockChainAPI provides an API to access the Ethereum blockchain.\n// It offers only methods that operate on public data that is freely available to anyone.\ntype PublicBlockChainAPI struct {\n\tb Backend\n}\n\n// NewPublicBlockChainAPI creates a new Ethereum blockchain API.\nfunc NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI {\n\treturn &PublicBlockChainAPI{b}\n}\n\n// BlockNumber returns the block number of the chain head.\nfunc (s *PublicBlockChainAPI) BlockNumber() hexutil.Uint64 {\n\theader, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available\n\treturn hexutil.Uint64(header.Number.Uint64())\n}\n\nfunc (s *PublicBlockChainAPI) CurrencyToContractAddress(ctx context.Context, cy Smbol) (*ContractAddress, error) {\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif cy == \"\" {\n\t\treturn nil, errors.New(\"cy can not be empty!\")\n\t} else {\n\t\tif cy.IsSero() {\n\t\t\treturn nil, nil\n\t\t}\n\t}\n\tcontractAddress := state.GetContrctAddressByToken(cy.String())\n\tempty := common.Address{}\n\tif contractAddress == empty {\n\t\treturn nil, errors.New(cy.String() + \"not exists!\")\n\t}\n\tvar result = &ContractAddress{}\n\tresult.SetBytes(contractAddress[:64])\n\treturn result, nil\n}\n\ntype ConvertAddress struct {\n\tAddr      map[string]string                 `json:\"addr\"`\n\tShortAddr map[string]common.ContractAddress `json:\"shortAddr\"`\n\tRand      *c_type.Uint128                   `json:\"rand\"`\n}\n\nfunc (s *PublicBlockChainAPI) ConvertAddressParams(ctx context.Context, rand *c_type.Uint128, addresses []AllBase58Adrress, dy bool) (*ConvertAddress, error) {\n\tempty := &c_type.Uint128{}\n\tif bytes.Equal(rand[:], empty[:]) {\n\t\trandKey := c_type.RandUint128()\n\t\trand = &randKey\n\t}\n\taddrMap := map[string]string{}\n\tshortAddrMap := map[string]common.ContractAddress{}\n\n\trandSeed := rand.ToUint256()\n\n\tif dy {\n\t\trandUint128 := c_type.RandUint128()\n\t\trandSeed = (&randUint128).ToUint256()\n\t}\n\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, addr := range addresses {\n\t\tonceAddr := common.Address{}\n\t\tif state.IsContract(common.BytesToAddress(addr.Bytes())) {\n\t\t\tonceAddr = common.BytesToAddress(addr.Bytes())\n\t\t} else {\n\t\t\tif len(addr.Bytes()) == 96 {\n\t\t\t\tonceAddr = common.BytesToAddress(addr.Bytes())\n\t\t\t} else {\n\t\t\t\tpk := c_type.Uint512{}\n\t\t\t\tcopy(pk[:], addr.Bytes())\n\t\t\t\tif superzk.IsPKValid(&pk) {\n\t\t\t\t\tpkr := superzk.Pk2PKr(&pk, randSeed.NewRef())\n\t\t\t\t\tonceAddr.SetBytes(pkr[:])\n\t\t\t\t} else {\n\t\t\t\t\treturn nil, errors.New(\"invalid param address:\" + addr.String())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\taddrMap[addr.String()] = base58.Encode(onceAddr[:])\n\t\tshortAddr := c_superzk.HashPKr(onceAddr.ToPKr())\n\t\tshortAddrMap[base58.Encode(onceAddr[:])] = common.BytesToContractAddress(shortAddr[:])\n\t}\n\treturn &ConvertAddress{addrMap, shortAddrMap, rand}, nil\n}\n\nfunc (s *PublicBlockChainAPI) GetFullAddress(ctx context.Context, shortAddresses []common.ContractAddress) (map[common.ContractAddress]PKrAddress, error) {\n\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\taddrMap := map[common.ContractAddress]PKrAddress{}\n\tfor _, short := range shortAddresses {\n\t\tfull := state.GetNonceAddress(short[:])\n\t\tvar pkr PKrAddress\n\t\tcopy(pkr[:], full[:])\n\n\t\taddrMap[short] = pkr\n\t}\n\treturn addrMap, nil\n\n}\n\nfunc (s *PublicBlockChainAPI) GetShortAddress(ctx context.Context, addr AllMixedAddress) hexutil.Bytes {\n\tvar pkr c_type.PKr\n\tcopy(pkr[:], addr[:])\n\tshortAddr := c_superzk.HashPKr(pkr.NewRef())\n\treturn hexutil.Bytes(shortAddr[:])\n}\n\nfunc (s *PublicBlockChainAPI) GenPKr(ctx context.Context, Pk address.PKAddress) (PKrAddress, error) {\n\taccount, err := s.b.AccountManager().FindAccountByPk(Pk.ToUint512())\n\tif err != nil {\n\t\treturn PKrAddress{}, err\n\t}\n\tPKr := account.GetPkr(nil)\n\tresult := PKrAddress{}\n\tcopy(result[:], PKr[:])\n\treturn result, nil\n\treturn result, nil\n}\n\nfunc encodeNumber(number uint64) []byte {\n\tenc := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(enc, number)\n\treturn enc\n}\n\nfunc (s *PublicBlockChainAPI) GenIndexPKr(ctx context.Context, Pk address.PKAddress, index uint64) (PKrAddress, error) {\n\taccount, err := s.b.AccountManager().FindAccountByPk(Pk.ToUint512())\n\tif err != nil {\n\t\treturn PKrAddress{}, err\n\t}\n\tsalt := encodeNumber(index)\n\t//log.Info(\"GenIndexPKr\", \"salt\", hexutil.Encode(salt))\n\trandom := append(account.Tk[:], salt...)\n\tr := crypto.Keccak256Hash(random).HashToUint256()\n\tPKr := account.GetPkr(r)\n\tresult := PKrAddress{}\n\tcopy(result[:], PKr[:])\n\treturn result, nil\n}\n\nfunc (s *PublicBlockChainAPI) GenOldIndexPKr(ctx context.Context, Pk address.PKAddress, index uint64) (PKrAddress, error) {\n\taccount, err := s.b.AccountManager().FindAccountByPk(Pk.ToUint512())\n\tif err != nil {\n\t\treturn PKrAddress{}, err\n\t}\n\tr := c_type.Uint256{}\n\tcopy(r[:], common.LeftPadBytes(encodeNumber(index), 32))\n\tPKr := account.GetPkr(&r)\n\tresult := PKrAddress{}\n\tcopy(result[:], PKr[:])\n\treturn result, nil\n}\n\nfunc (s *PublicBlockChainAPI) GenIndexPKrByTk(ctx context.Context, Tk address.TKAddress, index uint64) (PKrAddress, error) {\n\n\tsalt := encodeNumber(index)\n\trandom := append(Tk[:], salt...)\n\t//log.Info(\"GenIndexPKr\", \"salt\", hexutil.Encode(salt))\n\tr := crypto.Keccak256Hash(random).HashToUint256()\n\tvar pk c_type.Uint512\n\tvar err error\n\tpk, err = superzk.Tk2Pk(Tk.ToTk().NewRef())\n\tif err != nil {\n\t\treturn PKrAddress{}, err\n\t}\n\n\tpkr := superzk.Pk2PKr(&pk, r)\n\tresult := PKrAddress{}\n\tcopy(result[:], pkr[:])\n\treturn result, nil\n}\n\ntype Balance struct {\n\tTkn map[string]*hexutil.Big   `json:\"tkn\"`\n\tTkt map[string][]*common.Hash `json:\"tkt\"`\n}\n\nfunc GetBalanceFromExchange(tkns map[string]*big.Int) (result Balance) {\n\ttkn := map[string]*hexutil.Big{}\n\tif tkns != nil {\n\t\tfor cy, value := range tkns {\n\t\t\tif tkn[cy] == nil {\n\t\t\t\ttkn[cy] = (*hexutil.Big)(value)\n\t\t\t} else {\n\t\t\t\ttkn[cy] = (*hexutil.Big)(new(big.Int).Add((*big.Int)(tkn[cy]), value))\n\t\t\t}\n\t\t}\n\t}\n\tif len(tkn) > 0 {\n\t\tresult.Tkn = tkn\n\t}\n\n\treturn\n}\n\n// GetBalance returns the amount of wei for the given address in the state of the\n// given block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta\n// block numbers are also allowed.\nfunc (s *PublicBlockChainAPI) GetBalance(ctx context.Context, addr AllMixedAddress, blockNr rpc.BlockNumber) (Balance, error) {\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr)\n\n\tif state == nil || err != nil {\n\t\treturn Balance{}, err\n\t}\n\n\ttkn := map[string]*hexutil.Big{}\n\tresult := Balance{}\n\tif addr.IsContract() {\n\t\tbalances := state.Balances(common.BytesToAddress(addr[:]))\n\t\tfor key, value := range balances {\n\t\t\ttkn[key] = (*hexutil.Big)(value)\n\t\t}\n\t\tif len(tkn) > 0 {\n\t\t\tresult.Tkn = tkn\n\t\t}\n\t\treturn result, state.Error()\n\t} else {\n\t\tfromAccount, err := s.b.AccountManager().FindAccountByPkr(addr.ToPKr())\n\t\tif err != nil {\n\t\t\treturn Balance{}, err\n\t\t}\n\t\tif seroparam.IsExchange() {\n\t\t\texchangBalance, ticekts := s.b.GetBalances(fromAccount.Address.ToUint512())\n\t\t\tbalance := GetBalanceFromExchange(exchangBalance)\n\t\t\tbalance.Tkt = ticekts\n\t\t\treturn balance, nil\n\t\t} else {\n\t\t\treturn result, errors.New(\"lstate.balance is no longer supported\")\n\t\t}\n\t}\n\n}\n\n/**\nfunc (s *PublicBlockChainAPI) GetPkg(ctx context.Context, addr common.Address, packed bool, id *c_type.Uint256) (interface{}, error) {\n\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\twallets := s.b.AccountManager().Wallets()\n\taccountAddress := getAccountAddress(addr, s.b)\n\tif accountAddress == nil {\n\t\treturn nil, nil\n\t}\n\n\tif state.IsContract(common.BytesToAddress(accountAddress[:])) {\n\t\treturn nil, errors.New(\"does not support contract address!\")\n\t}\n\t// Look up the wallet containing the requested abi\n\taccount := accounts.Account{Address: *accountAddress}\n\twallet, err := s.b.AccountManager().Find(account)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tseed := wallet.Accounts()[0].Tk\n\tpkgs := lstate.CurrentLState().GetPkgs(seed.ToUint512(), packed)\n\tif len(pkgs) > 0 {\n\t\tresult := []map[string]interface{}{}\n\t\tfor _, p := range pkgs {\n\t\t\tpkg := map[string]interface{}{}\n\n\t\t\tpkg[\"id\"] = p.Pkg.Z.Pack.Id\n\t\t\tpkg[\"packed\"] = packed\n\t\t\tto := getLocalAccountAddressByPkr(wallets, common.BytesToAddress(p.Pkg.Z.Pack.PKr[:]))\n\t\t\tif to != nil {\n\t\t\t\tpkg[\"to_addr\"] = to\n\t\t\t} else {\n\t\t\t\tpkg[\"to\"] = common.BytesToAddress(p.Pkg.Z.Pack.PKr[:]).String()\n\t\t\t}\n\t\t\tif (p.Key != c_type.Uint256{}) {\n\t\t\t\tpkg[\"key\"] = p.Key\n\t\t\t\tasset := map[string]interface{}{}\n\t\t\t\tif p.Pkg.O.Asset.Tkn != nil {\n\t\t\t\t\ttkn := map[string]interface{}{}\n\t\t\t\t\ttkn[\"currency\"] = strings.Trim(string(p.Pkg.O.Asset.Tkn.Currency[:]), zerobyte)\n\t\t\t\t\ttkn[\"value\"] = p.Pkg.O.Asset.Tkn.Value\n\t\t\t\t\tasset[\"tkn\"] = tkn\n\t\t\t\t}\n\t\t\t\tif p.Pkg.O.Asset.Tkt != nil {\n\t\t\t\t\ttkt := map[string]interface{}{}\n\t\t\t\t\ttkt[\"category\"] = strings.Trim(string(p.Pkg.O.Asset.Tkt.Category[:]), zerobyte)\n\t\t\t\t\ttkt[\"value\"] = p.Pkg.O.Asset.Tkt.Value\n\t\t\t\t\tasset[\"tkt\"] = tkt\n\t\t\t\t}\n\n\t\t\t\tpkg[\"asset\"] = asset\n\n\t\t\t}\n\t\t\tif id != nil {\n\t\t\t\tif p.Pkg.Z.Pack.Id == *id {\n\t\t\t\t\treturn pkg, nil\n\t\t\t\t} else {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresult = append(result, pkg)\n\t\t\t}\n\n\t\t}\n\t\treturn result, nil\n\t}\n\treturn nil, nil\n}\n**/\nfunc (s *PublicBlockChainAPI) WatchPkg(ctx context.Context, id c_type.Uint256, key c_type.Uint256) (map[string]interface{}, error) {\n\n\tpkg_o, pkr, err := txs.WatchPkg(&id, &key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tpkg := map[string]interface{}{}\n\tpkg[\"id\"] = id\n\tpkg[\"key\"] = key\n\tpkg[\"to\"] = common.BytesToAddress(pkr[:]).String()\n\n\tasset := map[string]interface{}{}\n\tif pkg_o.Asset.Tkn != nil {\n\t\ttkn := map[string]interface{}{}\n\t\ttkn[\"currency\"] = strings.Trim(string(pkg_o.Asset.Tkn.Currency[:]), zerobyte)\n\t\ttkn[\"value\"] = pkg_o.Asset.Tkn.Value\n\t\tasset[\"tkn\"] = tkn\n\t}\n\tif pkg_o.Asset.Tkt != nil {\n\t\ttkt := map[string]interface{}{}\n\t\ttkt[\"category\"] = strings.Trim(string(pkg_o.Asset.Tkt.Category[:]), zerobyte)\n\t\ttkt[\"value\"] = pkg_o.Asset.Tkt.Value\n\t\tasset[\"tkt\"] = tkt\n\t}\n\n\tpkg[\"asset\"] = asset\n\n\treturn pkg, nil\n}\n\nfunc (s *PublicBlockChainAPI) GetBlockInfo(ctx context.Context, start hexutil.Uint64, count hexutil.Uint64) ([]txtool.Block, error) {\n\tblock, err := s.b.GetBlocksInfo(uint64(start), uint64(count))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn block, err\n}\n\nfunc (s *PublicBlockChainAPI) GetAnchor(ctx context.Context, roots []c_type.Uint256) ([]txtool.Witness, error) {\n\twitness, err := s.b.GetAnchor(roots)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn witness, err\n}\n\n// GetBlockByNumber returns the requested block. When blockNr is -1 the chain head is returned. When fullTx is true all\n// transactions in the block are returned in full detail, otherwise only the transaction hash is returned.\nfunc (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, blockNr rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) {\n\tblock, err := s.b.BlockByNumber(ctx, blockNr)\n\tif block != nil {\n\t\tresponse, err := s.rpcOutputBlock(block, true, fullTx)\n\t\tif err == nil && blockNr == rpc.PendingBlockNumber {\n\t\t\t// Pending blocks need to nil out a few fields\n\t\t\tfor _, field := range []string{\"hash\", \"nonce\", \"miner\"} {\n\t\t\t\tresponse[field] = nil\n\t\t\t}\n\t\t}\n\t\treturn response, err\n\t}\n\treturn nil, err\n}\n\n//pow reward\nfunc (s *PublicBlockChainAPI) GetBlockRewardByNumber(ctx context.Context, blockNr rpc.BlockNumber) [3]hexutil.Big {\n\tvar res [3]hexutil.Big\n\tzero := big.NewInt(0)\n\tif block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {\n\t\trewards := GetBlockReward(block)\n\t\tres[0] = hexutil.Big(*rewards[0])\n\t\tres[1] = hexutil.Big(*rewards[1])\n\t\tres[2] = hexutil.Big(*zero)\n\t}\n\treturn res\n}\n\n//block reward\nfunc (s *PublicBlockChainAPI) GetBlockTotalRewardByNumber(ctx context.Context, blockNr rpc.BlockNumber) hexutil.Big {\n\n\treward := big.NewInt(0)\n\tblock, _ := s.b.BlockByNumber(ctx, blockNr)\n\tif block != nil {\n\t\tpows := GetBlockReward(block)\n\t\tfor _, p := range pows {\n\t\t\treward.Add(reward, p)\n\t\t}\n\t}\n\tif block != nil && blockNr >= 1300000 {\n\n\t\tshareNum := stake.BlockShareNum(s.b.ChainDb(), block.Hash())\n\t\tif shareNum == 0 {\n\t\t\treturn hexutil.Big(*reward)\n\t\t}\n\t\tsolo, total := stake.GetPosRewardBySize(shareNum, blockNr.Int64())\n\t\tfor _, v := range block.Header().CurrentVotes {\n\t\t\tif v.IsPool {\n\t\t\t\treward.Add(reward, total)\n\t\t\t} else {\n\t\t\t\treward.Add(reward, solo)\n\t\t\t}\n\t\t}\n\t\tfor _, v := range block.Header().ParentVotes {\n\t\t\tif v.IsPool {\n\t\t\t\treward.Add(reward, total)\n\t\t\t} else {\n\t\t\t\treward.Add(reward, solo)\n\t\t\t}\n\t\t}\n\t}\n\treturn hexutil.Big(*reward)\n\n}\n\n// GetBlockByHash returns the requested block. When fullTx is true all transactions in the block are returned in full\n// detail, otherwise only the transaction hash is returned.\nfunc (s *PublicBlockChainAPI) GetBlockByHash(ctx context.Context, blockHash common.Hash, fullTx bool) (map[string]interface{}, error) {\n\tblock, err := s.b.GetBlock(ctx, blockHash)\n\tif block != nil {\n\t\treturn s.rpcOutputBlock(block, true, fullTx)\n\t}\n\treturn nil, err\n}\n\n// GetCode returns the code stored at the given address in the state for the given block number.\nfunc (s *PublicBlockChainAPI) GetCode(ctx context.Context, address ContractAddress, blockNr rpc.BlockNumber) (hexutil.Bytes, error) {\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr)\n\tif state == nil || err != nil {\n\t\treturn nil, err\n\t}\n\tvar contractAddr common.Address\n\tcopy(contractAddr[:], address[:])\n\tcode := state.GetCode(contractAddr)\n\treturn code, state.Error()\n}\n\ntype Smbol string\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (s Smbol) MarshalText() ([]byte, error) {\n\treturn []byte(strings.ToUpper(string(s))), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler\nfunc (s *Smbol) UnmarshalText(input []byte) error {\n\t*s = Smbol(strings.ToUpper(string(input)))\n\treturn nil\n}\n\nfunc (s *Smbol) IsEmpty() bool {\n\treturn (strings.TrimSpace(string(*s)) == \"\")\n}\n\nfunc (s *Smbol) IsNotEmpty() bool {\n\treturn !s.IsEmpty()\n}\n\nfunc (s *Smbol) IsSero() bool {\n\treturn (strings.ToUpper(strings.TrimSpace(string(*s))) == params.DefaultCurrency)\n}\n\nfunc (s *Smbol) IsNotSero() bool {\n\treturn !s.IsSero()\n}\n\nfunc (s Smbol) String() string {\n\treturn string(s)\n}\n\n// CallArgs represents the arguments for a call.\ntype CallArgs struct {\n\tFrom        *address.MixBase58Adrress `json:\"from\"`\n\tTo          *AllMixedAddress          `json:\"to\"`\n\tGasCurrency Smbol                     `json:\"gasCy\"` //default SERO\n\tGas         hexutil.Uint64            `json:\"gas\"`\n\tGasPrice    hexutil.Big               `json:\"gasPrice\"`\n\tValue       hexutil.Big               `json:\"value\"`\n\tData        hexutil.Bytes             `json:\"data\"`\n\tCurrency    Smbol                     `json:\"cy\"`\n\tDynamic     bool                      `json:\"dy\"` //contract address parameters are dynamically generated.\n\tCategory    Smbol                     `json:\"catg\"`\n\tTkt         *common.Hash              `json:\"tkt\"`\n}\n\nfunc (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, vmCfg vm.Config, timeout time.Duration) ([]byte, uint64, bool, error) {\n\tdefer func(start time.Time) { log.Debug(\"Executing EVM call finished\", \"runtime\", time.Since(start)) }(time.Now())\n\n\tstate, header, err := s.b.StateAndHeaderByNumber(ctx, blockNr)\n\n\tif state == nil || err != nil {\n\t\treturn nil, 0, false, err\n\t}\n\t// Set sender address or use a default if none specified\n\taddr := args.From\n\tif args.From == nil {\n\t\taddr = &address.MixBase58Adrress{}\n\t\tif wallets := s.b.AccountManager().Wallets(); len(wallets) > 0 {\n\t\t\tif accounts := wallets[0].Accounts(); len(accounts) > 0 {\n\t\t\t\tfromAddr := accounts[0].Address\n\t\t\t\t*addr = fromAddr[:]\n\t\t\t}\n\t\t}\n\t}\n\t// Set default gas & gas price if none were set\n\tgas, gasPrice := uint64(args.Gas), args.GasPrice.ToInt()\n\tif gas == 0 {\n\t\tgas = math.MaxUint64 / 2\n\t}\n\tif gasPrice.Sign() == 0 {\n\t\tgasPrice = new(big.Int).SetUint64(defaultGasPrice)\n\t}\n\n\tif args.GasCurrency.IsEmpty() {\n\t\targs.GasCurrency = Smbol(params.DefaultCurrency)\n\t}\n\n\t// Create new call message\n\t//args.Data = args.Data[2:]\n\tif args.Currency.IsEmpty() {\n\t\targs.Currency = Smbol(params.DefaultCurrency)\n\t}\n\n\tvar token *assets.Token\n\tvar ticket *assets.Ticket\n\tif args.Value.ToInt() != nil {\n\t\ttoken = &assets.Token{\n\t\t\tCurrency: *(common.BytesToHash(common.LeftPadBytes([]byte(args.Currency), 32)).HashToUint256()),\n\t\t\tValue:    *utils.U256(*args.Value.ToInt()).ToRef(),\n\t\t}\n\t}\n\tif args.Tkt != nil {\n\t\tticket = &assets.Ticket{\n\t\t\tCategory: *(common.BytesToHash(common.LeftPadBytes([]byte(args.Category), 32)).HashToUint256()),\n\t\t\tValue:    *args.Tkt.HashToUint256(),\n\t\t}\n\n\t}\n\tasset := assets.Asset{\n\t\tTkn: token,\n\t\tTkt: ticket,\n\t}\n\trand := c_type.RandUint128()\n\tvar to *common.Address\n\n\tif args.To != nil {\n\t\tto = &common.Address{}\n\t\tcopy(rand[:], args.To[:])\n\t\tif args.To.IsContract() {\n\t\t\tcopy(to[:], args.To[:])\n\t\t} else {\n\t\t\ttoPkr := args.To.ToPKr()\n\t\t\tcopy(to[:], toPkr[:])\n\t\t}\n\n\t}\n\tfee := new(big.Int).Mul(gasPrice, new(big.Int).SetUint64(gas))\n\tif args.To != nil && state.IsContract(common.BytesToAddress(args.To[:])) && args.GasCurrency.IsNotSero() {\n\t\tm, d := state.GetTokenRate(common.BytesToAddress(args.To[:]), string(args.GasCurrency))\n\t\tif m.Sign() == 0 || d.Sign() == 0 {\n\t\t\treturn nil, 0, false, errors.New(\"gasCurrency must be SERO or nil\")\n\t\t}\n\t\tstate.AddBalance(common.BytesToAddress(args.To[:]), \"SERO\", fee)\n\t\tfee = new(big.Int).Div(fee.Mul(fee, m), d)\n\t}\n\tfeeToken := assets.Token{\n\t\tutils.CurrencyToUint256(string(args.GasCurrency)),\n\t\tutils.U256(*fee),\n\t}\n\tvar fromPkr c_type.PKr\n\tif addr.IsPkr() {\n\t\tfromPkr = addr.ToPkr()\n\n\t} else {\n\t\tvar fromPk c_type.Uint512\n\t\tcopy(fromPk[:], *addr)\n\t\tfromPkr = superzk.Pk2PKr(&fromPk, rand.ToUint256().NewRef())\n\t}\n\n\tmsg := types.NewMessage(common.BytesToAddress(fromPkr[:]), to, 0, asset, feeToken, gasPrice, args.Data)\n\n\t// Setup context so it may be cancelled the call has completed\n\t// or, in case of unmetered gas, setup a context with a timeout.\n\tvar cancel context.CancelFunc\n\tif timeout > 0 {\n\t\tctx, cancel = context.WithTimeout(ctx, timeout)\n\t} else {\n\t\tctx, cancel = context.WithCancel(ctx)\n\t}\n\t// Make sure the context is cancelled when the call has completed\n\t// this makes sure resources are cleaned up.\n\tdefer cancel()\n\n\t// Get a new instance of the EVM.\n\tevm, vmError, err := s.b.GetEVM(ctx, msg, state, header, vmCfg)\n\tif err != nil {\n\t\treturn nil, 0, false, err\n\t}\n\t// Wait for the context to be done and cancel the evm. Even if the\n\t// EVM has finished, cancelling may be done (repeatedly)\n\tgo func() {\n\t\t<-ctx.Done()\n\t\tevm.Cancel()\n\t}()\n\n\t// Setup the gas pool (also for unmetered requests)\n\t// and apply the message.\n\tgp := new(core.GasPool).AddGas(math.MaxUint64)\n\tres, gas, failed, err := core.ApplyMessage(evm, msg, gp)\n\n\tif err := vmError(); err != nil {\n\n\t\treturn nil, 0, false, err\n\t}\n\t//if failed {\n\t//\tlog.Info(\"call error\", \"msg\", string(res))\n\t//}\n\t//log.Info(\"result\", \"data\", hexutil.Encode(res))\n\treturn res, gas, failed, err\n\n}\n\n// Call executes the given transaction on the state for the given block number.\n// It doesn't make and changes in the state/blockchain and is useful to execute and retrieve values.\nfunc (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber) (hexutil.Bytes, error) {\n\tresult, _, _, err := s.doCall(ctx, args, blockNr, vm.Config{}, 5*time.Second)\n\treturn (hexutil.Bytes)(result), err\n}\n\n// EstimateGas returns an estimate of the amount of gas needed to execute the\n// given transaction against the current pending block.\nfunc (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (hexutil.Uint64, error) {\n\t// Binary search the gas requirement, as it may be higher than the amount used\n\tvar (\n\t\tlo  uint64 = params.TxGas - 1\n\t\thi  uint64\n\t\tcap uint64\n\t)\n\tif uint64(args.Gas) >= params.TxGas {\n\t\thi = uint64(args.Gas)\n\t} else {\n\t\t// Retrieve the current pending block to act as the gas ceiling\n\t\tblock, err := s.b.BlockByNumber(ctx, rpc.LatestBlockNumber)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\thi = block.GasLimit()\n\t}\n\tcap = hi\n\n\t// Create a helper to check if a gas allowance results in an executable transaction\n\texecutable := func(gas uint64) bool {\n\t\targs.Gas = hexutil.Uint64(gas)\n\n\t\t_, _, failed, err := s.doCall(ctx, args, rpc.LatestBlockNumber, vm.Config{}, 0)\n\t\tif err != nil || failed {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}\n\t// Execute the binary search and hone in on an executable gas limit\n\tfor lo+1 < hi {\n\t\tmid := (hi + lo) / 2\n\t\tif !executable(mid) {\n\t\t\tlo = mid\n\t\t} else {\n\t\t\thi = mid\n\t\t}\n\t}\n\t// Reject the transaction as invalid if it still fails at the highest allowance\n\tif hi == cap {\n\t\tif !executable(hi) {\n\t\t\treturn 0, fmt.Errorf(\"gas required exceeds allowance or always failing transaction\")\n\t\t}\n\t}\n\treturn hexutil.Uint64(hi), nil\n}\n\nvar decimal_map sync.Map\n\nfunc (s *PublicBlockChainAPI) GetDecimal(ctx context.Context, tokenName string) (*hexutil.Uint, error) {\n\tvalue, ok := decimal_map.Load(tokenName)\n\tif ok {\n\t\treturn value.(*hexutil.Uint), nil\n\t}\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif tokenName == \"\" {\n\t\treturn nil, errors.New(\"tokenName can not be empty!\")\n\t} else {\n\t\tif tokenName == \"sero\" || tokenName == \"SERO\" {\n\t\t\treturn nil, errors.New(\"tokenName can not be sero!\")\n\n\t\t}\n\t}\n\tcontractAddress := state.GetContrctAddressByToken(tokenName)\n\tempty := common.Address{}\n\tif contractAddress == empty {\n\t\treturn nil, errors.New(tokenName + \"not exists!\")\n\t}\n\tvar to AllMixedAddress\n\tto.setBytes(contractAddress[:])\n\tcallArgs := CallArgs{\n\t\tTo: &to,\n\t}\n\tdecimals := NewSRC20Decimal(tokenName)\n\tfor _, d := range decimals {\n\t\tdata, err := d.Pack()\n\t\tif err != nil {\n\t\t\tlog.Info(\"SRC20Decimal\", \"pack\", d.method, err)\n\t\t\tcontinue\n\t\t}\n\t\tcallArgs.Data = data\n\t\tres, _, failed, err := s.doCall(ctx, callArgs, rpc.LatestBlockNumber, vm.Config{}, 0)\n\t\tif err != nil || failed {\n\t\t\tlog.Info(\"SRC20Decimal\", \"docall\", err)\n\t\t\tcontinue\n\t\t}\n\t\tdecimal, err := d.Unpack(res)\n\t\tif err != nil {\n\t\t\tlog.Info(\"SRC20Decimal\", \"unpack\", err)\n\t\t\tcontinue\n\t\t}\n\t\tresult := hexutil.Uint(*decimal)\n\t\tlog.Info(\"GetDecimal\", \"contract\", base58.Encode(contractAddress[:]), \"method\", d.method, \"decimal\", *decimal)\n\t\tdecimal_map.Store(tokenName, &result)\n\t\treturn &result, nil\n\n\t}\n\treturn nil, errors.New(\"contract not support SER20 decimals\")\n}\n\n// ExecutionResult groups all structured logs emitted by the EVM\n// while replaying a transaction in debug mode as well as transaction\n// execution status, the amount of gas used and the return value\ntype ExecutionResult struct {\n\tGas         uint64         `json:\"gas\"`\n\tFailed      bool           `json:\"failed\"`\n\tReturnValue string         `json:\"returnValue\"`\n\tStructLogs  []StructLogRes `json:\"structLogs\"`\n}\n\n// StructLogRes stores a structured log emitted by the EVM while replaying a\n// transaction in debug mode\ntype StructLogRes struct {\n\tPc      uint64             `json:\"pc\"`\n\tOp      string             `json:\"op\"`\n\tGas     uint64             `json:\"gas\"`\n\tGasCost uint64             `json:\"gasCost\"`\n\tDepth   int                `json:\"depth\"`\n\tError   error              `json:\"error,omitempty\"`\n\tStack   *[]string          `json:\"stack,omitempty\"`\n\tMemory  *[]string          `json:\"memory,omitempty\"`\n\tStorage *map[string]string `json:\"storage,omitempty\"`\n}\n\n// formatLogs formats EVM returned structured logs for json output\nfunc FormatLogs(logs []vm.StructLog) []StructLogRes {\n\tformatted := make([]StructLogRes, len(logs))\n\tfor index, trace := range logs {\n\t\tformatted[index] = StructLogRes{\n\t\t\tPc:      trace.Pc,\n\t\t\tOp:      trace.Op.String(),\n\t\t\tGas:     trace.Gas,\n\t\t\tGasCost: trace.GasCost,\n\t\t\tDepth:   trace.Depth,\n\t\t\tError:   trace.Err,\n\t\t}\n\t\tif trace.Stack != nil {\n\t\t\tstack := make([]string, len(trace.Stack))\n\t\t\tfor i, stackValue := range trace.Stack {\n\t\t\t\tstack[i] = fmt.Sprintf(\"%x\", math.PaddedBigBytes(stackValue, 32))\n\t\t\t}\n\t\t\tformatted[index].Stack = &stack\n\t\t}\n\t\tif trace.Memory != nil {\n\t\t\tmemory := make([]string, 0, (len(trace.Memory)+31)/32)\n\t\t\tfor i := 0; i+32 <= len(trace.Memory); i += 32 {\n\t\t\t\tmemory = append(memory, fmt.Sprintf(\"%x\", trace.Memory[i:i+32]))\n\t\t\t}\n\t\t\tformatted[index].Memory = &memory\n\t\t}\n\t\tif trace.Storage != nil {\n\t\t\tstorage := make(map[string]string)\n\t\t\tfor i, storageValue := range trace.Storage {\n\t\t\t\tstorage[fmt.Sprintf(\"%x\", i)] = fmt.Sprintf(\"%x\", storageValue)\n\t\t\t}\n\t\t\tformatted[index].Storage = &storage\n\t\t}\n\t}\n\treturn formatted\n}\n\n// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are\n// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain\n// transaction hashes.\nfunc RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) {\n\thead := b.Header() // copies the header once\n\tfields := map[string]interface{}{\n\t\t\"number\":           (*hexutil.Big)(head.Number),\n\t\t\"hash\":             b.Hash(),\n\t\t\"licr\":             hexutil.Bytes(head.Licr.Proof[:]),\n\t\t\"parentHash\":       head.ParentHash,\n\t\t\"nonce\":            head.Nonce,\n\t\t\"mixHash\":          head.MixDigest,\n\t\t\"logsBloom\":        head.Bloom,\n\t\t\"stateRoot\":        head.Root,\n\t\t\"miner\":            head.Coinbase,\n\t\t\"difficulty\":       (*hexutil.Big)(head.Difficulty),\n\t\t\"extraData\":        hexutil.Bytes(head.Extra),\n\t\t\"size\":             hexutil.Uint64(b.Size()),\n\t\t\"gasLimit\":         hexutil.Uint64(head.GasLimit),\n\t\t\"gasUsed\":          hexutil.Uint64(head.GasUsed),\n\t\t\"timestamp\":        (*hexutil.Big)(head.Time),\n\t\t\"transactionsRoot\": head.TxHash,\n\t\t\"receiptsRoot\":     head.ReceiptHash,\n\t\t\"currentVotes\":     head.CurrentVotes,\n\t\t\"parentVotes\":      head.ParentVotes,\n\t}\n\n\tif inclTx {\n\t\tformatTx := func(tx *types.Transaction) (interface{}, error) {\n\t\t\treturn tx.Hash(), nil\n\t\t}\n\t\tif fullTx {\n\t\t\tformatTx = func(tx *types.Transaction) (interface{}, error) {\n\t\t\t\treturn newRPCTransactionFromBlockHash(b, tx.Hash()), nil\n\t\t\t}\n\t\t}\n\t\ttxs := b.Transactions()\n\t\ttransactions := make([]interface{}, len(txs))\n\t\tvar err error\n\t\tfor i, tx := range txs {\n\t\t\tif transactions[i], err = formatTx(tx); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tfields[\"transactions\"] = transactions\n\t}\n\n\treturn fields, nil\n}\n\n// rpcOutputBlock uses the generalized output filler, then adds the total difficulty field, which requires\n// a `PublicBlockchainAPI`.\nfunc (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) {\n\tfields, err := RPCMarshalBlock(b, inclTx, fullTx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfields[\"totalDifficulty\"] = (*hexutil.Big)(s.b.GetTd(b.Hash()))\n\treturn fields, err\n}\n\n// RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction\ntype RPCTransaction struct {\n\tBlockHash        common.Hash     `json:\"blockHash\"`\n\tBlockNumber      *hexutil.Big    `json:\"blockNumber\"`\n\tFrom             PKrAddress      `json:\"from\"`\n\tGas              hexutil.Uint64  `json:\"gas\"`\n\tGasPrice         *hexutil.Big    `json:\"gasPrice\"`\n\tHash             common.Hash     `json:\"hash\"`\n\tInput            hexutil.Bytes   `json:\"input\"`\n\tNonce            hexutil.Uint64  `json:\"nonce\"`\n\tTo               *common.Address `json:\"to\"`\n\tTransactionIndex hexutil.Uint    `json:\"transactionIndex\"`\n\tValue            *hexutil.Big    `json:\"value\"`\n\tStx              *stx.T          `json:\"stx\"`\n}\n\nfunc addressToPKrAddress(addr common.Address) (ret PKrAddress) {\n\tcopy(ret[:], addr[:])\n\treturn\n}\n\n// newRPCTransaction returns a transaction that will serialize to the RPC\n// representation, with the given location metadata set (if available).\nfunc newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64) *RPCTransaction {\n\t//var abi types.Signer = types.FrontierSigner{}\n\n\t//from, _ := types.Sender(abi, tx)\n\n\tto := tx.To()\n\n\tif to != nil && bytes.Equal(to[:], (&common.Address{})[:]) {\n\t\tto = nil\n\t}\n\tresult := &RPCTransaction{\n\t\tFrom:     addressToPKrAddress(tx.From()),\n\t\tGas:      hexutil.Uint64(tx.Gas()),\n\t\tGasPrice: (*hexutil.Big)(tx.GasPrice()),\n\t\tHash:     tx.Hash(),\n\t\tInput:    hexutil.Bytes(tx.Data()),\n\t\tTo:       to,\n\t\tStx:      tx.Stxt(),\n\t}\n\tif blockHash != (common.Hash{}) {\n\t\tresult.BlockHash = blockHash\n\t\tresult.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber))\n\t\tresult.TransactionIndex = hexutil.Uint(index)\n\t}\n\treturn result\n}\n\n// newRPCPendingTransaction returns a pending transaction that will serialize to the RPC representation\nfunc newRPCPendingTransaction(tx *types.Transaction) *RPCTransaction {\n\treturn newRPCTransaction(tx, common.Hash{}, 0, 0)\n}\n\n// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation.\nfunc newRPCTransactionFromBlockIndex(b *types.Block, index uint64) *RPCTransaction {\n\ttxs := b.Transactions()\n\tif index >= uint64(len(txs)) {\n\t\treturn nil\n\t}\n\treturn newRPCTransaction(txs[index], b.Hash(), b.NumberU64(), index)\n}\n\n// newRPCRawTransactionFromBlockIndex returns the bytes of a transaction given a block and a transaction index.\nfunc newRPCRawTransactionFromBlockIndex(b *types.Block, index uint64) hexutil.Bytes {\n\ttxs := b.Transactions()\n\tif index >= uint64(len(txs)) {\n\t\treturn nil\n\t}\n\tblob, _ := rlp.EncodeToBytes(txs[index])\n\treturn blob\n}\n\n// newRPCTransactionFromBlockHash returns a transaction that will serialize to the RPC representation.\nfunc newRPCTransactionFromBlockHash(b *types.Block, hash common.Hash) *RPCTransaction {\n\tfor idx, tx := range b.Transactions() {\n\t\tif tx.Hash() == hash {\n\t\t\treturn newRPCTransactionFromBlockIndex(b, uint64(idx))\n\t\t}\n\t}\n\treturn nil\n}\n\n// PublicTransactionPoolAPI exposes methods for the RPC interface\ntype PublicTransactionPoolAPI struct {\n\tb         Backend\n\tnonceLock *AddrLocker\n}\n\n// NewPublicTransactionPoolAPI creates a new RPC service with methods specific for the transaction pool.\nfunc NewPublicTransactionPoolAPI(b Backend, nonceLock *AddrLocker) *PublicTransactionPoolAPI {\n\treturn &PublicTransactionPoolAPI{b, nonceLock}\n}\n\nfunc (s *PublicTransactionPoolAPI) AddressUnlocked(accountAddr address.MixBase58Adrress) (bool, error) {\n\t// Look up the wallet containing the requested signer\n\taccount, err := s.b.AccountManager().FindAccountByPkr(accountAddr.ToPkr())\n\tif err != nil {\n\t\treturn false, err\n\t}\n\twallet, err := s.b.AccountManager().Find(account)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn wallet.AddressUnlocked(account)\n\n}\n\n// GetBlockTransactionCountByNumber returns the number of transactions in the block with the given block number.\nfunc (s *PublicTransactionPoolAPI) GetBlockTransactionCountByNumber(ctx context.Context, blockNr rpc.BlockNumber) *hexutil.Uint {\n\tif block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {\n\t\tn := hexutil.Uint(len(block.Transactions()))\n\t\treturn &n\n\t}\n\treturn nil\n}\n\n// GetBlockTransactionCountByHash returns the number of transactions in the block with the given hash.\nfunc (s *PublicTransactionPoolAPI) GetBlockTransactionCountByHash(ctx context.Context, blockHash common.Hash) *hexutil.Uint {\n\tif block, _ := s.b.GetBlock(ctx, blockHash); block != nil {\n\t\tn := hexutil.Uint(len(block.Transactions()))\n\t\treturn &n\n\t}\n\treturn nil\n}\n\n// GetTransactionByBlockNumberAndIndex returns the transaction for the given block number and index.\nfunc (s *PublicTransactionPoolAPI) GetTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) *RPCTransaction {\n\tif block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {\n\t\treturn newRPCTransactionFromBlockIndex(block, uint64(index))\n\t}\n\treturn nil\n}\n\n// GetTransactionByBlockHashAndIndex returns the transaction for the given block hash and index.\nfunc (s *PublicTransactionPoolAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) *RPCTransaction {\n\tif block, _ := s.b.GetBlock(ctx, blockHash); block != nil {\n\t\treturn newRPCTransactionFromBlockIndex(block, uint64(index))\n\t}\n\treturn nil\n}\n\n// GetRawTransactionByBlockNumberAndIndex returns the bytes of the transaction for the given block number and index.\nfunc (s *PublicTransactionPoolAPI) GetRawTransactionByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) hexutil.Bytes {\n\tif block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil {\n\t\treturn newRPCRawTransactionFromBlockIndex(block, uint64(index))\n\t}\n\treturn nil\n}\n\n// GetRawTransactionByBlockHashAndIndex returns the bytes of the transaction for the given block hash and index.\nfunc (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) hexutil.Bytes {\n\tif block, _ := s.b.GetBlock(ctx, blockHash); block != nil {\n\t\treturn newRPCRawTransactionFromBlockIndex(block, uint64(index))\n\t}\n\treturn nil\n}\n\n// GetTransactionByHash returns the transaction for the given hash\nfunc (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) *RPCTransaction {\n\t// Try to return an already finalized transaction\n\tif tx, blockHash, blockNumber, index := rawdb.ReadTransaction(s.b.ChainDb(), hash); tx != nil {\n\t\treturn newRPCTransaction(tx, blockHash, blockNumber, index)\n\t}\n\t// No finalized transaction, try to retrieve it from the pool\n\tif tx := s.b.GetPoolTransaction(hash); tx != nil {\n\t\treturn newRPCPendingTransaction(tx)\n\t}\n\t// Transaction unknown, return as such\n\treturn nil\n}\n\n// GetRawTransactionByHash returns the bytes of the transaction for the given hash.\nfunc (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) {\n\tvar tx *types.Transaction\n\n\t// Retrieve a finalized transaction, or a pooled otherwise\n\tif tx, _, _, _ = rawdb.ReadTransaction(s.b.ChainDb(), hash); tx == nil {\n\t\tif tx = s.b.GetPoolTransaction(hash); tx == nil {\n\t\t\t// Transaction not found anywhere, abort\n\t\t\treturn nil, nil\n\t\t}\n\t}\n\t// Serialize to RLP and return\n\treturn rlp.EncodeToBytes(tx)\n}\n\nfunc (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, rawTx hexutil.Bytes) error {\n\tvar tx *types.Transaction = &types.Transaction{}\n\n\trlp.DecodeBytes(rawTx[:], tx)\n\n\terr := s.b.SendTx(ctx, tx)\n\tif err != nil {\n\t\tlog.Info(\"commitTx\", \"txHash\", tx.Hash().String(), \"err\", err)\n\t}\n\treturn err\n}\n\n// GetTransactionReceipt returns the transaction receipt for the given transaction hash.\nfunc (s *PublicTransactionPoolAPI) GetTransactionReceipt(ctx context.Context, hash common.Hash) (map[string]interface{}, error) {\n\ttx, blockHash, blockNumber, index := rawdb.ReadTransaction(s.b.ChainDb(), hash)\n\tif tx == nil {\n\t\treturn nil, nil\n\t}\n\treceipts, err := s.b.GetReceipts(ctx, blockHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(receipts) <= int(index) {\n\t\treturn nil, nil\n\t}\n\treceipt := receipts[index]\n\n\t//var abi types.Signer = types.FrontierSigner{}\n\t//\n\t//from, _ := types.Sender(abi, tx)\n\n\tto := tx.To()\n\n\tif to != nil && bytes.Equal(to[:], (&common.Address{})[:]) {\n\t\tto = nil\n\t}\n\n\tfields := map[string]interface{}{\n\t\t\"blockHash\":         blockHash,\n\t\t\"blockNumber\":       hexutil.Uint64(blockNumber),\n\t\t\"transactionHash\":   hash,\n\t\t\"transactionIndex\":  hexutil.Uint64(index),\n\t\t\"from\":              addressToPKrAddress(tx.From()),\n\t\t\"to\":                to,\n\t\t\"gasUsed\":           hexutil.Uint64(receipt.GasUsed),\n\t\t\"cumulativeGasUsed\": hexutil.Uint64(receipt.CumulativeGasUsed),\n\t\t\"contractAddress\":   nil,\n\t\t\"logs\":              receipt.Logs,\n\t\t\"logsBloom\":         receipt.Bloom,\n\t\t\"shareId\":           receipt.ShareId,\n\t\t\"poolId\":            receipt.PoolId,\n\t}\n\n\t// Assign receipt status or post state.\n\tif len(receipt.PostState) > 0 {\n\t\tfields[\"root\"] = hexutil.Bytes(receipt.PostState)\n\t}\n\tfields[\"status\"] = hexutil.Uint(receipt.Status)\n\tif receipt.Logs == nil {\n\t\tfields[\"logs\"] = [][]*types.Log{}\n\t}\n\t// If the ContractAddress is 20 0x0 bytes, assume it is not a contract creation\n\tif receipt.ContractAddress != (common.Address{}) {\n\t\tfields[\"contractAddress\"] = base58.Encode(receipt.ContractAddress[:64])\n\t}\n\treturn fields, nil\n}\n\n// SendTxArgs represents the arguments to sumbit a new transaction into the transaction pool.\ntype SendTxArgs struct {\n\tFrom        address.MixBase58Adrress `json:\"from\"`\n\tTo          *AllBase58Adrress        `json:\"to\"`\n\tGas         *hexutil.Uint64          `json:\"gas\"`\n\tGasCurrency Smbol                    `json:\"gasCy\"` //default SERO\n\tGasPrice    *hexutil.Big             `json:\"gasPrice\"`\n\tValue       *hexutil.Big             `json:\"value\"`\n\tData        *hexutil.Bytes           `json:\"data\"`\n\tCurrency    Smbol                    `json:\"cy\"`\n\tDynamic     bool                     `json:\"dy\"` //contract address parameters are dynamically generated.\n\tCategory    Smbol                    `json:\"catg\"`\n\tTkt         *common.Hash             `json:\"tkt\"`\n\tMemo        string                   `json:\"Memo\"`\n}\n\n// setDefaults is a helper function that fills in default values for unspecified tx fields.\nfunc (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error {\n\tif args.Gas == nil {\n\t\targs.Gas = new(hexutil.Uint64)\n\t\t*(*uint64)(args.Gas) = 90000\n\t}\n\n\tif args.GasCurrency.IsEmpty() {\n\t\targs.GasCurrency = Smbol(params.DefaultCurrency)\n\t}\n\n\tif strings.Trim(args.Memo, \"\") != \"\" {\n\t\tb := []byte(args.Memo)\n\t\tif len(b) > 64 {\n\t\t\treturn errors.New(\"args memo is too long,it's limited 64 bytes\")\n\t\t}\n\t}\n\n\tstate, _, err := b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif args.To != nil && !state.IsContract(common.BytesToAddress(args.To.Bytes())) {\n\t\tvar input []byte\n\t\tif args.Data != nil {\n\t\t\tinput = *args.Data\n\t\t}\n\n\t\tif len(input) > 0 {\n\t\t\treturn errors.New(`not create or call contract data must be nil`)\n\t\t}\n\n\t}\n\n\tif args.To == nil || !state.IsContract(common.BytesToAddress(args.To.Bytes())) {\n\t\tif args.GasCurrency.IsNotEmpty() && args.GasCurrency.IsNotSero() {\n\t\t\treturn errors.New(`GasCurrency must be null or SERO`)\n\t\t}\n\t} else {\n\t\tif args.GasCurrency.IsNotSero() {\n\t\t\tm, d := state.GetTokenRate(common.BytesToAddress(args.To.Bytes()), string(args.GasCurrency))\n\t\t\tif m.Sign() == 0 || d.Sign() == 0 {\n\t\t\t\treturn errors.New(\"the smart contract dose not support alternative payment!\")\n\t\t\t}\n\t\t}\n\t}\n\n\tif args.GasPrice == nil {\n\t\tprice, err := b.SuggestPrice(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\targs.GasPrice = (*hexutil.Big)(price)\n\t} else {\n\t\tif args.GasPrice.ToInt().Sign() == 0 {\n\t\t\treturn errors.New(`gasPrice can not be zero`)\n\t\t}\n\t}\n\n\tif args.Currency.IsEmpty() {\n\t\targs.Currency = Smbol(params.DefaultCurrency)\n\t}\n\n\tif args.Value == nil {\n\t\targs.Value = new(hexutil.Big)\n\t}\n\tif args.Category.IsEmpty() {\n\t\tif args.Tkt != nil {\n\t\t\treturn errors.New(fmt.Sprintf(\"tx without tkt:%s catg\", args.Tkt))\n\t\t}\n\t} else {\n\t\tif args.Tkt == nil {\n\t\t\treturn errors.New(fmt.Sprintf(\"tx without %s tkt\", args.Category))\n\t\t}\n\t}\n\tif args.To == nil {\n\t\t// Contract creation\n\t\tvar input []byte\n\t\tif args.Data != nil {\n\t\t\tinput = *args.Data\n\t\t}\n\n\t\tif len(input) < 18 {\n\t\t\treturn errors.New(`contract creation without any data provided`)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (args *SendTxArgs) toAsset() assets.Asset {\n\tvar token *assets.Token\n\tvar ticket *assets.Ticket\n\tif args.Value.ToInt().Sign() > 0 {\n\t\ttoken = &assets.Token{\n\t\t\tCurrency: *(common.BytesToHash(common.LeftPadBytes([]byte(args.Currency), 32)).HashToUint256()),\n\t\t\tValue:    *utils.U256(*args.Value.ToInt()).ToRef(),\n\t\t}\n\t}\n\tif args.Tkt != nil {\n\t\tticket = &assets.Ticket{\n\t\t\tCategory: *(common.BytesToHash(common.LeftPadBytes([]byte(args.Category), 32)).HashToUint256()),\n\t\t\tValue:    *args.Tkt.HashToUint256(),\n\t\t}\n\t}\n\treturn assets.Asset{\n\t\tTkn: token,\n\t\tTkt: ticket,\n\t}\n}\n\nfunc (args *SendTxArgs) toTxParam(state *state.StateDB, fromAccount accounts.Account) (txParam prepare.PreTxParam) {\n\n\tvar refundPkr c_type.PKr\n\ttxParam.GasPrice = (*big.Int)(args.GasPrice)\n\ttxParam.From = fromAccount.Address.ToUint512()\n\n\tfeevalue := new(big.Int).Mul(((*big.Int)(args.GasPrice)), new(big.Int).SetUint64(uint64(*args.Gas)))\n\tasset := args.toAsset()\n\tif args.To == nil {\n\t\tfromRand := c_type.Uint256{}\n\t\tcopy(fromRand[:16], (*args.Data)[:16])\n\t\ttxParam.Cmds = prepare.Cmds{}\n\t\tcontractCmd := stx.ContractCmd{asset, nil, *args.Data}\n\t\ttxParam.Cmds.Contract = &contractCmd\n\t\tif args.From.IsPkr() {\n\t\t\trefundPkr = args.From.ToPkr()\n\t\t} else {\n\t\t\trefundPkr = fromAccount.GetPkr(&fromRand)\n\t\t}\n\n\t} else if state.IsContract(common.BytesToAddress(args.To.Bytes())) {\n\t\tfromRand := c_type.Uint256{}\n\t\tcopy(fromRand[:16], args.To.Bytes()[:16])\n\t\tif args.From.IsPkr() {\n\t\t\trefundPkr = args.From.ToPkr()\n\t\t} else {\n\t\t\tif args.Dynamic {\n\t\t\t\trefundPkr = fromAccount.GetPkr(nil)\n\t\t\t} else {\n\t\t\t\trefundPkr = fromAccount.GetPkr(&fromRand)\n\t\t\t}\n\t\t}\n\t\tif args.GasCurrency.IsNotSero() {\n\t\t\tm, d := state.GetTokenRate(common.BytesToAddress(args.To.Bytes()), string(args.GasCurrency))\n\t\t\tfeevalue = new(big.Int).Div(feevalue.Mul(feevalue, m), d)\n\t\t}\n\t\ttxParam.Cmds = prepare.Cmds{}\n\t\tvar data []byte\n\t\tif args.Data != nil {\n\t\t\tdata = *args.Data\n\t\t}\n\t\tcontractCmd := stx.ContractCmd{asset, args.To.ToPkr(true).NewRef(), data}\n\t\ttxParam.Cmds.Contract = &contractCmd\n\t} else {\n\t\trefundPkr = args.From.ToPkr()\n\t\treceptions := []prepare.Reception{{Addr: args.To.ToPkr(false), Asset: asset}}\n\t\ttxParam.Receptions = receptions\n\t}\n\tfeeAsset := assets.Token{\n\t\tutils.CurrencyToUint256(string(args.GasCurrency)),\n\t\tutils.U256(*feevalue),\n\t}\n\ttxParam.Fee = feeAsset\n\ttxParam.RefundTo = &refundPkr\n\treturn\n\n}\n\nfunc defaultFee(gasPrice *hexutil.Big, gas *hexutil.Uint64) *big.Int {\n\treturn new(big.Int).Mul(((*big.Int)(gasPrice)), new(big.Int).SetUint64(uint64(*gas)))\n}\n\nfunc stringToUint512(str string) c_type.Uint512 {\n\tvar ret c_type.Uint512\n\tb := []byte(str)\n\tif len(b) > len(ret) {\n\t\tb = b[len(b)-len(ret):]\n\t}\n\tcopy(ret[len(ret)-len(b):], b)\n\treturn ret\n}\n\nfunc (args *SendTxArgs) toCreatePkg(state *state.StateDB, fromAccount accounts.Account) (txParam prepare.PreTxParam) {\n\tvar toPkr c_type.PKr\n\ttxParam.GasPrice = (*big.Int)(args.GasPrice)\n\ttxParam.From = fromAccount.Address.ToUint512()\n\tfeevalue := defaultFee(args.GasPrice, args.Gas)\n\tasset := args.toAsset()\n\n\tif state.IsContract(common.BytesToAddress(args.To.Bytes())) {\n\t\ttoPkr = args.To.ToPkr(true)\n\t} else {\n\t\ttoPkr = args.To.ToPkr(false)\n\t}\n\tfeeToken := assets.Token{\n\t\tutils.CurrencyToUint256(string(args.GasCurrency)),\n\t\tutils.U256(*feevalue),\n\t}\n\ttxParam.RefundTo = fromAccount.GetPkr(nil).NewRef()\n\ttxParam.Fee = feeToken\n\tpkgCreateCmd := prepare.PkgCreateCmd{c_type.RandUint256(), toPkr, asset, stringToUint512(args.Memo)}\n\ttxParam.Cmds.PkgCreate = &pkgCreateCmd\n\treturn\n\n}\n\n// submitTransaction is a helper function that submits tx to txPool and logs a message.\nfunc submitTransaction(ctx context.Context, b Backend, tx *types.Transaction, to *common.Address) (common.Hash, error) {\n\tif err := b.SendTx(ctx, tx); err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tlog.Info(\"Submitted transaction\", \"fullhash\", tx.Hash().Hex(), \"recipient\", to)\n\treturn tx.Hash(), nil\n}\n\n// SendTransaction creates a transaction for the given argument, sign it and submit it to the\n// transaction pool.\nfunc (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) {\n\ts.nonceLock.mu.Lock()\n\tdefer s.nonceLock.mu.Unlock()\n\t// Look up the wallet containing the requested abi\n\treturn commitSendTxArgs(ctx, s.b, args)\n\n}\n\nfunc (s *PublicTransactionPoolAPI) GenTx(ctx context.Context, param GenTxArgs) (*txtool.GTxParam, error) {\n\tif err := param.check(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn s.b.GenTx(param.toTxParam())\n}\n\nfunc commitSendTxArgs(ctx context.Context, b Backend, args SendTxArgs) (common.Hash, error) {\n\n\t// Set some sanity defaults and terminate on failure\n\tif err := args.setDefaults(ctx, b); err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tstate, _, err := b.StateAndHeaderByNumber(ctx, -1)\n\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tfromAccount, err := b.AccountManager().FindAccountByPkr(args.From.ToPkr())\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tif !seroparam.IsExchange() {\n\t\treturn common.Hash{}, errors.New(\"not support\")\n\t} else {\n\t\ttxParam := args.toTxParam(state, fromAccount)\n\t\ttxhash, err := commitPreTx(txParam, b, args.To)\n\t\tif err != nil {\n\t\t\treturn common.Hash{}, err\n\t\t} else {\n\t\t\treturn txhash, nil\n\t\t}\n\t}\n}\n\nfunc commitPreTx(txParam prepare.PreTxParam, b Backend, to *AllBase58Adrress) (common.Hash, error) {\n\tpretx, gtx, err := exchange.CurrentExchange().GenTxWithSign(txParam)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\terr = b.CommitTx(gtx)\n\tif err != nil {\n\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\treturn common.Hash{}, err\n\t}\n\ttxhash := common.BytesToHash(gtx.Hash[:])\n\tif to == nil {\n\t\tlog.Info(\"create contract  transaction\", \"fullhash\", txhash.Hex())\n\t} else {\n\t\tlog.Info(\"Submitted transaction\", \"fullhash\", txhash.Hex(), \"recipient\", to.String())\n\t}\n\treturn txhash, nil\n\n}\n\nfunc (s *PublicTransactionPoolAPI) CommitTx(ctx context.Context, args *txtool.GTx) error {\n\treturn s.b.CommitTx(args)\n}\n\nfunc (s *PublicTransactionPoolAPI) GetCommittedTx(ctx context.Context, txHash c_type.Uint256) (*txtool.GTx, error) {\n\treturn s.b.GetCommittedTx(txHash)\n}\n\nfunc (s *PublicTransactionPoolAPI) ResendCommittedTx(ctx context.Context, txHash c_type.Uint256) error {\n\treturn s.b.ReSendCommittedTx(txHash)\n}\n\nfunc (s *PublicTransactionPoolAPI) CommitContractTx(ctx context.Context, args *txtool.GTx) (hash common.Hash, err error) {\n\terr = s.b.CommitTx(args)\n\tif err != nil {\n\t\treturn\n\t}\n\thash = common.BytesToHash(args.Hash[:])\n\treturn\n}\n\nfunc (s *PublicTransactionPoolAPI) ReSendTransaction(ctx context.Context, txhash common.Hash) (common.Hash, error) {\n\n\ttx := s.b.GetPoolTransaction(txhash)\n\n\tif tx == nil {\n\t\treturn common.Hash{}, errors.New(\"can not find tx \" + txhash.Hex() + \" in local txpool!\")\n\t}\n\n\treturn submitTransaction(ctx, s.b, tx, nil)\n}\n\n/**\nfunc (s *PublicTransactionPoolAPI) CreatePkg(ctx context.Context, args SendTxArgs) (common.Hash, error) {\n\ts.nonceLock.mu.Lock()\n\tdefer s.nonceLock.mu.Unlock()\n\t// Look up the wallet containing the requested abi\n\taccount := accounts.Account{Address: args.From}\n\n\twallet, err := s.b.AccountManager().Find(account)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tif args.To == nil {\n\t\treturn common.Hash{}, errors.New(\"to can not be nil\")\n\t}\n\n\t// Set some sanity defaults and terminate on failure\n\tif err := args.setDefaults(ctx, s.b); err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tif args.GasCurrency.IsNotSero() {\n\t\treturn common.Hash{}, errors.New(\"create pkg gasCurrency must be sero\")\n\t}\n\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tif seroparam.IsExchange() {\n\t\ttxParam := args.toCreatePkg(state)\n\t\tpretx, gtx, err := exchange.CurrentExchange().GenTxWithSign(txParam)\n\t\tif err != nil {\n\t\t\treturn common.Hash{}, err\n\t\t}\n\t\terr = s.b.CommitTx(gtx)\n\t\tif err != nil {\n\t\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\t\treturn common.Hash{}, err\n\t\t}\n\t\treturn common.BytesToHash(gtx.Hash[:]), nil\n\t} else {\n\t\t// Assemble the transaction and sign with the wallet\n\t\ttx, txt := args.toPkg(state)\n\t\tencrypted, err := wallet.EncryptTx(account, tx, txt, state)\n\t\tif err != nil {\n\t\t\treturn common.Hash{}, err\n\t\t}\n\t\treturn submitTransaction(ctx, s.b, encrypted, args.To)\n\t}\n\n}\n**/\ntype ClosePkgArgs struct {\n\tFrom     *address.MixBase58Adrress `json:\"from\"`\n\tGas      *hexutil.Uint64           `json:\"gas\"`\n\tGasPrice *hexutil.Big              `json:\"gasPrice\"`\n\tPkgId    *c_type.Uint256           `json:\"id\"`\n\tKey      *c_type.Uint256           `json:\"key\"`\n}\n\nfunc (args *ClosePkgArgs) setDefaults(ctx context.Context, b Backend) error {\n\n\tif args.Gas == nil {\n\t\targs.Gas = new(hexutil.Uint64)\n\t\t*(*uint64)(args.Gas) = 90000\n\t}\n\n\tif args.GasPrice == nil {\n\t\tprice, err := b.SuggestPrice(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\targs.GasPrice = (*hexutil.Big)(price)\n\t} else {\n\t\tif args.GasPrice.ToInt().Sign() == 0 {\n\t\t\treturn errors.New(`gasPrice can not be zero`)\n\t\t}\n\t}\n\tif args.PkgId == nil {\n\t\treturn errors.New(\"id can not be nil\")\n\t}\n\n\tif args.Key == nil {\n\t\treturn errors.New(\"key can not be nil\")\n\t}\n\n\treturn nil\n}\n\nfunc (args *ClosePkgArgs) toTxParam(fromAccount accounts.Account) (txParam prepare.PreTxParam) {\n\ttxParam.GasPrice = (*big.Int)(args.GasPrice)\n\tfeevalue := defaultFee(args.GasPrice, args.Gas)\n\tfeeToken := assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*feevalue),\n\t}\n\ttxParam.From = fromAccount.Address.ToUint512()\n\ttxParam.RefundTo = fromAccount.GetPkr(nil).NewRef()\n\ttxParam.Fee = feeToken\n\tpkgCloseCmd := prepare.PkgCloseCmd{*args.PkgId, *args.Key}\n\ttxParam.Cmds.PkgClose = &pkgCloseCmd\n\treturn\n\n}\n\ntype TransferPkgArgs struct {\n\tFrom     *address.MixBase58Adrress `json:\"from\"`\n\tGas      *hexutil.Uint64           `json:\"gas\"`\n\tGasPrice *hexutil.Big              `json:\"gasPrice\"`\n\tPkgId    *c_type.Uint256           `json:\"id\"`\n\tTo       *AllBase58Adrress         `json:\"To\"`\n}\n\nfunc (args *TransferPkgArgs) setDefaults(ctx context.Context, b Backend) error {\n\tif args.Gas == nil {\n\t\targs.Gas = new(hexutil.Uint64)\n\t\t*(*uint64)(args.Gas) = 90000\n\t}\n\n\tif args.GasPrice == nil {\n\t\tprice, err := b.SuggestPrice(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\targs.GasPrice = (*hexutil.Big)(price)\n\t} else {\n\t\tif args.GasPrice.ToInt().Sign() == 0 {\n\t\t\treturn errors.New(`gasPrice can not be zero`)\n\t\t}\n\t}\n\tif args.PkgId == nil {\n\t\treturn errors.New(\"id can not be nil\")\n\t}\n\n\tif args.To == nil {\n\t\treturn errors.New(\"to can not be nil\")\n\t}\n\n\treturn nil\n}\n\nfunc (args *TransferPkgArgs) toTransaction(state *state.StateDB) (*types.Transaction, *ztx.T, error) {\n\ttx := types.NewTransaction((*big.Int)(args.GasPrice), uint64(*args.Gas), nil)\n\tfee := new(big.Int).Mul(((*big.Int)(args.GasPrice)), new(big.Int).SetUint64(uint64(*args.Gas)))\n\tehash := tx.Ehash()\n\tvar pkr c_type.PKr\n\tif state.IsContract(common.BytesToAddress(args.To.Bytes())) {\n\t\tpkr = args.To.ToPkr(true)\n\t} else {\n\t\tpkr = args.To.ToPkr(false)\n\t}\n\n\ttxt := &ztx.T{\n\t\tFee: assets.Token{\n\t\t\tutils.CurrencyToUint256(params.DefaultCurrency),\n\t\t\tutils.U256(*fee),\n\t\t},\n\t\tPkgTransfer: &ztx.PkgTransfer{*args.PkgId, pkr},\n\t}\n\ttxt.Ehash = ehash\n\ttxt.FromRnd = c_type.RandUint256().NewRef()\n\treturn tx, txt, nil\n}\n\n// PendingTransactions returns the transactions that are in the transaction pool\n// and have a from address that is one of the accounts this node manages.\nfunc (s *PublicTransactionPoolAPI) PendingTransactions() ([]*RPCTransaction, error) {\n\tpending, err := s.b.GetPoolTransactions()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttransactions := make([]*RPCTransaction, 0, len(pending))\n\tfor _, tx := range pending {\n\t\t_, err := s.b.AccountManager().FindAccountByPkr(*tx.From().ToPKr())\n\t\tif err == nil {\n\t\t\ttransactions = append(transactions, newRPCPendingTransaction(tx))\n\t\t}\n\t}\n\treturn transactions, nil\n}\n\n// PublicDebugAPI is the collection of Ethereum APIs exposed over the public\n// debugging endpoint.\ntype PublicDebugAPI struct {\n\tb Backend\n}\n\n// NewPublicDebugAPI creates a new API definition for the public debug methods\n// of the Ethereum service.\nfunc NewPublicDebugAPI(b Backend) *PublicDebugAPI {\n\treturn &PublicDebugAPI{b: b}\n}\n\n// GetBlockRlp retrieves the RLP encoded for of a single block.\nfunc (api *PublicDebugAPI) GetBlockRlp(ctx context.Context, number uint64) (string, error) {\n\tblock, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number))\n\tif block == nil {\n\t\treturn \"\", fmt.Errorf(\"block #%d not found\", number)\n\t}\n\tencoded, err := rlp.EncodeToBytes(block)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fmt.Sprintf(\"%x\", encoded), nil\n}\n\n// PrintBlock retrieves a block and returns its pretty printed form.\nfunc (api *PublicDebugAPI) PrintBlock(ctx context.Context, number uint64) (string, error) {\n\tblock, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number))\n\tif block == nil {\n\t\treturn \"\", fmt.Errorf(\"block #%d not found\", number)\n\t}\n\treturn spew.Sdump(block), nil\n}\n\n// SeedHash retrieves the seed hash of a block.\nfunc (api *PublicDebugAPI) SeedHash(ctx context.Context, number uint64) (string, error) {\n\tblock, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number))\n\tif block == nil {\n\t\treturn \"\", fmt.Errorf(\"block #%d not found\", number)\n\t}\n\treturn fmt.Sprintf(\"0x%x\", ethash.SeedHash(number)), nil\n}\n\n// PrivateDebugAPI is the collection of Ethereum APIs exposed over the private\n// debugging endpoint.\ntype PrivateDebugAPI struct {\n\tb Backend\n}\n\n// NewPrivateDebugAPI creates a new API definition for the private debug methods\n// of the Ethereum service.\nfunc NewPrivateDebugAPI(b Backend) *PrivateDebugAPI {\n\treturn &PrivateDebugAPI{b: b}\n}\n\n// ChaindbProperty returns leveldb properties of the chain database.\nfunc (api *PrivateDebugAPI) ChaindbProperty(property string) (string, error) {\n\tldb, ok := api.b.ChainDb().(interface {\n\t\tLDB() *leveldb.DB\n\t})\n\tif !ok {\n\t\treturn \"\", fmt.Errorf(\"chaindbProperty does not work for memory databases\")\n\t}\n\tif property == \"\" {\n\t\tproperty = \"leveldb.stats\"\n\t} else if !strings.HasPrefix(property, \"leveldb.\") {\n\t\tproperty = \"leveldb.\" + property\n\t}\n\treturn ldb.LDB().GetProperty(property)\n}\n\nfunc (api *PrivateDebugAPI) ChaindbCompact() error {\n\tldb, ok := api.b.ChainDb().(interface {\n\t\tLDB() *leveldb.DB\n\t})\n\tif !ok {\n\t\treturn fmt.Errorf(\"chaindbCompact does not work for memory databases\")\n\t}\n\tfor b := byte(0); b < 255; b++ {\n\t\tlog.Info(\"Compacting chain database\", \"range\", fmt.Sprintf(\"0x%0.2X-0x%0.2X\", b, b+1))\n\t\terr := ldb.LDB().CompactRange(util.Range{Start: []byte{b}, Limit: []byte{b + 1}})\n\t\tif err != nil {\n\t\t\tlog.Error(\"Database compaction failed\", \"err\", err)\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetHead rewinds the head of the blockchain to a previous block.\nfunc (api *PrivateDebugAPI) SetHead(number hexutil.Uint64) {\n\tapi.b.SetHead(uint64(number))\n}\n\n// PublicNetAPI offers network related RPC methods\ntype PublicNetAPI struct {\n\tnet            *p2p.Server\n\tnetworkVersion uint64\n}\n\n// NewPublicNetAPI creates a new net API instance.\nfunc NewPublicNetAPI(net *p2p.Server, networkVersion uint64) *PublicNetAPI {\n\treturn &PublicNetAPI{net, networkVersion}\n}\n\n// Listening returns an indication if the node is listening for network connections.\nfunc (s *PublicNetAPI) Listening() bool {\n\treturn true // always listening\n}\n\n// PeerCount returns the number of connected peers\nfunc (s *PublicNetAPI) PeerCount() hexutil.Uint {\n\treturn hexutil.Uint(s.net.PeerCount())\n}\n\n// Version returns the current ethereum protocol version.\nfunc (s *PublicNetAPI) Version() string {\n\treturn fmt.Sprintf(\"%d\", s.networkVersion)\n}\n"
  },
  {
    "path": "internal/ethapi/api_abi.go",
    "content": "package ethapi\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\ntype PublicAbiAPI struct {\n}\n\nfunc decodeOutputParms(abiArgs abi.Arguments) (interface{}, bool) {\n\tfor _, arg := range abiArgs {\n\t\tswitch arg.Type.String() {\n\t\tcase \"address\":\n\t\t\treturn common.ContractAddress{}, true\n\t\tcase \"address[]\":\n\t\t\treturn []common.ContractAddress{}, true\n\t\tcase \"uint8\":\n\t\t\treturn hexutil.Uint8(0), false\n\t\tcase \"uint16\":\n\t\t\treturn hexutil.Uint16(0), false\n\t\tcase \"uint32\":\n\t\t\treturn hexutil.Uint32(0), false\n\t\tcase \"uint64\":\n\t\t\treturn hexutil.Uint64(0), false\n\t\tcase \"uint256\":\n\t\t\tvar big hexutil.Big\n\t\t\treturn big, false\n\t\tcase \"string\":\n\t\t\treturn string(\"\"), false\n\t\tcase \"string[]\":\n\t\t\treturn []string{}, false\n\t\tcase \"bool\":\n\t\t\tvar result bool\n\t\t\treturn result, false\n\t\tdefault:\n\t\t\treturn nil, false\n\t\t}\n\t}\n\treturn nil, false\n}\n\nfunc decodeResult(abiArgs abi.Arguments, result interface{}) interface{} {\n\tfor _, arg := range abiArgs {\n\t\tswitch arg.Type.String() {\n\t\tcase \"address\":\n\t\t\treturn result\n\t\tcase \"address[]\":\n\t\t\treturn result\n\t\tcase \"uint8\":\n\t\t\treturn hexutil.Uint64(result.(uint8))\n\t\tcase \"uint16\":\n\t\t\treturn hexutil.Uint64(result.(uint16))\n\t\tcase \"uint32\":\n\t\t\treturn hexutil.Uint64(result.(uint32))\n\t\tcase \"uint64\":\n\t\t\treturn hexutil.Uint64(result.(uint64))\n\t\tcase \"uint256\":\n\t\t\treturn hexutil.Big(*(result.(*big.Int)))\n\t\tcase \"string\":\n\t\t\treturn result\n\t\tcase \"string[]\":\n\t\t\treturn result\n\t\tcase \"bool\":\n\t\t\treturn result\n\t\tdefault:\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc encodeStringParams(abiArgs abi.Arguments, args []string) ([]interface{}, []PKrAddress, error) {\n\n\targsLen := len(args)\n\tpackArgs := make([]interface{}, argsLen)\n\taddress := []PKrAddress{}\n\tfor index, arg := range abiArgs {\n\t\tswitch arg.Type.String() {\n\t\tcase \"address\":\n\t\t\tvar addr AllMixedAddress\n\t\t\terr := addr.UnmarshalText([]byte(args[index]))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\t//caddr := (c_superzk.HashPKr(addr.ToPKr().NewRef()))\n\t\t\tpackArgs[index] = addr\n\t\t\taddress = append(address, addr.ToPKrAddress())\n\t\tcase \"address[]\":\n\t\t\tvar addrs []AllMixedAddress\n\t\t\terr := json.Unmarshal([]byte(args[index]), &addrs)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tpackArgs[index] = addrs\n\t\t\tpkrs := convertToAddr(addrs)\n\t\t\taddress = append(address, pkrs...)\n\n\t\tcase \"uint8\":\n\t\t\tvar num hexutil.Uint8\n\t\t\terr := num.UnmarshalText([]byte(args[index]))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tpackArgs[index] = uint8(num)\n\t\tcase \"uint16\":\n\t\t\tvar num hexutil.Uint16\n\t\t\terr := num.UnmarshalText([]byte(args[index]))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tpackArgs[index] = uint16(num)\n\t\tcase \"uint32\":\n\t\t\tvar num hexutil.Uint32\n\t\t\terr := num.UnmarshalText([]byte(args[index]))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tpackArgs[index] = uint32(num)\n\t\tcase \"uint64\":\n\t\t\tvar num hexutil.Uint64\n\t\t\terr := num.UnmarshalText([]byte(args[index]))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tpackArgs[index] = uint64(num)\n\t\tcase \"uint256\":\n\t\t\tvar num hexutil.Big\n\t\t\terr := num.UnmarshalText([]byte(args[index]))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tpackArgs[index] = num.ToInt()\n\t\tcase \"string\":\n\t\t\tpackArgs[index] = args[index]\n\t\tcase \"string[]\":\n\t\t\tstrs := []string{}\n\t\t\tvalue := strings.Replace(strings.Replace(args[index], \"[\", \"\", 1), \"]\", \"\", 1)\n\t\t\tvalues := strings.Split(value, \",\")\n\t\t\tfor _, vv := range values {\n\t\t\t\tstrs = append(strs, vv)\n\t\t\t}\n\t\t\tpackArgs[index] = strs\n\n\t\tcase \"bool\":\n\t\t\tswitch args[index] {\n\t\t\tcase \"true\":\n\t\t\t\tpackArgs[index] = true\n\t\t\tcase \"false\":\n\t\t\t\tpackArgs[index] = false\n\t\t\tdefault:\n\t\t\t\treturn nil, nil, errors.New(\"error args !\")\n\t\t\t}\n\n\t\tdefault:\n\t\t\treturn nil, nil, fmt.Errorf(\"unsupported arg type\")\n\t\t}\n\n\t}\n\n\treturn packArgs[:], address, nil\n}\n\nfunc PackMethod(abi *abi.ABI, contractAddr ContractAddress, methodName string, args []string) (hexutil.Bytes, error) {\n\tif abi == nil {\n\t\treturn hexutil.Bytes{}, errors.New(\"ABI can not be nil\")\n\t}\n\n\tmethod, exist := abi.Methods[methodName]\n\tif !exist {\n\t\treturn nil, fmt.Errorf(\"method '%s' not found\", methodName)\n\t}\n\tabiArgs := method.Inputs\n\tif len(abiArgs) != len(args) {\n\t\treturn nil, fmt.Errorf(\"argument count mismatch: %d for %d\", len(args), len(abiArgs))\n\t}\n\tpackArgs, address, err := encodeStringParams(abiArgs, args)\n\tinput, err := abi.Pack(methodName, packArgs...)\n\tif err != nil {\n\t\treturn hexutil.Bytes{}, err\n\t}\n\n\tprefix := [18]byte{}\n\taddressLen := len(address)\n\tcopy(prefix[:], contractAddr[:16])\n\tif len(address) > 1000 {\n\t\treturn nil, errors.New(\"too many address args\")\n\t}\n\tlenBytes := math.PaddedBigBytes(big.NewInt(int64(addressLen)), 2)\n\tcopy(prefix[16:], lenBytes[:])\n\tresult := []byte{}\n\tresult = append(result, prefix[:]...)\n\tfor _, addr := range address {\n\t\tresult = append(result, addr[:]...)\n\t}\n\tresult = append(result, input[:]...)\n\treturn hexutil.Bytes(result[:]), nil\n}\n\nfunc (s *PublicAbiAPI) PackMethod(abi *abi.ABI, contractAddr ContractAddress, methodName string, args []string) (hexutil.Bytes, error) {\n\treturn PackMethod(abi, contractAddr, methodName, args)\n}\n\nfunc convertToContractAddr(addrs []AllMixedAddress) (result []common.ContractAddress) {\n\tfor _, addr := range addrs {\n\t\tcaddr := (c_superzk.HashPKr(addr.ToPKr().NewRef()))\n\t\tresult = append(result, common.BytesToContractAddress(caddr[:]))\n\t}\n\treturn\n}\n\nfunc convertToAddr(addrs []AllMixedAddress) (result []PKrAddress) {\n\tfor _, addr := range addrs {\n\t\tresult = append(result, addr.ToPKrAddress())\n\t}\n\treturn\n}\n\nfunc PackConstruct(abi *abi.ABI, data hexutil.Bytes, args []string) (hexutil.Bytes, error) {\n\tif abi == nil {\n\t\treturn hexutil.Bytes{}, errors.New(\"ABI can not be nil\")\n\t}\n\n\tabiArgs := abi.Constructor.Inputs\n\tif len(abiArgs) != len(args) {\n\t\treturn nil, fmt.Errorf(\"argument count mismatch: %d for %d\", len(args), len(abiArgs))\n\t}\n\tpackArgs, address, err := encodeStringParams(abiArgs, args)\n\tif err != nil {\n\t\treturn hexutil.Bytes{}, err\n\t}\n\tinput, err := abi.Pack(\"\", packArgs...)\n\tif err != nil {\n\t\treturn hexutil.Bytes{}, err\n\t}\n\n\tprefix := [18]byte{}\n\taddressLen := len(address)\n\trand := c_type.RandUint128()\n\tcopy(prefix[:], rand[:])\n\tif len(address) > 1000 {\n\t\treturn nil, errors.New(\"too many address args\")\n\t}\n\tlenBytes := math.PaddedBigBytes(big.NewInt(int64(addressLen)), 2)\n\tcopy(prefix[16:], lenBytes[:])\n\tresult := []byte{}\n\tresult = append(result, prefix[:]...)\n\tfor _, addr := range address {\n\t\tresult = append(result, addr[:]...)\n\t}\n\tfmt.Printf(hexutil.Encode(data))\n\tresult = append(result, data[:]...)\n\tresult = append(result, input[:]...)\n\treturn hexutil.Bytes(result[:]), nil\n}\n\nfunc (s *PublicAbiAPI) PackConstruct(abi *abi.ABI, data hexutil.Bytes, args []string) (hexutil.Bytes, error) {\n\n\treturn PackConstruct(abi, data, args)\n\n}\n\nfunc UnPack(abi *abi.ABI, name string, output hexutil.Bytes) (interface{}, error) {\n\tif abi == nil {\n\t\treturn hexutil.Bytes{}, errors.New(\"ABI can not be nil\")\n\t}\n\tif method, ok := abi.Methods[name]; ok {\n\t\tmarshalledValues, err := method.Outputs.UnpackValues(output)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn marshalledValues, nil\n\t} else {\n\t\treturn nil, errors.New(\"can not find method=\" + name)\n\t}\n\treturn nil, nil\n}\n\nfunc (s *PublicAbiAPI) UnPack(abi *abi.ABI, name string, output hexutil.Bytes) (interface{}, error) {\n\treturn UnPack(abi, name, output)\n}\n"
  },
  {
    "path": "internal/ethapi/api_exchange.go",
    "content": "package ethapi\n\nimport (\n\t\"context\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\t\"github.com/sero-cash/go-sero/common/address\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\n\t\"github.com/sero-cash/go-sero/rpc\"\n\n\t\"math/big\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-sero/log\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/wallet/exchange\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\ntype PublicExchangeAPI struct {\n\tb Backend\n}\n\nfunc (s *PublicExchangeAPI) GetPkSynced(ctx context.Context, pk *address.PKAddress) (map[string]interface{}, error) {\n\tif pk == nil {\n\t\treturn nil, errors.New(\"pk can not be nil\")\n\t}\n\tcurrentPKBlock, err := s.b.GetPkNumber(pk.ToUint512())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprogress := s.b.Downloader().Progress()\n\tif progress.CurrentBlock >= progress.HighestBlock {\n\t\tprogress.HighestBlock = progress.CurrentBlock\n\t}\n\texchangeInstance := exchange.CurrentExchange()\n\tif exchangeInstance == nil {\n\t\treturn nil, errors.New(\"exchange mode no start\")\n\t}\n\n\tnumbers := exchangeInstance.GetUtxoNum(pk.ToUint512())\n\n\t// Otherwise gather the block sync stats\n\treturn map[string]interface{}{\n\t\t\"currentPKBlock\": currentPKBlock,\n\t\t\"confirmedBlock\": seroparam.DefaultConfirmedBlock(),\n\t\t\"currentBlock\":   progress.CurrentBlock,\n\t\t\"highestBlock\":   progress.HighestBlock,\n\t\t\"utxoCount\":      numbers,\n\t}, nil\n\n}\n\nfunc (s *PublicExchangeAPI) GetPkr(ctx context.Context, pk address.PKAddress, index *c_type.Uint256) (pkrAdd PKrAddress, e error) {\n\n\tpkr, err := s.b.GetPkr(pk.ToUint512().NewRef(), index)\n\tif err != nil {\n\t\te = err\n\t\treturn\n\t}\n\tcopy(pkrAdd[:], pkr[:])\n\treturn\n}\n\nfunc (s *PublicExchangeAPI) GetLockedBalances(pk address.PKAddress) map[string]*Big {\n\tresult := map[string]*Big{}\n\tbalances := s.b.GetLockedBalances(pk.ToUint512())\n\tfor k, v := range balances {\n\t\tresult[k] = (*Big)(v)\n\t}\n\treturn result\n}\n\nfunc (s *PublicExchangeAPI) GetMaxAvailable(pk address.PKAddress, currency Smbol) (amount *Big) {\n\treturn (*Big)(s.b.GetMaxAvailable(pk.ToUint512(), string(currency)))\n}\n\nfunc (s *PublicExchangeAPI) GetBalances(ctx context.Context, pk address.PKAddress) map[string]interface{} {\n\tresult := map[string]*Big{}\n\tret := make(map[string]interface{})\n\tbalances, tickets := s.b.GetBalances(pk.ToUint512())\n\tfor k, v := range balances {\n\t\tresult[k] = (*Big)(v)\n\t\tret[k] = (*Big)(v)\n\t}\n\tret[\"tkn\"] = result\n\tret[\"tkt\"] = tickets\n\treturn ret\n}\n\ntype ReceptionArgs struct {\n\tAddr     MixAdrress\n\tCurrency Smbol\n\tValue    *Big\n\tCategory Smbol\n\tTKt      *common.Hash\n}\n\nfunc MixAdrressToPkr(addr MixAdrress) c_type.PKr {\n\tpkr := c_type.PKr{}\n\tif len(addr) == 64 {\n\t\tpk := c_type.Uint512{}\n\t\tcopy(pk[:], addr[:])\n\t\tpkr = superzk.Pk2PKr(&pk, nil)\n\t} else {\n\t\tcopy(pkr[:], addr[:])\n\t}\n\treturn pkr\n}\n\nfunc (s *PublicExchangeAPI) GenTx(ctx context.Context, param GenTxArgs) (*txtool.GTxParam, error) {\n\tif err := param.check(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn s.b.GenTx(param.toTxParam())\n}\n\nfunc (s *PublicExchangeAPI) GenTxWithSign(ctx context.Context, param GenTxArgs) (*txtool.GTx, error) {\n\tif err := param.check(); err != nil {\n\t\treturn nil, err\n\t}\n\ttxParam, tx, e := exchange.CurrentExchange().GenTxWithSign(param.toTxParam())\n\tif tx != nil {\n\t\tfor _, in := range txParam.Ins {\n\t\t\ttx.Roots = append(tx.Roots, in.Out.Root)\n\t\t}\n\t}\n\treturn tx, e\n}\n\nfunc pkrToPKrAddress(pkr c_type.PKr) PKrAddress {\n\tpkrAddress := PKrAddress{}\n\tcopy(pkrAddress[:], pkr[:])\n\treturn pkrAddress\n}\n\ntype Record struct {\n\tPkr      PKrAddress\n\tRoot     c_type.Uint256\n\tTxHash   c_type.Uint256\n\tNil      c_type.Uint256\n\tNum      uint64\n\tCurrency string\n\tValue    *Big\n}\n\nfunc (s *PublicExchangeAPI) GetTx(ctx context.Context, txHash c_type.Uint256) (map[string]interface{}, error) {\n\n\ttx, blockHash, blockNumber, index := rawdb.ReadTransaction(s.b.ChainDb(), common.BytesToHash(txHash[:]))\n\tif tx == nil {\n\t\treturn nil, nil\n\t}\n\treceipts, err := s.b.GetReceipts(ctx, blockHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(receipts) <= int(index) {\n\t\treturn nil, nil\n\t}\n\n\tutxos, err := s.b.GetRecordsByTxHash(txHash)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treceipt := receipts[index]\n\tgasUsed := receipt.GasUsed\n\tfee := new(big.Int).Mul(tx.GasPrice(), big.NewInt(int64(gasUsed)))\n\tfields := map[string]interface{}{\n\t\t\"BlockNumber\": blockNumber,\n\t\t\"BlockHash\":   blockHash,\n\t\t\"TxHash\":      common.BytesToHash(txHash[:]),\n\t\t\"Fee\":         (*utils.U256)(fee),\n\t\t\"GasPrice\":    (*utils.U256)(tx.GasPrice()),\n\t\t\"GasUsed\":     gasUsed,\n\t}\n\n\tblock, _ := s.b.BlockByNumber(ctx, rpc.BlockNumber(blockNumber))\n\tif block != nil {\n\t\tfields[\"Timestamp\"] = block.Header().Time.Uint64()\n\t} else {\n\t\tfields[\"Timestamp\"] = 0\n\t}\n\trecords := []Record{}\n\tfor _, utxo := range utxos {\n\t\tif utxo.Asset.Tkn != nil {\n\t\t\trecords = append(records, Record{Pkr: pkrToPKrAddress(utxo.Pkr), Root: utxo.Root, TxHash: utxo.TxHash, Nil: utxo.Nil, Num: utxo.Num, Currency: common.BytesToString(utxo.Asset.Tkn.Currency[:]), Value: (*Big)(utxo.Asset.Tkn.Value.ToIntRef())})\n\t\t}\n\t}\n\touts := []map[string]interface{}{}\n\tfor _, record := range records {\n\t\tr := map[string]interface{}{}\n\t\tr[\"Pkr\"] = record.Pkr\n\t\tr[\"Currency\"] = record.Currency\n\t\tr[\"Value\"] = record.Value\n\t\tr[\"Root\"] = record.Root\n\t\touts = append(outs, r)\n\t}\n\tfields[\"Outs\"] = outs\n\n\tins := []c_type.Uint256{}\n\tif tx.Stxt().Tx0() != nil {\n\t\tfor _, in := range tx.Stxt().Tx0().Desc_O.Ins {\n\t\t\tins = append(ins, in.Root)\n\t\t}\n\t\tfor _, in := range tx.Stxt().Tx0().Desc_Z.Ins {\n\t\t\tif root := exchange.CurrentExchange().GetRootByNil(in.Trace); root != nil {\n\t\t\t\tins = append(ins, *root)\n\t\t\t}\n\t\t}\n\t}\n\tfor _, in := range tx.Stxt().Tx1.Ins_C {\n\t\tif root := exchange.CurrentExchange().GetRootByNil(in.Nil); root != nil {\n\t\t\tins = append(ins, *root)\n\t\t}\n\t}\n\tfor _, in := range tx.Stxt().Tx1.Ins_P {\n\t\tins = append(ins, in.Root)\n\t}\n\tfor _, in := range tx.Stxt().Tx1.Ins_P0 {\n\t\tins = append(ins, in.Root)\n\t}\n\tfields[\"Ins\"] = ins\n\n\treturn fields, nil\n\n}\nfunc (s *PublicExchangeAPI) GetRecords(ctx context.Context, begin, end uint64, address *MixAdrress) (records []Record, err error) {\n\n\tvar utxos []exchange.Utxo\n\tif address == nil || len(*address) == 0 {\n\t\tutxos, err = s.b.GetRecordsByPk(nil, begin, end)\n\t} else {\n\t\taddr := *address\n\t\tif len(addr) == 64 {\n\t\t\tvar pk c_type.Uint512\n\t\t\tcopy(pk[:], addr[:])\n\n\t\t\tutxos, err = s.b.GetRecordsByPk(&pk, begin, end)\n\t\t} else if len(addr) == 96 {\n\t\t\tvar pkr c_type.PKr\n\t\t\tcopy(pkr[:], addr[:])\n\t\t\tutxos, err = s.b.GetRecordsByPkr(pkr, begin, end)\n\t\t} else {\n\t\t\treturn records, errors.New(\"address is error\")\n\t\t}\n\t}\n\n\tif err != nil {\n\t\treturn\n\t}\n\n\tfor _, utxo := range utxos {\n\t\tif utxo.Asset.Tkn != nil {\n\t\t\trecords = append(records, Record{Pkr: pkrToPKrAddress(utxo.Pkr), Root: utxo.Root, TxHash: utxo.TxHash, Nil: utxo.Nil, Num: utxo.Num, Currency: common.BytesToString(utxo.Asset.Tkn.Currency[:]), Value: (*Big)(utxo.Asset.Tkn.Value.ToIntRef())})\n\t\t}\n\t}\n\n\treturn\n}\n\ntype MergeArgs struct {\n\tFrom     address.PKAddress\n\tTo       *PKrAddress\n\tCurrency Smbol\n\tZcount   uint64\n\tLeft     uint64\n\tIcount   *uint64\n}\n\nfunc (args MergeArgs) ToMergParam() *exchange.MergeParam {\n\tmergeParam := exchange.MergeParam{}\n\tif args.To != nil {\n\t\tmergeParam.To = args.To.ToPKr()\n\t}\n\tmergeParam.From = args.From.ToUint512()\n\tmergeParam.Currency = string(args.Currency)\n\tmergeParam.Zcount = args.Zcount\n\tmergeParam.Left = args.Left\n\tif args.Icount != nil {\n\t\tmergeParam.Icount = *args.Icount\n\t} else {\n\t\tmergeParam.Icount = 0\n\t}\n\treturn &mergeParam\n\n}\nfunc (args MergeArgs) Check() error {\n\tif args.Currency == \"\" {\n\t\treturn errors.New(\"cy can not be nil\")\n\t}\n\tif args.To != nil {\n\t\tif !superzk.IsPKrValid(args.To.ToPKr()) {\n\t\t\treturn errors.New(\"To is not a valid pkr\")\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (s *PublicExchangeAPI) GenMergeTx(ctx context.Context, args MergeArgs) (txParam *txtool.GTxParam, e error) {\n\tif e = args.Check(); e != nil {\n\t\treturn\n\t}\n\n\texchangeInstance := exchange.CurrentExchange()\n\tif exchangeInstance == nil {\n\t\treturn nil, errors.New(\"exchange mode no start\")\n\t}\n\treturn exchangeInstance.GenMergeTx(args.ToMergParam())\n}\n\nfunc (s *PublicExchangeAPI) Merge(ctx context.Context, pk *address.PKAddress, cy Smbol) (map[string]interface{}, error) {\n\tif pk == nil {\n\t\treturn nil, errors.New(\"pk can not be nil\")\n\t}\n\tif cy == \"\" {\n\t\treturn nil, errors.New(\"cy can not be nil\")\n\n\t}\n\texchangeInstance := exchange.CurrentExchange()\n\tif exchangeInstance == nil {\n\t\treturn nil, errors.New(\"exchange mode no start\")\n\t}\n\tcount, hash, err := exchangeInstance.Merge(pk.ToUint512().NewRef(), string(cy), true)\n\tlog.Info(\"merge query utxo\", \"cy=\", cy, \"count=\", count)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlog.Info(\"merge query utxo\", \"count=\", count)\n\ttxhash := common.Hash{}\n\tcopy(txhash[:], hash[:])\n\treturn map[string]interface{}{\n\t\t\"utxoCount\": count,\n\t\t\"txhash\":    txhash,\n\t}, nil\n}\n\nfunc validAddress(addr MixAdrress) (bool, error) {\n\tif len(addr) != 64 && len(addr) != 96 {\n\t\treturn false, errors.Errorf(\"invalid addr %v\", hexutil.Encode(addr[:]))\n\t}\n\n\tif len(addr) == 64 {\n\t\tpk := c_type.Uint512{}\n\t\tcopy(pk[:], addr[:])\n\t\tif !superzk.IsPKValid(&pk) {\n\t\t\treturn false, errors.Errorf(\"invalid pk %v\", hexutil.Encode(addr[:]))\n\t\t}\n\t}\n\tif len(addr) == 96 {\n\t\tpkr := c_type.PKr{}\n\t\tcopy(pkr[:], addr[:])\n\t\tif !superzk.IsPKrValid(&pkr) {\n\t\t\treturn false, errors.Errorf(\"invalid  pkr %v\", hexutil.Encode(addr[:]))\n\t\t}\n\t}\n\treturn true, nil\n}\n\nfunc (s *PublicExchangeAPI) ValidAddress(ctx context.Context, addr address.MixBase58Adrress) (bool, error) {\n\tif len(addr) != 64 && len(addr) != 96 {\n\t\treturn false, errors.Errorf(\"invalid addr %v\", base58.Encode(addr[:]))\n\t}\n\n\tif len(addr) == 64 {\n\t\tpk := c_type.Uint512{}\n\t\tcopy(pk[:], addr[:])\n\t\tif !superzk.IsPKValid(&pk) {\n\t\t\treturn false, errors.Errorf(\"invalid pk %v\", base58.Encode(addr[:]))\n\t\t}\n\t}\n\tif len(addr) == 96 {\n\t\tpkr := c_type.PKr{}\n\t\tcopy(pkr[:], addr[:])\n\t\tif !superzk.IsPKrValid(&pkr) {\n\t\t\treturn false, errors.Errorf(\"invalid  pkr %v\", base58.Encode(addr[:]))\n\t\t}\n\t}\n\treturn true, nil\n\n}\n\nfunc (s *PublicExchangeAPI) CommitTx(ctx context.Context, args *txtool.GTx) error {\n\treturn s.b.CommitTx(args)\n}\n\nfunc (s *PublicExchangeAPI) GetCommittedTx(ctx context.Context, txHash c_type.Uint256) (*txtool.GTx, error) {\n\treturn s.b.GetCommittedTx(txHash)\n}\n\nfunc (s *PublicExchangeAPI) ResendCommittedTx(ctx context.Context, txHash c_type.Uint256) error {\n\treturn s.b.ReSendCommittedTx(txHash)\n}\n\nfunc (s *PublicExchangeAPI) ClearUsedFlag(ctx context.Context, pk address.PKAddress) (count int, e error) {\n\texchangeInstance := exchange.CurrentExchange()\n\tif exchangeInstance == nil {\n\t\treturn 0, errors.New(\"exchange mode no start\")\n\t}\n\tcount = exchangeInstance.ClearUsedFlagForPK(pk.ToUint512().NewRef())\n\treturn\n}\n\nfunc (s *PublicExchangeAPI) ClearUsedFlagForRoot(ctx context.Context, roots []c_type.Uint256) (count int, e error) {\n\texchangeInstance := exchange.CurrentExchange()\n\tif exchangeInstance == nil {\n\t\treturn 0, errors.New(\"exchange mode no start\")\n\t}\n\tif len(roots) > 0 {\n\t\tfor _, root := range roots {\n\t\t\tcount += exchangeInstance.ClearUsedFlagForRoot(root)\n\t\t}\n\t}\n\treturn\n}\n\ntype Block struct {\n\tBlockNumber uint64\n\tBlockHash   c_type.Uint256\n\tIns         []c_type.Uint256\n\tOuts        []Record\n\tTxHashes    []common.Hash\n\tTimestamp   uint64\n}\n\nfunc (s *PublicExchangeAPI) GetBlocksInfo(ctx context.Context, start, end uint64) (blocks []Block, err error) {\n\texchangeInstance := exchange.CurrentExchange()\n\tif exchangeInstance == nil {\n\t\treturn nil, errors.New(\"exchange mode no start\")\n\t}\n\tinfos, err := exchangeInstance.GetBlocksInfo(start, end)\n\tif err != nil {\n\t\treturn\n\t}\n\tfor _, block := range infos {\n\n\t\touts := []Record{}\n\t\tfor _, utxo := range block.Outs {\n\t\t\trecord := Record{Pkr: pkrToPKrAddress(utxo.Pkr), Root: utxo.Root, TxHash: utxo.TxHash, Nil: utxo.Nil, Num: utxo.Num, Currency: common.BytesToString(utxo.Asset.Tkn.Currency[:]), Value: (*Big)(utxo.Asset.Tkn.Value.ToIntRef())}\n\t\t\touts = append(outs, record)\n\t\t}\n\n\t\tb, _ := s.b.BlockByNumber(ctx, rpc.BlockNumber(block.Num))\n\t\tif b == nil {\n\t\t\terr = errors.New(\"getBlockByNumber is nil\")\n\t\t\treturn\n\t\t}\n\n\t\tformatTx := func(tx *types.Transaction) (common.Hash, error) {\n\t\t\treturn tx.Hash(), nil\n\t\t}\n\t\ttxs := b.Transactions()\n\t\ttransactions := make([]common.Hash, len(txs))\n\t\tvar err error\n\t\tfor i, tx := range txs {\n\t\t\tif transactions[i], err = formatTx(tx); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\tblocks = append(blocks, Block{BlockNumber: block.Num, BlockHash: block.Hash, TxHashes: transactions, Ins: block.Ins, Outs: outs, Timestamp: b.Header().Time.Uint64()})\n\n\t}\n\treturn\n}\nfunc (s *PublicExchangeAPI) GetPkByPkr(ctx context.Context, pkr PKrAddress) (*address.PKAddress, error) {\n\twallets := s.b.AccountManager().Wallets()\n\tif len(wallets) == 0 {\n\t\treturn nil, nil\n\t}\n\tfor _, wallet := range wallets {\n\t\tif superzk.IsMyPKr(wallet.Accounts()[0].Tk.ToTk().NewRef(), pkr.ToPKr()) {\n\t\t\tpkAddr := wallet.Accounts()[0].Address\n\t\t\treturn &pkAddr, nil\n\t\t}\n\t}\n\treturn nil, nil\n}\n\nfunc (s *PublicExchangeAPI) GetBlockByNumber(ctx context.Context, blockNum *int64) (map[string]interface{}, error) {\n\tblockNr := rpc.LatestBlockNumber\n\tif blockNum != nil {\n\t\tblockNr = rpc.BlockNumber(*blockNum)\n\t}\n\tblock, err := s.b.BlockByNumber(ctx, blockNr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif block == nil {\n\t\treturn nil, nil\n\t}\n\n\tformatTx := func(tx *types.Transaction) (common.Hash, error) {\n\t\treturn tx.Hash(), nil\n\t}\n\ttxs := block.Transactions()\n\ttransactions := make([]common.Hash, len(txs))\n\tfor i, tx := range txs {\n\t\tif transactions[i], err = formatTx(tx); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tfields := map[string]interface{}{\n\t\t\"BlockNumber\": block.Header().Number.Uint64(),\n\t\t\"BlockHash\":   block.Hash(),\n\t\t\"ParentHash\":  block.ParentHash(),\n\t\t\"Timestamp\":   block.Header().Time.Uint64(),\n\t\t\"TxHashes\":    transactions,\n\t}\n\treturn fields, nil\n}\n\nfunc (s *PublicExchangeAPI) Seed2Sk(ctx context.Context, seed hexutil.Bytes, v *int) (c_type.Uint512, error) {\n\tif len(seed) != 32 {\n\t\treturn c_type.Uint512{}, errors.New(\"seed len must be 32\")\n\t}\n\n\tversion := 1\n\tif v != nil {\n\t\tversion = *v\n\t}\n\tif version > 2 || version < 1 {\n\t\treturn c_type.Uint512{}, errors.New(\"version must 1 or 2\")\n\t}\n\n\tvar sd c_type.Uint256\n\tcopy(sd[:], seed[:])\n\treturn superzk.Seed2Sk(&sd, version), nil\n}\n\nfunc (s *PublicExchangeAPI) SignTxWithSk(param txtool.GTxParam, SK c_type.Uint512) (txtool.GTx, error) {\n\treturn flight.SignTx(&SK, &param)\n}\n\nfunc (s *PublicExchangeAPI) Sk2Tk(ctx context.Context, sk c_type.Uint512) (ret address.TKAddress, err error) {\n\ttk, err := superzk.Sk2Tk(&sk)\n\tif err != nil {\n\t\treturn\n\t}\n\tcopy(ret[:], tk[:])\n\treturn\n}\n\nfunc (s *PublicExchangeAPI) Tk2Pk(ctx context.Context, tk address.TKAddress) (ret address.PKAddress, err error) {\n\tvar pk c_type.Uint512\n\tpk, err = superzk.Tk2Pk(tk.ToTk().NewRef())\n\tcopy(ret[:], pk[:])\n\treturn\n}\nfunc (s *PublicExchangeAPI) Pk2Pkr(ctx context.Context, pk address.PKAddress, index *c_type.Uint256) (PKrAddress, error) {\n\tempty := c_type.Uint256{}\n\tif index != nil {\n\t\tif (*index) == empty {\n\t\t\t*index = c_type.RandUint256()\n\t\t}\n\t}\n\tpkr := superzk.Pk2PKr(pk.ToUint512().NewRef(), index)\n\tvar pkrAddress PKrAddress\n\tcopy(pkrAddress[:], pkr[:])\n\treturn pkrAddress, nil\n}\n\nfunc (s *PublicExchangeAPI) FindRoots(pk address.PKAddress, cy Smbol, amount Big) (map[string]interface{}, error) {\n\tutxos, remaining := exchange.CurrentExchange().FindRoots(pk.ToUint512().NewRef(), string(cy), amount.ToInt())\n\tresult := map[string]interface{}{}\n\tresult[\"utxos\"] = utxos\n\tresult[\"remaining\"] = Big(remaining)\n\treturn result, nil\n}\n\nfunc (s *PublicExchangeAPI) GetOut(ctx context.Context, root c_type.Uint256) *prepare.Utxo {\n\treturn exchange.CurrentExchange().GetRoot(&root)\n}\n\nfunc (s *PublicExchangeAPI) SetBalancePkr(ctx context.Context, pkr PKrAddress) error {\n\taccount, err := s.b.AccountManager().FindAccountByPkr(*pkr.ToPKr())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn exchange.CurrentExchange().SetBalancePkr(account.Address.ToUint512().NewRef(), *pkr.ToPKr())\n}\n\nfunc (s *PublicExchangeAPI) IgnorePkrUtxos(ctx context.Context, pkr PKrAddress, ignore bool) (utxos []exchange.Utxo, e error) {\n\treturn exchange.CurrentExchange().IgnorePkrUtxos(*pkr.ToPKr(), ignore)\n}\n"
  },
  {
    "path": "internal/ethapi/api_flight.go",
    "content": "package ethapi\n\nimport (\n\t\"context\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\ntype PublicFlightAPI struct {\n\texchange *PublicExchangeAPI\n}\n\nfunc (s *PublicFlightAPI) GetBlocksInfo(ctx context.Context, start uint64, count uint64) ([]txtool.Block, error) {\n\tblock, err := flight.SRI_Inst.GetBlocksInfoByDelay(start, count, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn block, err\n}\n\nfunc (s *PublicFlightAPI) GetBlocksInfoWithDelay(ctx context.Context, start uint64, count, delay uint64) ([]txtool.Block, error) {\n\tblock, err := flight.SRI_Inst.GetBlocksInfoByDelay(start, count, delay)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn block, err\n}\n\nfunc (s *PublicFlightAPI) GetBlockByNumber(ctx context.Context, blockNum *int64) (map[string]interface{}, error) {\n\treturn s.exchange.GetBlockByNumber(ctx, blockNum)\n}\n\ntype GOutArgs struct {\n\tPKr   PKrAddress\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n}\n\nfunc (self *GOutArgs) ToOut() (ret txtool.GOut) {\n\tret.PKr = *self.PKr.ToPKr()\n\tret.Asset = self.Asset\n\tret.Memo = self.Memo\n\treturn\n}\n\ntype PreTxParamArgs struct {\n\tGas      uint64\n\tGasPrice uint64\n\tFrom     PKrAddress\n\tIns      []c_type.Uint256\n\tOuts     []GOutArgs\n}\n\nfunc (self *PreTxParamArgs) ToParam() (ret flight.PreTxParam) {\n\tret.Gas = self.Gas\n\tret.GasPrice = self.GasPrice\n\tret.From = *self.From.ToPKr()\n\tret.Ins = self.Ins\n\tfor _, out := range self.Outs {\n\t\tret.Outs = append(ret.Outs, out.ToOut())\n\t}\n\treturn\n}\n\nfunc (s *PublicFlightAPI) GenTxParam(ctx context.Context, param PreTxParamArgs, tk address.TKAddress) (p txtool.GTxParam, e error) {\n\tpreTxParam := param.ToParam()\n\treturn flight.GenTxParam(&preTxParam, tk.ToTk())\n}\n\nfunc (s *PublicFlightAPI) CommitTx(ctx context.Context, args *txtool.GTx) error {\n\treturn s.exchange.CommitTx(ctx, args)\n}\n\nfunc (s *PublicFlightAPI) Trace2Root(ctx context.Context, tk address.TKAddress, trace c_type.Uint256, base c_type.Uint256) (root c_type.Uint256, e error) {\n\tif r := flight.Trace2Root(tk.ToTk().NewRef(), &trace, &base); r != nil {\n\t\troot = *r\n\t\treturn\n\t} else {\n\t\te = errors.New(\"can not find the root\")\n\t\treturn\n\t}\n}\n\nfunc (s *PublicFlightAPI) GetOut(ctx context.Context, root c_type.Uint256) (out *txtool.Out, e error) {\n\trt := flight.GetOut(&root, 0)\n\tif rt == nil {\n\t\treturn\n\t} else {\n\t\tout = &txtool.Out{}\n\t\tout.Root = root\n\t\tout.State = *rt\n\t\treturn\n\t}\n}\n\nfunc (s *PublicFlightAPI) GetTx(ctx context.Context, txhash c_type.Uint256) (gtx txtool.GTx, e error) {\n\thash := common.Hash{}\n\tcopy(hash[:], txhash[:])\n\n\tvar tx *types.Transaction\n\ttx, _, _, _ = rawdb.ReadTransaction(s.exchange.b.ChainDb(), hash)\n\tif tx == nil {\n\t\ttx = s.exchange.b.GetPoolTransaction(hash)\n\t}\n\tif tx != nil {\n\t\tgtx.Hash = txhash\n\t\tgtx.Gas = hexutil.Uint64(tx.Gas())\n\t\tgtx.GasPrice = hexutil.Big(*tx.GasPrice())\n\t\tgtx.Tx = *tx.GetZZSTX()\n\t\treturn\n\t} else {\n\t\te = errors.New(\"tx not exist\")\n\t\treturn\n\t}\n}\n\ntype TxReceipt struct {\n\tState   uint64\n\tTxHash  c_type.Uint256\n\tBNum    uint64\n\tBHash   c_type.Uint256\n\tOuts    []c_type.Uint256\n\tNils    []c_type.Uint256\n\tPkgs    []c_type.Uint256\n\tShareId *c_type.Uint256\n\tPoolId  *c_type.Uint256\n}\n\nfunc (s *PublicFlightAPI) GetTxReceipt(ctx context.Context, txhash c_type.Uint256) (ret *TxReceipt, e error) {\n\thash := common.Hash{}\n\tcopy(hash[:], txhash[:])\n\n\ttx, bhash, bnum, tindex := rawdb.ReadTransaction(s.exchange.b.ChainDb(), hash)\n\tif tx == nil {\n\t\treturn\n\t}\n\n\treceipts, err := s.exchange.b.GetReceipts(ctx, bhash)\n\tif err != nil {\n\t\te = err\n\t\treturn\n\t}\n\tif len(receipts) <= int(tindex) {\n\t\te = errors.New(\"the receipts count is not match\")\n\t\treturn\n\t}\n\treceipt := receipts[tindex]\n\n\tblocks, err := flight.SRI_Inst.GetBlocksInfoByDelay(bnum, 1, 0)\n\tif err != nil {\n\t\te = err\n\t\treturn\n\t}\n\tif len(blocks) != 1 {\n\t\treturn\n\t}\n\tif blocks[0].Hash != *bhash.HashToUint256() {\n\t\te = errors.New(\"block hash is not match\")\n\t\treturn\n\t}\n\n\tret = &TxReceipt{}\n\n\tfor _, out := range blocks[0].Outs {\n\t\tif out.State.TxHash == txhash {\n\t\t\tret.Outs = append(ret.Outs, out.Root)\n\t\t}\n\t}\n\n\tif tx.GetZZSTX().Tx0() != nil {\n\t\tfor _, oin := range tx.GetZZSTX().Tx0().Desc_O.Ins {\n\t\t\tret.Nils = append(ret.Nils, oin.Root)\n\t\t}\n\n\t\tfor _, oin := range tx.GetZZSTX().Tx0().Desc_Z.Ins {\n\t\t\tret.Nils = append(ret.Nils, oin.Trace)\n\t\t}\n\t}\n\n\tif tx.GetZZSTX().Tx1.Count() > 0 {\n\t\tfor _, oin := range tx.GetZZSTX().Tx1.Ins_P0 {\n\t\t\tret.Nils = append(ret.Nils, oin.Root)\n\t\t}\n\n\t\tfor _, oin := range tx.GetZZSTX().Tx1.Ins_P {\n\t\t\tret.Nils = append(ret.Nils, oin.Nil)\n\t\t}\n\n\t\tfor _, oin := range tx.GetZZSTX().Tx1.Ins_C {\n\t\t\tret.Nils = append(ret.Nils, oin.Nil)\n\t\t}\n\t}\n\n\tif receipt.ShareId != nil {\n\t\tret.ShareId = receipt.ShareId.HashToUint256()\n\t}\n\tif receipt.PoolId != nil {\n\t\tret.PoolId = receipt.PoolId.HashToUint256()\n\t}\n\n\tret.State = receipt.Status\n\tret.BNum = bnum\n\tret.BHash = *bhash.HashToUint256()\n\tret.TxHash = txhash\n\n\treturn\n}\n"
  },
  {
    "path": "internal/ethapi/api_light_node.go",
    "content": "package ethapi\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/light\"\n)\n\ntype PublicLightNodeApi struct {\n\tb Backend\n}\n\nfunc (plna PublicLightNodeApi) GetOutsByPKr(ctx context.Context, addresses []*MixAdrress, start uint64, end *uint64) (outBlockResp light.BlockOutResp, e error) {\n\n\tpkrs := []c_type.PKr{}\n\tfor _, address := range addresses {\n\t\taddr := *address\n\t\tif len(addr) == 96 {\n\t\t\tvar pkr c_type.PKr\n\t\t\tcopy(pkr[:], addr[:])\n\t\t\tpkrs = append(pkrs, pkr)\n\t\t} else {\n\t\t\treturn outBlockResp, fmt.Errorf(\"address is invalid\")\n\t\t}\n\t}\n\n\treturn plna.b.GetOutByPKr(pkrs, start, end)\n}\n\nfunc (plna PublicLightNodeApi) GetPendingOuts(ctx context.Context, addresses []*PKrAddress) (outBlockResp light.BlockOutResp, e error) {\n\n\tpkrs := []c_type.PKr{}\n\tfor _, address := range addresses {\n\t\taddr := *address\n\t\tif len(addr) == 96 {\n\t\t\tvar pkr c_type.PKr\n\t\t\tcopy(pkr[:], addr[:])\n\t\t\tpkrs = append(pkrs, pkr)\n\t\t} else {\n\t\t\treturn outBlockResp, fmt.Errorf(\"address is invalid\")\n\t\t}\n\t}\n\treturn light.Current_light.GetPendingOuts(pkrs)\n\n}\n\nfunc (plna PublicLightNodeApi) CheckNil(Nils []c_type.Uint256) (nilResps []light.NilValue, e error) {\n\n\treturn plna.b.CheckNil(Nils)\n}\n"
  },
  {
    "path": "internal/ethapi/api_local.go",
    "content": "package ethapi\n\nimport (\n\t\"context\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\n\t\"github.com/tyler-smith/go-bip39\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-sero/common/address\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n)\n\ntype PublicLocalAPI struct {\n}\n\nfunc (s *PublicLocalAPI) DecOut(ctx context.Context, outs []txtool.Out, tk address.TKAddress) (douts []txtool.TDOut, e error) {\n\ttk_u64 := tk.ToTk()\n\tdouts = flight.DecOut(&tk_u64, outs)\n\treturn\n}\n\nfunc (s *PublicLocalAPI) ConfirmOutZ(ctx context.Context, key c_type.Uint256, outz stx_v0.Out_Z) (dout txtool.TDOut, e error) {\n\treturn flight.ConfirmOutZ(&key, &outz)\n}\n\nfunc (s *PublicLocalAPI) ConfirmOutC(ctx context.Context, key c_type.Uint256, outc stx_v1.Out_C) (dout txtool.TDOut, e error) {\n\treturn flight.ConfirmOutC(&key, &outc)\n}\n\nfunc (s *PublicLocalAPI) IsPkrValid(ctx context.Context, tk PKrAddress) error {\n\treturn nil\n}\n\nfunc (s *PublicLocalAPI) IsPkValid(ctx context.Context, tk address.PKAddress) error {\n\treturn nil\n}\n\nfunc (s *PublicLocalAPI) GenSeed(ctx context.Context) (hexutil.Bytes, error) {\n\tentropy, err := bip39.NewEntropy(256)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn hexutil.Bytes(entropy), nil\n}\n\nfunc (s *PublicLocalAPI) Seed2Mnemonic(ctx context.Context, seed hexutil.Bytes) (string, error) {\n\treturn bip39.NewMnemonic(seed[:])\n}\n\nfunc (s *PublicLocalAPI) CurrencyToId(ctx context.Context, currency string) (ret c_type.Uint256, e error) {\n\tret = flight.CurrencyToId(currency)\n\treturn\n}\n\nfunc (s *PublicLocalAPI) IdToCurrency(ctx context.Context, hex c_type.Uint256) (ret string, e error) {\n\tret = flight.IdToCurrency(&hex)\n\treturn\n}\n\nfunc (s *PublicLocalAPI) IsMyPkr(ctx context.Context, tk address.TKAddress, pkr PKrAddress) (ret bool, e error) {\n\tret = superzk.IsMyPKr(tk.ToTk().NewRef(), pkr.ToPKr().NewRef())\n\treturn\n}\n\nfunc (s *PublicLocalAPI) Seed2Sk(ctx context.Context, seed hexutil.Bytes, v *int) (c_type.Uint512, error) {\n\tif len(seed) != 32 {\n\t\treturn c_type.Uint512{}, errors.New(\"seed len must be 32\")\n\t}\n\tversion := 1\n\tif v != nil {\n\t\tversion = *v\n\t}\n\tif version > 2 || version < 1 {\n\t\treturn c_type.Uint512{}, errors.New(\"version must 1 or 2\")\n\t}\n\tvar sd c_type.Uint256\n\tcopy(sd[:], seed[:])\n\treturn superzk.Seed2Sk(&sd, version), nil\n}\n\nfunc (s *PublicLocalAPI) Sk2Tk(ctx context.Context, sk c_type.Uint512) (ret address.TKAddress, err error) {\n\ttk, err := superzk.Sk2Tk(&sk)\n\tif err != nil {\n\t\treturn\n\t}\n\tcopy(ret[:], tk[:])\n\treturn\n}\n\nfunc (s *PublicLocalAPI) Tk2Pk(ctx context.Context, tk address.TKAddress) (ret address.PKAddress, err error) {\n\tvar pk c_type.Uint512\n\tpk, err = superzk.Tk2Pk(tk.ToTk().NewRef())\n\tcopy(ret[:], pk[:])\n\treturn\n}\n\nfunc (s *PublicLocalAPI) Pk2Pkr(ctx context.Context, pk address.PKAddress, index *c_type.Uint256) (PKrAddress, error) {\n\tempty := c_type.Uint256{}\n\tif index != nil {\n\t\tif (*index) == empty {\n\t\t\t*index = c_type.RandUint256()\n\t\t}\n\t}\n\tpkr := superzk.Pk2PKr(pk.ToUint512().NewRef(), index)\n\tvar pkrAddress PKrAddress\n\tcopy(pkrAddress[:], pkr[:])\n\treturn pkrAddress, nil\n}\n\nfunc (s *PublicLocalAPI) SignTxWithSk(param txtool.GTxParam, SK c_type.Uint512) (txtool.GTx, error) {\n\treturn flight.SignTx(&SK, &param)\n}\n"
  },
  {
    "path": "internal/ethapi/api_proof.go",
    "content": "package ethapi\n\nimport (\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/proofservice\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\ntype ProofServiceApi struct {\n}\n\nfunc NewProofServiceApi() *ProofServiceApi {\n\treturn &ProofServiceApi{}\n}\n\nfunc (nodeApi *ProofServiceApi) Fee() map[string]hexutil.Big {\n\tfee := proofservice.Instance().Fee()\n\tret := make(map[string]hexutil.Big)\n\tret[\"fixedFee\"] = hexutil.Big(*fee.FixedFee)\n\treturn ret\n}\n\nfunc (nodeApi *ProofServiceApi) SubmitProofWork(tx *stx.T, param *txtool.GTxParam) error {\n\treturn proofservice.Instance().SubmitWork(tx, param)\n}\n\nfunc (nodeApi *ProofServiceApi) FindTxHash(hash common.Hash) common.Hash {\n\treturn proofservice.Instance().FindTxHash(hash)\n}\n"
  },
  {
    "path": "internal/ethapi/api_ssi.go",
    "content": "package ethapi\n\nimport (\n\t\"context\"\n\n\t\"github.com/sero-cash/go-sero/zero/wallet/ssi\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\ntype PublicSSIAPI struct {\n\tb Backend\n}\n\nfunc (s *PublicSSIAPI) SzkCreateKr() (kr txtool.Kr) {\n\treturn ssi.SSI_Inst.CreateKr(true)\n}\n\nfunc (s *PublicSSIAPI) CreateKr() (kr txtool.Kr) {\n\treturn ssi.SSI_Inst.CreateKr(false)\n}\n\nfunc (s *PublicSSIAPI) GetBlocksInfo(ctx context.Context, start hexutil.Uint64, count hexutil.Uint64) ([]ssi.Block, error) {\n\treturn ssi.SSI_Inst.GetBlocksInfo(uint64(start), uint64(count))\n}\n\nfunc (s *PublicSSIAPI) Detail(ctx context.Context, roots []c_type.Uint256, skr *c_type.PKr) (douts []txtool.DOut, e error) {\n\treturn ssi.SSI_Inst.Detail(roots, skr)\n}\n\nfunc (s *PublicSSIAPI) GenTx(ctx context.Context, param *ssi.PreTxParam) (hash c_type.Uint256, e error) {\n\treturn ssi.SSI_Inst.GenTx(param)\n}\n\nfunc (s *PublicSSIAPI) GetTx(ctx context.Context, txhash c_type.Uint256) (tx *txtool.GTx, e error) {\n\treturn ssi.SSI_Inst.GetTx(txhash)\n}\n\nfunc (s *PublicSSIAPI) CommitTx(ctx context.Context, txhash c_type.Uint256) (e error) {\n\tif tx, err := ssi.SSI_Inst.GetTx(txhash); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\treturn s.b.CommitTx(tx)\n\t}\n}\n"
  },
  {
    "path": "internal/ethapi/api_stake.go",
    "content": "package ethapi\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\n\t\"github.com/sero-cash/go-sero/zero/wallet/stakeservice\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/exchange\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n)\n\ntype PublicStakeApI struct {\n\tb         Backend\n\tnonceLock *AddrLocker\n}\n\nfunc NewPublicStakeApI(b Backend, nonceLock *AddrLocker) *PublicStakeApI {\n\treturn &PublicStakeApI{\n\t\tnonceLock: nonceLock,\n\t\tb:         b,\n\t}\n}\n\ntype BuyShareTxArg struct {\n\tFrom     address.MixBase58Adrress  `json:\"from\"`\n\tVote     *address.MixBase58Adrress `json:\"vote\"`\n\tPool     *hexutil.Bytes            `json:\"pool\"`\n\tGas      *hexutil.Uint64           `json:\"gas\"`\n\tGasPrice *hexutil.Big              `json:\"gasPrice\"`\n\tValue    *hexutil.Big              `json:\"value\"`\n}\n\nfunc (args *BuyShareTxArg) setDefaults(ctx context.Context, b Backend) error {\n\tif args.Gas == nil {\n\t\targs.Gas = new(hexutil.Uint64)\n\t\t*(*uint64)(args.Gas) = 25000\n\t}\n\n\tif args.Vote == nil {\n\t\treturn errors.New(\"vote address cannot be nil\")\n\t}\n\n\tif args.Pool != nil {\n\t\tstate, _, err := b.StateAndHeaderByNumber(ctx, -1)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tpool := stake.NewStakeState(state).GetStakePool(common.BytesToHash((*args.Pool)[:]))\n\n\t\tif pool == nil {\n\t\t\treturn errors.New(\"stake pool not exists\")\n\t\t}\n\n\t\tif pool.Closed {\n\t\t\treturn errors.New(\"stake pool has closed\")\n\t\t}\n\t}\n\n\tif args.GasPrice == nil {\n\t\tprice, err := b.SuggestPrice(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\targs.GasPrice = (*hexutil.Big)(price)\n\t} else {\n\t\tif args.GasPrice.ToInt().Sign() == 0 {\n\t\t\treturn errors.New(`gasPrice can not be zero`)\n\t\t}\n\t}\n\n\tif args.Value == nil {\n\t\targs.Value = new(hexutil.Big)\n\t}\n\treturn nil\n}\n\nfunc (args *BuyShareTxArg) toPreTxParam(fromAccount accounts.Account) prepare.PreTxParam {\n\tpreTx := prepare.PreTxParam{}\n\tpreTx.From = fromAccount.Address.ToUint512()\n\tpreTx.RefundTo = fromAccount.GetPkr(nil).NewRef()\n\tpreTx.Fee = assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*big.NewInt(0).Mul(big.NewInt(int64(*args.Gas)), args.GasPrice.ToInt())),\n\t}\n\tpreTx.GasPrice = (*big.Int)(args.GasPrice)\n\tpreTx.Cmds = prepare.Cmds{}\n\n\tbuyShareCmd := stx.BuyShareCmd{}\n\tbuyShareCmd.Value = utils.U256(*args.Value.ToInt())\n\tbuyShareCmd.Vote = args.Vote.ToPkr()\n\tif args.Pool != nil {\n\t\tvar pool c_type.Uint256\n\t\tcopy(pool[:], (*args.Pool)[:])\n\t\tbuyShareCmd.Pool = &pool\n\t}\n\tpreTx.Cmds.BuyShare = &buyShareCmd\n\treturn preTx\n\n}\n\nfunc (s *PublicStakeApI) EstimateShares(ctx context.Context, args BuyShareTxArg) (map[string]interface{}, error) {\n\tif err := args.setDefaults(ctx, s.b); err != nil {\n\t\treturn nil, err\n\t}\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnum, avprice, baseprice := stake.NewStakeState(state).CaleAvgPrice(args.Value.ToInt())\n\n\tresult := map[string]interface{}{}\n\tresult[\"total\"] = hexutil.Uint64(num)\n\tresult[\"avPrice\"] = hexutil.Big(*avprice)\n\tresult[\"basePrice\"] = hexutil.Big(*baseprice)\n\treturn result, nil\n}\n\nfunc (s *PublicStakeApI) BuyShare(ctx context.Context, args BuyShareTxArg) (common.Hash, error) {\n\tif err := args.setDefaults(ctx, s.b); err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tfromAccount, err := s.b.AccountManager().FindAccountByPkr(args.From.ToPkr())\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tpreTx := args.toPreTxParam(fromAccount)\n\tpretx, gtx, err := exchange.CurrentExchange().GenTxWithSign(preTx)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\terr = s.b.CommitTx(gtx)\n\tif err != nil {\n\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\treturn common.Hash{}, err\n\t}\n\n\treturn common.BytesToHash(gtx.Hash[:]), nil\n}\n\ntype RegistStakePoolTxArg struct {\n\tFrom     address.MixBase58Adrress  `json:\"from\"`\n\tVote     *address.MixBase58Adrress `json:\"vote\"`\n\tGas      *hexutil.Uint64           `json:\"gas\"`\n\tGasPrice *hexutil.Big              `json:\"gasPrice\"`\n\tValue    *hexutil.Big              `json:\"value\"`\n\tFee      *hexutil.Uint             `json:\"fee\"`\n}\n\nfunc (args *RegistStakePoolTxArg) setDefaults(ctx context.Context, b Backend) error {\n\tif args.Gas == nil {\n\t\targs.Gas = new(hexutil.Uint64)\n\t\t*(*uint64)(args.Gas) = 25000\n\t}\n\n\tif args.Vote == nil {\n\t\treturn errors.New(\"vote address cannot be nil\")\n\t}\n\tif args.Fee == nil {\n\t\treturn errors.New(\"pool fee cannot be nil\")\n\t}\n\n\tif args.GasPrice == nil {\n\t\tprice, err := b.SuggestPrice(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\targs.GasPrice = (*hexutil.Big)(price)\n\t} else {\n\t\tif args.GasPrice.ToInt().Sign() == 0 {\n\t\t\treturn errors.New(`gasPrice can not be zero`)\n\t\t}\n\t}\n\n\tif uint32(*args.Fee) < seroparam.LOWEST_STAKING_NODE_FEE_RATE {\n\t\treturn errors.New(fmt.Sprintf(\"fee rate can not less then %v\", seroparam.LOWEST_STAKING_NODE_FEE_RATE))\n\t}\n\tif uint32(*args.Fee) > seroparam.HIGHEST_STAKING_NODE_FEE_RATE {\n\t\treturn errors.New(fmt.Sprintf(\"fee rate can not large then  %v\", seroparam.HIGHEST_STAKING_NODE_FEE_RATE))\n\t}\n\n\tif args.Value == nil {\n\t\targs.Value = new(hexutil.Big)\n\t}\n\treturn nil\n}\n\nfunc (args *RegistStakePoolTxArg) toPreTxParam(fromAccount accounts.Account) prepare.PreTxParam {\n\tpreTx := prepare.PreTxParam{}\n\tpreTx.From = fromAccount.Address.ToUint512()\n\tpreTx.Fee = assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*big.NewInt(0).Mul(big.NewInt(int64(*args.Gas)), args.GasPrice.ToInt())),\n\t}\n\tpreTx.GasPrice = (*big.Int)(args.GasPrice)\n\tpreTx.Cmds = prepare.Cmds{}\n\tregistPoolCmd := stx.RegistPoolCmd{}\n\tregistPoolCmd.Value = utils.U256(*args.Value.ToInt())\n\tregistPoolCmd.Vote = args.Vote.ToPkr()\n\tregistPoolCmd.FeeRate = uint32(*args.Fee)\n\tpreTx.Cmds.RegistPool = &registPoolCmd\n\treturn preTx\n}\n\nfunc (s *PublicStakeApI) RegistStakePool(ctx context.Context, args RegistStakePoolTxArg) (common.Hash, error) {\n\n\tif !seroparam.Is_Dev() {\n\t\tpeerCount := s.b.PeerCount()\n\t\tif peerCount < 10 {\n\t\t\treturn common.Hash{}, errors.New(\"connected peer < 10\")\n\t\t}\n\t}\n\tif err := args.setDefaults(ctx, s.b); err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tfromAccount, err := s.b.AccountManager().FindAccountByPkr(args.From.ToPkr())\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tfromPkr := getStakePoolPkr(fromAccount)\n\tif args.From.IsPkr() {\n\t\tfromPkr = args.From.ToPkr()\n\t}\n\tpoolId := getStakePoolId(fromPkr)\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tpool := stake.NewStakeState(state).GetStakePool(poolId)\n\n\tif pool != nil {\n\t\treturn common.Hash{}, errors.New(\"stake pool has exists poolId=\" + poolId.String())\n\t}\n\n\tlog.Info(\"RegistStakePool\", \"idPkr\", common.BytesToAddress(fromPkr[:]).String())\n\tpreTx := args.toPreTxParam(fromAccount)\n\tpreTx.RefundTo = &fromPkr\n\tpretx, gtx, err := exchange.CurrentExchange().GenTxWithSign(preTx)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\terr = s.b.CommitTx(gtx)\n\tif err != nil {\n\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\treturn common.Hash{}, err\n\t}\n\treturn common.BytesToHash(gtx.Hash[:]), nil\n}\n\nfunc getStakePoolPkr(account accounts.Account) c_type.PKr {\n\trandHash := crypto.Keccak256Hash(account.Tk[:])\n\tvar rand c_type.Uint256\n\tcopy(rand[:], randHash[:])\n\treturn superzk.Pk2PKr(account.Address.ToUint512().NewRef(), &rand)\n\n}\nfunc getStakePoolId(from c_type.PKr) common.Hash {\n\treturn crypto.Keccak256Hash(from[:])\n}\n\nfunc (s *PublicStakeApI) CloseStakePool(ctx context.Context, from address.MixBase58Adrress) (common.Hash, error) {\n\tvar fromPkr c_type.PKr\n\tfromAccount, err := s.b.AccountManager().FindAccountByPkr(from.ToPkr())\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tif from.IsPkr() {\n\t\tfromPkr = from.ToPkr()\n\t} else {\n\t\tfromPkr = getStakePoolPkr(fromAccount)\n\n\t}\n\tpoolId := getStakePoolId(fromPkr)\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tlog.Info(\"close stakepool\", \"poolId\", hexutil.Encode(poolId[:]))\n\tpool := stake.NewStakeState(state).GetStakePool(poolId)\n\n\tif pool == nil {\n\t\treturn common.Hash{}, errors.New(\"stake pool not exists\")\n\t}\n\n\tif pool.Closed {\n\t\treturn common.Hash{}, errors.New(\"stake pool has closed\")\n\t}\n\tpreTx := prepare.PreTxParam{}\n\tpreTx.From = fromAccount.Address.ToUint512()\n\tpreTx.RefundTo = &fromPkr\n\tpreTx.Fee = assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*big.NewInt(0).Mul(big.NewInt(int64(25000)), new(big.Int).SetUint64(defaultGasPrice))),\n\t}\n\tpreTx.GasPrice = new(big.Int).SetUint64(defaultGasPrice)\n\tpreTx.Cmds = prepare.Cmds{}\n\tclosePoolCmd := stx.ClosePoolCmd{}\n\tpreTx.Cmds.ClosePool = &closePoolCmd\n\n\tpretx, gtx, err := exchange.CurrentExchange().GenTxWithSign(preTx)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\terr = s.b.CommitTx(gtx)\n\tif err != nil {\n\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\treturn common.Hash{}, err\n\t}\n\treturn common.BytesToHash(gtx.Hash[:]), nil\n}\n\nfunc (s *PublicStakeApI) ModifyStakePoolFee(ctx context.Context, from address.MixBase58Adrress, fee hexutil.Uint64) (common.Hash, error) {\n\n\tif uint32(fee) < seroparam.LOWEST_STAKING_NODE_FEE_RATE {\n\t\treturn common.Hash{}, errors.New(fmt.Sprintf(\"fee rate can not less then %v\", seroparam.LOWEST_STAKING_NODE_FEE_RATE))\n\t}\n\tif uint32(fee) > seroparam.HIGHEST_STAKING_NODE_FEE_RATE {\n\t\treturn common.Hash{}, errors.New(fmt.Sprintf(\"fee rate can not large then  %v\", seroparam.HIGHEST_STAKING_NODE_FEE_RATE))\n\t}\n\n\tvar fromPkr c_type.PKr\n\tfromAccount, err := s.b.AccountManager().FindAccountByPkr(from.ToPkr())\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tif from.IsPkr() {\n\t\tfromPkr = from.ToPkr()\n\t} else {\n\t\tfromPkr = getStakePoolPkr(fromAccount)\n\n\t}\n\tpoolId := getStakePoolId(fromPkr)\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tpool := stake.NewStakeState(state).GetStakePool(poolId)\n\n\tif pool == nil {\n\t\treturn common.Hash{}, errors.New(\"stake pool not exists\")\n\t}\n\n\tif pool.Closed {\n\t\treturn common.Hash{}, errors.New(\"stake pool has closed\")\n\t}\n\tpreTx := prepare.PreTxParam{}\n\tpreTx.From = fromAccount.Address.ToUint512()\n\tpreTx.RefundTo = &fromPkr\n\tpreTx.Fee = assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*big.NewInt(0).Mul(big.NewInt(int64(25000)), new(big.Int).SetUint64(defaultGasPrice))),\n\t}\n\tpreTx.GasPrice = new(big.Int).SetUint64(defaultGasPrice)\n\tpreTx.Cmds = prepare.Cmds{}\n\tregistPoolCmd := stx.RegistPoolCmd{}\n\tregistPoolCmd.Vote = pool.VotePKr\n\tregistPoolCmd.FeeRate = uint32(fee)\n\tpreTx.Cmds.RegistPool = &registPoolCmd\n\tpretx, gtx, err := exchange.CurrentExchange().GenTxWithSign(preTx)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\terr = s.b.CommitTx(gtx)\n\tif err != nil {\n\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\treturn common.Hash{}, err\n\t}\n\treturn common.BytesToHash(gtx.Hash[:]), nil\n}\n\nfunc (s *PublicStakeApI) ModifyStakePoolVote(ctx context.Context, from address.MixBase58Adrress, vote address.MixBase58Adrress) (common.Hash, error) {\n\tvar fromPkr c_type.PKr\n\tfromAccount, err := s.b.AccountManager().FindAccountByPkr(from.ToPkr())\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tif from.IsPkr() {\n\t\tfromPkr = from.ToPkr()\n\t} else {\n\t\tfromPkr = getStakePoolPkr(fromAccount)\n\n\t}\n\n\tpoolId := getStakePoolId(fromPkr)\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\n\tpool := stake.NewStakeState(state).GetStakePool(poolId)\n\n\tif pool == nil {\n\t\treturn common.Hash{}, errors.New(\"stake pool not exists\")\n\t}\n\n\tif pool.Closed {\n\t\treturn common.Hash{}, errors.New(\"stake pool has closed\")\n\t}\n\tvotePkr := vote.ToPkr()\n\tpreTx := prepare.PreTxParam{}\n\tpreTx.From = fromAccount.Address.ToUint512()\n\tpreTx.RefundTo = &fromPkr\n\tpreTx.Fee = assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*big.NewInt(0).Mul(big.NewInt(int64(25000)), new(big.Int).SetUint64(defaultGasPrice))),\n\t}\n\tpreTx.GasPrice = new(big.Int).SetUint64(defaultGasPrice)\n\tpreTx.Cmds = prepare.Cmds{}\n\tregistPoolCmd := stx.RegistPoolCmd{}\n\tregistPoolCmd.Vote = votePkr\n\tregistPoolCmd.FeeRate = uint32(pool.Fee)\n\tpreTx.Cmds.RegistPool = &registPoolCmd\n\tpretx, gtx, err := exchange.CurrentExchange().GenTxWithSign(preTx)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\terr = s.b.CommitTx(gtx)\n\tif err != nil {\n\t\texchange.CurrentExchange().ClearTxParam(pretx)\n\t\treturn common.Hash{}, err\n\t}\n\treturn common.BytesToHash(gtx.Hash[:]), nil\n}\n\nfunc (s *PublicStakeApI) PoolState(ctx context.Context, poolId common.Hash) (map[string]interface{}, error) {\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\twallets := s.b.AccountManager().Wallets()\n\tpoolState := stake.NewStakeState(state).GetStakePool(poolId)\n\n\tif poolState == nil {\n\t\treturn nil, errors.New(\"stake pool not exists\")\n\t}\n\n\ttimestamp := uint64(0)\n\tblock, _ := s.b.BlockByNumber(ctx, rpc.BlockNumber(poolState.BlockNumber))\n\n\tif block != nil {\n\t\ttimestamp = block.Header().Time.Uint64()\n\t}\n\n\tret := newRPCStakePool(wallets, *poolState, timestamp)\n\n\tif poolState.LastPayTime != 0 {\n\t\theader, _ := s.b.HeaderByNumber(ctx, rpc.BlockNumber(poolState.LastPayTime))\n\t\tsnapshot := stake.GetStakePoolByBlockNumber(s.b.ChainDb(), poolId, header.Hash(), header.Number.Uint64())\n\t\tif snapshot != nil {\n\t\t\tret[\"returnProfit\"] = hexutil.Big(*snapshot.Profit)\n\t\t}\n\t}\n\treturn ret, nil\n}\n\nfunc (s *PublicStakeApI) SharePrice(ctx context.Context) (*hexutil.Big, error) {\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tprice := stake.NewStakeState(state).CurrentPrice()\n\treturn (*hexutil.Big)(price), nil\n}\n\nfunc (s *PublicStakeApI) SharePoolSize(ctx context.Context) (hexutil.Uint64, error) {\n\tstate, _, err := s.b.StateAndHeaderByNumber(ctx, -1)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tsize := stake.NewStakeState(state).ShareSize()\n\treturn hexutil.Uint64(size), nil\n}\n\ntype StakePool struct {\n\tPKr             c_type.PKr\n\tVotePKr         c_type.PKr\n\tTransactionHash common.Hash\n\tAmount          *big.Int `rlp:\"nil\"`\n\tFee             uint16\n\tShareNum        uint32\n\tChoicedNum      uint32\n\tMissedNum       uint32\n\tWishVotNum      uint32\n\tProfit          *big.Int `rlp:\"nil\"`\n\tLastPayTime     uint64\n\tClosed          bool\n}\n\nfunc PkrToString(pkr c_type.PKr) string {\n\treturn base58.Encode(pkr[:])\n}\n\nfunc newRPCStakePool(wallets []accounts.Wallet, pool stake.StakePool, timestamp uint64) map[string]interface{} {\n\tresult := map[string]interface{}{}\n\tresult[\"id\"] = common.BytesToHash(pool.Id())\n\tresult[\"idPkr\"] = PkrToString(pool.PKr)\n\tresult[\"own\"] = PkrToString(pool.PKr)\n\tresult[\"voteAddress\"] = PkrToString(pool.VotePKr)\n\tresult[\"fee\"] = hexutil.Uint(pool.Fee)\n\tresult[\"shareNum\"] = hexutil.Uint64(pool.CurrentShareNum)\n\tresult[\"choicedNum\"] = hexutil.Uint64(pool.ChoicedShareNum)\n\tresult[\"wishVoteNum\"] = hexutil.Uint64(pool.WishVoteNum)\n\tresult[\"expireNum\"] = hexutil.Uint64(pool.ExpireNum)\n\tresult[\"missedNum\"] = hexutil.Uint64(pool.MissedVoteNum)\n\tresult[\"profit\"] = hexutil.Big(*pool.Profit)\n\tresult[\"lastPayTime\"] = hexutil.Uint64(pool.LastPayTime)\n\tresult[\"closed\"] = pool.Closed\n\tresult[\"tx\"] = pool.TransactionHash\n\tresult[\"createAt\"] = hexutil.Uint64(pool.BlockNumber)\n\tresult[\"timestamp\"] = hexutil.Uint64(timestamp)\n\treturn result\n}\n\nfunc (s *PublicStakeApI) StakePools(ctx context.Context) []map[string]interface{} {\n\tpools := stakeservice.CurrentStakeService().StakePools()\n\tresult := []map[string]interface{}{}\n\twallets := s.b.AccountManager().Wallets()\n\tfor _, pool := range pools {\n\t\ttimestamp := uint64(0)\n\t\tblock, _ := s.b.BlockByNumber(ctx, rpc.BlockNumber(pool.BlockNumber))\n\n\t\tif block != nil {\n\t\t\ttimestamp = block.Header().Time.Uint64()\n\t\t}\n\t\tresult = append(result, newRPCStakePool(wallets, *pool, timestamp))\n\t}\n\treturn result\n}\n\nfunc newRPCShare(wallets []accounts.Wallet, share stake.Share, timestamp uint64) map[string]interface{} {\n\ts := map[string]interface{}{}\n\ts[\"id\"] = common.BytesToHash(share.Id())\n\ts[\"addr\"] = PkrToString(share.PKr)\n\ts[\"voteAddr\"] = PkrToString(share.VotePKr)\n\ts[\"total\"] = hexutil.Uint64(share.InitNum)\n\ts[\"missed\"] = hexutil.Uint64(share.WillVoteNum)\n\tif share.Value != nil {\n\t\ts[\"price\"] = hexutil.Big(*share.Value)\n\t}\n\tif share.Status == stake.STATUS_VALID {\n\t\ts[\"remaining\"] = hexutil.Uint64(share.Num)\n\t} else {\n\t\ts[\"expired\"] = hexutil.Uint64(share.Num)\n\t}\n\ts[\"status\"] = hexutil.Uint64(share.Status)\n\tif share.PoolId != nil {\n\t\ts[\"pool\"] = share.PoolId\n\t}\n\tif share.Profit != nil {\n\t\ts[\"profit\"] = hexutil.Big(*share.Profit)\n\t}\n\ts[\"fee\"] = hexutil.Uint64(share.Fee)\n\n\ts[\"tx\"] = share.TransactionHash\n\ts[\"at\"] = hexutil.Uint64(share.BlockNumber)\n\ts[\"timestamp\"] = hexutil.Uint64(timestamp)\n\treturn s\n}\n\nfunc newRPCStaticsShareMap(rs RPCStatisticsShare) map[string]interface{} {\n\ts := map[string]interface{}{}\n\ts[\"addr\"] = rs.Address\n\ts[\"voteAddr\"] = rs.VoteAddress\n\ts[\"total\"] = hexutil.Uint64(rs.Total)\n\ts[\"missed\"] = hexutil.Uint64(rs.Missed)\n\ts[\"remaining\"] = hexutil.Uint64(rs.Remaining)\n\ts[\"expired\"] = hexutil.Uint64(rs.Expired)\n\ts[\"shareIds\"] = rs.ShareIds\n\ts[\"profit\"] = hexutil.Big(*rs.Profit)\n\ts[\"pools\"] = rs.Pools\n\tif rs.TotalAmount != nil {\n\t\ts[\"totalAmount\"] = hexutil.Big(*rs.TotalAmount)\n\t}\n\treturn s\n}\n\ntype RPCStatisticsShare struct {\n\tAddress     interface{}   `json:\"addr\"`\n\tVoteAddress []interface{} `json:\"voteAddr\"`\n\tTotal       uint32        `json:\"total\"`\n\tRemaining   uint32        `json:\"remaining\"`\n\tMissed      uint32        `json:\"missed\"`\n\tExpired     uint32        `json:\"expired\"`\n\tShareIds    []common.Hash `json:\"shareIds\"`\n\tPools       []common.Hash `json:\"pools\"`\n\tProfit      *big.Int      `json:\"profit\"`\n\tTotalAmount *big.Int      `json:\"totalAmount\"`\n}\n\nfunc containsVoteAddr(vas []interface{}, item interface{}) bool {\n\tfor _, v := range vas {\n\t\tif v == item {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc containsHash(vas []common.Hash, item common.Hash) bool {\n\tfor _, v := range vas {\n\t\tif v == item {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc newRPCStatisticsShare(mg *accounts.Manager, shares []*stake.Share, api *PublicStakeApI, ctx context.Context) []map[string]interface{} {\n\tresult := map[string]*RPCStatisticsShare{}\n\tvar key interface{}\n\tfor _, share := range shares {\n\t\tkey = share.PKr\n\t\tvar keystr = PkrToString(share.PKr)\n\t\tif mg != nil {\n\t\t\tacc, err := mg.FindAccountByPkr(share.PKr)\n\t\t\tif err == nil {\n\t\t\t\tkeystr = acc.Address.String()\n\t\t\t}\n\t\t}\n\t\tvar s *RPCStatisticsShare\n\t\tif _, ok := result[keystr]; ok {\n\t\t\ts = result[keystr]\n\t\t\ts.Total += share.InitNum\n\t\t\tif share.Status == stake.STATUS_VALID {\n\t\t\t\ts.Remaining += share.Num\n\t\t\t} else {\n\t\t\t\ts.Expired += share.Num\n\t\t\t}\n\n\t\t\ts.Missed += share.WillVoteNum\n\t\t\ts.ShareIds = append(s.ShareIds, common.BytesToHash(share.Id()))\n\t\t\tif !containsVoteAddr(s.VoteAddress, share.VotePKr) {\n\t\t\t\ts.VoteAddress = append(s.VoteAddress, share.VotePKr)\n\t\t\t}\n\t\t\tif share.PoolId != nil {\n\t\t\t\tif !containsHash(s.Pools, *share.PoolId) {\n\t\t\t\t\ts.Pools = append(s.Pools, *share.PoolId)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif share.Profit != nil {\n\t\t\t\ts.Profit = big.NewInt(0).Add(s.Profit, share.Profit)\n\t\t\t}\n\n\t\t} else {\n\t\t\ts = &RPCStatisticsShare{}\n\t\t\ts.Address = key\n\t\t\ts.Total = share.InitNum\n\t\t\ts.Missed = share.WillVoteNum\n\t\t\tif share.Status == stake.STATUS_VALID {\n\t\t\t\ts.Remaining = share.Num\n\t\t\t} else {\n\t\t\t\ts.Expired = share.Num\n\t\t\t}\n\t\t\ts.VoteAddress = append(s.VoteAddress, share.VotePKr)\n\t\t\tif share.PoolId != nil {\n\t\t\t\ts.Pools = append(s.Pools, *share.PoolId)\n\t\t\t}\n\t\t\ts.Profit = new(big.Int).Set(share.Profit)\n\t\t\ts.ShareIds = append(s.ShareIds, common.BytesToHash(share.Id()))\n\n\t\t\tresult[keystr] = s\n\t\t}\n\n\t\t//if share.Status == stake.STATUS_FINISHED {\n\t\t//\tlog.Info(\"v1 share\", \"filter share\", hexutil.Encode(share.Id()), \"status\", share.Status)\n\t\t//\tcontinue\n\t\t//}\n\t\tremain := share.InitNum\n\t\tif share.LastPayTime != 0 {\n\t\t\theader, _ := api.b.HeaderByNumber(ctx, rpc.BlockNumber(share.LastPayTime))\n\t\t\tsnapshot := stake.GetShareByBlockNumber(api.b.ChainDb(), common.BytesToHash(share.Id()), header.Hash(), header.Number.Uint64())\n\t\t\tif snapshot != nil {\n\t\t\t\tif snapshot.Status == 0 {\n\t\t\t\t\tremain = snapshot.Num + snapshot.WillVoteNum\n\t\t\t\t} else if snapshot.Status == 1 {\n\t\t\t\t\tremain = snapshot.WillVoteNum\n\t\t\t\t} else {\n\t\t\t\t\tremain = 0\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tif s.TotalAmount == nil {\n\t\t\ts.TotalAmount = new(big.Int)\n\t\t}\n\t\ts.TotalAmount = new(big.Int).Add(s.TotalAmount, new(big.Int).Mul(big.NewInt(int64(remain)), share.Value))\n\t}\n\tstatistics := []map[string]interface{}{}\n\tfor _, v := range result {\n\t\tstatistics = append(statistics, newRPCStaticsShareMap(*v))\n\t}\n\treturn statistics\n\n}\n\nfunc (s *PublicStakeApI) GetShareByPkrV2(ctx context.Context, pkr PKrAddress) map[string]interface{} {\n\tsharesInfo := stakeservice.CurrentStakeService().SharesInfoByPKr(*pkr.ToPKr())\n\n\tstatistics := map[string]interface{}{}\n\tif sharesInfo == nil {\n\t\treturn statistics\n\t}\n\n\tstatistics[\"total\"] = hexutil.Uint64(sharesInfo.Total)\n\tstatistics[\"missed\"] = hexutil.Uint64(sharesInfo.Missed)\n\tstatistics[\"remaining\"] = hexutil.Uint64(sharesInfo.Remaining)\n\tstatistics[\"expired\"] = hexutil.Uint64(sharesInfo.Expired)\n\tstatistics[\"shareIds\"] = sharesInfo.ShareIds\n\tstatistics[\"profit\"] = hexutil.Big(*sharesInfo.Profit)\n\tif sharesInfo.TotalAmount != nil {\n\t\tstatistics[\"totalAmount\"] = hexutil.Big(*sharesInfo.TotalAmount)\n\t}\n\treturn statistics\n}\n\nfunc (s *PublicStakeApI) MyShareV2(ctx context.Context, addr address.MixBase58Adrress) map[string]interface{} {\n\t// wallets := s.b.AccountManager().Wallets()\n\tstatistics := map[string]interface{}{}\n\taccount, err := s.b.AccountManager().FindAccountByPkr(addr.ToPkr())\n\tif err != nil {\n\t\treturn statistics\n\t}\n\n\tsharesInfo := stakeservice.CurrentStakeService().SharesInfoByPK(account.Address.ToUint512())\n\tif sharesInfo == nil {\n\t\treturn statistics\n\t}\n\n\tstatistics[\"total\"] = hexutil.Uint64(sharesInfo.Total)\n\tstatistics[\"missed\"] = hexutil.Uint64(sharesInfo.Missed)\n\tstatistics[\"remaining\"] = hexutil.Uint64(sharesInfo.Remaining)\n\tstatistics[\"expired\"] = hexutil.Uint64(sharesInfo.Expired)\n\tstatistics[\"shareIds\"] = sharesInfo.ShareIds\n\tstatistics[\"profit\"] = hexutil.Big(*sharesInfo.Profit)\n\tif sharesInfo.TotalAmount != nil {\n\t\tstatistics[\"totalAmount\"] = hexutil.Big(*sharesInfo.TotalAmount)\n\t}\n\treturn statistics\n}\n\nfunc (s *PublicStakeApI) MyShare(ctx context.Context, addr address.MixBase58Adrress) []map[string]interface{} {\n\t//wallets := s.b.AccountManager().Wallets()\n\taccount, err := s.b.AccountManager().FindAccountByPkr(addr.ToPkr())\n\tif err != nil {\n\t\treturn nil\n\t}\n\tshares := stakeservice.CurrentStakeService().SharesByPk(account.Address.ToUint512())\n\treturn newRPCStatisticsShare(s.b.AccountManager(), shares, s, ctx)\n}\n\nfunc (s *PublicStakeApI) GetShare(ctx context.Context, shareId common.Hash) map[string]interface{} {\n\tshare := stakeservice.CurrentStakeService().SharesById(shareId)\n\tif share == nil {\n\t\treturn nil\n\t}\n\twallets := s.b.AccountManager().Wallets()\n\ttimestamp := uint64(0)\n\tblock, _ := s.b.BlockByNumber(ctx, rpc.BlockNumber(share.BlockNumber))\n\n\tif block != nil {\n\t\ttimestamp = block.Header().Time.Uint64()\n\t}\n\tret := newRPCShare(wallets, *share, timestamp)\n\n\tif share.LastPayTime != 0 {\n\t\theader, _ := s.b.HeaderByNumber(ctx, rpc.BlockNumber(share.LastPayTime))\n\t\tsnapshot := stake.GetShareByBlockNumber(s.b.ChainDb(), shareId, header.Hash(), header.Number.Uint64())\n\t\tif snapshot != nil {\n\t\t\tif snapshot.Status == 1 {\n\t\t\t\tret[\"returnNum\"] = hexutil.Uint64(snapshot.InitNum - snapshot.WillVoteNum)\n\t\t\t} else if snapshot.Status == 2 {\n\t\t\t\tret[\"returnNum\"] = hexutil.Uint64(snapshot.InitNum)\n\t\t\t} else {\n\t\t\t\tret[\"returnNum\"] = hexutil.Uint64(snapshot.InitNum - snapshot.Num - snapshot.WillVoteNum)\n\t\t\t}\n\n\t\t\tret[\"returnProfit\"] = hexutil.Big(*snapshot.Profit)\n\t\t}\n\t\tret[\"lastPayTime\"] = hexutil.Uint64(share.LastPayTime)\n\t}\n\treturn ret\n}\nfunc (s *PublicStakeApI) GetShareByPkr(ctx context.Context, pkr PKrAddress) []map[string]interface{} {\n\t//wallets := s.b.AccountManager().Wallets()\n\tshares := stakeservice.CurrentStakeService().SharesByPkr(*(pkr.ToPKr()))\n\treturn newRPCStatisticsShare(s.b.AccountManager(), shares, s, ctx)\n}\n\nfunc (s *PublicStakeApI) GetStakeInfo(ctx context.Context, poolId common.Hash, start, end hexutil.Uint64) (ret map[string][]interface{}) {\n\tpools := []interface{}{}\n\tshares := []interface{}{}\n\tfor start < end {\n\t\theader, err := s.b.HeaderByNumber(ctx, rpc.BlockNumber(start))\n\t\tif err != nil || header == nil {\n\t\t\treturn\n\t\t}\n\t\tshareList, poolList := stake.GetBlockRecords(s.b.ChainDb(), header.Hash(), uint64(start))\n\t\tfor _, each := range shareList {\n\t\t\tif each.PoolId != nil && *each.PoolId == poolId {\n\t\t\t\tshare := map[string]interface{}{}\n\t\t\t\tshare[\"id\"] = common.BytesToHash(each.Id())\n\t\t\t\tshare[\"own\"] = base58.Encode(each.PKr[:])\n\t\t\t\tshare[\"blockNumber\"] = hexutil.Uint64(header.Number.Uint64())\n\t\t\t\tshare[\"total\"] = hexutil.Uint64(each.InitNum)\n\t\t\t\tshare[\"missed\"] = hexutil.Uint64(each.WillVoteNum)\n\t\t\t\tshare[\"price\"] = hexutil.Big(*each.Value)\n\t\t\t\tshare[\"remaining\"] = hexutil.Uint64(each.Num)\n\t\t\t\tshare[\"status\"] = hexutil.Uint64(each.Status)\n\t\t\t\tif each.PoolId != nil {\n\t\t\t\t\tshare[\"pool\"] = each.PoolId\n\t\t\t\t}\n\t\t\t\tshare[\"profit\"] = hexutil.Big(*each.Profit)\n\t\t\t\tshare[\"lastPayTime\"] = hexutil.Uint64(each.LastPayTime)\n\t\t\t\tshare[\"fee\"] = hexutil.Uint64(each.Fee)\n\t\t\t\tshare[\"tx\"] = each.TransactionHash\n\t\t\t\tshares = append(shares, share)\n\t\t\t}\n\t\t}\n\n\t\tfor _, each := range poolList {\n\t\t\tif bytes.Equal(each.Id(), poolId[:]) {\n\t\t\t\tpool := map[string]interface{}{}\n\t\t\t\tpool[\"id\"] = common.BytesToHash(each.Id())\n\t\t\t\tpool[\"own\"] = base58.Encode(each.PKr[:])\n\t\t\t\tpool[\"blockNumber\"] = hexutil.Uint64(header.Number.Uint64())\n\t\t\t\tpool[\"fee\"] = hexutil.Uint64(each.Fee)\n\t\t\t\tpool[\"shareNum\"] = hexutil.Uint64(each.CurrentShareNum)\n\t\t\t\tpool[\"choicedNum\"] = hexutil.Uint64(each.ChoicedShareNum)\n\t\t\t\tpool[\"wishVoteNum\"] = hexutil.Uint64(each.WishVoteNum)\n\t\t\t\tpool[\"expireNum\"] = hexutil.Uint64(each.ExpireNum)\n\t\t\t\tpool[\"missedNum\"] = hexutil.Uint64(each.MissedVoteNum)\n\t\t\t\tpool[\"profit\"] = hexutil.Big(*each.Profit)\n\t\t\t\tpool[\"lastPayTime\"] = hexutil.Uint64(each.LastPayTime)\n\t\t\t\tpool[\"tx\"] = each.TransactionHash\n\t\t\t\tpool[\"createAt\"] = hexutil.Uint64(each.BlockNumber)\n\t\t\t\tpool[\"closed\"] = each.Closed\n\n\t\t\t\tpools = append(pools, pool)\n\t\t\t}\n\t\t}\n\t\tstart++\n\t}\n\tret = map[string][]interface{}{}\n\tret[\"pools\"] = pools\n\tret[\"shares\"] = shares\n\treturn\n}\nfunc (s *PublicStakeApI) Shares(ctx context.Context) (shares []*stake.Share) {\n\treturn stakeservice.CurrentStakeService().Shares()\n}\n\nfunc (s *PublicStakeApI) GetShareAtNumber(ctx context.Context, shareId common.Hash, num hexutil.Uint64) (share *stake.Share) {\n\n\theader, _ := s.b.HeaderByNumber(ctx, rpc.BlockNumber(num))\n\tshare = stake.GetShareByBlockNumber(s.b.ChainDb(), shareId, header.Hash(), header.Number.Uint64())\n\treturn\n}\n"
  },
  {
    "path": "internal/ethapi/backend.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package ethapi implements the general Ethereum API functions.\npackage ethapi\n\nimport (\n\t\"context\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-sero/zero/wallet/exchange\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/miner\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/light\"\n)\n\n// Backend interface provides the common API services (that are provided by\n// both full and light clients) with access to necessary functions.\ntype Backend interface {\n\t// General Ethereum API\n\tDownloader() *downloader.Downloader\n\tProtocolVersion() int\n\tPeerCount() uint\n\tSuggestPrice(ctx context.Context) (*big.Int, error)\n\tChainDb() serodb.Database\n\tEventMux() *event.TypeMux\n\tAccountManager() *accounts.Manager\n\n\t// BlockChain API\n\tSetHead(number uint64)\n\tHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error)\n\tBlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error)\n\tStateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error)\n\tGetBlock(ctx context.Context, blockHash common.Hash) (*types.Block, error)\n\tGetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error)\n\tGetTd(blockHash common.Hash) *big.Int\n\tGetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error)\n\tSubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription\n\tSubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription\n\tSubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription\n\n\t// TxPool API\n\tSendTx(ctx context.Context, signedTx *types.Transaction) error\n\tGetPoolTransactions() (types.Transactions, error)\n\tGetPoolTransaction(txHash common.Hash) *types.Transaction\n\t//GetPoolNonce(ctx context.Context, addr common.Data) (uint64, error)\n\tStats() (pending int, queued int, all int, total int)\n\tTxPoolContent() (types.Transactions, types.Transactions, types.Transactions)\n\tSubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription\n\n\tChainConfig() *params.ChainConfig\n\tCurrentBlock() *types.Block\n\tGetEngin() consensus.Engine\n\tGetMiner() *miner.Miner\n\n\tGetBlocksInfo(start uint64, count uint64) ([]txtool.Block, error)\n\tGetAnchor(roots []c_type.Uint256) ([]txtool.Witness, error)\n\tCommitTx(tx *txtool.GTx) error\n\tGetCommittedTx(txHash c_type.Uint256) (*txtool.GTx, error)\n\tReSendCommittedTx(txHash c_type.Uint256) error\n\n\tGetPkNumber(pk c_type.Uint512) (number uint64, e error)\n\tGetPkr(pk *c_type.Uint512, index *c_type.Uint256) (c_type.PKr, error)\n\tGetBalances(pk c_type.Uint512) (balances map[string]*big.Int, tickets map[string][]*common.Hash)\n\tGenTx(param prepare.PreTxParam) (*txtool.GTxParam, error)\n\tGetRecordsByPk(pk *c_type.Uint512, begin, end uint64) (records []exchange.Utxo, err error)\n\tGetRecordsByPkr(pkr c_type.PKr, begin, end uint64) (records []exchange.Utxo, err error)\n\tGetLockedBalances(pk c_type.Uint512) (balances map[string]*big.Int)\n\tGetMaxAvailable(pk c_type.Uint512, currency string) (amount *big.Int)\n\tGetRecordsByTxHash(txHash c_type.Uint256) (records []exchange.Utxo, err error)\n\n\t//Light node api\n\tGetOutByPKr(pkrs []c_type.PKr, start uint64, end *uint64) (br light.BlockOutResp, e error)\n\tCheckNil(Nils []c_type.Uint256) (nilResps []light.NilValue, e error)\n}\n\nfunc GetAPIs(apiBackend Backend) []rpc.API {\n\tnonceLock := new(AddrLocker)\n\treturn []rpc.API{\n\t\t{\n\t\t\tNamespace: \"proof\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewProofServiceApi(),\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"stake\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicStakeApI(apiBackend, nonceLock),\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   &PublicAbiAPI{},\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"light\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   &PublicLightNodeApi{apiBackend},\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"ssi\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   &PublicSSIAPI{apiBackend},\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"local\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   &PublicLocalAPI{},\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"flight\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   &PublicFlightAPI{&PublicExchangeAPI{apiBackend}},\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"exchange\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   &PublicExchangeAPI{apiBackend},\n\t\t\tPublic:    true,\n\t\t},\n\t\t{\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicEthereumAPI(apiBackend),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicBlockChainAPI(apiBackend),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicTransactionPoolAPI(apiBackend, nonceLock),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"txpool\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicTxPoolAPI(apiBackend),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"debug\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicDebugAPI(apiBackend),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"debug\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPrivateDebugAPI(apiBackend),\n\t\t}, {\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicAccountAPI(apiBackend.AccountManager()),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"personal\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPrivateAccountAPI(apiBackend, nonceLock),\n\t\t\tPublic:    false,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "internal/ethapi/blockReward.go",
    "content": "package ethapi\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n)\n\nvar (\n\tbig1 = big.NewInt(1)\n\tbig2 = big.NewInt(2)\n\tbig6 = big.NewInt(6)\n\t//big9                = big.NewInt(9)\n\t//bigMinus99          = big.NewInt(-99)\n\t//bigOne     *big.Int = big.NewInt(1)\n\t//big200W    *big.Int = big.NewInt(2000000)\n\tbase    = big.NewInt(1e+17)\n\tbig100  = big.NewInt(100)\n\toneSero = new(big.Int).Mul(big.NewInt(10), base)\n\n\tlReward   = new(big.Int).Mul(big.NewInt(176), base)\n\thReward   = new(big.Int).Mul(big.NewInt(445), base)\n\thRewardV4 = new(big.Int).Mul(big.NewInt(356), base)\n\n\targA, _ = new(big.Int).SetString(\"985347985347985\", 10)\n\targB, _ = new(big.Int).SetString(\"16910256410256400000\", 10)\n\n\toriReward    = new(big.Int).Mul(big.NewInt(66773505743), big.NewInt(1000000000))\n\tinterval     = big.NewInt(8294400)\n\thalveNimber  = big.NewInt(3057600)\n\tdifficultyL1 = big.NewInt(340000000)\n\tdifficultyL2 = big.NewInt(1700000000)\n\tdifficultyL3 = big.NewInt(4000000000)\n\tdifficultyL4 = big.NewInt(17000000000)\n)\n\nfunc accumulateRewardsV1(diff *big.Int, gasUsed uint64, gasLimit uint64) *big.Int {\n\n\treward := new(big.Int).Mul(big.NewInt(350), base)\n\n\tdifficulty := big.NewInt(1717986918)\n\n\tif diff.Cmp(difficulty) < 0 {\n\t\tratio := new(big.Int).Div(new(big.Int).Mul(diff, big100), difficulty).Uint64()\n\t\tif ratio >= 80 {\n\t\t\treward = reward.Mul(reward, big.NewInt(4)).Div(reward, big.NewInt(5))\n\t\t} else if ratio >= 60 {\n\t\t\treward = reward.Mul(reward, big.NewInt(3)).Div(reward, big.NewInt(5))\n\t\t} else if ratio >= 40 {\n\t\t\treward = reward.Mul(reward, big.NewInt(2)).Div(reward, big.NewInt(5))\n\t\t} else if ratio >= 20 {\n\t\t\treward = reward.Mul(reward, big.NewInt(1)).Div(reward, big.NewInt(5))\n\t\t} else {\n\t\t\treward = big.NewInt(0).Set(oneSero)\n\t\t}\n\t}\n\n\tratio := new(big.Int).Div(new(big.Int).Mul(new(big.Int).SetUint64(gasUsed), big100), new(big.Int).SetUint64(gasLimit)).Uint64()\n\tif ratio >= 80 {\n\t\treward = new(big.Int).Div(new(big.Int).Mul(reward, big6), big.NewInt(5))\n\t} else {\n\t\treward = reward.Mul(reward, big.NewInt(4)).Div(reward, big.NewInt(5))\n\t}\n\n\tif reward.Cmp(oneSero) < 0 {\n\t\treward = big.NewInt(0).Set(oneSero)\n\t}\n\treturn reward\n}\n\nfunc accumulateRewardsV2(number, diff *big.Int) [2]*big.Int {\n\tvar res [2]*big.Int\n\trewardStd := new(big.Int).Set(oriReward)\n\tif number.Uint64() >= halveNimber.Uint64() {\n\t\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(number, halveNimber), interval), big1)\n\t\trewardStd.Div(rewardStd, new(big.Int).Exp(big2, i, nil))\n\t}\n\n\tvar reward *big.Int\n\tif diff.Cmp(difficultyL1) < 0 { //<3.4\n\t\treward = new(big.Int).Mul(big.NewInt(10), base)\n\t} else if diff.Cmp(difficultyL2) < 0 { //<17\n\t\tratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(56), base), new(big.Int).Mul(big.NewInt(16470000000), new(big.Int).Sub(diff, difficultyL1)))\n\t\treward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward)\n\t} else if diff.Cmp(difficultyL3) < 0 { //<40\n\t\tratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(280), base), new(big.Int).Mul(big.NewInt(2170000000), new(big.Int).Sub(diff, difficultyL2)))\n\t\treward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward)\n\t} else if diff.Cmp(difficultyL4) < 0 { //<170\n\t\tratio := new(big.Int).Add(new(big.Int).Mul(big.NewInt(330), base), new(big.Int).Mul(big.NewInt(2590000000), new(big.Int).Sub(diff, difficultyL3)))\n\t\treward = new(big.Int).Div(new(big.Int).Mul(rewardStd, ratio), oriReward)\n\t} else {\n\t\treward = rewardStd\n\t}\n\tres[0] = reward\n\tres[1] = new(big.Int).Div(rewardStd, big.NewInt(15))\n\treturn res\n}\n\nfunc accumulateRewardsV3(number, bdiff *big.Int) [2]*big.Int {\n\tvar res [2]*big.Int\n\tdiff := new(big.Int).Div(bdiff, big.NewInt(1000000000))\n\treward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB)\n\n\tif reward.Cmp(lReward) < 0 {\n\t\treward = new(big.Int).Set(lReward)\n\t} else if reward.Cmp(hReward) > 0 {\n\t\treward = new(big.Int).Set(hReward)\n\t}\n\n\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(number, halveNimber), interval), big1)\n\treward.Div(reward, new(big.Int).Exp(big2, i, nil))\n\n\tres[0] = reward\n\tres[1] = big.NewInt(0)\n\treturn res\n}\n\nfunc accumulateRewardsV4(number, bdiff *big.Int) [2]*big.Int {\n\tvar res [2]*big.Int\n\tdiff := new(big.Int).Div(bdiff, big.NewInt(1000000000))\n\treward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB)\n\n\tif reward.Cmp(lReward) < 0 {\n\t\treward = new(big.Int).Set(lReward)\n\t} else if reward.Cmp(hRewardV4) > 0 {\n\t\treward = new(big.Int).Set(hRewardV4)\n\t}\n\n\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(number, halveNimber), interval), big1)\n\treward.Div(reward, new(big.Int).Exp(big2, i, nil))\n\n\tres[0] = reward\n\tres[1] = big.NewInt(0)\n\treturn res\n\n}\nfunc accumulateRewardsV5(number, bdiff *big.Int) [2]*big.Int {\n\tvar res [2]*big.Int\n\tdiff := new(big.Int).Div(bdiff, big.NewInt(1000000000))\n\treward := new(big.Int).Add(new(big.Int).Mul(argA, diff), argB)\n\n\tif reward.Cmp(lReward) < 0 {\n\t\treward = new(big.Int).Set(lReward)\n\t} else if reward.Cmp(hRewardV4) > 0 {\n\t\treward = new(big.Int).Set(hRewardV4)\n\t}\n\n\ti := new(big.Int).Add(new(big.Int).Div(new(big.Int).Sub(number, halveNimber), interval), big1)\n\treward.Div(reward, new(big.Int).Exp(big2, new(big.Int).Add(i, big1), nil))\n\n\tres[0] = reward\n\tres[1] = big.NewInt(0)\n\treturn res\n\n}\n\n/**\n  [0] block reward\n  [1] community reward\n  [2] team reward\n*/\nfunc GetBlockReward(block *types.Block) [2]*big.Int {\n\tnumber := block.Number()\n\tdiff := block.Difficulty()\n\tgasUsed := block.GasUsed()\n\tgasLimit := block.GasLimit()\n\tif number.Uint64() >= seroparam.SIP7() {\n\t\treturn accumulateRewardsV5(number, diff)\n\t} else if number.Uint64() >= seroparam.SIP4() {\n\t\treturn accumulateRewardsV4(number, diff)\n\t} else if number.Uint64() >= seroparam.SIP3() {\n\t\treturn accumulateRewardsV3(number, diff)\n\t} else if number.Uint64() >= seroparam.SIP1() {\n\t\treturn accumulateRewardsV2(number, diff)\n\t} else {\n\t\tvar res [2]*big.Int\n\t\tres[0] = accumulateRewardsV1(diff, gasUsed, gasLimit)\n\t\tres[1] = big.NewInt(0)\n\t\treturn res\n\t}\n}\n"
  },
  {
    "path": "internal/ethapi/gentx.go",
    "content": "package ethapi\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype PkgCloseArgs struct {\n\tId  c_type.Uint256\n\tKey c_type.Uint256\n}\n\nfunc (self *PkgCloseArgs) toCmd() *prepare.PkgCloseCmd {\n\tif self == nil {\n\t\treturn nil\n\t}\n\treturn &prepare.PkgCloseCmd{\n\t\tself.Id,\n\t\tself.Key,\n\t}\n}\n\ntype PkgTransferArgs struct {\n\tId  c_type.Uint256\n\tPKr AllMixedAddress\n}\n\nfunc (self *PkgTransferArgs) toCmd() *prepare.PkgTransferCmd {\n\tif self == nil {\n\t\treturn nil\n\t}\n\treturn &prepare.PkgTransferCmd{\n\t\tself.Id,\n\t\tself.PKr.ToPKr(),\n\t}\n}\n\ntype PkgCreateArgs struct {\n\tId       c_type.Uint256\n\tPKr      AllMixedAddress\n\tCurrency Smbol\n\tValue    *Big\n\tMemo     c_type.Uint512\n}\n\nfunc (self *PkgCreateArgs) toCmd() *prepare.PkgCreateCmd {\n\tif self == nil {\n\t\treturn nil\n\t}\n\tasset := assets.Asset{}\n\tif !self.Currency.IsEmpty() && self.Value != nil {\n\t\tasset.Tkn = &assets.Token{\n\t\t\tutils.CurrencyToUint256(string(self.Currency)),\n\t\t\tutils.U256(*self.Value.ToInt()),\n\t\t}\n\t}\n\treturn &prepare.PkgCreateCmd{\n\t\tself.Id,\n\t\tself.PKr.ToPKr(),\n\t\tasset,\n\t\tself.Memo,\n\t}\n}\n\ntype BuyShareArgs struct {\n\tValue Big\n\tVote  PKrAddress\n\tPool  *c_type.Uint256\n}\n\nfunc (self *BuyShareArgs) toCmd() *stx.BuyShareCmd {\n\tif self == nil {\n\t\treturn nil\n\t}\n\treturn &stx.BuyShareCmd{\n\t\tutils.U256(*self.Value.ToInt()),\n\t\t*self.Vote.ToPKr(),\n\t\tself.Pool,\n\t}\n}\n\ntype RegistPoolArgs struct {\n\tValue   utils.U256\n\tVote    PKrAddress\n\tFeeRate uint32\n}\n\nfunc (self *RegistPoolArgs) toCmd() *stx.RegistPoolCmd {\n\tif self == nil {\n\t\treturn nil\n\t}\n\treturn &stx.RegistPoolCmd{\n\t\tutils.U256(*self.Value.ToInt()),\n\t\t*self.Vote.ToPKr(),\n\t\tself.FeeRate,\n\t}\n}\n\ntype ClosePoolArgs struct {\n}\n\nfunc (self *ClosePoolArgs) toCmd() *stx.ClosePoolCmd {\n\tif self == nil {\n\t\treturn nil\n\t}\n\treturn &stx.ClosePoolCmd{}\n}\n\ntype ContractArgs struct {\n\tCurrency Smbol\n\tValue    *Big\n\tCategory Smbol\n\tTkt      *common.Hash\n\tTo       *ContractAddress\n\tData     hexutil.Bytes\n}\n\nfunc (self *ContractArgs) toCmd() *stx.ContractCmd {\n\tif self == nil {\n\t\treturn nil\n\t}\n\tasset := assets.Asset{}\n\tif !self.Currency.IsEmpty() && self.Value != nil {\n\t\tasset.Tkn = &assets.Token{\n\t\t\tutils.CurrencyToUint256(string(self.Currency)),\n\t\t\tutils.U256(*self.Value.ToInt()),\n\t\t}\n\t}\n\tif !self.Category.IsEmpty() && self.Tkt != nil {\n\t\tasset.Tkt = &assets.Ticket{\n\t\t\tutils.CurrencyToUint256(string(self.Category)),\n\t\t\t*self.Tkt.HashToUint256(),\n\t\t}\n\t}\n\tvar pkr *c_type.PKr\n\tif self.To != nil {\n\t\ttemp := c_type.PKr(*self.To)\n\t\tpkr = &temp\n\n\t}\n\treturn &stx.ContractCmd{\n\t\tasset,\n\t\tpkr,\n\t\tself.Data,\n\t}\n}\n\ntype CmdsArgs struct {\n\t//Share\n\tBuyShare *BuyShareArgs\n\t//Pool\n\tRegistPool *RegistPoolArgs\n\tClosePool  *ClosePoolArgs\n\t//Contract\n\tContract *ContractArgs\n\t//Package\n\tPkgCreate   *PkgCreateArgs\n\tPkgTransfer *PkgTransferArgs\n\tPkgClose    *PkgCloseArgs\n}\n\nfunc (self *CmdsArgs) toCmds() prepare.Cmds {\n\treturn prepare.Cmds{\n\t\tself.BuyShare.toCmd(),\n\t\tself.RegistPool.toCmd(),\n\t\tself.ClosePool.toCmd(),\n\t\tself.Contract.toCmd(),\n\t\tself.PkgCreate.toCmd(),\n\t\tself.PkgTransfer.toCmd(),\n\t\tself.PkgClose.toCmd(),\n\t}\n}\n\ntype GenTxArgs struct {\n\tFrom       address.PKAddress\n\tRefundTo   *PKrAddress\n\tReceptions []ReceptionArgs\n\tCmds       *CmdsArgs\n\tGas        uint64\n\tGasPrice   *Big\n\tRoots      []c_type.Uint256\n}\n\nfunc (args GenTxArgs) check() error {\n\tif len(args.Receptions) == 0 && args.Cmds == nil {\n\t\treturn errors.New(\"have no receptions\")\n\t}\n\tif args.GasPrice == nil {\n\t\treturn fmt.Errorf(\"gasPrice not specified\")\n\t}\n\n\tif args.RefundTo != nil {\n\t\tif !superzk.IsPKrValid(args.RefundTo.ToPKr()) {\n\t\t\treturn errors.New(\"RefundTo is not a valid pkr\")\n\t\t}\n\t}\n\n\tif args.Cmds != nil {\n\t\tif args.Cmds.RegistPool != nil || args.Cmds.ClosePool != nil {\n\t\t\tif args.RefundTo == nil {\n\t\t\t\treturn errors.New(\"Close | Regist StakingNode must need fixed refund address\")\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, rec := range args.Receptions {\n\t\t_, err := validAddress(rec.Addr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif rec.Currency.IsEmpty() && rec.Category.IsEmpty() {\n\t\t\treturn errors.Errorf(\"%v reception currency and categroy is nil\", hexutil.Encode(rec.Addr[:]))\n\t\t}\n\t\tif rec.Value == nil && rec.TKt == nil {\n\t\t\treturn errors.Errorf(\"%v reception value  or ticket is nil\", hexutil.Encode(rec.Addr[:]))\n\t\t}\n\t}\n\treturn nil\n\n}\n\nfunc (args GenTxArgs) toTxParam() prepare.PreTxParam {\n\tgasPrice := args.GasPrice.ToInt()\n\n\tif gasPrice.Sign() == 0 {\n\t\tgasPrice = new(big.Int).SetUint64(defaultGasPrice)\n\t}\n\treceptions := []prepare.Reception{}\n\tfor _, rec := range args.Receptions {\n\t\tpkr := MixAdrressToPkr(rec.Addr)\n\t\tvar tkn *assets.Token\n\t\tvar tkt *assets.Ticket\n\t\tif rec.Currency != \"\" && rec.Value != nil {\n\t\t\tvar currency c_type.Uint256\n\t\t\tbytes := common.LeftPadBytes([]byte(string(rec.Currency)), 32)\n\t\t\tcopy(currency[:], bytes)\n\t\t\ttkn = &assets.Token{\n\t\t\t\tCurrency: currency,\n\t\t\t\tValue:    utils.U256(*rec.Value.ToInt()),\n\t\t\t}\n\t\t}\n\t\tif rec.Category != \"\" && rec.TKt != nil {\n\t\t\tvar category c_type.Uint256\n\t\t\tvar ticketValue c_type.Uint256\n\t\t\tbytes := common.LeftPadBytes([]byte(string(rec.Category)), 32)\n\t\t\tcopy(category[:], bytes)\n\t\t\tcopy(ticketValue[:], rec.TKt[:])\n\t\t\ttkt = &assets.Ticket{\n\t\t\t\tCategory: category,\n\t\t\t\tValue:    ticketValue,\n\t\t\t}\n\t\t}\n\t\tassets := assets.Asset{tkn, tkt}\n\t\treceptions = append(receptions, prepare.Reception{\n\t\t\tpkr,\n\t\t\tassets,\n\t\t})\n\t}\n\tvar refundPkr *c_type.PKr\n\tif args.RefundTo != nil {\n\t\trefundPkr = args.RefundTo.ToPKr()\n\t}\n\tcmds := prepare.Cmds{}\n\tif args.Cmds != nil {\n\t\tcmds = args.Cmds.toCmds()\n\t}\n\treturn prepare.PreTxParam{\n\t\targs.From.ToUint512(),\n\t\trefundPkr,\n\t\treceptions,\n\t\tcmds,\n\t\tassets.Token{\n\t\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\t\tutils.U256(*big.NewInt(0).Mul(big.NewInt(int64(args.Gas)), args.GasPrice.ToInt())),\n\t\t},\n\t\tgasPrice,\n\t\targs.Roots,\n\t}\n}\n"
  },
  {
    "path": "internal/ethapi/instance.go",
    "content": "package ethapi\n\nvar Backend_Instance Backend\n"
  },
  {
    "path": "internal/ethapi/json.go",
    "content": "package ethapi\n\nimport (\n\t\"bytes\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n)\n\ntype decError struct{ msg string }\n\nfunc (err decError) Error() string { return err.msg }\n\nvar (\n\tErrEmptyString   = &decError{\"empty input string\"}\n\tErrSyntax        = &decError{\"invalid hex string\"}\n\tErrMissingPrefix = &decError{\"hex string without 0x prefix\"}\n\tErrOddLength     = &decError{\"hex string of odd length\"}\n\tErrUint64Range   = &decError{\"hex number > 64 bits\"}\n)\n\nfunc isString(input []byte) bool {\n\treturn len(input) >= 2 && input[0] == '\"' && input[len(input)-1] == '\"'\n}\n\nfunc bytesHave0xPrefix(input []byte) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\n\ntype Big big.Int\n\nfunc (b Big) MarshalJSON() ([]byte, error) {\n\ti := big.Int(b)\n\tby, err := i.MarshalJSON()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif seroparam.IsExchangeValueStr() {\n\t\tbytes := make([]byte, len(by)+2)\n\t\tcopy(bytes[1:len(bytes)-1], by[:])\n\t\tbytes[0] = '\"'\n\t\tbytes[len(bytes)-1] = '\"'\n\t\treturn bytes, nil\n\t} else {\n\t\treturn by, err\n\t}\n}\n\n// UnmarshalJSON implements json.Unmarshaler.\nfunc (b *Big) UnmarshalJSON(input []byte) error {\n\tif isString(input) {\n\t\tinput = input[1 : len(input)-1]\n\t}\n\ti := big.Int{}\n\tif e := i.UnmarshalText(input); e != nil {\n\t\treturn e\n\t} else {\n\t\t*b = Big(i)\n\t\treturn nil\n\t}\n}\n\nfunc (b *Big) ToInt() *big.Int {\n\treturn (*big.Int)(b)\n}\n\ntype PKrAddress [96]byte\n\nfunc (b PKrAddress) ToPKr() *c_type.PKr {\n\tresult := &c_type.PKr{}\n\tcopy(result[:], b[:])\n\n\treturn result\n}\n\nfunc (b PKrAddress) MarshalText() ([]byte, error) {\n\treturn []byte(b.String()), nil\n}\n\nfunc (b PKrAddress) String() string {\n\treturn base58.Encode(b[:])\n\n}\n\nfunc (b PKrAddress) Base58() string {\n\treturn base58.Encode(b[:])\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *PKrAddress) UnmarshalText(input []byte) error {\n\tif len(input) == 0 {\n\t\treturn nil\n\t}\n\tout, err := address.DecodeAddr(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = address.ValidPkr(out)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcopy(b[:], out)\n\treturn nil\n}\n\ntype MixAdrress []byte\n\nfunc (b MixAdrress) MarshalText() ([]byte, error) {\n\treturn []byte(base58.Encode(b)), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *MixAdrress) UnmarshalText(input []byte) error {\n\n\tif len(input) == 0 {\n\t\treturn nil\n\t}\n\tout, err := address.DecodeAddr(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif len(out) == 96 {\n\t\terr := address.ValidPkr(out)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*b = out[:]\n\t\treturn nil\n\t} else if len(out) == 64 {\n\t\terr := address.ValidPk(out)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*b = out[:]\n\t\treturn nil\n\t} else {\n\t\treturn errors.New(\"invalid mix address\")\n\t}\n}\n\ntype AllMixedAddress [96]byte\n\nfunc (b *AllMixedAddress) setBytes(bs []byte) {\n\tcopy(b[:], bs)\n}\n\nfunc (b AllMixedAddress) ToPKrAddress() (ret PKrAddress) {\n\tcopy(ret[:], b[:])\n\treturn\n}\n\nfunc (b AllMixedAddress) IsContract() bool {\n\tempty := common.Hash{}\n\tif len(b) == 96 {\n\t\tif bytes.Compare(b[64:], empty[:]) == 0 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (b AllMixedAddress) ToPKr() (ret c_type.PKr) {\n\tcopy(ret[:], b[:])\n\treturn\n}\n\nfunc (b AllMixedAddress) MarshalText() ([]byte, error) {\n\tif b.IsContract() {\n\t\treturn []byte(base58.Encode(b[:64])), nil\n\t} else {\n\t\treturn []byte(base58.Encode(b[:])), nil\n\t}\n}\n\nfunc IsContract(b []byte) (bool, error) {\n\taddr := common.Address{}\n\tcopy(addr[:], b)\n\treturn txtool.Ref_inst.Bc.IsContract(addr)\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *AllMixedAddress) UnmarshalText(input []byte) error {\n\n\tif len(input) == 0 {\n\t\treturn ErrEmptyString\n\t}\n\tout, err := address.DecodeAddr(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(out) == 96 {\n\t\tif isContract, err := IsContract(out); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\tif isContract {\n\t\t\t\tcopy(b[:], out)\n\t\t\t\treturn nil\n\t\t\t} else {\n\t\t\t\terr := address.ValidPkr(out)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tcopy(b[:], out)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t} else if len(out) == 64 {\n\t\tcontract_addr := common.Address{}\n\t\tcopy(contract_addr[:], out)\n\t\tif isContract, err := txtool.Ref_inst.Bc.IsContract(contract_addr); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\tif isContract {\n\t\t\t\tcopy(b[:], out)\n\t\t\t\treturn nil\n\t\t\t} else {\n\t\t\t\terr := address.ValidPk(out)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tpk := c_type.Uint512{}\n\t\t\t\tcopy(pk[:], out[:])\n\t\t\t\tpkr := superzk.Pk2PKr(&pk, nil)\n\t\t\t\tcopy(b[:], pkr[:])\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn errors.New(\"AllMixedAddress must be length 64 or 96\")\n\t}\n\n\treturn nil\n\n}\n\ntype ContractAddress c_type.PKr\n\nfunc (b *ContractAddress) SetBytes(bs []byte) {\n\tcopy(b[:], bs)\n}\n\nfunc (b ContractAddress) MarshalText() ([]byte, error) {\n\treturn []byte(base58.Encode(b[:64])), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *ContractAddress) UnmarshalText(input []byte) error {\n\n\tif len(input) == 0 {\n\t\treturn ErrEmptyString\n\t}\n\tout, err := address.DecodeAddr(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(out) == 96 {\n\t\taddr := common.Address{}\n\t\tcopy(addr[:], out)\n\t\tif isContract, err := txtool.Ref_inst.Bc.IsContract(addr); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\tif isContract {\n\t\t\t\tcopy(b[:], out)\n\t\t\t\treturn nil\n\t\t\t} else {\n\t\t\t\treturn errors.New(\"this 96 bytes not contract address\")\n\t\t\t}\n\t\t}\n\t} else if len(out) == 64 {\n\t\tcontract_addr := common.Address{}\n\t\tcopy(contract_addr[:], out)\n\t\tif isContract, err := txtool.Ref_inst.Bc.IsContract(contract_addr); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\tif isContract {\n\t\t\t\tcopy(b[:], contract_addr[:])\n\t\t\t\treturn nil\n\t\t\t} else {\n\t\t\t\treturn errors.New(\"this 64 bytes not contract address\")\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn errors.New(\"ContractAddress must be length 64 or 96\")\n\t}\n}\n\ntype AllBase58Adrress []byte\n\nfunc (b AllBase58Adrress) MarshalText() ([]byte, error) {\n\treturn []byte(base58.Encode(b)), nil\n}\n\nfunc (b AllBase58Adrress) String() string {\n\treturn base58.Encode(b)\n}\nfunc (b AllBase58Adrress) Bytes() []byte {\n\treturn []byte(b)\n}\n\nfunc (b AllBase58Adrress) ToPkr(isContract bool) (ret c_type.PKr) {\n\tif len(b) == 96 {\n\t\tcopy(ret[:], b[:])\n\t} else {\n\t\tif isContract {\n\t\t\tcopy(ret[:], b[:])\n\t\t} else {\n\t\t\tvar pk c_type.Uint512\n\t\t\tcopy(pk[:], b[:])\n\t\t\tret = superzk.Pk2PKr(&pk, nil)\n\t\t}\n\t}\n\treturn\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (b *AllBase58Adrress) UnmarshalText(input []byte) error {\n\n\tif len(input) == 0 {\n\t\treturn nil\n\t}\n\tout, err := address.DecodeAddr(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(out) == 96 {\n\t\terr := address.ValidPkr(out)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*b = out[:]\n\t\treturn nil\n\t} else if len(out) == 64 {\n\t\t*b = out[:]\n\t\treturn nil\n\t} else {\n\t\treturn errors.New(\"invalid base58 address\")\n\t}\n}\n"
  },
  {
    "path": "internal/ethapi/util_test.go",
    "content": "package ethapi\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/cpt\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/common/address\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\nfunc TestMain(m *testing.M) {\n\tcpt.ZeroInit_NoCircuit()\n\tos.Exit(m.Run())\n}\n\nfunc Test_getPoolId(t *testing.T) {\n\ttk := address.Base58ToTk(\"3fCJhSjsGJPPB3tSqbycBbwyTahv1WAz8RJY7fpVBqr3mNTLL7NfejjtEywp7jvN3r4isHrh16hrvV8exqGYW4FM\")\n\tpk := address.StringToPk(\"3fCJhSjsGJPPB3tSqbycBbwyTahv1WAz8RJY7fpVBqr44A7foQAZjWssGXHjc7uVofYCx5cNkmV3k2kEJWU97nKY\")\n\trandHash := crypto.Keccak256Hash(tk[:])\n\tvar rand c_type.Uint256\n\tcopy(rand[:], randHash[:])\n\tpkr := superzk.Pk2PKr(pk.ToUint512().NewRef(), &rand)\n\tid := crypto.Keccak256Hash(pkr[:])\n\tfmt.Println(hexutil.Encode(id[:]))\n}\n"
  },
  {
    "path": "internal/guide/guide.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package guide is a small test suite to ensure snippets in the dev guide work.\npackage guide\n"
  },
  {
    "path": "internal/jsre/completion.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage jsre\n\nimport (\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/robertkrimen/otto\"\n)\n\n// CompleteKeywords returns potential continuations for the given line. Since line is\n// evaluated, callers need to make sure that evaluating line does not have side effects.\nfunc (jsre *JSRE) CompleteKeywords(line string) []string {\n\tvar results []string\n\tjsre.Do(func(vm *otto.Otto) {\n\t\tresults = getCompletions(vm, line)\n\t})\n\treturn results\n}\n\nfunc getCompletions(vm *otto.Otto, line string) (results []string) {\n\tparts := strings.Split(line, \".\")\n\tobjRef := \"this\"\n\tprefix := line\n\tif len(parts) > 1 {\n\t\tobjRef = strings.Join(parts[0:len(parts)-1], \".\")\n\t\tprefix = parts[len(parts)-1]\n\t}\n\n\tobj, _ := vm.Object(objRef)\n\tif obj == nil {\n\t\treturn nil\n\t}\n\titerOwnAndConstructorKeys(vm, obj, func(k string) {\n\t\tif strings.HasPrefix(k, prefix) {\n\t\t\tif objRef == \"this\" {\n\t\t\t\tresults = append(results, k)\n\t\t\t} else {\n\t\t\t\tresults = append(results, strings.Join(parts[:len(parts)-1], \".\")+\".\"+k)\n\t\t\t}\n\t\t}\n\t})\n\n\t// Append opening parenthesis (for functions) or dot (for objects)\n\t// if the line itself is the only completion.\n\tif len(results) == 1 && results[0] == line {\n\t\tobj, _ := vm.Object(line)\n\t\tif obj != nil {\n\t\t\tif obj.Class() == \"Function\" {\n\t\t\t\tresults[0] += \"(\"\n\t\t\t} else {\n\t\t\t\tresults[0] += \".\"\n\t\t\t}\n\t\t}\n\t}\n\n\tsort.Strings(results)\n\treturn results\n}\n"
  },
  {
    "path": "internal/jsre/deps/bignumber.js",
    "content": "/* bignumber.js v2.0.3 https://github.com/MikeMcl/bignumber.js/LICENCE */\n/* modified by zelig to fix https://github.com/robertkrimen/otto#regular-expression-incompatibility */\n!function(e){\"use strict\";function n(e){function a(e,n){var t,r,i,o,u,s,f=this;if(!(f instanceof a))return j&&L(26,\"constructor call without new\",e),new a(e,n);if(null!=n&&H(n,2,64,M,\"base\")){if(n=0|n,s=e+\"\",10==n)return f=new a(e instanceof a?e:s),U(f,P+f.e+1,k);if((o=\"number\"==typeof e)&&0*e!=0||!new RegExp(\"^-?\"+(t=\"[\"+O.slice(0,n)+\"]+\")+\"(?:\\\\.\"+t+\")?$\",37>n?\"i\":\"\").test(s))return g(f,s,o,n);o?(f.s=0>1/e?(s=s.slice(1),-1):1,j&&s.replace(/^0\\.0*|\\./,\"\").length>15&&L(M,b,e),o=!1):f.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1,s=D(s,10,n,f.s)}else{if(e instanceof a)return f.s=e.s,f.e=e.e,f.c=(e=e.c)?e.slice():e,void(M=0);if((o=\"number\"==typeof e)&&0*e==0){if(f.s=0>1/e?(e=-e,-1):1,e===~~e){for(r=0,i=e;i>=10;i/=10,r++);return f.e=r,f.c=[e],void(M=0)}s=e+\"\"}else{if(!p.test(s=e+\"\"))return g(f,s,o);f.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1}}for((r=s.indexOf(\".\"))>-1&&(s=s.replace(\".\",\"\")),(i=s.search(/e/i))>0?(0>r&&(r=i),r+=+s.slice(i+1),s=s.substring(0,i)):0>r&&(r=s.length),i=0;48===s.charCodeAt(i);i++);for(u=s.length;48===s.charCodeAt(--u););if(s=s.slice(i,u+1))if(u=s.length,o&&j&&u>15&&L(M,b,f.s*e),r=r-i-1,r>z)f.c=f.e=null;else if(G>r)f.c=[f.e=0];else{if(f.e=r,f.c=[],i=(r+1)%y,0>r&&(i+=y),u>i){for(i&&f.c.push(+s.slice(0,i)),u-=y;u>i;)f.c.push(+s.slice(i,i+=y));s=s.slice(i),i=y-s.length}else i-=u;for(;i--;s+=\"0\");f.c.push(+s)}else f.c=[f.e=0];M=0}function D(e,n,t,i){var o,u,f,c,h,g,p,d=e.indexOf(\".\"),m=P,w=k;for(37>t&&(e=e.toLowerCase()),d>=0&&(f=J,J=0,e=e.replace(\".\",\"\"),p=new a(t),h=p.pow(e.length-d),J=f,p.c=s(l(r(h.c),h.e),10,n),p.e=p.c.length),g=s(e,t,n),u=f=g.length;0==g[--f];g.pop());if(!g[0])return\"0\";if(0>d?--u:(h.c=g,h.e=u,h.s=i,h=C(h,p,m,w,n),g=h.c,c=h.r,u=h.e),o=u+m+1,d=g[o],f=n/2,c=c||0>o||null!=g[o+1],c=4>w?(null!=d||c)&&(0==w||w==(h.s<0?3:2)):d>f||d==f&&(4==w||c||6==w&&1&g[o-1]||w==(h.s<0?8:7)),1>o||!g[0])e=c?l(\"1\",-m):\"0\";else{if(g.length=o,c)for(--n;++g[--o]>n;)g[o]=0,o||(++u,g.unshift(1));for(f=g.length;!g[--f];);for(d=0,e=\"\";f>=d;e+=O.charAt(g[d++]));e=l(e,u)}return e}function _(e,n,t,i){var o,u,s,c,h;if(t=null!=t&&H(t,0,8,i,v)?0|t:k,!e.c)return e.toString();if(o=e.c[0],s=e.e,null==n)h=r(e.c),h=19==i||24==i&&B>=s?f(h,s):l(h,s);else if(e=U(new a(e),n,t),u=e.e,h=r(e.c),c=h.length,19==i||24==i&&(u>=n||B>=u)){for(;n>c;h+=\"0\",c++);h=f(h,u)}else if(n-=s,h=l(h,u),u+1>c){if(--n>0)for(h+=\".\";n--;h+=\"0\");}else if(n+=u-c,n>0)for(u+1==c&&(h+=\".\");n--;h+=\"0\");return e.s<0&&o?\"-\"+h:h}function x(e,n){var t,r,i=0;for(u(e[0])&&(e=e[0]),t=new a(e[0]);++i<e.length;){if(r=new a(e[i]),!r.s){t=r;break}n.call(t,r)&&(t=r)}return t}function F(e,n,t,r,i){return(n>e||e>t||e!=c(e))&&L(r,(i||\"decimal places\")+(n>e||e>t?\" out of range\":\" not an integer\"),e),!0}function I(e,n,t){for(var r=1,i=n.length;!n[--i];n.pop());for(i=n[0];i>=10;i/=10,r++);return(t=r+t*y-1)>z?e.c=e.e=null:G>t?e.c=[e.e=0]:(e.e=t,e.c=n),e}function L(e,n,t){var r=new Error([\"new BigNumber\",\"cmp\",\"config\",\"div\",\"divToInt\",\"eq\",\"gt\",\"gte\",\"lt\",\"lte\",\"minus\",\"mod\",\"plus\",\"precision\",\"random\",\"round\",\"shift\",\"times\",\"toDigits\",\"toExponential\",\"toFixed\",\"toFormat\",\"toFraction\",\"pow\",\"toPrecision\",\"toString\",\"BigNumber\"][e]+\"() \"+n+\": \"+t);throw r.name=\"BigNumber Error\",M=0,r}function U(e,n,t,r){var i,o,u,s,f,l,c,a=e.c,h=R;if(a){e:{for(i=1,s=a[0];s>=10;s/=10,i++);if(o=n-i,0>o)o+=y,u=n,f=a[l=0],c=f/h[i-u-1]%10|0;else if(l=d((o+1)/y),l>=a.length){if(!r)break e;for(;a.length<=l;a.push(0));f=c=0,i=1,o%=y,u=o-y+1}else{for(f=s=a[l],i=1;s>=10;s/=10,i++);o%=y,u=o-y+i,c=0>u?0:f/h[i-u-1]%10|0}if(r=r||0>n||null!=a[l+1]||(0>u?f:f%h[i-u-1]),r=4>t?(c||r)&&(0==t||t==(e.s<0?3:2)):c>5||5==c&&(4==t||r||6==t&&(o>0?u>0?f/h[i-u]:0:a[l-1])%10&1||t==(e.s<0?8:7)),1>n||!a[0])return a.length=0,r?(n-=e.e+1,a[0]=h[n%y],e.e=-n||0):a[0]=e.e=0,e;if(0==o?(a.length=l,s=1,l--):(a.length=l+1,s=h[y-o],a[l]=u>0?m(f/h[i-u]%h[u])*s:0),r)for(;;){if(0==l){for(o=1,u=a[0];u>=10;u/=10,o++);for(u=a[0]+=s,s=1;u>=10;u/=10,s++);o!=s&&(e.e++,a[0]==N&&(a[0]=1));break}if(a[l]+=s,a[l]!=N)break;a[l--]=0,s=1}for(o=a.length;0===a[--o];a.pop());}e.e>z?e.c=e.e=null:e.e<G&&(e.c=[e.e=0])}return e}var C,M=0,T=a.prototype,q=new a(1),P=20,k=4,B=-7,$=21,G=-1e7,z=1e7,j=!0,H=F,V=!1,W=1,J=100,X={decimalSeparator:\".\",groupSeparator:\",\",groupSize:3,secondaryGroupSize:0,fractionGroupSeparator:\" \",fractionGroupSize:0};return a.another=n,a.ROUND_UP=0,a.ROUND_DOWN=1,a.ROUND_CEIL=2,a.ROUND_FLOOR=3,a.ROUND_HALF_UP=4,a.ROUND_HALF_DOWN=5,a.ROUND_HALF_EVEN=6,a.ROUND_HALF_CEIL=7,a.ROUND_HALF_FLOOR=8,a.EUCLID=9,a.config=function(){var e,n,t=0,r={},i=arguments,s=i[0],f=s&&\"object\"==typeof s?function(){return s.hasOwnProperty(n)?null!=(e=s[n]):void 0}:function(){return i.length>t?null!=(e=i[t++]):void 0};return f(n=\"DECIMAL_PLACES\")&&H(e,0,E,2,n)&&(P=0|e),r[n]=P,f(n=\"ROUNDING_MODE\")&&H(e,0,8,2,n)&&(k=0|e),r[n]=k,f(n=\"EXPONENTIAL_AT\")&&(u(e)?H(e[0],-E,0,2,n)&&H(e[1],0,E,2,n)&&(B=0|e[0],$=0|e[1]):H(e,-E,E,2,n)&&(B=-($=0|(0>e?-e:e)))),r[n]=[B,$],f(n=\"RANGE\")&&(u(e)?H(e[0],-E,-1,2,n)&&H(e[1],1,E,2,n)&&(G=0|e[0],z=0|e[1]):H(e,-E,E,2,n)&&(0|e?G=-(z=0|(0>e?-e:e)):j&&L(2,n+\" cannot be zero\",e))),r[n]=[G,z],f(n=\"ERRORS\")&&(e===!!e||1===e||0===e?(M=0,H=(j=!!e)?F:o):j&&L(2,n+w,e)),r[n]=j,f(n=\"CRYPTO\")&&(e===!!e||1===e||0===e?(V=!(!e||!h||\"object\"!=typeof h),e&&!V&&j&&L(2,\"crypto unavailable\",h)):j&&L(2,n+w,e)),r[n]=V,f(n=\"MODULO_MODE\")&&H(e,0,9,2,n)&&(W=0|e),r[n]=W,f(n=\"POW_PRECISION\")&&H(e,0,E,2,n)&&(J=0|e),r[n]=J,f(n=\"FORMAT\")&&(\"object\"==typeof e?X=e:j&&L(2,n+\" not an object\",e)),r[n]=X,r},a.max=function(){return x(arguments,T.lt)},a.min=function(){return x(arguments,T.gt)},a.random=function(){var e=9007199254740992,n=Math.random()*e&2097151?function(){return m(Math.random()*e)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(e){var t,r,i,o,u,s=0,f=[],l=new a(q);if(e=null!=e&&H(e,0,E,14)?0|e:P,o=d(e/y),V)if(h&&h.getRandomValues){for(t=h.getRandomValues(new Uint32Array(o*=2));o>s;)u=131072*t[s]+(t[s+1]>>>11),u>=9e15?(r=h.getRandomValues(new Uint32Array(2)),t[s]=r[0],t[s+1]=r[1]):(f.push(u%1e14),s+=2);s=o/2}else if(h&&h.randomBytes){for(t=h.randomBytes(o*=7);o>s;)u=281474976710656*(31&t[s])+1099511627776*t[s+1]+4294967296*t[s+2]+16777216*t[s+3]+(t[s+4]<<16)+(t[s+5]<<8)+t[s+6],u>=9e15?h.randomBytes(7).copy(t,s):(f.push(u%1e14),s+=7);s=o/7}else j&&L(14,\"crypto unavailable\",h);if(!s)for(;o>s;)u=n(),9e15>u&&(f[s++]=u%1e14);for(o=f[--s],e%=y,o&&e&&(u=R[y-e],f[s]=m(o/u)*u);0===f[s];f.pop(),s--);if(0>s)f=[i=0];else{for(i=-1;0===f[0];f.shift(),i-=y);for(s=1,u=f[0];u>=10;u/=10,s++);y>s&&(i-=y-s)}return l.e=i,l.c=f,l}}(),C=function(){function e(e,n,t){var r,i,o,u,s=0,f=e.length,l=n%A,c=n/A|0;for(e=e.slice();f--;)o=e[f]%A,u=e[f]/A|0,r=c*o+u*l,i=l*o+r%A*A+s,s=(i/t|0)+(r/A|0)+c*u,e[f]=i%t;return s&&e.unshift(s),e}function n(e,n,t,r){var i,o;if(t!=r)o=t>r?1:-1;else for(i=o=0;t>i;i++)if(e[i]!=n[i]){o=e[i]>n[i]?1:-1;break}return o}function r(e,n,t,r){for(var i=0;t--;)e[t]-=i,i=e[t]<n[t]?1:0,e[t]=i*r+e[t]-n[t];for(;!e[0]&&e.length>1;e.shift());}return function(i,o,u,s,f){var l,c,h,g,p,d,w,v,b,O,S,R,A,E,D,_,x,F=i.s==o.s?1:-1,I=i.c,L=o.c;if(!(I&&I[0]&&L&&L[0]))return new a(i.s&&o.s&&(I?!L||I[0]!=L[0]:L)?I&&0==I[0]||!L?0*F:F/0:0/0);for(v=new a(F),b=v.c=[],c=i.e-o.e,F=u+c+1,f||(f=N,c=t(i.e/y)-t(o.e/y),F=F/y|0),h=0;L[h]==(I[h]||0);h++);if(L[h]>(I[h]||0)&&c--,0>F)b.push(1),g=!0;else{for(E=I.length,_=L.length,h=0,F+=2,p=m(f/(L[0]+1)),p>1&&(L=e(L,p,f),I=e(I,p,f),_=L.length,E=I.length),A=_,O=I.slice(0,_),S=O.length;_>S;O[S++]=0);x=L.slice(),x.unshift(0),D=L[0],L[1]>=f/2&&D++;do p=0,l=n(L,O,_,S),0>l?(R=O[0],_!=S&&(R=R*f+(O[1]||0)),p=m(R/D),p>1?(p>=f&&(p=f-1),d=e(L,p,f),w=d.length,S=O.length,l=n(d,O,w,S),1==l&&(p--,r(d,w>_?x:L,w,f))):(0==p&&(l=p=1),d=L.slice()),w=d.length,S>w&&d.unshift(0),r(O,d,S,f),-1==l&&(S=O.length,l=n(L,O,_,S),1>l&&(p++,r(O,S>_?x:L,S,f))),S=O.length):0===l&&(p++,O=[0]),b[h++]=p,l&&O[0]?O[S++]=I[A]||0:(O=[I[A]],S=1);while((A++<E||null!=O[0])&&F--);g=null!=O[0],b[0]||b.shift()}if(f==N){for(h=1,F=b[0];F>=10;F/=10,h++);U(v,u+(v.e=h+c*y-1)+1,s,g)}else v.e=c,v.r=+g;return v}}(),g=function(){var e=/^(-?)0([xbo])(\\w[\\w.]*$)/i,n=/^([^.]+)\\.$/,t=/^\\.([^.]+)$/,r=/^-?(Infinity|NaN)$/,i=/^\\s*\\+([\\w.])|^\\s+|\\s+$/g;return function(o,u,s,f){var l,c=s?u:u.replace(i,\"$1\");if(r.test(c))o.s=isNaN(c)?null:0>c?-1:1;else{if(!s&&(c=c.replace(e,function(e,n,t){return l=\"x\"==(t=t.toLowerCase())?16:\"b\"==t?2:8,f&&f!=l?e:n}),f&&(l=f,c=c.replace(n,\"$1\").replace(t,\"0.$1\")),u!=c))return new a(c,l);j&&L(M,\"not a\"+(f?\" base \"+f:\"\")+\" number\",u),o.s=null}o.c=o.e=null,M=0}}(),T.absoluteValue=T.abs=function(){var e=new a(this);return e.s<0&&(e.s=1),e},T.ceil=function(){return U(new a(this),this.e+1,2)},T.comparedTo=T.cmp=function(e,n){return M=1,i(this,new a(e,n))},T.decimalPlaces=T.dp=function(){var e,n,r=this.c;if(!r)return null;if(e=((n=r.length-1)-t(this.e/y))*y,n=r[n])for(;n%10==0;n/=10,e--);return 0>e&&(e=0),e},T.dividedBy=T.div=function(e,n){return M=3,C(this,new a(e,n),P,k)},T.dividedToIntegerBy=T.divToInt=function(e,n){return M=4,C(this,new a(e,n),0,1)},T.equals=T.eq=function(e,n){return M=5,0===i(this,new a(e,n))},T.floor=function(){return U(new a(this),this.e+1,3)},T.greaterThan=T.gt=function(e,n){return M=6,i(this,new a(e,n))>0},T.greaterThanOrEqualTo=T.gte=function(e,n){return M=7,1===(n=i(this,new a(e,n)))||0===n},T.isFinite=function(){return!!this.c},T.isInteger=T.isInt=function(){return!!this.c&&t(this.e/y)>this.c.length-2},T.isNaN=function(){return!this.s},T.isNegative=T.isNeg=function(){return this.s<0},T.isZero=function(){return!!this.c&&0==this.c[0]},T.lessThan=T.lt=function(e,n){return M=8,i(this,new a(e,n))<0},T.lessThanOrEqualTo=T.lte=function(e,n){return M=9,-1===(n=i(this,new a(e,n)))||0===n},T.minus=T.sub=function(e,n){var r,i,o,u,s=this,f=s.s;if(M=10,e=new a(e,n),n=e.s,!f||!n)return new a(0/0);if(f!=n)return e.s=-n,s.plus(e);var l=s.e/y,c=e.e/y,h=s.c,g=e.c;if(!l||!c){if(!h||!g)return h?(e.s=-n,e):new a(g?s:0/0);if(!h[0]||!g[0])return g[0]?(e.s=-n,e):new a(h[0]?s:3==k?-0:0)}if(l=t(l),c=t(c),h=h.slice(),f=l-c){for((u=0>f)?(f=-f,o=h):(c=l,o=g),o.reverse(),n=f;n--;o.push(0));o.reverse()}else for(i=(u=(f=h.length)<(n=g.length))?f:n,f=n=0;i>n;n++)if(h[n]!=g[n]){u=h[n]<g[n];break}if(u&&(o=h,h=g,g=o,e.s=-e.s),n=(i=g.length)-(r=h.length),n>0)for(;n--;h[r++]=0);for(n=N-1;i>f;){if(h[--i]<g[i]){for(r=i;r&&!h[--r];h[r]=n);--h[r],h[i]+=N}h[i]-=g[i]}for(;0==h[0];h.shift(),--c);return h[0]?I(e,h,c):(e.s=3==k?-1:1,e.c=[e.e=0],e)},T.modulo=T.mod=function(e,n){var t,r,i=this;return M=11,e=new a(e,n),!i.c||!e.s||e.c&&!e.c[0]?new a(0/0):!e.c||i.c&&!i.c[0]?new a(i):(9==W?(r=e.s,e.s=1,t=C(i,e,0,3),e.s=r,t.s*=r):t=C(i,e,0,W),i.minus(t.times(e)))},T.negated=T.neg=function(){var e=new a(this);return e.s=-e.s||null,e},T.plus=T.add=function(e,n){var r,i=this,o=i.s;if(M=12,e=new a(e,n),n=e.s,!o||!n)return new a(0/0);if(o!=n)return e.s=-n,i.minus(e);var u=i.e/y,s=e.e/y,f=i.c,l=e.c;if(!u||!s){if(!f||!l)return new a(o/0);if(!f[0]||!l[0])return l[0]?e:new a(f[0]?i:0*o)}if(u=t(u),s=t(s),f=f.slice(),o=u-s){for(o>0?(s=u,r=l):(o=-o,r=f),r.reverse();o--;r.push(0));r.reverse()}for(o=f.length,n=l.length,0>o-n&&(r=l,l=f,f=r,n=o),o=0;n;)o=(f[--n]=f[n]+l[n]+o)/N|0,f[n]%=N;return o&&(f.unshift(o),++s),I(e,f,s)},T.precision=T.sd=function(e){var n,t,r=this,i=r.c;if(null!=e&&e!==!!e&&1!==e&&0!==e&&(j&&L(13,\"argument\"+w,e),e!=!!e&&(e=null)),!i)return null;if(t=i.length-1,n=t*y+1,t=i[t]){for(;t%10==0;t/=10,n--);for(t=i[0];t>=10;t/=10,n++);}return e&&r.e+1>n&&(n=r.e+1),n},T.round=function(e,n){var t=new a(this);return(null==e||H(e,0,E,15))&&U(t,~~e+this.e+1,null!=n&&H(n,0,8,15,v)?0|n:k),t},T.shift=function(e){var n=this;return H(e,-S,S,16,\"argument\")?n.times(\"1e\"+c(e)):new a(n.c&&n.c[0]&&(-S>e||e>S)?n.s*(0>e?0:1/0):n)},T.squareRoot=T.sqrt=function(){var e,n,i,o,u,s=this,f=s.c,l=s.s,c=s.e,h=P+4,g=new a(\"0.5\");if(1!==l||!f||!f[0])return new a(!l||0>l&&(!f||f[0])?0/0:f?s:1/0);if(l=Math.sqrt(+s),0==l||l==1/0?(n=r(f),(n.length+c)%2==0&&(n+=\"0\"),l=Math.sqrt(n),c=t((c+1)/2)-(0>c||c%2),l==1/0?n=\"1e\"+c:(n=l.toExponential(),n=n.slice(0,n.indexOf(\"e\")+1)+c),i=new a(n)):i=new a(l+\"\"),i.c[0])for(c=i.e,l=c+h,3>l&&(l=0);;)if(u=i,i=g.times(u.plus(C(s,u,h,1))),r(u.c).slice(0,l)===(n=r(i.c)).slice(0,l)){if(i.e<c&&--l,n=n.slice(l-3,l+1),\"9999\"!=n&&(o||\"4999\"!=n)){(!+n||!+n.slice(1)&&\"5\"==n.charAt(0))&&(U(i,i.e+P+2,1),e=!i.times(i).eq(s));break}if(!o&&(U(u,u.e+P+2,0),u.times(u).eq(s))){i=u;break}h+=4,l+=4,o=1}return U(i,i.e+P+1,k,e)},T.times=T.mul=function(e,n){var r,i,o,u,s,f,l,c,h,g,p,d,m,w,v,b=this,O=b.c,S=(M=17,e=new a(e,n)).c;if(!(O&&S&&O[0]&&S[0]))return!b.s||!e.s||O&&!O[0]&&!S||S&&!S[0]&&!O?e.c=e.e=e.s=null:(e.s*=b.s,O&&S?(e.c=[0],e.e=0):e.c=e.e=null),e;for(i=t(b.e/y)+t(e.e/y),e.s*=b.s,l=O.length,g=S.length,g>l&&(m=O,O=S,S=m,o=l,l=g,g=o),o=l+g,m=[];o--;m.push(0));for(w=N,v=A,o=g;--o>=0;){for(r=0,p=S[o]%v,d=S[o]/v|0,s=l,u=o+s;u>o;)c=O[--s]%v,h=O[s]/v|0,f=d*c+h*p,c=p*c+f%v*v+m[u]+r,r=(c/w|0)+(f/v|0)+d*h,m[u--]=c%w;m[u]=r}return r?++i:m.shift(),I(e,m,i)},T.toDigits=function(e,n){var t=new a(this);return e=null!=e&&H(e,1,E,18,\"precision\")?0|e:null,n=null!=n&&H(n,0,8,18,v)?0|n:k,e?U(t,e,n):t},T.toExponential=function(e,n){return _(this,null!=e&&H(e,0,E,19)?~~e+1:null,n,19)},T.toFixed=function(e,n){return _(this,null!=e&&H(e,0,E,20)?~~e+this.e+1:null,n,20)},T.toFormat=function(e,n){var t=_(this,null!=e&&H(e,0,E,21)?~~e+this.e+1:null,n,21);if(this.c){var r,i=t.split(\".\"),o=+X.groupSize,u=+X.secondaryGroupSize,s=X.groupSeparator,f=i[0],l=i[1],c=this.s<0,a=c?f.slice(1):f,h=a.length;if(u&&(r=o,o=u,u=r,h-=r),o>0&&h>0){for(r=h%o||o,f=a.substr(0,r);h>r;r+=o)f+=s+a.substr(r,o);u>0&&(f+=s+a.slice(r)),c&&(f=\"-\"+f)}t=l?f+X.decimalSeparator+((u=+X.fractionGroupSize)?l.replace(new RegExp(\"\\\\d{\"+u+\"}\\\\B\",\"g\"),\"$&\"+X.fractionGroupSeparator):l):f}return t},T.toFraction=function(e){var n,t,i,o,u,s,f,l,c,h=j,g=this,p=g.c,d=new a(q),m=t=new a(q),w=f=new a(q);if(null!=e&&(j=!1,s=new a(e),j=h,(!(h=s.isInt())||s.lt(q))&&(j&&L(22,\"max denominator \"+(h?\"out of range\":\"not an integer\"),e),e=!h&&s.c&&U(s,s.e+1,1).gte(q)?s:null)),!p)return g.toString();for(c=r(p),o=d.e=c.length-g.e-1,d.c[0]=R[(u=o%y)<0?y+u:u],e=!e||s.cmp(d)>0?o>0?d:m:s,u=z,z=1/0,s=new a(c),f.c[0]=0;l=C(s,d,0,1),i=t.plus(l.times(w)),1!=i.cmp(e);)t=w,w=i,m=f.plus(l.times(i=m)),f=i,d=s.minus(l.times(i=d)),s=i;return i=C(e.minus(t),w,0,1),f=f.plus(i.times(m)),t=t.plus(i.times(w)),f.s=m.s=g.s,o*=2,n=C(m,w,o,k).minus(g).abs().cmp(C(f,t,o,k).minus(g).abs())<1?[m.toString(),w.toString()]:[f.toString(),t.toString()],z=u,n},T.toNumber=function(){var e=this;return+e||(e.s?0*e.s:0/0)},T.toPower=T.pow=function(e){var n,t,r=m(0>e?-e:+e),i=this;if(!H(e,-S,S,23,\"exponent\")&&(!isFinite(e)||r>S&&(e/=0)||parseFloat(e)!=e&&!(e=0/0)))return new a(Math.pow(+i,e));for(n=J?d(J/y+2):0,t=new a(q);;){if(r%2){if(t=t.times(i),!t.c)break;n&&t.c.length>n&&(t.c.length=n)}if(r=m(r/2),!r)break;i=i.times(i),n&&i.c&&i.c.length>n&&(i.c.length=n)}return 0>e&&(t=q.div(t)),n?U(t,J,k):t},T.toPrecision=function(e,n){return _(this,null!=e&&H(e,1,E,24,\"precision\")?0|e:null,n,24)},T.toString=function(e){var n,t=this,i=t.s,o=t.e;return null===o?i?(n=\"Infinity\",0>i&&(n=\"-\"+n)):n=\"NaN\":(n=r(t.c),n=null!=e&&H(e,2,64,25,\"base\")?D(l(n,o),0|e,10,i):B>=o||o>=$?f(n,o):l(n,o),0>i&&t.c[0]&&(n=\"-\"+n)),n},T.truncated=T.trunc=function(){return U(new a(this),this.e+1,1)},T.valueOf=T.toJSON=function(){return this.toString()},null!=e&&a.config(e),a}function t(e){var n=0|e;return e>0||e===n?n:n-1}function r(e){for(var n,t,r=1,i=e.length,o=e[0]+\"\";i>r;){for(n=e[r++]+\"\",t=y-n.length;t--;n=\"0\"+n);o+=n}for(i=o.length;48===o.charCodeAt(--i););return o.slice(0,i+1||1)}function i(e,n){var t,r,i=e.c,o=n.c,u=e.s,s=n.s,f=e.e,l=n.e;if(!u||!s)return null;if(t=i&&!i[0],r=o&&!o[0],t||r)return t?r?0:-s:u;if(u!=s)return u;if(t=0>u,r=f==l,!i||!o)return r?0:!i^t?1:-1;if(!r)return f>l^t?1:-1;for(s=(f=i.length)<(l=o.length)?f:l,u=0;s>u;u++)if(i[u]!=o[u])return i[u]>o[u]^t?1:-1;return f==l?0:f>l^t?1:-1}function o(e,n,t){return(e=c(e))>=n&&t>=e}function u(e){return\"[object Array]\"==Object.prototype.toString.call(e)}function s(e,n,t){for(var r,i,o=[0],u=0,s=e.length;s>u;){for(i=o.length;i--;o[i]*=n);for(o[r=0]+=O.indexOf(e.charAt(u++));r<o.length;r++)o[r]>t-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/t|0,o[r]%=t)}return o.reverse()}function f(e,n){return(e.length>1?e.charAt(0)+\".\"+e.slice(1):e)+(0>n?\"e\":\"e+\")+n}function l(e,n){var t,r;if(0>n){for(r=\"0.\";++n;r+=\"0\");e=r+e}else if(t=e.length,++n>t){for(r=\"0\",n-=t;--n;r+=\"0\");e+=r}else t>n&&(e=e.slice(0,n)+\".\"+e.slice(n));return e}function c(e){return e=parseFloat(e),0>e?d(e):m(e)}var a,h,g,p=/^-?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,d=Math.ceil,m=Math.floor,w=\" not a boolean or binary digit\",v=\"rounding mode\",b=\"number type has more than 15 significant digits\",O=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_\",N=1e14,y=14,S=9007199254740991,R=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],A=1e7,E=1e9;if(a=n(),\"function\"==typeof define&&define.amd)define(function(){return a});else if(\"undefined\"!=typeof module&&module.exports){if(module.exports=a,!h)try{h=require(\"crypto\")}catch(D){}}else e.BigNumber=a}(this);\n//# sourceMappingURL=doc/bignumber.js.map\n"
  },
  {
    "path": "internal/jsre/deps/bindata.go",
    "content": "// Code generated by go-bindata. DO NOT EDIT.\n// sources:\n// bignumber.js (17.314kB)\n// web3.js (680.707kB)\n\npackage deps\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n\tgz, err := gzip.NewReader(bytes.NewBuffer(data))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\n\tvar buf bytes.Buffer\n\t_, err = io.Copy(&buf, gz)\n\tclErr := gz.Close()\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\tif clErr != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\ntype asset struct {\n\tbytes  []byte\n\tinfo   os.FileInfo\n\tdigest [sha256.Size]byte\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\nvar _bignumberJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x94\\xbc\\x6b\\x77\\x9b\\xc8\\x93\\x38\\xfc\\x7e\\x3f\\x85\\xc4\\xc6\\x9c\\x6e\\x53\\x20\\x90\\x9d\\x38\\x86\\x14\\x9c\\x4c\\x62\\xe7\\xe7\\x79\\x1c\\x3b\\x4f\\x9c\\xcc\\xcc\\xae\\xa2\\xc9\\x91\\x51\\x23\\x75\\x82\\x40\\xe1\\x62\\xc7\\x09\\xfe\\x7d\\xf6\\xff\\xa9\\x6e\\x40\\xf2\\x25\\xbb\\xb3\\x6f\\x2c\\xe8\\x4b\\x75\\x75\\x75\\xdd\\xbb\\xf0\\x68\\x77\\x70\\x29\\x17\\x59\\xbd\\xba\\x14\\x85\\xf3\\xa5\\x1c\\x5c\\x8d\\x1d\\xd7\\xd9\\x1b\\x2c\\xab\\x6a\\x5d\\xfa\\xa3\\xd1\\x42\\x56\\xcb\\xfa\\xd2\\x89\\xf3\\xd5\\xe8\\xad\\xfc\\x2a\\xde\\xc6\\xe9\\x68\\x7b\\xf8\\xe8\\xf4\\xe4\\xd5\\xd1\\xd9\\xab\\xa3\\xc1\\xee\\xe8\\x3f\\x46\\xbb\\x83\\x55\\x3e\\x97\\x89\\x14\\xf3\\xc1\\xe5\\xcd\\xe0\\x87\\x48\\xe5\\x62\\x50\\xe5\\x83\\x44\\x7e\\x7f\\x0c\\x5c\\x91\\x5f\\x8a\\xa2\\xfa\\x5a\\xc8\\x95\\xc8\\x46\\x79\\x55\\xe5\\xff\\x59\\x88\\x45\\x9d\\xce\\x0a\\x5b\\x7c\\x5f\\x17\\xa2\\x2c\\x65\\x9e\\xd9\\x32\\x8b\\xf3\\xd5\\x7a\\x56\\xc9\\x4b\\x99\\xca\\xea\\x86\\x96\\x19\\x26\\x75\\x16\\x57\\x32\\xcf\\x98\\xe0\\x3f\\x8d\\xba\\x14\\x83\\xb2\\x2a\\x64\\x5c\\x19\\x41\\xd7\\x31\\x50\\x5d\\xfd\\xdb\\x8c\\x09\\xc8\\xf8\\xcf\\xab\\x59\\x31\\xa8\\xa0\\x00\\x09\\x39\\xd4\\x50\\x42\\x82\\xd5\\x52\\x96\\x81\\x4c\\xd8\\x90\\x25\\x03\\x99\\x95\\xd5\\x2c\\x8b\\x45\\x9e\\x0c\\x66\\x9c\\x17\\xa2\\xaa\\x8b\\x6c\\xf0\\xc5\\x34\\x4f\\xd9\\xf8\\x19\\x18\\x71\\x9e\\x95\\x55\\x51\\xc7\\x55\\x5e\\x0c\\xe2\\x59\\x9a\\x0e\\xae\\x65\\xb5\\xcc\\xeb\\x6a\\x90\\x89\\x6b\\x03\\x04\\x87\\x4c\\x5c\\xb7\\xeb\\x10\\xc0\\xac\\x4e\\xd3\\x21\\x66\\xa6\\xf9\\x2f\\x96\\xc1\\x18\\x9e\\xed\\xc3\\x5b\\x30\\x2e\\x67\\xa5\\x30\\x38\\xff\\x49\\xfd\\xe8\\x36\\x19\\x94\\x28\\x2c\\xc3\\x00\\xcf\\x45\\xcc\\xba\\x15\\x13\\x6c\\x21\\xdd\\x41\\x28\\x12\\x7e\\xc9\\xe1\\x23\\x4b\\xe0\\x9d\\x95\\x38\\xc2\\xf2\\xe0\\xab\\x5a\\x87\\xe5\\x68\\xe8\\xa3\\x30\\x10\\xab\\x9b\\x35\\x0d\\x16\\xdc\\x34\\xdd\\x5d\\x31\\x44\\xb7\\x69\\x86\\x04\\xec\\xbd\\x58\\x1c\\x7d\\x5f\\x33\\xe3\\x6f\\x3b\\x32\\x2c\\x56\\xa1\\x31\\x31\\xac\\x73\\xa7\\x4c\\x65\\x2c\\x98\\x0b\\x19\\xb7\\x8c\\xa9\\x65\\x70\\xcb\\x60\\x91\\xff\\xe9\\x93\\x63\\x58\\x95\\x65\\xf0\\xe8\\x89\\x01\\x7b\\x07\\x61\\x16\\x19\\xd2\\xf0\\x0d\\x83\\x3b\\x95\\x28\\x2b\\x56\\xf6\\x84\\x59\\xb0\\x04\\x4a\\xc8\\x69\\xbb\\x79\\xc4\\x12\\xa7\\x44\\x37\\xf4\\x46\\x22\\x62\\x25\\x96\\x2d\\x68\\x8f\\x83\\xed\\x71\\xdf\\x83\\x2f\\xa6\\x59\\x3a\\x85\\x58\\xa7\\xb3\\x58\\xb0\\xd1\\xdf\\xee\\x27\\xc7\\xdd\\x6d\\x3e\\x39\\x23\\x20\\xb8\\xa9\\xc8\\x16\\xd5\\x32\\xf4\\x9e\\x12\\xa5\\xdf\\xc2\\x25\\xd1\\x32\\xc7\\xa1\\xc7\\x7d\\x02\\xba\\xff\\x14\\x11\\x4b\\x27\\x5e\\xce\\x8a\\x57\\xf9\\x5c\\xbc\\xac\\x98\\xcb\\x1f\\x5d\\xa3\\xc4\\xd7\\xac\\x04\\xcf\\x85\\x0c\\x12\\xa7\\xe4\\xb7\\x22\\x2d\\x05\\x11\\xfa\\x2e\\x19\\x7b\\x22\\x3b\\x25\\x0a\\xa7\\x84\\xc4\\x11\\x28\\x1c\\x01\\x89\\x13\\x23\\xa3\\xc7\\x98\\x47\\xa2\\x05\\xcd\\x7d\\x01\\x57\\xb9\\x9c\\xb3\\xb7\\xe8\\xfe\\x6f\\xb4\\x46\\x74\\xd5\\xb1\\x6e\\xd1\\x41\\xa0\\x2d\\x5a\\xdc\\x04\\x22\\xfe\\xfb\\xdf\\xc4\\x90\\x79\\xc1\\x0a\\x74\\x41\\xa2\\x08\\x64\\x88\\x9e\\x1b\\xc8\\x11\\x7a\\x2e\\x14\\x96\\xc5\\x83\\x1e\\x35\\x81\\x85\\x42\\x68\\x22\\xa6\\x1b\\x04\\x6e\\x35\\xaf\\xf4\\xfb\\x1a\\xae\\xdb\\x13\\x51\\xcd\\xf7\\x8f\\x85\\x07\\xff\\x17\\xe2\\xdd\\xde\\x12\\x62\\xac\\xc0\\xd2\\x91\\xd9\\x5c\\x7c\\x3f\\x4f\\x98\\xe1\\x18\\x9c\\x87\\xb6\\x67\\x9a\\x6a\\x7c\\x77\\x78\\x86\\x63\\xd0\\xa1\\x71\\x60\\x92\\xa0\\x88\\x59\\x11\\x2f\\xd9\\x48\\x8c\\x24\\xe7\\xa1\\x1b\\x31\\x37\\x2c\\x4c\\x93\\x15\\x28\\x39\\x14\\x16\\x5a\\xdd\\x3a\\xd2\\xf2\\x38\\xa8\\x65\\xeb\\x4b\\x92\\xd4\\x6c\\xc1\\x5c\\x90\\x9c\\xfb\\xdd\\xf8\\xb2\\xe5\\x02\\x0e\\x12\\xdd\\x60\\xff\\xf9\\x7d\\xb4\\x25\\x0f\\x24\\x91\\x88\\xd0\\xac\\xfb\\xd1\\x8f\\x0c\\xb4\\xed\\x9a\\x07\\xea\\xb0\\x36\\xbb\\x94\\x50\\x5b\\x1e\\xe7\\x32\\xd9\\x9a\\x0a\\xb9\\x69\\x7e\\x31\\xcd\\x7a\\x8b\\xed\\x12\\xa7\\xdc\\x15\\x1c\\x0a\\x2c\\x6c\\x69\\x7b\\x50\\x84\\x3f\\x38\\x1d\\x02\\x1d\\x07\\x09\\x73\\x40\\x84\\x1f\\xc8\\x84\\xbd\\x09\\x0b\\xd5\\x31\\xa1\\x1e\\x77\\x1a\\x74\\x07\\xb2\\x75\\x6e\\x53\\x90\\xc8\\x0a\\xcb\\xe3\\x3b\\x37\\xa0\\xb7\\x28\\x2d\\xbc\\xe1\\x50\\x87\\x52\\xf3\\x80\\x34\\xcd\\xc4\\x89\\x9d\\x75\\x5d\\x2e\\x59\\x4f\\x25\\x45\\x12\\xa8\\x6d\\xbc\\x09\\xea\\x50\\x06\\xfc\\xe1\\x08\\x09\\x0a\\x0e\\x0f\\xb6\\x36\\x47\\x24\\xbb\\xb1\\xbb\\x7d\\xdd\\x6a\\x2c\\x6d\\xac\\x15\\xad\\x02\\x69\\xdb\\x41\\x69\\xa1\\xe1\\x1a\\xc4\\x11\\x3d\\x3c\\x2d\\x1e\\x83\\xed\\x6d\\xbc\\x45\\xf7\\xb6\\xd7\\x97\\xaf\\x49\\x8f\\x41\\x05\\x52\\xeb\\x4c\\xd2\\x96\\x09\\xc4\\xb0\\x84\\x05\\xac\\x61\\x8e\\xe2\\x0e\\x9b\\xc0\\x0a\\xdf\\xc1\\x35\\x7e\\x55\\x2b\\xee\\x1d\\x84\\x95\\x69\\x2a\\x51\\xaa\\xf2\\xd3\\xfc\\x5a\\x14\\xaf\\x66\\xa5\\x60\\x9c\\xc3\\x3c\\x44\\xd7\\x34\\x59\\x82\\xbf\\xc3\\xef\\xe8\\x02\\x8d\\xb8\\xc7\\x55\\xb0\\x6e\\x55\\x5f\\xc5\\x61\\x89\\x6b\\x67\\x9d\\x5f\\x33\\xd1\\x6e\\xcc\\x9e\\x73\\xf8\\x1d\\x13\\x58\\x3b\\x31\\x96\\x2c\\x65\\x05\\x5b\\x3a\\x31\\x87\\xa5\\x23\\xb8\\x12\\x7a\\x0e\\x6b\\x47\\xe0\\xda\\x89\\x7b\\x4e\\x5a\\x60\\xc9\\x04\\x54\\xd4\\x55\\x63\\x82\\x8b\\x8e\\x69\\x5c\\xc4\\xc5\\xc4\\xb6\\x93\\x69\\xb0\\x70\\xd6\\xf9\\x9a\\x71\\xc5\\x2e\\xc3\\xc5\\xc4\\x9d\\xb6\\x42\\x64\\xb8\\x06\\x35\\xb9\\xe1\\x3c\\xb2\\xed\\xda\\xa7\\x95\\x70\\x41\\x4b\\x61\\x0d\\x4b\\xa7\\x44\\x09\\x4b\\x7c\\xc5\\x96\\xb0\\x86\\x15\\x5c\\x13\\xfc\\x05\\x2e\\x9d\\x18\\x62\\x5c\\x3a\\x05\\xd4\\xa8\\x70\\xca\\xb1\\xb6\\x56\\x96\\x07\\x73\\x5c\\x4c\\xf2\\x29\\x24\\x98\\x8d\\xc6\\x10\\x63\\xdc\\x34\\x6e\\x98\\x37\\x8d\\x36\\x0f\\x8b\\x49\\x6e\\x79\\x53\\x88\\x71\\x3f\\xbc\\x8e\\x5a\\x93\\x31\\x6f\\x9a\\x98\\x9b\\x26\\x73\\x11\\xaf\\x9b\\xe6\\x1a\\x91\\x2d\\x9d\\xf2\\x85\\x1b\\xed\\xf9\\x63\\xce\\xfd\\x79\\x98\\x34\\xcd\\x1c\\x31\\x31\\x4d\\xb6\\xaf\\x46\\xc4\\x4d\\xf3\\x0c\\xf1\\xda\\x34\\x3d\\x73\\x31\\xc9\\x6d\\x6f\\xba\\x3d\\xe9\\xb9\\x7f\\xc0\\x39\\x78\\xb4\\xa2\\xde\\xa0\\xc0\\x38\\x4a\\x99\\xe1\\x19\\x60\\xaf\\xb8\\x4f\\x1b\\xed\\xd8\\xb7\\xa3\\x0f\\xe6\\x10\\x73\\x3a\\x49\\xdb\\xce\\x02\\xcb\\x22\\x52\\xe5\\xd3\\x30\\x0b\\x38\\xed\\x03\\x5d\\xc8\\x9b\\x86\\x59\\x56\\x0d\\x0b\\xa7\\xce\\xca\\xa5\\x4c\\x2a\\xe6\\x71\\x2d\\x98\\x5b\\x34\\x1e\\xb6\\x14\\xd6\\x1d\\x73\\x75\\xdc\\x86\\x11\\x24\\x21\\xce\\x03\\x61\\xe1\\xb9\\x12\\xd9\\x97\\x15\\x5b\\x4c\\xe6\\x96\\x35\\xe5\\x3c\\x10\\x98\\x32\\x01\\x35\\xbf\\x6d\\xd5\\x98\\xd8\\xf0\\xe2\\xe7\\x87\\xbc\\x58\\x12\\x2f\\xd2\\x11\\x55\\xa8\\x89\\x56\\x91\\x9d\\xad\\xc0\\x85\\xe7\\x20\\xe1\\x8a\\x47\\x6e\\x53\\xf9\\x5f\\x61\\x48\\xea\\xbc\\x03\\xe8\\x54\\xf9\\x85\\x56\\x3d\\xea\\xbc\\x73\\xd2\\xf5\\x13\\x77\\x4a\\x26\\xd8\\x11\\x40\\x60\\xc8\\x06\\x2f\\xb1\\x60\\x42\\x31\\x16\\x7a\\x87\\x88\\xb2\\x69\\xc6\\xfb\\x88\\xd2\\x34\\x7f\\x0b\\xb1\\x8c\\x12\\xb6\\x84\\x92\\xfb\\xa9\\xfa\\xe9\\x15\\x82\\xc0\\x8f\\xac\\x35\\xd9\\x9c\\x30\\x25\\x7e\\x23\\x98\\x3d\\x2c\\x62\\x8c\\x56\\xed\\xdc\\x05\\xca\\xea\\x10\\xb3\\xa6\\xf9\\x2d\\xc4\\x9a\\x6b\\xc5\\x10\\x64\\x61\\x1c\\x2c\\x95\\xc0\\x42\\x4c\\x1a\\x6f\\x89\\xb4\\x68\\xdd\\x0a\\x2c\\x39\\x0e\\x36\\x96\\xb0\\xc4\\x54\\xb5\\x92\\x66\\x0b\\x63\\x65\\x79\\x6c\\x3b\\x0b\\x5d\\x75\\x70\\x34\\xdd\\x31\\x82\\xcc\\xb6\\x5b\\x48\\x3c\\xd8\\xcc\\xb6\\xb0\\xb6\\x63\\xe8\\x86\\xd6\\x96\\x87\\x18\\x9b\\x66\\x3b\\x87\\xdf\\x99\\xd4\\x53\\xae\\x7c\\xe1\\x9a\\x66\\x1e\\x19\\xb6\\x61\\x2d\\xfd\\xe5\\xe6\\x64\\xbe\\xdf\\xf3\\xaa\\xd0\\xd5\\x0a\\x9a\\x09\\x62\\x35\\xad\\x05\\xe8\\x09\\xaa\\xce\\xa5\\xa1\\xb7\\xc0\\xb2\\xe4\\x8b\\x4e\\xac\\x03\\x85\\x7b\\xd1\\xf7\\xcb\\x29\\x87\\x61\\xe1\\x94\\xfc\\x67\\x85\\x45\\x70\\x59\\x88\\xd9\\xd7\\xdb\\xcc\\x21\\x7f\\x8b\\x55\\x50\\x10\\xcc\\x0a\\x8b\\x9e\\x4b\\xaa\\x0d\\x2e\\xc7\\x2d\\x97\\x14\\xc4\\x27\\xba\\x9b\\x65\\xa1\\x68\\x1a\\x11\\x56\\x4d\\x23\\x86\\x18\\x33\\xc1\\x39\\xe9\\xfa\\x02\\x98\\x6c\\x1a\\x63\\x2e\\x62\\xb9\\x9a\\xa5\\x03\\xa5\\x81\\x4a\\x83\\x5b\\xfd\\xf0\\xc8\\x18\\x90\\x5f\\x97\\x27\\x83\\x62\\x96\\x2d\\x84\\xe1\\x1b\\x83\\x2c\\xaf\\x06\\xb3\\x6c\\x20\\xb3\\x4a\\x2c\\x44\\x61\\x70\\xf2\\x51\\x86\\x5b\\xfa\\xf2\\x44\\xaf\\xae\\xcf\\x90\\xe8\\x51\\xa0\\x07\\x12\\xb3\\x5e\\x1e\\xb2\\x89\\x6d\\xcb\\x69\\x90\\x75\\x1a\\x47\\x19\\x01\\xcc\\x26\\xee\\xf4\\x57\\x7e\\x00\\x6d\\xd4\\xaa\\x76\\x6f\\x6c\\x8f\\x87\\x3f\\x22\\xe1\\xc4\\xc4\\x53\\x8a\\xdd\\xfd\\x37\\x61\\xa5\\x1a\\x26\\x42\\xa9\\x6e\\x9f\\xd1\\x6f\\x05\\xd4\\x94\\x71\\xd8\\x12\\x9d\\xd3\\x0e\\x2d\\x8d\\x12\\x11\\xf9\\xa8\\x28\\xf2\\x82\\x4d\\x0c\\x7a\\xfe\\x4d\\x2e\\xce\\xb4\\x3b\\x03\\x46\\xbc\\x5a\\x1b\\xca\\xc9\\x4d\\xe4\\xc2\\x00\\x63\\x2e\\xaf\\xf4\\xdf\\x0f\\xf9\\x49\\x56\\x19\\x60\\x88\\x6f\\x06\\x18\\x8b\\x4a\\xfd\\x11\\x06\\x18\\x69\\xa5\\xfe\\xd0\\xe3\\x4a\\x66\\x75\\x49\\xbf\\xf9\\xdc\\x00\\x63\\x9d\\xaa\\x97\\x75\\x21\\x62\\x49\\xfe\\xbb\\x01\\x46\\x31\\xcb\\xe6\\xf9\\x8a\\x1e\\xf2\\x3a\\xa3\\x31\\x4a\\x6f\\x18\\x60\\x54\\x72\\x25\\x68\\x70\\x95\\xbf\\x96\\x0b\\x59\\xe9\\xc7\\xa3\\xef\\xeb\\x3c\\x13\\x59\\x25\\x67\\xa9\\x7a\\x3f\\x96\\xdf\\xc5\\x5c\\x3f\\xe5\\xc5\\x6a\\x56\\xe9\\xc7\\x62\\xa6\\xb6\\x48\\x2b\\xe5\\xd7\\xaa\\xe9\\xdd\\xd6\\x8a\\x9d\\xac\\x1b\\x60\\x6c\\x36\\x39\\x9d\\x88\\xa9\\x65\\x30\\x3e\\x30\\xac\\xcc\\x32\\xfc\\x81\\x61\\x55\\x3c\\xa8\\x96\\x45\\x7e\\x3d\\x28\\x9c\\x6c\\xb6\\x12\\xb8\\x19\\xac\\xe9\\x64\\xc0\\x5b\\x74\\xa1\\xd8\\x10\\xf4\\x63\\xc7\\x65\\x9a\\xa4\\x7d\\x1c\\x01\\x29\\xc4\\x30\\x23\\x95\\x02\\x4b\\x7c\\x4f\\xfa\\x65\\xc6\\x7f\\x0a\\x5f\\xdb\\x7a\\x24\\xe7\\x74\\x46\\x47\\x5d\\xaa\\xa3\\x2e\\xd5\\x51\\x2b\\x7f\\x46\\x29\\xa2\\xcc\\x96\\xe0\\x86\\x39\\xcf\\x2d\\xbc\\x81\\x1a\\x33\\x48\\x70\\x36\\x49\\xd1\\x25\\xc3\\x90\\x8c\\x96\\x13\\x69\\xd7\\xb6\\x37\\xdd\\xf1\\xdc\\xc6\\xed\\x75\\x4e\\x8a\\x73\\xc6\\x72\\xcb\\xe3\\xa3\\x1b\\x0e\\x69\\x88\\xb3\\xce\\xec\\x29\\xd7\\xb0\\xe0\\x4a\\x72\\x06\\x42\\x3b\\x01\\x5d\\xe7\\x0b\\x4c\\x83\\x99\\x76\\x01\\x5c\\xe2\\x41\\x8c\\x95\\x2b\\xea\\x41\\xbe\\xa3\\x56\\xce\\xed\\x1b\\xcb\\xd3\\x0e\\xa6\\xd6\\xe7\\x84\\x76\\x4a\\xce\\x8c\\xf7\\x10\\xf5\\xad\\x39\\x12\\x62\\x74\\xc3\\x3a\\x72\\xfd\\x7b\\xe8\\xde\\x2a\\xd9\\x2e\\xc8\\xe6\\x65\\x9d\\xcd\\x9b\\x4d\\x52\\x8b\\x8c\\x14\\xa3\\x19\\x89\\x9f\\xec\\x74\\x33\\xc8\\xf5\\xda\\x0f\\xab\\x88\\xc5\\x4d\\x53\\xb4\\x16\\xb0\\x6a\\x9a\\x0a\\x91\\x89\\x2d\\x0b\\x18\\x87\\x4f\\x9b\\xe6\\xa9\\xd6\\x5a\\xfb\\x6a\\x44\\xa1\\x2c\\x20\\x79\\x1d\\x79\\xe8\\x46\\x75\\xe8\\x46\\x2d\\x1a\\x53\\xdf\\xf5\\x67\\x93\\x94\\x60\\xef\\x78\\xae\\xe9\\x6d\\x03\\xeb\\x2c\\x63\\xd6\\x34\\xc3\\xd9\\xc6\\xf4\\x0f\\x3a\\x5a\\xd1\\xb9\\x47\\xa4\\x6c\\x85\\x0a\\xb6\\x68\\x08\\x2e\\x27\\xd9\\xce\\xcd\\x14\\x48\\xda\\xec\\xac\\x69\\x5c\\xee\\xab\\x66\\x25\\x85\\x20\\x94\\xcb\\x80\\x98\\x47\\xac\\x87\\x91\\x42\\x89\\x1e\\xa4\\xb6\\xcd\\xfd\\xad\\x46\\x8b\\xf8\\x61\\x39\\xb9\\xb1\\xf3\\x29\\x10\\x7d\\x91\\x50\\x5e\\xb1\\x0e\\xe9\\x9d\\xe5\\xa4\\x9e\\xf2\\xdd\\xd2\\x77\\x39\\x14\\x4a\\x4b\\x07\\x5a\\x4b\\xba\\x88\\xa9\\xd6\\x30\\x39\\x7a\\x50\\x6b\\x96\\xaa\\xd5\\xb9\\xd4\\xea\\x5c\\xf2\\x8d\\x8b\\x4c\\x7d\\x16\\x96\\xb4\\xfe\\x9d\\x21\\xa5\\x3a\\xba\\x21\\x96\\xa4\\x9d\\x1d\\x61\\x59\\x7a\\x67\\x78\\x66\\x9a\\x4c\\x3d\\x91\\x31\\xd7\\x6a\\x97\\x98\\x78\\x92\\x2a\\x28\\xf4\\x3b\\xc4\\x33\\xcd\\x55\\x01\\x91\\xd4\\x26\\x57\\xa0\\x44\\xef\\x56\\xa3\\x33\\xdb\\x72\\xae\\x70\\xa6\\x5c\\x06\\xe2\\x34\\xad\\xeb\\x6e\\x85\\x23\\xee\\xab\\x30\\xe1\\x88\\x17\\x6f\\x14\\x0e\\xbd\\x1a\\xdb\\xb2\\xfd\\x24\\x5b\\xaf\\x94\\xec\\x7d\\xc0\\x99\\xb3\\x2e\\xf2\\x2a\\xa7\\x70\\x0b\\xbe\\xb5\\x76\\xc2\\xe3\\xf0\\x0e\\xc7\\x2e\\x7c\\xc5\\x7d\\xf8\\x0d\\xed\\x03\\x78\\x82\\x63\\x0f\\xde\\xa0\\xed\\x89\\x03\\xf8\\x81\\xf4\\xf7\\x0b\\x0e\\x5d\\xf8\\x17\\x1e\\xc3\\x1f\\x38\\xf4\\xe0\\x4f\\xf4\\xe0\\x77\\xf4\\x5c\\x17\\xfe\\xc2\\x9f\\xad\\xe6\\xbf\\x10\\xeb\\x59\\x31\\xab\\xf2\\xc2\\x27\\xf7\\x73\\x51\\xe4\\xf5\\x7a\\xab\\x09\\xba\\x26\\xf9\\x43\\xf8\\x7b\\x50\\x8a\\x38\\xcf\\xe6\\xb3\\xe2\\xe6\\x4d\\xdf\\xe8\\x42\\xd2\\x2a\\xa1\\x37\\xf7\\xe6\\x0e\\x8c\\x7b\\x5d\\x6a\\xf8\\x6d\\xd0\\xb3\\xd8\\x2c\\xcb\\xab\\xa5\\x28\\x30\\x83\\x99\\xf3\\xfe\\xfc\\xe3\\xd9\\xeb\\xcf\\x1f\\xdf\\xa1\\xdb\\xbf\\xbc\\x3e\\xff\\xf3\\x0c\\xbd\\xfe\\xf5\\xd5\\xd1\\xc9\\x29\\x8e\\xfb\\xd7\\xe3\\xd3\\xf3\\xf3\\xf7\\xb8\\xd7\\xbf\\xff\\xeb\\xe5\\xe9\\x31\\xcd\\xdf\\xbf\\xdb\\xa2\\x80\\x3c\\xbd\\xdb\\x76\\xf4\\xc7\\xd1\\x19\\x3e\\xbb\\xdb\\xa6\\xa0\\x1f\\xdc\\x6d\\xd3\\x4b\\x3c\\x87\\x99\\x73\\xf4\\xf1\\xd5\\xe9\\xc9\\x6b\\x3c\\x84\\x99\\xa3\\x6d\\x03\\xf6\\xa9\\x17\\xad\\x02\\x95\\x3e\\x24\\x61\\xc1\\x9f\\xb7\\x20\\x71\\x56\\x2c\\xea\\x95\\xc8\\x2a\\xe2\\x3c\\x49\\xee\\x55\\x42\\xac\\x66\\xe4\\x97\\x5f\\x44\\x5c\\x6d\\xa2\\xe6\\x32\\xda\\x02\\xd3\\x92\\xa5\\x74\\x96\\xb3\\xf2\\xfc\\x3a\\x7b\\x57\\xe4\\x6b\\x51\\x54\\x37\\x2c\\xe3\\x91\\x56\\x19\\x4c\\x60\\x39\\xc9\\xa6\\xdc\\xa7\\x60\\x78\\xe0\\xde\\xfa\\x0f\\x27\\xcb\\x2e\\x8d\\x50\\x6d\\xe6\\xc8\\x49\\x45\\xce\\x65\\x37\\xab\\x8f\\xaf\\x59\\x86\\xc6\\xeb\\xa3\\x57\\x27\\x6f\\x5f\\x9e\\x7e\\x7e\\x77\\xfa\\xf2\\xd5\\xd1\\x85\\xc1\\xc9\\x7f\\x14\\xe0\\xc2\\x11\\x8c\\x21\\x23\\xe5\\xf3\\x0e\\xdd\\x86\\xa2\\xc1\\x49\\x36\\xc5\\x77\\xa0\\xe6\\x28\\x02\\x9d\\x9c\\xbd\\xf9\\xfc\\xf6\\xfc\\xf5\\xd1\\x66\\xca\\xf3\\x6e\\xca\\xd7\\xad\\x29\\x5f\\xf5\\x94\\xa3\\xbf\\xde\\x9d\\x9f\\x1d\\x9d\\x7d\\x38\\x79\\x79\\xfa\\xf9\\xe5\\x07\\x9a\\x43\\xde\\x11\\x8f\\xfe\\xa5\\x5c\\x21\\xb0\\x8f\\xc0\\x6d\\x67\\x53\\x8b\\x37\\xdd\\xc6\\xe0\\x37\\x02\\x47\\xa3\\x9e\\xa8\\x07\\x6f\\xca\\x7d\\x5a\\xd0\\x3e\\xda\\x1e\\x62\\x33\\xea\\x65\\x6e\\x28\\x22\\x5b\\xf8\\x82\\x73\\xde\\x22\\x30\\xf9\\x0d\\x9e\\x4c\\x5b\\xbc\\x5f\\x9e\\xbd\\x39\\x7a\\x6c\\x6d\\xdb\\xbb\\xbb\\xb8\\xb7\\x81\\xfc\\xa6\\x5b\\xfc\\xc7\\x2f\\x17\\x77\\x1b\\x11\\xbd\\x41\\x9b\\xfd\\xb8\\x8b\\x80\\xaf\\x33\\x66\\x90\\x59\\xc6\\x20\\x9e\\x65\\xe4\\x39\\x5d\\x8a\\xc1\\x0f\\x51\\xe4\\x06\\x88\\x0d\\x7a\\x6f\\xe0\\x47\\x8b\\xde\\xd1\\xfb\\xf7\\xe7\\xef\\xd5\\x11\\x30\\x81\\x88\\xc3\\xa1\\x68\\x1a\\x0f\\x11\\x45\\xd3\\x90\\x36\\x11\\x11\\x23\\x45\\xf0\\x2f\\x64\\x5f\\xa8\\x8f\\x47\\xc7\\x7e\\xbe\\xb5\\xc8\\x35\\x01\\xd5\\x30\\xbf\\x68\\x78\\xaf\\xde\\xff\\xd7\\xbb\\x0f\\xe7\\xff\\x13\\xbc\\x3f\\x70\\xc8\\xa8\\x75\\xb8\\x6c\\x9a\\x8e\\x35\\x87\\x1d\\x6b\\x2e\\x39\\x08\\xd3\\x1c\\xfe\\xa1\\xf2\\x03\\xb4\\x86\\x11\\x17\\x37\\xeb\\x2a\\x1f\\xd4\\xd9\\xec\\x6a\\x26\\xd3\\xd9\\x65\\x2a\\x0c\\x58\\xf2\\xc7\\x71\\xf8\\x43\\xe3\\xf0\\xf6\\xfc\\xf5\\xc7\\xd3\\xf3\\x7b\\x8c\\x72\\xd8\\x51\\xee\\xcf\\x2d\\x46\\xf9\\x53\\x4f\\x78\\x77\\xfe\\xe7\\xe7\\x77\\xef\\x8f\\x5e\\x9d\\x5c\\x9c\\x9c\\x9f\\x3d\\xc2\\x8e\\xbf\\x6f\\x4d\\xf9\\x5d\\x4f\\x39\\x3e\\x7f\\xff\\xb6\\xe5\\xa9\\x07\\xf2\\x25\\xa2\\xbf\\x50\\x6c\\x9f\\x44\\xeb\\xc0\\xb6\\xe3\\x36\\xf8\\xfe\\x05\\xc5\\x2d\\xcc\\x9c\\xd5\\xec\\x3b\\x3e\\x14\\xaa\\xef\\x6c\\x23\\xce\\x1f\\x9c\\xb4\\xe2\\x6a\\xa8\\xcc\\xfe\\xd7\\xa1\\x0b\\x3d\\x54\\xfb\\x7d\\x0f\\x34\\x06\\x1e\\xba\\xee\\x81\\x77\\x78\\x38\\x7e\\xba\\x7f\\xb0\\xef\\x1e\\x1e\\x8e\\x21\\xc3\\xb7\\xb3\\x6a\\xd9\\x8e\\x67\\x7c\\x57\\x98\\x63\\xf7\\xf0\\xc0\\x7b\\xea\\x3d\\xa2\\x26\\x56\\xec\\xde\\x58\\xfe\\x98\\x3e\\x78\\xbe\\xf7\\xfc\\xf9\\x33\\xf7\\xf9\\x2e\\xf3\\xdc\\x83\\xbd\\x83\\x7d\\xef\\xf9\\x78\\x7f\\xf7\\xce\\xbc\\xc6\\xe5\\x16\\xeb\\x46\\xdd\\xef\\xd9\\xe8\\x8a\\xad\\x3c\\xf3\\xbd\\xe4\\x31\\xba\\x90\\xe0\\x64\\x0a\\x69\\x6b\\x93\\xbe\\x29\\x6f\\x4e\\xb4\\x01\\xa9\\xd8\\x9c\\xa0\\xb7\\x4f\\xf1\\xa8\\xf0\\xdf\\x41\\x8e\\x73\\x26\\xc8\\x61\\xfb\\x83\\xcb\\x84\\x2d\\x4d\\x73\\xe9\\x2c\\x44\\xf5\\x5e\\xad\\xfb\\xc7\\x2c\\xad\\x45\\xa9\\xcd\\x7b\\x85\\x0f\\x3a\\x54\\x80\\xf9\\x51\\x66\\xd5\\xde\\xf8\\x65\\x51\\xcc\\x6e\\x58\\xbe\\x8b\\x63\\xce\\x83\\x3c\\x2c\\x03\\x5e\\xa3\\xb7\\xe7\\xb9\\x07\\xe3\\xdd\\x6a\\x52\\x4e\\x2d\\x56\\x4d\\x4a\\xcb\\x9b\\x86\\x61\\xe8\\x79\\x1c\\xea\\x10\\x0f\\x85\\xf7\\x34\\x62\\xc5\\x3f\\x00\\x3a\\xe6\\x1c\\x08\\x06\\x16\\x24\\xfa\\x1a\\x0e\\x16\\x4a\\xfa\\x59\\xa2\\x1d\\xc7\\x7a\\xc7\\x13\\xde\\x3e\\x87\\xd2\\xc2\\x31\\x0f\\x4a\\xcc\\x47\\xe3\\x3e\\xb8\\x54\\x3b\\xd2\\x64\\xfc\\xed\\xa6\\xda\\xde\\xcd\\x56\\x23\\x61\\x7e\\xd0\\x23\\x3e\\x7e\\xee\\xed\\x1f\\xec\\x1f\\x1e\\x3c\\x3b\\xf0\\xdc\\x67\\x4f\\x9f\\xed\\xb2\\x3d\\xcf\\x24\\x0c\\xb8\\xe5\\xb9\\x87\\x87\\x4f\\x3d\\xef\\xd9\\xf8\\xe0\\xe0\\xe0\\xd9\\xae\\xc6\\xc5\\xda\\x1f\\x1f\\xee\\x1f\\x3e\\x3b\\x18\\x1f\\xea\\x96\\xf1\\xd4\\xf2\\x9e\\x1d\\x1c\\x1c\\x8c\\x3d\\xfd\\xbe\\xd7\\xee\\x7e\\x7f\\xfa\\xe2\\x85\\xf7\\x8c\\xeb\\x97\\xa7\\xd3\\x17\\x2f\\x9e\\x73\\x8b\\x1e\\x9f\\x4d\\x7b\\x7a\\xdc\\xc5\\xe9\\x80\\x3b\\x71\\xbe\\xbe\\x61\\x15\\x85\\xf7\\x8f\\x6c\\xf5\\x40\\x6f\\xf5\\x40\\x6f\\x55\\xc9\\x95\\xb7\\xff\\x2b\\xcd\\xa0\\xd2\\x49\\xa5\\xf6\\xdc\\xda\\x6d\\x66\\x8c\\x03\\x2d\\x1b\\xd6\\xa6\\xc9\\x92\\x49\\x69\\x59\\x53\\x6c\\xc1\\x07\\xda\\x83\\x4a\\x26\\xb6\\x5d\\x4e\\x41\\x90\\x57\\x9d\\x9b\\xa6\\x20\\x6d\\x8d\\xef\\x27\\x37\\xb6\\x98\\x42\\x42\\x47\\xb2\\x62\\xf9\\xa8\\xe6\\xbb\\x35\\x57\\x3e\\x16\\x35\\x05\\x89\\xf6\\xb0\\xa0\\xb4\\x6d\\xae\\x13\\x56\\x25\\x4f\\x70\\x22\\xfb\\xac\\xa4\\x0e\\x3f\\x6c\\xaf\\x9d\\xe2\\xd2\\x14\\x9d\\xb3\\xe1\\x20\\x6d\\xbc\\xd1\\x8b\\x97\\xca\\x9b\\x4c\\xee\\x7b\\x93\\xca\\x55\\xbc\\x09\\xc9\\x53\\xa4\\xb1\\x76\\xd9\\x3b\\x68\\xa9\\x23\\x50\\x42\\xea\\xc4\\x98\\x40\\x7a\\x7b\\xcb\\x38\\xbc\\xda\\x16\\xf2\\x3e\\x5a\\x12\\x77\\xc2\\xcf\\x3b\\x82\\xd3\\xc5\\xff\\x24\\x3e\\x3b\\x2f\\x21\\xc6\\x6c\\xf4\\xb2\\xd1\\xe9\\x03\\x81\\x7d\\x02\\x3e\\x48\\x6c\\x3b\\xe0\\x39\\x8a\\x49\\x32\\xdd\\x79\\x09\\xb5\\x7a\\xa0\\x81\\x50\\x60\\xbc\\x9b\\x5b\\xf5\\x6e\\x0a\\x12\\xd3\\xdd\\xdc\\x2a\\x76\\x5e\\xee\\xbe\\xb4\\xc8\\xeb\\x60\\x72\\x54\\x29\\xe1\\x2e\\x68\\x20\\xb7\\xe2\\xdd\\x1a\\x68\\x1a\\xca\\x9d\\xaa\\x13\\xeb\\xd2\\x34\\x45\\x9f\\xbe\\x2a\\xef\\x84\\xcc\\xd9\\x83\\x08\\x4f\\xe5\\x99\\x86\\x58\\xf0\\x1c\\xab\\xb0\\x88\\x3c\\xdf\\xf6\\x74\\x18\\xa6\\xa9\\x9b\\xa3\\x1b\\x54\\xa1\\x54\\xf9\\x69\\x52\\x00\\x13\\x39\\x1d\\x62\\x36\\x91\\x53\\xfe\\x93\\x10\\x97\\xd3\\x90\\x5e\\xf4\\x34\\xed\\x58\\xb7\\x48\\xe4\\x9b\\x45\\x8b\\xcd\\xa2\\x5d\\x02\\x41\\x12\\x58\\xda\\xbd\\x98\\x54\\x53\\x1b\\x25\\x48\\xa4\\xa7\\x17\\xd9\\xa4\\x22\\x60\\x2e\\xd0\\x1b\\xca\\xdd\\xc2\\x52\\x03\\xa8\\x59\\x07\\x7b\\x43\\x32\\xdb\\xb4\\xbf\\xee\\x5e\\x25\\x10\\xdd\\x99\\xf3\\xe0\\xf6\\xbe\\x5e\\xeb\\x23\\x58\\xbd\\xdd\\x74\\x93\\xe4\\x85\\x6b\\xb8\\x82\\x4b\\x38\\x87\\x0b\\x78\\x0f\\x2f\\xe1\\x08\\x5e\\xc3\\x67\\xf8\\x0e\\xc7\\x28\\x9d\\x12\\x31\\x77\\x4a\\xb5\\x25\\x38\\x41\\xe9\\xc4\\x70\\x8a\\xb9\\x13\\xeb\\x7b\\xb4\\x13\\xd3\\x3c\\x51\\x18\\x9c\\x9a\\xe6\\x29\\x05\\x56\\x5d\\x64\\xa5\\xd5\\xa4\\x74\\x4a\\xd3\\xcc\\xe9\\x0f\\x3b\\x89\\x86\\xa7\\x4d\\x43\\x83\\x87\\x48\\x23\\xfd\\x53\\x1e\\x9d\\x98\\xa6\\x8b\\x48\\x6d\\x4d\\x33\\x3c\\x8d\\xdc\\xdd\\x63\\xff\\x78\\xe4\\xfa\\xee\\xc8\\xd5\\xbc\\x7a\\xd5\\x6a\\xdb\\x63\\x0e\\x97\\x78\\xa5\\x73\\xed\\x31\\x4a\\x47\\xd8\\xb9\\x23\\xe0\\x18\\x6b\\x2b\\xb6\\x3c\\x48\\x9a\\x86\\x25\\x78\\x06\\x31\\x56\\x4c\\x3a\\xa4\\x72\\xed\\x8a\\xe5\\xea\\x01\\x8e\\xf1\\x78\\x74\\xd3\\xb8\\x1c\\x96\\xe8\\x06\\xa7\\x93\\xe5\\x14\\x91\\x9d\\x4c\\x96\\x53\\x8a\\xe7\\x82\\x65\\x1b\\x94\\x53\\x7b\\xd8\\x37\\x9b\\x66\\x6c\\xdb\\xe0\\x86\\xc7\\xfc\\x52\\x6b\\x06\\x8f\\xc3\\x02\\x87\\xee\\x46\\xc8\\x8e\\xf0\\xa4\\x63\\xe8\\xcf\\x78\\xda\\x3d\\x52\\x10\\x79\\x6c\\xe1\\x18\\xd6\\x48\\xe1\\x1d\\xa3\\x4d\\x5a\\x1e\\xe7\\xb0\\x0e\\x3d\\xd3\\x64\\xa7\\x28\\xd8\\x29\\xac\\x21\\xe1\\x70\\x82\\x82\\x9d\\xe8\\xc7\\xad\\xf9\\x1b\\xa8\\x1c\\x5e\\xe2\\x67\\x38\\xc7\\x93\\xfe\\xaa\\xe0\\x33\\x87\\x0b\\x3c\\xef\\xc2\\xae\\xcf\\xe1\\x45\\x70\\x3e\\xb9\\x20\\xb5\\xe2\\xf2\\xe0\\x3b\\x9e\\x76\\x12\\x04\\xdf\\x7b\\x3e\\x77\\x39\\xbc\\x56\\x74\\x86\\xd3\\x89\\x37\\x0d\\x31\\x19\\x8d\\x4d\\xf3\\xb5\\x65\\x05\\xf3\\x7c\\xb0\\x46\\x97\\x24\\x91\\x9d\\xc2\\x39\\x7c\\x86\\x0b\\x0e\\x6e\\x98\\x46\\xec\\x3d\\x9e\\xd3\\xf0\\xcf\\x43\\xbc\\x30\\x4d\\xf6\\x1e\\xdf\\xef\\x26\\x16\\x3b\\x9f\\x78\\x8a\\x28\\x5c\\xed\\xea\\xfd\\xe8\\xb5\\xda\\x4e\\xc4\\xd6\\xa1\\x4a\\x4a\\xaf\\x31\\xb1\\x3d\\x0e\\xf3\\xcd\\xde\\xae\\x71\\xde\\x6d\\x68\\x83\\xb1\\x5a\\x6d\\x0e\\xe7\\x70\\x4d\\xab\\x79\\x88\\x29\\xcd\\xb5\\x6d\\x28\\xd8\\x1c\\xae\\xc3\\xcf\\xd1\\x77\\xff\\x14\\xae\\x21\\xe1\\x9c\\xfb\\x14\\xf8\\xae\\x4d\\x93\\xa5\\xb8\\x46\\x05\\xba\\xdf\\xdd\\x5d\\xe0\\xe1\\xb5\\x69\\xce\\xb7\\xb7\\x5b\\xb0\\x73\\x98\\xc3\\x05\\x21\\x61\\xb7\\x4b\\xdc\\xc3\\xa0\\xdf\\xaf\\x17\\x2a\\x04\\x2c\\x4b\\x4d\\xba\\x68\\x11\\xb8\\x50\\x08\\x6c\\xa1\\xcd\\x7d\\xd2\\xa4\\xdd\\xd0\\x73\\x54\\xd9\\xcd\\xcb\\xc9\\x92\\x08\\xbf\\x86\\xd4\\x34\\x89\\x60\\x51\\x7b\\x12\\x27\\x93\\x97\\x44\\x29\\x9f\\x9d\\xe3\\x84\\x9e\\xa7\\x70\\x81\\x1e\\x0f\\xae\\x97\\x32\\x15\\x8c\\xbd\\xb4\\xac\\x17\\x47\\x5d\\x52\\xe4\\x5c\\x27\\x4c\\x8f\\x49\\x91\\x2f\\x70\\xd3\\x06\\x97\\x4a\\x12\\x2e\\x3b\\x09\\xa6\\xa0\\x3c\\x41\\x3c\\xd3\\x7a\\x62\\x89\\x1e\\x1c\\x23\\x0d\\x09\\x8e\\x95\\xe2\\x3e\\x56\\x8a\\x5b\\x31\\xf1\\x47\\x76\\x05\\xb5\\xc5\\xae\\x1c\\x81\\x4b\\x2b\\x56\\x69\\x44\\xcb\\x83\\x12\\x16\\x6d\\x26\\x99\\x3a\\x62\\xb8\\x72\\x0a\\xb4\\x16\\x9d\\x5a\\xbc\\x52\\xba\\xfc\\x61\\x88\\x87\\xa3\\xbf\\x99\\x1d\\x71\\x97\\x4d\\xbe\\x5f\\xe6\\x53\\xce\\x3e\\x5d\\x4f\\x3e\\x5d\\x3b\\xd3\\xdd\\x27\\x7c\\x24\\x21\\xa3\\xde\\xc9\\xdf\\xce\\xd4\\xe2\\x9f\\x9c\\x27\\x23\\xa8\\x70\\xf4\\xf7\\x27\\xa7\\x6d\\x79\\x32\\x82\\x02\\x47\\x7f\\xdb\\x11\\x3b\\xc9\\x12\\x99\\xc9\\xea\\xa6\\x39\\x9b\\x9d\\x51\\xb3\\xa4\\x61\\xe5\\xee\\x27\\x8b\\x29\\x58\\xbc\\xf9\\xfb\\x53\\x69\\x35\\x9f\\x4a\\xeb\\xc9\\x68\\xf1\\xc0\\xfb\\xba\\xaf\\xa3\\xb0\\x8c\\x6a\\xbf\\xee\\xaf\\x8f\\x24\\x18\\x4f\\x3c\\x43\\x09\\x6e\\xa1\\x2f\\x45\\x63\\xce\\x73\\xa7\\x44\\x59\\x9e\\xcd\\xce\\x58\\xac\\xe3\\x48\\xdf\\x0d\\xe3\\xc8\\xf6\\x7c\\xaf\\xbf\\xf2\\x18\\x92\\x16\\x8a\\x31\\xee\\x01\\x09\\xd8\\x38\\x7c\\xda\\x72\\x75\\x16\\x0f\\x8d\\xef\\x06\\x22\\xab\\xb0\\xba\\x77\\xad\\x15\\x79\\xcf\\x7c\\xe3\\x92\\x3c\\xef\\x68\\xec\\x3f\\x87\\xc4\\x34\\x93\\x21\\xa6\\x91\\xf0\\xb3\\x5b\\x4e\\x6f\\x2c\\xc5\\x04\\xb6\\xd7\\xc8\\x34\\xb2\\xfd\\x7b\\x05\\x86\\xeb\\x50\\x0b\\x87\\x7a\\x88\\xf1\\x3d\\x75\\x19\\x43\\xca\\x83\\x2f\\xfa\\x8a\\xd2\\x50\\x4e\\xbc\\x61\\xb1\\x24\\x32\\x06\\x97\\xb3\\x52\\x0c\\x0c\\x2b\\xf1\\x0d\\x83\\x93\\x7f\\xdf\\xe6\\x71\\x6b\\x0e\\xb4\\x71\\xda\\xef\\x6d\\xee\\xc4\\x98\\xb7\\x09\\x17\\x78\\x8b\\xae\\x3a\\xdd\\x0f\\xce\\xec\\xb2\\xcc\\xd3\\xba\\x12\\xca\\x07\\x44\\xf5\\xfe\\xf0\\xc4\\xdb\\x7b\\xb8\\xa5\\x2c\\xef\\xdf\\x03\\x30\\xe1\\x94\\x24\\x86\\xe2\\x16\\x3e\\x38\\xb1\\x90\\xe9\\x23\\xd1\\x40\\x77\\x1f\\xa2\\xe6\\x03\\xfd\\x55\\x49\\xb4\\x31\\x57\\x73\\xf2\\xd5\\x7a\\x56\\x88\\xf9\\x87\\x1c\\x3f\\x38\\xf1\\x6a\\x8d\\xdb\\x34\\xef\\x41\\xbc\\x45\\x0f\\xa4\\x02\\xb0\\x55\\x58\\xa1\\xe6\\xb7\\xe9\\x9b\\x77\\x2a\\x6f\\x8f\\x1f\\x9c\\xf9\\xfa\\xb1\\x9c\\x44\\xa1\\x4a\\x3b\\x5a\\xa3\\x54\\xf4\\x44\\xad\\xd3\\x54\\xbb\\xe9\\x8c\\x65\\x58\\x74\\x77\\x8b\\x1e\\xd9\\x07\\x8d\\xe6\\xe8\\x86\\xf3\\xdd\\x1b\\xc8\\x90\\xc2\\x23\\xed\\xc3\\x65\\x3b\\x9e\\x8b\\xe8\\x06\\x99\\x92\\x2e\\x41\\x32\\xda\\x82\\x73\\x43\\xa1\\xa2\\x4c\\xb7\\x25\\xc7\\x5c\\x5e\\xc9\\xb9\\x98\\xff\\x76\\x83\\xea\\xf9\\x57\\x3b\\xdb\\x83\\x57\\xf7\\x77\\x06\\xef\\xe0\\x2b\\xdf\\x02\\xa1\\xd2\\xee\\x62\\x21\\x8a\\x0e\\x96\\x6a\\xf8\\x15\\xc0\\xfd\\x47\\x00\\xba\\xe0\\x29\\x80\\xe2\\x5b\\x3d\\x4b\\x89\\x4e\\xe2\\xdb\\xaf\\xa6\\x3f\\x05\\xd2\\x6a\\x8f\\x53\\x3b\\x49\\xf3\\xbc\\xf8\\xe7\\x47\\xbc\\xa7\\x26\\x2d\\x0a\\x31\\xab\\x44\\xf1\\x61\\x39\\xcb\\x90\\xa2\\xc1\\x5f\\x2d\\xfc\\xec\\x91\\x23\\x0e\\xdd\\x7b\\x10\\xce\\x8b\\x23\\xda\\x82\\x62\\x97\\x45\\x25\\x7e\\x05\\xeb\\x80\\xac\\x08\\xb2\\xec\\x91\\x7d\\x70\\x1d\\xf9\\x67\\x04\\x58\\x96\\xc7\\xa4\\x87\\xc4\\xc3\\x2d\\x0d\\x87\\x9a\\x63\\xf4\\xa8\\x96\\xfc\\xd8\\x3e\\xff\\x7a\\xb8\\x69\\x6e\\xb1\\x4e\\xa8\\xdb\\x3a\\xbe\\x1a\\x6b\\x58\\x67\\xb3\\xb3\\x47\\xe6\\xab\\xa1\\x65\\x3b\\x42\\x2c\\x66\\x95\\xbc\\x12\\xd8\\xbe\\x3c\\x42\\x70\\x3d\\xfc\\x85\\xab\\x27\\xfc\\xb7\\x28\\xf2\\xff\\x09\\x27\\x17\\x5b\\xfe\\x9f\\xb8\\x53\\x9a\\x91\\x8a\\xb2\\x6c\\x8f\\x23\\xfd\\xe5\\x71\\x3c\\x7f\\xe4\\x38\\xf4\\x82\\xdd\\xf4\\xed\\xb3\\x48\\x7f\\x7d\\x16\\x87\\xca\\xde\\xfe\\xef\\x87\\xa1\\x6e\\x8e\\xf0\\x83\\x53\\xd6\\x97\\xf7\\x40\\xdd\\x8d\\x18\\x14\\x8c\\x04\\x4b\\x47\\xd5\\x6a\\xbd\\x55\\x62\\x88\\x5b\\xbc\\x9e\\xa9\\x5a\\x9e\\x61\\xd2\\x34\\xc3\\xec\\xae\\xfe\\x54\\x8e\\x23\\x19\\xcd\\xe1\\xa6\\xc0\\x8a\\x14\\x98\\x9d\\x41\\xe9\\xac\\xd3\\xba\\x64\\x82\\x07\\xca\\xaa\\xa0\\x3a\\x41\\x50\\x39\\xea\\xd1\\x0d\\x2c\\xb1\\x74\\x62\\x58\\xa0\\x68\\x55\\x48\\xda\\x34\\x43\\x7d\\xd1\\x3a\\x5c\\x36\\xcd\\x70\\xd1\\x01\\x5b\\x46\\xac\\x85\\x27\\xb8\\xaf\\xd7\\x5c\\x44\\xa5\\xdf\\xad\\x3b\\x5c\\x6a\\x57\\x76\\xab\\xba\\x60\\x40\\xcf\\x0f\\x67\\xd1\\xc0\\xa8\\xf4\\xf7\\x10\\xbf\\x46\\xb6\\xeb\\xbb\\xca\\xd6\\xa7\\x58\\xb1\\x94\\x2b\\x3f\\x56\\xdd\\x49\\x2f\\x7b\\xbf\\x2e\\xc1\\xd4\\x8e\\xb5\\x1b\\xc0\\x6a\\x74\\xc3\\x84\\x47\\x2c\\x41\\x3b\\x81\\x1c\\x97\\xdc\\x67\\x31\\xa6\\x90\\xe3\\x82\\xac\\x41\\x21\\xae\\x44\\x41\\xb6\\x0a\\x32\\x4c\\xd4\\x05\\x6f\\xbe\\xb9\\x03\\xda\\xea\\xbe\\xdd\\x0a\\x6a\\x58\\x8d\\x2c\\xe9\\x6f\\xad\\xf9\\x0b\\x96\\xf5\\x77\\xfb\\x9c\\x47\\x89\\x9f\\x41\\x82\\x19\\xba\\x81\\x0c\\xb3\\x20\\xd3\\x81\\xcf\\x72\\x92\\x4d\\x87\\xb8\\x20\\xad\\xf9\\xb3\\x46\\x7a\\x7b\\x41\\x2f\\x9b\\xcb\\x04\\x0a\\x7d\\x73\\x24\\xaf\\x78\\x01\\x0b\\xcc\\x41\\x11\\x40\\x38\\x25\\xe1\\xc5\\xe4\\x06\\xbe\\xad\\x52\\x15\\x9d\\xdf\\xdb\\xdd\\x54\\xeb\\x9b\\xe9\\x49\\xd1\\xba\\xb8\\xd4\\x94\\xe1\\x99\\xed\\x05\\x32\\x4c\\xf4\\xf5\\xc8\\x52\\x5d\\xb1\\xbe\\x58\\xa8\\xd0\\x4b\\x17\\x5a\\xc9\\xa0\\x30\\xcd\\x21\\x75\\x14\\x53\\x9a\\x3c\\xc5\\x8c\\x07\\xb6\\x4d\\x4f\\xb0\\x9c\\xc8\\xa9\\x85\\x67\\xb7\\xf4\\x6b\\x23\\xcd\\x52\\x77\\x19\\x14\\x2a\\xd3\\x51\\x04\\xcb\\x3e\\x52\\xb6\\xed\\xb8\\xd7\\xf8\\xea\\x94\\x4e\\x98\\x80\\x25\\xc4\\xdc\\x57\\x87\\xa8\\x4f\\xcc\\xf3\\x3d\\xd8\\xba\\xcc\\x00\\xa1\\x14\\xe1\\x2a\\x9f\\xd7\\x29\\x09\\xcb\\x2a\\x9f\\x3f\\xc2\\xe1\\xfa\\xd6\\x5c\\xd5\\x20\\x6e\\xcc\\x9e\\x77\\x97\\xb7\\x87\\xd2\\x89\\x9b\\x66\\x28\\x9c\\xb2\\x69\\x04\\x89\\xf6\\x50\\x17\\x2e\\x44\\x1b\\x06\\xf7\\xa9\\xa9\\x69\\xa4\\xea\\x95\\xdb\\xbd\\x92\\xfb\\xec\\x10\\xf1\\xcf\\x88\\x15\\x4a\\x44\\x94\\xed\\x86\\x0a\\x5f\\x31\\x09\\x02\\x5c\\xd8\\xe3\\xaa\\xa9\\x80\\xca\\x29\\x77\\xb1\\xe0\\xfe\\xa6\\xeb\\x4f\\x0e\\x52\\x0b\\x28\\xab\\x1c\\x75\\x51\\xcb\\x04\\xd7\\x36\\x21\\x23\\x6d\\x25\\xe6\\xa8\\x9e\\xfe\\xa9\\xef\\xa0\\xce\\x5a\\xfb\\xbb\\xda\\x58\\x92\\xf4\\x91\\xfb\\x31\\x7f\\x8c\\x32\\x1d\\x5d\\x20\\xa7\\x78\\xb3\\x95\\xfa\\xf1\\xa3\\x52\\x9f\\xff\\x5a\\xea\\xf3\\x87\\x52\\xdf\\xed\\xa9\\x15\\xfb\\x1a\\x55\\x7c\\xa8\\xab\\x40\\x46\\x37\\x90\\xa8\\x70\\x36\\xed\\xc5\\xbe\\x6e\\x9a\\x61\\xa9\\xc5\\x9e\\xb4\\x4b\\x7a\\x77\\x9d\\xbc\\x93\\xf2\\x44\\x4b\\x79\\xba\\x25\\xe5\\xf4\\x4c\\x6e\\xa0\\x1a\\x48\\xfd\\x91\\xf4\\xdd\\xdd\\x5c\\x89\\x75\\x8d\\x15\\xab\\x39\\x29\\x36\\x56\\x92\\x28\\x27\\xbd\\x58\\xe7\\x58\\xdb\\x6d\\xde\\x2c\\x0f\\xdd\\x88\\x95\\x58\\x43\\x81\\x29\\xf7\\x59\\x8e\\x76\\x0e\\x05\\x26\\x1c\\x8a\\x8d\\xcc\\x06\\xb9\\x6d\\x07\\xc5\\x46\\x9c\\xb7\\xba\\xda\\x9b\\xb9\\xa4\\x0b\\x77\\x32\\x4c\\xbb\\x47\\x37\\xcc\\xed\\x4c\\xd5\\xdd\\xa5\\x40\\xee\\x69\\x82\\x05\\x64\\x98\\xd3\\xea\\x6e\\x90\\x05\\x3c\\x47\\x96\\x4c\\x6c\\x3b\\x9b\\x62\\x32\\xc9\\xa6\\x56\\x4a\\x7f\\x72\\x3e\\x3a\\x6b\\x5c\\xa0\\x86\\x1d\\x3c\\xeb\\xce\\x35\\x37\\x4d\\x96\\xf4\\x21\\x57\\xce\\xc1\\xb2\\x4a\\x0e\\x24\\x1f\\x09\\x94\\x8a\\x57\\xfa\\x3a\\x00\\x52\\xf3\\xdb\\x27\\xad\\xcf\\x59\\x65\\x3d\\xf4\\x49\\x4b\\x2c\\x34\\xd1\\xfb\\x0c\\xaa\\x18\\xaa\\xf4\\xbd\\x69\\x7a\\x43\\xa4\\x77\\x57\\xff\\x30\\x9d\\x7f\\xdb\\x03\\xa3\\xcb\\x39\\x1b\\x2a\\x05\\x0f\\x62\\xa8\\x87\\xb7\\x59\\x58\\x4e\\xc2\\x73\\xdf\\xf3\\xab\\x50\\xf6\\x5e\\x1f\\x64\\x58\\xed\\xde\\x58\\x24\\x10\\x72\\x52\\xb5\\x5a\\x23\\xa8\\x5a\\x77\\xaf\\x52\\xee\\x5e\\x46\\xee\\x9e\\x4e\\x63\\x4a\\x52\\x0b\\x95\\x0a\\xb4\\xda\\x3e\\x0a\\xb4\\xfa\\x5b\\x4b\\xd3\\x2c\\xc8\\x05\\x0a\\x89\\xb2\\xe4\\x5b\\x0a\\xcb\\xe3\\xa0\\xcc\\x9c\\x2a\\x7b\\x78\\x4c\\xfc\\x1f\\x11\\x15\\xa6\\x2b\\x91\\x44\\xd3\\xf4\\xf9\\xe3\\xa7\\x9c\\x9b\\xe6\\x47\\x56\\xc1\\xbf\\xff\\x2d\\xac\\xde\\xd3\\xba\\x53\\x60\\xec\\xc2\\x73\\xf0\\x9e\\xea\\xca\\xa7\\xcc\\xff\\xca\\xa1\\xa2\\x75\\xd5\\xa9\\x3c\\x24\\xf9\\x1d\\x85\\xa3\\x6e\\x75\\x2e\\xe0\\x02\\xbc\\x67\\x5b\\xf4\\xe4\\x51\\xd6\\xca\\xbc\\xe1\\x09\\xc3\\x52\\xb5\\x33\\x2d\\x2b\\x67\\xa4\\x65\\x32\\xa5\\x64\\x4c\\x93\\xd9\\x17\\xba\\x68\\xe6\\x82\\x66\\x94\\xbb\\xea\\x1e\\xc8\\xf5\\x3d\\x52\\x4a\\x99\\x3a\\xff\\xf2\\x5b\\x3d\\x2b\\xc4\\xfb\\x3c\\xaf\\x88\\x01\\xbe\\x15\\xd5\\x63\\xce\\xfa\\x03\\x3b\\x4f\\x22\\x58\\x3a\\x25\\x45\\x7a\\xaa\\x90\\xea\\x9d\\xb5\\x0f\\x8b\\x96\\x5a\\x86\\xeb\\x3c\\xd5\\xc1\\x1e\\xb1\\x05\\xd9\\x65\\x92\\xcc\\x64\\x4b\\xf4\\xf4\\x38\\x32\\xd9\\xae\\x0a\\xeb\\x69\\x80\\xea\\x8f\\xdc\\x91\\xeb\\x27\\x51\\xa9\\x10\\x0c\\x94\\x7d\\x55\\xa9\\x7f\\xc2\\x8b\\x11\\xe7\\xba\\x0a\\x60\\x8a\\xe8\\x8d\\xdc\\x88\\x4e\\x91\\x25\\x1c\\x58\\x57\\xc6\\x63\\xc5\\x7c\\x67\\x8c\\xaa\\x8a\\x31\\xd3\\x35\\x52\\xb0\\x0d\\x20\\xd3\\x86\\x9a\\xc5\\x96\\xc7\\x47\\x63\\x6e\\x33\\x37\\x8c\\x9b\\x26\\xde\\x19\\xd3\\x30\\x05\\x31\\x43\\x4d\\x4e\\x9f\\x91\\x34\\xde\\x29\\x75\\x51\\xe6\\x39\\xdb\\xd4\\x64\\x6f\\x2a\\x2c\\x85\\xc1\\x2d\\x8f\\x5b\\x31\\x07\\xd9\\x52\\x20\\xe3\\xdc\\xef\\x9e\\x53\\xcb\\x30\\x48\\x53\\xd3\\x79\\x28\\x43\\xa9\\xb2\\x61\\x90\\x62\\x6c\\x2d\\x61\\x4f\\x6d\\x3f\\x25\\x83\\x19\\xe8\\xfa\\x57\\x09\\x64\\x69\\xf5\\xd1\\xd6\\xda\\x01\\x7a\\xc5\\x4a\\xa8\\x61\\x09\\x9e\\xba\\x9c\\x63\\xb5\\x13\\xf3\\x1e\\x8d\\x94\\x6b\\x37\\xae\\x60\\xd2\\x89\\xf9\\x76\\xbb\\xd2\\x89\\xd2\\x11\\x2f\\x62\\xd3\\xb4\\xed\\x74\\x0b\\xf9\\xd4\\xde\\x83\\x94\\x78\\xdf\\x38\\x3c\\x3c\\x3c\\x34\\x14\\x8f\\xb2\\xbc\\x69\\x8c\\xfd\\xf6\\x95\\xf3\\x9f\\x6c\\x68\\x65\\x4d\\x33\\xb4\\xb2\\xbe\\x10\\xd9\\x34\\x8d\\xa7\\x06\\x62\\xd6\\x55\\x06\\xba\\xc4\\xf4\\xec\\x23\\x93\\x20\\x1d\\x61\\xbd\\xb3\\xc6\\x40\\x31\\x27\\x0e\\x65\\x8b\\xbc\\xe4\\x8e\\xf8\\xc6\\xca\\xed\\x6a\\x85\\x61\\xae\\x66\\xd4\\x50\\xb7\\x33\\x5c\\x0e\\x75\\xb7\\xd7\\x6e\\x38\\xff\\x29\\xb1\\x6e\\xe7\\x2c\\x2d\\xdc\\x87\\x94\\xfe\\xe4\\xe8\\xdd\\xf6\\x81\\x4d\\xb7\\xa4\\x07\\x5f\\x5b\\x33\\xae\\x60\\x90\\x15\\xaf\\xd3\\xff\\xc9\\x4f\\x6d\\xeb\\x80\\xba\\x04\\xea\\x4a\\xa7\\x50\\x35\\x57\\x9f\\xe3\\xa5\\x13\\xc3\\x05\\x92\\x1d\\x3b\\xb8\\x63\\xc7\\x78\\x97\\x39\\x3d\\x37\\xcd\\x0b\\x9d\\x41\\x32\\xcd\\x8b\\xad\\xcc\\xe9\\xf0\\x92\\x0c\\xa7\\xf6\\x00\\xce\\x4d\\x73\\xa8\\x47\\x0c\\x2f\\x9a\\xe6\\x82\\x7e\\xf4\\xdb\\x79\\x5f\\x5f\\x21\\xda\\xf8\\x5f\\x79\\x27\\xbb\\x78\\xe9\\x94\\x40\\x90\\x23\\x5d\\x6b\\xe1\\xea\\xfa\\x15\\x97\\xfb\\xdb\\xf5\\x18\\x1c\\x44\\x5b\\x92\\x56\\xb1\\x4b\\x15\\xc9\\x58\\x15\\x13\\x3a\\x61\\xda\\x43\\x49\\x37\\xb9\\xb3\\x05\\x5e\\xf4\\x8f\\x8a\\xc7\\x56\\x78\\x0e\\xe7\\x78\\x01\\x17\\xb8\\x82\\x5c\\x99\\x15\\xe5\\xe4\\x91\\x49\\x49\\xad\\x05\\xac\\x70\\x32\\x55\\xb6\\x6a\\xb5\\x55\\x7e\\x94\\x17\\xec\\x1a\\xcf\\xe0\\x0a\\x5f\\x92\\xab\\x1a\\xd8\\x76\\x1e\\xa2\\x1b\\x6c\\x8a\\xe4\\xd7\\x78\\x31\\xc9\\xa7\\x3b\\x57\\x30\\x57\\x0f\\xa3\\xab\\xc6\\x85\\x12\\x53\\xa8\\x31\\xb7\\xca\\xa0\\x0e\\xf3\\x80\\xc7\\x78\\xae\\xee\\x4d\\x76\\xae\\x60\\x89\\xe7\\x93\\x52\\x0f\\x4a\\x70\\xbe\\x1b\\x5b\\xcb\\xdd\\x35\\xc4\\xb8\\xde\\x8d\\xad\\x64\\xe7\\x6a\\xf7\\xca\\x5a\\x4d\\xea\\xa9\\x55\\x40\\x81\\x2c\\x1e\\x5d\\xab\\x1b\\x82\\x84\\x46\\x73\\x6b\\xbe\\xbb\\x84\\xd5\\xa4\\xb6\\xed\\x29\\xc6\\x3b\\xd7\\x01\\x8d\\xc3\\xa2\\x63\\x87\\x22\\xb2\\x2c\\xe9\\xaf\\x7a\\x67\\x90\\x6c\\xdb\\x0a\\xa4\\x66\\x8b\\xb6\\x6c\\xed\\x1f\\xaa\\xf6\\xc1\\xbd\\xcb\\x41\\x8f\\x94\\xfb\\xf3\\xed\\x52\\x39\\x7d\\x51\\xa8\\x5c\\xa4\\x0c\\x1f\\x2a\\xf8\\xe7\\xbd\\x82\\x07\\x11\\x91\\x41\\xa0\\xe5\\xfc\\x4a\\xa3\\xb2\\xa5\\x4b\\x1e\\x0f\\xcb\\x3e\\xb7\\xa1\\xd8\\x83\\xfb\\xc9\\x43\\x1e\\x91\\x65\\xf1\\xda\\x85\\xa9\\x41\\x83\\x54\\x95\\x77\\xff\\x37\\x60\\x63\\x57\\x03\\xeb\\xcc\\x54\\x07\\x73\\xec\\x76\\x30\\x55\\x0d\\xdf\\xa3\\x14\\xfb\\x25\\x4c\\xef\\x17\\x30\\x3d\\xa5\\xc3\\x75\\x9c\\xbb\\xe5\\x36\\x3a\\xe5\\x3a\\x95\\x95\\x2e\\x4d\\xcf\\xd1\\xfa\\xcb\\xe9\\x0b\\x79\\xa0\\xa6\\xd7\\x87\\xb5\\x3c\\x50\\x62\\x37\\xaa\\xab\\xe2\\x21\\x4f\\x90\\x84\\x25\\x45\\x39\\x51\\x25\\xda\\x5d\\xfc\\x0d\\x33\\x8c\\xa3\\xa4\\xd7\\x5b\\x7e\\x02\\xcb\\x4d\\xf9\\x53\\x1b\\xe6\\x14\\x98\\x93\\x27\\x07\\x35\\x16\\xb0\\xb4\\xb1\\xe0\\x90\\x87\\xae\\x69\\x2e\\x43\\xb7\\xe3\\xee\\xe5\\x4e\\xde\\x34\\x39\\x24\\x38\\x6b\\xbf\\x89\\x60\\x2e\\x14\\x3c\\x58\\x86\\x45\\x50\\x58\\x98\\xf3\\xc4\\xc2\\xd2\\xea\\xfb\\x0a\\xc8\\x79\\x50\\x87\\xaa\\x7c\\xbe\\xed\\x50\\xcb\\x17\\x9c\\x43\\xac\\x6a\\xea\\x0d\\xdb\\xb0\\x12\\x7e\\x5b\\x61\\x1a\\x25\\xd6\\x5f\\xce\\xfd\\x12\\x27\\x8b\\x82\\x44\\xeb\\x2f\\xe7\\x41\\x59\\x12\\x8f\\xd2\\x4d\\x66\\x72\\xeb\\x4b\\xa1\\x4f\\x9f\\xe6\\x3f\\x0d\\xab\\xb6\\x8c\\xdb\\x4f\\x9f\\x7e\\x33\\xc0\\x58\\x18\\x1c\\x8c\\x27\\xa6\\xf1\\x00\\x46\\xb7\\x02\\xf7\\x53\\xee\\x27\\x9b\\xc2\\x5c\\x7d\\xd8\\xed\\xd0\\x47\\xdd\\xbe\\x7b\\x4a\\x13\\xbf\\xc0\\x42\\xab\\xca\\x35\\x2e\\x9c\\x18\\xe6\\xfd\\xbd\\x3a\\xac\\xb0\\xda\\xbc\\x5c\\x63\\x72\\xe7\\xc6\\xbd\\x67\\x17\\xf6\\x05\\x87\\x1e\\x94\\xd8\\x97\\x62\\x7f\\xc1\\x25\\xb0\\x21\\xa3\\x48\\x5e\\xe5\\x70\\x18\\xe7\\x4d\\x53\\x3a\\x69\\xc5\\xbe\\x29\\xe3\\xa2\\xcb\\x23\\xc6\\x60\\xac\\x66\\xdf\\x07\\x73\\x91\\xe5\\x2b\\x99\\xd1\\x56\\x06\\x86\\xc5\\x96\\x91\\x71\\xaf\\x06\\xf8\\xb1\\x12\\x60\\x81\\xc3\\xa5\\x69\\xaa\\x84\\xcb\\x47\\x56\\x82\\x76\\xcc\\x3c\\xee\\x2c\\x2a\\xc1\\xbe\\xf1\\xa8\\xf4\\x3b\\x37\\x74\\xdd\\xc7\\xfe\\xdb\\x65\\xe8\\xda\\x5c\\x17\\x6c\\x4d\\x7c\\x3a\\x77\\x04\\xf6\\x89\\xa3\\x85\\x23\\x6c\\x0f\\xe6\\xca\\xaa\\xe3\\xfb\\x09\\xab\\x31\\xdf\\xb9\\xe1\\x2f\\xdc\\xe8\\xc6\\xaa\\xfd\\x7a\\x4a\\x0b\\x0b\\xda\\x4b\\xbc\\x5a\\xb3\\x39\\x0f\\xdd\\x88\\x82\\x85\\xb9\\xbf\\xf2\\x4b\\xa8\\xf1\\x07\\xfc\\x20\\x6f\\xa3\\x27\\x45\\xcc\\x21\\xd1\\x90\\xdc\\x20\\x45\\x32\\xf7\\x73\\x95\\x1d\\x54\\xb2\\xa2\\x5c\\x80\\xb4\\xb5\\x92\\xd7\\x9c\\x83\\x37\\xa4\\x10\\x68\\xb5\\xa6\\x08\\x89\\x57\\x78\\x0d\\xd7\\x28\\x61\\x85\\xc9\\xdd\\x91\\x12\\x57\\x9c\\x22\\x17\\x09\\x73\\x2c\\xdb\\x90\\x6a\\xd3\\x37\\xe7\\x14\\xdc\\xc8\\x4e\\xef\\x49\\x7c\\xc5\\x44\\x17\\x4b\\x72\\xb8\\xd6\\xab\\x27\\x1d\\xcc\\xce\\xa4\\x13\\xc4\\xaa\\x43\\x49\\x6e\\xa1\\x94\\x38\\x25\\xae\\x9c\\x12\\x17\\x4e\\x09\\xf9\\x2e\\x8e\\x21\\xc3\\x57\\x8c\\xac\\x6b\\x0e\\x5f\\x79\\x0b\\x77\\xc1\\x9d\\xd9\\x65\\xc9\\xb8\\x42\\xfd\\x15\\x4b\\xa0\\x7a\\xac\\x97\\xbf\\xf0\\xa2\\xc9\\x6a\\xeb\\x0c\\xe0\\x7a\\xeb\\x65\\xea\\x4f\\x92\\xed\\xbe\\x6a\\xbb\\x0f\\x7e\\x60\\xad\\xdd\\xf9\\x2a\\xd7\\x35\\xc2\\x0f\\x23\\xdf\\x2d\\xc7\\xda\\x12\\x4d\\x43\\x06\\x38\\x72\\x77\\x85\\xa3\\xf3\\x41\\x7a\\xee\\xbb\\xfc\\x5a\\xa5\\x15\\xd7\\xf9\\xf5\\x2f\\xa2\\xa1\\x55\\x57\\x4d\\x65\\x09\\xde\\xa5\\x07\\xc8\\x41\\xe8\\x5d\\xf5\\xf1\\x1e\\x18\\xa2\\x55\\xf7\\xaa\\xfe\\x67\\xd8\\x65\\x35\\x99\\xe0\\x4d\\x53\\x84\\x17\\x14\\x03\\x8d\\xd0\\xe5\\x4d\\xb3\\x9e\\x15\\xa5\\x38\\x4e\\xf3\\x59\\xc5\\x04\\x57\\x72\\x32\\x64\\x02\\x09\\x9d\\x7b\\x37\\x0d\\xca\\x8f\\x5d\\xe7\\xd7\\xcc\\x92\\x20\\x78\\x97\\x61\\xf9\\x3d\\x9a\\xb3\\xdf\\x47\\x37\\xd6\\x98\\xfb\\x2e\\x6c\\xa4\\xb0\\xad\\x48\\x2d\\x76\\xc6\\xea\\x57\\x5d\\x8b\\xb4\\x6e\\x19\\x0c\\x2b\\x27\\x6e\\x2b\\x45\\x33\\xd3\\xac\\xfa\\x6c\\xa8\\x0a\\x8c\\x36\\xaf\\x98\\x71\\x5d\\x1e\\xbc\\x62\\xc5\\x68\\xcc\\xa1\\x2b\\x5a\\x0e\\x24\\x6e\\x7c\\x3c\\xc8\\x4c\\x53\\xa5\\x35\\xe4\\x5d\\x30\\xf2\\x0e\\x98\\x3b\\xd9\\xf8\\x0a\\xbf\\x39\\x73\\x79\\xc5\\x2a\\xce\\x21\\x53\\x56\\xf2\\x77\\xf8\\xda\\x5b\\xc9\\xbe\\x48\\xfc\\x9f\\x9b\\x35\\x55\\x15\\xb7\\xff\\x2b\\x33\\x0d\\xe3\\xfd\\xf6\\x60\\x35\\xa7\\x3c\\x76\\xa6\\x5d\\x7c\\x5b\\x11\\xff\\x62\\xe5\\x88\\x60\\x2b\\x28\\x45\\xc4\\x3c\\x92\\x14\\x6c\\x18\\xdd\\x1d\\x99\\x01\\x6e\\x28\\x55\\x14\\x49\\x6a\\x9d\\xbc\\xfd\\x0c\\x8d\\xb3\\xd9\\x99\\xe1\\x2b\\x57\\x9c\\xe8\\xdb\\xfb\\x07\\x2d\\x92\\xea\\x0b\\xd3\\xf1\\xd3\\xee\\x13\\xd3\\xe8\\x35\\x4b\\x59\\x06\\x39\\x07\\xb7\\x11\\xe0\\xb9\\x20\\xb9\\xff\\x5b\\x88\\x64\\x73\\x42\\x7c\\x12\\x25\\xaa\\xcf\\xef\\x86\\xd0\\x62\\x55\\x17\\xd1\\xf5\\x8b\\xb6\\xcc\\x5e\\xd4\\x59\\xdc\\x66\\x7b\\xd4\\xf3\\x3f\\xbf\\x0b\\xd0\\xf7\\x0f\\x57\\xb3\\xb4\\x16\\xe7\\x09\\x4d\\xcf\\x7f\\xbf\\x38\\x7f\\x24\\x13\\xae\\x53\\xdb\\x1b\\x51\\xbb\\xdd\\xd0\\xbf\\xab\\x3a\\x25\\x75\\x3e\\xdb\\xd4\\x4b\\x54\\x9b\\x58\\xd6\\x6d\\x7a\\x6a\\x8a\\xd0\\x6d\\x1a\\x81\\x88\\x59\\x94\\xf9\\x99\\xed\\xdd\\xa9\\xaf\\xd8\\x54\\x56\\x68\\x21\\xf3\\x40\\x6e\\x8a\\x50\\x72\\xf5\\x9d\\x8a\\x65\\x18\\x81\\x0c\\x8b\\xd6\\x03\\xcd\\x50\\xa8\\x6c\\xa3\\x65\\x18\\x50\\xe1\\x8d\\xdd\\x7f\\xcb\\x51\\xd9\\x76\\x90\\x51\\xf4\\x67\\x65\\x3c\\xc8\\x2d\\xcc\\x6e\\xdb\\x42\\x90\\x3b\\x5f\\x25\\xe6\\x77\\xbf\\x4a\\x94\\x3c\\xe8\\xdd\\xc0\\x7c\\xf3\\xbd\\x9f\\xe5\\x35\\x8d\\xc7\\x37\\x88\\xca\\xfb\\xb9\\x41\\xe1\\xc4\\x90\\x53\\x54\\xa4\\xbe\\x29\\x2a\\x49\\xa7\\x3b\\xa5\\xaa\\x9f\\xa1\\x18\\x2f\\x73\\xc4\\x56\\x96\\xea\\x61\\xa6\\xc3\\x34\\x87\\xca\\x89\\x29\\x30\\x37\\xcd\\x61\\xae\\x8a\\xba\\x9a\\xa6\\xbf\\x0d\\xab\\xa2\\x22\\x72\\x7d\\xbb\\xf4\\x6b\\xe5\\xb8\\x0c\\xb1\\x87\\x51\\x6b\\x00\\x6e\\x58\\x43\\x81\\x09\\x62\\x0a\\x43\\xd9\\x34\\xc3\\x9c\\xf7\\x5e\\xb1\\xeb\\x0f\\xe5\\xdf\\x95\\x2e\\x6b\\xb9\\x73\\xc5\\x96\\x84\\x69\\xd7\\xae\\x8b\\x8b\\x58\\xd2\\xa7\\x5c\\xf8\\x0b\\x96\\xf6\\x74\\xe2\\x51\\xe2\\x93\\x33\\xef\\x06\\x65\\x58\\x07\\xb5\\xce\\x22\\xcb\\x49\\x3d\\x1d\\x62\\x3e\\xa9\\xfb\\x60\\x9e\\x5a\\x42\\x6a\\xe8\\xa0\\xf6\\x9f\\x49\\x63\\x1a\\xb9\\xfe\\x66\\xb9\\x0d\\x15\\xf3\\xbb\\xb7\\xb7\\x4c\\xe8\\x8f\\x7f\\x42\\x72\\xa6\\xab\\x10\\xb7\\xaa\\x7d\\x6a\\x62\\x8c\\xf6\\xa3\\xbf\\x89\\x2e\\x8e\\x1c\\xa8\\x52\\xb8\\xa9\\x81\\x78\\xae\\xde\\x37\\xe5\\xe7\\x3d\\x8b\\xea\\xef\\x91\\xc4\\xd6\\xb9\\x95\\x0f\\xbe\\xff\\x21\\xf7\\x46\\x45\\x5b\\xb5\\x2a\\x94\\xef\\xbf\\x77\\xa2\\xbd\\xb6\\xdf\\x80\\x6e\\x38\\x46\\xda\\x76\\x90\\x4f\\xe4\\x74\\x17\\xb3\\xb6\\x1e\\x6c\\x52\\xa0\\x3b\\xb5\\xf0\\xbc\\x4f\\x03\\x88\\x2e\\x30\\x26\\x42\\xf1\\xa0\\x78\\xd1\\x4f\\x2e\\x2c\\x8b\\xe7\\x93\\x62\\x1a\\x56\\xea\\x6b\\x5d\\xad\\x53\\xf2\\x49\\x61\\x79\\x24\\xce\\xfa\\x01\\x5d\\x0e\\xfa\\xc9\\xa2\\xae\\xe9\\xa8\\x6a\\x5c\\x6a\\x98\\xee\\x60\\xd5\\xeb\\xcf\\xed\\xbb\\x80\\x7e\\x67\\xc9\\xb6\\x7e\\x64\\x9b\\xaa\\xa2\\x48\\x6c\\x22\\x75\\xcb\\x70\\x0c\\x4b\\x6c\\x5c\\x62\\xc1\\x2d\\xe6\\x86\\x59\\x64\\x90\\xdf\\x24\\x2c\\x83\\x5b\\xd9\\x06\\x60\\x7a\\x87\\xc5\\x75\\xd9\\x5a\\xd6\\xb9\\xc5\\x86\\xeb\\x18\\x81\\x65\\x65\\xe4\\x04\\xab\\x6f\\xd0\\x04\\x16\\x96\\xe8\\x0b\\x0c\\xab\\x8d\\xc8\\x5a\\x56\\x16\\x56\\x9b\\x69\\x06\\x64\\x36\\x56\\x81\\x6d\\x6f\\x4d\\xb5\\xb0\\xd0\\x33\\x2b\\x65\\x33\\x36\\x75\\x65\\xfa\\x93\\xf7\\x2d\\x9c\\x33\\xbe\\x89\\xd1\\x36\\x98\\xc6\\x1b\\xe6\\x18\\x08\\xbc\\x63\\x48\\x81\\x2c\\xf4\\x9c\\x09\\xee\\xaf\\x88\\x0f\\x68\\x33\\x33\\x1d\\xf7\\xeb\\x6a\\x87\\x4f\\x73\\x8b\\x7d\\x72\\x3e\\xcd\\x77\\x79\\xd4\\xd0\\xaf\\xc5\\x99\\x98\\x58\\xf6\\x34\\xa2\\xc7\\xe8\\xc9\\x88\\xdc\\x26\\x65\\x70\\x63\\x21\\x53\\x58\\xe9\\x67\\x75\\xd5\\x0a\\xd7\\xd8\\x56\\xeb\\x0e\\x2e\\xf3\\x3c\\x15\\xb3\\x6c\\x90\\x17\\x83\\x4b\\x99\\xcd\\x8a\\x9b\\xc1\\x9c\\xc2\\x4d\\x03\\xae\\x50\\x7f\\x49\\x25\\xb3\\xc5\\x60\\x95\\xcf\\x85\\x01\\x97\\xdd\\x87\\xe9\\x03\\x62\\xd4\\xc1\\x72\\x56\\x0e\\x56\\x79\\x21\\x06\\xd5\\x72\\x96\\x0d\\xbc\\xa7\\x83\\x52\\x2e\\x32\\x99\\xc8\\x78\\x96\\x55\\x1a\\x48\\x69\\xc0\\x39\\x1a\\xae\\x37\\xde\\xdb\\x7f\\xfa\\xec\\xe0\\xf9\\xe1\\xec\\x32\\x9e\\x8b\\x64\\xb1\\x94\\x5f\\xbe\\xa6\\xab\\x2c\\x5f\\x7f\\x2b\\xca\\xaa\\xbe\\xba\\xfe\\x7e\\xf3\\xe3\\xe5\\x6f\\xaf\\x5e\\x1f\\x1d\\xbf\\xf9\\xd7\\xc9\\xef\\xff\\xdf\\xe9\\xdb\\xb3\\xf3\\x77\\xff\\xff\\xfb\\x8b\\x0f\\x1f\\xff\\xf8\\xf3\\xaf\\xff\\xfa\\xef\\x27\\x9f\\x0d\\x38\\x43\\x4f\\x78\\xfb\\x70\\x83\\xde\\x3e\\x5c\\xdc\\x2f\\xec\\xf5\\xe0\\x3d\\x4e\\x3c\\x32\\x3f\\x9e\\xeb\\x82\\x27\\xf6\\xc0\\x13\\xfb\\xe0\\x89\\xa7\\xe0\\x89\\x67\\xe0\\x89\\x03\\xf0\\xc4\\x73\\xf0\\xc4\\x21\\x78\\x82\\x06\\x09\\xcf\\xa3\\x3f\\x63\\xfa\\xb3\\x37\\x85\\x97\\xea\\x43\\x8e\\x23\\xf4\\xc4\\xa1\\xfa\\xa2\\x4a\\x55\\x51\\x1a\\xdd\\xf1\\x6c\\x8a\\x9d\\xe7\\x22\\x91\\x99\\x30\\x4d\\xfd\\xeb\\xcc\\x56\\x73\\xae\\x1f\\xd9\\x43\\x53\\x33\\xbb\\xdd\\x7c\\xb7\\x69\\xd4\\x99\\x1e\\x37\\xdf\\x54\\x7f\\xab\\x0b\\x1b\\x61\\x9a\\xfa\\xd7\\x21\\x2f\\xab\\xa8\\xf4\\x05\\xc0\\xdd\\x26\\x9c\\xc1\\x70\\xc9\\xab\\xe2\\xe6\\xe7\\x12\\x0b\\xf1\\xad\\x96\\x85\\x60\\x6d\\x3d\\xa8\\xc1\\x6f\\xe3\\x59\\x15\\x2f\\xd9\\x6b\\xfe\\xf3\\x56\\x73\\xa0\\x70\\xfa\\x2f\\xcb\\x70\\x76\\xdb\\x66\\x05\\xfe\\x63\\x34\\xfa\\xcf\\x41\\x99\\xd7\\x45\\x2c\\xde\\xce\\xd6\\x6b\\x99\\x2d\\x3e\\xbe\\x3f\\xc5\\x79\\x1e\\xdf\\xf9\\xf7\\x1a\\xce\\x6a\\xb6\\xfe\\x8f\\xff\\x17\\x00\\x00\\xff\\xff\\x2f\\x88\\x72\\xca\\xa2\\x43\\x00\\x00\")\n\nfunc bignumberJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_bignumberJs,\n\t\t\"bignumber.js\",\n\t)\n}\n\nfunc bignumberJs() (*asset, error) {\n\tbytes, err := bignumberJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"bignumber.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0x75, 0xfc, 0x15, 0x5e, 0x7d, 0x27, 0x1a, 0x9a, 0xb5, 0xfb, 0x16, 0x90, 0xf4, 0x93, 0xac, 0xcb, 0x6c, 0x9c, 0xcd, 0x68, 0xe6, 0xd0, 0x3a, 0xcf, 0xa3, 0x83, 0x5c, 0x20, 0x34, 0x66, 0x45}}\n\treturn a, nil\n}\n\nvar _web3Js = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xec\\xbd\\x79\\x7b\\xdb\\xb6\\xb2\\x30\\xfe\\x7f\\x3f\\x05\\xa2\\xe7\\x7d\\x23\\xa9\\x66\\x24\\x2f\\x69\\x9a\\x32\\x55\\x73\\xb3\\xb6\\x39\\x6f\\x13\\xe7\\x97\\xd8\\xed\\xbd\\xc7\\xc7\\x27\\x0f\\x4d\\x41\\x12\\x13\\x8a\\xd4\\x25\\x21\\x2f\\x27\\xf6\\x77\\xff\\x3d\\xd8\\x48\\x2c\\x03\\x2e\\x92\\xec\\x24\\xad\\xf5\\x87\\x2d\\x91\\x58\\x06\\x83\\x99\\x01\\x66\\x30\\x98\\xc9\\xf0\\xff\\x2e\\xa3\\x0c\\x8f\\x7a\\x93\\x65\\x12\\x92\\x28\\x4d\\x7a\\xfd\\xcf\\xf2\\x2b\\xca\\x7a\\xd8\\x4b\\x3c\\xa2\\x3c\\x49\\x7b\\x91\\x37\\xe9\\x7f\\x8e\\x26\\xbd\\x3b\\xc9\\x51\\x74\\xcc\\xbf\\x61\\xf6\\xed\\x34\\xc8\\x50\\x38\\xea\\xc8\\xa2\\x9d\\xd1\\x88\\x5c\\x2c\\x70\\x3a\\x41\\xa2\\x8b\\xbb\\x77\\xc5\\x97\\x47\\xb4\\xce\\xe4\\xee\\xdd\\xb0\\x9f\\x61\\xb2\\xcc\\x12\\x14\\xf6\\x22\\xef\\xce\\x76\\x9f\\x3e\\x5f\\xca\\x67\\x4b\\xf1\\x8c\\xb6\\x1a\\x8c\\x12\\x7c\\x86\\x5e\\x64\\x59\\x9a\\xf5\\x3a\\xcf\\x82\\x24\\x49\\x09\\x9a\\x44\\xc9\\x18\\xcd\\xd3\\xf1\\x32\\xc6\\xa8\\xdb\\xd9\\x8a\\xb6\\x3a\\xdd\\x4e\\xff\\x11\\x99\\x65\\xe9\\x19\\x0a\\x06\\x61\\x3a\\xc6\\xa3\\xce\\xeb\\xfd\\xe7\\x87\\xbf\\xbf\\xf8\\xf0\\x66\\xff\\xe0\\xc3\\xcb\\xfd\\xc3\\x37\\xcf\\x3b\\x5e\\x70\\x45\\xdb\\x5b\\x8c\\x28\\xec\\xa3\\xcf\\xf8\\x7c\\x91\\x66\\x24\\xf7\\x3f\\x5f\\x5d\\x3d\\xa2\\x63\\x38\\xda\\x3e\\x1e\\x84\\x41\\x1c\\xf7\\x16\\x03\\xf1\\xca\\x2b\\xb0\\x92\\xf1\\x01\\x26\\x23\\x56\\x70\\xe7\\xf8\\x28\\x3b\\x7e\\x24\\x40\\x4d\\x7b\\xc9\\xe5\\x65\\xd6\\xbf\\xf2\\x16\\x5e\\x59\\x31\\xf3\\x38\\xea\\xae\\x44\\x21\\xda\\xa3\\x7c\\x79\\x35\\x49\\xb3\\x1e\\x6d\\x6d\\xd9\\x04\\x5d\\x5e\\x34\\xda\\x7e\\x14\\xfd\\x4c\\x06\\x31\\x4e\\xa6\\x64\\xf6\\x28\\xda\\xda\\xea\\xa7\\x3d\\x42\\x71\\x5e\\x40\\x20\\x7b\\xc9\\xae\\xfa\\xbd\\x7e\\xef\\xf3\\x8e\\x7f\\x54\\x02\\x2e\\x5a\\xe1\\xb8\\xf2\\x04\\x08\\xfd\\xcf\\xdf\\x21\\xf1\\xe1\\x2f\\x24\\x6c\\xa3\\xa3\\xe2\\x05\\xfd\\x7c\\xd6\\x7e\\xd1\\x4f\\x27\\x4c\\x93\\x9c\\x04\\x09\\xe9\\xf8\\x88\\x64\\x4b\\xec\\xd9\\x25\\xa2\\x64\\xb1\\x24\\x79\\xc7\\x47\\x47\\xd6\\x3b\\xb8\\xcd\\xa2\\x66\\x12\\xcc\\x71\\xc7\\x47\\x9d\\x0f\\xe9\\x59\\x82\\xb3\\x8e\\xdd\\x76\\x51\\x92\\x22\\x8b\\x96\\x0c\\xc6\\xe3\\x0c\\xe7\\x79\\x07\\x2c\\x79\\x65\\x3d\\x3d\\x06\\xc0\\x95\\x9d\\xb2\\xff\\xc0\\xfb\\x74\\x49\\xd6\\x1d\\x4f\\xfa\\xc1\\xd1\\xb8\\x35\\x9e\\x93\\x0b\\x82\\xf3\\xbd\\xdd\\x75\\xc6\\x23\\x9b\\x2a\\x48\\x4b\\x2b\\x72\\xe5\\x7d\\x15\\x13\\x7c\\x83\\xf8\\x28\\x26\\xc1\\x41\\x53\\x9b\\x98\\xe0\\x1b\\x22\\xd5\\xdb\\xa9\\x85\\xfb\\x0c\\xd3\\x84\\xe0\\x84\\x7c\\xc1\\xc9\\xbd\\xe5\\x5b\\x7d\\x10\\x1b\\x9c\\x5c\\xca\\x37\\xb7\\x6c\\x2b\\x66\\x76\\x12\\xc4\\xf9\\x5f\\x67\\x6a\\x33\\x9c\\xe3\\xec\\xb4\\x6e\\xd5\\xbd\\x65\\x16\\xfd\\x53\\x85\\xd1\\x7c\\x79\\xf2\\x0e\\x4f\\xa3\\x9c\\x64\\xc1\\x2d\\xd3\\x7c\\x33\\x4c\\x03\\x37\\xd0\\xa8\\x7f\\x7c\\xb6\\xff\\x05\\xf6\\xca\\x24\\x0b\\x92\\x7c\\x52\\xbb\\x9d\\xba\\x9d\\xd7\\x55\\xfb\\xcf\\x2a\\x98\\xd8\\x02\\x62\\x83\\x13\\x9b\\x63\\xf2\\xbe\\xb9\\x08\\xf9\\xe2\\xf3\\x5b\\x35\\x94\\x6f\\x66\\x10\\xdf\\x2c\\x91\\x06\\xeb\\x13\\xe7\\xea\\x9d\\x2f\\xb2\\x68\\x1e\\x64\\x17\\x8d\\xc6\\x9f\\xa6\\xf1\\x86\\x98\\xe3\\x89\\x18\\xcd\\x2d\\x49\\x5d\\x0f\\x49\\xb9\\x35\\xb9\\x96\\x20\\xb4\\x9d\\xd8\\x67\\x8d\\x54\\xc8\\xbf\\xfb\\xc4\\xb6\\xc2\\xea\\x38\\xca\\xd3\\xb3\\xe4\\x0b\\x60\\x34\\x48\\xd2\\xe4\\x62\\x9e\\x2e\\xf3\\x6b\\x41\\x69\\x94\\x8c\\xf1\\x39\\x1e\\x3b\\x35\\x87\\xa2\\xe0\\x97\\x66\\xaa\\x12\\x50\\x07\\x12\\x6c\\x48\\xcf\\xa2\\xe4\\xe6\\x37\\x93\\x4f\\x96\\x6c\\x96\\x5f\\x24\\x63\\x3c\\x86\\xa8\\x45\\x76\\x89\\x4f\\x29\\x83\\xde\\xd2\\xc2\\x0d\\xd1\\xc2\\x49\\x34\\x1e\\x6f\\x82\\x16\\x6e\\x02\\xd6\\xd3\\x20\\x5e\\x36\\x42\\xeb\\x32\\x4a\\xc8\\xee\\x0f\\x0f\\x36\\x41\\xb6\\x6f\\xf0\\xd9\\xd3\\xe8\\x2f\\x4f\\xb0\\x5f\\x60\\xdd\\x78\\x36\\x0b\\x92\\xe9\\x5f\\x5f\\x14\\x7c\\x71\\x49\\xd0\\x10\\x4e\\x87\\xfd\\xd5\\x82\\x73\\x83\\x2b\\xc2\\x5b\\xbe\\xb7\\x5f\\x91\\x10\\x8a\\x5f\\xc7\\xdf\\xb1\\xaf\\x57\\xde\\xe7\\xab\\x63\\x6f\\xf7\\x9b\\x3f\\x14\\xbd\\x3d\\x33\\x5b\\x65\\x28\\x7f\\xa7\\xed\\xf9\\x3a\\xf6\\xa6\\xc9\\x32\\x81\\x38\\xcd\\x82\\x60\\x83\\x6c\\xfe\\xc5\\x14\\x84\\xbf\\x2a\\xbb\\xde\\x1e\\x95\\x7d\\x4b\\xdc\\xda\\x6a\\x6a\\xbf\\x8a\\xa3\\xb2\\xaf\\x1e\\xa5\\xb7\\x07\\x29\\x05\\x18\\xb7\\xf3\\xba\\x29\\x1b\\x75\\xab\\x09\\x15\\x36\\xe2\\x5b\\xab\\xd7\\xb7\\xa3\\x38\\xc2\\xfa\\xc2\\xde\\x0d\\xe9\\x0b\\xd7\\xc7\\x7b\\x93\\x2c\\x9d\\x7f\\x41\\xd6\\x23\\xe9\\x17\\x3c\\x1e\\xfa\\x12\\x06\\xa1\\xbf\\xba\\x2c\\xff\\x3b\\xd3\\x53\\x94\\x8c\\xa3\\x0c\\x87\\xe4\\x55\\x23\\x1d\\xe9\\x9a\\x30\\xf0\\x25\\x88\\x3a\\x0a\\x83\\xc5\\xc1\\x5f\\x9c\\xb0\\x9b\\x51\\xd6\\x26\\x4f\\xc6\\xf0\\x22\\xcd\\xa3\\x55\\x0e\\x1b\\x17\\xc1\\x45\\x70\\x12\\x63\\xb7\\xe2\\xfa\\x17\\xdb\\x45\\x34\\x95\\x39\\x5f\\xfc\\x08\\xe2\\x4b\\xf0\\xe6\\x13\\x39\\x57\\xcf\\xdd\\xf4\\xf4\\x57\\xb2\\x98\\x7f\\x71\\x62\\x68\\x08\\xe7\\x26\\xe4\\xc9\\x5f\\x94\\x64\\x6f\\x29\\x15\\x7d\\x4d\\x67\\x3b\\x5f\\x64\\x4f\\xf5\\x6d\\x50\\x6a\\xd5\\xa6\\xe7\\x96\\x54\\x8d\\xcf\\x2d\\xa9\\x7e\\x15\\x8a\\xc2\\xb7\\xc1\\x59\\xaf\\x6a\\x54\\x8a\\xf6\\xb6\\x9a\\xfb\\x6d\\x6c\\x35\\xa7\\x41\\x86\\x26\\x68\\x24\\x2f\\xda\\xf6\\xba\\x83\\xe1\\x24\\xcd\\xe6\\x01\\x21\\x38\\xcb\\xbb\\xfd\\x47\\x5a\\xc1\\xf7\\x69\\x1c\\x8d\\x23\\x72\\x71\\x70\\xb1\\xc0\\x7a\\x1d\\x0a\\x25\\x2d\\x5d\\x14\\x1f\\x7e\\xff\\x7d\\x09\\xeb\\xf7\\x5a\\x4d\\xe1\\x35\\x8a\\xa2\\x1c\\x05\\x68\\x91\\xa5\\x29\\xad\\x8c\\xc8\\x2c\\x20\\x28\\xc3\\x8b\\x0c\\xe7\\x38\\x21\\x39\\x12\\xb4\\x8b\\xe8\\x4b\\xb5\\xa5\\x57\\x04\\xcd\\x03\\x12\\xce\\x70\\xee\\xab\\x8f\\x45\\x71\\xe0\\xd1\\xd1\\x31\\xf4\\xf0\\x3e\\xf8\\xf4\\x18\\x2e\\xbc\\xe7\\x78\\x7e\\x7c\\xf4\\xe0\\xf8\\xe8\\xd8\\x43\\x83\\xc1\\x40\\x79\\x3d\\x74\\xe2\\x4c\\x8e\\x7c\\x84\\x8a\\x3b\\xe4\\xbd\\xbe\\x41\\xc2\\x64\\x16\\xe5\\x83\\x0f\\x4c\\xe4\\xbd\\x94\\x13\\x41\\x2b\\x0c\\xf8\\xb4\\xbc\\xa2\\x2f\\x44\\x3b\\x8f\\x80\\x8a\\x5c\\x63\\x82\\x6a\\xee\\xb3\\x37\\x15\\x55\\x59\\x9f\\xef\\x71\\x96\\x8a\\x32\\xce\\xee\\x5f\\x2e\\xe3\\xb8\\x49\\x3b\\xef\\x67\\x69\\xc6\\x3a\\xb4\\x5b\\xe2\\x0d\\x15\\x05\\xdc\\x83\\xa9\\x81\\xc7\\x31\\xa8\\x2b\\x85\\x12\\x81\\x09\\x18\\x2c\\xb2\\x94\\x70\\xb2\\x1b\\xa1\\x04\\x9f\\x69\\x65\\x7a\\x9f\\xaf\\x14\\xb2\\xaf\\xac\\x3d\\x60\\x0a\\x79\\xb6\\x0c\\x49\\x4a\\x81\\x02\\xca\\x36\\x85\\x63\\x10\\xe5\\x82\\xa9\\x4a\\xca\\xa0\\x12\\xc2\\xa4\\x0e\\x71\\xb5\\xfd\\xce\\x1d\\xfa\\x72\\xc0\\x18\\xa1\\x37\\x14\\xe4\\xd8\\xfb\\xd7\\x51\\xef\\x68\\xfb\\xde\\x4f\\xc7\\xdf\\xf7\\xff\\x75\\xdc\\x7f\\x3c\\xec\\xc3\\xf8\\xd0\\xad\\xb3\\x95\\x60\\x5f\\x79\\x9f\\x3b\\xaa\\x3c\\xe8\\xf8\\x3f\\x79\\x1d\\xce\\xec\\x1d\\x7f\\xe7\\xfe\\xd5\\xb1\\xf7\\xc3\\x57\\x2e\\x6b\\x9e\\xa6\\x69\\x5c\\x23\\x68\\x4e\\x68\\x91\\x86\\x52\\x86\\x96\\x35\\x7f\\xeb\\xa2\\x81\\x3d\\xb9\\x6f\\x3f\\x3a\\x06\\x8a\\x99\\x62\\x45\\x14\\x6c\\x27\\x53\\xd8\\x08\\xd7\\x15\\x28\\xb4\\x91\\x55\\xa4\\x89\\x5e\\xcf\\xc5\\x75\\xb4\\xd4\\x8a\\x2c\\xa7\\x57\\xad\\xe0\\x37\\x0e\\x49\\x93\\x36\\xd6\\xe1\\xb4\\x7f\\xd3\\x29\\xd2\\xf9\\xec\\xfb\\xff\\xb3\\x12\\xa3\\x29\\xf0\\xd6\\x73\\xd9\\x83\\xaf\\x9d\\xcb\\xe8\\xc6\\xad\\x60\\x33\\x02\\xf3\\x19\\x99\\x61\\xc4\\x76\\x78\\x8c\\xd9\\x06\\x4d\\xb8\\x8d\\x96\\xb6\\x1e\\x18\\x3c\\xc3\\x1e\\xdd\\x07\\x9e\\x99\\xcc\\xc5\\x1e\\x5a\\x2c\\x27\\x8a\\x42\\x3c\\x87\\xc4\\x7e\\xd4\\x7a\\xf4\\x10\\xec\\xcf\\x68\\xba\\x82\\x63\\x19\\x12\\xd6\\x66\\x59\\xda\\xca\\x4a\\x3c\\xab\\x57\\x74\\x32\\x2d\\x2d\\xb6\\x2a\\xd7\\xea\\x75\\xab\\xd8\\x96\\x03\\xd3\\xa8\\x95\\xf5\\x18\\x97\\x36\\xc6\\xd9\\xf6\\xf3\\x8e\\x77\\xd5\\xdf\\x0c\\x13\\x2b\\xd0\\xd7\\x73\\xf1\\x8f\\x6d\\xb8\\x78\\xc8\\x99\\xed\\x60\\x16\\xe5\\x68\\x12\\xc5\\x98\\x72\\xd7\\x22\\xc8\\x08\\x4a\\x27\\xe8\\x0c\\x9f\\xec\\x0d\\x3e\\xe6\\x03\\xde\\xb1\\xf8\\x45\\x0b\\x4c\\x32\\x8c\\x51\\x9e\\x4e\\xc8\\x59\\x90\\x61\\x1f\\x5d\\xa4\\x4b\\x14\\x06\\x09\\xca\\xf0\\x38\\xca\\x49\\x16\\x9d\\x2c\\x09\\x46\\x11\\x41\\x41\\x32\\x1e\\xa6\\x19\\x1d\\x5a\\x34\\xb9\\x60\\x6d\\x44\\x04\\x2d\\x93\\x31\\xce\\x18\\x93\\x12\\x9c\\xcd\\x73\\xda\\x0f\\xfd\\xf1\\xeb\\x9b\\x43\\xf4\\x3b\\xce\\x73\\x9c\\xa1\\x5f\\x71\\x82\\xb3\\x20\\x46\\x6f\\x97\\x27\\x71\\x14\\xa2\\xdf\\xa3\\x10\\x27\\x39\\x46\\x41\\x8e\\x16\\xf4\\x49\\x3e\\xc3\\x63\\x74\\xc2\\xdb\\xa3\\x35\\x5f\\x52\\x60\\xde\\x0b\\x60\\xd0\\xcb\\x74\\x99\\x8c\\x03\\x3a\\x76\\x0f\\xe1\\x88\\xcc\\x70\\x86\\x4e\\x71\\x96\\xd3\\x59\\xdc\\x93\\x7d\\x89\\x16\\x3d\\x94\\x66\\xac\\x95\\x5e\\x40\\xe8\\x18\\x32\\x94\\x2e\\x68\\xc5\\x3e\\x0a\\x92\\x0b\\x14\\x07\\xa4\\xac\\x6b\\xa3\\xa0\\x1c\\xe9\\x18\\x45\\x09\\x6b\\x76\\x96\\x4a\\x69\\x14\\x11\\x74\\x16\\xc5\\x31\\x3a\\xc1\\x68\\x99\\xe3\\xc9\\x32\\xe6\\xfa\\xd6\\xc9\\x92\\xa0\\x3f\\x5f\\x1d\\xfc\\xb6\\x7f\\x78\\x80\\x9e\\xbc\\xf9\\x1f\\xf4\\xe7\\x93\\x77\\xef\\x9e\\xbc\\x39\\xf8\\x9f\\x47\\xe8\\x2c\\x22\\xb3\\x74\\x49\\x10\\x55\\xbe\\x58\\x5b\\xd1\\x7c\\x11\\x47\\x78\\x8c\\xce\\x82\\x2c\\x0b\\x12\\x72\\x81\\xd2\\x09\\x6b\\xe2\\xf5\\x8b\\x77\\xcf\\x7e\\x7b\\xf2\\xe6\\xe0\\xc9\\xd3\\x57\\xbf\\xbf\\x3a\\xf8\\x1f\\x94\\x66\\xe8\\xe5\\xab\\x83\\x37\\x2f\\xde\\xbf\\x47\\x2f\\xf7\\xdf\\xa1\\x27\\xe8\\xed\\x93\\x77\\x07\\xaf\\x9e\\x1d\\xfe\\xfe\\xe4\\x1d\\x7a\\x7b\\xf8\\xee\\xed\\xfe\\xfb\\x17\\x03\\x84\\xde\\x63\\x0a\\x18\\xdf\\x78\\xd4\\x23\\x7a\\xc2\\xe6\\x2c\\xc3\\x68\\x8c\\x49\\x10\\xc5\\x72\\xfe\\xff\\x27\\x5d\\xa2\\x7c\\x96\\x2e\\xe3\\x31\\x9a\\x05\\xa7\\x18\\x65\\x38\\xc4\\xd1\\x29\\x1e\\xa3\\x00\\x85\\xe9\\xe2\\xa2\\xf1\\x44\\xb2\\xc6\\x82\\x38\\x4d\\xa6\\x6c\\xd8\\x05\\x95\\x21\\xf4\\x6a\\x82\\x92\\x94\\x78\\x28\\xc7\\x18\\xfd\\x3c\\x23\\x64\\xe1\\x0f\\x87\\x67\\x67\\x67\\x83\\x69\\xb2\\x1c\\xa4\\xd9\\x74\\x18\\xf3\\x06\\xf2\\xe1\\x2f\\x83\\xef\\x14\\xb9\\x67\\x2c\\x18\\xff\\xc5\\xc8\\x38\\x4c\\xc7\\x38\\x1b\\x7c\\xd4\\xc4\\xfa\\x7f\\x05\\x4b\\x32\\x4b\\x33\\xf4\\x3a\\xc8\\xf0\\x27\\xf4\\xff\\x52\\x82\\xcf\\xa2\\xf0\\x3f\\xe8\\xe7\\x39\\xfd\\xfd\\x5f\\x98\\xcc\\xc6\\xf8\\x74\\x10\\xa6\\xf3\\x5f\\xb4\\x4a\\xe3\\x80\\x60\\xb4\\xbb\\xbd\\xf3\\x83\\x26\\x74\\x57\\x5b\\x06\\x97\\x24\\x8a\\x73\\xad\\xf0\\x60\\xc8\\x9e\\xf1\\xbf\\xdd\\xfe\\x77\\x0d\\x74\\x3a\\xa5\\x27\\xb1\\x23\\xaf\\x5a\\x6d\\xc5\\xbe\\x4d\\xa9\\x44\\xf7\\x16\\x55\\x35\\x5e\\x25\\x44\\xaf\\x10\\x25\\xa4\\xaa\\xfc\\xa1\\x55\\x61\\x59\\x53\\xe3\\xf9\\x45\\x12\\xcc\\xa3\\x50\\x2e\\x50\\x4a\\xcd\\x31\\x7f\\xc3\\xa4\\x68\\x55\\x0b\\xef\\x49\\x16\\x25\\x53\\xbd\\x6e\\xce\\x9e\\x55\\xd5\\x7a\\x87\\x03\\x03\\x17\\x19\\x0e\\x2a\\x71\\x71\\x68\\x57\\x59\\xd6\\xd5\\x01\\x86\\x55\\x8c\\x47\\xab\\x14\\xe5\\x02\\x11\\xda\\x5a\\x93\\x2b\\x4d\\x79\\x6c\\x0f\\xe3\\x58\\x79\\xd4\\x82\\x83\\xa2\\x2d\\xb6\\x62\\xf2\\x5a\\x97\\x97\\x96\\x99\\x07\\xae\\xf3\\x24\\xcb\\x82\\x0b\\x5e\\x09\\x5e\\x9d\\x1c\\x7b\\xb2\\x67\\x94\\xc9\\x94\\xad\\x98\\x10\\x0f\\x5c\\xec\\x8d\\x11\\x49\\x11\\x4e\\x28\\x23\\x0e\\xc7\\x98\\xfe\\x2b\\x7a\\xa7\\x2b\\x4c\\xc0\\x65\\x3f\\x15\\xb5\\x86\\x52\\x04\\xef\\x68\\x78\\x5f\\x2a\\xa2\\x68\\xb5\\x1c\\xde\\xd2\\xb0\\x57\\x68\\xc4\\x5a\\x76\\xec\\x41\\x8c\\x21\\xb1\\x05\\x70\\x8e\\xc9\\x2c\\x1d\\x03\\xc3\\xe0\\x4e\\x26\\x69\\x36\\x47\\x7c\\xcb\\x99\\x6a\\x13\\xae\\xb4\\xa3\\x49\\x0e\\xd1\\xdc\\x07\\x41\\x08\\x46\\x51\\xf4\\x5f\\x0c\\x0b\\xe8\\x33\\xa7\\xe5\\x2b\\x4b\\x37\\xfc\\x2f\\x3e\\xcf\\x39\\xfa\\xac\\x76\\x76\\xa5\\x15\\x61\\xb1\\xf7\\x72\\xf4\\x99\\xc5\\xe9\\xbb\\x42\\xe2\\x67\\x44\\x05\\x29\\xdf\\xea\\x52\\x2e\\x61\\x30\\xd3\\x65\\x9b\\xae\\x8d\\x20\\xa2\\x35\\x24\\x2b\\x5b\\x21\\x15\\x74\\x0b\\xf7\\x26\\xea\\xe9\\x6c\\xe5\\xfa\\x3e\\x5f\\x99\\x8d\\xc1\\x24\\x8a\\x09\\xce\\x7a\\x4a\\x1b\\x66\\x03\\x0a\\x6d\\x13\\xb1\\x0b\\x33\\x89\\x92\\xcd\\x62\\xff\\x68\\xfb\\x58\\x99\\x49\\xfa\\x89\\x26\\xa8\\x77\\x47\\xed\\x1c\\x6a\\x9b\\x07\\x2a\\xe4\\x21\\x0d\\xbb\\x51\\x72\\x1a\\xc4\\xd1\\xb8\\xa4\\x49\\xda\\xd3\\x1d\\x1f\\x75\\xd1\\x16\\x82\\x3a\\xfd\\xae\\x8e\\x05\\x9b\\x71\\x8e\\x83\\x43\\xd0\\x22\\x0e\\xa2\\x84\\xf3\\x45\\x0d\\x39\\xf1\\x0a\\x6f\\x8d\\x92\\xf5\\xd4\\x24\\xde\\xef\\x9f\\x7c\\xc4\\x21\\xb9\\x72\\x74\\x28\\x89\\xae\\x6c\\x87\\x77\\x37\\x76\\x94\\xaf\\x27\\x21\\x05\\x5c\\x8b\\x82\\x3c\\xde\\x9e\\x97\\x05\\xc9\\xd8\\xcb\\x71\\x96\\x3a\\x24\\x1d\\x23\\x23\\xa5\\xa1\\xbc\\x77\\x44\\xab\\x1f\\x7b\\xe8\\x88\\x35\\x70\\xdc\\x50\\x6c\\xb9\\x90\\x1f\\x47\\x39\\xdb\\xf0\\x72\\xb1\\xd4\\x1c\\xff\\x39\\x84\\x60\\x26\\x4c\\x39\\xfe\\xab\\xde\\x5b\\x7d\\xb9\\x51\\xef\\x04\\xaf\\x15\\xf6\\x73\\x5b\\x78\\x0a\\xfc\\xe7\\x5e\\x2e\\x0d\\xa4\\xaf\\x83\\x45\\x1d\\x5b\\xe7\\x92\\xaf\\xa7\\x98\\xa8\\x82\\x29\\x17\\x02\\xd9\\xe0\\x4c\\x5a\\x5d\\x0c\\x84\\xd6\\xd4\\x5a\\x1a\\xcc\\x83\\x45\\xcf\\xb5\\xf2\\xb1\\x63\\x95\\x0a\\x11\\xa1\\x2d\\x65\\xbc\\x87\\x1e\\x1f\\xce\\x11\\xab\\x7a\\xcc\\x17\\xcf\\xe2\\x97\\x36\\x46\\x53\\xa2\\x00\\x40\\x8b\\xad\\xc8\\xfe\\x64\\x92\\x63\\x62\\x41\\x9e\\xe1\\xf1\\x32\\xc4\\x0a\\xf0\\x41\\x18\\x7a\\xa8\\xe1\\x08\\x18\\x4a\\x49\\x40\\xa2\\xf0\\x6d\\x90\\x91\\xdf\\x59\\x88\\x51\\xa3\\x87\\x81\\xf9\\xbe\\xa7\\x0e\\xc6\\x80\\x5f\\xb6\\x99\\x51\\x01\\x8f\\xc7\\xef\\xed\\xa6\\x5f\\x07\\x64\\x36\\x98\\xc4\\x69\\x9a\\xf5\\x7a\\x56\\xcf\\x5b\\x68\\x6f\\xa7\\x8f\\x86\\x68\\x6f\\xb7\\x8f\\xbe\\x47\\x7b\\xbb\\x06\\x32\\x14\\x9c\\x07\\x61\\x88\\xb6\\x50\\xaf\\xd8\\x38\\x68\\x53\\x06\\xe3\\xbd\\x8f\\x1e\\x5b\\xad\\xd1\\xcf\\xde\\x2e\\xf2\\xc1\\x17\\x8e\\x41\\x98\\x53\\xe6\\xa1\\x6d\\x68\\xd6\\x32\\x9c\\x2f\\x63\\x22\\x49\\x94\\x93\\xc5\\xeb\\x65\\x4c\\xa2\\x3f\\x23\\x32\\xe3\\x73\\x29\\x69\\x5f\\x83\\xdd\\x2b\\x88\\xd4\\xd3\\x67\\xde\\xec\\x44\\x06\\x7d\\x65\\xfd\\xe8\\x62\\xa7\\x96\\x1b\\xa7\\x45\\x28\\x93\\x3a\\x8e\\x5c\\x9f\\x09\\xcd\\xda\\x81\\xd1\\xf1\\xd1\\xb1\\x5e\\x66\\x03\\x8c\\x49\\x17\\x61\\x6d\\x03\\x10\\x31\\x37\\xc2\\x10\\xa7\\x13\\x50\\x95\\xb9\\x7b\\x57\\xe3\\xd7\\xbb\\x77\\x75\\xfe\\xbd\\x33\\xea\\x74\\xfa\\x7d\\xf8\\xe0\\xd5\\x1c\\x8d\\xf6\\x7b\\x10\\xa6\\x49\\x18\\x10\\x0d\\x96\\x81\\x3c\\xbc\\xa8\\x12\\x11\\xec\\xfc\\xb6\\x0f\\x30\\xd7\\x95\\x25\\x2e\\xcc\\x71\\x6b\\x00\\x00\\x40\\xd3\\x32\\x4c\\xc7\\x1b\\x44\\x39\\xdf\\x6e\\xeb\\x35\\x80\\x2a\\x57\\x38\\xce\\x71\\xb3\\xe1\\x1f\\x69\\x0f\\x8e\\x6b\\x07\\x40\\x5b\\x06\\x26\\xb0\\x8e\\x46\\xae\\x20\\x4e\\xd0\\x2a\\x55\\xdb\\xfb\\x4c\\x7e\\x48\\x17\\xb5\\x2b\\x53\\xb1\\x35\\xf0\\xc6\\x17\\x5e\\x18\\xc4\\xf1\\x49\\x10\\x7e\\xda\\x3c\\x77\\x58\\x43\\x97\\xd5\\x35\\x7e\\x35\\x78\\xd4\\xa6\\x82\\x02\\x40\\x58\\xe6\\x87\\x27\\xca\\x48\\x7b\\x38\\xcb\\x3c\\x2e\\x46\\x1c\\x44\\x4e\\x5b\\xc4\\x59\\xe6\\x78\\x4b\\x3f\\xb2\\x3f\\xd6\\x56\\xb2\\x8c\\xe3\\x3e\\x58\\xb4\\x82\\x92\\xd8\\x44\\x06\\xc9\\x98\\xe9\\xab\\x14\\x96\\x01\\xfd\\x65\\x13\\x90\\x0a\\x93\\xce\\x6c\\x3c\\x42\\x36\\xfa\\x65\\x1b\\x55\\x00\\x8a\\x14\\x29\\xf4\\x3a\\x58\\x94\\xbd\\xd1\\x07\\xee\\xde\\x64\\xb5\\x30\\x4d\\x4e\\x71\\x46\\x8a\\xd9\\xd9\\x84\\xb4\\xb2\\xb0\\xc0\\xc9\\x59\\x5f\\x85\\x45\\xc7\\x4f\\x1a\\x08\\x0f\\x31\\x34\\x78\\x06\\xe4\\xc7\\x14\\x1d\\xe6\\x67\\x21\\x47\\xa8\\x8d\\xd8\\x5d\\xc7\\xf6\\x01\\x51\\xd1\\xc6\\x5b\\x93\\x4b\\xe2\\xe7\\x2b\\x77\\x3b\\x6a\\xc9\\x41\\x01\\xc4\\xa2\\xa6\\x77\\xad\\x56\\xb1\\xbf\\x2a\\x27\\xb7\\x78\\xd4\\xb0\\x09\\x49\\x88\\x95\\x14\\x58\\xd0\\x3c\\xa5\\x77\\x4f\\xad\\xef\\xc0\\xed\\x95\\xbd\\x9d\\xb1\\xd1\\x46\\x45\\x8c\\x31\\xdb\\x82\\xe7\\x99\\x04\\xd2\\x48\\x9e\\x89\\xa2\\x13\\x73\\x43\\x02\\xf3\\x98\\x42\\xbd\\xef\\xe4\\xd6\\xa4\\x6d\\x67\\xc0\\xb8\\x04\\xa6\\xb4\\x96\\x1d\\x9c\\xbb\\x02\\xc7\\xea\\x9c\\xaa\\x77\\xe2\\x66\\xd8\\xeb\\x66\\xd4\\x6b\\x65\\x50\\x17\\x63\\x36\\x65\\x48\\x9b\\xa2\\xd4\\xdd\\x28\\xc4\\x7a\\x4d\\x99\\x0d\\x60\\x2f\\x7d\\x46\\x2a\\xb8\\xac\\x09\\x5f\\x39\\x36\\xb4\\x7c\\x50\\xdf\\xb5\\x5a\\xcf\\x25\\x99\\x65\\x78\\x12\\x9d\\xd7\\x2c\\xea\\xd7\\xbe\\xc3\\xfd\\xf2\\x1b\\xdc\\x1b\\xdd\\xbb\\x92\\x6c\\xf9\\x57\\xd8\\xba\\xde\\xc8\\xce\\x55\\x65\\x4d\\x4a\\x8b\\x5b\\x7c\\x78\\x8b\\x60\\xfc\\x3b\\x9e\\x10\\x31\\x58\\x92\\x3e\\x8d\\xa6\\x6f\\x96\\xf3\\x13\\x9c\\x81\\xf2\\xb3\\x3f\\x20\\x29\\xb7\\xd4\\xf4\\x76\\x1e\\xf4\\xbd\\xfb\\xfd\\x2d\\xbd\\xd4\\xc7\\x34\\x4a\\x7a\\x9d\\xce\\x26\\xf5\\x47\\x50\\x9d\\x85\\xf8\\xac\\xa1\\x6a\\x0b\\xb0\\x60\\xa1\\x3f\\x77\\x3a\\x36\\x87\\xe5\\x38\\x9e\\x08\\xb6\\x34\\x46\\x25\\x4c\\xbc\\x69\\xf6\\x22\\x08\\x67\\x3d\\xd3\\xca\\x17\\xb9\\x98\\xc9\\x69\\x48\\x28\\xa9\\xfb\\xb8\\xef\\x5a\\x13\\x04\\xa8\\x5b\\x86\\xc3\\xc2\\xab\\x84\\xf4\\xf4\\x61\\x4a\\xeb\\x90\\x43\\xc4\\x33\\x0b\\x15\\x1a\\xb1\\xd1\\x89\\xa2\\xa6\\xb1\\x80\\x01\\x64\\x83\\x28\\xf1\\xca\\x7e\\x98\\x56\\x03\\xa8\\x2b\\xdd\\xa6\\xb4\\x35\\x42\\x58\\x2e\\xc6\\x43\\xb4\\x0b\\xf0\\x2e\\x72\\x90\\x3b\\xfd\\x0c\\x87\\x68\\x9c\\x26\\x5d\\x42\\x69\\x1f\\x89\\x56\\x48\\xaa\\x77\\x31\\x40\\x11\\xe9\\xe6\\x28\\x88\\x33\\x1c\\x8c\\x2f\\x50\\x98\\x2e\\x13\\x82\\xc7\\x35\\xd8\\xbc\\x66\\x3c\\x00\\xdb\\xb1\\xe1\\x10\\x1d\\xec\\x3f\\xdf\\xf7\\xd1\\x24\\x9a\\x2e\\x33\\x8c\\xd2\\x25\\x41\\x09\\xce\\x09\\x1e\\xa3\\x80\\x0a\\x9c\\xbc\\xda\\x5a\\xf7\\x25\\x88\\xef\\xeb\\x25\\x1a\\x7d\\x32\\x71\\xdb\\x15\\xa1\\x42\\x3e\\xc9\\xef\\xd5\\xe2\\xa9\\x42\\x32\\x99\\x06\\x52\\x81\\x0a\\x0f\\xa5\\xa0\\x3c\\x1a\\x7e\\x8f\\x3e\\xe6\\xb3\\x28\\x21\\x68\\x1e\\x9c\\x87\\xe9\\x7c\\x11\\xe3\\xf3\\x88\\x5c\\xf8\\x68\\xe7\\x47\\xd5\\xf6\\x6d\\x15\\x1d\\xe3\\x05\\x99\\xf9\\xe8\\x07\\xed\\x9c\\x1e\\x41\\x32\\xcc\\x9a\\x51\\x0a\\x50\\x94\\x4c\\x5f\\xa7\\x63\\x3c\\xfa\\x2c\\x10\\xef\\xef\\x78\\xdc\\x64\\xea\\xef\\x7a\\x29\\x99\\xe1\\xcc\\xdf\\xbb\\x02\\x2c\\x8f\\x73\\x5a\\xa7\\x57\\x7b\\xc0\\xfa\\x58\\xed\\x63\\x20\\xbb\\x30\\xeb\\x71\\xeb\\xa7\\xb3\\x9a\\x80\\x47\\x7b\\xc6\\x40\\xeb\\x9b\\xbc\\x11\\x4d\\x7a\\x14\\x30\\x74\\x67\\x34\\x42\\x40\\x71\\x58\\x61\\xe1\\xbc\\xf7\\x26\\x98\\x63\\xd3\\x2a\\x5d\\xbe\\x81\\x4e\\xe6\\xf4\\xfa\\x80\\x19\\xba\\xda\\xc2\\x5d\\x36\\xee\\xb2\\x6f\\xcb\\xc5\\x89\\x8f\\x69\\x64\\x8e\\x49\\x60\\x13\\x3d\\x96\\x94\\x75\\xb4\\x7d\\x8c\\x7c\\xd4\\xed\\x9a\\x58\\x41\\xc0\\x66\\xce\\x9c\\x2d\\x05\\x9a\\x2a\\x21\\xb0\\xc8\\xf0\\x69\\x94\\x2e\\xf3\\x62\\x8c\\xb5\\xb0\\xed\\x22\\xdf\\xb6\\x5d\\xcb\\xcf\\x24\\xcd\\x10\\x4b\\x53\\x16\\xa1\\x11\\xda\\x7e\\x84\\x22\\xf4\\xb3\\x1c\\x8c\\xcc\\x45\\x86\\xa2\\xad\\xad\\x2a\\x3d\\x69\\x38\\xa4\\x3a\\x72\\xb8\\x8c\\x03\\x82\\xe5\\xc2\\x90\\x4e\\x0a\\x40\\x51\\x44\\xf0\\xbc\\xc2\\xbe\\x53\\x0d\\x7f\\x8d\\x8d\\xc7\\xc0\\xc6\\xd6\\x08\\x6d\\xf5\\xe4\\x5c\\x44\\xe8\\x1e\\xda\\x39\\xee\\xd3\\x39\\xb9\\xbc\\x44\\xdb\\xab\\x18\\x35\\xd8\\x72\\xe8\\x04\\x91\\x13\\xd4\\xda\\x10\\x52\\xe8\\x8e\\xd6\\x83\\xb3\\x62\\x6b\\x92\\x0a\\x31\\x8e\\x22\\xf4\\xbd\\x8b\\x51\\xb6\\x4c\\x28\\xbf\\x47\\x7b\\xbb\\x75\\xdb\\x18\\x1b\\x1a\\x60\\xa5\\xa5\\x94\\x15\\xe3\\xa4\\x39\\x07\\x09\\xa2\\xbb\\xb7\\x83\\x7c\\xe3\\x11\\x00\\x46\\x41\\xbc\\x21\\x27\\xde\\x10\\xfd\\x4c\\x7b\\x7b\\x84\\x42\\x37\\xc5\\x0a\\xcd\\x2d\\xa2\\xab\\x44\\x10\\x17\\x0b\\x87\\xc0\\xa0\\x73\\x85\\x5b\\x83\\x4e\\xeb\\x76\\x3a\\x25\\xe3\\x3b\\xd6\\xab\\xa3\\x10\\x6d\\xa1\\x9d\\x63\\xb9\\x6c\\xa1\\x2d\\x64\\x8d\\xa0\\xf1\\x1c\\xa1\\xf5\\xa9\\x7a\\x03\\xe3\\x51\\xc7\\xb2\\xf2\\x50\\x00\\x72\\xab\\xb6\\x2d\\x00\\x25\\x05\\x44\\x0e\\xbd\\xa8\\xf6\\x3c\\x5f\\xf8\\x19\\x09\\xf7\\xef\\xb4\\x85\\x57\\x05\\xaf\\xb9\\xb2\\x57\\x85\\x7c\\x6f\\xb9\\x92\\x17\\x87\\xfa\\xd5\\x7e\\x17\\xf5\\x27\\xf9\\x0a\\x80\\xc0\\xbe\\x8a\\xf5\\x5b\\xe5\\x3d\\xa1\\x54\\x2f\\xbd\\x27\\x78\\x2d\\xe6\\x4d\\xa3\\xe2\\xbb\\x2d\\xba\\x5b\\xb9\\x4f\\xd4\\x20\\xba\\xce\\x7b\\xa2\\x1e\\xd1\\xa2\\x05\\xa6\\x38\\x30\\xa8\\x4a\\x84\\xb7\\xf3\\x9d\\x50\\x51\\x06\\x29\\xd9\\x0c\\x84\\xc2\\xaa\\xb8\\x71\\x73\\x16\\x67\\x48\\xb5\\x1e\\xe7\\xc7\\x1c\\x54\\xf2\\x1d\\x66\\x86\\x6b\\x72\\xb7\\xe0\\xa8\\xe9\\x71\\x0c\\x48\\x48\\x0b\\xbb\\x14\\x6c\\x76\\xad\\x70\\xb9\\x68\\xa2\\x5c\\xf0\\x2e\\xd5\\x9b\\x7c\\xce\\x39\\xf9\\x0a\\xe6\\xc2\\xea\\x5e\\x81\\xfb\\x3a\\x2c\\x93\\x5a\\x1f\\xe6\\x46\\x9b\\xa3\\x4e\\x9a\\xc8\\x9b\\x4c\\x1a\\x20\\xf3\\xd9\\x76\\x59\\xf6\\xe0\\x58\\x8d\\x72\\x7d\\x76\\xd4\\x9f\\xa0\\x5d\\x73\\x05\\xc0\\x5a\\x5b\\x38\\x25\\xf9\\x82\\x57\\x40\\x9b\\x7a\\x6d\\xec\\x17\\xf3\\x5f\\x6d\\x6a\\x83\\x28\\x8f\\xef\\x96\\x36\\x75\\x18\\x02\\x71\\x63\\x1b\\x57\\x21\\xcb\\x78\\xa2\\x29\\x1c\\x3b\\x5c\\xe1\\x10\\x20\\xd7\\x29\\x1c\\xc3\\x21\\xca\\x97\\x73\\xee\\xc5\\x0f\\xe8\\x19\\x38\\xc6\\x73\\x9c\\x10\\xab\\x9a\\x68\\xfd\\x28\\x3a\\xa6\\x7b\\x96\\xe2\\x17\\xdb\\x7b\\x37\\xd9\\x23\\x48\\xe8\\x74\\xfc\\xf1\\xa7\\x15\\x98\\x1b\\x0e\\x51\\x86\\xe7\\xe9\\x29\\xbb\\x0a\\x81\\xc2\\x65\\x96\\xe1\\x84\\x20\\x59\\x2d\\x4f\\xd9\\x63\\x31\\x8c\\x28\\x67\\x23\\x03\\x46\\x93\\xc3\\xac\\x57\\xad\\xea\\xca\\xb9\\x68\\xed\\xd4\\xa5\\x8d\\x18\\xdd\\xb3\\xfa\\xb1\\xe7\\xb6\\xf8\\xde\\x40\\xa4\\x9a\\xe2\\xaf\\xde\\xbb\\xba\\xd2\\x80\\x22\\xb7\\x1b\\x00\\x71\\x43\\xee\\xc2\\x4a\\x15\\xb6\\x6f\\x55\\x7d\\x8d\\x61\\xb7\\x5f\\x78\\x74\\xfc\\xd8\\x91\\x3b\\x87\\xab\\x57\\xc7\\xd8\\x68\\x7b\\x7a\\x28\\x0f\\xf3\\x6a\\x99\\x14\\x3d\\x7d\\xaf\\xb2\\xd8\\xd3\\x34\\x8d\\xeb\\xca\\x50\\xdd\\xae\\xa6\\xc8\\x61\\x83\\x32\\xea\\xd5\\x88\\x5a\\xb0\\x9a\\x14\\x12\\x47\\x14\\x35\\xa5\\xde\\xe1\\xa0\\x76\\x84\\x87\\xbc\\x50\\x51\\xe6\\xb8\\x5f\\x75\\x7f\\x8d\\x4d\\x89\\x7a\\x67\\x4d\\xbb\\xe9\\xd2\\xf1\\x77\\x77\\xbc\\x4e\\x71\\x81\\xa5\\xe3\\xdf\\xa7\\xbf\\x58\\xca\\x30\\xff\\x07\\xf6\\x95\\x8e\\xad\\xe3\\x3f\\xa0\\xdf\\xd5\\x4b\\x21\\x1d\\xff\\xa1\\x07\\xdd\\x7f\\x8b\\x12\\xd2\\xf1\\x77\\xb6\\xe9\\xd7\\x0c\\x07\\x71\\xc7\\xdf\\xd9\\xa5\\xdf\\xf9\\x9d\\x90\\x8e\\xbf\\xb3\\x47\\x7f\\x2d\\x79\\x29\\xd6\\xc1\\x52\\x14\\x7b\\x70\\x75\\xec\\x3d\\xfc\\x1a\\xee\\xbd\\xd6\\x5c\\x92\\x59\\xef\\x16\\xa7\\xda\\xd8\\x2a\\x97\\x39\\xe1\\xfa\\xae\\x3b\\x9d\\x6a\\xe9\\x15\\xaf\\x76\\xc2\\x4d\\x54\\xdc\\xf0\\xd4\\x21\\x6c\\xd3\\xe6\\x06\\xee\\x7b\\x36\\xbc\\xe4\\xd9\\x08\\x18\\xe5\\x1e\\x4f\\xe5\\xb4\\x4b\\x71\\x9b\\x2d\\x1d\\x57\\x0f\\x2a\\xaf\\x94\\x02\\xe8\\xaa\\xbf\\x59\\xfa\\xd3\\xed\\xcd\\xd2\\xdb\\x9b\\xa5\\x7f\\xf7\\x9b\\xa5\\x25\\x83\\xdc\\xd4\\xf5\\xd2\\xc2\\x0f\\x41\\x5d\\x41\\x4e\\xa2\\x69\\xc2\\x1e\\x0e\\x3e\\xb6\\xbf\\x66\\xaa\\x17\\x0f\\xc1\\xa2\\x61\\x9a\\x4c\\x22\\xe7\\x75\\x4a\\x69\\x88\\x52\\x56\\x34\\x66\\x62\\xb1\\x96\\xb4\\x93\\x20\\xc7\\x3f\\x3c\\x04\\x7b\\xe0\\xaf\\xba\\x7d\\xb7\\x85\\x8f\\x2f\\x48\\x39\\x62\\x8b\\x1b\\x62\\x61\\xb3\\x10\\x49\\x99\\x96\\x5f\\x86\\x7c\\x60\\x3c\\x49\\x89\\x24\\x52\\x95\\x8d\\xef\\xe9\\xa4\\xf3\\x1a\\x51\\x8e\\x12\\x3c\\x0d\\x48\\x74\\x8a\\x3d\\x29\\x36\\xd9\\xb9\\x38\\x39\\x4b\\xbb\\x39\\xe2\\x27\\x8b\\xba\\xaa\\xc2\\x6a\\x53\\xa2\\x2b\\x5a\\x98\\xc4\\x69\\x40\\xa2\\x64\\x8a\\x16\\x69\\x94\\x10\\x8f\\x5f\\x53\\xa0\\xfc\\x38\\x4e\\xcf\\x92\\x1a\\x9b\\x97\\x7e\\x04\\xe0\\x36\\x6b\\x5d\\xf2\\x69\\xbe\\x2c\\x26\\xfc\\x4a\\x8e\\x99\\xf2\\x7e\\x82\\xf1\\x98\\x59\\x35\\x4f\\x4a\\x22\\x1c\\x03\\x26\\x30\\xe5\\xc2\\x20\\x9b\\xa5\\x2b\\xd0\\xea\\xc5\\xb6\\x31\\x1a\\x5c\\xda\\x6a\\xc3\\xfa\\x35\\x97\\x9c\\x02\\xae\\x01\\x27\\x8e\\x5e\\x38\\x78\\xff\\xe2\\xdd\\xfe\\x87\\xa7\\xaf\\x7e\\x7d\\x73\\xf8\\xfa\\xe9\\x8b\\x77\\x1f\\xde\\xed\\x1f\\xbe\\x79\\xfe\\xea\\xcd\\xaf\\x1f\\x5e\\xef\\x3f\\x7f\\x01\\xd8\\x41\\x8a\\x13\\x3c\\xd8\\xe3\\xe6\\xe0\\x2c\\xcd\\x9f\\x15\\xd3\\x21\\x80\\xd0\\xfd\\x6c\\xd0\\x83\\xfb\\xb0\\x86\\xaf\\xee\\x2d\\xd8\\xb8\\x7b\\x96\\x57\\x68\\x85\\x71\\x53\\xa7\\x34\\xd3\\xba\\x58\\x33\\xa9\\x4f\\x2d\\x63\\xa4\\x6e\\xad\\xdc\\xd4\\x24\\xd9\\x7b\\x41\\x70\\x9a\\x00\\x44\\x93\\xf4\\x37\\x7c\\x2e\\xf1\\x99\\x2f\\x4f\\x72\\x92\\xf5\\x76\\x81\\xf9\\x89\\x8d\\xbb\\x42\\xc2\\x81\\x30\\x96\\xe7\\x52\\x0f\\xf6\\xfa\\x68\\x08\\x4d\\x81\\x39\\xad\\xef\\xa2\\xe9\\x8c\\x88\\xea\\x1e\\x8a\\xd1\\xf7\\x5f\\xd9\\xbc\\x89\\xfd\\xcf\\x8d\\x4e\\x9f\\x73\\x47\\xbf\\xf1\\x59\\x94\\x46\\x08\\x7d\\xfa\\xac\\xc3\\xb4\\xaf\\x66\\xc6\\x8d\\x33\\x52\\xe9\\x60\\xc7\\x85\\xdf\\x16\\x5a\\x9d\\x20\\xea\\x96\\x0c\\xae\\x1f\\x36\\xe7\\xf4\\xf7\\x66\\xf9\\xeb\\xa2\\x95\\x22\\xc0\\x41\\x7b\\x2a\\x99\\x64\\xe9\\xfc\\x90\\x4c\\x1e\\xde\\x12\\xca\\x06\\x09\\xc5\\x88\\xc8\\x56\\xb7\\x20\\x18\\xf1\\xdb\\x24\\x91\\xd0\\xe7\\x38\\x48\\x36\\xb7\\x20\\x98\\x41\\xd9\\xea\\x69\\xa4\\xbb\\xbd\\xde\\xa7\\x8b\\xb6\\x44\\x37\\xe8\\x31\\x42\\xdd\\x9d\\x2e\\xf2\\x51\\x77\\xbb\\x7b\\xfd\\xb2\\xbd\\x6e\\x86\\x32\\x1c\\x68\\x38\\xff\\x83\\x96\\xcf\\x11\\x55\\xdd\\xe6\\xcb\\x98\\x44\\x5c\\xed\\x39\\xb9\\x40\\xbb\\xff\\x9e\\x53\\x05\\xb2\\xb8\\x5e\\x1d\\xd0\\x1e\\x08\\x9e\\xe2\\xac\\xc5\\x92\\xff\\xce\\xe8\\xad\\x6e\\x23\\xb7\\xa9\\x19\\x17\\xf1\\x48\\x6a\\x66\\x5c\\xa0\\xdf\\xe0\\x16\\x3a\\x1b\\xa5\\x4f\\xb3\\xdc\\x5c\\x45\\x73\\x9c\\x1b\\xaf\\x76\\xfb\\x83\\x45\\x7a\\xd6\\xdb\\xd9\\x7d\\xd8\\xef\\xf7\\x9b\\x9d\\xc5\\xb7\\x9b\\xab\\xd3\\x39\\x10\\x48\\xb5\\x06\\xe3\\x4f\\xec\\xc8\\xab\\xd7\\x24\\x7b\\xa1\\xf3\\x45\\x27\\x63\\x9d\\x88\\xd5\\x9c\\x2b\\x33\\xf2\\x64\\x54\\x8a\\x5e\\xaa\\x58\\xf6\\xee\\x9b\\xe2\\x0d\\x10\\xda\\xac\\x99\\x03\\xb6\\xbe\\xf3\\x33\\x4c\\x97\\xd8\\x76\\xec\\xa0\\xa5\\x38\\x5d\\x73\\x97\\x65\\xa1\\xc4\\x0e\\xa0\\xda\\x52\\xde\\xb0\\x12\\x5f\\x68\\x30\\x1b\\xda\\x23\\xcc\\xd2\\xb3\\xf6\\xe4\\xaa\\x04\\xaf\\xbd\\x01\\x92\\x55\\x7a\\x5b\\x9f\\x6c\\x41\\x9c\\xb7\\x20\\xd3\\x2a\\x39\\xf1\\x6c\\x86\\xc3\\x4f\\x28\\x9a\\x68\\xb8\\x57\\x14\\xf4\\x1a\\x04\\xe7\\xd1\\x34\\xc1\\xe3\\x57\\xf9\\x1b\\xbb\\xb8\\xe5\\x22\\x52\\xb4\\x3d\\xc3\\xe7\\x02\\x57\\x30\\xba\\xe5\\xaa\\xcc\\x6c\\xa9\\x0c\\x36\\xa2\\xdb\\x0c\\x98\\xaf\\xec\\x59\\x94\\x63\\x1e\\xe1\\xdb\\x39\\x21\\x26\\x74\\x8d\\x05\\x35\\x24\\x9a\\x25\\x66\\xb7\\x3d\\xb4\\xd3\\xf7\\xd0\\xce\\x03\\x45\\x11\\xde\\xed\\x6b\\x6f\\xfb\\xcc\\x6b\\xac\\xbb\\xd3\\x6d\\xb5\\xac\\x66\\x74\\x1f\\x76\\x2f\\x88\\x19\\xd0\\x88\\x9f\\x00\\x94\\xae\\x53\\xba\\x31\\xc5\\x4d\\xec\\xfc\\x7c\\xc0\\x65\\xd6\\xd0\\x08\\xd9\\x19\\x6d\\x86\\xce\\x41\\x69\\xf2\\xa8\\x80\\xab\\x30\\x7b\\x30\\x76\\x8d\\xa6\\x88\\x9b\\xc0\\x6a\\x38\\xa4\\x00\\x51\\x9b\\x0f\\x06\\x0c\\xc4\\x1a\\x9c\\x6e\\xc4\\x85\\x3c\\xe5\\xc8\\xb6\\xd7\\x47\\x97\\x97\\xa8\\xb3\\xdd\\x31\\x4e\\xd0\\x87\\x43\\x14\\x16\\x54\\x4d\\xba\\x25\\xe1\\x58\\xd0\\xf1\\xc2\\x11\\xe1\\x04\\x56\\xd8\\xa2\\xdc\\x66\\x28\\xe9\\x77\\x61\\xd0\\x95\\xa0\\xa5\\x8a\\x13\\x55\\x80\\x9e\\x38\\x09\\xcd\\xa3\\x64\\x69\\x2e\\xf7\\xdd\\xc9\\x9a\\x9f\\x2e\\x6b\\x5b\\x36\\xbe\\x63\\x85\\x4e\\x6a\\x01\\xe0\\x06\\x29\\x78\\xd9\\x8e\\x84\\x0f\\x1b\\xd1\\x70\\x15\\xf5\\xe2\\x56\\xe4\\x6b\\x80\\xe7\\x26\\xdc\\xc3\\x4d\\x52\\xee\\x97\\x99\\x0a\\x63\\x6f\\x5e\\x37\\x15\\xce\\xcd\\x75\\xe3\\xa9\\x60\\x33\\xa1\\xd8\\x84\\x74\\xd4\\x1b\\xe0\\xb8\\x51\\x6f\\xed\\xb6\\x41\\xd4\\x6b\\xbb\\xed\\x42\\xd8\\x88\\xb2\\x83\\x71\\x74\\x1a\\x8d\\xf1\\xf8\\xe9\\x45\\xc5\\x26\\x7b\\x93\\x54\\xdf\\x12\\xd7\\x87\\xd7\\x8d\\x6c\\x13\\xa0\\x0a\\x42\\x5f\\x19\\xdd\\x87\\xd7\\x81\\x6f\\xdb\\xdf\\x95\\x77\\x59\\xa0\\xbc\\xa9\\x49\\xa0\\x8c\\x61\\xbe\\x32\\x9e\\xe5\\x0e\\x45\\x9f\\x7b\\x27\\xce\\x0d\\xd0\\xdc\\x28\\xb7\\x0c\\x08\\x55\\x18\\x07\\xc4\\x0a\\xdb\\x77\\xac\\x69\\x51\\xd8\\xe9\\xa2\\xc7\\x7c\\xeb\\x25\\x32\\xa8\\x6c\\x66\\x76\\x1a\\x9b\\x82\\x95\\x70\\xd5\\x0d\\xf6\\x30\\x31\\x9e\\x94\\x13\\x40\\x77\\x96\\x0d\\x8c\\x8a\\xd6\\xd6\\x34\\x09\\xe6\\x98\\x87\\x65\\xa4\\xdf\\x1c\\x4a\\x80\\x28\\x4b\\xfb\\xb0\\x5a\\xac\\x98\\x51\\xcb\\xba\\xcc\\x63\\xec\\x21\\xc8\\xa7\\x81\\xdd\\x5b\\xe3\\x11\\xd1\\xd1\\x08\\xb9\\x02\\x59\\x7f\\xdf\\x1f\\x42\\x2e\\xad\\xd1\\x7f\\xc4\\x5a\\x93\\x33\\xe7\\x27\\xd1\\xce\\xd1\\x8e\\xe9\\xc8\\x26\\xa8\\xa7\\xbb\\x7d\\xde\\x45\\x5b\\x00\\x11\\x09\\x2d\\x79\\xdb\\x43\\xbb\\xe8\\x7b\\xd6\\xec\\x86\\xf8\\xb3\\x25\\x05\\xa8\\xe6\\xf9\\x6b\\x23\\x84\\x75\\xa7\\xd7\\x79\\x86\\xe0\\xdc\\x14\\x14\\x36\\x5e\\x43\\x1e\\xf2\\x89\\x10\\xbe\\x55\\xe6\\x4c\\x3c\\xb8\\xdf\\x17\\x7b\\x3a\\x92\\x8a\\xf2\\x7d\\xf4\\xbd\\x69\\x16\\x86\\x66\\xd6\\x68\\x90\\x6b\\x29\\x0f\\xee\\x7b\\xc8\\xba\\x35\\xb4\\xc6\\xd4\\xb6\\x30\\xdb\\x73\\xb4\\x55\\xd8\\xed\\xaf\\x65\\x56\\x83\\x3c\\x8c\\xa2\\x36\\xf3\\x0a\\xd8\\xfb\\xbf\\xe0\\x8c\\xca\\xe3\\x26\\x76\\x8c\\xd0\\x6c\\x5e\\x37\\x33\\xb1\\x6d\\xcc\\x2c\\x5a\\x4e\\x9e\\x06\\x53\\xeb\\x5c\\x3b\\x6b\\xa6\\xd2\\xea\\xc0\\x3d\\x8b\\x90\\x09\\x66\\x85\\xdd\\x3a\\x10\\x9f\\x8c\\x92\\x62\\x61\\x4c\\x63\\x73\\xca\\xbf\\x17\\xae\\xc1\\x3b\\xbb\\x0f\\x3d\\xa4\\x3e\\x83\\x5a\\x11\\x56\\x1f\\x3e\\xbd\\x33\\x7c\\x7e\\x90\\x72\\x1f\\xd2\\x19\\x3e\\x6f\\x60\\xf5\\x79\\xca\\x6c\\x45\\xc2\\xf0\\xd3\\xd0\\xe7\\x4c\\x1f\\xb6\\x6e\\x90\\xf6\\x8d\\xdf\\x9e\\xab\\x2c\\x03\\xd2\\xb7\\x9e\\x38\\xcb\\xab\\x42\\xd2\\x77\\xbd\\x70\\xd6\\xe6\\x13\\xef\\xdb\\x8f\\xdc\\xf0\\xa5\\x69\\xec\\x9b\\x0f\\x9c\\xa5\\xe9\\x2e\\xd7\\x37\\x1f\\x38\\x4b\\x0b\\x92\\xf2\\x81\\x67\\xce\\x3a\\x8a\\x35\\xd0\\x77\\x3c\\xb7\\xeb\\xda\\x96\\x5e\\x1f\\x7e\\x0c\\x75\\x5b\\x68\\x3d\\xbe\\xf9\\xc0\\x5d\\xfa\\xd0\\x2a\\x7e\\x58\\x59\\x5e\\xc5\\x5b\\xf9\\xa4\\xa2\\x7d\\xbb\\xc2\\x61\\x75\\x0d\\x75\\x1e\\xcb\\x27\\x15\\xe5\\x55\\x02\\x53\\x1e\\xb9\\x6b\\x40\\x94\\x69\\xbf\\x71\\xd7\\xd7\\x69\\x53\\x7d\\xe6\\xae\\x63\\x50\\x02\\x2c\\x36\\xaf\\x20\\x57\\x6d\\x6e\\x1c\\xee\\xf8\\x3b\\x3f\\x7a\\x1d\\xc3\\x2f\\xac\\xe3\\xef\\xfc\\xe4\\x39\\x9c\\xba\\x99\\x40\\xeb\\xf8\\x3b\\x3b\\x5e\\x47\\xf5\\x52\\xeb\\xf8\\xfa\\xcf\\xab\\x63\\x6f\\x67\\xfb\\x0b\\x7a\\x5e\\xab\\xa5\\x1b\\x78\\xcc\\x39\\x97\\x34\\xfd\\x12\\x40\\x4d\\x16\\xb0\\x28\\x21\\x4d\\x93\\x80\\x19\\xee\\x6c\\x51\\x42\\xf4\\x9c\\x42\\xf4\\xc1\\x7d\\xeb\\xc9\\xb1\\x5d\\xc8\\x4c\\x46\\xc4\\x8b\\x81\\xa9\\x88\\xa2\\x84\\xe8\\x89\\x88\\xa2\\x84\\x3c\\xb8\\x6f\\x55\\x37\\x33\\x13\\xf1\\x34\\x95\\x0d\\xfb\\xa6\\xed\\xb5\\x4c\\x3e\\x66\\x5a\\xc0\\x56\\x71\\x81\\x7f\\x95\\x90\\x55\\x3c\\xdf\\x1d\\xd5\\x72\\x9c\\xa5\\xaf\\xcc\\xfe\\x2c\\x6b\\xbf\\xd3\\x3e\\x6b\\x87\\x98\\xb2\\x7c\\xdd\\xb6\\x9d\\x66\\x54\\x97\\x4b\\xf9\\xab\\x84\\xac\\xe8\\x6d\\xaf\\xd5\\xac\\x70\\xb2\\x67\\xc8\\x68\\xd0\\xc2\\x5a\\x2e\\xf5\\x51\\x42\\xa4\\xde\\xf9\\x78\\x23\\xe9\\x93\\x4a\\xa8\\xdd\\x17\\x51\\xaa\\xdc\\xde\\x77\\x76\\x6e\\xfd\\xde\\x6f\\xfd\\xde\\xff\\xee\\x7e\\xef\\x5c\\x4d\\xb9\\x21\\x97\\xf7\\x0d\\xac\\xc7\\xdc\\x43\\x3d\\x65\\x61\\x17\\xca\\x1c\\x35\\x83\\x0a\\x6d\\xf4\\x6c\\x86\\x93\\x22\\xf6\\x86\\xc7\\x23\\x15\\x50\\xa5\\xbc\\x48\\x11\\x62\\x6a\\x8b\\xf0\\x82\\x65\\xc7\\x68\\x10\\x67\\x2a\\x70\\x94\\x2b\\xb6\\x9e\\x48\\x5d\\x90\\xff\\xbf\\xbc\\x44\\xdd\\x2e\\xb0\\xea\\xa4\\x32\\x3a\\x0a\\xff\\xf2\\x08\\x0d\\x87\\x32\\x6e\\x47\\x94\\x18\\xd0\\xad\\x9c\\xeb\\x66\\x8a\\x89\\x7a\\x9b\\x97\\x85\\x3f\\xe8\\xe6\\x32\\x0a\\x19\\x13\\x65\\x35\\xea\\xb9\\x62\\x2a\\xe0\\xd7\\x54\\x61\\x05\\x5b\\x9e\\x1c\\x94\\x9d\\xa9\\x7d\\xa0\\x9e\\x1c\\x52\\x1f\\xc4\\xb8\\x86\\x6d\\x35\\x4e\\x80\\xd9\\x79\\xa3\\x4b\\x54\\x2c\\x44\\x86\\x66\\xe1\\x80\\x5c\\x21\\x57\\xc6\\x69\\x98\\x61\\x4a\\xf3\\x92\\xab\\xf5\\x3c\\x48\\x9c\\x69\\xc7\\xd1\\x64\\x82\\xd9\\x95\\x64\\x3e\\xa3\\x35\\x38\\x3e\\x2b\\xe2\\xbb\\x40\\x96\\x0f\\x89\\x5a\\x41\\x1c\\xf2\\x56\\xb3\\x49\\x23\\x15\\x4e\\x27\\x6c\\xf3\\x00\\xc1\\x19\\x2c\\xb8\\x1c\\xb5\\xa0\\xac\\x9f\\x9a\\x33\\x38\\x32\\x1c\\xcc\\x16\\x4e\\x57\\x9f\\x92\\x5f\\x0a\\x8e\\xda\\xc4\\x0c\\xa5\\xf3\\x93\\x28\\xb1\\x53\\x54\\x91\\x74\\x8a\\xe9\\x9a\\xa7\\xb6\\x84\\xa7\\x03\\x2e\\x2b\\x82\\xc5\\x02\\x27\\x4c\\x44\\x04\\x09\\x0f\\x38\\x52\\x33\\x6b\\xa2\\x97\\x06\\xc6\\x2a\\x05\\xe3\\x67\\xb3\\x28\\xa4\\x42\\x5d\\x42\\xdd\\xbc\\x11\\xe1\\x5e\\x95\\x4e\\x44\\x1d\\xb6\\x8a\\xb7\\x9a\\x32\\x89\\x96\\xa6\\x47\\x44\\x55\\xd3\\x55\\x98\\x88\\x4d\\x2f\\xa3\\xd6\\x93\\x16\\x06\\x71\\x2c\\xa6\\x4d\\x3a\\x5e\\x70\\x04\\xcc\\x82\\x52\\x50\\xe5\\xd1\\x7f\\x8c\\xec\\xaf\\xcc\\xb1\\x67\\x16\\xe4\\x1e\\xfd\\x2f\\xe9\\x9e\\x64\\xcb\\x4a\\x0f\\x1f\\x68\\x1a\\x8b\\x4b\\x9a\\x30\\x27\\x01\\x5e\\xbe\\xf5\\x98\\x86\\x93\\xc1\\x55\\xc9\\x2b\\xc1\\xdc\\x77\\x46\\x23\\xb6\\x05\\x9c\\x44\\x89\\x19\\x38\\x69\\x45\\xa4\\x96\\xd9\\xce\\x44\\x17\\xc2\\x37\\xae\\xce\\x2c\\xcb\\x4b\\x3f\\xc9\\xed\\x13\\x14\\xcb\\xa8\\xca\\x0d\\x91\\xb6\\x6d\\x7d\\x05\\xa9\\xa2\\xf5\\xda\\x04\\x79\\x77\\x18\\xf6\\xca\\xe8\\x9f\\x7d\\xf4\\x18\\x75\\xbb\\xc8\\x6f\\x76\\x27\\x49\\x41\\x7d\\xe5\\xcd\\xa4\\x35\\xf0\\x4f\\x57\\x60\\x6e\\x0e\\x2e\\x14\\x87\\x26\\x21\\xac\\x4a\\x0b\\x72\\x35\\xee\\xe5\\x8e\\x41\\xfa\\xb9\\x05\\xea\\xba\\x1b\\xcc\\x55\\x66\\x60\\x9c\\xda\\x6a\\x36\\x4a\\x20\\x2a\\xa7\\x82\\xe5\\x6b\\x33\\xe7\\xa1\\x2a\\x1f\\x5c\\x21\\x45\\x1a\\xf8\\x16\\x29\\x53\\x24\\xc8\\xa2\\xb7\\xb9\\x89\\xd1\\xf6\\x28\\x0d\\x67\\x46\\xd9\\x59\\x54\\x4f\\x8d\\x7c\\x10\\x48\\xe7\\xc5\\x06\\x73\\x84\\xe7\\x0b\\x72\\x51\\x75\\xd4\\xd4\\x60\\xa7\\xd4\\x58\\xe6\\xe8\\x5c\\xa3\\xc8\\x76\\x5f\\xdb\\xb1\\xae\\x81\\x63\\x99\\x0f\\xaf\\x01\\x5a\\x79\\xd1\\x4a\\x8c\\xb6\\x42\\x88\\xe8\\xba\\x29\\x2e\\x34\\x47\\x88\\x2d\\x60\\x0f\\xb9\\x49\\x7c\\x94\\xe1\\xcc\\x9a\\x04\\x59\\xe3\\x95\\x7e\\x8f\\x72\\x70\\x77\\xc8\\x22\\xa4\\x1d\\x69\\x58\\x38\\xae\\x48\\x48\\xd7\\x0a\\x9b\\x65\\xcf\\xf6\\x9e\\x81\\x85\\x93\\xd1\\xd0\\x39\\x1c\\xa2\\xe5\\x62\\xcc\\xef\\xd5\\x8a\\xb8\\x4f\\xda\\x7b\\xaa\\x56\\x91\\x94\\x28\\x71\\x21\\x17\\x6a\\x08\\x76\\x91\\xad\\xcc\\xac\\xc1\\x5b\\x2a\\x02\\xb7\\x89\\x2a\\x7a\\x44\\x1a\\x70\\x13\\x83\\xa4\\x64\\xe2\\xfb\\x94\\x1a\\xd1\\x84\\x0c\\xcf\\x98\\xa6\\x49\\x21\\x0a\\x2d\\x4e\\x19\\x99\\x5d\\x57\\x1d\\xf6\\xd6\\xc8\\x3e\\x5c\\x17\\x01\\x84\\xdc\\x41\\x83\\x78\\x8d\\x72\\xcf\\xdd\\xb3\\x36\\xcb\\x08\\x8a\\x07\\x35\\x1c\\x4a\\x92\\xc3\\xa7\\x38\\xbb\\x20\\xb3\\x28\\x99\\xde\\x81\\x78\\x40\\xc5\\xb2\\x9d\\x0e\\x4f\\xba\\xf0\\x3b\\xf1\\xac\\x85\\x86\\x84\\xbd\\x07\\x0c\\x48\\xbd\\xeb\\xe9\\xd2\\x7d\\xf0\\x7a\\xe5\\xa1\\x6e\\xd7\\xba\\x00\\x53\\xfc\\x72\\xda\\x1c\\xdf\\x72\\x6a\\xa8\\x32\\x39\\x5e\\x1d\\x7b\\x3b\\xbb\\x5f\\x43\\xd4\\x99\\x8a\\xc3\\x0c\\xe6\\x8d\\x57\\x7d\\x9a\\x91\\xd1\\x22\\x0d\\x8f\\x33\\xcc\\xfb\\x59\\xf4\\xb7\\x7e\\x36\\xc0\\x9e\\xdc\\xb7\\x1f\\x1d\\x03\\xc5\\xcc\\x73\\x05\\x51\\x10\\x3c\\xd4\\xa0\\xef\\xf4\\x53\\x0d\\xfa\\xc4\\x3c\\xd6\\xa0\\xcf\\xcc\\x73\\x0d\\xfa\\x0c\\x38\\xd8\\x70\\x42\\xb0\\xc2\\xd1\\x86\\xe5\\xf3\\xb8\\xca\\xd9\\x06\\x6d\\x64\\x95\\xc3\\x0d\\xbd\\x9e\\xeb\\x5c\\x81\\x96\\x5a\\xf1\\x60\\x41\\xaf\\x5a\\x71\\xb2\\xc0\\x21\\x69\\xd2\\xc6\\x3a\\x67\\x0b\\x74\\x8e\\x1c\\x67\\x0b\\x8f\\x57\\x3a\\x5a\\x50\\xc0\\xae\\x0f\\x9f\\xb3\\xb3\\xf7\\x35\\x70\\xbc\\x33\\x95\\xfa\\x7a\\x24\\xc8\\x9b\\x59\\x85\\x08\\xcd\\x9a\\x2e\\x32\\xe4\\xe5\\x56\\x24\\x44\\xb3\\x72\\x05\\x29\\x4a\\x78\\x9a\\xb5\\xb3\\xd6\\x51\\x17\\xdf\\xb5\\xaf\\x12\\x3e\\x0a\\x80\\xe3\\x66\\x02\\x47\\x69\\xd8\\x69\\x40\\xf3\\xf7\\xaf\\x9d\\xe6\\xab\\x42\\xd1\\xb8\\x88\\xbe\\x74\\xd4\\x52\\x6a\\x09\\x4f\\xaf\\xd6\\xbe\\x01\\x8d\\x56\\x53\\x25\\x4d\\x7e\\x94\\x37\\xcf\\x8f\\x1f\\xe2\\x8c\\x04\\x51\\xd2\\x2c\\x47\\xbe\\x35\\xf5\\xdc\\x57\\xa3\\x21\\x3b\\xf3\\xc2\\x03\\xfd\\x79\\x33\\x86\\x16\\x55\\x8d\\x17\\x2b\\x47\\x95\\x26\\x38\\x9b\\x47\\x09\\x53\\x7f\\x69\\x8f\\xfa\\xf8\\xc6\\x22\\xb3\\x3d\\x9a\\x46\\xa7\\x38\\x31\\x1d\\xa8\\x21\\x6d\\x88\\xb3\\x28\\xa4\\x09\\xa9\\xfe\\xd8\\x80\\xe6\\xc3\\x4d\\x79\\xe5\\xbd\\x40\\x36\\x7b\\xbc\\x73\\x0b\\xae\\x66\\xb7\\x04\\xd5\\x1a\\xed\\x85\\x08\\x4f\\x60\\xdf\\x21\\xa0\\xca\\x98\\x9e\\xe2\\x2c\\x3b\\xcb\\x22\\x42\\x30\\xbb\\x1c\\xc1\\xa1\\xed\\xa0\\x2d\\x36\\xba\\xb5\\xe7\\xe2\\x8c\\x1d\\xc3\\xe6\\x6a\\x94\\x54\\xe6\\x0b\\x5b\\x9a\\xa9\\xa2\\x44\\x4c\\x89\\x41\\xab\\xd5\\xb6\\x2a\\xe0\\x84\\xa8\\xe9\\xe4\\xd8\\x07\\x48\\x06\\x38\\xee\\xf3\\x3a\\xc7\\x3c\\x00\\x71\\x5c\\xed\\x19\\xb1\\xf4\\xcd\\x18\\x27\\x32\\x32\\xb4\\xe0\\x0d\\x5a\\x7b\\x46\\x1e\\xdb\\x8f\\x7c\\x53\\x5f\\x1d\\x0e\\xd9\\x21\\x6d\\x30\\xa7\\x62\\x81\\x65\\x73\\x12\\x27\\x09\\x14\\xd1\\x54\\x48\\x63\\x7e\\xfa\\x1d\\x47\\x9f\\x30\\x0a\\x50\\x1e\\x25\\xd3\\x18\\xcb\\x60\\xb4\\xbc\\xe4\\x00\\x92\\xee\\xdc\\x4e\\xc9\\x43\\xff\\xf3\\xd8\\xd6\\x1c\\xfc\\xcb\\x4b\\x74\\xd4\\x3d\\xda\\x39\\xee\\x1e\\xdb\\x79\\x10\\x1b\\x06\\x6d\\x15\\x60\\xeb\\x84\\x40\\x7f\\xa9\\x29\\x9b\\x6a\\xb4\\x65\\x7e\\x65\\x80\\xe3\\x9c\\x79\\xb3\\xee\\x78\\xe8\\x1e\\xbb\\xe6\\xba\\xcd\\x60\\xdc\\x01\\x94\\x69\\x00\\x60\\x4b\\x07\\x94\\xe1\\x7a\\x3d\\x19\\xe0\\xb7\\x4e\\x71\\x97\\xe1\\x7d\\xbf\\x97\\x15\\xe0\\x6c\\x07\\xc3\\x21\\x0a\\xe2\\x18\\x9d\\x04\\x79\\x14\\xf2\\x08\\xb7\\x2c\\xb0\\xc4\\xde\\xae\\xb0\\x64\\xc7\\xa9\\x6a\\x7c\\x93\\x10\\x33\\xe7\\xe8\\x55\\x1d\\xa3\\x75\\x31\\x28\\xd6\\x0d\\x69\\x05\\x34\\x0f\\x9b\\x10\\x9e\\x6a\\xca\\x56\\x87\\x56\\x38\\x3a\\xee\\xa0\\xd1\\x2f\\x4c\\x7a\\xd9\\xef\\xee\\xf3\\x97\\xad\\x8e\\x3b\\x9e\\x98\\xbd\\xae\\x2a\\x47\\x67\\xb8\\x76\\x44\\x0d\\x64\\xa6\\x0a\\x55\\xad\\xec\\x2c\\xf3\\x12\\x69\\x21\\xe0\\x2d\\x0e\\x01\\xdd\\xa0\\xef\\xdc\\x51\\xab\\xde\\xbd\\x8b\\xd4\\xdf\\x47\\xca\\x77\\xc5\\x1f\\xfb\\x58\\xee\\xf2\\xd8\\xd6\\xee\\xf3\\x8e\\x77\\x35\\x9c\\x6e\\x94\\x16\\x84\\xb0\\x6b\\x43\\x0a\\xe6\\x6c\\xeb\\xb4\\x60\\x10\\x0a\\x4c\\x0a\\x4a\\x66\\xaa\\x0d\\x53\\x82\\x63\\x3c\\x0d\\x08\\x41\\x81\\xe9\\xa6\\xe9\\xe0\\x26\\x08\\x41\\x8f\\x02\\x5e\\x2e\\x73\\xc0\\xcc\\x6b\\x76\\x8f\\x0e\\x73\\xc0\\xdc\\xe5\\x93\\xab\\x1b\\x40\\x3a\\xc2\\x63\\x73\\x47\\x4c\\xfd\\xce\\x7d\\xab\\xe2\\xee\\xf1\\xd1\\x9e\\xa8\\x6a\\xbe\\xe3\\x55\\xac\\x1a\\x3b\\xc7\\x8e\\x17\\xf6\\x73\\xf7\\x9e\\x80\\xcd\\xe2\\x06\\x36\\x05\\x2a\\x8e\\x04\\xea\\xda\\xef\\x04\\x14\\x60\\xae\\x89\\xb0\\xa2\\x09\\xea\\x29\\x45\\x2a\\xcc\\x96\\xc5\\xaa\\xb9\\x22\\xc5\\xb1\\x65\\xb5\\xc9\\xd5\\xfc\\x9d\\x15\\x68\\x53\\x2c\\xfd\\xa6\\x29\\xb0\\x8a\\x20\\x19\\x21\\x55\\xd1\\xa4\\xf8\\x6d\\x95\\x51\\x28\\x53\\xfc\\xb4\\x8a\\xb8\\x3b\\x38\\x82\\x3b\\x87\\xe8\\xb1\\xcc\\x9b\\xb4\\x12\\x21\\x16\\x05\\x38\\x6a\\x8c\\x72\\xb5\\x04\\xa8\\xe5\\xe0\\xab\\xa6\\xbc\\x32\\xb3\\x41\\x1c\\xe4\\x04\\x1d\\x1d\\xd3\\xbd\\xaf\\xde\\xdf\\x5a\\xf4\\x79\\xa7\\x19\\x81\\xea\\x6a\\x06\\x72\\xe6\\x6f\\x60\\x16\\x90\\x32\\x7c\\x09\\xfb\\x59\\xd0\\x6e\\x13\\xe2\\x5e\\xe1\\x26\\xa1\\x62\\xf3\\x28\\x96\\x50\\xd3\\x59\\x04\\x9d\\x5c\\xa0\\x31\\x9e\\x04\\xcb\\x58\\x3b\\x35\\xcb\\x97\\x54\\xdd\\x2b\\xb6\\x7c\\x1d\\x11\\x52\\xde\\x43\\x1d\\x1e\\x90\\xbe\\xe9\\xe6\\x69\\x43\\x3a\\x68\\xb9\\x65\\x5a\\x53\\xe3\\x6c\\x69\\x2e\\x6a\\x7d\\x33\\x5b\\xd4\\x2b\\x0e\\x2e\\x15\\x11\\x91\\xd7\\xc9\\x08\\xc6\\xe1\\x82\\x55\\x8f\\x3a\\x94\\xc3\\x3d\\xd4\\xa1\\x4c\\x4f\\xff\\x1d\\x77\\x8e\\x6d\\xae\\x16\\x25\\x81\\x77\\xac\\x91\\x64\\x19\\xd7\\xdd\\xd5\\x57\\xa8\\x6d\\xa5\\x69\\x32\\xf3\\x4e\\x39\\xc6\\xdb\\x90\\xf1\\xed\\x84\\x1c\\x4e\\xce\\xe7\\x9b\\x03\\x91\\x83\\x8b\\x53\\x67\\xce\\x7c\\xd4\\x28\\x3a\\x34\\xbc\\xd1\\xbf\\x9a\\xb4\\x34\\x98\\x52\\xac\\x1a\\xbd\\x7f\\x1d\\x71\\x73\\xe4\\xbf\\x8e\\xfb\\xab\\xef\\x59\\xc5\\x29\\x62\\x11\\x44\\xb9\\x06\\xfd\\xc0\\x61\\xbe\\xc0\\xbc\\xcc\\x9c\\x66\\xb6\\xd2\\x5e\\x14\\xcb\\x88\\x7f\\xf5\\x6e\\x2d\\xc6\\x9c\\x00\\x9e\\x01\\xc2\\x03\\x91\\xf6\\xe9\\x15\\xc9\\x85\\x5c\\x89\\xc0\\x5c\\x29\\x53\\xa8\\x74\\xd5\\xfd\\x2a\\x44\\xee\\x51\\x99\\x75\\xd4\\x25\\x6b\\x7b\\x6e\\x7e\\x55\\x3b\\x2e\\x6e\\x0a\\xab\\x17\\x43\\x1f\\x41\\xa5\\xc5\\xa4\\x0e\\xe9\\xd2\\x11\\x01\\x49\\x7b\\x10\\x98\\x1a\\x16\\xc7\\x13\\x35\\x25\\xac\\x58\\x3f\\x9c\\x95\\x8b\\x70\\x6f\\x66\\x06\\xac\\x72\\x74\\x2c\\xa6\\xe8\\x62\\x99\\xcf\\x7a\\x56\\xe6\\x4c\\x19\\xec\\x53\\xa6\\xc1\\x74\\xf7\\x44\\xc7\\x6a\\xa7\\x83\\x3e\\xad\\x4a\\x9a\\xaa\\xf6\\xac\\xa4\\x51\\xec\\x9d\\x7a\\xca\\x90\\xf5\\x89\\x76\\x25\\x46\\x74\\xc1\\x55\\x91\\x0c\\x91\\xd7\\xeb\\x99\\x35\\xaf\\x64\\x6a\\xc8\\x82\\x4a\\xd4\\xbc\\xc0\\x1b\\x27\\x12\\x36\\x6e\\x6b\\xe3\\x2b\\x66\\xb5\\xac\\xf3\\xa5\\x89\\x04\\x4a\\x91\\xdb\\x30\\x35\\xae\\x73\\x96\\x29\\xc9\\xb0\\x84\\xdc\\x6d\\x27\\x7b\\x63\\x53\\x6d\\xa6\\x6d\\x16\\x53\\xce\\xcd\\xf4\\xef\\x71\\x96\\x16\\x57\\x70\\x4b\\xc3\\xfb\\xdd\\xbb\\xa8\\x4a\\xf4\\x20\\xc3\\x61\\xa9\\xaa\\xad\\x9e\\xda\\xd0\\x11\\xc3\\xc7\\xb1\\x88\\x19\\xe2\\xc8\\x3b\\x7b\\xe5\\xc8\\x4d\\x6f\\xf7\\x58\\x76\\xa2\\x08\\x4d\\x67\\xb3\\x9b\\x59\\x6d\\x3c\\xf6\\xe2\\xe4\\x02\\xe5\\x38\\x4b\\xbf\\xfd\\xa5\\x87\\x4e\\x9a\\x6b\\xf9\\xd9\\xdc\\x8a\\x43\\x55\\xc4\\x6b\\x14\\x34\\xd7\\x2b\\x16\\x36\\x29\\xf6\\x29\\xba\\x75\\xd1\\x7f\\x13\\xd2\\xde\\x9a\\x28\\x9e\\x17\\xcd\\xbe\\x6a\\x5a\\x9b\\x4a\\xcd\\xae\\x02\\x86\\xf6\\x84\\xf5\\x33\\xc3\\xcd\\xd6\\x75\\x02\\xad\\xd0\\x68\\xe0\\x8a\\x3c\\x2a\\xf6\\x47\\x51\\xfe\\x1b\\xcf\\xc9\\x77\\x4b\\xa7\\x6b\\xd1\\x69\\x19\\xa8\\x5d\\x66\\xd3\\xa4\\xc0\\x09\\xec\\x1b\\x5b\\x15\\x8e\\xf3\\x0a\\xaa\\x85\\xbb\\x59\\x9f\\x68\\x8b\\xc9\\x76\\x34\\xce\\x29\\xb4\\x58\\x8a\\xc4\\x49\\x7c\\x0d\\xa1\\xd2\\xb5\\xc6\\xd9\\x22\\xe8\\x17\\xde\\x86\\x7e\\xc3\\x34\\x39\\xc5\\x15\\x01\\x8e\\x05\\x19\\x57\\xa5\\xfa\\xbd\\xa5\\xe3\\xd5\\xe4\\xad\\x8e\\x7a\\x83\\x86\\x83\\xfa\\x9d\\x36\\xdc\\x49\\x03\\x2a\\xd6\\x9e\\x58\\x53\\x56\\x47\\xa5\\xc0\\xcd\\x7e\\x5a\\x4d\\x00\\x3c\\x98\\x05\\xf9\\xfe\\x59\\xf2\\x36\\x4b\\x17\\x38\\x23\\x17\\x15\\xe1\\x5a\\x15\\x70\\x03\\x6d\\xef\\x65\\x43\\x0d\\xb3\\x00\\xaa\\x64\\x03\\x7b\\x70\\x2b\\x70\\x52\\xf1\\x6d\\x95\\x54\\xec\\xfc\\x76\\xc0\\x24\\x4b\\xe7\\x8d\\xae\\x10\\xf1\\x5a\\x55\\x3b\\x2d\\xfb\\x06\\x23\\x7c\\xe7\\x11\\xbc\\xec\\xb8\\x42\\x18\\x3e\\xb9\\x05\\xe4\\x90\\xad\\xb0\\x81\\x13\\x88\\x50\\x85\\x8a\\x96\\xe9\\x58\\x08\\x97\\x79\\xb0\\xa0\\x14\\x50\\x2b\\x5c\\x6e\\xd4\\x7e\\xc0\\x8c\\x59\\xaa\\xef\\x3d\\x3f\\x81\\x10\\x01\\xdf\\xd8\\x30\\xa4\\x25\\x57\\xa0\\xfd\\x7b\\xb4\\xcb\\x2e\\x42\\xf5\\x1f\\x09\\x3d\\xd1\\x98\\x04\\xa3\\x83\\x42\\xf7\\xac\\x6c\\x5b\\x05\\xc3\\xea\\xa0\\x4a\\x11\\x65\\x15\\xdf\\x13\\x7e\\xc3\\x45\\x6d\\x65\\x0b\\xed\\xed\\xb2\\x06\\xb8\\xb9\\x2e\\xa7\\x45\\x72\\x14\\x4c\\xa8\\x56\\x25\\x75\\x49\\x15\\xfe\\xb5\\x64\\x6c\\x75\\xdd\\xf7\\x40\\xee\\xe0\\x52\\x11\\x57\\x5c\\xfd\\x95\\xcd\\xe8\\x23\\xd4\\x08\\xbb\\x2c\\x47\\x19\\x1e\\xbf\\x71\\xf5\\xa3\\xa6\\x73\\x71\\x00\\xb3\\x85\\xf6\\x76\\xfa\\x68\\x88\\xf6\\x76\\xfb\\xc0\\x6d\\x0b\\xad\\x33\\x75\\xc1\\x68\\xa9\\xb8\\xa3\\xef\\xab\\x61\\xa5\\x65\\xb7\\x46\\xd5\\x65\\x5a\\x2d\\x3b\\x7a\\x02\\x7b\\x85\\x4c\\xb6\\x50\\xa4\\x2d\\x41\\x92\\x2d\\xaf\\x5d\\xff\\xff\\x2a\\x4d\\x3d\\xea\\xa7\\x25\\xb7\\xc9\\x10\\x05\\x0d\\x3f\\x5f\\x35\\xb3\\xdd\\xf2\\xda\\xb7\\xce\\x6b\\xda\\x13\\x8b\\xd5\\x94\\xa3\\xb0\\x8d\\xb1\\x9a\\x38\\xa4\\x5b\\x75\\xf1\\x64\\x9f\\xcd\\xad\\xa0\\x3a\\x34\\xab\\xf4\\x23\\xe8\\x01\\xa4\\xe7\\xd8\\xa2\\x5f\\x98\\xef\\xeb\\x45\\xc8\\x42\\xf8\\x72\\xdb\\x71\\x04\\xea\\x86\\xd3\\x43\\x3b\\x68\\x4b\\x87\\xb2\\xcf\\x53\\x8b\\x79\\xc8\\x0c\\xa5\\x65\\xcc\\x28\\xdf\\xeb\\x1b\\xce\\xcb\\x5a\\xd8\\xe4\\x66\\x4a\\x84\\xb5\\x71\\x2b\\xe6\\xc6\\xb8\\x2f\\xaa\\x49\\x5b\\x97\\xe1\\x37\\x75\\x68\\x1e\\x8e\\x3b\\x8b\\x92\\x79\\xdc\\x14\\xc9\\x2c\\xbc\\x68\\x84\\x3a\\xdb\\xe7\\x9d\\x2d\\x27\\xf9\\x15\\x42\\xa2\\xcc\\x31\\xb2\\x6b\\xa6\\xe1\\x31\\xf0\\x27\\xba\\x3e\\x62\\x1d\\x00\\xda\\xa2\\xcb\\x52\\xac\\x34\\xd1\\x18\\x26\\x48\\xbf\\x69\\xa2\\xe0\\xb4\\x20\\x2e\\x47\\xcf\\xee\\x9b\\x96\\xa0\\x57\\x7c\\x05\\xfd\\x18\\xc6\\x89\\x66\\x0a\\x04\\x64\\x9c\\x00\\xf4\\x88\\xd6\\xc6\\x89\\x82\\xf8\\x5b\\xa8\\xb9\\xed\\x54\\x0e\\xd4\\x4a\\x76\\xa2\\x9b\\x50\\x3d\\xd0\\xf5\\xab\\x1f\\xe8\\x46\\x54\\x10\\xb4\\xe6\\xce\\x08\\xdd\\x84\\x2a\\x82\\x6e\\x7a\\x8b\\x84\\x1a\\x6f\\x93\\xd0\\x17\\xdd\\x2a\\x21\\xd5\\xb2\\x6b\\x98\\x76\\x99\\x44\\x6c\\xb5\\x7f\\x2a\\xe5\\xf5\\x03\\xd7\\x16\\x0a\\xb9\\xb7\\x51\\xa8\\x7e\\x2b\\x85\\x60\\xd5\\x05\\xad\\xa1\\xbe\\xa0\\x95\\x64\\xc3\\xf5\\xa9\\x31\\xe8\\x26\\x54\\x19\\xf4\\x15\\x30\\xed\\x2d\\xcf\\x6e\\x82\\x67\\xbf\\x21\\x96\\x6d\\xd0\\x66\\xf3\\x2d\\xab\\x03\\x8a\\xf5\\x77\\x96\\xf0\\xe9\\x7f\\xe5\\x85\\xd4\\xda\\xd0\\xae\\xe2\\x7c\\xac\\xe3\\xdf\\x07\\x03\\xbd\\x16\\xd1\\xaa\\xaf\\x8e\\xbd\\x9d\\x1f\\xbe\\xa1\\x78\\xd4\\x4e\\x5b\\xbc\\xd2\\xd3\\x61\\x7d\\x44\\xea\\x65\\x8b\\x90\\xd4\\x46\\xce\\x32\\xf6\\x5b\\x8f\\x82\\xb0\\xb4\\xa3\\x52\\x2f\\x81\\xb0\\xd4\\x4b\\x28\\x36\\xf4\\xb2\\x22\\x30\\xf5\\xd2\\x8a\\x4c\\xbd\\x04\\x42\\x53\\x2f\\x81\\xd8\\xd4\\x4b\\x38\\x38\\xb5\\x13\\x82\\x15\\x62\\x38\\x58\\x19\\xda\\x6e\\x30\\x3e\\xf5\\xe1\\x37\\x14\\xa0\\xfa\\x70\\xf5\\x08\\xd5\\x87\\x4d\\x43\\x54\\x1f\\xba\\x63\\x54\\x1f\\x6e\\x30\\x48\\xf5\\x72\\xe3\\x51\\xaa\\x0f\\xd7\\x0e\\x53\\xfd\\xe0\\x6b\\x08\\x2f\\x51\\x25\\x8c\\x1a\\x44\\x94\\x59\\xb6\\x09\\x29\\x63\\xa6\\x96\\xe3\\x0f\\x0c\\x96\\x06\\xa2\\xca\\x2c\\xa1\\xb0\\x32\\x4b\\x30\\xaa\\xcb\\xb2\\x2a\\xb0\\xcc\\xd2\\x8e\\x2c\\xb3\\x84\\x42\\xcb\\x2c\\xa1\\xd8\\x32\\x4b\\x47\\x70\\x99\\x0a\\x38\\x56\\x11\\x4d\\x5f\\x34\\xbe\\xcc\\x61\\xb3\\x00\\x33\\x87\\x6b\\x44\\x98\\x39\\x6c\\x1c\\x62\\xe6\\xb0\\x22\\xc6\\x8c\\xd9\\xca\\x7a\\xb2\\xa1\\x22\\xcc\\xcc\\xaa\\xc2\\xa1\\x5d\\xa0\\x99\\x1f\\xdb\\x05\\xac\\x07\\xa2\\x7d\\x8b\\xbc\\xd0\\x46\\xb8\\x6f\\x19\\xb9\\xfb\\xa1\\x46\\x7b\\x1a\\xf1\\x3d\\xf9\\xfd\\xed\\x6f\\x4f\\x9e\\xbe\\x38\\x40\\x23\\xd4\\xdd\\xd9\\xdd\\xbb\\xff\\xc3\\x83\\x1f\\x1f\\xfe\\xf4\\xe4\\xe9\\xb3\\xe7\\x2f\\x5e\\xfe\\xfa\\xdb\\x3f\\xfe\\xdf\\xef\\xaf\\xdf\\xbc\\xfd\\xff\\xde\\xbd\\x3f\\x38\\xfc\\xe3\\xcf\\xff\\xfe\\x9f\\x7f\\x06\\x27\\xe1\\x18\\x4f\\xa6\\xb3\\xe8\\xe3\\xa7\\x79\\x92\\x2e\\xfe\\x37\\xcb\\xc9\\xf2\\xf4\\xec\\xfc\\xe2\\x3f\\x5d\\xb0\\xcd\\x0f\\xaf\\x9f\\xbc\\x45\\x23\\xf4\\xb9\\x5c\\x69\\x20\\x3d\\x40\\x96\\x1e\\x54\\x38\\x05\\xab\\x2d\\x1e\\x15\\x15\\xc2\\x59\\x90\\x3d\\x21\\xbd\\xa8\\x7f\\x8c\\x46\\x28\\x2a\\x67\\x49\\x03\\xe6\\xe9\\x93\\xf7\\x2f\\xd0\\x08\\xfd\\xf0\\xb0\\x22\\xc9\\x35\\x77\\x6a\\x41\\x01\\x4f\\x29\\x2e\\xee\\xf3\\xa7\\xf4\\x37\\x43\\x6b\\xb3\\xfc\\x65\\x5a\\xd6\\x25\\xad\\x80\\x1a\\xc7\\x0f\\xf2\\x88\\x30\\x9d\\x4f\\xc9\\x0c\\x3b\\x7b\\x2e\\x45\\x47\\x41\\xea\\xc2\\x31\\xf7\\x64\\x39\\x99\\xd8\\xf6\\x66\\xaa\\xe2\\xf3\\x37\\xf2\\x4e\\xd6\\x68\\x34\\x42\\xdb\\xfd\\x22\\x19\\x5c\\xd7\\xb6\\x83\\x47\\x1e\\xfa\\xe8\\xa1\\x71\\x34\\x8d\\x18\\x61\\x1f\\x6d\\xeb\\xee\\x2d\\x6c\\x12\\x95\\x09\\xd4\\x9a\\x77\\xfa\\x74\\xb3\\x5a\\x1f\\x79\\xad\\x8f\\xe8\\x67\\xd1\\x7c\\x51\\xeb\\x23\\xad\\xc5\\x9f\\x1d\\x7d\\x3c\\x46\\x3f\\xff\\x3c\\x42\\x0f\\x6d\\x95\\x47\\x14\\xd8\\x3e\\xa6\\x3a\\x21\\xef\\xf7\\x28\\x3a\\x86\\x55\\xa3\\x30\\xc8\\xb2\\x0b\\xda\\x5f\\x5b\\x50\\xb6\\xb6\\x3e\\xba\\x34\\xca\\x12\\xc0\\xad\\x11\\xef\\x00\\x56\\xf5\\x64\\xdf\\xbd\\xb2\\xc2\\x90\\x51\\x62\\x1f\\x5d\\x02\\x00\\xe9\\x4d\\xff\\xdf\\x11\\x2b\\xda\\x44\\x05\\x3c\\x9b\\x51\\xe6\\xef\\xb1\\xee\\xaa\\x61\\xe6\\x07\\x7c\\x1c\\xae\\xff\\xcb\\x41\\xa9\\x01\\x9d\\x7f\\xa9\\x02\\xdb\\x70\\x55\\xb2\\x02\\x13\\x8e\\xe9\\x5a\\xc6\\x62\\x62\\xc7\\x38\\x60\\x71\\xb7\\xff\\x83\\xb3\\x34\\x77\\x12\\x53\\x31\\xa1\\x9c\\x46\\xd1\\xdd\\xbb\\x36\\x7d\\xa1\\x7b\\x68\\x47\\xd0\\x98\\x3a\\xb0\\xed\\x3e\\xe8\\x1b\\x2b\\x8a\\x64\\xf8\\x14\\x67\\x39\\xee\\xf5\\x8d\\x90\\x19\\xec\\x75\\x85\\xef\\xa3\\x94\\x34\\x47\\xac\\xa0\\xce\\x05\\x57\\xfd\\xc1\\xc7\\x34\\x4a\\x7a\\xdd\\x6e\\xff\\x3b\\x00\\x05\\x6e\\x11\\xa3\\x32\\xb6\\x90\\x32\\x85\\xd4\\xa9\\x11\\x31\\x6e\\x77\\xab\\x5c\\xba\\x5b\\xd9\\xd2\\xc7\\xb8\\xf0\\xc6\\x84\\x0b\\xd4\\x21\\x20\\x59\\x84\\x5d\\x84\\x37\\x0e\\xc6\\x04\\x16\\xc3\\xb8\\xbc\\x14\\x03\\x82\\x85\\xcc\\xd1\\xb1\\x4b\\xc8\\x88\\x0c\\x77\\xb5\\x32\\x46\\x6b\\xdd\\x29\\x63\\x18\\xdb\\xa3\\x91\\x28\\x4d\\x25\\x83\\x59\\x82\\x01\\xdd\\x0b\\x51\\x94\\x68\\x6b\\x4a\\xbf\\x2f\\x82\\xf5\\xd0\\x8d\\xcc\\x8b\\x2c\\x4b\\xb3\\x5e\\xf7\\x4d\\x9a\\xdc\\x13\\x93\\x45\\x17\\x9a\\x20\\x24\\x38\\xeb\\x02\\x4c\\x63\\x4a\\x13\\x6e\\x50\\xd1\\xe4\\x1a\\x7b\\x44\\x59\\xfb\\x7b\\x07\\x6b\\xf3\\x02\\x5c\\xac\\x69\\x6b\\x5d\\xb8\\xb6\\x70\\xd3\\xc1\\xa9\\x90\\x6d\\x05\\x90\\xcd\\x44\\x5b\\x51\\xfc\\x97\\x5f\\xd0\\xc3\\xea\\x06\\xef\\x8e\\xd0\\xf6\\xf9\\x64\\xb2\\x29\\x81\\xc6\\x47\\xa4\\xc8\\xb3\\xbb\\xac\\xf9\\x4a\\x79\\xf6\\xcb\\x2f\\x23\\x00\\xca\\x4d\\x0b\\xb0\\x82\\xee\\x78\\xa2\\xe5\\x9d\\xae\\x14\\x61\\x3a\\x73\\x94\\x22\\x4c\\x19\\x8a\\x43\\x82\\xf1\\x12\\x85\\x00\\x83\\x44\\x4d\\x4d\\x12\\x47\\xce\\xc4\\xbe\\xf8\\xaf\\xe7\\x9d\\xe3\\x5b\\x07\\x5f\\xfc\\xf7\\xac\\x8d\\xee\\x95\\xf7\\x99\\xee\\x4f\\x1f\\xb6\\xd9\\x9f\\x76\\x97\\x39\\x66\\x03\\x0e\\x49\\xf7\\xd1\\x77\\xdf\\x0d\\x87\\x68\\x9a\\x22\\x9c\\x9c\\xa2\\x71\\x8a\\x59\\xc8\\x24\\x96\\x3c\\x27\\x48\\xc6\\x28\\xc1\\x78\\x8c\\xfe\\xfb\\xf5\\xef\\xbf\\x11\\xb2\\x78\\x87\\xff\\x77\\x89\\x95\\xf8\\xc7\\xec\\x68\\xe2\\x62\\x81\\xd3\\x89\\x51\\x82\\xa3\\xb6\\x88\\xa0\\xdf\\x35\\xa9\\x44\\x00\\x34\\x30\\x6b\\xa1\\xcf\\x57\\xca\\x46\\x1e\\x01\\x67\\xdc\\xce\\x9a\\xfa\\x03\\x66\\x8c\\xff\\x98\\xcf\\xa2\\x84\\xa0\\x68\\x9a\\xa4\\x19\\xf6\\x63\\x35\\xbf\\xc3\\xd5\\x77\\x1a\\xee\\x7e\\xba\\x4d\\x46\\x75\\x9b\\x8c\\xea\\xef\\x95\\x8c\\x4a\\xe8\\xa4\\x22\\xca\\x20\\x98\\x82\\x4a\\x37\\x0c\\xa1\\xcd\\x66\\xa4\\x32\\xf6\\x5e\\x87\\x24\\x8a\\xdd\\x8e\\xec\\x8c\\x15\\xb9\\xfd\\xb4\\x71\\x6b\\x11\\xb9\\x28\\x36\\x49\\xce\\x96\\xc3\\x38\\xc8\\x73\\x74\\xc4\\x5a\\x3e\\x16\\xc8\\xd0\\x0b\\x94\\xa6\\x0f\\xbd\\xe7\\xef\\x86\\x2c\\x50\\x00\\x93\\x15\\xc2\\x39\\x9f\\xca\\x3a\\xf4\\xfe\\xc5\\xbb\\xfd\\x0f\\x4f\\x5f\\xfd\\xfa\\xe6\\xf0\\xf5\\xd3\\x17\\xef\\x3e\\xbc\\xdb\\x3f\\x7c\\xf3\\xfc\\xd5\\x9b\\x5f\\x3f\\xbc\\xde\\x7f\\xfe\\xc2\\xff\\x5f\\x5d\\xeb\\x95\\x76\\x60\\xd5\\xfc\\xa7\\xa6\\xf3\\xb4\\x63\\xcc\\xd2\\xc6\\x0f\\xdf\\xbc\\x3a\\x78\\x4f\\xb7\\x63\\x9a\\x60\\xec\\x92\\xa0\\xab\\xaf\\x1b\\xdd\\x4f\\xf6\\xa3\\xd7\\xf6\\xa3\\x5f\\xed\\x47\\xf9\\x7f\\x82\\x93\\xd4\\x7c\\x38\\x89\\x92\\x04\\x5f\\x58\\x4f\\xf1\\x9c\\xa4\\x39\\xce\\xac\\xe2\\x8b\\x28\\x04\\x9f\\x27\\x41\\x02\\x3e\\x9f\\x47\\x61\\xe6\\x78\\x11\\xc7\\x91\\xab\\x25\\xb0\\x15\\xb0\\x05\\x6b\\x8c\\x40\\x8b\\xd3\\x2c\\x48\\xc6\\x16\\xca\\xa0\\x92\\xbf\\x42\\x0f\\x0f\\xa0\\x87\\x6f\\xa1\\x87\\x2f\\xa0\\x87\\xff\\x84\\x1e\\xfe\\x0f\\xf4\\xf0\\x0d\\xf4\\xf0\\x39\\xf4\\xf0\\x0f\\xe8\\xe1\\x21\\x7b\\x58\\x3c\\x3b\\x6e\\x9e\\x6b\\x9a\\xd1\\xdf\\xdb\\x27\\xcf\\x29\\x45\\xfb\\x68\\x6f\\xd7\\xb3\\xdf\\xbe\\x7f\\xf5\\xeb\\x9b\\x27\\x07\\x87\\xef\\x5e\\x7c\\xf8\\xfd\\xc5\\x9b\\x5f\\x0f\\x7e\\xf3\\xd1\\x7d\\xa0\\x14\\xa3\\x61\\x5f\\xf9\\x0e\\x94\\x71\\x31\\x11\\xfa\\x8c\\x8c\\x07\\x05\\x23\\x0d\\xd8\\x8b\\x0f\\xcf\\xf7\\xff\\x7c\\x83\\xae\\x80\\x26\\xdf\\xee\\xff\\xfe\\x3b\\xad\\x76\\xf0\\xea\\xf5\\x8b\\xfd\\xc3\\x03\\x1f\\xed\\x6c\\x6f\\x6f\\x0f\\x8d\\x61\\x88\\x78\\x35\\x4f\\xe3\\x34\\xfc\\xe4\\xa3\\x2e\\x5d\\xd5\\x72\\xd2\\x05\\xcb\\x3c\\x63\\xf1\\x0d\\xc3\\x0b\\x1f\\xa4\\x27\\x51\\xe8\\x49\\x18\\xa6\\xcb\\x84\\xf8\\x65\\x46\\x21\\x6d\\x0b\\x27\\xf7\\x21\\x75\\x79\\x7d\\x77\\x5b\\xe5\\xf5\\xbd\\xdd\\xa4\\xdc\\x6e\\x52\\xbe\\xfd\\x4d\\x8a\\xb6\\x14\\x33\\x32\\xce\\x67\\xc1\\xde\\x4d\\x25\\xcc\\x7c\\x96\\x5d\\x2c\\x48\\xfa\\x8f\\xf7\\xea\\xf2\\x1c\\xb2\\x67\\xf7\\x3e\\x5a\\xc7\\x79\\x14\\x30\\xb0\\xe0\\x90\\xbe\\xd1\\x56\\x72\\x4b\\xc8\\xda\\x59\\x2d\\x19\\xc1\\x5a\\x81\\xc1\\xa8\\xbe\\x25\\x5e\\x51\\xa5\\x55\\x7c\\x1d\\xc8\\xf4\\x9a\\x5c\\xeb\\x9a\\xe1\\x73\\x4b\\xdf\\x92\\x95\\xd5\\x90\\x35\\xe8\\x17\\xb4\\x4b\\x5b\\xe1\\xcf\\xca\\xd8\\x61\\xbb\\x7d\\xde\\xce\\x36\\xdc\\x0c\\x92\\xd7\\x54\\x8b\\x08\\x38\\xd2\\xef\\x04\\x74\\x88\\x71\\x55\\x95\\xb8\\xa5\\xc0\\x0f\\x7e\\xc3\\xe7\\x03\\xe6\\x2d\\xda\\xe2\\x46\\x3d\\xc5\\xaa\\x44\\x97\\x0d\\x65\\x19\\x1f\\x98\\xcc\\x7c\\xb4\\xfb\\xc3\\x03\\xbd\\x45\\xe5\\xc8\\xdd\\x4c\\x45\\x82\\x84\\x34\\x2e\\xe6\\xaf\\xe3\\x3f\\xd8\\xf6\\x3a\\xfa\\x74\\x76\\xfc\\x87\\x3b\\x54\\x24\\xdf\\x26\\x31\\xbe\\x15\\xc9\\x7f\\x7b\\x91\\xcc\\xdd\\x5a\\x6e\\x40\\x26\\x7f\\x8d\\x2a\\xa3\\xd9\\x41\\x95\\xc6\\x28\\x7f\\x34\\xd6\\xfd\\xd4\\x0a\\xe6\\xfa\\x32\\x18\\x8a\\xa5\\xd0\\x76\\x73\\x9b\\x3c\\x54\\x0b\\xd2\\xdf\\x66\\x19\\x61\\x32\\xd7\\x9a\\xe3\\xcf\\xb8\\x17\\x9c\\xde\\x60\\x12\\x91\\xd7\\xc1\\xc2\\x52\\x06\\xba\\x49\\xca\\xd2\\xb8\\x76\\x7d\\xf1\\x7b\\xdb\\x54\\x34\\x48\\x20\\xdf\\xf1\\xdf\\x3b\\x90\\x86\\xea\\xab\\x05\\xb6\\xb7\\xad\\x46\\xfe\\x5f\\x83\\x32\\x27\\xc1\\xc9\\x49\\x30\\xc5\\x05\\x24\\x50\\x19\\xa6\\xa9\\x96\\x00\\x83\\x65\\xe6\\x40\\x5f\\x40\\xb1\\xd7\\xcd\\x8a\\xc5\\xe9\\x29\\x8e\\x83\\x50\\x82\\xe5\\x2a\\x46\\x35\\x65\\x05\\x91\\xae\\x62\\x53\\xb8\\x53\\xa0\\xe4\\xaf\\x8d\\x4b\\xe6\\xb3\\x20\\x49\\xd2\\x44\\xc3\\x1b\\x5c\\xb2\\x50\\xdb\\xfd\\x26\\x25\\x95\\xee\\xab\\x7a\\x67\\x66\\x06\\x1f\\x28\\x09\\x4d\\x4d\\x61\\x1f\\xf0\\x1b\\x16\\x6e\\xda\\xb2\\x30\\x6c\\xf8\\x60\\x61\\xb0\\x71\\x69\\x90\\x00\\x20\\x71\\x95\\x77\\x01\\x03\\xa1\\x05\\x67\\x0e\\x04\\x3a\\xab\\x50\\xe5\\xb6\\x65\\x95\\x4f\\x7a\\x37\\x50\\x15\\x88\\x08\\x57\\xaa\\x35\\x6f\\x54\\x6b\\xe5\\xee\\xac\\xba\\x8d\\xa2\\x9c\\x95\\xe9\\x20\\x17\\xc1\\x58\\x39\\xea\\xc5\\xe7\\x0b\\x1c\\xd2\\xbd\\x86\\x15\\xe0\\x5a\\x5f\\x60\\xf8\\x69\\xaf\\xc8\\x6c\\xab\\xbd\\x32\\x22\\x62\\x94\\x4d\\x9f\\x60\\x5a\\x7e\\xac\\x18\\x00\\x80\\x58\\x1b\\xc5\\x39\\x66\\x2e\\x1d\\xf9\\x98\\x63\\xbc\\x68\\x45\\xd9\\x16\\x54\\xf6\\x19\\x4d\\x13\\x4f\\x09\\xbe\\xab\\x9e\\x41\\x82\\x49\\x52\\xa3\\xe9\\x8c\\xa0\\x20\\x8e\\xa6\\x09\\x1e\\x57\\x39\\xb4\\xf0\\x3b\\x7f\\x6c\\xcc\\x9a\\xe2\\xc2\\xab\\x78\\x0c\\xfa\\xdc\\x63\\xfd\\x57\\xa4\\xb3\\xe6\\x57\\x58\\x58\\x59\\x74\\xcf\\x38\\x78\\xdb\\x42\\x3b\\xe2\\xd4\\x9e\\x36\\x82\\x1e\\xb3\\xb6\\x90\\x8f\\x3a\\xdb\\x9d\\x3e\\xda\\x12\\x85\\x5b\\xc6\\x4f\\xdd\\xd8\\x5c\\xbf\\xa3\\x78\\xfa\\xbb\\x4d\\x36\\x1b\\xf4\\x8a\\xb3\\x2d\\x46\\xb2\\x85\\x7a\\xeb\\xcc\\x7b\\xdb\\x78\\xb9\\x7a\\x7a\\x61\\xb6\\x23\\x62\\xe1\\x72\\x22\\xd2\\xcd\\xd1\\x0c\\x9f\\x1b\\x59\\xb2\\x6b\\xe6\\x9d\\xa4\\x87\\x64\\x02\\x7a\\x8b\\x19\\xb3\\x1e\\x25\\xb4\\xf1\\x6a\\xe4\\x07\\x79\\x18\\x45\\xb2\\x82\\x9d\\xac\\x9b\\x02\\xe7\\x0e\\x87\\xc3\\x73\\xb7\\x1e\\xf2\\x1d\\x5e\\x39\\x1d\\x33\\x1e\\x1c\\x6c\\x38\\x44\\x2f\\xa3\\x64\\x8c\\x78\\x5e\\x0b\\x63\\x64\\x72\\x1b\\x49\\xe8\\x8e\\xb3\\xd3\\xb1\\x33\\xbc\\xb2\\xe3\\x71\\x0f\\xc5\\x68\\x44\\x81\\x90\\xce\\x08\\x96\\xfd\\x81\\xbe\\xe3\\x1a\\x3f\\xd5\\x9e\\xeb\\xed\\x05\\xb4\\xd9\\xdd\\xaa\\xd0\\x50\\xec\\x6c\\x5e\\xdc\\x36\\x12\\x17\\x89\\x76\\x9d\\x7e\\x23\\x3c\\xea\\x4f\\x71\\xb3\\xb4\\x04\\xa6\\x17\\x51\\x48\\x3c\\xb4\\xf3\\x00\\x30\\x43\\x50\\xb8\\x79\\x55\\xe6\\xf1\\x02\\xda\\x34\\x4e\\x32\\x1c\\x7c\\xb2\\xab\\x52\\x7c\\x6d\\x8d\\x90\\x48\\x0d\\x47\\x89\\xe8\\xd9\\x2c\\xc8\\x9e\\xa5\\x63\\xcc\\x5a\\x6c\\x64\\xaa\\xa0\\xf4\\x37\\x28\\xdd\\x74\\xd6\\x23\\x66\\x4e\\x3f\\x6b\\x51\\xf3\\x13\\xda\\xc4\\xd7\\x43\\xce\\x0c\\x9c\\x5b\\x7a\\x6e\\x41\\xcf\\x9b\\x20\\xca\\x9c\\xb4\\xcd\\x25\\xa7\\xd3\\xa1\\x4d\\x77\\x2c\\x53\\xd4\\x24\\x3a\\xe7\\x31\\x62\\xb7\\xcf\\xfb\\x94\\x00\\x98\\xec\\x6d\\xe4\\x9a\\x4b\\x87\\xd1\\x4c\\xce\\x42\\x25\\x9e\\xa6\\x69\\x8c\\x83\\xe4\\x0a\\x05\\x71\\x9c\\x9e\\xfd\\x13\\x67\\x29\\x05\\x54\\x44\\xc2\\xe3\\x78\\x5e\\xa4\\x51\\x42\\x98\\x73\\x10\\x7d\\xb5\\xbd\\x8d\\xa2\\x24\\x27\\x38\\x18\\x53\\x30\\x71\\x32\\x2e\\x23\\xbd\\x57\\x53\\x3c\\x30\\xf0\\x74\\x82\\x98\\xaf\\x7f\\xdd\\x5a\\x2a\\x87\\x68\\xae\\xa5\\x5e\\x09\\xb5\\x49\\x29\\x9c\\xbe\\x99\\x04\\x11\\x2e\\xc4\\xba\\x04\\x91\\x4d\\x53\\xa8\\x6c\\x3e\\x80\\x5c\\xb9\\x73\\x52\\xeb\\x06\\xac\\x90\\x26\\x2d\\x1d\\x0a\\xe2\\x62\\x6e\\xdc\\xb5\\xd2\\xd5\\x61\\x33\\x66\\xa1\\xfc\\x5c\\xa3\\x54\\x3f\\x74\\x24\\x5b\\x94\\xff\\xb6\\xbb\\x8e\\xbb\\x97\\x90\\x5f\\x90\\xfa\\x71\\x88\\x72\\x04\\x1a\\xa4\\x2b\\x5b\\x63\\x37\\x82\\x59\\x2e\\xc6\\x31\\x56\\x6e\\x69\\x41\\x3c\\xa9\\x80\\x9e\\xc8\\x2d\\xcd\\xcf\\x68\\x17\\x3d\\x46\\xdd\\xed\\x2e\\xda\\x42\\x74\\x2b\\x93\\xd4\\x46\\x12\\x04\\x59\\xb5\\xb3\\x7d\\xde\\x41\\x5b\\xb4\\xf5\\x9b\\xe0\\x58\\x55\\xa2\\x37\\x60\\xd9\\x86\\x8b\\x49\\xd5\\x26\\x98\\xdb\\x82\\x83\\x98\\xed\\x97\\xaf\\x9b\\xff\\xec\\xd5\\x86\\x32\\x14\\x10\\xe1\\xe3\\x0b\\x72\\x54\\x0b\\xb2\\x6b\\x49\\x72\\x1b\\x26\\x30\\x19\\x98\\x32\\xcc\\x70\\x40\\x30\\x9a\\x2c\\xe3\\xb8\\x40\\xec\\x10\\x9f\\xe2\\x84\\xf0\\x78\\x90\\x6c\\xbb\\xf2\\x31\\x4f\\x13\\x14\\x9c\\x44\\x75\\xfb\\x93\\x2c\\x48\\xf2\\x49\\x9a\\xcd\\x0f\\xd2\\x97\\xcb\\x38\\x76\\xe5\\x0a\\x92\\x31\\x24\\x69\\xab\\xf7\\xf4\\x56\\xed\\xcb\\x1a\\x1c\\x30\\x0b\\x2e\\xf7\\xa6\\xc4\\x86\\x41\\x23\\x19\\xda\\x29\\x74\\x38\\x47\\x9f\\x0f\\xd8\\xbd\\xa5\\x28\\x19\\xe3\\xf3\\xfd\\x49\\xaf\\xdb\\xeb\\xf6\\xd1\\x9d\\xd1\\x08\\xdd\\xdb\\xa9\\xf0\\x61\\x2f\\xea\\xd5\\x86\\x3f\\x22\\x17\\x0b\\x2c\\xc0\\x61\\x95\\x18\\xdd\\xe7\\x86\\xcb\\x7c\\x54\\xd1\\x55\\x34\\x20\\xec\\x82\\xb7\\xd6\\x8f\\x50\\xbc\\xe0\\x04\\x6d\\x05\\x70\\x68\\x0b\\x75\\x7b\\x94\\xb0\\x0a\\x20\\xb6\\x50\\xb7\\xdf\\x5d\\x4b\\x28\\x8d\\xa3\\x7c\\x11\\x07\\x17\\x9c\\x4c\\xd2\\x09\\x5d\\xb1\\x09\\xd5\\x88\\x0b\\x64\\xd7\\x50\\x0b\\x3e\\x67\\xc5\\x9f\\xf3\\x66\\x9a\\x24\\x96\\xa2\\xbd\\xe8\\x34\\x5a\\x2d\\x6f\\x34\\x08\\x29\\xfb\\x1b\\x04\\x8e\\xa7\\x03\\x34\\x5f\\xc6\\x24\\x5a\\xc4\\x17\\x3d\\x71\\x31\\xba\\x8f\\xee\\xfd\\x52\\x3c\\x74\\x52\\x99\\x0d\\x7b\\xa3\\x84\\x68\\x39\\x79\\x9a\\x05\\xe1\\x27\\x16\\xc3\\xc7\\xa2\\x35\\x7b\\x67\\x80\\x93\\xb1\\xab\\x7c\\xdf\\x2c\\x2f\\xc3\\x86\\x94\\x5d\\x70\\xd2\\x45\\x77\\xef\\xaa\\xed\\x48\\x7a\\x7e\\x6c\\xe6\\x9d\\x2a\\xea\\xf5\\xa9\\xe8\\x69\\x9f\\x22\\x57\\xa7\\x8d\\x22\\x8a\\xec\\x1a\\x84\\x71\\x20\\x48\\x75\\xd3\\x54\\x51\\xc2\\xd6\\x86\\x24\\xc4\\xf7\\x3a\\x8a\\x38\\x28\\x99\\xfc\\xdb\\x25\\x87\\xb2\\xd2\\x16\\xda\\xf1\\xd4\\xf2\\xf7\\x14\\x98\\xef\\xa1\\x9d\\xfe\\x20\\xc3\\x8b\\x38\\x08\\x71\\xaf\\x8b\\xba\\x1e\\xea\\x76\\x29\\xf1\\xa8\\xeb\\x6e\\x05\\xe9\\x88\\x2b\\x3b\\xb9\\xf0\\x2b\\x20\\x29\\x57\\x8a\\xc7\\x38\\x8c\\xe6\\x41\\x6c\\xee\\x13\\xa2\\xa4\\xd9\\xbe\\x86\\xa4\\xcf\\x79\\x03\\x6e\\xaa\\xb9\\xe4\\x9b\\x97\\xcb\\xe2\\x1c\\xef\\xaa\\x6a\\x01\\xaa\\xd0\\x7e\\x45\\x4f\\xb6\\x17\\x88\\x2b\\xc5\\x3c\\x14\\x3e\\x40\\xfc\\x6e\\x66\\x59\\x70\\xe0\\xac\\xb5\\x21\\x81\\x2e\\xea\\x37\\x85\\x27\\xa5\\xaf\\x7a\\x4c\\xb1\\xed\\x93\\x3c\\x5c\\xb5\\xf1\\x65\\xf3\\x44\\x11\\x7b\\x46\\x9c\\xbe\\xea\\x5b\\x2e\\x68\\x16\\x44\\xc1\\x18\\xe7\\xf9\\xc1\\x2c\\x48\\x7a\\xdb\\x94\\xfa\\xbb\\xf7\\x78\\xa0\\x33\\x11\\xc1\\x46\\xf0\\xc1\\x0e\\x25\\xe7\\xae\\xfa\\xa6\\xd1\\x2c\\x3d\\x59\\x96\\xfa\\x6b\\xce\\xdc\\x24\\x78\\x22\\x70\\x3e\\x69\\x51\\xe2\\x9e\\xb6\\x81\\x63\\xde\\x9e\\x24\\x63\\xee\\xf5\\xc0\\x79\\x20\\x9a\\x5c\\xe4\\x28\\x65\\xbb\\xa8\\x1c\\x9d\\xe0\\x49\\x9a\\x61\\x57\\xcd\\x92\\x2f\\x7e\\x33\\xec\\x41\\xd5\\x73\\x7d\\x29\\x36\\x69\\x2b\\xb2\\xc6\\x6f\\x6c\\x07\\xae\\x4d\\xb6\\x95\\xac\\xed\\x7b\\x71\\xc9\\x63\\x1e\\x9c\\x87\\xe9\\x7c\\x11\\xe3\\xf3\\x88\\x5c\\xf8\\xe8\\xa1\\x76\\xd4\\x8f\\x8a\\x34\\x0a\\xc2\\x4c\\xc0\\x9a\\xb2\\xed\\x80\\x32\\x2d\\x5f\\x49\\x6c\\xbd\\x2d\\x5a\\x12\\x88\\x27\\x19\\xe5\\x1a\\x59\\x35\\x6b\\xcc\\xd1\\x96\\xb8\\x42\\x73\\x4a\\x69\\x7b\\x34\\x42\\x5d\\x3e\\x29\\xdd\\xca\\x26\\x0f\\xc9\\xe4\\x61\\xef\\x1f\\xef\\xf7\\xdf\\x0c\\x8a\\xd9\\xe4\\x70\\x3c\\xb2\\x2e\\x48\\x45\\x13\\x14\\x51\\x12\\x42\\x09\\x9e\\x06\\x24\\x3a\\xc5\\x82\\x7a\\x3d\\xb4\\x08\\xf2\\x1c\\x45\\x84\\x5d\\xab\\x5b\\x4e\\x67\\x30\\x47\\x17\\x03\\x16\\x3c\\xc1\\x7a\\x71\\xfb\\x97\\x95\\xcb\\xc9\\x3d\\x66\\x41\\xab\\x30\\xb9\\x3a\\x31\\x64\\x16\\x2c\\xe2\\xa0\\x69\\xed\\x37\\x6c\\xfe\\xd4\\x0c\\xb3\\xa0\\xb5\\x78\\x27\\xca\\x5f\\x46\\x49\\x44\\xb0\\x63\\x16\\x21\\xb4\\x9f\\x06\\xb1\\x07\\xa4\\x7d\\x85\\xe4\\x84\\x7b\\x6c\\xf5\\x02\\x1a\\xb8\\xea\\x4e\\x99\\xbd\\x72\\x05\\x7b\\x93\\x12\\xec\\xa3\\x57\\x94\\x11\\xe6\\xc5\\xb2\\xc7\\xb4\\xaf\\xc2\\x81\\xad\\x86\\xc7\\xc5\\x0d\\x79\\x07\\xa3\\xb7\\xba\\x1e\\x0f\\x42\\xab\\x33\\x79\\xd9\\x9b\\x1d\\x84\\xd3\\x24\\xb2\\x42\\xf5\\xe6\\x9a\\xf9\\xd1\\xb1\\xa7\\x2a\\xe1\\xfa\\x15\\x4a\\x87\\x1a\\x3e\\xfc\\xde\\xb8\\x14\\xc6\\x22\\x44\\xaa\\x40\\xc9\\xcf\\x0c\\x9f\\xf3\\x2b\\x7f\\x1c\\x96\\xa3\\xe8\\x18\\xfd\\xf2\\xcb\\x2f\\xe8\\x7e\\x5f\\x5b\\x1c\\x60\\x85\\xdc\\xac\\x78\\x17\\x6d\\x9f\\xbf\\xac\\xad\\x68\\xc1\\x86\\x93\\xb1\\x09\\x19\\x98\\x5b\\x58\\xac\\x2d\\xb4\\x63\\xa6\\xc5\\x75\\x3a\\xeb\\x92\\xd9\\xd7\\x1c\\x51\\x41\\xa1\\x9a\\xa7\\xd2\\x8b\\xa9\\x86\\x70\\xe4\\x2d\\x4d\\x1e\\x7e\\x43\\x46\\x62\\x60\\x25\\xdb\\x22\\x6a\\x8d\\x7b\\xe1\\xbc\\xee\\x41\\xfa\\xb4\\x2e\\x83\\x46\\x15\\x1e\\xac\\x9b\\xe2\\x26\\x5a\\x0d\\x44\\xa9\\x7d\\xea\\x88\\xca\\x7f\\x78\\x58\\x8d\\x27\\x19\\x6f\\x8f\\x16\\x54\\xd0\\xe4\\xc6\\xd2\\x0c\\x87\\x9f\\xa8\\x4c\\x95\\xa7\\x47\\x39\\xfa\\xed\\xc5\\x7f\\x7b\\xd2\\xc5\\x8c\\x2e\\x40\\xdb\\xe7\\x74\\x0b\\x3e\\xc9\\x52\\x4d\\xbb\\x82\\x90\\xc5\\x12\\x1e\\xbd\\x67\\xf7\\x53\\xab\\x50\\x45\\x25\\x01\\x3f\\x6a\\x0f\\x69\\xef\\xc6\\x59\\x7b\\xa1\\xb4\\xc9\\xc3\\x01\\x27\\x9e\\x94\\xee\\xa0\\x83\\x28\\x00\\x49\\xe5\\x7a\\xc8\\xca\\x5c\\x5e\\xa2\\x28\\x17\\xdb\\x01\\xfa\\xa0\\x4f\\x55\\xa4\\xe1\\xbf\\x7b\\xf7\\xb6\\xcf\\x2f\\xb7\\xcf\\xfb\\x8f\\x8f\\xb6\\xef\\xfd\\x14\\xdc\\x9b\\x1c\\x7f\\xff\\x7f\\x86\\xd1\\x80\\xe0\\x9c\\x1d\\xf5\\xb4\\xa5\\xbe\\x52\\x9e\\x36\\x24\\xbd\\xf5\\x57\\x83\\x19\\x3e\\xaf\\xa0\\xd8\\xbc\\x9c\\x86\\x2a\\x1a\\x6d\\x10\\xcd\\x40\\x88\\x75\\x88\\x52\\x81\\x39\\xe0\\x0b\\x00\\x15\\x78\\x15\\x3b\\xf5\\xb2\\x90\\x54\\x2f\\x87\\xff\\xde\\x3e\\x1f\\x46\\x4c\\xc3\\x34\\xca\\x16\\x4b\\x4b\\x11\\xea\\xe0\\xd8\\x63\\x41\\x0a\\xb6\\x1f\\xa1\\x10\\xfd\\xac\\x1e\\x20\\xa2\\x90\\x9f\\xe8\\x59\\xf2\\x5b\\xb9\\x26\\x0e\\x9d\\xe7\\x85\\xc5\\x79\\x1e\\xac\\x64\\xb3\\xea\\x80\\x2f\\x3a\\x40\\x11\\xef\\x04\\x5d\\x73\\x55\\x20\\x9d\\x30\\x0f\\x4d\\xca\\x59\\x07\\x41\\xcd\\x74\\x4e\\x31\\xf9\\x83\\x56\\xda\\x9f\\x1c\\x26\\x51\\x25\\x67\\xb1\\x26\\xe9\\xc4\\xf1\\x2f\\xe5\\x51\\x1a\\x49\\xbd\\xc2\\xcf\\x84\\x79\\x2d\\x3a\\x58\\xae\\xd0\\xf7\\x4a\\x30\\x8b\\xe6\\x7a\\x51\\x82\\xfe\\xc4\\x51\\x5f\\xab\\xca\\x62\\x3b\\xe4\\x08\\x67\\x59\\x9a\\xb1\\x7c\\xe2\\xb2\\x74\\x94\\xa3\\x24\\x25\\x28\\x4c\\xb3\\x0c\\x87\\xc4\\x3f\\x73\\x12\\x90\\x3e\\x3a\\x8d\\x88\\x68\\x43\\x26\\x15\\x2d\\x79\\x21\\xf6\\xef\\x31\\xfb\\x37\\x20\\xe9\\xef\\xe9\\x19\\xce\\x9e\\x05\\x39\\xee\\x31\\xb5\\x8d\\xf9\\x9f\\xd9\\x0a\\x23\\x2d\\xfc\\x87\\xb8\\xc9\\x20\\xdc\\x63\\x8f\\xe8\\xff\\x63\\xfb\\x7c\\x59\\x29\\x3a\\x1a\\x95\\x57\\xc0\\xa0\\xdd\\x89\\x15\\xdd\\x82\\x5d\\x15\\x60\\xf0\\xb1\\x6b\\xf9\\xff\\xea\\x12\\x84\\xcf\\xa3\\x9c\\xe4\\x1e\\x5a\\xc4\\x38\\xc8\\x99\\x01\\x9e\\x21\\x2a\\x4d\\x0a\\x0c\\x4f\\xd2\\x38\\x4e\\xcf\\xa8\\x90\\xa0\\x35\\x73\\xba\\x35\\x30\\xf4\\x04\\x01\\xb1\\xc7\\x32\\x78\\x7b\\x76\\x18\\x76\\x70\\x97\\x41\\xc1\\x2a\\x55\\x9e\\x62\\x54\\x1e\\xd2\\x62\\x16\\x56\\xc8\\xb1\\x83\\xe0\\x13\\x5b\\x04\\x84\\x66\\x9e\\x4e\\xd0\\x41\\xc0\\x22\\x0c\\x14\\x4a\\x2e\\x27\\x34\\xaa\\xea\\xb2\\x24\\xec\\x2c\\xcd\\x28\\x9f\\x17\\x98\\xac\\x5d\\x46\\x09\\x8d\\x0d\\x8c\\xd3\\xa6\\xcb\\xc2\\xe8\\xc7\\xc1\\x08\\x83\\x84\\x2e\\x1f\\x41\\xa1\\x13\\x89\\xe7\\x42\\xce\\xa6\\x19\\x0a\\xe8\\x32\\xc6\\x0e\\xc6\\xa4\\x59\\xe9\\xda\\xf8\\xa6\\x50\\xa4\\xe5\\xe1\\xc6\\x9f\\x33\\x9c\\x08\\xbd\\x3f\\x50\\x5c\\xc6\\xb9\\x82\\x48\\xf1\\x25\\xf9\\x8d\\xce\\x7f\\x90\\xa3\\x33\\x4c\\x27\\xb4\\x4c\\x61\\x2f\\x87\\x55\\x69\\x57\\x39\\x08\\x74\\x3b\\xa3\\x40\\x04\\xc4\\x32\\xdc\\x58\\x42\\xbb\\x94\\xd4\\xaf\\x9a\\x57\\x78\\xcd\\xfe\\x60\\x1c\\x9d\\x46\\x63\\x3c\\x7e\\x7a\\xd1\\xd3\\x39\\x92\\x73\\xa1\\xc3\\xa2\\xa2\\x2a\\xd4\\xa2\\x21\\xf4\\x58\\xeb\\xcc\\x57\\x7f\\x39\\x62\\x66\\xb6\\xa2\\xbf\\x80\\x4f\\x12\\x40\\x83\\x24\\x18\\xc0\\xf6\\x8f\\x06\\xa4\\xa5\\x98\\xba\\x6e\\x9c\\xc8\\xe8\\x74\\x7e\\x8d\\x64\\x46\\x11\\xb7\\x61\\x22\\x23\\xd1\\x1c\\xe7\\x5f\\x23\\x81\\x25\\xe2\\x2c\\x9a\\x92\\x55\\x71\\x8e\\xc8\\x08\\x8b\\x19\\xed\\x28\\x29\\xc8\\x6b\\x1e\\x35\\xb2\\x4c\\x19\\x76\\x2b\\xaa\\x2b\\xe9\\x4c\\xfa\\x69\\x52\\xe2\\x2a\\x89\\x0d\\x6e\\x55\\xd2\\x86\\xd2\\x10\\x54\\xd0\\x9c\\x58\\xf5\\x22\\x8b\\x39\\xbf\\x0d\\xad\\x75\\x3f\\x98\\x6a\\x6e\\x61\\xbc\\x15\\x5f\\x2e\\x2f\\xd1\\xb6\\xbd\\xb2\\x02\\x13\\xea\\x34\\x99\\xf1\\xf7\\xa0\\x1d\\x4f\\xcc\\xb2\\x84\\xf8\\xee\\x5d\\x09\\x3d\\x64\\x69\\xa2\\xa0\\x98\\x6f\\x55\\x3b\\x57\\xc5\\xc1\\xab\\xbe\\x80\\x8a\\x46\\x8a\\x93\\x8f\\xed\\x73\\x7e\\xf4\\x01\\x78\\x7c\\xc1\\x96\\x25\\xb0\\x39\\x95\\x66\\x5b\\xaf\\xcc\\xc9\\x58\\x50\\x2e\\x40\\xb5\\x05\\xc9\\xf2\\x62\\x13\\x24\\xf6\\x65\\xd2\\xa2\\x28\\x2e\\x62\\xb2\\xb2\\xe4\\x2c\\xed\\xe6\\x88\\xcf\\xef\\x1c\\xd7\\xaa\\x7a\\x24\\x3d\\x38\\x4b\\xf3\\x67\\x50\\xf1\\x5a\\x52\\xaf\\x21\\xe0\\x2a\\x79\\xa4\\xf5\\xd9\\x80\\x76\\x99\\x76\\xa0\\xd0\\x3a\\x24\\x93\\x58\\x00\\x7c\\xf3\\x14\\x9d\\x05\\x77\\x2c\\x02\\x14\\x28\\x27\\x06\\x8d\\x69\\xa5\\x33\\x59\\xf3\\xd3\\x61\\x54\\x35\\x58\\xc4\\xcb\\xbc\\x04\\x45\\xfc\\xb6\\xed\\x98\\x00\\x3c\\x45\\xa5\\x66\\x1a\\x2b\\xd5\\xc5\\x73\\xb9\\x87\\xe7\\xeb\\x4a\\x69\\x14\\xe0\\x51\\xa7\\xe2\\x0b\\x2a\\x09\\x45\\x18\\xf9\\x5a\\x63\\x00\\x57\\xcd\\x9f\\x58\\xa5\\xad\\x95\\x51\\x66\\xcd\\x2e\\x3b\\x16\\x96\\x94\\xc0\\xae\\x5a\\xd0\\x4b\\xbd\\x75\\x40\\xeb\\x5f\\x23\\x16\\xd1\\xa1\\x95\\x88\\x43\\x34\\xce\\xc0\\x93\\x89\\x78\\x65\\x59\\x18\\x89\\x45\\x36\\x25\\x57\\x37\\x90\\xc3\\xc9\\xf0\\xdf\\x47\\xab\\x07\\x84\\x3d\\xde\\x2a\\xac\\x11\\x3c\\x47\\x1c\\x40\\x90\\x52\\x21\\xd6\\x2c\\x49\\xbc\\x38\\xec\\x09\\xa8\\xda\\x61\\xd9\\xc9\\xf0\\x4f\\x0f\\xa8\\x4c\\x35\\x1e\\x3f\\xb8\\x5f\\x93\\xb9\\x77\\x12\\xc4\\x79\\x6d\\xe2\\x5d\\xa5\\x3c\\xc9\\xac\\x24\\xbb\\x2e\\xc7\\x3e\\x77\\x0f\\x70\\xb4\\xf5\\x56\\xd4\\xdd\\x82\\xa8\\x57\\x22\\x67\\xba\\x92\\xaf\\x47\\xcb\\x35\\x54\\x0c\\x60\\xca\\xa0\\xff\\xa2\\xf4\\x46\\xb0\\xb5\\xf8\\x94\\x7d\\xed\\x18\\x3b\\x48\\xdb\\xe3\\x0c\\x64\\xfc\\x46\\x8b\\x71\\xb9\\xf8\\x6a\\xd8\\x22\\x29\\x5d\\x64\\xa3\\x31\\xda\\xdd\\xe6\\xcc\\x74\\x4f\\x30\\x13\\x6f\\x9c\\x5f\\xf0\\xde\\x3e\\x47\\xdc\\xa3\\xb3\\x76\\xcd\\x6d\\x8e\\xca\\x0a\\x05\\xe2\\x0a\\xc9\\x88\\xd9\\x63\\xa0\\xb4\\xe5\\xe7\\xdf\\x1c\\x89\\xe5\\xce\\xcc\\xa6\\xba\\x8a\\x65\\x53\\x14\\x59\\x81\\xa9\\xa5\\x49\\x8d\\x8a\\x11\\xda\\xbb\\x54\\x7d\\xf2\\x72\\x19\\x56\\x15\\x1e\\x26\\x3b\\x6a\\xc9\\xb5\\x72\\xf7\\x5e\\x75\\x34\\xde\\x80\\x26\\xe1\\x6d\\x37\\x07\\xdb\\x41\\x92\\x72\\x4c\\x49\\x4e\\x82\\x24\\xc4\\xe9\\x44\\x51\\xf5\\x2e\\x2f\\x2d\\x9c\\x8a\\xc6\\x58\\xa0\\x11\\xf6\\x4d\\x0b\\x03\\x0f\\x3e\\xe5\\x5e\\x82\\xec\\x0c\\xbb\\x68\\xba\\xdb\\x6c\\x0f\\xea\\x9e\\x00\\xa9\\xc3\\xb4\\xc5\\xfe\\x7b\\xa7\\xdf\\xf1\\x9a\\xa8\\xe7\\x0d\\x37\\xc7\\xbb\\x38\\xde\\x17\\x23\\x62\\xd8\\xe1\\x63\\xea\\x6e\\x1e\\xed\\x1c\\xb6\\xb5\\x71\\x2e\\x47\\xd6\\x1e\\xeb\\x2f\\x6d\\xef\\xbc\\x4d\\xe1\\x5d\\x36\\xbd\\x16\\xe6\\x65\\xcd\\x66\\x5e\\xab\\x6e\\x0c\\xd1\\xb1\\x90\\xf6\\xe8\\xe1\\x28\\xb8\\x06\\xe4\\xec\\x8b\\x31\\xb6\\x14\\x06\\x74\\x83\\x96\\x2c\\xe3\\x98\\x12\\xd6\\x9d\\x1e\\x3b\\xaf\\x19\\x44\\x39\\xbf\\xa6\\x29\\xea\\x33\\x95\\x18\\xc0\\xa4\\xf0\\x52\\x59\\x13\\x8f\\x27\\x7c\\x68\\x2b\\x08\\x57\\x5e\\xf1\\x3a\\x44\\x2b\\x2f\\xb2\\x16\\x99\\x89\\x61\\xad\\x8b\\x1d\\x76\\x60\\xd6\\x1e\\x37\\x4f\\x8c\\x73\\xb6\\x4d\\x61\\x86\\xb5\\xdb\\x1c\\x2f\\x20\\x39\\xad\\x84\\x11\\x73\\xdf\\xc8\\x77\\x42\\xec\\x42\\x41\\x6a\\x72\\x14\\x8c\\x92\\x7f\\xe4\\xb0\\x4c\\xb2\\xbd\\xd0\\x5a\\x61\\x84\\x36\\x5b\\x77\\x99\\x84\\x64\\x17\\xee\\x2d\\xcb\\x9d\\x3b\\xec\\x70\\x86\\x47\\xbf\\xb2\\xaf\\x76\\x5d\\xa1\\x30\\x20\\xe1\\x0c\\xf5\\x2c\\x27\\x47\\xb4\\xbe\\x26\\x53\\x87\\xe5\\x40\\xe0\\xf9\\x3d\\xce\\xd2\\x30\\xc8\\x67\\xe8\\x24\\x4e\\xc3\\x4f\\x68\\x86\\x83\\x31\\xce\\xe8\\x8f\\x74\\x5e\\xe7\\x31\\x18\\xe5\\x4f\\x69\\xb1\\xaa\\x6d\\xe6\\x0c\\x9f\\x8b\\xd0\\xd6\\x63\\xde\\x26\\x9a\\x44\\x31\\x71\\x19\\x27\\x1b\\xb0\\x2f\\x6b\\x43\\xf3\\x75\\xa0\\x4f\\xc0\\xc8\\xf8\\xc3\\x7f\\xf7\\xd4\\xd3\\xf9\\xcf\\x3f\\xec\\xec\\x5e\\x15\\x3a\\x31\\xaf\\xd6\\x12\\xef\\xa5\\x67\\x19\\xdc\\xb6\\xda\\x34\\xba\\xbc\\x44\\x4a\\xa9\\x27\\xf7\\x5e\\x42\\xa5\\x2a\\x00\\x00\\x94\\x5e\\x88\\x0f\\x0d\\x38\\x37\\x40\\x11\\x71\\x4a\\x15\\x92\\x45\\x14\\xd6\\xcf\\xff\\x01\\x2d\\xd6\\x74\\xfe\\x89\\x55\\xb8\\x95\\x9a\\xb6\\x88\\x42\\x6d\\xe2\\x59\\x73\\x8d\\x26\\xfe\\xc1\\xfd\\x72\\xde\\x79\\xad\\x8d\\xcd\\x3b\\x6b\\x5a\\x6d\\x19\\x9a\\x76\\xab\\xd0\\xb5\\xce\\x7a\\x81\\x21\\xe1\\x48\\x25\\x8c\\xc6\\x6c\\xb5\\x71\\xc8\\x72\\xe0\\xae\\xf1\\x20\\x58\\x2c\\xe2\\x8b\\xde\\x7b\\xb1\\x3f\\xe7\\xb5\\x35\\x4f\\x21\\x6d\\x82\\x84\\x72\\x66\\x3b\\xfb\\x41\\xb6\\x2d\\x66\\x6d\\xcd\\x7f\\x78\\xf8\\x9e\\x5d\\x7f\\x2d\\xaa\\x72\\x8f\\x2f\\xc8\\xfc\\xc4\\x2b\\x58\\x86\\x2a\\xd1\\x46\\x85\\xcb\\x05\\x83\\xa7\\x77\\x52\\x65\\x95\\x93\\x4d\\x02\\xfe\\xc8\\xb6\\xf3\\xf9\\x26\\xad\\x72\\xbc\\x83\\xe6\\x66\\x39\\x5e\\xde\\x45\\x37\\xea\\x70\\x99\\xf3\\x9b\\x4e\\x43\\x70\\x8e\\x77\\xd3\\x27\\xa1\\x93\\xa4\\x44\\xf7\\x4e\\xeb\\xf4\\x1b\\xac\\x3c\\xa5\\x7f\\x8f\\xed\\xb3\\x07\\xa2\\xf1\\x64\\x54\\xba\\x03\\x41\\xe3\\xd2\\xc7\\x24\\xe8\\xe2\\x44\\xb7\\xb0\\x18\\xf2\\xe1\\x0d\\x3e\\x2b\\x4d\\x10\\x8d\\xe8\\xaf\\x89\\xdd\\x93\\xd9\\x3c\\xa5\\x65\\xf3\\xce\\xe8\\xc1\\x7d\\x66\\xed\\x2c\\x1f\\xfc\\xf4\\xa0\\x89\\xab\\x47\\x27\\x4a\\xb8\\x64\\x95\\x89\\x55\\x5d\\x48\\x55\\xc6\\xde\\x3b\\xc9\\x8f\\x8a\\x8e\\xd0\\x3d\\xb4\\x73\\x8c\\xee\\xa2\\xde\\xf6\\xf9\\x0e\\xfa\\xf9\\x67\\xf4\\xa0\\xcf\\xaf\\x1d\\x6e\\xeb\\x0c\\xf9\\x5d\\xe3\\x50\\xcf\\x22\\xc8\\x8f\\x2f\\xbf\\x78\\xe6\\x5b\\x16\\x15\\xc6\\x2f\\xbe\\xe9\\xef\\x99\\xf3\\xbe\\xcf\\xff\\x99\\x6f\\x84\\x3f\\xb4\\x5f\\x7e\\xd5\\x4b\\x28\\x3e\\xd3\\xbe\\xfa\\xc3\\x6c\\xe7\\x90\\x4c\\x1e\\xfa\\xe2\\xbf\\xf9\\x8e\\xdd\\xf2\\xf5\\xe5\\x17\\xbb\\x7d\\x5e\\x57\\x7e\\xb3\\xdf\\x8b\\xfa\\xc5\\x57\\xa3\\x7d\\xfb\\x7a\\xa8\\x0f\\x3d\\x34\\xf2\\x78\\x58\\xd7\\xfd\\x7c\\xe0\\x19\\x58\\x47\\x5e\\x08\\xf3\\xcd\\x07\\xe6\\xb8\\x0f\\x02\\x9f\\xfd\\xb5\\x47\\x44\\xdf\\xf0\\xff\\x66\\x9d\\xc2\\x54\\xe3\\xab\\x3f\\xac\\x96\\xb5\\x03\\x33\\xdf\\x7a\\x62\\xcd\\x00\\x27\\x64\\xbf\\xfc\\xaa\\x97\\x50\\x4c\\x58\\xbe\\xfa\\xc3\\x2c\\xa5\\x19\\x01\\x7d\\xf3\\x81\\x49\\x95\\xa5\\xd1\\xd5\\xd7\\x7e\\x99\\xad\\x2a\\xed\\x39\\x4a\\x1c\\xa4\\x4a\\x99\\x03\\xd7\\x18\\xa4\\x4d\\xc2\\x57\\xbe\\x43\\x23\\x48\\xa6\\x7e\\xf1\\xcd\\x7c\\xcf\\x95\\x32\\xbf\\xf8\\x66\\xe1\\x89\\x6f\\x7d\\xfc\\xf2\\xab\\x35\\x1a\\xba\\xf4\\xfa\\xf2\\x8b\\xf9\\x96\\xea\\x28\\xbe\\xf8\\x6f\\xb5\\x4d\\xb7\\x98\\xbe\\xfc\\x62\\xe3\\x60\\x11\\x85\\xbe\\xfc\\x62\\xbe\\x2d\\x5c\\x66\\x7d\\xf5\\x87\\x5e\\xaa\\x5c\\x73\\x7c\\xe5\\xbb\\x5e\\xa6\\x14\\xf4\\xbe\\xf2\\x1d\\x6c\\x87\\xcb\\x79\\x5f\\xff\\x69\\x94\\x54\\x05\\xb6\\xaf\\xff\\x04\\xdb\\x94\\xd3\\xa3\\xfd\\xd4\\x4b\\xaa\\x5b\\x17\\x5f\\xfd\\x01\\x77\\x4d\\x4b\\x29\\xdf\\xa1\\xd1\\xf2\\x71\\x28\\xdf\\x4d\\xe4\\x96\\x8b\\x95\\xaf\\xfe\\x00\\xb3\\xff\\x74\\x64\\xf0\\xce\\x8e\\xbf\\xf3\\xa3\\xd7\\x29\\x22\\x83\\x76\\xfc\\xdd\\x6d\\xaf\\x32\\xac\\xbc\\xd7\\x59\\x92\\xc9\\xc3\\x8e\\xff\\xf0\\xc7\\xab\\x63\\x6f\\x77\\xb7\\x4d\\x34\\x63\\x7d\\xf9\\x18\\xe9\\x8b\\x47\\x47\\x04\\xf3\\xed\\xf8\\xa8\\xb3\\x3d\\xd8\\x1b\\xec\\x76\\xd4\\x55\\x08\\x15\\x89\\x77\\x76\\xf7\\x6e\\x03\\x28\\xdf\\x06\\x50\\xfe\\xbb\\x07\\x50\\x16\\xad\\x6a\\x2f\\xe0\\x0c\\x3c\\xff\\xc0\\x93\\x49\\x86\\x2f\\xd0\\x9f\\x51\\x1c\\x7e\\xc2\\xe8\\xe7\\x8f\\x78\\x32\\x71\\x45\\x53\\x6e\\x99\\xaf\\x87\\x15\\x8f\\x82\\x04\\xed\\x07\\x49\\x88\\x03\\x56\\x3a\\x0a\\x12\\x77\\xf1\\x97\\xc1\\x09\\x2d\\xfe\\x47\\x3a\\xc5\\x71\\x4e\\x70\\x1c\\xe3\\x0c\\xfd\\x3c\\x61\\x0f\\xdd\\x95\\x7e\\x0d\\x4e\\xd1\\x9f\\x69\\x3a\\x46\\x3f\\x4f\\x6b\\xa3\\x40\\xdf\\xd7\\x74\\x7d\\x6d\\x33\\x2f\\xb2\\x7c\\xbd\\x0e\\x92\\x60\\xaa\\x87\\x50\\x1e\\x0c\\x29\\x36\\x87\\x19\\x2f\\x30\\xe7\\x05\\xcc\\xf0\\xc7\\xaf\\x4e\\x98\\x79\\xd7\\xac\\x14\\x9d\\x04\\x89\\x95\\xa5\\x1b\\x67\\x29\\x50\\x94\\x9b\\x37\\xf2\\x21\\xf3\\x0f\\x37\\xaa\\xbc\\x38\\x0f\\x67\\x41\\x32\\xc5\\x15\\xd5\\xb0\\x28\\x62\\xf5\\x46\\x82\\x4f\\x55\\xf5\\x72\\xfa\\xde\\xac\\xf4\\xfc\\x69\\x45\\x8d\\xf1\\x89\\x59\\xfc\\x0d\\xbb\\xf9\\xef\\x2a\\x9f\\x60\\x62\\x56\\x78\\x8b\\xb3\\x9c\\x85\\xe7\\x71\\xd7\\x5a\\x88\\x22\\x36\\xf6\\x08\\x89\\x92\\x69\\x0e\\x54\\xcd\\xc5\\x2b\\xb3\\x8a\\x94\\x80\\x5a\\x0d\\x29\\xda\\x3e\\xe6\\xa9\\x35\\x43\\x2c\\x02\\xb7\\x5e\\x5c\\x49\\xf2\\x5e\\x1f\\x46\\x9b\\x17\\x96\\x49\\x1a\\xd4\\xb2\\xf8\\x9c\\xe0\\x64\\x0c\\xc0\\xce\\x5f\\x98\\xc5\\x9f\\x32\\x4b\\xad\\x5d\\xfa\\x84\\x3e\\xb7\\x90\\x9a\\xa5\\x0b\\x9c\\x91\\x0b\\xa0\\xfc\\x42\\xbc\\x32\\xab\\xfc\\x46\\xc8\\xe2\\x6d\\x96\\x9e\\x46\\x63\\x90\\xe4\\xa9\\x10\\x5a\\x88\\xd7\\x16\\xc1\\x2f\\xc2\\x8a\\x9a\\xd1\\x22\\x74\\x55\\x6c\\x96\\xa2\\x0a\\xb0\\x2c\\xfd\\x89\\x4f\\xf6\\x50\\x4f\\x36\\x0b\\xe7\\x47\\xcf\\x4c\\x2e\\xa6\\xfa\\xb0\\xce\\xda\\x65\\x0b\\x40\\xaa\\xf4\\x90\\x65\\xdf\\x21\\xca\\xc8\\x64\\x69\\xa0\\x70\\xce\\x19\\x99\\x25\\x41\\xc7\\x59\\xda\\xa3\\x0f\\xa1\\x46\\x71\\xc9\\xbd\\x4c\\x3d\\x17\\x3f\\x9d\\xe5\\x19\\x4b\\x8e\\x58\\xb3\\xf4\\x9b\\xb3\\xdc\\xf8\\x44\\xb4\\xf8\\xfc\\xa9\\xb3\\x4c\\xc2\\x83\\x72\\xe0\\x33\\xca\\xa4\\xce\\x52\\x8b\\x92\\x1f\\x69\\x51\\xc9\\x9e\\x6e\\x08\\x4b\\x26\\xe4\\xa3\\xe7\\x3f\\x4d\\x3f\\x45\\x56\\xb6\\xe4\\x3e\\xdb\\x66\\x11\\x2c\\x22\\xbf\\xd8\\x64\\x88\\xff\\xba\\x95\\x02\\x02\\x56\\xcc\\x88\\x6d\\x60\\xa0\\x1f\\x95\\xa4\\x7d\\xed\\x97\\x67\\x95\\x55\\x68\\xd8\\x57\\x7f\\xd4\\x82\\xf0\\xa1\\xe0\\x63\\xfe\\xc5\\x89\\x28\\x51\\xb0\\x67\\xc3\\x29\\x58\\x32\\xa2\\x1a\\x45\\xf9\\xbd\\x67\\x18\\x69\\x34\\xe3\\xe7\\x70\\xc8\\x72\\x55\\xe6\\x18\\x95\\x28\\x48\\xf9\\x86\\x89\\x65\\x10\\x28\\x8a\\x52\\x4e\\xa9\\x40\\x53\\x53\\x14\\xd5\\xa2\\x47\\x35\\xc7\\xc9\\x3e\\x45\\x66\\xfe\\x1c\\xab\\x4c\\x54\\x5a\\xc6\\xda\\xb0\\xaf\\xda\\xc8\\xda\\x5c\\x5b\\x01\\x6b\\x86\\x73\\xac\\x9f\\x73\\x7f\\xc2\\x78\\xf1\\x2a\\x7f\\x7f\\x91\\x84\\x40\\x02\\x64\\x10\\x54\\xd6\\x86\\x51\\x6f\\x35\\xc6\\xa9\\x00\\x54\\x15\\x9d\\x4f\\x6d\\xff\\x59\\xa3\\xb4\\x8c\\x76\\xc1\\x93\\x69\\xb0\\x5f\\x15\\x65\\x65\\x10\\x3b\\x59\\x9a\\xfd\\xae\\x28\\x2f\\x82\\x4e\\xca\\xe2\\xf4\\xa7\\xb3\\xb4\\x1a\\x24\\x8f\\x57\\x28\\x9e\\x54\\xd6\\xd1\\xfa\\x90\\x0f\\x2a\\x60\\x2a\\xc3\\xb9\\x48\\xb0\\xc4\\x93\\xca\\x5e\\xcc\\x5a\\xca\\xb3\\x8a\\xbe\\xd4\\xb9\\x90\\xbd\\x35\\x99\\x13\\x76\\x6b\\x45\\x56\\x38\\x08\\x2a\\x21\\x53\\xca\\xf2\\x9f\\xce\\xd2\\xaa\\x0f\\x26\\xaf\\x50\\x3c\\xa9\\xa8\\xa3\\x7a\\x21\\xca\\x5a\\xc5\\x33\\x67\\xbd\\x32\\x56\\x3b\\xaf\\x23\\x7e\\x57\\x95\\x97\\xe1\\xbe\\x8b\\x0a\\xec\\x81\\xb3\\x86\\x71\\xae\\xc3\\x6b\\xa9\\x0f\\x9d\\x35\\xf5\\x73\\x15\\x5e\\x51\\x79\\xe6\\xac\\xa7\\x1f\\x24\\xf0\\x7a\\xca\\xb3\\x0a\\x1c\\x6a\\x47\\x00\\x12\\x89\\xe5\\xc3\\x0a\\x09\\xc9\\xb7\\x8d\\x85\\xad\\xa2\\x70\\x4a\\x83\\x13\\x75\\xe9\\x91\\x19\\x58\\xaa\\x2a\\xb3\\x46\\xb3\\x9b\\x19\\xa5\\x33\\xe8\\x38\\xca\\x98\\x53\\x48\\x18\\x2c\\xd8\\x2d\\xc9\\x0a\\x77\\x4b\\x80\\x38\\x5f\\x3d\\x7b\\xf2\\x56\\x13\\x9a\\xb4\\x1d\\xe8\\xd0\\x23\\xe2\\xaa\\x11\\x95\\x77\\x54\\x4b\\xe2\\xe5\\xc0\\xd3\\x33\\x5a\\x52\\xce\\xb3\\x4b\\x24\\x32\\x9f\\xf6\\x62\\xbd\\xd4\\x00\\x70\\xa0\\xec\\xc8\\x5a\\x7b\\xd9\\x1e\\x47\\x6c\\x89\\x81\\xa5\\x99\\x15\\x61\\xa6\\xf1\\xae\\xdc\\x9b\\x24\\xe9\\x18\\x77\\xed\\x0d\\x04\\xfd\\x4c\\x31\\x21\\x74\\x81\\xec\\xd2\\x8d\\xef\\x87\\x30\\x8e\\x70\\x42\\xfe\\xe0\\xd5\\xba\\x56\\x85\\xab\\xbe\\xdd\\xc8\\x0a\\xd0\\x60\\x72\\x96\\x66\\x9f\\xea\\x00\\x4a\\x30\\xf9\\x20\\xaa\\x38\\x8a\\xb2\\xcb\\x39\\x2f\\x85\\xc3\\x6d\\xe6\\x9b\\x62\\xf3\\x9a\\xc0\\xa7\\xfb\\x66\\x9c\\xe1\\xe5\\xbc\\x6e\\x00\\xb4\\xe0\\x07\\x46\\x75\\x61\\x1a\\xff\\xf1\\x15\\x8e\\xe4\\x6c\\x16\\xe5\\x0b\\x9c\\xd5\\x8e\\x63\\x36\\xdb\\xf8\\x44\\x68\\x8f\\x8e\\x1b\\x6d\\x1f\\xa2\\xfc\\x59\\x9a\\x24\\x3c\\x3b\\x85\\x22\\x78\\xfa\\x70\\x34\\x0a\\x70\\x67\\x75\\xf7\\x2e\\xb8\\xe3\\x52\\x9b\\xee\\xb9\\x52\\x2b\\x18\\xd0\\xf0\\x00\\xaf\\x52\\xc3\\xad\\xe5\\x62\\x76\\x7f\\x89\\x16\\x36\\xf7\\xda\\x57\\x55\\x69\\x10\\x69\\x9f\\x6a\\x0a\\x3e\\x55\\x37\\xe7\\xb6\\x6c\\x4d\\xb5\\xef\\xf8\\xbb\\x3b\\xf4\\x91\\x6a\\x1c\\xe8\\xf8\\xbb\\xbb\\xf4\\x59\\xa9\\x78\\x77\\xfc\\xdd\\x1f\\x8a\\x27\\x7c\\x83\\xdf\\xf1\\x77\\x7f\\x2a\\x1e\\xa9\\x6a\\x73\\xc7\\xdf\\xdb\\x2b\\x5e\\x50\\xf9\\xd6\\xf1\\xf7\\xee\\x97\\x0f\\x4a\\x35\\xb9\\xe3\\xef\\x95\\x8d\\x96\\xa6\\x96\\x8e\\xbf\\xf7\\xd0\\x7a\\x2c\\x15\\xca\\x8e\\xbf\\xf7\\x93\\xf5\\x32\\xc1\\xa4\\xe3\\xdf\\xdf\\xb6\\x9e\\x4b\\x1d\\xaf\\xe3\\xdf\\xdf\\xb1\\x5e\\x52\\x4e\\xeb\\xf8\\xf7\\x77\\xed\\x17\\x54\\x03\\xed\\xf8\\xf7\\xcb\\x41\\x48\\x5b\\x42\\xc7\\xbf\\xff\\xa0\\x78\\xa8\\x1b\\xc7\\x3a\\xfe\\xfd\\x1f\\x8b\\x57\\x72\\xcb\\xdb\\xf1\\xef\\x3f\\xac\\x3e\\x3a\\xb8\\x3a\\xf6\\x76\\xef\\xdf\\x5a\\xef\\x6f\\xad\\xf7\\x7f\\x77\\xeb\\x7d\\x10\\xc7\\x2c\\xea\\xeb\\x66\\x53\\x20\\x56\\x18\\xbf\\x2d\\x13\\x66\\x95\\x0d\\xf3\\x7d\\x1a\\x47\\xe3\\x88\\x5c\\xbc\\x38\\xe5\\xd7\\x5c\\x15\\xdb\\x1f\\x83\\xda\\x2c\\x2f\\x2f\\xf4\\x64\\x86\\x49\\xb5\\x7c\\x5e\\x6f\\x7f\\xad\\x34\\xc0\\xbe\\x64\\xce\\x9d\\x46\\xe3\\xec\\x99\\x59\\xf2\\x8c\\x8a\\x6f\\x6c\\xc0\\x21\\x45\\x9d\\x78\\x69\\x65\\xc8\\x7f\\x12\\xc7\\xda\\x90\\xf5\\x4d\\x27\\x95\\x9c\\x1e\\xf3\\x1b\\xf6\\x90\\xe3\\xea\\x91\\xc3\\x34\\x49\\x6b\\x0e\\x3e\\x18\\xcf\\x21\\x1b\\xd2\\x47\\xee\\x11\\x4c\\xff\\x41\\xaf\\x83\\x42\\xfd\\x00\\x2f\\x2b\\xf1\\x42\\xdc\\x56\\x49\\xff\\xc2\\x2b\\xa7\\x35\\x48\\x65\\xa5\\xe6\\xae\\x94\\xba\\x93\\x36\\xac\\xa4\\xc8\\x4c\\xc2\\xa3\\xe2\\xdb\\xe5\\x25\\xfa\\x7c\\x55\\x11\\x1e\\xf5\\xf3\\x95\\x71\\x83\\xfe\\xa8\\x4b\\x95\\x0b\\x96\\x29\\xbd\\xeb\\xa1\\x2e\\x49\\xf9\\xd7\\xe3\\x01\\x9f\\x51\\x25\\x24\\xf9\\xa4\\xc2\\xa1\\x51\\x74\\x7f\\x34\\x39\\x66\\x2e\\x4b\\x45\\x8c\\x1c\\xc3\\xc9\\xb1\\x3f\\x98\\xa4\\xd9\\x8b\\x20\\x9c\\xd5\\x37\\x4b\\xe1\\xa5\\xcd\\x8d\\x14\\x7a\\xe6\\xa1\\xd2\\x19\\x80\\x5c\\xef\\x2f\\x76\\x70\\xbd\\x12\\x00\\xd3\\xfd\\xda\\x8e\\x25\\xc1\\x42\\xbb\\x96\\xb3\\xa8\\xcd\\x2a\\x1c\\x78\\xa2\\x2a\\xe8\\x6b\\xd5\\x4c\\xf2\\x00\\x6c\\xda\\x4c\\x8e\\x03\\x12\\x98\\x23\\xa6\\xcf\\x06\\xf4\\x0f\\x1a\\x29\\xdf\\x2f\\x2f\\x51\\xb7\\xab\\xfa\\xc0\\xc9\\xc9\\x64\\x5c\\x2f\\x5d\\x65\\x7b\\x85\\xf9\\x81\\xb9\\xe8\\xb3\\xea\\xcc\\xff\\x34\\x67\\xb7\\x3e\\xe4\\x5b\\xe1\\x1f\\xaa\\xbc\\x3e\\xda\\x3e\\xee\\xf7\\xd1\\x63\\xa4\\x3f\\x1a\\xe4\\x54\\x70\\xf6\\x76\\x59\\xe8\\x24\\x20\\x6c\\xd2\\x5c\\xec\\x1f\\x4b\\x4e\\xb1\\x09\\xe5\\x63\\x05\\xa1\\xa8\\xb0\\x8f\\x46\\x5c\\xaf\\x16\\x9b\\x6f\\xdb\\xf9\\xaa\\xf7\\xd1\\x8a\\x6b\\xd4\\x3f\\xda\\x3e\\x06\\x62\\x40\\xdc\\x61\\x70\\xf5\\xd1\\x67\\x34\\x1c\\xd2\\xed\\x45\\x92\\x12\\x34\\x89\\x92\\x31\\x87\\x37\\x4a\\xa6\\xbc\\xe3\\xc7\\x2e\\xb0\\x14\\x1a\\x13\\x79\\xa7\\xd3\\x69\\x49\\x5c\\x6c\\xce\\x2a\\x23\\x3a\\x14\\xd3\\x22\\x0d\\x8d\\x2a\\x45\\xf4\\x20\\x81\\xe4\\x71\\xd0\\x3c\\x9d\\xfc\\x60\\x3d\\x9d\\xb5\\x2c\\xa3\\xf9\\x19\\xc0\\x34\\x16\\x2a\\xe7\\x38\\xa4\\x5b\\x2d\\x40\\xaa\\x78\\x2c\\x68\\xfb\\x49\\x10\\x7e\\xb2\\xee\\xc0\\xb3\\xf0\\x57\\x82\\x84\\xa4\\x73\\x54\\x2f\\xc8\\xa6\\xcb\\x39\\x6d\\xfe\\xa8\\xf8\\xa6\\xba\\x30\\x82\\xde\\xae\\xb2\\x07\\x2a\\x35\\xab\\xab\\x43\\x77\\xd2\\x7b\\x56\\x49\\x4a\\x3c\\x3b\\x70\\xac\\xd7\\x52\\x28\\x26\\xcb\\x38\\xae\\x9d\\xb6\\x54\\x52\\xb3\\x88\\x2a\\x69\\x5b\\x77\\x90\\xb9\\xb0\\xca\\x1a\\x7c\\x46\\x06\\x27\\x11\\x7c\\x22\\xa1\\x68\\x52\\x7c\\xc9\\xec\\xa5\\x9e\\x88\\x47\\xe6\\x81\\x8b\\x94\\x27\\x17\\x4c\\xa6\\xb2\\xf7\\xfa\\x5e\\xd9\\xa5\\x32\\x47\\xed\\xe7\\x3e\\x20\\x24\\x08\\x67\\x07\\xe9\\x33\\x19\\x80\\x5f\\x25\\x02\\x19\\x95\\x1f\\x32\\x25\\x95\\x44\\x23\\x0e\\xd6\\xd8\\x4f\\xe7\\x80\\x65\\x53\\x83\\x20\\x8e\\x8b\\xa5\\x5b\\x54\\x6a\\xa8\\x40\\x5a\\xc3\\xd0\\xb4\\x49\\x40\\x9d\\x04\\xf5\\x49\\xc6\\x30\\x1d\\x7f\\x97\\xa9\\x72\\x5c\\x3e\\x75\\xfc\\x3d\\xa6\\xa3\\x95\\x9c\\xde\\xf1\\xf7\\x58\\x61\\x63\\x3f\\xd2\\xf1\\xef\\xdf\\xa7\\x9a\\xd1\\x0f\\xb7\\x9a\\xd1\\xad\\x66\\xf4\\x77\\xd7\\x8c\\x98\\xfd\\xe5\\x26\\x12\\xc3\\x53\\x69\\xf3\\x8f\\x3c\\x4d\\xb2\\x45\\xa8\\x6b\\x0b\\x1f\\xf9\\x43\\xcb\\xb1\\x23\\xcb\\x52\\x53\\xc1\\xe1\\xcf\\x2c\\x7d\\xc2\\x36\\x79\\x51\\x5c\\x81\\x4a\\x83\\xa5\\x33\\x30\\xac\\xd6\\xab\\x0c\\xa2\\x00\\x0f\\x3b\\xda\\xe8\\x58\\x00\\x4a\\x98\\x12\\x8c\\xc7\\x32\\x0d\\x13\\x5d\\x33\\x44\\xa3\\x2c\\x3a\\x2e\\x1b\\x82\\x78\\xa0\\x34\\xa3\\x61\\x58\\xdc\\xd7\\x0a\\xc6\\x60\\xba\\x5a\\x35\\xd9\\x12\\x45\\x32\\x6b\\x8c\\xd8\\x77\\x2f\\x4b\\x82\\x60\\x78\\xd3\\x4f\\x89\\x34\\x2c\\x0a\\x70\\xaa\\x10\\x29\\x82\\xa9\\xca\\x92\\x2b\\x63\\x46\\xae\\x43\\x6d\\xf0\\x20\\xea\\x34\\x1a\\x1a\\xb4\\x39\\x82\\x63\\xda\\x15\\xf3\\xac\\x0d\\xd3\\x4d\\x12\\xe5\\xd1\\x7a\\x32\\xe6\\xe6\\x54\\x59\\xc7\\x53\\xfa\\xc2\\x59\\xe6\\x09\\x25\\xc3\\xd2\\xf1\\x50\\xa1\\xb3\\x70\\x72\\xe7\\xdf\\x2e\\x2f\\x35\\x4a\\x2b\\x0b\\x0a\\xbc\\xeb\\xd9\\xa4\\xc4\\x63\\x0f\\xb1\\x88\\x67\\x35\\x71\\x7b\\x44\\x17\\x47\\xac\\xec\\x31\\xa4\\x51\\x22\\x97\\x2e\\xc7\\xab\\xd6\\x74\\x43\\xf7\\x94\\x12\\x4e\\xd1\\xc9\\xc0\\xb9\\x01\\x35\\x2b\\xde\\x11\\x42\\x62\\x10\\xe5\\x7f\\x04\\x71\\x34\\x7e\\x87\\xf3\\x45\\x9a\\xe4\\x58\\x74\\x0d\\xee\\x3d\\xc1\\x31\\xc2\\xfd\\xf7\\xb8\\x0c\\x19\\xbc\\xe2\\x77\\x79\\xac\\xd6\\x6d\\x3c\\x14\\xf8\\x70\\xc3\\xed\\xec\\x8c\\x07\\x6f\\xb5\\x90\\xc1\\xb7\\x28\\x2c\\xb2\\x21\\xf4\\x42\\x00\\x33\\x10\\x30\\xb1\\x98\\x87\\xea\\x03\\x07\\x90\\x40\\xde\\x44\\x40\\x55\\x2e\\xbe\\x57\\x6d\\xd2\\x18\\x21\\xeb\\x66\\x7e\\x8e\\xb7\\x8e\\xbf\\xcb\\x0c\\xd1\\x42\\xc8\\x74\\xfc\\xbd\\x07\\x74\\x2b\\xf5\\xe0\\x76\\x2b\\x75\\xbb\\x95\\xfa\\xbb\\x6f\\xa5\\x0a\\xe5\\xe8\\x86\\x6c\\xcc\\x2d\\x8d\\xba\\x54\\x93\\xcd\\x8c\\xe2\\xb9\\xd0\\xc4\\x86\\xec\\xe5\\xba\\x76\\x69\\x59\\x5e\\x09\\x02\\xa3\\x1a\\x90\\x65\\x54\\x17\\xa3\\xd6\\x13\\x45\\x95\\x54\\x8a\\x17\\x26\\xfb\\x15\\x37\\x86\\x4d\\x36\\x1d\\xdc\\x0c\\xab\\xc6\\xee\\x61\\x7b\\xa9\\xba\\x20\\x67\\xbc\\xde\\xb3\\xb2\\xda\\x5b\\xb3\\x96\\x99\\x58\\xc3\\xcc\\x7d\\xa9\\xbf\\xad\\x04\\xc0\\x48\\x3e\\x07\\x77\\xad\\xdf\\xd5\\x3e\\x89\\x3c\\xd1\\x8e\\x97\\xcf\\xd2\\x8c\\xdd\\xc3\\x7b\\x6d\\xbb\\x92\\xc8\\x80\\x5c\\x27\\x11\\x60\\xe1\\x03\\x92\\x67\\x22\\x23\\xdd\\x24\\x4b\\xaf\\xc7\\x22\\xa9\\x28\\x03\\xe8\\xa2\\xbb\\x77\\xb5\\xac\\x97\\x8a\\x39\\x87\\xc3\\x04\\x66\\xf9\\xbe\\xea\\x1b\\x1b\\x9a\\x26\\x00\\xc0\\x79\\x35\\xe9\\xc3\\x9a\\x0d\\x10\\x2b\\x03\\xe4\\xd8\\x44\\xe0\\x9a\\x69\\x74\\x40\\xab\\x39\\xf6\\x70\\xac\\x71\\xc6\\x4a\\xc2\\xd6\\xc4\\x67\\x87\\x57\\x81\\xe7\\x04\\xb0\\x7e\\x4a\\xbb\\x70\\xf1\\xd0\\x50\\x77\\x6c\\x1a\\x60\\xe1\\xe4\\x9c\\x34\\x90\\x05\\x89\\x15\\xca\\xfe\\x76\\xee\\xaf\\x71\\xee\\x85\\xa9\\x97\\x4f\\x8b\\x31\\xf9\\x6c\\x32\\x1c\\x93\\x0e\\xd5\\x3e\\x3a\\xf6\\xd0\\xd1\\xb1\\x59\\xcd\\x24\\x89\\x74\\xf1\\x24\\x9b\\xba\\xa5\\x00\\xad\\xed\\xb1\\x73\\xb5\\xf1\\x85\\xa7\\xee\\xc4\\x55\\x30\\x58\\x8a\\x70\\xf9\\x0e\\xce\\x8e\\xcc\\x86\\x82\\x46\\xed\\xc8\\xc6\\x9c\\xb9\\x4d\\x92\\x0e\\x38\\x49\\x4d\\x01\\x69\\x4f\\x42\\xa8\\x19\\x19\\x21\\x80\\x94\\x5c\\xcf\\x64\\x6e\\xb9\\xfc\\xee\\x5d\\xf6\\xef\\x68\\xfb\\x18\\x40\\x3e\\x62\\xb6\\x57\\x4a\\x1d\\xe9\\x42\\x95\\x29\\x47\\xdb\\xc7\\x35\\x93\\x0c\\x40\\x51\\x91\\x4b\\xdd\\xe8\\x43\\x21\\x3e\\xbb\\x65\\xbb\\x61\\x5d\\x41\\x72\\x04\\xab\\x58\\x45\\xf2\\xa0\\x5b\\x12\\x72\\x41\\xea\\x94\\x48\\xc8\\x94\\x4a\\x3a\\xe5\\x80\\x64\\x03\\x76\\xa8\\x09\\xa7\\x2a\\xd2\\x70\\x1f\\xa0\\x5d\\x69\\xf7\\x8f\\x1a\\x1a\\xca\\xe4\\x18\\x73\\x91\\x3c\\x81\\x1f\\x6c\\x34\\x0a\\x25\\x16\\x8c\\xc7\\x72\\x0f\\x9a\\x97\\x87\\x22\\xd0\\x0e\\x4c\\xbe\\xbb\\x2a\\x7a\\x68\\xbc\\x8b\\xd3\\x37\\x66\\x70\\x97\\xe0\\x39\\x8c\\x97\\xe0\\xb3\\x27\\x27\\x56\\xfe\\xef\\xf2\\x6c\\x65\\xfd\\x45\\x19\\x88\\xa0\\x08\\x52\\x4f\\x4d\\xab\\xea\\x41\\x67\\x71\\x38\\x58\\xc0\\xf9\\x41\\xf5\\xd4\\x28\\xa1\\x17\\x97\\xe0\\xc5\\x20\\x57\\xf5\\x0f\\x98\\x58\\x67\\x5a\\xe5\\x39\\x56\\x33\\xa3\\x46\\x43\\x32\\xe3\\x4a\\xc6\\x4a\\x34\\xc6\\xd5\\x96\\x9b\\x23\\x30\\xb3\\xbf\\xe6\\xa7\\x7c\\x52\\xbf\\xda\\x24\\x8d\\x71\\x15\\xb0\\xc6\\x17\\x43\\x28\\x78\\xe2\\xd0\\xbc\\x50\\xf5\\x2c\\x22\\xe2\\x10\\xda\\x64\\x64\\xcc\\xf5\\x93\\x38\\xae\\xa4\\x0b\\xad\\xb0\\xf0\\xf8\\x5a\\x99\\xe2\\xf9\\xd1\\x7e\\x33\\x72\\x6f\\x42\\xe7\\x60\\x78\\x40\\xfb\\xec\\xb6\\x29\\x9d\\xb7\\x21\\xf4\\x50\\xe6\\xfd\\x63\\x57\\xdb\\x24\\xf9\\x4c\\x31\\xc9\\x85\\xeb\\x7f\\x7c\\x81\\xc6\\x78\\x11\\xa7\\x17\\x78\\x2c\\x6f\\xc0\\xb1\\x40\\x82\\xe1\\x2c\\x88\\x9c\\xc9\\x8a\\x25\\x2b\\xb0\\xd6\\x5f\\xa6\\x99\\x1c\\x41\\x45\\xdc\\x6a\\x79\\x48\\x51\\xc5\\x0c\\x52\\xd2\\x5c\\x15\\x27\\xe2\\x5a\\xa9\\x22\\x7d\\xd9\\xa1\\xf4\\x41\\x72\\x07\\x9c\\x73\\x40\\xa6\\x3a\\x6b\\x17\\x52\\x19\\x39\\x36\\xbf\\xdc\\x76\\xb2\\x64\\x16\\x90\\x6d\\xdb\\xd9\\x5c\\xd6\\x7a\\x19\\x65\\xdc\\x0b\\x9c\\x87\\x74\\xd3\\xca\\x0d\\x87\\xe8\\x2c\\x88\\x08\\x33\\x73\\x31\\x1b\\xd6\\x82\\x58\\x5d\\x4c\\xa4\\xcf\\x9d\\x4e\\x70\\x92\\x4b\\xbb\\x71\\x40\\x70\\x4e\\xba\\xe5\\xa1\\x42\\x0f\\x03\\x1b\\x45\\x66\\x41\\xc7\\x2c\\x52\\xac\\x06\\x98\\xd3\\xec\\xce\\x46\\xb6\\xb5\\x05\\xef\\x40\\x86\\x43\\x94\\x93\\x74\\xc1\\x9d\\x16\\xa2\\x64\\x8a\\x82\\x09\\x85\\xf1\\x87\\x6d\\x4e\\x1c\\x39\\xea\\x91\\x68\\x8e\\xd3\\x25\\x81\\xfd\\x34\\x98\\x46\\xc1\\x30\\xf7\\x0b\\xfa\\x61\\xbb\\xd2\\xf2\\xcf\\x47\\x39\\xa0\\xbd\\xfd\\x29\\x3a\\xeb\\x95\\xfe\\xf4\\xe8\\x33\\xb4\\x17\\x72\\xcd\\x00\\x8f\\xbd\\xe7\\x2c\\xae\\xe9\\x39\\xce\\x52\\x6a\\xc3\\x3d\\x25\\xdd\\x5b\\x21\\x7b\\x99\\x37\\x53\\xc0\\x59\\x3b\\xa4\\x1c\\xc7\\x52\\xbf\\x9d\\x60\\x34\\x49\\x97\\xc9\\xd8\\xc4\\x54\\xb7\\xea\\x64\\x01\\x6b\\xf1\\x62\\x81\\x8f\\x95\\x74\\x6e\\x65\\x28\\x4c\\x6f\\x33\\xf9\\x29\\x12\\x31\\xb8\\xb1\\xac\\x93\\xe5\\x14\\x93\\x83\\xb2\\xef\\x77\\x9c\\xa8\\x4b\\x61\\xa9\\xc0\\xf5\\x5b\\x90\\xcf\\x54\\xaa\\xf5\\x24\\x0b\\x38\\xf4\\x1c\\xf9\\x89\\x26\\x3d\\x51\\x90\\x92\\xb3\\xf8\\x3a\\x60\\x03\\xa1\\x4d\\xb6\\xa0\\xf1\\xea\\x61\\x3c\\x4b\\xc7\\x58\\xf6\\x34\\x08\\x75\\x41\\xa1\\xc3\\x4d\\xb7\\xc0\\x35\\x40\\xcb\\x8f\\x2b\\xe7\\xf9\\x03\\x2b\\xe7\\x79\\xc5\\xf0\\x75\\xc2\\xbe\\xbc\\x44\\x77\\x18\\x04\\x8d\\xaa\\xa3\\x62\\x4d\\xab\\x60\\x05\\xf5\\xb3\\x0e\\x07\\xaa\\x9f\\x96\\xdc\\xa8\\x7e\\xe8\\x90\\xd3\\x31\\x96\\x8a\\xdb\\x2f\\x68\\xaf\\xd1\\x94\\xca\\xcf\\x70\\xc8\\x2c\\xa9\\x69\\x8c\\x07\\x71\\x3a\\x55\\x98\\x84\\x59\\x79\\xe5\\xf2\\x76\\xc7\\x4a\\x2c\\x5a\\x39\\x1a\\x63\\x9d\\x67\\x66\\x67\\x90\\x54\\x5a\\x34\\x3a\\x1c\\x22\\xbe\\xe8\\xcb\\x8d\\x59\\x90\\x8c\\x91\\x70\\x52\\x42\\xc1\\x34\\x88\\x12\\xc1\\xb8\\x67\\x98\\x9d\\x7b\\x34\\x6e\\x18\\x56\\x42\\x5c\\x1b\\x8a\\x9a\\x96\\xcc\\xdd\\xa6\\x73\\x9f\\x55\\x33\\x54\\x4a\\x10\\xa5\\x77\\x20\\x5d\\x02\\xe9\\xee\\x22\\xc7\\x61\\x9a\\x8c\\x11\\x5d\\x3f\\x1a\\x37\\xa6\\xb0\\x44\\x73\\x26\\x40\\x9a\\x20\\x67\\xe7\\xb1\\x6d\\x07\\xe2\\xcc\\x52\\x73\\x8d\\x80\\xaa\\x09\\x46\\x95\\x2d\\x9b\\x38\\xb0\\x50\\x04\\x7d\\x4e\\xd2\\x0c\\x8f\\x8b\\x64\\xa3\\x7c\\xa7\\xc7\\x8e\\x16\\xa7\\x41\\x8e\\x82\\x39\\x5d\\x7f\\x07\\x95\\xcb\\x8f\\xf9\\xa9\\x5d\\x8e\\xcc\\x0f\\x90\\x13\\x75\\x13\\x20\\x37\\x83\\xd8\\x3e\\xf5\\xb6\\x4a\\xd4\\xb4\\xe4\\x6e\\xc1\\x55\\x13\\x38\\x69\\xaf\\x34\\xaa\\x95\\x42\\xa9\\x83\\xb3\\x2c\\x95\\x7b\\xbd\\x0e\\xda\\x42\\x80\\x38\\xbf\\xda\\x94\\x7a\\xab\\xb8\\x1a\\x49\\x26\\x7e\\x19\\x84\\x24\\xcd\\x2e\\x8a\\x04\\x23\\x35\\x3b\\x7b\\xa3\\xda\\x8a\\xaa\\xab\\xd9\\xb9\\x7d\\xdb\\x23\\xb0\\xcd\\x21\\x6a\\x40\\x18\\xfd\\x96\\x45\\xf1\\x36\\x38\\x89\\xb8\\x31\\xda\\xdc\\x6e\\xab\\xa8\\x69\\x84\\x9e\\x52\\xf5\\x4f\\x50\\xa0\\x68\\x3e\\x46\\x33\\x66\\xab\\x12\\x4d\\x09\\x3e\\xb3\\x5e\\x49\\xf4\\x24\\x17\\x57\\x2a\\x2f\\x18\\x27\\x7d\\x3b\\xd2\\x47\\x3b\\x88\\xfb\\x2b\\x36\\xb1\\xdb\\xa0\\x09\\x53\\xed\\xd2\\xf6\\x8d\\x22\\x95\\x81\\x74\\xdc\\x18\\x3b\\x5b\\xa9\\x52\\xcc\\x90\\xa1\\x9c\\x95\\x76\\x0f\\xf9\\xa8\\xe8\\xdb\\xa6\\x3d\\x83\\x66\\x50\\x19\\x6b\\xe7\\xac\\xd2\\x63\\x0b\\x55\\xec\\xb4\\x7e\\x04\\x77\\x5a\\x5c\\x99\\x2b\\xcc\\x27\\x2a\\x6b\\xf4\\x0a\\x8a\\xf3\\x0a\\xf2\\x82\\x56\\x88\\xe1\\x10\\xb1\\x4c\\x00\\xa5\\x9b\\x3b\\xd8\\x4b\\xe9\\xa4\\xfe\\xf9\\xea\\x11\\xad\\x24\\xd1\\x7b\\x07\\x06\\x4a\\x60\\x14\\xe8\\x90\\x59\\x7f\\xf8\\xf1\\x0e\\xcf\\xd6\\xa0\\x84\\x3c\\x88\\xa3\\x10\\x33\\x77\\xa3\\xd2\\x81\\xde\\x71\\xc8\\x00\\x39\\xf9\\x33\\x07\\xfd\\x7a\\xd7\\x7e\\x64\\xb9\\xf7\\xe7\\x83\\x45\\xba\\x30\\x83\\x13\\x21\\xd8\\x49\\x8a\\x82\\x1f\\x07\\x39\\x11\\x35\\xad\\x2e\\xab\\xc1\\xe5\\x94\\xdb\\xa3\\x0d\\xb0\\xeb\\x2e\\x77\\xf4\\xdb\\x30\\xec\\xb9\\x0b\\xe6\\x72\\x0a\\x5a\\x82\\x4c\\x01\\x10\\x95\\x07\\x3c\\x33\\xfa\\x2f\\x68\\xdb\\xd5\\x8b\\x20\\x29\\xc9\\x94\\x4f\\xa4\\x50\\x6a\\x77\\xbc\\x81\\xd6\\x3d\\xe2\\x50\\xd0\\xea\\x3a\\x4e\\x10\\x96\\x7c\\xeb\\x86\\x98\\x3a\\x92\\x28\\x7f\\x1b\\x5c\\x04\\x27\\x31\\x76\\x98\\x32\\x54\\x14\\xe9\\xa3\\x1e\\xe4\\x24\\x20\\xf8\\xf5\\x92\\x04\\x27\\x51\\x1c\\x91\\x0b\\x06\\x55\\x67\\xc1\\x5b\\xeb\\x54\\x8d\\x5b\\xed\\xd3\\x0e\\x9c\\x5f\\xc0\\xdf\\x14\\x8e\\x59\\x90\\xef\\x9f\\x25\\x45\\xdc\\x01\\x05\\x84\\x0a\\xe5\\xad\\x80\\x61\\x64\\x4c\\xe6\\x40\\x54\\x77\\x01\\xe5\\x84\\xea\\x4e\\x39\\xac\\xaa\\xc1\\xdb\\xba\\x3d\\xbf\\xdc\\x94\\xe3\\x64\\x2c\\xd2\\xf2\\x93\\x14\\x25\\x69\\x72\\x4f\\x00\\xa2\\xc2\\xe7\\xda\\x24\\x01\\x1b\\x14\\xeb\\x89\\x24\\x70\\xb6\\x8a\\x4a\\x81\\xe7\\x10\\x3f\\x19\\xd5\\x50\\x46\\x9d\\xed\\xf3\\x8e\\xdd\\x9f\\x14\\x4f\\xef\\xe4\\x0d\\x44\\x7e\\x18\\xdd\\x93\\x4d\\x7a\\xf4\\x25\\x3f\\x28\\x2a\\x25\\x2c\\x23\\x2d\\x00\\x78\\x21\\xe7\\xca\\xf6\\x06\\xfc\\x98\\x0a\\x70\\x84\\x65\\x20\\xa9\\x25\\xe9\\x13\\x18\\x3c\\xd5\\xe3\\x42\\xaf\\x53\\xbc\\x81\\x2b\\xca\\x10\\xfe\\x0e\\xb7\\x9b\\x72\\x8c\\xac\\xcd\\x2a\\xcf\\x0e\\x15\\xe3\\xec\\xf2\\xdf\\xd6\\x88\\xb7\\x0e\\x77\\xbc\\x90\\x2e\\x1d\\x0e\\x67\\x0f\\x00\\xbb\\x75\\x1d\\x8e\\x64\\xa3\\x5b\\xea\\xe3\\x41\\xbe\\x3c\\xc9\\x49\\xd6\\xdb\\x85\\x96\\x3a\\xcd\\x54\\xe6\\x52\\xc5\\x55\\xe3\\xa6\\x66\\x5e\\x96\\x2a\\x33\\xcb\\xdd\\xae\\x1b\\xa0\\xc7\\x18\\x9d\\x05\\x79\\xa1\\x93\\x83\\xed\\x16\\xc4\\xc2\\x5c\\xab\\x15\\x63\\x53\\x79\\xab\\xcd\\xf0\\xaf\\x9e\\x05\\xf9\\xac\\x52\\xce\\x4c\\x58\\xc1\\x3a\\x0f\\x62\\xd5\\x55\\xb8\\xca\\x1f\\xb8\\x89\\x56\\x48\\x55\\xfd\\xf1\\x98\\xfb\\x9e\\x2a\\x5b\\x2e\\x0a\\x69\\x35\\x0c\\x0e\\x43\\x1a\\x1a\\xb1\\xba\\x35\\x8a\\xab\\x53\\xeb\\x9e\\x44\\x59\\x4e\\xea\\x95\\xee\\x15\\xf5\\x65\\x87\\xb5\\x1d\\x32\\xb1\\x57\\xb9\\x59\\x83\\x4f\\xa1\\x85\\xbb\\x6a\\x02\\x58\\x32\\x0b\\x8e\\xb0\\x5a\\x42\\x72\\x40\\xd3\\x76\\xee\\x6a\\xe7\\x6c\\x15\\x9c\\x35\\xdb\\xb0\\x14\\x07\\xfd\\xbc\\x92\\x71\\x70\\x64\\x4c\\x9b\\xdc\\x5a\\x0f\\xa6\\x98\\x3c\\xe7\\x92\\x81\\x3d\\x12\\x3f\\xc1\\xcb\\x7f\\x1b\\xd3\\x3c\\x6b\\x14\\xce\\xd6\\x87\\xa4\\x80\\xca\\x21\\x7a\\xba\\xd2\\x35\\xbb\\x89\\xd5\\xff\\xf0\\xbb\\xe1\\xd0\\xd0\\x07\\x34\\xf7\\x29\\x55\\x4e\\x0c\\x87\\xca\\x01\\xa1\\xd1\\x51\\x8f\\x2b\\x0a\\xc3\\x61\\x6b\\x37\\x87\\x29\\x26\\x28\\x08\\x43\\x96\\x0b\\x37\\x45\\xf8\\x3c\\xca\\x49\\x94\\x4c\\x1b\\x68\\xa3\\xf0\\x89\\x34\\x8c\\x35\\x4e\\x50\\x57\\xb6\\x5c\\x86\\x14\\xbe\\x2a\\x65\\x0f\\x7d\\x06\\xf4\\xcc\\xa6\\x3a\\xdf\\x04\\x25\\x69\\xd9\\x12\\x15\\xfe\\x8b\\x20\\xcf\\xf1\\xd8\\x53\\x9b\\x2a\\x73\\xe8\\xd1\\x92\\xb9\\x22\\xbf\\x74\\x41\\x5f\\x30\\x07\\x68\\x72\\x30\\xa6\\x47\\xbb\\x26\\x0b\\x25\\xb6\\xd5\\x6f\\x47\\xab\\x9c\\xd2\\x52\\x5b\\x2c\\xe3\\x55\\xd8\\xe7\\x7f\\x64\\xa6\\xa4\\xec\\xcc\\x51\\x90\\x61\\x44\\x77\\x79\\xf2\\xde\\x43\\x01\\xa3\\x67\\x56\\x3c\\xc1\\x61\\xb0\\xcc\\x31\\x3a\\xc3\\x68\\x9c\\x26\\x04\\x9d\\x05\\x09\\xbb\\x31\\x96\\x2f\\xd2\\x28\\xe6\\x8e\\xfb\\x09\\xc1\\xd9\\x24\\x30\\x14\\xea\\x76\\xb6\\xe0\\x36\\xf6\\x5e\\x73\\x57\\x80\\x8c\\x8f\\x7b\\xf5\\x50\\x4b\\x81\\xe9\\x72\\x6c\\x01\\xa6\\x9d\\x74\\x57\\xcd\\xec\\x1b\\xe6\\x6f\\xd2\\x24\\x71\\xf1\\x5f\\x78\\x56\\x3d\\xaa\\x3e\\xb5\\x9b\\x5a\\x15\\xd1\\x05\\x80\\xba\\xe8\\xfa\\x15\\x13\\x9e\\xac\\x9b\\x6e\\x18\\x3d\\x74\\x36\\x8b\\xc2\\x19\\xbb\\x90\\x42\\x17\\x0f\\x92\\x8a\\x6d\\x1c\\x5a\\xc4\\xcb\\xbc\\xbd\\x33\\xbd\\x58\\x75\\x5a\\x72\\x72\\xb9\\x74\\x55\\xdf\\xe7\\x6b\\x68\\x85\\x69\\x6f\\x62\\xb1\\x29\\xaa\\x30\\xe0\\xa8\\x6f\\xd6\\xb4\\xbc\\x34\\xb0\\xba\\x5c\\x59\\x90\\x34\\x37\\xb6\\x6c\\xc2\\xd0\\x52\\x6f\\x64\\xb1\\x21\\x54\\xd5\\x49\\xeb\\x65\\x8e\\xe3\\x89\\xd8\\x92\\x54\\x09\\x1e\\xd8\\x43\\x39\\x3c\\x51\\x7d\\x3b\\xe8\\x62\\x21\\xee\\xcc\\xb9\\x6f\\x2a\\xd2\\x5d\\x7e\\x9d\\x7a\\xee\\xb8\\x34\\xe8\\x56\\x10\\xe0\\x5d\\xac\\x20\\xb1\\xac\\x5a\\xb3\\x45\\xa5\\x76\\x9b\\x55\\x69\\xb6\\x08\\xd6\\x6e\\xb3\\x5a\\xcd\\x16\\x35\\xd4\\x6e\\xe9\\x4c\\x34\\xd7\\x6e\\x51\\x73\\x0d\\x17\\x35\\xd5\\x72\\x0b\\x08\\xaa\\xb4\\x5c\\xab\\xe3\\x7a\\x4d\\x17\\x6a\\xa2\\x58\\xb6\\xd4\\x4a\\xe0\\xf6\\xdb\\xee\\xdc\\x65\\xf0\\x60\\xf0\\x97\\x06\\x0f\\x2f\\x3c\\x31\\x45\\x87\\xf0\\x92\\x06\\x0d\\x21\\xa6\\x45\\xc5\\xc6\\x86\\xd9\\xc1\\x97\\xb2\\xa8\\xd4\\xd3\\xdc\\xe6\\xe9\\x6d\\x93\\xd6\\x94\\x46\\x74\\xb6\\xae\\x35\\x45\\x8f\\xa4\\xc5\\xca\\xbb\\x04\\xe5\\xea\\xea\\x56\\xc5\\x29\\x4b\\xe5\\x09\\x5f\\x0b\\x85\\xab\\x4e\\xb1\\x00\\x97\\x72\\xf5\\x1c\\x10\\x3e\\x00\\xac\\x89\\xf6\\x56\\x7d\\x14\\x68\\xab\\xdc\\x76\\x68\\x20\\xce\\x9f\\x0d\\x62\\xbb\\x29\\xe7\\x8a\\xd0\\x84\\x58\\xb7\\xa5\\x8d\\x6d\\xca\\x23\\x2d\\x9e\\x8d\\x7e\\xc5\\xb2\\xe3\\xff\\xe8\\x0a\\x69\\x53\\x5c\\x78\\xec\\xf8\\xbb\\x2c\\xa0\\xa9\\x7e\\xe3\\x5a\\x8f\\x78\\x23\\xd0\\xd7\\xf1\\xf7\\x76\\xaf\\x8e\\xbd\\xdd\\x1f\\x6f\\xef\\x5f\\xdf\\xde\\xbf\\xfe\\xbb\\xdf\\xbf\\x16\\x9b\\xb4\\x1b\\x88\\x65\\x53\\x93\\x96\\x55\\x6c\\x13\\x79\\x04\\xc3\\xfd\\x89\\xf4\\x27\\xa7\\x6b\\xb8\\x5f\\x73\\x9a\\xad\\x58\\x99\\xc4\\x71\\x90\\x68\\x0c\\xf1\\xa8\\xbe\\x14\\xe5\\x85\\x1a\\x42\\x45\\xbf\\x6c\\x1c\\x41\\xd7\\xab\\xb9\\x18\\xaa\\x82\\xed\\xdd\\xdb\\x67\\x7c\\xf1\\xdd\\x04\\x60\\xec\\x50\\x92\\x6b\\x7d\\x98\\x45\\x27\\x25\\x29\\x7a\\xf7\\xf6\\x99\\x70\\x6d\\x6b\\x06\\x98\\x88\\x7a\\xcd\\xd2\\x75\\x96\\x10\\xcd\\xd2\\x1c\\xda\\xc2\\xdb\\x40\\x3d\\xdb\\x7f\\xf3\\xe6\\xc5\\xb3\\x83\\x57\\xfb\\x6f\\xd0\\x8b\\x77\\xef\\xf6\\xdf\\xf9\\xe8\\x59\\xe1\\x79\\x14\\xf2\\xa6\\xf9\\x71\\xda\\x18\\xa3\\xee\\x16\\xa2\\xed\\xa2\\xad\\xae\\xe5\\x6c\\x04\\xc3\\x56\\xe6\\x6e\\x69\\x8b\\xab\\x22\\xdc\\x37\\x3f\\xd9\\x23\\x94\\x89\\x45\\x36\\xe1\\x66\\x5d\\x4b\\x95\\xc3\\x47\\x66\\x2c\\x16\\x87\\x22\\x34\\xc7\\x79\\x1e\\xb0\\x0c\\x49\\x77\\xee\\x88\\xd8\\xa0\\x54\\xa9\\x13\\xdf\\x07\\x8c\\x57\\xec\\x27\\x03\\x59\\xed\\x31\\x02\\x1f\\xfb\\xa8\\x98\\xf6\\x7f\\xbc\\xdf\\x7f\\xc3\\x66\\x37\\x2b\\x40\\xeb\\xa2\\x2d\\xf6\\x78\\xc0\\xf3\\x28\\x44\\x93\\x0b\\x09\\x23\\x14\\xc7\\xc6\\xc0\\x91\\xe8\\xa2\\x1a\\x1b\\x25\\x75\\x1c\\x70\\xc7\\x73\\x15\\x1f\\xf3\\xbc\\x2d\\x89\\x1c\\xbc\\x7a\\xfd\\x62\\xff\\xf0\\xc0\\x47\\xc2\\x8d\\x9d\\x12\\x31\\x1d\\xc4\\x3c\\x47\\x5b\\xa8\\x4b\\xff\\x05\\xe1\\x8c\\x0a\\x3c\\x6b\\x92\\xac\\x8d\\x81\\xc8\\x95\\xf9\\xf0\\x76\\x21\\xbe\\x5d\\x88\\xff\\xf6\\x0b\\x31\\x8b\\x66\\xfa\\x57\\x89\\x82\\xd2\\x3e\\xda\\x76\\xab\\xe0\\xdf\\xd7\\x18\\x6b\\xdb\\x4c\\x54\\x43\\xe5\\x4c\\x61\\xd8\\x94\\xf4\\xc4\\xf9\\x44\\x55\\x23\\x79\\x98\\x5b\\x0e\\x83\\x5b\\x99\\x33\\x83\\xc3\\x6c\\x2e\\x80\\x77\\x7d\\xfc\\xee\\x85\\x0c\\x7a\\xa2\\xf8\\x42\\x41\\xe5\\x92\\x60\\x8e\\xcb\\xe4\\x50\\x50\\xf8\\xe1\\x3c\\x4d\\xc0\\x2c\\x73\\x8d\\x42\\x80\\x07\\x49\\x9a\\x5c\\xcc\\xd3\\x65\\x01\\x49\\xf1\\x00\\x2a\\x0d\\x2a\\xb0\\x8d\\x14\\x7d\\x39\\x3f\\x53\\x2c\\xa7\\x05\\x8f\\xf9\\x36\\x8b\\x47\\x64\\xa8\\x51\\xf1\\xcd\\x32\\x85\\x06\\xff\\x34\\x4d\\xe3\\x2b\\x34\\xc6\\x61\\x34\\xc6\\x28\\x9a\\x88\\xb5\\x12\\xf3\\x1a\\x63\\x85\\x40\\x58\\x74\\x32\\xac\\x47\\x1d\\x14\\x0b\\x6b\\x61\\x24\\xa0\\xff\\x98\\x1c\\x32\\x7a\\x2b\\xa9\\x46\\xa3\\x18\\x35\\x85\\x97\\x88\\x2a\\xa1\\xde\\xa0\\x67\\xfd\\x39\\x82\\x96\\xa8\\x34\\x60\\x3b\\xd9\\x59\\x8e\\xc4\\x4a\\xcd\\x68\\x20\\x5a\\x66\\xbe\\x69\\xe2\\x7b\\xcd\\x15\\xe9\\xea\\xf6\\xec\\xdb\\xfb\\xad\\xfd\\xb5\\xd5\\xd9\\xe5\\xac\\x37\\x8e\\xf2\\x45\\x1c\\x5c\\xb0\\xdc\\x38\\x35\\x73\\x2b\\x8a\\xbe\\xd1\\x4b\\x96\\xb3\\xc3\\xa3\\x82\\x5f\\x55\\x37\\x5c\\x3f\\x45\\x4a\\x37\\x4d\\x52\\xcb\\x70\\x86\\xc3\\xe7\\xcc\\x2a\\xf2\\xbc\\xac\\xdb\\x2b\\xd9\\x72\\x7d\\x2c\\x31\\x21\\xd6\\x00\\x45\\xb4\\x5c\\x43\\xfc\\x40\\x4d\\x36\\xa3\\xdf\\x95\\x30\\x73\\x20\\x2a\\x6e\\x14\\x2d\\x79\\x34\\x4d\\x02\\xb2\\xcc\\xea\\xd0\\x02\\x95\\x73\\xe1\\x05\\x2a\\x5b\\x8f\\x97\\xa2\\x56\\x13\\xc4\\xb0\\x38\\xf1\\xeb\\xe3\\x41\\x84\\xf4\\x92\\x6c\\x2e\\x16\\x8a\\x20\\x19\\x17\\xe7\\x54\\x24\\x45\\x69\\x82\\xd1\\x24\\x4a\\x82\\xb8\\xd9\\x4d\\x7f\\xde\\x26\\x24\\x40\\xa5\\x5b\\x3d\\x24\\x1f\\x8d\\x22\\xa2\\x7b\\x10\\xd9\\xb2\\x0c\\x3e\\xc5\\xd9\\x05\\x99\\x71\\x17\\x90\\xf9\\x49\\xc4\\x44\\x71\\x3a\\xc5\\x6c\\x27\\x4d\\xc7\\xc0\\x21\\x19\\xb7\\x9a\\x05\\x20\\xd7\\x84\\x00\\xd7\\x99\\x19\\xaf\\x10\\x92\\xc5\\x37\\x20\\x44\\xe8\\x6a\\x99\\x29\\xcc\\x97\\x1f\\xd8\\x9e\\x1d\\x3c\\xed\\xfb\\xbb\\xe6\\xad\\xe0\\x99\\x1a\\x44\\xa0\\x61\\xa8\\x80\\x33\\xb1\\x85\\x36\\x87\\x13\\xd4\\xbb\\x63\\x6c\\x53\\xdc\\xe3\\x11\\x9d\\xf2\\x60\\xbe\\x22\\x23\\x22\\x77\\x85\\x90\\x3c\\xdc\\xb3\\x12\\x35\\xd8\\x27\\xb7\\x82\\x5a\\x0e\\xe4\\x00\\x36\\xb5\\x50\\xdb\\x3e\\xe1\\xcd\\x56\\x69\\x96\\xaa\\x9c\\x79\\x50\\x17\\x94\\x7c\\x14\\x0d\\xa8\\x78\\x71\\x5c\\x3a\\x10\\x85\\x55\\x3a\\xa1\\x54\\x5d\\x3e\\x4e\\x96\\x71\\x5c\\x13\\x6c\\xc7\\x3e\\x77\\x40\\xe0\\xa1\\x61\\x79\\x0e\\x2e\\xb3\\x6a\\x5e\\x10\\xcc\\x93\\x71\\xf6\\xf4\\x34\\x9b\\x4f\\xe9\\x8b\\x1e\\xe3\\x94\\x32\\x8d\\x84\\x48\\xe3\\xb1\\xed\\xed\\x3c\\x80\\xee\\xf6\\xc9\\x61\\x9b\\x51\\x7b\\xf8\\x8e\\xe5\\xd8\\x3b\\x62\\x05\\x44\\xfc\\x1e\\xd1\\xb4\\x72\\x8c\\x78\\xb4\\x7d\\x0c\\x22\\x48\\xf7\\x09\\x60\\x6d\\x38\\x6f\\x5f\\x08\\x7c\\xb0\\x42\\xc6\\x6c\\x9d\\x36\\xb8\\x05\\x21\\xa8\\xd0\\x8a\\xa6\\xd7\\xe3\\x43\\xf0\\xd0\\xa9\\xeb\\xe8\\xbd\\xd1\\x99\\x6d\\xe3\\x5e\\xd8\\x18\\x5b\\x72\\xae\\xce\\x54\\x61\\x9a\\x84\\x01\\xe9\\x69\\xdc\\x61\\xb7\\x50\\x9b\\x86\\xa6\\x76\\xed\\x13\\xb9\\x68\\xdc\\x6b\\x5f\\xdd\\x5e\\x12\\xd7\\xad\\x73\\x63\\xdd\\x51\\xc7\\x5e\\xc1\\x84\\xac\\x17\\x37\\xca\\x98\\x89\\x81\\xb7\\x3a\\x2e\\xc0\\xba\\x7b\\x97\\x19\\x41\\x75\\x28\\xdb\\x6d\\x46\\xe1\\x9c\\x3b\\x9e\\xd3\\x53\\xbd\\x32\\xfb\\x8e\\x55\\xb0\\x98\\x45\\xf5\\x17\\x10\\x8d\\xdb\\xf2\\x55\\x31\\x5f\\x06\\xd9\\xd4\\x10\\x85\\xa5\\xc2\\xa8\\x65\\xe5\\x41\\xbe\\xfa\\x4b\\x70\\xf6\\x0e\\x90\\x9f\\x44\\x20\\x4d\\x78\\x3e\\x15\\xed\\x9b\\x21\\xc1\\x44\\x72\\xa0\\xcf\\x85\\xc2\\xa4\\xb6\\xbb\\xdb\\x7f\\x44\\xc5\\xe7\\xc7\\x34\\x4a\\x7a\\x9d\\x0e\\xd0\\x49\\x92\\x92\\x57\\x5a\\x3f\\x05\\xca\\xca\\x16\\xac\\xa5\\x46\\x71\\xcb\\x01\\x25\\x5d\\x71\\x96\\x8f\\xf3\\x5c\\x4a\\x25\\x3e\\x8f\\xef\\x95\\x37\\x7c\\x03\\xc8\\xf4\\xc1\\x1e\\xf3\\x64\\xf3\\xd4\\x21\\x03\\x7c\\xad\\x36\\x4b\\x75\\x6b\\xe5\\xa7\\x64\\xbb\\x16\\x7d\\xe9\\x23\\xef\\xdb\\x37\\x73\\x79\\x7e\\xa4\\x05\\x6d\\x01\\x3c\\x61\\x96\\xd8\\xd0\\xe0\\xe0\\xde\\x57\\xbf\\x54\\xdf\\x1f\\x3b\\xd1\\xc8\\x19\\x67\\x99\\x27\\xfa\\xa9\\x70\\x4d\\x52\\x28\\xa2\\x88\\x02\\xab\\x8e\\x56\\xf5\\xaa\\x70\\xe1\\xb4\\xe8\\xc6\\xed\\x90\\xaf\\xd3\\x44\\xc3\\x9e\\xf8\\x32\\x62\\xa2\\xb4\\x61\\x6f\\xc5\\x8e\\xb1\\x75\\xd2\\x26\\xf5\\x23\\x0f\\x30\\x84\\x7d\\x8a\\x01\\xa7\\xe8\\xb1\\xd0\\x55\\x40\\xa3\\x6a\\xb9\\xd1\\x62\\xd4\\x0f\\x27\\x10\\x83\\xea\\x71\\x97\\x1b\\xd6\\xa3\\xdc\\xfe\\x64\\x78\\xbc\\x0c\\xb1\\xc2\\xa5\\x41\\x18\\x7a\\x48\\x64\\x7d\\xad\\xbb\\x91\\x12\\x84\\xe1\\x91\\x28\\xca\\xb7\\x2f\\x14\\xff\\xe2\\xb7\\x14\\xa4\\x8f\\x75\\x5a\\x18\\xe4\\xb3\\x68\\x42\\x7a\\x7d\\xe4\\x5b\\x93\\x27\\x5f\\x55\\xdf\\x8a\\x97\\x71\\x1a\\xc3\\xb0\\xe2\\xae\\x86\\xc7\\xe3\\x82\\x38\\x0b\\x8c\\x71\\x8c\\x09\\x96\\x78\\xb1\\x3d\\x5e\\xdc\\x65\\xb9\\xcc\\xaa\\x0f\\xfa\\xc3\\x9d\\x8c\\xc5\\x31\\x13\\xbc\\x1f\\x00\\x9f\\x96\\x36\\xb9\\xc1\\x14\\x93\\x97\\xcb\\x38\\x96\\x72\\x41\\x65\\x5e\\xee\\xb0\\x65\\xb5\\x08\\x47\\xb6\\x44\\xcd\\x79\\xb2\\x52\\xce\\xd5\\x70\\x49\\x73\\x7e\\x54\\x7a\\xa9\\xe5\\x47\\x67\\x57\\xeb\\x33\\xa3\\xc1\\x88\\x3c\\xb1\\x56\\x3d\\x23\\xae\\xc2\\x84\\x3a\\x03\\x6a\\xfa\\xc7\\xca\\x0c\\x78\\xd3\\xcc\\x57\\xc7\\x78\\x95\\x4c\\xd7\\x94\\xe1\\x9a\\x33\\x5b\\x33\\x46\\x33\\x62\\x56\\x38\\x9c\\x1a\\x9b\\xac\\x9f\\xd7\\xcc\\x41\\xd7\\xc3\\x3d\\x50\\x2f\\xeb\\x31\\xce\\x0a\\x4c\\xd3\\x96\\x61\\x36\\xcd\\x2c\\x37\\xc9\\x28\\x55\\x4c\\xe2\\x64\\x90\\x26\\xcc\\x01\\x33\\x86\\x4b\\x7d\\x34\\xf5\\x35\\xc4\\x0d\\x23\\xab\\xe9\\x6f\\x8a\\x17\\xa7\\x08\\x10\\x23\\xf4\\xa8\\x49\\x96\\xce\\xb9\\x25\\xb6\\xce\\x52\\x69\\x65\\x44\\xba\\x2e\\x53\\xa5\\x06\\x60\\x3b\\x7b\\x24\\x90\\x89\\xc9\\x34\\x48\\x7e\\xab\\xf9\\x2a\\x77\\xdb\\xe7\\xab\\xac\\x6a\\x6e\\xa7\\x3e\\xb0\\x05\\xdc\\x20\\xd2\\x8c\\xb8\\x60\\x72\\xa7\\x3a\\x5b\\x9e\\x99\\x34\\xd3\\xb2\\x19\\xdb\\x8a\\xe3\\x57\\x9d\\x3d\\xb3\\x96\\xfb\\xd4\\x88\\x6c\\x2b\\x44\\x03\\x36\\x82\\xb8\\x42\\xfc\\x55\\x5c\\x8f\\x6c\\xc5\\x2f\\x37\\x95\\xda\\x93\\x56\\xd1\\x8f\\xf9\\xea\\xd6\\x1c\\x66\\x62\\x96\\x10\\x1c\\x29\\x05\\x8f\\x41\\x7e\\x83\\x0a\\x42\\xd9\\x43\\x91\\x45\\x9e\\x60\\xd5\\xa3\\x62\\x7d\\xe6\\xb0\\x1d\\x3b\\x07\\x0a\\x5e\\x41\\xac\\x74\\xe8\\xd6\\xe6\\xc2\\xc8\\x4f\\x5a\\xe5\\xcf\\x5d\\x97\\xb5\\x74\\xc5\\x44\\xa5\\x3f\\xb5\\x71\\x2a\\xdb\\x54\\x82\\xf8\\x61\\xb5\\x1f\\xcd\\x6b\\x4e\\xf7\\x80\\x2f\\x8a\\x59\\x52\\x06\\x62\\xd1\\xcb\\x2e\\xc4\\x53\\xe6\\xb0\\x32\\x1c\\xa2\\x83\\xfd\\xe7\\xfb\\x3e\\xca\\x30\\xbf\\xa6\\xed\\xa1\\x3c\\x15\\xb7\\x20\\x0b\\x97\\xd2\\xf2\\x7a\\x65\\xc0\\x5d\\x20\\x06\\xb4\\x5e\\x44\\xba\\x39\\x4a\\x70\\x88\\xf3\\x3c\\xc8\\x2e\\x28\\xe3\\xce\\x83\\x4f\\x18\\xe5\\x94\\x84\\xbb\\xf8\\x9c\\xe0\\x24\\x8f\\xd2\\xa4\\x8b\\xce\\xd2\\xec\\x13\\x37\\x48\\xce\\x97\\x31\\x89\\x16\\x31\\x46\\x0b\\xe1\\x94\\x99\\x7f\\xa7\\xb3\\x0d\\xc1\\xc9\\xb8\\x36\\x9b\\xe4\\xf0\\x7b\\x04\\xc6\\x9d\\xfa\\xc1\\x0c\\x64\\xc5\\xdb\\xd4\\xcd\\x3b\\x12\\x2c\\x30\\xa6\\x46\\x09\\x04\\x1e\\xf3\\xe5\\x16\\x36\\x32\\x15\\xad\\x0c\\x24\\x2e\\xab\\xf2\\xf1\\xdd\\xa1\\x83\\x38\\xb2\\xeb\\x80\\xbc\\x2a\\x3f\\xae\\x3a\\x8e\\x45\\x05\\x39\\xb5\\x6d\\x7d\\x3c\\x22\\xed\\x26\\xd4\\x72\\xcb\\x28\\x0f\\x60\\xbb\\x8d\\x22\\x26\\xe8\\x18\\x14\\x8c\\xe7\\xc2\\x85\\x55\\x10\\x38\\x2d\\xe4\\x6f\\xaa\\xb0\\xc9\\x4b\\x14\\x02\\x5d\\x5c\\xb8\\xd4\\x87\\x50\\xa1\\x17\\x8a\\xea\\x39\\x26\\xef\\xb4\\x55\\xb1\\x07\\xa5\\x30\\x6d\\x75\\x36\\xd2\\x8c\\xbc\\x22\\x77\\x9e\\x09\\xa8\\x2c\\x80\\xa2\\x3a\\x3a\\xa5\\x1f\\x59\\x66\\x65\\x34\\x15\\x0d\\x5c\\x03\\xa2\\xb4\\x5f\\x66\\xb4\\xf9\\xf3\\x81\\x26\\x76\\xcb\\x1f\\x8f\\xcc\\x72\\x52\\xd8\\xb2\\xff\\xd6\\xdb\\x42\\xb2\\xf2\\x2f\\xd6\\x7b\\x45\\x9e\\xca\\xaf\\xf0\\x61\\x12\\x3e\\x37\\xae\\xd1\\xbb\\x17\\x3c\\x8e\\x5d\\x3d\\xe1\\xa3\\x63\\x09\\x73\\x2c\\x5a\\x1d\\x7f\\x8f\\x5d\\x53\\x92\\xe8\\xef\\xf8\\xf7\\x1f\\x5c\\x1d\\x7b\\x7b\\xdb\\xb7\\x0e\\xd1\\xb7\\x0e\\xd1\\x7f\\x2f\\x87\\x68\\xe1\\x05\\x2d\\x02\\x6a\\x83\\x6e\\xd0\\xb9\\xaf\\x3e\\x44\\xe8\\x1f\\x78\\x32\\xc9\\xf0\\x05\\xfa\\x33\\x8a\\xc3\\x4f\\x18\\xfd\\xfc\\x11\\x4f\\x26\\x2e\\xa7\\x68\\xd4\\xce\\x87\\x9a\\x15\\x8f\\x82\\x04\\xed\\x07\\x49\\x88\\x03\\x56\\x3a\\x0a\\x12\\x77\\xf1\\x97\\xc1\\x09\\x2d\\xfe\\x47\\x3a\\xc5\\x71\\x4e\\x70\\x1c\\xe3\\x0c\\xfd\\x3c\\x61\\x0f\\xdd\\x95\\x7e\\x0d\\x4e\\xd1\\x9f\\x69\\x3a\\x46\\x3f\\x4f\\xd7\\x71\\xe6\\xde\\xc4\\xc6\\xd5\\xda\\xb6\\xba\\x74\\xc0\\x67\\x69\\x72\\x8a\\xa9\\xfc\\x0b\\xd0\\x34\\x62\\xb4\\x9e\\x2e\\xa2\\x90\\xe9\\x82\\x68\\x86\\xcf\\x11\\xbf\\xc5\\xe2\\x31\\x4e\\x09\\xe2\\x3c\\x45\\x41\\x1c\\xa7\\x67\\x39\\xd3\\xb9\\xb9\\x5f\\x40\\xee\\xcc\\x8c\\x21\\x54\\xbe\\xd7\\xd1\\x39\\x1e\\x5f\\xf1\\xc2\\xa0\\x3d\\x45\\xf8\\xd9\\x81\\x1a\\x21\\xcb\\xb8\\x96\\xb2\\x23\\x5e\\x35\\xa8\\x01\\xf7\\x48\\xb0\\xcc\\x22\\x3d\\xdd\\x4b\\x05\\x5d\\x5e\\x32\\x77\\xc6\\x74\\xa2\\xb8\\xaf\\x74\\x0b\\xb7\\x96\\xae\\x6d\\xa9\\xd0\\xfc\\x57\\x8c\\x2d\\x2c\\x77\\x26\\xe1\\xc0\\xf6\\xa4\\x4b\\x04\\x08\\x00\\xb7\\xf4\\xed\\x4f\\x98\\x17\\x51\\x9f\\xf5\\xba\\xed\\xec\\x8b\\xd5\\x30\\x16\\x38\\x28\\xf8\\xb4\\xe6\\x3c\\x39\\xc9\\xd2\\xf9\\x21\\x99\\x3c\\xec\\x99\\xae\\x19\\x57\\x4c\\x93\\x18\\xf2\\xe5\\x43\\x7a\\x39\\x9a\\xb7\\xa5\\xd3\\xc2\\x25\\x4c\\x28\\xf6\\x1e\\x9d\\xf0\\x53\\x9c\\x45\\x13\\x96\\x02\\x25\\xc3\\x61\\x40\\xc5\\x68\\xb9\\x91\\x41\\x77\\xef\\xa2\\x38\\xf8\\xcf\\x05\\x8a\\xd3\\x60\\x8c\\xc6\\x17\\x49\\x30\\x8f\\x42\\x94\\x26\\x38\\x67\\xbd\\x89\\xa9\\x2e\\x3b\\xe2\\x64\\x43\\x85\\xa1\\xb0\\x1c\\xb0\\x52\\x32\\x22\\x92\\xec\\xdc\\x2a\\xa5\\xce\\xfa\\x14\\x93\\xfd\\xc2\\xc4\\x53\\xee\\x9f\\x0a\\xeb\\x18\\x9d\\x58\\x5b\\x21\\x69\\x9a\\x71\\x40\\x35\\xa1\\x89\\x29\\x95\\x46\\x9d\\x7a\\x47\\xba\\x4a\\x27\\x30\\xa7\\x4f\\xa0\\x5e\\x2c\\x3f\\x8b\\x48\\x38\\xeb\\x41\\xa3\\x40\\xcc\\x32\\x97\\x63\\x61\\x07\\xf2\\x9d\\x21\\x07\\xb9\\x96\\xb7\\xcc\\xb0\\xf0\\x6e\\xf0\\x98\\x0b\\x6c\\xc8\\x59\\x9a\\x5b\\x74\\x66\\xf8\\xbc\\xca\\x7a\\x56\\x3a\\x7a\\x18\\x0f\\x1c\\x99\\xd7\\x1b\\x54\\xd5\\x1c\\x31\\xb8\\x1f\\x46\\xc5\\xf9\\xbd\\x40\\xac\\xe1\\x54\\xc5\\x6b\\xf5\\xd1\\x63\\x3e\\x30\\xd6\\xa4\\x90\\x02\\x7d\\xe4\\x4b\\x81\\x20\\x8a\\xb9\\x37\\xaf\\xe0\\x0b\\x29\\x75\\x9c\\x20\\xf1\\x61\\xf8\\xc6\\xb0\\xec\\xa4\\x37\\xf2\\x43\\x79\\xb1\\x2c\\x4d\\x7f\\xb9\\xcb\\x92\\x54\\x6d\\xd7\\x5d\\x4e\\x1c\\x58\\x94\\x85\\x65\\x98\\xae\\x4a\\x28\\x98\\xef\\xa5\\xdf\\xca\\x25\\x73\\x50\\xd4\\xeb\\x57\\x41\\xbd\\x4a\\xcb\\xa2\\x96\\xe3\\x40\\xda\\x9e\\x35\\x41\\xf2\\xb3\\x59\\xd7\\xaf\\x9a\\x38\\x07\\x0f\\x2a\\x0d\\xc3\\x6b\\xdd\\x93\\xf1\\x98\\x07\\x70\\x2a\\x8c\\xde\\x41\\x32\\x46\\x39\\x26\\x39\\x5a\\x2e\\xd8\\x0b\\xa1\\xd7\\x32\\x61\\x18\\x11\\x9c\\xd1\\xa5\\x3a\\x3d\\x15\\x7b\\x63\\x7e\\xca\\x21\\xb7\\x5e\\xec\\xa3\\x44\\x6f\\xfa\\x3d\\x9d\\xe6\\x4f\\xc8\\x7b\\x12\\x64\\x8a\\xd5\\xd3\\x3c\\x53\\xc8\\x71\\x3c\\xb1\\xdf\\x4e\\xaa\\x32\\x3d\\x0d\\x4d\\x91\\xa8\\x74\\xa4\\xae\\x87\\xb4\\x69\\x67\\xf2\\x26\\x19\\x09\\x73\\x8a\\x09\\xb7\\x31\\xd3\\x46\\x8c\\x70\\x98\\xcc\\xda\\x56\\xa2\\x26\\xd7\\x47\\x22\\xed\\x27\\x86\\xc4\\x64\\xce\\x1d\\x55\\x62\\x93\\x15\\x98\\x62\\xd2\\x33\\x62\\xd7\\x89\\x7b\\xae\\x4e\\x5d\\x7a\\x38\\x44\\xe3\\x34\\xe9\\x8a\\x00\\xc0\\x14\\x76\\x31\\x05\\xec\\x92\\x2d\\xf3\\x5f\\x97\\x0f\\xe5\\x85\\x30\\x96\\x32\\x64\\x30\\x18\\xa0\\x8f\\xcb\\x9c\\x47\\x11\\xc3\\xf1\\x84\\xae\\x50\\x4e\\x6b\\x50\\x4d\\x14\\xd4\\x06\\x11\\x50\\x9d\\x81\\x8f\\x0d\\x71\\x56\\x0c\\xb7\\xda\\x32\\xc2\\x0b\\x81\\x66\\x15\\x7e\\x2d\\xb8\\x69\\xcc\\x56\\x1e\\x73\\x0e\\xbe\\x4c\\xac\\xc1\\xdf\\x3c\\x72\\x72\\xed\\xdd\\x5f\\x74\\x73\\xfc\\xb6\\x48\\xe3\\x98\\x13\\x72\\x53\\x5e\\x33\\xf8\\xa8\\x6c\\xc0\\xe4\\x21\\xcb\\x18\\xc9\\x8e\\x81\\x92\\xd7\\xc5\\x45\\x72\\x8d\\x90\\xd3\\x1a\\x52\\x16\\x54\\x96\\x3a\\xe9\\x4c\\xde\\xfb\\xa0\\x6c\\x22\\xd1\\x04\\x11\\x40\\x55\\xa4\\x41\\xf9\\x51\\xe9\\x35\\x5d\\xdb\\xf6\\xd5\\x96\\x82\\xd7\\xa3\\xde\\xf2\\xa2\\x3e\\x43\\x45\\x79\\x88\\xf6\\xd8\\x78\\x50\\x36\\xe6\\xcb\\x4a\\x6e\\xf2\\xde\\x08\\x5a\\xd1\\x46\\x19\\xab\\xb5\\x45\\x8d\\x8d\\x41\\xb7\\xd6\\x0d\\x98\\x70\\x7e\\x9b\\xc6\\x31\\x95\\xc1\\x36\\xe4\\x9c\\x4b\\x7c\\x5e\\x35\\xa2\\x9b\\xe0\\x39\\x4e\\x08\\xb3\\xc0\\x0c\\x28\\xe5\\x33\\x94\\xd8\\x8b\\xfd\\x42\\x84\\xc0\\x38\\xe2\\x18\\x67\\xec\\xf1\\x6a\\x7c\\xac\\x17\\xbc\\xf2\\x90\\xf6\\xda\\x2b\\x99\\x43\\xbc\\x51\\x73\\x67\\xf1\\xe3\\x27\\xc6\\x57\\xea\\x6e\\xcc\\x4c\\xdc\\x6d\\xb1\\xa2\\xb1\\xcb\\xf7\\x90\\x79\\x04\\x5a\\x48\\x0e\\xe0\\xec\\xd3\\x13\\x46\\x87\\x67\\x19\\x66\\x63\\x66\\x11\\x0f\\x9e\\x55\\x04\\x37\\xad\\xf4\\x5f\\xd6\\xf1\\x07\\xd8\\xfc\\x57\\x31\\x86\\x3b\\xad\\xd8\\xb5\\x66\\x59\\xd8\\x7c\\xae\\x03\\x59\\x91\\x32\\x13\\x49\\xa7\\x3f\\xeb\\xd6\\x71\\xed\\x7d\\xe3\\x52\\xad\\x29\\x15\\x33\\x43\\x19\\x03\\x6a\\x59\\xe8\\xd3\\x1f\\x00\\x35\\x24\\x65\\xb9\\xa3\\x57\\x15\\x1c\\x2d\\xae\\x07\\x59\\x05\\xc4\\x36\\xe9\\x59\\x5d\\xb9\\x72\\x19\\x70\\x16\\x51\\x8f\\xf3\\x8b\\xef\\xb5\\xe3\\x1c\\x24\\xf8\\x4c\\x9c\\xe6\\xab\\xb8\\xf3\\xb4\\xa0\\x8c\\x74\\xf1\\x88\\xc6\\x60\\xfa\\xca\\xea\\x45\\xa3\\x46\\xac\\xf5\\xc2\\x93\\x0a\\x7d\\x2b\\x3c\\x69\\xbd\\x3e\\x20\\x25\\x43\\x7b\\x3a\\xa9\\xe2\\x2e\\x23\\xef\\x72\\x95\\x58\\xad\\x68\\xa5\\x1a\\x40\\x5b\\x7e\\x56\\x9d\\x8d\\x69\\xc2\\x8a\\x92\\xdf\\xd8\\xa1\\x15\\xd2\\x3d\\xb2\\x12\\x9e\\x3f\\xc3\\xec\\xa0\\x95\\xaa\\xd3\\x0b\\x9c\\x8c\\xd9\\x6d\\xc4\\x82\\x9c\\x82\\x9c\\x59\\x58\\x93\\x9c\\xf2\\x8c\\x95\\xc3\\xa7\\x6c\\x30\\x9d\\xb0\\x4a\\xb4\\x32\\xdd\\x03\\xf7\\xb9\\x75\\xb5\\x80\\x66\\x99\\x04\\x79\\x1e\\x4d\\x13\\x3c\\x1e\\xb8\\x61\\x37\\x69\\x19\\x5a\\xc5\\xaa\\xe6\\xbb\\xd8\\x81\\x83\\x4e\\xbc\\xa8\\x62\\xca\\xc1\\xee\\xa1\\x1b\\x79\\xca\\x88\\xcb\\xcb\\xf9\\x28\\x56\\x75\\x8c\\x20\\xce\\x70\\x30\\xbe\\x28\\xa3\\x7b\\x97\\xea\\x86\\x9d\\x38\\x08\\xad\\x4b\\xe3\\xba\\x9a\\x24\\x75\\xa3\\xb6\\xe3\\x8f\\x26\\x3d\\x03\\x8a\\x22\\x25\\x23\\x60\\xcc\\x93\\x9f\\x52\\xa6\\xf0\\x75\\xcf\\x8d\\x2b\\xb6\\x8a\\xd3\\xad\\x2f\\xc7\\x45\\x34\\x9f\\xe3\\x71\\x14\\x10\\x1c\\x5f\\xb8\\xc0\\x11\\x0c\\x18\\xb6\\xe7\\x36\\x75\\x9f\\xc9\\xba\\xeb\\xd5\\x24\\x21\\xa8\\xcb\\x9d\\x02\\xdc\\xfe\\x2a\\xc2\\x12\\xc0\\xfe\\x25\\x1c\\x29\\x8a\\x4f\\x0f\\x1f\\xb6\\xe6\\xc8\\xe3\\x58\\xa4\\x75\\xa9\\xcf\\xef\\x67\\x2a\\xf0\\x9b\\x26\\x58\\x6d\\x19\\x81\\xb0\\x62\\xd0\\x87\\x70\\x8f\\x71\\x23\\x44\\x99\\x53\\xc0\\x67\\xe8\\x6a\\x5d\\x44\\xa8\\x3b\\xa6\\xe6\\xf8\\xb0\\xf6\\x84\\xe9\\x42\\x6e\\x09\\x75\\x04\\xb4\\x5c\\x41\\x59\\x78\\xe8\\x79\\x7a\\x2a\\xcf\\x6e\\x50\\x90\\x5f\\x24\\xa1\\x65\\x0a\\xa8\\xda\\x3a\\x43\\x2b\\xe2\\x32\\x61\\xb1\\x38\\x35\\x44\\x2a\\xbb\\x48\\x07\\xf6\\x9d\\xb2\\x5d\\x8d\\x82\\xd1\\xa6\\xa7\\x46\\x6a\\xac\\x35\\x43\\x54\\xac\\x35\\x99\\x98\\xca\\xdd\\x24\\xe8\\xb4\\x59\\xb4\\xe4\\x52\\x1f\\x8d\\x3d\\x51\\xcd\\xf5\\xdb\\xe1\\x10\\xbd\\x9a\\x94\\x2b\\x4c\\x94\\x17\\xb1\\xd6\\x2e\\xb0\\xc8\\x3c\\x82\\x22\\x82\\xec\\xac\\x75\\x65\\xfd\\xb3\\x19\\x66\\xee\\x88\\x02\\x7b\\x7d\\xc4\\x17\\xa9\\x1c\\x45\\x04\\x5e\\xa6\\xc0\\x2d\\x97\\xc5\\xa4\\x66\\xad\\xca\\x55\\x1b\\x9a\\x56\\xd1\\x83\\x49\\x38\\x5a\\x98\\x6b\\x94\\x61\\x28\\xfc\\x99\\x8a\\xcf\\x1b\\x4e\\x7d\\x63\\x68\\x8e\\x19\\x36\\xef\\x29\\xc6\\xe9\\xb4\\x0e\\x1e\\x64\\x08\\xf0\\x0a\\xed\\x98\\xb5\\xe6\\xd3\\xb5\\xb7\\xfa\\x5e\\xd3\\x55\\x55\\x2a\\xd4\\x16\\xc9\\x67\\x9a\\x31\\x6b\\x7b\\x3a\\xb6\\xf2\\x81\\x09\\x15\\xf1\\xd5\\x73\\xfe\\xc0\\x17\\x34\\xde\\xeb\\x0f\\xf8\\xce\\x2a\\x0c\\x64\\x5e\\x55\\x96\\x24\\x04\\x8f\\x11\\x95\\x5a\\xb3\\x2c\\x4d\\xd2\\x65\\x5e\\x24\\x59\\x15\\xce\\x6e\\x74\\xf7\\x66\\x26\\x05\\xe2\\xcd\\x08\\xf5\\x0a\\xca\\x28\\x06\\x5f\\x5e\\x67\\xbb\\x9c\\x51\\x73\\x82\\x75\\x07\\x01\\xa4\\x2d\\x35\\xa7\\x8d\\x0d\\xd0\\x83\\x6d\\xd2\\x6b\\xb7\\x8e\\x59\\xfe\\x33\\x7c\\x8e\\x0c\\x4f\\xd1\\x5a\\xef\\x99\\xab\\x63\\x6f\\x6f\\xe7\\xd6\\x3f\\xe6\\xd6\\x3f\\xe6\\xef\\xe5\\x1f\\x53\\xf2\\x5a\\xe1\\x2a\\x53\\x9e\\xad\\x6d\\x22\\x6a\\xa0\\xa8\\xb4\\x82\\x23\\x4b\\x5d\\xe0\\xdf\\xee\\x32\\xe7\\x07\\xfc\\x21\\xe9\\xaa\\xa7\\xda\\x2b\\x05\\x22\\x4c\\x26\\xd1\\x14\\x2c\\xcf\\x5f\\x99\\x15\\x5e\\x9d\\x04\\x89\\xee\\x15\\x13\\x9d\\x04\\x09\\xe4\\x0f\\xa3\\x96\\xa2\\xbf\\x99\\x13\\x8c\\x6b\\x06\\xc4\\x4d\\x08\\x76\\x1c\\xc6\\xa6\\x01\\xf1\\x4b\\x6a\\xdc\\x0f\\xe6\\x24\\x9a\\x8a\\x00\\xbf\\x4a\\x1d\\x0d\\x63\\xe2\\x60\\x82\\x57\\x7a\\x1a\\x4d\\x8d\\x23\\x51\\xad\\xac\\x38\\xa8\\xe0\\x47\\x68\\x97\\xbc\\xe4\\x65\\x51\\xe7\\x4a\\x2b\\x5b\\x64\\x95\\x2a\\xdf\\x57\\x5d\\x37\\x62\\x87\\x15\\x0e\\x18\\xb4\\x0d\\x2c\\x1f\\x4d\\x65\\x78\\x2e\\x92\\x16\\x6d\\xc8\\xe2\\xf0\\x3a\\x20\\x12\\xa6\\x66\\x58\\x78\\xd5\\x28\\x67\\xc2\\x5a\\x9f\\x27\\xe5\\x73\\x47\\xc7\\x27\\x6a\\x4d\\xaa\\xdb\\x52\\x89\\x96\\x93\\x2e\\xba\\xbc\\xb4\\xdf\\x09\\xb3\\x0c\\xfc\\x12\\x07\\x59\\x1c\\xd1\\xaa\\x15\\x20\\x27\\x8b\\x25\\x79\\x8e\\x27\\xc1\\x32\\x06\\x8f\\xb1\\x9b\\xc2\\x4e\\x37\\x37\\x66\\xff\\x85\\x87\\x51\\x85\\x2b\\x09\\xa7\\xef\\xc1\\x58\\x81\\xa0\\xea\\xfa\\x87\\x8c\\x09\\xe4\\x3c\\x75\\x57\\x41\\x34\\x5c\\x5e\\xad\\x61\\x7f\\x89\\xf1\\xba\\x82\\x4e\\xf1\\x4d\\x23\\x6d\\xd5\\x41\\x44\\x1a\\x30\\x15\\x1d\\x28\\xc5\\x1a\\x20\\x52\\x12\\xf9\\x6f\\xf8\\xbc\\x02\\x75\\xf2\\xbb\\x21\\x2e\\x38\\xd2\\x72\\xe5\\x72\\x46\\x3a\\x41\\x81\\x96\\x20\\x91\\xe5\\xfb\\x2c\\x7c\\xeb\\x0a\\x5f\\x39\\x2a\\x50\\x7e\\x7b\\xf1\\xdf\\x35\\x72\\x84\\xb5\\x49\\x75\\xa9\\x4a\\x09\\x22\\x8f\\x3a\\xb5\\x34\\xe6\\xce\\x6b\\x8b\\x79\\x9d\\xe0\\xb0\\x3b\\x85\\x4e\\x64\\x4c\\x9f\\x3b\\xd5\\x8d\\x44\\x71\\x05\\x62\\x3f\\x2f\\x2f\\x0d\\x2a\\x7f\\x12\\x86\\xe9\\x92\\x5d\\x26\\x32\\x29\\x4a\\xad\\x57\\x91\\x60\\x49\\x76\\xc3\\x60\\x65\\x57\\x64\\x45\\x8c\\x02\\xd8\\xaf\\xa5\\x7a\\x87\\xab\\xf6\\x4b\\xd2\\x3e\\xfa\\x8c\\xd8\\x55\\x1a\\x34\\x8f\\xa6\\x33\\xae\\x4a\\x14\\xe9\\xe6\\x85\\x99\\xda\\x09\\x16\\x49\\x9b\\x01\\x45\\xd2\\x6a\\x90\\x8e\\xba\\xd3\\x20\\x7f\\x9b\\x45\\x21\\xee\\x7a\\x88\\x7e\\xa7\\xff\\x18\\xe5\\xd0\\x2f\\x49\\x9a\\x84\\x18\\x8a\\xfd\\xf6\\x09\\x83\\xd7\\x09\\x8c\\xe8\\x6f\\x9f\\xf0\\x45\\xdb\\xf8\\x6f\\xac\\x65\\xe7\\x6c\\xf0\\x16\\x47\\x8a\\x4b\\xe2\\x73\\x1c\\x46\\xf3\\x20\\xee\\xa9\\x05\\xea\\xe3\\x46\\xc1\\x6e\\x3d\\x5f\\x9a\\xff\\x94\\x1c\\xa9\\x37\\xce\\x86\\x50\\xdf\\xd7\\xc7\\x8d\\x15\\x2d\\x30\\x68\\xea\\x78\\xec\\xfa\\xb8\\x6a\\xd4\\x8c\\xa7\\x6e\\x59\\xaa\\x3d\\x4b\\x15\\xb4\\xf6\\x0e\\x4f\\xa3\\x9c\\xbc\\x4d\\xd3\\x9b\\x10\\xfc\\x7f\\x63\\x52\\x9b\\xe0\\xbf\\x17\\xa1\\x35\\x11\\xde\\x42\\xcb\\xb2\\xa4\\x37\\x73\\x08\\xcb\\x85\\xff\\xb9\\x10\\xdd\\x8d\\x74\\xaf\\xd6\\x42\\xfb\\x1c\\xd6\\xb7\\xc4\\xfb\\x1a\\x2d\\xab\\x56\\x4c\\x93\\xf3\\x3e\\x1c\\xbd\\xfb\\xdc\\x3c\\x1b\\xe8\\x91\\xf3\\x81\\xba\\xad\\xbe\\x23\\x2d\\xa4\\xd6\\x04\\x1a\\x05\\x8b\\xc8\\xee\\xa9\\x9c\\x40\\xbd\\x80\\x75\\x5f\\x9d\\xbe\\x57\\x70\\xcd\\xe2\\x8d\\x54\\x77\\x67\\x95\\x06\\xfb\\x34\\x4b\\x99\\x07\\x4f\\xe7\\x03\\x26\\x6c\\xe1\\xca\\xec\\x95\\x5d\\x63\\x1a\\xe4\\x70\\xf9\\x69\\x60\\x1e\\xc3\\xf1\\x87\\x8c\\xfb\\x94\\x2a\\xa5\\x0e\\xab\\xbc\\xb7\\x6b\\xca\\xcb\\x1d\\x60\\x35\\x28\\xfa\\x25\\x33\\x69\\x9f\\x0f\\x72\\x72\\x3e\\x78\\x8e\\xf3\\xf0\\xc3\\x3e\\xc0\\x69\\xda\\xfb\\x0f\\xaf\\x92\\x7c\\xa4\\x3d\\x19\\xbc\\x32\\x9d\\x98\\x25\\x71\\xed\\x7f\\xd8\\x5f\\x92\\x7c\\x04\\xf9\\xdf\\x5b\\xfd\\x0e\\x68\\x51\\xc7\\x99\\x87\\x5d\\xd0\\x16\\x12\\xe9\\xd2\\x95\\x16\\x14\\x95\\xa4\\xfe\\x61\\x1f\\x8d\\x5c\\x77\\x9d\\x91\\x76\\xb4\\xa5\\xa2\\x2e\\x5d\\x92\\x01\\x0b\\x0d\\x74\\x67\\xe4\\x8c\\xfb\\x27\\x3f\\xac\\x93\\x81\\x88\\x89\\x24\\x2b\\xb6\\x3d\\xa2\\x90\\xa0\\xb0\\xfa\\x79\\x8e\\xc9\\xe0\\xe0\\x53\\x52\\x31\\xba\\xb2\\xe3\\x67\\x2c\\x42\\x4f\\x78\\x61\\xc6\\xa1\\x15\\x7e\\xce\\xfc\\xd9\\x0c\\x9f\\xcb\\x38\\xb4\\xb6\\xd4\\x74\\x0c\\x5f\\x42\\x51\\xf4\\xd0\\xef\\x57\\x1d\\xbd\\x94\\x10\\xfd\\xe1\\xa4\\x48\\xbd\\xdd\\x3f\\x00\\xe2\\x5c\\x0d\\x53\\x55\\x74\\xa0\\x60\\x2a\\x20\\x78\\x9a\\x66\\xd7\\x86\\x29\\x52\\xf4\\xd0\\x14\\x53\\x07\\x9f\\x08\\x73\\xed\\xd1\\x5b\\xf9\\xc3\\xbe\\x55\\xd5\\x0c\\x2d\\xbc\\xd1\\xd7\\x78\\x9e\\x8a\\x36\\xe9\\x57\\x77\\x43\\x9c\\x57\\xf9\\x71\\x27\\xab\\xba\\x56\\x40\\x5e\\x5d\\x64\\xd0\\x96\\xd1\\x48\\x74\\x61\\x57\\x17\\x51\\x9a\\xf4\\x4a\\x55\\xa6\\x0f\\x53\\x78\\xfc\\xb3\\x46\\x68\\xfd\\xd3\\x12\\x5a\\xff\\x84\\x85\\x96\\x5e\\x49\\x80\\xad\\xd7\\x6b\\x3e\\x84\\x7f\\x36\\xb0\\xde\\x90\\xf3\\xd6\\x7a\\xa2\\x6b\\xab\\xc1\\x0e\\x05\\x16\\x64\\x23\\x5b\\x8e\\x77\\xbc\\xad\\x46\\x3b\\x0f\\xd1\\xef\\x86\\xb6\\x1f\\x66\\xcf\\xda\\x2e\\x44\\x74\\xd5\\x37\\x0d\\x79\\xf2\\x45\\xc3\\x8d\\x07\\x54\\xda\\x5e\\x9c\\x81\\x52\\xf6\\x16\\x44\\x16\\x6a\\xb1\\x0f\\x71\\x56\\x71\\x83\\x50\\xb3\\x23\\x91\\xc5\\xc2\\xe5\\x7c\\x19\\x07\\x24\\x3a\\xc5\\xbf\\x06\\xf9\\x61\\x8e\\xc7\\x15\\x4d\\x5a\\x65\\x1d\\x6d\\x4e\\x6b\\x5b\\x9a\\x16\\xf5\\x4d\\xe4\\xe8\\x9e\\xf7\\xb2\\x7c\\x9c\\x4e\\x5d\\x57\\x13\\xcb\\x02\\xec\\xd0\\xa3\\xfc\\xa9\\x5f\\xc5\\x8b\\xd3\\xa9\\x43\\xc4\\xcb\\x6d\\xbc\\x1d\\x98\\x8f\\xd6\\x59\\xf5\\xe8\\x58\\x40\\xb2\\x16\\xa7\\x32\\x2a\\x5a\\x9d\\x37\\x99\\x19\\xb9\\x11\\x3b\\xb2\\x8e\\xd6\\x61\\x46\\xbd\\x2b\\xf5\\x5e\\x09\\x6b\\xda\\xba\\x58\\x32\\x1c\\xa2\\x22\\x19\\x13\\xcb\\xc6\\x68\\x1c\\x30\\x21\\xc4\\x61\\xa2\\x84\\xf2\\x7b\\x34\\x8f\\x08\\x40\\x4b\\x7a\\x01\\x63\\x52\\x8a\\x97\\x0e\\x42\\xd4\\xde\\x83\\x75\\xf3\\xe8\\x3f\\xd0\\x76\\xbd\\x7c\\x09\\xd6\\x22\\xd1\\x1c\\xe7\\x24\\x98\\x2f\\x9c\\x55\\x8b\\x12\\xb6\\x60\\xe0\\x05\\x92\\x3a\\x51\\xa4\\x15\\x73\\x75\\x53\\x9c\\x5a\\x01\\x40\\x8e\\xa3\\xc9\\x24\\x0a\\x97\\x31\\xb9\\x00\\xf7\\x58\\x66\\x21\\x78\\xa0\\x29\\x09\\xe2\\xe7\\x4d\\x1a\\x32\\x4a\\x42\\x76\\x0c\\x9d\\xe9\\x45\\xb5\\x52\\x7e\\xc1\\xac\\x6f\\x17\\xb3\\x37\\xf8\\x11\\xc1\\x73\\x67\\xe2\\x7f\\xeb\\x46\\x1f\\x2b\\xed\\xf6\\x6e\\xd5\\x04\\x05\\xa4\\xfd\\xf2\\x06\\x56\\x95\\x18\\x27\\xfa\\x29\\xd8\\x0a\\xf2\\x22\\x4e\\xa7\\x8d\\x04\\x83\\x2a\\xe4\\xaa\\xc4\\x42\\x9c\\x4e\\x6d\\x83\\xad\\x2d\\x1b\\x8c\\x7e\\x21\\xf9\\xa0\\xf6\\xa8\\x4a\\x07\\xc0\\xc9\\x27\\x9a\\xd0\\xa7\\xda\\x0a\\x6a\\x21\\xd4\\x28\\x00\\x30\\x81\\xd9\\x84\\xc5\\x6b\\xb4\\x80\\xb5\\x44\\x82\\x1d\\x35\\x58\\x73\\xc1\\xc6\\xc0\\x2e\\xe3\\x74\\x5a\\xd1\\x95\\x7c\\xeb\\xe8\\xa2\\xa8\\x0c\\x1b\\xa2\\x34\\x47\\xa7\\xf6\\x07\\x08\\x67\\xb3\\x28\\xa7\\x2b\\xcc\\x22\\xcd\\xc9\\x06\\x4e\\x10\\xde\\xa6\\x79\\xb3\\xbd\\xa0\\x76\\x74\\x50\\x4f\\x6d\\x4e\\x4a\\xb3\\x7b\\x55\\x29\\x8d\\x8e\\x0a\\x5a\\x86\\xe8\\xf3\\xc1\\x22\\xb8\\x60\\xa1\\x1d\\x46\\xda\\xc9\\xa8\\xfa\\xca\\x98\\x4d\\xf6\\x8a\\x90\\x18\\xb4\\x21\\xca\\x97\\x50\\x9d\\xb3\\x34\\xfb\\x74\\x90\\xbe\\xcd\\xd2\\x53\\xec\\xae\\xab\\x14\\x82\\xda\\x58\\x64\\x51\\x9a\\x45\\x8a\\xcc\\xb5\\x1a\\x90\\x25\\x4c\\x42\\x19\\x0e\\xd1\\xc4\\xba\\x66\\x6d\\x5e\\x6f\\xe6\\x42\\x98\\x0f\\x82\\xe7\\x91\\x80\\xa4\\xaf\\xf2\\x1e\\x8d\\xb4\\x5f\\x8f\\xd1\\x91\\xf2\\xf3\\x18\\xf9\\x96\\x97\\xf5\\x95\\x0d\\x15\\xf7\\x3b\\xe1\\x2e\\x28\\x71\\x9c\\x9e\\xb1\\xc8\\x18\\xe6\\x39\\x52\\x55\\xb7\\xcd\\x02\\x2f\\x0c\\x87\\x92\\xaa\\x51\\x9a\\xc4\\x17\\x74\\xe0\\x49\\x4a\\xc0\\x38\\x11\\x32\\x36\\x03\\x8f\\xc1\\x00\\xc5\\x34\\x91\\x01\\x1a\\x90\\x6f\\xc6\\x25\\x81\\x42\\x33\\xb8\\xcc\\xc7\\x74\\x0c\\x6b\\x49\\xfd\\xc2\\xb1\\x8b\\x31\\xae\\xb8\\x9e\\xd9\\x68\\x1d\\x68\\xca\\xa2\\xeb\\xec\\x0c\\xab\\x19\\xd2\\xe0\\x47\\x36\\x9f\\xf8\\x7c\\x11\\x65\\x17\\x80\\x08\\x54\\xde\\x42\\x6c\\x91\\xf3\\x38\\xd9\\x60\\x2d\\xfa\\xae\\x8e\\x85\\x8d\\x2a\\x15\\x0c\\xcc\\x38\\x13\\xda\\x55\\x1a\\x25\\xfa\\xd6\\xe5\\x02\\x55\\xa4\\xbc\\x0b\\xce\\x24\\x09\\x8b\\x27\\x95\\xc5\\x95\\xee\\x9e\\xe4\\x61\\x14\\x99\\xe2\\xc9\\xac\\xab\\xee\\xab\\xfe\\x91\\x0b\\x84\\x17\\xe5\\xad\\xd8\\x31\\xc3\\x72\\x88\\x65\\x87\\x2c\\x95\\xf7\\x22\\xc8\\x72\\x5c\\x25\\x0c\\x87\\xc3\\x75\\x38\\x9a\\xc9\\x1e\\x55\\xda\\xd4\\x0a\\x1b\\x5b\\x9c\\xb8\\xcb\\xb6\\x96\\x10\\x86\\x87\\x0c\\x47\\xf5\\x66\\xf8\\xb9\\x58\\xa4\\xcc\\x23\\x36\\xcd\\x5e\\xe1\\xc8\\x97\\xcb\\x2a\\x73\\xff\\xbf\\x04\\x9f\\x31\\x57\\xc0\\xa2\\xa8\\x6d\\x9d\\xa7\\x25\\x07\\x51\\xfe\\x47\\x10\\x47\\xe3\\x5e\\x1f\\xdd\\xbd\\x8b\\xc4\\x93\\xe7\\x51\\x86\\x43\\xd2\\xab\\x72\\x25\\x12\\x09\\xb1\\x58\\x05\\xd1\\x83\\x19\\xf7\\x57\\xf1\\x5b\\x52\\xb7\\xd0\\x61\\x91\\x59\\x47\\x42\\x56\\xd1\\x0d\\x98\\xb3\\x4e\\x9f\\x4a\\xcb\\x11\\x5e\\x24\\xcc\\x97\\x75\\xbb\\xb5\\xbe\\x5e\\xe0\\x89\\x66\\x13\\x74\\x97\\x43\\x5b\\x28\\x4d\\xb4\\x18\\xd7\\x75\\x0d\\x8b\\x4b\\xd5\\xf7\\x17\\x49\\x18\\x25\\xf0\\x9e\\x5a\\x24\\x68\\x00\\x06\\x74\\x07\\x7e\\x85\\x6a\\xa3\\xd9\\xeb\\x25\\x59\\x5c\\x7c\\x76\\x81\\x2f\\x4a\\xa6\\x4c\\xf3\\x07\\x2d\\x3d\\x76\\x31\\xcb\\x5c\\xc4\\x8a\\x88\\x04\\x01\\x35\\x0d\\xa9\\xa5\\xe0\\x76\\x66\\xd1\\x74\\x86\\xf3\\xba\\x76\\xd4\\x52\\x00\\xe3\\x88\\x52\\x9f\\x92\\xf4\\x2c\\x79\\x4f\\x02\\x02\\x87\\xb6\\xb0\\x4b\\xb9\\x3b\\x54\\x9b\\x82\\xee\\x3f\\xb0\\x42\\x8b\\x65\\x1c\\xe3\\x71\\x5d\\x53\\x6a\\xa9\\x86\\x46\\x28\\x77\\x32\\x39\\xc5\\x78\\x13\\xc4\\x41\\x12\\xe2\\x8d\\x13\\x53\\x9d\\x35\\x5e\\xce\\x48\\x90\\xef\\x9f\\x25\\x32\\x90\\x69\\xaf\\x43\\x3e\\x25\\x9d\\x3e\\x78\\x33\\x5c\\x56\\x39\\x62\\x65\\x9c\\x71\\x8b\\x27\\x69\\x86\\x7a\\x74\\x78\\x9f\\xf0\\x05\\x8a\\x24\\x16\\x64\\xa5\\xaa\\x7b\\xa2\\xac\\x5c\\x97\\x7c\\x4a\\xba\\xc7\\xba\\x8b\\x80\\x6a\\xd5\\xb0\\x8b\\x35\\xbf\\x46\\x5a\\x71\\x69\\xca\\x48\\x3b\\xf1\\xc9\\x76\\xd7\\x30\\x23\\xf6\\xc3\\xc8\\x31\\xf1\\xd9\\x25\\x9f\\x48\\xd7\\x85\\xcf\\x3b\\xe5\\x60\\x48\\xd7\\x85\\x1b\\x13\\x32\\xd2\\x0a\\xb2\\x0a\\x52\\x04\\x25\\x1b\\x09\\x3e\\xe1\\xf7\\xb3\\x20\\xbb\\x69\\x7a\\x14\\x4d\\x23\\x76\\x7f\\x32\\x09\\x71\\x3a\\x41\\x4c\\x13\\x02\\x90\\x72\\xd4\\x9d\\x47\\x79\\x8e\\xc7\\xcc\\x87\\x6a\\x39\\xe7\\xb9\\x69\\x49\\x10\\xd3\\x2f\\x39\\x09\\xc8\\x32\\xef\\x7a\\x9d\\x0c\\xcf\\x83\\x28\\x89\\x92\\x69\\xc7\\xeb\\xb2\\x4d\\x2b\\x2d\\xcf\\xfc\\x60\\xbc\\x6e\\x40\\xba\\x5e\\xb7\\x30\\x04\\x76\\xbd\\x6e\\x1c\\xe4\\xe4\\x6d\\x70\\x71\\x10\\xcd\\xe9\\x6b\\x0e\\xef\\x9b\\xe5\\xbc\\x7b\\xdc\\xd4\\xb1\\x05\\x95\\xb2\\xc4\\xaa\\x51\\x77\\x2b\\x30\\x37\\x49\\x86\\x76\\x51\\x73\\x1e\\x9a\\x9b\\xfc\\x21\\x45\\x15\\xe8\\x3a\\xe3\\xc6\\x7b\\xf1\\xb4\\x81\\xd9\\x8c\\xa3\\x7e\\x91\\xa5\\x93\\x88\\xe2\\x6f\\xc1\\x7d\\x8d\\x04\\xb6\\xde\\xf2\\xc7\\xdf\\x0e\\xc2\\x4a\\x81\\x72\\x8d\\x28\\x73\\xe4\\x29\\xfb\\x4a\\x09\\xd8\\x2d\\xc4\\x6a\\x10\\x2c\\xa4\\x98\\x83\\x24\\x95\\xb7\\x2b\\x87\\xfc\\x42\\x9b\\xa6\\xbd\\x0d\\x8f\\xd5\\x5a\\x9e\\xaa\\x46\\xdb\\xc4\\x42\\xad\\x77\\xd9\\x5e\\x84\\xbb\\x5c\\x2a\\x37\\x2a\\xc1\\xd7\\x11\\xe1\\xe1\\x2c\\x8d\\x42\\x3c\\x7e\\xc3\\xc9\\x9f\\x67\\x5e\\x7a\\x42\\xe8\\x77\\x4e\\xec\\xe2\\x05\\xa7\\x77\\xce\\x2e\\xec\\x51\\x37\\xa7\\x8b\\x13\\xff\\xaa\\x53\\xfd\\x59\\x94\\xcf\\xfe\\x48\\x89\\x78\\x57\\x72\\xc7\\xb7\\x23\\x93\\x6e\\x5a\\x88\\x7f\\x3b\\x98\\xd9\\x88\\xb4\\x5e\\x5d\\x5c\\x7f\\xa5\\xc4\\xfa\\xad\\x08\\xec\\x6f\\x46\\x32\\x37\\x10\\xcc\\x8d\\x25\\xb3\\xfc\\x61\\x08\\xe6\\x57\\xc9\\x24\\xbd\\x69\\xc1\\x5c\\x34\\x31\\x58\\xa4\\x69\\xcc\\xe2\\x69\\xcb\\x07\\x8c\\x40\\x21\\x16\\x6e\\xda\\xb2\\xda\\xf0\\x17\\x16\\xf4\\x5e\\x57\\x39\\x72\\x5c\\x49\\xb8\\xb1\\x51\\xdc\\x0a\\xff\\xaf\\x12\\x3f\\x37\\xb4\\x04\\xb8\\x08\\xdc\\xc9\\x28\\x37\\xb7\\x99\\x5f\\x9f\\xbe\\xf9\\x20\\xfe\\x26\\x04\\x2e\\xd5\\x84\\x6f\\x0e\\x51\\x37\\x45\\xe9\\xed\\xd7\\x32\\x2b\\xec\\x8a\\xb1\\x58\\xd5\\x5c\\x6b\\xf7\\x6b\\x4b\\x78\\x76\\x7b\\x15\\x0d\\x35\\x6c\\x41\\xbb\\x57\\xec\\x03\\xcf\\x80\\x3a\\x90\\x7f\\x91\\xef\\x7e\\x05\\xb4\\x00\\x5c\\x6d\\xf3\\x5d\\x2f\\x80\\xea\\xe0\\xd1\\x89\\xef\\x7e\\x05\\x34\\x61\\xd5\\x86\\x1f\\x43\\x9d\\xab\\xa7\\xc6\\x3e\\xf0\\x4c\\xaf\\xe3\\x0a\\xfb\\xe0\\x3b\\xdf\\x40\\xf5\\x61\\x94\\xbb\\xdf\\xd5\\xb4\\x61\\x7a\\x25\\x03\\x4d\\x99\\x45\\xc0\\x51\\x69\\xae\\x95\\x3e\\xf8\\x14\\xaa\\xa7\\xba\\x5c\\xf9\\xc0\\x33\\xa8\\x8e\\x81\\x76\\xe0\\x21\\x54\\xcb\\x3c\\x8c\\xf2\\x1d\\xcf\\xc1\\xd1\\x19\\x67\\x0f\\x3e\\xfc\\x18\\xec\\xd6\\xb6\\x14\\xfb\\xce\\x37\\xce\\x06\\x74\\xfe\\x70\\xbd\\x70\\x56\\xd7\\x76\\xd3\\xbe\\xeb\\x85\\x2d\\xcc\\xb4\\x00\\x51\\xfc\\xba\\x68\\xc7\\xdf\\xf9\\xc9\\x95\\x36\\x34\\x3a\\x09\\x92\\x8e\\xbf\\x77\\xdf\\xeb\\xd0\\xc7\\x1d\\xff\\xe1\\x4f\\x57\\xc7\\xde\\xde\\xee\\x6d\\xe4\\x28\\x72\\x1b\\x39\\xea\\xef\\x1e\\x39\\x4a\\x70\\xc0\\x46\\xe2\\x46\\xd5\\x04\\x7f\\xe2\\x51\\x9b\\xc6\\x45\\xcc\\x70\\x19\\xb4\\x49\\xcf\\x08\\xbc\\x42\\x82\\x32\\xb5\\x38\\x0b\\x00\\x6d\\x64\\x3f\\xe3\\xcf\\xcc\\x92\\xed\\x73\\xa5\\xe5\\xb3\\x60\\x0f\\x84\\x84\\xbe\\xa8\\xca\\x94\\xc6\\xc4\\x46\\x11\\x13\\x54\\xc9\\x75\\x55\\xa4\\xae\\x0f\\xe2\\x78\\x98\\xe3\\x64\\x7c\\xa0\\xdf\\x64\\x96\\xa8\\x29\\xe6\\x29\\xd7\\x50\\xab\\x02\\x27\\x73\\x2e\\xcb\\xf8\\xa0\\x9a\\x9f\\x46\\x8e\\xb3\\xd4\\x43\\x1f\\x73\\xca\\xee\\x32\\x1d\\x50\\x70\\x12\\x9d\\xee\\x82\\xf1\\x61\\x3f\\xd0\\xe2\\x2c\\xa1\\x42\\x66\\x5c\\x5f\\xe3\\xaf\\xf9\\x3e\\xea\\x62\\xc1\\x4e\\xdb\\x69\\xa3\\x3c\\xa3\\x8f\\x19\\x83\\x30\\xaa\\x30\\x79\\x44\\x2c\\xf3\\xb4\\xed\\x13\\x64\\x77\\x26\\x96\\x7d\\xb5\\x37\\xfe\\x68\\xd3\\xdd\\x51\\x05\\x80\\x35\\x4f\\xd5\\x3e\\xfc\\x7a\\x49\\x82\\x93\\x28\\xa6\\xb8\\xbf\\x33\\x1a\\xa1\\x4e\\x92\\x26\\x8b\\xe0\\x22\\x38\\x89\\x71\\x07\\xdd\\xbd\\x8b\\xdc\\x05\\x8b\\x52\\xd0\\x0d\\x39\\x36\\xa2\\x30\\x65\\x16\\x76\\x82\\x46\\x88\\x64\\xe6\\x4d\\x43\\xd7\\x21\\xb7\\x55\\x75\\x12\\xc4\\xb9\\x95\\xf5\\xbb\\xd9\\x80\\x46\\xcd\\xe0\\x14\\x25\\x56\\x00\\x53\\xd4\\x6c\\x05\\xa4\\xe9\\xc8\\x20\\x87\\xda\\xe9\\x37\\xc2\\x24\\x6b\\x43\\xfe\\x5e\\xad\\x47\\x89\\x91\\x8a\\x0e\\x4b\\x94\\xb0\\x16\\xc4\\xcf\\xca\\xee\\x78\\xc5\\x84\\xa7\\x84\\x17\\x3a\\xa2\\xbc\\xbc\\x73\\x90\\xbe\\x5c\\xc6\\x31\\xcb\\xbf\\x4e\\xdb\\x03\\xe9\\x5f\\xb0\\x2b\\x1a\\xc1\\x3e\\x5f\\xa2\\x10\\xe5\\x65\\x5a\\x84\\xfe\\x07\\x0a\\x04\\x27\\x91\\x80\\x19\\x76\\x67\\x31\\x85\\x87\\x12\\xc0\\x18\\x9f\\xb3\\x38\\x18\\x65\\x9c\\x7e\\xd5\\xfd\\x2b\\x9b\\x56\\xf8\\x7e\\x29\\xb1\\x8a\\x69\\xc1\\x23\\xfa\\x47\\x06\\x42\\xbf\\x87\\x76\\x8e\\x2b\\xfd\\xc0\\x68\\xd9\\x45\\xba\\xe8\\xf5\\x1f\\xb1\\x6c\\x75\\x6c\\x6f\\xc4\\xe3\\xc1\\x67\\xd3\\x1c\\xd1\\xe5\\xfe\\xe2\\x8e\\xc3\\xf4\\xd3\\x6e\\x60\\xaa\\x3a\\xdb\\x68\\x70\\xea\\x30\\x7e\\xb1\\x24\\xa2\\x7c\\x73\\xf7\\x2e\\x2a\\x7c\\xc2\\x45\\xaa\\x0d\\x1b\\x09\\xd5\\x38\\x30\\x33\\xa6\\x55\\x28\\xde\\xbd\\x12\\x5f\\x6b\\x22\\x0c\\x8e\\x6e\\x58\\xe6\\x7f\\xa4\\x8b\\x95\\x92\\xec\\x40\\xdc\\x3d\\x63\\xbe\\xd4\\xd9\\x74\\x39\\xc7\\x09\\x61\\xfb\\xbe\\x30\\xcd\\x32\\xfd\\x2e\\x82\\xb6\\x53\\x10\\x8e\\xd4\\xcc\\x71\\x2f\\x20\\xf8\\x49\\x36\\xd5\\xb7\\x1f\\xc2\\x83\\x9a\\x9d\\x3f\\x5e\\x95\\x2d\\x6b\\x65\\x98\\x23\\x60\\x8e\\x3e\\x33\\x37\\xc0\\x2b\\x0a\\x4f\\x44\\x44\\xd8\\x6a\\x70\\x91\\xac\\x20\\x05\\x15\\x8e\\x5a\\x1a\\x28\\x1d\\x51\\x79\\x69\\x86\\x7a\\x2b\\x36\\x4b\\x00\\x4d\\xec\\x70\\x28\\x23\\xa3\\x33\\x37\\x74\\x2d\\x8f\\x26\\xdb\\xf6\\xb2\\xec\\xfc\\x05\\x1e\\xd9\\x26\\x39\\x60\\xf9\\x24\\xb2\\xe0\\xc2\\xce\\x76\\x20\\xe8\\xe4\\x4e\\xaf\\xe4\\x38\\x49\\x6a\\xdc\\xcb\\x9e\\xca\\xed\\x3e\\xba\\x7b\\x17\\x34\\x33\\x19\\xf7\\xc6\\x44\\x15\\x26\\xb1\\xeb\\xeb\\x94\\x46\\x2e\\xad\\x9e\\x55\\xa9\\x26\\xa1\\x0c\\xf3\\xb6\\x95\\xb8\\x94\\x6c\\x41\\x97\\x51\\x07\\x5b\\xc1\\x21\\xe3\\xb3\\xf4\\x4c\\xec\\xfb\\x06\\xaf\\xb8\\x33\\x28\\x87\\x6d\\x7f\\x22\\xe7\\x9c\\x36\\x6f\\xb9\\xe1\\xb6\\xa3\\xff\\x62\\xab\\xc6\\x8e\\x40\\x90\\x74\\xf3\\x66\\x11\\x88\\x20\\x02\\x85\\xe8\\x9d\\xa4\\x6f\\x79\\xb5\\x0a\\x62\\xb7\\xb6\\x7c\\x22\\xbb\\x12\\x54\\x45\\x5e\\x02\\xe2\\x94\\x14\\xc4\\x05\\x54\\x76\\x10\\xb1\\x46\\x7c\\x50\\xc0\\xd7\\x88\\x09\\xca\\xb4\\x3e\\x66\\x80\\x8f\\x56\\x62\\x72\\x55\\x29\\x59\\x76\\x0f\\xae\\x2e\\xd5\\xae\\xd1\\x51\\xae\\x31\\x3d\\x1f\\xa3\\x5e\\x45\\x0b\\xd0\\xa7\\xad\\xc5\\x8f\\x2c\\x54\\x8c\\x2f\\xe0\\x1d\\x99\\x1a\\x66\\xca\\xdc\\x6e\\x8c\\x2f\\x40\\x47\\x4d\\xd6\\x94\\xac\\x33\\xbe\\xa8\\x1a\\x06\\xed\\x39\\x0b\\x92\\xb1\\x19\\x50\\xe3\\x37\\x7c\\x2e\\x18\\xf5\\x24\\xc8\\xf1\\x0f\\x0f\\x65\\x40\\x0d\\x6d\\x10\\xfd\\x41\\x4e\\x15\\xc5\\xde\\xb6\\xb7\\xf3\\xc0\\x8c\\x96\\x21\\xe2\\xeb\\x9e\\xe2\\x8c\\xbc\\xe3\\x4e\\x21\\x23\\xae\\xb9\\x0d\\xd2\\x05\\x33\\x5f\\xca\\xb6\\xca\\x09\\xf5\\x28\\x06\\x3d\\x0a\\x8d\\x57\\xea\\x10\\xde\\xd8\\xbc\\x6b\\x12\\x70\\x99\\xa9\\x35\\xce\\x9d\\xc4\\x73\\x18\\xfb\\xe3\\x80\\x04\\x45\\xef\\x02\\xf4\\xb7\\x19\\x9e\\x44\\xe7\\x15\\x20\\xf4\\xd1\\x16\\x9f\\xb1\\x3c\\x9a\\x26\\x01\\x59\\x66\\xb8\\xd7\\xdf\\x12\\x6d\\xe0\\x84\\xfe\\x77\\x8d\\x82\\x01\\xe8\\xe9\\xe0\\xe5\\xb3\\x34\\x63\\x66\\x57\\xcb\\x73\\xba\\x3e\\x54\\x5a\\x13\\x66\\xa3\\x5b\\x2b\\x8b\\xe1\\xbc\\xaa\\x44\\x11\\xb7\\x9c\\x57\\xa0\\xe2\\x2f\\xc8\\x79\\x95\\x49\\xe5\\xc2\\x13\\xd5\\xeb\\x00\\x67\\x99\\x27\\xdc\\x0b\\x60\\x17\\x65\\x9c\\x65\\xae\\x08\\x4f\\xc0\\xb2\\xf9\\x4e\\x64\\x49\\x75\\xa4\\xaf\\xb0\\x8f\\xab\\x04\\x3b\\x67\\x6e\\x3e\\x46\\xcd\\x78\\x99\\x25\\x1f\\x70\\xf2\\x32\\xcf\\x0e\\x58\\xc3\\xcb\\x56\\x13\\x9c\\x97\\xb3\\x6a\\x26\\x46\\x6a\\xa6\\x0d\\x19\\xaf\\xb0\\x62\\xe6\\x57\\x14\\x83\\x9e\\x96\\x43\\xaa\\xd5\\x86\\x83\\x25\\xc6\\x92\\xb2\\xa1\\x40\\x42\\xcd\\x4e\\x03\\x2a\\x67\\x65\\xcd\\xaf\\x6e\\xb6\\xd1\\x8e\\xa1\\xa8\\xa8\\x09\\x30\\x47\\x90\\xee\\x7c\\x16\\xec\\xf5\\x4a\\x7d\\xb8\\xe4\\x03\\xf4\\xd0\\x75\\x69\\xa7\\xa2\\xeb\\x65\\xb2\\x08\\xc2\\x4f\\xfb\\xfc\\x2e\\xa7\\x16\\x75\\x92\\x3d\\x72\\x0a\\x50\\xe6\\x50\\xc3\\xcb\\xb8\\x95\\xaf\\x4a\\x95\\x3e\\x95\\x7d\\xf2\\x2f\\x85\\xac\\x1d\\xa1\\x5d\\xf4\\x58\\x3e\\xe4\\x63\\xdb\\xed\\x23\\x79\\xa0\\x03\\x45\\xa0\\x54\\xeb\\xff\\x32\\x7a\\x88\\xee\\xde\\xd5\\x6a\\x6f\\x7b\\x0f\\xfb\\xa3\\x11\\xea\\x6c\\x3f\\x0c\\xf7\\x7e\\xfc\\x29\\xd8\\xee\\x40\\x00\\x33\\x59\\xa4\\xaf\\xd2\\x63\\xac\\xf0\\xc5\\x51\\x87\\xe7\\xca\\xef\\x1c\\x7b\\x5a\\xe3\\x0f\\xfb\\x1e\\x8b\\x90\\x01\\x1c\\x36\\x9b\\x77\\xac\\x3a\\x62\\xc4\\xe2\\xaa\\x95\\x87\\x32\\x1c\\xe4\\xcc\\xc4\\xd8\\x41\\x5b\\xb2\\xf3\\x2d\\xd4\\xf9\\x57\\x52\\xa0\\xa6\\xb3\\x25\\x86\\x5d\\xed\\x82\\x55\\x2b\\xef\\x0a\\xbe\\xc5\\xb9\\x1d\\xd6\\x8e\\x64\\x17\\x9f\\x6d\\xe8\\xd5\\x2a\\x06\\x4a\\xde\\x2b\\xaf\\x7a\\x96\\x7d\\xd1\\x2b\\x20\\xd6\\x41\\x0e\\x59\\xda\\x33\\xec\\x10\\xb1\\x1b\\x99\\xc4\\x6b\\x9a\\xc8\\x6b\\x9e\\x4c\\x54\\x73\\x2b\\xc7\\xea\\x5a\\xe3\\x59\\xb6\\xf6\\x88\\x6e\\xe9\\x76\\x48\\xc4\\x11\\xe9\\xb7\\xe8\\xfb\\x3b\\xc3\\x0b\\xc2\\x7a\\xc0\\x98\\xbd\\x2a\\xe1\\x18\\x45\\x3a\\xb9\\x28\\xe9\\x64\\x8a\\x89\\x94\\x39\\x8c\\x26\\x6c\\x2a\\x01\\xe0\\xe0\\x29\\x2e\\x99\\x67\\x1e\\xb9\\x90\\x7b\\xa1\\x5f\\xb6\\x5d\\x2b\\x6f\\x76\\x51\\x11\\xd2\\x90\\x02\\x44\\xd7\\xc6\\xd7\\xc1\\xa2\\xd8\\xfd\\xd0\\x45\\x84\\x42\\xf6\\x72\\x19\\xc7\\x92\\x7a\\x55\\x2a\\xaf\\x70\\x31\\xa9\\x23\\x2a\\x9b\\x09\\x04\\xba\\x3d\\x01\\x44\\x45\\xdb\\x9a\\xcf\\x89\\x94\\x82\\xa3\\xd1\\x08\\xed\\xa0\\xc7\\xd2\\x9f\\x73\\xfb\\x18\\xf9\\xe0\\xc5\\x48\\xf9\\xe1\\xdc\\x85\\x7a\\x95\\x49\\x9e\\xa3\\x09\\xc4\\x66\\xa8\\x86\\xcf\\xaa\\x1d\\x77\\xae\\x89\\xdd\\xe4\\xc7\\xa2\\x7d\\x71\\x6c\\x34\\xf6\\xd6\\xe3\\xb7\\x02\\x6f\\x0d\\x52\\x88\\x5d\\x37\\xff\\x15\\xb0\\xc0\\x33\\x0b\\x78\\x31\\x55\\x00\\xbd\\x51\\x59\\x8a\\xae\\x77\\x82\\xaf\\x73\\x72\\x6b\\xf3\\x67\\x02\\x22\\x4e\\x15\\x06\\xa5\\xf8\\x71\\x88\\x3b\\xa6\\x42\\xe8\\x3a\\xc4\\x3c\\x58\\xb0\\xbd\\xb1\\x7b\\x66\\x6a\\x92\\xdf\\x15\\xda\\x44\\xd3\\x31\\xa1\\x06\\x13\\xc4\\x77\\xf4\\x90\\x6c\\x92\\xf0\\xc2\\xbd\\x15\\x6d\\xae\\x27\\x99\\xd4\\x64\\x7e\\x52\\xcb\\x6a\\xa2\\x14\\x35\\x93\\xd9\\x5c\\x23\\xd0\\x67\\x16\\xbe\\xc0\\xb0\\xb2\\x08\\xb7\\xe8\\xd9\\x89\\xa8\\x35\\x30\\xa5\\x65\\xf4\\x84\\x09\\x44\\xcf\\x64\\xe8\\xc6\\x64\\x85\\x70\\xa8\\xb8\\x61\\x8f\\x6c\\x51\\x73\\x05\\x27\\x8c\\x37\\x54\\xad\\x67\\x41\\x1c\\x8b\\x74\\xcc\\x3c\\xd4\\x7b\\xe1\\x0c\\x51\\xa3\\x5c\\xd1\\xf1\\x40\\xe6\\xd8\\xc1\\x60\\x20\\x2d\\xb2\\xcf\\xcc\\x36\\x1d\\x87\\x18\\xa2\\xa6\\x2c\\x75\\x85\\x5e\\xf1\\x63\\x95\\x38\\xc8\\xcb\\x93\\x00\\x14\\x51\\x30\\x65\\x19\\x8f\\x15\\xb0\\x80\\x56\\x9b\\xe5\\x28\\x2f\\x9c\\x6b\\x02\\x2d\\xa1\\x61\\x90\\xf0\\x6c\\x55\\x45\\x1e\\x43\\x59\\x6c\\x11\\xe4\\x4c\\xe5\\x9c\\x61\\xbd\\x2d\\xbe\\x4e\\xd0\\x6a\\x82\\x4a\\x2a\\x75\\x4a\\x21\\xe7\\x98\\x41\\xa4\\xad\\x36\\x19\\x9a\\x96\\x30\\xc8\\xf8\\x25\\x6c\\x0e\\xcc\\x5c\\xae\\x6a\\xa2\\x94\\xd6\\x59\\x0b\\xbd\\x02\\xd5\\x7d\\xf8\\x5c\\x46\\x9e\\x31\\x1a\\x51\\xf1\\xad\\xd3\\x09\\x26\\x2c\\xcb\\x73\\x4f\\xc6\\x67\\xc6\\x71\\x28\\x64\\xbe\\x62\\x66\\x29\\xfd\\x54\\x51\\xad\\xaa\\x1e\\xe3\\xc9\\xea\\xed\\xf7\\xac\\x65\\x98\\x19\\xd6\\x76\\x61\\x4c\\x84\\x00\\x42\\xda\\x3d\\x16\\x7d\\x57\\xc9\\x10\\x26\\x1a\\xf3\\x34\\xb0\\xdd\\xf9\\x26\\x59\\x75\\x75\\x2b\\xd1\\xdb\\x88\\xaa\\x67\\xac\\x4b\\x32\\x5c\\x8e\\x3d\\x7e\\xbe\\x2e\\xd4\\x80\\xef\\x29\\x64\\x24\\x52\\xe6\\xbb\\x95\\x7e\\x54\\xae\\x72\\x69\\xd6\\x2f\\xf2\\x6c\\x69\\x59\\xe5\\x3d\\x54\\xb5\\x2b\\x60\\xae\\x4a\\x0c\\x25\\x2c\\xb6\\x11\\x2d\\x0a\\xaf\\x2a\\xd5\\xbb\\x7f\\x36\\x34\\x00\\xb5\\x5e\\xeb\\xa4\\xdb\\x88\\x49\\x81\\xfa\\xad\\xb5\\xdc\\x05\\x3a\\x22\\x5e\\x37\\xb9\\x54\\xa5\\x0d\\x4f\\xa3\\xc6\\x67\\x82\\x1d\\xcd\\xd5\\xae\\x95\\x01\\xac\\x89\\x5f\\x54\\x9d\\x39\\x4c\\x6f\\xa2\\xb5\\x95\\xcb\\x80\\xe0\\x2f\\x21\\xa2\\xbe\\xdd\\x43\\x04\\xd5\\xb6\\xcf\\xd3\\x2f\\xfc\\x82\\xb6\\x99\\xc7\\x85\\xe6\\xa5\\xe3\\x3e\\x2c\\x56\\xa2\\x07\\x3d\\x0b\\x12\\x9e\\xe7\\x3a\\x19\\xf3\\x28\\x8d\\x2c\\xa0\\x6e\\x9a\\xdc\\x93\\xae\\x3e\\x65\\x92\\xfc\\x3a\\x90\\x36\\x2e\\xb3\\x55\\x71\\xcb\\xc5\\x9d\\x41\\x88\\x3d\\x38\\xa4\\x98\\x7d\\x56\\x51\\x2b\\x77\\xdb\\x49\\x5d\\x07\\x18\\xee\\x5c\\xec\\x2d\\x44\\xc4\\x6a\\x32\\x02\\xe7\\x24\\x9a\\x07\\x04\\xff\\x1a\\x30\\x57\\xe9\\xb6\\xf2\\x41\\xa9\\xde\\x56\\x36\\xa8\\x3d\\x6f\\x52\\x2e\\x6c\\x84\\xcf\\x6f\\x88\\x2c\\x15\\x1c\\x38\\x49\\xf2\\xba\\x69\\x12\\x80\\x61\\x13\\xf4\\x58\\x54\\x71\\x53\\xe3\\x3b\\x89\\x0f\\x8c\\xf8\\x81\\xd4\\x18\\xb1\\x93\\x2e\\xe1\\xe9\\x6d\\x68\\x0b\\x10\\xf9\\x4d\\x31\\x79\\x1e\\x90\\xa0\\x72\\x5f\\x6d\\x36\\xdf\\x96\\x4e\\x45\\x1f\\x5f\\x3b\\x8d\\x6e\\x94\\x44\\x45\\x35\\x76\\xf0\\x58\\x27\\x22\\xf5\\x83\\x55\\xe7\\xa1\\x6a\\xb1\\x27\\x14\\xba\\x10\\x6d\\xfa\\xa6\\x37\\x44\\xda\\x89\\xe0\\x38\\xca\\x17\\x71\\x70\\x81\\x92\\x60\\x5e\\x77\\x28\\x28\\x8a\\xbe\\xd1\\x4b\\xda\\xa4\\xa6\\x36\\x29\\xa9\\x18\\x10\\xa4\\x8d\\xc8\\x4e\\xe9\\xb3\\xc9\\x11\\x21\\xdf\\x4d\\x48\\x4d\\xa9\\xac\\xab\\x1e\\x1b\\x6e\\xe2\\x1c\\x95\\xf9\\xe1\\x37\\x40\\x19\\x2d\\x57\\x8b\\xaf\\xa2\\xb1\\x75\\x91\\x25\\x7b\\x6b\\x8d\\xa9\\x03\\x51\\x71\\x0d\\x34\\x95\\xfe\\x9d\\x14\\x51\\xd9\\x22\\x64\\xf7\\x1c\\x70\\x4e\\x72\\xee\\xe3\\xd6\\x76\\x49\\x15\\xb5\\x01\\xc4\\xd5\\x44\\xbf\\xad\\xc0\\x8f\\x68\\xf3\\xeb\\x93\\x61\\x6d\\x65\\x54\\x79\\xff\\x44\\x16\\x57\\x75\\xbe\\xc1\\x49\\x94\\x8c\\xd9\\x54\\x3a\\xa2\\xa4\\xda\\x62\\x89\\x23\\xdd\\x37\\xfd\\xe2\\x1f\\xa3\\x2e\\x5d\\x1c\\x3f\\xd0\\x21\\x75\\x91\\x2f\\x7e\\x19\\xdb\\xb7\\xae\\xe7\\x94\\x72\\x7e\\xf1\\xcd\\x2e\\xc3\\xbd\\x3d\\x7c\\x74\\x24\\x06\\x7e\\x6c\\x17\\xe1\\x43\\xf4\\xc5\\x7f\\x5d\\x48\\xae\\x4c\\x9e\\xf8\\x1c\\x87\\x4b\\x02\\x32\\x19\\xb8\\xb5\\xe3\\xc5\\x5b\\x6f\\xeb\\x44\\x2f\\x75\\xa4\\x46\\x34\\xb5\\xf0\\x8e\\x8e\\x7f\\x3b\\xae\\x30\\xd3\\x33\\x08\\xa4\\x89\\xca\\x63\\xc4\\xf2\\x5d\\x85\\x6b\\x38\\x77\\x6e\\xd3\\xa7\\x71\\x10\\x2c\\x16\\xf1\\x05\\x23\\x1b\\xaf\\x19\\xe9\\x57\\xef\\xd1\\x86\\x43\\x63\\xeb\\x62\\x74\\x4f\\x5f\\xae\\xd5\\x67\\xcb\\x79\\x0f\\x08\\x09\\xc2\\x99\\x22\\xc2\\xd3\\xc2\\x08\\x5a\\x43\\x02\\xbc\\xe6\\x41\\xfa\\xcc\\x2e\\x5e\\x58\\x60\\xe5\\xbb\\xd6\\x32\\xc9\\x6c\\x5c\\xa3\\x18\\x09\\x20\\x44\\x39\\x25\\x85\\x09\\x29\\xc3\\x7e\\x6a\\xbc\\xaf\\x56\\x91\\xef\\x4b\\x19\\xc8\\xaa\\x89\\x9f\\xb5\\xd5\\x84\\x69\\xb5\\x9c\\xb9\\xba\\x0a\\xb6\\xcd\\x03\\x24\\xba\\xba\\x66\\x74\\xf5\\x88\\x8f\\xb4\\x7c\\x54\\x5b\\xbd\\xdc\\xb5\\xb2\\xaa\\xe2\\xa7\\xb3\\x1a\\x33\\xbd\\x6a\\x3b\\x0e\\x56\\x4d\\x79\\x64\\x7a\\x81\\xf3\\xdd\\xa7\\x98\\xa6\\x23\\xa5\\x20\\x18\\x20\\x15\\x2c\\x88\\x46\\x12\\xdc\\xaa\\x7d\\x20\\x58\\xf5\\x88\\x2f\\x15\\x72\\xf5\\xee\\xab\\x6d\\x31\\x06\\x8c\\xb2\\x70\\x19\\x07\\xd9\\x9d\\x3b\\x77\\xee\\x80\\x7c\\x63\\x85\\x74\\x30\\x29\\xf5\\x91\\x76\\x63\\x5a\\xbf\\x6a\\xd9\\xf1\\x7f\\x54\\xae\\x4c\\xe7\\xb3\\x60\\xaf\\xe3\\xef\\x6e\\xbb\\x6e\\x51\\x73\\x57\\xc1\\x8e\\xbf\\x4b\\x2b\\x29\\xb7\\x24\\x3b\\xfe\\xde\\xce\\xd5\\xb1\\xb7\\xb7\\x77\\x7b\\x9f\\xfa\\xf6\\x3e\\xf5\\xdf\\xeb\\x3e\\xb5\\xb8\\x44\\x4d\\xeb\\x2c\\xb2\\xf4\\x34\\x1a\\xe3\\x0c\\xbe\\x48\\x9d\\xfb\\xea\\x43\\xd4\\xee\\x5e\\x35\\x2b\\x1e\\x05\\x09\\xda\\x0f\\x92\\x10\\x07\\xac\\x74\\x14\\x24\\xee\\xe2\\x2f\\x83\\x13\\x5a\\xfc\\x8f\\x74\\x8a\\xe3\\x9c\\xe0\\x38\\xc6\\x19\\xfa\\x79\\xc2\\x1e\\xae\\x73\\x77\\xbb\\xfa\\x6a\\xf5\\x77\\xc3\\x21\\x3a\\x4b\\xb3\\x4f\\x41\\x46\\x59\\x81\\xae\\xce\\xcb\\x5c\\x47\\x0d\\x25\\xd8\\x71\\x34\\x99\\xe0\\x0c\\x27\\x04\\xe1\\xe4\\x34\\x67\\x95\\x4e\\xb2\\xf4\\x2c\\x57\\xa2\\x3c\\x70\\x67\\xaa\\x05\\xa6\\x92\\x20\\x4a\\xc6\\xe9\\x19\\xb3\\x81\\x77\\x0b\\x23\\x78\\x17\\xdd\\xbd\\x2b\\xde\\x0c\\xfe\\xfb\\xf5\\xef\\xbf\\x11\\xb2\\x78\\xc7\\x17\\x41\\x53\\x62\\xeb\\x6f\\xd1\\x08\\xae\\xc5\\x04\\xed\\xc7\\x7c\\x16\\x25\\x04\\x45\\xd3\\x24\\xa5\\xa2\\x25\\x8e\\x12\\x4c\\x61\\x4b\\xd2\\x71\\xb9\\x73\\x14\\x71\\xfb\\x6b\\xfa\\x28\\x90\\x73\\x3e\\x8f\\xe9\\xe8\\xc5\\x02\\xdd\\xed\\x37\\xed\\xb6\\x5c\\x3e\\x34\\xec\\xff\\xf7\\x6f\\xef\\x76\\xb5\\xe6\\x67\\xd9\\x6e\\xb7\\xef\\x6c\\xc5\\xb5\\xb3\\xa2\\x10\\xbc\\x95\\x13\\x62\\x5f\\x44\\x67\\xfb\\x53\\xaa\\xfc\\x85\\xec\\x70\\x3c\\x3d\\xc5\\x19\\x9b\\x43\\x70\\x57\\x44\\xc1\\xd2\\xda\\x53\\xb7\\x3e\\xb3\\x34\\x27\\x1e\\x22\\xd1\\x1c\\xa7\\x4b\\xe2\\xd1\\x0e\\x32\\x8f\\x1d\\x31\\x9f\\xa5\\xd9\\xd8\\x43\\x33\\x1c\\x8c\\x71\\x66\\xdd\\x2b\\x62\\xeb\\x21\\xad\\x8a\\x46\\x88\\xfd\\xbb\\xbc\\x44\\x5d\\xc1\\x93\\x71\\x1a\\x06\\x31\\x7d\\xe8\\x3f\\xfc\\xe1\\xfe\\x0f\\x5d\\xe0\\x9a\\xab\\xe8\\x8d\\x2e\\xfb\\xe2\\xdb\\xe5\\x25\\xda\\x06\\x0a\\x52\\x68\\xd0\\x88\\x01\\x05\\xbc\\x95\\x50\\xa2\\x51\\x01\\x30\\x50\\x4a\\x8c\\x80\\x02\\xca\\xbf\\xad\\xbc\\xb3\\x5d\\x64\\x78\\x41\\x17\\x91\\x04\\x9f\\x19\\xf4\\x54\\xb3\\xb1\\x15\\x15\\xed\\xc2\\xc5\\xb6\\xf6\\x69\\x9a\\xc6\\x38\\x48\\xae\\xd8\\x55\\x40\\xca\\x5a\\x72\\xfb\\x58\\x4e\\x3d\\xf3\\x0e\\x00\\xed\\x1b\\x3a\\x2c\\x57\\x76\\x7e\\xa9\\x92\\x14\\x54\\x32\\x50\\x36\\xc7\\x3a\\x80\\xfa\\x25\\x17\\xda\\x2d\\xb4\\x2f\\x16\\x10\\x02\\x87\\xe2\\x60\\x15\\xc4\\xd4\\x12\\xd9\\x3e\\x43\\xe1\\x6f\\xef\\x76\\xcd\\x6d\\x9e\\x52\\x4a\\xa5\\x12\\x85\\x68\\xfe\\x7f\\xf6\\xde\\xbd\\xbb\\x6d\\x5b\\x59\\x14\\xff\\xfb\\x77\\x3e\\x05\\x92\\x7b\\x77\\x2c\\x27\\x8a\\x2c\\xc9\\xb2\\xe3\\x68\\x57\\xdd\\xd7\\x71\\x92\\xc6\\xbb\\x49\\x93\\x5f\\x9c\\xb6\\xfb\\x1c\\x1f\\xd7\\x8b\\x12\\x21\\x8b\\xb1\\x44\\xea\\x90\\x94\\x1f\\xbb\\xf1\\xfd\\xec\\x77\\x61\\xf0\\x20\\x40\\xe2\\x45\\x49\\xce\\xa3\\xb1\\xba\\x1a\\x4b\\x24\\x1e\\x83\\xc1\\x60\\x30\\x18\\xcc\\xa3\\x24\\xbb\\xe9\\xd6\\xba\\xa6\\x2b\\x05\\x43\\x55\\x0f\\xc3\\xff\\xd0\\xf5\\x9f\\xcc\\x71\\xdc\\xd8\\x78\\xf7\\xf6\\xe8\\xc3\\x46\\xb3\\x20\\xf8\\x26\\x9d\\x08\\x8d\\x78\\x5a\\x50\\xec\\x83\\x07\\x2a\\x81\\x9a\\x34\\xfa\\x64\\xd3\\x41\\x03\\xb4\\xf1\\x2c\\xc8\\xa2\\x11\\xda\\x40\\x8f\\x00\\xd8\\x67\\x0b\\xc2\\x7b\\xa5\\xe6\\x1e\\xa1\\x8d\\xfe\\x06\\x77\\x95\\x12\\x6d\\x16\\x96\\x80\\x1b\\xc3\\x20\\xc3\\xbb\\xbd\\xf2\\xcd\\x97\\x3c\\x96\\x0c\\xe7\\x6c\\xf0\\xaf\\x60\\x11\\x34\\x36\\xf6\\x61\\xc3\\x8b\\xfe\\x1d\\x50\\xd5\\x02\\xc0\\x52\\x49\\x80\\x62\\xae\\x4e\\x8e\\x51\\x38\\xce\\x1f\\x7f\\xb8\\x9e\\xe3\\x8d\\x26\\xda\\x20\\x07\\xcc\\x68\\x04\\x8d\\x6d\\x7d\\xcc\\xaa\\xd7\\x70\\xd1\\xb8\\x21\\xaf\\x46\\xfd\\x9d\\x5f\\xf1\\xbe\\x1a\\x13\\x8e\\xbe\\x30\\xdd\\x90\\x1b\\x01\\xa5\\xd5\\x5a\\x71\\x30\\xc3\\x9c\\x99\\x69\\xb3\\xbd\\x23\\xff\\xf8\\xd0\\x8c\\xec\\x45\\xa9\\x7a\\x4c\\x64\\x16\\x9c\\x63\\x44\\x28\\x48\\xa3\\x79\\xd3\\xf1\\x0e\\xc2\\xe9\\x75\\x1c\\x83\\x5b\\x30\\xcd\\x35\\x9e\\xaa\\x9c\\x31\\x14\\x89\\x88\\xb3\\xc5\\xb4\\x16\\x43\\x80\\xfd\\x45\\x66\\x03\\xfc\\x6e\\xc7\\xcc\\x08\\xf8\\x3a\\x55\\x79\\x49\\x83\\x3a\\x1c\\x97\\xb8\\x84\\xde\\xb8\\xa2\\x98\\xc4\\x38\\x6c\\x40\\x56\\x26\\x6a\\xf8\\x19\\x8d\\xaf\\x45\\xff\\x15\\x12\\xe5\\xb6\\x13\\xd4\\x22\\xc4\\xcf\\xed\\xf8\\x20\\x89\\x63\\xcc\\x32\\x24\\xf1\\x75\\xed\\xbe\\x08\\x93\\xcc\\x15\\x29\\x9c\\x29\\x73\\xc3\\xfa\\x80\\xaf\\xca\\x6c\\xd0\\x34\\x40\\xd6\\x82\\x94\\x72\\x4a\\x6b\\x66\\x77\\x63\\x35\\x09\\xb1\\xba\\x84\\xe9\\x80\\x5b\\x39\\x8d\\x8a\\x53\\x69\\x0f\\x54\\x1d\\xd4\\x24\\xeb\\xfd\\xca\\x8e\\xe6\\x41\\xdb\\xac\\xc8\\x4b\\x61\\x89\\x27\\xd4\\xc0\\x79\\x1a\\x9d\\x9d\\xe1\\x14\\x87\\x28\\x89\\x11\\xa1\\x5f\\x38\\x3f\\x80\\x55\\x28\\x1b\\xdc\\x66\\xdd\\x25\\x00\\x10\\xea\\xd6\\x81\\x74\\x65\\x59\\x7b\\x45\\x80\\xb7\\x7f\\x45\\x61\\xcc\\xf6\\x9c\\x38\\xc5\\x41\\x78\\x0d\\x91\\x60\\x46\\x93\\x20\\x3e\\xb3\\x6b\\x36\\x91\\x88\\x9e\\xca\\x27\\x3d\\x08\\xaf\\x21\\x75\\x0e\\xd8\\x86\\xf6\\xc8\\x4e\\x54\\xde\\x4e\\x89\\x94\\xde\\xf1\\xf2\\x6d\\xd1\\xd3\\xb9\\xa9\\x1a\\x37\\x50\\xa2\\x26\\x55\\xda\\x62\\x76\\x9b\\x2a\\xef\\xd5\\xc1\\x3f\\xf6\\x55\\xc2\\x3f\\xc2\\x70\\x6a\\xe9\\xf5\\x22\\xfa\\xd3\\x8f\\xaa\\x6c\\x7e\\xe6\\x69\\x82\\x7c\\x63\\x24\\x81\\x42\\xf0\\xb1\\xcf\\xbc\\xda\\x71\\xd6\\x2a\\xd8\\xda\\x07\\xda\\x42\\x43\\x16\\x9c\\x2a\\xac\\xf3\\xcb\\xf1\\xe4\\x32\\xe0\\x36\\xb6\\xbc\\x54\\x34\\x88\\xc2\\x8e\\x76\\x7a\\x4d\\xf8\\x02\\xcd\\xe9\\x0a\\x4c\\x8a\\xac\\x76\\x4f\\x1e\\x15\\x65\\x0c\\x22\\xac\\xdf\\x5e\\x85\\xd0\\xce\\xef\\xcb\\xca\\xc2\\xfb\\x24\\xb8\\xc0\\xf1\\x46\\x8e\\xc6\\x41\\x34\\xc5\\x61\\x0b\\xbd\\xcd\\x27\\x38\\xbd\\x8c\\x32\\x4c\\x3d\\xa1\\xeb\\x70\\x23\\x09\\x16\\x2b\\x5d\\xe8\\x67\\x51\\xa8\\x84\\x1b\\x06\\x9b\\xca\\xb0\\x8f\\x9e\\x8a\\x4f\\xf5\\x82\\x88\\x7c\\x88\\x54\\x97\\xce\\x47\\x7d\\xb4\\xd1\\x6d\\xb5\\x35\\x77\\x51\\x48\\xba\\xde\\xda\\x88\\x71\\x7e\\x3a\\x8d\\xb2\\x1c\\xc7\\x51\\x7c\\x66\\x28\\x2c\\x2e\\xa6\\x4e\\x9c\\x92\\x18\\x92\\xee\\x34\\xaa\\x31\\xae\\xac\\x6c\\x80\\x07\\xe9\\xd1\\x45\\xb8\\x12\\xdf\\x6c\\x9a\\x5a\\x79\\x42\\x64\\x2d\\xad\\xa2\\x68\\x25\\xa7\\xfc\\xfb\\xfd\\xa7\\xed\\xe6\\x7d\\x55\\x9d\\x70\\xbf\\xdf\\xd9\\xbb\\x39\\x69\\x6e\\xf7\\xee\\x94\\xae\\x77\\x4a\\xd7\\xef\\x4b\\xe9\\xaa\\xb0\\x4c\\x4a\\xc6\\xc3\\xe0\\xb3\\x05\\xb0\\x14\\x81\\x8f\\x64\\x5d\\xdc\\x30\\x3a\\xa3\\x71\\xb0\\x5a\\x1f\\x33\\x25\\x0e\\x24\\xb5\\x0b\\x08\\x5f\\xe3\\xb1\\xba\\xeb\\xd2\\xbd\\xae\\x49\\xbd\\x24\\xf4\\x92\\x1e\\x93\\x59\\x68\\x49\\x95\\xc1\\x5c\\x4e\\xc8\\xa8\\x1b\\xaa\\xcf\\xce\\x0f\\xb4\\x31\\xf4\\x10\\x55\\x82\\x3a\\x22\\x59\\x08\\xda\\x68\\x6f\\x08\\xcf\\x34\\xaf\\x63\\xa9\\xb7\\xf4\\xfe\\x8e\\xa9\\xb1\\x82\\x18\\x1d\\x3e\\xdb\\xff\\x85\\xd1\\x56\\x88\\x9e\\x3e\\x41\\xa3\\x64\\x36\\x5f\\xe4\\xb0\\x54\\xd1\\xf0\\x1a\\xcd\\x92\\x8b\\x28\\x3e\\xa3\\xa6\\x32\\x51\\x9a\\xe5\\xa8\\x87\\x46\\x93\\x20\\x85\\xcd\\x94\\xda\\xb9\\x85\\xd4\\x4d\\x85\\x07\\xca\\xe3\\xa5\\xa7\\x98\\x06\\xec\\xcc\\x13\\xb9\\x63\\x8a\\xfb\\x0c\\x35\\xf6\\xd1\\x00\\x75\\xda\\x4d\\xf4\\x8c\\xfc\\xed\\x34\\x51\\xab\\xd5\\x6a\\xa2\\xff\\x42\\x03\\xb4\\xbd\\xb3\\xd9\\x24\\x4c\\x25\\x9b\\xe3\\x51\\x34\\x8e\\xe8\\x3a\\x3e\\x3c\\x7a\\xdb\\xd9\\xde\\xed\\xec\\xba\\xdc\\x7d\\xa2\\x2c\\x81\\x72\\x6c\\x7c\\xba\\x53\\x03\\xb7\\x04\\x82\\x1c\\xb3\\x04\\x50\\x82\\x00\\xcd\\xde\\x9e\\xa9\\xf6\\x7c\\x4c\\x80\\x0f\\xcb\\xc5\\x4b\\xa9\\xd9\\xd5\\xfe\\x15\\x42\\x22\\x1d\\xea\\xe8\\x87\\x60\\x62\\x63\\x7f\\xa3\\x45\\xd0\\x7a\\x90\\x84\\x78\\x3f\\x6f\\xb4\\x35\\x77\\xa5\\x04\\x37\\x1b\\xff\\x55\\x29\\xa6\\x6a\\x58\\x68\\xde\\x5c\\x58\\x64\\x79\\xf2\\xeb\\x7c\\x8e\\xd3\\x83\\x20\\xab\\x5e\\xa4\\x4a\\xc5\\xb2\\xc5\\x30\\xcb\\xd3\\x46\\x6f\\x93\\x67\\xc2\\x65\\x0f\\xda\\xcd\\x9e\\xc1\\xa2\\x85\\x96\\x9a\\x4f\\xa3\\xbc\\xb1\\xb1\\xb1\\xa9\\x26\\x1b\\x8e\\x0d\\x46\\x81\\xa3\\x24\\x24\\xc8\\x88\\x6d\\x83\\x44\\xdc\\x43\\x8d\\x94\\xfd\\x71\\x80\\xf6\\xc9\\xc9\\x05\\x7e\\xfc\\x30\\x40\\xff\\x65\\xf0\\x57\\xdb\\xda\\x42\\x1a\\x4a\\x62\\x84\\x64\\x50\\x13\\x51\\x87\\x11\\xd2\\xf0\\x63\\xb4\\x8f\\x1e\\xa1\\x4e\\x5b\\x23\\xa7\\x9b\\x94\\x8a\\x52\\x13\\xb1\\x53\\xbc\\xdf\\x6c\\x7d\\x4c\\xa2\\x98\\xa0\\xc9\\x6b\\x55\\x1e\\x04\\xd3\\xd1\\x62\\x0a\\xa9\\x51\\x09\\xc9\\xbd\\x79\\xfb\\x9c\\x2c\\xc8\\x4e\\x9b\\xf3\\x70\\xe6\\xf5\\x05\\x2b\\x56\\xb3\\x42\\x9e\\xb4\\x77\\x7b\\xae\\x05\\x32\\x4b\\xc2\\xa7\\x4f\\x3a\\x6d\\xd7\\xc2\\xd0\\xaf\\x07\\xca\\x4d\\xcd\\x89\\xd0\\x59\\xe3\\x5e\\x54\\x4f\\xf3\\x74\\xd0\\x9b\\x08\\x52\\xa6\\x2a\\x1f\\x42\\x0a\\x8e\\x12\\x09\\x0a\\x76\\xca\\x2a\\x17\\x6e\\x0f\\x5d\\x0d\\x81\\x0c\\x99\\x4b\\x57\\x51\\x5c\\x44\\x31\\x79\\xaa\\x95\\x2e\\x0b\\x90\\xe0\\xe8\\x79\\x18\\xe7\\x8d\\x21\\x75\\x50\\xea\\xb4\\x37\\xd1\\xdf\\xc8\\x6c\\x3c\\xaa\\xb4\\x06\\x25\\x78\\xd0\\x3b\\x1f\\x2d\\x8b\\x68\\x5b\\xb4\\x54\\xb4\\xef\\x45\\x27\\xee\\x18\\xc5\\x34\\xf0\\x1d\\xac\\x73\\x16\\xb2\\x10\\x0c\\x03\\xe1\\x01\\x8b\\xf7\\xc8\\xb6\\x2b\\x13\\xbd\\xd8\\x89\\x42\\x9d\\xf7\\x43\\xca\\x4f\\xec\\x93\\xce\\xfc\\x52\\x0a\\xd6\\xe3\\x3f\\x54\\xae\\x2f\\xf2\\x1e\\x27\\x26\\x02\\x26\\x5e\\xcc\\xaa\\x39\\xaa\\xb5\\x8b\\x82\\xd4\\xd9\\xaf\\x94\\xac\\xe0\\xa0\\xda\\x58\\x71\\x0e\\x24\\x28\\xb8\\x11\\xdb\\x89\\xed\\xfa\\x85\\x94\\x6c\\x49\\x3d\\xfa\\xe6\\x44\\x0f\\xb2\\x67\\x3c\\x27\\xba\\x14\\xd1\\x91\\x39\\x28\\xa3\\xce\\xae\\x66\\xcb\\x18\\x06\\x19\\xde\\xde\\x45\\x03\\xa8\\x5b\\xdc\\x15\\x6c\\xeb\\xca\\xce\\x83\\x30\\xc4\\xf4\\x1a\\x0d\\x64\\xa0\\x06\\xad\\xdc\\x44\\x9d\\x1d\\x7d\\x2c\\x35\\x31\\x8e\\x67\\xc3\\x20\\x6e\\xd0\\xea\\xea\\xa6\\xe3\\xc9\\xf4\\x68\\x00\\x37\\x99\\xc1\\x3d\\x23\\x28\\xcc\\x13\\x45\\x3a\\x21\\xe4\\x83\\x46\\xc9\\x22\\x26\\xa7\\x5b\\xc6\\xf9\\xe8\\x5d\\x83\\xe2\\xe3\\xfa\\x6e\\x8a\\x83\\x0c\\x13\\x79\\x95\\xc9\\xfc\\x3f\\x44\\x3f\\xde\\x3f\\x03\\x81\\x17\\x30\\xcc\\x38\\x29\\x34\\x9b\\x4d\\x02\\x7a\\x18\\x00\\x39\\xe6\\x6a\\x34\\x5d\\x64\\x11\\x08\\xd0\\xa0\\x05\\x8a\\x58\\x04\\x66\\x56\\x63\\x18\\xc4\\xe7\\x5b\\xc3\\x34\\x88\\x47\\x13\\x94\\xe1\\xf4\\x22\\x1a\\x71\\x41\\x27\\x18\\x01\\x58\\xf7\\x7f\\xd8\\x8a\\x7e\\x6c\\x99\\x68\\x97\\x1c\\x1c\\x30\\x0f\\x15\\x0a\\xd2\\xc4\\x18\\xa7\\x44\\x9c\\x08\\xa6\\x67\\x49\\x1a\\xe5\\x93\\x19\\x0a\\x71\\x36\\x4a\\xa3\\x21\\x65\\xe7\\x4c\\xcc\\xc6\\x71\\xeb\\x32\\x3a\\x8f\\xe6\\x38\\x8c\\x02\\x90\\xb5\\xc9\\xaf\\xad\\xc3\\x38\\xc7\\x69\\x1c\\xd0\\x40\\x92\\xa7\\xcf\\x82\\xf8\\xfc\\x74\\x9f\\x02\\x71\\x4a\\xe9\\xe2\\x7f\\xfd\\xc4\\x46\\x1c\\x9f\\x9d\\x92\\xa1\\x9e\\x42\\x1c\\xd8\\xd3\\x30\\x3a\\x8b\\x9c\\x81\\x2f\\xf9\\x94\\xda\\x56\\xc2\\x90\\xcb\\x4e\\x7c\\xa6\\x46\\x7c\\x12\\x13\\x8b\\x38\\xb5\\xc4\\x1a\\x79\\x56\\xe6\\x2c\\x43\\xc3\\x76\\xc2\\x28\\xe3\\x80\\xca\\x19\\x1b\\xff\\x7a\\xb1\\xf1\\x77\\x9d\\xf6\\xbe\\x60\\xf0\\x6c\\xaf\\x6a\\x94\\x24\\xb6\\x86\\xdc\\xd0\\x23\\xb4\\xd1\\x06\\x11\\x1c\\x7a\\xd5\\x99\\x1f\\x13\\xb4\\x3e\\x27\\x58\\x45\\x03\\xd4\\xa0\\xe2\\x7a\\xe3\\xe9\\x1e\\x7a\\x5c\\x74\\xb5\\xc9\\x43\\x67\\x3d\\xee\\x1a\\xe4\\x29\\xb2\\xa2\\xc9\\x80\\x4b\\x5d\\x4b\\x6d\\x33\\x00\\x96\\xd4\\xcb\\x33\\x26\\x29\\xe1\\x1c\\x16\\xd4\\x59\\x44\\x0e\\xb5\\x51\\x9c\\xe5\\x51\\xbe\\xa0\\x6e\\xef\\x71\\x88\\xa2\\x10\\xc7\\x39\\x11\\x2a\\x52\\x07\\x99\\xd0\\x56\\x0f\\xe3\\x30\\x2a\\x05\\x0f\\x36\\x44\\x3c\\xcd\\x9a\\xfc\\x0c\\x26\\x42\\x9e\\x42\\xbc\\xdc\\xfb\\x12\\x04\\xf7\\x01\\x84\\xfb\\x05\\x0c\\xf7\\xd7\\xc1\\x6b\\x55\\x48\\xd5\\xf0\\x63\\x2c\\x88\\x9c\\xde\\x6c\\x5f\\xe5\\x70\\x1b\\x2f\\x3e\\xbc\\x22\\xf3\\xcb\\xbd\\x19\\x65\\xcc\\x49\\x4f\\x05\\xec\\x7e\\xd3\\xf5\\x61\\x92\\xd8\\xf6\\x37\\x1e\\xbe\\x99\\x4e\\x16\\xdd\\xb1\\x51\\x94\\xd1\\x68\\xcc\\xf2\\xbe\\xe7\\x3c\\x17\\xfd\\x46\\x6a\\x38\\xcf\\x43\\x15\\x99\\x40\\xa3\\xe9\\xe4\\x1a\\x4e\\x1a\\xc2\\x99\\x42\\x62\\x3c\\x14\\x01\\x0e\\x59\\xef\\x5e\\x72\\x61\\xc4\\xf6\\x38\\x58\\x11\\x91\\x4a\\xf6\\x48\\xce\\x12\\xc0\\x1a\\x6d\\x2c\\x6f\\xa5\\x2c\\xb0\\x0b\\x43\\xf7\\x8e\\x84\\xad\\xc3\\xa5\\xe0\\x71\\x7a\\x2c\\x35\\x51\\xe2\\xa1\\xf6\\x05\\x5c\\xc9\\xea\\xde\\x2a\\xd6\\x0c\\x94\\xba\\xf5\\xc7\\xbf\\x5e\\x1c\\xb7\\x1f\\x3f\\x3d\\xf9\\xb3\\x7b\\xd3\\x78\\xf1\\xe1\\x15\\xf9\\xbe\\xff\\xf8\\xbf\\x4e\\xfe\\xec\\x6c\\xdf\\x7c\\x12\\x3f\\xb6\\xdb\\xcd\\xed\\xce\\xcd\\xe6\\xff\\xde\\x6a\\xe5\\x70\\x07\\x25\\x04\\x32\\x6d\\x0c\\x69\\x13\\x83\\x94\\xaa\\xd1\\x70\\xd2\\x9d\\x35\\x4d\\x00\\x0b\\x4f\\x0e\\x4a\\x3c\\xaf\\x69\\x78\\x5e\\x65\\x3d\\xb7\\x33\\x0f\\xcf\\xab\\x9c\\xc3\\x30\\x11\\x05\\x72\\xe4\\xf8\\x2c\\xdb\\x3d\\xf4\\xe9\\x93\\xe9\\xdd\\xce\\x9a\\xd1\\x37\\x46\\x51\\x95\\x29\\xeb\\x11\\xa8\\xe5\\xde\\xb7\\x83\\x42\\x2d\\xfb\\xad\\x85\\xc4\\x6e\\x7b\\x25\\x2f\\x29\\x7a\\xf4\\x21\\x18\\xcb\\x16\\x33\\xb9\\xc2\\xaf\\x19\\x3b\\x6e\\xcf\\x92\\xf0\\xf1\\xd3\\x27\\x8f\\x3b\\x6d\\x51\\x0c\\x74\\x59\\x30\\x8a\\x51\\x32\\x45\\x8d\\xc3\\xa3\\xb7\\x5b\\x87\\x2f\\x0e\\x10\\x39\\x67\\xf7\\xbb\\xed\\xf6\\xf6\\xa6\\x6b\\x8f\\xd4\\x74\\x57\\xd5\\x2e\\x69\\x4a\\x19\\x11\\xc9\\xcb\\xd6\\x44\\x23\\xd3\\xe9\\x74\\x9b\\xa8\\xbb\\x9a\\xaf\\x99\\xbc\\xe9\\x69\\x45\\x05\\x84\\xcf\\x5a\\xe8\\x5f\\xef\\x5f\\xfc\\xe4\\x22\\xbe\\xa2\\x21\\x3b\\x76\\x9c\\x3d\\x9a\\x89\\x4e\\xaa\\xe9\\x8b\\xae\\x82\\x50\\x1b\\x9b\\xe8\\x1f\\x1a\\x14\\x3e\\x69\\xa2\\xde\\x26\\xea\\xa3\\x8d\\x8d\\x95\\xf0\\x38\\x9a\\x46\\x10\\x2c\\x48\\x0c\\x08\\x74\\xee\\x51\\x6c\\xc2\\x0b\\xc1\\xea\\x4f\\xfb\\xbf\\xbd\\x7d\\xf9\\x9f\\x6f\\xdf\\xff\\xec\\xa2\\x3a\\x68\\xdb\\x41\\x73\\xe5\\xfe\\xbd\\x88\\x8f\\x56\\x5a\\x1b\\x2e\\x3b\\x9d\\xf5\\x61\\x92\\x71\\x17\\xbf\\xf3\\xbe\\xf9\\x20\\x5f\\x45\\x91\\xb1\\x61\\x23\\x9a\\x02\\xcd\\xb9\\x5e\\x17\\xd8\\x96\\x21\\xe9\\x39\\x43\\x91\\xc9\\x40\\x50\\x1c\\xe2\\xab\\x08\\xec\\x19\\x82\\x07\\x69\\x55\\x05\\xfc\\x3c\\x5f\\x39\\xfd\\x23\\x59\\x33\\x45\\xcf\\xfe\\xaa\\xbe\\xa0\\xb3\\xbb\\xd9\\x44\\xdd\\xb2\\xba\\x56\\xaf\\xdb\\x32\\xcd\\x66\\x09\\x47\\xbc\\xed\\x7a\\x7c\\x4c\\xdf\\x74\\xe5\\xb6\\xf6\\x10\\x8a\\x16\\xd7\\xb4\\xf2\\x95\\xcf\\xfd\\xbe\\xfa\\xf3\\xe6\\xa4\\xb9\\xbd\\x73\\x77\\x31\\x7b\\x77\\x31\\xfb\\x7d\\x5d\\xcc\\xf2\\xdb\\xd8\\xf9\\xa8\\x9e\\x33\\xcc\\x2d\\xb8\\xab\\xdc\\x5f\\x64\\x18\\xce\\x9d\\xa3\\xfc\\x7e\\xe9\\x3a\\x76\\xad\\xf9\\x04\\xd5\\xa6\\x0f\\xe7\\x23\\xad\\x2b\\xc4\\x3c\\xc8\\x27\\x4d\\x14\\x63\\xad\\x1b\\xe8\\x29\\x28\\x21\\x75\\x71\\x50\\x98\\x7f\\x27\\x35\\x1f\\xe3\\xde\\xe7\\xba\\x78\\x4d\\xcc\\x7e\\x1b\\x6c\\xbe\\xc9\\x9f\\xb2\\x01\\x16\\xf8\\x7c\\x0a\\x1b\\x28\\x60\\xe2\\x39\\x7f\\xd0\\xf8\\x93\\xd4\\xe8\\x17\\x6d\\x54\\xb2\\x4f\\x97\\xaa\\xb7\\x92\\xb8\\xb1\\x01\\x18\\xd8\\x68\\x4a\\x41\\x44\\x75\\xa1\\x32\\x92\\x38\\x4b\\x08\\x13\\xa5\\x91\\x96\\x0e\\xdf\\x1d\\xa0\\xc2\\x12\\x8b\\xc6\\x5f\\xda\\x68\\x22\\x9d\\xc1\\xf4\\x29\\x65\\xcf\\xcc\\xc0\\xac\\x62\\x56\\xef\\x05\\x61\\x1c\\xca\\xf0\\x69\\xc0\\xf3\\xe8\\x44\\x79\\xb2\\xb5\\x85\\x5e\\x1f\\x1e\\x7d\\x78\\xf1\\x0b\\x2c\\xf2\\x83\\xb7\\xbf\\xfc\\xf2\\xe2\\xe0\\xc3\\xe1\\xdb\\x5f\\xd0\\xfb\\x17\\x47\\xef\\xde\\xfe\\x72\\xf4\\xe2\\xc8\\x09\\x54\\x18\\xe4\\x81\\x0c\\x15\\x04\\x0f\\xd1\\xe5\\x89\\x7a\\xc8\\x5c\\x7a\\x66\\xc1\\xd5\\x28\\x99\\xcd\\xa7\\xf8\\x2a\\xca\\xaf\\xfb\\x68\\x57\\x21\\xf2\\xd2\\x40\\xe0\\x06\\x48\\x98\\x1f\\x92\\xa6\\xa5\\x98\\xbe\\x9b\\x55\\xc3\\x77\\x11\\xe2\\xa4\\xd2\\x20\\xe2\\x6a\\x93\\xd0\\x6e\\x76\\xb9\\xb5\\x05\\xd2\\x12\\xb0\\xca\\x10\\x5d\\x4e\\xa2\\xd1\\x04\\xcd\\x82\\x7c\\x34\\x61\\x87\\x1f\\xba\\xd7\\x12\\xde\\x1c\\x6a\\xeb\\x47\\xe3\\x52\\x0e\\x2a\\x06\\x92\\xcd\\xea\\x92\\x19\\x3d\\x54\\x46\\x63\\x08\\x10\\x54\\xea\\xee\\x54\\xbf\\xa6\\x8e\\x21\\x4a\\x4c\\x14\\x9e\\x54\\x13\\x58\\x55\\x1a\\x21\\x38\\x61\\xc5\\x2d\\x01\\x91\\x8d\\x96\\xa5\\x8e\\xa8\\xcd\\xd0\\x3c\\x1b\\xa3\\xa9\\x03\\x83\\xb9\\x28\\x24\\x17\\x4b\\xb1\\x12\\xdb\\xd3\\x84\\x76\\x13\\x1e\\x08\\x0a\\x2c\\xd0\\x59\\xaa\\xd1\\xd8\\xae\\x66\\x1b\\x55\\xfe\\x09\\xf1\\x14\\xe7\\xd8\\xd6\\xd2\\xd2\\x71\\x08\\x7d\\x4e\\xa1\\xbf\\x13\\x89\\x00\\x56\\x0a\\xa3\\x50\\x0a\\x00\\xe8\\x88\\xa9\\xad\\x79\\x4c\\xb3\\xad\\x21\\x22\\x09\\x24\\x63\\x14\\xe5\\x2d\\x09\\xdd\\x5c\\xd8\\x57\\x17\\x9b\\xf4\\xbe\\xa4\\xff\\x34\\x06\\x6a\\x92\\xb6\\x0a\\x49\\x82\\x55\\x9b\\x95\\xe3\\x11\\xe9\\x38\\x45\\x79\\xf7\\xa8\\xde\\x76\\xd3\\x05\\xf8\\x5b\\x30\\x5d\\x40\\xf2\\xd4\\xe3\\x93\\x6a\\x40\\x8a\\xe7\\x2f\\x1e\\x1f\\xbc\\xfa\\xf5\\x97\\x9f\\x5f\\xbc\\xaf\\xb4\\x1d\\xe2\\xd1\\x64\\x11\\x9f\\xe3\\x90\\x79\\xe0\\xab\\x83\\x61\\x9f\\x56\\x8a\\xe7\\xd3\\x60\\x84\\x1b\\x5b\\xff\\x7d\\x73\\xfc\\xdf\\xf1\\x7f\\xa7\\x27\\xff\\xf8\\xef\\x3f\\xb7\\xce\\x9a\\x1b\\x37\\x9f\\x1e\\x3f\\xfe\\xf4\\xe7\\xc6\\x26\\xe9\\xe4\\xa6\\x4a\\x52\\x72\\xbd\\xff\\x3e\\xe1\\x35\\x8f\\x59\\xdd\\x13\\x52\\xf9\\x98\\xd7\\x3e\\x39\\xb6\\xd7\\x2f\\xd7\\x56\\x2a\\x3b\\xea\\x16\\x7d\\x4b\\x3d\\x8b\\x8e\\x35\\x75\\x99\\x91\\x0a\\x29\\xb6\\x51\\xde\\x88\\x14\\x8c\\x55\\x79\\x14\\x4c\\xa2\\x86\\xdf\\x6e\\x6d\\x81\\x25\\x10\\x66\\x81\\x79\\x21\\xf6\\x2f\\x34\\x54\\x29\\x29\\x96\\x2e\\x29\\x73\\x40\\x8a\\xe8\\x39\\x16\\xcb\\xb4\\x53\\x2a\\x8b\\x1e\\x21\\x1a\\x09\\x4b\\x7b\\xc0\\x13\\x16\\x62\\x06\\x8e\\x6f\\x36\\xb2\\xd7\\x19\\xd8\\xb3\\xb8\\x58\\xd5\\x55\\x8b\\x78\\x36\\x0d\\x64\\xd8\\x79\\xca\\x40\\x0f\\x4c\\x40\\x33\\xd4\\x65\\x39\\x39\\x29\\x71\\xdb\\x76\\x48\\xa6\\x1c\\x8f\\xf0\\x14\\x05\\xd3\\xa9\\x08\\x61\\xa4\\xad\\x3b\\x9a\\xe2\\x20\\xe5\\x16\\xed\\xa5\\x5e\\xd9\\x63\\x03\\x23\\xd3\\x17\\x86\\x8c\\xc9\\x39\\x6f\\xd0\\x26\\x7a\\xa8\\xed\\x98\\x44\\x10\\xf9\\x63\\x75\\xcd\\xd1\\xc4\\x20\\x13\\xe8\\x6e\\xa2\\x4e\\xbb\\xdd\\x46\\x0f\\xe9\\x95\\xbb\\x61\\xfa\\xaa\\x19\\x6f\\x90\\x7e\\x9f\\x81\\x98\\x30\\x80\\x5d\\x8e\\x6f\\xc2\\x38\\x33\\xcc\\xe8\\x15\\x62\\x67\\x2e\\x4a\\x31\\x63\\xd0\\xd2\\xa8\\xae\\x52\\x82\\x81\\x34\\xa3\\x71\\xa3\\xe2\\x88\\x53\\x19\\x20\\x65\\x83\\xad\\xf9\\x22\\x9b\\x18\\x9c\\xa3\\x0c\\x77\\xa9\\x72\\x75\\x75\\x8b\\xd1\\xef\\x31\\x3f\\x31\\x99\\x28\\x08\\x43\\x08\\x2f\\x2e\\xfc\\x88\\x12\\x65\\xcf\\x29\\x24\\x7a\\x7a\\xdb\\x26\\xb1\\x6f\\x2a\\x4a\\xf1\\xd3\\x2b\\xd3\\x4d\\x45\\x63\\x14\\x14\\x1b\\x16\\xc8\\x59\\xdc\\x5a\\x40\\x3c\\x3d\\x0c\\x69\\xad\\x20\\x4d\\xa3\\x0b\\xac\\xdd\\xb9\\x82\\x50\\x10\\xce\\x41\\x45\\x4a\\x70\\xef\\x50\\x9a\\xea\\xf2\\x3e\\xe5\\xe5\\xc6\\x14\\x51\\x93\\x90\\x6b\\x26\\x46\\xa1\\x4f\\x9f\\xf8\\xaf\\xe3\\xf6\\x49\\x45\\xec\\x01\\x23\\x30\\x0a\\x7c\\x51\\x8b\\x3d\\x50\\x6b\\xd2\\x87\\xba\\xc3\\x81\\x56\\xd0\\x40\\x03\\x01\\xa5\\xcf\\xc1\\x8b\\x54\\x69\\x09\\x40\\x78\\x5f\\x32\\x39\\x68\\xa9\\x81\\x33\\x07\\x99\\x1d\\xa1\\xcb\\x09\\xe6\\x01\\x23\\x43\\x7a\\x9c\\x04\\xad\\x03\\x5c\\x7e\\x12\\x21\\x2e\\xd4\\xcd\\x1c\\x5b\\x72\\x75\\x66\\xab\\xea\\xf1\\x53\\x51\\x88\\x8d\\x93\\xb4\\x41\\x50\\x7c\\x8e\\xaf\\xa9\\x0e\\x45\\x37\\x76\\xbd\\x7f\\x58\\x43\\x5f\\xb8\\x9c\\x6f\\xef\\x1c\\x5f\\xeb\\xd2\\xed\\x59\\x30\\x7d\\x8e\\xaf\\x4f\\xcc\\x3e\\x3c\\x1b\\x49\\x8c\\x0e\\xdf\\x1d\\x6c\\x94\\x8d\\x27\\xf8\\x87\\x89\\x98\\x96\\xb6\\x9d\\x36\\x96\\x1e\\xab\\xfc\\x40\\xce\\x82\\x3c\\x5a\\xa4\\x10\\xd4\\x42\\x3a\\x65\\x47\\x19\\xca\\x72\\xb2\\x16\\x01\\x7c\\xdd\\x52\\xd4\\xbb\\x01\\xb9\\xe6\\x54\\xef\\xb0\\xa3\\x8d\\x4d\\xa6\\xaa\\x16\\xca\\x92\\x1f\\xd9\\xcf\\x53\\xcc\\x20\\x6e\\x52\\x92\\x54\\xe1\\x3f\\x4b\\xa4\\x70\\x14\\x6c\\xca\\xef\\x9d\\x96\\x0f\\xb6\\x97\\x69\\x94\\x43\\xb8\\x65\\x03\\xff\\x96\\x8a\\x96\\x74\\x0e\\xa7\\x66\\xa5\\x03\\x4f\\x6d\\x7c\\xcf\\xd4\\x9b\\x41\\x23\\xac\\x45\\x99\\xcd\\xe9\\xb8\\x3c\\x3e\\x5d\\x7f\\xf8\\xc8\\x10\\x77\\xa0\\x10\\x9b\\x34\\x9b\\xd2\\x72\\x28\\xe6\\x68\\xf6\\xc7\\x32\\xd2\\x28\\x1b\\xbc\\x95\\x3b\\x7c\\x14\\xa1\\x14\\x64\\x4b\\x37\\x7a\\x8b\\x8b\\xde\\x7a\\x04\\xc5\\x72\\x51\\x45\\x4e\\xd4\\x0f\\xb9\\xbe\\x44\\xa4\\x91\\x68\\x4a\\x6e\\x0e\\x2a\\x1b\\x30\\x9d\\xd6\\x2b\\x51\\xc4\\xff\\x33\\x59\\x80\\x3b\\x60\\x11\\x43\\xe5\\xfe\\xc6\\xa3\\xf2\\x66\\xf5\\x68\\xe3\\x3e\\xca\\x64\\x0f\\xc2\\x96\\xec\\x50\\x58\\x6c\\x0e\\x10\\x0a\\x24\\xc9\\x51\\xb6\\x98\\xcf\\x93\\x34\\x07\\x45\\x3b\\xb5\\x4c\\x7a\\x77\\x80\\x84\\x6a\\xd5\\x1c\\x8f\\xdc\\x6f\\x41\\x2c\\xe1\\x82\\xbc\\x3c\\xd3\\xf0\\xa7\\xe6\\x5a\\x94\\x6c\\x55\\xb8\\x01\\xed\\x7a\\xba\\x96\\xe6\\x3c\\x3f\\x6b\\x59\\xb6\\xb1\\x86\\x92\\xb6\\x5f\\x18\\x15\\x98\\x97\\xef\\x8d\\x5c\\xb1\\xd5\\x6e\\x4e\\x9a\\xdb\\xbb\\x77\\x77\\x47\\x77\\x77\\x47\\xdf\\xe5\\xdd\\x11\\xf3\\x05\\xbe\\x95\\x20\\x6a\\xfb\\x41\\x9a\\xc4\\xe8\\xe7\\xc5\\x2c\\xb8\\x88\\x32\\xf4\\x43\\x40\\x7e\\xfe\\x9f\\x73\\xfa\\xb3\\x35\\xc3\\x5e\\xf7\\x4b\\x5b\\x5b\\xe8\\x30\\x8e\\xf2\\x28\\x98\\x46\\xff\\xc6\\xe8\\x9f\\x14\\x5a\\x42\\xd8\\x01\\xca\\xc0\\x1a\\x9b\\x1b\\xc3\\x02\\x62\\xc8\\x12\\x97\\x23\\x26\\x67\\x85\\x25\\x37\\xd9\\x73\\x79\\xf5\\x41\\x89\\xcd\\xce\\x70\\x96\\x05\\x67\\xf8\\x30\\xec\\xa3\\xb6\\xfb\\x7c\\xa1\\xb7\\x62\\xa0\\x16\\x94\\x04\\x9d\\xdc\\x54\\x97\\x87\\x27\\xf6\\x32\\xed\\x14\\xc1\\x8b\\x95\\x97\\x95\\x10\\x19\\xac\\x74\\x32\\xe6\\x13\\x07\\x10\\x14\\x46\\xb9\\xba\\xda\\xa0\\xe9\\xbf\\x61\\x4e\\xda\\x4d\\x49\\xdf\\x3a\\xe6\\xcd\\xf1\\x57\\x74\\x31\\x07\\x6a\\xaa\\xad\\x72\\x08\\x69\\x69\\xa4\\xa4\\x7f\\xe3\\x28\\x0b\\x6a\\x63\\x68\\x2f\\x02\\x34\\x2b\\x9b\\x20\\x85\\xa1\\xc9\\x80\\xd0\\xe6\\x0e\\xa6\\x45\\xaa\\x5b\\x57\\xe9\\xbe\\x8b\\x83\\x54\\x31\\xc4\\x15\\x2e\\x56\\xf7\\x2a\\x0a\\xc4\\xad\\x2d\\x14\\x84\\x17\\x41\\x3c\\xc2\\x9c\\x0a\\xd0\\xe1\\x73\\xa5\\x04\\x87\\x5e\\x10\\xc9\\xa3\\x47\\xbe\\x31\\xa2\\x5d\\x8e\\xf6\\x51\\xd8\\xaf\\x36\\x5f\\x2d\\xc6\\x7d\\xf1\\x19\\xa6\\x2a\\xef\\xb9\\xfb\\x3d\\xfd\\x4b\\x8e\\xe8\\x25\\x47\\xfc\\xe5\\x43\\x3f\\x0b\\xe3\\x44\\x8e\\x5b\\xa1\\xf8\\xe0\\x46\\xc3\\x0e\\xba\\x66\\xe6\\xaf\\x55\\xc5\\x7d\\xc5\\xc2\\x5c\\x4f\\x74\\x9a\\x70\\x6a\\x25\\x00\\xfc\\x4c\\x19\\x39\\x9a\\x4b\\xf0\\x28\\x94\\xc8\\x9b\\x36\\x58\\xb0\\xd0\\x68\\xcb\\xd2\\xcd\\x19\\x2b\\xfc\\x0f\\x01\\x53\\x0b\\x5f\\xe0\\xf4\\xba\\xc1\\xb3\\xed\\x1f\\x45\\xf1\\xd9\\x14\\xbf\\xa1\\x13\\xbb\\x89\\xfa\\x48\\xfb\\xa2\\x68\\xa9\\x44\\x56\\x02\\x30\\x7d\\x35\\x46\\x30\\x9a\\x73\\xbe\\x38\\xca\\x71\\x8a\\xd6\\xd8\\x05\\x93\\x0f\\x7f\\x4f\\xd7\\x8f\\xa9\\x14\\x2f\\xc4\\x29\\x60\\x30\\x18\\x50\\x7a\\x36\\x55\\x60\\xa1\\x24\\x79\\xbd\\x28\\xa4\\x55\\xa8\\xb5\\x8e\\xb1\\x16\\x2f\\xce\\x4e\\x2c\\xa5\\x2c\\x4c\\x5b\\x5b\\x28\\x89\\xa7\\xd7\\xc5\\x23\\x32\\xfd\\x44\\x64\\x97\\xd8\\x6e\\x99\\x03\\x79\\xc7\\x18\\xd1\\xd1\\x3d\\x65\\xe1\\x43\\x08\\x47\\x51\\x93\\x91\\x3f\\x23\\x95\\x2c\\xdc\\x9c\\xf1\\x63\\x36\\xe0\\x12\\x47\\xa6\\x7d\\x64\\x74\\x3b\\x63\\x4d\\x72\\x91\\x34\\xdc\\x04\\xe5\\x2f\\x5b\\xe6\\x0d\\xce\\xad\\x37\\xd1\\x38\\xc2\\xd3\\xd0\\x60\\x08\\xc7\\x7a\\x53\\x46\\xe2\\xe0\\xd2\\xf2\\x00\\x4a\\xac\\x9a\\x82\\x6c\\x58\\x20\\xfc\\xb5\\xe2\\x4c\\x2c\\x6a\\x59\\x42\\x7a\\x54\\x36\\x08\\x5e\\xa7\\xc5\\x37\\x07\\xfe\\x9b\\x6d\\x12\\x7e\\xf7\\x90\\x95\\x13\\x02\\xeb\\x47\\x3a\\x1d\\x10\\xe1\\xff\\xc9\\x9d\\xf0\\x7f\\x27\\xfc\\x7f\\x5f\\xc2\\xbf\\xc2\\x2a\\x80\\x8c\\xe9\\x42\\xfb\\x5c\\x31\\x3d\\xd6\\x6b\\x12\\x26\\x17\\x7d\\xc3\\xaf\\x0b\\x9c\\xee\\x61\\xa0\\x81\\x88\\x69\\xcc\\x7a\\xee\\xf7\\x45\\x7e\\x6a\\xf4\\x14\\x2c\\x94\\x3f\\x2f\\x45\\x7e\\x6a\\xed\\xc1\\x80\\x2f\\x17\\xe5\\x0a\\x79\\x4c\\x17\\x11\\x17\\x72\\xfb\\xbd\\xe4\\x41\\xdd\\xa5\\x6a\\xea\\x0b\\x4d\\x4d\\x9a\\xa0\\x52\\x57\\xb5\\xf4\\x46\\x7b\\xc9\\x02\\x3a\\xaf\\x37\\x41\\x1c\\x9c\\xe1\\xb4\\x92\\x37\\x53\\x66\\x9f\\x14\\x95\\x8a\\x12\\x8b\\x87\\xe4\\x2c\\xaa\\x4b\\xd2\\xd3\\x4c\\x8b\\xe1\\x4a\\x87\\xe9\\x6c\\x49\\x0f\\xc8\\x10\\x13\\x0e\\x18\\xc5\\x6a\\xe6\\x9f\\x92\\xd0\\x3f\\x0c\\x32\\x1a\\x36\\x50\\x97\\xfd\\x57\\xb7\\x5f\\x9f\\x61\\xc8\\x33\\x63\\xd9\\xa8\\xf5\\x79\\x84\\xcb\\x29\\x89\\x38\\x4c\\x2a\\x3c\\xda\\x9d\\xb6\\x82\\x58\\x06\\x83\\xea\\x43\\x9e\\x9e\\x99\\xf6\\x59\\x6e\\xc2\\xc5\\x8f\\x85\\x0d\\x41\\xa4\\xc2\\x42\\x9f\\xe7\\x00\\xc9\\x88\\xd8\\x29\\x9e\\x2c\\x89\\x78\\x96\\x8e\\xa7\\xb8\\x57\\x05\\xef\\x7c\\x21\\xb2\\x08\\xfc\\xb4\\xd0\\x1b\\xb2\\x75\\x45\\x38\\x43\\x40\\xc3\\x54\\x52\\x71\\xe0\\xbf\\x94\\xeb\\x67\\xe9\\x79\\xe0\\xc8\\xf8\\xf4\\xcb\\x62\\x3a\\x2d\\x62\\x49\\x36\\xc9\\x99\\x01\\x5f\\x45\\x8a\\x49\\x82\\x6d\\x2e\\x4a\\xf0\\x38\\xe7\\x84\\x1c\\x50\\x2b\\x13\\xa2\\x4d\\xb0\\xa9\\xb5\\xb2\\xe3\\x69\\x47\\x49\\xd9\\x79\\x32\\x6f\\xd0\\xf8\\xe2\\x54\\x04\\xa0\\x77\\xda\\xe9\\x59\\x46\\x71\\x7d\\x6f\\x4d\\xa2\\xad\\x7c\\x8d\\xc6\\xdc\\xcd\\xe4\\x59\\xf4\\x77\\xa1\\xe4\\xe7\\x92\\xfd\\xf4\\x4c\\x1b\\x71\\xc1\\x3a\\x6f\\xa0\\xd1\\xcf\\xd0\\x9f\\xa0\\xcf\\xbf\\x29\\x3c\\x51\\xe3\\x44\\xaf\\x44\\xa8\\x4c\\x94\\xdc\\xbb\\xd7\\x2c\\xc9\\xf3\\x41\\x8e\\x17\\x12\\xd3\\xf6\\x8d\\xcd\\x4a\\x9d\\x30\\xde\\x8e\\xdf\\xbf\\x3b\\x60\\xa9\\xe0\\x97\\x0a\\x6a\\xa8\\x99\\x15\\x96\\x9b\\x8a\\xae\\x1b\\x98\\x73\\xa1\\x9e\\x71\\xcc\\x02\\xad\\x79\\x48\\x2a\\x9a\\x27\\x41\\xbb\\x64\\x2a\\xaf\\x2c\\xd8\\x96\\x7a\\xf1\\x42\\xf6\\x3d\\xcd\\x1e\\xe7\\xa0\\x7f\\x1f\\xc7\\x14\\x4d\\xab\\xa5\\xd3\\x86\\x48\\x93\\xd2\\x44\\x51\\x1c\\xe2\\x2b\\x5b\\x24\\x41\\xb1\\x83\\xfe\\xa3\\xf8\\x4e\\xd7\\x2e\\x54\\x3d\\x21\\xcc\\x53\\xfa\\xb9\\x84\\xf5\\xa3\\x75\\xb2\\xe9\\x6e\\xcd\\x4d\\x63\\x6a\\x4e\\x38\\x4d\\x5c\\x56\\x4f\\x9f\\x62\\x4f\\x03\\x67\\x98\\xf3\\xb7\\x3c\\x87\\xb9\\xa2\\x28\\x01\\x88\\xcd\\x8e\\x3e\\x65\\x11\\x05\\xa2\\xd7\\xc2\\xc1\\xfe\\x1f\\xda\\x02\\xa2\\xc9\\xfe\\x12\\xd1\\x8b\\x4b\\xfa\\x56\\xd8\\x9d\\x78\\x5c\\x04\\xbe\\x9c\\x9c\\xa7\\x76\\xf7\\x81\\x3d\\x28\\xb3\\xb9\\xa5\\x90\\xaa\\x57\\x82\\xea\\x96\\x11\\xcf\\x8c\\x27\\xa5\\x62\\x12\\xc9\\x2c\\xd7\\x99\\x44\\x8f\\x49\\xad\\x50\\x49\\x5a\\xe6\\xba\\x0a\\x50\\x46\\x66\\xbc\\x0d\\x71\\x20\\xd7\\x91\\x82\\x39\\x6b\\x1e\\x68\\xad\\x2b\\x6f\\x55\\x45\\xa6\\x4f\\x92\\x3c\\x75\\x45\\x7a\\xca\\xb1\\x3c\\x81\\x18\\x9d\\x37\\xf5\\xac\\x30\\xfc\\xa8\\x9b\\x06\\x52\\x80\\xa3\\x68\\xb8\\x88\\xa6\\x34\\xab\\x68\\x09\\x39\\xa4\\x50\\x25\\xeb\\x17\\x6c\\xe7\\x1f\\xde\\x3e\\x7f\\x7b\\xef\\xde\\x3d\\x38\\xec\\x6e\\x64\\x68\\x71\\x36\\xbd\\x6e\\x21\\x9a\\x85\\x9c\\x1c\\x8f\\x17\\x19\\x91\\x98\\xf2\\x4a\\xaf\\xb1\\x94\\x50\\x8b\\x7c\\xe7\\x96\\xb0\\x95\\x9b\\x68\\xc2\\x70\\xa1\\x80\\x88\\xa3\\xa5\\x0d\\x0b\\x9d\\x0c\\x3f\\x1e\\x93\\x62\\xc7\\xed\\x93\\x13\\x72\\x68\\x90\\x7f\\x7e\\xfa\\x54\\x71\\x72\\x29\\x57\\xa1\\x5f\\x3a\\x50\\x97\\x8c\\xd5\\x33\\x7f\\x43\\xa9\\x57\\x4d\\x4d\\xbf\\x59\\x13\\x78\\x77\\x19\\xe1\\x08\\x8b\\xb1\\xaa\\x83\\x0f\\xcd\\x82\\x1c\\xdb\\xa3\\x31\\xa0\\x4a\\x7a\\x49\\x76\\x38\\x2e\\xd4\\x53\\xcb\\x24\\xfb\\xe3\\x13\\xc5\\x6d\\x14\\x6c\\x49\\xa2\\x91\\xac\\x54\\x83\\xbe\\xd5\\x63\\x54\\x61\\x4f\\x50\\x5c\\x97\\x17\\x03\\x92\\xe3\\xa4\\x5b\\x7c\\x0b\\xca\\x80\\xd0\\x7a\\xac\\x3f\\x99\\xf7\\x0b\\x2f\\x11\\x83\\xc5\\xab\\x33\\x40\\x76\\x75\\x38\\x4a\\xf3\\xe6\\x21\\x1a\\x03\\x53\\xab\\x3f\\x49\\xd1\\xba\\x69\\xfa\\x18\\x3c\\xa4\\xea\\xf2\\xb7\\x23\\x6c\\xe3\\x59\\xa4\\x18\\x0c\\x6c\\xde\\xbf\\x3b\\x10\\x11\\xa3\\xa9\\x45\\xe9\\x28\\x88\\xc5\\x49\\x2a\\x8a\\x99\\x16\\xd6\\x2f\\x66\\xb5\\x2e\\x9d\\x2b\\xdb\\x90\\x5a\\xad\\x16\\xbf\\xcf\\xb3\\x6d\\x48\\xd2\\xa5\\x4d\\xb9\\x29\\xcb\\x06\\xe5\\x9b\\xf2\\xd5\\x98\\x7d\\x75\\x99\\xc5\\xc1\\x69\\x51\\x4d\\xd1\\x2a\\x53\\x89\\x6b\\x22\\x59\\x0b\\x9e\\x9a\\xe0\\x37\\xb2\\xe1\\xaa\\xaf\\x95\\xc8\\xde\\x9d\\xa2\\xf8\\x4e\\x51\\xfc\\x7d\\x29\\x8a\\x99\\x76\\x38\\x1c\\xde\\x82\\x81\\x88\\x8f\\xa2\\x58\\xa8\\x73\\x65\\x4d\\x31\\x65\\x90\\x15\\xd5\\xef\\xf3\\x67\\x0a\\xcf\\x22\\xc3\\xd7\\x47\\xaf\\xac\\xa8\\x24\\x01\\x53\\xa5\\xc7\\x9a\\xc0\\x73\\x19\\x9e\\x8e\\xf5\\xc6\\xbd\\x14\\xa2\\xac\\xa1\\x71\\xfa\\x64\\xb6\\x0b\\x46\\x59\\xb8\\x24\\x8d\\x36\\x48\\x27\\x9a\\x0d\\x95\\x15\\xae\\xa8\\x60\\x1b\\x3a\\xd8\\x3d\\xef\\xc7\\x0a\\x61\\xc9\\x1e\\xe6\\x02\\xb8\\xfd\\x22\\x17\\xb1\\x1e\\x62\\x7c\\xc9\\x26\\x46\\x93\\x84\\x80\\x88\\x7a\\x7d\\xb4\\x21\\xca\\x1b\\x72\\x5d\\xf7\\xd1\\x46\\x38\\x3c\\xb5\\x95\\xe2\\x87\\x81\\xed\\xca\\x58\\x2a\\xc0\\x9d\\xe1\\x7a\\xc0\\x89\\xf2\\x56\\xe0\\x6c\\xa5\\x38\\x70\\x5d\\x37\\x70\\xf3\\x45\\xfe\\x0a\\x5f\\xf9\\xa3\\xed\\x15\\xbe\\x72\\xe1\\x4c\\x5f\\xa4\\x1e\\xc2\\xfc\\x61\\xa2\\x85\\x5d\\xa8\\xb2\\xc3\\xe4\\xc0\\x13\\xdb\\xc3\\x8f\\xab\\xf5\\x39\\x81\\x34\\x8b\\x49\\x6e\\x32\\x94\\x36\\xd9\\x30\\x94\\x4a\\x27\\x9e\\x02\\xc0\\xf3\\x67\\xea\\xe6\\x4f\\xd7\\xc1\\xfd\\xfe\\x36\\xec\\xf4\\x4f\\xeb\\xec\\xf4\\x96\\xd0\\x07\\x0e\\xf6\\x25\\x17\\x2d\\xd2\\xfb\\x96\\x8a\\x17\\x2f\\x14\\x8e\\x27\\x96\\xeb\\x8b\\x2b\\x9a\\x5e\\xe8\\x7b\\x61\\x78\\xa4\\x7c\\x1d\\x86\\xb7\\x1c\\xbf\\x3b\\xc3\\xf9\\xbb\\xf3\\xd4\\x7f\\x85\\xbc\\x3b\\x4f\\xcd\\x2b\\x04\\xb3\\x29\\x3a\\x35\\x16\\xac\\xc1\\x4f\\xce\\x70\\xfe\\x2c\\x98\\x06\\xf1\\x08\\x3c\\x8c\\x3d\\xc1\\xe3\\x35\\xfc\\x60\\xb4\\x94\\xe6\\x80\\x76\\xbc\\x00\\x7d\\x77\\x7e\\x74\\x1d\\x8f\\xc0\\x6f\\xc6\\x1b\\x8f\\xb4\\x86\\x2f\\x32\\x8d\\xa5\\x6b\\x00\\x3a\\xc3\\x29\\x64\\xe7\\xf2\\x01\\x11\\xca\\x7a\\x00\\x67\\x2a\\x57\\x6b\\xa2\\xe3\\x0f\\xfe\\x3c\\x3a\\xfe\\x60\\x61\\xd1\\x12\\xce\\xf4\\xe5\\x6a\\x4d\\x6b\\xfc\\xe1\\xea\\xf7\\x28\\x9f\\x1c\\x45\\x67\\x71\\x1d\\xf0\\x78\\x1d\\x5f\\x30\\x2d\\xe5\\xeb\\x51\\xe1\\x7b\\x3c\\x4a\\xd2\\xb0\\xc6\\x6a\\x61\\x15\\xfc\\x68\\xd0\\x5c\\xd8\\xbc\\x21\\x97\\x81\\x1c\\x25\\xb3\\x59\\x94\\x7b\\xcf\\x36\\x2f\\xee\\x01\\xa0\\xa5\\xa8\\x19\\x89\\x65\\xf0\\x40\\xe3\\x5b\\x04\\x3a\\xf7\\x01\\x51\\xae\\xe2\\x01\\xa6\\xa3\\xb8\\x3f\\xa8\\x67\\x38\\x7f\\x13\\x5c\\xed\\x5f\\x04\\xd1\\x34\\x18\\x4e\\x7d\\x57\\x75\\xa9\\x96\\xdf\\xc4\\x3b\\x6a\\xac\\x2a\\xfa\\xd0\\xbd\\xa2\\xda\\xae\\xc4\\xf6\\x74\\xa6\\xc2\\xe9\\x19\\xd6\\xd6\\xe1\\x3c\\x5d\\xf7\\x32\\xfe\\x70\\x65\\x78\\xcc\\xd7\\xa0\\xb6\\x49\\x46\\xf9\\x1a\\x64\\x31\\xa2\\xab\\xbe\\x91\\xe7\\x59\\xdb\\xa6\\x8c\\x54\\x9b\\x60\\x67\\x96\\xec\\xb8\\x3c\\xa4\\xca\\x77\\x85\\x14\\x75\\xbf\\xbf\\xdd\\x69\\x56\\x44\\xbe\\x5e\\xfb\\x4e\\xb9\\x73\\xa7\\xdc\\xf9\\x2e\\x95\\x3b\\x38\\x9f\\x7c\\x21\\xed\\x8e\\xce\\x0c\\xd0\\x6e\\x09\\xc8\\x5d\\xdc\\x4b\\x95\\xe6\\xec\\x71\\x45\\x27\\xf4\\x0b\\xce\\xbf\\x98\\x52\\x88\\x01\\x15\\x61\\xed\\x31\\x69\\xae\\x3b\\x21\\xcd\\x3d\\x0f\\x47\\xf3\\xf5\\x28\\x82\\xb6\\xb6\\xb6\\x0a\\x4b\\x71\\x9d\\x15\\x3a\\x4b\\x66\\x11\\x11\\xaa\\x23\\xcd\\x67\\x38\\x4d\\x50\\x30\\x8f\\xa4\\xb1\\x29\\xe8\\x2e\\x1e\\xfb\\x84\\x04\\xad\\xee\\x79\\x64\\xaf\\x16\\x51\\x0c\\xf4\\x37\\x57\\x6c\\xc7\\x76\\xa5\\xa4\\x3c\\x83\\xbc\\x65\\x95\\xfc\\x95\\x95\\xb2\\x37\\x9b\\xd5\\xfa\\xfe\\x50\\xcc\\x31\\x4e\\x0f\\x92\\x45\\x9c\\xfb\\x40\\xe1\\x2a\\x5c\\x32\\x89\\xe8\\x33\\x3b\\xbf\\x3c\\x79\\x8e\\x47\\xd1\\x2c\\xa8\\xc6\\x78\\xb9\\xd9\\x5c\\x4a\\xf5\\xf1\\x0b\\xce\\xd5\\xbd\\x51\\x7b\\xf7\\x51\\x2c\\xaa\\xfb\\xfd\\xde\\x2e\\xd9\\x21\\x3b\\x77\\x3b\\xe4\\xdd\\x0e\\xf9\\x7d\\xed\\x90\\xca\\x86\\x66\\xdf\\x2c\\x6b\\xee\\x8e\\xac\\xd2\\xe7\\x8d\\xc4\\x5a\\x43\\x1d\\xe9\\xb1\\xd1\\xca\\xc5\\x97\\xd6\\x5e\\xbe\\xc3\\x69\\x96\\xc4\\xc1\\xf4\\x4e\\x7b\\x29\\x3e\\x95\\x23\\xe2\\x67\\x16\\x24\\x3e\\x8f\\x82\\x35\\xc6\\x97\\x2c\\xdb\\x95\\xe7\\x19\\xbd\\xa8\\x60\\x3e\\x9e\\xcf\\x19\\x35\\x9d\\x5a\\x0b\\x0b\\x6d\\x82\\xc6\\x23\\x37\\x56\\xb7\\xe0\\xe3\\x78\\x31\\x9d\\x9e\\xb8\\xb5\\x4c\\x45\\x7f\\xe4\\xc4\\xfc\\x26\\xc6\\xb3\\x24\\x8e\\x46\\xb5\\x47\\x26\\x57\\xae\\x35\\x4a\\x47\\xc5\\xd5\\x47\\x5c\\x1e\\x70\\x34\\x23\\x3b\\x7e\\xcd\\x81\\xaa\\x95\\x3c\\x06\\xe8\\xac\\xe0\\xaf\\x62\\xa3\\x4d\\xbd\\x0f\\x2e\\x7f\\xc6\\xd7\\xb5\\xc0\\xa5\\x55\\xbc\\x81\\x35\\x16\\xe7\\xa0\\xf6\\xdc\\xd4\\x44\\x5b\\xfa\\x70\\x5e\\x0b\\xce\\x0f\\xe7\\xde\\x30\\x6a\\x8b\\x9a\\xf5\\x55\\x65\\xf0\\x32\\x7f\\xc5\\x6f\\x66\\xd5\\xf7\\x0a\\xb0\\x0c\\xc5\\xc4\\xec\\x7a\\x92\\x6d\\x53\\xda\\x87\\xa8\\x95\\x38\\x53\\x35\\xbd\\x2c\\x8c\\xc2\\x3d\\x17\\x34\\x1e\\xbd\\xc7\\xa3\\xe4\\x02\\xfb\\x5e\\x01\\x89\\xf2\\x1e\\xa3\\xb5\\x95\\xad\\x71\\x3f\\xb0\\x88\\xa7\\xc9\\xe8\\xbc\\x1e\\x13\\x55\\xea\\x78\\x80\\xea\\x2a\\x5f\\x67\\x86\\xfc\\xe6\\xc6\\x7b\\x86\\x32\\x1c\\x87\\x1f\\xd2\\x20\\xce\\x82\\x22\\xc8\\xba\\x07\\x41\\xaa\\xb5\\x7c\\x68\\xd3\\x59\\x43\\xcc\\xd9\\x12\\x48\\x90\\x5a\\xae\\x4f\\xa4\\xf5\\xe7\\xbf\\xde\\xec\\xfb\\xcd\\xbd\\xcf\\xa6\\xe2\\x9a\\x7b\\xc7\\x60\\x6d\\x0a\\x03\\x06\\xa0\\xf6\\x18\\xaf\\xd9\\x1d\\x35\\xc0\\x4a\\x7c\\xdb\\xf4\\xd6\\x55\\xfb\\xc3\\x79\\xf5\\x8d\\xb2\\x76\\xaa\\xaf\\x05\\x17\\xa8\\xbe\\xca\\xb4\\x1a\\xf7\\x12\\x21\\x56\\x0b\\x48\\xdd\\xf9\\x28\\x06\\x3e\\xbf\\xc2\\x86\\x01\\xa7\\xbb\\xe1\\x41\\xb2\\xb6\\xa4\\x20\\x40\\xb9\\x52\\x4d\\xfd\\x87\\x59\\x01\\xc2\\xcf\\x1c\\x35\\x6e\\x08\\xb4\\x0a\\x91\\xee\\x9d\\x42\\xe4\\x4e\\x21\\xf2\\xbd\\x2b\\x44\\x32\\x9c\\x26\\xdf\\xae\\x46\\xc4\\x53\\x6f\\x21\\x57\\xa9\\x7f\\x69\\x71\\x7b\\x6a\\x97\\x91\\x09\\x8e\\x51\\x12\\x8f\\xa3\\xb3\\x72\\xf1\\x83\\x24\\xa6\\x9e\\xdc\\x6a\\xad\\x11\\x7b\\x5c\\x2e\\x7e\\xc9\\x32\\x8b\\x28\\x71\\x17\\xd8\\xc3\\x72\\xd9\\x97\\xe0\\xcd\\x54\\x46\\x22\\x3c\\x2c\\x17\\x3d\\xcc\\x8e\\xae\\xe3\\x11\\xb5\\xd6\\x94\\x4b\\x67\\xf4\\x69\\xb9\\x38\\xd9\\x3f\\x52\\x5c\\x2e\\xcc\\x9e\\x56\\xda\\xa6\\x99\\xa6\\xe5\\x92\\xd1\\x30\\x88\\xcb\\xc5\\x72\\xb2\\x8d\\x8e\\x2b\\xf0\\xf2\\xc7\\x95\\x6b\\xa4\\x21\\xd9\\x5a\\xeb\\xb8\\xe8\\x0b\\x97\\x70\\x96\\x0e\\x06\\xbc\\x48\\xdb\\x27\\x9b\\xe8\\xc1\\x03\\xc4\\xbe\\xb7\\xc0\\xa9\\xf4\\xed\\xb8\\xb1\\xd1\\xbe\\xda\\xa0\\x39\\x58\\xdb\\x9b\\xe8\\x1f\\xe8\\x3e\\x59\\x51\\x60\\x85\\x45\\x3a\\x7d\\x76\\xfd\\x2a\\xc8\\x26\\xf7\\x51\\xbf\\xf2\\x9c\\xfa\\x22\\xdf\\x37\\xef\\xed\\xb9\\x24\\x5a\\xa6\\xc9\\xec\\xd9\\x67\\x1c\\xc3\\x06\\x87\\x55\\x92\\x57\\x9e\\x5d\\x03\\x04\\x64\\x38\\xfb\\x71\\x78\\x48\\x2a\\x6e\\xa0\\xbe\\xad\\x28\\x1d\\xa1\\x28\\x6c\\x1e\\xe9\\x22\\x1e\\x4d\\xf1\\xe7\\x1e\\xda\\xaf\\xa4\\x53\\xd7\\xa0\\xe4\\x42\\xde\\xc3\\xe1\\x73\\x2c\\x61\\x04\\xee\\x8d\\x3e\\xf7\\x08\\xb5\\x40\\x50\\x82\\x54\\x06\\x69\\x28\\x47\\xc7\\xeb\\x9c\\xb6\\x2f\\x31\\xb2\\x5f\\x45\\xcf\\xd2\\x04\\x56\\x27\\x4e\\x2e\\x61\\x1d\\x8d\\x00\\xfc\\x08\\xa7\\xc9\\x9d\\x2a\\x5b\\x7c\\xbe\\x11\\x55\\x76\\x31\\xa7\\xc5\\x57\\xda\\x59\\x8b\\x86\\x9b\\x13\\x47\\x1c\\x32\\xbf\\x85\\x6b\\x5b\\x13\\x6d\\x84\\x78\\x1c\\x2c\\xa6\\x74\\x09\\x6c\\x34\\x4b\\xe0\\x9f\\xe1\\xbc\\xef\\x70\\x34\\x65\\x44\\x3d\\x6a\\xc9\\x0d\\x95\\x20\\x54\\x4f\\x4b\\x99\\xda\\xe8\\x45\\x30\\xd5\\xb5\\xab\\x36\\x88\\x06\\xe8\\x22\\x98\\x1a\\x13\\x86\\x56\\xde\\x49\\x2e\\xb9\\x32\\x7a\\xea\\xe1\\x44\\x68\\x0e\\x56\\xc7\\x0a\\x6b\\x6a\\x9d\\x78\\x29\\xf4\\x26\\xeb\\xc0\\x8c\\xed\\xe6\\xa3\\xb2\\x9a\\xa3\\xec\\x0d\\xc1\\xdf\\xcf\\xbe\\xba\\x45\\x51\\xde\\xac\\xb2\\x01\\xb6\\x65\\x2b\\x57\\xcf\\x62\\x96\\x19\\x0b\\xd6\\xb6\\x2f\\x77\\x00\\x68\\x2d\\xb8\\x8a\\x16\\x0d\\x82\\xb1\\x54\\xf4\\x89\\xe5\\x52\\xcf\\xa5\\x15\\x41\\xd9\\x79\\xa1\\x7f\\xaa\\x76\\x5a\\x31\\xc7\\x90\\x9a\\xa3\\xef\\xd8\\x58\\x44\\x11\\x2f\\xd4\\x7a\\x6b\\xf5\\xa1\\xac\\x1b\\xa1\\x56\\x5d\\xfe\\x32\\xaa\\x39\\x2d\\x2e\\x3d\\x94\\x91\\x60\\x97\\x5a\\xc3\\x03\\xeb\\xdd\\xb9\\xc5\\xfd\\x8a\\x8f\\x4e\\x5f\\x68\\x15\\xad\\xb3\\x9e\\x54\\x40\\xf3\\x0c\\x5a\\xd7\\xa6\\x7b\\xa4\\x70\\x04\\xf2\\x1f\\x2b\\x2f\\xee\\x18\\xad\\xa5\\x98\\x61\\x69\\x98\\x7d\\xe1\\x92\\x34\\x38\\xc3\\xfb\\xbe\\x4a\\x61\\xb9\\x8a\\x7b\\x4a\\x6c\\x45\\xeb\\x5f\\xd8\\x70\\x1b\\x27\\xf0\\xe7\\xaa\\xb3\\x60\\xbd\\x30\\x71\\x90\\x84\\x35\\x98\\x18\\x29\\xed\\x1e\\xbf\\xa1\\xd4\\x2a\\xec\\xab\\x7a\\x13\\xb2\\x76\\x4c\\x70\\x31\\xc0\\x97\\x9f\\x53\\x79\\xc6\\x80\\x0b\\x71\\x1c\\x5e\\x2f\\x1a\\x74\\xa3\\x6b\\x56\\xb6\\xf4\\x22\\xbc\\x31\\xd9\\x9c\\xd1\\xcd\\x72\\xac\\x9b\\x74\\x55\\x8f\\x71\\xc3\\x89\\xc0\\x1f\\x83\\x50\\xdc\\x88\\x41\\x71\\x62\\xfd\\x1c\\x18\\x94\\xd6\\xd8\\x1a\\x90\\xd5\\xfc\\x0f\\xcf\\xa5\\x37\\x9b\\x47\\x53\\xaa\\x58\\xf3\\x5e\\x7f\\xac\\x8a\\xcf\\x22\\x34\\x17\\xe5\\x08\\x6c\\xfb\\x2f\\x8c\\xf2\\xe1\\xb5\\xe6\\x42\\x29\\x57\\x37\\xc2\\x6f\\x3b\\xd9\\xaf\\x77\\x17\\x5f\\x56\\xc8\\xb1\\xd9\\x9c\\x5a\\x51\\x58\\x1c\\x98\\x6b\\x22\\xaf\\xa8\\xe8\\x58\\x2d\\xdf\\x3e\\xa2\\xea\\x5f\\x57\\xab\\x95\\x3c\\xa4\\x41\\x59\\x89\\x06\\x4a\\x8d\\x5a\\xd8\\x72\\xf3\\x02\\xdd\\x7d\\xb5\\x7b\\xec\\xa3\\x24\\xbe\\xc0\\x29\\xdf\\xe7\\xde\\xf1\\x90\\x63\\x7e\\xbe\\x6e\\xd5\\xaa\\x0e\\x3c\\x78\\x56\\x31\\x08\\x2b\\xa6\\xc9\\x7b\\xb9\\x98\\x4e\\xeb\\xf9\\xc0\\xa9\\x95\\xdc\\x93\\x67\\x2f\\x6c\\x98\\x36\\x83\\x13\\x1c\\x90\\xf5\\x61\\x3c\\x4e\\x7c\\x40\\xdd\\x90\\x2b\\x98\\xe0\\x54\\xf5\\xcf\\xa4\\xe4\\xfd\\x75\\xed\\x50\\x4b\\xae\\x49\\x86\\x91\\xb2\\xa9\\x8c\\x0e\\x1d\\xfb\\xf1\\x68\\x92\\x78\\x9d\\xb7\\x11\\x60\\x83\\x96\\x77\\xa2\\x82\\x16\\xd3\\xe0\\x81\\x81\\x56\\x3e\\x6d\\x6b\\x56\\x06\\xe4\\x31\\x1c\\x5d\\x7f\\x48\\xf8\\xe5\\x4c\\x3d\\x1a\\xd3\\xd4\\x74\\xad\\x0e\\x53\\x8f\\xf5\\x68\\x4e\\x87\\x65\\xc6\\x0b\\xfd\\x97\\x07\\xab\\xe0\\x5e\\x1a\\xe6\\x82\\x75\\xb8\\xd9\\x8a\\x3c\\x5b\\xdc\\xa2\\x2c\\xc5\\xbc\\x45\\x6d\\xe3\\x68\\x4d\\x17\\x36\\xdf\\x82\\x8c\\xb8\\xdc\\xbe\\xa0\\x62\\xe8\\x3d\\x1e\\xe1\\x68\\x5e\\x43\\x7e\\xa8\\xd6\\xad\\xb5\\x43\\x9a\\xeb\\xac\\x6b\\x8b\\x64\\x3d\\x2c\\x8d\\x91\\x9a\\xf2\\x94\\xb7\\x1c\\xaa\\xc3\\x86\\xa9\\x46\\x1d\\x5a\\xd3\\x1b\\x61\\xae\\xa8\\x77\\xab\\xbd\\x6a\\x6f\\xd9\\x32\\x10\\x70\\xe7\\x6f\\x15\\xb8\\x8c\\x50\\xaa\\x5b\\x4d\\x6e\\x9b\\xec\\x33\\x1c\\xbf\\xfb\\x39\\x1d\\x78\\x06\\x64\\x70\\xeb\\x93\\x8d\\x85\\x6e\\xd7\\xf2\\x4f\\x33\\x2c\\xb8\\x31\\xad\\x31\\x36\\x5e\\xde\\x3d\\x40\\x4b\\xc9\\xb5\\x6a\\x74\\xfc\\xac\\xea\\x25\\x80\\x9e\\x5d\\x7f\\x38\\xaf\\x3b\\x5c\\x52\\xc7\\x7f\\xc8\\x86\\xd2\\x75\\x94\\x8d\\x29\\x3e\\x5a\\x6a\\xad\\x55\\xea\\x39\\xa0\\xf6\\x29\\x5f\\x87\\x28\\xe5\\xdd\\xce\\xe3\\xf4\\x02\\x61\\x3e\\xfd\\x15\\xbe\\xa2\\xbc\\x4b\\x12\\xb3\\x94\\xbb\\x7d\\xee\\x51\\x1d\\xe6\\x34\\xc9\\xea\\x8c\\x92\\x15\\x77\\x0d\\xd2\\x5c\\xec\\x0b\\x8c\\x91\\x5b\\xf8\\xf8\\x0f\\x53\\xaa\\xe1\\x18\\xa9\\xbd\\xe4\\x97\\x98\\x50\\x6a\\x55\\xe1\\x35\\x99\\xc1\\xd4\\x25\\x85\\x1b\\x8a\\xac\\xc2\\x25\\x89\\x70\\x7b\\x6b\\x4a\\x6f\\x9c\\xe5\\xd1\\x2c\\xc8\\xf1\\x4f\\x81\\xef\\x59\\x4a\\xaa\\xe1\\xc0\\x85\\xbd\\xe4\\x2a\\x53\\xad\\xa0\\xe4\\x56\\xa4\\xa3\\x11\\x55\\x9d\\x1e\\x25\\xd3\\x28\\x8c\\x72\\x5f\\x5f\\x28\\x56\\xab\\x95\\xb1\\x6a\\x4e\\x15\\x8c\\xd2\\xc9\\x6a\\x17\\xd2\\xac\\xb1\\xd7\\xaf\\x5f\\xd7\\x04\\x76\\xea\\x26\\x6a\\xd1\\xf4\\x5a\\x40\\x3c\\xc2\\xe9\\x1c\\x7b\\x4b\\xec\\x02\\xa7\\xb4\\x96\\x27\\x4a\\x8d\\x85\\x6b\\x80\\x9b\\x2d\\x86\\xb3\\x28\\xff\\x3d\\x49\\x7d\\x8f\\xb2\\x45\\x05\\x97\\x5c\\x6c\\x2b\\x58\\x2f\\x42\\x65\\x0d\\xf0\\x58\\x69\\xf7\\x79\\xc7\\x01\\x98\\xc7\\x95\\x41\\x96\\x07\\x69\\xfe\\x2a\\xc8\\x26\\x69\\x90\\xfb\\x5e\\x07\\x29\\x75\\x5c\\x08\\x74\\x94\\xad\\x05\\x6a\\x32\\xaf\\x0d\\x69\\x51\\xc5\\x09\\xa8\\xb5\\xe8\\x12\\xb7\\x30\\xef\\xf1\\x65\\x90\\x86\\xdc\\x70\\xb0\\xe6\\x35\\x82\\x5a\\xd9\\xc3\\x10\\xc5\\xab\\xd2\\x17\\xb8\\x59\\x10\\xd6\\x70\\x17\\xc1\\x74\\xf3\\xcf\\xc2\\x0e\\x49\\xc9\\x73\\xd3\\xd0\\xe5\\x7d\\x45\\xe5\\x14\\x61\\x79\\xf2\\x2c\\x3a\\xa3\\x10\\x34\\xb0\\x2e\\x4a\\xff\\xe6\\x8d\\x7d\\x76\\x8c\\x7e\\x3f\\xc2\\xd4\\xa8\\x3a\\x9e\\xc2\\xc8\\x47\\xfb\\x4e\\xe7\\x29\\x45\\x0d\\x3d\\xaa\\xcf\\xb9\\x49\\x84\\xb6\\x86\\xb0\\x43\\xd0\\xbe\\x3d\\x48\\x42\\x43\\x1c\\x34\\x32\\x2b\\xda\\x37\\x70\\x11\\x65\\x68\\x8c\\xdd\\x36\\x9a\\x5b\\x2c\\x2b\\x52\\xcc\\x25\\x0f\\xe3\\x71\\xa2\\x7d\\x4b\\x95\\xc9\\xe6\\x8a\\xc5\\x45\\x99\\x1e\\xb1\\x36\\xd7\\x30\\x83\\x2a\\xd2\\x55\\x90\\xe9\\xaf\\x5c\\xc5\\x0c\\x40\\xe9\\x93\\xbc\\x48\\xb2\\x53\\xf5\\xa5\\xd3\\xc7\\xad\\x72\\x12\\xd4\\x74\\xcb\\x8f\\x55\\x9a\\x57\\xec\\x30\\x52\\x7d\\x23\\x09\\xef\\x9a\\x6a\\x9a\\x0b\\x25\\x1d\\x4e\\x62\\xc3\\x82\\x10\\x47\\x6e\\xeb\\x4b\\x72\\x1e\\xd7\\x62\\x5a\\xba\\x17\\xd2\\xc0\\x66\\x52\\xe7\\x6b\\x9b\\x62\\x52\\xa2\\x6e\\x88\\x8a\\xc0\\x66\\x2c\\xf0\\xfa\\xf5\\x6b\\x73\\x65\\x2a\\x9a\\x68\\x66\\x55\\x08\\x05\\x5a\\xa0\\xf4\\x2f\\x94\\x8d\\x50\\xf7\\xba\\xd8\\x7e\\xcc\\x6b\\x46\\x65\\xf0\\x4a\\x31\\x93\\xbb\\xe0\\xe7\\x75\\x8b\\x1c\\x25\\x51\\x3c\\x0c\\x32\\xdd\\x0e\\x8a\\x64\\x97\\x48\\x26\\x02\\xb2\\xc2\\x1a\\x4e\\x5e\\xad\\xef\\x0f\\xc4\\x2c\\xf2\\x89\\xa4\\x05\\x20\\xb0\\xa2\\x6b\\x06\\x60\\x62\\x96\\x23\\xaa\\x20\\x38\\x0a\\x2f\\x11\\x46\\x6b\\x15\\xd0\\xb9\\xd7\\x92\\x0f\\xe4\\xf6\\xb2\\xee\\x9b\\x05\\xe6\\x37\\xa5\\xbf\\x4e\\x58\\x7d\\x28\\x67\\x41\\xf6\\x2e\\x8d\\xb4\\xc6\\xb9\\xd5\\xb1\\x38\\x0a\\x7b\\x58\\x15\\x71\\xd1\\xe4\\xb6\\x86\\x13\\x78\\x7a\\x1b\\xc3\\x70\\x02\\x8b\\x97\\xf1\\x2a\\x40\\x0c\\x25\\xdf\\x11\\x1f\\x38\\xdc\\xe5\\x3f\\x33\\x7d\\x83\\x61\\xff\\x28\\x99\\xfe\\x46\\x1d\\x74\\xbd\\x06\\x51\\xae\\xa3\\x01\\xc9\\xc6\\x8a\\xf9\\x77\\xd5\\xb1\\xa0\\x35\\x2a\\xbc\\x17\\x25\\x47\\xa1\\x61\\xa4\\x4d\\xd8\\x16\\x8c\\xf2\\x24\\xe5\\xca\\x0d\\xbe\\x33\\x42\\xfa\\xa0\\x26\\x22\\x75\\xb4\\x39\\x84\\x58\\x2d\\x2f\\x68\\xc6\\xdc\\xe1\\xb1\\x92\\x68\\xba\\x29\\x25\\x9f\\xa5\\xa5\\x0e\\x88\\x44\\x12\\x25\\x31\\xe4\\x3a\\x3d\\x30\\xe4\\xfd\\x62\\x30\\x10\\x78\\xa9\\x33\\x65\\xd1\\x1e\\x60\\x75\\xa3\\xa9\\x75\\x22\\x6a\\x72\\x37\\x4d\\x08\\xce\\xd8\\xd8\\x6c\\x56\\x57\\xda\\xeb\\xe4\\x4c\\xd2\\xb2\\xf9\\x01\\xe7\\x85\\x83\\xc2\\x35\\xd3\\xb9\\x47\\xd2\\x84\\x78\\x7c\\x1e\\x58\\xc5\\xd6\\xd9\\x34\\x19\\x06\\xd3\\x16\\x99\\x90\\x56\\x50\\x7d\\x4c\\x05\\x19\\x3f\\x58\\xa2\\x51\\x30\\xff\\x65\\x55\\x78\\x48\\x23\\x15\\x68\\xe8\\xc3\\x5a\\xb0\\x48\\x1e\\xae\\x05\\x24\\xa6\\x84\\x6f\\xd2\\xc4\\x0b\\xd7\\xd8\\x86\\x7e\\xaa\\x47\\xf6\\xe9\\xa9\\x44\\x3a\\x20\\x70\\x19\\x62\\x3d\\x52\\x0f\\xe1\\xfb\\xfd\\xce\\xd3\\xa6\\x25\\x06\\x24\\xc7\\xd0\\xfd\\x7e\\x77\\x17\\x1e\\x50\\x9a\\xb9\\xdf\\xdf\\x6e\\x37\\x0d\\x41\\x13\\xa2\\x61\\x10\\xdf\\xef\\x6f\\xf7\\x74\\x11\\x14\\x18\\x4a\\xef\\xf7\\x7b\\x3b\\x95\\x88\\x0a\\xf0\\x80\\xed\\x90\\xf7\\xfb\\x3d\\x0a\\x16\\x17\\xcb\\xef\\xf7\\x77\\x48\\x87\\xdc\\xfb\\xf8\\x7e\\xbf\\xd7\\xbb\\x39\\x69\\xf6\\xb6\\xbf\\xa1\\x3c\\x1d\\x47\\x79\\x70\\x7e\\x97\\xa4\\xa3\\xf8\\xac\\x21\\x86\\xdc\\x70\\x71\\x7d\\x34\\x09\\x52\\x5f\\xe5\\x16\\x2f\\x6e\\x51\\x0e\\x91\\x39\\x3a\\xb5\\x94\\xfb\\xcc\\xb7\\x38\\xc6\\x03\\x06\\x07\\xd1\\xeb\\x44\\x53\\x65\\x0b\\x64\\x98\\x35\\xe3\\xa3\\xf7\\xee\\x82\\x9d\\xdc\\x05\\x3b\\xf9\\xbe\\x82\\x9d\\xb0\\x08\\x27\\x5c\\xbe\\xfa\\x3a\\x33\\xe0\\x2d\\x15\\xc3\\x9b\\x4b\\xaf\\xc1\\x3c\\xe2\\xcc\\x56\\xe9\\x14\\xe2\\x7c\\x7b\\x44\\xf0\\xa4\\x82\\xaa\\x97\\xf7\\x3e\\xaf\\x45\\x04\\x24\\x34\\xe0\\x9e\\xfa\\x25\\x7e\\x47\\x3e\\xd9\\x65\\x94\\x8f\\x26\\x0d\\x52\\xce\\x94\\xbd\\x76\\x14\\x64\\x18\\x6d\\x90\\xb5\\x94\\xe5\\x1b\\x7d\\x6d\\x11\\x20\\x87\\xf4\\x2c\\x6b\\x65\\x93\\x68\\x9c\\x97\\x53\\x35\\xcb\\x1f\\xd8\\x7d\\x45\\x16\\xec\\xb6\\xb9\\x20\\x63\\xc6\\xf4\\x88\\x13\\xe3\\x4b\\xea\\x16\\x43\\x43\\x9c\\xe8\\x6b\\x51\\x38\\xe7\\x38\\x0e\\xc9\\xa9\\xff\\x8b\\x01\\xfa\\x8e\\x02\\x20\\xef\\x3f\\x36\\xa8\\x99\\x83\\xb4\\x19\\xdc\\x72\\xfb\\xc6\\xd6\\x4a\\xb7\\x0b\\xfa\\xb8\\xa9\\x22\\x72\\x8c\\x67\\xa8\\x54\\xd6\\x9b\\x69\\x0f\\x57\\xa8\\x72\\xa5\\x4b\\xd2\\x45\\x1c\\xc5\\x59\\x1e\\x4c\\xa7\\xb5\\x20\\x2c\\xd5\\x72\\x5c\\x44\\xb9\\x4b\\xd7\\x73\\xdc\\x7e\\x9d\\x9c\\xd5\\xf0\\x4e\\x20\\xa5\\x3d\\xdc\\x12\\x00\\x34\\x43\\xd9\\x1a\\xe0\\xcd\\x13\\x6f\\x73\\x14\\x52\\xd4\\x17\\xb0\\x03\\xc8\\xf6\\xb2\\x02\\x6c\\x36\\x2d\\x2e\\xed\\xa2\\xda\\x74\\x69\\xde\\xb4\\x0a\\x68\\x82\\x31\\x0d\\x50\\xc9\\x74\\x6a\\x93\\xda\\xea\\xf3\\xf3\\xc9\\xa4\\x05\\x5b\\x94\\x99\\x9b\\x4f\\x26\\xf6\\xa0\\x04\\x56\\x3d\\xb6\\x71\\xae\\x90\\xdf\\xb2\\x44\\xd2\\xc4\\x4d\\x26\\x84\\x5f\\xbc\\xc1\\x59\\x16\\x9c\\x61\\x6b\\x0d\\xfd\\xdc\\x21\\x8b\\x3a\\xcb\\x07\\x4e\\xf7\\x72\\x2b\\x41\\x1b\\xe2\\x29\\xce\\xf1\\x97\\x03\\xd8\\xbc\\x48\\x4b\\x80\\x8a\\xe5\\xc0\\x60\\x35\\x55\\xb9\\x1d\\x30\\x0d\\xeb\\xf5\\x16\\x60\\xf4\\xd1\\x1b\\x56\\xce\\x3b\\x2a\\xec\\x84\\x7d\\xf4\\xe1\\x5f\\xb5\\xfb\\x6c\\x32\\xe9\\x93\\x7f\\xaa\\x87\\x28\\x5d\\x8e\\xd0\\xde\\xce\\xdd\\x81\\xe8\\xee\\x40\\xf4\\x7d\\x1d\\x88\\x94\\xb3\\x0b\\x90\\x31\\xd7\\x91\\xae\\x23\\x00\\xa4\\xc7\\x61\\x88\\x2a\\x86\\xdf\\xe3\\x33\\x42\\x16\\x41\\xba\\x3f\\x8c\\x0c\\xa1\\x0c\\xb3\\xad\\x9f\\xd4\\xa2\\xad\\x8f\\x59\\x52\\x09\\x03\\x18\\x8d\\x82\\xb9\\xdc\\x98\\xa9\\xad\\xc3\\x83\\xfd\\x77\\xd5\\x96\\x34\\x90\\x31\\x05\\x74\\xe1\\xc2\\xb7\\xd1\\xbe\\x1a\\xed\\x86\\x4f\\xc3\\xee\\x28\\xec\\xf5\\x9e\\x06\\x4f\\x76\\x7a\\xa3\\xde\\xd3\\x5e\\x77\\xb7\\x87\\x3b\\x7b\\xed\\xa7\\xa3\\x9d\\x36\\xde\\xee\\x85\\xbb\\xbd\\x9d\\xdd\\xee\\x70\\xa3\\x0a\\x9b\\xae\\xb9\\xa0\\x13\\x74\\x3a\\x9d\\xe1\\xa8\\xfd\\xa4\\x37\\x7a\\x3a\\x1a\\x07\\x4f\\xf6\\x3a\\xe3\\xf6\\x68\\x7b\\x0f\\xef\\x6e\\x0f\\xc3\\x9d\\xce\\xe8\\x69\\x67\\xb8\\x17\\x8c\\xdb\\xed\\x0d\\x7f\\x86\\x48\\x61\\xef\\x6b\\x0e\\x5b\\xc1\\x30\\xea\\x6b\\x90\\x5e\\x65\\xdb\\x4c\\x3d\\xde\\xd7\\xe2\\x41\\x15\\xbf\\xd4\\xca\\x64\\x98\\xc6\\x9e\\xcb\\xf3\\x63\\xe9\\xb7\\x8a\\x2e\\xb5\\x57\\x23\\x53\\xb7\\x53\\xcc\\xfd\\xbe\\xaa\\x07\\xd7\\xd1\\xc2\\xfd\\x7e\\x97\\xec\\x07\\xbb\\x77\\xfb\\xc1\\xdd\\x7e\\xf0\\xbd\\xef\\x07\\xfc\\x42\\xc7\\xb0\\x21\\xd8\\x82\\xfb\\x8e\\xd3\\xe4\\xdf\\x78\\x16\\xc4\\xad\\x10\\x6b\\x03\\x03\\x7f\\x96\\xec\\x83\\xa5\\x28\\xbe\\x4a\\x79\\x29\\x36\\x6f\\xe5\\xce\\x57\\x7b\\xa5\\x03\\xee\\xe4\\x03\\x46\\xde\\xf4\\xe7\\xdf\\xab\\xa5\\xe8\\xd5\\xb9\\x54\\x8e\\x3e\\xd0\\x94\\xcc\\xca\\x25\\x33\\x53\\xc9\\x92\\x8d\\x80\\x54\\xa5\\xf4\\x46\\x53\\x57\\xbd\\xc7\\x90\\xaa\\xaa\\x2f\\x34\\x35\\x2b\\x37\\x58\\xf1\\x62\\x3a\\xd5\\x8b\\xe8\\x1c\\x97\\xd2\\xa5\\x69\\xe5\\x12\\x49\\xc1\\x73\\x3a\\xd3\\xa2\\xb8\\xd2\\x65\\x3a\\xd3\\x77\\x58\\xa2\\xd6\\x23\\xba\\xa2\\x86\\x18\\xce\\x27\\x38\\x44\\x79\\xc2\\x6e\\xf6\\xe8\\x3d\\x0e\\xa8\\xe4\\xc8\\xda\\xa2\\x32\\xbf\\x54\\x55\\xa1\\x32\\xfa\\x96\\xd5\\x3c\\x24\\x15\\x95\\xd7\\x70\\x90\\x41\\x7f\\xee\\x93\\x23\\xfc\\x8d\\xf2\\x86\\x9d\\xb8\\xab\\xaf\\xb6\\x6c\\x28\\x92\\xfa\\x29\\xeb\\x5b\\x6d\\xd7\\xdc\\xa5\\x19\\xfd\\x87\\xee\\x29\\x6d\\xa3\\x4f\\xc6\\xbd\\x2a\\x02\\x29\\x89\\x35\\x52\\x9c\\x2d\\xa6\\xf9\\x66\\x4d\\x24\\xbe\\x85\\xca\\x3a\\x2c\\xd2\\x9b\\x48\\x3d\\x1a\\xab\\xef\\x3c\\xf0\\x48\\xbb\\x52\\xa9\\x8c\\xc1\\x6c\\xc6\\x65\\x79\\x65\\x3d\\x78\\x80\\x68\\x25\\x74\\x6f\\x40\\x09\\xbe\\xf4\\x88\\x6c\\xbc\\xe3\\x28\\xc6\\x21\\xc7\\x7b\\xa9\\x05\\xd1\\x67\\x9f\\xd5\\xaa\\x89\\xfe\\x45\\x46\\x91\\x8f\\xaf\\xa8\\x71\\x0c\\x37\\x11\\x40\\xe3\\x34\\x99\\x15\\xda\\xa3\\x20\\x3d\\x5b\\xcc\\x70\\x9c\\x67\\x2d\\xf4\\x86\\x08\\x06\\x11\\xce\\x18\\xa5\\x03\\x7a\\x1d\\x73\\xc3\\x1a\\xe7\\xd6\\x21\\x66\\x22\\x2f\\xfa\\xd1\\xce\\xd3\\x4b\\x86\\xe9\\x4f\\xbf\\x2c\\xa6\\xd3\\x1b\\xc9\\x14\\x25\\x1a\\x23\\x7c\\x15\\x65\\x4a\\x35\\xeb\\x14\\x96\\x20\\x72\\x5e\\x3f\\x44\\xe3\\x22\\x70\\x30\\x87\\x82\\x86\\x0e\\x06\\xe5\\xfb\\x14\\xc7\\x67\\xf9\\x04\\x3d\\x46\\x9d\\x93\\x4d\\x4b\\x40\\x52\\x28\\x3b\\x4f\\xe6\\x8d\\xcd\\xbf\\xa3\\xad\\x2d\\x26\\x62\\xc1\\xfe\\x0b\\xfc\\x02\\xb0\\x7d\\xcf\\x25\\x78\\x9a\\xa7\\x93\\x5e\\xba\\x17\\x23\\xc9\\x13\\xbf\\xa5\\xa3\\x5e\\xd6\\xfb\\x2e\\x1e\\xf6\\x8a\\x63\\xc3\\x7b\\xf5\\xa8\\xbd\\xa9\\xbb\\xe1\\xf0\\xa3\\xee\\xa6\\x08\\xea\\x56\\x8e\\x1d\\x88\\xc7\\x82\\x85\\x65\\x31\\x5c\\x44\\xd3\\xf0\\x27\\x9c\\x37\\x34\\x6a\\x28\\x1c\\x2f\\x66\\x38\\x0d\\x86\\x53\\xdc\\x47\\x79\\xba\\x50\\x6f\\xbd\\xb5\\xd7\\x0a\\xc1\\x0c\\x4c\\x77\\xc5\\x36\\xdc\\xca\\xe6\\xd3\\x28\\x6f\\x6c\\xb4\\x36\\x34\\x5e\\xd7\\x6c\\x9f\\x86\\x4a\\x70\\x27\\x25\\x17\\x20\\x84\\x03\\x6f\\x38\\x8d\\xfc\\x88\\x3a\\x3a\\x0a\\x49\\x86\\x1f\\x8f\\x79\\x0b\\x27\\x64\\xd7\\x54\\x7e\\x7f\\xfa\\x84\\xfe\\xbc\\xa9\\x5e\\x90\\x24\\xc3\\x8f\\xe5\\xa2\\xd5\\x42\\x0a\\x78\\x9d\\x93\\x72\\x3c\\x5a\\xe5\\xa7\\x3e\\x42\\x6f\\x32\\xfc\\xd8\\x84\\xfa\\x4d\\x3a\\x15\\x25\\x1c\\x90\\xfe\\x83\\xec\\x3a\\x1e\\xfd\\x04\\xf2\\x04\\x39\\x46\\xc1\\x90\\x37\\x4f\\x38\\x0a\\x61\\x72\\xf6\\x59\\x91\\x86\\xc1\\xfa\\x88\\xa0\\xb2\\xd4\\x8c\\x42\\x1c\\xd0\\xa4\\x9e\\xb5\\x6e\\x9c\\xe1\\x7c\\x03\\x3d\\x02\\x18\\x5b\\xa3\\x49\\x90\\xee\\xe7\\x8d\\xf6\\x66\\x2b\\x4f\\x7e\\x9d\\xcf\\x71\\x7a\\x10\\x64\\xb8\\xb1\\xc9\\x5f\\x67\\x44\\x1e\\x6d\\x74\\x0c\\x40\\x68\\xe8\\x95\\x53\\x96\\xf3\\x42\\x73\\x5e\\x08\\x78\\xd4\\x9a\\x46\\x03\\xa9\\x68\\xe1\\x8c\\x20\\xc2\\xcc\\x29\\x84\\x20\\x2c\\xef\\x35\\x0d\\xf1\\x54\\x95\\x5b\\x5a\\x19\\x8e\\x4d\\x1a\\x56\\xba\\xc4\\xfb\\x45\\x83\\x54\\x3c\\xac\\x94\\xbd\\xd9\\x2c\\xdb\\xd7\\xd4\\x43\\x10\\x9f\\xdd\\xd5\\xb0\\xc4\\xae\\xa1\\xbc\\xec\\xde\\x50\\x11\\x0f\\x5c\\x8b\\x10\\x80\\x68\\x55\\xac\\xc8\\xf1\\x23\\x71\\x9a\\x36\\x91\\x7e\\x8b\\xe7\\x1f\\x0e\\x2b\\x2d\\xab\\x9f\\x44\\xd6\\x82\\xd6\\x9f\\xca\\x38\\x05\\x88\\x32\\x3b\\x3e\\x4e\\xbe\\xb0\\xd8\\xcf\\xd6\\x30\\x8a\\x43\\xb0\\xf9\\xd3\\x1b\\xa6\\x9e\\xe1\\xba\\x62\\x41\\x21\\x95\\x51\\x77\\x18\\x34\\x5f\\xa4\\x18\\xfd\\xf3\\xe8\\xed\\x2f\\xef\\xdf\\x1d\\x20\\x0e\\xc5\\xe5\\x24\\x1a\\x4d\\x40\\x89\\xc0\\x25\\x89\\x28\\x46\\x43\\xb8\\x4c\\x62\\x45\\x1c\\x3b\\x4f\\xb5\\x94\\xd8\\x57\\x5a\\xad\\xd6\\x0d\\x53\\xe5\\xdb\\x64\\x36\\xf4\\x31\\x4b\\xe2\\x74\\x3e\\xd2\\x34\\x65\\xdd\\x85\\x0a\\x44\\x3a\\xc8\\x35\\xb8\\x9e\\x26\\x41\\xa8\\xdd\\x7d\\x38\\x15\\x49\\xe7\\x30\\xf3\\x2d\\xe2\\xb1\\xc6\\x77\\x8f\\x93\\x0b\\x6b\\xa2\\x24\\x94\\x34\\x40\\x26\\x92\\x8f\\x38\\x84\\x75\\xb5\\x48\\xa5\\x86\\x90\\x93\\x36\\x37\\x6d\\x24\\xc3\\xa0\\x67\\x04\\xc8\\xa9\\x46\\x26\\x47\\x17\\xe9\\xb0\\x16\\x3c\\x6f\\x4a\\x38\\xa2\\x4b\\x4a\\xb2\\x92\\x69\\xe8\\xcd\\x49\\xb3\\xf7\\xe4\\x4e\\xdd\\x75\\xa7\\xee\\xfa\\xde\\xd5\\x5d\\x8c\\x09\\xcd\\xd8\\xae\\xa5\\x57\\x7a\\xfd\\x13\\x8f\\xc7\\x29\\xbe\\x46\\xbf\\x47\\xd3\\xd1\\x39\\x46\\x3f\\x7c\\xc4\\xe3\\xb1\\x2b\\x0b\\xd6\\x52\\xa9\\xb3\\xde\\x04\\x69\\x14\\xc4\\xe8\\x6d\\x10\\x8f\\x70\\x00\\x75\\x6c\\x49\\xb3\\x56\\xc8\\xb7\\xc5\\xaa\\xfe\\x14\\x5c\\xa0\\xdf\\x93\\x24\\x44\\x3f\\x9c\\x39\\xf5\\x70\\x3d\\xb3\\x1e\\xee\\x9f\\x6c\\x03\\x50\\xd2\\x4c\\xb1\\x5d\\xc1\\x27\\xf9\\x96\\x25\\xf3\\x56\\x39\\x3f\\x96\\x2d\\x39\\x16\\x4e\\xd3\\xa4\\x64\\xd4\\xbd\\x45\\x9f\\x29\\x9a\\xc0\\x12\\x1d\\x1c\\xe6\\x1b\\x19\\x91\\x29\\xe6\\x49\\x9c\\x45\\xc3\\x29\\xa5\\xeb\\x79\\x90\\x65\\x51\\x7c\\x86\\x66\\xec\\x9e\\x9b\\x6c\\xc3\\xf3\\x34\\xb9\\x88\\x42\\x9c\\x66\\x95\\xda\\xc1\\x34\\x4b\\xaa\\x4d\\x24\\xd3\\x29\\x69\\x82\\x10\\x3b\\x26\\x0c\\x06\\x2f\\x66\\x28\\x4e\\x42\\xfa\\x36\\x8a\\x47\\xc9\\x4c\\xee\\x41\\x6e\\x94\\x85\\x4d\\xa1\\xf6\\x36\\x79\\x34\\xc3\\x64\\xcd\\x47\\x19\\xea\\xa0\\x0c\\x8f\\x92\\x38\\x54\\x04\\x86\\x28\\x3e\\x9b\\xe2\\x3c\\x89\\xb5\\xdb\\x2e\\x41\\x8b\\x45\\x27\\xc7\\x87\\xa4\\xd5\\xcc\\xf1\\x97\\x68\\x20\\x86\\xae\\x51\\x19\\x12\\x18\\xe1\\x42\\xea\\x46\\xf3\\x92\\xc3\\x6e\\x53\\x24\\x3a\\xf5\\x22\\x44\\x88\\x9c\\xa4\\x49\\x9c\\x2c\\xb2\\xe9\\x35\\xf8\\x17\\x7b\\x8a\\x36\\xa4\\xa8\\xe5\\x28\\x8d\\xc2\\x20\\x0f\\x6a\\x2b\\xa3\\x54\\x6c\\x2a\\xda\\xcf\\x38\\x54\\x90\\x4b\\x9a\\xd7\\x29\\x31\\xee\\x29\\xd8\\xd5\\xa6\\x38\\x49\\xe2\\x2c\\x21\\xbb\\x3a\\x21\\xde\\x06\\x25\\xe1\\xd6\\x61\\x7c\\x11\\x4c\\xa3\\xf0\\x1d\\xab\\xd7\\xd0\\x89\\xaf\\xdc\\x11\\x45\\x41\\x36\\xaa\\x1e\\x32\\x55\\xb1\\x8a\\x2d\\xdf\\x56\\x9e\\xbc\\xa3\\xcf\\x00\\xf4\\x16\\xc5\\x62\\x13\\xd0\\xc4\\xac\\x16\\x35\\x47\\x6f\\xa6\\x28\\x1b\\xa8\\x34\\x43\\xcf\\x43\\xac\\x8b\\xb2\\xb9\\x16\\x20\\x81\\x77\\x1a\\x65\\xbf\\x91\\x61\\xbd\\xa7\\xab\\x07\\x0b\\xd9\\x5c\\x83\\x96\\x7c\\x92\\x26\\x97\\x48\\x45\\x47\\xb9\\x9e\\x75\\xd8\\x0c\\x3d\\xb4\\x68\\x6b\\x25\\x65\\x5d\\xb0\\x12\\x55\\xc2\\xc1\\xa8\\x16\\x69\\x96\\x55\\x3d\\x42\\x70\\xad\\x4f\\xa4\\xd0\\x79\\x85\\x52\\x25\\xd7\\xa4\\xa5\\x68\\x96\\x27\\xfc\\x91\\x8e\\x5f\\x3e\\x54\\x7b\\x3b\\x84\\x59\\xa5\\x45\\x7a\\x14\\x65\\x4d\\xd7\\x38\\x52\\x92\\xc1\\xe3\\x54\\x3b\\x62\\xc3\\xa8\\x75\\xa7\\xca\\xaa\\x8d\\xf4\\xb2\\x6b\\xc0\\x8d\\xea\\x4a\\x2b\\x5e\\xf0\\x88\\xc6\\x68\\x00\\x50\\x65\\x89\\xd8\\xdc\\x7e\\xea\\x9d\\x64\\x75\\xab\\xa6\\xce\\x61\\x95\\x54\\x78\\x46\\xca\\xeb\\xd6\\x06\\xd3\\x5f\\xd3\\xf6\\x6e\\x73\\x01\\x01\\x04\\xdf\\xd8\\x02\\x02\\x98\\xe5\\x55\\x54\\x66\\xca\\xcb\\x2d\\x19\\xad\\x93\\xc0\\xad\\xae\\x19\\x7e\\x05\\x00\\xb3\\xdd\\xe0\\x50\\xac\\x65\\xa9\\x64\\x75\\xd7\\x8a\\x82\\x88\\x15\\x17\\x89\\x90\\x76\\x70\\x2e\\xc4\\x2d\\x72\\x56\\xe2\\x5a\\x12\\x76\\x42\\x71\\x2e\\x90\\x9c\\x53\\x8a\\x65\\x7b\\xa9\\x4b\\xf2\\xa2\\x4d\\x55\\x78\\x74\\x4a\\x8d\\xcb\\xa2\\x20\\x0f\\xd2\\x9c\\xcb\\xcf\\xae\\x01\\x93\\xb2\\xef\\x2a\\x45\\xbd\\x37\\x54\\xea\\xa8\\x7f\\x03\\xbd\\x1d\\x6a\\xa5\\x45\\x2b\\xc7\\xd0\\x94\\x12\\x16\\xca\\x26\\xc8\\xf3\\x24\\x4c\\xd0\\x68\\x8a\\x83\\x78\\x31\\x47\\x31\\x8d\\x94\\x95\\x8c\\xab\\x8a\\x36\\x9f\\xa9\\x91\\x46\\xaf\\x61\\x48\\x74\\x50\\xb2\\xc3\\xb8\\x00\\x4e\\x3f\\x77\\x44\\x96\\x3f\\xa6\\xb5\\x4e\\x88\\x4c\\x4f\\x9a\\xe9\\x23\\xda\\x58\\x14\\xf6\\x2b\\x0d\\xf6\\x75\\x4d\\xf7\\x8b\\xaf\\xca\\x8d\\x19\\xcc\\xfd\\x96\\x69\\x76\\x15\\x3e\\xc9\\xce\\x0d\\x7a\\x21\\x90\\x01\\x5a\\x76\\xb4\\xb9\\x59\\x96\\xd8\\x92\\xb9\\x38\\xab\\x91\\x93\\x19\\x73\\xac\\x02\\x9d\\xc3\\x59\\x74\\x81\\x63\\x14\\xb9\\x6e\\xef\\x48\\x1b\\x16\\x1a\\x34\\xd2\\x98\\xd7\\x0c\\x8b\\xa6\\xd5\\xc5\\x07\\x6d\\x95\\x11\\x44\\x8d\\xdd\\x35\\x93\\xf9\\x77\\xcd\\x34\\x14\\xe3\\x2e\\xcd\\x42\\x83\\xdd\\x41\\x9d\\xe3\\xeb\\xac\\x51\\xb4\\xb5\\xc9\\xef\\xcf\\x20\\x1b\\x2b\\x7a\\xf0\\x00\\xb9\\xe6\\x8a\\x10\\x79\\xfa\\x81\\xbe\\x6f\\x28\\x85\\xab\\x7c\\xd6\\x7a\\x5e\\x5c\\x62\\x7e\\x0b\\xa1\\x23\\xc5\\x84\\xa7\\x92\\x63\\x38\\x9f\\xe6\\x19\\x1e\\x4d\\x82\\x38\\xca\\x66\\x5c\\x19\\x55\\x8f\\xc9\\x42\\x83\\xf5\\xa6\\x91\\xc2\\x20\\x4f\\xe0\\x39\\xc6\\x73\\x11\\x2c\\xa0\\x8c\\xbc\\xad\\x87\\x1f\\xb3\\x49\\x14\\x13\\x80\\xae\\x46\\xc9\\x6c\\x3e\\xc5\\x57\\x51\\x7e\\xdd\\xdf\\x51\\x34\\x2f\\xe4\\x43\\x08\\xb6\\x41\\xf6\\xfc\\x73\\x7c\\x4d\\xf5\\x8b\\x62\\xb6\\x34\\xf3\\xb1\\xb5\\x85\\x52\\x3c\\x4b\\x2e\\x30\\x0a\\xa6\\x53\\xc0\\x46\\xd6\\x44\\xf8\\x6a\\x84\\xe7\\x39\\x9c\\xb2\\xd9\\x23\\x5d\\xbd\\x7c\\x82\\xaf\\x51\\x8c\\x29\\x46\\x87\\x98\\xb5\\x13\\x12\\x8c\\x2d\\x82\\xe9\\xf4\\x1a\\x0d\\xaf\\x01\\xe5\\x04\\xbd\\x2c\\x04\\x00\\xd0\\xee\\xef\\x44\\xee\\x88\\xe2\\xb3\\xc6\\xa6\\x66\\x3b\\x6f\\xdc\\x53\\xb0\\x80\\x3e\\x7d\\x22\\xe3\\x28\\x72\\xff\\x92\\x86\\x08\\xf1\\x9f\\xb2\\x14\\xc0\\x8f\\xb5\\xf7\\xb6\\x48\\x65\\x5f\\xe7\\xf8\\xfa\\xa4\\x25\\x38\\x90\\xc9\\x1d\\xaf\\xba\\x52\\x48\\x3d\\xa7\\x03\\xdc\\x77\\xbc\\x8c\\x40\\x19\\x45\\xe8\\x6d\\x44\\xdd\\xb5\\x50\\x12\\x2f\\xc3\\x2b\\x55\\xef\\x29\\x9f\\xb5\\xc3\\xbc\\xce\\xcc\\x97\\x44\\x86\\xd5\\x82\\x76\\xe5\\xe6\\x35\\xc8\\xc9\\x70\\xae\\x60\\x95\\x74\\x24\\x5d\\xc6\\x34\\xd1\\xa8\\x75\\xf4\\xe2\\xfd\\xdb\\xd3\\x77\\x6f\\x5f\\xbf\\x3e\\xfc\\xe5\\xa7\\xd3\\x0f\\x87\\x6f\\x5e\\xbc\\xfd\\xf5\\x83\\x4e\\x9d\\xe1\\x33\\xd5\\x66\\xa1\\xdf\\x2a\\xd1\\x7f\\x16\\x95\\x91\\xfb\\x4c\\x41\\xc6\\xf3\\x3c\\xc8\\x03\\x34\\x40\\xc7\\x27\\x55\\x35\\x10\\xbc\\x3f\\x84\\x88\\x0f\\xe5\\xd7\\xf5\\x78\\x94\\xe8\\xa8\\x35\\x5f\\x64\\x93\\x46\\x79\\x61\\xb3\\xa3\\x8b\\xb6\\xd6\\x61\\x98\\xd1\\x4a\\xe7\\xf8\\xda\\x7e\\x4a\\x22\\x38\\x2d\\x3a\\x5a\\xc3\\x24\\x79\\x1d\\xbb\\x44\\x8f\\x65\\x0a\\xda\\xda\\x42\\xb3\\x60\\xae\\xec\\x44\\x11\\xac\\x39\\xe0\\xba\\x40\\xff\\xf2\\xba\\x52\\x51\\xfe\\x26\\x98\\x6b\\xd4\\xaf\\xd2\\xb5\\xa3\\x1a\\x37\\x84\\x1e\\xe6\\x80\\xc5\\x6a\\x02\\x90\\x16\\x6d\\x1e\\x43\\xf5\\x08\\xe4\\x40\\x8e\\xdd\\x63\\xa8\\x56\\xb6\\x5f\\xd9\\x2c\\x0b\\x79\\xf6\\x98\\x26\\xf5\\x0e\\x9a\\x89\\x7a\\xd4\\xac\\x1e\\xc6\\xb6\\xb6\\xd0\\x87\\xb7\\xcf\\xdf\\xf6\\xf9\\x0a\\x40\\xd3\\xe4\\xec\\x1f\\xa6\\x23\\x69\\xe2\\x38\\x94\\xde\\xd6\\x31\\xd4\\x43\\x73\\x59\\x3e\\x40\\xa2\\xca\\xe6\\x43\\xc1\\x84\\xb2\\x4a\\x24\\x59\\x93\\xd1\\x23\\xff\\x80\\x2f\\x4a\\x58\\x4c\\x23\\x99\\x5c\\xa6\\xdf\\x89\\x2a\\x92\\x21\\xff\\x00\\x49\\x9e\\x63\\x94\\x2d\\x52\\xb8\\x13\\xe4\\xac\\x3e\\xca\\x50\\x96\\x47\\x84\\x20\\xe9\\xfe\\x8a\\x43\\x14\\x8c\\x21\\x10\\x41\\x9a\\x46\\x17\\xc1\\xb4\\x24\\x51\\x69\\xdb\\x26\\x08\\x84\\xf0\\x32\\x74\\x5d\\x47\\xe1\\x89\\x09\\xf4\\x62\\xc8\\xad\\x51\\x61\\x27\\xa8\\xd6\\x15\\x6f\\x9c\\xee\\xf4\\x65\\x85\\xaf\\x82\\x6a\\x84\\xa7\\x19\\x76\\xb5\\x30\\x0e\\xa6\\x19\\xd6\\x59\\x8d\\xb0\\x70\\x0c\\xde\\x73\\x22\\x32\\xa0\\x9a\\x60\\xaa\\xdf\\x24\\x99\\x66\\x20\\x2c\\x89\\x01\\x19\\x14\\x8b\\x7a\\x14\\x00\\x5d\\x43\\x0b\\x35\\xa6\\xa3\\xbe\\xf2\\x11\\x69\\x09\\x1b\\x29\\x19\\xdb\\xa3\\x50\\x8f\\x91\\x12\\x33\\x73\\x63\\x59\\x85\\xd5\\xad\\xdb\\x44\\x3a\\x1b\\x20\\xdf\\x58\\x5d\\xef\\xcb\\x81\\x9e\\xa0\\xa8\\x62\\x80\\x51\\x8a\\xd9\\x55\\x0d\\xd8\\xc5\\x2e\\x2c\\xef\\xf7\\xbb\\x4f\\xc8\\x2f\\x76\\x89\\x7a\\xbf\\xbf\\xbd\\x7b\\x73\\xd2\\xec\\xed\\xf9\\x98\\x6c\\xa8\\x77\\xb3\\x47\\x38\\xcf\\xa3\\xf8\\xcc\\x1e\\x8a\\x09\\x78\\x72\\x28\\x25\\x6b\\x40\\x03\\x11\\x9d\\x43\\xa3\\x59\\xaf\\x24\\xe0\\x17\\x26\\xd2\\xde\\x51\\xcd\\x28\\x50\\x12\\x8e\\xc8\\xf0\\x9e\\xde\\x59\\xa4\\xdc\\x59\\xa4\\x7c\\x5f\\x16\\x29\\xcc\\x0c\\x85\\x1f\\x99\\xbd\\x22\\x14\\x2d\\x63\\xf0\\xe1\\xe1\\x4d\\x65\\x88\\x8b\\x57\\x0a\\x8b\\x27\\xd7\\xa8\\xeb\\x7f\\xc5\\xd9\\x45\\xc7\\x74\\xf2\\xdc\\x0f\\xc3\\x0c\\xe6\\x42\\xec\\xf6\\x41\\x0c\\x4a\\xed\\x0c\\x2d\\xa8\\x7c\\xcc\\xa2\\x63\\x34\\x89\\x74\\x1c\\xe5\\x18\\x12\\x23\\x24\\x17\\x6c\\x5d\\x72\\xe9\\x48\\x12\\x69\\xe4\\x63\\x27\\x53\\x33\\x48\\x2f\\x4b\\x4a\\x62\\x22\\x58\\x68\\xcf\\xa6\\x5c\\xdc\\xae\\x06\\x85\\xa4\\x71\\xf5\\xca\\xe1\\x38\\x48\\xf9\\x24\\x66\\x41\\x12\\x14\\xce\\xcb\\x44\\x5a\\x32\\xdf\\x96\\xab\\x13\\x97\\x9c\\x4a\\x45\\x20\\x8e\\xa4\\x4c\\xb3\\x31\\xda\\x4c\\x76\\xf9\\x47\\xdd\\xc3\\x4d\\x5b\\xb5\\xef\\xdd\\x8c\\x70\\xce\\xe0\\x01\\x07\\x61\\x88\\x0f\\x1e\\xc0\\x58\\xa9\\xa6\\x3a\\x8a\\xcf\\x60\\x77\\xa9\\xea\\x82\\xc8\\x87\\x5f\\x4b\\xbb\\x62\\x26\\xd3\\x96\\x75\\x71\\xa7\\x56\\x45\\x8a\\x10\\x4c\\xa7\\x41\\x06\\xdd\\x1e\\xe5\\x84\\xbe\\xee\\x0d\\x06\\x62\\xc2\\x8c\\xc8\\xdc\\xda\\xa2\\xd9\\x9a\\x14\\xea\\x05\\x36\\x91\\xa7\\x0b\\x22\\x3e\\xa7\\x59\\x8e\\xb2\\x84\\xba\\x9a\\xcc\\xe7\\xb0\\xed\\x80\\xf2\\x28\\x88\\xaf\\xf3\\x49\\x14\\x9f\\x35\\xd1\\x10\\x8f\\x09\\xf3\\xa2\\xec\\x89\\x9b\\x0e\\x01\\x56\\xd4\\xdb\\x8b\\x2a\\xea\\xef\\x69\\xa0\\x7e\\xf0\\x00\\xe9\\x66\\x44\\x8f\\x7b\\xfe\\x29\\x89\\x4a\\x04\\x74\\x1d\\xa6\\xcb\\x83\\x4e\\x28\\xef\\x8f\\xf1\\x55\\x8e\\x0e\\xde\\xfd\\x8a\\x46\\xd7\\xa3\\x29\\x6e\\x8a\\xe1\\x02\\xfa\\xc5\\x86\\x09\\x23\\x82\\xa1\\x33\\xb3\\xe5\\x79\\x9a\\x8c\\x08\\xdf\\xcd\\x28\\x96\\x8c\\xbd\\x49\\xfa\\x1a\\xb1\\xfc\\x6c\\xf4\\xad\\x19\\x10\\x23\\x1d\\x53\\xe9\\x9b\\x26\\x6a\\xdb\\xc6\\xab\\x41\\x33\\x25\\x0d\\x5f\\x31\\x57\\x63\\x5f\\xfe\\x1f\\x95\\x0e\\xca\\x96\\xf4\\xd2\\x25\\x8f\\xc6\\x98\\x9e\\x9b\\x40\\xbb\\x02\\x94\\x9b\\xac\\xa0\\x6f\\x9a\\xc5\\x81\\xea\\x30\\x6c\\x16\\x7c\\x8b\\x3d\\x97\\xb5\\xb8\\x54\\x3b\\x06\\x2c\\x4f\\x46\\x53\\xd9\\x87\\xe4\\x50\\x1b\\x3d\\xd7\\x18\\x0a\\xd7\\xcf\\x2d\\xb4\\x24\\x5c\\x57\\x6a\\x50\\xf8\\x89\\xe0\\x5a\\xa8\\x8d\\x1f\\xd1\\x2d\\xe7\\xd1\\x23\\x4d\\x79\\xc1\\x28\\x34\\x2a\\x2b\\x28\\x10\\x84\\xa1\\xb0\\x03\\xd7\\x84\\xed\\x15\\xe5\\xca\\xf4\\xa0\\x39\\x24\\x4a\\x7b\\x07\\x37\\xf4\\x56\\xde\\x4b\\xfe\\x89\\x7a\\x09\\x5a\\x60\\x54\\xf6\\xe2\\x2a\\xe0\\xf3\\xf2\\xd6\\x88\\xc6\\xc5\\xab\\x0a\\x75\\xa8\\x28\\xa1\\x6a\\x34\\xc3\\xa0\\x97\\x02\\x56\\xa6\\x22\\xf7\\x51\\xa4\\xb2\\x02\\xc4\\x25\\x58\\x43\\x9a\\x6b\\xdd\\x64\\x98\\x66\\xd5\\x7a\\x1c\\x11\\x00\\xdb\\x8d\\xe6\\xc9\\x81\\x4c\\x8d\\xb2\\x7a\\x73\\xd2\\xdc\\x69\\xdf\\x1d\\x5a\\xee\\x0e\\x2d\\xdf\\xd7\\xa1\\x45\\x39\\x59\\x00\\x19\\xf3\\x28\\xdf\\x9f\\x2b\\x8c\\xd0\\xe1\\x30\\x88\\xd5\\x53\\x4a\\x34\\x0c\\x2a\\xd1\\x81\\xf0\\x15\\xbd\\xab\\xb2\\x45\\x19\\x3a\\x9a\\x05\\x69\\xfe\\x82\\x15\\xac\\x46\\x06\\x72\\xda\\x0f\\x80\\x96\\x14\\xc0\\xe1\\x38\\x90\\xca\\x2b\\xc3\\x62\\x27\\x11\\x4d\\x31\\x71\\x10\\x39\\xca\\xd3\\x28\\x3e\\xbb\\x01\\xcf\\x6f\\xdb\\x7b\\x72\\xf8\\x19\\x06\\xb1\\xae\\xc8\\x6f\\xc1\\x74\\x81\\x6f\\xd0\\x05\\xf9\\xc3\\xee\\x6a\\x49\\x8f\\x63\\x9c\\x62\\x4f\\xf3\\x96\\xa6\\xdd\\x34\\x4e\\x4e\\xc2\\xaa\\x70\\x72\\x88\\xc7\\x06\\xa0\\x93\\xd3\\x59\\x93\\x82\\x60\\xde\\xe6\\x41\\x2d\\x4d\\xa7\\x11\\x02\\xe7\\x0f\\x83\\xb8\\x51\\x71\\x6c\\x05\\x9d\\x24\\x29\\xc5\\x55\\x99\\x0d\\x8b\\x65\\x30\\x69\\x06\\x72\\x20\\x34\\x36\\x22\\xaa\\x8e\\xa4\\x1d\\xb0\\x10\\x43\\x65\\xc7\\x61\\xcd\\x9d\\x10\\xeb\\xe9\\x79\\x94\\x12\\x79\\xd9\\xe6\\x47\\xce\\x31\\xf0\\x21\\x61\\xc1\\x8a\\x94\\xe1\\x43\\x3b\\xac\\xdb\\xc6\\x66\\x15\\x15\\xee\\x0b\\x3f\\xdb\\x51\\x05\\xdc\\x74\\x45\\x44\\x29\\x88\\x06\\x2c\\x05\\x4f\\x6a\\x6c\\x42\\xcf\\x6c\\x2c\\x71\\x96\\x47\\xf9\\x82\\x8a\\xca\\x66\\x83\\xf1\\x10\\xcf\\x93\\x2c\\xca\\x95\\x31\\xb0\\x1e\\x04\\xf0\\xd0\\xde\\x68\\x1a\\xe1\\x38\\x77\\x19\\x21\\xfa\\x83\\x54\\x31\\x2b\\xe4\\x59\\x1a\\xcc\\x98\\xaf\\x0d\\xab\\x19\\xef\\x26\\x19\\xd6\\xb9\\xe8\\x05\\xfd\\x8f\\x17\\x71\\x08\\xce\\x21\\x23\\x9c\\xe6\\x41\\x24\\x68\\xcd\\x93\\x07\\x08\\xea\\x59\\x8d\\x19\\x7c\\x71\\x3e\\x20\\xc6\\xb1\\x0a\\x43\\x10\\xaa\\x8d\\x34\\x69\\x95\\xb2\\xc8\\x69\\x8e\\x3d\\x22\\x6e\\x58\\xae\\xc9\\xc5\\x47\\xfa\\xec\\xd3\\x9e\\x35\\xab\\x67\\xba\\xc0\\x7d\\xfa\\xa7\\x7c\\x10\\x72\\x64\\xe7\\x70\\xd2\\x05\\xa3\\xcd\\x82\\x2c\\xce\\xc8\\x9e\\x1c\\x8d\\x10\\xdf\\x60\\x90\\x48\\x81\\xd3\\x98\\x2d\\xb2\\x1c\\x04\\x0f\\x3c\\xc3\\x71\\x2e\\xc8\\x7a\\x78\\x9d\\xe3\\x6c\\xbb\\xbb\\xc9\\xce\\x75\\xf7\\x36\\x1d\\xa4\\xc4\\xea\\x7d\\x36\\x02\\xca\\x8c\\x14\\xc4\\x9b\\xa3\\xeb\\x0e\\x2d\\xe2\\xe8\\x7f\\x16\\x18\\x45\\x21\\x8e\\xf3\\x68\\x1c\\xe9\\x37\\xbc\\xa5\\xa8\\x8e\\x63\\xd9\\x87\\xd6\\x00\\x16\\xfb\\x26\\x14\\x80\\x74\\x20\\xc9\\x0a\\xda\\xe3\\x0e\\x90\\xa5\\x48\\x37\\xc3\\x33\\xcc\\xe4\\xc9\\x66\\x8b\\xcf\\x1c\\xef\\xab\\x4a\\xab\\xb7\\x44\\x8e\\x95\\x73\\x0c\\x9f\\x1f\\x63\\x80\\xbc\\xaa\\xb0\\x73\\xbf\\xbf\\x4d\\x8e\\x35\\x3c\\xe5\\x0b\\x39\\xd0\\x74\\xbc\\x2e\\x99\\x90\\xb8\\xb6\\xd9\\xe9\\xd6\\x39\\x01\\xfd\\x5d\\xbe\\xbd\\x4b\\x88\\xfc\\xc9\\x72\\x36\\x35\\xe9\\x2d\\x92\\xce\\x78\\x9e\\x9c\\x20\\x93\\x31\\x12\\x03\\x1d\\x0c\\xd0\\x7d\\x1a\\x4c\\xf9\\xbe\\xc1\\xcc\\xed\\x20\\x99\\xcd\\x92\\xf8\\x9f\\x47\\x55\\x6d\\x49\\x19\\x67\\xc5\\x37\\x06\\x07\\x1f\\x42\\xe3\\x3e\\xc1\\x5c\\x8a\\xef\\x6f\\x36\\x91\\xf4\\x08\\xc7\\xa3\\xc7\\xc3\\x20\\xc3\\xbb\\xbd\\xd2\\x8b\\x59\\xb8\\x53\\x2e\\x7a\\x31\\x3f\\x0f\\xc7\\xa5\\x87\\xa3\\x68\\x3e\\xc1\\xe9\\x63\\xda\\xb2\\xd1\\x84\\x95\\x7c\\xf0\\x34\\xc3\\xf2\\xf0\\xe9\\x15\\x1b\\x1d\\x3d\\xc7\\xe1\\x7d\\xf4\\xe0\\x01\\x7b\\xd1\\x0a\\x66\\xda\\x8b\\xdb\\xad\\x2d\\xb4\\xff\\xe6\\x79\\xe5\\x31\\xad\\xd4\\x38\\xe6\\xa3\\x6c\\x22\\x75\\x70\\xf0\\x9b\\x8c\\x89\\xbe\\xa0\\x43\\x81\\xef\\xf2\\x08\\x4e\\xc4\\xf4\\xb9\\x87\\xa2\\x05\\x8d\\x86\\x6c\\x44\\x8d\\x61\\x9a\\x5c\\x66\\x38\\xad\\x2a\\x26\\xc4\\xac\\x24\\x49\\xde\\x3a\\x48\\xaf\\xe7\\x79\\xf2\\xcf\\x23\\xb3\\xe9\\x2f\\x4b\\x10\\x56\\xd0\\x98\\xa8\\x52\\x56\\xde\\x36\\xcc\\x3a\\x08\\x06\\xdb\\xd1\\x24\\x49\\xf3\\xd1\\x22\\xcf\\xb4\\x12\\xd8\\x01\\x1a\\x20\\xde\\x78\\x55\\xb0\\x82\\x12\\xa7\\xd3\\x68\\x48\\x4a\\xb5\\xa6\\xd1\\x50\\x5f\\x04\\xd4\\xe1\\x07\\x80\\x50\\x52\\x90\\x54\\x68\\x49\\xcf\\x4c\\xed\\x06\\xd3\\xb3\\x04\\x1a\\x26\\x5f\\x34\\xfa\\xca\\xad\\x2d\\xf4\\x3a\\x49\\xce\\x17\\x73\\x94\\x07\\xc3\\x29\\xd6\\x0f\\xe0\\xe8\\xd9\\xdb\\x7f\\x69\\x74\\x5f\\xfc\\xf5\\xe1\\x2f\\xbf\\x9d\\x3a\\x8a\\x1c\\xfd\\xfa\\xec\\xf4\\xcd\\xe1\\xbf\\x4e\\xdb\\x1e\\x65\\x3a\\x1e\\x65\\xba\\x1e\\x65\\xb6\\x5d\\x20\\x7b\\xc0\\x24\\x97\\xb3\\xc1\\x25\\x97\\xb3\\xc1\\x26\\x97\\xe3\\xf0\\x19\\xb8\\xd2\\x7c\\x91\\x63\\x34\\xb5\\xce\\x8d\\x83\\x30\\x4b\\x6d\\x85\\xc9\\x62\\x48\\x0e\\xe0\\xa4\\x2d\\x6d\\x59\\xd8\\x31\\x0d\\xc0\\x23\\xd9\\x3c\\x2f\\x82\\x9c\\x14\\x28\\x42\\x3f\\xa0\\xee\\xce\\xee\\xdf\\x51\\xf4\\xe8\\x91\\x4d\\xbb\\x0e\\xe7\\x25\\xf4\\x03\\xea\\x74\\xf7\\x5c\\x4a\\xf8\\xf0\\x38\\x3a\\x41\\x03\\xd2\\xf2\\x0f\\xa8\\x63\\xd1\\xbe\\x9b\\xf8\\x84\\xa6\\xad\\x06\\x6d\\x6c\\x13\\xfd\\x81\\xda\\x57\\x9d\\x8e\\x66\\x79\\x89\\x56\\xb5\\x6f\\x34\\x57\\x58\\x88\\x22\\xf6\\xf7\\x60\\x7a\\x8e\\x7e\\x7a\\xd9\\xe8\\xfe\\xb1\\xa7\\xbf\\x2b\\x21\\xb8\\xba\\x32\\xe7\\xef\\x80\\xd7\\x91\\xf9\\xfd\\xb2\\xf8\\x96\\xe6\\x3c\\x1b\\x26\\x57\\xc6\\x72\\x60\\x7d\\x47\\xe0\\xbb\\x8a\\xd0\\x1f\\xa8\\x71\\x55\\x20\\x8a\\x7d\\xef\\x4a\\xdf\\xb7\\xa5\\xef\\x3d\\xcb\\xc5\\x08\\x34\\xd8\\xc8\\xae\\xd0\\x8f\\x3f\\xfe\\x88\\xf6\\xa0\\x52\\x76\\x85\\x1e\\xa0\\xf6\\xd5\\x78\\x4c\\xe7\\x60\\x77\\xdb\\x5c\\x9b\\xb0\\x91\\xe3\\x2b\\x32\\x6d\\xd9\\x95\\xb9\\x14\\x67\\x38\\xc7\\x19\\x14\\xbd\\xb2\\xdf\\x3b\\x71\\x5c\\xcc\\x16\\xd3\\x3c\\x9a\\x4f\\xa3\\x11\\x68\\x21\\xad\\x58\\xb9\\x22\\x6b\\x38\\x3c\\x2e\\x1b\\x30\\x56\\x8a\\xf5\\x68\\xb1\\xae\\xab\\xdc\\x1e\\x2d\\xd7\\x33\\xd9\\xd0\\x95\\x20\\xcd\\x16\\x43\\x04\\xd2\\x7d\\x13\\xcd\\xa2\\x2b\\x34\\x4a\\xa6\\x8b\\x59\\x9c\\x99\\xb8\\x80\\xdc\\x13\\x11\\x75\\x1b\\x21\\xe0\\xe5\\x21\\x21\\xf7\\x76\\x87\\xcf\\x00\\xfb\\xd9\\xee\\xb4\\xdb\\x96\\xd9\\x13\\x3c\\x91\\x4e\\x42\\x23\\x07\\x32\\xe8\\x6d\\xa2\\x4f\\xe4\\x3b\\x9d\\x52\\x77\\xed\\x8e\\x5c\\xbb\\xb3\\x2b\\xd5\\xee\\xec\\x7a\\x54\\xef\\xca\\xd5\\xf7\\x36\\x51\\x51\\xbd\\x6b\\xa3\\x3c\\xc1\\x57\\x69\\xf5\\xdc\\x0f\\xd7\\x51\\x7c\\x21\\xe3\\x9b\\xfc\\x5c\\x06\\xe7\\x57\\x7b\\x12\\x86\\xd9\\x1a\\xea\\xb1\\x47\\x6d\\xfe\\xa0\\xab\\x4c\\x8a\\xef\\x9c\\x28\\x7b\\x15\\x23\\xf9\\x9a\\x13\\xa3\\x6c\\x63\\x4a\\x13\\xfe\\xb3\\xa3\\x6c\\x71\\x4a\\x1b\\xfe\\x53\\xa4\\x6c\\x7f\\xac\\x0d\\xcf\\x79\\x82\\x1b\\x63\\xb8\\xa3\\xd3\\x84\\xfe\\xe2\\x1f\\x50\\x88\\x5d\\xb9\\x36\\x19\\xc6\\xf2\\x06\\x2b\\xef\\x30\\xd0\\x50\\x17\\xfd\\x81\\xc2\\x63\\xf2\\xdf\\xd5\\x1e\\xfa\\x03\\x5d\\x75\\x4f\\x74\\x81\\xfd\\x94\\x6a\\x11\\xfa\\x63\\x00\\x75\\xae\\x22\\x5b\\x59\\xd3\\x7e\\x54\\x79\\xd2\\xd8\\xd4\\x5d\\x45\\x6f\\x6d\\xa1\\x77\\x29\\x1e\\x51\\xfc\\x85\\xe8\\xfd\\x28\\x89\\x99\\x3c\\xa1\\x15\\x4d\\xde\\x1f\\xbc\\xfd\\x85\\x6c\\xfe\\xed\\xab\\x76\\xbb\\x89\\xda\\x57\\xed\\x0e\\xfc\\xdb\\x85\\x7f\\x7b\\xf0\\xef\\x5e\\x13\\x08\\x96\\xfc\\xdb\\x85\\x7f\\x7b\\xf0\\xef\\x1e\\xfc\\xdb\\x19\\x92\\x7f\\xb7\\x77\\xb5\\x12\\x8d\\xac\\x0e\\xe1\\x9f\\x87\\x68\\xff\\xc5\\x11\\x82\\x24\\xc8\\x88\\x9e\\x14\\x10\\x11\\x52\\xd3\\x28\\x9f\\xcc\\x5a\\x9a\\xe2\\x5b\\x5a\\xb0\\x49\\x1b\\x03\\x26\\xe8\\xb6\\xe8\\x0f\\x49\\x2c\\x6e\\xe1\\xab\\xdc\\x1c\\x6f\\xef\\x34\\x4c\\xde\\xe3\\x0c\\xe7\\x7d\\xcb\\x2d\\x63\\x09\\xa3\\x47\\xe7\\xd1\\x9c\\xf9\\x89\\x25\\x63\\x14\\xbf\\x4f\\x40\\x7f\\x33\\x09\\x32\\x34\\xc4\\x38\\x06\\x9f\\x5c\\x66\\x9c\\x11\\xc4\\x21\\xf8\\x31\\x84\\x51\\x88\\xe2\\x24\\x67\\xce\\x30\\x56\\xd2\\xa5\\xc9\\x41\\x79\\xa3\\xdc\\xdf\\xe7\\xf4\\x1c\\x5f\\xbf\\x4b\\xa3\\x24\\x7d\\x4f\\x5d\\xc3\\x06\\x83\\xe2\\xb9\\x8b\\xd4\\x4d\\xc6\\xea\\xfc\\x63\\x10\\x6e\\x90\\xeb\\x58\\xc3\\x3f\\xdc\\x59\\x63\\xa0\\x07\\xb5\\x78\\x6a\\xdf\\x20\\xcf\\xf1\\xf5\\xef\\x49\\x0a\\x3e\\x21\\xe7\\xf8\\xba\\x75\\x49\\xbe\\x3b\\x6b\\x1c\\x45\\xff\\xc6\\xac\\x42\\x16\\x9d\\x3d\\x23\\xfc\\x1b\\x6d\\xa1\\x9e\\x27\\x3b\\x11\\xde\\xb4\\x29\\x60\\xdb\\xda\\x19\\x9f\\x11\\x3e\\x9e\\xe2\\x37\\x07\\xe3\\x11\\xda\\xad\\xdb\\x2f\\x41\\x5b\\x36\\x9a\\xe0\\x70\\x31\\xc5\\x88\\x9c\\x69\\xed\\xe3\\xcd\\xde\\x27\\x97\\xa4\\xc7\\x06\\xef\\xfc\\x11\\x11\\xd5\\x1e\\xfa\\x8e\\x57\\xee\\xcd\\x89\\x58\\x0e\\x95\\x34\\x7f\\xd2\\x33\\xd3\\xf1\\x00\\x29\\x1e\\x3c\\x04\\x5e\\x2a\\xb6\\xd2\\xaf\\x3f\\xb0\\x21\\xb0\\xdf\\x76\\x09\\x16\\xb1\\x05\\x21\\xaa\\x52\\x34\\xbb\\xaa\\x90\\x8f\\x04\\xeb\\x31\\x54\\x3f\\xa1\\xd3\\x04\\xf4\\xc5\\x9e\\xd8\\xd9\\xb3\\x17\\xeb\\x47\\xd2\\xe6\\x5f\\xe9\\x12\\x62\\x0b\\x5b\\xe6\\x45\\x1e\\xe2\\x3d\\x36\\xc8\\xbf\\x89\\x41\\xfa\\x8c\\x12\\xd1\\xd9\\x7d\\x9f\\xe4\\x88\\x2c\\x16\\xaf\\xf2\\xb9\\xbc\\x61\\xab\\xfb\\xb5\\x6f\\x7f\\x47\\x8b\\x61\\xcd\\xfe\\x40\\x4c\\xe7\\x3d\\x9d\\x48\\x42\\x0b\\xbc\\x28\\xe4\\x0e\\x76\\x42\\x38\\x91\\x64\\x12\\xb9\\xc4\\x9e\\x52\\x00\\xe0\\x67\\x2d\\xb3\\xc7\\xfe\\x63\\x78\\x13\\x5d\\xc1\\x5e\\xe8\\x39\\x86\\x3f\\x06\\xb0\\x33\\x1e\\xb3\\x69\\xda\\x2a\\x68\\xf1\\x13\\x6a\\xb3\\x01\\xd9\\xe9\\x09\\x15\\x34\\x05\\x34\\xcd\\x58\\xc6\\x8f\\x68\\x97\\xb0\\xf8\\xd2\\xec\\xa3\\xc1\\x00\\xf5\\x6a\\x50\\xc0\\xd7\\x3c\\x23\\x4e\\xa4\\xb8\\xe7\\xcc\\xb4\\x9a\\x2b\\xeb\\x8d\\xa1\\xef\\x04\\xfd\\x81\\x0c\\x7e\\x3b\\x45\\xaf\\x4b\\xc0\\x53\\x3a\\x30\\x78\\x73\\xd3\\x28\\xbe\\xf8\\x59\\xc3\\x50\\x2b\\x8f\\xbd\\x78\\x2a\\xa9\\x55\\xb0\\x55\\xf1\\xab\\xe0\\xac\\xfc\\x91\\x9b\\xb9\\xca\\x2c\\x9a\\x6d\\x2d\\x8f\\x45\\x75\\xc7\\x5a\\x02\\x75\\x0e\\xef\\xfc\\x6f\\x7e\\xd4\\x6a\\x64\\x95\\x9f\\x83\\x17\\xf7\\x5c\\x9d\\xd4\\x18\\xef\\x0f\\xa8\\x07\\xce\\xe7\\xf4\\x87\\xe7\\x5a\\x55\\xa7\\xfb\\x98\\x37\\xc6\\x4e\\x3f\\x56\\xd0\\x7c\\xc7\\x6f\\xe9\\x42\\x3d\\x3f\\xaa\\xcb\\x9f\\xac\\x17\\xf5\\x70\\x68\\xe0\\x02\\x27\\xe8\\x0f\\x2f\\x16\\xa3\\x9e\\x12\\xf5\\x0c\\xa3\\xdc\\xe9\\xf6\\xb1\\xca\\x39\\x9c\\xd3\\x55\\xef\\xcd\\x4d\\x53\\x3f\\xbf\\x38\\x1e\\xa5\\xd7\\x73\\xea\\xc5\\x24\\x9f\\x00\\xde\\x34\\x51\\x32\\x1e\\x67\\xd8\\xe8\\x2c\\x86\\x44\\x1e\\xff\\x30\\x39\\x10\\x4d\\x14\\xf5\\x9a\\x55\\xb1\\xa9\\x59\\x68\\x56\\x8a\\xaf\\x9d\\xe2\\x6b\\xb7\\xf8\\xba\\xdd\\x04\\x46\\x6a\\x32\\xb2\\x37\\x0c\\x26\\xc4\\x2b\\x0c\\x86\\xec\\x23\\x97\\xc1\\x1c\\x75\\xe3\\x10\\x8e\\x2d\\xbd\\x7c\\xe2\\x96\\x48\\xc9\\x6a\\x7b\\x73\\x4c\\x1b\\x27\\xc2\\xa8\\x65\\xd6\\x94\\x62\\x6a\\xb5\\x6d\\xbf\\x6a\\xdb\\x2e\\x4d\\x81\\xcf\\x7c\\xa8\\x6b\\xa4\\xa9\\x2e\\x0c\\xf5\\x67\\x47\\xfd\\xd9\\x55\\x7f\\x6e\\x37\\x85\\x0a\\xd2\\x61\\xf3\\x7e\\x18\\x5f\\xa0\\xec\\xdb\\x40\\xad\\xae\\x98\\x89\\xda\\x14\\x44\\x6b\\xc9\\xad\\x89\\x56\\xa3\\x7e\\x07\\xb5\\xb2\\x83\\xe9\\x32\\xa7\\x36\\xfb\\x84\\xfd\\x84\\x59\\x56\\x20\\x30\\x15\\xa2\\x87\\x43\\x32\\x14\\xbb\\x12\\xbd\\x2d\\x61\\xfe\\x04\\x1e\\xff\\xa1\\xec\\x44\\xe5\\x44\\x13\\x95\\x06\\x3a\\xe5\\x19\\x2f\\x35\\x60\\x23\\x01\\x68\\xa0\\xab\\x36\\xd0\\x2d\\x37\\xe0\\x52\\x51\\x67\\xdb\\x65\\xe2\\x29\\x35\\xb0\\xed\\xd0\\x5d\\xff\\x5c\\x3a\\xce\\x3a\\x75\\x75\\xb2\\x08\\xe2\\x38\\xc4\\xbe\\xb7\\x1f\\xd1\\x85\\x80\\x44\\x67\\x6b\\x80\\x3a\\x7f\\x67\\x5f\\x7f\\xe0\\x44\\xc0\\x1e\\xb8\\x05\\x23\\x20\\xae\\x68\\x9c\\xc3\\x22\\x6d\\x1a\\x34\\xf1\\xbe\\xb4\\xc1\\x87\\x99\\x13\\xfa\\x90\\x54\\xb8\\x6d\\x21\\x7d\\xff\\x21\\xe9\\xcc\\x1b\\x59\\xa7\\x22\\x7b\\xff\\x21\\x29\\xc5\\x1b\\x59\\xb7\\x2c\\x79\\xff\\x21\\x29\\xbd\\xb3\\x6d\\xe9\\x71\\x45\\x0c\\x7a\\xf4\\xc8\\xb1\\xab\\x02\\x9c\\x1d\\x15\\xce\\x8e\\x01\\xce\\xae\\x03\\xce\\x6d\\x2b\\x9c\\xed\\xd5\\xe1\\xec\\xaa\\x70\\x76\\x0d\\x70\\x6e\\x3b\\xe0\\x6c\\x5b\\xe1\\xec\\xac\\x0e\\xe7\\xb6\\x0a\\xe7\\xb6\\x01\\xce\\xb6\\x03\\xce\\x8e\\x15\\xce\\xae\\x13\\x4e\\x17\\xc5\\xff\\x3a\\x07\\x43\\xea\\x2c\\x0f\\x72\\xf3\\x71\\x86\\x7c\\x80\\xd1\\xe5\\x86\\xeb\\x4a\\x51\\x88\\x50\\x51\\x6e\\xd1\\xad\\x43\\x21\\x32\\x85\\x79\\xd7\\x51\\x88\\xe0\\x2f\\xb7\\x5c\\x17\\xba\\xd4\\x97\\xda\\x85\\xec\\xcf\\xd7\\x61\\xdd\\x36\\xe8\\xb1\\x57\\x5a\\xb4\\xe5\\x23\\xb3\\x66\\xdd\\x96\\xcf\\xcc\\xd5\\xa5\\xab\\x1c\\x9a\\x8b\\xb5\\xbb\\x59\\x9b\\xd8\\xc4\\xc2\\xe5\\x80\\x76\\xcc\\x80\\x56\\x17\\x6e\\x05\\xd0\\xca\\xda\\x55\\x01\\x6d\\xaf\\x08\\x68\\x57\\x02\\xb4\\x6b\\x06\\xb4\\xba\\x72\\x2b\\x80\\x56\\x16\\xaf\\x0a\\x68\\x67\\x45\\x40\\xb7\\x25\\x40\\xb7\\xcd\\x80\\x56\\x97\\x6e\\x05\\xd0\\xca\\xea\\x55\\x01\\xed\\xba\\x01\\xb5\\x12\\x39\\xe6\\x59\\xf8\\x9c\\xc2\\x1e\\x95\\x4c\\xec\\x0b\\xb8\\x2c\\x4f\\xda\\xd6\\xb1\\x2a\\x6f\\xd8\\x97\\x73\\x45\\xe0\\x34\\xac\\x6a\\x93\\xc4\\xc9\\xf4\\x3b\\x7d\\xd4\\xdd\\xd9\\xdd\\xda\\xee\\x56\\xef\\xc0\\xb4\\x37\\x60\\xfa\\x6b\\x27\\x2e\\x3d\\x0a\\xb9\\x35\\x63\\x11\\x94\\xd8\\x35\\xd4\\x46\\x86\\xa8\\xcd\\x20\\x8a\\x88\\x04\\x33\\x0e\\x46\\x58\\x77\\x1f\\xa5\\x6b\\xfa\\xff\\xe0\\xab\\x60\\x36\\xd7\\x29\\x85\\xb4\\xc5\\x11\\x77\\x77\\x87\\x7e\\x73\\x7c\\x95\\x4b\\xa6\\x62\\xad\\xfd\\x17\\x47\\x2d\\x76\\x48\\x6d\\xcc\\xb8\\xa7\\xe5\\x39\\xbe\\x6e\\xa2\\xd1\\xf8\\x4c\\x77\\x3e\\x2c\\x1a\\x9c\\x4f\\x03\\x02\\xfb\\x55\\x8e\\xca\\x0d\\xb2\\x83\\x62\\xa3\\xe8\\xd2\\xd1\\x66\\xf5\\xda\\xed\\x40\\x73\\xcf\\x76\\x4a\\x53\\x0f\\xbd\\xc2\\xd3\\x39\\x4e\\x1b\\xfb\\x2f\\x2a\\x86\\x77\\xf4\\x8e\\x52\\x79\\xc6\\xec\\x65\\x65\\xf0\\x64\\x33\\x7b\\x6e\\xf3\\x08\\xb6\\xa9\\x8a\\x2d\\x61\\x7f\\x07\\x4c\\x51\\xd9\\xf7\\x5e\\x53\\xb5\\x47\\xec\\xef\\xec\\x34\\x0b\\x43\\xc4\\xfe\\x0e\\x84\\x47\\x99\\x85\\x3b\\xf7\\xfb\\xbb\\xdd\\x9b\\x93\\xe6\\xce\\xf6\\x5a\\x8c\\x50\\xbf\\x42\\xeb\\xd3\\xaf\\xc8\\x46\\xf4\\x1b\\xb6\\xf6\\xac\\x30\\x8d\\x87\\x88\\x99\\x5d\\x92\\x91\\xa1\\x51\\x32\\x9b\\x27\\x31\\x64\\xd7\\x2c\\x15\\x53\\x17\\x8a\\xa0\\xea\\x69\\x34\\x6c\\xb1\\x06\\x3e\\x7d\\x92\\x4d\\xf6\\x44\\x28\\x9c\\x2f\\x68\\x54\\x1a\\x64\\xb8\\xb0\\x26\\x0d\\x74\\x11\\xab\\x48\\xb1\\xdf\\x93\\x34\\x84\\xf0\\x65\\xa2\\xac\\x78\\x62\\x68\\x77\\x31\\x06\\xe3\\x7f\\xe0\\x10\\xfb\\xfc\\x52\\xbf\\xe8\\x49\\xfb\\xda\\x34\\x0a\\x0c\\xc1\\x1e\\x0e\\x08\\x2b\\xd4\\x17\\xf9\\x35\\x1f\\xef\\x41\\xdb\\x38\\x1e\\xb5\\xc8\\x0f\\xf3\\x60\\x77\\x7b\\xa2\\x20\\xfd\\xe9\\x69\\x37\\xab\\x2b\\xf4\\xe2\\x62\\xfe\\xf3\\xf3\\x97\\x85\\xf1\\x01\\xfd\\x5d\\xc3\\xfa\\x61\\x98\\x51\\x07\\x0f\\xc2\\xb7\\xb8\\x05\\x44\\x8e\\x67\\xf3\\x69\\x90\\xfb\\x6f\\x38\\x22\\x45\\xdf\\x9f\\x31\\x0b\\x1e\\xcc\\x6f\\x92\\xc0\\x75\\x58\\xec\\x68\\x70\\x65\\x11\\xfd\\x1b\\xb7\\x78\\xce\\x98\\x3e\\xea\\xa1\\x46\\xa7\\xbb\\x87\\x86\\x51\\x9e\\x69\\xec\\x17\\xb5\\x6d\\x47\\x17\\x9a\\xa6\\x0f\\x7f\\x5b\\x43\\xcb\\xa7\\x2f\\x7e\\x39\\x38\\xfd\\xd7\\xcb\\xb7\\xef\\xdf\\x9c\\xbe\\x79\\xfb\\xfc\\x05\\xda\\x87\\x30\\x7d\\x79\\x10\\xe7\\x28\\xc5\\xf3\\x14\\x67\\x38\\xce\\xa3\\xf8\\x8c\\x6b\\x6d\\xc9\\x0a\\x9a\\x25\\xa1\\x16\\x4f\\xda\\xe6\\x9f\\xbf\\xf0\\x6a\\x9e\\x6d\\x8f\\xb6\\xe6\\xf5\\x76\\x28\\x25\\xd3\\x6c\\xf1\\x53\\x4f\\xeb\\x76\\xbb\\x14\\x2d\\xc1\\xd0\\xa1\\x1d\\x40\\x58\\xb0\\x45\\x0a\\x36\\x8c\\x22\\x5d\\xb7\\xa1\\xb4\\xa9\\x11\\x09\\x3f\\x62\\x21\\x93\\xb9\\x45\\x1f\\x26\\x98\\xcc\\x66\\x9e\\xa0\\x05\\xf3\\x37\\x26\\x6c\\x13\\x91\\xc2\\xd0\\xa1\\xa9\\xa3\\x2a\\x4a\\xc8\\x67\\x34\\x3e\\xeb\\xc3\\xaa\\xe3\\xa3\\xdd\\x34\\x08\\x77\\xb6\\xf1\\x82\\x58\\x91\\x51\\x38\\xd8\\x1a\\x89\\x62\\x0f\\x2a\\x70\\x20\\x80\\x3a\\x15\\x49\\xa3\\x27\\xeb\\x83\\x0c\\xff\\x1c\\x5f\\x9b\\x5a\\xab\\x44\\x01\\x1a\\x8d\\xcf\\x50\\xe3\\x2d\\x80\\x11\\x4c\\x37\\xa1\\xfa\\x48\\x37\\x3f\\xf5\\x11\\x6a\\x84\\x80\\x27\\x1e\\xa2\\xf4\\x75\\x43\\xe8\\x98\\x23\\x85\\x50\\xb3\\x56\\x52\\xb5\\xb7\\x48\\x4e\\xfd\\xd1\\xa8\\x6e\\x2d\\xa3\\x9c\\x6b\\xad\\x86\\x14\\x79\\x57\\x16\\x4d\\xb9\\xf9\\x56\\x8b\\xca\\x91\\x2f\\xe8\\xfc\\x26\\x69\\x83\\x99\\x6e\\xc0\\x2c\\x35\\xd1\\x9f\\x28\\xba\\xe8\\xa3\\xe8\\xa2\\xd8\\x91\\x74\\x51\\x87\\x68\\x6f\\x06\\xa2\\x54\\xdb\\xef\\x2b\\x81\\xb6\\x99\\x18\\x6c\\x0d\\x6a\\x58\\xe4\\x07\\xa7\\x4d\\x31\\xab\\x2d\\x95\\x7d\\xd9\\x65\\x6a\\xcb\\x39\\xa7\\xfe\\x52\\x70\\x73\\x2c\\x74\\xb7\\x14\\xfc\\x5a\\xfc\\x2a\\x97\\xc2\\x73\\x7c\\xbb\\x4b\\x41\\xb4\\xbf\\xb6\\xa5\\xa0\\x6e\\xb5\\xb7\\xb1\\x14\\x0e\\xe3\\x28\\x8f\\x82\\x69\\xf4\\x6f\\x9c\\xa1\\x00\\xc5\\xf8\\x72\\x7a\\xcd\\x46\\x13\\x32\\x84\\x2e\\xbb\\x0c\\xb8\\xbc\\x70\\x35\\x4e\\xd2\\xd9\\x9b\\x24\\xc4\\xe8\\x05\\x0d\\x56\\x02\\xc9\\xf9\\x8a\\x5d\\x27\\x49\\xe5\\x85\\x07\\xee\\x94\\x10\\xef\\x85\\x2f\\x43\\x21\\x5e\\x38\\x57\\xd0\\xb7\\xb7\\xf0\\x6e\\x99\\xe0\\x1b\\xd5\\x17\\x3a\\xee\\xba\\xd6\\xa5\\x10\\xc5\\x91\\x62\\x05\\x2c\\xa6\\x5f\\xa2\\x5e\\xfb\\x95\\xe4\\xfe\\x7c\\x4e\\x88\\x10\\x50\\x8f\\x58\\xd8\\x53\\xf3\\x95\\x15\\x5d\\x34\\xe3\\x33\\x7e\\x39\\x39\\x1a\\x9f\\x71\\x21\\x89\\x2e\\x14\\xab\\xca\\x2f\\x27\\x07\\x51\\xea\\xc2\\x9b\\xa4\\x33\\x4a\\x6f\\x81\\x43\\x9f\\x4d\\x97\\x66\\x41\\xd6\\x83\\x82\\xc4\\xcd\\x5a\\x3b\\x61\\xc7\\x40\\x2d\\x6b\\xdc\\x9a\\xc8\\x88\\x2e\\x4c\\xea\\xa4\\xec\\x18\\x3e\\x58\\x51\\x9b\\xb2\\x2e\\x2c\\xc1\\x14\\xc0\\xe6\\x58\\xdd\\x1e\\x21\\xf4\\x63\\x26\\xa0\\x82\\x0b\\x8e\\xcf\\x48\\xee\\x8c\\x15\\x59\\x07\\x6a\\xa2\\xc8\\xb4\\xa6\\x61\\x3a\\xb5\\xb8\\x0e\\x83\\x3c\\x40\\x43\\x38\\x72\\x18\\x0b\\x1b\\x4e\\x24\\xd0\\x21\\x4d\\x58\\xad\\x0b\\x3c\\x56\\xea\\xee\\x1d\\x4e\\x81\\xf6\\x46\\x49\\x3c\\x4a\\x71\\x8e\\x1f\\x33\\x8c\\x4f\\x93\\x33\\xd3\\x0e\\x2a\\x59\\x69\\xbc\\x5f\\xf3\\xd4\\x43\\x34\\x50\\x18\\x3b\\x0d\\x3f\\xc0\\x18\\x35\\x0e\\x25\\x3e\\x8d\\xc3\\x95\\x45\\xa3\\x4f\\x19\\x0b\\x5c\\x40\\xba\\x62\\x97\\x66\\x84\\xe1\\xf2\\x9e\\x59\\xb7\\x52\\xa7\\x4b\\x0b\\x35\\xd2\\xae\\x20\\x7a\\xa0\\xe1\\xd3\\x59\\x0c\\xc4\\x28\\x3e\\xfb\\xcc\\x8c\\xbb\\x40\\xea\\x80\\x53\\x36\\x83\\xa5\\xb1\\x41\\xe0\\x2b\\x47\\xcd\\xa9\\xd7\\xc4\\x25\\x1f\\x70\\xcd\\x75\\xc2\\xea\\xf7\\x4b\\x29\\xad\\xe8\\xec\\xb8\\x79\\xb6\\x92\\xf8\\xb5\\xf4\\xa1\\xd4\\x1a\\x40\\x21\\xb9\\x51\\xc7\\xca\\xa0\\x00\\xa1\\xe0\\x22\\x88\\xa6\\xc1\\x70\\x8a\\xa9\\x8b\\x8b\\x99\\x19\\xca\\x72\\xd4\\x29\\x47\\xc7\\xfa\\xd6\\xc6\\xcb\\x28\\x66\\x92\\x92\\x55\\x84\\x61\\x1d\\x1b\\xe5\\x8e\\x5f\\x92\\x9c\\x05\\x51\\xa3\\x31\\xfe\\x69\\xa3\\x85\\x14\\x81\\xa2\\x0c\\xe1\\xf1\\x18\\x8f\\xf2\\xe8\\x02\\x4f\\xaf\\x51\\x80\\x42\\x9c\\xe5\\xe9\\x02\\x7e\\x37\\x51\\x8a\\x83\\xf0\\x71\\x12\\x8f\\xf0\\x0a\\x72\\x87\\xef\\x72\\x04\\xe0\\x3e\\xef\\xa2\\xa4\\x5d\\x7e\\x4d\\x4b\\x93\\xcf\\x90\\x79\\xdf\\xf1\\xaa\\xbd\\xc2\\xca\\x16\\x6d\\x2c\\xbb\\xb4\\x79\\x03\\x4b\\xad\\xed\\x97\\x05\\x11\\x2c\\xa0\\xbc\\xb1\\x70\\x34\\xf6\\x6d\\x16\\x59\\x99\\x82\\xa9\\x86\\xdd\\x48\\x61\\xb9\\x8d\\x14\\xa2\\x70\\x93\\x11\\x32\\x6e\\x83\\x43\\x96\\x71\\x87\\xef\\xb0\\x2f\\xa5\\xe9\\x77\\x71\\x9e\\x6a\\x43\\x4b\\xde\\xcd\\x76\\xba\\x7b\\x5b\\xdb\\x5d\\x43\\x29\\xaa\\x3a\\x76\\x14\\x2a\\x09\\xfa\\x7d\\xd4\\x31\\x15\\x54\\x0f\\x99\\x7d\\x64\\x6a\\xd1\\x43\\xa1\\x92\\x69\\xef\\x83\\x83\\x5a\\xb7\\xc1\\xc8\\x87\\x73\\x71\\x4d\\x05\\x9b\\xe2\\x0f\\x13\\x2c\\x09\\xaa\\xf4\\xf0\\x83\\x02\\x34\\x81\\x3b\\x54\\x72\\x50\\x5b\\x9a\\x51\\xf1\\xc3\\xe1\\x7e\\xcc\\x61\\x87\\x88\\x8e\\x9c\\x15\\x92\\xb3\\x02\\xe3\\x85\\x9a\\xc1\\x7f\\x13\\x6a\\x13\\xe6\\xf6\\x59\\xbd\\x64\\x2b\\xdd\\x44\\x57\\xce\\x92\\x35\\x79\\x90\\xd2\\x5a\\xdf\\x27\\xe2\\x06\\xf9\\x88\\x52\\x19\\x9e\\xe2\\x51\\x4e\\x21\\x3b\\xca\\xd3\\x20\\xc7\\x67\\xd7\\x0d\\x0f\\xbf\\x4d\\xe9\\xa2\\x16\\x4e\\x5f\\x03\\xb4\\x41\\x37\\xbb\\x0d\\x1f\\x7f\\x03\\x46\\x06\\xef\\x82\\x2c\\x23\\xbc\\xf7\\x59\\x90\\xe1\\xd0\\x14\\x26\\x46\\xfe\\x78\\x7b\\x1b\\xb0\\x0e\\x8e\\x70\\x0a\\x5a\\x18\\x22\\xe5\\x78\\xb5\\xbf\\x0c\\x8f\\xe4\\x4c\\xaa\\x88\\x5a\\x0c\\x3d\\xf9\\x79\\xbe\\x7a\\x8c\\x85\\x2d\\x0a\\x79\\x93\\xa9\\x1a\\x5b\\x78\\x3a\\x64\\x15\\x31\\xf7\\xf5\\xb3\\x2e\\xcc\\x39\\xe8\\x18\\x9a\\xc8\\xcb\\xac\\xa3\\xf4\\x31\\xb1\\x61\\xf9\\xc3\\x56\\x77\\xbf\\x82\\xb6\\x92\\xc1\\xc7\\xba\\xc6\\xa5\\x5a\\x95\\x34\\x91\\xaf\\x75\\x49\\x79\\x68\\x76\\xf2\\xb1\\xec\\xb1\\x86\\x1d\\xab\\xa1\\x89\\x62\\x5f\\xc7\\x54\\x48\\xbd\\xa3\\xcd\\xf2\\x14\\x07\\xb3\\x35\\x5e\\xd5\\xc2\\xc9\\x80\\xdd\\xa8\\xca\\xbe\\xc1\\xdb\\xdd\\xc7\\xc3\\x88\\xba\\x76\\xaa\\x0a\\x0d\\x2a\\x3c\\x43\\x4a\\x45\\xe9\\xba\\xb5\\x83\\x1a\\xdb\\x5d\\xe3\\x6d\\xab\\xfe\\xbe\\xf2\\x08\\xc6\\x52\\xba\\xb5\\x2c\\x3f\\xf4\\xf3\\xa1\\x7f\\xa9\\x91\\xd3\\x1c\\xd2\\x19\\x3f\\x24\\xcd\\x83\\x14\\x34\\x33\\x8e\\x23\\x52\\x55\\xdc\\x01\\xe5\\x45\\x61\\xdb\\xcf\\x8f\\x4d\\xf7\\xee\\x6d\\x8c\\xa7\\x8b\\x6c\\xb2\\x51\\x5b\\xec\\xa1\\x0d\\xd6\\x13\\x7c\\xc4\\xf4\\xf5\\x51\\x67\\x25\\x32\\x03\\x8d\\x5c\\x1c\\xcc\\x70\\x36\\x37\\x18\\x9b\\x19\\x2e\\x9d\\x4f\\x67\\x54\\x97\\x77\\xd0\\x62\\x5f\\xfe\\x2c\\xe7\\x09\\xb0\\xf4\\xaa\\x12\\xb7\\x12\\x88\\x01\\x5a\\xb3\\x11\\xb8\\x1e\\x1e\\xc9\\x22\\x8c\\x29\\x19\\x2b\\x81\\xca\\xd8\\x73\\xf9\\x5a\\xb8\\xfe\\x25\\xb8\\x7c\\x13\\x06\\xa0\\x8e\\x93\\x54\\x3a\\xda\\xae\\x49\\x3e\\xdb\\x57\\x71\\xe2\\xba\\x56\\x12\\xcd\\x54\\xee\\xd3\\x61\\x1d\\x7f\\x13\\x62\\x15\\x27\\x27\\x2e\\x35\\xc1\\x8d\\xe2\\xc1\\xb3\\x83\\xca\\xb5\\x2c\\x67\\xf4\\xd1\\x05\\x8d\\xd6\\xb0\\xbe\\x5b\\xd8\\xa2\\x65\\xdf\\xcb\\x27\\xd1\\x0c\\xbf\\x40\\x90\\x9a\\xb8\\x9d\\xdb\\x57\\x41\\x73\\x85\\x02\\xe5\\x8e\\xe6\\x6e\\x89\\xe6\\x8a\\xfb\\xcf\\xb5\\xd0\\x9c\\xf6\\xba\\xb3\\x3e\\xcd\\x89\\x66\\x6e\\x93\\xe6\\x6c\\xd7\\x9c\\xab\\xdc\\xf5\\x7f\\x5d\\x34\\x77\\x4b\\xd4\\x63\\xe1\\x0a\\x4b\\x91\\x4f\\xf9\\x8a\\xd0\\x8f\\x66\\xa8\\x78\\x22\\xee\\x3c\\x47\\x8e\\x53\\x12\\x73\\x54\\xbd\\x40\\x03\\x14\\x5d\\x18\\xe8\\x68\\x25\\x49\\x83\\xc9\\x76\\x34\\x75\\xe3\\xc1\\x24\\x88\\x62\\x48\\x73\\x5f\\xcf\\xd4\\xed\\x19\\x18\\x9f\\x9e\\x72\\x54\\xa3\\x81\\x57\\x24\\x4a\\xcb\\xf5\\x8d\\x22\\x88\\x90\\x16\\x6d\\xd4\\xad\\x9f\\x9e\\x02\\xb0\\x92\\xb0\\x21\\x8c\\xcf\\x4c\\xf9\\x6b\\x2d\\x3c\\xff\\xd9\\x01\\x97\\x2a\\xcc\\xca\\x18\\x3d\\x38\\x0a\\x05\\x12\\x6c\\x3d\\x3b\\xb0\\x8b\\x3b\\x56\\x50\\x28\\x38\\xef\\x44\\xf6\\xab\\x9c\\x6b\\x9f\\xe9\\xc2\\x0d\\x72\\xe6\\x75\\x6b\\x80\\x11\\x99\\x17\\x12\\xd2\\xad\\x68\\x7a\\xee\\x10\\x2a\\x6e\\x76\\x0c\\x49\\xf8\\xe9\\x03\\x19\\x77\\x3b\\xa4\\xb5\\xa5\\x60\\x9e\\x1f\\xa4\\x3d\\xf6\\xf5\\x72\\x82\\x59\\xb2\\x60\\x3a\\x00\\x48\\x5c\\x65\\xe2\\x1c\\x6e\\xe8\\xad\\x1c\\xc4\\x59\\x1d\\x51\\x73\\x7b\\xcc\\xaf\\xa2\\xa8\\xf7\\x38\\x19\\x39\\xe5\\x13\\xc2\\x83\\xde\\x72\\x7e\\x35\\x50\\x01\\x2a\\x2e\\xa8\\x2a\\xae\\xd2\\x6a\\xdb\\x3e\\x6e\\xa9\\xae\\x60\\x5c\\xa8\\x6c\\x61\\x21\\x33\\x1f\\xb7\\xb7\\x62\\x71\\x18\\x15\\x2a\\x7c\\xf1\\xc8\\xed\\x43\\xf8\\xaf\\xb7\\xef\\x41\\xaf\\xc8\\xd6\\x8b\\xb5\\xf8\\x55\\x92\\x02\\x3a\\x8a\\xdb\\xe6\\x26\\x52\\xd0\\xd1\\x2c\\x80\\x71\\x68\\x0d\\x18\\xa0\\x72\\x2c\\x87\\x46\\x79\\xd6\\x5c\\xa0\\xbf\\xc7\\x33\\x0c\\x27\\x6f\\x90\\xed\\x28\\x45\\x32\\x6b\\x19\\x50\\x9b\\x42\\xe8\\x41\\x78\\x6c\\x6d\\x89\\x9f\\x44\\xf1\\x05\\x4f\\x8c\\x4b\\xf7\\xc3\\x6c\\x1a\\x8d\\x70\\x83\\x0f\\x4c\\xb8\\x41\\xf9\\x8c\\xd0\\x10\\xd0\\x62\\x49\\x56\\x16\\xe2\\xa5\\x59\\x99\\x10\\x77\\xee\\x58\\xd9\\x1d\\x2b\\xfb\\xab\\xb3\\xb2\\x35\\xf1\\x03\\x70\\x23\\x9d\\x44\\x59\\x6d\\x6e\\xe0\\x82\\x8f\\x2d\\x46\\x60\\xb7\\xff\\x7a\\xfb\\xde\\x87\\x3f\\xca\\xe1\\x61\\x2a\\xfc\\xd1\\x56\\xbf\\x26\\xab\\x76\\x81\\xfe\\xa1\\xc0\\xe8\\x10\\x8f\\x92\\x19\\x63\\x00\\x84\\x69\\x46\\xc9\\x22\\x5b\\x8a\\xcb\\x0a\\x1c\\xaf\\x8d\\x8f\\x0a\\xca\\xe6\\xa3\\x6f\\x18\\x87\\xbc\\x86\\x38\\x25\\x20\\xed\\x73\\xc1\\xdf\\x11\\xcd\\x71\\x92\\x24\\x19\\x46\\xb3\\xe8\\x8a\\x48\\xed\\x76\\x64\\x41\\xd8\\x2a\\xeb\\xd9\\x04\\xc9\\xab\\x85\\x9d\\x38\\x3c\\xd6\\x46\\x72\\x01\\x87\\xbd\\x71\\x92\\xa2\\x6c\\x31\\xcc\\xf0\\xff\\x2c\\x70\\x9c\\xbb\\x34\\xb8\\x48\\x3d\\xdc\\x68\\xd2\\xc0\\x97\\x3f\\x5e\\x97\\x51\\x32\\xf8\\x25\\xca\\x58\\xf6\\x42\\x9e\\x08\\x32\\x8e\\xc1\\xe8\\x02\\xb3\\x17\\xfc\\xc5\\x15\\x9e\\x9d\\x7c\\x80\\x9e\\x0a\\x97\\xe8\\xe8\\x04\\xfd\\x31\\xa0\\x4d\\x1c\\x47\\x4b\\x44\\x04\\xd6\\x3e\\xe6\\xee\\xb5\\xcf\\x0e\\xaa\\x0d\\x9a\\x42\\x06\\xeb\\x0f\\x8d\\xef\\x82\\x30\\x24\\x04\\xb7\\x94\\x86\\x7a\\x1e\\x84\\xa0\\xa0\\xa6\\x7f\\xeb\\xe8\\xa7\\xdf\\xfd\\x7c\\x70\\x84\\xfe\\xd7\\xce\\xd6\\x13\\x34\\x67\\x00\\x64\\xec\\xd2\\xc9\\xbf\\xff\\x77\\xe7\\xa3\\xec\\x09\\x9c\\x56\\xe7\\x41\\xd8\\xe2\\xbf\\x6a\\x9f\\x50\\xdf\\x05\\xdc\\xc0\\x70\\x91\\xf1\\x7c\\xcb\\x22\\x58\\x31\\xf3\\x7e\\x85\\x7c\\x93\\x02\\xe6\\x35\\xf8\\x61\\x40\\x7f\\xb2\\x7d\\x21\\x19\\x82\\xab\\xbe\\xfe\\x6a\\x89\\xc5\\xbe\\x97\\x2c\\xb8\\xa0\\xcd\\x4c\\xe4\\xa5\\x22\\x18\\x86\\xcc\\x54\\x5f\\xbd\\xca\\x50\\x68\\x7a\\xc4\\x84\\x92\\x6f\\x85\\x91\\x51\\xd3\\x9c\\x9e\\xc0\\x64\\x42\\x18\\x84\\x65\\x13\\xa3\\x35\\xb3\\x78\\xd1\\x18\\x8d\\x52\\x3c\\x90\\x66\\xc7\\x23\\x82\\xef\\x22\\xce\\xc5\\x0a\\x80\\x18\\x26\\xd6\\xbe\\x62\\xb6\\x5a\\x2b\\x5d\\xd1\\x07\\x8f\\x61\\xe6\\x8b\\x88\\xc9\\x7f\\x2b\\x15\\x70\\x00\\x43\\x8d\\x54\\x38\\x34\\xd6\\xc8\\xa3\\x10\\x87\\x80\\x16\\x24\\x44\\x0d\\xb1\\x8b\\x15\\xd8\\x8a\\x60\\x1a\\x95\\xe7\\x2c\\x82\\x46\\xe5\\x39\\xc4\\xcd\\x50\\x9e\\xd6\\x81\\xd7\\x17\\x54\\x5d\\xa2\\x67\\xf9\\xa3\\xe3\\xff\\x2a\\x50\\x28\\x42\\x8f\\x3c\\x82\\x43\\xca\\x7d\\xd2\\x4c\\xca\\xd2\\x93\\xda\\xe7\\xc2\\xd2\\x48\\xd0\\xa0\\x70\\xdc\\xe6\\x3a\\x50\\xb9\\xc3\\xa6\\x0a\\xb3\\xc3\\xac\\x75\\x3f\\x0c\\x9d\\x68\\x04\\xca\\x1a\\x25\\xf1\\x28\\xc8\\x79\\x4f\\xeb\\x53\\x86\\xff\\x1a\\xcf\\x05\\x13\\x06\\x2e\\x36\\x09\\x42\\x1a\\x74\\x9d\\xf1\\xae\\x2f\\xc9\\x99\\x17\\xb1\\x85\\x37\\x7f\\xcd\\xac\\x13\\x00\\x5f\\xda\\x42\\x13\\x6a\\x97\\x79\\xa7\\x83\\x61\\xfe\\x84\\x73\\xc9\\xd2\\x41\\xe1\\x6b\\x90\\xf8\\x0e\\x4d\\x83\\x2c\\x87\\xdf\\xb5\\xd8\\x5c\\x71\\xc8\\x3d\\x6e\\xa8\\x1c\\xee\\x31\\xea\\x6c\\xd2\\x00\\x3e\\x27\\x2c\\xd4\\x8e\\x23\\xda\\x1c\\x15\\x71\\xbd\\x88\\xbd\\xe8\\x64\\x50\\x66\\x4b\\xba\\x3a\\x1a\\xdd\\xfd\\x5a\\xae\\xeb\\xbf\\x1e\\x53\\x14\\x87\\xe7\\xbf\\xd3\\x6c\\x40\\x67\\x32\\xe0\\x69\\x89\\xf2\\x19\\xbd\\xe6\\xdf\\x24\\x21\\xbe\\xa1\\x57\\x4f\\x1f\\x84\\xe6\\x87\\xda\\x4c\\x80\\x9e\\x40\\x42\\xc8\\xc1\\xb3\\x03\\x8f\\x06\\x19\\xe9\\xdc\\x88\\xf5\\x40\\x9a\\x2d\\x4b\\xbd\\xd5\\xc6\\x61\\x0d\\xd7\\x5a\\xb1\\xe0\\x93\\xcf\\xb0\\x29\\x39\\x9d\\x99\\x57\\x2c\\x19\\x15\\x8c\\xa2\\x9a\\x90\\x92\\x7f\\x18\\x9c\\x36\\x70\\x6e\\x4c\\xae\\xff\\xcb\\xb9\\x39\\x51\\x12\\x34\\x96\\x3b\\x90\\xfc\\xae\\xbc\\x3d\\x9a\\xfc\\x92\\x5d\\xa8\\x3e\\x7b\\xf6\\x18\\x62\\x70\\xd2\\x25\\x48\\x36\\x5d\\xe5\\x21\\xf5\\x0e\\x93\\x14\\x9d\\x81\\x3f\\x9e\\x1b\\x03\\x05\\xc9\\x59\\x15\\x00\\x15\\xaf\\x3f\\x7e\\x4c\\x56\\xed\\xac\\x7d\\xb4\\x04\\xa4\\x2f\\x10\\xa7\\x40\\x09\\x0c\\x5a\\xc6\\x92\\x15\\x87\\xf3\\x2c\\xbf\\xf5\\xd0\\x0e\\x94\\x6a\\xd3\\xbd\\x89\\x1e\\x6e\\xad\\x02\\x97\\xd0\\x59\\xbb\\xb5\\x1a\\x3f\\x63\\x3c\\x47\\x41\\x8e\\xa6\\x98\\xec\\x3d\\x49\\xcc\\x97\\x74\\x44\\x93\\xfe\\x53\\x87\\x3a\\x10\\xfb\\x60\\xc7\\xb3\\xee\\x0b\\x48\\x68\\x3a\\x66\\x51\\x4c\\x7d\\xed\\x98\\x26\\xd2\\x96\\x6e\\xc8\\xf8\\x86\\x35\\x45\\x29\\x44\\x1a\\x2b\\xa5\\xeb\\x19\\xb8\\xa8\\x52\\xb5\\x5c\\x74\\x81\\x1e\\x3c\\x70\\xdd\\x6e\\x5b\\x22\\xfa\\xbe\\x5b\\x55\\xbb\\x5b\\x80\\xaa\\xea\\x9f\\x7d\\xf4\\x8d\\x16\\xb8\\x96\\x30\\x2f\\xf4\\x3a\\x94\\x15\\x62\\xb2\\x70\\xc1\\x65\\x8f\\xec\\x0b\\x90\\xc3\\xf3\\x39\\x16\\xde\\xd6\\x16\\x7a\\x17\\x84\\x20\\x6b\\xf8\\x1c\\x24\\xe0\\x24\\xcc\\x5c\\x40\\xe0\\x14\\x0b\\xdf\\xeb\\x28\\x68\\xb9\\x61\\x26\\x75\\x68\\xf2\\x50\\xea\\x2d\\x65\\x9a\\x69\\x6a\\xec\\xb6\\xf8\\xc4\\x67\\x1b\\x98\\x0b\\x0a\\x38\\xc4\\xf8\\x4f\\x27\\x95\\xce\\x75\\x50\\x2c\\xe7\\x6f\\x74\\x2b\\x96\\xaf\\xe0\\xcf\\x53\\x15\\x6c\\xeb\\x58\\x59\\xa3\\x51\\x32\\x9d\\x62\\xba\\xb6\\x93\\x31\\x97\\x30\\xe1\\xdc\\x85\\x73\\x9c\\xea\\x44\\x35\\x97\\x5c\\x2b\\x9d\\xd6\\xa4\\xe8\\x8a\\x44\\xac\\x4a\\x83\\x4b\\xe9\\x91\\x2b\\x80\\x94\\x3e\\x3c\\x03\\x0d\\x18\\x29\\x84\\xe1\\x9a\\x0d\\x15\\x16\\x53\\x90\\x0e\\x9e\\xed\\x32\\xb4\\x29\\xc2\\x91\\x6c\\x2e\\x92\\xa6\\x36\\xb3\\x60\\x4a\\x87\\x07\\x5f\\xa0\\x5d\\xb8\\xac\\x0a\\x68\\x12\\x32\\x9c\\x46\\x17\\x54\\xfa\\xe5\\x4c\\xd4\\xd5\\x36\\x37\\x12\\x2b\\x0e\\xd3\\x92\\xbf\\x92\\x35\\x51\\x9b\\x9f\\xa4\\xbc\\xe2\\xd0\\xed\\x12\\xf3\\x68\\x82\\x67\\x2b\\x77\\xa1\\x3f\\x1a\\xb1\\x6b\\x5e\\x70\\x7e\\x1d\\x4b\\x4d\\xbb\\x5a\\x7b\\x09\\xf1\\x41\\x6e\\x88\\x14\\x31\\x0b\\xf2\\x9c\\xf9\\x7f\\xb1\\x48\\x11\\xfc\\x69\\x59\\xdc\\x1f\\x25\\xf1\\x05\\x4e\\x73\\xe5\\xe0\\x05\\xcb\\x42\\x38\\xa5\\x81\\xa7\\x1a\\xf5\\x0d\\xaa\\x1b\\xac\\xec\\x1d\\x6d\\x48\\x0d\\x59\\x26\\x1e\\xae\\x64\\xa1\\xed\\x0e\\xd0\\xa2\\x0e\\x63\\x59\\x9d\\x8c\\x88\\x82\\x22\\xc3\\x5e\\xf2\\x7a\\x0b\\xe2\\x6b\\x3e\\x53\\xf3\\x24\\xcb\\xa2\\xe1\\x14\\x7b\\x71\\x18\\x3b\\x00\\xeb\\x08\\x82\\x52\\x4c\\x40\\xd5\\x8f\\x8d\\xbe\\xe3\\x7a\\x3b\\xc3\\xf6\\xf6\\x50\\x7c\\x2b\\xf8\\x50\\x5f\\xfa\\x5e\\xc4\\x48\\x71\\xd5\\x3f\\xc7\\xd7\\x7d\\x35\\xaa\\x8a\\xab\\x46\\x29\\xe4\\x8a\\xb3\\x3c\\xe1\\x4b\\x7d\\xf8\\xd7\\xbf\\x8e\\x60\\x33\\xfd\\x6a\\xb4\\x18\\x67\\x65\\x76\\x72\\x2d\\x1b\\x86\\x3a\\xeb\\x89\\xe3\\xac\\xaa\\x2e\\xfb\\xf9\\xe0\\xe8\\x89\\xb3\\xae\\xb4\\x2f\\xf6\\x9c\\x85\\x05\\x27\\x90\\xba\\xa2\\xcf\\x5a\\x6f\\xe7\\x38\\x3e\\x3a\\x7a\\x6d\\x6b\\x61\\xd5\\x10\\x37\\x32\\x09\\x3a\\xa5\\xfa\\x59\\x74\\x75\\x18\\xab\\x55\\xd6\\x67\\x59\\x4f\\x79\\x5c\\xb6\\x34\\x93\\x43\\x3e\\x9c\\xa2\\xca\\x7e\\x4b\\x51\\x93\\x0c\\x1c\\x78\\x91\\xd5\\x37\\xb3\\xe6\\xbe\\x87\\x3c\\x3e\\x01\\x6c\\xcb\\xf0\\x3d\\x1a\\x47\\x65\\x0e\\x58\\xbb\\xf5\\x7c\\x92\\x26\\x97\\x19\\x7a\\x91\\xa6\\x49\\x8a\\x0e\\xc7\\x28\\xc6\\x45\\x84\\xaa\\x62\\x74\\x71\\x42\\x9f\\x94\\x36\\x18\\x9c\\xa2\\x28\\x43\\x66\\xfb\\xaa\\xdb\\x62\\x78\\x74\\xf8\\xc2\\x1c\\x87\\x71\\xbe\\x47\\x68\\x63\\xc3\\x19\\x5a\\x40\\x5b\\xb5\\x95\\x27\\x47\\xf0\\xdc\\x23\\xbe\\x81\\xa3\\x01\\xc3\\xda\\xab\\xb9\\xbc\\x78\\x73\\xf2\\x12\\x13\\x38\\xf7\\xf0\\x2a\\x28\\x0a\\xa3\\x4f\\x9f\\xe8\\xa2\\x2b\\xaa\\xb7\\x38\\xf5\\x5c\\x73\\x4d\\x96\\xae\\xa5\\xd5\\x2c\\xc3\\xe9\\x02\\x59\\xee\\x8e\\x9f\\x42\\x0a\\xd7\\xfc\\xe2\\x6b\\x9d\\x9b\\x7e\\x86\\x72\\xdd\\x1a\\xf4\\x07\\x83\\x35\\xf2\\x52\\xe0\\x71\\x20\\x20\\xe3\\x73\\xba\\xcc\\xd5\\xbf\\x60\\x4f\\x81\\x99\\x37\\xc5\\xbc\\xf3\\xc7\\xa3\\x64\\x36\\x0f\\x72\\x90\\x31\\x56\\xe3\\x57\\xb2\\x14\\x50\\x92\\x6f\\x24\\x39\\x7c\\x35\\x21\\x4a\\xc7\\xa7\\xd6\\x37\\x90\\x2f\\xe1\\x4b\\x94\\x50\\xe8\\x8f\\xf8\\x8a\\x37\\xac\\x6d\\x69\\x3d\\x79\\xec\\x69\\xa6\\x25\\x2f\\x1a\\x59\\x66\\x5b\\xf5\\xd7\\x38\\xcb\\xb9\\x01\\x14\\x0e\\x56\\xbc\\x71\\xe4\\x76\\x22\\x27\\xc2\\x52\\x5d\\xf2\\xcc\\xa1\\xe6\\x02\\x8c\\x59\\x95\\x5c\\xa4\\x11\\x1f\\xd5\\xf1\\xa5\\x14\\x3f\\xbc\\x72\\x25\\x7d\\xdc\\xbe\\xda\\xd9\\xde\\xed\\xec\\x8e\\x9e\\x40\\x92\\xf1\\xdd\\x9d\\xdd\\xde\\xce\\x78\\x67\\x7c\\xb2\\xc9\\x6f\\x92\\xa1\\x17\\xfe\\xa3\\x18\\xb3\\x5b\\x8d\\x54\\x0f\\x30\\x1f\\x6c\\xba\\x55\\x2b\\xa2\\xc5\\x62\\x7f\\xa1\\x81\\xc6\\x6f\\x41\\x5e\\xb2\\xb1\\x1d\\x39\\x82\\xc9\\x7a\\x8e\\x5a\\x9c\\x49\\x14\\x4b\\x6c\\xcd\\xfc\\x42\\x8d\\xe7\\xca\\x39\\xdf\\xda\\x98\\xdd\\x97\\x0b\\xee\\x5a\\x3d\\xe6\\x95\\xb8\\xd1\\x3c\\x48\\x33\\xdc\\x50\\x78\\x57\\x6d\\x13\\xa6\\x34\\x53\\x14\\xe4\\x45\\x63\\x2e\\x4f\\x7c\\x52\\x13\\xd1\\xd4\\x19\\xfe\\x7c\\x88\\xd2\\x74\\x05\\x70\\xcf\\x2b\\x36\\xcf\\x7e\\xb8\\x29\\x8e\\xa4\\x63\\x63\\x99\\xe1\\x6d\\x9d\\x7c\\xc0\\x59\\x4e\\x8d\\x53\\x83\\xa9\\x9d\\x7d\\x95\\x7a\\x3a\\x6e\\x9f\\xa0\\xc1\\x00\\x15\\xec\\x08\\x3d\\x78\\x50\\x86\\xe6\\xb8\\xc3\\xca\\x70\\x36\\xe5\\xa1\\xc0\\x7f\\x71\\x45\\xaf\\xed\\xad\\xf0\\x20\\x95\\x57\\x57\\xb8\\x64\\x09\\x0e\\x66\\x46\\xde\\x6d\\xa2\\x9e\\xd6\\x90\\xb3\\x04\\x02\\x33\\x69\\x80\\xc6\\xc1\\xc6\\xa2\\x68\\xce\\x5a\\xb5\\xd2\\xeb\\x1c\\xba\\x6d\\x5b\\x6c\\xec\\x2a\\x35\\x15\\x1b\\x89\\xce\\xee\\x2a\\xcc\\x55\\xab\\x19\\x31\\xa8\\x3e\\x9a\\x92\\xc2\\xc1\\x78\\x56\\x5e\\xcd\\x1e\\x83\\xf3\\xa5\\xcb\\x34\\x98\\xcf\\xe1\\x00\\x16\\xe4\\x0c\\x54\\x59\\x31\\x8c\\x02\\x22\\x3b\\x66\\x52\\xac\\x1c\\x5f\\x86\\x66\\x0a\\xdd\\x51\\x09\\xbb\\x53\\x04\\xf0\\xd0\\xbd\\x5a\\x2d\\xd6\\xc2\\x9a\\x4d\\x27\\x84\\x78\\xce\\x8f\\xe2\\xb6\\xc3\\x37\\x57\\x7f\\xca\\xf8\\x62\\xe8\\xa2\\x31\\xba\\xe2\\x90\\xd2\\xb3\\xd0\\x0e\\x14\\xb6\\x11\\x76\\x15\\x8a\\x67\\xc6\\x02\\x4b\\x88\\x27\\x80\\xb8\\x5f\\x39\\x75\\xe8\\xe9\\x6c\\x89\\xcc\\x07\\xec\\x5a\\x9d\\xd0\\x0e\\x8b\\x12\\xb4\\xfe\\xb0\\x63\\x85\\x6e\\xdf\\xae\\xe9\\xb0\\xc4\\x5e\\x64\\xb0\\x51\\x2b\\x63\\xf6\\xbd\\x88\\xba\\xf8\\x17\\x8c\\x7e\\xad\\x17\\x53\\xf6\\xbf\\x75\\x21\\x85\\x70\\x2a\\xbd\\x3e\\xba\\xca\\x53\\x44\\x18\\xab\\xaa\\x52\\x56\\x89\\x68\\xe5\\x56\\xcd\\xdc\\x5e\\xdf\\x45\\x54\\x70\\x8b\\xa6\\xf4\\xb3\\xc2\\xd1\\x14\\x3c\\xc3\\x20\\x07\\xd6\\x56\\xe9\\x6a\\x42\\x97\\x99\\x03\\x8b\\xad\\x33\\x7c\\xf9\\xb2\\x91\\xcb\\x5f\\x38\\x9c\\x83\\xa5\\x48\\xa2\\x49\\x11\\x2e\\x41\\x97\\x13\\xc4\\x15\\x51\\xac\\x22\\xb1\\x16\\x7e\\xfc\\x22\\x2e\\x29\\xc3\\xd1\\xfa\\x84\\xd6\\x03\\x40\\x4b\\xd1\\x13\\x58\\x88\\xd9\\xda\\x66\\xe6\\xe9\\x64\\x1b\\x13\\x21\\xd6\\x4c\\x62\\xc2\\x52\\xc2\\x91\\xa7\\x8c\\xa6\\x08\\x4e\\xd6\\x3a\\xfc\\x9e\\xc8\\x5e\\x8a\\x10\\xbc\\x40\\x49\\x2b\\xba\\xb0\\x97\\x96\\x6e\\x79\\x18\\xf9\\x5a\\x8b\\xd3\\x7b\\x9d\\xa2\\x79\\xb0\\x81\\xb2\\xd6\\x10\\x37\\x3a\\x45\\x25\\xf6\\xc8\\x5e\\x4f\\xba\\xcd\\x29\\x7b\\x91\\xda\\x2b\\x4a\\x37\\x3b\\x64\\x7d\\x8c\\xed\\xaa\\x14\\xa3\\x74\\x5a\\x5f\\x68\\x60\\x36\\x6f\\x99\\xa0\\x23\\x71\\xdb\\x60\\x30\\x51\\x40\\x9f\\x59\\x80\\x90\\xa9\\x54\\xc8\\x10\\x25\\x03\\x0d\\xe9\\x67\\x9e\\xb8\\x82\\x36\\xff\\x05\\x24\\x89\\x52\\x58\\x69\\x91\\xbb\\xf3\\x9b\\x90\\x1e\\x8a\\x4c\\xa3\\xee\\x2d\\x93\\x47\\x89\\xd4\\x6c\\x99\\x7c\\xc5\\xb0\\x38\\xa5\\x52\\xe4\\xc8\\x75\\x6c\\x9f\\xeb\\x86\\xb6\\x2c\\x2e\\xdc\\xfa\\x4e\\x6f\\x8c\\xe7\\x69\\x08\\xb5\\xf9\\x35\\x6c\\xf6\\x4c\\x4f\\x29\\x29\\x24\\xe5\\xc5\\x6f\\xee\\x4e\\xde\\xb5\\x99\\xa5\\x1d\\xa8\\x99\\xe4\\x81\\x16\\x5c\\xd5\\x01\\x04\\x63\\x88\\xd6\\xcd\\x5b\\x26\\x0a\\x45\\xe2\\x50\\x52\\x2f\\x51\\xc4\\x16\\xd2\\x83\\xc4\\x56\\x15\\xa5\\xb4\\x6b\\x9f\\x16\\xbd\\xad\\x5f\\x21\\xac\\x65\\xfa\\x65\\xc4\\x1b\\xcd\\x12\\x40\\x67\\x1e\\x64\\xd9\\x62\\x86\\x43\\xd5\\x42\\x28\\x98\\xa6\\x38\\x08\\xaf\\x25\\x39\\x45\\xd1\\x6f\\x2c\\xe2\\xd1\\x24\\x88\\xcf\\x96\\x4f\\xb0\\x51\\x6f\\x53\\x70\\xb2\\xf4\\x5a\\x2a\\x06\\xc2\\xcb\\xc1\\xb5\\x36\\xcd\\xf0\\x9a\\x76\\x4d\\xb3\\x22\\x7b\\x11\\xaf\\xa7\\x87\\x6f\\xe4\\x98\\x58\\x59\\xb8\\x54\\xb7\\xfd\\x96\\x53\\x22\\x12\\x4b\\x58\\xdf\\xb7\\x21\\x24\\x77\\x45\\xd9\\x2d\\x73\\x06\\xd6\\xa4\\x85\\x01\\x4a\\xb1\\xb5\\x65\\x5e\\xe3\\x1f\\x62\\x9b\\x5b\\xd1\\x52\\x96\\x5e\\x65\\x4e\\x96\\x2b\\x7a\\xe4\\x7b\\x3b\\xc5\\xfa\\xf0\\xbb\\x94\\xf2\\x7b\\x5a\\xc7\\x18\\xe0\\x67\\xbd\\xcd\\xe8\\x72\\xd6\\x01\\xe7\\xe1\\x18\\x4c\\x03\\xe8\\xdf\\x65\\xec\\x02\\x6a\\x98\\xb0\\x5a\\x6d\\x03\\x7e\\xa6\\x90\\x10\\x88\\x56\\x31\\x09\\x78\\x4e\\x40\\x01\\xcb\\x46\\x02\\x18\\xe1\\x8a\\x87\\xbf\\x71\\x3d\\xe4\\x9c\\x05\\x5d\\x5f\\xf5\\x9a\\x8d\\xb7\\xc3\\xec\\x5a\\xd9\\x0f\\x90\\x87\\x49\\xe7\\xd0\\x9d\\x77\\x30\\x80\\x22\\x25\\x30\\xa6\\x96\\xab\\x51\\xcc\\x3c\\xfa\\x98\\x61\\x24\\x33\\x69\\x3e\\xc3\\x31\\x38\\xf5\\x79\\x37\\x2c\\xf2\\x01\\x1b\\xda\\xa5\\xc9\\x64\\xbd\\x9b\\xad\\xaa\\x17\\x41\\x7d\\x2f\\xc9\\xe5\\xfb\\x68\\xb7\\x07\\x0e\\x89\\xf0\\x82\\x3b\\xc4\\x1d\\x8e\\x51\\x32\\x8b\\x88\\xf8\\xd8\\x44\\x01\\x7d\\x75\\x19\\x4d\\xa7\\x68\\x88\\x45\\xdf\\x21\\x4a\\x83\\x38\\x4c\\x66\\x53\\xe3\\x91\\x60\\x2d\\x1a\\x3f\\x6a\\x72\\xca\\x50\\xda\\x44\\x87\\xbf\\x35\\x81\\x3e\\x08\\x48\\xdf\\x04\\x97\\xa7\\xd4\\x15\\x56\\x59\\xbc\\xb4\\x64\\x5a\\xf8\\x0a\\x8f\\x16\\x39\\x6e\\x6c\\xf0\\x0c\\x03\\x1b\\x4d\\xd4\\xdd\\xd9\\xdd\\xda\\xee\\x36\\x99\\x3b\\x80\\x5b\\x12\\x5f\\x53\\x47\\x4d\\xb4\\x41\\x70\\x4b\\xfe\\x37\\x67\\xa9\\x31\\x68\\xcf\\x68\\xe3\\xf2\\x46\\xc2\\xd7\\x59\\x93\\xaf\\x98\\x26\\xa3\\x70\\x7a\\x9b\\xe4\\xf4\\x6c\\xa6\\xa4\\xc6\\x28\\xcd\\x7d\\x01\\x79\\xcf\\xc7\\x80\\xa2\\x72\\x23\\x48\\x5b\\x6f\\xec\\xf6\\xb6\\xf6\\x96\\xce\\x3a\\x43\\x39\\x98\\xc4\\xbe\\xac\\x02\\x32\\x4d\\x00\\x48\\xf3\\x9b\\x17\\xf7\\x6e\\x22\\xed\\x0b\\xe7\\x2e\\x8f\\x38\\x3b\\xb8\\xd9\\x6c\\x8d\\x92\\xd9\\x7c\\x01\\x01\\x07\\x38\\x46\\x61\\xac\\xae\\x0c\\x82\\x64\\x2d\\xe5\\xde\\x70\\x81\\x83\\x65\\xe5\\xaa\\x94\\x9c\\xfa\\xe5\\x58\\x5b\\x0c\\xbc\\x4d\\x3e\\x97\\xe8\\xa1\\xf5\\xf6\\x92\\x54\\x17\\x57\\x96\\x03\\x31\\x38\\x67\\x9c\\x8e\\xf7\\x4c\\xbc\\x5f\\x5e\\x59\\x57\\x28\\xd7\\xc4\\x39\\xf2\\xf6\\xef\\x30\\x75\\x0a\\x47\\xe5\\x42\\x33\\x64\\x9b\\x1d\\xdf\\x26\\x4a\\xfb\\x9c\\xe6\\x38\\xf1\\xd0\\x74\\x50\\x58\\xf7\\x45\\xa8\\x26\\xc1\\x89\\xb8\\x09\\xd5\\xbf\\xd3\\xe9\\xf1\\xbf\\x92\\x8b\\xd1\\x9f\\x9f\\xbf\\xbc\\x41\\x44\\x44\\xe2\\x2e\\x46\\x3a\\xf9\\xab\\x38\\xb0\\xf0\\x7d\\xcd\\x2e\\x84\\xac\\xe1\\x3a\\x54\\x83\\x32\\x2f\\xc7\\xf1\\xf3\\x70\\xdc\\x97\\xe4\\x2e\\x3d\\xed\\xae\\xe5\\x5e\\x94\\x45\\xfe\\x58\\x5d\\xf6\\xfa\\x9a\\x2f\\x4a\\xad\\x72\\xe1\\xb7\\xa0\\xe5\\xfc\\x6e\\xee\\x4b\\x35\\x9c\\xc7\\xeb\\xb2\\x70\\x83\\xcf\\xa6\\x47\\xba\\xbd\\xdb\\x87\\xa1\\x89\\xfe\\xfc\\x22\\xf7\\x95\\x85\\xc0\\xf0\\xb5\\xe8\\x31\\x4b\\xb2\\x52\\x92\\x7b\\xdc\\xc9\\xe9\\x24\\x5c\\xd2\\x29\\x11\\x6e\\xb9\\x50\\x2b\\x8d\\x94\\x4e\\x90\\x90\\x39\\xd9\\x6f\\x2a\\xae\\x78\\xc4\\x65\\xa2\\xa7\\x2c\\x8a\\x07\\xdb\\xf0\\x5b\\x20\\x30\\x29\\x70\\xb5\\x5c\\x21\\x27\\x7d\\xae\\x6c\\x15\\x95\\xad\\xf9\\xaa\\x5c\\x8e\\x21\\x5a\\x99\\x77\\x15\\x2a\\xe9\\x86\\xd7\\x06\\xdc\\x9b\\xe8\\x8a\\x1c\\x39\\x59\\x5d\\xd7\\xa4\\x48\\x0a\\x37\\xea\\xcf\\xa4\\xf4\\xe9\\xa1\\xba\\x75\\x69\\x63\\xd6\\x7e\\x61\\xf7\\x35\\xee\\x6c\\xb7\\x77\\x83\\xf7\\xcd\\x6f\\x71\\x7f\\xcd\\x8b\\x3c\\xdd\\x5e\\x52\\xf7\\x26\\x6f\\x5d\\xfb\\xca\\xda\\xa1\\xad\\xde\\xe4\\xdd\\xee\\x16\\xe8\\x79\\x91\\xf7\\xf5\\xed\\x82\\x5f\\xc9\\x6d\\xde\\x17\\xdd\\x8a\\x9b\\x8a\\x59\\xb3\\x5b\\x9f\\x71\\xdb\\x7b\\x73\\xdd\\xcb\\x4d\\xf3\\x25\\xb7\\x6e\\x6b\\x96\\x67\\xa8\\xfe\\xee\\xec\\x79\\xdb\\xa9\\xbd\\xa5\\x50\\x7e\\xd3\\x48\\xc5\\xff\\x51\\xbc\\x67\\x05\\x6e\\x9a\\x7f\\xde\\x6f\\x6d\\x8d\\x92\\x14\\xdf\\xef\\xef\\xf4\\x6e\\x4e\\x9a\\x3b\\xbd\\xfe\\x31\\x5f\\x55\\x8d\\x14\\xff\\xcf\\x22\\x4a\\x71\\x73\\x96\\x84\\x8b\\x29\\x6e\\xe2\\xab\\x79\\x92\\xe6\\xd9\\x66\\xb1\\x90\\xfe\\x2e\\xa5\\xac\\x49\\x93\\x24\\x6f\\xa2\\x71\\x30\\xca\\x93\\xb4\\x92\\x9a\\x55\\xba\\x2e\\x62\\xad\\xa0\\xc1\\x60\\x80\\xee\\xd3\\x13\\xcb\\x7d\\xdd\\xe2\\x84\\xe5\\x32\\x9b\\x25\\xf1\\x3f\\x8f\\x2a\\xef\\x28\\x40\\x2d\\xd1\\x54\\xd1\\x28\\x07\\xa0\\xec\\xd1\\xaa\\xe2\\x08\\xee\\x8e\\x24\\x98\\x68\\x84\\x4b\\x0a\\x12\\x1f\\xd1\\x7d\\xf4\\xe0\\x01\\x7b\\xd1\\x0a\\x66\\xa1\\x01\\xc4\\xfd\\x37\\xcf\\x2b\\x8f\\x69\\xa5\\xc6\\xf1\\x49\\x81\\x0e\\x27\\x30\\xda\\xc6\\x7f\\x9a\\x26\\xc3\\x60\\x8a\\x1a\\xc3\\x34\\xb9\\xcc\\x70\\x5a\\x8d\\x05\\x48\\x70\\xde\\xe2\\x5c\\xd5\\x67\\xf0\\x37\\x8c\\x3c\\xd5\\x20\\x50\\x4a\\xe1\\x8a\\x9c\\xf5\\x50\\xf0\\x6d\\x44\\x08\\x05\\x8d\\x92\\xd9\\x3c\\x89\\x71\\x5c\\x49\\xd0\\x50\\xe2\\xd6\\x70\\x6f\\x55\\xc0\\x26\\xbe\\x7e\\xfa\\x24\\x67\\x3a\\x7a\\x13\\xe4\\x93\\x66\\x11\\xca\\x5c\\x8b\\xe6\\x87\\xff\\xf1\\xff\\x31\\x48\\x5e\\x27\\xa3\\x60\\x8a\\xe6\\xc9\\xf4\\x7a\\x1c\\x4d\\x51\\x32\\x46\\x54\\x60\\x61\\xda\\x3f\\x5e\\x4c\\xaf\\xe8\\x62\\xb9\\xa1\\x07\\x6a\\x9d\\x12\\x38\\xa6\\x6d\\x42\\x94\\x78\\x49\\x8a\\xe8\\x94\\x83\\x48\\x97\\x66\\x37\\x19\\x7e\\xb4\\x6d\\x3c\\xe0\\xac\\xb2\\x18\\x12\\x2a\\xb4\\x70\\x81\\x97\\xad\\x79\\x9a\\xe4\\x09\\x29\\x85\\x06\\xe4\\x90\\x6f\\x29\\xcb\\x5a\\x43\\x03\\x14\\xe3\\x4b\\x02\\xac\\x77\\xbb\\xf1\\x62\\x3a\\x75\\xb3\\x22\\x01\\xad\\xae\\x8c\\x26\\x81\\x2c\\x24\\x8f\\xf5\\x55\\xa4\\x0a\\x12\\x59\\xe6\\x86\\xb4\\xe6\\xad\\xe8\\xeb\\x68\\x98\\x06\\xe9\\xf5\\x72\\x97\\xb1\\xd3\\x68\\x08\\x97\\xb1\\xf4\\x6f\\x9d\\x6e\\x89\\x44\\xc5\\x6f\\xb9\\x88\\xd0\\xcc\\x67\\x20\\x98\\xa2\\x28\\x9e\\xe0\\x34\\x32\\x65\\x8d\\x33\\x45\\xfd\\x24\\xed\\x89\\x70\\x9f\\xf4\\x47\\x89\\x9c\\xad\\xa4\\xba\\x74\\xf2\\x19\\x9e\\xca\\x11\\x02\\xd3\\x08\\x37\\xee\\x49\\x90\\xf3\\x71\\xb0\\x40\\xb4\\xf4\\x54\\x60\\x53\\x4c\\x21\\xb3\\x60\\x8d\\xb4\\x87\\x93\\xe4\\x02\\xa7\\x69\\x14\\xe2\\x0c\\xbd\\xa3\\x8a\\xdf\\x08\\x67\\x54\\x3e\\x98\\x5f\\xa3\\x28\\x86\\xa8\\x52\\x58\\x02\\x6b\\xe9\\x7e\\xcb\\x99\\xe0\\x3f\\xac\\xa7\\x59\\xdb\\xc1\\xc4\\x5d\\x7b\\xf5\\xe4\\x36\\x84\\x6e\\xde\\x5c\\x7f\\xa0\\xcb\\x5e\\x91\\xfb\\xfd\\xbc\\x76\\xe4\\xe8\\x2b\\x11\\x9e\\x86\\x7d\\xb4\\x71\\x11\\x4c\\x17\\x78\\xc3\\x62\\xcf\\xeb\\x04\\x8a\\x7c\\x66\\x38\\x9f\\x24\\xa1\\x6f\\x88\\x42\\xa9\\xa2\\x25\\xe5\\xb5\\x23\\xce\\x0b\\x32\\x9f\\x32\\x10\\x5c\\x6f\\x12\\x5c\\x28\\x3e\\xa1\\x9c\\xf8\\x7c\\x52\\xf4\\xcc\\x83\\xcb\\xd8\\x5a\\x48\\xda\\x00\\x88\\x44\\x4d\\xef\\xb0\\x5c\\x71\\x56\\x59\\xeb\\xfb\\x8b\\xb3\\x19\\x8e\\xed\\xbe\\x87\\x44\\xc6\\xf1\\x86\\x18\\x15\\xfb\\x07\\xd3\\xed\\x14\\x55\\x5d\\x39\\xe9\\x5d\\xc0\\x32\\x23\\x7d\\x1e\\x48\\x25\\x12\\xa1\\xad\\xcc\\x01\\x68\\x91\\xb8\\xe0\\x65\\x30\\x4d\\x82\\xec\\xed\\x65\\xcc\\xd6\\xfc\\x75\\x63\\x83\\x34\\xb2\\xb1\\x29\\x22\\x7d\\x90\\x9f\\x20\\xc2\\xf1\\xf2\\xe4\\x41\\x9d\\x31\\xd3\\x06\\x7c\\xa9\\x4f\\xd3\\xc0\\xff\\xce\\x16\\x73\\x72\\xce\\x89\\xa3\\xbc\\x15\\x90\\x03\\x25\\x93\\xb6\\x82\\xf4\\x6c\\x41\\xa6\\xca\\x85\\x46\\x64\\xcf\\xcf\\x8e\\xbc\\x30\\x5d\\x44\\x0d\\x4b\\x37\\x32\\x54\\xec\\xf0\\x11\\xbd\\x7d\\xe4\\xd4\\x46\\x79\\x98\\xb5\\x31\\x19\\x2f\\x8a\\xa8\\xe0\\x16\\x59\\x10\\xbf\\xce\\x1d\\xe3\\x14\\xc7\\x23\\xd2\\x2d\\x4c\\xda\\xdc\\xc2\\xb7\\x2a\\x88\\x64\\x87\\x5d\\x47\\x37\\x3e\\x82\\x09\\x72\\x64\\xfc\\x77\\xec\\x75\\x2f\\x80\\x0b\\x64\\xf2\\x5e\\x46\\x6f\\x67\\x17\\x31\\x45\\x2a\\x50\\x0e\\xe5\\x5e\\xd6\\x4c\\x68\\xfb\\x9c\\x10\\x60\\xbb\\xa2\\xab\\x7d\\x53\\x58\\xd9\\x90\\x03\\x34\\xa4\\x0f\\x81\\xf6\\x1a\\x9b\\x77\\xfb\\x56\\x51\\x1d\\x71\\x6b\\x05\\x96\\x57\\x17\\x0d\\xd8\\x16\\xc6\\x2f\\xfe\\x97\\x64\\xf0\\xb4\\xb6\\xf7\\x96\\x53\\x85\\x02\\x58\\x4f\\x91\\x1d\\xd5\\x56\\x53\\xe4\\x04\\x96\\x18\\x04\\x7f\\xa6\\x32\\x09\\x1f\\x82\\xe7\\x35\\x6f\\x85\\xe2\\x6d\\xa1\\x07\\xdd\\x54\\x84\\xde\\xb2\\x7d\\x83\\x25\\xfa\\x86\\x85\\x01\\xae\\xc6\\x61\\x88\\xb2\\x64\\x86\\xd1\\x34\\x39\\x8b\\x46\\xe8\\x72\\x82\\x63\\x74\\x9d\\x2c\\x52\\xe1\\x8e\\x1c\\x90\\xf3\\x25\\xed\\xe7\\x0b\\x66\\xff\\x5b\\xa3\\x80\\x54\\x0e\\x18\\xe7\\x29\\xd0\\x20\\xca\\x3f\\x5b\\x2d\\x2b\\x9a\\xf9\\xe7\\xd6\\xc4\\x9f\\x3a\\xd0\\xaf\\x40\\x6d\\x07\\xc9\\x9c\\x88\\xf0\\xf3\\x42\\x9a\\x67\\x52\\xfc\\xda\\x8f\\x0e\\x52\\x17\\x70\\xb9\\xa0\\x9c\\x1f\\x66\\x70\\x11\\xf6\\x05\\xe9\\x8e\\x71\\x34\\x2a\\x7b\\x2d\\x21\\x7f\\xdf\\x16\\x19\\x00\\x40\\x8a\\x89\\x9f\\xc0\\x9b\\x8b\\x5b\\x8a\\x2c\\x3f\\xdc\\x46\\xe7\\x97\\x60\\x06\\x16\\xae\\xfe\\x4d\\x20\\x26\\x07\\x16\\x35\\xca\\x92\\xa0\\xdc\\xf6\\xa6\\xaf\\xd0\\x46\\xa8\\xeb\\x58\\xae\\x79\\x82\\x06\\x12\\x54\\xea\\x2b\\x0f\\xb9\\x6d\\x55\\xb1\\xed\\x05\\xba\\x4c\\xe2\\x8d\\x9c\\x9e\\x62\\x79\\xdc\\x23\\x29\\x1f\\xcf\\x34\\x49\\xe6\\x28\\x18\\x26\\x17\\x76\\x11\\xca\\x8e\\xa9\\x0d\\xde\\xf0\\x86\\x17\\x9e\\x60\\x73\\x13\\xb0\\xc8\\xe8\\x11\\x4f\\x5d\\xe2\\xaa\\xf1\\xcd\\x0a\\xec\\x42\\xa8\\x1e\\x00\\x57\\x60\\x25\\xbd\\x3a\\xa7\\xd0\\x09\\x4d\\xa3\\x69\\x12\\x9b\\x2e\\x73\\xdd\\x2d\\xae\\x67\\x23\\x02\\x18\\xd0\\xa0\\x90\\x1e\\xe0\\xc1\\xd2\\xf2\\x0e\\xa9\\x5c\\x47\\xdc\\x61\\x68\\x11\\x27\\xac\\xe2\\x20\\xc0\\xf7\\x41\\x97\\xa7\\x46\\x1d\\x55\\x61\\x0d\\xa3\\xcb\\x18\\x05\\x10\\x74\\xac\\x94\\x5e\\x67\\x89\\x28\\xe7\\x95\\x2c\\xc7\\xde\\x0d\\xeb\\x02\\x5d\\x0b\\xb3\\x57\\x35\\x05\\x50\\x16\\x9d\\xc5\\xd1\\x38\\x1a\\x05\\x71\\xce\\xf2\\x34\\x45\\x14\\xab\\xd0\\x3a\\xed\\xd2\\x5f\\xed\\xf7\\xbb\\x14\\x73\\x8d\\xea\\xfe\\xe4\\x27\\xb7\\x16\\x75\\xda\\x0a\\xaa\\x01\\xd5\\x48\\xd9\\x88\\x15\\x5c\\xcb\\x2e\\x09\\xfe\\xd3\\x89\\xb4\\x4e\\x14\\x02\\xed\\x25\\xb3\\x05\\xe7\\x0c\\x60\\x7b\\x47\\xc6\\xfe\\x57\\x33\\x14\\x90\\x83\\xe6\\x29\\x12\\x66\\xc5\\x12\\xdb\\x7d\\x8d\\xef\\xdf\\xd6\\x71\\xfb\\xaa\\xdd\\x6e\\x77\\xda\\xdd\\xf6\\x76\\x13\\xb5\\xaf\\xda\\xbd\\xf6\\x4e\\x7b\\xb7\\xfd\\xe4\\xe4\\x73\\xf4\\xd1\\x44\\xbb\\x2b\\x06\\x5b\\x66\\x29\\x50\\xf8\\x4c\\xdb\\x38\\xd7\\x25\\x8b\\x7a\\x06\\x6c\\x8b\\xff\\xa0\\x7f\\x3f\\x7d\\x82\\xb4\\x84\\x66\\x99\\x77\\x8c\\x1a\\x82\\x98\\xee\\x0d\\xec\\x57\\x53\\xf2\\x07\\xfa\\x92\\x8c\\xde\\xf9\\xd7\\x15\\x9d\\xd8\\xca\\xcd\\x52\\x6a\\x9d\\xe2\\xf8\\x2c\\x9f\\x50\\x83\\x7a\\x63\\xf3\\x7a\\xce\\xbb\\x6a\\x70\\xe9\\x82\\x09\\xac\\x23\\xa4\\xf4\\x8b\\x78\\x94\\x84\\x64\\x01\\x63\\xfa\\xa5\\xbc\\x7e\\xe1\\xb1\\x3d\\x81\\x97\\xa0\\x47\\x1c\\x8f\\x5a\\xaf\\xf0\\x55\\x5d\\x48\\x5c\\x91\\xa6\\x57\\xe0\\x7a\\x6b\\x8a\\xf7\\x5c\\xac\\xbe\\x7a\\xc1\\x9e\\x35\\x81\\x34\\x6b\\x44\\x7a\\xd6\\xd4\\x56\\x50\\xfd\\x6b\\x3e\\x36\\x3a\\xcf\\xd4\\x08\\xf0\\xcc\\x26\\xde\\x27\\xbc\\x33\\xa7\\x91\\x4f\\x9f\\xd0\\x2b\\x7c\\xe5\\x1b\\xd1\\x79\\x29\\x82\\x1f\\x05\\x39\\x8e\\x99\\x98\\xa9\\x52\\xbc\\x7b\\xd3\\x46\\x3e\\x84\\x2f\\xd9\\xb9\\x15\\xd3\\xfb\\x81\\x6d\\x47\\xd2\\xfa\\x9a\\xcf\\x71\\x5c\\xdf\\x64\\x51\\x6b\\x4d\\xb7\\x1a\\xdc\\xcb\\xd3\\xb2\\x18\\x5f\\x87\\x47\\xa0\\x15\\x4f\\xcc\\x4e\\x6e\\x06\\x6f\\x0a\\xa8\\x5f\\xde\\x15\\x68\\xda\\xcd\\x75\\x04\\x0a\\x26\\x93\\xfb\\x7b\\x65\\xf3\\xb0\\x87\\x48\\xca\\x27\\x81\\x08\\xb3\\x59\\xac\\x19\\xaf\\x8a\\x51\\x76\\x54\\x70\\x76\\x85\\xd3\\xbb\\xbb\\x3c\\x52\\xf7\\x04\\xda\\x6b\\x51\\xdd\\x86\\x8b\\x83\\x69\\x30\\x9b\\x23\\x7c\\x05\\xc9\\x9c\\x86\\x91\\x05\\x27\\xd4\\xc6\\x8d\\x14\\xb7\\x9a\\x12\\x50\\xdb\\xb6\\x91\\x23\\xd4\\xb1\\x32\\xde\\xbf\\xb9\\x33\\xfb\\x42\\xab\\xe4\\x84\\x17\\x63\\x90\\xd8\\x50\\x90\\xa3\\x00\\xe5\\xd1\\xcc\\x7e\\x04\\xd6\\x65\\x16\\x96\\x11\\xe6\\x95\\x5c\\x1e\\x49\\x98\\x26\\xb5\\xd0\\x80\\xc0\\xcf\\x26\\xfa\\x38\\xe2\\xb9\\x50\\xc9\\x9f\\x46\\xb7\\x87\\x1e\\xa3\\x46\\x44\\x87\\xf4\\x10\\xed\\x6d\\x6e\\x8a\\x1c\\xa9\\xae\\x2e\\x04\\xbd\\x1d\\xab\\xd8\\x79\\x84\\x22\\x91\\x6f\\xf5\\xd3\\xa0\\x80\\xe2\\x87\\x1f\\x78\\x77\\x9a\\xf2\\xa2\\xff\\xa5\\x0f\\xe5\\x3e\\x02\\x89\\x3c\\x2b\\x94\\x9d\\xac\\x6b\\x56\\xbc\\xd2\\x3d\\xfb\\x62\\x6d\\x80\\xaa\\xd3\\xb5\\x34\\x5e\\xec\\xeb\\x43\\x48\\x67\\x8f\\x06\\xea\\x90\\xec\\x0b\\x66\\x12\\x44\\x71\\x30\\xb4\\x28\\x08\\xa4\\xb3\\xf7\\xda\\xb6\\x36\\x1a\\xc5\\x96\\x9c\\x7d\\x94\\xf3\\x50\\x54\\xb1\\xe6\\x12\\x55\\x6e\\x73\\x43\\x28\\x58\\x8b\\xbe\\xb4\\x61\\x13\\x20\\x95\\x96\\xc8\\x64\\x68\\x67\\xfd\\xd5\\x33\\x83\\x23\\x22\\xbc\\x91\\x73\\x3b\\x59\\xaf\\xfd\\xdc\\x72\\x2c\\x5a\\xe6\\x09\\x97\\x07\\xc0\\x4d\\xe8\\x07\\x58\\xc0\\x76\\x97\\xb0\\x80\\x4c\\xe1\\xa5\\xf6\\x85\\xaf\\x1c\\x1b\\x06\\xe8\\x4d\\x90\\x4f\\x5a\\x23\\x1c\\x4d\\x8b\\x46\\xb6\\x8c\\x1e\\xbd\\xcb\\x48\\x50\\x7a\\x1d\\xdd\\x0a\\xe2\\x87\\xc1\\x3f\\xc0\\xa6\\xa2\\xbb\\x35\\xe7\\x35\\xa6\\x92\\x93\\xc9\\xd8\\xa6\\x93\\x33\\x92\\x71\\x0d\\x5d\\x9c\\xdc\\x2f\\xe8\\x77\\xe8\\xc0\\xe5\\xc4\\xbc\\xa6\\xaa\\xb4\\x64\\x95\\xbc\\x99\\x6b\\x77\\xdb\\xc7\\x69\\x87\\x34\\x71\\x0b\\xc4\\x21\\xc9\\xba\\xe3\\x68\\x3a\\xe5\\xf9\\xf6\\x98\\xef\\x3f\\x68\\x69\\x96\\x95\\xaf\\xb9\\x62\\x28\\xd6\\x69\\xe3\\xe4\\x0e\\x7c\\x82\\x6b\\xd4\\xa5\\x4a\\xd6\\xfe\\x0a\\xe4\\xfe\\x25\\xbc\\x57\\x3c\\x94\\x3c\\x2c\\x6e\\x42\\xa7\\xae\\x2e\\x87\\xd6\\x93\\x89\\x3d\\x76\\x2a\\x71\\x64\\xa6\\x6c\\x55\\xd9\\x90\\x82\\xa9\\x6a\\xf8\\x38\\x3b\\xbd\\xf4\\xca\\xc7\\x7c\\x7a\\x89\\x06\\xe4\\x5f\\xbb\\x64\\x40\\x8b\\xfe\\x9b\\x08\\x2e\\x57\\xdb\\x41\\x88\\x77\\xf7\\x86\\x96\\x3c\\xc4\\xa2\\x46\\x90\\x9d\\x23\\x99\\x75\\xfb\\x5d\\xec\\xd7\\xb3\\x3f\\xa2\\x60\\x35\\xda\\x57\\x4f\\xdb\\xbb\\x4f\\xd1\\x43\\x32\\xf2\\x7f\\x83\\xf4\\xf9\\xf2\\xe5\\xcb\\x97\\x9b\\xe8\\x11\\x7d\\xf0\\xe3\\x8f\\xa8\\x7d\\xd5\\x69\\x83\\x60\\x4a\\xc0\\x72\\x0b\\xa6\\x14\\x33\\x8d\\xf6\\x55\\x6f\\x77\\xa7\\x4d\\xdb\\xbd\\x2c\\xb7\\x7b\\xb9\\x44\\xbb\\x30\\x57\\x38\\x5b\\x40\\x3c\\x8e\\x06\\x00\\xf7\\xc3\\x0f\\xb4\\x11\\xf4\\x08\\xc1\\xb4\\xf9\\x36\\xc5\\x9a\\xd9\\x1a\\x40\\x75\\xf6\\xf1\\xae\\xf6\\x68\\x80\\xda\\xad\\x1d\\x9f\\xe2\\x30\\x2b\\xac\\xd6\\x43\\x6a\\xb1\\xce\\xd7\\xc1\\x26\\xfa\\x11\\xb5\\x76\\xd0\\x3f\\x50\\x07\\xf5\\xd1\\xe3\\xce\\xf2\\x82\\xb7\\x8d\\x07\\xab\\x92\\x73\\x13\\xa5\\xa3\\x60\\x34\\xc1\\x54\\x82\\x8e\\x6b\\xc9\\xce\\xa4\\x91\\x53\\xb2\\x52\\xd2\\x46\\x83\\xb6\\x82\\x3e\\x7d\\x42\\xca\\x80\\x88\\x1c\\x21\\xa1\\xd3\\x69\\x8c\\x42\\x5b\\x19\\xa0\\xd3\\xb4\\x41\\xab\\xc2\\xfa\\x78\\x32\\x7c\\x62\\x47\\x05\\xdd\\x80\\xe6\\x8b\\x6c\\xd2\\x68\\x88\\xaa\\x45\\xaf\\xe8\\x13\\x6a\\xaf\\x94\\x9d\\x37\\xc6\\x97\\x52\\x50\\x13\\xb0\\xa7\\x62\\xea\\x63\\xc6\\x77\\x6e\\x23\\xfb\\x17\\xd3\\x65\\x2e\\x67\\x53\\x8e\\xe3\\x11\\xd8\\x94\\xd3\\xbf\\x75\\x6c\\xca\\x5f\\xe1\\xab\\xaa\\x9a\\xd4\\xbf\\x6b\\x52\\x7d\\x40\\x01\\x68\\xd1\\xef\\xab\\xa4\\xf7\\x2a\\x6b\\x87\\x27\\xf8\\x6a\\x45\\x0d\\xb1\\x87\\xa2\\x6c\\x2d\\x49\\xbb\\x56\\x80\\xf4\\x4b\\x6c\\xd6\\x13\\x7c\\x55\\xcd\\xd0\\xc5\\xe6\\x50\\x52\\x8c\\x16\\xea\\xb1\\x35\\xe4\\xe5\\x5a\\xaf\\xae\\xed\\x72\\x19\\x9d\\x59\\xb6\\x82\\xd6\\x8b\\x52\\xa9\\xb5\\xf9\\x09\\xbe\\x3a\\x98\\x04\\x29\\x17\\x39\\x4c\\x45\\x75\\xca\\x8c\\xac\\x8e\\x7a\\x89\\xd4\\x1d\\x46\\x54\\xad\\x74\\xb9\\x3e\\x95\\x12\\x07\\x9f\\x71\\x56\\xe8\\x81\\xb4\\xd7\\xdb\\x2c\\x74\\xf8\\x9d\\xdd\\x4d\\xc7\\x3e\\xa5\\x6b\\x85\\xf4\\xde\\x1e\\x7b\\x37\\xe3\\xe6\\xd0\\xa2\\x93\\x8f\\x49\\x14\\x37\\x36\\x4c\\xf1\\x3a\\x56\\xca\\xed\\x25\\xad\\x69\\xca\\x8d\\x56\\x57\\xdb\\x73\\x8e\\x41\\x97\\xdf\\xaa\\x8c\\xc3\\x70\\x7c\\xf8\\x2b\\x9c\\x1b\\x38\\x2b\\xa2\\x9e\\xca\\x82\\x5b\\xad\\x9a\\x93\\x8b\\x36\\xe4\\xc9\\x7f\\x5c\\x4b\\xfd\\x28\\x4f\\x5f\\x73\\x8d\\x08\\xfd\\xc9\\x34\\x24\\xab\\x33\\x12\\xf9\\xe0\\x62\\x2a\\xa7\\xe3\\x22\\x32\\x54\\x4c\\xac\\xeb\\xba\\x98\\x89\\xcc\\x40\\xb6\\x41\\x5f\\x0c\\x68\\x3b\\x8c\\x73\\x86\\xae\\x56\\xb6\\x18\\x66\\x79\\xda\\x88\\x9a\\xa8\\xbb\\xd9\\x44\\x9d\\xdd\\x4d\\x49\\x91\\x4c\\x98\\xcc\\xde\\xa6\\x23\\xa0\\xdb\\x2a\\x12\\x97\\x82\\xe8\\x2d\\x64\\xba\\xf2\\x59\\x29\\x06\\xdb\\xeb\\x20\\x8f\\xe2\\xce\\x2a\\x62\\x10\\x6b\\x81\\x4b\\x42\\xe2\\xe7\\x3a\\x85\\x21\\xd6\\xe8\\xb7\\x21\\x0f\\xad\\x06\\xec\\x97\\xe0\\x43\\x53\\x80\\x58\\x2f\\x15\\xd1\\xd1\\xdc\\x09\\x46\\x3a\\xa8\\x7c\\xf8\\x19\\xc5\\xed\\xb7\\x2c\\x1b\\x49\\x23\\xa0\\x82\\x0d\\x25\\x94\\xd6\\x38\\x4d\\x66\\xe4\\xe9\\x41\\x12\\x62\\x90\\x75\\x56\\x93\\x6b\\xe4\\x6e\\x6e\\x53\\xb4\\x51\\x96\\xe7\\xba\\xa5\\x1b\\xb1\\x92\\xd6\\xc0\\x09\\xfe\\xe2\\x32\\x0e\\x63\\x2c\\x54\\xcc\\x91\\x39\\xd0\\xaa\\x92\\x8e\\x68\\x6b\\x1d\\xc2\\x8e\\x68\\x4c\\xc8\\x3b\\xe2\\xc9\\x17\\x17\\x79\\x4a\\xb0\\x79\\xf1\\x88\\x12\\x5f\\xf8\\x34\\x90\\xf0\\xd5\\x1a\\xb1\\xd5\\xbc\\x9f\\x37\\x22\\xce\\x1b\\xca\\x12\\x8f\\xf3\\xc2\\x6c\\x15\\x89\\xa7\\x34\\xa2\\xdb\\x10\\x78\\x7e\\xfd\\xf0\\xf2\\xf1\\xde\\x2a\\xf2\\xce\\xaf\\xf9\\x78\\x4f\\x48\\x3b\\xec\\xc7\\x3a\\x65\\x1d\\x0a\\xe0\\xb7\\x21\\xea\\xac\\x04\\xeb\\x97\\xe0\\x46\\x8b\\x7c\\xbc\\xa7\\x97\\x73\\xc8\\x4c\\x7e\\x51\\x29\\x27\\x4f\\xaf\\xfd\\x5c\\x0a\\x42\\x3c\\x4a\\x42\\xfc\\xeb\\xfb\\xc3\\x03\\x1e\\x50\\xa6\\x81\\xb3\\x51\\x30\\xc7\\x0d\\x8b\\xac\\x66\\xdd\\x9b\\xd1\\x28\\xc8\\x47\\x13\\xd4\\xc0\\x6e\\x53\\xdd\\x34\\xb9\\x84\\xf5\\xfb\\x22\\x4d\\x93\\xb4\\xb1\\xf1\\x26\\x98\\x8e\\x93\\x74\\x86\\x43\\x46\\x0a\\x61\\x90\\x07\\xc6\\x08\\xa2\\xb7\\x62\\x5a\\xab\\x2e\\x98\\x75\\xef\\xe7\\x8c\\x5e\\x56\\x27\\xf6\\xbf\\xf8\\x66\\x0e\\xab\\x87\\x6e\\xe5\\xc5\\x12\\x5b\\x75\\x23\\x67\\x2d\\x79\\x18\\xb8\\x2a\\xb2\\xc4\\x22\\x66\\xcb\\x81\\x5a\\xbd\\x2a\\x0b\\x85\\x37\\x69\\x5a\\x0e\\xab\\xc5\\x33\\x1f\\x66\\x34\\xd9\\xf6\\x70\\x31\\x1e\\xe3\\x14\\x87\\x34\\x87\\x9f\\x1c\\xe5\\x12\\xcf\\xe6\\x53\\xfd\\x75\\xb9\\xb6\\x45\\xc9\\xd7\\xf2\\xba\\x48\\x08\\x88\\x66\\x8b\\x2c\\x47\\x43\\x8c\\x22\\x32\\x95\\x33\\x1c\\xe7\\x38\\x44\\x51\\x0c\\x36\\x23\\xf1\\x28\\xc5\\xb9\\x88\\x56\\xb0\\x84\\x53\\x0f\\xbf\\xfe\\x3f\\x9d\\x45\\xf1\\x33\\x18\\x87\\x48\\xb2\\x51\\x98\\x01\\x00\\x28\\x19\\x0d\\x5b\\x93\\x4d\\x92\\xc5\\x34\\x24\\xe0\\x9c\\xe3\\x79\\x8e\\x16\\xf1\\x3c\\x4d\\x46\\x18\\x3c\\xf2\\x99\\x9f\\x08\\x45\\x87\\x64\\x78\\xde\\xf6\\xde\\x6c\\x9f\\x31\\x4c\\x3e\\x23\\x1d\\xee\\x0b\\x3c\\x8a\\xc0\\x3d\\xa6\\xd7\\x2b\\x79\\xf2\\xbc\\xc7\\x19\\xe6\\x46\\xfb\\xa5\\x19\\xdc\\xc8\\x80\\xc5\\xb1\\x21\\x41\\xc8\\x81\\x3c\\xe3\\x51\\x39\\x10\\x59\\x92\\x9f\\xd3\\xa6\\x66\\xa8\\x1d\\x7e\\x2b\\x25\\xf0\\xd7\\x35\\xaa\\x81\\x4a\\x35\\x6c\\xc3\\x98\\xbb\\x13\\x02\\x0f\\x5a\\x87\\x1d\\xec\\x29\\xe0\\x6c\\xa0\\x13\\xfc\\x2c\\x7b\\x05\\xad\\x1a\\x3f\\x0f\\xf2\\x80\\x1f\\xd0\\x0d\\xb7\\xd4\\x4b\\xec\\x1f\\xfb\\x61\\x98\\x01\\x3c\\x00\\x1a\\xb7\\x4e\\xaf\\xce\\x36\\xa3\\xdd\\x55\\xe5\\x30\\x11\\xab\\x16\\xba\\x23\\x8b\\x89\\xf7\\xcb\\xec\\xd4\\x11\\x65\\x99\\xcc\\x93\\x9f\\x6e\\x6e\\x34\\xa6\\x45\\x20\\x39\\xad\\x51\\xaf\\x56\\xd8\\x88\\xbe\\x3c\\x99\\x9d\\x52\\xd0\\x1b\\x1b\\xd6\\x4d\\xdf\\xab\\x89\\x65\\xa5\\x2d\\x56\\x5f\\x26\\x5b\\x02\\x8c\\x83\\x74\\xab\\xd1\\x44\\x05\\x86\\x9b\\x72\\x22\\x3a\\x09\\xf1\\x2c\\x09\\x9d\\xb1\\x55\\x39\\x26\\x22\\xd0\\xba\\x7f\\x42\\x2f\\xb6\\x36\\xa4\\x1d\\x14\\x86\\xb0\\x6c\\x72\\x95\\x7d\\xc0\\x88\\xc7\\x7a\\xe4\\x2e\\x05\\x8e\\xde\\x2a\\xab\\xf0\\xd1\\x00\\x40\\x76\\x18\\xdc\\x2f\\xb1\\x24\\xdf\\xb1\\x7d\\x23\\x43\\xc1\\x45\\x10\\x4d\\x21\\x45\\x07\\x65\\xb6\\xb0\\xdb\\xd4\\x25\\xf8\\x0f\\x52\\x08\\x8d\\x28\\xbe\\x48\\xce\\x71\\x86\\x4e\\xc3\\x84\\xf5\\x02\\x84\\xd8\\x48\\xc6\\xe3\\x0c\\xe7\\x9b\\x4d\\x74\\x39\\x89\\x46\\x13\\xed\\xbe\\x3a\\xbc\\xf6\\xdb\\x57\\xad\\xb0\\x70\\x7e\\x30\\x4c\\x92\\x29\\x0e\\xe2\\x1b\\x14\\x26\\x2f\\xa7\\x8b\\x6c\\x82\\x7e\\x9f\\xe0\\x9c\\x06\\xc2\\x9e\\xf2\\x4d\\x35\\x88\\x21\\x96\\x38\\x30\\x57\\xf6\\xa8\\xd8\\x62\\xc5\\xde\\xba\\xb6\\x30\\xd1\\x62\\xb3\\x86\\x49\\xfd\\xbc\\xe2\\xa4\\xe8\\xfc\\x39\\x5d\\x03\\x26\\x2e\\xc1\\xca\\x79\\xf8\\x60\\xd5\\x6d\\xf1\\xde\\xbd\\x8d\\x31\\x99\\x88\\xba\\xe9\\x9b\\x78\\x03\\x0a\\xe7\\xa1\\x73\\xba\\x16\\x4d\\x36\\x63\\x0a\\xc5\\x6a\\xb5\\xeb\\xb0\\x49\\x09\\xee\\x49\\x03\\xf3\\xe8\\xa1\\xf7\\x26\\xe5\\x24\\x57\\x18\\x8f\\x35\\xcd\\x6b\\x16\\x82\\x28\\x83\\x50\\x3c\\xf0\\xac\\xc7\\xfb\\x2c\\x1a\\x72\\x26\\x38\\x3a\\x48\\x16\\x71\\xce\\xd7\\x83\\x9d\\x17\\x93\\xae\\x62\\x98\\xf0\\xec\\x3d\\x64\\x0e\\x1d\\xa8\\x63\\xdd\\x2a\\x01\\x62\\x06\\x9a\\x70\\x75\\x8f\\x59\\x65\\x20\\xbe\\x4f\\x16\\x71\\x88\\x16\\x73\\x1a\\x88\\x6a\\x34\\x5d\\x84\\xb8\\xb4\\x90\\xad\\x2d\\x94\\x40\\x2e\\x0c\\xcd\\xe5\\x17\\xab\\x66\\x76\\x14\\x60\\x86\\xc9\\x65\\x2c\\x03\\x9a\\xc4\\xd3\\x6b\\x34\\x5e\\x08\\x36\\x64\\x4f\\x31\\xbe\\xb5\\x85\\xa6\\x38\\xa3\\x31\\xbc\\xf4\\xa7\\x02\\x60\\xa5\\x29\\x9e\\x05\\x51\\xac\\x1e\\x03\\x6a\\xe3\\x60\\x16\\x5c\\x35\\x14\\x1c\\x80\\x8d\\x1b\\x7a\\xcc\\x16\\x87\\x72\\x4c\\x69\\x2e\\x6b\\xfd\\x26\\x28\\x8c\\xea\\x62\\x3d\\x08\\x0c\\x96\\x1b\\x07\\x54\\x01\\xef\\x21\\x92\\xd6\\x83\\x07\\x4d\\x03\\x51\\xfa\\x90\\x34\\x29\\xa8\\xa2\\x26\\x8a\\x1b\\x32\\x20\\x0f\\x51\\xaf\\xa9\\xd0\\xba\\xc3\\xf5\\x8c\\xed\\x85\\x2e\\xea\\x24\\xcb\\x40\\xea\\xc6\\x3b\\x74\\x0d\\xdd\\x5d\\xa9\\xbe\\x9a\\x7d\\xff\\x41\\x46\\x9c\\x78\\xfa\\x48\\x62\\x05\\x3e\\xb6\\xbb\\x04\\x74\\x9c\\x8e\\x93\\x74\\x26\\x76\\xe6\\xc7\\xc5\\x21\\x1b\\x62\\x64\\x39\\xdb\\x60\\xac\\x55\\x95\\x07\\x04\\x1f\\x6d\\x32\\xd0\\x56\\x8e\\xdf\\x48\\xdd\\x86\\xa4\\x6d\\x16\\x08\\xcc\\x5a\\x4b\\xd9\\xc7\\x64\\xae\\xfe\\x3b\\x75\\x3e\\x98\\x53\\xef\\x83\\xa6\\x8c\\x4a\\x07\\x9c\\x0a\\x73\\x47\\x8f\\x07\\x32\\x31\\x2d\\xbb\\x5e\\x78\\xca\\x39\\xcf\\x91\\x99\\x75\\xff\\xea\\x58\\x9b\\x32\\x6c\\xb7\\xee\\x57\\xb3\\x64\\xe6\\xa7\\xba\\x31\\x6f\\x6e\\xdb\\xa1\\xc6\\x20\\xe6\\x7c\\x03\\xde\\x35\\xa7\\x15\\x49\\xa7\\x80\\xda\\x45\\x4b\\x4b\\x38\\xd7\\xa8\\xdb\\x85\\x4e\\x13\\x55\\xc7\\x6e\\x59\\x28\\xfc\\x26\\x41\\x46\\xa4\\xf8\\xba\\xea\\x3d\\x8d\\xda\\xad\\x10\\x89\\x54\\x8d\\x9b\\x1c\\xdb\\x85\\x92\\x2e\\xeb\\x93\\x26\\x8e\\xc1\\x19\\x4a\\x62\\x49\\xc3\\xd6\\xd9\\x45\\x8d\\x9d\\x4e\\x17\\xfc\\x13\\xab\\xe1\\xef\\x8d\\x16\\xcd\\xb4\\x49\\xae\\x5d\\x13\\x3f\\xf5\\x6a\\xb6\\xcf\\x93\\xbc\\xd0\\x92\\x1c\\x50\\x56\\xf2\\x2d\\x91\\xcb\\xcf\\x16\\xb0\\x87\\x22\\x77\\xd9\\x63\\xde\\xca\\xd9\\x80\\x48\\xf7\\x88\\x66\\x31\\x5d\\x2e\\x29\\xd0\\x8a\\x26\\xd2\\x82\\x0e\\x94\\x9c\\x35\\x47\\xaf\\xf6\\xbb\\x3b\\xbb\\xce\\xf8\\x3a\\x7e\\x41\\x69\\xd6\\x9d\\x5a\\x86\\x27\\x95\\x59\\x2a\\xbf\\xcc\\x11\\x16\\xa1\\x95\\xbd\\x14\\x9a\\x56\\x0d\\xeb\\x52\\xce\\xc5\\x85\\xc6\\x99\\xf3\\x92\\x2f\\xab\\x5a\\x66\\x0b\\xe0\\xb3\\xa8\\x92\\x61\\xf4\\xb2\\x5e\\xdd\\x58\\xd8\\xc0\\x88\\xa0\\x43\\x65\\xd3\\xb1\\x4a\\xbd\\x65\\xd1\\x91\\x61\\xdc\\x2e\\x37\\x72\\x79\\xf1\\xfd\\x9a\\xa7\\xfe\\xd7\\x79\\x08\\xec\\x5b\\x9e\\x7b\\xf0\\xe5\\x14\\x19\\x46\\xd7\\xa7\\x7c\\x66\\x0d\\xd2\\x2e\\xcb\\xb9\\x40\\x57\\x0c\\x98\\x42\\x37\\x0b\\x16\\x2d\\x65\\x49\\xf6\\xb9\\x32\\xb9\\x2e\\x60\\x64\\x8d\\x0d\\x36\\x2c\\x87\\x52\\x5a\\xad\\xb4\\xac\\x0e\\x9a\\x56\\x97\\xc9\\x5d\\x41\\xb3\\x9b\\xc9\\xb9\\xd5\\xb5\\x4c\\x4b\\xae\\xb6\\x6b\\x27\\x72\\x36\\xc7\\xe4\\xdc\\x4d\\x86\\xe9\\xe8\\x40\\x52\\xb0\\x59\\x0f\\xac\\x5f\\x24\\xf2\\xc2\\xcb\\x28\\x66\\xbb\\x34\\x1f\\x8d\\xcf\\xd6\\x88\\x7e\\x49\\x60\\xfc\\x41\\x0e\\xd5\\xc6\\xac\\x91\\x22\\xd1\\x1e\\x8a\\x32\\x84\\xc7\\x63\\x3c\\xca\\xa3\\x0b\\x3c\\xbd\\x46\\x01\\x0a\\x71\\x96\\xa7\\x0b\\xf8\\xdd\\x84\\x03\\xf9\\xe3\\x24\\x1e\\xe1\\x15\\x52\\xf3\\x79\\x2e\\x44\\x39\\x9c\\x1f\\x05\\xb4\\x48\\x2e\\x0c\\x25\\xd6\\xa5\\xec\\x25\\xb8\\xfb\\x02\\xa2\\x04\\x1a\\xf0\\xa5\\xc6\\x67\\xc1\\x43\\x93\\x6b\\xa8\\xe8\\xb9\\xb4\\x2d\\x2d\\x2c\\xbb\\xce\\x79\\x03\\xcb\\xae\\xf4\\x97\\x9a\\x89\\xb5\\xaa\\x5c\\xbc\\x1b\\x47\\x2e\\x46\\x61\\xaa\\x64\\x3f\\xe0\\x2f\\xb7\\x4f\\x4a\\x98\\xe7\\x5b\\xe6\\x4b\\x69\\xd6\\x5d\\x9c\\x83\\x54\\xad\\xc7\\x39\\xc4\\x89\\xa9\\x8f\\x76\\x3a\\xdd\\xad\\xed\\xee\\x2a\\xca\\x81\\x8c\\x69\\xe7\\x95\\xa4\\xe7\\x01\\xa3\\xa1\\x0d\\x91\\xc4\\x20\\x8a\\x73\\x9c\\x8e\\xf5\\x8e\\xaa\\xc8\\x87\\x25\\xf0\\xdd\\x92\\xa1\\x94\\x2f\\x4e\\x2a\\xf7\\xb1\\x04\\x5b\\x01\\x9a\\xe0\\xe9\\x1c\\xa7\\xe4\\x58\\xb0\\x34\\x07\\x78\\xc9\\xc6\\xc1\\xa2\\xf3\\x95\\x87\\xf7\\x4d\\x58\\x1d\\xd1\\x73\\x47\\x39\\xb6\\x02\\x45\\x61\\xeb\\x94\\x62\\xeb\\x15\\xa0\\xaa\\xa1\\x3b\\xb0\\xd4\\xbd\\xda\\x91\\x1b\\x54\\x3c\\xa8\\xa0\\x43\\x0f\\x6b\\xa4\\x0a\\x7f\\x70\\x26\\xd2\\x44\\xaa\\x82\\x8c\\xb1\\x2c\\xd0\\x8e\\x91\\x9a\\x05\\xf3\\x62\\x0d\\xda\\xd6\\xf4\\x2d\\xa8\\xcc\\xb4\\xab\\x82\\xec\\xaa\\xaf\\xde\\xec\\x1f\\x7c\\xae\\x55\\x41\\x0e\\xc8\\x3c\\xf4\\x2f\\xe9\\x97\\xad\\x8e\\xef\\x7a\\x65\\xbc\\x9a\\x05\\x23\\xaf\\xd5\\x31\\x0b\\x46\\xeb\\x5f\\x21\\xa2\\xd1\\x75\\xad\\x92\\x73\\xec\\xbc\\x5c\\x90\\x56\\xc9\\xc1\\x29\\x0c\\x81\\xd0\\x02\\x5d\\x2a\\xb4\\x6b\\xda\\xcc\\x3a\\x96\\xcc\\x6a\\xba\\x41\\x71\\x1f\\xb1\\x54\\x54\\x03\\x32\\x34\\x08\\x6b\\xc0\\xbe\\x68\\xe3\\x1a\\x30\\x64\\x1c\\x94\\x93\\x96\\xbe\\x09\\xf2\\x89\\x9a\\xb8\\x54\\x2e\\xcd\\x08\\xe0\\xef\\xfa\\xb4\\xa6\\x37\\x27\\xcd\\x9d\\x9d\\xbf\\x48\\x2e\\x53\\x06\\x7b\\x83\\xa7\\x6a\\x2d\\x5b\\x7d\\x7e\\x89\\xe4\\xa6\\x1c\\x96\\xdb\\x4f\\x72\\x2a\\xb0\\x20\\x27\\x3b\\xad\\x91\\xe1\\x54\\x54\\x29\\x67\\x3a\\x75\\xa4\\xfd\\xb4\\x1a\\x39\\xf0\\x94\\x93\\x05\\x15\\x6a\\x4b\\xc8\\x99\\x22\\xf5\\x45\\x2c\\x91\\xdc\\x4d\\x6d\\x4a\\x91\\x42\\xea\\x25\\x9e\\xdc\\xed\\xad\\xe2\\x30\\xc2\\x5a\\xe0\\x2e\\x23\\xe2\\xe7\\x3a\\x9d\\x46\\x58\\xa3\\xdf\\x86\\xd7\\xc8\\x6a\\xc0\\x7e\\x89\\x7d\\x76\\x08\\x10\\xeb\\x1d\\x47\\xe8\\x68\\xbe\\x5f\\x07\\x59\\x5b\\xd5\\x59\\x30\\x17\\xe7\\xc0\\x59\\x30\\x5f\\x57\\x70\\x5d\\x4d\\x18\\x4c\\x6b\\xc3\\x1e\\x3e\\x78\\x74\\x86\\xd7\\xe0\\xa6\\x8b\\x1e\\x0d\\xd0\\xb6\\x97\\xa7\\xee\\x75\\x8e\\x3b\\x1a\\x57\\x5d\\xfa\\x31\\x39\\xec\\xd2\\x8f\\x8f\\xdb\\x2e\\xef\\xa3\\x5b\\xf4\\xd1\\x88\\xd0\\x23\\xd4\\xd9\\xd4\\x38\\x05\\xf3\\x37\\x35\\x5d\\x83\\x79\\x1f\\xdb\\xa5\\x3e\\xba\\xc6\\x3e\\xba\\xda\\x3e\\x9c\\x9d\\xe4\\x69\\x34\\x9f\\x82\\x2d\\x49\\x83\\xe2\\xed\\x87\\x1f\\x20\\x1a\\xc3\\x27\\xfa\\xbb\\x4b\\x7e\\xef\\x91\\x9f\\x00\\x8d\\xa3\\x41\\x31\\x83\\x1f\\xe9\\x0c\\x36\\x3e\\xa2\\x1f\\x08\\x4c\\x0f\\x1e\\x20\\x80\\xf1\\x23\\x7a\\x88\\xda\\xad\\x27\\x3b\\xd2\\xc4\\x6e\\xfe\\x1d\\x7d\\xf4\\x8b\\x7d\\x2c\\x11\\x12\\xf5\\x96\\x9e\\x05\\x73\\x70\\xac\\xdc\\xcf\\x1b\\x0d\\x3e\\x0c\\xc0\\xca\\x2e\\x7a\\x88\\x1a\\xdb\\xe8\\x31\\xfa\\xb8\\xc9\\x50\\xb1\\x3d\\x76\\x45\\x98\\xb1\\x85\\xda\\xb5\\x2d\\x81\\xfd\\x30\\x44\\xf3\\x20\\x24\\x3b\\x98\\x75\\x19\\xb0\\x32\\x04\\x7c\\x34\\x40\\x12\\xe8\\xbb\\xb6\\x20\\x17\\x90\\x3b\\xa9\\xa8\\xe9\\xf4\\x41\\x9d\\x44\\x53\\x8c\\x1a\\x32\\xa6\\x58\\x7c\\x55\\x8f\\xd8\\xd6\\x48\\x87\\x63\\xb9\\xf3\\x5b\\x40\\x20\\xdb\\xc4\\xe4\\x6e\\x6f\\xd3\\x43\\x5d\\xd9\\x1f\\xd7\\xed\\xd1\\x26\\xb6\\xb2\\x35\\x6c\\xc5\\x7f\\x71\\xa7\\x36\\xb6\\xb3\\x53\\xa3\\x7c\\x59\\x04\\x58\\xd5\\xb1\\x4d\\xb4\\xb5\\x96\\x4d\\x5d\\xb4\\x26\\x5c\\xd4\\xc5\\x13\\xe1\\xa2\\x6e\\xab\\x5f\\xd9\\xa4\\x6d\\x85\\x53\\x7c\\x81\\xd3\\x0c\\xbf\\x91\\xea\\x14\\x8f\\x1c\\xd9\\x61\\xee\\x15\\x25\\xdd\\xc7\\x7c\\x4b\\x37\\x8e\\x0d\\x1a\\x69\\x58\\x3c\\xe1\\xf0\\x84\\x9b\\x31\\x7c\\xf8\\x32\\xf3\\xa2\\xcf\\x63\\xce\\x0b\\x99\\x7f\\xfc\\xc7\\xcd\\x13\\x34\\x40\\x1f\\x6f\\x87\\x5b\\x1f\\x9e\\xc5\\x49\\x8a\\xbf\\x1e\\x86\\x2d\\x75\\x74\\x18\\x87\\x10\\xea\\xb0\\x20\\xb1\\x88\\x3c\\x79\\x3b\\xae\\xc1\\x83\\xa5\\xde\\x69\\x73\\xf7\\x06\\x03\\xf4\\xb8\\xe3\\xcf\\xf9\\x65\\x5a\\x97\\x1b\\xba\\x9d\\xd9\\x70\\x89\\x8f\\x8c\\x0b\\xc2\\x2a\\x7f\\x9d\\x24\\xf3\\x62\\x79\\x37\\xcb\\xf0\\x36\\x25\\x8a\\x32\\x09\\xad\\x66\\xd3\\xb5\\x60\\xde\\x47\\x1b\\xfb\\xcf\\x0e\\x9e\\xbf\\x78\\xf9\\xd3\\xab\\xc3\\x7f\\xfe\\xfc\\xfa\\xcd\\x2f\\x6f\\xdf\\xfd\\xff\\xef\\x8f\\x3e\\xfc\\xfa\\xdb\\xef\\xff\\xfa\\xcf\\xff\\x0a\\x86\\xa3\\x10\\x8f\\xcf\\x26\\xd1\\xc7\\xf3\\xe9\\x2c\\x4e\\xe6\\xff\\x93\\x66\\xf9\\xe2\\xe2\\xf2\\xea\\xfa\\xdf\\xed\\x4e\\x77\\xbb\\xb7\\xb3\\xfb\\x64\\xef\\xe9\\xa3\\xad\\x41\\x35\\xdb\\xa5\\x4e\\xb5\\x24\\x98\\x55\\xed\\x61\\x19\\x66\\xd1\\x27\\xd0\\x45\\x61\\xe6\\x6c\\xf6\\xf5\\xd3\\x89\\xdf\\x25\\x70\\x9c\\x81\\x30\\x08\\x01\\x46\\x3e\\xc2\\x06\\x8b\\xa8\\x93\\x11\\x39\\x5d\\xe2\\x05\\x05\\xf1\\xcb\\x11\\x33\\xd0\\x63\\xd4\\xd9\\x3c\\x81\\x70\\x19\\x85\\xcc\\x6e\\xcc\\xd3\\x52\\xea\\xa1\\xeb\\xd3\\xc3\\xe6\\x09\\x97\\x1c\\xe5\\x63\\x81\\xab\\x0b\\x2a\\x97\\xc7\\x4a\\x64\\xfc\\x4f\\x44\\x90\\x86\\x81\\x7d\\xa2\\xdd\\xcb\\x61\\x3e\\x62\\xef\\xe0\\xf8\\x08\\x6c\\xf6\\x49\\xe9\\x47\\x8f\\x6a\\x3b\\xfd\\x6b\\x9f\\xb2\\xc5\\x54\\xc9\\x8e\\xe6\\x0a\\x42\\x7b\\x53\\x52\\x81\\x3a\\xd5\\x9f\\xd2\\x0e\\x6f\\xd0\\x84\\x72\\x4d\\x5d\\x7f\\xa7\\x77\\x73\\xd2\\xdc\\xd9\\xbd\\x53\\x8a\\xde\\x29\\x45\\xef\\x94\\xa2\\x88\\x07\\xd1\\xe9\\xec\\xa2\\x67\\x2f\\x56\\x0c\\xa4\\xd3\\xd9\\x7d\\xf6\\x42\\x8e\\xa5\\xd3\\xd9\\x55\\x7f\\xc1\\xdb\\x75\\x07\\xd7\\xa1\\x80\\x7f\\x1b\\xaa\\xd2\\x95\\xe1\\xfd\\x42\\x41\\x76\\x3a\\xbb\\xc6\\x28\\x3b\\x9d\\xdd\\xef\\x57\\x57\\xba\\xaa\\x96\\x12\\x30\\xbb\\x26\\x25\\xa5\\x33\\x3a\\x2a\\xf8\\x76\\x24\\x21\\x7e\\x97\\x44\\x71\\x6e\\x8a\\x29\\xd8\\xd9\\x35\\xc4\\x14\\x74\\xa9\\x0e\\x8b\\xa1\\x98\\x83\\x0a\\x8a\\xde\\x57\\x8b\\x2c\\x28\\x75\\x75\\x9b\\x6a\\x9b\\xf2\\x5a\\xbd\\x85\\x58\\x44\\xb0\\xac\\xd6\\xc3\\x18\\xfe\\xe2\\xba\\x1b\\xca\\x68\\x44\\x44\\x22\\xce\\x8f\\xd6\\x10\\x92\\x08\\x9a\\x5a\\x47\\x68\\x41\\xde\\x96\\x38\\xca\\xf2\\x07\\x5f\\x3c\\xb0\\xa0\\x0a\\x59\\xed\\xb8\\x82\\x1d\\x38\\x5f\\x88\\xd1\\xa8\\x51\\x05\\xc9\\x31\\xa3\\x60\\x1a\\x5d\\xc2\\x34\\xcc\\x49\\x71\\xbc\\x96\\xb7\\xe9\\xac\\x50\\xc2\\xaf\\xf9\\xa0\\xb4\\x72\\x3c\\xc1\\xce\\x2e\\x7a\\xbd\\xb4\\x28\\x24\\x89\\x3b\\xaf\\x6f\\x49\\xdc\\x79\\xfd\\x8d\\x89\\x3b\\xcb\\xc3\\xfb\\x25\\xc5\\x1d\\x2d\\x0b\\x7a\\xfd\\xe2\\x4e\\xda\\xd1\\x41\\xf5\\xd5\\x4b\\x3b\\xd9\\x65\\x30\\x7f\\x11\\x87\\x51\\x10\\x37\\xea\\x0a\\x3e\\x0e\\x85\\xc9\\x5f\\x56\\xf2\\x79\\xfd\\x39\\x25\\x9f\\xe5\\x79\\xc4\\xf7\\x20\\xf9\\xbc\\x7e\\x51\\x92\\x7d\\xee\\x04\\x9f\\xf2\\xe7\\xd6\\x04\\x1f\\x89\\x73\\xd4\\x92\\x81\\xbe\\x05\\x21\\x48\\x10\\x84\\x34\\x48\\xd2\\x93\\x09\\x4b\\x3c\\x01\\x3d\\x14\\x62\\x46\\x1a\\x94\\x4d\\xb6\\xdb\\xe4\\x7f\\xb0\\xe0\\xa0\\x2f\\x09\\x02\\xd9\\x5b\\xfa\\x4e\\xcb\\x48\\x97\\xd3\\xf3\\xc2\\x9a\\xf0\\x53\\xf3\\x3e\\x59\\x8b\\x9a\\xb7\\x89\\x16\\x71\\x88\\xc7\\x5f\\xa1\\xb6\\xb7\\x89\\xa4\\x47\\xd9\\x24\\xe8\\x94\\x1e\\x4d\\x66\\xc1\\xe8\\xab\\xd2\\x09\\x37\\x11\\x07\\x14\\xbe\\x01\\x7c\\x77\\x7a\\xe2\\xd5\\xf4\\xc4\\xcf\\x82\\x0c\\x17\\x41\\x54\\x83\\x4c\\x13\\x45\\x63\\x49\\x75\\xb2\\x62\\xb7\\xae\\x2f\\xf4\\xe6\\xf9\\x0e\\xb4\\x07\\xd6\\xfb\\x6f\\x9e\\xef\\xf8\\x9f\\xb5\\xc0\\xb7\\xf8\\x1c\\x5f\\xa3\\x10\\xa7\\xd1\\x05\\xf5\\xe2\\x14\\xe8\\x84\\x68\\x7f\\x41\\x9c\\x83\\x07\\x55\\x12\\x83\\xeb\\x1a\\x38\\x52\\xbf\\xf8\\xed\\xdd\\x29\\x88\\x82\\x1f\\x92\\x9f\\xb1\\xf6\\x50\\x86\\x2e\\x2f\\x2f\\x5b\\xc9\\x1c\\xc7\\x59\\x36\\x6d\\x25\\xe9\\xd9\\x56\\x98\\x8c\\xb2\\xad\\x11\\x60\\x79\\xab\\x54\\x7d\\x92\\xcf\\xa6\\x5e\\xe7\\x3a\\x32\\xd4\\x17\\x17\\xf3\\x9f\\x9f\\xbf\\x2c\\x46\\x2b\\x7e\\xaf\\x14\\x9f\\xb6\\x56\\xfc\\x0c\\xb3\\x8c\\x55\\x89\\x3d\\x72\\x8e\\xaf\\x45\\xe4\\x11\\x82\\xe5\\x8c\\xfc\\x88\\x62\\x1e\\x74\\x44\\xca\\xf6\\x5b\\x04\\x1a\\xe9\\xa1\\x46\\xa7\\xbb\\x67\\x8a\\x33\\x52\\xe9\\xca\\xe0\\xe1\\x23\\x87\\x48\\x06\\x4f\\x1f\\xa9\\x87\\x37\\xcf\\x77\\x6a\\x8c\\x21\\xca\\x99\\xb3\\x6e\\x39\\x73\\xb1\\xf4\\x22\\x4f\\xd0\\x9c\\xfa\\x36\\xca\\x11\\x53\\x6a\\xc9\\x47\\x95\\xf8\\x23\\x66\\x21\\x81\\x61\\xb5\\x8f\\x3a\\xdd\\x3d\\xf0\\x4e\\x34\\x15\\xa4\\x38\\x81\\x01\\x9b\\x0b\\x15\\xc3\\x30\\x81\\x7c\\xb3\\xe6\\x50\\x28\\x86\\xf5\\xf6\\x65\\x62\\xa3\\x60\\x09\\x94\\xcf\\xec\\xc9\\x7c\\x1e\\x8e\\x2b\\x11\\x51\\xe8\\x7a\\x76\\x46\\x44\\xa9\\xd1\\xc6\\x9f\\x05\\xbd\\xec\\x81\\xbf\\xd1\\x5a\\x5b\\x6c\\xaa\\xf4\\xd3\\x6e\\xb7\\x2d\\x7d\\xac\\x25\\x8e\\x8b\\x33\\x2c\\x8b\\xae\\xd2\\x12\\xa7\\xd1\\xe7\\x84\\x2c\\x80\\x7a\\x09\\xbd\\x92\\xb3\\x34\\x0a\\xd0\\x3c\\xc8\\x32\\xc2\\xbc\\xd6\\xe7\\xb8\\xcf\\x5b\\xa4\\xb1\\x53\\x1d\\xcd\\x5b\\xda\\xc9\\x82\\x69\\x8e\\xf6\\xe1\\xcf\\xba\\xce\\xaf\\xb0\\x30\\xe8\\x7a\\xfd\\xdc\\x2b\\x03\\x13\\x01\\xe1\\x3c\\x1c\\xb7\\x68\\x5c\\x06\\xdc\\xe0\\x98\\x69\\xc2\\x08\\xeb\\x06\\x20\\xa3\\x8d\\xc8\\x44\\x56\\x6a\\x6f\\x0d\\x67\\x50\\x95\\x24\\xed\\x27\\x4e\\xc2\\x1d\\x19\\x77\\xb6\\xb6\\x29\\xc2\\x26\\x11\\x22\\x67\\x3e\\xbc\\x05\\x6b\\x70\\xf5\\xe0\\x11\\x7b\\x08\\xc2\\xb6\\xd2\\x69\\xfe\\x19\\x70\\x5e\\x39\\xf5\\xb9\\xe2\\x1c\\xf9\\x05\\x9f\\x15\\x5d\\x88\\xe8\\x83\\xe2\\x89\\x8f\\x5a\\x90\\xcb\\x11\\x14\\x11\\xec\\x97\\xbd\\x8a\\xb4\\x3b\\xd3\\x5a\\xc5\\x03\\xfb\\x88\\x7e\\x62\\x22\\x09\\xe9\\xd4\\x58\\x8e\\x19\\x9c\\x97\\xc6\\xc5\\x8d\\xce\\x7f\\xe0\\x00\\xbb\\x8e\\xfa\\xe4\\xc8\\x03\\xd1\\x06\\x7c\\x2c\\x15\\xd5\\xe0\\x32\\xb4\\xda\\xb2\\xf6\\x89\\x48\\x0e\\xa0\\x5b\\x84\\xb4\\x60\\x6d\\xf3\\xc5\\x21\\xf9\\xbc\\xda\\x56\\x9d\\x0a\\x9f\\x08\\xf0\\x64\\x2d\\x4c\\x48\\x54\\x4c\\x88\\xb5\\xa4\\xa2\\x55\\xe9\\x50\\xad\\x8a\\x34\\x97\\x3e\\x1a\\x15\\xc4\\x83\\x3a\\x68\\x82\\x77\\xf8\\xe0\\x51\\x37\\x3a\\x5b\\x59\\x47\\x10\\x4f\\x89\\xf6\\x59\\xc4\\x74\\x17\\x10\\xe6\\x89\\x94\\xda\\x92\\x74\\xe7\\x7c\\xbd\\xd8\\x83\\x20\\x8b\\xec\\x3f\\xbc\\x89\\xdb\\xf0\\x5a\\xae\\xbb\\x8d\\x1a\\xc2\\x1a\\xae\\xba\\x7d\\x2e\\xbf\\x75\\xae\\x31\\x08\\x9f\\x3d\\xc8\\x90\\x7e\\xe4\\x4b\\xed\\xcd\\xfa\\xa6\\x4c\\x4a\\x65\\x7d\\x69\\xe3\\x0e\\xae\\x2d\\x8e\\x94\\x9d\\x5b\\x48\\x8f\\x54\\x70\\xf4\\xd8\\xbd\\xeb\\xb5\\xd0\\x44\\x6e\\xa9\\x76\\x95\\x16\\x7d\\xa5\\x5a\\xdd\\xe5\\x6b\\x71\\x24\\x37\\x49\\x1b\\xd6\\xe0\\x1d\\x6c\\xbe\\x55\\x89\\x1b\\x42\\x76\\x78\\x8b\\x42\\x37\\x65\\xef\\x7d\\xb7\\x4a\\x93\\x76\\xe7\\xd6\\x67\\x36\\xb9\\xbe\\xac\\xbf\\xf3\\xb4\\xc9\\xb5\\x68\\xfd\\x27\\x7b\\x37\\x27\\xcd\\x9d\\xbd\\xef\\x49\\xcf\\x39\\x8a\\xe6\\x13\\x9c\\x3e\\xfe\\xea\\xec\\x5d\\x41\\xa3\\x29\\x03\\xf7\\xd7\\x50\\x6c\\x02\\x4d\\x44\\x31\\x36\\xa1\\xe6\\x33\\x68\\x38\\x0f\\x00\\xa9\\xef\\xc8\\x56\\x90\\x09\\xed\\xa5\\xfc\\xd0\\xcb\\x1e\\x56\\x57\\xe4\\x15\\xf8\\xbf\\x50\\xab\\x8d\\x57\\x3a\\x9f\\x13\\xda\\xce\\x38\\x49\\x67\\x41\\x0e\\x4d\\xd1\\xaf\\x9a\\x4d\\x98\\x35\\xf7\\x12\\xde\\xe7\\x2c\\xf2\\x2e\\x2d\\xdd\\xa2\\xdd\\x2c\\x6f\\x0c\\x92\\x93\\x7d\\x0e\\xc6\\x9b\\xe3\\xab\\x1c\\x25\\x63\\x14\\xb0\\xdf\\x68\\x4e\\xb1\\xc2\\xa2\\xf6\\xd0\\x00\\x57\\xf8\\x2a\\x08\\xf1\\x28\\x9a\\x05\\xd3\\xe9\\x35\\xb5\\x64\\xc1\\xe1\\x8a\\x46\\x23\\x32\\xb6\\x6f\\x58\\xdf\\x6c\\x42\\x3e\\x08\\xe0\\x54\\x60\\xd6\\x62\\x44\\xb2\\xd6\\xb1\\x7c\\x89\\xab\\x5d\\x91\\xf3\\x5f\\xde\\x07\\x0b\\xb2\\x90\\x0c\\x4a\\x64\\xa4\\xae\\xc3\\xa6\\x44\\x69\\xcf\\x1d\\xc2\\x47\\x2e\\xde\\x2a\\x88\\xad\\x95\\x27\\x14\\xfe\\xc6\\x2b\\x7c\\x75\\x2b\\x06\\x07\\xfa\\x29\\x96\\xc8\\x5d\\xb6\\x43\\x58\\x0b\\xa1\\x95\\x2c\\x12\\xa2\\x78\\xbe\\xc8\\xd7\\x4f\\x6d\\x9c\\x9c\\xd5\\xa5\\xb3\\xb6\\xd5\\xf2\\x25\\x88\\x79\\x54\\x62\\xc4\\x1a\\x7a\\xa6\\x96\\x0a\\x82\\xea\\x57\\x35\\x55\\x80\\xb9\\x71\\x06\\xad\\x2f\\x68\\x65\\x80\\x0a\\x20\\x68\\x5d\\xf3\\xd1\\x8e\\x4b\\x62\\x0a\\xe1\\x73\\x3d\\x6b\\xd1\\x66\\x5f\\x6e\\xdf\\xa4\\x61\\xd5\\xde\\xb8\\x2b\\x3f\\x3d\\x44\\xc1\\x02\\x8d\\x16\\x71\\x50\\x12\\x30\\xfa\\x3b\\xdb\\xcd\\xd2\\x8d\\xf7\\xd3\\x3b\\xc7\\xa6\\x3b\\xc7\\xa6\\xbf\\xc6\\x85\\xb5\\x87\\xf8\\x56\\x49\\xdf\\xed\\x79\\x93\\xed\\xab\\x41\\x81\\xd0\\x84\\xe2\\x3a\\xd3\\xdf\\x1b\\x0a\\xea\\x0d\\xe4\\xa0\\x76\\xab\\x5e\\x13\\xdb\\x2e\\xf5\\x20\\x68\\xde\\x92\\x7b\\xa0\\xf7\\x1d\\xae\\xab\\xa1\\xaa\\x6e\\x87\\x9c\\xfd\\x21\\x1a\\x23\\x1e\\xa5\\x38\\xff\\x02\\x57\\x19\\xe4\\xb4\\xfc\\x4a\\x9f\\xfd\\x00\\x50\\xc6\\x78\\xbd\\x2e\\x88\\x22\\x8d\\x3b\\xb8\\xda\\x65\\x9a\\x1c\\xc1\\xd0\\x9d\\x7e\\xd5\\x75\\x27\\x21\\xee\\x23\\x68\\x00\\x05\\xf1\\xb3\\x1c\\x62\\xd4\\x2f\\x7c\\xd2\\x2d\\xa5\\xcb\\x04\\x75\\x8f\\x7f\\xb6\\x4c\\xaa\\x1d\\x92\\x92\\x65\\x5a\\x90\\xee\\xf4\\xec\\xf7\\xbb\\x0e\\xa1\\xa8\\x7a\\x26\\x25\\xbd\\x63\\xc8\\xf3\\x4c\\x7b\\x57\\xaa\\xcf\\xb5\\xbe\\xe5\\x66\\x9d\\x29\\xf0\\xf6\\xa7\\xd3\\xe4\\x12\\x05\\xe9\\x30\\xca\\xd3\\x20\\xbd\\x46\\xec\\xfa\\xe2\\x1c\\x5f\\xdb\\x53\\x77\\x9d\\xcb\\xda\\xe6\\x1f\\xb5\\xe0\\xf8\\x61\\xbd\\xac\\x8c\\x5f\\x05\\xf5\\xfe\\xc1\\xbe\\x08\\xf8\\x7e\\x61\\xbe\\x20\\x0f\\x11\\xe8\\xad\\x93\\x14\\x45\\x71\\x8c\\x53\\x48\\xa6\\x99\\x2c\\x72\\x90\\x9c\\x2d\\xc9\\xa9\\x20\\x5b\\x19\\xbd\\x52\\xa3\\x6b\\x85\\xfd\\xa0\\x7d\\xdb\\x92\\x28\\xf1\\xfb\\x2b\\xb9\\x72\\xa4\\xa9\\xbc\\x3a\\x19\\x26\\xd2\\x7d\\x5c\\xe2\\x79\\x13\\x17\\x49\\x75\\x22\\xa9\\x8e\\x0d\\x9a\\x7f\\xbd\\x7d\\x0f\\x34\\x45\\x8d\\xa7\\xe6\\x41\\x88\\x46\\x49\\x9c\\xe5\\x41\\x6c\\x81\\x4f\\x67\\x4b\\x5b\\xa2\\x33\\xaf\\xab\\x1f\\x31\\xc6\\xe3\\xe8\\x04\\xfd\\x31\\x40\\xed\\xab\\x9d\\x11\\xfd\\xcf\\x11\\x51\\xa4\\x52\\x6f\\x7b\\x97\\xfe\\xb7\\xcc\\x2d\\x4d\\x52\\xba\\x9f\\x89\\x4a\\xbf\\x75\\x2b\\xe8\\xdb\\xc9\\x2f\\x03\\xa2\\xc5\\x97\\xce\\x2e\\x23\\xb6\\xd9\\xcf\\x93\\x61\\xc6\\xcb\\x24\\x40\\xbb\\x5d\\xda\\xe7\\x15\\xf0\\xea\\xd8\\x7f\\xdd\\x97\\x90\\xea\\x75\\x6e\\xc1\\x43\\x6e\\x29\\xc9\\x0c\\x10\\xc0\\x37\\x99\\x62\\xe6\\xcd\\xfe\\x01\\x4b\\x30\\x03\\x63\\x88\\x80\\x2d\\x2d\\x11\\x6e\\x7c\\x2d\\x84\\x5b\\x33\\xd7\\x4c\\xa5\\xe2\\x17\\xc8\\x37\\x23\\x13\\x36\\x07\\xa3\\x4e\\x52\\x99\\xaf\\x21\\xff\\x0b\\xcc\\xfc\\x5d\\xfe\\x17\\x7b\\xc7\\x86\\x6b\\xe8\\xa5\\x4e\\x7d\\xab\\x1f\\xa8\\xc8\\x96\\x59\\x90\\x7f\\x9d\\x1c\\x30\\xe6\\xca\\x75\\xf2\\xc0\\x98\\x5b\\xf9\\x52\\xb9\\x60\\x6e\\x6b\\x3f\\x3a\\xa0\\x97\\xce\\x30\\xd1\\x76\\xc1\\x90\\x48\\xc7\\xaf\\xf4\\x09\\x72\\x7c\\xb3\\xc7\\xf8\\x6e\\x6f\\xf2\\x1c\\x94\\xba\\x2a\\x84\\x6d\\x2e\\x29\\x73\\x1b\\x1b\\x01\\xe0\\xa6\\x4f\\xd2\\x98\\x59\\x60\\x10\\x10\\xf5\\xd6\\x30\\xca\\xef\\x92\\x92\\xd5\\xec\\x1a\\xb4\\xdb\\xfe\\x9e\\xae\\xcc\\xaf\\x76\\x7b\\x8f\\x35\\x8f\\xa7\\xd1\\xf0\\x31\\x01\\x33\\x04\\x4f\\xc9\\xac\\xf4\\x16\\xc7\\xa3\\xc7\\xe0\\x71\\xa6\\x79\\x4e\\x43\\x9a\\x95\\x5e\\xcc\\xc2\\x1d\\xb7\\x4b\\x52\\x36\\x09\\xba\\x3b\\xe5\\x26\\xc9\\xc3\\x6e\\xb9\\xb9\\x6c\\x12\\xec\\x74\\xba\\xd5\\x87\\xdb\\x7b\\x9a\\x92\\xdb\\xa5\\x47\\x69\\x34\\xc7\\xb3\\xb0\\xb3\\xdb\\xd6\\x7a\\x44\\x29\\x8f\\xe6\\xc3\\xf3\\x70\\x5c\\xee\\x07\\x5f\\xcc\\xcf\\xc3\\xb1\\xcd\\xf2\\x40\\x1d\\x7a\\x12\\xe2\\xc7\\xa3\\xf1\\x50\\xfb\\x38\\x4f\\x0d\\x8f\\x1f\\x9f\\x4d\\x83\\x70\\x16\\xc4\\xba\\xd7\\x89\\xbe\\x31\\x3c\\x2a\\x3f\\x9e\\x07\\xe1\\xe3\\x20\\xce\\xa2\\xab\\xa7\\xdd\\x32\\x12\\xc8\\xab\\x28\\x4b\\x3a\\xed\\x4e\\xb7\\x8c\\x71\\xf6\\xea\\xe9\\x93\\xa7\\x4f\\xca\\x33\\x44\\x5e\\xfd\\x1b\\xa7\\x09\\x0b\\xc6\\xa8\\x79\\x1b\\x1b\\xde\\xd1\\xfb\\x8b\\xc7\\x13\\x7c\\x55\\x7a\\x11\\xe0\\x32\\x71\\xd1\\xe0\\xc9\\x61\\xe5\\x79\\x3a\\x2a\\x4f\\x6e\\x1a\\x0c\\x87\\x51\\xae\\x7d\\xf8\\x78\\x8a\\xcf\\x82\\xd1\\xf5\\x57\\x75\\x39\\x00\\x56\\x20\\x62\\xbd\\xc1\\xaf\\xf2\\x32\\x83\\x87\\xc5\\xea\\x12\\x3f\\xd9\\xa2\\x82\\xdf\\x64\\x2d\\x95\\x9c\\xe5\\xd8\\xca\\x11\\xdf\\xbb\\x3d\\xf1\\x9d\\xac\\x13\\xfe\\x9d\\x2c\\x0f\\xf1\\x9d\\x7e\\x2b\\x16\\x43\\xe1\\x75\\x07\\xdf\\x18\\xe9\\x53\\x08\\x28\\xc5\\x57\\xac\\x58\\x28\\x38\\x9c\\xbe\\xa5\\x5f\\x79\\xaa\\xfe\\x12\\xd4\\x5c\\x3c\\x4d\\x94\\x1a\\x84\\x76\\x69\\xb7\\x32\\xc9\\x8a\\x27\\x82\\x52\\xe5\\x27\\x94\\x40\\xc5\\x13\\x99\\x2e\\xc5\\xc3\\x58\\x7d\\x24\\x51\\x21\\xfc\\x26\\xc4\\x07\\x5f\\x0a\\x9a\\xa3\\x58\\x19\\x31\\x44\\x31\\x0a\\x93\\xbe\\x73\\xc2\\xba\\xfd\\x9b\\x1e\\xe5\\x86\\x47\\xe6\\xe7\\xeb\\xbe\\xf9\\xf1\\x4b\\x18\\xc3\\xd0\\xd5\\xdf\\xe9\\x36\\xed\\x77\\x8d\\x4d\\x95\\x66\\xfb\\x3b\\x3b\\x4d\\x85\\xa8\\xfb\\x3b\\xbb\\xcd\\x82\\xa8\\xfa\\x3b\\x4f\\x9a\\xea\\xcc\\xf4\\x77\\xf6\\xca\\x06\\x6d\\xe5\\x65\\xd2\\xdf\\xed\\x34\\xd9\\x4a\\xe8\\xef\\x02\\x3c\\x82\\x0a\\xfb\\xbb\\xdb\\x4d\\x99\\x0e\\xfb\\xbb\\x3b\\x4d\\x1d\\x25\\xf6\\x77\\x7b\\x4d\\x99\\xfa\\xfa\\xbb\\xbb\\x4d\\x99\\x36\\xfb\\xbb\\x00\\x97\\x42\\x8f\\xfd\\xdd\\xbd\\x66\\x99\\x22\\xfb\\xbb\\x4f\\x9b\\x65\\x9a\\xec\\x3f\\x69\\x37\\x2b\\x04\\xd8\\x7f\\xd2\\x69\\x6a\\x48\\xb5\\xff\\x04\\xe0\\x67\\xcb\\xad\\xff\\x04\\xa0\\x67\\x64\\xd7\\x7f\\xb2\\xd3\\xac\\x10\\x5e\\xff\\x09\\x00\\x4e\\x48\\xb4\\xff\\x04\\x60\\x2e\\xd6\\x70\\xff\\xc9\\x13\\xd9\\xfe\\xaf\\x59\\xb0\\x83\\xfe\\x13\\x6e\\x19\\x48\\x18\\x45\\x7f\\xaf\\xdd\\xe4\\x6c\\xa0\\xbf\\xd7\\x69\\x16\\xec\\xa1\\xbf\\xd7\\x6d\\x16\\x8c\\xa3\\xbf\\x07\\xe0\\x14\\xab\\xa3\\xbf\\x07\\x9d\\x0b\\x26\\xd6\\xdf\\xdb\\x21\\x12\\x53\\xe7\\xee\\x6a\\xf9\\xee\\x6a\\x79\\x95\\xab\\xe5\\x83\\x09\\x1e\\x9d\\x13\\x5c\\xc2\\x2a\\xa7\\xe1\\x39\\x32\\x14\\xa4\\x18\\x65\\x8b\\x39\\x99\\x25\\x5c\\xcd\\x9d\\x2b\\x61\\x1e\\xce\\x76\\x34\\x69\\x34\\xba\\x37\\x40\\x1b\\xbc\\x3f\\xe3\\x35\\x13\\x65\\x79\\xba\\xb0\\x03\\x3a\\xe8\\xbe\\x74\\x44\\x4f\\x1d\\x4c\\xef\\xf1\\x18\\xa7\\x18\\xf4\\x16\\x69\\x74\\x06\\xca\\x84\\x28\\x8e\\xaa\\x27\\x4d\\x88\\xdf\\xb3\\x98\\xe3\\x14\\x6e\\x12\\x65\\x57\\x22\\x52\\x5c\\xdf\\xf6\\xfe\\xe2\\x6c\\x86\\xe3\\xbc\\x54\\x16\\xe5\\x09\\x9a\\x04\\x71\\x38\\xc5\\xca\\x2c\\x19\\x7a\\x1c\\x6a\\xfb\\x53\\xec\\xaf\\xa1\\x15\\x6b\\x68\\x23\\xe9\\x56\\x92\\x66\\x0c\\xa7\\xd6\\xfb\\x51\\x9c\\xef\\x69\\xcb\\x73\\x92\\x60\\xa8\\xe4\\x8a\\x43\\x95\\x42\\xac\\x9a\\xb3\\xa2\\x32\\xbd\\x3f\\xfd\\x95\\xf4\\x05\\x0f\\x64\\x70\\x4d\\x87\\x50\\xd7\\x20\\x92\\x9c\\x9c\\xf4\\x69\\xe0\\xae\\x8b\\x08\\x5f\\x7a\\x0c\\xc7\\x07\\x54\\x69\\x9c\\x87\\x1c\\x5c\\xf4\\xe9\\x93\\xb1\\x2a\\x5f\\x36\\x30\\x38\\xb8\\xa1\\xe3\\x2d\\xdd\\x23\\xbc\\x4b\\x98\\xf5\\x02\\xf3\\xd2\\xf7\\x53\\xa9\\xba\\x69\\xeb\\xd0\\x08\\x6b\\x67\\xd7\\x09\\xac\\xb9\\xff\\xa5\\x2b\\x1f\\xc6\\xf9\\x76\\x77\\x85\\x8e\\x97\\xae\\xfc\\x72\\x9a\\x04\\x2b\\xd6\\xde\\xed\\xc1\\x73\\x6d\\xd5\\xd5\\x29\\xbb\\x45\\x97\\x59\\x13\\xc9\\x8f\\xae\\x73\\xfc\\x76\\x3c\\xce\\x70\\x5e\\x79\\x4c\\xa3\\xcd\\xd4\\x5e\\x0e\\xaf\\x28\\x17\\x29\\x20\\xa8\\xb9\\x98\\x8b\\x8a\\xeb\\xd0\\xbf\\x15\\x7d\\x3c\\x13\\x43\\x42\\x03\\xfd\\x50\\xed\\x6a\\xb9\\x17\\x57\\x79\\x1a\\x8c\\x72\\x48\\x4e\\xe4\\x17\\x86\\xad\\x6e\\xe0\\x22\\x1d\\xac\\xb5\\xc3\\x17\\xd1\\xb8\\xf0\\x45\\x53\\xc7\\xd1\\x89\\x14\\x15\\x3e\\xf2\\x09\\x08\\xef\\xc8\\x6b\\x21\\x2c\\x92\\xe8\\x4d\\x54\\x11\\x72\\xcb\\x58\\x4b\\x6c\\x51\\xad\\x51\\x30\\x9d\\x32\\xd1\\x82\\xc5\\x36\\xd2\\x0d\\xda\\x44\\x73\\x26\\xf9\\x47\\x82\\xee\\x05\\x29\\x41\\x7a\\x41\\x31\\x39\\x74\\x18\\xf6\\xcd\\x2a\\x60\\xc1\\x7c\\x3e\\xbd\\x66\\x90\\x05\\xe9\\xd9\\x82\\x6c\\x91\\x26\\x6b\\x6c\\xbf\\x28\\x4b\\x6c\\x97\\x6c\\xcd\\xd3\\x24\\x4f\\xc8\\x28\\xe5\\xfd\\xb2\\xbe\\x8d\\xa8\\x49\\x6a\\xb0\\xa8\\x3a\\xbb\\x77\\x82\\xfb\\x9d\\xe0\\xee\\x25\\xb8\\x43\\xae\\xd9\\x6f\\x27\\xe0\\x7d\\x61\\xdc\\x77\\x5a\\xa4\\x49\\x5e\\xda\\x04\\x14\\x24\\x38\\x6a\\x1b\\x83\\x72\\xed\\xc5\\x28\\x69\\xe8\\x03\\x63\\xe8\\x06\\xe2\\x86\\x1b\\x1b\\xb3\\x8d\\x8d\\xe3\\x90\\x84\\x0c\\x3b\\xc2\\x6e\\xcf\\xc9\\xff\\x3f\\x10\\x06\\x3f\\xa0\\x53\\xd8\\x0a\\x86\\x19\\xfd\\x92\\x45\\x31\\xcb\\x06\\x48\\x98\\x7d\\xfb\\xaa\\xd3\\x66\\x9f\\x4d\\xf4\\xc9\\x94\\x94\\x45\\xc3\\xd6\\x1a\\xda\\x8b\\x1b\\x83\\xd1\\xec\\x9b\\xe7\\x3b\\x25\\x1b\\x52\\x7f\\xc3\\xd9\\x72\\x38\\x29\\x34\\x60\\x93\\x6c\\x37\\x9c\\x3d\\x0d\\x93\\xf7\\x75\\xac\\x48\\x8a\\x4b\\x38\\x26\\x27\\xa9\\x07\\x98\\xc6\\xb1\\x75\\x9b\\x6d\\x5f\\xed\\x3e\\xe9\\xed\\x74\\xb7\\xdb\\x9d\\x26\\x6a\\x5f\\xe1\\xf1\\x28\\x0c\\x86\\x7b\\x4f\\xcd\\x61\\x7e\\x68\\x9d\\xa7\\x7b\\xc3\\x20\\x1c\\x8d\\x71\\x13\\xa6\\x61\\xbb\\xbb\\xd3\\x7b\\xb2\\x6b\\xac\\x72\\x52\\xd3\\x5c\\xe4\\x34\\x4c\\xde\\xa5\\xc9\\x08\\x67\\x19\\x58\\x32\\xc9\\x78\\x78\\xd3\\x44\\x09\\x08\\x76\\x2e\\x31\\xea\\x32\\x98\\x23\\x0c\\x51\\x00\\x6b\\x49\\x2b\\x9d\\x5d\\x2f\\xd9\\xc4\\xcb\\x34\\x0e\\x71\\xf3\\x38\\x00\\xf8\\x94\\xf4\\x42\\xbf\\xa2\\x47\\x28\\xb2\\x5b\\x8d\\x01\\xf5\\x9c\\x4a\\x15\\xdf\\x1c\\xf3\\x1f\\xba\\xd5\\x2a\\x7f\\xa4\\x92\\x64\\x05\\x59\\xcb\\x92\\x4f\\xa3\\xd1\\x90\\x7a\\xa2\\x71\\x10\\xd1\\x27\\x24\\x3f\\x04\\x09\\xac\\xb7\\x59\\x8a\\x80\\x88\\xcc\\x87\\x01\\x63\\xdb\\xdd\\xde\\xa6\\xa6\\x6d\\xc8\\x1e\\xaa\\xc4\\x5e\\xb4\\xb6\\x7c\\xcb\\x46\\xb5\\xaf\\x94\\x7b\\x6d\\xa7\\x5d\\xa2\\x32\\x55\\x6d\\x24\\xcd\\x15\\x7a\\x84\\xda\\x16\\x61\\x59\\xa9\\xd8\\x29\\x55\\xec\\xf8\\x56\\xec\\x96\\x2a\\x76\\x7d\\x2b\\x6e\\x97\\x2a\\x6e\\xfb\\x56\\xec\\x95\\x2a\\xf6\\x7c\\x2b\\xee\\x94\\x2a\\xee\\xf8\\x56\\xdc\\x2d\\x55\\xdc\\xf5\\xad\\xf8\\xa4\\x54\\xf1\\x89\\x6f\\xc5\\xbd\\x52\\xc5\\x3d\\xdf\\x8a\\x4f\\x4b\\x15\\x9f\\x7a\\x13\\x40\\xbb\\x44\\x00\\xfe\\xa4\\xd3\\x29\\xd5\\xf4\\xa6\\x9d\\x4e\\xb7\\x54\\xd3\\x9b\\x78\\x3a\\xdb\\xa5\\x9a\\xde\\xd4\\xd3\\xe9\\x95\\x6a\\x7a\\x93\\x4f\\x67\\xa7\\x54\\x73\\xc7\\xc6\\x0a\\xb7\\xb6\\xc8\\x36\\x78\\x1e\\xc5\\x67\\xa4\\x95\\x28\\x98\\x0e\\x1d\\xe7\\xdb\\x80\\xec\\xce\\xc7\\x2e\\xac\\x0f\\xa1\\x94\\x0b\\xc3\\x23\\x28\\xe5\\xc2\\x66\\x08\\xa5\\xb6\\x1d\\xa3\\x38\\x28\\x0c\\xca\\x8c\\xc5\\x08\\xec\\x2f\\x5f\\x36\\x82\\x26\\x1a\\x36\\xd1\\xa8\\x89\\xc2\\xa6\\xc4\\x92\\x9a\\x08\\x3d\\x69\\x12\\x91\\xaa\\x6d\\xda\\x87\\xc9\\x27\\xa4\\x4d\\x84\\x4d\\x24\\x5a\\x29\\x30\\xdf\\x44\\xa8\\xd3\\x6d\\xa2\\x0f\\xc7\\x1d\\x5b\\x13\\x23\\xda\\x04\\xed\\x9f\\xb6\\x52\\xb0\\x29\\xd2\\xc4\\x13\\xd2\\x44\\xd7\\xd6\\xc4\\x90\\x36\\x21\\x46\\x11\\x48\\x4d\\x6c\\x37\\x11\\xea\\x02\\x14\\xdb\\xb6\\x26\\x6c\\xb8\\xe8\\x09\\x5c\\xf4\\x96\\xc5\\xc5\\x8e\\xc0\\xc5\\xce\\xb2\\xb8\\xd8\\x15\\xb8\\xd8\\x5d\\x16\\x17\\x4f\\x04\\x2e\\x9e\\x2c\\x8b\\x8b\\x3d\\x81\\x8b\\xbd\\x65\\x71\\xf1\\x54\\xe0\\xe2\\xe9\\xb2\\xb8\\xe8\\xb4\\x9b\\x0c\\x17\\x1d\\x2b\\x79\\xda\\x90\\xd1\\xe9\\x34\\x19\\x32\\x3a\\x56\\xfa\\xb4\\x61\\x83\\x0c\\x83\\x62\\xa3\\x63\\x25\\x50\\xeb\\x32\\xd9\\x6e\\xf2\\x65\\x62\\xa5\\x50\\x2b\\x3e\\x7a\\x02\\x1f\\x56\\x12\\xb5\\xe2\\x63\\x47\\xe0\\x03\\x68\\xd4\\x8a\\x90\\x9f\\x7e\\x32\\x20\\xa4\\x89\\xd0\\x0e\\x45\\x88\\x95\\x4a\\x43\\xda\\x86\\x16\\x21\\x84\\xd0\\x9f\\xd2\\x36\\xac\\x64\\x3a\\xa2\\x6d\\xe8\\x11\\xd2\\x69\\x22\\x82\\x94\\x0f\\xc7\\x1d\\x2b\\x9d\\x0e\\x69\\x1b\\x5a\\x84\\x10\\x16\\xd8\\x6d\\x43\\x1b\\x56\\x42\\xb5\\xe1\\x63\\x47\\xe0\\xa3\\xeb\\xe4\\xa3\\x26\\x7c\\x10\\x62\\xa7\\xf8\\xe8\\x3a\\x19\\xa9\\x11\\x1f\\x3b\\x1c\\x1f\\x5d\\x27\\x27\\x35\\xe1\\xa3\\x27\\xf0\\xd1\\x75\\xb2\\x52\\x13\\x3e\\x9e\\x16\\xf8\\x70\\xf2\\x52\\x23\\x3e\\x7a\\x02\\x1f\\x4e\\x66\\x6a\\xc2\\x07\\xd9\\x15\\x18\\x3e\\x9c\\xdc\\xd4\\x84\\x8f\\xbd\\x02\\x1f\\x4e\\x76\\x6a\\x5c\\x2f\\xdb\\x4d\\x8e\\x0f\\x27\\x3f\\x35\\xe1\\xa3\\x2b\\xd6\\x4b\\xd7\\xc9\\x50\\x4d\\xf8\\x78\\x22\\xf0\\xb1\\xed\\x64\\xa8\\x26\\x7c\\x10\\x26\\x46\\xf1\\xb1\\xdd\\x71\\x32\\x90\\x57\\xaf\\xcc\\x0b\\xa6\\x07\\x83\\xd9\\x76\\x72\\xd4\\x57\\xaf\\xf4\\x08\\x21\\x13\\x43\\x18\\xc0\\x87\\xe3\\x6d\\x27\\x47\\x7d\\xf5\\xca\\xc2\\x40\\x76\\xa1\\x0d\\x27\\x47\\x7d\\xf5\\xca\\x80\\x90\\x5e\\x13\\x75\\xb7\\xa1\\x0d\\x2b\\xa1\\xda\\xf0\\xd1\\x29\\xf0\\xe1\\x64\\xa8\\x26\\x7c\\xf4\\x0a\\x7c\\x38\\x19\\xaa\\x09\\x1f\\x40\\x20\\x14\\x1f\\x4e\\x86\\x6a\\xc4\\x47\\x5b\\xe0\\xc3\\xc9\\x50\\x8d\\xf8\\xd8\\x6e\\x32\\x7c\\xf4\\x9c\\x0c\\xd5\\x84\\x8f\\xb6\\xc0\\x47\\xcf\\xc9\\x50\\x4d\\xf8\\xd8\\x16\\xf8\\xe8\\x39\\x19\\xaa\\x09\\x1f\\x64\\xa3\\xa3\\xf8\\xe8\\x39\\x19\\xaa\\x09\\x1f\\x4f\\x05\\x7d\\xf4\\x9c\\x0c\\xd5\\x84\\x0f\\xb2\\x70\\x19\\x3e\\x9c\\x0c\\xd5\\xb8\\x5e\\x76\\xf8\\x7a\\xe9\\x39\\x19\\xaa\\x09\\x1f\\xdd\\x02\\x1f\\x4f\\x9c\\x0c\\xe4\\xf0\\xd0\\x7c\\x70\\xd9\\xa5\\x08\\x71\\x72\\xd4\\xc3\\x43\\x3d\\x42\\x80\\xd8\\x81\\x93\\xf5\\x9c\\x1c\\xf5\\xf0\\xd0\\x22\\x92\\xed\\x80\\xc4\\xef\\xe4\\xa8\\x87\\x87\\x7a\\x84\\x10\\x66\\xd8\\x85\\x89\\xd9\\x71\\x8a\\xa8\\x26\\x7c\\x90\\xc9\\xa5\\xf8\\xd8\\x71\\x32\\x54\\x13\\x3e\\xb6\\x05\\x3e\\x76\\x9c\\x0c\\xd5\\x88\\x8f\\xb6\\xc0\\x87\\x93\\xa1\\x9a\\xf0\\xd1\\x29\\xf0\\xe1\\x64\\xa8\\x26\\x7c\\xec\\x09\\xfa\\xd8\\x71\\x32\\x54\\x13\\x3e\\x80\\xd8\\x29\\x3e\\x9c\\x0c\\xd5\\x84\\x0f\\x38\\xce\\x51\\x7c\\x38\\x19\\xaa\\x11\\x1f\\xdb\\x4d\\x8e\\x0f\\x27\\x43\\x35\\xe1\\xa3\\x27\\xf0\\xb1\\xeb\\x64\\xa8\\x46\\x7c\\x74\\x38\\x3e\\x76\\x9d\\x0c\\xd5\\x84\\x8f\\xae\\xc0\\xc7\\xae\\x93\\xa1\\x9a\\xf0\\xf1\\x54\\xd0\\xc7\\xee\\xb6\\x95\\x81\\xc0\\xd5\\x7d\\x8e\\xd3\\x19\\x0e\\xa3\\x20\\x67\\xe1\\x3e\\xc0\\x8f\\xd9\\x58\\xe5\\xd5\\x71\\x1b\\x34\\xe3\\xf0\\xf7\\x11\\x0a\\x2c\\x97\\x47\\xb4\\x78\\x87\\x15\\xef\\x90\\xe2\\x43\\x67\\xf1\\x2e\\x2b\\xde\\x25\\xc5\\x47\\xce\\xe2\\xdb\\xac\\xf8\\x36\\x29\\x1e\\xda\\x6e\\xb2\\xcc\\xb7\\x25\\x2f\\x35\\x4e\\x5f\\x6b\\xc9\\xbd\\x17\\x06\\x79\\x20\\xd4\\xe1\\xe4\\x87\\x43\\xa3\\x15\\xe4\\x81\\x08\\xcc\\x1d\\xe4\\x81\\x97\\xf2\\x3c\\x7e\\x16\\xe5\\xd9\\x87\\x24\\x0f\\xa6\\xa2\\xa7\\xf8\\x79\\x90\\x07\\xd4\\xa7\\xfd\\x21\\xd2\\x84\\xc1\\xa9\\x54\\x7f\\x8d\\xc7\\x39\\xef\\x53\\xb8\\xc3\\x43\\x55\\x1b\\x0e\\xf6\\xc3\\x10\\x31\\xa3\\x66\\xf3\\x6a\\xe1\\x43\\x3a\\x2e\\x3a\\xfa\\xf1\\xc7\\x1f\\xd1\\x0e\\x58\\xa4\\xb4\\xaf\\xf6\\xda\\x85\\x21\\x4a\\x51\\xe2\\x6f\\x68\\xbb\\x6b\\x23\\x5b\\x75\\xdc\\xaf\\xd0\\x00\\xc1\\x05\\xe7\\x78\\x9a\\x24\\x69\\x43\\x42\\xc8\\x96\\x72\\xcb\\xe9\\x81\\x08\\xa8\\xf6\\x1a\\x0d\\xa4\\x5f\\x16\\x4e\\x20\\xc6\\xd6\\x68\\x34\\x0a\\xe0\\x1f\\xa1\\xdd\\xde\\x26\\x0c\\xf2\\x29\\x24\\x04\\xeb\\x6d\\x52\\x6d\\xab\\xf3\\x3a\\x89\\xb7\\xc2\\x06\\x55\\xdc\\x25\\xc9\\x4f\\x97\\xba\\x4c\\xaa\\xb6\\xcc\\x6e\\x92\\xca\\x2d\\xd7\\xb8\\x4a\\xb2\\xb1\\xc8\\x3a\\x88\\xe9\\xd5\\x44\\xcc\\x6b\\x2d\\x62\\x5e\\xaf\\x01\\x31\\xaf\\xb5\\x88\\x79\\xbd\\x04\\x62\\xac\\x98\\x91\\x03\\x4e\\x34\\x04\\xaa\\x78\\xcc\\xfa\\x47\\xa8\\xb3\\xe9\\x8e\\x18\\x03\\x0e\\x9e\\xd4\\xa1\\x18\\x62\\xd5\\x38\\xa2\\x4e\\x9c\\xce\\xe9\\x7d\\xf0\\x7a\\xe2\\x95\\xb0\\xab\\xf2\\xe2\\x92\\xcf\\xbe\\xb0\\x5e\\x31\\xf7\\x50\\x9f\\x10\\x25\\xcb\\xde\\x3b\\xbb\\x4d\\x22\\x90\\xa7\\x7d\\xa0\\x80\\x1a\\xee\\x8d\\x5f\\x1d\\x3b\\x2f\\x8c\\x5f\\x31\\x5b\\x8b\\x46\\xe3\\x95\\x72\\x01\\xfc\\x6a\\xc5\\x9b\\xdf\\x57\\xca\\x95\\xef\\x2b\\xe3\\x5d\\xef\\xb2\\xb7\\xb9\\xef\\xa9\\x2d\\x19\\x25\\x22\\x16\\xd3\\x3a\\x84\\x89\\x32\\xd6\\xe2\\x4e\\xb9\\xc6\\x29\\x37\\xed\\xb1\\xe0\\x02\\xec\\xbb\\xbb\\xc2\\x0d\\x10\\x44\\xfc\\x11\\xf6\\x1e\\xf0\\xb3\\xb0\\x13\\xb4\\x49\\x56\\x50\\xf2\\xb4\\x42\\xa2\\x1e\\xf1\\x7a\\x78\\xe8\\x53\\x52\\xb0\\x8e\\xcf\\x71\\xe5\\xa1\\x18\\x66\\x49\\x5b\\x7e\\xd5\\x44\\x59\\x13\\x19\\x4d\\x2f\\x60\\x13\\x42\\x03\\x14\\xa0\\x47\\xa8\\xd1\\x18\\xa2\\x07\\x54\\xfa\\x69\\xfc\\x5f\\xf2\\x35\\xdc\\x24\\xcc\\xf2\\x0a\\x3d\\x42\\xb9\\x1e\\x36\\x91\\x8f\\x31\\x26\\x54\\x93\\x51\\x26\\x46\\x13\\xda\\x6e\\x77\\xd1\\x63\\x94\\x6d\\x42\\x0b\\x1a\\x6b\\x2b\\x0d\\x99\\x88\\x11\\x94\\xd4\\x75\\xb5\\x47\\x00\\x02\\x59\\x63\\x84\\x1e\\xa0\\xff\\xfb\\x85\\x46\\x50\\xd2\\x17\\xd4\\x19\\xc1\\x10\\xfd\\x81\\x46\\xe8\\x0f\\x32\\x88\\x2f\\x00\\x78\\xe9\\x9c\\x52\\x07\\x70\\x02\\x74\\xe3\\xff\\xb1\\xf7\\xef\\xdb\\x71\\xdb\\xc8\\xe2\\x28\\xfc\\xf7\\x37\\x4f\\x51\\x33\\xdf\\x4a\\xdc\\x8a\\xda\\x12\\xc1\\x5b\\xb3\\x1d\\x2b\\xbf\\x2d\\x4b\\x2d\\x4b\\xdb\\xb2\\xe4\\x23\\xc9\\xb1\\xf3\\xd3\\x76\\xbc\\x79\\x01\\xd5\\x4c\\x28\\xb2\\x37\\x49\\x59\\x52\\xc6\\x9e\\x75\\x5e\\xe3\\x3c\\xc2\\x79\\x8e\\xf3\\x26\\xe7\\x49\\xce\\xc2\\x85\\xd7\\x26\\x09\\xb0\\x25\\x5f\\x32\\x51\\xcf\\xc4\\xea\\x26\\x81\\xaa\\x42\\xa1\\x50\\x28\\x00\\x85\\x2a\\x07\\x3e\\x7e\\x69\\xa6\\x77\\xf8\\x80\\xe5\\x3a\\xb7\\x6c\\x5b\\x16\\xd3\\xd0\\x1d\\x2c\\x68\\xc0\\xa3\\x22\\x60\\x75\\x40\\x96\\x22\\xbe\\xdd\\x1a\\xf7\\x65\\x60\\x3e\\x8a\\x3c\\xcc\\x46\\x23\\x4e\\x0d\\x55\\x05\\xb2\\xc0\\x3b\\x62\\x6d\\x0c\\x82\\xf1\\x25\\x72\\x3d\\x70\\x65\\x57\\x78\\x05\\xbf\\xdc\\x35\\xfa\\xa3\\x68\\xf4\\x57\\xed\\x0d\\x9d\\xd1\\x9a\\x69\\xa1\\xe6\\x9b\\xf7\\x9e\\x45\\x52\\xdc\\xc7\\xe1\\x02\\x27\\xa3\\x97\\xbb\\xc6\\x00\\x6f\\xc1\\x4e\\x49\\xd9\\x7f\\xb9\\xbd\\xf3\\x2d\\xc8\\xc9\\x5d\\x23\\x5c\\x0e\\x12\\xb4\\x8e\\xa0\\x2e\\x5f\\x51\\xd0\\x58\\xac\\x8f\\x42\\x5a\\xf6\\x2f\\x6d\\x97\\x48\\x0c\\x67\\x5c\\x67\\x9c\\xcc\\x56\\xa1\\xe1\\x95\\x97\\x05\\xe7\\xd2\\x76\\x6b\\xc2\\x53\\xad\\xf6\\x89\\x79\\x25\\x0b\\x1d\\xe3\\xeb\\xc9\\x47\\x7b\\xdc\\xe1\\xb5\\xbf\\x52\\xe4\\x8f\\x87\\x64\\x19\\xc5\\xe7\\xb3\\x39\\xd0\\x2f\\x69\\xb6\\x1f\\x78\\x4c\\x71\\xd8\\xc3\\xd8\\x73\\x6c\\xf7\\x77\\x9e\\x02\\xeb\\x32\\xf6\\x9a\\xfa\\xab\\x31\\x4e\\x0a\\x69\\xa6\\x45\\x77\\xf6\\x9e\\x91\\x65\\x46\\xbf\\x0d\\x4d\\xbd\\xdb\\x69\\xc1\\xda\\x1d\\x11\\xea\\x07\\xcc\\xc8\\x78\\x49\\x60\\x71\\xff\\xe9\\x36\\xcd\\xbc\\xb3\\xf7\\x6c\\x63\\x16\\xb1\\x0c\\xb9\\xd4\\x9b\\x7e\\xef\\x59\\xbf\\xbb\\xf5\\xa2\\xc3\\xd5\\x98\\x5f\\xe5\\x91\\x73\\x37\\x96\\x5a\\x77\\xf2\\x48\\xf9\\xb9\\x59\\xcf\\x7e\\x0a\\xfc\\xcd\\x2a\\xb1\\x5d\\x59\\xf9\\x6a\\x6c\\xd7\\xce\\xaa\\x79\\x3a\\xdc\\x17\\xf8\\x36\\xcd\\x12\\x6c\\x5f\\x6e\\x47\\x1e\\x67\\x4a\\xcb\\x6d\\xa5\\x98\\x5f\\x95\\x2b\\x20\\x8f\\x39\\x2e\\xc1\\x6a\\xfb\\x04\\x5f\\x62\\x9a\\xc4\\x96\\x5e\\x99\\x62\\x52\\xc1\\x53\\x55\\xd1\\x20\\x7e\\x11\\xbe\\xc9\\xd8\\x63\\xe1\\xea\\x1e\\x7f\\x78\\xc6\\xf3\\xaa\\x51\\x9a\\x36\\xd2\\x30\\x70\\xf1\\x28\\x27\\xac\\xf0\\xf9\\x2b\\x28\\x94\\xbf\\xc4\\xd4\\x25\\x23\\xbb\\xf8\\x2f\\x2e\\x23\\xf7\\xd3\\x81\\xf4\\x3a\\xe2\\x3c\\x48\\x07\\x77\\xdf\\x57\\x96\\xdd\\xb3\\xb2\\xc5\\x0e\\x76\\xe3\\x4b\\x1e\\xc3\\x8f\\x48\\x62\\x10\\x5f\\xa5\\x83\\xc5\\xb6\\xe0\\xc1\\xfd\\xac\\xbc\\x7b\\x98\\x30\\x12\\xb6\\xbc\\xfb\\x6a\\x7a\\xef\\xee\\x11\\xdd\\x92\\xfa\\x50\\xc6\\x0a\\xfe\\xd0\\xc1\\xc1\\x46\\x6e\\x4b\\x46\\x5f\\x6b\\x49\\x32\\x01\\x07\\x1f\\x44\\x7b\\x25\\x05\\x0c\\xd8\\x82\\xe0\\x03\\x97\\x1d\\x45\\xac\\x7b\\xe2\\x0f\\x18\\x0e\\x7e\\xa6\\xdb\\x69\\xe9\\x95\\x93\\xe2\\xff\\xb9\\xc2\\x51\\x26\\xb7\\x9d\\x48\\x9b\\x59\\x5c\\x1a\\x5f\\xf1\\x62\\x66\\x93\\xf6\\x86\\x50\\xc8\\x0a\\x02\\xf9\\xf0\\x61\\x8b\\x59\\x0f\\xd3\\xea\\xa3\\x02\\xf4\\x18\\x3a\\x99\\xb1\\xb9\\x09\\x5c\\x2a\\x5a\\x5f\\xb7\\xed\\x34\\x3a\\xd2\\x61\\x8f\\xd9\\x05\\xdc\\xf2\\xca\\x0a\\x8d\\x5f\\x5c\\x50\\x45\\x37\\x16\\xe5\\x5a\\xd8\\xb2\\xd2\\xce\\xed\\xdd\\xbd\\x67\\xc3\\x2f\\x8d\\xe6\\xd6\\xc4\\xaa\\x69\\x45\\x4c\\xfd\\xc1\\x66\\x6e\\xeb\\xaa\\x07\\x9b\\xf9\\x0e\\x36\\x33\\xfc\\xc7\\x22\\xc1\\x29\\x4e\\x3e\\xe0\\x25\\xeb\\x39\\xbe\\x22\\xcb\\xfd\\x8a\\xd5\\x4c\\x77\\xab\\xed\\x2c\\x70\\x42\\x3e\\xcf\\xc2\\x6e\\x02\\xcf\\x92\\xc0\\x8e\\xe0\\x39\\x8b\\xf5\\x04\\x7e\\x10\\x62\\x1c\\xb9\\x1b\\x6e\\x13\\x5a\\x9e\\xaf\\x93\\x26\\x40\\x6d\\x0c\\x89\\xb3\\x93\\x66\\xe9\\xff\\xb4\\x23\\xd8\\x4f\\xae\\x9c\\x5b\\xf8\\x6d\\x4e\\xfe\\x6c\\x5c\\x63\\xe7\\x3f\\x2e\\x2e\\xed\\x20\\xdc\\x70\\xe3\\xcb\\x21\\xc6\\xfb\\xd9\\x49\\x4e\\x9a\\x9c\\x0d\\x5f\\x2d\\xbf\\xaa\\x29\\x5f\\xa0\\x09\\x22\\xf7\\x4d\\x9c\\x78\\x74\\xe6\\x5b\\xee\\xd6\\x76\\x0d\\x46\\x04\\x79\\x44\\x6b\\x00\\x3b\\xc4\\xe0\\xa7\\x0e\\x6b\\x54\\xa0\\xd9\\xb7\\x7f\\xc2\\xe6\\x66\\xfc\\x01\\x27\\x7e\\x18\\x5f\\xf7\\x9b\\x58\\x88\\x34\\x3b\\x07\\x86\\xcc\\xb5\\xef\\x09\\x00\\x81\\x59\\xa6\\x56\\xeb\\x58\\x52\\x55\\x34\\x6e\\x41\\x71\\x5a\\x7b\\xa6\\x40\\x9a\\xf1\\x19\\x55\\xda\\xb2\\xb9\\x09\\x79\\x53\\xc0\\x41\\x9d\\xf5\\xfa\\x0f\\x98\\x68\\x3b\\x7b\\xdc\\x15\\x0a\\xcc\\x6a\\x89\\xb9\\xb7\\xb0\\x44\\x3e\\x65\\x55\\x8c\\xb2\\x40\\xab\\x49\\xa2\\x95\\x43\\x4d\\xd1\\x6b\\x72\\xe8\\xfb\\x53\\x60\\x03\\x57\\x4c\\xf7\\x44\\xd4\\xfa\\xba\\xa3\\xdd\\x95\\xa4\\xfe\\xb7\\x42\\x62\\xc5\\x84\\xae\\xaf\\x3b\\x6a\\x3f\\x91\\xdd\\x24\\x74\\xbf\\xe9\\x25\\xac\\x9f\\xa8\\xf5\\x75\\x07\\xad\\x74\\x98\\x48\\x47\\x5c\\xaf\\x14\\xd0\\x12\\xeb\\x5b\\x74\\xc8\\x3d\\x7d\\x4a\\x14\\x80\\x4c\\x59\\x95\\x9d\\xa6\\x8a\\x8b\\x76\\xf5\\x76\\x3b\\x9b\\x3a\\x59\\xd4\\x6f\\xca\\x51\\x9a\\x94\\x1b\\x05\\xf1\\x53\\xd9\\x21\\x28\\xb9\\x09\\x46\\xc0\\x0c\\x3b\\x04\\x0a\\x22\\x97\\xcf\\x7f\\x23\\x97\\xfd\\x1d\\xa4\\xbf\\x79\\x1d\\xe6\\xb1\\x95\\xcf\\x02\\xe5\\xc3\\x35\\xae\\xcc\\xdb\\x95\\x41\\xef\\x6a\\x9c\\x98\\xda\\xd4\\xa3\\x09\\x82\\xca\\x6c\\xcb\\xa6\\xd5\\xa5\\xe9\\xf8\\x51\\x0a\\x14\\x69\\x0a\\x71\\x14\\xde\\xb2\\x39\\x7b\\xf7\\xcd\\xf1\\xc9\\x2e\\xfc\\x06\\x4f\\xa1\\x3d\\x12\\x16\\xf9\\xe4\\x94\\xa2\\x36\\xf2\\x3b\\x1d\\xec\\x7a\\xbb\\x80\\xd7\\x96\\xea\\x05\\x32\\xa5\\xd4\\xb6\\xc2\\x8a\\x49\\x79\\xa3\\xe3\\xf1\\xb7\\xbc\\x09\\x72\\x87\\x3d\\x90\\xbe\\x9a\\x8d\\x15\\x6f\\x2f\\x59\\xdc\\x92\\x2b\\xe8\\xca\\xfb\\xa2\\xaf\\xc5\\x92\\x4b\\x65\\x90\\x5a\\x2e\\x43\\x29\\x54\\x4d\\x2a\\xa4\\x17\\xcf\\x70\\xb7\\x05\\x34\\x0c\\x5a\\x44\\x43\\xbf\\xe6\\x6d\\x51\\x0f\\x02\\xaf\\xb9\\xea\\x82\\x9b\\x57\\xa9\\x34\\xba\\xab\\xe6\\xaa\\xeb\\x6b\\x10\\xaf\\xb1\\xe1\\xce\\xeb\\x6c\\x58\\x7d\\xad\\x0d\\x9d\\xea\\x42\\x76\\x27\\xb4\\x1c\\xfb\\xd5\\x0d\\xd1\\x42\\x3d\\xb4\\x54\\xc9\\x97\\xe3\\x45\\xcd\\xf6\\x15\\xbc\\xcc\\x1a\\xbe\\x02\\x62\\xc5\\xa5\\xbc\\xf1\\xb0\\x94\\x6f\\xeb\\xef\\x87\\xa5\\xfc\\x7d\\x1e\\x7f\\x2d\\x2d\\xe0\\x07\\x1d\\x7b\\x9d\\x9d\\x48\\x2f\\x99\\xef\\xb0\\x56\\x6e\\x99\\xeb\\x9b\\x93\\xfc\\xc3\\xec\\xfe\\x30\\xbb\\x7f\\x8e\\xd9\\xbd\\xeb\\xcd\\x57\\x9b\\xae\\x0f\\x22\\x37\\xc1\\x34\\x1c\\x30\\x47\\x29\\x34\\xd0\\x4b\\x01\\x7b\\x0c\\xec\\xba\\x47\\xc7\\x1b\\xea\\xdd\\xfc\\x11\\x94\\xbf\\xae\\xb9\\xb0\\x82\\x9d\\xb0\\xea\\x16\\x3f\\xa9\\xb9\\xa2\\x5d\\x60\\x3e\\xd8\\x05\\x6d\\x1d\\xfb\\x60\\x17\\xdc\\xa3\\x5d\\x30\\x0b\\xb1\\x9b\\x25\\x71\\x14\\xb8\\xb0\\x13\\x7b\\xd8\\x89\\xe3\\x55\\x5d\\x63\\x66\\x3b\\x92\\xae\\x31\\xac\\xe0\\xaa\\x36\\xc2\\x6c\\xa7\\xee\\x1a\\x43\\x7e\\x7f\\x5e\\x9b\\xa0\\x3a\\xc3\\xd7\\xd5\\x79\\x1d\\xc4\\x9d\\x0e\\xcd\\x49\\x33\\x6a\\x4a\\xe9\\xcb\\x36\\xcb\\xc3\\x9f\\xa7\\x59\\x5c\\x27\\xce\\x76\\x56\\x3d\\x22\\xa5\\x35\\x57\\xd4\\x9f\\x93\\x07\\xfd\\xd9\\xd6\\x59\\x0f\\xfa\\xf3\\x1e\\xf5\\xe7\\xf1\\x55\\xb6\\xb8\\xca\\xee\\xea\\x56\\x78\\x2c\\xeb\\x56\\x78\\x7c\\x27\\xb7\\xc2\\xe6\\xfa\\xea\\xb8\\xe1\\x66\\x78\\xfc\\x8d\\xbb\\x90\\x7d\\xfd\\xf5\\xd5\\xb2\\xab\\x4c\\xf1\\xe4\\x0b\\xaf\\xb1\\x7a\\x28\\xf9\\x33\\xae\\xb3\\x1e\\x36\\x37\\x3b\\x66\\xd0\\xe3\\x86\\x9b\\xa7\\xc4\\x6a\\xe5\\x78\\x65\\x87\\xa4\\xe3\\x3b\\x38\\x24\\x59\\x0f\\xb3\\x6d\\x5b\\xc7\\x3e\\xcc\\xb6\\xf7\\x38\\xdb\\x6e\\x1f\\x9d\\x1e\\xc0\\xdb\\x8d\\xa9\\xaa\\xe5\\x31\\x0f\\x20\\xcd\\x88\\x5a\\xbd\\x68\\xde\\xf3\\xe9\\x9a\\x6e\\x17\\xb6\\xb7\\xb1\\x1d\\xa5\\xc1\\x5b\\x02\\x63\\xab\\xa5\\xc9\\x0b\\xdb\\xab\\xce\\x6c\\x9e\\x9d\\xd9\\x15\\xf7\\x54\\x09\\xb7\\xd4\\x76\\x7d\\x99\\x47\\x96\\x38\\x2d\\xaf\\x9d\\xd7\\xae\\xa1\\xb7\\x6b\\x8f\\xda\\xbc\\x96\\xd7\\x2b\\x27\\xba\\xee\\x1b\\xea\\x54\\xf8\\xaf\\xa2\\xac\\x60\\x53\\x77\\x6e\\x14\\x7a\\x69\\xf1\\x15\\x2b\\xb6\\x84\\x82\\x3d\\x78\\x5c\\x27\\xfd\\xbb\\xc6\\xfb\\x3e\\x1a\\x58\\xf8\\xfd\\xd0\\x4e\\x59\\x7a\\x16\\x58\\xc4\\x69\\xd0\\x19\\x06\\x96\\x90\\x42\\x8a\\x12\\xa8\\xaf\\xe2\\x9c\\x47\\x05\\xde\\xf5\\x06\\x9d\\x8f\\x01\\x75\\xa3\\x7e\\x65\\x2f\\xa7\\x2e\\x83\\xfc\\xf2\\xbf\\x1b\\xda\\x97\\x8b\\xae\\xa4\\xca\\x65\\xd0\\x8f\\xf3\\x2a\\x31\\x65\\x0a\\x97\\x3a\\x15\\x65\\x0a\\x97\\x6a\\x69\\x41\\x32\\x97\\x7a\\x08\\x82\\xf5\\x06\\xcc\\x96\\x83\\xf1\\x96\\x3b\\xdd\\x57\\x51\\x8b\\xac\\xf6\\x08\\xe8\\x73\\x9c\\x41\\x74\\x45\\x5d\\xe5\\x63\\xbf\\x2e\\x18\\xcc\\x65\\xa0\\xe8\\x25\\x69\\x39\\xa9\\xb0\\x6a\\x54\\x6f\\xd2\\x63\\x40\\x6b\\x39\\xcb\\x7a\\xfd\\xc0\\x4a\\xfb\\xa3\\x2f\\x8a\\x49\\x03\\xb8\\x98\\x5f\\x75\\xf5\\x23\\x9a\\xfc\\x72\\xad\\x70\\x33\\x55\\xb5\\x95\\x27\\xc0\\xe9\\xc3\\x04\\xd8\\xc6\\xfc\\x87\\x09\\xf0\\x1e\\x27\\xc0\\x83\\xd3\\x63\\xa0\\x09\\x50\\xef\\x32\\xff\\x1d\\xf0\\x24\\xaa\\x9f\\x67\\xfe\\xfb\\xf6\\x27\\xb2\\x52\\x91\\xc8\\xcf\\x64\\xfd\\xd3\\x09\\x4b\\xaa\\xdf\\x9e\\x11\\x6a\\x23\\xb1\\x23\\x2f\\xbe\\x1c\\x2d\\xcd\\x5d\\x6b\\x6b\\x2d\\xf7\\x8a\\xe9\\x79\\x4e\\x1f\\x34\\x76\\x3f\\x77\\x74\\xbe\\x34\\x09\\xa9\\xfa\\xbb\\x31\\x01\\xfa\\x30\\x79\\xb4\\xf6\\xd1\\xe7\\x9d\\x3c\\xf2\\x21\\xb5\\xea\\xe4\\x31\\x51\\x1e\\x26\\x8f\\x36\\xe6\\x3f\\x4c\\x1e\\xf7\\x3b\\x79\\x6c\\x1e\\xcc\\x76\\x60\\x3a\\x99\\x4e\\x1e\\x23\\xe0\\x83\\x00\\x5e\\xe2\\x6c\\x1e\\x7b\\xa0\\x0e\\x9b\\x41\\x68\\xca\\xed\\xfb\\x9d\\x41\\xb6\\x3d\\x8f\\x05\\xa3\\xeb\\x54\\x23\\x12\\xda\\x36\\xd7\\x8f\\x04\\x10\\xfb\\xe4\\x6a\\xb1\\x0b\\xed\\xff\\xc6\\x49\\x4c\\x88\\xa6\\x77\\x27\\x13\\x9c\\xb6\\xcf\\x60\\xb5\\xf6\\x93\\x2a\\x9c\\x7d\\xe4\\xf7\\x52\\x1b\\x3f\\x8f\\x0e\\xe6\\xaa\\xee\\x0f\\x4e\\x6f\\xa7\\xbe\\xeb\\x24\\x95\\x22\\x64\\x58\\x84\\x0a\\x35\\x8e\\x30\\x5c\\xc6\\x09\\x66\\xcb\\xb6\\xc7\\x8f\\x29\\x77\\x24\\x7a\\x27\\xd7\\xb3\\x8f\\x1f\\xdf\\x97\\x62\\xa5\\x92\\xb6\\xb2\\x62\\xbd\\x9f\\x1c\\xe9\\x0f\\x8a\\xf5\\x41\\xb1\\xe6\\xc8\\x5b\\xb6\\xa5\\x20\\x8a\\xe3\\xc5\\x5d\\x4c\\xf2\\xa3\\x7c\\x8c\\xca\\x68\\xd4\\xb6\\x8e\\x90\\xd2\\x2f\\xad\\x15\\x87\\x8f\\xc9\\x82\\xd8\\x95\\x07\\xe5\\xfd\\xe4\\x3f\\x7d\\x18\\x94\\x0f\\x83\\x32\\x47\\xbe\\x3c\\x28\\xff\\x77\\x65\\x9a\\x5c\\x65\\x48\\x56\\x26\\xce\\x3f\\xc9\\x42\\xf9\\x8e\\x5b\\x9e\\xd5\\xed\\xc8\\xa5\\x75\\xf3\\x68\\xd4\\xbf\\x72\\x5e\\x83\\x8f\\x1f\\x9b\\x8f\\x3e\\x8f\\x15\\x24\\x64\\xdf\\xa0\\x00\\xce\\x9b\\x9b\\xf0\\x9a\\x10\\xd0\\x09\\x2d\\x58\\x0a\\xc9\\x4c\\xb7\\x9d\\xdb\\x8a\\x5f\\xcf\\x83\\x10\\xc3\\xe8\\xef\\xa3\\x32\\xa0\\x6c\\x99\\xfa\\x9b\\x46\\xf3\\x5b\\x4a\\xf5\\x5d\\x5c\\xe8\\xed\\x3b\\x7e\\x0c\\xda\\x6c\\x29\\xe8\\x3c\\x58\\x6c\\x86\\xb7\\xa5\\xd9\\x66\\xef\\xc5\\x18\\xab\\x0c\\x89\\x95\\x55\\xff\\x5f\\x2a\\xd6\\x57\\x3a\\xb7\\x51\\xe3\\xd1\\xfc\\xd2\\x76\\xbf\\xbd\\x69\\x80\\x12\\x4a\\xbf\\x51\\xfa\\xfe\\xc4\\x33\\x81\\xc0\\x89\\xe6\\xcb\\xe4\\xcd\\x7e\\x66\\xa7\\xb8\\x48\\x82\\x4d\\x7e\\xb4\\x17\\x1b\\x9c\\x5e\\x7b\\x29\\x67\\x76\\x5b\\xa1\\xd3\\xfd\\x6d\\x54\\xa6\\x6c\\x26\\xbf\\xda\\xcb\\xed\\xbf\\xdc\\xde\\x29\\xcb\\x91\\x5f\\xf2\\x31\\x22\\x5f\\xd9\\x69\\x4a\\xd4\\xea\\x63\\xd2\\x38\\x0f\\x5e\\xe0\\x5b\\xd8\\xc5\\x49\\xf0\\xc1\\x66\\x21\\x77\\xf3\\x2e\\x50\\x57\\xc9\\x38\\xfd\\xea\\xd9\\x8b\\xdd\\x3d\\xb5\\xa4\\xac\\xf8\\x4d\\x70\\xf5\\xfb\\x27\\xb5\\x52\\x0b\\xfc\\x02\\x4c\\xe4\\x07\\x17\\x57\\x09\\xa3\\x30\\x5e\\x90\\x3f\\x69\\xfb\\x06\\x6c\\x5b\\xfc\\x45\\xe0\\x81\\x27\\x93\\x78\\x81\\x93\\xec\\x16\\xfe\\xc9\\x36\\x43\\x69\\xc4\\x49\\x3a\\x33\\x9f\\xcd\\xa9\\x6f\\x0f\\xa4\\xe4\\x47\\xc0\\xae\\x19\\xa7\\x90\\xc5\\x45\\x14\\xa4\\x0d\\xd8\\xc5\\xbe\\x7d\\x15\\x66\\x4f\\x40\\x87\\x11\\x52\\x2d\\x70\\x82\\x2c\\xed\\x08\\x01\\x50\\x43\\xc5\\x42\\x33\\x7e\\xe2\\x91\\x5a\\x8b\\xf0\\xa7\\x38\\xe1\\x71\\xae\\x2a\\x90\\x49\\x6f\\x0f\\x20\\x3e\\xc8\\x30\\x63\\x48\\x4a\\xa1\\x96\\x1b\\xbc\\x95\\x17\\x59\\x0c\\x0b\\x9c\\xf8\\x71\\x72\\x59\\xc1\\xd3\\x85\\x64\\xb9\\x47\\xc9\\xc7\\xf5\\x2f\\x9e\\x48\\xf4\\x1e\\x30\\xb7\\xa6\\x53\\x9a\\x04\\x02\\xa9\\xd6\\xa6\\xa6\\x76\\xa7\\xf0\\x66\\x1c\\x60\\x2d\\xee\\x2e\\x55\\xb6\\xa3\\x8b\\xe6\\x4f\\x6b\\x1d\\xe1\\xb2\\x7b\\x64\\xe9\\x20\\x0a\\xb2\\x80\\x26\\xab\\x48\\xc1\\x86\\x08\\x5f\\x87\\xb7\\xc0\\xf6\\x9d\\x3c\\x2a\\x03\\x5e\\x39\\x14\\x72\\x6d\\x34\\x5c\\xd2\\x58\\x88\\xd3\\x63\\x3a\\x73\\x7d\\x22\\x2c\\x84\\xd1\\x31\\x95\\x5a\\x3b\\x5c\\xa3\\xbd\\xe5\\xb6\\x49\\x74\\x1e\\xfa\\xcc\\x8f\\x13\\xba\\x63\\x53\\x92\\x32\\x98\\x82\\xce\\xf0\\xa4\\xbd\\xd5\\x20\\xf7\\x94\\xf3\\xfc\\xaa\\xa7\\x62\\x65\\x24\\xe7\\x5b\\x74\\x5d\\x77\\x67\\x86\\xc0\\xf8\\x67\\x29\\x30\\x16\\xf5\\x9f\\xba\\x57\\x88\\xe3\\xba\\xfc\\x28\\x8a\\xd2\\x83\\xa3\\x5d\\xf4\\x83\\x28\\xa8\\xe5\\xc0\\x77\\xfd\\x0b\\xa1\\x53\\x36\\xe9\\xeb\\xad\\xe2\\x6b\\x3e\\x66\\x48\\xcd\\x61\\x01\\xdf\\x7b\\xb5\\x21\\x75\\xcc\\x60\\xf1\\xe2\\x64\\x95\\xf9\\xaa\\x32\\xbc\\x1c\\xa6\\x77\\xc1\\x31\\x52\\x39\\xce\\x7f\\x74\\x81\\xef\\x81\\x93\\xda\\x61\\x06\\xdb\\xf4\\xcf\\x60\\xe2\\x3a\\xe2\\xfd\\xe6\\xb1\\x89\\xda\\x43\\x07\\xf7\\x83\\xbc\\xe3\\x88\\xc1\\xc4\\x0e\\xf8\\xdd\\xf3\\x37\\x78\\x22\\x80\\x51\\xce\\x99\\x31\\x6d\\xe1\\x40\\xc9\\xe3\\x40\\xaa\\xc2\\xd7\\x80\\x27\\xe7\\xa7\\xdb\\x59\\x86\\xba\\xe9\\xd6\\x44\\x55\\x74\\xa3\\x2d\\xc8\\xa8\\xd1\\xd1\\x0b\\x91\\x87\\x37\\xa6\\x61\\x97\\xf9\\x90\\x24\\x83\\x80\\xa9\\xfb\\x71\\x21\\x2c\\xc2\\xdb\\x73\\x54\\x43\\xb3\\x2c\\x4a\\x82\\xf4\\x40\\xac\\xc3\\x5f\\x50\\xee\\x2f\\x9d\\x23\\x08\\xf2\\xd5\\xd0\\x15\\xef\\x41\\xe4\\xe1\\x9b\\xb6\\xca\\xe7\\xca\\x0d\\x3f\\x83\\xe8\\x4f\\x41\\x29\\x9f\\xca\\xa8\\xa0\\xb5\\x58\\xe0\\x16\\x4f\\xf2\\x65\\xae\\x1c\\xb9\\x79\\xfd\\xf2\\x89\\x4c\\xfd\\xdc\\xd8\\xd9\\x22\\x1d\\xbf\\xc1\\x7f\\x09\\x9c\\xab\\x4b\\x4b\\x82\\xd5\\x2a\\x1f\\xc8\\x7b\\x4c\\x77\\x96\\xe3\\x4b\\xee\\x06\\x5f\\xf2\\x34\\x2e\\x4f\\x73\\x82\\x45\\xce\\xbd\\x05\\x6f\\x60\\x8b\\x0a\\xe0\\xc6\\xd5\\xc2\\x23\\x1d\\x48\\x87\\xc9\\x86\\xcf\\x33\\x53\\x8d\\x4a\\x66\\xf5\\x88\\x05\\xf9\\x50\\x18\\x09\\x4e\\x71\\xd6\\x9b\\xec\\x02\\x64\\xfb\\xbe\\x46\\x63\\xad\\xeb\\x44\\xbd\\xb6\\x5c\\xf3\\x90\\xf1\\x66\\xab\\xf2\\x88\\xf3\\x4b\\x4c\\xe9\\x41\\xd1\\x77\\x42\\x84\\x41\\x35\\xa3\\x19\\x47\\xd6\\x4f\\x66\\xcd\\x47\\x1b\\x31\\x1f\\xed\\x8a\\xb0\\xc8\\x38\\x69\\x03\\x9d\\x71\\x6b\\x88\\x69\\x57\\x14\\x3d\\x58\\x7d\\x29\\xe8\\x43\\x18\\xd6\\x8f\\x30\\x20\\xb5\\x0d\\xb4\\xf0\\x28\\xef\\xd5\\xea\\x33\\x61\\xb2\\x9e\\x0a\\xe2\\xb7\\xc7\\x27\\xf5\\xa6\\xd3\\x00\\x3f\\xfd\\x11\\x60\\xf3\\x4f\\xc1\\xf9\\xdf\\x98\\x77\\xfc\\x6f\\xb9\\x77\\x7c\\x45\\x60\\x7e\\x84\\xdf\\xe4\\xf8\\x4f\\x3e\\x65\\xe5\\xf3\\xdf\\xa8\\xa3\\xfc\\x52\\x4b\\xcf\\x7f\\xeb\\x71\\x98\\xcf\\x3f\\xa2\\xe0\\x60\\xbd\\xaf\\x2b\\x9a\\x91\\x9f\\x18\\x53\\xaa\\x04\\xbd\\xde\\xd0\\x90\\xe7\\xca\\xbb\\xf5\\xf5\\x55\\xee\\x33\\x54\\xb0\\x57\\xb6\\xe2\\x72\\xfd\\xd9\\x9f\\x5a\\x8a\\x5b\\x26\\x25\\x88\\x3b\\x5d\\xc1\\xeb\\x58\\xc1\\xdf\\x97\\x05\\x38\\x30\\xd5\\x83\\xac\\xe5\\xb7\\xba\\xd5\\x77\\x5f\\x6b\\xa7\\x20\\xe5\\x26\\x54\\xd7\\xea\\x69\\x50\\x1a\\x89\\x7e\\xb3\\xf2\\xeb\\x65\\x93\\x60\\x46\\x67\\xb1\\x20\\x62\\x6b\\x21\\x09\\xc3\\x73\\x18\\x84\\x31\\x88\\x17\\x6a\\x77\\x81\\x28\\xbb\\x50\\x6b\\xcd\\x81\\x51\\xec\\x2f\\x75\\x19\\xca\\x63\\xe8\\x59\\xb5\\xf1\\xfe\\xae\\x2f\\x22\\x49\\x79\\x79\\x2b\\xfe\\xd3\\xf0\\xdb\\x3a\\x0c\\x9d\\x38\\xbb\\xc6\\x38\\xdf\\xd1\\x7d\\x62\\x4c\\xc7\\xf9\\x3e\\xef\\x93\\x89\\xf5\\xe9\\xdd\\x78\\xf2\\x97\\x8a\\x20\\x8c\\x23\\xf7\\xb1\\x63\\xa7\\xd8\\xd4\\x1b\\x2f\\x2e\\x3d\\xa3\\x59\\xf4\\xc3\\xe2\\x77\\xcf\\xff\\x33\\x1d\\xe2\\x56\\x1a\\x47\\x7f\\x93\\x36\\xb1\\x17\\xac\\x29\\xff\\x4e\\x27\\xbd\\xdf\\xc4\\xfe\\xfe\\x29\\xbd\\xf4\\xb7\\x93\\xdf\\x51\\x65\\x7b\\xf7\\xd5\\x87\\x92\\xdb\\xf7\\x6d\\xe4\\x9f\\xe0\\xab\\xd4\\x76\\x42\\xcc\\xf3\\x2c\\xb5\\xb7\\xe2\\x14\\x60\\x0b\\xce\\x5b\\x4c\\x28\\x86\\xa6\\xe7\\xe5\\xf3\\xbc\\xa6\\xac\\xa1\\x70\\x62\\x3b\\x4e\\x90\\x01\\xbf\\x5a\\xca\\xef\\xe5\\xf6\\x6e\\xeb\\xb7\\x41\\xa1\\xa9\\x0a\\x82\\x14\\x6c\\x08\\xf1\\x85\\xed\\xde\\xc2\\x07\\x9c\\xa4\\x34\\xb7\\xd4\\xdc\\xce\\x20\\xc2\\x17\\x21\\x76\\x33\\xec\\x91\\x29\\xd8\\x8d\\xa3\\x0f\\x38\\xc9\\xa8\\x61\\x42\\xa6\\x82\\x2c\\x86\\x30\\xc8\\xb2\\x10\\x3f\\x66\\x39\\x29\\x5b\\xe7\\x7c\\x0a\\x1f\\x27\\x49\\x9c\\x80\\x17\\xe3\\x34\\x7a\\x94\\x81\\xed\\xfb\\xd8\\x65\\x60\\x18\\xd5\\x8f\\x52\\x48\\xb1\\x7b\\x95\\x04\\xd9\\x6d\\xcb\\x8e\\xf1\\x0f\\xe0\\x5c\\x65\\x10\\x64\\xb4\\x7e\\x5e\\x39\\xc8\\xd2\\x22\\xd0\\x75\\x10\\x06\\x19\\x8f\\x9b\\x19\\x67\\x84\\x09\\x01\\x99\\x6f\\x2f\\x71\\xc4\\x2c\\x84\\xb6\\xc3\\x84\\x8e\\x13\\x0e\\xc6\\xd2\\x43\\xc6\\x88\\xe2\\x9c\\xa3\\xf1\\xb4\\x2a\\x4e\\xfd\\xfb\\xe6\\xef\\xbd\\xf8\\x84\\xac\\x51\\xee\\x3d\\x73\\xf2\\x8b\\xea\\xdd\\x62\\x99\\xfd\\x81\\xf2\\x26\\x35\\x5d\\xe9\\x77\\x25\\x5f\\x80\\xc6\\x0a\\x3f\\xe0\\xbb\\x35\\xc4\\xe0\\xc1\\x32\\x7b\\x36\\x6f\\x0b\\xc2\\xc8\\xb7\\xf3\\x5e\\x8b\\xfe\\xc5\\xb9\\xf2\\x6e\\x0c\\xa3\\x17\\xe7\\xda\\x3b\\x1e\\xf6\\x16\\x3e\\x92\\x9f\\xfc\\x4c\\x1e\\x99\\x6b\\xdd\\xc7\\x07\\xac\\x3e\\x62\\xf5\\x95\\x7a\\x7d\\x4d\\xba\\xbe\\xca\\xea\\xa3\\x7a\\x7d\\x45\\xba\\xbe\\xc6\\xea\\xab\\xf5\\xfa\\xa8\\xa8\\xdf\\x59\\xbd\\x2f\\x6b\\x6a\\x1b\\xff\\xf3\\x38\\x5d\\x12\\x3d\\xb0\\x53\\xf4\\xc0\\x8e\\xb0\\x07\\x96\\x69\\xaf\\xf0\\x9e\\xb3\\x82\\xb9\\x41\\xf8\\x3e\\xcd\\x11\\x5d\\x34\\x90\\x65\\x6c\\x55\\x14\\xf2\\x46\\xc0\\xa6\\xe5\\x0e\\xd6\\xea\\x48\\x50\\x2b\\x12\\x75\\x28\\x12\\xa5\\xb3\\x17\\x2b\\xe0\\x1a\\x48\\xb4\\xa1\\x48\\x50\\x57\\x57\\x8f\\x2b\\xe0\\x1a\\x48\\x94\\x06\\x92\\x55\\xa5\\x62\\xc7\\x4e\\x92\\x5b\\x70\\x82\\xee\\x2d\\x0c\\xd6\\xef\\x0e\\x8b\\x36\\xdd\\xbb\\x0b\\x9b\\x31\\xf9\\x22\\x2a\\x38\\xbd\\x4d\\x33\\x7c\\x09\\x7e\\x7c\\x95\\x40\\x16\\x5c\\xf6\\x88\\xd7\\xea\\xa9\\x85\\x23\\x7c\\x93\\x9d\\x12\\x1d\\x22\\x95\\xa5\\xb6\\x3f\\x33\\xef\\xcb\\xd8\\x0b\\xfc\\x5b\\x36\\x7b\\xb0\\x61\\x31\\x8c\\x62\\x4b\\x8a\\xe2\\x9d\\x73\\x16\\x48\\xe0\\xed\\xf9\\x28\\x80\\x75\\xa0\\x01\\xfe\\x27\\xbd\\xa1\\x04\\x7a\\xf9\\xfd\\x33\\xa4\\x38\\xbb\\x5a\\x74\\x96\\x91\\x0b\\x2d\\x31\\x68\\x4b\\xf2\\xe0\\x67\\x16\\x6e\\x42\\x72\\x1f\\xf2\\xe0\\xe7\\xf7\\x0a\\x6c\\xc1\\xc1\\xcf\\xe7\\x8a\\x60\\x03\\x88\\x97\\x46\\xac\\x34\\x12\\x65\\x80\\xae\\xea\\x33\\x2a\\x64\\xe9\\x95\\xf3\\x01\\x13\\x23\\x54\\x62\\xaf\\x52\\x61\\xb9\\xa3\\x29\\x71\\x2c\\x79\\xf4\\x47\\x60\\xbf\\xba\\x92\\x47\\x57\\x8b\\xf3\\xec\\xd0\\x45\\xf9\\xd2\\xad\\x4b\\x98\\x1d\\xba\\xa0\\x40\\x2d\\x28\\x40\\x35\\x0a\\x90\\x88\\x02\\x54\\xa7\\x00\\xad\\x4c\\x01\\xcd\\x0e\\x11\\x28\\xb9\\xa6\\x21\\xf0\\x02\\xb5\\xae\\x68\\x24\\xa0\\x68\\x14\\x8a\\x9a\\xab\\x2f\\x0a\\x45\\xa9\\x2b\\x26\\x71\\x47\\xf2\\xb1\\x27\\x39\\x1d\\x01\\x1d\\x47\\x0a\\xdb\\x67\\x14\\x64\\x41\\xd8\\x21\\xba\\x94\\x94\\xeb\\x09\\xb2\\xcf\\xca\\xa9\\xac\\x9c\\x20\\x3b\\xc0\\x0e\\x51\\xc6\\xa4\\x9c\\x20\\xd5\\xc1\\xce\\xb9\\x2e\\x49\\x9f\\x21\\x49\\x9f\\x29\\x49\\xdf\\xa4\\xa0\\x4f\\x6e\\x73\\x7f\\xa8\\xb6\\x86\\x3b\\x69\\x6c\\x18\\xac\\xb5\\x61\\x85\\x9c\\x0c\\x5d\\x07\\xe4\\xef\\xbd\\xf8\\x55\\x47\\x44\\xa3\\x97\\x03\\xa3\\x19\\xc9\\x9a\\xab\\x43\\x27\\xcc\\xce\\xd2\\xed\\x5c\\x93\\x32\\xf7\\x68\\xaf\\x96\\xd1\\x82\\xa8\\xe6\\xee\\xac\\x78\\xca\\xf2\\x16\\xbc\\xa5\\x03\\x0c\\x46\\x6f\\x89\\x80\\xe6\\x2a\\x82\\xfe\\x2e\\xac\\xae\\xee\\x3e\\x3b\\x65\\xc9\\x03\\xde\\xd2\\x41\\x45\\xea\\x4c\\x1a\\x30\\x0c\\x19\\x18\\x2a\\x83\\xa1\\x73\\x18\\xa8\\x01\\x63\\x22\\x03\\x43\\x63\\x30\\xcc\\x77\\x05\\xed\\x35\\x18\\xa8\\x84\\xf1\\x19\\xcc\\x13\\x22\\x2e\\xd7\\xf6\\x02\\xd8\\x32\\xb6\\xb7\\xe8\\x29\\xb1\\x0b\\xe8\\x8c\\x40\\xbf\\xb1\\x19\\x81\\x28\\x53\\xfa\\xb3\\x6b\\x4a\\x10\\x0e\\xb5\\x0a\\x3c\\x3e\\x65\\x14\\xf0\\xc8\\x94\\xd1\\x9c\\x33\\x44\\xad\\x11\\x45\\x5d\\x22\\x9f\\x97\\xcd\\x98\\x49\\xa7\\xab\\xc4\\x4a\\xea\\x18\\xc0\\x85\\xc3\\x79\\xe9\\x2f\\xd6\\x5a\\x2e\\xf8\\xc0\\x0a\\x99\\xfa\\xa6\\xa6\\x2e\\xef\\xbf\\xf6\\xe6\\x6d\\x2a\\x06\\x5a\\xe7\\x9a\\x5a\\x2a\\xf8\\x4b\\x4d\\x07\\x74\\x15\\xaa\\xac\\xaa\\xba\\xfd\\xd5\\x4f\\xed\\x0f\\x18\\xe2\\xd0\\x93\\x99\\x1f\\x57\\xb3\\x4c\\x77\\xde\\x33\\xf1\\xdb\\xe9\\xc9\\x8f\\xd7\\x45\\xdd\\x8e\\x1d\\xba\\x57\\x21\\x51\\x33\\x11\\xbe\\x96\\x21\\x71\\x87\\x29\\x98\\x11\\xfd\\xbb\\x0e\\xca\\x8d\\xee\\x69\\xf4\\xff\\xb0\\x9e\\xaf\\x34\\x68\\xb4\\xe2\\x76\\x42\\x76\\x98\\x6a\\x19\\xd1\\xbf\\xa4\\x36\\xaf\\xac\\xc1\\x3a\\x8c\\x18\\x4c\\x22\\xdd\\xca\\x1a\\x3c\\x85\\xd1\\xce\\xfb\\xca\\xef\\xff\\x05\\x08\\x9e\\x80\\xb2\\xd6\\x0b\\x5c\\xe5\\xc0\\x55\\x06\\x9c\\xc3\\xd6\\x39\\x70\\xd4\\x00\\x8e\\x86\\x01\\xd7\\x38\\x70\\x6d\\xa9\\xdd\\x23\\x86\\xb2\\x06\\x5c\\x1d\\x06\\x5c\\xe7\\xc0\\xf5\\x56\\xb6\\x68\\x0d\\xe0\\xda\\x30\\xe0\\x06\\x07\\x6e\\xb4\\xb2\\x45\\x6f\\x00\\xd7\\x87\\x01\\x37\\x39\\x70\\xb3\\x95\\x2d\\x46\\x03\\xb8\\x31\\x0c\\xf8\\x84\\x03\\x9f\\xb4\\xb2\\xc5\\x6c\\x00\\x37\\x87\\x00\\x2f\\x97\\xc5\\x0c\\x7e\\x0d\\xd2\\xa4\\x09\\xa9\\x27\\xde\\x45\\x31\\x82\\x88\\x19\\x70\\xf1\\xf8\\xde\\x87\\x37\\xa9\\x70\\x71\\x43\\x27\\xc2\\x80\\xb0\\x81\\x0d\\xf3\\xde\\x3d\\x81\\x38\\x4a\\xb3\\xe4\\xca\\xcd\\x60\\x1e\\x5c\\xcc\\xc1\\x8e\\x3c\\x08\\xe3\\x6b\\xb0\\x93\\x8b\\x2b\\x1a\\xa2\\x9c\\xc6\\x0d\\xfc\\x9f\\x2b\\x3b\\xe9\\xba\\x92\\x5c\\xa0\\xb5\\x61\\x8b\\xe0\\xce\\x97\\x15\\xfd\\xdb\\x89\\x17\\x0e\\x2b\\xcd\\xe6\\x68\\xd1\\xb6\\x45\\xce\\xb5\\x1a\\x89\\x09\\x4e\\xaf\\xc2\\x0c\\x62\\x5f\\x92\\xbe\\x39\\x9b\\x75\\x47\\x17\\x36\\xfc\\x00\\x17\\x36\\x0b\\x43\\x81\\x26\\x6b\\xb0\\x0e\\xec\\x91\\xc3\\x1f\\x19\\xf4\\x91\\x43\\x1f\\x09\\x5a\\x11\\x32\\x98\\x95\\x66\\xb3\\x6d\\x9b\\x1f\\xe0\\xe2\\x86\\xca\\xd3\\x1a\\x15\\xbf\\xbc\\x40\\xb1\\x50\\xaa\\x14\\xe8\\x6f\\xfb\\x3e\\x69\\xf1\\xdb\\xe3\\x13\\xe8\\x4b\\x01\\xf8\\x9c\\xe9\\xf4\\x8b\\x39\\xfc\\x0a\\x17\\xe1\\xdd\\xd4\\xba\\x70\\xa3\\xf6\\x2d\\x57\\xea\\xcf\\x99\\x52\\x1f\\x8d\\x9e\\x97\\xf6\\x19\\x31\\x3b\\x9e\\x57\\x4c\\xc0\\x35\\x5e\\xc0\\xac\\x17\\x30\\xcb\\x02\\x3d\\x83\\xee\\x2d\\xd7\\xff\\xcf\\x99\\xfe\\x1f\\x31\\x8c\\xa5\\xbd\\xf4\\x3c\\xd7\\xf8\\xd4\\x5e\\x5a\\x07\\x82\\xb8\\x17\\x9c\\xca\\xc1\\xa9\\x39\\x38\\x54\\x27\\x0b\\x2d\\xd1\\xad\\xd4\\x0b\\x28\\x92\\x74\\x6b\\x1c\\x91\\x96\\x23\\x52\\xeb\\x74\\xab\\x0d\\xba\\x51\\x3f\\xdd\\x3a\\x07\\xa7\\xe7\\xe0\\xb4\\x3a\\x59\\xda\\x12\\xdd\\x6a\\xbd\\x80\\x2a\\x49\\xb7\\xc1\\x11\\x19\\x39\\x22\\xbd\\x4e\\xb7\\xde\\xa0\\x5b\\xeb\\xa7\\xdb\\xe4\\xe0\\xcc\\x1c\\x9c\\x51\\x27\\xcb\\x58\\xa2\\x5b\\xaf\\x17\\xd0\\x25\\xe9\\x9e\\x70\\x44\\x93\\x77\\x35\\x79\\x2b\\xe8\\x36\\x1b\\x74\\x1b\\x5d\\x74\\xb7\\x0c\\x92\\x8e\\xa3\\xb3\\xdc\\x2a\\x2c\\x8c\\x49\\xea\\x62\\x52\\x3b\\x90\\x62\\x87\\x7c\\xcc\\x3f\\xca\\xb7\\xdd\\x66\\xd4\\x60\\xb8\\x67\\x77\\x0f\\x86\\x37\\xc3\\x37\\x59\\xd5\\xc3\\xa2\\x7a\\xf2\\x94\\x87\\x60\\x1d\\x5d\\xe2\\x34\\xb5\\x2f\\xf0\\x98\\xac\\x14\\x99\\x07\\x44\\xaf\\xd3\\xc6\\x22\\xb4\\x49\\x23\\x6e\\x32\\xe8\\x84\\xcc\\x83\\x8c\\x8f\\x4a\\x22\\x04\\xc0\\xdb\\xbc\\x35\\xfa\\x4e\\xc9\\xde\\x33\\xf7\\x8b\\x7d\\x1c\\x2e\\x70\\x32\\xaa\\x96\\x6c\\x9e\\x3c\\x4b\\xb8\\x58\\x54\\xab\\xaf\\x74\\xdb\\x71\\x5c\\x3f\\x99\\x7f\\x62\\x18\\xe3\\xf2\\x48\\xfe\\x89\\x31\\x19\\xf3\\x93\\xfa\\x27\\xa6\\xfa\\xe9\\xdd\\x78\\xf2\\x97\\xca\\x02\\xf5\\xe0\\x8e\\xf1\\xe0\\x8e\\xf1\\xe0\\x8e\\x71\\xff\\xee\\x18\\x52\\x4a\\xb4\\x74\\x41\\x68\\x3a\\x1f\\xfc\\x25\\xdc\\x0e\\x64\\xf6\\xe0\\x56\\xdf\\xe4\\x7b\\x51\\xec\\xdc\\xbd\\xa8\\xef\\xdc\\xbd\\xb8\\xeb\\xce\\xdd\\x8b\\xfa\\xce\\xdd\\x8b\\xbe\\x9d\\xbb\\x2e\\x30\\xfd\\xe7\\x87\\x0f\\x0e\\x19\\x0f\\x0e\\x19\\x0f\\x0e\\x19\\x6d\\x48\\x1e\\x1c\\x32\\x1e\\x1c\\x32\\x56\\xa0\\xf9\\xc1\\x21\\xe3\\xc1\\x21\\xe3\\xc1\\x21\\xa3\\xbf\\xdc\\x83\\x43\\x46\\xeb\\xe7\\xc1\\x21\\xe3\\xc1\\x21\\xa3\\xf5\\xf3\\xe0\\x90\\xd1\\xf8\\x3c\\x38\\x64\\x14\\xad\\x79\\x70\\xc8\\xa0\\x9f\\x07\\x87\\x8c\\x0a\\x75\\x0f\\x0e\\x19\\x0f\\x0e\\x19\\x0f\\x0e\\x19\\x0f\\x0e\\x19\\x1d\\x68\\x1f\\x1c\\x32\\x1e\\x1c\\x32\\x1e\\x1c\\x32\\x1e\\x1c\\x32\\x0a\\x70\\x0f\\x0e\\x19\\xdf\\x8a\\x43\\xc6\\xe7\\x70\\xc5\\xb8\\x4f\\x27\\x0c\\x19\\xf7\\x8b\\x95\\x1d\\x2f\\xbe\\x84\\xcb\\x85\\xf9\\xe0\\x72\\xf1\\xe0\\x72\\xf1\\xe0\\x72\\xb1\\x5c\\xe2\\x6b\\xba\\x5c\\x74\\xb8\\x3d\\xec\\xe8\\x43\\x42\\x50\\x74\\x38\\x3d\\xec\\xe8\\x15\\x8f\\x07\\xfa\\xe3\\x1b\\x70\\x77\\x60\\xe1\\x8e\\x0a\\x87\\x87\\x7e\\xdb\\xf5\\xf7\\x32\\xf4\\xa3\\xa4\\x73\\x04\\x8d\\x92\\x54\\x8d\\x40\\x56\\xc9\\x39\\xdc\\xbb\\xf5\\x19\\x05\\x19\\xa4\\x4e\\x7c\\xd3\\x0b\\xfd\\xb4\\x20\\xfd\\xb4\\xc3\\xcb\\x25\\xff\\xb4\\x2d\\x8d\\x54\\xc3\\x94\\xda\\xa8\\xe3\\xbb\\x6f\\xc1\\xaa\\xe7\\x70\\x2f\\xf0\\xad\\xe0\\x20\\xae\\x4e\\xdd\\x38\\x8f\\x84\\x37\\x84\\x48\\xce\\x6c\\xc2\\xda\\x3c\\x22\\x68\\x00\\xdf\\x55\\xf9\\x2f\\x3e\\xae\\xe1\\xf5\\x89\\x61\\x94\\xf7\\xf4\\x79\\x0d\\xe6\\x72\\x36\\x89\\xda\\xeb\\xa5\\xc4\\x12\\x82\\x3d\\x43\\xd2\\xcc\\xd1\\x6f\\xb0\\xce\\x38\\xbc\\x9e\\xe3\\x5f\\x83\\xef\\x68\\xb3\\xc5\\xa1\\x2b\\xaf\\xed\\x6e\\x9e\\xe6\\x8d\\xa2\\x86\\x42\\xef\\x26\\x23\\x94\\x7d\\x7c\\x2a\\x8c\\x0c\\x48\\x4a\\x10\\xa9\\x5b\\x55\\x18\\x76\\x44\\xa7\\xc7\\x4c\\x9e\\x83\\x42\\xb2\\x99\\x2c\\x7c\\xd1\\x83\\x8c\\x7c\\x93\\x96\\x6e\\xd0\\xe6\\x11\\xe4\\x5f\\xe4\\x27\\x04\\x44\\x2e\\x84\\x67\\x33\\x5d\\xa4\\x15\\x51\\xd3\\x54\\xc3\\x14\\x6f\\xd0\\x2a\\x03\\x37\\x67\\x5b\\x69\\xbd\\xdb\\x46\\x6d\\x45\\xc5\\x74\\x6f\\xd4\\x96\\xbd\\xd5\\xa1\\x24\\xf2\\xf0\\x96\\xbc\\x4b\\xbb\\x77\\x7b\\xaa\\x71\\x67\\x2b\\x07\\x32\\x9d\\x40\\x7f\\xaf\\xb6\\xb4\\x5b\\x52\\x0a\\x05\\x13\\x31\\xcd\\x12\\xb1\\x53\\x8a\\xa8\\x5f\\xaf\\x04\\xf4\\xf4\\x16\\xd6\\x01\\x15\\x43\\xb2\\xab\\x68\\x6d\\x28\\x8b\\x07\\xb0\\x68\\xf0\\xca\\x0d\\x5c\\xa9\\x41\\x5b\\x0e\\xd8\\xce\\x22\\x75\\x26\\x7e\\x24\\x10\\x47\\x5c\\x25\\x91\\xda\\xbc\\x39\\xef\\xca\\x64\\xeb\\x51\\x4f\\x72\\xf5\\xee\\x4d\\x93\\xd7\\x34\\xac\\x6f\\xbf\\xff\\x48\\x39\\xfa\\x3b\\x24\\xa9\\x54\\x0a\\x5d\\x52\\xc4\\x57\\x34\\xb5\\x46\\xfd\\x25\\x96\\xad\\x3b\\xfa\\x3d\\xaf\\x59\\x77\\xf4\\x7b\\x5a\\xb0\\x2e\\x1b\\x7b\\x8d\\xd5\\xea\\x8e\\x3e\\x20\\x78\\x2a\\xf5\\x87\\x08\\xb0\\x77\\x6f\\x66\\xe9\\x6e\\x12\\x2f\\x6a\\xa6\\x29\\x7f\\x40\\x39\\xfa\\x8d\\x65\\x3c\\xf1\\x08\\x69\\xf5\\x74\\x21\\x8d\\xb3\\x6b\\x22\\x9d\\xa4\\x54\\x91\\x30\\x04\\xd0\\x74\\xf9\\x94\\xaf\\x8b\\x25\\x90\\x67\\x0c\\x21\\x8d\\xaf\\x24\\x40\\xe8\\xd6\\x92\\x04\\xd7\\x93\\x4e\\x1c\\x9d\\x19\\x3e\\x86\\x5a\\xf4\\x84\\x9e\\xbc\\x8e\\xf4\\x21\\x3f\\xe9\\x48\\x39\\xab\\xb3\\x70\\x60\\x26\\xcd\\x21\\xa6\\xe7\\x4f\\xd4\\x02\\x7d\\xfc\\x58\\x64\\x78\\xae\\x66\\x1f\\x40\\xf7\\xe1\\xae\\xdc\\x9c\\xff\\xe7\\x57\\x56\\xa4\\x6f\\xee\\x5d\\x61\\x51\\xa0\\xf7\\xa5\\xb4\\xb8\\x1a\\xe8\\x57\\x5c\\xa4\\xd0\\x2a\\xfb\\x6c\\x3b\\xfa\\x97\\xd8\\x64\\x9b\\xdc\\xcb\\x26\\xdb\\x37\\xb8\\xbb\\xf6\\x0d\\xed\\x81\\xfd\\x89\\x77\\xb3\\x36\\x7f\\xa0\\x93\\x0c\\x4e\\x71\\xf2\\xa1\\x31\\xb0\\x47\\xee\\x1a\\xa8\\x0a\\x52\\xc1\\xb9\\x85\\x9d\\xff\\xe7\\xff\\xf6\\x92\\xc0\\x85\\x97\\x38\\x8d\\x82\\x70\\x03\\xb6\\xc3\\x10\\x92\\xe0\\x62\\x9e\\xa5\\xc0\\xeb\\x7a\\x1b\\x0d\\x15\\x75\\x82\\xbd\\x20\\xcd\\x92\\xc0\\xb9\\xa2\\x24\\xd8\\x91\\x47\\xa3\\x7b\\x07\\x11\\xa4\\xf1\\x55\\xe2\\x62\\xfa\\xc4\\x09\\x22\\x3b\\xb9\\x25\\x8a\\xf8\\x32\\x1d\\xf3\\xe0\\x9e\\x09\\xfd\\x1b\\x5f\\x65\\x44\\x2c\\x02\\x3f\\x70\\xe9\\x0c\\x3a\\x06\\x3b\\xc1\\xb0\\xc0\\xc9\\x65\\x90\\x65\\xd8\\x83\\x45\\x12\\x7f\\x08\\x3c\\xec\\xb1\\x08\\xa6\\x44\\xbf\\xf9\\x71\\x18\\xc6\\xd7\\x41\\x74\\x01\\x6e\\x1c\\x79\\x01\\xd3\\x7d\\xa4\\xd2\\x25\\xce\\x9e\\x34\\x88\\x7b\\xdc\\x20\\x2f\\xa5\\x27\\xa2\\x8c\\x2e\\x37\\xf6\\x30\\x5c\\x5e\\xa5\\x19\\x19\\xb2\\x76\\x10\\x51\\xe0\\xb6\\x13\\x7f\\x20\\xaf\\x16\\xb7\\xb4\\xd9\\x10\\xc5\\x59\\xe0\\xe2\\x31\\x0b\\x54\\x1e\\x06\\x29\\x3d\\x52\\xad\\xe2\\x8d\\xbc\\x06\\x51\\x5e\\x90\\xba\\xa1\\x1d\\x5c\\xe2\\x64\\x43\\x44\\x4b\\x10\\x55\\x19\\x93\\xd3\\xb2\\x48\\x62\\xef\\xca\\xc5\\xf7\\x4e\\x0e\\xf0\\x26\\x7a\\xb1\\x7b\\x55\\x84\\x53\\x25\\x35\\x36\\xe3\\x84\\x87\\x5a\\xbd\\xb4\\x33\\x9c\\x04\\x76\\x98\\x96\\x6c\\xa7\\x7d\\x45\\xab\\x55\\x48\\x6f\\xca\\xc0\\xd9\\xfe\\xc1\\x29\\x9c\\x1e\\xef\\x9d\\xbd\\xd9\\x3e\\x99\\xc1\\xc1\\x29\\xbc\\x3a\\x39\\xfe\\xf9\\x60\\x77\\xb6\\x0b\\xcf\\x7e\\x81\\xb3\\xfd\\x19\\xec\\x1c\\xbf\\xfa\\xe5\\xe4\\xe0\\xf9\\xfe\\x19\\xec\\x1f\\x1f\\xee\\xce\\x4e\\x4e\\x61\\xfb\\x68\\x17\\x76\\x8e\\x8f\\xce\\x4e\\x0e\\x9e\\xbd\\x3e\\x3b\\x3e\\x39\\x85\\x7f\\x6c\\x9f\\xc2\\xc1\\xe9\\x3f\\xe8\\x8b\\xed\\xa3\\x5f\\x60\\xf6\\xf6\\xd5\\xc9\\xec\\xf4\\x14\\x8e\\x4f\\xe0\\xe0\\xe5\\xab\\xc3\\x83\\xd9\\x2e\\xbc\\xd9\\x3e\\x39\\xd9\\x3e\\x3a\\x3b\\x98\\x9d\\x8e\\xe1\\xe0\\x68\\xe7\\xf0\\xf5\\xee\\xc1\\xd1\\xf3\\x31\\x3c\\x7b\\x7d\\x06\\x47\\xc7\\x67\\x70\\x78\\xf0\\xf2\\xe0\\x6c\\xb6\\x0b\\x67\\xc7\\x63\\x8a\\x74\\xb9\\x1a\\x1c\\xef\\xc1\\xcb\\xd9\\xc9\\xce\\xfe\\xf6\\xd1\\xd9\\xf6\\xb3\\x83\\xc3\\x83\\xb3\\x5f\\x28\\xbe\\xbd\\x83\\xb3\\x23\\x82\\x6b\\xef\\xf8\\x04\\xb6\\xe1\\xd5\\xf6\\xc9\\xd9\\xc1\\xce\\xeb\\xc3\\xed\\x13\\x78\\xf5\\xfa\\xe4\\xd5\\xf1\\xe9\\x0c\\x48\\xb3\\x76\\x0f\\x4e\\x77\\x0e\\xb7\\x0f\\x5e\\xce\\x76\\x37\\xe0\\xe0\\x08\\x8e\\x8e\\x61\\xf6\\xf3\\xec\\xe8\\x0c\\x4e\\xf7\\xb7\\x0f\\x0f\\x5b\\x5b\\x49\\x68\\xaf\\xb5\\xf1\\xd9\\x0c\\x0e\\x0f\\xb6\\x9f\\x1d\\xce\\x18\\xa6\\xa3\\x5f\\x60\\xf7\\xe0\\x64\\xb6\\x73\\x46\\x9a\\x53\\x7e\\xdb\\x39\\xd8\\x9d\\x1d\\x9d\\x6d\\x1f\\x8e\\xe1\\xf4\\xd5\\x6c\\xe7\\x80\\x7c\\x99\\xbd\\x9d\\xbd\\x7c\\x75\\xb8\\x7d\\xf2\\xcb\\x98\\xc3\\x3c\\x9d\\xfd\\x1f\\xaf\\x67\\x47\\x67\\x07\\xdb\\x87\\xb0\\xbb\\xfd\\x72\\xfb\\xf9\\xec\\x14\\x46\\x02\\x96\\xbc\\x3a\\x39\\xde\\x79\\x7d\\x32\\x7b\\x49\\x68\\x3e\\xde\\x83\\xd3\\xd7\\xcf\\x4e\\xcf\\x0e\\xce\\x5e\\x9f\\xcd\\xe0\\xf9\\xf1\\xf1\\x2e\\x65\\xf4\\xe9\\xec\\xe4\\xe7\\x83\\x9d\\xd9\\xe9\\x8f\\x70\\x78\\x7c\\x4a\\xb9\\xf5\\xfa\\x74\\x36\\x86\\xdd\\xed\\xb3\\x6d\\x8a\\xf8\\xd5\\xc9\\xf1\\xde\\xc1\\xd9\\xe9\\x8f\\xe4\\xfb\\xb3\\xd7\\xa7\\x07\\x94\\x69\\x07\\x47\\x67\\xb3\\x93\\x93\\xd7\\xaf\\xce\\x0e\\x8e\\x8f\\xd6\\x60\\xff\\xf8\\xcd\\xec\\xe7\\xd9\\x09\\xec\\x6c\\xbf\\x3e\\x9d\\xed\\x52\\xee\\x1e\\x1f\\xd1\\xa6\\x9e\\xed\\xcf\\x8e\\x4f\\x7e\\x21\\x40\\x09\\x0f\\x28\\xf3\\xc7\\xf0\\x66\\x7f\\x76\\xb6\\x3f\\x3b\\x21\\x0c\\xa5\\x9c\\xda\\x26\\x2c\\x38\\x3d\\x3b\\x39\\xd8\\x39\\xab\\x16\\x3b\\x3e\\x81\\xb3\\xe3\\x93\\xb3\\x4a\\x1b\\xe1\\x68\\xf6\\xfc\\xf0\\xe0\\xf9\\xec\\x68\\x67\\x46\\xde\\x1e\\x13\\x28\\x6f\\x0e\\x4e\\x67\\x6b\\xb0\\x7d\\x72\\x70\\x4a\\x0a\\x1c\\x30\\xb4\\x6f\\xb6\\x7f\\x81\\xe3\\xd7\\xb4\\xc9\\xa4\\x8f\\x5e\\x9f\\xce\\xd8\\xd7\\x8a\\xc4\\x8e\\x69\\x4f\\xc2\\xc1\\x1e\\x6c\\xef\\xfe\\x7c\\x40\\xc8\\xe6\\x85\\x5f\\x1d\\x9f\\x9e\\x1e\\x70\\x39\\xa1\\x2c\\xdb\\xd9\\xe7\\xec\\x5e\\xce\\x70\\xdc\\x75\\x78\\xf0\\xd2\\xce\\xe6\\x5f\\xef\\x00\\x61\\x70\\xee\\x4b\\x96\\x05\\xb1\\x28\\xcd\\x7e\\xde\\xe1\\x62\\x27\\x75\\xa1\\xb1\\xa3\\x2c\\x85\\xcc\\x76\\x5a\\x6c\\x4a\\x02\\xe8\\xfd\\x1f\\x61\\x6b\\x5e\\xa7\\x56\\xb3\\x59\\x19\\x03\\xa0\\x31\\x80\\x3a\\x06\\xd0\\xc6\\x00\\xfa\\x18\\xc0\\x18\\x03\\x98\\x63\\x80\\xc9\\x18\\xc0\\x1a\\x03\\x4c\\xc7\\x80\\x94\\x31\\x20\\x34\\x06\\xa4\\x8e\\x01\\x69\\x63\\x40\\xfa\\x18\\x90\\xd1\\x7e\\x03\\x69\\xc2\\xc0\\x90\\x62\\x04\\x34\\xa9\\x4a\\xc0\\x21\\x83\\xa1\\x20\\x20\\x28\\xda\\x29\\x47\\xa5\\x72\\x70\\x88\\xa2\\x6b\\x05\\xa9\\x71\\x0a\\x74\\x4e\\xe1\\x94\\x83\\xb3\\x2a\\xd4\\x4f\\x38\\x58\\x93\\x53\\x88\\x18\\x78\\xd4\\x91\\x8e\\x11\\x71\\x30\\x39\\x85\\x0a\\x03\\x47\\xa9\\xcb\\xa9\\xd7\\x18\\x58\\x82\\x0a\\x55\\x19\\xd3\\x01\\x52\\xe7\\x60\\x0c\\xde\\xb8\\x09\\x07\\xa7\\x56\\xa8\\x47\\x1c\\xac\\xc5\\x29\\xe4\\x8c\\x41\\xda\\xbb\\x16\\x0b\\x9b\\xf5\\x66\\x22\\xdf\\x9b\\x39\\xa1\\x93\\x0a\\x8b\\x55\\x8e\\x29\\x6f\\x94\\x59\\xe7\\x1d\\x6d\\xbc\\xd6\\xcd\\x27\\x93\\x57\\xd7\\x4a\\xb0\\x14\\x8c\\x51\\x36\\x2a\\x07\\x97\\xf3\\x8e\\xa2\\x45\\xdd\\x7c\\xa2\\xe5\\x8d\\x0a\\x33\\x26\\x9c\\x6c\\xb3\\xec\\x93\\x02\\x9e\\x5a\\xe9\\x1f\\xd6\\x84\\x56\\x98\\x16\\xaf\\x5e\\xe1\\x31\\xed\\x5a\\xa3\\xec\\x93\\x02\\x9c\\x56\\xe9\\x1f\\xd6\\x84\\x76\\x32\\x55\\xde\\x37\\x4a\\x05\\x6e\\xce\\xb9\\x49\\x21\\x0a\\xc5\\x78\\x00\\xce\\x49\\xd6\\x84\\xce\\xfe\\x4c\\x07\\x8c\\x4e\\xda\\x04\\xce\\x61\\x4a\\x7e\\x15\\x7d\\x2e\\xbd\\x5a\\xa5\\x17\\xcc\\xf2\\x5d\\xd7\\x58\\x9a\\x8c\\x69\\x29\\xca\\xe0\\x7c\\x9c\\x4c\\x4b\\x41\\xcf\\xa5\\x16\\x19\\x95\\xce\\x98\\xf0\\xb2\\x5d\\x1d\\x8a\\x4a\\xd9\\x2a\\x3a\\x73\\xca\\xeb\\xe4\\x32\\x69\\x55\\xca\\xe4\\xcd\\x99\\xd0\\xef\\xdd\\x30\\xd5\\x4a\\xf3\\xf5\\x92\\xa6\\x42\\x2b\\x55\\x07\\xa5\\x55\\x83\\xdd\\x0a\\x33\\x57\\x1b\\x46\\x39\\xf8\\x0a\\x36\\xa8\\x25\\x59\\x05\\x47\\xb9\\x1c\\x32\\x14\\xd0\\xdd\\xa3\\x03\\x46\\x28\\xa7\\xbc\\xd6\\x79\\x46\\x49\\x16\\xe5\\xc8\\xa4\\xd4\\x0f\\x94\\x0c\\x9d\\x93\\x67\\x76\\xb7\\x4a\\xab\\x77\\x5e\\xc1\\x20\\x54\\x82\\x2c\\x18\\x5e\\xa8\\x1c\\xfa\\xbe\\x0b\\x64\\xa1\\xf8\\x50\\x85\\xb7\\x66\\x49\\x4d\\xa1\\x04\\xb8\\x5e\\x41\\x9a\\xa0\\x3f\\x8d\\x52\\x7c\\xab\\x2d\\xcb\\x61\\x16\\x83\\x5f\\xad\\xfc\\x35\\x0a\\xe5\\xd2\\xc9\\x4c\\xa3\\xa5\\x8a\\x5e\\xef\\xdb\\x42\\x2c\\xca\\x56\\x03\\x42\\xd0\\x9a\\xdd\\x90\\x76\\xe8\\x9c\\x0c\\xd1\\x96\\x1e\\x85\\x22\\x35\\xa2\\x32\\x06\\xe5\\xc6\\xd8\\xb6\\xd4\\xc9\\x74\\x3a\\x25\\xdf\\xcd\\xd9\\xee\\x74\\xf6\\x6c\\x1b\\x91\\xef\\xd6\\x1e\\x7a\\xf6\\x6c\\x67\\x77\\x87\\x7c\\xdf\\x9e\\x1a\\xda\\xde\\xae\\x3e\\xeb\\x14\\x9e\\x79\\xd2\\x89\\xcb\\x50\\xb6\\x55\\xeb\\xd9\\xcc\\xa4\\xb8\\x76\\xf4\\xdd\\x5d\\xa4\\xea\\x14\\xd7\\xee\\x44\\xd1\\x66\\x7b\\x1a\\xf9\\x3e\\xd9\\x36\\x77\\x27\\xe6\\x8c\\xd2\\x90\\xd3\\xd6\\xda\\xb0\\x2e\\x17\\x85\\x83\\x57\\xb3\\x97\\xbb\\xc8\\x54\\x68\\x6e\\xe2\\x95\\x36\\x82\\x0b\\x08\\xe5\\x56\\x70\\xe5\\x11\\x33\\x79\\xee\\xd7\\x4b\\x81\\x1d\\x66\\x50\\x82\\x3b\\x32\\x58\\x9a\\x13\\xdd\\x50\\x35\\x85\\x76\\xc7\\x6c\\x6f\\x67\\x77\\xfb\\x99\\x45\\x59\\x34\\xb5\\x9e\\x6d\\xef\\xee\\xec\\xcd\\xc8\\x77\\xa4\\x68\\xaa\\xa1\\x4f\\x28\\x7b\\x77\\xb4\\x5d\\x75\\x86\\xf6\\x94\\xb6\\x6e\\x82\\x7b\\x38\\x32\\x15\\x9d\\x68\\xad\\x12\\xda\\x01\\xc9\\x9d\\xf0\\x0f\\xba\\x87\\xcb\\x28\\xa6\\x07\\x49\\xe5\\x85\\x1b\\xb1\\x07\\xc0\\xcb\\xf7\\x95\\x8a\\xf9\\x31\\xf0\\xfb\\x5e\\x7f\\x70\\x90\\x3c\\x8b\\xaf\\x40\\x83\\x2d\\x18\\xf5\\x96\\x05\\x76\\x39\\xa9\\x42\\x4d\\xe9\\x9a\\x59\\x79\\x78\\x97\\x8b\\x4f\\x75\\xd8\\xfc\\xfa\\x53\\x03\\xf6\\xf2\\x25\\xa8\\x5e\\xc8\\x83\\xb7\\xba\\x61\\xc0\\xa5\\xc1\\x7d\\x28\\x8e\\x8f\\xc9\\x78\\x91\\xf1\\xbd\\xa1\\xda\\xef\\xfd\\x3c\\x94\\x2a\\x9b\\xd0\\xb2\\x89\\x4c\\x59\\xba\\x2c\\x79\\xff\\x87\\x14\\x5c\\x6a\\xf4\\xbe\\xff\\x43\\x0a\\x2e\\x35\\xa8\\xde\\xa7\\x52\\x70\\xe9\\x54\\xfd\\x3e\\x4d\\x84\\x49\\x2a\\x37\\x37\\x89\\x5e\\xf9\\x3d\\x88\\x2e\\x48\\xbd\\x80\\x2c\\xb6\\xfa\\x1d\\xa2\\xec\\x70\\x0c\\x4e\\x38\\x06\\x37\\x1c\\x83\\x17\\x8e\\x01\\x77\\x38\\xc7\\x17\\xe5\\x93\\x31\\x38\\xc9\\x18\\xdc\\x64\\x0c\\x5e\\x32\\x06\\xb2\\x2c\\xec\\xac\\x60\\x13\\xb2\\x6d\\xd2\\xce\\xfd\\xde\\x1b\\xef\\x4e\\x42\\xb3\\x96\\xd2\\x72\\xa8\\xa7\\x9c\\x4b\\xca\\xb9\\xac\\x9c\\xda\\x53\\xce\\x23\\xe5\\x3c\\x56\\x4e\\xeb\\x29\\x47\\x97\\xb8\\x98\\x95\\xd3\\x7b\\xca\\xb1\\xdd\\xec\\x3c\\x3d\\x61\\x2f\\x7f\\x7a\\x3c\\x65\\x5a\\xef\\xab\\xd0\\xbf\\xeb\\x5b\\x80\\x44\\xfa\\x30\\x23\\x6a\\xc4\\x0e\\x61\\xbd\\xd4\\x2d\\xeb\\x7f\\x84\\xe7\\xc1\\xbb\\x77\\x6b\\x1f\\x05\\xf7\\xaa\\x69\\xe0\\x83\\xa7\\xc8\\x5c\\x13\\x5f\\x47\\xce\\x08\\x2d\\xe0\\xa3\\x91\\x13\\x8e\\xdd\\x70\\xec\\x85\\x6b\\xb0\\x0e\\xf3\\x50\\x18\\xaf\\xe0\\x53\\xb9\\x09\\x1f\\x3c\\xd5\\x54\\x99\\x9b\\xcf\\x1c\\x95\\xda\\x44\\xd5\\x27\\x00\\x4b\\xa8\\x74\\x6b\\x00\\x2a\\xad\\x89\\xaa\\x4f\\x86\\x96\\x50\\x99\\xfa\\x00\\x54\\x7a\\x13\\x55\\x9f\\x18\\x56\\x50\\xfd\\x73\\x73\\x93\\xa3\\xb3\\x94\\x01\\xe8\\x8c\\x26\\xba\\x3e\\x69\\x06\\x61\\xb6\\x57\\x22\\x6b\\x99\\x48\\xaa\\x48\\x21\\x48\\xe2\\x2c\\x1c\\x65\\xe3\\x94\\x08\\xa2\\xe0\\xde\\x3a\\x15\\xe0\\x6c\\x1d\\x87\\x42\\x79\\xa5\\x1a\\xa3\\x4f\\x11\\x01\\x3d\\x5f\\xa1\\x63\\xbc\\xbf\\x10\\xd5\\x01\\x94\\x46\\xa2\\xdf\\x90\\x28\\x88\\x03\\x55\\x2d\\x8e\\x00\\x26\\xd5\\x53\\x7d\\xfe\\x35\\x50\\x8c\\xd6\\x04\\xd6\\x2b\\x83\\x35\\xf9\\x4c\\x83\\xd5\\x18\\x39\\xc9\\xd8\\x4d\\xc6\\x5e\\x42\\x3b\\x3f\\xf9\\x8c\\x83\\x55\\x6f\\xa2\\xfa\\xac\\x83\\xb5\\x8e\\xea\\xf3\\x0d\\x56\\xb5\\x89\\xea\\xf3\\x0e\\x56\\xd4\\x44\\xf7\\xa5\\x07\\x6b\\x42\\x9d\\xd6\\xe4\\x46\\x6b\\x22\\x1e\\xad\\x74\\x12\\x6d\\xd9\\x1d\\xae\\x7e\\xe8\\x4c\\xeb\\x09\\x0a\\xd1\\x69\\x9b\\x8d\\xd6\\x44\\x66\\xb4\\x52\\xab\\x41\\x00\\x93\\x9a\\x16\\xbd\\xee\\xab\\x5d\\x6f\\xa8\\x5b\\x76\\x25\\xc7\\x37\\x5d\\xb7\\xd1\\x5b\\x7f\\xdd\\x0b\\x3c\\xf2\\xcf\\x16\\x8c\\xf6\\xd9\\x7d\\x3c\\x97\\xcc\\xd6\\x5e\\x3f\\x07\\xf7\\xf9\\x15\\xbe\\x7d\\x76\\xe7\\xce\\x23\\x55\\x04\\x4c\\xdf\\xe7\\xd7\\xf4\\xf6\\xd9\\xed\\x39\\x4c\\xaa\\xd8\\xa2\\x2a\\x1a\\xaf\\x42\\x6f\\xc8\\x51\\x33\\xc2\\x11\\x55\\xd1\\x79\\x15\\x7a\\x89\\xd1\\x21\\x55\\x5c\\x51\\x15\\x7a\\xef\\xb1\\x8b\\xdd\\x3d\\x8b\\xd1\\x3d\\x9e\\x33\\xfe\\xde\\xfd\\xfd\\x3d\\x3b\\xb3\\x8b\\x95\\x04\\xf9\\xd1\\x6f\\xdd\\x92\\x12\\xb9\\xcb\\x3f\\xf9\\x2e\\xb4\\xb7\\xa9\\x93\\xe9\\xb3\\x20\\x4b\\xcf\\xe2\\x8c\\x4e\\x5b\\x0c\\x53\\xb4\\x6b\\x67\\x36\\xbb\\x06\\xf0\\x03\\x58\\xfd\\x38\\x69\\xf5\\x43\\xec\\x67\\x39\\xce\\x22\\x87\\x39\\xad\\xda\\xc7\\x83\\x6d\\xcf\\x83\\x85\\xed\\x79\\x7d\\x17\\x7b\\x8b\\x26\\x9d\\x97\\x88\\xc8\\x6a\\xcf\\x78\\x07\\x1f\\xb7\\x40\\xb9\\xb1\\x94\\x8a\\xa3\\x67\\x51\\xe2\\x3b\\xd0\\xd4\\x9e\\xe1\\x57\\x02\\x1d\\x8d\\x46\\x65\\xad\\x75\\x20\\x7a\\x97\\x40\\x9f\\xae\\x11\\xa8\\x3a\\x51\\x70\\x48\\x17\\xaf\\x80\\x73\\x28\\x8c\\x8b\\xe5\\xea\\xb7\\xf2\\x70\\xa5\\xd5\\xef\\x12\\x5c\\xbe\\xf2\\x6d\\xc0\\x1d\\xb0\\xf2\\x15\\x30\\xa5\\x9a\\x80\\x7e\\x54\\x70\\x69\\x23\\xa4\\x69\\xfd\\x99\\x6b\\x71\\x7f\\x3e\\xfa\\xcd\\x4d\\xba\\xf5\\x04\\x3e\\x19\\x11\\x2c\\xc4\\x87\\xc8\\x79\\x7e\\xc1\\x76\\x72\\x46\\x02\\xe7\\x38\\xb9\\x01\\x43\\xb5\\x5c\\x75\\xe9\\xdd\\x2f\\xbc\\xfb\\xb0\\x05\\xd5\\x05\\xfa\\xe7\\xd8\\x30\\x32\\x86\\xee\\x17\\x09\\xf7\\x7d\\xf6\\xe9\\x86\\xcf\\x7e\\xff\\xcd\\x7f\\x90\\xdc\\xe9\\xd9\\x2f\\xa2\\xd5\\xec\\xd7\\x76\\x6e\\xf6\\xef\\xb8\\x65\\xb3\\x5f\\xdb\\xab\\xd9\\xef\\xdc\\xa4\\x59\\xf5\\x6a\\xc6\\x09\\x73\\x51\\x63\\x82\\xc6\\xf3\\xa7\\x7b\\xb4\\x33\\x3b\\x6b\\x71\\xaf\\xb6\\x6e\\xb1\\xe8\\x52\\xf1\\x6e\\x18\\x47\\xd2\\xca\\x9d\\xba\\x11\\x92\\x0a\\xe5\\x36\\x2c\\xfd\\x29\\xe5\\x65\\xc9\\x4a\\xbe\\x5f\\x12\\x63\\x06\\xa2\\x77\\x8c\\xf0\\xd6\\xd1\\x82\\x5d\\xce\\xee\\x4b\\x4f\\x96\\x3c\\xff\\xa0\\x7a\\x43\\xc3\\x47\\xa3\\x9b\\x31\\xdc\\x8e\\xe1\\x0f\\x41\\x4a\\xfb\\xd1\\xe8\\x86\\x46\\x61\\xba\\xa5\\xff\\xfe\\xb1\\xd6\\x46\\x67\\x4b\\x77\\x96\\x88\\x54\\x69\\x44\\xa3\\x9b\\xb5\\xef\\x47\\xb7\\x6b\\x2c\\x88\\xde\\xbf\\xc8\\x8f\\x3f\\xd6\\x9a\\xfe\\x75\\x42\\x74\\xda\\x10\\x74\\x04\\xd3\\xbf\\x08\\xca\\xb2\\x71\\x83\\x90\\xe9\\x83\\x90\\x7d\\x4f\\x51\\xd0\\xd6\\xdd\\xae\\x7d\\x3f\\xfa\\x17\\x6d\\xde\\x50\\x94\\xc6\\xc0\\x7e\\x23\\x1d\\xf7\\xb1\\xc4\\x35\\x08\\x19\\xb5\\x78\\x6f\\xc6\\x91\\x08\\xd5\\xcd\\xd3\\xa7\\x11\\x6d\\xd7\\xcd\\x4f\\x3f\\xfd\\x34\\xd2\\xd4\\xc7\\x51\\x47\\xb3\\x96\\x9e\\xc9\\x7a\\x0f\\xe7\\xce\\xc3\\x73\\x3a\\xea\\xee\\xe2\\x3c\\xbc\\xb0\\x13\\xfb\\x12\\xfe\\x59\\x9c\\x71\\x7c\\x4c\\xb3\\x24\\x88\\x2e\\x3e\\x01\\xf7\\xfc\\xa5\\x3e\\xed\\xf9\\xf7\\x2c\\x66\\x73\\x88\\x2c\\x70\\xce\\x90\\x12\\xfa\\x27\\x0a\\x6e\\x10\\x8c\\x34\\xb3\\xb3\\xc0\\x95\\x2d\\xbd\\x9a\\x2f\\x34\\x57\\x42\\xa5\\x13\\x70\\x7e\\xbe\\x34\\x7a\\xc4\\x9b\\xfe\\xa8\\xdf\\xef\\xb9\\x1b\\xc0\\x75\\xde\\x74\\x79\\x07\\xe7\\xe5\\xc3\\xad\\x86\\x73\\x73\\x5e\\xe0\\x2e\\xfe\\xe7\\xb9\\x04\\xed\\xbf\\xdc\\xde\\xf9\\x16\\xe4\\xa7\\x07\\xd2\\xef\\xf8\\x96\\x42\\x49\\xb1\\x9b\\xe0\\x8c\\x5e\\xd6\\xbd\\xa3\\x00\\x92\\x46\\x7f\\x5b\\x02\\x78\\x69\\xbb\\x55\\xf9\\xd9\\xbf\\xb4\\xdd\\x52\\x86\\xaa\\x4e\\xf8\\xd2\\x62\\x54\\x03\\xb1\\x2c\\x4a\\x97\\xb6\\xdb\\x22\\x4e\\x55\\x10\\x9f\\x98\\x2f\\x9c\\xd8\\x63\\x3e\\xaf\\xdf\\xe3\\x37\\xcf\\x9d\\xe4\\x3f\\xbd\\x1b\\x4f\\xac\\x07\\xcf\\xf7\\x07\\xcf\\xf7\\x6f\\x3c\\x8e\\xc3\\x57\\x77\\xc3\\x6c\\xe4\\xd7\\x68\\x27\\x72\\x60\\x8e\\x8c\\xd3\\xfd\\xed\\xc7\\x68\\x65\\x2f\\x8c\\xd3\\xfd\\x6d\\x54\\x3a\\x60\\xf0\\x5f\\x9f\\xd9\\xf7\\x62\\x8b\\x46\\xf1\\x2a\\xdd\\x2f\\x82\\x28\\xc8\\x3a\\xdc\\x9e\\xf2\\x4f\\xdd\\x33\\x03\\xfb\\xae\\x67\\x3b\\xd6\\xb4\\x3f\\x92\\xbd\\x72\\x33\\xb5\\x1c\\xdb\\x73\\x7d\\x5c\\xf3\\xda\\x10\\xd4\\x71\\x35\\x4f\\xc5\\xc8\\x5f\\xbe\\x0a\\x9e\\x7f\\x3e\\x97\\xab\\x47\\x17\\x3e\\xf9\\x13\\xfb\\xb6\\x03\\xfb\\x3e\\xb0\\x03\\x0f\\xaa\\x85\\xa7\\xc8\\xa4\\x94\\x23\\x3c\\x43\\xa6\\xab\\x4b\\xe1\\x09\\x32\\xdd\\x0c\\x14\\x9e\\x1f\\x93\\x52\\xb8\\x38\\x3d\\xee\\x6b\\xab\\xcc\\xf1\\x71\\xe7\\xf9\\xb0\\x78\\xf3\\x83\\x9e\\x42\\x00\\x8b\\x0b\\x26\\x3e\\x87\\x78\\xc3\\x76\\x2c\\xea\\xc1\\x69\\x3b\\x83\\x87\\xe5\\x9f\\x4f\\x5d\\x8a\\xbd\\xf9\\xc9\\x2f\\xde\\xbf\\x39\\x0f\\xe0\\x31\\x68\\xef\\xe0\\x57\\xfe\\xd5\\x2a\\xbf\\x22\\xbd\\xf2\\xdd\\x14\\x9c\\x7f\\x54\\x68\\x1e\\x45\\x34\\xfc\\x19\\xdb\\xc4\\xa3\\x1b\\x22\\x1a\\x12\\xc6\\xcb\\x16\\xee\\x07\\xd1\\xc3\\x8e\\x91\\x4d\\x40\\x1b\\x14\\xb4\\xcd\\x76\\x6e\\x26\\x34\\x1a\\x1a\\x86\\x75\\x8a\\x5e\\xe2\\xdc\\x0e\\x9e\\x82\\x2a\\x7f\\x14\\x34\\x1a\\x39\\xf0\\x3d\\xb8\\x6c\\x7d\\x4c\\xbe\\x7a\\x14\\x9f\\x72\\x63\\xd8\\xcc\\x43\\x4f\\xfe\\xc0\\x0b\\x9e\\x82\\x3e\\x00\\xb1\\x03\\xbf\\x82\\x0b\\xbf\\x82\\xc7\\xf0\\x99\\xd8\\x9b\\x62\\xc7\\x16\\x84\\x5d\\x6f\\xe0\\x33\\x57\\x6b\\x28\\x6b\\x27\\xf9\\xe6\\xf2\\x16\\x3f\\x06\\xe5\\x66\\xa2\\x60\\x5d\\xd7\\x54\\x5d\\x8a\\x82\\xcd\\x1f\\x0a\\x22\\x2c\\x65\\x0d\\x7e\\xd8\\x5c\\xa5\\xdd\\x04\\xab\\x66\\x4c\\x3d\\x0d\\xab\\x3d\\x87\\x02\\x20\\x16\\x20\\xa2\\x00\\x5a\\x22\\x0e\\x54\\x3f\\x44\\x93\\xb8\\x82\\xc3\\x2c\\xa0\\xe4\\x3d\\x7d\\x0a\\x9a\\xc2\\xf9\\x44\\x45\\x50\\x20\\xdc\\x44\\xdf\\x09\\xc8\\xb7\\xef\\x12\\xbf\\x65\\xe8\\x09\\x18\\x3f\\x02\\xca\\x4f\\x8d\\xec\\x9e\\xa0\\x84\\x50\\x3b\\xfd\\xa2\\x07\\x66\\x7d\\xb1\\x8e\\xa1\\x76\\xf2\\x45\\x0f\\xcb\\x5c\\x61\\x71\\xad\\x7a\\x50\\xe6\\x09\\x8b\\xeb\\xd5\\x43\\x32\\xdc\\x53\\xfc\\xe1\\x28\\xab\\xbb\\xfa\\xbf\\xfd\\x51\\x16\\x59\\xbf\\x6e\\xf8\\x61\\x1c\\x27\\xd5\\x73\\xa4\\x4d\\x6a\\xe4\\xf1\\xcf\\x7d\\xe1\\xa3\\xe1\\x46\\x4b\\x24\\xf2\\x67\\x4f\\x4b\\x47\\x4f\\x5f\\xeb\\xd4\\x69\\xf5\\x53\\x06\\xd1\\x11\\xd4\\x5f\\xf3\\xac\\xa1\\xf9\\xf0\\x61\\x6b\\x77\\x09\\xc6\\xd7\\xd8\\xda\\x25\\x2b\\xd7\\x55\\x77\\x75\\x69\\xdd\\xe1\\x1b\\xba\\xf5\\xc5\\x72\\x7d\\x2f\\x97\\xbc\\x7b\\xd8\\xc6\\x15\\x51\\xf7\\x67\\xde\\xc6\\xa5\\x42\\xb3\\xf2\\x0e\\x6e\\xbb\\xec\\x94\\x9b\\xb7\\x5c\\x7e\\xaa\\x15\\x65\\xa2\\x9c\\x90\\x6a\\x72\\xdb\\xb5\\xd3\\xbf\\x52\\x34\\xe0\\x74\\x6e\\xab\\x86\\xf9\\x4d\\x6d\\xe5\\xd2\\x18\\xbd\\x9c\\xae\\x87\\x6d\\xdd\\x2f\\xbc\\xad\\xbb\\xb4\\x57\\xdb\\x56\\xe8\\x74\\x7f\\x5b\\x35\\xcc\\xda\\xde\\x68\\x7b\\x90\\xc1\\x9e\\x7d\\x59\\x55\\xd5\\xef\\xb2\\x33\\x4b\\xaa\\xd7\\xf0\\xd3\\xdf\\x8c\\x90\\x6f\\x6b\\x77\\xd6\\x45\\x8a\\x31\\xc5\\x9e\\x35\\x26\\x8b\\x7a\\x73\\xe2\\x7a\\x86\\x32\\xa1\\xdf\\x95\\x89\\xe2\\x79\\x88\\x7e\\xf7\\x27\\x0a\\x36\\xa6\\x9a\\x70\\xd7\\xd6\\xf7\\x5d\\x45\\x71\\x34\\xba\\xd3\\x6b\\x5a\\x86\\x85\\x0c\\xc4\\xbe\\xeb\\xfe\\xd4\\xf2\\x6d\\x0a\\xcb\\xc1\\xbe\\xad\\xfb\\xb6\\x7e\\x9f\\xbb\\xb4\\x43\\x17\\x8e\\x15\\x53\\x82\\x77\\x49\\x05\\x88\\x5c\\xc8\\x34\\x3a\\xdd\\x16\\xab\\x86\\xc7\\x5b\\xbd\\x6b\\x04\\xb1\\xf3\\xcf\\x83\\xc5\\xfa\\xe7\\xb2\\x58\\x55\\x55\\xbf\\x83\\xcd\\x4a\\x6a\\xaf\\x64\\xb5\\xd6\\xd4\\xc8\\x92\\xdd\\xaa\\xaa\\x43\\x82\\x43\\x3e\\x58\\xae\\x7f\\x46\\xcb\\x95\\x88\\xce\\x5d\\x6c\\xd7\\x56\\x09\\xaa\\x59\\xaf\\x4c\\x8a\\xaa\\x95\\x25\\xed\\x57\\x55\\xed\\x0b\\xd4\\x57\\x89\\xca\\xc7\\x8d\\xa7\\x27\\x96\\xf2\\xe9\\xdd\\xd8\\x52\\x1e\\xdc\\x0f\\x1e\\xdc\\x0f\\xa4\\xec\\xd4\\xbf\\x78\\x24\\xa8\\x03\\x96\\x6d\\x3f\\xf8\\xa3\\x08\\x3c\\x07\\x49\\x7c\\x15\\x79\\xe0\\xd6\\x43\\x44\\xb5\\xf3\\x60\\xbf\\x23\\xef\\x01\\x79\\xf7\\xa2\\xd3\\x71\\x21\\x3f\\x7e\\xc5\\x25\\x92\\xa5\\x42\\x82\\x95\\x04\\x54\\x1d\\x36\\x83\\xf4\\x55\\x12\\x5c\\xe2\\x51\\xa7\\xc7\\x66\\x4e\\x52\\xfa\\x3f\\x49\\x76\\x94\\xef\\x18\\x93\\x1f\\xa3\\xa8\\x67\\x3b\\xb1\\x38\\xff\\x65\\x62\\x08\\x5b\\xa0\\xfe\\x98\\x7f\\x7f\\xba\\xc5\\x80\\xe5\\x0f\\xe4\\x8e\\x84\\xff\\x3e\\x8a\\xe0\\x3b\\x5e\\x63\\x4d\\xe6\\xb4\\x8e\\x2b\\x44\\xdf\\x0e\\xd3\\x8e\\x6d\\xc9\\xfc\\xd3\\x97\\x85\\x58\\x64\\x42\\x66\\xc9\\x55\\xe7\\xa6\\x67\\x3f\\xe7\\x2f\\x70\\xb6\\x97\\xd8\\xf4\\xbb\\x1d\\x3e\\x0b\\xb2\\xb4\\xbf\\x0f\\x0a\\x27\\xdd\\x08\\x1e\\xc3\\x28\\xa2\\xc9\\xe4\\xd6\\xe0\\x87\\xda\\x4e\\x7d\\xcf\\x21\\x4f\\x3b\\x31\\xf9\\xf1\\x76\\x47\\xf2\\x69\\xfa\\x9a\\xca\\x47\\x77\\x7c\\xfa\\xeb\\x79\\x10\\x62\\x18\\xf1\\x62\\x4f\\xa1\\xff\\xb6\\x22\\x3d\\xeb\\x2c\\x44\\x4e\\xa6\\xdf\\x0b\\xc0\\x52\\x17\\x2e\\xf7\\xcf\\x59\\x79\\x9a\\x20\\x6f\\x89\\xc1\\x54\\x76\\x17\\xf1\\xf5\\x28\\x1a\\x03\\x82\\x4d\\x50\\xdb\\x9c\\x8e\\xab\\x9f\\xfe\\xdb\\x8a\\x2f\\x06\\x21\\xd3\\x5a\\x9d\\xa9\\xab\\x1f\\x06\\x6d\\x7d\\x7d\\xa5\\x03\\xce\\xa8\\xab\\x5e\\xcb\\x52\\x66\\xd4\\x4a\\xca\\x67\\x74\\xaa\\x22\\xab\\xff\\xbb\\x2c\\xde\\x97\\x37\\x0f\\xbe\\x92\\x6b\\xd5\\xfe\\x46\\x1a\\x06\\x2e\\x1e\\x29\\x5d\\x92\\xf3\\xe0\\xba\\xf4\\xb5\\x5d\\x97\\xfa\\x4a\\xf9\\xb4\\x94\\x21\\x28\\x75\\x41\\x4b\\xf5\\x79\\xf2\\xd0\\xf5\\x00\\x2d\\x35\\xf9\\x4c\\xce\\x52\\xa6\\x5c\\x26\\xf2\\x6f\\xce\\x59\\xea\\xc2\\xbe\\xbc\\xb4\\x95\\x9b\\xc2\\x65\\x0a\\xf5\\x31\\x7b\\xb9\\x22\\xbd\\x72\\x3c\\xca\\x81\\x3c\\x7d\\x0a\\x2a\\x73\\x62\\xca\\x9f\\xfc\\xf4\\xd3\\x4f\\x30\\x59\\x5b\\x03\\xf8\\x55\\x08\\x14\\xe8\\xd5\\xb3\\x0a\\x28\\xa4\\x2f\\x81\\x42\\xd6\\xda\\x9a\\x2c\\xa8\\x6a\\x3d\\x4d\\xa4\\xca\\x6b\\xad\\x42\\x25\\x3b\\x44\\x17\\xff\\xeb\\xf5\\x2a\\xdc\\x40\\xac\\x09\\x15\\x6e\\xa0\\x9b\\x3c\\xa5\\xad\\x74\\x13\\x6a\\xa0\\xb4\\x65\\x50\\xd3\\x81\\xdc\\xc8\\xeb\\x09\\x53\\xcc\\x43\\x29\\x7c\\xbc\\x9f\\xd7\\x39\\x43\\x68\\x12\\x4f\\xde\\xda\\x75\\x59\\x27\\x3a\\x09\\x37\\x38\\x97\\xc6\\x25\\x1b\\x61\\xf8\\x1e\\x7c\\x7a\\xab\\xe9\\x5f\\xe4\\x6b\\x6b\\x0c\\xfd\\x46\\xcd\\x4b\\x9b\\x66\\xc4\\xb1\\xe1\\x7b\\x70\\x68\\x4d\\x9b\\xf9\\x7b\\xfd\\x0a\\xdc\\xf3\\x4b\\xd0\\x56\\x6a\\x2c\\x07\\x17\\xa4\\x91\\x85\\x27\\x1e\\xf7\\x83\\xe2\\xae\\x78\\xec\\xee\\x18\\x7b\\x83\\xa6\\x95\\x37\\x48\\xab\\xbd\\xaa\\x55\\x12\\xda\\x2a\\x05\\x5e\\x44\\xf1\\x62\\x3a\\x7a\\x58\\x6e\\x55\\x4c\\x41\\x98\\x1c\\x38\\x7b\\x83\\x2a\\x6f\\x10\\xaa\\xbe\\x9a\\xb0\\x3b\\x9f\\xec\\x95\\x6a\\x08\\xcd\\x16\\xea\\x75\\x48\\x90\\xce\\x61\\x3d\\xa7\\x60\\x9d\\x74\\xc0\\x3a\\xbc\\x60\\xa9\\x78\\xc4\\x1e\\x87\\x14\\x86\\x0a\\x5b\\x39\\xe7\\xd6\\x49\\x37\\x08\\xf0\\x12\\x05\\x7c\\xd1\\x0f\\x96\\x68\\xf2\\x9e\\xd4\\xd4\\xe4\\x43\\xa6\\x04\\xc1\\xfa\\x80\\xa6\\x55\\xa3\\x59\\xec\\x91\\xc0\\xed\\x0a\\xe4\\x1d\\xe4\\x7a\\x72\\x4d\\x83\\xbc\\x33\\xdc\\x28\\x23\\xbc\\xce\\x54\\x01\\x5d\\x0f\\x8e\\x71\\x65\\x71\\x69\\xc7\\x38\\x56\\xdc\\xe0\\xc5\\x69\\x96\\x64\\x5f\\x58\\xdc\\xe4\\xc5\\x69\\x16\\xe4\\x0b\\x61\\xf1\\x09\\x2f\\x4e\\xd5\\xe0\\xfc\\xc1\\x4b\\xef\\xc1\\x4b\\xef\\xc1\\x4b\\x6f\\xf9\\xf3\\xe0\\xa5\\x57\\xc5\\xf4\\xe0\\xa5\\xf7\\x70\\xe6\\x79\\xca\\xb7\\x41\\xee\\x72\\xe6\\x69\\x98\\x2b\\x9e\\x79\\x56\\x77\\x5f\\x96\\xcf\\x3c\\x0d\\xf3\\xe1\\xcc\\x53\\x44\\xdd\\x9f\\xfd\\xcc\\xd3\\x30\\xef\\x76\\xe6\\xd9\\x26\\x41\\xf5\\x33\\x4f\\x2a\\x45\\xd5\\xca\\xb2\\x77\\xad\\x97\\x7c\\x8b\\xba\\x3d\\xf7\\x2c\\xf4\\x57\\xf2\\xdc\\xbb\\x31\\xf5\\x6f\\x34\\x09\\x7f\\x41\\xd9\\xc3\\xa9\\xe8\\xb7\\x7e\\x2a\\x7a\\x63\\x52\\x37\\xba\\x8d\\x1b\\xb3\\xe5\\x7a\\x1b\\x29\\xf2\\xd6\\xd4\\x79\\x3e\\x63\\x5a\\x78\\xa3\\x3d\\x85\\xed\\xaa\\xc9\\x76\\xda\\xf9\\x76\\xb2\\x7f\\xfc\\xfe\\x78\\x6f\\xef\\x74\\x76\\xd6\\x95\\x4b\\x9e\\x94\\x7a\\x75\\xf0\\xfe\\xe0\\x68\\x77\\xf6\\x76\\x76\\x0a\\x3d\\xa5\\x4e\\x8e\\x5f\\x1f\\xed\\xbe\\xdf\\x39\\x3e\\x3a\\x3d\\xdb\\x3e\\x2a\\xe0\\x75\\x8c\\x54\\x7a\\x0e\\xbb\\x73\\x97\\x73\\xd8\\x0a\\x9c\\x64\\x1e\\xe7\\x01\\xdf\\xbb\\x8f\\x76\\x73\\x32\\x6f\\x60\\x0b\\xd0\\x18\\x6e\\x25\\xf2\\x46\\x67\\x6c\\x53\\x39\\x83\\xa7\\xa0\\xea\\x3f\\x42\\xd6\\xbf\\xa9\\x5c\\xe1\\xe5\\xf9\\x0d\\xac\\x83\\x01\\x3f\\xc0\\x2d\\x8b\\x09\\x96\\xe5\\x31\\xdf\\xe8\\x37\\x75\\x8d\\x1e\\xa0\\xc1\\x77\\x60\\xf6\\xd9\\xf9\\x74\\x91\\x86\\xaf\\xdf\\xc2\\x16\\xdc\\xc2\\x77\\x60\\x08\\x96\\x73\\xf8\\xfa\\x17\\x82\\x4b\\x85\\x1f\\x80\\x60\\xd7\\x08\\xf6\\xb5\\xfe\\x7a\\x37\\xec\\xa4\\xe6\\x6d\\x77\\x89\\x5b\\x56\\xe2\\x97\\x41\\x47\\xa3\\x95\\x9e\\x59\\x04\\x10\\xd0\\x2c\\xf9\\xfd\\xfd\\x52\\x70\\xfc\\x86\\x71\\xfc\\x86\\xc5\\x7b\\xbb\\xe9\\x67\\x78\\x51\\x8b\\xf5\\x25\\xdc\\xb2\\x5a\\xb7\\xe2\\xbd\\xff\\x52\\xa0\\xeb\\x3d\\x75\\x0b\\xeb\\x30\\x6a\\x61\\x21\\xe9\\xba\\x1e\\x3e\\x76\\xe5\\x74\\x15\\xca\\x6d\\xdd\\xe5\\xa1\\x53\\x64\\x0f\\xf7\\x4e\\x4f\\x48\\x13\\x6f\\x94\\x8e\\xbb\\xb9\\x6d\\xc7\\x20\\xaa\\xf8\\x18\\x84\\xd4\\xa0\\x34\\xe4\\x03\\xf1\\x65\\x7a\\xdd\\x3d\\x2c\\x5a\\x6b\\x1c\\xe6\\x35\\xc4\\xbd\\xc4\\x72\\xfa\\xc3\\x6f\\xf0\\x14\\x26\\x3f\\xc2\\x6f\\x72\\x27\\x34\\xb4\\xe9\\x34\\x6c\\x9e\\x30\\x34\\x7a\\x4e\\x9f\\x13\\x64\\xaf\\xe2\\x94\\x26\\x41\\x24\\x03\\x02\\x91\\x15\\xfa\\x6f\\x6b\\xf0\\x18\\x04\\x17\\x9b\\x73\\x94\\xd5\\xfa\\x4f\\x41\\x2e\\x30\\x32\\xf9\\x2c\\xf1\\xe5\\xd7\\x2d\\xa0\\xc8\\x2b\\x00\\xc5\\x14\\xd4\\x2f\\x37\\x57\\x69\\xf9\\x69\\x8b\\x12\\x23\\x75\\xcf\\x79\\x89\\x9e\\x97\\x15\\x7a\\x6a\\x50\\x1f\\xf7\\xef\\xb8\\x14\\x64\\xf5\\x96\\x10\\x9c\\x2a\\x54\\x44\\x3e\\xc2\\x37\\x19\\x95\\x67\\xf9\\x9e\\x97\\x8b\\xaa\\xbc\\xb9\\x09\\xaf\\x92\\xe0\\x32\\xc8\\x82\\x0f\\x18\\x16\\x71\\x78\\x1b\\xc5\\x97\\x81\\x1d\\x42\\xfc\\x01\\x27\\xf0\\x7c\\x6f\\xa4\\xae\\x3d\\x81\\x9b\\x5f\\x2d\\x58\\x87\\x9b\\x5f\\x4d\\xfa\\xaf\\x41\\xff\\xd5\\x89\\x6a\\x16\\x42\\xe7\\x23\\x90\\x11\\xc5\\x42\\x0f\\xfc\\x0a\\xca\\xcd\\x44\\xee\\xae\\xbc\\x98\\x7a\\x0e\\x77\\x4b\\x24\\xa3\\x2b\\xf9\\xdb\\x34\\x26\\x66\\x76\\x98\\xc4\\xad\\x8d\\x3c\\xeb\\x4c\\x53\\x58\\xc6\\x4b\\xe2\\xdc\\x99\\xf9\\x7f\\xe9\\x89\\xac\\x8f\\x44\\x4a\\x75\\x43\\x86\\x2f\\x17\\x71\\x62\\x27\\xb7\\x6c\\xeb\\xbc\\xdd\\x4e\\x39\\xeb\\xb0\\x3b\\x64\\xfc\\xb5\\xda\\x74\\xa3\\x38\\x98\\xe8\\x59\\x2b\\x9b\\xee\\xcc\\x84\\x6e\\x47\\x0f\\xed\\x2e\\x6e\\x1e\\x5a\\xcd\\xc9\\x43\\x93\\x74\\xf1\\xf8\\x0a\\x99\\xec\\xe3\\xab\\x6c\\x71\\x95\\x1d\\xd2\\x7d\\xce\\xae\\x6a\\x40\\x57\\xf4\\x1e\\x4e\\x83\\x04\\x7b\\x95\\x94\\xf7\\x4e\\x90\\xa5\\x79\\xe2\\x5a\\x06\\xa7\\x6b\\xef\\x21\\x87\\x73\\x1c\\x85\\xb9\\x58\\x55\\xd2\\x08\\xdb\\x09\\x7e\\x02\\xaa\\xaa\\x8f\\x41\\x35\\xcc\\x31\\x68\\x96\\x3e\\x06\\x03\\xa9\\x3d\\x70\\x78\\x4e\\xfd\\x27\\xa4\\x58\\x47\\xa9\\x9e\\xa4\\xfa\\xf9\\x5e\\xa5\\x4c\\x5e\\xfd\\x2a\\x7f\\xba\\xd1\\xdd\\x5b\\x7e\\x7d\\x7a\\xf2\\x99\\xd9\\x19\\x2e\\xf6\\x44\\xf3\\x5f\\xe7\\xef\\xc4\\x33\\xfa\\xb0\\x11\\x45\\x3e\\x14\\x3a\\x1b\\x59\\x11\\xbe\\x2e\\x46\\x17\\x75\\x10\\x5a\\x2d\\x84\\x2d\\xa5\\x9a\\x6e\\x82\\x9f\\x06\\x7f\\xd0\\xe3\\x46\\x64\\x2a\\x0a\\x3c\\x06\\x62\\xc5\\x15\\xf9\\xfd\\xab\\x6c\\x25\\xd6\\xb7\\xd6\\xe1\\xb6\\xf7\\x05\\x7c\\x90\\xfa\\x0f\\x8e\\x5a\\x3a\\x43\\x74\\x8c\\x93\\xb7\\xfd\\xd0\\x8e\\xe8\\x71\\x42\\x83\\x23\\x9b\\xa0\\x0a\\x4e\\x73\\x9c\\x34\\x4e\\x9c\\x41\\xbd\\xdd\\x40\\x7a\\xff\\x99\\xbc\\x5e\\xaa\\x01\\xd4\\xdd\\x6d\\x48\\x77\\xca\\x1c\\x85\\xbf\\x54\\x03\\xd4\\x52\\x93\\xcc\\xf2\\x92\\x61\\x9e\\x45\\xc1\\xa9\\xc9\\x87\\xd0\\x27\\x9b\\xcf\\x4b\\xad\\x25\\xf2\\x52\\xef\\x98\\xc1\\x4b\\xad\\xa5\\xee\\x52\\xef\\x3b\\x67\\x17\\x6f\\x1c\\x1a\\xd0\\x3a\\x54\\x6f\\x1e\\xba\\x6b\\xfb\\x50\\xbd\\x81\\x68\\xc5\\x16\\x8a\\xba\\x9a\\x89\\x7d\\xb1\\x91\\x1d\\x44\\x59\\xcc\\x46\\x9f\\x50\\xc4\\x42\\x9b\\x1e\\x41\\xe5\\xba\\xac\\x9f\\x99\\xa4\\xf0\\xc6\\x3c\\xb8\\x98\\x13\\xf3\\x9b\\x34\\x47\\xa2\\x78\\x18\\x5f\\x03\\x2f\\xbe\\xaa\\x63\\xc2\\x09\\xb1\\xde\\xba\\xc7\\x59\\x31\\xa8\\xd9\\x12\\x94\\x0e\\x6c\\xf6\\x95\\x2d\\x1c\\xe9\\x77\\xa9\\x31\\x7d\\x36\\xc7\\x99\\xdd\\x5b\\x68\\xb5\\xc5\\x7d\\x05\\xc5\\xcb\\xe0\\x06\\xdc\\x38\\xbc\\xba\\x8c\\x28\\x7b\\xfa\\xb5\\x07\\xe4\\x2e\\x31\\x7c\\x2d\\x3b\\x86\\x72\\x8d\\x2a\\xaa\\xb7\\xfa\\x86\\x42\\x15\\x73\\x4d\\x3c\\xca\\xed\\x05\\x31\\x7a\\xf2\\xc9\\x17\\x6a\\x85\\xd8\\x48\\x56\\x3b\\xac\\x54\\x0b\\xe3\\x6b\\x99\\x05\\x9d\\x0c\\xeb\\xcf\\x44\\xc6\\x79\\xf3\\x43\\x8d\\x75\\xd2\\xd1\\x67\\xe7\\x37\\x12\\x4d\\x3e\\xbb\\x61\\x63\\x63\\x8b\\x36\\x5c\\xaa\\x3c\\x1d\\x1c\\x5b\\xb4\\xc5\\x77\\xf1\\x40\\xbf\\xb3\\x54\\xca\\x4d\\x66\\x50\\xf0\\x44\\xa7\\x4c\\x19\\x11\\x81\\xd0\\xe9\\xa6\\x92\\xa4\\x3f\\xe3\\xd9\\x0d\\x2a\\x6b\\xa2\\x81\\x35\\xd9\\x20\\x38\\xbb\\x41\\x92\\xb2\\xc4\\xab\\x1d\\x16\\xd5\\xa8\\x2c\\xc9\\x0e\\xd2\\xf4\\x2a\\xa1\\x8a\\x23\\x88\\x2e\\xf8\\x80\\x1d\\x34\\x56\\xcf\\x6e\\x74\\xae\\x29\\x61\\x34\\xe2\\xc4\\x17\\x61\\xfe\\x38\\x55\\x3c\\xd6\\x9f\\xc4\\x8e\\x05\\x05\\x7c\\x58\\x00\\x66\\x3a\\x95\\x01\\x3e\\x6c\\x00\\x7e\\x39\\x08\\xf0\\x37\\xa0\\x25\\x6a\\x93\\x8a\\xdc\\xc8\\x81\\xe6\\xe4\\x22\\x1e\\x40\\x70\\x0f\\xfb\\x3e\\x27\\xf3\\x18\\x5e\\x05\\x72\\x23\\x91\\x90\\x77\\x40\\x77\\x8b\\xb7\\x00\\xfd\\x58\\xf9\\xc9\\x96\\x17\\xc5\\xef\\xcf\\x34\\x44\\x6b\\x3d\\x52\\x20\\x93\\x1c\\x6b\\xa4\\x3c\\x93\\xe2\\x01\\x9a\\x3b\\xaf\\x78\\x58\\x56\\x94\\xd2\\xdd\\x74\\xe2\\x9e\\xc7\\xc7\\xcc\\xc2\\xdd\\xaa\\x9d\\x3c\\x54\\x09\\x97\\xe1\\xd1\\x49\\x4c\\x57\\x1c\\x72\\x13\\x6b\\xe0\\xc3\\xa8\\x44\\x3c\\x64\\x73\\xb4\\x32\\xcc\\x47\\x39\\xaf\\x9e\\x3e\\x2d\\x5b\\x41\\x87\\x62\\xce\\x0b\\x32\\x16\\x47\\x9a\\x0a\\x8f\\x2b\\xef\\x25\\x06\\x26\\xd4\\x47\\x7d\\x01\\xae\\x15\\xcf\\xcb\\xd5\\xf1\\xd4\\xb7\\x68\\x4b\\x7e\\x0c\\xdd\\xa0\\x6d\\xf2\\x84\\xd3\\x5a\\x81\\x48\\x37\\x67\\x97\\x49\\x36\\xf5\\xfb\\x60\\xcd\\x4b\\x01\\xba\\xc3\\xd5\\xd1\\x49\\x1a\\x17\\x89\\x1d\\xa5\\x8b\\x38\\x95\\x95\\x3e\\x3a\\x39\\xbd\\x0a\\x0e\\xd9\\x38\\x3d\\x3b\\xaf\\x9c\\xe2\\x94\\x52\\x2f\\x63\\x74\\x30\\x18\\x03\\x2d\\x0f\\x5e\\x69\\x80\\xf9\\x21\\xa3\\x1b\\x17\\x01\\xd8\\x19\\xb5\\x41\\xe8\\x6c\\x22\\x5c\\x7b\\x9c\\x29\\xb4\\xe9\\xa2\\xdc\\x8e\\xc5\\x56\\x82\\x52\\x68\\x34\\x51\\x95\\x33\\x25\\x67\\x08\\xab\\x28\\xa1\\xc3\\xce\\x94\\x9c\\x1d\\xbc\\x8a\\xd8\\x5a\\xd8\\xdc\\x84\\x9d\\xb9\\xe4\\x7c\\xb0\\x92\\x65\\x76\\xf7\\xd9\\x79\\xd0\\xc4\\x01\\x15\\x35\\x9e\\xcf\\x5d\\xc5\\x6c\\x2e\\x3f\\x2e\\x57\\x9e\\x7b\\x72\\x00\\x67\\xc5\\xa8\\x58\\xa9\\xf6\\x0d\\x2a\\xea\\x8f\\x2a\\x86\\xe6\\xda\\x40\\xbb\\x84\\xc1\\x52\\x1b\\xb0\\xd4\\x25\\x58\\xb2\\xfd\\x40\\x8c\\xca\\x24\\xbe\\x96\\xeb\\x86\\xb0\\x32\\xa6\\xcf\\xca\\x01\\xfe\\x2b\\x8c\\xfe\\xc5\\xdb\\xc7\\x1e\\x7c\\x9f\\x93\\x48\\x7f\\x4a\\x2a\\xcf\\xb0\\x32\\xf6\\xcf\\x4a\\x45\\x50\\x05\\x4e\\x1f\\x94\\xc0\\xc3\\xb8\\xeb\\xc8\\xa4\\xfa\\xb9\\xab\\x7d\\x75\\x10\\x0b\\x56\\xdf\\x4b\\xd2\\x25\\xa3\\x3a\\x6a\\x67\\x3f\\xc4\\xc0\\x68\\x9c\\x20\\xd1\\xf7\\x43\\x36\\x3e\\x6a\\x00\\x25\\x34\\x4b\\xcd\\x52\\xad\\x57\\x26\\x3a\\x66\\xf0\\x51\\xfc\\x9f\\xf7\\x0a\\x40\\x5f\\x9d\\xcf\\x7b\\x03\\xa0\\xaf\\x6a\\xb1\\xbd\\x4c\\x40\\x2c\\xef\\x39\\xff\\x40\\x37\\xd8\\x7b\\x37\\x9d\\xef\\xe1\\x0a\\x01\\xba\\xe3\\x0d\\x02\\x7a\\x37\\xc0\\xc5\\x41\\x58\\xf7\\xed\\x47\\x6b\\xb0\\x59\\x6f\\xe0\\x1a\\xfc\\xd0\\x7c\\x40\\xe9\\xa0\\x4e\\x05\\xc5\\x7d\\x86\\x3f\\xa1\\xc3\\xff\\x67\\x3a\\x93\\xa8\\x9e\\xb6\\xe4\\x6d\\x6e\\x3d\\x8a\\x81\\x4d\\x91\\xa0\\x55\\x4b\\xe7\\x07\\x1c\\xcb\\xe0\\x37\\x45\\x37\\x56\\x4e\\xff\\xe7\\x0a\\xe3\\x3f\\xba\\xb7\\x76\\x73\\x47\\xef\\x7c\\x04\\xb6\\x9d\\x35\\xe7\\x9f\\xb6\\x03\\x91\\x25\\x32\\xef\\xff\\x48\\x64\\xd0\\xae\\xf3\\x4a\\x4b\\xd2\\xae\\xe5\\xe8\\x7d\\x1d\\x9a\\x94\\x04\\x49\\x1d\\x2d\\x54\\xd6\\x28\\xfc\\x74\\xa1\\xba\\x08\\x5a\\xf5\\x80\\xa1\\x02\\x95\\x9f\\x31\\x54\\xa1\\xde\\xef\\x41\\x4a\\xc9\\x4c\\xe9\\x06\\x1f\\x2e\\x35\\xf8\\xf0\\x1e\\x1a\\x7c\\xb8\\xd4\\xe0\\xc3\\x95\\x1b\\x2c\\x94\\x06\\x36\\xd4\\xb8\\xd6\\xc8\\x62\\x48\\x70\\x96\\x04\\xf8\\x03\\xee\\xbf\\x48\\x04\\x3c\\x10\\x21\\xd3\\x8b\\x8b\\xab\\x74\\x9e\\xd3\\x29\\x60\\x72\\x4b\\xa5\\x97\\xbd\\x95\\x3e\\x57\\x3e\\xd4\\x96\\x98\\x17\\x05\\x6d\\xe3\\x65\\xa5\\x35\\x30\\x0a\\xc6\\xfd\\xdf\\x94\\x92\\xd2\\xf9\\xfc\\xda\\x54\\xcb\\x14\\x50\\x84\\xf3\\x18\\xa6\\x29\\x87\\x3b\\x0a\\xe4\\x5f\\xcb\\x9b\\x5a\\x5d\\x95\\xc4\\x31\\x87\\x1e\\xee\\x70\\x35\\x80\\xff\\x89\\xef\\x70\\x69\\x77\\xb8\\xc1\\xa5\\xad\\x76\\x7f\\x4b\\xeb\\xb9\\xbd\\xd5\\x1a\\xd8\\xe2\\xe1\\xee\\x56\\x15\\xe6\\x9f\\xfc\\xee\\x96\\x76\\xa7\\x9b\\x5b\\x2d\\xb2\\x53\\xbb\\xb7\\xa5\\xad\\x7e\\x6b\\x4b\\x93\\x8b\\x55\\x59\\x5c\\x16\\x7a\\x62\\x19\\x9f\\xde\\x8d\\x2d\\xf5\\xaf\\x79\\x87\\xab\\x19\\x94\\xdd\\x40\\xea\\x37\\x7c\\xb1\\x2b\\x0f\\xd1\\x4e\\xa8\\xfc\\xf7\\xb8\\xe4\\xf5\\xd9\\x2e\\x78\\xdd\\xe3\\x0d\\x2b\\x5e\\xb2\\xbc\\x0d\\x96\\x17\\xbf\\x87\\x78\\xee\\x06\\x52\\x6b\\xde\\xba\\x06\\x6a\\xdb\\x2b\\xe9\\xf3\\x14\\xb6\\xee\\x14\\xcf\\x9d\\x54\\xaf\\x79\\x0b\\x5b\\x3c\\x8c\\xae\\x81\\xd4\\xcf\\x1c\\x12\\xae\\xca\\x56\\x99\\x90\\xee\\x4b\\x3e\\xa2\\xca\\x8d\\xeb\\x38\\xce\\xd4\\x33\\xbc\\x71\\x25\\xde\\xfb\\xda\\xb8\\xad\\xa4\\xa9\\x4e\\x6d\\x75\\xaa\\xda\\xd5\\x68\\xf0\\x6b\\xfd\\x61\\xdf\\x5b\\xa0\\x4c\\x91\\x31\\x55\\x90\\x61\\x57\\xe3\\xc8\\xb7\\xe3\\x43\\x86\\xea\\x63\\x97\\x45\\x9f\\xcf\\xa3\\xcc\\x0f\\xc7\\x67\\x4e\\x34\\x4d\\x35\\x4d\\x16\\xab\\x9e\\xc7\\xa0\\x6f\\xc7\\x67\\x61\\x47\\xd7\\x6d\\x6b\\x52\\x8d\\x50\\x3f\\x1c\\x9f\\xe7\\x28\\xae\\x8a\\x15\\xaf\\x1a\\xdb\\xbe\\x1d\\x9f\\x3e\\x71\\x0c\\xdd\\x42\\x5e\\x35\\xf2\\x7d\\xf7\\x6a\\xf1\\x8b\\x87\\xbe\\x27\\xd2\\x7b\\xf7\\xd0\\xf7\\xa8\\x2d\\xb7\\x42\\xfe\\x79\\x88\\x7d\\xff\\x6f\\xb7\\x86\\xb0\\xee\\x12\\xfb\\x9e\\xd4\\x5e\\x6d\\x1d\\x51\\x55\\xb9\\xcb\\x2b\\x09\\xeb\\x21\\xf6\\xbd\\x90\\xba\\x3f\\xfb\\x5a\\xc2\\xba\\x5b\\xec\\xfb\\x56\\x09\\xaa\\xaf\\x27\\xac\\x15\\x63\\xdf\\x6b\\x96\\x7c\\xec\\x7b\\x62\\x95\\x3e\\xb1\\xb4\\xb6\\xd5\\x85\\xf6\\xd7\\x5c\\x5d\\x7c\\xb3\\x0b\\x89\\x87\\xc5\\xc3\\xdd\\xa2\\x43\\x7c\\xad\\x60\\x0f\\xf7\\xb2\\x14\\x59\\xee\\xab\\x9c\\xa3\\x1c\\xfc\\xfb\\xfc\\x82\\x63\\x87\\xbd\\xc5\\xf5\\x44\\xfd\\x3a\\xe4\\x86\\xbd\\x58\\x84\\xb7\\x23\\xfe\\x70\\x0c\\x76\\x72\\x71\\x75\\x89\\xa3\\xac\\x6d\\x6f\\xbb\\x65\\x6f\\xb6\\x1a\\xa4\\xa2\\xb5\\x19\\x34\\x96\\x7f\\x2b\\x39\\x0d\\xaa\\x95\\x1b\\x5d\\xb5\\x6c\\xd5\\x9f\\x52\\xe3\\xdb\\x9b\\xa8\\x96\\x8d\\x55\\x75\\x6d\\xbc\\x5c\\x6e\\x82\\xb4\\x89\\xae\\x4f\\x69\\x2a\\x27\\x55\\xc3\\xbe\\x69\\xb8\\x5e\\x87\\xd1\\xbc\\x54\\xd7\\x31\\x5c\\xc5\\x77\\x5c\\x9f\\x26\\xff\\x77\\x75\\x4f\\x73\\x54\\xbf\\x0d\\x07\\x9e\\x3a\\x86\\xe7\\xd8\\x06\\x29\\x67\\x21\\x6b\\xea\\x39\\x8e\\x2b\\x8b\\x43\\x9b\\x1a\\xa6\\xab\\x1a\\x0e\\x35\\xff\\x35\\xdd\\x72\\x0c\\xcd\\x6a\\xc3\\x61\\x4c\\x7d\\x84\\x90\\x4f\\xdb\\xe1\\x98\\x8a\\xe1\\x29\\xa8\\x6b\\xb1\\xb1\\x54\\x77\\xaa\\x6a\\xbe\\xa5\\xda\\x3a\\xa9\\x6b\\xfb\\x68\\xaa\\xfb\\x53\\xa7\\x0d\\x87\\xed\\x20\\xd7\\xc0\\x1e\\x6d\\x87\\x67\\x9b\\x9e\\x85\\x90\\x25\\x8b\\xc3\\xb3\\x94\\x89\\x6d\\xb3\\xfe\\xb0\\x35\\x45\\x53\\x54\\xbd\\xb5\\x3f\\x90\\x6a\\x69\\x86\\xa3\\xd0\\x76\\xe8\\xc6\\x44\\x31\\x7d\\x07\\xcb\\xe2\\x50\\x75\\x0d\\x59\\x86\\x83\\x69\\x5d\\x8c\\x75\\x47\\xb5\\xdc\\x56\\x5e\\x19\\x8a\\x3b\\xf1\\x5c\\x8d\\xb6\\xc3\\xf0\\x7d\\x47\\xc7\\xaa\\x2c\\x8e\\x89\\xea\\x60\\xc3\\x9b\\x50\\x5e\\xf9\\xea\\xc4\\xb1\\xa6\\x66\\x6b\\x9f\\x5b\\x8a\\x87\\x1d\\xe4\\x53\\x5a\\x34\\x07\\x99\\x53\\xd3\\xe9\\x5a\\x8c\\x2d\\xf7\\x87\\xe3\\xb9\\x8a\\xc9\\x52\\x8a\\xa9\\x86\\x3b\\x41\\xaa\\x66\\xb4\\xe1\\x70\\xd1\\xd4\\xf1\\x11\\xa3\\xc5\\xf5\\xcd\\xa9\\x6a\\x4e\\x75\\x59\\x1c\\x58\\x9f\\x3a\\xe6\\xd4\\xa5\\x7c\\x9e\\x62\\x1f\\xe9\\xb6\\xd7\\xda\\x1f\\xd8\\x77\\xb0\\x3e\\xb1\\x4c\\xda\\x0e\\x4b\\xf7\\x55\\x03\\x6b\\xb2\\x38\\x14\\xdf\\x45\\x53\\xcf\\xa5\\x75\\x2d\\xc7\\x72\\x3d\\xc3\\x69\\x6d\\x87\\xaa\\x2b\\xae\\x8d\\x5c\\x97\\x94\\x9b\\x4c\\x6c\\x77\\xea\\x9a\\x86\\x74\\x9f\\x7b\\x78\\xaa\\xba\\x26\\x1d\\x83\\xc6\\x54\\x75\\x14\\x75\\xd2\\x8a\\x43\\xb7\\x27\\xba\\xa5\\xdb\\x74\\xd9\\x6e\\x62\\xdb\\xc4\\xba\\x25\\xdd\\x0e\\xc3\\x75\\x14\\x7b\\xea\\x51\\xfa\\x1c\\x4f\\x47\\xbe\\xe3\\xe9\\xad\\xba\\xc4\\xf4\\xa7\\x96\\xe5\\x51\\x1c\\x96\\x86\\x90\\xa1\\x39\\xd2\\xed\\x98\\x5a\\x1a\\x36\\x90\\xa1\\x52\\x5d\\x82\\x4d\\xd3\\xf3\\xed\\xf6\\x31\\x68\\x69\\xc8\\x35\\x4d\\xba\\xe8\\x56\\x3d\\x47\\xd7\\x54\\xa4\\x48\\xeb\\x2b\\x45\\xd1\\xd4\\x89\\x4b\\xc7\\xe0\\xd4\\xf2\\x1d\\x15\\x69\\xad\\xb2\\xeb\\xf8\\xc6\\x74\\xe2\\xbb\\x3c\\xa5\\x1d\\xf6\\x15\\x8c\\xa5\\xe5\\xca\\x35\\xb1\\xa2\\x38\\x3e\\x1d\\x5b\\x9a\\x67\\x5b\\x96\\xef\\xb6\\xca\\x95\\x67\\xd8\\x93\\x29\\xd2\\x29\\x8e\\xa9\\xa6\\xd8\\xf6\\x44\\x95\\xe6\\x95\\x62\\xba\\xb6\\xa9\\x19\\x54\\x76\\xb1\\xa2\\x68\\x96\\xda\\x3e\\x06\\x91\\xae\\x4e\\xd5\\x29\\xdb\\x3a\\x51\\x6c\\x05\\x9b\\x78\\x22\\xcd\\x2b\\x75\\xe2\\x4c\\x14\\xdb\\xa2\\xba\\x4e\\x37\\x3d\\x55\\xf5\\xfd\\x56\\x5d\\xa2\\x62\\x44\\xf8\\x48\\x79\\x6a\\xb8\\xaa\\xe9\\x4e\\x55\\x53\\x16\\x87\\xee\\xa9\\xae\\xe9\\xf9\\x54\\xae\\x0c\\xdb\\xd5\\x55\\x1b\\x7b\\xad\\xfa\\x4a\\xd3\\x2c\\xc5\\x43\\x94\\xa7\\x53\\x6f\\x6a\\x38\\x9a\\xe7\\xcb\\xe2\\x30\\x0d\\xc5\\x9e\\x68\\x86\\xce\\xc6\\xa0\\xed\\x9b\\x9a\\x87\\xdb\\x65\\xd7\\xb4\\x15\\xdb\\xa1\\xf3\\x8c\\xe6\\x4e\\x26\\x8e\\x6a\\x4b\\xeb\\x76\\x0b\\xb9\\xaa\\x3b\\x55\\x99\\xde\\x9d\\x60\\xcf\\xc6\\xd8\\x6c\\xc3\\x31\\x55\\x27\\xaa\\xea\\x32\\x9e\\x22\\xdd\\x52\\x35\\x43\\x73\\x64\\x71\\xd8\\xaa\\xe3\\x63\\xcb\\x66\\xf3\\x82\\xeb\\x23\\x45\\x33\\x5b\\xc7\\xa0\\x6d\\x21\\xdb\\x34\\x75\\xda\\x0e\\xc7\\xd5\\x55\\x4d\\x51\\xa4\\xf5\\xae\\xab\\xea\\x8e\\xe5\\x4c\\x14\\x3a\\x2f\\x28\\xbe\\x35\\x9d\\x4c\\x51\\xab\\xde\\x9d\\x98\\xae\\x81\\x6c\\xda\\x1f\\x8a\\x69\\xe8\\x0e\\xd6\\xa4\\xe5\\xca\\x43\\x53\\x15\\x5b\\x68\\x4a\\x71\\x98\\xd8\\x37\\x54\\xd4\\x3a\\x9f\\x7b\\xe6\\x74\\xaa\\x98\\x2a\\xed\\x37\\xc3\\x30\\x0d\\x7b\\x2a\\x3f\\xce\\x7d\\x5d\\xc1\\x9a\\xc1\\xf8\\x6c\\x4c\\x26\\x48\\x55\\x54\\xbb\\x75\\x7c\\x28\\xa6\\x6d\\x2b\\xac\\xbd\\x9a\\xea\\x38\\x1e\\x72\\xa4\\xfb\\x1c\\x4d\\x6d\\xdd\\x45\\x88\\xea\\x76\\xc7\\xf2\\x54\\x4f\\x71\\x5b\\xdb\\x81\\xb0\\x36\\x31\\x5d\\x85\\x8d\\x0f\\xa4\\x23\\xdb\\x31\\xa4\\xf5\\xae\\x3a\\xd1\\xad\\xc9\\x44\\xa7\\xe3\\xc3\\xf3\\x2d\\x8c\\x9d\\xe9\\xb4\\x0d\\x87\\xa6\\x3b\\x8a\\xe3\\x3a\\xb4\\xbd\\x18\\x4d\\x1d\\xdd\\x92\\x97\\x5d\\x6d\\x8a\\x5c\\xc5\\x75\\x68\\x5f\\xba\\x86\\x3b\\x35\\x6c\\x53\\x6b\\x9d\\x3f\\xb0\\x67\\xd9\\xb6\\x4e\\x75\\x3b\\xd6\\x74\\x64\\xd9\\xae\\xb4\\xec\\x1a\\xce\\xd4\\x75\\x6d\\xdd\\x67\\xf3\\x9b\\xa9\\x61\\x6d\\xd2\\x8a\\xc3\\xb4\\x54\\x6c\\xfa\\x4c\\x77\\x7a\\xa6\\xa3\\x3a\\x96\\x2d\\xcd\\xab\\x89\\x6e\\xf9\\x96\\x8a\\xe9\\x18\\x34\\x3c\\xec\\x3b\\x6a\\xbb\\xbe\\x9a\\x58\\xb6\\x61\\x6a\\x6c\\xbe\\xd4\\x35\\x34\\x51\\x7d\\x53\\x5a\\xae\\x2c\\xdd\\xb5\\x26\\x16\\x62\\x76\\x22\\xf2\\x15\\xdb\\x99\\xb4\\xea\\x76\\xcb\\x75\\x27\\x8a\\xca\\xfa\\x1c\\xd9\\xa6\\xae\\x4d\\xb1\\xb4\\xbd\\x3b\\x55\\x1c\\xec\\xfb\\xbe\\xcd\\xec\\x71\\x53\\x43\\x58\\x6d\\x95\\x2b\\x5b\\x37\\x14\\xd3\\xc5\\x74\\x9c\\x7b\\xd8\\x52\\x1d\\x0f\\x4b\\xdb\\xbb\\x0e\\xf6\\xa7\\xb6\\xe6\\xb3\\xf9\\x4d\\x75\\xcd\\xc9\\x14\\xb5\\xdb\\x57\\xe6\\x04\\x4d\\x2c\\x9f\\xcd\\xc9\\xda\\x44\\x35\\x34\\x55\\xba\\xcf\\x5d\\x5b\\x9d\\x68\\xd8\\xa5\\xfd\\x81\\x6d\\xd5\\x34\\xd1\\xb4\\xb5\\x3f\\x3c\\x64\\x99\\x8e\\xc5\\xe6\\x5a\\x95\\x88\\xa2\\xda\\x79\\x28\\xb1\\x6c\\x9b\\xd9\\x9e\\x3d\\xf1\\x3c\\x3a\\x06\\x5d\\x0f\\x2b\\xd8\\x41\\xad\\xba\\xdd\\x37\\x26\\x9e\\xee\\x4f\\x7c\\x6e\\x5b\\x60\\x0f\\x4d\\xa4\\xc7\\x87\\x62\\xfa\\x8a\\x39\\x61\\x76\\xd3\\x44\\x45\\x13\\xd3\\x77\\x5a\\x75\\x89\\x62\\x9b\\xda\\xc4\\x73\\xe9\\x18\\xb4\\x55\\xd7\\x9a\\x5a\\xb6\\xf4\\x3c\\x88\\x90\\xe6\\x4f\\x2d\\x45\\xe7\\x07\\x09\\x53\\xc5\\xb3\\x5b\\xdb\\x81\\x9c\\x09\\x52\\x1c\\x8d\\xcd\\x1f\\x1a\\x72\\xf5\\x09\\x92\\xee\\x0f\\xd5\\xf2\\x9c\\xc9\\xc4\\x37\\x98\\x5c\\x29\\xfa\\xc4\\xb3\\x5a\\xe7\\x0f\\x4d\\x75\\x6d\\xdb\\x99\\x50\\xb9\\xd2\\x15\\x77\\xa2\\xea\\x53\\xe9\\x31\\xa8\\xb9\\x53\\xec\\x60\\x85\\xf2\\x0a\\x19\\xee\\xd4\\xc1\\x4e\\x6b\\x9f\\xeb\\x1a\\xf2\\xcc\\x89\\x4b\\xdb\\x3b\\x75\\x91\\xa2\\x78\\xba\\xf4\\xf8\\xd0\\x5d\\xd7\\xf0\\x74\\xb6\\xc6\\x71\\x1d\\x0d\\xeb\\xaa\\xd3\\x3a\\xd7\\x12\\x0b\\x4e\\x9d\\x4e\\xa9\\xee\\xf4\\x5d\\xd3\\x98\\x60\\x32\\x07\\x48\\xea\\x2b\\xdf\\x75\\x4c\\xdf\\x66\\xb6\\x80\\xed\\x99\\xbe\\x8d\\x5b\\xdb\\x61\\xba\\xba\\x8e\\xa6\\x16\\xc5\\xa1\\xdb\\xfa\\xc4\\xb0\\xd0\\x64\\x79\\x17\\xa8\\x23\\xe6\\x63\\x33\\xf6\\x53\\xeb\\x82\\xff\\xcd\\xfd\\x86\\x79\\xb2\\x14\\xa1\\xaf\\xd9\\x9b\\x5a\\x98\\xa7\\xf7\\x9f\\x3f\\xcc\\x93\\x81\\xd4\\xbb\\x1c\\xde\\xb6\\x1c\\x1e\\x7f\\xa9\\x7c\\x5e\\xf7\\x70\\x78\\x6b\\xda\\xca\\x14\\xe7\\x87\\x9b\\x9a\\xe3\\xba\\x53\\xa5\\xe3\\xf0\\xd6\\x71\\xcc\\x89\\x8d\\x99\\x4d\\x63\\xe9\\xae\\x6d\\x4f\\x3a\\x6d\\xc7\\x1e\\x7c\\x9a\\x6b\\x62\\x5f\\x9b\\x50\\x8d\\xee\\xe3\\xa9\\xee\\x5b\\x44\\xa3\\xb7\\x95\\xb4\\x0d\\xdd\\xf7\\x0d\\x8d\\x8e\\x65\\xc3\\x47\\x9e\\x66\\xfa\\x2b\\x1c\\xa6\\x1a\\x48\\xc1\\x86\\xca\\x34\\xaf\\xed\\x61\\xd3\\x52\\xbd\\x8e\\xc3\\xdb\\xa9\\xa3\\x18\\xa6\\xc5\\xc6\\x92\\xea\\x68\\xd8\\x74\\x51\\x97\\x8d\\xdf\\x83\\x0f\\xf9\\x96\\xe6\\x4d\\xd9\\xc8\\xf5\\x1d\\x1d\\x39\\x9e\\xd9\\xd1\\x3e\\xc3\\xc1\\x8a\\xeb\\x31\\x3b\\x14\\x69\\x13\\xac\\xa2\\xc9\\xf4\\x5e\\x0f\\x6f\\xbf\\x4c\\x78\\xa4\\x81\\x39\\xda\\x68\\x15\\x45\\x2a\\xef\\xda\\x3e\\x92\\x4a\\xbc\\xb6\\xaf\\x4a\\x65\\x5e\\xdb\\xd7\\xa4\\x52\\xaf\\xed\\xeb\\x52\\xb9\\xd7\\xf6\\x0d\\xa9\\xe4\\x6b\\xfb\\xa6\\x54\\xf6\\xb5\\xfd\\x89\\x38\\xfd\\x1a\\x63\\x1c\\xcd\\xd3\\x26\\xba\\x08\\xca\\x8a\\x86\\xac\\x68\\xef\\xf5\\x75\\xc6\\x66\\x0a\\x54\\x14\\x8f\\x82\\x15\\x0d\\x59\\x51\\x31\\x50\\x95\\x02\\x55\\x65\\x80\\xaa\\x21\\x2b\\x2a\\x06\\xaa\\x51\\xa0\\x9a\\x0c\\x50\\x2d\\x64\\x45\\xc5\\x40\\x75\\x0a\\x54\\x97\\x01\\xaa\\x87\\xac\\xa8\\x18\\xa8\\x41\\x81\\x1a\\x32\\x40\\x8d\\x90\\x15\\x15\\x03\\x35\\x29\\x50\\x53\\x06\\xa8\\x19\\xb2\\xa2\\x62\\xa0\\x13\\x0a\\x74\\x22\\x03\\x74\\x12\\xb2\\xa2\\xfd\\x57\\x50\\x86\\x67\\x61\\x64\\x42\\x2d\\xc0\\x6e\\x33\\x79\\xee\\x49\\xe2\\x42\\x6f\\xc1\\x31\\x59\\x16\\xc0\\x72\\x98\\x18\\x0b\\x60\\xb9\\x4c\\x84\\x05\\xb0\\x5c\\x26\\xbd\\x02\\x58\\x1e\\x93\\x5c\\x01\\x2c\\x8f\\x09\\xad\\x00\\x16\\x66\\x02\\x2b\\x80\\x85\\x99\\xac\\x0a\\x60\\xf9\\x4c\\x4e\\x05\\xb0\\x7c\\x26\\xa2\\x02\\x58\\x17\\x4c\\x3c\\x05\\xb0\\x2e\\x98\\x64\\x0a\\x60\\xcd\\x99\\x54\\x0a\\x60\\xcd\\x99\\x40\\x86\\x82\\x1c\\x3a\\x92\\x81\\xb7\\x86\\x99\\xa9\\x20\\x99\\xc7\\x34\\xa7\\xf5\\x4d\\xc0\\xf2\\x26\\x4a\\x84\\xbc\\x9b\\x51\\xa3\\x31\\x77\\xe4\\xe8\\x2d\\x3d\\x2c\\x65\\x26\\xa3\\x83\\xb0\\xf6\\x4d\\x90\\xdf\\xcb\\xae\\xe6\\xcf\\x84\\x1f\\x40\\x7d\\x47\\x4b\\x0a\\x13\\xc3\\x95\\xe0\\x42\\x06\\x8e\\xdf\\xc4\\x6e\\x82\\xa3\\x51\\xfe\\xee\\x31\\x2d\\xe7\\xe6\\x26\\x3c\\xa7\\x49\\x17\\xa5\\xa8\\xcb\\xd3\\x5c\\xae\\x9a\\xc1\\xf3\\x66\\x5e\\x24\\x79\\xbc\\x19\\x10\\x41\\x86\\xd7\\x08\\x2b\\x95\\xa5\\xa3\\xc8\\xb0\\x0a\\xf3\\x5a\\xee\\xd0\\x39\\x4b\\x6c\\x58\\xcd\\xf8\\x19\\xd2\\x4c\\x8c\\x79\\xaa\\xc3\\x5a\\x39\\x6b\\xa9\\x1c\\xbd\\xa8\\xf6\\x2b\\xd4\\x8b\\x4d\\x24\\x23\\x36\\xb1\\x4a\\x61\\x8d\\xa0\\x70\\x99\\xa0\\x79\\x1b\\x41\\xe1\\x32\\x41\\xf3\\x2a\\x41\\xf5\\x72\\x93\\xe5\\x72\\xe2\\x84\\x8d\\x50\\x11\\x0a\\x71\\xd4\\xe8\\x0f\\x95\\x34\\xa6\\x2b\\xe6\\x31\\x2d\\x65\\x02\\x0d\\x96\\x09\\x54\\xca\\x04\\x1a\\x2a\\x13\\x68\\x5e\\xcb\\xa0\\x3a\\xcf\\xb3\\x9c\\x56\\x12\\x9f\\x86\\x3c\\x17\\x6a\\x85\\xb7\\x88\\x77\\x4c\\xbd\\x18\\xbd\\xbd\\x38\\xad\\x08\\x45\\x0e\\xaf\\x99\\xa8\\xa6\\x9f\\xa2\\xb0\\x46\\x51\\xd8\\x42\\xd1\\xbc\\x8d\\xa2\\x70\\x89\\xa2\\x79\\x8d\\xa2\\x3a\\x40\\x73\\x09\\x9e\\x6a\\xca\\x4a\\xc5\\xa0\\x34\\xad\\x92\\xfa\\x6e\\x52\\x0a\\xce\\x44\\x52\\x70\\xde\\x04\\x13\\xa6\\x74\\x45\\x66\\x56\\xa3\\x52\\xc8\\x2b\\xc9\\x85\\x7c\\x63\\x95\\x90\\x59\\xd1\\x76\\xa2\\xdc\\xb3\\xd5\\x6a\\x8c\\x42\\x24\\x32\\x2f\\x9b\\xd5\\xc2\\xbc\\xda\\x10\\x22\\x4b\\xcd\\x18\\x92\\x1e\\x08\\x26\\x3d\\xe6\\x40\\xbd\\x66\\xa9\\x90\\xe7\\xac\\xe6\\x9c\\x26\\x88\\x20\\x20\\x89\\xb0\\x28\\x6b\\xf0\\x34\\x57\\x21\\xc5\\x93\\xff\\x05\\x08\\x9e\\x40\\xdf\\xb5\\xc8\\x65\\xea\\xc8\\xbf\\xb9\\x90\\x0c\\x22\\x8e\\xfc\\xbb\\x5e\\x8c\\xd8\\x0e\\xda\\xd0\\x3d\\xd0\\x46\\x99\\x3f\\x9c\\x32\\xd6\\xd5\\xcb\\x74\\xb1\\xbe\\x5c\\xa2\\x4a\\x08\\xbf\\xb4\\x24\\xde\\x04\\x12\\x62\\x53\\x5a\\x0a\\x6f\\x02\\x01\\xf5\\x52\\x89\\x91\\x79\\x66\\xe4\\x39\\x7c\\x0f\\xfe\\x9c\\xe7\\x46\\x26\\x3f\\x84\\x61\\x64\\x58\\x75\\xa6\\xc1\\x70\\x48\\xaa\\x87\\xbc\\x3a\\xf9\\x71\\x11\\xca\\x25\\x57\\x9e\\xd3\\xec\\xca\\x04\\xa1\\xc3\\xb0\\xd3\\xef\\x2e\\xfb\\xee\\xf0\\xef\\x52\\x90\\x42\\x0a\\x89\\xe0\\x76\\x18\\x21\\xf4\\xbb\\xcb\\xbe\\x3b\\xfc\\xbb\\x74\\xb6\\xe6\\x39\\x4b\\xd7\\xcc\\xf5\\x2a\\x9b\\x80\\xed\\x90\\x65\\xc6\\x5c\\x63\\x51\\x17\\xed\\x79\\x9e\\xcc\\x99\\xbf\\xac\\xa5\\x73\\x9e\\x57\\xf2\\x95\\xdb\\xf9\\xf4\\x2c\\x9b\\xb4\\x99\\xee\\x3d\\x8c\\x0a\\x98\\x1c\\xfd\\xbc\\x8e\\x3e\\xac\\xa1\\x9f\\xd7\\xd1\\x87\\x55\\xf4\\xf3\\x81\\xe8\\x11\\x6b\\x3d\\xe6\\x53\\x24\\xbb\\x62\\x8f\\xd9\\xe4\\x68\\xe5\\xc9\\xa1\\xe7\\x79\\xce\\xf4\\xca\\x4b\\xbd\\x7c\\x49\\xd0\\x6b\\xf9\\x3b\\x96\\x57\\x54\\x1a\\x3d\\x6b\\x3d\\xaf\\x97\\xa3\\x9f\\xd7\\xd1\\x87\\x35\\xf4\\xf3\\x3a\\xfa\\xb0\\x8a\\x7e\\x5e\\xa2\\x17\\x2d\\x1c\\xc4\\x89\\xab\\x85\\x2d\\x78\\x41\\xa3\\x7c\\xbf\\x90\\x0a\\x67\\xf1\\x82\\xaa\\x95\\x17\\x81\\x64\\x20\\x8b\\x17\\x54\\x79\\xbd\\x08\\x24\\x66\\x8a\\x0f\\x34\\x0b\\x37\\x29\\x3e\\x0f\\x8b\\xe6\\x08\\xd4\\x05\\xab\\x43\\x28\\x9a\\x97\\x2c\\x60\\x9a\\x2e\\x43\\x55\\x4d\\x37\\x1f\\xa8\\x7c\\x4b\\x62\\xc8\\xbf\\x84\\xa7\\xd2\\x94\\x64\\x94\\x00\\x77\\xde\\x46\\x86\\x7b\\x57\\x3a\\x5e\\x88\\x14\\x68\\x93\\x8e\\x17\\x41\\x1b\\x1d\\x2f\\x82\\x3b\\xd2\\x21\\x54\\xe4\\x4d\\x3a\\xde\\xb4\\xd2\\xf1\\xa6\\x8d\\x0e\\xa1\\xc4\\x37\\xd3\\xac\\x8b\\x09\\xa1\\xdb\\x8d\\xb9\\x9a\\xa2\\x75\\x64\\xc8\\xa7\\xfb\\x99\\xb9\\x6e\\x5d\\x67\\xaa\\x9f\\xb6\\x41\\xad\\xb6\\x21\\x07\\x3b\\xb8\\x1d\\xaf\\x17\\x9e\\x9d\\x61\\xb8\\x96\\xde\\x38\\x23\\x1f\\xba\\x49\\x22\\x1a\\x79\\x74\\x8f\\xe4\\x42\\xd0\\x44\\x3a\\x7f\\xfb\\x02\\x48\\x74\\xe7\\xc6\\x17\\x40\\xa2\\x1b\\x4a\\x58\\x00\\x89\\xee\\x27\\x61\\x01\\x24\\xba\\x81\\x35\\xf2\\x42\\x9a\\xaa\\x3e\\x94\\xc8\\x55\\x4f\\xf7\\xc5\\x46\\xde\\x9c\\x56\\x60\\xbd\\x83\\xab\\x9d\\xe3\\x2d\\xf5\\x8b\\x4c\\x02\\x7c\\x02\\xd4\\x15\\xb4\\x87\\xee\\xdb\\xb9\\x82\\xf6\\xd0\\xed\\x44\\x47\\x00\\x89\\xee\\x26\\x3a\\x02\\x48\\x74\\x93\\xd3\\x16\\x40\\xa2\\x7b\\x9c\\x7d\\x39\\xaf\\xc9\\x87\\x6e\\xaa\\x8e\\xd8\\x30\\xce\\x54\\x19\\x26\\xd3\\xcd\\xda\\x11\\xe3\\x2f\\x19\\x14\\xeb\\xe5\\x3c\\xcf\\xb8\\x9c\\x2d\\xdb\\xb6\\x5f\\x36\\x9f\\x7f\\xe5\\xe0\\x83\\x1a\\x77\\xfb\\x74\\x98\\xdb\\x7d\\x06\\xdd\\x7e\\x11\\x68\\x73\\xb4\\x4f\\x87\\xb7\\xcd\\x1a\\xb6\\xaf\\x54\\x5b\\x66\\x2f\\x37\\xac\\x07\\x64\\xe5\\xa8\\x84\\x91\\x41\\x99\\xec\\xf4\\x92\\x81\\x4a\\x32\\x28\\x83\\x1d\\x4e\\x46\\x4d\\x4f\\x3a\\x83\\xc8\\xa8\\x1c\\xae\\x30\\x32\\x54\\x3a\\x85\\xf5\\x92\\xa1\\x96\\x64\\xa8\\xf3\\xdc\\x88\\x18\\xd1\\xaa\\x95\\xe9\\x6b\\x10\\x19\\x95\\xe3\\x18\\x46\\x86\\x46\\xc8\\xf0\\x7a\\xc9\\xd0\\x4a\\x32\\x34\\x42\\x81\\xc7\\xc9\\xd0\\x04\\x83\\xba\\x07\\x64\\xe5\\x00\\x87\\x91\\xa1\\x13\\x32\\x70\\x2f\\x19\\x7a\\x49\\x86\\x4e\\x28\\xc0\\x9c\\x0c\\xbd\\x4a\\x06\\x1e\\x44\\x46\\xe5\\xc8\\x87\\x91\\x61\\x10\\x32\\xfc\\x5e\\x32\\x8c\\x92\\x0c\\x83\\x50\\xe0\\x73\\x32\\x8c\\x2a\\x19\\xfe\\x20\\x32\\x2a\\x87\\x44\\x8c\\x0c\\x93\\xae\\x79\\x7b\\xc9\\x30\\x4b\\x32\\xe8\\x32\\xf2\\x82\\x93\\x61\\xd6\\xd6\\xb8\\x83\\xc8\\xa8\\x1c\\x2b\\x31\\x32\\x26\\x84\\x8c\\x79\\x2f\\x19\\x93\\x92\\x0c\\xba\\x03\\xc0\\x2d\\x2c\\x52\\xb5\\xcf\\xd0\\xfb\\xfc\\x37\\xa0\\xbf\\x74\\x30\\xca\\xde\\x4a\\x9f\\x37\\x1a\\x65\\x1f\\x0f\\xee\\x23\\x98\\xa4\\xa5\\xdc\\x31\\x9a\\x64\\x3d\\x86\\x24\\x59\\x86\\xd2\\x35\\x17\\x11\\x8e\\xa7\\x2c\\xfa\\xad\\xa6\\xbc\\x83\\x2d\\xa0\\x51\\x27\\xfd\\x30\\x8e\\x93\\x51\\x85\\x63\\x9b\\xa0\\xdc\\x20\\x85\\x7f\\xee\\x0f\\x23\\xa2\\x99\\xb6\\x0a\\x34\\xfd\\x70\\xbf\\xc9\\x10\\x95\\x3b\\x71\\xf4\\x01\\x27\\x2c\\xd3\\x1b\\x64\\x31\\x68\\xea\\x63\\x27\\xc8\\x88\\xed\\xea\\x81\\x4d\\xef\\xc4\\x39\\xd8\\x8f\\x13\\xcc\\x6f\\xa8\\xf5\\x89\\x40\\xe5\\x16\\x77\\xc5\\x87\\x24\\x8b\\xdf\\x6a\\xaa\\x88\\x8a\\xd5\\xa3\\xc2\\xf5\\x04\\x0b\\xf8\\x62\\x91\\xde\\xba\\x2a\\xf3\\xe0\\x6e\\xcb\\x3c\\x29\\x22\\xad\\x89\\x5a\\xd7\\x17\\x4f\\xad\\xa3\\x79\\x45\\x20\\xd5\\x27\\x80\\x14\\x55\\xdf\\xd4\\x96\\x53\\xdc\\x3d\\x04\\x4d\\x90\\x83\\xf1\\x95\\x82\\x26\\x18\\x48\\xbd\\x43\\xd0\\x04\\x52\\x7b\\xa5\\xa0\\x09\\x35\\x57\\xc7\\xa5\\xa0\\x09\\x06\\x52\\x1f\\x82\\x26\\x88\\xa8\\xfb\\x93\\x07\\x4d\\x20\\xa2\\x73\\x97\\xa0\\x09\\xad\\x12\\x54\\x0b\\x9a\\xc0\\xa4\\xa8\\x5a\\x59\\x32\\x68\\x42\\x3d\\x88\\xd3\\x80\\x20\\x6c\\xfa\\x5f\\x29\\x4c\\x02\\x8e\\xdc\\xc7\\x8e\\x9d\\x62\\x53\\x6f\\xbc\\xb8\\xf4\\x8c\\x66\\xd1\\x0f\\x8b\\xdf\\x3d\\xbf\\xf1\\xd0\\x0d\\x16\\x73\\x9c\\x7c\\xa3\\x91\\x16\\x2a\\x8d\\xa3\\xbf\\x49\\x9b\\xd8\\x0b\\xd6\\x14\\xfa\\xbd\\xda\\x82\\x87\\x88\\x0c\\x77\\x8b\\xc8\\x50\\x0f\\x8b\\x10\\x06\\x8e\\x28\\x2c\\x02\\x75\\x4e\\xde\\xa1\\x3d\\x50\\x54\\xa9\\x3c\\xeb\\x22\\x44\\x14\\x4b\\x61\\x73\\x13\\x5e\\xe1\\xe4\\x92\\x9a\\x84\\x3b\\xf3\\x38\\x70\\x31\\xa0\\x9e\\xac\\xfe\\x04\\xe8\\xab\\x1d\\xd4\\x19\\xdb\\xc0\\x98\\x8c\\x41\\x9f\\x8e\\x41\\x47\\x63\\xd0\\xb4\\x31\\xa8\\xc6\\x18\\xd0\\x64\\x0c\\xd3\\x31\\x00\\x6a\\x77\\x11\\x37\\xac\\x31\\x18\\xca\\x18\\x74\\x75\\x0c\\x9a\\x3e\\x06\\xd5\\x1c\\x03\\xb2\\xc6\\x80\\x94\\x31\\xa8\\x1d\\x55\\xa6\\x63\\x30\\xd0\\x18\\x74\\x6d\\x0c\\x9a\\x31\\x06\\x75\\x32\\x06\\x34\\x1d\\x03\\x22\\x58\\xdb\\xab\\x98\\xca\\x18\\x0c\\x75\\x0c\\xba\\x3e\\x06\\xcd\\x1c\\x83\\xa9\\x8d\\xc1\\x30\\xc6\\xa0\\x4f\\xc6\\xa0\\x4d\\xdb\\xeb\\x68\\x68\\x0c\\xaa\\x36\\x06\\x64\\x8c\\x61\\x32\\x06\\x30\\xd5\\x31\\x18\\xfa\\x18\\x74\\x9a\\x78\\xb9\\xa3\\x0e\\xa1\\x5a\\x1d\\x03\\xd2\\xc7\\x60\\x92\\x3a\\x68\\x0c\\x86\\x36\\x06\\xdd\\x18\\x83\\x36\\x69\\xaf\\xa3\\x4e\\xc7\\xa0\\xa2\\x31\\x20\\x42\\xd3\\x18\\x40\\xb5\\xc6\\xa0\\x2a\\x63\\x40\\x84\\xde\\xa5\\x1a\\x1d\\x77\\x54\\x9a\\xbd\\xa8\\x0a\\x7b\\x51\\xed\\xec\\x45\\x42\\x3c\\xe9\\x35\\xc2\\x4f\\x95\\x7c\\x1f\\x03\\x18\\x1d\\xed\\xe5\\xf4\\x12\\x1e\\x91\\xf6\\xd2\\x76\\x28\\x1d\\xed\\xd4\\x78\\x37\\x91\\x76\\x91\\xb2\\xe6\\x18\\x3a\\xd8\\x88\\x4c\\xc6\\x72\\xd2\\xb3\\x94\\x15\\x5a\\xa7\\x30\\x10\\x51\\x23\\x3d\\x4b\\x7a\\x4b\\x9b\\xb0\\x1e\\x35\\xba\\xa8\\x25\\x72\\xa6\\x70\\xe1\\x31\\x98\\x88\\xea\\x1d\\x24\\x10\\x49\\x21\\xa2\\xac\\x11\\x61\\x33\\x99\\x6c\\x1a\\x1d\\xd2\\x45\\x24\\x82\\xc8\\x2f\\x91\\x63\\x22\\x5d\\xa4\\x47\\x5b\\xd6\\x06\\x1d\\x5d\\xb7\\x73\\x75\\x79\\x15\\xda\\x34\\xf9\\x3f\\x59\\x1e\\xa6\\xf3\\xc0\\xcf\\x04\\xbd\\xf7\\xec\\xe0\\xec\\xfd\\xe9\\xfe\\xc1\\xde\\xd9\\x29\\xe9\\x44\\xd2\\x3f\\xea\\x18\\x28\\x53\\x49\\x27\\x58\\x64\\xb4\\x71\\x01\\xa2\\x7d\\xc9\\x47\\x21\\xe2\\x82\\xa6\\xf2\\x91\\x49\\xb9\\x6b\\x75\\x50\\x75\\xfa\\xec\\xf8\\x2d\\x4e\\xc1\\x8e\\x3c\\x9e\\x5d\\x75\\x41\\x25\\x8c\\x25\\x55\\xef\\xa7\\x8e\\x54\\x7d\\xff\\xaa\\x53\\xbc\\xba\\x57\\x84\\xca\\x8d\\xf2\\x84\\xee\\x67\\x58\\xaa\\xd2\\x21\\x44\\xac\\x58\\xbe\\xdd\\xc0\\x4a\\xf7\\x97\\x55\\x6b\\x65\\x2d\\x45\\xe9\\x10\\x24\\x56\\x5a\\xab\\x94\\xee\\x2d\\xa8\\x57\\x0b\\xf6\\x53\\x60\\xd4\\x29\\x50\\xfb\\x29\\x30\\xeb\\x6d\\x13\\x94\\x9e\\x34\\x38\\xd1\\x4f\\x89\\x55\\x23\\xba\\x17\\xf0\\xb4\\x49\\x46\\x2f\\x60\\xbb\\x5a\\x5a\\x50\\xd6\\x69\\x76\\x48\\x6f\\x69\\xb7\\x41\\x47\\x5f\\x59\\xaf\\xc9\\x8c\\xde\\xd2\\xb8\\x52\\xba\\x97\\x04\\xbf\\xde\\xb8\\x5e\\xa0\\x96\\x24\\x4c\\x64\\x0d\\x91\\x09\\xd5\\x92\\xa7\\x40\\xb3\\xe4\\xc7\\x86\\xde\\xa4\\xa2\\x5f\\x8e\\x2d\\x69\\x91\\x37\\xad\\x21\\x83\\x6e\\x62\\x49\\x0e\\x3a\\xcb\\x1a\\x22\\x94\\x53\\x4b\\x5e\\x28\\xed\\x26\\xc1\\xfd\\x22\\xdc\\xa4\\xa3\\x97\\x6a\\xd7\\x1a\\x22\\x96\\x9e\\x25\\x2f\\xf0\\xd8\\x92\\x1e\\xcf\\x7e\\x93\\x88\\x7e\\xf1\\x94\\x91\\x1e\\xae\\x85\\x91\\xb0\\xdb\\xd4\\x4a\\x41\\xb1\\x98\\x69\\xb5\\xd2\\x22\\x4a\\xf5\\x3a\\x6c\\x01\\xc3\\x8c\\x6a\\x69\\x91\\x0c\\x57\\x9b\\xd7\\x5f\\x74\\x52\\x27\\x59\\x4e\\x47\\x20\\xb9\\xb1\\x3f\\x6d\\x36\\x50\\x46\\x11\\x23\\x39\\x59\\x73\\xea\\xec\\xe8\\x97\\xe2\\x1a\\x3b\\x64\\xf4\\x30\\x92\\x1b\\xa6\\xb8\\x51\\x5a\\x42\\x15\\x23\\xa1\\x7e\\xb5\\x86\\xb0\\x18\\x59\\x43\\x58\\xac\\x5a\\x43\\xe4\\x53\\xb3\\xa4\\xa5\\x48\\x6f\\x00\\x96\\xd0\\xc5\\x92\\xfd\\x6c\\x5a\\x92\\x23\\x75\\x62\\xc9\\x0b\\x84\\x65\\xc9\\xf7\\xdb\\xd4\\x1a\\x32\\x40\\x6c\\x4b\\x5a\\xd4\\x9c\\x66\\x47\\xf7\\x1b\\x13\\x4d\\x32\\x7a\\x4b\\x7b\\x96\\xa4\\xb0\\x61\\x4b\\x5e\\xab\\xf8\\x4d\\x59\\x5b\\x5e\\x27\\x00\\x3b\\x82\\x68\\x7b\\x2c\\xb4\\x9d\\x75\\x45\\xb1\\x74\\xa5\\x6b\\x09\\x06\\x55\\xbd\\xcd\\x8b\\xcb\\x18\\xcf\\x85\\x94\\x49\\xe8\\xed\\x9c\\x0a\\x45\\x40\\x85\\x5e\\xa7\\x42\\x54\\xdc\\xa8\\x43\\x17\\x11\\x6e\\xd6\\xa1\\x8b\\x8a\\x4f\\xca\\xe2\\xfd\\x64\\x54\\x67\\x51\\x11\\xd0\\x69\\x93\\x86\\x7e\\xd0\\x76\\x93\\x21\\x52\\x66\\x34\\xa7\\xa4\\x1f\\xb4\\x5b\\xeb\\xc6\\xfe\\xb2\\x5e\\x59\\x56\\x46\\x6d\\x33\\x72\\xfb\\x41\\xfa\\x4d\\xc9\\x90\\x59\\xa5\\xc8\\x76\\x1d\\xb2\\xe4\\xf9\\xa0\\x5a\\x92\\xdd\\xac\\x35\\x69\\x10\\xc8\\xb2\\xd5\\x10\\x4e\\x81\\x2c\\x5b\\x83\\x7a\\xda\\xb4\\xe4\\x07\\xe1\\xc4\\x1a\\x34\\x08\\x2d\\x4b\\x5e\\x30\\xa6\\x96\\x9c\\x60\\xd8\\x96\\xb4\\x7a\\x71\\x9a\\xd4\\x4a\\xa9\\x6f\\x59\\x95\\xe1\\x59\\xf2\\x63\\x15\\x37\\x7b\\x50\\x4a\\x8b\\xcb\\x08\\x7f\\x75\\xaf\\xa2\\xbf\\x20\\x1a\\xa6\\x40\\x91\\x3a\\x4c\\xbf\\x20\\x6d\\x98\\x0a\\x45\\xfa\\xb0\\x61\\x8b\\x0c\\x59\\x25\\x8a\\xcc\\x01\\xba\\x0b\\x4d\\xe4\\xa7\\xab\\xea\\xaa\\x5a\\x08\\x77\\x3a\\x60\\x6e\\x43\\xf6\\x00\\x0d\\x8a\\x9c\\x61\\x53\\x1b\\x72\\x07\\x4c\\x2a\\xc8\\x1b\\x36\\xb3\\x21\\x3c\\x6c\\x5a\\x41\\x7e\\x53\\x4a\\x44\\xe2\\x3d\\x40\\xff\\x22\\x34\\x40\\x95\\x21\\x75\\x98\\x76\\x40\\x9a\\xbc\\xe2\\x41\\xfa\\xc0\\x49\\xc6\\x18\\xa6\\xe1\\x91\\x29\\x3b\\xd3\\xa0\\xc9\\xb0\\xc9\\x00\\x59\\xc3\\x34\\x15\\x9a\\x0e\\x53\\x9a\\xc8\\x1e\\x36\\xf5\\x21\\x67\\xc0\\x14\\x82\\x5c\\xc9\\x39\\x04\\x79\\x03\\x14\\x2c\\x1e\\x36\\xe7\\x21\\xbf\\x31\\x2f\\xdc\\xab\\x01\\x8e\\x14\\x5d\\x3c\\x1b\\x08\\xdb\\xaf\\xd6\\xfa\\x00\\xc9\\x18\\xde\\x0c\\xb9\\x00\\xbd\\x5e\\x29\\xaa\\xf4\\x17\\x35\\x1a\\x62\\xd3\\x5b\\xd8\\xac\\xf5\\x96\\x80\\x88\\x49\\xad\\xf0\\x20\\x63\\x50\\xca\\xe2\\x2e\\xc9\\x90\\xb0\\xb7\\x73\\xb6\\x49\\xd8\\xda\\x25\\xc5\\xbd\\xcd\\x73\\x1b\\x7d\\xd7\\x5b\\xd8\\xab\\x75\\x88\\x84\\xc1\\x4d\\xe1\\x8a\\x8d\\x6d\\x0e\\x51\\xc8\\x59\\x49\\x5e\\x21\\x6b\\x00\\x03\\x54\\x4b\\x4a\\xc6\\x35\\x6b\\x80\\x8c\\xeb\\xd6\\x00\\x69\\x34\\x2c\\x69\\xa6\\x9a\\x96\\xf4\\x80\\x98\\x54\\x8a\\xf6\\x16\\xb4\\x2c\\xa9\\x8e\\x9a\\x5a\\x92\\x1d\\x65\\x5b\\x03\\xc6\\x8b\\x63\\x49\\x2b\\x03\\xd7\\x92\\x1e\\x00\\x9e\\x35\\x40\\xa6\\xb1\\x35\\x40\\x19\\xf8\\xd6\\x80\\xf1\\x5d\\xb3\\x90\\xc5\\x42\\x8b\\xe4\\xb5\\x1d\\x52\\xe5\\x07\\x22\\xd2\\x86\\x68\\x67\\xa4\\xcb\\x0e\\x48\\x64\\x0c\\xd1\\xa2\\xc8\\x1c\\xa2\\xa0\\xd1\\x44\\x72\\xe2\\xb5\\x86\\x68\\x2f\\x34\\x1d\\xa2\\x9d\\x91\\x2d\\xa7\\xc1\\x90\\x23\\xaf\\x99\\x91\\x3b\\x64\\x32\\x41\\x55\\x75\\xdb\\x4f\\x03\\x96\\x9f\\x54\\x91\\x3f\\x64\\x7a\\xe0\\x06\\xb3\\x2c\\xcf\\x90\\xac\\xd6\\x41\\xea\\x20\\x85\\xae\\xc9\\x29\\x69\\xa4\\xcb\\x2b\\x48\\x64\\x0c\\xd1\\xe8\\xc8\\x94\\xd5\\x7f\\x68\\x32\\x64\\xf6\\x41\\x96\\xbc\\xf6\\x47\\xd3\\x21\\xaa\\x0a\\xd9\\xf2\\xba\\x15\\x39\\x43\\x26\\x2c\\xe4\\x0e\\xd1\\xaf\\xc8\\x1b\\x32\\x21\\x20\\x2c\\x37\\x1d\\x21\\xbf\\x3e\\x1d\\xdc\\xab\\x55\\x6c\\x29\\x8c\\x52\\xa1\\x72\\xcf\\x57\\x86\\x48\\xd1\\xc5\\x06\\x72\\xce\\x81\\xfe\\xa2\\x5a\\x09\\x57\\x17\\x8e\\x37\\x5d\\x6a\\x54\\x18\\x75\\xfe\\x0b\\x2d\\xe3\\x62\\xbd\\x2b\\x20\\x75\\xa2\\xd4\\x56\\x5e\\x52\\xd6\\x5b\\xee\\xd3\\x21\\xb4\\x8b\\x4b\\x59\\x14\\x5a\\xc5\\xac\\xa8\\xd0\\x22\\x2e\\x3b\\x4b\\xc2\\x87\\xa3\\xec\\x81\\x7e\\xc8\\x5e\\x45\\xdf\\x89\\xed\\xe1\\x7c\\x98\\x0b\\x2d\\xe2\\x52\\x0a\\xc5\\x7c\\x95\\x15\\x42\\x64\\x49\\xf1\\x4a\\xb5\\x06\\x34\\x5f\\xb3\\x06\\x30\\x56\\xb7\\xa4\\xe5\\xd0\\xb0\\x06\\x30\\xc1\\xb4\\x64\\x46\\xc1\\xc4\\x1a\\x30\\xb0\\x2c\\x4b\\xb2\\xb7\\xa6\\x75\\x42\\x25\\x4c\\x63\\x39\\xc1\\x76\\x2c\\x49\\xb9\\x72\\xad\\x01\\x23\\xcb\\xb3\\xa4\\x47\\x2c\\xb6\\xa4\\x55\\x96\\x6f\\x0d\\x50\\x1a\\x48\\x91\\xd7\\x1a\\x08\\xc9\\x6b\\x2e\\xa4\\x0e\\x51\\x5d\\x48\\x93\\xb4\\x27\\x64\\x87\\x37\\x32\\x86\\x68\\x0d\\x64\\x2a\\x03\\xc4\\x06\\x4d\\x86\\xcc\\x35\\xc8\\x1a\\xa2\\x40\\xd0\\x74\\x88\\x66\\x46\\xf6\\x90\\xd9\\x09\\x39\\xf2\\xd3\\x1e\\x72\\x87\\xa8\\x68\\xe4\\xc9\\x4f\\x11\\x08\\xcb\\xcd\\x11\\xc8\\x97\\xd5\\xd0\\xcc\\x26\\x96\\xe6\\x02\\x1a\\xa2\\xcb\\x90\\x2a\\xa5\\xcc\\x90\\x26\\xaf\\x4b\\x91\\x2e\\x3f\\xea\\x91\\x31\\x44\\x9d\\x20\\x73\\xd0\\xfc\\x33\\x91\\x9b\\x80\\x90\\x35\\x48\\x9f\\x4c\\x65\\x55\\x35\\xb2\\x87\\x4c\\x56\\xc8\\x19\\x32\\x0f\\x22\\x57\\x56\\x5f\\x23\\x6f\\xc8\\x8c\\x81\\xb0\\xfc\\x94\\x81\\xfc\\xba\\xca\\xbe\\x67\\x93\\x58\\xa4\\xd4\\xf3\\xc6\\x4b\\xf8\\x68\\x14\\xed\\x11\\x19\\xc2\\x4f\\x2a\\x1e\\xd1\\x22\\x3b\\x98\\x97\\xa5\\x7b\\xea\\x22\\x6b\\xb8\\x58\\x6e\\xf5\\x17\\x35\\x73\\xb0\\x12\\x65\\x27\\x65\\xbb\\xfa\\x0b\\x56\\xc5\\x55\\xc2\\x10\\x2e\\x9b\\x25\\xb6\\x84\\x4b\\x76\\xf5\\x93\\xe0\\x94\\xed\\x12\\x92\\xeb\\xd6\\xca\\x0a\\xcc\\x0b\\x19\\xd5\\x85\\xab\\xb2\\xd2\\x8f\\xdb\\xaf\\xf1\\x5f\\xb8\\x3f\\x2c\\x09\\x15\\x59\\xf2\\xbd\\xaa\\x5a\\x8a\\x84\\xf8\\x6b\\x96\\xb4\\xf8\\xeb\\x96\\xa4\\xf8\\x1b\\x96\\xbc\\x48\\x9b\\x96\\x7c\\x1f\\x4d\\x2c\\xf9\\x61\\x65\\x59\\xf2\\xf2\\x37\\xb5\\x24\\xfa\\xde\\xb6\\xe4\\x05\\xcf\\xb1\\xa4\\xc7\\xa9\\x6b\\xc9\\xcb\\xbe\\x67\\xc9\\xcb\\x14\\xb6\\xa4\\x87\\xaa\\x6f\\x49\\x0e\\x7f\\xa4\\xc8\\x2a\\x40\\x84\\x14\\x19\\xe1\\x43\\xea\\x00\\x45\\x89\\xb4\\x01\\x2a\\x0d\\xe9\\xf2\\xaa\\x12\\x19\\x03\\xf4\\x04\\x32\\x07\\xe8\\x6b\\x34\\x91\\x57\\x98\\x85\\xa9\\x25\\x23\\x60\\x68\\x3a\\x40\\xbd\\x20\\x5b\\x7e\\x8a\\x43\\xce\\x00\\xbd\\x8d\\x5c\\xd9\\x89\\x03\\x79\\x03\\x54\\x3c\\xc2\\x52\\x66\\xa4\\x2f\\xaf\\x8c\\xa9\\xd5\\x2b\\x2d\\x3a\\x48\\x7e\\xe8\\x20\\x55\\x5e\\x7d\\x22\\x6d\\x80\\x5a\\x44\\xfa\\x00\\x5d\\x87\\x8c\\x01\\x33\\x88\\x29\\x35\\x2d\\xa0\\xc9\\x00\\xbd\\x8c\\x2c\\x69\\x0d\\x32\\x1d\\xa0\\x45\\x91\\x2d\\xa3\\x97\\x91\\x33\\x40\\x2b\\x22\\x57\\x5e\\x33\\x23\\x4f\\x76\\xbe\\x43\\x78\\xc0\\x64\\x83\\xfc\\x86\\xc6\\xbf\\x57\\x5b\\x97\\xf3\\xa0\\xe3\\xaa\\x25\\xe4\\x6a\\x3c\\xc7\\x2f\\xb0\\x76\\x19\\x44\\x55\\xc8\\x56\\xad\\x2c\\xaa\\x0a\\x90\\xeb\\x25\\xff\\x45\\x04\\x18\\x55\\x3e\\x09\\x6c\\xdd\\xa2\\x60\\x2f\\xf2\\x49\\x6d\\x60\\xcb\\xd8\\x64\\x22\\x1b\\xb7\\xd2\\x96\\x5e\\xcc\\x76\\x4e\\xa2\\xa8\\xd1\\x0e\\x1f\\x9d\\x02\\xbb\\xb6\\xd2\\x33\\xbd\\x45\\xbd\\x0a\\xde\\xde\\x82\\xb8\\xe0\\x61\\x6f\\x31\\xbf\\xd6\\xd3\\x02\\x0e\\xca\\x8a\\x0f\\xb2\\xa4\\xc5\\x47\\xb5\\xc4\\xec\\xd1\\x2c\\x49\\xb9\\xd1\\x2d\\x49\\xe6\\x18\\x96\\xf4\\xe0\\x32\\x2d\\x69\\xf9\\x9e\\x58\\x52\\x2c\\xb7\\x2c\\x49\\xe9\\x9e\\x5a\\x52\\xe3\\xda\\xb6\\xa4\\xa5\\xd6\\xb1\\xa4\\x05\\xcd\\xb5\\xc4\\xe3\\xc5\\xb3\\xa4\\x85\\x07\\x5b\\x92\\xe3\\xc5\\xb7\\xa4\\x87\\x34\\x52\\xe4\\x75\\x0f\\x42\\xf2\\x63\\x0c\\xa9\\xf2\\xea\\x0f\\x69\\x72\\xe3\\x0c\\xe9\\xb2\\xca\\x0f\\x19\\xf2\\x4a\\x0d\\x99\\x8a\\xfc\\x2c\\x31\\x91\\x55\\x59\\xc5\\xa2\\x54\\xdc\\xfa\\xa9\\xcc\\x84\\x6e\\x4b\\xa8\\x40\\xe4\\xc8\\xcf\\x4e\\xc8\\x95\\x9b\\xf0\\x90\\x27\\xaf\\xcf\\x11\\x96\\x57\\x84\\xc8\\x97\\x9d\\x9f\\x88\\x9d\\x2a\\x6e\\x3a\\x92\\x1d\\x1b\\x48\\x95\\xd5\\x84\\x48\\x93\\xd7\\x70\\x48\\x97\\x57\\x71\\xc8\\x90\\xd3\\x71\\xc8\\x94\\x9f\\x02\\xd0\\x64\\xc8\\xcc\\x22\\xaf\\x72\\xd0\\x54\\x5e\\xdb\\x21\\x5b\\x4e\\xd7\\x22\\x47\\x76\\x8a\\x41\\xae\\xac\\x9a\\x47\\x9e\\x84\\xaa\\x45\\x78\\x80\\x5e\\xf4\\xeb\\x33\\xc2\\x67\\x30\\x48\\xfb\\x85\\x3e\\x6f\\xb7\\xae\\x74\\x84\\xae\\x01\\x6e\\x90\\x72\\x6b\\xbc\\xdf\\x14\\xe5\\x58\\x05\\xc0\\xf4\\x62\\xcd\\x20\\x28\\x68\\x88\\x99\\x6d\\x32\\x9c\\xfd\\x96\\x67\\xb9\\x44\\xe9\\x2d\\x68\\x55\\xb8\\x21\\x30\\x3e\\x0b\\xf6\\xf6\\x02\\xb4\\x2b\\x2a\\xa0\\xb7\\xa0\\x53\\xe1\\x88\\x60\\x5b\\xb5\\xb2\\xdc\\xea\\x37\\x3e\\x59\\x87\\xf5\\xa2\\xc5\\x65\\x87\\x09\\x36\\x54\\x2b\\xcb\\xe1\\x5e\\x0e\\x4a\\x72\\x1a\\x59\\xc2\\x8e\\x55\\x2d\\x49\\xd1\\xd4\\x2c\\x49\\xde\\xe9\\x96\\xdc\\xa0\\x30\\x2c\\xc9\\x5e\\x33\\x2d\\x49\\xb6\\x4c\\x2c\\x89\\xce\\xb0\\x2c\\xb9\\xd1\\x33\\xb5\\x24\\xa5\\xd4\\xb6\\x24\\x65\\xc5\\xb1\\xe4\\xc4\\xd9\\xb5\\x24\\x94\\x80\\x67\\x49\\x0e\\x6e\\x6c\\x09\\x47\\xae\\x6f\\xc9\\xc9\\x27\\x52\\x64\\x05\\x14\\x21\\x59\\xcd\\xa8\\xca\\xaa\\x46\\xa4\\xc9\\xea\\x17\\xa4\\x4b\\xea\\x0d\\x64\\xc8\\x6a\\x22\\x64\\xca\\x6a\\x0e\\x34\\x91\\xd4\\xce\\xdc\\xc4\\x11\\x95\\x9a\\xca\\x2a\\x71\\x64\\x4b\\x6a\\x19\\xe4\\x88\\x75\\x39\\x72\\x25\\xe6\\x5f\\x4f\\x56\\x49\\x22\\x2c\\xab\\xa0\\x91\\x2f\\x33\\x01\\x22\\x45\\x56\\x60\\x91\\xac\\x76\\x43\\xaa\\xb4\\x4e\\xd5\\xc4\\x03\\x0a\\xe9\\xb2\\x2a\\x0b\\x19\\x92\\xda\\x12\\x99\\x32\\xca\\x0d\\x4d\\x64\\xb5\\x34\\xb2\\x64\\xd5\\x2f\\x9a\\xca\\x2a\\x38\\x64\\x8b\\xe7\\x1b\\xe4\\xc8\\x2a\\x2e\\xe4\\x4a\\x6a\\x6a\\xe4\\xc9\\x28\\x4c\\x84\\x65\\x15\\x3a\\xf2\\x2b\\x8a\\xfa\\x5e\\x2d\\x45\\x8b\\x18\\xbe\\x6a\\x3f\\xf2\\xa2\\x57\\x7a\\x67\\xed\\x27\\xa5\\x0f\\x48\\xef\\xa4\\xcd\\xa0\\xf5\\x4e\\xd7\\x1c\\x61\\x7f\\x29\\x83\\x21\\x54\\x45\\xe4\\x9b\\x45\\x39\\xc1\\x54\\xcd\\x1b\\x20\\xb4\\x72\\x2c\\x45\\xc8\\x8c\\x69\\xc1\\x5a\\xc1\\x44\\xcd\\x5a\\x2a\\x28\\xe5\\x14\\x58\\xfb\\x5b\\xea\\x3e\\x61\\x01\\x3a\\x7a\\x27\\x69\\xe1\\x70\\xc0\\x45\\x47\\xf6\\x43\\xf2\\x39\\xed\\xfd\\xa5\\x72\\xaf\\x20\\x19\\xe6\\xb2\\x92\\x48\\xb2\\x5f\\x79\\x71\\x55\\x52\\x8a\\x79\\x71\\x4d\\x52\\x4c\\x79\\x11\\x5d\\xb2\\xc3\\x79\\x71\\x43\\xaa\\x3f\\x79\\x61\\x73\\x08\\x03\\x27\\xe2\\x61\\xc3\\x4b\\x5a\\x92\\xfd\\xc7\\x8b\\x4f\\x25\\x84\\x86\\x17\\xb5\\xa5\\xc6\\x25\\x2f\\xec\\x48\\x0e\\x3b\\x5e\\xdc\\x15\\xca\\x25\\x2f\\xe8\\x49\\x0e\\x06\\x5e\\x1c\\x4b\\x8e\\x44\\x5e\\xdc\\x97\\xd2\\x75\\xf9\\xe2\\x59\\xa4\\x38\\x91\\x24\\x0f\\x90\\x2a\\xee\\x5d\\xa4\\x49\\x0c\\x21\\xa4\\x4b\\x36\\x17\\x19\\x92\\x52\\x82\\x4c\\x49\\x7e\\xa3\\x89\\x1c\\xeb\\x24\\xe6\\xe3\\xa9\\x94\\x9c\\x21\\x5b\\x72\\x6c\\x22\\x47\\x76\\xa2\\x73\\x25\\x55\\x0f\\xf2\\xa4\\xc6\\x39\\xc2\\x12\\x63\\x0b\\xf9\\x83\\x34\\x52\\xb9\\x6f\\x23\\x53\\x18\\x49\\xab\\x5d\\xa4\\x0e\\x1a\\x57\\x48\\x1b\\xa0\\xbc\\x90\\x2e\\xab\\xbc\\x90\\x31\\x48\\xdf\\xe6\\xc2\\x29\\xcb\\xbb\\xc9\\xa0\\xb9\\x02\\x59\\x83\\x66\\x22\\x34\\x1d\\xa4\\x78\\x73\\xf1\\x95\\xd4\\x4c\\x4c\\x88\\x65\\x0a\\xba\\x03\\xe6\\x20\\x26\\xc8\\x72\\xcd\\xc3\\x03\\xb4\\x7f\\x2e\\xd4\\x94\\x8c\\x76\\x7b\\x75\\xe9\\x69\\x47\\xa0\\xde\\x97\\x76\\xfa\\x7b\\x0a\\xd9\\xdc\\xce\\x20\\xc5\\x21\\x76\\x33\\x9a\\x0c\\xe2\\xf4\\xd9\\xf1\\x5b\\x08\\xa2\\xc5\\x55\\xb6\\x54\\xa7\\x08\\xd1\\xfb\\x72\\xfb\\xf4\\x45\\x67\\x94\\xde\\x32\\x52\\xd9\\x18\\xca\\x98\\x09\\xe4\\xbb\\xc2\\x7f\\xd0\\xef\\xfc\\x47\\x7b\\x8b\\xc9\\x7b\\x56\\x80\\x95\\x65\\x3f\\xf2\\xef\\xe4\\xc7\\xb8\\xc2\\x11\\xb9\\x06\\xb7\\x27\\xc5\\xd8\\x9d\\x9d\\xb2\\xec\\x2c\\xc0\\xa2\\xd4\\x83\\x1d\\x5e\\xc4\\x49\\x90\\xcd\\x2f\\xdb\\x92\\x43\\x2c\\xe7\\x59\\x20\\x3c\\x21\\x30\\xb6\\x78\\xcc\\xf4\\x0d\\xf6\\xa3\\x12\\x61\\x7d\\x03\\xdf\\x64\\x38\\xf2\\x46\\xed\\x0b\\x86\\xf7\\x5e\\x7c\\x82\\x53\\x9c\\xdd\\x7b\\xf6\\xab\\xdf\\xf1\\x6d\\x91\\xdf\\xe6\\x77\\xdc\\x12\\x1c\\xbe\\x51\\x38\\x4f\\x7d\\xf5\\x3b\\xbe\\x15\\x66\\xbe\\x22\\x44\\x30\\x89\\x31\\x4c\\x70\\x82\\x2c\\x05\\xdb\\x75\\xe3\\xc4\\x0b\\xa2\\x0b\\xc8\\x62\\x78\\xb5\\xd3\\xbe\\x92\\xaa\\x60\\x7b\\x16\\xd0\\x0c\\x0a\\xe7\\x3d\\x39\\x70\\xfd\\x38\\x81\\x11\\x29\\x1e\\xc0\\x16\\x28\\x3f\\x42\\x00\\x4f\\xc1\\x30\\x7f\\x84\\x60\\x7d\\xbd\\x8f\\x41\\x75\\x24\\xaf\\x62\\x82\\xe6\\xd5\\x0e\\x3a\\x0f\\xde\\xc1\\x63\\x40\\xfd\\xa9\\x17\\x39\\x61\\x2c\\xa5\\xfd\\x28\\x67\\xca\\x79\\x09\\x8a\\x27\\xcf\\x22\\x7f\\x46\\x1a\\x82\\xc7\\x15\\x2c\\x34\\x6b\\xd6\\x1a\\x7c\\xdf\\x87\\xa3\\x3f\\x0f\\xe3\\x76\\x9a\\xe2\\x4b\\x27\\xc4\\x80\\x4c\\x48\\xaf\\x9c\\xdf\\xf1\\x6d\\x7f\\x0f\\xa7\\x57\\xce\\x0b\\x7c\\x9b\\x16\\xbd\\x5c\\xfe\\x96\\x62\\x6b\\x74\\x4a\\xcb\\x33\\xe6\\xe6\\x3f\\x9e\\x02\\x32\\x8b\\x5f\\x62\\x46\\x6f\\x6e\\xc2\\x0e\\xcd\\x28\\xc2\\x09\\x16\\xf6\\x4a\\x9a\\xe3\\xe4\\xc4\\x9e\\x73\\x54\\xef\\x38\\xd5\\x22\\x6c\\xb9\\xec\\x0b\\x11\\x39\\x41\\x76\\x4a\\xe3\\xa1\\x6f\\x55\\x62\\x9e\\x17\\xd8\\x24\\x10\\x31\\xf9\\xd6\\xad\\x56\\xf9\\x6e\\x0f\\xbd\\x98\\x7f\\xda\\x24\\x57\\xd5\\xa5\\x24\\xb7\\x8e\\xdd\\x4f\\xe2\\x4b\\xaa\\x94\\x43\\xec\\x67\\xa0\\x5a\\x74\\x50\\x13\\x7a\\x84\\x30\\x18\\x7b\\xcf\\x47\\x01\\x6c\\x82\\x49\\xb3\\x83\\xd2\\x94\\x6f\\xb9\\x80\\x8f\\x46\\xaf\\x76\\x54\\x3e\\x24\\xd6\\x60\\xbd\\xe0\\xd6\\x1a\\x7c\\x07\\xaa\\xf5\\x8e\\x66\\x85\\xa3\\xf2\\x1d\\xc0\\x77\\x60\\xca\\x24\\xa9\\x6f\\x21\\x3a\\x09\\x2e\\xe6\\x2b\\x51\\xad\\xd3\\x4c\\x83\\x25\\xe9\\x6b\\x35\\xda\\x55\\x8b\\xbe\\x66\\x2d\\x80\\x75\\x50\\xf5\\x8e\\x66\\xac\\xb5\\xb4\\xa3\\x0f\\xbb\\x20\\x1b\\x3e\\x69\\x61\\x10\\xb9\\x18\\xb0\\xed\\xce\\xb9\\xbc\\x43\\x90\\x82\\xbd\\x58\\x84\\x01\\xf6\\x88\\x60\\xd8\\x11\\xe0\\x9b\\x85\\x1d\\x79\\xd8\\xcb\\x73\\xb6\\xd1\\x99\\xb4\\x7b\\x5a\\xe7\\x80\\x09\\xbb\\x38\\x44\\xd7\\x8e\\xc0\\xc1\\xe0\\x24\\xf1\\xef\\x38\\x82\\x20\\xca\\x62\\xb0\\x58\\x42\\xd6\\x14\\x52\\xd7\\x0e\\x19\\x26\\x06\\x3d\\x15\\x02\\xbe\\x9e\\x07\\xee\\x1c\\xec\\x30\\x8c\\xaf\\x53\\x8a\\x85\\xa0\\xc8\\x62\\x82\\xe1\\x2a\\xc5\\x1e\\x5c\\x07\\xd9\\x3c\\xbe\\xca\\x18\\xd9\\x69\\x10\\x47\\xbd\\x00\\x79\\xff\\xd0\\x94\\x7e\\xa3\\xf2\\xc7\\xd3\\xa7\\x84\\xfd\\x1f\\xab\\x8f\\x88\\x86\\xd4\\x90\\x80\\xe1\\xb5\\x71\\x82\\xd8\\x38\\x99\\x48\\x0f\\x13\\x8e\\x8c\\xea\\xea\\xf2\\x3b\\x55\\xcd\\xa3\\x80\\x49\\xc4\\x0f\\x40\\x44\\x49\\x13\\xf6\\xbb\\x04\\x9a\\x49\\xb5\\xcd\\x93\\x77\\x3c\\xdb\\xe0\\xc7\\xea\\x23\\x9a\\x5e\\x7f\\xd2\\x83\\xac\\x5f\\xfd\\xef\\xb0\\x0c\\x7b\\x10\\x44\\x1f\\x70\\x92\\x62\\xa9\\x29\\x20\\x88\\x3e\\x9c\\x36\\x66\\x81\\xda\\xa3\\xa1\\xf3\\x2b\\x92\\x9b\\x5f\\x4b\\x1c\\x55\\xf6\\xa7\\xe7\\xc8\\x20\\x43\\xad\\x07\\x67\\x3b\\xab\\xbb\\xb2\\xe6\\xe1\\xc8\\x4d\\x6e\\x17\\x19\\xb5\\xa5\\xaa\\xf6\\xd1\\xcb\\x31\\xc4\\xbe\\x9f\\xe2\\xac\\x8f\\x4e\\x9e\\xf6\\x33\\xde\\x29\\x40\\x94\\xf5\\xc6\\xf5\\x19\\x73\\x60\\xce\\x52\\x0f\\x7f\\x66\\xb2\\x4a\\xf6\\x0e\\xcf\\xa6\\xba\\xd3\\x4f\\xda\\x38\\xef\\x2b\\x81\\x8d\\xf9\\x1c\\x67\\x1d\\x8b\\x80\\x7a\\x43\\x42\\x8a\\x0a\\xb6\\xe0\\xe5\\x39\\x43\\xd0\\xd3\\xf9\\xac\\x46\\xd2\\xac\\x01\\xeb\\x80\\xfa\\x26\\x64\\x9a\\xa1\\x3a\\xc8\\x02\\x3b\\xac\\x66\\x12\\xe9\\x2c\\x8e\\x6f\\xdc\\xb9\\x1d\\x5d\\xe0\\xc3\\x93\\x32\\x1d\\x24\\x4b\\x1b\\xa3\\xdc\\x28\\x3e\\xfb\\x5f\\xcf\\x18\\x6d\\xaf\\x8e\\xcc\\x7c\\xed\\xe1\\xfb\\xbe\\x4c\\xf5\\x93\\xc3\\x6a\\x75\\x95\\x62\\xd7\\xf8\\x67\\x70\\x75\\x8b\\x11\\xaf\\xf8\\x3e\\xf9\\x6f\\x38\\xf1\\xb4\\xba\\xc1\\x3f\\xa2\\xa4\\x9f\\xf1\\x55\\xe4\\x75\\x2b\\x9d\\x42\\x69\\xb0\\xd4\\x2e\\x54\\x71\\xb0\\xaf\\x4c\\x79\\xd0\\xef\\x52\\x76\\xa3\\x78\\x15\\x03\\x5d\\x36\\x23\\x45\\xd2\\x23\\x68\\x79\\xc5\\x42\\x38\\xab\\xb2\\x2a\\xae\\x96\\xd4\\xab\\x25\\xbc\\x9a\\xa8\\x41\\x7b\\x38\\x48\\x33\\x1c\\x16\\xa3\\x4e\\x88\\xc7\\xa7\\xec\\x1b\\x6c\\x49\\x5a\\xd2\\x33\\xa4\\x4f\\xcc\\x26\\x96\\x53\\xe7\\x3c\\x78\\x77\\x3e\\x1a\\xf1\\x96\\xfd\\x5a\\xce\\x97\\x64\\xc1\\x52\\x2c\\xe9\\xe9\\x6f\\x9a\\xcf\\x59\\xc0\\xdc\\xfe\\x19\\xb3\\xa1\\x19\\x12\\x09\\xb6\\x37\\x54\\x43\\x98\\xd3\\xe9\\xaf\\x3a\\x99\\xbe\\x8e\\xbc\\x18\\xd2\\x6b\\x7b\\xc1\\xcc\\xd1\\xd0\\x4e\\x33\\x26\\x9b\\xbd\\xd3\\x69\\x26\\x2d\\x2b\\x8d\\x36\\xd6\\x25\\x45\\xb2\\x95\\x59\\xff\\x48\\xa4\\x79\\xb1\\xef\\xa0\\xf2\\x96\\x86\\xbd\\xa8\\xfa\\x1d\\x95\\xce\\x1d\\x55\\xde\\x1d\\x15\\xae\\x40\\xdd\\xf7\\x6f\\x65\\x64\\x10\\x5f\\x65\\x7d\\x93\\x5d\\x31\\xbb\\x49\\x0b\\x48\\x6d\\x76\\x93\\x92\\x90\\xae\\x49\\xfd\\x77\\x7c\\xcb\\x32\\x07\\x9b\\xfa\\xa6\\xa6\\x76\\x14\\x0a\\x3e\\x88\\xcb\\x54\\x92\\x10\\x9b\\x03\\x52\\x10\\x6f\\xc2\\x29\\x19\\x47\\x7c\\x19\\x9c\\xc4\\x69\\x5a\\x2e\\x49\\x69\\x92\\x2f\\xba\\xcc\\xa3\\x5b\\x46\\x4b\\x95\\x0b\\x0b\\xa4\\xec\\xa6\\x51\\x6e\\x88\\x5c\\xda\\xe9\\xef\\x5d\\x5a\\x2c\\x1f\\x8c\\xa3\\x51\\x6d\\xa0\\x11\\xdd\\x94\\x9b\\x58\\xbf\\xd6\\x58\\x4a\\xf4\\x18\\x01\\xd8\\xce\\xda\\xda\\xc0\\xfb\\x95\\x8e\\xbc\\xee\\x62\\x61\\x59\\x8c\\x58\\xf9\\x0c\\xdf\\x72\\x85\\x16\\xfd\\xb3\\xd4\\xda\\x93\\xc3\\x95\\x5a\\x9b\\x74\\xb7\\x36\\x94\\x6e\\x6d\\x28\\xd7\\xda\\x64\\xe5\\xd6\\xca\\x66\\x19\\x4e\\xf3\\x34\\xc3\\x6c\\x83\\xf5\\x2e\\x89\\x86\\x57\\x4b\\xac\\xcb\\xf0\\x66\\xf8\\x26\\xab\\xa6\\xd7\\xdd\\x9d\\x9d\\x6e\\xf0\\x05\\x46\\x2d\\xbf\\xee\\x18\\x5c\\xff\\xa2\\x3f\\xc1\\xf3\\x22\\xb4\\x09\\xed\\x37\\x19\\x34\\x01\\xf2\\xa5\\xc1\\xa8\\x44\\x29\\x80\\xd9\\x96\\xb8\\x77\\x79\\x07\\xb9\\x9e\\xf8\\x79\\x77\\x76\\x3a\\x20\\xeb\\xf3\\x59\\x12\\x2c\\x42\\xfc\\xf8\\x3e\\xf6\\xb9\\x19\\xa8\\xda\\x6e\\x77\\xf5\\xd1\\xbf\\xfd\\x9e\\x37\\xdf\\xea\\x24\\xad\\x0d\\x68\\x1a\\x43\\x17\\x8b\\x12\\xfe\\x7b\\x38\\x45\\xb0\\x45\\xaa\\x6c\\xb0\\x3e\\x9c\\x31\\x91\\x8b\\x93\\x51\\x91\\xb7\\x95\\xbf\\x29\\xf6\\x9b\\x37\\xd2\\x30\\x70\\xf1\\x48\\x19\\x83\\xba\\xd6\\x4c\\xf8\\xdb\\x8a\\x41\\x5d\\x11\\x83\\x3a\\x06\\x5d\\x0e\\x83\\xb6\\x22\\x06\\x7d\\x0c\\x66\\x27\\x86\\xcf\\xb9\\xec\\xc7\\x29\\xda\\xa8\\xc2\\xa9\\x54\\x96\\x61\\xe8\\x46\\x75\\x8d\\x3f\\xac\\xae\\x36\\x0c\\xef\\xe7\\xdc\\x64\\x20\\xc4\\xac\\xde\\x10\\xf5\\x0e\\x0c\\x44\\xc3\\xf0\\x0a\\x4d\\x1f\\x34\\x55\\xbf\\x8a\\xed\\xf3\\xe7\\x9e\\xe2\\x0a\\xe5\\x7c\\xbf\\x13\\x5d\\x09\\xf6\\x5e\\xa6\\xbb\\xae\\x29\\xa4\\x3e\\xe9\\x15\\xa5\\x56\\x48\\x55\\x5f\\xd4\\xed\\xc9\\x56\\x5f\\x49\\x51\\xfe\\xc4\\xd0\\xc6\\x8d\\x04\\xf6\\x95\\x34\\xe7\\x4f\\x0c\\x63\\x5c\\xe6\\x37\\x7f\\x62\\x4c\\xc6\\x3c\\xed\\xf9\\x13\\x53\\xfd\\xf4\\x6e\\x6c\\x19\\xf7\\x92\\xdb\\xfe\\x1b\\x4c\\x6a\\xff\\x0d\\xa5\\x9e\\xff\\xf7\\x48\\x22\\x7f\\x15\\xb1\\x76\\x75\\x71\\xe2\\x0b\\x64\\x93\\x7f\\x66\\xa7\\xb8\\xcc\\x0a\\x6f\\xa7\\xb8\\xbd\\xd8\\x5b\\x4d\\xed\\xcd\\x3b\\x2f\\xab\\x38\\x6f\\x4c\\x1d\\x22\\xfb\\x12\\xa7\\x8b\\x0e\\x95\\xd8\\x6e\\x77\\xee\\xbc\\x27\\x15\\x49\\x43\\xd8\\xdf\\x7f\\x7e\\x92\\x47\\xb9\\x0d\\xa6\\x4e\\x0f\\xe2\\x88\\x7d\\x27\\x8f\\xf2\\xad\\xa9\\x93\\xf6\\xd1\\xc6\\xde\\x98\\xfa\\x06\\xff\\x41\\x58\\xd4\\x6f\\xdb\\xb6\\x92\\xc1\\x48\\xe1\\xbb\\xd8\\xc1\\x1f\\x38\\x05\\x1b\\x22\\x7c\\x1d\\xde\\x02\\xd3\\x71\\x9e\\x80\\x48\\x68\\xd7\\xff\\x0c\\xec\\x7f\\x2c\\xec\\xc4\\xbe\\x84\\x7f\\x46\\x57\\x97\\x0e\\x4e\\x3e\\xc1\\x3c\\xb8\\x98\\xc3\\xd9\\x1c\\xb3\\x2f\\x9a\\x4a\\x57\\xee\\x5d\\x40\\x97\\x6a\\x87\\xf1\\x35\\xad\\x4c\\xfe\\x0a\\xea\\x76\\x82\\xec\\x9c\\xc3\\x7a\\xab\\x01\\x67\\xfd\\x4d\\xc9\\xfa\\x5c\\x81\\xe7\\x3d\\x90\\x5b\\x99\\xcc\\x3d\\x48\\x51\\x15\\x8d\\xee\\x12\\xe9\\x8a\\xa1\\x98\\x4a\\xe7\\xc9\\x5b\\x4b\\x17\\x03\\x3d\\xc4\\x0a\\x6a\\x2b\\x10\\xc2\\xae\\x31\\x69\\xb7\\xd0\\xb2\\xa2\\x8c\\xdd\\xa2\\xfc\\x15\\xd8\\x42\\x84\\x8b\\x5b\\x04\\x66\\x87\\xdd\\xd3\\x6e\\xac\\xf4\\xc8\\xd0\\xb3\\x20\\xbb\\x0e\\x52\\x0c\\x47\\xc7\\x67\\x29\\x45\\xb1\\x9a\\xc8\\xf0\\x19\\xf2\\x9f\\x5c\\xcc\\x3f\\xc1\\x36\\x91\\x47\\xc2\\xfa\\xc7\\x94\\xf7\\xdc\\x7c\\xb1\\xfd\\x0c\\x27\\x10\\xe1\\x0b\\x3b\\x0b\\xa2\\x8b\\x2f\\x2c\\x07\\x14\\x2d\\x26\\x72\\xc0\\x25\\x62\\x23\\x8a\\xb3\\xd1\\xc0\\x4e\\xde\\xdc\\x84\\x28\\x96\\x5a\\x68\\x6e\\x6e\\x52\\xac\\xbc\\x6f\\xff\\x55\\x74\\x74\\x3b\\x3e\\x5e\\x9a\\xf5\\xef\\xbf\\xf2\\xbe\\xee\\x58\\x3e\\x6e\\x6e\\xe6\\x26\\x09\\xe7\\x77\\x2e\\xc7\\xa5\\xc8\\x75\\x62\\xe9\\x32\\x8d\\x25\\x64\\x64\\xfb\\x68\\xb7\\x22\\x23\\xf4\\xa8\\x9f\\x1a\\xa9\\x0b\\x3b\\xa5\\x47\\xff\\x77\\xd0\\x35\\x85\\xdc\\x50\\xc8\\x44\\x5f\\x14\\xa2\\x93\\xc5\\x04\\x71\\x8e\\xed\\x8b\\x08\\xe8\\xf6\\xd1\\xee\\x97\\x17\\x4f\\xe6\\xe5\\x51\\x0a\\xa7\\x1d\\x79\\x23\\x3b\\x8a\\xb3\\x39\\x4e\\x38\\xd1\\xc3\\x45\\xd5\\x8e\\xbc\\xaa\\xa8\\x12\\xce\\xc9\\x89\\x6b\\xa9\\x96\\xbe\\x67\\xfc\\x96\\x94\\xdc\\x42\\x49\\xf1\\x6a\\xdf\\x9c\\x0c\\x1f\\x9f\\x7c\\x1d\\x11\\x3e\\x3e\\xf9\\xa2\\x12\\x7c\\x7c\\xf2\\xe5\\x05\\x38\\x4e\\x6a\\xf2\\x1b\\x27\\x77\\x16\\xdf\\x38\\xb9\\xab\\xf4\\x7e\\x5c\\x4d\\x7a\\x3f\\x7e\\xa3\\xd2\\xfb\\xf6\\x6b\\x89\\xef\\xdb\\x2f\\x2c\\xbf\\x6f\\xbf\\x86\\x00\\xdf\\x34\\x24\\xf8\\xe6\\x1e\\x44\\xf8\\xe6\\xee\\x32\\xfc\\xeb\\x6a\\x32\\xfc\\xeb\\x37\\x26\\xc3\\xd4\\x91\\xb2\\x2a\\xbd\\x11\\x3b\\x02\\xe4\\x3b\\x5d\\x21\\xf6\\xb3\\xbb\\xae\\x54\\x22\\x2a\\xb7\\xec\\x17\\xc4\\x7e\\x01\\x3f\\x25\\xa8\\x3f\\xaf\\xc0\\x52\\x14\\x5f\\x5e\\x64\\x29\\xda\\x9a\\xd0\\xd2\\x27\\x87\\x23\\xb5\\xf3\\x80\\xbe\\x5b\\x56\\x59\\xd5\\xaa\\xb8\\x46\\x3d\\xb2\\x1a\\xf8\\x30\\x8a\\xe0\\x29\\x68\\xaa\\x9c\\x40\\x8f\\x4a\\x89\\x7e\\xfa\\x14\\x22\\xea\\xeb\\x58\\x08\\x2b\\x73\\x80\\x57\\xe1\\x31\\x44\\x5d\\xbb\\xfb\\xed\\x52\\x4e\\x40\\x75\\x4b\\x69\\xd7\\x8e\\xcd\\x32\\x75\\x55\\x80\\xa3\\x08\\x1e\\x93\\x66\\x49\\xd0\\xd1\\xe1\\x6e\\x43\\x70\\xff\\x19\\x06\\x1d\\x3d\\x6a\\x7f\\x18\\x75\\xb2\\xd5\\xa0\\x7f\\xd4\\x9d\\x8c\\x86\\x6e\\x19\\xe4\\x83\\xee\\xe4\\xde\\x07\\x1d\\x13\\xcf\\xfa\\x00\\xab\\x8c\\xb9\\x7c\\x18\\xca\\x8d\\xb9\\xa5\\x29\\x89\\x42\\xbb\\xd3\\xb0\\xab\\x0c\\xe3\\x02\\xa2\\xd4\\xb8\\xe3\\xb4\\x7c\\xeb\\x03\\xef\\x24\\xce\\xec\\x0c\\x7f\\x9d\\xe9\\x2e\\xa1\\xb8\\x3f\\xef\\xc8\\xa3\\x38\\xbe\\xfc\\xc8\\x63\\x4d\\xab\\x8e\\xbc\\x24\\x5e\\x71\\xb6\\x23\\x15\\x65\\x87\\x1d\\x67\\x0d\\x15\\x57\\x3e\\xc1\\x46\\x6b\\x64\\x85\\x53\\x3e\\x39\\x19\\x99\\xba\\x60\\x28\\x7d\\x06\\x31\\xfa\\xac\\x0a\\xfc\\xaf\\x26\\x47\\x2b\\xe9\\x6f\\x52\\x6f\\x65\\x31\\x3a\\x59\\x12\\xa3\\xc3\\xcf\\x22\\x46\\xdb\\x9e\\xf7\\x75\\xd6\\x8d\\xb6\\xe7\\x7d\\xd1\\x75\\xa3\\xed\\x79\\x5f\\x61\\xe7\\xce\\x6b\\xec\\xdc\\x79\\xf7\\xb0\\x73\\xe7\\x0d\\xdd\\xb9\\x6b\\xce\\xf8\\xeb\\xc5\\xfa\\x8f\\xde\\x79\\xeb\\x9d\\x54\\x5d\\x3b\\x49\\x6e\\x49\\xed\\xdc\\x54\\x50\\xd6\\xe0\\x69\\xc3\\x7a\\x50\\xd6\\xe0\\x7f\\x01\\x82\\x27\\x02\\x50\\xcb\\xd6\\xfe\\x7a\\xb9\\x7e\\x85\\x75\\x86\\x8a\\x53\\x74\\xff\\x13\\xf5\\xd2\\x8b\\x21\\x6e\\x18\\xdb\\x11\\xd8\\xf4\\x44\\x32\\xf6\\xab\\xe7\\x67\\x6d\\xe7\\x55\\xed\\xbe\\x16\\x8b\\x24\\x5e\\xe0\\x24\\xbb\\x85\\x7f\\xd2\\x73\\x4c\\x36\\x26\\x52\\x3a\\x28\\x0a\\xc0\\x4b\\x67\\x50\\x5c\\x80\\x5b\\xb1\\x54\\x41\\xe6\\xda\\x3a\\x0d\\x2e\\x9e\\xdd\\x92\\x39\\xa1\\xae\\xb4\\xd3\\xe0\\x22\\x0a\\xfc\\xc0\\xb5\\xa3\\x0c\\x1c\\xfa\\x3e\\x88\\x2a\\x43\\x9e\\xe2\\x1f\\x7c\\x5c\\x59\\x1e\\xd0\\xe6\\xd4\\xe6\\x4f\\x3e\\xdb\\xc1\\x65\\x2f\\xb5\\x1d\\xac\\x87\\x9a\\x46\\xaa\\xf1\\x7e\\x74\\xbc\\x20\\x23\\xc8\\x0e\\xd7\\x6a\\xdd\\x3b\\xa4\\x17\\xa0\\x75\\xd2\\x2c\\xba\\xa1\\x82\\x41\\xaa\\x47\\x70\\xa7\\x50\\xf5\\xb7\\xee\\x6e\\x3a\\xea\\xba\\xda\\x9b\\xcd\\xc6\\xd7\\x3c\\xee\\x3a\\x75\\xd5\\xfd\\xa1\\x68\\x8f\\xf3\\xc0\\x41\\x91\\xcf\\xd0\\x83\\xda\\x8e\\x6b\\xab\\x52\\x00\\x91\\x85\\xa6\\xc8\\x46\\x0e\\x0d\\x2e\\xe1\\x22\\x0f\\x61\\xe4\\x2f\\xfb\\x6f\\x54\\xe0\\xbd\\x7b\\xe0\\x90\\x88\\x43\\x63\\x40\\xca\\x1d\\x4f\\xcf\\xe9\\x20\\x19\\x17\\xc3\\xac\\xef\\x0c\\xfd\\x9a\\x7b\\xdd\\xd2\\x29\\x27\\xff\\xc1\\xfe\\x7e\\xfc\\xd8\\x1f\\x05\\x80\\xac\\xa7\\x8b\\x91\\xfc\\xf7\\x2d\\xe8\\x75\\xa1\\xa9\\x7e\\x98\\xc5\\x96\\xd7\\xdc\\x2a\\xe8\\xec\\xb9\\x5f\\xd4\\xb7\\x2a\\xee\\x02\\xcb\\x54\\x45\\x88\\xa3\\x8b\\x6c\\x0e\\x3f\\x80\\x75\\x5f\\x37\\x61\\x7b\\x94\\xf3\\x4e\\x1c\\x7d\\xc0\\x49\\xbe\\x69\\x54\\x99\\x07\\xb9\\xf6\\x24\\x56\\x5d\\x7e\\x19\\xfd\\x0e\\xca\\x3a\\x37\\xeb\\x0a\\xb9\\xab\\xb9\\x00\\x7d\\x82\\xb3\\xfa\\xd4\\xf5\\x28\\x05\\xcf\\xce\\x6c\\xb0\\xd3\\x7b\\xc1\\x7e\\xc7\\x83\\x82\\xba\\xfb\\xd2\\x4d\\x65\\xb2\\xdc\\xc8\\xe2\\xb7\\x9a\\x3a\\xd4\\xab\\x80\\x56\\xba\\x77\\xef\\x75\\x4e\\x57\\x7d\\x68\\xf4\\xfb\\xb0\\xe7\\x55\\x0e\\x99\\xc4\\x15\\x6d\\xcb\\x65\\x50\\xe0\\xcf\\xce\\x44\\xa7\\x1f\\x03\\xe3\\xdd\\x2a\\x97\\xc9\\xeb\\xc4\\x49\\x07\\x6e\\x29\\xfd\\x7f\\x72\\x00\\xe7\\x7d\\x57\\xca\\xc9\\x27\\x27\\x72\\x63\\x71\\x95\\xce\\x47\\xb9\\x5d\\x4f\\x0c\\x50\\xc1\\xd5\\xff\\xf6\\x8a\\xdd\\x36\\x2b\\xf4\\x5f\\x3c\\xcc\\x0d\\xe1\\x8a\\xbc\\xe5\\x6a\\x39\\xc7\\x34\\xae\\xeb\\x8c\\x81\\x0e\\xd1\\x7d\\x7a\\x80\\xe2\\x21\\xc3\\xcd\\x8d\\x17\\xd4\\x68\\x12\\x5b\\x93\\x30\\x64\\x25\\x57\\x0c\\x74\\x0c\\x6e\\x18\\x47\\xc3\\x37\\x1a\\xee\\x36\\x88\\x29\\xce\\xe6\\xe8\\xa5\\x0f\\x87\\x8e\\x5e\\x5a\\x49\\x76\\xf4\\x56\\x51\\x53\\x23\\x9a\\xb5\\xbd\\xb8\\x6b\\x28\\xb8\\x5b\\xb8\\x43\\xab\\xfe\\x83\\x0e\\xe5\\x7f\\xb0\\x7e\\xe8\\x45\\x95\\x4f\\x87\\x0c\\xcb\\xf2\\x4c\\x99\\xdf\\x0d\\x91\\x42\\x4b\\x03\\x95\\xe4\\x9e\\x8c\\xcc\\x60\\x16\\x23\\x2f\\x54\\xc9\\x75\\x4d\\x8f\\x74\\xd5\\x6b\\x1b\\xf8\\xd7\\x03\\x47\\xfd\\x35\\x1f\\xe4\\x39\\xd2\\xf3\\xe0\\x9d\\xa0\\x67\\xa5\\x86\\x21\\x05\\xd1\\xe5\\x78\\xb7\\xf4\\x64\\xb8\\x5f\\x79\\x8f\\x37\\x39\\x77\\x1d\\xff\\xf4\\x6e\\x6c\\x99\\x43\\xfc\\xc1\\x2b\\x1e\\xd4\\xc7\\xb4\\xbf\\xb8\\xfa\\xa0\\x8e\\xd4\\x8f\\x72\\x38\\x8f\\x9a\\x0c\\xdd\\xdc\\x84\\x80\\x0c\\xad\\x4b\\x1c\\xb1\\xab\\xc2\\xec\\xd6\\x73\\x9a\\xd9\\x91\\x67\\x27\\x1e\\x44\\xb1\\x87\\x37\\x7e\\x4b\\xe1\\xd1\\x55\\x16\\x84\\x8f\\xb8\\xf7\\x77\\x0d\\xc2\\x92\\x43\\x78\\x31\\x3a\\x82\\x68\\x8e\\x93\\x20\\x4b\\x47\\x6e\\x16\\x27\\x63\\x48\\xaf\\x16\\x38\\xd9\\xc9\\xe2\\xa4\\xad\\x53\\x49\\x91\\x0d\\x5a\\xe2\\x3d\\xbd\\xae\\xcf\\x8b\\xb6\\x97\\x5b\\x24\\x71\\x16\\x93\\xc6\\xc2\\x56\\xbd\\xb1\\xa3\\xa2\\x62\\x59\\x66\\xdc\\x21\\x42\\x6e\\x1c\\xa5\\x59\\x72\\x45\\x00\\x3e\\xe9\\x1d\\xc5\\xe1\\x15\\x7e\\x42\\xf1\\x76\\x87\\xcc\\xc1\\xd1\\xd5\\x25\\x4e\\x6c\\x27\\x24\\xca\\xc1\\x0e\\x53\\xdc\\x5d\\xf4\\x3a\\x09\\x32\\x56\\x30\\x4b\\xae\\x7a\\xca\\xb9\\x71\\xe4\\x07\\x17\\x57\\x49\\x59\\x76\\x55\\x71\\x2c\\x7f\\xb6\\x1a\\xa6\\x9b\\x9b\\x10\\x87\\x1e\\xa4\\xee\\x3c\\x8e\\x43\\x48\\xe7\\xc1\\x25\\x1d\\x99\\xe4\\x19\\xf7\\x71\\x4f\\xbf\\x62\\x7f\\xd3\\xcb\\x83\\xf8\\x72\\x41\\x5e\\x56\\x71\\x11\\xcd\\xbb\\xdc\\xf6\\xbc\\x64\\x4d\\x42\\x5a\\x64\\x42\\x2c\\x56\\x11\\xbe\\x2e\\xa0\\x8d\\x96\\x97\\x40\\xf5\\xf2\\x1b\\x15\\x59\\x22\\x1a\\xb8\\xd9\\x90\\x8a\\xbb\\xff\\xdf\\xf2\\xb1\\x4e\\x06\\xf8\\x64\\xc8\\x00\\xdf\\xfc\\xe1\\xef\\x30\\xcf\\xb2\\x45\\xfa\\x64\\x73\\xf3\\x32\\x9b\\xa7\\x1b\\x0e\\xde\\xbc\\xca\\x7c\\xeb\\xb7\\x14\\x3e\\xa8\\x1b\\x68\\x43\\x05\\xe7\\x16\\xfe\\xe3\\xd2\\xce\\xe6\\x81\\x9d\\x56\\x27\\xb0\\xf2\\xa6\\x08\\xbd\\x93\\xb0\\x74\\xaf\\x60\\x73\\x13\\x76\\x71\\xc6\\xe2\\x6f\\x61\\x4c\\x38\\x1e\\x10\\xa1\\x4b\\xe1\\xbf\\x39\\x11\\xff\\xfd\\xb7\\x66\\x8f\\x90\\x82\\xb3\\x42\\x00\\x96\\x6e\\x97\\xc0\\x23\\x36\\x65\\x3c\\x82\\xef\\xbf\\xcf\\x1f\\xff\\x28\\x85\\x14\\xfe\\x9b\\xb5\\xbf\\x1d\\xe5\\x4b\\xfa\\xae\\xc4\\x78\\xc9\\x7f\\xd7\\x11\\xf2\\xa7\\xdf\\x7f\\xbf\\xd4\\x6b\\x4d\\xd1\\xdd\\xaa\\x35\\xa4\\xa8\\x2a\\x4b\\xea\\x05\\xbd\\x0a\\xf2\\xdf\\x63\\xa6\\x32\\x8f\\xb8\\xa6\\x8c\\x13\\x78\\xc6\\xc6\\x4d\\xe0\\x07\\xd8\\x03\\x37\\xf6\\x1a\\xc3\\x9c\\xb9\\x6b\\xc2\\x55\\x8a\\x21\\xc8\\xc8\\x3a\\xe7\\xbf\\x49\\xbf\\xb4\\x37\\x99\\x5f\\x37\\x29\\x9a\\x7c\\xc1\\x7f\\xd7\\x9b\\xcc\\x9e\\xd6\\xc7\\x3d\\x99\\x10\\x4a\\x08\\x1b\\x45\\xc5\\xad\\x2a\\xdc\\x8f\\x1f\\x2b\\xbf\\x36\\xae\\x83\\xc8\\x8b\\xaf\\x1b\\x65\\xda\\x46\\x2f\\xa1\\x17\\xaa\\x85\\x9a\\xd7\\x5b\\xea\\xed\\xfd\\xe1\\xf1\\xbd\\x7d\\x7e\\xd8\\xfc\\xdb\\x12\\x9f\\xd2\\x2c\\x09\\xa2\\x8b\\xbd\\x24\\xbe\\xdc\\x99\\xdb\\xc9\\x4e\\xec\\x11\\x11\\x39\\xa5\\x0f\\x37\\xfc\\xca\\xd3\\xe5\\x7e\\x3d\\xb3\\x7f\\xc7\\x7c\\xc6\\x6b\\x0e\\xad\\xc5\\x55\\x74\\x4b\\xba\\xae\\x56\\xa5\\x50\\x3f\\x57\\x6e\\xaa\\x7a\\x98\\xbc\\x1f\\x31\\xec\\x6d\\x5c\\xa2\\xae\\x92\\x34\\x3a\\x44\\xc7\\x12\\x88\\x5a\\x88\\xf1\\x55\\x94\\xe1\\xa4\\xfd\\xa0\\x9b\\xee\\xf6\\xe7\\x56\\x15\\x43\\xd4\\x69\\x56\\x91\\xb2\\x74\\xb2\\x6a\\x7f\\x85\\x6f\\xb2\\xc4\\x5e\\x7e\\x75\\x3d\\x0f\\x42\\x0c\\xa3\\x9c\\x8a\\xa7\\x1c\\x5d\\x77\\xbc\\x81\\xf0\\x0a\\x97\\xb4\\xb8\\x9c\\xb3\\xdb\\x59\\x0e\\x61\\x7d\\xbd\\xc3\\xf0\\x22\\xe2\\xc8\\x6a\\xff\\xb4\\x05\\xca\\xcd\\xae\\xa5\\x28\\x44\\x72\\xd9\\xa3\\xa7\\xf4\\xd1\\xb3\\xbd\\x3d\\xf2\\x48\\x96\\x16\\x60\\x7d\\x48\\x4f\\x1b\\xd2\\xab\\x24\\x89\\x2f\\xec\\x0c\\x8f\\xe9\\xd0\\xca\\xe6\\x38\\xc1\\x34\\xc2\\x1e\\x44\\xf8\\x26\\x03\\x42\\xa7\\xed\\x66\\x78\\x79\\x7e\\xc9\\x3f\\x94\\x3d\\x2b\\x35\\x2c\\x6f\\xdc\\x88\\x81\\xf8\\x1e\\x94\\x9b\\xbd\\x1d\\x45\\x59\\x23\\x63\\x54\\xb9\\xd9\\xa5\\x5f\\xff\\x49\\x08\\x0d\\xe3\\xeb\\x92\\xce\\x5e\\xab\\x96\\x09\\x0d\\x5b\\x59\\x8e\\x38\\xd7\\x08\\x5c\\x6d\\x6f\\x6f\\x8d\\x86\\xcc\\x53\\xd6\\x60\\x1d\\x2a\\x08\\xe9\\x8b\\xf5\\x3c\\x19\\x45\\x9f\\xe9\\x2b\\xb3\\x35\\xb5\\xb9\\x09\\x57\\xd1\\xa5\\x9d\\xb9\\x73\\xec\\x95\\x14\\xff\\x08\\x71\\x14\\xde\\x82\\xbd\\x58\\x60\\xca\\xe1\\x20\\xa5\\xaa\\x0d\\xae\\xa2\\x20\\x1b\\x43\\x10\\x81\\x6b\\xa7\\x98\\xee\\x7a\\x13\\x96\\x8b\\x10\\x14\\x55\\x49\\x2f\\x65\\xf9\\x95\\xa3\\x02\\x19\\x59\\x84\\xda\\x95\\x9f\\x0b\\x3b\\xe8\\xee\\xbb\\x26\\xcb\\x28\\xc3\\x04\\xcb\\x77\\xde\\xab\\x8f\\x1f\\x0f\\xde\\x67\\x13\\x71\\x50\\x96\\x92\\x16\\xcb\\x6d\\x59\\xcf\\xb2\\x65\\x03\\x03\\xd9\\xaf\\x63\\xef\\xa8\\xcc\\x70\\x44\\x95\\x19\\x5d\\x66\\x76\\xe9\\xb2\\x42\\x13\\xb1\\x4d\\x81\\x3e\\x45\\x14\\x44\\x1e\\xbe\\x81\\x2d\\x78\\xdc\\x12\\xd2\\x56\\xa0\\xa8\\x0a\\x8d\\xf9\\xe8\\x51\\xa7\\xba\\x5a\\x5f\\x67\\x08\\x64\\xd5\\x15\\x25\\xf8\\x9c\\xd6\\xe9\\xd8\\x0f\\xaa\\xa8\\x27\\x32\\x80\\xf7\\xc8\\x80\\x12\\x2c\\x0a\\xe0\\xf1\\x56\\x3e\\xe2\\xba\\x85\\x88\\xb7\\x66\\x7d\\xab\\x65\\x96\\xca\\x11\\xfe\\xf4\\x13\\x20\\x25\\x1f\\xc7\\xf0\\x91\\x6b\\xc7\\x1e\\x01\\xce\\x9b\\xc5\\xd4\\x0b\\x7c\\x84\\x9a\\x8a\\x90\\x15\\x37\\x39\\xf2\\x5a\\xc8\\xb8\\x8b\\x9c\\x16\\x42\\xe7\\xce\\xb1\\xfb\\xfb\\xa9\\x6b\\x87\\x76\\xf2\\x33\\xc1\\x33\\x22\\xf2\\xf7\\x2a\\x0e\\xa2\\xd6\\xf0\\x04\\xa4\\x7b\\x8a\\x02\\xf5\\x19\\xa4\\x7c\\xcc\\x66\\x91\\x9e\\xae\\xcb\\xe6\\x49\\x7c\\x0d\\xb3\\x24\\x89\\x93\\x51\\x27\\x73\\x1f\\x1d\\xc6\\x11\\xae\\xa8\\x9e\\xd7\\xeb\\x8f\\x60\\xbd\\xc4\\xb2\\x91\\xc5\\xcc\\xb4\\x18\\x21\\x73\\x6d\\x23\\x8b\\x5f\\x2f\\xc8\\xea\\xc2\\x4e\\xf1\\x68\\x0d\\xd6\\xbb\\x81\\x12\\x35\\x17\\xc5\\x19\\x51\\x6a\\xb4\\xcd\\xac\\xcb\\x1e\\xb5\\x56\\x10\\xb2\\xfc\\xd3\\x17\\x33\\xaf\\xca\\xee\\xa2\\xeb\\xeb\\x67\\xb7\\x59\\xa5\\xa3\\xc6\\xcc\\xa5\\xb1\\xd5\\x40\\x64\\x02\\xd1\\x22\\x54\\xa3\\x6a\\x3f\\xfe\\x94\\x43\\x60\\xa2\\x4b\\x9d\\x05\\x6e\\xac\\xa6\\xe8\\x77\\x89\\x10\\xd3\\x59\\x3b\\x39\\x38\\xb1\\x04\\x55\\x50\\x7f\\xcf\\x47\\xf9\\xde\\x9e\\xc5\\xa7\\x6a\\x3e\\x4b\\xa3\\xc7\\xce\\x6d\\x86\\x21\\xc5\\xff\\x73\\x85\\x23\\xb7\\x7d\\x9e\\xee\\x6e\\x5d\\x49\\x82\\xcc\\xb0\\xa1\\xc6\\xeb\\xed\\xa5\\x13\\x87\\x1d\\xea\\xae\\x8b\\x68\\x4b\\xa9\\x13\\xad\\x4a\\x10\\x5d\\x20\\x12\\x77\\x8a\\xc9\\x3a\\x04\\xf1\\x0e\\xd9\\x69\\xd3\\x45\\xcb\\xad\\x29\\x2e\\xf2\\xb7\\x50\\x4c\\xcd\\x92\\x2a\\xc5\\x9a\\x04\\xc5\\x3d\\x2a\\xa2\\x5d\\xc7\\x0d\\x68\\x22\\x52\\x59\\x1b\\x15\\xde\\xc6\\x59\\x97\\xbe\\xe5\\x30\\xd7\\xb7\\x3a\\x86\\x40\\x5b\\x68\\xe8\\x21\\xbc\\x99\\x29\\x4b\\xbc\\xd1\\xef\\xb7\\x37\\x91\\xc5\\x9b\\x3a\\x61\\x4d\\xdd\\x5b\\xb5\\xa9\\xa8\\xcb\\x61\\xf7\\x7e\\x78\\x54\\x42\\x69\\x6b\\x53\\x9d\\x6f\\x9d\\xba\\x02\\x2a\\xc3\\x93\\xc2\\x93\\x53\\x25\\x57\\x99\\x6f\\x71\\x13\\xa8\\x7f\\x3d\\x57\\x90\\x91\\xc2\\x56\\xcb\\x2a\\x50\\xb0\\x84\\x2b\\x6b\\xdf\\xc9\\x7a\\x2a\\xc0\\xb4\\xbf\\x26\\xd2\\xc3\\xe6\\xa8\\xfb\\xb1\\xa2\\x4a\\xd6\\x57\\x5b\\xd0\\x6b\\x4e\\x55\\x48\\x58\\xdf\\xea\\x51\\xd4\\x03\\x8c\\x8b\\x12\\xe4\\x57\\xdb\\x6c\\x28\\xc4\\x25\\xc1\\xb6\\xb7\\x13\\x47\\x59\\x10\\x5d\\xd1\\x4d\\x73\\x2a\\xf0\\x5d\\xb3\\x0e\\x21\\xfc\\x80\\x32\\xfa\\xa7\\x2d\\xda\\x8a\\x1d\\xb2\\xf6\\x90\\xb1\\x51\\x1e\\x1d\\x44\\x1f\\xec\\x30\\xf0\\x68\\x2d\\x26\\x15\\x8f\\x5a\\x59\\xd6\\x21\\x25\\x75\\x02\\x81\\x61\\xa7\\xc7\\x5f\\xe7\\x05\\x51\\xef\\xb8\\x1e\\x5a\\x06\\x5b\\x14\\x59\\x5f\\x6f\\x39\\x32\\xe2\\xca\\xac\\x81\\xe2\\x7b\\x36\\x5d\\xb0\\xb5\\x2f\\x99\\x59\\xdb\\x1b\\x99\\x1f\\xb3\\xb4\\x55\\xd7\\x5a\\x48\\x69\\x8b\\x21\\xb8\\x09\\x07\\x3e\\x5c\\x63\\x20\\xab\\xd1\\xab\\x05\\x90\\x15\\xff\\x18\\x82\\xec\\xff\\xfd\\x3f\\xff\\xaf\\xdc\\xd2\\xaa\\x82\\xa7\\xad\\x59\\x02\\xd2\\xca\\xec\\xa5\\x6a\\x4d\\x9e\\x77\\x29\\x11\\xa6\\x0a\\x4e\\xa9\\xda\\x69\\x95\\x86\\x7c\\x70\\x76\\x0c\\x6b\\xf2\\x4a\\xed\\x7e\\xa5\\x75\\xbf\\xd2\\x85\\x7a\\x42\\x24\\x99\\x5f\\x4a\\x30\\xeb\\x68\\xb7\\x24\\x06\\x04\\x97\\x15\\x7a\\xac\\x22\\x2b\\x19\\x27\\xd8\\xf6\\xc0\\x0f\\x92\\x34\\x6b\\xef\\x77\\xda\\x09\\xf7\\x3b\\x1e\\x96\\x4d\\x47\\x18\\x45\\xf1\\xb2\\x30\\xa5\\xcb\\x87\\x09\\x74\\x28\\x31\\x92\\xbe\\xe7\\xc3\\x86\\x5b\\x03\\x7d\\x0c\\xe9\\x10\\xa4\\x76\\x86\\x88\\x0c\\xc4\\x06\\x09\\xb3\\x7c\\x08\\xef\\x74\\x52\\x41\\x85\\x15\\xb6\\x3a\\x54\\x61\\xfb\\xac\\x50\\x9d\\x48\\xaa\\xe8\\x10\\xdb\\xd6\\xa2\\x29\\x3b\\x3a\\x06\\x01\\xb4\\x2f\\x02\\xbb\\x55\\x0c\\x54\\xd5\\x4c\\xe7\\x74\\x09\\x32\\x3b\\x3a\\xab\\x69\\x89\\x02\\xbc\\x64\\x17\\x69\\x4d\\xe9\\xb9\\xb4\\x6f\\x21\\x88\\xdc\\xf0\\x8a\\xee\\x94\\x2d\\xec\\x20\\xa9\\x6e\\xc7\\x89\\xe5\\x68\\x2f\\xef\\xc4\\xd9\\xbd\\x76\\x22\\x55\\x45\\xf7\\xd4\\xf1\\x0a\\xdf\\xcf\\x54\\xe9\\x7d\\x35\\x46\\x4d\\x55\\x10\\x5a\\x54\\x1e\\xb4\\x0b\\x82\\x42\\x97\\x44\\xdd\\x7d\\x38\\x78\\x2d\\x01\\x7f\\x36\\xf9\\x11\\xad\\x1a\\x9a\\xd2\\x61\\x71\\xe9\\xd8\\xfb\\xea\\xd2\\x41\\x67\\xb0\\xfb\\x92\\xa8\\x09\\x95\\x28\\xe5\\xa6\\x29\\x53\\xca\\x8d\\xb2\\xb3\\x06\\x1f\\x3b\\x3b\\x69\\xc4\\x28\\x67\\x25\\x0b\\x01\\x6c\\x99\\x58\\xa1\\x43\\x00\\xe9\\x46\\x60\\xcb\\x86\\x14\\x52\\x44\\xbb\\x89\\x92\\x62\\x26\\x23\\x07\\xad\\xa2\\xf6\\xfa\\x6c\\xef\\xb1\\x05\\x1e\\x3d\\xc3\\xc4\\x9e\\xc0\\x9a\\xc9\\x4d\\x0a\\x1e\\x9f\\xad\\xed\\x15\\x9d\\xae\\xdb\\x5f\\xd1\\xf9\\xf1\\xc7\\xee\\x35\\x16\\x5f\\x2d\\x95\\xb6\\x7c\\x1b\\x5f\\x0a\\xf4\\xf5\\x25\\x56\\xa5\\x52\\xfb\\xe4\\x4c\\xe9\\xaa\\xce\\xea\\x9d\\x8b\\xac\\x8a\\x05\\xd2\\x75\\xec\\x56\\x5b\\xe8\\x75\\x1d\\xde\\x65\\x97\\x8b\\xce\\xd5\\xd5\\x28\\xbb\\x5c\\xc0\\x56\\xc3\\x28\\x5c\\x83\\xbf\\x6f\\x6d\\x31\\x5b\\x46\\xb8\\xda\\xe2\\xae\\x85\\xd9\\xe5\\x62\\xc8\\x32\\xa9\\xb2\\x99\\x5f\\x42\\xea\\xef\\xf2\\xcf\\x7d\\x3e\\x4b\\x3a\\x1e\\xb6\\x5a\\x9a\\xfb\\xe8\\x03\\x4e\\xd2\\x20\\x8e\\x1e\\x3d\\x81\\x47\\xd4\\x85\\xe1\\xd1\\xb2\\x3f\\xcc\\x23\\xd6\\x98\\x47\\x4f\\x2a\\x6b\\xf4\\x96\\x52\\x8c\\xcd\\xbc\\x14\\xfb\\x51\\x6f\\xf2\\xf2\\xe1\\xef\\x69\\x7c\\x89\\x61\\xfb\\xe5\\x2e\\x38\\x57\\x41\\xe8\\x41\\xbc\\xc8\\x82\\xcb\\xe0\\x0f\\x9c\\xa4\\x63\\x08\\x83\\xdf\\x31\\x24\\x1b\\xbf\\xa5\\x63\\x36\\x71\\x50\\x8f\\x98\\x74\\x81\\xdd\\xc0\\x0f\\x5c\\xa2\\xba\\xbd\\x80\\x8a\\xf4\\xc2\\xce\\x32\\x9c\\x44\\x69\\x13\\x34\\xad\\x9f\\xcd\\x31\\xf8\\x71\\x18\\xc6\\xd7\\x41\\x74\\xf1\\xa4\\x56\\x84\\xe8\\x8f\\xe5\\xb1\\xdb\\x88\\x7f\\x59\\xf1\\xda\\x6a\\x73\\x66\\xa8\\x15\\xdf\\xb0\\x2f\\xbd\\x86\\x53\\xc0\\x52\\x85\\xb2\\x64\\xed\\x55\\x9b\\x1c\\xf2\\xa8\\x99\\x85\\xdf\\x88\\xc0\\x14\\x25\\x3c\\x6f\\x11\\xd1\\xa6\\xd4\\xfd\\xff\\x8a\\x5d\\xb0\\x86\\xdb\\xc5\\xdf\\x2b\\xbf\\x37\\xa2\\xd8\\xc3\\x67\\xb7\\x8b\\xd6\\xf1\\x91\\xd7\\x65\\x8e\\x20\\x7c\\xbb\\x2c\\x88\\xaa\\xbe\\x17\\x27\\x41\\x74\\x11\\xff\\xe7\\x29\\x7c\\x50\\x36\\xac\\x0d\\xa5\\x7d\\x47\\xbe\\x04\\x51\\x71\\x63\\xea\\x68\\x04\\x9f\\xdc\\x73\\x44\\x76\\x72\\x3d\\xb7\\xc3\\x06\\xa2\\xc9\\x86\\xf2\\xb8\\x15\\x11\\x3d\\xcf\\x62\\xb7\\x16\\x59\\xec\\xc9\\xae\\x42\\x73\\x3b\\x3d\\xbe\\x8e\\x5e\\xe5\\x57\\xc0\\xb6\\x78\\xad\\x8d\\xfa\\xf3\\xf6\\xfa\\x85\\x1f\\x25\\xcd\\x2a\\xc7\\x7a\\xa3\\x6f\\xba\\xa9\\xc3\\x64\\xfe\\xa8\\xa4\\x0e\\x0d\\xc0\\xbb\\x46\\xfa\\xa3\\xda\\x3f\\xe7\\xbf\\xb3\\x14\\x8b\\xa4\\x04\\xfd\\xbe\\xe2\\x71\\x66\\x83\\x91\\x27\\xf3\\x20\\x8a\\x09\\x1b\\x6d\\xb8\\xc6\\x4e\\xee\\x69\\xb6\\xac\\xd4\\xe2\\x38\\xdb\\xe0\\xfa\\x63\\xb9\\x83\\x2a\\x7a\\x8c\\xc5\\x51\\x5d\\xcb\\x9d\\x5b\\xb9\\x83\\x95\\x35\\xc4\\xc1\\xaa\\xc7\\xb1\\x2d\\x7d\\x76\\xe5\\xfb\\x38\\x19\\xd9\\xc9\\xd2\\x84\\xc5\\x87\\x80\\x9d\\x5c\\x10\\xce\\xf1\\x41\\x49\\x7e\\x6d\\x55\\x86\\xe3\\x52\\xbb\\x6a\\x45\\x37\\xa8\\xdb\\x75\\xdd\\x4f\\x53\\x50\\xc3\\x0f\\xc2\\x70\\x58\\x0d\\x62\\x5c\\xbd\\x3e\\x88\\x32\\xab\\x51\\xad\\xe2\\x1d\\x58\\xe5\\xdc\\x54\\x86\\x73\\xf4\\x22\\xc0\\xe2\\x96\\xa5\\xf1\\xf8\\xcf\\xf8\\x16\\x47\\xd9\\x18\\x0e\\x22\\x77\\x83\\x3a\\x61\\xd0\\x6b\\xb1\\x74\\x68\\x52\\x63\\x37\\x09\\x9c\\xab\\x2c\\x4e\\xd2\\x8d\\xbf\\x6d\\x6e\\x92\\x9a\\xaf\\x70\\x72\\x19\\xa4\\x29\\xe3\\x2f\\xdd\\xbe\\x71\\x6e\\xe1\\x22\\xb1\\xa3\\x0c\\x7b\\x63\\xe6\\x6a\\x15\\xfb\\xd4\\x73\\xe3\\x02\\x8f\\x59\\x8a\\xc4\\x5b\\x58\\xe0\\x24\\x8d\\x23\\x88\\x9d\\xcc\\x0e\\xa2\\x20\\xba\\x00\\xfb\\x6f\\xd4\\x99\\xa0\\xe2\\xb6\\x9e\\xc6\\x7e\\x76\\x6d\\x27\\x98\\xd2\\x60\\xa7\\x69\\xec\\x06\\xf4\\xba\\xa1\\x17\\xbb\\x57\\x15\\x2f\\xd7\\x20\\xc4\\x29\\x8c\\xb2\\x39\\x26\\x00\\xfe\\x71\\xca\\x2b\\xfd\\x63\\x8d\\xa2\\xf2\\xb0\\x1d\\xe6\\x77\\xf8\\xf2\\x57\\x45\\xc2\\xc3\\x04\\xa7\\x59\\x12\\x50\\xd6\\x8c\\xf9\\x02\\x2d\\x88\\x2e\\x08\\x98\\xbc\\x44\\x18\\x5c\\x06\\x1c\\x4f\\x71\\x75\\x9f\\xde\\xb3\\xbf\\x4a\\xf1\\x98\\x52\\x3b\\x26\\xd2\\x16\\xf8\\xe4\\x2f\\xa6\\xed\\x5b\\x5c\\x39\\x61\\x90\\xce\\xc7\\x04\\x8c\\x17\\xa4\\x8c\\x5b\\x98\\xe6\\x5c\\x0b\\x03\\x17\\x47\\x29\\xf3\\x6c\\xd9\\x24\\xf3\\x10\\x0e\\x43\\x02\\x24\\xc0\\x29\\x6b\\x74\\x49\\x23\\xf7\\x7e\\x89\\x69\\xee\\x9f\\x20\\x23\\xc0\\x18\\xc7\\x28\\xf6\\xeb\\x39\\x4f\\xaf\\x59\\x34\\x29\\x48\\xc1\\xbf\\x4a\\xa2\\x20\\x9d\\xb3\\xdc\\x90\\x5e\\x0c\\x69\\x4c\\x91\\x52\\x9d\\xc5\\x42\\x0f\\x10\\x28\\xc5\\x3c\\x56\\x4e\\x7e\\xe9\\x13\\xde\\x91\\xf4\\xd2\\xab\\x13\\x7f\\xc0\\xb4\\x65\\x4c\\x18\\xa2\\x38\\x0b\\x5c\\xcc\\x7d\\x71\\x82\\x94\\xd1\\xc3\\x3a\\x9b\\xbf\\x4a\\xe7\\x76\\x18\\x82\\x83\\xf3\\x25\\xae\\xf7\\x37\\xa6\\x18\\xec\\x4a\\xe3\\x68\\x02\\xaf\\x34\\xb3\\x23\\x96\\xc2\\x2d\\x4e\\x58\\xc4\\xf4\\x46\\xa3\\x73\\x81\\x3a\\xdb\\x9f\\xc1\\xe9\\xf1\\xde\\xd9\\x9b\\xed\\x93\\x19\\x1c\\x9c\\xc2\\xab\\x93\\xe3\\x9f\\x0f\\x76\\x67\\xbb\\xf0\\x8f\\xed\\x53\\x38\\x38\\xfd\\xc7\\x18\\xde\\x1c\\x9c\\xed\\x1f\\xbf\\x3e\\x83\\x37\\xdb\\x27\\x27\\xdb\\x47\\x67\\xbf\\xc0\\xf1\\x1e\\x6c\\x1f\\xfd\\x02\\x2f\\x0e\\x8e\\x76\\xc7\\x30\\x7b\\xfb\\xea\\x64\\x76\\x7a\\x4a\\x40\\x1d\\x9f\\xc0\\xc1\\xcb\\x57\\x87\\x07\\xb3\\xdd\\x31\\x1c\\x1c\\xed\\x1c\\xbe\\xde\\x3d\\x38\\x7a\\x0e\\xcf\\x5e\\x9f\\xc1\\xd1\\xf1\\x19\\x1c\\x1e\\xbc\\x3c\\x38\\x9b\\xed\\xc2\\xd9\\x31\\xc5\\xc9\\xa1\\x1d\\xcc\\x4e\\xe1\\x78\\x8f\\xd4\\x7e\\x39\\x3b\\xd9\\xd9\\xdf\\x3e\\x3a\\xdb\\x7e\\x76\\x70\\x78\\x70\\xf6\\xcb\\x18\\xf6\\x0e\\xce\\x8e\\x66\\xa7\\xa7\\xb0\\x77\\x7c\\x02\\xdb\\xf0\\x6a\\xfb\\xe4\\xec\\x60\\xe7\\xf5\\xe1\\xf6\\x09\\xbc\\x7a\\x7d\\xf2\\xea\\xf8\\x74\\x46\\xc3\\x5e\\x1e\\x1d\\x1f\\x1d\\x1c\\xed\\x9d\\x1c\\x1c\\x3d\\x9f\\xbd\\x9c\\x1d\\x9d\\x6d\\xc0\\xc1\\x11\\x01\\x76\\x74\\x0c\\xb3\\x9f\\x67\\x47\\x67\\x70\\xba\\xbf\\x7d\\x78\\x48\\x11\\x6e\\xbf\\x3e\\xdb\\x3f\\x3e\\x39\\x25\\x54\\xee\\x1c\\xbf\\xfa\\xe5\\xe4\\xe0\\xf9\\xfe\\x19\\xec\\x1f\\x1f\\xee\\xce\\x4e\\x4e\\xe1\\xd9\\x0c\\x0e\\x0f\\xb6\\x9f\\x1d\\xce\\x18\\xb6\\xa3\\x5f\\x60\\xe7\\x70\\xfb\\xe0\\x25\\x15\\xac\\xdd\\xed\\x97\\xdb\\xcf\\x67\\xb4\\xe2\\xf1\\xd9\\xfe\\xec\\x84\\x96\\xe4\\x34\\xbe\\xd9\\x9f\\xd1\\x47\\x07\\x47\\xb0\\x7d\\x04\\xdb\\x3b\\x67\\x07\\xc7\\x47\\x84\\x3f\\x3b\\xc7\\x47\\x67\\x27\\xdb\\x3b\\x67\\x63\\x38\\x3b\\x3e\\x39\\x83\\xe3\\x13\\xca\\x1f\\x52\\xf4\\xcd\\xc1\\xe9\\x6c\\x0c\\xdb\\x27\\x07\\xa7\\x84\\x39\\x7b\\x27\\xc7\\x2f\\xc7\\x40\\xb8\\x7b\\xbc\\x47\\xf9\\x77\\x44\\xaa\\x1e\\xcd\\x18\\x20\\xc2\\xf9\\x7a\\x07\\x1d\\x9f\\x90\\xdf\\x04\\xd8\\xeb\\xd3\\x59\\x49\\xd1\\xee\\x6c\\xfb\\xf0\\xe0\\xe8\\xf9\\x29\\xa9\\x5f\\x2d\\xbf\\x51\\xaa\\x7a\\xea\\x1a\\x19\\x27\\x97\\x76\\x76\\x82\\x2f\\x66\\x37\\xc4\\xc8\\xde\\xfc\\xee\\x3c\\xf5\\x7e\\xfb\\xee\\xdd\\x66\\xe5\\x6c\\x80\\xab\\xa9\\x0d\\x56\\xb4\\xa2\\xce\\x47\\x7e\\x5b\\x88\\xf4\\xbf\\x07\\x29\\x3f\\xd7\\xf7\\xd7\\x3a\\x9d\\xf9\\xd8\\xcd\\xe1\\x8e\\x05\\x41\\xdb\\x7d\\x06\\x3b\\xb9\\xa0\\x4a\\xa7\\x38\\xef\\xe9\\xbb\\xd4\\x90\\x5f\\x4c\\xa6\\x66\\x7f\\x10\\x11\\x7b\\x33\\x1b\\x15\\x10\\xce\\x83\\x77\\x6d\\xa1\\x22\\xba\\x9d\\x31\\x38\\xb4\\xdf\\xe2\\x20\\x1a\\x3d\\x02\\x89\\x65\\x1f\\xcb\\xa5\\xba\\xf4\\xd8\\x4e\\x2e\\x52\\xea\\x43\\xc3\\x09\\x59\\x2e\\x11\\xe2\\x88\\x15\\x68\\x3f\\xd6\\xe2\\x3e\\x9a\\x85\\x53\\xe6\\xc8\\x5f\\xdb\\x48\\xf0\\x22\\xb4\\x5d\\x3c\\xaa\\x76\\x64\\x19\\x05\\x7d\\x74\\xd3\\x65\\xfd\\xdd\\xb0\\xe9\\xeb\\xbb\\xef\\x1e\\xad\\xe5\\x0d\\x7d\\xf4\\x5d\\xc7\\xc9\\x79\\x40\\x56\\xe6\\x21\\x8e\\x8a\\x92\\x37\\xcb\\xe5\\xd2\\xeb\\x20\\x73\\xe7\\xd0\\x8e\\x90\\x7c\\xa8\\x57\\xdb\\xa3\\xef\\xd2\\x47\\x4f\\x72\\x28\\xbc\\x11\\xa4\\xb9\\xe7\\xc1\\xfa\\x7a\\x97\\x41\\xc4\\x2b\\x7a\\x65\\xc5\\x23\\x7a\\x61\\x5c\\xb6\\xe2\\x6f\\x8f\\x9e\\x74\\xef\\x28\\x25\\xb7\\x02\\x1f\\x3e\\x8e\\xf2\\x3f\\x4f\\x8f\\x8f\\x36\\xd8\\xd9\\x64\\xe0\\xdf\\x0a\\x51\\x03\\x35\\xd4\\x5c\\x9b\\xb2\\xe4\\xbd\\xe8\\xf2\\x4d\\xce\\xff\\xf3\\x9d\\x20\\x71\\xaf\\x42\\x3b\\x79\\xd7\\xd2\\x11\\x05\\xd8\\xd6\\x37\\x1e\\xf6\\xed\\xab\\x30\\xeb\\x6e\\x69\\x77\\xcf\\x35\\xcc\\xcb\\x46\\x8b\\x8a\\xc1\\x78\\xc3\\x25\\xf3\\x3c\\x78\\xc7\\x86\\x64\\x88\\xa3\\x1f\\xcb\\xa7\\xeb\\xeb\\xc1\\xbb\\x2e\\x59\\x0b\\xd2\\xa3\\xab\\x30\\x24\\xa2\\xf1\\xf1\\x23\\xfc\\x3d\\x48\\xd9\\x55\\x93\\xd1\\x4d\\xab\\x7e\\x20\\x1f\\x22\\xe4\\xeb\\x5b\\xf0\\x08\\x1e\\xc1\\x7a\\x2b\\xc9\\x7d\\x3b\\x85\\xb5\\xca\\xf9\\xe8\\xbf\\x19\\xe8\\x0b\\x54\\x7a\\xa6\\x54\\xec\\xba\\x1f\\xff\\xf6\\x37\\x3a\\x2d\\xd9\\xc9\\xef\\x90\\xcd\\xed\\x0c\\x6c\\xb8\\xc4\\xd9\\x3c\\xf6\\x20\\x9d\\xc7\\x57\\xa1\\x47\\x8f\\xcb\\x78\\x5a\\x67\\x32\\x99\\xc2\\x09\\x85\\x92\\x92\\x72\\xc4\\x4a\\x09\\xb0\\x57\\xda\\xc2\\x2c\\x2d\\xf4\\xb5\\x4d\\xde\\xc7\\x91\\x8b\\xc1\\xb9\\xcd\\x7b\\x91\\xd6\\x3d\\xf0\\xe1\\xf1\\xe3\\x28\\x7e\\xec\\xe1\\x45\\x82\\x5d\\x9b\\xdb\\xcf\\xc0\\x73\\xd4\\xe2\\x08\\x98\\xcb\\xa7\\x0d\\x51\\xfc\\x38\\x5e\\x6c\\x2c\\xa9\\xeb\\xbc\\x1e\\xae\\x69\\xec\\x68\\x0c\\x97\\xe9\\x92\\xed\\xbd\\xb9\\x09\\xdb\\xc4\\x2e\\xa1\\xbd\\x5d\\x20\\x8c\\x2e\\x88\\xcd\\x11\\x5d\\x14\\x51\\x18\\x16\\x49\\xec\\xe2\\x94\\xda\\x0d\\x69\\x66\\x27\\xb4\\xc4\\xd5\\x62\\x63\\x69\\x0a\\x08\\xd2\\xd7\\xf9\\xa5\\xf0\\x11\\x73\\x97\\xdf\\xe0\\x55\\x5b\\x7b\\x3c\\x3f\\x98\\x92\\x5c\\x24\\x2f\\x35\\xb0\\x68\\xd5\\x86\\xbd\\x58\\x84\\xb7\\x3c\\x11\\x44\\xa1\\x66\\xdb\\x7a\\xbe\\x57\\x85\\x93\\x26\\x70\\x7a\\x37\\xa2\\x78\\xb7\\xc2\\x7f\\xa2\\x32\\xb3\\xe4\\xaa\\x75\\x49\\x9d\\xb7\\x22\\x12\\x4e\\x0f\\xa4\\xcf\\x69\\xf4\\x9b\\x96\\xa3\\xb8\\xca\\x19\\x28\\x6f\\x9d\\xd7\\x79\\x1e\\xfe\\x77\\x06\\xa8\\x8b\\x5d\\xd5\\x66\\xd0\\xed\\xcc\\x4a\\x4b\\xfa\\xe3\\xeb\\x27\\xf1\\x35\\xbd\\xb7\\xc3\\xb6\\x3f\\x09\\x67\\x7b\\x37\\xec\\x6b\\x88\\x12\\xdb\\xc5\\x92\\x88\\xdc\\x38\\x4a\\xe3\\x10\\xb3\\x3a\\x62\\x34\\x62\\x40\\x58\\x44\\x6f\\xeb\\xd3\\xa2\\x3b\\x48\\xcf\\x0e\\xb0\\x0b\\xfc\\x48\\x4a\\xde\\x3e\\xb5\\x5e\\x60\\x2c\\xbb\\xb7\\xa1\\x5f\\xf2\\x1f\\x44\\x50\\x3c\\xec\\x5c\\x51\\x93\\xa1\\xba\\xe3\\x51\\xbc\\x98\\x45\\x1f\\x82\\x24\\x8e\\x96\\x0d\\x35\\xfa\\x36\\x8c\\x2f\\xaa\\x03\\xbf\\x25\\x5b\\x55\\x73\\xa4\\x56\\x81\\xae\\x2d\\x1f\\x8a\\x55\\x5f\\xc3\\x56\\xae\\x0b\\x36\\x70\\xf4\\x61\\xe3\\xe8\\x78\\x77\\xf6\\x7e\\x77\\xf6\\xec\\xf5\\x73\\xa2\\xe0\\x9b\\x8e\\x32\\x29\\x26\\x46\\x63\\x8a\\xb3\\xba\\x93\\xe7\\xf2\\x25\\x9b\\xbf\\xb3\\xf6\\x9e\\xa7\\x38\\xeb\\x9c\\x4a\\x88\\x58\\x32\\x23\\x67\\xf4\\xe8\\xbf\\xfe\\xcb\\x21\\x2a\\x9e\\x65\\xf8\\xa4\\xbf\\xc6\\xf0\\x28\\x78\\xb4\\xb6\\x91\\xe1\\x34\\x6b\\x34\\xa7\\x27\\xed\\xe3\\x22\\xf0\\x2a\\xed\\x59\\x04\\x5e\\xbb\\xf0\\x54\\x88\\xab\\x32\\x56\\x74\\x71\\xf9\\x32\\xbd\\x28\\x73\\xfb\\x70\\x1b\\x9a\\xcb\\x0d\\x7f\\xd8\\xaf\\xaa\\xf2\\x4f\\x5d\\xc6\\x1f\\x7d\\x97\\xc2\\x77\\xde\\x13\\xf8\\x2e\\x7d\\x34\\x66\\x53\\xc2\\x22\\xf0\\x98\\x12\\xec\\x10\\xfd\\x81\\x93\\x68\\x77\\x6b\\xdb\\x20\\x89\\x27\\xd2\\x0a\\xbc\\x0e\\x81\\xaf\\xdd\\xab\\xff\\x01\\x66\\xee\\x3c\\x66\\x17\\x1a\\x98\\x4f\\x36\\xbd\\xc7\\x40\\xbf\\x6e\\xc0\\x59\\x72\\x4b\\xd7\\xe1\\x8b\\x24\\x88\\xb2\\x6a\\x99\\x6a\\xfa\\xd8\\x1f\\xf2\\x59\\xcb\\xc1\\x69\\x06\\xd7\\xf6\\x2d\\x2c\\xe2\\x34\\x0d\\x9c\\x10\\xc3\\x45\\xf0\\x01\\xb3\\x77\\x5e\\xe0\\xfb\\x38\\xc1\\x04\\xca\\xed\\x02\\x57\\x23\\x0c\\xd5\\x88\\xc9\\x23\\x19\\x31\\xc3\\xe5\\x13\\x59\\x12\\xd0\\xd5\\x7a\\x5c\\x2c\\xef\\x19\\x29\\xf1\\x55\\x35\\xb2\\x60\\x4b\\xbd\\x45\\x96\\x42\\x1e\\xfc\\x88\\x6e\\x94\\xd3\\x65\\x38\\x87\\x42\\x2d\\x8a\\x30\\xc3\\x09\\x6b\\x37\\xbf\\xff\\x50\\x81\\xb7\\x59\\x61\\x16\\x84\\xf8\\xc2\\x76\\x6f\\x9f\\x90\\xda\\x63\\x62\\x7f\\x5c\\xef\\x07\\x9e\\x87\\xa3\\x31\\x51\\x2d\\xd9\\x7c\\x0c\\x6e\\x1c\\xc6\\x49\\x5a\\xa9\\x53\\xb9\\x5e\\xca\\x6c\\x22\\x5a\\x93\\x90\\xd4\\x62\\x0e\\x70\\x4b\\x24\\xa7\\x71\\x69\\x0e\\x73\\xb3\\x9b\\xd6\\x93\\x88\\x14\\xe3\\xe8\\x09\\x9c\\xbf\\x5b\\x3e\\x59\\x48\\xb3\\xdb\\x90\\x26\\x7f\\xe3\\x5f\\x8e\\xe2\\x1d\\x42\\x61\\xf3\\x70\\xa1\\x41\\x07\\x6b\\xe5\\xc6\\xc6\\xb2\\x91\\xd1\\x5c\\x11\\x92\\x35\\x8a\\xb6\\x46\\x08\\xdb\\xa0\\x1c\\xa8\\xae\\xb4\\xce\\xd5\\x77\\xcb\\xea\\xa6\\x0d\\x80\\xce\\x00\\x30\\xde\\xd5\\x20\\x68\\x2d\\x10\\x82\\xf4\\x59\\x1c\\x87\\xd8\\x8e\\x46\\x94\\x8b\\x1d\\x39\\xa4\\xda\\x9b\\x00\\xf4\\xf2\\xeb\\xcd\\x46\\xd9\\x73\\xb0\\x45\\x3b\\xe3\\xc7\\xb6\\xdd\\x5e\\x82\\xad\\xad\\xa7\\x38\\x8a\\x8b\\x38\\x03\\x3b\\x82\\x7f\\xf0\\xde\\xfa\\x47\\x57\\xa4\\x81\\x5c\\x0d\\xbd\\xe7\\x61\\xc8\\xdc\\xec\\x86\\x4b\\x40\\x73\\xce\\x6a\\x20\\x20\\x3a\\xb6\\x4f\\x24\\x9a\\x73\\x49\\xbd\\x65\\x6b\\x6b\\xcb\\x4d\\x6d\\xb1\\x7d\\xda\\x80\\xd0\\xae\\x5c\\xab\\x77\\xab\\x2a\\xae\\xc6\\x3a\\x70\\xad\\xd1\\x9b\\x92\\x38\\xdd\\xab\\x34\\x8b\\x2f\\x0f\\xd8\\x28\\xc9\\x61\\x54\\x9f\\xb5\\xda\\x0a\\xf4\\x28\\xbb\\x44\\xcd\\x5a\\xcc\\x44\\x9d\\x7a\\x17\\xd3\\x6f\\x6f\\x82\\x6c\\x4e\\xc5\\xfe\\xc7\\x36\\x25\\xc9\\x66\\x07\\xee\\x56\\x41\\xbb\\x86\\x8c\\xd0\\x92\\x0d\\xcd\\x2d\\xe6\\x6a\\x97\\x06\\x05\\x69\\xfc\\x1b\\x5f\\xac\\xcc\\xb3\\x6c\\xf1\\x64\\x73\\x13\\x47\\x1b\\xd7\\xc1\\xef\\xc1\\x02\\x7b\\x81\\xbd\\x11\\x27\\x17\\x9b\\xe4\\xd7\\xe6\\xf6\\xd1\\xe9\\xc1\\x7b\\x9c\\xba\\xf6\\x02\\xbf\\x77\\x63\\x0f\\xff\\xff\\x2f\\x12\\x7b\\x31\\x0f\\xdc\\xb2\\x73\\x39\\xb0\\x92\\x87\\x75\\xf9\\x7b\\xe4\\xc4\\xa1\\xf7\\x08\\x9e\\xc0\\x39\\x1a\\x83\\xaa\\x36\\x86\\xfd\\xa3\\x20\\xb3\\xc3\\xc0\\xa5\\xef\\xb5\\x31\\xa8\\x5a\\xf3\\xfd\\x55\\xe4\\xe1\\x24\\x0c\\x22\\x4c\\x8b\\xe8\\x63\\x50\\xf5\\x25\\x10\\xd1\\x07\\x9c\\xa4\\xac\\xc0\\x64\\x0c\\xea\\xa4\\x59\\xe0\\x7a\\x1e\\x64\\xec\\xb5\\x36\\x19\\x83\\x36\\x6d\\xbe\\xbf\\x48\\xf0\\x2d\\x7d\\x3d\\x55\\xda\\x5e\\x3b\\xa1\\xed\\xfe\\xce\\xaa\\x77\\xbc\\xbf\\xe2\\xd0\\xf5\\xb6\\xd7\\xee\\xad\\x1d\\xb1\\xd7\\x66\\x07\\x72\\xcc\\xdf\\xab\\x6d\\xef\\x2f\\xed\\x0b\\x1c\\x65\\x36\\x2b\\x61\\xb4\\x95\\x48\\x30\\xe3\\xaf\\x86\\xda\\xde\\xde\\x62\\xb2\\x6c\\x63\\x05\\x34\\x5a\\xa0\\x36\\xb9\\x6e\\x6e\\xc2\\x6e\\x1c\\x3d\\xca\\xe8\\x15\\x69\\xde\\x14\\xb2\\x46\\xfd\\x10\\xb0\\x89\\x30\\x8e\\xc0\\xbd\\xf4\\x36\\xf0\\x0d\\x5e\\xea\\x70\\x22\\xb0\\xb8\\xa5\\xc3\\xe9\\xe1\\xad\\x1d\\x3e\\x7a\\xc2\\xdb\\xde\\x20\\x88\\xc5\\xf2\\x23\\x6f\\x39\\x69\\x4d\\x76\\x32\\x85\\xd9\\x5d\\xa0\\x08\\x27\\x46\\x8a\\xd0\\xbe\\x5b\\xc2\\x10\\x52\\xec\\x54\\xf2\\x1a\\xef\\xd8\\x06\\x0d\\xaf\\x89\\x97\\x88\\xf3\\xec\\x0c\\x93\\x97\\x39\\xd7\\x97\\x6e\\x93\\xff\\x23\\xb2\\x2f\\xf1\\x3f\\x9e\\xd0\\x9c\\xa1\\x11\\x9b\\xa5\\xc3\\x5b\\xca\\x31\\x3a\\x7e\\xa3\\x8b\\x66\\xdf\\x5c\\xe0\\x9b\\x05\\x81\\x48\\x7a\\xa9\\xdd\\xac\\x29\\x66\\xdd\\xa6\\x06\\x18\\xa5\\x59\\x32\\xa6\\x4f\\x5b\\x4f\\x69\\xd9\\x5e\\xdf\\x2d\\xbd\\xa5\\x5f\\xef\\x93\\xf3\\xa2\\x4e\\x33\\x4c\\x1b\\x0d\\xcd\\x46\\x5e\\xf6\\xac\\x4f\\x1f\\xfd\\xd7\\x95\\xa2\\x20\\xe7\\xbc\\xb2\\x39\\xc2\\x07\\x37\\x83\\xfb\\xee\\x5c\\x79\\x47\\xcc\\xe9\\x4b\\x6a\\x5a\\x67\\x49\\xc7\\x5d\\x2c\\x31\\x18\\xc4\\xc1\\xb4\\xce\\x67\\x7d\\x17\\x9d\\xba\\xa6\\xa2\\xff\\x8f\\xbd\\x7f\\xdf\\x6e\\x1b\\x57\\x12\\x85\\xf1\\xff\\xe7\\x29\\x2a\\xfd\\xdb\\x1d\\x49\\x11\\x75\\xf3\\x25\\x17\\x27\\x8a\\x7f\\xee\\xc4\\xe9\\xed\\x7d\\x1c\\xdb\\x27\\x71\\xef\\xbd\\xcf\\x38\\xee\\x1e\\x4a\\x84\\x2d\\xda\\x12\\xa9\\x90\\x94\\x2d\\xa5\\x9d\\x79\\xa7\\xf3\\x0a\\xf3\\x64\\xdf\\x42\\x15\\x40\\x82\\x24\\x00\\x52\\x4a\\xba\\xf7\\xcc\\xfa\\x3e\\xae\\x15\\x47\\xa2\\x80\\x42\\xe1\\x56\\x28\\xd4\\xf5\\xab\\x65\\x54\\x05\\x33\\x51\\x31\\xa6\\x5a\\xa1\\x8e\\x0e\\x2a\\xba\\x39\\x9e\\x87\\x7f\\x75\\xe3\\x89\\xde\\x93\\x53\\xa8\\x9a\\x27\\xba\\x4c\\x88\\xe4\\xd4\\x79\\x15\\x46\\x87\\xee\\x78\\x92\\xa9\\xfe\\xef\\xdc\\xa9\\x03\\xbe\\xa7\\x95\\x8f\\x72\\x50\\x17\\x77\\xee\\xf4\\x52\\x7b\\xb2\\x94\\x02\\xb2\\x8a\\x7e\\xf0\\x5a\\x15\\x1d\\x29\\x9d\\x28\\xc8\\x28\\x3b\\x10\\xb1\\xf1\\x22\\x8a\\xd9\\xb9\\x3f\\x2b\\xc7\\x09\\xec\\xf5\\xe0\\x2c\\x0a\\xef\\x7c\\x8f\\x81\\x0b\\x93\\x30\\x24\\xa3\\x8d\\x45\\xcc\\xa2\\x8e\\xb0\\xdc\\x60\\x9e\\x9c\\xf3\\x2c\\xfd\\x6e\\xb7\\x08\\xe3\\x0d\\xda\\x7b\\x20\\x53\\x4b\\xdc\\xb9\\x1f\\x73\\x1e\\x45\\x30\\xbb\\x18\\xe1\\xd8\\x0d\\x4a\\x70\\x38\\x49\\xf2\\x13\\xfd\\xc1\\x9a\\x3b\\x82\\x35\\x76\\x19\\xc2\\x79\\xb3\\xfc\\x83\\x1f\\xbf\\x53\\x66\\x61\\xc1\\xe4\\x61\\xd9\\xd2\\x15\\xee\\xf5\\xe0\\x9d\\xcf\\xb9\\x70\\xce\\x80\\x23\\x23\\xbe\\x48\\xfc\\xa9\\x50\\x6a\\x3b\\xe0\\x27\\x8d\\xb8\\x8c\\xb5\\x1f\\x83\\x20\\x8c\\x7a\\xac\\xd2\\xe3\\xf9\\xd1\\x70\\x58\\x3a\\xb2\\xf5\\x48\\x1c\\x4c\\xe3\\x10\\xae\\x32\\x4c\\x50\\x6b\\x9b\\x06\\x56\\x91\\x1a\\x94\\x45\\x4c\\x62\\x3a\\x06\\x63\\x21\\x3b\\x26\\x43\\x9b\\x32\\xb3\\xf9\\x48\\xf4\\x5d\\x0d\\xb1\\x22\\xe3\\x06\\xa8\\x2f\\xd5\\xe8\\x2d\\xc3\\x21\\xfd\\x6e\\x54\\xe4\\x44\\x78\\xb7\\xcf\\x75\\xb1\\xa9\\xae\\x2d\\xe4\\x5e\\x34\\x57\\xd2\\xbc\\xa2\\x28\\x62\\x89\\xf1\\x86\\x4e\\x2d\\x94\\xd6\\x71\\xc4\\xef\\xbc\\xb9\\x55\\xbc\\x86\\xe4\\x26\\x62\\x95\\x3e\\xe0\\x67\\x91\\x3f\\xf3\\x13\\xff\\x8e\\xd1\\xc5\\x10\\xc6\\x6e\\xc0\\x8f\\x81\\x89\\x7b\\x87\\x62\\xd0\\x39\\x8b\\x12\\x9f\\x95\\xaf\\x45\\xf3\\xb4\\x9a\\xc4\\x39\\x05\\xa4\\xec\\x3f\\x8d\\xec\\x23\\xad\\x68\\x21\\xdd\\x69\\x99\\x2a\\xe4\\x8f\\xf9\\xa6\\x5d\\xcc\\x71\\x59\\xdc\\xb2\\x55\\xaa\\xe8\\x15\\xb6\\x30\\x25\\xac\\xb1\\x4c\\x1a\\x01\\x8a\\x7f\\xd3\\xba\\x2c\\xa3\\xbf\\x39\\x71\\x0e\\xff\\x8b\\x6a\\xa8\\x74\\x92\\x57\\x2b\\x12\\x2a\\xb9\\x75\\x95\\xab\\x80\\xa6\\x7b\\xf9\\xe6\\xaf\\x59\\xa2\\x58\\xd5\\x9c\\xb8\\x33\\xa6\\xc7\\xa6\\xdc\\xed\\xa3\\x43\\xf0\\x42\\x16\\x73\\x7e\\x67\\xe6\\xde\\x32\\x40\\x51\\x09\\x5c\\xf9\\x6c\\xea\\xc5\\x10\\x84\\x41\\x27\\x8b\\x2e\\x55\\xac\\x2a\\xb8\\xe4\\x59\\xec\\x05\\xdd\\x99\\x3f\\x8e\\xc2\\x38\\xbc\\xe2\\x07\\xda\\xac\\xc7\\x82\\xce\\x22\\xee\\x4d\\xfd\\x51\\xe4\\x46\\xab\\x9e\\xcf\\x7a\\xde\\xfd\\xfd\\xee\\x56\\x3c\\x4a\\x9a\\x77\\xc3\\xbb\\xb8\\xfb\\x62\\xa7\\xd5\\x75\\xe3\\xf9\\x52\\x73\\xa9\\x20\\xe9\\x29\\xa1\\x5e\\xea\\xf3\\xe3\\xc7\\x80\\x23\\xd6\\x45\\x9f\\x8f\\xd3\\xab\\x66\\x43\\xe4\\x05\\x6f\\xb4\\xd0\\x0c\\x16\\x1e\\x1e\\x20\\xff\\xbb\\xc7\\xe2\\x71\\xe4\\xcf\\x45\\xf0\\x31\\x5e\\xc6\\x2a\\x4c\\xc7\\xc5\\xa7\\xa2\\x50\\x35\\x7a\\x68\\xc5\\x47\\xb4\\xe5\\x4a\\xa5\\xd2\\x9c\\xf6\\x64\\x2b\\x9e\\x6f\\x04\\x18\\x31\\x88\\x45\\x38\\xcd\\x84\\x79\\xe5\\xab\\x39\\x22\\x2e\\x7d\\xf5\\x4c\\x1e\\x18\\x34\\x48\\x79\\xc2\\x6c\\x95\\xd3\\x71\\xde\\x2c\\x25\\x36\\xf8\\x65\\x1f\\x38\\xef\\x05\\x6d\\xf5\\xdd\\x9e\\xd6\\x51\\x4f\\x19\\x19\\xe5\\x5e\\xd6\\x6c\\x5c\\xbc\\x4b\\x2d\\x03\\xdb\\xd4\\x40\\x1b\\x1a\\x97\\x0d\\x27\\xe3\\x73\\x6b\\xd1\\x15\\xea\\x8b\\x90\\x4b\\xda\\x7b\\xa2\\xc1\\x82\\xea\\x29\\x51\\xb0\\xa4\\x67\\x3c\\x99\\x94\\x11\\x3c\\x27\\x65\\x37\\xd7\\xc0\\xe8\\xad\\x9b\\xb0\\xf5\\xf1\\xe1\\xb5\\xaa\\xb1\\x41\\x66\\x7a\\x0d\\x5c\\xd4\\xb5\\x58\\xe5\\xa2\\x54\\xb1\\x78\\xcb\\xcd\\xe8\\x6c\\xaf\\x29\\xaf\\x76\\xa3\\xe1\\x88\\x28\\xbc\\xe2\\xfe\\xef\\xc0\\x28\\x72\\xc7\\x78\\xb5\\xb9\\x68\\xfc\\xce\\xa7\\xfa\\x6b\\xa3\\xc8\\x48\\xa3\\x92\\xef\\x96\\x01\\x19\\x4f\\xc7\\xee\\x8a\\xf8\\x98\\x64\\xc2\\x56\\xe0\\x46\\xe2\\xbd\\x66\\xcb\\xe3\\x7b\\x4b\\x1f\\x25\\x22\\x7a\\x4d\\x83\\x82\\xd7\\x05\\xc7\\xeb\\xb2\\x71\\x59\\xb5\\x69\\x11\\xcb\\x94\\x07\\xd3\\x60\\x9a\\xfe\\xa6\\xc1\\xb6\\xc6\\xde\\xc3\\x7d\\xb7\\xe9\\xa6\\x93\\x33\\x00\\xf9\\x5d\\x46\\x5b\\xac\\x56\\xcf\\x68\\x67\\xe8\\xfa\\x25\\x7e\\xd1\\xf4\\xaa\\x72\\x17\\xa6\\x68\\x71\\x6c\\x6a\\xed\\xbd\\x5a\\xb8\\x7a\\x18\\xfa\\x15\\xf9\\x5a\\x85\\x5c\\x92\\xef\\x1c\\xe1\\x4f\\x65\\x34\\x28\\x57\\x6c\\xd3\\x1c\\xc2\\xa5\\xcd\\xf9\\xcb\\xf9\\x9b\\x0d\\x31\\xa6\\xf3\\x11\\x31\\x16\\x87\\x4f\\x01\\x5d\\x2c\\x50\\x71\\xb2\\x55\\x22\\xbc\\xe6\\x49\\xa4\\x3d\\x3f\\xf0\\xb8\\x7c\\x44\\xbb\\xe7\\x41\\x44\\x69\\xc9\\x0a\\xd8\\x4f\\x42\\xda\\x55\\x74\\xab\\x45\\xc4\\xda\\xf2\\xd5\\xc0\\xbe\\xbd\\x38\\x26\\x2a\\x87\\x09\\xaf\\x6c\\x07\\xd9\\xbf\\x90\\xf8\\xdb\\xf4\\x38\\xda\\x43\\x8f\\x38\\xad\\xf5\\x8e\\xb9\\xc2\\xe0\\x20\\x40\\xc6\\x82\\x7c\\x78\\xa6\\x12\\x11\\xd6\\x05\\xb2\\x21\\xd9\\xbb\\x21\\x3c\\x52\\x1a\\xb4\\x88\\x96\\x0d\\x11\\x54\\xd3\\xcd\\xd5\\x51\\xd9\\x51\\xb4\\xba\\x2e\\x09\\xb2\\x4d\\x63\\x93\\xb6\\x83\\x6b\\x6d\\xe6\\xce\\xb3\\x8b\\x3a\\x1a\\x6f\\xd7\\x38\\x9f\\x24\\x8b\\xba\\x06\\x7a\\xe2\\x28\\xd2\\x0d\\xb6\\x7d\\x57\\x64\\xc3\\x1d\\xce\\x9b\\x06\\x71\\x40\\xc4\\xbc\\xc5\\x98\\x9d\\x87\\x1f\\xfd\\xe0\\x7a\\x2a\\x1c\\x7c\\x9a\\xd4\\x4f\\x07\\x57\\xbe\\x3c\\xf9\\x5a\\xb5\\x84\\x06\\xda\\x8b\\x4b\\x85\\x0a\\x59\\xac\\x7e\\xd3\\x56\\xcc\\xad\\xc2\\x4c\\xd0\\xe7\\xa8\\x52\\x3f\\xcd\\xdd\\x28\\xbd\\x27\\xda\\xcf\\xa9\\x18\\xe3\\xef\\x72\\xba\\xf3\\xa9\\xc1\\x09\\x4f\\xc1\\x64\\x8b\\x2a\\xa7\\xf6\\x72\\xbd\\x5f\\x7f\\x78\\xf8\\xe1\\x2f\\xbd\\x6b\\x07\\x1a\\x0d\\x7d\\x66\\x86\\xac\\x68\\x83\\x17\\xfb\\xe1\\xd3\\xa7\\xc6\\x0f\\x55\\x25\\x3f\\x7d\\xfa\\x01\\x41\\xfe\\xd0\\x68\\xa1\\x4e\\x5a\\x77\\x2c\\x6a\\x06\\x83\\x50\\x77\\x52\\x01\\xa6\\x55\\x1d\\x23\\x2d\\xaa\\xd0\\x06\\x6e\\x9d\\x11\\x4f\\x0f\\x6d\\x27\\x95\\xd3\\x6a\\x47\\x5b\\x2a\\xb5\\x36\\x85\\x2d\\x65\\xbc\\xad\\x92\\x36\\xef\\x5d\\x18\\x41\\xcc\\xef\\x19\\x11\\x73\\xe3\\x30\\x90\\x66\\xf5\\xc1\\x62\\x3a\\x05\\x3f\\x86\\x1f\\xe8\\xda\\xf1\\x83\\x03\\x71\\x28\\xe5\\x29\\x64\\xc5\\x37\\x61\\x11\\xd3\\xd9\\x19\\xa1\\x5d\\xd9\\x3a\\x78\\xa2\\xf4\\xd8\\x11\\x52\\xe4\\x7a\\x1b\\x41\\x3d\\xba\\xf4\\x02\\xc5\\x06\\x8a\\x41\\xb1\\x5c\\x05\\x21\\x2f\\xf2\\x3e\\x96\\x66\\xd7\\x27\\x7d\\x1a\\x19\\xa5\\x31\\x6a\\x66\\xde\\xc6\\xd6\\x81\\x69\\xca\\xe4\\xa5\\xf6\\xb5\\xf0\\x0a\\xa6\\x2f\\xa1\\xdd\\xf6\\x4d\\x87\\x5e\\xde\\xff\\xa5\\x29\\xb0\\x14\\x7b\\xd5\\x6f\\x19\\x4f\\x41\\x35\\xb0\\xdf\\x46\\xa4\\x54\\x0b\\x95\\x3f\\x69\\xdb\\x0e\\x99\\x69\\xad\\x7b\\x5a\\xaa\\x98\\x35\\xea\\x9c\\x89\\xea\\x37\\x3c\\x49\\x4a\\x62\\x5f\\xc3\\x69\\x82\\x02\\xb0\\x5b\\xb6\\xea\\x62\\x78\\xc8\\x66\\xef\\xd7\\x4f\\x5e\\xfb\\x2f\\xbd\\x7f\\xc1\\x90\\xe1\\xa9\\x64\\x1c\\xac\\x7c\\x77\\x5b\\x5a\\xad\\x65\\xf1\\x8c\\xb7\\x9e\\x29\\x1b\\x1f\\x99\\x9a\\xc5\\xcd\\xaf\\x1e\\x0e\\xa0\\xc8\\xdf\\x63\\xf1\\x38\\x8f\\x1c\\x7f\\x63\\x12\\x2a\\xbd\\x15\\xa2\\x14\\xb9\\xad\\x85\\xc3\\xd6\\xc3\\x03\\xfc\\x2e\\xc3\\x94\\xe3\\x7f\\xe4\\xb2\\xf5\\xb5\\x4c\\x23\\x39\\x70\\x0e\\xd3\\x34\\xb3\\xf8\\xbb\\xc6\\xe4\\x4a\\x3e\\x64\\xc4\\x9d\\x67\\xca\\x7e\\x66\\x49\\xc2\\xa2\\xde\\x47\\xfc\\xaf\\x92\\x37\\xab\\x32\\x80\\xd5\\x43\\x5f\\x93\\xe5\\x33\\x35\\xb2\\x69\\x17\\x6b\\xf6\\xad\\xe2\\xec\\x7b\\x54\\xa4\\x3b\\x85\\x15\\xa3\\xdd\\x44\\x42\\x78\\x44\\x94\\xfa\\x96\\xad\\xf4\\x97\\xd0\\x52\\x53\\x71\\xa2\\x0d\\xba\\x9e\\xca\\x35\\x39\\x4b\\x26\\x25\\x74\\x38\\x22\\x82\\xcc\\x1b\\xae\\x0a\\x90\\x3f\\xb8\\x72\\xf2\\x6b\\x9b\\x21\\x19\\x0d\\x66\\x49\\x08\\x9e\\xb5\\xe8\\xe0\\x19\\xba\\xa9\\xfd\\x64\\x0d\\xf0\\xb9\\x8b\\x50\\x07\\x06\\x6b\\x59\\x58\\x92\\x5e\\x32\\xca\\x64\\x99\\x9f\\x50\\x84\\x09\\x9d\\x81\\xad\\xd3\\xd6\\x7b\\x42\\x19\\x7d\\xde\\x40\\x3c\\x9f\\xfa\\x09\\x81\\xcf\\xf3\\xf4\\x53\\x3f\\x30\\xfa\\x89\\xab\\x8f\\x3c\\xd0\\x01\\xaf\\xae\\xbc\\x96\\xd9\\x22\\x0f\\xfb\\xdb\\x12\\x6e\\x21\\xd8\\x24\\x3a\\x59\\x45\\x4d\\x53\\x74\\x37\\xa8\\x1b\\x37\\x98\\x3a\\xc4\\x61\\x92\\x0e\\xf6\\x7b\\xf6\\x6b\\x93\\x8e\\xad\\xeb\\x8c\\xa0\\x71\\x61\\x5d\\x97\\x5e\\x65\\x9e\\x10\\xdf\\x46\\x2c\\xd4\\xdb\\x09\\xa7\\x01\\xda\\x6d\\x96\\xae\\x34\\x78\\xfc\\x18\\xea\\x1f\\xca\\x26\\x95\\xb5\\x7e\\x08\\x04\\x05\\x2a\\xdc\\x4a\\x1a\\x82\\x1e\\x19\\x74\\x64\\xbc\\x52\\x8a\\xcd\\x0f\\xcd\\x0b\\xb7\\xf3\\xe5\\xa0\\xf3\\xef\\xbf\\x5d\\xca\\x0f\\xfd\\xce\\x8b\\xcb\\x27\\xad\\x1f\\x2c\\x48\\x8a\\x66\\x11\\x90\\x58\\x9f\\x03\\x87\\xbe\\x0a\\x01\\x4a\\x07\\x4c\\x0b\\x56\\xd4\\x55\\x67\\x86\\xce\\xdc\\x06\\xff\\x6f\\xed\\x73\\x49\\x45\\xa5\\xf6\\xdd\\x0a\\x4c\\xf7\\xab\\x1a\\xa5\\x9b\\x78\\xc7\\x6b\\x61\\x0b\\x8d\\x1f\\xd6\\xee\\xa4\\xfe\\x32\\x06\\x55\\xa2\\x11\\xb1\\x2c\\xa4\\x36\\x81\\x84\\xa5\\xd5\\x36\\x07\\xf5\\xaf\\xef\\x3a\\x56\\x68\\x31\\x3b\\xf6\\x03\\x16\\x1f\\xc6\\x49\\x39\\x12\\x47\\x2e\\x72\\xa2\\xe0\\x24\\xa9\\xb5\\x8c\\x90\\xcc\\x23\\x76\\xe7\\xc0\\x78\\xa1\\x3d\\xee\\x14\\xe8\\xed\\xb6\\x7e\\xa1\\x8e\\x17\\x25\\xf2\\x8e\\x7a\\x9f\\x8a\\xaa\\xa9\\x66\\x93\\xdd\\x41\\x9b\\x37\\xaf\\x4c\\x35\\x1a\\x98\\x7c\\xba\\xf8\\xe4\\x7d\\xf2\\xf6\\x67\\xe2\\xa2\\x2e\\xd7\\x6c\\xbb\\xe8\\x5f\\xf7\\xd5\\x81\\x52\\x42\\x26\\x8e\\x97\\x34\\xed\\x84\\xa7\\xda\\x03\\xb9\\x2c\\x23\\xd4\\xae\\x91\\x26\\x49\\x34\\x87\\x43\\x68\\x34\\x60\\x9f\\xff\\xd9\\x93\\xb2\\xc4\\xc6\\xa7\\x00\\x1a\\xa6\\x88\\xc5\\x28\\x01\\xb5\\x31\\xf4\\x44\\x63\\x9d\\x4f\\x01\\x6c\\x02\\xa4\\x9e\\x1c\\xd3\\x2c\\x07\\x25\\x01\\x6d\\x1e\\x15\\x20\\xc9\\x05\\xfe\\xa2\\x81\\xff\\x95\\xac\\x0a\\x4f\\x4e\\xcf\\x0f\\xf7\\xe0\\x7c\\xc2\\x62\\xa1\\x33\\x44\\xa3\\x03\\x3f\\xb8\\x56\\x94\\x11\\x79\\x23\\x2a\\x2f\\xb5\\x43\\xfb\\x0f\\x3f\\x88\\x13\\x37\\x18\\xb3\\xf0\\xea\\x3f\\x38\\xac\\x11\\x1b\\xbb\\x22\\x85\\x87\\x1f\\xc3\\x55\\xe4\\x5e\\xfb\\x53\\xf2\\x78\\x16\\xba\\x46\\xe6\\xc6\\xfe\\x74\\x05\\x57\\xee\\x2d\\x13\\xa9\\xb1\\xff\\x23\\x9f\\xac\\xa8\\xf5\\x1f\\xdd\\xf2\\x7e\\x92\\xda\\x18\\xb7\\xb4\\xa4\\xc5\\x80\\x50\\x64\\x1b\\xa5\\x98\\xd5\\xbc\\x32\\x96\\x81\\x74\\xc4\\xa7\\x97\\x9a\\x2d\\x9c\\x89\\x4e\\xcc\\xf1\\x0d\\x8a\\x81\\x0d\\xa4\\xb0\\xc4\\xde\\xb8\\x80\\x8b\\xcd\\x8b\\xcf\\x7a\\x04\\x90\\xaf\\xb4\\x47\\x57\\xe0\\xcd\\x72\\x6e\\xd1\\xde\\x22\\x07\\x84\\xcd\\x9d\\x60\\x51\\x53\\x5b\\xa7\\x51\\x76\\xbe\\x56\\x35\\x5b\\xb3\\x55\\x05\\x64\\x8a\\x80\\xf2\\xce\\x84\\x8b\\x74\\x09\\xad\\x39\\xee\\x42\\x00\\x56\\x85\\x0e\\x66\\x26\\x1e\\xa6\\x0d\\xe8\\x1b\\xcf\\x1c\\x59\\x6b\\x36\\x2e\\x4e\\x16\\x7b\\xe3\\x69\\xe4\\x59\\xf9\\xd1\\xd0\\x38\\x45\\x44\\x5a\\xa3\\x71\\xac\\x50\\xd5\\xb8\\x0c\\x8b\\x2c\\x3f\\xea\\x1b\\xaf\\x3f\\xf9\\x43\\xb8\\x0b\\x7d\\x4f\\x3d\\x9a\\x74\\xcd\\xe6\\x67\\xbe\\x62\\xce\\x85\\xca\\x25\\x32\\x89\\xe5\\x52\\x47\\x53\\x5e\\xe2\\xf1\\x63\\x61\\xd4\\x70\\x1e\\xa6\\x56\\x47\\x2d\\x1a\\x90\\x0b\\x61\\xed\\x40\\xf0\\x2e\\x2b\\x46\\x26\\xf5\\x95\\x97\\x1f\\xf5\\xc8\\x89\\xa6\\xeb\\x4f\\x8b\\x92\\x85\\x88\\xbf\\x7b\\x54\\x6b\\xbf\\x9c\\xca\\x98\\x38\\xf2\\xa3\\x1e\\x19\\x54\\x30\\x96\\x1c\\x05\\x8b\\xc3\\xe4\\xe9\\x46\\xc9\\x2b\\x0c\\x12\\x07\\x55\\x35\\x44\\x6f\\xc9\\xeb\\x94\\x3e\\xe8\\x31\\x22\\xa1\\x6a\\xe5\\xcc\\x31\\xad\\x89\\x5e\\xb3\\x80\\x63\\x71\\x22\\x11\\xf8\\x65\\x03\\x1e\\x1e\\x80\\x41\\x76\\xda\\xd0\\xfb\\x0a\\x32\\x8f\\x65\\x10\\x79\\xfc\\xa4\\xc7\\x3e\\xd5\\x9c\\xd7\\x9f\\x5e\\x63\\x9c\\x98\\x7c\\xf3\\x12\\x32\\x62\\x20\\xbf\\xe8\\x91\\xc8\\x14\\x34\\xf5\\xe8\\x3d\\x3c\\x94\\x83\\xf6\\x99\\x4e\\xa3\\x3a\\x65\\x05\\x05\\xad\\x53\\x54\\xd0\\xbb\\x5a\\x45\\x89\\x3a\\xf1\\xb9\\x83\\x5e\\x0f\\x0e\\x3f\\x3e\\x15\\xf1\\xc7\\x2b\\x6b\\x66\\x3a\\x24\\xfb\\x10\\x9f\\x29\\x36\\x7a\\xca\\x37\\x65\\x90\\x95\\x73\\x17\\xc3\\x15\\x61\\x48\\x45\\x0c\\xdd\\xd3\\x6c\\x74\\x7b\\xf1\\x62\\xce\\x7f\\xee\\xc9\\x5f\\x1b\\x2d\\xdd\\xfc\\x14\\x96\\x68\\x68\\x98\\x20\\xc1\\xc8\\x98\\xb4\\x06\\x61\\x95\\x8a\\x62\\xee\\x7a\\xcd\\x92\\x51\\x9d\\xbc\\x81\\xc0\\x2b\\x18\\xf4\\x39\\xbf\\xda\\x47\\xc3\\x0b\\x25\\xe3\\x46\\xbf\\x05\\x7b\\x85\\x17\\xfa\\x86\\xd0\\x85\\x31\\x0c\\x92\\x09\\xd9\\xa5\\xfc\\xcd\\x0d\\x38\\x8b\\xf8\\x8e\\xa1\\xaf\\xe5\\x7b\\x37\\xe2\\xff\\x1d\\xcc\\x23\\xfa\\xb6\\xe2\\xff\\xfd\\x6d\\x11\\xd0\\x7f\\xa8\\x67\\x39\\x58\\x5c\\xf3\\xff\\x3e\\xb2\\x79\\xd1\\x18\\xff\\x74\\x9c\\xf0\\x5f\\x4e\\xc2\\x3b\\xfe\\xdf\\x5b\\x36\\x46\\x2b\\x9c\\x5e\\x0f\\xb6\\x9e\\xc2\\x3b\\x36\\x82\\xc1\\xd3\\xbd\\xc1\\x8b\\xbd\\xed\\x9d\\x72\\x9f\\x13\\x7f\\xc6\\xe2\\xc4\\x9d\\xcd\\x4b\\xce\\x97\\xe8\\x1b\\x2b\\x92\\x0e\\xbe\\xd5\\x64\\xe6\\xc7\\x50\\x83\\x3e\\xde\\xf7\\x2e\\xf8\\xc8\\x79\\xdd\\x6b\\x96\\xfc\\x35\\x5c\\x44\\x71\\xb3\\xa5\\xc9\\xf7\\x9e\\x16\\x79\\xef\\x07\\x8b\\x84\\x55\\x14\\xfa\\xc8\\xc6\\x61\\xe0\\xf1\\x42\\x97\\x82\\x99\\xde\\x2b\\xde\\x1d\\xc5\\xc4\\x5c\\x60\\x79\\x42\\xd0\\x11\\xc3\\x4b\\xef\\xde\\xf3\\xcf\\xcd\\xd6\\xa5\\x83\\x68\\x5e\\xea\\x62\\x8e\\x08\\x0e\\x7c\\x1a\\x5e\\x73\\x76\\xf9\\x66\\x11\\x27\\xe0\\xa2\\x9f\\x3e\\xdc\\x47\\xee\\x7c\\xce\\x22\\x48\\xc2\\xd4\\x5b\\x94\\x97\\x42\\xc3\\x99\\x79\\xc4\\xe6\\x2c\\xf0\\x62\\x5e\\x56\\x0e\\x5f\\x69\\xbd\\x17\\x7c\\x86\\x8b\\xa3\\xab\\x00\\x45\\x07\\xd4\\x0e\\xb9\\x9f\\x2a\\xd3\\xe1\\xd4\\x76\\x74\\x6d\\xd5\\xf3\\x02\\x3d\\xa2\\x4c\\x98\\x32\\xfa\\x80\\xb0\\x4b\\xa6\\xa0\\x0b\\x31\\xa5\\x68\\x0a\\x03\\xa6\\xa6\\x20\\xe5\\xd7\\x8e\\x10\\xdc\\x00\\x83\\x66\\x99\\xfc\\x39\\xcf\\x27\\x0c\\x24\\x71\\x55\\xf6\\x9e\\xcc\\xbb\\x49\\x80\\xa7\\x6e\\x70\\xdd\\xbd\\x89\\x21\\x62\\xf7\\x91\\x9f\\x24\\x2c\\xa0\\x4c\\xea\\x94\\xd1\\x75\\x1a\\x06\\x4c\\x85\\x98\\xe5\\xd3\\x0c\\xc2\\x04\\xc2\\x40\\x03\\xbe\\xd5\\x15\\xd7\\xa6\\x23\\x11\\x60\\xeb\\x8a\\xdf\\x73\\x7c\\xf4\\x64\\x1d\\x31\\x98\\x86\\xae\\xc7\\x3c\\x15\\xa6\\xb7\\x40\\x06\\x70\\x14\\x86\\x49\\x9c\\xf0\\xb9\\x15\\x11\\x19\\xe2\\xac\\xb5\\x80\\x31\\x4f\\x02\\xc8\\xf0\\x24\\xa3\\x70\\x54\\xb4\\x06\\x2e\\xa7\\x6d\\x3a\\x4c\\x63\\xde\\x9d\\x6c\\x4c\\x63\\x96\\x2c\\xe6\\xa2\\x66\\xc0\\x27\\x6f\\x0a\\x7f\\x73\\xef\\xdc\\x8f\\xa8\\x28\\x41\\xbb\\x5a\\xf4\\x83\\xb9\\x0f\\xa3\\x5b\\x70\\x63\\x15\\x20\\x5b\\xce\\x31\\x1e\\xaa\\x1e\\xdf\\x66\\xcc\\x18\\xcc\\x7c\\xd4\\x8d\\xde\\x60\\x24\\x89\\x68\\x30\\xd8\\x79\\xd1\\xdf\\x6e\\x55\\x39\\xdb\\x4a\\x44\\xbf\\x62\\x1e\\x50\\x78\\xa3\\xcc\\x71\\x21\\x88\\x46\\x3a\\x0a\\x7e\\xb6\\x5c\\x54\\x88\\xb8\\x4d\\xd3\\x59\\xb6\\xb7\\x95\\x26\\x39\\xd5\\x37\\xa8\\x34\\x92\\x8d\\x1d\\x5f\\x2e\\x7a\\x3f\\xdd\\xcc\\xd4\\x5f\\xac\\x2c\\xe5\\x24\\x91\\xef\\x72\\xe7\\x47\\xc1\\x43\\x53\\xdd\\x8e\\x61\\xe4\\x5f\\xfb\\x81\\x03\\xae\\x57\\xe2\\xe4\\x52\\x3f\\x2f\\x0f\\xa3\\xbb\\x61\\xd4\\x0e\\xf0\\xaf\\x78\\x51\\xf0\\xd1\\x20\\x3a\\xf5\\xbc\\x28\\x49\\x48\\x1e\\xf1\\x42\\xb9\\xb8\\x2c\\xbc\\x81\\x34\\xd4\\x0f\\xb5\\xaa\\x31\\xed\\xd1\\x18\\x8d\\xf3\\x8a\\x65\\x82\\xeb\\x4b\\x2b\\x1b\\x5d\\x48\\x23\\x11\\xe3\\xd5\\xef\\x74\\xb4\\xd6\\x40\\xd8\\xf8\\x05\\xaf\\x7d\\xe1\\x5f\\x5e\\xc2\\x90\\xf7\\x28\\xfd\\x6a\\xd3\\xde\\x14\\xb0\\x4f\\x0b\\xe9\\x8e\\xea\\x82\\x3e\\x09\\x9d\\x2e\\xe7\\x51\\x38\\xaf\\x7b\\x64\\xeb\\xe2\\x40\\x66\\x40\\x72\\x94\\x1b\\x40\\xe6\\xa7\\x2e\\x72\\x11\\x3f\\xec\\x3d\\x7f\\xee\\xfc\\x20\\xd7\\xc4\\x0f\\x7b\\xcf\\x9f\\x7e\\xbd\\x74\\x5e\\xf4\\xbf\\x29\\xee\\xe2\\x3f\\xdf\\x1f\\xff\\x35\\x49\\xe6\\x1f\\xd8\\xe7\\x05\\x8b\\x93\\x5c\\x44\\xc7\\x1f\\x46\\xfe\\x35\\x31\\x70\\xdd\\x9b\\xf8\\x87\\x75\\xd3\\xe7\\xaa\\x95\\xe1\\x6e\\xab\\xdb\\xef\\x3e\\x4b\\x53\\xe5\\x5d\\xfb\\xc9\\x64\\x31\\x42\\xdb\\xf9\\xf7\\xfe\\x2d\\x7b\\x3f\\x9e\\xf6\\xd4\\xe2\\xbd\\xe3\\xa3\\x37\\x87\\x27\\x6f\\x0e\\x41\\x0d\\x70\\x9b\\x65\\xd6\\x05\\x11\\x30\\xa6\\x38\\xf6\\x8d\\x45\\xcc\\x80\\xc2\\x05\\x36\\x8a\\xc6\\xba\\x92\\x7a\\x68\\xb0\\x12\\xbf\\x1c\\xa8\\xb4\\x4c\\xd8\\xf2\\xa3\\x09\\x84\\x1b\\x8d\\xfc\\x84\\x7f\\xeb\\xcc\\x23\\x36\\xf6\\x63\\x72\\xfe\\xf2\\x93\\xc9\\x8c\\x25\\xfe\\x58\\xee\\xe9\\x9a\\x5d\\x13\\xa5\\xb3\\x48\\x8e\\xcd\\x71\\x0b\\xb6\\xfa\\x83\\x5d\\x78\\xef\\x8f\\x27\\x2e\\x9b\\xc2\\xfb\\xf1\\xd4\\x5d\\x5c\\x4f\\xa6\\x7e\\x00\\xaf\\xde\\x3f\\x1f\\x4f\\x9e\\x3f\\x9f\\xfe\\xff\\xaf\\x67\\xae\\x3f\\xe5\\x30\\x5f\\x8b\\xfa\\xef\\x8f\\xce\\xe1\\x70\\x39\\x77\\x13\\x38\\xf6\\xc7\\x69\\x04\\x72\\x3e\\x5c\\xa5\\xad\\xf5\\x93\\x7f\\x4d\\x72\\x09\\x07\\xc6\\x98\\x11\\xdd\\x81\\xb9\\x1b\\xc5\\xec\\x64\\x31\\x63\\x91\\x3f\\x2e\\x33\\x2b\\x28\\xc7\\xe0\\x3f\\xc1\\x10\\x7a\\xbf\\x76\\xf6\\x9b\\x9f\\xbc\\x76\\xf3\\x53\\xf7\\x93\\xf7\\xa4\\xb5\\xff\\xc0\\xff\\x6f\\xb7\\x9a\\xec\\xa2\\xdd\\xb9\\xdc\\xe7\\x1f\\xf7\\xff\\xd2\\xf3\\xcb\\x30\\x66\\x6e\\x32\\x19\\x33\\x7f\\x0a\\x43\\x78\\xef\\x26\\x93\\x2e\\xff\\xac\\x2f\\x75\\x35\\x0d\\xf1\\x2e\\x85\\xc5\\xf0\\x4b\\xb9\\x5c\\x10\\x26\\x3f\\x85\\x94\\xb7\\x4b\\x64\\x1b\\x11\\x77\\x10\\x08\\x23\\x18\\xf9\\x01\\x9f\\x29\\xcf\\xbf\\xf6\\x13\\x4d\\x48\\xe3\\x28\\x5c\\x04\\x9e\\x1f\\x5c\\xbf\\xa7\\x4c\\xb5\\x0d\\xf9\\x9d\\xef\\x04\\xa6\\x29\\x9f\\x84\\xe1\\x7b\\x37\\x58\\xbd\\xe5\\xe0\\xf8\\xfe\\x10\\x57\\x18\\x92\\x60\\x4e\\xdc\\x18\\x66\\x61\\xc4\\x38\\xbf\\x14\\xc0\\x60\\x17\\x62\\xff\\x3a\\xf0\\xaf\\xfc\\xb1\\x1b\\x24\\x84\\x41\\xac\\x01\\x79\\x70\\x7c\\xf6\\xd7\\x83\\x9f\\x0e\\xcf\\x39\\xb4\\xfe\\x60\\x6b\\x7b\\x67\\xf7\\xe9\\xb3\\xe7\\x2f\\xdc\\xd1\\xd8\\x63\\x57\\xd7\\x13\\xff\\xe6\\x76\\x3a\\x0b\\xc2\\xf9\\xe7\\x28\\x4e\\x16\\x77\\xf7\\xcb\\xd5\\x97\\x83\\x9f\\xde\\xbc\\x3d\\x7c\\xf7\\xf3\\x5f\\x8f\\xfe\\xf6\\xbf\\x8e\\xdf\\x9f\\x9c\\x9e\\xfd\\xef\\x0f\\x1f\\xcf\\x7f\\xf9\\xfb\\x3f\\xfe\\xf9\\x7f\\xfe\\xfd\\x2f\\xbf\\x69\\xc0\\xff\\x74\\xf0\\xf1\\x10\\x86\\x30\\x60\\x83\\x9d\\xf2\\x8f\\xc7\\xa7\\x3f\\xff\\x26\\x0b\\x68\\x7e\\x7e\\x7f\\xf0\\xcf\\xdf\\x3e\\x1e\\xbc\\x3b\\xfc\\xed\\xe8\\xe4\\xfc\\xf0\\xe7\\xc3\\x0f\\x98\\xe7\\x70\\x70\\xa5\\x3e\\x4e\\x5a\\x98\\xf3\\xdd\\xbf\\xee\\x6e\\x43\\x07\\x06\\x25\\x40\\xbd\\x1e\\xc2\\x3a\\x3a\\x39\\xdf\\xde\\x42\\x20\\xcf\\x4a\\xd5\\x21\\x0f\\x68\\x7b\\xa0\\x05\\x74\\x76\\xfa\\x8f\\x8f\\xbf\\x9d\\x1f\\x9e\\x70\\xf6\\x7b\\xe0\\xc0\\xa0\\xcf\\xff\\xf1\\x3f\\x6c\\x9b\\xff\\xd9\\xe1\\x7f\\x76\\xf9\\x9f\\xa7\\xfc\\xcf\\x33\\xfe\\xe7\\x39\\xff\\xf3\\x82\\xff\\xc1\\xd2\\x6c\\x30\\xc0\\xbf\\x5b\\xf8\\xb7\\xe8\\x4f\\xce\\x9f\\x8f\\xff\\xfb\\xc3\\x79\\x3a\\x2a\\xec\\x99\\xa3\\x09\\xf1\\x5f\\x62\\x05\\x31\\xcc\\x28\\x88\\x20\\xa3\\x69\\xb8\\x91\\xb7\\x87\\x6f\\x8e\\xde\\x1f\\x1c\\xff\\x76\\x76\\x7c\\xf0\\xe6\\xf0\\xa3\\x03\\xe7\\xa7\\xbf\\x1d\\xfe\\xf3\\xec\\xb7\\x93\\xc3\\x9f\\xd3\\xcf\\x67\\xa7\\x1f\\x1d\\x78\\x7f\\x74\\xc2\\xbf\\x38\\x38\\x48\\xf8\\xc1\\x0d\\x72\\x7c\\x1c\\x87\\x9a\\x72\\xbe\\x18\\x0b\\x34\\x3c\\x5c\\xce\\xc3\\x80\\x61\\x38\\x4e\\x07\\x92\\xf0\\x9d\\xbf\\x64\\x1e\\x7e\\x40\\xb6\\x59\\x46\\x1f\\x3d\\x93\\x34\\xc9\\x81\\x11\\x5b\\x85\\x81\\x27\\xf8\\x1d\\x37\\xc8\\xf3\\x5f\\x63\\x36\\x97\\x5e\\x88\\x18\\xbc\\x29\\x80\\xa6\\x7f\\x05\\x87\\x1f\\x3e\\x9c\\x7e\\xf8\\x88\\x2f\\xa3\\x05\\x6b\\xe9\\x19\\x14\\x65\\xb1\\xf0\\x01\\x3b\\x7c\\xf1\\x52\\x33\\xa7\\x9a\\x39\\xee\\xf3\\x7e\\xa4\\xab\\xe2\\xdf\\xf4\\x14\\xf9\\x09\\xbc\\x41\\x01\\x3d\\x76\\x47\\x4a\\x24\\x32\\xa2\\xa5\\xb2\\xed\\x02\\xbb\\x02\\x66\\x99\\x43\\x2e\\xf1\\xf3\\x4d\\x4a\\xe6\\x7f\\x3a\\xba\\x31\\x19\\x81\\x7a\\xfe\\x9d\\x66\\xca\\x05\\xd2\\xbe\\x07\\x49\\xe4\\x8e\\x6f\\x29\\xbe\\x0a\\x3f\\xa7\\x59\\xc6\\xda\\xa1\\xd1\\x21\\xa7\\x0b\\xa8\\xb8\\x13\\xaa\\x07\\x19\\x53\\x95\\xf3\\xad\\x64\\x2e\\x2f\\x2c\\xe5\\xe3\\xb2\\x83\\x25\\x7f\\x30\\x94\\x50\\x5f\\x6f\\x6d\\x75\\x06\\xc3\\xac\\xef\\x19\\xfb\\xa0\\x2f\\x7c\\x7a\\x72\\x28\\xee\\xb1\\x69\\x95\\xe6\\xa0\\xe5\\xfc\\x9b\\xa1\\x6f\\x4f\\xaa\\x1e\\x38\\x7c\\x7b\\x74\\x8e\\xd1\\x4c\\xdf\\x1e\\xbe\\x3b\\xf8\\xe5\\xf8\\xfc\\x23\\x54\\xd6\\x29\\x1d\\x39\\xc5\\xf9\\x95\\x0f\\xed\\x22\\x19\\x1f\\x04\\x37\\x50\\x0c\\x23\\x36\\x0d\\xef\\x61\\xc6\\xef\\xa7\\x38\\x90\\x09\\xbb\\x66\\x11\\x39\\x48\\x88\\xc0\\x3c\\x38\\xb8\\xb1\\x7f\\xc7\\x20\\x72\\x83\\x6b\\x16\\xf3\\xab\\x55\\xc9\\x9f\\x4c\\x00\\x17\\x40\\xf9\\xb4\\xb8\\xd3\\x18\\xef\\x3b\\xe3\\x09\\xaf\\xe5\\x81\\x9b\\x40\\xb4\\x08\\x3a\\x78\\xaf\\xa7\\xfb\\x4b\\x36\\xca\\xb4\\x5e\\x8a\\x10\\x7b\\xc6\\x15\\xc2\\x9b\\x9a\\xb9\\x4b\\x7f\\xb6\\x98\\x81\\x38\\x1c\\x30\\x34\\xfc\\xd8\\xe7\\x17\\x22\\xd4\\x4c\\xc6\\xc8\\x38\\x70\\x5e\\xcf\\x95\\x7a\\xae\\xbb\\x70\\x7a\\xc7\\xdb\\xf5\\xfc\\x3b\\xdc\\xae\\xfa\\xb5\\x91\\xa7\\x27\\x30\\x84\\xad\\xbe\\x8e\\x80\\xe6\\xb6\\xd7\\x3a\\xe3\\x9f\\x3b\\xfd\\x30\\x06\\x21\\xdc\\x4f\\x58\\x90\\xbd\\xa7\\x28\\xc4\\x22\\xc4\\x70\\xbe\\x4f\\x44\\x71\\xb0\\x38\\x0e\\x61\\x11\\x7e\\x15\\xc5\\x2a\\x13\\x2c\\xdc\\xf2\\xbc\\x65\\x68\\xe6\\x16\\x46\\xab\\x34\\xbd\\xbf\\x9c\\xa5\\x5f\\xfa\\x70\\x70\\xef\\xae\\xe8\\xfa\\xfd\\x85\\x45\\x61\\xa9\\xec\\xdb\\xd3\\x7f\\x9c\\x88\\x2f\\x03\\x38\\x0f\\xef\\xdd\\xc8\\x8b\\xf5\\x25\\xdf\\x1c\\x1e\\x1d\\x8b\\x2f\\x5b\\x69\\xc9\\xf6\\x51\\x70\\xe5\\x07\\x7e\\xb2\\x2a\\x15\\x7f\\x77\\x7c\\x7a\\xfa\\x81\\xbe\\x6c\\xa7\\xc5\\x3b\\xc6\\xe2\\x7f\\x3d\\x38\\x7e\\xf7\\x1b\\x21\\xbe\\x93\\x16\\x0f\\x98\\x1b\\xb1\\x38\\x81\\x80\\xf9\\xd7\\x93\\x51\\xb8\\x88\\xba\\xfc\\xaa\\xcf\\xf9\\x69\\xcf\\xc7\\xe0\\xcb\\x4e\\x29\\x5a\\xa2\\x04\\x45\\xfd\\xda\\x5d\\x07\\x94\\x17\\xde\\x17\\x17\\x9a\\x00\\x76\\xf8\\xf7\\xc3\\x13\\x80\\xa7\\xeb\\x00\\x4b\\x44\\x51\\x76\\xc7\\x02\\xa5\\x9c\\x16\\x3c\\x8d\\xec\\xb3\\x4d\\xc0\\x9b\\xc7\\x1f\\x21\\xd3\\x24\\x3c\\xdf\\x04\\xb2\\x71\\xaa\\xca\\x47\\x1d\\x7f\\x3e\\x9c\\xfe\\x72\\xf2\\xf6\\xe8\\xe4\\xe7\\xdf\\xde\\x9f\\xbe\\xe5\\x84\\x76\\x47\\xbf\\x13\\xb3\\xbd\\xf8\\xdc\\x48\\x32\\x0e\\xff\\x79\\x76\\x7a\\x72\\x78\\x72\\x7e\\x74\\x70\\xfc\\xdb\\xc1\\x39\\xec\\xc1\\x45\\xc6\\x28\\x80\\xca\\x29\\x5c\\x5a\\xa9\\x0e\\x13\\xfb\\x4b\\xf0\\x1f\\x62\\x4b\\x8d\\x58\\xc0\\xdc\\x64\\x22\\xce\\x7d\\x29\\xae\\x15\\x67\\x69\\x9c\\x56\\xf2\\xdd\\x29\\x67\\x9e\\x91\\x20\\xe9\\x89\\x4f\\xaf\\x27\\xa2\\xe6\\x22\\xb3\\xbb\\x07\\x9d\\x67\\xda\\x62\\x0a\\xea\\x43\\xe8\\x3c\\x33\\x8d\\x4a\\x36\\x2e\\x1d\\x33\\x91\\xb2\\xf5\\x8b\\x68\\xd0\\x77\\xef\\xd5\\x56\\x99\\xe7\\x54\\x7a\\x75\\x76\\x8a\\x54\\x77\\x50\\xdd\\x2b\\x5b\\xa7\\x3e\\x1c\\x9c\\xfc\\x7c\\xc8\\xa7\\xb9\\xc8\\xf7\\xd9\\xe7\\x77\\xe6\\x07\\x78\\xaa\\xe4\\xc7\\xc3\\x29\\xcc\\x30\\x06\\x44\\xba\\xe2\\x07\\x67\\x12\\x22\\x5d\\x83\\x70\\x3c\\x5e\\x44\\x06\\x6e\\xa3\\x34\\xa9\\xdb\\x5b\\x3b\\x00\\xcd\\x5d\\xc6\\x3f\\xe8\\x0d\\xa4\\x04\\xd2\\x98\\x13\\x95\\x59\\xe6\\x97\\xc3\\xee\\x0c\\x6a\\xcd\\xb0\\x3c\\x2f\\x8b\\x3d\\x53\\xe7\\x38\\xbc\\xcb\\xba\\x25\\x77\\xea\\x5a\\x5d\\x83\\xed\\xfe\\x73\\x80\\xe6\\xa0\\xfb\\xec\\xc5\\xb3\\xa7\\x2f\\xb6\\x07\\xdb\\x3b\\xcf\\x9f\\x6e\\x6d\\x0f\\x76\\x9f\\xb1\\xf6\\x76\\xff\\xb9\\xbe\\xaf\\xc2\\xe1\\x44\\x4c\\x0f\\xbc\\xa6\\x3b\\x05\\xeb\\x5e\\x77\\x0b\\x8c\\x55\\x83\\xdf\\x2e\\xc4\\xd3\\x68\\x75\\xe7\\xd3\\x45\\xdc\\x1c\\xb4\\x60\\xe6\\xae\\xd0\\xd5\\x7d\\x1a\\xde\\xeb\\x91\\x94\\x90\\xe9\\xa6\\x61\\x1e\\x4b\\xcc\\x69\\x58\\xb5\\xae\\xfe\\x31\\x61\\x98\\xe7\\x21\\x63\\x8f\\x51\\x01\\x19\\xa3\\xbb\\x2b\\xbb\\xe3\\x23\\x81\\xbc\\xbd\\x1e\\x15\\xc1\\xec\\x93\\x6b\\x71\\x05\\x2a\\xbc\\x08\\xbf\\x5d\\xa3\\x3b\\xb4\\x11\\x9f\\x37\\xc8\\x5e\\x91\\xc0\\x33\\xf9\\xbb\\x3b\\xf5\\x3d\\x37\\x09\\xa3\\x93\\x50\\x60\\x95\\xbb\\x60\\x20\\x24\\x03\\x47\\x1c\\x63\\xdd\\xa3\\x80\\x42\\x93\\x65\\x90\\xfe\\xe1\\x27\\x13\\x82\\xe5\\xc8\\x26\\xf5\\x3f\\xf7\\x74\\xed\\x57\\x0e\\x23\\x25\\x89\\x10\\x62\\x11\\x11\\xd6\\xcc\\x9d\\x4e\\x57\\x9d\\x98\\x8d\\x17\\x11\\xb2\\x9c\\x5e\\x98\\x32\\x79\\xd7\\x2c\\x10\\xfc\\x9c\\x83\\x72\\xd3\\x3b\\xd7\\x9f\\xba\\xa3\\xa9\\xa1\\x4f\\x6f\\x3e\\xfc\\x9f\\xb3\\xf3\\xd3\\xcc\\xa1\\xfc\\x5b\\x07\\x5b\\xcb\\xce\\xa1\\x00\\x2e\\x2c\\x32\\x73\\x63\\x77\\x3a\\x5e\\x4c\\x65\\x70\\x66\\x51\\x6a\\x11\\xef\\x51\\x88\\x69\\x28\\x73\\x04\\x1c\\xd4\\xe7\\x45\\x98\\xf8\\x7c\\x67\\x36\\x3f\\xc3\\x10\\x5c\\xe8\\x41\\xd0\\xe2\\xd3\\x26\\x81\\x71\\x26\\x7a\\x3c\\x0e\\x23\\x95\\x4b\\x1c\\x87\\x51\\xc4\\xe2\\x79\\x48\\xac\\x63\\x8e\\xb7\\xd4\\xb6\\x11\\xb1\\x99\\xeb\\x73\\xea\\x05\\xcd\\xa8\\x04\\x3c\\xde\\x83\\x08\\x5b\\xee\\x40\\x00\\x4f\\xe0\\x73\\x11\\x82\\x99\\x25\\xec\\x17\\x80\\xfb\\x31\\xcc\\xc3\\x98\\xd4\\xb7\\xfe\\x95\\x88\\xe1\\x79\\xe7\\x7b\\x2c\\xf0\\xf8\\x6f\\x01\\xbb\\x46\\x85\\x87\\x23\\xc2\\x26\\x66\\x6f\\x2c\\xac\\xe4\\xa0\\xd0\\xc6\\xc4\\xa5\\x0b\\x62\\xcc\\x2f\\x82\\xb1\\x7f\\x8d\\x8a\\x1f\\xb5\\xa5\\x12\\x2c\\xf5\\x39\\x9f\\xf8\\x71\\x6e\\xf2\\xf8\\x58\\x84\\xb3\\x59\\x18\\x4c\\x57\\x70\\x1b\\xf0\\xdb\\xb9\\x1b\\x43\\x23\\x89\\x16\\xc1\\x98\\xf2\\xa9\\x88\\x5b\\x43\\x03\\x4f\\x46\\x3f\\xb6\\x01\\xe7\\xbc\\xcf\\x9d\\x3b\\xc5\\x80\\xa5\\x21\\x34\\x5d\\xf8\\x11\\xa7\\x32\\x50\\xe4\\x9b\\x16\\xd6\\x76\\x7b\\x9d\\x8e\\xc6\\x61\\x04\\xcd\\xb3\\x55\\x32\\x09\\x03\\xf8\\xb1\\xcc\\xb5\\x67\\x9c\\xe6\\x53\\x4d\\x97\\x67\\xf3\\x29\\x13\\xe2\\x8e\\x09\\x83\\xa3\\xc3\\xc3\\x43\\x78\\xb6\\xbb\\xa3\\x34\\x2d\\x6f\\xdd\\x25\\xb8\\x87\\xbf\\xbc\\x39\\x3e\\x7a\\xcb\\x3f\\xbf\\x80\\xc3\\xc5\\x78\\xea\\x7b\\xbe\\x1b\\x64\\x37\\x2b\\xe0\\x2b\\x98\\xa3\\xda\\x0c\\x5a\\xf0\\x04\\x50\\xa8\\xd8\\xe4\\x2b\\xda\\x1d\\xc5\\xcd\\xa0\\x55\\xc6\\x33\\x3f\\x35\\x85\\xa5\\xe4\\x4e\\xef\\xdd\\x55\\xb6\\xa2\\xaa\\x96\\x25\\xaf\\x5f\\x9e\\x37\\x87\\xb0\\xc8\\xbd\\x29\\x63\\x8e\\x93\\x5b\\x1e\\x88\\x62\\x13\\x7c\\xf8\\x88\\xe4\\xa7\\x6b\\x06\\x37\\x3f\\xbf\\x73\\x2a\\xfb\\x3d\\xbb\\x7f\\x96\\x3a\\x7c\\x30\\x4d\\x26\\xe1\\xe2\\x7a\\x42\\x11\\x7f\\x90\\x16\\xe6\\x76\\x6f\\xfe\\x12\\xcd\\x81\\x3b\\x14\\x56\\x81\\x1f\\x77\\x41\\x98\\x60\\x74\\x5c\\xfe\\xfe\\x6a\\x31\\x85\\x88\\xc5\\x8b\\x69\\x52\\x3c\\xa3\\x0d\\x4c\\xf5\\xfb\\xd3\\xb7\\xbf\\x1c\\x9f\\x4a\\x96\\xba\\x06\\x9b\\xf5\\x62\\xcd\\x7b\\x78\\x59\\x22\\x2b\\x23\\x1b\\x11\\x9e\\xf2\\x5b\\x12\\x9e\\x85\\xf7\\x2c\\x32\\x0e\\x52\\xd6\\xce\\xd1\\x15\\x9c\\x9d\\xfe\\xe3\\xb7\\xb3\\x0f\\x87\\x6f\\x8e\\x3e\\x1e\\x9d\\x9e\\xf0\\x45\\xd1\\xc7\\xf1\\xc0\\x3c\\x45\\x94\\x58\\x67\\x11\\xa0\\x80\\x90\\x79\\x1a\\x04\\xf4\\x90\\xf3\\x30\\x87\\x24\\xe5\\xb4\\x8d\\x44\\x15\\x8f\\x25\\x72\\xaf\\xc8\\xcc\\x79\\x14\\x8d\\x1e\\x17\\xc6\\x88\\x42\\x35\\x68\\x04\\x4b\\xdd\\xf4\\x72\\x4e\\xfa\\x72\\x3d\\xaa\\xef\\x4e\\x3f\\xbc\\x3f\\x38\\xd7\\xc6\\xf2\\x95\\x8f\\x10\\x15\\x7c\\x64\\x73\\x37\\xe2\\x67\\xf0\\x1e\\x34\\xba\\x1a\\x59\\xb5\\x7c\\xae\\xa3\\x70\\x31\\x57\\x0b\\x3b\\x95\\x85\\x31\\x2e\\xf0\\xb6\\xb9\\x54\\x8c\\xa6\\x15\\x6e\\xb4\\xfa\\x39\\x2b\\x6e\\x90\\xb2\\x01\\xa6\\xa5\\x73\\x91\\xb8\\xfc\\x5c\\xc4\\xe4\\xd3\\xf2\\xa0\\xdf\\x70\\xd2\\x91\\x0d\\xc2\\xa0\\x33\\x8a\\x98\\x8b\\x86\\xcb\\xf1\\xdc\\xd5\\x24\\x7b\\xd5\\x83\\x24\\x04\\xb4\\x85\\x73\\xd6\\x0c\\xf2\\xa9\\x96\\xcf\\x6d\\xfc\\xe8\\x64\\x74\\x9c\\x7b\\x3b\\x3d\\xf9\\x78\\xfe\\xe1\\x97\\x37\\xe7\\xa7\\x1f\\xb4\\xf8\\x14\\x45\\xe0\\x5a\\xa1\\x2c\\xd2\\x2c\\xd2\\x00\\x2a\\x99\\x2b\\x72\\x0a\\x74\\x9d\\x80\\x97\\x33\\xd7\\xd2\\xea\\x8e\\xe2\\x76\\x67\\xd0\\x4b\\x21\\xc8\\x72\\x98\\x04\\xf0\\x3b\\xed\\xf6\\x07\\xb2\\x18\\x7b\\x48\\x2b\\x7e\\x85\\x03\\x08\\x84\\xea\\x8a\\xfc\\x94\\xd5\\x7a\\x17\\xa3\\x4b\\x59\\xf3\\x2b\\x76\\x07\\x0d\\xdc\\xc3\\x2b\\x08\\xba\\x70\\x44\\x92\\x47\\x07\\xb6\\xf8\\x46\\x7b\\xba\\x93\\x89\\x1d\\xed\\x12\\xf1\\x54\\xf6\\x9c\\xdd\\x13\\x20\\x70\\x60\\xa4\\xcd\\xf3\\x08\\x32\\x2c\\xb6\\x03\\xcc\\x01\\xdf\\xe1\\xb8\\x3a\\x30\\x65\\x01\\xf9\\xa7\\x1a\\x97\\xd5\\x92\\x73\\xec\\x13\\x3f\\xd6\\xe4\\x41\\x17\\x13\\x79\\x18\\x70\\x3e\\x34\\x37\\x2b\\x0b\\x0c\\xd5\\x22\\x63\\x73\\x05\\xcc\\x70\\x3b\\xf1\\xaf\\xa0\\x09\\x8f\\x9a\\xb0\\x54\\x4d\\x20\\xb3\\x99\\x68\\x61\\x47\\x8c\\x98\\xf5\\x7a\\xd0\\xc8\\x7a\\xde\\xca\\x21\\xc0\\x19\\x69\\xb5\\xfd\\x3d\\xf8\\x3d\\xf8\\x5a\\xce\\x9b\\xa7\\x22\\x42\\x77\\x85\\x16\\x44\\xae\\x1f\\xb3\\x26\\x6c\\x3d\\x75\\xa0\\x61\\x03\\xd9\\x70\\x20\\x80\\xea\\x8c\\xd2\\xf9\\x7b\\x9c\\x98\\x1f\\x93\\x6b\\xa2\\x69\\x88\\x1b\\x79\\x28\\x2d\\x5a\\x3d\\x01\\xc5\\xd4\\x16\\x82\\xeb\\x3d\\xf8\\x7d\\x64\\xe8\\xa2\\x11\\x02\\xef\\x4a\\x78\\x45\\xc2\\x6d\\x4b\\x7d\\x9c\\xa7\\x11\\x64\\x56\\x9a\\xf0\\x28\\xbb\\x34\\x35\\x61\\xe4\\xc0\\x96\\x03\\x4f\\x77\\x1c\\xf0\\x3d\\x07\\x1a\\x1c\\x72\\xa3\\xc6\\xe4\\xbd\\x5d\\xcc\\xa7\\xfc\\xa0\\x30\\x5c\\x61\\xd2\\x86\\x03\\xd3\\xea\\xb0\\x3b\\x15\\x2e\\xbb\\x31\\x0c\\x21\\xe8\\xc6\\x76\\x37\\xc2\\x65\\x17\\x3d\\xbe\\xba\\x15\\xde\\x86\\xcb\\xee\\x18\\x86\\x88\\x0c\\x2f\\x3c\\x86\\x16\\xec\\x73\\xd8\\x53\\x7f\\xcc\\x9a\\x68\\xa9\\x68\\xaf\\x4e\\x5a\\x17\\x7b\\x19\\x5a\\x30\\x36\\x4f\\x46\\xfb\\x38\\x35\\xf9\\x96\\xe6\\xbb\\x55\\x84\\xac\\x00\\xd5\\x04\\x16\\x0d\\xa7\\xf9\\xcd\\xa6\\x8f\\xe1\\x88\\x6a\\x8e\\xde\\x80\\x5f\\xc4\\xe0\\x15\\xf4\\x61\\x5f\\xf4\\xbd\\x13\\x38\\xd0\\x19\\x00\\xef\\xf2\\xc0\\x40\\x12\\xe4\\xd3\\xeb\\xc1\\x3b\\x37\\x4e\\x60\\xee\\x26\\x13\\xe4\\x0e\\xa5\\x86\\xc5\\x3c\\xdf\\x90\\xcd\\xf9\\x70\\x38\\x84\\xff\\xfc\\xcf\\xa0\\x12\\x51\\x90\\xa1\\x22\\x80\\x51\\x9c\\x08\\x9f\\xcf\\xd0\\x4b\\xc0\\x8c\\x60\\x03\\xcc\\xcd\\xd6\\x1b\\xa2\\x22\\x97\\xb5\\xdb\\xb6\\xfd\\x9a\\xf5\\x9c\\x03\\xaa\\x58\\x0e\\x90\\x2e\\x89\\x8b\\x40\\x93\\x1f\\xae\\xd4\\xa7\\x1a\\xd3\\x0f\\x35\\x96\\x00\\xd8\\x97\\x01\\xa4\\xae\\xaa\\x18\\xc2\\xcc\\x96\\xa2\\xab\\x8e\\x93\\x2f\\x91\\xe7\\xd4\\x20\\x83\\x92\\x96\\xe4\\x1a\\xc0\\x5d\\x2e\\x3d\\xe4\\x14\\xb3\\x8e\\x26\\x2c\\x45\\xd8\\x03\\xbe\\x24\\x2b\\x06\\x9d\\x96\\x5a\\x9c\\x44\\xdd\\xf1\\xc4\\x8d\\xde\\x84\\x1e\\x3b\\x48\\x9a\\x7d\\x32\\x98\\xdf\\xd9\\xc5\\x95\\xa7\\xf8\\x4f\\xe3\\x8e\\x1b\\xb4\\xd4\\x55\\x68\\x1e\\xa9\\x8d\\xba\\x3e\\x82\\x21\\x8c\\xe0\\xc1\\x36\\x5f\\xf9\\x41\\xb6\\x11\\xb9\\xc3\\x20\\x46\\x59\\x0e\\x8d\\x51\\x1a\\x66\\x18\\xef\\x3b\\x94\\x88\\xb3\\xa0\\x74\\x73\\x45\\x84\\x36\\xba\\x17\\x71\\x5a\\x6a\\xd9\\x2f\\x69\\x56\\x2c\\x9d\\x40\\x5a\\x18\\x5d\\x92\\x64\\x86\\x83\\x44\\x92\\x3f\\xe8\\xa7\\x9a\\xfe\\x0a\\xba\\x8b\\x04\\x7f\\x50\\x83\\x54\\x94\\xd4\\xc0\\x26\\x92\\xbd\\x0f\\x01\\xec\\xe1\\xe0\\x55\\x2c\\x09\\x19\\x2f\\x8a\\x8f\\x12\\xae\\xa5\\xc2\\x20\\xb5\\x71\\x97\\xb6\\xf9\\x0d\\x2e\\xaf\\x27\\xb1\\x3a\\x82\\x5b\\x87\\x11\\x7d\\x7f\\xe6\\x61\\x22\\x06\\x91\\xd3\\xaa\\x68\\x1e\\x31\\x31\\x94\\xe1\\x55\\x26\\x14\\xe6\\x9c\\xe4\\x89\\x7b\\xc2\\x67\\x0a\\x47\\x74\\x67\\x47\\x04\\x16\\xaa\\x98\\xa8\\x60\\x25\\x2f\\x8a\\x7e\\x90\\x9b\\x30\\x7e\\x75\\xa2\\xab\\xdc\\x95\\xeb\\x4f\\xc1\\x5b\\x30\\x29\\xe2\\xba\\x38\\x64\\x97\\x17\\xed\\xce\\x65\\xc5\\x4c\\xd5\\xa5\\xfc\\x8f\\x28\\x6c\\xab\\x75\\xe8\\x1f\\x35\\x41\\xc9\\x60\\x04\\x8d\\x5f\\x3b\\xfb\\x0d\\x68\\x43\\x13\\xc6\\x69\\x70\\x0a\\x69\\x51\\x24\\x36\\x23\\x27\\xba\\x9c\\xe7\\x6c\\x43\\xe3\\xb2\\xcd\\xdb\\xd3\\xbb\\x82\\xaa\\x4f\\xa3\\xb9\\xbf\\xf7\\xe9\\x53\\x97\\x03\\x1b\\xf3\\x7a\\xad\\xfd\\xbf\\x34\\x9c\\x11\\xbc\\x82\\xed\\x67\\xb0\\x0f\\x0d\\xbf\\x81\\xf1\\x1a\\x39\\x75\\x21\\xa2\\x83\\x41\\x2e\\x6a\\xe6\\x28\\x34\\xd2\\x21\\x0b\\xe7\\x05\\xd5\\xc7\\x6b\\xb0\\x98\\x6d\\x72\\x66\\xda\\x29\\x57\\x35\\xf9\\x15\\x12\\xec\\xc7\\x8f\\x11\\x86\\x74\\x3d\\x86\\xde\\xaf\\xfd\\x4f\\xdd\\xfe\\x93\\x87\\x4f\\xdd\\x9e\\x83\\x23\\x95\\x66\\x88\\x81\\xc1\\xae\\x9d\\xf3\\x92\\x8f\\x8e\\x29\\x5c\\xd3\\xda\\xac\\x82\\xab\\x96\\x8f\\xe0\\xa8\\x7d\\xd4\\xc6\\x2b\\xf6\\x6d\\x15\\x0c\\x34\\x54\\x1f\\x76\\x18\\x06\\x9b\\xdd\\xb1\\x20\\x81\\xa9\\x9b\\xb0\\x48\\x49\\xe1\\x2f\\xc6\\x23\\x0c\\xf8\\xbd\\xe0\\x8e\\xe1\\xfd\\x50\\xd8\\x41\\x5a\\x41\\xd2\\x4e\\xd2\\xe4\\x61\\xc9\\xa1\\x55\\xe7\\xf8\\xfc\\x03\\xcf\\xb5\\x8a\\x83\\x49\\xf4\\xf8\\x27\\x97\\x0f\\x3b\\x2e\\x7f\\xce\\xff\\x8c\\x1c\\x44\\x69\\xed\\xcb\\xc7\\x5b\\x69\\x87\\x11\\xfa\\x41\\xb2\\x6f\\xbe\\x20\\x10\\x07\\x96\\x8b\\xa2\\xd2\\x6d\\xf0\\x6d\\xfb\\x9a\\xfa\\x94\\x75\\x36\\x5d\\xc6\\x8d\\x6e\\x83\\x96\\xaf\\xe5\\x76\\x59\\x20\\x94\\x56\\x04\\x7c\\x39\\x9a\\xcc\\x8d\\xc6\\x93\\x26\\xf4\\x58\\xcf\\x07\\x42\\xa1\\x5f\\x7d\\x1f\\x61\\x09\\x8b\\x66\\x7e\\x90\\x69\\x84\\x2b\\xc8\\x2e\\xc3\\x5d\\xde\\xc2\\x6e\\xfb\\xe6\\xe9\\x62\\xd0\\x1e\\x42\\x3b\\x9b\\x64\\xf0\\xf9\\xc9\\x65\\x5b\\xf9\\xca\\xb2\\xc0\\x78\\x18\\x7e\\x70\\xdd\\x24\\xd6\\xb6\\x3a\\xcd\\x61\\x8a\\x95\\xbd\\xb3\\x42\\xe6\\x60\\xee\\xa1\\x9c\\x4b\\x9d\\x49\\x7c\\xda\\xac\\x65\\xcd\\xc8\\xb1\\x9c\\x32\\x17\\x05\\xbb\\x5f\\x58\\x14\\x1a\\x0e\\x48\\x62\\xdf\\x45\\x2a\\xe5\\xc2\\x7e\\xf1\\xc5\\x7e\\x79\\x8e\\xe9\\x94\\x6d\\x0b\\x25\\x6b\\x32\\x89\\x5c\\x7f\\x5a\\xab\\x4d\\xca\\x66\\xac\\x74\\xb3\\xd8\\x7c\\xa7\\x83\\x49\\x85\\x25\\x0a\\x86\\xe1\\x2f\\x6e\\x63\\xf0\\x51\\xb2\\x22\\xa7\\xd9\\xb8\\x62\\x0d\\xb1\\x9b\\xe4\\x53\\xc2\\xce\\xbe\\x7c\\xfd\\xd8\\x45\\x5e\\x90\\xa8\\x9c\\x64\\x23\\xef\\x58\\xa4\\x27\\xde\\x1c\\x03\\x85\\xde\\x5b\\x79\\x97\\x3f\\xf8\\xa0\\xa0\\x2b\\xdf\\x62\\xc6\\x8f\\xb9\\xec\\xc0\\xe3\\xdd\\x17\\xc7\\x99\\xf9\\x04\\xe1\\x14\\xed\\x09\\x9d\\x23\\xd6\\xa5\\xcc\\xa0\\x03\\x3e\\x74\\xac\\x87\\x6e\\xaf\\x07\\xa7\\xc2\\x0a\\x40\\x4f\\x65\\x20\\xdb\\xf9\\xaf\\x53\\xd5\\x7a\\xe5\\x61\\x8b\\xbb\\x4d\\x6b\\xfa\\x53\\x78\\xe8\\x42\\x29\\x04\\x12\\xf9\\x98\\x06\\x06\\xb8\\xbf\\x48\\x63\\x0c\\x33\\xbe\\x45\\xd2\\x20\\xcd\\x2b\\xea\\xa0\\xfd\\xef\\x65\\xb3\\x35\\x2d\\xca\\x17\\x02\\xe9\\x3e\\x58\\xee\\xc2\\x35\\xcf\\xcc\\x1a\\x97\\x6f\\xd1\\x68\\x31\\x24\\xba\\xa6\\x03\\xe7\\x91\\x1b\\xc4\\xc8\\x5e\\x73\\x4e\\xbd\\xb2\\x38\\xf9\\xba\\x49\\xe1\\xec\\xa0\\x5f\\xe3\\x20\\x10\\x35\\x7d\\x5e\\xf3\\x1e\\x75\\x32\\x49\\x08\\x48\\x05\\x90\\x2a\\x24\\x21\\x5c\\x33\\x72\\x0e\\xa4\\xc0\\xd5\\x8c\\xb4\\x8e\\x52\\x0f\\x34\\x0e\\xd9\\xd5\\x95\\x3f\\x46\\xd5\\x37\\x65\\xe5\\xb1\\xb3\\x84\\x28\\x83\\x62\\x44\\x58\\xe0\\xc7\\xd4\\xbe\\xbe\\x42\\xf8\\xa4\\x1e\\x0b\\x3e\\x3f\\x8d\\xb2\\x7a\\xd5\\x15\\x45\\x22\\xed\\x5a\\x82\\x18\\x8c\\x67\\xd5\\xe2\\x13\\x44\\x81\\x20\\x73\\xc7\\x1e\\x1d\\x60\\xd6\\x9d\\x2a\\x9f\\x8c\\x3a\\x77\\x14\\x64\\xb3\\x9c\\xde\\x75\\x70\\x01\\x5a\\x29\\x1a\\x44\\x7c\\x27\\x3f\\x0a\\x84\\x54\\x15\\xac\\x0a\\x56\\x14\\x34\\xe7\\x80\\x5f\\x03\\x2c\\x9f\\xd2\\x14\\x91\\x4e\\xe5\\x91\\x9b\\x62\\x53\\x67\\x37\\x11\\xfc\\x0e\\x66\\xc6\\xff\\x26\\x3e\\x9b\\xe6\\xe3\\x25\\xf8\\x9d\\xce\\xcb\\x34\\x7b\\x79\\xbf\\x51\\x2d\\xd9\\x51\\x87\\xdf\\x7e\\xf9\\xd2\\xbe\\x95\\x9d\\xb4\\x91\\x6c\\x3b\\x91\\xaa\\x49\\xa0\\x0c\\xfd\\x37\\xc9\\xed\\xbe\\x56\\xaa\\xb4\\xe0\\xec\\xc3\\xe9\\xd9\\xe1\\x87\\xf3\\xa3\\xc3\\x8f\\x9a\\xb2\\x99\\x2e\\x54\\xb8\\x0d\\xc0\\x50\\x3a\\x10\\x68\\x76\\x47\\x56\\x1a\\x85\\x1d\\xbf\\xfd\\x72\\xa6\\xc7\\xaa\\x58\\x0e\\xed\\x47\\x86\\xba\\x9b\\x44\\xb1\\x24\\x1a\\xcc\\x96\\xd2\\x56\\xea\\x4a\\x92\\xa9\\xc6\\x10\\xb6\\xab\\x8b\\x4a\\x0b\\xe4\\x21\\xec\\xd4\\x2c\\x2c\\x10\\xde\\xad\\x59\\x1c\\x6d\\x3b\\x86\\xf0\\xb4\\x66\\x71\\xd1\\xc9\\x67\\x35\\x8b\\xcb\\x9e\\x3e\\xb7\\x95\\x17\\xb6\\x20\\x43\\x78\\xa1\\x57\\xaa\\x66\\xaf\\x9e\\xc0\\x1b\\xb4\\xf4\\x5f\\x44\\x0c\\xfc\\xe0\\x2a\\x62\\x9f\\x17\\x2c\\x48\\xa6\\xab\\x0e\\x3a\\x09\\x70\\x6e\\x55\\x78\\xfd\\x75\\xee\\x7d\\x0f\\x9d\\x9d\\x13\\x3f\\xb8\\x36\\xe6\\xfb\\x3d\\x18\\x8f\\xd9\\x5c\\x71\\x9a\\x05\\xd4\\x85\\xa6\\xa2\\x3d\\x98\\xfa\\x71\\xe2\\x08\\x16\\x30\\x40\\xf3\\xae\\x99\\x1b\\xac\\xe4\\xb1\\x73\\x15\\x72\\x4e\\x91\\x37\\xaa\\x24\\x82\\x50\\x13\\x29\\x3c\\x01\\x74\\x3b\\x66\\x98\\xea\\x37\\x62\\x98\\x36\\xcb\\xbf\\x63\\xd3\\xd5\\x9e\\x01\\x9f\\x92\\xf3\\x40\\xa6\\xed\\xcc\\xf4\\x9b\\xd2\\x90\\x20\\x53\\x70\\xe6\\x41\\xe4\\x65\\x79\\x66\\x10\\xcf\\x4d\\x00\\x0a\\x96\\xce\\xa9\\xae\\x96\\xfe\\xbb\\xb8\\x54\\x21\\x75\\x38\\x22\\x45\\x7c\\x0a\\x83\\x50\\xeb\\xb9\\x10\\x7a\\x8d\\x14\\x62\\x1f\\xe1\\x75\\x0b\\xfd\\xed\\x5e\\x16\\x3a\\x8b\\x56\\xba\\xd9\\xa3\\xc1\\xf5\\x24\\x0c\\x3a\\x68\\x62\\xeb\\xff\\xf1\\x48\\x77\\x06\\x12\\x6b\\xf9\\xcb\\xc0\\x86\\xbd\\x60\\xd3\\x33\\xec\\x85\\x4f\\xe4\\x43\\x3a\\x65\\xc2\\xce\\x53\\x18\\x20\\x0e\\xf8\\x12\\xec\\xe7\\x61\\x08\\x23\\xc5\\x6f\\x82\\xa1\\x5a\\xf4\\x40\\x6e\\xc9\\xa4\\x0f\\x19\\xf2\\x98\\x96\\x4c\\xde\\x10\\xc6\\x0c\\xc0\\xb2\\x6c\\x85\\x81\\x4a\\xd6\\x8f\\x50\\x24\\xd3\\xce\\x9e\\x8f\\xcc\\x6e\\x00\\x53\\x9a\\xbf\\xa2\\x45\\x8b\\x04\\x4d\\xd2\\x80\\xaf\\xa5\\xf2\\x79\\x93\\x96\\x0c\\x15\\x7b\\x79\\xff\\x0b\\xcb\\x2f\\x0b\\xd9\\xfb\\x52\\xf9\\xb2\\x7d\\x8b\\xbd\\xbc\\xde\\xc0\\xc5\\x8c\\x4f\\xc9\\x7a\\xc5\\x88\\x8f\\x5a\\xb5\\xa9\\x38\\x5e\\xb9\\x31\\xbf\\x77\\x92\\x4e\\x25\\x73\\x22\\x12\\x73\\x23\\x88\\xa4\\x42\\xed\\xdc\\x88\\x14\\xe8\\x28\\x31\\x14\\xe6\\x6b\\x77\\xee\\xd4\\xf7\\xf8\\x35\\xad\\x65\\x68\\xef\\xb0\\x7b\\x9d\\xb3\\xea\\x28\\xba\\x71\\x35\\xb7\\xfa\\x0e\\xec\\xa0\\x71\\x69\\xce\\x0e\\xd2\\x5a\\xe7\\xf7\\x22\\xe9\\xdc\\x43\\xbf\\xab\\x3c\\x31\\xdc\\x83\\x1d\\xf8\\x6a\\x42\\xeb\\xe8\\x3a\\xe0\\xf7\\xef\\xac\\x77\\x3d\\x85\\x7a\\xc7\\x0c\\x2d\\x31\\x51\\x73\\x1f\\x46\\x90\\xc6\\x20\\xca\\x75\\xe4\\x83\\xb0\\x8c\\xc9\\x67\\xbf\\x14\\x31\\x4d\\xd2\\xc4\\x6a\\x8b\\x28\\x4a\\xad\\xe7\\x63\\xbb\\x6d\\x4a\\xb1\\x97\\x4a\\x98\\x08\\x28\\x85\\x6d\\x91\\x0f\\xa6\\xef\\x73\\x60\\x6e\\xb6\\x46\\xf1\\xcd\\xce\\x8b\\xfc\\x89\\x30\\xdb\\xa9\\xf9\\x77\\x57\\x4d\\x98\\x6e\\x2e\\x16\\xf2\\x62\\x17\\x7d\\x8d\\xef\\xae\\x7c\\x26\\x6e\\x0c\\x43\\x08\\xe1\\xf1\\x63\\xa9\\x74\\x09\\x41\\x09\\x91\\x66\\xe5\\x8a\\xf7\\xf3\\x23\\x41\\xb7\\xac\\xb0\\x10\\xa3\\xa1\\x39\\x57\\x54\\xab\\x4d\\xb8\\xe3\\xad\\x5d\\xcc\\x2f\\xa1\\x05\\x8f\\x84\\x70\\xc0\\xc0\\x33\\xcb\\x67\\x4f\\xd7\\x8a\\x9b\\xa9\\x09\\xfc\\x22\\x78\\xf7\\xc2\\x6f\\xb7\\xf3\\x0d\\x58\\x84\\x6d\\xf9\\x15\\x9b\\x12\\x4d\\xcb\\x51\\x6f\\xb4\\x70\\x6c\\x88\\x7d\\xd0\\x2a\\x42\\x2d\\xd9\\xb7\\xdc\\x59\\xec\\x5b\\x4c\\x40\\x0a\\x26\\x2e\\x26\\x10\\x38\\x3c\\x13\\x37\\x6e\\xc2\\x1c\\x86\\xd0\\xc8\\x03\\x11\\x4a\\x34\\xd5\\xe6\\xe5\\xce\\xe1\\xf7\\xd9\\xf7\\x07\\xff\\x44\\xdb\\x97\\x39\\xd8\\xd5\\x53\\x25\\xc7\\xca\\x3b\\xb3\\x7e\\x59\\x3f\\xad\\x11\\x9f\\xfc\\x61\\x01\\x90\\x79\\x7e\\xf2\\xc4\\xc3\\x30\\x3d\\xcf\\xd7\\x9a\\x9c\\x3c\\xc8\\xcd\\xe6\\x26\\x0f\\x63\\xb3\\xa9\\xc9\\xc1\\x30\\xce\\xcc\\xf3\\x5a\\xf3\\x52\\x74\\xb2\\xdb\\x74\\x5a\\x72\\x70\\x2c\\xba\\x8c\\x3c\\x7b\\x5a\\xe2\\xf8\\x4c\\xf5\\x2a\\x79\\x56\\x13\\x0f\\x8a\\xbf\\xeb\\x36\\xa3\\x41\\xa3\\x9c\\x9b\\xac\\x02\\xb6\\x9b\\xcd\\x78\\x01\\xc8\\x66\\x53\\x9e\\x07\\x52\\x69\\x5b\\x46\\x62\\x2b\\x99\\xea\\xb0\\x5a\\x71\\x2c\\xca\\x2b\\x4b\\x88\\xd3\\x7e\\x1c\\x4a\\x5c\\x4b\\x62\\x21\\x15\\xd7\\xd9\\xc5\\xe0\\x72\\x2d\\x22\\x20\\x9f\\x9c\\x07\\x23\\x6f\\xca\\x6e\\x6b\\x52\\xa8\\x46\\x2e\\x82\\xbc\\xf1\\xea\\x6a\\xe6\\x13\\x42\\x95\\x0a\\x17\\x36\\x0f\\x75\\x7b\\x9d\\x4e\\xe5\\x5d\\x32\\x9b\\x79\\x4c\\xf9\\xe1\\x42\\xca\\xf0\\xce\\x1d\\xec\\xc1\\x1d\\xb4\\x38\\xde\\x1b\\xc8\\x82\\x6c\\xfb\\xef\\xc2\\x10\\xfa\\x02\\x4c\\x32\\xe2\\xd4\\x4b\\xb2\\x7c\\xeb\\xda\\xe4\\xd2\\x95\\x87\\x6c\\xba\\x5b\\x89\\xdd\\xa8\\xbd\\x5f\\xd5\\xde\\x95\\x84\\xf6\\x86\\xe4\\x17\\xeb\\x8a\\x44\\xd1\\x23\\x86\\xfa\\xb1\\xf5\\xea\\x6e\\x48\\xb2\\x79\\xdd\\x3f\\x77\\xdb\\x76\\x06\\xf6\\x7d\\x3b\\x58\\x7f\\xdf\\x66\\x8e\\xa9\\xf5\\x37\\x6d\\xe6\\x7f\\xf9\\xdf\\x6a\\xc7\\x22\\x94\\x3b\\xda\\x88\\xaa\\xc3\\x6d\\x53\\x41\\x78\\xfd\\x8d\\xcb\\x9f\\x14\\xc9\\xa2\\x39\\x35\\x47\\xac\\x0d\\x8d\\xc2\\xea\\x6b\\x38\\x1c\\xf0\\x77\\xa6\\x05\\x45\\xb7\\x67\\x1b\\x15\\x10\\x72\\x8c\\x92\\xe8\\x41\\x23\\x78\\xa8\\x73\\x64\\x12\\x34\\x6b\\x94\\xa8\\x35\\x8e\\x3d\\x84\\x56\\x6f\\xdf\\xdc\\xa1\\x8e\\xfa\\xd1\\xa3\\x3b\\xcc\\x3e\\x8a\\x5f\\x06\\xd9\\xc7\\x6a\\x23\\xbe\\x3a\\x16\\xaa\\x39\\x47\\xd9\\x66\\xe6\\xd0\\xcb\\x5b\\x6d\\xc1\\xbe\\xc1\\x39\\x16\\xf6\\xb4\\xee\\xb9\\x95\\x8a\\x42\\x75\\x11\\x55\\x18\\x7e\\xe5\\x96\\x98\\x08\\xd7\\xf5\\xfd\\x17\\x16\\x21\\x63\\x5e\\x4a\\x42\\x9c\\xf5\\x9d\\x96\\x92\\x80\\xb6\\xe9\\x52\\xca\\xc1\\x22\\x17\\x63\\x58\\x04\\xa9\\xd7\\xf0\\x1e\\xfc\\x4e\\x2f\\xeb\\xad\\x44\\x42\\xe6\\xcf\\x59\\x89\\xa9\\xeb\\xf2\\xa3\\x47\\x1c\\xd8\\xe3\\xc7\\x12\\xfd\\xec\\xae\\x2d\\x5e\\xa8\\x31\\xc9\\x2b\\xc8\\x92\\xc0\\xec\\xf1\\x63\\x78\\x24\\xe0\\x67\\xa6\\x06\\x2a\\x8d\\x6a\\x94\\x87\\xaa\\x21\\x23\\xd7\\x59\\x97\\xd3\\x7f\\xd3\\x35\\x4b\\x9d\\x35\\xaf\\x59\\x55\\x7c\\x6a\\xb8\\x25\\xbe\\x58\\xeb\\x96\\xa8\\x02\\xdc\\x8c\\x49\\x51\\x21\\x6c\\xc6\\x6e\\x28\\x10\\x8c\\xf7\\xc3\\x17\\xb5\\xce\\xca\\xbc\\xbf\\xe8\\xa6\\xb7\\x43\\x05\\x8a\\x79\\x26\\xf2\\x72\\xe8\\xef\\x24\\x50\\xc9\\x03\\xdd\\x6c\\x3e\\xf2\\x30\\x36\\x9b\\x91\\x1c\\x8c\\x6f\\x96\\xa6\\x14\\x7d\\x57\\x37\\x9d\\x97\\x1c\\x1c\\xf3\\xcc\\x08\\x11\\xb2\\x94\\xea\\x57\\x8f\\x98\\xa8\\x20\\x86\\x9b\\xaa\\xd5\\x1f\\x2b\\xaa\\x5d\\x8f\\xd6\\x0a\\x7a\\x78\\x97\\x27\\x85\\x15\\xa4\\x27\\xf5\\xa7\\xbd\\xfb\\xc3\\xe8\\x59\\x23\\xdf\\xf9\\x3f\\x80\\xcb\\xa3\\x4e\\x18\\x26\\x4d\\xba\\x0f\\x68\\x14\\xf7\\xd5\\x6a\\xda\\x0f\\xaa\\x93\\x68\\xe6\\xbb\\x70\\x3f\\x09\\x63\\x96\\x39\\x70\\x24\\x8a\\xfb\\xb7\\x50\\xaa\\xa6\\x82\\x65\\x93\\xce\\x36\\x8b\\xb0\\x68\\xf4\\x21\\xad\\x29\\x53\\x9f\\xb9\\xcb\\xa2\\x40\\x5d\\x76\\x7a\\xe6\\x2e\\x4f\\xa3\\xf7\\x7e\\xd0\\x54\\x04\\xdd\\x70\\xd6\\x9d\\x26\\xd0\\x7a\\xf9\\x9d\\xbb\\x2f\\xe2\\x05\\xfd\\x0b\\xba\\xef\\x07\\x6b\\x76\\xff\\xfa\\x5b\\xbb\\xef\\x27\\x13\\x70\\x65\\x48\\x16\\x1a\\x06\\xf6\\x79\\xe1\\x4e\\x39\\x55\\x0e\\x23\\xb8\\x46\\x27\\xe3\\x88\\x4c\\x20\\xfb\\xe8\\x22\\x32\\x65\\x71\\x2c\\x4c\\x22\\x9d\\xdc\\x30\\x04\\xc2\\x1d\\xc7\\x9b\\x3b\\xbc\\x6a\\x41\\x36\\xec\\x5f\\x81\\x37\\xe7\\x43\\x1c\\xce\\xfc\\x24\\x61\\x9e\\x53\\x8c\\xed\\xd7\\x44\\xe3\\xf6\\x18\\xed\\x37\\xa5\\xa5\\xab\\x0a\\x1f\\x8d\\x5e\\x51\\xbd\\x35\\x8f\\x42\\x6f\\x31\\x66\\x9e\\x31\\x8e\\xf9\\x85\\x37\\x57\\xbc\\x92\\xdf\\xe6\\xda\\xe9\\xd6\\x3c\\x7a\\x72\\x00\\x1b\\x34\\x40\\xcd\\x56\\x11\\xe9\\xd2\\xd1\\xe3\\xcd\\x55\\x6a\\x68\\xa9\\x59\\x38\\x70\\xcc\\xf5\\x6a\\x32\\xb9\\xd6\\x85\\x25\\xe6\\x77\\x08\\xcd\\x7a\\xca\\xaa\\x79\\x78\\xbf\\xf5\\xdb\\xee\\x36\\x86\\x9c\\xdd\\xea\\xab\\x8f\\x45\\xee\\x24\\x57\\xd8\\xee\\x36\\x8c\\xfc\\x24\\x15\\x07\\x05\\x8e\\x30\\x20\\xec\\xc3\\xab\\x21\\x7a\\x90\\xbc\\xe8\\xf7\\x9f\\x0d\\x5e\\xbc\\xd8\\xda\\xdd\\x79\\xb6\\xd3\\x7f\\xf1\\x62\\xcb\\x78\\xe0\\xbf\\x41\\xaf\\x07\\xff\\x8a\\xc2\\x18\\xa7\\x23\\x22\\xe6\\x5f\\xb5\\xce\\xdd\\xde\\xe2\\x6d\\xc6\\x62\\x44\\xbd\\x70\\x16\\xb0\\xd8\\x1c\\xdf\\xea\\xe8\\x0a\\x7c\\x8a\\xac\\xef\\x80\\x1b\\xc7\\x8b\\x19\\x46\\x47\\x9b\\x32\\x37\\x4e\\x04\\xf6\\xf9\\x85\\xe6\\x90\\xd7\\xda\\xbd\\x1f\\xb3\\x52\\xf9\\xed\\x3e\\x96\\x37\\xb6\\xd5\\x5f\\xee\\x88\\xa1\\xe3\\x8b\\x7f\\xeb\\xd7\\xed\\xbe\\x03\\xfd\\xe5\\x73\\xe5\\xcd\\xd6\\xb6\\x93\\x86\\x07\\x16\\x6f\\x30\\x88\\xaf\\x1e\\x24\\x9f\\x1e\\xea\\xe2\\xee\\xf6\\xc8\\x4f\\xc4\\xa5\\x35\\x3f\\x40\\x4f\\xe4\\x04\\xb6\\xe0\\x71\\x0a\\xda\\x78\\x4a\\x15\\xf5\\x76\\x29\\xc5\\x11\\x61\\xa4\\x9b\\x60\\x80\\x8e\\xa4\\xc7\\x08\\xb6\\xa8\\xa8\\x93\\x4a\\xb9\\x12\\xae\\xca\\x08\\x3d\\x40\\x9f\\xde\\xd0\\xf8\\x54\\xb9\\x5c\\x69\\x40\\x3d\\xcf\\x00\\x99\\x15\\x7d\\x02\\x95\\x0c\\x3f\\xaf\\x14\\x71\\xbe\\x38\\xe4\\x2e\\xfa\\x99\\x30\\x07\\x6e\\x1d\\xb8\\x33\\xeb\\x4f\\xa1\\x5a\\x97\\xcb\\x1f\\xb2\\xf3\\xb5\\x97\\xe1\\xdd\\x2a\\x79\\x20\\x9e\\x9e\\x1c\\xda\\xec\\x4c\\x3d\\xce\\x69\\xf1\\x3f\\x06\\x8f\\x76\\x4e\\x9a\\x25\\x43\\x3a\\xd8\\x41\\xe1\\x46\\x49\\x47\\xef\\xcd\\xed\\xe2\\xbc\\x5b\\x18\\xa6\\x81\\xc8\\x39\\x44\\xe8\\x29\\x06\\xa7\\x16\\xdc\\x38\\xcf\\x45\\xd7\\xb6\\x3a\\x26\\xda\\x3f\\x45\\xe1\\x7d\\x8c\\x6a\\x7e\\x8a\\xd6\\xef\\x07\\xd7\\x82\\x12\\x76\\xaf\\x59\\xf2\\x01\\xa7\\xfc\\xef\\x15\\xce\\x89\\xb2\\x55\\xe5\\xa2\\xad\\x07\\x51\\xcf\\xb1\\xcc\\x85\\xa1\\xa1\\x3e\\xb9\\x16\\xfe\\xe2\\x07\\xc9\\xf6\\x16\\x89\\x79\\xe1\\x16\\x9e\\x0c\\x61\\x6b\\x2d\\xb3\\x60\\xb2\\x03\\xbe\\x7d\\x59\\x0f\\x1b\\x31\\x4e\\x82\\x5c\\xed\\xd5\\x2d\\x2f\\xb6\\xdf\\x3c\\xbc\\x6f\\x6e\\x39\\xb0\\xbd\\xd5\\xc2\\x94\\xd2\\xf0\\x04\\xd4\\xd7\\x5b\\x83\\x56\\x2b\\xcb\\x50\\xb4\\x65\\x4e\\xf8\\x5a\\x00\\x3e\\xe0\\x0f\\xfd\\x35\\x7e\\xa0\\xfd\\x29\\x8f\\x93\\xf4\\xc3\\x37\\xe2\\xff\\xfa\\xf5\\x6b\\x18\\x0c\\x36\\x42\\xba\\xce\\x63\\xe8\\x4f\\xdd\\x26\\xc4\\x21\\x2a\\x89\\xbb\\x7d\\xc5\\xca\\x47\\xd8\\x2e\\x5c\\x22\\x59\\xa3\\xfa\\x6d\\x68\\xba\\x17\\xe8\\x65\\x75\\x29\\x7b\\x5c\\x63\\x75\\x81\\x3c\\x9f\\xf9\\x95\\x85\\x93\\xbb\\xd8\\x9d\\xcd\\x39\\x77\\x55\\x7b\\xd1\\xe0\\xc9\\x7d\\xa7\\x39\\xb9\\xeb\\x02\\x38\\x8b\\xc2\\x91\\x3b\\xf2\\xa7\\x7e\\xb2\\xa2\\xa4\\x48\\x77\\xf0\\x7a\\x08\\x2f\\xd8\\x60\\xd7\\x29\\x85\\x5d\\x33\\x43\\xc9\\x35\\x0d\\xbd\\x12\\x36\\xf0\\x9f\\x43\\xe8\\x77\\xfb\\xfd\\xfe\\x73\\x07\\xfc\\x2e\\xeb\\xc2\\x00\\xfc\\x00\\x06\\x5b\\xbb\\xf5\\x26\\x4a\\xc8\\xd2\\x04\\x62\\xb5\\x6d\\xf1\\x41\\xb8\\xd6\\xd7\\x25\\x0d\\x5b\\xb5\\xac\\xf2\\xe5\\x83\\x2b\\x60\\x08\\xa3\\x8b\\x7e\\x8d\\x70\\x0c\\x4a\\x25\\x5a\\x24\\xbc\\x62\\x31\\x47\\xad\\xe9\\xa9\\x36\\x4a\\x2f\\x3e\\xca\\xca\\x18\\xc2\\xf3\\x17\\xf9\\x67\\x6d\\x28\\xcd\\x3b\\xf8\\x11\\xd3\\x2d\\xb4\\xf8\\xb7\\x0d\\x81\\x49\\xbb\\x7c\\x09\\x6b\\x9d\\xa1\\x46\\xdf\\x09\\x8d\\xa9\\xb8\\xee\\xb1\\xdb\\x28\\xd5\\x2b\\x81\\xd9\\x79\\xa0\\xc7\\x9b\\xac\\x2c\\xdb\\xeb\\xc1\\x49\\xe8\\xb1\\xee\\x8d\\xee\\x40\\x24\\x06\\xe8\\xa7\\x55\\x52\\x75\\x18\\xaa\\xba\\xb6\\xd2\\x99\\xa8\\x40\\xa9\\xed\\x68\\x3d\\xc2\\x04\\x3a\\xeb\\x9c\\x9c\\x4a\\x2b\\xe2\\x90\\x7c\\xf6\\x47\\x1f\\x91\\xfd\\xe5\\x40\\xbd\\xc1\\x10\\x15\\xde\\x79\\xee\\xe4\\x7f\\x10\\xaf\\x6b\\x1f\\x44\\x4a\\x65\\xc1\\xd8\\x6f\\x29\\x10\\x05\\xa9\\xdf\\xf9\\x9e\\x27\\xe7\\xb7\\x1e\\x42\\xdf\\x44\\xc4\\xef\\x50\\x35\\xd6\\x24\\x7a\\xf4\\x18\\xb6\\x07\\x40\\xfc\\x76\\x7e\\x68\\x5b\\x18\\x51\\x21\\x25\\x3f\\x85\\x02\\xb5\\x42\\x28\\xc8\\x47\\x82\\xd9\\x2a\\x80\\xc9\\xb5\\xb1\\x9d\\xfb\\x71\\x23\\xf8\\x3b\\x97\\xf0\\xea\\x15\\x0c\\x9e\\xe6\\xe0\\xee\\xe2\\xcb\\xe7\\xf8\\x8e\\xde\\x3c\\xad\\xf2\\xca\\x93\\xcf\\x37\\x9c\\x22\\x9a\\x2d\\xf2\\xac\\xd5\\x1d\\x87\\xf3\\x55\\x93\\xdf\\x3f\\x8c\\x5e\\xd2\\xc5\\x67\\x73\\x4a\\xfe\\xdf\\x83\\x06\\x6b\\x3c\\x59\\x74\\xcf\\xf7\\xa4\\xc1\\x15\\x4d\\xae\\x2d\\x36\\x86\\x4c\\x74\\x3c\\xd8\\xd9\\x5c\\xfd\\x66\\xef\\x84\\x3d\\xf2\\xcb\\x2f\\x31\\x53\\x2f\\xee\\x7b\\x52\\x01\\x29\\x83\\x46\\x43\\x18\\x49\\x0c\\xfc\\x58\\xc5\\x0c\\x25\\x79\\xb5\\x22\\x4c\\x83\\x4c\\x64\\xe7\\x57\\xd2\\x63\\x0d\\xfd\\xb6\\x15\\x07\\x41\\x72\\xf2\\x92\\x8e\\x62\\x52\\x51\\x13\\x3e\\x44\\xe6\\x68\\xfb\\x8d\\xc9\\xfc\\x77\\x98\\x2e\\xc7\\x3f\\x60\\xb4\\xf9\\x95\\x78\\x7c\\xd1\\xe9\\xf8\\x16\\x56\\xcb\\x9b\\xc3\\x8f\\xb5\\x1c\\x54\\x7b\\x3d\\x78\\x43\\x71\\x2e\\x32\\x87\\x7f\\xe1\\xd9\\x2e\\x22\\xd3\\xc7\\xf9\\x98\\xd1\\x5e\\x31\\xb3\\x85\\xf2\\xe0\\x68\\xdc\\xf2\\x53\\xde\\x9b\\x57\\x0e\\xfa\\x1d\\xe9\\x8e\\x30\\x51\\xd4\\x85\\xe2\\xbb\\xe9\\xcd\\x2b\\x58\\xc8\\x31\\x31\\xa9\\x8a\\xc4\\x88\\xef\\xa9\\x3b\\x3c\\x22\\x6c\\xca\\x18\\xeb\\x20\\x7c\\x60\\xb3\\xf0\\x4e\\x09\\x7a\\xc0\\x64\\x5c\\x63\\x91\\x89\\x29\\x62\\xba\\xf4\\x23\\xca\\x23\\x97\\x1c\\x61\\x37\\xc4\\x28\\x0c\\xe3\\xee\\x3c\\xc4\\x6c\\xa9\\x7e\\xa7\\x63\\xe5\\x3b\\x84\\x03\\x66\\x85\\xbf\\xbc\\x9f\\xc6\\xa4\\x30\\x0f\\x8e\\x90\\xf6\\x40\\x7d\\x47\\xf2\\x2a\\xd9\\x88\\x18\\x19\\x19\\x81\\xc2\\x30\\x30\\x94\\xed\\xc1\\xc3\\x34\\xb5\\x69\\x82\\x80\\x74\\xe1\\x4c\\x2b\\x3c\\xb2\\xb3\\xd0\\x73\\x9d\\x01\\x8e\\x61\\x5f\\x19\\xc3\\x78\\xe2\\x5f\\x25\\x98\\x73\\x56\\xf5\\x63\\xae\\x62\\xe3\\x70\\x61\\x2f\\x82\\x44\\xc4\\xb9\\x56\\x83\\x08\\x97\\x7c\\xc8\\xc7\\xb8\\xb0\\xf5\\xc1\\x36\\x30\\xc3\\x4d\\xb7\\x5b\\x07\\x7f\\x9f\\xa2\\x21\\xdf\\xe1\\xfe\\xec\\x5f\\xbe\\xa4\\x83\\x79\\xd0\\xe7\\x1f\\x44\\xf4\\x3c\\xbf\\xdd\\xae\\x81\\xb8\\x18\\xc7\\x44\\x4d\\xab\\x51\\x7b\\x2c\\xd3\\xa5\\xa2\\x38\\x66\\xe7\\x46\\x0e\\x3a\\xb6\\x38\\x2b\\x96\\x6d\\xc2\\xc9\\x63\\x55\\x64\\x01\\x2c\\xc3\\x97\\xe0\\xb8\\x32\\xa6\\x27\\x2f\\x6a\\xd0\\x37\\x6b\\x54\\x8e\\x2d\\x4e\\x8e\\xb5\\xfe\\xc2\\x67\\x1f\\x8e\\xfe\\x7e\\x70\\x7e\\x08\\xef\\x7e\\x39\\x79\\x73\\x7e\\x74\\x7a\\xa2\\x73\\x15\\x56\\xc8\\x9c\\x9b\\xc6\\x97\\x25\\xc5\\x19\\x5f\\x00\\x23\\x37\\x66\\x47\\x18\\xea\\xcd\\xf4\\xeb\\xe9\\x42\\x13\\xbe\\x20\\x15\\xe9\\x96\\x43\\x05\\x89\\x3a\\x8e\\x00\\xed\\x50\\xd8\\x75\\x9b\\x16\\xc4\\x93\\x02\\xdf\\xc8\\x81\\xa5\\x03\\xcb\\xb1\\x03\\x2b\\xbb\\x0b\\x8f\\x1a\\x24\\x08\\x1a\\xdd\\x06\\x68\\xb2\\x56\\xcb\\x07\\x65\\xb5\\x85\\x4c\\x77\\xe6\\x09\\x9a\\xd5\\xb4\\xc6\\xa7\\x08\\x77\\x34\\x78\\x18\\x76\\x4c\\x8d\\x4f\\x94\\x84\\xc7\\xe1\\x3d\\x8b\\xde\\xf0\\x41\\xb1\\x44\\x9c\\x39\\x09\\x83\\x8e\\x6f\\x8b\\xa3\\x23\\x16\\xf4\\xeb\\x2a\\xb3\\xa7\\xdb\\x9a\\xc6\\x08\\x20\\xa3\\x7e\\xc8\\x68\\xdf\\x69\\x4a\\x50\\xf3\\xc6\\x2a\\x1a\\x4b\\x54\\x46\\x35\\x34\\x05\\x68\\x32\\xd5\\x5a\\x95\\x84\\xef\\x34\\xac\\x96\\x2a\\x4b\\x18\\xc2\\x0a\\x65\\x93\\x4a\\xbc\\x03\\x0c\\xd0\\x62\\xa9\\x54\\xec\\xc8\\x6d\\x3d\\xde\\x80\\x77\\xca\\x45\\x65\\x69\\xa6\\x7f\\xc4\\xf0\\xe9\\x01\\x44\\x2c\\x4e\\x48\\x33\\xc6\\x52\\xff\\x43\\x98\\xbb\\x51\\x02\\xa3\\x15\\x65\\x52\\x10\\x39\\x2c\\x6c\\xed\\x88\\xb8\\xee\\xa3\\x15\\x66\\xe6\\xc3\\xc0\\x21\\xc8\\xd0\\x7a\\xb4\\x27\\xe7\\x7c\\x21\\x99\\x67\\x67\\x85\\x14\\x27\\x09\\x7f\\xa2\\x4d\\xd7\\x94\\x79\\xcb\\xce\\x42\\x3f\\x48\\x9a\\x14\\x1e\\x24\\xcd\\xd0\\x8f\\xc1\\x0c\\x5a\\x0e\\xc6\\x32\\x68\\x89\\x98\\x5e\\x54\\xcf\\x3a\\x3f\\x48\\xf8\\x56\\xdd\\xf1\\x86\\xa1\\x9c\\x52\\x26\\x6b\\xc2\\x64\\xd8\\x1f\\x3e\\x9e\\xb6\\x75\\xbf\\x2c\\x74\\x2a\\xa5\\x2b\\x9c\\x9c\\x54\\xa0\\xcc\\xf0\\xa6\\x31\\x84\\xe5\\xd8\\x1e\\xf5\\x48\\xc3\\xf9\\x54\\x86\\x7b\\x7a\\x09\\x4b\\xce\\x7e\\xde\\x5e\\x02\\x9d\\xd0\\x4b\\xc1\\xe6\\x98\\x70\\xa1\\x00\\xa8\\x4b\\x3c\\xd4\\x53\\x6f\\xb9\\x46\\xdf\\x14\\xf2\\xb3\\x26\\xab\\xd3\\xe9\\x18\\x4e\\xa1\\xca\\x98\\x1e\\x22\\x40\\x90\\xe5\\x80\\x4a\\xe3\\xe7\\xd8\\x96\\x2c\\x12\\x74\\x4c\\x3c\\xc2\\x3c\\xe1\\xf9\\x8a\\xb9\\x54\\xc6\\x49\\x9a\\x87\\xc1\\x16\\x50\\x23\\x16\\xf9\\x2d\\xec\\xfb\\xdb\\xf3\\xef\\x30\\xfa\\xe2\\xca\\x41\\x6d\\x5a\\x34\\xab\\xb5\\x58\\x97\\x14\\x01\\xc9\\x76\\x04\\x63\\x01\\x8d\\x69\\x8f\\x7c\\x18\\xc5\\x50\\x5a\\x6b\\x99\\x7b\\x18\\x21\\xaa\\xcd\\xcf\\x9a\\xb6\\x31\\x44\\x94\\x48\\x74\\x90\\xa6\\xaa\\x40\\xd6\\x4c\\x48\\xd0\\x53\\x56\\x4d\\x7a\\x1f\\x53\\x7a\\xe5\\xf0\\x4a\\xfd\\x65\\xe2\\x26\\x32\\x63\\x93\\x8c\\xff\\x5a\\xca\\xb6\\x27\\x1e\\x1f\\xe7\\xf9\\xc2\\x33\\xb0\\xc1\\x7c\\x83\\xc8\\xd1\\xec\\x99\\x64\\xb1\\x7c\\xa4\\x22\\x78\\x78\\x00\\x0f\\x97\\xe4\\xc3\\x03\\x42\\x24\\x89\\xd3\\x23\\x6b\\x84\\x29\\xac\\x39\\x83\\x57\\xb0\\x83\\x51\\x0a\\x7d\\x59\\x9c\\xc3\\x88\\xc8\\x7a\\xaf\\x89\\x47\\x2d\\xc5\\x13\\x15\\x1f\\x9b\\xb8\\x36\\xc8\\x65\\x60\\x1b\\xf6\\x48\\xab\\x67\\x9c\\xa6\\x3d\\x7e\\x30\\xc2\\x2d\\xaf\\xee\\xf3\\xda\\xfc\\xf2\\x25\\x81\\xee\\x50\\x43\\x29\\xe4\\xa7\\xbc\\x45\\x44\\xbe\\xc3\\x91\\x7f\\x8c\\x06\\xc5\\x56\\x1e\\x20\\x8f\\xcd\\x73\\xd8\\x83\\x67\\x16\\x1d\\x23\\x6e\\x5c\\x3e\\x4a\\x68\\xa8\\x9c\\x6e\\x78\\x7b\\xdc\\x99\\xc1\\xaf\\x1d\\x6f\\x6e\\xb1\\xe6\\x86\\xf4\\x44\\x8d\\x60\\xbf\\x40\\xd7\\x1b\\x83\\x86\\x03\\x1d\\xbc\\x6a\\xee\\x11\\x41\\xd1\\xd5\\xae\\xa6\\x07\\x92\\x46\\xf2\\xfd\\x56\\xa1\\x52\\x8e\\xea\\x68\\x93\\x3f\\xc8\\xb5\\xbd\\x98\\xe3\\x4a\\x9d\\x31\\x37\\x10\\x5e\\xe0\\xec\\xce\\x0f\\x17\\xb1\\x58\\xca\\x98\\x96\\x27\\xcc\\x2f\\x64\\xbc\\x47\\xc5\\x21\\xd8\\x98\\x11\\x48\\x49\\x71\\xa7\\x23\\xd6\\xef\\x4b\\x68\\xb7\\x91\\x2a\\x7b\\x97\\xf0\\x1a\\xd2\\x97\\x75\\x04\\x1f\\xb8\\x41\\x88\\xa5\\xa9\\x27\\xee\\x78\\xe4\\xd5\\x96\\x33\\xb6\\xdb\\x35\\x22\\x80\\x13\\x12\\xdd\\x45\\x40\\x17\\xbd\\x41\\xad\\x28\\x52\\x9b\\xfd\\x6a\\x97\\x01\\xac\\x17\\xfb\\x10\\xd2\\x59\\xc8\\x1f\\xb4\\xb8\\xf2\\xf9\\xf1\\xf8\\xb2\\xea\\xca\\x7f\\xd8\\xbd\\xee\\xc2\\xc5\\x8e\\x03\\x98\\xec\\x7a\\xf7\\x12\\x46\\x6c\\x1c\\xce\\x58\\x0c\\x3b\\xa3\\xab\\xaa\\x36\\xc9\\xec\\x43\\x6c\\x8d\\x46\\x03\\x45\\x5d\\x9c\\x9b\\x93\\x71\\xa5\\xd2\\xe8\\xc2\\xe3\\x89\\x1b\\x1d\\x24\\x4d\\x3e\\xcd\\xc2\\x33\\xbd\\x32\\x64\\x66\\x7e\\x97\\x21\\xdb\\xc1\\xd6\\x0f\\x78\\x7a\\x9e\\xa5\\x5e\\xc6\\xa8\\xcc\\xae\\xe7\\x51\\x12\\x2a\\xff\\xda\\xb0\\xb6\\x05\\x6b\\x10\\x27\\x3a\\x93\\x53\\xc3\\xdd\\x8f\\x45\\x18\\x98\\x2e\\xcd\\xbe\\x24\\x52\\x0e\\x8b\\x04\\x3a\\xcc\\xc3\\xbd\\xd0\\x85\\x37\\x1c\\x11\\x4f\\x70\\xa4\\xb8\\xc7\\x94\\x2b\\x5b\\x19\\x1b\\x5e\\xa8\\x64\\xbe\\x66\\xea\\xe8\\x01\\xd9\\x68\\x05\\xd2\\xe3\\x71\\x89\\xf0\\x6f\\x0d\\x2c\\x94\\x04\\x39\\x5b\\x4c\\x13\\x7f\\x3e\\x5d\\xe1\\xf1\\x7e\\x4b\\xc7\\xba\\x75\\x5f\\xf1\\x3b\\xe2\\xcc\\x81\\x84\\xcd\\xe6\\x0e\\x2c\\xa7\\xa1\\x03\\xcb\\x89\\x26\\x6b\\xbf\\xfa\\x8c\\xdd\\x28\\x5a\\x55\\xdb\\x07\\xe1\\x31\\x29\\x96\\xaf\\xbd\\xe4\\xed\\x34\\x44\\xc6\\xf2\\xc7\\x2c\\xfd\\x7a\\x45\\x85\\x89\\x94\\x79\\x67\\xf9\\xda\\x1f\\xac\\xa4\\x86\\x96\\xf7\\x12\\x51\\x12\\x89\\x21\\x44\\xc4\\xb4\\xca\\xc0\\xd1\\x88\\xdc\\xf2\\xc2\\xbf\\x54\\xf1\\xab\\x88\\xad\\x86\\xf8\\x61\\x9d\\x12\\x8a\\xb6\\x7a\\xfc\\x82\\xcc\\xfb\\xf6\\x04\\x5b\\x6d\\x23\\x9c\\x27\\x7c\\x78\\xec\\xd5\\xf8\\xe4\\xf1\\x9a\\xd3\\x30\\xad\\xd9\\x84\\x26\\xcc\\x54\\x84\\x51\\x8e\\xa9\\x7e\\x6b\\xd3\\x3c\\x56\\x08\\x45\\xc5\\x54\\x37\\xa9\\x8d\\x1e\\xad\\x27\\x72\\x4d\\x6c\\x63\\x13\\x85\\xfe\\xe1\\x7b\\xd1\\x85\\x89\\x45\\x1e\\x84\\xa3\\x44\\x12\\x57\\x84\\xfc\\x23\\x42\\xde\\x38\\x00\\x38\\xe2\\xd9\\x82\\x65\\x4a\\xee\\xe9\\x85\\x65\\x41\\x08\\xaa\\xb0\\x5c\\x8b\\xfe\\x28\\x92\\x99\\xd9\\xdc\\x8d\\x58\\x53\\x98\\xd4\\xb9\\xc7\\x0e\\x8c\\x8e\\x2b\\xf7\\x99\\xef\\xc0\\x78\\x36\\xaf\\xe0\\x05\\xc0\\x3d\\xe6\\x2c\\x5d\\x05\\x38\\xfe\\x8c\\x71\\xd6\\xdd\\x63\\x7e\\x34\\x1f\\xc3\\x3e\\x0c\\x60\\x0f\\x3a\\xb6\\xd0\\xd4\\xb5\\x64\\xb3\\xd9\\x41\\x40\\xf0\\xfb\\xa4\\xef\\x70\\x8f\\x45\\x90\\xdf\\x3a\\x2a\\x39\\xea\\x07\\x9f\\x5e\\xde\\x13\\xfe\\x7f\\xdd\\xa3\\x5d\\xf4\\x89\\x57\\x79\\x4d\\x35\\xab\\xfb\\xa5\\x3e\\x98\\x8f\\xeb\\x8f\\x3c\\xe9\\x4d\\xbf\\x88\\xf5\\x84\\xf3\\xab\\xaf\\x69\\x5f\\x51\\xf1\\x62\\x94\\x44\\xee\\x38\\xc9\\x2d\\xa9\\x3a\\xc4\\xdb\\xaf\\x60\\xb2\\x7a\\x3d\\xf8\\x28\\x60\\xc3\\x88\\x72\\xa3\\xbb\\xd5\\xfa\\x06\\xf7\\xb8\\x0e\\x6d\\x74\\x2f\\xdc\\xe3\\x4b\\xe8\\x58\\x23\\x6c\\x83\\x38\\x0a\\xa8\\xec\\x2b\\x18\\xe1\\xff\\x34\\xab\\x15\\xe4\\x90\\xaa\\x0c\\x81\\x53\\x13\\x1c\\x8b\\xb6\\x6c\\x91\\xa0\\x7c\\xa3\\x56\\xa6\\x46\\xf4\\x6b\\x50\\x86\\xe4\\x91\\xcb\\x6f\\x1e\\x8f\\x1f\\xab\\x81\\x7a\\x06\\x2f\\xc1\\x95\\x9a\\x84\\xf5\\x79\\x99\\xe5\\x5e\\x9a\\x13\\xd4\\x81\\xd5\\x9e\\xcc\\x9b\\x69\\x65\\x63\\x32\\xe6\\x41\\x73\\x81\\xaf\\x5c\\x2c\\x63\\x7e\\xca\\x53\\x8a\\xb1\\x59\\x18\\x31\\x07\\x02\\x07\\x0d\\xc4\\xe9\\xef\\xb1\\x03\\x9f\\x1d\\xf8\\x3c\\x76\\x20\\x62\\x33\\xfc\\x73\\x8c\\x7f\\xfb\\x0e\\x2c\\x7d\\x07\\x96\\xc7\\x0e\\xac\\xc6\\x15\\xa7\\xfe\\x8a\\x17\\xfa\\x62\\x2f\\x13\\xd3\\x31\\xcc\\x6f\\x82\\xab\\x6e\\x9c\\xee\\x70\\x7b\\x25\\x29\\x7d\\xa8\\x68\\x7e\\x4c\\xf2\\xb4\\x0a\\x16\\xd9\\xc7\\xb8\\x9e\\x27\\xee\\x89\\xa3\\xe4\\x93\\x8e\\xa0\\x5f\\xa1\\x2a\\x7b\\xb4\\x1c\\x2b\\x97\\x50\\xfe\\x69\\x35\\x16\\xff\\x55\\xde\\x4a\\xc1\\x94\\x76\\xac\\x96\\x91\\x92\\x70\\x4c\\x38\\x71\\x4f\\x38\\x26\\x4c\\xc1\\x3f\\x8c\\x60\\x14\\x26\\x93\\x7c\\x3f\\xaa\\xad\\x33\\x1f\\xf1\\x09\\x40\\xd4\\xe9\\x7f\\xce\\xca\\xc3\\x3e\\x1f\\x3f\\xba\\xce\\xa3\\xaa\\x0c\\xa8\\x5f\\x7b\\xd8\\xcf\\x16\\xec\\x63\\xfb\\x7b\\x6b\\x58\\x6b\\x22\\xd2\\xff\\xf5\\x7f\\xfb\\x1c\\xe9\\x25\\xf8\\x31\\x7e\\x0e\\x23\\x58\\xd1\\x67\\x89\\x33\\xf6\\x22\\x92\\xa5\\xb3\\x64\\x2e\\xb1\\x2c\\x58\\xa3\\x43\\x40\\x6b\\x44\\xc5\\xbe\\x2f\\xa7\\x68\\x1f\\x62\\xcc\\xb1\\xb2\\x07\\x31\\xf4\\x0c\\x99\\x17\\xe5\\xb3\\x59\\x16\\x92\\xcf\\x25\\x41\\x7b\\x6c\\x01\\xf4\\x99\\xaf\\xd2\\xcf\\x69\\xa4\\x6c\\x53\\x31\\x21\\x2d\\x83\\x0e\\xac\\x6c\\x29\\xd0\\x62\\xb2\\x97\\x6f\\x53\\xec\\xe9\\x2a\\xf6\\xe2\\x51\\x25\\xa1\\xe0\\x0f\\x16\\x1a\\x42\\x35\\xab\\xcb\\x4b\\x8d\\xfc\\xe4\\x1d\\xa9\\xcc\\x39\\xb6\\xaa\\x29\\x3d\\xa7\\xd4\\xe9\\x8f\\xab\\xc2\\x8f\\x76\\xc0\\x28\\xc9\\x54\\xcb\\x5b\\xb9\\xe7\\x2a\\x82\\x8f\\x7a\\x80\\x54\\xeb\\x29\\x04\\x7d\\x21\\x6a\\x65\\xd1\\x13\\x8c\\xd1\\x05\\x2f\\x17\\x45\\x0f\\xc2\\x2b\\xb0\\x87\\xde\\x3f\\xcf\\x47\\x09\\x4f\\x55\\xc1\\xe9\\x2a\\x88\\xe9\\xc0\\x55\\x6e\\x85\\xd8\\xf6\\xc4\\xad\\x29\\x1a\\x87\\x62\\x06\\x86\\x95\\x30\\x04\\x00\\xba\\x7a\\x23\\x11\\xea\\x43\\x2b\\x4d\\xc0\\x60\\x02\\x82\\x53\\x4f\\x95\\x5f\\x17\\xea\\x42\\x0b\\x58\\xa7\\x53\\xb5\\x6c\\xe2\\x5a\\x56\\x02\\x9f\\x85\\xdd\\x54\\x95\\xb4\\x05\\x9d\\x9e\\x28\\xdb\\xfc\\xb7\\x06\\xa5\\x3f\\xce\\xeb\\x23\\x6c\\x65\\x57\\xbc\\xec\\xaa\\x5e\\x59\\xbf\\x3a\\xe4\\x46\\x2c\\x6c\\x6d\\xab\\x04\\x77\\x27\\x61\\x34\\x73\\xa7\\x7e\\xcc\\x38\\x7d\\xe2\\x97\\xf8\\xd5\\x18\\xe2\\x10\\x26\\xfe\\xf5\\x84\\xc5\\x09\\x84\\x91\\xc7\\x22\\x21\\xbb\\x0b\\xaf\\xf8\\x8f\\x7e\\x0c\\xaf\\x49\\x86\\x0c\\x3d\\xd8\\xea\\xda\\x1b\\x08\\xf2\\x46\\x2b\\xa2\\x56\\x53\\x90\\x6e\\x0a\\x46\\x5f\\xc3\\x38\\xe0\\x24\\x4c\\x20\\x60\\x63\\x16\\xc7\\x6e\\xb4\\x72\\x60\\xb4\\x40\\x69\\xf9\\xc4\\x0d\\xbc\\x29\\x83\\xd0\\x23\\x89\\x87\\x0c\\xa3\\xbf\\x92\\x14\\x36\\x6d\\x6f\\x0b\\xf7\\x7a\\x85\\x57\\x40\\xaf\\x27\\x13\\x08\\xbe\\x26\\x69\\x6e\\xd0\\x6e\\x63\\x1e\\x33\\x4e\\xb5\\x09\\xe6\\x2b\\x15\\x60\\x8d\\x38\\x39\\x04\\xaa\\xce\\xed\\x02\\x39\\x83\\x4c\\x3c\\xb2\\x1a\\x23\\xf3\\x43\\xc4\\xb0\\xfa\\xc2\\xb0\\xcc\\xd7\\x5e\\xae\\x57\\x7b\\x9d\\x85\\x07\\x6b\\x2e\\xea\\x8a\\xe8\\xf0\\x4b\\xbe\\x90\\x57\\xc7\\x76\\x18\\x11\\x9b\\x51\\x83\\x59\\x36\\x80\\xd5\\x71\\x75\\x1e\\xb8\\x19\\x47\\x33\\x62\\xb3\\xea\\x14\\x28\\x20\\x64\\x5a\\x9e\\x27\\x8c\\xbf\\x92\\x10\\x66\\xee\\xad\\x9a\\x4f\\xdd\\x8d\\x61\\x1a\\x06\\xd7\\xfc\\x7f\\x2b\\x1f\\x2c\\x1f\\xc9\\x96\\x23\\x1a\\xaf\\x78\\x17\\xf9\\xc7\\x0b\\xfe\\x95\\x6c\\xe5\\x2a\\xc3\\x21\\xad\\xbe\\xd0\\xac\\x48\\x79\\x50\\x45\\xe1\\x54\\xb6\\xd0\\xaf\\x2a\\x3a\\xee\\x83\\x60\\x9d\\x6a\\x04\\x3e\\x59\\x8d\\x2f\\x06\\x97\\xea\\x7e\\x87\\x16\\x87\\xd0\\x6e\\xdb\\xeb\\x1a\\xb7\\xec\\x5c\\xe4\\xdc\\x4a\\x22\\xdf\\x9d\\x0a\\xb2\\x12\\x08\\xe9\\x3d\\x7a\\xb1\\x06\\xb0\\x88\\xf9\\xb1\\x83\\xed\\x6d\\x57\\xee\\xd8\\xcc\\xda\\x9e\\x78\\x82\\x21\\x6c\\xd3\\x76\\xed\\xd3\\xd6\\x6d\\x89\\xfe\\x0e\\x38\\xad\\x61\\x9d\\xc1\\x6e\\xc5\\x32\\xf0\\xc2\\x1a\\x9b\\x35\\xa8\\xa9\\x39\\x40\\x15\\x38\\x8a\\x62\\xe4\\xa2\\x11\\xb9\\xa4\\xc5\\xaa\\xaa\\x66\\x1b\\x49\\xe0\\x90\\xca\\x73\\x56\\xf2\\xf2\\xb3\\xa2\\xab\\xcf\\x71\\x2d\\xc3\\x7e\\x72\\xc7\\x95\\x18\\xbc\\x5a\\xa7\\x7d\\xf2\\x63\\x98\\xcd\\xab\\x13\\x43\\x15\\xfb\\xed\\x4e\\xc7\\x8b\\xa9\\x9b\\x30\\x75\\xa6\\x1d\\x08\\x2a\\x8e\\x0b\\xf9\\xf0\\x6b\\x1d\\xed\\xde\\xda\\x5e\\x39\\xb4\\x5c\\x51\\x3a\\x45\\x23\\xa3\\x00\\xe9\\x67\\x57\\xf4\\x26\\x02\\x1d\\xa4\\xac\\x49\\xed\\x1e\\xa1\\xde\\x7b\\x12\\xde\\x53\\x34\\xfc\\xc4\\x9f\\xb1\\x58\\x68\\x68\\x69\\x5c\\xaf\\x43\\x86\\xb6\\x0d\\x61\\x8e\\x55\\x5b\\x63\\xac\\xa1\\x7c\\x5c\\x22\\xea\\x3d\\x5c\\xc2\\x6b\\x60\\x0a\\x07\\xd3\\xeb\\x30\\xf2\\x93\\xc9\\xac\\xb6\\xfb\\x19\\x0c\\xba\\xc2\\x15\\x3b\\x21\\x05\\x3c\\x76\\xe9\\x49\\x6e\\x9b\\x36\\x83\\xfa\\x0e\\x7f\\x5b\\x5d\\x3e\\x1f\\x12\\xe2\\xeb\\x6c\\x18\\xf6\\xd2\\x97\\x9d\\xb4\\x1d\\x07\\x82\\x4e\\xa7\\x36\\xe8\\xed\\xae\\x42\\x96\\x3b\\x43\\x09\\xaf\\x76\\xfd\\x9d\\x1c\\x6a\\xf7\\x6e\\xac\\xee\\x08\\x70\\x13\\xd8\\xaa\\x3f\\x6a\\x00\\xbb\\x5d\\xb9\\x3b\\xf1\\x82\\xa5\\x00\\x0a\\x3c\\xd9\\xbf\\x35\\xc0\\x3d\\xed\\xf2\\xad\\x9a\\x41\\x79\\x2d\\x61\\xec\\xe5\\x3b\\x9d\\x8d\\x5c\\xbb\\xbd\\x86\\xd3\\x44\\xc6\\x8f\\xd4\\xaa\\x03\\x72\\xe5\\x8b\\x1b\\xc9\\x6b\\x91\\xfa\\x3b\\x98\\xae\\x88\\x54\\xe3\\x57\\x3f\\xae\\xa2\\xd3\\x45\\x3c\\x02\\x79\\xa0\\xb4\\x70\\xc1\\x23\\x14\\x7b\\x7e\\x2d\\x0d\\x56\\x15\\xcb\\xb5\\x3e\\x46\\x1c\\xd0\\xb7\\x30\\x5f\\x2a\\x1c\\xce\\x72\\xf0\\xff\\x6b\\xf3\\x52\\xf2\\x59\\x97\\x5d\\x51\\x1f\\xe5\\x98\\x91\\x83\\xb2\\xe6\\x31\\xa3\\x40\\x3a\\xd2\\x6e\\xdb\\xb5\\x40\\x9c\\xe7\\xce\\xf6\\x24\\xa4\\xcb\\xc4\\x5a\\x20\\x90\\xd8\\x0e\\xd2\\xba\\xe0\\x8e\\xc2\\x45\\x02\\xbb\\x3f\\xca\\x2b\\x2c\\x27\\xbf\\x68\\xa4\\x8c\\xc6\\x48\\x61\\x02\\xb7\\x41\\x78\\x1f\\xd0\\x9d\\xe0\\xce\\x6c\\x74\\xa7\\x69\\x89\\xdd\\xb1\\x08\\x46\\x8c\\x05\\x6a\\x22\\xba\\x0d\\x90\\xbe\\x9f\\xf8\\x53\\xc6\\x0f\\x4b\\x79\\x56\\x93\\xe0\\x12\\x4f\\x6b\\x21\\xbd\\x14\\xc7\\x92\\xe0\\x4b\\xea\\x3b\\x2d\\xf1\\x27\\xb0\\xde\\x81\\x0d\\x7d\\x4b\\x25\\xeb\\x72\\x87\\xe0\\x75\\x5f\\x4c\\x6f\\xfd\\xae\\xf1\\x27\\x53\\x00\\x50\\xbf\\x56\\x9c\\xab\\xa5\\x15\\xbf\\xcf\\x59\\xd5\\x3d\\xdc\\x35\\xa2\\xa3\\xeb\\xee\\x1c\\xf8\\xd6\\xdd\\x03\\x29\\xab\\x54\\x53\\x11\\x03\\xb5\\x5c\\x97\\x60\\x53\\x4f\\x2f\\x5c\\xbe\\x28\\x4a\\x1c\\xa0\\x52\\x8d\\x7f\\xed\\xd4\\x74\\x4a\\x87\\x74\\x1f\\x12\\x14\\xb4\\x38\\x8d\\x18\\x2d\\x74\\x34\\xbc\\xe3\\xcb\\x5c\\x1e\\x3a\\xab\\xb1\\xdc\\xeb\\xe0\\x5e\\xbb\\x7e\\x00\\x23\\x36\\x0d\\xef\\xed\\x52\\xe8\\x42\\x4b\\x71\\x08\\x98\\x48\\x88\\x21\\xa6\\x49\\x48\\xd1\\x85\\x5d\\xcc\\x6a\\xbd\\x0e\\x1d\\x55\\x90\\x1e\\x38\\x30\\x65\\xee\\x1d\\x41\\x74\\x63\\x0c\\xa9\\x1b\\x87\\x39\\x64\\x23\\x26\\xfb\\xe0\\x11\\xe6\\xeb\\x1d\\x21\\x94\\xa9\\x7a\\x0d\\x9e\\x54\\xc1\\x52\\xc3\\x09\\x23\\x7a\\x01\\xcc\\x16\\x31\\xc6\\x97\\x4d\\x43\\xcf\\xac\\x31\\x67\\x90\\xae\\xc1\\x60\\xdd\\x75\\xf8\\x4d\\xc7\\xde\\xba\\xe7\\x5c\\xdd\\x2b\\x65\\xb1\\xea\\x46\\x9b\\xb3\\x66\\xdf\\x70\\x46\\xa9\\x91\\x57\\x92\\x4c\\x62\\x5b\\xea\\xa5\\xb6\\x2e\\x1b\\x95\\x52\\x3d\\x39\\x54\\x48\\xf5\\xd6\\x3c\\xca\\x32\\x7a\\x97\\x52\\x70\\xa9\\x72\\x5a\\x87\\xba\\x6d\\x7a\\xac\\xe7\\x0f\\xe2\\x02\\x93\\x5a\\xaf\\x07\\xe9\\xd5\\x6d\\x38\\xa4\\x24\\xca\\xeb\\x91\\x30\\xdd\\xc5\\x35\\xc7\\xe1\\xae\\x4b\\x18\\xb2\\x5d\\x97\\x03\\xe3\\xa4\\x43\\x9d\\x3f\\xa5\\xbe\\x17\\xeb\\x31\\x0d\\xef\\x37\\xe5\\x3c\\xa6\\xe1\\xbd\\x85\\xf1\\xb8\\x63\\xd1\\x0a\\x22\\x37\\x62\\xd3\\x15\\x6c\\xad\\xdf\\x54\\x89\\x5f\\xd0\\xdc\\xed\\xd1\\xac\\x74\\x6d\\x4e\\xa1\\xdd\\xfe\\x5e\\x9c\\xc2\\x06\\x73\\x00\\xe5\\xbd\\xb3\\x4a\\x37\\xb5\\xc2\\x29\\xac\\xbf\\x95\\xe4\\xa3\\xd9\\x52\\x75\\xab\\xd6\\x3c\\xf1\\x2b\\x4b\\xe5\\x82\\x3c\\xe0\\x0e\\xab\\x13\\x9d\\x58\\x3e\\x41\\x95\\xf0\\x4c\\x3e\\x24\\xf7\\xac\\x25\\x00\\xf9\\x9a\\xca\\xc2\\x24\\x3e\\x03\\xda\\xb1\\x64\\x86\\x38\\x62\\xd0\\xaf\\x25\\x27\\x3a\\x10\\xf6\\x8a\\x01\\x5b\\x26\\xa9\\xcc\\xc6\\x49\\x2d\\xd3\\x49\\x51\\x55\\x23\\xdb\\x2c\\xa0\\xb6\\x45\\xfa\\x05\\x07\\xf5\\x84\\x54\\xbf\\xcc\\x3d\\x14\\x18\\x4d\\xd8\\xda\\x22\\x2a\\x12\\x14\\xd5\\x9e\\x82\\xbc\\x28\\x76\\x39\\xbe\\x58\\x0a\\x7d\\x53\\x9d\\x91\\xae\\x99\\x3d\\x15\\xb2\\x19\\x94\\x2d\\xd4\\x94\\x64\\x89\\x15\\x5e\\x83\\x85\\xa8\\x30\\x14\\x4a\\x89\\x4c\\x13\\x96\\x7e\\xbb\\x0d\\xaf\\x60\\x79\\x8c\\xa6\\xf1\\x34\\x5a\\xd2\\x34\\x1f\\xad\\xf2\\xe3\\x0a\\x6f\\x5d\\xc8\\xf4\\x62\\xf9\\xea\\xd5\\x72\\xf5\\x63\\xc5\\x92\\xc5\\x6c\\xc2\\x00\\xa9\\x0a\\xf8\\xb3\\x30\\x57\\xf8\\x9c\\xba\\xc1\\x6e\\x6c\\x79\\x97\\x4a\\x85\\x85\\xc2\\xb7\\xda\\x8e\\xfd\\x3c\\x84\\x71\\x2a\\xbb\\xfc\\xdc\\x65\\x8e\\xf0\\x9c\\x95\\xb9\\x98\\x85\\x1f\\x53\\x78\\xa5\\xf8\\xd7\\x22\\xc2\\x6b\\x38\\xcb\\xc6\\x30\\xa4\\x3a\\x2f\\x21\\x96\\xde\\xb2\\xb1\\xe2\\x2d\\x5b\\xa9\\xdb\\x08\\x17\\x81\\xd7\\x84\\xcf\\x0e\\x29\\xd6\\x9b\\x1c\\x4f\\x34\\x44\\x6a\\x03\\x83\\x27\\xaa\\xcf\\xeb\\x00\\x2d\\x1e\\x07\\x64\\x83\\x83\\xd3\\x57\\xc7\\x85\\x98\\x0c\\x98\\xfd\\xd8\\x6e\\x2f\\x2c\\x9f\\x5a\\x3b\\xe2\\x73\\x9d\\xec\\xdc\\x9f\\xbb\\x11\\x0c\\xa1\\xcd\\xf1\\xdc\\xcc\\x57\\x97\\x6c\\x34\\x3e\\x7f\\xbb\\x83\\xad\\x3e\\xb0\\xab\\xf0\\x8e\\x8d\\xd8\\x3c\\x62\\x31\\x0b\\x12\\xe1\\xe3\\x97\\xe9\\xe3\\xb3\\xa8\\xaf\\x68\\x94\\x7d\\xe5\\x2f\\x99\\xd7\\x99\\x87\\x7e\\x80\\x49\\x56\\xa5\\x82\\xdf\\x77\\xa7\\x2a\\xf8\\x20\\x4c\\x5c\\xb4\\x99\\x92\\x0e\\x11\\x82\\xda\\x66\\xe6\\xdc\\xc5\\xb8\\xa6\\x91\\x26\\x4f\\xbe\\x29\\xae\\x2a\\xf2\\x33\\xae\\x12\\xa8\\x54\\xfd\\xd1\\x97\\x01\\x79\\xd1\\xa3\\x56\\xf2\\x38\\x53\\x7e\\xf3\\x21\\x1e\\x2a\\x62\\x9f\\x17\\x3e\\xbf\\xa2\\x35\\x8b\\xbe\\x4a\\x5a\\x8f\\xa4\\x5c\\xb8\\x58\\x88\\x66\\x12\\x7c\\xea\\xf8\\x34\\x0b\\xbd\\x5c\\x04\\x58\\x69\\x2c\\xcf\\xd7\\x9a\\xf8\\xe4\\xed\\x41\\x12\\x1e\\x66\\x43\\x05\\x83\\x17\\x8e\\xb4\\xce\\xc7\\xec\\x86\\x32\\xf1\\x25\\x6c\\x0d\\xf8\\x97\\x33\\xe9\\xc8\\x0a\\x5b\\x3b\\xf6\\xc4\\x82\\xa9\\x71\\xda\\x15\\xd6\\x6f\\xf2\\x93\\xcd\\xa7\\xad\\x21\\x1a\\xb7\\xb9\\x2a\\x8f\\xfb\\x68\\x9b\\x16\\x30\\x7e\\xb7\\x0d\\x1c\\xb2\\xd8\\xd7\\x96\\x46\\x4f\\xe2\\x68\\x96\\xd2\\xd7\\x42\\xc4\\x72\\xde\\x1e\\xa5\\x19\\xa3\\x56\\x9d\\x74\\x78\\xde\\x87\\x1e\\xb3\\xf8\\x3d\\xed\\x73\\xa0\\x0f\\x68\\x28\\x54\\xdb\\x4f\\xf9\\x51\\xd0\\x1d\\x67\\x0e\\x88\\x41\\x16\\xbd\\xcf\\x40\\x62\\x50\\x59\\x16\\x74\\xcd\\xda\\xc1\\x80\\x61\\x01\\x93\\x9f\\xa0\\x70\\x64\\x1c\\xa6\\x47\\x8b\\x99\\x2c\\x90\\xdf\\x45\\xc1\\x4f\\x15\\xd1\\xad\\xf2\\xd5\\x10\\xb3\\xc5\\xb9\\x9c\\x17\\xfc\\x3c\\xcb\\xbe\\x6f\\xed\\xf0\\xd1\\x0e\\x18\\xbc\\x1a\\x2a\\x79\\x9d\\xac\\x44\\x67\\x3f\\xbf\\xdc\\x84\\xef\\x47\\x60\\x9b\\x08\\x40\\x27\\x34\\x8d\\xc7\\x48\\x60\\x76\\x19\\xa9\\x22\\x92\\x01\\x5f\\x33\\x44\\xd7\\xf3\\x96\\x5a\\x41\\x4b\\xac\\xd2\\x2a\\xcf\\x9a\\xa0\\xab\\x98\\xef\\x90\\x44\\xc7\\xc3\\x48\\xcf\\x29\\x85\\xe2\\xf7\\xc8\\x2a\\xf7\\x41\\x10\\x56\\x53\\xe6\\x29\\x86\\x0d\\xe7\\x6e\\xca\\x02\\xe1\\x23\\x5e\\x79\\x15\\xee\\xf5\\x72\\x1b\\x9b\\x56\\x6f\\xac\\x12\\xd0\\x8c\\x6a\\x8a\\x1e\\x66\\xe7\\x72\\x99\\x36\\xda\\xda\\xc9\\xa8\\xac\\x1f\\x2b\\x81\\xb7\\xb5\\x47\\x7d\\xaa\\xce\\xe6\\x24\\x3a\\x3d\\x05\\x04\\x01\\x45\\xa7\\x66\\x5b\\x4b\\xe8\\x1e\\x1e\\xaa\\xf3\\x51\\x38\\x22\\x64\\x97\\x2c\\x3a\\xd2\\x5e\\x0f\\x0e\\x35\\x83\\x50\\x11\\x9d\\xa6\\x6a\\xbf\\x34\\xc9\\x91\\x8a\\xf1\\xdf\\x0a\\x5b\\xa7\\x2a\\x97\\x80\\x40\\xea\\x60\\x3e\\x67\\x81\\xb0\\x9e\\xb0\\xb3\\x78\\xd2\\x30\\x82\\xaf\\x86\\x57\\xe0\\xa7\\xbe\\x5b\\x8d\\x7e\\x03\\x09\\x6b\\x35\\xf7\\x23\\xfd\\xb5\\xca\\x9b\\xb6\\x16\\x77\\xf3\\x4e\\x3b\\xe2\\xa6\\x0a\\xb5\\x98\\x1b\\x1f\\x3a\\x43\\x08\\x2a\\x98\\x1b\\xbb\\x9b\\xd9\\xf7\\x1b\\x60\\x9c\\x71\\xb4\\xb5\\x84\\xd7\\x38\\xca\\x75\\x2e\\x45\\x58\\xa9\\xd3\\xf1\\xe1\\x35\\x5e\\x64\\x69\\x92\\xe4\\xcc\\x74\\x1b\\xc2\\x19\\x29\\x9b\\xaa\\xca\\x88\\x5a\\x75\\x6f\\x49\\x18\\x8d\\x8c\\x41\\x87\\x63\\x5a\\x33\\xf2\\x94\\x44\\xb2\\xde\\x15\\x4c\\x19\\x8e\\xe1\\x50\\x8c\\x87\\xd2\\xb1\\x5a\\x30\\xd2\\xc8\\x5a\\xeb\\x0d\\x02\\x7c\\x77\\x57\\x0e\\x03\\xef\\x9b\\x9e\\xee\\x64\\x06\\xf9\\xf8\\x31\\x3f\\xc6\\xf7\\xa1\\xd1\\x69\\x40\\x1b\\xf1\\xdd\\x5b\\xcb\\xbf\\xf0\\xaf\\x64\\x56\\x97\\xcf\\x19\\xe1\\x06\\x5e\\x3e\\x8d\\x82\\x25\\x32\\x4c\\x2e\\x93\\x42\\xec\\xc0\\x8c\\x25\\x93\\xd0\\xec\\x40\\x2b\\x9c\\xfc\\x82\\x8a\\xdc\\xcd\\x56\\x8e\\x43\\xe4\\xfe\\xc3\\x06\\xe9\\xf6\\xd8\\xc2\\xcf\\x94\\xb5\\x39\\x36\\xb2\\x33\\xb3\\x92\\x65\\x74\\x06\\xc2\\xd0\\xa0\\x5c\\x0d\\xed\\x36\\x7a\\x1e\\x45\\xd7\\x71\\xea\\x05\\x6b\\x5b\\x94\\x81\\xa1\\x25\\xdf\\xdc\\x12\\xa4\\xc2\\x53\\x37\\x58\\xc9\\xe3\\xc8\\x8f\\xc9\\xb2\\x3e\\x4a\\x6d\\xee\\x2b\\xa8\\xff\\x23\\xbe\\x2e\\xaa\\xb6\\xcb\\x8c\\xc4\\x34\\xb6\\x22\\x15\\xce\\x4b\\xaa\\x50\\x8c\\x26\\xbc\\xcb\\xcf\\x99\\x26\\x4e\\x6d\\x8d\\xc4\\x82\\x15\\x18\\x6c\\xb2\\x21\\x66\\x35\\x97\\xbc\\xee\\xb6\\x97\\x44\\x0b\\xec\\x0c\\xdd\\x9f\\xd2\\xf8\\x2f\\xfc\\xcc\\xc6\\x84\\x12\\x6a\\xc2\\x82\\x64\\x12\\xe5\\x44\\xbf\\x4f\\x30\\x32\\x20\\x5f\\x27\\x32\\x93\\x08\\xe5\\x87\\x27\\x86\\x05\\x2d\\x27\\xb2\\xe0\\x7f\\xbc\\xa1\\x9a\\xf7\\x16\\x7d\\x96\\x3c\\xbc\\xc7\\xcc\\x7c\\xfe\\xc7\\x5d\\x66\\x97\\x8a\\xc0\\x9d\\x99\\x0d\\xe9\\x85\\x0a\\xed\\x15\\xaf\\x87\\xa6\\xae\\xf0\\x9a\\xd7\\xa6\\x8f\\x8f\\xd0\\xf4\\x39\\x18\\xbb\\x09\\x6b\\x06\\xf6\\x89\\x13\\x01\\x18\\x65\\x9b\\x4d\\x6a\\xf5\\xe1\\x01\\x1a\\xf9\\x3b\\x6b\\xa3\\x32\\x70\\xa8\\x16\\x9d\\x7d\\x68\\xe4\\xb2\\x78\\x34\\x60\\x2f\\x4b\\x10\\x24\\x66\\xa4\\x01\\x2d\\x5c\\x60\\x6b\\xb9\\x37\\x45\\xd9\\x24\\x6f\\xb2\\x46\\x38\\xc7\\x3b\\x2f\\x98\\xc8\\x3b\\x8a\\xdc\\x08\\xa5\\x4e\\x83\\xbe\\x12\\xc8\\x2c\\xf0\\x60\\x8c\\xa9\\x36\\x50\\xd7\\x19\\x27\\x69\\xea\\x4c\\xfe\\x8b\\x48\\x36\\x99\\x5b\\x41\\x99\\xf3\\xf6\\xcc\\x0f\\x16\\xb1\\x03\\xf3\\xe9\\x22\\xc6\\xd2\\x68\\x7a\\x56\\x73\\xc5\\x04\\xd2\\xb8\\x1b\\x17\\xc9\\x18\\x99\\x0d\\x0b\\x15\\x26\\xf9\\x94\\x71\\x9e\\x6e\\x38\\xcf\\xff\\x47\\xc4\\xd6\\x79\\x34\\xbe\\xe8\\x74\\x6e\\x2e\\xd3\\xe0\\x81\\x46\\x8a\\x98\\xb7\\x2c\\x9c\\x94\\x47\\xba\\x0b\\xef\\x2a\\xc5\\x75\\x66\\x69\\x1d\\xe1\\x73\\x93\\xc6\\xb2\\xbb\\x91\\xd2\\xb9\\x9b\\x82\\x74\\xce\\x84\\xdc\\xe9\\x1d\\x8b\\xae\\xa6\\xe1\\xbd\\x9e\\x45\\xc3\\x5d\\x47\\x21\\xff\\x0c\\xb2\\xba\\xd7\\x69\\xe2\\xd1\\xaa\\x18\\x22\\xd2\\x0d\\xc9\\x4c\\xfc\\x03\\xf4\\xe0\\x09\\x50\\xf0\\x56\\x21\\xa8\\xc5\\xc8\\x60\\x9e\\x0d\\x75\\x95\\xba\\x33\\x78\\x95\\x2e\\xdf\\x2a\\x34\\xff\\xdd\\x1a\\x3f\\x92\\x50\\xbc\\x10\\x48\\x1a\\x43\\x37\\x56\\x5f\\x9e\\xab\\xa4\\x8b\\x81\\x2d\\x3c\\x5f\\x05\\x57\\xb5\\x2e\\xdf\\x74\\x47\\x09\\x2f\\x50\\x42\\x76\\xe5\\xfa\\x53\\x79\\xe1\\xf3\\x3d\\x8c\\xcd\\xcf\\xe2\\x84\\x1f\\x22\\x3a\\x81\\x9c\\x78\\xe6\\x6e\\x14\\xb3\\x13\\x11\\x91\\xaf\\x76\\x42\\x21\\xbe\\x13\\xce\\x22\\x76\\xe5\\x2f\\x61\\x08\\xbd\\x5f\\x9b\\x9d\\xfd\\x56\\xbf\\x79\\xb1\\x1c\\x85\\x97\\xad\\x9e\\x25\\x64\\x82\\x17\\x26\\x07\\x57\\x09\\xbf\\x0d\\xf2\\x4a\\x17\\xbf\\x76\\x2f\\xdb\\xad\\x4f\\xdd\\xbf\\xf4\\xac\\x35\\x7e\\x62\\x57\\xa4\\x0a\\xe8\\xfd\\xfa\\xa9\\x2b\\x2a\\xd9\\xaa\\xf8\\xb1\\x5c\\xae\\xa7\\xd1\\x89\\x7b\\x82\\x15\\x3b\\xfb\\x4d\\xf9\\xf2\\xe1\\xc4\\x3d\\xb1\\xd6\\xbf\\x9f\\xf8\\x09\\x8b\\xe7\\xee\\x98\\x9d\\x46\\x67\\x9c\\x0e\\x62\\xcb\\xf1\\x93\\x4f\\xed\\x87\\x5f\\x3f\\xc5\\xed\\x87\\x4f\\x71\\xfb\\x2f\\xbd\\xeb\\xba\\xa9\\x68\\x60\\xe9\\x08\\x71\\xcd\\x62\\xe6\\xc0\\xa8\\xd2\\x2d\\x15\\x6d\\xd3\\xed\\x77\\x3b\\xdc\\x62\\x33\\xd8\\xcf\\xb8\\xed\\x2c\\x10\\x5e\\x11\\x79\\x19\\x15\\xcf\\xb6\\x6d\\x4e\\x42\\x60\\xcb\\x31\\x9b\\x23\\xc2\\x61\\xce\\xed\\x30\\x8c\\x6a\\xf0\\x7c\\x85\\x01\\xef\\xf2\\x55\\xd7\\x8c\\xab\\x99\\x30\\x0a\\xd1\\xe5\\xc7\\x27\\xee\\x09\\x2f\\xbe\\x4f\\x52\\xbc\\x3d\\x90\\xe1\\x90\\x3a\\x03\\xd8\\xb3\\x29\\xa6\\xea\\x5d\\x97\\x89\\x2b\\x5d\\xcc\\xea\\x07\\xc1\\x37\\xaf\\xed\\xe6\\xfe\\xf0\\xd3\\xfd\\xc5\\xa7\\xfb\\xee\\xe5\\x93\\xbf\\xb4\\x7a\\x7e\\x25\\x34\\x74\\xdc\\xcb\\x26\\x27\\x83\\xec\\xa8\\x2b\\x64\\xe6\\xc0\\x7c\\xe0\\xc0\\xbc\\xda\\xcf\\x47\\x3e\\xc2\\x25\\xb1\\xc9\\xeb\\x0c\\x61\\xbe\\x95\\x8f\\x04\\x49\\x66\\x7f\\x8d\\x65\\x03\\xf6\\x61\\xf0\\x14\\xf6\\xb0\\xd4\\x10\\x1a\\x23\\xfe\\x62\\x0b\\xf6\\xe0\\x79\\x5d\\xd5\\x20\\xae\\xe5\\x47\\x23\\xce\\x25\\x8d\\x38\\x08\\x6c\\x77\\x1f\\xe6\\x7c\\x62\\x34\\xfc\\x6e\\xf1\\xf9\\x5a\\xc7\\x90\\x86\\x4f\\xd0\\x68\\xcd\\x8e\\x8f\\xea\\x5b\\xb6\\x60\\x08\\xa0\\xc6\\xa0\\xdb\\x80\\x24\\xa4\\x78\\x56\\x8d\\xee\\x80\\xbe\\xf4\\xbb\\x03\\x7d\\xa6\\xcb\\xe2\\x53\\x98\\x46\\x49\\xc5\\x1c\\x68\\xfc\\x65\\xd0\\x80\\x56\\xee\\x17\\xa2\\x56\\x0e\\x87\\x8e\\x3f\\xd6\\xb9\\xb5\\xd7\\x13\\x45\\xf0\\xdd\\xfe\\x68\\x08\\xb1\\x22\\x61\\xcf\\xdf\\xf0\\xe2\\x7a\\x36\\x0e\\x15\\xed\\xf5\\x7a\\xd0\\xc8\\x03\\x6e\\x89\\xec\\xce\\xc4\\xde\\xec\\xc1\\xef\\x81\\x21\\x43\\x68\\x35\\x08\\xc4\\xef\\xf7\\xd1\\xd7\\xfa\\xb0\\x34\\x39\\xda\\x7d\\xcf\\x81\\x06\\xc2\\x6b\\xa0\\x42\\x72\\x84\\xac\\x3b\\x82\\xe6\\x2f\\x46\\x9c\\x6f\\xc7\\x3b\\x00\\x67\\xdf\\xb1\\x9d\\x06\\xc5\\x71\\xaa\\x18\\x18\\xa2\\x47\\xc4\\xbd\\x6c\\x30\\x78\\x22\\xea\\xa1\\xc2\\x02\\x19\\xfb\\x64\\x49\\x62\\x5e\\xbe\\x7a\\x5a\\x02\\xf3\\x9e\\xf3\\xbb\\xa0\\xaa\\x70\\x03\\xbc\\xa5\\x59\\xa4\\x25\\x85\\x3b\\xd4\\x2c\\xbe\\x76\\x38\\xbb\\x60\\x65\\xd4\\x19\\x87\\x29\\x04\\x0a\\x08\\xbf\\x09\\x17\\xc6\\xbe\\xe5\\x27\\xbe\\xe1\\x48\\x54\\xcd\\x9e\\xe6\\x8d\\xf1\\x6c\\x2e\\xca\\xe5\\x3a\\x67\\xce\\x84\\x21\\x52\\xd8\\xe6\\x2b\\xf5\\x7a\\x60\\x4e\\x7d\\xd1\\xf0\\xfc\\x3b\\x5d\\x1b\\xdb\\xd6\\x1a\\xe7\\xe1\\x51\\x90\\xa8\\xd5\\x7a\\x3d\\x30\\xa7\\x00\\x69\\xb0\\xcf\\xa5\\x26\\x30\\xa5\\x97\\xb9\\xc6\\x75\\xa2\\xad\\xf1\\xd4\\x56\\x83\\xe9\\xfa\\xf1\\xcc\\x5c\\x63\\xaa\\x6f\\xe3\\xb9\\xad\\x86\\xb6\\x0d\\x73\\xc6\\x88\\x06\\xde\\x1a\\x0b\\x75\\xf8\\x0c\\x5a\\x26\\x7d\\x16\\x7a\\xda\\x49\\xb7\\xcc\\x3a\\xbf\\x94\\x16\\xeb\\xf0\\x2a\\x96\\x69\\x4f\\x03\\x0f\\x2b\\xf5\\x78\\x15\\xcb\\xbc\\x53\\x8a\\x82\\xd2\\xda\\x1a\\x58\\x26\\x1e\\xd5\\x5c\\x9a\\xee\\x5b\\x66\\x1e\\x6d\\x4d\\x34\\x55\\x2c\\x53\\x8f\\x57\\x71\\x4d\\x15\\xcb\\xdc\\x27\\xe1\\x5b\\xbc\\x88\\x16\\xd6\\xf0\\xc0\\x32\\xf9\\x39\\x55\\x47\\xb6\\x7d\\x07\\x96\\xd9\\x17\\x6a\\x86\\x1c\\x6a\\x7c\\x37\\x5a\\x66\\x5f\\xaa\\xd5\\x0b\\x88\\x6d\\x59\\x66\\x3f\\x09\\xdf\\x89\\xd8\\xc7\\x59\\x25\\x5e\\xc5\\x36\\xfb\\xe1\\xbd\\x6e\\x8d\\x6d\\x59\\x66\\x5f\\xd1\\x04\\xa6\\x55\\x79\\x15\\xcb\\xec\\x4b\\x2d\\x77\\xb1\\x2f\\x96\\xd9\\xcf\\xe8\\x63\\xbe\\x8a\\x7e\\xf6\\x2f\\x2f\\x88\\x5c\\x5f\\xf2\\x13\\xad\\xd9\\xc2\\x43\\x6e\\x16\\x5f\\xf3\\x6f\\x7b\\xf8\\x05\\x09\\xb8\\x81\\x25\\x42\\xe2\\xdd\\x45\\x49\\xd9\\x50\\x69\\x98\\x08\\xb9\\x41\\x25\\x61\\x3b\\x9f\\x50\\xfc\\x48\\x50\\x37\\x12\\x78\\xf2\\xad\\x02\\x4b\\xce\\x7f\\xc5\\x9e\\x46\\x7b\\x2a\\x1c\\x72\\x73\\x36\\x1c\\x10\\xcd\\xba\\x22\\x77\\xec\\x55\\x18\\x41\\x78\\xc7\\xa2\\xde\\x22\\xf0\\x58\\xd4\\xb9\\x9a\\x16\\x44\\xa1\\x47\\x57\\x10\\x09\\x39\\x67\\x32\\x59\\x39\\xe0\\x27\\xfc\\x9b\\xf0\\xd7\\xe1\\x77\\x64\\x72\\x6f\\x70\\x23\\x46\\x06\\x4a\\xa2\\x51\\xf7\\x8a\\x92\\x22\\x17\\xa3\\xe6\\xd6\\x14\\x7c\\x09\\x55\\x3a\\xbf\\xe9\\x79\\x64\\xe2\\x61\\xb7\\xee\\xf0\\x50\\xc9\\x7e\\x83\\x51\\x09\\x03\\x07\\x02\\xdf\\x81\\xc8\\x33\\x5f\\xfa\\xaa\\xc3\\xfd\\xcc\\xc3\\xfb\\x78\\xd0\\x57\\xd2\\x7d\\x98\\x85\\x46\\x32\\xfa\\x0c\\xe7\\x9f\\x8a\\xd7\\x3c\\x43\\x0e\\x06\\xce\\x82\\x2d\\xc7\\x55\\xc2\\x97\\xc8\\x2b\\x19\\xe0\\xe8\\x23\\x0f\\x67\\x83\\xbd\\x7e\\xbc\\x61\\x50\\xec\\xa6\\x05\\x37\\x89\\x29\\x89\\x88\\xcd\\x73\\xf2\\x06\\x52\\x98\\xdd\\x21\\xcb\\x41\\x81\\x96\\xa4\\xc8\\xa5\\x8d\\xc3\\x20\\x71\\xfd\\x00\\x17\\x9a\\x67\\x6f\\xa8\\x6c\\xb4\\x14\\x60\\x56\\x6c\\x3f\\xe0\\x90\\xac\\x75\\xd3\\xf1\\xd0\\x89\\x05\\x2d\\x5a\\x60\\x3e\\x49\\xa5\\x56\\x23\\x4f\\x36\\x1b\\x50\\x7a\\x6b\\x1c\\xe0\\x9a\\x61\\xbb\\x7a\\x3d\\xb8\\x91\\x10\\xdd\\x71\\xb2\\x70\\xa7\\x7a\\xc0\\x4d\\xff\\x8a\\x5f\\xbd\\x1d\\x31\\x97\\x6e\\x0e\\x7e\\xcb\\x0c\\x3f\\x5c\\x24\\x7b\\x35\\xf4\\xf6\\x3f\\x5b\\xc4\\xa4\\xda\\xac\\x21\\x4b\\xcb\\x00\\x43\\x2a\\x41\\xf5\\xc8\\xce\\x91\\x62\\xc4\\xa2\\x24\\xf5\\x56\\x4a\\x52\\x6f\\xa5\\x24\\xd5\\xab\\xd6\\xf4\\x63\\xbe\\x07\\x0f\\x3a\\xd6\\x08\\xc5\\x90\\x2a\\xc9\\xca\\x0b\\x9d\\x0f\\x99\\x08\\x8e\\xaa\\xeb\\x49\\x45\\x82\\x93\\x35\\xf2\\xcf\\x80\\x54\\x65\\x67\\xd9\\x87\\xaa\\x8a\\xdf\\x60\\xe7\\xaa\\xcb\\x05\\x34\\x88\\x7c\\xdd\\x0b\\x11\\x69\\x1d\\x89\\x89\\x9c\\xd8\\xc2\\x78\\xb8\\x89\\x58\\x66\\x37\\x15\\x2b\\x5e\\x3e\\x11\\x26\\x48\\x86\\x9e\\xa0\\x67\\x17\\xc0\\xa7\\xe3\\x06\\xa5\\xd5\\x97\\xf0\\x23\\x0c\\xfa\\xd5\\x61\\x43\\x6b\\xdb\\x02\\x60\\x0f\\xb3\\xbc\\xc7\\x4d\\x14\\x92\\x0f\\xa0\\x55\\x37\\xfd\\xb1\\x7c\\x48\\xb9\\x85\\xc9\\x33\\xb2\\x30\\xd7\\xb5\\xfd\\x5f\\xea\\x45\\xbc\\x56\\x9f\\x5e\\x0f\\x4e\\x28\\x1e\\xfe\\x68\\x05\\xf1\\xe7\\x68\\x0d\\x9f\\xb9\\x2c\\xb9\\x80\\xc4\\xf3\\xd5\\x10\\x02\\x9f\\xf2\\x0b\\x2c\\xe2\\x49\\xb3\\xbf\\x56\\x2a\\x53\\x34\\x22\\xb3\\x70\\x0a\\xba\\xc7\\x5b\\xcf\\x5b\\xcd\\xcf\\xe7\\xd8\\xaa\\x5b\\xed\\x06\\x75\\x1e\\x9d\\x6c\\x22\\xdb\\x75\\x1b\\x5d\\xcb\\xe0\\x1e\\xa4\\x9e\\x9a\\x13\\xc0\\xba\\x2e\\x6a\\xdf\\x15\\x83\\x20\\x4d\\x42\\x71\\x11\\xf8\\x75\\x33\\x1a\\x56\\x50\\xe2\\x9a\\xbe\\x91\\x0a\\xed\\xb5\\x10\\xdc\\x75\\x11\\xd2\\x1d\\x4b\\x35\\x3d\\xd0\\x6a\\xa6\\x63\\x5b\\xa3\\x61\\x47\\xa4\\x89\\x12\\xb9\\x27\\x6a\\x1e\\xb6\\x85\\x06\\xce\\x73\\xc3\\x9c\\x83\\x41\\xdc\\x84\\x1f\\xc3\\xb5\\x7f\\xc7\\x02\\xbe\\x9f\\xd5\\x24\\x6d\\xf5\\x5a\\xd0\\x2c\\xf5\\xaa\\xf3\\x4b\\xd3\\xfb\\x6f\\x25\\xdc\\x20\\x89\\xf7\\x8d\\x10\\xdd\\xf7\\x61\\xef\\x1b\\x09\\x39\\xd4\\xb0\\x67\\xb2\\xfe\\x9c\\xa6\\x95\\x88\\x65\\x5e\\x89\\x7a\\x4e\\x49\\x94\\x68\\x87\\x5f\\x12\\x82\\x55\\x16\\x72\\xbc\\xe2\\xa2\\x60\\xb7\\x92\\x83\\x6c\\x29\\xb0\\xe5\\x3c\\x62\\x31\\x1a\\x9a\\x42\\x00\\x3f\\x6a\\x07\\x28\\x35\\x41\\x75\\xa7\\x53\\x75\\x63\\xe6\\x72\\x76\\xd4\\x69\\x30\\x97\\xd6\\xc3\\x4d\\xf8\\x8d\\x83\\x75\\xaf\\xbb\\xa9\\xa5\\xc9\\x8b\\xfe\\xf3\\x67\\x83\\x1d\\xd4\\xf3\\x23\\x7f\\xb8\\xe5\\xc8\\x8c\\x68\\x12\\x47\\xbe\\x32\\x63\\x78\\x36\\xd8\\xa9\\x5e\\x03\\x48\\x83\\x72\\x59\\x3b\\x28\\x96\\xa6\\x5c\\x12\\x01\\x2e\\x09\\x7d\\x8f\\xab\\x28\\x45\\x96\\xe8\\xa3\\x12\\x8d\\x7d\\x68\\xf2\\xa5\\xf8\\x1d\\x33\\x80\\xc8\\x67\\x8f\\xc3\\x7d\\x0d\\xbb\\x08\\xc7\\xe3\\x70\\x76\\x55\\xf8\\xba\\x64\\x20\\xf5\\xa2\\x36\\xe1\\xcd\\xf6\\x7e\\xc2\\x30\\x90\\x69\\x29\\x43\\xcb\\x94\\x5d\\xa5\\x96\\xbc\\x65\\x86\\x33\\xf4\\x6a\\x10\\x8a\\x66\\x6a\\xc8\\xb8\\x0f\\x37\\xe2\\xff\\xf2\\xee\\xbc\\x84\\x3d\\xdc\\xb7\\x34\\x91\\x98\\xc1\\xa4\\x45\\x9b\\xb5\\x55\\x95\\xca\\x44\\x3e\\xeb\\xa7\\x34\\x91\\x0f\\x69\\x38\\x74\\xb9\\x4d\\xaa\\xda\\x54\\x93\\x8b\\xd4\\xcd\\xb0\\x51\\x9f\\xe5\\x52\\x33\\x74\\x79\\x94\\xc4\\x50\\x35\\x35\\xaa\\xe9\\xdf\\xed\\x41\\x87\\x34\\x03\\xf6\\xa0\\xa4\\x85\\x86\\x07\\x0e\\xf4\\xbb\\xf8\\xa7\\x4f\\x7f\\xe5\\x7f\\xfd\\x01\\xb0\\xa4\\xe2\\x6e\\x24\\x1f\\x11\\x01\\x36\\x9d\\xeb\\xd8\\x83\\x1f\\xb3\\xd3\\xa2\\xa6\\x93\\x20\\x29\\x35\\x3a\\xb1\\xb7\\xae\\xdf\\x62\\xdd\\xae\\xda\\x2d\\x37\\x74\\xfd\\x21\\x94\\x6a\\x1d\\x22\\xd5\\xcb\\xd6\\x1a\\x00\\xbf\\x26\\xa0\\xcc\\x18\\x89\\x2d\\xc7\\x2c\\x8e\\xcb\\xae\\x52\\x9a\\x27\\xf3\\x60\\xa9\\x77\\xed\\x53\\x17\\x7b\\x50\\x11\\x69\\x1c\\x44\\x02\\xa6\\x1a\\xac\\x6f\\xe0\\x77\\x3a\\xdf\\xe9\\x5e\\x95\\xc7\\xb0\\x1e\\xe7\\x7d\\xab\\xac\\x4f\\x35\\x87\\x66\\xdd\\xfb\\x27\\xea\\x78\\x77\\x9f\\x3e\\xeb\\xf7\\xd3\\x04\\x2f\\xbb\\x4f\\x31\\x6b\\xfb\\x15\\x3c\\xd3\\x4b\\xa5\\xaa\\x17\\x1b\\x0a\\x4d\\x38\\xad\\x9c\\x31\\x37\\x88\\x91\\x7e\\xda\\xf8\\xb8\\x9a\\x07\\xe4\\x25\\x32\\x49\\x44\\x82\\x95\\xd8\\x6b\\x3a\\x6a\\x9c\\x1e\\x95\\x37\\x97\\x98\\xb1\\xe2\\xb6\\x3a\\x4a\\x7c\\x8d\\x25\\x8a\\xf2\\xd7\\xc5\\xbc\\xda\\xac\\xbf\\x1e\\x8d\\x94\\x77\\xca\\xf5\\x52\\xf8\\x1f\\x5d\\xe5\\xcf\\xb9\\x7c\\x82\\xa6\\x6f\\x92\\xa3\\xa8\\x5d\\xc0\\x4b\\xfe\\xda\\x81\\x5b\\x50\\xfe\\x26\\x3d\\xd9\\xe9\\x04\\xc6\\xf5\\x8c\\xcd\\x73\\xe2\\x33\\x22\\x83\\xa4\\x5b\\x94\\x91\\x79\\x1e\\xab\\xc9\\xaa\\x43\\xd1\\x33\\xf7\\x26\\x93\\x58\\x19\\x6d\\xff\\xea\\x02\\x4e\\x61\\x41\\x1b\\x53\\x4e\\xae\\x87\\x10\\x91\\x09\\x0d\\x16\\xb7\\x6b\\x5c\\xe3\\x20\\x15\\x30\\x63\\x22\\xb6\\x5b\\x75\\xec\\x26\\x98\\x8a\\x71\\x1c\\x31\\x37\\x5e\\x67\\xb8\\x04\\x79\\x44\\x68\\xeb\\x86\\xa6\\x58\\x76\\x59\\xdd\\xd8\\x07\\xb9\\xe6\\xd2\\x90\\xe9\\xc2\\x8b\\x5b\\x1e\\x38\\x7f\\x4c\\x90\\x9d\\x9a\\x49\\x3a\\x60\\x13\\xd9\\x84\\x20\\x38\\xeb\\x2d\\x08\\x39\\x06\\x01\\x65\\x2c\\x11\\x83\\xb0\\x06\\x9a\\x69\\xcb\\x9d\\xce\\xe5\\x7a\\xc2\\xa1\\x9a\\x87\\x15\\xd4\\x93\\xa3\\x7c\\x9f\\xb3\\xbc\\x6e\\x64\\x72\\xc8\\x6d\\x6e\\x25\\x57\\xd9\\x92\\x12\\xc9\\xcb\\x64\\xdb\\x55\\xa9\\x3c\\x2b\\x90\\x53\\xad\\x7e\\x6b\\x58\\xe5\\xd2\\x64\\x76\\x59\\xc1\\xd4\\xd7\\xd6\\x89\\xb2\\x15\\x4b\\xd5\\x48\\x65\\xc6\\xbc\\x15\\x6c\\x9c\\x6a\\xd6\\xcb\\x1b\\xc8\\x1b\\xf6\\x56\\x23\\x75\\x21\\x99\\x3e\\x6b\\xd6\\x75\\xed\\x2f\\x76\\xab\\x5b\\x0d\\xe3\\x67\\xca\\x86\\xf6\\xe1\\xf4\\xfc\\xf4\\xfc\\xff\\x9c\\x1d\\xf6\\x8e\\x4e\\x3e\\x9e\\x1f\\x9c\\xbc\\x39\\x84\\xf7\\x87\\xe7\\x7f\\x3d\\x7d\\xab\\x4d\\x89\\xad\\x77\\xec\\xcf\\x19\\xc8\\xc0\\xfd\\x24\\x8c\\x53\\x17\\x4d\\xa1\\xa2\\x19\\xc5\\xe1\\x74\\x91\\xe4\\x34\\x59\\x7e\\xac\\xf7\\xaa\\x2f\\x6b\\x25\\xcf\\xba\\xb2\\xfe\\xdf\\xb1\\xfa\\x90\\xde\\xc0\\x10\\xea\\x99\\xf6\\x2e\\x4b\\xae\\x43\\xbc\\x75\\x5b\\xe6\\x59\\x79\\xdb\\x6b\\x09\\x0b\\x2a\\xc3\\x1e\\xb6\\x0c\\xf6\\x1a\\x61\\x11\\x2a\\x47\\xcf\\x30\\x68\\x6a\\xc0\\x03\\x97\\xd7\\x9b\\x32\\x15\\xbe\\xf4\\x77\\x0a\\x04\\x63\\x12\\x31\\x1a\\xaa\\xf0\\x4a\\xb7\\xcd\\xb4\\xc3\\x3e\\x66\\xfe\\xb4\\xd6\\x28\\xcb\\xec\\xec\\x3a\\x07\\x6c\\x1c\\x6b\\x07\\x71\\xa7\\xeb\\xa2\\x03\\x5b\\x3a\\x5a\\x51\\x7b\\xc8\\xd4\\x37\\x83\\xbc\\x87\\x76\\x79\\x8c\\xfc\\x18\\xae\\x23\\xe6\\x92\\x8c\\x4b\\x38\\x26\\x97\\xe3\\x4d\\x34\\x57\\x0e\\x8c\\xd4\\x4c\\xe8\\x4f\\xa0\\x53\\x07\\x74\\xde\\xe1\\xb9\\x16\\xdc\\xbe\\x00\\x2b\\xf3\\x44\\x4c\\x18\\xc4\\xee\\x4c\\x54\\xce\\x95\\x0c\\x23\\x92\\x39\\x15\\xd1\\x10\\xf9\\x61\\xc8\\x91\\xad\\x72\\x0a\\x45\\x90\\xc0\\xf3\\x10\\xb7\\x0d\\x45\\xd8\\x53\\x2c\\x75\\x57\\x36\\x0b\\x6e\\xdf\\xa2\\xdc\\x90\\x29\\xb1\\x64\\xfc\\x2d\\x3e\\x38\\x4e\\xd1\\x7e\\x53\\x40\\xff\\x96\\xd9\\x2e\\x4a\\xf5\\x0b\\xb1\\x3c\\xac\\x53\\xe4\\x68\\xc7\\x30\\x37\\xc6\\xba\\x59\\xb5\\x59\\x8b\\x6b\\x07\\x59\\x20\\x75\\x46\\x38\\xf1\\x71\\xf6\\xe6\\xb5\\xa9\\x53\\xe0\\xc0\\x9d\\xd9\\x0e\\x02\\xf3\\x79\\xf3\\xad\\x63\\x4a\\x7a\\x44\\xd6\\xe0\\x6a\\x90\\x0a\\xa3\\xa1\\x66\\x80\\x06\\xd6\\x4d\\xb8\\x53\\xfc\\x90\\x84\\xe3\\x8c\\x9a\\xc9\\x45\\xec\\xd4\\x5c\\xa6\\x97\\x96\\xe2\\x6b\\x63\\xb6\\xc4\\x48\\xc3\\xa0\\xe5\\xe7\\x2c\\xcf\\x71\\xe4\\xc2\\xa4\\x04\\x06\\x1f\\x8e\\xb4\\x67\\x88\\xeb\\xc5\\xdd\\x65\\xea\\x55\\xfd\\x12\\xee\\x48\\x84\\x47\\xdc\\xc7\\x9d\\xe4\\xeb\\x03\\x0a\\xc0\\x64\\x04\\x14\\x08\\x82\\x6e\\x0b\\x3e\\x6f\\x71\\x59\\xa9\\x5e\\xae\\x78\\xe3\\xed\\xc3\\x10\\x8e\\x4a\\x6f\\x4f\\x60\\x08\\x27\\xa5\\xb7\\x47\\x1c\\x93\\xdc\\xdb\\x3e\\xf4\\x08\\xbf\\xd2\\xdb\\x7e\\x09\\x42\\x5f\\x0b\\xb7\\xaf\\x85\\x7b\\x22\\xe0\\x9e\\x94\\xde\\x96\\xe1\\x9e\\x68\\xe1\\x9e\\x08\\xb8\\xf9\\xb7\\x47\\x02\\xee\\x51\\xe9\\x6d\\x79\\x1c\\x8e\\xb4\\x70\\x8f\\x34\\x70\\xbf\\xef\\x21\\x49\\x39\\xd8\\x50\\xb7\\xac\\x16\\x53\\x1b\\x29\\x92\\xeb\\xf4\\x60\\x75\\xc7\\xe3\\x30\\x42\\xa9\\x48\\x12\\xc2\\xdb\\xc3\\x37\\x47\\xef\\x0f\\x8e\\x7f\\x3b\\x3b\\x3e\\x78\\x73\\xf8\\x11\\x55\\x0c\\xb9\\x30\\x32\\x95\\x44\\x82\\x10\\xf9\\x69\\x45\\x04\\x02\\xb3\\xc5\\xae\\x45\\x88\\xb7\\xad\\x84\\x18\\xb3\\xbe\\x5b\\x88\\xb0\\x53\\xe8\\x80\\x93\\xc7\\xfe\\xdb\\x68\\x74\\x8d\\xf9\\x91\\x0e\\xc0\\x32\\x8c\\x07\\x0e\\x47\\x29\\x02\\x14\\xef\\x80\\x76\\x6a\\x8a\\xf3\\x57\\x9c\\xb4\\x9a\\xa3\\x8f\\xf6\\xcf\\x1c\\x8f\\x6c\\x1a\\xf0\\xd5\\xba\\x73\\xb1\\xf3\\x8d\\x73\\xd1\\x77\\x38\\xd9\\xfd\\xa6\\x63\\x51\\x38\\x58\\x57\\x70\\x28\\xec\\xf3\\xc2\\x9d\\x4a\\xc5\\x4b\\x2d\\x06\\x25\\xf3\\xcb\\x96\\x4a\\xbb\\x2b\\x77\\x1a\\x57\\xf8\\x58\\x9f\\x75\\xb1\\x21\\x3a\\xfc\\xd8\\xe7\\x75\\x87\\x73\\xf7\\x3b\\xf0\\x18\\xe2\\x3e\\xfa\\x3f\\x8c\\x15\\xef\\xd4\\xe5\\xc5\\x51\\xac\\xfa\\x47\\x30\\xe3\\xdb\\x7f\\xca\\x3a\\xdc\\x8c\\x09\\xdf\\x70\\x2d\\x8a\\xc6\\xce\\x79\\x5b\\x7c\\x41\\x5e\\xaf\\xbd\\xbf\\x9f\\x7e\\x8f\\x05\\xf9\\xfa\\xdb\\x96\\xe3\\x26\\x23\\x1b\\x46\\xfa\\x1d\\x6f\\x3d\\xee\\xbe\\x7d\\x94\\x4f\\xa3\\x43\\xde\\xaa\\xb8\\x64\\x5c\\x27\\x6c\\xdd\\xf1\\x7e\\x66\\x1d\\xef\\x26\\x8c\\xd4\\x34\\x3e\\xf6\\x51\\x6f\\x89\\xf8\\xad\\xc2\\xc3\\x4f\\xcf\\xed\\x7d\\xf7\\x59\\x70\\x01\\xb7\\x31\\x4b\\xed\\x76\\x37\\x1c\\x54\\x3f\\x7e\\x47\\x70\\xd6\\xd8\\xe9\\x8f\\x1e\\xc9\\x1b\\xc2\\x1f\\xdf\\xcd\\x34\\x6e\\x44\\xb9\\x87\\x75\\x3b\\x28\\x4e\\x60\\x5c\\x2a\\xf8\\x6d\\x93\\xbe\\xc2\\xe3\\xc7\\x15\\x57\\x96\\xd7\\xe2\\xde\\x94\\x5d\\x74\\xb6\\xfe\\x84\\x01\\xa2\\xac\\xad\\x9b\\xce\\x3d\\x39\\x77\\xd7\\x1f\\x0c\\xec\\x61\\xfc\\x27\\x74\\x2b\\x60\\xd7\\x6e\\xe2\\xdf\\xb1\\x6f\\xe9\\x9b\\x00\\x21\\xe6\\xfd\\x84\\x5d\\xaf\\xd3\\x55\\xea\\x29\\xbf\\xc3\\xfd\\x09\\xbd\\xc5\\xd4\\x13\\x9d\\xfe\\x37\\x74\\xf6\\xdf\\x59\\x14\\x6e\\xba\\xac\\xe9\\x93\\xcc\\x72\\xfb\\x27\\x74\\x77\\x03\\x29\\xd6\\x86\\x03\\xc3\\x5b\\x4a\\x4f\\xe5\\xe9\\xda\\xa7\\xb2\\xc1\\xcb\\x7b\\xbd\\x53\\xf9\\xcf\\x59\\x42\\xd9\\x98\\xfe\\x99\\x47\\xb2\\x1c\\xdf\\xfc\\x79\\x3c\\x5d\\xff\\x3c\\x7e\\xf1\\xbd\\xcf\\xe3\\x4e\\xfe\\x40\\xde\\x60\\xfc\\x21\\x80\\x0e\\xca\\x15\\x82\\xd2\\x5b\\x9d\\x7c\\xa5\\x83\\x72\\x85\\xce\\x51\\x41\\x3c\\xd2\\x41\\x81\\x45\\x27\\x28\\xbd\\xee\\x6b\\xe4\\x2e\\x3a\\xc8\\x7d\\x3d\\xe4\\x13\\x01\\xb9\\x28\\x36\\xe9\\x68\\x45\\x2c\\x3a\\xc0\\x27\\x02\\x70\\x51\\x40\\xd2\\xd1\\x8a\\x58\\x3a\\x5a\\x11\\x8b\\x0e\\xee\\x91\\x06\\xee\\xf7\\xbd\\xfc\\xa0\\xaf\\x6c\\xdd\\xb5\\x5d\\xb5\\x84\\x09\\x18\\x5f\\xb6\\xf1\\x62\\xb4\\xc6\\xb2\\xc5\\xf8\\x4b\\xe8\\x82\\x96\\x38\\xb0\\x3c\\x3e\\x5f\\x59\\xbc\\xcf\\x84\\x4c\\xd5\\x5c\\xc2\\xa5\\x1c\\xf6\\x26\\x91\\x2b\\x8a\\xc5\\x0d\\x6a\\xe0\\x55\\x39\\x4e\\x1d\\xe1\\xad\\x2f\\x3e\\xc2\\x8c\\xf6\\xa6\\x96\\x72\\xd9\\xec\\x2d\\x41\\x91\\x1e\\xb9\\x68\\x62\\x38\\x32\\x05\\x52\\x38\\x71\\x4f\\x2c\\x51\\x97\\x3e\\xfa\\xd7\\x41\\x0c\\x9e\\x7f\\x75\\xc5\\x22\\x4b\\x23\\x2e\\x3c\\x1a\\x56\\x84\\x7b\\x59\\xa1\\xb6\\xac\\x33\\x32\\x2b\\x33\\xa5\\xca\\xac\\x3b\\x9f\\x2e\\xe2\\xe6\\x6a\\xbd\\xb0\\x63\\xa8\\xcc\\x93\\x79\\xd3\\x33\\x66\\xcf\\x3c\\x8f\\x2b\\x86\\xc3\\x5b\\xaf\\x70\\xb5\\x53\\x22\\x66\\x19\\x5e\\x55\\x88\\xe2\\x97\\x8c\\x12\\xd3\\xb3\\xca\\xe0\\x4e\\x62\\x6a\\xa5\\x04\\xc0\\x6c\\xc0\\x24\\x00\\x8f\\x65\\xc6\\xfb\\x74\\x96\\x31\\xab\\x7f\\x33\\x1d\\x76\\x07\\x56\\xd0\\x82\\xbd\\xd2\\xfa\\xe3\\xa5\\x96\\xb0\\x87\\x09\\xfe\\x2b\\x22\\xe7\\x08\\x9c\\xec\\xb9\\x06\\x24\\x3e\\x9c\\x47\\x21\\x94\\xa4\\x69\\xab\\xb1\\x0a\\x48\\x1b\\x04\\xc4\\x7b\\xc5\\x41\\xac\\xc8\\x69\\x93\\xcc\\xd1\\x1d\\x58\\x2a\\x8e\\x9c\\xf2\\x5d\\x48\\x98\\xf0\\x5f\\x46\\x61\\x32\\x41\\x2f\\xd7\\x2f\\x95\\x86\\x95\\x62\\x70\\x08\\xab\\x1a\\xe3\\xb3\\x14\\x05\\x97\\xb0\\x57\\xcb\\x38\\xef\\xe8\\xf0\\xf0\\x10\\x9e\\xed\\xee\\x40\\x73\\xab\\xdf\\x7f\\xde\\x82\\xa7\\xdd\\xed\\x3d\\x3c\\x71\\xf0\\x68\\xe9\\x53\\x84\\xc2\\xd4\\x38\\x2f\\x09\\x33\\x21\\x4f\\x25\\xf4\\xbc\\x4c\\x16\\xd3\\xf1\\xee\\x73\\x90\\x7b\\xf6\\x84\\xc7\\x6b\\x99\\x08\\x2c\\x73\\x59\\xfd\\x97\\xcc\\x00\\x77\\x95\\x2b\\xb6\\x32\\x15\\xa3\\x5d\\xa3\\x24\\xc5\\x32\\x51\\x99\\xb7\\x2c\\x61\\xd1\\xcc\\x0f\\x18\\xdc\\x4f\\xfc\\xf1\\x44\\x1e\\x2a\\x23\\xff\\x9a\\x5f\\x06\\x2b\\x15\\x41\\x48\\x92\\x19\\x74\\xa0\\x6a\\x63\\x91\\x02\\xff\\xf8\\x9c\\x13\\x62\\xb7\\x96\\xf7\\x21\\x07\\xdd\\x71\\xed\\x66\\x3a\\x09\\xf6\\xf2\\x1b\\x23\\x37\\xe1\\x90\\x2e\\x2b\\x02\\x1d\\x27\\x98\\x64\\x6c\\x23\\x5b\\x9a\\xa4\\x1b\\xb1\\x3b\\x16\\xc5\\xe6\\x79\\x00\\x61\\xf4\\x11\\xb1\\x2c\\x1e\\x32\\x5f\\xa1\\xc8\\xa1\\x72\\x76\\x53\\x06\\x02\\xb4\\x18\\x06\\x91\\x1e\\x8e\\x1f\\x5c\\xee\\x4b\\x18\\x75\\x3a\\x2f\\x21\\xa9\\xe3\\x6c\\x97\\x43\\x4e\\xdb\\xb1\\x4a\\x13\\x6b\\x25\\x7c\\xb7\\x90\\x6c\\x4b\\x2f\\x7a\\xb2\\xbb\\x1c\\xad\\xaa\\x4c\\x61\\x6f\\x50\\x05\\x2a\\x56\\x87\\x58\\x54\\x8a\\x8f\\xe3\\x2b\\xd1\\xb1\\x95\\xf2\\xae\\x05\\xfb\\xe0\\xc2\\x9e\\x35\\x42\\x13\\x0d\\x09\\x87\\x36\\x42\\xf5\\x22\\x8c\\xe0\\x15\\xdc\\xbc\\x84\\x51\\xbb\\x5d\\x4d\\x16\\xa5\\x7d\\xda\\x08\\xcd\\xd3\\x56\\xf8\\xa1\\x96\\xe5\\x34\\xf5\\x82\\x6a\\xbe\\xa2\\x8a\\xd5\\xb6\\x66\\x35\\xec\\xde\\xbe\\x53\\x58\\xe5\\x5e\\x0f\\x96\\x1c\\xaf\\x7d\\xc0\\x70\\xdd\\x9c\\x52\\x88\\x2b\\x10\\xf9\\xad\\x0b\\x3d\\x70\\x4d\\x02\\xc0\\x7b\\xdb\\x12\\xdb\\xd0\\x21\\xaa\\xb3\\x1a\\x3b\\x74\\x24\\x27\\x8e\\x24\\xf1\\x66\\x56\\x6a\\x84\\x13\\x7e\\x53\\x98\\xdc\\x4e\\xd1\\xbc\\xcd\\x16\\x9d\\x52\\x0d\\x22\\xce\\xbb\\xb2\\x1c\\x73\\xcc\\xe2\\x49\\x18\\x25\\x26\\xcc\\x29\\x16\\x9d\\xcc\\x3a\\xe9\\xaa\\x19\\xf2\\x57\\x6a\\x6d\\x70\\xe3\\x2c\\x91\\x1b\\x26\\x08\\xe6\\x75\\xb0\\x5c\\x9c\\xb8\\x11\\xfa\\x3a\\xa5\\x78\\x5b\\xa8\\xe4\\x28\\x17\\x81\\x5c\\x6c\\xcf\\x65\\x9a\\x49\\xca\\x78\\x88\\xf0\\xd1\\x91\\x71\\x34\\x6b\\xe8\\xf7\\x57\\x63\\xca\\x70\\x66\\x72\\x67\\x97\\xcd\\xdf\\xc0\\x6b\\x4e\\x24\\x6a\\xd0\\x6b\\x8a\\x60\\x4a\\xcb\\xf8\\xa6\\x7a\\xfd\\x67\\x86\\x89\\x37\\x2f\\xc1\\x87\\xc7\\x8f\\x91\\x1d\\xe9\\x74\\xfc\\x4b\\xea\\xee\\x25\\x6e\\xc5\\x0a\\x6b\\xe3\\x4e\\x07\\x8b\\x56\\x84\\xd0\\x42\\x7c\\xda\\x34\\x3c\\x9b\\x45\\xd1\\x42\\x08\\x9d\\x21\\x75\\x6d\\x2d\\x86\\x37\\xb3\\xda\\xcc\\x9b\\xe7\\xbb\\x81\\x27\\x3c\\x39\\x95\\x18\\xb9\\x52\\x59\\x3d\\x35\\x98\\x4f\\x66\\xce\\xd2\\xa9\\x6c\\x09\\x0f\\x6e\\xca\\x11\\xe5\\x40\\xa7\\xb3\\x32\\xc7\\xd2\\x17\\x1e\\x2d\\xb6\\x3b\\xc8\\xb2\\x9a\\x0b\\xec\\xf5\\xe0\\x5d\\x38\\x9d\\x86\\xf7\\xbc\\x2b\\x1a\\x36\\xca\\xcc\\x7a\\x63\\x88\\x0c\\xe2\\xb0\\xda\\x7d\\x80\\xd1\\x22\\x01\\x95\\xe5\\x2a\\xf1\\x5c\\xf7\\x6e\\xe4\\xc5\\x5a\\xed\\x5a\\xe1\\x21\\xc2\\xa1\\xe7\\xbb\\x2a\\xa2\\x35\\xae\\x84\\x0d\\xe7\\xaa\\xda\\x86\\x53\\xb2\\xa4\\xeb\\xce\\xbe\\x42\\x3c\\xc6\\x69\\xb8\\x98\\xd4\\x3a\\xc9\\x8d\\xa1\\xbd\\x84\\x0e\\xb4\\x57\\xfc\\xe4\\x48\\x5f\\x3f\\x7e\\x0c\\x1d\\xfe\\xba\\x93\\x7b\\x6d\\x6a\\x82\\x43\\x14\\xba\\x0b\\x0a\\x53\\x6f\\x18\\x2c\\x79\\xb1\\xcc\\x42\\x22\\xaf\\x1c\\xa4\\xc5\\x2b\\x6d\\x7c\\xbe\\x3a\\x12\\x1d\\xf4\\x9e\\xec\\xc3\\x10\\x0a\\x22\\x0b\\x7c\\x7f\\x62\\x78\\x7f\\xc4\\xdf\\xe7\\xe5\\x37\\xd0\\x87\\x1f\\x71\\x25\\x14\\x24\\x38\\x1d\\xf9\\xbe\\xd3\\x2f\\x97\\xd7\\xb5\\xdb\\x37\\xb4\\xdb\\x97\\xed\\x16\\xe0\\x9c\\xc8\\x76\\x4f\\xca\\xef\\x75\\xf0\\x4f\\x0c\\xf0\\x4f\\x24\\xfc\\xc2\\xfb\\x23\\x03\\xfc\\x23\\x03\\xfc\\x23\\x03\\xfc\\x23\\x1d\\xfc\\xef\\x2c\\x04\\x0a\\xbd\\xc5\\xb4\\xb6\\x84\\xb3\\x8b\\xae\\xc3\\x22\\x21\\xa2\\x87\\xcc\\x68\\x0c\\x61\\x41\\x00\\xfd\\xfe\\xf4\\xed\\x2f\\xc7\\xa7\\xb5\\x8c\\x6b\\x44\\xeb\\x43\\xfa\\xb8\\xa6\\xd8\\xe8\\xb3\\x03\\x16\\x59\\x90\\x94\\x16\\x59\\x85\\x41\\x06\\x2a\\x61\\x11\\x06\\x99\\xe9\\xbd\\xcc\\x4b\\x90\\xde\\x87\\x0b\\xd6\\x88\\x78\\x2d\\x5e\\x09\\x65\\x93\\xbc\\x22\\x5b\\x78\\x82\\x47\\xcb\\xae\\x90\\x1c\\x74\\x63\\xfe\\xff\\x8a\\xd4\\x0c\\x8f\\x56\\xdd\\x4a\\x8f\\xd4\\x75\\x85\\x49\\xf9\\x3e\\x2c\\xd3\\x5b\\xbe\\xda\\x03\\xec\\x92\\x19\\x65\\xd5\\xa4\\x9e\\xa3\\xc8\\x31\\x5e\\x0a\\x8c\\x97\\x1b\\x62\\xbc\\x5c\\x4f\\xcc\\x84\\x6d\\x2b\\x8b\\x8f\\x9f\\x07\\x2f\\xaa\\xa5\\x39\\x8b\\xf1\\xd4\\xf7\\x7c\\x37\\xa0\\x24\\xb0\\x7e\\x18\\xec\\xc1\\x67\\x18\\x62\\x44\\xb0\\xe6\\xaa\\x05\\x4f\\x80\\x3c\\xe3\\x96\\xd0\\x03\\x77\\x14\\x37\\x57\\x2d\\xb3\\x83\\x76\\xaf\\x87\\x0e\\xe2\\x9c\\x88\\x7f\\x5e\\x01\\x46\\x70\\x66\\x11\\xe3\\x74\\xe8\\xd5\\x10\\x22\\x78\\x25\\x00\\x18\\xeb\\xc7\\x52\\xaa\\x68\\x2a\\xb0\\xb2\\x99\\xb5\\xf3\\xe7\\x33\\x65\\xc8\\xc6\\x10\\x60\\x2b\\xb4\\x57\\xd2\\xda\\x89\\xe4\\xe1\\x59\\x1a\\xfc\\xdc\\x8d\\xe1\\x89\\xb1\\x44\\xe5\\xed\\xb9\\x8c\\x8e\\x3a\\x3f\\x1b\\x25\\x2f\\x58\\x92\\xa8\\xb9\\x09\\x9f\\xbb\\x18\\x87\\x90\\xcf\\xd1\\x1f\\x6d\\x04\\x67\\x22\\x9e\\xa8\\x5e\\x65\\x5e\\x4e\\xc5\\x86\\x31\\xc6\\x66\\x8b\\x69\\xe2\\xcf\\xa7\\x3e\\x19\\x30\\xe6\\x72\\xe0\\x6b\\xe9\\xa0\\x00\\x84\\x84\\x30\\xa8\\xa9\\x61\\x5d\\xdb\\x45\\x82\\x7c\\x22\\x3a\\x4b\\x22\\x27\\x66\\x7b\\xe3\\x6f\\x72\\x8f\\x80\\x00\\xda\\x5a\\x75\\x4f\\x5b\\xab\\xee\\x69\\xe3\\xf9\\x56\\xd4\\xf6\\xb4\\x29\\x6d\\x4c\\xe9\\xad\\x4e\\xd9\\xa3\\x83\\xdb\\xd7\\xc2\\x3d\\x11\\x70\\x8b\\xfa\\x9b\\xb6\\x56\\xd7\\xa3\\x83\\x7b\\x22\\xe0\\x16\\x35\\x35\\x6d\\xad\\xae\\xa7\\xad\\xd5\\xf5\\xe8\\xe0\\x1e\\x69\\xf0\\xfd\\xbe\\x2b\\x15\\xd3\\x68\\x7c\\x27\\x55\\xcf\\x7c\\x2a\\x34\\x3d\\xfc\\x5e\\xbc\\xde\\x91\\x9d\\xfc\\xd1\\xda\\x1d\\x8d\\xad\\x08\\xfc\\x7f\\xda\\x9d\\xda\\xda\\x1d\\x22\\xad\\xff\\xef\\x56\\xef\\x88\\xcd\\xa6\\x78\\x93\\xf8\\xa9\\xf3\\x4e\\xf6\\xb2\\x2a\\xfb\\x94\\x46\\xeb\\x53\\x4c\\x83\\x85\\xf6\\xf6\\xdf\\x43\\xaf\\xf3\\x67\\x28\\x68\\x4c\\xba\\xa3\\x82\\xd2\\x66\\x65\\x55\\xd3\\x80\\x8b\\x9e\\x54\\xeb\\x2d\\xaf\\x7f\\x91\\xde\\xa3\\x8e\\xac\\x1d\\xde\\xb9\\x31\\xda\\x70\\x86\\xb0\\x40\\x9b\\x0f\\x14\\x94\\x73\\x3a\\x1b\\x80\\x17\\xc2\\x22\\x40\\x21\\x8d\\x41\\x26\\xaf\\x55\\x8f\\x58\\x87\\xdf\\xad\\x95\\x02\\xf0\\xfb\\x68\\x2b\\xea\\xe8\\x45\\xbe\\x8b\\x02\\xa6\\xa6\\x5a\\xc4\\x54\\x48\\x4a\\xc7\\xdc\\xef\\xa8\\xd0\\xd0\\xa3\\x94\\x53\\x3a\\x58\\xce\\x8d\\xea\\x54\\x51\\x45\\xb9\\xfa\\x34\\x0c\\xae\\x59\\x44\\xe2\\x75\\x07\\x65\\x39\\xa3\\x34\\x1b\\xb6\\x90\\x33\\x57\\x4a\\x90\\x5d\\xe8\\xa0\\xf6\\x82\\xaf\\x8f\\x44\\x15\\xb2\\xa7\\x62\\xf7\\xc4\\x11\\xca\\x1f\\x73\\x1a\\xa7\\x60\\xba\\x92\\x72\\x6b\\x0f\\x05\\x72\\xaa\\xf8\\x1a\\x5d\\xce\\x5c\\xe2\\x22\\xae\\x16\\x11\\xd2\\xa5\\x2c\\x26\\xd8\\x72\\x0c\\x63\\x37\\x80\\x11\\x03\\xff\\x3a\\x08\\x23\\x53\\x6c\\x85\\x4c\\xe3\\xd2\\x7f\\x09\\x23\\x7b\\xea\\x40\\x97\\x94\\x3e\\xe3\\x8b\\x4e\\x67\\x74\\x99\\x6a\\x4c\\xda\\x42\\xd5\\xd2\\x06\\x17\\x63\\x64\\xa2\\xf8\\xdb\\x1a\\x0b\\x88\\xea\\xfd\\x68\\x13\\x05\\x5b\\x6e\\x94\\xae\\x0d\\xc5\\xe5\\xb8\\x2b\\x36\\x79\\xd3\\xb5\\x2c\\xb9\\x76\\x7b\\x65\\xd8\\x8f\\x6b\\x8a\\x10\\x89\\x7a\\x93\\xfc\\xb0\\x2d\\xe4\\x87\\x7d\\x21\\x38\\x6c\\x0b\\xc1\\xa1\\x3e\\xd8\\x79\\xaf\\x47\\x84\\x41\\x7a\\xdf\\xb7\\x61\\x00\\xf3\\x30\\x8e\\xfd\\x91\\xea\\xf3\\xa0\\x3c\\xdf\\x5f\\x6e\\xa8\\x75\\x0c\\xd5\\x04\\xde\\xb6\\x3b\\x87\\x9a\\x32\\xbe\\x5f\\x7c\\xb9\\x84\\xdf\\x47\\x61\\x38\\x65\\x6e\\xf0\\x40\\xf0\\xbf\\xc2\\x3f\\x64\\x2c\\xb3\\x10\\xc6\\xe1\\x22\\x48\\xa4\\x15\\x74\\x07\\xdd\\x99\\xf2\\x0e\\x8e\\x7b\\x68\\x23\\xe8\\x90\\xc5\\x9e\\x03\\x03\\x7e\\x48\\xf6\\x2b\\x79\\xe1\\x34\\x5b\\x33\\x9a\\x3e\\xe5\\xf9\\xe1\\x2f\\x9b\\xfb\\x8f\\x56\\x73\\xc3\\x82\\x2d\\x32\\xef\\xe6\\x2c\\xe5\\x40\\xb3\\x95\\x65\\x64\\x14\\xd9\\x4f\\x68\\x9c\\x78\\x17\\x47\\x7e\\xe0\\x46\\x42\\x01\\xbb\\x07\\xbf\\x7f\\x31\\x64\\x41\\x41\\x22\\xf3\\x45\\x4d\\xee\\xce\\xbf\\x0c\\xe1\\xd1\\xa3\\x2f\\xd9\\x97\\x41\\xf6\\xd1\\x7e\\x4e\\x69\\x72\\xa9\\x0c\\xb6\\x1d\\x68\\x48\\x34\\x1b\\xfc\\x4a\\x15\\x26\\x3f\\x85\\xe1\\xd4\\x81\\x2f\\x36\\x6a\\x9e\\xe1\\xc5\\x31\\x69\\xc1\\x17\\x6b\\xce\\x13\\x9b\\xe4\\xa8\\x9e\\x33\\x6e\\xd1\\x09\\xd7\\xec\\xb2\\x7b\\xa7\\xe6\\xb9\\x33\\x87\\x5b\\x2b\\xba\\xcb\\xda\\x99\\xd3\\xf5\\x5d\\x75\\x45\\xcc\\xa2\\x2a\\xbb\\x80\\x0a\\xff\\x5c\\x1b\\x4e\\x07\\x9e\\x57\\x3f\\x9a\\x76\\x15\\x1e\\x77\\x69\\x16\\xc2\\x3b\\x19\\x03\\x28\\xc3\\xc5\\x1c\\x89\\xc8\\x36\\xb1\\xb8\\x40\\x45\\xcc\\x3b\\x78\\x8d\\x59\\x59\\x03\\xa8\\x8a\\x82\\xf7\\x4d\\x3e\\xc5\\xdf\\xd9\\x31\\x6d\\xe6\\x2e\\xfd\\xd9\\x62\\x56\\xb8\\xb5\\x7b\\xf3\\xa2\\x57\\xbd\\x3e\\x63\\x01\\x72\\xfb\\x49\\x08\\xfd\\xb2\\xef\\x2b\\x44\\x2c\\x9e\\xb3\\x71\\xe2\\xdf\\xb1\\x29\\xbf\\x3a\\xa8\\xe0\\xc3\\x99\\x9f\\x24\\xb9\\x63\\x3c\\x4f\\x6e\\xbd\\xf9\\x25\\xfc\\x2e\\xe9\\xec\\xdb\\x7c\\x2c\\x42\\x38\\x92\\xce\\x26\\x7d\\xde\\xf2\\xfb\\x83\\x7f\\x52\\xa8\\xf8\\xd8\\xbf\\xcb\\xd9\\x42\\xc3\\x45\\x34\\x53\\xa0\\x7c\\x50\\x31\\x2f\\x02\\x79\\xae\\x07\\xa1\\x42\\xa3\\xf4\\x27\\xcd\\x56\\x29\\xda\\x80\\x92\\x4b\\x75\\x0f\\x7e\\xf7\\xe6\\x2a\\x8d\\x33\\x57\\xcb\\x27\\x5c\\xb5\\x55\\xcc\\x0f\\x79\\xa9\\x5e\\x34\\xab\\x55\\xaf\\x80\\x66\\xa1\\x96\\xee\\xf4\\xc1\\xfa\\x79\\x11\\x8c\\x37\\x77\\x20\\x9a\\x59\\x85\\x30\\xe5\\x94\\xcc\\x42\\x68\\x68\\xde\\x42\\xde\\x9c\\xd3\\x05\\x19\\x4a\\xd5\\x8f\\x31\\x1f\\xef\\x51\\x90\\x50\\x7b\\x7d\\x87\\x4f\\xb1\\x03\\x83\\xdd\\x8a\\x84\\xc7\\xd2\\xb7\\xd1\\x81\\xff\\xfc\\x4f\\x6f\\x0e\\xed\\x9c\\x43\\x23\\x85\\xec\\x14\\x6d\\x18\\x41\\x3c\\x52\\x1b\\xe7\\x8b\\xbb\\xef\\xc0\\x73\\xde\\xb4\\x93\\x8e\\xe6\\x7b\\x3e\\x98\\x2d\\xd8\\x2f\\xac\\xf5\\x3d\\xde\\xc2\\xc3\\xda\\xd7\\xcf\\x7f\\x31\\x21\\x40\\xe6\\x92\\xc4\\xc8\\xb7\\x62\\x61\\xaa\\x0d\\x34\\xe7\\xe1\\x3d\\x8b\\x90\\xd4\\x0e\\xfa\\xad\\x2e\\x7c\\xe4\\xc5\\x73\\xe1\\x79\\x29\\xc6\\xee\\x6b\\x3e\\x4e\\x98\\x46\\x57\\x89\\xe5\\x8a\\xbf\\xbc\\xca\\x33\\x39\\x2a\\xf0\\xdb\\x6c\\x6b\\xa6\\x7b\\xb1\\xc3\\x19\\xc8\\x8f\\x07\\xef\\x0e\\x7f\\x3b\\x3a\\x39\\x3f\\xfc\\xf9\\xf0\\x83\\xd8\\xe0\\xf9\\x77\\x95\\x5b\\xf5\\xe8\\x8a\\xa2\\xd6\\xa9\\x6b\\x1e\\xf1\\xcb\\x32\\x44\\x0b\\x3e\\x2c\\xc9\\x14\\x8e\\x32\\x14\\xde\\x7f\\xfd\\x5f\\x8c\\xc6\\x72\\x4b\\x29\\x22\\x42\\x55\\x2c\\x93\\xa3\\x60\\xd2\\x19\\xc3\\x48\\x2f\\x84\\x0d\\x45\\x81\\x3b\\x52\\xb7\\xee\\x6d\\x61\\xe7\\x96\\x6a\\x14\\x36\\xed\\x6d\\xe5\\x9e\\x45\\x08\\xb9\\x3d\\x7b\\x5b\\xb5\\x59\\x49\\x8d\\xa9\\x2b\\x21\\x16\\xa7\\xba\\x27\\x6e\\x35\\x73\\xe4\\x94\\x66\\xc8\\x81\\xc1\\xd3\\x1c\\xbf\\xd5\\xb2\\x1e\\xf1\\x7c\\xa8\\x07\\xac\\xbd\\x35\\xa0\\xc3\\x44\\xa6\\xc9\\xbe\\x6d\\xd1\\x9c\\xcc\\xa3\\xd0\\x5b\\x8c\\x33\\xc9\\x88\\xef\\x4e\\xf9\\x50\\x62\\xe2\\x6f\\xf3\\x81\\xbf\\x0f\\x81\\x50\\xe1\\x40\\x63\\xc0\\x38\\xcb\\xa7\\x02\\x36\\x6b\\xc9\\x4a\\x12\\xa6\\x80\\xf4\\x8c\\x01\\xa9\\x19\\x31\\x12\\x32\\x47\\xb8\\xbc\\x54\\x1f\\x1e\\xe0\\x56\\x44\\x20\\xcb\\xbd\\xb7\\x87\\x5c\\xe6\\x78\\xc6\\x7c\\xaf\\xd1\\x8a\\x13\\x41\\xc5\\x07\\x24\\xbe\\xb3\\xd6\\xdc\\xd3\\x67\\xe8\\xae\\xa3\\x46\\x89\\x3f\\x47\\x49\\xb3\\x13\\xb4\\xca\\x56\\x01\\xf8\\x0b\\x9c\\x98\\x7e\\xe9\\x1c\\x19\\xeb\\xd0\\x2f\\x47\\x9a\\x5f\\xfa\\xad\\xb2\\x95\\x04\\x41\\xc3\\x5f\\x72\\x76\\x18\\x9b\\xd1\\xb7\\xf8\\xf3\\xc2\\x8d\\x18\\x44\\x61\\x98\\x54\\x45\\xff\\x51\\x1b\\xf8\\x43\\x42\\x7a\\x10\\x2e\\x1f\\x38\\x2a\\x78\\x6b\\xfb\\x1c\\xd5\\xf3\\x65\\xe5\\xfb\\x71\\x86\\x89\\x92\\x22\\x07\\x22\\x36\\x77\\xbe\\x4d\\x9f\\x51\\x29\\xd8\\x8e\\x49\\xe1\\x61\\x2e\\x20\\x84\\xee\\x96\\xa4\\xc5\\x73\\x18\\x16\\x87\\xab\\x0d\\x3b\\xe6\\x0a\\x13\\x77\\x7a\\x55\\x62\\x0f\\x1a\\xfd\\xee\\x6e\\xc3\\x22\\x2a\\x95\\x2e\\xa2\\xbd\\x13\\xf7\\xa4\\x27\\x29\\x71\\xcf\\x2c\\xb3\\xa6\\x10\\xdb\\xe2\\xc6\\xf8\\xf0\\xc0\\x6f\\x5e\\xf8\\x77\\x23\\x23\\x01\\x78\\x84\\xea\\x4c\\x0a\\xfc\\x86\\x7b\\x9f\\xc0\\x09\\x68\\xfb\\x68\\x6d\\xb1\\x07\\xd2\\x97\\x62\\x20\\xa5\\xee\\xba\\x06\\xcc\\xd2\\x98\\xa3\\xc0\\x47\\xaa\\xc6\\xe2\\xc4\\x9f\\xb9\\x09\\xd3\\x53\\x35\\x3e\\x61\\xef\\xdd\\x64\\xd2\\xa5\\x5d\\xd5\\x5e\\xda\\x2c\\x46\\xd2\\x82\\xb0\\x90\\x71\\x0b\\x7b\\xa1\\x35\\x91\\x7a\\xaf\\x07\\x67\\x6e\\x1c\\x53\\xd2\\xb2\\xac\\x3a\\x46\\x34\\x15\\xc7\\x33\\x8a\\x9e\\x85\\x89\\xa1\\x88\\xa0\\x4f\\x66\\x86\\x32\\x6e\\x3b\\x9e\\xa4\\x16\\x39\\x62\\x9c\\x46\\xa8\\xc7\\x4f\\x62\\xb8\\x6c\\x49\\xc8\\xd1\\xa5\\x90\\x5d\\x5d\\x9d\\x8b\\xec\\x73\\xcd\\x71\\xd5\\x75\\x9d\\x53\\x6c\\x71\\x83\\x6e\\x63\\x6a\\xfe\\x1f\\x61\\x4b\\x86\\xc7\\x0d\\xa0\\x3d\\x84\\x46\\xdf\\x90\\x0f\\xae\\x3c\\xc8\\x81\\xa5\\xb1\\x9c\\x46\\x00\\x33\\xb8\\xcb\\xc4\\x3a\\x5b\\xc2\\x86\\x98\\x89\\x84\\x0c\\xc0\\x10\\x07\\xdb\\x45\\x37\\x1b\\x9d\\xea\\x31\\x91\\xe3\\x22\\x8e\\x35\\x8b\\x2c\\xbe\\x96\\x9c\\x3d\\xc0\\xac\\xbf\\xb9\\x7c\\x88\\x36\\x91\\xb8\\xac\\x12\\x08\\x25\\x07\\x67\\x92\\x82\\x2e\\xe6\\xd1\\x38\\xbd\\x6a\\x36\\x58\\xa3\\x25\\xc6\\xc1\\x8e\\x99\\x79\\x28\\xa2\\x12\\x85\\x30\\xcd\\x42\\x65\\xf7\\xca\\xa0\\x20\\x86\\xb6\\x48\\x15\\xbe\\x06\\x5a\\x69\\xf6\\x82\\x2b\\xab\\x61\\x15\\x1a\\xe8\\x8c\\xc3\\xc5\\xd4\\xe3\\x7c\\xa4\\x54\\x81\\xc9\\xe0\\x9f\\x7e\\x0c\\xe3\\x09\\x67\\xe4\\x3c\\x25\\xbd\\x06\\x1e\\x4e\\x74\\x54\\xdd\\xbb\\x31\\x8c\\x31\\x7a\\x86\\x41\\xba\\x8d\\xa9\\x35\\xfc\\x18\\xee\\xb1\\x85\\xb1\\xbb\\x88\\x19\\xb8\\xa9\\x5d\\x11\\xe7\\xe1\\xb1\\xc9\\xe6\\xb2\\x97\\xb4\\xf0\\xd8\\x9a\\xb0\\x60\\xcc\\x32\\x33\\xab\\x11\\x9b\\x86\\xf7\\x8e\\x70\\xb4\\x51\\x80\\x98\\x1a\\xcb\\xed\\x3b\\x62\\xed\\xa3\\x5c\\x1e\\x42\\xe5\\xc1\\xf5\\x1b\\x55\\x5b\\x62\\xf1\\x4d\\x13\\x75\\x2d\\x0b\\x83\\xef\\x3f\\xbe\\x93\\xbc\\x79\\xc5\\x36\\xe7\\x24\\x79\\x1b\\x5a\\x58\\xc1\\x96\\x0f\\x01\\x4f\\x90\\xfb\\x24\\x0c\\x3a\\x1f\\xdc\\xf9\\x24\\x0e\\x03\\xf0\\x13\\x16\\x55\\x30\\x8f\\xf9\\x70\\xdf\\xa6\\x52\\x20\\x34\\x50\\x9a\\x0c\\x91\\xea\\xc3\\x57\\x21\\x3f\\xf9\\x24\\x3b\\x9a\\x90\\x9b\\x63\\x6a\\xba\\x94\\x38\\x78\\xcf\\x1d\\x90\\x63\\x74\\x9d\\x04\\x12\\x79\\x8a\\x08\\x49\\x77\\x0c\\x00\\x2d\\x65\\x43\\xc6\\xc2\\xc1\\xba\\xc9\\xb7\\xaa\\x15\\x1e\\x7f\\x0a\\xe0\\xa2\\xee\\x98\\x23\\x52\\x00\\x57\\x37\\xad\\xfc\\x79\\xe1\\x5c\\x88\\x30\\xe7\\x21\\x5a\\xaa\\x8d\\x18\\x84\\x01\\x2b\\x44\\x16\\xb8\\xf2\\x03\\x77\\x2a\\xef\\x60\\xb2\\xa2\\x99\\x85\\x50\\x5a\\x62\\xdd\\x6b\\x4a\\x13\\xf1\\xe2\\xc5\\x8b\\x17\\xd0\\x64\\x9d\\x9d\\x16\\x74\\x3a\\xaf\\x29\\x83\\x04\\xff\\xbe\\xdd\\x72\\x20\\x0e\\xe5\\x81\\x15\\xf3\\xcf\\xe5\\x08\\xf9\\x71\\x9d\\xa6\\x38\\x73\\x89\\x24\\x8e\\x79\\x30\\x0e\\xa3\\x88\\x8d\\x13\\x93\\x41\\xbd\\xfa\\x88\\x5d\\xc1\\xcf\\x01\\x7e\\x10\\x75\\x3a\\x16\\x5b\\x38\\xf9\\xe4\\x68\\x6b\\x0c\\x1d\\xd8\\x76\\x90\\x68\\x0d\\x6a\\x05\\x28\\x17\\x13\\xb0\\x93\\x4c\\x8a\\x49\\x54\\x44\\xe6\\x49\\x3f\\x10\\x79\\xae\\xd1\\x72\\x8c\\x0f\\x89\\x08\\x5b\\xb0\\xb3\\xe9\\xb8\\xe0\\xe8\\x87\\x11\\xec\\xe0\\x2c\\xa0\\x81\\x9a\\x3b\\x9f\\x47\\xa1\\x3b\\x9e\\xa0\\x92\\x2f\\x83\\x3b\\xe2\\x1f\\xdc\\x68\\xd5\\xc2\\xcc\\x94\\x7e\\xb0\\x40\\x65\\x76\\x9d\\x76\\x6a\\x6c\\x59\\xf9\\x88\\xb8\\x8e\\xc3\\x21\\x34\\x38\\x66\\x0d\\x64\\xfe\\x22\\x36\\xc7\\x3b\\x1c\\xbe\\xde\\xc1\\xd7\\xeb\\xc4\\xf1\\x3f\\x55\\xc3\\xf4\\xa7\\xb8\\xa0\\x4b\\x8e\\x23\\xf4\\x67\\x49\\x08\\x31\\x43\\x0b\\xd5\\xb4\\xbb\\x8b\\xb9\\xc8\\x2b\\x54\\xa7\\x93\\xa2\\x25\\xb6\\x74\\xc7\\x89\\xdc\\x0d\\x42\\x1d\\x1a\\xf8\\x01\\x8b\\x71\\xfe\\x7c\\x22\\xe5\\x6c\\xba\\xe2\\x17\\x04\\xe6\\xd6\\x4c\\x8a\\x47\\x0a\\x08\\x3e\\x06\\xeb\\x04\\x97\\x17\\xe2\\xb4\\xc4\\x81\\x04\\x85\\x68\\x25\\x46\\x7f\\xcb\\xa9\\xb0\\x30\\xd1\\xe2\\x91\\x08\\x32\\x98\\xb4\\xba\\xec\\x73\\x73\\x69\\x17\\xe9\\x69\\xf1\\xe2\\x57\\x9f\\xf5\\x02\\xde\\xaf\\x19\\xd6\\xbd\\x3a\\xea\\x3a\\xd4\\x8f\\x7e\\xef\\xcd\\x39\\xcf\\x69\\x08\\x0d\\x58\\x7c\\xe2\\x35\\xca\\xf2\\xf9\\xac\\x15\\x48\\x7e\\xed\\x2c\\x35\\x47\\x57\\x45\\x5a\\x80\\x1b\\x3d\\x58\\x4c\\xa7\\x0e\\xf4\\x7f\\xef\\x3b\\x3b\\x5f\\xf9\\x86\\xdf\\xe5\\x1f\\xb7\\xbf\\x3a\\x8a\\x06\\x19\\x97\\x6f\\xdd\\x66\\xc4\\x6d\\x81\\x37\\x17\\x84\\x89\\xb8\\x5d\\x64\\x89\\x8b\\x0b\\x56\\x00\\x9c\\xa1\\x99\\x65\\xf9\\x2a\\x30\\xf1\\xf1\\x3a\\xcb\\xbf\\x1d\\x20\\x25\\x68\\x4b\\xda\\x3a\\x68\\x09\\xa9\\xce\\xc4\\x8d\\x0e\\x92\\x66\\xbf\\x85\\xb4\\x61\\x77\\x0d\\xc2\\x20\\xba\\x71\\x2e\\xc4\\x4a\\x52\\xf8\\x49\\x54\\x62\\xdd\\x34\\x2c\\xf2\\x11\\xbb\\x2e\\x72\\xf0\\xdc\\xd0\\xef\\x3a\\x6d\\x90\\x48\\xd3\\x33\\x83\\x21\\x3c\\x8a\\xc4\\xa6\\x8b\\xc4\\xa6\\xab\\x9b\\x7d\\xa0\\x56\\xb1\\x9a\\xbb\\xab\\x2a\\x53\\xc1\\x7a\\xbf\\xd8\\xe5\\xe9\\x95\\xa3\\x38\\x28\\x44\\x3a\\x75\\x60\\xb6\\xa9\\x2c\\x2d\\x40\\xab\\xb3\\xa2\\xe9\\x30\\x7f\\xab\\x33\\x49\\x7e\\xa2\\x35\\x49\\x7e\\xa2\\x8d\\xf0\\xab\\x83\\xdb\\xd7\\xc2\\xed\\x0b\\xb8\\x45\\x83\\xe2\\x27\\x5a\\x93\\xe4\\x27\\x5a\\x93\\x64\\x1d\\xdc\\x13\\x2d\\xdc\\x23\\x01\\xb7\\x68\\x7c\\xac\\x83\\x7b\\xa4\\x85\\x7b\\xa4\\x19\\x87\\xcd\\x24\\x7f\\x26\\xcd\\x06\\xae\\xf7\\xef\\x65\\x93\\x4c\\xc0\\xd0\\x8f\\x68\\x31\\x5d\\xd3\\x28\\x79\\xec\\x00\\x53\\xf2\\xa0\\xcf\\x1c\\x58\\x8e\\x8f\\x1d\\x58\\x4e\\x43\\x07\\x96\\x13\\xdf\\x81\\x15\\xff\\xba\\xe2\\x5f\\x57\\xfc\\xeb\\x17\\x8b\\xc8\\x6e\\xe4\\xc6\\xcc\\x41\\xd1\\xe9\\x4f\\xfc\\xd3\\x37\\x48\\x07\\x6b\\xda\\xbd\\x36\\x85\\xe1\\xf3\\x33\\xc7\\x6c\\xe4\\x0c\\x2d\\x9b\\x9d\\x48\\x66\\xcb\\xec\\x14\\x42\\xa8\\xff\\xd7\\xff\\xed\\xdb\\x1d\\x47\\xa5\\x89\\x6b\\x96\\x27\\xaf\\x66\\x58\\x91\\x92\\xc3\\x54\\x2e\\x38\\x3e\\x2a\\x19\\xf8\\x3d\\x04\\x63\\xba\\xa1\\xd6\\x6a\\xc2\\x48\\x9d\\xa3\\x7a\\x25\\x55\\x1a\\xab\\x92\\xa3\\x83\\xf4\\x9f\\x5a\\x8e\\xa5\\xbf\\x31\\x29\\x09\\x04\\xe2\\x2b\\xe1\\x55\\x95\\xbe\\x5e\\x8e\\xab\\x4d\\x2c\\xbb\\x63\\x61\\xc1\\x3c\\x14\\xd6\\xd5\\x66\\x83\\x11\\xa8\\x1d\\x65\\x82\\x5c\\x6d\\xcc\\x16\\xee\\xe5\\xc1\\xd3\\xda\\x28\\xe7\\x22\\xe1\\xd7\\x48\\xfa\\x96\\x33\\x55\\xae\\x66\\xf4\\xd4\\xbe\\xd7\\x48\\xcb\\x52\\x44\\xb8\\x5f\\xc4\\xb4\\x6f\\x47\\xb1\\x76\\xae\\x21\\xe1\\xd5\\xdb\\xaf\\x11\\x4b\\x61\\x55\\x27\\x63\\x9f\\xed\\xb8\\xab\\x92\\x50\\xaf\\xe7\\x2f\\x9c\\x17\\x53\\x2e\\x8b\\x01\\x31\\xdb\\xca\\x8f\\xab\\xc2\\x8f\\x06\\x53\\x68\\x65\\x25\\xe9\\x7e\\x5f\\x8e\\x8f\\xab\\x6d\\x59\\x57\\x58\\xa8\\x86\\x35\\xeb\\x61\\x10\\x2f\\x22\\xc6\\xb7\\xd7\\x3c\\xf4\\x83\\x04\\x6d\\xa5\\x55\\x8b\\x56\\xdc\\xc0\\xbc\\xc9\\x24\\x04\\xce\\x26\\x56\\x9a\\xb2\\xf2\\xb2\\xaf\\xb0\\xfd\\x16\\x7c\\x19\\x6b\\x23\\x47\\x7c\\x19\\x3b\\x22\\xfe\\xc3\\xb1\\x23\\xba\\x43\\x44\\x1a\\x3f\\xfa\\x66\\x64\\x85\\x1c\\xdf\\x27\\x2b\\xed\\xf4\\x1a\\x87\\x78\\xde\\xfb\\xc9\\xc4\\x96\\x5d\\x49\\xcd\\xaa\\x74\\x8c\\x76\\xa8\\xc7\\x0e\\x21\\x78\\x71\\xf9\\x12\\xfc\\x4e\\xe7\\x25\\x7c\\xc9\\xe5\\x2f\\xd7\\x42\\xe1\\x27\\x04\\xd8\\x6c\\x51\\xe5\\xe1\\x01\\x43\\xf8\\xf8\\xbf\\x3f\\x9c\\xdb\\x72\\x37\\x64\\x18\\xad\\xc6\\xc7\\x2f\\xa1\\xd3\\xc1\\xec\\xef\\x7d\\xbb\\x4c\\x6c\\x6c\\x5f\\xfb\\x2b\\xf4\\xc7\\x5d\\x61\\x30\\x86\\x1f\\x53\\x64\\x2c\\xe5\\x27\\x7e\\x5a\\xbe\\x97\\x21\\xff\\x60\\x15\\xf9\\x65\\xc9\\xde\\x70\\x06\\x29\\x77\\x74\\x1b\\x6e\\x29\\xf4\\x84\\x5f\\x2d\\xd4\\x5b\\x22\\x96\\x68\\x1b\\x7c\\x5b\\x0f\\x4f\\xac\\x35\\xa1\\xd9\\xbb\\xb8\\x2d\\xe3\\x6a\\xab\\xc7\\x39\\x74\\xde\\xcf\\x27\\xd8\\x6e\\x1b\\xe1\\x3c\\xe1\\x23\\x55\\xd1\\x1c\\x0d\\xe5\\x34\\x4c\\x2b\\x36\\xa1\\x09\\x33\\x05\\x5d\\x4c\\xd0\\xa1\\x7c\\x69\\xc3\\x17\\x8a\\x5b\\x01\\x16\\x93\\x79\\x10\\x93\\xd8\\x44\\xa0\\x3d\\x5a\\x51\\x68\\xd8\\x82\\x2d\\xcc\\x0a\\x5d\\xc3\\xd7\\x02\\xfb\\x49\\x45\\xa6\\x4e\\xde\\x3a\\x65\\x4b\\xe3\\xa0\\x7f\\x44\\xd0\\x1b\\xa9\\x08\\xa8\\x1b\\x43\\x53\\x37\\x2c\\xe6\\x7a\\x63\\xdb\\xd4\\xb7\\xdb\\x26\\x3b\\xea\\xaa\\x63\\xe2\\x4b\\x1a\\x31\\x63\\x23\\xeb\\x9f\\x9c\\x15\\x34\\xa7\\x3e\\xdf\\x68\\x04\\xfd\\xc7\\x9a\\x06\\xc6\\x9e\\xce\\xae\\xda\\x62\\x1e\\x98\\xb7\\x94\\xf2\\xaf\\x20\\x9a\\xa1\\x75\\x4e\\x85\\x0d\\x60\\xec\\x29\\xd6\\x7b\\x1f\\x4b\\x2d\\x2a\\x26\\x7c\\x83\\x3f\\xd5\\x0e\\x30\\x09\\xdf\\x22\\x02\\xcd\\x16\\x64\\x06\\xda\\x05\\x4b\\x9d\\xd8\\x2b\\x98\\xf6\\x68\\x2b\\x95\\x0c\\x82\\x6c\\xd5\\xd6\\x35\\x03\\x34\\x56\\x5d\\xdf\\x12\\x50\\x82\\xca\\x5f\\x7d\\x62\\x6f\\x73\\x63\\x40\\x5d\\x05\\xb4\\x6f\\x8f\\x3d\\xd5\\x16\\x30\\x67\\x8f\\xc7\\xdb\\x1b\\x48\\x63\\xc0\\xe7\\x8e\\x62\\x82\\xde\\x40\\x55\\x3c\\x56\\xda\\xe3\\x10\\x8c\\x24\\x37\\x9a\\x51\\x86\\x75\\x53\\x13\\x8a\\xc9\\xdf\\xf3\\xda\\x26\\x7f\\x56\\xe3\\xa9\\xd8\\x83\\x7d\\xc5\\x32\\x31\\x1d\\xb3\\xbd\\x6f\\xb5\\xf9\\x8b\\x49\\x2d\\x17\\xb1\\x79\\xc4\\x62\\x16\\x24\\xda\\xac\\x29\\x6a\\xf8\\xe1\\x40\\x6b\\x40\\xc5\\xf9\\x27\\x15\\x7e\\x9a\\x9f\\x16\\xb7\\x73\\xbe\\xc3\\x49\\x08\\xde\\x1c\\xae\\xfc\\x25\\xf3\\xcc\\xf9\\xc1\\xff\\xfb\\xdb\\xf1\\x16\\x54\\xdd\\xeb\\x1b\\xe6\\x56\\x00\\xa8\\x32\\x08\\x2e\\x56\\x5f\\x7f\\x63\\xdb\\xea\\x6f\\xb2\\xbb\\x15\\x78\\x6b\\xd9\\xfb\\xca\\x10\\xff\\xfc\\xfc\\x4a\\x9a\\x15\\x22\\x07\\x6f\\xae\\xfa\\x77\\x18\\xad\\x7c\\x5f\\xe0\\x4e\\x13\\x16\\xbc\\x03\\xbe\\x4f\\x50\\xec\\xcc\\x77\\x26\\xff\\xed\\x4f\\xdf\\x34\\xb8\\xdc\\x3b\\x78\\xf9\\xc8\\x36\\x8d\\x1c\\x72\\xb5\\x11\\xf3\\xee\\xf8\\xfe\\x67\\xe3\\x49\\x98\\xb0\\x3d\\x70\\x63\\xba\\x55\\xfc\\xcd\\xbd\\x73\\x3f\\x8e\\x23\\x7f\\x9e\\x34\\x62\\xe9\\x27\\x91\\xac\\xe6\\xcc\\x81\\x66\\xa7\\xdf\\xea\\x26\\xe1\\x3b\\x8e\\x14\\xbf\\x36\\xf8\\x31\\x34\\xfa\\x8d\\x9c\\x0d\\xdc\\x68\\x91\\x00\\xeb\\x5e\\x77\\x79\\xd9\\x6e\\xbf\\xdf\\xef\\x0f\\x4a\\x35\\x3a\\xfd\\xc6\\xff\\xb0\\x0d\\x4e\\xe8\\x6f\\xb4\\xb5\\x0d\\x55\\xab\\x37\\xb5\\xac\\xb8\\xfe\\x76\\xd6\\xd7\\xdc\\x64\\x23\\x23\\xa4\\x6f\\xde\\xc2\\x35\\xb7\\xea\\x96\\xcd\\x40\\x75\\xbf\\x6c\\x84\\x9f\\xdb\\xcb\\x5b\\x5a\\x33\\xb9\\x7f\\xd9\\x5e\\x66\\xb9\\x43\\x50\\xec\\xd7\\x59\\x79\\x83\\xd2\\x26\\xcf\\xaf\\x0d\\x32\\x7d\\xa7\\x11\\x4c\\x8a\\xd6\\xa4\\x1c\\xa3\\x79\\x14\\xce\\x59\\x94\\xf8\\x79\\xe3\\x7a\\x61\\x33\\xf7\\xee\\xf4\\xc3\\xfb\\x83\\x73\\x08\\x47\\x37\\x6c\\x9c\\x40\\x33\\x66\\x4c\\xf1\\x46\\x1c\\x87\\xc1\\x95\\x7f\\xdd\\x32\\xad\\x74\\x51\\x77\\xa8\\xce\\xed\\x13\\xfa\\x4f\\xa0\\xf8\\x91\\xcd\\xdd\\xc8\\x4d\\xc2\\x08\\xf6\\xa0\\xd1\\xcd\\xef\\x7c\\x7c\\xae\\xa3\\x70\\x31\\xcf\\x95\\x72\\x8c\\xa5\\xfc\\x2f\\x0c\\xf6\\x60\\xbb\\xfc\\x73\\xcc\\xc6\\x21\\x6a\\xf6\\x7f\\x56\\xca\\xf5\\xcb\\xe5\\xae\\x22\\x17\\x97\\xe5\\xcf\\xa5\\x46\\x3f\\x2d\\x0f\\xfa\\x0d\\x07\\x44\\x4c\\xbf\\x30\\xe8\\xa0\\x52\\x89\\x8f\\x61\\x3c\\x77\\xc7\\xac\\x02\\x92\\x68\\x50\\x2d\\xf5\\xf5\\xe5\\xff\\x30\\x8a\\x45\\x1b\\x70\\x33\\x92\\x65\\xa8\\x5b\\x83\\x66\\xc9\\x9a\\x1b\\x10\\x2d\\x7d\\xd5\\x8d\\xa8\\x16\\x82\\x5a\\xdb\\xd3\\x28\\x4e\\x30\\xf5\\xd9\\x26\\x94\\x6b\\xf0\\x2d\\x94\\xcb\\x6c\\x89\\x43\\x06\\x0e\\x94\\xb3\\xc5\\x26\\x68\\xa0\\xb4\\x04\\x56\\x59\\x89\\x1b\\xf1\\xce\\xc5\\x49\\xd4\\x8d\\xe7\\x53\\x3f\\x69\\x36\\xba\\x8d\\x96\\xbd\\xc6\\xf5\\x00\\x86\\xd0\\x26\\x92\\xd0\\x4d\\x37\\x6c\\x45\\x9d\\x2d\\xa5\\x4e\\x79\\x17\\x57\\x54\\xce\\xef\\xe2\\x21\\xe4\\xda\\x96\\xef\\xed\\x30\\xfc\\x20\\x39\\x73\\xd1\\x40\\xde\\x8d\\xa2\\x8b\\xfe\\xa5\\xbd\\xb4\\xdc\\xf5\\x4a\\x95\\x41\\x45\\x15\\x99\\x53\\x28\\x4b\\x15\\x54\\x89\\x50\\x7a\\xd7\\xa5\\xba\\xfb\\x12\\xc9\\xcc\\x70\\x60\\x4f\\xbe\\xb2\\xc3\\x9a\\x32\\x7e\\xff\\x4d\\x21\\xda\\x65\\xdd\\x20\\xd6\\xcf\\xf5\\x56\\x0b\\x65\\xae\\xd7\\x03\\x87\\xa6\\xf4\\x7a\\xcb\\xa1\\x79\\xf2\\x1d\\x84\\xd8\\x31\\x8b\\xa0\\x25\\x0c\\x5e\\xf1\\x35\\x19\\xac\\xf3\\x1a\\x75\\xe2\\x7a\\xf0\\x26\\x79\\xd9\\x1f\\x79\\xdd\\x87\\x07\\xb8\\xae\\x30\\x2c\\xc9\\x26\\x2e\\xeb\\x5f\\xbc\\x18\\xc5\\x49\\x84\\x16\\x83\\x7e\\xa5\\x61\\x90\\x34\\xb1\\xf4\\xe1\\x15\\x6f\\x98\\x7f\\x68\\xf3\\x5e\\xd7\\x52\\x13\\xc9\\xd6\\x79\\x8d\\xfc\\x2a\\x6c\\x6b\\xf0\\xf1\\x71\\x24\\x2b\\x8c\\x1e\\x2a\\x8c\\x1d\\x68\\x58\\xb7\\xc4\\x58\\xd6\\x6c\\x1f\\xd7\\x8b\\x5f\\xd1\\x30\\x87\\x8c\\x2b\\xad\\xa5\\x0c\\x6a\\xa3\\xd3\\x20\\x50\\xfc\\xfb\\x46\\x32\\x52\\x41\\x1d\\x95\\x1d\\x63\\xc5\\x62\\x3f\\xeb\\x93\\xdc\\xc7\\x25\\x16\\x82\\x24\\xcc\\x39\\x9a\\x51\\x3e\\x87\\xab\\xbc\\x9d\\x54\\x8c\\xba\\x11\\xc3\\xa3\\x8a\\x12\\x52\\x7e\\x60\\xd7\\x87\\xcb\\x79\\x13\\x1a\\x9f\\x3e\\x79\\xbf\\xf3\\xee\\x5f\\x6f\\x41\\x1b\\x1a\\x5f\\x3f\\x7d\\xfa\\xa9\\xe1\\x40\\xe3\\xba\\x01\\x15\\x14\\x90\\x3f\\x8d\\xbf\\x3c\\x6e\\x64\\x5d\\x30\\x30\\x1c\\x55\\x7e\\x55\\x39\\x3a\\x53\\x55\\xd8\\x3a\\x49\\x76\\xc1\\x6f\\x9c\\x68\\x4c\\x87\\x37\\xe0\\x81\\x49\\xc3\\x54\\x9b\\x13\\x76\\x63\\x5e\\xd5\\x9f\\xcd\\xa7\\x2c\\xed\\x2a\\xde\\x24\\xd5\\x36\\xb2\\xf3\\x9f\\x5f\\x29\\x19\\x0d\\x1c\\x86\\x98\\xce\\x7e\\xf0\\x58\\x10\\xce\\xfc\\x80\\xff\\x44\\xb1\\x5b\\x95\\x17\\xa9\\xa9\\x96\\x0b\\xf3\\x30\\xf6\\x13\\xff\\x2e\\x9f\\xfd\\x54\\x44\\x8b\\x12\\x48\\x9a\\x33\\x63\\xc5\\x73\\x36\\xf6\\xaf\\x7c\\xe6\\xa5\\xd2\\xe8\\x5c\\xab\\x47\\x57\\x99\\x9c\\x5a\\x85\\xaf\\x62\\xe2\\x13\\x1b\\x95\\x42\\x22\\xb7\\x4f\\x1d\\xae\\x14\\x2f\\xe7\\x9e\\xc5\\x89\\xc0\\x2b\\x60\\x63\\x16\\xc7\\x6e\\xb4\\x82\\x24\\xcc\\x89\\xc9\\xe4\\x58\\xab\\xb1\\x09\\xd0\\xfa\\x2d\\x67\\x17\\x9c\\xe7\\x3c\\x67\\x99\\x40\\xfb\\x81\\x66\\xee\\x21\\x9d\\x94\\xd4\\x09\\x16\\xe3\\x12\\xe0\\x40\\xbf\\xca\\x6c\\x11\\x70\\x70\\x75\\xfd\\xb7\\x30\\x94\\x62\\x62\\x9b\\x2d\\x5e\\x31\\xd7\\xdb\\x12\\x7b\\x37\\x2b\\x8b\\x9d\\x2d\\xd5\\x0b\\x2c\\x5e\\xa1\\xb2\\x81\\xc5\\x93\\xcb\\x4c\\x65\\xf2\\x66\\x9e\\x8d\\xbd\\x73\\xa3\\xc8\\x01\\xaf\\xef\\x80\\xb7\\x85\\x26\\x34\\x6c\\x39\\x47\\xef\\xb8\\xa0\\xef\\x54\\x04\\xe7\\xbd\\x85\\xa1\\xf0\\xf4\\xfd\\x63\\x4d\\x64\\xbc\\x92\\x74\\xfb\\xf4\\xe4\\xd0\\x42\\xa3\\x02\\x7e\\x9c\\x7b\\xfd\\x35\\x6b\\x79\\xbc\\x56\\xa0\\xaf\\x65\\xe3\\x43\\x67\\x5e\\xca\\x0a\\xdb\\x8e\\x54\\xe1\\x12\\x3d\\x24\\x8f\\x68\\xf3\\x51\\x53\\x16\\xe5\\xcf\\x3c\\xcb\\xc9\\x96\\x82\\xbd\\xad\\xe2\\x55\\x1e\\x91\\xaa\\x36\\xa0\\xb4\\x9f\\xcd\\x16\\xb4\\x30\\x80\\x68\\x77\\x9a\\x60\\x17\\xeb\\xa5\\xca\\x90\\xe1\\x5e\\xaa\\x59\\x07\\x11\\x10\\x66\\x6b\\xab\\xfa\\x2c\\xe1\\x4f\\xa3\\xb8\\xfa\\x1b\\x78\\x0c\\xde\\xc2\\x3e\\x34\\xd4\\x8d\\xd0\\xe0\\xb7\\xd8\\xfc\\xc6\\xe2\\xe7\\x15\\x9f\\x85\\x6f\\x63\\x3c\\x7a\\xbd\\xa2\\xd7\\xfa\\x5e\\x55\\xf9\\xa3\\x2b\\xde\\x6c\\x2e\\xff\\x6c\\x18\\x74\\x7c\\x85\\xbe\\x08\\xdd\\x06\\xf8\\xe8\\xcd\\xaf\\x50\\x74\\x4e\\x77\\x16\\x31\\x83\\x2a\\x93\\xd5\\x19\\x5f\\xfb\\x8f\\x6e\\x85\\x09\\x2d\\xff\\x2f\\xd3\\x71\\x04\\x32\\xe6\\xc2\\x00\\x5a\\xdd\\xeb\\x84\\xd1\\x34\\xee\\x43\\x20\\xae\\x51\\xdf\\x29\\x63\\x51\\x6a\\x5e\\x94\\x25\\xbe\\xea\\x26\\xd2\\x89\\xc5\\xa4\\x62\\x2a\\xb9\\x13\\x2e\\xc7\\xb5\\xb2\\x13\\xf9\\xc2\\x43\\x53\\x4f\\x7b\\xf3\\xb5\\xc4\\xd0\\x63\\xec\\x04\\x0a\\x9d\\x90\\x5a\\x99\\xcd\\xfc\\x00\\x49\\x78\\x71\\x51\\x25\\x13\\x37\\x3b\\x9f\\x54\\x05\\x6d\\xf9\\x48\\x51\\x1e\\xc6\\xc9\\x09\\x5a\\x1b\\xc5\\x59\\xcc\\xa0\\x65\\x97\\x99\\x23\\x07\\x79\\x22\\x85\\x28\\x9c\\x9d\\xfe\\xe3\\xe3\\x6f\\xe7\\x87\\x27\\x17\\xd0\\xe4\\x84\\x15\\x9d\\xae\\x7e\\x54\\xed\\x82\\xc8\\x15\\x5d\\x89\\x30\\xc4\\x4b\\xed\\xe1\\x5f\\x83\\x0d\\x14\\x2d\\x89\\x99\\x47\\xbb\\x77\\x3c\\x9b\\x37\\x3d\\xcc\\x76\\x8d\\xc9\\xb6\\x98\\xf8\\xe4\\xf1\\x35\\x30\\x90\\xfa\\x2f\\x7d\\xaf\\x10\\x1d\\x11\\x49\\x4c\\xdf\\x94\\x0c\\x33\\x26\\xbc\\x25\\xcd\\x51\\x92\\xf2\\x04\\xcb\\x18\\x85\\xa4\\xd7\\x23\\x02\\x8b\\xa4\\x56\\x1f\\xe1\\x2c\\xe8\\xcb\\xa1\\x33\\x59\\x9e\\xa8\\x3e\\x63\\x75\\x82\\x56\\x07\\x0e\\x78\\xe6\\x9c\\xff\\xf2\\xf1\\xb6\\xf0\\xcc\\x10\\x2e\\x63\\x32\\x2a\\xb5\\x37\\xb0\\x06\\x21\\xa4\\xa8\\x2a\\x5b\\x38\\x09\\xfc\\x90\\x45\\xb7\\xd2\\x56\\x95\\xa1\\xb6\\x47\\x43\\x60\\x29\\x80\\xe7\\x97\\x21\\x08\\x2e\\xc8\\x03\\x2e\\x28\\x22\\x4b\\x7d\\xc0\\x59\\xb7\\xe0\\x4c\\x13\\x60\\x01\\x8e\\xa7\\x6d\\x31\\x3c\\xb7\\x18\\x9f\\x0a\\xd0\\x16\\xc8\\x06\\xe2\\x42\\x60\\xf9\\x34\\xcd\\x3c\\xd1\\xa6\\xd7\\x6f\\x39\\xe0\\x0d\\xec\\x53\\x46\\xe7\\xb4\\x1c\\x01\\x6f\\x4b\\xa0\\x19\\x98\\xe7\\x8b\\x46\\xbd\\x54\\xc3\\x32\\xc3\\x41\\x9f\\x8c\\x42\\x07\\xdd\\x18\\x2c\\x76\\x78\\x0c\\x9e\\x0c\\x61\\xab\\x7e\\xea\\xb5\\xf4\\x26\\xe0\\xc7\\x30\\x9e\\x86\\x31\\x05\\xb6\\x5b\\x72\\x86\\xab\\xe7\\x61\\xf2\\xe3\\x60\\xd0\\xf3\\x06\\x5a\\x70\\x24\\xad\\xa2\\x65\\x3d\\xa0\\x51\\x62\\x05\\x0b\\x7b\\x68\\x89\\x71\\x5c\\xb6\\xba\\xee\\x28\\x6e\\xb6\\x70\\x75\\x9a\\x67\\x1b\\x61\\xf5\\x89\\x03\\xac\\x84\\x85\\x04\\x4b\\x8f\\x1a\\xe0\\xad\\xf3\\x82\\x0f\\x57\\x76\\x3a\\x70\\x14\\x95\\xaf\\x70\\x69\\xac\\xba\\xc7\\xab\\xf6\\xf3\\x55\\xfb\\xb9\\xaa\\x86\\x11\\xce\\x68\\x14\\x5b\\x1a\\x7c\\x59\\xc5\\xb1\\xe5\\x46\\xdf\\x74\\x0b\\xb4\\xdd\\xf4\\xc6\\x61\\x70\\xc7\\xa2\\x44\\xda\\xf3\\x88\\x7b\\xca\\x3c\\xf2\\x67\\x78\\x21\\xab\\xb4\\x7b\\x0f\\x05\\x9c\\x75\\x22\\xc6\\x5b\\xd2\\x62\\x64\\xf6\\x9c\\x78\\xf5\\x9b\\xb8\\xb1\\xf4\\xa6\\x44\\x8b\\x22\\x6b\\x8a\\x99\\xf6\\x92\\x1f\\x2c\\x4d\\x8c\\x33\\xbf\\x8f\\x7f\\x9f\\x60\\xa4\\x14\\x91\\xbe\\x72\\xf3\\xf1\\x73\\x37\\x34\\x94\\xe2\\x7c\\x64\\x1a\\xf1\\x88\\x0e\\xfb\\x20\\xa7\\x23\\x38\\xba\\x82\\x40\\x4d\\x93\\x2e\\x78\\xae\\x8d\\x83\\x8d\\x70\\x80\\x67\\xa7\\xff\\xf8\\xed\\xec\\xc3\\xe1\\x9b\\xa3\\x8f\\x47\\xa7\\x27\\xf2\\x62\\xdb\\x97\\xec\\x5c\\x12\\x16\\x0a\\x68\\xac\\x38\\x4c\\x57\\xc6\\x40\\x17\\x8e\\xe9\\x45\\xbf\\xff\\x6c\\xf0\\xe2\\xc5\\xd6\\xee\\xce\\xb3\\x9d\\xfe\\x8b\\x17\\x5b\\xbc\\x85\\xd2\\x3b\\xbd\\x86\\xa4\\x79\\xc6\\xa2\\xab\\x30\\x9a\\xc5\\xb0\\xbb\\x03\\xd3\\x30\\x9c\\x67\\x8e\\x93\\x31\\x9e\\x95\\x01\\x1f\\xd4\\x22\\xb0\\x6e\\xcb\\x74\\xa3\\x9d\\x87\\xf7\\xcd\\x56\\xe6\\x59\\x5c\\xba\\xc3\\x06\\x85\\x2b\\x6c\\xa1\\x7c\\xe1\\xd2\\x1a\\xd4\\xb8\\xb3\\x9e\\xe1\\x9c\\x0e\\xe1\\xac\\x3b\\x0f\\xef\\x73\\x5b\\x20\\xb0\\xed\\x81\\x5b\\x07\\x2c\\x69\\x86\\x7d\\x18\\xc2\\xcc\\x4d\\x26\\x94\\xf6\\x83\\x22\\x64\\xc1\\x3e\\x74\\x38\\x73\\xdc\\x0e\\x6c\\x12\\xae\\xea\\xbd\\x85\\xe1\\x3b\\x14\\xab\\x7d\\x19\\xc7\\x83\\xa3\\xef\\x5f\\x65\\x63\\x51\\x88\\x8c\\x65\\xcb\\x12\\xa3\\x6a\\x50\\x82\\x9a\\xb1\\x9f\\xb6\\xb6\\x1d\\x68\\xc8\\xc6\\x1a\\xd0\\x82\\xc7\\x8f\\x8d\\x9d\\xc2\\x26\\xde\\xe1\\x25\\x85\\x8f\\xea\\xc3\\x03\\xf8\\xba\\x10\\x4a\\x18\\x79\\x25\\x80\\x1e\\x45\\xf1\\xb0\\x04\\x70\\xe3\\xcf\\xdc\\x8d\\x62\\xf6\\x6e\\x1a\\xba\\x09\\x07\\xc9\\xef\\xc0\\xe8\\x79\\xd1\\x24\\x5f\\x28\\x4e\\x2e\\xaa\\x02\\xc9\\x69\\x23\\xc1\\xc8\\xa1\\x6c\\x42\\x9b\\x1f\\x8a\\x66\\x96\\xc3\\x1c\\x44\\x42\\xb8\\x0a\\xf2\\x3d\\xc9\\xdc\\xf1\\x84\\xae\\x22\\xfe\\xd8\\xc7\\x4c\\x6d\\x28\\xc3\\x43\\x32\\x2d\\x78\\xf9\\xf0\\x0a\\x6e\\x45\\xa8\\x08\\x2c\\x2d\\xd3\\x7e\\x8c\\x49\\x6f\\xcd\\x3e\\x2f\\xdc\\x84\\xe9\\xdd\\xb4\\x7b\\x3d\\x24\\x4c\\x59\\x73\\x1a\\x83\\xcd\\x12\\xb1\\x68\\xc3\\xc5\\xd6\\x73\\x07\\x76\\x06\\x97\\x0e\\xe5\\x19\\x21\\x5f\\xcc\\x54\\x8e\\x67\\x6a\\x49\\x5e\\x6a\\xc2\\x2b\\xd8\\x7a\\x0e\\xd7\\x0b\\x37\\xf2\\x64\\x1b\\x11\\x4b\\x5c\\x3f\\x60\\x5e\\x17\\x9a\\xbf\\x20\\x29\\x6a\\xc3\\xa0\\xbb\\x2b\\x82\\x4f\\x5c\\x73\\x9a\\x78\\xf1\\xc2\\x81\\xad\\xc1\\x65\\xae\\x5a\\x57\\x2f\\x72\\xbd\\xa5\\x7b\\x8b\\x82\\xf1\\x3e\\x6e\\xa5\\x31\\xf3\\xa7\\xcd\\xc2\\x2f\\x3d\\xf5\\xea\\xb2\\x85\\xf7\\x8d\\xda\\xa9\\xb9\\x2d\\x82\\x95\\x7c\\x5c\\x08\\x3b\\xff\\xed\\x53\\xd0\\x97\\x2a\\xbf\\x1c\\x74\\x77\\x21\\x9e\\xaf\\xca\\x2f\\x33\\x4b\\x7f\\x54\\xc9\\xcb\\xa7\\xc5\\xf1\\x8a\\xbe\\xea\\xa6\\x41\\x65\\x5f\\xc3\\x2d\\xb4\\xd4\\x17\\x28\\xa1\\x31\\x81\\xb0\\xc8\\x26\\x0a\\x84\\xcc\\xa7\\xb8\\x37\\x15\\x77\\x92\\x47\\x7e\\x86\\xba\\x95\\xd0\\x2d\\x6b\\x0c\\x49\\xd6\\x3f\\x91\\x0a\\x6a\\x59\\xec\\xe6\\xb2\\x46\\x37\\x6d\\xd2\\x85\\x40\\x84\\x3c\\xe7\\x93\\x74\\x7a\\x72\\xd8\\xe5\\x4c\\xa9\\x29\\x7d\\x85\\x20\\x1a\\xb7\\x99\\xb9\\xe7\\xca\\xc9\\x2f\\xca\\x12\\x13\\x0b\\x7b\\x3a\\x5f\\x9e\\x3f\\xd2\\x06\\x46\\xb1\\xee\\xd6\\x5a\\x71\\xab\\x8d\\xe8\\x8d\\xd6\\x4a\\x26\\x31\\x28\\x82\\x8f\\x51\\xe6\\x91\\x0f\\xec\\x51\\x0c\\xd8\\x9b\\x63\\x36\\x14\\xb1\\x7a\\x41\\x96\\x2e\\x25\\x51\\x18\\x43\\x3b\\x17\\xcb\\xcd\\x60\\xc0\\x23\\x1c\\xc7\\x73\\x81\\x6c\\x9e\\x54\\x05\\x0b\\xfc\\x9f\\x62\\x69\\x7e\\xa6\\x44\\xd9\\x5e\\xcf\\x6e\\x5c\\x5f\\xb3\\xda\\x4c\\x5d\\xad\\xb7\\xbe\\x55\\x88\\xb9\\xf6\\x26\\x86\\x21\\x67\\x4a\\xfc\\xf3\\xfa\\x86\\xe7\\x5a\\x93\\xb6\\xd8\\x33\\x19\\x86\\xa8\\x66\\xe5\\x5b\\x3b\\x05\\xb3\\x72\\xcb\\x95\\x92\\xec\\xcc\\xf3\\xa6\\x21\\x3b\\xff\\x02\\xa3\\x36\\x74\\xd0\\x19\\xa1\\x31\\x29\\x7e\\x1c\\xa0\\x13\\xe4\\x08\\xfc\\xbc\\xb5\\x99\\x30\\x28\\x25\\x85\\x19\\x16\\xf4\\x63\\x55\\x25\\x86\\xab\\x91\\xc2\\xb4\\x10\\x14\\xa7\\xde\\x7d\\x25\\xd7\\x8d\\x12\\x61\\xc8\\x9a\\x2a\\x68\\xe0\\x48\\x22\\x9a\\xeb\\xcb\\xc4\\x8d\\x15\\x65\\x61\\xba\\x83\\xd5\\x06\\x50\\x4e\\xea\\xc7\\x99\\x86\\x30\\x8c\\xe0\\x1a\\x63\\x66\\x45\\x44\\x78\\xce\\x4f\\xf9\\xa5\\xfb\\xb7\\xb3\\xd3\\x8f\\x38\\x20\\x6e\\x76\\xf9\\x4a\\xb9\\x5f\\xb5\\x6e\\x4a\\xb1\\xd4\\x46\\x04\\x8c\\x93\\xc3\\x9f\\x1d\\xb9\\x96\\xd6\\xa2\\x26\\xa3\\x4b\\xcd\\x55\\x0a\\xaf\\x4e\\x4f\\x77\\x6a\\x6d\\xfa\\x54\\xb6\\x80\\x63\\x57\\xda\\x76\\xa3\\xd2\\xae\\xcb\\x57\\x28\\xec\\xb4\\x51\\x8d\\x8d\\x26\\x62\\x7c\\xa9\\xbb\\x6c\\x54\\x61\\x7a\\x65\\x51\\x73\\x55\\xaa\\xd6\\x62\\x8a\\x71\\x64\\x0f\\x3d\\x19\\x74\\x99\\xcd\\xd3\\x32\\x97\\xfd\\xd2\\xe2\\x48\\xce\\x30\\x10\\x56\\xaa\\x06\\xb3\\x72\\x13\\x71\\x15\\xb7\\x46\\x46\\x15\\x0d\\xd9\\xba\\x25\\x8e\\x20\\xa8\\x71\\xca\\x38\\x0f\\x21\\xaa\\xa2\\x5d\\x87\\x56\\xef\\x2f\\x9f\\x5a\\x3e\\xc9\\x02\\xda\\x89\\x7b\\x62\\xc1\\xc1\\xa0\\x4e\\xa9\\x82\\x4f\\xb0\\x0b\\x41\\xc1\\x02\\xce\\x75\\x56\\xa9\\xf2\\x46\\x46\\xc7\\x9a\\x91\\x03\\x5b\\x0e\\x3c\\xdd\\x71\\x60\\x6b\\xd7\\x81\\x06\\x5f\\xa7\\x8d\\x8a\\x5b\\x58\\x86\\x0a\\x83\\x57\\x43\\x65\\x57\\x52\\x44\\xc5\\xd7\\x43\\x65\\xb3\\x5b\\x81\\x00\\x92\\xeb\\xbc\\xd7\\x04\\xae\\x60\\xa8\\xb2\\x56\\x01\\x14\\x00\\x0a\\xb3\\x6a\\xcc\\xab\\x93\\x55\\xfc\\x2e\\x13\\x28\\xe4\\x73\\x3f\\xb9\\x31\\x6b\\x1a\\xda\\x71\\x60\\xc4\\xcf\\x19\\x07\\x29\\x72\\x6c\\x6d\\xb7\\x32\\xbc\\xa4\\x08\\x62\\x1a\\xc8\\x38\\x7d\\xb5\\xd6\\xe4\\x1f\\x6c\\xc2\\xb2\\x79\\x84\\x0f\\x11\\x77\\x47\\xc8\\x36\\xef\\x27\\xe1\\x34\\x6f\\x61\\x52\\x4a\\xe8\\xa2\\xa5\\x7d\\x29\\x94\\xa1\\xfc\\x56\\x4b\\xda\\x99\\x0f\\x34\\xa3\\xf1\\x71\\x73\\x72\\xe1\\xe7\\xb5\\x0a\\x03\\x1c\\xa6\\x9a\\xe3\\xc4\\xef\\xeb\\xb4\\x17\\x1d\\x74\\xd9\\xf0\\x42\\x3a\\x18\\xc6\\x63\\x36\\x4f\\xe4\\x31\\x2b\\x03\\x6e\\x57\\x75\\x1a\\x87\\xf4\\xf4\\x8a\\xba\\x1c\\xfe\\xed\\xe3\\xe9\\xc9\\x3a\\x7d\\xc6\\x7e\\xd9\\x34\\xad\\xfa\\xe9\\xef\\xc1\\xc1\\xd4\\x77\\x63\\x46\\xd2\\xbf\\x9f\\xfc\\x6b\\x69\\x7b\\x3d\\x63\\xc9\\x24\\xf4\\x34\\x6e\\xf1\\xbd\\x9e\\xcc\\x02\\x49\\x69\\x21\\x5f\\xaa\\xc0\\xe8\\x27\\xe2\\x5a\\x98\\x07\\xee\\x28\\xbc\\x2b\\x47\\x59\\xe3\\x10\\x62\\x99\\xd4\\x04\\xe3\\xb7\\xf8\\x01\\xc1\\x41\\x08\\xf1\\x62\\x54\\x07\\x82\\x10\\xbc\\xac\\x68\\xbc\\xf8\\xbd\\x34\\x85\\x30\\x5b\\x4c\\xeb\\x40\\xf0\\xfc\\x3b\\xdf\\x63\\x58\\xdf\\xf3\\xef\\xca\\x23\\xc6\\xcb\\x44\\x6c\\xe6\\xfa\\x81\\x27\\x44\\x8e\\xb3\\xd0\\xd3\\x17\\x1b\\x87\\xb3\\xb9\\x1b\\xb1\\x73\\xca\\x6b\\x3d\\x9e\\x69\\x74\\x0b\\xbc\\x18\\xe5\\x7c\\x95\\x29\\x5f\\x75\\x13\\x22\\x22\\x49\\x06\\x57\\xfe\\xf5\\xe9\\xe8\\x46\\xb1\\x15\\x29\\xba\\x1f\\x34\\xd3\\x42\\xba\\x03\\x40\\x2c\\x8a\\xb4\\x52\\x1e\\x9d\\xaf\\x85\\x86\\xf9\\xa0\\x7d\\x38\\xfa\\xfb\\xc1\\xf9\\x21\\xfc\\xf5\\xf0\\xf8\\xec\\xf0\\x03\\xbc\\xfb\\xe5\\xe4\\xcd\\xf9\\xd1\\xe9\\xc9\\xc7\\x42\\xc9\\x74\\x39\\xa6\\xf1\\x29\\xb4\\x52\\x57\\x34\\xa5\\xe6\\xdc\\x82\\xde\\x13\\x53\\x8a\\xf2\\x50\\xfd\\xfc\\xf0\\x80\\x11\\x00\\x87\\xe0\\xc3\\x3e\\xf8\\xb0\\x07\\x7e\\x59\\x53\\xae\\x41\\x38\\x25\\x55\\x65\\x71\\x1d\\x59\\xd2\\x11\\xf3\\x14\\x5e\\xa5\\xfc\\xb7\\xb8\\x36\\xea\\xfb\\x93\\x3f\\x58\\xb5\\x09\\xc0\\x90\\xc5\\x72\\xe0\\x8b\\x9e\\x41\\xe2\\xdd\\x1d\\xe8\\x7f\\xba\\x81\\x21\\xb8\\x42\\xe4\\xa1\\x2f\\xc1\\x57\\x97\\xcb\\xa9\\x7f\\x1b\\x1a\\x0d\\xcd\\x74\\xaa\\x66\\xb9\\x37\\xe6\\x48\\x09\\x31\\x82\\xf1\\xdb\\x6d\\x09\\x48\\x57\\xe8\\x0b\\x0c\\x33\\x31\\x5c\\x07\\x62\\x6b\\x44\\x10\\xd9\\xf0\\x97\\x4e\\xe7\\x25\\x82\\x6f\\xf4\\xf1\\x58\\x32\\x9d\\x78\\x11\\xb4\\xb5\\x99\\xa3\\x35\\xc7\\x55\\x4e\\xd9\\x99\\x4f\\x66\\x54\\x26\\x3a\\x84\\xc7\\x0d\\xc6\\xa9\\x15\\xf8\\x42\\x84\\x51\\xe2\\xde\\x84\\x1e\\x3b\\x48\\x9a\\x9d\\xce\\x0d\\x05\\x57\\xdd\\x79\\xfe\\x52\\x87\\x9c\\x3c\\x19\\x94\\xf8\\xa9\\x37\\xe8\\x44\\xf0\\xf0\\x50\\x3e\\x06\\x34\\xcb\\xed\\x0d\\x6d\\xf0\\xfc\\xd9\\x97\\x6e\\xaf\\x18\\x96\\x78\\x77\\x5a\\x19\\x57\\x17\\xd6\\xa6\\x9c\\xd8\\xda\\xe9\\x43\\xdb\\x3a\\x07\\x46\\xfa\\xf5\\x61\\xb7\\x7a\\x93\\xc9\\x50\\xcd\\x0b\\xd3\\x18\\x51\\xfe\\x86\\xa2\\x19\\xe9\\x7f\\xbc\\xb5\\x85\\x9a\\x9f\\x52\\x44\\x20\\xcd\\x62\\xad\\xc8\\x95\\x2b\\x45\\x8e\\x9c\\x19\\xbd\\x29\\xa6\\xdf\\x2a\\x95\\xa6\\x0c\\x8c\\x59\\x14\\xa7\\xf2\\xcc\\x52\\x02\\xc6\\x2c\\xa0\\x93\\x15\\x23\\x7d\\x80\\x7a\\x91\\x4d\\xf1\\xe1\\x01\\x94\\xc4\\xbd\\x2e\\xec\\xc3\\x48\\x24\\x7e\\xe8\\xdc\\x70\\xba\\xa4\\x87\\x6c\\x4f\\xda\\x2b\\x84\\xce\\x8f\\x86\\xa0\\xf4\\x55\\x07\\xc9\\xc5\\x78\\x28\\xaf\\x74\\xe4\\x92\\xf7\\xf0\\x96\\x33\\xf1\\xba\\x01\\xca\\xfa\\x26\\xef\\x3f\\xa6\\x21\\xd7\\xa4\\xa7\\x95\\xfd\\xe3\\xbf\\xfd\\x8a\\x3d\\x1e\\xf0\\xde\\xea\\x12\\x64\\x29\\x7b\\x20\\x4b\\x86\\x6a\\x68\\x49\\x19\\xc5\\x5b\\x78\\x0d\\xd3\\x2a\\xd8\\x37\\x18\\xd9\\xe4\\x56\\x0d\\x50\\x84\\xb6\\x03\\x4d\\x5a\\x65\\xca\\xbb\\x7d\\xb8\\x85\\x3d\\xd3\\x38\\x48\\xfc\\x28\\xb4\\xee\\x68\\x65\\x8a\\xf2\\x98\\x85\\xd0\\xe9\\xa7\\x24\\xd5\\x6f\\xb7\\xa1\\x25\\x63\\x11\\x5d\\xf8\\x97\\x7c\\xc6\\x28\\xc0\\x4d\\x66\\xc8\\x86\\x5f\\x5f\\x8b\\xd7\\xf5\\x87\\x8b\\x90\\xd7\\x0c\\x56\\x3a\\x44\\x7c\\x6a\\xc5\\x4c\\xe8\\xc6\\x4b\\xad\\x53\\x22\\x4d\\x82\\x2f\\xcd\\x0c\\x0f\\xa2\\x05\\xa3\\x2c\\x3f\\x68\\xef\\x76\\xc7\\x2f\\x7b\\x52\\xea\\xeb\\x07\\x24\\x7f\\x70\\xb2\\x3c\\x39\\x64\\xbc\\xd8\\x95\\x40\\x7e\\xe1\\x6f\\xc2\\x28\\xcb\\x75\\x83\\xf5\\x49\\xb5\\x75\\x3f\\x61\\x41\\xd1\\xea\\x31\\xad\\x48\\xbe\\xcf\\xa8\\xe4\\xe3\\x57\\xcb\\xc6\\x80\\xb5\\x07\\x0d\\x61\\xe3\\xc4\\x39\\x63\\x45\\xfd\\xa7\\xfe\\x26\\x23\\x81\\x15\\x18\\xe2\\x94\\x70\\xfa\\x41\\xf2\\x77\\xc2\\x20\\x8c\\x4e\\xc2\\xc3\\x28\\x0a\\xa3\\x18\\x75\\x9e\\x33\\x9f\\xff\\x71\\x97\\x5a\\x62\\x2a\\x06\\x96\\x74\\x8b\\x69\\x82\\x99\\x80\\xdf\\x6c\\x5f\\x0f\\x79\\x55\\x0a\\x3b\\xfc\\x6a\\xc8\\x21\\xd8\\xc7\\x37\\xc3\\x24\\x3e\\xe0\\xcc\\x45\\x33\\x1c\\xdd\\x58\\x9a\\x3c\\x45\\x87\\xd1\\xee\\x3c\\x0a\\x93\\x30\\x59\\xcd\\x59\\xca\\x91\\x77\\xc7\\xee\\x74\\x4a\\x95\\x87\\x43\\x68\\x5c\\x08\\xcf\\x52\\x84\\x79\\xd9\\xa8\\x3b\\xc7\\x6f\\xe8\\x66\\x5a\\x60\\x6e\\x8e\\x02\\x61\\x2f\\x4a\\xec\\x4f\\x78\\x25\\xe6\\x3b\\x96\\x05\\x4e\\x17\\x49\\x3a\\x51\\x87\\xd7\\xdd\\xdc\\x05\\xb7\\xb1\\xb5\\xbb\\xdb\\xa0\\x7b\\xec\\xe0\\xa9\\x5c\\xeb\\x31\\x5c\\x0c\\x76\\x1d\\x18\\xec\\x5e\\x9a\\xeb\\x5d\\x5d\\x35\\x28\\xa3\\xd0\\xa0\\xaf\\x54\\xdb\\x72\\x60\\xd7\\x81\\xac\\x9e\\x61\\x5e\\x93\\xf0\\x27\\xc2\\x4b\\x5c\\xa9\\xa9\\x1b\\x8e\\xc4\\xd6\\x78\\x44\\xde\\xe8\\x0f\\x23\\xb2\\x74\\x32\\x7a\\xaa\\xb9\\x51\\x74\\x6c\\x3e\\x1c\\x0d\\xbe\\x67\\xe4\\x27\\x16\\x27\\x91\\xd9\\x43\\xac\\xe4\\x2d\\x65\\x62\\xcc\\x44\\x0a\\xdc\\x28\\x3a\\x26\\x07\\xb9\\x94\\x87\\xe1\\xaf\\x38\\x6b\\xe5\\x46\\xd1\\x05\\xff\\x7c\\x09\\x4f\\x86\\x72\\x4e\\x0d\\x2c\\x16\\x2f\\x8a\\x14\\xb3\\x0f\\x97\\x9c\\xdb\\x3a\\x38\\x3e\\xfb\\xeb\\xc1\\x4f\\x87\\xe7\\x69\\xb6\\x07\\xc4\\x59\\x04\\xd0\\x15\\x74\\xad\\x4a\\x73\\x7a\\x03\\xaf\\x72\\x68\\xdd\\x60\\xad\\x2a\\x5d\\x2a\\xc7\\xe4\\x86\\x53\\x44\\x39\\x6b\\x1d\\xa8\\x76\\x14\\xcb\\x6a\\x72\\xf6\\xeb\\x12\\x32\\x31\\xa0\\xfa\\xb2\\x2a\\x3a\\x97\\x52\\xb6\\x3d\\x94\\x88\\xf4\\x52\\x44\\x2a\\xa3\\x7b\\x89\\x1a\\x3f\\x0e\\x65\\x95\\xf5\\xcd\\x9f\\xcb\\x6f\\x4c\\x44\\x81\\x8f\\xac\\x21\\xff\\xb4\\x91\\xdc\\x18\\x04\\x63\\x36\\x62\\x97\\x2d\\x55\\x78\\x0d\\x03\\xd8\\x57\\xd7\\x41\\xbf\\xc5\\x6f\\x04\\x5d\\x21\\x52\\x52\\x7d\\x26\\xe3\\x24\\x82\\x16\\xb4\\xb5\\x9d\\x94\\xc9\\x52\\xf6\\xa1\\x41\\xa6\\xf4\\xac\\xdd\\xd0\\xe5\\x10\\xb1\\xf4\\x42\\x27\\x3c\\x33\\xec\\xed\\x29\\x0b\\x1c\\xf8\\xa2\\x3f\\x4b\\x4f\\x8a\\x0a\\x03\\x03\\x93\\xc3\\x84\\x5c\\xd7\\xb0\\x74\\x8b\\x39\\xde\\x6d\\x41\\xff\\xbe\\xe0\\x6d\\xa7\\xdb\\x78\\x89\\x11\\xc8\\xe0\\x8b\\x48\\x52\\x63\\xda\\x96\\x24\\xb5\\xfb\\x22\\x65\\x76\\xc6\\xe6\\xcd\\x8a\\x14\\xf1\\x58\\x05\\x95\\x35\\x88\\x92\\x68\\xe8\\x60\\x5e\\xd5\\x4d\\x1c\\xb0\\x76\\x9b\\x71\\x8e\\x83\\x05\\xd6\\x8d\\xab\\x8e\\x48\\x83\\xcf\\x61\\x67\\x48\\x04\\xaf\\xd3\\xa9\\x31\\x34\\x72\\x78\\xda\\x43\\x3e\\xbd\\xba\\x5f\\x45\\x9f\\xd3\\x29\\xac\\xc2\\x87\\x06\\x3b\\x5b\\xc9\\xfc\\x3a\\x47\\xb1\\xf4\\x8a\\x6b\\x9c\\x19\\xcd\\x81\\xca\\x6f\\x4c\\x5b\\xab\\x24\\x4d\\x35\\xaf\\x77\\x85\\xd7\\x28\\x63\\xcf\\xa7\\x2e\\x67\\x06\\x65\\x91\\x8c\\xd0\\xb6\\x4b\\x0d\\x69\\x02\\xbe\\x55\\x33\\xc3\\x8e\\x62\\x55\\xcd\\x85\\xf5\\xf0\\x9f\\x67\\xa7\\x1f\\xce\\x0b\\xef\\x33\\x39\\xed\\x10\\xdc\\x00\\x99\\xc0\\x66\\xf1\\x6c\\xe0\\x6b\\xe7\\xfd\\xdb\\xfc\\x92\\x21\\x17\\xfa\\xd5\\x9c\\x85\\x57\\xe0\\xb1\\x2b\\x7e\\x63\\xe7\\x5c\\x8c\\xec\\x77\\x83\\xf3\\x53\\xf4\\xbe\\xeb\\xce\\x3c\\xed\\xd4\\xd1\\xcf\\xcd\\xbc\\x40\\xb3\\x2c\\xa7\\x82\\xaf\\xda\\xc3\\x0a\\x93\\xa3\\x7b\\x94\\x2e\\x92\\x82\\x02\\xb3\\xe0\\xce\\x8f\\xc2\\x80\\x33\\xa9\\xb1\\xf0\\xd4\\x58\\xcc\\xe7\\x61\\x94\\xc0\\x2c\\xf4\\x16\\x53\\xd6\\xe5\\x1b\\x2c\\x2a\\xde\\x51\\xd4\\x85\\x26\\xfa\\x43\\xc5\\x39\\xbf\\xdf\\x58\\x04\\x84\\xa5\\x87\\x1d\\xca\\xc3\\xd1\\x76\\xaa\\x50\\x64\\x68\\x12\\xb8\\x41\\x96\\x70\\x3a\\x5a\\xcd\\x93\\x10\\x5a\\x90\\x44\\x2b\\xf8\\x1d\\xc4\\xd7\\x21\\x44\\xec\\xf3\\xc2\\x8f\\x58\\xb3\\x41\\x6f\\x1a\\x2d\\x3e\\x12\\x63\\x37\\x19\\x4f\\xa0\\xc9\\x5a\\xf0\\xbb\\x5e\\x80\\xf2\\x53\\x14\\xde\\xc7\\x2c\\xd2\\xf6\\xb1\\x8c\\xed\\xf5\\x34\\x1c\\xb9\\xd3\\xae\\xba\\x08\\x8c\\x02\\xc2\\xf4\\x53\\x2b\\x97\\x29\\xf6\\xab\\xf3\\xfb\\x0f\\x84\\xe1\\x0f\\x7b\\xbb\\x83\\xaf\\x97\\xce\\x0f\\xf7\\x6c\\xb4\\xfd\\xc3\\xde\\x85\\x9c\\xd6\\xa6\\xe8\\x88\\x43\\x43\\xe3\\x88\\xa1\\x69\\x65\\xd8\\x70\\x52\\xff\\x0f\\x36\\xda\\x56\\x3b\\xdd\\xed\\x4d\\xfd\\x51\\x8f\\x83\\xc2\\x9c\\x73\\xbd\\x1e\\x78\\x61\\x90\\x40\\x78\\xc7\\xa2\\xc8\\xf7\\x98\\xc0\\x9c\\x57\\xf5\\x5d\\x35\\x79\\x3d\\x1f\\x53\\x31\\x8d\\xf7\\x7e\\xe0\\x85\\xf7\\x98\\x60\\xae\\x30\\x8f\\xb9\\x02\\x5d\\x6a\\x3a\\x5f\\xaa\\x38\\xb5\\xb9\\xa2\\x88\\x6c\\x36\\x3c\\xca\\x44\\x94\\x66\\x9f\\x4a\\xa6\\x03\\x95\\xf5\\xea\\x87\\xbd\\xad\\xed\\xaf\\x97\\x5f\\x9d\\xdf\\xbf\\x3a\\x17\\x34\\x62\\x97\\xad\\x7f\\xeb\\xf5\\xfe\\x7f\\x10\\x87\\x8b\\x68\\xcc\\xde\\xbb\\xf3\\xb9\\x1f\\x5c\\xff\\xf2\\xe1\\x78\\xc8\\x7f\\xec\\xde\\xc4\\xdd\\x99\\x3b\\xff\\xb7\\xff\\x27\\x00\\x00\\xff\\xff\\x69\\x1e\\xc9\\x22\\x03\\x63\\x0a\\x00\")\n\nfunc web3JsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_web3Js,\n\t\t\"web3.js\",\n\t)\n}\n\nfunc web3Js() (*asset, error) {\n\tbytes, err := web3JsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"web3.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0xec, 0x4b, 0x81, 0xfa, 0xfd, 0x9, 0xbb, 0x21, 0x17, 0xea, 0xf4, 0x24, 0x51, 0x2d, 0x0, 0xf3, 0x10, 0x2a, 0xc0, 0xe1, 0x22, 0x51, 0x2a, 0x9, 0x33, 0x1a, 0x81, 0x52, 0xfa, 0xf4, 0xfe, 0x86}}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// AssetString returns the asset contents as a string (instead of a []byte).\nfunc AssetString(name string) (string, error) {\n\tdata, err := Asset(name)\n\treturn string(data), err\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// MustAssetString is like AssetString but panics when Asset would return an\n// error. It simplifies safe initialization of global variables.\nfunc MustAssetString(name string) string {\n\treturn string(MustAsset(name))\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetDigest returns the digest of the file with the given name. It returns an\n// error if the asset could not be found or the digest could not be loaded.\nfunc AssetDigest(name string) ([sha256.Size]byte, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn [sha256.Size]byte{}, fmt.Errorf(\"AssetDigest %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.digest, nil\n\t}\n\treturn [sha256.Size]byte{}, fmt.Errorf(\"AssetDigest %s not found\", name)\n}\n\n// Digests returns a map of all known files and their checksums.\nfunc Digests() (map[string][sha256.Size]byte, error) {\n\tmp := make(map[string][sha256.Size]byte, len(_bindata))\n\tfor name := range _bindata {\n\t\ta, err := _bindata[name]()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmp[name] = a.digest\n\t}\n\treturn mp, nil\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"bignumber.js\": bignumberJs,\n\n\t\"web3.js\": web3Js,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"},\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"},\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error, and\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif len(name) != 0 {\n\t\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\t\tpathList := strings.Split(canonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"bignumber.js\": {bignumberJs, map[string]*bintree{}},\n\t\"web3.js\":      {web3Js, map[string]*bintree{}},\n}}\n\n// RestoreAsset restores an asset under the given directory.\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n}\n\n// RestoreAssets restores an asset under the given directory recursively.\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\treturn filepath.Join(append([]string{dir}, strings.Split(canonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "internal/jsre/deps/deps.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package deps contains the console JavaScript dependencies Go embedded.\npackage deps\n\n//go:generate go-bindata -nometadata -pkg deps -o bindata.go bignumber.js web3.js\n//go:generate gofmt -w -s bindata.go\n"
  },
  {
    "path": "internal/jsre/deps/web3.js",
    "content": "require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n        module.exports=[\n            {\n                \"constant\": true,\n                \"inputs\": [\n                    {\n                        \"name\": \"_owner\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"name\",\n                \"outputs\": [\n                    {\n                        \"name\": \"o_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": true,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"owner\",\n                \"outputs\": [\n                    {\n                        \"name\": \"\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": true,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"content\",\n                \"outputs\": [\n                    {\n                        \"name\": \"\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": true,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"addr\",\n                \"outputs\": [\n                    {\n                        \"name\": \"\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"reserve\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": true,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"subRegistrar\",\n                \"outputs\": [\n                    {\n                        \"name\": \"\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"_newOwner\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"transfer\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"_registrar\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"setSubRegistrar\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [],\n                \"name\": \"Registrar\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"_a\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"name\": \"_primary\",\n                        \"type\": \"bool\"\n                    }\n                ],\n                \"name\": \"setAddress\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"_content\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"setContent\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"disown\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"_winner\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"AuctionEnded\",\n                \"type\": \"event\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"_bidder\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"_value\",\n                        \"type\": \"uint256\"\n                    }\n                ],\n                \"name\": \"NewBid\",\n                \"type\": \"event\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"Changed\",\n                \"type\": \"event\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"indexed\": true,\n                        \"name\": \"addr\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"PrimaryChanged\",\n                \"type\": \"event\"\n            }\n        ]\n\n    },{}],2:[function(require,module,exports){\n        module.exports=[\n            {\n                \"constant\": true,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"owner\",\n                \"outputs\": [\n                    {\n                        \"name\": \"\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"_refund\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"disown\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": true,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"addr\",\n                \"outputs\": [\n                    {\n                        \"name\": \"\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"reserve\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"_newOwner\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"transfer\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"_name\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"_a\",\n                        \"type\": \"address\"\n                    }\n                ],\n                \"name\": \"setAddr\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"name\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"Changed\",\n                \"type\": \"event\"\n            }\n        ]\n\n    },{}],3:[function(require,module,exports){\n        module.exports=[\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"from\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"to\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"name\": \"value\",\n                        \"type\": \"uint256\"\n                    }\n                ],\n                \"name\": \"transfer\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"from\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"to\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"name\": \"indirectId\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"name\": \"value\",\n                        \"type\": \"uint256\"\n                    }\n                ],\n                \"name\": \"icapTransfer\",\n                \"outputs\": [],\n                \"type\": \"function\"\n            },\n            {\n                \"constant\": false,\n                \"inputs\": [\n                    {\n                        \"name\": \"to\",\n                        \"type\": \"bytes32\"\n                    }\n                ],\n                \"name\": \"deposit\",\n                \"outputs\": [],\n                \"payable\": true,\n                \"type\": \"function\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"from\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"value\",\n                        \"type\": \"uint256\"\n                    }\n                ],\n                \"name\": \"AnonymousDeposit\",\n                \"type\": \"event\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"from\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"indexed\": true,\n                        \"name\": \"to\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"value\",\n                        \"type\": \"uint256\"\n                    }\n                ],\n                \"name\": \"Deposit\",\n                \"type\": \"event\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"from\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"indexed\": true,\n                        \"name\": \"to\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"value\",\n                        \"type\": \"uint256\"\n                    }\n                ],\n                \"name\": \"Transfer\",\n                \"type\": \"event\"\n            },\n            {\n                \"anonymous\": false,\n                \"inputs\": [\n                    {\n                        \"indexed\": true,\n                        \"name\": \"from\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"indexed\": true,\n                        \"name\": \"to\",\n                        \"type\": \"address\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"indirectId\",\n                        \"type\": \"bytes32\"\n                    },\n                    {\n                        \"indexed\": false,\n                        \"name\": \"value\",\n                        \"type\": \"uint256\"\n                    }\n                ],\n                \"name\": \"IcapTransfer\",\n                \"type\": \"event\"\n            }\n        ]\n\n    },{}],4:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n\n        /**\n         * SolidityTypeAddress is a prootype that represents address type\n         * It matches:\n         * address\n         * address[]\n         * address[4]\n         * address[][]\n         * address[3][]\n         * address[][6][], ...\n         */\n        var SolidityTypeAddress = function () {\n            this._inputFormatter = f.formatInputAddress;\n            this._outputFormatter = f.formatOutputAddress;\n            this._inputSeroAddressFormatter = f.formatInputFullAddress;\n            this._inputSeroShortAddrFormatter = f.formtInputShortAddress;\n            this._outSeroAddressFormatter = f.formatOutputAddress;\n        };\n\n        SolidityTypeAddress.prototype = new SolidityType({});\n        SolidityTypeAddress.prototype.constructor = SolidityTypeAddress;\n\n        SolidityTypeAddress.prototype.isType = function (name) {\n            return !!name.match(/address(\\[([0-9]*)\\])?/);\n        };\n\n        module.exports = SolidityTypeAddress;\n\n    },{\"./formatters\":9,\"./type\":14}],5:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n\n        /**\n         * SolidityTypeBool is a prootype that represents bool type\n         * It matches:\n         * bool\n         * bool[]\n         * bool[4]\n         * bool[][]\n         * bool[3][]\n         * bool[][6][], ...\n         */\n        var SolidityTypeBool = function () {\n            this._inputFormatter = f.formatInputBool;\n            this._outputFormatter = f.formatOutputBool;\n        };\n\n        SolidityTypeBool.prototype = new SolidityType({});\n        SolidityTypeBool.prototype.constructor = SolidityTypeBool;\n\n        SolidityTypeBool.prototype.isType = function (name) {\n            return !!name.match(/^bool(\\[([0-9]*)\\])*$/);\n        };\n\n        module.exports = SolidityTypeBool;\n\n    },{\"./formatters\":9,\"./type\":14}],6:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n\n        /**\n         * SolidityTypeBytes is a prototype that represents the bytes type.\n         * It matches:\n         * bytes\n         * bytes[]\n         * bytes[4]\n         * bytes[][]\n         * bytes[3][]\n         * bytes[][6][], ...\n         * bytes32\n         * bytes8[4]\n         * bytes[3][]\n         */\n        var SolidityTypeBytes = function () {\n            this._inputFormatter = f.formatInputBytes;\n            this._outputFormatter = f.formatOutputBytes;\n        };\n\n        SolidityTypeBytes.prototype = new SolidityType({});\n        SolidityTypeBytes.prototype.constructor = SolidityTypeBytes;\n\n        SolidityTypeBytes.prototype.isType = function (name) {\n            return !!name.match(/^bytes([0-9]{1,})(\\[([0-9]*)\\])*$/);\n        };\n\n        module.exports = SolidityTypeBytes;\n\n    },{\"./formatters\":9,\"./type\":14}],7:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file coder.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var f = require('./formatters');\n        var utils = require('../utils/utils')\n\n        var SolidityTypeAddress = require('./address');\n        var SolidityTypeBool = require('./bool');\n        var SolidityTypeInt = require('./int');\n        var SolidityTypeUInt = require('./uint');\n        var SolidityTypeDynamicBytes = require('./dynamicbytes');\n        var SolidityTypeString = require('./string');\n        var SolidityTypeReal = require('./real');\n        var SolidityTypeUReal = require('./ureal');\n        var SolidityTypeBytes = require('./bytes');\n\n        var isDynamic = function (solidityType, type) {\n            return solidityType.isDynamicType(type) ||\n                solidityType.isDynamicArray(type);\n        };\n\n        /**\n         * SolidityCoder prototype should be used to encode/decode solidity params of any type\n         */\n        var SolidityCoder = function (types) {\n            this._types = types;\n        };\n\n        /**\n         * This method should be used to transform type to SolidityType\n         *\n         * @method _requireType\n         * @param {String} type\n         * @returns {SolidityType}\n         * @throws {Error} throws if no matching type is found\n         */\n        SolidityCoder.prototype._requireType = function (type) {\n            var solidityType = this._types.filter(function (t) {\n                return t.isType(type);\n            })[0];\n\n            if (!solidityType) {\n                throw Error('invalid solidity type!: ' + type);\n            }\n\n            return solidityType;\n        };\n\n        /**\n         * Should be used to encode plain param\n         *\n         * @method encodeParam\n         * @param {String} type\n         * @param {Object} plain param\n         * @return {String} encoded plain param\n         */\n        SolidityCoder.prototype.encodeParam = function (type, param,rand,sero) {\n            return this.encodeParams([type], [param]);\n        };\n\n        /**\n         * Should be used to encode list of params\n         *\n         * @method encodeParams\n         * @param {Array} types\n         * @param {Array} params\n         * @return {String} encoded list of params\n         */\n        SolidityCoder.prototype.encodeParams = function (types, params,shortAddrMap) {\n            var solidityTypes = this.getSolidityTypes(types);\n\n            var encodeds = solidityTypes.map(function (solidityType, index) {\n                return solidityType.encode(params[index], types[index],shortAddrMap);\n            });\n\n            var dynamicOffset = solidityTypes.reduce(function (acc, solidityType, index) {\n                var staticPartLength = solidityType.staticPartLength(types[index]);\n                var roundedStaticPartLength = Math.floor((staticPartLength + 31) / 32) * 32;\n\n                return acc + (isDynamic(solidityTypes[index], types[index]) ?\n                    32 :\n                    roundedStaticPartLength);\n            }, 0);\n\n            var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset);\n\n            return result;\n        };\n\n\n        SolidityCoder.prototype.getAddressParams = function (types, params) {\n            var solidityTypes = this.getSolidityTypes(types);\n            var addressParams = [];\n            solidityTypes.map(function (solidityType, index) {\n                if (solidityType instanceof SolidityTypeAddress &&params[index]&&(params[index]!=\"\")){\n                    addressParams = addressParams.concat(solidityType.address(params[index], types[index],false));\n                }\n            });\n            if (addressParams){\n                if (utils.isArray(addressParams)){\n                }else{\n                    addressParams = [addressParams];\n                }\n            }else {\n                addressParams = [];\n            }\n            return addressParams;\n        };\n\n        SolidityCoder.prototype.opParams = function (types, params,rand,sero,dy,callback) {\n            var solidityTypes = this.getSolidityTypes(types);\n            var  addressParams = this.getAddressParams(types, params);\n            if (callback){\n                var cb = function(err,result){\n                    if (err){\n                        callback(err,null)\n                    }else{\n                        rand = result.rand;\n                        if (addressParams.length >0 ){\n                            var addrMap = result.addr;\n                            var convertParams =  solidityTypes.map(function (solidityType, index) {\n                                return  solidityType.convertAddress(params[index], types[index],addrMap)\n                            });\n                            params = convertParams;\n                        }\n                        var paramsresult ={};\n                        paramsresult.params = params;\n                        paramsresult.shortAddr = result.shortAddr;\n                        paramsresult.rand = rand;\n                        callback(null,paramsresult);\n                    }\n\n                }\n                sero.convertAddressParams(rand,addressParams,dy,cb);\n            }else{\n                var convertResult =  sero.convertAddressParams(rand,addressParams,dy);\n                rand = convertResult.rand;\n                if (addressParams.length >0 ){\n                    var addrMap = convertResult.addr;\n                    var convertParams =  solidityTypes.map(function (solidityType, index) {\n                        return  solidityType.convertAddress(params[index], types[index],addrMap)\n                    });\n                    params = convertParams;\n                }\n                var result ={};\n                result.params = params;\n                result.shortAddr = convertResult.shortAddr;\n                result.rand = rand;\n                return result;\n            }\n\n\n        };\n\n        SolidityCoder.prototype.addressPrefix = function (types, params,rand) {\n            var solidityTypes = this.getSolidityTypes(types);\n            var addressParams =[];\n            solidityTypes.map(function (solidityType, index) {\n                if (solidityType instanceof SolidityTypeAddress){\n                    addressParams = addressParams.concat(solidityType.address(params[index], types[index],true));\n                }\n            });\n            if (addressParams){\n                if (utils.isArray(addressParams)){\n                }else{\n                    addressParams = [addressParams]\n                }\n            }else {\n                addressParams = [];\n            }\n            var result =rand+utils.padLeft(utils.toBigNumber(addressParams.length).toString(16),4)+addressParams.join(\"\");\n\n            return result;\n        };\n\n\n        SolidityCoder.prototype.encodeMultiWithOffset = function (types, solidityTypes, encodeds, dynamicOffset) {\n            var result = \"\";\n            var self = this;\n\n            types.forEach(function (type, i) {\n                if (isDynamic(solidityTypes[i], types[i])) {\n                    result += f.formatInputInt(dynamicOffset).encode();\n                    var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);\n                    dynamicOffset += e.length / 2;\n                } else {\n                    // don't add length to dynamicOffset. it's already counted\n                    result += self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);\n                }\n\n                // TODO: figure out nested arrays\n            });\n\n            types.forEach(function (type, i) {\n                if (isDynamic(solidityTypes[i], types[i])) {\n                    var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);\n                    dynamicOffset += e.length / 2;\n                    result += e;\n                }\n            });\n            return result;\n        };\n\n        SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded, offset) {\n            /* jshint maxcomplexity: 17 */\n            /* jshint maxdepth: 5 */\n\n            var self = this;\n            var encodingMode={dynamic:1,static:2,other:3};\n\n            var mode=(solidityType.isDynamicArray(type)?encodingMode.dynamic:(solidityType.isStaticArray(type)?encodingMode.static:encodingMode.other));\n\n            if(mode !== encodingMode.other){\n                var nestedName = solidityType.nestedName(type);\n                var nestedStaticPartLength = solidityType.staticPartLength(nestedName);\n                var result = (mode === encodingMode.dynamic ? encoded[0] : '');\n\n                if (solidityType.isDynamicArray(nestedName)) {\n                    var previousLength = (mode === encodingMode.dynamic ? 2 : 0);\n\n                    for (var i = 0; i < encoded.length; i++) {\n                        // calculate length of previous item\n                        if(mode === encodingMode.dynamic){\n                            previousLength += +(encoded[i - 1])[0] || 0;\n                        }\n                        else if(mode === encodingMode.static){\n                            previousLength += +(encoded[i - 1] || [])[0] || 0;\n                        }\n                        result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode();\n                    }\n                }\n\n                var len= (mode === encodingMode.dynamic ? encoded.length-1 : encoded.length);\n                for (var c = 0; c < len; c++) {\n                    var additionalOffset = result / 2;\n                    if(mode === encodingMode.dynamic){\n                        result += self.encodeWithOffset(nestedName, solidityType, encoded[c + 1], offset +  additionalOffset);\n                    }\n                    else if(mode === encodingMode.static){\n                        result += self.encodeWithOffset(nestedName, solidityType, encoded[c], offset + additionalOffset);\n                    }\n                }\n\n                return result;\n            }\n\n            return encoded;\n        };\n\n\n        /**\n         * Should be used to decode bytes to plain param\n         *\n         * @method decodeParam\n         * @param {String} type\n         * @param {String} bytes\n         * @return {Object} plain param\n         */\n        SolidityCoder.prototype.decodeParam = function (type, bytes) {\n            return this.decodeParams([type], bytes)[0];\n        };\n\n        /**\n         * Should be used to decode list of params\n         *\n         * @method decodeParam\n         * @param {Array} types\n         * @param {String} bytes\n         * @return {Array} array of plain params\n         */\n        SolidityCoder.prototype.decodeParams = function (types, bytes,addrMap) {\n            var solidityTypes = this.getSolidityTypes(types);\n            var offsets = this.getOffsets(types, solidityTypes);\n\n            return solidityTypes.map(function (solidityType, index) {\n                return solidityType.decode(bytes, offsets[index],  types[index],addrMap);\n            });\n\n        };\n\n        SolidityCoder.prototype.decodeShortAddress = function (types, bytes) {\n            var solidityTypes = this.getSolidityTypes(types);\n            var offsets = this.getOffsets(types, solidityTypes);\n            var shortAddress=[];\n            solidityTypes.map(function (solidityType, index) {\n                var shortAddr = solidityType.decodeAddress(bytes, offsets[index],  types[index]);\n                if (shortAddr){\n                    shortAddress = shortAddress.concat(solidityType.decodeAddress(bytes, offsets[index],  types[index]));\n                }\n            });\n            return shortAddress;\n        };\n\n\n        SolidityCoder.prototype.getOffsets = function (types, solidityTypes) {\n            var lengths =  solidityTypes.map(function (solidityType, index) {\n                return solidityType.staticPartLength(types[index]);\n            });\n\n            for (var i = 1; i < lengths.length; i++) {\n                // sum with length of previous element\n                lengths[i] += lengths[i - 1];\n            }\n\n            return lengths.map(function (length, index) {\n                // remove the current length, so the length is sum of previous elements\n                var staticPartLength = solidityTypes[index].staticPartLength(types[index]);\n                return length - staticPartLength;\n            });\n        };\n\n        SolidityCoder.prototype.getSolidityTypes = function (types) {\n            var self = this;\n            return types.map(function (type) {\n                return self._requireType(type);\n            });\n        };\n\n        var coder = new SolidityCoder([\n            new SolidityTypeAddress(),\n            new SolidityTypeBool(),\n            new SolidityTypeInt(),\n            new SolidityTypeUInt(),\n            new SolidityTypeDynamicBytes(),\n            new SolidityTypeBytes(),\n            new SolidityTypeString(),\n            new SolidityTypeReal(),\n            new SolidityTypeUReal()\n        ]);\n\n        module.exports = coder;\n\n    },{\"../utils/utils\":21,\"./address\":4,\"./bool\":5,\"./bytes\":6,\"./dynamicbytes\":8,\"./formatters\":9,\"./int\":10,\"./real\":12,\"./string\":13,\"./uint\":15,\"./ureal\":16}],8:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n\n        var SolidityTypeDynamicBytes = function () {\n            this._inputFormatter = f.formatInputDynamicBytes;\n            this._outputFormatter = f.formatOutputDynamicBytes;\n        };\n\n        SolidityTypeDynamicBytes.prototype = new SolidityType({});\n        SolidityTypeDynamicBytes.prototype.constructor = SolidityTypeDynamicBytes;\n\n        SolidityTypeDynamicBytes.prototype.isType = function (name) {\n            return !!name.match(/^bytes(\\[([0-9]*)\\])*$/);\n        };\n\n        SolidityTypeDynamicBytes.prototype.isDynamicType = function () {\n            return true;\n        };\n\n        module.exports = SolidityTypeDynamicBytes;\n\n    },{\"./formatters\":9,\"./type\":14}],9:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file formatters.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var BigNumber = require('bignumber.js');\n        var utils = require('../utils/utils');\n        var c = require('../utils/config');\n        var SolidityParam = require('./param');\n\n        var base58 = require('../utils/base58')\n\n\n        /**\n         * Formats input value to byte representation of int\n         * If value is negative, return it's two's complement\n         * If the value is floating point, round it down\n         *\n         * @method formatInputInt\n         * @param {String|Number|BigNumber} value that needs to be formatted\n         * @returns {SolidityParam}\n         */\n        var formatInputInt = function (value) {\n            BigNumber.config(c.SERO_BIGNUMBER_ROUNDING_MODE);\n            var result = utils.padLeft(utils.toTwosComplement(value).toString(16), 64);\n            return new SolidityParam(result);\n        };\n\n        /**\n         * Formats input bytes\n         *\n         * @method formatInputBytes\n         * @param {String}\n         * @returns {SolidityParam}\n         */\n        var formatInputBytes = function (value) {\n            var result = utils.toHex(value).substr(2);\n            var l = Math.floor((result.length + 63) / 64);\n            result = utils.padRight(result, l * 64);\n            return new SolidityParam(result);\n        };\n\n        /**\n         * Formats input bytes\n         *\n         * @method formatDynamicInputBytes\n         * @param {String}\n         * @returns {SolidityParam}\n         */\n        var formatInputDynamicBytes = function (value) {\n            var result = utils.toHex(value).substr(2);\n            var length = result.length / 2;\n            var l = Math.floor((result.length + 63) / 64);\n            result = utils.padRight(result, l * 64);\n            return new SolidityParam(formatInputInt(length).value + result);\n        };\n\n        /**\n         * Formats input value to byte representation of string\n         *\n         * @method formatInputString\n         * @param {String}\n         * @returns {SolidityParam}\n         */\n        var formatInputString = function (value) {\n            var result = utils.fromUtf8(value).substr(2);\n            var length = result.length / 2;\n            var l = Math.floor((result.length + 63) / 64);\n            result = utils.padRight(result, l * 64);\n            return new SolidityParam(formatInputInt(length).value + result);\n        };\n\n        /**\n         * Formats input value to byte representation of bool\n         *\n         * @method formatInputBool\n         * @param {Boolean}\n         * @returns {SolidityParam}\n         */\n        var formatInputBool = function (value) {\n            var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ?  '1' : '0');\n            return new SolidityParam(result);\n        };\n\n        /**\n         * Formats input value to byte representation of real\n         * Values are multiplied by 2^m and encoded as integers\n         *\n         * @method formatInputReal\n         * @param {String|Number|BigNumber}\n         * @returns {SolidityParam}\n         */\n        var formatInputReal = function (value) {\n            return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));\n        };\n\n\n        /**\n         * Formats input value to byte representation of vm address\n         *\n         * @method formatInputAddress\n         * @param {String}\n         * @returns {SolidityParam}\n         */\n        var formatInputAddress = function (value) {\n            var bytes = base58.decode(value).slice(44);\n            var result = utils.bytesToHex(bytes).substr(2);\n            result = utils.padLeft(result, 64);\n            return new SolidityParam(result);\n        };\n\n\n        var formtInputShortAddress = function (value) {\n            var result = value.substr(2);\n            result = utils.padLeft(result, 64);\n            return new SolidityParam(result);\n        };\n\n\n\n        /**\n         * Formats input value to byte representation of show address\n         *\n         * @method formatInputFullAddress\n         * @param {String}\n         * @returns {SolidityParam}\n         */\n        var formatInputFullAddress = function (value) {\n            var bytes = base58.decode(value);\n            return utils.bytesToHex(bytes).substr(2);\n        };\n\n\n        /**\n         * Check if input value is negative\n         *\n         * @method signedIsNegative\n         * @param {String} value is hex format\n         * @returns {Boolean} true if it is negative, otherwise false\n         */\n        var signedIsNegative = function (value) {\n            return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1';\n        };\n\n        /**\n         * Formats right-aligned output bytes to int\n         *\n         * @method formatOutputInt\n         * @param {SolidityParam} param\n         * @returns {BigNumber} right-aligned output bytes formatted to big number\n         */\n        var formatOutputInt = function (param) {\n            var value = param.staticPart() || \"0\";\n\n            // check if it's negative number\n            // it it is, return two's complement\n            if (signedIsNegative(value)) {\n                return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);\n            }\n            return new BigNumber(value, 16);\n        };\n\n        /**\n         * Formats right-aligned output bytes to uint\n         *\n         * @method formatOutputUInt\n         * @param {SolidityParam}\n         * @returns {BigNumeber} right-aligned output bytes formatted to uint\n         */\n        var formatOutputUInt = function (param) {\n            var value = param.staticPart() || \"0\";\n            return new BigNumber(value, 16);\n        };\n\n        /**\n         * Formats right-aligned output bytes to real\n         *\n         * @method formatOutputReal\n         * @param {SolidityParam}\n         * @returns {BigNumber} input bytes formatted to real\n         */\n        var formatOutputReal = function (param) {\n            return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128));\n        };\n\n        /**\n         * Formats right-aligned output bytes to ureal\n         *\n         * @method formatOutputUReal\n         * @param {SolidityParam}\n         * @returns {BigNumber} input bytes formatted to ureal\n         */\n        var formatOutputUReal = function (param) {\n            return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128));\n        };\n\n        /**\n         * Should be used to format output bool\n         *\n         * @method formatOutputBool\n         * @param {SolidityParam}\n         * @returns {Boolean} right-aligned input bytes formatted to bool\n         */\n        var formatOutputBool = function (param) {\n            return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false;\n        };\n\n        /**\n         * Should be used to format output bytes\n         *\n         * @method formatOutputBytes\n         * @param {SolidityParam} left-aligned hex representation of string\n         * @param {String} name type name\n         * @returns {String} hex string\n         */\n        var formatOutputBytes = function (param, name) {\n            var matches = name.match(/^bytes([0-9]*)/);\n            var size = parseInt(matches[1]);\n            return '0x' + param.staticPart().slice(0, 2 * size);\n        };\n\n        /**\n         * Should be used to format output bytes\n         *\n         * @method formatOutputDynamicBytes\n         * @param {SolidityParam} left-aligned hex representation of string\n         * @returns {String} hex string\n         */\n        var formatOutputDynamicBytes = function (param) {\n            var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;\n            return '0x' + param.dynamicPart().substr(64, length);\n        };\n\n        /**\n         * Should be used to format output string\n         *\n         * @method formatOutputString\n         * @param {SolidityParam} left-aligned hex representation of string\n         * @returns {String} ascii string\n         */\n        var formatOutputString = function (param) {\n            var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;\n            return utils.toUtf8(param.dynamicPart().substr(64, length));\n        };\n\n        /**\n         * Should be used to format output address\n         *\n         * @method formatOutputAddress\n         * @param {SolidityParam} right-aligned input bytes\n         * @returns {String} address\n         */\n        var formatOutputAddress = function (param) {\n            var value = param.staticPart();\n            var  hex = value.slice(value.length - 128, value.length);\n            var  bytes =utils.hexToBytes(hex);\n            return utils.bytesToBase58(bytes);\n        };\n\n        module.exports = {\n            formatInputInt: formatInputInt,\n            formatInputBytes: formatInputBytes,\n            formatInputDynamicBytes: formatInputDynamicBytes,\n            formatInputString: formatInputString,\n            formatInputBool: formatInputBool,\n            formatInputReal: formatInputReal,\n            formatInputAddress: formatInputAddress,\n            formatInputFullAddress: formatInputFullAddress,\n            formtInputShortAddress:formtInputShortAddress,\n            formatOutputInt: formatOutputInt,\n            formatOutputUInt: formatOutputUInt,\n            formatOutputReal: formatOutputReal,\n            formatOutputUReal: formatOutputUReal,\n            formatOutputBool: formatOutputBool,\n            formatOutputBytes: formatOutputBytes,\n            formatOutputDynamicBytes: formatOutputDynamicBytes,\n            formatOutputString: formatOutputString,\n            formatOutputAddress: formatOutputAddress\n        };\n\n    },{\"../utils/base58\":17,\"../utils/config\":19,\"../utils/utils\":21,\"./param\":11,\"bignumber.js\":\"bignumber.js\"}],10:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n        var utils = require('../utils/utils');\n\n        /**\n         * SolidityTypeInt is a prootype that represents int type\n         * It matches:\n         * int\n         * int[]\n         * int[4]\n         * int[][]\n         * int[3][]\n         * int[][6][], ...\n         * int32\n         * int64[]\n         * int8[4]\n         * int256[][]\n         * int[3][]\n         * int64[][6][], ...\n         */\n        var SolidityTypeInt = function () {\n            this._inputFormatter = f.formatInputInt;\n            this._outputFormatter = f.formatOutputInt;\n            this._seroInputFormatter =  function (value){\n                return utils.toBigNumber(value).toString(10);\n            }\n        };\n\n        SolidityTypeInt.prototype = new SolidityType({});\n        SolidityTypeInt.prototype.constructor = SolidityTypeInt;\n\n        SolidityTypeInt.prototype.isType = function (name) {\n            return !!name.match(/^int([0-9]*)?(\\[([0-9]*)\\])*$/);\n        };\n\n        module.exports = SolidityTypeInt;\n\n    },{\"../utils/utils\":21,\"./formatters\":9,\"./type\":14}],11:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file param.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var utils = require('../utils/utils');\n\n        /**\n         * SolidityParam object prototype.\n         * Should be used when encoding, decoding solidity bytes\n         */\n        var SolidityParam = function (value, offset) {\n            this.value = value || '';\n            this.offset = offset; // offset in bytes\n        };\n\n        /**\n         * This method should be used to get length of params's dynamic part\n         *\n         * @method dynamicPartLength\n         * @returns {Number} length of dynamic part (in bytes)\n         */\n        SolidityParam.prototype.dynamicPartLength = function () {\n            return this.dynamicPart().length / 2;\n        };\n\n        /**\n         * This method should be used to create copy of solidity param with different offset\n         *\n         * @method withOffset\n         * @param {Number} offset length in bytes\n         * @returns {SolidityParam} new solidity param with applied offset\n         */\n        SolidityParam.prototype.withOffset = function (offset) {\n            return new SolidityParam(this.value, offset);\n        };\n\n        /**\n         * This method should be used to combine solidity params together\n         * eg. when appending an array\n         *\n         * @method combine\n         * @param {SolidityParam} param with which we should combine\n         * @param {SolidityParam} result of combination\n         */\n        SolidityParam.prototype.combine = function (param) {\n            return new SolidityParam(this.value + param.value);\n        };\n\n        /**\n         * This method should be called to check if param has dynamic size.\n         * If it has, it returns true, otherwise false\n         *\n         * @method isDynamic\n         * @returns {Boolean}\n         */\n        SolidityParam.prototype.isDynamic = function () {\n            return this.offset !== undefined;\n        };\n\n        /**\n         * This method should be called to transform offset to bytes\n         *\n         * @method offsetAsBytes\n         * @returns {String} bytes representation of offset\n         */\n        SolidityParam.prototype.offsetAsBytes = function () {\n            return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64);\n        };\n\n        /**\n         * This method should be called to get static part of param\n         *\n         * @method staticPart\n         * @returns {String} offset if it is a dynamic param, otherwise value\n         */\n        SolidityParam.prototype.staticPart = function () {\n            if (!this.isDynamic()) {\n                return this.value;\n            }\n            return this.offsetAsBytes();\n        };\n\n        /**\n         * This method should be called to get dynamic part of param\n         *\n         * @method dynamicPart\n         * @returns {String} returns a value if it is a dynamic param, otherwise empty string\n         */\n        SolidityParam.prototype.dynamicPart = function () {\n            return this.isDynamic() ? this.value : '';\n        };\n\n        /**\n         * This method should be called to encode param\n         *\n         * @method encode\n         * @returns {String}\n         */\n        SolidityParam.prototype.encode = function () {\n            return this.staticPart() + this.dynamicPart();\n        };\n\n        /**\n         * This method should be called to encode array of params\n         *\n         * @method encodeList\n         * @param {Array[SolidityParam]} params\n         * @returns {String}\n         */\n        SolidityParam.encodeList = function (params) {\n\n            // updating offsets\n            var totalOffset = params.length * 32;\n            var offsetParams = params.map(function (param) {\n                if (!param.isDynamic()) {\n                    return param;\n                }\n                var offset = totalOffset;\n                totalOffset += param.dynamicPartLength();\n                return param.withOffset(offset);\n            });\n\n            // encode everything!\n            return offsetParams.reduce(function (result, param) {\n                return result + param.dynamicPart();\n            }, offsetParams.reduce(function (result, param) {\n                return result + param.staticPart();\n            }, ''));\n        };\n\n\n\n        module.exports = SolidityParam;\n\n\n    },{\"../utils/utils\":21}],12:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n\n        /**\n         * SolidityTypeReal is a prootype that represents real type\n         * It matches:\n         * real\n         * real[]\n         * real[4]\n         * real[][]\n         * real[3][]\n         * real[][6][], ...\n         * real32\n         * real64[]\n         * real8[4]\n         * real256[][]\n         * real[3][]\n         * real64[][6][], ...\n         */\n        var SolidityTypeReal = function () {\n            this._inputFormatter = f.formatInputReal;\n            this._outputFormatter = f.formatOutputReal;\n        };\n\n        SolidityTypeReal.prototype = new SolidityType({});\n        SolidityTypeReal.prototype.constructor = SolidityTypeReal;\n\n        SolidityTypeReal.prototype.isType = function (name) {\n            return !!name.match(/real([0-9]*)?(\\[([0-9]*)\\])?/);\n        };\n\n        module.exports = SolidityTypeReal;\n\n    },{\"./formatters\":9,\"./type\":14}],13:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n\n        var SolidityTypeString = function () {\n            this._inputFormatter = f.formatInputString;\n            this._outputFormatter = f.formatOutputString;\n        };\n\n        SolidityTypeString.prototype = new SolidityType({});\n        SolidityTypeString.prototype.constructor = SolidityTypeString;\n\n        SolidityTypeString.prototype.isType = function (name) {\n            return !!name.match(/^string(\\[([0-9]*)\\])*$/);\n        };\n\n        SolidityTypeString.prototype.isDynamicType = function () {\n            return true;\n        };\n\n        module.exports = SolidityTypeString;\n\n    },{\"./formatters\":9,\"./type\":14}],14:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityParam = require('./param');\n        var SolidityTypeAddress = require('./address');\n        var utils = require('../utils/utils')\n\n        /**\n         * SolidityType prototype is used to encode/decode solidity params of certain type\n         */\n        var SolidityType = function (config) {\n            this._inputFormatter = config.inputFormatter;\n            this._outputFormatter = config.outputFormatter;\n        };\n\n        /**\n         * Should be used to determine if this SolidityType do match given name\n         *\n         * @method isType\n         * @param {String} name\n         * @return {Bool} true if type match this SolidityType, otherwise false\n         */\n        SolidityType.prototype.isType = function (name) {\n            throw \"this method should be overrwritten for type \" + name;\n        };\n\n        /**\n         * Should be used to determine what is the length of static part in given type\n         *\n         * @method staticPartLength\n         * @param {String} name\n         * @return {Number} length of static part in bytes\n         */\n        SolidityType.prototype.staticPartLength = function (name) {\n\n            var len = this._outputLenght?this._outputLenght:32;\n            // If name isn't an array then treat it like a single element array.\n            return (this.nestedTypes(name) || ['[1]'])\n                .map(function (type) {\n                    // the length of the nested array\n                    return parseInt(type.slice(1, -1), 10) || 1;\n                })\n                .reduce(function (previous, current) {\n                    return previous * current;\n                    // all basic types are 32 bytes long\n                }, len);\n        };\n\n        /**\n         * Should be used to determine if type is dynamic array\n         * eg:\n         * \"type[]\" => true\n         * \"type[4]\" => false\n         *\n         * @method isDynamicArray\n         * @param {String} name\n         * @return {Bool} true if the type is dynamic array\n         */\n        SolidityType.prototype.isDynamicArray = function (name) {\n            var nestedTypes = this.nestedTypes(name);\n            return !!nestedTypes && !nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);\n        };\n\n        /**\n         * Should be used to determine if type is static array\n         * eg:\n         * \"type[]\" => false\n         * \"type[4]\" => true\n         *\n         * @method isStaticArray\n         * @param {String} name\n         * @return {Bool} true if the type is static array\n         */\n        SolidityType.prototype.isStaticArray = function (name) {\n            var nestedTypes = this.nestedTypes(name);\n            return !!nestedTypes && !!nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);\n        };\n\n        /**\n         * Should return length of static array\n         * eg.\n         * \"int[32]\" => 32\n         * \"int256[14]\" => 14\n         * \"int[2][3]\" => 3\n         * \"int\" => 1\n         * \"int[1]\" => 1\n         * \"int[]\" => 1\n         *\n         * @method staticArrayLength\n         * @param {String} name\n         * @return {Number} static array length\n         */\n        SolidityType.prototype.staticArrayLength = function (name) {\n            var nestedTypes = this.nestedTypes(name);\n            if (nestedTypes) {\n                return parseInt(nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g) || 1);\n            }\n            return 1;\n        };\n\n        /**\n         * Should return nested type\n         * eg.\n         * \"int[32]\" => \"int\"\n         * \"int256[14]\" => \"int256\"\n         * \"int[2][3]\" => \"int[2]\"\n         * \"int\" => \"int\"\n         * \"int[]\" => \"int\"\n         *\n         * @method nestedName\n         * @param {String} name\n         * @return {String} nested name\n         */\n        SolidityType.prototype.nestedName = function (name) {\n            // remove last [] in name\n            var nestedTypes = this.nestedTypes(name);\n            if (!nestedTypes) {\n                return name;\n            }\n\n            return name.substr(0, name.length - nestedTypes[nestedTypes.length - 1].length);\n        };\n\n        /**\n         * Should return true if type has dynamic size by default\n         * such types are \"string\", \"bytes\"\n         *\n         * @method isDynamicType\n         * @param {String} name\n         * @return {Bool} true if is dynamic, otherwise false\n         */\n        SolidityType.prototype.isDynamicType = function () {\n            return false;\n        };\n\n        /**\n         * Should return array of nested types\n         * eg.\n         * \"int[2][3][]\" => [\"[2]\", \"[3]\", \"[]\"]\n         * \"int[] => [\"[]\"]\n         * \"int\" => null\n         *\n         * @method nestedTypes\n         * @param {String} name\n         * @return {Array} array of nested types\n         */\n        SolidityType.prototype.nestedTypes = function (name) {\n            // return list of strings eg. \"[]\", \"[3]\", \"[]\", \"[2]\"\n            return name.match(/(\\[[0-9]*\\])/g);\n        };\n\n        /**\n         * Should be used to encode the value\n         *\n         * @method encode\n         * @param {Object} value\n         * @param {String} name\n         * @return {String} encoded value\n         */\n        SolidityType.prototype.encode = function (value, name,shortAddrMap) {\n            var self = this;\n            if (this.isDynamicArray(name)) {\n\n                return (function () {\n                    var length = value.length;                          // in int\n                    var nestedName = self.nestedName(name);\n\n                    var result = [];\n                    result.push(f.formatInputInt(length).encode());\n\n                    value.forEach(function (v) {\n                        result.push(self.encode(v, nestedName,shortAddrMap));\n                    });\n\n                    return result;\n                })();\n\n            } else if (this.isStaticArray(name)) {\n\n                return (function () {\n                    var length = self.staticArrayLength(name);          // in int\n                    var nestedName = self.nestedName(name);\n\n                    var result = [];\n                    for (var i = 0; i < length; i++) {\n                        result.push(self.encode(value[i], nestedName,shortAddrMap));\n                    }\n\n                    return result;\n                })();\n\n            }\n\n            if (this._inputSeroShortAddrFormatter && shortAddrMap) {\n                return this._inputSeroShortAddrFormatter(shortAddrMap[value], name).encode();\n            }else {\n                return this._inputFormatter(value, name).encode();\n            }\n        };\n\n        /**\n         * Should be used to encode the value,used by sero\n         *\n         * @method encode\n         * @param {Object} value\n         * @param {String} name\n         * @return {String} encoded value\n         */\n        SolidityType.prototype.encodeSero = function (value, name) {\n            var self = this;\n            if (this.isDynamicArray(name) || this.isStaticArray(name)) {\n\n                return (function () {\n                    var nestedName = self.nestedName(name);\n\n                    var result = [];\n                    value.forEach(function (v) {\n                        result.push(self.encodeSero(v, nestedName));\n                    });\n\n                    return result;\n                })();\n\n            }\n            if (self._seroInputFormatter) {\n                return self._seroInputFormatter(value);\n            }\n\n            return value;\n        };\n\n        SolidityType.prototype.address = function (value, name,isHex) {\n\n            var self = this;\n            if (this.isDynamicArray(name) || this.isStaticArray(name)) {\n\n                return (function () {\n                    var nestedName = self.nestedName(name);\n\n                    var result = [];\n                    value.forEach(function (v) {\n                        result = result.concat(self.address(v, nestedName,isHex));\n                    });\n                    return result;\n                })();\n\n            }\n            if (isHex) {\n                return self._inputSeroAddressFormatter(value);\n            }else{\n                return value;\n            }\n\n        };\n\n        SolidityType.prototype.convertAddress = function (value, name,addrMap) {\n            var self = this;\n            if (this.isDynamicArray(name) || this.isStaticArray(name)) {\n\n                return (function () {\n                    var nestedName = self.nestedName(name);\n\n                    var result = [];\n                    value.forEach(function (v) {\n                        result.push(self.convertAddress(v, nestedName,addrMap));\n                    });\n                    return result;\n                })();\n            }\n            if ( self._inputSeroAddressFormatter){\n                if (addrMap.hasOwnProperty(value)) {\n                    return addrMap[value]\n                }else{\n                    return value;\n                }\n            }else{\n                return value;\n            }\n        };\n\n\n        /**\n         * Should be used to decode value from bytes\n         *\n         * @method decode\n         * @param {String} bytes\n         * @param {Number} offset in bytes\n         * @param {String} name type name\n         * @returns {Object} decoded value\n         */\n        SolidityType.prototype.decode = function (bytes, offset, name,mapaddr) {\n            var self = this;\n\n            if (this.isDynamicArray(name)) {\n\n                return (function () {\n                    var arrayOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes\n                    var length = parseInt('0x' + bytes.substr(arrayOffset * 2, 64)); // in int\n                    var arrayStart = arrayOffset + 32; // array starts after length; // in bytes\n\n                    var nestedName = self.nestedName(name);\n                    var nestedStaticPartLength = self.staticPartLength(nestedName);  // in bytes\n                    var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;\n                    var result = [];\n\n                    for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {\n                        result.push(self.decode(bytes, arrayStart + i, nestedName,mapaddr));\n                    }\n\n                    return result;\n                })();\n\n            } else if (this.isStaticArray(name)) {\n\n                return (function () {\n                    var length = self.staticArrayLength(name);                      // in int\n                    var arrayStart = offset;                                        // in bytes\n\n                    var nestedName = self.nestedName(name);\n                    var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes\n                    var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;\n                    var result = [];\n\n                    for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {\n                        result.push(self.decode(bytes, arrayStart + i, nestedName,mapaddr));\n                    }\n\n                    return result;\n                })();\n            } else if (this.isDynamicType(name)) {\n\n                return (function () {\n                    var dynamicOffset = parseInt('0x' + bytes.substr(offset * 2, 64));      // in bytes\n                    var length = parseInt('0x' + bytes.substr(dynamicOffset * 2, 64));      // in bytes\n                    var roundedLength = Math.floor((length + 31) / 32);                     // in int\n                    var param = new SolidityParam(bytes.substr(dynamicOffset * 2, ( 1 + roundedLength) * 64), 0);\n                    return self._outputFormatter(param, name);\n                })();\n            }\n\n            var length = this.staticPartLength(name);\n\n            if (this._outSeroAddressFormatter) {\n                if (mapaddr){\n                    var short = \"0x\"+bytes.substr(offset * 2, length * 2).substr(24);\n                    return mapaddr[short];\n                }else {\n                    return \"0x\"+bytes.substr(offset * 2, length * 2);\n                }\n\n            }else{\n                var param = new SolidityParam(bytes.substr(offset * 2, length * 2));\n                return this._outputFormatter(param, name);\n            }\n\n        };\n\n\n        SolidityType.prototype.decodeAddress = function (bytes, offset, name) {\n            var self = this;\n            if (self._outSeroAddressFormatter){\n                if (this.isDynamicArray(name)) {\n\n                    return (function () {\n                        var arrayOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes\n                        var length = parseInt('0x' + bytes.substr(arrayOffset * 2, 64)); // in int\n                        var arrayStart = arrayOffset + 32; // array starts after length; // in bytes\n\n                        var nestedName = self.nestedName(name);\n                        var nestedStaticPartLength = self.staticPartLength(nestedName);  // in bytes\n                        var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;\n                        var result = [];\n\n                        for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {\n                            result =  result.concat(\"0x\"+self.decode(bytes, arrayStart + i, nestedName).substr(26));\n                        }\n\n                        return result;\n                    })();\n\n                } else if (this.isStaticArray(name)) {\n\n                    return (function () {\n                        var length = self.staticArrayLength(name);                      // in int\n                        var arrayStart = offset;                                        // in bytes\n\n                        var nestedName = self.nestedName(name);\n                        var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes\n                        var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;\n                        var result = [];\n\n                        for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {\n                            result = result.concat(\"0x\"+self.decode(bytes, arrayStart + i, nestedName).substr(26));\n                        }\n\n                        return result;\n                    })();\n                }\n\n                var length = this.staticPartLength(name);\n                return \"0x\"+bytes.substr(offset * 2, length * 2).substr(24);\n            }\n        };\n\n        module.exports = SolidityType;\n\n    },{\"../utils/utils\":21,\"./address\":4,\"./formatters\":9,\"./param\":11}],15:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n        var utils = require('../utils/utils');\n\n\n        /**\n         * SolidityTypeUInt is a prootype that represents uint type\n         * It matches:\n         * uint\n         * uint[]\n         * uint[4]\n         * uint[][]\n         * uint[3][]\n         * uint[][6][], ...\n         * uint32\n         * uint64[]\n         * uint8[4]\n         * uint256[][]\n         * uint[3][]\n         * uint64[][6][], ...\n         */\n        var SolidityTypeUInt = function () {\n            this._inputFormatter = f.formatInputInt;\n            this._outputFormatter = f.formatOutputUInt;\n            this._seroInputFormatter =  function (value){\n                return utils.toBigNumber(value).toString(10);\n            }\n        };\n\n        SolidityTypeUInt.prototype = new SolidityType({});\n        SolidityTypeUInt.prototype.constructor = SolidityTypeUInt;\n\n        SolidityTypeUInt.prototype.isType = function (name) {\n            return !!name.match(/^uint([0-9]*)?(\\[([0-9]*)\\])*$/);\n        };\n\n        module.exports = SolidityTypeUInt;\n\n    },{\"../utils/utils\":21,\"./formatters\":9,\"./type\":14}],16:[function(require,module,exports){\n        var f = require('./formatters');\n        var SolidityType = require('./type');\n\n        /**\n         * SolidityTypeUReal is a prootype that represents ureal type\n         * It matches:\n         * ureal\n         * ureal[]\n         * ureal[4]\n         * ureal[][]\n         * ureal[3][]\n         * ureal[][6][], ...\n         * ureal32\n         * ureal64[]\n         * ureal8[4]\n         * ureal256[][]\n         * ureal[3][]\n         * ureal64[][6][], ...\n         */\n        var SolidityTypeUReal = function () {\n            this._inputFormatter = f.formatInputReal;\n            this._outputFormatter = f.formatOutputUReal;\n        };\n\n        SolidityTypeUReal.prototype = new SolidityType({});\n        SolidityTypeUReal.prototype.constructor = SolidityTypeUReal;\n\n        SolidityTypeUReal.prototype.isType = function (name) {\n            return !!name.match(/^ureal([0-9]*)?(\\[([0-9]*)\\])*$/);\n        };\n\n        module.exports = SolidityTypeUReal;\n\n    },{\"./formatters\":9,\"./type\":14}],17:[function(require,module,exports){\n        /**\n         * @file base58.js\n         * @date 2018\n         */\n\n        var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n        var ALPHABET_MAP = {}\n        for (var i = 0; i < ALPHABET.length; i++) {\n            ALPHABET_MAP[ALPHABET.charAt(i)] = i\n        }\n        var BASE = 58\n\n\n        /**\n         * Convert a byte array to a base58 string\n         *\n         * @method bytesToBase58\n         * @param {Array} bytes\n         * @return {String} the base58 string\n         */\n        function encode(buffer) {\n            if (buffer.length === 0) return ''\n\n            var i, j, digits = [0]\n            for (i = 0; i < buffer.length; i++) {\n                for (j = 0; j < digits.length; j++) digits[j] <<= 8\n\n                digits[0] += buffer[i]\n\n                var carry = 0\n                for (j = 0; j < digits.length; ++j) {\n                    digits[j] += carry\n\n                    carry = (digits[j] / BASE) | 0\n                    digits[j] %= BASE\n                }\n\n                while (carry) {\n                    digits.push(carry % BASE)\n\n                    carry = (carry / BASE) | 0\n                }\n            }\n\n            // deal with leading zeros\n            for (i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) digits.push(0)\n\n            return digits.reverse().map(function (digit) {\n                return ALPHABET[digit]\n            }).join('')\n        }\n\n        /**\n         * Convert a base58 string to a byte array\n         *\n         * @method decode\n         * @param {string} base58\n         * @return {Array} the byte array\n         */\n        function decode(string) {\n            if (!string || string.length === 0) return []\n\n            var i, j, bytes = [0]\n            for (i = 0; i < string.length; i++) {\n                var c = string[i]\n                if (!(c in ALPHABET_MAP)) throw new Error('Non-base58 character')\n\n                for (j = 0; j < bytes.length; j++) bytes[j] *= BASE\n                bytes[0] += ALPHABET_MAP[c]\n\n                var carry = 0\n                for (j = 0; j < bytes.length; ++j) {\n                    bytes[j] += carry\n\n                    carry = bytes[j] >> 8\n                    bytes[j] &= 0xff\n                }\n\n                while (carry) {\n                    bytes.push(carry & 0xff)\n\n                    carry >>= 8\n                }\n            }\n\n            // deal with leading zeros\n            for (i = 0; string[i] === '1' && i < string.length - 1; i++) bytes.push(0)\n\n            return bytes.reverse()\n        }\n\n        module.exports = {\n            decode: decode,\n            encode: encode,\n        };\n\n    },{}],18:[function(require,module,exports){\n        'use strict';\n\n// go env doesn't have and need XMLHttpRequest\n        if (typeof XMLHttpRequest === 'undefined') {\n            exports.XMLHttpRequest = {};\n        } else {\n            exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line\n        }\n\n\n    },{}],19:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file config.js\n         * @authors:\n         *   Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        /**\n         * Utils\n         *\n         * @module utils\n         */\n\n        /**\n         * Utility functions\n         *\n         * @class [utils] config\n         * @constructor\n         */\n\n\n/// required to define SERO_BIGNUMBER_ROUNDING_MODE:q\n        var BigNumber = require('bignumber.js');\n\n        var SERO_UNITS = [\n            'ta',\n            'kta',\n            'Mta',\n            'Gta',\n            'szabo',\n            'finney',\n            'femtosero',\n            'picosero',\n            'nanosero',\n            'microsero',\n            'millisero',\n            'nano',\n            'micro',\n            'milli',\n            'sero',\n            'grand',\n            'Msero',\n            'Gsero',\n            'Tsero',\n            'Psero',\n            'Esero',\n            'Zsero',\n            'Ysero',\n            'Nsero',\n            'Dsero',\n            'Vsero',\n            'Usero'\n        ];\n\n        module.exports = {\n            SERO_PADDING: 32,\n            SERO_SIGNATURE_LENGTH: 4,\n            SERO_UNITS: SERO_UNITS,\n            SERO_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN },\n            SERO_POLLING_TIMEOUT: 1000/2,\n            defaultBlock: 'latest',\n            defaultCurrency: 'sero',\n            defaultAccount: undefined\n        };\n\n\n    },{\"bignumber.js\":\"bignumber.js\"}],20:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file sha3.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var CryptoJS = require('crypto-js');\n        var sha3 = require('crypto-js/sha3');\n\n        module.exports = function (value, options) {\n            if (options && options.encoding === 'hex') {\n                if (value.length > 2 && value.substr(0, 2) === '0x') {\n                    value = value.substr(2);\n                }\n                value = CryptoJS.enc.Hex.parse(value);\n            }\n\n            return sha3(value, {\n                outputLength: 256\n            }).toString();\n        };\n\n\n    },{\"crypto-js\":60,\"crypto-js/sha3\":81}],21:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file utils.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        /**\n         * Utils\n         *\n         * @module utils\n         */\n\n        /**\n         * Utility functions\n         *\n         * @class [utils] utils\n         * @constructor\n         */\n\n\n        var BigNumber = require('bignumber.js');\n        var sha3 = require('./sha3.js');\n        var utf8 = require('utf8');\n        var base58 = require('./base58');\n\n\n\n        var unitMap = {\n            'noether':      '0',\n            'ta':           '1',\n            'kta':          '1000',\n            'Kta':          '1000',\n            'babbage':      '1000',\n            'femtoether':   '1000',\n            'mta':          '1000000',\n            'Mta':          '1000000',\n            'lovelace':     '1000000',\n            'picoether':    '1000000',\n            'gta':          '1000000000',\n            'Gta':          '1000000000',\n            'shannon':      '1000000000',\n            'nanosero':     '1000000000',\n            'nano':         '1000000000',\n            'szabo':        '1000000000000',\n            'microsero':    '1000000000000',\n            'micro':        '1000000000000',\n            'finney':       '1000000000000000',\n            'millisero':    '1000000000000000',\n            'milli':        '1000000000000000',\n            'sero':         '1000000000000000000',\n            'SERO':         '1000000000000000000',\n            'ksero':        '1000000000000000000000',\n            'gsero':        '1000000000000000000000',\n            'msero':        '1000000000000000000000000',\n            'gsero':        '1000000000000000000000000000',\n        };\n\n        /**\n         * Should be called to pad string to expected length\n         *\n         * @method padLeft\n         * @param {String} string to be padded\n         * @param {Number} characters that result string should have\n         * @param {String} sign, by default 0\n         * @returns {String} right aligned string\n         */\n        var padLeft = function (string, chars, sign) {\n            return new Array(chars - string.length + 1).join(sign ? sign : \"0\") + string;\n        };\n\n        /**\n         * Should be called to pad string to expected length\n         *\n         * @method padRight\n         * @param {String} string to be padded\n         * @param {Number} characters that result string should have\n         * @param {String} sign, by default 0\n         * @returns {String} right aligned string\n         */\n        var padRight = function (string, chars, sign) {\n            return string + (new Array(chars - string.length + 1).join(sign ? sign : \"0\"));\n        };\n\n        /**\n         * Should be called to get utf8 from it's hex representation\n         *\n         * @method toUtf8\n         * @param {String} string in hex\n         * @returns {String} ascii string representation of hex value\n         */\n        var toUtf8 = function (hex) {\n// Find termination\n            var str = \"\";\n            var i = 0, l = hex.length;\n            if (hex.substring(0, 2) === '0x') {\n                i = 2;\n            }\n            for (; i < l; i += 2) {\n                var code = parseInt(hex.substr(i, 2), 16);\n                if (code === 0)\n                    break;\n                str += String.fromCharCode(code);\n            }\n\n            return utf8.decode(str);\n        };\n\n        /**\n         * Should be called to get ascii from it's hex representation\n         *\n         * @method toAscii\n         * @param {String} string in hex\n         * @returns {String} ascii string representation of hex value\n         */\n        var toAscii = function (hex) {\n// Find termination\n            var str = \"\";\n            var i = 0, l = hex.length;\n            if (hex.substring(0, 2) === '0x') {\n                i = 2;\n            }\n            for (; i < l; i += 2) {\n                var code = parseInt(hex.substr(i, 2), 16);\n                str += String.fromCharCode(code);\n            }\n\n            return str;\n        };\n\n        /**\n         * Should be called to get hex representation (prefixed by 0x) of utf8 string\n         *\n         * @method fromUtf8\n         * @param {String} string\n         * @param {Boolean} allowZero to convert code point zero to 00 instead of end of string\n         * @returns {String} hex representation of input string\n         */\n        var fromUtf8 = function (str, allowZero) {\n            str = utf8.encode(str);\n            var hex = \"\";\n            for (var i = 0; i < str.length; i++) {\n                var code = str.charCodeAt(i);\n                if (code === 0) {\n                    if (allowZero) {\n                        hex += '00';\n                    } else {\n                        break;\n                    }\n                } else {\n                    var n = code.toString(16);\n                    hex += n.length < 2 ? '0' + n : n;\n                }\n            }\n\n            return \"0x\" + hex;\n        };\n\n        /**\n         * Should be called to get hex representation (prefixed by 0x) of ascii string\n         *\n         * @method fromAscii\n         * @param {String} string\n         * @param {Number} optional padding\n         * @returns {String} hex representation of input string\n         */\n        var fromAscii = function (str) {\n            var hex = \"\";\n            for (var i = 0; i < str.length; i++) {\n                var code = str.charCodeAt(i);\n                var n = code.toString(16);\n                hex += n.length < 2 ? '0' + n : n;\n            }\n\n            return \"0x\" + hex;\n        };\n\n        /**\n         * Should be used to create full function/event name from json abi\n         *\n         * @method transformToFullName\n         * @param {Object} json-abi\n         * @return {String} full fnction/event name\n         */\n        var transformToFullName = function (json) {\n            if (json.name.indexOf('(') !== -1) {\n                return json.name;\n            }\n\n            var typeName = json.inputs.map(function (i) {\n                return i.type;\n            }).join();\n            return json.name + '(' + typeName + ')';\n        };\n\n        /**\n         * Should be called to get display name of contract function\n         *\n         * @method extractDisplayName\n         * @param {String} name of function/event\n         * @returns {String} display name for function/event eg. multiply(uint256) -> multiply\n         */\n        var extractDisplayName = function (name) {\n            var stBracket = name.indexOf('(');\n            var endBracket = name.indexOf(')');\n            return (stBracket !== -1 && endBracket !== -1) ? name.substr(0, stBracket) : name;\n        };\n\n        /**\n         * Should be called to get type name of contract function\n         *\n         * @method extractTypeName\n         * @param {String} name of function/event\n         * @returns {String} type name for function/event eg. multiply(uint256) -> uint256\n         */\n        var extractTypeName = function (name) {\n            var stBracket = name.indexOf('(');\n            var endBracket = name.indexOf(')');\n            return (stBracket !== -1 && endBracket !== -1) ? name.substr(stBracket + 1, endBracket - stBracket - 1).replace(' ', '') : \"\";\n        };\n\n        /**\n         * Converts value to it's decimal representation in string\n         *\n         * @method toDecimal\n         * @param {String|Number|BigNumber}\n         * @return {String}\n         */\n        var toDecimal = function (value) {\n            return toBigNumber(value).toNumber();\n        };\n\n        /**\n         * Converts value to it's hex representation\n         *\n         * @method fromDecimal\n         * @param {String|Number|BigNumber}\n         * @return {String}\n         */\n        var fromDecimal = function (value) {\n            var number = toBigNumber(value);\n            var result = number.toString(16);\n\n            return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result;\n        };\n\n        /**\n         * Auto converts any given value into it's hex representation.\n         *\n         * And even stringifys objects before.\n         *\n         * @method toHex\n         * @param {String|Number|BigNumber|Object}\n         * @return {String}\n         */\n        var toHex = function (val) {\n            /*jshint maxcomplexity: 8 */\n\n            if (isBoolean(val))\n                return fromDecimal(+val);\n\n            if (isBigNumber(val))\n                return fromDecimal(val);\n\n            if (typeof val === 'object')\n                return fromUtf8(JSON.stringify(val));\n\n            // if its a negative number, pass it through fromDecimal\n            if (isString(val)) {\n                if (val.indexOf('-0x') === 0)\n                    return fromDecimal(val);\n                else if (val.indexOf('0x') === 0)\n                    return val;\n                else if (!isFinite(val))\n                    return fromUtf8(val, 1);\n            }\n\n            return fromDecimal(val);\n        };\n\n        /**\n         * Convert a byte array to a hex string\n         *\n         * Note: Implementation from crypto-js\n         *\n         * @method bytesToHex\n         * @param {Array} bytes\n         * @return {String} the hex string\n         */\n        var bytesToHex = function (bytes) {\n            for (var hex = [], i = 0; i < bytes.length; i++) {\n                /* jshint ignore:start */\n                hex.push((bytes[i] >>> 4).toString(16));\n                hex.push((bytes[i] & 0xF).toString(16));\n                /* jshint ignore:end */\n            }\n            return '0x' + hex.join(\"\");\n        };\n\n        /**\n         * Convert a byte array to a base58 string\n         *\n         * @method bytesToBase58\n         * @param {Array} bytes\n         * @return {String} the base58 string\n         */\n        var bytesToBase58 = function (bytes) {\n            return base58.encode(bytes);\n        };\n\n        /**\n         * Convert a base58 string to a byte array\n         *\n         * @method base58ToBytes\n         * @param {String} the base58 string\n         * @return {Array} bytes\n         */\n        var base58ToBytes = function (bs58) {\n            return base58.decode(bs58);\n        }\n\n        /**\n         * Check if string is HEX, requires a 0x in front\n         *\n         * @method isHexStrict\n         * @param {String} hex to be checked\n         * @returns {Boolean}\n         */\n        var isHexStrict = function (hex) {\n            return (isString(hex) || isNumber(hex)) && /^(-0x|0x)?[0-9a-f]*$/i.test(hex);\n        };\n\n        /**\n         * Convert a hex string to a byte array\n         *\n         * Note: Implementation from crypto-js\n         *\n         * @method hexToBytes\n         * @param {string} hex\n         * @return {Array} the byte array\n         */\n        var hexToBytes = function (hex) {\n            hex = hex.toString(16);\n\n            hex = hex.replace(/^0x/i, '');\n\n            for (var bytes = [], c = 0; c < hex.length; c += 2)\n                bytes.push(parseInt(hex.substr(c, 2), 16));\n            return bytes;\n        };\n\n\n        /**\n         * Returns value of unit in Ta\n         *\n         * @method getValueOfUnit\n         * @param {String} unit the unit to convert to, default ether\n         * @returns {BigNumber} value of the unit (in Wei)\n         * @throws error if the unit is not correct:w\n         */\n        var getValueOfUnit = function (unit) {\n            unit = unit ? unit.toLowerCase() : 'sero';\n            var unitValue = unitMap[unit];\n            if (unitValue === undefined) {\n                throw new Error('This unit doesn\\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2));\n            }\n            return new BigNumber(unitValue, 10);\n        };\n\n        /**\n         * Takes a number of Ta and converts it to any other sero unit.\n         *\n         *\n         * @method fromTa\n         * @param {Number|String} number can be a number, number string or a HEX of a decimal\n         * @param {String} unit the unit to convert to, default ether\n         * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number\n         */\n        var fromTa = function (number, unit) {\n            var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit));\n\n            return isBigNumber(number) ? returnValue : returnValue.toString(10);\n        };\n\n        /**\n         * Takes a number of a unit and converts it to ta.\n         * @method toTa\n         * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal\n         * @param {String} unit the unit to convert from, default ether\n         * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number\n         */\n        var toTa = function (number, unit) {\n            var returnValue = toBigNumber(number).times(getValueOfUnit(unit));\n\n            return isBigNumber(number) ? returnValue : returnValue.toString(10);\n        };\n\n        /**\n         * Takes an input and transforms it into an bignumber\n         *\n         * @method toBigNumber\n         * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber\n         * @return {BigNumber} BigNumber\n         */\n        var toBigNumber = function (number) {\n            /*jshint maxcomplexity:5 */\n            number = number || 0;\n            if (isBigNumber(number))\n                return number;\n\n            if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) {\n                return new BigNumber(number.replace('0x', ''), 16);\n            }\n\n            return new BigNumber(number.toString(10), 10);\n        };\n\n        /**\n         * Takes and input transforms it into bignumber and if it is negative value, into two's complement\n         *\n         * @method toTwosComplement\n         * @param {Number|String|BigNumber}\n         * @return {BigNumber}\n         */\n        var toTwosComplement = function (number) {\n            var bigNumber = toBigNumber(number).round();\n            if (bigNumber.lessThan(0)) {\n                return new BigNumber(\"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\", 16).plus(bigNumber).plus(1);\n            }\n            return bigNumber;\n        };\n\n        /**\n         * Checks if the given string is strictly an address\n         *\n         * @method isStrictAddress\n         * @param {String} address the given base58 adress\n         * @return {Boolean}\n         */\n        var isStrictAddress = function (address) {\n\n            return paramAddress(address);\n        };\n\n        var paramAddress = function (addr) {\n            if (/^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/i.test(addr)) {\n                bytes = base58ToBytes(addr);\n                if (bytes.length !== 96 && bytes.length !=64) {\n                    return false;\n                }\n                return true;\n            } else {\n                return false;\n            }\n        };\n\n        /**\n         * Checks if the given string is an address\n         *\n         * @method isAddress\n         * @param {String} address the given HEX adress\n         * @return {Boolean}\n         */\n        var isAddress = function (address) {\n            return isStrictAddress(address)\n        };\n\n        /**\n         * Checks if the given string is an pkr address\n         *\n         * @method isAddress\n         * @param {String} address the given HEX adress\n         * @return {Boolean}\n         */\n        var isToAddress = function (address) {\n            return paramAddress(address)\n        };\n\n        /**\n         * Transforms given string to valid 20 bytes-length addres with 0x prefix\n         *\n         * @method toAddress\n         * @param {String} address\n         * @return {String} formatted address\n         */\n        var toAddress = function (address) {\n            if (isStrictAddress(address)) {\n                return address;\n            }\n        };\n\n        /**\n         * Returns true if object is BigNumber, otherwise false\n         *\n         * @method isBigNumber\n         * @param {Object}\n         * @return {Boolean}\n         */\n        var isBigNumber = function (object) {\n            return object instanceof BigNumber ||\n                (object && object.constructor && object.constructor.name === 'BigNumber');\n        };\n\n        /**\n         * Returns true if object is string, otherwise false\n         *\n         * @method isString\n         * @param {Object}\n         * @return {Boolean}\n         */\n        var isString = function (object) {\n            return typeof object === 'string' ||\n                (object && object.constructor && object.constructor.name === 'String');\n        };\n\n        /**\n         * Returns true if object is function, otherwise false\n         *\n         * @method isFunction\n         * @param {Object}\n         * @return {Boolean}\n         */\n        var isFunction = function (object) {\n            return typeof object === 'function';\n        };\n\n        /**\n         * Returns true if object is Objet, otherwise false\n         *\n         * @method isObject\n         * @param {Object}\n         * @return {Boolean}\n         */\n        var isObject = function (object) {\n            return object !== null && !(Array.isArray(object)) && typeof object === 'object';\n        };\n\n        /**\n         * Returns true if object is boolean, otherwise false\n         *\n         * @method isBoolean\n         * @param {Object}\n         * @return {Boolean}\n         */\n        var isBoolean = function (object) {\n            return typeof object === 'boolean';\n        };\n\n        /**\n         * Returns true if object is array, otherwise false\n         *\n         * @method isArray\n         * @param {Object}\n         * @return {Boolean}\n         */\n        var isArray = function (object) {\n            return Array.isArray(object);\n        };\n\n        /**\n         * Returns true if given string is valid json object\n         *\n         * @method isJson\n         * @param {String}\n         * @return {Boolean}\n         */\n        var isJson = function (str) {\n            try {\n                return !!JSON.parse(str);\n            } catch (e) {\n                return false;\n            }\n        };\n\n        /**\n         * Returns true if given string is a valid Serocash block header bloom.\n         *\n         * @method isBloom\n         * @param {String} hex encoded bloom filter\n         * @return {Boolean}\n         */\n        var isBloom = function (bloom) {\n            if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) {\n                return false;\n            } else if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) {\n                return true;\n            }\n            return false;\n        };\n\n        /**\n         * Returns true if given string is a valid log topic.\n         *\n         * @method isTopic\n         * @param {String} hex encoded topic\n         * @return {Boolean}\n         */\n        var isTopic = function (topic) {\n            if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) {\n                return false;\n            } else if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) {\n                return true;\n            }\n            return false;\n        };\n\n        function bytesToString(array) {\n            return String.fromCharCode.apply(String, array);\n        }\n\n\n        var addressToHex = function (addr) {\n            var bs58Str = addressToBase58(addr);\n            var bs = base58ToBytes(bs58Str);\n            return bytesToHex(bs);\n        };\n\n        var base58ToHex = function (value) {\n            if (/^[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]+$/i.test(value)) {\n                bytes = base58ToBytes(value)\n                return bytesToHex(bytes)\n            }else{\n                throw new Error(\"not base58 string\")\n            }\n        };\n\n        var hexToBase58 = function (value) {\n            b=hexToBytes(value)\n            return bytesToBase58(b)\n        };\n\n\n        var isNewAddress =  function (addr) {\n            var bs = base58ToBytes(addr);\n            if (bs.length!=64 && bs.length!=96) {\n                throw new Error(\"invalid address\")\n            }\n            return (bs[bs.length - 1] & (0x1 << 6)) !== 0;\n        }\n\n\n\n\n\n        module.exports = {\n            padLeft: padLeft,\n            padRight: padRight,\n            toHex: toHex,\n            toDecimal: toDecimal,\n            fromDecimal: fromDecimal,\n            toUtf8: toUtf8,\n            toAscii: toAscii,\n            fromUtf8: fromUtf8,\n            fromAscii: fromAscii,\n            transformToFullName: transformToFullName,\n            extractDisplayName: extractDisplayName,\n            extractTypeName: extractTypeName,\n            toTa: toTa,\n            fromTa: fromTa,\n            toBigNumber: toBigNumber,\n            toTwosComplement: toTwosComplement,\n            toAddress: toAddress,\n            isBigNumber: isBigNumber,\n            isStrictAddress: isStrictAddress,\n            paramAddress: paramAddress,\n            isAddress: isAddress,\n            isToAddress: isToAddress,\n            isFunction: isFunction,\n            isString: isString,\n            isObject: isObject,\n            isBoolean: isBoolean,\n            isArray: isArray,\n            isJson: isJson,\n            isBloom: isBloom,\n            isTopic: isTopic,\n            isHexStrict: isHexStrict,\n            bytesToHex: bytesToHex,\n            hexToBytes: hexToBytes,\n            bytesToBase58: bytesToBase58,\n            base58ToBytes: base58ToBytes,\n            bytesToString: bytesToString,\n            addressToHex:addressToHex,\n            base58ToHex:base58ToHex,\n            hexToBase58:hexToBase58,\n            isNewAddress:isNewAddress,\n        };\n\n    },{\"./base58\":17,\"./sha3.js\":20,\"bignumber.js\":\"bignumber.js\",\"utf8\":87}],22:[function(require,module,exports){\n        module.exports={\n            \"version\": \"0.3.2\"\n        }\n\n    },{}],23:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file web3.js\n         * @authors:\n         *   Jeffrey Wilcke <jeff@ethdev.com>\n         *   Marek Kotewicz <marek@ethdev.com>\n         *   Marian Oancea <marian@ethdev.com>\n         *   Fabian Vogelsteller <fabian@ethdev.com>\n         *   Gav Wood <g@ethdev.com>\n         * @date 2014\n         */\n\n        var RequestManager = require('./web3/requestmanager');\n        var Iban = require('./web3/iban');\n        var Sero = require('./web3/methods/sero');\n        var Exchange = require('./web3/methods/exchange');\n        var Stake = require('./web3/methods/stake');\n        var DB = require('./web3/methods/db');\n        var Net = require('./web3/methods/net');\n        var Personal = require('./web3/methods/personal');\n        var Settings = require('./web3/settings');\n        var version = require('./version.json');\n        var utils = require('./utils/utils');\n        var sha3 = require('./utils/sha3');\n        var extend = require('./web3/extend');\n        var Batch = require('./web3/batch');\n        var Property = require('./web3/property');\n        var HttpProvider = require('./web3/httpprovider');\n        var IpcProvider = require('./web3/ipcprovider');\n        var BigNumber = require('bignumber.js');\n\n\n\n        function Web3 (provider) {\n            this._requestManager = new RequestManager(provider);\n            this.currentProvider = provider;\n            this.sero = new Sero(this);\n            this.exchange = new Exchange(this);\n            this.stake=new Stake(this);\n            this.db = new DB(this);\n            this.net = new Net(this);\n            this.personal = new Personal(this);\n            this.settings = new Settings();\n            this.version = {\n                api: version.version\n            };\n            this.providers = {\n                HttpProvider: HttpProvider,\n                IpcProvider: IpcProvider\n            };\n            this._extend = extend(this);\n            this._extend({\n                properties: properties()\n            });\n        }\n// expose providers on the class\n        Web3.providers = {\n            HttpProvider: HttpProvider,\n            IpcProvider: IpcProvider\n        };\n\n        Web3.prototype.setProvider = function (provider) {\n            this._requestManager.setProvider(provider);\n            this.currentProvider = provider;\n        };\n\n        Web3.prototype.reset = function (keepIsSyncing) {\n            this._requestManager.reset(keepIsSyncing);\n            this.settings = new Settings();\n        };\n\n        Web3.prototype.BigNumber = BigNumber;\n        Web3.prototype.toHex = utils.toHex;\n        Web3.prototype.toAscii = utils.toAscii;\n        Web3.prototype.toUtf8 = utils.toUtf8;\n        Web3.prototype.fromAscii = utils.fromAscii;\n        Web3.prototype.fromUtf8 = utils.fromUtf8;\n        Web3.prototype.toDecimal = utils.toDecimal;\n        Web3.prototype.fromDecimal = utils.fromDecimal;\n        Web3.prototype.toBigNumber = utils.toBigNumber;\n        Web3.prototype.toTa = utils.toTa;\n        Web3.prototype.fromTa = utils.fromTa;\n        Web3.prototype.isAddress = utils.isAddress;\n        Web3.prototype.isToAddress = utils.isToAddress;\n        Web3.prototype.padLeft = utils.padLeft;\n        Web3.prototype.padRight = utils.padRight;\n        Web3.prototype.addressToHex = utils.addressToHex;\n        Web3.prototype.base58ToHex = utils.base58ToHex;\n        Web3.prototype.hexToBase58 = utils.hexToBase58;\n        Web3.prototype.isNewAddress = utils.isNewAddress;\n\n        Web3.prototype.sha3 = function(string, options) {\n            return '0x' + sha3(string, options);\n        };\n\n        /**\n         * Transforms direct icap to address\n         */\n        Web3.prototype.fromICAP = function (icap) {\n            var iban = new Iban(icap);\n            return iban.address();\n        };\n\n        var properties = function () {\n            return [\n                new Property({\n                    name: 'version.node',\n                    getter: 'web3_clientVersion'\n                }),\n                new Property({\n                    name: 'version.network',\n                    getter: 'net_version',\n                    inputFormatter: utils.toDecimal\n                }),\n                new Property({\n                    name: 'version.seroereum',\n                    getter: 'sero_protocolVersion',\n                    inputFormatter: utils.toDecimal\n                }),\n                new Property({\n                    name: 'version.whisper',\n                    getter: 'shh_version',\n                    inputFormatter: utils.toDecimal\n                })\n            ];\n        };\n\n        Web3.prototype.isConnected = function(){\n            return (this.currentProvider && this.currentProvider.isConnected());\n        };\n\n        Web3.prototype.createBatch = function () {\n            return new Batch(this);\n        };\n\n        module.exports = Web3;\n\n\n    },{\"./utils/sha3\":20,\"./utils/utils\":21,\"./version.json\":22,\"./web3/batch\":25,\"./web3/extend\":29,\"./web3/httpprovider\":33,\"./web3/iban\":34,\"./web3/ipcprovider\":35,\"./web3/methods/db\":38,\"./web3/methods/exchange\":39,\"./web3/methods/net\":40,\"./web3/methods/personal\":41,\"./web3/methods/sero\":42,\"./web3/methods/stake\":43,\"./web3/property\":46,\"./web3/requestmanager\":47,\"./web3/settings\":48,\"bignumber.js\":\"bignumber.js\"}],24:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file allevents.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2014\n         */\n\n        var sha3 = require('../utils/sha3');\n        var SolidityEvent = require('./event');\n        var formatters = require('./formatters');\n        var utils = require('../utils/utils');\n        var Filter = require('./filter');\n        var watches = require('./methods/watches');\n\n        var AllSolidityEvents = function (sero, json, address) {\n            this._requestManager = sero.__requestManager;\n            this._json = json;\n            this._address = address;\n            this._sero =sero;\n        };\n\n        AllSolidityEvents.prototype.encode = function (options) {\n            options = options || {};\n            var result = {};\n\n            ['fromBlock', 'toBlock'].filter(function (f) {\n                return options[f] !== undefined;\n            }).forEach(function (f) {\n                result[f] = formatters.inputBlockNumberFormatter(options[f]);\n            });\n\n            result.address = this._address;\n\n            return result;\n        };\n\n        AllSolidityEvents.prototype.decode = function (data) {\n            data.data = data.data || '';\n\n\n            var eventTopic = (utils.isArray(data.topics) && utils.isString(data.topics[0])) ? data.topics[0].slice(2) : '';\n            var match = this._json.filter(function (j) {\n                return eventTopic === sha3(utils.transformToFullName(j));\n            })[0];\n\n            if (!match) { // cannot find matching event?\n                return formatters.outputLogFormatter(data);\n            }\n\n            var event = new SolidityEvent(this._requestManager, match, this._address);\n            return event.decode(data);\n        };\n\n        AllSolidityEvents.prototype.execute = function (options, callback) {\n\n            if (utils.isFunction(arguments[arguments.length - 1])) {\n                callback = arguments[arguments.length - 1];\n                if(arguments.length === 1)\n                    options = null;\n            }\n\n            var o = this.encode(options);\n            var formatter = this.decode.bind(this);\n            return new Filter(o, 'sero', this._requestManager, watches.sero(), formatter, callback);\n        };\n\n        AllSolidityEvents.prototype.attachToContract = function (contract) {\n            var execute = this.execute.bind(this);\n            contract.allEvents = execute;\n        };\n\n        module.exports = AllSolidityEvents;\n\n\n    },{\"../utils/sha3\":20,\"../utils/utils\":21,\"./event\":28,\"./filter\":30,\"./formatters\":31,\"./methods/watches\":44}],25:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file batch.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var Jsonrpc = require('./jsonrpc');\n        var errors = require('./errors');\n\n        var Batch = function (web3) {\n            this.requestManager = web3._requestManager;\n            this.requests = [];\n        };\n\n        /**\n         * Should be called to add create new request to batch request\n         *\n         * @method add\n         * @param {Object} jsonrpc requet object\n         */\n        Batch.prototype.add = function (request) {\n            this.requests.push(request);\n        };\n\n        /**\n         * Should be called to execute batch request\n         *\n         * @method execute\n         */\n        Batch.prototype.execute = function () {\n            var requests = this.requests;\n            this.requestManager.sendBatch(requests, function (err, results) {\n                results = results || [];\n                requests.map(function (request, index) {\n                    return results[index] || {};\n                }).forEach(function (result, index) {\n                    if (requests[index].callback) {\n\n                        if (!Jsonrpc.isValidResponse(result)) {\n                            return requests[index].callback(errors.InvalidResponse(result));\n                        }\n\n                        requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result));\n                    }\n                });\n            });\n        };\n\n        module.exports = Batch;\n\n\n    },{\"./errors\":27,\"./jsonrpc\":36}],26:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file contract.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2014\n         */\n\n        var utils = require('../utils/utils');\n        var coder = require('../solidity/coder');\n        var SolidityEvent = require('./event');\n        var SolidityFunction = require('./function');\n        var AllEvents = require('./allevents');\n        var errors = require('./errors');\n\n        /**\n         * Should be called to encode constructor params\n         *\n         * @method encodeConstructorParams\n         * @param {Array} abi\n         * @param {Array} constructor params\n         */\n        var encodeConstructorParams = function (abi, params,shortAddrMap) {\n            return abi.filter(function (json) {\n                return json.type === 'constructor' && json.inputs.length === params.length;\n            }).map(function (json) {\n                return json.inputs.map(function (input) {\n                    return input.type;\n                });\n            }).map(function (types) {\n                return coder.encodeParams(types, params,shortAddrMap);\n            })[0] || '';\n        };\n\n        var encodeConstructorPrefix = function (abi, params,rand) {\n            return abi.filter(function (json) {\n                return json.type === 'constructor' && json.inputs.length === params.length;\n            }).map(function (json) {\n                return json.inputs.map(function (input) {\n                    return input.type;\n                });\n            }).map(function (types) {\n                return coder.addressPrefix(types, params,rand);\n            })[0] || coder.addressPrefix([], [],rand);\n        };\n\n        var opArgs = function (abi, params,rand,sero,dy,callback) {\n            if (callback){\n                var types = abi.filter(function (json) {\n                    return json.type === 'constructor' && json.inputs.length === params.length;\n                }).map(function (json) {\n                    return json.inputs.map(function (input) {\n                        return input.type;\n                    });\n                });\n                if (types&&types[0]){\n                    coder.opParams(types[0], params,rand,sero,dy,callback);\n                }else {\n                    coder.opParams([], [],rand,sero,dy,callback)\n                }\n\n            }else{\n                return abi.filter(function (json) {\n                    return json.type === 'constructor' && json.inputs.length === params.length;\n                }).map(function (json) {\n                    return json.inputs.map(function (input) {\n                        return input.type;\n                    });\n                }).map(function (types) {\n                    return coder.opParams(types, params,rand,sero,dy);\n                })[0] || coder.opParams([], [],rand,sero,dy);\n            }\n\n        };\n\n\n\n        /**\n         * Should be called to add functions to contract object\n         *\n         * @method addFunctionsToContract\n         * @param {Contract} contract\n         * @param {Array} abi\n         */\n        var addFunctionsToContract = function (contract,newAbi) {\n            contract.abi.filter(function (json) {\n                return json.type === 'function';\n            }).map(function (json) {\n                return new SolidityFunction(contract._sero, json, contract.address,newAbi);\n            }).forEach(function (f) {\n                f.attachToContract(contract);\n            });\n        };\n\n        /**\n         * Should be called to add events to contract object\n         *\n         * @method addEventsToContract\n         * @param {Contract} contract\n         * @param {Array} abi\n         */\n        var addEventsToContract = function (contract) {\n            var events = contract.abi.filter(function (json) {\n                return json.type === 'event';\n            });\n\n            var All = new AllEvents(contract._sero, events, contract.address);\n            All.attachToContract(contract);\n\n            events.map(function (json) {\n                return new SolidityEvent(contract._sero, json, contract.address);\n            }).forEach(function (e) {\n                e.attachToContract(contract);\n            });\n        };\n\n\n        /**\n         * Should be called to check if the contract gets properly deployed on the blockchain.\n         *\n         * @method checkForContractAddress\n         * @param {Object} contract\n         * @param {Function} callback\n         * @returns {Undefined}\n         */\n        var checkForContractAddress = function(contract, callback){\n            var count = 0,\n                callbackFired = false;\n\n            // wait for receipt\n            var filter = contract._sero.filter('latest', function(e){\n                if (!e && !callbackFired) {\n\n                    count++;\n                    // stop watching after 50 blocks (timeout)\n                    if (count > 50) {\n\n                        filter.stopWatching(function() {});\n                        callbackFired = true;\n\n                        if (callback)\n                            callback(new Error('Contract transaction couldn\\'t be found after 50 blocks'));\n                        else\n                            throw new Error('Contract transaction couldn\\'t be found after 50 blocks');\n\n\n                    } else {\n\n                        contract._sero.getTransactionReceipt(contract.transactionHash, function(e, receipt){\n                            if(receipt && receipt.blockHash && !callbackFired) {\n\n                                contract._sero.getCode(receipt.contractAddress, function(e, code){\n                                    /*jshint maxcomplexity: 6 */\n\n                                    if(callbackFired || !code)\n                                        return;\n\n                                    filter.stopWatching(function() {});\n                                    callbackFired = true;\n\n                                    if(code.length > 3) {\n\n                                        // console.log('Contract code deployed!');\n\n                                        contract.address = receipt.contractAddress;\n\n                                        // attach events and methods again after we have\n                                        addFunctionsToContract(contract);\n                                        addEventsToContract(contract);\n\n                                        // call callback for the second time\n                                        if(callback)\n                                            callback(null, contract);\n\n                                    } else {\n                                        if(callback)\n                                            callback(new Error('The contract code couldn\\'t be stored, please check your gas amount.'));\n                                        else\n                                            throw new Error('The contract code couldn\\'t be stored, please check your gas amount.');\n                                    }\n                                });\n                            }\n                        });\n                    }\n                }else {\n                    console.log(\"erro filter \" + e)\n                }\n            });\n        };\n\n        /**\n         * Should be called to create new ContractFactory instance\n         *\n         * @method ContractFactory\n         * @param {Array} abi\n         */\n        var ContractFactory = function (sero, abi) {\n            this.sero = sero;\n            this.abi = abi;\n\n            /**\n             * Should be called to create new contract on a blockchain\n             *\n             * @method new\n             * @param {Any} contract constructor param1 (optional)\n             * @param {Any} contract constructor param2 (optional)\n             * @param {Object} contract transaction object (required)\n             * @param {Function} callback\n             * @returns {Contract} returns contract instance\n             */\n            this.new = function () {\n                /*jshint maxcomplexity: 7 */\n\n                var contract = new Contract(this.sero, this.abi);\n\n                // parse arguments\n                var options = {}; // required!\n                var callback;\n\n                var args = Array.prototype.slice.call(arguments);\n                if (utils.isFunction(args[args.length - 1])) {\n                    callback = args.pop();\n                }\n\n                var last = args[args.length - 1];\n                if (utils.isObject(last) && !utils.isArray(last)) {\n                    options = args.pop();\n                }\n\n                if (options.value > 0) {\n                    var constructorAbi = abi.filter(function (json) {\n                        return json.type === 'constructor' && json.inputs.length === args.length;\n                    })[0] || {};\n\n                    var isPayable = false;\n\n                    if (constructorAbi.stateMutability === \"payable\") {\n                        isPayable = true;\n                    }\n                    if (constructorAbi.hasOwnProperty(\"payable\") ){\n                        isPayable= constructorAbi.payable;\n                    }\n\n                    if (!isPayable ) {\n                        throw new Error('Cannot send value to non-payable constructor');\n                    }\n                }\n                options.abi =this.abi;\n\n                var rand =\"0x\";\n                var argsResult = opArgs(this.abi,args,rand,this.sero,false);\n                args = argsResult.params;\n                rand = argsResult.rand;\n                var shortAddrMap = argsResult.shortAddr;\n                var bytes = encodeConstructorParams(this.abi, args,shortAddrMap);\n                options.data += bytes;\n                var prefix = encodeConstructorPrefix(this.abi,args,rand);\n                options.data = prefix +options.data.substr(2);\n\n                if (callback) {\n\n                    // wait for the contract address and check if the code was deployed\n                    this.sero.sendTransaction(options, function (err, hash) {\n                        if (err) {\n                            callback(err);\n                        } else {\n                            // add the transaction hash\n                            contract.transactionHash = hash;\n\n                            // call callback for the first time\n                            callback(null, contract);\n\n                            checkForContractAddress(contract, callback);\n                        }\n                    });\n                } else {\n                    var hash = this.sero.sendTransaction(options);\n                    // add the transaction hash\n                    contract.transactionHash = hash;\n                    checkForContractAddress(contract);\n                }\n\n                return contract;\n            };\n\n            this.new.getData = this.getData.bind(this);\n        };\n\n        /**\n         * Should be called to create new ContractFactory\n         *\n         * @method contract\n         * @param {Array} abi\n         * @returns {ContractFactory} new contract factory\n         */\n//var contract = function (abi) {\n        //return new ContractFactory(abi);\n//};\n\n\n\n        /**\n         * Should be called to get access to existing contract on a blockchain\n         *\n         * @method at\n         * @param {Address} contract address (required)\n         * @param {Function} callback {optional)\n         * @returns {Contract} returns contract if no callback was passed,\n         * otherwise calls callback function (err, contract)\n         */\n        ContractFactory.prototype.at = function (address, callback) {\n            var contract = new Contract(this.sero, this.abi, address);\n\n            // this functions are not part of prototype,\n            // because we dont want to spoil the interface\n            addFunctionsToContract(contract);\n            addEventsToContract(contract);\n\n            if (callback) {\n                callback(null, contract);\n            }\n            return contract;\n        };\n\n\n        ContractFactory.prototype.atNewAbi = function (address) {\n            var contract = new Contract(this.sero, this.abi, address);\n\n            // this functions are not part of prototype,\n            // because we dont want to spoil the interface\n            addFunctionsToContract(contract,true);\n            addEventsToContract(contract);\n        };\n\n        /**\n         * Gets the data, which is data to deploy plus constructor params\n         *\n         * @method getData\n         */\n        ContractFactory.prototype.getData = function () {\n            var options = {}; // required!\n            var args = Array.prototype.slice.call(arguments);\n\n            var callback;\n            if (utils.isFunction(args[args.length - 1])) {\n                callback = args.pop();\n            }\n            var last = args[args.length - 1];\n            if (utils.isObject(last) && !utils.isArray(last)) {\n                options = args.pop();\n            }\n            var rand =\"0x\";\n\n            var self = this;\n\n            if (callback){\n                var cb = function(err,result){\n                    if (err){\n                        throw errors.InvalidResponse(err);\n                    }\n                    args = result.params;\n                    rand = result.rand;\n                    var shortAddrMap = result.shortAddr;\n                    var bytes = encodeConstructorParams(self.abi, args,shortAddrMap);\n                    options.data += bytes;\n                    var prefix = encodeConstructorPrefix(self.abi,args,rand);\n                    options.data = prefix +options.data.substr(2);\n                    callback(options.data);\n                }\n                opArgs(this.abi,args,rand,self.sero,false,cb);\n\n            }else{\n\n                argsResult = opArgs(self.abi,args,rand,self.sero,false);\n                args = argsResult.params;\n                rand = argsResult.rand;\n                var shortAddrMap = result.shortAddr;\n                var bytes = encodeConstructorParams(self.abi, args,shortAddrMap);\n                options.data += bytes;\n                var prefix = encodeConstructorPrefix(self.abi,args,rand);\n                options.data = prefix +options.data.substr(2);\n\n                return options.data;\n            }\n        };\n\n        /**\n         * Should be called to create new contract instance\n         *\n         * @method Contract\n         * @param {Array} abi\n         * @param {Address} contract address\n         */\n        var Contract = function (sero, abi, address) {\n            this._sero = sero;\n            this.transactionHash = null;\n            this.address = address;\n            this.abi = abi;\n        };\n\n        module.exports = ContractFactory;\n\n    },{\"../solidity/coder\":7,\"../utils/utils\":21,\"./allevents\":24,\"./errors\":27,\"./event\":28,\"./function\":32}],27:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file errors.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        module.exports = {\n            InvalidNumberOfSolidityArgs: function () {\n                return new Error('Invalid number of arguments to Solidity function');\n            },\n            InvalidNumberOfRPCParams: function () {\n                return new Error('Invalid number of input parameters to RPC method');\n            },\n            InvalidConnection: function (host){\n                return new Error('CONNECTION ERROR: Couldn\\'t connect to node '+ host +'.');\n            },\n            InvalidProvider: function () {\n                return new Error('Provider not set or invalid');\n            },\n            InvalidResponse: function (result){\n                var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result);\n                return new Error(message);\n            },\n            ConnectionTimeout: function (ms){\n                return new Error('CONNECTION TIMEOUT: timeout of ' + ms + ' ms achived');\n            }\n        };\n\n    },{}],28:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file event.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2014\n         */\n\n        var utils = require('../utils/utils');\n        var coder = require('../solidity/coder');\n        var formatters = require('./formatters');\n        var sha3 = require('../utils/sha3');\n        var Filter = require('./filter');\n        var watches = require('./methods/watches');\n\n        /**\n         * This prototype should be used to create event filters\n         */\n        var SolidityEvent = function (sero, json, address) {\n            this._requestManager = sero._requestManager;\n            this._params = json.inputs;\n            this._name = utils.transformToFullName(json);\n            this._address = address;\n            this._anonymous = json.anonymous;\n            this._sero = sero;\n        };\n\n        /**\n         * Should be used to get filtered param types\n         *\n         * @method types\n         * @param {Bool} decide if returned typed should be indexed\n         * @return {Array} array of types\n         */\n        SolidityEvent.prototype.types = function (indexed) {\n            return this._params.filter(function (i) {\n                return i.indexed === indexed;\n            }).map(function (i) {\n                return i.type;\n            });\n        };\n\n        /**\n         * Should be used to get event display name\n         *\n         * @method displayName\n         * @return {String} event display name\n         */\n        SolidityEvent.prototype.displayName = function () {\n            return utils.extractDisplayName(this._name);\n        };\n\n        /**\n         * Should be used to get event type name\n         *\n         * @method typeName\n         * @return {String} event type name\n         */\n        SolidityEvent.prototype.typeName = function () {\n            return utils.extractTypeName(this._name);\n        };\n\n        /**\n         * Should be used to get event signature\n         *\n         * @method signature\n         * @return {String} event signature\n         */\n        SolidityEvent.prototype.signature = function () {\n            return sha3(this._name);\n        };\n\n        /**\n         * Should be used to encode indexed params and options to one final object\n         *\n         * @method encode\n         * @param {Object} indexed\n         * @param {Object} options\n         * @return {Object} everything combined together and encoded\n         */\n        SolidityEvent.prototype.encode = function (indexed, options) {\n            indexed = indexed || {};\n            options = options || {};\n            var result = {};\n            var _that = this;\n\n            ['fromBlock', 'toBlock'].filter(function (f) {\n                return options[f] !== undefined;\n            }).forEach(function (f) {\n                result[f] = formatters.inputBlockNumberFormatter(options[f]);\n            });\n\n            result.topics = [];\n\n            result.address = this._address;\n            if (!this._anonymous) {\n                result.topics.push('0x' + this.signature());\n            }\n\n            var indexedTopics = this._params.filter(function (i) {\n                return i.indexed === true;\n            }).map(function (i) {\n                var value = indexed[i.name];\n                if (value === undefined || value === null) {\n                    return null;\n                }\n                var rand = utils.bytesToHex(utils.base58ToBytes(_that._address).slice(0,16));\n                value = coder.opParams([i.type],[value],rand,_that._sero,false)[0]\n                if (utils.isArray(value)) {\n                    return value.map(function (v) {\n                        return '0x' + coder.encodeParam(i.type, v);\n                    });\n                }\n                return '0x' + coder.encodeParam(i.type, value);\n            });\n\n            result.topics = result.topics.concat(indexedTopics);\n\n            return result;\n        };\n\n        /**\n         * Should be used to decode indexed params and options\n         *\n         * @method decode\n         * @param {Object} data\n         * @return {Object} result object with decoded indexed && not indexed params\n         */\n        SolidityEvent.prototype.decode = function (data,callback) {\n\n            data.data = data.data || '';\n            data.topics = data.topics || [];\n            var self = this;\n            var argTopics = this._anonymous ? data.topics : data.topics.slice(1);\n            var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(\"\");\n            var notIndexedData = data.data.slice(2);\n            if (callback){\n\n                var shortAddress= coder.decodeShortAddress(this.types(true), indexedData);\n                shortAddress = shortAddress.concat(coder.decodeShortAddress(this.types(true), notIndexedData))\n                var mapAddr = null;\n                if (shortAddress.length>0) {\n                    var cb = function (err,mapAddr){\n                        var indexedParams = coder.decodeParams(self.types(true), indexedData,mapAddr);\n                        var notIndexedParams = coder.decodeParams(self.types(false), notIndexedData,mapAddr);\n                        var result = formatters.outputLogFormatter(data);\n                        result.event = self.displayName();\n                        result.address = data.address;\n\n                        result.args = self._params.reduce(function (acc, current) {\n                            acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();\n                            return acc;\n                        }, {});\n\n                        delete result.data;\n                        delete result.topics;\n                        callback(null,result)\n                    }\n                    this._sero.getFullAddress(shortAddress,cb);\n                }else{\n                    var indexedParams = coder.decodeParams(this.types(true), indexedData,mapAddr);\n                    var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData,mapAddr);\n\n                    var result = formatters.outputLogFormatter(data);\n                    result.event = this.displayName();\n                    result.address = data.address;\n\n                    result.args = this._params.reduce(function (acc, current) {\n                        acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();\n                        return acc;\n                    }, {});\n\n                    delete result.data;\n                    delete result.topics;\n                    callback(null,result)\n                }\n            }else{\n\n                var mapAddr = null;\n                var indexedParams = coder.decodeParams(this.types(true), indexedData,mapAddr);\n                var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData,mapAddr);\n                var result = formatters.outputLogFormatter(data);\n                result.event = this.displayName();\n                result.address = data.address;\n\n                result.args = this._params.reduce(function (acc, current) {\n                    acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();\n                    return acc;\n                }, {});\n\n                delete result.data;\n                delete result.topics;\n\n                return result;\n            }\n\n\n        };\n\n        /**\n         * Should be used to create new filter object from event\n         *\n         * @method execute\n         * @param {Object} indexed\n         * @param {Object} options\n         * @return {Object} filter object\n         */\n        SolidityEvent.prototype.execute = function (indexed, options, callback) {\n\n            if (utils.isFunction(arguments[arguments.length - 1])) {\n                callback = arguments[arguments.length - 1];\n                if(arguments.length === 2)\n                    options = null;\n                if(arguments.length === 1) {\n                    options = null;\n                    indexed = {};\n                }\n            }\n\n            var o = this.encode(indexed, options);\n            var formatter = this.decode.bind(this);\n            return new Filter(o, 'sero', this._requestManager, watches.sero(), formatter, callback);\n        };\n\n        /**\n         * Should be used to attach event to contract object\n         *\n         * @method attachToContract\n         * @param {Contract}\n         */\n        SolidityEvent.prototype.attachToContract = function (contract) {\n            var execute = this.execute.bind(this);\n            var displayName = this.displayName();\n            if (!contract[displayName]) {\n                contract[displayName] = execute;\n            }\n            contract[displayName][this.typeName()] = this.execute.bind(this, contract);\n        };\n\n        module.exports = SolidityEvent;\n\n\n    },{\"../solidity/coder\":7,\"../utils/sha3\":20,\"../utils/utils\":21,\"./filter\":30,\"./formatters\":31,\"./methods/watches\":44}],29:[function(require,module,exports){\n        var formatters = require('./formatters');\n        var utils = require('./../utils/utils');\n        var Method = require('./method');\n        var Property = require('./property');\n\n// TODO: refactor, so the input params are not altered.\n// it's necessary to make same 'extension' work with multiple providers\n        var extend = function (web3) {\n            /* jshint maxcomplexity:5 */\n            var ex = function (extension) {\n\n                var extendedObject;\n                if (extension.property) {\n                    if (!web3[extension.property]) {\n                        web3[extension.property] = {};\n                    }\n                    extendedObject = web3[extension.property];\n                } else {\n                    extendedObject = web3;\n                }\n\n                if (extension.methods) {\n                    extension.methods.forEach(function (method) {\n                        method.attachToObject(extendedObject);\n                        method.setRequestManager(web3._requestManager);\n                    });\n                }\n\n                if (extension.properties) {\n                    extension.properties.forEach(function (property) {\n                        property.attachToObject(extendedObject);\n                        property.setRequestManager(web3._requestManager);\n                    });\n                }\n            };\n\n            ex.formatters = formatters;\n            ex.utils = utils;\n            ex.Method = Method;\n            ex.Property = Property;\n\n            return ex;\n        };\n\n\n\n        module.exports = extend;\n\n\n    },{\"./../utils/utils\":21,\"./formatters\":31,\"./method\":37,\"./property\":46}],30:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file filter.js\n         * @authors:\n         *   Jeffrey Wilcke <jeff@ethdev.com>\n         *   Marek Kotewicz <marek@ethdev.com>\n         *   Marian Oancea <marian@ethdev.com>\n         *   Fabian Vogelsteller <fabian@ethdev.com>\n         *   Gav Wood <g@ethdev.com>\n         * @date 2014\n         */\n\n        var formatters = require('./formatters');\n        var utils = require('../utils/utils');\n\n        /**\n         * Converts a given topic to a hex string, but also allows null values.\n         *\n         * @param {Mixed} value\n         * @return {String}\n         */\n        var toTopic = function(value){\n\n            if(value === null || typeof value === 'undefined')\n                return null;\n\n            value = String(value);\n\n            if(value.indexOf('0x') === 0)\n                return value;\n            else\n                return utils.fromUtf8(value);\n        };\n\n/// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones\n/// @param should be string or object\n/// @returns options string or object\n        var getOptions = function (options, type) {\n            /*jshint maxcomplexity: 6 */\n\n            if (utils.isString(options)) {\n                return options;\n            }\n\n            options = options || {};\n\n\n            switch(type) {\n                case 'sero':\n\n                    // make sure topics, get converted to hex\n                    options.topics = options.topics || [];\n                    options.topics = options.topics.map(function(topic){\n                        return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic);\n                    });\n\n                    return {\n                        topics: options.topics,\n                        from: options.from,\n                        to: options.to,\n                        address: options.address,\n                        fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock),\n                        toBlock: formatters.inputBlockNumberFormatter(options.toBlock)\n                    };\n                case 'shh':\n                    return options;\n            }\n        };\n\n        /**\n         Adds the callback and sets up the methods, to iterate over the results.\n\n         @method getLogsAtStart\n         @param {Object} self\n         @param {function} callback\n         */\n        var getLogsAtStart = function(self, callback){\n            // call getFilterLogs for the first watch callback start\n            if (!utils.isString(self.options)) {\n                self.get(function (err, messages) {\n                    // don't send all the responses to all the watches again... just to self one\n                    if (err) {\n                        callback(err);\n                    }\n\n                    if(utils.isArray(messages)) {\n                        messages.forEach(function (message) {\n                            callback(null, message);\n                        });\n                    }\n                });\n            }\n        };\n\n        /**\n         Adds the callback and sets up the methods, to iterate over the results.\n\n         @method pollFilter\n         @param {Object} self\n         */\n        var pollFilter = function(self) {\n\n            var onMessage = function (error, messages) {\n                if (error) {\n                    return self.callbacks.forEach(function (callback) {\n                        callback(error);\n                    });\n                }\n\n                if(utils.isArray(messages)) {\n                    messages.forEach(function (message) {\n                        message = self.formatter ? self.formatter(message) : message;\n                        self.callbacks.forEach(function (callback) {\n                            callback(null, message);\n                        });\n                    });\n                }\n            };\n\n            self.requestManager.startPolling({\n                method: self.implementation.poll.call,\n                params: [self.filterId],\n            }, self.filterId, onMessage, self.stopWatching.bind(self));\n\n        };\n\n        var Filter = function (options, type, requestManager, methods, formatter, callback, filterCreationErrorCallback) {\n            var self = this;\n            var implementation = {};\n            methods.forEach(function (method) {\n                method.setRequestManager(requestManager);\n                method.attachToObject(implementation);\n            });\n            this.requestManager = requestManager;\n            this.options = getOptions(options, type);\n            this.implementation = implementation;\n            this.filterId = null;\n            this.callbacks = [];\n            this.getLogsCallbacks = [];\n            this.pollFilters = [];\n            this.formatter = formatter;\n            this.implementation.newFilter(this.options, function(error, id){\n                if(error) {\n                    self.callbacks.forEach(function(cb){\n                        cb(error);\n                    });\n                    if (typeof filterCreationErrorCallback === 'function') {\n                        filterCreationErrorCallback(error);\n                    }\n                } else {\n                    self.filterId = id;\n\n                    // check if there are get pending callbacks as a consequence\n                    // of calling get() with filterId unassigned.\n                    self.getLogsCallbacks.forEach(function (cb){\n                        self.get(cb);\n                    });\n                    self.getLogsCallbacks = [];\n\n                    // get filter logs for the already existing watch calls\n                    self.callbacks.forEach(function(cb){\n                        getLogsAtStart(self, cb);\n                    });\n                    if(self.callbacks.length > 0)\n                        pollFilter(self);\n\n                    // start to watch immediately\n                    if(typeof callback === 'function') {\n                        return self.watch(callback);\n                    }\n                }\n            });\n\n            return this;\n        };\n\n        Filter.prototype.watch = function (callback) {\n            this.callbacks.push(callback);\n\n            if(this.filterId) {\n                getLogsAtStart(this, callback);\n                pollFilter(this);\n            }\n\n            return this;\n        };\n\n        Filter.prototype.stopWatching = function (callback) {\n            this.requestManager.stopPolling(this.filterId);\n            this.callbacks = [];\n            // remove filter async\n            if (callback) {\n                this.implementation.uninstallFilter(this.filterId, callback);\n            } else {\n                return this.implementation.uninstallFilter(this.filterId);\n            }\n        };\n\n        Filter.prototype.get = function (callback) {\n            var self = this;\n            if (utils.isFunction(callback)) {\n                if (this.filterId === null) {\n                    // If filterId is not set yet, call it back\n                    // when newFilter() assigns it.\n                    this.getLogsCallbacks.push(callback);\n                } else {\n                    this.implementation.getLogs(this.filterId, function(err, res){\n                        if (err) {\n                            callback(err);\n                        } else {\n                            callback(null, res.map(function (log) {\n                                return self.formatter ? self.formatter(log) : log;\n                            }));\n                        }\n                    });\n                }\n            } else {\n                if (this.filterId === null) {\n                    throw new Error('Filter ID Error: filter().get() can\\'t be chained synchronous, please provide a callback for the get() method.');\n                }\n                var logs = this.implementation.getLogs(this.filterId);\n                return logs.map(function (log) {\n                    return self.formatter ? self.formatter(log) : log;\n                });\n            }\n\n            return this;\n        };\n\n        module.exports = Filter;\n\n\n    },{\"../utils/utils\":21,\"./formatters\":31}],31:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file formatters.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @author Fabian Vogelsteller <fabian@ethdev.com>\n         * @date 2015\n         */\n\n        'use strict';\n\n\n        var utils = require('../utils/utils');\n        var config = require('../utils/config');\n        var Iban = require('./iban');\n        var util = require('util');\n\n\n        /**\n         * Should the format output to a big number\n         *\n         * @method outputBigNumberFormatter\n         * @param {String|Number|BigNumber}\n         * @returns {BigNumber} object\n         */\n        var outputBigNumberFormatter = function (number) {\n            return utils.toBigNumber(number);\n        };\n\n        var isPredefinedBlockNumber = function (blockNumber) {\n            return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest';\n        };\n\n        var inputDefaultBlockNumberFormatter = function (blockNumber) {\n            if (blockNumber === undefined) {\n                return config.defaultBlock;\n            }\n            return inputBlockNumberFormatter(blockNumber);\n        };\n\n\n        var inputBlockNumberFormatter = function (blockNumber) {\n            if (blockNumber === undefined) {\n                return undefined;\n            } else if (isPredefinedBlockNumber(blockNumber)) {\n                return blockNumber;\n            }\n            return utils.toHex(blockNumber);\n        };\n\n        /**\n         * Formats the input of a transaction and converts all values to HEX\n         *\n         * @method inputCallFormatter\n         * @param {Object} transaction options\n         * @returns object\n         */\n        var inputCallFormatter = function (options){\n\n            options.from = options.from || config.defaultAccount;\n\n            if (options.from) {\n                options.from = inputParamAddressFormatter(options.from);\n            }\n\n            if (options.to) { // it might be contract creation\n                options.to = inputParamAddressFormatter(options.to);\n            }\n\n            ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {\n                return options[key] !== undefined;\n            }).forEach(function(key){\n                options[key] = utils.fromDecimal(options[key]);\n            });\n\n            return options;\n        };\n\n        /**\n         * Formats the input of a transaction and converts all values to HEX\n         *\n         * @method inputTransactionFormatter\n         * @param {Object} transaction options\n         * @returns object\n         */\n        var inputTransactionFormatter = function (options){\n\n            options.from = options.from || config.defaultAccount;\n            options.from = inputAddressFormatter(options.from);\n\n            if (options.to) { // it might be contract creation\n                options.to=inputParamAddressFormatter(options.to)\n            }\n\n            ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {\n                return options[key] !== undefined;\n            }).forEach(function(key){\n                options[key] = utils.fromDecimal(options[key]);\n            });\n\n            return options;\n        };\n\n        var inputRegistPoolFormatter = function (options){\n\n            options.from = options.from || config.defaultAccount;\n            options.from = inputAddressFormatter(options.from);\n\n            if (options.to) { // it might be contract creation\n                options.to=inputParamAddressFormatter(options.to)\n            }\n\n            ['gasPrice', 'gas', 'value', 'fee'].filter(function (key) {\n                return options[key] !== undefined;\n            }).forEach(function(key){\n                options[key] = utils.fromDecimal(options[key]);\n            });\n\n            return options;\n        };\n\n\n        /**\n         * Formats the output of a transaction to its proper values\n         *\n         * @method outputTransactionFormatter\n         * @param {Object} tx\n         * @returns {Object}\n         */\n        var outputTransactionFormatter = function (tx){\n            return tx;\n            if(tx.blockNumber !== null)\n                tx.blockNumber = utils.toDecimal(tx.blockNumber);\n            if(tx.transactionIndex !== null)\n                tx.transactionIndex = utils.toDecimal(tx.transactionIndex);\n            tx.nonce = utils.toDecimal(tx.nonce);\n            tx.gas = utils.toDecimal(tx.gas);\n            tx.gasPrice = utils.toBigNumber(tx.gasPrice);\n            tx.value = utils.toBigNumber(tx.value);\n            if (tx.stx.Desc_O){\n                tx.stx.Desc_O_Ins=tx.stx.Desc_O.Ins;\n                var O_Outs=[];\n                if (tx.stx.Desc_O.Outs){\n                    tx.stx.Desc_O.Outs.forEach(function(out){\n                        var out_O ={};\n                        if (utils.toBigNumber(out.Addr)!=0) {\n                            out_O.Addr = out.Addr;\n                        }\n                        if (out.Asset.Tkn){\n                            out_O.Currency = utils.bytesToString(utils.hexToBytes(utils.fromDecimal(utils.toBigNumber(out.Asset.Tkn.Currency))));\n                            out_O.Value = utils.toBigNumber(out.Asset.Tkn.Value);\n                        }\n                        if (out.Asset.Tkt){\n                            out_O.Category = utils.bytesToString(utils.hexToBytes(utils.fromDecimal(utils.toBigNumber(out.Asset.Tkt.Category))));\n                            out_O.TktId = out.Asset.Tkt.Value;\n                        }\n                        out_O.Memo = out.Memo;\n                        O_Outs.push(out_O);\n                    });\n                }\n                tx.stx.Desc_O_Outs = O_Outs;\n                delete  tx.stx.Desc_O;\n            }\n            if (tx.stx.Desc_Z){\n                tx.stx.Desc_Z_Ins=tx.stx.Desc_Z.Ins;\n                tx.stx.Desc_Z_Outs = tx.stx.Desc_Z.Outs;\n                delete  tx.stx.Desc_Z;\n            }\n            return tx;\n        };\n\n        /**\n         * Formats the output of a transaction receipt to its proper values\n         *\n         * @method outputTransactionReceiptFormatter\n         * @param {Object} receipt\n         * @returns {Object}\n         */\n        var outputTransactionReceiptFormatter = function (receipt){\n            if(receipt.blockNumber !== null)\n                receipt.blockNumber = utils.toDecimal(receipt.blockNumber);\n            if(receipt.transactionIndex !== null)\n                receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex);\n            receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed);\n            receipt.gasUsed = utils.toDecimal(receipt.gasUsed);\n\n            if(utils.isArray(receipt.logs)) {\n                receipt.logs = receipt.logs.map(function(log){\n                    return outputLogFormatter(log);\n                });\n            }\n\n            return receipt;\n        };\n\n        /**\n         * Formats the output of a block to its proper values\n         *\n         * @method outputBlockFormatter\n         * @param {Object} block\n         * @returns {Object}\n         */\n        var outputBlockFormatter = function(block) {\n\n            // transform to number\n            block.gasLimit = utils.toDecimal(block.gasLimit);\n            block.gasUsed = utils.toDecimal(block.gasUsed);\n            block.size = utils.toDecimal(block.size);\n            block.timestamp = utils.toDecimal(block.timestamp);\n            if(block.number !== null)\n                block.number = utils.toDecimal(block.number);\n\n            block.difficulty = utils.toBigNumber(block.difficulty);\n            block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);\n\n            if (utils.isArray(block.transactions)) {\n                block.transactions.forEach(function(item){\n                    if(!utils.isString(item))\n                        return outputTransactionFormatter(item);\n                });\n            }\n\n            return block;\n        };\n\n        /**\n         * Formats the output of a log\n         *\n         * @method outputLogFormatter\n         * @param {Object} log object\n         * @returns {Object} log\n         */\n        var outputLogFormatter = function(log) {\n            if(log.blockNumber)\n                log.blockNumber = utils.toDecimal(log.blockNumber);\n            if(log.transactionIndex)\n                log.transactionIndex = utils.toDecimal(log.transactionIndex);\n            if(log.logIndex)\n                log.logIndex = utils.toDecimal(log.logIndex);\n\n            return log;\n        };\n\n        /**\n         * Formats the input of a whisper post and converts all values to HEX\n         *\n         * @method inputPostFormatter\n         * @param {Object} transaction object\n         * @returns {Object}\n         */\n        var inputPostFormatter = function(post) {\n\n            // post.payload = utils.toHex(post.payload);\n            post.ttl = utils.fromDecimal(post.ttl);\n            post.workToProve = utils.fromDecimal(post.workToProve);\n            post.priority = utils.fromDecimal(post.priority);\n\n            // fallback\n            if (!utils.isArray(post.topics)) {\n                post.topics = post.topics ? [post.topics] : [];\n            }\n\n            // format the following options\n            post.topics = post.topics.map(function(topic){\n                // convert only if not hex\n                return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic);\n            });\n\n            return post;\n        };\n\n        /**\n         * Formats the output of a received post message\n         *\n         * @method outputPostFormatter\n         * @param {Object}\n         * @returns {Object}\n         */\n        var outputPostFormatter = function(post){\n\n            post.expiry = utils.toDecimal(post.expiry);\n            post.sent = utils.toDecimal(post.sent);\n            post.ttl = utils.toDecimal(post.ttl);\n            post.workProved = utils.toDecimal(post.workProved);\n            // post.payloadRaw = post.payload;\n            // post.payload = utils.toAscii(post.payload);\n\n            // if (utils.isJson(post.payload)) {\n            //     post.payload = JSON.parse(post.payload);\n            // }\n\n            // format the following options\n            if (!post.topics) {\n                post.topics = [];\n            }\n            post.topics = post.topics.map(function(topic){\n                return utils.toAscii(topic);\n            });\n\n            return post;\n        };\n\n        var inputAddressFormatter = function (address) {\n            var iban = new Iban(address);\n            if (iban.isValid() && iban.isDirect()) {\n                return '0x' + iban.address();\n            } else if (utils.isStrictAddress(address)) {\n                return address;\n            }\n            throw new Error('invalid address');\n        };\n\n\n        var inputParamAddressFormatter = function (address) {\n            if (utils.paramAddress(address)) {\n                return address\n            }\n            throw new Error('invalid address');\n        };\n\n\n        var outputSyncingFormatter = function(result) {\n            if (!result) {\n                return result;\n            }\n\n            result.startingBlock = utils.toDecimal(result.startingBlock);\n            result.currentBlock = utils.toDecimal(result.currentBlock);\n            result.highestBlock = utils.toDecimal(result.highestBlock);\n            if (result.knownStates) {\n                result.knownStates = utils.toDecimal(result.knownStates);\n                result.pulledStates = utils.toDecimal(result.pulledStates);\n            }\n\n            return result;\n        };\n\n        var outputBalanceFormatter = function(result) {\n            if (!result) {\n                return ;\n            }\n            if (result.hasOwnProperty(\"tkn\")){\n                if (result[\"tkn\"]) {\n                    for (var key in result[\"tkn\"]){\n                        result['tkn'][key] = utils.toBigNumber(result['tkn'][key]);\n                    }\n                }else {\n                    delete result.tkn\n                }\n            }\n            if (result.hasOwnProperty('tkt')){\n                if (!result['tkt']){\n                    delete result.tkt\n                }\n            }\n            return result;\n        };\n\n\n\n        var outputStakeShareFormatter = function(result) {\n            if (!result) {\n                return ;\n            }\n            if(result instanceof Array){\n                ['missed', 'num', 'total', 'status',\"remaining\",'expired','fee','at','timestamp','lastPayTime','returnNum'].forEach(function(key){\n                    result.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toDecimal(s[key]);\n                        }\n                    });\n                });\n                ['profit','price','returnProfit'].forEach(function(key){\n                    result.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toBigNumber(s[key]);\n                        }\n                    });\n                });\n            }else{\n                ['missed', 'num', 'total', 'status',\"remaining\",'expired','fee','at','timestamp','lastPayTime','returnNum'].forEach(function(key){\n                    if (result.hasOwnProperty(key)){\n                        result[key] = utils.toDecimal(result[key]);\n                    }\n                });\n                ['profit','price','returnProfit'].forEach(function(key){\n                    if (result.hasOwnProperty(key)){\n                        result[key] = utils.toBigNumber(result[key]);\n                    };\n                });\n            }\n            return result;\n        };\n\n\n\n        var outputStakePoolFormatter = function(result) {\n            if (!result) {\n                return ;\n            }\n\n            if(result instanceof Array){\n                ['choicedNum', 'createAt', 'expireNum', 'fee','missedNum','shareNum','lastPayTime','wishVoteNum','timestamp'].forEach(function(key){\n                    result.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toDecimal(s[key]);\n                        }\n                    });\n                });\n                ['profit'].forEach(function(key){\n                    result.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toBigNumber(s[key]);\n                        }\n                    });\n\n                });\n            }else{\n                ['choicedNum', 'createAt', 'expireNum', 'fee','missedNum','shareNum','lastPayTime','wishVoteNum','timestamp'].forEach(function(key){\n                    if (result.hasOwnProperty(key)){\n                        result[key] = utils.toDecimal(result[key]);\n                    }\n                });\n                ['profit'].forEach(function(key){\n                    if (result.hasOwnProperty(key)){\n                        result[key] = utils.toBigNumber(result[key]);\n                    }\n                });\n            }\n\n            return result;\n        };\n\n\n        var outputStakeInfoFormatter = function(result) {\n            if (!result) {\n                return ;\n            }\n\n            if (!result.pools && !result.shares){\n                return ;\n            }\n\n            if (result.pools){\n                ['choicedNum', 'createAt', 'expireNum', 'fee','missedNum','shareNum','lastPayTime','wishVoteNum','timestamp','blockNumber'].forEach(function(key){\n                    result.pools.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toDecimal(s[key]);\n                        }\n                    });\n                });\n                ['profit'].forEach(function(key){\n                    result.pools.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toBigNumber(s[key]);\n                        }\n                    });\n\n                });\n            }\n            if (result.shares){\n                ['missed', 'num', 'total', 'status',\"remaining\",'expired','fee','at','timestamp','lastPayTime','returnNum','blockNumber'].forEach(function(key){\n                    result.shares.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toDecimal(s[key]);\n                        }\n                    });\n                });\n                ['profit','price'].forEach(function(key){\n                    result.shares.forEach(function(s){\n                        if (s.hasOwnProperty(key)){\n                            s[key] = utils.toBigNumber(s[key]);\n                        }\n                    });\n\n                });\n            }\n\n\n            return result;\n        };\n\n\n        module.exports = {\n            inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,\n            inputBlockNumberFormatter: inputBlockNumberFormatter,\n            inputCallFormatter: inputCallFormatter,\n            inputTransactionFormatter: inputTransactionFormatter,\n            inputRegistPoolFormatter:inputRegistPoolFormatter,\n            inputParamAddressFormatter:inputParamAddressFormatter,\n            inputAddressFormatter: inputAddressFormatter,\n            inputPostFormatter: inputPostFormatter,\n            outputBigNumberFormatter: outputBigNumberFormatter,\n            outputTransactionFormatter: outputTransactionFormatter,\n            outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,\n            outputBlockFormatter: outputBlockFormatter,\n            outputLogFormatter: outputLogFormatter,\n            outputPostFormatter: outputPostFormatter,\n            outputSyncingFormatter: outputSyncingFormatter,\n            outputBalanceFormatter:outputBalanceFormatter,\n            outputStakeShareFormatter:outputStakeShareFormatter,\n            outputStakePoolFormatter:outputStakePoolFormatter,\n            outputStakeInfoFormatter:outputStakeInfoFormatter\n        };\n\n\n    },{\"../utils/config\":19,\"../utils/utils\":21,\"./iban\":34,\"util\":89}],32:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file function.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var coder = require('../solidity/coder');\n        var utils = require('../utils/utils');\n        var errors = require('./errors');\n        var formatters = require('./formatters');\n        var sha3 = require('../utils/sha3');\n\n        /**\n         * This prototype should be used to call/sendTransaction to solidity functions\n         */\n        var SolidityFunction = function (sero, json, address,abiv2) {\n            this._sero = sero;\n            this._inputTypes = json.inputs.map(function (i) {\n                return i.type;\n            });\n            this._outputTypes = json.outputs.map(function (i) {\n                return i.type;\n            });\n            if (json.stateMutability !== \"nonpayable\" && json.stateMutability !== \"payable\" ){\n                this._constant = true;\n            }else {\n                this._constant = false;\n            }\n\n            if (json.stateMutability === \"payable\" ){\n                this._payable = true;\n            }else {\n                this._payable= false;\n            }\n\n            if (json.hasOwnProperty(\"constant\") ){\n                this._constant = json.constant;\n            }\n\n            if (json.hasOwnProperty(\"payable\") ){\n                this._payable = json.payable;\n            }\n\n            this._name = utils.transformToFullName(json);\n            this._address = address;\n            this._abiv2 = abiv2;\n            this.abi = json;\n        };\n\n        SolidityFunction.prototype.extractCallback = function (args) {\n            if (utils.isFunction(args[args.length - 1])) {\n                return args.pop(); // modify the args array!\n            }\n        };\n\n        SolidityFunction.prototype.extractDefaultBlock = function (args) {\n            if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) {\n                return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array!\n            }\n        };\n\n        /**\n         * Should be called to check if the number of arguments is correct\n         *\n         * @method validateArgs\n         * @param {Array} arguments\n         * @throws {Error} if it is not\n         */\n        SolidityFunction.prototype.validateArgs = function (args) {\n            var inputArgs = args.filter(function (a) {\n                // filter the options object but not arguments that are arrays\n                return !( (utils.isObject(a) === true) &&\n                    (utils.isArray(a) === false) &&\n                    (utils.isBigNumber(a) === false)\n                );\n            });\n            if (inputArgs.length !== this._inputTypes.length) {\n                throw errors.InvalidNumberOfSolidityArgs();\n            }\n        };\n\n        /**\n         * Should be used to create payload from arguments\n         *\n         * @method toPayload\n         * @param {Array} solidity function params\n         * @param {Object} optional payload options\n         */\n        SolidityFunction.prototype.toPayload = function (args) {\n            var options = {};\n            if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {\n                options = args[args.length - 1];\n            }\n            this.validateArgs(args);\n            options.to = this._address;\n            var dy = false;\n            if (options.hasOwnProperty(\"dy\")){\n                dy = options.dy;\n            }\n            var rand = utils.bytesToHex(utils.base58ToBytes(this._address).slice(0,16));\n            var convertResult = coder.opParams(this._inputTypes,args,rand,this._sero,dy);\n            args = convertResult.params;\n            options.data = coder.addressPrefix(this._inputTypes,args,rand) + this.signature()+ coder.encodeParams(this._inputTypes, args,convertResult.shortAddr);\n            return options;\n        };\n\n        SolidityFunction.prototype.toPayloadCall = function (args,callback) {\n            var options = {};\n            if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {\n                options = args[args.length - 1];\n            }\n            this.validateArgs(args);\n            options.to = this._address;\n            var dy = false;\n            if (options.hasOwnProperty(\"dy\")){\n                dy = options.dy;\n            }\n            var rand = utils.bytesToHex(utils.base58ToBytes(this._address).slice(0,16));\n            var self = this;\n            var cb = function(err,result){\n                if (err){\n                    throw errors.InvalidResponse(err);\n                }\n                args = result.params;\n                options.data = coder.addressPrefix(self._inputTypes,args,rand) + self.signature()+ coder.encodeParams(self._inputTypes, args,result.shortAddr);\n                callback(options)\n            }\n            coder.opParams(this._inputTypes,args,rand,this._sero,dy,cb);\n        };\n\n        /**\n         * Should be used to get function signature\n         *\n         * @method signature\n         * @return {String} function signature\n         */\n        SolidityFunction.prototype.signature = function () {\n            return sha3(this._name).slice(0, 8);\n        };\n\n\n        SolidityFunction.prototype.unpackOutput = function (output,callback) {\n            if (!output) {\n                return;\n            }\n\n            output = output.length >= 2 ? output.slice(2) : output;\n\n            if (output.length>=8 &&output.slice(0,8)== \"08c379a0\") {\n                var result = coder.decodeParams([\"string\"],output.slice(8),null);\n\n                throw new Error(\"output invalid, reason = \" + result + \"\\noutput = \"+ output);\n            }\n\n            var self = this;\n            var shortAddress=[];\n            try{\n\n                shortAddress = coder.decodeShortAddress(this._outputTypes,output);\n\n            }catch(e){\n                if (output.length>=8 &&output.slice(0,8)== \"08c379a0\") {\n                    var result = coder.decodeParams([\"string\"],output.slice(8),null);\n\n                    throw new Error(\"output invalid, reason = \" + result + \"\\noutput = \"+ output);\n                }else {\n                    throw new Error(\"unpackOutput error = \" + e.toString()+ \"\\noutput = \"+ output);\n                }\n\n\n\n            }\n\n\n\n            if (!callback) {\n                var tys = coder.getSolidityTypes(this._outputTypes);\n                if (tys && tys.length>0){\n                    try {\n                        var addrMap = this._sero.getFullAddress(shortAddress);\n                        var result = coder.decodeParams(this._outputTypes, output,addrMap);\n                        return result.length === 1 ? result[0] : result;\n                    }catch (e) {\n                        if(output.length>=8 && output.slice(0,8)== \"08c379a0\"){\n                            var result = coder.decodeParams([\"string\"],output.slice(8),null);\n\n                            throw new Error(\"required,reason = \" + result + \"\\noutput = \"+ output);\n                        }else {\n                            throw new Error(\"unpackOutput error = \" + e.toString()+ \"\\noutput = \"+ output);\n                        }\n                    }\n\n                }else {\n                    if (output.length>=8 &&output.slice(0,8)== \"08c379a0\") {\n                        var result = coder.decodeParams([\"string\"],output.slice(8),null);\n\n                        throw new Error(\"required,reason = \" + result + \"\\noutput = \"+ output);\n                    }\n                }\n            }\n\n\n            if (shortAddress.length>0) {\n                var cb =  function(err,mapAddr){\n                    if (err) {\n                        throw err;\n                    }\n                    var result = coder.decodeParams(self._outputTypes, output,mapAddr);\n                    result = result.length === 1 ? result[0] : result;\n                    callback(err,result);\n                }\n                this._sero.getFullAddress(shortAddress,cb);\n\n            }else{\n                var result = coder.decodeParams(this._outputTypes, output.slice(8),null);\n                result =  result.length === 1 ? result[0] : result;\n                if (callback){\n                    callback(null,result);\n                }else {\n                    return result;\n                }\n\n            }\n\n        };\n\n        /**\n         * Calls a contract function.\n         *\n         * @method call\n         * @param {...Object} Contract function arguments\n         * @param {function} If the last argument is a function, the contract function\n         *   call will be asynchronous, and the callback will be passed the\n         *   error and result.\n         * @return {String} output bytes\n         */\n        SolidityFunction.prototype.call = function () {\n            var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });\n            var callback = this.extractCallback(args);\n            var defaultBlock = this.extractDefaultBlock(args);\n\n            if (!callback) {\n                var payload = this.toPayload(args);\n                var output = this._sero.call(payload, defaultBlock);\n                return this.unpackOutput(output);\n            }\n\n            var self = this;\n            var cb =  function(payload){\n                self._sero.call(payload, defaultBlock, function (error, output) {\n                    if (error) return callback(error, null);\n\n                    var unpacked = null;\n                    try {\n                        self.unpackOutput(output,callback);\n                    }\n                    catch (e) {\n                        error = e;\n                    }\n                });\n            }\n            this.toPayloadCall(args,cb);\n\n        };\n\n        /**\n         * Should be used to sendTransaction to solidity function\n         *\n         * @method sendTransaction\n         */\n        SolidityFunction.prototype.sendTransaction = function () {\n            var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });\n            var callback = this.extractCallback(args);\n            var options = {};\n            if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {\n                options = args[args.length - 1];\n            }\n            if (options.value > 0 && !this._payable) {\n                throw new Error('Cannot send value to non-payable function');\n            }\n            if (!callback) {\n                var payload = this.toPayload(args);\n                return this._sero.sendTransaction(payload);\n            }\n            var self = this;\n            var cb =function(payload){\n                self._sero.sendTransaction(payload, callback);\n            }\n            this.toPayloadCall(args,cb);\n\n\n        };\n\n        /**\n         * Should be used to estimateGas of solidity function\n         *\n         * @method estimateGas\n         */\n        SolidityFunction.prototype.estimateGas = function () {\n            var args = Array.prototype.slice.call(arguments);\n            var callback = this.extractCallback(args);\n            if (!callback) {\n                var payload = this.toPayload(args);\n                return this._sero.estimateGas(payload);\n            }\n\n            var self = this;\n            var cb =function(payload){\n                self._sero.estimateGas(payload, callback);\n            }\n            this.toPayloadCall(args,cb);\n        };\n\n        /**\n         * Return the encoded data of the call\n         *\n         * @method getData\n         * @return {String} the encoded data\n         */\n        SolidityFunction.prototype.getData = function () {\n            var args = Array.prototype.slice.call(arguments);\n            var callback = this.extractCallback(args);\n            if (!callback){\n                var payload = this.toPayload(args);\n                return payload.data;\n            }\n            var cb = function(result){\n                callback(result.data);\n            }\n            this.toPayloadCall(args,cb);\n\n        };\n\n        /**\n         * Should be used to get function display name\n         *\n         * @method displayName\n         * @return {String} display name of the function\n         */\n        SolidityFunction.prototype.displayName = function () {\n            return utils.extractDisplayName(this._name);\n        };\n\n        /**\n         * Should be used to get function type name\n         *\n         * @method typeName\n         * @return {String} type name of the function\n         */\n        SolidityFunction.prototype.typeName = function () {\n            return utils.extractTypeName(this._name);\n        };\n\n        /**\n         * Should be called to get rpc requests from solidity function\n         *\n         * @method request\n         * @returns {Object}\n         */\n        SolidityFunction.prototype.request = function () {\n            var args = Array.prototype.slice.call(arguments);\n            var callback = this.extractCallback(args);\n            var payload = this.toPayload(args);\n            var format = this.unpackOutput.bind(this);\n\n            return {\n                method: this._constant ? 'sero_call' : 'sero_sendTransaction',\n                callback: callback,\n                params: [payload],\n                format: format\n            };\n        };\n\n        /**\n         * Should be called to execute function\n         *\n         * @method execute\n         */\n        SolidityFunction.prototype.execute = function () {\n            var transaction = !this._constant;\n\n            // send transaction\n            if (transaction) {\n                return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));\n            }\n\n            // call\n            return this.call.apply(this, Array.prototype.slice.call(arguments));\n        };\n\n        /**\n         * Should be called to attach function to contract\n         *\n         * @method attachToContract\n         * @param {Contract}\n         */\n        SolidityFunction.prototype.attachToContract = function (contract) {\n            var execute = this.execute.bind(this);\n            execute.request = this.request.bind(this);\n            execute.call = this.call.bind(this);\n            execute.sendTransaction = this.sendTransaction.bind(this);\n            execute.estimateGas = this.estimateGas.bind(this);\n            execute.getData = this.getData.bind(this);\n            var displayName = this.displayName();\n            if (!contract[displayName]) {\n                contract[displayName] = execute;\n            }\n            contract[displayName][this.typeName()] = execute; // circular!!!!\n        };\n\n        module.exports = SolidityFunction;\n\n    },{\"../solidity/coder\":7,\"../utils/sha3\":20,\"../utils/utils\":21,\"./errors\":27,\"./formatters\":31}],33:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file httpprovider.js\n         * @authors:\n         *   Marek Kotewicz <marek@ethdev.com>\n         *   Marian Oancea <marian@ethdev.com>\n         *   Fabian Vogelsteller <fabian@ethdev.com>\n         * @date 2015\n         */\n\n        var errors = require('./errors');\n\n// workaround to use httpprovider in different envs\n\n// browser\n        if (typeof window !== 'undefined' && window.XMLHttpRequest) {\n            XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line\n// node\n        } else {\n            XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line\n        }\n\n        var XHR2 = require('xhr2'); // jshint ignore: line\n\n        /**\n         * HttpProvider should be used to send rpc calls over http\n         */\n        var HttpProvider = function (host, timeout, user, password, headers) {\n            this.host = host || 'http://localhost:8545';\n            this.timeout = timeout || 0;\n            this.user = user;\n            this.password = password;\n            this.headers = headers;\n        };\n\n        /**\n         * Should be called to prepare new XMLHttpRequest\n         *\n         * @method prepareRequest\n         * @param {Boolean} true if request should be async\n         * @return {XMLHttpRequest} object\n         */\n        HttpProvider.prototype.prepareRequest = function (async) {\n            var request;\n\n            if (async) {\n                request = new XHR2();\n                request.timeout = this.timeout;\n            } else {\n                request = new XMLHttpRequest();\n            }\n\n            request.open('POST', this.host, async);\n            if (this.user && this.password) {\n                var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64');\n                request.setRequestHeader('Authorization', auth);\n            } request.setRequestHeader('Content-Type', 'application/json');\n            if(this.headers) {\n                this.headers.forEach(function(header) {\n                    request.setRequestHeader(header.name, header.value);\n                });\n            }\n            return request;\n        };\n\n        /**\n         * Should be called to make sync request\n         *\n         * @method send\n         * @param {Object} payload\n         * @return {Object} result\n         */\n        HttpProvider.prototype.send = function (payload) {\n            var request = this.prepareRequest(false);\n\n            try {\n                request.send(JSON.stringify(payload));\n            } catch (error) {\n                throw errors.InvalidConnection(this.host);\n            }\n\n            var result = request.responseText;\n\n            try {\n                result = JSON.parse(result);\n            } catch (e) {\n                throw errors.InvalidResponse(request.responseText);\n            }\n\n            return result;\n        };\n\n        /**\n         * Should be used to make async request\n         *\n         * @method sendAsync\n         * @param {Object} payload\n         * @param {Function} callback triggered on end with (err, result)\n         */\n        HttpProvider.prototype.sendAsync = function (payload, callback) {\n            var request = this.prepareRequest(true);\n\n            request.onreadystatechange = function () {\n                if (request.readyState === 4 && request.timeout !== 1) {\n                    var result = request.responseText;\n                    var error = null;\n\n                    try {\n                        result = JSON.parse(result);\n                    } catch (e) {\n                        error = errors.InvalidResponse(request.responseText);\n                    }\n\n                    callback(error, result);\n                }\n            };\n\n            request.ontimeout = function () {\n                callback(errors.ConnectionTimeout(this.timeout));\n            };\n\n            try {\n                request.send(JSON.stringify(payload));\n            } catch (error) {\n                callback(errors.InvalidConnection(this.host));\n            }\n        };\n\n        /**\n         * Synchronously tries to make Http request\n         *\n         * @method isConnected\n         * @return {Boolean} returns true if request haven't failed. Otherwise false\n         */\n        HttpProvider.prototype.isConnected = function () {\n            try {\n                this.send({\n                    id: 9999999999,\n                    jsonrpc: '2.0',\n                    method: 'net_listening',\n                    params: []\n                });\n                return true;\n            } catch (e) {\n                return false;\n            }\n        };\n\n        module.exports = HttpProvider;\n\n    },{\"./errors\":27,\"xhr2\":90,\"xmlhttprequest\":18}],34:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file iban.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var BigNumber = require('bignumber.js');\n\n        var padLeft = function (string, bytes) {\n            var result = string;\n            while (result.length < bytes * 2) {\n                result = '0' + result;\n            }\n            return result;\n        };\n\n        /**\n         * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to\n         * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.\n         *\n         * @method iso13616Prepare\n         * @param {String} iban the IBAN\n         * @returns {String} the prepared IBAN\n         */\n        var iso13616Prepare = function (iban) {\n            var A = 'A'.charCodeAt(0);\n            var Z = 'Z'.charCodeAt(0);\n\n            iban = iban.toUpperCase();\n            iban = iban.substr(4) + iban.substr(0,4);\n\n            return iban.split('').map(function(n){\n                var code = n.charCodeAt(0);\n                if (code >= A && code <= Z){\n                    // A = 10, B = 11, ... Z = 35\n                    return code - A + 10;\n                } else {\n                    return n;\n                }\n            }).join('');\n        };\n\n        /**\n         * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064.\n         *\n         * @method mod9710\n         * @param {String} iban\n         * @returns {Number}\n         */\n        var mod9710 = function (iban) {\n            var remainder = iban,\n                block;\n\n            while (remainder.length > 2){\n                block = remainder.slice(0, 9);\n                remainder = parseInt(block, 10) % 97 + remainder.slice(block.length);\n            }\n\n            return parseInt(remainder, 10) % 97;\n        };\n\n        /**\n         * This prototype should be used to create iban object from iban correct string\n         *\n         * @param {String} iban\n         */\n        var Iban = function (iban) {\n            this._iban = iban;\n        };\n\n        /**\n         * This method should be used to create iban object from ethereum address\n         *\n         * @method fromAddress\n         * @param {String} address\n         * @return {Iban} the IBAN object\n         */\n        Iban.fromAddress = function (address) {\n            var asBn = new BigNumber(address, 16);\n            var base36 = asBn.toString(36);\n            var padded = padLeft(base36, 15);\n            return Iban.fromBban(padded.toUpperCase());\n        };\n\n        /**\n         * Convert the passed BBAN to an IBAN for this country specification.\n         * Please note that <i>\"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account\"</i>.\n         * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits\n         *\n         * @method fromBban\n         * @param {String} bban the BBAN to convert to IBAN\n         * @returns {Iban} the IBAN object\n         */\n        Iban.fromBban = function (bban) {\n            var countryCode = 'XE';\n\n            var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban));\n            var checkDigit = ('0' + (98 - remainder)).slice(-2);\n\n            return new Iban(countryCode + checkDigit + bban);\n        };\n\n        /**\n         * Should be used to create IBAN object for given institution and identifier\n         *\n         * @method createIndirect\n         * @param {Object} options, required options are \"institution\" and \"identifier\"\n         * @return {Iban} the IBAN object\n         */\n        Iban.createIndirect = function (options) {\n            return Iban.fromBban('ETH' + options.institution + options.identifier);\n        };\n\n        /**\n         * Thos method should be used to check if given string is valid iban object\n         *\n         * @method isValid\n         * @param {String} iban string\n         * @return {Boolean} true if it is valid IBAN\n         */\n        Iban.isValid = function (iban) {\n            var i = new Iban(iban);\n            return i.isValid();\n        };\n\n        /**\n         * Should be called to check if iban is correct\n         *\n         * @method isValid\n         * @returns {Boolean} true if it is, otherwise false\n         */\n        Iban.prototype.isValid = function () {\n            return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) &&\n                mod9710(iso13616Prepare(this._iban)) === 1;\n        };\n\n        /**\n         * Should be called to check if iban number is direct\n         *\n         * @method isDirect\n         * @returns {Boolean} true if it is, otherwise false\n         */\n        Iban.prototype.isDirect = function () {\n            return this._iban.length === 34 || this._iban.length === 35;\n        };\n\n        /**\n         * Should be called to check if iban number if indirect\n         *\n         * @method isIndirect\n         * @returns {Boolean} true if it is, otherwise false\n         */\n        Iban.prototype.isIndirect = function () {\n            return this._iban.length === 20;\n        };\n\n        /**\n         * Should be called to get iban checksum\n         * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003)\n         *\n         * @method checksum\n         * @returns {String} checksum\n         */\n        Iban.prototype.checksum = function () {\n            return this._iban.substr(2, 2);\n        };\n\n        /**\n         * Should be called to get institution identifier\n         * eg. XREG\n         *\n         * @method institution\n         * @returns {String} institution identifier\n         */\n        Iban.prototype.institution = function () {\n            return this.isIndirect() ? this._iban.substr(7, 4) : '';\n        };\n\n        /**\n         * Should be called to get client identifier within institution\n         * eg. GAVOFYORK\n         *\n         * @method client\n         * @returns {String} client identifier\n         */\n        Iban.prototype.client = function () {\n            return this.isIndirect() ? this._iban.substr(11) : '';\n        };\n\n        /**\n         * Should be called to get client direct address\n         *\n         * @method address\n         * @returns {String} client direct address\n         */\n        Iban.prototype.address = function () {\n            if (this.isDirect()) {\n                var base36 = this._iban.substr(4);\n                var asBn = new BigNumber(base36, 36);\n                return padLeft(asBn.toString(16), 20);\n            }\n\n            return '';\n        };\n\n        Iban.prototype.toString = function () {\n            return this._iban;\n        };\n\n        module.exports = Iban;\n\n\n    },{\"bignumber.js\":\"bignumber.js\"}],35:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file ipcprovider.js\n         * @authors:\n         *   Fabian Vogelsteller <fabian@ethdev.com>\n         * @date 2015\n         */\n\n        \"use strict\";\n\n        var utils = require('../utils/utils');\n        var errors = require('./errors');\n\n\n        var IpcProvider = function (path, net) {\n            var _this = this;\n            this.responseCallbacks = {};\n            this.path = path;\n\n            this.connection = net.connect({path: this.path});\n\n            this.connection.on('error', function(e){\n                console.error('IPC Connection Error', e);\n                _this._timeout();\n            });\n\n            this.connection.on('end', function(){\n                _this._timeout();\n            });\n\n\n            // LISTEN FOR CONNECTION RESPONSES\n            this.connection.on('data', function(data) {\n                /*jshint maxcomplexity: 6 */\n\n                _this._parseResponse(data.toString()).forEach(function(result){\n\n                    var id = null;\n\n                    // get the id which matches the returned id\n                    if(utils.isArray(result)) {\n                        result.forEach(function(load){\n                            if(_this.responseCallbacks[load.id])\n                                id = load.id;\n                        });\n                    } else {\n                        id = result.id;\n                    }\n\n                    // fire the callback\n                    if(_this.responseCallbacks[id]) {\n                        _this.responseCallbacks[id](null, result);\n                        delete _this.responseCallbacks[id];\n                    }\n                });\n            });\n        };\n\n        /**\n         Will parse the response and make an array out of it.\n\n         @method _parseResponse\n         @param {String} data\n         */\n        IpcProvider.prototype._parseResponse = function(data) {\n            var _this = this,\n                returnValues = [];\n\n            // DE-CHUNKER\n            var dechunkedData = data\n                .replace(/\\}[\\n\\r]?\\{/g,'}|--|{') // }{\n                .replace(/\\}\\][\\n\\r]?\\[\\{/g,'}]|--|[{') // }][{\n                .replace(/\\}[\\n\\r]?\\[\\{/g,'}|--|[{') // }[{\n                .replace(/\\}\\][\\n\\r]?\\{/g,'}]|--|{') // }]{\n                .split('|--|');\n\n            dechunkedData.forEach(function(data){\n\n                // prepend the last chunk\n                if(_this.lastChunk)\n                    data = _this.lastChunk + data;\n\n                var result = null;\n\n                try {\n                    result = JSON.parse(data);\n\n                } catch(e) {\n\n                    _this.lastChunk = data;\n\n                    // start timeout to cancel all requests\n                    clearTimeout(_this.lastChunkTimeout);\n                    _this.lastChunkTimeout = setTimeout(function(){\n                        _this._timeout();\n                        throw errors.InvalidResponse(data);\n                    }, 1000 * 15);\n\n                    return;\n                }\n\n                // cancel timeout and set chunk to null\n                clearTimeout(_this.lastChunkTimeout);\n                _this.lastChunk = null;\n\n                if(result)\n                    returnValues.push(result);\n            });\n\n            return returnValues;\n        };\n\n\n        /**\n         Get the adds a callback to the responseCallbacks object,\n         which will be called if a response matching the response Id will arrive.\n\n         @method _addResponseCallback\n         */\n        IpcProvider.prototype._addResponseCallback = function(payload, callback) {\n            var id = payload.id || payload[0].id;\n            var method = payload.method || payload[0].method;\n\n            this.responseCallbacks[id] = callback;\n            this.responseCallbacks[id].method = method;\n        };\n\n        /**\n         Timeout all requests when the end/error event is fired\n\n         @method _timeout\n         */\n        IpcProvider.prototype._timeout = function() {\n            for(var key in this.responseCallbacks) {\n                if(this.responseCallbacks.hasOwnProperty(key)){\n                    this.responseCallbacks[key](errors.InvalidConnection('on IPC'));\n                    delete this.responseCallbacks[key];\n                }\n            }\n        };\n\n\n        /**\n         Check if the current connection is still valid.\n\n         @method isConnected\n         */\n        IpcProvider.prototype.isConnected = function() {\n            var _this = this;\n\n            // try reconnect, when connection is gone\n            if(!_this.connection.writable)\n                _this.connection.connect({path: _this.path});\n\n            return !!this.connection.writable;\n        };\n\n        IpcProvider.prototype.send = function (payload) {\n\n            if(this.connection.writeSync) {\n                var result;\n\n                // try reconnect, when connection is gone\n                if(!this.connection.writable)\n                    this.connection.connect({path: this.path});\n\n                var data = this.connection.writeSync(JSON.stringify(payload));\n\n                try {\n                    result = JSON.parse(data);\n                } catch(e) {\n                    throw errors.InvalidResponse(data);\n                }\n\n                return result;\n\n            } else {\n                throw new Error('You tried to send \"'+ payload.method +'\" synchronously. Synchronous requests are not supported by the IPC provider.');\n            }\n        };\n\n        IpcProvider.prototype.sendAsync = function (payload, callback) {\n            // try reconnect, when connection is gone\n            if(!this.connection.writable)\n                this.connection.connect({path: this.path});\n\n\n            this.connection.write(JSON.stringify(payload));\n            this._addResponseCallback(payload, callback);\n        };\n\n        module.exports = IpcProvider;\n\n\n    },{\"../utils/utils\":21,\"./errors\":27}],36:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file jsonrpc.js\n         * @authors:\n         *   Marek Kotewicz <marek@ethdev.com>\n         *   Aaron Kumavis <aaron@kumavis.me>\n         * @date 2015\n         */\n\n// Initialize Jsonrpc as a simple object with utility functions.\n        var Jsonrpc = {\n            messageId: 0\n        };\n\n        /**\n         * Should be called to valid json create payload object\n         *\n         * @method toPayload\n         * @param {Function} method of jsonrpc call, required\n         * @param {Array} params, an array of method params, optional\n         * @returns {Object} valid jsonrpc payload object\n         */\n        Jsonrpc.toPayload = function (method, params) {\n            if (!method)\n                console.error('jsonrpc method should be specified!');\n\n            // advance message ID\n            Jsonrpc.messageId++;\n\n            return {\n                jsonrpc: '2.0',\n                id: Jsonrpc.messageId,\n                method: method,\n                params: params || []\n            };\n        };\n\n        /**\n         * Should be called to check if jsonrpc response is valid\n         *\n         * @method isValidResponse\n         * @param {Object}\n         * @returns {Boolean} true if response is valid, otherwise false\n         */\n        Jsonrpc.isValidResponse = function (response) {\n            return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response);\n\n            function validateSingleMessage(message){\n                return !!message &&\n                    !message.error &&\n                    message.jsonrpc === '2.0' &&\n                    typeof message.id === 'number' &&\n                    message.result !== undefined; // only undefined is not valid json object\n            }\n        };\n\n        /**\n         * Should be called to create batch payload object\n         *\n         * @method toBatchPayload\n         * @param {Array} messages, an array of objects with method (required) and params (optional) fields\n         * @returns {Array} batch payload\n         */\n        Jsonrpc.toBatchPayload = function (messages) {\n            return messages.map(function (message) {\n                return Jsonrpc.toPayload(message.method, message.params);\n            });\n        };\n\n        module.exports = Jsonrpc;\n\n\n    },{}],37:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file method.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var utils = require('../utils/utils');\n        var errors = require('./errors');\n\n        var Method = function (options) {\n            this.name = options.name;\n            this.call = options.call;\n            this.params = options.params || 0;\n            this.inputFormatter = options.inputFormatter;\n            this.outputFormatter = options.outputFormatter;\n            this.requestManager = null;\n        };\n\n        Method.prototype.setRequestManager = function (rm) {\n            this.requestManager = rm;\n        };\n\n        /**\n         * Should be used to determine name of the jsonrpc method based on arguments\n         *\n         * @method getCall\n         * @param {Array} arguments\n         * @return {String} name of jsonrpc method\n         */\n        Method.prototype.getCall = function (args) {\n            return utils.isFunction(this.call) ? this.call(args) : this.call;\n        };\n\n        /**\n         * Should be used to extract callback from array of arguments. Modifies input param\n         *\n         * @method extractCallback\n         * @param {Array} arguments\n         * @return {Function|Null} callback, if exists\n         */\n        Method.prototype.extractCallback = function (args) {\n            if (utils.isFunction(args[args.length - 1])) {\n                return args.pop(); // modify the args array!\n            }\n        };\n\n        /**\n         * Should be called to check if the number of arguments is correct\n         *\n         * @method validateArgs\n         * @param {Array} arguments\n         * @throws {Error} if it is not\n         */\n        Method.prototype.validateArgs = function (args) {\n            if (args.length !== this.params) {\n                throw errors.InvalidNumberOfRPCParams();\n            }\n        };\n\n        /**\n         * Should be called to format input args of method\n         *\n         * @method formatInput\n         * @param {Array}\n         * @return {Array}\n         */\n        Method.prototype.formatInput = function (args) {\n            if (!this.inputFormatter) {\n                return args;\n            }\n\n            return this.inputFormatter.map(function (formatter, index) {\n                return formatter ? formatter(args[index]) : args[index];\n            });\n        };\n\n        /**\n         * Should be called to format output(result) of method\n         *\n         * @method formatOutput\n         * @param {Object}\n         * @return {Object}\n         */\n        Method.prototype.formatOutput = function (result) {\n            return this.outputFormatter && result ? this.outputFormatter(result) : result;\n        };\n\n        /**\n         * Should create payload from given input args\n         *\n         * @method toPayload\n         * @param {Array} args\n         * @return {Object}\n         */\n        Method.prototype.toPayload = function (args) {\n            var call = this.getCall(args);\n            var callback = this.extractCallback(args);\n            var params = this.formatInput(args);\n            this.validateArgs(params);\n\n            return {\n                method: call,\n                params: params,\n                callback: callback\n            };\n        };\n\n        Method.prototype.attachToObject = function (obj) {\n            var func = this.buildCall();\n            func.call = this.call; // TODO!!! that's ugly. filter.js uses it\n            var name = this.name.split('.');\n            if (name.length > 1) {\n                obj[name[0]] = obj[name[0]] || {};\n                obj[name[0]][name[1]] = func;\n            } else {\n                obj[name[0]] = func;\n            }\n        };\n\n        Method.prototype.buildCall = function() {\n            var method = this;\n            var send = function () {\n                var payload = method.toPayload(Array.prototype.slice.call(arguments));\n                if (payload.callback) {\n                    return method.requestManager.sendAsync(payload, function (err, result) {\n                        payload.callback(err, method.formatOutput(result));\n                    });\n                }\n                return method.formatOutput(method.requestManager.send(payload));\n            };\n            send.request = this.request.bind(this);\n            return send;\n        };\n\n        /**\n         * Should be called to create pure JSONRPC request which can be used in batch request\n         *\n         * @method request\n         * @param {...} params\n         * @return {Object} jsonrpc request\n         */\n        Method.prototype.request = function () {\n            var payload = this.toPayload(Array.prototype.slice.call(arguments));\n            payload.format = this.formatOutput.bind(this);\n            return payload;\n        };\n\n        module.exports = Method;\n\n    },{\"../utils/utils\":21,\"./errors\":27}],38:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file db.js\n         * @authors:\n         *   Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var Method = require('../method');\n\n        var DB = function (web3) {\n            this._requestManager = web3._requestManager;\n\n            var self = this;\n\n            methods().forEach(function(method) {\n                method.attachToObject(self);\n                method.setRequestManager(web3._requestManager);\n            });\n        };\n\n        var methods = function () {\n            var putString = new Method({\n                name: 'putString',\n                call: 'db_putString',\n                params: 3\n            });\n\n            var getString = new Method({\n                name: 'getString',\n                call: 'db_getString',\n                params: 2\n            });\n\n            var putHex = new Method({\n                name: 'putHex',\n                call: 'db_putHex',\n                params: 3\n            });\n\n            var getHex = new Method({\n                name: 'getHex',\n                call: 'db_getHex',\n                params: 2\n            });\n\n            return [\n                putString, getString, putHex, getHex\n            ];\n        };\n\n        module.exports = DB;\n\n    },{\"../method\":37}],39:[function(require,module,exports){\n        \"use strict\";\n\n        var Method = require('../method');\n        var formatters = require('../formatters');\n\n        function Exchange(web3) {\n            this._requestManager = web3._requestManager;\n\n            var self = this;\n\n            methods().forEach(function(method) {\n                method.attachToObject(self);\n                method.setRequestManager(self._requestManager);\n            });\n        }\n\n        var methods = function () {\n            var getPkr = new Method({\n                name: 'getPkr',\n                call: 'exchange_getPkr',\n                params: 2\n            });\n\n            var getBalances = new Method({\n                name: 'getBalances',\n                call: 'exchange_getBalances',\n                params: 1\n            });\n\n            var getPkSynced = new Method({\n                name: 'getPkSynced',\n                call: 'exchange_getPkSynced',\n                params: 1\n            });\n\n            var merge = new Method({\n                name: 'merge',\n                call: 'exchange_merge',\n                params: 2\n            });\n\n            var genTx = new Method({\n                name: 'genTx',\n                call: 'exchange_genTx',\n                params: 1\n            });\n\n            var genTxWithSign = new Method({\n                name: 'genTxWithSign',\n                call: 'exchange_genTxWithSign',\n                params: 1\n            });\n\n            var getRecords = new Method({\n                name: 'getRecords',\n                call: 'exchange_getRecords',\n                params: 3\n            });\n            var commitTx = new Method({\n                name: 'commitTx',\n                call: 'exchange_commitTx',\n                params: 1\n            });\n            var validAddress = new Method({\n                name: 'validAddress',\n                call: 'exchange_validAddress',\n                params: 1\n            });\n            var getMaxAvailable = new Method({\n                name: 'getMaxAvailable',\n                call: 'exchange_getMaxAvailable',\n                params: 2\n            });\n\n            return [\n                getPkr,\n                getPkSynced,\n                merge,\n                getBalances,\n                genTx,\n                genTxWithSign,\n                getRecords,\n                commitTx,\n                validAddress,\n                getMaxAvailable\n            ];\n        };\n\n\n        module.exports = Exchange;\n\n    },{\"../formatters\":31,\"../method\":37}],40:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file eth.js\n         * @authors:\n         *   Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var utils = require('../../utils/utils');\n        var Property = require('../property');\n\n        var Net = function (web3) {\n            this._requestManager = web3._requestManager;\n\n            var self = this;\n\n            properties().forEach(function(p) {\n                p.attachToObject(self);\n                p.setRequestManager(web3._requestManager);\n            });\n        };\n\n/// @returns an array of objects describing web3.sero api properties\n        var properties = function () {\n            return [\n                new Property({\n                    name: 'listening',\n                    getter: 'net_listening'\n                }),\n                new Property({\n                    name: 'peerCount',\n                    getter: 'net_peerCount',\n                    outputFormatter: utils.toDecimal\n                })\n            ];\n        };\n\n        module.exports = Net;\n\n    },{\"../../utils/utils\":21,\"../property\":46}],41:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file eth.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @author Fabian Vogelsteller <fabian@ethdev.com>\n         * @date 2015\n         */\n\n        \"use strict\";\n\n        var Method = require('../method');\n        var Property = require('../property');\n        var formatters = require('../formatters');\n\n        function Personal(web3) {\n            this._requestManager = web3._requestManager;\n\n            var self = this;\n\n            methods().forEach(function(method) {\n                method.attachToObject(self);\n                method.setRequestManager(self._requestManager);\n            });\n\n            properties().forEach(function(p) {\n                p.attachToObject(self);\n                p.setRequestManager(self._requestManager);\n            });\n        }\n\n        var methods = function () {\n            var newAccount = new Method({\n                name: 'newAccount',\n                call: 'personal_newAccount',\n                params: 1,\n                inputFormatter: [null]\n            });\n\n            var newAccountWithMnemonic = new Method({\n                name: 'newAccountWithMnemonic',\n                call: 'personal_newAccountWithMnemonic',\n                params: 1,\n                inputFormatter: [null]\n            });\n            var importMnemonic = new Method({\n                name: 'importMnemonic',\n                call: 'personal_importMnemonic',\n                params: 3\n            });\n            var importRawKey = new Method({\n                name: 'importRawKey',\n                call: 'personal_importRawKey',\n                params: 4\n            });\n\n            var importTk = new Method({\n                name: 'importTk',\n                call: 'personal_importTk',\n                params: 2\n            });\n            var sign = new Method({\n                name: 'sign',\n                call: 'personal_sign',\n                params: 3,\n                inputFormatter: [null, formatters.inputAddressFormatter, null]\n            });\n\n            var ecRecover = new Method({\n                name: 'ecRecover',\n                call: 'personal_ecRecover',\n                params: 2\n            });\n\n            var unlockAccount = new Method({\n                name: 'unlockAccount',\n                call: 'personal_unlockAccount',\n                params: 3,\n                inputFormatter: [formatters.inputAddressFormatter, null, null]\n            });\n\n            var sendTransaction = new Method({\n                name: 'sendTransaction',\n                call: 'personal_sendTransaction',\n                params: 2,\n                inputFormatter: [formatters.inputTransactionFormatter, null]\n            });\n\n            var lockAccount = new Method({\n                name: 'lockAccount',\n                call: 'personal_lockAccount',\n                params: 1,\n                inputFormatter: [formatters.inputAddressFormatter]\n            });\n\n            return [\n                newAccount,\n                newAccountWithMnemonic,\n                importRawKey,\n                importMnemonic,\n                importTk,\n                unlockAccount,\n                ecRecover,\n                sign,\n                sendTransaction,\n                lockAccount\n            ];\n        };\n\n        var properties = function () {\n            return [\n                new Property({\n                    name: 'listAccounts',\n                    getter: 'personal_listAccounts'\n                })\n            ];\n        };\n\n\n        module.exports = Personal;\n\n    },{\"../formatters\":31,\"../method\":37,\"../property\":46}],42:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file sero.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @author Fabian Vogelsteller <fabian@ethdev.com>\n         * @date 2015\n         */\n\n        \"use strict\";\n\n        var formatters = require('../formatters');\n        var utils = require('../../utils/utils');\n        var Method = require('../method');\n        var Property = require('../property');\n        var c = require('../../utils/config');\n        var Contract = require('../contract');\n        var watches = require('./watches');\n        var Filter = require('../filter');\n        var IsSyncing = require('../syncing');\n        var namereg = require('../namereg');\n        var Iban = require('../iban');\n        var transfer = require('../transfer');\n\n        var blockCall = function (args) {\n            return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? \"sero_getBlockByHash\" : \"sero_getBlockByNumber\";\n        };\n\n        var transactionFromBlockCall = function (args) {\n            return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'sero_getTransactionByBlockHashAndIndex' : 'sero_getTransactionByBlockNumberAndIndex';\n        };\n\n        var uncleCall = function (args) {\n            return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'sero_getUncleByBlockHashAndIndex' : 'sero_getUncleByBlockNumberAndIndex';\n        };\n\n        var getBlockTransactionCountCall = function (args) {\n            return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'sero_getBlockTransactionCountByHash' : 'sero_getBlockTransactionCountByNumber';\n        };\n\n        var uncleCountCall = function (args) {\n            return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'sero_getUncleCountByBlockHash' : 'sero_getUncleCountByBlockNumber';\n        };\n\n        function Sero(web3) {\n            this._requestManager = web3._requestManager;\n\n            var self = this;\n\n            methods().forEach(function(method) {\n                method.attachToObject(self);\n                method.setRequestManager(self._requestManager);\n            });\n\n            properties().forEach(function(p) {\n                p.attachToObject(self);\n                p.setRequestManager(self._requestManager);\n            });\n\n        }\n\n        Object.defineProperty(Sero.prototype, 'defaultBlock', {\n            get: function () {\n                return c.defaultBlock;\n            },\n            set: function (val) {\n                c.defaultBlock = val;\n                return val;\n            }\n        });\n\n        Object.defineProperty(Sero.prototype, 'defaultAccount', {\n            get: function () {\n                return c.defaultAccount;\n            },\n            set: function (val) {\n                c.defaultAccount = val;\n                return val;\n            }\n        });\n\n        var methods = function () {\n\n            var isMinePKr = new Method({\n                name: 'isMinePKr',\n                call: 'sero_isMinePKr',\n                params: 1\n            });\n\n            var getBalance = new Method({\n                name: 'getBalance',\n                call: 'sero_getBalance',\n                params: 2,\n                inputFormatter: [formatters.inputParamAddressFormatter,formatters.inputDefaultBlockNumberFormatter],\n                outputFormatter: formatters.outputBalanceFormatter\n            });\n\n            var getTk = new Method({\n                name: 'getTk',\n                call: 'sero_getTk',\n                params: 1,\n                inputFormatter: [formatters.inputParamAddressFormatter]\n            });\n\n            var getPkg = new Method({\n                name: 'getPkg',\n                call: 'sero_getPkg',\n                params: 3,\n                inputFormatter: [formatters.inputParamAddressFormatter,null,null],\n            });\n\n            var watchPkg = new Method({\n                name: 'watchPkg',\n                call: 'sero_watchPkg',\n                params: 2,\n            });\n\n            var getStorageAt = new Method({\n                name: 'getStorageAt',\n                call: 'sero_getStorageAt',\n                params: 3,\n                inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter]\n            });\n\n            var getCode = new Method({\n                name: 'getCode',\n                call: 'sero_getCode',\n                params: 2,\n                inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter]\n            });\n\n            var getBlock = new Method({\n                name: 'getBlock',\n                call: blockCall,\n                params: 2,\n                inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }],\n                outputFormatter: formatters.outputBlockFormatter\n            });\n\n            var getUncle = new Method({\n                name: 'getUncle',\n                call: uncleCall,\n                params: 2,\n                inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],\n                outputFormatter: formatters.outputBlockFormatter,\n\n            });\n\n            var getCompilers = new Method({\n                name: 'getCompilers',\n                call: 'sero_getCompilers',\n                params: 0\n            });\n\n            var getBlockTransactionCount = new Method({\n                name: 'getBlockTransactionCount',\n                call: getBlockTransactionCountCall,\n                params: 1,\n                inputFormatter: [formatters.inputBlockNumberFormatter],\n                outputFormatter: utils.toDecimal\n            });\n\n            var getBlockUncleCount = new Method({\n                name: 'getBlockUncleCount',\n                call: uncleCountCall,\n                params: 1,\n                inputFormatter: [formatters.inputBlockNumberFormatter],\n                outputFormatter: utils.toDecimal\n            });\n\n            var getTransaction = new Method({\n                name: 'getTransaction',\n                call: 'sero_getTransactionByHash',\n                params: 1,\n                outputFormatter: formatters.outputTransactionFormatter\n            });\n\n            var convertAddressParams = new Method({\n                name: 'convertAddressParams',\n                call: 'sero_convertAddressParams',\n                params: 3,\n            });\n\n            var getFullAddress = new Method({\n                name: 'getFullAddress',\n                call: 'sero_getFullAddress',\n                params: 1,\n            });\n            var getBlockInfo= new Method({\n                name:'getBlockInfo',\n                call:\"sero_getBlockInfo\",\n                inputFormatter: [formatters.inputBlockNumberFormatter,formatters.inputBlockNumberFormatter],\n                params:2\n            })\n            var getAnchor = new Method({\n                name :'getAnchor',\n                call:\"sero_getAnchor\",\n                params:1\n            })\n\n            var currencyToContractAddress = new Method({\n                name: 'cyToContractAddress',\n                call: 'sero_currencyToContractAddress',\n                params: 1,\n            });\n\n            var getDecimal = new Method({\n                name: 'getDecimal',\n                call: 'sero_getDecimal',\n                params: 1,\n                outputFormatter: utils.toDecimal\n            });\n\n            var getTransactionFromBlock = new Method({\n                name: 'getTransactionFromBlock',\n                call: transactionFromBlockCall,\n                params: 2,\n                inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],\n                outputFormatter: formatters.outputTransactionFormatter\n            });\n\n            var getTransactionReceipt = new Method({\n                name: 'getTransactionReceipt',\n                call: 'sero_getTransactionReceipt',\n                params: 1,\n                outputFormatter: formatters.outputTransactionReceiptFormatter\n            });\n\n            var getTransactionCount = new Method({\n                name: 'getTransactionCount',\n                call: 'sero_getTransactionCount',\n                params: 2,\n                inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter],\n                outputFormatter: utils.toDecimal\n            });\n\n            var sendTransaction = new Method({\n                name: 'sendTransaction',\n                call: 'sero_sendTransaction',\n                params: 1,\n                inputFormatter: [formatters.inputTransactionFormatter]\n            });\n            var genPKr=new Method({\n                name: 'genPKr',\n                call: 'sero_genPKr',\n                params: 1,\n                inputFormatter: [formatters.inputAddressFormatter]\n            });\n            var genIndexPKr=new Method({\n                name: 'genIndexPKr',\n                call: 'sero_genIndexPKr',\n                params: 2,\n                inputFormatter: [formatters.inputAddressFormatter,null]\n            });\n            var genIndexPKrByTk=new Method({\n                name: 'genIndexPKrByTk',\n                call: 'sero_genIndexPKrByTk',\n                params: 2,\n            });\n\n            var reSendTransaction = new Method({\n                name: 'reSendTransaction',\n                call: 'sero_reSendTransaction',\n                params: 1,\n                inputFormatter: [utils.toHex]\n            });\n\n            var createPkg = new Method({\n                name: 'createPkg',\n                call: 'sero_createPkg',\n                params: 1,\n                inputFormatter: [formatters.inputTransactionFormatter]\n            });\n\n            var closePkg = new Method({\n                name: 'closePkg',\n                call: 'sero_closePkg',\n                params: 1,\n                inputFormatter: [formatters.inputTransactionFormatter]\n            });\n\n            var transferPkg = new Method({\n                name: 'transferPkg',\n                call: 'sero_transferPkg',\n                params: 1,\n                inputFormatter: [formatters.inputTransactionFormatter]\n            });\n\n            var call = new Method({\n                name: 'call',\n                call: 'sero_call',\n                params: 2,\n                inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter]\n            });\n\n            var estimateGas = new Method({\n                name: 'estimateGas',\n                call: 'sero_estimateGas',\n                params: 1,\n                inputFormatter: [formatters.inputCallFormatter],\n                outputFormatter: utils.toDecimal\n            });\n\n            var compileSolidity = new Method({\n                name: 'compile.solidity',\n                call: 'sero_compileSolidity',\n                params: 1\n            });\n\n            var compileLLL = new Method({\n                name: 'compile.lll',\n                call: 'sero_compileLLL',\n                params: 1\n            });\n\n            var compileSerpent = new Method({\n                name: 'compile.serpent',\n                call: 'sero_compileSerpent',\n                params: 1\n            });\n\n            var submitWork = new Method({\n                name: 'submitWork',\n                call: 'sero_submitWork',\n                params: 3\n            });\n\n            var getWork = new Method({\n                name: 'getWork',\n                call: 'sero_getWork',\n                params: 0\n            });\n\n            var startHashrate = new Method({\n                name: 'startHashrate',\n                call: 'sero_startHashrate',\n                params: 0\n            });\n\n            var stopHashrate = new Method({\n                name: 'stopHashrate',\n                call: 'sero_stopHashrate',\n                params: 0\n            });\n\n            var getBlockRewardByNumber = new Method({\n                name: 'getBlockRewardByNumber',\n                call: 'sero_getBlockRewardByNumber',\n                params: 1,\n                inputFormatter: [formatters.inputBlockNumberFormatter],\n                outputFormatter:function(val){return val.map(function(e){\n                    return utils.toBigNumber(e);\n                })}\n            });\n\n            return [\n                isMinePKr,\n                getBalance,\n                getTk,\n                getPkg,\n                watchPkg,\n                getStorageAt,\n                getCode,\n                getBlock,\n                getUncle,\n                getCompilers,\n                getBlockTransactionCount,\n                getBlockInfo,\n                getAnchor,\n                getBlockUncleCount,\n                getTransaction,\n                getTransactionFromBlock,\n                getTransactionReceipt,\n                getTransactionCount,\n                call,\n                estimateGas,\n                sendTransaction,\n                reSendTransaction,\n                createPkg,\n                closePkg,\n                transferPkg,\n                convertAddressParams,\n                genPKr,\n                genIndexPKr,\n                genIndexPKrByTk,\n                getFullAddress,\n                currencyToContractAddress,\n                getDecimal,\n                compileSolidity,\n                compileLLL,\n                compileSerpent,\n                submitWork,\n                getWork,\n                startHashrate,\n                stopHashrate,\n                getBlockRewardByNumber\n            ];\n        };\n\n\n        var properties = function () {\n            return [\n                new Property({\n                    name: 'coinbase',\n                    getter: 'sero_coinbase'\n                }),\n                new Property({\n                    name: 'mining',\n                    getter: 'sero_mining'\n                }),\n                new Property({\n                    name: 'hashrate',\n                    getter: 'sero_hashrate',\n                    outputFormatter: utils.toDecimal\n                }),\n                new Property({\n                    name: 'syncing',\n                    getter: 'sero_syncing',\n                    outputFormatter: formatters.outputSyncingFormatter\n                }),\n                new Property({\n                    name: 'gasPrice',\n                    getter: 'sero_gasPrice',\n                    outputFormatter: formatters.outputBigNumberFormatter\n                }),\n                new Property({\n                    name: 'accounts',\n                    getter: 'sero_accounts'\n                }),\n                new Property({\n                    name: 'blockNumber',\n                    getter: 'sero_blockNumber',\n                    outputFormatter: utils.toDecimal\n                }),\n                new Property({\n                    name: 'protocolVersion',\n                    getter: 'sero_protocolVersion'\n                })\n            ];\n        };\n\n        Sero.prototype.contract = function (abi) {\n            var factory = new Contract(this, abi);\n            return factory;\n        };\n\n        Sero.prototype.filter = function (options, callback, filterCreationErrorCallback) {\n            return new Filter(options, 'sero', this._requestManager, watches.sero(), formatters.outputLogFormatter, callback, filterCreationErrorCallback);\n        };\n\n        Sero.prototype.namereg = function () {\n            return this.contract(namereg.global.abi).at(namereg.global.address);\n        };\n\n        Sero.prototype.icapNamereg = function () {\n            return this.contract(namereg.icap.abi).at(namereg.icap.address);\n        };\n\n        Sero.prototype.isSyncing = function (callback) {\n            return new IsSyncing(this._requestManager, callback);\n        };\n\n        module.exports = Sero;\n\n    },{\"../../utils/config\":19,\"../../utils/utils\":21,\"../contract\":26,\"../filter\":30,\"../formatters\":31,\"../iban\":34,\"../method\":37,\"../namereg\":45,\"../property\":46,\"../syncing\":49,\"../transfer\":50,\"./watches\":44}],43:[function(require,module,exports){\n        \"use strict\";\n\n        var Method = require('../method');\n        var formatters = require('../formatters');\n\n        function Stake(web3) {\n            this._requestManager = web3._requestManager;\n\n            var self = this;\n\n            methods().forEach(function(method) {\n                method.attachToObject(self);\n                method.setRequestManager(self._requestManager);\n            });\n        }\n\n        var methods = function () {\n            var buyShare = new Method({\n                name: 'buyShare',\n                call: 'stake_buyShare',\n                params: 1,\n                inputFormatter: [formatters.inputTransactionFormatter]\n            });\n\n            return [\n                buyShare\n            ];\n        };\n\n\n        module.exports = Stake;\n\n    },{\"../formatters\":31,\"../method\":37}],44:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file watches.js\n         * @authors:\n         *   Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var Method = require('../method');\n\n/// @returns an array of objects describing web3.sero.filter api methods\n        var sero = function () {\n            var newFilterCall = function (args) {\n                var type = args[0];\n\n                switch(type) {\n                    case 'latest':\n                        args.shift();\n                        this.params = 0;\n                        return 'sero_newBlockFilter';\n                    case 'pending':\n                        args.shift();\n                        this.params = 0;\n                        return 'sero_newPendingTransactionFilter';\n                    default:\n                        return 'sero_newFilter';\n                }\n            };\n\n            var newFilter = new Method({\n                name: 'newFilter',\n                call: newFilterCall,\n                params: 1\n            });\n\n            var uninstallFilter = new Method({\n                name: 'uninstallFilter',\n                call: 'sero_uninstallFilter',\n                params: 1\n            });\n\n            var getLogs = new Method({\n                name: 'getLogs',\n                call: 'sero_getFilterLogs',\n                params: 1\n            });\n\n            var poll = new Method({\n                name: 'poll',\n                call: 'sero_getFilterChanges',\n                params: 1\n            });\n\n            return [\n                newFilter,\n                uninstallFilter,\n                getLogs,\n                poll\n            ];\n        };\n\n/// @returns an array of objects describing web3.shh.watch api methods\n        var shh = function () {\n\n            return [\n                new Method({\n                    name: 'newFilter',\n                    call: 'shh_newMessageFilter',\n                    params: 1\n                }),\n                new Method({\n                    name: 'uninstallFilter',\n                    call: 'shh_deleteMessageFilter',\n                    params: 1\n                }),\n                new Method({\n                    name: 'getLogs',\n                    call: 'shh_getFilterMessages',\n                    params: 1\n                }),\n                new Method({\n                    name: 'poll',\n                    call: 'shh_getFilterMessages',\n                    params: 1\n                })\n            ];\n        };\n\n        module.exports = {\n            sero: sero,\n            shh: shh\n        };\n\n\n    },{\"../method\":37}],45:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file namereg.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json');\n        var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json');\n\n        var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b';\n        var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00';\n\n        module.exports = {\n            global: {\n                abi: globalRegistrarAbi,\n                address: globalNameregAddress\n            },\n            icap: {\n                abi: icapRegistrarAbi,\n                address: icapNameregAddress\n            }\n        };\n\n\n    },{\"../contracts/GlobalRegistrar.json\":1,\"../contracts/ICAPRegistrar.json\":2}],46:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file property.js\n         * @author Fabian Vogelsteller <fabian@frozeman.de>\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var utils = require('../utils/utils');\n\n        var Property = function (options) {\n            this.name = options.name;\n            this.getter = options.getter;\n            this.setter = options.setter;\n            this.outputFormatter = options.outputFormatter;\n            this.inputFormatter = options.inputFormatter;\n            this.requestManager = null;\n        };\n\n        Property.prototype.setRequestManager = function (rm) {\n            this.requestManager = rm;\n        };\n\n        /**\n         * Should be called to format input args of method\n         *\n         * @method formatInput\n         * @param {Array}\n         * @return {Array}\n         */\n        Property.prototype.formatInput = function (arg) {\n            return this.inputFormatter ? this.inputFormatter(arg) : arg;\n        };\n\n        /**\n         * Should be called to format output(result) of method\n         *\n         * @method formatOutput\n         * @param {Object}\n         * @return {Object}\n         */\n        Property.prototype.formatOutput = function (result) {\n            return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result;\n        };\n\n        /**\n         * Should be used to extract callback from array of arguments. Modifies input param\n         *\n         * @method extractCallback\n         * @param {Array} arguments\n         * @return {Function|Null} callback, if exists\n         */\n        Property.prototype.extractCallback = function (args) {\n            if (utils.isFunction(args[args.length - 1])) {\n                return args.pop(); // modify the args array!\n            }\n        };\n\n\n        /**\n         * Should attach function to method\n         *\n         * @method attachToObject\n         * @param {Object}\n         * @param {Function}\n         */\n        Property.prototype.attachToObject = function (obj) {\n            var proto = {\n                get: this.buildGet(),\n                enumerable: true\n            };\n\n            var names = this.name.split('.');\n            var name = names[0];\n            if (names.length > 1) {\n                obj[names[0]] = obj[names[0]] || {};\n                obj = obj[names[0]];\n                name = names[1];\n            }\n\n            Object.defineProperty(obj, name, proto);\n            obj[asyncGetterName(name)] = this.buildAsyncGet();\n        };\n\n        var asyncGetterName = function (name) {\n            return 'get' + name.charAt(0).toUpperCase() + name.slice(1);\n        };\n\n        Property.prototype.buildGet = function () {\n            var property = this;\n            return function get() {\n                return property.formatOutput(property.requestManager.send({\n                    method: property.getter\n                }));\n            };\n        };\n\n        Property.prototype.buildAsyncGet = function () {\n            var property = this;\n            var get = function (callback) {\n                property.requestManager.sendAsync({\n                    method: property.getter\n                }, function (err, result) {\n                    callback(err, property.formatOutput(result));\n                });\n            };\n            get.request = this.request.bind(this);\n            return get;\n        };\n\n        /**\n         * Should be called to create pure JSONRPC request which can be used in batch request\n         *\n         * @method request\n         * @param {...} params\n         * @return {Object} jsonrpc request\n         */\n        Property.prototype.request = function () {\n            var payload = {\n                method: this.getter,\n                params: [],\n                callback: this.extractCallback(Array.prototype.slice.call(arguments))\n            };\n            payload.format = this.formatOutput.bind(this);\n            return payload;\n        };\n\n        module.exports = Property;\n\n\n    },{\"../utils/utils\":21}],47:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file requestmanager.js\n         * @author Jeffrey Wilcke <jeff@ethdev.com>\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @author Marian Oancea <marian@ethdev.com>\n         * @author Fabian Vogelsteller <fabian@ethdev.com>\n         * @author Gav Wood <g@ethdev.com>\n         * @date 2014\n         */\n\n        var Jsonrpc = require('./jsonrpc');\n        var utils = require('../utils/utils');\n        var c = require('../utils/config');\n        var errors = require('./errors');\n\n        /**\n         * It's responsible for passing messages to providers\n         * It's also responsible for polling the ethereum node for incoming messages\n         * Default poll timeout is 1 second\n         * Singleton\n         */\n        var RequestManager = function (provider) {\n            this.provider = provider;\n            this.polls = {};\n            this.timeout = null;\n        };\n\n        /**\n         * Should be used to synchronously send request\n         *\n         * @method send\n         * @param {Object} data\n         * @return {Object}\n         */\n        RequestManager.prototype.send = function (data) {\n            if (!this.provider) {\n                console.error(errors.InvalidProvider());\n                return null;\n            }\n\n            var payload = Jsonrpc.toPayload(data.method, data.params);\n            var result = this.provider.send(payload);\n\n            if (!Jsonrpc.isValidResponse(result)) {\n                throw errors.InvalidResponse(result);\n            }\n\n            return result.result;\n        };\n\n        /**\n         * Should be used to asynchronously send request\n         *\n         * @method sendAsync\n         * @param {Object} data\n         * @param {Function} callback\n         */\n        RequestManager.prototype.sendAsync = function (data, callback) {\n            if (!this.provider) {\n                return callback(errors.InvalidProvider());\n            }\n\n            var payload = Jsonrpc.toPayload(data.method, data.params);\n            this.provider.sendAsync(payload, function (err, result) {\n                if (err) {\n                    return callback(err);\n                }\n\n                if (!Jsonrpc.isValidResponse(result)) {\n                    return callback(errors.InvalidResponse(result));\n                }\n\n                callback(null, result.result);\n            });\n        };\n\n        /**\n         * Should be called to asynchronously send batch request\n         *\n         * @method sendBatch\n         * @param {Array} batch data\n         * @param {Function} callback\n         */\n        RequestManager.prototype.sendBatch = function (data, callback) {\n            if (!this.provider) {\n                return callback(errors.InvalidProvider());\n            }\n\n            var payload = Jsonrpc.toBatchPayload(data);\n\n            this.provider.sendAsync(payload, function (err, results) {\n                if (err) {\n                    return callback(err);\n                }\n\n                if (!utils.isArray(results)) {\n                    return callback(errors.InvalidResponse(results));\n                }\n\n                callback(err, results);\n            });\n        };\n\n        /**\n         * Should be used to set provider of request manager\n         *\n         * @method setProvider\n         * @param {Object}\n         */\n        RequestManager.prototype.setProvider = function (p) {\n            this.provider = p;\n        };\n\n        /**\n         * Should be used to start polling\n         *\n         * @method startPolling\n         * @param {Object} data\n         * @param {Number} pollId\n         * @param {Function} callback\n         * @param {Function} uninstall\n         *\n         * @todo cleanup number of params\n         */\n        RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {\n            this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall};\n\n\n            // start polling\n            if (!this.timeout) {\n                this.poll();\n            }\n        };\n\n        /**\n         * Should be used to stop polling for filter with given id\n         *\n         * @method stopPolling\n         * @param {Number} pollId\n         */\n        RequestManager.prototype.stopPolling = function (pollId) {\n            delete this.polls[pollId];\n\n            // stop polling\n            if(Object.keys(this.polls).length === 0 && this.timeout) {\n                clearTimeout(this.timeout);\n                this.timeout = null;\n            }\n        };\n\n        /**\n         * Should be called to reset the polling mechanism of the request manager\n         *\n         * @method reset\n         */\n        RequestManager.prototype.reset = function (keepIsSyncing) {\n            /*jshint maxcomplexity:5 */\n\n            for (var key in this.polls) {\n                // remove all polls, except sync polls,\n                // they need to be removed manually by calling syncing.stopWatching()\n                if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) {\n                    this.polls[key].uninstall();\n                    delete this.polls[key];\n                }\n            }\n\n            // stop polling\n            if(Object.keys(this.polls).length === 0 && this.timeout) {\n                clearTimeout(this.timeout);\n                this.timeout = null;\n            }\n        };\n\n        /**\n         * Should be called to poll for changes on filter with given id\n         *\n         * @method poll\n         */\n        RequestManager.prototype.poll = function () {\n            /*jshint maxcomplexity: 6 */\n            this.timeout = setTimeout(this.poll.bind(this), c.SERO_POLLING_TIMEOUT);\n\n            if (Object.keys(this.polls).length === 0) {\n                return;\n            }\n\n            if (!this.provider) {\n                console.error(errors.InvalidProvider());\n                return;\n            }\n\n            var pollsData = [];\n            var pollsIds = [];\n            for (var key in this.polls) {\n                pollsData.push(this.polls[key].data);\n                pollsIds.push(key);\n            }\n\n            if (pollsData.length === 0) {\n                return;\n            }\n\n            var payload = Jsonrpc.toBatchPayload(pollsData);\n\n            // map the request id to they poll id\n            var pollsIdMap = {};\n            payload.forEach(function(load, index){\n                pollsIdMap[load.id] = pollsIds[index];\n            });\n\n\n            var self = this;\n\n            this.provider.sendAsync(payload, function (error, results) {\n\n\n                // TODO: console log?\n                if (error) {\n                    return;\n                }\n\n                if (!utils.isArray(results)) {\n                    throw errors.InvalidResponse(results);\n                }\n                results.map(function (result) {\n                    var id = pollsIdMap[result.id];\n\n                    // make sure the filter is still installed after arrival of the request\n                    if (self.polls[id]) {\n                        result.callback = self.polls[id].callback;\n                        return result;\n                    } else\n                        return false;\n                }).filter(function (result) {\n                    return !!result;\n                }).filter(function (result) {\n                    var valid = Jsonrpc.isValidResponse(result);\n                    if (!valid) {\n                        result.callback(errors.InvalidResponse(result));\n                    }\n                    return valid;\n                }).forEach(function (result) {\n                    result.callback(null, result.result);\n                });\n            });\n        };\n\n        module.exports = RequestManager;\n\n\n    },{\"../utils/config\":19,\"../utils/utils\":21,\"./errors\":27,\"./jsonrpc\":36}],48:[function(require,module,exports){\n\n\n        var Settings = function () {\n            this.defaultBlock = 'latest';\n            this.defaultAccount = undefined;\n        };\n\n        module.exports = Settings;\n\n\n    },{}],49:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /** @file syncing.js\n         * @authors:\n         *   Fabian Vogelsteller <fabian@ethdev.com>\n         * @date 2015\n         */\n\n        var formatters = require('./formatters');\n        var utils = require('../utils/utils');\n\n        var count = 1;\n\n        /**\n         Adds the callback and sets up the methods, to iterate over the results.\n\n         @method pollSyncing\n         @param {Object} self\n         */\n        var pollSyncing = function(self) {\n\n            var onMessage = function (error, sync) {\n                if (error) {\n                    return self.callbacks.forEach(function (callback) {\n                        callback(error);\n                    });\n                }\n\n                if(utils.isObject(sync) && sync.startingBlock)\n                    sync = formatters.outputSyncingFormatter(sync);\n\n                self.callbacks.forEach(function (callback) {\n                    if (self.lastSyncState !== sync) {\n\n                        // call the callback with true first so the app can stop anything, before receiving the sync data\n                        if(!self.lastSyncState && utils.isObject(sync))\n                            callback(null, true);\n\n                        // call on the next CPU cycle, so the actions of the sync stop can be processes first\n                        setTimeout(function() {\n                            callback(null, sync);\n                        }, 0);\n\n                        self.lastSyncState = sync;\n                    }\n                });\n            };\n\n            self.requestManager.startPolling({\n                method: 'sero_syncing',\n                params: [],\n            }, self.pollId, onMessage, self.stopWatching.bind(self));\n\n        };\n\n        var IsSyncing = function (requestManager, callback) {\n            this.requestManager = requestManager;\n            this.pollId = 'syncPoll_'+ count++;\n            this.callbacks = [];\n            this.addCallback(callback);\n            this.lastSyncState = false;\n            pollSyncing(this);\n\n            return this;\n        };\n\n        IsSyncing.prototype.addCallback = function (callback) {\n            if(callback)\n                this.callbacks.push(callback);\n            return this;\n        };\n\n        IsSyncing.prototype.stopWatching = function () {\n            this.requestManager.stopPolling(this.pollId);\n            this.callbacks = [];\n        };\n\n        module.exports = IsSyncing;\n\n\n    },{\"../utils/utils\":21,\"./formatters\":31}],50:[function(require,module,exports){\n        /*\n    This file is part of web3.js.\n\n    web3.js is free software: you can redistribute it and/or modify\n    it under the terms of the GNU Lesser 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    web3.js 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 Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public License\n    along with web3.js.  If not, see <http://www.gnu.org/licenses/>.\n*/\n        /**\n         * @file transfer.js\n         * @author Marek Kotewicz <marek@ethdev.com>\n         * @date 2015\n         */\n\n        var Iban = require('./iban');\n        var exchangeAbi = require('../contracts/SmartExchange.json');\n\n        /**\n         * Should be used to make Iban transfer\n         *\n         * @method transfer\n         * @param {String} from\n         * @param {String} to iban\n         * @param {Value} value to be tranfered\n         * @param {Function} callback, callback\n         */\n        var transfer = function (sero, from, to, value, callback) {\n            var iban = new Iban(to);\n            if (!iban.isValid()) {\n                throw new Error('invalid iban address');\n            }\n\n            if (iban.isDirect()) {\n                return transferToAddress(sero, from, iban.address(), value, callback);\n            }\n\n            if (!callback) {\n                var address = sero.icapNamereg().addr(iban.institution());\n                return deposit(sero, from, address, value, iban.client());\n            }\n\n            sero.icapNamereg().addr(iban.institution(), function (err, address) {\n                return deposit(sero, from, address, value, iban.client(), callback);\n            });\n\n        };\n\n        /**\n         * Should be used to transfer funds to certain address\n         *\n         * @method transferToAddress\n         * @param {String} from\n         * @param {String} to\n         * @param {Value} value to be tranfered\n         * @param {Function} callback, callback\n         */\n        var transferToAddress = function (sero, from, to, value, callback) {\n            return sero.sendTransaction({\n                address: to,\n                from: from,\n                value: value\n            }, callback);\n        };\n\n        /**\n         * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!)\n         *\n         * @method deposit\n         * @param {String} from\n         * @param {String} to\n         * @param {Value} value to be transfered\n         * @param {String} client unique identifier\n         * @param {Function} callback, callback\n         */\n        var deposit = function (sero, from, to, value, client, callback) {\n            var abi = exchangeAbi;\n            return sero.contract(abi).at(to).deposit(client, {\n                from: from,\n                value: value\n            }, callback);\n        };\n\n        module.exports = transfer;\n\n\n    },{\"../contracts/SmartExchange.json\":3,\"./iban\":34}],51:[function(require,module,exports){\n\n    },{}],52:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var BlockCipher = C_lib.BlockCipher;\n                var C_algo = C.algo;\n\n                // Lookup tables\n                var SBOX = [];\n                var INV_SBOX = [];\n                var SUB_MIX_0 = [];\n                var SUB_MIX_1 = [];\n                var SUB_MIX_2 = [];\n                var SUB_MIX_3 = [];\n                var INV_SUB_MIX_0 = [];\n                var INV_SUB_MIX_1 = [];\n                var INV_SUB_MIX_2 = [];\n                var INV_SUB_MIX_3 = [];\n\n                // Compute lookup tables\n                (function () {\n                    // Compute double table\n                    var d = [];\n                    for (var i = 0; i < 256; i++) {\n                        if (i < 128) {\n                            d[i] = i << 1;\n                        } else {\n                            d[i] = (i << 1) ^ 0x11b;\n                        }\n                    }\n\n                    // Walk GF(2^8)\n                    var x = 0;\n                    var xi = 0;\n                    for (var i = 0; i < 256; i++) {\n                        // Compute sbox\n                        var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n                        sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n                        SBOX[x] = sx;\n                        INV_SBOX[sx] = x;\n\n                        // Compute multiplication\n                        var x2 = d[x];\n                        var x4 = d[x2];\n                        var x8 = d[x4];\n\n                        // Compute sub bytes, mix columns tables\n                        var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n                        SUB_MIX_0[x] = (t << 24) | (t >>> 8);\n                        SUB_MIX_1[x] = (t << 16) | (t >>> 16);\n                        SUB_MIX_2[x] = (t << 8)  | (t >>> 24);\n                        SUB_MIX_3[x] = t;\n\n                        // Compute inv sub bytes, inv mix columns tables\n                        var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n                        INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);\n                        INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);\n                        INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);\n                        INV_SUB_MIX_3[sx] = t;\n\n                        // Compute next counter\n                        if (!x) {\n                            x = xi = 1;\n                        } else {\n                            x = x2 ^ d[d[d[x8 ^ x2]]];\n                            xi ^= d[d[xi]];\n                        }\n                    }\n                }());\n\n                // Precomputed Rcon lookup\n                var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n                /**\n                 * AES block cipher algorithm.\n                 */\n                var AES = C_algo.AES = BlockCipher.extend({\n                    _doReset: function () {\n                        // Skip reset of nRounds has been set before and key did not change\n                        if (this._nRounds && this._keyPriorReset === this._key) {\n                            return;\n                        }\n\n                        // Shortcuts\n                        var key = this._keyPriorReset = this._key;\n                        var keyWords = key.words;\n                        var keySize = key.sigBytes / 4;\n\n                        // Compute number of rounds\n                        var nRounds = this._nRounds = keySize + 6;\n\n                        // Compute number of key schedule rows\n                        var ksRows = (nRounds + 1) * 4;\n\n                        // Compute key schedule\n                        var keySchedule = this._keySchedule = [];\n                        for (var ksRow = 0; ksRow < ksRows; ksRow++) {\n                            if (ksRow < keySize) {\n                                keySchedule[ksRow] = keyWords[ksRow];\n                            } else {\n                                var t = keySchedule[ksRow - 1];\n\n                                if (!(ksRow % keySize)) {\n                                    // Rot word\n                                    t = (t << 8) | (t >>> 24);\n\n                                    // Sub word\n                                    t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n\n                                    // Mix Rcon\n                                    t ^= RCON[(ksRow / keySize) | 0] << 24;\n                                } else if (keySize > 6 && ksRow % keySize == 4) {\n                                    // Sub word\n                                    t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];\n                                }\n\n                                keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n                            }\n                        }\n\n                        // Compute inv key schedule\n                        var invKeySchedule = this._invKeySchedule = [];\n                        for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n                            var ksRow = ksRows - invKsRow;\n\n                            if (invKsRow % 4) {\n                                var t = keySchedule[ksRow];\n                            } else {\n                                var t = keySchedule[ksRow - 4];\n                            }\n\n                            if (invKsRow < 4 || ksRow <= 4) {\n                                invKeySchedule[invKsRow] = t;\n                            } else {\n                                invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^\n                                    INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];\n                            }\n                        }\n                    },\n\n                    encryptBlock: function (M, offset) {\n                        this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n                    },\n\n                    decryptBlock: function (M, offset) {\n                        // Swap 2nd and 4th rows\n                        var t = M[offset + 1];\n                        M[offset + 1] = M[offset + 3];\n                        M[offset + 3] = t;\n\n                        this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n                        // Inv swap 2nd and 4th rows\n                        var t = M[offset + 1];\n                        M[offset + 1] = M[offset + 3];\n                        M[offset + 3] = t;\n                    },\n\n                    _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n                        // Shortcut\n                        var nRounds = this._nRounds;\n\n                        // Get input, add round key\n                        var s0 = M[offset]     ^ keySchedule[0];\n                        var s1 = M[offset + 1] ^ keySchedule[1];\n                        var s2 = M[offset + 2] ^ keySchedule[2];\n                        var s3 = M[offset + 3] ^ keySchedule[3];\n\n                        // Key schedule row counter\n                        var ksRow = 4;\n\n                        // Rounds\n                        for (var round = 1; round < nRounds; round++) {\n                            // Shift rows, sub bytes, mix columns, add round key\n                            var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];\n                            var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];\n                            var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];\n                            var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];\n\n                            // Update state\n                            s0 = t0;\n                            s1 = t1;\n                            s2 = t2;\n                            s3 = t3;\n                        }\n\n                        // Shift rows, sub bytes, add round key\n                        var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];\n                        var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];\n                        var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];\n                        var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];\n\n                        // Set output\n                        M[offset]     = t0;\n                        M[offset + 1] = t1;\n                        M[offset + 2] = t2;\n                        M[offset + 3] = t3;\n                    },\n\n                    keySize: 256/32\n                });\n\n                /**\n                 * Shortcut functions to the cipher's object interface.\n                 *\n                 * @example\n                 *\n                 *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n                 *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n                 */\n                C.AES = BlockCipher._createHelper(AES);\n            }());\n\n\n            return CryptoJS.AES;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54,\"./enc-base64\":55,\"./evpkdf\":57,\"./md5\":62}],53:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * Cipher core components.\n             */\n            CryptoJS.lib.Cipher || (function (undefined) {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var Base = C_lib.Base;\n                var WordArray = C_lib.WordArray;\n                var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n                var C_enc = C.enc;\n                var Utf8 = C_enc.Utf8;\n                var Base64 = C_enc.Base64;\n                var C_algo = C.algo;\n                var EvpKDF = C_algo.EvpKDF;\n\n                /**\n                 * Abstract base cipher template.\n                 *\n                 * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n                 * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n                 * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n                 * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n                 */\n                var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {WordArray} iv The IV to use for this operation.\n                     */\n                    cfg: Base.extend(),\n\n                    /**\n                     * Creates this cipher in encryption mode.\n                     *\n                     * @param {WordArray} key The key.\n                     * @param {Object} cfg (Optional) The configuration options to use for this operation.\n                     *\n                     * @return {Cipher} A cipher instance.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n                     */\n                    createEncryptor: function (key, cfg) {\n                        return this.create(this._ENC_XFORM_MODE, key, cfg);\n                    },\n\n                    /**\n                     * Creates this cipher in decryption mode.\n                     *\n                     * @param {WordArray} key The key.\n                     * @param {Object} cfg (Optional) The configuration options to use for this operation.\n                     *\n                     * @return {Cipher} A cipher instance.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n                     */\n                    createDecryptor: function (key, cfg) {\n                        return this.create(this._DEC_XFORM_MODE, key, cfg);\n                    },\n\n                    /**\n                     * Initializes a newly created cipher.\n                     *\n                     * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n                     * @param {WordArray} key The key.\n                     * @param {Object} cfg (Optional) The configuration options to use for this operation.\n                     *\n                     * @example\n                     *\n                     *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n                     */\n                    init: function (xformMode, key, cfg) {\n                        // Apply config defaults\n                        this.cfg = this.cfg.extend(cfg);\n\n                        // Store transform mode and key\n                        this._xformMode = xformMode;\n                        this._key = key;\n\n                        // Set initial values\n                        this.reset();\n                    },\n\n                    /**\n                     * Resets this cipher to its initial state.\n                     *\n                     * @example\n                     *\n                     *     cipher.reset();\n                     */\n                    reset: function () {\n                        // Reset data buffer\n                        BufferedBlockAlgorithm.reset.call(this);\n\n                        // Perform concrete-cipher logic\n                        this._doReset();\n                    },\n\n                    /**\n                     * Adds data to be encrypted or decrypted.\n                     *\n                     * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n                     *\n                     * @return {WordArray} The data after processing.\n                     *\n                     * @example\n                     *\n                     *     var encrypted = cipher.process('data');\n                     *     var encrypted = cipher.process(wordArray);\n                     */\n                    process: function (dataUpdate) {\n                        // Append\n                        this._append(dataUpdate);\n\n                        // Process available blocks\n                        return this._process();\n                    },\n\n                    /**\n                     * Finalizes the encryption or decryption process.\n                     * Note that the finalize operation is effectively a destructive, read-once operation.\n                     *\n                     * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n                     *\n                     * @return {WordArray} The data after final processing.\n                     *\n                     * @example\n                     *\n                     *     var encrypted = cipher.finalize();\n                     *     var encrypted = cipher.finalize('data');\n                     *     var encrypted = cipher.finalize(wordArray);\n                     */\n                    finalize: function (dataUpdate) {\n                        // Final data update\n                        if (dataUpdate) {\n                            this._append(dataUpdate);\n                        }\n\n                        // Perform concrete-cipher logic\n                        var finalProcessedData = this._doFinalize();\n\n                        return finalProcessedData;\n                    },\n\n                    keySize: 128/32,\n\n                    ivSize: 128/32,\n\n                    _ENC_XFORM_MODE: 1,\n\n                    _DEC_XFORM_MODE: 2,\n\n                    /**\n                     * Creates shortcut functions to a cipher's object interface.\n                     *\n                     * @param {Cipher} cipher The cipher to create a helper for.\n                     *\n                     * @return {Object} An object with encrypt and decrypt shortcut functions.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n                     */\n                    _createHelper: (function () {\n                        function selectCipherStrategy(key) {\n                            if (typeof key == 'string') {\n                                return PasswordBasedCipher;\n                            } else {\n                                return SerializableCipher;\n                            }\n                        }\n\n                        return function (cipher) {\n                            return {\n                                encrypt: function (message, key, cfg) {\n                                    return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n                                },\n\n                                decrypt: function (ciphertext, key, cfg) {\n                                    return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n                                }\n                            };\n                        };\n                    }())\n                });\n\n                /**\n                 * Abstract base stream cipher template.\n                 *\n                 * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n                 */\n                var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n                    _doFinalize: function () {\n                        // Process partial blocks\n                        var finalProcessedBlocks = this._process(!!'flush');\n\n                        return finalProcessedBlocks;\n                    },\n\n                    blockSize: 1\n                });\n\n                /**\n                 * Mode namespace.\n                 */\n                var C_mode = C.mode = {};\n\n                /**\n                 * Abstract base block cipher mode template.\n                 */\n                var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n                    /**\n                     * Creates this mode for encryption.\n                     *\n                     * @param {Cipher} cipher A block cipher instance.\n                     * @param {Array} iv The IV words.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n                     */\n                    createEncryptor: function (cipher, iv) {\n                        return this.Encryptor.create(cipher, iv);\n                    },\n\n                    /**\n                     * Creates this mode for decryption.\n                     *\n                     * @param {Cipher} cipher A block cipher instance.\n                     * @param {Array} iv The IV words.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n                     */\n                    createDecryptor: function (cipher, iv) {\n                        return this.Decryptor.create(cipher, iv);\n                    },\n\n                    /**\n                     * Initializes a newly created mode.\n                     *\n                     * @param {Cipher} cipher A block cipher instance.\n                     * @param {Array} iv The IV words.\n                     *\n                     * @example\n                     *\n                     *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n                     */\n                    init: function (cipher, iv) {\n                        this._cipher = cipher;\n                        this._iv = iv;\n                    }\n                });\n\n                /**\n                 * Cipher Block Chaining mode.\n                 */\n                var CBC = C_mode.CBC = (function () {\n                    /**\n                     * Abstract base CBC mode.\n                     */\n                    var CBC = BlockCipherMode.extend();\n\n                    /**\n                     * CBC encryptor.\n                     */\n                    CBC.Encryptor = CBC.extend({\n                        /**\n                         * Processes the data block at offset.\n                         *\n                         * @param {Array} words The data words to operate on.\n                         * @param {number} offset The offset where the block starts.\n                         *\n                         * @example\n                         *\n                         *     mode.processBlock(data.words, offset);\n                         */\n                        processBlock: function (words, offset) {\n                            // Shortcuts\n                            var cipher = this._cipher;\n                            var blockSize = cipher.blockSize;\n\n                            // XOR and encrypt\n                            xorBlock.call(this, words, offset, blockSize);\n                            cipher.encryptBlock(words, offset);\n\n                            // Remember this block to use with next block\n                            this._prevBlock = words.slice(offset, offset + blockSize);\n                        }\n                    });\n\n                    /**\n                     * CBC decryptor.\n                     */\n                    CBC.Decryptor = CBC.extend({\n                        /**\n                         * Processes the data block at offset.\n                         *\n                         * @param {Array} words The data words to operate on.\n                         * @param {number} offset The offset where the block starts.\n                         *\n                         * @example\n                         *\n                         *     mode.processBlock(data.words, offset);\n                         */\n                        processBlock: function (words, offset) {\n                            // Shortcuts\n                            var cipher = this._cipher;\n                            var blockSize = cipher.blockSize;\n\n                            // Remember this block to use with next block\n                            var thisBlock = words.slice(offset, offset + blockSize);\n\n                            // Decrypt and XOR\n                            cipher.decryptBlock(words, offset);\n                            xorBlock.call(this, words, offset, blockSize);\n\n                            // This block becomes the previous block\n                            this._prevBlock = thisBlock;\n                        }\n                    });\n\n                    function xorBlock(words, offset, blockSize) {\n                        // Shortcut\n                        var iv = this._iv;\n\n                        // Choose mixing block\n                        if (iv) {\n                            var block = iv;\n\n                            // Remove IV for subsequent blocks\n                            this._iv = undefined;\n                        } else {\n                            var block = this._prevBlock;\n                        }\n\n                        // XOR blocks\n                        for (var i = 0; i < blockSize; i++) {\n                            words[offset + i] ^= block[i];\n                        }\n                    }\n\n                    return CBC;\n                }());\n\n                /**\n                 * Padding namespace.\n                 */\n                var C_pad = C.pad = {};\n\n                /**\n                 * PKCS #5/7 padding strategy.\n                 */\n                var Pkcs7 = C_pad.Pkcs7 = {\n                    /**\n                     * Pads data using the algorithm defined in PKCS #5/7.\n                     *\n                     * @param {WordArray} data The data to pad.\n                     * @param {number} blockSize The multiple that the data should be padded to.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n                     */\n                    pad: function (data, blockSize) {\n                        // Shortcut\n                        var blockSizeBytes = blockSize * 4;\n\n                        // Count padding bytes\n                        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n                        // Create padding word\n                        var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;\n\n                        // Create padding\n                        var paddingWords = [];\n                        for (var i = 0; i < nPaddingBytes; i += 4) {\n                            paddingWords.push(paddingWord);\n                        }\n                        var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n                        // Add padding\n                        data.concat(padding);\n                    },\n\n                    /**\n                     * Unpads data that had been padded using the algorithm defined in PKCS #5/7.\n                     *\n                     * @param {WordArray} data The data to unpad.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n                     */\n                    unpad: function (data) {\n                        // Get number of padding bytes from last byte\n                        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n                        // Remove padding\n                        data.sigBytes -= nPaddingBytes;\n                    }\n                };\n\n                /**\n                 * Abstract base block cipher template.\n                 *\n                 * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n                 */\n                var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {Mode} mode The block mode to use. Default: CBC\n                     * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n                     */\n                    cfg: Cipher.cfg.extend({\n                        mode: CBC,\n                        padding: Pkcs7\n                    }),\n\n                    reset: function () {\n                        // Reset cipher\n                        Cipher.reset.call(this);\n\n                        // Shortcuts\n                        var cfg = this.cfg;\n                        var iv = cfg.iv;\n                        var mode = cfg.mode;\n\n                        // Reset block mode\n                        if (this._xformMode == this._ENC_XFORM_MODE) {\n                            var modeCreator = mode.createEncryptor;\n                        } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n                            var modeCreator = mode.createDecryptor;\n\n                            // Keep at least one block in the buffer for unpadding\n                            this._minBufferSize = 1;\n                        }\n                        this._mode = modeCreator.call(mode, this, iv && iv.words);\n                    },\n\n                    _doProcessBlock: function (words, offset) {\n                        this._mode.processBlock(words, offset);\n                    },\n\n                    _doFinalize: function () {\n                        // Shortcut\n                        var padding = this.cfg.padding;\n\n                        // Finalize\n                        if (this._xformMode == this._ENC_XFORM_MODE) {\n                            // Pad data\n                            padding.pad(this._data, this.blockSize);\n\n                            // Process final blocks\n                            var finalProcessedBlocks = this._process(!!'flush');\n                        } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {\n                            // Process final blocks\n                            var finalProcessedBlocks = this._process(!!'flush');\n\n                            // Unpad data\n                            padding.unpad(finalProcessedBlocks);\n                        }\n\n                        return finalProcessedBlocks;\n                    },\n\n                    blockSize: 128/32\n                });\n\n                /**\n                 * A collection of cipher parameters.\n                 *\n                 * @property {WordArray} ciphertext The raw ciphertext.\n                 * @property {WordArray} key The key to this ciphertext.\n                 * @property {WordArray} iv The IV used in the ciphering operation.\n                 * @property {WordArray} salt The salt used with a key derivation function.\n                 * @property {Cipher} algorithm The cipher algorithm.\n                 * @property {Mode} mode The block mode used in the ciphering operation.\n                 * @property {Padding} padding The padding scheme used in the ciphering operation.\n                 * @property {number} blockSize The block size of the cipher.\n                 * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n                 */\n                var CipherParams = C_lib.CipherParams = Base.extend({\n                    /**\n                     * Initializes a newly created cipher params object.\n                     *\n                     * @param {Object} cipherParams An object with any of the possible cipher parameters.\n                     *\n                     * @example\n                     *\n                     *     var cipherParams = CryptoJS.lib.CipherParams.create({\n                     *         ciphertext: ciphertextWordArray,\n                     *         key: keyWordArray,\n                     *         iv: ivWordArray,\n                     *         salt: saltWordArray,\n                     *         algorithm: CryptoJS.algo.AES,\n                     *         mode: CryptoJS.mode.CBC,\n                     *         padding: CryptoJS.pad.PKCS7,\n                     *         blockSize: 4,\n                     *         formatter: CryptoJS.format.OpenSSL\n                     *     });\n                     */\n                    init: function (cipherParams) {\n                        this.mixIn(cipherParams);\n                    },\n\n                    /**\n                     * Converts this cipher params object to a string.\n                     *\n                     * @param {Format} formatter (Optional) The formatting strategy to use.\n                     *\n                     * @return {string} The stringified cipher params.\n                     *\n                     * @throws Error If neither the formatter nor the default formatter is set.\n                     *\n                     * @example\n                     *\n                     *     var string = cipherParams + '';\n                     *     var string = cipherParams.toString();\n                     *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n                     */\n                    toString: function (formatter) {\n                        return (formatter || this.formatter).stringify(this);\n                    }\n                });\n\n                /**\n                 * Format namespace.\n                 */\n                var C_format = C.format = {};\n\n                /**\n                 * OpenSSL formatting strategy.\n                 */\n                var OpenSSLFormatter = C_format.OpenSSL = {\n                    /**\n                     * Converts a cipher params object to an OpenSSL-compatible string.\n                     *\n                     * @param {CipherParams} cipherParams The cipher params object.\n                     *\n                     * @return {string} The OpenSSL-compatible string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n                     */\n                    stringify: function (cipherParams) {\n                        // Shortcuts\n                        var ciphertext = cipherParams.ciphertext;\n                        var salt = cipherParams.salt;\n\n                        // Format\n                        if (salt) {\n                            var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n                        } else {\n                            var wordArray = ciphertext;\n                        }\n\n                        return wordArray.toString(Base64);\n                    },\n\n                    /**\n                     * Converts an OpenSSL-compatible string to a cipher params object.\n                     *\n                     * @param {string} openSSLStr The OpenSSL-compatible string.\n                     *\n                     * @return {CipherParams} The cipher params object.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n                     */\n                    parse: function (openSSLStr) {\n                        // Parse base64\n                        var ciphertext = Base64.parse(openSSLStr);\n\n                        // Shortcut\n                        var ciphertextWords = ciphertext.words;\n\n                        // Test for salt\n                        if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {\n                            // Extract salt\n                            var salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n                            // Remove salt from ciphertext\n                            ciphertextWords.splice(0, 4);\n                            ciphertext.sigBytes -= 16;\n                        }\n\n                        return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n                    }\n                };\n\n                /**\n                 * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n                 */\n                var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n                     */\n                    cfg: Base.extend({\n                        format: OpenSSLFormatter\n                    }),\n\n                    /**\n                     * Encrypts a message.\n                     *\n                     * @param {Cipher} cipher The cipher algorithm to use.\n                     * @param {WordArray|string} message The message to encrypt.\n                     * @param {WordArray} key The key.\n                     * @param {Object} cfg (Optional) The configuration options to use for this operation.\n                     *\n                     * @return {CipherParams} A cipher params object.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n                     *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n                     *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n                     */\n                    encrypt: function (cipher, message, key, cfg) {\n                        // Apply config defaults\n                        cfg = this.cfg.extend(cfg);\n\n                        // Encrypt\n                        var encryptor = cipher.createEncryptor(key, cfg);\n                        var ciphertext = encryptor.finalize(message);\n\n                        // Shortcut\n                        var cipherCfg = encryptor.cfg;\n\n                        // Create and return serializable cipher params\n                        return CipherParams.create({\n                            ciphertext: ciphertext,\n                            key: key,\n                            iv: cipherCfg.iv,\n                            algorithm: cipher,\n                            mode: cipherCfg.mode,\n                            padding: cipherCfg.padding,\n                            blockSize: cipher.blockSize,\n                            formatter: cfg.format\n                        });\n                    },\n\n                    /**\n                     * Decrypts serialized ciphertext.\n                     *\n                     * @param {Cipher} cipher The cipher algorithm to use.\n                     * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n                     * @param {WordArray} key The key.\n                     * @param {Object} cfg (Optional) The configuration options to use for this operation.\n                     *\n                     * @return {WordArray} The plaintext.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n                     *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n                     */\n                    decrypt: function (cipher, ciphertext, key, cfg) {\n                        // Apply config defaults\n                        cfg = this.cfg.extend(cfg);\n\n                        // Convert string to CipherParams\n                        ciphertext = this._parse(ciphertext, cfg.format);\n\n                        // Decrypt\n                        var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n                        return plaintext;\n                    },\n\n                    /**\n                     * Converts serialized ciphertext to CipherParams,\n                     * else assumed CipherParams already and returns ciphertext unchanged.\n                     *\n                     * @param {CipherParams|string} ciphertext The ciphertext.\n                     * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n                     *\n                     * @return {CipherParams} The unserialized ciphertext.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n                     */\n                    _parse: function (ciphertext, format) {\n                        if (typeof ciphertext == 'string') {\n                            return format.parse(ciphertext, this);\n                        } else {\n                            return ciphertext;\n                        }\n                    }\n                });\n\n                /**\n                 * Key derivation function namespace.\n                 */\n                var C_kdf = C.kdf = {};\n\n                /**\n                 * OpenSSL key derivation function.\n                 */\n                var OpenSSLKdf = C_kdf.OpenSSL = {\n                    /**\n                     * Derives a key and IV from a password.\n                     *\n                     * @param {string} password The password to derive from.\n                     * @param {number} keySize The size in words of the key to generate.\n                     * @param {number} ivSize The size in words of the IV to generate.\n                     * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n                     *\n                     * @return {CipherParams} A cipher params object with the key, IV, and salt.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);\n                     *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');\n                     */\n                    execute: function (password, keySize, ivSize, salt) {\n                        // Generate random salt\n                        if (!salt) {\n                            salt = WordArray.random(64/8);\n                        }\n\n                        // Derive key and IV\n                        var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n\n                        // Separate key and IV\n                        var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n                        key.sigBytes = keySize * 4;\n\n                        // Return params\n                        return CipherParams.create({ key: key, iv: iv, salt: salt });\n                    }\n                };\n\n                /**\n                 * A serializable cipher wrapper that derives the key from a password,\n                 * and returns ciphertext as a serializable cipher params object.\n                 */\n                var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n                     */\n                    cfg: SerializableCipher.cfg.extend({\n                        kdf: OpenSSLKdf\n                    }),\n\n                    /**\n                     * Encrypts a message using a password.\n                     *\n                     * @param {Cipher} cipher The cipher algorithm to use.\n                     * @param {WordArray|string} message The message to encrypt.\n                     * @param {string} password The password.\n                     * @param {Object} cfg (Optional) The configuration options to use for this operation.\n                     *\n                     * @return {CipherParams} A cipher params object.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n                     *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n                     */\n                    encrypt: function (cipher, message, password, cfg) {\n                        // Apply config defaults\n                        cfg = this.cfg.extend(cfg);\n\n                        // Derive key and other params\n                        var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);\n\n                        // Add IV to config\n                        cfg.iv = derivedParams.iv;\n\n                        // Encrypt\n                        var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n                        // Mix in derived params\n                        ciphertext.mixIn(derivedParams);\n\n                        return ciphertext;\n                    },\n\n                    /**\n                     * Decrypts serialized ciphertext using a password.\n                     *\n                     * @param {Cipher} cipher The cipher algorithm to use.\n                     * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n                     * @param {string} password The password.\n                     * @param {Object} cfg (Optional) The configuration options to use for this operation.\n                     *\n                     * @return {WordArray} The plaintext.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n                     *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n                     */\n                    decrypt: function (cipher, ciphertext, password, cfg) {\n                        // Apply config defaults\n                        cfg = this.cfg.extend(cfg);\n\n                        // Convert string to CipherParams\n                        ciphertext = this._parse(ciphertext, cfg.format);\n\n                        // Derive key and other params\n                        var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);\n\n                        // Add IV to config\n                        cfg.iv = derivedParams.iv;\n\n                        // Decrypt\n                        var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n                        return plaintext;\n                    }\n                });\n            }());\n\n\n        }));\n    },{\"./core\":54}],54:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory();\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([], factory);\n            }\n            else {\n                // Global (browser)\n                root.CryptoJS = factory();\n            }\n        }(this, function () {\n\n            /**\n             * CryptoJS core components.\n             */\n            var CryptoJS = CryptoJS || (function (Math, undefined) {\n                /*\n\t     * Local polyfil of Object.create\n\t     */\n                var create = Object.create || (function () {\n                    function F() {};\n\n                    return function (obj) {\n                        var subtype;\n\n                        F.prototype = obj;\n\n                        subtype = new F();\n\n                        F.prototype = null;\n\n                        return subtype;\n                    };\n                }())\n\n                /**\n                 * CryptoJS namespace.\n                 */\n                var C = {};\n\n                /**\n                 * Library namespace.\n                 */\n                var C_lib = C.lib = {};\n\n                /**\n                 * Base object for prototypal inheritance.\n                 */\n                var Base = C_lib.Base = (function () {\n\n\n                    return {\n                        /**\n                         * Creates a new object that inherits from this object.\n                         *\n                         * @param {Object} overrides Properties to copy into the new object.\n                         *\n                         * @return {Object} The new object.\n                         *\n                         * @static\n                         *\n                         * @example\n                         *\n                         *     var MyType = CryptoJS.lib.Base.extend({\n                         *         field: 'value',\n                         *\n                         *         method: function () {\n                         *         }\n                         *     });\n                         */\n                        extend: function (overrides) {\n                            // Spawn\n                            var subtype = create(this);\n\n                            // Augment\n                            if (overrides) {\n                                subtype.mixIn(overrides);\n                            }\n\n                            // Create default initializer\n                            if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n                                subtype.init = function () {\n                                    subtype.$super.init.apply(this, arguments);\n                                };\n                            }\n\n                            // Initializer's prototype is the subtype object\n                            subtype.init.prototype = subtype;\n\n                            // Reference supertype\n                            subtype.$super = this;\n\n                            return subtype;\n                        },\n\n                        /**\n                         * Extends this object and runs the init method.\n                         * Arguments to create() will be passed to init().\n                         *\n                         * @return {Object} The new object.\n                         *\n                         * @static\n                         *\n                         * @example\n                         *\n                         *     var instance = MyType.create();\n                         */\n                        create: function () {\n                            var instance = this.extend();\n                            instance.init.apply(instance, arguments);\n\n                            return instance;\n                        },\n\n                        /**\n                         * Initializes a newly created object.\n                         * Override this method to add some logic when your objects are created.\n                         *\n                         * @example\n                         *\n                         *     var MyType = CryptoJS.lib.Base.extend({\n                         *         init: function () {\n                         *             // ...\n                         *         }\n                         *     });\n                         */\n                        init: function () {\n                        },\n\n                        /**\n                         * Copies properties into this object.\n                         *\n                         * @param {Object} properties The properties to mix in.\n                         *\n                         * @example\n                         *\n                         *     MyType.mixIn({\n                         *         field: 'value'\n                         *     });\n                         */\n                        mixIn: function (properties) {\n                            for (var propertyName in properties) {\n                                if (properties.hasOwnProperty(propertyName)) {\n                                    this[propertyName] = properties[propertyName];\n                                }\n                            }\n\n                            // IE won't copy toString using the loop above\n                            if (properties.hasOwnProperty('toString')) {\n                                this.toString = properties.toString;\n                            }\n                        },\n\n                        /**\n                         * Creates a copy of this object.\n                         *\n                         * @return {Object} The clone.\n                         *\n                         * @example\n                         *\n                         *     var clone = instance.clone();\n                         */\n                        clone: function () {\n                            return this.init.prototype.extend(this);\n                        }\n                    };\n                }());\n\n                /**\n                 * An array of 32-bit words.\n                 *\n                 * @property {Array} words The array of 32-bit words.\n                 * @property {number} sigBytes The number of significant bytes in this word array.\n                 */\n                var WordArray = C_lib.WordArray = Base.extend({\n                    /**\n                     * Initializes a newly created word array.\n                     *\n                     * @param {Array} words (Optional) An array of 32-bit words.\n                     * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.lib.WordArray.create();\n                     *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n                     *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n                     */\n                    init: function (words, sigBytes) {\n                        words = this.words = words || [];\n\n                        if (sigBytes != undefined) {\n                            this.sigBytes = sigBytes;\n                        } else {\n                            this.sigBytes = words.length * 4;\n                        }\n                    },\n\n                    /**\n                     * Converts this word array to a string.\n                     *\n                     * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n                     *\n                     * @return {string} The stringified word array.\n                     *\n                     * @example\n                     *\n                     *     var string = wordArray + '';\n                     *     var string = wordArray.toString();\n                     *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n                     */\n                    toString: function (encoder) {\n                        return (encoder || Hex).stringify(this);\n                    },\n\n                    /**\n                     * Concatenates a word array to this word array.\n                     *\n                     * @param {WordArray} wordArray The word array to append.\n                     *\n                     * @return {WordArray} This word array.\n                     *\n                     * @example\n                     *\n                     *     wordArray1.concat(wordArray2);\n                     */\n                    concat: function (wordArray) {\n                        // Shortcuts\n                        var thisWords = this.words;\n                        var thatWords = wordArray.words;\n                        var thisSigBytes = this.sigBytes;\n                        var thatSigBytes = wordArray.sigBytes;\n\n                        // Clamp excess bits\n                        this.clamp();\n\n                        // Concat\n                        if (thisSigBytes % 4) {\n                            // Copy one byte at a time\n                            for (var i = 0; i < thatSigBytes; i++) {\n                                var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n                                thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n                            }\n                        } else {\n                            // Copy one word at a time\n                            for (var i = 0; i < thatSigBytes; i += 4) {\n                                thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n                            }\n                        }\n                        this.sigBytes += thatSigBytes;\n\n                        // Chainable\n                        return this;\n                    },\n\n                    /**\n                     * Removes insignificant bits.\n                     *\n                     * @example\n                     *\n                     *     wordArray.clamp();\n                     */\n                    clamp: function () {\n                        // Shortcuts\n                        var words = this.words;\n                        var sigBytes = this.sigBytes;\n\n                        // Clamp\n                        words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n                        words.length = Math.ceil(sigBytes / 4);\n                    },\n\n                    /**\n                     * Creates a copy of this word array.\n                     *\n                     * @return {WordArray} The clone.\n                     *\n                     * @example\n                     *\n                     *     var clone = wordArray.clone();\n                     */\n                    clone: function () {\n                        var clone = Base.clone.call(this);\n                        clone.words = this.words.slice(0);\n\n                        return clone;\n                    },\n\n                    /**\n                     * Creates a word array filled with random bytes.\n                     *\n                     * @param {number} nBytes The number of random bytes to generate.\n                     *\n                     * @return {WordArray} The random word array.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.lib.WordArray.random(16);\n                     */\n                    random: function (nBytes) {\n                        var words = [];\n\n                        var r = (function (m_w) {\n                            var m_w = m_w;\n                            var m_z = 0x3ade68b1;\n                            var mask = 0xffffffff;\n\n                            return function () {\n                                m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n                                m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n                                var result = ((m_z << 0x10) + m_w) & mask;\n                                result /= 0x100000000;\n                                result += 0.5;\n                                return result * (Math.random() > .5 ? 1 : -1);\n                            }\n                        });\n\n                        for (var i = 0, rcache; i < nBytes; i += 4) {\n                            var _r = r((rcache || Math.random()) * 0x100000000);\n\n                            rcache = _r() * 0x3ade67b7;\n                            words.push((_r() * 0x100000000) | 0);\n                        }\n\n                        return new WordArray.init(words, nBytes);\n                    }\n                });\n\n                /**\n                 * Encoder namespace.\n                 */\n                var C_enc = C.enc = {};\n\n                /**\n                 * Hex encoding strategy.\n                 */\n                var Hex = C_enc.Hex = {\n                    /**\n                     * Converts a word array to a hex string.\n                     *\n                     * @param {WordArray} wordArray The word array.\n                     *\n                     * @return {string} The hex string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n                     */\n                    stringify: function (wordArray) {\n                        // Shortcuts\n                        var words = wordArray.words;\n                        var sigBytes = wordArray.sigBytes;\n\n                        // Convert\n                        var hexChars = [];\n                        for (var i = 0; i < sigBytes; i++) {\n                            var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n                            hexChars.push((bite >>> 4).toString(16));\n                            hexChars.push((bite & 0x0f).toString(16));\n                        }\n\n                        return hexChars.join('');\n                    },\n\n                    /**\n                     * Converts a hex string to a word array.\n                     *\n                     * @param {string} hexStr The hex string.\n                     *\n                     * @return {WordArray} The word array.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n                     */\n                    parse: function (hexStr) {\n                        // Shortcut\n                        var hexStrLength = hexStr.length;\n\n                        // Convert\n                        var words = [];\n                        for (var i = 0; i < hexStrLength; i += 2) {\n                            words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n                        }\n\n                        return new WordArray.init(words, hexStrLength / 2);\n                    }\n                };\n\n                /**\n                 * Latin1 encoding strategy.\n                 */\n                var Latin1 = C_enc.Latin1 = {\n                    /**\n                     * Converts a word array to a Latin1 string.\n                     *\n                     * @param {WordArray} wordArray The word array.\n                     *\n                     * @return {string} The Latin1 string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n                     */\n                    stringify: function (wordArray) {\n                        // Shortcuts\n                        var words = wordArray.words;\n                        var sigBytes = wordArray.sigBytes;\n\n                        // Convert\n                        var latin1Chars = [];\n                        for (var i = 0; i < sigBytes; i++) {\n                            var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n                            latin1Chars.push(String.fromCharCode(bite));\n                        }\n\n                        return latin1Chars.join('');\n                    },\n\n                    /**\n                     * Converts a Latin1 string to a word array.\n                     *\n                     * @param {string} latin1Str The Latin1 string.\n                     *\n                     * @return {WordArray} The word array.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n                     */\n                    parse: function (latin1Str) {\n                        // Shortcut\n                        var latin1StrLength = latin1Str.length;\n\n                        // Convert\n                        var words = [];\n                        for (var i = 0; i < latin1StrLength; i++) {\n                            words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n                        }\n\n                        return new WordArray.init(words, latin1StrLength);\n                    }\n                };\n\n                /**\n                 * UTF-8 encoding strategy.\n                 */\n                var Utf8 = C_enc.Utf8 = {\n                    /**\n                     * Converts a word array to a UTF-8 string.\n                     *\n                     * @param {WordArray} wordArray The word array.\n                     *\n                     * @return {string} The UTF-8 string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n                     */\n                    stringify: function (wordArray) {\n                        try {\n                            return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n                        } catch (e) {\n                            throw new Error('Malformed UTF-8 data');\n                        }\n                    },\n\n                    /**\n                     * Converts a UTF-8 string to a word array.\n                     *\n                     * @param {string} utf8Str The UTF-8 string.\n                     *\n                     * @return {WordArray} The word array.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n                     */\n                    parse: function (utf8Str) {\n                        return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n                    }\n                };\n\n                /**\n                 * Abstract buffered block algorithm template.\n                 *\n                 * The property blockSize must be implemented in a concrete subtype.\n                 *\n                 * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n                 */\n                var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n                    /**\n                     * Resets this block algorithm's data buffer to its initial state.\n                     *\n                     * @example\n                     *\n                     *     bufferedBlockAlgorithm.reset();\n                     */\n                    reset: function () {\n                        // Initial values\n                        this._data = new WordArray.init();\n                        this._nDataBytes = 0;\n                    },\n\n                    /**\n                     * Adds new data to this block algorithm's buffer.\n                     *\n                     * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n                     *\n                     * @example\n                     *\n                     *     bufferedBlockAlgorithm._append('data');\n                     *     bufferedBlockAlgorithm._append(wordArray);\n                     */\n                    _append: function (data) {\n                        // Convert string to WordArray, else assume WordArray already\n                        if (typeof data == 'string') {\n                            data = Utf8.parse(data);\n                        }\n\n                        // Append\n                        this._data.concat(data);\n                        this._nDataBytes += data.sigBytes;\n                    },\n\n                    /**\n                     * Processes available data blocks.\n                     *\n                     * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n                     *\n                     * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n                     *\n                     * @return {WordArray} The processed data.\n                     *\n                     * @example\n                     *\n                     *     var processedData = bufferedBlockAlgorithm._process();\n                     *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n                     */\n                    _process: function (doFlush) {\n                        // Shortcuts\n                        var data = this._data;\n                        var dataWords = data.words;\n                        var dataSigBytes = data.sigBytes;\n                        var blockSize = this.blockSize;\n                        var blockSizeBytes = blockSize * 4;\n\n                        // Count blocks ready\n                        var nBlocksReady = dataSigBytes / blockSizeBytes;\n                        if (doFlush) {\n                            // Round up to include partial blocks\n                            nBlocksReady = Math.ceil(nBlocksReady);\n                        } else {\n                            // Round down to include only full blocks,\n                            // less the number of blocks that must remain in the buffer\n                            nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n                        }\n\n                        // Count words ready\n                        var nWordsReady = nBlocksReady * blockSize;\n\n                        // Count bytes ready\n                        var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n                        // Process blocks\n                        if (nWordsReady) {\n                            for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n                                // Perform concrete-algorithm logic\n                                this._doProcessBlock(dataWords, offset);\n                            }\n\n                            // Remove processed words\n                            var processedWords = dataWords.splice(0, nWordsReady);\n                            data.sigBytes -= nBytesReady;\n                        }\n\n                        // Return processed words\n                        return new WordArray.init(processedWords, nBytesReady);\n                    },\n\n                    /**\n                     * Creates a copy of this object.\n                     *\n                     * @return {Object} The clone.\n                     *\n                     * @example\n                     *\n                     *     var clone = bufferedBlockAlgorithm.clone();\n                     */\n                    clone: function () {\n                        var clone = Base.clone.call(this);\n                        clone._data = this._data.clone();\n\n                        return clone;\n                    },\n\n                    _minBufferSize: 0\n                });\n\n                /**\n                 * Abstract hasher template.\n                 *\n                 * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n                 */\n                var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n                    /**\n                     * Configuration options.\n                     */\n                    cfg: Base.extend(),\n\n                    /**\n                     * Initializes a newly created hasher.\n                     *\n                     * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n                     *\n                     * @example\n                     *\n                     *     var hasher = CryptoJS.algo.SHA256.create();\n                     */\n                    init: function (cfg) {\n                        // Apply config defaults\n                        this.cfg = this.cfg.extend(cfg);\n\n                        // Set initial values\n                        this.reset();\n                    },\n\n                    /**\n                     * Resets this hasher to its initial state.\n                     *\n                     * @example\n                     *\n                     *     hasher.reset();\n                     */\n                    reset: function () {\n                        // Reset data buffer\n                        BufferedBlockAlgorithm.reset.call(this);\n\n                        // Perform concrete-hasher logic\n                        this._doReset();\n                    },\n\n                    /**\n                     * Updates this hasher with a message.\n                     *\n                     * @param {WordArray|string} messageUpdate The message to append.\n                     *\n                     * @return {Hasher} This hasher.\n                     *\n                     * @example\n                     *\n                     *     hasher.update('message');\n                     *     hasher.update(wordArray);\n                     */\n                    update: function (messageUpdate) {\n                        // Append\n                        this._append(messageUpdate);\n\n                        // Update the hash\n                        this._process();\n\n                        // Chainable\n                        return this;\n                    },\n\n                    /**\n                     * Finalizes the hash computation.\n                     * Note that the finalize operation is effectively a destructive, read-once operation.\n                     *\n                     * @param {WordArray|string} messageUpdate (Optional) A final message update.\n                     *\n                     * @return {WordArray} The hash.\n                     *\n                     * @example\n                     *\n                     *     var hash = hasher.finalize();\n                     *     var hash = hasher.finalize('message');\n                     *     var hash = hasher.finalize(wordArray);\n                     */\n                    finalize: function (messageUpdate) {\n                        // Final message update\n                        if (messageUpdate) {\n                            this._append(messageUpdate);\n                        }\n\n                        // Perform concrete-hasher logic\n                        var hash = this._doFinalize();\n\n                        return hash;\n                    },\n\n                    blockSize: 512/32,\n\n                    /**\n                     * Creates a shortcut function to a hasher's object interface.\n                     *\n                     * @param {Hasher} hasher The hasher to create a helper for.\n                     *\n                     * @return {Function} The shortcut function.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n                     */\n                    _createHelper: function (hasher) {\n                        return function (message, cfg) {\n                            return new hasher.init(cfg).finalize(message);\n                        };\n                    },\n\n                    /**\n                     * Creates a shortcut function to the HMAC's object interface.\n                     *\n                     * @param {Hasher} hasher The hasher to use in this HMAC helper.\n                     *\n                     * @return {Function} The shortcut function.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n                     */\n                    _createHmacHelper: function (hasher) {\n                        return function (message, key) {\n                            return new C_algo.HMAC.init(hasher, key).finalize(message);\n                        };\n                    }\n                });\n\n                /**\n                 * Algorithm namespace.\n                 */\n                var C_algo = C.algo = {};\n\n                return C;\n            }(Math));\n\n\n            return CryptoJS;\n\n        }));\n    },{}],55:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var C_enc = C.enc;\n\n                /**\n                 * Base64 encoding strategy.\n                 */\n                var Base64 = C_enc.Base64 = {\n                    /**\n                     * Converts a word array to a Base64 string.\n                     *\n                     * @param {WordArray} wordArray The word array.\n                     *\n                     * @return {string} The Base64 string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n                     */\n                    stringify: function (wordArray) {\n                        // Shortcuts\n                        var words = wordArray.words;\n                        var sigBytes = wordArray.sigBytes;\n                        var map = this._map;\n\n                        // Clamp excess bits\n                        wordArray.clamp();\n\n                        // Convert\n                        var base64Chars = [];\n                        for (var i = 0; i < sigBytes; i += 3) {\n                            var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;\n                            var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;\n                            var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;\n\n                            var triplet = (byte1 << 16) | (byte2 << 8) | byte3;\n\n                            for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {\n                                base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));\n                            }\n                        }\n\n                        // Add padding\n                        var paddingChar = map.charAt(64);\n                        if (paddingChar) {\n                            while (base64Chars.length % 4) {\n                                base64Chars.push(paddingChar);\n                            }\n                        }\n\n                        return base64Chars.join('');\n                    },\n\n                    /**\n                     * Converts a Base64 string to a word array.\n                     *\n                     * @param {string} base64Str The Base64 string.\n                     *\n                     * @return {WordArray} The word array.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n                     */\n                    parse: function (base64Str) {\n                        // Shortcuts\n                        var base64StrLength = base64Str.length;\n                        var map = this._map;\n                        var reverseMap = this._reverseMap;\n\n                        if (!reverseMap) {\n                            reverseMap = this._reverseMap = [];\n                            for (var j = 0; j < map.length; j++) {\n                                reverseMap[map.charCodeAt(j)] = j;\n                            }\n                        }\n\n                        // Ignore padding\n                        var paddingChar = map.charAt(64);\n                        if (paddingChar) {\n                            var paddingIndex = base64Str.indexOf(paddingChar);\n                            if (paddingIndex !== -1) {\n                                base64StrLength = paddingIndex;\n                            }\n                        }\n\n                        // Convert\n                        return parseLoop(base64Str, base64StrLength, reverseMap);\n\n                    },\n\n                    _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='\n                };\n\n                function parseLoop(base64Str, base64StrLength, reverseMap) {\n                    var words = [];\n                    var nBytes = 0;\n                    for (var i = 0; i < base64StrLength; i++) {\n                        if (i % 4) {\n                            var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);\n                            var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);\n                            words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);\n                            nBytes++;\n                        }\n                    }\n                    return WordArray.create(words, nBytes);\n                }\n            }());\n\n\n            return CryptoJS.enc.Base64;\n\n        }));\n    },{\"./core\":54}],56:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var C_enc = C.enc;\n\n                /**\n                 * UTF-16 BE encoding strategy.\n                 */\n                var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {\n                    /**\n                     * Converts a word array to a UTF-16 BE string.\n                     *\n                     * @param {WordArray} wordArray The word array.\n                     *\n                     * @return {string} The UTF-16 BE string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);\n                     */\n                    stringify: function (wordArray) {\n                        // Shortcuts\n                        var words = wordArray.words;\n                        var sigBytes = wordArray.sigBytes;\n\n                        // Convert\n                        var utf16Chars = [];\n                        for (var i = 0; i < sigBytes; i += 2) {\n                            var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;\n                            utf16Chars.push(String.fromCharCode(codePoint));\n                        }\n\n                        return utf16Chars.join('');\n                    },\n\n                    /**\n                     * Converts a UTF-16 BE string to a word array.\n                     *\n                     * @param {string} utf16Str The UTF-16 BE string.\n                     *\n                     * @return {WordArray} The word array.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);\n                     */\n                    parse: function (utf16Str) {\n                        // Shortcut\n                        var utf16StrLength = utf16Str.length;\n\n                        // Convert\n                        var words = [];\n                        for (var i = 0; i < utf16StrLength; i++) {\n                            words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);\n                        }\n\n                        return WordArray.create(words, utf16StrLength * 2);\n                    }\n                };\n\n                /**\n                 * UTF-16 LE encoding strategy.\n                 */\n                C_enc.Utf16LE = {\n                    /**\n                     * Converts a word array to a UTF-16 LE string.\n                     *\n                     * @param {WordArray} wordArray The word array.\n                     *\n                     * @return {string} The UTF-16 LE string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);\n                     */\n                    stringify: function (wordArray) {\n                        // Shortcuts\n                        var words = wordArray.words;\n                        var sigBytes = wordArray.sigBytes;\n\n                        // Convert\n                        var utf16Chars = [];\n                        for (var i = 0; i < sigBytes; i += 2) {\n                            var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);\n                            utf16Chars.push(String.fromCharCode(codePoint));\n                        }\n\n                        return utf16Chars.join('');\n                    },\n\n                    /**\n                     * Converts a UTF-16 LE string to a word array.\n                     *\n                     * @param {string} utf16Str The UTF-16 LE string.\n                     *\n                     * @return {WordArray} The word array.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);\n                     */\n                    parse: function (utf16Str) {\n                        // Shortcut\n                        var utf16StrLength = utf16Str.length;\n\n                        // Convert\n                        var words = [];\n                        for (var i = 0; i < utf16StrLength; i++) {\n                            words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));\n                        }\n\n                        return WordArray.create(words, utf16StrLength * 2);\n                    }\n                };\n\n                function swapEndian(word) {\n                    return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);\n                }\n            }());\n\n\n            return CryptoJS.enc.Utf16;\n\n        }));\n    },{\"./core\":54}],57:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./sha1\", \"./hmac\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var Base = C_lib.Base;\n                var WordArray = C_lib.WordArray;\n                var C_algo = C.algo;\n                var MD5 = C_algo.MD5;\n\n                /**\n                 * This key derivation function is meant to conform with EVP_BytesToKey.\n                 * www.openssl.org/docs/crypto/EVP_BytesToKey.html\n                 */\n                var EvpKDF = C_algo.EvpKDF = Base.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n                     * @property {Hasher} hasher The hash algorithm to use. Default: MD5\n                     * @property {number} iterations The number of iterations to perform. Default: 1\n                     */\n                    cfg: Base.extend({\n                        keySize: 128/32,\n                        hasher: MD5,\n                        iterations: 1\n                    }),\n\n                    /**\n                     * Initializes a newly created key derivation function.\n                     *\n                     * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n                     *\n                     * @example\n                     *\n                     *     var kdf = CryptoJS.algo.EvpKDF.create();\n                     *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });\n                     *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });\n                     */\n                    init: function (cfg) {\n                        this.cfg = this.cfg.extend(cfg);\n                    },\n\n                    /**\n                     * Derives a key from a password.\n                     *\n                     * @param {WordArray|string} password The password.\n                     * @param {WordArray|string} salt A salt.\n                     *\n                     * @return {WordArray} The derived key.\n                     *\n                     * @example\n                     *\n                     *     var key = kdf.compute(password, salt);\n                     */\n                    compute: function (password, salt) {\n                        // Shortcut\n                        var cfg = this.cfg;\n\n                        // Init hasher\n                        var hasher = cfg.hasher.create();\n\n                        // Initial values\n                        var derivedKey = WordArray.create();\n\n                        // Shortcuts\n                        var derivedKeyWords = derivedKey.words;\n                        var keySize = cfg.keySize;\n                        var iterations = cfg.iterations;\n\n                        // Generate key\n                        while (derivedKeyWords.length < keySize) {\n                            if (block) {\n                                hasher.update(block);\n                            }\n                            var block = hasher.update(password).finalize(salt);\n                            hasher.reset();\n\n                            // Iterations\n                            for (var i = 1; i < iterations; i++) {\n                                block = hasher.finalize(block);\n                                hasher.reset();\n                            }\n\n                            derivedKey.concat(block);\n                        }\n                        derivedKey.sigBytes = keySize * 4;\n\n                        return derivedKey;\n                    }\n                });\n\n                /**\n                 * Derives a key from a password.\n                 *\n                 * @param {WordArray|string} password The password.\n                 * @param {WordArray|string} salt A salt.\n                 * @param {Object} cfg (Optional) The configuration options to use for this computation.\n                 *\n                 * @return {WordArray} The derived key.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var key = CryptoJS.EvpKDF(password, salt);\n                 *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });\n                 *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });\n                 */\n                C.EvpKDF = function (password, salt, cfg) {\n                    return EvpKDF.create(cfg).compute(password, salt);\n                };\n            }());\n\n\n            return CryptoJS.EvpKDF;\n\n        }));\n    },{\"./core\":54,\"./hmac\":59,\"./sha1\":78}],58:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function (undefined) {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var CipherParams = C_lib.CipherParams;\n                var C_enc = C.enc;\n                var Hex = C_enc.Hex;\n                var C_format = C.format;\n\n                var HexFormatter = C_format.Hex = {\n                    /**\n                     * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.\n                     *\n                     * @param {CipherParams} cipherParams The cipher params object.\n                     *\n                     * @return {string} The hexadecimally encoded string.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);\n                     */\n                    stringify: function (cipherParams) {\n                        return cipherParams.ciphertext.toString(Hex);\n                    },\n\n                    /**\n                     * Converts a hexadecimally encoded ciphertext string to a cipher params object.\n                     *\n                     * @param {string} input The hexadecimally encoded string.\n                     *\n                     * @return {CipherParams} The cipher params object.\n                     *\n                     * @static\n                     *\n                     * @example\n                     *\n                     *     var cipherParams = CryptoJS.format.Hex.parse(hexString);\n                     */\n                    parse: function (input) {\n                        var ciphertext = Hex.parse(input);\n                        return CipherParams.create({ ciphertext: ciphertext });\n                    }\n                };\n            }());\n\n\n            return CryptoJS.format.Hex;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],59:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var Base = C_lib.Base;\n                var C_enc = C.enc;\n                var Utf8 = C_enc.Utf8;\n                var C_algo = C.algo;\n\n                /**\n                 * HMAC algorithm.\n                 */\n                var HMAC = C_algo.HMAC = Base.extend({\n                    /**\n                     * Initializes a newly created HMAC.\n                     *\n                     * @param {Hasher} hasher The hash algorithm to use.\n                     * @param {WordArray|string} key The secret key.\n                     *\n                     * @example\n                     *\n                     *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n                     */\n                    init: function (hasher, key) {\n                        // Init hasher\n                        hasher = this._hasher = new hasher.init();\n\n                        // Convert string to WordArray, else assume WordArray already\n                        if (typeof key == 'string') {\n                            key = Utf8.parse(key);\n                        }\n\n                        // Shortcuts\n                        var hasherBlockSize = hasher.blockSize;\n                        var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n                        // Allow arbitrary length keys\n                        if (key.sigBytes > hasherBlockSizeBytes) {\n                            key = hasher.finalize(key);\n                        }\n\n                        // Clamp excess bits\n                        key.clamp();\n\n                        // Clone key for inner and outer pads\n                        var oKey = this._oKey = key.clone();\n                        var iKey = this._iKey = key.clone();\n\n                        // Shortcuts\n                        var oKeyWords = oKey.words;\n                        var iKeyWords = iKey.words;\n\n                        // XOR keys with pad constants\n                        for (var i = 0; i < hasherBlockSize; i++) {\n                            oKeyWords[i] ^= 0x5c5c5c5c;\n                            iKeyWords[i] ^= 0x36363636;\n                        }\n                        oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n                        // Set initial values\n                        this.reset();\n                    },\n\n                    /**\n                     * Resets this HMAC to its initial state.\n                     *\n                     * @example\n                     *\n                     *     hmacHasher.reset();\n                     */\n                    reset: function () {\n                        // Shortcut\n                        var hasher = this._hasher;\n\n                        // Reset\n                        hasher.reset();\n                        hasher.update(this._iKey);\n                    },\n\n                    /**\n                     * Updates this HMAC with a message.\n                     *\n                     * @param {WordArray|string} messageUpdate The message to append.\n                     *\n                     * @return {HMAC} This HMAC instance.\n                     *\n                     * @example\n                     *\n                     *     hmacHasher.update('message');\n                     *     hmacHasher.update(wordArray);\n                     */\n                    update: function (messageUpdate) {\n                        this._hasher.update(messageUpdate);\n\n                        // Chainable\n                        return this;\n                    },\n\n                    /**\n                     * Finalizes the HMAC computation.\n                     * Note that the finalize operation is effectively a destructive, read-once operation.\n                     *\n                     * @param {WordArray|string} messageUpdate (Optional) A final message update.\n                     *\n                     * @return {WordArray} The HMAC.\n                     *\n                     * @example\n                     *\n                     *     var hmac = hmacHasher.finalize();\n                     *     var hmac = hmacHasher.finalize('message');\n                     *     var hmac = hmacHasher.finalize(wordArray);\n                     */\n                    finalize: function (messageUpdate) {\n                        // Shortcut\n                        var hasher = this._hasher;\n\n                        // Compute HMAC\n                        var innerHash = hasher.finalize(messageUpdate);\n                        hasher.reset();\n                        var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n                        return hmac;\n                    }\n                });\n            }());\n\n\n        }));\n    },{\"./core\":54}],60:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./lib-typedarrays\"), require(\"./enc-utf16\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./sha1\"), require(\"./sha256\"), require(\"./sha224\"), require(\"./sha512\"), require(\"./sha384\"), require(\"./sha3\"), require(\"./ripemd160\"), require(\"./hmac\"), require(\"./pbkdf2\"), require(\"./evpkdf\"), require(\"./cipher-core\"), require(\"./mode-cfb\"), require(\"./mode-ctr\"), require(\"./mode-ctr-gladman\"), require(\"./mode-ofb\"), require(\"./mode-ecb\"), require(\"./pad-ansix923\"), require(\"./pad-iso10126\"), require(\"./pad-iso97971\"), require(\"./pad-zeropadding\"), require(\"./pad-nopadding\"), require(\"./format-hex\"), require(\"./aes\"), require(\"./tripledes\"), require(\"./rc4\"), require(\"./rabbit\"), require(\"./rabbit-legacy\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./x64-core\", \"./lib-typedarrays\", \"./enc-utf16\", \"./enc-base64\", \"./md5\", \"./sha1\", \"./sha256\", \"./sha224\", \"./sha512\", \"./sha384\", \"./sha3\", \"./ripemd160\", \"./hmac\", \"./pbkdf2\", \"./evpkdf\", \"./cipher-core\", \"./mode-cfb\", \"./mode-ctr\", \"./mode-ctr-gladman\", \"./mode-ofb\", \"./mode-ecb\", \"./pad-ansix923\", \"./pad-iso10126\", \"./pad-iso97971\", \"./pad-zeropadding\", \"./pad-nopadding\", \"./format-hex\", \"./aes\", \"./tripledes\", \"./rc4\", \"./rabbit\", \"./rabbit-legacy\"], factory);\n            }\n            else {\n                // Global (browser)\n                root.CryptoJS = factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            return CryptoJS;\n\n        }));\n    },{\"./aes\":52,\"./cipher-core\":53,\"./core\":54,\"./enc-base64\":55,\"./enc-utf16\":56,\"./evpkdf\":57,\"./format-hex\":58,\"./hmac\":59,\"./lib-typedarrays\":61,\"./md5\":62,\"./mode-cfb\":63,\"./mode-ctr\":65,\"./mode-ctr-gladman\":64,\"./mode-ecb\":66,\"./mode-ofb\":67,\"./pad-ansix923\":68,\"./pad-iso10126\":69,\"./pad-iso97971\":70,\"./pad-nopadding\":71,\"./pad-zeropadding\":72,\"./pbkdf2\":73,\"./rabbit\":75,\"./rabbit-legacy\":74,\"./rc4\":76,\"./ripemd160\":77,\"./sha1\":78,\"./sha224\":79,\"./sha256\":80,\"./sha3\":81,\"./sha384\":82,\"./sha512\":83,\"./tripledes\":84,\"./x64-core\":85}],61:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Check if typed arrays are supported\n                if (typeof ArrayBuffer != 'function') {\n                    return;\n                }\n\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n\n                // Reference original init\n                var superInit = WordArray.init;\n\n                // Augment WordArray.init to handle typed arrays\n                var subInit = WordArray.init = function (typedArray) {\n                    // Convert buffers to uint8\n                    if (typedArray instanceof ArrayBuffer) {\n                        typedArray = new Uint8Array(typedArray);\n                    }\n\n                    // Convert other array views to uint8\n                    if (\n                        typedArray instanceof Int8Array ||\n                        (typeof Uint8ClampedArray !== \"undefined\" && typedArray instanceof Uint8ClampedArray) ||\n                        typedArray instanceof Int16Array ||\n                        typedArray instanceof Uint16Array ||\n                        typedArray instanceof Int32Array ||\n                        typedArray instanceof Uint32Array ||\n                        typedArray instanceof Float32Array ||\n                        typedArray instanceof Float64Array\n                    ) {\n                        typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n                    }\n\n                    // Handle Uint8Array\n                    if (typedArray instanceof Uint8Array) {\n                        // Shortcut\n                        var typedArrayByteLength = typedArray.byteLength;\n\n                        // Extract bytes\n                        var words = [];\n                        for (var i = 0; i < typedArrayByteLength; i++) {\n                            words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);\n                        }\n\n                        // Initialize this word array\n                        superInit.call(this, words, typedArrayByteLength);\n                    } else {\n                        // Else call normal init\n                        superInit.apply(this, arguments);\n                    }\n                };\n\n                subInit.prototype = WordArray;\n            }());\n\n\n            return CryptoJS.lib.WordArray;\n\n        }));\n    },{\"./core\":54}],62:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function (Math) {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var Hasher = C_lib.Hasher;\n                var C_algo = C.algo;\n\n                // Constants table\n                var T = [];\n\n                // Compute constants\n                (function () {\n                    for (var i = 0; i < 64; i++) {\n                        T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n                    }\n                }());\n\n                /**\n                 * MD5 hash algorithm.\n                 */\n                var MD5 = C_algo.MD5 = Hasher.extend({\n                    _doReset: function () {\n                        this._hash = new WordArray.init([\n                            0x67452301, 0xefcdab89,\n                            0x98badcfe, 0x10325476\n                        ]);\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        // Swap endian\n                        for (var i = 0; i < 16; i++) {\n                            // Shortcuts\n                            var offset_i = offset + i;\n                            var M_offset_i = M[offset_i];\n\n                            M[offset_i] = (\n                                (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n                                (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n                            );\n                        }\n\n                        // Shortcuts\n                        var H = this._hash.words;\n\n                        var M_offset_0  = M[offset + 0];\n                        var M_offset_1  = M[offset + 1];\n                        var M_offset_2  = M[offset + 2];\n                        var M_offset_3  = M[offset + 3];\n                        var M_offset_4  = M[offset + 4];\n                        var M_offset_5  = M[offset + 5];\n                        var M_offset_6  = M[offset + 6];\n                        var M_offset_7  = M[offset + 7];\n                        var M_offset_8  = M[offset + 8];\n                        var M_offset_9  = M[offset + 9];\n                        var M_offset_10 = M[offset + 10];\n                        var M_offset_11 = M[offset + 11];\n                        var M_offset_12 = M[offset + 12];\n                        var M_offset_13 = M[offset + 13];\n                        var M_offset_14 = M[offset + 14];\n                        var M_offset_15 = M[offset + 15];\n\n                        // Working varialbes\n                        var a = H[0];\n                        var b = H[1];\n                        var c = H[2];\n                        var d = H[3];\n\n                        // Computation\n                        a = FF(a, b, c, d, M_offset_0,  7,  T[0]);\n                        d = FF(d, a, b, c, M_offset_1,  12, T[1]);\n                        c = FF(c, d, a, b, M_offset_2,  17, T[2]);\n                        b = FF(b, c, d, a, M_offset_3,  22, T[3]);\n                        a = FF(a, b, c, d, M_offset_4,  7,  T[4]);\n                        d = FF(d, a, b, c, M_offset_5,  12, T[5]);\n                        c = FF(c, d, a, b, M_offset_6,  17, T[6]);\n                        b = FF(b, c, d, a, M_offset_7,  22, T[7]);\n                        a = FF(a, b, c, d, M_offset_8,  7,  T[8]);\n                        d = FF(d, a, b, c, M_offset_9,  12, T[9]);\n                        c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n                        b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n                        a = FF(a, b, c, d, M_offset_12, 7,  T[12]);\n                        d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n                        c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n                        b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n                        a = GG(a, b, c, d, M_offset_1,  5,  T[16]);\n                        d = GG(d, a, b, c, M_offset_6,  9,  T[17]);\n                        c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n                        b = GG(b, c, d, a, M_offset_0,  20, T[19]);\n                        a = GG(a, b, c, d, M_offset_5,  5,  T[20]);\n                        d = GG(d, a, b, c, M_offset_10, 9,  T[21]);\n                        c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n                        b = GG(b, c, d, a, M_offset_4,  20, T[23]);\n                        a = GG(a, b, c, d, M_offset_9,  5,  T[24]);\n                        d = GG(d, a, b, c, M_offset_14, 9,  T[25]);\n                        c = GG(c, d, a, b, M_offset_3,  14, T[26]);\n                        b = GG(b, c, d, a, M_offset_8,  20, T[27]);\n                        a = GG(a, b, c, d, M_offset_13, 5,  T[28]);\n                        d = GG(d, a, b, c, M_offset_2,  9,  T[29]);\n                        c = GG(c, d, a, b, M_offset_7,  14, T[30]);\n                        b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n                        a = HH(a, b, c, d, M_offset_5,  4,  T[32]);\n                        d = HH(d, a, b, c, M_offset_8,  11, T[33]);\n                        c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n                        b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n                        a = HH(a, b, c, d, M_offset_1,  4,  T[36]);\n                        d = HH(d, a, b, c, M_offset_4,  11, T[37]);\n                        c = HH(c, d, a, b, M_offset_7,  16, T[38]);\n                        b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n                        a = HH(a, b, c, d, M_offset_13, 4,  T[40]);\n                        d = HH(d, a, b, c, M_offset_0,  11, T[41]);\n                        c = HH(c, d, a, b, M_offset_3,  16, T[42]);\n                        b = HH(b, c, d, a, M_offset_6,  23, T[43]);\n                        a = HH(a, b, c, d, M_offset_9,  4,  T[44]);\n                        d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n                        c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n                        b = HH(b, c, d, a, M_offset_2,  23, T[47]);\n\n                        a = II(a, b, c, d, M_offset_0,  6,  T[48]);\n                        d = II(d, a, b, c, M_offset_7,  10, T[49]);\n                        c = II(c, d, a, b, M_offset_14, 15, T[50]);\n                        b = II(b, c, d, a, M_offset_5,  21, T[51]);\n                        a = II(a, b, c, d, M_offset_12, 6,  T[52]);\n                        d = II(d, a, b, c, M_offset_3,  10, T[53]);\n                        c = II(c, d, a, b, M_offset_10, 15, T[54]);\n                        b = II(b, c, d, a, M_offset_1,  21, T[55]);\n                        a = II(a, b, c, d, M_offset_8,  6,  T[56]);\n                        d = II(d, a, b, c, M_offset_15, 10, T[57]);\n                        c = II(c, d, a, b, M_offset_6,  15, T[58]);\n                        b = II(b, c, d, a, M_offset_13, 21, T[59]);\n                        a = II(a, b, c, d, M_offset_4,  6,  T[60]);\n                        d = II(d, a, b, c, M_offset_11, 10, T[61]);\n                        c = II(c, d, a, b, M_offset_2,  15, T[62]);\n                        b = II(b, c, d, a, M_offset_9,  21, T[63]);\n\n                        // Intermediate hash value\n                        H[0] = (H[0] + a) | 0;\n                        H[1] = (H[1] + b) | 0;\n                        H[2] = (H[2] + c) | 0;\n                        H[3] = (H[3] + d) | 0;\n                    },\n\n                    _doFinalize: function () {\n                        // Shortcuts\n                        var data = this._data;\n                        var dataWords = data.words;\n\n                        var nBitsTotal = this._nDataBytes * 8;\n                        var nBitsLeft = data.sigBytes * 8;\n\n                        // Add padding\n                        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\n                        var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);\n                        var nBitsTotalL = nBitsTotal;\n                        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (\n                            (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |\n                            (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)\n                        );\n                        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n                            (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |\n                            (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)\n                        );\n\n                        data.sigBytes = (dataWords.length + 1) * 4;\n\n                        // Hash final blocks\n                        this._process();\n\n                        // Shortcuts\n                        var hash = this._hash;\n                        var H = hash.words;\n\n                        // Swap endian\n                        for (var i = 0; i < 4; i++) {\n                            // Shortcut\n                            var H_i = H[i];\n\n                            H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n                                (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n                        }\n\n                        // Return final computed hash\n                        return hash;\n                    },\n\n                    clone: function () {\n                        var clone = Hasher.clone.call(this);\n                        clone._hash = this._hash.clone();\n\n                        return clone;\n                    }\n                });\n\n                function FF(a, b, c, d, x, s, t) {\n                    var n = a + ((b & c) | (~b & d)) + x + t;\n                    return ((n << s) | (n >>> (32 - s))) + b;\n                }\n\n                function GG(a, b, c, d, x, s, t) {\n                    var n = a + ((b & d) | (c & ~d)) + x + t;\n                    return ((n << s) | (n >>> (32 - s))) + b;\n                }\n\n                function HH(a, b, c, d, x, s, t) {\n                    var n = a + (b ^ c ^ d) + x + t;\n                    return ((n << s) | (n >>> (32 - s))) + b;\n                }\n\n                function II(a, b, c, d, x, s, t) {\n                    var n = a + (c ^ (b | ~d)) + x + t;\n                    return ((n << s) | (n >>> (32 - s))) + b;\n                }\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.MD5('message');\n                 *     var hash = CryptoJS.MD5(wordArray);\n                 */\n                C.MD5 = Hasher._createHelper(MD5);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacMD5(message, key);\n                 */\n                C.HmacMD5 = Hasher._createHmacHelper(MD5);\n            }(Math));\n\n\n            return CryptoJS.MD5;\n\n        }));\n    },{\"./core\":54}],63:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * Cipher Feedback block mode.\n             */\n            CryptoJS.mode.CFB = (function () {\n                var CFB = CryptoJS.lib.BlockCipherMode.extend();\n\n                CFB.Encryptor = CFB.extend({\n                    processBlock: function (words, offset) {\n                        // Shortcuts\n                        var cipher = this._cipher;\n                        var blockSize = cipher.blockSize;\n\n                        generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n                        // Remember this block to use with next block\n                        this._prevBlock = words.slice(offset, offset + blockSize);\n                    }\n                });\n\n                CFB.Decryptor = CFB.extend({\n                    processBlock: function (words, offset) {\n                        // Shortcuts\n                        var cipher = this._cipher;\n                        var blockSize = cipher.blockSize;\n\n                        // Remember this block to use with next block\n                        var thisBlock = words.slice(offset, offset + blockSize);\n\n                        generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);\n\n                        // This block becomes the previous block\n                        this._prevBlock = thisBlock;\n                    }\n                });\n\n                function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {\n                    // Shortcut\n                    var iv = this._iv;\n\n                    // Generate keystream\n                    if (iv) {\n                        var keystream = iv.slice(0);\n\n                        // Remove IV for subsequent blocks\n                        this._iv = undefined;\n                    } else {\n                        var keystream = this._prevBlock;\n                    }\n                    cipher.encryptBlock(keystream, 0);\n\n                    // Encrypt\n                    for (var i = 0; i < blockSize; i++) {\n                        words[offset + i] ^= keystream[i];\n                    }\n                }\n\n                return CFB;\n            }());\n\n\n            return CryptoJS.mode.CFB;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],64:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /** @preserve\n             * Counter block mode compatible with  Dr Brian Gladman fileenc.c\n             * derived from CryptoJS.mode.CTR\n             * Jan Hruby jhruby.web@gmail.com\n             */\n            CryptoJS.mode.CTRGladman = (function () {\n                var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();\n\n                function incWord(word)\n                {\n                    if (((word >> 24) & 0xff) === 0xff) { //overflow\n                        var b1 = (word >> 16)&0xff;\n                        var b2 = (word >> 8)&0xff;\n                        var b3 = word & 0xff;\n\n                        if (b1 === 0xff) // overflow b1\n                        {\n                            b1 = 0;\n                            if (b2 === 0xff)\n                            {\n                                b2 = 0;\n                                if (b3 === 0xff)\n                                {\n                                    b3 = 0;\n                                }\n                                else\n                                {\n                                    ++b3;\n                                }\n                            }\n                            else\n                            {\n                                ++b2;\n                            }\n                        }\n                        else\n                        {\n                            ++b1;\n                        }\n\n                        word = 0;\n                        word += (b1 << 16);\n                        word += (b2 << 8);\n                        word += b3;\n                    }\n                    else\n                    {\n                        word += (0x01 << 24);\n                    }\n                    return word;\n                }\n\n                function incCounter(counter)\n                {\n                    if ((counter[0] = incWord(counter[0])) === 0)\n                    {\n                        // encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8\n                        counter[1] = incWord(counter[1]);\n                    }\n                    return counter;\n                }\n\n                var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({\n                    processBlock: function (words, offset) {\n                        // Shortcuts\n                        var cipher = this._cipher\n                        var blockSize = cipher.blockSize;\n                        var iv = this._iv;\n                        var counter = this._counter;\n\n                        // Generate keystream\n                        if (iv) {\n                            counter = this._counter = iv.slice(0);\n\n                            // Remove IV for subsequent blocks\n                            this._iv = undefined;\n                        }\n\n                        incCounter(counter);\n\n                        var keystream = counter.slice(0);\n                        cipher.encryptBlock(keystream, 0);\n\n                        // Encrypt\n                        for (var i = 0; i < blockSize; i++) {\n                            words[offset + i] ^= keystream[i];\n                        }\n                    }\n                });\n\n                CTRGladman.Decryptor = Encryptor;\n\n                return CTRGladman;\n            }());\n\n\n\n\n            return CryptoJS.mode.CTRGladman;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],65:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * Counter block mode.\n             */\n            CryptoJS.mode.CTR = (function () {\n                var CTR = CryptoJS.lib.BlockCipherMode.extend();\n\n                var Encryptor = CTR.Encryptor = CTR.extend({\n                    processBlock: function (words, offset) {\n                        // Shortcuts\n                        var cipher = this._cipher\n                        var blockSize = cipher.blockSize;\n                        var iv = this._iv;\n                        var counter = this._counter;\n\n                        // Generate keystream\n                        if (iv) {\n                            counter = this._counter = iv.slice(0);\n\n                            // Remove IV for subsequent blocks\n                            this._iv = undefined;\n                        }\n                        var keystream = counter.slice(0);\n                        cipher.encryptBlock(keystream, 0);\n\n                        // Increment counter\n                        counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0\n\n                        // Encrypt\n                        for (var i = 0; i < blockSize; i++) {\n                            words[offset + i] ^= keystream[i];\n                        }\n                    }\n                });\n\n                CTR.Decryptor = Encryptor;\n\n                return CTR;\n            }());\n\n\n            return CryptoJS.mode.CTR;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],66:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * Electronic Codebook block mode.\n             */\n            CryptoJS.mode.ECB = (function () {\n                var ECB = CryptoJS.lib.BlockCipherMode.extend();\n\n                ECB.Encryptor = ECB.extend({\n                    processBlock: function (words, offset) {\n                        this._cipher.encryptBlock(words, offset);\n                    }\n                });\n\n                ECB.Decryptor = ECB.extend({\n                    processBlock: function (words, offset) {\n                        this._cipher.decryptBlock(words, offset);\n                    }\n                });\n\n                return ECB;\n            }());\n\n\n            return CryptoJS.mode.ECB;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],67:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * Output Feedback block mode.\n             */\n            CryptoJS.mode.OFB = (function () {\n                var OFB = CryptoJS.lib.BlockCipherMode.extend();\n\n                var Encryptor = OFB.Encryptor = OFB.extend({\n                    processBlock: function (words, offset) {\n                        // Shortcuts\n                        var cipher = this._cipher\n                        var blockSize = cipher.blockSize;\n                        var iv = this._iv;\n                        var keystream = this._keystream;\n\n                        // Generate keystream\n                        if (iv) {\n                            keystream = this._keystream = iv.slice(0);\n\n                            // Remove IV for subsequent blocks\n                            this._iv = undefined;\n                        }\n                        cipher.encryptBlock(keystream, 0);\n\n                        // Encrypt\n                        for (var i = 0; i < blockSize; i++) {\n                            words[offset + i] ^= keystream[i];\n                        }\n                    }\n                });\n\n                OFB.Decryptor = Encryptor;\n\n                return OFB;\n            }());\n\n\n            return CryptoJS.mode.OFB;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],68:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * ANSI X.923 padding strategy.\n             */\n            CryptoJS.pad.AnsiX923 = {\n                pad: function (data, blockSize) {\n                    // Shortcuts\n                    var dataSigBytes = data.sigBytes;\n                    var blockSizeBytes = blockSize * 4;\n\n                    // Count padding bytes\n                    var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;\n\n                    // Compute last byte position\n                    var lastBytePos = dataSigBytes + nPaddingBytes - 1;\n\n                    // Pad\n                    data.clamp();\n                    data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);\n                    data.sigBytes += nPaddingBytes;\n                },\n\n                unpad: function (data) {\n                    // Get number of padding bytes from last byte\n                    var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n                    // Remove padding\n                    data.sigBytes -= nPaddingBytes;\n                }\n            };\n\n\n            return CryptoJS.pad.Ansix923;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],69:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * ISO 10126 padding strategy.\n             */\n            CryptoJS.pad.Iso10126 = {\n                pad: function (data, blockSize) {\n                    // Shortcut\n                    var blockSizeBytes = blockSize * 4;\n\n                    // Count padding bytes\n                    var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n                    // Pad\n                    data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).\n                    concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));\n                },\n\n                unpad: function (data) {\n                    // Get number of padding bytes from last byte\n                    var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;\n\n                    // Remove padding\n                    data.sigBytes -= nPaddingBytes;\n                }\n            };\n\n\n            return CryptoJS.pad.Iso10126;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],70:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * ISO/IEC 9797-1 Padding Method 2.\n             */\n            CryptoJS.pad.Iso97971 = {\n                pad: function (data, blockSize) {\n                    // Add 0x80 byte\n                    data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));\n\n                    // Zero pad the rest\n                    CryptoJS.pad.ZeroPadding.pad(data, blockSize);\n                },\n\n                unpad: function (data) {\n                    // Remove zero padding\n                    CryptoJS.pad.ZeroPadding.unpad(data);\n\n                    // Remove one more byte -- the 0x80 byte\n                    data.sigBytes--;\n                }\n            };\n\n\n            return CryptoJS.pad.Iso97971;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],71:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * A noop padding strategy.\n             */\n            CryptoJS.pad.NoPadding = {\n                pad: function () {\n                },\n\n                unpad: function () {\n                }\n            };\n\n\n            return CryptoJS.pad.NoPadding;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],72:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /**\n             * Zero padding strategy.\n             */\n            CryptoJS.pad.ZeroPadding = {\n                pad: function (data, blockSize) {\n                    // Shortcut\n                    var blockSizeBytes = blockSize * 4;\n\n                    // Pad\n                    data.clamp();\n                    data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n                },\n\n                unpad: function (data) {\n                    // Shortcut\n                    var dataWords = data.words;\n\n                    // Unpad\n                    var i = data.sigBytes - 1;\n                    while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {\n                        i--;\n                    }\n                    data.sigBytes = i + 1;\n                }\n            };\n\n\n            return CryptoJS.pad.ZeroPadding;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54}],73:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./sha1\", \"./hmac\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var Base = C_lib.Base;\n                var WordArray = C_lib.WordArray;\n                var C_algo = C.algo;\n                var SHA1 = C_algo.SHA1;\n                var HMAC = C_algo.HMAC;\n\n                /**\n                 * Password-Based Key Derivation Function 2 algorithm.\n                 */\n                var PBKDF2 = C_algo.PBKDF2 = Base.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)\n                     * @property {Hasher} hasher The hasher to use. Default: SHA1\n                     * @property {number} iterations The number of iterations to perform. Default: 1\n                     */\n                    cfg: Base.extend({\n                        keySize: 128/32,\n                        hasher: SHA1,\n                        iterations: 1\n                    }),\n\n                    /**\n                     * Initializes a newly created key derivation function.\n                     *\n                     * @param {Object} cfg (Optional) The configuration options to use for the derivation.\n                     *\n                     * @example\n                     *\n                     *     var kdf = CryptoJS.algo.PBKDF2.create();\n                     *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });\n                     *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });\n                     */\n                    init: function (cfg) {\n                        this.cfg = this.cfg.extend(cfg);\n                    },\n\n                    /**\n                     * Computes the Password-Based Key Derivation Function 2.\n                     *\n                     * @param {WordArray|string} password The password.\n                     * @param {WordArray|string} salt A salt.\n                     *\n                     * @return {WordArray} The derived key.\n                     *\n                     * @example\n                     *\n                     *     var key = kdf.compute(password, salt);\n                     */\n                    compute: function (password, salt) {\n                        // Shortcut\n                        var cfg = this.cfg;\n\n                        // Init HMAC\n                        var hmac = HMAC.create(cfg.hasher, password);\n\n                        // Initial values\n                        var derivedKey = WordArray.create();\n                        var blockIndex = WordArray.create([0x00000001]);\n\n                        // Shortcuts\n                        var derivedKeyWords = derivedKey.words;\n                        var blockIndexWords = blockIndex.words;\n                        var keySize = cfg.keySize;\n                        var iterations = cfg.iterations;\n\n                        // Generate key\n                        while (derivedKeyWords.length < keySize) {\n                            var block = hmac.update(salt).finalize(blockIndex);\n                            hmac.reset();\n\n                            // Shortcuts\n                            var blockWords = block.words;\n                            var blockWordsLength = blockWords.length;\n\n                            // Iterations\n                            var intermediate = block;\n                            for (var i = 1; i < iterations; i++) {\n                                intermediate = hmac.finalize(intermediate);\n                                hmac.reset();\n\n                                // Shortcut\n                                var intermediateWords = intermediate.words;\n\n                                // XOR intermediate with block\n                                for (var j = 0; j < blockWordsLength; j++) {\n                                    blockWords[j] ^= intermediateWords[j];\n                                }\n                            }\n\n                            derivedKey.concat(block);\n                            blockIndexWords[0]++;\n                        }\n                        derivedKey.sigBytes = keySize * 4;\n\n                        return derivedKey;\n                    }\n                });\n\n                /**\n                 * Computes the Password-Based Key Derivation Function 2.\n                 *\n                 * @param {WordArray|string} password The password.\n                 * @param {WordArray|string} salt A salt.\n                 * @param {Object} cfg (Optional) The configuration options to use for this computation.\n                 *\n                 * @return {WordArray} The derived key.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var key = CryptoJS.PBKDF2(password, salt);\n                 *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });\n                 *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });\n                 */\n                C.PBKDF2 = function (password, salt, cfg) {\n                    return PBKDF2.create(cfg).compute(password, salt);\n                };\n            }());\n\n\n            return CryptoJS.PBKDF2;\n\n        }));\n    },{\"./core\":54,\"./hmac\":59,\"./sha1\":78}],74:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var StreamCipher = C_lib.StreamCipher;\n                var C_algo = C.algo;\n\n                // Reusable objects\n                var S  = [];\n                var C_ = [];\n                var G  = [];\n\n                /**\n                 * Rabbit stream cipher algorithm.\n                 *\n                 * This is a legacy version that neglected to convert the key to little-endian.\n                 * This error doesn't affect the cipher's security,\n                 * but it does affect its compatibility with other implementations.\n                 */\n                var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({\n                    _doReset: function () {\n                        // Shortcuts\n                        var K = this._key.words;\n                        var iv = this.cfg.iv;\n\n                        // Generate initial state values\n                        var X = this._X = [\n                            K[0], (K[3] << 16) | (K[2] >>> 16),\n                            K[1], (K[0] << 16) | (K[3] >>> 16),\n                            K[2], (K[1] << 16) | (K[0] >>> 16),\n                            K[3], (K[2] << 16) | (K[1] >>> 16)\n                        ];\n\n                        // Generate initial counter values\n                        var C = this._C = [\n                            (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n                            (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n                            (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n                            (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n                        ];\n\n                        // Carry bit\n                        this._b = 0;\n\n                        // Iterate the system four times\n                        for (var i = 0; i < 4; i++) {\n                            nextState.call(this);\n                        }\n\n                        // Modify the counters\n                        for (var i = 0; i < 8; i++) {\n                            C[i] ^= X[(i + 4) & 7];\n                        }\n\n                        // IV setup\n                        if (iv) {\n                            // Shortcuts\n                            var IV = iv.words;\n                            var IV_0 = IV[0];\n                            var IV_1 = IV[1];\n\n                            // Generate four subvectors\n                            var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n                            var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n                            var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n                            var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n                            // Modify counter values\n                            C[0] ^= i0;\n                            C[1] ^= i1;\n                            C[2] ^= i2;\n                            C[3] ^= i3;\n                            C[4] ^= i0;\n                            C[5] ^= i1;\n                            C[6] ^= i2;\n                            C[7] ^= i3;\n\n                            // Iterate the system four times\n                            for (var i = 0; i < 4; i++) {\n                                nextState.call(this);\n                            }\n                        }\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        // Shortcut\n                        var X = this._X;\n\n                        // Iterate the system\n                        nextState.call(this);\n\n                        // Generate four keystream words\n                        S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n                        S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n                        S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n                        S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n                        for (var i = 0; i < 4; i++) {\n                            // Swap endian\n                            S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n                                (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n                            // Encrypt\n                            M[offset + i] ^= S[i];\n                        }\n                    },\n\n                    blockSize: 128/32,\n\n                    ivSize: 64/32\n                });\n\n                function nextState() {\n                    // Shortcuts\n                    var X = this._X;\n                    var C = this._C;\n\n                    // Save old counter values\n                    for (var i = 0; i < 8; i++) {\n                        C_[i] = C[i];\n                    }\n\n                    // Calculate new counter values\n                    C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n                    C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n                    C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n                    C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n                    C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n                    C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n                    C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n                    C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n                    this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n                    // Calculate the g-values\n                    for (var i = 0; i < 8; i++) {\n                        var gx = X[i] + C[i];\n\n                        // Construct high and low argument for squaring\n                        var ga = gx & 0xffff;\n                        var gb = gx >>> 16;\n\n                        // Calculate high and low result of squaring\n                        var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n                        var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n                        // High XOR low\n                        G[i] = gh ^ gl;\n                    }\n\n                    // Calculate new state values\n                    X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n                    X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n                    X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n                    X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n                    X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n                    X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n                    X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n                    X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n                }\n\n                /**\n                 * Shortcut functions to the cipher's object interface.\n                 *\n                 * @example\n                 *\n                 *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);\n                 *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);\n                 */\n                C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);\n            }());\n\n\n            return CryptoJS.RabbitLegacy;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54,\"./enc-base64\":55,\"./evpkdf\":57,\"./md5\":62}],75:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var StreamCipher = C_lib.StreamCipher;\n                var C_algo = C.algo;\n\n                // Reusable objects\n                var S  = [];\n                var C_ = [];\n                var G  = [];\n\n                /**\n                 * Rabbit stream cipher algorithm\n                 */\n                var Rabbit = C_algo.Rabbit = StreamCipher.extend({\n                    _doReset: function () {\n                        // Shortcuts\n                        var K = this._key.words;\n                        var iv = this.cfg.iv;\n\n                        // Swap endian\n                        for (var i = 0; i < 4; i++) {\n                            K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |\n                                (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);\n                        }\n\n                        // Generate initial state values\n                        var X = this._X = [\n                            K[0], (K[3] << 16) | (K[2] >>> 16),\n                            K[1], (K[0] << 16) | (K[3] >>> 16),\n                            K[2], (K[1] << 16) | (K[0] >>> 16),\n                            K[3], (K[2] << 16) | (K[1] >>> 16)\n                        ];\n\n                        // Generate initial counter values\n                        var C = this._C = [\n                            (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),\n                            (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),\n                            (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),\n                            (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)\n                        ];\n\n                        // Carry bit\n                        this._b = 0;\n\n                        // Iterate the system four times\n                        for (var i = 0; i < 4; i++) {\n                            nextState.call(this);\n                        }\n\n                        // Modify the counters\n                        for (var i = 0; i < 8; i++) {\n                            C[i] ^= X[(i + 4) & 7];\n                        }\n\n                        // IV setup\n                        if (iv) {\n                            // Shortcuts\n                            var IV = iv.words;\n                            var IV_0 = IV[0];\n                            var IV_1 = IV[1];\n\n                            // Generate four subvectors\n                            var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);\n                            var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);\n                            var i1 = (i0 >>> 16) | (i2 & 0xffff0000);\n                            var i3 = (i2 << 16)  | (i0 & 0x0000ffff);\n\n                            // Modify counter values\n                            C[0] ^= i0;\n                            C[1] ^= i1;\n                            C[2] ^= i2;\n                            C[3] ^= i3;\n                            C[4] ^= i0;\n                            C[5] ^= i1;\n                            C[6] ^= i2;\n                            C[7] ^= i3;\n\n                            // Iterate the system four times\n                            for (var i = 0; i < 4; i++) {\n                                nextState.call(this);\n                            }\n                        }\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        // Shortcut\n                        var X = this._X;\n\n                        // Iterate the system\n                        nextState.call(this);\n\n                        // Generate four keystream words\n                        S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);\n                        S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);\n                        S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);\n                        S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);\n\n                        for (var i = 0; i < 4; i++) {\n                            // Swap endian\n                            S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |\n                                (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);\n\n                            // Encrypt\n                            M[offset + i] ^= S[i];\n                        }\n                    },\n\n                    blockSize: 128/32,\n\n                    ivSize: 64/32\n                });\n\n                function nextState() {\n                    // Shortcuts\n                    var X = this._X;\n                    var C = this._C;\n\n                    // Save old counter values\n                    for (var i = 0; i < 8; i++) {\n                        C_[i] = C[i];\n                    }\n\n                    // Calculate new counter values\n                    C[0] = (C[0] + 0x4d34d34d + this._b) | 0;\n                    C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;\n                    C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;\n                    C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;\n                    C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;\n                    C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;\n                    C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;\n                    C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;\n                    this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;\n\n                    // Calculate the g-values\n                    for (var i = 0; i < 8; i++) {\n                        var gx = X[i] + C[i];\n\n                        // Construct high and low argument for squaring\n                        var ga = gx & 0xffff;\n                        var gb = gx >>> 16;\n\n                        // Calculate high and low result of squaring\n                        var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;\n                        var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);\n\n                        // High XOR low\n                        G[i] = gh ^ gl;\n                    }\n\n                    // Calculate new state values\n                    X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;\n                    X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;\n                    X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;\n                    X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;\n                    X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;\n                    X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;\n                    X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;\n                    X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;\n                }\n\n                /**\n                 * Shortcut functions to the cipher's object interface.\n                 *\n                 * @example\n                 *\n                 *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);\n                 *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);\n                 */\n                C.Rabbit = StreamCipher._createHelper(Rabbit);\n            }());\n\n\n            return CryptoJS.Rabbit;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54,\"./enc-base64\":55,\"./evpkdf\":57,\"./md5\":62}],76:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var StreamCipher = C_lib.StreamCipher;\n                var C_algo = C.algo;\n\n                /**\n                 * RC4 stream cipher algorithm.\n                 */\n                var RC4 = C_algo.RC4 = StreamCipher.extend({\n                    _doReset: function () {\n                        // Shortcuts\n                        var key = this._key;\n                        var keyWords = key.words;\n                        var keySigBytes = key.sigBytes;\n\n                        // Init sbox\n                        var S = this._S = [];\n                        for (var i = 0; i < 256; i++) {\n                            S[i] = i;\n                        }\n\n                        // Key setup\n                        for (var i = 0, j = 0; i < 256; i++) {\n                            var keyByteIndex = i % keySigBytes;\n                            var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\n\n                            j = (j + S[i] + keyByte) % 256;\n\n                            // Swap\n                            var t = S[i];\n                            S[i] = S[j];\n                            S[j] = t;\n                        }\n\n                        // Counters\n                        this._i = this._j = 0;\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        M[offset] ^= generateKeystreamWord.call(this);\n                    },\n\n                    keySize: 256/32,\n\n                    ivSize: 0\n                });\n\n                function generateKeystreamWord() {\n                    // Shortcuts\n                    var S = this._S;\n                    var i = this._i;\n                    var j = this._j;\n\n                    // Generate keystream word\n                    var keystreamWord = 0;\n                    for (var n = 0; n < 4; n++) {\n                        i = (i + 1) % 256;\n                        j = (j + S[i]) % 256;\n\n                        // Swap\n                        var t = S[i];\n                        S[i] = S[j];\n                        S[j] = t;\n\n                        keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\n                    }\n\n                    // Update counters\n                    this._i = i;\n                    this._j = j;\n\n                    return keystreamWord;\n                }\n\n                /**\n                 * Shortcut functions to the cipher's object interface.\n                 *\n                 * @example\n                 *\n                 *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\n                 *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\n                 */\n                C.RC4 = StreamCipher._createHelper(RC4);\n\n                /**\n                 * Modified RC4 stream cipher algorithm.\n                 */\n                var RC4Drop = C_algo.RC4Drop = RC4.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {number} drop The number of keystream words to drop. Default 192\n                     */\n                    cfg: RC4.cfg.extend({\n                        drop: 192\n                    }),\n\n                    _doReset: function () {\n                        RC4._doReset.call(this);\n\n                        // Drop\n                        for (var i = this.cfg.drop; i > 0; i--) {\n                            generateKeystreamWord.call(this);\n                        }\n                    }\n                });\n\n                /**\n                 * Shortcut functions to the cipher's object interface.\n                 *\n                 * @example\n                 *\n                 *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\n                 *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\n                 */\n                C.RC4Drop = StreamCipher._createHelper(RC4Drop);\n            }());\n\n\n            return CryptoJS.RC4;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54,\"./enc-base64\":55,\"./evpkdf\":57,\"./md5\":62}],77:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            /** @preserve\n             (c) 2012 by Cédric Mesnil. All rights reserved.\n\n             Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n             - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n             - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n             THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n             */\n\n            (function (Math) {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var Hasher = C_lib.Hasher;\n                var C_algo = C.algo;\n\n                // Constants table\n                var _zl = WordArray.create([\n                    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\n                    7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,\n                    3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,\n                    1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,\n                    4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);\n                var _zr = WordArray.create([\n                    5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,\n                    6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,\n                    15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,\n                    8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,\n                    12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);\n                var _sl = WordArray.create([\n                    11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,\n                    7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,\n                    11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,\n                    11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,\n                    9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);\n                var _sr = WordArray.create([\n                    8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,\n                    9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,\n                    9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,\n                    15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,\n                    8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);\n\n                var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);\n                var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);\n\n                /**\n                 * RIPEMD160 hash algorithm.\n                 */\n                var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({\n                    _doReset: function () {\n                        this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n\n                        // Swap endian\n                        for (var i = 0; i < 16; i++) {\n                            // Shortcuts\n                            var offset_i = offset + i;\n                            var M_offset_i = M[offset_i];\n\n                            // Swap\n                            M[offset_i] = (\n                                (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |\n                                (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)\n                            );\n                        }\n                        // Shortcut\n                        var H  = this._hash.words;\n                        var hl = _hl.words;\n                        var hr = _hr.words;\n                        var zl = _zl.words;\n                        var zr = _zr.words;\n                        var sl = _sl.words;\n                        var sr = _sr.words;\n\n                        // Working variables\n                        var al, bl, cl, dl, el;\n                        var ar, br, cr, dr, er;\n\n                        ar = al = H[0];\n                        br = bl = H[1];\n                        cr = cl = H[2];\n                        dr = dl = H[3];\n                        er = el = H[4];\n                        // Computation\n                        var t;\n                        for (var i = 0; i < 80; i += 1) {\n                            t = (al +  M[offset+zl[i]])|0;\n                            if (i<16){\n                                t +=  f1(bl,cl,dl) + hl[0];\n                            } else if (i<32) {\n                                t +=  f2(bl,cl,dl) + hl[1];\n                            } else if (i<48) {\n                                t +=  f3(bl,cl,dl) + hl[2];\n                            } else if (i<64) {\n                                t +=  f4(bl,cl,dl) + hl[3];\n                            } else {// if (i<80) {\n                                t +=  f5(bl,cl,dl) + hl[4];\n                            }\n                            t = t|0;\n                            t =  rotl(t,sl[i]);\n                            t = (t+el)|0;\n                            al = el;\n                            el = dl;\n                            dl = rotl(cl, 10);\n                            cl = bl;\n                            bl = t;\n\n                            t = (ar + M[offset+zr[i]])|0;\n                            if (i<16){\n                                t +=  f5(br,cr,dr) + hr[0];\n                            } else if (i<32) {\n                                t +=  f4(br,cr,dr) + hr[1];\n                            } else if (i<48) {\n                                t +=  f3(br,cr,dr) + hr[2];\n                            } else if (i<64) {\n                                t +=  f2(br,cr,dr) + hr[3];\n                            } else {// if (i<80) {\n                                t +=  f1(br,cr,dr) + hr[4];\n                            }\n                            t = t|0;\n                            t =  rotl(t,sr[i]) ;\n                            t = (t+er)|0;\n                            ar = er;\n                            er = dr;\n                            dr = rotl(cr, 10);\n                            cr = br;\n                            br = t;\n                        }\n                        // Intermediate hash value\n                        t    = (H[1] + cl + dr)|0;\n                        H[1] = (H[2] + dl + er)|0;\n                        H[2] = (H[3] + el + ar)|0;\n                        H[3] = (H[4] + al + br)|0;\n                        H[4] = (H[0] + bl + cr)|0;\n                        H[0] =  t;\n                    },\n\n                    _doFinalize: function () {\n                        // Shortcuts\n                        var data = this._data;\n                        var dataWords = data.words;\n\n                        var nBitsTotal = this._nDataBytes * 8;\n                        var nBitsLeft = data.sigBytes * 8;\n\n                        // Add padding\n                        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n                        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (\n                            (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |\n                            (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)\n                        );\n                        data.sigBytes = (dataWords.length + 1) * 4;\n\n                        // Hash final blocks\n                        this._process();\n\n                        // Shortcuts\n                        var hash = this._hash;\n                        var H = hash.words;\n\n                        // Swap endian\n                        for (var i = 0; i < 5; i++) {\n                            // Shortcut\n                            var H_i = H[i];\n\n                            // Swap\n                            H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |\n                                (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);\n                        }\n\n                        // Return final computed hash\n                        return hash;\n                    },\n\n                    clone: function () {\n                        var clone = Hasher.clone.call(this);\n                        clone._hash = this._hash.clone();\n\n                        return clone;\n                    }\n                });\n\n\n                function f1(x, y, z) {\n                    return ((x) ^ (y) ^ (z));\n\n                }\n\n                function f2(x, y, z) {\n                    return (((x)&(y)) | ((~x)&(z)));\n                }\n\n                function f3(x, y, z) {\n                    return (((x) | (~(y))) ^ (z));\n                }\n\n                function f4(x, y, z) {\n                    return (((x) & (z)) | ((y)&(~(z))));\n                }\n\n                function f5(x, y, z) {\n                    return ((x) ^ ((y) |(~(z))));\n\n                }\n\n                function rotl(x,n) {\n                    return (x<<n) | (x>>>(32-n));\n                }\n\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.RIPEMD160('message');\n                 *     var hash = CryptoJS.RIPEMD160(wordArray);\n                 */\n                C.RIPEMD160 = Hasher._createHelper(RIPEMD160);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacRIPEMD160(message, key);\n                 */\n                C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);\n            }(Math));\n\n\n            return CryptoJS.RIPEMD160;\n\n        }));\n    },{\"./core\":54}],78:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var Hasher = C_lib.Hasher;\n                var C_algo = C.algo;\n\n                // Reusable object\n                var W = [];\n\n                /**\n                 * SHA-1 hash algorithm.\n                 */\n                var SHA1 = C_algo.SHA1 = Hasher.extend({\n                    _doReset: function () {\n                        this._hash = new WordArray.init([\n                            0x67452301, 0xefcdab89,\n                            0x98badcfe, 0x10325476,\n                            0xc3d2e1f0\n                        ]);\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        // Shortcut\n                        var H = this._hash.words;\n\n                        // Working variables\n                        var a = H[0];\n                        var b = H[1];\n                        var c = H[2];\n                        var d = H[3];\n                        var e = H[4];\n\n                        // Computation\n                        for (var i = 0; i < 80; i++) {\n                            if (i < 16) {\n                                W[i] = M[offset + i] | 0;\n                            } else {\n                                var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n                                W[i] = (n << 1) | (n >>> 31);\n                            }\n\n                            var t = ((a << 5) | (a >>> 27)) + e + W[i];\n                            if (i < 20) {\n                                t += ((b & c) | (~b & d)) + 0x5a827999;\n                            } else if (i < 40) {\n                                t += (b ^ c ^ d) + 0x6ed9eba1;\n                            } else if (i < 60) {\n                                t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n                            } else /* if (i < 80) */ {\n                                t += (b ^ c ^ d) - 0x359d3e2a;\n                            }\n\n                            e = d;\n                            d = c;\n                            c = (b << 30) | (b >>> 2);\n                            b = a;\n                            a = t;\n                        }\n\n                        // Intermediate hash value\n                        H[0] = (H[0] + a) | 0;\n                        H[1] = (H[1] + b) | 0;\n                        H[2] = (H[2] + c) | 0;\n                        H[3] = (H[3] + d) | 0;\n                        H[4] = (H[4] + e) | 0;\n                    },\n\n                    _doFinalize: function () {\n                        // Shortcuts\n                        var data = this._data;\n                        var dataWords = data.words;\n\n                        var nBitsTotal = this._nDataBytes * 8;\n                        var nBitsLeft = data.sigBytes * 8;\n\n                        // Add padding\n                        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n                        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n                        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n                        data.sigBytes = dataWords.length * 4;\n\n                        // Hash final blocks\n                        this._process();\n\n                        // Return final computed hash\n                        return this._hash;\n                    },\n\n                    clone: function () {\n                        var clone = Hasher.clone.call(this);\n                        clone._hash = this._hash.clone();\n\n                        return clone;\n                    }\n                });\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.SHA1('message');\n                 *     var hash = CryptoJS.SHA1(wordArray);\n                 */\n                C.SHA1 = Hasher._createHelper(SHA1);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacSHA1(message, key);\n                 */\n                C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n            }());\n\n\n            return CryptoJS.SHA1;\n\n        }));\n    },{\"./core\":54}],79:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./sha256\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./sha256\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var C_algo = C.algo;\n                var SHA256 = C_algo.SHA256;\n\n                /**\n                 * SHA-224 hash algorithm.\n                 */\n                var SHA224 = C_algo.SHA224 = SHA256.extend({\n                    _doReset: function () {\n                        this._hash = new WordArray.init([\n                            0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,\n                            0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4\n                        ]);\n                    },\n\n                    _doFinalize: function () {\n                        var hash = SHA256._doFinalize.call(this);\n\n                        hash.sigBytes -= 4;\n\n                        return hash;\n                    }\n                });\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.SHA224('message');\n                 *     var hash = CryptoJS.SHA224(wordArray);\n                 */\n                C.SHA224 = SHA256._createHelper(SHA224);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacSHA224(message, key);\n                 */\n                C.HmacSHA224 = SHA256._createHmacHelper(SHA224);\n            }());\n\n\n            return CryptoJS.SHA224;\n\n        }));\n    },{\"./core\":54,\"./sha256\":80}],80:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function (Math) {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var Hasher = C_lib.Hasher;\n                var C_algo = C.algo;\n\n                // Initialization and round constants tables\n                var H = [];\n                var K = [];\n\n                // Compute constants\n                (function () {\n                    function isPrime(n) {\n                        var sqrtN = Math.sqrt(n);\n                        for (var factor = 2; factor <= sqrtN; factor++) {\n                            if (!(n % factor)) {\n                                return false;\n                            }\n                        }\n\n                        return true;\n                    }\n\n                    function getFractionalBits(n) {\n                        return ((n - (n | 0)) * 0x100000000) | 0;\n                    }\n\n                    var n = 2;\n                    var nPrime = 0;\n                    while (nPrime < 64) {\n                        if (isPrime(n)) {\n                            if (nPrime < 8) {\n                                H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n                            }\n                            K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n                            nPrime++;\n                        }\n\n                        n++;\n                    }\n                }());\n\n                // Reusable object\n                var W = [];\n\n                /**\n                 * SHA-256 hash algorithm.\n                 */\n                var SHA256 = C_algo.SHA256 = Hasher.extend({\n                    _doReset: function () {\n                        this._hash = new WordArray.init(H.slice(0));\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        // Shortcut\n                        var H = this._hash.words;\n\n                        // Working variables\n                        var a = H[0];\n                        var b = H[1];\n                        var c = H[2];\n                        var d = H[3];\n                        var e = H[4];\n                        var f = H[5];\n                        var g = H[6];\n                        var h = H[7];\n\n                        // Computation\n                        for (var i = 0; i < 64; i++) {\n                            if (i < 16) {\n                                W[i] = M[offset + i] | 0;\n                            } else {\n                                var gamma0x = W[i - 15];\n                                var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n                                    ((gamma0x << 14) | (gamma0x >>> 18)) ^\n                                    (gamma0x >>> 3);\n\n                                var gamma1x = W[i - 2];\n                                var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n                                    ((gamma1x << 13) | (gamma1x >>> 19)) ^\n                                    (gamma1x >>> 10);\n\n                                W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n                            }\n\n                            var ch  = (e & f) ^ (~e & g);\n                            var maj = (a & b) ^ (a & c) ^ (b & c);\n\n                            var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n                            var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n                            var t1 = h + sigma1 + ch + K[i] + W[i];\n                            var t2 = sigma0 + maj;\n\n                            h = g;\n                            g = f;\n                            f = e;\n                            e = (d + t1) | 0;\n                            d = c;\n                            c = b;\n                            b = a;\n                            a = (t1 + t2) | 0;\n                        }\n\n                        // Intermediate hash value\n                        H[0] = (H[0] + a) | 0;\n                        H[1] = (H[1] + b) | 0;\n                        H[2] = (H[2] + c) | 0;\n                        H[3] = (H[3] + d) | 0;\n                        H[4] = (H[4] + e) | 0;\n                        H[5] = (H[5] + f) | 0;\n                        H[6] = (H[6] + g) | 0;\n                        H[7] = (H[7] + h) | 0;\n                    },\n\n                    _doFinalize: function () {\n                        // Shortcuts\n                        var data = this._data;\n                        var dataWords = data.words;\n\n                        var nBitsTotal = this._nDataBytes * 8;\n                        var nBitsLeft = data.sigBytes * 8;\n\n                        // Add padding\n                        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n                        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n                        dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n                        data.sigBytes = dataWords.length * 4;\n\n                        // Hash final blocks\n                        this._process();\n\n                        // Return final computed hash\n                        return this._hash;\n                    },\n\n                    clone: function () {\n                        var clone = Hasher.clone.call(this);\n                        clone._hash = this._hash.clone();\n\n                        return clone;\n                    }\n                });\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.SHA256('message');\n                 *     var hash = CryptoJS.SHA256(wordArray);\n                 */\n                C.SHA256 = Hasher._createHelper(SHA256);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacSHA256(message, key);\n                 */\n                C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n            }(Math));\n\n\n            return CryptoJS.SHA256;\n\n        }));\n    },{\"./core\":54}],81:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./x64-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function (Math) {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var Hasher = C_lib.Hasher;\n                var C_x64 = C.x64;\n                var X64Word = C_x64.Word;\n                var C_algo = C.algo;\n\n                // Constants tables\n                var RHO_OFFSETS = [];\n                var PI_INDEXES  = [];\n                var ROUND_CONSTANTS = [];\n\n                // Compute Constants\n                (function () {\n                    // Compute rho offset constants\n                    var x = 1, y = 0;\n                    for (var t = 0; t < 24; t++) {\n                        RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;\n\n                        var newX = y % 5;\n                        var newY = (2 * x + 3 * y) % 5;\n                        x = newX;\n                        y = newY;\n                    }\n\n                    // Compute pi index constants\n                    for (var x = 0; x < 5; x++) {\n                        for (var y = 0; y < 5; y++) {\n                            PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;\n                        }\n                    }\n\n                    // Compute round constants\n                    var LFSR = 0x01;\n                    for (var i = 0; i < 24; i++) {\n                        var roundConstantMsw = 0;\n                        var roundConstantLsw = 0;\n\n                        for (var j = 0; j < 7; j++) {\n                            if (LFSR & 0x01) {\n                                var bitPosition = (1 << j) - 1;\n                                if (bitPosition < 32) {\n                                    roundConstantLsw ^= 1 << bitPosition;\n                                } else /* if (bitPosition >= 32) */ {\n                                    roundConstantMsw ^= 1 << (bitPosition - 32);\n                                }\n                            }\n\n                            // Compute next LFSR\n                            if (LFSR & 0x80) {\n                                // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1\n                                LFSR = (LFSR << 1) ^ 0x71;\n                            } else {\n                                LFSR <<= 1;\n                            }\n                        }\n\n                        ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);\n                    }\n                }());\n\n                // Reusable objects for temporary values\n                var T = [];\n                (function () {\n                    for (var i = 0; i < 25; i++) {\n                        T[i] = X64Word.create();\n                    }\n                }());\n\n                /**\n                 * SHA-3 hash algorithm.\n                 */\n                var SHA3 = C_algo.SHA3 = Hasher.extend({\n                    /**\n                     * Configuration options.\n                     *\n                     * @property {number} outputLength\n                     *   The desired number of bits in the output hash.\n                     *   Only values permitted are: 224, 256, 384, 512.\n                     *   Default: 512\n                     */\n                    cfg: Hasher.cfg.extend({\n                        outputLength: 512\n                    }),\n\n                    _doReset: function () {\n                        var state = this._state = []\n                        for (var i = 0; i < 25; i++) {\n                            state[i] = new X64Word.init();\n                        }\n\n                        this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        // Shortcuts\n                        var state = this._state;\n                        var nBlockSizeLanes = this.blockSize / 2;\n\n                        // Absorb\n                        for (var i = 0; i < nBlockSizeLanes; i++) {\n                            // Shortcuts\n                            var M2i  = M[offset + 2 * i];\n                            var M2i1 = M[offset + 2 * i + 1];\n\n                            // Swap endian\n                            M2i = (\n                                (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |\n                                (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)\n                            );\n                            M2i1 = (\n                                (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |\n                                (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)\n                            );\n\n                            // Absorb message into state\n                            var lane = state[i];\n                            lane.high ^= M2i1;\n                            lane.low  ^= M2i;\n                        }\n\n                        // Rounds\n                        for (var round = 0; round < 24; round++) {\n                            // Theta\n                            for (var x = 0; x < 5; x++) {\n                                // Mix column lanes\n                                var tMsw = 0, tLsw = 0;\n                                for (var y = 0; y < 5; y++) {\n                                    var lane = state[x + 5 * y];\n                                    tMsw ^= lane.high;\n                                    tLsw ^= lane.low;\n                                }\n\n                                // Temporary values\n                                var Tx = T[x];\n                                Tx.high = tMsw;\n                                Tx.low  = tLsw;\n                            }\n                            for (var x = 0; x < 5; x++) {\n                                // Shortcuts\n                                var Tx4 = T[(x + 4) % 5];\n                                var Tx1 = T[(x + 1) % 5];\n                                var Tx1Msw = Tx1.high;\n                                var Tx1Lsw = Tx1.low;\n\n                                // Mix surrounding columns\n                                var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));\n                                var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));\n                                for (var y = 0; y < 5; y++) {\n                                    var lane = state[x + 5 * y];\n                                    lane.high ^= tMsw;\n                                    lane.low  ^= tLsw;\n                                }\n                            }\n\n                            // Rho Pi\n                            for (var laneIndex = 1; laneIndex < 25; laneIndex++) {\n                                // Shortcuts\n                                var lane = state[laneIndex];\n                                var laneMsw = lane.high;\n                                var laneLsw = lane.low;\n                                var rhoOffset = RHO_OFFSETS[laneIndex];\n\n                                // Rotate lanes\n                                if (rhoOffset < 32) {\n                                    var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));\n                                    var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));\n                                } else /* if (rhoOffset >= 32) */ {\n                                    var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));\n                                    var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));\n                                }\n\n                                // Transpose lanes\n                                var TPiLane = T[PI_INDEXES[laneIndex]];\n                                TPiLane.high = tMsw;\n                                TPiLane.low  = tLsw;\n                            }\n\n                            // Rho pi at x = y = 0\n                            var T0 = T[0];\n                            var state0 = state[0];\n                            T0.high = state0.high;\n                            T0.low  = state0.low;\n\n                            // Chi\n                            for (var x = 0; x < 5; x++) {\n                                for (var y = 0; y < 5; y++) {\n                                    // Shortcuts\n                                    var laneIndex = x + 5 * y;\n                                    var lane = state[laneIndex];\n                                    var TLane = T[laneIndex];\n                                    var Tx1Lane = T[((x + 1) % 5) + 5 * y];\n                                    var Tx2Lane = T[((x + 2) % 5) + 5 * y];\n\n                                    // Mix rows\n                                    lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);\n                                    lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);\n                                }\n                            }\n\n                            // Iota\n                            var lane = state[0];\n                            var roundConstant = ROUND_CONSTANTS[round];\n                            lane.high ^= roundConstant.high;\n                            lane.low  ^= roundConstant.low;;\n                        }\n                    },\n\n                    _doFinalize: function () {\n                        // Shortcuts\n                        var data = this._data;\n                        var dataWords = data.words;\n                        var nBitsTotal = this._nDataBytes * 8;\n                        var nBitsLeft = data.sigBytes * 8;\n                        var blockSizeBits = this.blockSize * 32;\n\n                        // Add padding\n                        dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);\n                        dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;\n                        data.sigBytes = dataWords.length * 4;\n\n                        // Hash final blocks\n                        this._process();\n\n                        // Shortcuts\n                        var state = this._state;\n                        var outputLengthBytes = this.cfg.outputLength / 8;\n                        var outputLengthLanes = outputLengthBytes / 8;\n\n                        // Squeeze\n                        var hashWords = [];\n                        for (var i = 0; i < outputLengthLanes; i++) {\n                            // Shortcuts\n                            var lane = state[i];\n                            var laneMsw = lane.high;\n                            var laneLsw = lane.low;\n\n                            // Swap endian\n                            laneMsw = (\n                                (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |\n                                (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)\n                            );\n                            laneLsw = (\n                                (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |\n                                (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)\n                            );\n\n                            // Squeeze state to retrieve hash\n                            hashWords.push(laneLsw);\n                            hashWords.push(laneMsw);\n                        }\n\n                        // Return final computed hash\n                        return new WordArray.init(hashWords, outputLengthBytes);\n                    },\n\n                    clone: function () {\n                        var clone = Hasher.clone.call(this);\n\n                        var state = clone._state = this._state.slice(0);\n                        for (var i = 0; i < 25; i++) {\n                            state[i] = state[i].clone();\n                        }\n\n                        return clone;\n                    }\n                });\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.SHA3('message');\n                 *     var hash = CryptoJS.SHA3(wordArray);\n                 */\n                C.SHA3 = Hasher._createHelper(SHA3);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacSHA3(message, key);\n                 */\n                C.HmacSHA3 = Hasher._createHmacHelper(SHA3);\n            }(Math));\n\n\n            return CryptoJS.SHA3;\n\n        }));\n    },{\"./core\":54,\"./x64-core\":85}],82:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"), require(\"./sha512\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./x64-core\", \"./sha512\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_x64 = C.x64;\n                var X64Word = C_x64.Word;\n                var X64WordArray = C_x64.WordArray;\n                var C_algo = C.algo;\n                var SHA512 = C_algo.SHA512;\n\n                /**\n                 * SHA-384 hash algorithm.\n                 */\n                var SHA384 = C_algo.SHA384 = SHA512.extend({\n                    _doReset: function () {\n                        this._hash = new X64WordArray.init([\n                            new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),\n                            new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),\n                            new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),\n                            new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)\n                        ]);\n                    },\n\n                    _doFinalize: function () {\n                        var hash = SHA512._doFinalize.call(this);\n\n                        hash.sigBytes -= 16;\n\n                        return hash;\n                    }\n                });\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.SHA384('message');\n                 *     var hash = CryptoJS.SHA384(wordArray);\n                 */\n                C.SHA384 = SHA512._createHelper(SHA384);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacSHA384(message, key);\n                 */\n                C.HmacSHA384 = SHA512._createHmacHelper(SHA384);\n            }());\n\n\n            return CryptoJS.SHA384;\n\n        }));\n    },{\"./core\":54,\"./sha512\":83,\"./x64-core\":85}],83:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./x64-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./x64-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var Hasher = C_lib.Hasher;\n                var C_x64 = C.x64;\n                var X64Word = C_x64.Word;\n                var X64WordArray = C_x64.WordArray;\n                var C_algo = C.algo;\n\n                function X64Word_create() {\n                    return X64Word.create.apply(X64Word, arguments);\n                }\n\n                // Constants\n                var K = [\n                    X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),\n                    X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),\n                    X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),\n                    X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),\n                    X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),\n                    X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),\n                    X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),\n                    X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),\n                    X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),\n                    X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),\n                    X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),\n                    X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),\n                    X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),\n                    X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),\n                    X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),\n                    X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),\n                    X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),\n                    X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),\n                    X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),\n                    X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),\n                    X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),\n                    X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),\n                    X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),\n                    X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),\n                    X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),\n                    X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),\n                    X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),\n                    X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),\n                    X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),\n                    X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),\n                    X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),\n                    X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),\n                    X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),\n                    X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),\n                    X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),\n                    X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),\n                    X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),\n                    X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),\n                    X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),\n                    X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)\n                ];\n\n                // Reusable objects\n                var W = [];\n                (function () {\n                    for (var i = 0; i < 80; i++) {\n                        W[i] = X64Word_create();\n                    }\n                }());\n\n                /**\n                 * SHA-512 hash algorithm.\n                 */\n                var SHA512 = C_algo.SHA512 = Hasher.extend({\n                    _doReset: function () {\n                        this._hash = new X64WordArray.init([\n                            new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),\n                            new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),\n                            new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),\n                            new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)\n                        ]);\n                    },\n\n                    _doProcessBlock: function (M, offset) {\n                        // Shortcuts\n                        var H = this._hash.words;\n\n                        var H0 = H[0];\n                        var H1 = H[1];\n                        var H2 = H[2];\n                        var H3 = H[3];\n                        var H4 = H[4];\n                        var H5 = H[5];\n                        var H6 = H[6];\n                        var H7 = H[7];\n\n                        var H0h = H0.high;\n                        var H0l = H0.low;\n                        var H1h = H1.high;\n                        var H1l = H1.low;\n                        var H2h = H2.high;\n                        var H2l = H2.low;\n                        var H3h = H3.high;\n                        var H3l = H3.low;\n                        var H4h = H4.high;\n                        var H4l = H4.low;\n                        var H5h = H5.high;\n                        var H5l = H5.low;\n                        var H6h = H6.high;\n                        var H6l = H6.low;\n                        var H7h = H7.high;\n                        var H7l = H7.low;\n\n                        // Working variables\n                        var ah = H0h;\n                        var al = H0l;\n                        var bh = H1h;\n                        var bl = H1l;\n                        var ch = H2h;\n                        var cl = H2l;\n                        var dh = H3h;\n                        var dl = H3l;\n                        var eh = H4h;\n                        var el = H4l;\n                        var fh = H5h;\n                        var fl = H5l;\n                        var gh = H6h;\n                        var gl = H6l;\n                        var hh = H7h;\n                        var hl = H7l;\n\n                        // Rounds\n                        for (var i = 0; i < 80; i++) {\n                            // Shortcut\n                            var Wi = W[i];\n\n                            // Extend message\n                            if (i < 16) {\n                                var Wih = Wi.high = M[offset + i * 2]     | 0;\n                                var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;\n                            } else {\n                                // Gamma0\n                                var gamma0x  = W[i - 15];\n                                var gamma0xh = gamma0x.high;\n                                var gamma0xl = gamma0x.low;\n                                var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);\n                                var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));\n\n                                // Gamma1\n                                var gamma1x  = W[i - 2];\n                                var gamma1xh = gamma1x.high;\n                                var gamma1xl = gamma1x.low;\n                                var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);\n                                var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));\n\n                                // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]\n                                var Wi7  = W[i - 7];\n                                var Wi7h = Wi7.high;\n                                var Wi7l = Wi7.low;\n\n                                var Wi16  = W[i - 16];\n                                var Wi16h = Wi16.high;\n                                var Wi16l = Wi16.low;\n\n                                var Wil = gamma0l + Wi7l;\n                                var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);\n                                var Wil = Wil + gamma1l;\n                                var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);\n                                var Wil = Wil + Wi16l;\n                                var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);\n\n                                Wi.high = Wih;\n                                Wi.low  = Wil;\n                            }\n\n                            var chh  = (eh & fh) ^ (~eh & gh);\n                            var chl  = (el & fl) ^ (~el & gl);\n                            var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);\n                            var majl = (al & bl) ^ (al & cl) ^ (bl & cl);\n\n                            var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));\n                            var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));\n                            var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));\n                            var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));\n\n                            // t1 = h + sigma1 + ch + K[i] + W[i]\n                            var Ki  = K[i];\n                            var Kih = Ki.high;\n                            var Kil = Ki.low;\n\n                            var t1l = hl + sigma1l;\n                            var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);\n                            var t1l = t1l + chl;\n                            var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);\n                            var t1l = t1l + Kil;\n                            var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);\n                            var t1l = t1l + Wil;\n                            var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);\n\n                            // t2 = sigma0 + maj\n                            var t2l = sigma0l + majl;\n                            var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);\n\n                            // Update working variables\n                            hh = gh;\n                            hl = gl;\n                            gh = fh;\n                            gl = fl;\n                            fh = eh;\n                            fl = el;\n                            el = (dl + t1l) | 0;\n                            eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;\n                            dh = ch;\n                            dl = cl;\n                            ch = bh;\n                            cl = bl;\n                            bh = ah;\n                            bl = al;\n                            al = (t1l + t2l) | 0;\n                            ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;\n                        }\n\n                        // Intermediate hash value\n                        H0l = H0.low  = (H0l + al);\n                        H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));\n                        H1l = H1.low  = (H1l + bl);\n                        H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));\n                        H2l = H2.low  = (H2l + cl);\n                        H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));\n                        H3l = H3.low  = (H3l + dl);\n                        H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));\n                        H4l = H4.low  = (H4l + el);\n                        H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));\n                        H5l = H5.low  = (H5l + fl);\n                        H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));\n                        H6l = H6.low  = (H6l + gl);\n                        H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));\n                        H7l = H7.low  = (H7l + hl);\n                        H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));\n                    },\n\n                    _doFinalize: function () {\n                        // Shortcuts\n                        var data = this._data;\n                        var dataWords = data.words;\n\n                        var nBitsTotal = this._nDataBytes * 8;\n                        var nBitsLeft = data.sigBytes * 8;\n\n                        // Add padding\n                        dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n                        dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);\n                        dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;\n                        data.sigBytes = dataWords.length * 4;\n\n                        // Hash final blocks\n                        this._process();\n\n                        // Convert hash to 32-bit word array before returning\n                        var hash = this._hash.toX32();\n\n                        // Return final computed hash\n                        return hash;\n                    },\n\n                    clone: function () {\n                        var clone = Hasher.clone.call(this);\n                        clone._hash = this._hash.clone();\n\n                        return clone;\n                    },\n\n                    blockSize: 1024/32\n                });\n\n                /**\n                 * Shortcut function to the hasher's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 *\n                 * @return {WordArray} The hash.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hash = CryptoJS.SHA512('message');\n                 *     var hash = CryptoJS.SHA512(wordArray);\n                 */\n                C.SHA512 = Hasher._createHelper(SHA512);\n\n                /**\n                 * Shortcut function to the HMAC's object interface.\n                 *\n                 * @param {WordArray|string} message The message to hash.\n                 * @param {WordArray|string} key The secret key.\n                 *\n                 * @return {WordArray} The HMAC.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var hmac = CryptoJS.HmacSHA512(message, key);\n                 */\n                C.HmacSHA512 = Hasher._createHmacHelper(SHA512);\n            }());\n\n\n            return CryptoJS.SHA512;\n\n        }));\n    },{\"./core\":54,\"./x64-core\":85}],84:[function(require,module,exports){\n        ;(function (root, factory, undef) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"), require(\"./enc-base64\"), require(\"./md5\"), require(\"./evpkdf\"), require(\"./cipher-core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\", \"./enc-base64\", \"./md5\", \"./evpkdf\", \"./cipher-core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function () {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var WordArray = C_lib.WordArray;\n                var BlockCipher = C_lib.BlockCipher;\n                var C_algo = C.algo;\n\n                // Permuted Choice 1 constants\n                var PC1 = [\n                    57, 49, 41, 33, 25, 17, 9,  1,\n                    58, 50, 42, 34, 26, 18, 10, 2,\n                    59, 51, 43, 35, 27, 19, 11, 3,\n                    60, 52, 44, 36, 63, 55, 47, 39,\n                    31, 23, 15, 7,  62, 54, 46, 38,\n                    30, 22, 14, 6,  61, 53, 45, 37,\n                    29, 21, 13, 5,  28, 20, 12, 4\n                ];\n\n                // Permuted Choice 2 constants\n                var PC2 = [\n                    14, 17, 11, 24, 1,  5,\n                    3,  28, 15, 6,  21, 10,\n                    23, 19, 12, 4,  26, 8,\n                    16, 7,  27, 20, 13, 2,\n                    41, 52, 31, 37, 47, 55,\n                    30, 40, 51, 45, 33, 48,\n                    44, 49, 39, 56, 34, 53,\n                    46, 42, 50, 36, 29, 32\n                ];\n\n                // Cumulative bit shift constants\n                var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];\n\n                // SBOXes and round permutation constants\n                var SBOX_P = [\n                    {\n                        0x0: 0x808200,\n                        0x10000000: 0x8000,\n                        0x20000000: 0x808002,\n                        0x30000000: 0x2,\n                        0x40000000: 0x200,\n                        0x50000000: 0x808202,\n                        0x60000000: 0x800202,\n                        0x70000000: 0x800000,\n                        0x80000000: 0x202,\n                        0x90000000: 0x800200,\n                        0xa0000000: 0x8200,\n                        0xb0000000: 0x808000,\n                        0xc0000000: 0x8002,\n                        0xd0000000: 0x800002,\n                        0xe0000000: 0x0,\n                        0xf0000000: 0x8202,\n                        0x8000000: 0x0,\n                        0x18000000: 0x808202,\n                        0x28000000: 0x8202,\n                        0x38000000: 0x8000,\n                        0x48000000: 0x808200,\n                        0x58000000: 0x200,\n                        0x68000000: 0x808002,\n                        0x78000000: 0x2,\n                        0x88000000: 0x800200,\n                        0x98000000: 0x8200,\n                        0xa8000000: 0x808000,\n                        0xb8000000: 0x800202,\n                        0xc8000000: 0x800002,\n                        0xd8000000: 0x8002,\n                        0xe8000000: 0x202,\n                        0xf8000000: 0x800000,\n                        0x1: 0x8000,\n                        0x10000001: 0x2,\n                        0x20000001: 0x808200,\n                        0x30000001: 0x800000,\n                        0x40000001: 0x808002,\n                        0x50000001: 0x8200,\n                        0x60000001: 0x200,\n                        0x70000001: 0x800202,\n                        0x80000001: 0x808202,\n                        0x90000001: 0x808000,\n                        0xa0000001: 0x800002,\n                        0xb0000001: 0x8202,\n                        0xc0000001: 0x202,\n                        0xd0000001: 0x800200,\n                        0xe0000001: 0x8002,\n                        0xf0000001: 0x0,\n                        0x8000001: 0x808202,\n                        0x18000001: 0x808000,\n                        0x28000001: 0x800000,\n                        0x38000001: 0x200,\n                        0x48000001: 0x8000,\n                        0x58000001: 0x800002,\n                        0x68000001: 0x2,\n                        0x78000001: 0x8202,\n                        0x88000001: 0x8002,\n                        0x98000001: 0x800202,\n                        0xa8000001: 0x202,\n                        0xb8000001: 0x808200,\n                        0xc8000001: 0x800200,\n                        0xd8000001: 0x0,\n                        0xe8000001: 0x8200,\n                        0xf8000001: 0x808002\n                    },\n                    {\n                        0x0: 0x40084010,\n                        0x1000000: 0x4000,\n                        0x2000000: 0x80000,\n                        0x3000000: 0x40080010,\n                        0x4000000: 0x40000010,\n                        0x5000000: 0x40084000,\n                        0x6000000: 0x40004000,\n                        0x7000000: 0x10,\n                        0x8000000: 0x84000,\n                        0x9000000: 0x40004010,\n                        0xa000000: 0x40000000,\n                        0xb000000: 0x84010,\n                        0xc000000: 0x80010,\n                        0xd000000: 0x0,\n                        0xe000000: 0x4010,\n                        0xf000000: 0x40080000,\n                        0x800000: 0x40004000,\n                        0x1800000: 0x84010,\n                        0x2800000: 0x10,\n                        0x3800000: 0x40004010,\n                        0x4800000: 0x40084010,\n                        0x5800000: 0x40000000,\n                        0x6800000: 0x80000,\n                        0x7800000: 0x40080010,\n                        0x8800000: 0x80010,\n                        0x9800000: 0x0,\n                        0xa800000: 0x4000,\n                        0xb800000: 0x40080000,\n                        0xc800000: 0x40000010,\n                        0xd800000: 0x84000,\n                        0xe800000: 0x40084000,\n                        0xf800000: 0x4010,\n                        0x10000000: 0x0,\n                        0x11000000: 0x40080010,\n                        0x12000000: 0x40004010,\n                        0x13000000: 0x40084000,\n                        0x14000000: 0x40080000,\n                        0x15000000: 0x10,\n                        0x16000000: 0x84010,\n                        0x17000000: 0x4000,\n                        0x18000000: 0x4010,\n                        0x19000000: 0x80000,\n                        0x1a000000: 0x80010,\n                        0x1b000000: 0x40000010,\n                        0x1c000000: 0x84000,\n                        0x1d000000: 0x40004000,\n                        0x1e000000: 0x40000000,\n                        0x1f000000: 0x40084010,\n                        0x10800000: 0x84010,\n                        0x11800000: 0x80000,\n                        0x12800000: 0x40080000,\n                        0x13800000: 0x4000,\n                        0x14800000: 0x40004000,\n                        0x15800000: 0x40084010,\n                        0x16800000: 0x10,\n                        0x17800000: 0x40000000,\n                        0x18800000: 0x40084000,\n                        0x19800000: 0x40000010,\n                        0x1a800000: 0x40004010,\n                        0x1b800000: 0x80010,\n                        0x1c800000: 0x0,\n                        0x1d800000: 0x4010,\n                        0x1e800000: 0x40080010,\n                        0x1f800000: 0x84000\n                    },\n                    {\n                        0x0: 0x104,\n                        0x100000: 0x0,\n                        0x200000: 0x4000100,\n                        0x300000: 0x10104,\n                        0x400000: 0x10004,\n                        0x500000: 0x4000004,\n                        0x600000: 0x4010104,\n                        0x700000: 0x4010000,\n                        0x800000: 0x4000000,\n                        0x900000: 0x4010100,\n                        0xa00000: 0x10100,\n                        0xb00000: 0x4010004,\n                        0xc00000: 0x4000104,\n                        0xd00000: 0x10000,\n                        0xe00000: 0x4,\n                        0xf00000: 0x100,\n                        0x80000: 0x4010100,\n                        0x180000: 0x4010004,\n                        0x280000: 0x0,\n                        0x380000: 0x4000100,\n                        0x480000: 0x4000004,\n                        0x580000: 0x10000,\n                        0x680000: 0x10004,\n                        0x780000: 0x104,\n                        0x880000: 0x4,\n                        0x980000: 0x100,\n                        0xa80000: 0x4010000,\n                        0xb80000: 0x10104,\n                        0xc80000: 0x10100,\n                        0xd80000: 0x4000104,\n                        0xe80000: 0x4010104,\n                        0xf80000: 0x4000000,\n                        0x1000000: 0x4010100,\n                        0x1100000: 0x10004,\n                        0x1200000: 0x10000,\n                        0x1300000: 0x4000100,\n                        0x1400000: 0x100,\n                        0x1500000: 0x4010104,\n                        0x1600000: 0x4000004,\n                        0x1700000: 0x0,\n                        0x1800000: 0x4000104,\n                        0x1900000: 0x4000000,\n                        0x1a00000: 0x4,\n                        0x1b00000: 0x10100,\n                        0x1c00000: 0x4010000,\n                        0x1d00000: 0x104,\n                        0x1e00000: 0x10104,\n                        0x1f00000: 0x4010004,\n                        0x1080000: 0x4000000,\n                        0x1180000: 0x104,\n                        0x1280000: 0x4010100,\n                        0x1380000: 0x0,\n                        0x1480000: 0x10004,\n                        0x1580000: 0x4000100,\n                        0x1680000: 0x100,\n                        0x1780000: 0x4010004,\n                        0x1880000: 0x10000,\n                        0x1980000: 0x4010104,\n                        0x1a80000: 0x10104,\n                        0x1b80000: 0x4000004,\n                        0x1c80000: 0x4000104,\n                        0x1d80000: 0x4010000,\n                        0x1e80000: 0x4,\n                        0x1f80000: 0x10100\n                    },\n                    {\n                        0x0: 0x80401000,\n                        0x10000: 0x80001040,\n                        0x20000: 0x401040,\n                        0x30000: 0x80400000,\n                        0x40000: 0x0,\n                        0x50000: 0x401000,\n                        0x60000: 0x80000040,\n                        0x70000: 0x400040,\n                        0x80000: 0x80000000,\n                        0x90000: 0x400000,\n                        0xa0000: 0x40,\n                        0xb0000: 0x80001000,\n                        0xc0000: 0x80400040,\n                        0xd0000: 0x1040,\n                        0xe0000: 0x1000,\n                        0xf0000: 0x80401040,\n                        0x8000: 0x80001040,\n                        0x18000: 0x40,\n                        0x28000: 0x80400040,\n                        0x38000: 0x80001000,\n                        0x48000: 0x401000,\n                        0x58000: 0x80401040,\n                        0x68000: 0x0,\n                        0x78000: 0x80400000,\n                        0x88000: 0x1000,\n                        0x98000: 0x80401000,\n                        0xa8000: 0x400000,\n                        0xb8000: 0x1040,\n                        0xc8000: 0x80000000,\n                        0xd8000: 0x400040,\n                        0xe8000: 0x401040,\n                        0xf8000: 0x80000040,\n                        0x100000: 0x400040,\n                        0x110000: 0x401000,\n                        0x120000: 0x80000040,\n                        0x130000: 0x0,\n                        0x140000: 0x1040,\n                        0x150000: 0x80400040,\n                        0x160000: 0x80401000,\n                        0x170000: 0x80001040,\n                        0x180000: 0x80401040,\n                        0x190000: 0x80000000,\n                        0x1a0000: 0x80400000,\n                        0x1b0000: 0x401040,\n                        0x1c0000: 0x80001000,\n                        0x1d0000: 0x400000,\n                        0x1e0000: 0x40,\n                        0x1f0000: 0x1000,\n                        0x108000: 0x80400000,\n                        0x118000: 0x80401040,\n                        0x128000: 0x0,\n                        0x138000: 0x401000,\n                        0x148000: 0x400040,\n                        0x158000: 0x80000000,\n                        0x168000: 0x80001040,\n                        0x178000: 0x40,\n                        0x188000: 0x80000040,\n                        0x198000: 0x1000,\n                        0x1a8000: 0x80001000,\n                        0x1b8000: 0x80400040,\n                        0x1c8000: 0x1040,\n                        0x1d8000: 0x80401000,\n                        0x1e8000: 0x400000,\n                        0x1f8000: 0x401040\n                    },\n                    {\n                        0x0: 0x80,\n                        0x1000: 0x1040000,\n                        0x2000: 0x40000,\n                        0x3000: 0x20000000,\n                        0x4000: 0x20040080,\n                        0x5000: 0x1000080,\n                        0x6000: 0x21000080,\n                        0x7000: 0x40080,\n                        0x8000: 0x1000000,\n                        0x9000: 0x20040000,\n                        0xa000: 0x20000080,\n                        0xb000: 0x21040080,\n                        0xc000: 0x21040000,\n                        0xd000: 0x0,\n                        0xe000: 0x1040080,\n                        0xf000: 0x21000000,\n                        0x800: 0x1040080,\n                        0x1800: 0x21000080,\n                        0x2800: 0x80,\n                        0x3800: 0x1040000,\n                        0x4800: 0x40000,\n                        0x5800: 0x20040080,\n                        0x6800: 0x21040000,\n                        0x7800: 0x20000000,\n                        0x8800: 0x20040000,\n                        0x9800: 0x0,\n                        0xa800: 0x21040080,\n                        0xb800: 0x1000080,\n                        0xc800: 0x20000080,\n                        0xd800: 0x21000000,\n                        0xe800: 0x1000000,\n                        0xf800: 0x40080,\n                        0x10000: 0x40000,\n                        0x11000: 0x80,\n                        0x12000: 0x20000000,\n                        0x13000: 0x21000080,\n                        0x14000: 0x1000080,\n                        0x15000: 0x21040000,\n                        0x16000: 0x20040080,\n                        0x17000: 0x1000000,\n                        0x18000: 0x21040080,\n                        0x19000: 0x21000000,\n                        0x1a000: 0x1040000,\n                        0x1b000: 0x20040000,\n                        0x1c000: 0x40080,\n                        0x1d000: 0x20000080,\n                        0x1e000: 0x0,\n                        0x1f000: 0x1040080,\n                        0x10800: 0x21000080,\n                        0x11800: 0x1000000,\n                        0x12800: 0x1040000,\n                        0x13800: 0x20040080,\n                        0x14800: 0x20000000,\n                        0x15800: 0x1040080,\n                        0x16800: 0x80,\n                        0x17800: 0x21040000,\n                        0x18800: 0x40080,\n                        0x19800: 0x21040080,\n                        0x1a800: 0x0,\n                        0x1b800: 0x21000000,\n                        0x1c800: 0x1000080,\n                        0x1d800: 0x40000,\n                        0x1e800: 0x20040000,\n                        0x1f800: 0x20000080\n                    },\n                    {\n                        0x0: 0x10000008,\n                        0x100: 0x2000,\n                        0x200: 0x10200000,\n                        0x300: 0x10202008,\n                        0x400: 0x10002000,\n                        0x500: 0x200000,\n                        0x600: 0x200008,\n                        0x700: 0x10000000,\n                        0x800: 0x0,\n                        0x900: 0x10002008,\n                        0xa00: 0x202000,\n                        0xb00: 0x8,\n                        0xc00: 0x10200008,\n                        0xd00: 0x202008,\n                        0xe00: 0x2008,\n                        0xf00: 0x10202000,\n                        0x80: 0x10200000,\n                        0x180: 0x10202008,\n                        0x280: 0x8,\n                        0x380: 0x200000,\n                        0x480: 0x202008,\n                        0x580: 0x10000008,\n                        0x680: 0x10002000,\n                        0x780: 0x2008,\n                        0x880: 0x200008,\n                        0x980: 0x2000,\n                        0xa80: 0x10002008,\n                        0xb80: 0x10200008,\n                        0xc80: 0x0,\n                        0xd80: 0x10202000,\n                        0xe80: 0x202000,\n                        0xf80: 0x10000000,\n                        0x1000: 0x10002000,\n                        0x1100: 0x10200008,\n                        0x1200: 0x10202008,\n                        0x1300: 0x2008,\n                        0x1400: 0x200000,\n                        0x1500: 0x10000000,\n                        0x1600: 0x10000008,\n                        0x1700: 0x202000,\n                        0x1800: 0x202008,\n                        0x1900: 0x0,\n                        0x1a00: 0x8,\n                        0x1b00: 0x10200000,\n                        0x1c00: 0x2000,\n                        0x1d00: 0x10002008,\n                        0x1e00: 0x10202000,\n                        0x1f00: 0x200008,\n                        0x1080: 0x8,\n                        0x1180: 0x202000,\n                        0x1280: 0x200000,\n                        0x1380: 0x10000008,\n                        0x1480: 0x10002000,\n                        0x1580: 0x2008,\n                        0x1680: 0x10202008,\n                        0x1780: 0x10200000,\n                        0x1880: 0x10202000,\n                        0x1980: 0x10200008,\n                        0x1a80: 0x2000,\n                        0x1b80: 0x202008,\n                        0x1c80: 0x200008,\n                        0x1d80: 0x0,\n                        0x1e80: 0x10000000,\n                        0x1f80: 0x10002008\n                    },\n                    {\n                        0x0: 0x100000,\n                        0x10: 0x2000401,\n                        0x20: 0x400,\n                        0x30: 0x100401,\n                        0x40: 0x2100401,\n                        0x50: 0x0,\n                        0x60: 0x1,\n                        0x70: 0x2100001,\n                        0x80: 0x2000400,\n                        0x90: 0x100001,\n                        0xa0: 0x2000001,\n                        0xb0: 0x2100400,\n                        0xc0: 0x2100000,\n                        0xd0: 0x401,\n                        0xe0: 0x100400,\n                        0xf0: 0x2000000,\n                        0x8: 0x2100001,\n                        0x18: 0x0,\n                        0x28: 0x2000401,\n                        0x38: 0x2100400,\n                        0x48: 0x100000,\n                        0x58: 0x2000001,\n                        0x68: 0x2000000,\n                        0x78: 0x401,\n                        0x88: 0x100401,\n                        0x98: 0x2000400,\n                        0xa8: 0x2100000,\n                        0xb8: 0x100001,\n                        0xc8: 0x400,\n                        0xd8: 0x2100401,\n                        0xe8: 0x1,\n                        0xf8: 0x100400,\n                        0x100: 0x2000000,\n                        0x110: 0x100000,\n                        0x120: 0x2000401,\n                        0x130: 0x2100001,\n                        0x140: 0x100001,\n                        0x150: 0x2000400,\n                        0x160: 0x2100400,\n                        0x170: 0x100401,\n                        0x180: 0x401,\n                        0x190: 0x2100401,\n                        0x1a0: 0x100400,\n                        0x1b0: 0x1,\n                        0x1c0: 0x0,\n                        0x1d0: 0x2100000,\n                        0x1e0: 0x2000001,\n                        0x1f0: 0x400,\n                        0x108: 0x100400,\n                        0x118: 0x2000401,\n                        0x128: 0x2100001,\n                        0x138: 0x1,\n                        0x148: 0x2000000,\n                        0x158: 0x100000,\n                        0x168: 0x401,\n                        0x178: 0x2100400,\n                        0x188: 0x2000001,\n                        0x198: 0x2100000,\n                        0x1a8: 0x0,\n                        0x1b8: 0x2100401,\n                        0x1c8: 0x100401,\n                        0x1d8: 0x400,\n                        0x1e8: 0x2000400,\n                        0x1f8: 0x100001\n                    },\n                    {\n                        0x0: 0x8000820,\n                        0x1: 0x20000,\n                        0x2: 0x8000000,\n                        0x3: 0x20,\n                        0x4: 0x20020,\n                        0x5: 0x8020820,\n                        0x6: 0x8020800,\n                        0x7: 0x800,\n                        0x8: 0x8020000,\n                        0x9: 0x8000800,\n                        0xa: 0x20800,\n                        0xb: 0x8020020,\n                        0xc: 0x820,\n                        0xd: 0x0,\n                        0xe: 0x8000020,\n                        0xf: 0x20820,\n                        0x80000000: 0x800,\n                        0x80000001: 0x8020820,\n                        0x80000002: 0x8000820,\n                        0x80000003: 0x8000000,\n                        0x80000004: 0x8020000,\n                        0x80000005: 0x20800,\n                        0x80000006: 0x20820,\n                        0x80000007: 0x20,\n                        0x80000008: 0x8000020,\n                        0x80000009: 0x820,\n                        0x8000000a: 0x20020,\n                        0x8000000b: 0x8020800,\n                        0x8000000c: 0x0,\n                        0x8000000d: 0x8020020,\n                        0x8000000e: 0x8000800,\n                        0x8000000f: 0x20000,\n                        0x10: 0x20820,\n                        0x11: 0x8020800,\n                        0x12: 0x20,\n                        0x13: 0x800,\n                        0x14: 0x8000800,\n                        0x15: 0x8000020,\n                        0x16: 0x8020020,\n                        0x17: 0x20000,\n                        0x18: 0x0,\n                        0x19: 0x20020,\n                        0x1a: 0x8020000,\n                        0x1b: 0x8000820,\n                        0x1c: 0x8020820,\n                        0x1d: 0x20800,\n                        0x1e: 0x820,\n                        0x1f: 0x8000000,\n                        0x80000010: 0x20000,\n                        0x80000011: 0x800,\n                        0x80000012: 0x8020020,\n                        0x80000013: 0x20820,\n                        0x80000014: 0x20,\n                        0x80000015: 0x8020000,\n                        0x80000016: 0x8000000,\n                        0x80000017: 0x8000820,\n                        0x80000018: 0x8020820,\n                        0x80000019: 0x8000020,\n                        0x8000001a: 0x8000800,\n                        0x8000001b: 0x0,\n                        0x8000001c: 0x20800,\n                        0x8000001d: 0x820,\n                        0x8000001e: 0x20020,\n                        0x8000001f: 0x8020800\n                    }\n                ];\n\n                // Masks that select the SBOX input\n                var SBOX_MASK = [\n                    0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n                    0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f\n                ];\n\n                /**\n                 * DES block cipher algorithm.\n                 */\n                var DES = C_algo.DES = BlockCipher.extend({\n                    _doReset: function () {\n                        // Shortcuts\n                        var key = this._key;\n                        var keyWords = key.words;\n\n                        // Select 56 bits according to PC1\n                        var keyBits = [];\n                        for (var i = 0; i < 56; i++) {\n                            var keyBitPos = PC1[i] - 1;\n                            keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;\n                        }\n\n                        // Assemble 16 subkeys\n                        var subKeys = this._subKeys = [];\n                        for (var nSubKey = 0; nSubKey < 16; nSubKey++) {\n                            // Create subkey\n                            var subKey = subKeys[nSubKey] = [];\n\n                            // Shortcut\n                            var bitShift = BIT_SHIFTS[nSubKey];\n\n                            // Select 48 bits according to PC2\n                            for (var i = 0; i < 24; i++) {\n                                // Select from the left 28 key bits\n                                subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);\n\n                                // Select from the right 28 key bits\n                                subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);\n                            }\n\n                            // Since each subkey is applied to an expanded 32-bit input,\n                            // the subkey can be broken into 8 values scaled to 32-bits,\n                            // which allows the key to be used without expansion\n                            subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);\n                            for (var i = 1; i < 7; i++) {\n                                subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);\n                            }\n                            subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);\n                        }\n\n                        // Compute inverse subkeys\n                        var invSubKeys = this._invSubKeys = [];\n                        for (var i = 0; i < 16; i++) {\n                            invSubKeys[i] = subKeys[15 - i];\n                        }\n                    },\n\n                    encryptBlock: function (M, offset) {\n                        this._doCryptBlock(M, offset, this._subKeys);\n                    },\n\n                    decryptBlock: function (M, offset) {\n                        this._doCryptBlock(M, offset, this._invSubKeys);\n                    },\n\n                    _doCryptBlock: function (M, offset, subKeys) {\n                        // Get input\n                        this._lBlock = M[offset];\n                        this._rBlock = M[offset + 1];\n\n                        // Initial permutation\n                        exchangeLR.call(this, 4,  0x0f0f0f0f);\n                        exchangeLR.call(this, 16, 0x0000ffff);\n                        exchangeRL.call(this, 2,  0x33333333);\n                        exchangeRL.call(this, 8,  0x00ff00ff);\n                        exchangeLR.call(this, 1,  0x55555555);\n\n                        // Rounds\n                        for (var round = 0; round < 16; round++) {\n                            // Shortcuts\n                            var subKey = subKeys[round];\n                            var lBlock = this._lBlock;\n                            var rBlock = this._rBlock;\n\n                            // Feistel function\n                            var f = 0;\n                            for (var i = 0; i < 8; i++) {\n                                f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];\n                            }\n                            this._lBlock = rBlock;\n                            this._rBlock = lBlock ^ f;\n                        }\n\n                        // Undo swap from last round\n                        var t = this._lBlock;\n                        this._lBlock = this._rBlock;\n                        this._rBlock = t;\n\n                        // Final permutation\n                        exchangeLR.call(this, 1,  0x55555555);\n                        exchangeRL.call(this, 8,  0x00ff00ff);\n                        exchangeRL.call(this, 2,  0x33333333);\n                        exchangeLR.call(this, 16, 0x0000ffff);\n                        exchangeLR.call(this, 4,  0x0f0f0f0f);\n\n                        // Set output\n                        M[offset] = this._lBlock;\n                        M[offset + 1] = this._rBlock;\n                    },\n\n                    keySize: 64/32,\n\n                    ivSize: 64/32,\n\n                    blockSize: 64/32\n                });\n\n                // Swap bits across the left and right words\n                function exchangeLR(offset, mask) {\n                    var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;\n                    this._rBlock ^= t;\n                    this._lBlock ^= t << offset;\n                }\n\n                function exchangeRL(offset, mask) {\n                    var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;\n                    this._lBlock ^= t;\n                    this._rBlock ^= t << offset;\n                }\n\n                /**\n                 * Shortcut functions to the cipher's object interface.\n                 *\n                 * @example\n                 *\n                 *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);\n                 *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);\n                 */\n                C.DES = BlockCipher._createHelper(DES);\n\n                /**\n                 * Triple-DES block cipher algorithm.\n                 */\n                var TripleDES = C_algo.TripleDES = BlockCipher.extend({\n                    _doReset: function () {\n                        // Shortcuts\n                        var key = this._key;\n                        var keyWords = key.words;\n\n                        // Create DES instances\n                        this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));\n                        this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));\n                        this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));\n                    },\n\n                    encryptBlock: function (M, offset) {\n                        this._des1.encryptBlock(M, offset);\n                        this._des2.decryptBlock(M, offset);\n                        this._des3.encryptBlock(M, offset);\n                    },\n\n                    decryptBlock: function (M, offset) {\n                        this._des3.decryptBlock(M, offset);\n                        this._des2.encryptBlock(M, offset);\n                        this._des1.decryptBlock(M, offset);\n                    },\n\n                    keySize: 192/32,\n\n                    ivSize: 64/32,\n\n                    blockSize: 64/32\n                });\n\n                /**\n                 * Shortcut functions to the cipher's object interface.\n                 *\n                 * @example\n                 *\n                 *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);\n                 *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);\n                 */\n                C.TripleDES = BlockCipher._createHelper(TripleDES);\n            }());\n\n\n            return CryptoJS.TripleDES;\n\n        }));\n    },{\"./cipher-core\":53,\"./core\":54,\"./enc-base64\":55,\"./evpkdf\":57,\"./md5\":62}],85:[function(require,module,exports){\n        ;(function (root, factory) {\n            if (typeof exports === \"object\") {\n                // CommonJS\n                module.exports = exports = factory(require(\"./core\"));\n            }\n            else if (typeof define === \"function\" && define.amd) {\n                // AMD\n                define([\"./core\"], factory);\n            }\n            else {\n                // Global (browser)\n                factory(root.CryptoJS);\n            }\n        }(this, function (CryptoJS) {\n\n            (function (undefined) {\n                // Shortcuts\n                var C = CryptoJS;\n                var C_lib = C.lib;\n                var Base = C_lib.Base;\n                var X32WordArray = C_lib.WordArray;\n\n                /**\n                 * x64 namespace.\n                 */\n                var C_x64 = C.x64 = {};\n\n                /**\n                 * A 64-bit word.\n                 */\n                var X64Word = C_x64.Word = Base.extend({\n                    /**\n                     * Initializes a newly created 64-bit word.\n                     *\n                     * @param {number} high The high 32 bits.\n                     * @param {number} low The low 32 bits.\n                     *\n                     * @example\n                     *\n                     *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);\n                     */\n                    init: function (high, low) {\n                        this.high = high;\n                        this.low = low;\n                    }\n\n                    /**\n                     * Bitwise NOTs this word.\n                     *\n                     * @return {X64Word} A new x64-Word object after negating.\n                     *\n                     * @example\n                     *\n                     *     var negated = x64Word.not();\n                     */\n                    // not: function () {\n                    // var high = ~this.high;\n                    // var low = ~this.low;\n\n                    // return X64Word.create(high, low);\n                    // },\n\n                    /**\n                     * Bitwise ANDs this word with the passed word.\n                     *\n                     * @param {X64Word} word The x64-Word to AND with this word.\n                     *\n                     * @return {X64Word} A new x64-Word object after ANDing.\n                     *\n                     * @example\n                     *\n                     *     var anded = x64Word.and(anotherX64Word);\n                     */\n                    // and: function (word) {\n                    // var high = this.high & word.high;\n                    // var low = this.low & word.low;\n\n                    // return X64Word.create(high, low);\n                    // },\n\n                    /**\n                     * Bitwise ORs this word with the passed word.\n                     *\n                     * @param {X64Word} word The x64-Word to OR with this word.\n                     *\n                     * @return {X64Word} A new x64-Word object after ORing.\n                     *\n                     * @example\n                     *\n                     *     var ored = x64Word.or(anotherX64Word);\n                     */\n                    // or: function (word) {\n                    // var high = this.high | word.high;\n                    // var low = this.low | word.low;\n\n                    // return X64Word.create(high, low);\n                    // },\n\n                    /**\n                     * Bitwise XORs this word with the passed word.\n                     *\n                     * @param {X64Word} word The x64-Word to XOR with this word.\n                     *\n                     * @return {X64Word} A new x64-Word object after XORing.\n                     *\n                     * @example\n                     *\n                     *     var xored = x64Word.xor(anotherX64Word);\n                     */\n                    // xor: function (word) {\n                    // var high = this.high ^ word.high;\n                    // var low = this.low ^ word.low;\n\n                    // return X64Word.create(high, low);\n                    // },\n\n                    /**\n                     * Shifts this word n bits to the left.\n                     *\n                     * @param {number} n The number of bits to shift.\n                     *\n                     * @return {X64Word} A new x64-Word object after shifting.\n                     *\n                     * @example\n                     *\n                     *     var shifted = x64Word.shiftL(25);\n                     */\n                    // shiftL: function (n) {\n                    // if (n < 32) {\n                    // var high = (this.high << n) | (this.low >>> (32 - n));\n                    // var low = this.low << n;\n                    // } else {\n                    // var high = this.low << (n - 32);\n                    // var low = 0;\n                    // }\n\n                    // return X64Word.create(high, low);\n                    // },\n\n                    /**\n                     * Shifts this word n bits to the right.\n                     *\n                     * @param {number} n The number of bits to shift.\n                     *\n                     * @return {X64Word} A new x64-Word object after shifting.\n                     *\n                     * @example\n                     *\n                     *     var shifted = x64Word.shiftR(7);\n                     */\n                    // shiftR: function (n) {\n                    // if (n < 32) {\n                    // var low = (this.low >>> n) | (this.high << (32 - n));\n                    // var high = this.high >>> n;\n                    // } else {\n                    // var low = this.high >>> (n - 32);\n                    // var high = 0;\n                    // }\n\n                    // return X64Word.create(high, low);\n                    // },\n\n                    /**\n                     * Rotates this word n bits to the left.\n                     *\n                     * @param {number} n The number of bits to rotate.\n                     *\n                     * @return {X64Word} A new x64-Word object after rotating.\n                     *\n                     * @example\n                     *\n                     *     var rotated = x64Word.rotL(25);\n                     */\n                    // rotL: function (n) {\n                    // return this.shiftL(n).or(this.shiftR(64 - n));\n                    // },\n\n                    /**\n                     * Rotates this word n bits to the right.\n                     *\n                     * @param {number} n The number of bits to rotate.\n                     *\n                     * @return {X64Word} A new x64-Word object after rotating.\n                     *\n                     * @example\n                     *\n                     *     var rotated = x64Word.rotR(7);\n                     */\n                    // rotR: function (n) {\n                    // return this.shiftR(n).or(this.shiftL(64 - n));\n                    // },\n\n                    /**\n                     * Adds this word with the passed word.\n                     *\n                     * @param {X64Word} word The x64-Word to add with this word.\n                     *\n                     * @return {X64Word} A new x64-Word object after adding.\n                     *\n                     * @example\n                     *\n                     *     var added = x64Word.add(anotherX64Word);\n                     */\n                    // add: function (word) {\n                    // var low = (this.low + word.low) | 0;\n                    // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;\n                    // var high = (this.high + word.high + carry) | 0;\n\n                    // return X64Word.create(high, low);\n                    // }\n                });\n\n                /**\n                 * An array of 64-bit words.\n                 *\n                 * @property {Array} words The array of CryptoJS.x64.Word objects.\n                 * @property {number} sigBytes The number of significant bytes in this word array.\n                 */\n                var X64WordArray = C_x64.WordArray = Base.extend({\n                    /**\n                     * Initializes a newly created word array.\n                     *\n                     * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.\n                     * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n                     *\n                     * @example\n                     *\n                     *     var wordArray = CryptoJS.x64.WordArray.create();\n                     *\n                     *     var wordArray = CryptoJS.x64.WordArray.create([\n                     *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n                     *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n                     *     ]);\n                     *\n                     *     var wordArray = CryptoJS.x64.WordArray.create([\n                     *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),\n                     *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)\n                     *     ], 10);\n                     */\n                    init: function (words, sigBytes) {\n                        words = this.words = words || [];\n\n                        if (sigBytes != undefined) {\n                            this.sigBytes = sigBytes;\n                        } else {\n                            this.sigBytes = words.length * 8;\n                        }\n                    },\n\n                    /**\n                     * Converts this 64-bit word array to a 32-bit word array.\n                     *\n                     * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.\n                     *\n                     * @example\n                     *\n                     *     var x32WordArray = x64WordArray.toX32();\n                     */\n                    toX32: function () {\n                        // Shortcuts\n                        var x64Words = this.words;\n                        var x64WordsLength = x64Words.length;\n\n                        // Convert\n                        var x32Words = [];\n                        for (var i = 0; i < x64WordsLength; i++) {\n                            var x64Word = x64Words[i];\n                            x32Words.push(x64Word.high);\n                            x32Words.push(x64Word.low);\n                        }\n\n                        return X32WordArray.create(x32Words, this.sigBytes);\n                    },\n\n                    /**\n                     * Creates a copy of this word array.\n                     *\n                     * @return {X64WordArray} The clone.\n                     *\n                     * @example\n                     *\n                     *     var clone = x64WordArray.clone();\n                     */\n                    clone: function () {\n                        var clone = Base.clone.call(this);\n\n                        // Clone \"words\" array\n                        var words = clone.words = this.words.slice(0);\n\n                        // Clone each X64Word object\n                        var wordsLength = words.length;\n                        for (var i = 0; i < wordsLength; i++) {\n                            words[i] = words[i].clone();\n                        }\n\n                        return clone;\n                    }\n                });\n            }());\n\n\n            return CryptoJS;\n\n        }));\n    },{\"./core\":54}],86:[function(require,module,exports){\n        if (typeof Object.create === 'function') {\n            // implementation from standard node.js 'util' module\n            module.exports = function inherits(ctor, superCtor) {\n                ctor.super_ = superCtor\n                ctor.prototype = Object.create(superCtor.prototype, {\n                    constructor: {\n                        value: ctor,\n                        enumerable: false,\n                        writable: true,\n                        configurable: true\n                    }\n                });\n            };\n        } else {\n            // old school shim for old browsers\n            module.exports = function inherits(ctor, superCtor) {\n                ctor.super_ = superCtor\n                var TempCtor = function () {}\n                TempCtor.prototype = superCtor.prototype\n                ctor.prototype = new TempCtor()\n                ctor.prototype.constructor = ctor\n            }\n        }\n\n    },{}],87:[function(require,module,exports){\n        /*! https://mths.be/utf8js v2.1.2 by @mathias */\n        ;(function(root) {\n\n            // Detect free variables `exports`\n            var freeExports = typeof exports == 'object' && exports;\n\n            // Detect free variable `module`\n            var freeModule = typeof module == 'object' && module &&\n                module.exports == freeExports && module;\n\n            // Detect free variable `global`, from Node.js or Browserified code,\n            // and use it as `root`\n            var freeGlobal = typeof global == 'object' && global;\n            if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n                root = freeGlobal;\n            }\n\n            /*--------------------------------------------------------------------------*/\n\n            var stringFromCharCode = String.fromCharCode;\n\n            // Taken from https://mths.be/punycode\n            function ucs2decode(string) {\n                var output = [];\n                var counter = 0;\n                var length = string.length;\n                var value;\n                var extra;\n                while (counter < length) {\n                    value = string.charCodeAt(counter++);\n                    if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n                        // high surrogate, and there is a next character\n                        extra = string.charCodeAt(counter++);\n                        if ((extra & 0xFC00) == 0xDC00) { // low surrogate\n                            output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n                        } else {\n                            // unmatched surrogate; only append this code unit, in case the next\n                            // code unit is the high surrogate of a surrogate pair\n                            output.push(value);\n                            counter--;\n                        }\n                    } else {\n                        output.push(value);\n                    }\n                }\n                return output;\n            }\n\n            // Taken from https://mths.be/punycode\n            function ucs2encode(array) {\n                var length = array.length;\n                var index = -1;\n                var value;\n                var output = '';\n                while (++index < length) {\n                    value = array[index];\n                    if (value > 0xFFFF) {\n                        value -= 0x10000;\n                        output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n                        value = 0xDC00 | value & 0x3FF;\n                    }\n                    output += stringFromCharCode(value);\n                }\n                return output;\n            }\n\n            function checkScalarValue(codePoint) {\n                if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {\n                    throw Error(\n                        'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +\n                        ' is not a scalar value'\n                    );\n                }\n            }\n            /*--------------------------------------------------------------------------*/\n\n            function createByte(codePoint, shift) {\n                return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n            }\n\n            function encodeCodePoint(codePoint) {\n                if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n                    return stringFromCharCode(codePoint);\n                }\n                var symbol = '';\n                if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n                    symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n                }\n                else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n                    checkScalarValue(codePoint);\n                    symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n                    symbol += createByte(codePoint, 6);\n                }\n                else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n                    symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n                    symbol += createByte(codePoint, 12);\n                    symbol += createByte(codePoint, 6);\n                }\n                symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n                return symbol;\n            }\n\n            function utf8encode(string) {\n                var codePoints = ucs2decode(string);\n                var length = codePoints.length;\n                var index = -1;\n                var codePoint;\n                var byteString = '';\n                while (++index < length) {\n                    codePoint = codePoints[index];\n                    byteString += encodeCodePoint(codePoint);\n                }\n                return byteString;\n            }\n\n            /*--------------------------------------------------------------------------*/\n\n            function readContinuationByte() {\n                if (byteIndex >= byteCount) {\n                    throw Error('Invalid byte index');\n                }\n\n                var continuationByte = byteArray[byteIndex] & 0xFF;\n                byteIndex++;\n\n                if ((continuationByte & 0xC0) == 0x80) {\n                    return continuationByte & 0x3F;\n                }\n\n                // If we end up here, it’s not a continuation byte\n                throw Error('Invalid continuation byte');\n            }\n\n            function decodeSymbol() {\n                var byte1;\n                var byte2;\n                var byte3;\n                var byte4;\n                var codePoint;\n\n                if (byteIndex > byteCount) {\n                    throw Error('Invalid byte index');\n                }\n\n                if (byteIndex == byteCount) {\n                    return false;\n                }\n\n                // Read first byte\n                byte1 = byteArray[byteIndex] & 0xFF;\n                byteIndex++;\n\n                // 1-byte sequence (no continuation bytes)\n                if ((byte1 & 0x80) == 0) {\n                    return byte1;\n                }\n\n                // 2-byte sequence\n                if ((byte1 & 0xE0) == 0xC0) {\n                    byte2 = readContinuationByte();\n                    codePoint = ((byte1 & 0x1F) << 6) | byte2;\n                    if (codePoint >= 0x80) {\n                        return codePoint;\n                    } else {\n                        throw Error('Invalid continuation byte');\n                    }\n                }\n\n                // 3-byte sequence (may include unpaired surrogates)\n                if ((byte1 & 0xF0) == 0xE0) {\n                    byte2 = readContinuationByte();\n                    byte3 = readContinuationByte();\n                    codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n                    if (codePoint >= 0x0800) {\n                        checkScalarValue(codePoint);\n                        return codePoint;\n                    } else {\n                        throw Error('Invalid continuation byte');\n                    }\n                }\n\n                // 4-byte sequence\n                if ((byte1 & 0xF8) == 0xF0) {\n                    byte2 = readContinuationByte();\n                    byte3 = readContinuationByte();\n                    byte4 = readContinuationByte();\n                    codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |\n                        (byte3 << 0x06) | byte4;\n                    if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n                        return codePoint;\n                    }\n                }\n\n                throw Error('Invalid UTF-8 detected');\n            }\n\n            var byteArray;\n            var byteCount;\n            var byteIndex;\n            function utf8decode(byteString) {\n                byteArray = ucs2decode(byteString);\n                byteCount = byteArray.length;\n                byteIndex = 0;\n                var codePoints = [];\n                var tmp;\n                while ((tmp = decodeSymbol()) !== false) {\n                    codePoints.push(tmp);\n                }\n                return ucs2encode(codePoints);\n            }\n\n            /*--------------------------------------------------------------------------*/\n\n            var utf8 = {\n                'version': '2.1.2',\n                'encode': utf8encode,\n                'decode': utf8decode\n            };\n\n            // Some AMD build optimizers, like r.js, check for specific condition patterns\n            // like the following:\n            if (\n                typeof define == 'function' &&\n                typeof define.amd == 'object' &&\n                define.amd\n            ) {\n                define(function() {\n                    return utf8;\n                });\n            }\telse if (freeExports && !freeExports.nodeType) {\n                if (freeModule) { // in Node.js or RingoJS v0.8.0+\n                    freeModule.exports = utf8;\n                } else { // in Narwhal or RingoJS v0.7.0-\n                    var object = {};\n                    var hasOwnProperty = object.hasOwnProperty;\n                    for (var key in utf8) {\n                        hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);\n                    }\n                }\n            } else { // in Rhino or a web browser\n                root.utf8 = utf8;\n            }\n\n        }(this));\n\n    },{}],88:[function(require,module,exports){\n        module.exports = function isBuffer(arg) {\n            return arg && typeof arg === 'object'\n                && typeof arg.copy === 'function'\n                && typeof arg.fill === 'function'\n                && typeof arg.readUInt8 === 'function';\n        }\n    },{}],89:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n        var formatRegExp = /%[sdj%]/g;\n        exports.format = function(f) {\n            if (!isString(f)) {\n                var objects = [];\n                for (var i = 0; i < arguments.length; i++) {\n                    objects.push(inspect(arguments[i]));\n                }\n                return objects.join(' ');\n            }\n\n            var i = 1;\n            var args = arguments;\n            var len = args.length;\n            var str = String(f).replace(formatRegExp, function(x) {\n                if (x === '%%') return '%';\n                if (i >= len) return x;\n                switch (x) {\n                    case '%s': return String(args[i++]);\n                    case '%d': return Number(args[i++]);\n                    case '%j':\n                        try {\n                            return JSON.stringify(args[i++]);\n                        } catch (_) {\n                            return '[Circular]';\n                        }\n                    default:\n                        return x;\n                }\n            });\n            for (var x = args[i]; i < len; x = args[++i]) {\n                if (isNull(x) || !isObject(x)) {\n                    str += ' ' + x;\n                } else {\n                    str += ' ' + inspect(x);\n                }\n            }\n            return str;\n        };\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\n        exports.deprecate = function(fn, msg) {\n            // Allow for deprecating things in the process of starting up.\n            if (isUndefined(global.process)) {\n                return function() {\n                    return exports.deprecate(fn, msg).apply(this, arguments);\n                };\n            }\n\n            if (process.noDeprecation === true) {\n                return fn;\n            }\n\n            var warned = false;\n            function deprecated() {\n                if (!warned) {\n                    if (process.throwDeprecation) {\n                        throw new Error(msg);\n                    } else if (process.traceDeprecation) {\n                        console.trace(msg);\n                    } else {\n                        console.error(msg);\n                    }\n                    warned = true;\n                }\n                return fn.apply(this, arguments);\n            }\n\n            return deprecated;\n        };\n\n\n        var debugs = {};\n        var debugEnviron;\n        exports.debuglog = function(set) {\n            if (isUndefined(debugEnviron))\n                debugEnviron = process.env.NODE_DEBUG || '';\n            set = set.toUpperCase();\n            if (!debugs[set]) {\n                if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n                    var pid = process.pid;\n                    debugs[set] = function() {\n                        var msg = exports.format.apply(exports, arguments);\n                        console.error('%s %d: %s', set, pid, msg);\n                    };\n                } else {\n                    debugs[set] = function() {};\n                }\n            }\n            return debugs[set];\n        };\n\n\n        /**\n         * Echos the value of a value. Trys to print the value out\n         * in the best way possible given the different types.\n         *\n         * @param {Object} obj The object to print out.\n         * @param {Object} opts Optional options object that alters the output.\n         */\n        /* legacy: obj, showHidden, depth, colors*/\n        function inspect(obj, opts) {\n            // default options\n            var ctx = {\n                seen: [],\n                stylize: stylizeNoColor\n            };\n            // legacy...\n            if (arguments.length >= 3) ctx.depth = arguments[2];\n            if (arguments.length >= 4) ctx.colors = arguments[3];\n            if (isBoolean(opts)) {\n                // legacy...\n                ctx.showHidden = opts;\n            } else if (opts) {\n                // got an \"options\" object\n                exports._extend(ctx, opts);\n            }\n            // set default options\n            if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n            if (isUndefined(ctx.depth)) ctx.depth = 2;\n            if (isUndefined(ctx.colors)) ctx.colors = false;\n            if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n            if (ctx.colors) ctx.stylize = stylizeWithColor;\n            return formatValue(ctx, obj, ctx.depth);\n        }\n        exports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n        inspect.colors = {\n            'bold' : [1, 22],\n            'italic' : [3, 23],\n            'underline' : [4, 24],\n            'inverse' : [7, 27],\n            'white' : [37, 39],\n            'grey' : [90, 39],\n            'black' : [30, 39],\n            'blue' : [34, 39],\n            'cyan' : [36, 39],\n            'green' : [32, 39],\n            'magenta' : [35, 39],\n            'red' : [31, 39],\n            'yellow' : [33, 39]\n        };\n\n// Don't use 'blue' not visible on cmd.exe\n        inspect.styles = {\n            'special': 'cyan',\n            'number': 'yellow',\n            'boolean': 'yellow',\n            'undefined': 'grey',\n            'null': 'bold',\n            'string': 'green',\n            'date': 'magenta',\n            // \"name\": intentionally not styling\n            'regexp': 'red'\n        };\n\n\n        function stylizeWithColor(str, styleType) {\n            var style = inspect.styles[styleType];\n\n            if (style) {\n                return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n                    '\\u001b[' + inspect.colors[style][1] + 'm';\n            } else {\n                return str;\n            }\n        }\n\n\n        function stylizeNoColor(str, styleType) {\n            return str;\n        }\n\n\n        function arrayToHash(array) {\n            var hash = {};\n\n            array.forEach(function(val, idx) {\n                hash[val] = true;\n            });\n\n            return hash;\n        }\n\n\n        function formatValue(ctx, value, recurseTimes) {\n            // Provide a hook for user-specified inspect functions.\n            // Check that value is an object with an inspect function on it\n            if (ctx.customInspect &&\n                value &&\n                isFunction(value.inspect) &&\n                // Filter out the util module, it's inspect function is special\n                value.inspect !== exports.inspect &&\n                // Also filter out any prototype objects using the circular check.\n                !(value.constructor && value.constructor.prototype === value)) {\n                var ret = value.inspect(recurseTimes, ctx);\n                if (!isString(ret)) {\n                    ret = formatValue(ctx, ret, recurseTimes);\n                }\n                return ret;\n            }\n\n            // Primitive types cannot have properties\n            var primitive = formatPrimitive(ctx, value);\n            if (primitive) {\n                return primitive;\n            }\n\n            // Look up the keys of the object.\n            var keys = Object.keys(value);\n            var visibleKeys = arrayToHash(keys);\n\n            if (ctx.showHidden) {\n                keys = Object.getOwnPropertyNames(value);\n            }\n\n            // IE doesn't make error fields non-enumerable\n            // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n            if (isError(value)\n                && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n                return formatError(value);\n            }\n\n            // Some type of object without properties can be shortcutted.\n            if (keys.length === 0) {\n                if (isFunction(value)) {\n                    var name = value.name ? ': ' + value.name : '';\n                    return ctx.stylize('[Function' + name + ']', 'special');\n                }\n                if (isRegExp(value)) {\n                    return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n                }\n                if (isDate(value)) {\n                    return ctx.stylize(Date.prototype.toString.call(value), 'date');\n                }\n                if (isError(value)) {\n                    return formatError(value);\n                }\n            }\n\n            var base = '', array = false, braces = ['{', '}'];\n\n            // Make Array say that they are Array\n            if (isArray(value)) {\n                array = true;\n                braces = ['[', ']'];\n            }\n\n            // Make functions say that they are functions\n            if (isFunction(value)) {\n                var n = value.name ? ': ' + value.name : '';\n                base = ' [Function' + n + ']';\n            }\n\n            // Make RegExps say that they are RegExps\n            if (isRegExp(value)) {\n                base = ' ' + RegExp.prototype.toString.call(value);\n            }\n\n            // Make dates with properties first say the date\n            if (isDate(value)) {\n                base = ' ' + Date.prototype.toUTCString.call(value);\n            }\n\n            // Make error with message first say the error\n            if (isError(value)) {\n                base = ' ' + formatError(value);\n            }\n\n            if (keys.length === 0 && (!array || value.length == 0)) {\n                return braces[0] + base + braces[1];\n            }\n\n            if (recurseTimes < 0) {\n                if (isRegExp(value)) {\n                    return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n                } else {\n                    return ctx.stylize('[Object]', 'special');\n                }\n            }\n\n            ctx.seen.push(value);\n\n            var output;\n            if (array) {\n                output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n            } else {\n                output = keys.map(function(key) {\n                    return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n                });\n            }\n\n            ctx.seen.pop();\n\n            return reduceToSingleString(output, base, braces);\n        }\n\n\n        function formatPrimitive(ctx, value) {\n            if (isUndefined(value))\n                return ctx.stylize('undefined', 'undefined');\n            if (isString(value)) {\n                var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                    .replace(/'/g, \"\\\\'\")\n                    .replace(/\\\\\"/g, '\"') + '\\'';\n                return ctx.stylize(simple, 'string');\n            }\n            if (isNumber(value))\n                return ctx.stylize('' + value, 'number');\n            if (isBoolean(value))\n                return ctx.stylize('' + value, 'boolean');\n            // For some reason typeof null is \"object\", so special case here.\n            if (isNull(value))\n                return ctx.stylize('null', 'null');\n        }\n\n\n        function formatError(value) {\n            return '[' + Error.prototype.toString.call(value) + ']';\n        }\n\n\n        function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n            var output = [];\n            for (var i = 0, l = value.length; i < l; ++i) {\n                if (hasOwnProperty(value, String(i))) {\n                    output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n                        String(i), true));\n                } else {\n                    output.push('');\n                }\n            }\n            keys.forEach(function(key) {\n                if (!key.match(/^\\d+$/)) {\n                    output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n                        key, true));\n                }\n            });\n            return output;\n        }\n\n\n        function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n            var name, str, desc;\n            desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n            if (desc.get) {\n                if (desc.set) {\n                    str = ctx.stylize('[Getter/Setter]', 'special');\n                } else {\n                    str = ctx.stylize('[Getter]', 'special');\n                }\n            } else {\n                if (desc.set) {\n                    str = ctx.stylize('[Setter]', 'special');\n                }\n            }\n            if (!hasOwnProperty(visibleKeys, key)) {\n                name = '[' + key + ']';\n            }\n            if (!str) {\n                if (ctx.seen.indexOf(desc.value) < 0) {\n                    if (isNull(recurseTimes)) {\n                        str = formatValue(ctx, desc.value, null);\n                    } else {\n                        str = formatValue(ctx, desc.value, recurseTimes - 1);\n                    }\n                    if (str.indexOf('\\n') > -1) {\n                        if (array) {\n                            str = str.split('\\n').map(function(line) {\n                                return '  ' + line;\n                            }).join('\\n').substr(2);\n                        } else {\n                            str = '\\n' + str.split('\\n').map(function(line) {\n                                return '   ' + line;\n                            }).join('\\n');\n                        }\n                    }\n                } else {\n                    str = ctx.stylize('[Circular]', 'special');\n                }\n            }\n            if (isUndefined(name)) {\n                if (array && key.match(/^\\d+$/)) {\n                    return str;\n                }\n                name = JSON.stringify('' + key);\n                if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n                    name = name.substr(1, name.length - 2);\n                    name = ctx.stylize(name, 'name');\n                } else {\n                    name = name.replace(/'/g, \"\\\\'\")\n                        .replace(/\\\\\"/g, '\"')\n                        .replace(/(^\"|\"$)/g, \"'\");\n                    name = ctx.stylize(name, 'string');\n                }\n            }\n\n            return name + ': ' + str;\n        }\n\n\n        function reduceToSingleString(output, base, braces) {\n            var numLinesEst = 0;\n            var length = output.reduce(function(prev, cur) {\n                numLinesEst++;\n                if (cur.indexOf('\\n') >= 0) numLinesEst++;\n                return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n            }, 0);\n\n            if (length > 60) {\n                return braces[0] +\n                    (base === '' ? '' : base + '\\n ') +\n                    ' ' +\n                    output.join(',\\n  ') +\n                    ' ' +\n                    braces[1];\n            }\n\n            return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n        }\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n        function isArray(ar) {\n            return Array.isArray(ar);\n        }\n        exports.isArray = isArray;\n\n        function isBoolean(arg) {\n            return typeof arg === 'boolean';\n        }\n        exports.isBoolean = isBoolean;\n\n        function isNull(arg) {\n            return arg === null;\n        }\n        exports.isNull = isNull;\n\n        function isNullOrUndefined(arg) {\n            return arg == null;\n        }\n        exports.isNullOrUndefined = isNullOrUndefined;\n\n        function isNumber(arg) {\n            return typeof arg === 'number';\n        }\n        exports.isNumber = isNumber;\n\n        function isString(arg) {\n            return typeof arg === 'string';\n        }\n        exports.isString = isString;\n\n        function isSymbol(arg) {\n            return typeof arg === 'symbol';\n        }\n        exports.isSymbol = isSymbol;\n\n        function isUndefined(arg) {\n            return arg === void 0;\n        }\n        exports.isUndefined = isUndefined;\n\n        function isRegExp(re) {\n            return isObject(re) && objectToString(re) === '[object RegExp]';\n        }\n        exports.isRegExp = isRegExp;\n\n        function isObject(arg) {\n            return typeof arg === 'object' && arg !== null;\n        }\n        exports.isObject = isObject;\n\n        function isDate(d) {\n            return isObject(d) && objectToString(d) === '[object Date]';\n        }\n        exports.isDate = isDate;\n\n        function isError(e) {\n            return isObject(e) &&\n                (objectToString(e) === '[object Error]' || e instanceof Error);\n        }\n        exports.isError = isError;\n\n        function isFunction(arg) {\n            return typeof arg === 'function';\n        }\n        exports.isFunction = isFunction;\n\n        function isPrimitive(arg) {\n            return arg === null ||\n                typeof arg === 'boolean' ||\n                typeof arg === 'number' ||\n                typeof arg === 'string' ||\n                typeof arg === 'symbol' ||  // ES6 symbol\n                typeof arg === 'undefined';\n        }\n        exports.isPrimitive = isPrimitive;\n\n        exports.isBuffer = require('./support/isBuffer');\n\n        function objectToString(o) {\n            return Object.prototype.toString.call(o);\n        }\n\n\n        function pad(n) {\n            return n < 10 ? '0' + n.toString(10) : n.toString(10);\n        }\n\n\n        var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n            'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\n        function timestamp() {\n            var d = new Date();\n            var time = [pad(d.getHours()),\n                pad(d.getMinutes()),\n                pad(d.getSeconds())].join(':');\n            return [d.getDate(), months[d.getMonth()], time].join(' ');\n        }\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\n        exports.log = function() {\n            console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n        };\n\n\n        /**\n         * Inherit the prototype methods from one constructor into another.\n         *\n         * The Function.prototype.inherits from lang.js rewritten as a standalone\n         * function (not on Function.prototype). NOTE: If this file is to be loaded\n         * during bootstrapping this function needs to be rewritten using some native\n         * functions as prototype setup using normal JavaScript does not work as\n         * expected during bootstrapping (see mirror.js in r114903).\n         *\n         * @param {function} ctor Constructor function which needs to inherit the\n         *     prototype.\n         * @param {function} superCtor Constructor function to inherit prototype from.\n         */\n        exports.inherits = require('inherits');\n\n        exports._extend = function(origin, add) {\n            // Don't do anything if add isn't an object\n            if (!add || !isObject(add)) return origin;\n\n            var keys = Object.keys(add);\n            var i = keys.length;\n            while (i--) {\n                origin[keys[i]] = add[keys[i]];\n            }\n            return origin;\n        };\n\n        function hasOwnProperty(obj, prop) {\n            return Object.prototype.hasOwnProperty.call(obj, prop);\n        }\n\n    },{\"./support/isBuffer\":88,\"inherits\":86}],90:[function(require,module,exports){\n        module.exports = XMLHttpRequest;\n\n    },{}],\"bignumber.js\":[function(require,module,exports){\n        /*! bignumber.js v2.0.7 https://github.com/MikeMcl/bignumber.js/LICENCE */\n\n        ;(function (global) {\n            'use strict';\n\n            /*\n      bignumber.js v2.0.7\n      A JavaScript library for arbitrary-precision arithmetic.\n      https://github.com/MikeMcl/bignumber.js\n      Copyright (c) 2015 Michael Mclaughlin <M8ch88l@gmail.com>\n      MIT Expat Licence\n    */\n\n\n            var BigNumber, crypto, parseNumeric,\n                isNumeric = /^-?(\\d+(\\.\\d*)?|\\.\\d+)(e[+-]?\\d+)?$/i,\n                mathceil = Math.ceil,\n                mathfloor = Math.floor,\n                notBool = ' not a boolean or binary digit',\n                roundingMode = 'rounding mode',\n                tooManyDigits = 'number type has more than 15 significant digits',\n                ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_',\n                BASE = 1e14,\n                LOG_BASE = 14,\n                MAX_SAFE_INTEGER = 0x1fffffffffffff,         // 2^53 - 1\n                // MAX_INT32 = 0x7fffffff,                   // 2^31 - 1\n                POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13],\n                SQRT_BASE = 1e7,\n\n                /*\n         * The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and\n         * the arguments to toExponential, toFixed, toFormat, and toPrecision, beyond which an\n         * exception is thrown (if ERRORS is true).\n         */\n                MAX = 1E9;                                   // 0 to MAX_INT32\n\n\n            /*\n     * Create and return a BigNumber constructor.\n     */\n            function another(configObj) {\n                var div,\n\n                    // id tracks the caller function, so its name can be included in error messages.\n                    id = 0,\n                    P = BigNumber.prototype,\n                    ONE = new BigNumber(1),\n\n\n                    /********************************* EDITABLE DEFAULTS **********************************/\n\n\n                    /*\n             * The default values below must be integers within the inclusive ranges stated.\n             * The values can also be changed at run-time using BigNumber.config.\n             */\n\n                    // The maximum number of decimal places for operations involving division.\n                    DECIMAL_PLACES = 20,                     // 0 to MAX\n\n                    /*\n             * The rounding mode used when rounding to the above decimal places, and when using\n             * toExponential, toFixed, toFormat and toPrecision, and round (default value).\n             * UP         0 Away from zero.\n             * DOWN       1 Towards zero.\n             * CEIL       2 Towards +Infinity.\n             * FLOOR      3 Towards -Infinity.\n             * HALF_UP    4 Towards nearest neighbour. If equidistant, up.\n             * HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.\n             * HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.\n             * HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.\n             * HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.\n             */\n                    ROUNDING_MODE = 4,                       // 0 to 8\n\n                    // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS]\n\n                    // The exponent value at and beneath which toString returns exponential notation.\n                    // Number type: -7\n                    TO_EXP_NEG = -7,                         // 0 to -MAX\n\n                    // The exponent value at and above which toString returns exponential notation.\n                    // Number type: 21\n                    TO_EXP_POS = 21,                         // 0 to MAX\n\n                    // RANGE : [MIN_EXP, MAX_EXP]\n\n                    // The minimum exponent value, beneath which underflow to zero occurs.\n                    // Number type: -324  (5e-324)\n                    MIN_EXP = -1e7,                          // -1 to -MAX\n\n                    // The maximum exponent value, above which overflow to Infinity occurs.\n                    // Number type:  308  (1.7976931348623157e+308)\n                    // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow.\n                    MAX_EXP = 1e7,                           // 1 to MAX\n\n                    // Whether BigNumber Errors are ever thrown.\n                    ERRORS = true,                           // true or false\n\n                    // Change to intValidatorNoErrors if ERRORS is false.\n                    isValidInt = intValidatorWithErrors,     // intValidatorWithErrors/intValidatorNoErrors\n\n                    // Whether to use cryptographically-secure random number generation, if available.\n                    CRYPTO = false,                          // true or false\n\n                    /*\n             * The modulo mode used when calculating the modulus: a mod n.\n             * The quotient (q = a / n) is calculated according to the corresponding rounding mode.\n             * The remainder (r) is calculated as: r = a - n * q.\n             *\n             * UP        0 The remainder is positive if the dividend is negative, else is negative.\n             * DOWN      1 The remainder has the same sign as the dividend.\n             *             This modulo mode is commonly known as 'truncated division' and is\n             *             equivalent to (a % n) in JavaScript.\n             * FLOOR     3 The remainder has the same sign as the divisor (Python %).\n             * HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function.\n             * EUCLID    9 Euclidian division. q = sign(n) * floor(a / abs(n)).\n             *             The remainder is always positive.\n             *\n             * The truncated division, floored division, Euclidian division and IEEE 754 remainder\n             * modes are commonly used for the modulus operation.\n             * Although the other rounding modes can also be used, they may not give useful results.\n             */\n                    MODULO_MODE = 1,                         // 0 to 9\n\n                    // The maximum number of significant digits of the result of the toPower operation.\n                    // If POW_PRECISION is 0, there will be unlimited significant digits.\n                    POW_PRECISION = 100,                     // 0 to MAX\n\n                    // The format specification used by the BigNumber.prototype.toFormat method.\n                    FORMAT = {\n                        decimalSeparator: '.',\n                        groupSeparator: ',',\n                        groupSize: 3,\n                        secondaryGroupSize: 0,\n                        fractionGroupSeparator: '\\xA0',      // non-breaking space\n                        fractionGroupSize: 0\n                    };\n\n\n                /******************************************************************************************/\n\n\n                // CONSTRUCTOR\n\n\n                /*\n         * The BigNumber constructor and exported function.\n         * Create and return a new instance of a BigNumber object.\n         *\n         * n {number|string|BigNumber} A numeric value.\n         * [b] {number} The base of n. Integer, 2 to 64 inclusive.\n         */\n                function BigNumber( n, b ) {\n                    var c, e, i, num, len, str,\n                        x = this;\n\n                    // Enable constructor usage without new.\n                    if ( !( x instanceof BigNumber ) ) {\n\n                        // 'BigNumber() constructor call without new: {n}'\n                        if (ERRORS) raise( 26, 'constructor call without new', n );\n                        return new BigNumber( n, b );\n                    }\n\n                    // 'new BigNumber() base not an integer: {b}'\n                    // 'new BigNumber() base out of range: {b}'\n                    if ( b == null || !isValidInt( b, 2, 64, id, 'base' ) ) {\n\n                        // Duplicate.\n                        if ( n instanceof BigNumber ) {\n                            x.s = n.s;\n                            x.e = n.e;\n                            x.c = ( n = n.c ) ? n.slice() : n;\n                            id = 0;\n                            return;\n                        }\n\n                        if ( ( num = typeof n == 'number' ) && n * 0 == 0 ) {\n                            x.s = 1 / n < 0 ? ( n = -n, -1 ) : 1;\n\n                            // Fast path for integers.\n                            if ( n === ~~n ) {\n                                for ( e = 0, i = n; i >= 10; i /= 10, e++ );\n                                x.e = e;\n                                x.c = [n];\n                                id = 0;\n                                return;\n                            }\n\n                            str = n + '';\n                        } else {\n                            if ( !isNumeric.test( str = n + '' ) ) return parseNumeric( x, str, num );\n                            x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1;\n                        }\n                    } else {\n                        b = b | 0;\n                        str = n + '';\n\n                        // Ensure return value is rounded to DECIMAL_PLACES as with other bases.\n                        // Allow exponential notation to be used with base 10 argument.\n                        if ( b == 10 ) {\n                            x = new BigNumber( n instanceof BigNumber ? n : str );\n                            return round( x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE );\n                        }\n\n                        // Avoid potential interpretation of Infinity and NaN as base 44+ values.\n                        // Any number in exponential form will fail due to the [Ee][+-].\n                        if ( ( num = typeof n == 'number' ) && n * 0 != 0 ||\n                            !( new RegExp( '^-?' + ( c = '[' + ALPHABET.slice( 0, b ) + ']+' ) +\n                                '(?:\\\\.' + c + ')?$',b < 37 ? 'i' : '' ) ).test(str) ) {\n                            return parseNumeric( x, str, num, b );\n                        }\n\n                        if (num) {\n                            x.s = 1 / n < 0 ? ( str = str.slice(1), -1 ) : 1;\n\n                            if ( ERRORS && str.replace( /^0\\.0*|\\./, '' ).length > 15 ) {\n\n                                // 'new BigNumber() number type has more than 15 significant digits: {n}'\n                                raise( id, tooManyDigits, n );\n                            }\n\n                            // Prevent later check for length on converted number.\n                            num = false;\n                        } else {\n                            x.s = str.charCodeAt(0) === 45 ? ( str = str.slice(1), -1 ) : 1;\n                        }\n\n                        str = convertBase( str, 10, b, x.s );\n                    }\n\n                    // Decimal point?\n                    if ( ( e = str.indexOf('.') ) > -1 ) str = str.replace( '.', '' );\n\n                    // Exponential form?\n                    if ( ( i = str.search( /e/i ) ) > 0 ) {\n\n                        // Determine exponent.\n                        if ( e < 0 ) e = i;\n                        e += +str.slice( i + 1 );\n                        str = str.substring( 0, i );\n                    } else if ( e < 0 ) {\n\n                        // Integer.\n                        e = str.length;\n                    }\n\n                    // Determine leading zeros.\n                    for ( i = 0; str.charCodeAt(i) === 48; i++ );\n\n                    // Determine trailing zeros.\n                    for ( len = str.length; str.charCodeAt(--len) === 48; );\n                    str = str.slice( i, len + 1 );\n\n                    if (str) {\n                        len = str.length;\n\n                        // Disallow numbers with over 15 significant digits if number type.\n                        // 'new BigNumber() number type has more than 15 significant digits: {n}'\n                        if ( num && ERRORS && len > 15 ) raise( id, tooManyDigits, x.s * n );\n\n                        e = e - i - 1;\n\n                        // Overflow?\n                        if ( e > MAX_EXP ) {\n\n                            // Infinity.\n                            x.c = x.e = null;\n\n                            // Underflow?\n                        } else if ( e < MIN_EXP ) {\n\n                            // Zero.\n                            x.c = [ x.e = 0 ];\n                        } else {\n                            x.e = e;\n                            x.c = [];\n\n                            // Transform base\n\n                            // e is the base 10 exponent.\n                            // i is where to slice str to get the first element of the coefficient array.\n                            i = ( e + 1 ) % LOG_BASE;\n                            if ( e < 0 ) i += LOG_BASE;\n\n                            if ( i < len ) {\n                                if (i) x.c.push( +str.slice( 0, i ) );\n\n                                for ( len -= LOG_BASE; i < len; ) {\n                                    x.c.push( +str.slice( i, i += LOG_BASE ) );\n                                }\n\n                                str = str.slice(i);\n                                i = LOG_BASE - str.length;\n                            } else {\n                                i -= len;\n                            }\n\n                            for ( ; i--; str += '0' );\n                            x.c.push( +str );\n                        }\n                    } else {\n\n                        // Zero.\n                        x.c = [ x.e = 0 ];\n                    }\n\n                    id = 0;\n                }\n\n\n                // CONSTRUCTOR PROPERTIES\n\n\n                BigNumber.another = another;\n\n                BigNumber.ROUND_UP = 0;\n                BigNumber.ROUND_DOWN = 1;\n                BigNumber.ROUND_CEIL = 2;\n                BigNumber.ROUND_FLOOR = 3;\n                BigNumber.ROUND_HALF_UP = 4;\n                BigNumber.ROUND_HALF_DOWN = 5;\n                BigNumber.ROUND_HALF_EVEN = 6;\n                BigNumber.ROUND_HALF_CEIL = 7;\n                BigNumber.ROUND_HALF_FLOOR = 8;\n                BigNumber.EUCLID = 9;\n\n\n                /*\n         * Configure infrequently-changing library-wide settings.\n         *\n         * Accept an object or an argument list, with one or many of the following properties or\n         * parameters respectively:\n         *\n         *   DECIMAL_PLACES  {number}  Integer, 0 to MAX inclusive\n         *   ROUNDING_MODE   {number}  Integer, 0 to 8 inclusive\n         *   EXPONENTIAL_AT  {number|number[]}  Integer, -MAX to MAX inclusive or\n         *                                      [integer -MAX to 0 incl., 0 to MAX incl.]\n         *   RANGE           {number|number[]}  Non-zero integer, -MAX to MAX inclusive or\n         *                                      [integer -MAX to -1 incl., integer 1 to MAX incl.]\n         *   ERRORS          {boolean|number}   true, false, 1 or 0\n         *   CRYPTO          {boolean|number}   true, false, 1 or 0\n         *   MODULO_MODE     {number}           0 to 9 inclusive\n         *   POW_PRECISION   {number}           0 to MAX inclusive\n         *   FORMAT          {object}           See BigNumber.prototype.toFormat\n         *      decimalSeparator       {string}\n         *      groupSeparator         {string}\n         *      groupSize              {number}\n         *      secondaryGroupSize     {number}\n         *      fractionGroupSeparator {string}\n         *      fractionGroupSize      {number}\n         *\n         * (The values assigned to the above FORMAT object properties are not checked for validity.)\n         *\n         * E.g.\n         * BigNumber.config(20, 4) is equivalent to\n         * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 })\n         *\n         * Ignore properties/parameters set to null or undefined.\n         * Return an object with the properties current values.\n         */\n                BigNumber.config = function () {\n                    var v, p,\n                        i = 0,\n                        r = {},\n                        a = arguments,\n                        o = a[0],\n                        has = o && typeof o == 'object'\n                            ? function () { if ( o.hasOwnProperty(p) ) return ( v = o[p] ) != null; }\n                            : function () { if ( a.length > i ) return ( v = a[i++] ) != null; };\n\n                    // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive.\n                    // 'config() DECIMAL_PLACES not an integer: {v}'\n                    // 'config() DECIMAL_PLACES out of range: {v}'\n                    if ( has( p = 'DECIMAL_PLACES' ) && isValidInt( v, 0, MAX, 2, p ) ) {\n                        DECIMAL_PLACES = v | 0;\n                    }\n                    r[p] = DECIMAL_PLACES;\n\n                    // ROUNDING_MODE {number} Integer, 0 to 8 inclusive.\n                    // 'config() ROUNDING_MODE not an integer: {v}'\n                    // 'config() ROUNDING_MODE out of range: {v}'\n                    if ( has( p = 'ROUNDING_MODE' ) && isValidInt( v, 0, 8, 2, p ) ) {\n                        ROUNDING_MODE = v | 0;\n                    }\n                    r[p] = ROUNDING_MODE;\n\n                    // EXPONENTIAL_AT {number|number[]}\n                    // Integer, -MAX to MAX inclusive or [integer -MAX to 0 inclusive, 0 to MAX inclusive].\n                    // 'config() EXPONENTIAL_AT not an integer: {v}'\n                    // 'config() EXPONENTIAL_AT out of range: {v}'\n                    if ( has( p = 'EXPONENTIAL_AT' ) ) {\n\n                        if ( isArray(v) ) {\n                            if ( isValidInt( v[0], -MAX, 0, 2, p ) && isValidInt( v[1], 0, MAX, 2, p ) ) {\n                                TO_EXP_NEG = v[0] | 0;\n                                TO_EXP_POS = v[1] | 0;\n                            }\n                        } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) {\n                            TO_EXP_NEG = -( TO_EXP_POS = ( v < 0 ? -v : v ) | 0 );\n                        }\n                    }\n                    r[p] = [ TO_EXP_NEG, TO_EXP_POS ];\n\n                    // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or\n                    // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive].\n                    // 'config() RANGE not an integer: {v}'\n                    // 'config() RANGE cannot be zero: {v}'\n                    // 'config() RANGE out of range: {v}'\n                    if ( has( p = 'RANGE' ) ) {\n\n                        if ( isArray(v) ) {\n                            if ( isValidInt( v[0], -MAX, -1, 2, p ) && isValidInt( v[1], 1, MAX, 2, p ) ) {\n                                MIN_EXP = v[0] | 0;\n                                MAX_EXP = v[1] | 0;\n                            }\n                        } else if ( isValidInt( v, -MAX, MAX, 2, p ) ) {\n                            if ( v | 0 ) MIN_EXP = -( MAX_EXP = ( v < 0 ? -v : v ) | 0 );\n                            else if (ERRORS) raise( 2, p + ' cannot be zero', v );\n                        }\n                    }\n                    r[p] = [ MIN_EXP, MAX_EXP ];\n\n                    // ERRORS {boolean|number} true, false, 1 or 0.\n                    // 'config() ERRORS not a boolean or binary digit: {v}'\n                    if ( has( p = 'ERRORS' ) ) {\n\n                        if ( v === !!v || v === 1 || v === 0 ) {\n                            id = 0;\n                            isValidInt = ( ERRORS = !!v ) ? intValidatorWithErrors : intValidatorNoErrors;\n                        } else if (ERRORS) {\n                            raise( 2, p + notBool, v );\n                        }\n                    }\n                    r[p] = ERRORS;\n\n                    // CRYPTO {boolean|number} true, false, 1 or 0.\n                    // 'config() CRYPTO not a boolean or binary digit: {v}'\n                    // 'config() crypto unavailable: {crypto}'\n                    if ( has( p = 'CRYPTO' ) ) {\n\n                        if ( v === !!v || v === 1 || v === 0 ) {\n                            CRYPTO = !!( v && crypto && typeof crypto == 'object' );\n                            if ( v && !CRYPTO && ERRORS ) raise( 2, 'crypto unavailable', crypto );\n                        } else if (ERRORS) {\n                            raise( 2, p + notBool, v );\n                        }\n                    }\n                    r[p] = CRYPTO;\n\n                    // MODULO_MODE {number} Integer, 0 to 9 inclusive.\n                    // 'config() MODULO_MODE not an integer: {v}'\n                    // 'config() MODULO_MODE out of range: {v}'\n                    if ( has( p = 'MODULO_MODE' ) && isValidInt( v, 0, 9, 2, p ) ) {\n                        MODULO_MODE = v | 0;\n                    }\n                    r[p] = MODULO_MODE;\n\n                    // POW_PRECISION {number} Integer, 0 to MAX inclusive.\n                    // 'config() POW_PRECISION not an integer: {v}'\n                    // 'config() POW_PRECISION out of range: {v}'\n                    if ( has( p = 'POW_PRECISION' ) && isValidInt( v, 0, MAX, 2, p ) ) {\n                        POW_PRECISION = v | 0;\n                    }\n                    r[p] = POW_PRECISION;\n\n                    // FORMAT {object}\n                    // 'config() FORMAT not an object: {v}'\n                    if ( has( p = 'FORMAT' ) ) {\n\n                        if ( typeof v == 'object' ) {\n                            FORMAT = v;\n                        } else if (ERRORS) {\n                            raise( 2, p + ' not an object', v );\n                        }\n                    }\n                    r[p] = FORMAT;\n\n                    return r;\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the maximum of the arguments.\n         *\n         * arguments {number|string|BigNumber}\n         */\n                BigNumber.max = function () { return maxOrMin( arguments, P.lt ); };\n\n\n                /*\n         * Return a new BigNumber whose value is the minimum of the arguments.\n         *\n         * arguments {number|string|BigNumber}\n         */\n                BigNumber.min = function () { return maxOrMin( arguments, P.gt ); };\n\n\n                /*\n         * Return a new BigNumber with a random value equal to or greater than 0 and less than 1,\n         * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing\n         * zeros are produced).\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         *\n         * 'random() decimal places not an integer: {dp}'\n         * 'random() decimal places out of range: {dp}'\n         * 'random() crypto unavailable: {crypto}'\n         */\n                BigNumber.random = (function () {\n                    var pow2_53 = 0x20000000000000;\n\n                    // Return a 53 bit integer n, where 0 <= n < 9007199254740992.\n                    // Check if Math.random() produces more than 32 bits of randomness.\n                    // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits.\n                    // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1.\n                    var random53bitInt = (Math.random() * pow2_53) & 0x1fffff\n                        ? function () { return mathfloor( Math.random() * pow2_53 ); }\n                        : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) +\n                            (Math.random() * 0x800000 | 0); };\n\n                    return function (dp) {\n                        var a, b, e, k, v,\n                            i = 0,\n                            c = [],\n                            rand = new BigNumber(ONE);\n\n                        dp = dp == null || !isValidInt( dp, 0, MAX, 14 ) ? DECIMAL_PLACES : dp | 0;\n                        k = mathceil( dp / LOG_BASE );\n\n                        if (CRYPTO) {\n\n                            // Browsers supporting crypto.getRandomValues.\n                            if ( crypto && crypto.getRandomValues ) {\n\n                                a = crypto.getRandomValues( new Uint32Array( k *= 2 ) );\n\n                                for ( ; i < k; ) {\n\n                                    // 53 bits:\n                                    // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2)\n                                    // 11111 11111111 11111111 11111111 11100000 00000000 00000000\n                                    // ((Math.pow(2, 32) - 1) >>> 11).toString(2)\n                                    //                                     11111 11111111 11111111\n                                    // 0x20000 is 2^21.\n                                    v = a[i] * 0x20000 + (a[i + 1] >>> 11);\n\n                                    // Rejection sampling:\n                                    // 0 <= v < 9007199254740992\n                                    // Probability that v >= 9e15, is\n                                    // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251\n                                    if ( v >= 9e15 ) {\n                                        b = crypto.getRandomValues( new Uint32Array(2) );\n                                        a[i] = b[0];\n                                        a[i + 1] = b[1];\n                                    } else {\n\n                                        // 0 <= v <= 8999999999999999\n                                        // 0 <= (v % 1e14) <= 99999999999999\n                                        c.push( v % 1e14 );\n                                        i += 2;\n                                    }\n                                }\n                                i = k / 2;\n\n                                // Node.js supporting crypto.randomBytes.\n                            } else if ( crypto && crypto.randomBytes ) {\n\n                                // buffer\n                                a = crypto.randomBytes( k *= 7 );\n\n                                for ( ; i < k; ) {\n\n                                    // 0x1000000000000 is 2^48, 0x10000000000 is 2^40\n                                    // 0x100000000 is 2^32, 0x1000000 is 2^24\n                                    // 11111 11111111 11111111 11111111 11111111 11111111 11111111\n                                    // 0 <= v < 9007199254740992\n                                    v = ( ( a[i] & 31 ) * 0x1000000000000 ) + ( a[i + 1] * 0x10000000000 ) +\n                                        ( a[i + 2] * 0x100000000 ) + ( a[i + 3] * 0x1000000 ) +\n                                        ( a[i + 4] << 16 ) + ( a[i + 5] << 8 ) + a[i + 6];\n\n                                    if ( v >= 9e15 ) {\n                                        crypto.randomBytes(7).copy( a, i );\n                                    } else {\n\n                                        // 0 <= (v % 1e14) <= 99999999999999\n                                        c.push( v % 1e14 );\n                                        i += 7;\n                                    }\n                                }\n                                i = k / 7;\n                            } else if (ERRORS) {\n                                raise( 14, 'crypto unavailable', crypto );\n                            }\n                        }\n\n                        // Use Math.random: CRYPTO is false or crypto is unavailable and ERRORS is false.\n                        if (!i) {\n\n                            for ( ; i < k; ) {\n                                v = random53bitInt();\n                                if ( v < 9e15 ) c[i++] = v % 1e14;\n                            }\n                        }\n\n                        k = c[--i];\n                        dp %= LOG_BASE;\n\n                        // Convert trailing digits to zeros according to dp.\n                        if ( k && dp ) {\n                            v = POWS_TEN[LOG_BASE - dp];\n                            c[i] = mathfloor( k / v ) * v;\n                        }\n\n                        // Remove trailing elements which are zero.\n                        for ( ; c[i] === 0; c.pop(), i-- );\n\n                        // Zero?\n                        if ( i < 0 ) {\n                            c = [ e = 0 ];\n                        } else {\n\n                            // Remove leading elements which are zero and adjust exponent accordingly.\n                            for ( e = -1 ; c[0] === 0; c.shift(), e -= LOG_BASE);\n\n                            // Count the digits of the first element of c to determine leading zeros, and...\n                            for ( i = 1, v = c[0]; v >= 10; v /= 10, i++);\n\n                            // adjust the exponent accordingly.\n                            if ( i < LOG_BASE ) e -= LOG_BASE - i;\n                        }\n\n                        rand.e = e;\n                        rand.c = c;\n                        return rand;\n                    };\n                })();\n\n\n                // PRIVATE FUNCTIONS\n\n\n                // Convert a numeric string of baseIn to a numeric string of baseOut.\n                function convertBase( str, baseOut, baseIn, sign ) {\n                    var d, e, k, r, x, xc, y,\n                        i = str.indexOf( '.' ),\n                        dp = DECIMAL_PLACES,\n                        rm = ROUNDING_MODE;\n\n                    if ( baseIn < 37 ) str = str.toLowerCase();\n\n                    // Non-integer.\n                    if ( i >= 0 ) {\n                        k = POW_PRECISION;\n\n                        // Unlimited precision.\n                        POW_PRECISION = 0;\n                        str = str.replace( '.', '' );\n                        y = new BigNumber(baseIn);\n                        x = y.pow( str.length - i );\n                        POW_PRECISION = k;\n\n                        // Convert str as if an integer, then restore the fraction part by dividing the\n                        // result by its base raised to a power.\n                        y.c = toBaseOut( toFixedPoint( coeffToString( x.c ), x.e ), 10, baseOut );\n                        y.e = y.c.length;\n                    }\n\n                    // Convert the number as integer.\n                    xc = toBaseOut( str, baseIn, baseOut );\n                    e = k = xc.length;\n\n                    // Remove trailing zeros.\n                    for ( ; xc[--k] == 0; xc.pop() );\n                    if ( !xc[0] ) return '0';\n\n                    if ( i < 0 ) {\n                        --e;\n                    } else {\n                        x.c = xc;\n                        x.e = e;\n\n                        // sign is needed for correct rounding.\n                        x.s = sign;\n                        x = div( x, y, dp, rm, baseOut );\n                        xc = x.c;\n                        r = x.r;\n                        e = x.e;\n                    }\n\n                    d = e + dp + 1;\n\n                    // The rounding digit, i.e. the digit to the right of the digit that may be rounded up.\n                    i = xc[d];\n                    k = baseOut / 2;\n                    r = r || d < 0 || xc[d + 1] != null;\n\n                    r = rm < 4 ? ( i != null || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) )\n                        : i > k || i == k &&( rm == 4 || r || rm == 6 && xc[d - 1] & 1 ||\n                        rm == ( x.s < 0 ? 8 : 7 ) );\n\n                    if ( d < 1 || !xc[0] ) {\n\n                        // 1^-dp or 0.\n                        str = r ? toFixedPoint( '1', -dp ) : '0';\n                    } else {\n                        xc.length = d;\n\n                        if (r) {\n\n                            // Rounding up may mean the previous digit has to be rounded up and so on.\n                            for ( --baseOut; ++xc[--d] > baseOut; ) {\n                                xc[d] = 0;\n\n                                if ( !d ) {\n                                    ++e;\n                                    xc.unshift(1);\n                                }\n                            }\n                        }\n\n                        // Determine trailing zeros.\n                        for ( k = xc.length; !xc[--k]; );\n\n                        // E.g. [4, 11, 15] becomes 4bf.\n                        for ( i = 0, str = ''; i <= k; str += ALPHABET.charAt( xc[i++] ) );\n                        str = toFixedPoint( str, e );\n                    }\n\n                    // The caller will add the sign.\n                    return str;\n                }\n\n\n                // Perform division in the specified base. Called by div and convertBase.\n                div = (function () {\n\n                    // Assume non-zero x and k.\n                    function multiply( x, k, base ) {\n                        var m, temp, xlo, xhi,\n                            carry = 0,\n                            i = x.length,\n                            klo = k % SQRT_BASE,\n                            khi = k / SQRT_BASE | 0;\n\n                        for ( x = x.slice(); i--; ) {\n                            xlo = x[i] % SQRT_BASE;\n                            xhi = x[i] / SQRT_BASE | 0;\n                            m = khi * xlo + xhi * klo;\n                            temp = klo * xlo + ( ( m % SQRT_BASE ) * SQRT_BASE ) + carry;\n                            carry = ( temp / base | 0 ) + ( m / SQRT_BASE | 0 ) + khi * xhi;\n                            x[i] = temp % base;\n                        }\n\n                        if (carry) x.unshift(carry);\n\n                        return x;\n                    }\n\n                    function compare( a, b, aL, bL ) {\n                        var i, cmp;\n\n                        if ( aL != bL ) {\n                            cmp = aL > bL ? 1 : -1;\n                        } else {\n\n                            for ( i = cmp = 0; i < aL; i++ ) {\n\n                                if ( a[i] != b[i] ) {\n                                    cmp = a[i] > b[i] ? 1 : -1;\n                                    break;\n                                }\n                            }\n                        }\n                        return cmp;\n                    }\n\n                    function subtract( a, b, aL, base ) {\n                        var i = 0;\n\n                        // Subtract b from a.\n                        for ( ; aL--; ) {\n                            a[aL] -= i;\n                            i = a[aL] < b[aL] ? 1 : 0;\n                            a[aL] = i * base + a[aL] - b[aL];\n                        }\n\n                        // Remove leading zeros.\n                        for ( ; !a[0] && a.length > 1; a.shift() );\n                    }\n\n                    // x: dividend, y: divisor.\n                    return function ( x, y, dp, rm, base ) {\n                        var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0,\n                            yL, yz,\n                            s = x.s == y.s ? 1 : -1,\n                            xc = x.c,\n                            yc = y.c;\n\n                        // Either NaN, Infinity or 0?\n                        if ( !xc || !xc[0] || !yc || !yc[0] ) {\n\n                            return new BigNumber(\n\n                                // Return NaN if either NaN, or both Infinity or 0.\n                                !x.s || !y.s || ( xc ? yc && xc[0] == yc[0] : !yc ) ? NaN :\n\n                                    // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0.\n                                    xc && xc[0] == 0 || !yc ? s * 0 : s / 0\n                            );\n                        }\n\n                        q = new BigNumber(s);\n                        qc = q.c = [];\n                        e = x.e - y.e;\n                        s = dp + e + 1;\n\n                        if ( !base ) {\n                            base = BASE;\n                            e = bitFloor( x.e / LOG_BASE ) - bitFloor( y.e / LOG_BASE );\n                            s = s / LOG_BASE | 0;\n                        }\n\n                        // Result exponent may be one less then the current value of e.\n                        // The coefficients of the BigNumbers from convertBase may have trailing zeros.\n                        for ( i = 0; yc[i] == ( xc[i] || 0 ); i++ );\n                        if ( yc[i] > ( xc[i] || 0 ) ) e--;\n\n                        if ( s < 0 ) {\n                            qc.push(1);\n                            more = true;\n                        } else {\n                            xL = xc.length;\n                            yL = yc.length;\n                            i = 0;\n                            s += 2;\n\n                            // Normalise xc and yc so highest order digit of yc is >= base / 2.\n\n                            n = mathfloor( base / ( yc[0] + 1 ) );\n\n                            // Not necessary, but to handle odd bases where yc[0] == ( base / 2 ) - 1.\n                            // if ( n > 1 || n++ == 1 && yc[0] < base / 2 ) {\n                            if ( n > 1 ) {\n                                yc = multiply( yc, n, base );\n                                xc = multiply( xc, n, base );\n                                yL = yc.length;\n                                xL = xc.length;\n                            }\n\n                            xi = yL;\n                            rem = xc.slice( 0, yL );\n                            remL = rem.length;\n\n                            // Add zeros to make remainder as long as divisor.\n                            for ( ; remL < yL; rem[remL++] = 0 );\n                            yz = yc.slice();\n                            yz.unshift(0);\n                            yc0 = yc[0];\n                            if ( yc[1] >= base / 2 ) yc0++;\n                            // Not necessary, but to prevent trial digit n > base, when using base 3.\n                            // else if ( base == 3 && yc0 == 1 ) yc0 = 1 + 1e-15;\n\n                            do {\n                                n = 0;\n\n                                // Compare divisor and remainder.\n                                cmp = compare( yc, rem, yL, remL );\n\n                                // If divisor < remainder.\n                                if ( cmp < 0 ) {\n\n                                    // Calculate trial digit, n.\n\n                                    rem0 = rem[0];\n                                    if ( yL != remL ) rem0 = rem0 * base + ( rem[1] || 0 );\n\n                                    // n is how many times the divisor goes into the current remainder.\n                                    n = mathfloor( rem0 / yc0 );\n\n                                    //  Algorithm:\n                                    //  1. product = divisor * trial digit (n)\n                                    //  2. if product > remainder: product -= divisor, n--\n                                    //  3. remainder -= product\n                                    //  4. if product was < remainder at 2:\n                                    //    5. compare new remainder and divisor\n                                    //    6. If remainder > divisor: remainder -= divisor, n++\n\n                                    if ( n > 1 ) {\n\n                                        // n may be > base only when base is 3.\n                                        if (n >= base) n = base - 1;\n\n                                        // product = divisor * trial digit.\n                                        prod = multiply( yc, n, base );\n                                        prodL = prod.length;\n                                        remL = rem.length;\n\n                                        // Compare product and remainder.\n                                        // If product > remainder.\n                                        // Trial digit n too high.\n                                        // n is 1 too high about 5% of the time, and is not known to have\n                                        // ever been more than 1 too high.\n                                        while ( compare( prod, rem, prodL, remL ) == 1 ) {\n                                            n--;\n\n                                            // Subtract divisor from product.\n                                            subtract( prod, yL < prodL ? yz : yc, prodL, base );\n                                            prodL = prod.length;\n                                            cmp = 1;\n                                        }\n                                    } else {\n\n                                        // n is 0 or 1, cmp is -1.\n                                        // If n is 0, there is no need to compare yc and rem again below,\n                                        // so change cmp to 1 to avoid it.\n                                        // If n is 1, leave cmp as -1, so yc and rem are compared again.\n                                        if ( n == 0 ) {\n\n                                            // divisor < remainder, so n must be at least 1.\n                                            cmp = n = 1;\n                                        }\n\n                                        // product = divisor\n                                        prod = yc.slice();\n                                        prodL = prod.length;\n                                    }\n\n                                    if ( prodL < remL ) prod.unshift(0);\n\n                                    // Subtract product from remainder.\n                                    subtract( rem, prod, remL, base );\n                                    remL = rem.length;\n\n                                    // If product was < remainder.\n                                    if ( cmp == -1 ) {\n\n                                        // Compare divisor and new remainder.\n                                        // If divisor < new remainder, subtract divisor from remainder.\n                                        // Trial digit n too low.\n                                        // n is 1 too low about 5% of the time, and very rarely 2 too low.\n                                        while ( compare( yc, rem, yL, remL ) < 1 ) {\n                                            n++;\n\n                                            // Subtract divisor from remainder.\n                                            subtract( rem, yL < remL ? yz : yc, remL, base );\n                                            remL = rem.length;\n                                        }\n                                    }\n                                } else if ( cmp === 0 ) {\n                                    n++;\n                                    rem = [0];\n                                } // else cmp === 1 and n will be 0\n\n                                // Add the next digit, n, to the result array.\n                                qc[i++] = n;\n\n                                // Update the remainder.\n                                if ( rem[0] ) {\n                                    rem[remL++] = xc[xi] || 0;\n                                } else {\n                                    rem = [ xc[xi] ];\n                                    remL = 1;\n                                }\n                            } while ( ( xi++ < xL || rem[0] != null ) && s-- );\n\n                            more = rem[0] != null;\n\n                            // Leading zero?\n                            if ( !qc[0] ) qc.shift();\n                        }\n\n                        if ( base == BASE ) {\n\n                            // To calculate q.e, first get the number of digits of qc[0].\n                            for ( i = 1, s = qc[0]; s >= 10; s /= 10, i++ );\n                            round( q, dp + ( q.e = i + e * LOG_BASE - 1 ) + 1, rm, more );\n\n                            // Caller is convertBase.\n                        } else {\n                            q.e = e;\n                            q.r = +more;\n                        }\n\n                        return q;\n                    };\n                })();\n\n\n                /*\n         * Return a string representing the value of BigNumber n in fixed-point or exponential\n         * notation rounded to the specified decimal places or significant digits.\n         *\n         * n is a BigNumber.\n         * i is the index of the last digit required (i.e. the digit that may be rounded up).\n         * rm is the rounding mode.\n         * caller is caller id: toExponential 19, toFixed 20, toFormat 21, toPrecision 24.\n         */\n                function format( n, i, rm, caller ) {\n                    var c0, e, ne, len, str;\n\n                    rm = rm != null && isValidInt( rm, 0, 8, caller, roundingMode )\n                        ? rm | 0 : ROUNDING_MODE;\n\n                    if ( !n.c ) return n.toString();\n                    c0 = n.c[0];\n                    ne = n.e;\n\n                    if ( i == null ) {\n                        str = coeffToString( n.c );\n                        str = caller == 19 || caller == 24 && ne <= TO_EXP_NEG\n                            ? toExponential( str, ne )\n                            : toFixedPoint( str, ne );\n                    } else {\n                        n = round( new BigNumber(n), i, rm );\n\n                        // n.e may have changed if the value was rounded up.\n                        e = n.e;\n\n                        str = coeffToString( n.c );\n                        len = str.length;\n\n                        // toPrecision returns exponential notation if the number of significant digits\n                        // specified is less than the number of digits necessary to represent the integer\n                        // part of the value in fixed-point notation.\n\n                        // Exponential notation.\n                        if ( caller == 19 || caller == 24 && ( i <= e || e <= TO_EXP_NEG ) ) {\n\n                            // Append zeros?\n                            for ( ; len < i; str += '0', len++ );\n                            str = toExponential( str, e );\n\n                            // Fixed-point notation.\n                        } else {\n                            i -= ne;\n                            str = toFixedPoint( str, e );\n\n                            // Append zeros?\n                            if ( e + 1 > len ) {\n                                if ( --i > 0 ) for ( str += '.'; i--; str += '0' );\n                            } else {\n                                i += e - len;\n                                if ( i > 0 ) {\n                                    if ( e + 1 == len ) str += '.';\n                                    for ( ; i--; str += '0' );\n                                }\n                            }\n                        }\n                    }\n\n                    return n.s < 0 && c0 ? '-' + str : str;\n                }\n\n\n                // Handle BigNumber.max and BigNumber.min.\n                function maxOrMin( args, method ) {\n                    var m, n,\n                        i = 0;\n\n                    if ( isArray( args[0] ) ) args = args[0];\n                    m = new BigNumber( args[0] );\n\n                    for ( ; ++i < args.length; ) {\n                        n = new BigNumber( args[i] );\n\n                        // If any number is NaN, return NaN.\n                        if ( !n.s ) {\n                            m = n;\n                            break;\n                        } else if ( method.call( m, n ) ) {\n                            m = n;\n                        }\n                    }\n\n                    return m;\n                }\n\n\n                /*\n         * Return true if n is an integer in range, otherwise throw.\n         * Use for argument validation when ERRORS is true.\n         */\n                function intValidatorWithErrors( n, min, max, caller, name ) {\n                    if ( n < min || n > max || n != truncate(n) ) {\n                        raise( caller, ( name || 'decimal places' ) +\n                            ( n < min || n > max ? ' out of range' : ' not an integer' ), n );\n                    }\n\n                    return true;\n                }\n\n\n                /*\n         * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP.\n         * Called by minus, plus and times.\n         */\n                function normalise( n, c, e ) {\n                    var i = 1,\n                        j = c.length;\n\n                    // Remove trailing zeros.\n                    for ( ; !c[--j]; c.pop() );\n\n                    // Calculate the base 10 exponent. First get the number of digits of c[0].\n                    for ( j = c[0]; j >= 10; j /= 10, i++ );\n\n                    // Overflow?\n                    if ( ( e = i + e * LOG_BASE - 1 ) > MAX_EXP ) {\n\n                        // Infinity.\n                        n.c = n.e = null;\n\n                        // Underflow?\n                    } else if ( e < MIN_EXP ) {\n\n                        // Zero.\n                        n.c = [ n.e = 0 ];\n                    } else {\n                        n.e = e;\n                        n.c = c;\n                    }\n\n                    return n;\n                }\n\n\n                // Handle values that fail the validity test in BigNumber.\n                parseNumeric = (function () {\n                    var basePrefix = /^(-?)0([xbo])/i,\n                        dotAfter = /^([^.]+)\\.$/,\n                        dotBefore = /^\\.([^.]+)$/,\n                        isInfinityOrNaN = /^-?(Infinity|NaN)$/,\n                        whitespaceOrPlus = /^\\s*\\+|^\\s+|\\s+$/g;\n\n                    return function ( x, str, num, b ) {\n                        var base,\n                            s = num ? str : str.replace( whitespaceOrPlus, '' );\n\n                        // No exception on ±Infinity or NaN.\n                        if ( isInfinityOrNaN.test(s) ) {\n                            x.s = isNaN(s) ? null : s < 0 ? -1 : 1;\n                        } else {\n                            if ( !num ) {\n\n                                // basePrefix = /^(-?)0([xbo])(?=\\w[\\w.]*$)/i\n                                s = s.replace( basePrefix, function ( m, p1, p2 ) {\n                                    base = ( p2 = p2.toLowerCase() ) == 'x' ? 16 : p2 == 'b' ? 2 : 8;\n                                    return !b || b == base ? p1 : m;\n                                });\n\n                                if (b) {\n                                    base = b;\n\n                                    // E.g. '1.' to '1', '.1' to '0.1'\n                                    s = s.replace( dotAfter, '$1' ).replace( dotBefore, '0.$1' );\n                                }\n\n                                if ( str != s ) return new BigNumber( s, base );\n                            }\n\n                            // 'new BigNumber() not a number: {n}'\n                            // 'new BigNumber() not a base {b} number: {n}'\n                            if (ERRORS) raise( id, 'not a' + ( b ? ' base ' + b : '' ) + ' number', str );\n                            x.s = null;\n                        }\n\n                        x.c = x.e = null;\n                        id = 0;\n                    }\n                })();\n\n\n                // Throw a BigNumber Error.\n                function raise( caller, msg, val ) {\n                    var error = new Error( [\n                        'new BigNumber',     // 0\n                        'cmp',               // 1\n                        'config',            // 2\n                        'div',               // 3\n                        'divToInt',          // 4\n                        'eq',                // 5\n                        'gt',                // 6\n                        'gte',               // 7\n                        'lt',                // 8\n                        'lte',               // 9\n                        'minus',             // 10\n                        'mod',               // 11\n                        'plus',              // 12\n                        'precision',         // 13\n                        'random',            // 14\n                        'round',             // 15\n                        'shift',             // 16\n                        'times',             // 17\n                        'toDigits',          // 18\n                        'toExponential',     // 19\n                        'toFixed',           // 20\n                        'toFormat',          // 21\n                        'toFraction',        // 22\n                        'pow',               // 23\n                        'toPrecision',       // 24\n                        'toString',          // 25\n                        'BigNumber'          // 26\n                    ][caller] + '() ' + msg + ': ' + val );\n\n                    error.name = 'BigNumber Error';\n                    id = 0;\n                    throw error;\n                }\n\n\n                /*\n         * Round x to sd significant digits using rounding mode rm. Check for over/under-flow.\n         * If r is truthy, it is known that there are more digits after the rounding digit.\n         */\n                function round( x, sd, rm, r ) {\n                    var d, i, j, k, n, ni, rd,\n                        xc = x.c,\n                        pows10 = POWS_TEN;\n\n                    // if x is not Infinity or NaN...\n                    if (xc) {\n\n                        // rd is the rounding digit, i.e. the digit after the digit that may be rounded up.\n                        // n is a base 1e14 number, the value of the element of array x.c containing rd.\n                        // ni is the index of n within x.c.\n                        // d is the number of digits of n.\n                        // i is the index of rd within n including leading zeros.\n                        // j is the actual index of rd within n (if < 0, rd is a leading zero).\n                        out: {\n\n                            // Get the number of digits of the first element of xc.\n                            for ( d = 1, k = xc[0]; k >= 10; k /= 10, d++ );\n                            i = sd - d;\n\n                            // If the rounding digit is in the first element of xc...\n                            if ( i < 0 ) {\n                                i += LOG_BASE;\n                                j = sd;\n                                n = xc[ ni = 0 ];\n\n                                // Get the rounding digit at index j of n.\n                                rd = n / pows10[ d - j - 1 ] % 10 | 0;\n                            } else {\n                                ni = mathceil( ( i + 1 ) / LOG_BASE );\n\n                                if ( ni >= xc.length ) {\n\n                                    if (r) {\n\n                                        // Needed by sqrt.\n                                        for ( ; xc.length <= ni; xc.push(0) );\n                                        n = rd = 0;\n                                        d = 1;\n                                        i %= LOG_BASE;\n                                        j = i - LOG_BASE + 1;\n                                    } else {\n                                        break out;\n                                    }\n                                } else {\n                                    n = k = xc[ni];\n\n                                    // Get the number of digits of n.\n                                    for ( d = 1; k >= 10; k /= 10, d++ );\n\n                                    // Get the index of rd within n.\n                                    i %= LOG_BASE;\n\n                                    // Get the index of rd within n, adjusted for leading zeros.\n                                    // The number of leading zeros of n is given by LOG_BASE - d.\n                                    j = i - LOG_BASE + d;\n\n                                    // Get the rounding digit at index j of n.\n                                    rd = j < 0 ? 0 : n / pows10[ d - j - 1 ] % 10 | 0;\n                                }\n                            }\n\n                            r = r || sd < 0 ||\n\n                                // Are there any non-zero digits after the rounding digit?\n                                // The expression  n % pows10[ d - j - 1 ]  returns all digits of n to the right\n                                // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714.\n                                xc[ni + 1] != null || ( j < 0 ? n : n % pows10[ d - j - 1 ] );\n\n                            r = rm < 4\n                                ? ( rd || r ) && ( rm == 0 || rm == ( x.s < 0 ? 3 : 2 ) )\n                                : rd > 5 || rd == 5 && ( rm == 4 || r || rm == 6 &&\n\n                                // Check whether the digit to the left of the rounding digit is odd.\n                                ( ( i > 0 ? j > 0 ? n / pows10[ d - j ] : 0 : xc[ni - 1] ) % 10 ) & 1 ||\n                                rm == ( x.s < 0 ? 8 : 7 ) );\n\n                            if ( sd < 1 || !xc[0] ) {\n                                xc.length = 0;\n\n                                if (r) {\n\n                                    // Convert sd to decimal places.\n                                    sd -= x.e + 1;\n\n                                    // 1, 0.1, 0.01, 0.001, 0.0001 etc.\n                                    xc[0] = pows10[ sd % LOG_BASE ];\n                                    x.e = -sd || 0;\n                                } else {\n\n                                    // Zero.\n                                    xc[0] = x.e = 0;\n                                }\n\n                                return x;\n                            }\n\n                            // Remove excess digits.\n                            if ( i == 0 ) {\n                                xc.length = ni;\n                                k = 1;\n                                ni--;\n                            } else {\n                                xc.length = ni + 1;\n                                k = pows10[ LOG_BASE - i ];\n\n                                // E.g. 56700 becomes 56000 if 7 is the rounding digit.\n                                // j > 0 means i > number of leading zeros of n.\n                                xc[ni] = j > 0 ? mathfloor( n / pows10[ d - j ] % pows10[j] ) * k : 0;\n                            }\n\n                            // Round up?\n                            if (r) {\n\n                                for ( ; ; ) {\n\n                                    // If the digit to be rounded up is in the first element of xc...\n                                    if ( ni == 0 ) {\n\n                                        // i will be the length of xc[0] before k is added.\n                                        for ( i = 1, j = xc[0]; j >= 10; j /= 10, i++ );\n                                        j = xc[0] += k;\n                                        for ( k = 1; j >= 10; j /= 10, k++ );\n\n                                        // if i != k the length has increased.\n                                        if ( i != k ) {\n                                            x.e++;\n                                            if ( xc[0] == BASE ) xc[0] = 1;\n                                        }\n\n                                        break;\n                                    } else {\n                                        xc[ni] += k;\n                                        if ( xc[ni] != BASE ) break;\n                                        xc[ni--] = 0;\n                                        k = 1;\n                                    }\n                                }\n                            }\n\n                            // Remove trailing zeros.\n                            for ( i = xc.length; xc[--i] === 0; xc.pop() );\n                        }\n\n                        // Overflow? Infinity.\n                        if ( x.e > MAX_EXP ) {\n                            x.c = x.e = null;\n\n                            // Underflow? Zero.\n                        } else if ( x.e < MIN_EXP ) {\n                            x.c = [ x.e = 0 ];\n                        }\n                    }\n\n                    return x;\n                }\n\n\n                // PROTOTYPE/INSTANCE METHODS\n\n\n                /*\n         * Return a new BigNumber whose value is the absolute value of this BigNumber.\n         */\n                P.absoluteValue = P.abs = function () {\n                    var x = new BigNumber(this);\n                    if ( x.s < 0 ) x.s = 1;\n                    return x;\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole\n         * number in the direction of Infinity.\n         */\n                P.ceil = function () {\n                    return round( new BigNumber(this), this.e + 1, 2 );\n                };\n\n\n                /*\n         * Return\n         * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b),\n         * -1 if the value of this BigNumber is less than the value of BigNumber(y, b),\n         * 0 if they have the same value,\n         * or null if the value of either is NaN.\n         */\n                P.comparedTo = P.cmp = function ( y, b ) {\n                    id = 1;\n                    return compare( this, new BigNumber( y, b ) );\n                };\n\n\n                /*\n         * Return the number of decimal places of the value of this BigNumber, or null if the value\n         * of this BigNumber is ±Infinity or NaN.\n         */\n                P.decimalPlaces = P.dp = function () {\n                    var n, v,\n                        c = this.c;\n\n                    if ( !c ) return null;\n                    n = ( ( v = c.length - 1 ) - bitFloor( this.e / LOG_BASE ) ) * LOG_BASE;\n\n                    // Subtract the number of trailing zeros of the last number.\n                    if ( v = c[v] ) for ( ; v % 10 == 0; v /= 10, n-- );\n                    if ( n < 0 ) n = 0;\n\n                    return n;\n                };\n\n\n                /*\n         *  n / 0 = I\n         *  n / N = N\n         *  n / I = 0\n         *  0 / n = 0\n         *  0 / 0 = N\n         *  0 / N = N\n         *  0 / I = 0\n         *  N / n = N\n         *  N / 0 = N\n         *  N / N = N\n         *  N / I = N\n         *  I / n = I\n         *  I / 0 = I\n         *  I / N = N\n         *  I / I = N\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber divided by the value of\n         * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE.\n         */\n                P.dividedBy = P.div = function ( y, b ) {\n                    id = 3;\n                    return div( this, new BigNumber( y, b ), DECIMAL_PLACES, ROUNDING_MODE );\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the integer part of dividing the value of this\n         * BigNumber by the value of BigNumber(y, b).\n         */\n                P.dividedToIntegerBy = P.divToInt = function ( y, b ) {\n                    id = 4;\n                    return div( this, new BigNumber( y, b ), 0, 1 );\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b),\n         * otherwise returns false.\n         */\n                P.equals = P.eq = function ( y, b ) {\n                    id = 5;\n                    return compare( this, new BigNumber( y, b ) ) === 0;\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a whole\n         * number in the direction of -Infinity.\n         */\n                P.floor = function () {\n                    return round( new BigNumber(this), this.e + 1, 3 );\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b),\n         * otherwise returns false.\n         */\n                P.greaterThan = P.gt = function ( y, b ) {\n                    id = 6;\n                    return compare( this, new BigNumber( y, b ) ) > 0;\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is greater than or equal to the value of\n         * BigNumber(y, b), otherwise returns false.\n         */\n                P.greaterThanOrEqualTo = P.gte = function ( y, b ) {\n                    id = 7;\n                    return ( b = compare( this, new BigNumber( y, b ) ) ) === 1 || b === 0;\n\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is a finite number, otherwise returns false.\n         */\n                P.isFinite = function () {\n                    return !!this.c;\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is an integer, otherwise return false.\n         */\n                P.isInteger = P.isInt = function () {\n                    return !!this.c && bitFloor( this.e / LOG_BASE ) > this.c.length - 2;\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is NaN, otherwise returns false.\n         */\n                P.isNaN = function () {\n                    return !this.s;\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is negative, otherwise returns false.\n         */\n                P.isNegative = P.isNeg = function () {\n                    return this.s < 0;\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is 0 or -0, otherwise returns false.\n         */\n                P.isZero = function () {\n                    return !!this.c && this.c[0] == 0;\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is less than the value of BigNumber(y, b),\n         * otherwise returns false.\n         */\n                P.lessThan = P.lt = function ( y, b ) {\n                    id = 8;\n                    return compare( this, new BigNumber( y, b ) ) < 0;\n                };\n\n\n                /*\n         * Return true if the value of this BigNumber is less than or equal to the value of\n         * BigNumber(y, b), otherwise returns false.\n         */\n                P.lessThanOrEqualTo = P.lte = function ( y, b ) {\n                    id = 9;\n                    return ( b = compare( this, new BigNumber( y, b ) ) ) === -1 || b === 0;\n                };\n\n\n                /*\n         *  n - 0 = n\n         *  n - N = N\n         *  n - I = -I\n         *  0 - n = -n\n         *  0 - 0 = 0\n         *  0 - N = N\n         *  0 - I = -I\n         *  N - n = N\n         *  N - 0 = N\n         *  N - N = N\n         *  N - I = N\n         *  I - n = I\n         *  I - 0 = I\n         *  I - N = N\n         *  I - I = N\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber minus the value of\n         * BigNumber(y, b).\n         */\n                P.minus = P.sub = function ( y, b ) {\n                    var i, j, t, xLTy,\n                        x = this,\n                        a = x.s;\n\n                    id = 10;\n                    y = new BigNumber( y, b );\n                    b = y.s;\n\n                    // Either NaN?\n                    if ( !a || !b ) return new BigNumber(NaN);\n\n                    // Signs differ?\n                    if ( a != b ) {\n                        y.s = -b;\n                        return x.plus(y);\n                    }\n\n                    var xe = x.e / LOG_BASE,\n                        ye = y.e / LOG_BASE,\n                        xc = x.c,\n                        yc = y.c;\n\n                    if ( !xe || !ye ) {\n\n                        // Either Infinity?\n                        if ( !xc || !yc ) return xc ? ( y.s = -b, y ) : new BigNumber( yc ? x : NaN );\n\n                        // Either zero?\n                        if ( !xc[0] || !yc[0] ) {\n\n                            // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\n                            return yc[0] ? ( y.s = -b, y ) : new BigNumber( xc[0] ? x :\n\n                                // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity\n                                ROUNDING_MODE == 3 ? -0 : 0 );\n                        }\n                    }\n\n                    xe = bitFloor(xe);\n                    ye = bitFloor(ye);\n                    xc = xc.slice();\n\n                    // Determine which is the bigger number.\n                    if ( a = xe - ye ) {\n\n                        if ( xLTy = a < 0 ) {\n                            a = -a;\n                            t = xc;\n                        } else {\n                            ye = xe;\n                            t = yc;\n                        }\n\n                        t.reverse();\n\n                        // Prepend zeros to equalise exponents.\n                        for ( b = a; b--; t.push(0) );\n                        t.reverse();\n                    } else {\n\n                        // Exponents equal. Check digit by digit.\n                        j = ( xLTy = ( a = xc.length ) < ( b = yc.length ) ) ? a : b;\n\n                        for ( a = b = 0; b < j; b++ ) {\n\n                            if ( xc[b] != yc[b] ) {\n                                xLTy = xc[b] < yc[b];\n                                break;\n                            }\n                        }\n                    }\n\n                    // x < y? Point xc to the array of the bigger number.\n                    if (xLTy) t = xc, xc = yc, yc = t, y.s = -y.s;\n\n                    b = ( j = yc.length ) - ( i = xc.length );\n\n                    // Append zeros to xc if shorter.\n                    // No need to add zeros to yc if shorter as subtract only needs to start at yc.length.\n                    if ( b > 0 ) for ( ; b--; xc[i++] = 0 );\n                    b = BASE - 1;\n\n                    // Subtract yc from xc.\n                    for ( ; j > a; ) {\n\n                        if ( xc[--j] < yc[j] ) {\n                            for ( i = j; i && !xc[--i]; xc[i] = b );\n                            --xc[i];\n                            xc[j] += BASE;\n                        }\n\n                        xc[j] -= yc[j];\n                    }\n\n                    // Remove leading zeros and adjust exponent accordingly.\n                    for ( ; xc[0] == 0; xc.shift(), --ye );\n\n                    // Zero?\n                    if ( !xc[0] ) {\n\n                        // Following IEEE 754 (2008) 6.3,\n                        // n - n = +0  but  n - n = -0  when rounding towards -Infinity.\n                        y.s = ROUNDING_MODE == 3 ? -1 : 1;\n                        y.c = [ y.e = 0 ];\n                        return y;\n                    }\n\n                    // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity\n                    // for finite x and y.\n                    return normalise( y, xc, ye );\n                };\n\n\n                /*\n         *   n % 0 =  N\n         *   n % N =  N\n         *   n % I =  n\n         *   0 % n =  0\n         *  -0 % n = -0\n         *   0 % 0 =  N\n         *   0 % N =  N\n         *   0 % I =  0\n         *   N % n =  N\n         *   N % 0 =  N\n         *   N % N =  N\n         *   N % I =  N\n         *   I % n =  N\n         *   I % 0 =  N\n         *   I % N =  N\n         *   I % I =  N\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber modulo the value of\n         * BigNumber(y, b). The result depends on the value of MODULO_MODE.\n         */\n                P.modulo = P.mod = function ( y, b ) {\n                    var q, s,\n                        x = this;\n\n                    id = 11;\n                    y = new BigNumber( y, b );\n\n                    // Return NaN if x is Infinity or NaN, or y is NaN or zero.\n                    if ( !x.c || !y.s || y.c && !y.c[0] ) {\n                        return new BigNumber(NaN);\n\n                        // Return x if y is Infinity or x is zero.\n                    } else if ( !y.c || x.c && !x.c[0] ) {\n                        return new BigNumber(x);\n                    }\n\n                    if ( MODULO_MODE == 9 ) {\n\n                        // Euclidian division: q = sign(y) * floor(x / abs(y))\n                        // r = x - qy    where  0 <= r < abs(y)\n                        s = y.s;\n                        y.s = 1;\n                        q = div( x, y, 0, 3 );\n                        y.s = s;\n                        q.s *= s;\n                    } else {\n                        q = div( x, y, 0, MODULO_MODE );\n                    }\n\n                    return x.minus( q.times(y) );\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the value of this BigNumber negated,\n         * i.e. multiplied by -1.\n         */\n                P.negated = P.neg = function () {\n                    var x = new BigNumber(this);\n                    x.s = -x.s || null;\n                    return x;\n                };\n\n\n                /*\n         *  n + 0 = n\n         *  n + N = N\n         *  n + I = I\n         *  0 + n = n\n         *  0 + 0 = 0\n         *  0 + N = N\n         *  0 + I = I\n         *  N + n = N\n         *  N + 0 = N\n         *  N + N = N\n         *  N + I = N\n         *  I + n = I\n         *  I + 0 = I\n         *  I + N = N\n         *  I + I = I\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber plus the value of\n         * BigNumber(y, b).\n         */\n                P.plus = P.add = function ( y, b ) {\n                    var t,\n                        x = this,\n                        a = x.s;\n\n                    id = 12;\n                    y = new BigNumber( y, b );\n                    b = y.s;\n\n                    // Either NaN?\n                    if ( !a || !b ) return new BigNumber(NaN);\n\n                    // Signs differ?\n                    if ( a != b ) {\n                        y.s = -b;\n                        return x.minus(y);\n                    }\n\n                    var xe = x.e / LOG_BASE,\n                        ye = y.e / LOG_BASE,\n                        xc = x.c,\n                        yc = y.c;\n\n                    if ( !xe || !ye ) {\n\n                        // Return ±Infinity if either ±Infinity.\n                        if ( !xc || !yc ) return new BigNumber( a / 0 );\n\n                        // Either zero?\n                        // Return y if y is non-zero, x if x is non-zero, or zero if both are zero.\n                        if ( !xc[0] || !yc[0] ) return yc[0] ? y : new BigNumber( xc[0] ? x : a * 0 );\n                    }\n\n                    xe = bitFloor(xe);\n                    ye = bitFloor(ye);\n                    xc = xc.slice();\n\n                    // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts.\n                    if ( a = xe - ye ) {\n                        if ( a > 0 ) {\n                            ye = xe;\n                            t = yc;\n                        } else {\n                            a = -a;\n                            t = xc;\n                        }\n\n                        t.reverse();\n                        for ( ; a--; t.push(0) );\n                        t.reverse();\n                    }\n\n                    a = xc.length;\n                    b = yc.length;\n\n                    // Point xc to the longer array, and b to the shorter length.\n                    if ( a - b < 0 ) t = yc, yc = xc, xc = t, b = a;\n\n                    // Only start adding at yc.length - 1 as the further digits of xc can be ignored.\n                    for ( a = 0; b; ) {\n                        a = ( xc[--b] = xc[b] + yc[b] + a ) / BASE | 0;\n                        xc[b] %= BASE;\n                    }\n\n                    if (a) {\n                        xc.unshift(a);\n                        ++ye;\n                    }\n\n                    // No need to check for zero, as +x + +y != 0 && -x + -y != 0\n                    // ye = MAX_EXP + 1 possible\n                    return normalise( y, xc, ye );\n                };\n\n\n                /*\n         * Return the number of significant digits of the value of this BigNumber.\n         *\n         * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.\n         */\n                P.precision = P.sd = function (z) {\n                    var n, v,\n                        x = this,\n                        c = x.c;\n\n                    // 'precision() argument not a boolean or binary digit: {z}'\n                    if ( z != null && z !== !!z && z !== 1 && z !== 0 ) {\n                        if (ERRORS) raise( 13, 'argument' + notBool, z );\n                        if ( z != !!z ) z = null;\n                    }\n\n                    if ( !c ) return null;\n                    v = c.length - 1;\n                    n = v * LOG_BASE + 1;\n\n                    if ( v = c[v] ) {\n\n                        // Subtract the number of trailing zeros of the last element.\n                        for ( ; v % 10 == 0; v /= 10, n-- );\n\n                        // Add the number of digits of the first element.\n                        for ( v = c[0]; v >= 10; v /= 10, n++ );\n                    }\n\n                    if ( z && x.e + 1 > n ) n = x.e + 1;\n\n                    return n;\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of\n         * dp decimal places using rounding mode rm, or to 0 and ROUNDING_MODE respectively if\n         * omitted.\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'round() decimal places out of range: {dp}'\n         * 'round() decimal places not an integer: {dp}'\n         * 'round() rounding mode not an integer: {rm}'\n         * 'round() rounding mode out of range: {rm}'\n         */\n                P.round = function ( dp, rm ) {\n                    var n = new BigNumber(this);\n\n                    if ( dp == null || isValidInt( dp, 0, MAX, 15 ) ) {\n                        round( n, ~~dp + this.e + 1, rm == null ||\n                        !isValidInt( rm, 0, 8, 15, roundingMode ) ? ROUNDING_MODE : rm | 0 );\n                    }\n\n                    return n;\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the value of this BigNumber shifted by k places\n         * (powers of 10). Shift to the right if n > 0, and to the left if n < 0.\n         *\n         * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive.\n         *\n         * If k is out of range and ERRORS is false, the result will be ±0 if k < 0, or ±Infinity\n         * otherwise.\n         *\n         * 'shift() argument not an integer: {k}'\n         * 'shift() argument out of range: {k}'\n         */\n                P.shift = function (k) {\n                    var n = this;\n                    return isValidInt( k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 16, 'argument' )\n\n                        // k < 1e+21, or truncate(k) will produce exponential notation.\n                        ? n.times( '1e' + truncate(k) )\n                        : new BigNumber( n.c && n.c[0] && ( k < -MAX_SAFE_INTEGER || k > MAX_SAFE_INTEGER )\n                            ? n.s * ( k < 0 ? 0 : 1 / 0 )\n                            : n );\n                };\n\n\n                /*\n         *  sqrt(-n) =  N\n         *  sqrt( N) =  N\n         *  sqrt(-I) =  N\n         *  sqrt( I) =  I\n         *  sqrt( 0) =  0\n         *  sqrt(-0) = -0\n         *\n         * Return a new BigNumber whose value is the square root of the value of this BigNumber,\n         * rounded according to DECIMAL_PLACES and ROUNDING_MODE.\n         */\n                P.squareRoot = P.sqrt = function () {\n                    var m, n, r, rep, t,\n                        x = this,\n                        c = x.c,\n                        s = x.s,\n                        e = x.e,\n                        dp = DECIMAL_PLACES + 4,\n                        half = new BigNumber('0.5');\n\n                    // Negative/NaN/Infinity/zero?\n                    if ( s !== 1 || !c || !c[0] ) {\n                        return new BigNumber( !s || s < 0 && ( !c || c[0] ) ? NaN : c ? x : 1 / 0 );\n                    }\n\n                    // Initial estimate.\n                    s = Math.sqrt( +x );\n\n                    // Math.sqrt underflow/overflow?\n                    // Pass x to Math.sqrt as integer, then adjust the exponent of the result.\n                    if ( s == 0 || s == 1 / 0 ) {\n                        n = coeffToString(c);\n                        if ( ( n.length + e ) % 2 == 0 ) n += '0';\n                        s = Math.sqrt(n);\n                        e = bitFloor( ( e + 1 ) / 2 ) - ( e < 0 || e % 2 );\n\n                        if ( s == 1 / 0 ) {\n                            n = '1e' + e;\n                        } else {\n                            n = s.toExponential();\n                            n = n.slice( 0, n.indexOf('e') + 1 ) + e;\n                        }\n\n                        r = new BigNumber(n);\n                    } else {\n                        r = new BigNumber( s + '' );\n                    }\n\n                    // Check for zero.\n                    // r could be zero if MIN_EXP is changed after the this value was created.\n                    // This would cause a division by zero (x/t) and hence Infinity below, which would cause\n                    // coeffToString to throw.\n                    if ( r.c[0] ) {\n                        e = r.e;\n                        s = e + dp;\n                        if ( s < 3 ) s = 0;\n\n                        // Newton-Raphson iteration.\n                        for ( ; ; ) {\n                            t = r;\n                            r = half.times( t.plus( div( x, t, dp, 1 ) ) );\n\n                            if ( coeffToString( t.c   ).slice( 0, s ) === ( n =\n                                coeffToString( r.c ) ).slice( 0, s ) ) {\n\n                                // The exponent of r may here be one less than the final result exponent,\n                                // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits\n                                // are indexed correctly.\n                                if ( r.e < e ) --s;\n                                n = n.slice( s - 3, s + 1 );\n\n                                // The 4th rounding digit may be in error by -1 so if the 4 rounding digits\n                                // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the\n                                // iteration.\n                                if ( n == '9999' || !rep && n == '4999' ) {\n\n                                    // On the first iteration only, check to see if rounding up gives the\n                                    // exact result as the nines may infinitely repeat.\n                                    if ( !rep ) {\n                                        round( t, t.e + DECIMAL_PLACES + 2, 0 );\n\n                                        if ( t.times(t).eq(x) ) {\n                                            r = t;\n                                            break;\n                                        }\n                                    }\n\n                                    dp += 4;\n                                    s += 4;\n                                    rep = 1;\n                                } else {\n\n                                    // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact\n                                    // result. If not, then there are further digits and m will be truthy.\n                                    if ( !+n || !+n.slice(1) && n.charAt(0) == '5' ) {\n\n                                        // Truncate to the first rounding digit.\n                                        round( r, r.e + DECIMAL_PLACES + 2, 1 );\n                                        m = !r.times(r).eq(x);\n                                    }\n\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    return round( r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m );\n                };\n\n\n                /*\n         *  n * 0 = 0\n         *  n * N = N\n         *  n * I = I\n         *  0 * n = 0\n         *  0 * 0 = 0\n         *  0 * N = N\n         *  0 * I = N\n         *  N * n = N\n         *  N * 0 = N\n         *  N * N = N\n         *  N * I = N\n         *  I * n = I\n         *  I * 0 = N\n         *  I * N = N\n         *  I * I = I\n         *\n         * Return a new BigNumber whose value is the value of this BigNumber times the value of\n         * BigNumber(y, b).\n         */\n                P.times = P.mul = function ( y, b ) {\n                    var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc,\n                        base, sqrtBase,\n                        x = this,\n                        xc = x.c,\n                        yc = ( id = 17, y = new BigNumber( y, b ) ).c;\n\n                    // Either NaN, ±Infinity or ±0?\n                    if ( !xc || !yc || !xc[0] || !yc[0] ) {\n\n                        // Return NaN if either is NaN, or one is 0 and the other is Infinity.\n                        if ( !x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc ) {\n                            y.c = y.e = y.s = null;\n                        } else {\n                            y.s *= x.s;\n\n                            // Return ±Infinity if either is ±Infinity.\n                            if ( !xc || !yc ) {\n                                y.c = y.e = null;\n\n                                // Return ±0 if either is ±0.\n                            } else {\n                                y.c = [0];\n                                y.e = 0;\n                            }\n                        }\n\n                        return y;\n                    }\n\n                    e = bitFloor( x.e / LOG_BASE ) + bitFloor( y.e / LOG_BASE );\n                    y.s *= x.s;\n                    xcL = xc.length;\n                    ycL = yc.length;\n\n                    // Ensure xc points to longer array and xcL to its length.\n                    if ( xcL < ycL ) zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i;\n\n                    // Initialise the result array with zeros.\n                    for ( i = xcL + ycL, zc = []; i--; zc.push(0) );\n\n                    base = BASE;\n                    sqrtBase = SQRT_BASE;\n\n                    for ( i = ycL; --i >= 0; ) {\n                        c = 0;\n                        ylo = yc[i] % sqrtBase;\n                        yhi = yc[i] / sqrtBase | 0;\n\n                        for ( k = xcL, j = i + k; j > i; ) {\n                            xlo = xc[--k] % sqrtBase;\n                            xhi = xc[k] / sqrtBase | 0;\n                            m = yhi * xlo + xhi * ylo;\n                            xlo = ylo * xlo + ( ( m % sqrtBase ) * sqrtBase ) + zc[j] + c;\n                            c = ( xlo / base | 0 ) + ( m / sqrtBase | 0 ) + yhi * xhi;\n                            zc[j--] = xlo % base;\n                        }\n\n                        zc[j] = c;\n                    }\n\n                    if (c) {\n                        ++e;\n                    } else {\n                        zc.shift();\n                    }\n\n                    return normalise( y, zc, e );\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the value of this BigNumber rounded to a maximum of\n         * sd significant digits using rounding mode rm, or ROUNDING_MODE if rm is omitted.\n         *\n         * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toDigits() precision out of range: {sd}'\n         * 'toDigits() precision not an integer: {sd}'\n         * 'toDigits() rounding mode not an integer: {rm}'\n         * 'toDigits() rounding mode out of range: {rm}'\n         */\n                P.toDigits = function ( sd, rm ) {\n                    var n = new BigNumber(this);\n                    sd = sd == null || !isValidInt( sd, 1, MAX, 18, 'precision' ) ? null : sd | 0;\n                    rm = rm == null || !isValidInt( rm, 0, 8, 18, roundingMode ) ? ROUNDING_MODE : rm | 0;\n                    return sd ? round( n, sd, rm ) : n;\n                };\n\n\n                /*\n         * Return a string representing the value of this BigNumber in exponential notation and\n         * rounded using ROUNDING_MODE to dp fixed decimal places.\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toExponential() decimal places not an integer: {dp}'\n         * 'toExponential() decimal places out of range: {dp}'\n         * 'toExponential() rounding mode not an integer: {rm}'\n         * 'toExponential() rounding mode out of range: {rm}'\n         */\n                P.toExponential = function ( dp, rm ) {\n                    return format( this,\n                        dp != null && isValidInt( dp, 0, MAX, 19 ) ? ~~dp + 1 : null, rm, 19 );\n                };\n\n\n                /*\n         * Return a string representing the value of this BigNumber in fixed-point notation rounding\n         * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted.\n         *\n         * Note: as with JavaScript's number type, (-0).toFixed(0) is '0',\n         * but e.g. (-0.00001).toFixed(0) is '-0'.\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toFixed() decimal places not an integer: {dp}'\n         * 'toFixed() decimal places out of range: {dp}'\n         * 'toFixed() rounding mode not an integer: {rm}'\n         * 'toFixed() rounding mode out of range: {rm}'\n         */\n                P.toFixed = function ( dp, rm ) {\n                    return format( this, dp != null && isValidInt( dp, 0, MAX, 20 )\n                        ? ~~dp + this.e + 1 : null, rm, 20 );\n                };\n\n\n                /*\n         * Return a string representing the value of this BigNumber in fixed-point notation rounded\n         * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties\n         * of the FORMAT object (see BigNumber.config).\n         *\n         * FORMAT = {\n         *      decimalSeparator : '.',\n         *      groupSeparator : ',',\n         *      groupSize : 3,\n         *      secondaryGroupSize : 0,\n         *      fractionGroupSeparator : '\\xA0',    // non-breaking space\n         *      fractionGroupSize : 0\n         * };\n         *\n         * [dp] {number} Decimal places. Integer, 0 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toFormat() decimal places not an integer: {dp}'\n         * 'toFormat() decimal places out of range: {dp}'\n         * 'toFormat() rounding mode not an integer: {rm}'\n         * 'toFormat() rounding mode out of range: {rm}'\n         */\n                P.toFormat = function ( dp, rm ) {\n                    var str = format( this, dp != null && isValidInt( dp, 0, MAX, 21 )\n                        ? ~~dp + this.e + 1 : null, rm, 21 );\n\n                    if ( this.c ) {\n                        var i,\n                            arr = str.split('.'),\n                            g1 = +FORMAT.groupSize,\n                            g2 = +FORMAT.secondaryGroupSize,\n                            groupSeparator = FORMAT.groupSeparator,\n                            intPart = arr[0],\n                            fractionPart = arr[1],\n                            isNeg = this.s < 0,\n                            intDigits = isNeg ? intPart.slice(1) : intPart,\n                            len = intDigits.length;\n\n                        if (g2) i = g1, g1 = g2, g2 = i, len -= i;\n\n                        if ( g1 > 0 && len > 0 ) {\n                            i = len % g1 || g1;\n                            intPart = intDigits.substr( 0, i );\n\n                            for ( ; i < len; i += g1 ) {\n                                intPart += groupSeparator + intDigits.substr( i, g1 );\n                            }\n\n                            if ( g2 > 0 ) intPart += groupSeparator + intDigits.slice(i);\n                            if (isNeg) intPart = '-' + intPart;\n                        }\n\n                        str = fractionPart\n                            ? intPart + FORMAT.decimalSeparator + ( ( g2 = +FORMAT.fractionGroupSize )\n                            ? fractionPart.replace( new RegExp( '\\\\d{' + g2 + '}\\\\B', 'g' ),\n                                '$&' + FORMAT.fractionGroupSeparator )\n                            : fractionPart )\n                            : intPart;\n                    }\n\n                    return str;\n                };\n\n\n                /*\n         * Return a string array representing the value of this BigNumber as a simple fraction with\n         * an integer numerator and an integer denominator. The denominator will be a positive\n         * non-zero value less than or equal to the specified maximum denominator. If a maximum\n         * denominator is not specified, the denominator will be the lowest value necessary to\n         * represent the number exactly.\n         *\n         * [md] {number|string|BigNumber} Integer >= 1 and < Infinity. The maximum denominator.\n         *\n         * 'toFraction() max denominator not an integer: {md}'\n         * 'toFraction() max denominator out of range: {md}'\n         */\n                P.toFraction = function (md) {\n                    var arr, d0, d2, e, exp, n, n0, q, s,\n                        k = ERRORS,\n                        x = this,\n                        xc = x.c,\n                        d = new BigNumber(ONE),\n                        n1 = d0 = new BigNumber(ONE),\n                        d1 = n0 = new BigNumber(ONE);\n\n                    if ( md != null ) {\n                        ERRORS = false;\n                        n = new BigNumber(md);\n                        ERRORS = k;\n\n                        if ( !( k = n.isInt() ) || n.lt(ONE) ) {\n\n                            if (ERRORS) {\n                                raise( 22,\n                                    'max denominator ' + ( k ? 'out of range' : 'not an integer' ), md );\n                            }\n\n                            // ERRORS is false:\n                            // If md is a finite non-integer >= 1, round it to an integer and use it.\n                            md = !k && n.c && round( n, n.e + 1, 1 ).gte(ONE) ? n : null;\n                        }\n                    }\n\n                    if ( !xc ) return x.toString();\n                    s = coeffToString(xc);\n\n                    // Determine initial denominator.\n                    // d is a power of 10 and the minimum max denominator that specifies the value exactly.\n                    e = d.e = s.length - x.e - 1;\n                    d.c[0] = POWS_TEN[ ( exp = e % LOG_BASE ) < 0 ? LOG_BASE + exp : exp ];\n                    md = !md || n.cmp(d) > 0 ? ( e > 0 ? d : n1 ) : n;\n\n                    exp = MAX_EXP;\n                    MAX_EXP = 1 / 0;\n                    n = new BigNumber(s);\n\n                    // n0 = d1 = 0\n                    n0.c[0] = 0;\n\n                    for ( ; ; )  {\n                        q = div( n, d, 0, 1 );\n                        d2 = d0.plus( q.times(d1) );\n                        if ( d2.cmp(md) == 1 ) break;\n                        d0 = d1;\n                        d1 = d2;\n                        n1 = n0.plus( q.times( d2 = n1 ) );\n                        n0 = d2;\n                        d = n.minus( q.times( d2 = d ) );\n                        n = d2;\n                    }\n\n                    d2 = div( md.minus(d0), d1, 0, 1 );\n                    n0 = n0.plus( d2.times(n1) );\n                    d0 = d0.plus( d2.times(d1) );\n                    n0.s = n1.s = x.s;\n                    e *= 2;\n\n                    // Determine which fraction is closer to x, n0/d0 or n1/d1\n                    arr = div( n1, d1, e, ROUNDING_MODE ).minus(x).abs().cmp(\n                        div( n0, d0, e, ROUNDING_MODE ).minus(x).abs() ) < 1\n                        ? [ n1.toString(), d1.toString() ]\n                        : [ n0.toString(), d0.toString() ];\n\n                    MAX_EXP = exp;\n                    return arr;\n                };\n\n\n                /*\n         * Return the value of this BigNumber converted to a number primitive.\n         */\n                P.toNumber = function () {\n                    var x = this;\n\n                    // Ensure zero has correct sign.\n                    return +x || ( x.s ? x.s * 0 : NaN );\n                };\n\n\n                /*\n         * Return a BigNumber whose value is the value of this BigNumber raised to the power n.\n         * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE.\n         * If POW_PRECISION is not 0, round to POW_PRECISION using ROUNDING_MODE.\n         *\n         * n {number} Integer, -9007199254740992 to 9007199254740992 inclusive.\n         * (Performs 54 loop iterations for n of 9007199254740992.)\n         *\n         * 'pow() exponent not an integer: {n}'\n         * 'pow() exponent out of range: {n}'\n         */\n                P.toPower = P.pow = function (n) {\n                    var k, y,\n                        i = mathfloor( n < 0 ? -n : +n ),\n                        x = this;\n\n                    // Pass ±Infinity to Math.pow if exponent is out of range.\n                    if ( !isValidInt( n, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER, 23, 'exponent' ) &&\n                        ( !isFinite(n) || i > MAX_SAFE_INTEGER && ( n /= 0 ) ||\n                            parseFloat(n) != n && !( n = NaN ) ) ) {\n                        return new BigNumber( Math.pow( +x, n ) );\n                    }\n\n                    // Truncating each coefficient array to a length of k after each multiplication equates\n                    // to truncating significant digits to POW_PRECISION + [28, 41], i.e. there will be a\n                    // minimum of 28 guard digits retained. (Using + 1.5 would give [9, 21] guard digits.)\n                    k = POW_PRECISION ? mathceil( POW_PRECISION / LOG_BASE + 2 ) : 0;\n                    y = new BigNumber(ONE);\n\n                    for ( ; ; ) {\n\n                        if ( i % 2 ) {\n                            y = y.times(x);\n                            if ( !y.c ) break;\n                            if ( k && y.c.length > k ) y.c.length = k;\n                        }\n\n                        i = mathfloor( i / 2 );\n                        if ( !i ) break;\n\n                        x = x.times(x);\n                        if ( k && x.c && x.c.length > k ) x.c.length = k;\n                    }\n\n                    if ( n < 0 ) y = ONE.div(y);\n                    return k ? round( y, POW_PRECISION, ROUNDING_MODE ) : y;\n                };\n\n\n                /*\n         * Return a string representing the value of this BigNumber rounded to sd significant digits\n         * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits\n         * necessary to represent the integer part of the value in fixed-point notation, then use\n         * exponential notation.\n         *\n         * [sd] {number} Significant digits. Integer, 1 to MAX inclusive.\n         * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.\n         *\n         * 'toPrecision() precision not an integer: {sd}'\n         * 'toPrecision() precision out of range: {sd}'\n         * 'toPrecision() rounding mode not an integer: {rm}'\n         * 'toPrecision() rounding mode out of range: {rm}'\n         */\n                P.toPrecision = function ( sd, rm ) {\n                    return format( this, sd != null && isValidInt( sd, 1, MAX, 24, 'precision' )\n                        ? sd | 0 : null, rm, 24 );\n                };\n\n\n                /*\n         * Return a string representing the value of this BigNumber in base b, or base 10 if b is\n         * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and\n         * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent\n         * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than\n         * TO_EXP_NEG, return exponential notation.\n         *\n         * [b] {number} Integer, 2 to 64 inclusive.\n         *\n         * 'toString() base not an integer: {b}'\n         * 'toString() base out of range: {b}'\n         */\n                P.toString = function (b) {\n                    var str,\n                        n = this,\n                        s = n.s,\n                        e = n.e;\n\n                    // Infinity or NaN?\n                    if ( e === null ) {\n\n                        if (s) {\n                            str = 'Infinity';\n                            if ( s < 0 ) str = '-' + str;\n                        } else {\n                            str = 'NaN';\n                        }\n                    } else {\n                        str = coeffToString( n.c );\n\n                        if ( b == null || !isValidInt( b, 2, 64, 25, 'base' ) ) {\n                            str = e <= TO_EXP_NEG || e >= TO_EXP_POS\n                                ? toExponential( str, e )\n                                : toFixedPoint( str, e );\n                        } else {\n                            str = convertBase( toFixedPoint( str, e ), b | 0, 10, s );\n                        }\n\n                        if ( s < 0 && n.c[0] ) str = '-' + str;\n                    }\n\n                    return str;\n                };\n\n\n                /*\n         * Return a new BigNumber whose value is the value of this BigNumber truncated to a whole\n         * number.\n         */\n                P.truncated = P.trunc = function () {\n                    return round( new BigNumber(this), this.e + 1, 1 );\n                };\n\n\n\n                /*\n         * Return as toString, but do not accept a base argument.\n         */\n                P.valueOf = P.toJSON = function () {\n                    return this.toString();\n                };\n\n\n                // Aliases for BigDecimal methods.\n                //P.add = P.plus;         // P.add included above\n                //P.subtract = P.minus;   // P.sub included above\n                //P.multiply = P.times;   // P.mul included above\n                //P.divide = P.div;\n                //P.remainder = P.mod;\n                //P.compareTo = P.cmp;\n                //P.negate = P.neg;\n\n\n                if ( configObj != null ) BigNumber.config(configObj);\n\n                return BigNumber;\n            }\n\n\n            // PRIVATE HELPER FUNCTIONS\n\n\n            function bitFloor(n) {\n                var i = n | 0;\n                return n > 0 || n === i ? i : i - 1;\n            }\n\n\n            // Return a coefficient array as a string of base 10 digits.\n            function coeffToString(a) {\n                var s, z,\n                    i = 1,\n                    j = a.length,\n                    r = a[0] + '';\n\n                for ( ; i < j; ) {\n                    s = a[i++] + '';\n                    z = LOG_BASE - s.length;\n                    for ( ; z--; s = '0' + s );\n                    r += s;\n                }\n\n                // Determine trailing zeros.\n                for ( j = r.length; r.charCodeAt(--j) === 48; );\n                return r.slice( 0, j + 1 || 1 );\n            }\n\n\n            // Compare the value of BigNumbers x and y.\n            function compare( x, y ) {\n                var a, b,\n                    xc = x.c,\n                    yc = y.c,\n                    i = x.s,\n                    j = y.s,\n                    k = x.e,\n                    l = y.e;\n\n                // Either NaN?\n                if ( !i || !j ) return null;\n\n                a = xc && !xc[0];\n                b = yc && !yc[0];\n\n                // Either zero?\n                if ( a || b ) return a ? b ? 0 : -j : i;\n\n                // Signs differ?\n                if ( i != j ) return i;\n\n                a = i < 0;\n                b = k == l;\n\n                // Either Infinity?\n                if ( !xc || !yc ) return b ? 0 : !xc ^ a ? 1 : -1;\n\n                // Compare exponents.\n                if ( !b ) return k > l ^ a ? 1 : -1;\n\n                j = ( k = xc.length ) < ( l = yc.length ) ? k : l;\n\n                // Compare digit by digit.\n                for ( i = 0; i < j; i++ ) if ( xc[i] != yc[i] ) return xc[i] > yc[i] ^ a ? 1 : -1;\n\n                // Compare lengths.\n                return k == l ? 0 : k > l ^ a ? 1 : -1;\n            }\n\n\n            /*\n     * Return true if n is a valid number in range, otherwise false.\n     * Use for argument validation when ERRORS is false.\n     * Note: parseInt('1e+1') == 1 but parseFloat('1e+1') == 10.\n     */\n            function intValidatorNoErrors( n, min, max ) {\n                return ( n = truncate(n) ) >= min && n <= max;\n            }\n\n\n            function isArray(obj) {\n                return Object.prototype.toString.call(obj) == '[object Array]';\n            }\n\n\n            /*\n     * Convert string of baseIn to an array of numbers of baseOut.\n     * Eg. convertBase('255', 10, 16) returns [15, 15].\n     * Eg. convertBase('ff', 16, 10) returns [2, 5, 5].\n     */\n            function toBaseOut( str, baseIn, baseOut ) {\n                var j,\n                    arr = [0],\n                    arrL,\n                    i = 0,\n                    len = str.length;\n\n                for ( ; i < len; ) {\n                    for ( arrL = arr.length; arrL--; arr[arrL] *= baseIn );\n                    arr[ j = 0 ] += ALPHABET.indexOf( str.charAt( i++ ) );\n\n                    for ( ; j < arr.length; j++ ) {\n\n                        if ( arr[j] > baseOut - 1 ) {\n                            if ( arr[j + 1] == null ) arr[j + 1] = 0;\n                            arr[j + 1] += arr[j] / baseOut | 0;\n                            arr[j] %= baseOut;\n                        }\n                    }\n                }\n\n                return arr.reverse();\n            }\n\n\n            function toExponential( str, e ) {\n                return ( str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str ) +\n                    ( e < 0 ? 'e' : 'e+' ) + e;\n            }\n\n\n            function toFixedPoint( str, e ) {\n                var len, z;\n\n                // Negative exponent?\n                if ( e < 0 ) {\n\n                    // Prepend zeros.\n                    for ( z = '0.'; ++e; z += '0' );\n                    str = z + str;\n\n                    // Positive exponent\n                } else {\n                    len = str.length;\n\n                    // Append zeros.\n                    if ( ++e > len ) {\n                        for ( z = '0', e -= len; --e; z += '0' );\n                        str += z;\n                    } else if ( e < len ) {\n                        str = str.slice( 0, e ) + '.' + str.slice(e);\n                    }\n                }\n\n                return str;\n            }\n\n\n            function truncate(n) {\n                n = parseFloat(n);\n                return n < 0 ? mathceil(n) : mathfloor(n);\n            }\n\n\n            // EXPORT\n\n\n            BigNumber = another();\n\n            // AMD.\n            if ( typeof define == 'function' && define.amd ) {\n                define( function () { return BigNumber; } );\n\n                // Node and other environments that support module.exports.\n            } else if ( typeof module != 'undefined' && module.exports ) {\n                module.exports = BigNumber;\n                if ( !crypto ) try { crypto = require('crypto'); } catch (e) {}\n\n                // Browser.\n            } else {\n                global.BigNumber = BigNumber;\n            }\n        })(this);\n\n    },{\"crypto\":51}],\"web3\":[function(require,module,exports){\n        var Web3 = require('./lib/web3');\n\n// dont override global variable\n        if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') {\n            window.Web3 = Web3;\n        }\n\n        module.exports = Web3;\n\n    },{\"./lib/web3\":23}]},{},[\"web3\"])\n//# sourceMappingURL=web3.js.map\n"
  },
  {
    "path": "internal/jsre/jsre.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package jsre provides execution environment for JavaScript.\npackage jsre\n\nimport (\n\tcrand \"crypto/rand\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"math/rand\"\n\t\"time\"\n\n\t\"github.com/robertkrimen/otto\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/internal/jsre/deps\"\n)\n\nvar (\n\tBigNumber_JS = deps.MustAsset(\"bignumber.js\")\n\tWeb3_JS      = deps.MustAsset(\"web3.js\")\n)\n\n/*\nJSRE is a generic JS runtime environment embedding the otto JS interpreter.\nIt provides some helper functions to\n- load code from files\n- run code snippets\n- require libraries\n- bind native go objects\n*/\ntype JSRE struct {\n\tassetPath     string\n\toutput        io.Writer\n\tevalQueue     chan *evalReq\n\tstopEventLoop chan bool\n\tclosed        chan struct{}\n}\n\n// jsTimer is a single timer instance with a callback function\ntype jsTimer struct {\n\ttimer    *time.Timer\n\tduration time.Duration\n\tinterval bool\n\tcall     otto.FunctionCall\n}\n\n// evalReq is a serialized vm execution request processed by runEventLoop.\ntype evalReq struct {\n\tfn   func(vm *otto.Otto)\n\tdone chan bool\n}\n\n// runtime must be stopped with Stop() after use and cannot be used after stopping\nfunc New(assetPath string, output io.Writer) *JSRE {\n\tre := &JSRE{\n\t\tassetPath:     assetPath,\n\t\toutput:        output,\n\t\tclosed:        make(chan struct{}),\n\t\tevalQueue:     make(chan *evalReq),\n\t\tstopEventLoop: make(chan bool),\n\t}\n\tgo re.runEventLoop()\n\tre.Set(\"loadScript\", re.loadScript)\n\tre.Set(\"inspect\", re.prettyPrintJS)\n\treturn re\n}\n\n// randomSource returns a pseudo random value generator.\nfunc randomSource() *rand.Rand {\n\tbytes := make([]byte, 8)\n\tseed := time.Now().UnixNano()\n\tif _, err := crand.Read(bytes); err == nil {\n\t\tseed = int64(binary.LittleEndian.Uint64(bytes))\n\t}\n\n\tsrc := rand.NewSource(seed)\n\treturn rand.New(src)\n}\n\n// This function runs the main event loop from a goroutine that is started\n// when JSRE is created. Use Stop() before exiting to properly stop it.\n// The event loop processes vm access requests from the evalQueue in a\n// serialized way and calls timer callback functions at the appropriate time.\n\n// Exported functions always access the vm through the event queue. You can\n// call the functions of the otto vm directly to circumvent the queue. These\n// functions should be used if and only if running a routine that was already\n// called from JS through an RPC call.\nfunc (re *JSRE) runEventLoop() {\n\tdefer close(re.closed)\n\n\tvm := otto.New()\n\tr := randomSource()\n\tvm.SetRandomSource(r.Float64)\n\n\tregistry := map[*jsTimer]*jsTimer{}\n\tready := make(chan *jsTimer)\n\n\tnewTimer := func(call otto.FunctionCall, interval bool) (*jsTimer, otto.Value) {\n\t\tdelay, _ := call.Argument(1).ToInteger()\n\t\tif 0 >= delay {\n\t\t\tdelay = 1\n\t\t}\n\t\ttimer := &jsTimer{\n\t\t\tduration: time.Duration(delay) * time.Millisecond,\n\t\t\tcall:     call,\n\t\t\tinterval: interval,\n\t\t}\n\t\tregistry[timer] = timer\n\n\t\ttimer.timer = time.AfterFunc(timer.duration, func() {\n\t\t\tready <- timer\n\t\t})\n\n\t\tvalue, err := call.Otto.ToValue(timer)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\treturn timer, value\n\t}\n\n\tsetTimeout := func(call otto.FunctionCall) otto.Value {\n\t\t_, value := newTimer(call, false)\n\t\treturn value\n\t}\n\n\tsetInterval := func(call otto.FunctionCall) otto.Value {\n\t\t_, value := newTimer(call, true)\n\t\treturn value\n\t}\n\n\tclearTimeout := func(call otto.FunctionCall) otto.Value {\n\t\ttimer, _ := call.Argument(0).Export()\n\t\tif timer, ok := timer.(*jsTimer); ok {\n\t\t\ttimer.timer.Stop()\n\t\t\tdelete(registry, timer)\n\t\t}\n\t\treturn otto.UndefinedValue()\n\t}\n\tvm.Set(\"_setTimeout\", setTimeout)\n\tvm.Set(\"_setInterval\", setInterval)\n\tvm.Run(`var setTimeout = function(args) {\n\t\tif (arguments.length < 1) {\n\t\t\tthrow TypeError(\"Failed to execute 'setTimeout': 1 argument required, but only 0 present.\");\n\t\t}\n\t\treturn _setTimeout.apply(this, arguments);\n\t}`)\n\tvm.Run(`var setInterval = function(args) {\n\t\tif (arguments.length < 1) {\n\t\t\tthrow TypeError(\"Failed to execute 'setInterval': 1 argument required, but only 0 present.\");\n\t\t}\n\t\treturn _setInterval.apply(this, arguments);\n\t}`)\n\tvm.Set(\"clearTimeout\", clearTimeout)\n\tvm.Set(\"clearInterval\", clearTimeout)\n\n\tvar waitForCallbacks bool\n\nloop:\n\tfor {\n\t\tselect {\n\t\tcase timer := <-ready:\n\t\t\t// execute callback, remove/reschedule the timer\n\t\t\tvar arguments []interface{}\n\t\t\tif len(timer.call.ArgumentList) > 2 {\n\t\t\t\ttmp := timer.call.ArgumentList[2:]\n\t\t\t\targuments = make([]interface{}, 2+len(tmp))\n\t\t\t\tfor i, value := range tmp {\n\t\t\t\t\targuments[i+2] = value\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\targuments = make([]interface{}, 1)\n\t\t\t}\n\t\t\targuments[0] = timer.call.ArgumentList[0]\n\t\t\t_, err := vm.Call(`Function.call.call`, nil, arguments...)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Println(\"js error:\", err, arguments)\n\t\t\t}\n\n\t\t\t_, inreg := registry[timer] // when clearInterval is called from within the callback don't reset it\n\t\t\tif timer.interval && inreg {\n\t\t\t\ttimer.timer.Reset(timer.duration)\n\t\t\t} else {\n\t\t\t\tdelete(registry, timer)\n\t\t\t\tif waitForCallbacks && (len(registry) == 0) {\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t}\n\t\tcase req := <-re.evalQueue:\n\t\t\t// run the code, send the result back\n\t\t\treq.fn(vm)\n\t\t\tclose(req.done)\n\t\t\tif waitForCallbacks && (len(registry) == 0) {\n\t\t\t\tbreak loop\n\t\t\t}\n\t\tcase waitForCallbacks = <-re.stopEventLoop:\n\t\t\tif !waitForCallbacks || (len(registry) == 0) {\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, timer := range registry {\n\t\ttimer.timer.Stop()\n\t\tdelete(registry, timer)\n\t}\n}\n\n// Do executes the given function on the JS event loop.\nfunc (re *JSRE) Do(fn func(*otto.Otto)) {\n\tdone := make(chan bool)\n\treq := &evalReq{fn, done}\n\tre.evalQueue <- req\n\t<-done\n}\n\n// stops the event loop before exit, optionally waits for all timers to expire\nfunc (re *JSRE) Stop(waitForCallbacks bool) {\n\tselect {\n\tcase <-re.closed:\n\tcase re.stopEventLoop <- waitForCallbacks:\n\t\t<-re.closed\n\t}\n}\n\n// Exec(file) loads and runs the contents of a file\n// if a relative path is given, the jsre's assetPath is used\nfunc (re *JSRE) Exec(file string) error {\n\tcode, err := ioutil.ReadFile(common.AbsolutePath(re.assetPath, file))\n\tif err != nil {\n\t\treturn err\n\t}\n\tvar script *otto.Script\n\tre.Do(func(vm *otto.Otto) {\n\t\tscript, err = vm.Compile(file, code)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t_, err = vm.Run(script)\n\t})\n\treturn err\n}\n\n// Bind assigns value v to a variable in the JS environment\n// This method is deprecated, use Set.\nfunc (re *JSRE) Bind(name string, v interface{}) error {\n\treturn re.Set(name, v)\n}\n\n// Run runs a piece of JS code.\nfunc (re *JSRE) Run(code string) (v otto.Value, err error) {\n\tre.Do(func(vm *otto.Otto) { v, err = vm.Run(code) })\n\treturn v, err\n}\n\n// Get returns the value of a variable in the JS environment.\nfunc (re *JSRE) Get(ns string) (v otto.Value, err error) {\n\tre.Do(func(vm *otto.Otto) { v, err = vm.Get(ns) })\n\treturn v, err\n}\n\n// Set assigns value v to a variable in the JS environment.\nfunc (re *JSRE) Set(ns string, v interface{}) (err error) {\n\tre.Do(func(vm *otto.Otto) { err = vm.Set(ns, v) })\n\treturn err\n}\n\n// loadScript executes a JS script from inside the currently executing JS code.\nfunc (re *JSRE) loadScript(call otto.FunctionCall) otto.Value {\n\tfile, err := call.Argument(0).ToString()\n\tif err != nil {\n\t\t// TODO: throw exception\n\t\treturn otto.FalseValue()\n\t}\n\tfile = common.AbsolutePath(re.assetPath, file)\n\tsource, err := ioutil.ReadFile(file)\n\tif err != nil {\n\t\t// TODO: throw exception\n\t\treturn otto.FalseValue()\n\t}\n\tif _, err := compileAndRun(call.Otto, file, source); err != nil {\n\t\t// TODO: throw exception\n\t\tfmt.Println(\"err:\", err)\n\t\treturn otto.FalseValue()\n\t}\n\t// TODO: return evaluation result\n\treturn otto.TrueValue()\n}\n\n// Evaluate executes code and pretty prints the result to the specified output\n// stream.\nfunc (re *JSRE) Evaluate(code string, w io.Writer) error {\n\tvar fail error\n\n\tre.Do(func(vm *otto.Otto) {\n\t\tval, err := vm.Run(code)\n\t\tif err != nil {\n\t\t\tprettyError(vm, err, w)\n\t\t} else {\n\t\t\tprettyPrint(vm, val, w)\n\t\t}\n\t\tfmt.Fprintln(w)\n\t})\n\treturn fail\n}\n\n// Compile compiles and then runs a piece of JS code.\nfunc (re *JSRE) Compile(filename string, src interface{}) (err error) {\n\tre.Do(func(vm *otto.Otto) { _, err = compileAndRun(vm, filename, src) })\n\treturn err\n}\n\nfunc compileAndRun(vm *otto.Otto, filename string, src interface{}) (otto.Value, error) {\n\tscript, err := vm.Compile(filename, src)\n\tif err != nil {\n\t\treturn otto.Value{}, err\n\t}\n\treturn vm.Run(script)\n}\n"
  },
  {
    "path": "internal/jsre/pretty.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage jsre\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/robertkrimen/otto\"\n)\n\nconst (\n\tmaxPrettyPrintLevel = 3\n\tindentString        = \"  \"\n)\n\nvar (\n\tFunctionColor = color.New(color.FgMagenta).SprintfFunc()\n\tSpecialColor  = color.New(color.Bold).SprintfFunc()\n\tNumberColor   = color.New(color.FgRed).SprintfFunc()\n\tStringColor   = color.New(color.FgGreen).SprintfFunc()\n\tErrorColor    = color.New(color.FgHiRed).SprintfFunc()\n)\n\n// these fields are hidden when printing objects.\nvar boringKeys = map[string]bool{\n\t\"valueOf\":              true,\n\t\"toString\":             true,\n\t\"toLocaleString\":       true,\n\t\"hasOwnProperty\":       true,\n\t\"isPrototypeOf\":        true,\n\t\"propertyIsEnumerable\": true,\n\t\"constructor\":          true,\n}\n\n// prettyPrint writes value to standard output.\nfunc prettyPrint(vm *otto.Otto, value otto.Value, w io.Writer) {\n\tppctx{vm: vm, w: w}.printValue(value, 0, false)\n}\n\n// prettyError writes err to standard output.\nfunc prettyError(vm *otto.Otto, err error, w io.Writer) {\n\tfailure := err.Error()\n\tif ottoErr, ok := err.(*otto.Error); ok {\n\t\tfailure = ottoErr.String()\n\t}\n\tfmt.Fprint(w, ErrorColor(\"%s\", failure))\n}\n\nfunc (re *JSRE) prettyPrintJS(call otto.FunctionCall) otto.Value {\n\tfor _, v := range call.ArgumentList {\n\t\tprettyPrint(call.Otto, v, re.output)\n\t\tfmt.Fprintln(re.output)\n\t}\n\treturn otto.UndefinedValue()\n}\n\ntype ppctx struct {\n\tvm *otto.Otto\n\tw  io.Writer\n}\n\nfunc (ctx ppctx) indent(level int) string {\n\treturn strings.Repeat(indentString, level)\n}\n\nfunc (ctx ppctx) printValue(v otto.Value, level int, inArray bool) {\n\tswitch {\n\tcase v.IsObject():\n\t\tctx.printObject(v.Object(), level, inArray)\n\tcase v.IsNull():\n\t\tfmt.Fprint(ctx.w, SpecialColor(\"null\"))\n\tcase v.IsUndefined():\n\t\tfmt.Fprint(ctx.w, SpecialColor(\"undefined\"))\n\tcase v.IsString():\n\t\ts, _ := v.ToString()\n\t\tfmt.Fprint(ctx.w, StringColor(\"%q\", s))\n\tcase v.IsBoolean():\n\t\tb, _ := v.ToBoolean()\n\t\tfmt.Fprint(ctx.w, SpecialColor(\"%t\", b))\n\tcase v.IsNaN():\n\t\tfmt.Fprint(ctx.w, NumberColor(\"NaN\"))\n\tcase v.IsNumber():\n\t\ts, _ := v.ToString()\n\t\tfmt.Fprint(ctx.w, NumberColor(\"%s\", s))\n\tdefault:\n\t\tfmt.Fprint(ctx.w, \"<unprintable>\")\n\t}\n}\n\nfunc (ctx ppctx) printObject(obj *otto.Object, level int, inArray bool) {\n\tswitch obj.Class() {\n\tcase \"Array\", \"GoArray\":\n\t\tlv, _ := obj.Get(\"length\")\n\t\tlen, _ := lv.ToInteger()\n\t\tif len == 0 {\n\t\t\tfmt.Fprintf(ctx.w, \"[]\")\n\t\t\treturn\n\t\t}\n\t\tif level > maxPrettyPrintLevel {\n\t\t\tfmt.Fprint(ctx.w, \"[...]\")\n\t\t\treturn\n\t\t}\n\t\tfmt.Fprint(ctx.w, \"[\")\n\t\tfor i := int64(0); i < len; i++ {\n\t\t\tel, err := obj.Get(strconv.FormatInt(i, 10))\n\t\t\tif err == nil {\n\t\t\t\tctx.printValue(el, level+1, true)\n\t\t\t}\n\t\t\tif i < len-1 {\n\t\t\t\tfmt.Fprintf(ctx.w, \", \")\n\t\t\t}\n\t\t}\n\t\tfmt.Fprint(ctx.w, \"]\")\n\n\tcase \"Object\":\n\t\t// Print values from bignumber.js as regular numbers.\n\t\tif ctx.isBigNumber(obj) {\n\t\t\tfmt.Fprint(ctx.w, NumberColor(\"%s\", toString(obj)))\n\t\t\treturn\n\t\t}\n\t\t// Otherwise, print all fields indented, but stop if we're too deep.\n\t\tkeys := ctx.fields(obj)\n\t\tif len(keys) == 0 {\n\t\t\tfmt.Fprint(ctx.w, \"{}\")\n\t\t\treturn\n\t\t}\n\t\tif level > maxPrettyPrintLevel {\n\t\t\tfmt.Fprint(ctx.w, \"{...}\")\n\t\t\treturn\n\t\t}\n\t\tfmt.Fprintln(ctx.w, \"{\")\n\t\tfor i, k := range keys {\n\t\t\tv, _ := obj.Get(k)\n\t\t\tfmt.Fprintf(ctx.w, \"%s%s: \", ctx.indent(level+1), k)\n\t\t\tctx.printValue(v, level+1, false)\n\t\t\tif i < len(keys)-1 {\n\t\t\t\tfmt.Fprintf(ctx.w, \",\")\n\t\t\t}\n\t\t\tfmt.Fprintln(ctx.w)\n\t\t}\n\t\tif inArray {\n\t\t\tlevel--\n\t\t}\n\t\tfmt.Fprintf(ctx.w, \"%s}\", ctx.indent(level))\n\n\tcase \"Function\":\n\t\t// Use toString() to display the argument list if possible.\n\t\tif robj, err := obj.Call(\"toString\"); err != nil {\n\t\t\tfmt.Fprint(ctx.w, FunctionColor(\"function()\"))\n\t\t} else {\n\t\t\tdesc := strings.Trim(strings.Split(robj.String(), \"{\")[0], \" \\t\\n\")\n\t\t\tdesc = strings.Replace(desc, \" (\", \"(\", 1)\n\t\t\tfmt.Fprint(ctx.w, FunctionColor(\"%s\", desc))\n\t\t}\n\n\tcase \"RegExp\":\n\t\tfmt.Fprint(ctx.w, StringColor(\"%s\", toString(obj)))\n\n\tdefault:\n\t\tif v, _ := obj.Get(\"toString\"); v.IsFunction() && level <= maxPrettyPrintLevel {\n\t\t\ts, _ := obj.Call(\"toString\")\n\t\t\tfmt.Fprintf(ctx.w, \"<%s %s>\", obj.Class(), s.String())\n\t\t} else {\n\t\t\tfmt.Fprintf(ctx.w, \"<%s>\", obj.Class())\n\t\t}\n\t}\n}\n\nfunc (ctx ppctx) fields(obj *otto.Object) []string {\n\tvar (\n\t\tvals, methods []string\n\t\tseen          = make(map[string]bool)\n\t)\n\tadd := func(k string) {\n\t\tif seen[k] || boringKeys[k] || strings.HasPrefix(k, \"_\") {\n\t\t\treturn\n\t\t}\n\t\tseen[k] = true\n\t\tif v, _ := obj.Get(k); v.IsFunction() {\n\t\t\tmethods = append(methods, k)\n\t\t} else {\n\t\t\tvals = append(vals, k)\n\t\t}\n\t}\n\titerOwnAndConstructorKeys(ctx.vm, obj, add)\n\tsort.Strings(vals)\n\tsort.Strings(methods)\n\treturn append(vals, methods...)\n}\n\nfunc iterOwnAndConstructorKeys(vm *otto.Otto, obj *otto.Object, f func(string)) {\n\tseen := make(map[string]bool)\n\titerOwnKeys(vm, obj, func(prop string) {\n\t\tseen[prop] = true\n\t\tf(prop)\n\t})\n\tif cp := constructorPrototype(obj); cp != nil {\n\t\titerOwnKeys(vm, cp, func(prop string) {\n\t\t\tif !seen[prop] {\n\t\t\t\tf(prop)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc iterOwnKeys(vm *otto.Otto, obj *otto.Object, f func(string)) {\n\tObject, _ := vm.Object(\"Object\")\n\trv, _ := Object.Call(\"getOwnPropertyNames\", obj.Value())\n\tgv, _ := rv.Export()\n\tswitch gv := gv.(type) {\n\tcase []interface{}:\n\t\tfor _, v := range gv {\n\t\t\tf(v.(string))\n\t\t}\n\tcase []string:\n\t\tfor _, v := range gv {\n\t\t\tf(v)\n\t\t}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"Object.getOwnPropertyNames returned unexpected type %T\", gv))\n\t}\n}\n\nfunc (ctx ppctx) isBigNumber(v *otto.Object) bool {\n\t// Handle numbers with custom constructor.\n\tif v, _ := v.Get(\"constructor\"); v.Object() != nil {\n\t\tif strings.HasPrefix(toString(v.Object()), \"function BigNumber\") {\n\t\t\treturn true\n\t\t}\n\t}\n\t// Handle default constructor.\n\tBigNumber, _ := ctx.vm.Object(\"BigNumber.prototype\")\n\tif BigNumber == nil {\n\t\treturn false\n\t}\n\tbv, _ := BigNumber.Call(\"isPrototypeOf\", v)\n\tb, _ := bv.ToBoolean()\n\treturn b\n}\n\nfunc toString(obj *otto.Object) string {\n\ts, _ := obj.Call(\"toString\")\n\treturn s.String()\n}\n\nfunc constructorPrototype(obj *otto.Object) *otto.Object {\n\tif v, _ := obj.Get(\"constructor\"); v.Object() != nil {\n\t\tif v, _ = v.Object().Get(\"prototype\"); v.Object() != nil {\n\t\t\treturn v.Object()\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "internal/web3ext/web3ext.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// package web3ext contains gero specific web3.js extensions.\npackage web3ext\n\nvar Modules = map[string]string{\n\t\"admin\":      Admin_JS,\n\t\"chequebook\": Chequebook_JS,\n\t\"clique\":     Clique_JS,\n\t\"debug\":      Debug_JS,\n\t\"sero\":       SER_JS,\n\t\"miner\":      Miner_JS,\n\t\"net\":        Net_JS,\n\t\"personal\":   Personal_JS,\n\t\"rpc\":        RPC_JS,\n\t\"shh\":        Shh_JS,\n\t\"swarmfs\":    SWARMFS_JS,\n\t\"txpool\":     TxPool_JS,\n\t\"ssi\":        SSI_JS,\n\t\"exchange\":   Exchange_JS,\n\t\"light\":      LightNode_JS,\n\t\"stake\":      Stake_JS,\n\t\"flight\":     Flight_JS,\n\t\"local\":      Local_JS,\n}\n\nconst Chequebook_JS = `\nweb3._extend({\n\tproperty: 'chequebook',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'deposit',\n\t\t\tcall: 'chequebook_deposit',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [null]\n\t\t}),\n\t\tnew web3._extend.Property({\n\t\t\tname: 'balance',\n\t\t\tgetter: 'chequebook_balance',\n\t\t\toutputFormatter: web3._extend.utils.toDecimal\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'cash',\n\t\t\tcall: 'chequebook_cash',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'issue',\n\t\t\tcall: 'chequebook_issue',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [null, null]\n\t\t}),\n\t]\n});\n`\n\nconst Clique_JS = `\nweb3._extend({\n\tproperty: 'clique',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getSnapshot',\n\t\t\tcall: 'clique_getSnapshot',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getSnapshotAtHash',\n\t\t\tcall: 'clique_getSnapshotAtHash',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getSigners',\n\t\t\tcall: 'clique_getSigners',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getSignersAtHash',\n\t\t\tcall: 'clique_getSignersAtHash',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'propose',\n\t\t\tcall: 'clique_propose',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'discard',\n\t\t\tcall: 'clique_discard',\n\t\t\tparams: 1\n\t\t}),\n\t],\n\tproperties: [\n\t\tnew web3._extend.Property({\n\t\t\tname: 'proposals',\n\t\t\tgetter: 'clique_proposals'\n\t\t}),\n\t]\n});\n`\n\nconst Admin_JS = `\nweb3._extend({\n\tproperty: 'admin',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'addPeer',\n\t\t\tcall: 'admin_addPeer',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'removePeer',\n\t\t\tcall: 'admin_removePeer',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'exportChain',\n\t\t\tcall: 'admin_exportChain',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'importChain',\n\t\t\tcall: 'admin_importChain',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'sleepBlocks',\n\t\t\tcall: 'admin_sleepBlocks',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'startRPC',\n\t\t\tcall: 'admin_startRPC',\n\t\t\tparams: 4,\n\t\t\tinputFormatter: [null, null, null, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'stopRPC',\n\t\t\tcall: 'admin_stopRPC'\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'startWS',\n\t\t\tcall: 'admin_startWS',\n\t\t\tparams: 4,\n\t\t\tinputFormatter: [null, null, null, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'stopWS',\n\t\t\tcall: 'admin_stopWS'\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'close',\n\t\t\tcall: 'admin_close',\n\t\t\tparams: 0\n\t\t}),\n\t],\n\tproperties: [\n\t\tnew web3._extend.Property({\n\t\t\tname: 'nodeInfo',\n\t\t\tgetter: 'admin_nodeInfo'\n\t\t}),\n\t\tnew web3._extend.Property({\n\t\t\tname: 'peers',\n\t\t\tgetter: 'admin_peers'\n\t\t}),\n\t\tnew web3._extend.Property({\n\t\t\tname: 'datadir',\n\t\t\tgetter: 'admin_datadir'\n\t\t}),\n\t]\n});\n`\n\nconst Debug_JS = `\nweb3._extend({\n\tproperty: 'debug',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'printBlock',\n\t\t\tcall: 'debug_printBlock',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getBlockRlp',\n\t\t\tcall: 'debug_getBlockRlp',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setHead',\n\t\t\tcall: 'debug_setHead',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'seedHash',\n\t\t\tcall: 'debug_seedHash',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'dumpBlock',\n\t\t\tcall: 'debug_dumpBlock',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'chaindbProperty',\n\t\t\tcall: 'debug_chaindbProperty',\n\t\t\tparams: 1,\n\t\t\toutputFormatter: console.log\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'chaindbCompact',\n\t\t\tcall: 'debug_chaindbCompact',\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'metrics',\n\t\t\tcall: 'debug_metrics',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'verbosity',\n\t\t\tcall: 'debug_verbosity',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'vmodule',\n\t\t\tcall: 'debug_vmodule',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'backtraceAt',\n\t\t\tcall: 'debug_backtraceAt',\n\t\t\tparams: 1,\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'stacks',\n\t\t\tcall: 'debug_stacks',\n\t\t\tparams: 0,\n\t\t\toutputFormatter: console.log\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'freeOSMemory',\n\t\t\tcall: 'debug_freeOSMemory',\n\t\t\tparams: 0,\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setGCPercent',\n\t\t\tcall: 'debug_setGCPercent',\n\t\t\tparams: 1,\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'memStats',\n\t\t\tcall: 'debug_memStats',\n\t\t\tparams: 0,\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'gcStats',\n\t\t\tcall: 'debug_gcStats',\n\t\t\tparams: 0,\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'cpuProfile',\n\t\t\tcall: 'debug_cpuProfile',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'startCPUProfile',\n\t\t\tcall: 'debug_startCPUProfile',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'stopCPUProfile',\n\t\t\tcall: 'debug_stopCPUProfile',\n\t\t\tparams: 0\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'goTrace',\n\t\t\tcall: 'debug_goTrace',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'startGoTrace',\n\t\t\tcall: 'debug_startGoTrace',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'stopGoTrace',\n\t\t\tcall: 'debug_stopGoTrace',\n\t\t\tparams: 0\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'blockProfile',\n\t\t\tcall: 'debug_blockProfile',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setBlockProfileRate',\n\t\t\tcall: 'debug_setBlockProfileRate',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'writeBlockProfile',\n\t\t\tcall: 'debug_writeBlockProfile',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'mutexProfile',\n\t\t\tcall: 'debug_mutexProfile',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setMutexProfileFraction',\n\t\t\tcall: 'debug_setMutexProfileFraction',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'writeMutexProfile',\n\t\t\tcall: 'debug_writeMutexProfile',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'writeMemProfile',\n\t\t\tcall: 'debug_writeMemProfile',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'traceBlock',\n\t\t\tcall: 'debug_traceBlock',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [null, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'traceBlockFromFile',\n\t\t\tcall: 'debug_traceBlockFromFile',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [null, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'traceBlockByNumber',\n\t\t\tcall: 'debug_traceBlockByNumber',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [null, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'traceBlockByHash',\n\t\t\tcall: 'debug_traceBlockByHash',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [null, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'traceTransaction',\n\t\t\tcall: 'debug_traceTransaction',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [null, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'preimage',\n\t\t\tcall: 'debug_preimage',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getBadBlocks',\n\t\t\tcall: 'debug_getBadBlocks',\n\t\t\tparams: 0,\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'storageRangeAt',\n\t\t\tcall: 'debug_storageRangeAt',\n\t\t\tparams: 5,\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getModifiedAccountsByNumber',\n\t\t\tcall: 'debug_getModifiedAccountsByNumber',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [null, null],\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getModifiedAccountsByHash',\n\t\t\tcall: 'debug_getModifiedAccountsByHash',\n\t\t\tparams: 2,\n\t\t\tinputFormatter:[null, null],\n\t\t}),\n\t],\n\tproperties: []\n});\n`\n\nconst SER_JS = `\nweb3._extend({\n\tproperty: 'sero',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getSzkAccounts',\n\t\t\tcall: 'sero_getSzkAccounts',\n\t\t\tparams: 0\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'genOldIndexPKr',\n\t\t\tcall: 'sero_genOldIndexPKr',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'sign',\n\t\t\tcall: 'sero_sign',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [web3._extend.formatters.inputAddressFormatter, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'resend',\n\t\t\tcall: 'sero_resend',\n\t\t\tparams: 3,\n\t\t\tinputFormatter: [web3._extend.formatters.inputTransactionFormatter, web3._extend.utils.fromDecimal, web3._extend.utils.fromDecimal]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'signTransaction',\n\t\t\tcall: 'sero_signTransaction',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.formatters.inputTransactionFormatter]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'submitTransaction',\n\t\t\tcall: 'sero_submitTransaction',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.formatters.inputTransactionFormatter]\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getBlockTotalRewardByNumber',\n\t\t\tcall: 'sero_getBlockTotalRewardByNumber',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.utils.toHex],\n\t\t\toutputFormatter: web3._extend.utils.toDecimal\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'getBlockPosRewardByNumber',\n\t\t\tcall: 'sero_getBlockPosRewardByNumber',\n\t\t\tparams: 1,\n            inputFormatter: [web3._extend.utils.toHex],\n\t\t\toutputFormatter: web3._extend.utils.toDecimal\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getRawTransaction',\n\t\t\tcall: 'sero_getRawTransactionByHash',\n\t\t\tparams: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'sendRawTransaction',\n\t\t\tcall: 'sero_sendRawTransaction',\n\t\t\tparams: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getCommittedTx',\n\t\t\tcall: 'sero_getCommittedTx',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'resendCommittedTx',\n\t\t\tcall: 'sero_resendCommittedTx',\n            params: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getRawTransactionFromBlock',\n\t\t\tcall: function(args) {\n\t\t\t\treturn (web3._extend.utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'sero_getRawTransactionByBlockHashAndIndex' : 'sero_getRawTransactionByBlockNumberAndIndex';\n\t\t\t},\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex]\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'packMethod',\n            call: 'sero_packMethod',\t\n\t\t\tparams:4\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'packConstruct',\n            call: 'sero_packConstruct',\t\n\t\t\tparams: 3\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'unPack',\n            call: 'sero_unPack',\t\n\t\t\tparams: 3\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'getShortAddress',\n            call: 'sero_getShortAddress',\t\n\t\t\tparams: 1\n\t\t}),\n\t],\n\tproperties: [\n\t\tnew web3._extend.Property({\n\t\t\tname: 'pendingTransactions',\n\t\t\tgetter: 'sero_pendingTransactions',\n\t\t\toutputFormatter: function(txs) {\n\t\t\t\tvar formatted = [];\n\t\t\t\tfor (var i = 0; i < txs.length; i++) {\n\t\t\t\t\tformatted.push(web3._extend.formatters.outputTransactionFormatter(txs[i]));\n\t\t\t\t\tformatted[i].blockHash = null;\n\t\t\t\t}\n\t\t\t\treturn formatted;\n\t\t\t}\n\t\t}),\n\t]\n});\n`\n\nconst Miner_JS = `\nweb3._extend({\n\tproperty: 'miner',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'start',\n\t\t\tcall: 'miner_start',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'stop',\n\t\t\tcall: 'miner_stop'\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setSerobase',\n\t\t\tcall: 'miner_setSerobase',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.formatters.inputAddressFormatter]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setExtra',\n\t\t\tcall: 'miner_setExtra',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setGasPrice',\n\t\t\tcall: 'miner_setGasPrice',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.utils.fromDecimal]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getHashrate',\n\t\t\tcall: 'miner_getHashrate'\n\t\t}),\n\t],\n\tproperties: []\n});\n`\n\nconst Net_JS = `\nweb3._extend({\n\tproperty: 'net',\n\tmethods: [],\n\tproperties: [\n\t\tnew web3._extend.Property({\n\t\t\tname: 'version',\n\t\t\tgetter: 'net_version'\n\t\t}),\n\t]\n});\n`\n\nconst Personal_JS = `\nweb3._extend({\n\tproperty: 'personal',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'importRawKey',\n\t\t\tcall: 'personal_importRawKey',\n\t\t\tparams: 4\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'exportRawKey',\n\t\t\tcall: 'personal_exportRawKey',\n\t\t\tparams: 2\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'genSeed',\n\t\t\tcall: 'personal_genSeed',\n\t\t\tparams: 0\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'sign',\n\t\t\tcall: 'personal_sign',\n\t\t\tparams: 3,\n\t\t\tinputFormatter: [null, web3._extend.formatters.inputAddressFormatter, null]\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'exportMnemonic',\n\t\t\tcall: 'personal_exportMnemonic',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [web3._extend.formatters.inputAddressFormatter, null]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'ecRecover',\n\t\t\tcall: 'personal_ecRecover',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'deriveAccount',\n\t\t\tcall: 'personal_deriveAccount',\n\t\t\tparams: 3\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'signTransaction',\n\t\t\tcall: 'personal_signTransaction',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [web3._extend.formatters.inputTransactionFormatter, null]\n\t\t}),\n\t],\n\tproperties: [\n\t\tnew web3._extend.Property({\n\t\t\tname: 'listWallets',\n\t\t\tgetter: 'personal_listWallets'\n\t\t}),\n\t]\n})\n`\n\nconst RPC_JS = `\nweb3._extend({\n\tproperty: 'rpc',\n\tmethods: [],\n\tproperties: [\n\t\tnew web3._extend.Property({\n\t\t\tname: 'modules',\n\t\t\tgetter: 'rpc_modules'\n\t\t}),\n\t]\n});\n`\n\nconst Shh_JS = `\nweb3._extend({\n\tproperty: 'shh',\n\tmethods: [\n\t],\n\tproperties:\n\t[\n\t\tnew web3._extend.Property({\n\t\t\tname: 'version',\n\t\t\tgetter: 'shh_version',\n\t\t\toutputFormatter: web3._extend.utils.toDecimal\n\t\t}),\n\t\tnew web3._extend.Property({\n\t\t\tname: 'info',\n\t\t\tgetter: 'shh_info'\n\t\t}),\n\t]\n});\n`\n\nconst SWARMFS_JS = `\nweb3._extend({\n\tproperty: 'swarmfs',\n\tmethods:\n\t[\n\t\tnew web3._extend.Method({\n\t\t\tname: 'mount',\n\t\t\tcall: 'swarmfs_mount',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'unmount',\n\t\t\tcall: 'swarmfs_unmount',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'listmounts',\n\t\t\tcall: 'swarmfs_listmounts',\n\t\t\tparams: 0\n\t\t}),\n\t]\n});\n`\n\nconst TxPool_JS = `\nweb3._extend({\n\tproperty: 'txpool',\n\tmethods: [],\n\tproperties:\n\t[\n\t\tnew web3._extend.Property({\n\t\t\tname: 'content',\n\t\t\tgetter: 'txpool_content'\n\t\t}),\n\t\tnew web3._extend.Property({\n\t\t\tname: 'status',\n\t\t\tgetter: 'txpool_status',\n\t\t\toutputFormatter: function(status) {\n\t\t\t\tstatus.pending = web3._extend.utils.toDecimal(status.pending);\n\t\t\t\tstatus.queued = web3._extend.utils.toDecimal(status.queued);\n\t\t\t\treturn status;\n\t\t\t}\n\t\t}),\n\t]\n});\n`\n\nconst SSI_JS = `\nweb3._extend({\n\tproperty: 'ssi',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'szkcreatekr',\n\t\t\tcall: 'ssi_szkCreateKr',\n\t\t\tparams: 0\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'createkr',\n\t\t\tcall: 'ssi_createKr',\n\t\t\tparams: 0\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getblocksinfo',\n\t\t\tcall: 'ssi_getBlocksInfo',\n\t\t\tparams: 2,\n\t\t\tinputFormatter: [\n\t\t\t\tweb3._extend.utils.toHex,\n\t\t\t\tweb3._extend.utils.toHex\n\t\t\t]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'detail',\n\t\t\tcall: 'ssi_detail',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'gentx',\n\t\t\tcall: 'ssi_genTx',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'gettx',\n\t\t\tcall: 'ssi_getTx',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'committx',\n\t\t\tcall: 'ssi_commitTx',\n\t\t\tparams: 1\n\t\t})\n\t]\n});\n`\n\nconst Exchange_JS = `\nweb3._extend({\n\tproperty: 'exchange',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getOut',\n\t\t\tcall: 'exchange_getOut',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getBalances',\n\t\t\tcall: 'exchange_getBalances',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getLockedBalances',\n\t\t\tcall: 'exchange_getLockedBalances',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getMaxAvailable',\n\t\t\tcall: 'exchange_getMaxAvailable',\n\t\t\tparams: 2\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'clearUsedFlag',\n\t\t\tcall: 'exchange_clearUsedFlag',\n\t\t\tparams: 1\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'clearUsedFlagForRoot',\n\t\t\tcall: 'exchange_clearUsedFlagForRoot',\n\t\t\tparams: 1\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'genMergeTx',\n\t\t\tcall: 'exchange_genMergeTx',\n\t\t\tparams: 1\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'getTx',\n\t\t\tcall: 'exchange_getTx',\n\t\t\tparams: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getBlocksInfo',\n\t\t\tcall: 'exchange_getBlocksInfo',\n\t\t\tparams: 2\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'getPkByPkr',\n\t\t\tcall: 'exchange_getPkByPkr',\n\t\t\tparams: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getBlockByNumber',\n\t\t\tcall: 'exchange_getBlockByNumber',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getCommittedTx',\n\t\t\tcall: 'exchange_getCommittedTx',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'resendCommittedTx',\n\t\t\tcall: 'exchange_resendCommittedTx',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'seed2Sk',\n\t\t\tcall: 'exchange_seed2Sk',\n            params: 2\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'sk2Tk',\n\t\t\tcall: 'exchange_sk2Tk',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'tk2Pk',\n\t\t\tcall: 'exchange_tk2Pk',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'pk2Pkr',\n\t\t\tcall: 'exchange_pk2Pkr',\n            params: 2\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'signTxWithSk',\n\t\t\tcall: 'exchange_signTxWithSk',\n            params: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'setBalancePkr',\n\t\t\tcall: 'exchange_setBalancePkr',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'ignorePkrUtxos',\n\t\t\tcall: 'exchange_ignorePkrUtxos',\n\t\t\tparams: 2\n\t\t})\n\t]\n});\n`\nconst Stake_JS = `\nweb3._extend({\n\tproperty: 'stake',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'buyShare',\n\t\t\tcall: 'stake_buyShare',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.formatters.inputTransactionFormatter]\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'estimateShares',\n\t\t\tcall: 'stake_estimateShares',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.formatters.inputTransactionFormatter]\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'registStakePool',\n\t\t\tcall: 'stake_registStakePool',\n\t\t\tparams: 1,\n\t\t\tinputFormatter: [web3._extend.formatters.inputRegistPoolFormatter]\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'poolState',\n\t\t\tcall: 'stake_poolState',\n\t\t\tparams: 1,\n\t\t\toutputFormatter: web3._extend.formatters.outputStakePoolFormatter\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'myShare',\n\t\t\tcall: 'stake_myShare',\n\t\t\tparams:1,\n            outputFormatter: web3._extend.formatters.outputStakeShareFormatter\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getShareByPkr',\n\t\t\tcall: 'stake_getShareByPkr',\n\t\t\tparams:1,\n            outputFormatter: web3._extend.formatters.outputStakeShareFormatter\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getShare',\n\t\t\tcall: 'stake_getShare',\n\t\t\tparams:1,\n            outputFormatter: web3._extend.formatters.outputStakeShareFormatter\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'stakePools',\n\t\t\tcall: 'stake_stakePools',\n\t\t\tparams:0,\n            outputFormatter: web3._extend.formatters.outputStakePoolFormatter\n\t\t}),\n       new web3._extend.Method({\n\t\t\tname: 'closeStakePool',\n\t\t\tcall: 'stake_closeStakePool',\n\t\t\tparams:1 \n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'modifyStakePoolFee',\n\t\t\tcall: 'stake_modifyStakePoolFee',\n\t\t\tparams:2,\n\t\t\tinputFormatter: [null, web3._extend.utils.toHex]\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'modifyStakePoolVote',\n\t\t\tcall: 'stake_modifyStakePoolVote',\n\t\t\tparams:2 \n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getStakeInfo',\n\t\t\tcall: 'stake_getStakeInfo',\n\t\t\tparams:3,\n            inputFormatter: [null,web3._extend.utils.toHex,web3._extend.utils.toHex],\n            outputFormatter: web3._extend.formatters.outputStakeInfoFormatter\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getShareByPkrV2',\n\t\t\tcall: 'stake_getShareByPkrV2',\n\t\t\tparams:1,\n            outputFormatter: web3._extend.formatters.outputStakeShareFormatter\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'myShareV2',\n\t\t\tcall: 'stake_myShareV2',\n\t\t\tparams:1,\n            outputFormatter: web3._extend.formatters.outputStakeShareFormatter\n\t\t})\n\t],\n    properties: [\n       new web3._extend.Property({\n\t\t\tname: 'sharePoolSize',\n\t\t\tgetter: 'stake_sharePoolSize',\n            outputFormatter: web3._extend.utils.toDecimal\n\t\t}),\n       new web3._extend.Property({\n\t\t\tname: 'sharePrice',\n\t\t\tgetter: 'stake_sharePrice',\n            outputFormatter: web3._extend.utils.toDecimal\n\t\t})\n\t]\n});\n`\n\nconst LightNode_JS = `\nweb3._extend({\n\tproperty: 'light',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getOutsByPKr',\n\t\t\tcall: 'light_getOutsByPKr',\n\t\t\tparams: 3\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'getPendingOuts',\n\t\t\tcall: 'light_getPendingOuts',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'checkNil',\n\t\t\tcall: 'light_checkNil',\n\t\t\tparams: 1\n\t\t}),\n\t]\n});\n`\n\nconst Flight_JS = `\nweb3._extend({\n\tproperty: 'flight',\n\tmethods: [\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getBlocksInfo',\n\t\t\tcall: 'flight_getBlocksInfo',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getBlockByNumber',\n\t\t\tcall: 'flight_getBlockByNumber',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'genTxParam',\n\t\t\tcall: 'flight_genTxParam',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'commitTx',\n\t\t\tcall: 'flight_commitTx',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'Trace2Root',\n\t\t\tcall: 'flight_trace2Root',\n\t\t\tparams: 3\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getOut',\n\t\t\tcall: 'flight_getOut',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getTx',\n\t\t\tcall: 'flight_getTx',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'getTxReceipt',\n\t\t\tcall: 'flight_getTxReceipt',\n\t\t\tparams: 1\n\t\t})\n\t]\n});\n`\n\nconst Local_JS = `\nweb3._extend({\n\tproperty: 'local',\n\tmethods: [\n        new web3._extend.Method({\n\t\t\tname: 'currencyToId',\n\t\t\tcall: 'local_currencyToId',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'idToCurrency',\n\t\t\tcall: 'local_idToCurrency',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'genSeed',\n\t\t\tcall: 'local_genSeed',\n            params: 0\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'seed2Mnemonic',\n\t\t\tcall: 'local_seed2Mnemonic',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'seed2Sk',\n\t\t\tcall: 'local_seed2Sk',\n            params: 2\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'sk2Tk',\n\t\t\tcall: 'local_sk2Tk',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'tk2Pk',\n\t\t\tcall: 'local_tk2Pk',\n            params: 1\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'pk2Pkr',\n\t\t\tcall: 'local_pk2Pkr',\n            params: 2\n\t\t}),\n        new web3._extend.Method({\n\t\t\tname: 'signTxWithSk',\n\t\t\tcall: 'local_signTxWithSk',\n            params: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'decOut',\n\t\t\tcall: 'local_decOut',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'confirmOutZ',\n\t\t\tcall: 'local_confirmOutZ',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'confirmOutC',\n\t\t\tcall: 'local_confirmOutC',\n\t\t\tparams: 2\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'isPkrValid',\n\t\t\tcall: 'local_isPkrValid',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'isPkValid',\n\t\t\tcall: 'local_isPkValid',\n\t\t\tparams: 1\n\t\t}),\n\t\tnew web3._extend.Method({\n\t\t\tname: 'isMyPkr',\n\t\t\tcall: 'local_isMyPkr',\n\t\t\tparams: 2\n\t\t})\n\t]\n});\n`\n"
  },
  {
    "path": "log/CONTRIBUTORS",
    "content": "Contributors to log15:\n\n- Aaron L \n- Alan Shreve \n- Chris Hines \n- Ciaran Downey \n- Dmitry Chestnykh \n- Evan Shaw \n- Péter Szilágyi \n- Trevor Gattis \n- Vincent Vanackere \n"
  },
  {
    "path": "log/LICENSE",
    "content": "Copyright 2014 Alan Shreve\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "log/README.md",
    "content": "![obligatory xkcd](http://imgs.xkcd.com/comics/standards.png)\n\n# log15 [![godoc reference](https://godoc.org/github.com/inconshreveable/log15?status.png)](https://godoc.org/github.com/inconshreveable/log15) [![Build Status](https://travis-ci.org/inconshreveable/log15.svg?branch=master)](https://travis-ci.org/inconshreveable/log15)\n\nPackage log15 provides an opinionated, simple toolkit for best-practice logging in Go (golang) that is both human and machine readable. It is modeled after the Go standard library's [`io`](http://golang.org/pkg/io/) and [`net/http`](http://golang.org/pkg/net/http/) packages and is an alternative to the standard library's [`log`](http://golang.org/pkg/log/) package.\n\n## Features\n- A simple, easy-to-understand API\n- Promotes structured logging by encouraging use of key/value pairs\n- Child loggers which inherit and add their own private context\n- Lazy evaluation of expensive operations\n- Simple Handler interface allowing for construction of flexible, custom logging configurations with a tiny API.\n- Color terminal support\n- Built-in support for logging to files, streams, syslog, and the network\n- Support for forking records to multiple handlers, buffering records for output, failing over from failed handler writes, + more\n\n## Versioning\nThe API of the master branch of log15 should always be considered unstable. If you want to rely on a stable API,\nyou must vendor the library.\n\n## Importing\n\n```go\nimport log \"github.com/inconshreveable/log15\"\n```\n\n## Examples\n\n```go\n// all loggers can have key/value context\nsrvlog := log.New(\"module\", \"app/server\")\n\n// all log messages can have key/value context\nsrvlog.Warn(\"abnormal conn rate\", \"rate\", curRate, \"low\", lowRate, \"high\", highRate)\n\n// child loggers with inherited context\nconnlog := srvlog.New(\"raddr\", c.RemoteAddr())\nconnlog.Info(\"connection open\")\n\n// lazy evaluation\nconnlog.Debug(\"ping remote\", \"latency\", log.Lazy{pingRemote})\n\n// flexible configuration\nsrvlog.SetHandler(log.MultiHandler(\n    log.StreamHandler(os.Stderr, log.LogfmtFormat()),\n    log.LvlFilterHandler(\n        log.LvlError,\n        log.Must.FileHandler(\"errors.json\", log.JSONFormat()))))\n```\n\nWill result in output that looks like this:\n\n```\nWARN[06-17|21:58:10] abnormal conn rate                       module=app/server rate=0.500 low=0.100 high=0.800\nINFO[06-17|21:58:10] connection open                          module=app/server raddr=10.0.0.1\n```\n\n## Breaking API Changes\nThe following commits broke API stability. This reference is intended to help you understand the consequences of updating to a newer version\nof log15.\n\n- 57a084d014d4150152b19e4e531399a7145d1540 - Added a `Get()` method to the `Logger` interface to retrieve the current handler\n- 93404652ee366648fa622b64d1e2b67d75a3094a - `Record` field `Call` changed to `stack.Call` with switch to `github.com/go-stack/stack`\n- a5e7613673c73281f58e15a87d2cf0cf111e8152 - Restored `syslog.Priority` argument to the `SyslogXxx` handler constructors\n\n## FAQ\n\n### The varargs style is brittle and error prone! Can I have type safety please?\nYes. Use `log.Ctx`:\n\n```go\nsrvlog := log.New(log.Ctx{\"module\": \"app/server\"})\nsrvlog.Warn(\"abnormal conn rate\", log.Ctx{\"rate\": curRate, \"low\": lowRate, \"high\": highRate})\n```\n\n## License\nApache\n"
  },
  {
    "path": "log/README_ETHEREUM.md",
    "content": "This package is a fork of https://github.com/inconshreveable/log15, with some\nminor modifications required by the go-sero codebase:\n\n * Support for log level `trace`\n * Modified behavior to exit on `critical` failure\n"
  },
  {
    "path": "log/doc.go",
    "content": "/*\nPackage log15 provides an opinionated, simple toolkit for best-practice logging that is\nboth human and machine readable. It is modeled after the standard library's io and net/http\npackages.\n\nThis package enforces you to only log key/value pairs. Keys must be strings. Values may be\nany type that you like. The default output format is logfmt, but you may also choose to use\nJSON instead if that suits you. Here's how you log:\n\n    log.Info(\"page accessed\", \"path\", r.URL.Path, \"user_id\", user.id)\n\nThis will output a line that looks like:\n\n     lvl=info t=2014-05-02T16:07:23-0700 msg=\"page accessed\" path=/org/71/profile user_id=9\n\nGetting Started\n\nTo get started, you'll want to import the library:\n\n    import log \"github.com/inconshreveable/log15\"\n\n\nNow you're ready to start logging:\n\n    func main() {\n        log.Info(\"Program starting\", \"args\", os.Args())\n    }\n\n\nConvention\n\nBecause recording a human-meaningful message is common and good practice, the first argument to every\nlogging method is the value to the *implicit* key 'msg'.\n\nAdditionally, the level you choose for a message will be automatically added with the key 'lvl', and so\nwill the current timestamp with key 't'.\n\nYou may supply any additional context as a set of key/value pairs to the logging function. log15 allows\nyou to favor terseness, ordering, and speed over safety. This is a reasonable tradeoff for\nlogging functions. You don't need to explicitly state keys/values, log15 understands that they alternate\nin the variadic argument list:\n\n    log.Warn(\"size out of bounds\", \"low\", lowBound, \"high\", highBound, \"val\", val)\n\nIf you really do favor your type-safety, you may choose to pass a log.Ctx instead:\n\n    log.Warn(\"size out of bounds\", log.Ctx{\"low\": lowBound, \"high\": highBound, \"val\": val})\n\n\nContext loggers\n\nFrequently, you want to add context to a logger so that you can track actions associated with it. An http\nrequest is a good example. You can easily create new loggers that have context that is automatically included\nwith each log line:\n\n    requestlogger := log.New(\"path\", r.URL.Path)\n\n    // later\n    requestlogger.Debug(\"db txn commit\", \"duration\", txnTimer.Finish())\n\nThis will output a log line that includes the path context that is attached to the logger:\n\n    lvl=dbug t=2014-05-02T16:07:23-0700 path=/repo/12/add_hook msg=\"db txn commit\" duration=0.12\n\n\nHandlers\n\nThe Handler interface defines where log lines are printed to and how they are formated. Handler is a\nsingle interface that is inspired by net/http's handler interface:\n\n    type Handler interface {\n        Log(r *Record) error\n    }\n\n\nHandlers can filter records, format them, or dispatch to multiple other Handlers.\nThis package implements a number of Handlers for common logging patterns that are\neasily composed to create flexible, custom logging structures.\n\nHere's an example handler that prints logfmt output to Stdout:\n\n    handler := log.StreamHandler(os.Stdout, log.LogfmtFormat())\n\nHere's an example handler that defers to two other handlers. One handler only prints records\nfrom the rpc package in logfmt to standard out. The other prints records at Error level\nor above in JSON formatted output to the file /var/log/service.json\n\n    handler := log.MultiHandler(\n        log.LvlFilterHandler(log.LvlError, log.Must.FileHandler(\"/var/log/service.json\", log.JSONFormat())),\n        log.MatchFilterHandler(\"pkg\", \"app/rpc\" log.StdoutHandler())\n    )\n\nLogging File Names and Line Numbers\n\nThis package implements three Handlers that add debugging information to the\ncontext, CallerFileHandler, CallerFuncHandler and CallerStackHandler. Here's\nan example that adds the source file and line number of each logging call to\nthe context.\n\n    h := log.CallerFileHandler(log.StdoutHandler)\n    log.Root().SetHandler(h)\n    ...\n    log.Error(\"open file\", \"err\", err)\n\nThis will output a line that looks like:\n\n    lvl=eror t=2014-05-02T16:07:23-0700 msg=\"open file\" err=\"file not found\" caller=data.go:42\n\nHere's an example that logs the call stack rather than just the call site.\n\n    h := log.CallerStackHandler(\"%+v\", log.StdoutHandler)\n    log.Root().SetHandler(h)\n    ...\n    log.Error(\"open file\", \"err\", err)\n\nThis will output a line that looks like:\n\n    lvl=eror t=2014-05-02T16:07:23-0700 msg=\"open file\" err=\"file not found\" stack=\"[pkg/data.go:42 pkg/cmd/main.go]\"\n\nThe \"%+v\" format instructs the handler to include the path of the source file\nrelative to the compile time GOPATH. The github.com/go-stack/stack package\ndocuments the full list of formatting verbs and modifiers available.\n\nCustom Handlers\n\nThe Handler interface is so simple that it's also trivial to write your own. Let's create an\nexample handler which tries to write to one handler, but if that fails it falls back to\nwriting to another handler and includes the error that it encountered when trying to write\nto the primary. This might be useful when trying to log over a network socket, but if that\nfails you want to log those records to a file on disk.\n\n    type BackupHandler struct {\n        Primary Handler\n        Secondary Handler\n    }\n\n    func (h *BackupHandler) Log (r *Record) error {\n        err := h.Primary.Log(r)\n        if err != nil {\n            r.Ctx = append(ctx, \"primary_err\", err)\n            return h.Secondary.Log(r)\n        }\n        return nil\n    }\n\nThis pattern is so useful that a generic version that handles an arbitrary number of Handlers\nis included as part of this library called FailoverHandler.\n\nLogging Expensive Operations\n\nSometimes, you want to log values that are extremely expensive to compute, but you don't want to pay\nthe price of computing them if you haven't turned up your logging level to a high level of detail.\n\nThis package provides a simple type to annotate a logging operation that you want to be evaluated\nlazily, just when it is about to be logged, so that it would not be evaluated if an upstream Handler\nfilters it out. Just wrap any function which takes no arguments with the log.Lazy type. For example:\n\n    func factorRSAKey() (factors []int) {\n        // return the factors of a very large number\n    }\n\n    log.Debug(\"factors\", log.Lazy{factorRSAKey})\n\nIf this message is not logged for any reason (like logging at the Error level), then\nfactorRSAKey is never evaluated.\n\nDynamic context values\n\nThe same log.Lazy mechanism can be used to attach context to a logger which you want to be\nevaluated when the message is logged, but not when the logger is created. For example, let's imagine\na game where you have Player objects:\n\n    type Player struct {\n        name string\n        alive bool\n        log.Logger\n    }\n\nYou always want to log a player's name and whether they're alive or dead, so when you create the player\nobject, you might do:\n\n    p := &Player{name: name, alive: true}\n    p.Logger = log.New(\"name\", p.name, \"alive\", p.alive)\n\nOnly now, even after a player has died, the logger will still report they are alive because the logging\ncontext is evaluated when the logger was created. By using the Lazy wrapper, we can defer the evaluation\nof whether the player is alive or not to each log message, so that the log records will reflect the player's\ncurrent state no matter when the log message is written:\n\n    p := &Player{name: name, alive: true}\n    isAlive := func() bool { return p.alive }\n    player.Logger = log.New(\"name\", p.name, \"alive\", log.Lazy{isAlive})\n\nTerminal Format\n\nIf log15 detects that stdout is a terminal, it will configure the default\nhandler for it (which is log.StdoutHandler) to use TerminalFormat. This format\nlogs records nicely for your terminal, including color-coded output based\non log level.\n\nError Handling\n\nBecasuse log15 allows you to step around the type system, there are a few ways you can specify\ninvalid arguments to the logging functions. You could, for example, wrap something that is not\na zero-argument function with log.Lazy or pass a context key that is not a string. Since logging libraries\nare typically the mechanism by which errors are reported, it would be onerous for the logging functions\nto return errors. Instead, log15 handles errors by making these guarantees to you:\n\n- Any log record containing an error will still be printed with the error explained to you as part of the log record.\n\n- Any log record containing an error will include the context key LOG15_ERROR, enabling you to easily\n(and if you like, automatically) detect if any of your logging calls are passing bad values.\n\nUnderstanding this, you might wonder why the Handler interface can return an error value in its Log method. Handlers\nare encouraged to return errors only if they fail to write their log records out to an external source like if the\nsyslog daemon is not responding. This allows the construction of useful handlers which cope with those failures\nlike the FailoverHandler.\n\nLibrary Use\n\nlog15 is intended to be useful for library authors as a way to provide configurable logging to\nusers of their library. Best practice for use in a library is to always disable all output for your logger\nby default and to provide a public Logger instance that consumers of your library can configure. Like so:\n\n    package yourlib\n\n    import \"github.com/inconshreveable/log15\"\n\n    var Log = log.New()\n\n    func init() {\n        Log.SetHandler(log.DiscardHandler())\n    }\n\nUsers of your library may then enable it if they like:\n\n    import \"github.com/inconshreveable/log15\"\n    import \"example.com/yourlib\"\n\n    func main() {\n        handler := // custom handler setup\n        yourlib.Log.SetHandler(handler)\n    }\n\nBest practices attaching logger context\n\nThe ability to attach context to a logger is a powerful one. Where should you do it and why?\nI favor embedding a Logger directly into any persistent object in my application and adding\nunique, tracing context keys to it. For instance, imagine I am writing a web browser:\n\n    type Tab struct {\n        url string\n        render *RenderingContext\n        // ...\n\n        Logger\n    }\n\n    func NewTab(url string) *Tab {\n        return &Tab {\n            // ...\n            url: url,\n\n            Logger: log.New(\"url\", url),\n        }\n    }\n\nWhen a new tab is created, I assign a logger to it with the url of\nthe tab as context so it can easily be traced through the logs.\nNow, whenever we perform any operation with the tab, we'll log with its\nembedded logger and it will include the tab title automatically:\n\n    tab.Debug(\"moved position\", \"idx\", tab.idx)\n\nThere's only one problem. What if the tab url changes? We could\nuse log.Lazy to make sure the current url is always written, but that\nwould mean that we couldn't trace a tab's full lifetime through our\nlogs after the user navigate to a new URL.\n\nInstead, think about what values to attach to your loggers the\nsame way you think about what to use as a key in a SQL database schema.\nIf it's possible to use a natural key that is unique for the lifetime of the\nobject, do so. But otherwise, log15's ext package has a handy RandId\nfunction to let you generate what you might call \"surrogate keys\"\nThey're just random hex identifiers to use for tracing. Back to our\nTab example, we would prefer to set up our Logger like so:\n\n        import logext \"github.com/inconshreveable/log15/ext\"\n\n        t := &Tab {\n            // ...\n            url: url,\n        }\n\n        t.Logger = log.New(\"id\", logext.RandId(8), \"url\", log.Lazy{t.getUrl})\n        return t\n\nNow we'll have a unique traceable identifier even across loading new urls, but\nwe'll still be able to see the tab's current url in the log messages.\n\nMust\n\nFor all Handler functions which can return an error, there is a version of that\nfunction which will return no error but panics on failure. They are all available\non the Must object. For example:\n\n    log.Must.FileHandler(\"/path\", log.JSONFormat)\n    log.Must.NetHandler(\"tcp\", \":1234\", log.JSONFormat)\n\nInspiration and Credit\n\nAll of the following excellent projects inspired the design of this library:\n\ncode.google.com/p/log4go\n\ngithub.com/op/go-logging\n\ngithub.com/technoweenie/grohl\n\ngithub.com/Sirupsen/logrus\n\ngithub.com/kr/logfmt\n\ngithub.com/spacemonkeygo/spacelog\n\ngolang's stdlib, notably io and net/http\n\nThe Name\n\nhttps://xkcd.com/927/\n\n*/\npackage log\n"
  },
  {
    "path": "log/format.go",
    "content": "package log\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\t\"unicode/utf8\"\n)\n\nconst (\n\ttimeFormat     = \"2006-01-02T15:04:05-0700\"\n\ttermTimeFormat = \"01-02|15:04:05.000\"\n\tfloatFormat    = 'f'\n\ttermMsgJust    = 40\n)\n\n// locationTrims are trimmed for display to avoid unwieldy log lines.\nvar locationTrims = []string{\n\t\"github.com/sero-cash/go-sero/\",\n}\n\n// PrintOrigins sets or unsets log location (file:line) printing for terminal\n// format output.\nfunc PrintOrigins(print bool) {\n\tif print {\n\t\tatomic.StoreUint32(&locationEnabled, 1)\n\t} else {\n\t\tatomic.StoreUint32(&locationEnabled, 0)\n\t}\n}\n\n// locationEnabled is an atomic flag controlling whether the terminal formatter\n// should append the log locations too when printing entries.\nvar locationEnabled uint32\n\n// locationLength is the maxmimum path length encountered, which all logs are\n// padded to to aid in alignment.\nvar locationLength uint32\n\n// fieldPadding is a global map with maximum field value lengths seen until now\n// to allow padding log contexts in a bit smarter way.\nvar fieldPadding = make(map[string]int)\n\n// fieldPaddingLock is a global mutex protecting the field padding map.\nvar fieldPaddingLock sync.RWMutex\n\ntype Format interface {\n\tFormat(r *Record) []byte\n}\n\n// FormatFunc returns a new Format object which uses\n// the given function to perform record formatting.\nfunc FormatFunc(f func(*Record) []byte) Format {\n\treturn formatFunc(f)\n}\n\ntype formatFunc func(*Record) []byte\n\nfunc (f formatFunc) Format(r *Record) []byte {\n\treturn f(r)\n}\n\n// TerminalStringer is an analogous interface to the stdlib stringer, allowing\n// own types to have custom shortened serialization formats when printed to the\n// screen.\ntype TerminalStringer interface {\n\tTerminalString() string\n}\n\n// TerminalFormat formats log records optimized for human readability on\n// a terminal with color-coded level output and terser human friendly timestamp.\n// This format should only be used for interactive programs or while developing.\n//\n//     [LEVEL] [TIME] MESAGE key=value key=value ...\n//\n// Example:\n//\n//     [DBUG] [May 16 20:58:45] remove route ns=haproxy addr=127.0.0.1:50002\n//\nfunc TerminalFormat(usecolor bool) Format {\n\treturn FormatFunc(func(r *Record) []byte {\n\t\tvar color = 0\n\t\tif usecolor {\n\t\t\tswitch r.Lvl {\n\t\t\tcase LvlCrit:\n\t\t\t\tcolor = 35\n\t\t\tcase LvlError:\n\t\t\t\tcolor = 31\n\t\t\tcase LvlWarn:\n\t\t\t\tcolor = 33\n\t\t\tcase LvlInfo:\n\t\t\t\tcolor = 32\n\t\t\tcase LvlDebug:\n\t\t\t\tcolor = 36\n\t\t\tcase LvlTrace:\n\t\t\t\tcolor = 34\n\t\t\t}\n\t\t}\n\n\t\tb := &bytes.Buffer{}\n\t\tlvl := r.Lvl.AlignedString()\n\t\tif atomic.LoadUint32(&locationEnabled) != 0 {\n\t\t\t// Log origin printing was requested, format the location path and line number\n\t\t\tlocation := fmt.Sprintf(\"%+v\", r.Call)\n\t\t\tfor _, prefix := range locationTrims {\n\t\t\t\tlocation = strings.TrimPrefix(location, prefix)\n\t\t\t}\n\t\t\t// Maintain the maximum location length for fancyer alignment\n\t\t\talign := int(atomic.LoadUint32(&locationLength))\n\t\t\tif align < len(location) {\n\t\t\t\talign = len(location)\n\t\t\t\tatomic.StoreUint32(&locationLength, uint32(align))\n\t\t\t}\n\t\t\tpadding := strings.Repeat(\" \", align-len(location))\n\n\t\t\t// Assemble and print the log heading\n\t\t\tif color > 0 {\n\t\t\t\tfmt.Fprintf(b, \"\\x1b[%dm%s\\x1b[0m[%s|%s]%s %s \", color, lvl, r.Time.Format(termTimeFormat), location, padding, r.Msg)\n\t\t\t} else {\n\t\t\t\tfmt.Fprintf(b, \"%s[%s|%s]%s %s \", lvl, r.Time.Format(termTimeFormat), location, padding, r.Msg)\n\t\t\t}\n\t\t} else {\n\t\t\tif color > 0 {\n\t\t\t\tfmt.Fprintf(b, \"\\x1b[%dm%s\\x1b[0m[%s] %s \", color, lvl, r.Time.Format(termTimeFormat), r.Msg)\n\t\t\t} else {\n\t\t\t\tfmt.Fprintf(b, \"%s[%s] %s \", lvl, r.Time.Format(termTimeFormat), r.Msg)\n\t\t\t}\n\t\t}\n\t\t// try to justify the log output for short messages\n\t\tlength := utf8.RuneCountInString(r.Msg)\n\t\tif len(r.Ctx) > 0 && length < termMsgJust {\n\t\t\tb.Write(bytes.Repeat([]byte{' '}, termMsgJust-length))\n\t\t}\n\t\t// print the keys logfmt style\n\t\tlogfmt(b, r.Ctx, color, true)\n\t\treturn b.Bytes()\n\t})\n}\n\n// LogfmtFormat prints records in logfmt format, an easy machine-parseable but human-readable\n// format for key/value pairs.\n//\n// For more details see: http://godoc.org/github.com/kr/logfmt\n//\nfunc LogfmtFormat() Format {\n\treturn FormatFunc(func(r *Record) []byte {\n\t\tcommon := []interface{}{r.KeyNames.Time, r.Time, r.KeyNames.Lvl, r.Lvl, r.KeyNames.Msg, r.Msg}\n\t\tbuf := &bytes.Buffer{}\n\t\tlogfmt(buf, append(common, r.Ctx...), 0, false)\n\t\treturn buf.Bytes()\n\t})\n}\n\nfunc logfmt(buf *bytes.Buffer, ctx []interface{}, color int, term bool) {\n\tfor i := 0; i < len(ctx); i += 2 {\n\t\tif i != 0 {\n\t\t\tbuf.WriteByte(' ')\n\t\t}\n\n\t\tk, ok := ctx[i].(string)\n\t\tv := formatLogfmtValue(ctx[i+1], term)\n\t\tif !ok {\n\t\t\tk, v = errorKey, formatLogfmtValue(k, term)\n\t\t}\n\n\t\t// XXX: we should probably check that all of your key bytes aren't invalid\n\t\tfieldPaddingLock.RLock()\n\t\tpadding := fieldPadding[k]\n\t\tfieldPaddingLock.RUnlock()\n\n\t\tlength := utf8.RuneCountInString(v)\n\t\tif padding < length {\n\t\t\tpadding = length\n\n\t\t\tfieldPaddingLock.Lock()\n\t\t\tfieldPadding[k] = padding\n\t\t\tfieldPaddingLock.Unlock()\n\t\t}\n\t\tif color > 0 {\n\t\t\tfmt.Fprintf(buf, \"\\x1b[%dm%s\\x1b[0m=\", color, k)\n\t\t} else {\n\t\t\tbuf.WriteString(k)\n\t\t\tbuf.WriteByte('=')\n\t\t}\n\t\tbuf.WriteString(v)\n\t\tif i < len(ctx)-2 {\n\t\t\tbuf.Write(bytes.Repeat([]byte{' '}, padding-length))\n\t\t}\n\t}\n\tbuf.WriteByte('\\n')\n}\n\n// JSONFormat formats log records as JSON objects separated by newlines.\n// It is the equivalent of JSONFormatEx(false, true).\nfunc JSONFormat() Format {\n\treturn JSONFormatEx(false, true)\n}\n\n// JSONFormatOrderedEx formats log records as JSON arrays. If pretty is true,\n// records will be pretty-printed. If lineSeparated is true, records\n// will be logged with a new line between each record.\nfunc JSONFormatOrderedEx(pretty, lineSeparated bool) Format {\n\tjsonMarshal := json.Marshal\n\tif pretty {\n\t\tjsonMarshal = func(v interface{}) ([]byte, error) {\n\t\t\treturn json.MarshalIndent(v, \"\", \"    \")\n\t\t}\n\t}\n\treturn FormatFunc(func(r *Record) []byte {\n\t\tprops := make(map[string]interface{})\n\n\t\tprops[r.KeyNames.Time] = r.Time\n\t\tprops[r.KeyNames.Lvl] = r.Lvl.String()\n\t\tprops[r.KeyNames.Msg] = r.Msg\n\n\t\tctx := make([]string, len(r.Ctx))\n\t\tfor i := 0; i < len(r.Ctx); i += 2 {\n\t\t\tk, ok := r.Ctx[i].(string)\n\t\t\tif !ok {\n\t\t\t\tprops[errorKey] = fmt.Sprintf(\"%+v is not a string key,\", r.Ctx[i])\n\t\t\t}\n\t\t\tctx[i] = k\n\t\t\tctx[i+1] = formatLogfmtValue(r.Ctx[i+1], true)\n\t\t}\n\t\tprops[r.KeyNames.Ctx] = ctx\n\n\t\tb, err := jsonMarshal(props)\n\t\tif err != nil {\n\t\t\tb, _ = jsonMarshal(map[string]string{\n\t\t\t\terrorKey: err.Error(),\n\t\t\t})\n\t\t\treturn b\n\t\t}\n\t\tif lineSeparated {\n\t\t\tb = append(b, '\\n')\n\t\t}\n\t\treturn b\n\t})\n}\n\n// JSONFormatEx formats log records as JSON objects. If pretty is true,\n// records will be pretty-printed. If lineSeparated is true, records\n// will be logged with a new line between each record.\nfunc JSONFormatEx(pretty, lineSeparated bool) Format {\n\tjsonMarshal := json.Marshal\n\tif pretty {\n\t\tjsonMarshal = func(v interface{}) ([]byte, error) {\n\t\t\treturn json.MarshalIndent(v, \"\", \"    \")\n\t\t}\n\t}\n\n\treturn FormatFunc(func(r *Record) []byte {\n\t\tprops := make(map[string]interface{})\n\n\t\tprops[r.KeyNames.Time] = r.Time\n\t\tprops[r.KeyNames.Lvl] = r.Lvl.String()\n\t\tprops[r.KeyNames.Msg] = r.Msg\n\n\t\tfor i := 0; i < len(r.Ctx); i += 2 {\n\t\t\tk, ok := r.Ctx[i].(string)\n\t\t\tif !ok {\n\t\t\t\tprops[errorKey] = fmt.Sprintf(\"%+v is not a string key\", r.Ctx[i])\n\t\t\t}\n\t\t\tprops[k] = formatJSONValue(r.Ctx[i+1])\n\t\t}\n\n\t\tb, err := jsonMarshal(props)\n\t\tif err != nil {\n\t\t\tb, _ = jsonMarshal(map[string]string{\n\t\t\t\terrorKey: err.Error(),\n\t\t\t})\n\t\t\treturn b\n\t\t}\n\n\t\tif lineSeparated {\n\t\t\tb = append(b, '\\n')\n\t\t}\n\n\t\treturn b\n\t})\n}\n\nfunc formatShared(value interface{}) (result interface{}) {\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\tif v := reflect.ValueOf(value); v.Kind() == reflect.Ptr && v.IsNil() {\n\t\t\t\tresult = \"nil\"\n\t\t\t} else {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t}()\n\n\tswitch v := value.(type) {\n\tcase time.Time:\n\t\treturn v.Format(timeFormat)\n\n\tcase error:\n\t\treturn v.Error()\n\n\tcase fmt.Stringer:\n\t\treturn v.String()\n\n\tdefault:\n\t\treturn v\n\t}\n}\n\nfunc formatJSONValue(value interface{}) interface{} {\n\tvalue = formatShared(value)\n\tswitch value.(type) {\n\tcase int, int8, int16, int32, int64, float32, float64, uint, uint8, uint16, uint32, uint64, string:\n\t\treturn value\n\tdefault:\n\t\treturn fmt.Sprintf(\"%+v\", value)\n\t}\n}\n\n// formatValue formats a value for serialization\nfunc formatLogfmtValue(value interface{}, term bool) string {\n\tif value == nil {\n\t\treturn \"nil\"\n\t}\n\n\tif t, ok := value.(time.Time); ok {\n\t\t// Performance optimization: No need for escaping since the provided\n\t\t// timeFormat doesn't have any escape characters, and escaping is\n\t\t// expensive.\n\t\treturn t.Format(timeFormat)\n\t}\n\tif term {\n\t\tif s, ok := value.(TerminalStringer); ok {\n\t\t\t// Custom terminal stringer provided, use that\n\t\t\treturn escapeString(s.TerminalString())\n\t\t}\n\t}\n\tvalue = formatShared(value)\n\tswitch v := value.(type) {\n\tcase bool:\n\t\treturn strconv.FormatBool(v)\n\tcase float32:\n\t\treturn strconv.FormatFloat(float64(v), floatFormat, 3, 64)\n\tcase float64:\n\t\treturn strconv.FormatFloat(v, floatFormat, 3, 64)\n\tcase int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:\n\t\treturn fmt.Sprintf(\"%d\", value)\n\tcase string:\n\t\treturn escapeString(v)\n\tdefault:\n\t\treturn escapeString(fmt.Sprintf(\"%+v\", value))\n\t}\n}\n\nvar stringBufPool = sync.Pool{\n\tNew: func() interface{} { return new(bytes.Buffer) },\n}\n\nfunc escapeString(s string) string {\n\tneedsQuotes := false\n\tneedsEscape := false\n\tfor _, r := range s {\n\t\tif r <= ' ' || r == '=' || r == '\"' {\n\t\t\tneedsQuotes = true\n\t\t}\n\t\tif r == '\\\\' || r == '\"' || r == '\\n' || r == '\\r' || r == '\\t' {\n\t\t\tneedsEscape = true\n\t\t}\n\t}\n\tif !needsEscape && !needsQuotes {\n\t\treturn s\n\t}\n\te := stringBufPool.Get().(*bytes.Buffer)\n\te.WriteByte('\"')\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase '\\\\', '\"':\n\t\t\te.WriteByte('\\\\')\n\t\t\te.WriteByte(byte(r))\n\t\tcase '\\n':\n\t\t\te.WriteString(\"\\\\n\")\n\t\tcase '\\r':\n\t\t\te.WriteString(\"\\\\r\")\n\t\tcase '\\t':\n\t\t\te.WriteString(\"\\\\t\")\n\t\tdefault:\n\t\t\te.WriteRune(r)\n\t\t}\n\t}\n\te.WriteByte('\"')\n\tvar ret string\n\tif needsQuotes {\n\t\tret = e.String()\n\t} else {\n\t\tret = string(e.Bytes()[1 : e.Len()-1])\n\t}\n\te.Reset()\n\tstringBufPool.Put(e)\n\treturn ret\n}\n"
  },
  {
    "path": "log/handler.go",
    "content": "package log\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"reflect\"\n\t\"sync\"\n\n\t\"io/ioutil\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/go-stack/stack\"\n)\n\n// Handler defines where and how log records are written.\n// A Logger prints its log records by writing to a Handler.\n// Handlers are composable, providing you great flexibility in combining\n// them to achieve the logging structure that suits your applications.\ntype Handler interface {\n\tLog(r *Record) error\n}\n\n// FuncHandler returns a Handler that logs records with the given\n// function.\nfunc FuncHandler(fn func(r *Record) error) Handler {\n\treturn funcHandler(fn)\n}\n\ntype funcHandler func(r *Record) error\n\nfunc (h funcHandler) Log(r *Record) error {\n\treturn h(r)\n}\n\n// StreamHandler writes log records to an io.Writer\n// with the given format. StreamHandler can be used\n// to easily begin writing log records to other\n// outputs.\n//\n// StreamHandler wraps itself with LazyHandler and SyncHandler\n// to evaluate Lazy objects and perform safe concurrent writes.\nfunc StreamHandler(wr io.Writer, fmtr Format) Handler {\n\th := FuncHandler(func(r *Record) error {\n\t\t_, err := wr.Write(fmtr.Format(r))\n\t\treturn err\n\t})\n\treturn LazyHandler(SyncHandler(h))\n}\n\n// SyncHandler can be wrapped around a handler to guarantee that\n// only a single Log operation can proceed at a time. It's necessary\n// for thread-safe concurrent writes.\nfunc SyncHandler(h Handler) Handler {\n\tvar mu sync.Mutex\n\treturn FuncHandler(func(r *Record) error {\n\t\tdefer mu.Unlock()\n\t\tmu.Lock()\n\t\treturn h.Log(r)\n\t})\n}\n\n// FileHandler returns a handler which writes log records to the give file\n// using the given format. If the path\n// already exists, FileHandler will append to the given file. If it does not,\n// FileHandler will create the file with mode 0644.\nfunc FileHandler(path string, fmtr Format) (Handler, error) {\n\tf, err := os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn closingHandler{f, StreamHandler(f, fmtr)}, nil\n}\n\n// countingWriter wraps a WriteCloser object in order to count the written bytes.\ntype countingWriter struct {\n\tw     io.WriteCloser // the wrapped object\n\tcount uint           // number of bytes written\n}\n\n// Write increments the byte counter by the number of bytes written.\n// Implements the WriteCloser interface.\nfunc (w *countingWriter) Write(p []byte) (n int, err error) {\n\tn, err = w.w.Write(p)\n\tw.count += uint(n)\n\treturn n, err\n}\n\n// Close implements the WriteCloser interface.\nfunc (w *countingWriter) Close() error {\n\treturn w.w.Close()\n}\n\n// prepFile opens the log file at the given path, and cuts off the invalid part\n// from the end, because the previous execution could have been finished by interruption.\n// Assumes that every line ended by '\\n' contains a valid log record.\nfunc prepFile(path string) (*countingWriter, error) {\n\tf, err := os.OpenFile(path, os.O_RDWR|os.O_APPEND, 0600)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t_, err = f.Seek(-1, io.SeekEnd)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tbuf := make([]byte, 1)\n\tvar cut int64\n\tfor {\n\t\tif _, err := f.Read(buf); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif buf[0] == '\\n' {\n\t\t\tbreak\n\t\t}\n\t\tif _, err = f.Seek(-2, io.SeekCurrent); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tcut++\n\t}\n\tfi, err := f.Stat()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tns := fi.Size() - cut\n\tif err = f.Truncate(ns); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &countingWriter{w: f, count: uint(ns)}, nil\n}\n\n// RotatingFileHandler returns a handler which writes log records to file chunks\n// at the given path. When a file's size reaches the limit, the handler creates\n// a new file named after the timestamp of the first log record it will contain.\nfunc RotatingFileHandler(path string, limit uint, formatter Format) (Handler, error) {\n\tif err := os.MkdirAll(path, 0700); err != nil {\n\t\treturn nil, err\n\t}\n\tfiles, err := ioutil.ReadDir(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tre := regexp.MustCompile(`\\.log$`)\n\tlast := len(files) - 1\n\tfor last >= 0 && (!files[last].Mode().IsRegular() || !re.MatchString(files[last].Name())) {\n\t\tlast--\n\t}\n\tvar counter *countingWriter\n\tif last >= 0 && files[last].Size() < int64(limit) {\n\t\t// Open the last file, and continue to write into it until it's size reaches the limit.\n\t\tif counter, err = prepFile(filepath.Join(path, files[last].Name())); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tif counter == nil {\n\t\tcounter = new(countingWriter)\n\t}\n\th := StreamHandler(counter, formatter)\n\n\treturn FuncHandler(func(r *Record) error {\n\t\tif counter.count > limit {\n\t\t\tcounter.Close()\n\t\t\tcounter.w = nil\n\t\t}\n\t\tif counter.w == nil {\n\t\t\tf, err := os.OpenFile(\n\t\t\t\tfilepath.Join(path, fmt.Sprintf(\"%s.log\", strings.Replace(r.Time.Format(\"060102150405.00\"), \".\", \"\", 1))),\n\t\t\t\tos.O_CREATE|os.O_APPEND|os.O_WRONLY,\n\t\t\t\t0600,\n\t\t\t)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcounter.w = f\n\t\t\tcounter.count = 0\n\t\t}\n\t\treturn h.Log(r)\n\t}), nil\n}\n\n// NetHandler opens a socket to the given address and writes records\n// over the connection.\nfunc NetHandler(network, addr string, fmtr Format) (Handler, error) {\n\tconn, err := net.Dial(network, addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn closingHandler{conn, StreamHandler(conn, fmtr)}, nil\n}\n\n// XXX: closingHandler is essentially unused at the moment\n// it's meant for a future time when the Handler interface supports\n// a possible Close() operation\ntype closingHandler struct {\n\tio.WriteCloser\n\tHandler\n}\n\nfunc (h *closingHandler) Close() error {\n\treturn h.WriteCloser.Close()\n}\n\n// CallerFileHandler returns a Handler that adds the line number and file of\n// the calling function to the context with key \"caller\".\nfunc CallerFileHandler(h Handler) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\tr.Ctx = append(r.Ctx, \"caller\", fmt.Sprint(r.Call))\n\t\treturn h.Log(r)\n\t})\n}\n\n// CallerFuncHandler returns a Handler that adds the calling function name to\n// the context with key \"fn\".\nfunc CallerFuncHandler(h Handler) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\tr.Ctx = append(r.Ctx, \"fn\", formatCall(\"%+n\", r.Call))\n\t\treturn h.Log(r)\n\t})\n}\n\n// This function is here to please go vet on Go < 1.8.\nfunc formatCall(format string, c stack.Call) string {\n\treturn fmt.Sprintf(format, c)\n}\n\n// CallerStackHandler returns a Handler that adds a stack trace to the context\n// with key \"stack\". The stack trace is formated as a space separated list of\n// call sites inside matching []'s. The most recent call site is listed first.\n// Each call site is formatted according to format. See the documentation of\n// package github.com/go-stack/stack for the list of supported formats.\nfunc CallerStackHandler(format string, h Handler) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\ts := stack.Trace().TrimBelow(r.Call).TrimRuntime()\n\t\tif len(s) > 0 {\n\t\t\tr.Ctx = append(r.Ctx, \"stack\", fmt.Sprintf(format, s))\n\t\t}\n\t\treturn h.Log(r)\n\t})\n}\n\n// FilterHandler returns a Handler that only writes records to the\n// wrapped Handler if the given function evaluates true. For example,\n// to only log records where the 'err' key is not nil:\n//\n//    logger.SetHandler(FilterHandler(func(r *Record) bool {\n//        for i := 0; i < len(r.Ctx); i += 2 {\n//            if r.Ctx[i] == \"err\" {\n//                return r.Ctx[i+1] != nil\n//            }\n//        }\n//        return false\n//    }, h))\n//\nfunc FilterHandler(fn func(r *Record) bool, h Handler) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\tif fn(r) {\n\t\t\treturn h.Log(r)\n\t\t}\n\t\treturn nil\n\t})\n}\n\n// MatchFilterHandler returns a Handler that only writes records\n// to the wrapped Handler if the given key in the logged\n// context matches the value. For example, to only log records\n// from your ui package:\n//\n//    log.MatchFilterHandler(\"pkg\", \"app/ui\", log.StdoutHandler)\n//\nfunc MatchFilterHandler(key string, value interface{}, h Handler) Handler {\n\treturn FilterHandler(func(r *Record) (pass bool) {\n\t\tswitch key {\n\t\tcase r.KeyNames.Lvl:\n\t\t\treturn r.Lvl == value\n\t\tcase r.KeyNames.Time:\n\t\t\treturn r.Time == value\n\t\tcase r.KeyNames.Msg:\n\t\t\treturn r.Msg == value\n\t\t}\n\n\t\tfor i := 0; i < len(r.Ctx); i += 2 {\n\t\t\tif r.Ctx[i] == key {\n\t\t\t\treturn r.Ctx[i+1] == value\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}, h)\n}\n\n// LvlFilterHandler returns a Handler that only writes\n// records which are less than the given verbosity\n// level to the wrapped Handler. For example, to only\n// log Error/Crit records:\n//\n//     log.LvlFilterHandler(log.LvlError, log.StdoutHandler)\n//\nfunc LvlFilterHandler(maxLvl Lvl, h Handler) Handler {\n\treturn FilterHandler(func(r *Record) (pass bool) {\n\t\treturn r.Lvl <= maxLvl\n\t}, h)\n}\n\n// MultiHandler dispatches any write to each of its handlers.\n// This is useful for writing different types of log information\n// to different locations. For example, to log to a file and\n// standard error:\n//\n//     log.MultiHandler(\n//         log.Must.FileHandler(\"/var/log/app.log\", log.LogfmtFormat()),\n//         log.StderrHandler)\n//\nfunc MultiHandler(hs ...Handler) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\tfor _, h := range hs {\n\t\t\t// what to do about failures?\n\t\t\th.Log(r)\n\t\t}\n\t\treturn nil\n\t})\n}\n\n// FailoverHandler writes all log records to the first handler\n// specified, but will failover and write to the second handler if\n// the first handler has failed, and so on for all handlers specified.\n// For example you might want to log to a network socket, but failover\n// to writing to a file if the network fails, and then to\n// standard out if the file write fails:\n//\n//     log.FailoverHandler(\n//         log.Must.NetHandler(\"tcp\", \":9090\", log.JSONFormat()),\n//         log.Must.FileHandler(\"/var/log/app.log\", log.LogfmtFormat()),\n//         log.StdoutHandler)\n//\n// All writes that do not go to the first handler will add context with keys of\n// the form \"failover_err_{idx}\" which explain the error encountered while\n// trying to write to the handlers before them in the list.\nfunc FailoverHandler(hs ...Handler) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\tvar err error\n\t\tfor i, h := range hs {\n\t\t\terr = h.Log(r)\n\t\t\tif err == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tr.Ctx = append(r.Ctx, fmt.Sprintf(\"failover_err_%d\", i), err)\n\t\t}\n\n\t\treturn err\n\t})\n}\n\n// ChannelHandler writes all records to the given channel.\n// It blocks if the channel is full. Useful for async processing\n// of log messages, it's used by BufferedHandler.\nfunc ChannelHandler(recs chan<- *Record) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\trecs <- r\n\t\treturn nil\n\t})\n}\n\n// BufferedHandler writes all records to a buffered\n// channel of the given size which flushes into the wrapped\n// handler whenever it is available for writing. Since these\n// writes happen asynchronously, all writes to a BufferedHandler\n// never return an error and any errors from the wrapped handler are ignored.\nfunc BufferedHandler(bufSize int, h Handler) Handler {\n\trecs := make(chan *Record, bufSize)\n\tgo func() {\n\t\tfor m := range recs {\n\t\t\t_ = h.Log(m)\n\t\t}\n\t}()\n\treturn ChannelHandler(recs)\n}\n\n// LazyHandler writes all values to the wrapped handler after evaluating\n// any lazy functions in the record's context. It is already wrapped\n// around StreamHandler and SyslogHandler in this library, you'll only need\n// it if you write your own Handler.\nfunc LazyHandler(h Handler) Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\t// go through the values (odd indices) and reassign\n\t\t// the values of any lazy fn to the result of its execution\n\t\thadErr := false\n\t\tfor i := 1; i < len(r.Ctx); i += 2 {\n\t\t\tlz, ok := r.Ctx[i].(Lazy)\n\t\t\tif ok {\n\t\t\t\tv, err := evaluateLazy(lz)\n\t\t\t\tif err != nil {\n\t\t\t\t\thadErr = true\n\t\t\t\t\tr.Ctx[i] = err\n\t\t\t\t} else {\n\t\t\t\t\tif cs, ok := v.(stack.CallStack); ok {\n\t\t\t\t\t\tv = cs.TrimBelow(r.Call).TrimRuntime()\n\t\t\t\t\t}\n\t\t\t\t\tr.Ctx[i] = v\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif hadErr {\n\t\t\tr.Ctx = append(r.Ctx, errorKey, \"bad lazy\")\n\t\t}\n\n\t\treturn h.Log(r)\n\t})\n}\n\nfunc evaluateLazy(lz Lazy) (interface{}, error) {\n\tt := reflect.TypeOf(lz.Fn)\n\n\tif t.Kind() != reflect.Func {\n\t\treturn nil, fmt.Errorf(\"INVALID_LAZY, not func: %+v\", lz.Fn)\n\t}\n\n\tif t.NumIn() > 0 {\n\t\treturn nil, fmt.Errorf(\"INVALID_LAZY, func takes args: %+v\", lz.Fn)\n\t}\n\n\tif t.NumOut() == 0 {\n\t\treturn nil, fmt.Errorf(\"INVALID_LAZY, no func return val: %+v\", lz.Fn)\n\t}\n\n\tvalue := reflect.ValueOf(lz.Fn)\n\tresults := value.Call([]reflect.Value{})\n\tif len(results) == 1 {\n\t\treturn results[0].Interface(), nil\n\t}\n\tvalues := make([]interface{}, len(results))\n\tfor i, v := range results {\n\t\tvalues[i] = v.Interface()\n\t}\n\treturn values, nil\n}\n\n// DiscardHandler reports success for all writes but does nothing.\n// It is useful for dynamically disabling logging at runtime via\n// a Logger's SetHandler method.\nfunc DiscardHandler() Handler {\n\treturn FuncHandler(func(r *Record) error {\n\t\treturn nil\n\t})\n}\n\n// Must provides the following Handler creation functions\n// which instead of returning an error parameter only return a Handler\n// and panic on failure: FileHandler, NetHandler, SyslogHandler, SyslogNetHandler\nvar Must muster\n\nfunc must(h Handler, err error) Handler {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn h\n}\n\ntype muster struct{}\n\nfunc (m muster) FileHandler(path string, fmtr Format) Handler {\n\treturn must(FileHandler(path, fmtr))\n}\n\nfunc (m muster) NetHandler(network, addr string, fmtr Format) Handler {\n\treturn must(NetHandler(network, addr, fmtr))\n}\n"
  },
  {
    "path": "log/handler_glog.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage log\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n)\n\n// errVmoduleSyntax is returned when a user vmodule pattern is invalid.\nvar errVmoduleSyntax = errors.New(\"expect comma-separated list of filename=N\")\n\n// errTraceSyntax is returned when a user backtrace pattern is invalid.\nvar errTraceSyntax = errors.New(\"expect file.go:234\")\n\n// GlogHandler is a log handler that mimics the filtering features of Google's\n// glog logger: setting global log levels; overriding with callsite pattern\n// matches; and requesting backtraces at certain positions.\ntype GlogHandler struct {\n\torigin Handler // The origin handler this wraps\n\n\tlevel     uint32 // Current log level, atomically accessible\n\toverride  uint32 // Flag whether overrides are used, atomically accessible\n\tbacktrace uint32 // Flag whether backtrace location is set\n\n\tpatterns  []pattern       // Current list of patterns to override with\n\tsiteCache map[uintptr]Lvl // Cache of callsite pattern evaluations\n\tlocation  string          // file:line location where to do a stackdump at\n\tlock      sync.RWMutex    // Lock protecting the override pattern list\n}\n\n// NewGlogHandler creates a new log handler with filtering functionality similar\n// to Google's glog logger. The returned handler implements Handler.\nfunc NewGlogHandler(h Handler) *GlogHandler {\n\treturn &GlogHandler{\n\t\torigin: h,\n\t}\n}\n\n// SetHandler updates the handler to write records to the specified sub-handler.\nfunc (h *GlogHandler) SetHandler(nh Handler) {\n\th.origin = nh\n}\n\n// pattern contains a filter for the Vmodule option, holding a verbosity level\n// and a file pattern to match.\ntype pattern struct {\n\tpattern *regexp.Regexp\n\tlevel   Lvl\n}\n\n// Verbosity sets the glog verbosity ceiling. The verbosity of individual packages\n// and source files can be raised using Vmodule.\nfunc (h *GlogHandler) Verbosity(level Lvl) {\n\tatomic.StoreUint32(&h.level, uint32(level))\n}\n\n// Vmodule sets the glog verbosity pattern.\n//\n// The syntax of the argument is a comma-separated list of pattern=N, where the\n// pattern is a literal file name or \"glob\" pattern matching and N is a V level.\n//\n// For instance:\n//\n//  pattern=\"gopher.go=3\"\n//   sets the V level to 3 in all Go files named \"gopher.go\"\n//\n//  pattern=\"foo=3\"\n//   sets V to 3 in all files of any packages whose import path ends in \"foo\"\n//\n//  pattern=\"foo/*=3\"\n//   sets V to 3 in all files of any packages whose import path contains \"foo\"\nfunc (h *GlogHandler) Vmodule(ruleset string) error {\n\tvar filter []pattern\n\tfor _, rule := range strings.Split(ruleset, \",\") {\n\t\t// Empty strings such as from a trailing comma can be ignored\n\t\tif len(rule) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\t// Ensure we have a pattern = level filter rule\n\t\tparts := strings.Split(rule, \"=\")\n\t\tif len(parts) != 2 {\n\t\t\treturn errVmoduleSyntax\n\t\t}\n\t\tparts[0] = strings.TrimSpace(parts[0])\n\t\tparts[1] = strings.TrimSpace(parts[1])\n\t\tif len(parts[0]) == 0 || len(parts[1]) == 0 {\n\t\t\treturn errVmoduleSyntax\n\t\t}\n\t\t// Parse the level and if correct, assemble the filter rule\n\t\tlevel, err := strconv.Atoi(parts[1])\n\t\tif err != nil {\n\t\t\treturn errVmoduleSyntax\n\t\t}\n\t\tif level <= 0 {\n\t\t\tcontinue // Ignore. It's harmless but no point in paying the overhead.\n\t\t}\n\t\t// Compile the rule pattern into a regular expression\n\t\tmatcher := \".*\"\n\t\tfor _, comp := range strings.Split(parts[0], \"/\") {\n\t\t\tif comp == \"*\" {\n\t\t\t\tmatcher += \"(/.*)?\"\n\t\t\t} else if comp != \"\" {\n\t\t\t\tmatcher += \"/\" + regexp.QuoteMeta(comp)\n\t\t\t}\n\t\t}\n\t\tif !strings.HasSuffix(parts[0], \".go\") {\n\t\t\tmatcher += \"/[^/]+\\\\.go\"\n\t\t}\n\t\tmatcher = matcher + \"$\"\n\n\t\tre, _ := regexp.Compile(matcher)\n\t\tfilter = append(filter, pattern{re, Lvl(level)})\n\t}\n\t// Swap out the vmodule pattern for the new filter system\n\th.lock.Lock()\n\tdefer h.lock.Unlock()\n\n\th.patterns = filter\n\th.siteCache = make(map[uintptr]Lvl)\n\tatomic.StoreUint32(&h.override, uint32(len(filter)))\n\n\treturn nil\n}\n\n// BacktraceAt sets the glog backtrace location. When set to a file and line\n// number holding a logging statement, a stack trace will be written to the Info\n// log whenever execution hits that statement.\n//\n// Unlike with Vmodule, the \".go\" must be present.\nfunc (h *GlogHandler) BacktraceAt(location string) error {\n\t// Ensure the backtrace location contains two non-empty elements\n\tparts := strings.Split(location, \":\")\n\tif len(parts) != 2 {\n\t\treturn errTraceSyntax\n\t}\n\tparts[0] = strings.TrimSpace(parts[0])\n\tparts[1] = strings.TrimSpace(parts[1])\n\tif len(parts[0]) == 0 || len(parts[1]) == 0 {\n\t\treturn errTraceSyntax\n\t}\n\t// Ensure the .go prefix is present and the line is valid\n\tif !strings.HasSuffix(parts[0], \".go\") {\n\t\treturn errTraceSyntax\n\t}\n\tif _, err := strconv.Atoi(parts[1]); err != nil {\n\t\treturn errTraceSyntax\n\t}\n\t// All seems valid\n\th.lock.Lock()\n\tdefer h.lock.Unlock()\n\n\th.location = location\n\tatomic.StoreUint32(&h.backtrace, uint32(len(location)))\n\n\treturn nil\n}\n\n// Log implements Handler.Log, filtering a log record through the global, local\n// and backtrace filters, finally emitting it if either allow it through.\nfunc (h *GlogHandler) Log(r *Record) error {\n\t// If backtracing is requested, check whether this is the callsite\n\tif atomic.LoadUint32(&h.backtrace) > 0 {\n\t\t// Everything below here is slow. Although we could cache the call sites the\n\t\t// same way as for vmodule, backtracing is so rare it's not worth the extra\n\t\t// complexity.\n\t\th.lock.RLock()\n\t\tmatch := h.location == r.Call.String()\n\t\th.lock.RUnlock()\n\n\t\tif match {\n\t\t\t// Callsite matched, raise the log level to info and gather the stacks\n\t\t\tr.Lvl = LvlInfo\n\n\t\t\tbuf := make([]byte, 1024*1024)\n\t\t\tbuf = buf[:runtime.Stack(buf, true)]\n\t\t\tr.Msg += \"\\n\\n\" + string(buf)\n\t\t}\n\t}\n\t// If the global log level allows, fast track logging\n\tif atomic.LoadUint32(&h.level) >= uint32(r.Lvl) {\n\t\treturn h.origin.Log(r)\n\t}\n\t// If no local overrides are present, fast track skipping\n\tif atomic.LoadUint32(&h.override) == 0 {\n\t\treturn nil\n\t}\n\t// Check callsite cache for previously calculated log levels\n\th.lock.RLock()\n\tlvl, ok := h.siteCache[r.Call.PC()]\n\th.lock.RUnlock()\n\n\t// If we didn't cache the callsite yet, calculate it\n\tif !ok {\n\t\th.lock.Lock()\n\t\tfor _, rule := range h.patterns {\n\t\t\tif rule.pattern.MatchString(fmt.Sprintf(\"%+s\", r.Call)) {\n\t\t\t\th.siteCache[r.Call.PC()], lvl, ok = rule.level, rule.level, true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// If no rule matched, remember to drop log the next time\n\t\tif !ok {\n\t\t\th.siteCache[r.Call.PC()] = 0\n\t\t}\n\t\th.lock.Unlock()\n\t}\n\tif lvl >= r.Lvl {\n\t\treturn h.origin.Log(r)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "log/handler_go13.go",
    "content": "// +build !go1.4\n\npackage log\n\nimport (\n\t\"sync/atomic\"\n\t\"unsafe\"\n)\n\n// swapHandler wraps another handler that may be swapped out\n// dynamically at runtime in a thread-safe fashion.\ntype swapHandler struct {\n\thandler unsafe.Pointer\n}\n\nfunc (h *swapHandler) Log(r *Record) error {\n\treturn h.Get().Log(r)\n}\n\nfunc (h *swapHandler) Get() Handler {\n\treturn *(*Handler)(atomic.LoadPointer(&h.handler))\n}\n\nfunc (h *swapHandler) Swap(newHandler Handler) {\n\tatomic.StorePointer(&h.handler, unsafe.Pointer(&newHandler))\n}\n"
  },
  {
    "path": "log/handler_go14.go",
    "content": "// +build go1.4\n\npackage log\n\nimport \"sync/atomic\"\n\n// swapHandler wraps another handler that may be swapped out\n// dynamically at runtime in a thread-safe fashion.\ntype swapHandler struct {\n\thandler atomic.Value\n}\n\nfunc (h *swapHandler) Log(r *Record) error {\n\treturn (*h.handler.Load().(*Handler)).Log(r)\n}\n\nfunc (h *swapHandler) Swap(newHandler Handler) {\n\th.handler.Store(&newHandler)\n}\n\nfunc (h *swapHandler) Get() Handler {\n\treturn *h.handler.Load().(*Handler)\n}\n"
  },
  {
    "path": "log/logger.go",
    "content": "package log\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/go-stack/stack\"\n)\n\nconst timeKey = \"t\"\nconst lvlKey = \"lvl\"\nconst msgKey = \"msg\"\nconst ctxKey = \"ctx\"\nconst errorKey = \"LOG15_ERROR\"\nconst skipLevel = 2\n\ntype Lvl int\n\nconst (\n\tLvlCrit Lvl = iota\n\tLvlError\n\tLvlWarn\n\tLvlInfo\n\tLvlDebug\n\tLvlTrace\n)\n\n// AlignedString returns a 5-character string containing the name of a Lvl.\nfunc (l Lvl) AlignedString() string {\n\tswitch l {\n\tcase LvlTrace:\n\t\treturn \"TRACE\"\n\tcase LvlDebug:\n\t\treturn \"DEBUG\"\n\tcase LvlInfo:\n\t\treturn \"INFO \"\n\tcase LvlWarn:\n\t\treturn \"WARN \"\n\tcase LvlError:\n\t\treturn \"ERROR\"\n\tcase LvlCrit:\n\t\treturn \"CRIT \"\n\tdefault:\n\t\tpanic(\"bad level\")\n\t}\n}\n\n// Strings returns the name of a Lvl.\nfunc (l Lvl) String() string {\n\tswitch l {\n\tcase LvlTrace:\n\t\treturn \"trce\"\n\tcase LvlDebug:\n\t\treturn \"dbug\"\n\tcase LvlInfo:\n\t\treturn \"info\"\n\tcase LvlWarn:\n\t\treturn \"warn\"\n\tcase LvlError:\n\t\treturn \"eror\"\n\tcase LvlCrit:\n\t\treturn \"crit\"\n\tdefault:\n\t\tpanic(\"bad level\")\n\t}\n}\n\n// LvlFromString returns the appropriate Lvl from a string name.\n// Useful for parsing command line args and configuration files.\nfunc LvlFromString(lvlString string) (Lvl, error) {\n\tswitch lvlString {\n\tcase \"trace\", \"trce\":\n\t\treturn LvlTrace, nil\n\tcase \"debug\", \"dbug\":\n\t\treturn LvlDebug, nil\n\tcase \"info\":\n\t\treturn LvlInfo, nil\n\tcase \"warn\":\n\t\treturn LvlWarn, nil\n\tcase \"error\", \"eror\":\n\t\treturn LvlError, nil\n\tcase \"crit\":\n\t\treturn LvlCrit, nil\n\tdefault:\n\t\treturn LvlDebug, fmt.Errorf(\"Unknown level: %v\", lvlString)\n\t}\n}\n\n// A Record is what a Logger asks its handler to write\ntype Record struct {\n\tTime     time.Time\n\tLvl      Lvl\n\tMsg      string\n\tCtx      []interface{}\n\tCall     stack.Call\n\tKeyNames RecordKeyNames\n}\n\n// RecordKeyNames gets stored in a Record when the write function is executed.\ntype RecordKeyNames struct {\n\tTime string\n\tMsg  string\n\tLvl  string\n\tCtx  string\n}\n\n// A Logger writes key/value pairs to a Handler\ntype Logger interface {\n\t// New returns a new Logger that has this logger's context plus the given context\n\tNew(ctx ...interface{}) Logger\n\n\t// GetHandler gets the handler associated with the logger.\n\tGetHandler() Handler\n\n\t// SetHandler updates the logger to write records to the specified handler.\n\tSetHandler(h Handler)\n\n\t// Log a message at the given level with context key/value pairs\n\tTrace(msg string, ctx ...interface{})\n\tDebug(msg string, ctx ...interface{})\n\tInfo(msg string, ctx ...interface{})\n\tWarn(msg string, ctx ...interface{})\n\tError(msg string, ctx ...interface{})\n\tCrit(msg string, ctx ...interface{})\n}\n\ntype logger struct {\n\tctx []interface{}\n\th   *swapHandler\n}\n\nfunc (l *logger) write(msg string, lvl Lvl, ctx []interface{}, skip int) {\n\tl.h.Log(&Record{\n\t\tTime: time.Now(),\n\t\tLvl:  lvl,\n\t\tMsg:  msg,\n\t\tCtx:  newContext(l.ctx, ctx),\n\t\tCall: stack.Caller(skip),\n\t\tKeyNames: RecordKeyNames{\n\t\t\tTime: timeKey,\n\t\t\tMsg:  msgKey,\n\t\t\tLvl:  lvlKey,\n\t\t\tCtx:  ctxKey,\n\t\t},\n\t})\n}\n\nfunc (l *logger) New(ctx ...interface{}) Logger {\n\tchild := &logger{newContext(l.ctx, ctx), new(swapHandler)}\n\tchild.SetHandler(l.h)\n\treturn child\n}\n\nfunc newContext(prefix []interface{}, suffix []interface{}) []interface{} {\n\tnormalizedSuffix := normalize(suffix)\n\tnewCtx := make([]interface{}, len(prefix)+len(normalizedSuffix))\n\tn := copy(newCtx, prefix)\n\tcopy(newCtx[n:], normalizedSuffix)\n\treturn newCtx\n}\n\nfunc (l *logger) Trace(msg string, ctx ...interface{}) {\n\tl.write(msg, LvlTrace, ctx, skipLevel)\n}\n\nfunc (l *logger) Debug(msg string, ctx ...interface{}) {\n\tl.write(msg, LvlDebug, ctx, skipLevel)\n}\n\nfunc (l *logger) Info(msg string, ctx ...interface{}) {\n\tl.write(msg, LvlInfo, ctx, skipLevel)\n}\n\nfunc (l *logger) Warn(msg string, ctx ...interface{}) {\n\tl.write(msg, LvlWarn, ctx, skipLevel)\n}\n\nfunc (l *logger) Error(msg string, ctx ...interface{}) {\n\tl.write(msg, LvlError, ctx, skipLevel)\n}\n\nfunc (l *logger) Crit(msg string, ctx ...interface{}) {\n\tl.write(msg, LvlCrit, ctx, skipLevel)\n\tos.Exit(1)\n}\n\nfunc (l *logger) GetHandler() Handler {\n\treturn l.h.Get()\n}\n\nfunc (l *logger) SetHandler(h Handler) {\n\tl.h.Swap(h)\n}\n\nfunc normalize(ctx []interface{}) []interface{} {\n\t// if the caller passed a Ctx object, then expand it\n\tif len(ctx) == 1 {\n\t\tif ctxMap, ok := ctx[0].(Ctx); ok {\n\t\t\tctx = ctxMap.toArray()\n\t\t}\n\t}\n\n\t// ctx needs to be even because it's a series of key/value pairs\n\t// no one wants to check for errors on logging functions,\n\t// so instead of erroring on bad input, we'll just make sure\n\t// that things are the right length and users can fix bugs\n\t// when they see the output looks wrong\n\tif len(ctx)%2 != 0 {\n\t\tctx = append(ctx, nil, errorKey, \"Normalized odd number of arguments by adding nil\")\n\t}\n\n\treturn ctx\n}\n\n// Lazy allows you to defer calculation of a logged value that is expensive\n// to compute until it is certain that it must be evaluated with the given filters.\n//\n// Lazy may also be used in conjunction with a Logger's New() function\n// to generate a child logger which always reports the current value of changing\n// state.\n//\n// You may wrap any function which takes no arguments to Lazy. It may return any\n// number of values of any type.\ntype Lazy struct {\n\tFn interface{}\n}\n\n// Ctx is a map of key/value pairs to pass as context to a log function\n// Use this only if you really need greater safety around the arguments you pass\n// to the logging functions.\ntype Ctx map[string]interface{}\n\nfunc (c Ctx) toArray() []interface{} {\n\tarr := make([]interface{}, len(c)*2)\n\n\ti := 0\n\tfor k, v := range c {\n\t\tarr[i] = k\n\t\tarr[i+1] = v\n\t\ti += 2\n\t}\n\n\treturn arr\n}\n"
  },
  {
    "path": "log/root.go",
    "content": "package log\n\nimport (\n\t\"os\"\n)\n\nvar (\n\troot          = &logger{[]interface{}{}, new(swapHandler)}\n\tStdoutHandler = StreamHandler(os.Stdout, LogfmtFormat())\n\tStderrHandler = StreamHandler(os.Stderr, LogfmtFormat())\n)\n\nfunc init() {\n\troot.SetHandler(DiscardHandler())\n}\n\n// New returns a new logger with the given context.\n// New is a convenient alias for Root().New\nfunc New(ctx ...interface{}) Logger {\n\treturn root.New(ctx...)\n}\n\n// Root returns the root logger\nfunc Root() Logger {\n\treturn root\n}\n\n// The following functions bypass the exported logger methods (logger.Debug,\n// etc.) to keep the call depth the same for all paths to logger.write so\n// runtime.Caller(2) always refers to the call site in client code.\n\n// Trace is a convenient alias for Root().Trace\nfunc Trace(msg string, ctx ...interface{}) {\n\troot.write(msg, LvlTrace, ctx, skipLevel)\n}\n\n// Debug is a convenient alias for Root().Debug\nfunc Debug(msg string, ctx ...interface{}) {\n\troot.write(msg, LvlDebug, ctx, skipLevel)\n}\n\n// Info is a convenient alias for Root().Info\nfunc Info(msg string, ctx ...interface{}) {\n\troot.write(msg, LvlInfo, ctx, skipLevel)\n}\n\n// Warn is a convenient alias for Root().Warn\nfunc Warn(msg string, ctx ...interface{}) {\n\troot.write(msg, LvlWarn, ctx, skipLevel)\n}\n\n// Error is a convenient alias for Root().Error\nfunc Error(msg string, ctx ...interface{}) {\n\troot.write(msg, LvlError, ctx, skipLevel)\n}\n\n// Crit is a convenient alias for Root().Crit\nfunc Crit(msg string, ctx ...interface{}) {\n\troot.write(msg, LvlCrit, ctx, skipLevel)\n\tos.Exit(1)\n}\n\n// Output is a convenient alias for write, allowing for the modification of\n// the calldepth (number of stack frames to skip).\n// calldepth influences the reported line number of the log message.\n// A calldepth of zero reports the immediate caller of Output.\n// Non-zero calldepth skips as many stack frames.\nfunc Output(msg string, lvl Lvl, calldepth int, ctx ...interface{}) {\n\troot.write(msg, lvl, ctx, calldepth+skipLevel)\n}\n"
  },
  {
    "path": "log/syslog.go",
    "content": "// +build !windows,!plan9\n\npackage log\n\nimport (\n\t\"log/syslog\"\n\t\"strings\"\n)\n\n// SyslogHandler opens a connection to the system syslog daemon by calling\n// syslog.New and writes all records to it.\nfunc SyslogHandler(priority syslog.Priority, tag string, fmtr Format) (Handler, error) {\n\twr, err := syslog.New(priority, tag)\n\treturn sharedSyslog(fmtr, wr, err)\n}\n\n// SyslogNetHandler opens a connection to a log daemon over the network and writes\n// all log records to it.\nfunc SyslogNetHandler(net, addr string, priority syslog.Priority, tag string, fmtr Format) (Handler, error) {\n\twr, err := syslog.Dial(net, addr, priority, tag)\n\treturn sharedSyslog(fmtr, wr, err)\n}\n\nfunc sharedSyslog(fmtr Format, sysWr *syslog.Writer, err error) (Handler, error) {\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\th := FuncHandler(func(r *Record) error {\n\t\tvar syslogFn = sysWr.Info\n\t\tswitch r.Lvl {\n\t\tcase LvlCrit:\n\t\t\tsyslogFn = sysWr.Crit\n\t\tcase LvlError:\n\t\t\tsyslogFn = sysWr.Err\n\t\tcase LvlWarn:\n\t\t\tsyslogFn = sysWr.Warning\n\t\tcase LvlInfo:\n\t\t\tsyslogFn = sysWr.Info\n\t\tcase LvlDebug:\n\t\t\tsyslogFn = sysWr.Debug\n\t\tcase LvlTrace:\n\t\t\tsyslogFn = func(m string) error { return nil } // There's no syslog level for trace\n\t\t}\n\n\t\ts := strings.TrimSpace(string(fmtr.Format(r)))\n\t\treturn syslogFn(s)\n\t})\n\treturn LazyHandler(&closingHandler{sysWr, h}), nil\n}\n\nfunc (m muster) SyslogHandler(priority syslog.Priority, tag string, fmtr Format) Handler {\n\treturn must(SyslogHandler(priority, tag, fmtr))\n}\n\nfunc (m muster) SyslogNetHandler(net, addr string, priority syslog.Priority, tag string, fmtr Format) Handler {\n\treturn must(SyslogNetHandler(net, addr, priority, tag, fmtr))\n}\n"
  },
  {
    "path": "log/term/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Simon Eskildsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "log/term/terminal_appengine.go",
    "content": "// Based on ssh/terminal:\n// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build appengine\n\npackage term\n\n// IsTty always returns false on AppEngine.\nfunc IsTty(fd uintptr) bool {\n\treturn false\n}\n"
  },
  {
    "path": "log/term/terminal_darwin.go",
    "content": "// Based on ssh/terminal:\n// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n// +build !appengine\n\npackage term\n\nimport \"syscall\"\n\nconst ioctlReadTermios = syscall.TIOCGETA\n\ntype Termios syscall.Termios\n"
  },
  {
    "path": "log/term/terminal_freebsd.go",
    "content": "package term\n\nimport (\n\t\"syscall\"\n)\n\nconst ioctlReadTermios = syscall.TIOCGETA\n\n// Go 1.2 doesn't include Termios for FreeBSD. This should be added in 1.3 and this could be merged with terminal_darwin.\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n"
  },
  {
    "path": "log/term/terminal_linux.go",
    "content": "// Based on ssh/terminal:\n// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !appengine\n\npackage term\n\nimport \"syscall\"\n\nconst ioctlReadTermios = syscall.TCGETS\n\ntype Termios syscall.Termios\n"
  },
  {
    "path": "log/term/terminal_netbsd.go",
    "content": "package term\n\nimport \"syscall\"\n\nconst ioctlReadTermios = syscall.TIOCGETA\n\ntype Termios syscall.Termios\n"
  },
  {
    "path": "log/term/terminal_notwindows.go",
    "content": "// Based on ssh/terminal:\n// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux,!appengine darwin freebsd openbsd netbsd\n\npackage term\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n// IsTty returns true if the given file descriptor is a terminal.\nfunc IsTty(fd uintptr) bool {\n\tvar termios Termios\n\t_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)\n\treturn err == 0\n}\n"
  },
  {
    "path": "log/term/terminal_openbsd.go",
    "content": "package term\n\nimport \"syscall\"\n\nconst ioctlReadTermios = syscall.TIOCGETA\n\ntype Termios syscall.Termios\n"
  },
  {
    "path": "log/term/terminal_solaris.go",
    "content": "package term\n\nimport \"golang.org/x/sys/unix\"\n\n// IsTty returns true if the given file descriptor is a terminal.\nfunc IsTty(fd uintptr) bool {\n\t_, err := unix.IoctlGetTermios(int(fd), unix.TCGETA)\n\treturn err == nil\n}\n"
  },
  {
    "path": "log/term/terminal_windows.go",
    "content": "// Based on ssh/terminal:\n// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows\n\npackage term\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar kernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\n\nvar (\n\tprocGetConsoleMode = kernel32.NewProc(\"GetConsoleMode\")\n)\n\n// IsTty returns true if the given file descriptor is a terminal.\nfunc IsTty(fd uintptr) bool {\n\tvar st uint32\n\tr, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0)\n\treturn r != 0 && e == 0\n}\n"
  },
  {
    "path": "makepkg.sh",
    "content": "#!/bin/sh\n\n\n\nLOCAL_PATH=$(cd `dirname $0`; pwd)\necho \"LOCAL_PATH=$LOCAL_PATH\"\nSERO_PATH=\"${LOCAL_PATH%}\"\necho \"SERO_PATH=$SERO_PATH\"\nCZERO_PATH=\"${SERO_PATH%/*}/go-czero-import\"\necho \"CZERO_PATH=$CZERO_PATH\"\n\necho \"update go-czero-import\"\ncd $CZERO_PATH\ngit fetch&&git rebase\n\necho \"update go-sero\"\ncd $SERO_PATH\ngit fetch&&git rebase\nmake clean\nBUILD_PATH=\"${SERO_PATH%}/build\"\n\nos=\"all\"\nversion=\"v0.3.1-beta.rc.5\"\nwhile getopts \":o:v:\" opt\ndo\n    case $opt in\n        o)\n        os=$OPTARG\n        ;;\n        v)\n        version=$OPTARG\n        ;;\n        ?)\n        echo \"unkonw param\"\n        exit 1;;\n    esac\ndone\n\nif [ \"$os\" = \"all\" ]; then\n    os_version=(\"linux-amd64-v3\" \"darwin-amd64\" \"windows-amd64\")\nelse\n    os_version[0]=\"$os\"\nfi\n\nfor os in ${os_version[@]}\n    do\n      echo \"make gero-${os}\"\n      make \"gero-\"${os}\n      rm -rf $BUILD_PATH/geropkg/bin\n      rm -rf $BUILD_PATH/geropkg/czero\n      mkdir -p $BUILD_PATH/geropkg/bin\n      mkdir -p $BUILD_PATH/geropkg/czero/data/\n      mkdir -p $BUILD_PATH/geropkg/czero/include/\n      mkdir -p $BUILD_PATH/geropkg/czero/lib/\n      cp -rf $CZERO_PATH/czero/data/* $SERO_PATH/build/geropkg/czero/data/\n#      cp -rf $CZERO_PATH/czero/include/* $SERO_PATH/build/geropkg/czero/include/\n      if [ $os == \"windows-amd64\" ];then\n        mv $BUILD_PATH/bin/gero*.exe $BUILD_PATH/geropkg/bin/gero.exe\n        cp -rf  $CZERO_PATH/czero/lib_WINDOWS_AMD64/* $SERO_PATH/build/geropkg/czero/lib/\n      elif [ $os == \"linux-amd64-v3\" ];then\n#        mv $BUILD_PATH/bin/bootnode-v3*  $BUILD_PATH/geropkg/bin/bootnode\n        mv $BUILD_PATH/bin/gero-v3* $BUILD_PATH/geropkg/bin/gero\n        cp -rf  $CZERO_PATH/czero/lib_LINUX_AMD64_V3/* $SERO_PATH/build/geropkg/czero/lib/\n      elif [ $os == \"linux-amd64-v4\" ];then\n#        mv $BUILD_PATH/bin/bootnode-v4*  $BUILD_PATH/geropkg/bin/bootnode\n        mv $BUILD_PATH/bin/gero-v4* $BUILD_PATH/geropkg/bin/gero\n        cp -rf  $CZERO_PATH/czero/lib_LINUX_AMD64_V4/* $SERO_PATH/build/geropkg/czero/lib/\n      else\n        mv $BUILD_PATH/bin/gero-darwin* $BUILD_PATH/geropkg/bin/gero\n        cp -rf  $CZERO_PATH/czero/lib_DARWIN_AMD64/* $SERO_PATH/build/geropkg/czero/lib/\n      fi\n      cd $BUILD_PATH\n\n      if [ $os == \"windows-amd64\" ];then\n        rm -rf ./gero-*-$os.zip\n        zip -r gero-$version-$os.zip geropkg/*\n      else\n         rm -rf ./gero-*-$os.tar.gz\n         tar czvf gero-$version-$os.tar.gz geropkg/*\n      fi\n\n      cd $LOCAL_PATH\n\n    done\nrm -rf $BUILD_PATH/geropkg/bin\nrm -rf $BUILD_PATH/geropkg/czero\n\n"
  },
  {
    "path": "maketxpkg.sh",
    "content": "#!/bin/sh\n\n\n\nLOCAL_PATH=$(cd `dirname $0`; pwd)\necho \"LOCAL_PATH=$LOCAL_PATH\"\nSERO_PATH=\"${LOCAL_PATH%}\"\necho \"SERO_PATH=$SERO_PATH\"\nCZERO_PATH=\"${SERO_PATH%/*}/go-czero-import\"\necho \"CZERO_PATH=$CZERO_PATH\"\n\necho \"update go-czero-import\"\ncd $CZERO_PATH\ngit fetch&&git rebase\n\necho \"update go-sero\"\ncd $SERO_PATH\ngit fetch&&git rebase\nmake clean\nBUILD_PATH=\"${SERO_PATH%}/build\"\n\nos=\"all\"\nversion=\"v0.3.1-beta.rc.5\"\nwhile getopts \":o:v:\" opt\ndo\n    case $opt in\n        o)\n        os=$OPTARG\n        ;;\n        v)\n        version=$OPTARG\n        ;;\n        ?)\n        echo \"unkonw param\"\n        exit 1;;\n    esac\ndone\n\nif [ \"$os\" = \"all\" ]; then\n    os_version=(\"linux-amd64-v3\" \"linux-amd64-v4\" \"darwin-amd64\" \"windows-amd64\")\nelse\n    os_version[0]=\"$os\"\nfi\n\nfor os in ${os_version[@]}\n    do\n      echo \"make gerotx-${os}\"\n      make \"gerotx-\"${os}\n      rm -rf $BUILD_PATH/gerotxpkg/bin\n      rm -rf $BUILD_PATH/gerotxpkg/czero\n      mkdir -p $BUILD_PATH/gerotxpkg/bin\n      mkdir -p $BUILD_PATH/gerotxpkg/czero/data/\n      mkdir -p $BUILD_PATH/gerotxpkg/czero/include/\n      mkdir -p $BUILD_PATH/gerotxpkg/czero/lib/\n      cp -rf $CZERO_PATH/czero/data/* $SERO_PATH/build/gerotxpkg/czero/data/\n      cp -rf $CZERO_PATH/czero/include/* $SERO_PATH/build/gerotxpkg/czero/include/\n      if [ $os == \"windows-amd64\" ];then\n        mv $BUILD_PATH/bin/gerotx*.exe $BUILD_PATH/gerotxpkg/bin/tx.exe\n        cp -rf  $CZERO_PATH/czero/lib_WINDOWS_AMD64/* $SERO_PATH/build/gerotxpkg/czero/lib/\n      elif [ $os == \"linux-amd64-v3\" ];then\n        mv $BUILD_PATH/bin/gerotx-v3* $BUILD_PATH/gerotxpkg/bin/tx\n        cp -rf  $CZERO_PATH/czero/lib_LINUX_AMD64_V3/* $SERO_PATH/build/gerotxpkg/czero/lib/\n      elif [ $os == \"linux-amd64-v4\" ];then\n        mv $BUILD_PATH/bin/gerotx-v4* $BUILD_PATH/gerotxpkg/bin/tx\n        cp -rf  $CZERO_PATH/czero/lib_LINUX_AMD64_V4/* $SERO_PATH/build/gerotxpkg/czero/lib/\n      else\n        mv $BUILD_PATH/bin/gerotx-darwin* $BUILD_PATH/gerotxpkg/bin/tx\n        cp -rf  $CZERO_PATH/czero/lib_DARWIN_AMD64/* $SERO_PATH/build/gerotxpkg/czero/lib/\n      fi\n      cd $BUILD_PATH\n\n      if [ $os == \"windows-amd64\" ];then\n        rm -rf ./gerotx-*-$os.zip\n        zip -r gerotx-$version-$os.zip gerotxpkg/*\n      else\n         rm -rf ./gerotx-*-$os.tar.gz\n         tar czvf gerotx-$version-$os.tar.gz gerotxpkg/*\n      fi\n\n      cd $LOCAL_PATH\n\n    done\nrm -rf $BUILD_PATH/gerotxpkg/bin\nrm -rf $BUILD_PATH/gerotxpkg/czero\n\n"
  },
  {
    "path": "metrics/FORK.md",
    "content": "This repo has been forked from https://github.com/rcrowley/go-metrics at commit e181e09\n"
  },
  {
    "path": "metrics/LICENSE",
    "content": "Copyright 2012 Richard Crowley. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    1.  Redistributions of source code must retain the above copyright\n        notice, this list of conditions and the following disclaimer.\n\n    2.  Redistributions in binary form must reproduce the above\n        copyright notice, this list of conditions and the following\n        disclaimer in the documentation and/or other materials provided\n        with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY RICHARD CROWLEY ``AS IS'' AND ANY EXPRESS\nOR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL RICHARD CROWLEY OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\nTHE POSSIBILITY OF SUCH DAMAGE.\n\nThe views and conclusions contained in the software and documentation\nare those of the authors and should not be interpreted as representing\nofficial policies, either expressed or implied, of Richard Crowley.\n"
  },
  {
    "path": "metrics/README.md",
    "content": "go-metrics\n==========\n\n![travis build status](https://travis-ci.org/rcrowley/go-metrics.svg?branch=master)\n\nGo port of Coda Hale's Metrics library: <https://github.com/dropwizard/metrics>.\n\nDocumentation: <http://godoc.org/github.com/rcrowley/go-metrics>.\n\nUsage\n-----\n\nCreate and update metrics:\n\n```go\nc := metrics.NewCounter()\nmetrics.Register(\"foo\", c)\nc.Inc(47)\n\ng := metrics.NewGauge()\nmetrics.Register(\"bar\", g)\ng.Update(47)\n\nr := NewRegistry()\ng := metrics.NewRegisteredFunctionalGauge(\"cache-evictions\", r, func() int64 { return cache.getEvictionsCount() })\n\ns := metrics.NewExpDecaySample(1028, 0.015) // or metrics.NewUniformSample(1028)\nh := metrics.NewHistogram(s)\nmetrics.Register(\"baz\", h)\nh.Update(47)\n\nm := metrics.NewMeter()\nmetrics.Register(\"quux\", m)\nm.Mark(47)\n\nt := metrics.NewTimer()\nmetrics.Register(\"bang\", t)\nt.Time(func() {})\nt.Update(47)\n```\n\nRegister() is not threadsafe. For threadsafe metric registration use\nGetOrRegister:\n\n```go\nt := metrics.GetOrRegisterTimer(\"account.create.latency\", nil)\nt.Time(func() {})\nt.Update(47)\n```\n\n**NOTE:** Be sure to unregister short-lived meters and timers otherwise they will\nleak memory:\n\n```go\n// Will call Stop() on the Meter to allow for garbage collection\nmetrics.Unregister(\"quux\")\n// Or similarly for a Timer that embeds a Meter\nmetrics.Unregister(\"bang\")\n```\n\nPeriodically log every metric in human-readable form to standard error:\n\n```go\ngo metrics.Log(metrics.DefaultRegistry, 5 * time.Second, log.New(os.Stderr, \"metrics: \", log.Lmicroseconds))\n```\n\nPeriodically log every metric in slightly-more-parseable form to syslog:\n\n```go\nw, _ := syslog.Dial(\"unixgram\", \"/dev/log\", syslog.LOG_INFO, \"metrics\")\ngo metrics.Syslog(metrics.DefaultRegistry, 60e9, w)\n```\n\nPeriodically emit every metric to Graphite using the [Graphite client](https://github.com/cyberdelia/go-metrics-graphite):\n\n```go\n\nimport \"github.com/cyberdelia/go-metrics-graphite\"\n\naddr, _ := net.ResolveTCPAddr(\"tcp\", \"127.0.0.1:2003\")\ngo graphite.Graphite(metrics.DefaultRegistry, 10e9, \"metrics\", addr)\n```\n\nPeriodically emit every metric into InfluxDB:\n\n**NOTE:** this has been pulled out of the library due to constant fluctuations\nin the InfluxDB API. In fact, all client libraries are on their way out. see\nissues [#121](https://github.com/rcrowley/go-metrics/issues/121) and\n[#124](https://github.com/rcrowley/go-metrics/issues/124) for progress and details.\n\n```go\nimport \"github.com/vrischmann/go-metrics-influxdb\"\n\ngo influxdb.InfluxDB(metrics.DefaultRegistry,\n  10e9, \n  \"127.0.0.1:8086\", \n  \"database-name\", \n  \"username\", \n  \"password\"\n)\n```\n\nPeriodically upload every metric to Librato using the [Librato client](https://github.com/mihasya/go-metrics-librato):\n\n**Note**: the client included with this repository under the `librato` package\nhas been deprecated and moved to the repository linked above.\n\n```go\nimport \"github.com/mihasya/go-metrics-librato\"\n\ngo librato.Librato(metrics.DefaultRegistry,\n    10e9,                  // interval\n    \"example@example.com\", // account owner email address\n    \"token\",               // Librato API token\n    \"hostname\",            // source\n    []float64{0.95},       // percentiles to send\n    time.Millisecond,      // time unit\n)\n```\n\nPeriodically emit every metric to StatHat:\n\n```go\nimport \"github.com/rcrowley/go-metrics/stathat\"\n\ngo stathat.Stathat(metrics.DefaultRegistry, 10e9, \"example@example.com\")\n```\n\nMaintain all metrics along with expvars at `/debug/metrics`:\n\nThis uses the same mechanism as [the official expvar](http://golang.org/pkg/expvar/)\nbut exposed under `/debug/metrics`, which shows a json representation of all your usual expvars\nas well as all your go-metrics.\n\n\n```go\nimport \"github.com/rcrowley/go-metrics/exp\"\n\nexp.Exp(metrics.DefaultRegistry)\n```\n\nInstallation\n------------\n\n```sh\ngo get github.com/rcrowley/go-metrics\n```\n\nStatHat support additionally requires their Go client:\n\n```sh\ngo get github.com/stathat/go\n```\n\nPublishing Metrics\n------------------\n\nClients are available for the following destinations:\n\n* Librato - https://github.com/mihasya/go-metrics-librato\n* Graphite - https://github.com/cyberdelia/go-metrics-graphite\n* InfluxDB - https://github.com/vrischmann/go-metrics-influxdb\n* Ganglia - https://github.com/appscode/metlia\n* Prometheus - https://github.com/deathowl/go-metrics-prometheus\n* DataDog - https://github.com/syntaqx/go-metrics-datadog\n* SignalFX - https://github.com/pascallouisperez/go-metrics-signalfx\n"
  },
  {
    "path": "metrics/counter.go",
    "content": "package metrics\n\nimport \"sync/atomic\"\n\n// Counters hold an int64 value that can be incremented and decremented.\ntype Counter interface {\n\tClear()\n\tCount() int64\n\tDec(int64)\n\tInc(int64)\n\tSnapshot() Counter\n}\n\n// GetOrRegisterCounter returns an existing Counter or constructs and registers\n// a new StandardCounter.\nfunc GetOrRegisterCounter(name string, r Registry) Counter {\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\treturn r.GetOrRegister(name, NewCounter).(Counter)\n}\n\n// NewCounter constructs a new StandardCounter.\nfunc NewCounter() Counter {\n\tif !Enabled {\n\t\treturn NilCounter{}\n\t}\n\treturn &StandardCounter{0}\n}\n\n// NewRegisteredCounter constructs and registers a new StandardCounter.\nfunc NewRegisteredCounter(name string, r Registry) Counter {\n\tc := NewCounter()\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// CounterSnapshot is a read-only copy of another Counter.\ntype CounterSnapshot int64\n\n// Clear panics.\nfunc (CounterSnapshot) Clear() {\n\tpanic(\"Clear called on a CounterSnapshot\")\n}\n\n// Count returns the count at the time the snapshot was taken.\nfunc (c CounterSnapshot) Count() int64 { return int64(c) }\n\n// Dec panics.\nfunc (CounterSnapshot) Dec(int64) {\n\tpanic(\"Dec called on a CounterSnapshot\")\n}\n\n// Inc panics.\nfunc (CounterSnapshot) Inc(int64) {\n\tpanic(\"Inc called on a CounterSnapshot\")\n}\n\n// Snapshot returns the snapshot.\nfunc (c CounterSnapshot) Snapshot() Counter { return c }\n\n// NilCounter is a no-op Counter.\ntype NilCounter struct{}\n\n// Clear is a no-op.\nfunc (NilCounter) Clear() {}\n\n// Count is a no-op.\nfunc (NilCounter) Count() int64 { return 0 }\n\n// Dec is a no-op.\nfunc (NilCounter) Dec(i int64) {}\n\n// Inc is a no-op.\nfunc (NilCounter) Inc(i int64) {}\n\n// Snapshot is a no-op.\nfunc (NilCounter) Snapshot() Counter { return NilCounter{} }\n\n// StandardCounter is the standard implementation of a Counter and uses the\n// sync/atomic package to manage a single int64 value.\ntype StandardCounter struct {\n\tcount int64\n}\n\n// Clear sets the counter to zero.\nfunc (c *StandardCounter) Clear() {\n\tatomic.StoreInt64(&c.count, 0)\n}\n\n// Count returns the current count.\nfunc (c *StandardCounter) Count() int64 {\n\treturn atomic.LoadInt64(&c.count)\n}\n\n// Dec decrements the counter by the given amount.\nfunc (c *StandardCounter) Dec(i int64) {\n\tatomic.AddInt64(&c.count, -i)\n}\n\n// Inc increments the counter by the given amount.\nfunc (c *StandardCounter) Inc(i int64) {\n\tatomic.AddInt64(&c.count, i)\n}\n\n// Snapshot returns a read-only copy of the counter.\nfunc (c *StandardCounter) Snapshot() Counter {\n\treturn CounterSnapshot(c.Count())\n}\n"
  },
  {
    "path": "metrics/debug.go",
    "content": "package metrics\n\nimport (\n\t\"runtime/debug\"\n\t\"time\"\n)\n\nvar (\n\tdebugMetrics struct {\n\t\tGCStats struct {\n\t\t\tLastGC Gauge\n\t\t\tNumGC  Gauge\n\t\t\tPause  Histogram\n\t\t\t//PauseQuantiles Histogram\n\t\t\tPauseTotal Gauge\n\t\t}\n\t\tReadGCStats Timer\n\t}\n\tgcStats debug.GCStats\n)\n\n// Capture new values for the Go garbage collector statistics exported in\n// debug.GCStats.  This is designed to be called as a goroutine.\nfunc CaptureDebugGCStats(r Registry, d time.Duration) {\n\tfor range time.Tick(d) {\n\t\tCaptureDebugGCStatsOnce(r)\n\t}\n}\n\n// Capture new values for the Go garbage collector statistics exported in\n// debug.GCStats.  This is designed to be called in a background goroutine.\n// Giving a registry which has not been given to RegisterDebugGCStats will\n// panic.\n//\n// Be careful (but much less so) with this because debug.ReadGCStats calls\n// the C function runtime·lock(runtime·mheap) which, while not a stop-the-world\n// operation, isn't something you want to be doing all the time.\nfunc CaptureDebugGCStatsOnce(r Registry) {\n\tlastGC := gcStats.LastGC\n\tt := time.Now()\n\tdebug.ReadGCStats(&gcStats)\n\tdebugMetrics.ReadGCStats.UpdateSince(t)\n\n\tdebugMetrics.GCStats.LastGC.Update(gcStats.LastGC.UnixNano())\n\tdebugMetrics.GCStats.NumGC.Update(gcStats.NumGC)\n\tif lastGC != gcStats.LastGC && 0 < len(gcStats.Pause) {\n\t\tdebugMetrics.GCStats.Pause.Update(int64(gcStats.Pause[0]))\n\t}\n\t//debugMetrics.GCStats.PauseQuantiles.Update(gcStats.PauseQuantiles)\n\tdebugMetrics.GCStats.PauseTotal.Update(int64(gcStats.PauseTotal))\n}\n\n// Register metrics for the Go garbage collector statistics exported in\n// debug.GCStats.  The metrics are named by their fully-qualified Go symbols,\n// i.e. debug.GCStats.PauseTotal.\nfunc RegisterDebugGCStats(r Registry) {\n\tdebugMetrics.GCStats.LastGC = NewGauge()\n\tdebugMetrics.GCStats.NumGC = NewGauge()\n\tdebugMetrics.GCStats.Pause = NewHistogram(NewExpDecaySample(1028, 0.015))\n\t//debugMetrics.GCStats.PauseQuantiles = NewHistogram(NewExpDecaySample(1028, 0.015))\n\tdebugMetrics.GCStats.PauseTotal = NewGauge()\n\tdebugMetrics.ReadGCStats = NewTimer()\n\n\tr.Register(\"debug.GCStats.LastGC\", debugMetrics.GCStats.LastGC)\n\tr.Register(\"debug.GCStats.NumGC\", debugMetrics.GCStats.NumGC)\n\tr.Register(\"debug.GCStats.Pause\", debugMetrics.GCStats.Pause)\n\t//r.Register(\"debug.GCStats.PauseQuantiles\", debugMetrics.GCStats.PauseQuantiles)\n\tr.Register(\"debug.GCStats.PauseTotal\", debugMetrics.GCStats.PauseTotal)\n\tr.Register(\"debug.ReadGCStats\", debugMetrics.ReadGCStats)\n}\n\n// Allocate an initial slice for gcStats.Pause to avoid allocations during\n// normal operation.\nfunc init() {\n\tgcStats.Pause = make([]time.Duration, 11)\n}\n"
  },
  {
    "path": "metrics/disk.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage metrics\n\n// DiskStats is the per process disk io stats.\ntype DiskStats struct {\n\tReadCount  int64 // Number of read operations executed\n\tReadBytes  int64 // Total number of bytes read\n\tWriteCount int64 // Number of write operations executed\n\tWriteBytes int64 // Total number of byte written\n}\n"
  },
  {
    "path": "metrics/disk_linux.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the Linux implementation of process disk IO counter retrieval.\n\npackage metrics\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// ReadDiskStats retrieves the disk IO stats belonging to the current process.\nfunc ReadDiskStats(stats *DiskStats) error {\n\t// Open the process disk IO counter file\n\tinf, err := os.Open(fmt.Sprintf(\"/proc/%d/io\", os.Getpid()))\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer inf.Close()\n\tin := bufio.NewReader(inf)\n\n\t// Iterate over the IO counter, and extract what we need\n\tfor {\n\t\t// Read the next line and split to key and value\n\t\tline, err := in.ReadString('\\n')\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\tparts := strings.Split(line, \":\")\n\t\tif len(parts) != 2 {\n\t\t\tcontinue\n\t\t}\n\t\tkey := strings.TrimSpace(parts[0])\n\t\tvalue, err := strconv.ParseInt(strings.TrimSpace(parts[1]), 10, 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Update the counter based on the key\n\t\tswitch key {\n\t\tcase \"syscr\":\n\t\t\tstats.ReadCount = value\n\t\tcase \"syscw\":\n\t\t\tstats.WriteCount = value\n\t\tcase \"rchar\":\n\t\t\tstats.ReadBytes = value\n\t\tcase \"wchar\":\n\t\t\tstats.WriteBytes = value\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "metrics/disk_nop.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build !linux\n\npackage metrics\n\nimport \"errors\"\n\n// ReadDiskStats retrieves the disk IO stats belonging to the current process.\nfunc ReadDiskStats(stats *DiskStats) error {\n\treturn errors.New(\"Not implemented\")\n}\n"
  },
  {
    "path": "metrics/ewma.go",
    "content": "package metrics\n\nimport (\n\t\"math\"\n\t\"sync\"\n\t\"sync/atomic\"\n)\n\n// EWMAs continuously calculate an exponentially-weighted moving average\n// based on an outside source of clock ticks.\ntype EWMA interface {\n\tRate() float64\n\tSnapshot() EWMA\n\tTick()\n\tUpdate(int64)\n}\n\n// NewEWMA constructs a new EWMA with the given alpha.\nfunc NewEWMA(alpha float64) EWMA {\n\tif !Enabled {\n\t\treturn NilEWMA{}\n\t}\n\treturn &StandardEWMA{alpha: alpha}\n}\n\nfunc NewHashrateEWMA(alpha float64) EWMA {\n\n\treturn &StandardEWMA{alpha: alpha}\n}\n\n// NewEWMA1 constructs a new EWMA for a one-minute moving average.\nfunc NewHashrateEWMA1() EWMA {\n\treturn NewHashrateEWMA(1 - math.Exp(-5.0/60.0/1))\n}\n\n// NewEWMA5 constructs a new EWMA for a five-minute moving average.\nfunc NewHashrateEWMA5() EWMA {\n\treturn NewHashrateEWMA(1 - math.Exp(-5.0/60.0/5))\n}\n\n// NewEWMA15 constructs a new EWMA for a fifteen-minute moving average.\nfunc NewHashrateEWMA15() EWMA {\n\treturn NewHashrateEWMA(1 - math.Exp(-5.0/60.0/15))\n}\n\n// NewEWMA1 constructs a new EWMA for a one-minute moving average.\nfunc NewEWMA1() EWMA {\n\treturn NewEWMA(1 - math.Exp(-5.0/60.0/1))\n}\n\n// NewEWMA5 constructs a new EWMA for a five-minute moving average.\nfunc NewEWMA5() EWMA {\n\treturn NewEWMA(1 - math.Exp(-5.0/60.0/5))\n}\n\n// NewEWMA15 constructs a new EWMA for a fifteen-minute moving average.\nfunc NewEWMA15() EWMA {\n\treturn NewEWMA(1 - math.Exp(-5.0/60.0/15))\n}\n\n// EWMASnapshot is a read-only copy of another EWMA.\ntype EWMASnapshot float64\n\n// Rate returns the rate of events per second at the time the snapshot was\n// taken.\nfunc (a EWMASnapshot) Rate() float64 { return float64(a) }\n\n// Snapshot returns the snapshot.\nfunc (a EWMASnapshot) Snapshot() EWMA { return a }\n\n// Tick panics.\nfunc (EWMASnapshot) Tick() {\n\tpanic(\"Tick called on an EWMASnapshot\")\n}\n\n// Update panics.\nfunc (EWMASnapshot) Update(int64) {\n\tpanic(\"Update called on an EWMASnapshot\")\n}\n\n// NilEWMA is a no-op EWMA.\ntype NilEWMA struct{}\n\n// Rate is a no-op.\nfunc (NilEWMA) Rate() float64 { return 0.0 }\n\n// Snapshot is a no-op.\nfunc (NilEWMA) Snapshot() EWMA { return NilEWMA{} }\n\n// Tick is a no-op.\nfunc (NilEWMA) Tick() {}\n\n// Update is a no-op.\nfunc (NilEWMA) Update(n int64) {}\n\n// StandardEWMA is the standard implementation of an EWMA and tracks the number\n// of uncounted events and processes them on each tick.  It uses the\n// sync/atomic package to manage uncounted events.\ntype StandardEWMA struct {\n\tuncounted int64 // /!\\ this should be the first member to ensure 64-bit alignment\n\talpha     float64\n\trate      float64\n\tinit      bool\n\tmutex     sync.Mutex\n}\n\n// Rate returns the moving average rate of events per second.\nfunc (a *StandardEWMA) Rate() float64 {\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\treturn a.rate * float64(1e9)\n}\n\n// Snapshot returns a read-only copy of the EWMA.\nfunc (a *StandardEWMA) Snapshot() EWMA {\n\treturn EWMASnapshot(a.Rate())\n}\n\n// Tick ticks the clock to update the moving average.  It assumes it is called\n// every five seconds.\nfunc (a *StandardEWMA) Tick() {\n\tcount := atomic.LoadInt64(&a.uncounted)\n\tatomic.AddInt64(&a.uncounted, -count)\n\tinstantRate := float64(count) / float64(5e9)\n\ta.mutex.Lock()\n\tdefer a.mutex.Unlock()\n\tif a.init {\n\t\ta.rate += a.alpha * (instantRate - a.rate)\n\t} else {\n\t\ta.init = true\n\t\ta.rate = instantRate\n\t}\n}\n\n// Update adds n uncounted events.\nfunc (a *StandardEWMA) Update(n int64) {\n\tatomic.AddInt64(&a.uncounted, n)\n}\n"
  },
  {
    "path": "metrics/exp/exp.go",
    "content": "// Hook go-metrics into expvar\n// on any /debug/metrics request, load all vars from the registry into expvar, and execute regular expvar handler\npackage exp\n\nimport (\n\t\"expvar\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\ntype exp struct {\n\texpvarLock sync.Mutex // expvar panics if you try to register the same var twice, so we must probe it safely\n\tregistry   metrics.Registry\n}\n\nfunc (exp *exp) expHandler(w http.ResponseWriter, r *http.Request) {\n\t// load our variables into expvar\n\texp.syncToExpvar()\n\n\t// now just run the official expvar handler code (which is not publicly callable, so pasted inline)\n\tw.Header().Set(\"Content-Type\", \"application/json; charset=utf-8\")\n\tfmt.Fprintf(w, \"{\\n\")\n\tfirst := true\n\texpvar.Do(func(kv expvar.KeyValue) {\n\t\tif !first {\n\t\t\tfmt.Fprintf(w, \",\\n\")\n\t\t}\n\t\tfirst = false\n\t\tfmt.Fprintf(w, \"%q: %s\", kv.Key, kv.Value)\n\t})\n\tfmt.Fprintf(w, \"\\n}\\n\")\n}\n\n// Exp will register an expvar powered metrics handler with http.DefaultServeMux on \"/debug/vars\"\nfunc Exp(r metrics.Registry) {\n\th := ExpHandler(r)\n\t// this would cause a panic:\n\t// panic: http: multiple registrations for /debug/vars\n\t// http.HandleFunc(\"/debug/vars\", e.expHandler)\n\t// haven't found an elegant way, so just use a different endpoint\n\thttp.Handle(\"/debug/metrics\", h)\n}\n\n// ExpHandler will return an expvar powered metrics handler.\nfunc ExpHandler(r metrics.Registry) http.Handler {\n\te := exp{sync.Mutex{}, r}\n\treturn http.HandlerFunc(e.expHandler)\n}\n\nfunc (exp *exp) getInt(name string) *expvar.Int {\n\tvar v *expvar.Int\n\texp.expvarLock.Lock()\n\tp := expvar.Get(name)\n\tif p != nil {\n\t\tv = p.(*expvar.Int)\n\t} else {\n\t\tv = new(expvar.Int)\n\t\texpvar.Publish(name, v)\n\t}\n\texp.expvarLock.Unlock()\n\treturn v\n}\n\nfunc (exp *exp) getFloat(name string) *expvar.Float {\n\tvar v *expvar.Float\n\texp.expvarLock.Lock()\n\tp := expvar.Get(name)\n\tif p != nil {\n\t\tv = p.(*expvar.Float)\n\t} else {\n\t\tv = new(expvar.Float)\n\t\texpvar.Publish(name, v)\n\t}\n\texp.expvarLock.Unlock()\n\treturn v\n}\n\nfunc (exp *exp) publishCounter(name string, metric metrics.Counter) {\n\tv := exp.getInt(name)\n\tv.Set(metric.Count())\n}\n\nfunc (exp *exp) publishGauge(name string, metric metrics.Gauge) {\n\tv := exp.getInt(name)\n\tv.Set(metric.Value())\n}\nfunc (exp *exp) publishGaugeFloat64(name string, metric metrics.GaugeFloat64) {\n\texp.getFloat(name).Set(metric.Value())\n}\n\nfunc (exp *exp) publishHistogram(name string, metric metrics.Histogram) {\n\th := metric.Snapshot()\n\tps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\texp.getInt(name + \".count\").Set(h.Count())\n\texp.getFloat(name + \".min\").Set(float64(h.Min()))\n\texp.getFloat(name + \".max\").Set(float64(h.Max()))\n\texp.getFloat(name + \".mean\").Set(h.Mean())\n\texp.getFloat(name + \".std-dev\").Set(h.StdDev())\n\texp.getFloat(name + \".50-percentile\").Set(ps[0])\n\texp.getFloat(name + \".75-percentile\").Set(ps[1])\n\texp.getFloat(name + \".95-percentile\").Set(ps[2])\n\texp.getFloat(name + \".99-percentile\").Set(ps[3])\n\texp.getFloat(name + \".999-percentile\").Set(ps[4])\n}\n\nfunc (exp *exp) publishMeter(name string, metric metrics.Meter) {\n\tm := metric.Snapshot()\n\texp.getInt(name + \".count\").Set(m.Count())\n\texp.getFloat(name + \".one-minute\").Set(m.Rate1())\n\texp.getFloat(name + \".five-minute\").Set(m.Rate5())\n\texp.getFloat(name + \".fifteen-minute\").Set((m.Rate15()))\n\texp.getFloat(name + \".mean\").Set(m.RateMean())\n}\n\nfunc (exp *exp) publishTimer(name string, metric metrics.Timer) {\n\tt := metric.Snapshot()\n\tps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\texp.getInt(name + \".count\").Set(t.Count())\n\texp.getFloat(name + \".min\").Set(float64(t.Min()))\n\texp.getFloat(name + \".max\").Set(float64(t.Max()))\n\texp.getFloat(name + \".mean\").Set(t.Mean())\n\texp.getFloat(name + \".std-dev\").Set(t.StdDev())\n\texp.getFloat(name + \".50-percentile\").Set(ps[0])\n\texp.getFloat(name + \".75-percentile\").Set(ps[1])\n\texp.getFloat(name + \".95-percentile\").Set(ps[2])\n\texp.getFloat(name + \".99-percentile\").Set(ps[3])\n\texp.getFloat(name + \".999-percentile\").Set(ps[4])\n\texp.getFloat(name + \".one-minute\").Set(t.Rate1())\n\texp.getFloat(name + \".five-minute\").Set(t.Rate5())\n\texp.getFloat(name + \".fifteen-minute\").Set(t.Rate15())\n\texp.getFloat(name + \".mean-rate\").Set(t.RateMean())\n}\n\nfunc (exp *exp) publishResettingTimer(name string, metric metrics.ResettingTimer) {\n\tt := metric.Snapshot()\n\tps := t.Percentiles([]float64{50, 75, 95, 99})\n\texp.getInt(name + \".count\").Set(int64(len(t.Values())))\n\texp.getFloat(name + \".mean\").Set(t.Mean())\n\texp.getInt(name + \".50-percentile\").Set(ps[0])\n\texp.getInt(name + \".75-percentile\").Set(ps[1])\n\texp.getInt(name + \".95-percentile\").Set(ps[2])\n\texp.getInt(name + \".99-percentile\").Set(ps[3])\n}\n\nfunc (exp *exp) syncToExpvar() {\n\texp.registry.Each(func(name string, i interface{}) {\n\t\tswitch i := i.(type) {\n\t\tcase metrics.Counter:\n\t\t\texp.publishCounter(name, i)\n\t\tcase metrics.Gauge:\n\t\t\texp.publishGauge(name, i)\n\t\tcase metrics.GaugeFloat64:\n\t\t\texp.publishGaugeFloat64(name, i)\n\t\tcase metrics.Histogram:\n\t\t\texp.publishHistogram(name, i)\n\t\tcase metrics.Meter:\n\t\t\texp.publishMeter(name, i)\n\t\tcase metrics.Timer:\n\t\t\texp.publishTimer(name, i)\n\t\tcase metrics.ResettingTimer:\n\t\t\texp.publishResettingTimer(name, i)\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"unsupported type for '%s': %T\", name, i))\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "metrics/gauge.go",
    "content": "package metrics\n\nimport \"sync/atomic\"\n\n// Gauges hold an int64 value that can be set arbitrarily.\ntype Gauge interface {\n\tSnapshot() Gauge\n\tUpdate(int64)\n\tValue() int64\n}\n\n// GetOrRegisterGauge returns an existing Gauge or constructs and registers a\n// new StandardGauge.\nfunc GetOrRegisterGauge(name string, r Registry) Gauge {\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\treturn r.GetOrRegister(name, NewGauge).(Gauge)\n}\n\n// NewGauge constructs a new StandardGauge.\nfunc NewGauge() Gauge {\n\tif !Enabled {\n\t\treturn NilGauge{}\n\t}\n\treturn &StandardGauge{0}\n}\n\n// NewRegisteredGauge constructs and registers a new StandardGauge.\nfunc NewRegisteredGauge(name string, r Registry) Gauge {\n\tc := NewGauge()\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// NewFunctionalGauge constructs a new FunctionalGauge.\nfunc NewFunctionalGauge(f func() int64) Gauge {\n\tif !Enabled {\n\t\treturn NilGauge{}\n\t}\n\treturn &FunctionalGauge{value: f}\n}\n\n// NewRegisteredFunctionalGauge constructs and registers a new StandardGauge.\nfunc NewRegisteredFunctionalGauge(name string, r Registry, f func() int64) Gauge {\n\tc := NewFunctionalGauge(f)\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// GaugeSnapshot is a read-only copy of another Gauge.\ntype GaugeSnapshot int64\n\n// Snapshot returns the snapshot.\nfunc (g GaugeSnapshot) Snapshot() Gauge { return g }\n\n// Update panics.\nfunc (GaugeSnapshot) Update(int64) {\n\tpanic(\"Update called on a GaugeSnapshot\")\n}\n\n// Value returns the value at the time the snapshot was taken.\nfunc (g GaugeSnapshot) Value() int64 { return int64(g) }\n\n// NilGauge is a no-op Gauge.\ntype NilGauge struct{}\n\n// Snapshot is a no-op.\nfunc (NilGauge) Snapshot() Gauge { return NilGauge{} }\n\n// Update is a no-op.\nfunc (NilGauge) Update(v int64) {}\n\n// Value is a no-op.\nfunc (NilGauge) Value() int64 { return 0 }\n\n// StandardGauge is the standard implementation of a Gauge and uses the\n// sync/atomic package to manage a single int64 value.\ntype StandardGauge struct {\n\tvalue int64\n}\n\n// Snapshot returns a read-only copy of the gauge.\nfunc (g *StandardGauge) Snapshot() Gauge {\n\treturn GaugeSnapshot(g.Value())\n}\n\n// Update updates the gauge's value.\nfunc (g *StandardGauge) Update(v int64) {\n\tatomic.StoreInt64(&g.value, v)\n}\n\n// Value returns the gauge's current value.\nfunc (g *StandardGauge) Value() int64 {\n\treturn atomic.LoadInt64(&g.value)\n}\n\n// FunctionalGauge returns value from given function\ntype FunctionalGauge struct {\n\tvalue func() int64\n}\n\n// Value returns the gauge's current value.\nfunc (g FunctionalGauge) Value() int64 {\n\treturn g.value()\n}\n\n// Snapshot returns the snapshot.\nfunc (g FunctionalGauge) Snapshot() Gauge { return GaugeSnapshot(g.Value()) }\n\n// Update panics.\nfunc (FunctionalGauge) Update(int64) {\n\tpanic(\"Update called on a FunctionalGauge\")\n}\n"
  },
  {
    "path": "metrics/gauge_float64.go",
    "content": "package metrics\n\nimport \"sync\"\n\n// GaugeFloat64s hold a float64 value that can be set arbitrarily.\ntype GaugeFloat64 interface {\n\tSnapshot() GaugeFloat64\n\tUpdate(float64)\n\tValue() float64\n}\n\n// GetOrRegisterGaugeFloat64 returns an existing GaugeFloat64 or constructs and registers a\n// new StandardGaugeFloat64.\nfunc GetOrRegisterGaugeFloat64(name string, r Registry) GaugeFloat64 {\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\treturn r.GetOrRegister(name, NewGaugeFloat64()).(GaugeFloat64)\n}\n\n// NewGaugeFloat64 constructs a new StandardGaugeFloat64.\nfunc NewGaugeFloat64() GaugeFloat64 {\n\tif !Enabled {\n\t\treturn NilGaugeFloat64{}\n\t}\n\treturn &StandardGaugeFloat64{\n\t\tvalue: 0.0,\n\t}\n}\n\n// NewRegisteredGaugeFloat64 constructs and registers a new StandardGaugeFloat64.\nfunc NewRegisteredGaugeFloat64(name string, r Registry) GaugeFloat64 {\n\tc := NewGaugeFloat64()\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// NewFunctionalGauge constructs a new FunctionalGauge.\nfunc NewFunctionalGaugeFloat64(f func() float64) GaugeFloat64 {\n\tif !Enabled {\n\t\treturn NilGaugeFloat64{}\n\t}\n\treturn &FunctionalGaugeFloat64{value: f}\n}\n\n// NewRegisteredFunctionalGauge constructs and registers a new StandardGauge.\nfunc NewRegisteredFunctionalGaugeFloat64(name string, r Registry, f func() float64) GaugeFloat64 {\n\tc := NewFunctionalGaugeFloat64(f)\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// GaugeFloat64Snapshot is a read-only copy of another GaugeFloat64.\ntype GaugeFloat64Snapshot float64\n\n// Snapshot returns the snapshot.\nfunc (g GaugeFloat64Snapshot) Snapshot() GaugeFloat64 { return g }\n\n// Update panics.\nfunc (GaugeFloat64Snapshot) Update(float64) {\n\tpanic(\"Update called on a GaugeFloat64Snapshot\")\n}\n\n// Value returns the value at the time the snapshot was taken.\nfunc (g GaugeFloat64Snapshot) Value() float64 { return float64(g) }\n\n// NilGauge is a no-op Gauge.\ntype NilGaugeFloat64 struct{}\n\n// Snapshot is a no-op.\nfunc (NilGaugeFloat64) Snapshot() GaugeFloat64 { return NilGaugeFloat64{} }\n\n// Update is a no-op.\nfunc (NilGaugeFloat64) Update(v float64) {}\n\n// Value is a no-op.\nfunc (NilGaugeFloat64) Value() float64 { return 0.0 }\n\n// StandardGaugeFloat64 is the standard implementation of a GaugeFloat64 and uses\n// sync.Mutex to manage a single float64 value.\ntype StandardGaugeFloat64 struct {\n\tmutex sync.Mutex\n\tvalue float64\n}\n\n// Snapshot returns a read-only copy of the gauge.\nfunc (g *StandardGaugeFloat64) Snapshot() GaugeFloat64 {\n\treturn GaugeFloat64Snapshot(g.Value())\n}\n\n// Update updates the gauge's value.\nfunc (g *StandardGaugeFloat64) Update(v float64) {\n\tg.mutex.Lock()\n\tdefer g.mutex.Unlock()\n\tg.value = v\n}\n\n// Value returns the gauge's current value.\nfunc (g *StandardGaugeFloat64) Value() float64 {\n\tg.mutex.Lock()\n\tdefer g.mutex.Unlock()\n\treturn g.value\n}\n\n// FunctionalGaugeFloat64 returns value from given function\ntype FunctionalGaugeFloat64 struct {\n\tvalue func() float64\n}\n\n// Value returns the gauge's current value.\nfunc (g FunctionalGaugeFloat64) Value() float64 {\n\treturn g.value()\n}\n\n// Snapshot returns the snapshot.\nfunc (g FunctionalGaugeFloat64) Snapshot() GaugeFloat64 { return GaugeFloat64Snapshot(g.Value()) }\n\n// Update panics.\nfunc (FunctionalGaugeFloat64) Update(float64) {\n\tpanic(\"Update called on a FunctionalGaugeFloat64\")\n}\n"
  },
  {
    "path": "metrics/graphite.go",
    "content": "package metrics\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// GraphiteConfig provides a container with configuration parameters for\n// the Graphite exporter\ntype GraphiteConfig struct {\n\tAddr          *net.TCPAddr  // Network address to connect to\n\tRegistry      Registry      // Registry to be exported\n\tFlushInterval time.Duration // Flush interval\n\tDurationUnit  time.Duration // Time conversion unit for durations\n\tPrefix        string        // Prefix to be prepended to metric names\n\tPercentiles   []float64     // Percentiles to export from timers and histograms\n}\n\n// Graphite is a blocking exporter function which reports metrics in r\n// to a graphite server located at addr, flushing them every d duration\n// and prepending metric names with prefix.\nfunc Graphite(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) {\n\tGraphiteWithConfig(GraphiteConfig{\n\t\tAddr:          addr,\n\t\tRegistry:      r,\n\t\tFlushInterval: d,\n\t\tDurationUnit:  time.Nanosecond,\n\t\tPrefix:        prefix,\n\t\tPercentiles:   []float64{0.5, 0.75, 0.95, 0.99, 0.999},\n\t})\n}\n\n// GraphiteWithConfig is a blocking exporter function just like Graphite,\n// but it takes a GraphiteConfig instead.\nfunc GraphiteWithConfig(c GraphiteConfig) {\n\tlog.Printf(\"WARNING: This go-metrics client has been DEPRECATED! It has been moved to https://github.com/cyberdelia/go-metrics-graphite and will be removed from rcrowley/go-metrics on August 12th 2015\")\n\tfor range time.Tick(c.FlushInterval) {\n\t\tif err := graphite(&c); nil != err {\n\t\t\tlog.Println(err)\n\t\t}\n\t}\n}\n\n// GraphiteOnce performs a single submission to Graphite, returning a\n// non-nil error on failed connections. This can be used in a loop\n// similar to GraphiteWithConfig for custom error handling.\nfunc GraphiteOnce(c GraphiteConfig) error {\n\tlog.Printf(\"WARNING: This go-metrics client has been DEPRECATED! It has been moved to https://github.com/cyberdelia/go-metrics-graphite and will be removed from rcrowley/go-metrics on August 12th 2015\")\n\treturn graphite(&c)\n}\n\nfunc graphite(c *GraphiteConfig) error {\n\tnow := time.Now().Unix()\n\tdu := float64(c.DurationUnit)\n\tconn, err := net.DialTCP(\"tcp\", nil, c.Addr)\n\tif nil != err {\n\t\treturn err\n\t}\n\tdefer conn.Close()\n\tw := bufio.NewWriter(conn)\n\tc.Registry.Each(func(name string, i interface{}) {\n\t\tswitch metric := i.(type) {\n\t\tcase Counter:\n\t\t\tfmt.Fprintf(w, \"%s.%s.count %d %d\\n\", c.Prefix, name, metric.Count(), now)\n\t\tcase Gauge:\n\t\t\tfmt.Fprintf(w, \"%s.%s.value %d %d\\n\", c.Prefix, name, metric.Value(), now)\n\t\tcase GaugeFloat64:\n\t\t\tfmt.Fprintf(w, \"%s.%s.value %f %d\\n\", c.Prefix, name, metric.Value(), now)\n\t\tcase Histogram:\n\t\t\th := metric.Snapshot()\n\t\t\tps := h.Percentiles(c.Percentiles)\n\t\t\tfmt.Fprintf(w, \"%s.%s.count %d %d\\n\", c.Prefix, name, h.Count(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.min %d %d\\n\", c.Prefix, name, h.Min(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.max %d %d\\n\", c.Prefix, name, h.Max(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.mean %.2f %d\\n\", c.Prefix, name, h.Mean(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.std-dev %.2f %d\\n\", c.Prefix, name, h.StdDev(), now)\n\t\t\tfor psIdx, psKey := range c.Percentiles {\n\t\t\t\tkey := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), \".\", \"\", 1)\n\t\t\t\tfmt.Fprintf(w, \"%s.%s.%s-percentile %.2f %d\\n\", c.Prefix, name, key, ps[psIdx], now)\n\t\t\t}\n\t\tcase Meter:\n\t\t\tm := metric.Snapshot()\n\t\t\tfmt.Fprintf(w, \"%s.%s.count %d %d\\n\", c.Prefix, name, m.Count(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.one-minute %.2f %d\\n\", c.Prefix, name, m.Rate1(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.five-minute %.2f %d\\n\", c.Prefix, name, m.Rate5(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.fifteen-minute %.2f %d\\n\", c.Prefix, name, m.Rate15(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.mean %.2f %d\\n\", c.Prefix, name, m.RateMean(), now)\n\t\tcase Timer:\n\t\t\tt := metric.Snapshot()\n\t\t\tps := t.Percentiles(c.Percentiles)\n\t\t\tfmt.Fprintf(w, \"%s.%s.count %d %d\\n\", c.Prefix, name, t.Count(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.min %d %d\\n\", c.Prefix, name, t.Min()/int64(du), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.max %d %d\\n\", c.Prefix, name, t.Max()/int64(du), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.mean %.2f %d\\n\", c.Prefix, name, t.Mean()/du, now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.std-dev %.2f %d\\n\", c.Prefix, name, t.StdDev()/du, now)\n\t\t\tfor psIdx, psKey := range c.Percentiles {\n\t\t\t\tkey := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), \".\", \"\", 1)\n\t\t\t\tfmt.Fprintf(w, \"%s.%s.%s-percentile %.2f %d\\n\", c.Prefix, name, key, ps[psIdx], now)\n\t\t\t}\n\t\t\tfmt.Fprintf(w, \"%s.%s.one-minute %.2f %d\\n\", c.Prefix, name, t.Rate1(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.five-minute %.2f %d\\n\", c.Prefix, name, t.Rate5(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.fifteen-minute %.2f %d\\n\", c.Prefix, name, t.Rate15(), now)\n\t\t\tfmt.Fprintf(w, \"%s.%s.mean-rate %.2f %d\\n\", c.Prefix, name, t.RateMean(), now)\n\t\t}\n\t\tw.Flush()\n\t})\n\treturn nil\n}\n"
  },
  {
    "path": "metrics/healthcheck.go",
    "content": "package metrics\n\n// Healthchecks hold an error value describing an arbitrary up/down status.\ntype Healthcheck interface {\n\tCheck()\n\tError() error\n\tHealthy()\n\tUnhealthy(error)\n}\n\n// NewHealthcheck constructs a new Healthcheck which will use the given\n// function to update its status.\nfunc NewHealthcheck(f func(Healthcheck)) Healthcheck {\n\tif !Enabled {\n\t\treturn NilHealthcheck{}\n\t}\n\treturn &StandardHealthcheck{nil, f}\n}\n\n// NilHealthcheck is a no-op.\ntype NilHealthcheck struct{}\n\n// Check is a no-op.\nfunc (NilHealthcheck) Check() {}\n\n// Error is a no-op.\nfunc (NilHealthcheck) Error() error { return nil }\n\n// Healthy is a no-op.\nfunc (NilHealthcheck) Healthy() {}\n\n// Unhealthy is a no-op.\nfunc (NilHealthcheck) Unhealthy(error) {}\n\n// StandardHealthcheck is the standard implementation of a Healthcheck and\n// stores the status and a function to call to update the status.\ntype StandardHealthcheck struct {\n\terr error\n\tf   func(Healthcheck)\n}\n\n// Check runs the healthcheck function to update the healthcheck's status.\nfunc (h *StandardHealthcheck) Check() {\n\th.f(h)\n}\n\n// Error returns the healthcheck's status, which will be nil if it is healthy.\nfunc (h *StandardHealthcheck) Error() error {\n\treturn h.err\n}\n\n// Healthy marks the healthcheck as healthy.\nfunc (h *StandardHealthcheck) Healthy() {\n\th.err = nil\n}\n\n// Unhealthy marks the healthcheck as unhealthy.  The error is stored and\n// may be retrieved by the Error method.\nfunc (h *StandardHealthcheck) Unhealthy(err error) {\n\th.err = err\n}\n"
  },
  {
    "path": "metrics/histogram.go",
    "content": "package metrics\n\n// Histograms calculate distribution statistics from a series of int64 values.\ntype Histogram interface {\n\tClear()\n\tCount() int64\n\tMax() int64\n\tMean() float64\n\tMin() int64\n\tPercentile(float64) float64\n\tPercentiles([]float64) []float64\n\tSample() Sample\n\tSnapshot() Histogram\n\tStdDev() float64\n\tSum() int64\n\tUpdate(int64)\n\tVariance() float64\n}\n\n// GetOrRegisterHistogram returns an existing Histogram or constructs and\n// registers a new StandardHistogram.\nfunc GetOrRegisterHistogram(name string, r Registry, s Sample) Histogram {\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\treturn r.GetOrRegister(name, func() Histogram { return NewHistogram(s) }).(Histogram)\n}\n\n// NewHistogram constructs a new StandardHistogram from a Sample.\nfunc NewHistogram(s Sample) Histogram {\n\tif !Enabled {\n\t\treturn NilHistogram{}\n\t}\n\treturn &StandardHistogram{sample: s}\n}\n\n// NewRegisteredHistogram constructs and registers a new StandardHistogram from\n// a Sample.\nfunc NewRegisteredHistogram(name string, r Registry, s Sample) Histogram {\n\tc := NewHistogram(s)\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// HistogramSnapshot is a read-only copy of another Histogram.\ntype HistogramSnapshot struct {\n\tsample *SampleSnapshot\n}\n\n// Clear panics.\nfunc (*HistogramSnapshot) Clear() {\n\tpanic(\"Clear called on a HistogramSnapshot\")\n}\n\n// Count returns the number of samples recorded at the time the snapshot was\n// taken.\nfunc (h *HistogramSnapshot) Count() int64 { return h.sample.Count() }\n\n// Max returns the maximum value in the sample at the time the snapshot was\n// taken.\nfunc (h *HistogramSnapshot) Max() int64 { return h.sample.Max() }\n\n// Mean returns the mean of the values in the sample at the time the snapshot\n// was taken.\nfunc (h *HistogramSnapshot) Mean() float64 { return h.sample.Mean() }\n\n// Min returns the minimum value in the sample at the time the snapshot was\n// taken.\nfunc (h *HistogramSnapshot) Min() int64 { return h.sample.Min() }\n\n// Percentile returns an arbitrary percentile of values in the sample at the\n// time the snapshot was taken.\nfunc (h *HistogramSnapshot) Percentile(p float64) float64 {\n\treturn h.sample.Percentile(p)\n}\n\n// Percentiles returns a slice of arbitrary percentiles of values in the sample\n// at the time the snapshot was taken.\nfunc (h *HistogramSnapshot) Percentiles(ps []float64) []float64 {\n\treturn h.sample.Percentiles(ps)\n}\n\n// Sample returns the Sample underlying the histogram.\nfunc (h *HistogramSnapshot) Sample() Sample { return h.sample }\n\n// Snapshot returns the snapshot.\nfunc (h *HistogramSnapshot) Snapshot() Histogram { return h }\n\n// StdDev returns the standard deviation of the values in the sample at the\n// time the snapshot was taken.\nfunc (h *HistogramSnapshot) StdDev() float64 { return h.sample.StdDev() }\n\n// Sum returns the sum in the sample at the time the snapshot was taken.\nfunc (h *HistogramSnapshot) Sum() int64 { return h.sample.Sum() }\n\n// Update panics.\nfunc (*HistogramSnapshot) Update(int64) {\n\tpanic(\"Update called on a HistogramSnapshot\")\n}\n\n// Variance returns the variance of inputs at the time the snapshot was taken.\nfunc (h *HistogramSnapshot) Variance() float64 { return h.sample.Variance() }\n\n// NilHistogram is a no-op Histogram.\ntype NilHistogram struct{}\n\n// Clear is a no-op.\nfunc (NilHistogram) Clear() {}\n\n// Count is a no-op.\nfunc (NilHistogram) Count() int64 { return 0 }\n\n// Max is a no-op.\nfunc (NilHistogram) Max() int64 { return 0 }\n\n// Mean is a no-op.\nfunc (NilHistogram) Mean() float64 { return 0.0 }\n\n// Min is a no-op.\nfunc (NilHistogram) Min() int64 { return 0 }\n\n// Percentile is a no-op.\nfunc (NilHistogram) Percentile(p float64) float64 { return 0.0 }\n\n// Percentiles is a no-op.\nfunc (NilHistogram) Percentiles(ps []float64) []float64 {\n\treturn make([]float64, len(ps))\n}\n\n// Sample is a no-op.\nfunc (NilHistogram) Sample() Sample { return NilSample{} }\n\n// Snapshot is a no-op.\nfunc (NilHistogram) Snapshot() Histogram { return NilHistogram{} }\n\n// StdDev is a no-op.\nfunc (NilHistogram) StdDev() float64 { return 0.0 }\n\n// Sum is a no-op.\nfunc (NilHistogram) Sum() int64 { return 0 }\n\n// Update is a no-op.\nfunc (NilHistogram) Update(v int64) {}\n\n// Variance is a no-op.\nfunc (NilHistogram) Variance() float64 { return 0.0 }\n\n// StandardHistogram is the standard implementation of a Histogram and uses a\n// Sample to bound its memory use.\ntype StandardHistogram struct {\n\tsample Sample\n}\n\n// Clear clears the histogram and its sample.\nfunc (h *StandardHistogram) Clear() { h.sample.Clear() }\n\n// Count returns the number of samples recorded since the histogram was last\n// cleared.\nfunc (h *StandardHistogram) Count() int64 { return h.sample.Count() }\n\n// Max returns the maximum value in the sample.\nfunc (h *StandardHistogram) Max() int64 { return h.sample.Max() }\n\n// Mean returns the mean of the values in the sample.\nfunc (h *StandardHistogram) Mean() float64 { return h.sample.Mean() }\n\n// Min returns the minimum value in the sample.\nfunc (h *StandardHistogram) Min() int64 { return h.sample.Min() }\n\n// Percentile returns an arbitrary percentile of the values in the sample.\nfunc (h *StandardHistogram) Percentile(p float64) float64 {\n\treturn h.sample.Percentile(p)\n}\n\n// Percentiles returns a slice of arbitrary percentiles of the values in the\n// sample.\nfunc (h *StandardHistogram) Percentiles(ps []float64) []float64 {\n\treturn h.sample.Percentiles(ps)\n}\n\n// Sample returns the Sample underlying the histogram.\nfunc (h *StandardHistogram) Sample() Sample { return h.sample }\n\n// Snapshot returns a read-only copy of the histogram.\nfunc (h *StandardHistogram) Snapshot() Histogram {\n\treturn &HistogramSnapshot{sample: h.sample.Snapshot().(*SampleSnapshot)}\n}\n\n// StdDev returns the standard deviation of the values in the sample.\nfunc (h *StandardHistogram) StdDev() float64 { return h.sample.StdDev() }\n\n// Sum returns the sum in the sample.\nfunc (h *StandardHistogram) Sum() int64 { return h.sample.Sum() }\n\n// Update samples a new value.\nfunc (h *StandardHistogram) Update(v int64) { h.sample.Update(v) }\n\n// Variance returns the variance of the values in the sample.\nfunc (h *StandardHistogram) Variance() float64 { return h.sample.Variance() }\n"
  },
  {
    "path": "metrics/influxdb/LICENSE",
    "content": "Copyright (c) 2015 Vincent Rischmann\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "metrics/influxdb/README.md",
    "content": "go-metrics-influxdb\n===================\n\nThis is a reporter for the [go-metrics](https://github.com/rcrowley/go-metrics) library which will post the metrics to [InfluxDB](https://influxdb.com/).\n\nNote\n----\n\nThis is only compatible with InfluxDB 0.9+.\n\nUsage\n-----\n\n```go\nimport \"github.com/vrischmann/go-metrics-influxdb\"\n\ngo influxdb.InfluxDB(\n    metrics.DefaultRegistry, // metrics registry\n    time.Second * 10,        // interval\n    \"http://localhost:8086\", // the InfluxDB url\n    \"mydb\",                  // your InfluxDB database\n    \"myuser\",                // your InfluxDB user\n    \"mypassword\",            // your InfluxDB password\n)\n```\n\nLicense\n-------\n\ngo-metrics-influxdb is licensed under the MIT license. See the LICENSE file for details.\n"
  },
  {
    "path": "metrics/influxdb/influxdb.go",
    "content": "package influxdb\n\nimport (\n\t\"fmt\"\n\tuurl \"net/url\"\n\t\"time\"\n\n\t\"github.com/influxdata/influxdb/client\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\ntype reporter struct {\n\treg      metrics.Registry\n\tinterval time.Duration\n\n\turl       uurl.URL\n\tdatabase  string\n\tusername  string\n\tpassword  string\n\tnamespace string\n\ttags      map[string]string\n\n\tclient *client.Client\n\n\tcache map[string]int64\n}\n\n// InfluxDB starts a InfluxDB reporter which will post the from the given metrics.Registry at each d interval.\nfunc InfluxDB(r metrics.Registry, d time.Duration, url, database, username, password, namespace string) {\n\tInfluxDBWithTags(r, d, url, database, username, password, namespace, nil)\n}\n\n// InfluxDBWithTags starts a InfluxDB reporter which will post the from the given metrics.Registry at each d interval with the specified tags\nfunc InfluxDBWithTags(r metrics.Registry, d time.Duration, url, database, username, password, namespace string, tags map[string]string) {\n\tu, err := uurl.Parse(url)\n\tif err != nil {\n\t\tlog.Warn(\"Unable to parse InfluxDB\", \"url\", url, \"err\", err)\n\t\treturn\n\t}\n\n\trep := &reporter{\n\t\treg:       r,\n\t\tinterval:  d,\n\t\turl:       *u,\n\t\tdatabase:  database,\n\t\tusername:  username,\n\t\tpassword:  password,\n\t\tnamespace: namespace,\n\t\ttags:      tags,\n\t\tcache:     make(map[string]int64),\n\t}\n\tif err := rep.makeClient(); err != nil {\n\t\tlog.Warn(\"Unable to make InfluxDB client\", \"err\", err)\n\t\treturn\n\t}\n\n\trep.run()\n}\n\nfunc (r *reporter) makeClient() (err error) {\n\tr.client, err = client.NewClient(client.Config{\n\t\tURL:      r.url,\n\t\tUsername: r.username,\n\t\tPassword: r.password,\n\t})\n\n\treturn\n}\n\nfunc (r *reporter) run() {\n\tintervalTicker := time.Tick(r.interval)\n\tpingTicker := time.Tick(time.Second * 5)\n\n\tfor {\n\t\tselect {\n\t\tcase <-intervalTicker:\n\t\t\tif err := r.send(); err != nil {\n\t\t\t\tlog.Warn(\"Unable to send to InfluxDB\", \"err\", err)\n\t\t\t}\n\t\tcase <-pingTicker:\n\t\t\t_, _, err := r.client.Ping()\n\t\t\tif err != nil {\n\t\t\t\tlog.Warn(\"Got error while sending a ping to InfluxDB, trying to recreate client\", \"err\", err)\n\n\t\t\t\tif err = r.makeClient(); err != nil {\n\t\t\t\t\tlog.Warn(\"Unable to make InfluxDB client\", \"err\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (r *reporter) send() error {\n\tvar pts []client.Point\n\n\tr.reg.Each(func(name string, i interface{}) {\n\t\tnow := time.Now()\n\t\tnamespace := r.namespace\n\n\t\tswitch metric := i.(type) {\n\t\tcase metrics.Counter:\n\t\t\tv := metric.Count()\n\t\t\tl := r.cache[name]\n\t\t\tpts = append(pts, client.Point{\n\t\t\t\tMeasurement: fmt.Sprintf(\"%s%s.count\", namespace, name),\n\t\t\t\tTags:        r.tags,\n\t\t\t\tFields: map[string]interface{}{\n\t\t\t\t\t\"value\": v - l,\n\t\t\t\t},\n\t\t\t\tTime: now,\n\t\t\t})\n\t\t\tr.cache[name] = v\n\t\tcase metrics.Gauge:\n\t\t\tms := metric.Snapshot()\n\t\t\tpts = append(pts, client.Point{\n\t\t\t\tMeasurement: fmt.Sprintf(\"%s%s.gauge\", namespace, name),\n\t\t\t\tTags:        r.tags,\n\t\t\t\tFields: map[string]interface{}{\n\t\t\t\t\t\"value\": ms.Value(),\n\t\t\t\t},\n\t\t\t\tTime: now,\n\t\t\t})\n\t\tcase metrics.GaugeFloat64:\n\t\t\tms := metric.Snapshot()\n\t\t\tpts = append(pts, client.Point{\n\t\t\t\tMeasurement: fmt.Sprintf(\"%s%s.gauge\", namespace, name),\n\t\t\t\tTags:        r.tags,\n\t\t\t\tFields: map[string]interface{}{\n\t\t\t\t\t\"value\": ms.Value(),\n\t\t\t\t},\n\t\t\t\tTime: now,\n\t\t\t})\n\t\tcase metrics.Histogram:\n\t\t\tms := metric.Snapshot()\n\t\t\tps := ms.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999})\n\t\t\tpts = append(pts, client.Point{\n\t\t\t\tMeasurement: fmt.Sprintf(\"%s%s.histogram\", namespace, name),\n\t\t\t\tTags:        r.tags,\n\t\t\t\tFields: map[string]interface{}{\n\t\t\t\t\t\"count\":    ms.Count(),\n\t\t\t\t\t\"max\":      ms.Max(),\n\t\t\t\t\t\"mean\":     ms.Mean(),\n\t\t\t\t\t\"min\":      ms.Min(),\n\t\t\t\t\t\"stddev\":   ms.StdDev(),\n\t\t\t\t\t\"variance\": ms.Variance(),\n\t\t\t\t\t\"p50\":      ps[0],\n\t\t\t\t\t\"p75\":      ps[1],\n\t\t\t\t\t\"p95\":      ps[2],\n\t\t\t\t\t\"p99\":      ps[3],\n\t\t\t\t\t\"p999\":     ps[4],\n\t\t\t\t\t\"p9999\":    ps[5],\n\t\t\t\t},\n\t\t\t\tTime: now,\n\t\t\t})\n\t\tcase metrics.Meter:\n\t\t\tms := metric.Snapshot()\n\t\t\tpts = append(pts, client.Point{\n\t\t\t\tMeasurement: fmt.Sprintf(\"%s%s.meter\", namespace, name),\n\t\t\t\tTags:        r.tags,\n\t\t\t\tFields: map[string]interface{}{\n\t\t\t\t\t\"count\": ms.Count(),\n\t\t\t\t\t\"m1\":    ms.Rate1(),\n\t\t\t\t\t\"m5\":    ms.Rate5(),\n\t\t\t\t\t\"m15\":   ms.Rate15(),\n\t\t\t\t\t\"mean\":  ms.RateMean(),\n\t\t\t\t},\n\t\t\t\tTime: now,\n\t\t\t})\n\t\tcase metrics.Timer:\n\t\t\tms := metric.Snapshot()\n\t\t\tps := ms.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999})\n\t\t\tpts = append(pts, client.Point{\n\t\t\t\tMeasurement: fmt.Sprintf(\"%s%s.timer\", namespace, name),\n\t\t\t\tTags:        r.tags,\n\t\t\t\tFields: map[string]interface{}{\n\t\t\t\t\t\"count\":    ms.Count(),\n\t\t\t\t\t\"max\":      ms.Max(),\n\t\t\t\t\t\"mean\":     ms.Mean(),\n\t\t\t\t\t\"min\":      ms.Min(),\n\t\t\t\t\t\"stddev\":   ms.StdDev(),\n\t\t\t\t\t\"variance\": ms.Variance(),\n\t\t\t\t\t\"p50\":      ps[0],\n\t\t\t\t\t\"p75\":      ps[1],\n\t\t\t\t\t\"p95\":      ps[2],\n\t\t\t\t\t\"p99\":      ps[3],\n\t\t\t\t\t\"p999\":     ps[4],\n\t\t\t\t\t\"p9999\":    ps[5],\n\t\t\t\t\t\"m1\":       ms.Rate1(),\n\t\t\t\t\t\"m5\":       ms.Rate5(),\n\t\t\t\t\t\"m15\":      ms.Rate15(),\n\t\t\t\t\t\"meanrate\": ms.RateMean(),\n\t\t\t\t},\n\t\t\t\tTime: now,\n\t\t\t})\n\t\tcase metrics.ResettingTimer:\n\t\t\tt := metric.Snapshot()\n\n\t\t\tif len(t.Values()) > 0 {\n\t\t\t\tps := t.Percentiles([]float64{50, 95, 99})\n\t\t\t\tval := t.Values()\n\t\t\t\tpts = append(pts, client.Point{\n\t\t\t\t\tMeasurement: fmt.Sprintf(\"%s%s.span\", namespace, name),\n\t\t\t\t\tTags:        r.tags,\n\t\t\t\t\tFields: map[string]interface{}{\n\t\t\t\t\t\t\"count\": len(val),\n\t\t\t\t\t\t\"max\":   val[len(val)-1],\n\t\t\t\t\t\t\"mean\":  t.Mean(),\n\t\t\t\t\t\t\"min\":   val[0],\n\t\t\t\t\t\t\"p50\":   ps[0],\n\t\t\t\t\t\t\"p95\":   ps[1],\n\t\t\t\t\t\t\"p99\":   ps[2],\n\t\t\t\t\t},\n\t\t\t\t\tTime: now,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t})\n\n\tbps := client.BatchPoints{\n\t\tPoints:   pts,\n\t\tDatabase: r.database,\n\t}\n\n\t_, err := r.client.Write(bps)\n\treturn err\n}\n"
  },
  {
    "path": "metrics/json.go",
    "content": "package metrics\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"time\"\n)\n\n// MarshalJSON returns a byte slice containing a JSON representation of all\n// the metrics in the Registry.\nfunc (r *StandardRegistry) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(r.GetAll())\n}\n\n// WriteJSON writes metrics from the given registry  periodically to the\n// specified io.Writer as JSON.\nfunc WriteJSON(r Registry, d time.Duration, w io.Writer) {\n\tfor range time.Tick(d) {\n\t\tWriteJSONOnce(r, w)\n\t}\n}\n\n// WriteJSONOnce writes metrics from the given registry to the specified\n// io.Writer as JSON.\nfunc WriteJSONOnce(r Registry, w io.Writer) {\n\tjson.NewEncoder(w).Encode(r)\n}\n\nfunc (p *PrefixedRegistry) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(p.GetAll())\n}\n"
  },
  {
    "path": "metrics/librato/client.go",
    "content": "package librato\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\nconst Operations = \"operations\"\nconst OperationsShort = \"ops\"\n\ntype LibratoClient struct {\n\tEmail, Token string\n}\n\n// property strings\nconst (\n\t// display attributes\n\tColor             = \"color\"\n\tDisplayMax        = \"display_max\"\n\tDisplayMin        = \"display_min\"\n\tDisplayUnitsLong  = \"display_units_long\"\n\tDisplayUnitsShort = \"display_units_short\"\n\tDisplayStacked    = \"display_stacked\"\n\tDisplayTransform  = \"display_transform\"\n\t// special gauge display attributes\n\tSummarizeFunction = \"summarize_function\"\n\tAggregate         = \"aggregate\"\n\n\t// metric keys\n\tName        = \"name\"\n\tPeriod      = \"period\"\n\tDescription = \"description\"\n\tDisplayName = \"display_name\"\n\tAttributes  = \"attributes\"\n\n\t// measurement keys\n\tMeasureTime = \"measure_time\"\n\tSource      = \"source\"\n\tValue       = \"value\"\n\n\t// special gauge keys\n\tCount      = \"count\"\n\tSum        = \"sum\"\n\tMax        = \"max\"\n\tMin        = \"min\"\n\tSumSquares = \"sum_squares\"\n\n\t// batch keys\n\tCounters = \"counters\"\n\tGauges   = \"gauges\"\n\n\tMetricsPostUrl = \"https://metrics-api.librato.com/v1/metrics\"\n)\n\ntype Measurement map[string]interface{}\ntype Metric map[string]interface{}\n\ntype Batch struct {\n\tGauges      []Measurement `json:\"gauges,omitempty\"`\n\tCounters    []Measurement `json:\"counters,omitempty\"`\n\tMeasureTime int64         `json:\"measure_time\"`\n\tSource      string        `json:\"source\"`\n}\n\nfunc (c *LibratoClient) PostMetrics(batch Batch) (err error) {\n\tvar (\n\t\tjs   []byte\n\t\treq  *http.Request\n\t\tresp *http.Response\n\t)\n\n\tif len(batch.Counters) == 0 && len(batch.Gauges) == 0 {\n\t\treturn nil\n\t}\n\n\tif js, err = json.Marshal(batch); err != nil {\n\t\treturn\n\t}\n\n\tif req, err = http.NewRequest(\"POST\", MetricsPostUrl, bytes.NewBuffer(js)); err != nil {\n\t\treturn\n\t}\n\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\treq.SetBasicAuth(c.Email, c.Token)\n\n\tif resp, err = http.DefaultClient.Do(req); err != nil {\n\t\treturn\n\t}\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tvar body []byte\n\t\tif body, err = ioutil.ReadAll(resp.Body); err != nil {\n\t\t\tbody = []byte(fmt.Sprintf(\"(could not fetch response body for error: %s)\", err))\n\t\t}\n\t\terr = fmt.Errorf(\"Unable to post to Librato: %d %s %s\", resp.StatusCode, resp.Status, string(body))\n\t}\n\treturn\n}\n"
  },
  {
    "path": "metrics/librato/librato.go",
    "content": "package librato\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"math\"\n\t\"regexp\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\n// a regexp for extracting the unit from time.Duration.String\nvar unitRegexp = regexp.MustCompile(`[^\\\\d]+$`)\n\n// a helper that turns a time.Duration into librato display attributes for timer metrics\nfunc translateTimerAttributes(d time.Duration) (attrs map[string]interface{}) {\n\tattrs = make(map[string]interface{})\n\tattrs[DisplayTransform] = fmt.Sprintf(\"x/%d\", int64(d))\n\tattrs[DisplayUnitsShort] = string(unitRegexp.Find([]byte(d.String())))\n\treturn\n}\n\ntype Reporter struct {\n\tEmail, Token    string\n\tNamespace       string\n\tSource          string\n\tInterval        time.Duration\n\tRegistry        metrics.Registry\n\tPercentiles     []float64              // percentiles to report on histogram metrics\n\tTimerAttributes map[string]interface{} // units in which timers will be displayed\n\tintervalSec     int64\n}\n\nfunc NewReporter(r metrics.Registry, d time.Duration, e string, t string, s string, p []float64, u time.Duration) *Reporter {\n\treturn &Reporter{e, t, \"\", s, d, r, p, translateTimerAttributes(u), int64(d / time.Second)}\n}\n\nfunc Librato(r metrics.Registry, d time.Duration, e string, t string, s string, p []float64, u time.Duration) {\n\tNewReporter(r, d, e, t, s, p, u).Run()\n}\n\nfunc (rep *Reporter) Run() {\n\tlog.Printf(\"WARNING: This client has been DEPRECATED! It has been moved to https://github.com/mihasya/go-metrics-librato and will be removed from rcrowley/go-metrics on August 5th 2015\")\n\tticker := time.Tick(rep.Interval)\n\tmetricsApi := &LibratoClient{rep.Email, rep.Token}\n\tfor now := range ticker {\n\t\tvar metrics Batch\n\t\tvar err error\n\t\tif metrics, err = rep.BuildRequest(now, rep.Registry); err != nil {\n\t\t\tlog.Printf(\"ERROR constructing librato request body %s\", err)\n\t\t\tcontinue\n\t\t}\n\t\tif err := metricsApi.PostMetrics(metrics); err != nil {\n\t\t\tlog.Printf(\"ERROR sending metrics to librato %s\", err)\n\t\t\tcontinue\n\t\t}\n\t}\n}\n\n// calculate sum of squares from data provided by metrics.Histogram\n// see http://en.wikipedia.org/wiki/Standard_deviation#Rapid_calculation_methods\nfunc sumSquares(s metrics.Sample) float64 {\n\tcount := float64(s.Count())\n\tsumSquared := math.Pow(count*s.Mean(), 2)\n\tsumSquares := math.Pow(count*s.StdDev(), 2) + sumSquared/count\n\tif math.IsNaN(sumSquares) {\n\t\treturn 0.0\n\t}\n\treturn sumSquares\n}\nfunc sumSquaresTimer(t metrics.Timer) float64 {\n\tcount := float64(t.Count())\n\tsumSquared := math.Pow(count*t.Mean(), 2)\n\tsumSquares := math.Pow(count*t.StdDev(), 2) + sumSquared/count\n\tif math.IsNaN(sumSquares) {\n\t\treturn 0.0\n\t}\n\treturn sumSquares\n}\n\nfunc (rep *Reporter) BuildRequest(now time.Time, r metrics.Registry) (snapshot Batch, err error) {\n\tsnapshot = Batch{\n\t\t// coerce timestamps to a stepping fn so that they line up in Librato graphs\n\t\tMeasureTime: (now.Unix() / rep.intervalSec) * rep.intervalSec,\n\t\tSource:      rep.Source,\n\t}\n\tsnapshot.Gauges = make([]Measurement, 0)\n\tsnapshot.Counters = make([]Measurement, 0)\n\thistogramGaugeCount := 1 + len(rep.Percentiles)\n\tr.Each(func(name string, metric interface{}) {\n\t\tif rep.Namespace != \"\" {\n\t\t\tname = fmt.Sprintf(\"%s.%s\", rep.Namespace, name)\n\t\t}\n\t\tmeasurement := Measurement{}\n\t\tmeasurement[Period] = rep.Interval.Seconds()\n\t\tswitch m := metric.(type) {\n\t\tcase metrics.Counter:\n\t\t\tif m.Count() > 0 {\n\t\t\t\tmeasurement[Name] = fmt.Sprintf(\"%s.%s\", name, \"count\")\n\t\t\t\tmeasurement[Value] = float64(m.Count())\n\t\t\t\tmeasurement[Attributes] = map[string]interface{}{\n\t\t\t\t\tDisplayUnitsLong:  Operations,\n\t\t\t\t\tDisplayUnitsShort: OperationsShort,\n\t\t\t\t\tDisplayMin:        \"0\",\n\t\t\t\t}\n\t\t\t\tsnapshot.Counters = append(snapshot.Counters, measurement)\n\t\t\t}\n\t\tcase metrics.Gauge:\n\t\t\tmeasurement[Name] = name\n\t\t\tmeasurement[Value] = float64(m.Value())\n\t\t\tsnapshot.Gauges = append(snapshot.Gauges, measurement)\n\t\tcase metrics.GaugeFloat64:\n\t\t\tmeasurement[Name] = name\n\t\t\tmeasurement[Value] = m.Value()\n\t\t\tsnapshot.Gauges = append(snapshot.Gauges, measurement)\n\t\tcase metrics.Histogram:\n\t\t\tif m.Count() > 0 {\n\t\t\t\tgauges := make([]Measurement, histogramGaugeCount)\n\t\t\t\ts := m.Sample()\n\t\t\t\tmeasurement[Name] = fmt.Sprintf(\"%s.%s\", name, \"hist\")\n\t\t\t\tmeasurement[Count] = uint64(s.Count())\n\t\t\t\tmeasurement[Max] = float64(s.Max())\n\t\t\t\tmeasurement[Min] = float64(s.Min())\n\t\t\t\tmeasurement[Sum] = float64(s.Sum())\n\t\t\t\tmeasurement[SumSquares] = sumSquares(s)\n\t\t\t\tgauges[0] = measurement\n\t\t\t\tfor i, p := range rep.Percentiles {\n\t\t\t\t\tgauges[i+1] = Measurement{\n\t\t\t\t\t\tName:   fmt.Sprintf(\"%s.%.2f\", measurement[Name], p),\n\t\t\t\t\t\tValue:  s.Percentile(p),\n\t\t\t\t\t\tPeriod: measurement[Period],\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsnapshot.Gauges = append(snapshot.Gauges, gauges...)\n\t\t\t}\n\t\tcase metrics.Meter:\n\t\t\tmeasurement[Name] = name\n\t\t\tmeasurement[Value] = float64(m.Count())\n\t\t\tsnapshot.Counters = append(snapshot.Counters, measurement)\n\t\t\tsnapshot.Gauges = append(snapshot.Gauges,\n\t\t\t\tMeasurement{\n\t\t\t\t\tName:   fmt.Sprintf(\"%s.%s\", name, \"1min\"),\n\t\t\t\t\tValue:  m.Rate1(),\n\t\t\t\t\tPeriod: int64(rep.Interval.Seconds()),\n\t\t\t\t\tAttributes: map[string]interface{}{\n\t\t\t\t\t\tDisplayUnitsLong:  Operations,\n\t\t\t\t\t\tDisplayUnitsShort: OperationsShort,\n\t\t\t\t\t\tDisplayMin:        \"0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tMeasurement{\n\t\t\t\t\tName:   fmt.Sprintf(\"%s.%s\", name, \"5min\"),\n\t\t\t\t\tValue:  m.Rate5(),\n\t\t\t\t\tPeriod: int64(rep.Interval.Seconds()),\n\t\t\t\t\tAttributes: map[string]interface{}{\n\t\t\t\t\t\tDisplayUnitsLong:  Operations,\n\t\t\t\t\t\tDisplayUnitsShort: OperationsShort,\n\t\t\t\t\t\tDisplayMin:        \"0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tMeasurement{\n\t\t\t\t\tName:   fmt.Sprintf(\"%s.%s\", name, \"15min\"),\n\t\t\t\t\tValue:  m.Rate15(),\n\t\t\t\t\tPeriod: int64(rep.Interval.Seconds()),\n\t\t\t\t\tAttributes: map[string]interface{}{\n\t\t\t\t\t\tDisplayUnitsLong:  Operations,\n\t\t\t\t\t\tDisplayUnitsShort: OperationsShort,\n\t\t\t\t\t\tDisplayMin:        \"0\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t)\n\t\tcase metrics.Timer:\n\t\t\tmeasurement[Name] = name\n\t\t\tmeasurement[Value] = float64(m.Count())\n\t\t\tsnapshot.Counters = append(snapshot.Counters, measurement)\n\t\t\tif m.Count() > 0 {\n\t\t\t\tlibratoName := fmt.Sprintf(\"%s.%s\", name, \"timer.mean\")\n\t\t\t\tgauges := make([]Measurement, histogramGaugeCount)\n\t\t\t\tgauges[0] = Measurement{\n\t\t\t\t\tName:       libratoName,\n\t\t\t\t\tCount:      uint64(m.Count()),\n\t\t\t\t\tSum:        m.Mean() * float64(m.Count()),\n\t\t\t\t\tMax:        float64(m.Max()),\n\t\t\t\t\tMin:        float64(m.Min()),\n\t\t\t\t\tSumSquares: sumSquaresTimer(m),\n\t\t\t\t\tPeriod:     int64(rep.Interval.Seconds()),\n\t\t\t\t\tAttributes: rep.TimerAttributes,\n\t\t\t\t}\n\t\t\t\tfor i, p := range rep.Percentiles {\n\t\t\t\t\tgauges[i+1] = Measurement{\n\t\t\t\t\t\tName:       fmt.Sprintf(\"%s.timer.%2.0f\", name, p*100),\n\t\t\t\t\t\tValue:      m.Percentile(p),\n\t\t\t\t\t\tPeriod:     int64(rep.Interval.Seconds()),\n\t\t\t\t\t\tAttributes: rep.TimerAttributes,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsnapshot.Gauges = append(snapshot.Gauges, gauges...)\n\t\t\t\tsnapshot.Gauges = append(snapshot.Gauges,\n\t\t\t\t\tMeasurement{\n\t\t\t\t\t\tName:   fmt.Sprintf(\"%s.%s\", name, \"rate.1min\"),\n\t\t\t\t\t\tValue:  m.Rate1(),\n\t\t\t\t\t\tPeriod: int64(rep.Interval.Seconds()),\n\t\t\t\t\t\tAttributes: map[string]interface{}{\n\t\t\t\t\t\t\tDisplayUnitsLong:  Operations,\n\t\t\t\t\t\t\tDisplayUnitsShort: OperationsShort,\n\t\t\t\t\t\t\tDisplayMin:        \"0\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tMeasurement{\n\t\t\t\t\t\tName:   fmt.Sprintf(\"%s.%s\", name, \"rate.5min\"),\n\t\t\t\t\t\tValue:  m.Rate5(),\n\t\t\t\t\t\tPeriod: int64(rep.Interval.Seconds()),\n\t\t\t\t\t\tAttributes: map[string]interface{}{\n\t\t\t\t\t\t\tDisplayUnitsLong:  Operations,\n\t\t\t\t\t\t\tDisplayUnitsShort: OperationsShort,\n\t\t\t\t\t\t\tDisplayMin:        \"0\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tMeasurement{\n\t\t\t\t\t\tName:   fmt.Sprintf(\"%s.%s\", name, \"rate.15min\"),\n\t\t\t\t\t\tValue:  m.Rate15(),\n\t\t\t\t\t\tPeriod: int64(rep.Interval.Seconds()),\n\t\t\t\t\t\tAttributes: map[string]interface{}{\n\t\t\t\t\t\t\tDisplayUnitsLong:  Operations,\n\t\t\t\t\t\t\tDisplayUnitsShort: OperationsShort,\n\t\t\t\t\t\t\tDisplayMin:        \"0\",\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\t})\n\treturn\n}\n"
  },
  {
    "path": "metrics/log.go",
    "content": "package metrics\n\nimport (\n\t\"time\"\n)\n\ntype Logger interface {\n\tPrintf(format string, v ...interface{})\n}\n\nfunc Log(r Registry, freq time.Duration, l Logger) {\n\tLogScaled(r, freq, time.Nanosecond, l)\n}\n\n// Output each metric in the given registry periodically using the given\n// logger. Print timings in `scale` units (eg time.Millisecond) rather than nanos.\nfunc LogScaled(r Registry, freq time.Duration, scale time.Duration, l Logger) {\n\tdu := float64(scale)\n\tduSuffix := scale.String()[1:]\n\n\tfor range time.Tick(freq) {\n\t\tr.Each(func(name string, i interface{}) {\n\t\t\tswitch metric := i.(type) {\n\t\t\tcase Counter:\n\t\t\t\tl.Printf(\"counter %s\\n\", name)\n\t\t\t\tl.Printf(\"  count:       %9d\\n\", metric.Count())\n\t\t\tcase Gauge:\n\t\t\t\tl.Printf(\"gauge %s\\n\", name)\n\t\t\t\tl.Printf(\"  value:       %9d\\n\", metric.Value())\n\t\t\tcase GaugeFloat64:\n\t\t\t\tl.Printf(\"gauge %s\\n\", name)\n\t\t\t\tl.Printf(\"  value:       %f\\n\", metric.Value())\n\t\t\tcase Healthcheck:\n\t\t\t\tmetric.Check()\n\t\t\t\tl.Printf(\"healthcheck %s\\n\", name)\n\t\t\t\tl.Printf(\"  error:       %v\\n\", metric.Error())\n\t\t\tcase Histogram:\n\t\t\t\th := metric.Snapshot()\n\t\t\t\tps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\t\tl.Printf(\"histogram %s\\n\", name)\n\t\t\t\tl.Printf(\"  count:       %9d\\n\", h.Count())\n\t\t\t\tl.Printf(\"  min:         %9d\\n\", h.Min())\n\t\t\t\tl.Printf(\"  max:         %9d\\n\", h.Max())\n\t\t\t\tl.Printf(\"  mean:        %12.2f\\n\", h.Mean())\n\t\t\t\tl.Printf(\"  stddev:      %12.2f\\n\", h.StdDev())\n\t\t\t\tl.Printf(\"  median:      %12.2f\\n\", ps[0])\n\t\t\t\tl.Printf(\"  75%%:         %12.2f\\n\", ps[1])\n\t\t\t\tl.Printf(\"  95%%:         %12.2f\\n\", ps[2])\n\t\t\t\tl.Printf(\"  99%%:         %12.2f\\n\", ps[3])\n\t\t\t\tl.Printf(\"  99.9%%:       %12.2f\\n\", ps[4])\n\t\t\tcase Meter:\n\t\t\t\tm := metric.Snapshot()\n\t\t\t\tl.Printf(\"meter %s\\n\", name)\n\t\t\t\tl.Printf(\"  count:       %9d\\n\", m.Count())\n\t\t\t\tl.Printf(\"  1-min rate:  %12.2f\\n\", m.Rate1())\n\t\t\t\tl.Printf(\"  5-min rate:  %12.2f\\n\", m.Rate5())\n\t\t\t\tl.Printf(\"  15-min rate: %12.2f\\n\", m.Rate15())\n\t\t\t\tl.Printf(\"  mean rate:   %12.2f\\n\", m.RateMean())\n\t\t\tcase Timer:\n\t\t\t\tt := metric.Snapshot()\n\t\t\t\tps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\t\tl.Printf(\"timer %s\\n\", name)\n\t\t\t\tl.Printf(\"  count:       %9d\\n\", t.Count())\n\t\t\t\tl.Printf(\"  min:         %12.2f%s\\n\", float64(t.Min())/du, duSuffix)\n\t\t\t\tl.Printf(\"  max:         %12.2f%s\\n\", float64(t.Max())/du, duSuffix)\n\t\t\t\tl.Printf(\"  mean:        %12.2f%s\\n\", t.Mean()/du, duSuffix)\n\t\t\t\tl.Printf(\"  stddev:      %12.2f%s\\n\", t.StdDev()/du, duSuffix)\n\t\t\t\tl.Printf(\"  median:      %12.2f%s\\n\", ps[0]/du, duSuffix)\n\t\t\t\tl.Printf(\"  75%%:         %12.2f%s\\n\", ps[1]/du, duSuffix)\n\t\t\t\tl.Printf(\"  95%%:         %12.2f%s\\n\", ps[2]/du, duSuffix)\n\t\t\t\tl.Printf(\"  99%%:         %12.2f%s\\n\", ps[3]/du, duSuffix)\n\t\t\t\tl.Printf(\"  99.9%%:       %12.2f%s\\n\", ps[4]/du, duSuffix)\n\t\t\t\tl.Printf(\"  1-min rate:  %12.2f\\n\", t.Rate1())\n\t\t\t\tl.Printf(\"  5-min rate:  %12.2f\\n\", t.Rate5())\n\t\t\t\tl.Printf(\"  15-min rate: %12.2f\\n\", t.Rate15())\n\t\t\t\tl.Printf(\"  mean rate:   %12.2f\\n\", t.RateMean())\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "metrics/memory.md",
    "content": "Memory usage\n============\n\n(Highly unscientific.)\n\nCommand used to gather static memory usage:\n\n```sh\ngrep ^Vm \"/proc/$(ps fax | grep [m]etrics-bench | awk '{print $1}')/status\"\n```\n\nProgram used to gather baseline memory usage:\n\n```go\npackage main\n\nimport \"time\"\n\nfunc main() {\n\ttime.Sleep(600e9)\n}\n```\n\nBaseline\n--------\n\n```\nVmPeak:    42604 kB\nVmSize:    42604 kB\nVmLck:         0 kB\nVmHWM:      1120 kB\nVmRSS:      1120 kB\nVmData:    35460 kB\nVmStk:       136 kB\nVmExe:      1020 kB\nVmLib:      1848 kB\nVmPTE:        36 kB\nVmSwap:        0 kB\n```\n\nProgram used to gather metric memory usage (with other metrics being similar):\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"metrics\"\n\t\"time\"\n)\n\nfunc main() {\n\tfmt.Sprintf(\"foo\")\n\tmetrics.NewRegistry()\n\ttime.Sleep(600e9)\n}\n```\n\n1000 counters registered\n------------------------\n\n```\nVmPeak:    44016 kB\nVmSize:    44016 kB\nVmLck:         0 kB\nVmHWM:      1928 kB\nVmRSS:      1928 kB\nVmData:    36868 kB\nVmStk:       136 kB\nVmExe:      1024 kB\nVmLib:      1848 kB\nVmPTE:        40 kB\nVmSwap:        0 kB\n```\n\n**1.412 kB virtual, TODO 0.808 kB resident per counter.**\n\n100000 counters registered\n--------------------------\n\n```\nVmPeak:    55024 kB\nVmSize:    55024 kB\nVmLck:         0 kB\nVmHWM:     12440 kB\nVmRSS:     12440 kB\nVmData:    47876 kB\nVmStk:       136 kB\nVmExe:      1024 kB\nVmLib:      1848 kB\nVmPTE:        64 kB\nVmSwap:        0 kB\n```\n\n**0.1242 kB virtual, 0.1132 kB resident per counter.**\n\n1000 gauges registered\n----------------------\n\n```\nVmPeak:    44012 kB\nVmSize:    44012 kB\nVmLck:         0 kB\nVmHWM:      1928 kB\nVmRSS:      1928 kB\nVmData:    36868 kB\nVmStk:       136 kB\nVmExe:      1020 kB\nVmLib:      1848 kB\nVmPTE:        40 kB\nVmSwap:        0 kB\n```\n\n**1.408 kB virtual, 0.808 kB resident per counter.**\n\n100000 gauges registered\n------------------------\n\n```\nVmPeak:    55020 kB\nVmSize:    55020 kB\nVmLck:         0 kB\nVmHWM:     12432 kB\nVmRSS:     12432 kB\nVmData:    47876 kB\nVmStk:       136 kB\nVmExe:      1020 kB\nVmLib:      1848 kB\nVmPTE:        60 kB\nVmSwap:        0 kB\n```\n\n**0.12416 kB virtual, 0.11312 resident per gauge.**\n\n1000 histograms with a uniform sample size of 1028\n--------------------------------------------------\n\n```\nVmPeak:    72272 kB\nVmSize:    72272 kB\nVmLck:         0 kB\nVmHWM:     16204 kB\nVmRSS:     16204 kB\nVmData:    65100 kB\nVmStk:       136 kB\nVmExe:      1048 kB\nVmLib:      1848 kB\nVmPTE:        80 kB\nVmSwap:        0 kB\n```\n\n**29.668 kB virtual, TODO 15.084 resident per histogram.**\n\n10000 histograms with a uniform sample size of 1028\n---------------------------------------------------\n\n```\nVmPeak:   256912 kB\nVmSize:   256912 kB\nVmLck:         0 kB\nVmHWM:    146204 kB\nVmRSS:    146204 kB\nVmData:   249740 kB\nVmStk:       136 kB\nVmExe:      1048 kB\nVmLib:      1848 kB\nVmPTE:       448 kB\nVmSwap:        0 kB\n```\n\n**21.4308 kB virtual, 14.5084 kB resident per histogram.**\n\n50000 histograms with a uniform sample size of 1028\n---------------------------------------------------\n\n```\nVmPeak:   908112 kB\nVmSize:   908112 kB\nVmLck:         0 kB\nVmHWM:    645832 kB\nVmRSS:    645588 kB\nVmData:   900940 kB\nVmStk:       136 kB\nVmExe:      1048 kB\nVmLib:      1848 kB\nVmPTE:      1716 kB\nVmSwap:     1544 kB\n```\n\n**17.31016 kB virtual, 12.88936 kB resident per histogram.**\n\n1000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015\n-------------------------------------------------------------------------------------\n\n```\nVmPeak:    62480 kB\nVmSize:    62480 kB\nVmLck:         0 kB\nVmHWM:     11572 kB\nVmRSS:     11572 kB\nVmData:    55308 kB\nVmStk:       136 kB\nVmExe:      1048 kB\nVmLib:      1848 kB\nVmPTE:        64 kB\nVmSwap:        0 kB\n```\n\n**19.876 kB virtual, 10.452 kB resident per histogram.**\n\n10000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015\n--------------------------------------------------------------------------------------\n\n```\nVmPeak:   153296 kB\nVmSize:   153296 kB\nVmLck:         0 kB\nVmHWM:    101176 kB\nVmRSS:    101176 kB\nVmData:   146124 kB\nVmStk:       136 kB\nVmExe:      1048 kB\nVmLib:      1848 kB\nVmPTE:       240 kB\nVmSwap:        0 kB\n```\n\n**11.0692 kB virtual, 10.0056 kB resident per histogram.**\n\n50000 histograms with an exponentially-decaying sample size of 1028 and alpha of 0.015\n--------------------------------------------------------------------------------------\n\n```\nVmPeak:   557264 kB\nVmSize:   557264 kB\nVmLck:         0 kB\nVmHWM:    501056 kB\nVmRSS:    501056 kB\nVmData:   550092 kB\nVmStk:       136 kB\nVmExe:      1048 kB\nVmLib:      1848 kB\nVmPTE:      1032 kB\nVmSwap:        0 kB\n```\n\n**10.2932 kB virtual, 9.99872 kB resident per histogram.**\n\n1000 meters\n-----------\n\n```\nVmPeak:    74504 kB\nVmSize:    74504 kB\nVmLck:         0 kB\nVmHWM:     24124 kB\nVmRSS:     24124 kB\nVmData:    67340 kB\nVmStk:       136 kB\nVmExe:      1040 kB\nVmLib:      1848 kB\nVmPTE:        92 kB\nVmSwap:        0 kB\n```\n\n**31.9 kB virtual, 23.004 kB resident per meter.**\n\n10000 meters\n------------\n\n```\nVmPeak:   278920 kB\nVmSize:   278920 kB\nVmLck:         0 kB\nVmHWM:    227300 kB\nVmRSS:    227300 kB\nVmData:   271756 kB\nVmStk:       136 kB\nVmExe:      1040 kB\nVmLib:      1848 kB\nVmPTE:       488 kB\nVmSwap:        0 kB\n```\n\n**23.6316 kB virtual, 22.618 kB resident per meter.**\n"
  },
  {
    "path": "metrics/meter.go",
    "content": "package metrics\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\n// Meters count events to produce exponentially-weighted moving average rates\n// at one-, five-, and fifteen-minutes and a mean rate.\ntype Meter interface {\n\tCount() int64\n\tMark(int64)\n\tRate1() float64\n\tRate5() float64\n\tRate15() float64\n\tRateMean() float64\n\tSnapshot() Meter\n\tStop()\n}\n\n// GetOrRegisterMeter returns an existing Meter or constructs and registers a\n// new StandardMeter.\n// Be sure to unregister the meter from the registry once it is of no use to\n// allow for garbage collection.\nfunc GetOrRegisterMeter(name string, r Registry) Meter {\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\treturn r.GetOrRegister(name, NewMeter).(Meter)\n}\n\n// NewMeter constructs a new StandardMeter and launches a goroutine.\n// Be sure to call Stop() once the meter is of no use to allow for garbage collection.\nfunc NewMeter() Meter {\n\tif !Enabled {\n\t\treturn NilMeter{}\n\t}\n\tm := newStandardMeter()\n\tarbiter.Lock()\n\tdefer arbiter.Unlock()\n\tarbiter.meters[m] = struct{}{}\n\tif !arbiter.started {\n\t\tarbiter.started = true\n\t\tgo arbiter.tick()\n\t}\n\treturn m\n}\n\nfunc NewHashrateMeter() Meter {\n\tm := &StandardMeter{\n\t\tsnapshot:  &MeterSnapshot{},\n\t\ta1:        NewHashrateEWMA1(),\n\t\ta5:        NewHashrateEWMA5(),\n\t\ta15:       NewHashrateEWMA15(),\n\t\tstartTime: time.Now(),\n\t}\n\tarbiter.Lock()\n\tdefer arbiter.Unlock()\n\tarbiter.meters[m] = struct{}{}\n\tif !arbiter.started {\n\t\tarbiter.started = true\n\t\tgo arbiter.tick()\n\t}\n\treturn m\n}\n\n// NewMeter constructs and registers a new StandardMeter and launches a\n// goroutine.\n// Be sure to unregister the meter from the registry once it is of no use to\n// allow for garbage collection.\nfunc NewRegisteredMeter(name string, r Registry) Meter {\n\tc := NewMeter()\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// MeterSnapshot is a read-only copy of another Meter.\ntype MeterSnapshot struct {\n\tcount                          int64\n\trate1, rate5, rate15, rateMean float64\n}\n\n// Count returns the count of events at the time the snapshot was taken.\nfunc (m *MeterSnapshot) Count() int64 { return m.count }\n\n// Mark panics.\nfunc (*MeterSnapshot) Mark(n int64) {\n\tpanic(\"Mark called on a MeterSnapshot\")\n}\n\n// Rate1 returns the one-minute moving average rate of events per second at the\n// time the snapshot was taken.\nfunc (m *MeterSnapshot) Rate1() float64 { return m.rate1 }\n\n// Rate5 returns the five-minute moving average rate of events per second at\n// the time the snapshot was taken.\nfunc (m *MeterSnapshot) Rate5() float64 { return m.rate5 }\n\n// Rate15 returns the fifteen-minute moving average rate of events per second\n// at the time the snapshot was taken.\nfunc (m *MeterSnapshot) Rate15() float64 { return m.rate15 }\n\n// RateMean returns the meter's mean rate of events per second at the time the\n// snapshot was taken.\nfunc (m *MeterSnapshot) RateMean() float64 { return m.rateMean }\n\n// Snapshot returns the snapshot.\nfunc (m *MeterSnapshot) Snapshot() Meter { return m }\n\n// Stop is a no-op.\nfunc (m *MeterSnapshot) Stop() {}\n\n// NilMeter is a no-op Meter.\ntype NilMeter struct{}\n\n// Count is a no-op.\nfunc (NilMeter) Count() int64 { return 0 }\n\n// Mark is a no-op.\nfunc (NilMeter) Mark(n int64) {}\n\n// Rate1 is a no-op.\nfunc (NilMeter) Rate1() float64 { return 0.0 }\n\n// Rate5 is a no-op.\nfunc (NilMeter) Rate5() float64 { return 0.0 }\n\n// Rate15is a no-op.\nfunc (NilMeter) Rate15() float64 { return 0.0 }\n\n// RateMean is a no-op.\nfunc (NilMeter) RateMean() float64 { return 0.0 }\n\n// Snapshot is a no-op.\nfunc (NilMeter) Snapshot() Meter { return NilMeter{} }\n\n// Stop is a no-op.\nfunc (NilMeter) Stop() {}\n\n// StandardMeter is the standard implementation of a Meter.\ntype StandardMeter struct {\n\tlock        sync.RWMutex\n\tsnapshot    *MeterSnapshot\n\ta1, a5, a15 EWMA\n\tstartTime   time.Time\n\tstopped     bool\n}\n\nfunc newStandardMeter() *StandardMeter {\n\treturn &StandardMeter{\n\t\tsnapshot:  &MeterSnapshot{},\n\t\ta1:        NewEWMA1(),\n\t\ta5:        NewEWMA5(),\n\t\ta15:       NewEWMA15(),\n\t\tstartTime: time.Now(),\n\t}\n}\n\n// Stop stops the meter, Mark() will be a no-op if you use it after being stopped.\nfunc (m *StandardMeter) Stop() {\n\tm.lock.Lock()\n\tstopped := m.stopped\n\tm.stopped = true\n\tm.lock.Unlock()\n\tif !stopped {\n\t\tarbiter.Lock()\n\t\tdelete(arbiter.meters, m)\n\t\tarbiter.Unlock()\n\t}\n}\n\n// Count returns the number of events recorded.\nfunc (m *StandardMeter) Count() int64 {\n\tm.lock.RLock()\n\tcount := m.snapshot.count\n\tm.lock.RUnlock()\n\treturn count\n}\n\n// Mark records the occurrence of n events.\nfunc (m *StandardMeter) Mark(n int64) {\n\tm.lock.Lock()\n\tdefer m.lock.Unlock()\n\tif m.stopped {\n\t\treturn\n\t}\n\tm.snapshot.count += n\n\tm.a1.Update(n)\n\tm.a5.Update(n)\n\tm.a15.Update(n)\n\tm.updateSnapshot()\n}\n\n// Rate1 returns the one-minute moving average rate of events per second.\nfunc (m *StandardMeter) Rate1() float64 {\n\tm.lock.RLock()\n\trate1 := m.snapshot.rate1\n\tm.lock.RUnlock()\n\treturn rate1\n}\n\n// Rate5 returns the five-minute moving average rate of events per second.\nfunc (m *StandardMeter) Rate5() float64 {\n\tm.lock.RLock()\n\trate5 := m.snapshot.rate5\n\tm.lock.RUnlock()\n\treturn rate5\n}\n\n// Rate15 returns the fifteen-minute moving average rate of events per second.\nfunc (m *StandardMeter) Rate15() float64 {\n\tm.lock.RLock()\n\trate15 := m.snapshot.rate15\n\tm.lock.RUnlock()\n\treturn rate15\n}\n\n// RateMean returns the meter's mean rate of events per second.\nfunc (m *StandardMeter) RateMean() float64 {\n\tm.lock.RLock()\n\trateMean := m.snapshot.rateMean\n\tm.lock.RUnlock()\n\treturn rateMean\n}\n\n// Snapshot returns a read-only copy of the meter.\nfunc (m *StandardMeter) Snapshot() Meter {\n\tm.lock.RLock()\n\tsnapshot := *m.snapshot\n\tm.lock.RUnlock()\n\treturn &snapshot\n}\n\nfunc (m *StandardMeter) updateSnapshot() {\n\t// should run with write lock held on m.lock\n\tsnapshot := m.snapshot\n\tsnapshot.rate1 = m.a1.Rate()\n\tsnapshot.rate5 = m.a5.Rate()\n\tsnapshot.rate15 = m.a15.Rate()\n\tsnapshot.rateMean = float64(snapshot.count) / time.Since(m.startTime).Seconds()\n}\n\nfunc (m *StandardMeter) tick() {\n\tm.lock.Lock()\n\tdefer m.lock.Unlock()\n\tm.a1.Tick()\n\tm.a5.Tick()\n\tm.a15.Tick()\n\tm.updateSnapshot()\n}\n\n// meterArbiter ticks meters every 5s from a single goroutine.\n// meters are references in a set for future stopping.\ntype meterArbiter struct {\n\tsync.RWMutex\n\tstarted bool\n\tmeters  map[*StandardMeter]struct{}\n\tticker  *time.Ticker\n}\n\nvar arbiter = meterArbiter{ticker: time.NewTicker(5e9), meters: make(map[*StandardMeter]struct{})}\n\n// Ticks meters on the scheduled interval\nfunc (ma *meterArbiter) tick() {\n\tfor range ma.ticker.C {\n\t\tma.tickMeters()\n\t}\n}\n\nfunc (ma *meterArbiter) tickMeters() {\n\tma.RLock()\n\tdefer ma.RUnlock()\n\tfor meter := range ma.meters {\n\t\tmeter.tick()\n\t}\n}\n"
  },
  {
    "path": "metrics/metrics.go",
    "content": "// Go port of Coda Hale's Metrics library\n//\n// <https://github.com/rcrowley/go-metrics>\n//\n// Coda Hale's original work: <https://github.com/codahale/metrics>\npackage metrics\n\nimport (\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// Enabled is checked by the constructor functions for all of the\n// standard metrics.  If it is true, the metric returned is a stub.\n//\n// This global kill-switch helps quantify the observer effect and makes\n// for less cluttered pprof profiles.\nvar Enabled bool = false\n\n// MetricsEnabledFlag is the CLI flag name to use to enable metrics collections.\nconst MetricsEnabledFlag = \"metrics\"\nconst DashboardEnabledFlag = \"dashboard\"\n\n// Init enables or disables the metrics system. Since we need this to run before\n// any other code gets to create meters and timers, we'll actually do an ugly hack\n// and peek into the command line args for the metrics flag.\nfunc init() {\n\tfor _, arg := range os.Args {\n\t\tif flag := strings.TrimLeft(arg, \"-\"); flag == MetricsEnabledFlag || flag == DashboardEnabledFlag {\n\t\t\tlog.Info(\"Enabling metrics collection\")\n\t\t\tEnabled = true\n\t\t}\n\t}\n}\n\n// CollectProcessMetrics periodically collects various metrics about the running\n// process.\nfunc CollectProcessMetrics(refresh time.Duration) {\n\t// Short circuit if the metrics system is disabled\n\tif !Enabled {\n\t\treturn\n\t}\n\t// Create the various data collectors\n\tmemstats := make([]*runtime.MemStats, 2)\n\tdiskstats := make([]*DiskStats, 2)\n\tfor i := 0; i < len(memstats); i++ {\n\t\tmemstats[i] = new(runtime.MemStats)\n\t\tdiskstats[i] = new(DiskStats)\n\t}\n\t// Define the various metrics to collect\n\tmemAllocs := GetOrRegisterMeter(\"system/memory/allocs\", DefaultRegistry)\n\tmemFrees := GetOrRegisterMeter(\"system/memory/frees\", DefaultRegistry)\n\tmemInuse := GetOrRegisterMeter(\"system/memory/inuse\", DefaultRegistry)\n\tmemPauses := GetOrRegisterMeter(\"system/memory/pauses\", DefaultRegistry)\n\n\tvar diskReads, diskReadBytes, diskWrites, diskWriteBytes Meter\n\tvar diskReadBytesCounter, diskWriteBytesCounter Counter\n\tif err := ReadDiskStats(diskstats[0]); err == nil {\n\t\tdiskReads = GetOrRegisterMeter(\"system/disk/readcount\", DefaultRegistry)\n\t\tdiskReadBytes = GetOrRegisterMeter(\"system/disk/readdata\", DefaultRegistry)\n\t\tdiskReadBytesCounter = GetOrRegisterCounter(\"system/disk/readbytes\", DefaultRegistry)\n\t\tdiskWrites = GetOrRegisterMeter(\"system/disk/writecount\", DefaultRegistry)\n\t\tdiskWriteBytes = GetOrRegisterMeter(\"system/disk/writedata\", DefaultRegistry)\n\t\tdiskWriteBytesCounter = GetOrRegisterCounter(\"system/disk/writebytes\", DefaultRegistry)\n\t} else {\n\t\tlog.Debug(\"Failed to read disk metrics\", \"err\", err)\n\t}\n\t// Iterate loading the different stats and updating the meters\n\tfor i := 1; ; i++ {\n\t\tlocation1 := i % 2\n\t\tlocation2 := (i - 1) % 2\n\n\t\truntime.ReadMemStats(memstats[location1])\n\t\tmemAllocs.Mark(int64(memstats[location1].Mallocs - memstats[location2].Mallocs))\n\t\tmemFrees.Mark(int64(memstats[location1].Frees - memstats[location2].Frees))\n\t\tmemInuse.Mark(int64(memstats[location1].Alloc - memstats[location2].Alloc))\n\t\tmemPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs))\n\n\t\tif ReadDiskStats(diskstats[location1]) == nil {\n\t\t\tdiskReads.Mark(diskstats[location1].ReadCount - diskstats[location2].ReadCount)\n\t\t\tdiskReadBytes.Mark(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes)\n\t\t\tdiskWrites.Mark(diskstats[location1].WriteCount - diskstats[location2].WriteCount)\n\t\t\tdiskWriteBytes.Mark(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes)\n\n\t\t\tdiskReadBytesCounter.Inc(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes)\n\t\t\tdiskWriteBytesCounter.Inc(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes)\n\t\t}\n\t\ttime.Sleep(refresh)\n\t}\n}\n"
  },
  {
    "path": "metrics/opentsdb.go",
    "content": "package metrics\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n)\n\nvar shortHostName string = \"\"\n\n// OpenTSDBConfig provides a container with configuration parameters for\n// the OpenTSDB exporter\ntype OpenTSDBConfig struct {\n\tAddr          *net.TCPAddr  // Network address to connect to\n\tRegistry      Registry      // Registry to be exported\n\tFlushInterval time.Duration // Flush interval\n\tDurationUnit  time.Duration // Time conversion unit for durations\n\tPrefix        string        // Prefix to be prepended to metric names\n}\n\n// OpenTSDB is a blocking exporter function which reports metrics in r\n// to a TSDB server located at addr, flushing them every d duration\n// and prepending metric names with prefix.\nfunc OpenTSDB(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) {\n\tOpenTSDBWithConfig(OpenTSDBConfig{\n\t\tAddr:          addr,\n\t\tRegistry:      r,\n\t\tFlushInterval: d,\n\t\tDurationUnit:  time.Nanosecond,\n\t\tPrefix:        prefix,\n\t})\n}\n\n// OpenTSDBWithConfig is a blocking exporter function just like OpenTSDB,\n// but it takes a OpenTSDBConfig instead.\nfunc OpenTSDBWithConfig(c OpenTSDBConfig) {\n\tfor range time.Tick(c.FlushInterval) {\n\t\tif err := openTSDB(&c); nil != err {\n\t\t\tlog.Println(err)\n\t\t}\n\t}\n}\n\nfunc getShortHostname() string {\n\tif shortHostName == \"\" {\n\t\thost, _ := os.Hostname()\n\t\tif index := strings.Index(host, \".\"); index > 0 {\n\t\t\tshortHostName = host[:index]\n\t\t} else {\n\t\t\tshortHostName = host\n\t\t}\n\t}\n\treturn shortHostName\n}\n\nfunc openTSDB(c *OpenTSDBConfig) error {\n\tshortHostname := getShortHostname()\n\tnow := time.Now().Unix()\n\tdu := float64(c.DurationUnit)\n\tconn, err := net.DialTCP(\"tcp\", nil, c.Addr)\n\tif nil != err {\n\t\treturn err\n\t}\n\tdefer conn.Close()\n\tw := bufio.NewWriter(conn)\n\tc.Registry.Each(func(name string, i interface{}) {\n\t\tswitch metric := i.(type) {\n\t\tcase Counter:\n\t\t\tfmt.Fprintf(w, \"put %s.%s.count %d %d host=%s\\n\", c.Prefix, name, now, metric.Count(), shortHostname)\n\t\tcase Gauge:\n\t\t\tfmt.Fprintf(w, \"put %s.%s.value %d %d host=%s\\n\", c.Prefix, name, now, metric.Value(), shortHostname)\n\t\tcase GaugeFloat64:\n\t\t\tfmt.Fprintf(w, \"put %s.%s.value %d %f host=%s\\n\", c.Prefix, name, now, metric.Value(), shortHostname)\n\t\tcase Histogram:\n\t\t\th := metric.Snapshot()\n\t\t\tps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\tfmt.Fprintf(w, \"put %s.%s.count %d %d host=%s\\n\", c.Prefix, name, now, h.Count(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.min %d %d host=%s\\n\", c.Prefix, name, now, h.Min(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.max %d %d host=%s\\n\", c.Prefix, name, now, h.Max(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.mean %d %.2f host=%s\\n\", c.Prefix, name, now, h.Mean(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.std-dev %d %.2f host=%s\\n\", c.Prefix, name, now, h.StdDev(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.50-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[0], shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.75-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[1], shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.95-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[2], shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.99-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[3], shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.999-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[4], shortHostname)\n\t\tcase Meter:\n\t\t\tm := metric.Snapshot()\n\t\t\tfmt.Fprintf(w, \"put %s.%s.count %d %d host=%s\\n\", c.Prefix, name, now, m.Count(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.one-minute %d %.2f host=%s\\n\", c.Prefix, name, now, m.Rate1(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.five-minute %d %.2f host=%s\\n\", c.Prefix, name, now, m.Rate5(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.fifteen-minute %d %.2f host=%s\\n\", c.Prefix, name, now, m.Rate15(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.mean %d %.2f host=%s\\n\", c.Prefix, name, now, m.RateMean(), shortHostname)\n\t\tcase Timer:\n\t\t\tt := metric.Snapshot()\n\t\t\tps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\tfmt.Fprintf(w, \"put %s.%s.count %d %d host=%s\\n\", c.Prefix, name, now, t.Count(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.min %d %d host=%s\\n\", c.Prefix, name, now, t.Min()/int64(du), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.max %d %d host=%s\\n\", c.Prefix, name, now, t.Max()/int64(du), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.mean %d %.2f host=%s\\n\", c.Prefix, name, now, t.Mean()/du, shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.std-dev %d %.2f host=%s\\n\", c.Prefix, name, now, t.StdDev()/du, shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.50-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[0]/du, shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.75-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[1]/du, shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.95-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[2]/du, shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.99-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[3]/du, shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.999-percentile %d %.2f host=%s\\n\", c.Prefix, name, now, ps[4]/du, shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.one-minute %d %.2f host=%s\\n\", c.Prefix, name, now, t.Rate1(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.five-minute %d %.2f host=%s\\n\", c.Prefix, name, now, t.Rate5(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.fifteen-minute %d %.2f host=%s\\n\", c.Prefix, name, now, t.Rate15(), shortHostname)\n\t\t\tfmt.Fprintf(w, \"put %s.%s.mean-rate %d %.2f host=%s\\n\", c.Prefix, name, now, t.RateMean(), shortHostname)\n\t\t}\n\t\tw.Flush()\n\t})\n\treturn nil\n}\n"
  },
  {
    "path": "metrics/registry.go",
    "content": "package metrics\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n)\n\n// DuplicateMetric is the error returned by Registry.Register when a metric\n// already exists.  If you mean to Register that metric you must first\n// Unregister the existing metric.\ntype DuplicateMetric string\n\nfunc (err DuplicateMetric) Error() string {\n\treturn fmt.Sprintf(\"duplicate metric: %s\", string(err))\n}\n\n// A Registry holds references to a set of metrics by name and can iterate\n// over them, calling callback functions provided by the user.\n//\n// This is an interface so as to encourage other structs to implement\n// the Registry API as appropriate.\ntype Registry interface {\n\n\t// Call the given function for each registered metric.\n\tEach(func(string, interface{}))\n\n\t// Get the metric by the given name or nil if none is registered.\n\tGet(string) interface{}\n\n\t// GetAll metrics in the Registry.\n\tGetAll() map[string]map[string]interface{}\n\n\t// Gets an existing metric or registers the given one.\n\t// The interface can be the metric to register if not found in registry,\n\t// or a function returning the metric for lazy instantiation.\n\tGetOrRegister(string, interface{}) interface{}\n\n\t// Register the given metric under the given name.\n\tRegister(string, interface{}) error\n\n\t// Run all registered healthchecks.\n\tRunHealthchecks()\n\n\t// Unregister the metric with the given name.\n\tUnregister(string)\n\n\t// Unregister all metrics.  (Mostly for testing.)\n\tUnregisterAll()\n}\n\n// The standard implementation of a Registry is a mutex-protected map\n// of names to metrics.\ntype StandardRegistry struct {\n\tmetrics map[string]interface{}\n\tmutex   sync.Mutex\n}\n\n// Create a new registry.\nfunc NewRegistry() Registry {\n\treturn &StandardRegistry{metrics: make(map[string]interface{})}\n}\n\n// Call the given function for each registered metric.\nfunc (r *StandardRegistry) Each(f func(string, interface{})) {\n\tfor name, i := range r.registered() {\n\t\tf(name, i)\n\t}\n}\n\n// Get the metric by the given name or nil if none is registered.\nfunc (r *StandardRegistry) Get(name string) interface{} {\n\tr.mutex.Lock()\n\tdefer r.mutex.Unlock()\n\treturn r.metrics[name]\n}\n\n// Gets an existing metric or creates and registers a new one. Threadsafe\n// alternative to calling Get and Register on failure.\n// The interface can be the metric to register if not found in registry,\n// or a function returning the metric for lazy instantiation.\nfunc (r *StandardRegistry) GetOrRegister(name string, i interface{}) interface{} {\n\tr.mutex.Lock()\n\tdefer r.mutex.Unlock()\n\tif metric, ok := r.metrics[name]; ok {\n\t\treturn metric\n\t}\n\tif v := reflect.ValueOf(i); v.Kind() == reflect.Func {\n\t\ti = v.Call(nil)[0].Interface()\n\t}\n\tr.register(name, i)\n\treturn i\n}\n\n// Register the given metric under the given name.  Returns a DuplicateMetric\n// if a metric by the given name is already registered.\nfunc (r *StandardRegistry) Register(name string, i interface{}) error {\n\tr.mutex.Lock()\n\tdefer r.mutex.Unlock()\n\treturn r.register(name, i)\n}\n\n// Run all registered healthchecks.\nfunc (r *StandardRegistry) RunHealthchecks() {\n\tr.mutex.Lock()\n\tdefer r.mutex.Unlock()\n\tfor _, i := range r.metrics {\n\t\tif h, ok := i.(Healthcheck); ok {\n\t\t\th.Check()\n\t\t}\n\t}\n}\n\n// GetAll metrics in the Registry\nfunc (r *StandardRegistry) GetAll() map[string]map[string]interface{} {\n\tdata := make(map[string]map[string]interface{})\n\tr.Each(func(name string, i interface{}) {\n\t\tvalues := make(map[string]interface{})\n\t\tswitch metric := i.(type) {\n\t\tcase Counter:\n\t\t\tvalues[\"count\"] = metric.Count()\n\t\tcase Gauge:\n\t\t\tvalues[\"value\"] = metric.Value()\n\t\tcase GaugeFloat64:\n\t\t\tvalues[\"value\"] = metric.Value()\n\t\tcase Healthcheck:\n\t\t\tvalues[\"error\"] = nil\n\t\t\tmetric.Check()\n\t\t\tif err := metric.Error(); nil != err {\n\t\t\t\tvalues[\"error\"] = metric.Error().Error()\n\t\t\t}\n\t\tcase Histogram:\n\t\t\th := metric.Snapshot()\n\t\t\tps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\tvalues[\"count\"] = h.Count()\n\t\t\tvalues[\"min\"] = h.Min()\n\t\t\tvalues[\"max\"] = h.Max()\n\t\t\tvalues[\"mean\"] = h.Mean()\n\t\t\tvalues[\"stddev\"] = h.StdDev()\n\t\t\tvalues[\"median\"] = ps[0]\n\t\t\tvalues[\"75%\"] = ps[1]\n\t\t\tvalues[\"95%\"] = ps[2]\n\t\t\tvalues[\"99%\"] = ps[3]\n\t\t\tvalues[\"99.9%\"] = ps[4]\n\t\tcase Meter:\n\t\t\tm := metric.Snapshot()\n\t\t\tvalues[\"count\"] = m.Count()\n\t\t\tvalues[\"1m.rate\"] = m.Rate1()\n\t\t\tvalues[\"5m.rate\"] = m.Rate5()\n\t\t\tvalues[\"15m.rate\"] = m.Rate15()\n\t\t\tvalues[\"mean.rate\"] = m.RateMean()\n\t\tcase Timer:\n\t\t\tt := metric.Snapshot()\n\t\t\tps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\tvalues[\"count\"] = t.Count()\n\t\t\tvalues[\"min\"] = t.Min()\n\t\t\tvalues[\"max\"] = t.Max()\n\t\t\tvalues[\"mean\"] = t.Mean()\n\t\t\tvalues[\"stddev\"] = t.StdDev()\n\t\t\tvalues[\"median\"] = ps[0]\n\t\t\tvalues[\"75%\"] = ps[1]\n\t\t\tvalues[\"95%\"] = ps[2]\n\t\t\tvalues[\"99%\"] = ps[3]\n\t\t\tvalues[\"99.9%\"] = ps[4]\n\t\t\tvalues[\"1m.rate\"] = t.Rate1()\n\t\t\tvalues[\"5m.rate\"] = t.Rate5()\n\t\t\tvalues[\"15m.rate\"] = t.Rate15()\n\t\t\tvalues[\"mean.rate\"] = t.RateMean()\n\t\t}\n\t\tdata[name] = values\n\t})\n\treturn data\n}\n\n// Unregister the metric with the given name.\nfunc (r *StandardRegistry) Unregister(name string) {\n\tr.mutex.Lock()\n\tdefer r.mutex.Unlock()\n\tr.stop(name)\n\tdelete(r.metrics, name)\n}\n\n// Unregister all metrics.  (Mostly for testing.)\nfunc (r *StandardRegistry) UnregisterAll() {\n\tr.mutex.Lock()\n\tdefer r.mutex.Unlock()\n\tfor name := range r.metrics {\n\t\tr.stop(name)\n\t\tdelete(r.metrics, name)\n\t}\n}\n\nfunc (r *StandardRegistry) register(name string, i interface{}) error {\n\tif _, ok := r.metrics[name]; ok {\n\t\treturn DuplicateMetric(name)\n\t}\n\tswitch i.(type) {\n\tcase Counter, Gauge, GaugeFloat64, Healthcheck, Histogram, Meter, Timer, ResettingTimer:\n\t\tr.metrics[name] = i\n\t}\n\treturn nil\n}\n\nfunc (r *StandardRegistry) registered() map[string]interface{} {\n\tr.mutex.Lock()\n\tdefer r.mutex.Unlock()\n\tmetrics := make(map[string]interface{}, len(r.metrics))\n\tfor name, i := range r.metrics {\n\t\tmetrics[name] = i\n\t}\n\treturn metrics\n}\n\nfunc (r *StandardRegistry) stop(name string) {\n\tif i, ok := r.metrics[name]; ok {\n\t\tif s, ok := i.(Stoppable); ok {\n\t\t\ts.Stop()\n\t\t}\n\t}\n}\n\n// Stoppable defines the metrics which has to be stopped.\ntype Stoppable interface {\n\tStop()\n}\n\ntype PrefixedRegistry struct {\n\tunderlying Registry\n\tprefix     string\n}\n\nfunc NewPrefixedRegistry(prefix string) Registry {\n\treturn &PrefixedRegistry{\n\t\tunderlying: NewRegistry(),\n\t\tprefix:     prefix,\n\t}\n}\n\nfunc NewPrefixedChildRegistry(parent Registry, prefix string) Registry {\n\treturn &PrefixedRegistry{\n\t\tunderlying: parent,\n\t\tprefix:     prefix,\n\t}\n}\n\n// Call the given function for each registered metric.\nfunc (r *PrefixedRegistry) Each(fn func(string, interface{})) {\n\twrappedFn := func(prefix string) func(string, interface{}) {\n\t\treturn func(name string, iface interface{}) {\n\t\t\tif strings.HasPrefix(name, prefix) {\n\t\t\t\tfn(name, iface)\n\t\t\t} else {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tbaseRegistry, prefix := findPrefix(r, \"\")\n\tbaseRegistry.Each(wrappedFn(prefix))\n}\n\nfunc findPrefix(registry Registry, prefix string) (Registry, string) {\n\tswitch r := registry.(type) {\n\tcase *PrefixedRegistry:\n\t\treturn findPrefix(r.underlying, r.prefix+prefix)\n\tcase *StandardRegistry:\n\t\treturn r, prefix\n\t}\n\treturn nil, \"\"\n}\n\n// Get the metric by the given name or nil if none is registered.\nfunc (r *PrefixedRegistry) Get(name string) interface{} {\n\trealName := r.prefix + name\n\treturn r.underlying.Get(realName)\n}\n\n// Gets an existing metric or registers the given one.\n// The interface can be the metric to register if not found in registry,\n// or a function returning the metric for lazy instantiation.\nfunc (r *PrefixedRegistry) GetOrRegister(name string, metric interface{}) interface{} {\n\trealName := r.prefix + name\n\treturn r.underlying.GetOrRegister(realName, metric)\n}\n\n// Register the given metric under the given name. The name will be prefixed.\nfunc (r *PrefixedRegistry) Register(name string, metric interface{}) error {\n\trealName := r.prefix + name\n\treturn r.underlying.Register(realName, metric)\n}\n\n// Run all registered healthchecks.\nfunc (r *PrefixedRegistry) RunHealthchecks() {\n\tr.underlying.RunHealthchecks()\n}\n\n// GetAll metrics in the Registry\nfunc (r *PrefixedRegistry) GetAll() map[string]map[string]interface{} {\n\treturn r.underlying.GetAll()\n}\n\n// Unregister the metric with the given name. The name will be prefixed.\nfunc (r *PrefixedRegistry) Unregister(name string) {\n\trealName := r.prefix + name\n\tr.underlying.Unregister(realName)\n}\n\n// Unregister all metrics.  (Mostly for testing.)\nfunc (r *PrefixedRegistry) UnregisterAll() {\n\tr.underlying.UnregisterAll()\n}\n\nvar DefaultRegistry Registry = NewRegistry()\n\n// Call the given function for each registered metric.\nfunc Each(f func(string, interface{})) {\n\tDefaultRegistry.Each(f)\n}\n\n// Get the metric by the given name or nil if none is registered.\nfunc Get(name string) interface{} {\n\treturn DefaultRegistry.Get(name)\n}\n\n// Gets an existing metric or creates and registers a new one. Threadsafe\n// alternative to calling Get and Register on failure.\nfunc GetOrRegister(name string, i interface{}) interface{} {\n\treturn DefaultRegistry.GetOrRegister(name, i)\n}\n\n// Register the given metric under the given name.  Returns a DuplicateMetric\n// if a metric by the given name is already registered.\nfunc Register(name string, i interface{}) error {\n\treturn DefaultRegistry.Register(name, i)\n}\n\n// Register the given metric under the given name.  Panics if a metric by the\n// given name is already registered.\nfunc MustRegister(name string, i interface{}) {\n\tif err := Register(name, i); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Run all registered healthchecks.\nfunc RunHealthchecks() {\n\tDefaultRegistry.RunHealthchecks()\n}\n\n// Unregister the metric with the given name.\nfunc Unregister(name string) {\n\tDefaultRegistry.Unregister(name)\n}\n"
  },
  {
    "path": "metrics/resetting_timer.go",
    "content": "package metrics\n\nimport (\n\t\"math\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n)\n\n// Initial slice capacity for the values stored in a ResettingTimer\nconst InitialResettingTimerSliceCap = 10\n\n// ResettingTimer is used for storing aggregated values for timers, which are reset on every flush interval.\ntype ResettingTimer interface {\n\tValues() []int64\n\tSnapshot() ResettingTimer\n\tPercentiles([]float64) []int64\n\tMean() float64\n\tTime(func())\n\tUpdate(time.Duration)\n\tUpdateSince(time.Time)\n}\n\n// GetOrRegisterResettingTimer returns an existing ResettingTimer or constructs and registers a\n// new StandardResettingTimer.\nfunc GetOrRegisterResettingTimer(name string, r Registry) ResettingTimer {\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\treturn r.GetOrRegister(name, NewResettingTimer).(ResettingTimer)\n}\n\n// NewRegisteredResettingTimer constructs and registers a new StandardResettingTimer.\nfunc NewRegisteredResettingTimer(name string, r Registry) ResettingTimer {\n\tc := NewResettingTimer()\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// NewResettingTimer constructs a new StandardResettingTimer\nfunc NewResettingTimer() ResettingTimer {\n\tif !Enabled {\n\t\treturn NilResettingTimer{}\n\t}\n\treturn &StandardResettingTimer{\n\t\tvalues: make([]int64, 0, InitialResettingTimerSliceCap),\n\t}\n}\n\n// NilResettingTimer is a no-op ResettingTimer.\ntype NilResettingTimer struct {\n}\n\n// Values is a no-op.\nfunc (NilResettingTimer) Values() []int64 { return nil }\n\n// Snapshot is a no-op.\nfunc (NilResettingTimer) Snapshot() ResettingTimer {\n\treturn &ResettingTimerSnapshot{\n\t\tvalues: []int64{},\n\t}\n}\n\n// Time is a no-op.\nfunc (NilResettingTimer) Time(func()) {}\n\n// Update is a no-op.\nfunc (NilResettingTimer) Update(time.Duration) {}\n\n// Percentiles panics.\nfunc (NilResettingTimer) Percentiles([]float64) []int64 {\n\tpanic(\"Percentiles called on a NilResettingTimer\")\n}\n\n// Mean panics.\nfunc (NilResettingTimer) Mean() float64 {\n\tpanic(\"Mean called on a NilResettingTimer\")\n}\n\n// UpdateSince is a no-op.\nfunc (NilResettingTimer) UpdateSince(time.Time) {}\n\n// StandardResettingTimer is the standard implementation of a ResettingTimer.\n// and Meter.\ntype StandardResettingTimer struct {\n\tvalues []int64\n\tmutex  sync.Mutex\n}\n\n// Values returns a slice with all measurements.\nfunc (t *StandardResettingTimer) Values() []int64 {\n\treturn t.values\n}\n\n// Snapshot resets the timer and returns a read-only copy of its contents.\nfunc (t *StandardResettingTimer) Snapshot() ResettingTimer {\n\tt.mutex.Lock()\n\tdefer t.mutex.Unlock()\n\tcurrentValues := t.values\n\tt.values = make([]int64, 0, InitialResettingTimerSliceCap)\n\n\treturn &ResettingTimerSnapshot{\n\t\tvalues: currentValues,\n\t}\n}\n\n// Percentiles panics.\nfunc (t *StandardResettingTimer) Percentiles([]float64) []int64 {\n\tpanic(\"Percentiles called on a StandardResettingTimer\")\n}\n\n// Mean panics.\nfunc (t *StandardResettingTimer) Mean() float64 {\n\tpanic(\"Mean called on a StandardResettingTimer\")\n}\n\n// Record the duration of the execution of the given function.\nfunc (t *StandardResettingTimer) Time(f func()) {\n\tts := time.Now()\n\tf()\n\tt.Update(time.Since(ts))\n}\n\n// Record the duration of an event.\nfunc (t *StandardResettingTimer) Update(d time.Duration) {\n\tt.mutex.Lock()\n\tdefer t.mutex.Unlock()\n\tt.values = append(t.values, int64(d))\n}\n\n// Record the duration of an event that started at a time and ends now.\nfunc (t *StandardResettingTimer) UpdateSince(ts time.Time) {\n\tt.mutex.Lock()\n\tdefer t.mutex.Unlock()\n\tt.values = append(t.values, int64(time.Since(ts)))\n}\n\n// ResettingTimerSnapshot is a point-in-time copy of another ResettingTimer.\ntype ResettingTimerSnapshot struct {\n\tvalues              []int64\n\tmean                float64\n\tthresholdBoundaries []int64\n\tcalculated          bool\n}\n\n// Snapshot returns the snapshot.\nfunc (t *ResettingTimerSnapshot) Snapshot() ResettingTimer { return t }\n\n// Time panics.\nfunc (*ResettingTimerSnapshot) Time(func()) {\n\tpanic(\"Time called on a ResettingTimerSnapshot\")\n}\n\n// Update panics.\nfunc (*ResettingTimerSnapshot) Update(time.Duration) {\n\tpanic(\"Update called on a ResettingTimerSnapshot\")\n}\n\n// UpdateSince panics.\nfunc (*ResettingTimerSnapshot) UpdateSince(time.Time) {\n\tpanic(\"UpdateSince called on a ResettingTimerSnapshot\")\n}\n\n// Values returns all values from snapshot.\nfunc (t *ResettingTimerSnapshot) Values() []int64 {\n\treturn t.values\n}\n\n// Percentiles returns the boundaries for the input percentiles.\nfunc (t *ResettingTimerSnapshot) Percentiles(percentiles []float64) []int64 {\n\tt.calc(percentiles)\n\n\treturn t.thresholdBoundaries\n}\n\n// Mean returns the mean of the snapshotted values\nfunc (t *ResettingTimerSnapshot) Mean() float64 {\n\tif !t.calculated {\n\t\tt.calc([]float64{})\n\t}\n\n\treturn t.mean\n}\n\nfunc (t *ResettingTimerSnapshot) calc(percentiles []float64) {\n\tsort.Sort(Int64Slice(t.values))\n\n\tcount := len(t.values)\n\tif count > 0 {\n\t\tmin := t.values[0]\n\t\tmax := t.values[count-1]\n\n\t\tcumulativeValues := make([]int64, count)\n\t\tcumulativeValues[0] = min\n\t\tfor i := 1; i < count; i++ {\n\t\t\tcumulativeValues[i] = t.values[i] + cumulativeValues[i-1]\n\t\t}\n\n\t\tt.thresholdBoundaries = make([]int64, len(percentiles))\n\n\t\tthresholdBoundary := max\n\n\t\tfor i, pct := range percentiles {\n\t\t\tif count > 1 {\n\t\t\t\tvar abs float64\n\t\t\t\tif pct >= 0 {\n\t\t\t\t\tabs = pct\n\t\t\t\t} else {\n\t\t\t\t\tabs = 100 + pct\n\t\t\t\t}\n\t\t\t\t// poor man's math.Round(x):\n\t\t\t\t// math.Floor(x + 0.5)\n\t\t\t\tindexOfPerc := int(math.Floor(((abs / 100.0) * float64(count)) + 0.5))\n\t\t\t\tif pct >= 0 && indexOfPerc > 0 {\n\t\t\t\t\tindexOfPerc -= 1 // index offset=0\n\t\t\t\t}\n\t\t\t\tthresholdBoundary = t.values[indexOfPerc]\n\t\t\t}\n\n\t\t\tt.thresholdBoundaries[i] = thresholdBoundary\n\t\t}\n\n\t\tsum := cumulativeValues[count-1]\n\t\tt.mean = float64(sum) / float64(count)\n\t} else {\n\t\tt.thresholdBoundaries = make([]int64, len(percentiles))\n\t\tt.mean = 0\n\t}\n\n\tt.calculated = true\n}\n\n// Int64Slice attaches the methods of sort.Interface to []int64, sorting in increasing order.\ntype Int64Slice []int64\n\nfunc (s Int64Slice) Len() int           { return len(s) }\nfunc (s Int64Slice) Less(i, j int) bool { return s[i] < s[j] }\nfunc (s Int64Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }\n"
  },
  {
    "path": "metrics/runtime.go",
    "content": "package metrics\n\nimport (\n\t\"runtime\"\n\t\"runtime/pprof\"\n\t\"time\"\n)\n\nvar (\n\tmemStats       runtime.MemStats\n\truntimeMetrics struct {\n\t\tMemStats struct {\n\t\t\tAlloc         Gauge\n\t\t\tBuckHashSys   Gauge\n\t\t\tDebugGC       Gauge\n\t\t\tEnableGC      Gauge\n\t\t\tFrees         Gauge\n\t\t\tHeapAlloc     Gauge\n\t\t\tHeapIdle      Gauge\n\t\t\tHeapInuse     Gauge\n\t\t\tHeapObjects   Gauge\n\t\t\tHeapReleased  Gauge\n\t\t\tHeapSys       Gauge\n\t\t\tLastGC        Gauge\n\t\t\tLookups       Gauge\n\t\t\tMallocs       Gauge\n\t\t\tMCacheInuse   Gauge\n\t\t\tMCacheSys     Gauge\n\t\t\tMSpanInuse    Gauge\n\t\t\tMSpanSys      Gauge\n\t\t\tNextGC        Gauge\n\t\t\tNumGC         Gauge\n\t\t\tGCCPUFraction GaugeFloat64\n\t\t\tPauseNs       Histogram\n\t\t\tPauseTotalNs  Gauge\n\t\t\tStackInuse    Gauge\n\t\t\tStackSys      Gauge\n\t\t\tSys           Gauge\n\t\t\tTotalAlloc    Gauge\n\t\t}\n\t\tNumCgoCall   Gauge\n\t\tNumGoroutine Gauge\n\t\tNumThread    Gauge\n\t\tReadMemStats Timer\n\t}\n\tfrees       uint64\n\tlookups     uint64\n\tmallocs     uint64\n\tnumGC       uint32\n\tnumCgoCalls int64\n\n\tthreadCreateProfile = pprof.Lookup(\"threadcreate\")\n)\n\n// Capture new values for the Go runtime statistics exported in\n// runtime.MemStats.  This is designed to be called as a goroutine.\nfunc CaptureRuntimeMemStats(r Registry, d time.Duration) {\n\tfor range time.Tick(d) {\n\t\tCaptureRuntimeMemStatsOnce(r)\n\t}\n}\n\n// Capture new values for the Go runtime statistics exported in\n// runtime.MemStats.  This is designed to be called in a background\n// goroutine.  Giving a registry which has not been given to\n// RegisterRuntimeMemStats will panic.\n//\n// Be very careful with this because runtime.ReadMemStats calls the C\n// functions runtime·semacquire(&runtime·worldsema) and runtime·stoptheworld()\n// and that last one does what it says on the tin.\nfunc CaptureRuntimeMemStatsOnce(r Registry) {\n\tt := time.Now()\n\truntime.ReadMemStats(&memStats) // This takes 50-200us.\n\truntimeMetrics.ReadMemStats.UpdateSince(t)\n\n\truntimeMetrics.MemStats.Alloc.Update(int64(memStats.Alloc))\n\truntimeMetrics.MemStats.BuckHashSys.Update(int64(memStats.BuckHashSys))\n\tif memStats.DebugGC {\n\t\truntimeMetrics.MemStats.DebugGC.Update(1)\n\t} else {\n\t\truntimeMetrics.MemStats.DebugGC.Update(0)\n\t}\n\tif memStats.EnableGC {\n\t\truntimeMetrics.MemStats.EnableGC.Update(1)\n\t} else {\n\t\truntimeMetrics.MemStats.EnableGC.Update(0)\n\t}\n\n\truntimeMetrics.MemStats.Frees.Update(int64(memStats.Frees - frees))\n\truntimeMetrics.MemStats.HeapAlloc.Update(int64(memStats.HeapAlloc))\n\truntimeMetrics.MemStats.HeapIdle.Update(int64(memStats.HeapIdle))\n\truntimeMetrics.MemStats.HeapInuse.Update(int64(memStats.HeapInuse))\n\truntimeMetrics.MemStats.HeapObjects.Update(int64(memStats.HeapObjects))\n\truntimeMetrics.MemStats.HeapReleased.Update(int64(memStats.HeapReleased))\n\truntimeMetrics.MemStats.HeapSys.Update(int64(memStats.HeapSys))\n\truntimeMetrics.MemStats.LastGC.Update(int64(memStats.LastGC))\n\truntimeMetrics.MemStats.Lookups.Update(int64(memStats.Lookups - lookups))\n\truntimeMetrics.MemStats.Mallocs.Update(int64(memStats.Mallocs - mallocs))\n\truntimeMetrics.MemStats.MCacheInuse.Update(int64(memStats.MCacheInuse))\n\truntimeMetrics.MemStats.MCacheSys.Update(int64(memStats.MCacheSys))\n\truntimeMetrics.MemStats.MSpanInuse.Update(int64(memStats.MSpanInuse))\n\truntimeMetrics.MemStats.MSpanSys.Update(int64(memStats.MSpanSys))\n\truntimeMetrics.MemStats.NextGC.Update(int64(memStats.NextGC))\n\truntimeMetrics.MemStats.NumGC.Update(int64(memStats.NumGC - numGC))\n\truntimeMetrics.MemStats.GCCPUFraction.Update(gcCPUFraction(&memStats))\n\n\t// <https://code.google.com/p/go/source/browse/src/pkg/runtime/mgc0.c>\n\ti := numGC % uint32(len(memStats.PauseNs))\n\tii := memStats.NumGC % uint32(len(memStats.PauseNs))\n\tif memStats.NumGC-numGC >= uint32(len(memStats.PauseNs)) {\n\t\tfor i = 0; i < uint32(len(memStats.PauseNs)); i++ {\n\t\t\truntimeMetrics.MemStats.PauseNs.Update(int64(memStats.PauseNs[i]))\n\t\t}\n\t} else {\n\t\tif i > ii {\n\t\t\tfor ; i < uint32(len(memStats.PauseNs)); i++ {\n\t\t\t\truntimeMetrics.MemStats.PauseNs.Update(int64(memStats.PauseNs[i]))\n\t\t\t}\n\t\t\ti = 0\n\t\t}\n\t\tfor ; i < ii; i++ {\n\t\t\truntimeMetrics.MemStats.PauseNs.Update(int64(memStats.PauseNs[i]))\n\t\t}\n\t}\n\tfrees = memStats.Frees\n\tlookups = memStats.Lookups\n\tmallocs = memStats.Mallocs\n\tnumGC = memStats.NumGC\n\n\truntimeMetrics.MemStats.PauseTotalNs.Update(int64(memStats.PauseTotalNs))\n\truntimeMetrics.MemStats.StackInuse.Update(int64(memStats.StackInuse))\n\truntimeMetrics.MemStats.StackSys.Update(int64(memStats.StackSys))\n\truntimeMetrics.MemStats.Sys.Update(int64(memStats.Sys))\n\truntimeMetrics.MemStats.TotalAlloc.Update(int64(memStats.TotalAlloc))\n\n\tcurrentNumCgoCalls := numCgoCall()\n\truntimeMetrics.NumCgoCall.Update(currentNumCgoCalls - numCgoCalls)\n\tnumCgoCalls = currentNumCgoCalls\n\n\truntimeMetrics.NumGoroutine.Update(int64(runtime.NumGoroutine()))\n\n\truntimeMetrics.NumThread.Update(int64(threadCreateProfile.Count()))\n}\n\n// Register runtimeMetrics for the Go runtime statistics exported in runtime and\n// specifically runtime.MemStats.  The runtimeMetrics are named by their\n// fully-qualified Go symbols, i.e. runtime.MemStats.Alloc.\nfunc RegisterRuntimeMemStats(r Registry) {\n\truntimeMetrics.MemStats.Alloc = NewGauge()\n\truntimeMetrics.MemStats.BuckHashSys = NewGauge()\n\truntimeMetrics.MemStats.DebugGC = NewGauge()\n\truntimeMetrics.MemStats.EnableGC = NewGauge()\n\truntimeMetrics.MemStats.Frees = NewGauge()\n\truntimeMetrics.MemStats.HeapAlloc = NewGauge()\n\truntimeMetrics.MemStats.HeapIdle = NewGauge()\n\truntimeMetrics.MemStats.HeapInuse = NewGauge()\n\truntimeMetrics.MemStats.HeapObjects = NewGauge()\n\truntimeMetrics.MemStats.HeapReleased = NewGauge()\n\truntimeMetrics.MemStats.HeapSys = NewGauge()\n\truntimeMetrics.MemStats.LastGC = NewGauge()\n\truntimeMetrics.MemStats.Lookups = NewGauge()\n\truntimeMetrics.MemStats.Mallocs = NewGauge()\n\truntimeMetrics.MemStats.MCacheInuse = NewGauge()\n\truntimeMetrics.MemStats.MCacheSys = NewGauge()\n\truntimeMetrics.MemStats.MSpanInuse = NewGauge()\n\truntimeMetrics.MemStats.MSpanSys = NewGauge()\n\truntimeMetrics.MemStats.NextGC = NewGauge()\n\truntimeMetrics.MemStats.NumGC = NewGauge()\n\truntimeMetrics.MemStats.GCCPUFraction = NewGaugeFloat64()\n\truntimeMetrics.MemStats.PauseNs = NewHistogram(NewExpDecaySample(1028, 0.015))\n\truntimeMetrics.MemStats.PauseTotalNs = NewGauge()\n\truntimeMetrics.MemStats.StackInuse = NewGauge()\n\truntimeMetrics.MemStats.StackSys = NewGauge()\n\truntimeMetrics.MemStats.Sys = NewGauge()\n\truntimeMetrics.MemStats.TotalAlloc = NewGauge()\n\truntimeMetrics.NumCgoCall = NewGauge()\n\truntimeMetrics.NumGoroutine = NewGauge()\n\truntimeMetrics.NumThread = NewGauge()\n\truntimeMetrics.ReadMemStats = NewTimer()\n\n\tr.Register(\"runtime.MemStats.Alloc\", runtimeMetrics.MemStats.Alloc)\n\tr.Register(\"runtime.MemStats.BuckHashSys\", runtimeMetrics.MemStats.BuckHashSys)\n\tr.Register(\"runtime.MemStats.DebugGC\", runtimeMetrics.MemStats.DebugGC)\n\tr.Register(\"runtime.MemStats.EnableGC\", runtimeMetrics.MemStats.EnableGC)\n\tr.Register(\"runtime.MemStats.Frees\", runtimeMetrics.MemStats.Frees)\n\tr.Register(\"runtime.MemStats.HeapAlloc\", runtimeMetrics.MemStats.HeapAlloc)\n\tr.Register(\"runtime.MemStats.HeapIdle\", runtimeMetrics.MemStats.HeapIdle)\n\tr.Register(\"runtime.MemStats.HeapInuse\", runtimeMetrics.MemStats.HeapInuse)\n\tr.Register(\"runtime.MemStats.HeapObjects\", runtimeMetrics.MemStats.HeapObjects)\n\tr.Register(\"runtime.MemStats.HeapReleased\", runtimeMetrics.MemStats.HeapReleased)\n\tr.Register(\"runtime.MemStats.HeapSys\", runtimeMetrics.MemStats.HeapSys)\n\tr.Register(\"runtime.MemStats.LastGC\", runtimeMetrics.MemStats.LastGC)\n\tr.Register(\"runtime.MemStats.Lookups\", runtimeMetrics.MemStats.Lookups)\n\tr.Register(\"runtime.MemStats.Mallocs\", runtimeMetrics.MemStats.Mallocs)\n\tr.Register(\"runtime.MemStats.MCacheInuse\", runtimeMetrics.MemStats.MCacheInuse)\n\tr.Register(\"runtime.MemStats.MCacheSys\", runtimeMetrics.MemStats.MCacheSys)\n\tr.Register(\"runtime.MemStats.MSpanInuse\", runtimeMetrics.MemStats.MSpanInuse)\n\tr.Register(\"runtime.MemStats.MSpanSys\", runtimeMetrics.MemStats.MSpanSys)\n\tr.Register(\"runtime.MemStats.NextGC\", runtimeMetrics.MemStats.NextGC)\n\tr.Register(\"runtime.MemStats.NumGC\", runtimeMetrics.MemStats.NumGC)\n\tr.Register(\"runtime.MemStats.GCCPUFraction\", runtimeMetrics.MemStats.GCCPUFraction)\n\tr.Register(\"runtime.MemStats.PauseNs\", runtimeMetrics.MemStats.PauseNs)\n\tr.Register(\"runtime.MemStats.PauseTotalNs\", runtimeMetrics.MemStats.PauseTotalNs)\n\tr.Register(\"runtime.MemStats.StackInuse\", runtimeMetrics.MemStats.StackInuse)\n\tr.Register(\"runtime.MemStats.StackSys\", runtimeMetrics.MemStats.StackSys)\n\tr.Register(\"runtime.MemStats.Sys\", runtimeMetrics.MemStats.Sys)\n\tr.Register(\"runtime.MemStats.TotalAlloc\", runtimeMetrics.MemStats.TotalAlloc)\n\tr.Register(\"runtime.NumCgoCall\", runtimeMetrics.NumCgoCall)\n\tr.Register(\"runtime.NumGoroutine\", runtimeMetrics.NumGoroutine)\n\tr.Register(\"runtime.NumThread\", runtimeMetrics.NumThread)\n\tr.Register(\"runtime.ReadMemStats\", runtimeMetrics.ReadMemStats)\n}\n"
  },
  {
    "path": "metrics/runtime_cgo.go",
    "content": "// +build cgo\n// +build !appengine\n\npackage metrics\n\nimport \"runtime\"\n\nfunc numCgoCall() int64 {\n\treturn runtime.NumCgoCall()\n}\n"
  },
  {
    "path": "metrics/runtime_gccpufraction.go",
    "content": "// +build go1.5\n\npackage metrics\n\nimport \"runtime\"\n\nfunc gcCPUFraction(memStats *runtime.MemStats) float64 {\n\treturn memStats.GCCPUFraction\n}\n"
  },
  {
    "path": "metrics/runtime_no_cgo.go",
    "content": "// +build !cgo appengine\n\npackage metrics\n\nfunc numCgoCall() int64 {\n\treturn 0\n}\n"
  },
  {
    "path": "metrics/runtime_no_gccpufraction.go",
    "content": "// +build !go1.5\n\npackage metrics\n\nimport \"runtime\"\n\nfunc gcCPUFraction(memStats *runtime.MemStats) float64 {\n\treturn 0\n}\n"
  },
  {
    "path": "metrics/sample.go",
    "content": "package metrics\n\nimport (\n\t\"math\"\n\t\"math/rand\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst rescaleThreshold = time.Hour\n\n// Samples maintain a statistically-significant selection of values from\n// a stream.\ntype Sample interface {\n\tClear()\n\tCount() int64\n\tMax() int64\n\tMean() float64\n\tMin() int64\n\tPercentile(float64) float64\n\tPercentiles([]float64) []float64\n\tSize() int\n\tSnapshot() Sample\n\tStdDev() float64\n\tSum() int64\n\tUpdate(int64)\n\tValues() []int64\n\tVariance() float64\n}\n\n// ExpDecaySample is an exponentially-decaying sample using a forward-decaying\n// priority reservoir.  See Cormode et al's \"Forward Decay: A Practical Time\n// Decay Model for Streaming Systems\".\n//\n// <http://dimacs.rutgers.edu/~graham/pubs/papers/fwddecay.pdf>\ntype ExpDecaySample struct {\n\talpha         float64\n\tcount         int64\n\tmutex         sync.Mutex\n\treservoirSize int\n\tt0, t1        time.Time\n\tvalues        *expDecaySampleHeap\n}\n\n// NewExpDecaySample constructs a new exponentially-decaying sample with the\n// given reservoir size and alpha.\nfunc NewExpDecaySample(reservoirSize int, alpha float64) Sample {\n\tif !Enabled {\n\t\treturn NilSample{}\n\t}\n\ts := &ExpDecaySample{\n\t\talpha:         alpha,\n\t\treservoirSize: reservoirSize,\n\t\tt0:            time.Now(),\n\t\tvalues:        newExpDecaySampleHeap(reservoirSize),\n\t}\n\ts.t1 = s.t0.Add(rescaleThreshold)\n\treturn s\n}\n\n// Clear clears all samples.\nfunc (s *ExpDecaySample) Clear() {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\ts.count = 0\n\ts.t0 = time.Now()\n\ts.t1 = s.t0.Add(rescaleThreshold)\n\ts.values.Clear()\n}\n\n// Count returns the number of samples recorded, which may exceed the\n// reservoir size.\nfunc (s *ExpDecaySample) Count() int64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn s.count\n}\n\n// Max returns the maximum value in the sample, which may not be the maximum\n// value ever to be part of the sample.\nfunc (s *ExpDecaySample) Max() int64 {\n\treturn SampleMax(s.Values())\n}\n\n// Mean returns the mean of the values in the sample.\nfunc (s *ExpDecaySample) Mean() float64 {\n\treturn SampleMean(s.Values())\n}\n\n// Min returns the minimum value in the sample, which may not be the minimum\n// value ever to be part of the sample.\nfunc (s *ExpDecaySample) Min() int64 {\n\treturn SampleMin(s.Values())\n}\n\n// Percentile returns an arbitrary percentile of values in the sample.\nfunc (s *ExpDecaySample) Percentile(p float64) float64 {\n\treturn SamplePercentile(s.Values(), p)\n}\n\n// Percentiles returns a slice of arbitrary percentiles of values in the\n// sample.\nfunc (s *ExpDecaySample) Percentiles(ps []float64) []float64 {\n\treturn SamplePercentiles(s.Values(), ps)\n}\n\n// Size returns the size of the sample, which is at most the reservoir size.\nfunc (s *ExpDecaySample) Size() int {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn s.values.Size()\n}\n\n// Snapshot returns a read-only copy of the sample.\nfunc (s *ExpDecaySample) Snapshot() Sample {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\tvals := s.values.Values()\n\tvalues := make([]int64, len(vals))\n\tfor i, v := range vals {\n\t\tvalues[i] = v.v\n\t}\n\treturn &SampleSnapshot{\n\t\tcount:  s.count,\n\t\tvalues: values,\n\t}\n}\n\n// StdDev returns the standard deviation of the values in the sample.\nfunc (s *ExpDecaySample) StdDev() float64 {\n\treturn SampleStdDev(s.Values())\n}\n\n// Sum returns the sum of the values in the sample.\nfunc (s *ExpDecaySample) Sum() int64 {\n\treturn SampleSum(s.Values())\n}\n\n// Update samples a new value.\nfunc (s *ExpDecaySample) Update(v int64) {\n\ts.update(time.Now(), v)\n}\n\n// Values returns a copy of the values in the sample.\nfunc (s *ExpDecaySample) Values() []int64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\tvals := s.values.Values()\n\tvalues := make([]int64, len(vals))\n\tfor i, v := range vals {\n\t\tvalues[i] = v.v\n\t}\n\treturn values\n}\n\n// Variance returns the variance of the values in the sample.\nfunc (s *ExpDecaySample) Variance() float64 {\n\treturn SampleVariance(s.Values())\n}\n\n// update samples a new value at a particular timestamp.  This is a method all\n// its own to facilitate testing.\nfunc (s *ExpDecaySample) update(t time.Time, v int64) {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\ts.count++\n\tif s.values.Size() == s.reservoirSize {\n\t\ts.values.Pop()\n\t}\n\ts.values.Push(expDecaySample{\n\t\tk: math.Exp(t.Sub(s.t0).Seconds()*s.alpha) / rand.Float64(),\n\t\tv: v,\n\t})\n\tif t.After(s.t1) {\n\t\tvalues := s.values.Values()\n\t\tt0 := s.t0\n\t\ts.values.Clear()\n\t\ts.t0 = t\n\t\ts.t1 = s.t0.Add(rescaleThreshold)\n\t\tfor _, v := range values {\n\t\t\tv.k = v.k * math.Exp(-s.alpha*s.t0.Sub(t0).Seconds())\n\t\t\ts.values.Push(v)\n\t\t}\n\t}\n}\n\n// NilSample is a no-op Sample.\ntype NilSample struct{}\n\n// Clear is a no-op.\nfunc (NilSample) Clear() {}\n\n// Count is a no-op.\nfunc (NilSample) Count() int64 { return 0 }\n\n// Max is a no-op.\nfunc (NilSample) Max() int64 { return 0 }\n\n// Mean is a no-op.\nfunc (NilSample) Mean() float64 { return 0.0 }\n\n// Min is a no-op.\nfunc (NilSample) Min() int64 { return 0 }\n\n// Percentile is a no-op.\nfunc (NilSample) Percentile(p float64) float64 { return 0.0 }\n\n// Percentiles is a no-op.\nfunc (NilSample) Percentiles(ps []float64) []float64 {\n\treturn make([]float64, len(ps))\n}\n\n// Size is a no-op.\nfunc (NilSample) Size() int { return 0 }\n\n// Sample is a no-op.\nfunc (NilSample) Snapshot() Sample { return NilSample{} }\n\n// StdDev is a no-op.\nfunc (NilSample) StdDev() float64 { return 0.0 }\n\n// Sum is a no-op.\nfunc (NilSample) Sum() int64 { return 0 }\n\n// Update is a no-op.\nfunc (NilSample) Update(v int64) {}\n\n// Values is a no-op.\nfunc (NilSample) Values() []int64 { return []int64{} }\n\n// Variance is a no-op.\nfunc (NilSample) Variance() float64 { return 0.0 }\n\n// SampleMax returns the maximum value of the slice of int64.\nfunc SampleMax(values []int64) int64 {\n\tif 0 == len(values) {\n\t\treturn 0\n\t}\n\tvar max int64 = math.MinInt64\n\tfor _, v := range values {\n\t\tif max < v {\n\t\t\tmax = v\n\t\t}\n\t}\n\treturn max\n}\n\n// SampleMean returns the mean value of the slice of int64.\nfunc SampleMean(values []int64) float64 {\n\tif 0 == len(values) {\n\t\treturn 0.0\n\t}\n\treturn float64(SampleSum(values)) / float64(len(values))\n}\n\n// SampleMin returns the minimum value of the slice of int64.\nfunc SampleMin(values []int64) int64 {\n\tif 0 == len(values) {\n\t\treturn 0\n\t}\n\tvar min int64 = math.MaxInt64\n\tfor _, v := range values {\n\t\tif min > v {\n\t\t\tmin = v\n\t\t}\n\t}\n\treturn min\n}\n\n// SamplePercentiles returns an arbitrary percentile of the slice of int64.\nfunc SamplePercentile(values int64Slice, p float64) float64 {\n\treturn SamplePercentiles(values, []float64{p})[0]\n}\n\n// SamplePercentiles returns a slice of arbitrary percentiles of the slice of\n// int64.\nfunc SamplePercentiles(values int64Slice, ps []float64) []float64 {\n\tscores := make([]float64, len(ps))\n\tsize := len(values)\n\tif size > 0 {\n\t\tsort.Sort(values)\n\t\tfor i, p := range ps {\n\t\t\tpos := p * float64(size+1)\n\t\t\tif pos < 1.0 {\n\t\t\t\tscores[i] = float64(values[0])\n\t\t\t} else if pos >= float64(size) {\n\t\t\t\tscores[i] = float64(values[size-1])\n\t\t\t} else {\n\t\t\t\tlower := float64(values[int(pos)-1])\n\t\t\t\tupper := float64(values[int(pos)])\n\t\t\t\tscores[i] = lower + (pos-math.Floor(pos))*(upper-lower)\n\t\t\t}\n\t\t}\n\t}\n\treturn scores\n}\n\n// SampleSnapshot is a read-only copy of another Sample.\ntype SampleSnapshot struct {\n\tcount  int64\n\tvalues []int64\n}\n\nfunc NewSampleSnapshot(count int64, values []int64) *SampleSnapshot {\n\treturn &SampleSnapshot{\n\t\tcount:  count,\n\t\tvalues: values,\n\t}\n}\n\n// Clear panics.\nfunc (*SampleSnapshot) Clear() {\n\tpanic(\"Clear called on a SampleSnapshot\")\n}\n\n// Count returns the count of inputs at the time the snapshot was taken.\nfunc (s *SampleSnapshot) Count() int64 { return s.count }\n\n// Max returns the maximal value at the time the snapshot was taken.\nfunc (s *SampleSnapshot) Max() int64 { return SampleMax(s.values) }\n\n// Mean returns the mean value at the time the snapshot was taken.\nfunc (s *SampleSnapshot) Mean() float64 { return SampleMean(s.values) }\n\n// Min returns the minimal value at the time the snapshot was taken.\nfunc (s *SampleSnapshot) Min() int64 { return SampleMin(s.values) }\n\n// Percentile returns an arbitrary percentile of values at the time the\n// snapshot was taken.\nfunc (s *SampleSnapshot) Percentile(p float64) float64 {\n\treturn SamplePercentile(s.values, p)\n}\n\n// Percentiles returns a slice of arbitrary percentiles of values at the time\n// the snapshot was taken.\nfunc (s *SampleSnapshot) Percentiles(ps []float64) []float64 {\n\treturn SamplePercentiles(s.values, ps)\n}\n\n// Size returns the size of the sample at the time the snapshot was taken.\nfunc (s *SampleSnapshot) Size() int { return len(s.values) }\n\n// Snapshot returns the snapshot.\nfunc (s *SampleSnapshot) Snapshot() Sample { return s }\n\n// StdDev returns the standard deviation of values at the time the snapshot was\n// taken.\nfunc (s *SampleSnapshot) StdDev() float64 { return SampleStdDev(s.values) }\n\n// Sum returns the sum of values at the time the snapshot was taken.\nfunc (s *SampleSnapshot) Sum() int64 { return SampleSum(s.values) }\n\n// Update panics.\nfunc (*SampleSnapshot) Update(int64) {\n\tpanic(\"Update called on a SampleSnapshot\")\n}\n\n// Values returns a copy of the values in the sample.\nfunc (s *SampleSnapshot) Values() []int64 {\n\tvalues := make([]int64, len(s.values))\n\tcopy(values, s.values)\n\treturn values\n}\n\n// Variance returns the variance of values at the time the snapshot was taken.\nfunc (s *SampleSnapshot) Variance() float64 { return SampleVariance(s.values) }\n\n// SampleStdDev returns the standard deviation of the slice of int64.\nfunc SampleStdDev(values []int64) float64 {\n\treturn math.Sqrt(SampleVariance(values))\n}\n\n// SampleSum returns the sum of the slice of int64.\nfunc SampleSum(values []int64) int64 {\n\tvar sum int64\n\tfor _, v := range values {\n\t\tsum += v\n\t}\n\treturn sum\n}\n\n// SampleVariance returns the variance of the slice of int64.\nfunc SampleVariance(values []int64) float64 {\n\tif 0 == len(values) {\n\t\treturn 0.0\n\t}\n\tm := SampleMean(values)\n\tvar sum float64\n\tfor _, v := range values {\n\t\td := float64(v) - m\n\t\tsum += d * d\n\t}\n\treturn sum / float64(len(values))\n}\n\n// A uniform sample using Vitter's Algorithm R.\n//\n// <http://www.cs.umd.edu/~samir/498/vitter.pdf>\ntype UniformSample struct {\n\tcount         int64\n\tmutex         sync.Mutex\n\treservoirSize int\n\tvalues        []int64\n}\n\n// NewUniformSample constructs a new uniform sample with the given reservoir\n// size.\nfunc NewUniformSample(reservoirSize int) Sample {\n\tif !Enabled {\n\t\treturn NilSample{}\n\t}\n\treturn &UniformSample{\n\t\treservoirSize: reservoirSize,\n\t\tvalues:        make([]int64, 0, reservoirSize),\n\t}\n}\n\n// Clear clears all samples.\nfunc (s *UniformSample) Clear() {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\ts.count = 0\n\ts.values = make([]int64, 0, s.reservoirSize)\n}\n\n// Count returns the number of samples recorded, which may exceed the\n// reservoir size.\nfunc (s *UniformSample) Count() int64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn s.count\n}\n\n// Max returns the maximum value in the sample, which may not be the maximum\n// value ever to be part of the sample.\nfunc (s *UniformSample) Max() int64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SampleMax(s.values)\n}\n\n// Mean returns the mean of the values in the sample.\nfunc (s *UniformSample) Mean() float64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SampleMean(s.values)\n}\n\n// Min returns the minimum value in the sample, which may not be the minimum\n// value ever to be part of the sample.\nfunc (s *UniformSample) Min() int64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SampleMin(s.values)\n}\n\n// Percentile returns an arbitrary percentile of values in the sample.\nfunc (s *UniformSample) Percentile(p float64) float64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SamplePercentile(s.values, p)\n}\n\n// Percentiles returns a slice of arbitrary percentiles of values in the\n// sample.\nfunc (s *UniformSample) Percentiles(ps []float64) []float64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SamplePercentiles(s.values, ps)\n}\n\n// Size returns the size of the sample, which is at most the reservoir size.\nfunc (s *UniformSample) Size() int {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn len(s.values)\n}\n\n// Snapshot returns a read-only copy of the sample.\nfunc (s *UniformSample) Snapshot() Sample {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\tvalues := make([]int64, len(s.values))\n\tcopy(values, s.values)\n\treturn &SampleSnapshot{\n\t\tcount:  s.count,\n\t\tvalues: values,\n\t}\n}\n\n// StdDev returns the standard deviation of the values in the sample.\nfunc (s *UniformSample) StdDev() float64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SampleStdDev(s.values)\n}\n\n// Sum returns the sum of the values in the sample.\nfunc (s *UniformSample) Sum() int64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SampleSum(s.values)\n}\n\n// Update samples a new value.\nfunc (s *UniformSample) Update(v int64) {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\ts.count++\n\tif len(s.values) < s.reservoirSize {\n\t\ts.values = append(s.values, v)\n\t} else {\n\t\tr := rand.Int63n(s.count)\n\t\tif r < int64(len(s.values)) {\n\t\t\ts.values[int(r)] = v\n\t\t}\n\t}\n}\n\n// Values returns a copy of the values in the sample.\nfunc (s *UniformSample) Values() []int64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\tvalues := make([]int64, len(s.values))\n\tcopy(values, s.values)\n\treturn values\n}\n\n// Variance returns the variance of the values in the sample.\nfunc (s *UniformSample) Variance() float64 {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\treturn SampleVariance(s.values)\n}\n\n// expDecaySample represents an individual sample in a heap.\ntype expDecaySample struct {\n\tk float64\n\tv int64\n}\n\nfunc newExpDecaySampleHeap(reservoirSize int) *expDecaySampleHeap {\n\treturn &expDecaySampleHeap{make([]expDecaySample, 0, reservoirSize)}\n}\n\n// expDecaySampleHeap is a min-heap of expDecaySamples.\n// The internal implementation is copied from the standard library's container/heap\ntype expDecaySampleHeap struct {\n\ts []expDecaySample\n}\n\nfunc (h *expDecaySampleHeap) Clear() {\n\th.s = h.s[:0]\n}\n\nfunc (h *expDecaySampleHeap) Push(s expDecaySample) {\n\tn := len(h.s)\n\th.s = h.s[0 : n+1]\n\th.s[n] = s\n\th.up(n)\n}\n\nfunc (h *expDecaySampleHeap) Pop() expDecaySample {\n\tn := len(h.s) - 1\n\th.s[0], h.s[n] = h.s[n], h.s[0]\n\th.down(0, n)\n\n\tn = len(h.s)\n\ts := h.s[n-1]\n\th.s = h.s[0 : n-1]\n\treturn s\n}\n\nfunc (h *expDecaySampleHeap) Size() int {\n\treturn len(h.s)\n}\n\nfunc (h *expDecaySampleHeap) Values() []expDecaySample {\n\treturn h.s\n}\n\nfunc (h *expDecaySampleHeap) up(j int) {\n\tfor {\n\t\ti := (j - 1) / 2 // parent\n\t\tif i == j || !(h.s[j].k < h.s[i].k) {\n\t\t\tbreak\n\t\t}\n\t\th.s[i], h.s[j] = h.s[j], h.s[i]\n\t\tj = i\n\t}\n}\n\nfunc (h *expDecaySampleHeap) down(i, n int) {\n\tfor {\n\t\tj1 := 2*i + 1\n\t\tif j1 >= n || j1 < 0 { // j1 < 0 after int overflow\n\t\t\tbreak\n\t\t}\n\t\tj := j1 // left child\n\t\tif j2 := j1 + 1; j2 < n && !(h.s[j1].k < h.s[j2].k) {\n\t\t\tj = j2 // = 2*i + 2  // right child\n\t\t}\n\t\tif !(h.s[j].k < h.s[i].k) {\n\t\t\tbreak\n\t\t}\n\t\th.s[i], h.s[j] = h.s[j], h.s[i]\n\t\ti = j\n\t}\n}\n\ntype int64Slice []int64\n\nfunc (p int64Slice) Len() int           { return len(p) }\nfunc (p int64Slice) Less(i, j int) bool { return p[i] < p[j] }\nfunc (p int64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }\n"
  },
  {
    "path": "metrics/syslog.go",
    "content": "// +build !windows\n\npackage metrics\n\nimport (\n\t\"fmt\"\n\t\"log/syslog\"\n\t\"time\"\n)\n\n// Output each metric in the given registry to syslog periodically using\n// the given syslogger.\nfunc Syslog(r Registry, d time.Duration, w *syslog.Writer) {\n\tfor range time.Tick(d) {\n\t\tr.Each(func(name string, i interface{}) {\n\t\t\tswitch metric := i.(type) {\n\t\t\tcase Counter:\n\t\t\t\tw.Info(fmt.Sprintf(\"counter %s: count: %d\", name, metric.Count()))\n\t\t\tcase Gauge:\n\t\t\t\tw.Info(fmt.Sprintf(\"gauge %s: value: %d\", name, metric.Value()))\n\t\t\tcase GaugeFloat64:\n\t\t\t\tw.Info(fmt.Sprintf(\"gauge %s: value: %f\", name, metric.Value()))\n\t\t\tcase Healthcheck:\n\t\t\t\tmetric.Check()\n\t\t\t\tw.Info(fmt.Sprintf(\"healthcheck %s: error: %v\", name, metric.Error()))\n\t\t\tcase Histogram:\n\t\t\t\th := metric.Snapshot()\n\t\t\t\tps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\t\tw.Info(fmt.Sprintf(\n\t\t\t\t\t\"histogram %s: count: %d min: %d max: %d mean: %.2f stddev: %.2f median: %.2f 75%%: %.2f 95%%: %.2f 99%%: %.2f 99.9%%: %.2f\",\n\t\t\t\t\tname,\n\t\t\t\t\th.Count(),\n\t\t\t\t\th.Min(),\n\t\t\t\t\th.Max(),\n\t\t\t\t\th.Mean(),\n\t\t\t\t\th.StdDev(),\n\t\t\t\t\tps[0],\n\t\t\t\t\tps[1],\n\t\t\t\t\tps[2],\n\t\t\t\t\tps[3],\n\t\t\t\t\tps[4],\n\t\t\t\t))\n\t\t\tcase Meter:\n\t\t\t\tm := metric.Snapshot()\n\t\t\t\tw.Info(fmt.Sprintf(\n\t\t\t\t\t\"meter %s: count: %d 1-min: %.2f 5-min: %.2f 15-min: %.2f mean: %.2f\",\n\t\t\t\t\tname,\n\t\t\t\t\tm.Count(),\n\t\t\t\t\tm.Rate1(),\n\t\t\t\t\tm.Rate5(),\n\t\t\t\t\tm.Rate15(),\n\t\t\t\t\tm.RateMean(),\n\t\t\t\t))\n\t\t\tcase Timer:\n\t\t\t\tt := metric.Snapshot()\n\t\t\t\tps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\t\tw.Info(fmt.Sprintf(\n\t\t\t\t\t\"timer %s: count: %d min: %d max: %d mean: %.2f stddev: %.2f median: %.2f 75%%: %.2f 95%%: %.2f 99%%: %.2f 99.9%%: %.2f 1-min: %.2f 5-min: %.2f 15-min: %.2f mean-rate: %.2f\",\n\t\t\t\t\tname,\n\t\t\t\t\tt.Count(),\n\t\t\t\t\tt.Min(),\n\t\t\t\t\tt.Max(),\n\t\t\t\t\tt.Mean(),\n\t\t\t\t\tt.StdDev(),\n\t\t\t\t\tps[0],\n\t\t\t\t\tps[1],\n\t\t\t\t\tps[2],\n\t\t\t\t\tps[3],\n\t\t\t\t\tps[4],\n\t\t\t\t\tt.Rate1(),\n\t\t\t\t\tt.Rate5(),\n\t\t\t\t\tt.Rate15(),\n\t\t\t\t\tt.RateMean(),\n\t\t\t\t))\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "metrics/timer.go",
    "content": "package metrics\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\n// Timers capture the duration and rate of events.\ntype Timer interface {\n\tCount() int64\n\tMax() int64\n\tMean() float64\n\tMin() int64\n\tPercentile(float64) float64\n\tPercentiles([]float64) []float64\n\tRate1() float64\n\tRate5() float64\n\tRate15() float64\n\tRateMean() float64\n\tSnapshot() Timer\n\tStdDev() float64\n\tStop()\n\tSum() int64\n\tTime(func())\n\tUpdate(time.Duration)\n\tUpdateSince(time.Time)\n\tVariance() float64\n}\n\n// GetOrRegisterTimer returns an existing Timer or constructs and registers a\n// new StandardTimer.\n// Be sure to unregister the meter from the registry once it is of no use to\n// allow for garbage collection.\nfunc GetOrRegisterTimer(name string, r Registry) Timer {\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\treturn r.GetOrRegister(name, NewTimer).(Timer)\n}\n\n// NewCustomTimer constructs a new StandardTimer from a Histogram and a Meter.\n// Be sure to call Stop() once the timer is of no use to allow for garbage collection.\nfunc NewCustomTimer(h Histogram, m Meter) Timer {\n\tif !Enabled {\n\t\treturn NilTimer{}\n\t}\n\treturn &StandardTimer{\n\t\thistogram: h,\n\t\tmeter:     m,\n\t}\n}\n\n// NewRegisteredTimer constructs and registers a new StandardTimer.\n// Be sure to unregister the meter from the registry once it is of no use to\n// allow for garbage collection.\nfunc NewRegisteredTimer(name string, r Registry) Timer {\n\tc := NewTimer()\n\tif nil == r {\n\t\tr = DefaultRegistry\n\t}\n\tr.Register(name, c)\n\treturn c\n}\n\n// NewTimer constructs a new StandardTimer using an exponentially-decaying\n// sample with the same reservoir size and alpha as UNIX load averages.\n// Be sure to call Stop() once the timer is of no use to allow for garbage collection.\nfunc NewTimer() Timer {\n\tif !Enabled {\n\t\treturn NilTimer{}\n\t}\n\treturn &StandardTimer{\n\t\thistogram: NewHistogram(NewExpDecaySample(1028, 0.015)),\n\t\tmeter:     NewMeter(),\n\t}\n}\n\n// NilTimer is a no-op Timer.\ntype NilTimer struct {\n\th Histogram\n\tm Meter\n}\n\n// Count is a no-op.\nfunc (NilTimer) Count() int64 { return 0 }\n\n// Max is a no-op.\nfunc (NilTimer) Max() int64 { return 0 }\n\n// Mean is a no-op.\nfunc (NilTimer) Mean() float64 { return 0.0 }\n\n// Min is a no-op.\nfunc (NilTimer) Min() int64 { return 0 }\n\n// Percentile is a no-op.\nfunc (NilTimer) Percentile(p float64) float64 { return 0.0 }\n\n// Percentiles is a no-op.\nfunc (NilTimer) Percentiles(ps []float64) []float64 {\n\treturn make([]float64, len(ps))\n}\n\n// Rate1 is a no-op.\nfunc (NilTimer) Rate1() float64 { return 0.0 }\n\n// Rate5 is a no-op.\nfunc (NilTimer) Rate5() float64 { return 0.0 }\n\n// Rate15 is a no-op.\nfunc (NilTimer) Rate15() float64 { return 0.0 }\n\n// RateMean is a no-op.\nfunc (NilTimer) RateMean() float64 { return 0.0 }\n\n// Snapshot is a no-op.\nfunc (NilTimer) Snapshot() Timer { return NilTimer{} }\n\n// StdDev is a no-op.\nfunc (NilTimer) StdDev() float64 { return 0.0 }\n\n// Stop is a no-op.\nfunc (NilTimer) Stop() {}\n\n// Sum is a no-op.\nfunc (NilTimer) Sum() int64 { return 0 }\n\n// Time is a no-op.\nfunc (NilTimer) Time(func()) {}\n\n// Update is a no-op.\nfunc (NilTimer) Update(time.Duration) {}\n\n// UpdateSince is a no-op.\nfunc (NilTimer) UpdateSince(time.Time) {}\n\n// Variance is a no-op.\nfunc (NilTimer) Variance() float64 { return 0.0 }\n\n// StandardTimer is the standard implementation of a Timer and uses a Histogram\n// and Meter.\ntype StandardTimer struct {\n\thistogram Histogram\n\tmeter     Meter\n\tmutex     sync.Mutex\n}\n\n// Count returns the number of events recorded.\nfunc (t *StandardTimer) Count() int64 {\n\treturn t.histogram.Count()\n}\n\n// Max returns the maximum value in the sample.\nfunc (t *StandardTimer) Max() int64 {\n\treturn t.histogram.Max()\n}\n\n// Mean returns the mean of the values in the sample.\nfunc (t *StandardTimer) Mean() float64 {\n\treturn t.histogram.Mean()\n}\n\n// Min returns the minimum value in the sample.\nfunc (t *StandardTimer) Min() int64 {\n\treturn t.histogram.Min()\n}\n\n// Percentile returns an arbitrary percentile of the values in the sample.\nfunc (t *StandardTimer) Percentile(p float64) float64 {\n\treturn t.histogram.Percentile(p)\n}\n\n// Percentiles returns a slice of arbitrary percentiles of the values in the\n// sample.\nfunc (t *StandardTimer) Percentiles(ps []float64) []float64 {\n\treturn t.histogram.Percentiles(ps)\n}\n\n// Rate1 returns the one-minute moving average rate of events per second.\nfunc (t *StandardTimer) Rate1() float64 {\n\treturn t.meter.Rate1()\n}\n\n// Rate5 returns the five-minute moving average rate of events per second.\nfunc (t *StandardTimer) Rate5() float64 {\n\treturn t.meter.Rate5()\n}\n\n// Rate15 returns the fifteen-minute moving average rate of events per second.\nfunc (t *StandardTimer) Rate15() float64 {\n\treturn t.meter.Rate15()\n}\n\n// RateMean returns the meter's mean rate of events per second.\nfunc (t *StandardTimer) RateMean() float64 {\n\treturn t.meter.RateMean()\n}\n\n// Snapshot returns a read-only copy of the timer.\nfunc (t *StandardTimer) Snapshot() Timer {\n\tt.mutex.Lock()\n\tdefer t.mutex.Unlock()\n\treturn &TimerSnapshot{\n\t\thistogram: t.histogram.Snapshot().(*HistogramSnapshot),\n\t\tmeter:     t.meter.Snapshot().(*MeterSnapshot),\n\t}\n}\n\n// StdDev returns the standard deviation of the values in the sample.\nfunc (t *StandardTimer) StdDev() float64 {\n\treturn t.histogram.StdDev()\n}\n\n// Stop stops the meter.\nfunc (t *StandardTimer) Stop() {\n\tt.meter.Stop()\n}\n\n// Sum returns the sum in the sample.\nfunc (t *StandardTimer) Sum() int64 {\n\treturn t.histogram.Sum()\n}\n\n// Record the duration of the execution of the given function.\nfunc (t *StandardTimer) Time(f func()) {\n\tts := time.Now()\n\tf()\n\tt.Update(time.Since(ts))\n}\n\n// Record the duration of an event.\nfunc (t *StandardTimer) Update(d time.Duration) {\n\tt.mutex.Lock()\n\tdefer t.mutex.Unlock()\n\tt.histogram.Update(int64(d))\n\tt.meter.Mark(1)\n}\n\n// Record the duration of an event that started at a time and ends now.\nfunc (t *StandardTimer) UpdateSince(ts time.Time) {\n\tt.mutex.Lock()\n\tdefer t.mutex.Unlock()\n\tt.histogram.Update(int64(time.Since(ts)))\n\tt.meter.Mark(1)\n}\n\n// Variance returns the variance of the values in the sample.\nfunc (t *StandardTimer) Variance() float64 {\n\treturn t.histogram.Variance()\n}\n\n// TimerSnapshot is a read-only copy of another Timer.\ntype TimerSnapshot struct {\n\thistogram *HistogramSnapshot\n\tmeter     *MeterSnapshot\n}\n\n// Count returns the number of events recorded at the time the snapshot was\n// taken.\nfunc (t *TimerSnapshot) Count() int64 { return t.histogram.Count() }\n\n// Max returns the maximum value at the time the snapshot was taken.\nfunc (t *TimerSnapshot) Max() int64 { return t.histogram.Max() }\n\n// Mean returns the mean value at the time the snapshot was taken.\nfunc (t *TimerSnapshot) Mean() float64 { return t.histogram.Mean() }\n\n// Min returns the minimum value at the time the snapshot was taken.\nfunc (t *TimerSnapshot) Min() int64 { return t.histogram.Min() }\n\n// Percentile returns an arbitrary percentile of sampled values at the time the\n// snapshot was taken.\nfunc (t *TimerSnapshot) Percentile(p float64) float64 {\n\treturn t.histogram.Percentile(p)\n}\n\n// Percentiles returns a slice of arbitrary percentiles of sampled values at\n// the time the snapshot was taken.\nfunc (t *TimerSnapshot) Percentiles(ps []float64) []float64 {\n\treturn t.histogram.Percentiles(ps)\n}\n\n// Rate1 returns the one-minute moving average rate of events per second at the\n// time the snapshot was taken.\nfunc (t *TimerSnapshot) Rate1() float64 { return t.meter.Rate1() }\n\n// Rate5 returns the five-minute moving average rate of events per second at\n// the time the snapshot was taken.\nfunc (t *TimerSnapshot) Rate5() float64 { return t.meter.Rate5() }\n\n// Rate15 returns the fifteen-minute moving average rate of events per second\n// at the time the snapshot was taken.\nfunc (t *TimerSnapshot) Rate15() float64 { return t.meter.Rate15() }\n\n// RateMean returns the meter's mean rate of events per second at the time the\n// snapshot was taken.\nfunc (t *TimerSnapshot) RateMean() float64 { return t.meter.RateMean() }\n\n// Snapshot returns the snapshot.\nfunc (t *TimerSnapshot) Snapshot() Timer { return t }\n\n// StdDev returns the standard deviation of the values at the time the snapshot\n// was taken.\nfunc (t *TimerSnapshot) StdDev() float64 { return t.histogram.StdDev() }\n\n// Stop is a no-op.\nfunc (t *TimerSnapshot) Stop() {}\n\n// Sum returns the sum at the time the snapshot was taken.\nfunc (t *TimerSnapshot) Sum() int64 { return t.histogram.Sum() }\n\n// Time panics.\nfunc (*TimerSnapshot) Time(func()) {\n\tpanic(\"Time called on a TimerSnapshot\")\n}\n\n// Update panics.\nfunc (*TimerSnapshot) Update(time.Duration) {\n\tpanic(\"Update called on a TimerSnapshot\")\n}\n\n// UpdateSince panics.\nfunc (*TimerSnapshot) UpdateSince(time.Time) {\n\tpanic(\"UpdateSince called on a TimerSnapshot\")\n}\n\n// Variance returns the variance of the values at the time the snapshot was\n// taken.\nfunc (t *TimerSnapshot) Variance() float64 { return t.histogram.Variance() }\n"
  },
  {
    "path": "metrics/validate.sh",
    "content": "#!/bin/bash\n\nset -e\n\n# check there are no formatting issues\nGOFMT_LINES=`gofmt -l . | wc -l | xargs`\ntest $GOFMT_LINES -eq 0 || echo \"gofmt needs to be run, ${GOFMT_LINES} files have issues\"\n\n# run the tests for the root package\ngo test -race .\n"
  },
  {
    "path": "metrics/writer.go",
    "content": "package metrics\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"sort\"\n\t\"time\"\n)\n\n// Write sorts writes each metric in the given registry periodically to the\n// given io.Writer.\nfunc Write(r Registry, d time.Duration, w io.Writer) {\n\tfor range time.Tick(d) {\n\t\tWriteOnce(r, w)\n\t}\n}\n\n// WriteOnce sorts and writes metrics in the given registry to the given\n// io.Writer.\nfunc WriteOnce(r Registry, w io.Writer) {\n\tvar namedMetrics namedMetricSlice\n\tr.Each(func(name string, i interface{}) {\n\t\tnamedMetrics = append(namedMetrics, namedMetric{name, i})\n\t})\n\n\tsort.Sort(namedMetrics)\n\tfor _, namedMetric := range namedMetrics {\n\t\tswitch metric := namedMetric.m.(type) {\n\t\tcase Counter:\n\t\t\tfmt.Fprintf(w, \"counter %s\\n\", namedMetric.name)\n\t\t\tfmt.Fprintf(w, \"  count:       %9d\\n\", metric.Count())\n\t\tcase Gauge:\n\t\t\tfmt.Fprintf(w, \"gauge %s\\n\", namedMetric.name)\n\t\t\tfmt.Fprintf(w, \"  value:       %9d\\n\", metric.Value())\n\t\tcase GaugeFloat64:\n\t\t\tfmt.Fprintf(w, \"gauge %s\\n\", namedMetric.name)\n\t\t\tfmt.Fprintf(w, \"  value:       %f\\n\", metric.Value())\n\t\tcase Healthcheck:\n\t\t\tmetric.Check()\n\t\t\tfmt.Fprintf(w, \"healthcheck %s\\n\", namedMetric.name)\n\t\t\tfmt.Fprintf(w, \"  error:       %v\\n\", metric.Error())\n\t\tcase Histogram:\n\t\t\th := metric.Snapshot()\n\t\t\tps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\tfmt.Fprintf(w, \"histogram %s\\n\", namedMetric.name)\n\t\t\tfmt.Fprintf(w, \"  count:       %9d\\n\", h.Count())\n\t\t\tfmt.Fprintf(w, \"  min:         %9d\\n\", h.Min())\n\t\t\tfmt.Fprintf(w, \"  max:         %9d\\n\", h.Max())\n\t\t\tfmt.Fprintf(w, \"  mean:        %12.2f\\n\", h.Mean())\n\t\t\tfmt.Fprintf(w, \"  stddev:      %12.2f\\n\", h.StdDev())\n\t\t\tfmt.Fprintf(w, \"  median:      %12.2f\\n\", ps[0])\n\t\t\tfmt.Fprintf(w, \"  75%%:         %12.2f\\n\", ps[1])\n\t\t\tfmt.Fprintf(w, \"  95%%:         %12.2f\\n\", ps[2])\n\t\t\tfmt.Fprintf(w, \"  99%%:         %12.2f\\n\", ps[3])\n\t\t\tfmt.Fprintf(w, \"  99.9%%:       %12.2f\\n\", ps[4])\n\t\tcase Meter:\n\t\t\tm := metric.Snapshot()\n\t\t\tfmt.Fprintf(w, \"meter %s\\n\", namedMetric.name)\n\t\t\tfmt.Fprintf(w, \"  count:       %9d\\n\", m.Count())\n\t\t\tfmt.Fprintf(w, \"  1-min rate:  %12.2f\\n\", m.Rate1())\n\t\t\tfmt.Fprintf(w, \"  5-min rate:  %12.2f\\n\", m.Rate5())\n\t\t\tfmt.Fprintf(w, \"  15-min rate: %12.2f\\n\", m.Rate15())\n\t\t\tfmt.Fprintf(w, \"  mean rate:   %12.2f\\n\", m.RateMean())\n\t\tcase Timer:\n\t\t\tt := metric.Snapshot()\n\t\t\tps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})\n\t\t\tfmt.Fprintf(w, \"timer %s\\n\", namedMetric.name)\n\t\t\tfmt.Fprintf(w, \"  count:       %9d\\n\", t.Count())\n\t\t\tfmt.Fprintf(w, \"  min:         %9d\\n\", t.Min())\n\t\t\tfmt.Fprintf(w, \"  max:         %9d\\n\", t.Max())\n\t\t\tfmt.Fprintf(w, \"  mean:        %12.2f\\n\", t.Mean())\n\t\t\tfmt.Fprintf(w, \"  stddev:      %12.2f\\n\", t.StdDev())\n\t\t\tfmt.Fprintf(w, \"  median:      %12.2f\\n\", ps[0])\n\t\t\tfmt.Fprintf(w, \"  75%%:         %12.2f\\n\", ps[1])\n\t\t\tfmt.Fprintf(w, \"  95%%:         %12.2f\\n\", ps[2])\n\t\t\tfmt.Fprintf(w, \"  99%%:         %12.2f\\n\", ps[3])\n\t\t\tfmt.Fprintf(w, \"  99.9%%:       %12.2f\\n\", ps[4])\n\t\t\tfmt.Fprintf(w, \"  1-min rate:  %12.2f\\n\", t.Rate1())\n\t\t\tfmt.Fprintf(w, \"  5-min rate:  %12.2f\\n\", t.Rate5())\n\t\t\tfmt.Fprintf(w, \"  15-min rate: %12.2f\\n\", t.Rate15())\n\t\t\tfmt.Fprintf(w, \"  mean rate:   %12.2f\\n\", t.RateMean())\n\t\t}\n\t}\n}\n\ntype namedMetric struct {\n\tname string\n\tm    interface{}\n}\n\n// namedMetricSlice is a slice of namedMetrics that implements sort.Interface.\ntype namedMetricSlice []namedMetric\n\nfunc (nms namedMetricSlice) Len() int { return len(nms) }\n\nfunc (nms namedMetricSlice) Swap(i, j int) { nms[i], nms[j] = nms[j], nms[i] }\n\nfunc (nms namedMetricSlice) Less(i, j int) bool {\n\treturn nms[i].name < nms[j].name\n}\n"
  },
  {
    "path": "miner/agent.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage miner\n\nimport (\n\t\"sync\"\n\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\ntype CpuAgent struct {\n\tmu sync.Mutex\n\n\tworkCh        chan *Work\n\tstop          chan struct{}\n\tquitCurrentOp chan struct{}\n\treturnCh      chan<- *Result\n\n\tchain  consensus.ChainReader\n\tengine consensus.Engine\n\n\tisMining int32 // isMining indicates whether the agent is currently mining\n}\n\nfunc NewCpuAgent(chain consensus.ChainReader, engine consensus.Engine) *CpuAgent {\n\tminer := &CpuAgent{\n\t\tchain:  chain,\n\t\tengine: engine,\n\t\tstop:   make(chan struct{}, 1),\n\t\tworkCh: make(chan *Work, 1),\n\t}\n\treturn miner\n\n}\n\nfunc (self *CpuAgent) Work() chan<- *Work            { return self.workCh }\nfunc (self *CpuAgent) SetReturnCh(ch chan<- *Result) { self.returnCh = ch }\n\nfunc (self *CpuAgent) Stop() {\n\tif !atomic.CompareAndSwapInt32(&self.isMining, 1, 0) {\n\t\treturn // agent already stopped\n\t}\n\tself.stop <- struct{}{}\ndone:\n\t// Empty work channel\n\tfor {\n\t\tselect {\n\t\tcase <-self.workCh:\n\t\tdefault:\n\t\t\tbreak done\n\t\t}\n\t}\n}\n\nfunc (self *CpuAgent) Start() {\n\tif !atomic.CompareAndSwapInt32(&self.isMining, 0, 1) {\n\t\treturn // agent already started\n\t}\n\tgo self.update()\n}\n\nfunc (self *CpuAgent) update() {\nout:\n\tfor {\n\t\tselect {\n\t\tcase work := <-self.workCh:\n\t\t\tself.mu.Lock()\n\t\t\tif self.quitCurrentOp != nil {\n\t\t\t\tclose(self.quitCurrentOp)\n\t\t\t}\n\t\t\tself.quitCurrentOp = make(chan struct{})\n\t\t\tgo self.mine(work, self.quitCurrentOp)\n\t\t\tself.mu.Unlock()\n\t\tcase <-self.stop:\n\t\t\tself.mu.Lock()\n\t\t\tif self.quitCurrentOp != nil {\n\t\t\t\tclose(self.quitCurrentOp)\n\t\t\t\tself.quitCurrentOp = nil\n\t\t\t}\n\t\t\tself.mu.Unlock()\n\t\t\tbreak out\n\t\t}\n\t}\n}\n\nfunc (self *CpuAgent) mine(work *Work, stop <-chan struct{}) {\n\tif result, err := self.engine.Seal(self.chain, work.Block, stop); result != nil {\n\t\tlog.Info(\"Successfully sealed new block\", \"number\", result.Number(), \"hash\", result.Header().HashPos())\n\t\tself.returnCh <- &Result{work, result}\n\t} else {\n\t\tif err != nil {\n\t\t\tlog.Warn(\"Block sealing failed\", \"err\", err)\n\t\t}\n\t\tself.returnCh <- nil\n\t}\n}\n\nfunc (self *CpuAgent) GetHashRate() int64 {\n\tif pow, ok := self.engine.(consensus.PoW); ok {\n\t\treturn int64(pow.Hashrate())\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "miner/lotter.go",
    "content": "package miner\n\nimport (\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n)\n\ntype Lotter struct {\n\tworker *worker\n\tstate  *state.StateDB\n\tblock  *types.Block\n\tstake  *stake.StakeState\n\n\tlottery            types.Lottery\n\tcurrentHeaderVotes []types.HeaderVote\n\tparentHeaderVotes  []types.HeaderVote\n}\n\nfunc newLotter(worker *worker, block *types.Block, db *state.StateDB) (ret Lotter) {\n\tret.worker = worker\n\tret.state = db.Copy()\n\tret.block = block\n\tret.stake = stake.NewStakeState(ret.state)\n\treturn\n}\n\nfunc selKey(idx uint32, sid []byte) string {\n\treturn common.BytesToString(utils.EncodeNumber32(idx)) + string(sid)\n}\n\ntype shareFilter struct {\n\tvote  *types.Vote\n\tshare *stake.Share\n}\n\ntype votesFilter struct {\n\tstake       *stake.StakeState\n\tfilters     map[string]*shareFilter\n\tblock       *types.Block\n\tparentBlock *types.Block\n\tidxs        []uint32\n\tshares      []*stake.Share\n}\n\nfunc NewVotesFilter(state *stake.StakeState, idxs []uint32, shares []*stake.Share, block *types.Block, parentBlock *types.Block) (ret votesFilter) {\n\tret.stake = state\n\tret.filters = make(map[string]*shareFilter)\n\tfor i, idx := range idxs {\n\t\tshare := shares[i]\n\t\tret.filters[selKey(idx, share.Id())] = &shareFilter{nil, share}\n\t}\n\tret.block = block\n\tret.parentBlock = parentBlock\n\tret.idxs = idxs\n\tret.shares = shares\n\treturn\n}\n\nfunc (self *votesFilter) result() (ret []types.Vote) {\n\tfor _, v := range self.filters {\n\t\tif v.vote != nil {\n\t\t\tret = append(ret, *v.vote)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *votesFilter) RunFilter(votes voteSet) (dels []types.Vote) {\n\tvoteNumMap := map[c_type.Uint512]bool{}\n\tfor _, sets := range votes {\n\t\tfor _, vote := range sets {\n\t\t\tif _, ok := voteNumMap[vote.Sign]; ok {\n\t\t\t\tcontinue\n\t\t\t} else {\n\t\t\t\tif vote.PosHash == self.block.HashPos() {\n\t\t\t\t\tk := selKey(vote.Idx, vote.ShareId[:])\n\t\t\t\t\tif s, ok := self.filters[k]; ok {\n\t\t\t\t\t\tif s.vote == nil {\n\t\t\t\t\t\t\tif self.verify(&vote, s.share) {\n\t\t\t\t\t\t\t\tvoteNumMap[vote.Sign] = true\n\t\t\t\t\t\t\t\tcopy_vote := vote\n\t\t\t\t\t\t\t\tself.filters[k].vote = &copy_vote\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\tdels = append(dels, vote)\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *votesFilter) verify(vote *types.Vote, share *stake.Share) bool {\n\tvar votePkr *c_type.PKr\n\tif vote.IsPool {\n\t\tif share.PoolId != nil {\n\t\t\tpool := self.stake.GetStakePool(*share.PoolId)\n\t\t\tif pool != nil && pool.CanBeVote() {\n\t\t\t\tvotePkr = &pool.VotePKr\n\t\t\t}\n\t\t}\n\t} else {\n\t\tvotePkr = &share.VotePKr\n\t}\n\tif votePkr != nil {\n\t\tparentPosHash := self.parentBlock.HashPos()\n\t\tstakHash := types.StakeHash(&vote.PosHash, &parentPosHash, vote.IsPool)\n\t\tif superzk.VerifyPKr_ByHeight(self.block.NumberU64(), stakHash.HashToUint256(), &vote.Sign, votePkr) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (self *Lotter) wait() bool {\n\tneedWait := self.stake.NeedTwoVote(self.block.NumberU64())\n\tif !needWait {\n\t\tlog.Info(\"not need pos\")\n\t}\n\n\tparentBlock := self.worker.chain.GetBlockByHash(self.block.ParentHash())\n\n\tstartTime := time.Now()\n\n\tidx, shares, err := self.stake.SeleteShare(self.block.HashPos(), self.block.NumberU64())\n\tif err != nil {\n\t\tlog.Error(\"Lotter wait \", \"error\", err)\n\t\treturn false\n\t}\n\tfilter := NewVotesFilter(self.stake, idx, shares, self.block, parentBlock)\n\tcount := 0\n\tfor {\n\t\tcurrentHeader := self.worker.chain.CurrentHeader()\n\t\tif currentHeader.Hash() != self.block.ParentHash() {\n\t\t\treturn false\n\t\t}\n\n\t\tif time.Since(startTime) > 5*time.Minute {\n\t\t\treturn false\n\t\t}\n\n\t\tif count == 0 {\n\t\t\ttime.Sleep(1 * time.Second)\n\t\t} else {\n\t\t\ttime.Sleep(100 * time.Millisecond)\n\t\t}\n\t\tcount++\n\n\t\tkey := voteKey{self.block.NumberU64(), self.block.HashPos()}\n\t\tvotes := self.worker.pendingVote.getMyPending(key)\n\n\t\tdels := filter.RunFilter(votes)\n\t\tself.worker.pendingVote.deleteVotes(key, dels)\n\n\t\tsels := filter.result()\n\t\tif len(sels) > 2 || !needWait {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tparentVoteKey := voteKey{parentBlock.NumberU64(), parentBlock.HashPos()}\n\tparentVoteSet := self.worker.pendingVote.getMyPending(parentVoteKey)\n\n\tpidx, pshares := stake.SeleteBlockShare(self.worker.chain.GetDB(), parentBlock.Hash())\n\tppBlock := self.worker.chain.GetBlockByHash(parentBlock.ParentHash())\n\tparentfilter := NewVotesFilter(self.stake, pidx, pshares, parentBlock, ppBlock)\n\tparentfilter.RunFilter(parentVoteSet)\n\n\tvoteNumMap := map[c_type.Uint512]bool{}\n\tfor _, vote := range filter.result() {\n\t\t//log.Info(\"pos currentVotes\", \"posHash\", vote.PosHash, \"block\", vote.ParentNum+1, \"share\", vote.ShareId, \"idx\", vote.Idx)\n\t\tif _, ok := voteNumMap[vote.Sign]; ok {\n\t\t\tcontinue\n\t\t} else {\n\t\t\tvoteNumMap[vote.Sign] = true\n\t\t\tself.currentHeaderVotes = append(self.currentHeaderVotes, types.HeaderVote{vote.ShareId, vote.IsPool, vote.Sign})\n\t\t\tif len(self.currentHeaderVotes) == 3 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tparentVotes := parentfilter.result()\n\tif len(parentVotes) > 0 {\n\t\t//log.Info(\"parentVotes\", \"block\", self.block.NumberU64(), \"voteIds\", pidx)\n\t\tvoteNumMap := map[common.Hash]int{}\n\t\tfor _, share := range pshares {\n\t\t\tvoteNumMap[common.BytesToHash(share.Id())] += 1\n\t\t}\n\n\t\tvoteMap := map[c_type.Uint512]bool{}\n\t\tfor _, vote := range parentBlock.Header().CurrentVotes {\n\t\t\tvoteMap[vote.Sign] = true\n\t\t\tvoteNumMap[vote.Id] -= 1\n\t\t}\n\t\tfor _, vote := range parentVotes {\n\t\t\tif _, ok := voteMap[vote.Sign]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif voteNumMap[vote.ShareId] == 0 {\n\t\t\t\tcontinue\n\t\t\t} else {\n\t\t\t\t//log.Info(\"pos parentVotes\", \"posHash\", vote.PosHash, \"block\", vote.ParentNum+1, \"share\", vote.ShareId, \"idx\", vote.Idx)\n\t\t\t\tself.parentHeaderVotes = append(self.parentHeaderVotes, types.HeaderVote{vote.ShareId, vote.IsPool, vote.Sign})\n\t\t\t\tvoteMap[vote.Sign] = true\n\t\t\t\tvoteNumMap[vote.ShareId] -= 1\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "miner/miner.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package miner implements Ethereum block creation and mining.\npackage miner\n\nimport (\n\t\"fmt\"\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Backend wraps all methods required for mining.\ntype Backend interface {\n\tAccountManager() *accounts.Manager\n\tBlockChain() *core.BlockChain\n\tTxPool() *core.TxPool\n\tChainDb() serodb.Database\n}\n\ntype voter interface {\n\tSubscribeWorkerVoteEvent(ch chan<- core.NewVoteEvent) event.Subscription\n\n\tSendLotteryEvent(lottery *types.Lottery)\n\n\tSendVoteEvent(vote *types.Vote)\n\n\tAddLottery(lottery *types.Lottery)\n}\n\n// Miner creates blocks and searches for proof-of-work values.\ntype Miner struct {\n\tmux *event.TypeMux\n\n\tworker *worker\n\n\tcoinbase accounts.Account\n\tmining   int32\n\tsero     Backend\n\tengine   consensus.Engine\n\n\tcanStart    int32 // can start indicates whether we can start the mining operation\n\tshouldStart int32 // should start indicates whether we should start after sync\n\n}\n\nfunc New(sero Backend, config *params.ChainConfig, mux *event.TypeMux, voter voter, engine consensus.Engine) *Miner {\n\tminer := &Miner{\n\t\tsero:     sero,\n\t\tmux:      mux,\n\t\tengine:   engine,\n\t\tworker:   newWorker(config, engine, accounts.Account{}, voter, sero, mux),\n\t\tcanStart: 1,\n\t}\n\tminer.Register(NewCpuAgent(sero.BlockChain(), engine))\n\tgo miner.update()\n\treturn miner\n}\n\n// update keeps track of the downloader events. Please be aware that this is a one shot type of update loop.\n// It's entered once and as soon as `Done` or `Failed` has been broadcasted the events are unregistered and\n// the loop is exited. This to prevent a major security vuln where external parties can DOS you with blocks\n// and halt your mining operation for as long as the DOS continues.\nfunc (self *Miner) update() {\n\tevents := self.mux.Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{})\nout:\n\tfor ev := range events.Chan() {\n\t\tswitch ev.Data.(type) {\n\t\tcase downloader.StartEvent:\n\t\t\tatomic.StoreInt32(&self.canStart, 0)\n\t\t\tif self.Mining() {\n\t\t\t\tself.Stop()\n\t\t\t\tatomic.StoreInt32(&self.shouldStart, 1)\n\t\t\t\tlog.Info(\"Mining aborted due to sync\")\n\t\t\t}\n\t\tcase downloader.DoneEvent, downloader.FailedEvent:\n\t\t\tshouldStart := atomic.LoadInt32(&self.shouldStart) == 1\n\n\t\t\tatomic.StoreInt32(&self.canStart, 1)\n\t\t\tatomic.StoreInt32(&self.shouldStart, 0)\n\t\t\tif shouldStart {\n\t\t\t\tself.Start(self.coinbase)\n\t\t\t}\n\t\t\t// unsubscribe. we're only interested in this event once\n\t\t\tevents.Unsubscribe()\n\t\t\t// stop immediately and ignore all further pending events\n\t\t\tbreak out\n\t\t}\n\t}\n}\n\nfunc (self *Miner) Start(coinbase accounts.Account) {\n\tatomic.StoreInt32(&self.shouldStart, 1)\n\tself.SetSerobase(coinbase)\n\n\tif atomic.LoadInt32(&self.canStart) == 0 {\n\t\tlog.Info(\"Network syncing, will start miner afterwards\")\n\t\treturn\n\t}\n\tatomic.StoreInt32(&self.mining, 1)\n\tself.sero.TxPool().SetMining(1)\n\tlog.Info(\"Starting mining operation\")\n\tself.worker.start()\n\tself.worker.commitNewWork()\n}\n\nfunc (self *Miner) Stop() {\n\tself.worker.stop()\n\tatomic.StoreInt32(&self.mining, 0)\n\tself.sero.TxPool().SetMining(0)\n\tatomic.StoreInt32(&self.shouldStart, 0)\n}\nfunc (self *Miner) Close() {\n\tself.worker.Close()\n}\n\nfunc (self *Miner) Register(agent Agent) {\n\tif self.Mining() {\n\t\tagent.Start()\n\t}\n\tself.worker.register(agent)\n}\n\nfunc (self *Miner) Unregister(agent Agent) {\n\tself.worker.unregister(agent)\n}\n\nfunc (self *Miner) Mining() bool {\n\treturn atomic.LoadInt32(&self.mining) > 0\n}\n\nfunc (self *Miner) CanStart() bool {\n\treturn atomic.LoadInt32(&self.canStart) > 0\n}\n\nfunc (self *Miner) SetCanStart(canstart int32) {\n\tatomic.StoreInt32(&self.canStart, canstart)\n}\n\nfunc (self *Miner) HashRate() (tot int64) {\n\tif pow, ok := self.engine.(consensus.PoW); ok {\n\t\ttot += int64(pow.Hashrate())\n\t}\n\t// do we care this might race? is it worth we're rewriting some\n\t// aspects of the worker/locking up agents so we can get an accurate\n\t// hashrate?\n\tfor agent := range self.worker.agents {\n\t\tif _, ok := agent.(*CpuAgent); !ok {\n\t\t\ttot += agent.GetHashRate()\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *Miner) StartHashRate() {\n\tif pow, ok := self.engine.(consensus.PoW); ok {\n\t\tpow.StartHashrate()\n\t}\n}\n\nfunc (self *Miner) StropHashRate() {\n\tif pow, ok := self.engine.(consensus.PoW); ok {\n\t\tpow.StopHashrate()\n\t}\n}\n\nfunc (self *Miner) SetExtra(extra []byte) error {\n\tif uint64(len(extra)) > params.MaximumExtraDataSize {\n\t\treturn fmt.Errorf(\"Extra exceeds max length. %d > %v\", len(extra), params.MaximumExtraDataSize)\n\t}\n\tself.worker.setExtra(extra)\n\treturn nil\n}\n\n// Pending returns the currently pending block and associated state.\nfunc (self *Miner) Pending() (*types.Block, *state.StateDB) {\n\treturn self.worker.pending()\n}\n\n// PendingBlock returns the currently pending block.\n//\n// Note, to access both the pending block and the pending state\n// simultaneously, please use Pending(), as the pending state can\n// change between multiple method calls\nfunc (self *Miner) PendingBlock() *types.Block {\n\treturn self.worker.pendingBlock()\n}\n\nfunc (self *Miner) SetSerobase(account accounts.Account) {\n\tself.coinbase = account\n\tself.worker.setSerobase(account)\n}\n"
  },
  {
    "path": "miner/pending_vote.go",
    "content": "package miner\n\nimport (\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/log\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\ntype voteKey struct {\n\theaderNumber uint64\n\tposHash      common.Hash\n}\n\ntype shareSet map[c_type.Uint512]types.Vote\n\ntype voteSet map[common.Hash]shareSet\n\nfunc (self voteSet) copy() (ret voteSet) {\n\tret = make(voteSet)\n\tfor k0, v0 := range self {\n\t\tss := make(shareSet)\n\t\tfor k1, v1 := range v0 {\n\t\t\tss[k1] = v1\n\t\t}\n\t\tret[k0] = ss\n\t}\n\treturn\n}\n\ntype pendingVote struct {\n\tpendingVoteMu sync.RWMutex\n\tpendingVote   map[voteKey]voteSet\n}\n\nfunc newPendingVote() (ret pendingVote) {\n\tret.pendingVote = make(map[voteKey]voteSet)\n\treturn ret\n}\n\nfunc (self *pendingVote) add(vote *types.Vote) {\n\tself.pendingVoteMu.Lock()\n\tdefer self.pendingVoteMu.Unlock()\n\n\tkey := voteKey{vote.ParentNum + 1, vote.PosHash}\n\tlog.Trace(\"pendingVote add vote\", \"poshash\", vote.PosHash, \"block\", vote.ParentNum+1, \"idx\", vote.Idx, \"sign\", common.BytesToHash(vote.Sign[:]))\n\tvar vs voteSet\n\tif _, ok := self.pendingVote[key]; !ok {\n\t\tvs = make(voteSet)\n\t\tself.pendingVote[key] = vs\n\t} else {\n\t\tvs = self.pendingVote[key]\n\t}\n\n\tvar ss shareSet\n\tif _, ok := vs[vote.ShareId]; !ok {\n\t\tss = make(shareSet)\n\t\tvs[vote.ShareId] = ss\n\t} else {\n\t\tss = vs[vote.ShareId]\n\t}\n\tss[vote.Sign] = *vote\n}\n\nfunc (self *pendingVote) deleteVotes(key voteKey, votes []types.Vote) {\n\tself.pendingVoteMu.Lock()\n\tdefer self.pendingVoteMu.Unlock()\n\n\tif vs, ok := self.pendingVote[key]; ok {\n\t\tfor _, vote := range votes {\n\t\t\tif _, ok := vs[vote.ShareId]; ok {\n\t\t\t\tdelete(vs[vote.ShareId], vote.Sign)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (self *pendingVote) deleteBefore(num uint64) {\n\tself.pendingVoteMu.Lock()\n\tdefer self.pendingVoteMu.Unlock()\n\tdels := []voteKey{}\n\tfor k := range self.pendingVote {\n\t\tif k.headerNumber <= num {\n\t\t\tdels = append(dels, k)\n\t\t}\n\t}\n\tfor _, del := range dels {\n\t\tdelete(self.pendingVote, del)\n\t}\n}\n\nfunc (self *pendingVote) getMyPending(key voteKey) (ret voteSet) {\n\tself.pendingVoteMu.Lock()\n\tdefer self.pendingVoteMu.Unlock()\n\n\tif votes, ok := self.pendingVote[key]; ok {\n\t\tret = votes.copy()\n\t}\n\treturn\n}\n"
  },
  {
    "path": "miner/remote_agent.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage miner\n\nimport (\n\t\"errors\"\n\t\"math/big\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\ntype hashrate struct {\n\tping time.Time\n\trate uint64\n}\n\ntype RemoteAgent struct {\n\tmu sync.Mutex\n\n\tquitCh   chan struct{}\n\tworkCh   chan *Work\n\treturnCh chan<- *Result\n\n\tchain       consensus.ChainReader\n\tengine      consensus.Engine\n\tcurrentWork *Work\n\twork        map[common.Hash]*Work\n\n\thashrateMu sync.RWMutex\n\thashrate   map[common.Hash]hashrate\n\n\trunning int32 // running indicates whether the agent is active. Call atomically\n}\n\nfunc NewRemoteAgent(chain consensus.ChainReader, engine consensus.Engine) *RemoteAgent {\n\treturn &RemoteAgent{\n\t\tchain:    chain,\n\t\tengine:   engine,\n\t\twork:     make(map[common.Hash]*Work),\n\t\thashrate: make(map[common.Hash]hashrate),\n\t}\n}\n\nfunc (a *RemoteAgent) SubmitHashrate(id common.Hash, rate uint64) {\n\ta.hashrateMu.Lock()\n\tdefer a.hashrateMu.Unlock()\n\n\ta.hashrate[id] = hashrate{time.Now(), rate}\n}\n\nfunc (a *RemoteAgent) Work() chan<- *Work {\n\treturn a.workCh\n}\n\nfunc (a *RemoteAgent) SetReturnCh(returnCh chan<- *Result) {\n\ta.returnCh = returnCh\n}\n\nfunc (a *RemoteAgent) Start() {\n\tif !atomic.CompareAndSwapInt32(&a.running, 0, 1) {\n\t\treturn\n\t}\n\ta.quitCh = make(chan struct{})\n\ta.workCh = make(chan *Work, 1)\n\tgo a.loop(a.workCh, a.quitCh)\n}\n\nfunc (a *RemoteAgent) Stop() {\n\tif !atomic.CompareAndSwapInt32(&a.running, 1, 0) {\n\t\treturn\n\t}\n\tclose(a.quitCh)\n\tclose(a.workCh)\n}\n\n// GetHashRate returns the accumulated hashrate of all identifier combined\nfunc (a *RemoteAgent) GetHashRate() (tot int64) {\n\ta.hashrateMu.RLock()\n\tdefer a.hashrateMu.RUnlock()\n\n\t// this could overflow\n\tfor _, hashrate := range a.hashrate {\n\t\ttot += int64(hashrate.rate)\n\t}\n\treturn\n}\n\nfunc (a *RemoteAgent) GetWork() ([4]string, error) {\n\ta.mu.Lock()\n\tdefer a.mu.Unlock()\n\n\tvar res [4]string\n\n\tif a.currentWork != nil {\n\t\tblock := a.currentWork.Block\n\n\t\tres[0] = block.HashNoNonce().Hex()\n\t\tseedHash := ethash.SeedHash(block.NumberU64())\n\t\tres[1] = common.BytesToHash(seedHash).Hex()\n\t\t// Calculate the \"target\" to be returned to the external miner\n\t\tn := big.NewInt(1)\n\t\tn.Lsh(n, 255)\n\t\tn.Div(n, block.Difficulty())\n\t\tn.Lsh(n, 1)\n\t\tres[2] = common.BytesToHash(n.Bytes()).Hex()\n\t\tres[3] = block.Number().String()\n\n\t\ta.work[block.HashNoNonce()] = a.currentWork\n\t\treturn res, nil\n\t}\n\treturn res, errors.New(\"No work available yet, don't panic.\")\n}\n\n// SubmitWork tries to inject a pow solution into the remote agent, returning\n// whether the solution was accepted or not (not can be both a bad pow as well as\n// any other error, like no work pending).\nfunc (a *RemoteAgent) SubmitWork(nonce types.BlockNonce, mixDigest, hash common.Hash) bool {\n\ta.mu.Lock()\n\tdefer a.mu.Unlock()\n\n\t// Make sure the work submitted is present\n\twork := a.work[hash]\n\tif work == nil {\n\t\tlog.Info(\"Work submitted but none pending\", \"hash\", hash)\n\t\treturn false\n\t}\n\t// Make sure the Engine solutions is indeed valid\n\tresult := work.Block.Header()\n\tresult.Nonce = nonce\n\tresult.MixDigest = mixDigest\n\n\tif err := a.engine.VerifySeal(a.chain, result); err != nil {\n\t\tlog.Warn(\"Invalid proof-of-work submitted\", \"hash\", hash, \"err\", err)\n\t\treturn false\n\t}\n\tblock := work.Block.WithSeal(result)\n\n\t// Solutions seems to be valid, return to the miner and notify acceptance\n\tw := work.Copy()\n\ta.returnCh <- &Result{w, block}\n\tdelete(a.work, hash)\n\n\treturn true\n}\n\n// loop monitors mining events on the work and quit channels, updating the internal\n// state of the remote miner until a termination is requested.\n//\n// Note, the reason the work and quit channels are passed as parameters is because\n// RemoteAgent.Start() constantly recreates these channels, so the loop code cannot\n// assume data stability in these member fields.\nfunc (a *RemoteAgent) loop(workCh chan *Work, quitCh chan struct{}) {\n\tticker := time.NewTicker(5 * time.Second)\n\tdefer ticker.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase <-quitCh:\n\t\t\treturn\n\t\tcase work := <-workCh:\n\t\t\ta.mu.Lock()\n\t\t\ta.currentWork = work\n\t\t\ta.mu.Unlock()\n\t\tcase <-ticker.C:\n\t\t\t// cleanup\n\t\t\ta.mu.Lock()\n\t\t\tfor hash, work := range a.work {\n\t\t\t\tif time.Since(work.createdAt) > 7*(12*time.Second) {\n\t\t\t\t\tdelete(a.work, hash)\n\t\t\t\t}\n\t\t\t}\n\t\t\ta.mu.Unlock()\n\n\t\t\ta.hashrateMu.Lock()\n\t\t\tfor id, hashrate := range a.hashrate {\n\t\t\t\tif time.Since(hashrate.ping) > 10*time.Second {\n\t\t\t\t\tdelete(a.hashrate, id)\n\t\t\t\t}\n\t\t\t}\n\t\t\ta.hashrateMu.Unlock()\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "miner/unconfirmed.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage miner\n\nimport (\n\t\"container/ring\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// headerRetriever is used by the unconfirmed block set to verify whether a previously\n// mined block is part of the canonical chain or not.\ntype headerRetriever interface {\n\t// GetHeaderByNumber retrieves the canonical header associated with a block number.\n\tGetHeaderByNumber(number uint64) *types.Header\n}\n\n// unconfirmedBlock is a small collection of metadata about a locally mined block\n// that is placed into a unconfirmed set for canonical chain inclusion tracking.\ntype unconfirmedBlock struct {\n\tindex uint64\n\thash  common.Hash\n}\n\n// unconfirmedBlocks implements a data structure to maintain locally mined blocks\n// have have not yet reached enough maturity to guarantee chain inclusion. It is\n// used by the miner to provide logs to the user when a previously mined block\n// has a high enough guarantee to not be reorged out of the canonical chain.\ntype unconfirmedBlocks struct {\n\tchain  headerRetriever // Blockchain to verify canonical status through\n\tdepth  uint            // Depth after which to discard previous blocks\n\tblocks *ring.Ring      // Block infos to allow canonical chain cross checks\n\tlock   sync.RWMutex    // Protects the fields from concurrent access\n}\n\n// newUnconfirmedBlocks returns new data structure to track currently unconfirmed blocks.\nfunc newUnconfirmedBlocks(chain headerRetriever, depth uint) *unconfirmedBlocks {\n\treturn &unconfirmedBlocks{\n\t\tchain: chain,\n\t\tdepth: depth,\n\t}\n}\n\n// Insert adds a new block to the set of unconfirmed ones.\nfunc (set *unconfirmedBlocks) Insert(index uint64, hash common.Hash) {\n\t// If a new block was mined locally, shift out any old enough blocks\n\tset.Shift(index)\n\n\t// Create the new item as its own ring\n\titem := ring.New(1)\n\titem.Value = &unconfirmedBlock{\n\t\tindex: index,\n\t\thash:  hash,\n\t}\n\t// Set as the initial ring or append to the end\n\tset.lock.Lock()\n\tdefer set.lock.Unlock()\n\n\tif set.blocks == nil {\n\t\tset.blocks = item\n\t} else {\n\t\tset.blocks.Move(-1).Link(item)\n\t}\n\t// Display a log for the user to notify of a new mined block unconfirmed\n\tlog.Info(\"🔨 mined potential block\", \"number\", index, \"hash\", hash)\n}\n\n// Shift drops all unconfirmed blocks from the set which exceed the unconfirmed sets depth\n// allowance, checking them against the canonical chain for inclusion or staleness\n// report.\nfunc (set *unconfirmedBlocks) Shift(height uint64) {\n\tset.lock.Lock()\n\tdefer set.lock.Unlock()\n\n\tfor set.blocks != nil {\n\t\t// Retrieve the next unconfirmed block and abort if too fresh\n\t\tnext := set.blocks.Value.(*unconfirmedBlock)\n\t\tif next.index+uint64(set.depth) > height {\n\t\t\tbreak\n\t\t}\n\t\t// Block seems to exceed depth allowance, check for canonical status\n\t\theader := set.chain.GetHeaderByNumber(next.index)\n\t\tswitch {\n\t\tcase header == nil:\n\t\t\tlog.Warn(\"Failed to retrieve header of mined block\", \"number\", next.index, \"hash\", next.hash)\n\t\tcase header.Hash() == next.hash:\n\t\t\tlog.Info(\"🔗 block reached canonical chain\", \"number\", next.index, \"hash\", next.hash)\n\t\tdefault:\n\t\t\tlog.Info(\"⑂ block  became a side fork\", \"number\", next.index, \"hash\", next.hash)\n\t\t}\n\t\t// Drop the block out of the ring\n\t\tif set.blocks.Value == set.blocks.Next().Value {\n\t\t\tset.blocks = nil\n\t\t} else {\n\t\t\tset.blocks = set.blocks.Move(-1)\n\t\t\tset.blocks.Unlink(1)\n\t\t\tset.blocks = set.blocks.Move(1)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "miner/worker.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage miner\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nconst (\n\tresultQueueSize  = 10\n\tminingLogAtDepth = 5\n\n\t// txChanSize is the size of channel listening to NewTxsEvent.\n\t// The number is referenced from the size of tx pool.\n\ttxChanSize = 4096\n\t// chainHeadChanSize is the size of channel listening to ChainHeadEvent.\n\tchainHeadChanSize = 10\n\t// chainSideChanSize is the size of channel listening to ChainSideEvent.\n\tchainSideChanSize = 10\n\n\tchainVoteSize = 30\n\n\t//delayBlock = 1\n)\n\n// Agent can register themself with the worker\ntype Agent interface {\n\tWork() chan<- *Work\n\tSetReturnCh(chan<- *Result)\n\tStop()\n\tStart()\n\tGetHashRate() int64\n}\n\n// Work is the workers current environment and holds\n// all of the current state information\ntype Work struct {\n\tconfig *params.ChainConfig\n\n\tstate   *state.StateDB // apply state changes here\n\ttcount  int            // tx count in cycle\n\tgasPool *core.GasPool  // available gas used to pack transactions\n\n\tBlock *types.Block // the new block\n\n\theader   *types.Header\n\ttxs      []*types.Transaction\n\treceipts []*types.Receipt\n\n\tcreatedAt time.Time\n\n\thandledTxs    []*types.Transaction\n\terrHandledTxs []*types.Transaction\n\n\tgasReward uint64\n}\n\nfunc (self *Work) Copy() (ret *Work) {\n\tret = &Work{}\n\t*ret = *self\n\tret.state = self.state.Copy()\n\treturn\n}\n\ntype Result struct {\n\tWork  *Work\n\tBlock *types.Block\n}\n\n// worker is the main object which takes care of applying messages to the new state\ntype worker struct {\n\tconfig *params.ChainConfig\n\tengine consensus.Engine\n\n\tmu sync.Mutex\n\n\t// update loop\n\tmux          *event.TypeMux\n\ttxsCh        chan core.NewTxsEvent\n\ttxsSub       event.Subscription\n\tvoteCh       chan core.NewVoteEvent\n\tvoteSub      event.Subscription\n\tchainHeadCh  chan core.ChainHeadEvent\n\tchainHeadSub event.Subscription\n\tchainSideCh  chan core.ChainSideEvent\n\tchainSideSub event.Subscription\n\twg           sync.WaitGroup\n\n\tvoter voter\n\n\tagents    map[Agent]struct{}\n\trecv      chan *Result\n\tpowRecv   chan *Result\n\tposTaskCh chan *Result\n\n\teth     Backend\n\tchain   *core.BlockChain\n\tproc    core.Validator\n\tchainDb serodb.Database\n\n\tcoinbase accounts.Account\n\textra    []byte\n\n\tcurrentMu sync.Mutex\n\tcurrent   *Work\n\n\tsnapshotMu    sync.RWMutex\n\tsnapshotBlock *types.Block\n\tsnapshotState *state.StateDB\n\n\tunconfirmed *unconfirmedBlocks // set of locally mined blocks pending canonicalness confirmations\n\n\t// atomic status counters\n\tmining int32\n\tatWork int32\n\n\tpendingVote pendingVote\n\n\tstopVote   chan struct{}\n\tstopPow    chan struct{}\n\tstopWrite  chan struct{}\n\tstopUpdate chan struct{}\n\tloopwg     sync.WaitGroup\n\trunning    int32\n\n\t//pendingVoteMu sync.RWMutex\n\t//pendingVote   map[voteKey]voteSet\n\t//pendingVoteTime sync.Map\n\t//pendingPosMu  sync.RWMutex\n\t//pendingPos    map[common.Hash]time.Time\n\t//pendingVoteMu sync.RWMutex\n\t//pendingVote   map[common.Hash]mapset.Set\n}\n\nfunc newWorker(config *params.ChainConfig, engine consensus.Engine, account accounts.Account, voter voter, sero Backend, mux *event.TypeMux) *worker {\n\tworker := &worker{\n\t\tconfig:      config,\n\t\tengine:      engine,\n\t\teth:         sero,\n\t\tmux:         mux,\n\t\ttxsCh:       make(chan core.NewTxsEvent, txChanSize),\n\t\tvoteCh:      make(chan core.NewVoteEvent, chainVoteSize),\n\t\tchainHeadCh: make(chan core.ChainHeadEvent, chainHeadChanSize),\n\t\tchainSideCh: make(chan core.ChainSideEvent, chainSideChanSize),\n\t\tchainDb:     sero.ChainDb(),\n\t\trecv:        make(chan *Result, resultQueueSize),\n\t\tpowRecv:     make(chan *Result),\n\t\tposTaskCh:   make(chan *Result),\n\t\tchain:       sero.BlockChain(),\n\t\tproc:        sero.BlockChain().Validator(),\n\t\tcoinbase:    account,\n\t\tagents:      make(map[Agent]struct{}),\n\t\tunconfirmed: newUnconfirmedBlocks(sero.BlockChain(), miningLogAtDepth),\n\t\tvoter:       voter,\n\t\tpendingVote: newPendingVote(),\n\t\tstopVote:    make(chan struct{}),\n\t\tstopPow:     make(chan struct{}),\n\t\tstopWrite:   make(chan struct{}),\n\t\tstopUpdate:  make(chan struct{}),\n\t}\n\t// Subscribe NewTxsEvent for tx pool\n\tworker.txsSub = sero.TxPool().SubscribeNewTxsEvent(worker.txsCh)\n\tworker.voteSub = worker.voter.SubscribeWorkerVoteEvent(worker.voteCh)\n\t// Subscribe events for blockchain\n\tworker.chainHeadSub = sero.BlockChain().SubscribeChainHeadEvent(worker.chainHeadCh)\n\tworker.chainSideSub = sero.BlockChain().SubscribeChainSideEvent(worker.chainSideCh)\n\tgo worker.update()\n\tgo worker.voteLoop()\n\tgo worker.powResultLoop()\n\tgo worker.resultLoop()\n\tworker.commitNewWork()\n\n\treturn worker\n}\n\nfunc (self *worker) setSerobase(account accounts.Account) {\n\tself.mu.Lock()\n\tdefer self.mu.Unlock()\n\tself.coinbase = account\n}\n\nfunc (self *worker) setExtra(extra []byte) {\n\tself.mu.Lock()\n\tdefer self.mu.Unlock()\n\tself.extra = extra\n}\n\nfunc (self *worker) pending() (*types.Block, *state.StateDB) {\n\tif atomic.LoadInt32(&self.mining) == 0 {\n\t\t// return a snapshot to avoid contention on currentMu mutex\n\t\tself.snapshotMu.RLock()\n\t\tdefer self.snapshotMu.RUnlock()\n\t\treturn self.snapshotBlock, self.snapshotState.Copy()\n\t}\n\n\tself.currentMu.Lock()\n\tdefer self.currentMu.Unlock()\n\treturn self.current.Block, self.current.state.Copy()\n}\n\nfunc (self *worker) pendingBlock() *types.Block {\n\tif atomic.LoadInt32(&self.mining) == 0 {\n\t\t// return a snapshot to avoid contention on currentMu mutex\n\t\tself.snapshotMu.RLock()\n\t\tdefer self.snapshotMu.RUnlock()\n\t\treturn self.snapshotBlock\n\t}\n\n\tself.currentMu.Lock()\n\tdefer self.currentMu.Unlock()\n\treturn self.current.Block\n}\n\nfunc (self *worker) start() {\n\tself.mu.Lock()\n\tdefer self.mu.Unlock()\n\n\tatomic.StoreInt32(&self.mining, 1)\n\n\t// spin up agents\n\tfor agent := range self.agents {\n\t\tagent.Start()\n\t}\n}\n\nfunc (self *worker) stop() {\n\tself.wg.Wait()\n\n\tself.mu.Lock()\n\tdefer self.mu.Unlock()\n\tif atomic.LoadInt32(&self.mining) == 1 {\n\t\tfor agent := range self.agents {\n\t\t\tagent.Stop()\n\t\t}\n\t}\n\tatomic.StoreInt32(&self.mining, 0)\n\tatomic.StoreInt32(&self.atWork, 0)\n}\n\nfunc (self *worker) register(agent Agent) {\n\tself.mu.Lock()\n\tdefer self.mu.Unlock()\n\tself.agents[agent] = struct{}{}\n\tagent.SetReturnCh(self.powRecv)\n}\n\nfunc (self *worker) unregister(agent Agent) {\n\tself.mu.Lock()\n\tdefer self.mu.Unlock()\n\tdelete(self.agents, agent)\n\tagent.Stop()\n}\n\nfunc (self *worker) update() {\n\tself.loopwg.Add(1)\n\tdefer self.loopwg.Done()\n\tdefer self.txsSub.Unsubscribe()\n\tdefer self.chainHeadSub.Unsubscribe()\n\tdefer self.chainSideSub.Unsubscribe()\n\n\tfor {\n\t\t// A real event arrived, process interesting content\n\t\tselect {\n\t\t// Handle ChainHeadEvent\n\t\tcase block := <-self.chainHeadCh:\n\t\t\theader := block.Block.Header()\n\n\t\t\tself.pendingVote.deleteBefore(header.Number.Uint64() - 1)\n\n\t\t\tself.commitNewWork()\n\n\t\t\t// Handle ChainSideEvent\n\t\tcase <-self.chainSideCh:\n\n\t\t\t//Handle NewTxsEvent\n\t\tcase ev := <-self.txsCh:\n\t\t\t//Apply transactions to the pending state if we're not mining.\n\n\t\t\t//Note all transactions received may not be continuous with transactions\n\t\t\t//already included in the current mining block. These transactions will\n\t\t\t//be automatically eliminated.\n\t\t\tif atomic.LoadInt32(&self.mining) == 0 && self.current != nil {\n\t\t\t\tself.currentMu.Lock()\n\t\t\t\ttxset := types.NewTransactionsByPrice(ev.Txs)\n\t\t\t\taddr := common.Address{}\n\t\t\t\tpkr := self.coinbase.GetPkr(nil)\n\t\t\t\taddr.SetBytes(pkr[:])\n\n\t\t\t\tself.current.commitTransactions(self.mux, txset, self.chain, addr)\n\t\t\t\tself.updateSnapshot()\n\t\t\t\tself.currentMu.Unlock()\n\t\t\t}\n\t\t\t// System stopped\n\t\tcase <-self.txsSub.Err():\n\t\t\treturn\n\t\tcase <-self.chainHeadSub.Err():\n\t\t\treturn\n\t\tcase <-self.chainSideSub.Err():\n\t\t\treturn\n\t\tcase <-self.stopUpdate:\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *worker) powResultLoop() {\n\tself.loopwg.Add(1)\n\tdefer self.loopwg.Done()\n\tfor {\n\t\tselect {\n\t\tcase result := <-self.powRecv:\n\t\t\tif result == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif result.Block.Header().Number.Uint64() < seroparam.SIP4() {\n\t\t\t\tself.recv <- result\n\t\t\t} else {\n\t\t\t\tlotter := newLotter(self, result.Block, result.Work.state)\n\t\t\t\tself.voter.AddLottery(&types.Lottery{result.Block.ParentHash(), result.Block.Number().Uint64() - 1, result.Block.HashPos()})\n\n\t\t\t\tlog.Info(\"Broadcast Lottery\", \"poshash\", result.Block.HashPos(), \"block\", result.Block.Number().Uint64())\n\n\t\t\t\tgo func() {\n\t\t\t\t\tif lotter.wait() {\n\t\t\t\t\t\tresult.Block.SetVotes(lotter.currentHeaderVotes, lotter.parentHeaderVotes)\n\t\t\t\t\t\tself.recv <- result\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t}\n\t\tcase <-self.stopPow:\n\t\t\tlog.Info(\"stop worker pow\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *worker) voteLoop() {\n\tself.loopwg.Add(1)\n\tdefer self.loopwg.Done()\n\tdefer self.voteSub.Unsubscribe()\n\tfor {\n\t\tselect {\n\t\tcase voteResult := <-self.voteCh:\n\t\t\tif atomic.LoadInt32(&self.mining) == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tvote := voteResult.Vote\n\t\t\tif vote == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif vote.ParentNum+1 < self.pendingBlock().NumberU64()-1 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tlog.Trace(\"worker voteLoop\", \"posHash\", vote.PosHash, \"block\", vote.ParentNum+1, \"share\", vote.ShareId, \"idx\", vote.Idx)\n\n\t\t\tself.pendingVote.add(vote)\n\n\t\tcase <-self.voteSub.Err():\n\t\t\treturn\n\t\tcase <-self.stopVote:\n\t\t\tlog.Info(\"stop worker vote loop...\")\n\t\t\treturn\n\t\t}\n\n\t}\n}\n\nfunc (self *worker) resultLoop() {\n\tself.loopwg.Add(1)\n\tdefer self.loopwg.Done()\n\tfor {\n\t\tselect {\n\t\tcase result := <-self.recv:\n\n\t\t\tatomic.AddInt32(&self.atWork, -1)\n\n\t\t\tif result == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tblock := result.Block\n\t\t\twork := result.Work\n\n\t\t\t// Update the block hash in all logs since it is now available and not when the\n\t\t\t// receipt/log of individual transactions were created.\n\t\t\tfor _, r := range work.receipts {\n\t\t\t\tfor _, l := range r.Logs {\n\t\t\t\t\tl.BlockHash = block.Hash()\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, log := range work.state.Logs() {\n\t\t\t\tlog.BlockHash = block.Hash()\n\t\t\t}\n\t\t\tself.currentMu.Lock()\n\t\t\tstat, err := self.chain.WriteBlockWithState(block, work.receipts, work.state)\n\t\t\tself.currentMu.Unlock()\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"Failed writing block to chain\", \"err\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Broadcast the block and announce chain insertion event\n\t\t\tself.mux.Post(core.NewMinedBlockEvent{Block: block})\n\t\t\tvar (\n\t\t\t\tevents []interface{}\n\t\t\t\tlogs   = work.state.Logs()\n\t\t\t)\n\t\t\tevents = append(events, core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs})\n\t\t\tself.eth.TxPool().RemoveTxs(work.handledTxs)\n\t\t\tif stat == core.CanonStatTy {\n\t\t\t\tevents = append(events, core.ChainHeadEvent{Block: block})\n\t\t\t}\n\t\t\tself.chain.PostChainEvents(events, logs)\n\n\t\t\t// Insert the block into the set of pending ones to resultLoop for confirmations\n\t\t\tself.unconfirmed.Insert(block.NumberU64(), block.Hash())\n\t\t\tlog.Info(fmt.Sprintf(\"mined new block done in %v, number = %v, txs = %v\", time.Since(work.createdAt), block.NumberU64(), len(block.Body().Transactions)))\n\t\tcase <-self.stopWrite:\n\t\t\tlog.Info(\"stop worker result....\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// push sends a new work task to currently live miner agents.\nfunc (self *worker) push(work *Work) {\n\tif atomic.LoadInt32(&self.mining) != 1 {\n\t\treturn\n\t}\n\tself.eth.TxPool().RemoveTxs(work.errHandledTxs)\n\tfor agent := range self.agents {\n\t\tatomic.AddInt32(&self.atWork, 1)\n\t\tif ch := agent.Work(); ch != nil {\n\t\t\tch <- work\n\t\t}\n\t}\n}\n\n// makeCurrent creates a new environment for the current cycle.\nfunc (self *worker) makeCurrent(parent *types.Block, header *types.Header) error {\n\tstate, err := self.chain.StateAt(parent.Header())\n\tif err != nil {\n\t\treturn err\n\t}\n\twork := &Work{\n\t\tconfig:    self.config,\n\t\tstate:     state,\n\t\theader:    header,\n\t\tcreatedAt: time.Now(),\n\t}\n\t// Keep track of transactions which return errors so they can be removed\n\twork.tcount = 0\n\tself.current = work\n\treturn nil\n}\n\nfunc (self *worker) commitNewWork() {\n\tself.mu.Lock()\n\tdefer self.mu.Unlock()\n\tself.currentMu.Lock()\n\tdefer self.currentMu.Unlock()\n\n\ttstart := time.Now()\n\tparent := self.chain.CurrentBlock()\n\n\ttstamp := tstart.Unix()\n\tif parent.Time().Cmp(new(big.Int).SetInt64(tstamp)) >= 0 {\n\t\ttstamp = parent.Time().Int64() + 1\n\t}\n\t// this will ensure we're not going off too far in the future\n\tif now := time.Now().Unix(); tstamp > now+1 {\n\t\twait := time.Duration(tstamp-now) * time.Second\n\t\tlog.Info(\"Mining too far in the future\", \"resultLoop\", common.PrettyDuration(wait))\n\t\ttime.Sleep(wait)\n\t}\n\n\tnum := parent.Number()\n\theader := &types.Header{\n\t\tParentHash: parent.Hash(),\n\t\tNumber:     num.Add(num, common.Big1),\n\t\tGasLimit:   core.CalcGasLimit(parent),\n\t\tExtra:      self.extra,\n\t\tTime:       big.NewInt(tstamp),\n\t}\n\t// Only set the coinbase if we are mining (avoid spurious block rewards)\n\tif atomic.LoadInt32(&self.mining) == 1 {\n\t\t//pkr :=  superzk.Pk2PKr(self.coinbase.ToUint512(), nil)\n\t\tpkr, licr, ret := superzk.Pk2PKrAndLICr(self.coinbase.Address.ToUint512().NewRef(), header.Number.Uint64())\n\t\tif !ret {\n\t\t\tlog.Error(\"Failed to Addr2PKrAndLICr\")\n\t\t\treturn\n\t\t}\n\t\theader.Licr = licr\n\t\tcopy(header.Coinbase[:], pkr[:])\n\t}\n\n\tif err := self.engine.Prepare(self.chain, header); err != nil {\n\t\tlog.Error(\"Failed to prepare header for mining\", \"err\", err)\n\t\treturn\n\t}\n\n\t// Could potentially happen if starting to mine in an odd state.\n\terr := self.makeCurrent(parent, header)\n\tif err != nil {\n\t\tlog.Error(\"Failed to create mining context\", \"err\", err)\n\t\treturn\n\t}\n\t// Create the current work task and check any fork transitions needed\n\twork := self.current\n\n\tpending, err := self.eth.TxPool().Pending()\n\tif err != nil {\n\t\tlog.Error(\"Failed to fetch pending transactions\", \"err\", err)\n\t\treturn\n\t}\n\ttxs := types.NewTransactionsByPrice(pending)\n\n\tif header.Number.Uint64() >= seroparam.SIP4() {\n\t\tstakeState := stake.NewStakeState(work.state)\n\t\terr := stakeState.ProcessBeforeApply(self.chain, header)\n\t\tif err != nil {\n\t\t\tlog.Error(\"ProcessBeforeApply\", \"err\", err)\n\t\t\treturn\n\t\t}\n\t}\n\n\twork.commitTransactions(self.mux, txs, self.chain, header.Coinbase)\n\n\tlog.Debug(fmt.Sprintf(\"commitTransactions %v tx done in %v\", len(pending), time.Since(tstart)))\n\n\t// Create the new block to seal with the consensus engine\n\tif work.Block, err = self.engine.Finalize(self.chain, header, work.state, work.txs, work.receipts, work.gasReward); err != nil {\n\t\tlog.Error(\"Failed to finalize block for sealing\", \"err\", err)\n\t\treturn\n\t}\n\t// We only care about logging if we're actually mining.\n\tif atomic.LoadInt32(&self.mining) == 1 {\n\t\tlog.Info(\"Commit new mining work\", \"number\", work.Block.Number(), \"txs\", work.tcount, \"elapsed\", common.PrettyDuration(time.Since(tstart)))\n\t\tself.unconfirmed.Shift(work.Block.NumberU64() - 1)\n\t}\n\tself.push(work)\n\tself.updateSnapshot()\n}\n\nfunc (self *worker) updateSnapshot() {\n\tself.snapshotMu.Lock()\n\tdefer self.snapshotMu.Unlock()\n\n\tself.snapshotBlock = types.NewBlock(\n\t\tself.current.header,\n\t\tself.current.txs,\n\t\tself.current.receipts,\n\t)\n\tself.snapshotState = self.current.state.Copy()\n}\nfunc (self *worker) Close() {\n\tif !atomic.CompareAndSwapInt32(&self.running, 0, 1) {\n\t\treturn\n\t}\n\tclose(self.stopUpdate)\n\tclose(self.stopPow)\n\tclose(self.stopVote)\n\tclose(self.stopWrite)\n\tself.loopwg.Wait()\n\n}\n\nfunc (env *Work) commitTransactions(mux *event.TypeMux, txs *types.TransactionsByPrice, bc *core.BlockChain, coinbase common.Address) {\n\tif env.gasPool == nil {\n\t\tenv.gasPool = new(core.GasPool).AddGas(env.header.GasLimit)\n\t}\n\n\tvar coalescedLogs []*types.Log\nLOOP:\n\tfor {\n\t\t// If we don't have enough gas for any further transactions then we're done\n\t\tif env.gasPool.Gas() < params.TxGas {\n\t\t\tlog.Trace(\"Not enough gas for further transactions\", \"have\", env.gasPool, \"want\", params.TxGas)\n\t\t\tbreak\n\t\t}\n\t\t// Retrieve the next transaction and abort if all done\n\t\ttx := txs.Peek()\n\t\tif tx == nil {\n\t\t\tbreak\n\t\t}\n\n\t\tif true && (!seroparam.Is_Dev()) {\n\t\t\tif env.header.Number.Uint64() == seroparam.SIP10() {\n\t\t\t\ttxs.Shift()\n\t\t\t\tenv.errHandledTxs = append(env.errHandledTxs, tx)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Start executing the transaction\n\t\tenv.state.Prepare(tx.Hash(), common.Hash{}, env.tcount)\n\n\t\terr, logs := env.commitTransaction(tx, bc, coinbase, env.gasPool)\n\t\tswitch err {\n\t\tcase core.ErrGasLimitReached:\n\t\t\tlog.Info(\"Gas limit exceeded for current block\", \"block\", bc.CurrentBlock().Header().Number.Uint64())\n\t\t\t// Pop the current out-of-gas transaction without shifting in the next from the account\n\t\t\t//log.Trace(\"Gas limit exceeded for current block\", \"sender\", tx.From())\n\t\t\ttxs.Pop()\n\t\t\tbreak LOOP\n\n\t\tcase nil:\n\t\t\t// Everything ok, collect the logs and shift in the next transaction from the same account\n\t\t\tcoalescedLogs = append(coalescedLogs, logs...)\n\t\t\tenv.tcount++\n\t\t\ttxs.Shift()\n\t\t\tenv.handledTxs = append(env.handledTxs, tx)\n\t\tdefault:\n\t\t\t// Strange error, discard the transaction and get the next in line (note, the\n\t\t\t// nonce-too-high clause will prevent us from executing in vain).\n\t\t\tlog.Debug(\"Transaction failed, account skipped\", \"hash\", tx.Hash(), \"err\", err)\n\t\t\ttxs.Shift()\n\t\t\tenv.errHandledTxs = append(env.errHandledTxs, tx)\n\t\t}\n\t}\n\n\tif len(coalescedLogs) > 0 || env.tcount > 0 {\n\t\t// make a copy, the state caches the logs and these logs get \"upgraded\" from pending to mined\n\t\t// logs by filling in the block hash when the block was mined by the local miner. This can\n\t\t// cause a race condition if a log was \"upgraded\" before the PendingLogsEvent is processed.\n\t\tcpy := make([]*types.Log, len(coalescedLogs))\n\t\tfor i, l := range coalescedLogs {\n\t\t\tcpy[i] = new(types.Log)\n\t\t\t*cpy[i] = *l\n\t\t}\n\t\tgo func(logs []*types.Log, tcount int) {\n\t\t\tif len(logs) > 0 {\n\t\t\t\tmux.Post(core.PendingLogsEvent{Logs: logs})\n\t\t\t}\n\t\t\tif tcount > 0 {\n\t\t\t\tmux.Post(core.PendingStateEvent{})\n\t\t\t}\n\t\t}(cpy, env.tcount)\n\t}\n}\n\nfunc (env *Work) commitTransaction(tx *types.Transaction, bc *core.BlockChain, coinbase common.Address, gp *core.GasPool) (error, []*types.Log) {\n\tsnap := env.state.Snapshot()\n\n\treceipt, gas, err := core.ApplyTransaction(env.config, bc, &coinbase, gp, env.state, env.header, tx, &env.header.GasUsed, vm.Config{})\n\tif err != nil {\n\t\tenv.state.RevertToSnapshot(snap)\n\t\treturn err, nil\n\t}\n\n\tenv.gasReward += new(big.Int).Mul(new(big.Int).SetUint64(gas), tx.GasPrice()).Uint64()\n\tenv.txs = append(env.txs, tx)\n\tenv.receipts = append(env.receipts, receipt)\n\n\treturn err, receipt.Logs\n}\n"
  },
  {
    "path": "node/api.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage node\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// PrivateAdminAPI is the collection of administrative API methods exposed only\n// over a secure RPC channel.\ntype PrivateAdminAPI struct {\n\tnode *Node // Node interfaced by this API\n}\n\n// NewPrivateAdminAPI creates a new API definition for the private admin methods\n// of the node itself.\nfunc NewPrivateAdminAPI(node *Node) *PrivateAdminAPI {\n\treturn &PrivateAdminAPI{node: node}\n}\n\n// AddPeer requests connecting to a remote node, and also maintaining the new\n// connection at all times, even reconnecting if it is lost.\nfunc (api *PrivateAdminAPI) AddPeer(url string) (bool, error) {\n\t// Make sure the server is running, fail otherwise\n\tserver := api.node.Server()\n\tif server == nil {\n\t\treturn false, ErrNodeStopped\n\t}\n\t// Try to add the url as a static peer and return\n\tnode, err := discover.ParseNode(url)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"invalid snode: %v\", err)\n\t}\n\tserver.AddPeer(node)\n\treturn true, nil\n}\n\n// RemovePeer disconnects from a a remote node if the connection exists\nfunc (api *PrivateAdminAPI) RemovePeer(url string) (bool, error) {\n\t// Make sure the server is running, fail otherwise\n\tserver := api.node.Server()\n\tif server == nil {\n\t\treturn false, ErrNodeStopped\n\t}\n\t// Try to remove the url as a static peer and return\n\tnode, err := discover.ParseNode(url)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"invalid snode: %v\", err)\n\t}\n\tserver.RemovePeer(node)\n\treturn true, nil\n}\n\n// AddTrustedPeer allows a remote node to always connect, even if slots are full\nfunc (api *PrivateAdminAPI) AddTrustedPeer(url string) (bool, error) {\n\t// Make sure the server is running, fail otherwise\n\tserver := api.node.Server()\n\tif server == nil {\n\t\treturn false, ErrNodeStopped\n\t}\n\tnode, err := discover.ParseNode(url)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"invalid snode: %v\", err)\n\t}\n\tserver.AddTrustedPeer(node)\n\treturn true, nil\n}\n\n// RemoveTrustedPeer removes a remote node from the trusted peer set, but it\n// does not disconnect it automatically.\nfunc (api *PrivateAdminAPI) RemoveTrustedPeer(url string) (bool, error) {\n\t// Make sure the server is running, fail otherwise\n\tserver := api.node.Server()\n\tif server == nil {\n\t\treturn false, ErrNodeStopped\n\t}\n\tnode, err := discover.ParseNode(url)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"invalid snode: %v\", err)\n\t}\n\tserver.RemoveTrustedPeer(node)\n\treturn true, nil\n}\n\n// PeerEvents creates an RPC subscription which receives peer events from the\n// node's p2p.Server\nfunc (api *PrivateAdminAPI) PeerEvents(ctx context.Context) (*rpc.Subscription, error) {\n\t// Make sure the server is running, fail otherwise\n\tserver := api.node.Server()\n\tif server == nil {\n\t\treturn nil, ErrNodeStopped\n\t}\n\n\t// Create the subscription\n\tnotifier, supported := rpc.NotifierFromContext(ctx)\n\tif !supported {\n\t\treturn nil, rpc.ErrNotificationsUnsupported\n\t}\n\trpcSub := notifier.CreateSubscription()\n\n\tgo func() {\n\t\tevents := make(chan *p2p.PeerEvent)\n\t\tsub := server.SubscribeEvents(events)\n\t\tdefer sub.Unsubscribe()\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase event := <-events:\n\t\t\t\tnotifier.Notify(rpcSub.ID, event)\n\t\t\tcase <-sub.Err():\n\t\t\t\treturn\n\t\t\tcase <-rpcSub.Err():\n\t\t\t\treturn\n\t\t\tcase <-notifier.Closed():\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn rpcSub, nil\n}\n\n// StartRPC starts the HTTP RPC API server.\nfunc (api *PrivateAdminAPI) StartRPC(host *string, port *int, cors *string, apis *string, vhosts *string) (bool, error) {\n\tapi.node.lock.Lock()\n\tdefer api.node.lock.Unlock()\n\n\tif api.node.httpHandler != nil {\n\t\treturn false, fmt.Errorf(\"HTTP RPC already running on %s\", api.node.httpEndpoint)\n\t}\n\n\tif host == nil {\n\t\th := DefaultHTTPHost\n\t\tif api.node.config.HTTPHost != \"\" {\n\t\t\th = api.node.config.HTTPHost\n\t\t}\n\t\thost = &h\n\t}\n\tif port == nil {\n\t\tport = &api.node.config.HTTPPort\n\t}\n\n\tallowedOrigins := api.node.config.HTTPCors\n\tif cors != nil {\n\t\tallowedOrigins = nil\n\t\tfor _, origin := range strings.Split(*cors, \",\") {\n\t\t\tallowedOrigins = append(allowedOrigins, strings.TrimSpace(origin))\n\t\t}\n\t}\n\n\tallowedVHosts := api.node.config.HTTPVirtualHosts\n\tif vhosts != nil {\n\t\tallowedVHosts = nil\n\t\tfor _, vhost := range strings.Split(*host, \",\") {\n\t\t\tallowedVHosts = append(allowedVHosts, strings.TrimSpace(vhost))\n\t\t}\n\t}\n\n\tmodules := api.node.httpWhitelist\n\tif apis != nil {\n\t\tmodules = nil\n\t\tfor _, m := range strings.Split(*apis, \",\") {\n\t\t\tmodules = append(modules, strings.TrimSpace(m))\n\t\t}\n\t}\n\n\tif err := api.node.startHTTP(fmt.Sprintf(\"%s:%d\", *host, *port), api.node.rpcAPIs, modules, allowedOrigins, allowedVHosts, api.node.config.HTTPTimeouts); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// StopRPC terminates an already running HTTP RPC API endpoint.\nfunc (api *PrivateAdminAPI) StopRPC() (bool, error) {\n\tapi.node.lock.Lock()\n\tdefer api.node.lock.Unlock()\n\n\tif api.node.httpHandler == nil {\n\t\treturn false, fmt.Errorf(\"HTTP RPC not running\")\n\t}\n\tapi.node.stopHTTP()\n\treturn true, nil\n}\n\n// StartWS starts the websocket RPC API server.\nfunc (api *PrivateAdminAPI) StartWS(host *string, port *int, allowedOrigins *string, apis *string) (bool, error) {\n\tapi.node.lock.Lock()\n\tdefer api.node.lock.Unlock()\n\n\tif api.node.wsHandler != nil {\n\t\treturn false, fmt.Errorf(\"WebSocket RPC already running on %s\", api.node.wsEndpoint)\n\t}\n\n\tif host == nil {\n\t\th := DefaultWSHost\n\t\tif api.node.config.WSHost != \"\" {\n\t\t\th = api.node.config.WSHost\n\t\t}\n\t\thost = &h\n\t}\n\tif port == nil {\n\t\tport = &api.node.config.WSPort\n\t}\n\n\torigins := api.node.config.WSOrigins\n\tif allowedOrigins != nil {\n\t\torigins = nil\n\t\tfor _, origin := range strings.Split(*allowedOrigins, \",\") {\n\t\t\torigins = append(origins, strings.TrimSpace(origin))\n\t\t}\n\t}\n\n\tmodules := api.node.config.WSModules\n\tif apis != nil {\n\t\tmodules = nil\n\t\tfor _, m := range strings.Split(*apis, \",\") {\n\t\t\tmodules = append(modules, strings.TrimSpace(m))\n\t\t}\n\t}\n\n\tif err := api.node.startWS(fmt.Sprintf(\"%s:%d\", *host, *port), api.node.rpcAPIs, modules, origins, api.node.config.WSExposeAll); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// StopWS terminates an already running websocket RPC API endpoint.\nfunc (api *PrivateAdminAPI) StopWS() (bool, error) {\n\tapi.node.lock.Lock()\n\tdefer api.node.lock.Unlock()\n\n\tif api.node.wsHandler == nil {\n\t\treturn false, fmt.Errorf(\"WebSocket RPC not running\")\n\t}\n\tapi.node.stopWS()\n\treturn true, nil\n}\n\n// PublicAdminAPI is the collection of administrative API methods exposed over\n// both secure and unsecure RPC channels.\ntype PublicAdminAPI struct {\n\tnode *Node // Node interfaced by this API\n}\n\n// NewPublicAdminAPI creates a new API definition for the public admin methods\n// of the node itself.\nfunc NewPublicAdminAPI(node *Node) *PublicAdminAPI {\n\treturn &PublicAdminAPI{node: node}\n}\n\n// Peers retrieves all the information we know about each individual peer at the\n// protocol granularity.\nfunc (api *PublicAdminAPI) Peers() ([]*p2p.PeerInfo, error) {\n\tserver := api.node.Server()\n\tif server == nil {\n\t\treturn nil, ErrNodeStopped\n\t}\n\treturn server.PeersInfo(), nil\n}\n\n// NodeInfo retrieves all the information we know about the host node at the\n// protocol granularity.\nfunc (api *PublicAdminAPI) NodeInfo() (*p2p.NodeInfo, error) {\n\tserver := api.node.Server()\n\tif server == nil {\n\t\treturn nil, ErrNodeStopped\n\t}\n\treturn server.NodeInfo(), nil\n}\n\n// Datadir retrieves the current data directory the node is using.\nfunc (api *PublicAdminAPI) Datadir() string {\n\treturn api.node.DataDir()\n}\n\n// PublicDebugAPI is the collection of debugging related API methods exposed over\n// both secure and unsecure RPC channels.\ntype PublicDebugAPI struct {\n\tnode *Node // Node interfaced by this API\n}\n\n// NewPublicDebugAPI creates a new API definition for the public debug methods\n// of the node itself.\nfunc NewPublicDebugAPI(node *Node) *PublicDebugAPI {\n\treturn &PublicDebugAPI{node: node}\n}\n\n// Metrics retrieves all the known system metric collected by the node.\nfunc (api *PublicDebugAPI) Metrics(raw bool) (map[string]interface{}, error) {\n\t// Create a rate formatter\n\tunits := []string{\"\", \"K\", \"M\", \"G\", \"T\", \"E\", \"P\"}\n\tround := func(value float64, prec int) string {\n\t\tunit := 0\n\t\tfor value >= 1000 {\n\t\t\tunit, value, prec = unit+1, value/1000, 2\n\t\t}\n\t\treturn fmt.Sprintf(fmt.Sprintf(\"%%.%df%s\", prec, units[unit]), value)\n\t}\n\tformat := func(total float64, rate float64) string {\n\t\treturn fmt.Sprintf(\"%s (%s/s)\", round(total, 0), round(rate, 2))\n\t}\n\t// Iterate over all the metrics, and just dump for now\n\tcounters := make(map[string]interface{})\n\tmetrics.DefaultRegistry.Each(func(name string, metric interface{}) {\n\t\t// Create or retrieve the counter hierarchy for this metric\n\t\troot, parts := counters, strings.Split(name, \"/\")\n\t\tfor _, part := range parts[:len(parts)-1] {\n\t\t\tif _, ok := root[part]; !ok {\n\t\t\t\troot[part] = make(map[string]interface{})\n\t\t\t}\n\t\t\troot = root[part].(map[string]interface{})\n\t\t}\n\t\tname = parts[len(parts)-1]\n\n\t\t// Fill the counter with the metric details, formatting if requested\n\t\tif raw {\n\t\t\tswitch metric := metric.(type) {\n\t\t\tcase metrics.Counter:\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"Overall\": float64(metric.Count()),\n\t\t\t\t}\n\n\t\t\tcase metrics.Meter:\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"AvgRate01Min\": metric.Rate1(),\n\t\t\t\t\t\"AvgRate05Min\": metric.Rate5(),\n\t\t\t\t\t\"AvgRate15Min\": metric.Rate15(),\n\t\t\t\t\t\"MeanRate\":     metric.RateMean(),\n\t\t\t\t\t\"Overall\":      float64(metric.Count()),\n\t\t\t\t}\n\n\t\t\tcase metrics.Timer:\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"AvgRate01Min\": metric.Rate1(),\n\t\t\t\t\t\"AvgRate05Min\": metric.Rate5(),\n\t\t\t\t\t\"AvgRate15Min\": metric.Rate15(),\n\t\t\t\t\t\"MeanRate\":     metric.RateMean(),\n\t\t\t\t\t\"Overall\":      float64(metric.Count()),\n\t\t\t\t\t\"Percentiles\": map[string]interface{}{\n\t\t\t\t\t\t\"5\":  metric.Percentile(0.05),\n\t\t\t\t\t\t\"20\": metric.Percentile(0.2),\n\t\t\t\t\t\t\"50\": metric.Percentile(0.5),\n\t\t\t\t\t\t\"80\": metric.Percentile(0.8),\n\t\t\t\t\t\t\"95\": metric.Percentile(0.95),\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\tcase metrics.ResettingTimer:\n\t\t\t\tt := metric.Snapshot()\n\t\t\t\tps := t.Percentiles([]float64{5, 20, 50, 80, 95})\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"Measurements\": len(t.Values()),\n\t\t\t\t\t\"Mean\":         t.Mean(),\n\t\t\t\t\t\"Percentiles\": map[string]interface{}{\n\t\t\t\t\t\t\"5\":  ps[0],\n\t\t\t\t\t\t\"20\": ps[1],\n\t\t\t\t\t\t\"50\": ps[2],\n\t\t\t\t\t\t\"80\": ps[3],\n\t\t\t\t\t\t\"95\": ps[4],\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\troot[name] = \"Unknown metric type\"\n\t\t\t}\n\t\t} else {\n\t\t\tswitch metric := metric.(type) {\n\t\t\tcase metrics.Counter:\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"Overall\": float64(metric.Count()),\n\t\t\t\t}\n\n\t\t\tcase metrics.Meter:\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"Avg01Min\": format(metric.Rate1()*60, metric.Rate1()),\n\t\t\t\t\t\"Avg05Min\": format(metric.Rate5()*300, metric.Rate5()),\n\t\t\t\t\t\"Avg15Min\": format(metric.Rate15()*900, metric.Rate15()),\n\t\t\t\t\t\"Overall\":  format(float64(metric.Count()), metric.RateMean()),\n\t\t\t\t}\n\n\t\t\tcase metrics.Timer:\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"Avg01Min\": format(metric.Rate1()*60, metric.Rate1()),\n\t\t\t\t\t\"Avg05Min\": format(metric.Rate5()*300, metric.Rate5()),\n\t\t\t\t\t\"Avg15Min\": format(metric.Rate15()*900, metric.Rate15()),\n\t\t\t\t\t\"Overall\":  format(float64(metric.Count()), metric.RateMean()),\n\t\t\t\t\t\"Maximum\":  time.Duration(metric.Max()).String(),\n\t\t\t\t\t\"Minimum\":  time.Duration(metric.Min()).String(),\n\t\t\t\t\t\"Percentiles\": map[string]interface{}{\n\t\t\t\t\t\t\"5\":  time.Duration(metric.Percentile(0.05)).String(),\n\t\t\t\t\t\t\"20\": time.Duration(metric.Percentile(0.2)).String(),\n\t\t\t\t\t\t\"50\": time.Duration(metric.Percentile(0.5)).String(),\n\t\t\t\t\t\t\"80\": time.Duration(metric.Percentile(0.8)).String(),\n\t\t\t\t\t\t\"95\": time.Duration(metric.Percentile(0.95)).String(),\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\tcase metrics.ResettingTimer:\n\t\t\t\tt := metric.Snapshot()\n\t\t\t\tps := t.Percentiles([]float64{5, 20, 50, 80, 95})\n\t\t\t\troot[name] = map[string]interface{}{\n\t\t\t\t\t\"Measurements\": len(t.Values()),\n\t\t\t\t\t\"Mean\":         time.Duration(t.Mean()).String(),\n\t\t\t\t\t\"Percentiles\": map[string]interface{}{\n\t\t\t\t\t\t\"5\":  time.Duration(ps[0]).String(),\n\t\t\t\t\t\t\"20\": time.Duration(ps[1]).String(),\n\t\t\t\t\t\t\"50\": time.Duration(ps[2]).String(),\n\t\t\t\t\t\t\"80\": time.Duration(ps[3]).String(),\n\t\t\t\t\t\t\"95\": time.Duration(ps[4]).String(),\n\t\t\t\t\t},\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\troot[name] = \"Unknown metric type\"\n\t\t\t}\n\t\t}\n\t})\n\treturn counters, nil\n}\n\n// PublicWeb3API offers helper utils\ntype PublicWeb3API struct {\n\tstack *Node\n}\n\n// NewPublicWeb3API creates a new Web3Service instance\nfunc NewPublicWeb3API(stack *Node) *PublicWeb3API {\n\treturn &PublicWeb3API{stack}\n}\n\n// ClientVersion returns the node name\nfunc (s *PublicWeb3API) ClientVersion() string {\n\treturn s.stack.Server().Name\n}\n\n// Sha3 applies the ethereum sha3 implementation on the input.\n// It assumes the input is hex encoded.\nfunc (s *PublicWeb3API) Sha3(input hexutil.Bytes) hexutil.Bytes {\n\treturn crypto.Keccak256(input)\n}\n"
  },
  {
    "path": "node/config.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage node\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/accounts/keystore\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n)\n\nconst (\n\tdatadirPrivateKey      = \"nodekey\"            // Path within the datadir to the node's private key\n\tdatadirDefaultKeyStore = \"keystore\"           // Path within the datadir to the keystore\n\tdatadirStaticNodes     = \"static-nodes.json\"  // Path within the datadir to the static node list\n\tdatadirTrustedNodes    = \"trusted-nodes.json\" // Path within the datadir to the trusted node list\n\tdatadirNodeDatabase    = \"nodes\"              // Path within the datadir to store the node infos\n)\n\n// Config represents a small collection of configuration values to fine tune the\n// P2P network layer of a protocol stack. These values can be further extended by\n// all registered services.\ntype Config struct {\n\t// Name sets the instance name of the node. It must not contain the / character and is\n\t// used in the devp2p node identifier. The instance name of gero is \"gero\". If no\n\t// value is specified, the basename of the current executable is used.\n\tName string `toml:\"-\"`\n\n\t// UserIdent, if set, is used as an additional component in the devp2p node identifier.\n\tUserIdent string `toml:\",omitempty\"`\n\n\t// Version should be set to the version number of the program. It is used\n\t// in the devp2p node identifier.\n\tVersion string `toml:\"-\"`\n\n\t// DataDir is the file system folder the node should use for any data storage\n\t// requirements. The configured data directory will not be directly shared with\n\t// registered services, instead those can use utility methods to create/access\n\t// databases or flat files. This enables ephemeral nodes which can fully reside\n\t// in memory.\n\tDataDir string\n\n\t// Configuration of peer-to-peer networking.\n\tP2P p2p.Config\n\n\t// KeyStoreDir is the file system folder that contains private keys. The directory can\n\t// be specified as a relative path, in which case it is resolved relative to the\n\t// current directory.\n\t//\n\t// If KeyStoreDir is empty, the default location is the \"keystore\" subdirectory of\n\t// DataDir. If DataDir is unspecified and KeyStoreDir is empty, an ephemeral directory\n\t// is created by New and destroyed when the node is stopped.\n\tKeyStoreDir string `toml:\",omitempty\"`\n\n\t// UseLightweightKDF lowers the memory and CPU requirements of the key store\n\t// scrypt KDF at the expense of security.\n\tUseLightweightKDF bool `toml:\",omitempty\"`\n\n\t// NoUSB disables hardware wallet monitoring and connectivity.\n\tNoUSB bool `toml:\",omitempty\"`\n\n\t// IPCPath is the requested location to place the IPC endpoint. If the path is\n\t// a simple file name, it is placed inside the data directory (or on the root\n\t// pipe path on Windows), whereas if it's a resolvable path name (absolute or\n\t// relative), then that specific path is enforced. An empty path disables IPC.\n\tIPCPath string `toml:\",omitempty\"`\n\n\t// HTTPHost is the host interface on which to start the HTTP RPC server. If this\n\t// field is empty, no HTTP API endpoint will be started.\n\tHTTPHost string `toml:\",omitempty\"`\n\n\t// HTTPPort is the TCP port number on which to start the HTTP RPC server. The\n\t// default zero value is/ valid and will pick a port number randomly (useful\n\t// for ephemeral nodes).\n\tHTTPPort int `toml:\",omitempty\"`\n\n\t// HTTPCors is the Cross-Origin Resource Sharing header to send to requesting\n\t// clients. Please be aware that CORS is a browser enforced security, it's fully\n\t// useless for custom HTTP clients.\n\tHTTPCors []string `toml:\",omitempty\"`\n\n\t// HTTPVirtualHosts is the list of virtual hostnames which are allowed on incoming requests.\n\t// This is by default {'localhost'}. Using this prevents attacks like\n\t// DNS rebinding, which bypasses SOP by simply masquerading as being within the same\n\t// origin. These attacks do not utilize CORS, since they are not cross-domain.\n\t// By explicitly checking the Host-header, the server will not allow requests\n\t// made against the server with a malicious host domain.\n\t// Requests using ip address directly are not affected\n\tHTTPVirtualHosts []string `toml:\",omitempty\"`\n\n\t// HTTPModules is a list of API modules to expose via the HTTP RPC interface.\n\t// If the module list is empty, all RPC API endpoints designated public will be\n\t// exposed.\n\tHTTPModules []string `toml:\",omitempty\"`\n\n\t// HTTPTimeouts allows for customization of the timeout values used by the HTTP RPC\n\t// interface.\n\tHTTPTimeouts rpc.HTTPTimeouts\n\n\t// WSHost is the host interface on which to start the websocket RPC server. If\n\t// this field is empty, no websocket API endpoint will be started.\n\tWSHost string `toml:\",omitempty\"`\n\n\t// WSPort is the TCP port number on which to start the websocket RPC server. The\n\t// default zero value is/ valid and will pick a port number randomly (useful for\n\t// ephemeral nodes).\n\tWSPort int `toml:\",omitempty\"`\n\n\t// WSOrigins is the list of domain to accept websocket requests from. Please be\n\t// aware that the server can only act upon the HTTP request the client sends and\n\t// cannot verify the validity of the request header.\n\tWSOrigins []string `toml:\",omitempty\"`\n\n\t// WSModules is a list of API modules to expose via the websocket RPC interface.\n\t// If the module list is empty, all RPC API endpoints designated public will be\n\t// exposed.\n\tWSModules []string `toml:\",omitempty\"`\n\n\t// WSExposeAll exposes all API modules via the WebSocket RPC interface rather\n\t// than just the public ones.\n\t//\n\t// *WARNING* Only set this if the node is running in a trusted network, exposing\n\t// private APIs to untrusted users is a major security risk.\n\tWSExposeAll bool `toml:\",omitempty\"`\n\n\t// Logger is a custom logger to use with the p2p.Server.\n\tLogger log.Logger `toml:\",omitempty\"`\n}\n\n// IPCEndpoint resolves an IPC endpoint based on a configured value, taking into\n// account the set data folders as well as the designated platform we're currently\n// running on.\nfunc (c *Config) IPCEndpoint() string {\n\t// Short circuit if IPC has not been enabled\n\tif c.IPCPath == \"\" {\n\t\treturn \"\"\n\t}\n\t// On windows we can only use plain top-level pipes\n\tif runtime.GOOS == \"windows\" {\n\t\tif strings.HasPrefix(c.IPCPath, `\\\\.\\pipe\\`) {\n\t\t\treturn c.IPCPath\n\t\t}\n\t\treturn `\\\\.\\pipe\\` + c.IPCPath\n\t}\n\t// Resolve names into the data directory full paths otherwise\n\tif filepath.Base(c.IPCPath) == c.IPCPath {\n\t\tif c.DataDir == \"\" {\n\t\t\treturn filepath.Join(os.TempDir(), c.IPCPath)\n\t\t}\n\t\treturn filepath.Join(c.DataDir, c.IPCPath)\n\t}\n\treturn c.IPCPath\n}\n\n// NodeDB returns the path to the discovery node database.\nfunc (c *Config) NodeDB() string {\n\tif c.DataDir == \"\" {\n\t\treturn \"\" // ephemeral\n\t}\n\treturn c.ResolvePath(datadirNodeDatabase)\n}\n\n// DefaultIPCEndpoint returns the IPC path used by default.\nfunc DefaultIPCEndpoint(clientIdentifier string) string {\n\tif clientIdentifier == \"\" {\n\t\tclientIdentifier = strings.TrimSuffix(filepath.Base(os.Args[0]), \".exe\")\n\t\tif clientIdentifier == \"\" {\n\t\t\tpanic(\"empty executable name\")\n\t\t}\n\t}\n\tconfig := &Config{DataDir: DefaultDataDir(), IPCPath: clientIdentifier + \".ipc\"}\n\treturn config.IPCEndpoint()\n}\n\n// HTTPEndpoint resolves an HTTP endpoint based on the configured host interface\n// and port parameters.\nfunc (c *Config) HTTPEndpoint() string {\n\tif c.HTTPHost == \"\" {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s:%d\", c.HTTPHost, c.HTTPPort)\n}\n\n// DefaultHTTPEndpoint returns the HTTP endpoint used by default.\nfunc DefaultHTTPEndpoint() string {\n\tconfig := &Config{HTTPHost: DefaultHTTPHost, HTTPPort: DefaultHTTPPort}\n\treturn config.HTTPEndpoint()\n}\n\n// WSEndpoint resolves a websocket endpoint based on the configured host interface\n// and port parameters.\nfunc (c *Config) WSEndpoint() string {\n\tif c.WSHost == \"\" {\n\t\treturn \"\"\n\t}\n\treturn fmt.Sprintf(\"%s:%d\", c.WSHost, c.WSPort)\n}\n\n// DefaultWSEndpoint returns the websocket endpoint used by default.\nfunc DefaultWSEndpoint() string {\n\tconfig := &Config{WSHost: DefaultWSHost, WSPort: DefaultWSPort}\n\treturn config.WSEndpoint()\n}\n\n// NodeName returns the devp2p node identifier.\nfunc (c *Config) NodeName() string {\n\tname := c.name()\n\t// Backwards compatibility: previous versions used title-cased \"Geth\", keep that.\n\tif name == \"gero\" || name == \"gero-testnet\" {\n\t\tname = \"Gero\"\n\t}\n\tif c.UserIdent != \"\" {\n\t\tname += \"/\" + c.UserIdent\n\t}\n\tif c.Version != \"\" {\n\t\tname += \"/v\" + c.Version\n\t}\n\tname += \"/\" + runtime.GOOS + \"-\" + runtime.GOARCH\n\tname += \"/\" + runtime.Version()\n\treturn name\n}\n\nfunc (c *Config) name() string {\n\tif c.Name == \"\" {\n\t\tprogname := strings.TrimSuffix(filepath.Base(os.Args[0]), \".exe\")\n\t\tif progname == \"\" {\n\t\t\tpanic(\"empty executable name, set Config.Name\")\n\t\t}\n\t\treturn progname\n\t}\n\treturn c.Name\n}\n\n// These resources are resolved differently for \"gero\" instances.\nvar isOldGethResource = map[string]bool{\n\t\"chaindata\":          true,\n\t\"nodes\":              true,\n\t\"nodekey\":            true,\n\t\"static-nodes.json\":  true,\n\t\"trusted-nodes.json\": true,\n}\n\n// ResolvePath resolves path in the instance directory.\nfunc (c *Config) ResolvePath(path string) string {\n\tif filepath.IsAbs(path) {\n\t\treturn path\n\t}\n\tif c.DataDir == \"\" {\n\t\treturn \"\"\n\t}\n\t// Backwards-compatibility: ensure that data directory files created\n\t// by gero 1.4 are used if they exist.\n\tif c.name() == \"gero\" && isOldGethResource[path] {\n\t\toldpath := \"\"\n\t\tif c.Name == \"gero\" {\n\t\t\toldpath = filepath.Join(c.DataDir, path)\n\t\t}\n\t\tif oldpath != \"\" && common.FileExist(oldpath) {\n\t\t\t// TODO: print warning\n\t\t\treturn oldpath\n\t\t}\n\t}\n\treturn filepath.Join(c.instanceDir(), path)\n}\n\nfunc (c *Config) instanceDir() string {\n\tif c.DataDir == \"\" {\n\t\treturn \"\"\n\t}\n\treturn filepath.Join(c.DataDir, c.name())\n}\n\n// NodeKey retrieves the currently configured private key of the node, checking\n// first any manually set key, falling back to the one found in the configured\n// data folder. If no key can be found, a new one is generated.\nfunc (c *Config) NodeKey() *ecdsa.PrivateKey {\n\t// Use any specifically configured key.\n\tif c.P2P.PrivateKey != nil {\n\t\treturn c.P2P.PrivateKey\n\t}\n\t// Generate ephemeral key if no datadir is being used.\n\tif c.DataDir == \"\" {\n\t\tkey, err := crypto.GenerateKey()\n\t\tif err != nil {\n\t\t\tlog.Crit(fmt.Sprintf(\"Failed to generate ephemeral node key: %v\", err))\n\t\t}\n\t\treturn key\n\t}\n\n\tkeyfile := c.ResolvePath(datadirPrivateKey)\n\tif key, err := crypto.LoadECDSA(keyfile); err == nil {\n\t\treturn key\n\t}\n\t// No persistent key found, generate and store a new one.\n\tkey, err := crypto.GenerateKey()\n\tif err != nil {\n\t\tlog.Crit(fmt.Sprintf(\"Failed to generate node key: %v\", err))\n\t}\n\tinstanceDir := filepath.Join(c.DataDir, c.name())\n\tif err := os.MkdirAll(instanceDir, 0700); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Failed to persist node key: %v\", err))\n\t\treturn key\n\t}\n\tkeyfile = filepath.Join(instanceDir, datadirPrivateKey)\n\tif err := crypto.SaveECDSA(keyfile, key); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Failed to persist node key: %v\", err))\n\t}\n\treturn key\n}\n\n// StaticNodes returns a list of node enode URLs configured as static nodes.\nfunc (c *Config) StaticNodes() []*discover.Node {\n\treturn c.parsePersistentNodes(c.ResolvePath(datadirStaticNodes))\n}\n\n// TrustedNodes returns a list of node enode URLs configured as trusted nodes.\nfunc (c *Config) TrustedNodes() []*discover.Node {\n\treturn c.parsePersistentNodes(c.ResolvePath(datadirTrustedNodes))\n}\n\n// parsePersistentNodes parses a list of discovery node URLs loaded from a .json\n// file from within the data directory.\nfunc (c *Config) parsePersistentNodes(path string) []*discover.Node {\n\t// Short circuit if no node config is present\n\tif c.DataDir == \"\" {\n\t\treturn nil\n\t}\n\tif _, err := os.Stat(path); err != nil {\n\t\treturn nil\n\t}\n\t// Load the nodes from the config file.\n\tvar nodelist []string\n\tif err := common.LoadJSON(path, &nodelist); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Can't load node file %s: %v\", path, err))\n\t\treturn nil\n\t}\n\t// Interpret the list as a discovery node array\n\tvar nodes []*discover.Node\n\tfor _, url := range nodelist {\n\t\tif url == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tnode, err := discover.ParseNode(url)\n\t\tif err != nil {\n\t\t\tlog.Error(fmt.Sprintf(\"Node URL %s: %v\\n\", url, err))\n\t\t\tcontinue\n\t\t}\n\t\tnodes = append(nodes, node)\n\t}\n\treturn nodes\n}\n\n// AccountConfig determines the settings for scrypt and keydirectory\nfunc (c *Config) AccountConfig() (int, int, string, error) {\n\tscryptN := keystore.StandardScryptN\n\tscryptP := keystore.StandardScryptP\n\tif c.UseLightweightKDF {\n\t\tscryptN = keystore.LightScryptN\n\t\tscryptP = keystore.LightScryptP\n\t}\n\n\tvar (\n\t\tkeydir string\n\t\terr    error\n\t)\n\tswitch {\n\tcase filepath.IsAbs(c.KeyStoreDir):\n\t\tkeydir = c.KeyStoreDir\n\tcase c.DataDir != \"\":\n\t\tif c.KeyStoreDir == \"\" {\n\t\t\tkeydir = filepath.Join(c.DataDir, datadirDefaultKeyStore)\n\t\t} else {\n\t\t\tkeydir, err = filepath.Abs(c.KeyStoreDir)\n\t\t}\n\tcase c.KeyStoreDir != \"\":\n\t\tkeydir, err = filepath.Abs(c.KeyStoreDir)\n\t}\n\tzconfig.Init_Data_dir(c.DataDir)\n\treturn scryptN, scryptP, keydir, err\n}\n\nfunc makeAccountManager(conf *Config) (*accounts.Manager, string, error) {\n\tscryptN, scryptP, keydir, err := conf.AccountConfig()\n\tvar ephemeral string\n\tif keydir == \"\" {\n\t\t// There is no datadir.\n\t\tkeydir, err = ioutil.TempDir(\"\", \"go-sero-keystore\")\n\t\tephemeral = keydir\n\t}\n\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\tif err := os.MkdirAll(keydir, 0700); err != nil {\n\t\treturn nil, \"\", err\n\t}\n\t// Assemble the account manager and supported backends\n\tbackends := []accounts.Backend{\n\t\tkeystore.NewKeyStore(keydir, scryptN, scryptP),\n\t}\n\treturn accounts.NewManager(backends...), ephemeral, nil\n}\n"
  },
  {
    "path": "node/defaults.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage node\n\nimport (\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"runtime\"\n\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/nat\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\nconst (\n\tDefaultHTTPHost = \"localhost\" // Default host interface for the HTTP RPC server\n\tDefaultHTTPPort = 8545        // Default TCP port for the HTTP RPC server\n\tDefaultWSHost   = \"localhost\" // Default host interface for the websocket RPC server\n\tDefaultWSPort   = 8546        // Default TCP port for the websocket RPC server\n)\n\n// DefaultConfig contains reasonable default settings.\nvar DefaultConfig = Config{\n\tDataDir:          DefaultDataDir(),\n\tHTTPPort:         DefaultHTTPPort,\n\tHTTPModules:      []string{\"net\", \"web3\"},\n\tHTTPVirtualHosts: []string{\"localhost\"},\n\tHTTPTimeouts:     rpc.DefaultHTTPTimeouts,\n\tWSPort:           DefaultWSPort,\n\tWSModules:        []string{\"net\", \"web3\"},\n\tP2P: p2p.Config{\n\t\tListenAddr: \":53717\",\n\t\tMaxPeers:   25,\n\t\tNAT:        nat.Any(),\n\t},\n}\n\n// DefaultDataDir is the default data directory to use for the databases and other\n// persistence requirements.\nfunc DefaultDataDir() string {\n\t// Try to place the data folder in the user's home dir\n\thome := homeDir()\n\tif home != \"\" {\n\t\tif runtime.GOOS == \"darwin\" {\n\t\t\treturn filepath.Join(home, \"Library\", \"Sero\")\n\t\t} else if runtime.GOOS == \"windows\" {\n\t\t\treturn filepath.Join(home, \"AppData\", \"Roaming\", \"Sero\")\n\t\t} else {\n\t\t\treturn filepath.Join(home, \".sero\")\n\t\t}\n\t}\n\t// As we cannot guess a stable location, return empty and handle later\n\treturn \"\"\n}\n\nfunc homeDir() string {\n\tif home := os.Getenv(\"HOME\"); home != \"\" {\n\t\treturn home\n\t}\n\tif usr, err := user.Current(); err == nil {\n\t\treturn usr.HomeDir\n\t}\n\treturn \"\"\n}\n"
  },
  {
    "path": "node/doc.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\nPackage node sets up multi-protocol Ethereum nodes.\n\nIn the model exposed by this package, a node is a collection of services which use shared\nresources to provide RPC APIs. Services can also offer devp2p protocols, which are wired\nup to the devp2p network when the node instance is started.\n\n\nResources Managed By Node\n\nAll file-system resources used by a node instance are located in a directory called the\ndata directory. The location of each resource can be overridden through additional node\nconfiguration. The data directory is optional. If it is not set and the location of a\nresource is otherwise unspecified, package node will create the resource in memory.\n\nTo access to the devp2p network, Node configures and starts p2p.Server. Each host on the\ndevp2p network has a unique identifier, the node key. The Node instance persists this key\nacross restarts. Node also loads static and trusted node lists and ensures that knowledge\nabout other hosts is persisted.\n\nJSON-RPC servers which run HTTP, WebSocket or IPC can be started on a Node. RPC modules\noffered by registered services will be offered on those endpoints. Users can restrict any\nendpoint to a subset of RPC modules. Node itself offers the \"debug\", \"admin\" and \"web3\"\nmodules.\n\nService implementations can open LevelDB databases through the service context. Package\nnode chooses the file system location of each database. If the node is configured to run\nwithout a data directory, databases are opened in memory instead.\n\nNode also creates the shared store of encrypted Ethereum account keys. Services can access\nthe account manager through the service context.\n\n\nSharing Data Directory Among Instances\n\nMultiple node instances can share a single data directory if they have distinct instance\nnames (set through the Name config option). Sharing behaviour depends on the type of\nresource.\n\ndevp2p-related resources (node key, static/trusted node lists, known hosts database) are\nstored in a directory with the same name as the instance. Thus, multiple node instances\nusing the same data directory will store this information in different subdirectories of\nthe data directory.\n\nLevelDB databases are also stored within the instance subdirectory. If multiple node\ninstances use the same data directory, opening the databases with identical names will\ncreate one database for each instance.\n\nThe account key store is shared among all node instances using the same data directory\nunless its location is changed through the KeyStoreDir configuration option.\n\n\nData Directory Sharing Example\n\nIn this example, two node instances named A and B are started with the same data\ndirectory. Node instance A opens the database \"db\", node instance B opens the databases\n\"db\" and \"db-2\". The following files will be created in the data directory:\n\n   data-directory/\n        A/\n            nodekey            -- devp2p node key of instance A\n            nodes/             -- devp2p discovery knowledge database of instance A\n            db/                -- LevelDB content for \"db\"\n        A.ipc                  -- JSON-RPC UNIX domain socket endpoint of instance A\n        B/\n            nodekey            -- devp2p node key of node B\n            nodes/             -- devp2p discovery knowledge database of instance B\n            static-nodes.json  -- devp2p static node list of instance B\n            db/                -- LevelDB content for \"db\"\n            db-2/              -- LevelDB content for \"db-2\"\n        B.ipc                  -- JSON-RPC UNIX domain socket endpoint of instance B\n        keystore/              -- account key store, used by both instances\n*/\npackage node\n"
  },
  {
    "path": "node/errors.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage node\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"syscall\"\n)\n\nvar (\n\tErrDatadirUsed    = errors.New(\"datadir already used by another process\")\n\tErrNodeStopped    = errors.New(\"node not started\")\n\tErrNodeRunning    = errors.New(\"node already running\")\n\tErrServiceUnknown = errors.New(\"unknown service\")\n\n\tdatadirInUseErrnos = map[uint]bool{11: true, 32: true, 35: true}\n)\n\nfunc convertFileLockError(err error) error {\n\tif errno, ok := err.(syscall.Errno); ok && datadirInUseErrnos[uint(errno)] {\n\t\treturn ErrDatadirUsed\n\t}\n\treturn err\n}\n\n// DuplicateServiceError is returned during Node startup if a registered service\n// constructor returns a service of the same type that was already started.\ntype DuplicateServiceError struct {\n\tKind reflect.Type\n}\n\n// Error generates a textual representation of the duplicate service error.\nfunc (e *DuplicateServiceError) Error() string {\n\treturn fmt.Sprintf(\"duplicate service: %v\", e.Kind)\n}\n\n// StopError is returned if a Node fails to stop either any of its registered\n// services or itself.\ntype StopError struct {\n\tServer   error\n\tServices map[reflect.Type]error\n}\n\n// Error generates a textual representation of the stop error.\nfunc (e *StopError) Error() string {\n\treturn fmt.Sprintf(\"server: %v, services: %v\", e.Server, e.Services)\n}\n"
  },
  {
    "path": "node/node.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage node\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/prometheus/prometheus/util/flock\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/internal/debug\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Node is a container on which services can be registered.\ntype Node struct {\n\teventmux *event.TypeMux // Event multiplexer used between the services of a stack\n\tconfig   *Config\n\taccman   *accounts.Manager\n\n\tephemeralKeystore string         // if non-empty, the key directory that will be removed by Stop\n\tinstanceDirLock   flock.Releaser // prevents concurrent use of instance directory\n\n\tserverConfig p2p.Config\n\tserver       *p2p.Server // Currently running P2P networking layer\n\n\tserviceFuncs []ServiceConstructor     // Service constructors (in dependency order)\n\tservices     map[reflect.Type]Service // Currently running services\n\n\trpcAPIs       []rpc.API   // List of APIs currently provided by the node\n\tinprocHandler *rpc.Server // In-process RPC request handler to process the API requests\n\n\tipcEndpoint string       // IPC endpoint to listen at (empty = IPC disabled)\n\tipcListener net.Listener // IPC RPC listener socket to serve API requests\n\tipcHandler  *rpc.Server  // IPC RPC request handler to process the API requests\n\n\thttpEndpoint  string       // HTTP endpoint (interface + port) to listen at (empty = HTTP disabled)\n\thttpWhitelist []string     // HTTP RPC modules to allow through this endpoint\n\thttpListener  net.Listener // HTTP RPC listener socket to server API requests\n\thttpHandler   *rpc.Server  // HTTP RPC request handler to process the API requests\n\n\twsEndpoint string       // Websocket endpoint (interface + port) to listen at (empty = websocket disabled)\n\twsListener net.Listener // Websocket RPC listener socket to server API requests\n\twsHandler  *rpc.Server  // Websocket RPC request handler to process the API requests\n\n\tstop chan struct{} // Channel to wait for termination notifications\n\tlock sync.RWMutex\n\n\tlog log.Logger\n}\n\n// New creates a new P2P node, ready for protocol registration.\nfunc New(conf *Config) (*Node, error) {\n\t// Copy config and resolve the datadir so future changes to the current\n\t// working directory don't affect the node.\n\tconfCopy := *conf\n\tconf = &confCopy\n\tif conf.DataDir != \"\" {\n\t\tabsdatadir, err := filepath.Abs(conf.DataDir)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tconf.DataDir = absdatadir\n\t}\n\t// Ensure that the instance name doesn't cause weird conflicts with\n\t// other files in the data directory.\n\tif strings.ContainsAny(conf.Name, `/\\`) {\n\t\treturn nil, errors.New(`Config.Name must not contain '/' or '\\'`)\n\t}\n\tif conf.Name == datadirDefaultKeyStore {\n\t\treturn nil, errors.New(`Config.Name cannot be \"` + datadirDefaultKeyStore + `\"`)\n\t}\n\tif strings.HasSuffix(conf.Name, \".ipc\") {\n\t\treturn nil, errors.New(`Config.Name cannot end in \".ipc\"`)\n\t}\n\t// Ensure that the AccountManager method works before the node has started.\n\t// We rely on this in cmd/gero.\n\tam, ephemeralKeystore, err := makeAccountManager(conf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif conf.Logger == nil {\n\t\tconf.Logger = log.New()\n\t}\n\t// Note: any interaction with Config that would create/touch files\n\t// in the data directory or instance directory is delayed until Start.\n\treturn &Node{\n\t\taccman:            am,\n\t\tephemeralKeystore: ephemeralKeystore,\n\t\tconfig:            conf,\n\t\tserviceFuncs:      []ServiceConstructor{},\n\t\tipcEndpoint:       conf.IPCEndpoint(),\n\t\thttpEndpoint:      conf.HTTPEndpoint(),\n\t\twsEndpoint:        conf.WSEndpoint(),\n\t\teventmux:          new(event.TypeMux),\n\t\tlog:               conf.Logger,\n\t}, nil\n}\n\n// Register injects a new service into the node's stack. The service created by\n// the passed constructor must be unique in its type with regard to sibling ones.\nfunc (n *Node) Register(constructor ServiceConstructor) error {\n\tn.lock.Lock()\n\tdefer n.lock.Unlock()\n\n\tif n.server != nil {\n\t\treturn ErrNodeRunning\n\t}\n\tn.serviceFuncs = append(n.serviceFuncs, constructor)\n\treturn nil\n}\n\n// Start create a live P2P node and starts running it.\nfunc (n *Node) Start() error {\n\tn.lock.Lock()\n\tdefer n.lock.Unlock()\n\n\t// Short circuit if the node's already running\n\tif n.server != nil {\n\t\treturn ErrNodeRunning\n\t}\n\tif err := n.openDataDir(); err != nil {\n\t\treturn err\n\t}\n\n\t// Initialize the p2p server. This creates the node key and\n\t// discovery databases.\n\tn.serverConfig = n.config.P2P\n\tn.serverConfig.PrivateKey = n.config.NodeKey()\n\tn.serverConfig.Name = n.config.NodeName()\n\tn.serverConfig.Logger = n.log\n\tif n.serverConfig.StaticNodes == nil {\n\t\tn.serverConfig.StaticNodes = n.config.StaticNodes()\n\t}\n\tif n.serverConfig.TrustedNodes == nil {\n\t\tn.serverConfig.TrustedNodes = n.config.TrustedNodes()\n\t}\n\tif n.serverConfig.NodeDatabase == \"\" {\n\t\tn.serverConfig.NodeDatabase = n.config.NodeDB()\n\t}\n\trunning := &p2p.Server{Config: n.serverConfig}\n\tn.log.Info(\"Starting peer-to-peer node\", \"instance\", n.serverConfig.Name)\n\n\t// Otherwise copy and specialize the P2P configuration\n\tservices := make(map[reflect.Type]Service)\n\tfor _, constructor := range n.serviceFuncs {\n\t\t// Create a new context for the particular service\n\t\tctx := &ServiceContext{\n\t\t\tconfig:         n.config,\n\t\t\tservices:       make(map[reflect.Type]Service),\n\t\t\tEventMux:       n.eventmux,\n\t\t\tAccountManager: n.accman,\n\t\t}\n\t\tfor kind, s := range services { // copy needed for threaded access\n\t\t\tctx.services[kind] = s\n\t\t}\n\t\t// Construct and save the service\n\t\tservice, err := constructor(ctx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tkind := reflect.TypeOf(service)\n\t\tif _, exists := services[kind]; exists {\n\t\t\treturn &DuplicateServiceError{Kind: kind}\n\t\t}\n\t\tservices[kind] = service\n\t}\n\t// Gather the protocols and start the freshly assembled P2P server\n\tfor _, service := range services {\n\t\trunning.Protocols = append(running.Protocols, service.Protocols()...)\n\t}\n\tif err := running.Start(); err != nil {\n\t\treturn convertFileLockError(err)\n\t}\n\t// Start each of the services\n\tstarted := []reflect.Type{}\n\tfor kind, service := range services {\n\t\t// Start the next service, stopping all previous upon failure\n\t\tif err := service.Start(running); err != nil {\n\t\t\tfor _, kind := range started {\n\t\t\t\tservices[kind].Stop()\n\t\t\t}\n\t\t\trunning.Stop()\n\n\t\t\treturn err\n\t\t}\n\t\t// Mark the service started for potential cleanup\n\t\tstarted = append(started, kind)\n\t}\n\t// Lastly start the configured RPC interfaces\n\tif err := n.startRPC(services); err != nil {\n\t\tfor _, service := range services {\n\t\t\tservice.Stop()\n\t\t}\n\t\trunning.Stop()\n\t\treturn err\n\t}\n\t// Finish initializing the startup\n\tn.services = services\n\tn.server = running\n\tn.stop = make(chan struct{})\n\n\treturn nil\n}\n\nfunc (n *Node) openDataDir() error {\n\tif n.config.DataDir == \"\" {\n\t\treturn nil // ephemeral\n\t}\n\n\tinstdir := filepath.Join(n.config.DataDir, n.config.name())\n\tif err := os.MkdirAll(instdir, 0700); err != nil {\n\t\treturn err\n\t}\n\t// Lock the instance directory to prevent concurrent use by another instance as well as\n\t// accidental use of the instance directory as a database.\n\trelease, _, err := flock.New(filepath.Join(instdir, \"LOCK\"))\n\tif err != nil {\n\t\treturn convertFileLockError(err)\n\t}\n\tn.instanceDirLock = release\n\treturn nil\n}\n\n// startRPC is a helper method to start all the various RPC endpoint during node\n// startup. It's not meant to be called at any time afterwards as it makes certain\n// assumptions about the state of the node.\nfunc (n *Node) startRPC(services map[reflect.Type]Service) error {\n\t// Gather all the possible APIs to surface\n\tapis := n.apis()\n\tfor _, service := range services {\n\t\tapis = append(apis, service.APIs()...)\n\t}\n\t// Start the various API endpoints, terminating all in case of errors\n\tif err := n.startInProc(apis); err != nil {\n\t\treturn err\n\t}\n\tif err := n.startIPC(apis); err != nil {\n\t\tn.stopInProc()\n\t\treturn err\n\t}\n\tif err := n.startHTTP(n.httpEndpoint, apis, n.config.HTTPModules, n.config.HTTPCors, n.config.HTTPVirtualHosts, n.config.HTTPTimeouts); err != nil {\n\t\tn.stopIPC()\n\t\tn.stopInProc()\n\t\treturn err\n\t}\n\tif err := n.startWS(n.wsEndpoint, apis, n.config.WSModules, n.config.WSOrigins, n.config.WSExposeAll); err != nil {\n\t\tn.stopHTTP()\n\t\tn.stopIPC()\n\t\tn.stopInProc()\n\t\treturn err\n\t}\n\t// All API endpoints started successfully\n\tn.rpcAPIs = apis\n\treturn nil\n}\n\n// startInProc initializes an in-process RPC endpoint.\nfunc (n *Node) startInProc(apis []rpc.API) error {\n\t// Register all the APIs exposed by the services\n\thandler := rpc.NewServer()\n\tfor _, api := range apis {\n\t\tif err := handler.RegisterName(api.Namespace, api.Service); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tn.log.Debug(\"InProc registered\", \"service\", api.Service, \"namespace\", api.Namespace)\n\t}\n\tn.inprocHandler = handler\n\treturn nil\n}\n\n// stopInProc terminates the in-process RPC endpoint.\nfunc (n *Node) stopInProc() {\n\tif n.inprocHandler != nil {\n\t\tn.inprocHandler.Stop()\n\t\tn.inprocHandler = nil\n\t}\n}\n\n// startIPC initializes and starts the IPC RPC endpoint.\nfunc (n *Node) startIPC(apis []rpc.API) error {\n\tif n.ipcEndpoint == \"\" {\n\t\treturn nil // IPC disabled.\n\t}\n\tlistener, handler, err := rpc.StartIPCEndpoint(n.ipcEndpoint, apis)\n\tif err != nil {\n\t\treturn err\n\t}\n\tn.ipcListener = listener\n\tn.ipcHandler = handler\n\tn.log.Info(\"IPC endpoint opened\", \"url\", n.ipcEndpoint)\n\treturn nil\n}\n\n// stopIPC terminates the IPC RPC endpoint.\nfunc (n *Node) stopIPC() {\n\tif n.ipcListener != nil {\n\t\tn.ipcListener.Close()\n\t\tn.ipcListener = nil\n\n\t\tn.log.Info(\"IPC endpoint closed\", \"endpoint\", n.ipcEndpoint)\n\t}\n\tif n.ipcHandler != nil {\n\t\tn.ipcHandler.Stop()\n\t\tn.ipcHandler = nil\n\t}\n}\n\n// startHTTP initializes and starts the HTTP RPC endpoint.\nfunc (n *Node) startHTTP(endpoint string, apis []rpc.API, modules []string, cors []string, vhosts []string, timeouts rpc.HTTPTimeouts) error {\n\t// Short circuit if the HTTP endpoint isn't being exposed\n\tif endpoint == \"\" {\n\t\treturn nil\n\t}\n\tlistener, handler, err := rpc.StartHTTPEndpoint(endpoint, apis, modules, cors, vhosts, timeouts)\n\tif err != nil {\n\t\treturn err\n\t}\n\tn.log.Info(\"HTTP endpoint opened\", \"url\", fmt.Sprintf(\"http://%s\", endpoint), \"cors\", strings.Join(cors, \",\"), \"vhosts\", strings.Join(vhosts, \",\"))\n\t// All listeners booted successfully\n\tn.httpEndpoint = endpoint\n\tn.httpListener = listener\n\tn.httpHandler = handler\n\n\treturn nil\n}\n\n// stopHTTP terminates the HTTP RPC endpoint.\nfunc (n *Node) stopHTTP() {\n\tif n.httpListener != nil {\n\t\tn.httpListener.Close()\n\t\tn.httpListener = nil\n\n\t\tn.log.Info(\"HTTP endpoint closed\", \"url\", fmt.Sprintf(\"http://%s\", n.httpEndpoint))\n\t}\n\tif n.httpHandler != nil {\n\t\tn.httpHandler.Stop()\n\t\tn.httpHandler = nil\n\t}\n}\n\n// startWS initializes and starts the websocket RPC endpoint.\nfunc (n *Node) startWS(endpoint string, apis []rpc.API, modules []string, wsOrigins []string, exposeAll bool) error {\n\t// Short circuit if the WS endpoint isn't being exposed\n\tif endpoint == \"\" {\n\t\treturn nil\n\t}\n\tlistener, handler, err := rpc.StartWSEndpoint(endpoint, apis, modules, wsOrigins, exposeAll)\n\tif err != nil {\n\t\treturn err\n\t}\n\tn.log.Info(\"WebSocket endpoint opened\", \"url\", fmt.Sprintf(\"ws://%s\", listener.Addr()))\n\t// All listeners booted successfully\n\tn.wsEndpoint = endpoint\n\tn.wsListener = listener\n\tn.wsHandler = handler\n\n\treturn nil\n}\n\n// stopWS terminates the websocket RPC endpoint.\nfunc (n *Node) stopWS() {\n\tif n.wsListener != nil {\n\t\tn.wsListener.Close()\n\t\tn.wsListener = nil\n\n\t\tn.log.Info(\"WebSocket endpoint closed\", \"url\", fmt.Sprintf(\"ws://%s\", n.wsEndpoint))\n\t}\n\tif n.wsHandler != nil {\n\t\tn.wsHandler.Stop()\n\t\tn.wsHandler = nil\n\t}\n}\n\n// Stop terminates a running node along with all it's services. In the node was\n// not started, an error is returned.\nfunc (n *Node) Stop() error {\n\tn.lock.Lock()\n\tdefer n.lock.Unlock()\n\n\t// Short circuit if the node's not running\n\tif n.server == nil {\n\t\treturn ErrNodeStopped\n\t}\n\n\t// Terminate the API, services and the p2p server.\n\tn.stopWS()\n\tn.stopHTTP()\n\tn.stopIPC()\n\tn.rpcAPIs = nil\n\tfailure := &StopError{\n\t\tServices: make(map[reflect.Type]error),\n\t}\n\tfor kind, service := range n.services {\n\t\tif err := service.Stop(); err != nil {\n\t\t\tfailure.Services[kind] = err\n\t\t}\n\t}\n\tn.server.Stop()\n\tn.services = nil\n\tn.server = nil\n\n\t// Release instance directory lock.\n\tif n.instanceDirLock != nil {\n\t\tif err := n.instanceDirLock.Release(); err != nil {\n\t\t\tn.log.Error(\"Can't release datadir lock\", \"err\", err)\n\t\t}\n\t\tn.instanceDirLock = nil\n\t}\n\n\t// unblock n.Wait\n\tclose(n.stop)\n\n\t// Remove the keystore if it was created ephemerally.\n\tvar keystoreErr error\n\tif n.ephemeralKeystore != \"\" {\n\t\tkeystoreErr = os.RemoveAll(n.ephemeralKeystore)\n\t}\n\n\tif len(failure.Services) > 0 {\n\t\treturn failure\n\t}\n\tif keystoreErr != nil {\n\t\treturn keystoreErr\n\t}\n\treturn nil\n}\n\n// Wait blocks the thread until the node is stopped. If the node is not running\n// at the time of invocation, the method immediately returns.\nfunc (n *Node) Wait() {\n\tn.lock.RLock()\n\tif n.server == nil {\n\t\tn.lock.RUnlock()\n\t\treturn\n\t}\n\tstop := n.stop\n\tn.lock.RUnlock()\n\n\t<-stop\n}\n\n// Restart terminates a running node and boots up a new one in its place. If the\n// node isn't running, an error is returned.\nfunc (n *Node) Restart() error {\n\tif err := n.Stop(); err != nil {\n\t\treturn err\n\t}\n\tif err := n.Start(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Attach creates an RPC client attached to an in-process API handler.\nfunc (n *Node) Attach() (*rpc.Client, error) {\n\tn.lock.RLock()\n\tdefer n.lock.RUnlock()\n\n\tif n.server == nil {\n\t\treturn nil, ErrNodeStopped\n\t}\n\treturn rpc.DialInProc(n.inprocHandler), nil\n}\n\n// RPCHandler returns the in-process RPC request handler.\nfunc (n *Node) RPCHandler() (*rpc.Server, error) {\n\tn.lock.RLock()\n\tdefer n.lock.RUnlock()\n\n\tif n.inprocHandler == nil {\n\t\treturn nil, ErrNodeStopped\n\t}\n\treturn n.inprocHandler, nil\n}\n\n// Server retrieves the currently running P2P network layer. This method is meant\n// only to inspect fields of the currently running server, life cycle management\n// should be left to this Node entity.\nfunc (n *Node) Server() *p2p.Server {\n\tn.lock.RLock()\n\tdefer n.lock.RUnlock()\n\n\treturn n.server\n}\n\n// Service retrieves a currently running service registered of a specific type.\nfunc (n *Node) Service(service interface{}) error {\n\tn.lock.RLock()\n\tdefer n.lock.RUnlock()\n\n\t// Short circuit if the node's not running\n\tif n.server == nil {\n\t\treturn ErrNodeStopped\n\t}\n\t// Otherwise try to find the service to return\n\telement := reflect.ValueOf(service).Elem()\n\tif running, ok := n.services[element.Type()]; ok {\n\t\telement.Set(reflect.ValueOf(running))\n\t\treturn nil\n\t}\n\treturn ErrServiceUnknown\n}\n\n// DataDir retrieves the current datadir used by the protocol stack.\n// Deprecated: No files should be stored in this directory, use InstanceDir instead.\nfunc (n *Node) DataDir() string {\n\treturn n.config.DataDir\n}\n\n// InstanceDir retrieves the instance directory used by the protocol stack.\nfunc (n *Node) InstanceDir() string {\n\treturn n.config.instanceDir()\n}\n\n// AccountManager retrieves the account manager used by the protocol stack.\nfunc (n *Node) AccountManager() *accounts.Manager {\n\treturn n.accman\n}\n\n// IPCEndpoint retrieves the current IPC endpoint used by the protocol stack.\nfunc (n *Node) IPCEndpoint() string {\n\treturn n.ipcEndpoint\n}\n\n// HTTPEndpoint retrieves the current HTTP endpoint used by the protocol stack.\nfunc (n *Node) HTTPEndpoint() string {\n\treturn n.httpEndpoint\n}\n\n// WSEndpoint retrieves the current WS endpoint used by the protocol stack.\nfunc (n *Node) WSEndpoint() string {\n\treturn n.wsEndpoint\n}\n\n// EventMux retrieves the event multiplexer used by all the network services in\n// the current protocol stack.\nfunc (n *Node) EventMux() *event.TypeMux {\n\treturn n.eventmux\n}\n\n// OpenDatabase opens an existing database with the given name (or creates one if no\n// previous can be found) from within the node's instance directory. If the node is\n// ephemeral, a memory database is returned.\nfunc (n *Node) OpenDatabase(name string, cache, handles int) (serodb.Database, error) {\n\tif n.config.DataDir == \"\" {\n\t\treturn serodb.NewMemDatabase(), nil\n\t}\n\treturn serodb.NewLDBDatabase(n.config.ResolvePath(name), cache, handles)\n}\n\n// ResolvePath returns the absolute path of a resource in the instance directory.\nfunc (n *Node) ResolvePath(x string) string {\n\treturn n.config.ResolvePath(x)\n}\n\n// apis returns the collection of RPC descriptors this node offers.\nfunc (n *Node) apis() []rpc.API {\n\treturn []rpc.API{\n\t\t{\n\t\t\tNamespace: \"admin\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPrivateAdminAPI(n),\n\t\t}, {\n\t\t\tNamespace: \"admin\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicAdminAPI(n),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"debug\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   debug.Handler,\n\t\t}, {\n\t\t\tNamespace: \"debug\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicDebugAPI(n),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"web3\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicWeb3API(n),\n\t\t\tPublic:    true,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "node/service.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage node\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// ServiceContext is a collection of service independent options inherited from\n// the protocol stack, that is passed to all constructors to be optionally used;\n// as well as utility methods to operate on the service environment.\ntype ServiceContext struct {\n\tconfig         *Config\n\tservices       map[reflect.Type]Service // Index of the already constructed services\n\tEventMux       *event.TypeMux           // Event multiplexer used for decoupled notifications\n\tAccountManager *accounts.Manager        // Account manager created by the node.\n}\n\n// OpenDatabase opens an existing database with the given name (or creates one\n// if no previous can be found) from within the node's data directory. If the\n// node is an ephemeral one, a memory database is returned.\nfunc (ctx *ServiceContext) OpenDatabase(name string, cache int, handles int) (serodb.Database, error) {\n\tif ctx.config.DataDir == \"\" {\n\t\treturn serodb.NewMemDatabase(), nil\n\t}\n\tdb, err := serodb.NewLDBDatabase(ctx.config.ResolvePath(name), cache, handles)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn db, nil\n}\n\n// ResolvePath resolves a user path into the data directory if that was relative\n// and if the user actually uses persistent storage. It will return an empty string\n// for emphemeral storage and the user's own input for absolute paths.\nfunc (ctx *ServiceContext) ResolvePath(path string) string {\n\treturn ctx.config.ResolvePath(path)\n}\n\n// Service retrieves a currently running service registered of a specific type.\nfunc (ctx *ServiceContext) Service(service interface{}) error {\n\telement := reflect.ValueOf(service).Elem()\n\tif running, ok := ctx.services[element.Type()]; ok {\n\t\telement.Set(reflect.ValueOf(running))\n\t\treturn nil\n\t}\n\treturn ErrServiceUnknown\n}\n\n// ServiceConstructor is the function signature of the constructors needed to be\n// registered for service instantiation.\ntype ServiceConstructor func(ctx *ServiceContext) (Service, error)\n\n// Service is an individual protocol that can be registered into a node.\n//\n// Notes:\n//\n// • Service life-cycle management is delegated to the node. The service is allowed to\n// initialize itself upon creation, but no goroutines should be spun up outside of the\n// Start method.\n//\n// • Restart logic is not required as the node will create a fresh instance\n// every time a service is started.\ntype Service interface {\n\t// Protocols retrieves the P2P protocols the service wishes to start.\n\tProtocols() []p2p.Protocol\n\n\t// APIs retrieves the list of RPC descriptors the service provides\n\tAPIs() []rpc.API\n\n\t// Start is called after all services have been constructed and the networking\n\t// layer was also initialized to spawn any goroutines required by the service.\n\tStart(server *p2p.Server) error\n\n\t// Stop terminates all goroutines belonging to the service, blocking until they\n\t// are all terminated.\n\tStop() error\n}\n"
  },
  {
    "path": "p2p/dial.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage p2p\n\nimport (\n\t\"container/heap\"\n\t\"crypto/rand\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n)\n\nconst (\n\t// This is the amount of time spent waiting in between\n\t// redialing a certain node.\n\tdialHistoryExpiration = 30 * time.Second\n\n\t// Discovery lookups are throttled and can only run\n\t// once every few seconds.\n\tlookupInterval = 4 * time.Second\n\n\t// If no peers are found for this amount of time, the initial bootnodes are\n\t// attempted to be connected.\n\tfallbackInterval = 20 * time.Second\n\n\t// Endpoint resolution is throttled with bounded backoff.\n\tinitialResolveDelay = 60 * time.Second\n\tmaxResolveDelay     = time.Hour\n)\n\n// NodeDialer is used to connect to nodes in the network, typically by using\n// an underlying net.Dialer but also using net.Pipe in tests\ntype NodeDialer interface {\n\tDial(*discover.Node) (net.Conn, error)\n}\n\n// TCPDialer implements the NodeDialer interface by using a net.Dialer to\n// create TCP connections to nodes in the network\ntype TCPDialer struct {\n\t*net.Dialer\n}\n\n// Dial creates a TCP connection to the node\nfunc (t TCPDialer) Dial(dest *discover.Node) (net.Conn, error) {\n\taddr := &net.TCPAddr{IP: dest.IP, Port: int(dest.TCP)}\n\treturn t.Dialer.Dial(\"tcp\", addr.String())\n}\n\n// dialstate schedules dials and discovery lookups.\n// it get's a chance to compute new tasks on every iteration\n// of the main loop in Server.run.\ntype dialstate struct {\n\tmaxDynDials int\n\tntab        discoverTable\n\tnetrestrict *netutil.Netlist\n\n\tlookupRunning bool\n\tdialing       map[discover.NodeID]connFlag\n\tlookupBuf     []*discover.Node // current discovery lookup results\n\trandomNodes   []*discover.Node // filled from Table\n\tstatic        map[discover.NodeID]*dialTask\n\thist          *dialHistory\n\n\tstart     time.Time        // time when the dialer was first used\n\tbootnodes []*discover.Node // default dials when there are no peers\n}\n\ntype discoverTable interface {\n\tSelf() *discover.Node\n\tClose()\n\tResolve(target discover.NodeID) *discover.Node\n\tLookup(target discover.NodeID) []*discover.Node\n\tReadRandomNodes([]*discover.Node) int\n}\n\n// the dial history remembers recent dials.\ntype dialHistory []pastDial\n\n// pastDial is an entry in the dial history.\ntype pastDial struct {\n\tid  discover.NodeID\n\texp time.Time\n}\n\ntype task interface {\n\tDo(*Server)\n}\n\n// A dialTask is generated for each node that is dialed. Its\n// fields cannot be accessed while the task is running.\ntype dialTask struct {\n\tflags        connFlag\n\tdest         *discover.Node\n\tlastResolved time.Time\n\tresolveDelay time.Duration\n}\n\n// discoverTask runs discovery table operations.\n// Only one discoverTask is active at any time.\n// discoverTask.Do performs a random lookup.\ntype discoverTask struct {\n\tresults []*discover.Node\n}\n\n// A waitExpireTask is generated if there are no other tasks\n// to keep the loop in Server.run ticking.\ntype waitExpireTask struct {\n\ttime.Duration\n}\n\nfunc newDialState(static []*discover.Node, bootnodes []*discover.Node, ntab discoverTable, maxdyn int, netrestrict *netutil.Netlist) *dialstate {\n\ts := &dialstate{\n\t\tmaxDynDials: maxdyn,\n\t\tntab:        ntab,\n\t\tnetrestrict: netrestrict,\n\t\tstatic:      make(map[discover.NodeID]*dialTask),\n\t\tdialing:     make(map[discover.NodeID]connFlag),\n\t\tbootnodes:   make([]*discover.Node, len(bootnodes)),\n\t\trandomNodes: make([]*discover.Node, maxdyn/2),\n\t\thist:        new(dialHistory),\n\t}\n\tcopy(s.bootnodes, bootnodes)\n\tfor _, n := range static {\n\t\ts.addStatic(n)\n\t}\n\treturn s\n}\n\nfunc (s *dialstate) addStatic(n *discover.Node) {\n\t// This overwites the task instead of updating an existing\n\t// entry, giving users the opportunity to force a resolve operation.\n\ts.static[n.ID] = &dialTask{flags: staticDialedConn, dest: n}\n}\n\nfunc (s *dialstate) removeStatic(n *discover.Node) {\n\t// This removes a task so future attempts to connect will not be made.\n\tdelete(s.static, n.ID)\n\t// This removes a previous dial timestamp so that application\n\t// can force a server to reconnect with chosen peer immediately.\n\ts.hist.remove(n.ID)\n}\n\nfunc (s *dialstate) newTasks(nRunning int, peers map[discover.NodeID]*Peer, now time.Time) []task {\n\tif s.start.IsZero() {\n\t\ts.start = now\n\t}\n\n\tvar newtasks []task\n\taddDial := func(flag connFlag, n *discover.Node) bool {\n\t\tif err := s.checkDial(n, peers); err != nil {\n\t\t\tlog.Trace(\"Skipping dial candidate\", \"id\", n.ID, \"addr\", &net.TCPAddr{IP: n.IP, Port: int(n.TCP)}, \"err\", err)\n\t\t\treturn false\n\t\t}\n\t\ts.dialing[n.ID] = flag\n\t\tnewtasks = append(newtasks, &dialTask{flags: flag, dest: n})\n\t\treturn true\n\t}\n\n\t// Compute number of dynamic dials necessary at this point.\n\tneedDynDials := s.maxDynDials\n\tfor _, p := range peers {\n\t\tif p.rw.is(dynDialedConn) {\n\t\t\tneedDynDials--\n\t\t}\n\t}\n\tfor _, flag := range s.dialing {\n\t\tif flag&dynDialedConn != 0 {\n\t\t\tneedDynDials--\n\t\t}\n\t}\n\n\t// Expire the dial history on every invocation.\n\ts.hist.expire(now)\n\n\t// Create dials for static nodes if they are not connected.\n\tfor id, t := range s.static {\n\t\terr := s.checkDial(t.dest, peers)\n\t\tswitch err {\n\t\tcase errNotWhitelisted, errSelf:\n\t\t\tlog.Warn(\"Removing static dial candidate\", \"id\", t.dest.ID, \"addr\", &net.TCPAddr{IP: t.dest.IP, Port: int(t.dest.TCP)}, \"err\", err)\n\t\t\tdelete(s.static, t.dest.ID)\n\t\tcase nil:\n\t\t\ts.dialing[id] = t.flags\n\t\t\tnewtasks = append(newtasks, t)\n\t\t}\n\t}\n\t// If we don't have any peers whatsoever, try to dial a random bootnode. This\n\t// scenario is useful for the testnet (and private networks) where the discovery\n\t// table might be full of mostly bad peers, making it hard to find good ones.\n\tif len(peers) == 0 && len(s.bootnodes) > 0 && needDynDials > 0 && now.Sub(s.start) > fallbackInterval {\n\t\tbootnode := s.bootnodes[0]\n\t\ts.bootnodes = append(s.bootnodes[:0], s.bootnodes[1:]...)\n\t\ts.bootnodes = append(s.bootnodes, bootnode)\n\n\t\tif addDial(dynDialedConn, bootnode) {\n\t\t\tneedDynDials--\n\t\t}\n\t}\n\t// Use random nodes from the table for half of the necessary\n\t// dynamic dials.\n\trandomCandidates := needDynDials / 2\n\tif randomCandidates > 0 {\n\t\tn := s.ntab.ReadRandomNodes(s.randomNodes)\n\t\tfor i := 0; i < randomCandidates && i < n; i++ {\n\t\t\tif addDial(dynDialedConn, s.randomNodes[i]) {\n\t\t\t\tneedDynDials--\n\t\t\t}\n\t\t}\n\t}\n\t// Create dynamic dials from random lookup results, removing tried\n\t// items from the result buffer.\n\ti := 0\n\tfor ; i < len(s.lookupBuf) && needDynDials > 0; i++ {\n\t\tif addDial(dynDialedConn, s.lookupBuf[i]) {\n\t\t\tneedDynDials--\n\t\t}\n\t}\n\ts.lookupBuf = s.lookupBuf[:copy(s.lookupBuf, s.lookupBuf[i:])]\n\t// Launch a discovery lookup if more candidates are needed.\n\tif len(s.lookupBuf) < needDynDials && !s.lookupRunning {\n\t\ts.lookupRunning = true\n\t\tnewtasks = append(newtasks, &discoverTask{})\n\t}\n\n\t// Launch a timer to wait for the next node to expire if all\n\t// candidates have been tried and no task is currently active.\n\t// This should prevent cases where the dialer logic is not ticked\n\t// because there are no pending events.\n\tif nRunning == 0 && len(newtasks) == 0 && s.hist.Len() > 0 {\n\t\tt := &waitExpireTask{s.hist.min().exp.Sub(now)}\n\t\tnewtasks = append(newtasks, t)\n\t}\n\treturn newtasks\n}\n\nvar (\n\terrSelf             = errors.New(\"is self\")\n\terrAlreadyDialing   = errors.New(\"already dialing\")\n\terrAlreadyConnected = errors.New(\"already connected\")\n\terrRecentlyDialed   = errors.New(\"recently dialed\")\n\terrNotWhitelisted   = errors.New(\"not contained in netrestrict whitelist\")\n)\n\nfunc (s *dialstate) checkDial(n *discover.Node, peers map[discover.NodeID]*Peer) error {\n\t_, dialing := s.dialing[n.ID]\n\tswitch {\n\tcase dialing:\n\t\treturn errAlreadyDialing\n\tcase peers[n.ID] != nil:\n\t\treturn errAlreadyConnected\n\tcase s.ntab != nil && n.ID == s.ntab.Self().ID:\n\t\treturn errSelf\n\tcase s.netrestrict != nil && !s.netrestrict.Contains(n.IP):\n\t\treturn errNotWhitelisted\n\tcase s.hist.contains(n.ID):\n\t\treturn errRecentlyDialed\n\t}\n\treturn nil\n}\n\nfunc (s *dialstate) taskDone(t task, now time.Time) {\n\tswitch t := t.(type) {\n\tcase *dialTask:\n\t\ts.hist.add(t.dest.ID, now.Add(dialHistoryExpiration))\n\t\tdelete(s.dialing, t.dest.ID)\n\tcase *discoverTask:\n\t\ts.lookupRunning = false\n\t\ts.lookupBuf = append(s.lookupBuf, t.results...)\n\t}\n}\n\nfunc (t *dialTask) Do(srv *Server) {\n\tif t.dest.Incomplete() {\n\t\tif !t.resolve(srv) {\n\t\t\treturn\n\t\t}\n\t}\n\terr := t.dial(srv, t.dest)\n\tif err != nil {\n\t\tlog.Trace(\"Dial error\", \"task\", t, \"err\", err)\n\t\t// Try resolving the ID of static nodes if dialing failed.\n\t\tif _, ok := err.(*dialError); ok && t.flags&staticDialedConn != 0 {\n\t\t\tif t.resolve(srv) {\n\t\t\t\tt.dial(srv, t.dest)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// resolve attempts to find the current endpoint for the destination\n// using discovery.\n//\n// Resolve operations are throttled with backoff to avoid flooding the\n// discovery network with useless queries for nodes that don't exist.\n// The backoff delay resets when the node is found.\nfunc (t *dialTask) resolve(srv *Server) bool {\n\tif srv.ntab == nil {\n\t\tlog.Debug(\"Can't resolve node\", \"id\", t.dest.ID, \"err\", \"discovery is disabled\")\n\t\treturn false\n\t}\n\tif t.resolveDelay == 0 {\n\t\tt.resolveDelay = initialResolveDelay\n\t}\n\tif time.Since(t.lastResolved) < t.resolveDelay {\n\t\treturn false\n\t}\n\tresolved := srv.ntab.Resolve(t.dest.ID)\n\tt.lastResolved = time.Now()\n\tif resolved == nil {\n\t\tt.resolveDelay *= 2\n\t\tif t.resolveDelay > maxResolveDelay {\n\t\t\tt.resolveDelay = maxResolveDelay\n\t\t}\n\t\tlog.Debug(\"Resolving node failed\", \"id\", t.dest.ID, \"newdelay\", t.resolveDelay)\n\t\treturn false\n\t}\n\t// The node was found.\n\tt.resolveDelay = initialResolveDelay\n\tt.dest = resolved\n\tlog.Debug(\"Resolved node\", \"id\", t.dest.ID, \"addr\", &net.TCPAddr{IP: t.dest.IP, Port: int(t.dest.TCP)})\n\treturn true\n}\n\ntype dialError struct {\n\terror\n}\n\n// dial performs the actual connection attempt.\nfunc (t *dialTask) dial(srv *Server, dest *discover.Node) error {\n\tfd, err := srv.Dialer.Dial(dest)\n\tif err != nil {\n\t\treturn &dialError{err}\n\t}\n\tmfd := newMeteredConn(fd, false)\n\treturn srv.SetupConn(mfd, t.flags, dest)\n}\n\nfunc (t *dialTask) String() string {\n\treturn fmt.Sprintf(\"%v %x %v:%d\", t.flags, t.dest.ID[:8], t.dest.IP, t.dest.TCP)\n}\n\nfunc (t *discoverTask) Do(srv *Server) {\n\t// newTasks generates a lookup task whenever dynamic dials are\n\t// necessary. Lookups need to take some time, otherwise the\n\t// event loop spins too fast.\n\tnext := srv.lastLookup.Add(lookupInterval)\n\tif now := time.Now(); now.Before(next) {\n\t\ttime.Sleep(next.Sub(now))\n\t}\n\tsrv.lastLookup = time.Now()\n\tvar target discover.NodeID\n\trand.Read(target[:])\n\tt.results = srv.ntab.Lookup(target)\n}\n\nfunc (t *discoverTask) String() string {\n\ts := \"discovery lookup\"\n\tif len(t.results) > 0 {\n\t\ts += fmt.Sprintf(\" (%d results)\", len(t.results))\n\t}\n\treturn s\n}\n\nfunc (t waitExpireTask) Do(*Server) {\n\ttime.Sleep(t.Duration)\n}\nfunc (t waitExpireTask) String() string {\n\treturn fmt.Sprintf(\"wait for dial hist expire (%v)\", t.Duration)\n}\n\n// Use only these methods to access or modify dialHistory.\nfunc (h dialHistory) min() pastDial {\n\treturn h[0]\n}\nfunc (h *dialHistory) add(id discover.NodeID, exp time.Time) {\n\theap.Push(h, pastDial{id, exp})\n\n}\nfunc (h *dialHistory) remove(id discover.NodeID) bool {\n\tfor i, v := range *h {\n\t\tif v.id == id {\n\t\t\theap.Remove(h, i)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc (h dialHistory) contains(id discover.NodeID) bool {\n\tfor _, v := range h {\n\t\tif v.id == id {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\nfunc (h *dialHistory) expire(now time.Time) {\n\tfor h.Len() > 0 && h.min().exp.Before(now) {\n\t\theap.Pop(h)\n\t}\n}\n\n// heap.Interface boilerplate\nfunc (h dialHistory) Len() int           { return len(h) }\nfunc (h dialHistory) Less(i, j int) bool { return h[i].exp.Before(h[j].exp) }\nfunc (h dialHistory) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }\nfunc (h *dialHistory) Push(x interface{}) {\n\t*h = append(*h, x.(pastDial))\n}\nfunc (h *dialHistory) Pop() interface{} {\n\told := *h\n\tn := len(old)\n\tx := old[n-1]\n\t*h = old[0 : n-1]\n\treturn x\n}\n"
  },
  {
    "path": "p2p/discover/database.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the node database, storing previously seen nodes and any collected\n// metadata about them for QoS purposes.\n\npackage discover\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"encoding/binary\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/syndtr/goleveldb/leveldb\"\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nvar (\n\tnodeDBNilNodeID      = NodeID{}       // Special node ID to use as a nil element.\n\tnodeDBNodeExpiration = 24 * time.Hour // Time after which an unseen node should be dropped.\n\tnodeDBCleanupCycle   = time.Hour      // Time period for running the expiration task.\n\tnodeDBVersion        = 5\n)\n\n// nodeDB stores all nodes we know about.\ntype nodeDB struct {\n\tlvl    *leveldb.DB   // Interface to the database itself\n\tself   NodeID        // Own node id to prevent adding it into the database\n\trunner sync.Once     // Ensures we can start at most one expirer\n\tquit   chan struct{} // Channel to signal the expiring thread to stop\n}\n\n// Schema layout for the node database\nvar (\n\tnodeDBVersionKey = []byte(\"version\") // Version of the database to flush if changes\n\tnodeDBItemPrefix = []byte(\"n:\")      // Identifier to prefix node entries with\n\n\tnodeDBDiscoverRoot      = \":discover\"\n\tnodeDBDiscoverPing      = nodeDBDiscoverRoot + \":lastping\"\n\tnodeDBDiscoverPong      = nodeDBDiscoverRoot + \":lastpong\"\n\tnodeDBDiscoverFindFails = nodeDBDiscoverRoot + \":findfail\"\n)\n\n// newNodeDB creates a new node database for storing and retrieving infos about\n// known peers in the network. If no path is given, an in-memory, temporary\n// database is constructed.\nfunc newNodeDB(path string, version int, self NodeID) (*nodeDB, error) {\n\tif path == \"\" {\n\t\treturn newMemoryNodeDB(self)\n\t}\n\treturn newPersistentNodeDB(path, version, self)\n}\n\n// newMemoryNodeDB creates a new in-memory node database without a persistent\n// backend.\nfunc newMemoryNodeDB(self NodeID) (*nodeDB, error) {\n\tdb, err := leveldb.Open(storage.NewMemStorage(), nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &nodeDB{\n\t\tlvl:  db,\n\t\tself: self,\n\t\tquit: make(chan struct{}),\n\t}, nil\n}\n\n// newPersistentNodeDB creates/opens a leveldb backed persistent node database,\n// also flushing its contents in case of a version mismatch.\nfunc newPersistentNodeDB(path string, version int, self NodeID) (*nodeDB, error) {\n\topts := &opt.Options{OpenFilesCacheCapacity: 5}\n\tdb, err := leveldb.OpenFile(path, opts)\n\tif _, iscorrupted := err.(*errors.ErrCorrupted); iscorrupted {\n\t\tdb, err = leveldb.RecoverFile(path, nil)\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// The nodes contained in the cache correspond to a certain protocol version.\n\t// Flush all nodes if the version doesn't match.\n\tcurrentVer := make([]byte, binary.MaxVarintLen64)\n\tcurrentVer = currentVer[:binary.PutVarint(currentVer, int64(version))]\n\n\tblob, err := db.Get(nodeDBVersionKey, nil)\n\tswitch err {\n\tcase leveldb.ErrNotFound:\n\t\t// Version not found (i.e. empty cache), insert it\n\t\tif err := db.Put(nodeDBVersionKey, currentVer, nil); err != nil {\n\t\t\tdb.Close()\n\t\t\treturn nil, err\n\t\t}\n\n\tcase nil:\n\t\t// Version present, flush if different\n\t\tif !bytes.Equal(blob, currentVer) {\n\t\t\tdb.Close()\n\t\t\tif err = os.RemoveAll(path); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn newPersistentNodeDB(path, version, self)\n\t\t}\n\t}\n\treturn &nodeDB{\n\t\tlvl:  db,\n\t\tself: self,\n\t\tquit: make(chan struct{}),\n\t}, nil\n}\n\n// makeKey generates the leveldb key-blob from a node id and its particular\n// field of interest.\nfunc makeKey(id NodeID, field string) []byte {\n\tif bytes.Equal(id[:], nodeDBNilNodeID[:]) {\n\t\treturn []byte(field)\n\t}\n\treturn append(nodeDBItemPrefix, append(id[:], field...)...)\n}\n\n// splitKey tries to split a database key into a node id and a field part.\nfunc splitKey(key []byte) (id NodeID, field string) {\n\t// If the key is not of a node, return it plainly\n\tif !bytes.HasPrefix(key, nodeDBItemPrefix) {\n\t\treturn NodeID{}, string(key)\n\t}\n\t// Otherwise split the id and field\n\titem := key[len(nodeDBItemPrefix):]\n\tcopy(id[:], item[:len(id)])\n\tfield = string(item[len(id):])\n\n\treturn id, field\n}\n\n// fetchInt64 retrieves an integer instance associated with a particular\n// database key.\nfunc (db *nodeDB) fetchInt64(key []byte) int64 {\n\tblob, err := db.lvl.Get(key, nil)\n\tif err != nil {\n\t\treturn 0\n\t}\n\tval, read := binary.Varint(blob)\n\tif read <= 0 {\n\t\treturn 0\n\t}\n\treturn val\n}\n\n// storeInt64 update a specific database entry to the current time instance as a\n// unix timestamp.\nfunc (db *nodeDB) storeInt64(key []byte, n int64) error {\n\tblob := make([]byte, binary.MaxVarintLen64)\n\tblob = blob[:binary.PutVarint(blob, n)]\n\n\treturn db.lvl.Put(key, blob, nil)\n}\n\n// node retrieves a node with a given id from the database.\nfunc (db *nodeDB) node(id NodeID) *Node {\n\tblob, err := db.lvl.Get(makeKey(id, nodeDBDiscoverRoot), nil)\n\tif err != nil {\n\t\treturn nil\n\t}\n\tnode := new(Node)\n\tif err := rlp.DecodeBytes(blob, node); err != nil {\n\t\tlog.Error(\"Failed to decode node RLP\", \"err\", err)\n\t\treturn nil\n\t}\n\tnode.sha = crypto.Keccak256Hash(node.ID[:])\n\treturn node\n}\n\n// updateNode inserts - potentially overwriting - a node into the peer database.\nfunc (db *nodeDB) updateNode(node *Node) error {\n\tblob, err := rlp.EncodeToBytes(node)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn db.lvl.Put(makeKey(node.ID, nodeDBDiscoverRoot), blob, nil)\n}\n\n// deleteNode deletes all information/keys associated with a node.\nfunc (db *nodeDB) deleteNode(id NodeID) error {\n\tdeleter := db.lvl.NewIterator(util.BytesPrefix(makeKey(id, \"\")), nil)\n\tfor deleter.Next() {\n\t\tif err := db.lvl.Delete(deleter.Key(), nil); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// ensureExpirer is a small helper method ensuring that the data expiration\n// mechanism is running. If the expiration goroutine is already running, this\n// method simply returns.\n//\n// The goal is to start the data evacuation only after the network successfully\n// bootstrapped itself (to prevent dumping potentially useful seed nodes). Since\n// it would require significant overhead to exactly trace the first successful\n// convergence, it's simpler to \"ensure\" the correct state when an appropriate\n// condition occurs (i.e. a successful bonding), and discard further events.\nfunc (db *nodeDB) ensureExpirer() {\n\tdb.runner.Do(func() { go db.expirer() })\n}\n\n// expirer should be started in a go routine, and is responsible for looping ad\n// infinitum and dropping stale data from the database.\nfunc (db *nodeDB) expirer() {\n\ttick := time.NewTicker(nodeDBCleanupCycle)\n\tdefer tick.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-tick.C:\n\t\t\tif err := db.expireNodes(); err != nil {\n\t\t\t\tlog.Error(\"Failed to expire nodedb items\", \"err\", err)\n\t\t\t}\n\t\tcase <-db.quit:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// expireNodes iterates over the database and deletes all nodes that have not\n// been seen (i.e. received a pong from) for some allotted time.\nfunc (db *nodeDB) expireNodes() error {\n\tthreshold := time.Now().Add(-nodeDBNodeExpiration)\n\n\t// Find discovered nodes that are older than the allowance\n\tit := db.lvl.NewIterator(nil, nil)\n\tdefer it.Release()\n\n\tfor it.Next() {\n\t\t// Skip the item if not a discovery node\n\t\tid, field := splitKey(it.Key())\n\t\tif field != nodeDBDiscoverRoot {\n\t\t\tcontinue\n\t\t}\n\t\t// Skip the node if not expired yet (and not self)\n\t\tif !bytes.Equal(id[:], db.self[:]) {\n\t\t\tif seen := db.lastPongReceived(id); seen.After(threshold) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\t// Otherwise delete all associated information\n\t\tdb.deleteNode(id)\n\t}\n\treturn nil\n}\n\n// lastPingReceived retrieves the time of the last ping packet sent by the remote node.\nfunc (db *nodeDB) lastPingReceived(id NodeID) time.Time {\n\treturn time.Unix(db.fetchInt64(makeKey(id, nodeDBDiscoverPing)), 0)\n}\n\n// updateLastPing updates the last time remote node pinged us.\nfunc (db *nodeDB) updateLastPingReceived(id NodeID, instance time.Time) error {\n\treturn db.storeInt64(makeKey(id, nodeDBDiscoverPing), instance.Unix())\n}\n\n// lastPongReceived retrieves the time of the last successful pong from remote node.\nfunc (db *nodeDB) lastPongReceived(id NodeID) time.Time {\n\treturn time.Unix(db.fetchInt64(makeKey(id, nodeDBDiscoverPong)), 0)\n}\n\n// hasBond reports whether the given node is considered bonded.\nfunc (db *nodeDB) hasBond(id NodeID) bool {\n\treturn time.Since(db.lastPongReceived(id)) < nodeDBNodeExpiration\n}\n\n// updateLastPongReceived updates the last pong time of a node.\nfunc (db *nodeDB) updateLastPongReceived(id NodeID, instance time.Time) error {\n\treturn db.storeInt64(makeKey(id, nodeDBDiscoverPong), instance.Unix())\n}\n\n// findFails retrieves the number of findnode failures since bonding.\nfunc (db *nodeDB) findFails(id NodeID) int {\n\treturn int(db.fetchInt64(makeKey(id, nodeDBDiscoverFindFails)))\n}\n\n// updateFindFails updates the number of findnode failures since bonding.\nfunc (db *nodeDB) updateFindFails(id NodeID, fails int) error {\n\treturn db.storeInt64(makeKey(id, nodeDBDiscoverFindFails), int64(fails))\n}\n\n// querySeeds retrieves random nodes to be used as potential seed nodes\n// for bootstrapping.\nfunc (db *nodeDB) querySeeds(n int, maxAge time.Duration) []*Node {\n\tvar (\n\t\tnow   = time.Now()\n\t\tnodes = make([]*Node, 0, n)\n\t\tit    = db.lvl.NewIterator(nil, nil)\n\t\tid    NodeID\n\t)\n\tdefer it.Release()\n\nseek:\n\tfor seeks := 0; len(nodes) < n && seeks < n*5; seeks++ {\n\t\t// Seek to a random entry. The first byte is incremented by a\n\t\t// random amount each time in order to increase the likelihood\n\t\t// of hitting all existing nodes in very small databases.\n\t\tctr := id[0]\n\t\trand.Read(id[:])\n\t\tid[0] = ctr + id[0]%16\n\t\tit.Seek(makeKey(id, nodeDBDiscoverRoot))\n\n\t\tn := nextNode(it)\n\t\tif n == nil {\n\t\t\tid[0] = 0\n\t\t\tcontinue seek // iterator exhausted\n\t\t}\n\t\tif n.ID == db.self {\n\t\t\tcontinue seek\n\t\t}\n\t\tif now.Sub(db.lastPongReceived(n.ID)) > maxAge {\n\t\t\tcontinue seek\n\t\t}\n\t\tfor i := range nodes {\n\t\t\tif nodes[i].ID == n.ID {\n\t\t\t\tcontinue seek // duplicate\n\t\t\t}\n\t\t}\n\t\tnodes = append(nodes, n)\n\t}\n\treturn nodes\n}\n\n// reads the next node record from the iterator, skipping over other\n// database entries.\nfunc nextNode(it iterator.Iterator) *Node {\n\tfor end := false; !end; end = !it.Next() {\n\t\tid, field := splitKey(it.Key())\n\t\tif field != nodeDBDiscoverRoot {\n\t\t\tcontinue\n\t\t}\n\t\tvar n Node\n\t\tif err := rlp.DecodeBytes(it.Value(), &n); err != nil {\n\t\t\tlog.Warn(\"Failed to decode node RLP\", \"id\", id, \"err\", err)\n\t\t\tcontinue\n\t\t}\n\t\treturn &n\n\t}\n\treturn nil\n}\n\n// close flushes and closes the database files.\nfunc (db *nodeDB) close() {\n\tclose(db.quit)\n\tdb.lvl.Close()\n}\n"
  },
  {
    "path": "p2p/discover/node.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage discover\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"net\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/crypto/secp256k1\"\n)\n\nconst NodeIDBits = 512\n\n// Node represents a host on the network.\n// The fields of Node may not be modified.\ntype Node struct {\n\tIP       net.IP // len 4 for IPv4 or 16 for IPv6\n\tUDP, TCP uint16 // port numbers\n\tID       NodeID // the node's public key\n\n\t// This is a cached copy of sha3(ID) which is used for node\n\t// distance calculations. This is part of Node in order to make it\n\t// possible to write tests that need a node at a certain distance.\n\t// In those tests, the content of sha will not actually correspond\n\t// with ID.\n\tsha common.Hash\n\n\t// Time when the node was added to the table.\n\taddedAt time.Time\n}\n\n// NewNode creates a new node. It is mostly meant to be used for\n// testing purposes.\nfunc NewNode(id NodeID, ip net.IP, udpPort, tcpPort uint16) *Node {\n\tif ipv4 := ip.To4(); ipv4 != nil {\n\t\tip = ipv4\n\t}\n\treturn &Node{\n\t\tIP:  ip,\n\t\tUDP: udpPort,\n\t\tTCP: tcpPort,\n\t\tID:  id,\n\t\tsha: crypto.Keccak256Hash(id[:]),\n\t}\n}\n\nfunc (n *Node) addr() *net.UDPAddr {\n\treturn &net.UDPAddr{IP: n.IP, Port: int(n.UDP)}\n}\n\n// Incomplete returns true for nodes with no IP address.\nfunc (n *Node) Incomplete() bool {\n\treturn n.IP == nil\n}\n\n// checks whether n is a valid complete node.\nfunc (n *Node) validateComplete() error {\n\tif n.Incomplete() {\n\t\treturn errors.New(\"incomplete node\")\n\t}\n\tif n.UDP == 0 {\n\t\treturn errors.New(\"missing UDP port\")\n\t}\n\tif n.TCP == 0 {\n\t\treturn errors.New(\"missing TCP port\")\n\t}\n\tif n.IP.IsMulticast() || n.IP.IsUnspecified() {\n\t\treturn errors.New(\"invalid IP (multicast/unspecified)\")\n\t}\n\t_, err := n.ID.Pubkey() // validate the key (on curve, etc.)\n\treturn err\n}\n\n// The string representation of a Node is a URL.\n// Please see ParseNode for a description of the format.\nfunc (n *Node) String() string {\n\tu := url.URL{Scheme: \"snode\"}\n\tif n.Incomplete() {\n\t\tu.Host = fmt.Sprintf(\"%x\", n.ID[:])\n\t} else {\n\t\taddr := net.TCPAddr{IP: n.IP, Port: int(n.TCP)}\n\t\tu.User = url.User(fmt.Sprintf(\"%x\", n.ID[:]))\n\t\tu.Host = addr.String()\n\t\tif n.UDP != n.TCP {\n\t\t\tu.RawQuery = \"discport=\" + strconv.Itoa(int(n.UDP))\n\t\t}\n\t}\n\treturn u.String()\n}\n\nvar incompleteNodeURL = regexp.MustCompile(\"(?i)^(?:snode://)?([0-9a-f]+)$\")\n\n// ParseNode parses a node designator.\n//\n// There are two basic forms of node designators\n//   - incomplete nodes, which only have the public key (node ID)\n//   - complete nodes, which contain the public key and IP/Port information\n//\n// For incomplete nodes, the designator must look like one of these\n//\n//    enode://<hex node id>\n//    <hex node id>\n//\n// For complete nodes, the node ID is encoded in the username portion\n// of the URL, separated from the host by an @ sign. The hostname can\n// only be given as an IP address, DNS domain names are not allowed.\n// The port in the host name section is the TCP listening port. If the\n// TCP and UDP (discovery) ports differ, the UDP port is specified as\n// query parameter \"discport\".\n//\n// In the following example, the node URL describes\n// a node with IP address 10.3.58.6, TCP listening port 60603\n// and UDP discovery port 60601.\n//\n//    enode://<hex node id>@10.3.58.6:60603?discport=60601\nfunc ParseNode(rawurl string) (*Node, error) {\n\tif m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil {\n\t\tid, err := HexID(m[1])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid node ID (%v)\", err)\n\t\t}\n\t\treturn NewNode(id, nil, 0, 0), nil\n\t}\n\treturn parseComplete(rawurl)\n}\n\nfunc parseComplete(rawurl string) (*Node, error) {\n\tvar (\n\t\tid               NodeID\n\t\tip               net.IP\n\t\ttcpPort, udpPort uint64\n\t)\n\tu, err := url.Parse(rawurl)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif u.Scheme != \"snode\" {\n\t\treturn nil, errors.New(\"invalid URL scheme, want \\\"snode\\\"\")\n\t}\n\t// Parse the Node ID from the user portion.\n\tif u.User == nil {\n\t\treturn nil, errors.New(\"does not contain node ID\")\n\t}\n\tif id, err = HexID(u.User.String()); err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid node ID (%v)\", err)\n\t}\n\t// Parse the IP address.\n\thost, port, err := net.SplitHostPort(u.Host)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid host: %v\", err)\n\t}\n\tif ip = net.ParseIP(host); ip == nil {\n\t\t//if the host part is domain name, lookup the ip and return the ip\n\t\taddress, err := net.LookupIP(host)\n\t\tif err != nil || len(address) == 0 {\n\t\t\treturn nil, errors.New(\"invalid IP address\")\n\t\t} else {\n\t\t\tip = address[0]\n\t\t}\n\t}\n\t// Ensure the IP is 4 bytes long for IPv4 addresses.\n\tif ipv4 := ip.To4(); ipv4 != nil {\n\t\tip = ipv4\n\t}\n\t// Parse the port numbers.\n\tif tcpPort, err = strconv.ParseUint(port, 10, 16); err != nil {\n\t\treturn nil, errors.New(\"invalid port\")\n\t}\n\tudpPort = tcpPort\n\tqv := u.Query()\n\tif qv.Get(\"discport\") != \"\" {\n\t\tudpPort, err = strconv.ParseUint(qv.Get(\"discport\"), 10, 16)\n\t\tif err != nil {\n\t\t\treturn nil, errors.New(\"invalid discport in query\")\n\t\t}\n\t}\n\treturn NewNode(id, ip, uint16(udpPort), uint16(tcpPort)), nil\n}\n\n// MustParseNode parses a node URL. It panics if the URL is not valid.\nfunc MustParseNode(rawurl string) *Node {\n\tn, err := ParseNode(rawurl)\n\tif err != nil {\n\t\tpanic(\"invalid node URL: \" + err.Error())\n\t}\n\treturn n\n}\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (n *Node) MarshalText() ([]byte, error) {\n\treturn []byte(n.String()), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (n *Node) UnmarshalText(text []byte) error {\n\tdec, err := ParseNode(string(text))\n\tif err == nil {\n\t\t*n = *dec\n\t}\n\treturn err\n}\n\n// NodeID is a unique identifier for each node.\n// The node identifier is a marshaled elliptic curve public key.\ntype NodeID [NodeIDBits / 8]byte\n\n// Bytes returns a byte slice representation of the NodeID\nfunc (n NodeID) Bytes() []byte {\n\treturn n[:]\n}\n\n// NodeID prints as a long hexadecimal number.\nfunc (n NodeID) String() string {\n\treturn fmt.Sprintf(\"%x\", n[:])\n}\n\n// The Go syntax representation of a NodeID is a call to HexID.\nfunc (n NodeID) GoString() string {\n\treturn fmt.Sprintf(\"discover.HexID(\\\"%x\\\")\", n[:])\n}\n\n// TerminalString returns a shortened hex string for terminal logging.\nfunc (n NodeID) TerminalString() string {\n\treturn hex.EncodeToString(n[:8])\n}\n\n// MarshalText implements the encoding.TextMarshaler interface.\nfunc (n NodeID) MarshalText() ([]byte, error) {\n\treturn []byte(hex.EncodeToString(n[:])), nil\n}\n\n// UnmarshalText implements the encoding.TextUnmarshaler interface.\nfunc (n *NodeID) UnmarshalText(text []byte) error {\n\tid, err := HexID(string(text))\n\tif err != nil {\n\t\treturn err\n\t}\n\t*n = id\n\treturn nil\n}\n\n// BytesID converts a byte slice to a NodeID\nfunc BytesID(b []byte) (NodeID, error) {\n\tvar id NodeID\n\tif len(b) != len(id) {\n\t\treturn id, fmt.Errorf(\"wrong length, want %d bytes\", len(id))\n\t}\n\tcopy(id[:], b)\n\treturn id, nil\n}\n\n// MustBytesID converts a byte slice to a NodeID.\n// It panics if the byte slice is not a valid NodeID.\nfunc MustBytesID(b []byte) NodeID {\n\tid, err := BytesID(b)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn id\n}\n\n// HexID converts a hex string to a NodeID.\n// The string may be prefixed with 0x.\nfunc HexID(in string) (NodeID, error) {\n\tvar id NodeID\n\tb, err := hex.DecodeString(strings.TrimPrefix(in, \"0x\"))\n\tif err != nil {\n\t\treturn id, err\n\t} else if len(b) != len(id) {\n\t\treturn id, fmt.Errorf(\"wrong length, want %d hex chars\", len(id)*2)\n\t}\n\tcopy(id[:], b)\n\treturn id, nil\n}\n\n// MustHexID converts a hex string to a NodeID.\n// It panics if the string is not a valid NodeID.\nfunc MustHexID(in string) NodeID {\n\tid, err := HexID(in)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn id\n}\n\n// PubkeyID returns a marshaled representation of the given public key.\nfunc PubkeyID(pub *ecdsa.PublicKey) NodeID {\n\tvar id NodeID\n\tpbytes := elliptic.Marshal(pub.Curve, pub.X, pub.Y)\n\tif len(pbytes)-1 != len(id) {\n\t\tpanic(fmt.Errorf(\"need %d bit pubkey, got %d bits\", (len(id)+1)*8, len(pbytes)))\n\t}\n\tcopy(id[:], pbytes[1:])\n\treturn id\n}\n\n// Pubkey returns the public key represented by the node ID.\n// It returns an error if the ID is not a point on the curve.\nfunc (id NodeID) Pubkey() (*ecdsa.PublicKey, error) {\n\tp := &ecdsa.PublicKey{Curve: crypto.S256(), X: new(big.Int), Y: new(big.Int)}\n\thalf := len(id) / 2\n\tp.X.SetBytes(id[:half])\n\tp.Y.SetBytes(id[half:])\n\tif !p.Curve.IsOnCurve(p.X, p.Y) {\n\t\treturn nil, errors.New(\"id is invalid secp256k1 curve point\")\n\t}\n\treturn p, nil\n}\n\n// recoverNodeID computes the public key used to sign the\n// given hash from the signature.\nfunc recoverNodeID(hash, sig []byte) (id NodeID, err error) {\n\tpubkey, err := secp256k1.RecoverPubkey(hash, sig)\n\tif err != nil {\n\t\treturn id, err\n\t}\n\tif len(pubkey)-1 != len(id) {\n\t\treturn id, fmt.Errorf(\"recovered pubkey has %d bits, want %d bits\", len(pubkey)*8, (len(id)+1)*8)\n\t}\n\tfor i := range id {\n\t\tid[i] = pubkey[i+1]\n\t}\n\treturn id, nil\n}\n\n// distcmp compares the distances a->target and b->target.\n// Returns -1 if a is closer to target, 1 if b is closer to target\n// and 0 if they are equal.\nfunc distcmp(target, a, b common.Hash) int {\n\tfor i := range target {\n\t\tda := a[i] ^ target[i]\n\t\tdb := b[i] ^ target[i]\n\t\tif da > db {\n\t\t\treturn 1\n\t\t} else if da < db {\n\t\t\treturn -1\n\t\t}\n\t}\n\treturn 0\n}\n\n// table of leading zero counts for bytes [0..255]\nvar lzcount = [256]int{\n\t8, 7, 6, 6, 5, 5, 5, 5,\n\t4, 4, 4, 4, 4, 4, 4, 4,\n\t3, 3, 3, 3, 3, 3, 3, 3,\n\t3, 3, 3, 3, 3, 3, 3, 3,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n}\n\n// logdist returns the logarithmic distance between a and b, log2(a ^ b).\nfunc logdist(a, b common.Hash) int {\n\tlz := 0\n\tfor i := range a {\n\t\tx := a[i] ^ b[i]\n\t\tif x == 0 {\n\t\t\tlz += 8\n\t\t} else {\n\t\t\tlz += lzcount[x]\n\t\t\tbreak\n\t\t}\n\t}\n\treturn len(a)*8 - lz\n}\n\n// hashAtDistance returns a random hash such that logdist(a, b) == n\nfunc hashAtDistance(a common.Hash, n int) (b common.Hash) {\n\tif n == 0 {\n\t\treturn a\n\t}\n\t// flip bit at position n, fill the rest with random bits\n\tb = a\n\tpos := len(a) - n/8 - 1\n\tbit := byte(0x01) << (byte(n%8) - 1)\n\tif bit == 0 {\n\t\tpos++\n\t\tbit = 0x80\n\t}\n\tb[pos] = a[pos]&^bit | ^a[pos]&bit // TODO: randomize end bits\n\tfor i := pos + 1; i < len(a); i++ {\n\t\tb[i] = byte(rand.Intn(255))\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "p2p/discover/ntp.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the NTP time drift detection via the SNTP protocol:\n//   https://tools.ietf.org/html/rfc4330\n\npackage discover\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tntpPool   = \"pool.ntp.org\" // ntpPool is the NTP server to query for the current time\n\tntpChecks = 3              // Number of measurements to do against the NTP server\n)\n\n// durationSlice attaches the methods of sort.Interface to []time.Duration,\n// sorting in increasing order.\ntype durationSlice []time.Duration\n\nfunc (s durationSlice) Len() int           { return len(s) }\nfunc (s durationSlice) Less(i, j int) bool { return s[i] < s[j] }\nfunc (s durationSlice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }\n\n// checkClockDrift queries an NTP server for clock drifts and warns the user if\n// one large enough is detected.\nfunc checkClockDrift() {\n\tdrift, err := sntpDrift(ntpChecks)\n\tif err != nil {\n\t\treturn\n\t}\n\tif drift < -driftThreshold || drift > driftThreshold {\n\t\tlog.Warn(fmt.Sprintf(\"System clock seems off by %v, which can prevent network connectivity\", drift))\n\t\tlog.Warn(\"Please enable network time synchronisation in system settings.\")\n\t} else {\n\t\tlog.Debug(\"NTP sanity check done\", \"drift\", drift)\n\t}\n}\n\n// sntpDrift does a naive time resolution against an NTP server and returns the\n// measured drift. This method uses the simple version of NTP. It's not precise\n// but should be fine for these purposes.\n//\n// Note, it executes two extra measurements compared to the number of requested\n// ones to be able to discard the two extremes as outliers.\nfunc sntpDrift(measurements int) (time.Duration, error) {\n\t// Resolve the address of the NTP server\n\taddr, err := net.ResolveUDPAddr(\"udp\", ntpPool+\":123\")\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\t// Construct the time request (empty package with only 2 fields set):\n\t//   Bits 3-5: Protocol version, 3\n\t//   Bits 6-8: Mode of operation, client, 3\n\trequest := make([]byte, 48)\n\trequest[0] = 3<<3 | 3\n\n\t// Execute each of the measurements\n\tdrifts := []time.Duration{}\n\tfor i := 0; i < measurements+2; i++ {\n\t\t// Dial the NTP server and send the time retrieval request\n\t\tconn, err := net.DialUDP(\"udp\", nil, addr)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tdefer conn.Close()\n\n\t\tsent := time.Now()\n\t\tif _, err = conn.Write(request); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\t// Retrieve the reply and calculate the elapsed time\n\t\tconn.SetDeadline(time.Now().Add(5 * time.Second))\n\n\t\treply := make([]byte, 48)\n\t\tif _, err = conn.Read(reply); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\telapsed := time.Since(sent)\n\n\t\t// Reconstruct the time from the reply data\n\t\tsec := uint64(reply[43]) | uint64(reply[42])<<8 | uint64(reply[41])<<16 | uint64(reply[40])<<24\n\t\tfrac := uint64(reply[47]) | uint64(reply[46])<<8 | uint64(reply[45])<<16 | uint64(reply[44])<<24\n\n\t\tnanosec := sec*1e9 + (frac*1e9)>>32\n\n\t\tt := time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC).Add(time.Duration(nanosec)).Local()\n\n\t\t// Calculate the drift based on an assumed answer time of RRT/2\n\t\tdrifts = append(drifts, sent.Sub(t)+elapsed/2)\n\t}\n\t// Calculate average drif (drop two extremities to avoid outliers)\n\tsort.Sort(durationSlice(drifts))\n\n\tdrift := time.Duration(0)\n\tfor i := 1; i < len(drifts)-1; i++ {\n\t\tdrift += drifts[i]\n\t}\n\treturn drift / time.Duration(measurements), nil\n}\n"
  },
  {
    "path": "p2p/discover/table.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package discover implements the Node Discovery Protocol.\n//\n// The Node Discovery protocol provides a way to find RLPx nodes that\n// can be connected to. It uses a Kademlia-like protocol to maintain a\n// distributed database of the IDs and endpoints of all listening\n// nodes.\npackage discover\n\nimport (\n\tcrand \"crypto/rand\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\tmrand \"math/rand\"\n\t\"net\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n)\n\nconst (\n\talpha           = 3  // Kademlia concurrency factor\n\tbucketSize      = 16 // Kademlia bucket size\n\tmaxReplacements = 10 // Size of per-bucket replacement list\n\n\t// We keep buckets for the upper 1/15 of distances because\n\t// it's very unlikely we'll ever encounter a node that's closer.\n\thashBits          = len(common.Hash{}) * 8\n\tnBuckets          = hashBits / 15       // Number of buckets\n\tbucketMinDistance = hashBits - nBuckets // Log distance of closest bucket\n\n\t// IP address limits.\n\tbucketIPLimit, bucketSubnet = 2, 24 // at most 2 addresses from the same /24\n\ttableIPLimit, tableSubnet   = 10, 24\n\n\tmaxFindnodeFailures = 5 // Nodes exceeding this limit are dropped\n\trefreshInterval     = 30 * time.Minute\n\trevalidateInterval  = 10 * time.Second\n\tcopyNodesInterval   = 30 * time.Second\n\tseedMinTableTime    = 5 * time.Minute\n\tseedCount           = 30\n\tseedMaxAge          = 5 * 24 * time.Hour\n)\n\ntype Table struct {\n\tmutex   sync.Mutex        // protects buckets, bucket content, nursery, rand\n\tbuckets [nBuckets]*bucket // index of known nodes by distance\n\tnursery []*Node           // bootstrap nodes\n\trand    *mrand.Rand       // source of randomness, periodically reseeded\n\tips     netutil.DistinctNetSet\n\n\tdb         *nodeDB // database of known nodes\n\trefreshReq chan chan struct{}\n\tinitDone   chan struct{}\n\tcloseReq   chan struct{}\n\tclosed     chan struct{}\n\n\tnodeAddedHook func(*Node) // for testing\n\n\tnet  transport\n\tself *Node // metadata of the local node\n}\n\n// transport is implemented by the UDP transport.\n// it is an interface so we can test without opening lots of UDP\n// sockets and without generating a private key.\ntype transport interface {\n\tping(NodeID, *net.UDPAddr) error\n\tfindnode(toid NodeID, addr *net.UDPAddr, target NodeID) ([]*Node, error)\n\tclose()\n}\n\n// bucket contains nodes, ordered by their last activity. the entry\n// that was most recently active is the first element in entries.\ntype bucket struct {\n\tentries      []*Node // live entries, sorted by time of last contact\n\treplacements []*Node // recently seen nodes to be used if revalidation fails\n\tips          netutil.DistinctNetSet\n}\n\nfunc newTable(t transport, ourID NodeID, ourAddr *net.UDPAddr, nodeDBPath string, bootnodes []*Node) (*Table, error) {\n\t// If no node database was given, use an in-memory one\n\tdb, err := newNodeDB(nodeDBPath, nodeDBVersion, ourID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttab := &Table{\n\t\tnet:        t,\n\t\tdb:         db,\n\t\tself:       NewNode(ourID, ourAddr.IP, uint16(ourAddr.Port), uint16(ourAddr.Port)),\n\t\trefreshReq: make(chan chan struct{}),\n\t\tinitDone:   make(chan struct{}),\n\t\tcloseReq:   make(chan struct{}),\n\t\tclosed:     make(chan struct{}),\n\t\trand:       mrand.New(mrand.NewSource(0)),\n\t\tips:        netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit},\n\t}\n\tif err := tab.setFallbackNodes(bootnodes); err != nil {\n\t\treturn nil, err\n\t}\n\tfor i := range tab.buckets {\n\t\ttab.buckets[i] = &bucket{\n\t\t\tips: netutil.DistinctNetSet{Subnet: bucketSubnet, Limit: bucketIPLimit},\n\t\t}\n\t}\n\ttab.seedRand()\n\ttab.loadSeedNodes()\n\t// Start the background expiration goroutine after loading seeds so that the search for\n\t// seed nodes also considers older nodes that would otherwise be removed by the\n\t// expiration.\n\ttab.db.ensureExpirer()\n\tgo tab.loop()\n\treturn tab, nil\n}\n\nfunc (tab *Table) seedRand() {\n\tvar b [8]byte\n\tcrand.Read(b[:])\n\n\ttab.mutex.Lock()\n\ttab.rand.Seed(int64(binary.BigEndian.Uint64(b[:])))\n\ttab.mutex.Unlock()\n}\n\n// Self returns the local node.\n// The returned node should not be modified by the caller.\nfunc (tab *Table) Self() *Node {\n\treturn tab.self\n}\n\n// ReadRandomNodes fills the given slice with random nodes from the\n// table. It will not write the same node more than once. The nodes in\n// the slice are copies and can be modified by the caller.\nfunc (tab *Table) ReadRandomNodes(buf []*Node) (n int) {\n\tif !tab.isInitDone() {\n\t\treturn 0\n\t}\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\n\t// Find all non-empty buckets and get a fresh slice of their entries.\n\tvar buckets [][]*Node\n\tfor _, b := range &tab.buckets {\n\t\tif len(b.entries) > 0 {\n\t\t\tbuckets = append(buckets, b.entries[:])\n\t\t}\n\t}\n\tif len(buckets) == 0 {\n\t\treturn 0\n\t}\n\t// Shuffle the buckets.\n\tfor i := len(buckets) - 1; i > 0; i-- {\n\t\tj := tab.rand.Intn(len(buckets))\n\t\tbuckets[i], buckets[j] = buckets[j], buckets[i]\n\t}\n\t// Move head of each bucket into buf, removing buckets that become empty.\n\tvar i, j int\n\tfor ; i < len(buf); i, j = i+1, (j+1)%len(buckets) {\n\t\tb := buckets[j]\n\t\tbuf[i] = &(*b[0])\n\t\tbuckets[j] = b[1:]\n\t\tif len(b) == 1 {\n\t\t\tbuckets = append(buckets[:j], buckets[j+1:]...)\n\t\t}\n\t\tif len(buckets) == 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn i + 1\n}\n\n// Close terminates the network listener and flushes the node database.\nfunc (tab *Table) Close() {\n\tselect {\n\tcase <-tab.closed:\n\t\t// already closed.\n\tcase tab.closeReq <- struct{}{}:\n\t\t<-tab.closed // wait for refreshLoop to end.\n\t}\n}\n\n// setFallbackNodes sets the initial points of contact. These nodes\n// are used to connect to the network if the table is empty and there\n// are no known nodes in the database.\nfunc (tab *Table) setFallbackNodes(nodes []*Node) error {\n\tfor _, n := range nodes {\n\t\tif err := n.validateComplete(); err != nil {\n\t\t\treturn fmt.Errorf(\"bad bootstrap/fallback node %q (%v)\", n, err)\n\t\t}\n\t}\n\ttab.nursery = make([]*Node, 0, len(nodes))\n\tfor _, n := range nodes {\n\t\tcpy := *n\n\t\t// Recompute cpy.sha because the node might not have been\n\t\t// created by NewNode or ParseNode.\n\t\tcpy.sha = crypto.Keccak256Hash(n.ID[:])\n\t\ttab.nursery = append(tab.nursery, &cpy)\n\t}\n\treturn nil\n}\n\n// isInitDone returns whether the table's initial seeding procedure has completed.\nfunc (tab *Table) isInitDone() bool {\n\tselect {\n\tcase <-tab.initDone:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// Resolve searches for a specific node with the given ID.\n// It returns nil if the node could not be found.\nfunc (tab *Table) Resolve(targetID NodeID) *Node {\n\t// If the node is present in the local table, no\n\t// network interaction is required.\n\thash := crypto.Keccak256Hash(targetID[:])\n\ttab.mutex.Lock()\n\tcl := tab.closest(hash, 1)\n\ttab.mutex.Unlock()\n\tif len(cl.entries) > 0 && cl.entries[0].ID == targetID {\n\t\treturn cl.entries[0]\n\t}\n\t// Otherwise, do a network lookup.\n\tresult := tab.Lookup(targetID)\n\tfor _, n := range result {\n\t\tif n.ID == targetID {\n\t\t\treturn n\n\t\t}\n\t}\n\treturn nil\n}\n\n// Lookup performs a network search for nodes close\n// to the given target. It approaches the target by querying\n// nodes that are closer to it on each iteration.\n// The given target does not need to be an actual node\n// identifier.\nfunc (tab *Table) Lookup(targetID NodeID) []*Node {\n\treturn tab.lookup(targetID, true)\n}\n\nfunc (tab *Table) lookup(targetID NodeID, refreshIfEmpty bool) []*Node {\n\tvar (\n\t\ttarget         = crypto.Keccak256Hash(targetID[:])\n\t\tasked          = make(map[NodeID]bool)\n\t\tseen           = make(map[NodeID]bool)\n\t\treply          = make(chan []*Node, alpha)\n\t\tpendingQueries = 0\n\t\tresult         *nodesByDistance\n\t)\n\t// don't query further if we hit ourself.\n\t// unlikely to happen often in practice.\n\tasked[tab.self.ID] = true\n\n\tfor {\n\t\ttab.mutex.Lock()\n\t\t// generate initial result set\n\t\tresult = tab.closest(target, bucketSize)\n\t\ttab.mutex.Unlock()\n\t\tif len(result.entries) > 0 || !refreshIfEmpty {\n\t\t\tbreak\n\t\t}\n\t\t// The result set is empty, all nodes were dropped, refresh.\n\t\t// We actually wait for the refresh to complete here. The very\n\t\t// first query will hit this case and run the bootstrapping\n\t\t// logic.\n\t\t<-tab.refresh()\n\t\trefreshIfEmpty = false\n\t}\n\n\tfor {\n\t\t// ask the alpha closest nodes that we haven't asked yet\n\t\tfor i := 0; i < len(result.entries) && pendingQueries < alpha; i++ {\n\t\t\tn := result.entries[i]\n\t\t\tif !asked[n.ID] {\n\t\t\t\tasked[n.ID] = true\n\t\t\t\tpendingQueries++\n\t\t\t\tgo tab.findnode(n, targetID, reply)\n\t\t\t}\n\t\t}\n\t\tif pendingQueries == 0 {\n\t\t\t// we have asked all closest nodes, stop the search\n\t\t\tbreak\n\t\t}\n\t\t// wait for the next reply\n\t\tfor _, n := range <-reply {\n\t\t\tif n != nil && !seen[n.ID] {\n\t\t\t\tseen[n.ID] = true\n\t\t\t\tresult.push(n, bucketSize)\n\t\t\t}\n\t\t}\n\t\tpendingQueries--\n\t}\n\treturn result.entries\n}\n\nfunc (tab *Table) findnode(n *Node, targetID NodeID, reply chan<- []*Node) {\n\tfails := tab.db.findFails(n.ID)\n\tr, err := tab.net.findnode(n.ID, n.addr(), targetID)\n\tif err != nil || len(r) == 0 {\n\t\tfails++\n\t\ttab.db.updateFindFails(n.ID, fails)\n\t\tlog.Trace(\"Findnode failed\", \"id\", n.ID, \"failcount\", fails, \"err\", err)\n\t\tif fails >= maxFindnodeFailures {\n\t\t\tlog.Trace(\"Too many findnode failures, dropping\", \"id\", n.ID, \"failcount\", fails)\n\t\t\ttab.delete(n)\n\t\t}\n\t} else if fails > 0 {\n\t\ttab.db.updateFindFails(n.ID, fails-1)\n\t}\n\n\t// Grab as many nodes as possible. Some of them might not be alive anymore, but we'll\n\t// just remove those again during revalidation.\n\tfor _, n := range r {\n\t\ttab.add(n)\n\t}\n\treply <- r\n}\n\nfunc (tab *Table) refresh() <-chan struct{} {\n\tdone := make(chan struct{})\n\tselect {\n\tcase tab.refreshReq <- done:\n\tcase <-tab.closed:\n\t\tclose(done)\n\t}\n\treturn done\n}\n\n// loop schedules refresh, revalidate runs and coordinates shutdown.\nfunc (tab *Table) loop() {\n\tvar (\n\t\trevalidate     = time.NewTimer(tab.nextRevalidateTime())\n\t\trefresh        = time.NewTicker(refreshInterval)\n\t\tcopyNodes      = time.NewTicker(copyNodesInterval)\n\t\trevalidateDone = make(chan struct{})\n\t\trefreshDone    = make(chan struct{})           // where doRefresh reports completion\n\t\twaiting        = []chan struct{}{tab.initDone} // holds waiting callers while doRefresh runs\n\t)\n\tdefer refresh.Stop()\n\tdefer revalidate.Stop()\n\tdefer copyNodes.Stop()\n\n\t// Start initial refresh.\n\tgo tab.doRefresh(refreshDone)\n\nloop:\n\tfor {\n\t\tselect {\n\t\tcase <-refresh.C:\n\t\t\ttab.seedRand()\n\t\t\tif refreshDone == nil {\n\t\t\t\trefreshDone = make(chan struct{})\n\t\t\t\tgo tab.doRefresh(refreshDone)\n\t\t\t}\n\t\tcase req := <-tab.refreshReq:\n\t\t\twaiting = append(waiting, req)\n\t\t\tif refreshDone == nil {\n\t\t\t\trefreshDone = make(chan struct{})\n\t\t\t\tgo tab.doRefresh(refreshDone)\n\t\t\t}\n\t\tcase <-refreshDone:\n\t\t\tfor _, ch := range waiting {\n\t\t\t\tclose(ch)\n\t\t\t}\n\t\t\twaiting, refreshDone = nil, nil\n\t\tcase <-revalidate.C:\n\t\t\tgo tab.doRevalidate(revalidateDone)\n\t\tcase <-revalidateDone:\n\t\t\trevalidate.Reset(tab.nextRevalidateTime())\n\t\tcase <-copyNodes.C:\n\t\t\tgo tab.copyLiveNodes()\n\t\tcase <-tab.closeReq:\n\t\t\tbreak loop\n\t\t}\n\t}\n\n\tif tab.net != nil {\n\t\ttab.net.close()\n\t}\n\tif refreshDone != nil {\n\t\t<-refreshDone\n\t}\n\tfor _, ch := range waiting {\n\t\tclose(ch)\n\t}\n\ttab.db.close()\n\tclose(tab.closed)\n}\n\n// doRefresh performs a lookup for a random target to keep buckets\n// full. seed nodes are inserted if the table is empty (initial\n// bootstrap or discarded faulty peers).\nfunc (tab *Table) doRefresh(done chan struct{}) {\n\tdefer close(done)\n\n\t// Load nodes from the database and insert\n\t// them. This should yield a few previously seen nodes that are\n\t// (hopefully) still alive.\n\ttab.loadSeedNodes()\n\n\t// Run self lookup to discover new neighbor nodes.\n\ttab.lookup(tab.self.ID, false)\n\n\t// The Kademlia paper specifies that the bucket refresh should\n\t// perform a lookup in the least recently used bucket. We cannot\n\t// adhere to this because the findnode target is a 512bit value\n\t// (not hash-sized) and it is not easily possible to generate a\n\t// sha3 preimage that falls into a chosen bucket.\n\t// We perform a few lookups with a random target instead.\n\tfor i := 0; i < 3; i++ {\n\t\tvar target NodeID\n\t\tcrand.Read(target[:])\n\t\ttab.lookup(target, false)\n\t}\n}\n\nfunc (tab *Table) loadSeedNodes() {\n\tseeds := tab.db.querySeeds(seedCount, seedMaxAge)\n\tseeds = append(seeds, tab.nursery...)\n\tfor i := range seeds {\n\t\tseed := seeds[i]\n\t\tage := log.Lazy{Fn: func() interface{} { return time.Since(tab.db.lastPongReceived(seed.ID)) }}\n\t\tlog.Debug(\"Found seed node in database\", \"id\", seed.ID, \"addr\", seed.addr(), \"age\", age)\n\t\ttab.add(seed)\n\t}\n}\n\n// doRevalidate checks that the last node in a random bucket is still live\n// and replaces or deletes the node if it isn't.\nfunc (tab *Table) doRevalidate(done chan<- struct{}) {\n\tdefer func() { done <- struct{}{} }()\n\n\tlast, bi := tab.nodeToRevalidate()\n\tif last == nil {\n\t\t// No non-empty bucket found.\n\t\treturn\n\t}\n\n\t// Ping the selected node and wait for a pong.\n\terr := tab.net.ping(last.ID, last.addr())\n\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\tb := tab.buckets[bi]\n\tif err == nil {\n\t\t// The node responded, move it to the front.\n\t\tlog.Trace(\"Revalidated node\", \"b\", bi, \"id\", last.ID)\n\t\tb.bump(last)\n\t\treturn\n\t}\n\t// No reply received, pick a replacement or delete the node if there aren't\n\t// any replacements.\n\tif r := tab.replace(b, last); r != nil {\n\t\tlog.Trace(\"Replaced dead node\", \"b\", bi, \"id\", last.ID, \"ip\", last.IP, \"r\", r.ID, \"rip\", r.IP)\n\t} else {\n\t\tlog.Trace(\"Removed dead node\", \"b\", bi, \"id\", last.ID, \"ip\", last.IP)\n\t}\n}\n\n// nodeToRevalidate returns the last node in a random, non-empty bucket.\nfunc (tab *Table) nodeToRevalidate() (n *Node, bi int) {\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\n\tfor _, bi = range tab.rand.Perm(len(tab.buckets)) {\n\t\tb := tab.buckets[bi]\n\t\tif len(b.entries) > 0 {\n\t\t\tlast := b.entries[len(b.entries)-1]\n\t\t\treturn last, bi\n\t\t}\n\t}\n\treturn nil, 0\n}\n\nfunc (tab *Table) nextRevalidateTime() time.Duration {\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\n\treturn time.Duration(tab.rand.Int63n(int64(revalidateInterval)))\n}\n\n// copyLiveNodes adds nodes from the table to the database if they have been in the table\n// longer then minTableTime.\nfunc (tab *Table) copyLiveNodes() {\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\n\tnow := time.Now()\n\tfor _, b := range &tab.buckets {\n\t\tfor _, n := range b.entries {\n\t\t\tif now.Sub(n.addedAt) >= seedMinTableTime {\n\t\t\t\ttab.db.updateNode(n)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// closest returns the n nodes in the table that are closest to the\n// given id. The caller must hold tab.mutex.\nfunc (tab *Table) closest(target common.Hash, nresults int) *nodesByDistance {\n\t// This is a very wasteful way to find the closest nodes but\n\t// obviously correct. I believe that tree-based buckets would make\n\t// this easier to implement efficiently.\n\tclose := &nodesByDistance{target: target}\n\tfor _, b := range &tab.buckets {\n\t\tfor _, n := range b.entries {\n\t\t\tclose.push(n, nresults)\n\t\t}\n\t}\n\treturn close\n}\n\nfunc (tab *Table) len() (n int) {\n\tfor _, b := range &tab.buckets {\n\t\tn += len(b.entries)\n\t}\n\treturn n\n}\n\n// bucket returns the bucket for the given node ID hash.\nfunc (tab *Table) bucket(sha common.Hash) *bucket {\n\td := logdist(tab.self.sha, sha)\n\tif d <= bucketMinDistance {\n\t\treturn tab.buckets[0]\n\t}\n\treturn tab.buckets[d-bucketMinDistance-1]\n}\n\n// add attempts to add the given node to its corresponding bucket. If the bucket has space\n// available, adding the node succeeds immediately. Otherwise, the node is added if the\n// least recently active node in the bucket does not respond to a ping packet.\n//\n// The caller must not hold tab.mutex.\nfunc (tab *Table) add(n *Node) {\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\n\tb := tab.bucket(n.sha)\n\tif !tab.bumpOrAdd(b, n) {\n\t\t// Node is not in table. Add it to the replacement list.\n\t\ttab.addReplacement(b, n)\n\t}\n}\n\n// addThroughPing adds the given node to the table. Compared to plain\n// 'add' there is an additional safety measure: if the table is still\n// initializing the node is not added. This prevents an attack where the\n// table could be filled by just sending ping repeatedly.\n//\n// The caller must not hold tab.mutex.\nfunc (tab *Table) addThroughPing(n *Node) {\n\tif !tab.isInitDone() {\n\t\treturn\n\t}\n\ttab.add(n)\n}\n\n// stuff adds nodes the table to the end of their corresponding bucket\n// if the bucket is not full. The caller must not hold tab.mutex.\nfunc (tab *Table) stuff(nodes []*Node) {\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\n\tfor _, n := range nodes {\n\t\tif n.ID == tab.self.ID {\n\t\t\tcontinue // don't add self\n\t\t}\n\t\tb := tab.bucket(n.sha)\n\t\tif len(b.entries) < bucketSize {\n\t\t\ttab.bumpOrAdd(b, n)\n\t\t}\n\t}\n}\n\n// delete removes an entry from the node table. It is used to evacuate dead nodes.\nfunc (tab *Table) delete(node *Node) {\n\ttab.mutex.Lock()\n\tdefer tab.mutex.Unlock()\n\n\ttab.deleteInBucket(tab.bucket(node.sha), node)\n}\n\nfunc (tab *Table) addIP(b *bucket, ip net.IP) bool {\n\tif netutil.IsLAN(ip) {\n\t\treturn true\n\t}\n\tif !tab.ips.Add(ip) {\n\t\tlog.Debug(\"IP exceeds table limit\", \"ip\", ip)\n\t\treturn false\n\t}\n\tif !b.ips.Add(ip) {\n\t\tlog.Debug(\"IP exceeds bucket limit\", \"ip\", ip)\n\t\ttab.ips.Remove(ip)\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (tab *Table) removeIP(b *bucket, ip net.IP) {\n\tif netutil.IsLAN(ip) {\n\t\treturn\n\t}\n\ttab.ips.Remove(ip)\n\tb.ips.Remove(ip)\n}\n\nfunc (tab *Table) addReplacement(b *bucket, n *Node) {\n\tfor _, e := range b.replacements {\n\t\tif e.ID == n.ID {\n\t\t\treturn // already in list\n\t\t}\n\t}\n\tif !tab.addIP(b, n.IP) {\n\t\treturn\n\t}\n\tvar removed *Node\n\tb.replacements, removed = pushNode(b.replacements, n, maxReplacements)\n\tif removed != nil {\n\t\ttab.removeIP(b, removed.IP)\n\t}\n}\n\n// replace removes n from the replacement list and replaces 'last' with it if it is the\n// last entry in the bucket. If 'last' isn't the last entry, it has either been replaced\n// with someone else or became active.\nfunc (tab *Table) replace(b *bucket, last *Node) *Node {\n\tif len(b.entries) == 0 || b.entries[len(b.entries)-1].ID != last.ID {\n\t\t// Entry has moved, don't replace it.\n\t\treturn nil\n\t}\n\t// Still the last entry.\n\tif len(b.replacements) == 0 {\n\t\ttab.deleteInBucket(b, last)\n\t\treturn nil\n\t}\n\tr := b.replacements[tab.rand.Intn(len(b.replacements))]\n\tb.replacements = deleteNode(b.replacements, r)\n\tb.entries[len(b.entries)-1] = r\n\ttab.removeIP(b, last.IP)\n\treturn r\n}\n\n// bump moves the given node to the front of the bucket entry list\n// if it is contained in that list.\nfunc (b *bucket) bump(n *Node) bool {\n\tfor i := range b.entries {\n\t\tif b.entries[i].ID == n.ID {\n\t\t\t// move it to the front\n\t\t\tcopy(b.entries[1:], b.entries[:i])\n\t\t\tb.entries[0] = n\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// bumpOrAdd moves n to the front of the bucket entry list or adds it if the list isn't\n// full. The return value is true if n is in the bucket.\nfunc (tab *Table) bumpOrAdd(b *bucket, n *Node) bool {\n\tif b.bump(n) {\n\t\treturn true\n\t}\n\tif len(b.entries) >= bucketSize || !tab.addIP(b, n.IP) {\n\t\treturn false\n\t}\n\tb.entries, _ = pushNode(b.entries, n, bucketSize)\n\tb.replacements = deleteNode(b.replacements, n)\n\tn.addedAt = time.Now()\n\tif tab.nodeAddedHook != nil {\n\t\ttab.nodeAddedHook(n)\n\t}\n\treturn true\n}\n\nfunc (tab *Table) deleteInBucket(b *bucket, n *Node) {\n\tb.entries = deleteNode(b.entries, n)\n\ttab.removeIP(b, n.IP)\n}\n\n// pushNode adds n to the front of list, keeping at most max items.\nfunc pushNode(list []*Node, n *Node, max int) ([]*Node, *Node) {\n\tif len(list) < max {\n\t\tlist = append(list, nil)\n\t}\n\tremoved := list[len(list)-1]\n\tcopy(list[1:], list)\n\tlist[0] = n\n\treturn list, removed\n}\n\n// deleteNode removes n from list.\nfunc deleteNode(list []*Node, n *Node) []*Node {\n\tfor i := range list {\n\t\tif list[i].ID == n.ID {\n\t\t\treturn append(list[:i], list[i+1:]...)\n\t\t}\n\t}\n\treturn list\n}\n\n// nodesByDistance is a list of nodes, ordered by\n// distance to target.\ntype nodesByDistance struct {\n\tentries []*Node\n\ttarget  common.Hash\n}\n\n// push adds the given node to the list, keeping the total size below maxElems.\nfunc (h *nodesByDistance) push(n *Node, maxElems int) {\n\tix := sort.Search(len(h.entries), func(i int) bool {\n\t\treturn distcmp(h.target, h.entries[i].sha, n.sha) > 0\n\t})\n\tif len(h.entries) < maxElems {\n\t\th.entries = append(h.entries, n)\n\t}\n\tif ix == len(h.entries) {\n\t\t// farther away than all nodes we already have.\n\t\t// if there was room for it, the node is now the last element.\n\t} else {\n\t\t// slide existing entries down to make room\n\t\t// this will overwrite the entry we just appended.\n\t\tcopy(h.entries[ix+1:], h.entries[ix:])\n\t\th.entries[ix] = n\n\t}\n}\n"
  },
  {
    "path": "p2p/discover/udp.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage discover\n\nimport (\n\t\"bytes\"\n\t\"container/list\"\n\t\"crypto/ecdsa\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/nat\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// Errors\nvar (\n\terrPacketTooSmall   = errors.New(\"too small\")\n\terrBadHash          = errors.New(\"bad hash\")\n\terrExpired          = errors.New(\"expired\")\n\terrUnsolicitedReply = errors.New(\"unsolicited reply\")\n\terrUnknownNode      = errors.New(\"unknown node\")\n\terrTimeout          = errors.New(\"RPC timeout\")\n\terrClockWarp        = errors.New(\"reply deadline too far in the future\")\n\terrClosed           = errors.New(\"socket closed\")\n)\n\n// Timeouts\nconst (\n\trespTimeout = 500 * time.Millisecond\n\texpiration  = 20 * time.Second\n\n\tntpFailureThreshold = 32               // Continuous timeouts after which to check NTP\n\tntpWarningCooldown  = 10 * time.Minute // Minimum amount of time to pass before repeating NTP warning\n\tdriftThreshold      = 10 * time.Second // Allowed clock drift before warning user\n)\n\n// RPC packet types\nconst (\n\tpingPacket = iota + 1 // zero is 'reserved'\n\tpongPacket\n\tfindnodePacket\n\tneighborsPacket\n)\n\n// RPC request structures\ntype (\n\tping struct {\n\t\tVersion    uint\n\t\tFrom, To   rpcEndpoint\n\t\tExpiration uint64\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\t// pong is the reply to ping.\n\tpong struct {\n\t\t// This field should mirror the UDP envelope address\n\t\t// of the ping packet, which provides a way to discover the\n\t\t// the external address (after NAT).\n\t\tTo rpcEndpoint\n\n\t\tReplyTok   []byte // This contains the hash of the ping packet.\n\t\tExpiration uint64 // Absolute timestamp at which the packet becomes invalid.\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\t// findnode is a query for nodes close to the given target.\n\tfindnode struct {\n\t\tTarget     NodeID // doesn't need to be an actual public key\n\t\tExpiration uint64\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\t// reply to findnode\n\tneighbors struct {\n\t\tNodes      []rpcNode\n\t\tExpiration uint64\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\trpcNode struct {\n\t\tIP  net.IP // len 4 for IPv4 or 16 for IPv6\n\t\tUDP uint16 // for discovery protocol\n\t\tTCP uint16 // for RLPx protocol\n\t\tID  NodeID\n\t}\n\n\trpcEndpoint struct {\n\t\tIP  net.IP // len 4 for IPv4 or 16 for IPv6\n\t\tUDP uint16 // for discovery protocol\n\t\tTCP uint16 // for RLPx protocol\n\t}\n)\n\nfunc makeEndpoint(addr *net.UDPAddr, tcpPort uint16) rpcEndpoint {\n\tip := addr.IP.To4()\n\tif ip == nil {\n\t\tip = addr.IP.To16()\n\t}\n\treturn rpcEndpoint{IP: ip, UDP: uint16(addr.Port), TCP: tcpPort}\n}\n\nfunc (t *udp) nodeFromRPC(sender *net.UDPAddr, rn rpcNode) (*Node, error) {\n\tif rn.UDP <= 1024 {\n\t\treturn nil, errors.New(\"low port\")\n\t}\n\tif err := netutil.CheckRelayIP(sender.IP, rn.IP); err != nil {\n\t\treturn nil, err\n\t}\n\tif t.netrestrict != nil && !t.netrestrict.Contains(rn.IP) {\n\t\treturn nil, errors.New(\"not contained in netrestrict whitelist\")\n\t}\n\tn := NewNode(rn.ID, rn.IP, rn.UDP, rn.TCP)\n\terr := n.validateComplete()\n\treturn n, err\n}\n\nfunc nodeToRPC(n *Node) rpcNode {\n\treturn rpcNode{ID: n.ID, IP: n.IP, UDP: n.UDP, TCP: n.TCP}\n}\n\ntype packet interface {\n\thandle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte) error\n\tname() string\n}\n\ntype conn interface {\n\tReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error)\n\tWriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error)\n\tClose() error\n\tLocalAddr() net.Addr\n}\n\n// udp implements the RPC protocol.\ntype udp struct {\n\tconn        conn\n\tnetrestrict *netutil.Netlist\n\tpriv        *ecdsa.PrivateKey\n\tourEndpoint rpcEndpoint\n\n\taddpending chan *pending\n\tgotreply   chan reply\n\n\tclosing chan struct{}\n\tnat     nat.Interface\n\n\t*Table\n}\n\n// pending represents a pending reply.\n//\n// some implementations of the protocol wish to send more than one\n// reply packet to findnode. in general, any neighbors packet cannot\n// be matched up with a specific findnode packet.\n//\n// our implementation handles this by storing a callback function for\n// each pending reply. incoming packets from a node are dispatched\n// to all the callback functions for that node.\ntype pending struct {\n\t// these fields must match in the reply.\n\tfrom  NodeID\n\tptype byte\n\n\t// time when the request must complete\n\tdeadline time.Time\n\n\t// callback is called when a matching reply arrives. if it returns\n\t// true, the callback is removed from the pending reply queue.\n\t// if it returns false, the reply is considered incomplete and\n\t// the callback will be invoked again for the next matching reply.\n\tcallback func(resp interface{}) (done bool)\n\n\t// errc receives nil when the callback indicates completion or an\n\t// error if no further reply is received within the timeout.\n\terrc chan<- error\n}\n\ntype reply struct {\n\tfrom  NodeID\n\tptype byte\n\tdata  interface{}\n\t// loop indicates whether there was\n\t// a matching request by sending on this channel.\n\tmatched chan<- bool\n}\n\n// ReadPacket is sent to the unhandled channel when it could not be processed\ntype ReadPacket struct {\n\tData []byte\n\tAddr *net.UDPAddr\n}\n\n// Config holds Table-related settings.\ntype Config struct {\n\t// These settings are required and configure the UDP listener:\n\tPrivateKey *ecdsa.PrivateKey\n\n\t// These settings are optional:\n\tAnnounceAddr *net.UDPAddr      // local address announced in the DHT\n\tNodeDBPath   string            // if set, the node database is stored at this filesystem location\n\tNetRestrict  *netutil.Netlist  // network whitelist\n\tBootnodes    []*Node           // list of bootstrap nodes\n\tUnhandled    chan<- ReadPacket // unhandled packets are sent on this channel\n}\n\n// ListenUDP returns a new table that listens for UDP packets on laddr.\nfunc ListenUDP(c conn, cfg Config) (*Table, error) {\n\ttab, _, err := newUDP(c, cfg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlog.Info(\"UDP listener up\", \"self\", tab.self)\n\treturn tab, nil\n}\n\nfunc newUDP(c conn, cfg Config) (*Table, *udp, error) {\n\tudp := &udp{\n\t\tconn:        c,\n\t\tpriv:        cfg.PrivateKey,\n\t\tnetrestrict: cfg.NetRestrict,\n\t\tclosing:     make(chan struct{}),\n\t\tgotreply:    make(chan reply),\n\t\taddpending:  make(chan *pending),\n\t}\n\trealaddr := c.LocalAddr().(*net.UDPAddr)\n\tif cfg.AnnounceAddr != nil {\n\t\trealaddr = cfg.AnnounceAddr\n\t}\n\t// TODO: separate TCP port\n\tudp.ourEndpoint = makeEndpoint(realaddr, uint16(realaddr.Port))\n\ttab, err := newTable(udp, PubkeyID(&cfg.PrivateKey.PublicKey), realaddr, cfg.NodeDBPath, cfg.Bootnodes)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tudp.Table = tab\n\n\tgo udp.loop()\n\tgo udp.readLoop(cfg.Unhandled)\n\treturn udp.Table, udp, nil\n}\n\nfunc (t *udp) close() {\n\tclose(t.closing)\n\tt.conn.Close()\n\t// TODO: wait for the loops to end.\n}\n\n// ping sends a ping message to the given node and waits for a reply.\nfunc (t *udp) ping(toid NodeID, toaddr *net.UDPAddr) error {\n\treturn <-t.sendPing(toid, toaddr, nil)\n}\n\n// sendPing sends a ping message to the given node and invokes the callback\n// when the reply arrives.\nfunc (t *udp) sendPing(toid NodeID, toaddr *net.UDPAddr, callback func()) <-chan error {\n\treq := &ping{\n\t\tVersion:    4,\n\t\tFrom:       t.ourEndpoint,\n\t\tTo:         makeEndpoint(toaddr, 0), // TODO: maybe use known TCP port from DB\n\t\tExpiration: uint64(time.Now().Add(expiration).Unix()),\n\t}\n\tpacket, hash, err := encodePacket(t.priv, pingPacket, req)\n\tif err != nil {\n\t\terrc := make(chan error, 1)\n\t\terrc <- err\n\t\treturn errc\n\t}\n\terrc := t.pending(toid, pongPacket, func(p interface{}) bool {\n\t\tok := bytes.Equal(p.(*pong).ReplyTok, hash)\n\t\tif ok && callback != nil {\n\t\t\tcallback()\n\t\t}\n\t\treturn ok\n\t})\n\tt.write(toaddr, req.name(), packet)\n\treturn errc\n}\n\nfunc (t *udp) waitping(from NodeID) error {\n\treturn <-t.pending(from, pingPacket, func(interface{}) bool { return true })\n}\n\n// findnode sends a findnode request to the given node and waits until\n// the node has sent up to k neighbors.\nfunc (t *udp) findnode(toid NodeID, toaddr *net.UDPAddr, target NodeID) ([]*Node, error) {\n\t// If we haven't seen a ping from the destination node for a while, it won't remember\n\t// our endpoint proof and reject findnode. Solicit a ping first.\n\tif time.Since(t.db.lastPingReceived(toid)) > nodeDBNodeExpiration {\n\t\tt.ping(toid, toaddr)\n\t\tt.waitping(toid)\n\t}\n\n\tnodes := make([]*Node, 0, bucketSize)\n\tnreceived := 0\n\terrc := t.pending(toid, neighborsPacket, func(r interface{}) bool {\n\t\treply := r.(*neighbors)\n\t\tfor _, rn := range reply.Nodes {\n\t\t\tnreceived++\n\t\t\tn, err := t.nodeFromRPC(toaddr, rn)\n\t\t\tif err != nil {\n\t\t\t\tlog.Trace(\"Invalid neighbor node received\", \"ip\", rn.IP, \"addr\", toaddr, \"err\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tnodes = append(nodes, n)\n\t\t}\n\t\treturn nreceived >= bucketSize\n\t})\n\tt.send(toaddr, findnodePacket, &findnode{\n\t\tTarget:     target,\n\t\tExpiration: uint64(time.Now().Add(expiration).Unix()),\n\t})\n\treturn nodes, <-errc\n}\n\n// pending adds a reply callback to the pending reply queue.\n// see the documentation of type pending for a detailed explanation.\nfunc (t *udp) pending(id NodeID, ptype byte, callback func(interface{}) bool) <-chan error {\n\tch := make(chan error, 1)\n\tp := &pending{from: id, ptype: ptype, callback: callback, errc: ch}\n\tselect {\n\tcase t.addpending <- p:\n\t\t// loop will handle it\n\tcase <-t.closing:\n\t\tch <- errClosed\n\t}\n\treturn ch\n}\n\nfunc (t *udp) handleReply(from NodeID, ptype byte, req packet) bool {\n\tmatched := make(chan bool, 1)\n\tselect {\n\tcase t.gotreply <- reply{from, ptype, req, matched}:\n\t\t// loop will handle it\n\t\treturn <-matched\n\tcase <-t.closing:\n\t\treturn false\n\t}\n}\n\n// loop runs in its own goroutine. it keeps track of\n// the refresh timer and the pending reply queue.\nfunc (t *udp) loop() {\n\tvar (\n\t\tplist        = list.New()\n\t\ttimeout      = time.NewTimer(0)\n\t\tnextTimeout  *pending // head of plist when timeout was last reset\n\t\tcontTimeouts = 0      // number of continuous timeouts to do NTP checks\n\t\tntpWarnTime  = time.Unix(0, 0)\n\t)\n\t<-timeout.C // ignore first timeout\n\tdefer timeout.Stop()\n\n\tresetTimeout := func() {\n\t\tif plist.Front() == nil || nextTimeout == plist.Front().Value {\n\t\t\treturn\n\t\t}\n\t\t// Start the timer so it fires when the next pending reply has expired.\n\t\tnow := time.Now()\n\t\tfor el := plist.Front(); el != nil; el = el.Next() {\n\t\t\tnextTimeout = el.Value.(*pending)\n\t\t\tif dist := nextTimeout.deadline.Sub(now); dist < 2*respTimeout {\n\t\t\t\ttimeout.Reset(dist)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Remove pending replies whose deadline is too far in the\n\t\t\t// future. These can occur if the system clock jumped\n\t\t\t// backwards after the deadline was assigned.\n\t\t\tnextTimeout.errc <- errClockWarp\n\t\t\tplist.Remove(el)\n\t\t}\n\t\tnextTimeout = nil\n\t\ttimeout.Stop()\n\t}\n\n\tfor {\n\t\tresetTimeout()\n\n\t\tselect {\n\t\tcase <-t.closing:\n\t\t\tfor el := plist.Front(); el != nil; el = el.Next() {\n\t\t\t\tel.Value.(*pending).errc <- errClosed\n\t\t\t}\n\t\t\treturn\n\n\t\tcase p := <-t.addpending:\n\t\t\tp.deadline = time.Now().Add(respTimeout)\n\t\t\tplist.PushBack(p)\n\n\t\tcase r := <-t.gotreply:\n\t\t\tvar matched bool\n\t\t\tfor el := plist.Front(); el != nil; el = el.Next() {\n\t\t\t\tp := el.Value.(*pending)\n\t\t\t\tif p.from == r.from && p.ptype == r.ptype {\n\t\t\t\t\tmatched = true\n\t\t\t\t\t// Remove the matcher if its callback indicates\n\t\t\t\t\t// that all replies have been received. This is\n\t\t\t\t\t// required for packet types that expect multiple\n\t\t\t\t\t// reply packets.\n\t\t\t\t\tif p.callback(r.data) {\n\t\t\t\t\t\tp.errc <- nil\n\t\t\t\t\t\tplist.Remove(el)\n\t\t\t\t\t}\n\t\t\t\t\t// Reset the continuous timeout counter (time drift detection)\n\t\t\t\t\tcontTimeouts = 0\n\t\t\t\t}\n\t\t\t}\n\t\t\tr.matched <- matched\n\n\t\tcase now := <-timeout.C:\n\t\t\tnextTimeout = nil\n\n\t\t\t// Notify and remove callbacks whose deadline is in the past.\n\t\t\tfor el := plist.Front(); el != nil; el = el.Next() {\n\t\t\t\tp := el.Value.(*pending)\n\t\t\t\tif now.After(p.deadline) || now.Equal(p.deadline) {\n\t\t\t\t\tp.errc <- errTimeout\n\t\t\t\t\tplist.Remove(el)\n\t\t\t\t\tcontTimeouts++\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we've accumulated too many timeouts, do an NTP time sync check\n\t\t\tif contTimeouts > ntpFailureThreshold {\n\t\t\t\tif time.Since(ntpWarnTime) >= ntpWarningCooldown {\n\t\t\t\t\tntpWarnTime = time.Now()\n\t\t\t\t\tgo checkClockDrift()\n\t\t\t\t}\n\t\t\t\tcontTimeouts = 0\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst (\n\tmacSize  = 256 / 8\n\tsigSize  = 520 / 8\n\theadSize = macSize + sigSize // space of packet frame data\n)\n\nvar (\n\theadSpace = make([]byte, headSize)\n\n\t// Neighbors replies are sent across multiple packets to\n\t// stay below the 1280 byte limit. We compute the maximum number\n\t// of entries by stuffing a packet until it grows too large.\n\tmaxNeighbors int\n)\n\nfunc init() {\n\tp := neighbors{Expiration: ^uint64(0)}\n\tmaxSizeNode := rpcNode{IP: make(net.IP, 16), UDP: ^uint16(0), TCP: ^uint16(0)}\n\tfor n := 0; ; n++ {\n\t\tp.Nodes = append(p.Nodes, maxSizeNode)\n\t\tsize, _, err := rlp.EncodeToReader(p)\n\t\tif err != nil {\n\t\t\t// If this ever happens, it will be caught by the unit tests.\n\t\t\tpanic(\"cannot encode: \" + err.Error())\n\t\t}\n\t\tif headSize+size+1 >= 1280 {\n\t\t\tmaxNeighbors = n\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (t *udp) send(toaddr *net.UDPAddr, ptype byte, req packet) ([]byte, error) {\n\tpacket, hash, err := encodePacket(t.priv, ptype, req)\n\tif err != nil {\n\t\treturn hash, err\n\t}\n\treturn hash, t.write(toaddr, req.name(), packet)\n}\n\nfunc (t *udp) write(toaddr *net.UDPAddr, what string, packet []byte) error {\n\t_, err := t.conn.WriteToUDP(packet, toaddr)\n\tlog.Trace(\">> \"+what, \"addr\", toaddr, \"err\", err)\n\treturn err\n}\n\nfunc encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) (packet, hash []byte, err error) {\n\tb := new(bytes.Buffer)\n\tb.Write(headSpace)\n\tb.WriteByte(ptype)\n\tif err := rlp.Encode(b, req); err != nil {\n\t\tlog.Error(\"Can't encode discv4 packet\", \"err\", err)\n\t\treturn nil, nil, err\n\t}\n\tpacket = b.Bytes()\n\tsig, err := crypto.Sign(crypto.Keccak256(packet[headSize:]), priv)\n\tif err != nil {\n\t\tlog.Error(\"Can't sign discv4 packet\", \"err\", err)\n\t\treturn nil, nil, err\n\t}\n\tcopy(packet[macSize:], sig)\n\t// add the hash to the front. Note: this doesn't protect the\n\t// packet in any way. Our public key will be part of this hash in\n\t// The future.\n\thash = crypto.Keccak256(packet[macSize:])\n\tcopy(packet, hash)\n\treturn packet, hash, nil\n}\n\n// readLoop runs in its own goroutine. it handles incoming UDP packets.\nfunc (t *udp) readLoop(unhandled chan<- ReadPacket) {\n\tdefer t.conn.Close()\n\tif unhandled != nil {\n\t\tdefer close(unhandled)\n\t}\n\t// Discovery packets are defined to be no larger than 1280 bytes.\n\t// Packets larger than this size will be cut at the end and treated\n\t// as invalid because their hash won't match.\n\tbuf := make([]byte, 1280)\n\tfor {\n\t\tnbytes, from, err := t.conn.ReadFromUDP(buf)\n\t\tif netutil.IsTemporaryError(err) {\n\t\t\t// Ignore temporary read errors.\n\t\t\tlog.Debug(\"Temporary UDP read error\", \"err\", err)\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\t// Shut down the loop for permament errors.\n\t\t\tlog.Debug(\"UDP read error\", \"err\", err)\n\t\t\treturn\n\t\t}\n\t\tif t.handlePacket(from, buf[:nbytes]) != nil && unhandled != nil {\n\t\t\tselect {\n\t\t\tcase unhandled <- ReadPacket{buf[:nbytes], from}:\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (t *udp) handlePacket(from *net.UDPAddr, buf []byte) error {\n\tpacket, fromID, hash, err := decodePacket(buf)\n\tif err != nil {\n\t\tlog.Debug(\"Bad discv4 packet\", \"addr\", from, \"err\", err)\n\t\treturn err\n\t}\n\terr = packet.handle(t, from, fromID, hash)\n\tlog.Trace(\"<< \"+packet.name(), \"addr\", from, \"err\", err)\n\treturn err\n}\n\nfunc decodePacket(buf []byte) (packet, NodeID, []byte, error) {\n\tif len(buf) < headSize+1 {\n\t\treturn nil, NodeID{}, nil, errPacketTooSmall\n\t}\n\thash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:]\n\tshouldhash := crypto.Keccak256(buf[macSize:])\n\tif !bytes.Equal(hash, shouldhash) {\n\t\treturn nil, NodeID{}, nil, errBadHash\n\t}\n\tfromID, err := recoverNodeID(crypto.Keccak256(buf[headSize:]), sig)\n\tif err != nil {\n\t\treturn nil, NodeID{}, hash, err\n\t}\n\tvar req packet\n\tswitch ptype := sigdata[0]; ptype {\n\tcase pingPacket:\n\t\treq = new(ping)\n\tcase pongPacket:\n\t\treq = new(pong)\n\tcase findnodePacket:\n\t\treq = new(findnode)\n\tcase neighborsPacket:\n\t\treq = new(neighbors)\n\tdefault:\n\t\treturn nil, fromID, hash, fmt.Errorf(\"unknown type: %d\", ptype)\n\t}\n\ts := rlp.NewStream(bytes.NewReader(sigdata[1:]), 0)\n\terr = s.Decode(req)\n\treturn req, fromID, hash, err\n}\n\nfunc (req *ping) handle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte) error {\n\tif expired(req.Expiration) {\n\t\treturn errExpired\n\t}\n\tt.send(from, pongPacket, &pong{\n\t\tTo:         makeEndpoint(from, req.From.TCP),\n\t\tReplyTok:   mac,\n\t\tExpiration: uint64(time.Now().Add(expiration).Unix()),\n\t})\n\tt.handleReply(fromID, pingPacket, req)\n\n\t// Add the node to the table. Before doing so, ensure that we have a recent enough pong\n\t// recorded in the database so their findnode requests will be accepted later.\n\tn := NewNode(fromID, from.IP, uint16(from.Port), req.From.TCP)\n\tif time.Since(t.db.lastPongReceived(fromID)) > nodeDBNodeExpiration {\n\t\tt.sendPing(fromID, from, func() { t.addThroughPing(n) })\n\t} else {\n\t\tt.addThroughPing(n)\n\t}\n\tt.db.updateLastPingReceived(fromID, time.Now())\n\treturn nil\n}\n\nfunc (req *ping) name() string { return \"PING/v4\" }\n\nfunc (req *pong) handle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte) error {\n\tif expired(req.Expiration) {\n\t\treturn errExpired\n\t}\n\tif !t.handleReply(fromID, pongPacket, req) {\n\t\treturn errUnsolicitedReply\n\t}\n\tt.db.updateLastPongReceived(fromID, time.Now())\n\treturn nil\n}\n\nfunc (req *pong) name() string { return \"PONG/v4\" }\n\nfunc (req *findnode) handle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte) error {\n\tif expired(req.Expiration) {\n\t\treturn errExpired\n\t}\n\tif !t.db.hasBond(fromID) {\n\t\t// No endpoint proof pong exists, we don't process the packet. This prevents an\n\t\t// attack vector where the discovery protocol could be used to amplify traffic in a\n\t\t// DDOS attack. A malicious actor would send a findnode request with the IP address\n\t\t// and UDP port of the target as the source address. The recipient of the findnode\n\t\t// packet would then send a neighbors packet (which is a much bigger packet than\n\t\t// findnode) to the victim.\n\t\treturn errUnknownNode\n\t}\n\ttarget := crypto.Keccak256Hash(req.Target[:])\n\tt.mutex.Lock()\n\tclosest := t.closest(target, bucketSize).entries\n\tt.mutex.Unlock()\n\n\tp := neighbors{Expiration: uint64(time.Now().Add(expiration).Unix())}\n\tvar sent bool\n\t// Send neighbors in chunks with at most maxNeighbors per packet\n\t// to stay below the 1280 byte limit.\n\tfor _, n := range closest {\n\t\tif netutil.CheckRelayIP(from.IP, n.IP) == nil {\n\t\t\tp.Nodes = append(p.Nodes, nodeToRPC(n))\n\t\t}\n\t\tif len(p.Nodes) == maxNeighbors {\n\t\t\tt.send(from, neighborsPacket, &p)\n\t\t\tp.Nodes = p.Nodes[:0]\n\t\t\tsent = true\n\t\t}\n\t}\n\tif len(p.Nodes) > 0 || !sent {\n\t\tt.send(from, neighborsPacket, &p)\n\t}\n\treturn nil\n}\n\nfunc (req *findnode) name() string { return \"FINDNODE/v4\" }\n\nfunc (req *neighbors) handle(t *udp, from *net.UDPAddr, fromID NodeID, mac []byte) error {\n\tif expired(req.Expiration) {\n\t\treturn errExpired\n\t}\n\tif !t.handleReply(fromID, neighborsPacket, req) {\n\t\treturn errUnsolicitedReply\n\t}\n\treturn nil\n}\n\nfunc (req *neighbors) name() string { return \"NEIGHBORS/v4\" }\n\nfunc expired(ts uint64) bool {\n\treturn time.Unix(int64(ts), 0).Before(time.Now())\n}\n"
  },
  {
    "path": "p2p/discv5/database.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the node database, storing previously seen nodes and any collected\n// metadata about them for QoS purposes.\n\npackage discv5\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/syndtr/goleveldb/leveldb\"\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nvar (\n\tnodeDBNilNodeID      = NodeID{}       // Special node ID to use as a nil element.\n\tnodeDBNodeExpiration = 24 * time.Hour // Time after which an unseen node should be dropped.\n\tnodeDBCleanupCycle   = time.Hour      // Time period for running the expiration task.\n)\n\n// nodeDB stores all nodes we know about.\ntype nodeDB struct {\n\tlvl    *leveldb.DB   // Interface to the database itself\n\tself   NodeID        // Own node id to prevent adding it into the database\n\trunner sync.Once     // Ensures we can start at most one expirer\n\tquit   chan struct{} // Channel to signal the expiring thread to stop\n}\n\n// Schema layout for the node database\nvar (\n\tnodeDBVersionKey = []byte(\"version\") // Version of the database to flush if changes\n\tnodeDBItemPrefix = []byte(\"n:\")      // Identifier to prefix node entries with\n\n\tnodeDBDiscoverRoot          = \":discover\"\n\tnodeDBDiscoverPing          = nodeDBDiscoverRoot + \":lastping\"\n\tnodeDBDiscoverPong          = nodeDBDiscoverRoot + \":lastpong\"\n\tnodeDBDiscoverFindFails     = nodeDBDiscoverRoot + \":findfail\"\n\tnodeDBDiscoverLocalEndpoint = nodeDBDiscoverRoot + \":localendpoint\"\n\tnodeDBTopicRegTickets       = \":tickets\"\n)\n\n// newNodeDB creates a new node database for storing and retrieving infos about\n// known peers in the network. If no path is given, an in-memory, temporary\n// database is constructed.\nfunc newNodeDB(path string, version int, self NodeID) (*nodeDB, error) {\n\tif path == \"\" {\n\t\treturn newMemoryNodeDB(self)\n\t}\n\treturn newPersistentNodeDB(path, version, self)\n}\n\n// newMemoryNodeDB creates a new in-memory node database without a persistent\n// backend.\nfunc newMemoryNodeDB(self NodeID) (*nodeDB, error) {\n\tdb, err := leveldb.Open(storage.NewMemStorage(), nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &nodeDB{\n\t\tlvl:  db,\n\t\tself: self,\n\t\tquit: make(chan struct{}),\n\t}, nil\n}\n\n// newPersistentNodeDB creates/opens a leveldb backed persistent node database,\n// also flushing its contents in case of a version mismatch.\nfunc newPersistentNodeDB(path string, version int, self NodeID) (*nodeDB, error) {\n\topts := &opt.Options{OpenFilesCacheCapacity: 5}\n\tdb, err := leveldb.OpenFile(path, opts)\n\tif _, iscorrupted := err.(*errors.ErrCorrupted); iscorrupted {\n\t\tdb, err = leveldb.RecoverFile(path, nil)\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// The nodes contained in the cache correspond to a certain protocol version.\n\t// Flush all nodes if the version doesn't match.\n\tcurrentVer := make([]byte, binary.MaxVarintLen64)\n\tcurrentVer = currentVer[:binary.PutVarint(currentVer, int64(version))]\n\n\tblob, err := db.Get(nodeDBVersionKey, nil)\n\tswitch err {\n\tcase leveldb.ErrNotFound:\n\t\t// Version not found (i.e. empty cache), insert it\n\t\tif err := db.Put(nodeDBVersionKey, currentVer, nil); err != nil {\n\t\t\tdb.Close()\n\t\t\treturn nil, err\n\t\t}\n\n\tcase nil:\n\t\t// Version present, flush if different\n\t\tif !bytes.Equal(blob, currentVer) {\n\t\t\tdb.Close()\n\t\t\tif err = os.RemoveAll(path); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn newPersistentNodeDB(path, version, self)\n\t\t}\n\t}\n\treturn &nodeDB{\n\t\tlvl:  db,\n\t\tself: self,\n\t\tquit: make(chan struct{}),\n\t}, nil\n}\n\n// makeKey generates the leveldb key-blob from a node id and its particular\n// field of interest.\nfunc makeKey(id NodeID, field string) []byte {\n\tif bytes.Equal(id[:], nodeDBNilNodeID[:]) {\n\t\treturn []byte(field)\n\t}\n\treturn append(nodeDBItemPrefix, append(id[:], field...)...)\n}\n\n// splitKey tries to split a database key into a node id and a field part.\nfunc splitKey(key []byte) (id NodeID, field string) {\n\t// If the key is not of a node, return it plainly\n\tif !bytes.HasPrefix(key, nodeDBItemPrefix) {\n\t\treturn NodeID{}, string(key)\n\t}\n\t// Otherwise split the id and field\n\titem := key[len(nodeDBItemPrefix):]\n\tcopy(id[:], item[:len(id)])\n\tfield = string(item[len(id):])\n\n\treturn id, field\n}\n\n// fetchInt64 retrieves an integer instance associated with a particular\n// database key.\nfunc (db *nodeDB) fetchInt64(key []byte) int64 {\n\tblob, err := db.lvl.Get(key, nil)\n\tif err != nil {\n\t\treturn 0\n\t}\n\tval, read := binary.Varint(blob)\n\tif read <= 0 {\n\t\treturn 0\n\t}\n\treturn val\n}\n\n// storeInt64 update a specific database entry to the current time instance as a\n// unix timestamp.\nfunc (db *nodeDB) storeInt64(key []byte, n int64) error {\n\tblob := make([]byte, binary.MaxVarintLen64)\n\tblob = blob[:binary.PutVarint(blob, n)]\n\treturn db.lvl.Put(key, blob, nil)\n}\n\nfunc (db *nodeDB) storeRLP(key []byte, val interface{}) error {\n\tblob, err := rlp.EncodeToBytes(val)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn db.lvl.Put(key, blob, nil)\n}\n\nfunc (db *nodeDB) fetchRLP(key []byte, val interface{}) error {\n\tblob, err := db.lvl.Get(key, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = rlp.DecodeBytes(blob, val)\n\tif err != nil {\n\t\tlog.Warn(fmt.Sprintf(\"key %x (%T) %v\", key, val, err))\n\t}\n\treturn err\n}\n\n// node retrieves a node with a given id from the database.\nfunc (db *nodeDB) node(id NodeID) *Node {\n\tvar node Node\n\tif err := db.fetchRLP(makeKey(id, nodeDBDiscoverRoot), &node); err != nil {\n\t\treturn nil\n\t}\n\tnode.sha = crypto.Keccak256Hash(node.ID[:])\n\treturn &node\n}\n\n// updateNode inserts - potentially overwriting - a node into the peer database.\nfunc (db *nodeDB) updateNode(node *Node) error {\n\treturn db.storeRLP(makeKey(node.ID, nodeDBDiscoverRoot), node)\n}\n\n// deleteNode deletes all information/keys associated with a node.\nfunc (db *nodeDB) deleteNode(id NodeID) error {\n\tdeleter := db.lvl.NewIterator(util.BytesPrefix(makeKey(id, \"\")), nil)\n\tfor deleter.Next() {\n\t\tif err := db.lvl.Delete(deleter.Key(), nil); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// ensureExpirer is a small helper method ensuring that the data expiration\n// mechanism is running. If the expiration goroutine is already running, this\n// method simply returns.\n//\n// The goal is to start the data evacuation only after the network successfully\n// bootstrapped itself (to prevent dumping potentially useful seed nodes). Since\n// it would require significant overhead to exactly trace the first successful\n// convergence, it's simpler to \"ensure\" the correct state when an appropriate\n// condition occurs (i.e. a successful bonding), and discard further events.\nfunc (db *nodeDB) ensureExpirer() {\n\tdb.runner.Do(func() { go db.expirer() })\n}\n\n// expirer should be started in a go routine, and is responsible for looping ad\n// infinitum and dropping stale data from the database.\nfunc (db *nodeDB) expirer() {\n\ttick := time.NewTicker(nodeDBCleanupCycle)\n\tdefer tick.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-tick.C:\n\t\t\tif err := db.expireNodes(); err != nil {\n\t\t\t\tlog.Error(fmt.Sprintf(\"Failed to expire nodedb items: %v\", err))\n\t\t\t}\n\t\tcase <-db.quit:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// expireNodes iterates over the database and deletes all nodes that have not\n// been seen (i.e. received a pong from) for some allotted time.\nfunc (db *nodeDB) expireNodes() error {\n\tthreshold := time.Now().Add(-nodeDBNodeExpiration)\n\n\t// Find discovered nodes that are older than the allowance\n\tit := db.lvl.NewIterator(nil, nil)\n\tdefer it.Release()\n\n\tfor it.Next() {\n\t\t// Skip the item if not a discovery node\n\t\tid, field := splitKey(it.Key())\n\t\tif field != nodeDBDiscoverRoot {\n\t\t\tcontinue\n\t\t}\n\t\t// Skip the node if not expired yet (and not self)\n\t\tif !bytes.Equal(id[:], db.self[:]) {\n\t\t\tif seen := db.lastPong(id); seen.After(threshold) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\t// Otherwise delete all associated information\n\t\tdb.deleteNode(id)\n\t}\n\treturn nil\n}\n\n// lastPing retrieves the time of the last ping packet send to a remote node,\n// requesting binding.\nfunc (db *nodeDB) lastPing(id NodeID) time.Time {\n\treturn time.Unix(db.fetchInt64(makeKey(id, nodeDBDiscoverPing)), 0)\n}\n\n// updateLastPing updates the last time we tried contacting a remote node.\nfunc (db *nodeDB) updateLastPing(id NodeID, instance time.Time) error {\n\treturn db.storeInt64(makeKey(id, nodeDBDiscoverPing), instance.Unix())\n}\n\n// lastPong retrieves the time of the last successful contact from remote node.\nfunc (db *nodeDB) lastPong(id NodeID) time.Time {\n\treturn time.Unix(db.fetchInt64(makeKey(id, nodeDBDiscoverPong)), 0)\n}\n\n// updateLastPong updates the last time a remote node successfully contacted.\nfunc (db *nodeDB) updateLastPong(id NodeID, instance time.Time) error {\n\treturn db.storeInt64(makeKey(id, nodeDBDiscoverPong), instance.Unix())\n}\n\n// findFails retrieves the number of findnode failures since bonding.\nfunc (db *nodeDB) findFails(id NodeID) int {\n\treturn int(db.fetchInt64(makeKey(id, nodeDBDiscoverFindFails)))\n}\n\n// updateFindFails updates the number of findnode failures since bonding.\nfunc (db *nodeDB) updateFindFails(id NodeID, fails int) error {\n\treturn db.storeInt64(makeKey(id, nodeDBDiscoverFindFails), int64(fails))\n}\n\n// localEndpoint returns the last local endpoint communicated to the\n// given remote node.\nfunc (db *nodeDB) localEndpoint(id NodeID) *rpcEndpoint {\n\tvar ep rpcEndpoint\n\tif err := db.fetchRLP(makeKey(id, nodeDBDiscoverLocalEndpoint), &ep); err != nil {\n\t\treturn nil\n\t}\n\treturn &ep\n}\n\nfunc (db *nodeDB) updateLocalEndpoint(id NodeID, ep rpcEndpoint) error {\n\treturn db.storeRLP(makeKey(id, nodeDBDiscoverLocalEndpoint), &ep)\n}\n\n// querySeeds retrieves random nodes to be used as potential seed nodes\n// for bootstrapping.\nfunc (db *nodeDB) querySeeds(n int, maxAge time.Duration) []*Node {\n\tvar (\n\t\tnow   = time.Now()\n\t\tnodes = make([]*Node, 0, n)\n\t\tit    = db.lvl.NewIterator(nil, nil)\n\t\tid    NodeID\n\t)\n\tdefer it.Release()\n\nseek:\n\tfor seeks := 0; len(nodes) < n && seeks < n*5; seeks++ {\n\t\t// Seek to a random entry. The first byte is incremented by a\n\t\t// random amount each time in order to increase the likelihood\n\t\t// of hitting all existing nodes in very small databases.\n\t\tctr := id[0]\n\t\trand.Read(id[:])\n\t\tid[0] = ctr + id[0]%16\n\t\tit.Seek(makeKey(id, nodeDBDiscoverRoot))\n\n\t\tn := nextNode(it)\n\t\tif n == nil {\n\t\t\tid[0] = 0\n\t\t\tcontinue seek // iterator exhausted\n\t\t}\n\t\tif n.ID == db.self {\n\t\t\tcontinue seek\n\t\t}\n\t\tif now.Sub(db.lastPong(n.ID)) > maxAge {\n\t\t\tcontinue seek\n\t\t}\n\t\tfor i := range nodes {\n\t\t\tif nodes[i].ID == n.ID {\n\t\t\t\tcontinue seek // duplicate\n\t\t\t}\n\t\t}\n\t\tnodes = append(nodes, n)\n\t}\n\treturn nodes\n}\n\nfunc (db *nodeDB) fetchTopicRegTickets(id NodeID) (issued, used uint32) {\n\tkey := makeKey(id, nodeDBTopicRegTickets)\n\tblob, _ := db.lvl.Get(key, nil)\n\tif len(blob) != 8 {\n\t\treturn 0, 0\n\t}\n\tissued = binary.BigEndian.Uint32(blob[0:4])\n\tused = binary.BigEndian.Uint32(blob[4:8])\n\treturn\n}\n\nfunc (db *nodeDB) updateTopicRegTickets(id NodeID, issued, used uint32) error {\n\tkey := makeKey(id, nodeDBTopicRegTickets)\n\tblob := make([]byte, 8)\n\tbinary.BigEndian.PutUint32(blob[0:4], issued)\n\tbinary.BigEndian.PutUint32(blob[4:8], used)\n\treturn db.lvl.Put(key, blob, nil)\n}\n\n// reads the next node record from the iterator, skipping over other\n// database entries.\nfunc nextNode(it iterator.Iterator) *Node {\n\tfor end := false; !end; end = !it.Next() {\n\t\tid, field := splitKey(it.Key())\n\t\tif field != nodeDBDiscoverRoot {\n\t\t\tcontinue\n\t\t}\n\t\tvar n Node\n\t\tif err := rlp.DecodeBytes(it.Value(), &n); err != nil {\n\t\t\tlog.Warn(fmt.Sprintf(\"invalid node %x: %v\", id, err))\n\t\t\tcontinue\n\t\t}\n\t\treturn &n\n\t}\n\treturn nil\n}\n\n// close flushes and closes the database files.\nfunc (db *nodeDB) close() {\n\tclose(db.quit)\n\tdb.lvl.Close()\n}\n"
  },
  {
    "path": "p2p/discv5/metrics.go",
    "content": "package discv5\n\nimport \"github.com/sero-cash/go-sero/metrics\"\n\nvar (\n\tingressTrafficMeter = metrics.NewRegisteredMeter(\"discv5/InboundTraffic\", nil)\n\tegressTrafficMeter  = metrics.NewRegisteredMeter(\"discv5/OutboundTraffic\", nil)\n)\n"
  },
  {
    "path": "p2p/discv5/net.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage discv5\n\nimport (\n\t\"bytes\"\n\t\"crypto/ecdsa\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nvar (\n\terrInvalidEvent = errors.New(\"invalid in current state\")\n\terrNoQuery      = errors.New(\"no pending query\")\n)\n\nconst (\n\tautoRefreshInterval   = 1 * time.Hour\n\tbucketRefreshInterval = 1 * time.Minute\n\tseedCount             = 30\n\tseedMaxAge            = 5 * 24 * time.Hour\n\tlowPort               = 1024\n)\n\nconst (\n\tprintTestImgLogs = false\n)\n\n// Network manages the table and all protocol interaction.\ntype Network struct {\n\tdb          *nodeDB // database of known nodes\n\tconn        transport\n\tnetrestrict *netutil.Netlist\n\n\tclosed           chan struct{}          // closed when loop is done\n\tcloseReq         chan struct{}          // 'request to close'\n\trefreshReq       chan []*Node           // lookups ask for refresh on this channel\n\trefreshResp      chan (<-chan struct{}) // ...and get the channel to block on from this one\n\tread             chan ingressPacket     // ingress packets arrive here\n\ttimeout          chan timeoutEvent\n\tqueryReq         chan *findnodeQuery // lookups submit findnode queries on this channel\n\ttableOpReq       chan func()\n\ttableOpResp      chan struct{}\n\ttopicRegisterReq chan topicRegisterReq\n\ttopicSearchReq   chan topicSearchReq\n\n\t// State of the main loop.\n\ttab           *Table\n\ttopictab      *topicTable\n\tticketStore   *ticketStore\n\tnursery       []*Node\n\tnodes         map[NodeID]*Node // tracks active nodes with state != known\n\ttimeoutTimers map[timeoutEvent]*time.Timer\n\n\t// Revalidation queues.\n\t// Nodes put on these queues will be pinged eventually.\n\tslowRevalidateQueue []*Node\n\tfastRevalidateQueue []*Node\n\n\t// Buffers for state transition.\n\tsendBuf []*ingressPacket\n}\n\n// transport is implemented by the UDP transport.\n// it is an interface so we can test without opening lots of UDP\n// sockets and without generating a private key.\ntype transport interface {\n\tsendPing(remote *Node, remoteAddr *net.UDPAddr, topics []Topic) (hash []byte)\n\tsendNeighbours(remote *Node, nodes []*Node)\n\tsendFindnodeHash(remote *Node, target common.Hash)\n\tsendTopicRegister(remote *Node, topics []Topic, topicIdx int, pong []byte)\n\tsendTopicNodes(remote *Node, queryHash common.Hash, nodes []*Node)\n\n\tsend(remote *Node, ptype nodeEvent, p interface{}) (hash []byte)\n\n\tlocalAddr() *net.UDPAddr\n\tClose()\n}\n\ntype findnodeQuery struct {\n\tremote   *Node\n\ttarget   common.Hash\n\treply    chan<- []*Node\n\tnresults int // counter for received nodes\n}\n\ntype topicRegisterReq struct {\n\tadd   bool\n\ttopic Topic\n}\n\ntype topicSearchReq struct {\n\ttopic  Topic\n\tfound  chan<- *Node\n\tlookup chan<- bool\n\tdelay  time.Duration\n}\n\ntype topicSearchResult struct {\n\ttarget lookupInfo\n\tnodes  []*Node\n}\n\ntype timeoutEvent struct {\n\tev   nodeEvent\n\tnode *Node\n}\n\nfunc newNetwork(conn transport, ourPubkey ecdsa.PublicKey, dbPath string, netrestrict *netutil.Netlist) (*Network, error) {\n\tourID := PubkeyID(&ourPubkey)\n\n\tvar db *nodeDB\n\tif dbPath != \"<no database>\" {\n\t\tvar err error\n\t\tif db, err = newNodeDB(dbPath, Version, ourID); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\ttab := newTable(ourID, conn.localAddr())\n\tnet := &Network{\n\t\tdb:               db,\n\t\tconn:             conn,\n\t\tnetrestrict:      netrestrict,\n\t\ttab:              tab,\n\t\ttopictab:         newTopicTable(db, tab.self),\n\t\tticketStore:      newTicketStore(),\n\t\trefreshReq:       make(chan []*Node),\n\t\trefreshResp:      make(chan (<-chan struct{})),\n\t\tclosed:           make(chan struct{}),\n\t\tcloseReq:         make(chan struct{}),\n\t\tread:             make(chan ingressPacket, 100),\n\t\ttimeout:          make(chan timeoutEvent),\n\t\ttimeoutTimers:    make(map[timeoutEvent]*time.Timer),\n\t\ttableOpReq:       make(chan func()),\n\t\ttableOpResp:      make(chan struct{}),\n\t\tqueryReq:         make(chan *findnodeQuery),\n\t\ttopicRegisterReq: make(chan topicRegisterReq),\n\t\ttopicSearchReq:   make(chan topicSearchReq),\n\t\tnodes:            make(map[NodeID]*Node),\n\t}\n\tgo net.loop()\n\treturn net, nil\n}\n\n// Close terminates the network listener and flushes the node database.\nfunc (net *Network) Close() {\n\tnet.conn.Close()\n\tselect {\n\tcase <-net.closed:\n\tcase net.closeReq <- struct{}{}:\n\t\t<-net.closed\n\t}\n}\n\n// Self returns the local node.\n// The returned node should not be modified by the caller.\nfunc (net *Network) Self() *Node {\n\treturn net.tab.self\n}\n\n// ReadRandomNodes fills the given slice with random nodes from the\n// table. It will not write the same node more than once. The nodes in\n// the slice are copies and can be modified by the caller.\nfunc (net *Network) ReadRandomNodes(buf []*Node) (n int) {\n\tnet.reqTableOp(func() { n = net.tab.readRandomNodes(buf) })\n\treturn n\n}\n\n// SetFallbackNodes sets the initial points of contact. These nodes\n// are used to connect to the network if the table is empty and there\n// are no known nodes in the database.\nfunc (net *Network) SetFallbackNodes(nodes []*Node) error {\n\tnursery := make([]*Node, 0, len(nodes))\n\tfor _, n := range nodes {\n\t\tif err := n.validateComplete(); err != nil {\n\t\t\treturn fmt.Errorf(\"bad bootstrap/fallback node %q (%v)\", n, err)\n\t\t}\n\t\t// Recompute cpy.sha because the node might not have been\n\t\t// created by NewNode or ParseNode.\n\t\tcpy := *n\n\t\tcpy.sha = crypto.Keccak256Hash(n.ID[:])\n\t\tnursery = append(nursery, &cpy)\n\t}\n\tnet.reqRefresh(nursery)\n\treturn nil\n}\n\n// Resolve searches for a specific node with the given ID.\n// It returns nil if the node could not be found.\nfunc (net *Network) Resolve(targetID NodeID) *Node {\n\tresult := net.lookup(crypto.Keccak256Hash(targetID[:]), true)\n\tfor _, n := range result {\n\t\tif n.ID == targetID {\n\t\t\treturn n\n\t\t}\n\t}\n\treturn nil\n}\n\n// Lookup performs a network search for nodes close\n// to the given target. It approaches the target by querying\n// nodes that are closer to it on each iteration.\n// The given target does not need to be an actual node\n// identifier.\n//\n// The local node may be included in the result.\nfunc (net *Network) Lookup(targetID NodeID) []*Node {\n\treturn net.lookup(crypto.Keccak256Hash(targetID[:]), false)\n}\n\nfunc (net *Network) lookup(target common.Hash, stopOnMatch bool) []*Node {\n\tvar (\n\t\tasked          = make(map[NodeID]bool)\n\t\tseen           = make(map[NodeID]bool)\n\t\treply          = make(chan []*Node, alpha)\n\t\tresult         = nodesByDistance{target: target}\n\t\tpendingQueries = 0\n\t)\n\t// Get initial answers from the local node.\n\tresult.push(net.tab.self, bucketSize)\n\tfor {\n\t\t// Ask the α closest nodes that we haven't asked yet.\n\t\tfor i := 0; i < len(result.entries) && pendingQueries < alpha; i++ {\n\t\t\tn := result.entries[i]\n\t\t\tif !asked[n.ID] {\n\t\t\t\tasked[n.ID] = true\n\t\t\t\tpendingQueries++\n\t\t\t\tnet.reqQueryFindnode(n, target, reply)\n\t\t\t}\n\t\t}\n\t\tif pendingQueries == 0 {\n\t\t\t// We have asked all closest nodes, stop the search.\n\t\t\tbreak\n\t\t}\n\t\t// Wait for the next reply.\n\t\tselect {\n\t\tcase nodes := <-reply:\n\t\t\tfor _, n := range nodes {\n\t\t\t\tif n != nil && !seen[n.ID] {\n\t\t\t\t\tseen[n.ID] = true\n\t\t\t\t\tresult.push(n, bucketSize)\n\t\t\t\t\tif stopOnMatch && n.sha == target {\n\t\t\t\t\t\treturn result.entries\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tpendingQueries--\n\t\tcase <-time.After(respTimeout):\n\t\t\t// forget all pending requests, start new ones\n\t\t\tpendingQueries = 0\n\t\t\treply = make(chan []*Node, alpha)\n\t\t}\n\t}\n\treturn result.entries\n}\n\nfunc (net *Network) RegisterTopic(topic Topic, stop <-chan struct{}) {\n\tselect {\n\tcase net.topicRegisterReq <- topicRegisterReq{true, topic}:\n\tcase <-net.closed:\n\t\treturn\n\t}\n\tselect {\n\tcase <-net.closed:\n\tcase <-stop:\n\t\tselect {\n\t\tcase net.topicRegisterReq <- topicRegisterReq{false, topic}:\n\t\tcase <-net.closed:\n\t\t}\n\t}\n}\n\nfunc (net *Network) SearchTopic(topic Topic, setPeriod <-chan time.Duration, found chan<- *Node, lookup chan<- bool) {\n\tfor {\n\t\tselect {\n\t\tcase <-net.closed:\n\t\t\treturn\n\t\tcase delay, ok := <-setPeriod:\n\t\t\tselect {\n\t\t\tcase net.topicSearchReq <- topicSearchReq{topic: topic, found: found, lookup: lookup, delay: delay}:\n\t\t\tcase <-net.closed:\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (net *Network) reqRefresh(nursery []*Node) <-chan struct{} {\n\tselect {\n\tcase net.refreshReq <- nursery:\n\t\treturn <-net.refreshResp\n\tcase <-net.closed:\n\t\treturn net.closed\n\t}\n}\n\nfunc (net *Network) reqQueryFindnode(n *Node, target common.Hash, reply chan []*Node) bool {\n\tq := &findnodeQuery{remote: n, target: target, reply: reply}\n\tselect {\n\tcase net.queryReq <- q:\n\t\treturn true\n\tcase <-net.closed:\n\t\treturn false\n\t}\n}\n\nfunc (net *Network) reqReadPacket(pkt ingressPacket) {\n\tselect {\n\tcase net.read <- pkt:\n\tcase <-net.closed:\n\t}\n}\n\nfunc (net *Network) reqTableOp(f func()) (called bool) {\n\tselect {\n\tcase net.tableOpReq <- f:\n\t\t<-net.tableOpResp\n\t\treturn true\n\tcase <-net.closed:\n\t\treturn false\n\t}\n}\n\n// TODO: external address handling.\n\ntype topicSearchInfo struct {\n\tlookupChn chan<- bool\n\tperiod    time.Duration\n}\n\nconst maxSearchCount = 5\n\nfunc (net *Network) loop() {\n\tvar (\n\t\trefreshTimer       = time.NewTicker(autoRefreshInterval)\n\t\tbucketRefreshTimer = time.NewTimer(bucketRefreshInterval)\n\t\trefreshDone        chan struct{} // closed when the 'refresh' lookup has ended\n\t)\n\n\t// Tracking the next ticket to register.\n\tvar (\n\t\tnextTicket        *ticketRef\n\t\tnextRegisterTimer *time.Timer\n\t\tnextRegisterTime  <-chan time.Time\n\t)\n\tdefer func() {\n\t\tif nextRegisterTimer != nil {\n\t\t\tnextRegisterTimer.Stop()\n\t\t}\n\t}()\n\tresetNextTicket := func() {\n\t\tticket, timeout := net.ticketStore.nextFilteredTicket()\n\t\tif nextTicket != ticket {\n\t\t\tnextTicket = ticket\n\t\t\tif nextRegisterTimer != nil {\n\t\t\t\tnextRegisterTimer.Stop()\n\t\t\t\tnextRegisterTime = nil\n\t\t\t}\n\t\t\tif ticket != nil {\n\t\t\t\tnextRegisterTimer = time.NewTimer(timeout)\n\t\t\t\tnextRegisterTime = nextRegisterTimer.C\n\t\t\t}\n\t\t}\n\t}\n\n\t// Tracking registration and search lookups.\n\tvar (\n\t\ttopicRegisterLookupTarget lookupInfo\n\t\ttopicRegisterLookupDone   chan []*Node\n\t\ttopicRegisterLookupTick   = time.NewTimer(0)\n\t\tsearchReqWhenRefreshDone  []topicSearchReq\n\t\tsearchInfo                = make(map[Topic]topicSearchInfo)\n\t\tactiveSearchCount         int\n\t)\n\ttopicSearchLookupDone := make(chan topicSearchResult, 100)\n\ttopicSearch := make(chan Topic, 100)\n\t<-topicRegisterLookupTick.C\n\n\tstatsDump := time.NewTicker(10 * time.Second)\n\nloop:\n\tfor {\n\t\tresetNextTicket()\n\n\t\tselect {\n\t\tcase <-net.closeReq:\n\t\t\tlog.Trace(\"<-net.closeReq\")\n\t\t\tbreak loop\n\n\t\t// Ingress packet handling.\n\t\tcase pkt := <-net.read:\n\t\t\t//fmt.Println(\"read\", pkt.ev)\n\t\t\tlog.Trace(\"<-net.read\")\n\t\t\tn := net.internNode(&pkt)\n\t\t\tprestate := n.state\n\t\t\tstatus := \"ok\"\n\t\t\tif err := net.handle(n, pkt.ev, &pkt); err != nil {\n\t\t\t\tstatus = err.Error()\n\t\t\t}\n\t\t\tlog.Trace(\"\", \"msg\", log.Lazy{Fn: func() string {\n\t\t\t\treturn fmt.Sprintf(\"<<< (%d) %v from %x@%v: %v -> %v (%v)\",\n\t\t\t\t\tnet.tab.count, pkt.ev, pkt.remoteID[:8], pkt.remoteAddr, prestate, n.state, status)\n\t\t\t}})\n\t\t\t// TODO: persist state if n.state goes >= known, delete if it goes <= known\n\n\t\t// State transition timeouts.\n\t\tcase timeout := <-net.timeout:\n\t\t\tlog.Trace(\"<-net.timeout\")\n\t\t\tif net.timeoutTimers[timeout] == nil {\n\t\t\t\t// Stale timer (was aborted).\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdelete(net.timeoutTimers, timeout)\n\t\t\tprestate := timeout.node.state\n\t\t\tstatus := \"ok\"\n\t\t\tif err := net.handle(timeout.node, timeout.ev, nil); err != nil {\n\t\t\t\tstatus = err.Error()\n\t\t\t}\n\t\t\tlog.Trace(\"\", \"msg\", log.Lazy{Fn: func() string {\n\t\t\t\treturn fmt.Sprintf(\"--- (%d) %v for %x@%v: %v -> %v (%v)\",\n\t\t\t\t\tnet.tab.count, timeout.ev, timeout.node.ID[:8], timeout.node.addr(), prestate, timeout.node.state, status)\n\t\t\t}})\n\n\t\t// Querying.\n\t\tcase q := <-net.queryReq:\n\t\t\tlog.Trace(\"<-net.queryReq\")\n\t\t\tif !q.start(net) {\n\t\t\t\tq.remote.deferQuery(q)\n\t\t\t}\n\n\t\t// Interacting with the table.\n\t\tcase f := <-net.tableOpReq:\n\t\t\tlog.Trace(\"<-net.tableOpReq\")\n\t\t\tf()\n\t\t\tnet.tableOpResp <- struct{}{}\n\n\t\t// Topic registration stuff.\n\t\tcase req := <-net.topicRegisterReq:\n\t\t\tlog.Trace(\"<-net.topicRegisterReq\")\n\t\t\tif !req.add {\n\t\t\t\tnet.ticketStore.removeRegisterTopic(req.topic)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tnet.ticketStore.addTopic(req.topic, true)\n\t\t\t// If we're currently waiting idle (nothing to look up), give the ticket store a\n\t\t\t// chance to start it sooner. This should speed up convergence of the radius\n\t\t\t// determination for new topics.\n\t\t\t// if topicRegisterLookupDone == nil {\n\t\t\tif topicRegisterLookupTarget.target == (common.Hash{}) {\n\t\t\t\tlog.Trace(\"topicRegisterLookupTarget == null\")\n\t\t\t\tif topicRegisterLookupTick.Stop() {\n\t\t\t\t\t<-topicRegisterLookupTick.C\n\t\t\t\t}\n\t\t\t\ttarget, delay := net.ticketStore.nextRegisterLookup()\n\t\t\t\ttopicRegisterLookupTarget = target\n\t\t\t\ttopicRegisterLookupTick.Reset(delay)\n\t\t\t}\n\n\t\tcase nodes := <-topicRegisterLookupDone:\n\t\t\tlog.Trace(\"<-topicRegisterLookupDone\")\n\t\t\tnet.ticketStore.registerLookupDone(topicRegisterLookupTarget, nodes, func(n *Node) []byte {\n\t\t\t\tnet.ping(n, n.addr())\n\t\t\t\treturn n.pingEcho\n\t\t\t})\n\t\t\ttarget, delay := net.ticketStore.nextRegisterLookup()\n\t\t\ttopicRegisterLookupTarget = target\n\t\t\ttopicRegisterLookupTick.Reset(delay)\n\t\t\ttopicRegisterLookupDone = nil\n\n\t\tcase <-topicRegisterLookupTick.C:\n\t\t\tlog.Trace(\"<-topicRegisterLookupTick\")\n\t\t\tif (topicRegisterLookupTarget.target == common.Hash{}) {\n\t\t\t\ttarget, delay := net.ticketStore.nextRegisterLookup()\n\t\t\t\ttopicRegisterLookupTarget = target\n\t\t\t\ttopicRegisterLookupTick.Reset(delay)\n\t\t\t\ttopicRegisterLookupDone = nil\n\t\t\t} else {\n\t\t\t\ttopicRegisterLookupDone = make(chan []*Node)\n\t\t\t\ttarget := topicRegisterLookupTarget.target\n\t\t\t\tgo func() { topicRegisterLookupDone <- net.lookup(target, false) }()\n\t\t\t}\n\n\t\tcase <-nextRegisterTime:\n\t\t\tlog.Trace(\"<-nextRegisterTime\")\n\t\t\tnet.ticketStore.ticketRegistered(*nextTicket)\n\t\t\t//fmt.Println(\"sendTopicRegister\", nextTicket.t.node.addr().String(), nextTicket.t.topics, nextTicket.idx, nextTicket.t.pong)\n\t\t\tnet.conn.sendTopicRegister(nextTicket.t.node, nextTicket.t.topics, nextTicket.idx, nextTicket.t.pong)\n\n\t\tcase req := <-net.topicSearchReq:\n\t\t\tif refreshDone == nil {\n\t\t\t\tlog.Trace(\"<-net.topicSearchReq\")\n\t\t\t\tinfo, ok := searchInfo[req.topic]\n\t\t\t\tif ok {\n\t\t\t\t\tif req.delay == time.Duration(0) {\n\t\t\t\t\t\tdelete(searchInfo, req.topic)\n\t\t\t\t\t\tnet.ticketStore.removeSearchTopic(req.topic)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinfo.period = req.delay\n\t\t\t\t\t\tsearchInfo[req.topic] = info\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif req.delay != time.Duration(0) {\n\t\t\t\t\tvar info topicSearchInfo\n\t\t\t\t\tinfo.period = req.delay\n\t\t\t\t\tinfo.lookupChn = req.lookup\n\t\t\t\t\tsearchInfo[req.topic] = info\n\t\t\t\t\tnet.ticketStore.addSearchTopic(req.topic, req.found)\n\t\t\t\t\ttopicSearch <- req.topic\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsearchReqWhenRefreshDone = append(searchReqWhenRefreshDone, req)\n\t\t\t}\n\n\t\tcase topic := <-topicSearch:\n\t\t\tif activeSearchCount < maxSearchCount {\n\t\t\t\tactiveSearchCount++\n\t\t\t\ttarget := net.ticketStore.nextSearchLookup(topic)\n\t\t\t\tgo func() {\n\t\t\t\t\tnodes := net.lookup(target.target, false)\n\t\t\t\t\ttopicSearchLookupDone <- topicSearchResult{target: target, nodes: nodes}\n\t\t\t\t}()\n\t\t\t}\n\t\t\tperiod := searchInfo[topic].period\n\t\t\tif period != time.Duration(0) {\n\t\t\t\tgo func() {\n\t\t\t\t\ttime.Sleep(period)\n\t\t\t\t\ttopicSearch <- topic\n\t\t\t\t}()\n\t\t\t}\n\n\t\tcase res := <-topicSearchLookupDone:\n\t\t\tactiveSearchCount--\n\t\t\tif lookupChn := searchInfo[res.target.topic].lookupChn; lookupChn != nil {\n\t\t\t\tlookupChn <- net.ticketStore.radius[res.target.topic].converged\n\t\t\t}\n\t\t\tnet.ticketStore.searchLookupDone(res.target, res.nodes, func(n *Node, topic Topic) []byte {\n\t\t\t\tif n.state != nil && n.state.canQuery {\n\t\t\t\t\treturn net.conn.send(n, topicQueryPacket, topicQuery{Topic: topic}) // TODO: set expiration\n\t\t\t\t} else {\n\t\t\t\t\tif n.state == unknown {\n\t\t\t\t\t\tnet.ping(n, n.addr())\n\t\t\t\t\t}\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t})\n\n\t\tcase <-statsDump.C:\n\t\t\tlog.Trace(\"<-statsDump.C\")\n\t\t\t/*r, ok := net.ticketStore.radius[testTopic]\n\t\t\tif !ok {\n\t\t\t\tfmt.Printf(\"(%x) no radius @ %v\\n\", net.tab.self.ID[:8], time.Now())\n\t\t\t} else {\n\t\t\t\ttopics := len(net.ticketStore.tickets)\n\t\t\t\ttickets := len(net.ticketStore.nodes)\n\t\t\t\trad := r.radius / (maxRadius/10000+1)\n\t\t\t\tfmt.Printf(\"(%x) topics:%d radius:%d tickets:%d @ %v\\n\", net.tab.self.ID[:8], topics, rad, tickets, time.Now())\n\t\t\t}*/\n\n\t\t\ttm := mclock.Now()\n\t\t\tfor topic, r := range net.ticketStore.radius {\n\t\t\t\tif printTestImgLogs {\n\t\t\t\t\trad := r.radius / (maxRadius/1000000 + 1)\n\t\t\t\t\tminrad := r.minRadius / (maxRadius/1000000 + 1)\n\t\t\t\t\tfmt.Printf(\"*R %d %v %016x %v\\n\", tm/1000000, topic, net.tab.self.sha[:8], rad)\n\t\t\t\t\tfmt.Printf(\"*MR %d %v %016x %v\\n\", tm/1000000, topic, net.tab.self.sha[:8], minrad)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor topic, t := range net.topictab.topics {\n\t\t\t\twp := t.wcl.nextWaitPeriod(tm)\n\t\t\t\tif printTestImgLogs {\n\t\t\t\t\tfmt.Printf(\"*W %d %v %016x %d\\n\", tm/1000000, topic, net.tab.self.sha[:8], wp/1000000)\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Periodic / lookup-initiated bucket refresh.\n\t\tcase <-refreshTimer.C:\n\t\t\tlog.Trace(\"<-refreshTimer.C\")\n\t\t\t// TODO: ideally we would start the refresh timer after\n\t\t\t// fallback nodes have been set for the first time.\n\t\t\tif refreshDone == nil {\n\t\t\t\trefreshDone = make(chan struct{})\n\t\t\t\tnet.refresh(refreshDone)\n\t\t\t}\n\t\tcase <-bucketRefreshTimer.C:\n\t\t\ttarget := net.tab.chooseBucketRefreshTarget()\n\t\t\tgo func() {\n\t\t\t\tnet.lookup(target, false)\n\t\t\t\tbucketRefreshTimer.Reset(bucketRefreshInterval)\n\t\t\t}()\n\t\tcase newNursery := <-net.refreshReq:\n\t\t\tlog.Trace(\"<-net.refreshReq\")\n\t\t\tif newNursery != nil {\n\t\t\t\tnet.nursery = newNursery\n\t\t\t}\n\t\t\tif refreshDone == nil {\n\t\t\t\trefreshDone = make(chan struct{})\n\t\t\t\tnet.refresh(refreshDone)\n\t\t\t}\n\t\t\tnet.refreshResp <- refreshDone\n\t\tcase <-refreshDone:\n\t\t\tlog.Trace(\"<-net.refreshDone\", \"table size\", net.tab.count)\n\t\t\tif net.tab.count != 0 {\n\t\t\t\trefreshDone = nil\n\t\t\t\tlist := searchReqWhenRefreshDone\n\t\t\t\tsearchReqWhenRefreshDone = nil\n\t\t\t\tgo func() {\n\t\t\t\t\tfor _, req := range list {\n\t\t\t\t\t\tnet.topicSearchReq <- req\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t} else {\n\t\t\t\trefreshDone = make(chan struct{})\n\t\t\t\tnet.refresh(refreshDone)\n\t\t\t}\n\t\t}\n\t}\n\tlog.Trace(\"loop stopped\")\n\n\tlog.Debug(fmt.Sprintf(\"shutting down\"))\n\tif net.conn != nil {\n\t\tnet.conn.Close()\n\t}\n\tif refreshDone != nil {\n\t\t// TODO: wait for pending refresh.\n\t\t//<-refreshResults\n\t}\n\t// Cancel all pending timeouts.\n\tfor _, timer := range net.timeoutTimers {\n\t\ttimer.Stop()\n\t}\n\tif net.db != nil {\n\t\tnet.db.close()\n\t}\n\tclose(net.closed)\n}\n\n// Everything below runs on the Network.loop goroutine\n// and can modify Node, Table and Network at any time without locking.\n\nfunc (net *Network) refresh(done chan<- struct{}) {\n\tvar seeds []*Node\n\tif net.db != nil {\n\t\tseeds = net.db.querySeeds(seedCount, seedMaxAge)\n\t}\n\tif len(seeds) == 0 {\n\t\tseeds = net.nursery\n\t}\n\tif len(seeds) == 0 {\n\t\tlog.Trace(\"no seed nodes found\")\n\t\tclose(done)\n\t\treturn\n\t}\n\tfor _, n := range seeds {\n\t\tlog.Debug(\"\", \"msg\", log.Lazy{Fn: func() string {\n\t\t\tvar age string\n\t\t\tif net.db != nil {\n\t\t\t\tage = time.Since(net.db.lastPong(n.ID)).String()\n\t\t\t} else {\n\t\t\t\tage = \"unknown\"\n\t\t\t}\n\t\t\treturn fmt.Sprintf(\"seed node (age %s): %v\", age, n)\n\t\t}})\n\t\tn = net.internNodeFromDB(n)\n\t\tif n.state == unknown {\n\t\t\tnet.transition(n, verifyinit)\n\t\t}\n\t\t// Force-add the seed node so Lookup does something.\n\t\t// It will be deleted again if verification fails.\n\t\tnet.tab.add(n)\n\t}\n\t// Start self lookup to fill up the buckets.\n\tgo func() {\n\t\tnet.Lookup(net.tab.self.ID)\n\t\tclose(done)\n\t}()\n}\n\n// Node Interning.\n\nfunc (net *Network) internNode(pkt *ingressPacket) *Node {\n\tif n := net.nodes[pkt.remoteID]; n != nil {\n\t\tn.IP = pkt.remoteAddr.IP\n\t\tn.UDP = uint16(pkt.remoteAddr.Port)\n\t\tn.TCP = uint16(pkt.remoteAddr.Port)\n\t\treturn n\n\t}\n\tn := NewNode(pkt.remoteID, pkt.remoteAddr.IP, uint16(pkt.remoteAddr.Port), uint16(pkt.remoteAddr.Port))\n\tn.state = unknown\n\tnet.nodes[pkt.remoteID] = n\n\treturn n\n}\n\nfunc (net *Network) internNodeFromDB(dbn *Node) *Node {\n\tif n := net.nodes[dbn.ID]; n != nil {\n\t\treturn n\n\t}\n\tn := NewNode(dbn.ID, dbn.IP, dbn.UDP, dbn.TCP)\n\tn.state = unknown\n\tnet.nodes[n.ID] = n\n\treturn n\n}\n\nfunc (net *Network) internNodeFromNeighbours(sender *net.UDPAddr, rn rpcNode) (n *Node, err error) {\n\tif rn.ID == net.tab.self.ID {\n\t\treturn nil, errors.New(\"is self\")\n\t}\n\tif rn.UDP <= lowPort {\n\t\treturn nil, errors.New(\"low port\")\n\t}\n\tn = net.nodes[rn.ID]\n\tif n == nil {\n\t\t// We haven't seen this node before.\n\t\tn, err = nodeFromRPC(sender, rn)\n\t\tif net.netrestrict != nil && !net.netrestrict.Contains(n.IP) {\n\t\t\treturn n, errors.New(\"not contained in netrestrict whitelist\")\n\t\t}\n\t\tif err == nil {\n\t\t\tn.state = unknown\n\t\t\tnet.nodes[n.ID] = n\n\t\t}\n\t\treturn n, err\n\t}\n\tif !n.IP.Equal(rn.IP) || n.UDP != rn.UDP || n.TCP != rn.TCP {\n\t\tif n.state == known {\n\t\t\t// reject address change if node is known by us\n\t\t\terr = fmt.Errorf(\"metadata mismatch: got %v, want %v\", rn, n)\n\t\t} else {\n\t\t\t// accept otherwise; this will be handled nicer with signed ENRs\n\t\t\tn.IP = rn.IP\n\t\t\tn.UDP = rn.UDP\n\t\t\tn.TCP = rn.TCP\n\t\t}\n\t}\n\treturn n, err\n}\n\n// nodeNetGuts is embedded in Node and contains fields.\ntype nodeNetGuts struct {\n\t// This is a cached copy of sha3(ID) which is used for node\n\t// distance calculations. This is part of Node in order to make it\n\t// possible to write tests that need a node at a certain distance.\n\t// In those tests, the content of sha will not actually correspond\n\t// with ID.\n\tsha common.Hash\n\n\t// State machine fields. Access to these fields\n\t// is restricted to the Network.loop goroutine.\n\tstate             *nodeState\n\tpingEcho          []byte           // hash of last ping sent by us\n\tpingTopics        []Topic          // topic set sent by us in last ping\n\tdeferredQueries   []*findnodeQuery // queries that can't be sent yet\n\tpendingNeighbours *findnodeQuery   // current query, waiting for reply\n\tqueryTimeouts     int\n}\n\nfunc (n *nodeNetGuts) deferQuery(q *findnodeQuery) {\n\tn.deferredQueries = append(n.deferredQueries, q)\n}\n\nfunc (n *nodeNetGuts) startNextQuery(net *Network) {\n\tif len(n.deferredQueries) == 0 {\n\t\treturn\n\t}\n\tnextq := n.deferredQueries[0]\n\tif nextq.start(net) {\n\t\tn.deferredQueries = append(n.deferredQueries[:0], n.deferredQueries[1:]...)\n\t}\n}\n\nfunc (q *findnodeQuery) start(net *Network) bool {\n\t// Satisfy queries against the local node directly.\n\tif q.remote == net.tab.self {\n\t\tclosest := net.tab.closest(crypto.Keccak256Hash(q.target[:]), bucketSize)\n\t\tq.reply <- closest.entries\n\t\treturn true\n\t}\n\tif q.remote.state.canQuery && q.remote.pendingNeighbours == nil {\n\t\tnet.conn.sendFindnodeHash(q.remote, q.target)\n\t\tnet.timedEvent(respTimeout, q.remote, neighboursTimeout)\n\t\tq.remote.pendingNeighbours = q\n\t\treturn true\n\t}\n\t// If the node is not known yet, it won't accept queries.\n\t// Initiate the transition to known.\n\t// The request will be sent later when the node reaches known state.\n\tif q.remote.state == unknown {\n\t\tnet.transition(q.remote, verifyinit)\n\t}\n\treturn false\n}\n\n// Node Events (the input to the state machine).\n\ntype nodeEvent uint\n\n//go:generate stringer -type=nodeEvent\n\nconst (\n\n\t// Packet type events.\n\t// These correspond to packet types in the UDP protocol.\n\tpingPacket = iota + 1\n\tpongPacket\n\tfindnodePacket\n\tneighborsPacket\n\tfindnodeHashPacket\n\ttopicRegisterPacket\n\ttopicQueryPacket\n\ttopicNodesPacket\n\n\t// Non-packet events.\n\t// Event values in this category are allocated outside\n\t// the packet type range (packet types are encoded as a single byte).\n\tpongTimeout nodeEvent = iota + 256\n\tpingTimeout\n\tneighboursTimeout\n)\n\n// Node State Machine.\n\ntype nodeState struct {\n\tname     string\n\thandle   func(*Network, *Node, nodeEvent, *ingressPacket) (next *nodeState, err error)\n\tenter    func(*Network, *Node)\n\tcanQuery bool\n}\n\nfunc (s *nodeState) String() string {\n\treturn s.name\n}\n\nvar (\n\tunknown          *nodeState\n\tverifyinit       *nodeState\n\tverifywait       *nodeState\n\tremoteverifywait *nodeState\n\tknown            *nodeState\n\tcontested        *nodeState\n\tunresponsive     *nodeState\n)\n\nfunc init() {\n\tunknown = &nodeState{\n\t\tname: \"unknown\",\n\t\tenter: func(net *Network, n *Node) {\n\t\t\tnet.tab.delete(n)\n\t\t\tn.pingEcho = nil\n\t\t\t// Abort active queries.\n\t\t\tfor _, q := range n.deferredQueries {\n\t\t\t\tq.reply <- nil\n\t\t\t}\n\t\t\tn.deferredQueries = nil\n\t\t\tif n.pendingNeighbours != nil {\n\t\t\t\tn.pendingNeighbours.reply <- nil\n\t\t\t\tn.pendingNeighbours = nil\n\t\t\t}\n\t\t\tn.queryTimeouts = 0\n\t\t},\n\t\thandle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\t\t\tswitch ev {\n\t\t\tcase pingPacket:\n\t\t\t\tnet.handlePing(n, pkt)\n\t\t\t\tnet.ping(n, pkt.remoteAddr)\n\t\t\t\treturn verifywait, nil\n\t\t\tdefault:\n\t\t\t\treturn unknown, errInvalidEvent\n\t\t\t}\n\t\t},\n\t}\n\n\tverifyinit = &nodeState{\n\t\tname: \"verifyinit\",\n\t\tenter: func(net *Network, n *Node) {\n\t\t\tnet.ping(n, n.addr())\n\t\t},\n\t\thandle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\t\t\tswitch ev {\n\t\t\tcase pingPacket:\n\t\t\t\tnet.handlePing(n, pkt)\n\t\t\t\treturn verifywait, nil\n\t\t\tcase pongPacket:\n\t\t\t\terr := net.handleKnownPong(n, pkt)\n\t\t\t\treturn remoteverifywait, err\n\t\t\tcase pongTimeout:\n\t\t\t\treturn unknown, nil\n\t\t\tdefault:\n\t\t\t\treturn verifyinit, errInvalidEvent\n\t\t\t}\n\t\t},\n\t}\n\n\tverifywait = &nodeState{\n\t\tname: \"verifywait\",\n\t\thandle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\t\t\tswitch ev {\n\t\t\tcase pingPacket:\n\t\t\t\tnet.handlePing(n, pkt)\n\t\t\t\treturn verifywait, nil\n\t\t\tcase pongPacket:\n\t\t\t\terr := net.handleKnownPong(n, pkt)\n\t\t\t\treturn known, err\n\t\t\tcase pongTimeout:\n\t\t\t\treturn unknown, nil\n\t\t\tdefault:\n\t\t\t\treturn verifywait, errInvalidEvent\n\t\t\t}\n\t\t},\n\t}\n\n\tremoteverifywait = &nodeState{\n\t\tname: \"remoteverifywait\",\n\t\tenter: func(net *Network, n *Node) {\n\t\t\tnet.timedEvent(respTimeout, n, pingTimeout)\n\t\t},\n\t\thandle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\t\t\tswitch ev {\n\t\t\tcase pingPacket:\n\t\t\t\tnet.handlePing(n, pkt)\n\t\t\t\treturn remoteverifywait, nil\n\t\t\tcase pingTimeout:\n\t\t\t\treturn known, nil\n\t\t\tdefault:\n\t\t\t\treturn remoteverifywait, errInvalidEvent\n\t\t\t}\n\t\t},\n\t}\n\n\tknown = &nodeState{\n\t\tname:     \"known\",\n\t\tcanQuery: true,\n\t\tenter: func(net *Network, n *Node) {\n\t\t\tn.queryTimeouts = 0\n\t\t\tn.startNextQuery(net)\n\t\t\t// Insert into the table and start revalidation of the last node\n\t\t\t// in the bucket if it is full.\n\t\t\tlast := net.tab.add(n)\n\t\t\tif last != nil && last.state == known {\n\t\t\t\t// TODO: do this asynchronously\n\t\t\t\tnet.transition(last, contested)\n\t\t\t}\n\t\t},\n\t\thandle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\t\t\tswitch ev {\n\t\t\tcase pingPacket:\n\t\t\t\tnet.handlePing(n, pkt)\n\t\t\t\treturn known, nil\n\t\t\tcase pongPacket:\n\t\t\t\terr := net.handleKnownPong(n, pkt)\n\t\t\t\treturn known, err\n\t\t\tdefault:\n\t\t\t\treturn net.handleQueryEvent(n, ev, pkt)\n\t\t\t}\n\t\t},\n\t}\n\n\tcontested = &nodeState{\n\t\tname:     \"contested\",\n\t\tcanQuery: true,\n\t\tenter: func(net *Network, n *Node) {\n\t\t\tnet.ping(n, n.addr())\n\t\t},\n\t\thandle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\t\t\tswitch ev {\n\t\t\tcase pongPacket:\n\t\t\t\t// Node is still alive.\n\t\t\t\terr := net.handleKnownPong(n, pkt)\n\t\t\t\treturn known, err\n\t\t\tcase pongTimeout:\n\t\t\t\tnet.tab.deleteReplace(n)\n\t\t\t\treturn unresponsive, nil\n\t\t\tcase pingPacket:\n\t\t\t\tnet.handlePing(n, pkt)\n\t\t\t\treturn contested, nil\n\t\t\tdefault:\n\t\t\t\treturn net.handleQueryEvent(n, ev, pkt)\n\t\t\t}\n\t\t},\n\t}\n\n\tunresponsive = &nodeState{\n\t\tname:     \"unresponsive\",\n\t\tcanQuery: true,\n\t\thandle: func(net *Network, n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\t\t\tswitch ev {\n\t\t\tcase pingPacket:\n\t\t\t\tnet.handlePing(n, pkt)\n\t\t\t\treturn known, nil\n\t\t\tcase pongPacket:\n\t\t\t\terr := net.handleKnownPong(n, pkt)\n\t\t\t\treturn known, err\n\t\t\tdefault:\n\t\t\t\treturn net.handleQueryEvent(n, ev, pkt)\n\t\t\t}\n\t\t},\n\t}\n}\n\n// handle processes packets sent by n and events related to n.\nfunc (net *Network) handle(n *Node, ev nodeEvent, pkt *ingressPacket) error {\n\t//fmt.Println(\"handle\", n.addr().String(), n.state, ev)\n\tif pkt != nil {\n\t\tif err := net.checkPacket(n, ev, pkt); err != nil {\n\t\t\t//fmt.Println(\"check err:\", err)\n\t\t\treturn err\n\t\t}\n\t\t// Start the background expiration goroutine after the first\n\t\t// successful communication. Subsequent calls have no effect if it\n\t\t// is already running. We do this here instead of somewhere else\n\t\t// so that the search for seed nodes also considers older nodes\n\t\t// that would otherwise be removed by the expirer.\n\t\tif net.db != nil {\n\t\t\tnet.db.ensureExpirer()\n\t\t}\n\t}\n\tif n.state == nil {\n\t\tn.state = unknown //???\n\t}\n\tnext, err := n.state.handle(net, n, ev, pkt)\n\tnet.transition(n, next)\n\t//fmt.Println(\"new state:\", n.state)\n\treturn err\n}\n\nfunc (net *Network) checkPacket(n *Node, ev nodeEvent, pkt *ingressPacket) error {\n\t// Replay prevention checks.\n\tswitch ev {\n\tcase pingPacket, findnodeHashPacket, neighborsPacket:\n\t\t// TODO: check date is > last date seen\n\t\t// TODO: check ping version\n\tcase pongPacket:\n\t\tif !bytes.Equal(pkt.data.(*pong).ReplyTok, n.pingEcho) {\n\t\t\t// fmt.Println(\"pong reply token mismatch\")\n\t\t\treturn fmt.Errorf(\"pong reply token mismatch\")\n\t\t}\n\t\tn.pingEcho = nil\n\t}\n\t// Data validation.\n\t// TODO: Ideally we would do the following:\n\t//  - reject all packets with wrong address except ping.\n\t//  - for ping with new address, transition to verifywait but keep the\n\t//    previous node (with old address) around. if the new one reaches known,\n\t//    swap it out.\n\treturn nil\n}\n\nfunc (net *Network) transition(n *Node, next *nodeState) {\n\tif n.state != next {\n\t\tn.state = next\n\t\tif next.enter != nil {\n\t\t\tnext.enter(net, n)\n\t\t}\n\t}\n\n\t// TODO: persist/unpersist node\n}\n\nfunc (net *Network) timedEvent(d time.Duration, n *Node, ev nodeEvent) {\n\ttimeout := timeoutEvent{ev, n}\n\tnet.timeoutTimers[timeout] = time.AfterFunc(d, func() {\n\t\tselect {\n\t\tcase net.timeout <- timeout:\n\t\tcase <-net.closed:\n\t\t}\n\t})\n}\n\nfunc (net *Network) abortTimedEvent(n *Node, ev nodeEvent) {\n\ttimer := net.timeoutTimers[timeoutEvent{ev, n}]\n\tif timer != nil {\n\t\ttimer.Stop()\n\t\tdelete(net.timeoutTimers, timeoutEvent{ev, n})\n\t}\n}\n\nfunc (net *Network) ping(n *Node, addr *net.UDPAddr) {\n\t//fmt.Println(\"ping\", n.addr().String(), n.ID.String(), n.sha.Hex())\n\tif n.pingEcho != nil || n.ID == net.tab.self.ID {\n\t\t//fmt.Println(\" not sent\")\n\t\treturn\n\t}\n\tlog.Trace(\"Pinging remote node\", \"node\", n.ID)\n\tn.pingTopics = net.ticketStore.regTopicSet()\n\tn.pingEcho = net.conn.sendPing(n, addr, n.pingTopics)\n\tnet.timedEvent(respTimeout, n, pongTimeout)\n}\n\nfunc (net *Network) handlePing(n *Node, pkt *ingressPacket) {\n\tlog.Trace(\"Handling remote ping\", \"node\", n.ID)\n\tping := pkt.data.(*ping)\n\tn.TCP = ping.From.TCP\n\tt := net.topictab.getTicket(n, ping.Topics)\n\n\tpong := &pong{\n\t\tTo:         makeEndpoint(n.addr(), n.TCP), // TODO: maybe use known TCP port from DB\n\t\tReplyTok:   pkt.hash,\n\t\tExpiration: uint64(time.Now().Add(expiration).Unix()),\n\t}\n\tticketToPong(t, pong)\n\tnet.conn.send(n, pongPacket, pong)\n}\n\nfunc (net *Network) handleKnownPong(n *Node, pkt *ingressPacket) error {\n\tlog.Trace(\"Handling known pong\", \"node\", n.ID)\n\tnet.abortTimedEvent(n, pongTimeout)\n\tnow := mclock.Now()\n\tticket, err := pongToTicket(now, n.pingTopics, n, pkt)\n\tif err == nil {\n\t\t// fmt.Printf(\"(%x) ticket: %+v\\n\", net.tab.self.ID[:8], pkt.data)\n\t\tnet.ticketStore.addTicket(now, pkt.data.(*pong).ReplyTok, ticket)\n\t} else {\n\t\tlog.Trace(\"Failed to convert pong to ticket\", \"err\", err)\n\t}\n\tn.pingEcho = nil\n\tn.pingTopics = nil\n\treturn err\n}\n\nfunc (net *Network) handleQueryEvent(n *Node, ev nodeEvent, pkt *ingressPacket) (*nodeState, error) {\n\tswitch ev {\n\tcase findnodePacket:\n\t\ttarget := crypto.Keccak256Hash(pkt.data.(*findnode).Target[:])\n\t\tresults := net.tab.closest(target, bucketSize).entries\n\t\tnet.conn.sendNeighbours(n, results)\n\t\treturn n.state, nil\n\tcase neighborsPacket:\n\t\terr := net.handleNeighboursPacket(n, pkt)\n\t\treturn n.state, err\n\tcase neighboursTimeout:\n\t\tif n.pendingNeighbours != nil {\n\t\t\tn.pendingNeighbours.reply <- nil\n\t\t\tn.pendingNeighbours = nil\n\t\t}\n\t\tn.queryTimeouts++\n\t\tif n.queryTimeouts > maxFindnodeFailures && n.state == known {\n\t\t\treturn contested, errors.New(\"too many timeouts\")\n\t\t}\n\t\treturn n.state, nil\n\n\t// v5\n\n\tcase findnodeHashPacket:\n\t\tresults := net.tab.closest(pkt.data.(*findnodeHash).Target, bucketSize).entries\n\t\tnet.conn.sendNeighbours(n, results)\n\t\treturn n.state, nil\n\tcase topicRegisterPacket:\n\t\t//fmt.Println(\"got topicRegisterPacket\")\n\t\tregdata := pkt.data.(*topicRegister)\n\t\tpong, err := net.checkTopicRegister(regdata)\n\t\tif err != nil {\n\t\t\t//fmt.Println(err)\n\t\t\treturn n.state, fmt.Errorf(\"bad waiting ticket: %v\", err)\n\t\t}\n\t\tnet.topictab.useTicket(n, pong.TicketSerial, regdata.Topics, int(regdata.Idx), pong.Expiration, pong.WaitPeriods)\n\t\treturn n.state, nil\n\tcase topicQueryPacket:\n\t\t// TODO: handle expiration\n\t\ttopic := pkt.data.(*topicQuery).Topic\n\t\tresults := net.topictab.getEntries(topic)\n\t\tif _, ok := net.ticketStore.tickets[topic]; ok {\n\t\t\tresults = append(results, net.tab.self) // we're not registering in our own table but if we're advertising, return ourselves too\n\t\t}\n\t\tif len(results) > 10 {\n\t\t\tresults = results[:10]\n\t\t}\n\t\tvar hash common.Hash\n\t\tcopy(hash[:], pkt.hash)\n\t\tnet.conn.sendTopicNodes(n, hash, results)\n\t\treturn n.state, nil\n\tcase topicNodesPacket:\n\t\tp := pkt.data.(*topicNodes)\n\t\tif net.ticketStore.gotTopicNodes(n, p.Echo, p.Nodes) {\n\t\t\tn.queryTimeouts++\n\t\t\tif n.queryTimeouts > maxFindnodeFailures && n.state == known {\n\t\t\t\treturn contested, errors.New(\"too many timeouts\")\n\t\t\t}\n\t\t}\n\t\treturn n.state, nil\n\n\tdefault:\n\t\treturn n.state, errInvalidEvent\n\t}\n}\n\nfunc (net *Network) checkTopicRegister(data *topicRegister) (*pong, error) {\n\tvar pongpkt ingressPacket\n\tif err := decodePacket(data.Pong, &pongpkt); err != nil {\n\t\treturn nil, err\n\t}\n\tif pongpkt.ev != pongPacket {\n\t\treturn nil, errors.New(\"is not pong packet\")\n\t}\n\tif pongpkt.remoteID != net.tab.self.ID {\n\t\treturn nil, errors.New(\"not signed by us\")\n\t}\n\t// check that we previously authorised all topics\n\t// that the other side is trying to register.\n\tif rlpHash(data.Topics) != pongpkt.data.(*pong).TopicHash {\n\t\treturn nil, errors.New(\"topic hash mismatch\")\n\t}\n\n\tif int(data.Idx) < 0 || int(data.Idx) >= len(data.Topics) {\n\t\treturn nil, errors.New(\"topic index out of range\")\n\t}\n\treturn pongpkt.data.(*pong), nil\n}\n\nfunc rlpHash(x interface{}) (h common.Hash) {\n\thw := sha3.NewKeccak256()\n\trlp.Encode(hw, x)\n\thw.Sum(h[:0])\n\treturn h\n}\n\nfunc (net *Network) handleNeighboursPacket(n *Node, pkt *ingressPacket) error {\n\tif n.pendingNeighbours == nil {\n\t\treturn errNoQuery\n\t}\n\tnet.abortTimedEvent(n, neighboursTimeout)\n\n\treq := pkt.data.(*neighbors)\n\tnodes := make([]*Node, len(req.Nodes))\n\tfor i, rn := range req.Nodes {\n\t\tnn, err := net.internNodeFromNeighbours(pkt.remoteAddr, rn)\n\t\tif err != nil {\n\t\t\tlog.Debug(fmt.Sprintf(\"invalid neighbour (%v) from %x@%v: %v\", rn.IP, n.ID[:8], pkt.remoteAddr, err))\n\t\t\tcontinue\n\t\t}\n\t\tnodes[i] = nn\n\t\t// Start validation of query results immediately.\n\t\t// This fills the table quickly.\n\t\t// TODO: generates way too many packets, maybe do it via queue.\n\t\tif nn.state == unknown {\n\t\t\tnet.transition(nn, verifyinit)\n\t\t}\n\t}\n\t// TODO: don't ignore second packet\n\tn.pendingNeighbours.reply <- nodes\n\tn.pendingNeighbours = nil\n\t// Now that this query is done, start the next one.\n\tn.startNextQuery(net)\n\treturn nil\n}\n"
  },
  {
    "path": "p2p/discv5/node.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage discv5\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"math/rand\"\n\t\"net\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\n// Node represents a host on the network.\n// The public fields of Node may not be modified.\ntype Node struct {\n\tIP       net.IP // len 4 for IPv4 or 16 for IPv6\n\tUDP, TCP uint16 // port numbers\n\tID       NodeID // the node's public key\n\n\t// Network-related fields are contained in nodeNetGuts.\n\t// These fields are not supposed to be used off the\n\t// Network.loop goroutine.\n\tnodeNetGuts\n}\n\n// NewNode creates a new node. It is mostly meant to be used for\n// testing purposes.\nfunc NewNode(id NodeID, ip net.IP, udpPort, tcpPort uint16) *Node {\n\tif ipv4 := ip.To4(); ipv4 != nil {\n\t\tip = ipv4\n\t}\n\treturn &Node{\n\t\tIP:          ip,\n\t\tUDP:         udpPort,\n\t\tTCP:         tcpPort,\n\t\tID:          id,\n\t\tnodeNetGuts: nodeNetGuts{sha: crypto.Keccak256Hash(id[:])},\n\t}\n}\n\nfunc (n *Node) addr() *net.UDPAddr {\n\treturn &net.UDPAddr{IP: n.IP, Port: int(n.UDP)}\n}\n\nfunc (n *Node) setAddr(a *net.UDPAddr) {\n\tn.IP = a.IP\n\tif ipv4 := a.IP.To4(); ipv4 != nil {\n\t\tn.IP = ipv4\n\t}\n\tn.UDP = uint16(a.Port)\n}\n\n// compares the given address against the stored values.\nfunc (n *Node) addrEqual(a *net.UDPAddr) bool {\n\tip := a.IP\n\tif ipv4 := a.IP.To4(); ipv4 != nil {\n\t\tip = ipv4\n\t}\n\treturn n.UDP == uint16(a.Port) && n.IP.Equal(ip)\n}\n\n// Incomplete returns true for nodes with no IP address.\nfunc (n *Node) Incomplete() bool {\n\treturn n.IP == nil\n}\n\n// checks whether n is a valid complete node.\nfunc (n *Node) validateComplete() error {\n\tif n.Incomplete() {\n\t\treturn errors.New(\"incomplete node\")\n\t}\n\tif n.UDP == 0 {\n\t\treturn errors.New(\"missing UDP port\")\n\t}\n\tif n.TCP == 0 {\n\t\treturn errors.New(\"missing TCP port\")\n\t}\n\tif n.IP.IsMulticast() || n.IP.IsUnspecified() {\n\t\treturn errors.New(\"invalid IP (multicast/unspecified)\")\n\t}\n\t_, err := n.ID.Pubkey() // validate the key (on curve, etc.)\n\treturn err\n}\n\n// The string representation of a Node is a URL.\n// Please see ParseNode for a description of the format.\nfunc (n *Node) String() string {\n\tu := url.URL{Scheme: \"snode\"}\n\tif n.Incomplete() {\n\t\tu.Host = fmt.Sprintf(\"%x\", n.ID[:])\n\t} else {\n\t\taddr := net.TCPAddr{IP: n.IP, Port: int(n.TCP)}\n\t\tu.User = url.User(fmt.Sprintf(\"%x\", n.ID[:]))\n\t\tu.Host = addr.String()\n\t\tif n.UDP != n.TCP {\n\t\t\tu.RawQuery = \"discport=\" + strconv.Itoa(int(n.UDP))\n\t\t}\n\t}\n\treturn u.String()\n}\n\nvar incompleteNodeURL = regexp.MustCompile(\"(?i)^(?:snode://)?([0-9a-f]+)$\")\n\n// ParseNode parses a node designator.\n//\n// There are two basic forms of node designators\n//   - incomplete nodes, which only have the public key (node ID)\n//   - complete nodes, which contain the public key and IP/Port information\n//\n// For incomplete nodes, the designator must look like one of these\n//\n//    enode://<hex node id>\n//    <hex node id>\n//\n// For complete nodes, the node ID is encoded in the username portion\n// of the URL, separated from the host by an @ sign. The hostname can\n// only be given as an IP address, DNS domain names are not allowed.\n// The port in the host name section is the TCP listening port. If the\n// TCP and UDP (discovery) ports differ, the UDP port is specified as\n// query parameter \"discport\".\n//\n// In the following example, the node URL describes\n// a node with IP address 10.3.58.6, TCP listening port 60603\n// and UDP discovery port 60601.\n//\n//    enode://<hex node id>@10.3.58.6:60603?discport=60601\nfunc ParseNode(rawurl string) (*Node, error) {\n\tif m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil {\n\t\tid, err := HexID(m[1])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid node ID (%v)\", err)\n\t\t}\n\t\treturn NewNode(id, nil, 0, 0), nil\n\t}\n\treturn parseComplete(rawurl)\n}\n\nfunc parseComplete(rawurl string) (*Node, error) {\n\tvar (\n\t\tid               NodeID\n\t\tip               net.IP\n\t\ttcpPort, udpPort uint64\n\t)\n\tu, err := url.Parse(rawurl)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif u.Scheme != \"snode\" {\n\t\treturn nil, errors.New(\"invalid URL scheme, want \\\"snode\\\"\")\n\t}\n\t// Parse the Node ID from the user portion.\n\tif u.User == nil {\n\t\treturn nil, errors.New(\"does not contain node ID\")\n\t}\n\tif id, err = HexID(u.User.String()); err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid node ID (%v)\", err)\n\t}\n\t// Parse the IP address.\n\thost, port, err := net.SplitHostPort(u.Host)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid host: %v\", err)\n\t}\n\tif ip = net.ParseIP(host); ip == nil {\n\t\treturn nil, errors.New(\"invalid IP address\")\n\t}\n\t// Ensure the IP is 4 bytes long for IPv4 addresses.\n\tif ipv4 := ip.To4(); ipv4 != nil {\n\t\tip = ipv4\n\t}\n\t// Parse the port numbers.\n\tif tcpPort, err = strconv.ParseUint(port, 10, 16); err != nil {\n\t\treturn nil, errors.New(\"invalid port\")\n\t}\n\tudpPort = tcpPort\n\tqv := u.Query()\n\tif qv.Get(\"discport\") != \"\" {\n\t\tudpPort, err = strconv.ParseUint(qv.Get(\"discport\"), 10, 16)\n\t\tif err != nil {\n\t\t\treturn nil, errors.New(\"invalid discport in query\")\n\t\t}\n\t}\n\treturn NewNode(id, ip, uint16(udpPort), uint16(tcpPort)), nil\n}\n\n// MustParseNode parses a node URL. It panics if the URL is not valid.\nfunc MustParseNode(rawurl string) *Node {\n\tn, err := ParseNode(rawurl)\n\tif err != nil {\n\t\tpanic(\"invalid node URL: \" + err.Error())\n\t}\n\treturn n\n}\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (n *Node) MarshalText() ([]byte, error) {\n\treturn []byte(n.String()), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (n *Node) UnmarshalText(text []byte) error {\n\tdec, err := ParseNode(string(text))\n\tif err == nil {\n\t\t*n = *dec\n\t}\n\treturn err\n}\n\n// type nodeQueue []*Node\n//\n// // pushNew adds n to the end if it is not present.\n// func (nl *nodeList) appendNew(n *Node) {\n// \tfor _, entry := range n {\n// \t\tif entry == n {\n// \t\t\treturn\n// \t\t}\n// \t}\n// \t*nq = append(*nq, n)\n// }\n//\n// // popRandom removes a random node. Nodes closer to\n// // to the head of the beginning of the have a slightly higher probability.\n// func (nl *nodeList) popRandom() *Node {\n// \tix := rand.Intn(len(*nq))\n// \t//TODO: probability as mentioned above.\n// \tnl.removeIndex(ix)\n// }\n//\n// func (nl *nodeList) removeIndex(i int) *Node {\n// \tslice = *nl\n// \tif len(*slice) <= i {\n// \t\treturn nil\n// \t}\n// \t*nl = append(slice[:i], slice[i+1:]...)\n// }\n\nconst nodeIDBits = 512\n\n// NodeID is a unique identifier for each node.\n// The node identifier is a marshaled elliptic curve public key.\ntype NodeID [nodeIDBits / 8]byte\n\n// NodeID prints as a long hexadecimal number.\nfunc (n NodeID) String() string {\n\treturn fmt.Sprintf(\"%x\", n[:])\n}\n\n// The Go syntax representation of a NodeID is a call to HexID.\nfunc (n NodeID) GoString() string {\n\treturn fmt.Sprintf(\"discover.HexID(\\\"%x\\\")\", n[:])\n}\n\n// TerminalString returns a shortened hex string for terminal logging.\nfunc (n NodeID) TerminalString() string {\n\treturn hex.EncodeToString(n[:8])\n}\n\n// HexID converts a hex string to a NodeID.\n// The string may be prefixed with 0x.\nfunc HexID(in string) (NodeID, error) {\n\tvar id NodeID\n\tb, err := hex.DecodeString(strings.TrimPrefix(in, \"0x\"))\n\tif err != nil {\n\t\treturn id, err\n\t} else if len(b) != len(id) {\n\t\treturn id, fmt.Errorf(\"wrong length, want %d hex chars\", len(id)*2)\n\t}\n\tcopy(id[:], b)\n\treturn id, nil\n}\n\n// MustHexID converts a hex string to a NodeID.\n// It panics if the string is not a valid NodeID.\nfunc MustHexID(in string) NodeID {\n\tid, err := HexID(in)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn id\n}\n\n// PubkeyID returns a marshaled representation of the given public key.\nfunc PubkeyID(pub *ecdsa.PublicKey) NodeID {\n\tvar id NodeID\n\tpbytes := elliptic.Marshal(pub.Curve, pub.X, pub.Y)\n\tif len(pbytes)-1 != len(id) {\n\t\tpanic(fmt.Errorf(\"need %d bit pubkey, got %d bits\", (len(id)+1)*8, len(pbytes)))\n\t}\n\tcopy(id[:], pbytes[1:])\n\treturn id\n}\n\n// Pubkey returns the public key represented by the node ID.\n// It returns an error if the ID is not a point on the curve.\nfunc (n NodeID) Pubkey() (*ecdsa.PublicKey, error) {\n\tp := &ecdsa.PublicKey{Curve: crypto.S256(), X: new(big.Int), Y: new(big.Int)}\n\thalf := len(n) / 2\n\tp.X.SetBytes(n[:half])\n\tp.Y.SetBytes(n[half:])\n\tif !p.Curve.IsOnCurve(p.X, p.Y) {\n\t\treturn nil, errors.New(\"id is invalid secp256k1 curve point\")\n\t}\n\treturn p, nil\n}\n\nfunc (id NodeID) mustPubkey() ecdsa.PublicKey {\n\tpk, err := id.Pubkey()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn *pk\n}\n\n// recoverNodeID computes the public key used to sign the\n// given hash from the signature.\nfunc recoverNodeID(hash, sig []byte) (id NodeID, err error) {\n\tpubkey, err := crypto.Ecrecover(hash, sig)\n\tif err != nil {\n\t\treturn id, err\n\t}\n\tif len(pubkey)-1 != len(id) {\n\t\treturn id, fmt.Errorf(\"recovered pubkey has %d bits, want %d bits\", len(pubkey)*8, (len(id)+1)*8)\n\t}\n\tfor i := range id {\n\t\tid[i] = pubkey[i+1]\n\t}\n\treturn id, nil\n}\n\n// distcmp compares the distances a->target and b->target.\n// Returns -1 if a is closer to target, 1 if b is closer to target\n// and 0 if they are equal.\nfunc distcmp(target, a, b common.Hash) int {\n\tfor i := range target {\n\t\tda := a[i] ^ target[i]\n\t\tdb := b[i] ^ target[i]\n\t\tif da > db {\n\t\t\treturn 1\n\t\t} else if da < db {\n\t\t\treturn -1\n\t\t}\n\t}\n\treturn 0\n}\n\n// table of leading zero counts for bytes [0..255]\nvar lzcount = [256]int{\n\t8, 7, 6, 6, 5, 5, 5, 5,\n\t4, 4, 4, 4, 4, 4, 4, 4,\n\t3, 3, 3, 3, 3, 3, 3, 3,\n\t3, 3, 3, 3, 3, 3, 3, 3,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t2, 2, 2, 2, 2, 2, 2, 2,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t1, 1, 1, 1, 1, 1, 1, 1,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\t0, 0, 0, 0, 0, 0, 0, 0,\n}\n\n// logdist returns the logarithmic distance between a and b, log2(a ^ b).\nfunc logdist(a, b common.Hash) int {\n\tlz := 0\n\tfor i := range a {\n\t\tx := a[i] ^ b[i]\n\t\tif x == 0 {\n\t\t\tlz += 8\n\t\t} else {\n\t\t\tlz += lzcount[x]\n\t\t\tbreak\n\t\t}\n\t}\n\treturn len(a)*8 - lz\n}\n\n// hashAtDistance returns a random hash such that logdist(a, b) == n\nfunc hashAtDistance(a common.Hash, n int) (b common.Hash) {\n\tif n == 0 {\n\t\treturn a\n\t}\n\t// flip bit at position n, fill the rest with random bits\n\tb = a\n\tpos := len(a) - n/8 - 1\n\tbit := byte(0x01) << (byte(n%8) - 1)\n\tif bit == 0 {\n\t\tpos++\n\t\tbit = 0x80\n\t}\n\tb[pos] = a[pos]&^bit | ^a[pos]&bit // TODO: randomize end bits\n\tfor i := pos + 1; i < len(a); i++ {\n\t\tb[i] = byte(rand.Intn(255))\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "p2p/discv5/nodeevent_string.go",
    "content": "// Code generated by \"stringer -type=nodeEvent\"; DO NOT EDIT.\n\npackage discv5\n\nimport \"strconv\"\n\nconst _nodeEvent_name = \"pongTimeoutpingTimeoutneighboursTimeout\"\n\nvar _nodeEvent_index = [...]uint8{0, 11, 22, 39}\n\nfunc (i nodeEvent) String() string {\n\ti -= 264\n\tif i >= nodeEvent(len(_nodeEvent_index)-1) {\n\t\treturn \"nodeEvent(\" + strconv.FormatInt(int64(i+264), 10) + \")\"\n\t}\n\treturn _nodeEvent_name[_nodeEvent_index[i]:_nodeEvent_index[i+1]]\n}\n"
  },
  {
    "path": "p2p/discv5/ntp.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the NTP time drift detection via the SNTP protocol:\n//   https://tools.ietf.org/html/rfc4330\n\npackage discv5\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tntpPool   = \"pool.ntp.org\" // ntpPool is the NTP server to query for the current time\n\tntpChecks = 3              // Number of measurements to do against the NTP server\n)\n\n// durationSlice attaches the methods of sort.Interface to []time.Duration,\n// sorting in increasing order.\ntype durationSlice []time.Duration\n\nfunc (s durationSlice) Len() int           { return len(s) }\nfunc (s durationSlice) Less(i, j int) bool { return s[i] < s[j] }\nfunc (s durationSlice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }\n\n// checkClockDrift queries an NTP server for clock drifts and warns the user if\n// one large enough is detected.\nfunc checkClockDrift() {\n\tdrift, err := sntpDrift(ntpChecks)\n\tif err != nil {\n\t\treturn\n\t}\n\tif drift < -driftThreshold || drift > driftThreshold {\n\t\twarning := fmt.Sprintf(\"System clock seems off by %v, which can prevent network connectivity\", drift)\n\t\thowtofix := fmt.Sprintf(\"Please enable network time synchronisation in system settings\")\n\t\tseparator := strings.Repeat(\"-\", len(warning))\n\n\t\tlog.Warn(separator)\n\t\tlog.Warn(warning)\n\t\tlog.Warn(howtofix)\n\t\tlog.Warn(separator)\n\t} else {\n\t\tlog.Debug(fmt.Sprintf(\"Sanity NTP check reported %v drift, all ok\", drift))\n\t}\n}\n\n// sntpDrift does a naive time resolution against an NTP server and returns the\n// measured drift. This method uses the simple version of NTP. It's not precise\n// but should be fine for these purposes.\n//\n// Note, it executes two extra measurements compared to the number of requested\n// ones to be able to discard the two extremes as outliers.\nfunc sntpDrift(measurements int) (time.Duration, error) {\n\t// Resolve the address of the NTP server\n\taddr, err := net.ResolveUDPAddr(\"udp\", ntpPool+\":123\")\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\t// Construct the time request (empty package with only 2 fields set):\n\t//   Bits 3-5: Protocol version, 3\n\t//   Bits 6-8: Mode of operation, client, 3\n\trequest := make([]byte, 48)\n\trequest[0] = 3<<3 | 3\n\n\t// Execute each of the measurements\n\tdrifts := []time.Duration{}\n\tfor i := 0; i < measurements+2; i++ {\n\t\t// Dial the NTP server and send the time retrieval request\n\t\tconn, err := net.DialUDP(\"udp\", nil, addr)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tdefer conn.Close()\n\n\t\tsent := time.Now()\n\t\tif _, err = conn.Write(request); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\t// Retrieve the reply and calculate the elapsed time\n\t\tconn.SetDeadline(time.Now().Add(5 * time.Second))\n\n\t\treply := make([]byte, 48)\n\t\tif _, err = conn.Read(reply); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\telapsed := time.Since(sent)\n\n\t\t// Reconstruct the time from the reply data\n\t\tsec := uint64(reply[43]) | uint64(reply[42])<<8 | uint64(reply[41])<<16 | uint64(reply[40])<<24\n\t\tfrac := uint64(reply[47]) | uint64(reply[46])<<8 | uint64(reply[45])<<16 | uint64(reply[44])<<24\n\n\t\tnanosec := sec*1e9 + (frac*1e9)>>32\n\n\t\tt := time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC).Add(time.Duration(nanosec)).Local()\n\n\t\t// Calculate the drift based on an assumed answer time of RRT/2\n\t\tdrifts = append(drifts, sent.Sub(t)+elapsed/2)\n\t}\n\t// Calculate average drif (drop two extremities to avoid outliers)\n\tsort.Sort(durationSlice(drifts))\n\n\tdrift := time.Duration(0)\n\tfor i := 1; i < len(drifts)-1; i++ {\n\t\tdrift += drifts[i]\n\t}\n\treturn drift / time.Duration(measurements), nil\n}\n"
  },
  {
    "path": "p2p/discv5/table.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package discv5 implements the RLPx v5 Topic Discovery Protocol.\n//\n// The Topic Discovery protocol provides a way to find RLPx nodes that\n// can be connected to. It uses a Kademlia-like protocol to maintain a\n// distributed database of the IDs and endpoints of all listening\n// nodes.\npackage discv5\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"net\"\n\t\"sort\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nconst (\n\talpha      = 3  // Kademlia concurrency factor\n\tbucketSize = 16 // Kademlia bucket size\n\thashBits   = len(common.Hash{}) * 8\n\tnBuckets   = hashBits + 1 // Number of buckets\n\n\tmaxFindnodeFailures = 5\n)\n\ntype Table struct {\n\tcount         int               // number of nodes\n\tbuckets       [nBuckets]*bucket // index of known nodes by distance\n\tnodeAddedHook func(*Node)       // for testing\n\tself          *Node             // metadata of the local node\n}\n\n// bucket contains nodes, ordered by their last activity. the entry\n// that was most recently active is the first element in entries.\ntype bucket struct {\n\tentries      []*Node\n\treplacements []*Node\n}\n\nfunc newTable(ourID NodeID, ourAddr *net.UDPAddr) *Table {\n\tself := NewNode(ourID, ourAddr.IP, uint16(ourAddr.Port), uint16(ourAddr.Port))\n\ttab := &Table{self: self}\n\tfor i := range tab.buckets {\n\t\ttab.buckets[i] = new(bucket)\n\t}\n\treturn tab\n}\n\nconst printTable = false\n\n// chooseBucketRefreshTarget selects random refresh targets to keep all Kademlia\n// buckets filled with live connections and keep the network topology healthy.\n// This requires selecting addresses closer to our own with a higher probability\n// in order to refresh closer buckets too.\n//\n// This algorithm approximates the distance distribution of existing nodes in the\n// table by selecting a random node from the table and selecting a target address\n// with a distance less than twice of that of the selected node.\n// This algorithm will be improved later to specifically target the least recently\n// used buckets.\nfunc (tab *Table) chooseBucketRefreshTarget() common.Hash {\n\tentries := 0\n\tif printTable {\n\t\tfmt.Println()\n\t}\n\tfor i, b := range tab.buckets {\n\t\tentries += len(b.entries)\n\t\tif printTable {\n\t\t\tfor _, e := range b.entries {\n\t\t\t\tfmt.Println(i, e.state, e.addr().String(), e.ID.String(), e.sha.Hex())\n\t\t\t}\n\t\t}\n\t}\n\n\tprefix := binary.BigEndian.Uint64(tab.self.sha[0:8])\n\tdist := ^uint64(0)\n\tentry := int(randUint(uint32(entries + 1)))\n\tfor _, b := range tab.buckets {\n\t\tif entry < len(b.entries) {\n\t\t\tn := b.entries[entry]\n\t\t\tdist = binary.BigEndian.Uint64(n.sha[0:8]) ^ prefix\n\t\t\tbreak\n\t\t}\n\t\tentry -= len(b.entries)\n\t}\n\n\tddist := ^uint64(0)\n\tif dist+dist > dist {\n\t\tddist = dist\n\t}\n\ttargetPrefix := prefix ^ randUint64n(ddist)\n\n\tvar target common.Hash\n\tbinary.BigEndian.PutUint64(target[0:8], targetPrefix)\n\trand.Read(target[8:])\n\treturn target\n}\n\n// readRandomNodes fills the given slice with random nodes from the\n// table. It will not write the same node more than once. The nodes in\n// the slice are copies and can be modified by the caller.\nfunc (tab *Table) readRandomNodes(buf []*Node) (n int) {\n\t// TODO: tree-based buckets would help here\n\t// Find all non-empty buckets and get a fresh slice of their entries.\n\tvar buckets [][]*Node\n\tfor _, b := range tab.buckets {\n\t\tif len(b.entries) > 0 {\n\t\t\tbuckets = append(buckets, b.entries[:])\n\t\t}\n\t}\n\tif len(buckets) == 0 {\n\t\treturn 0\n\t}\n\t// Shuffle the buckets.\n\tfor i := uint32(len(buckets)) - 1; i > 0; i-- {\n\t\tj := randUint(i)\n\t\tbuckets[i], buckets[j] = buckets[j], buckets[i]\n\t}\n\t// Move head of each bucket into buf, removing buckets that become empty.\n\tvar i, j int\n\tfor ; i < len(buf); i, j = i+1, (j+1)%len(buckets) {\n\t\tb := buckets[j]\n\t\tbuf[i] = &(*b[0])\n\t\tbuckets[j] = b[1:]\n\t\tif len(b) == 1 {\n\t\t\tbuckets = append(buckets[:j], buckets[j+1:]...)\n\t\t}\n\t\tif len(buckets) == 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn i + 1\n}\n\nfunc randUint(max uint32) uint32 {\n\tif max < 2 {\n\t\treturn 0\n\t}\n\tvar b [4]byte\n\trand.Read(b[:])\n\treturn binary.BigEndian.Uint32(b[:]) % max\n}\n\nfunc randUint64n(max uint64) uint64 {\n\tif max < 2 {\n\t\treturn 0\n\t}\n\tvar b [8]byte\n\trand.Read(b[:])\n\treturn binary.BigEndian.Uint64(b[:]) % max\n}\n\n// closest returns the n nodes in the table that are closest to the\n// given id. The caller must hold tab.mutex.\nfunc (tab *Table) closest(target common.Hash, nresults int) *nodesByDistance {\n\t// This is a very wasteful way to find the closest nodes but\n\t// obviously correct. I believe that tree-based buckets would make\n\t// this easier to implement efficiently.\n\tclose := &nodesByDistance{target: target}\n\tfor _, b := range tab.buckets {\n\t\tfor _, n := range b.entries {\n\t\t\tclose.push(n, nresults)\n\t\t}\n\t}\n\treturn close\n}\n\n// add attempts to add the given node its corresponding bucket. If the\n// bucket has space available, adding the node succeeds immediately.\n// Otherwise, the node is added to the replacement cache for the bucket.\nfunc (tab *Table) add(n *Node) (contested *Node) {\n\t//fmt.Println(\"add\", n.addr().String(), n.ID.String(), n.sha.Hex())\n\tif n.ID == tab.self.ID {\n\t\treturn\n\t}\n\tb := tab.buckets[logdist(tab.self.sha, n.sha)]\n\tswitch {\n\tcase b.bump(n):\n\t\t// n exists in b.\n\t\treturn nil\n\tcase len(b.entries) < bucketSize:\n\t\t// b has space available.\n\t\tb.addFront(n)\n\t\ttab.count++\n\t\tif tab.nodeAddedHook != nil {\n\t\t\ttab.nodeAddedHook(n)\n\t\t}\n\t\treturn nil\n\tdefault:\n\t\t// b has no space left, add to replacement cache\n\t\t// and revalidate the last entry.\n\t\t// TODO: drop previous node\n\t\tb.replacements = append(b.replacements, n)\n\t\tif len(b.replacements) > bucketSize {\n\t\t\tcopy(b.replacements, b.replacements[1:])\n\t\t\tb.replacements = b.replacements[:len(b.replacements)-1]\n\t\t}\n\t\treturn b.entries[len(b.entries)-1]\n\t}\n}\n\n// stuff adds nodes the table to the end of their corresponding bucket\n// if the bucket is not full.\nfunc (tab *Table) stuff(nodes []*Node) {\nouter:\n\tfor _, n := range nodes {\n\t\tif n.ID == tab.self.ID {\n\t\t\tcontinue // don't add self\n\t\t}\n\t\tbucket := tab.buckets[logdist(tab.self.sha, n.sha)]\n\t\tfor i := range bucket.entries {\n\t\t\tif bucket.entries[i].ID == n.ID {\n\t\t\t\tcontinue outer // already in bucket\n\t\t\t}\n\t\t}\n\t\tif len(bucket.entries) < bucketSize {\n\t\t\tbucket.entries = append(bucket.entries, n)\n\t\t\ttab.count++\n\t\t\tif tab.nodeAddedHook != nil {\n\t\t\t\ttab.nodeAddedHook(n)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// delete removes an entry from the node table (used to evacuate\n// failed/non-bonded discovery peers).\nfunc (tab *Table) delete(node *Node) {\n\t//fmt.Println(\"delete\", node.addr().String(), node.ID.String(), node.sha.Hex())\n\tbucket := tab.buckets[logdist(tab.self.sha, node.sha)]\n\tfor i := range bucket.entries {\n\t\tif bucket.entries[i].ID == node.ID {\n\t\t\tbucket.entries = append(bucket.entries[:i], bucket.entries[i+1:]...)\n\t\t\ttab.count--\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (tab *Table) deleteReplace(node *Node) {\n\tb := tab.buckets[logdist(tab.self.sha, node.sha)]\n\ti := 0\n\tfor i < len(b.entries) {\n\t\tif b.entries[i].ID == node.ID {\n\t\t\tb.entries = append(b.entries[:i], b.entries[i+1:]...)\n\t\t\ttab.count--\n\t\t} else {\n\t\t\ti++\n\t\t}\n\t}\n\t// refill from replacement cache\n\t// TODO: maybe use random index\n\tif len(b.entries) < bucketSize && len(b.replacements) > 0 {\n\t\tri := len(b.replacements) - 1\n\t\tb.addFront(b.replacements[ri])\n\t\ttab.count++\n\t\tb.replacements[ri] = nil\n\t\tb.replacements = b.replacements[:ri]\n\t}\n}\n\nfunc (b *bucket) addFront(n *Node) {\n\tb.entries = append(b.entries, nil)\n\tcopy(b.entries[1:], b.entries)\n\tb.entries[0] = n\n}\n\nfunc (b *bucket) bump(n *Node) bool {\n\tfor i := range b.entries {\n\t\tif b.entries[i].ID == n.ID {\n\t\t\t// move it to the front\n\t\t\tcopy(b.entries[1:], b.entries[:i])\n\t\t\tb.entries[0] = n\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// nodesByDistance is a list of nodes, ordered by\n// distance to target.\ntype nodesByDistance struct {\n\tentries []*Node\n\ttarget  common.Hash\n}\n\n// push adds the given node to the list, keeping the total size below maxElems.\nfunc (h *nodesByDistance) push(n *Node, maxElems int) {\n\tix := sort.Search(len(h.entries), func(i int) bool {\n\t\treturn distcmp(h.target, h.entries[i].sha, n.sha) > 0\n\t})\n\tif len(h.entries) < maxElems {\n\t\th.entries = append(h.entries, n)\n\t}\n\tif ix == len(h.entries) {\n\t\t// farther away than all nodes we already have.\n\t\t// if there was room for it, the node is now the last element.\n\t} else {\n\t\t// slide existing entries down to make room\n\t\t// this will overwrite the entry we just appended.\n\t\tcopy(h.entries[ix+1:], h.entries[ix:])\n\t\th.entries[ix] = n\n\t}\n}\n"
  },
  {
    "path": "p2p/discv5/ticket.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage discv5\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/rand\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tticketTimeBucketLen = time.Minute\n\ttimeWindow          = 10 // * ticketTimeBucketLen\n\twantTicketsInWindow = 10\n\tcollectFrequency    = time.Second * 30\n\tregisterFrequency   = time.Second * 60\n\tmaxCollectDebt      = 10\n\tmaxRegisterDebt     = 5\n\tkeepTicketConst     = time.Minute * 10\n\tkeepTicketExp       = time.Minute * 5\n\ttargetWaitTime      = time.Minute * 10\n\ttopicQueryTimeout   = time.Second * 5\n\ttopicQueryResend    = time.Minute\n\t// topic radius detection\n\tmaxRadius           = 0xffffffffffffffff\n\tradiusTC            = time.Minute * 20\n\tradiusBucketsPerBit = 8\n\tminSlope            = 1\n\tminPeakSize         = 40\n\tmaxNoAdjust         = 20\n\tlookupWidth         = 8\n\tminRightSum         = 20\n\tsearchForceQuery    = 4\n)\n\n// timeBucket represents absolute monotonic time in minutes.\n// It is used as the index into the per-topic ticket buckets.\ntype timeBucket int\n\ntype ticket struct {\n\ttopics  []Topic\n\tregTime []mclock.AbsTime // Per-topic local absolute time when the ticket can be used.\n\n\t// The serial number that was issued by the server.\n\tserial uint32\n\t// Used by registrar, tracks absolute time when the ticket was created.\n\tissueTime mclock.AbsTime\n\n\t// Fields used only by registrants\n\tnode   *Node  // the registrar node that signed this ticket\n\trefCnt int    // tracks number of topics that will be registered using this ticket\n\tpong   []byte // encoded pong packet signed by the registrar\n}\n\n// ticketRef refers to a single topic in a ticket.\ntype ticketRef struct {\n\tt   *ticket\n\tidx int // index of the topic in t.topics and t.regTime\n}\n\nfunc (ref ticketRef) topic() Topic {\n\treturn ref.t.topics[ref.idx]\n}\n\nfunc (ref ticketRef) topicRegTime() mclock.AbsTime {\n\treturn ref.t.regTime[ref.idx]\n}\n\nfunc pongToTicket(localTime mclock.AbsTime, topics []Topic, node *Node, p *ingressPacket) (*ticket, error) {\n\twps := p.data.(*pong).WaitPeriods\n\tif len(topics) != len(wps) {\n\t\treturn nil, fmt.Errorf(\"bad wait period list: got %d values, want %d\", len(topics), len(wps))\n\t}\n\tif rlpHash(topics) != p.data.(*pong).TopicHash {\n\t\treturn nil, fmt.Errorf(\"bad topic hash\")\n\t}\n\tt := &ticket{\n\t\tissueTime: localTime,\n\t\tnode:      node,\n\t\ttopics:    topics,\n\t\tpong:      p.rawData,\n\t\tregTime:   make([]mclock.AbsTime, len(wps)),\n\t}\n\t// Convert wait periods to local absolute time.\n\tfor i, wp := range wps {\n\t\tt.regTime[i] = localTime + mclock.AbsTime(time.Second*time.Duration(wp))\n\t}\n\treturn t, nil\n}\n\nfunc ticketToPong(t *ticket, pong *pong) {\n\tpong.Expiration = uint64(t.issueTime / mclock.AbsTime(time.Second))\n\tpong.TopicHash = rlpHash(t.topics)\n\tpong.TicketSerial = t.serial\n\tpong.WaitPeriods = make([]uint32, len(t.regTime))\n\tfor i, regTime := range t.regTime {\n\t\tpong.WaitPeriods[i] = uint32(time.Duration(regTime-t.issueTime) / time.Second)\n\t}\n}\n\ntype ticketStore struct {\n\t// radius detector and target address generator\n\t// exists for both searched and registered topics\n\tradius map[Topic]*topicRadius\n\n\t// Contains buckets (for each absolute minute) of tickets\n\t// that can be used in that minute.\n\t// This is only set if the topic is being registered.\n\ttickets map[Topic]*topicTickets\n\n\tregQueue []Topic            // Topic registration queue for round robin attempts\n\tregSet   map[Topic]struct{} // Topic registration queue contents for fast filling\n\n\tnodes       map[*Node]*ticket\n\tnodeLastReq map[*Node]reqInfo\n\n\tlastBucketFetched timeBucket\n\tnextTicketCached  *ticketRef\n\tnextTicketReg     mclock.AbsTime\n\n\tsearchTopicMap        map[Topic]searchTopic\n\tnextTopicQueryCleanup mclock.AbsTime\n\tqueriesSent           map[*Node]map[common.Hash]sentQuery\n}\n\ntype searchTopic struct {\n\tfoundChn chan<- *Node\n}\n\ntype sentQuery struct {\n\tsent   mclock.AbsTime\n\tlookup lookupInfo\n}\n\ntype topicTickets struct {\n\tbuckets    map[timeBucket][]ticketRef\n\tnextLookup mclock.AbsTime\n\tnextReg    mclock.AbsTime\n}\n\nfunc newTicketStore() *ticketStore {\n\treturn &ticketStore{\n\t\tradius:         make(map[Topic]*topicRadius),\n\t\ttickets:        make(map[Topic]*topicTickets),\n\t\tregSet:         make(map[Topic]struct{}),\n\t\tnodes:          make(map[*Node]*ticket),\n\t\tnodeLastReq:    make(map[*Node]reqInfo),\n\t\tsearchTopicMap: make(map[Topic]searchTopic),\n\t\tqueriesSent:    make(map[*Node]map[common.Hash]sentQuery),\n\t}\n}\n\n// addTopic starts tracking a topic. If register is true,\n// the local node will register the topic and tickets will be collected.\nfunc (s *ticketStore) addTopic(topic Topic, register bool) {\n\tlog.Trace(\"Adding discovery topic\", \"topic\", topic, \"register\", register)\n\tif s.radius[topic] == nil {\n\t\ts.radius[topic] = newTopicRadius(topic)\n\t}\n\tif register && s.tickets[topic] == nil {\n\t\ts.tickets[topic] = &topicTickets{buckets: make(map[timeBucket][]ticketRef)}\n\t}\n}\n\nfunc (s *ticketStore) addSearchTopic(t Topic, foundChn chan<- *Node) {\n\ts.addTopic(t, false)\n\tif s.searchTopicMap[t].foundChn == nil {\n\t\ts.searchTopicMap[t] = searchTopic{foundChn: foundChn}\n\t}\n}\n\nfunc (s *ticketStore) removeSearchTopic(t Topic) {\n\tif st := s.searchTopicMap[t]; st.foundChn != nil {\n\t\tdelete(s.searchTopicMap, t)\n\t}\n}\n\n// removeRegisterTopic deletes all tickets for the given topic.\nfunc (s *ticketStore) removeRegisterTopic(topic Topic) {\n\tlog.Trace(\"Removing discovery topic\", \"topic\", topic)\n\tif s.tickets[topic] == nil {\n\t\tlog.Warn(\"Removing non-existent discovery topic\", \"topic\", topic)\n\t\treturn\n\t}\n\tfor _, list := range s.tickets[topic].buckets {\n\t\tfor _, ref := range list {\n\t\t\tref.t.refCnt--\n\t\t\tif ref.t.refCnt == 0 {\n\t\t\t\tdelete(s.nodes, ref.t.node)\n\t\t\t\tdelete(s.nodeLastReq, ref.t.node)\n\t\t\t}\n\t\t}\n\t}\n\tdelete(s.tickets, topic)\n}\n\nfunc (s *ticketStore) regTopicSet() []Topic {\n\ttopics := make([]Topic, 0, len(s.tickets))\n\tfor topic := range s.tickets {\n\t\ttopics = append(topics, topic)\n\t}\n\treturn topics\n}\n\n// nextRegisterLookup returns the target of the next lookup for ticket collection.\nfunc (s *ticketStore) nextRegisterLookup() (lookupInfo, time.Duration) {\n\t// Queue up any new topics (or discarded ones), preserving iteration order\n\tfor topic := range s.tickets {\n\t\tif _, ok := s.regSet[topic]; !ok {\n\t\t\ts.regQueue = append(s.regQueue, topic)\n\t\t\ts.regSet[topic] = struct{}{}\n\t\t}\n\t}\n\t// Iterate over the set of all topics and look up the next suitable one\n\tfor len(s.regQueue) > 0 {\n\t\t// Fetch the next topic from the queue, and ensure it still exists\n\t\ttopic := s.regQueue[0]\n\t\ts.regQueue = s.regQueue[1:]\n\t\tdelete(s.regSet, topic)\n\n\t\tif s.tickets[topic] == nil {\n\t\t\tcontinue\n\t\t}\n\t\t// If the topic needs more tickets, return it\n\t\tif s.tickets[topic].nextLookup < mclock.Now() {\n\t\t\tnext, delay := s.radius[topic].nextTarget(false), 100*time.Millisecond\n\t\t\tlog.Trace(\"Found discovery topic to register\", \"topic\", topic, \"target\", next.target, \"delay\", delay)\n\t\t\treturn next, delay\n\t\t}\n\t}\n\t// No registration topics found or all exhausted, sleep\n\tdelay := 40 * time.Second\n\tlog.Trace(\"No topic found to register\", \"delay\", delay)\n\treturn lookupInfo{}, delay\n}\n\nfunc (s *ticketStore) nextSearchLookup(topic Topic) lookupInfo {\n\ttr := s.radius[topic]\n\ttarget := tr.nextTarget(tr.radiusLookupCnt >= searchForceQuery)\n\tif target.radiusLookup {\n\t\ttr.radiusLookupCnt++\n\t} else {\n\t\ttr.radiusLookupCnt = 0\n\t}\n\treturn target\n}\n\n// ticketsInWindow returns the tickets of a given topic in the registration window.\nfunc (s *ticketStore) ticketsInWindow(topic Topic) []ticketRef {\n\t// Sanity check that the topic still exists before operating on it\n\tif s.tickets[topic] == nil {\n\t\tlog.Warn(\"Listing non-existing discovery tickets\", \"topic\", topic)\n\t\treturn nil\n\t}\n\t// Gather all the tickers in the next time window\n\tvar tickets []ticketRef\n\n\tbuckets := s.tickets[topic].buckets\n\tfor idx := timeBucket(0); idx < timeWindow; idx++ {\n\t\ttickets = append(tickets, buckets[s.lastBucketFetched+idx]...)\n\t}\n\tlog.Trace(\"Retrieved discovery registration tickets\", \"topic\", topic, \"from\", s.lastBucketFetched, \"tickets\", len(tickets))\n\treturn tickets\n}\n\nfunc (s *ticketStore) removeExcessTickets(t Topic) {\n\ttickets := s.ticketsInWindow(t)\n\tif len(tickets) <= wantTicketsInWindow {\n\t\treturn\n\t}\n\tsort.Sort(ticketRefByWaitTime(tickets))\n\tfor _, r := range tickets[wantTicketsInWindow:] {\n\t\ts.removeTicketRef(r)\n\t}\n}\n\ntype ticketRefByWaitTime []ticketRef\n\n// Len is the number of elements in the collection.\nfunc (s ticketRefByWaitTime) Len() int {\n\treturn len(s)\n}\n\nfunc (ref ticketRef) waitTime() mclock.AbsTime {\n\treturn ref.t.regTime[ref.idx] - ref.t.issueTime\n}\n\n// Less reports whether the element with\n// index i should sort before the element with index j.\nfunc (s ticketRefByWaitTime) Less(i, j int) bool {\n\treturn s[i].waitTime() < s[j].waitTime()\n}\n\n// Swap swaps the elements with indexes i and j.\nfunc (s ticketRefByWaitTime) Swap(i, j int) {\n\ts[i], s[j] = s[j], s[i]\n}\n\nfunc (s *ticketStore) addTicketRef(r ticketRef) {\n\ttopic := r.t.topics[r.idx]\n\ttickets := s.tickets[topic]\n\tif tickets == nil {\n\t\tlog.Warn(\"Adding ticket to non-existent topic\", \"topic\", topic)\n\t\treturn\n\t}\n\tbucket := timeBucket(r.t.regTime[r.idx] / mclock.AbsTime(ticketTimeBucketLen))\n\ttickets.buckets[bucket] = append(tickets.buckets[bucket], r)\n\tr.t.refCnt++\n\n\tmin := mclock.Now() - mclock.AbsTime(collectFrequency)*maxCollectDebt\n\tif tickets.nextLookup < min {\n\t\ttickets.nextLookup = min\n\t}\n\ttickets.nextLookup += mclock.AbsTime(collectFrequency)\n\n\t//s.removeExcessTickets(topic)\n}\n\nfunc (s *ticketStore) nextFilteredTicket() (*ticketRef, time.Duration) {\n\tnow := mclock.Now()\n\tfor {\n\t\tticket, wait := s.nextRegisterableTicket()\n\t\tif ticket == nil {\n\t\t\treturn ticket, wait\n\t\t}\n\t\tlog.Trace(\"Found discovery ticket to register\", \"node\", ticket.t.node, \"serial\", ticket.t.serial, \"wait\", wait)\n\n\t\tregTime := now + mclock.AbsTime(wait)\n\t\ttopic := ticket.t.topics[ticket.idx]\n\t\tif s.tickets[topic] != nil && regTime >= s.tickets[topic].nextReg {\n\t\t\treturn ticket, wait\n\t\t}\n\t\ts.removeTicketRef(*ticket)\n\t}\n}\n\nfunc (s *ticketStore) ticketRegistered(ref ticketRef) {\n\tnow := mclock.Now()\n\n\ttopic := ref.t.topics[ref.idx]\n\ttickets := s.tickets[topic]\n\tmin := now - mclock.AbsTime(registerFrequency)*maxRegisterDebt\n\tif min > tickets.nextReg {\n\t\ttickets.nextReg = min\n\t}\n\ttickets.nextReg += mclock.AbsTime(registerFrequency)\n\ts.tickets[topic] = tickets\n\n\ts.removeTicketRef(ref)\n}\n\n// nextRegisterableTicket returns the next ticket that can be used\n// to register.\n//\n// If the returned wait time <= zero the ticket can be used. For a positive\n// wait time, the caller should requery the next ticket later.\n//\n// A ticket can be returned more than once with <= zero wait time in case\n// the ticket contains multiple topics.\nfunc (s *ticketStore) nextRegisterableTicket() (*ticketRef, time.Duration) {\n\tnow := mclock.Now()\n\tif s.nextTicketCached != nil {\n\t\treturn s.nextTicketCached, time.Duration(s.nextTicketCached.topicRegTime() - now)\n\t}\n\n\tfor bucket := s.lastBucketFetched; ; bucket++ {\n\t\tvar (\n\t\t\tempty      = true    // true if there are no tickets\n\t\t\tnextTicket ticketRef // uninitialized if this bucket is empty\n\t\t)\n\t\tfor _, tickets := range s.tickets {\n\t\t\t//s.removeExcessTickets(topic)\n\t\t\tif len(tickets.buckets) != 0 {\n\t\t\t\tempty = false\n\n\t\t\t\tlist := tickets.buckets[bucket]\n\t\t\t\tfor _, ref := range list {\n\t\t\t\t\t//debugLog(fmt.Sprintf(\" nrt bucket = %d node = %x sn = %v wait = %v\", bucket, ref.t.node.ID[:8], ref.t.serial, time.Duration(ref.topicRegTime()-now)))\n\t\t\t\t\tif nextTicket.t == nil || ref.topicRegTime() < nextTicket.topicRegTime() {\n\t\t\t\t\t\tnextTicket = ref\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif empty {\n\t\t\treturn nil, 0\n\t\t}\n\t\tif nextTicket.t != nil {\n\t\t\ts.nextTicketCached = &nextTicket\n\t\t\treturn &nextTicket, time.Duration(nextTicket.topicRegTime() - now)\n\t\t}\n\t\ts.lastBucketFetched = bucket\n\t}\n}\n\n// removeTicket removes a ticket from the ticket store\nfunc (s *ticketStore) removeTicketRef(ref ticketRef) {\n\tlog.Trace(\"Removing discovery ticket reference\", \"node\", ref.t.node.ID, \"serial\", ref.t.serial)\n\n\t// Make nextRegisterableTicket return the next available ticket.\n\ts.nextTicketCached = nil\n\n\ttopic := ref.topic()\n\ttickets := s.tickets[topic]\n\n\tif tickets == nil {\n\t\tlog.Trace(\"Removing tickets from unknown topic\", \"topic\", topic)\n\t\treturn\n\t}\n\tbucket := timeBucket(ref.t.regTime[ref.idx] / mclock.AbsTime(ticketTimeBucketLen))\n\tlist := tickets.buckets[bucket]\n\tidx := -1\n\tfor i, bt := range list {\n\t\tif bt.t == ref.t {\n\t\t\tidx = i\n\t\t\tbreak\n\t\t}\n\t}\n\tif idx == -1 {\n\t\tpanic(nil)\n\t}\n\tlist = append(list[:idx], list[idx+1:]...)\n\tif len(list) != 0 {\n\t\ttickets.buckets[bucket] = list\n\t} else {\n\t\tdelete(tickets.buckets, bucket)\n\t}\n\tref.t.refCnt--\n\tif ref.t.refCnt == 0 {\n\t\tdelete(s.nodes, ref.t.node)\n\t\tdelete(s.nodeLastReq, ref.t.node)\n\t}\n}\n\ntype lookupInfo struct {\n\ttarget       common.Hash\n\ttopic        Topic\n\tradiusLookup bool\n}\n\ntype reqInfo struct {\n\tpingHash []byte\n\tlookup   lookupInfo\n\ttime     mclock.AbsTime\n}\n\n// returns -1 if not found\nfunc (t *ticket) findIdx(topic Topic) int {\n\tfor i, tt := range t.topics {\n\t\tif tt == topic {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\nfunc (s *ticketStore) registerLookupDone(lookup lookupInfo, nodes []*Node, ping func(n *Node) []byte) {\n\tnow := mclock.Now()\n\tfor i, n := range nodes {\n\t\tif i == 0 || (binary.BigEndian.Uint64(n.sha[:8])^binary.BigEndian.Uint64(lookup.target[:8])) < s.radius[lookup.topic].minRadius {\n\t\t\tif lookup.radiusLookup {\n\t\t\t\tif lastReq, ok := s.nodeLastReq[n]; !ok || time.Duration(now-lastReq.time) > radiusTC {\n\t\t\t\t\ts.nodeLastReq[n] = reqInfo{pingHash: ping(n), lookup: lookup, time: now}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif s.nodes[n] == nil {\n\t\t\t\t\ts.nodeLastReq[n] = reqInfo{pingHash: ping(n), lookup: lookup, time: now}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (s *ticketStore) searchLookupDone(lookup lookupInfo, nodes []*Node, query func(n *Node, topic Topic) []byte) {\n\tnow := mclock.Now()\n\tfor i, n := range nodes {\n\t\tif i == 0 || (binary.BigEndian.Uint64(n.sha[:8])^binary.BigEndian.Uint64(lookup.target[:8])) < s.radius[lookup.topic].minRadius {\n\t\t\tif lookup.radiusLookup {\n\t\t\t\tif lastReq, ok := s.nodeLastReq[n]; !ok || time.Duration(now-lastReq.time) > radiusTC {\n\t\t\t\t\ts.nodeLastReq[n] = reqInfo{pingHash: nil, lookup: lookup, time: now}\n\t\t\t\t}\n\t\t\t} // else {\n\t\t\tif s.canQueryTopic(n, lookup.topic) {\n\t\t\t\thash := query(n, lookup.topic)\n\t\t\t\tif hash != nil {\n\t\t\t\t\ts.addTopicQuery(common.BytesToHash(hash), n, lookup)\n\t\t\t\t}\n\t\t\t}\n\t\t\t//}\n\t\t}\n\t}\n}\n\nfunc (s *ticketStore) adjustWithTicket(now mclock.AbsTime, targetHash common.Hash, t *ticket) {\n\tfor i, topic := range t.topics {\n\t\tif tt, ok := s.radius[topic]; ok {\n\t\t\ttt.adjustWithTicket(now, targetHash, ticketRef{t, i})\n\t\t}\n\t}\n}\n\nfunc (s *ticketStore) addTicket(localTime mclock.AbsTime, pingHash []byte, ticket *ticket) {\n\tlog.Trace(\"Adding discovery ticket\", \"node\", ticket.node.ID, \"serial\", ticket.serial)\n\n\tlastReq, ok := s.nodeLastReq[ticket.node]\n\tif !(ok && bytes.Equal(pingHash, lastReq.pingHash)) {\n\t\treturn\n\t}\n\ts.adjustWithTicket(localTime, lastReq.lookup.target, ticket)\n\n\tif lastReq.lookup.radiusLookup || s.nodes[ticket.node] != nil {\n\t\treturn\n\t}\n\n\ttopic := lastReq.lookup.topic\n\ttopicIdx := ticket.findIdx(topic)\n\tif topicIdx == -1 {\n\t\treturn\n\t}\n\n\tbucket := timeBucket(localTime / mclock.AbsTime(ticketTimeBucketLen))\n\tif s.lastBucketFetched == 0 || bucket < s.lastBucketFetched {\n\t\ts.lastBucketFetched = bucket\n\t}\n\n\tif _, ok := s.tickets[topic]; ok {\n\t\twait := ticket.regTime[topicIdx] - localTime\n\t\trnd := rand.ExpFloat64()\n\t\tif rnd > 10 {\n\t\t\trnd = 10\n\t\t}\n\t\tif float64(wait) < float64(keepTicketConst)+float64(keepTicketExp)*rnd {\n\t\t\t// use the ticket to register this topic\n\t\t\t//fmt.Println(\"addTicket\", ticket.node.ID[:8], ticket.node.addr().String(), ticket.serial, ticket.pong)\n\t\t\ts.addTicketRef(ticketRef{ticket, topicIdx})\n\t\t}\n\t}\n\n\tif ticket.refCnt > 0 {\n\t\ts.nextTicketCached = nil\n\t\ts.nodes[ticket.node] = ticket\n\t}\n}\n\nfunc (s *ticketStore) getNodeTicket(node *Node) *ticket {\n\tif s.nodes[node] == nil {\n\t\tlog.Trace(\"Retrieving node ticket\", \"node\", node.ID, \"serial\", nil)\n\t} else {\n\t\tlog.Trace(\"Retrieving node ticket\", \"node\", node.ID, \"serial\", s.nodes[node].serial)\n\t}\n\treturn s.nodes[node]\n}\n\nfunc (s *ticketStore) canQueryTopic(node *Node, topic Topic) bool {\n\tqq := s.queriesSent[node]\n\tif qq != nil {\n\t\tnow := mclock.Now()\n\t\tfor _, sq := range qq {\n\t\t\tif sq.lookup.topic == topic && sq.sent > now-mclock.AbsTime(topicQueryResend) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (s *ticketStore) addTopicQuery(hash common.Hash, node *Node, lookup lookupInfo) {\n\tnow := mclock.Now()\n\tqq := s.queriesSent[node]\n\tif qq == nil {\n\t\tqq = make(map[common.Hash]sentQuery)\n\t\ts.queriesSent[node] = qq\n\t}\n\tqq[hash] = sentQuery{sent: now, lookup: lookup}\n\ts.cleanupTopicQueries(now)\n}\n\nfunc (s *ticketStore) cleanupTopicQueries(now mclock.AbsTime) {\n\tif s.nextTopicQueryCleanup > now {\n\t\treturn\n\t}\n\texp := now - mclock.AbsTime(topicQueryResend)\n\tfor n, qq := range s.queriesSent {\n\t\tfor h, q := range qq {\n\t\t\tif q.sent < exp {\n\t\t\t\tdelete(qq, h)\n\t\t\t}\n\t\t}\n\t\tif len(qq) == 0 {\n\t\t\tdelete(s.queriesSent, n)\n\t\t}\n\t}\n\ts.nextTopicQueryCleanup = now + mclock.AbsTime(topicQueryTimeout)\n}\n\nfunc (s *ticketStore) gotTopicNodes(from *Node, hash common.Hash, nodes []rpcNode) (timeout bool) {\n\tnow := mclock.Now()\n\t//fmt.Println(\"got\", from.addr().String(), hash, len(nodes))\n\tqq := s.queriesSent[from]\n\tif qq == nil {\n\t\treturn true\n\t}\n\tq, ok := qq[hash]\n\tif !ok || now > q.sent+mclock.AbsTime(topicQueryTimeout) {\n\t\treturn true\n\t}\n\tinside := float64(0)\n\tif len(nodes) > 0 {\n\t\tinside = 1\n\t}\n\ts.radius[q.lookup.topic].adjust(now, q.lookup.target, from.sha, inside)\n\tchn := s.searchTopicMap[q.lookup.topic].foundChn\n\tif chn == nil {\n\t\t//fmt.Println(\"no channel\")\n\t\treturn false\n\t}\n\tfor _, node := range nodes {\n\t\tip := node.IP\n\t\tif ip.IsUnspecified() || ip.IsLoopback() {\n\t\t\tip = from.IP\n\t\t}\n\t\tn := NewNode(node.ID, ip, node.UDP, node.TCP)\n\t\tselect {\n\t\tcase chn <- n:\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t}\n\treturn false\n}\n\ntype topicRadius struct {\n\ttopic             Topic\n\ttopicHashPrefix   uint64\n\tradius, minRadius uint64\n\tbuckets           []topicRadiusBucket\n\tconverged         bool\n\tradiusLookupCnt   int\n}\n\ntype topicRadiusEvent int\n\nconst (\n\ttrOutside topicRadiusEvent = iota\n\ttrInside\n\ttrNoAdjust\n\ttrCount\n)\n\ntype topicRadiusBucket struct {\n\tweights    [trCount]float64\n\tlastTime   mclock.AbsTime\n\tvalue      float64\n\tlookupSent map[common.Hash]mclock.AbsTime\n}\n\nfunc (b *topicRadiusBucket) update(now mclock.AbsTime) {\n\tif now == b.lastTime {\n\t\treturn\n\t}\n\texp := math.Exp(-float64(now-b.lastTime) / float64(radiusTC))\n\tfor i, w := range b.weights {\n\t\tb.weights[i] = w * exp\n\t}\n\tb.lastTime = now\n\n\tfor target, tm := range b.lookupSent {\n\t\tif now-tm > mclock.AbsTime(respTimeout) {\n\t\t\tb.weights[trNoAdjust] += 1\n\t\t\tdelete(b.lookupSent, target)\n\t\t}\n\t}\n}\n\nfunc (b *topicRadiusBucket) adjust(now mclock.AbsTime, inside float64) {\n\tb.update(now)\n\tif inside <= 0 {\n\t\tb.weights[trOutside] += 1\n\t} else {\n\t\tif inside >= 1 {\n\t\t\tb.weights[trInside] += 1\n\t\t} else {\n\t\t\tb.weights[trInside] += inside\n\t\t\tb.weights[trOutside] += 1 - inside\n\t\t}\n\t}\n}\n\nfunc newTopicRadius(t Topic) *topicRadius {\n\ttopicHash := crypto.Keccak256Hash([]byte(t))\n\ttopicHashPrefix := binary.BigEndian.Uint64(topicHash[0:8])\n\n\treturn &topicRadius{\n\t\ttopic:           t,\n\t\ttopicHashPrefix: topicHashPrefix,\n\t\tradius:          maxRadius,\n\t\tminRadius:       maxRadius,\n\t}\n}\n\nfunc (r *topicRadius) getBucketIdx(addrHash common.Hash) int {\n\tprefix := binary.BigEndian.Uint64(addrHash[0:8])\n\tvar log2 float64\n\tif prefix != r.topicHashPrefix {\n\t\tlog2 = math.Log2(float64(prefix ^ r.topicHashPrefix))\n\t}\n\tbucket := int((64 - log2) * radiusBucketsPerBit)\n\tmax := 64*radiusBucketsPerBit - 1\n\tif bucket > max {\n\t\treturn max\n\t}\n\tif bucket < 0 {\n\t\treturn 0\n\t}\n\treturn bucket\n}\n\nfunc (r *topicRadius) targetForBucket(bucket int) common.Hash {\n\tmin := math.Pow(2, 64-float64(bucket+1)/radiusBucketsPerBit)\n\tmax := math.Pow(2, 64-float64(bucket)/radiusBucketsPerBit)\n\ta := uint64(min)\n\tb := randUint64n(uint64(max - min))\n\txor := a + b\n\tif xor < a {\n\t\txor = ^uint64(0)\n\t}\n\tprefix := r.topicHashPrefix ^ xor\n\tvar target common.Hash\n\tbinary.BigEndian.PutUint64(target[0:8], prefix)\n\tglobalRandRead(target[8:])\n\treturn target\n}\n\n// package rand provides a Read function in Go 1.6 and later, but\n// we can't use it yet because we still support Go 1.5.\nfunc globalRandRead(b []byte) {\n\tpos := 0\n\tval := 0\n\tfor n := 0; n < len(b); n++ {\n\t\tif pos == 0 {\n\t\t\tval = rand.Int()\n\t\t\tpos = 7\n\t\t}\n\t\tb[n] = byte(val)\n\t\tval >>= 8\n\t\tpos--\n\t}\n}\n\nfunc (r *topicRadius) isInRadius(addrHash common.Hash) bool {\n\tnodePrefix := binary.BigEndian.Uint64(addrHash[0:8])\n\tdist := nodePrefix ^ r.topicHashPrefix\n\treturn dist < r.radius\n}\n\nfunc (r *topicRadius) chooseLookupBucket(a, b int) int {\n\tif a < 0 {\n\t\ta = 0\n\t}\n\tif a > b {\n\t\treturn -1\n\t}\n\tc := 0\n\tfor i := a; i <= b; i++ {\n\t\tif i >= len(r.buckets) || r.buckets[i].weights[trNoAdjust] < maxNoAdjust {\n\t\t\tc++\n\t\t}\n\t}\n\tif c == 0 {\n\t\treturn -1\n\t}\n\trnd := randUint(uint32(c))\n\tfor i := a; i <= b; i++ {\n\t\tif i >= len(r.buckets) || r.buckets[i].weights[trNoAdjust] < maxNoAdjust {\n\t\t\tif rnd == 0 {\n\t\t\t\treturn i\n\t\t\t}\n\t\t\trnd--\n\t\t}\n\t}\n\tpanic(nil) // should never happen\n}\n\nfunc (r *topicRadius) needMoreLookups(a, b int, maxValue float64) bool {\n\tvar max float64\n\tif a < 0 {\n\t\ta = 0\n\t}\n\tif b >= len(r.buckets) {\n\t\tb = len(r.buckets) - 1\n\t\tif r.buckets[b].value > max {\n\t\t\tmax = r.buckets[b].value\n\t\t}\n\t}\n\tif b >= a {\n\t\tfor i := a; i <= b; i++ {\n\t\t\tif r.buckets[i].value > max {\n\t\t\t\tmax = r.buckets[i].value\n\t\t\t}\n\t\t}\n\t}\n\treturn maxValue-max < minPeakSize\n}\n\nfunc (r *topicRadius) recalcRadius() (radius uint64, radiusLookup int) {\n\tmaxBucket := 0\n\tmaxValue := float64(0)\n\tnow := mclock.Now()\n\tv := float64(0)\n\tfor i := range r.buckets {\n\t\tr.buckets[i].update(now)\n\t\tv += r.buckets[i].weights[trOutside] - r.buckets[i].weights[trInside]\n\t\tr.buckets[i].value = v\n\t\t//fmt.Printf(\"%v %v | \", v, r.buckets[i].weights[trNoAdjust])\n\t}\n\t//fmt.Println()\n\tslopeCross := -1\n\tfor i, b := range r.buckets {\n\t\tv := b.value\n\t\tif v < float64(i)*minSlope {\n\t\t\tslopeCross = i\n\t\t\tbreak\n\t\t}\n\t\tif v > maxValue {\n\t\t\tmaxValue = v\n\t\t\tmaxBucket = i + 1\n\t\t}\n\t}\n\n\tminRadBucket := len(r.buckets)\n\tsum := float64(0)\n\tfor minRadBucket > 0 && sum < minRightSum {\n\t\tminRadBucket--\n\t\tb := r.buckets[minRadBucket]\n\t\tsum += b.weights[trInside] + b.weights[trOutside]\n\t}\n\tr.minRadius = uint64(math.Pow(2, 64-float64(minRadBucket)/radiusBucketsPerBit))\n\n\tlookupLeft := -1\n\tif r.needMoreLookups(0, maxBucket-lookupWidth-1, maxValue) {\n\t\tlookupLeft = r.chooseLookupBucket(maxBucket-lookupWidth, maxBucket-1)\n\t}\n\tlookupRight := -1\n\tif slopeCross != maxBucket && (minRadBucket <= maxBucket || r.needMoreLookups(maxBucket+lookupWidth, len(r.buckets)-1, maxValue)) {\n\t\tfor len(r.buckets) <= maxBucket+lookupWidth {\n\t\t\tr.buckets = append(r.buckets, topicRadiusBucket{lookupSent: make(map[common.Hash]mclock.AbsTime)})\n\t\t}\n\t\tlookupRight = r.chooseLookupBucket(maxBucket, maxBucket+lookupWidth-1)\n\t}\n\tif lookupLeft == -1 {\n\t\tradiusLookup = lookupRight\n\t} else {\n\t\tif lookupRight == -1 {\n\t\t\tradiusLookup = lookupLeft\n\t\t} else {\n\t\t\tif randUint(2) == 0 {\n\t\t\t\tradiusLookup = lookupLeft\n\t\t\t} else {\n\t\t\t\tradiusLookup = lookupRight\n\t\t\t}\n\t\t}\n\t}\n\n\t//fmt.Println(\"mb\", maxBucket, \"sc\", slopeCross, \"mrb\", minRadBucket, \"ll\", lookupLeft, \"lr\", lookupRight, \"mv\", maxValue)\n\n\tif radiusLookup == -1 {\n\t\t// no more radius lookups needed at the moment, return a radius\n\t\tr.converged = true\n\t\trad := maxBucket\n\t\tif minRadBucket < rad {\n\t\t\trad = minRadBucket\n\t\t}\n\t\tradius = ^uint64(0)\n\t\tif rad > 0 {\n\t\t\tradius = uint64(math.Pow(2, 64-float64(rad)/radiusBucketsPerBit))\n\t\t}\n\t\tr.radius = radius\n\t}\n\n\treturn\n}\n\nfunc (r *topicRadius) nextTarget(forceRegular bool) lookupInfo {\n\tif !forceRegular {\n\t\t_, radiusLookup := r.recalcRadius()\n\t\tif radiusLookup != -1 {\n\t\t\ttarget := r.targetForBucket(radiusLookup)\n\t\t\tr.buckets[radiusLookup].lookupSent[target] = mclock.Now()\n\t\t\treturn lookupInfo{target: target, topic: r.topic, radiusLookup: true}\n\t\t}\n\t}\n\n\tradExt := r.radius / 2\n\tif radExt > maxRadius-r.radius {\n\t\tradExt = maxRadius - r.radius\n\t}\n\trnd := randUint64n(r.radius) + randUint64n(2*radExt)\n\tif rnd > radExt {\n\t\trnd -= radExt\n\t} else {\n\t\trnd = radExt - rnd\n\t}\n\n\tprefix := r.topicHashPrefix ^ rnd\n\tvar target common.Hash\n\tbinary.BigEndian.PutUint64(target[0:8], prefix)\n\tglobalRandRead(target[8:])\n\treturn lookupInfo{target: target, topic: r.topic, radiusLookup: false}\n}\n\nfunc (r *topicRadius) adjustWithTicket(now mclock.AbsTime, targetHash common.Hash, t ticketRef) {\n\twait := t.t.regTime[t.idx] - t.t.issueTime\n\tinside := float64(wait)/float64(targetWaitTime) - 0.5\n\tif inside > 1 {\n\t\tinside = 1\n\t}\n\tif inside < 0 {\n\t\tinside = 0\n\t}\n\tr.adjust(now, targetHash, t.t.node.sha, inside)\n}\n\nfunc (r *topicRadius) adjust(now mclock.AbsTime, targetHash, addrHash common.Hash, inside float64) {\n\tbucket := r.getBucketIdx(addrHash)\n\t//fmt.Println(\"adjust\", bucket, len(r.buckets), inside)\n\tif bucket >= len(r.buckets) {\n\t\treturn\n\t}\n\tr.buckets[bucket].adjust(now, inside)\n\tdelete(r.buckets[bucket].lookupSent, targetHash)\n}\n"
  },
  {
    "path": "p2p/discv5/topic.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage discv5\n\nimport (\n\t\"container/heap\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/rand\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tmaxEntries         = 10000\n\tmaxEntriesPerTopic = 50\n\n\tfallbackRegistrationExpiry = 1 * time.Hour\n)\n\ntype Topic string\n\ntype topicEntry struct {\n\ttopic   Topic\n\tfifoIdx uint64\n\tnode    *Node\n\texpire  mclock.AbsTime\n}\n\ntype topicInfo struct {\n\tentries            map[uint64]*topicEntry\n\tfifoHead, fifoTail uint64\n\trqItem             *topicRequestQueueItem\n\twcl                waitControlLoop\n}\n\n// removes tail element from the fifo\nfunc (t *topicInfo) getFifoTail() *topicEntry {\n\tfor t.entries[t.fifoTail] == nil {\n\t\tt.fifoTail++\n\t}\n\ttail := t.entries[t.fifoTail]\n\tt.fifoTail++\n\treturn tail\n}\n\ntype nodeInfo struct {\n\tentries                          map[Topic]*topicEntry\n\tlastIssuedTicket, lastUsedTicket uint32\n\t// you can't register a ticket newer than lastUsedTicket before noRegUntil (absolute time)\n\tnoRegUntil mclock.AbsTime\n}\n\ntype topicTable struct {\n\tdb                    *nodeDB\n\tself                  *Node\n\tnodes                 map[*Node]*nodeInfo\n\ttopics                map[Topic]*topicInfo\n\tglobalEntries         uint64\n\trequested             topicRequestQueue\n\trequestCnt            uint64\n\tlastGarbageCollection mclock.AbsTime\n}\n\nfunc newTopicTable(db *nodeDB, self *Node) *topicTable {\n\tif printTestImgLogs {\n\t\tfmt.Printf(\"*N %016x\\n\", self.sha[:8])\n\t}\n\treturn &topicTable{\n\t\tdb:     db,\n\t\tnodes:  make(map[*Node]*nodeInfo),\n\t\ttopics: make(map[Topic]*topicInfo),\n\t\tself:   self,\n\t}\n}\n\nfunc (t *topicTable) getOrNewTopic(topic Topic) *topicInfo {\n\tti := t.topics[topic]\n\tif ti == nil {\n\t\trqItem := &topicRequestQueueItem{\n\t\t\ttopic:    topic,\n\t\t\tpriority: t.requestCnt,\n\t\t}\n\t\tti = &topicInfo{\n\t\t\tentries: make(map[uint64]*topicEntry),\n\t\t\trqItem:  rqItem,\n\t\t}\n\t\tt.topics[topic] = ti\n\t\theap.Push(&t.requested, rqItem)\n\t}\n\treturn ti\n}\n\nfunc (t *topicTable) checkDeleteTopic(topic Topic) {\n\tti := t.topics[topic]\n\tif ti == nil {\n\t\treturn\n\t}\n\tif len(ti.entries) == 0 && ti.wcl.hasMinimumWaitPeriod() {\n\t\tdelete(t.topics, topic)\n\t\theap.Remove(&t.requested, ti.rqItem.index)\n\t}\n}\n\nfunc (t *topicTable) getOrNewNode(node *Node) *nodeInfo {\n\tn := t.nodes[node]\n\tif n == nil {\n\t\t//fmt.Printf(\"newNode %016x %016x\\n\", t.self.sha[:8], node.sha[:8])\n\t\tvar issued, used uint32\n\t\tif t.db != nil {\n\t\t\tissued, used = t.db.fetchTopicRegTickets(node.ID)\n\t\t}\n\t\tn = &nodeInfo{\n\t\t\tentries:          make(map[Topic]*topicEntry),\n\t\t\tlastIssuedTicket: issued,\n\t\t\tlastUsedTicket:   used,\n\t\t}\n\t\tt.nodes[node] = n\n\t}\n\treturn n\n}\n\nfunc (t *topicTable) checkDeleteNode(node *Node) {\n\tif n, ok := t.nodes[node]; ok && len(n.entries) == 0 && n.noRegUntil < mclock.Now() {\n\t\t//fmt.Printf(\"deleteNode %016x %016x\\n\", t.self.sha[:8], node.sha[:8])\n\t\tdelete(t.nodes, node)\n\t}\n}\n\nfunc (t *topicTable) storeTicketCounters(node *Node) {\n\tn := t.getOrNewNode(node)\n\tif t.db != nil {\n\t\tt.db.updateTopicRegTickets(node.ID, n.lastIssuedTicket, n.lastUsedTicket)\n\t}\n}\n\nfunc (t *topicTable) getEntries(topic Topic) []*Node {\n\tt.collectGarbage()\n\n\tte := t.topics[topic]\n\tif te == nil {\n\t\treturn nil\n\t}\n\tnodes := make([]*Node, len(te.entries))\n\ti := 0\n\tfor _, e := range te.entries {\n\t\tnodes[i] = e.node\n\t\ti++\n\t}\n\tt.requestCnt++\n\tt.requested.update(te.rqItem, t.requestCnt)\n\treturn nodes\n}\n\nfunc (t *topicTable) addEntry(node *Node, topic Topic) {\n\tn := t.getOrNewNode(node)\n\t// clear previous entries by the same node\n\tfor _, e := range n.entries {\n\t\tt.deleteEntry(e)\n\t}\n\t// ***\n\tn = t.getOrNewNode(node)\n\n\ttm := mclock.Now()\n\tte := t.getOrNewTopic(topic)\n\n\tif len(te.entries) == maxEntriesPerTopic {\n\t\tt.deleteEntry(te.getFifoTail())\n\t}\n\n\tif t.globalEntries == maxEntries {\n\t\tt.deleteEntry(t.leastRequested()) // not empty, no need to check for nil\n\t}\n\n\tfifoIdx := te.fifoHead\n\tte.fifoHead++\n\tentry := &topicEntry{\n\t\ttopic:   topic,\n\t\tfifoIdx: fifoIdx,\n\t\tnode:    node,\n\t\texpire:  tm + mclock.AbsTime(fallbackRegistrationExpiry),\n\t}\n\tif printTestImgLogs {\n\t\tfmt.Printf(\"*+ %d %v %016x %016x\\n\", tm/1000000, topic, t.self.sha[:8], node.sha[:8])\n\t}\n\tte.entries[fifoIdx] = entry\n\tn.entries[topic] = entry\n\tt.globalEntries++\n\tte.wcl.registered(tm)\n}\n\n// removes least requested element from the fifo\nfunc (t *topicTable) leastRequested() *topicEntry {\n\tfor t.requested.Len() > 0 && t.topics[t.requested[0].topic] == nil {\n\t\theap.Pop(&t.requested)\n\t}\n\tif t.requested.Len() == 0 {\n\t\treturn nil\n\t}\n\treturn t.topics[t.requested[0].topic].getFifoTail()\n}\n\n// entry should exist\nfunc (t *topicTable) deleteEntry(e *topicEntry) {\n\tif printTestImgLogs {\n\t\tfmt.Printf(\"*- %d %v %016x %016x\\n\", mclock.Now()/1000000, e.topic, t.self.sha[:8], e.node.sha[:8])\n\t}\n\tne := t.nodes[e.node].entries\n\tdelete(ne, e.topic)\n\tif len(ne) == 0 {\n\t\tt.checkDeleteNode(e.node)\n\t}\n\tte := t.topics[e.topic]\n\tdelete(te.entries, e.fifoIdx)\n\tif len(te.entries) == 0 {\n\t\tt.checkDeleteTopic(e.topic)\n\t}\n\tt.globalEntries--\n}\n\n// It is assumed that topics and waitPeriods have the same length.\nfunc (t *topicTable) useTicket(node *Node, serialNo uint32, topics []Topic, idx int, issueTime uint64, waitPeriods []uint32) (registered bool) {\n\tlog.Trace(\"Using discovery ticket\", \"serial\", serialNo, \"topics\", topics, \"waits\", waitPeriods)\n\t//fmt.Println(\"useTicket\", serialNo, topics, waitPeriods)\n\tt.collectGarbage()\n\n\tn := t.getOrNewNode(node)\n\tif serialNo < n.lastUsedTicket {\n\t\treturn false\n\t}\n\n\ttm := mclock.Now()\n\tif serialNo > n.lastUsedTicket && tm < n.noRegUntil {\n\t\treturn false\n\t}\n\tif serialNo != n.lastUsedTicket {\n\t\tn.lastUsedTicket = serialNo\n\t\tn.noRegUntil = tm + mclock.AbsTime(noRegTimeout())\n\t\tt.storeTicketCounters(node)\n\t}\n\n\tcurrTime := uint64(tm / mclock.AbsTime(time.Second))\n\tregTime := issueTime + uint64(waitPeriods[idx])\n\trelTime := int64(currTime - regTime)\n\tif relTime >= -1 && relTime <= regTimeWindow+1 { // give clients a little security margin on both ends\n\t\tif e := n.entries[topics[idx]]; e == nil {\n\t\t\tt.addEntry(node, topics[idx])\n\t\t} else {\n\t\t\t// if there is an active entry, don't move to the front of the FIFO but prolong expire time\n\t\t\te.expire = tm + mclock.AbsTime(fallbackRegistrationExpiry)\n\t\t}\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc (t *topicTable) getTicket(node *Node, topics []Topic) *ticket {\n\tt.collectGarbage()\n\n\tnow := mclock.Now()\n\tn := t.getOrNewNode(node)\n\tn.lastIssuedTicket++\n\tt.storeTicketCounters(node)\n\n\ttic := &ticket{\n\t\tissueTime: now,\n\t\ttopics:    topics,\n\t\tserial:    n.lastIssuedTicket,\n\t\tregTime:   make([]mclock.AbsTime, len(topics)),\n\t}\n\tfor i, topic := range topics {\n\t\tvar waitPeriod time.Duration\n\t\tif topic := t.topics[topic]; topic != nil {\n\t\t\twaitPeriod = topic.wcl.waitPeriod\n\t\t} else {\n\t\t\twaitPeriod = minWaitPeriod\n\t\t}\n\n\t\ttic.regTime[i] = now + mclock.AbsTime(waitPeriod)\n\t}\n\treturn tic\n}\n\nconst gcInterval = time.Minute\n\nfunc (t *topicTable) collectGarbage() {\n\ttm := mclock.Now()\n\tif time.Duration(tm-t.lastGarbageCollection) < gcInterval {\n\t\treturn\n\t}\n\tt.lastGarbageCollection = tm\n\n\tfor node, n := range t.nodes {\n\t\tfor _, e := range n.entries {\n\t\t\tif e.expire <= tm {\n\t\t\t\tt.deleteEntry(e)\n\t\t\t}\n\t\t}\n\n\t\tt.checkDeleteNode(node)\n\t}\n\n\tfor topic := range t.topics {\n\t\tt.checkDeleteTopic(topic)\n\t}\n}\n\nconst (\n\tminWaitPeriod   = time.Minute\n\tregTimeWindow   = 10 // seconds\n\tavgnoRegTimeout = time.Minute * 10\n\t// target average interval between two incoming ad requests\n\twcTargetRegInterval = time.Minute * 10 / maxEntriesPerTopic\n\t//\n\twcTimeConst = time.Minute * 10\n)\n\n// initialization is not required, will set to minWaitPeriod at first registration\ntype waitControlLoop struct {\n\tlastIncoming mclock.AbsTime\n\twaitPeriod   time.Duration\n}\n\nfunc (w *waitControlLoop) registered(tm mclock.AbsTime) {\n\tw.waitPeriod = w.nextWaitPeriod(tm)\n\tw.lastIncoming = tm\n}\n\nfunc (w *waitControlLoop) nextWaitPeriod(tm mclock.AbsTime) time.Duration {\n\tperiod := tm - w.lastIncoming\n\twp := time.Duration(float64(w.waitPeriod) * math.Exp((float64(wcTargetRegInterval)-float64(period))/float64(wcTimeConst)))\n\tif wp < minWaitPeriod {\n\t\twp = minWaitPeriod\n\t}\n\treturn wp\n}\n\nfunc (w *waitControlLoop) hasMinimumWaitPeriod() bool {\n\treturn w.nextWaitPeriod(mclock.Now()) == minWaitPeriod\n}\n\nfunc noRegTimeout() time.Duration {\n\te := rand.ExpFloat64()\n\tif e > 100 {\n\t\te = 100\n\t}\n\treturn time.Duration(float64(avgnoRegTimeout) * e)\n}\n\ntype topicRequestQueueItem struct {\n\ttopic    Topic\n\tpriority uint64\n\tindex    int\n}\n\n// A topicRequestQueue implements heap.Interface and holds topicRequestQueueItems.\ntype topicRequestQueue []*topicRequestQueueItem\n\nfunc (tq topicRequestQueue) Len() int { return len(tq) }\n\nfunc (tq topicRequestQueue) Less(i, j int) bool {\n\treturn tq[i].priority < tq[j].priority\n}\n\nfunc (tq topicRequestQueue) Swap(i, j int) {\n\ttq[i], tq[j] = tq[j], tq[i]\n\ttq[i].index = i\n\ttq[j].index = j\n}\n\nfunc (tq *topicRequestQueue) Push(x interface{}) {\n\tn := len(*tq)\n\titem := x.(*topicRequestQueueItem)\n\titem.index = n\n\t*tq = append(*tq, item)\n}\n\nfunc (tq *topicRequestQueue) Pop() interface{} {\n\told := *tq\n\tn := len(old)\n\titem := old[n-1]\n\titem.index = -1\n\t*tq = old[0 : n-1]\n\treturn item\n}\n\nfunc (tq *topicRequestQueue) update(item *topicRequestQueueItem, priority uint64) {\n\titem.priority = priority\n\theap.Fix(tq, item.index)\n}\n"
  },
  {
    "path": "p2p/discv5/udp.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage discv5\n\nimport (\n\t\"bytes\"\n\t\"crypto/ecdsa\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/nat\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nconst Version = 4\n\n// Errors\nvar (\n\terrPacketTooSmall = errors.New(\"too small\")\n\terrBadPrefix      = errors.New(\"bad prefix\")\n)\n\n// Timeouts\nconst (\n\trespTimeout = 500 * time.Millisecond\n\texpiration  = 20 * time.Second\n\n\tdriftThreshold = 10 * time.Second // Allowed clock drift before warning user\n)\n\n// RPC request structures\ntype (\n\tping struct {\n\t\tVersion    uint\n\t\tFrom, To   rpcEndpoint\n\t\tExpiration uint64\n\n\t\t// v5\n\t\tTopics []Topic\n\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\t// pong is the reply to ping.\n\tpong struct {\n\t\t// This field should mirror the UDP envelope address\n\t\t// of the ping packet, which provides a way to discover the\n\t\t// the external address (after NAT).\n\t\tTo rpcEndpoint\n\n\t\tReplyTok   []byte // This contains the hash of the ping packet.\n\t\tExpiration uint64 // Absolute timestamp at which the packet becomes invalid.\n\n\t\t// v5\n\t\tTopicHash    common.Hash\n\t\tTicketSerial uint32\n\t\tWaitPeriods  []uint32\n\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\t// findnode is a query for nodes close to the given target.\n\tfindnode struct {\n\t\tTarget     NodeID // doesn't need to be an actual public key\n\t\tExpiration uint64\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\t// findnode is a query for nodes close to the given target.\n\tfindnodeHash struct {\n\t\tTarget     common.Hash\n\t\tExpiration uint64\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\t// reply to findnode\n\tneighbors struct {\n\t\tNodes      []rpcNode\n\t\tExpiration uint64\n\t\t// Ignore additional fields (for forward compatibility).\n\t\tRest []rlp.RawValue `rlp:\"tail\"`\n\t}\n\n\ttopicRegister struct {\n\t\tTopics []Topic\n\t\tIdx    uint\n\t\tPong   []byte\n\t}\n\n\ttopicQuery struct {\n\t\tTopic      Topic\n\t\tExpiration uint64\n\t}\n\n\t// reply to topicQuery\n\ttopicNodes struct {\n\t\tEcho  common.Hash\n\t\tNodes []rpcNode\n\t}\n\n\trpcNode struct {\n\t\tIP  net.IP // len 4 for IPv4 or 16 for IPv6\n\t\tUDP uint16 // for discovery protocol\n\t\tTCP uint16 // for RLPx protocol\n\t\tID  NodeID\n\t}\n\n\trpcEndpoint struct {\n\t\tIP  net.IP // len 4 for IPv4 or 16 for IPv6\n\t\tUDP uint16 // for discovery protocol\n\t\tTCP uint16 // for RLPx protocol\n\t}\n)\n\nvar (\n\tversionPrefix     = []byte(\"temporary discovery v5\")\n\tversionPrefixSize = len(versionPrefix)\n\tsigSize           = 520 / 8\n\theadSize          = versionPrefixSize + sigSize // space of packet frame data\n)\n\n// Neighbors replies are sent across multiple packets to\n// stay below the 1280 byte limit. We compute the maximum number\n// of entries by stuffing a packet until it grows too large.\nvar maxNeighbors = func() int {\n\tp := neighbors{Expiration: ^uint64(0)}\n\tmaxSizeNode := rpcNode{IP: make(net.IP, 16), UDP: ^uint16(0), TCP: ^uint16(0)}\n\tfor n := 0; ; n++ {\n\t\tp.Nodes = append(p.Nodes, maxSizeNode)\n\t\tsize, _, err := rlp.EncodeToReader(p)\n\t\tif err != nil {\n\t\t\t// If this ever happens, it will be caught by the unit tests.\n\t\t\tpanic(\"cannot encode: \" + err.Error())\n\t\t}\n\t\tif headSize+size+1 >= 1280 {\n\t\t\treturn n\n\t\t}\n\t}\n}()\n\nvar maxTopicNodes = func() int {\n\tp := topicNodes{}\n\tmaxSizeNode := rpcNode{IP: make(net.IP, 16), UDP: ^uint16(0), TCP: ^uint16(0)}\n\tfor n := 0; ; n++ {\n\t\tp.Nodes = append(p.Nodes, maxSizeNode)\n\t\tsize, _, err := rlp.EncodeToReader(p)\n\t\tif err != nil {\n\t\t\t// If this ever happens, it will be caught by the unit tests.\n\t\t\tpanic(\"cannot encode: \" + err.Error())\n\t\t}\n\t\tif headSize+size+1 >= 1280 {\n\t\t\treturn n\n\t\t}\n\t}\n}()\n\nfunc makeEndpoint(addr *net.UDPAddr, tcpPort uint16) rpcEndpoint {\n\tip := addr.IP.To4()\n\tif ip == nil {\n\t\tip = addr.IP.To16()\n\t}\n\treturn rpcEndpoint{IP: ip, UDP: uint16(addr.Port), TCP: tcpPort}\n}\n\nfunc (e1 rpcEndpoint) equal(e2 rpcEndpoint) bool {\n\treturn e1.UDP == e2.UDP && e1.TCP == e2.TCP && e1.IP.Equal(e2.IP)\n}\n\nfunc nodeFromRPC(sender *net.UDPAddr, rn rpcNode) (*Node, error) {\n\tif err := netutil.CheckRelayIP(sender.IP, rn.IP); err != nil {\n\t\treturn nil, err\n\t}\n\tn := NewNode(rn.ID, rn.IP, rn.UDP, rn.TCP)\n\terr := n.validateComplete()\n\treturn n, err\n}\n\nfunc nodeToRPC(n *Node) rpcNode {\n\treturn rpcNode{ID: n.ID, IP: n.IP, UDP: n.UDP, TCP: n.TCP}\n}\n\ntype ingressPacket struct {\n\tremoteID   NodeID\n\tremoteAddr *net.UDPAddr\n\tev         nodeEvent\n\thash       []byte\n\tdata       interface{} // one of the RPC structs\n\trawData    []byte\n}\n\ntype conn interface {\n\tReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error)\n\tWriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error)\n\tClose() error\n\tLocalAddr() net.Addr\n}\n\n// udp implements the RPC protocol.\ntype udp struct {\n\tconn        conn\n\tpriv        *ecdsa.PrivateKey\n\tourEndpoint rpcEndpoint\n\tnat         nat.Interface\n\tnet         *Network\n}\n\n// ListenUDP returns a new table that listens for UDP packets on laddr.\nfunc ListenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr, nodeDBPath string, netrestrict *netutil.Netlist) (*Network, error) {\n\ttransport, err := listenUDP(priv, conn, realaddr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnet, err := newNetwork(transport, priv.PublicKey, nodeDBPath, netrestrict)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tlog.Info(\"UDP listener up\", \"net\", net.tab.self)\n\ttransport.net = net\n\tgo transport.readLoop()\n\treturn net, nil\n}\n\nfunc listenUDP(priv *ecdsa.PrivateKey, conn conn, realaddr *net.UDPAddr) (*udp, error) {\n\treturn &udp{conn: conn, priv: priv, ourEndpoint: makeEndpoint(realaddr, uint16(realaddr.Port))}, nil\n}\n\nfunc (t *udp) localAddr() *net.UDPAddr {\n\treturn t.conn.LocalAddr().(*net.UDPAddr)\n}\n\nfunc (t *udp) Close() {\n\tt.conn.Close()\n}\n\nfunc (t *udp) send(remote *Node, ptype nodeEvent, data interface{}) (hash []byte) {\n\thash, _ = t.sendPacket(remote.ID, remote.addr(), byte(ptype), data)\n\treturn hash\n}\n\nfunc (t *udp) sendPing(remote *Node, toaddr *net.UDPAddr, topics []Topic) (hash []byte) {\n\thash, _ = t.sendPacket(remote.ID, toaddr, byte(pingPacket), ping{\n\t\tVersion:    Version,\n\t\tFrom:       t.ourEndpoint,\n\t\tTo:         makeEndpoint(toaddr, uint16(toaddr.Port)), // TODO: maybe use known TCP port from DB\n\t\tExpiration: uint64(time.Now().Add(expiration).Unix()),\n\t\tTopics:     topics,\n\t})\n\treturn hash\n}\n\nfunc (t *udp) sendFindnode(remote *Node, target NodeID) {\n\tt.sendPacket(remote.ID, remote.addr(), byte(findnodePacket), findnode{\n\t\tTarget:     target,\n\t\tExpiration: uint64(time.Now().Add(expiration).Unix()),\n\t})\n}\n\nfunc (t *udp) sendNeighbours(remote *Node, results []*Node) {\n\t// Send neighbors in chunks with at most maxNeighbors per packet\n\t// to stay below the 1280 byte limit.\n\tp := neighbors{Expiration: uint64(time.Now().Add(expiration).Unix())}\n\tfor i, result := range results {\n\t\tp.Nodes = append(p.Nodes, nodeToRPC(result))\n\t\tif len(p.Nodes) == maxNeighbors || i == len(results)-1 {\n\t\t\tt.sendPacket(remote.ID, remote.addr(), byte(neighborsPacket), p)\n\t\t\tp.Nodes = p.Nodes[:0]\n\t\t}\n\t}\n}\n\nfunc (t *udp) sendFindnodeHash(remote *Node, target common.Hash) {\n\tt.sendPacket(remote.ID, remote.addr(), byte(findnodeHashPacket), findnodeHash{\n\t\tTarget:     target,\n\t\tExpiration: uint64(time.Now().Add(expiration).Unix()),\n\t})\n}\n\nfunc (t *udp) sendTopicRegister(remote *Node, topics []Topic, idx int, pong []byte) {\n\tt.sendPacket(remote.ID, remote.addr(), byte(topicRegisterPacket), topicRegister{\n\t\tTopics: topics,\n\t\tIdx:    uint(idx),\n\t\tPong:   pong,\n\t})\n}\n\nfunc (t *udp) sendTopicNodes(remote *Node, queryHash common.Hash, nodes []*Node) {\n\tp := topicNodes{Echo: queryHash}\n\tvar sent bool\n\tfor _, result := range nodes {\n\t\tif result.IP.Equal(t.net.tab.self.IP) || netutil.CheckRelayIP(remote.IP, result.IP) == nil {\n\t\t\tp.Nodes = append(p.Nodes, nodeToRPC(result))\n\t\t}\n\t\tif len(p.Nodes) == maxTopicNodes {\n\t\t\tt.sendPacket(remote.ID, remote.addr(), byte(topicNodesPacket), p)\n\t\t\tp.Nodes = p.Nodes[:0]\n\t\t\tsent = true\n\t\t}\n\t}\n\tif !sent || len(p.Nodes) > 0 {\n\t\tt.sendPacket(remote.ID, remote.addr(), byte(topicNodesPacket), p)\n\t}\n}\n\nfunc (t *udp) sendPacket(toid NodeID, toaddr *net.UDPAddr, ptype byte, req interface{}) (hash []byte, err error) {\n\t//fmt.Println(\"sendPacket\", nodeEvent(ptype), toaddr.String(), toid.String())\n\tpacket, hash, err := encodePacket(t.priv, ptype, req)\n\tif err != nil {\n\t\t//fmt.Println(err)\n\t\treturn hash, err\n\t}\n\tlog.Trace(fmt.Sprintf(\">>> %v to %x@%v\", nodeEvent(ptype), toid[:8], toaddr))\n\tif nbytes, err := t.conn.WriteToUDP(packet, toaddr); err != nil {\n\t\tlog.Trace(fmt.Sprint(\"UDP send failed:\", err))\n\t} else {\n\t\tegressTrafficMeter.Mark(int64(nbytes))\n\t}\n\t//fmt.Println(err)\n\treturn hash, err\n}\n\n// zeroed padding space for encodePacket.\nvar headSpace = make([]byte, headSize)\n\nfunc encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) (p, hash []byte, err error) {\n\tb := new(bytes.Buffer)\n\tb.Write(headSpace)\n\tb.WriteByte(ptype)\n\tif err := rlp.Encode(b, req); err != nil {\n\t\tlog.Error(fmt.Sprint(\"error encoding packet:\", err))\n\t\treturn nil, nil, err\n\t}\n\tpacket := b.Bytes()\n\tsig, err := crypto.Sign(crypto.Keccak256(packet[headSize:]), priv)\n\tif err != nil {\n\t\tlog.Error(fmt.Sprint(\"could not sign packet:\", err))\n\t\treturn nil, nil, err\n\t}\n\tcopy(packet, versionPrefix)\n\tcopy(packet[versionPrefixSize:], sig)\n\thash = crypto.Keccak256(packet[versionPrefixSize:])\n\treturn packet, hash, nil\n}\n\n// readLoop runs in its own goroutine. it injects ingress UDP packets\n// into the network loop.\nfunc (t *udp) readLoop() {\n\tdefer t.conn.Close()\n\t// Discovery packets are defined to be no larger than 1280 bytes.\n\t// Packets larger than this size will be cut at the end and treated\n\t// as invalid because their hash won't match.\n\tbuf := make([]byte, 1280)\n\tfor {\n\t\tnbytes, from, err := t.conn.ReadFromUDP(buf)\n\t\tingressTrafficMeter.Mark(int64(nbytes))\n\t\tif netutil.IsTemporaryError(err) {\n\t\t\t// Ignore temporary read errors.\n\t\t\tlog.Debug(fmt.Sprintf(\"Temporary read error: %v\", err))\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\t// Shut down the loop for permament errors.\n\t\t\tlog.Debug(fmt.Sprintf(\"Read error: %v\", err))\n\t\t\treturn\n\t\t}\n\t\tt.handlePacket(from, buf[:nbytes])\n\t}\n}\n\nfunc (t *udp) handlePacket(from *net.UDPAddr, buf []byte) error {\n\tpkt := ingressPacket{remoteAddr: from}\n\tif err := decodePacket(buf, &pkt); err != nil {\n\t\tlog.Debug(fmt.Sprintf(\"Bad packet from %v: %v\", from, err))\n\t\t//fmt.Println(\"bad packet\", err)\n\t\treturn err\n\t}\n\tt.net.reqReadPacket(pkt)\n\treturn nil\n}\n\nfunc decodePacket(buffer []byte, pkt *ingressPacket) error {\n\tif len(buffer) < headSize+1 {\n\t\treturn errPacketTooSmall\n\t}\n\tbuf := make([]byte, len(buffer))\n\tcopy(buf, buffer)\n\tprefix, sig, sigdata := buf[:versionPrefixSize], buf[versionPrefixSize:headSize], buf[headSize:]\n\tif !bytes.Equal(prefix, versionPrefix) {\n\t\treturn errBadPrefix\n\t}\n\tfromID, err := recoverNodeID(crypto.Keccak256(buf[headSize:]), sig)\n\tif err != nil {\n\t\treturn err\n\t}\n\tpkt.rawData = buf\n\tpkt.hash = crypto.Keccak256(buf[versionPrefixSize:])\n\tpkt.remoteID = fromID\n\tswitch pkt.ev = nodeEvent(sigdata[0]); pkt.ev {\n\tcase pingPacket:\n\t\tpkt.data = new(ping)\n\tcase pongPacket:\n\t\tpkt.data = new(pong)\n\tcase findnodePacket:\n\t\tpkt.data = new(findnode)\n\tcase neighborsPacket:\n\t\tpkt.data = new(neighbors)\n\tcase findnodeHashPacket:\n\t\tpkt.data = new(findnodeHash)\n\tcase topicRegisterPacket:\n\t\tpkt.data = new(topicRegister)\n\tcase topicQueryPacket:\n\t\tpkt.data = new(topicQuery)\n\tcase topicNodesPacket:\n\t\tpkt.data = new(topicNodes)\n\tdefault:\n\t\treturn fmt.Errorf(\"unknown packet type: %d\", sigdata[0])\n\t}\n\ts := rlp.NewStream(bytes.NewReader(sigdata[1:]), 0)\n\terr = s.Decode(pkt.data)\n\treturn err\n}\n"
  },
  {
    "path": "p2p/enr/enr.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package enr implements Ethereum Node Records as defined in EIP-778. A node record holds\n// arbitrary information about a node on the peer-to-peer network.\n//\n// Records contain named keys. To store and retrieve key/values in a record, use the Entry\n// interface.\n//\n// Records must be signed before transmitting them to another node. Decoding a record verifies\n// its signature. When creating a record, set the entries you want, then call Sign to add the\n// signature. Modifying a record invalidates the signature.\n//\n// Package enr supports the \"secp256k1-keccak\" identity scheme.\npackage enr\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"sort\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nconst SizeLimit = 300 // maximum encoded size of a node record in bytes\n\nvar (\n\terrNoID           = errors.New(\"unknown or unspecified identity scheme\")\n\terrInvalidSig     = errors.New(\"invalid signature\")\n\terrNotSorted      = errors.New(\"record key/value pairs are not sorted by key\")\n\terrDuplicateKey   = errors.New(\"record contains duplicate key\")\n\terrIncompletePair = errors.New(\"record contains incomplete k/v pair\")\n\terrTooBig         = fmt.Errorf(\"record bigger than %d bytes\", SizeLimit)\n\terrEncodeUnsigned = errors.New(\"can't encode unsigned record\")\n\terrNotFound       = errors.New(\"no such key in record\")\n)\n\n// Record represents a node record. The zero value is an empty record.\ntype Record struct {\n\tseq       uint64 // sequence number\n\tsignature []byte // the signature\n\traw       []byte // RLP encoded record\n\tpairs     []pair // sorted list of all key/value pairs\n}\n\n// pair is a key/value pair in a record.\ntype pair struct {\n\tk string\n\tv rlp.RawValue\n}\n\n// Signed reports whether the record has a valid signature.\nfunc (r *Record) Signed() bool {\n\treturn r.signature != nil\n}\n\n// Seq returns the sequence number.\nfunc (r *Record) Seq() uint64 {\n\treturn r.seq\n}\n\n// SetSeq updates the record sequence number. This invalidates any signature on the record.\n// Calling SetSeq is usually not required because setting any key in a signed record\n// increments the sequence number.\nfunc (r *Record) SetSeq(s uint64) {\n\tr.signature = nil\n\tr.raw = nil\n\tr.seq = s\n}\n\n// Load retrieves the value of a key/value pair. The given Entry must be a pointer and will\n// be set to the value of the entry in the record.\n//\n// Errors returned by Load are wrapped in KeyError. You can distinguish decoding errors\n// from missing keys using the IsNotFound function.\nfunc (r *Record) Load(e Entry) error {\n\ti := sort.Search(len(r.pairs), func(i int) bool { return r.pairs[i].k >= e.ENRKey() })\n\tif i < len(r.pairs) && r.pairs[i].k == e.ENRKey() {\n\t\tif err := rlp.DecodeBytes(r.pairs[i].v, e); err != nil {\n\t\t\treturn &KeyError{Key: e.ENRKey(), Err: err}\n\t\t}\n\t\treturn nil\n\t}\n\treturn &KeyError{Key: e.ENRKey(), Err: errNotFound}\n}\n\n// Set adds or updates the given entry in the record. It panics if the value can't be\n// encoded. If the record is signed, Set increments the sequence number and invalidates\n// the sequence number.\nfunc (r *Record) Set(e Entry) {\n\tblob, err := rlp.EncodeToBytes(e)\n\tif err != nil {\n\t\tpanic(fmt.Errorf(\"enr: can't encode %s: %v\", e.ENRKey(), err))\n\t}\n\tr.invalidate()\n\n\tpairs := make([]pair, len(r.pairs))\n\tcopy(pairs, r.pairs)\n\ti := sort.Search(len(pairs), func(i int) bool { return pairs[i].k >= e.ENRKey() })\n\tswitch {\n\tcase i < len(pairs) && pairs[i].k == e.ENRKey():\n\t\t// element is present at r.pairs[i]\n\t\tpairs[i].v = blob\n\tcase i < len(r.pairs):\n\t\t// insert pair before i-th elem\n\t\tel := pair{e.ENRKey(), blob}\n\t\tpairs = append(pairs, pair{})\n\t\tcopy(pairs[i+1:], pairs[i:])\n\t\tpairs[i] = el\n\tdefault:\n\t\t// element should be placed at the end of r.pairs\n\t\tpairs = append(pairs, pair{e.ENRKey(), blob})\n\t}\n\tr.pairs = pairs\n}\n\nfunc (r *Record) invalidate() {\n\tif r.signature == nil {\n\t\tr.seq++\n\t}\n\tr.signature = nil\n\tr.raw = nil\n}\n\n// EncodeRLP implements rlp.Encoder. Encoding fails if\n// the record is unsigned.\nfunc (r Record) EncodeRLP(w io.Writer) error {\n\tif !r.Signed() {\n\t\treturn errEncodeUnsigned\n\t}\n\t_, err := w.Write(r.raw)\n\treturn err\n}\n\n// DecodeRLP implements rlp.Decoder. Decoding verifies the signature.\nfunc (r *Record) DecodeRLP(s *rlp.Stream) error {\n\traw, err := s.Raw()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(raw) > SizeLimit {\n\t\treturn errTooBig\n\t}\n\n\t// Decode the RLP container.\n\tdec := Record{raw: raw}\n\ts = rlp.NewStream(bytes.NewReader(raw), 0)\n\tif _, err := s.List(); err != nil {\n\t\treturn err\n\t}\n\tif err = s.Decode(&dec.signature); err != nil {\n\t\treturn err\n\t}\n\tif err = s.Decode(&dec.seq); err != nil {\n\t\treturn err\n\t}\n\t// The rest of the record contains sorted k/v pairs.\n\tvar prevkey string\n\tfor i := 0; ; i++ {\n\t\tvar kv pair\n\t\tif err := s.Decode(&kv.k); err != nil {\n\t\t\tif err == rlp.EOL {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\tif err := s.Decode(&kv.v); err != nil {\n\t\t\tif err == rlp.EOL {\n\t\t\t\treturn errIncompletePair\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\tif i > 0 {\n\t\t\tif kv.k == prevkey {\n\t\t\t\treturn errDuplicateKey\n\t\t\t}\n\t\t\tif kv.k < prevkey {\n\t\t\t\treturn errNotSorted\n\t\t\t}\n\t\t}\n\t\tdec.pairs = append(dec.pairs, kv)\n\t\tprevkey = kv.k\n\t}\n\tif err := s.ListEnd(); err != nil {\n\t\treturn err\n\t}\n\n\t_, scheme := dec.idScheme()\n\tif scheme == nil {\n\t\treturn errNoID\n\t}\n\tif err := scheme.Verify(&dec, dec.signature); err != nil {\n\t\treturn err\n\t}\n\t*r = dec\n\treturn nil\n}\n\n// NodeAddr returns the node address. The return value will be nil if the record is\n// unsigned or uses an unknown identity scheme.\nfunc (r *Record) NodeAddr() []byte {\n\t_, scheme := r.idScheme()\n\tif scheme == nil {\n\t\treturn nil\n\t}\n\treturn scheme.NodeAddr(r)\n}\n\n// SetSig sets the record signature. It returns an error if the encoded record is larger\n// than the size limit or if the signature is invalid according to the passed scheme.\nfunc (r *Record) SetSig(idscheme string, sig []byte) error {\n\t// Check that \"id\" is set and matches the given scheme. This panics because\n\t// inconsitencies here are always implementation bugs in the signing function calling\n\t// this method.\n\tid, s := r.idScheme()\n\tif s == nil {\n\t\tpanic(errNoID)\n\t}\n\tif id != idscheme {\n\t\tpanic(fmt.Errorf(\"identity scheme mismatch in Sign: record has %s, want %s\", id, idscheme))\n\t}\n\n\t// Verify against the scheme.\n\tif err := s.Verify(r, sig); err != nil {\n\t\treturn err\n\t}\n\traw, err := r.encode(sig)\n\tif err != nil {\n\t\treturn err\n\t}\n\tr.signature, r.raw = sig, raw\n\treturn nil\n}\n\n// AppendElements appends the sequence number and entries to the given slice.\nfunc (r *Record) AppendElements(list []interface{}) []interface{} {\n\tlist = append(list, r.seq)\n\tfor _, p := range r.pairs {\n\t\tlist = append(list, p.k, p.v)\n\t}\n\treturn list\n}\n\nfunc (r *Record) encode(sig []byte) (raw []byte, err error) {\n\tlist := make([]interface{}, 1, 2*len(r.pairs)+1)\n\tlist[0] = sig\n\tlist = r.AppendElements(list)\n\tif raw, err = rlp.EncodeToBytes(list); err != nil {\n\t\treturn nil, err\n\t}\n\tif len(raw) > SizeLimit {\n\t\treturn nil, errTooBig\n\t}\n\treturn raw, nil\n}\n\nfunc (r *Record) idScheme() (string, IdentityScheme) {\n\tvar id ID\n\tif err := r.Load(&id); err != nil {\n\t\treturn \"\", nil\n\t}\n\treturn string(id), FindIdentityScheme(string(id))\n}\n"
  },
  {
    "path": "p2p/enr/entries.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage enr\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// Entry is implemented by known node record entry types.\n//\n// To define a new entry that is to be included in a node record,\n// create a Go type that satisfies this interface. The type should\n// also implement rlp.Decoder if additional checks are needed on the value.\ntype Entry interface {\n\tENRKey() string\n}\n\ntype generic struct {\n\tkey   string\n\tvalue interface{}\n}\n\nfunc (g generic) ENRKey() string { return g.key }\n\nfunc (g generic) EncodeRLP(w io.Writer) error {\n\treturn rlp.Encode(w, g.value)\n}\n\nfunc (g *generic) DecodeRLP(s *rlp.Stream) error {\n\treturn s.Decode(g.value)\n}\n\n// WithEntry wraps any value with a key name. It can be used to set and load arbitrary values\n// in a record. The value v must be supported by rlp. To use WithEntry with Load, the value\n// must be a pointer.\nfunc WithEntry(k string, v interface{}) Entry {\n\treturn &generic{key: k, value: v}\n}\n\n// TCP is the \"tcp\" key, which holds the TCP port of the node.\ntype TCP uint16\n\nfunc (v TCP) ENRKey() string { return \"tcp\" }\n\n// UDP is the \"udp\" key, which holds the UDP port of the node.\ntype UDP uint16\n\nfunc (v UDP) ENRKey() string { return \"udp\" }\n\n// ID is the \"id\" key, which holds the name of the identity scheme.\ntype ID string\n\nconst IDv4 = ID(\"v4\") // the default identity scheme\n\nfunc (v ID) ENRKey() string { return \"id\" }\n\n// IP is the \"ip\" key, which holds the IP address of the node.\ntype IP net.IP\n\nfunc (v IP) ENRKey() string { return \"ip\" }\n\n// EncodeRLP implements rlp.Encoder.\nfunc (v IP) EncodeRLP(w io.Writer) error {\n\tif ip4 := net.IP(v).To4(); ip4 != nil {\n\t\treturn rlp.Encode(w, ip4)\n\t}\n\treturn rlp.Encode(w, net.IP(v))\n}\n\n// DecodeRLP implements rlp.Decoder.\nfunc (v *IP) DecodeRLP(s *rlp.Stream) error {\n\tif err := s.Decode((*net.IP)(v)); err != nil {\n\t\treturn err\n\t}\n\tif len(*v) != 4 && len(*v) != 16 {\n\t\treturn fmt.Errorf(\"invalid IP address, want 4 or 16 bytes: %v\", *v)\n\t}\n\treturn nil\n}\n\n// Secp256k1 is the \"secp256k1\" key, which holds a public key.\ntype Secp256k1 ecdsa.PublicKey\n\nfunc (v Secp256k1) ENRKey() string { return \"secp256k1\" }\n\n// EncodeRLP implements rlp.Encoder.\nfunc (v Secp256k1) EncodeRLP(w io.Writer) error {\n\treturn rlp.Encode(w, crypto.CompressPubkey((*ecdsa.PublicKey)(&v)))\n}\n\n// DecodeRLP implements rlp.Decoder.\nfunc (v *Secp256k1) DecodeRLP(s *rlp.Stream) error {\n\tbuf, err := s.Bytes()\n\tif err != nil {\n\t\treturn err\n\t}\n\tpk, err := crypto.DecompressPubkey(buf)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*v = (Secp256k1)(*pk)\n\treturn nil\n}\n\n// KeyError is an error related to a key.\ntype KeyError struct {\n\tKey string\n\tErr error\n}\n\n// Error implements error.\nfunc (err *KeyError) Error() string {\n\tif err.Err == errNotFound {\n\t\treturn fmt.Sprintf(\"missing ENR key %q\", err.Key)\n\t}\n\treturn fmt.Sprintf(\"ENR key %q: %v\", err.Key, err.Err)\n}\n\n// IsNotFound reports whether the given error means that a key/value pair is\n// missing from a record.\nfunc IsNotFound(err error) bool {\n\tkerr, ok := err.(*KeyError)\n\treturn ok && kerr.Err == errNotFound\n}\n"
  },
  {
    "path": "p2p/enr/idscheme.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage enr\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// Registry of known identity schemes.\nvar schemes sync.Map\n\n// An IdentityScheme is capable of verifying record signatures and\n// deriving node addresses.\ntype IdentityScheme interface {\n\tVerify(r *Record, sig []byte) error\n\tNodeAddr(r *Record) []byte\n}\n\n// RegisterIdentityScheme adds an identity scheme to the global registry.\nfunc RegisterIdentityScheme(name string, scheme IdentityScheme) {\n\tif _, loaded := schemes.LoadOrStore(name, scheme); loaded {\n\t\tpanic(\"identity scheme \" + name + \" already registered\")\n\t}\n}\n\n// FindIdentityScheme resolves name to an identity scheme in the global registry.\nfunc FindIdentityScheme(name string) IdentityScheme {\n\ts, ok := schemes.Load(name)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn s.(IdentityScheme)\n}\n\n// v4ID is the \"v4\" identity scheme.\ntype v4ID struct{}\n\nfunc init() {\n\tRegisterIdentityScheme(\"v4\", v4ID{})\n}\n\n// SignV4 signs a record using the v4 scheme.\nfunc SignV4(r *Record, privkey *ecdsa.PrivateKey) error {\n\t// Copy r to avoid modifying it if signing fails.\n\tcpy := *r\n\tcpy.Set(ID(\"v4\"))\n\tcpy.Set(Secp256k1(privkey.PublicKey))\n\n\th := sha3.NewKeccak256()\n\trlp.Encode(h, cpy.AppendElements(nil))\n\tsig, err := crypto.Sign(h.Sum(nil), privkey)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsig = sig[:len(sig)-1] // remove v\n\tif err = cpy.SetSig(\"v4\", sig); err == nil {\n\t\t*r = cpy\n\t}\n\treturn err\n}\n\n// s256raw is an unparsed secp256k1 public key entry.\ntype s256raw []byte\n\nfunc (s256raw) ENRKey() string { return \"secp256k1\" }\n\nfunc (v4ID) Verify(r *Record, sig []byte) error {\n\tvar entry s256raw\n\tif err := r.Load(&entry); err != nil {\n\t\treturn err\n\t} else if len(entry) != 33 {\n\t\treturn fmt.Errorf(\"invalid public key\")\n\t}\n\n\th := sha3.NewKeccak256()\n\trlp.Encode(h, r.AppendElements(nil))\n\tif !crypto.VerifySignature(entry, h.Sum(nil), sig) {\n\t\treturn errInvalidSig\n\t}\n\treturn nil\n}\n\nfunc (v4ID) NodeAddr(r *Record) []byte {\n\tvar pubkey Secp256k1\n\terr := r.Load(&pubkey)\n\tif err != nil {\n\t\treturn nil\n\t}\n\tbuf := make([]byte, 64)\n\tmath.ReadBits(pubkey.X, buf[:32])\n\tmath.ReadBits(pubkey.Y, buf[32:])\n\treturn crypto.Keccak256(buf)\n}\n"
  },
  {
    "path": "p2p/message.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage p2p\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// Msg defines the structure of a p2p message.\n//\n// Note that a Msg can only be sent once since the Payload reader is\n// consumed during sending. It is not possible to create a Msg and\n// send it any number of times. If you want to reuse an encoded\n// structure, encode the payload into a byte array and create a\n// separate Msg with a bytes.Reader as Payload for each send.\ntype Msg struct {\n\tCode       uint64\n\tSize       uint32 // size of the paylod\n\tPayload    io.Reader\n\tReceivedAt time.Time\n}\n\n// Decode parses the RLP content of a message into\n// the given value, which must be a pointer.\n//\n// For the decoding rules, please see package rlp.\nfunc (msg Msg) Decode(val interface{}) error {\n\ts := rlp.NewStream(msg.Payload, uint64(msg.Size))\n\tif err := s.Decode(val); err != nil {\n\t\treturn newPeerError(errInvalidMsg, \"(code %x) (size %d) %v\", msg.Code, msg.Size, err)\n\t}\n\treturn nil\n}\n\nfunc (msg Msg) String() string {\n\treturn fmt.Sprintf(\"msg #%v (%v bytes)\", msg.Code, msg.Size)\n}\n\n// Discard reads any remaining payload data into a black hole.\nfunc (msg Msg) Discard() error {\n\t_, err := io.Copy(ioutil.Discard, msg.Payload)\n\treturn err\n}\n\ntype MsgReader interface {\n\tReadMsg() (Msg, error)\n}\n\ntype MsgWriter interface {\n\t// WriteMsg sends a message. It will block until the message's\n\t// Payload has been consumed by the other end.\n\t//\n\t// Note that messages can be sent only once because their\n\t// payload reader is drained.\n\tWriteMsg(Msg) error\n}\n\n// MsgReadWriter provides reading and writing of encoded messages.\n// Implementations should ensure that ReadMsg and WriteMsg can be\n// called simultaneously from multiple goroutines.\ntype MsgReadWriter interface {\n\tMsgReader\n\tMsgWriter\n}\n\n// Send writes an RLP-encoded message with the given code.\n// data should encode as an RLP list.\nfunc Send(w MsgWriter, msgcode uint64, data interface{}) error {\n\tsize, r, err := rlp.EncodeToReader(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn w.WriteMsg(Msg{Code: msgcode, Size: uint32(size), Payload: r})\n}\n\n// SendItems writes an RLP with the given code and data elements.\n// For a call such as:\n//\n//    SendItems(w, code, e1, e2, e3)\n//\n// the message payload will be an RLP list containing the items:\n//\n//    [e1, e2, e3]\n//\nfunc SendItems(w MsgWriter, msgcode uint64, elems ...interface{}) error {\n\treturn Send(w, msgcode, elems)\n}\n\n// eofSignal wraps a reader with eof signaling. the eof channel is\n// closed when the wrapped reader returns an error or when count bytes\n// have been read.\ntype eofSignal struct {\n\twrapped io.Reader\n\tcount   uint32 // number of bytes left\n\teof     chan<- struct{}\n}\n\n// note: when using eofSignal to detect whether a message payload\n// has been read, Read might not be called for zero sized messages.\nfunc (r *eofSignal) Read(buf []byte) (int, error) {\n\tif r.count == 0 {\n\t\tif r.eof != nil {\n\t\t\tr.eof <- struct{}{}\n\t\t\tr.eof = nil\n\t\t}\n\t\treturn 0, io.EOF\n\t}\n\n\tmax := len(buf)\n\tif int(r.count) < len(buf) {\n\t\tmax = int(r.count)\n\t}\n\tn, err := r.wrapped.Read(buf[:max])\n\tr.count -= uint32(n)\n\tif (err != nil || r.count == 0) && r.eof != nil {\n\t\tr.eof <- struct{}{} // tell Peer that msg has been consumed\n\t\tr.eof = nil\n\t}\n\treturn n, err\n}\n\n// MsgPipe creates a message pipe. Reads on one end are matched\n// with writes on the other. The pipe is full-duplex, both ends\n// implement MsgReadWriter.\nfunc MsgPipe() (*MsgPipeRW, *MsgPipeRW) {\n\tvar (\n\t\tc1, c2  = make(chan Msg), make(chan Msg)\n\t\tclosing = make(chan struct{})\n\t\tclosed  = new(int32)\n\t\trw1     = &MsgPipeRW{c1, c2, closing, closed}\n\t\trw2     = &MsgPipeRW{c2, c1, closing, closed}\n\t)\n\treturn rw1, rw2\n}\n\n// ErrPipeClosed is returned from pipe operations after the\n// pipe has been closed.\nvar ErrPipeClosed = errors.New(\"p2p: read or write on closed message pipe\")\n\n// MsgPipeRW is an endpoint of a MsgReadWriter pipe.\ntype MsgPipeRW struct {\n\tw       chan<- Msg\n\tr       <-chan Msg\n\tclosing chan struct{}\n\tclosed  *int32\n}\n\n// WriteMsg sends a messsage on the pipe.\n// It blocks until the receiver has consumed the message payload.\nfunc (p *MsgPipeRW) WriteMsg(msg Msg) error {\n\tif atomic.LoadInt32(p.closed) == 0 {\n\t\tconsumed := make(chan struct{}, 1)\n\t\tmsg.Payload = &eofSignal{msg.Payload, msg.Size, consumed}\n\t\tselect {\n\t\tcase p.w <- msg:\n\t\t\tif msg.Size > 0 {\n\t\t\t\t// wait for payload read or discard\n\t\t\t\tselect {\n\t\t\t\tcase <-consumed:\n\t\t\t\tcase <-p.closing:\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\tcase <-p.closing:\n\t\t}\n\t}\n\treturn ErrPipeClosed\n}\n\n// ReadMsg returns a message sent on the other end of the pipe.\nfunc (p *MsgPipeRW) ReadMsg() (Msg, error) {\n\tif atomic.LoadInt32(p.closed) == 0 {\n\t\tselect {\n\t\tcase msg := <-p.r:\n\t\t\treturn msg, nil\n\t\tcase <-p.closing:\n\t\t}\n\t}\n\treturn Msg{}, ErrPipeClosed\n}\n\n// Close unblocks any pending ReadMsg and WriteMsg calls on both ends\n// of the pipe. They will return ErrPipeClosed. Close also\n// interrupts any reads from a message payload.\nfunc (p *MsgPipeRW) Close() error {\n\tif atomic.AddInt32(p.closed, 1) != 1 {\n\t\t// someone else is already closing\n\t\tatomic.StoreInt32(p.closed, 1) // avoid overflow\n\t\treturn nil\n\t}\n\tclose(p.closing)\n\treturn nil\n}\n\n// ExpectMsg reads a message from r and verifies that its\n// code and encoded RLP content match the provided values.\n// If content is nil, the payload is discarded and not verified.\nfunc ExpectMsg(r MsgReader, code uint64, content interface{}) error {\n\tmsg, err := r.ReadMsg()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif msg.Code != code {\n\t\treturn fmt.Errorf(\"message code mismatch: got %d, expected %d\", msg.Code, code)\n\t}\n\tif content == nil {\n\t\treturn msg.Discard()\n\t}\n\tcontentEnc, err := rlp.EncodeToBytes(content)\n\tif err != nil {\n\t\tpanic(\"content encode error: \" + err.Error())\n\t}\n\tif int(msg.Size) != len(contentEnc) {\n\t\treturn fmt.Errorf(\"message size mismatch: got %d, want %d\", msg.Size, len(contentEnc))\n\t}\n\tactualContent, err := ioutil.ReadAll(msg.Payload)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !bytes.Equal(actualContent, contentEnc) {\n\t\treturn fmt.Errorf(\"message payload mismatch:\\ngot:  %x\\nwant: %x\", actualContent, contentEnc)\n\t}\n\treturn nil\n}\n\n// msgEventer wraps a MsgReadWriter and sends events whenever a message is sent\n// or received\ntype msgEventer struct {\n\tMsgReadWriter\n\n\tfeed     *event.Feed\n\tpeerID   discover.NodeID\n\tProtocol string\n}\n\n// newMsgEventer returns a msgEventer which sends message events to the given\n// feed\nfunc newMsgEventer(rw MsgReadWriter, feed *event.Feed, peerID discover.NodeID, proto string) *msgEventer {\n\treturn &msgEventer{\n\t\tMsgReadWriter: rw,\n\t\tfeed:          feed,\n\t\tpeerID:        peerID,\n\t\tProtocol:      proto,\n\t}\n}\n\n// ReadMsg reads a message from the underlying MsgReadWriter and emits a\n// \"message received\" event\nfunc (ev *msgEventer) ReadMsg() (Msg, error) {\n\tmsg, err := ev.MsgReadWriter.ReadMsg()\n\tif err != nil {\n\t\treturn msg, err\n\t}\n\tev.feed.Send(&PeerEvent{\n\t\tType:     PeerEventTypeMsgRecv,\n\t\tPeer:     ev.peerID,\n\t\tProtocol: ev.Protocol,\n\t\tMsgCode:  &msg.Code,\n\t\tMsgSize:  &msg.Size,\n\t})\n\treturn msg, nil\n}\n\n// WriteMsg writes a message to the underlying MsgReadWriter and emits a\n// \"message sent\" event\nfunc (ev *msgEventer) WriteMsg(msg Msg) error {\n\terr := ev.MsgReadWriter.WriteMsg(msg)\n\tif err != nil {\n\t\treturn err\n\t}\n\tev.feed.Send(&PeerEvent{\n\t\tType:     PeerEventTypeMsgSend,\n\t\tPeer:     ev.peerID,\n\t\tProtocol: ev.Protocol,\n\t\tMsgCode:  &msg.Code,\n\t\tMsgSize:  &msg.Size,\n\t})\n\treturn nil\n}\n\n// Close closes the underlying MsgReadWriter if it implements the io.Closer\n// interface\nfunc (ev *msgEventer) Close() error {\n\tif v, ok := ev.MsgReadWriter.(io.Closer); ok {\n\t\treturn v.Close()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "p2p/metrics.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the meters and timers used by the networking layer.\n\npackage p2p\n\nimport (\n\t\"net\"\n\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\nvar (\n\tingressConnectMeter = metrics.NewRegisteredMeter(\"p2p/InboundConnects\", nil)\n\tingressTrafficMeter = metrics.NewRegisteredMeter(\"p2p/InboundTraffic\", nil)\n\tegressConnectMeter  = metrics.NewRegisteredMeter(\"p2p/OutboundConnects\", nil)\n\tegressTrafficMeter  = metrics.NewRegisteredMeter(\"p2p/OutboundTraffic\", nil)\n)\n\n// meteredConn is a wrapper around a net.Conn that meters both the\n// inbound and outbound network traffic.\ntype meteredConn struct {\n\tnet.Conn // Network connection to wrap with metering\n}\n\n// newMeteredConn creates a new metered connection, also bumping the ingress or\n// egress connection meter. If the metrics system is disabled, this function\n// returns the original object.\nfunc newMeteredConn(conn net.Conn, ingress bool) net.Conn {\n\t// Short circuit if metrics are disabled\n\tif !metrics.Enabled {\n\t\treturn conn\n\t}\n\t// Otherwise bump the connection counters and wrap the connection\n\tif ingress {\n\t\tingressConnectMeter.Mark(1)\n\t} else {\n\t\tegressConnectMeter.Mark(1)\n\t}\n\treturn &meteredConn{Conn: conn}\n}\n\n// Read delegates a network read to the underlying connection, bumping the ingress\n// traffic meter along the way.\nfunc (c *meteredConn) Read(b []byte) (n int, err error) {\n\tn, err = c.Conn.Read(b)\n\tingressTrafficMeter.Mark(int64(n))\n\treturn\n}\n\n// Write delegates a network write to the underlying connection, bumping the\n// egress traffic meter along the way.\nfunc (c *meteredConn) Write(b []byte) (n int, err error) {\n\tn, err = c.Conn.Write(b)\n\tegressTrafficMeter.Mark(int64(n))\n\treturn\n}\n"
  },
  {
    "path": "p2p/nat/nat.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package nat provides access to common network port mapping protocols.\npackage nat\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/jackpal/go-nat-pmp\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// An implementation of nat.Interface can map local ports to ports\n// accessible from the Internet.\ntype Interface interface {\n\t// These methods manage a mapping between a port on the local\n\t// machine to a port that can be connected to from the internet.\n\t//\n\t// protocol is \"UDP\" or \"TCP\". Some implementations allow setting\n\t// a display name for the mapping. The mapping may be removed by\n\t// the gateway when its lifetime ends.\n\tAddMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error\n\tDeleteMapping(protocol string, extport, intport int) error\n\n\t// This method should return the external (Internet-facing)\n\t// address of the gateway device.\n\tExternalIP() (net.IP, error)\n\n\t// Should return name of the method. This is used for logging.\n\tString() string\n}\n\n// Parse parses a NAT interface description.\n// The following formats are currently accepted.\n// Note that mechanism names are not case-sensitive.\n//\n//     \"\" or \"none\"         return nil\n//     \"extip:77.12.33.4\"   will assume the local machine is reachable on the given IP\n//     \"any\"                uses the first auto-detected mechanism\n//     \"upnp\"               uses the Universal Plug and Play protocol\n//     \"pmp\"                uses NAT-PMP with an auto-detected gateway address\n//     \"pmp:192.168.0.1\"    uses NAT-PMP with the given gateway address\nfunc Parse(spec string) (Interface, error) {\n\tvar (\n\t\tparts = strings.SplitN(spec, \":\", 2)\n\t\tmech  = strings.ToLower(parts[0])\n\t\tip    net.IP\n\t)\n\tif len(parts) > 1 {\n\t\tip = net.ParseIP(parts[1])\n\t\tif ip == nil {\n\t\t\treturn nil, errors.New(\"invalid IP address\")\n\t\t}\n\t}\n\tswitch mech {\n\tcase \"\", \"none\", \"off\":\n\t\treturn nil, nil\n\tcase \"any\", \"auto\", \"on\":\n\t\treturn Any(), nil\n\tcase \"extip\", \"ip\":\n\t\tif ip == nil {\n\t\t\treturn nil, errors.New(\"missing IP address\")\n\t\t}\n\t\treturn ExtIP(ip), nil\n\tcase \"upnp\":\n\t\treturn UPnP(), nil\n\tcase \"pmp\", \"natpmp\", \"nat-pmp\":\n\t\treturn PMP(ip), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown mechanism %q\", parts[0])\n\t}\n}\n\nconst (\n\tmapTimeout        = 20 * time.Minute\n\tmapUpdateInterval = 15 * time.Minute\n)\n\n// Map adds a port mapping on m and keeps it alive until c is closed.\n// This function is typically invoked in its own goroutine.\nfunc Map(m Interface, c chan struct{}, protocol string, extport, intport int, name string) {\n\tlog := log.New(\"proto\", protocol, \"extport\", extport, \"intport\", intport, \"interface\", m)\n\trefresh := time.NewTimer(mapUpdateInterval)\n\tdefer func() {\n\t\trefresh.Stop()\n\t\tlog.Debug(\"Deleting port mapping\")\n\t\tm.DeleteMapping(protocol, extport, intport)\n\t}()\n\tif err := m.AddMapping(protocol, extport, intport, name, mapTimeout); err != nil {\n\t\tlog.Debug(\"Couldn't add port mapping\", \"err\", err)\n\t} else {\n\t\tlog.Info(\"Mapped network port\")\n\t}\n\tfor {\n\t\tselect {\n\t\tcase _, ok := <-c:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\tcase <-refresh.C:\n\t\t\tlog.Trace(\"Refreshing port mapping\")\n\t\t\tif err := m.AddMapping(protocol, extport, intport, name, mapTimeout); err != nil {\n\t\t\t\tlog.Debug(\"Couldn't add port mapping\", \"err\", err)\n\t\t\t}\n\t\t\trefresh.Reset(mapUpdateInterval)\n\t\t}\n\t}\n}\n\n// ExtIP assumes that the local machine is reachable on the given\n// external IP address, and that any required ports were mapped manually.\n// Mapping operations will not return an error but won't actually do anything.\nfunc ExtIP(ip net.IP) Interface {\n\tif ip == nil {\n\t\tpanic(\"IP must not be nil\")\n\t}\n\treturn extIP(ip)\n}\n\ntype extIP net.IP\n\nfunc (n extIP) ExternalIP() (net.IP, error) { return net.IP(n), nil }\nfunc (n extIP) String() string              { return fmt.Sprintf(\"ExtIP(%v)\", net.IP(n)) }\n\n// These do nothing.\nfunc (extIP) AddMapping(string, int, int, string, time.Duration) error { return nil }\nfunc (extIP) DeleteMapping(string, int, int) error                     { return nil }\n\n// Any returns a port mapper that tries to discover any supported\n// mechanism on the local network.\nfunc Any() Interface {\n\t// TODO: attempt to discover whether the local machine has an\n\t// Internet-class address. Return ExtIP in this case.\n\treturn startautodisc(\"UPnP or NAT-PMP\", func() Interface {\n\t\tfound := make(chan Interface, 2)\n\t\tgo func() { found <- discoverUPnP() }()\n\t\tgo func() { found <- discoverPMP() }()\n\t\tfor i := 0; i < cap(found); i++ {\n\t\t\tif c := <-found; c != nil {\n\t\t\t\treturn c\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n}\n\n// UPnP returns a port mapper that uses UPnP. It will attempt to\n// discover the address of your router using UDP broadcasts.\nfunc UPnP() Interface {\n\treturn startautodisc(\"UPnP\", discoverUPnP)\n}\n\n// PMP returns a port mapper that uses NAT-PMP. The provided gateway\n// address should be the IP of your router. If the given gateway\n// address is nil, PMP will attempt to auto-discover the router.\nfunc PMP(gateway net.IP) Interface {\n\tif gateway != nil {\n\t\treturn &pmp{gw: gateway, c: natpmp.NewClient(gateway)}\n\t}\n\treturn startautodisc(\"NAT-PMP\", discoverPMP)\n}\n\n// autodisc represents a port mapping mechanism that is still being\n// auto-discovered. Calls to the Interface methods on this type will\n// wait until the discovery is done and then call the method on the\n// discovered mechanism.\n//\n// This type is useful because discovery can take a while but we\n// want return an Interface value from UPnP, PMP and Auto immediately.\ntype autodisc struct {\n\twhat string // type of interface being autodiscovered\n\tonce sync.Once\n\tdoit func() Interface\n\n\tmu    sync.Mutex\n\tfound Interface\n}\n\nfunc startautodisc(what string, doit func() Interface) Interface {\n\t// TODO: monitor network configuration and rerun doit when it changes.\n\treturn &autodisc{what: what, doit: doit}\n}\n\nfunc (n *autodisc) AddMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error {\n\tif err := n.wait(); err != nil {\n\t\treturn err\n\t}\n\treturn n.found.AddMapping(protocol, extport, intport, name, lifetime)\n}\n\nfunc (n *autodisc) DeleteMapping(protocol string, extport, intport int) error {\n\tif err := n.wait(); err != nil {\n\t\treturn err\n\t}\n\treturn n.found.DeleteMapping(protocol, extport, intport)\n}\n\nfunc (n *autodisc) ExternalIP() (net.IP, error) {\n\tif err := n.wait(); err != nil {\n\t\treturn nil, err\n\t}\n\treturn n.found.ExternalIP()\n}\n\nfunc (n *autodisc) String() string {\n\tn.mu.Lock()\n\tdefer n.mu.Unlock()\n\tif n.found == nil {\n\t\treturn n.what\n\t} else {\n\t\treturn n.found.String()\n\t}\n}\n\n// wait blocks until auto-discovery has been performed.\nfunc (n *autodisc) wait() error {\n\tn.once.Do(func() {\n\t\tn.mu.Lock()\n\t\tn.found = n.doit()\n\t\tn.mu.Unlock()\n\t})\n\tif n.found == nil {\n\t\treturn fmt.Errorf(\"no %s router discovered\", n.what)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "p2p/nat/natpmp.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage nat\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/jackpal/go-nat-pmp\"\n)\n\n// natPMPClient adapts the NAT-PMP protocol implementation so it conforms to\n// the common interface.\ntype pmp struct {\n\tgw net.IP\n\tc  *natpmp.Client\n}\n\nfunc (n *pmp) String() string {\n\treturn fmt.Sprintf(\"NAT-PMP(%v)\", n.gw)\n}\n\nfunc (n *pmp) ExternalIP() (net.IP, error) {\n\tresponse, err := n.c.GetExternalAddress()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn response.ExternalIPAddress[:], nil\n}\n\nfunc (n *pmp) AddMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error {\n\tif lifetime <= 0 {\n\t\treturn fmt.Errorf(\"lifetime must not be <= 0\")\n\t}\n\t// Note order of port arguments is switched between our\n\t// AddMapping and the client's AddPortMapping.\n\t_, err := n.c.AddPortMapping(strings.ToLower(protocol), intport, extport, int(lifetime/time.Second))\n\treturn err\n}\n\nfunc (n *pmp) DeleteMapping(protocol string, extport, intport int) (err error) {\n\t// To destroy a mapping, send an add-port with an internalPort of\n\t// the internal port to destroy, an external port of zero and a\n\t// time of zero.\n\t_, err = n.c.AddPortMapping(strings.ToLower(protocol), intport, 0, 0)\n\treturn err\n}\n\nfunc discoverPMP() Interface {\n\t// run external address lookups on all potential gateways\n\tgws := potentialGateways()\n\tfound := make(chan *pmp, len(gws))\n\tfor i := range gws {\n\t\tgw := gws[i]\n\t\tgo func() {\n\t\t\tc := natpmp.NewClient(gw)\n\t\t\tif _, err := c.GetExternalAddress(); err != nil {\n\t\t\t\tfound <- nil\n\t\t\t} else {\n\t\t\t\tfound <- &pmp{gw, c}\n\t\t\t}\n\t\t}()\n\t}\n\t// return the one that responds first.\n\t// discovery needs to be quick, so we stop caring about\n\t// any responses after a very short timeout.\n\ttimeout := time.NewTimer(1 * time.Second)\n\tdefer timeout.Stop()\n\tfor range gws {\n\t\tselect {\n\t\tcase c := <-found:\n\t\t\tif c != nil {\n\t\t\t\treturn c\n\t\t\t}\n\t\tcase <-timeout.C:\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn nil\n}\n\nvar (\n\t// LAN IP ranges\n\t_, lan10, _  = net.ParseCIDR(\"10.0.0.0/8\")\n\t_, lan176, _ = net.ParseCIDR(\"172.16.0.0/12\")\n\t_, lan192, _ = net.ParseCIDR(\"192.168.0.0/16\")\n)\n\n// TODO: improve this. We currently assume that (on most networks)\n// the router is X.X.X.1 in a local LAN range.\nfunc potentialGateways() (gws []net.IP) {\n\tifaces, err := net.Interfaces()\n\tif err != nil {\n\t\treturn nil\n\t}\n\tfor _, iface := range ifaces {\n\t\tifaddrs, err := iface.Addrs()\n\t\tif err != nil {\n\t\t\treturn gws\n\t\t}\n\t\tfor _, addr := range ifaddrs {\n\t\t\tif x, ok := addr.(*net.IPNet); ok {\n\t\t\t\tif lan10.Contains(x.IP) || lan176.Contains(x.IP) || lan192.Contains(x.IP) {\n\t\t\t\t\tip := x.IP.Mask(x.Mask).To4()\n\t\t\t\t\tif ip != nil {\n\t\t\t\t\t\tip[3] = ip[3] | 0x01\n\t\t\t\t\t\tgws = append(gws, ip)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn gws\n}\n"
  },
  {
    "path": "p2p/nat/natupnp.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage nat\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/huin/goupnp\"\n\t\"github.com/huin/goupnp/dcps/internetgateway1\"\n\t\"github.com/huin/goupnp/dcps/internetgateway2\"\n)\n\nconst soapRequestTimeout = 3 * time.Second\n\ntype upnp struct {\n\tdev     *goupnp.RootDevice\n\tservice string\n\tclient  upnpClient\n}\n\ntype upnpClient interface {\n\tGetExternalIPAddress() (string, error)\n\tAddPortMapping(string, uint16, string, uint16, string, bool, string, uint32) error\n\tDeletePortMapping(string, uint16, string) error\n\tGetNATRSIPStatus() (sip bool, nat bool, err error)\n}\n\nfunc (n *upnp) ExternalIP() (addr net.IP, err error) {\n\tipString, err := n.client.GetExternalIPAddress()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tip := net.ParseIP(ipString)\n\tif ip == nil {\n\t\treturn nil, errors.New(\"bad IP in response\")\n\t}\n\treturn ip, nil\n}\n\nfunc (n *upnp) AddMapping(protocol string, extport, intport int, desc string, lifetime time.Duration) error {\n\tip, err := n.internalAddress()\n\tif err != nil {\n\t\treturn nil\n\t}\n\tprotocol = strings.ToUpper(protocol)\n\tlifetimeS := uint32(lifetime / time.Second)\n\tn.DeleteMapping(protocol, extport, intport)\n\treturn n.client.AddPortMapping(\"\", uint16(extport), protocol, uint16(intport), ip.String(), true, desc, lifetimeS)\n}\n\nfunc (n *upnp) internalAddress() (net.IP, error) {\n\tdevaddr, err := net.ResolveUDPAddr(\"udp4\", n.dev.URLBase.Host)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tifaces, err := net.Interfaces()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, iface := range ifaces {\n\t\taddrs, err := iface.Addrs()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, addr := range addrs {\n\t\t\tif x, ok := addr.(*net.IPNet); ok && x.Contains(devaddr.IP) {\n\t\t\t\treturn x.IP, nil\n\t\t\t}\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"could not find local address in same net as %v\", devaddr)\n}\n\nfunc (n *upnp) DeleteMapping(protocol string, extport, intport int) error {\n\treturn n.client.DeletePortMapping(\"\", uint16(extport), strings.ToUpper(protocol))\n}\n\nfunc (n *upnp) String() string {\n\treturn \"UPNP \" + n.service\n}\n\n// discoverUPnP searches for Internet Gateway Devices\n// and returns the first one it can find on the local network.\nfunc discoverUPnP() Interface {\n\tfound := make(chan *upnp, 2)\n\t// IGDv1\n\tgo discover(found, internetgateway1.URN_WANConnectionDevice_1, func(dev *goupnp.RootDevice, sc goupnp.ServiceClient) *upnp {\n\t\tswitch sc.Service.ServiceType {\n\t\tcase internetgateway1.URN_WANIPConnection_1:\n\t\t\treturn &upnp{dev, \"IGDv1-IP1\", &internetgateway1.WANIPConnection1{ServiceClient: sc}}\n\t\tcase internetgateway1.URN_WANPPPConnection_1:\n\t\t\treturn &upnp{dev, \"IGDv1-PPP1\", &internetgateway1.WANPPPConnection1{ServiceClient: sc}}\n\t\t}\n\t\treturn nil\n\t})\n\t// IGDv2\n\tgo discover(found, internetgateway2.URN_WANConnectionDevice_2, func(dev *goupnp.RootDevice, sc goupnp.ServiceClient) *upnp {\n\t\tswitch sc.Service.ServiceType {\n\t\tcase internetgateway2.URN_WANIPConnection_1:\n\t\t\treturn &upnp{dev, \"IGDv2-IP1\", &internetgateway2.WANIPConnection1{ServiceClient: sc}}\n\t\tcase internetgateway2.URN_WANIPConnection_2:\n\t\t\treturn &upnp{dev, \"IGDv2-IP2\", &internetgateway2.WANIPConnection2{ServiceClient: sc}}\n\t\tcase internetgateway2.URN_WANPPPConnection_1:\n\t\t\treturn &upnp{dev, \"IGDv2-PPP1\", &internetgateway2.WANPPPConnection1{ServiceClient: sc}}\n\t\t}\n\t\treturn nil\n\t})\n\tfor i := 0; i < cap(found); i++ {\n\t\tif c := <-found; c != nil {\n\t\t\treturn c\n\t\t}\n\t}\n\treturn nil\n}\n\n// finds devices matching the given target and calls matcher for all\n// advertised services of each device. The first non-nil service found\n// is sent into out. If no service matched, nil is sent.\nfunc discover(out chan<- *upnp, target string, matcher func(*goupnp.RootDevice, goupnp.ServiceClient) *upnp) {\n\tdevs, err := goupnp.DiscoverDevices(target)\n\tif err != nil {\n\t\tout <- nil\n\t\treturn\n\t}\n\tfound := false\n\tfor i := 0; i < len(devs) && !found; i++ {\n\t\tif devs[i].Root == nil {\n\t\t\tcontinue\n\t\t}\n\t\tdevs[i].Root.Device.VisitServices(func(service *goupnp.Service) {\n\t\t\tif found {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// check for a matching IGD service\n\t\t\tsc := goupnp.ServiceClient{\n\t\t\t\tSOAPClient: service.NewSOAPClient(),\n\t\t\t\tRootDevice: devs[i].Root,\n\t\t\t\tLocation:   devs[i].Location,\n\t\t\t\tService:    service,\n\t\t\t}\n\t\t\tsc.SOAPClient.HTTPClient.Timeout = soapRequestTimeout\n\t\t\tupnp := matcher(devs[i].Root, sc)\n\t\t\tif upnp == nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// check whether port mapping is enabled\n\t\t\tif _, nat, err := upnp.client.GetNATRSIPStatus(); err != nil || !nat {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tout <- upnp\n\t\t\tfound = true\n\t\t})\n\t}\n\tif !found {\n\t\tout <- nil\n\t}\n}\n"
  },
  {
    "path": "p2p/netutil/error.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage netutil\n\n// IsTemporaryError checks whether the given error should be considered temporary.\nfunc IsTemporaryError(err error) bool {\n\ttempErr, ok := err.(interface {\n\t\tTemporary() bool\n\t})\n\treturn ok && tempErr.Temporary() || isPacketTooBig(err)\n}\n"
  },
  {
    "path": "p2p/netutil/net.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package netutil contains extensions to the net package.\npackage netutil\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"sort\"\n\t\"strings\"\n)\n\nvar lan4, lan6, special4, special6 Netlist\n\nfunc init() {\n\t// Lists from RFC 5735, RFC 5156,\n\t// https://www.iana.org/assignments/iana-ipv4-special-registry/\n\tlan4.Add(\"0.0.0.0/8\")              // \"This\" network\n\tlan4.Add(\"10.0.0.0/8\")             // Private Use\n\tlan4.Add(\"172.16.0.0/12\")          // Private Use\n\tlan4.Add(\"192.168.0.0/16\")         // Private Use\n\tlan6.Add(\"fe80::/10\")              // Link-Local\n\tlan6.Add(\"fc00::/7\")               // Unique-Local\n\tspecial4.Add(\"192.0.0.0/29\")       // IPv4 Service Continuity\n\tspecial4.Add(\"192.0.0.9/32\")       // PCP Anycast\n\tspecial4.Add(\"192.0.0.170/32\")     // NAT64/DNS64 Discovery\n\tspecial4.Add(\"192.0.0.171/32\")     // NAT64/DNS64 Discovery\n\tspecial4.Add(\"192.0.2.0/24\")       // TEST-NET-1\n\tspecial4.Add(\"192.31.196.0/24\")    // AS112\n\tspecial4.Add(\"192.52.193.0/24\")    // AMT\n\tspecial4.Add(\"192.88.99.0/24\")     // 6to4 Relay Anycast\n\tspecial4.Add(\"192.175.48.0/24\")    // AS112\n\tspecial4.Add(\"198.18.0.0/15\")      // Device Benchmark Testing\n\tspecial4.Add(\"198.51.100.0/24\")    // TEST-NET-2\n\tspecial4.Add(\"203.0.113.0/24\")     // TEST-NET-3\n\tspecial4.Add(\"255.255.255.255/32\") // Limited Broadcast\n\n\t// http://www.iana.org/assignments/iana-ipv6-special-registry/\n\tspecial6.Add(\"100::/64\")\n\tspecial6.Add(\"2001::/32\")\n\tspecial6.Add(\"2001:1::1/128\")\n\tspecial6.Add(\"2001:2::/48\")\n\tspecial6.Add(\"2001:3::/32\")\n\tspecial6.Add(\"2001:4:112::/48\")\n\tspecial6.Add(\"2001:5::/32\")\n\tspecial6.Add(\"2001:10::/28\")\n\tspecial6.Add(\"2001:20::/28\")\n\tspecial6.Add(\"2001:db8::/32\")\n\tspecial6.Add(\"2002::/16\")\n}\n\n// Netlist is a list of IP networks.\ntype Netlist []net.IPNet\n\n// ParseNetlist parses a comma-separated list of CIDR masks.\n// Whitespace and extra commas are ignored.\nfunc ParseNetlist(s string) (*Netlist, error) {\n\tws := strings.NewReplacer(\" \", \"\", \"\\n\", \"\", \"\\t\", \"\")\n\tmasks := strings.Split(ws.Replace(s), \",\")\n\tl := make(Netlist, 0)\n\tfor _, mask := range masks {\n\t\tif mask == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\t_, n, err := net.ParseCIDR(mask)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tl = append(l, *n)\n\t}\n\treturn &l, nil\n}\n\n// MarshalTOML implements toml.MarshalerRec.\nfunc (l Netlist) MarshalTOML() interface{} {\n\tlist := make([]string, 0, len(l))\n\tfor _, net := range l {\n\t\tlist = append(list, net.String())\n\t}\n\treturn list\n}\n\n// UnmarshalTOML implements toml.UnmarshalerRec.\nfunc (l *Netlist) UnmarshalTOML(fn func(interface{}) error) error {\n\tvar masks []string\n\tif err := fn(&masks); err != nil {\n\t\treturn err\n\t}\n\tfor _, mask := range masks {\n\t\t_, n, err := net.ParseCIDR(mask)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*l = append(*l, *n)\n\t}\n\treturn nil\n}\n\n// Add parses a CIDR mask and appends it to the list. It panics for invalid masks and is\n// intended to be used for setting up static lists.\nfunc (l *Netlist) Add(cidr string) {\n\t_, n, err := net.ParseCIDR(cidr)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t*l = append(*l, *n)\n}\n\n// Contains reports whether the given IP is contained in the list.\nfunc (l *Netlist) Contains(ip net.IP) bool {\n\tif l == nil {\n\t\treturn false\n\t}\n\tfor _, net := range *l {\n\t\tif net.Contains(ip) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// IsLAN reports whether an IP is a local network address.\nfunc IsLAN(ip net.IP) bool {\n\tif ip.IsLoopback() {\n\t\treturn true\n\t}\n\tif v4 := ip.To4(); v4 != nil {\n\t\treturn lan4.Contains(v4)\n\t}\n\treturn lan6.Contains(ip)\n}\n\n// IsSpecialNetwork reports whether an IP is located in a special-use network range\n// This includes broadcast, multicast and documentation addresses.\nfunc IsSpecialNetwork(ip net.IP) bool {\n\tif ip.IsMulticast() {\n\t\treturn true\n\t}\n\tif v4 := ip.To4(); v4 != nil {\n\t\treturn special4.Contains(v4)\n\t}\n\treturn special6.Contains(ip)\n}\n\nvar (\n\terrInvalid     = errors.New(\"invalid IP\")\n\terrUnspecified = errors.New(\"zero address\")\n\terrSpecial     = errors.New(\"special network\")\n\terrLoopback    = errors.New(\"loopback address from non-loopback host\")\n\terrLAN         = errors.New(\"LAN address from WAN host\")\n)\n\n// CheckRelayIP reports whether an IP relayed from the given sender IP\n// is a valid connection target.\n//\n// There are four rules:\n//   - Special network addresses are never valid.\n//   - Loopback addresses are OK if relayed by a loopback host.\n//   - LAN addresses are OK if relayed by a LAN host.\n//   - All other addresses are always acceptable.\nfunc CheckRelayIP(sender, addr net.IP) error {\n\tif len(addr) != net.IPv4len && len(addr) != net.IPv6len {\n\t\treturn errInvalid\n\t}\n\tif addr.IsUnspecified() {\n\t\treturn errUnspecified\n\t}\n\tif IsSpecialNetwork(addr) {\n\t\treturn errSpecial\n\t}\n\tif addr.IsLoopback() && !sender.IsLoopback() {\n\t\treturn errLoopback\n\t}\n\tif IsLAN(addr) && !IsLAN(sender) {\n\t\treturn errLAN\n\t}\n\treturn nil\n}\n\n// SameNet reports whether two IP addresses have an equal prefix of the given bit length.\nfunc SameNet(bits uint, ip, other net.IP) bool {\n\tip4, other4 := ip.To4(), other.To4()\n\tswitch {\n\tcase (ip4 == nil) != (other4 == nil):\n\t\treturn false\n\tcase ip4 != nil:\n\t\treturn sameNet(bits, ip4, other4)\n\tdefault:\n\t\treturn sameNet(bits, ip.To16(), other.To16())\n\t}\n}\n\nfunc sameNet(bits uint, ip, other net.IP) bool {\n\tnb := int(bits / 8)\n\tmask := ^byte(0xFF >> (bits % 8))\n\tif mask != 0 && nb < len(ip) && ip[nb]&mask != other[nb]&mask {\n\t\treturn false\n\t}\n\treturn nb <= len(ip) && bytes.Equal(ip[:nb], other[:nb])\n}\n\n// DistinctNetSet tracks IPs, ensuring that at most N of them\n// fall into the same network range.\ntype DistinctNetSet struct {\n\tSubnet uint // number of common prefix bits\n\tLimit  uint // maximum number of IPs in each subnet\n\n\tmembers map[string]uint\n\tbuf     net.IP\n}\n\n// Add adds an IP address to the set. It returns false (and doesn't add the IP) if the\n// number of existing IPs in the defined range exceeds the limit.\nfunc (s *DistinctNetSet) Add(ip net.IP) bool {\n\tkey := s.key(ip)\n\tn := s.members[string(key)]\n\tif n < s.Limit {\n\t\ts.members[string(key)] = n + 1\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Remove removes an IP from the set.\nfunc (s *DistinctNetSet) Remove(ip net.IP) {\n\tkey := s.key(ip)\n\tif n, ok := s.members[string(key)]; ok {\n\t\tif n == 1 {\n\t\t\tdelete(s.members, string(key))\n\t\t} else {\n\t\t\ts.members[string(key)] = n - 1\n\t\t}\n\t}\n}\n\n// Contains whether the given IP is contained in the set.\nfunc (s DistinctNetSet) Contains(ip net.IP) bool {\n\tkey := s.key(ip)\n\t_, ok := s.members[string(key)]\n\treturn ok\n}\n\n// Len returns the number of tracked IPs.\nfunc (s DistinctNetSet) Len() int {\n\tn := uint(0)\n\tfor _, i := range s.members {\n\t\tn += i\n\t}\n\treturn int(n)\n}\n\n// key encodes the map key for an address into a temporary buffer.\n//\n// The first byte of key is '4' or '6' to distinguish IPv4/IPv6 address types.\n// The remainder of the key is the IP, truncated to the number of bits.\nfunc (s *DistinctNetSet) key(ip net.IP) net.IP {\n\t// Lazily initialize storage.\n\tif s.members == nil {\n\t\ts.members = make(map[string]uint)\n\t\ts.buf = make(net.IP, 17)\n\t}\n\t// Canonicalize ip and bits.\n\ttyp := byte('6')\n\tif ip4 := ip.To4(); ip4 != nil {\n\t\ttyp, ip = '4', ip4\n\t}\n\tbits := s.Subnet\n\tif bits > uint(len(ip)*8) {\n\t\tbits = uint(len(ip) * 8)\n\t}\n\t// Encode the prefix into s.buf.\n\tnb := int(bits / 8)\n\tmask := ^byte(0xFF >> (bits % 8))\n\ts.buf[0] = typ\n\tbuf := append(s.buf[:1], ip[:nb]...)\n\tif nb < len(ip) && mask != 0 {\n\t\tbuf = append(buf, ip[nb]&mask)\n\t}\n\treturn buf\n}\n\n// String implements fmt.Stringer\nfunc (s DistinctNetSet) String() string {\n\tvar buf bytes.Buffer\n\tbuf.WriteString(\"{\")\n\tkeys := make([]string, 0, len(s.members))\n\tfor k := range s.members {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Strings(keys)\n\tfor i, k := range keys {\n\t\tvar ip net.IP\n\t\tif k[0] == '4' {\n\t\t\tip = make(net.IP, 4)\n\t\t} else {\n\t\t\tip = make(net.IP, 16)\n\t\t}\n\t\tcopy(ip, k[1:])\n\t\tfmt.Fprintf(&buf, \"%v×%d\", ip, s.members[k])\n\t\tif i != len(keys)-1 {\n\t\t\tbuf.WriteString(\" \")\n\t\t}\n\t}\n\tbuf.WriteString(\"}\")\n\treturn buf.String()\n}\n"
  },
  {
    "path": "p2p/netutil/toobig_notwindows.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n//+build !windows\n\npackage netutil\n\n// isPacketTooBig reports whether err indicates that a UDP packet didn't\n// fit the receive buffer. There is no such error on\n// non-Windows platforms.\nfunc isPacketTooBig(err error) bool {\n\treturn false\n}\n"
  },
  {
    "path": "p2p/netutil/toobig_windows.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n//+build windows\n\npackage netutil\n\nimport (\n\t\"net\"\n\t\"os\"\n\t\"syscall\"\n)\n\nconst _WSAEMSGSIZE = syscall.Errno(10040)\n\n// isPacketTooBig reports whether err indicates that a UDP packet didn't\n// fit the receive buffer. On Windows, WSARecvFrom returns\n// code WSAEMSGSIZE and no data if this happens.\nfunc isPacketTooBig(err error) bool {\n\tif opErr, ok := err.(*net.OpError); ok {\n\t\tif scErr, ok := opErr.Err.(*os.SyscallError); ok {\n\t\t\treturn scErr.Err == _WSAEMSGSIZE\n\t\t}\n\t\treturn opErr.Err == _WSAEMSGSIZE\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "p2p/peer.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage p2p\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"sort\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nvar (\n\tErrShuttingDown = errors.New(\"shutting down\")\n)\n\nconst (\n\tbaseProtocolVersion    = 5\n\tbaseProtocolLength     = uint64(16)\n\tbaseProtocolMaxMsgSize = 2 * 1024\n\n\tsnappyProtocolVersion = 5\n\n\tpingInterval = 15 * time.Second\n)\n\nconst (\n\t// devp2p message codes\n\thandshakeMsg = 0x00\n\tdiscMsg      = 0x01\n\tpingMsg      = 0x02\n\tpongMsg      = 0x03\n)\n\n// protoHandshake is the RLP structure of the protocol handshake.\ntype protoHandshake struct {\n\tVersion    uint64\n\tName       string\n\tCaps       []Cap\n\tListenPort uint64\n\tID         discover.NodeID\n\n\t// Ignore additional fields (for forward compatibility).\n\tRest []rlp.RawValue `rlp:\"tail\"`\n}\n\n// PeerEventType is the type of peer events emitted by a p2p.Server\ntype PeerEventType string\n\nconst (\n\t// PeerEventTypeAdd is the type of event emitted when a peer is added\n\t// to a p2p.Server\n\tPeerEventTypeAdd PeerEventType = \"add\"\n\n\t// PeerEventTypeDrop is the type of event emitted when a peer is\n\t// dropped from a p2p.Server\n\tPeerEventTypeDrop PeerEventType = \"drop\"\n\n\t// PeerEventTypeMsgSend is the type of event emitted when a\n\t// message is successfully sent to a peer\n\tPeerEventTypeMsgSend PeerEventType = \"msgsend\"\n\n\t// PeerEventTypeMsgRecv is the type of event emitted when a\n\t// message is received from a peer\n\tPeerEventTypeMsgRecv PeerEventType = \"msgrecv\"\n)\n\n// PeerEvent is an event emitted when peers are either added or dropped from\n// a p2p.Server or when a message is sent or received on a peer connection\ntype PeerEvent struct {\n\tType     PeerEventType   `json:\"type\"`\n\tPeer     discover.NodeID `json:\"peer\"`\n\tError    string          `json:\"error,omitempty\"`\n\tProtocol string          `json:\"protocol,omitempty\"`\n\tMsgCode  *uint64         `json:\"msg_code,omitempty\"`\n\tMsgSize  *uint32         `json:\"msg_size,omitempty\"`\n}\n\n// Peer represents a connected remote node.\ntype Peer struct {\n\trw      *conn\n\trunning map[string]*protoRW\n\tlog     log.Logger\n\tcreated mclock.AbsTime\n\n\twg       sync.WaitGroup\n\tprotoErr chan error\n\tclosed   chan struct{}\n\tdisc     chan DiscReason\n\n\t// events receives message send / receive events if set\n\tevents *event.Feed\n}\n\n// NewPeer returns a peer for testing purposes.\nfunc NewPeer(id discover.NodeID, name string, caps []Cap) *Peer {\n\tpipe, _ := net.Pipe()\n\tconn := &conn{fd: pipe, transport: nil, id: id, caps: caps, name: name}\n\tpeer := newPeer(conn, nil)\n\tclose(peer.closed) // ensures Disconnect doesn't block\n\treturn peer\n}\n\n// ID returns the node's public key.\nfunc (p *Peer) ID() discover.NodeID {\n\treturn p.rw.id\n}\n\n// Name returns the node name that the remote node advertised.\nfunc (p *Peer) Name() string {\n\treturn p.rw.name\n}\n\n// Caps returns the capabilities (supported subprotocols) of the remote peer.\nfunc (p *Peer) Caps() []Cap {\n\t// TODO: maybe return copy\n\treturn p.rw.caps\n}\n\n// RemoteAddr returns the remote address of the network connection.\nfunc (p *Peer) RemoteAddr() net.Addr {\n\treturn p.rw.fd.RemoteAddr()\n}\n\n// LocalAddr returns the local address of the network connection.\nfunc (p *Peer) LocalAddr() net.Addr {\n\treturn p.rw.fd.LocalAddr()\n}\n\n// Disconnect terminates the peer connection with the given reason.\n// It returns immediately and does not wait until the connection is closed.\nfunc (p *Peer) Disconnect(reason DiscReason) {\n\tselect {\n\tcase p.disc <- reason:\n\tcase <-p.closed:\n\t}\n}\n\n// String implements fmt.Stringer.\nfunc (p *Peer) String() string {\n\treturn fmt.Sprintf(\"Peer %x %v\", p.rw.id[:8], p.RemoteAddr())\n}\n\n// Inbound returns true if the peer is an inbound connection\nfunc (p *Peer) Inbound() bool {\n\treturn p.rw.is(inboundConn)\n}\n\nfunc newPeer(conn *conn, protocols []Protocol) *Peer {\n\tprotomap := matchProtocols(protocols, conn.caps, conn)\n\tp := &Peer{\n\t\trw:       conn,\n\t\trunning:  protomap,\n\t\tcreated:  mclock.Now(),\n\t\tdisc:     make(chan DiscReason),\n\t\tprotoErr: make(chan error, len(protomap)+1), // protocols + pingLoop\n\t\tclosed:   make(chan struct{}),\n\t\tlog:      log.New(\"id\", conn.id, \"conn\", conn.flags),\n\t}\n\treturn p\n}\n\nfunc (p *Peer) Log() log.Logger {\n\treturn p.log\n}\n\nfunc (p *Peer) run() (remoteRequested bool, err error) {\n\tvar (\n\t\twriteStart = make(chan struct{}, 1)\n\t\twriteErr   = make(chan error, 1)\n\t\treadErr    = make(chan error, 1)\n\t\treason     DiscReason // sent to the peer\n\t)\n\tp.wg.Add(2)\n\tgo p.readLoop(readErr)\n\tgo p.pingLoop()\n\n\t// Start all protocol handlers.\n\twriteStart <- struct{}{}\n\tp.startProtocols(writeStart, writeErr)\n\n\t// Wait for an error or disconnect.\nloop:\n\tfor {\n\t\tselect {\n\t\tcase err = <-writeErr:\n\t\t\t// A write finished. Allow the next write to start if\n\t\t\t// there was no error.\n\t\t\tif err != nil {\n\t\t\t\treason = DiscNetworkError\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\twriteStart <- struct{}{}\n\t\tcase err = <-readErr:\n\t\t\tif r, ok := err.(DiscReason); ok {\n\t\t\t\tremoteRequested = true\n\t\t\t\treason = r\n\t\t\t} else {\n\t\t\t\treason = DiscNetworkError\n\t\t\t}\n\t\t\tbreak loop\n\t\tcase err = <-p.protoErr:\n\t\t\treason = discReasonForError(err)\n\t\t\tbreak loop\n\t\tcase err = <-p.disc:\n\t\t\treason = discReasonForError(err)\n\t\t\tbreak loop\n\t\t}\n\t}\n\n\tclose(p.closed)\n\tp.rw.close(reason)\n\tp.wg.Wait()\n\treturn remoteRequested, err\n}\n\nfunc (p *Peer) pingLoop() {\n\tping := time.NewTimer(pingInterval)\n\tdefer p.wg.Done()\n\tdefer ping.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-ping.C:\n\t\t\tif err := SendItems(p.rw, pingMsg); err != nil {\n\t\t\t\tp.protoErr <- err\n\t\t\t\treturn\n\t\t\t}\n\t\t\tping.Reset(pingInterval)\n\t\tcase <-p.closed:\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (p *Peer) readLoop(errc chan<- error) {\n\tdefer p.wg.Done()\n\tfor {\n\t\tmsg, err := p.rw.ReadMsg()\n\t\tif err != nil {\n\t\t\terrc <- err\n\t\t\treturn\n\t\t}\n\t\tmsg.ReceivedAt = time.Now()\n\t\tif err = p.handle(msg); err != nil {\n\t\t\terrc <- err\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (p *Peer) handle(msg Msg) error {\n\tswitch {\n\tcase msg.Code == pingMsg:\n\t\tmsg.Discard()\n\t\tgo SendItems(p.rw, pongMsg)\n\tcase msg.Code == discMsg:\n\t\tvar reason [1]DiscReason\n\t\t// This is the last message. We don't need to discard or\n\t\t// check errors because, the connection will be closed after it.\n\t\trlp.Decode(msg.Payload, &reason)\n\t\treturn reason[0]\n\tcase msg.Code < baseProtocolLength:\n\t\t// ignore other base protocol messages\n\t\treturn msg.Discard()\n\tdefault:\n\t\t// it's a subprotocol message\n\t\tproto, err := p.getProto(msg.Code)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"msg code out of range: %v\", msg.Code)\n\t\t}\n\t\tselect {\n\t\tcase proto.in <- msg:\n\t\t\treturn nil\n\t\tcase <-p.closed:\n\t\t\treturn io.EOF\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc countMatchingProtocols(protocols []Protocol, caps []Cap) int {\n\tn := 0\n\tfor _, cap := range caps {\n\t\tfor _, proto := range protocols {\n\t\t\tif proto.Name == cap.Name && proto.Version == cap.Version {\n\t\t\t\tn++\n\t\t\t}\n\t\t}\n\t}\n\treturn n\n}\n\n// matchProtocols creates structures for matching named subprotocols.\nfunc matchProtocols(protocols []Protocol, caps []Cap, rw MsgReadWriter) map[string]*protoRW {\n\tsort.Sort(capsByNameAndVersion(caps))\n\toffset := baseProtocolLength\n\tresult := make(map[string]*protoRW)\n\nouter:\n\tfor _, cap := range caps {\n\t\tfor _, proto := range protocols {\n\t\t\tif proto.Name == cap.Name && proto.Version == cap.Version {\n\t\t\t\t// If an old protocol version matched, revert it\n\t\t\t\tif old := result[cap.Name]; old != nil {\n\t\t\t\t\toffset -= old.Length\n\t\t\t\t}\n\t\t\t\t// Assign the new match\n\t\t\t\tresult[cap.Name] = &protoRW{Protocol: proto, offset: offset, in: make(chan Msg), w: rw}\n\t\t\t\toffset += proto.Length\n\n\t\t\t\tcontinue outer\n\t\t\t}\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (p *Peer) startProtocols(writeStart <-chan struct{}, writeErr chan<- error) {\n\tp.wg.Add(len(p.running))\n\tfor _, proto := range p.running {\n\t\tproto := proto\n\t\tproto.closed = p.closed\n\t\tproto.wstart = writeStart\n\t\tproto.werr = writeErr\n\t\tvar rw MsgReadWriter = proto\n\t\tif p.events != nil {\n\t\t\trw = newMsgEventer(rw, p.events, p.ID(), proto.Name)\n\t\t}\n\t\tp.log.Trace(fmt.Sprintf(\"Starting protocol %s/%d\", proto.Name, proto.Version))\n\t\tgo func() {\n\t\t\terr := proto.Run(p, rw)\n\t\t\tif err == nil {\n\t\t\t\tp.log.Trace(fmt.Sprintf(\"Protocol %s/%d returned\", proto.Name, proto.Version))\n\t\t\t\terr = errProtocolReturned\n\t\t\t} else if err != io.EOF {\n\t\t\t\tp.log.Trace(fmt.Sprintf(\"Protocol %s/%d failed\", proto.Name, proto.Version), \"err\", err)\n\t\t\t}\n\t\t\tp.protoErr <- err\n\t\t\tp.wg.Done()\n\t\t}()\n\t}\n}\n\n// getProto finds the protocol responsible for handling\n// the given message code.\nfunc (p *Peer) getProto(code uint64) (*protoRW, error) {\n\tfor _, proto := range p.running {\n\t\tif code >= proto.offset && code < proto.offset+proto.Length {\n\t\t\treturn proto, nil\n\t\t}\n\t}\n\treturn nil, newPeerError(errInvalidMsgCode, \"%d\", code)\n}\n\ntype protoRW struct {\n\tProtocol\n\tin     chan Msg        // receives read messages\n\tclosed <-chan struct{} // receives when peer is shutting down\n\twstart <-chan struct{} // receives when write may start\n\twerr   chan<- error    // for write results\n\toffset uint64\n\tw      MsgWriter\n}\n\nfunc (rw *protoRW) WriteMsg(msg Msg) (err error) {\n\tif msg.Code >= rw.Length {\n\t\treturn newPeerError(errInvalidMsgCode, \"not handled\")\n\t}\n\tmsg.Code += rw.offset\n\tselect {\n\tcase <-rw.wstart:\n\t\terr = rw.w.WriteMsg(msg)\n\t\t// Report write status back to Peer.run. It will initiate\n\t\t// shutdown if the error is non-nil and unblock the next write\n\t\t// otherwise. The calling protocol code should exit for errors\n\t\t// as well but we don't want to rely on that.\n\t\trw.werr <- err\n\tcase <-rw.closed:\n\t\terr = ErrShuttingDown\n\t}\n\treturn err\n}\n\nfunc (rw *protoRW) ReadMsg() (Msg, error) {\n\tselect {\n\tcase msg := <-rw.in:\n\t\tmsg.Code -= rw.offset\n\t\treturn msg, nil\n\tcase <-rw.closed:\n\t\treturn Msg{}, io.EOF\n\t}\n}\n\n// PeerInfo represents a short summary of the information known about a connected\n// peer. Sub-protocol independent fields are contained and initialized here, with\n// protocol specifics delegated to all connected sub-protocols.\ntype PeerInfo struct {\n\tID      string   `json:\"id\"`   // Unique node identifier (also the encryption key)\n\tName    string   `json:\"name\"` // Name of the node, including client type, version, OS, custom data\n\tCaps    []string `json:\"caps\"` // Sum-protocols advertised by this particular peer\n\tNetwork struct {\n\t\tLocalAddress  string `json:\"localAddress\"`  // Local endpoint of the TCP data connection\n\t\tRemoteAddress string `json:\"remoteAddress\"` // Remote endpoint of the TCP data connection\n\t\tInbound       bool   `json:\"inbound\"`\n\t\tTrusted       bool   `json:\"trusted\"`\n\t\tStatic        bool   `json:\"static\"`\n\t} `json:\"network\"`\n\tProtocols map[string]interface{} `json:\"protocols\"` // Sub-protocol specific metadata fields\n}\n\n// Info gathers and returns a collection of metadata known about a peer.\nfunc (p *Peer) Info() *PeerInfo {\n\t// Gather the protocol capabilities\n\tvar caps []string\n\tfor _, cap := range p.Caps() {\n\t\tcaps = append(caps, cap.String())\n\t}\n\t// Assemble the generic peer metadata\n\tinfo := &PeerInfo{\n\t\tID:        p.ID().String(),\n\t\tName:      p.Name(),\n\t\tCaps:      caps,\n\t\tProtocols: make(map[string]interface{}),\n\t}\n\tinfo.Network.LocalAddress = p.LocalAddr().String()\n\tinfo.Network.RemoteAddress = p.RemoteAddr().String()\n\tinfo.Network.Inbound = p.rw.is(inboundConn)\n\tinfo.Network.Trusted = p.rw.is(trustedConn)\n\tinfo.Network.Static = p.rw.is(staticDialedConn)\n\n\t// Gather all the running protocol infos\n\tfor _, proto := range p.running {\n\t\tprotoInfo := interface{}(\"unknown\")\n\t\tif query := proto.Protocol.PeerInfo; query != nil {\n\t\t\tif metadata := query(p.ID()); metadata != nil {\n\t\t\t\tprotoInfo = metadata\n\t\t\t} else {\n\t\t\t\tprotoInfo = \"handshake\"\n\t\t\t}\n\t\t}\n\t\tinfo.Protocols[proto.Name] = protoInfo\n\t}\n\treturn info\n}\n"
  },
  {
    "path": "p2p/peer_error.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage p2p\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\nconst (\n\terrInvalidMsgCode = iota\n\terrInvalidMsg\n)\n\nvar errorToString = map[int]string{\n\terrInvalidMsgCode: \"invalid message code\",\n\terrInvalidMsg:     \"invalid message\",\n}\n\ntype peerError struct {\n\tcode    int\n\tmessage string\n}\n\nfunc newPeerError(code int, format string, v ...interface{}) *peerError {\n\tdesc, ok := errorToString[code]\n\tif !ok {\n\t\tpanic(\"invalid error code\")\n\t}\n\terr := &peerError{code, desc}\n\tif format != \"\" {\n\t\terr.message += \": \" + fmt.Sprintf(format, v...)\n\t}\n\treturn err\n}\n\nfunc (pe *peerError) Error() string {\n\treturn pe.message\n}\n\nvar errProtocolReturned = errors.New(\"protocol returned\")\n\ntype DiscReason uint\n\nconst (\n\tDiscRequested DiscReason = iota\n\tDiscNetworkError\n\tDiscProtocolError\n\tDiscUselessPeer\n\tDiscTooManyPeers\n\tDiscAlreadyConnected\n\tDiscIncompatibleVersion\n\tDiscInvalidIdentity\n\tDiscQuitting\n\tDiscUnexpectedIdentity\n\tDiscSelf\n\tDiscReadTimeout\n\tDiscSubprotocolError = 0x10\n)\n\nvar discReasonToString = [...]string{\n\tDiscRequested:           \"disconnect requested\",\n\tDiscNetworkError:        \"network error\",\n\tDiscProtocolError:       \"breach of protocol\",\n\tDiscUselessPeer:         \"useless peer\",\n\tDiscTooManyPeers:        \"too many peers\",\n\tDiscAlreadyConnected:    \"already connected\",\n\tDiscIncompatibleVersion: \"incompatible p2p protocol version\",\n\tDiscInvalidIdentity:     \"invalid node identity\",\n\tDiscQuitting:            \"client quitting\",\n\tDiscUnexpectedIdentity:  \"unexpected identity\",\n\tDiscSelf:                \"connected to self\",\n\tDiscReadTimeout:         \"read timeout\",\n\tDiscSubprotocolError:    \"subprotocol error\",\n}\n\nfunc (d DiscReason) String() string {\n\tif len(discReasonToString) < int(d) {\n\t\treturn fmt.Sprintf(\"unknown disconnect reason %d\", d)\n\t}\n\treturn discReasonToString[d]\n}\n\nfunc (d DiscReason) Error() string {\n\treturn d.String()\n}\n\nfunc discReasonForError(err error) DiscReason {\n\tif reason, ok := err.(DiscReason); ok {\n\t\treturn reason\n\t}\n\tif err == errProtocolReturned {\n\t\treturn DiscQuitting\n\t}\n\tpeerError, ok := err.(*peerError)\n\tif ok {\n\t\tswitch peerError.code {\n\t\tcase errInvalidMsgCode, errInvalidMsg:\n\t\t\treturn DiscProtocolError\n\t\tdefault:\n\t\t\treturn DiscSubprotocolError\n\t\t}\n\t}\n\treturn DiscSubprotocolError\n}\n"
  },
  {
    "path": "p2p/protocol.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage p2p\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n)\n\n// Protocol represents a P2P subprotocol implementation.\ntype Protocol struct {\n\t// Name should contain the official protocol name,\n\t// often a three-letter word.\n\tName string\n\n\t// Version should contain the version number of the protocol.\n\tVersion uint\n\n\t// Length should contain the number of message codes used\n\t// by the protocol.\n\tLength uint64\n\n\t// Run is called in a new groutine when the protocol has been\n\t// negotiated with a peer. It should read and write messages from\n\t// rw. The Payload for each message must be fully consumed.\n\t//\n\t// The peer connection is closed when Start returns. It should return\n\t// any protocol-level error (such as an I/O error) that is\n\t// encountered.\n\tRun func(peer *Peer, rw MsgReadWriter) error\n\n\t// NodeInfo is an optional helper method to retrieve protocol specific metadata\n\t// about the host node.\n\tNodeInfo func() interface{}\n\n\t// PeerInfo is an optional helper method to retrieve protocol specific metadata\n\t// about a certain peer in the network. If an info retrieval function is set,\n\t// but returns nil, it is assumed that the protocol handshake is still running.\n\tPeerInfo func(id discover.NodeID) interface{}\n}\n\nfunc (p Protocol) cap() Cap {\n\treturn Cap{p.Name, p.Version}\n}\n\n// Cap is the structure of a peer capability.\ntype Cap struct {\n\tName    string\n\tVersion uint\n}\n\nfunc (cap Cap) RlpData() interface{} {\n\treturn []interface{}{cap.Name, cap.Version}\n}\n\nfunc (cap Cap) String() string {\n\treturn fmt.Sprintf(\"%s/%d\", cap.Name, cap.Version)\n}\n\ntype capsByNameAndVersion []Cap\n\nfunc (cs capsByNameAndVersion) Len() int      { return len(cs) }\nfunc (cs capsByNameAndVersion) Swap(i, j int) { cs[i], cs[j] = cs[j], cs[i] }\nfunc (cs capsByNameAndVersion) Less(i, j int) bool {\n\treturn cs[i].Name < cs[j].Name || (cs[i].Name == cs[j].Name && cs[i].Version < cs[j].Version)\n}\n"
  },
  {
    "path": "p2p/protocols/protocol.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\nPackage protocols is an extension to p2p. It offers a user friendly simple way to define\ndevp2p subprotocols by abstracting away code standardly shared by protocols.\n\n* automate assigments of code indexes to messages\n* automate RLP decoding/encoding based on reflecting\n* provide the forever loop to read incoming messages\n* standardise error handling related to communication\n* standardised\thandshake negotiation\n* TODO: automatic generation of wire protocol specification for peers\n\n*/\npackage protocols\n\nimport (\n\t//\"bufio\"\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t//\"github.com/sero-cash/go-sero/swarm/spancontext\"\n\t//\"github.com/sero-cash/go-sero/swarm/tracing\"\n\t//opentracing \"github.com/opentracing/opentracing-go\"\n)\n\n// error codes used by this  protocol scheme\nconst (\n\tErrMsgTooLong = iota\n\tErrDecode\n\tErrWrite\n\tErrInvalidMsgCode\n\tErrInvalidMsgType\n\tErrHandshake\n\tErrNoHandler\n\tErrHandler\n)\n\n// error description strings associated with the codes\nvar errorToString = map[int]string{\n\tErrMsgTooLong:     \"Message too long\",\n\tErrDecode:         \"Invalid message (RLP error)\",\n\tErrWrite:          \"Error sending message\",\n\tErrInvalidMsgCode: \"Invalid message code\",\n\tErrInvalidMsgType: \"Invalid message type\",\n\tErrHandshake:      \"Handshake error\",\n\tErrNoHandler:      \"No handler registered error\",\n\tErrHandler:        \"Message handler error\",\n}\n\n/*\nError implements the standard go error interface.\nUse:\n\n  errorf(code, format, params ...interface{})\n\nPrints as:\n\n <description>: <details>\n\nwhere description is given by code in errorToString\nand details is fmt.Sprintf(format, params...)\n\nexported field Code can be checked\n*/\ntype Error struct {\n\tCode    int\n\tmessage string\n\tformat  string\n\tparams  []interface{}\n}\n\nfunc (e Error) Error() (message string) {\n\tif len(e.message) == 0 {\n\t\tname, ok := errorToString[e.Code]\n\t\tif !ok {\n\t\t\tpanic(\"invalid message code\")\n\t\t}\n\t\te.message = name\n\t\tif e.format != \"\" {\n\t\t\te.message += \": \" + fmt.Sprintf(e.format, e.params...)\n\t\t}\n\t}\n\treturn e.message\n}\n\nfunc errorf(code int, format string, params ...interface{}) *Error {\n\treturn &Error{\n\t\tCode:   code,\n\t\tformat: format,\n\t\tparams: params,\n\t}\n}\n\n// WrappedMsg is used to propagate marshalled context alongside message payloads\ntype WrappedMsg struct {\n\tContext []byte\n\tSize    uint32\n\tPayload []byte\n}\n\n// Spec is a protocol specification including its name and version as well as\n// the types of messages which are exchanged\ntype Spec struct {\n\t// Name is the name of the protocol, often a three-letter word\n\tName string\n\n\t// Version is the version number of the protocol\n\tVersion uint\n\n\t// MaxMsgSize is the maximum accepted length of the message payload\n\tMaxMsgSize uint32\n\n\t// Messages is a list of message data types which this protocol uses, with\n\t// each message type being sent with its array index as the code (so\n\t// [&foo{}, &bar{}, &baz{}] would send foo, bar and baz with codes\n\t// 0, 1 and 2 respectively)\n\t// each message must have a single unique data type\n\tMessages []interface{}\n\n\tinitOnce sync.Once\n\tcodes    map[reflect.Type]uint64\n\ttypes    map[uint64]reflect.Type\n}\n\nfunc (s *Spec) init() {\n\ts.initOnce.Do(func() {\n\t\ts.codes = make(map[reflect.Type]uint64, len(s.Messages))\n\t\ts.types = make(map[uint64]reflect.Type, len(s.Messages))\n\t\tfor i, msg := range s.Messages {\n\t\t\tcode := uint64(i)\n\t\t\ttyp := reflect.TypeOf(msg)\n\t\t\tif typ.Kind() == reflect.Ptr {\n\t\t\t\ttyp = typ.Elem()\n\t\t\t}\n\t\t\ts.codes[typ] = code\n\t\t\ts.types[code] = typ\n\t\t}\n\t})\n}\n\n// Length returns the number of message types in the protocol\nfunc (s *Spec) Length() uint64 {\n\treturn uint64(len(s.Messages))\n}\n\n// GetCode returns the message code of a type, and boolean second argument is\n// false if the message type is not found\nfunc (s *Spec) GetCode(msg interface{}) (uint64, bool) {\n\ts.init()\n\ttyp := reflect.TypeOf(msg)\n\tif typ.Kind() == reflect.Ptr {\n\t\ttyp = typ.Elem()\n\t}\n\tcode, ok := s.codes[typ]\n\treturn code, ok\n}\n\n// NewMsg construct a new message type given the code\nfunc (s *Spec) NewMsg(code uint64) (interface{}, bool) {\n\ts.init()\n\ttyp, ok := s.types[code]\n\tif !ok {\n\t\treturn nil, false\n\t}\n\treturn reflect.New(typ).Interface(), true\n}\n\n// Peer represents a remote peer or protocol instance that is running on a peer connection with\n// a remote peer\ntype Peer struct {\n\t*p2p.Peer                   // the p2p.Peer object representing the remote\n\trw        p2p.MsgReadWriter // p2p.MsgReadWriter to send messages to and read messages from\n\tspec      *Spec\n}\n\n// NewPeer constructs a new peer\n// this constructor is called by the p2p.Protocol#Run function\n// the first two arguments are the arguments passed to p2p.Protocol.Run function\n// the third argument is the Spec describing the protocol\nfunc NewPeer(p *p2p.Peer, rw p2p.MsgReadWriter, spec *Spec) *Peer {\n\treturn &Peer{\n\t\tPeer: p,\n\t\trw:   rw,\n\t\tspec: spec,\n\t}\n}\n\n// Run starts the forever loop that handles incoming messages\n// called within the p2p.Protocol#Run function\n// the handler argument is a function which is called for each message received\n// from the remote peer, a returned error causes the loop to exit\n// resulting in disconnection\nfunc (p *Peer) Run(handler func(ctx context.Context, msg interface{}) error) error {\n\tfor {\n\t\tif err := p.handleIncoming(handler); err != nil {\n\t\t\tif err != io.EOF {\n\t\t\t\tmetrics.GetOrRegisterCounter(\"peer.handleincoming.error\", nil).Inc(1)\n\t\t\t\tlog.Error(\"peer.handleIncoming\", \"err\", err)\n\t\t\t}\n\n\t\t\treturn err\n\t\t}\n\t}\n}\n\n// Drop disconnects a peer.\n// TODO: may need to implement protocol drop only? don't want to kick off the peer\n// if they are useful for other protocols\nfunc (p *Peer) Drop(err error) {\n\tp.Disconnect(p2p.DiscSubprotocolError)\n}\n\n// Send takes a message, encodes it in RLP, finds the right message code and sends the\n// message off to the peer\n// this low level call will be wrapped by libraries providing routed or broadcast sends\n// but often just used to forward and push messages to directly connected peers\nfunc (p *Peer) Send(ctx context.Context, msg interface{}) error {\n\tdefer metrics.GetOrRegisterResettingTimer(\"peer.send_t\", nil).UpdateSince(time.Now())\n\tmetrics.GetOrRegisterCounter(\"peer.send\", nil).Inc(1)\n\n\tvar b bytes.Buffer\n\t//if tracing.Enabled {\n\t//\twriter := bufio.NewWriter(&b)\n\t//\n\t//\ttracer := opentracing.GlobalTracer()\n\t//\n\t//\tsctx := spancontext.FromContext(ctx)\n\t//\n\t//\tif sctx != nil {\n\t//\t\terr := tracer.Inject(\n\t//\t\t\tsctx,\n\t//\t\t\topentracing.Binary,\n\t//\t\t\twriter)\n\t//\t\tif err != nil {\n\t//\t\t\treturn err\n\t//\t\t}\n\t//\t}\n\t//\n\t//\twriter.Flush()\n\t//}\n\n\tr, err := rlp.EncodeToBytes(msg)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\twmsg := WrappedMsg{\n\t\tContext: b.Bytes(),\n\t\tSize:    uint32(len(r)),\n\t\tPayload: r,\n\t}\n\n\tcode, found := p.spec.GetCode(msg)\n\tif !found {\n\t\treturn errorf(ErrInvalidMsgType, \"%v\", code)\n\t}\n\treturn p2p.Send(p.rw, code, wmsg)\n}\n\n// handleIncoming(code)\n// is called each cycle of the main forever loop that dispatches incoming messages\n// if this returns an error the loop returns and the peer is disconnected with the error\n// this generic handler\n// * checks message size,\n// * checks for out-of-range message codes,\n// * handles decoding with reflection,\n// * call handlers as callbacks\nfunc (p *Peer) handleIncoming(handle func(ctx context.Context, msg interface{}) error) error {\n\tmsg, err := p.rw.ReadMsg()\n\tif err != nil {\n\t\treturn err\n\t}\n\t// make sure that the payload has been fully consumed\n\tdefer msg.Discard()\n\n\tif msg.Size > p.spec.MaxMsgSize {\n\t\treturn errorf(ErrMsgTooLong, \"%v > %v\", msg.Size, p.spec.MaxMsgSize)\n\t}\n\n\t// unmarshal wrapped msg, which might contain context\n\tvar wmsg WrappedMsg\n\terr = msg.Decode(&wmsg)\n\tif err != nil {\n\t\tlog.Error(err.Error())\n\t\treturn err\n\t}\n\n\tctx := context.Background()\n\n\t//// if tracing is enabled and the context coming within the request is\n\t//// not empty, try to unmarshal it\n\t//if tracing.Enabled && len(wmsg.Context) > 0 {\n\t//\tvar sctx opentracing.SpanContext\n\t//\n\t//\ttracer := opentracing.GlobalTracer()\n\t//\tsctx, err = tracer.Extract(\n\t//\t\topentracing.Binary,\n\t//\t\tbytes.NewReader(wmsg.Context))\n\t//\tif err != nil {\n\t//\t\tlog.Error(err.Error())\n\t//\t\treturn err\n\t//\t}\n\t//\n\t//\tctx = spancontext.WithContext(ctx, sctx)\n\t//}\n\n\tval, ok := p.spec.NewMsg(msg.Code)\n\tif !ok {\n\t\treturn errorf(ErrInvalidMsgCode, \"%v\", msg.Code)\n\t}\n\tif err := rlp.DecodeBytes(wmsg.Payload, val); err != nil {\n\t\treturn errorf(ErrDecode, \"<= %v: %v\", msg, err)\n\t}\n\n\t// call the registered handler callbacks\n\t// a registered callback take the decoded message as argument as an interface\n\t// which the handler is supposed to cast to the appropriate type\n\t// it is entirely safe not to check the cast in the handler since the handler is\n\t// chosen based on the proper type in the first place\n\tif err := handle(ctx, val); err != nil {\n\t\treturn errorf(ErrHandler, \"(msg code %v): %v\", msg.Code, err)\n\t}\n\treturn nil\n}\n\n// Handshake negotiates a handshake on the peer connection\n// * arguments\n//   * context\n//   * the local handshake to be sent to the remote peer\n//   * funcion to be called on the remote handshake (can be nil)\n// * expects a remote handshake back of the same type\n// * the dialing peer needs to send the handshake first and then waits for remote\n// * the listening peer waits for the remote handshake and then sends it\n// returns the remote handshake and an error\nfunc (p *Peer) Handshake(ctx context.Context, hs interface{}, verify func(interface{}) error) (rhs interface{}, err error) {\n\tif _, ok := p.spec.GetCode(hs); !ok {\n\t\treturn nil, errorf(ErrHandshake, \"unknown handshake message type: %T\", hs)\n\t}\n\terrc := make(chan error, 2)\n\thandle := func(ctx context.Context, msg interface{}) error {\n\t\trhs = msg\n\t\tif verify != nil {\n\t\t\treturn verify(rhs)\n\t\t}\n\t\treturn nil\n\t}\n\tsend := func() { errc <- p.Send(ctx, hs) }\n\treceive := func() { errc <- p.handleIncoming(handle) }\n\n\tgo func() {\n\t\tif p.Inbound() {\n\t\t\treceive()\n\t\t\tsend()\n\t\t} else {\n\t\t\tsend()\n\t\t\treceive()\n\t\t}\n\t}()\n\n\tfor i := 0; i < 2; i++ {\n\t\tselect {\n\t\tcase err = <-errc:\n\t\tcase <-ctx.Done():\n\t\t\terr = ctx.Err()\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, errorf(ErrHandshake, err.Error())\n\t\t}\n\t}\n\treturn rhs, nil\n}\n"
  },
  {
    "path": "p2p/rlpx.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage p2p\n\nimport (\n\t\"bytes\"\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/hmac\"\n\t\"crypto/rand\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"io/ioutil\"\n\tmrand \"math/rand\"\n\t\"net\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/golang/snappy\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/crypto/ecies\"\n\t\"github.com/sero-cash/go-sero/crypto/secp256k1\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nconst (\n\tmaxUint24 = ^uint32(0) >> 8\n\n\tsskLen = 16 // ecies.MaxSharedKeyLength(pubKey) / 2\n\tsigLen = 65 // elliptic S256\n\tpubLen = 64 // 512 bit pubkey in uncompressed representation without format byte\n\tshaLen = 32 // hash length (for nonce etc)\n\n\tauthMsgLen  = sigLen + shaLen + pubLen + shaLen + 1\n\tauthRespLen = pubLen + shaLen + 1\n\n\teciesOverhead = 65 /* pubkey */ + 16 /* IV */ + 32 /* MAC */\n\n\tencAuthMsgLen  = authMsgLen + eciesOverhead  // size of encrypted pre-EIP-8 initiator handshake\n\tencAuthRespLen = authRespLen + eciesOverhead // size of encrypted pre-EIP-8 handshake reply\n\n\t// total timeout for encryption handshake and protocol\n\t// handshake in both directions.\n\thandshakeTimeout = 5 * time.Second\n\n\t// This is the timeout for sending the disconnect reason.\n\t// This is shorter than the usual timeout because we don't want\n\t// to wait if the connection is known to be bad anyway.\n\tdiscWriteTimeout = 1 * time.Second\n)\n\n// errPlainMessageTooLarge is returned if a decompressed message length exceeds\n// the allowed 24 bits (i.e. length >= 16MB).\nvar errPlainMessageTooLarge = errors.New(\"message length >= 16MB\")\n\n// rlpx is the transport protocol used by actual (non-test) connections.\n// It wraps the frame encoder with locks and read/write deadlines.\ntype rlpx struct {\n\tfd net.Conn\n\n\trmu, wmu sync.Mutex\n\trw       *rlpxFrameRW\n}\n\nfunc newRLPX(fd net.Conn) transport {\n\tfd.SetDeadline(time.Now().Add(handshakeTimeout))\n\treturn &rlpx{fd: fd}\n}\n\nfunc (t *rlpx) ReadMsg() (Msg, error) {\n\tt.rmu.Lock()\n\tdefer t.rmu.Unlock()\n\tt.fd.SetReadDeadline(time.Now().Add(frameReadTimeout))\n\treturn t.rw.ReadMsg()\n}\n\nfunc (t *rlpx) WriteMsg(msg Msg) error {\n\tt.wmu.Lock()\n\tdefer t.wmu.Unlock()\n\tt.fd.SetWriteDeadline(time.Now().Add(frameWriteTimeout))\n\treturn t.rw.WriteMsg(msg)\n}\n\nfunc (t *rlpx) close(err error) {\n\tt.wmu.Lock()\n\tdefer t.wmu.Unlock()\n\t// Tell the remote end why we're disconnecting if possible.\n\tif t.rw != nil {\n\t\tif r, ok := err.(DiscReason); ok && r != DiscNetworkError {\n\t\t\t// rlpx tries to send DiscReason to disconnected peer\n\t\t\t// if the connection is net.Pipe (in-memory simulation)\n\t\t\t// it hangs forever, since net.Pipe does not implement\n\t\t\t// a write deadline. Because of this only try to send\n\t\t\t// the disconnect reason message if there is no error.\n\t\t\tif err := t.fd.SetWriteDeadline(time.Now().Add(discWriteTimeout)); err == nil {\n\t\t\t\tSendItems(t.rw, discMsg, r)\n\t\t\t}\n\t\t}\n\t}\n\tt.fd.Close()\n}\n\nfunc (t *rlpx) doProtoHandshake(our *protoHandshake) (their *protoHandshake, err error) {\n\t// Writing our handshake happens concurrently, we prefer\n\t// returning the handshake read error. If the remote side\n\t// disconnects us early with a valid reason, we should return it\n\t// as the error so it can be tracked elsewhere.\n\twerr := make(chan error, 1)\n\tgo func() { werr <- Send(t.rw, handshakeMsg, our) }()\n\tif their, err = readProtocolHandshake(t.rw, our); err != nil {\n\t\t<-werr // make sure the write terminates too\n\t\treturn nil, err\n\t}\n\tif err := <-werr; err != nil {\n\t\treturn nil, fmt.Errorf(\"write error: %v\", err)\n\t}\n\t// If the protocol version supports Snappy encoding, upgrade immediately\n\tt.rw.snappy = their.Version >= snappyProtocolVersion\n\n\treturn their, nil\n}\n\nfunc readProtocolHandshake(rw MsgReader, our *protoHandshake) (*protoHandshake, error) {\n\tmsg, err := rw.ReadMsg()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif msg.Size > baseProtocolMaxMsgSize {\n\t\treturn nil, fmt.Errorf(\"message too big\")\n\t}\n\tif msg.Code == discMsg {\n\t\t// Disconnect before protocol handshake is valid according to the\n\t\t// spec and we send it ourself if the posthanshake checks fail.\n\t\t// We can't return the reason directly, though, because it is echoed\n\t\t// back otherwise. Wrap it in a string instead.\n\t\tvar reason [1]DiscReason\n\t\trlp.Decode(msg.Payload, &reason)\n\t\treturn nil, reason[0]\n\t}\n\tif msg.Code != handshakeMsg {\n\t\treturn nil, fmt.Errorf(\"expected handshake, got %x\", msg.Code)\n\t}\n\tvar hs protoHandshake\n\tif err := msg.Decode(&hs); err != nil {\n\t\treturn nil, err\n\t}\n\tif (hs.ID == discover.NodeID{}) {\n\t\treturn nil, DiscInvalidIdentity\n\t}\n\treturn &hs, nil\n}\n\n// doEncHandshake runs the protocol handshake using authenticated\n// messages. the protocol handshake is the first authenticated message\n// and also verifies whether the encryption handshake 'worked' and the\n// remote side actually provided the right public key.\nfunc (t *rlpx) doEncHandshake(prv *ecdsa.PrivateKey, dial *discover.Node) (discover.NodeID, error) {\n\tvar (\n\t\tsec secrets\n\t\terr error\n\t)\n\tif dial == nil {\n\t\tsec, err = receiverEncHandshake(t.fd, prv)\n\t} else {\n\t\tsec, err = initiatorEncHandshake(t.fd, prv, dial.ID)\n\t}\n\tif err != nil {\n\t\treturn discover.NodeID{}, err\n\t}\n\tt.wmu.Lock()\n\tt.rw = newRLPXFrameRW(t.fd, sec)\n\tt.wmu.Unlock()\n\treturn sec.RemoteID, nil\n}\n\n// encHandshake contains the state of the encryption handshake.\ntype encHandshake struct {\n\tinitiator bool\n\tremoteID  discover.NodeID\n\n\tremotePub            *ecies.PublicKey  // remote-pubk\n\tinitNonce, respNonce []byte            // nonce\n\trandomPrivKey        *ecies.PrivateKey // ecdhe-random\n\tremoteRandomPub      *ecies.PublicKey  // ecdhe-random-pubk\n}\n\n// secrets represents the connection secrets\n// which are negotiated during the encryption handshake.\ntype secrets struct {\n\tRemoteID              discover.NodeID\n\tAES, MAC              []byte\n\tEgressMAC, IngressMAC hash.Hash\n\tToken                 []byte\n}\n\n// RLPx v4 handshake auth (defined in EIP-8).\ntype authMsgV4 struct {\n\tgotPlain bool // whether read packet had plain format.\n\n\tSignature       [sigLen]byte\n\tInitiatorPubkey [pubLen]byte\n\tNonce           [shaLen]byte\n\tVersion         uint\n\n\t// Ignore additional fields (forward-compatibility)\n\tRest []rlp.RawValue `rlp:\"tail\"`\n}\n\n// RLPx v4 handshake response (defined in EIP-8).\ntype authRespV4 struct {\n\tRandomPubkey [pubLen]byte\n\tNonce        [shaLen]byte\n\tVersion      uint\n\n\t// Ignore additional fields (forward-compatibility)\n\tRest []rlp.RawValue `rlp:\"tail\"`\n}\n\n// secrets is called after the handshake is completed.\n// It extracts the connection secrets from the handshake values.\nfunc (h *encHandshake) secrets(auth, authResp []byte) (secrets, error) {\n\tecdheSecret, err := h.randomPrivKey.GenerateShared(h.remoteRandomPub, sskLen, sskLen)\n\tif err != nil {\n\t\treturn secrets{}, err\n\t}\n\n\t// derive base secrets from ephemeral key agreement\n\tsharedSecret := crypto.Keccak256(ecdheSecret, crypto.Keccak256(h.respNonce, h.initNonce))\n\taesSecret := crypto.Keccak256(ecdheSecret, sharedSecret)\n\ts := secrets{\n\t\tRemoteID: h.remoteID,\n\t\tAES:      aesSecret,\n\t\tMAC:      crypto.Keccak256(ecdheSecret, aesSecret),\n\t}\n\n\t// setup sha3 instances for the MACs\n\tmac1 := sha3.NewKeccak256()\n\tmac1.Write(xor(s.MAC, h.respNonce))\n\tmac1.Write(auth)\n\tmac2 := sha3.NewKeccak256()\n\tmac2.Write(xor(s.MAC, h.initNonce))\n\tmac2.Write(authResp)\n\tif h.initiator {\n\t\ts.EgressMAC, s.IngressMAC = mac1, mac2\n\t} else {\n\t\ts.EgressMAC, s.IngressMAC = mac2, mac1\n\t}\n\n\treturn s, nil\n}\n\n// staticSharedSecret returns the static shared secret, the result\n// of key agreement between the local and remote static node key.\nfunc (h *encHandshake) staticSharedSecret(prv *ecdsa.PrivateKey) ([]byte, error) {\n\treturn ecies.ImportECDSA(prv).GenerateShared(h.remotePub, sskLen, sskLen)\n}\n\n// initiatorEncHandshake negotiates a session token on conn.\n// it should be called on the dialing side of the connection.\n//\n// prv is the local client's private key.\nfunc initiatorEncHandshake(conn io.ReadWriter, prv *ecdsa.PrivateKey, remoteID discover.NodeID) (s secrets, err error) {\n\th := &encHandshake{initiator: true, remoteID: remoteID}\n\tauthMsg, err := h.makeAuthMsg(prv)\n\tif err != nil {\n\t\treturn s, err\n\t}\n\tauthPacket, err := sealEIP8(authMsg, h)\n\tif err != nil {\n\t\treturn s, err\n\t}\n\tif _, err = conn.Write(authPacket); err != nil {\n\t\treturn s, err\n\t}\n\n\tauthRespMsg := new(authRespV4)\n\tauthRespPacket, err := readHandshakeMsg(authRespMsg, encAuthRespLen, prv, conn)\n\tif err != nil {\n\t\treturn s, err\n\t}\n\tif err := h.handleAuthResp(authRespMsg); err != nil {\n\t\treturn s, err\n\t}\n\treturn h.secrets(authPacket, authRespPacket)\n}\n\n// makeAuthMsg creates the initiator handshake message.\nfunc (h *encHandshake) makeAuthMsg(prv *ecdsa.PrivateKey) (*authMsgV4, error) {\n\trpub, err := h.remoteID.Pubkey()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"bad remoteID: %v\", err)\n\t}\n\th.remotePub = ecies.ImportECDSAPublic(rpub)\n\t// Generate random initiator nonce.\n\th.initNonce = make([]byte, shaLen)\n\tif _, err := rand.Read(h.initNonce); err != nil {\n\t\treturn nil, err\n\t}\n\t// Generate random keypair to for ECDH.\n\th.randomPrivKey, err = ecies.GenerateKey(rand.Reader, crypto.S256(), nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Sign known message: static-shared-secret ^ nonce\n\ttoken, err := h.staticSharedSecret(prv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsigned := xor(token, h.initNonce)\n\tsignature, err := crypto.Sign(signed, h.randomPrivKey.ExportECDSA())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmsg := new(authMsgV4)\n\tcopy(msg.Signature[:], signature)\n\tcopy(msg.InitiatorPubkey[:], crypto.FromECDSAPub(&prv.PublicKey)[1:])\n\tcopy(msg.Nonce[:], h.initNonce)\n\tmsg.Version = 4\n\treturn msg, nil\n}\n\nfunc (h *encHandshake) handleAuthResp(msg *authRespV4) (err error) {\n\th.respNonce = msg.Nonce[:]\n\th.remoteRandomPub, err = importPublicKey(msg.RandomPubkey[:])\n\treturn err\n}\n\n// receiverEncHandshake negotiates a session token on conn.\n// it should be called on the listening side of the connection.\n//\n// prv is the local client's private key.\nfunc receiverEncHandshake(conn io.ReadWriter, prv *ecdsa.PrivateKey) (s secrets, err error) {\n\tauthMsg := new(authMsgV4)\n\tauthPacket, err := readHandshakeMsg(authMsg, encAuthMsgLen, prv, conn)\n\tif err != nil {\n\t\treturn s, err\n\t}\n\th := new(encHandshake)\n\tif err := h.handleAuthMsg(authMsg, prv); err != nil {\n\t\treturn s, err\n\t}\n\n\tauthRespMsg, err := h.makeAuthResp()\n\tif err != nil {\n\t\treturn s, err\n\t}\n\tvar authRespPacket []byte\n\tif authMsg.gotPlain {\n\t\tauthRespPacket, err = authRespMsg.sealPlain(h)\n\t} else {\n\t\tauthRespPacket, err = sealEIP8(authRespMsg, h)\n\t}\n\tif err != nil {\n\t\treturn s, err\n\t}\n\tif _, err = conn.Write(authRespPacket); err != nil {\n\t\treturn s, err\n\t}\n\treturn h.secrets(authPacket, authRespPacket)\n}\n\nfunc (h *encHandshake) handleAuthMsg(msg *authMsgV4, prv *ecdsa.PrivateKey) error {\n\t// Import the remote identity.\n\th.initNonce = msg.Nonce[:]\n\th.remoteID = msg.InitiatorPubkey\n\trpub, err := h.remoteID.Pubkey()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"bad remoteID: %#v\", err)\n\t}\n\th.remotePub = ecies.ImportECDSAPublic(rpub)\n\n\t// Generate random keypair for ECDH.\n\t// If a private key is already set, use it instead of generating one (for testing).\n\tif h.randomPrivKey == nil {\n\t\th.randomPrivKey, err = ecies.GenerateKey(rand.Reader, crypto.S256(), nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Check the signature.\n\ttoken, err := h.staticSharedSecret(prv)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsignedMsg := xor(token, h.initNonce)\n\tremoteRandomPub, err := secp256k1.RecoverPubkey(signedMsg, msg.Signature[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\th.remoteRandomPub, _ = importPublicKey(remoteRandomPub)\n\treturn nil\n}\n\nfunc (h *encHandshake) makeAuthResp() (msg *authRespV4, err error) {\n\t// Generate random nonce.\n\th.respNonce = make([]byte, shaLen)\n\tif _, err = rand.Read(h.respNonce); err != nil {\n\t\treturn nil, err\n\t}\n\n\tmsg = new(authRespV4)\n\tcopy(msg.Nonce[:], h.respNonce)\n\tcopy(msg.RandomPubkey[:], exportPubkey(&h.randomPrivKey.PublicKey))\n\tmsg.Version = 4\n\treturn msg, nil\n}\n\nfunc (msg *authMsgV4) sealPlain(h *encHandshake) ([]byte, error) {\n\tbuf := make([]byte, authMsgLen)\n\tn := copy(buf, msg.Signature[:])\n\tn += copy(buf[n:], crypto.Keccak256(exportPubkey(&h.randomPrivKey.PublicKey)))\n\tn += copy(buf[n:], msg.InitiatorPubkey[:])\n\tn += copy(buf[n:], msg.Nonce[:])\n\tbuf[n] = 0 // token-flag\n\treturn ecies.Encrypt(rand.Reader, h.remotePub, buf, nil, nil)\n}\n\nfunc (msg *authMsgV4) decodePlain(input []byte) {\n\tn := copy(msg.Signature[:], input)\n\tn += shaLen // skip sha3(initiator-ephemeral-pubk)\n\tn += copy(msg.InitiatorPubkey[:], input[n:])\n\tcopy(msg.Nonce[:], input[n:])\n\tmsg.Version = 4\n\tmsg.gotPlain = true\n}\n\nfunc (msg *authRespV4) sealPlain(hs *encHandshake) ([]byte, error) {\n\tbuf := make([]byte, authRespLen)\n\tn := copy(buf, msg.RandomPubkey[:])\n\tcopy(buf[n:], msg.Nonce[:])\n\treturn ecies.Encrypt(rand.Reader, hs.remotePub, buf, nil, nil)\n}\n\nfunc (msg *authRespV4) decodePlain(input []byte) {\n\tn := copy(msg.RandomPubkey[:], input)\n\tcopy(msg.Nonce[:], input[n:])\n\tmsg.Version = 4\n}\n\nvar padSpace = make([]byte, 300)\n\nfunc sealEIP8(msg interface{}, h *encHandshake) ([]byte, error) {\n\tbuf := new(bytes.Buffer)\n\tif err := rlp.Encode(buf, msg); err != nil {\n\t\treturn nil, err\n\t}\n\t// pad with random amount of data. the amount needs to be at least 100 bytes to make\n\t// the message distinguishable from pre-EIP-8 handshakes.\n\tpad := padSpace[:mrand.Intn(len(padSpace)-100)+100]\n\tbuf.Write(pad)\n\tprefix := make([]byte, 2)\n\tbinary.BigEndian.PutUint16(prefix, uint16(buf.Len()+eciesOverhead))\n\n\tenc, err := ecies.Encrypt(rand.Reader, h.remotePub, buf.Bytes(), nil, prefix)\n\treturn append(prefix, enc...), err\n}\n\ntype plainDecoder interface {\n\tdecodePlain([]byte)\n}\n\nfunc readHandshakeMsg(msg plainDecoder, plainSize int, prv *ecdsa.PrivateKey, r io.Reader) ([]byte, error) {\n\tbuf := make([]byte, plainSize)\n\tif _, err := io.ReadFull(r, buf); err != nil {\n\t\treturn buf, err\n\t}\n\t// Attempt decoding pre-EIP-8 \"plain\" format.\n\tkey := ecies.ImportECDSA(prv)\n\tif dec, err := key.Decrypt(buf, nil, nil); err == nil {\n\t\tmsg.decodePlain(dec)\n\t\treturn buf, nil\n\t}\n\t// Could be EIP-8 format, try that.\n\tprefix := buf[:2]\n\tsize := binary.BigEndian.Uint16(prefix)\n\tif size < uint16(plainSize) {\n\t\treturn buf, fmt.Errorf(\"size underflow, need at least %d bytes\", plainSize)\n\t}\n\tbuf = append(buf, make([]byte, size-uint16(plainSize)+2)...)\n\tif _, err := io.ReadFull(r, buf[plainSize:]); err != nil {\n\t\treturn buf, err\n\t}\n\tdec, err := key.Decrypt(buf[2:], nil, prefix)\n\tif err != nil {\n\t\treturn buf, err\n\t}\n\t// Can't use rlp.DecodeBytes here because it rejects\n\t// trailing data (forward-compatibility).\n\ts := rlp.NewStream(bytes.NewReader(dec), 0)\n\treturn buf, s.Decode(msg)\n}\n\n// importPublicKey unmarshals 512 bit public keys.\nfunc importPublicKey(pubKey []byte) (*ecies.PublicKey, error) {\n\tvar pubKey65 []byte\n\tswitch len(pubKey) {\n\tcase 64:\n\t\t// add 'uncompressed key' flag\n\t\tpubKey65 = append([]byte{0x04}, pubKey...)\n\tcase 65:\n\t\tpubKey65 = pubKey\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"invalid public key length %v (expect 64/65)\", len(pubKey))\n\t}\n\t// TODO: fewer pointless conversions\n\tpub, err := crypto.UnmarshalPubkey(pubKey65)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn ecies.ImportECDSAPublic(pub), nil\n}\n\nfunc exportPubkey(pub *ecies.PublicKey) []byte {\n\tif pub == nil {\n\t\tpanic(\"nil pubkey\")\n\t}\n\treturn elliptic.Marshal(pub.Curve, pub.X, pub.Y)[1:]\n}\n\nfunc xor(one, other []byte) (xor []byte) {\n\txor = make([]byte, len(one))\n\tfor i := 0; i < len(one); i++ {\n\t\txor[i] = one[i] ^ other[i]\n\t}\n\treturn xor\n}\n\nvar (\n\t// this is used in place of actual frame header data.\n\t// TODO: replace this when Msg contains the protocol type code.\n\tzeroHeader = []byte{0xC2, 0x80, 0x80}\n\t// sixteen zero bytes\n\tzero16 = make([]byte, 16)\n)\n\n// rlpxFrameRW implements a simplified version of RLPx framing.\n// chunked messages are not supported and all headers are equal to\n// zeroHeader.\n//\n// rlpxFrameRW is not safe for concurrent use from multiple goroutines.\ntype rlpxFrameRW struct {\n\tconn io.ReadWriter\n\tenc  cipher.Stream\n\tdec  cipher.Stream\n\n\tmacCipher  cipher.Block\n\tegressMAC  hash.Hash\n\tingressMAC hash.Hash\n\n\tsnappy bool\n}\n\nfunc newRLPXFrameRW(conn io.ReadWriter, s secrets) *rlpxFrameRW {\n\tmacc, err := aes.NewCipher(s.MAC)\n\tif err != nil {\n\t\tpanic(\"invalid MAC secret: \" + err.Error())\n\t}\n\tencc, err := aes.NewCipher(s.AES)\n\tif err != nil {\n\t\tpanic(\"invalid AES secret: \" + err.Error())\n\t}\n\t// we use an all-zeroes IV for AES because the key used\n\t// for encryption is ephemeral.\n\tiv := make([]byte, encc.BlockSize())\n\treturn &rlpxFrameRW{\n\t\tconn:       conn,\n\t\tenc:        cipher.NewCTR(encc, iv),\n\t\tdec:        cipher.NewCTR(encc, iv),\n\t\tmacCipher:  macc,\n\t\tegressMAC:  s.EgressMAC,\n\t\tingressMAC: s.IngressMAC,\n\t}\n}\n\nfunc (rw *rlpxFrameRW) WriteMsg(msg Msg) error {\n\tptype, _ := rlp.EncodeToBytes(msg.Code)\n\n\t// if snappy is enabled, compress message now\n\tif rw.snappy {\n\t\tif msg.Size > maxUint24 {\n\t\t\treturn errPlainMessageTooLarge\n\t\t}\n\t\tpayload, _ := ioutil.ReadAll(msg.Payload)\n\t\tpayload = snappy.Encode(nil, payload)\n\n\t\tmsg.Payload = bytes.NewReader(payload)\n\t\tmsg.Size = uint32(len(payload))\n\t}\n\t// write header\n\theadbuf := make([]byte, 32)\n\tfsize := uint32(len(ptype)) + msg.Size\n\tif fsize > maxUint24 {\n\t\treturn errors.New(\"message size overflows uint24\")\n\t}\n\tputInt24(fsize, headbuf) // TODO: check overflow\n\tcopy(headbuf[3:], zeroHeader)\n\trw.enc.XORKeyStream(headbuf[:16], headbuf[:16]) // first half is now encrypted\n\n\t// write header MAC\n\tcopy(headbuf[16:], updateMAC(rw.egressMAC, rw.macCipher, headbuf[:16]))\n\tif _, err := rw.conn.Write(headbuf); err != nil {\n\t\treturn err\n\t}\n\n\t// write encrypted frame, updating the egress MAC hash with\n\t// the data written to conn.\n\ttee := cipher.StreamWriter{S: rw.enc, W: io.MultiWriter(rw.conn, rw.egressMAC)}\n\tif _, err := tee.Write(ptype); err != nil {\n\t\treturn err\n\t}\n\tif _, err := io.Copy(tee, msg.Payload); err != nil {\n\t\treturn err\n\t}\n\tif padding := fsize % 16; padding > 0 {\n\t\tif _, err := tee.Write(zero16[:16-padding]); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// write frame MAC. egress MAC hash is up to date because\n\t// frame content was written to it as well.\n\tfmacseed := rw.egressMAC.Sum(nil)\n\tmac := updateMAC(rw.egressMAC, rw.macCipher, fmacseed)\n\t_, err := rw.conn.Write(mac)\n\treturn err\n}\n\nfunc (rw *rlpxFrameRW) ReadMsg() (msg Msg, err error) {\n\t// read the header\n\theadbuf := make([]byte, 32)\n\tif _, err := io.ReadFull(rw.conn, headbuf); err != nil {\n\t\treturn msg, err\n\t}\n\t// verify header mac\n\tshouldMAC := updateMAC(rw.ingressMAC, rw.macCipher, headbuf[:16])\n\tif !hmac.Equal(shouldMAC, headbuf[16:]) {\n\t\treturn msg, errors.New(\"bad header MAC\")\n\t}\n\trw.dec.XORKeyStream(headbuf[:16], headbuf[:16]) // first half is now decrypted\n\tfsize := readInt24(headbuf)\n\t// ignore protocol type for now\n\n\t// read the frame content\n\tvar rsize = fsize // frame size rounded up to 16 byte boundary\n\tif padding := fsize % 16; padding > 0 {\n\t\trsize += 16 - padding\n\t}\n\tframebuf := make([]byte, rsize)\n\tif _, err := io.ReadFull(rw.conn, framebuf); err != nil {\n\t\treturn msg, err\n\t}\n\n\t// read and validate frame MAC. we can re-use headbuf for that.\n\trw.ingressMAC.Write(framebuf)\n\tfmacseed := rw.ingressMAC.Sum(nil)\n\tif _, err := io.ReadFull(rw.conn, headbuf[:16]); err != nil {\n\t\treturn msg, err\n\t}\n\tshouldMAC = updateMAC(rw.ingressMAC, rw.macCipher, fmacseed)\n\tif !hmac.Equal(shouldMAC, headbuf[:16]) {\n\t\treturn msg, errors.New(\"bad frame MAC\")\n\t}\n\n\t// decrypt frame content\n\trw.dec.XORKeyStream(framebuf, framebuf)\n\n\t// decode message code\n\tcontent := bytes.NewReader(framebuf[:fsize])\n\tif err := rlp.Decode(content, &msg.Code); err != nil {\n\t\treturn msg, err\n\t}\n\tmsg.Size = uint32(content.Len())\n\tmsg.Payload = content\n\n\t// if snappy is enabled, verify and decompress message\n\tif rw.snappy {\n\t\tpayload, err := ioutil.ReadAll(msg.Payload)\n\t\tif err != nil {\n\t\t\treturn msg, err\n\t\t}\n\t\tsize, err := snappy.DecodedLen(payload)\n\t\tif err != nil {\n\t\t\treturn msg, err\n\t\t}\n\t\tif size > int(maxUint24) {\n\t\t\treturn msg, errPlainMessageTooLarge\n\t\t}\n\t\tpayload, err = snappy.Decode(nil, payload)\n\t\tif err != nil {\n\t\t\treturn msg, err\n\t\t}\n\t\tmsg.Size, msg.Payload = uint32(size), bytes.NewReader(payload)\n\t}\n\treturn msg, nil\n}\n\n// updateMAC reseeds the given hash with encrypted seed.\n// it returns the first 16 bytes of the hash sum after seeding.\nfunc updateMAC(mac hash.Hash, block cipher.Block, seed []byte) []byte {\n\taesbuf := make([]byte, aes.BlockSize)\n\tblock.Encrypt(aesbuf, mac.Sum(nil))\n\tfor i := range aesbuf {\n\t\taesbuf[i] ^= seed[i]\n\t}\n\tmac.Write(aesbuf)\n\treturn mac.Sum(nil)[:16]\n}\n\nfunc readInt24(b []byte) uint32 {\n\treturn uint32(b[2]) | uint32(b[1])<<8 | uint32(b[0])<<16\n}\n\nfunc putInt24(v uint32, b []byte) {\n\tb[0] = byte(v >> 16)\n\tb[1] = byte(v >> 8)\n\tb[2] = byte(v)\n}\n"
  },
  {
    "path": "p2p/server.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package p2p implements the Ethereum p2p network protocols.\npackage p2p\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/discv5\"\n\t\"github.com/sero-cash/go-sero/p2p/nat\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n)\n\nconst (\n\tdefaultDialTimeout = 15 * time.Second\n\n\t// Connectivity defaults.\n\tmaxActiveDialTasks     = 16\n\tdefaultMaxPendingPeers = 50\n\tdefaultDialRatio       = 3\n\n\t// Maximum time allowed for reading a complete message.\n\t// This is effectively the amount of time a connection can be idle.\n\tframeReadTimeout = 30 * time.Second\n\n\t// Maximum amount of time allowed for writing a complete message.\n\tframeWriteTimeout = 20 * time.Second\n)\n\nvar errServerStopped = errors.New(\"server stopped\")\n\n// Config holds Server options.\ntype Config struct {\n\t// This field must be set to a valid secp256k1 private key.\n\tPrivateKey *ecdsa.PrivateKey `toml:\"-\"`\n\n\t// MaxPeers is the maximum number of peers that can be\n\t// connected. It must be greater than zero.\n\tMaxPeers int\n\n\t// MaxPendingPeers is the maximum number of peers that can be pending in the\n\t// handshake phase, counted separately for inbound and outbound connections.\n\t// Zero defaults to preset values.\n\tMaxPendingPeers int `toml:\",omitempty\"`\n\n\t// DialRatio controls the ratio of inbound to dialed connections.\n\t// Example: a DialRatio of 2 allows 1/2 of connections to be dialed.\n\t// Setting DialRatio to zero defaults it to 3.\n\tDialRatio int `toml:\",omitempty\"`\n\n\t// NoDiscovery can be used to disable the peer discovery mechanism.\n\t// Disabling is useful for protocol debugging (manual topology).\n\tNoDiscovery bool\n\n\t// DiscoveryV5 specifies whether the new topic-discovery based V5 discovery\n\t// protocol should be started or not.\n\tDiscoveryV5 bool `toml:\",omitempty\"`\n\n\t// Name sets the node name of this server.\n\t// Use common.MakeName to create a name that follows existing conventions.\n\tName string `toml:\"-\"`\n\n\t// BootstrapNodes are used to establish connectivity\n\t// with the rest of the network.\n\tBootstrapNodes []*discover.Node\n\n\t// BootstrapNodesV5 are used to establish connectivity\n\t// with the rest of the network using the V5 discovery\n\t// protocol.\n\tBootstrapNodesV5 []*discv5.Node `toml:\",omitempty\"`\n\n\t// Static nodes are used as pre-configured connections which are always\n\t// maintained and re-connected on disconnects.\n\tStaticNodes []*discover.Node\n\n\t// Trusted nodes are used as pre-configured connections which are always\n\t// allowed to connect, even above the peer limit.\n\tTrustedNodes []*discover.Node\n\n\t// Connectivity can be restricted to certain IP networks.\n\t// If this option is set to a non-nil value, only hosts which match one of the\n\t// IP networks contained in the list are considered.\n\tNetRestrict *netutil.Netlist `toml:\",omitempty\"`\n\n\t// NodeDatabase is the path to the database containing the previously seen\n\t// live nodes in the network.\n\tNodeDatabase string `toml:\",omitempty\"`\n\n\t// Protocols should contain the protocols supported\n\t// by the server. Matching protocols are launched for\n\t// each peer.\n\tProtocols []Protocol `toml:\"-\"`\n\n\t// If ListenAddr is set to a non-nil address, the server\n\t// will listen for incoming connections.\n\t//\n\t// If the port is zero, the operating system will pick a port. The\n\t// ListenAddr field will be updated with the actual address when\n\t// the server is started.\n\tListenAddr string\n\n\t// If set to a non-nil value, the given NAT port mapper\n\t// is used to make the listening port available to the\n\t// Internet.\n\tNAT nat.Interface `toml:\",omitempty\"`\n\n\t// If Dialer is set to a non-nil value, the given Dialer\n\t// is used to dial outbound peer connections.\n\tDialer NodeDialer `toml:\"-\"`\n\n\t// If NoDial is true, the server will not dial any peers.\n\tNoDial bool `toml:\",omitempty\"`\n\n\t// If EnableMsgEvents is set then the server will emit PeerEvents\n\t// whenever a message is sent to or received from a peer\n\tEnableMsgEvents bool\n\n\t// Logger is a custom logger to use with the p2p.Server.\n\tLogger log.Logger `toml:\",omitempty\"`\n}\n\n// Server manages all peer connections.\ntype Server struct {\n\t// Config fields may not be modified while the server is running.\n\tConfig\n\n\t// Hooks for testing. These are useful because we can inhibit\n\t// the whole protocol stack.\n\tnewTransport func(net.Conn) transport\n\tnewPeerHook  func(*Peer)\n\n\tlock    sync.Mutex // protects running\n\trunning bool\n\n\tntab         discoverTable\n\tlistener     net.Listener\n\tourHandshake *protoHandshake\n\tlastLookup   time.Time\n\tDiscV5       *discv5.Network\n\n\t// These are for Peers, PeerCount (and nothing else).\n\tpeerOp     chan peerOpFunc\n\tpeerOpDone chan struct{}\n\n\tquit          chan struct{}\n\taddstatic     chan *discover.Node\n\tremovestatic  chan *discover.Node\n\taddtrusted    chan *discover.Node\n\tremovetrusted chan *discover.Node\n\tposthandshake chan *conn\n\taddpeer       chan *conn\n\tdelpeer       chan peerDrop\n\tloopWG        sync.WaitGroup // loop, listenLoop\n\tpeerFeed      event.Feed\n\tlog           log.Logger\n}\n\ntype peerOpFunc func(map[discover.NodeID]*Peer)\n\ntype peerDrop struct {\n\t*Peer\n\terr       error\n\trequested bool // true if signaled by the peer\n}\n\ntype connFlag int32\n\nconst (\n\tdynDialedConn connFlag = 1 << iota\n\tstaticDialedConn\n\tinboundConn\n\ttrustedConn\n)\n\n// conn wraps a network connection with information gathered\n// during the two handshakes.\ntype conn struct {\n\tfd net.Conn\n\ttransport\n\tflags connFlag\n\tcont  chan error      // The run loop uses cont to signal errors to SetupConn.\n\tid    discover.NodeID // valid after the encryption handshake\n\tcaps  []Cap           // valid after the protocol handshake\n\tname  string          // valid after the protocol handshake\n}\n\ntype transport interface {\n\t// The two handshakes.\n\tdoEncHandshake(prv *ecdsa.PrivateKey, dialDest *discover.Node) (discover.NodeID, error)\n\tdoProtoHandshake(our *protoHandshake) (*protoHandshake, error)\n\t// The MsgReadWriter can only be used after the encryption\n\t// handshake has completed. The code uses conn.id to track this\n\t// by setting it to a non-nil value after the encryption handshake.\n\tMsgReadWriter\n\t// transports must provide Close because we use MsgPipe in some of\n\t// the tests. Closing the actual network connection doesn't do\n\t// anything in those tests because NsgPipe doesn't use it.\n\tclose(err error)\n}\n\nfunc (c *conn) String() string {\n\ts := c.flags.String()\n\tif (c.id != discover.NodeID{}) {\n\t\ts += \" \" + c.id.String()\n\t}\n\ts += \" \" + c.fd.RemoteAddr().String()\n\treturn s\n}\n\nfunc (f connFlag) String() string {\n\ts := \"\"\n\tif f&trustedConn != 0 {\n\t\ts += \"-trusted\"\n\t}\n\tif f&dynDialedConn != 0 {\n\t\ts += \"-dyndial\"\n\t}\n\tif f&staticDialedConn != 0 {\n\t\ts += \"-staticdial\"\n\t}\n\tif f&inboundConn != 0 {\n\t\ts += \"-inbound\"\n\t}\n\tif s != \"\" {\n\t\ts = s[1:]\n\t}\n\treturn s\n}\n\nfunc (c *conn) is(f connFlag) bool {\n\tflags := connFlag(atomic.LoadInt32((*int32)(&c.flags)))\n\treturn flags&f != 0\n}\n\nfunc (c *conn) set(f connFlag, val bool) {\n\tfor {\n\t\toldFlags := connFlag(atomic.LoadInt32((*int32)(&c.flags)))\n\t\tflags := oldFlags\n\t\tif val {\n\t\t\tflags |= f\n\t\t} else {\n\t\t\tflags &= ^f\n\t\t}\n\t\tif atomic.CompareAndSwapInt32((*int32)(&c.flags), int32(oldFlags), int32(flags)) {\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Peers returns all connected peers.\nfunc (srv *Server) Peers() []*Peer {\n\tvar ps []*Peer\n\tselect {\n\t// Note: We'd love to put this function into a variable but\n\t// that seems to cause a weird compiler error in some\n\t// environments.\n\tcase srv.peerOp <- func(peers map[discover.NodeID]*Peer) {\n\t\tfor _, p := range peers {\n\t\t\tps = append(ps, p)\n\t\t}\n\t}:\n\t\t<-srv.peerOpDone\n\tcase <-srv.quit:\n\t}\n\treturn ps\n}\n\n// PeerCount returns the number of connected peers.\nfunc (srv *Server) PeerCount() int {\n\tvar count int\n\tselect {\n\tcase srv.peerOp <- func(ps map[discover.NodeID]*Peer) { count = len(ps) }:\n\t\t<-srv.peerOpDone\n\tcase <-srv.quit:\n\t}\n\treturn count\n}\n\n// AddPeer connects to the given node and maintains the connection until the\n// server is shut down. If the connection fails for any reason, the server will\n// attempt to reconnect the peer.\nfunc (srv *Server) AddPeer(node *discover.Node) {\n\tselect {\n\tcase srv.addstatic <- node:\n\tcase <-srv.quit:\n\t}\n}\n\n// RemovePeer disconnects from the given node\nfunc (srv *Server) RemovePeer(node *discover.Node) {\n\tselect {\n\tcase srv.removestatic <- node:\n\tcase <-srv.quit:\n\t}\n}\n\n// AddTrustedPeer adds the given node to a reserved whitelist which allows the\n// node to always connect, even if the slot are full.\nfunc (srv *Server) AddTrustedPeer(node *discover.Node) {\n\tselect {\n\tcase srv.addtrusted <- node:\n\tcase <-srv.quit:\n\t}\n}\n\n// RemoveTrustedPeer removes the given node from the trusted peer set.\nfunc (srv *Server) RemoveTrustedPeer(node *discover.Node) {\n\tselect {\n\tcase srv.removetrusted <- node:\n\tcase <-srv.quit:\n\t}\n}\n\n// SubscribePeers subscribes the given channel to peer events\nfunc (srv *Server) SubscribeEvents(ch chan *PeerEvent) event.Subscription {\n\treturn srv.peerFeed.Subscribe(ch)\n}\n\n// Self returns the local node's endpoint information.\nfunc (srv *Server) Self() *discover.Node {\n\tsrv.lock.Lock()\n\tdefer srv.lock.Unlock()\n\n\tif !srv.running {\n\t\treturn &discover.Node{IP: net.ParseIP(\"0.0.0.0\")}\n\t}\n\treturn srv.makeSelf(srv.listener, srv.ntab)\n}\n\nfunc (srv *Server) makeSelf(listener net.Listener, ntab discoverTable) *discover.Node {\n\t// If the server's not running, return an empty node.\n\t// If the node is running but discovery is off, manually assemble the node infos.\n\tif ntab == nil {\n\t\t// Inbound connections disabled, use zero address.\n\t\tif listener == nil {\n\t\t\treturn &discover.Node{IP: net.ParseIP(\"0.0.0.0\"), ID: discover.PubkeyID(&srv.PrivateKey.PublicKey)}\n\t\t}\n\t\t// Otherwise inject the listener address too\n\t\taddr := listener.Addr().(*net.TCPAddr)\n\t\treturn &discover.Node{\n\t\t\tID:  discover.PubkeyID(&srv.PrivateKey.PublicKey),\n\t\t\tIP:  addr.IP,\n\t\t\tTCP: uint16(addr.Port),\n\t\t}\n\t}\n\t// Otherwise return the discovery node.\n\treturn ntab.Self()\n}\n\n// Stop terminates the server and all active peer connections.\n// It blocks until all active connections have been closed.\nfunc (srv *Server) Stop() {\n\tsrv.lock.Lock()\n\tif !srv.running {\n\t\tsrv.lock.Unlock()\n\t\treturn\n\t}\n\tsrv.running = false\n\tif srv.listener != nil {\n\t\t// this unblocks listener Accept\n\t\tsrv.listener.Close()\n\t}\n\tclose(srv.quit)\n\tsrv.lock.Unlock()\n\tsrv.loopWG.Wait()\n}\n\n// sharedUDPConn implements a shared connection. Write sends messages to the underlying connection while read returns\n// messages that were found unprocessable and sent to the unhandled channel by the primary listener.\ntype sharedUDPConn struct {\n\t*net.UDPConn\n\tunhandled chan discover.ReadPacket\n}\n\n// ReadFromUDP implements discv5.conn\nfunc (s *sharedUDPConn) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) {\n\tpacket, ok := <-s.unhandled\n\tif !ok {\n\t\treturn 0, nil, fmt.Errorf(\"Connection was closed\")\n\t}\n\tl := len(packet.Data)\n\tif l > len(b) {\n\t\tl = len(b)\n\t}\n\tcopy(b[:l], packet.Data[:l])\n\treturn l, packet.Addr, nil\n}\n\n// Close implements discv5.conn\nfunc (s *sharedUDPConn) Close() error {\n\treturn nil\n}\n\n// Start starts running the server.\n// Servers can not be re-used after stopping.\nfunc (srv *Server) Start() (err error) {\n\tsrv.lock.Lock()\n\tdefer srv.lock.Unlock()\n\tif srv.running {\n\t\treturn errors.New(\"server already running\")\n\t}\n\tsrv.running = true\n\tsrv.log = srv.Config.Logger\n\tif srv.log == nil {\n\t\tsrv.log = log.New()\n\t}\n\tsrv.log.Info(\"Starting P2P networking\")\n\n\t// static fields\n\tif srv.PrivateKey == nil {\n\t\treturn fmt.Errorf(\"Server.PrivateKey must be set to a non-nil key\")\n\t}\n\tif srv.newTransport == nil {\n\t\tsrv.newTransport = newRLPX\n\t}\n\tif srv.Dialer == nil {\n\t\tsrv.Dialer = TCPDialer{&net.Dialer{Timeout: defaultDialTimeout}}\n\t}\n\tsrv.quit = make(chan struct{})\n\tsrv.addpeer = make(chan *conn)\n\tsrv.delpeer = make(chan peerDrop)\n\tsrv.posthandshake = make(chan *conn)\n\tsrv.addstatic = make(chan *discover.Node)\n\tsrv.removestatic = make(chan *discover.Node)\n\tsrv.addtrusted = make(chan *discover.Node)\n\tsrv.removetrusted = make(chan *discover.Node)\n\tsrv.peerOp = make(chan peerOpFunc)\n\tsrv.peerOpDone = make(chan struct{})\n\n\tvar (\n\t\tconn      *net.UDPConn\n\t\tsconn     *sharedUDPConn\n\t\trealaddr  *net.UDPAddr\n\t\tunhandled chan discover.ReadPacket\n\t)\n\n\tif !srv.NoDiscovery || srv.DiscoveryV5 {\n\t\taddr, err := net.ResolveUDPAddr(\"udp\", srv.ListenAddr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tconn, err = net.ListenUDP(\"udp\", addr)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trealaddr = conn.LocalAddr().(*net.UDPAddr)\n\t\tif srv.NAT != nil {\n\t\t\tif !realaddr.IP.IsLoopback() {\n\t\t\t\tgo nat.Map(srv.NAT, srv.quit, \"udp\", realaddr.Port, realaddr.Port, \"ethereum discovery\")\n\t\t\t}\n\t\t\t// TODO: react to external IP changes over time.\n\t\t\tif ext, err := srv.NAT.ExternalIP(); err == nil {\n\t\t\t\trealaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}\n\t\t\t}\n\t\t}\n\t}\n\n\tif !srv.NoDiscovery && srv.DiscoveryV5 {\n\t\tunhandled = make(chan discover.ReadPacket, 100)\n\t\tsconn = &sharedUDPConn{conn, unhandled}\n\t}\n\n\t// node table\n\tif !srv.NoDiscovery {\n\t\tcfg := discover.Config{\n\t\t\tPrivateKey:   srv.PrivateKey,\n\t\t\tAnnounceAddr: realaddr,\n\t\t\tNodeDBPath:   srv.NodeDatabase,\n\t\t\tNetRestrict:  srv.NetRestrict,\n\t\t\tBootnodes:    srv.BootstrapNodes,\n\t\t\tUnhandled:    unhandled,\n\t\t}\n\t\tntab, err := discover.ListenUDP(conn, cfg)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tsrv.ntab = ntab\n\t}\n\n\tif srv.DiscoveryV5 {\n\t\tvar (\n\t\t\tntab *discv5.Network\n\t\t\terr  error\n\t\t)\n\t\tif sconn != nil {\n\t\t\tntab, err = discv5.ListenUDP(srv.PrivateKey, sconn, realaddr, \"\", srv.NetRestrict) //srv.NodeDatabase)\n\t\t} else {\n\t\t\tntab, err = discv5.ListenUDP(srv.PrivateKey, conn, realaddr, \"\", srv.NetRestrict) //srv.NodeDatabase)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := ntab.SetFallbackNodes(srv.BootstrapNodesV5); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tsrv.DiscV5 = ntab\n\t}\n\n\tdynPeers := srv.maxDialedConns()\n\tdialer := newDialState(srv.StaticNodes, srv.BootstrapNodes, srv.ntab, dynPeers, srv.NetRestrict)\n\n\t// handshake\n\tsrv.ourHandshake = &protoHandshake{Version: baseProtocolVersion, Name: srv.Name, ID: discover.PubkeyID(&srv.PrivateKey.PublicKey)}\n\tfor _, p := range srv.Protocols {\n\t\tsrv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap())\n\t}\n\t// listen/dial\n\tif srv.ListenAddr != \"\" {\n\t\tif err := srv.startListening(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif srv.NoDial && srv.ListenAddr == \"\" {\n\t\tsrv.log.Warn(\"P2P server will be useless, neither dialing nor listening\")\n\t}\n\n\tsrv.loopWG.Add(1)\n\tgo srv.run(dialer)\n\tsrv.running = true\n\treturn nil\n}\n\nfunc (srv *Server) startListening() error {\n\t// Launch the TCP listener.\n\tlistener, err := net.Listen(\"tcp\", srv.ListenAddr)\n\tif err != nil {\n\t\treturn err\n\t}\n\tladdr := listener.Addr().(*net.TCPAddr)\n\tsrv.ListenAddr = laddr.String()\n\tsrv.listener = listener\n\tsrv.loopWG.Add(1)\n\tgo srv.listenLoop()\n\t// Map the TCP listening port if NAT is configured.\n\tif !laddr.IP.IsLoopback() && srv.NAT != nil {\n\t\tsrv.loopWG.Add(1)\n\t\tgo func() {\n\t\t\tnat.Map(srv.NAT, srv.quit, \"tcp\", laddr.Port, laddr.Port, \"ethereum p2p\")\n\t\t\tsrv.loopWG.Done()\n\t\t}()\n\t}\n\treturn nil\n}\n\ntype dialer interface {\n\tnewTasks(running int, peers map[discover.NodeID]*Peer, now time.Time) []task\n\ttaskDone(task, time.Time)\n\taddStatic(*discover.Node)\n\tremoveStatic(*discover.Node)\n}\n\nfunc (srv *Server) run(dialstate dialer) {\n\tdefer srv.loopWG.Done()\n\tvar (\n\t\tpeers        = make(map[discover.NodeID]*Peer)\n\t\tinboundCount = 0\n\t\ttrusted      = make(map[discover.NodeID]bool, len(srv.TrustedNodes))\n\t\ttaskdone     = make(chan task, maxActiveDialTasks)\n\t\trunningTasks []task\n\t\tqueuedTasks  []task // tasks that can't run yet\n\t)\n\t// Put trusted nodes into a map to speed up checks.\n\t// Trusted peers are loaded on startup and cannot be\n\t// modified while the server is running.\n\tfor _, n := range srv.TrustedNodes {\n\t\ttrusted[n.ID] = true\n\t}\n\n\t// removes t from runningTasks\n\tdelTask := func(t task) {\n\t\tfor i := range runningTasks {\n\t\t\tif runningTasks[i] == t {\n\t\t\t\trunningTasks = append(runningTasks[:i], runningTasks[i+1:]...)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\t// starts until max number of active tasks is satisfied\n\tstartTasks := func(ts []task) (rest []task) {\n\t\ti := 0\n\t\tfor ; len(runningTasks) < maxActiveDialTasks && i < len(ts); i++ {\n\t\t\tt := ts[i]\n\t\t\tsrv.log.Trace(\"New dial task\", \"task\", t)\n\t\t\tgo func() { t.Do(srv); taskdone <- t }()\n\t\t\trunningTasks = append(runningTasks, t)\n\t\t}\n\t\treturn ts[i:]\n\t}\n\tscheduleTasks := func() {\n\t\t// Start from queue first.\n\t\tqueuedTasks = append(queuedTasks[:0], startTasks(queuedTasks)...)\n\t\t// Query dialer for new tasks and start as many as possible now.\n\t\tif len(runningTasks) < maxActiveDialTasks {\n\t\t\tnt := dialstate.newTasks(len(runningTasks)+len(queuedTasks), peers, time.Now())\n\t\t\tqueuedTasks = append(queuedTasks, startTasks(nt)...)\n\t\t}\n\t}\n\nrunning:\n\tfor {\n\t\tscheduleTasks()\n\n\t\tselect {\n\t\tcase <-srv.quit:\n\t\t\t// The server was stopped. Run the cleanup logic.\n\t\t\tbreak running\n\t\tcase n := <-srv.addstatic:\n\t\t\t// This channel is used by AddPeer to add to the\n\t\t\t// ephemeral static peer list. Add it to the dialer,\n\t\t\t// it will keep the node connected.\n\t\t\tsrv.log.Trace(\"Adding static node\", \"node\", n)\n\t\t\tdialstate.addStatic(n)\n\t\tcase n := <-srv.removestatic:\n\t\t\t// This channel is used by RemovePeer to send a\n\t\t\t// disconnect request to a peer and begin the\n\t\t\t// stop keeping the node connected.\n\t\t\tsrv.log.Trace(\"Removing static node\", \"node\", n)\n\t\t\tdialstate.removeStatic(n)\n\t\t\tif p, ok := peers[n.ID]; ok {\n\t\t\t\tp.Disconnect(DiscRequested)\n\t\t\t}\n\t\tcase n := <-srv.addtrusted:\n\t\t\t// This channel is used by AddTrustedPeer to add an enode\n\t\t\t// to the trusted node set.\n\t\t\tsrv.log.Trace(\"Adding trusted node\", \"node\", n)\n\t\t\ttrusted[n.ID] = true\n\t\t\t// Mark any already-connected peer as trusted\n\t\t\tif p, ok := peers[n.ID]; ok {\n\t\t\t\tp.rw.set(trustedConn, true)\n\t\t\t}\n\t\tcase n := <-srv.removetrusted:\n\t\t\t// This channel is used by RemoveTrustedPeer to remove an enode\n\t\t\t// from the trusted node set.\n\t\t\tsrv.log.Trace(\"Removing trusted node\", \"node\", n)\n\t\t\tif _, ok := trusted[n.ID]; ok {\n\t\t\t\tdelete(trusted, n.ID)\n\t\t\t}\n\t\t\t// Unmark any already-connected peer as trusted\n\t\t\tif p, ok := peers[n.ID]; ok {\n\t\t\t\tp.rw.set(trustedConn, false)\n\t\t\t}\n\t\tcase op := <-srv.peerOp:\n\t\t\t// This channel is used by Peers and PeerCount.\n\t\t\top(peers)\n\t\t\tsrv.peerOpDone <- struct{}{}\n\t\tcase t := <-taskdone:\n\t\t\t// A task got done. Tell dialstate about it so it\n\t\t\t// can update its state and remove it from the active\n\t\t\t// tasks list.\n\t\t\tsrv.log.Trace(\"Dial task done\", \"task\", t)\n\t\t\tdialstate.taskDone(t, time.Now())\n\t\t\tdelTask(t)\n\t\tcase c := <-srv.posthandshake:\n\t\t\t// A connection has passed the encryption handshake so\n\t\t\t// the remote identity is known (but hasn't been verified yet).\n\t\t\tif trusted[c.id] {\n\t\t\t\t// Ensure that the trusted flag is set before checking against MaxPeers.\n\t\t\t\tc.flags |= trustedConn\n\t\t\t}\n\t\t\t// TODO: track in-progress inbound node IDs (pre-Peer) to avoid dialing them.\n\t\t\tselect {\n\t\t\tcase c.cont <- srv.encHandshakeChecks(peers, inboundCount, c):\n\t\t\tcase <-srv.quit:\n\t\t\t\tbreak running\n\t\t\t}\n\t\tcase c := <-srv.addpeer:\n\t\t\t// At this point the connection is past the protocol handshake.\n\t\t\t// Its capabilities are known and the remote identity is verified.\n\t\t\terr := srv.protoHandshakeChecks(peers, inboundCount, c)\n\t\t\tif err == nil {\n\t\t\t\t// The handshakes are done and it passed all checks.\n\t\t\t\tp := newPeer(c, srv.Protocols)\n\t\t\t\t// If message events are enabled, pass the peerFeed\n\t\t\t\t// to the peer\n\t\t\t\tif srv.EnableMsgEvents {\n\t\t\t\t\tp.events = &srv.peerFeed\n\t\t\t\t}\n\t\t\t\tname := truncateName(c.name)\n\t\t\t\tsrv.log.Debug(\"Adding p2p peer\", \"name\", name, \"addr\", c.fd.RemoteAddr(), \"peers\", len(peers)+1)\n\t\t\t\tgo srv.runPeer(p)\n\t\t\t\tpeers[c.id] = p\n\t\t\t\tif p.Inbound() {\n\t\t\t\t\tinboundCount++\n\t\t\t\t}\n\t\t\t}\n\t\t\t// The dialer logic relies on the assumption that\n\t\t\t// dial tasks complete after the peer has been added or\n\t\t\t// discarded. Unblock the task last.\n\t\t\tselect {\n\t\t\tcase c.cont <- err:\n\t\t\tcase <-srv.quit:\n\t\t\t\tbreak running\n\t\t\t}\n\t\tcase pd := <-srv.delpeer:\n\t\t\t// A peer disconnected.\n\t\t\td := common.PrettyDuration(mclock.Now() - pd.created)\n\t\t\tpd.log.Debug(\"Removing p2p peer\", \"duration\", d, \"peers\", len(peers)-1, \"req\", pd.requested, \"err\", pd.err)\n\t\t\tdelete(peers, pd.ID())\n\t\t\tif pd.Inbound() {\n\t\t\t\tinboundCount--\n\t\t\t}\n\t\t}\n\t}\n\n\tsrv.log.Trace(\"P2P networking is spinning down\")\n\n\t// Terminate discovery. If there is a running lookup it will terminate soon.\n\tif srv.ntab != nil {\n\t\tsrv.ntab.Close()\n\t}\n\tif srv.DiscV5 != nil {\n\t\tsrv.DiscV5.Close()\n\t}\n\t// Disconnect all peers.\n\tfor _, p := range peers {\n\t\tp.Disconnect(DiscQuitting)\n\t}\n\t// Wait for peers to shut down. Pending connections and tasks are\n\t// not handled here and will terminate soon-ish because srv.quit\n\t// is closed.\n\tfor len(peers) > 0 {\n\t\tp := <-srv.delpeer\n\t\tp.log.Trace(\"<-delpeer (spindown)\", \"remainingTasks\", len(runningTasks))\n\t\tdelete(peers, p.ID())\n\t}\n}\n\nfunc (srv *Server) protoHandshakeChecks(peers map[discover.NodeID]*Peer, inboundCount int, c *conn) error {\n\t// Drop connections with no matching protocols.\n\tif len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 {\n\t\treturn DiscUselessPeer\n\t}\n\t// Repeat the encryption handshake checks because the\n\t// peer set might have changed between the handshakes.\n\treturn srv.encHandshakeChecks(peers, inboundCount, c)\n}\n\nfunc (srv *Server) encHandshakeChecks(peers map[discover.NodeID]*Peer, inboundCount int, c *conn) error {\n\tswitch {\n\tcase !c.is(trustedConn|staticDialedConn) && len(peers) >= srv.MaxPeers:\n\t\treturn DiscTooManyPeers\n\tcase !c.is(trustedConn) && c.is(inboundConn) && inboundCount >= srv.maxInboundConns():\n\t\treturn DiscTooManyPeers\n\tcase peers[c.id] != nil:\n\t\treturn DiscAlreadyConnected\n\tcase c.id == srv.Self().ID:\n\t\treturn DiscSelf\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc (srv *Server) maxInboundConns() int {\n\treturn srv.MaxPeers - srv.maxDialedConns()\n}\n\nfunc (srv *Server) maxDialedConns() int {\n\tif srv.NoDiscovery || srv.NoDial {\n\t\treturn 0\n\t}\n\tr := srv.DialRatio\n\tif r == 0 {\n\t\tr = defaultDialRatio\n\t}\n\treturn srv.MaxPeers / r\n}\n\ntype tempError interface {\n\tTemporary() bool\n}\n\n// listenLoop runs in its own goroutine and accepts\n// inbound connections.\nfunc (srv *Server) listenLoop() {\n\tdefer srv.loopWG.Done()\n\tsrv.log.Info(\"RLPx listener up\", \"self\", srv.makeSelf(srv.listener, srv.ntab))\n\n\ttokens := defaultMaxPendingPeers\n\tif srv.MaxPendingPeers > 0 {\n\t\ttokens = srv.MaxPendingPeers\n\t}\n\tslots := make(chan struct{}, tokens)\n\tfor i := 0; i < tokens; i++ {\n\t\tslots <- struct{}{}\n\t}\n\n\tfor {\n\t\t// Wait for a handshake slot before accepting.\n\t\t<-slots\n\n\t\tvar (\n\t\t\tfd  net.Conn\n\t\t\terr error\n\t\t)\n\t\tfor {\n\t\t\tfd, err = srv.listener.Accept()\n\t\t\tif tempErr, ok := err.(tempError); ok && tempErr.Temporary() {\n\t\t\t\tsrv.log.Debug(\"Temporary read error\", \"err\", err)\n\t\t\t\tcontinue\n\t\t\t} else if err != nil {\n\t\t\t\tsrv.log.Debug(\"Read error\", \"err\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\t// Reject connections that do not match NetRestrict.\n\t\tif srv.NetRestrict != nil {\n\t\t\tif tcp, ok := fd.RemoteAddr().(*net.TCPAddr); ok && !srv.NetRestrict.Contains(tcp.IP) {\n\t\t\t\tsrv.log.Debug(\"Rejected conn (not whitelisted in NetRestrict)\", \"addr\", fd.RemoteAddr())\n\t\t\t\tfd.Close()\n\t\t\t\tslots <- struct{}{}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tfd = newMeteredConn(fd, true)\n\t\tsrv.log.Trace(\"Accepted connection\", \"addr\", fd.RemoteAddr())\n\t\tgo func() {\n\t\t\tsrv.SetupConn(fd, inboundConn, nil)\n\t\t\tslots <- struct{}{}\n\t\t}()\n\t}\n}\n\n// SetupConn runs the handshakes and attempts to add the connection\n// as a peer. It returns when the connection has been added as a peer\n// or the handshakes have failed.\nfunc (srv *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *discover.Node) error {\n\tself := srv.Self()\n\tif self == nil {\n\t\treturn errors.New(\"shutdown\")\n\t}\n\tc := &conn{fd: fd, transport: srv.newTransport(fd), flags: flags, cont: make(chan error)}\n\terr := srv.setupConn(c, flags, dialDest)\n\tif err != nil {\n\t\tc.close(err)\n\t\tsrv.log.Trace(\"Setting up connection failed\", \"id\", c.id, \"err\", err)\n\t}\n\treturn err\n}\n\nfunc (srv *Server) setupConn(c *conn, flags connFlag, dialDest *discover.Node) error {\n\t// Prevent leftover pending conns from entering the handshake.\n\tsrv.lock.Lock()\n\trunning := srv.running\n\tsrv.lock.Unlock()\n\tif !running {\n\t\treturn errServerStopped\n\t}\n\t// Run the encryption handshake.\n\tvar err error\n\tif c.id, err = c.doEncHandshake(srv.PrivateKey, dialDest); err != nil {\n\t\tsrv.log.Trace(\"Failed RLPx handshake\", \"addr\", c.fd.RemoteAddr(), \"conn\", c.flags, \"err\", err)\n\t\treturn err\n\t}\n\tclog := srv.log.New(\"id\", c.id, \"addr\", c.fd.RemoteAddr(), \"conn\", c.flags)\n\t// For dialed connections, check that the remote public key matches.\n\tif dialDest != nil && c.id != dialDest.ID {\n\t\tclog.Trace(\"Dialed identity mismatch\", \"want\", c, dialDest.ID)\n\t\treturn DiscUnexpectedIdentity\n\t}\n\terr = srv.checkpoint(c, srv.posthandshake)\n\tif err != nil {\n\t\tclog.Trace(\"Rejected peer before protocol handshake\", \"err\", err)\n\t\treturn err\n\t}\n\t// Run the protocol handshake\n\tphs, err := c.doProtoHandshake(srv.ourHandshake)\n\tif err != nil {\n\t\tclog.Trace(\"Failed proto handshake\", \"err\", err)\n\t\treturn err\n\t}\n\tif phs.ID != c.id {\n\t\tclog.Trace(\"Wrong devp2p handshake identity\", \"err\", phs.ID)\n\t\treturn DiscUnexpectedIdentity\n\t}\n\tc.caps, c.name = phs.Caps, phs.Name\n\terr = srv.checkpoint(c, srv.addpeer)\n\tif err != nil {\n\t\tclog.Trace(\"Rejected peer\", \"err\", err)\n\t\treturn err\n\t}\n\t// If the checks completed successfully, runPeer has now been\n\t// launched by run.\n\tclog.Trace(\"connection set up\", \"inbound\", dialDest == nil)\n\treturn nil\n}\n\nfunc truncateName(s string) string {\n\tif len(s) > 20 {\n\t\treturn s[:20] + \"...\"\n\t}\n\treturn s\n}\n\n// checkpoint sends the conn to run, which performs the\n// post-handshake checks for the stage (posthandshake, addpeer).\nfunc (srv *Server) checkpoint(c *conn, stage chan<- *conn) error {\n\tselect {\n\tcase stage <- c:\n\tcase <-srv.quit:\n\t\treturn errServerStopped\n\t}\n\tselect {\n\tcase err := <-c.cont:\n\t\treturn err\n\tcase <-srv.quit:\n\t\treturn errServerStopped\n\t}\n}\n\n// runPeer runs in its own goroutine for each peer.\n// it waits until the Peer logic returns and removes\n// the peer.\nfunc (srv *Server) runPeer(p *Peer) {\n\tif srv.newPeerHook != nil {\n\t\tsrv.newPeerHook(p)\n\t}\n\n\t// broadcast peer add\n\tsrv.peerFeed.Send(&PeerEvent{\n\t\tType: PeerEventTypeAdd,\n\t\tPeer: p.ID(),\n\t})\n\n\t// run the protocol\n\tremoteRequested, err := p.run()\n\n\t// broadcast peer drop\n\tsrv.peerFeed.Send(&PeerEvent{\n\t\tType:  PeerEventTypeDrop,\n\t\tPeer:  p.ID(),\n\t\tError: err.Error(),\n\t})\n\n\t// Note: run waits for existing peers to be sent on srv.delpeer\n\t// before returning, so this send should not select on srv.quit.\n\tsrv.delpeer <- peerDrop{p, err, remoteRequested}\n}\n\n// NodeInfo represents a short summary of the information known about the host.\ntype NodeInfo struct {\n\tID    string `json:\"id\"`    // Unique node identifier (also the encryption key)\n\tName  string `json:\"name\"`  // Name of the node, including client type, version, OS, custom data\n\tEnode string `json:\"snode\"` // Enode URL for adding this peer from remote peers\n\tIP    string `json:\"ip\"`    // IP address of the node\n\tPorts struct {\n\t\tDiscovery int `json:\"discovery\"` // UDP listening port for discovery protocol\n\t\tListener  int `json:\"listener\"`  // TCP listening port for RLPx\n\t} `json:\"ports\"`\n\tListenAddr string                 `json:\"listenAddr\"`\n\tProtocols  map[string]interface{} `json:\"protocols\"`\n}\n\n// NodeInfo gathers and returns a collection of metadata known about the host.\nfunc (srv *Server) NodeInfo() *NodeInfo {\n\tnode := srv.Self()\n\n\t// Gather and assemble the generic node infos\n\tinfo := &NodeInfo{\n\t\tName:       srv.Name,\n\t\tEnode:      node.String(),\n\t\tID:         node.ID.String(),\n\t\tIP:         node.IP.String(),\n\t\tListenAddr: srv.ListenAddr,\n\t\tProtocols:  make(map[string]interface{}),\n\t}\n\tinfo.Ports.Discovery = int(node.UDP)\n\tinfo.Ports.Listener = int(node.TCP)\n\n\t// Gather all the running protocol infos (only once per protocol type)\n\tfor _, proto := range srv.Protocols {\n\t\tif _, ok := info.Protocols[proto.Name]; !ok {\n\t\t\tnodeInfo := interface{}(\"unknown\")\n\t\t\tif query := proto.NodeInfo; query != nil {\n\t\t\t\tnodeInfo = proto.NodeInfo()\n\t\t\t}\n\t\t\tinfo.Protocols[proto.Name] = nodeInfo\n\t\t}\n\t}\n\treturn info\n}\n\n// PeersInfo returns an array of metadata objects describing connected peers.\nfunc (srv *Server) PeersInfo() []*PeerInfo {\n\t// Gather all the generic and sub-protocol specific infos\n\tinfos := make([]*PeerInfo, 0, srv.PeerCount())\n\tfor _, peer := range srv.Peers() {\n\t\tif peer != nil {\n\t\t\tinfos = append(infos, peer.Info())\n\t\t}\n\t}\n\t// Sort the result array alphabetically by node identifier\n\tfor i := 0; i < len(infos); i++ {\n\t\tfor j := i + 1; j < len(infos); j++ {\n\t\t\tif infos[i].ID > infos[j].ID {\n\t\t\t\tinfos[i], infos[j] = infos[j], infos[i]\n\t\t\t}\n\t\t}\n\t}\n\treturn infos\n}\n"
  },
  {
    "path": "p2p/simulations/README.md",
    "content": "# devp2p Simulations\n\nThe `p2p/simulations` package implements a simulation framework which supports\ncreating a collection of devp2p nodes, connecting them together to form a\nsimulation network, performing simulation actions in that network and then\nextracting useful information.\n\n## Nodes\n\nEach node in a simulation network runs multiple services by wrapping a collection\nof objects which implement the `node.Service` interface meaning they:\n\n* can be started and stopped\n* run p2p protocols\n* expose RPC APIs\n\nThis means that any object which implements the `node.Service` interface can be\nused to run a node in the simulation.\n\n## Services\n\nBefore running a simulation, a set of service initializers must be registered\nwhich can then be used to run nodes in the network.\n\nA service initializer is a function with the following signature:\n\n```go\nfunc(ctx *adapters.ServiceContext) (node.Service, error)\n```\n\nThese initializers should be registered by calling the `adapters.RegisterServices`\nfunction in an `init()` hook:\n\n```go\nfunc init() {\n\tadapters.RegisterServices(adapters.Services{\n\t\t\"service1\": initService1,\n\t\t\"service2\": initService2,\n\t})\n}\n```\n\n## Node Adapters\n\nThe simulation framework includes multiple \"node adapters\" which are\nresponsible for creating an environment in which a node runs.\n\n### SimAdapter\n\nThe `SimAdapter` runs nodes in-memory, connecting them using an in-memory,\nsynchronous `net.Pipe` and connecting to their RPC server using an in-memory\n`rpc.Client`.\n\n### ExecAdapter\n\nThe `ExecAdapter` runs nodes as child processes of the running simulation.\n\nIt does this by executing the binary which is running the simulation but\nsetting `argv[0]` (i.e. the program name) to `p2p-node` which is then\ndetected by an init hook in the child process which runs the `node.Service`\nusing the devp2p node stack rather than executing `main()`.\n\nThe nodes listen for devp2p connections and WebSocket RPC clients on random\nlocalhost ports.\n\n### DockerAdapter\n\nThe `DockerAdapter` is similar to the `ExecAdapter` but executes `docker run`\nto run the node in a Docker container using a Docker image containing the\nsimulation binary at `/bin/p2p-node`.\n\nThe Docker image is built using `docker build` when the adapter is initialised,\nmeaning no prior setup is necessary other than having a working Docker client.\n\nEach node listens on the external IP of the container and the default p2p and\nRPC ports (`30303` and `8546` respectively).\n\n## Network\n\nA simulation network is created with an ID and default service (which is used\nif a node is created without an explicit service), exposes methods for\ncreating, starting, stopping, connecting and disconnecting nodes, and emits\nevents when certain actions occur.\n\n### Events\n\nA simulation network emits the following events:\n\n* node event       - when nodes are created / started / stopped\n* connection event - when nodes are connected / disconnected\n* message event    - when a protocol message is sent between two nodes\n\nThe events have a \"control\" flag which when set indicates that the event is the\noutcome of a controlled simulation action (e.g. creating a node or explicitly\nconnecting two nodes together).\n\nThis is in contrast to a non-control event, otherwise called a \"live\" event,\nwhich is the outcome of something happening in the network as a result of a\ncontrol event (e.g. a node actually started up or a connection was actually\nestablished between two nodes).\n\nLive events are detected by the simulation network by subscribing to node peer\nevents via RPC when the nodes start up.\n\n## Testing Framework\n\nThe `Simulation` type can be used in tests to perform actions in a simulation\nnetwork and then wait for expectations to be met.\n\nWith a running simulation network, the `Simulation.Run` method can be called\nwith a `Step` which has the following fields:\n\n* `Action` - a function which performs some action in the network\n\n* `Expect` - an expectation function which returns whether or not a\n    given node meets the expectation\n\n* `Trigger` - a channel which receives node IDs which then trigger a check\n    of the expectation function to be performed against that node\n\nAs a concrete example, consider a simulated network of Ethereum nodes. An\n`Action` could be the sending of a transaction, `Expect` it being included in\na block, and `Trigger` a check for every block that is mined.\n\nOn return, the `Simulation.Run` method returns a `StepResult` which can be used\nto determine if all nodes met the expectation, how long it took them to meet\nthe expectation and what network events were emitted during the step run.\n\n## HTTP API\n\nThe simulation framework includes a HTTP API which can be used to control the\nsimulation.\n\nThe API is initialised with a particular node adapter and has the following\nendpoints:\n\n```\nGET    /                            Get network information\nPOST   /start                       Start all nodes in the network\nPOST   /stop                        Stop all nodes in the network\nGET    /events                      Stream network events\nGET    /snapshot                    Take a network snapshot\nPOST   /snapshot                    Load a network snapshot\nPOST   /nodes                       Create a node\nGET    /nodes                       Get all nodes in the network\nGET    /nodes/:nodeid               Get node information\nPOST   /nodes/:nodeid/start         Start a node\nPOST   /nodes/:nodeid/stop          Stop a node\nPOST   /nodes/:nodeid/conn/:peerid  Connect two nodes\nDELETE /nodes/:nodeid/conn/:peerid  Disconnect two nodes\nGET    /nodes/:nodeid/rpc           Make RPC requests to a node via WebSocket\n```\n\nFor convenience, `nodeid` in the URL can be the name of a node rather than its\nID.\n\n## Command line client\n\n`p2psim` is a command line client for the HTTP API, located in\n`cmd/p2psim`.\n\nIt provides the following commands:\n\n```\np2psim show\np2psim events [--current] [--filter=FILTER]\np2psim snapshot\np2psim load\np2psim node create [--name=NAME] [--services=SERVICES] [--key=KEY]\np2psim node list\np2psim node show <node>\np2psim node start <node>\np2psim node stop <node>\np2psim node connect <node> <peer>\np2psim node disconnect <node> <peer>\np2psim node rpc <node> <method> [<args>] [--subscribe]\n```\n\n## Example\n\nSee [p2p/simulations/examples/README.md](examples/README.md).\n"
  },
  {
    "path": "p2p/simulations/adapters/docker.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage adapters\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/docker/docker/pkg/reexec\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n)\n\nvar (\n\tErrLinuxOnly = errors.New(\"DockerAdapter can only be used on Linux as it uses the current binary (which must be a Linux binary)\")\n)\n\n// DockerAdapter is a NodeAdapter which runs simulation nodes inside Docker\n// containers.\n//\n// A Docker image is built which contains the current binary at /bin/p2p-node\n// which when executed runs the underlying service (see the description\n// of the execP2PNode function for more details)\ntype DockerAdapter struct {\n\tExecAdapter\n}\n\n// NewDockerAdapter builds the p2p-node Docker image containing the current\n// binary and returns a DockerAdapter\nfunc NewDockerAdapter() (*DockerAdapter, error) {\n\t// Since Docker containers run on Linux and this adapter runs the\n\t// current binary in the container, it must be compiled for Linux.\n\t//\n\t// It is reasonable to require this because the caller can just\n\t// compile the current binary in a Docker container.\n\tif runtime.GOOS != \"linux\" {\n\t\treturn nil, ErrLinuxOnly\n\t}\n\n\tif err := buildDockerImage(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &DockerAdapter{\n\t\tExecAdapter{\n\t\t\tnodes: make(map[discover.NodeID]*ExecNode),\n\t\t},\n\t}, nil\n}\n\n// Name returns the name of the adapter for logging purposes\nfunc (d *DockerAdapter) Name() string {\n\treturn \"docker-adapter\"\n}\n\n// NewNode returns a new DockerNode using the given config\nfunc (d *DockerAdapter) NewNode(config *NodeConfig) (Node, error) {\n\tif len(config.Services) == 0 {\n\t\treturn nil, errors.New(\"node must have at least one service\")\n\t}\n\tfor _, service := range config.Services {\n\t\tif _, exists := serviceFuncs[service]; !exists {\n\t\t\treturn nil, fmt.Errorf(\"unknown node service %q\", service)\n\t\t}\n\t}\n\n\t// generate the config\n\tconf := &execNodeConfig{\n\t\tStack: node.DefaultConfig,\n\t\tNode:  config,\n\t}\n\tconf.Stack.DataDir = \"/data\"\n\tconf.Stack.WSHost = \"0.0.0.0\"\n\tconf.Stack.WSOrigins = []string{\"*\"}\n\tconf.Stack.WSExposeAll = true\n\tconf.Stack.P2P.EnableMsgEvents = false\n\tconf.Stack.P2P.NoDiscovery = true\n\tconf.Stack.P2P.NAT = nil\n\n\t// listen on all interfaces on a given port, which we set when we\n\t// initialise NodeConfig (usually a random port)\n\tconf.Stack.P2P.ListenAddr = fmt.Sprintf(\":%d\", config.Port)\n\n\tnode := &DockerNode{\n\t\tExecNode: ExecNode{\n\t\t\tID:      config.ID,\n\t\t\tConfig:  conf,\n\t\t\tadapter: &d.ExecAdapter,\n\t\t},\n\t}\n\tnode.newCmd = node.dockerCommand\n\td.ExecAdapter.nodes[node.ID] = &node.ExecNode\n\treturn node, nil\n}\n\n// DockerNode wraps an ExecNode but exec's the current binary in a docker\n// container rather than locally\ntype DockerNode struct {\n\tExecNode\n}\n\n// dockerCommand returns a command which exec's the binary in a Docker\n// container.\n//\n// It uses a shell so that we can pass the _P2P_NODE_CONFIG environment\n// variable to the container using the --env flag.\nfunc (n *DockerNode) dockerCommand() *exec.Cmd {\n\treturn exec.Command(\n\t\t\"sh\", \"-c\",\n\t\tfmt.Sprintf(\n\t\t\t`exec docker run --interactive --env _P2P_NODE_CONFIG=\"${_P2P_NODE_CONFIG}\" %s p2p-node %s %s`,\n\t\t\tdockerImage, strings.Join(n.Config.Node.Services, \",\"), n.ID.String(),\n\t\t),\n\t)\n}\n\n// dockerImage is the name of the Docker image which gets built to run the\n// simulation node\nconst dockerImage = \"p2p-node\"\n\n// buildDockerImage builds the Docker image which is used to run the simulation\n// node in a Docker container.\n//\n// It adds the current binary as \"p2p-node\" so that it runs execP2PNode\n// when executed.\nfunc buildDockerImage() error {\n\t// create a directory to use as the build context\n\tdir, err := ioutil.TempDir(\"\", \"p2p-docker\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer os.RemoveAll(dir)\n\n\t// copy the current binary into the build context\n\tbin, err := os.Open(reexec.Self())\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer bin.Close()\n\tdst, err := os.OpenFile(filepath.Join(dir, \"self.bin\"), os.O_WRONLY|os.O_CREATE, 0755)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer dst.Close()\n\tif _, err := io.Copy(dst, bin); err != nil {\n\t\treturn err\n\t}\n\n\t// create the Dockerfile\n\tdockerfile := []byte(`\nFROM ubuntu:16.04\nRUN mkdir /data\nADD self.bin /bin/p2p-node\n\t`)\n\tif err := ioutil.WriteFile(filepath.Join(dir, \"Dockerfile\"), dockerfile, 0644); err != nil {\n\t\treturn err\n\t}\n\n\t// run 'docker build'\n\tcmd := exec.Command(\"docker\", \"build\", \"-t\", dockerImage, dir)\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = os.Stderr\n\tif err := cmd.Run(); err != nil {\n\t\treturn fmt.Errorf(\"error building docker image: %s\", err)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "p2p/simulations/adapters/exec.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage adapters\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\t\"crypto/ecdsa\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"os/exec\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/docker/docker/pkg/reexec\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"golang.org/x/net/websocket\"\n)\n\n// ExecAdapter is a NodeAdapter which runs simulation nodes by executing the\n// current binary as a child process.\n//\n// An init hook is used so that the child process executes the node services\n// (rather than whataver the main() function would normally do), see the\n// execP2PNode function for more information.\ntype ExecAdapter struct {\n\t// BaseDir is the directory under which the data directories for each\n\t// simulation node are created.\n\tBaseDir string\n\n\tnodes map[discover.NodeID]*ExecNode\n}\n\n// NewExecAdapter returns an ExecAdapter which stores node data in\n// subdirectories of the given base directory\nfunc NewExecAdapter(baseDir string) *ExecAdapter {\n\treturn &ExecAdapter{\n\t\tBaseDir: baseDir,\n\t\tnodes:   make(map[discover.NodeID]*ExecNode),\n\t}\n}\n\n// Name returns the name of the adapter for logging purposes\nfunc (e *ExecAdapter) Name() string {\n\treturn \"exec-adapter\"\n}\n\n// NewNode returns a new ExecNode using the given config\nfunc (e *ExecAdapter) NewNode(config *NodeConfig) (Node, error) {\n\tif len(config.Services) == 0 {\n\t\treturn nil, errors.New(\"node must have at least one service\")\n\t}\n\tfor _, service := range config.Services {\n\t\tif _, exists := serviceFuncs[service]; !exists {\n\t\t\treturn nil, fmt.Errorf(\"unknown node service %q\", service)\n\t\t}\n\t}\n\n\t// create the node directory using the first 12 characters of the ID\n\t// as Unix socket paths cannot be longer than 256 characters\n\tdir := filepath.Join(e.BaseDir, config.ID.String()[:12])\n\tif err := os.Mkdir(dir, 0755); err != nil {\n\t\treturn nil, fmt.Errorf(\"error creating node directory: %s\", err)\n\t}\n\n\t// generate the config\n\tconf := &execNodeConfig{\n\t\tStack: node.DefaultConfig,\n\t\tNode:  config,\n\t}\n\tconf.Stack.DataDir = filepath.Join(dir, \"data\")\n\tconf.Stack.WSHost = \"127.0.0.1\"\n\tconf.Stack.WSPort = 0\n\tconf.Stack.WSOrigins = []string{\"*\"}\n\tconf.Stack.WSExposeAll = true\n\tconf.Stack.P2P.EnableMsgEvents = false\n\tconf.Stack.P2P.NoDiscovery = true\n\tconf.Stack.P2P.NAT = nil\n\n\t// listen on a localhost port, which we set when we\n\t// initialise NodeConfig (usually a random port)\n\tconf.Stack.P2P.ListenAddr = fmt.Sprintf(\":%d\", config.Port)\n\n\tnode := &ExecNode{\n\t\tID:      config.ID,\n\t\tDir:     dir,\n\t\tConfig:  conf,\n\t\tadapter: e,\n\t}\n\tnode.newCmd = node.execCommand\n\te.nodes[node.ID] = node\n\treturn node, nil\n}\n\n// ExecNode starts a simulation node by exec'ing the current binary and\n// running the configured services\ntype ExecNode struct {\n\tID     discover.NodeID\n\tDir    string\n\tConfig *execNodeConfig\n\tCmd    *exec.Cmd\n\tInfo   *p2p.NodeInfo\n\n\tadapter *ExecAdapter\n\tclient  *rpc.Client\n\twsAddr  string\n\tnewCmd  func() *exec.Cmd\n\tkey     *ecdsa.PrivateKey\n}\n\n// Addr returns the node's enode URL\nfunc (n *ExecNode) Addr() []byte {\n\tif n.Info == nil {\n\t\treturn nil\n\t}\n\treturn []byte(n.Info.Enode)\n}\n\n// Client returns an rpc.Client which can be used to communicate with the\n// underlying services (it is set once the node has started)\nfunc (n *ExecNode) Client() (*rpc.Client, error) {\n\treturn n.client, nil\n}\n\n// Start exec's the node passing the ID and service as command line arguments\n// and the node config encoded as JSON in the _P2P_NODE_CONFIG environment\n// variable\nfunc (n *ExecNode) Start(snapshots map[string][]byte) (err error) {\n\tif n.Cmd != nil {\n\t\treturn errors.New(\"already started\")\n\t}\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tlog.Error(\"node failed to start\", \"err\", err)\n\t\t\tn.Stop()\n\t\t}\n\t}()\n\n\t// encode a copy of the config containing the snapshot\n\tconfCopy := *n.Config\n\tconfCopy.Snapshots = snapshots\n\tconfCopy.PeerAddrs = make(map[string]string)\n\tfor id, node := range n.adapter.nodes {\n\t\tconfCopy.PeerAddrs[id.String()] = node.wsAddr\n\t}\n\tconfData, err := json.Marshal(confCopy)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error generating node config: %s\", err)\n\t}\n\n\t// use a pipe for stderr so we can both copy the node's stderr to\n\t// os.Stderr and read the WebSocket address from the logs\n\tstderrR, stderrW := io.Pipe()\n\tstderr := io.MultiWriter(os.Stderr, stderrW)\n\n\t// start the node\n\tcmd := n.newCmd()\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = stderr\n\tcmd.Env = append(os.Environ(), fmt.Sprintf(\"_P2P_NODE_CONFIG=%s\", confData))\n\tif err := cmd.Start(); err != nil {\n\t\treturn fmt.Errorf(\"error starting node: %s\", err)\n\t}\n\tn.Cmd = cmd\n\n\t// read the WebSocket address from the stderr logs\n\tvar wsAddr string\n\twsAddrC := make(chan string)\n\tgo func() {\n\t\ts := bufio.NewScanner(stderrR)\n\t\tfor s.Scan() {\n\t\t\tif strings.Contains(s.Text(), \"WebSocket endpoint opened\") {\n\t\t\t\twsAddrC <- wsAddrPattern.FindString(s.Text())\n\t\t\t}\n\t\t}\n\t}()\n\tselect {\n\tcase wsAddr = <-wsAddrC:\n\t\tif wsAddr == \"\" {\n\t\t\treturn errors.New(\"failed to read WebSocket address from stderr\")\n\t\t}\n\tcase <-time.After(10 * time.Second):\n\t\treturn errors.New(\"timed out waiting for WebSocket address on stderr\")\n\t}\n\n\t// create the RPC client and load the node info\n\tctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\n\tdefer cancel()\n\tclient, err := rpc.DialWebsocket(ctx, wsAddr, \"\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error dialing rpc websocket: %s\", err)\n\t}\n\tvar info p2p.NodeInfo\n\tif err := client.CallContext(ctx, &info, \"admin_nodeInfo\"); err != nil {\n\t\treturn fmt.Errorf(\"error getting node info: %s\", err)\n\t}\n\tn.client = client\n\tn.wsAddr = wsAddr\n\tn.Info = &info\n\n\treturn nil\n}\n\n// execCommand returns a command which runs the node locally by exec'ing\n// the current binary but setting argv[0] to \"p2p-node\" so that the child\n// runs execP2PNode\nfunc (n *ExecNode) execCommand() *exec.Cmd {\n\treturn &exec.Cmd{\n\t\tPath: reexec.Self(),\n\t\tArgs: []string{\"p2p-node\", strings.Join(n.Config.Node.Services, \",\"), n.ID.String()},\n\t}\n}\n\n// Stop stops the node by first sending SIGTERM and then SIGKILL if the node\n// doesn't stop within 5s\nfunc (n *ExecNode) Stop() error {\n\tif n.Cmd == nil {\n\t\treturn nil\n\t}\n\tdefer func() {\n\t\tn.Cmd = nil\n\t}()\n\n\tif n.client != nil {\n\t\tn.client.Close()\n\t\tn.client = nil\n\t\tn.wsAddr = \"\"\n\t\tn.Info = nil\n\t}\n\n\tif err := n.Cmd.Process.Signal(syscall.SIGTERM); err != nil {\n\t\treturn n.Cmd.Process.Kill()\n\t}\n\twaitErr := make(chan error)\n\tgo func() {\n\t\twaitErr <- n.Cmd.Wait()\n\t}()\n\tselect {\n\tcase err := <-waitErr:\n\t\treturn err\n\tcase <-time.After(5 * time.Second):\n\t\treturn n.Cmd.Process.Kill()\n\t}\n}\n\n// NodeInfo returns information about the node\nfunc (n *ExecNode) NodeInfo() *p2p.NodeInfo {\n\tinfo := &p2p.NodeInfo{\n\t\tID: n.ID.String(),\n\t}\n\tif n.client != nil {\n\t\tn.client.Call(&info, \"admin_nodeInfo\")\n\t}\n\treturn info\n}\n\n// ServeRPC serves RPC requests over the given connection by dialling the\n// node's WebSocket address and joining the two connections\nfunc (n *ExecNode) ServeRPC(clientConn net.Conn) error {\n\tconn, err := websocket.Dial(n.wsAddr, \"\", \"http://localhost\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tvar wg sync.WaitGroup\n\twg.Add(2)\n\tjoin := func(src, dst net.Conn) {\n\t\tdefer wg.Done()\n\t\tio.Copy(dst, src)\n\t\t// close the write end of the destination connection\n\t\tif cw, ok := dst.(interface {\n\t\t\tCloseWrite() error\n\t\t}); ok {\n\t\t\tcw.CloseWrite()\n\t\t} else {\n\t\t\tdst.Close()\n\t\t}\n\t}\n\tgo join(conn, clientConn)\n\tgo join(clientConn, conn)\n\twg.Wait()\n\treturn nil\n}\n\n// Snapshots creates snapshots of the services by calling the\n// simulation_snapshot RPC method\nfunc (n *ExecNode) Snapshots() (map[string][]byte, error) {\n\tif n.client == nil {\n\t\treturn nil, errors.New(\"RPC not started\")\n\t}\n\tvar snapshots map[string][]byte\n\treturn snapshots, n.client.Call(&snapshots, \"simulation_snapshot\")\n}\n\nfunc init() {\n\t// register a reexec function to start a devp2p node when the current\n\t// binary is executed as \"p2p-node\"\n\treexec.Register(\"p2p-node\", execP2PNode)\n}\n\n// execNodeConfig is used to serialize the node configuration so it can be\n// passed to the child process as a JSON encoded environment variable\ntype execNodeConfig struct {\n\tStack     node.Config       `json:\"stack\"`\n\tNode      *NodeConfig       `json:\"node\"`\n\tSnapshots map[string][]byte `json:\"snapshots,omitempty\"`\n\tPeerAddrs map[string]string `json:\"peer_addrs,omitempty\"`\n}\n\n// ExternalIP gets an external IP address so that Enode URL is usable\nfunc ExternalIP() net.IP {\n\taddrs, err := net.InterfaceAddrs()\n\tif err != nil {\n\t\tlog.Crit(\"error getting IP address\", \"err\", err)\n\t}\n\tfor _, addr := range addrs {\n\t\tif ip, ok := addr.(*net.IPNet); ok && !ip.IP.IsLoopback() && !ip.IP.IsLinkLocalUnicast() {\n\t\t\treturn ip.IP\n\t\t}\n\t}\n\tlog.Warn(\"unable to determine explicit IP address, falling back to loopback\")\n\treturn net.IP{127, 0, 0, 1}\n}\n\n// execP2PNode starts a devp2p node when the current binary is executed with\n// argv[0] being \"p2p-node\", reading the service / ID from argv[1] / argv[2]\n// and the node config from the _P2P_NODE_CONFIG environment variable\nfunc execP2PNode() {\n\tglogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat()))\n\tglogger.Verbosity(log.LvlInfo)\n\tlog.Root().SetHandler(glogger)\n\n\t// read the services from argv\n\tserviceNames := strings.Split(os.Args[1], \",\")\n\n\t// decode the config\n\tconfEnv := os.Getenv(\"_P2P_NODE_CONFIG\")\n\tif confEnv == \"\" {\n\t\tlog.Crit(\"missing _P2P_NODE_CONFIG\")\n\t}\n\tvar conf execNodeConfig\n\tif err := json.Unmarshal([]byte(confEnv), &conf); err != nil {\n\t\tlog.Crit(\"error decoding _P2P_NODE_CONFIG\", \"err\", err)\n\t}\n\tconf.Stack.P2P.PrivateKey = conf.Node.PrivateKey\n\tconf.Stack.Logger = log.New(\"node.id\", conf.Node.ID.String())\n\n\tif strings.HasPrefix(conf.Stack.P2P.ListenAddr, \":\") {\n\t\tconf.Stack.P2P.ListenAddr = ExternalIP().String() + conf.Stack.P2P.ListenAddr\n\t}\n\tif conf.Stack.WSHost == \"0.0.0.0\" {\n\t\tconf.Stack.WSHost = ExternalIP().String()\n\t}\n\n\t// initialize the devp2p stack\n\tstack, err := node.New(&conf.Stack)\n\tif err != nil {\n\t\tlog.Crit(\"error creating node stack\", \"err\", err)\n\t}\n\n\t// register the services, collecting them into a map so we can wrap\n\t// them in a snapshot service\n\tservices := make(map[string]node.Service, len(serviceNames))\n\tfor _, name := range serviceNames {\n\t\tserviceFunc, exists := serviceFuncs[name]\n\t\tif !exists {\n\t\t\tlog.Crit(\"unknown node service\", \"name\", name)\n\t\t}\n\t\tconstructor := func(nodeCtx *node.ServiceContext) (node.Service, error) {\n\t\t\tctx := &ServiceContext{\n\t\t\t\tRPCDialer:   &wsRPCDialer{addrs: conf.PeerAddrs},\n\t\t\t\tNodeContext: nodeCtx,\n\t\t\t\tConfig:      conf.Node,\n\t\t\t}\n\t\t\tif conf.Snapshots != nil {\n\t\t\t\tctx.Snapshot = conf.Snapshots[name]\n\t\t\t}\n\t\t\tservice, err := serviceFunc(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tservices[name] = service\n\t\t\treturn service, nil\n\t\t}\n\t\tif err := stack.Register(constructor); err != nil {\n\t\t\tlog.Crit(\"error starting service\", \"name\", name, \"err\", err)\n\t\t}\n\t}\n\n\t// register the snapshot service\n\tif err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {\n\t\treturn &snapshotService{services}, nil\n\t}); err != nil {\n\t\tlog.Crit(\"error starting snapshot service\", \"err\", err)\n\t}\n\n\t// start the stack\n\tif err := stack.Start(); err != nil {\n\t\tlog.Crit(\"error stating node stack\", \"err\", err)\n\t}\n\n\t// stop the stack if we get a SIGTERM signal\n\tgo func() {\n\t\tsigc := make(chan os.Signal, 1)\n\t\tsignal.Notify(sigc, syscall.SIGTERM)\n\t\tdefer signal.Stop(sigc)\n\t\t<-sigc\n\t\tlog.Info(\"Received SIGTERM, shutting down...\")\n\t\tstack.Stop()\n\t}()\n\n\t// wait for the stack to exit\n\tstack.Wait()\n}\n\n// snapshotService is a node.Service which wraps a list of services and\n// exposes an API to generate a snapshot of those services\ntype snapshotService struct {\n\tservices map[string]node.Service\n}\n\nfunc (s *snapshotService) APIs() []rpc.API {\n\treturn []rpc.API{{\n\t\tNamespace: \"simulation\",\n\t\tVersion:   \"1.0\",\n\t\tService:   SnapshotAPI{s.services},\n\t}}\n}\n\nfunc (s *snapshotService) Protocols() []p2p.Protocol {\n\treturn nil\n}\n\nfunc (s *snapshotService) Start(*p2p.Server) error {\n\treturn nil\n}\n\nfunc (s *snapshotService) Stop() error {\n\treturn nil\n}\n\n// SnapshotAPI provides an RPC method to create snapshots of services\ntype SnapshotAPI struct {\n\tservices map[string]node.Service\n}\n\nfunc (api SnapshotAPI) Snapshot() (map[string][]byte, error) {\n\tsnapshots := make(map[string][]byte)\n\tfor name, service := range api.services {\n\t\tif s, ok := service.(interface {\n\t\t\tSnapshot() ([]byte, error)\n\t\t}); ok {\n\t\t\tsnap, err := s.Snapshot()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tsnapshots[name] = snap\n\t\t}\n\t}\n\treturn snapshots, nil\n}\n\ntype wsRPCDialer struct {\n\taddrs map[string]string\n}\n\n// DialRPC implements the RPCDialer interface by creating a WebSocket RPC\n// client of the given node\nfunc (w *wsRPCDialer) DialRPC(id discover.NodeID) (*rpc.Client, error) {\n\taddr, ok := w.addrs[id.String()]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unknown node: %s\", id)\n\t}\n\treturn rpc.DialWebsocket(context.Background(), addr, \"http://localhost\")\n}\n"
  },
  {
    "path": "p2p/simulations/adapters/inproc.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage adapters\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"net\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations/pipes\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// SimAdapter is a NodeAdapter which creates in-memory simulation nodes and\n// connects them using net.Pipe\ntype SimAdapter struct {\n\tpipe     func() (net.Conn, net.Conn, error)\n\tmtx      sync.RWMutex\n\tnodes    map[discover.NodeID]*SimNode\n\tservices map[string]ServiceFunc\n}\n\n// NewSimAdapter creates a SimAdapter which is capable of running in-memory\n// simulation nodes running any of the given services (the services to run on a\n// particular node are passed to the NewNode function in the NodeConfig)\n// the adapter uses a net.Pipe for in-memory simulated network connections\nfunc NewSimAdapter(services map[string]ServiceFunc) *SimAdapter {\n\treturn &SimAdapter{\n\t\tpipe:     pipes.NetPipe,\n\t\tnodes:    make(map[discover.NodeID]*SimNode),\n\t\tservices: services,\n\t}\n}\n\nfunc NewTCPAdapter(services map[string]ServiceFunc) *SimAdapter {\n\treturn &SimAdapter{\n\t\tpipe:     pipes.TCPPipe,\n\t\tnodes:    make(map[discover.NodeID]*SimNode),\n\t\tservices: services,\n\t}\n}\n\n// Name returns the name of the adapter for logging purposes\nfunc (s *SimAdapter) Name() string {\n\treturn \"sim-adapter\"\n}\n\n// NewNode returns a new SimNode using the given config\nfunc (s *SimAdapter) NewNode(config *NodeConfig) (Node, error) {\n\ts.mtx.Lock()\n\tdefer s.mtx.Unlock()\n\n\t// check a node with the ID doesn't already exist\n\tid := config.ID\n\tif _, exists := s.nodes[id]; exists {\n\t\treturn nil, fmt.Errorf(\"node already exists: %s\", id)\n\t}\n\n\t// check the services are valid\n\tif len(config.Services) == 0 {\n\t\treturn nil, errors.New(\"node must have at least one service\")\n\t}\n\tfor _, service := range config.Services {\n\t\tif _, exists := s.services[service]; !exists {\n\t\t\treturn nil, fmt.Errorf(\"unknown node service %q\", service)\n\t\t}\n\t}\n\n\tn, err := node.New(&node.Config{\n\t\tP2P: p2p.Config{\n\t\t\tPrivateKey:      config.PrivateKey,\n\t\t\tMaxPeers:        math.MaxInt32,\n\t\t\tNoDiscovery:     true,\n\t\t\tDialer:          s,\n\t\t\tEnableMsgEvents: config.EnableMsgEvents,\n\t\t},\n\t\tLogger: log.New(\"node.id\", id.String()),\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsimNode := &SimNode{\n\t\tID:      id,\n\t\tconfig:  config,\n\t\tnode:    n,\n\t\tadapter: s,\n\t\trunning: make(map[string]node.Service),\n\t}\n\ts.nodes[id] = simNode\n\treturn simNode, nil\n}\n\n// Dial implements the p2p.NodeDialer interface by connecting to the node using\n// an in-memory net.Pipe\nfunc (s *SimAdapter) Dial(dest *discover.Node) (conn net.Conn, err error) {\n\tnode, ok := s.GetNode(dest.ID)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unknown node: %s\", dest.ID)\n\t}\n\tsrv := node.Server()\n\tif srv == nil {\n\t\treturn nil, fmt.Errorf(\"node not running: %s\", dest.ID)\n\t}\n\t// SimAdapter.pipe is net.Pipe (NewSimAdapter)\n\tpipe1, pipe2, err := s.pipe()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// this is simulated 'listening'\n\t// asynchronously call the dialed destintion node's p2p server\n\t// to set up connection on the 'listening' side\n\tgo srv.SetupConn(pipe1, 0, nil)\n\treturn pipe2, nil\n}\n\n// DialRPC implements the RPCDialer interface by creating an in-memory RPC\n// client of the given node\nfunc (s *SimAdapter) DialRPC(id discover.NodeID) (*rpc.Client, error) {\n\tnode, ok := s.GetNode(id)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unknown node: %s\", id)\n\t}\n\thandler, err := node.node.RPCHandler()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn rpc.DialInProc(handler), nil\n}\n\n// GetNode returns the node with the given ID if it exists\nfunc (s *SimAdapter) GetNode(id discover.NodeID) (*SimNode, bool) {\n\ts.mtx.RLock()\n\tdefer s.mtx.RUnlock()\n\tnode, ok := s.nodes[id]\n\treturn node, ok\n}\n\n// SimNode is an in-memory simulation node which connects to other nodes using\n// net.Pipe (see SimAdapter.Dial), running devp2p protocols directly over that\n// pipe\ntype SimNode struct {\n\tlock         sync.RWMutex\n\tID           discover.NodeID\n\tconfig       *NodeConfig\n\tadapter      *SimAdapter\n\tnode         *node.Node\n\trunning      map[string]node.Service\n\tclient       *rpc.Client\n\tregisterOnce sync.Once\n}\n\n// Addr returns the node's discovery address\nfunc (sn *SimNode) Addr() []byte {\n\treturn []byte(sn.Node().String())\n}\n\n// Node returns a discover.Node representing the SimNode\nfunc (sn *SimNode) Node() *discover.Node {\n\treturn discover.NewNode(sn.ID, net.IP{127, 0, 0, 1}, 53717, 53717)\n}\n\n// Client returns an rpc.Client which can be used to communicate with the\n// underlying services (it is set once the node has started)\nfunc (sn *SimNode) Client() (*rpc.Client, error) {\n\tsn.lock.RLock()\n\tdefer sn.lock.RUnlock()\n\tif sn.client == nil {\n\t\treturn nil, errors.New(\"node not started\")\n\t}\n\treturn sn.client, nil\n}\n\n// ServeRPC serves RPC requests over the given connection by creating an\n// in-memory client to the node's RPC server\nfunc (sn *SimNode) ServeRPC(conn net.Conn) error {\n\thandler, err := sn.node.RPCHandler()\n\tif err != nil {\n\t\treturn err\n\t}\n\thandler.ServeCodec(rpc.NewJSONCodec(conn), rpc.OptionMethodInvocation|rpc.OptionSubscriptions)\n\treturn nil\n}\n\n// Snapshots creates snapshots of the services by calling the\n// simulation_snapshot RPC method\nfunc (sn *SimNode) Snapshots() (map[string][]byte, error) {\n\tsn.lock.RLock()\n\tservices := make(map[string]node.Service, len(sn.running))\n\tfor name, service := range sn.running {\n\t\tservices[name] = service\n\t}\n\tsn.lock.RUnlock()\n\tif len(services) == 0 {\n\t\treturn nil, errors.New(\"no running services\")\n\t}\n\tsnapshots := make(map[string][]byte)\n\tfor name, service := range services {\n\t\tif s, ok := service.(interface {\n\t\t\tSnapshot() ([]byte, error)\n\t\t}); ok {\n\t\t\tsnap, err := s.Snapshot()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tsnapshots[name] = snap\n\t\t}\n\t}\n\treturn snapshots, nil\n}\n\n// Start registers the services and starts the underlying devp2p node\nfunc (sn *SimNode) Start(snapshots map[string][]byte) error {\n\tnewService := func(name string) func(ctx *node.ServiceContext) (node.Service, error) {\n\t\treturn func(nodeCtx *node.ServiceContext) (node.Service, error) {\n\t\t\tctx := &ServiceContext{\n\t\t\t\tRPCDialer:   sn.adapter,\n\t\t\t\tNodeContext: nodeCtx,\n\t\t\t\tConfig:      sn.config,\n\t\t\t}\n\t\t\tif snapshots != nil {\n\t\t\t\tctx.Snapshot = snapshots[name]\n\t\t\t}\n\t\t\tserviceFunc := sn.adapter.services[name]\n\t\t\tservice, err := serviceFunc(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tsn.running[name] = service\n\t\t\treturn service, nil\n\t\t}\n\t}\n\n\t// ensure we only register the services once in the case of the node\n\t// being stopped and then started again\n\tvar regErr error\n\tsn.registerOnce.Do(func() {\n\t\tfor _, name := range sn.config.Services {\n\t\t\tif err := sn.node.Register(newService(name)); err != nil {\n\t\t\t\tregErr = err\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t})\n\tif regErr != nil {\n\t\treturn regErr\n\t}\n\n\tif err := sn.node.Start(); err != nil {\n\t\treturn err\n\t}\n\n\t// create an in-process RPC client\n\thandler, err := sn.node.RPCHandler()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsn.lock.Lock()\n\tsn.client = rpc.DialInProc(handler)\n\tsn.lock.Unlock()\n\n\treturn nil\n}\n\n// Stop closes the RPC client and stops the underlying devp2p node\nfunc (sn *SimNode) Stop() error {\n\tsn.lock.Lock()\n\tif sn.client != nil {\n\t\tsn.client.Close()\n\t\tsn.client = nil\n\t}\n\tsn.lock.Unlock()\n\treturn sn.node.Stop()\n}\n\n// Service returns a running service by name\nfunc (sn *SimNode) Service(name string) node.Service {\n\tsn.lock.RLock()\n\tdefer sn.lock.RUnlock()\n\treturn sn.running[name]\n}\n\n// Services returns a copy of the underlying services\nfunc (sn *SimNode) Services() []node.Service {\n\tsn.lock.RLock()\n\tdefer sn.lock.RUnlock()\n\tservices := make([]node.Service, 0, len(sn.running))\n\tfor _, service := range sn.running {\n\t\tservices = append(services, service)\n\t}\n\treturn services\n}\n\n// ServiceMap returns a map by names of the underlying services\nfunc (sn *SimNode) ServiceMap() map[string]node.Service {\n\tsn.lock.RLock()\n\tdefer sn.lock.RUnlock()\n\tservices := make(map[string]node.Service, len(sn.running))\n\tfor name, service := range sn.running {\n\t\tservices[name] = service\n\t}\n\treturn services\n}\n\n// Server returns the underlying p2p.Server\nfunc (sn *SimNode) Server() *p2p.Server {\n\treturn sn.node.Server()\n}\n\n// SubscribeEvents subscribes the given channel to peer events from the\n// underlying p2p.Server\nfunc (sn *SimNode) SubscribeEvents(ch chan *p2p.PeerEvent) event.Subscription {\n\tsrv := sn.Server()\n\tif srv == nil {\n\t\tpanic(\"node not running\")\n\t}\n\treturn srv.SubscribeEvents(ch)\n}\n\n// NodeInfo returns information about the node\nfunc (sn *SimNode) NodeInfo() *p2p.NodeInfo {\n\tserver := sn.Server()\n\tif server == nil {\n\t\treturn &p2p.NodeInfo{\n\t\t\tID:    sn.ID.String(),\n\t\t\tEnode: sn.Node().String(),\n\t\t}\n\t}\n\treturn server.NodeInfo()\n}\n\nfunc setSocketBuffer(conn net.Conn, socketReadBuffer int, socketWriteBuffer int) error {\n\tif v, ok := conn.(*net.UnixConn); ok {\n\t\terr := v.SetReadBuffer(socketReadBuffer)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = v.SetWriteBuffer(socketWriteBuffer)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "p2p/simulations/adapters/types.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage adapters\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"github.com/docker/docker/pkg/reexec\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// Node represents a node in a simulation network which is created by a\n// NodeAdapter, for example:\n//\n// * SimNode    - An in-memory node\n// * ExecNode   - A child process node\n// * DockerNode - A Docker container node\n//\ntype Node interface {\n\t// Addr returns the node's address (e.g. an Enode URL)\n\tAddr() []byte\n\n\t// Client returns the RPC client which is created once the node is\n\t// up and running\n\tClient() (*rpc.Client, error)\n\n\t// ServeRPC serves RPC requests over the given connection\n\tServeRPC(net.Conn) error\n\n\t// Start starts the node with the given snapshots\n\tStart(snapshots map[string][]byte) error\n\n\t// Stop stops the node\n\tStop() error\n\n\t// NodeInfo returns information about the node\n\tNodeInfo() *p2p.NodeInfo\n\n\t// Snapshots creates snapshots of the running services\n\tSnapshots() (map[string][]byte, error)\n}\n\n// NodeAdapter is used to create Nodes in a simulation network\ntype NodeAdapter interface {\n\t// Name returns the name of the adapter for logging purposes\n\tName() string\n\n\t// NewNode creates a new node with the given configuration\n\tNewNode(config *NodeConfig) (Node, error)\n}\n\n// NodeConfig is the configuration used to start a node in a simulation\n// network\ntype NodeConfig struct {\n\t// ID is the node's ID which is used to identify the node in the\n\t// simulation network\n\tID discover.NodeID\n\n\t// PrivateKey is the node's private key which is used by the devp2p\n\t// stack to encrypt communications\n\tPrivateKey *ecdsa.PrivateKey\n\n\t// Enable peer events for Msgs\n\tEnableMsgEvents bool\n\n\t// Name is a human friendly name for the node like \"node01\"\n\tName string\n\n\t// Services are the names of the services which should be run when\n\t// starting the node (for SimNodes it should be the names of services\n\t// contained in SimAdapter.services, for other nodes it should be\n\t// services registered by calling the RegisterService function)\n\tServices []string\n\n\t// function to sanction or prevent suggesting a peer\n\tReachable func(id discover.NodeID) bool\n\n\tPort uint16\n}\n\n// nodeConfigJSON is used to encode and decode NodeConfig as JSON by encoding\n// all fields as strings\ntype nodeConfigJSON struct {\n\tID              string   `json:\"id\"`\n\tPrivateKey      string   `json:\"private_key\"`\n\tName            string   `json:\"name\"`\n\tServices        []string `json:\"services\"`\n\tEnableMsgEvents bool     `json:\"enable_msg_events\"`\n\tPort            uint16   `json:\"port\"`\n}\n\n// MarshalJSON implements the json.Marshaler interface by encoding the config\n// fields as strings\nfunc (n *NodeConfig) MarshalJSON() ([]byte, error) {\n\tconfJSON := nodeConfigJSON{\n\t\tID:              n.ID.String(),\n\t\tName:            n.Name,\n\t\tServices:        n.Services,\n\t\tPort:            n.Port,\n\t\tEnableMsgEvents: n.EnableMsgEvents,\n\t}\n\tif n.PrivateKey != nil {\n\t\tconfJSON.PrivateKey = hex.EncodeToString(crypto.FromECDSA(n.PrivateKey))\n\t}\n\treturn json.Marshal(confJSON)\n}\n\n// UnmarshalJSON implements the json.Unmarshaler interface by decoding the json\n// string values into the config fields\nfunc (n *NodeConfig) UnmarshalJSON(data []byte) error {\n\tvar confJSON nodeConfigJSON\n\tif err := json.Unmarshal(data, &confJSON); err != nil {\n\t\treturn err\n\t}\n\n\tif confJSON.ID != \"\" {\n\t\tnodeID, err := discover.HexID(confJSON.ID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tn.ID = nodeID\n\t}\n\n\tif confJSON.PrivateKey != \"\" {\n\t\tkey, err := hex.DecodeString(confJSON.PrivateKey)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tprivKey, err := crypto.ToECDSA(key)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tn.PrivateKey = privKey\n\t}\n\n\tn.Name = confJSON.Name\n\tn.Services = confJSON.Services\n\tn.Port = confJSON.Port\n\tn.EnableMsgEvents = confJSON.EnableMsgEvents\n\n\treturn nil\n}\n\n// RandomNodeConfig returns node configuration with a randomly generated ID and\n// PrivateKey\nfunc RandomNodeConfig() *NodeConfig {\n\tkey, err := crypto.GenerateKey()\n\tif err != nil {\n\t\tpanic(\"unable to generate key\")\n\t}\n\n\tid := discover.PubkeyID(&key.PublicKey)\n\tport, err := assignTCPPort()\n\tif err != nil {\n\t\tpanic(\"unable to assign tcp port\")\n\t}\n\treturn &NodeConfig{\n\t\tID:              id,\n\t\tName:            fmt.Sprintf(\"node_%s\", id.String()),\n\t\tPrivateKey:      key,\n\t\tPort:            port,\n\t\tEnableMsgEvents: true,\n\t}\n}\n\nfunc assignTCPPort() (uint16, error) {\n\tl, err := net.Listen(\"tcp\", \"127.0.0.1:0\")\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tl.Close()\n\t_, port, err := net.SplitHostPort(l.Addr().String())\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tp, err := strconv.ParseInt(port, 10, 32)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint16(p), nil\n}\n\n// ServiceContext is a collection of options and methods which can be utilised\n// when starting services\ntype ServiceContext struct {\n\tRPCDialer\n\n\tNodeContext *node.ServiceContext\n\tConfig      *NodeConfig\n\tSnapshot    []byte\n}\n\n// RPCDialer is used when initialising services which need to connect to\n// other nodes in the network (for example a simulated Swarm node which needs\n// to connect to a Geth node to resolve ENS names)\ntype RPCDialer interface {\n\tDialRPC(id discover.NodeID) (*rpc.Client, error)\n}\n\n// Services is a collection of services which can be run in a simulation\ntype Services map[string]ServiceFunc\n\n// ServiceFunc returns a node.Service which can be used to boot a devp2p node\ntype ServiceFunc func(ctx *ServiceContext) (node.Service, error)\n\n// serviceFuncs is a map of registered services which are used to boot devp2p\n// nodes\nvar serviceFuncs = make(Services)\n\n// RegisterServices registers the given Services which can then be used to\n// start devp2p nodes using either the Exec or Docker adapters.\n//\n// It should be called in an init function so that it has the opportunity to\n// execute the services before main() is called.\nfunc RegisterServices(services Services) {\n\tfor name, f := range services {\n\t\tif _, exists := serviceFuncs[name]; exists {\n\t\t\tpanic(fmt.Sprintf(\"node service already exists: %q\", name))\n\t\t}\n\t\tserviceFuncs[name] = f\n\t}\n\n\t// now we have registered the services, run reexec.Init() which will\n\t// potentially start one of the services if the current binary has\n\t// been exec'd with argv[0] set to \"p2p-node\"\n\tif reexec.Init() {\n\t\tos.Exit(0)\n\t}\n}\n"
  },
  {
    "path": "p2p/simulations/adapters/ws.go",
    "content": "package adapters\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"io\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n)\n\n// wsAddrPattern is a regex used to read the WebSocket address from the node's\n// log\nvar wsAddrPattern = regexp.MustCompile(`ws://[\\d.:]+`)\n\nfunc matchWSAddr(str string) (string, bool) {\n\tif !strings.Contains(str, \"WebSocket endpoint opened\") {\n\t\treturn \"\", false\n\t}\n\n\treturn wsAddrPattern.FindString(str), true\n}\n\n// findWSAddr scans through reader r, looking for the log entry with\n// WebSocket address information.\nfunc findWSAddr(r io.Reader, timeout time.Duration) (string, error) {\n\tch := make(chan string)\n\n\tgo func() {\n\t\ts := bufio.NewScanner(r)\n\t\tfor s.Scan() {\n\t\t\taddr, ok := matchWSAddr(s.Text())\n\t\t\tif ok {\n\t\t\t\tch <- addr\n\t\t\t}\n\t\t}\n\t\tclose(ch)\n\t}()\n\n\tvar wsAddr string\n\tselect {\n\tcase wsAddr = <-ch:\n\t\tif wsAddr == \"\" {\n\t\t\treturn \"\", errors.New(\"empty result\")\n\t\t}\n\tcase <-time.After(timeout):\n\t\treturn \"\", errors.New(\"timed out\")\n\t}\n\n\treturn wsAddr, nil\n}\n"
  },
  {
    "path": "p2p/simulations/events.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage simulations\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// EventType is the type of event emitted by a simulation network\ntype EventType string\n\nconst (\n\t// EventTypeNode is the type of event emitted when a node is either\n\t// created, started or stopped\n\tEventTypeNode EventType = \"node\"\n\n\t// EventTypeConn is the type of event emitted when a connection is\n\t// is either established or dropped between two nodes\n\tEventTypeConn EventType = \"conn\"\n\n\t// EventTypeMsg is the type of event emitted when a p2p message it\n\t// sent between two nodes\n\tEventTypeMsg EventType = \"msg\"\n)\n\n// Event is an event emitted by a simulation network\ntype Event struct {\n\t// Type is the type of the event\n\tType EventType `json:\"type\"`\n\n\t// Time is the time the event happened\n\tTime time.Time `json:\"time\"`\n\n\t// Control indicates whether the event is the result of a controlled\n\t// action in the network\n\tControl bool `json:\"control\"`\n\n\t// Node is set if the type is EventTypeNode\n\tNode *Node `json:\"node,omitempty\"`\n\n\t// Conn is set if the type is EventTypeConn\n\tConn *Conn `json:\"conn,omitempty\"`\n\n\t// Msg is set if the type is EventTypeMsg\n\tMsg *Msg `json:\"msg,omitempty\"`\n}\n\n// NewEvent creates a new event for the given object which should be either a\n// Node, Conn or Msg.\n//\n// The object is copied so that the event represents the state of the object\n// when NewEvent is called.\nfunc NewEvent(v interface{}) *Event {\n\tevent := &Event{Time: time.Now()}\n\tswitch v := v.(type) {\n\tcase *Node:\n\t\tevent.Type = EventTypeNode\n\t\tnode := *v\n\t\tevent.Node = &node\n\tcase *Conn:\n\t\tevent.Type = EventTypeConn\n\t\tconn := *v\n\t\tevent.Conn = &conn\n\tcase *Msg:\n\t\tevent.Type = EventTypeMsg\n\t\tmsg := *v\n\t\tevent.Msg = &msg\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"invalid event type: %T\", v))\n\t}\n\treturn event\n}\n\n// ControlEvent creates a new control event\nfunc ControlEvent(v interface{}) *Event {\n\tevent := NewEvent(v)\n\tevent.Control = true\n\treturn event\n}\n\n// String returns the string representation of the event\nfunc (e *Event) String() string {\n\tswitch e.Type {\n\tcase EventTypeNode:\n\t\treturn fmt.Sprintf(\"<node-event> id: %s up: %t\", e.Node.ID().TerminalString(), e.Node.Up)\n\tcase EventTypeConn:\n\t\treturn fmt.Sprintf(\"<conn-event> nodes: %s->%s up: %t\", e.Conn.One.TerminalString(), e.Conn.Other.TerminalString(), e.Conn.Up)\n\tcase EventTypeMsg:\n\t\treturn fmt.Sprintf(\"<msg-event> nodes: %s->%s proto: %s, code: %d, received: %t\", e.Msg.One.TerminalString(), e.Msg.Other.TerminalString(), e.Msg.Protocol, e.Msg.Code, e.Msg.Received)\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n"
  },
  {
    "path": "p2p/simulations/examples/README.md",
    "content": "# devp2p simulation examples\n\n## ping-pong\n\n`ping-pong.go` implements a simulation network which contains nodes running a\nsimple \"ping-pong\" protocol where nodes send a ping message to all their\nconnected peers every 10s and receive pong messages in return.\n\nTo run the simulation, run `go run ping-pong.go` in one terminal to start the\nsimulation API and `./ping-pong.sh` in another to start and connect the nodes:\n\n```\n$ go run ping-pong.go\nINFO [08-15|13:53:49] using sim adapter\nINFO [08-15|13:53:49] starting simulation server on 0.0.0.0:8888...\n```\n\n```\n$ ./ping-pong.sh\n---> 13:58:12 creating 10 nodes\nCreated node01\nStarted node01\n...\nCreated node10\nStarted node10\n---> 13:58:13 connecting node01 to all other nodes\nConnected node01 to node02\n...\nConnected node01 to node10\n---> 13:58:14 done\n```\n\nUse the `--adapter` flag to choose the adapter type:\n\n```\n$ go run ping-pong.go --adapter exec\nINFO [08-15|14:01:14] using exec adapter                       tmpdir=/var/folders/k6/wpsgfg4n23ddbc6f5cnw5qg00000gn/T/p2p-example992833779\nINFO [08-15|14:01:14] starting simulation server on 0.0.0.0:8888...\n```\n"
  },
  {
    "path": "p2p/simulations/examples/ping-pong.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage main\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"os\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations/adapters\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\nvar adapterType = flag.String(\"adapter\", \"sim\", `node adapter to use (one of \"sim\", \"exec\" or \"docker\")`)\n\n// main() starts a simulation network which contains nodes running a simple\n// ping-pong protocol\nfunc main() {\n\tflag.Parse()\n\n\t// set the log level to Trace\n\tlog.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(false))))\n\n\t// register a single ping-pong service\n\tservices := map[string]adapters.ServiceFunc{\n\t\t\"ping-pong\": func(ctx *adapters.ServiceContext) (node.Service, error) {\n\t\t\treturn newPingPongService(ctx.Config.ID), nil\n\t\t},\n\t}\n\tadapters.RegisterServices(services)\n\n\t// create the NodeAdapter\n\tvar adapter adapters.NodeAdapter\n\n\tswitch *adapterType {\n\n\tcase \"sim\":\n\t\tlog.Info(\"using sim adapter\")\n\t\tadapter = adapters.NewSimAdapter(services)\n\n\tcase \"exec\":\n\t\ttmpdir, err := ioutil.TempDir(\"\", \"p2p-example\")\n\t\tif err != nil {\n\t\t\tlog.Crit(\"error creating temp dir\", \"err\", err)\n\t\t}\n\t\tdefer os.RemoveAll(tmpdir)\n\t\tlog.Info(\"using exec adapter\", \"tmpdir\", tmpdir)\n\t\tadapter = adapters.NewExecAdapter(tmpdir)\n\n\tcase \"docker\":\n\t\tlog.Info(\"using docker adapter\")\n\t\tvar err error\n\t\tadapter, err = adapters.NewDockerAdapter()\n\t\tif err != nil {\n\t\t\tlog.Crit(\"error creating docker adapter\", \"err\", err)\n\t\t}\n\n\tdefault:\n\t\tlog.Crit(fmt.Sprintf(\"unknown node adapter %q\", *adapterType))\n\t}\n\n\t// start the HTTP API\n\tlog.Info(\"starting simulation server on 0.0.0.0:8888...\")\n\tnetwork := simulations.NewNetwork(adapter, &simulations.NetworkConfig{\n\t\tDefaultService: \"ping-pong\",\n\t})\n\tif err := http.ListenAndServe(\":8888\", simulations.NewServer(network)); err != nil {\n\t\tlog.Crit(\"error starting simulation server\", \"err\", err)\n\t}\n}\n\n// pingPongService runs a ping-pong protocol between nodes where each node\n// sends a ping to all its connected peers every 10s and receives a pong in\n// return\ntype pingPongService struct {\n\tid       discover.NodeID\n\tlog      log.Logger\n\treceived int64\n}\n\nfunc newPingPongService(id discover.NodeID) *pingPongService {\n\treturn &pingPongService{\n\t\tid:  id,\n\t\tlog: log.New(\"node.id\", id),\n\t}\n}\n\nfunc (p *pingPongService) Protocols() []p2p.Protocol {\n\treturn []p2p.Protocol{{\n\t\tName:     \"ping-pong\",\n\t\tVersion:  1,\n\t\tLength:   2,\n\t\tRun:      p.Run,\n\t\tNodeInfo: p.Info,\n\t}}\n}\n\nfunc (p *pingPongService) APIs() []rpc.API {\n\treturn nil\n}\n\nfunc (p *pingPongService) Start(server *p2p.Server) error {\n\tp.log.Info(\"ping-pong service starting\")\n\treturn nil\n}\n\nfunc (p *pingPongService) Stop() error {\n\tp.log.Info(\"ping-pong service stopping\")\n\treturn nil\n}\n\nfunc (p *pingPongService) Info() interface{} {\n\treturn struct {\n\t\tReceived int64 `json:\"received\"`\n\t}{\n\t\tatomic.LoadInt64(&p.received),\n\t}\n}\n\nconst (\n\tpingMsgCode = iota\n\tpongMsgCode\n)\n\n// Run implements the ping-pong protocol which sends ping messages to the peer\n// at 10s intervals, and responds to pings with pong messages.\nfunc (p *pingPongService) Run(peer *p2p.Peer, rw p2p.MsgReadWriter) error {\n\tlog := p.log.New(\"peer.id\", peer.ID())\n\n\terrC := make(chan error)\n\tgo func() {\n\t\tfor range time.Tick(10 * time.Second) {\n\t\t\tlog.Info(\"sending ping\")\n\t\t\tif err := p2p.Send(rw, pingMsgCode, \"PING\"); err != nil {\n\t\t\t\terrC <- err\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\tgo func() {\n\t\tfor {\n\t\t\tmsg, err := rw.ReadMsg()\n\t\t\tif err != nil {\n\t\t\t\terrC <- err\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpayload, err := ioutil.ReadAll(msg.Payload)\n\t\t\tif err != nil {\n\t\t\t\terrC <- err\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlog.Info(\"received message\", \"msg.code\", msg.Code, \"msg.payload\", string(payload))\n\t\t\tatomic.AddInt64(&p.received, 1)\n\t\t\tif msg.Code == pingMsgCode {\n\t\t\t\tlog.Info(\"sending pong\")\n\t\t\t\tgo p2p.Send(rw, pongMsgCode, \"PONG\")\n\t\t\t}\n\t\t}\n\t}()\n\treturn <-errC\n}\n"
  },
  {
    "path": "p2p/simulations/examples/ping-pong.sh",
    "content": "#!/bin/bash\n#\n# Boot a ping-pong network simulation using the HTTP API started by ping-pong.go\n\nset -e\n\nmain() {\n  if ! which p2psim &>/dev/null; then\n    fail \"missing p2psim binary (you need to build cmd/p2psim and put it in \\$PATH)\"\n  fi\n\n  info \"creating 10 nodes\"\n  for i in $(seq 1 10); do\n    p2psim node create --name \"$(node_name $i)\"\n    p2psim node start \"$(node_name $i)\"\n  done\n\n  info \"connecting node01 to all other nodes\"\n  for i in $(seq 2 10); do\n    p2psim node connect \"node01\" \"$(node_name $i)\"\n  done\n\n  info \"done\"\n}\n\nnode_name() {\n  local num=$1\n  echo \"node$(printf '%02d' $num)\"\n}\n\ninfo() {\n  echo -e \"\\033[1;32m---> $(date +%H:%M:%S) ${@}\\033[0m\"\n}\n\nfail() {\n  echo -e \"\\033[1;31mERROR: ${@}\\033[0m\" >&2\n  exit 1\n}\n\nmain \"$@\"\n"
  },
  {
    "path": "p2p/simulations/http.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage simulations\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/julienschmidt/httprouter\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations/adapters\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"golang.org/x/net/websocket\"\n)\n\n// DefaultClient is the default simulation API client which expects the API\n// to be running at http://localhost:8888\nvar DefaultClient = NewClient(\"http://localhost:8888\")\n\n// Client is a client for the simulation HTTP API which supports creating\n// and managing simulation networks\ntype Client struct {\n\tURL string\n\n\tclient *http.Client\n}\n\n// NewClient returns a new simulation API client\nfunc NewClient(url string) *Client {\n\treturn &Client{\n\t\tURL:    url,\n\t\tclient: http.DefaultClient,\n\t}\n}\n\n// GetNetwork returns details of the network\nfunc (c *Client) GetNetwork() (*Network, error) {\n\tnetwork := &Network{}\n\treturn network, c.Get(\"/\", network)\n}\n\n// StartNetwork starts all existing nodes in the simulation network\nfunc (c *Client) StartNetwork() error {\n\treturn c.Post(\"/start\", nil, nil)\n}\n\n// StopNetwork stops all existing nodes in a simulation network\nfunc (c *Client) StopNetwork() error {\n\treturn c.Post(\"/stop\", nil, nil)\n}\n\n// CreateSnapshot creates a network snapshot\nfunc (c *Client) CreateSnapshot() (*Snapshot, error) {\n\tsnap := &Snapshot{}\n\treturn snap, c.Get(\"/snapshot\", snap)\n}\n\n// LoadSnapshot loads a snapshot into the network\nfunc (c *Client) LoadSnapshot(snap *Snapshot) error {\n\treturn c.Post(\"/snapshot\", snap, nil)\n}\n\n// SubscribeOpts is a collection of options to use when subscribing to network\n// events\ntype SubscribeOpts struct {\n\t// Current instructs the server to send events for existing nodes and\n\t// connections first\n\tCurrent bool\n\n\t// Filter instructs the server to only send a subset of message events\n\tFilter string\n}\n\n// SubscribeNetwork subscribes to network events which are sent from the server\n// as a server-sent-events stream, optionally receiving events for existing\n// nodes and connections and filtering message events\nfunc (c *Client) SubscribeNetwork(events chan *Event, opts SubscribeOpts) (event.Subscription, error) {\n\turl := fmt.Sprintf(\"%s/events?current=%t&filter=%s\", c.URL, opts.Current, opts.Filter)\n\treq, err := http.NewRequest(\"GET\", url, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Accept\", \"text/event-stream\")\n\tres, err := c.client.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif res.StatusCode != http.StatusOK {\n\t\tresponse, _ := ioutil.ReadAll(res.Body)\n\t\tres.Body.Close()\n\t\treturn nil, fmt.Errorf(\"unexpected HTTP status: %s: %s\", res.Status, response)\n\t}\n\n\t// define a producer function to pass to event.Subscription\n\t// which reads server-sent events from res.Body and sends\n\t// them to the events channel\n\tproducer := func(stop <-chan struct{}) error {\n\t\tdefer res.Body.Close()\n\n\t\t// read lines from res.Body in a goroutine so that we are\n\t\t// always reading from the stop channel\n\t\tlines := make(chan string)\n\t\terrC := make(chan error, 1)\n\t\tgo func() {\n\t\t\ts := bufio.NewScanner(res.Body)\n\t\t\tfor s.Scan() {\n\t\t\t\tselect {\n\t\t\t\tcase lines <- s.Text():\n\t\t\t\tcase <-stop:\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\terrC <- s.Err()\n\t\t}()\n\n\t\t// detect any lines which start with \"data:\", decode the data\n\t\t// into an event and send it to the events channel\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase line := <-lines:\n\t\t\t\tif !strings.HasPrefix(line, \"data:\") {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tdata := strings.TrimSpace(strings.TrimPrefix(line, \"data:\"))\n\t\t\t\tevent := &Event{}\n\t\t\t\tif err := json.Unmarshal([]byte(data), event); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"error decoding SSE event: %s\", err)\n\t\t\t\t}\n\t\t\t\tselect {\n\t\t\t\tcase events <- event:\n\t\t\t\tcase <-stop:\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\tcase err := <-errC:\n\t\t\t\treturn err\n\t\t\tcase <-stop:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\n\treturn event.NewSubscription(producer), nil\n}\n\n// GetNodes returns all nodes which exist in the network\nfunc (c *Client) GetNodes() ([]*p2p.NodeInfo, error) {\n\tvar nodes []*p2p.NodeInfo\n\treturn nodes, c.Get(\"/nodes\", &nodes)\n}\n\n// CreateNode creates a node in the network using the given configuration\nfunc (c *Client) CreateNode(config *adapters.NodeConfig) (*p2p.NodeInfo, error) {\n\tnode := &p2p.NodeInfo{}\n\treturn node, c.Post(\"/nodes\", config, node)\n}\n\n// GetNode returns details of a node\nfunc (c *Client) GetNode(nodeID string) (*p2p.NodeInfo, error) {\n\tnode := &p2p.NodeInfo{}\n\treturn node, c.Get(fmt.Sprintf(\"/nodes/%s\", nodeID), node)\n}\n\n// StartNode starts a node\nfunc (c *Client) StartNode(nodeID string) error {\n\treturn c.Post(fmt.Sprintf(\"/nodes/%s/start\", nodeID), nil, nil)\n}\n\n// StopNode stops a node\nfunc (c *Client) StopNode(nodeID string) error {\n\treturn c.Post(fmt.Sprintf(\"/nodes/%s/stop\", nodeID), nil, nil)\n}\n\n// ConnectNode connects a node to a peer node\nfunc (c *Client) ConnectNode(nodeID, peerID string) error {\n\treturn c.Post(fmt.Sprintf(\"/nodes/%s/conn/%s\", nodeID, peerID), nil, nil)\n}\n\n// DisconnectNode disconnects a node from a peer node\nfunc (c *Client) DisconnectNode(nodeID, peerID string) error {\n\treturn c.Delete(fmt.Sprintf(\"/nodes/%s/conn/%s\", nodeID, peerID))\n}\n\n// RPCClient returns an RPC client connected to a node\nfunc (c *Client) RPCClient(ctx context.Context, nodeID string) (*rpc.Client, error) {\n\tbaseURL := strings.Replace(c.URL, \"http\", \"ws\", 1)\n\treturn rpc.DialWebsocket(ctx, fmt.Sprintf(\"%s/nodes/%s/rpc\", baseURL, nodeID), \"\")\n}\n\n// Get performs a HTTP GET request decoding the resulting JSON response\n// into \"out\"\nfunc (c *Client) Get(path string, out interface{}) error {\n\treturn c.Send(\"GET\", path, nil, out)\n}\n\n// Post performs a HTTP POST request sending \"in\" as the JSON body and\n// decoding the resulting JSON response into \"out\"\nfunc (c *Client) Post(path string, in, out interface{}) error {\n\treturn c.Send(\"POST\", path, in, out)\n}\n\n// Delete performs a HTTP DELETE request\nfunc (c *Client) Delete(path string) error {\n\treturn c.Send(\"DELETE\", path, nil, nil)\n}\n\n// Send performs a HTTP request, sending \"in\" as the JSON request body and\n// decoding the JSON response into \"out\"\nfunc (c *Client) Send(method, path string, in, out interface{}) error {\n\tvar body []byte\n\tif in != nil {\n\t\tvar err error\n\t\tbody, err = json.Marshal(in)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treq, err := http.NewRequest(method, c.URL+path, bytes.NewReader(body))\n\tif err != nil {\n\t\treturn err\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\treq.Header.Set(\"Accept\", \"application/json\")\n\tres, err := c.client.Do(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer res.Body.Close()\n\tif res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated {\n\t\tresponse, _ := ioutil.ReadAll(res.Body)\n\t\treturn fmt.Errorf(\"unexpected HTTP status: %s: %s\", res.Status, response)\n\t}\n\tif out != nil {\n\t\tif err := json.NewDecoder(res.Body).Decode(out); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Server is an HTTP server providing an API to manage a simulation network\ntype Server struct {\n\trouter     *httprouter.Router\n\tnetwork    *Network\n\tmockerStop chan struct{} // when set, stops the current mocker\n\tmockerMtx  sync.Mutex    // synchronises access to the mockerStop field\n}\n\n// NewServer returns a new simulation API server\nfunc NewServer(network *Network) *Server {\n\ts := &Server{\n\t\trouter:  httprouter.New(),\n\t\tnetwork: network,\n\t}\n\n\ts.OPTIONS(\"/\", s.Options)\n\ts.GET(\"/\", s.GetNetwork)\n\ts.POST(\"/start\", s.StartNetwork)\n\ts.POST(\"/stop\", s.StopNetwork)\n\ts.POST(\"/mocker/start\", s.StartMocker)\n\ts.POST(\"/mocker/stop\", s.StopMocker)\n\ts.GET(\"/mocker\", s.GetMockers)\n\ts.POST(\"/reset\", s.ResetNetwork)\n\ts.GET(\"/events\", s.StreamNetworkEvents)\n\ts.GET(\"/snapshot\", s.CreateSnapshot)\n\ts.POST(\"/snapshot\", s.LoadSnapshot)\n\ts.POST(\"/nodes\", s.CreateNode)\n\ts.GET(\"/nodes\", s.GetNodes)\n\ts.GET(\"/nodes/:nodeid\", s.GetNode)\n\ts.POST(\"/nodes/:nodeid/start\", s.StartNode)\n\ts.POST(\"/nodes/:nodeid/stop\", s.StopNode)\n\ts.POST(\"/nodes/:nodeid/conn/:peerid\", s.ConnectNode)\n\ts.DELETE(\"/nodes/:nodeid/conn/:peerid\", s.DisconnectNode)\n\ts.GET(\"/nodes/:nodeid/rpc\", s.NodeRPC)\n\n\treturn s\n}\n\n// GetNetwork returns details of the network\nfunc (s *Server) GetNetwork(w http.ResponseWriter, req *http.Request) {\n\ts.JSON(w, http.StatusOK, s.network)\n}\n\n// StartNetwork starts all nodes in the network\nfunc (s *Server) StartNetwork(w http.ResponseWriter, req *http.Request) {\n\tif err := s.network.StartAll(); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tw.WriteHeader(http.StatusOK)\n}\n\n// StopNetwork stops all nodes in the network\nfunc (s *Server) StopNetwork(w http.ResponseWriter, req *http.Request) {\n\tif err := s.network.StopAll(); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tw.WriteHeader(http.StatusOK)\n}\n\n// StartMocker starts the mocker node simulation\nfunc (s *Server) StartMocker(w http.ResponseWriter, req *http.Request) {\n\ts.mockerMtx.Lock()\n\tdefer s.mockerMtx.Unlock()\n\tif s.mockerStop != nil {\n\t\thttp.Error(w, \"mocker already running\", http.StatusInternalServerError)\n\t\treturn\n\t}\n\tmockerType := req.FormValue(\"mocker-type\")\n\tmockerFn := LookupMocker(mockerType)\n\tif mockerFn == nil {\n\t\thttp.Error(w, fmt.Sprintf(\"unknown mocker type %q\", mockerType), http.StatusBadRequest)\n\t\treturn\n\t}\n\tnodeCount, err := strconv.Atoi(req.FormValue(\"node-count\"))\n\tif err != nil {\n\t\thttp.Error(w, \"invalid node-count provided\", http.StatusBadRequest)\n\t\treturn\n\t}\n\ts.mockerStop = make(chan struct{})\n\tgo mockerFn(s.network, s.mockerStop, nodeCount)\n\n\tw.WriteHeader(http.StatusOK)\n}\n\n// StopMocker stops the mocker node simulation\nfunc (s *Server) StopMocker(w http.ResponseWriter, req *http.Request) {\n\ts.mockerMtx.Lock()\n\tdefer s.mockerMtx.Unlock()\n\tif s.mockerStop == nil {\n\t\thttp.Error(w, \"stop channel not initialized\", http.StatusInternalServerError)\n\t\treturn\n\t}\n\tclose(s.mockerStop)\n\ts.mockerStop = nil\n\n\tw.WriteHeader(http.StatusOK)\n}\n\n// GetMockerList returns a list of available mockers\nfunc (s *Server) GetMockers(w http.ResponseWriter, req *http.Request) {\n\n\tlist := GetMockerList()\n\ts.JSON(w, http.StatusOK, list)\n}\n\n// ResetNetwork resets all properties of a network to its initial (empty) state\nfunc (s *Server) ResetNetwork(w http.ResponseWriter, req *http.Request) {\n\ts.network.Reset()\n\n\tw.WriteHeader(http.StatusOK)\n}\n\n// StreamNetworkEvents streams network events as a server-sent-events stream\nfunc (s *Server) StreamNetworkEvents(w http.ResponseWriter, req *http.Request) {\n\tevents := make(chan *Event)\n\tsub := s.network.events.Subscribe(events)\n\tdefer sub.Unsubscribe()\n\n\t// stop the stream if the client goes away\n\tvar clientGone <-chan bool\n\tif cn, ok := w.(http.CloseNotifier); ok {\n\t\tclientGone = cn.CloseNotify()\n\t}\n\n\t// write writes the given event and data to the stream like:\n\t//\n\t// event: <event>\n\t// data: <data>\n\t//\n\twrite := func(event, data string) {\n\t\tfmt.Fprintf(w, \"event: %s\\n\", event)\n\t\tfmt.Fprintf(w, \"data: %s\\n\\n\", data)\n\t\tif fw, ok := w.(http.Flusher); ok {\n\t\t\tfw.Flush()\n\t\t}\n\t}\n\twriteEvent := func(event *Event) error {\n\t\tdata, err := json.Marshal(event)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\twrite(\"network\", string(data))\n\t\treturn nil\n\t}\n\twriteErr := func(err error) {\n\t\twrite(\"error\", err.Error())\n\t}\n\n\t// check if filtering has been requested\n\tvar filters MsgFilters\n\tif filterParam := req.URL.Query().Get(\"filter\"); filterParam != \"\" {\n\t\tvar err error\n\t\tfilters, err = NewMsgFilters(filterParam)\n\t\tif err != nil {\n\t\t\thttp.Error(w, err.Error(), http.StatusBadRequest)\n\t\t\treturn\n\t\t}\n\t}\n\n\tw.Header().Set(\"Content-Type\", \"text/event-stream; charset=utf-8\")\n\tw.WriteHeader(http.StatusOK)\n\tfmt.Fprintf(w, \"\\n\\n\")\n\tif fw, ok := w.(http.Flusher); ok {\n\t\tfw.Flush()\n\t}\n\n\t// optionally send the existing nodes and connections\n\tif req.URL.Query().Get(\"current\") == \"true\" {\n\t\tsnap, err := s.network.Snapshot()\n\t\tif err != nil {\n\t\t\twriteErr(err)\n\t\t\treturn\n\t\t}\n\t\tfor _, node := range snap.Nodes {\n\t\t\tevent := NewEvent(&node.Node)\n\t\t\tif err := writeEvent(event); err != nil {\n\t\t\t\twriteErr(err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tfor _, conn := range snap.Conns {\n\t\t\tevent := NewEvent(&conn)\n\t\t\tif err := writeEvent(event); err != nil {\n\t\t\t\twriteErr(err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tfor {\n\t\tselect {\n\t\tcase event := <-events:\n\t\t\t// only send message events which match the filters\n\t\t\tif event.Msg != nil && !filters.Match(event.Msg) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif err := writeEvent(event); err != nil {\n\t\t\t\twriteErr(err)\n\t\t\t\treturn\n\t\t\t}\n\t\tcase <-clientGone:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// NewMsgFilters constructs a collection of message filters from a URL query\n// parameter.\n//\n// The parameter is expected to be a dash-separated list of individual filters,\n// each having the format '<proto>:<codes>', where <proto> is the name of a\n// protocol and <codes> is a comma-separated list of message codes.\n//\n// A message code of '*' or '-1' is considered a wildcard and matches any code.\nfunc NewMsgFilters(filterParam string) (MsgFilters, error) {\n\tfilters := make(MsgFilters)\n\tfor _, filter := range strings.Split(filterParam, \"-\") {\n\t\tprotoCodes := strings.SplitN(filter, \":\", 2)\n\t\tif len(protoCodes) != 2 || protoCodes[0] == \"\" || protoCodes[1] == \"\" {\n\t\t\treturn nil, fmt.Errorf(\"invalid message filter: %s\", filter)\n\t\t}\n\t\tproto := protoCodes[0]\n\t\tfor _, code := range strings.Split(protoCodes[1], \",\") {\n\t\t\tif code == \"*\" || code == \"-1\" {\n\t\t\t\tfilters[MsgFilter{Proto: proto, Code: -1}] = struct{}{}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tn, err := strconv.ParseUint(code, 10, 64)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid message code: %s\", code)\n\t\t\t}\n\t\t\tfilters[MsgFilter{Proto: proto, Code: int64(n)}] = struct{}{}\n\t\t}\n\t}\n\treturn filters, nil\n}\n\n// MsgFilters is a collection of filters which are used to filter message\n// events\ntype MsgFilters map[MsgFilter]struct{}\n\n// Match checks if the given message matches any of the filters\nfunc (m MsgFilters) Match(msg *Msg) bool {\n\t// check if there is a wildcard filter for the message's protocol\n\tif _, ok := m[MsgFilter{Proto: msg.Protocol, Code: -1}]; ok {\n\t\treturn true\n\t}\n\n\t// check if there is a filter for the message's protocol and code\n\tif _, ok := m[MsgFilter{Proto: msg.Protocol, Code: int64(msg.Code)}]; ok {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// MsgFilter is used to filter message events based on protocol and message\n// code\ntype MsgFilter struct {\n\t// Proto is matched against a message's protocol\n\tProto string\n\n\t// Code is matched against a message's code, with -1 matching all codes\n\tCode int64\n}\n\n// CreateSnapshot creates a network snapshot\nfunc (s *Server) CreateSnapshot(w http.ResponseWriter, req *http.Request) {\n\tsnap, err := s.network.Snapshot()\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\ts.JSON(w, http.StatusOK, snap)\n}\n\n// LoadSnapshot loads a snapshot into the network\nfunc (s *Server) LoadSnapshot(w http.ResponseWriter, req *http.Request) {\n\tsnap := &Snapshot{}\n\tif err := json.NewDecoder(req.Body).Decode(snap); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tif err := s.network.Load(snap); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\ts.JSON(w, http.StatusOK, s.network)\n}\n\n// CreateNode creates a node in the network using the given configuration\nfunc (s *Server) CreateNode(w http.ResponseWriter, req *http.Request) {\n\tconfig := &adapters.NodeConfig{}\n\n\terr := json.NewDecoder(req.Body).Decode(config)\n\tif err != nil && err != io.EOF {\n\t\thttp.Error(w, err.Error(), http.StatusBadRequest)\n\t\treturn\n\t}\n\n\tnode, err := s.network.NewNodeWithConfig(config)\n\tif err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\ts.JSON(w, http.StatusCreated, node.NodeInfo())\n}\n\n// GetNodes returns all nodes which exist in the network\nfunc (s *Server) GetNodes(w http.ResponseWriter, req *http.Request) {\n\tnodes := s.network.GetNodes()\n\n\tinfos := make([]*p2p.NodeInfo, len(nodes))\n\tfor i, node := range nodes {\n\t\tinfos[i] = node.NodeInfo()\n\t}\n\n\ts.JSON(w, http.StatusOK, infos)\n}\n\n// GetNode returns details of a node\nfunc (s *Server) GetNode(w http.ResponseWriter, req *http.Request) {\n\tnode := req.Context().Value(\"node\").(*Node)\n\n\ts.JSON(w, http.StatusOK, node.NodeInfo())\n}\n\n// StartNode starts a node\nfunc (s *Server) StartNode(w http.ResponseWriter, req *http.Request) {\n\tnode := req.Context().Value(\"node\").(*Node)\n\n\tif err := s.network.Start(node.ID()); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\ts.JSON(w, http.StatusOK, node.NodeInfo())\n}\n\n// StopNode stops a node\nfunc (s *Server) StopNode(w http.ResponseWriter, req *http.Request) {\n\tnode := req.Context().Value(\"node\").(*Node)\n\n\tif err := s.network.Stop(node.ID()); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\ts.JSON(w, http.StatusOK, node.NodeInfo())\n}\n\n// ConnectNode connects a node to a peer node\nfunc (s *Server) ConnectNode(w http.ResponseWriter, req *http.Request) {\n\tnode := req.Context().Value(\"node\").(*Node)\n\tpeer := req.Context().Value(\"peer\").(*Node)\n\n\tif err := s.network.Connect(node.ID(), peer.ID()); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\ts.JSON(w, http.StatusOK, node.NodeInfo())\n}\n\n// DisconnectNode disconnects a node from a peer node\nfunc (s *Server) DisconnectNode(w http.ResponseWriter, req *http.Request) {\n\tnode := req.Context().Value(\"node\").(*Node)\n\tpeer := req.Context().Value(\"peer\").(*Node)\n\n\tif err := s.network.Disconnect(node.ID(), peer.ID()); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\ts.JSON(w, http.StatusOK, node.NodeInfo())\n}\n\n// Options responds to the OPTIONS HTTP method by returning a 200 OK response\n// with the \"Access-Control-Allow-Headers\" header set to \"Content-Type\"\nfunc (s *Server) Options(w http.ResponseWriter, req *http.Request) {\n\tw.Header().Set(\"Access-Control-Allow-Headers\", \"Content-Type\")\n\tw.WriteHeader(http.StatusOK)\n}\n\n// NodeRPC forwards RPC requests to a node in the network via a WebSocket\n// connection\nfunc (s *Server) NodeRPC(w http.ResponseWriter, req *http.Request) {\n\tnode := req.Context().Value(\"node\").(*Node)\n\n\thandler := func(conn *websocket.Conn) {\n\t\tnode.ServeRPC(conn)\n\t}\n\n\twebsocket.Server{Handler: handler}.ServeHTTP(w, req)\n}\n\n// ServeHTTP implements the http.Handler interface by delegating to the\n// underlying httprouter.Router\nfunc (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {\n\ts.router.ServeHTTP(w, req)\n}\n\n// GET registers a handler for GET requests to a particular path\nfunc (s *Server) GET(path string, handle http.HandlerFunc) {\n\ts.router.GET(path, s.wrapHandler(handle))\n}\n\n// POST registers a handler for POST requests to a particular path\nfunc (s *Server) POST(path string, handle http.HandlerFunc) {\n\ts.router.POST(path, s.wrapHandler(handle))\n}\n\n// DELETE registers a handler for DELETE requests to a particular path\nfunc (s *Server) DELETE(path string, handle http.HandlerFunc) {\n\ts.router.DELETE(path, s.wrapHandler(handle))\n}\n\n// OPTIONS registers a handler for OPTIONS requests to a particular path\nfunc (s *Server) OPTIONS(path string, handle http.HandlerFunc) {\n\ts.router.OPTIONS(\"/*path\", s.wrapHandler(handle))\n}\n\n// JSON sends \"data\" as a JSON HTTP response\nfunc (s *Server) JSON(w http.ResponseWriter, status int, data interface{}) {\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(status)\n\tjson.NewEncoder(w).Encode(data)\n}\n\n// wrapHandler returns a httprouter.Handle which wraps a http.HandlerFunc by\n// populating request.Context with any objects from the URL params\nfunc (s *Server) wrapHandler(handler http.HandlerFunc) httprouter.Handle {\n\treturn func(w http.ResponseWriter, req *http.Request, params httprouter.Params) {\n\t\tw.Header().Set(\"Access-Control-Allow-Origin\", \"*\")\n\t\tw.Header().Set(\"Access-Control-Allow-Methods\", \"GET, POST, PUT, DELETE, OPTIONS\")\n\n\t\tctx := context.Background()\n\n\t\tif id := params.ByName(\"nodeid\"); id != \"\" {\n\t\t\tvar node *Node\n\t\t\tif nodeID, err := discover.HexID(id); err == nil {\n\t\t\t\tnode = s.network.GetNode(nodeID)\n\t\t\t} else {\n\t\t\t\tnode = s.network.GetNodeByName(id)\n\t\t\t}\n\t\t\tif node == nil {\n\t\t\t\thttp.NotFound(w, req)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tctx = context.WithValue(ctx, \"node\", node)\n\t\t}\n\n\t\tif id := params.ByName(\"peerid\"); id != \"\" {\n\t\t\tvar peer *Node\n\t\t\tif peerID, err := discover.HexID(id); err == nil {\n\t\t\t\tpeer = s.network.GetNode(peerID)\n\t\t\t} else {\n\t\t\t\tpeer = s.network.GetNodeByName(id)\n\t\t\t}\n\t\t\tif peer == nil {\n\t\t\t\thttp.NotFound(w, req)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tctx = context.WithValue(ctx, \"peer\", peer)\n\t\t}\n\n\t\thandler(w, req.WithContext(ctx))\n\t}\n}\n"
  },
  {
    "path": "p2p/simulations/mocker.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package simulations simulates p2p networks.\n// A mocker simulates starting and stopping real nodes in a network.\npackage simulations\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations/adapters\"\n)\n\n//a map of mocker names to its function\nvar mockerList = map[string]func(net *Network, quit chan struct{}, nodeCount int){\n\t\"startStop\":     startStop,\n\t\"probabilistic\": probabilistic,\n\t\"boot\":          boot,\n}\n\n//Lookup a mocker by its name, returns the mockerFn\nfunc LookupMocker(mockerType string) func(net *Network, quit chan struct{}, nodeCount int) {\n\treturn mockerList[mockerType]\n}\n\n//Get a list of mockers (keys of the map)\n//Useful for frontend to build available mocker selection\nfunc GetMockerList() []string {\n\tlist := make([]string, 0, len(mockerList))\n\tfor k := range mockerList {\n\t\tlist = append(list, k)\n\t}\n\treturn list\n}\n\n//The boot mockerFn only connects the node in a ring and doesn't do anything else\nfunc boot(net *Network, quit chan struct{}, nodeCount int) {\n\t_, err := connectNodesInRing(net, nodeCount)\n\tif err != nil {\n\t\tpanic(\"Could not startup node network for mocker\")\n\t}\n}\n\n//The startStop mockerFn stops and starts nodes in a defined period (ticker)\nfunc startStop(net *Network, quit chan struct{}, nodeCount int) {\n\tnodes, err := connectNodesInRing(net, nodeCount)\n\tif err != nil {\n\t\tpanic(\"Could not startup node network for mocker\")\n\t}\n\ttick := time.NewTicker(10 * time.Second)\n\tdefer tick.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-quit:\n\t\t\tlog.Info(\"Terminating simulation loop\")\n\t\t\treturn\n\t\tcase <-tick.C:\n\t\t\tid := nodes[rand.Intn(len(nodes))]\n\t\t\tlog.Info(\"stopping node\", \"id\", id)\n\t\t\tif err := net.Stop(id); err != nil {\n\t\t\t\tlog.Error(\"error stopping node\", \"id\", id, \"err\", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\tlog.Info(\"Terminating simulation loop\")\n\t\t\t\treturn\n\t\t\tcase <-time.After(3 * time.Second):\n\t\t\t}\n\n\t\t\tlog.Debug(\"starting node\", \"id\", id)\n\t\t\tif err := net.Start(id); err != nil {\n\t\t\t\tlog.Error(\"error starting node\", \"id\", id, \"err\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\n//The probabilistic mocker func has a more probabilistic pattern\n//(the implementation could probably be improved):\n//nodes are connected in a ring, then a varying number of random nodes is selected,\n//mocker then stops and starts them in random intervals, and continues the loop\nfunc probabilistic(net *Network, quit chan struct{}, nodeCount int) {\n\tnodes, err := connectNodesInRing(net, nodeCount)\n\tif err != nil {\n\t\tselect {\n\t\tcase <-quit:\n\t\t\t//error may be due to abortion of mocking; so the quit channel is closed\n\t\t\treturn\n\t\tdefault:\n\t\t\tpanic(\"Could not startup node network for mocker\")\n\t\t}\n\t}\n\tfor {\n\t\tselect {\n\t\tcase <-quit:\n\t\t\tlog.Info(\"Terminating simulation loop\")\n\t\t\treturn\n\t\tdefault:\n\t\t}\n\t\tvar lowid, highid int\n\t\tvar wg sync.WaitGroup\n\t\trandWait := time.Duration(rand.Intn(5000)+1000) * time.Millisecond\n\t\trand1 := rand.Intn(nodeCount - 1)\n\t\trand2 := rand.Intn(nodeCount - 1)\n\t\tif rand1 < rand2 {\n\t\t\tlowid = rand1\n\t\t\thighid = rand2\n\t\t} else if rand1 > rand2 {\n\t\t\thighid = rand1\n\t\t\tlowid = rand2\n\t\t} else {\n\t\t\tif rand1 == 0 {\n\t\t\t\trand2 = 9\n\t\t\t} else if rand1 == 9 {\n\t\t\t\trand1 = 0\n\t\t\t}\n\t\t\tlowid = rand1\n\t\t\thighid = rand2\n\t\t}\n\t\tvar steps = highid - lowid\n\t\twg.Add(steps)\n\t\tfor i := lowid; i < highid; i++ {\n\t\t\tselect {\n\t\t\tcase <-quit:\n\t\t\t\tlog.Info(\"Terminating simulation loop\")\n\t\t\t\treturn\n\t\t\tcase <-time.After(randWait):\n\t\t\t}\n\t\t\tlog.Debug(fmt.Sprintf(\"node %v shutting down\", nodes[i]))\n\t\t\terr := net.Stop(nodes[i])\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"Error stopping node\", \"node\", nodes[i])\n\t\t\t\twg.Done()\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tgo func(id discover.NodeID) {\n\t\t\t\ttime.Sleep(randWait)\n\t\t\t\terr := net.Start(id)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"Error starting node\", \"node\", id)\n\t\t\t\t}\n\t\t\t\twg.Done()\n\t\t\t}(nodes[i])\n\t\t}\n\t\twg.Wait()\n\t}\n\n}\n\n//connect nodeCount number of nodes in a ring\nfunc connectNodesInRing(net *Network, nodeCount int) ([]discover.NodeID, error) {\n\tids := make([]discover.NodeID, nodeCount)\n\tfor i := 0; i < nodeCount; i++ {\n\t\tconf := adapters.RandomNodeConfig()\n\t\tnode, err := net.NewNodeWithConfig(conf)\n\t\tif err != nil {\n\t\t\tlog.Error(\"Error creating a node!\", \"err\", err)\n\t\t\treturn nil, err\n\t\t}\n\t\tids[i] = node.ID()\n\t}\n\n\tfor _, id := range ids {\n\t\tif err := net.Start(id); err != nil {\n\t\t\tlog.Error(\"Error starting a node!\", \"err\", err)\n\t\t\treturn nil, err\n\t\t}\n\t\tlog.Debug(fmt.Sprintf(\"node %v starting up\", id))\n\t}\n\tfor i, id := range ids {\n\t\tpeerID := ids[(i+1)%len(ids)]\n\t\tif err := net.Connect(id, peerID); err != nil {\n\t\t\tlog.Error(\"Error connecting a node to a peer!\", \"err\", err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn ids, nil\n}\n"
  },
  {
    "path": "p2p/simulations/network.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage simulations\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations/adapters\"\n)\n\nvar DialBanTimeout = 200 * time.Millisecond\n\n// NetworkConfig defines configuration options for starting a Network\ntype NetworkConfig struct {\n\tID             string `json:\"id\"`\n\tDefaultService string `json:\"default_service,omitempty\"`\n}\n\n// Network models a p2p simulation network which consists of a collection of\n// simulated nodes and the connections which exist between them.\n//\n// The Network has a single NodeAdapter which is responsible for actually\n// starting nodes and connecting them together.\n//\n// The Network emits events when nodes are started and stopped, when they are\n// connected and disconnected, and also when messages are sent between nodes.\ntype Network struct {\n\tNetworkConfig\n\n\tNodes   []*Node `json:\"nodes\"`\n\tnodeMap map[discover.NodeID]int\n\n\tConns   []*Conn `json:\"conns\"`\n\tconnMap map[string]int\n\n\tnodeAdapter adapters.NodeAdapter\n\tevents      event.Feed\n\tlock        sync.RWMutex\n\tquitc       chan struct{}\n}\n\n// NewNetwork returns a Network which uses the given NodeAdapter and NetworkConfig\nfunc NewNetwork(nodeAdapter adapters.NodeAdapter, conf *NetworkConfig) *Network {\n\treturn &Network{\n\t\tNetworkConfig: *conf,\n\t\tnodeAdapter:   nodeAdapter,\n\t\tnodeMap:       make(map[discover.NodeID]int),\n\t\tconnMap:       make(map[string]int),\n\t\tquitc:         make(chan struct{}),\n\t}\n}\n\n// Events returns the output event feed of the Network.\nfunc (net *Network) Events() *event.Feed {\n\treturn &net.events\n}\n\n// NewNodeWithConfig adds a new node to the network with the given config,\n// returning an error if a node with the same ID or name already exists\nfunc (net *Network) NewNodeWithConfig(conf *adapters.NodeConfig) (*Node, error) {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\n\tif conf.Reachable == nil {\n\t\tconf.Reachable = func(otherID discover.NodeID) bool {\n\t\t\t_, err := net.InitConn(conf.ID, otherID)\n\t\t\tif err != nil && bytes.Compare(conf.ID.Bytes(), otherID.Bytes()) < 0 {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// check the node doesn't already exist\n\tif node := net.getNode(conf.ID); node != nil {\n\t\treturn nil, fmt.Errorf(\"node with ID %q already exists\", conf.ID)\n\t}\n\tif node := net.getNodeByName(conf.Name); node != nil {\n\t\treturn nil, fmt.Errorf(\"node with name %q already exists\", conf.Name)\n\t}\n\n\t// if no services are configured, use the default service\n\tif len(conf.Services) == 0 {\n\t\tconf.Services = []string{net.DefaultService}\n\t}\n\n\t// use the NodeAdapter to create the node\n\tadapterNode, err := net.nodeAdapter.NewNode(conf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnode := &Node{\n\t\tNode:   adapterNode,\n\t\tConfig: conf,\n\t}\n\tlog.Trace(fmt.Sprintf(\"node %v created\", conf.ID))\n\tnet.nodeMap[conf.ID] = len(net.Nodes)\n\tnet.Nodes = append(net.Nodes, node)\n\n\t// emit a \"control\" event\n\tnet.events.Send(ControlEvent(node))\n\n\treturn node, nil\n}\n\n// Config returns the network configuration\nfunc (net *Network) Config() *NetworkConfig {\n\treturn &net.NetworkConfig\n}\n\n// StartAll starts all nodes in the network\nfunc (net *Network) StartAll() error {\n\tfor _, node := range net.Nodes {\n\t\tif node.Up {\n\t\t\tcontinue\n\t\t}\n\t\tif err := net.Start(node.ID()); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// StopAll stops all nodes in the network\nfunc (net *Network) StopAll() error {\n\tfor _, node := range net.Nodes {\n\t\tif !node.Up {\n\t\t\tcontinue\n\t\t}\n\t\tif err := net.Stop(node.ID()); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Start starts the node with the given ID\nfunc (net *Network) Start(id discover.NodeID) error {\n\treturn net.startWithSnapshots(id, nil)\n}\n\n// startWithSnapshots starts the node with the given ID using the give\n// snapshots\nfunc (net *Network) startWithSnapshots(id discover.NodeID, snapshots map[string][]byte) error {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\tnode := net.getNode(id)\n\tif node == nil {\n\t\treturn fmt.Errorf(\"node %v does not exist\", id)\n\t}\n\tif node.Up {\n\t\treturn fmt.Errorf(\"node %v already up\", id)\n\t}\n\tlog.Trace(fmt.Sprintf(\"starting node %v: %v using %v\", id, node.Up, net.nodeAdapter.Name()))\n\tif err := node.Start(snapshots); err != nil {\n\t\tlog.Warn(fmt.Sprintf(\"start up failed: %v\", err))\n\t\treturn err\n\t}\n\tnode.Up = true\n\tlog.Info(fmt.Sprintf(\"started node %v: %v\", id, node.Up))\n\n\tnet.events.Send(NewEvent(node))\n\n\t// subscribe to peer events\n\tclient, err := node.Client()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error getting rpc client  for node %v: %s\", id, err)\n\t}\n\tevents := make(chan *p2p.PeerEvent)\n\tsub, err := client.Subscribe(context.Background(), \"admin\", events, \"peerEvents\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error getting peer events for node %v: %s\", id, err)\n\t}\n\tgo net.watchPeerEvents(id, events, sub)\n\treturn nil\n}\n\n// watchPeerEvents reads peer events from the given channel and emits\n// corresponding network events\nfunc (net *Network) watchPeerEvents(id discover.NodeID, events chan *p2p.PeerEvent, sub event.Subscription) {\n\tdefer func() {\n\t\tsub.Unsubscribe()\n\n\t\t// assume the node is now down\n\t\tnet.lock.Lock()\n\t\tdefer net.lock.Unlock()\n\t\tnode := net.getNode(id)\n\t\tif node == nil {\n\t\t\tlog.Error(\"Can not find node for id\", \"id\", id)\n\t\t\treturn\n\t\t}\n\t\tnode.Up = false\n\t\tnet.events.Send(NewEvent(node))\n\t}()\n\tfor {\n\t\tselect {\n\t\tcase event, ok := <-events:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpeer := event.Peer\n\t\t\tswitch event.Type {\n\n\t\t\tcase p2p.PeerEventTypeAdd:\n\t\t\t\tnet.DidConnect(id, peer)\n\n\t\t\tcase p2p.PeerEventTypeDrop:\n\t\t\t\tnet.DidDisconnect(id, peer)\n\n\t\t\tcase p2p.PeerEventTypeMsgSend:\n\t\t\t\tnet.DidSend(id, peer, event.Protocol, *event.MsgCode)\n\n\t\t\tcase p2p.PeerEventTypeMsgRecv:\n\t\t\t\tnet.DidReceive(peer, id, event.Protocol, *event.MsgCode)\n\n\t\t\t}\n\n\t\tcase err := <-sub.Err():\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(fmt.Sprintf(\"error getting peer events for node %v\", id), \"err\", err)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Stop stops the node with the given ID\nfunc (net *Network) Stop(id discover.NodeID) error {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\tnode := net.getNode(id)\n\tif node == nil {\n\t\treturn fmt.Errorf(\"node %v does not exist\", id)\n\t}\n\tif !node.Up {\n\t\treturn fmt.Errorf(\"node %v already down\", id)\n\t}\n\tif err := node.Stop(); err != nil {\n\t\treturn err\n\t}\n\tnode.Up = false\n\tlog.Info(fmt.Sprintf(\"stop node %v: %v\", id, node.Up))\n\n\tnet.events.Send(ControlEvent(node))\n\treturn nil\n}\n\n// Connect connects two nodes together by calling the \"admin_addPeer\" RPC\n// method on the \"one\" node so that it connects to the \"other\" node\nfunc (net *Network) Connect(oneID, otherID discover.NodeID) error {\n\tlog.Debug(fmt.Sprintf(\"connecting %s to %s\", oneID, otherID))\n\tconn, err := net.InitConn(oneID, otherID)\n\tif err != nil {\n\t\treturn err\n\t}\n\tclient, err := conn.one.Client()\n\tif err != nil {\n\t\treturn err\n\t}\n\tnet.events.Send(ControlEvent(conn))\n\treturn client.Call(nil, \"admin_addPeer\", string(conn.other.Addr()))\n}\n\n// Disconnect disconnects two nodes by calling the \"admin_removePeer\" RPC\n// method on the \"one\" node so that it disconnects from the \"other\" node\nfunc (net *Network) Disconnect(oneID, otherID discover.NodeID) error {\n\tconn := net.GetConn(oneID, otherID)\n\tif conn == nil {\n\t\treturn fmt.Errorf(\"connection between %v and %v does not exist\", oneID, otherID)\n\t}\n\tif !conn.Up {\n\t\treturn fmt.Errorf(\"%v and %v already disconnected\", oneID, otherID)\n\t}\n\tclient, err := conn.one.Client()\n\tif err != nil {\n\t\treturn err\n\t}\n\tnet.events.Send(ControlEvent(conn))\n\treturn client.Call(nil, \"admin_removePeer\", string(conn.other.Addr()))\n}\n\n// DidConnect tracks the fact that the \"one\" node connected to the \"other\" node\nfunc (net *Network) DidConnect(one, other discover.NodeID) error {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\tconn, err := net.getOrCreateConn(one, other)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"connection between %v and %v does not exist\", one, other)\n\t}\n\tif conn.Up {\n\t\treturn fmt.Errorf(\"%v and %v already connected\", one, other)\n\t}\n\tconn.Up = true\n\tnet.events.Send(NewEvent(conn))\n\treturn nil\n}\n\n// DidDisconnect tracks the fact that the \"one\" node disconnected from the\n// \"other\" node\nfunc (net *Network) DidDisconnect(one, other discover.NodeID) error {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\tconn := net.getConn(one, other)\n\tif conn == nil {\n\t\treturn fmt.Errorf(\"connection between %v and %v does not exist\", one, other)\n\t}\n\tif !conn.Up {\n\t\treturn fmt.Errorf(\"%v and %v already disconnected\", one, other)\n\t}\n\tconn.Up = false\n\tconn.initiated = time.Now().Add(-DialBanTimeout)\n\tnet.events.Send(NewEvent(conn))\n\treturn nil\n}\n\n// DidSend tracks the fact that \"sender\" sent a message to \"receiver\"\nfunc (net *Network) DidSend(sender, receiver discover.NodeID, proto string, code uint64) error {\n\tmsg := &Msg{\n\t\tOne:      sender,\n\t\tOther:    receiver,\n\t\tProtocol: proto,\n\t\tCode:     code,\n\t\tReceived: false,\n\t}\n\tnet.events.Send(NewEvent(msg))\n\treturn nil\n}\n\n// DidReceive tracks the fact that \"receiver\" received a message from \"sender\"\nfunc (net *Network) DidReceive(sender, receiver discover.NodeID, proto string, code uint64) error {\n\tmsg := &Msg{\n\t\tOne:      sender,\n\t\tOther:    receiver,\n\t\tProtocol: proto,\n\t\tCode:     code,\n\t\tReceived: true,\n\t}\n\tnet.events.Send(NewEvent(msg))\n\treturn nil\n}\n\n// GetNode gets the node with the given ID, returning nil if the node does not\n// exist\nfunc (net *Network) GetNode(id discover.NodeID) *Node {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\treturn net.getNode(id)\n}\n\n// GetNode gets the node with the given name, returning nil if the node does\n// not exist\nfunc (net *Network) GetNodeByName(name string) *Node {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\treturn net.getNodeByName(name)\n}\n\n// GetNodes returns the existing nodes\nfunc (net *Network) GetNodes() (nodes []*Node) {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\n\tnodes = append(nodes, net.Nodes...)\n\treturn nodes\n}\n\nfunc (net *Network) getNode(id discover.NodeID) *Node {\n\ti, found := net.nodeMap[id]\n\tif !found {\n\t\treturn nil\n\t}\n\treturn net.Nodes[i]\n}\n\nfunc (net *Network) getNodeByName(name string) *Node {\n\tfor _, node := range net.Nodes {\n\t\tif node.Config.Name == name {\n\t\t\treturn node\n\t\t}\n\t}\n\treturn nil\n}\n\n// GetConn returns the connection which exists between \"one\" and \"other\"\n// regardless of which node initiated the connection\nfunc (net *Network) GetConn(oneID, otherID discover.NodeID) *Conn {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\treturn net.getConn(oneID, otherID)\n}\n\n// GetOrCreateConn is like GetConn but creates the connection if it doesn't\n// already exist\nfunc (net *Network) GetOrCreateConn(oneID, otherID discover.NodeID) (*Conn, error) {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\treturn net.getOrCreateConn(oneID, otherID)\n}\n\nfunc (net *Network) getOrCreateConn(oneID, otherID discover.NodeID) (*Conn, error) {\n\tif conn := net.getConn(oneID, otherID); conn != nil {\n\t\treturn conn, nil\n\t}\n\n\tone := net.getNode(oneID)\n\tif one == nil {\n\t\treturn nil, fmt.Errorf(\"node %v does not exist\", oneID)\n\t}\n\tother := net.getNode(otherID)\n\tif other == nil {\n\t\treturn nil, fmt.Errorf(\"node %v does not exist\", otherID)\n\t}\n\tconn := &Conn{\n\t\tOne:   oneID,\n\t\tOther: otherID,\n\t\tone:   one,\n\t\tother: other,\n\t}\n\tlabel := ConnLabel(oneID, otherID)\n\tnet.connMap[label] = len(net.Conns)\n\tnet.Conns = append(net.Conns, conn)\n\treturn conn, nil\n}\n\nfunc (net *Network) getConn(oneID, otherID discover.NodeID) *Conn {\n\tlabel := ConnLabel(oneID, otherID)\n\ti, found := net.connMap[label]\n\tif !found {\n\t\treturn nil\n\t}\n\treturn net.Conns[i]\n}\n\n// InitConn(one, other) retrieves the connectiton model for the connection between\n// peers one and other, or creates a new one if it does not exist\n// the order of nodes does not matter, i.e., Conn(i,j) == Conn(j, i)\n// it checks if the connection is already up, and if the nodes are running\n// NOTE:\n// it also checks whether there has been recent attempt to connect the peers\n// this is cheating as the simulation is used as an oracle and know about\n// remote peers attempt to connect to a node which will then not initiate the connection\nfunc (net *Network) InitConn(oneID, otherID discover.NodeID) (*Conn, error) {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\tif oneID == otherID {\n\t\treturn nil, fmt.Errorf(\"refusing to connect to self %v\", oneID)\n\t}\n\tconn, err := net.getOrCreateConn(oneID, otherID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif conn.Up {\n\t\treturn nil, fmt.Errorf(\"%v and %v already connected\", oneID, otherID)\n\t}\n\tif time.Since(conn.initiated) < DialBanTimeout {\n\t\treturn nil, fmt.Errorf(\"connection between %v and %v recently attempted\", oneID, otherID)\n\t}\n\n\terr = conn.nodesUp()\n\tif err != nil {\n\t\tlog.Trace(fmt.Sprintf(\"nodes not up: %v\", err))\n\t\treturn nil, fmt.Errorf(\"nodes not up: %v\", err)\n\t}\n\tlog.Debug(\"InitConn - connection initiated\")\n\tconn.initiated = time.Now()\n\treturn conn, nil\n}\n\n// Shutdown stops all nodes in the network and closes the quit channel\nfunc (net *Network) Shutdown() {\n\tfor _, node := range net.Nodes {\n\t\tlog.Debug(fmt.Sprintf(\"stopping node %s\", node.ID().TerminalString()))\n\t\tif err := node.Stop(); err != nil {\n\t\t\tlog.Warn(fmt.Sprintf(\"error stopping node %s\", node.ID().TerminalString()), \"err\", err)\n\t\t}\n\t}\n\tclose(net.quitc)\n}\n\n//Reset resets all network properties:\n//emtpies the nodes and the connection list\nfunc (net *Network) Reset() {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\n\t//re-initialize the maps\n\tnet.connMap = make(map[string]int)\n\tnet.nodeMap = make(map[discover.NodeID]int)\n\n\tnet.Nodes = nil\n\tnet.Conns = nil\n}\n\n// Node is a wrapper around adapters.Node which is used to track the status\n// of a node in the network\ntype Node struct {\n\tadapters.Node `json:\"-\"`\n\n\t// Config if the config used to created the node\n\tConfig *adapters.NodeConfig `json:\"config\"`\n\n\t// Up tracks whether or not the node is running\n\tUp bool `json:\"up\"`\n}\n\n// ID returns the ID of the node\nfunc (n *Node) ID() discover.NodeID {\n\treturn n.Config.ID\n}\n\n// String returns a log-friendly string\nfunc (n *Node) String() string {\n\treturn fmt.Sprintf(\"Node %v\", n.ID().TerminalString())\n}\n\n// NodeInfo returns information about the node\nfunc (n *Node) NodeInfo() *p2p.NodeInfo {\n\t// avoid a panic if the node is not started yet\n\tif n.Node == nil {\n\t\treturn nil\n\t}\n\tinfo := n.Node.NodeInfo()\n\tinfo.Name = n.Config.Name\n\treturn info\n}\n\n// MarshalJSON implements the json.Marshaler interface so that the encoded\n// JSON includes the NodeInfo\nfunc (n *Node) MarshalJSON() ([]byte, error) {\n\treturn json.Marshal(struct {\n\t\tInfo   *p2p.NodeInfo        `json:\"info,omitempty\"`\n\t\tConfig *adapters.NodeConfig `json:\"config,omitempty\"`\n\t\tUp     bool                 `json:\"up\"`\n\t}{\n\t\tInfo:   n.NodeInfo(),\n\t\tConfig: n.Config,\n\t\tUp:     n.Up,\n\t})\n}\n\n// Conn represents a connection between two nodes in the network\ntype Conn struct {\n\t// One is the node which initiated the connection\n\tOne discover.NodeID `json:\"one\"`\n\n\t// Other is the node which the connection was made to\n\tOther discover.NodeID `json:\"other\"`\n\n\t// Up tracks whether or not the connection is active\n\tUp bool `json:\"up\"`\n\t// Registers when the connection was grabbed to dial\n\tinitiated time.Time\n\n\tone   *Node\n\tother *Node\n}\n\n// nodesUp returns whether both nodes are currently up\nfunc (c *Conn) nodesUp() error {\n\tif !c.one.Up {\n\t\treturn fmt.Errorf(\"one %v is not up\", c.One)\n\t}\n\tif !c.other.Up {\n\t\treturn fmt.Errorf(\"other %v is not up\", c.Other)\n\t}\n\treturn nil\n}\n\n// String returns a log-friendly string\nfunc (c *Conn) String() string {\n\treturn fmt.Sprintf(\"Conn %v->%v\", c.One.TerminalString(), c.Other.TerminalString())\n}\n\n// Msg represents a p2p message sent between two nodes in the network\ntype Msg struct {\n\tOne      discover.NodeID `json:\"one\"`\n\tOther    discover.NodeID `json:\"other\"`\n\tProtocol string          `json:\"protocol\"`\n\tCode     uint64          `json:\"code\"`\n\tReceived bool            `json:\"received\"`\n}\n\n// String returns a log-friendly string\nfunc (m *Msg) String() string {\n\treturn fmt.Sprintf(\"Msg(%d) %v->%v\", m.Code, m.One.TerminalString(), m.Other.TerminalString())\n}\n\n// ConnLabel generates a deterministic string which represents a connection\n// between two nodes, used to compare if two connections are between the same\n// nodes\nfunc ConnLabel(source, target discover.NodeID) string {\n\tvar first, second discover.NodeID\n\tif bytes.Compare(source.Bytes(), target.Bytes()) > 0 {\n\t\tfirst = target\n\t\tsecond = source\n\t} else {\n\t\tfirst = source\n\t\tsecond = target\n\t}\n\treturn fmt.Sprintf(\"%v-%v\", first, second)\n}\n\n// Snapshot represents the state of a network at a single point in time and can\n// be used to restore the state of a network\ntype Snapshot struct {\n\tNodes []NodeSnapshot `json:\"nodes,omitempty\"`\n\tConns []Conn         `json:\"conns,omitempty\"`\n}\n\n// NodeSnapshot represents the state of a node in the network\ntype NodeSnapshot struct {\n\tNode Node `json:\"node,omitempty\"`\n\n\t// Snapshots is arbitrary data gathered from calling node.Snapshots()\n\tSnapshots map[string][]byte `json:\"snapshots,omitempty\"`\n}\n\n// Snapshot creates a network snapshot\nfunc (net *Network) Snapshot() (*Snapshot, error) {\n\tnet.lock.Lock()\n\tdefer net.lock.Unlock()\n\tsnap := &Snapshot{\n\t\tNodes: make([]NodeSnapshot, len(net.Nodes)),\n\t\tConns: make([]Conn, len(net.Conns)),\n\t}\n\tfor i, node := range net.Nodes {\n\t\tsnap.Nodes[i] = NodeSnapshot{Node: *node}\n\t\tif !node.Up {\n\t\t\tcontinue\n\t\t}\n\t\tsnapshots, err := node.Snapshots()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tsnap.Nodes[i].Snapshots = snapshots\n\t}\n\tfor i, conn := range net.Conns {\n\t\tsnap.Conns[i] = *conn\n\t}\n\treturn snap, nil\n}\n\n// Load loads a network snapshot\nfunc (net *Network) Load(snap *Snapshot) error {\n\tfor _, n := range snap.Nodes {\n\t\tif _, err := net.NewNodeWithConfig(n.Node.Config); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !n.Node.Up {\n\t\t\tcontinue\n\t\t}\n\t\tif err := net.startWithSnapshots(n.Node.Config.ID, n.Snapshots); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tfor _, conn := range snap.Conns {\n\n\t\tif !net.GetNode(conn.One).Up || !net.GetNode(conn.Other).Up {\n\t\t\t//in this case, at least one of the nodes of a connection is not up,\n\t\t\t//so it would result in the snapshot `Load` to fail\n\t\t\tcontinue\n\t\t}\n\t\tif err := net.Connect(conn.One, conn.Other); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Subscribe reads control events from a channel and executes them\nfunc (net *Network) Subscribe(events chan *Event) {\n\tfor {\n\t\tselect {\n\t\tcase event, ok := <-events:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif event.Control {\n\t\t\t\tnet.executeControlEvent(event)\n\t\t\t}\n\t\tcase <-net.quitc:\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (net *Network) executeControlEvent(event *Event) {\n\tlog.Trace(\"execute control event\", \"type\", event.Type, \"event\", event)\n\tswitch event.Type {\n\tcase EventTypeNode:\n\t\tif err := net.executeNodeEvent(event); err != nil {\n\t\t\tlog.Error(\"error executing node event\", \"event\", event, \"err\", err)\n\t\t}\n\tcase EventTypeConn:\n\t\tif err := net.executeConnEvent(event); err != nil {\n\t\t\tlog.Error(\"error executing conn event\", \"event\", event, \"err\", err)\n\t\t}\n\tcase EventTypeMsg:\n\t\tlog.Warn(\"ignoring control msg event\")\n\t}\n}\n\nfunc (net *Network) executeNodeEvent(e *Event) error {\n\tif !e.Node.Up {\n\t\treturn net.Stop(e.Node.ID())\n\t}\n\n\tif _, err := net.NewNodeWithConfig(e.Node.Config); err != nil {\n\t\treturn err\n\t}\n\treturn net.Start(e.Node.ID())\n}\n\nfunc (net *Network) executeConnEvent(e *Event) error {\n\tif e.Conn.Up {\n\t\treturn net.Connect(e.Conn.One, e.Conn.Other)\n\t} else {\n\t\treturn net.Disconnect(e.Conn.One, e.Conn.Other)\n\t}\n}\n"
  },
  {
    "path": "p2p/simulations/pipes/pipes.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage pipes\n\nimport (\n\t\"net\"\n)\n\n// NetPipe wraps net.Pipe in a signature returning an error\nfunc NetPipe() (net.Conn, net.Conn, error) {\n\tp1, p2 := net.Pipe()\n\treturn p1, p2, nil\n}\n\n// TCPPipe creates an in process full duplex pipe based on a localhost TCP socket\nfunc TCPPipe() (net.Conn, net.Conn, error) {\n\tl, err := net.Listen(\"tcp\", \"127.0.0.1:0\")\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tdefer l.Close()\n\n\tvar aconn net.Conn\n\taerr := make(chan error, 1)\n\tgo func() {\n\t\tvar err error\n\t\taconn, err = l.Accept()\n\t\taerr <- err\n\t}()\n\n\tdconn, err := net.Dial(\"tcp\", l.Addr().String())\n\tif err != nil {\n\t\t<-aerr\n\t\treturn nil, nil, err\n\t}\n\tif err := <-aerr; err != nil {\n\t\tdconn.Close()\n\t\treturn nil, nil, err\n\t}\n\treturn aconn, dconn, nil\n}\n"
  },
  {
    "path": "p2p/simulations/simulation.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage simulations\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n)\n\n// Simulation provides a framework for running actions in a simulated network\n// and then waiting for expectations to be met\ntype Simulation struct {\n\tnetwork *Network\n}\n\n// NewSimulation returns a new simulation which runs in the given network\nfunc NewSimulation(network *Network) *Simulation {\n\treturn &Simulation{\n\t\tnetwork: network,\n\t}\n}\n\n// Run performs a step of the simulation by performing the step's action and\n// then waiting for the step's expectation to be met\nfunc (s *Simulation) Run(ctx context.Context, step *Step) (result *StepResult) {\n\tresult = newStepResult()\n\n\tresult.StartedAt = time.Now()\n\tdefer func() { result.FinishedAt = time.Now() }()\n\n\t// watch network events for the duration of the step\n\tstop := s.watchNetwork(result)\n\tdefer stop()\n\n\t// perform the action\n\tif err := step.Action(ctx); err != nil {\n\t\tresult.Error = err\n\t\treturn\n\t}\n\n\t// wait for all node expectations to either pass, error or timeout\n\tnodes := make(map[discover.NodeID]struct{}, len(step.Expect.Nodes))\n\tfor _, id := range step.Expect.Nodes {\n\t\tnodes[id] = struct{}{}\n\t}\n\tfor len(result.Passes) < len(nodes) {\n\t\tselect {\n\t\tcase id := <-step.Trigger:\n\t\t\t// skip if we aren't checking the node\n\t\t\tif _, ok := nodes[id]; !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// skip if the node has already passed\n\t\t\tif _, ok := result.Passes[id]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// run the node expectation check\n\t\t\tpass, err := step.Expect.Check(ctx, id)\n\t\t\tif err != nil {\n\t\t\t\tresult.Error = err\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pass {\n\t\t\t\tresult.Passes[id] = time.Now()\n\t\t\t}\n\t\tcase <-ctx.Done():\n\t\t\tresult.Error = ctx.Err()\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc (s *Simulation) watchNetwork(result *StepResult) func() {\n\tstop := make(chan struct{})\n\tdone := make(chan struct{})\n\tevents := make(chan *Event)\n\tsub := s.network.Events().Subscribe(events)\n\tgo func() {\n\t\tdefer close(done)\n\t\tdefer sub.Unsubscribe()\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase event := <-events:\n\t\t\t\tresult.NetworkEvents = append(result.NetworkEvents, event)\n\t\t\tcase <-stop:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\treturn func() {\n\t\tclose(stop)\n\t\t<-done\n\t}\n}\n\ntype Step struct {\n\t// Action is the action to perform for this step\n\tAction func(context.Context) error\n\n\t// Trigger is a channel which receives node ids and triggers an\n\t// expectation check for that node\n\tTrigger chan discover.NodeID\n\n\t// Expect is the expectation to wait for when performing this step\n\tExpect *Expectation\n}\n\ntype Expectation struct {\n\t// Nodes is a list of nodes to check\n\tNodes []discover.NodeID\n\n\t// Check checks whether a given node meets the expectation\n\tCheck func(context.Context, discover.NodeID) (bool, error)\n}\n\nfunc newStepResult() *StepResult {\n\treturn &StepResult{\n\t\tPasses: make(map[discover.NodeID]time.Time),\n\t}\n}\n\ntype StepResult struct {\n\t// Error is the error encountered whilst running the step\n\tError error\n\n\t// StartedAt is the time the step started\n\tStartedAt time.Time\n\n\t// FinishedAt is the time the step finished\n\tFinishedAt time.Time\n\n\t// Passes are the timestamps of the successful node expectations\n\tPasses map[discover.NodeID]time.Time\n\n\t// NetworkEvents are the network events which occurred during the step\n\tNetworkEvents []*Event\n}\n"
  },
  {
    "path": "p2p/testing/peerpool.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage testing\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n)\n\ntype TestPeer interface {\n\tID() discover.NodeID\n\tDrop(error)\n}\n\n// TestPeerPool is an example peerPool to demonstrate registration of peer connections\ntype TestPeerPool struct {\n\tlock  sync.Mutex\n\tpeers map[discover.NodeID]TestPeer\n}\n\nfunc NewTestPeerPool() *TestPeerPool {\n\treturn &TestPeerPool{peers: make(map[discover.NodeID]TestPeer)}\n}\n\nfunc (p *TestPeerPool) Add(peer TestPeer) {\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\tlog.Trace(fmt.Sprintf(\"pp add peer  %v\", peer.ID()))\n\tp.peers[peer.ID()] = peer\n\n}\n\nfunc (p *TestPeerPool) Remove(peer TestPeer) {\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\tdelete(p.peers, peer.ID())\n}\n\nfunc (p *TestPeerPool) Has(id discover.NodeID) bool {\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\t_, ok := p.peers[id]\n\treturn ok\n}\n\nfunc (p *TestPeerPool) Get(id discover.NodeID) TestPeer {\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\treturn p.peers[id]\n}\n"
  },
  {
    "path": "p2p/testing/protocolsession.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage testing\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations/adapters\"\n)\n\nvar errTimedOut = errors.New(\"timed out\")\n\n// ProtocolSession is a quasi simulation of a pivot node running\n// a service and a number of dummy peers that can send (trigger) or\n// receive (expect) messages\ntype ProtocolSession struct {\n\tServer  *p2p.Server\n\tIDs     []discover.NodeID\n\tadapter *adapters.SimAdapter\n\tevents  chan *p2p.PeerEvent\n}\n\n// Exchange is the basic units of protocol tests\n// the triggers and expects in the arrays are run immediately and asynchronously\n// thus one cannot have multiple expects for the SAME peer with DIFFERENT message types\n// because it's unpredictable which expect will receive which message\n// (with expect #1 and #2, messages might be sent #2 and #1, and both expects will complain about wrong message code)\n// an exchange is defined on a session\ntype Exchange struct {\n\tLabel    string\n\tTriggers []Trigger\n\tExpects  []Expect\n\tTimeout  time.Duration\n}\n\n// Trigger is part of the exchange, incoming message for the pivot node\n// sent by a peer\ntype Trigger struct {\n\tMsg     interface{}     // type of message to be sent\n\tCode    uint64          // code of message is given\n\tPeer    discover.NodeID // the peer to send the message to\n\tTimeout time.Duration   // timeout duration for the sending\n}\n\n// Expect is part of an exchange, outgoing message from the pivot node\n// received by a peer\ntype Expect struct {\n\tMsg     interface{}     // type of message to expect\n\tCode    uint64          // code of message is now given\n\tPeer    discover.NodeID // the peer that expects the message\n\tTimeout time.Duration   // timeout duration for receiving\n}\n\n// Disconnect represents a disconnect event, used and checked by TestDisconnected\ntype Disconnect struct {\n\tPeer  discover.NodeID // discconnected peer\n\tError error           // disconnect reason\n}\n\n// trigger sends messages from peers\nfunc (s *ProtocolSession) trigger(trig Trigger) error {\n\tsimNode, ok := s.adapter.GetNode(trig.Peer)\n\tif !ok {\n\t\treturn fmt.Errorf(\"trigger: peer %v does not exist (1- %v)\", trig.Peer, len(s.IDs))\n\t}\n\tmockNode, ok := simNode.Services()[0].(*mockNode)\n\tif !ok {\n\t\treturn fmt.Errorf(\"trigger: peer %v is not a mock\", trig.Peer)\n\t}\n\n\terrc := make(chan error)\n\n\tgo func() {\n\t\tlog.Trace(fmt.Sprintf(\"trigger %v (%v)....\", trig.Msg, trig.Code))\n\t\terrc <- mockNode.Trigger(&trig)\n\t\tlog.Trace(fmt.Sprintf(\"triggered %v (%v)\", trig.Msg, trig.Code))\n\t}()\n\n\tt := trig.Timeout\n\tif t == time.Duration(0) {\n\t\tt = 1000 * time.Millisecond\n\t}\n\tselect {\n\tcase err := <-errc:\n\t\treturn err\n\tcase <-time.After(t):\n\t\treturn fmt.Errorf(\"timout expecting %v to send to peer %v\", trig.Msg, trig.Peer)\n\t}\n}\n\n// expect checks an expectation of a message sent out by the pivot node\nfunc (s *ProtocolSession) expect(exps []Expect) error {\n\t// construct a map of expectations for each node\n\tpeerExpects := make(map[discover.NodeID][]Expect)\n\tfor _, exp := range exps {\n\t\tif exp.Msg == nil {\n\t\t\treturn errors.New(\"no message to expect\")\n\t\t}\n\t\tpeerExpects[exp.Peer] = append(peerExpects[exp.Peer], exp)\n\t}\n\n\t// construct a map of mockNodes for each node\n\tmockNodes := make(map[discover.NodeID]*mockNode)\n\tfor nodeID := range peerExpects {\n\t\tsimNode, ok := s.adapter.GetNode(nodeID)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"trigger: peer %v does not exist (1- %v)\", nodeID, len(s.IDs))\n\t\t}\n\t\tmockNode, ok := simNode.Services()[0].(*mockNode)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"trigger: peer %v is not a mock\", nodeID)\n\t\t}\n\t\tmockNodes[nodeID] = mockNode\n\t}\n\n\t// done chanell cancels all created goroutines when function returns\n\tdone := make(chan struct{})\n\tdefer close(done)\n\t// errc catches the first error from\n\terrc := make(chan error)\n\n\twg := &sync.WaitGroup{}\n\twg.Add(len(mockNodes))\n\tfor nodeID, mockNode := range mockNodes {\n\t\tnodeID := nodeID\n\t\tmockNode := mockNode\n\t\tgo func() {\n\t\t\tdefer wg.Done()\n\n\t\t\t// Sum all Expect timeouts to give the maximum\n\t\t\t// time for all expectations to finish.\n\t\t\t// mockNode.Expect checks all received messages against\n\t\t\t// a list of expected messages and timeout for each\n\t\t\t// of them can not be checked separately.\n\t\t\tvar t time.Duration\n\t\t\tfor _, exp := range peerExpects[nodeID] {\n\t\t\t\tif exp.Timeout == time.Duration(0) {\n\t\t\t\t\tt += 2000 * time.Millisecond\n\t\t\t\t} else {\n\t\t\t\t\tt += exp.Timeout\n\t\t\t\t}\n\t\t\t}\n\t\t\talarm := time.NewTimer(t)\n\t\t\tdefer alarm.Stop()\n\n\t\t\t// expectErrc is used to check if error returned\n\t\t\t// from mockNode.Expect is not nil and to send it to\n\t\t\t// errc only in that case.\n\t\t\t// done channel will be closed when function\n\t\t\texpectErrc := make(chan error)\n\t\t\tgo func() {\n\t\t\t\tselect {\n\t\t\t\tcase expectErrc <- mockNode.Expect(peerExpects[nodeID]...):\n\t\t\t\tcase <-done:\n\t\t\t\tcase <-alarm.C:\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\tselect {\n\t\t\tcase err := <-expectErrc:\n\t\t\t\tif err != nil {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase errc <- err:\n\t\t\t\t\tcase <-done:\n\t\t\t\t\tcase <-alarm.C:\n\t\t\t\t\t\terrc <- errTimedOut\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase <-done:\n\t\t\tcase <-alarm.C:\n\t\t\t\terrc <- errTimedOut\n\t\t\t}\n\n\t\t}()\n\t}\n\n\tgo func() {\n\t\twg.Wait()\n\t\t// close errc when all goroutines finish to return nill err from errc\n\t\tclose(errc)\n\t}()\n\n\treturn <-errc\n}\n\n// TestExchanges tests a series of exchanges against the session\nfunc (s *ProtocolSession) TestExchanges(exchanges ...Exchange) error {\n\tfor i, e := range exchanges {\n\t\tif err := s.testExchange(e); err != nil {\n\t\t\treturn fmt.Errorf(\"exchange #%d %q: %v\", i, e.Label, err)\n\t\t}\n\t\tlog.Trace(fmt.Sprintf(\"exchange #%d %q: run successfully\", i, e.Label))\n\t}\n\treturn nil\n}\n\n// testExchange tests a single Exchange.\n// Default timeout value is 2 seconds.\nfunc (s *ProtocolSession) testExchange(e Exchange) error {\n\terrc := make(chan error)\n\tdone := make(chan struct{})\n\tdefer close(done)\n\n\tgo func() {\n\t\tfor _, trig := range e.Triggers {\n\t\t\terr := s.trigger(trig)\n\t\t\tif err != nil {\n\t\t\t\terrc <- err\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tselect {\n\t\tcase errc <- s.expect(e.Expects):\n\t\tcase <-done:\n\t\t}\n\t}()\n\n\t// time out globally or finish when all expectations satisfied\n\tt := e.Timeout\n\tif t == 0 {\n\t\tt = 2000 * time.Millisecond\n\t}\n\talarm := time.NewTimer(t)\n\tselect {\n\tcase err := <-errc:\n\t\treturn err\n\tcase <-alarm.C:\n\t\treturn errTimedOut\n\t}\n}\n\n// TestDisconnected tests the disconnections given as arguments\n// the disconnect structs describe what disconnect error is expected on which peer\nfunc (s *ProtocolSession) TestDisconnected(disconnects ...*Disconnect) error {\n\texpects := make(map[discover.NodeID]error)\n\tfor _, disconnect := range disconnects {\n\t\texpects[disconnect.Peer] = disconnect.Error\n\t}\n\n\ttimeout := time.After(time.Second)\n\tfor len(expects) > 0 {\n\t\tselect {\n\t\tcase event := <-s.events:\n\t\t\tif event.Type != p2p.PeerEventTypeDrop {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\texpectErr, ok := expects[event.Peer]\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif !(expectErr == nil && event.Error == \"\" || expectErr != nil && expectErr.Error() == event.Error) {\n\t\t\t\treturn fmt.Errorf(\"unexpected error on peer %v. expected '%v', got '%v'\", event.Peer, expectErr, event.Error)\n\t\t\t}\n\t\t\tdelete(expects, event.Peer)\n\t\tcase <-timeout:\n\t\t\treturn fmt.Errorf(\"timed out waiting for peers to disconnect\")\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "p2p/testing/protocoltester.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\nthe p2p/testing package provides a unit test scheme to check simple\nprotocol message exchanges with one pivot node and a number of dummy peers\nThe pivot test node runs a node.Service, the dummy peers run a mock node\nthat can be used to send and receive messages\n*/\n\npackage testing\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations\"\n\t\"github.com/sero-cash/go-sero/p2p/simulations/adapters\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// ProtocolTester is the tester environment used for unit testing protocol\n// message exchanges. It uses p2p/simulations framework\ntype ProtocolTester struct {\n\t*ProtocolSession\n\tnetwork *simulations.Network\n}\n\n// NewProtocolTester constructs a new ProtocolTester\n// it takes as argument the pivot node id, the number of dummy peers and the\n// protocol run function called on a peer connection by the p2p server\nfunc NewProtocolTester(t *testing.T, id discover.NodeID, n int, run func(*p2p.Peer, p2p.MsgReadWriter) error) *ProtocolTester {\n\tservices := adapters.Services{\n\t\t\"test\": func(ctx *adapters.ServiceContext) (node.Service, error) {\n\t\t\treturn &testNode{run}, nil\n\t\t},\n\t\t\"mock\": func(ctx *adapters.ServiceContext) (node.Service, error) {\n\t\t\treturn newMockNode(), nil\n\t\t},\n\t}\n\tadapter := adapters.NewSimAdapter(services)\n\tnet := simulations.NewNetwork(adapter, &simulations.NetworkConfig{})\n\tif _, err := net.NewNodeWithConfig(&adapters.NodeConfig{\n\t\tID:              id,\n\t\tEnableMsgEvents: true,\n\t\tServices:        []string{\"test\"},\n\t}); err != nil {\n\t\tpanic(err.Error())\n\t}\n\tif err := net.Start(id); err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tnode := net.GetNode(id).Node.(*adapters.SimNode)\n\tpeers := make([]*adapters.NodeConfig, n)\n\tpeerIDs := make([]discover.NodeID, n)\n\tfor i := 0; i < n; i++ {\n\t\tpeers[i] = adapters.RandomNodeConfig()\n\t\tpeers[i].Services = []string{\"mock\"}\n\t\tpeerIDs[i] = peers[i].ID\n\t}\n\tevents := make(chan *p2p.PeerEvent, 1000)\n\tnode.SubscribeEvents(events)\n\tps := &ProtocolSession{\n\t\tServer:  node.Server(),\n\t\tIDs:     peerIDs,\n\t\tadapter: adapter,\n\t\tevents:  events,\n\t}\n\tself := &ProtocolTester{\n\t\tProtocolSession: ps,\n\t\tnetwork:         net,\n\t}\n\n\tself.Connect(id, peers...)\n\n\treturn self\n}\n\n// Stop stops the p2p server\nfunc (t *ProtocolTester) Stop() error {\n\tt.Server.Stop()\n\treturn nil\n}\n\n// Connect brings up the remote peer node and connects it using the\n// p2p/simulations network connection with the in memory network adapter\nfunc (t *ProtocolTester) Connect(selfID discover.NodeID, peers ...*adapters.NodeConfig) {\n\tfor _, peer := range peers {\n\t\tlog.Trace(fmt.Sprintf(\"start node %v\", peer.ID))\n\t\tif _, err := t.network.NewNodeWithConfig(peer); err != nil {\n\t\t\tpanic(fmt.Sprintf(\"error starting peer %v: %v\", peer.ID, err))\n\t\t}\n\t\tif err := t.network.Start(peer.ID); err != nil {\n\t\t\tpanic(fmt.Sprintf(\"error starting peer %v: %v\", peer.ID, err))\n\t\t}\n\t\tlog.Trace(fmt.Sprintf(\"connect to %v\", peer.ID))\n\t\tif err := t.network.Connect(selfID, peer.ID); err != nil {\n\t\t\tpanic(fmt.Sprintf(\"error connecting to peer %v: %v\", peer.ID, err))\n\t\t}\n\t}\n\n}\n\n// testNode wraps a protocol run function and implements the node.Service\n// interface\ntype testNode struct {\n\trun func(*p2p.Peer, p2p.MsgReadWriter) error\n}\n\nfunc (t *testNode) Protocols() []p2p.Protocol {\n\treturn []p2p.Protocol{{\n\t\tLength: 100,\n\t\tRun:    t.run,\n\t}}\n}\n\nfunc (t *testNode) APIs() []rpc.API {\n\treturn nil\n}\n\nfunc (t *testNode) Start(server *p2p.Server) error {\n\treturn nil\n}\n\nfunc (t *testNode) Stop() error {\n\treturn nil\n}\n\n// mockNode is a testNode which doesn't actually run a protocol, instead\n// exposing channels so that tests can manually trigger and expect certain\n// messages\ntype mockNode struct {\n\ttestNode\n\n\ttrigger  chan *Trigger\n\texpect   chan []Expect\n\terr      chan error\n\tstop     chan struct{}\n\tstopOnce sync.Once\n}\n\nfunc newMockNode() *mockNode {\n\tmock := &mockNode{\n\t\ttrigger: make(chan *Trigger),\n\t\texpect:  make(chan []Expect),\n\t\terr:     make(chan error),\n\t\tstop:    make(chan struct{}),\n\t}\n\tmock.testNode.run = mock.Run\n\treturn mock\n}\n\n// Run is a protocol run function which just loops waiting for tests to\n// instruct it to either trigger or expect a message from the peer\nfunc (m *mockNode) Run(peer *p2p.Peer, rw p2p.MsgReadWriter) error {\n\tfor {\n\t\tselect {\n\t\tcase trig := <-m.trigger:\n\t\t\twmsg := Wrap(trig.Msg)\n\t\t\tm.err <- p2p.Send(rw, trig.Code, wmsg)\n\t\tcase exps := <-m.expect:\n\t\t\tm.err <- expectMsgs(rw, exps)\n\t\tcase <-m.stop:\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc (m *mockNode) Trigger(trig *Trigger) error {\n\tm.trigger <- trig\n\treturn <-m.err\n}\n\nfunc (m *mockNode) Expect(exp ...Expect) error {\n\tm.expect <- exp\n\treturn <-m.err\n}\n\nfunc (m *mockNode) Stop() error {\n\tm.stopOnce.Do(func() { close(m.stop) })\n\treturn nil\n}\n\nfunc expectMsgs(rw p2p.MsgReadWriter, exps []Expect) error {\n\tmatched := make([]bool, len(exps))\n\tfor {\n\t\tmsg, err := rw.ReadMsg()\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t\tactualContent, err := ioutil.ReadAll(msg.Payload)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvar found bool\n\t\tfor i, exp := range exps {\n\t\t\tif exp.Code == msg.Code && bytes.Equal(actualContent, mustEncodeMsg(Wrap(exp.Msg))) {\n\t\t\t\tif matched[i] {\n\t\t\t\t\treturn fmt.Errorf(\"message #%d received two times\", i)\n\t\t\t\t}\n\t\t\t\tmatched[i] = true\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\texpected := make([]string, 0)\n\t\t\tfor i, exp := range exps {\n\t\t\t\tif matched[i] {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\texpected = append(expected, fmt.Sprintf(\"code %d payload %x\", exp.Code, mustEncodeMsg(Wrap(exp.Msg))))\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"unexpected message code %d payload %x, expected %s\", msg.Code, actualContent, strings.Join(expected, \" or \"))\n\t\t}\n\t\tdone := true\n\t\tfor _, m := range matched {\n\t\t\tif !m {\n\t\t\t\tdone = false\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif done {\n\t\t\treturn nil\n\t\t}\n\t}\n\tfor i, m := range matched {\n\t\tif !m {\n\t\t\treturn fmt.Errorf(\"expected message #%d not received\", i)\n\t\t}\n\t}\n\treturn nil\n}\n\n// mustEncodeMsg uses rlp to encode a message.\n// In case of error it panics.\nfunc mustEncodeMsg(msg interface{}) []byte {\n\tcontentEnc, err := rlp.EncodeToBytes(msg)\n\tif err != nil {\n\t\tpanic(\"content encode error: \" + err.Error())\n\t}\n\treturn contentEnc\n}\n\ntype WrappedMsg struct {\n\tContext []byte\n\tSize    uint32\n\tPayload []byte\n}\n\nfunc Wrap(msg interface{}) interface{} {\n\tdata, _ := rlp.EncodeToBytes(msg)\n\treturn &WrappedMsg{\n\t\tSize:    uint32(len(data)),\n\t\tPayload: data,\n\t}\n}\n"
  },
  {
    "path": "params/bootnodes.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage params\n\n// BetanetBootnodes are the enode URLs of the P2P bootstrap nodes running on\n// the main Ethereum network.\nvar BetanetBootnodes = []string{\n\t\"snode://ac19bbec0ede5b3cf6215280d8cf4482d5c3c46f22f616cc0cd4806dd3e1dc04e6a6c04dd925e6069c2c4c684083b474ed8592a6f83a23121bc0ab48b91e09cc@132.232.83.212:53719\",\n\t\"snode://e87468ac7bf9bf9846ee4841ee8a1b861a7983baf1d2f11e1db3b1b642adc72f39ef1f24f1c873562fa143caa2a906227769ef5d3cc4b98689d04ca050ce0747@192.144.145.154:53719\",\n\t\"snode://c4c6aa3e3c73c1d86d53f904bb82ffbbc50edd75530487f053d37bbcf75e27ca4c7ec215f56274cf60176b5d7fb896c9bd54354ba2fedb7d3adb35efc053cd14@13.251.221.90:53719\",\n\t\"snode://a4a0e1dfe2a0643eb81adae1c6b49dee4fa7813aa42d41a445397980a6219742a2d3c05ad0a2f15e8d8bfde9ac30d00fe193b8c3f1c25dd2663eb3a2bf1e2d3d@13.56.113.11:53719\",\n\t\"snode://bf14179511fbed5bf7ae42058dc7ae5967de23700fc72d4a58134c6704c89495f0ef999854c74a53b3a4c22d72598edaaa0a27bc6e8eaf596e5238bb69d19082@3.122.152.29:53719\",\n}\n\n// AlphanetBootnodes are the enode URLs of the P2P bootstrap nodes running on the\n// Ropsten test network.\nvar AlphanetBootnodes = []string{\n\t\"snode://29ad1a59fbb8984ec167b890ddb52e8690c6c1699c6796ca209cc2d0a5603760f25747fdae61ecb937260491f51632e6651a9292b2b3ce871e6c2e0c7c0f7c00@118.25.146.113:60609\",\n}\n\nvar DevBootnodes = []string{\n\t//\"snode://7105c6d1e9a8d0c12ecda61d4db860d62d84e2a53e777681e2d098b0b8cc592f48e0368fd82b353d7f8acec7321151441638164a21285879263f9c6e05a63f6e@192.168.15.220:60609\",\n\t//\"snode://91d9d0c77947d376f66c2a60146b235ab3aab39116bfae238d9c2aabea318b15b5df0154fc5ff82c855b09bbadd362fae6dc8533729bdc6345d3c3b566ca7c02@192.168.15.165:60609\",\n\t//\"snode://63aa57c5f311a1e848f3b77b16ec00f9afe2456f171af8f4838a7211688bb9c1cc836aa20852c8aef3487b988e4021594eb3aa03a604b868482a6c764bf46fe5@192.168.15.169:60609\",\n\t//\"snode://f081cf0dd496069518e92462c8fce964247b816008259efe8f37ac35fa1ed17d2a6759d64544884b3dec430e001dfae7e1224a22f4a0a992fe9fe94cf020f551@118.25.146.113:60606\",\n}\n\n// DiscoveryV5Bootnodes are the enode URLs of the P2P bootstrap nodes for the\n// experimental RLPx v5 topic-discovery network.\nvar DiscoveryV5Bootnodes = []string{\n\t//\"snode://bb50e2d89a4ed70663d080659fe0ad4b9bc3e06c17a227433966cb59ceee020decddbf6e00192011648d13b1c00af770c0c1bb609d4d3a5c98a43772e0e18ef4@192.168.15.252:60601\",\n}\n"
  },
  {
    "path": "params/config.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage params\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\n// Genesis hashes to enforce below configs on.\nvar (\n\tMainnetGenesisHash  = common.HexToHash(\"0x113d483242270ab0cd4ba353cc04b64a062713a5f05bbe97b8a0548e73218e70\")\n\tAlphanetGenesisHash = common.HexToHash(\"0x294e3d4cc16e116c4a9e1d576f868d759b07ac6e010251eb93c55adb15a562ca\")\n)\n\nvar (\n\t// BetanetChainConfig is the chain parameters to run a node on the main network.\n\tBetanetChainConfig = &ChainConfig{\n\t\tChainID:             big.NewInt(2019),\n\t\tAutumnTwilightBlock: big.NewInt(0),\n\t\tEthash:              new(EthashConfig),\n\t}\n\n\t// AlphanetChainConfig contains the chain parameters to run a node on the Ropsten test network.\n\tAlphanetChainConfig = &ChainConfig{\n\t\tChainID:             big.NewInt(1000),\n\t\tAutumnTwilightBlock: big.NewInt(0),\n\t\tEthash:              new(EthashConfig),\n\t}\n\n\t// RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network.\n\tDevnetChainConfig = &ChainConfig{\n\t\tChainID:             big.NewInt(1024),\n\t\tAutumnTwilightBlock: big.NewInt(0),\n\t\tEthash:              new(EthashConfig),\n\t}\n\n\t// AllEthashProtocolChanges contains every protocol change (EIPs) introduced\n\t// and accepted by the Ethereum core developers into the Ethash consensus.\n\t//\n\t// This configuration is intentionally not using keyed fields to force anyone\n\t// adding flags to the config to also have to set these fields.\n\tAllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), new(EthashConfig)}\n\n\t// AllCliqueProtocolChanges contains every protocol change (EIPs) introduced\n\t// and accepted by the Ethereum core developers into the Clique consensus.\n\t//\n\t// This configuration is intentionally not using keyed fields to force anyone\n\t// adding flags to the config to also have to set these fields.\n\tAllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil}\n\n\tTestChainConfig = &ChainConfig{\n\t\tChainID:             big.NewInt(1),\n\t\tAutumnTwilightBlock: big.NewInt(0),\n\t\t//ConstantinopleBlock: nil,\n\t\tEthash: new(EthashConfig),\n\t}\n)\n\n// ChainConfig is the core config which determines the blockchain settings.\n//\n// ChainConfig is stored in the database on a per block basis. This means\n// that any network, identified by its genesis block, can have its own\n// set of configuration options.\ntype ChainConfig struct {\n\tChainID *big.Int `json:\"chainId\"` // chainId identifies the current chain and is used for replay protection\n\n\tAutumnTwilightBlock *big.Int `json:\"AutumnTwilightBlock,omitempty\"` // AutumnTwilightBlock switch block (nil = no fork, 0 = already on AutumnTwilightBlock)\n\n\t// Various consensus engines\n\tEthash *EthashConfig `json:\"ethash,omitempty\"`\n}\n\n// EthashConfig is the consensus engine configs for proof-of-work based sealing.\ntype EthashConfig struct{}\n\n// String implements the stringer interface, returning the consensus engine details.\nfunc (c *EthashConfig) String() string {\n\treturn \"ethash\"\n}\n\n// CliqueConfig is the consensus engine configs for proof-of-authority based sealing.\ntype CliqueConfig struct {\n\tPeriod uint64 `json:\"period\"` // Number of seconds between blocks to enforce\n\tEpoch  uint64 `json:\"epoch\"`  // Epoch length to reset votes and checkpoint\n}\n\n// String implements the stringer interface, returning the consensus engine details.\nfunc (c *CliqueConfig) String() string {\n\treturn \"clique\"\n}\n\n// String implements the fmt.Stringer interface.\nfunc (c *ChainConfig) String() string {\n\tvar engine interface{}\n\tswitch {\n\tcase c.Ethash != nil:\n\t\tengine = c.Ethash\n\tdefault:\n\t\tengine = \"unknown\"\n\t}\n\treturn fmt.Sprintf(\"{ChainID: %v AutumnTwilight: %v Engine: %v}\",\n\t\tc.ChainID,\n\t\tc.AutumnTwilightBlock,\n\t\tengine,\n\t)\n}\n\n// IsAutumnTwilight returns whether num is either equal to the AutumnTwilight fork block or greater.\nfunc (c *ChainConfig) IsAutumnTwilight(num *big.Int) bool {\n\treturn isForked(c.AutumnTwilightBlock, num)\n}\n\n//\n//// IsConstantinople returns whether num is either equal to the Constantinople fork block or greater.\n//func (c *ChainConfig) IsConstantinople(num *big.Int) bool {\n//\treturn isForked(c.ConstantinopleBlock, num)\n//}\n\n// GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice).\n//\n// The returned GasTable's fields shouldn't, under any circumstances, be changed.\nfunc (c *ChainConfig) GasTable(num *big.Int) GasTable {\n\treturn GasTableConstantinople\n}\n\n// CheckCompatible checks whether scheduled fork transitions have been imported\n// with a mismatching chain configuration.\nfunc (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *ConfigCompatError {\n\tbhead := new(big.Int).SetUint64(height)\n\n\t// Iterate checkCompatible to find the lowest conflict.\n\tvar lasterr *ConfigCompatError\n\tfor {\n\t\terr := c.checkCompatible(newcfg, bhead)\n\t\tif err == nil || (lasterr != nil && err.RewindTo == lasterr.RewindTo) {\n\t\t\tbreak\n\t\t}\n\t\tlasterr = err\n\t\tbhead.SetUint64(err.RewindTo)\n\t}\n\treturn lasterr\n}\n\nfunc (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *ConfigCompatError {\n\tif isForkIncompatible(c.AutumnTwilightBlock, newcfg.AutumnTwilightBlock, head) {\n\t\treturn newCompatError(\"AutumnTwilight fork block\", c.AutumnTwilightBlock, newcfg.AutumnTwilightBlock)\n\t}\n\treturn nil\n}\n\n// isForkIncompatible returns true if a fork scheduled at s1 cannot be rescheduled to\n// block s2 because head is already past the fork.\nfunc isForkIncompatible(s1, s2, head *big.Int) bool {\n\treturn (isForked(s1, head) || isForked(s2, head)) && !configNumEqual(s1, s2)\n}\n\n// isForked returns whether a fork scheduled at block s is active at the given head block.\nfunc isForked(s, head *big.Int) bool {\n\tif s == nil || head == nil {\n\t\treturn false\n\t}\n\treturn s.Cmp(head) <= 0\n}\n\nfunc configNumEqual(x, y *big.Int) bool {\n\tif x == nil {\n\t\treturn y == nil\n\t}\n\tif y == nil {\n\t\treturn x == nil\n\t}\n\treturn x.Cmp(y) == 0\n}\n\n// ConfigCompatError is raised if the locally-stored blockchain is initialised with a\n// ChainConfig that would alter the past.\ntype ConfigCompatError struct {\n\tWhat string\n\t// block numbers of the stored and new configurations\n\tStoredConfig, NewConfig *big.Int\n\t// the block number to which the local chain must be rewound to correct the error\n\tRewindTo uint64\n}\n\nfunc newCompatError(what string, storedblock, newblock *big.Int) *ConfigCompatError {\n\tvar rew *big.Int\n\tswitch {\n\tcase storedblock == nil:\n\t\trew = newblock\n\tcase newblock == nil || storedblock.Cmp(newblock) < 0:\n\t\trew = storedblock\n\tdefault:\n\t\trew = newblock\n\t}\n\terr := &ConfigCompatError{what, storedblock, newblock, 0}\n\tif rew != nil && rew.Sign() > 0 {\n\t\terr.RewindTo = rew.Uint64() - 1\n\t}\n\treturn err\n}\n\nfunc (err *ConfigCompatError) Error() string {\n\treturn fmt.Sprintf(\"mismatching %s in database (have %d, want %d, rewindto %d)\", err.What, err.StoredConfig, err.NewConfig, err.RewindTo)\n}\n\n// Rules wraps ChainConfig and is merely syntatic sugar or can be used for functions\n// that do not have or require information about the block.\n//\n// Rules is a one time interface meaning that it shouldn't be used in between transition\n// phases.\ntype Rules struct {\n\tChainID          *big.Int\n\tIsAutumnTwilight bool\n}\n\n// Rules ensures c's ChainID is not nil.\nfunc (c *ChainConfig) Rules(num *big.Int) Rules {\n\tchainID := c.ChainID\n\tif chainID == nil {\n\t\tchainID = new(big.Int)\n\t}\n\treturn Rules{ChainID: new(big.Int).Set(chainID), IsAutumnTwilight: c.IsAutumnTwilight(num)}\n}\n"
  },
  {
    "path": "params/denomination.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage params\n\n// These are the multipliers for ether denominations.\n// Example: To get the ta value of an amount in 'sero', use\n//\n//    new(big.Int).Mul(value, big.NewInt(params.Sero))\n//\nconst (\n\tTa    = 1\n\tGta   = 1e9\n\tEther = 1e18\n)\n"
  },
  {
    "path": "params/gas_table.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage params\n\n// GasTable organizes gas prices for different ethereum phases.\ntype GasTable struct {\n\tExtcodeSize uint64\n\tExtcodeCopy uint64\n\tExtcodeHash uint64\n\tBalance     uint64\n\tSLoad       uint64\n\tCalls       uint64\n\tSuicide     uint64\n\n\tExpByte uint64\n\n\t// CreateBySuicide occurs when the\n\t// refunded account is one that does\n\t// not exist. This logic is similar\n\t// to call. May be left nil. Nil means\n\t// not charged.\n\tCreateBySuicide uint64\n}\n\n// Variables containing gas prices for different ethereum phases.\nvar (\n\t// GasTableConstantinople contain the gas re-prices for\n\t// the constantinople phase.\n\tGasTableConstantinople = GasTable{\n\t\tExtcodeSize: 700,\n\t\tExtcodeCopy: 700,\n\t\tExtcodeHash: 400,\n\t\tBalance:     400,\n\t\tSLoad:       200,\n\t\tCalls:       700,\n\t\tSuicide:     5000,\n\t\tExpByte:     50,\n\n\t\tCreateBySuicide: 25000,\n\t}\n)\n"
  },
  {
    "path": "params/network_params.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage params\n\n// These are network parameters that need to be constant between clients, but\n// aren't necesarilly consensus related.\n\nconst (\n\t// BloomBitsBlocks is the number of blocks a single bloom bit section vector\n\t// contains.\n\tBloomBitsBlocks uint64 = 4096\n)\n"
  },
  {
    "path": "params/protocol_params.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage params\n\nimport \"math/big\"\n\nvar (\n\tTargetGasLimit = GenesisGasLimit // The artificial target\n)\n\nconst (\n\tGasLimitBoundDivisor uint64 = 1024     // The bound divisor of the gas limit, used in update calculations.\n\tMinGasLimit          uint64 = 5000000  // Minimum the gas limit may ever be.\n\tGenesisGasLimit      uint64 = 79999998 // Gas limit of the Genesis block.\n\n\tMaximumExtraDataSize  uint64 = 32    // Maximum size extra data may be after Genesis.\n\tExpByteGas            uint64 = 10    // Times ceil(log256(exponent)) for the EXP instruction.\n\tSloadGas              uint64 = 50    // Multiplied by the number of 32-byte words that are copied (round up) for any *COPY operation and added.\n\tCallValueTransferGas  uint64 = 9000  // Paid for CALL when the value transfer is non-zero.\n\tCallNewAccountGas     uint64 = 25000 // Paid for CALL when the destination address didn't exist prior.\n\tTxGas                 uint64 = 25000 // Per transaction not creating a contract. NOTE: Not payable on data of calls between transactions.\n\tTxGasContractCreation uint64 = 56000 // Per transaction that creates a contract. NOTE: Not payable on data of calls between transactions.\n\tTxDataZeroGas         uint64 = 4     // Per byte of data attached to a transaction that equals zero. NOTE: Not payable on data of calls between transactions.\n\tQuadCoeffDiv          uint64 = 512   // Divisor for the quadratic particle of the memory cost equation.\n\tSstoreSetGas          uint64 = 20000 // Once per SLOAD operation.\n\tLogDataGas            uint64 = 8     // Per byte in a LOG* operation's data.\n\tCallStipend           uint64 = 2300  // Free gas given at beginning of call.\n\tCreateTicketGas       uint64 = 250000\n\n\tSha3Gas          uint64 = 30    // Once per SHA3 operation.\n\tSha3WordGas      uint64 = 6     // Once per word of the SHA3 operation's data.\n\tSstoreResetGas   uint64 = 5000  // Once per SSTORE operation if the zeroness changes from zero.\n\tSstoreClearGas   uint64 = 5000  // Once per SSTORE operation if the zeroness doesn't change.\n\tSstoreRefundGas  uint64 = 15000 // Once per SSTORE operation if the zeroness changes to zero.\n\tJumpdestGas      uint64 = 1     // Refunded gas, once per SSTORE operation if the zeroness changes to zero.\n\tEpochDuration    uint64 = 30000 // Duration between proof-of-work epochs.\n\tCallGas          uint64 = 40    // Once per CALL operation & message call transaction.\n\tCreateDataGas    uint64 = 200   //\n\tCallCreateDepth  uint64 = 1024  // Maximum depth of call/create stack.\n\tExpGas           uint64 = 10    // Once per EXP instruction\n\tLogGas           uint64 = 375   // Per LOG* operation.\n\tCopyGas          uint64 = 3     //\n\tStackLimit       uint64 = 1024  // Maximum size of VM stack allowed.\n\tTierStepGas      uint64 = 0     // Once per operation, for a selection of them.\n\tLogTopicGas      uint64 = 375   // Multiplied by the * of the LOG*, per LOG transaction. e.g. LOG0 incurs 0 * c_txLogTopicGas, LOG4 incurs 4 * c_txLogTopicGas.\n\tCreateGas        uint64 = 32000 // Once per CREATE operation & contract-creation transaction.\n\tCreate2Gas       uint64 = 32000 // Once per CREATE2 operation\n\tSuicideRefundGas uint64 = 24000 // Refunded following a suicide operation.\n\tMemoryGas        uint64 = 3     // Times the address of the (highest referenced byte in memory + 1). NOTE: referencing happens on read, write and in instructions such as RETURN and CALL.\n\tTxDataNonZeroGas uint64 = 68    // Per byte of data attached to a transaction that is not equal to zero. NOTE: Not payable on data of calls between transactions.\n\n\tMaxCodeSize = 24576 // Maximum bytecode to permit for a contract\n\n\t// Precompiled contract gas prices\n\n\tEcrecoverGas            uint64 = 3000   // Elliptic curve sender recovery gas price\n\tSha256BaseGas           uint64 = 60     // Base price for a SHA256 operation\n\tSha256PerWordGas        uint64 = 12     // Per-word price for a SHA256 operation\n\tRipemd160BaseGas        uint64 = 600    // Base price for a RIPEMD160 operation\n\tRipemd160PerWordGas     uint64 = 120    // Per-word price for a RIPEMD160 operation\n\tIdentityBaseGas         uint64 = 15     // Base price for a data copy operation\n\tIdentityPerWordGas      uint64 = 3      // Per-work price for a data copy operation\n\tModExpQuadCoeffDiv      uint64 = 20     // Divisor for the quadratic particle of the big int modular exponentiation\n\tBn256AddGas             uint64 = 500    // Gas needed for an elliptic curve addition\n\tBn256ScalarMulGas       uint64 = 40000  // Gas needed for an elliptic curve scalar multiplication\n\tBn256PairingBaseGas     uint64 = 100000 // Base price for an elliptic curve pairing check\n\tBn256PairingPerPointGas uint64 = 80000  // Per-point price for an elliptic curve pairing check\n\tDefaultCurrency         string = \"SERO\"\n)\n\nvar (\n\tDifficultyBoundDivisor = big.NewInt(2048)   // The bound divisor of the difficulty, used in the update calculations.\n\tGenesisDifficulty      = big.NewInt(131072) // Difficulty of the Genesis block.\n\tMinimumDifficulty      = big.NewInt(131072) // The minimum that the difficulty may ever be.\n\tDurationLimit          = big.NewInt(13)     // The decision boundary on the blocktime duration used to determine whether difficulty should go up or not.\n\tGenesisAvgUsedGas      = big.NewInt(25000)\n)\n"
  },
  {
    "path": "params/version.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage params\n\nimport (\n\t\"fmt\"\n)\n\nconst (\n\tVersionMajor = 1  // Major version component of the current release\n\tVersionMinor = 1  // Minor version component of the current release\n\tVersionPatch = 2  // Patch version component of the current release\n\tVersionMeta  = \"\" // Version metadata to append to the version string\n)\n\n// Version holds the textual version string.\nvar Version = func() string {\n\treturn fmt.Sprintf(\"%d.%d.%d\", VersionMajor, VersionMinor, VersionPatch)\n}()\n\n// VersionWithMeta holds the textual version string including the metadata.\nvar VersionWithMeta = func() string {\n\tv := Version\n\tif VersionMeta != \"\" {\n\t\tv += \"-\" + VersionMeta\n\t}\n\treturn v\n}()\n\n// ArchiveVersion holds the textual version string used for Geth archives.\n// e.g. \"1.8.11-dea1ce05\" for stable releases, or\n//      \"1.8.13-unstable-21c059b6\" for unstable releases\nfunc ArchiveVersion(gitCommit string) string {\n\tvsn := Version\n\tif VersionMeta != \"stable\" {\n\t\tvsn += \"-\" + VersionMeta\n\t}\n\tif len(gitCommit) >= 8 {\n\t\tvsn += \"-\" + gitCommit[:8]\n\t}\n\treturn vsn\n}\n\nfunc VersionWithCommit(gitCommit string) string {\n\tvsn := VersionWithMeta\n\tif len(gitCommit) >= 8 {\n\t\tvsn += \"-\" + gitCommit[:8]\n\t}\n\treturn vsn\n}\n"
  },
  {
    "path": "rlp/decode.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rlp\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n)\n\nvar (\n\t// EOL is returned when the end of the current list\n\t// has been reached during streaming.\n\tEOL = errors.New(\"rlp: end of list\")\n\n\t// Actual Errors\n\tErrExpectedString   = errors.New(\"rlp: expected String or Byte\")\n\tErrExpectedList     = errors.New(\"rlp: expected List\")\n\tErrCanonInt         = errors.New(\"rlp: non-canonical integer format\")\n\tErrCanonSize        = errors.New(\"rlp: non-canonical size information\")\n\tErrElemTooLarge     = errors.New(\"rlp: element is larger than containing list\")\n\tErrValueTooLarge    = errors.New(\"rlp: value size exceeds available input length\")\n\tErrMoreThanOneValue = errors.New(\"rlp: input contains more than one value\")\n\n\t// internal errors\n\terrNotInList     = errors.New(\"rlp: call of ListEnd outside of any list\")\n\terrNotAtEOL      = errors.New(\"rlp: call of ListEnd not positioned at EOL\")\n\terrUintOverflow  = errors.New(\"rlp: uint overflow\")\n\terrNoPointer     = errors.New(\"rlp: interface given to Decode must be a pointer\")\n\terrDecodeIntoNil = errors.New(\"rlp: pointer given to Decode must not be nil\")\n\n\tstreamPool = sync.Pool{\n\t\tNew: func() interface{} { return new(Stream) },\n\t}\n)\n\n// Decoder is implemented by types that require custom RLP\n// decoding rules or need to decode into private fields.\n//\n// The DecodeRLP method should read one value from the given\n// Stream. It is not forbidden to read less or more, but it might\n// be confusing.\ntype Decoder interface {\n\tDecodeRLP(*Stream) error\n}\n\n// Decode parses RLP-encoded data from r and stores the result in the\n// value pointed to by val. Val must be a non-nil pointer. If r does\n// not implement ByteReader, Decode will do its own buffering.\n//\n// Decode uses the following type-dependent decoding rules:\n//\n// If the type implements the Decoder interface, decode calls\n// DecodeRLP.\n//\n// To decode into a pointer, Decode will decode into the value pointed\n// to. If the pointer is nil, a new value of the pointer's element\n// type is allocated. If the pointer is non-nil, the existing value\n// will be reused.\n//\n// To decode into a struct, Decode expects the input to be an RLP\n// list. The decoded elements of the list are assigned to each public\n// field in the order given by the struct's definition. The input list\n// must contain an element for each decoded field. Decode returns an\n// error if there are too few or too many elements.\n//\n// The decoding of struct fields honours certain struct tags, \"tail\",\n// \"nil\" and \"-\".\n//\n// The \"-\" tag ignores fields.\n//\n// For an explanation of \"tail\", see the example.\n//\n// The \"nil\" tag applies to pointer-typed fields and changes the decoding\n// rules for the field such that input values of size zero decode as a nil\n// pointer. This tag can be useful when decoding recursive types.\n//\n//     type StructWithEmptyOK struct {\n//         Foo *[20]byte `rlp:\"nil\"`\n//     }\n//\n// To decode into a slice, the input must be a list and the resulting\n// slice will contain the input elements in order. For byte slices,\n// the input must be an RLP string. Array types decode similarly, with\n// the additional restriction that the number of input elements (or\n// bytes) must match the array's length.\n//\n// To decode into a Go string, the input must be an RLP string. The\n// input bytes are taken as-is and will not necessarily be valid UTF-8.\n//\n// To decode into an unsigned integer type, the input must also be an RLP\n// string. The bytes are interpreted as a big endian representation of\n// the integer. If the RLP string is larger than the bit size of the\n// type, Decode will return an error. Decode also supports *big.Int.\n// There is no size limit for big integers.\n//\n// To decode into an interface value, Decode stores one of these\n// in the value:\n//\n//\t  []interface{}, for RLP lists\n//\t  []byte, for RLP strings\n//\n// Non-empty interface types are not supported, nor are booleans,\n// signed integers, floating point numbers, maps, channels and\n// functions.\n//\n// Note that Decode does not set an input limit for all readers\n// and may be vulnerable to panics cause by huge value sizes. If\n// you need an input limit, use\n//\n//     NewStream(r, limit).Decode(val)\n//func Decode(r io.Reader, val interface{}) error {\n//\t// TODO: this could use a Stream from a pool.\n//\treturn NewStream(r, 0).Decode(val)\n//}\n\nfunc Decode(r io.Reader, val interface{}) error {\n\tstream := streamPool.Get().(*Stream)\n\tdefer streamPool.Put(stream)\n\n\tstream.Reset(r, 0)\n\treturn stream.Decode(val)\n}\n\n// DecodeBytes parses RLP data from b into val.\n// Please see the documentation of Decode for the decoding rules.\n// The input must contain exactly one value and no trailing data.\n//func DecodeBytes(b []byte, val interface{}) error {\n//\t// TODO: this could use a Stream from a pool.\n//\tr := bytes.NewReader(b)\n//\tif err := NewStream(r, uint64(len(b))).Decode(val); err != nil {\n//\t\treturn err\n//\t}\n//\tif r.Len() > 0 {\n//\t\treturn ErrMoreThanOneValue\n//\t}\n//\treturn nil\n//}\n\nfunc DecodeBytes(b []byte, val interface{}) error {\n\tr := bytes.NewReader(b)\n\n\tstream := streamPool.Get().(*Stream)\n\tdefer streamPool.Put(stream)\n\n\tstream.Reset(r, uint64(len(b)))\n\tif err := stream.Decode(val); err != nil {\n\t\treturn err\n\t}\n\tif r.Len() > 0 {\n\t\treturn ErrMoreThanOneValue\n\t}\n\treturn nil\n}\n\ntype decodeError struct {\n\tmsg string\n\ttyp reflect.Type\n\tctx []string\n}\n\nfunc (err *decodeError) Error() string {\n\tctx := \"\"\n\tif len(err.ctx) > 0 {\n\t\tctx = \", decoding into \"\n\t\tfor i := len(err.ctx) - 1; i >= 0; i-- {\n\t\t\tctx += err.ctx[i]\n\t\t}\n\t}\n\treturn fmt.Sprintf(\"rlp: %s for %v%s\", err.msg, err.typ, ctx)\n}\n\nfunc wrapStreamError(err error, typ reflect.Type) error {\n\tswitch err {\n\tcase ErrCanonInt:\n\t\treturn &decodeError{msg: \"non-canonical integer (leading zero bytes)\", typ: typ}\n\tcase ErrCanonSize:\n\t\treturn &decodeError{msg: \"non-canonical size information\", typ: typ}\n\tcase ErrExpectedList:\n\t\treturn &decodeError{msg: \"expected input list\", typ: typ}\n\tcase ErrExpectedString:\n\t\treturn &decodeError{msg: \"expected input string or byte\", typ: typ}\n\tcase errUintOverflow:\n\t\treturn &decodeError{msg: \"input string too long\", typ: typ}\n\tcase errNotAtEOL:\n\t\treturn &decodeError{msg: \"input list has too many elements\", typ: typ}\n\t}\n\treturn err\n}\n\nfunc addErrorContext(err error, ctx string) error {\n\tif decErr, ok := err.(*decodeError); ok {\n\t\tdecErr.ctx = append(decErr.ctx, ctx)\n\t}\n\treturn err\n}\n\nvar (\n\tdecoderInterface = reflect.TypeOf(new(Decoder)).Elem()\n\tbigInt           = reflect.TypeOf(big.Int{})\n)\n\nfunc makeDecoder(typ reflect.Type, tags tags) (dec decoder, err error) {\n\tkind := typ.Kind()\n\tswitch {\n\tcase typ == rawValueType:\n\t\treturn decodeRawValue, nil\n\tcase typ.Implements(decoderInterface):\n\t\treturn decodeDecoder, nil\n\tcase kind != reflect.Ptr && reflect.PtrTo(typ).Implements(decoderInterface):\n\t\treturn decodeDecoderNoPtr, nil\n\tcase typ.AssignableTo(reflect.PtrTo(bigInt)):\n\t\treturn decodeBigInt, nil\n\tcase typ.AssignableTo(bigInt):\n\t\treturn decodeBigIntNoPtr, nil\n\tcase isInt(kind):\n\t\treturn decodeInt, nil\n\tcase isUint(kind):\n\t\treturn decodeUint, nil\n\tcase kind == reflect.Bool:\n\t\treturn decodeBool, nil\n\tcase kind == reflect.String:\n\t\treturn decodeString, nil\n\tcase kind == reflect.Slice || kind == reflect.Array:\n\t\treturn makeListDecoder(typ, tags)\n\tcase kind == reflect.Struct:\n\t\treturn makeStructDecoder(typ)\n\tcase kind == reflect.Ptr:\n\t\tif tags.nilOK {\n\t\t\treturn makeOptionalPtrDecoder(typ)\n\t\t}\n\t\treturn makePtrDecoder(typ)\n\tcase kind == reflect.Interface:\n\t\treturn decodeInterface, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"rlp: type %v is not RLP-serializable\", typ)\n\t}\n}\n\nfunc decodeRawValue(s *Stream, val reflect.Value) error {\n\tr, err := s.Raw()\n\tif err != nil {\n\t\treturn err\n\t}\n\tval.SetBytes(r)\n\treturn nil\n}\n\nfunc decodeUint(s *Stream, val reflect.Value) error {\n\ttyp := val.Type()\n\tnum, err := s.uint(typ.Bits())\n\tif err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\tval.SetUint(num)\n\treturn nil\n}\n\nfunc decodeInt(s *Stream, val reflect.Value) error {\n\ttyp := val.Type()\n\tnum, err := s.uint(typ.Bits())\n\tif err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\tv := int64(num)\n\tval.SetInt(v)\n\treturn nil\n}\n\nfunc decodeBool(s *Stream, val reflect.Value) error {\n\tb, err := s.Bool()\n\tif err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\tval.SetBool(b)\n\treturn nil\n}\n\nfunc decodeString(s *Stream, val reflect.Value) error {\n\tb, err := s.Bytes()\n\tif err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\tval.SetString(string(b))\n\treturn nil\n}\n\nfunc decodeBigIntNoPtr(s *Stream, val reflect.Value) error {\n\treturn decodeBigInt(s, val.Addr())\n}\n\nfunc decodeBigInt(s *Stream, val reflect.Value) error {\n\tb, err := s.Bytes()\n\tif err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\ti := val.Interface().(*big.Int)\n\tif i == nil {\n\t\ti = new(big.Int)\n\t\tval.Set(reflect.ValueOf(i))\n\t}\n\t// Reject leading zero bytes\n\tif len(b) > 0 && b[0] == 0 {\n\t\treturn wrapStreamError(ErrCanonInt, val.Type())\n\t}\n\ti.SetBytes(b)\n\treturn nil\n}\n\nfunc makeListDecoder(typ reflect.Type, tag tags) (decoder, error) {\n\tetype := typ.Elem()\n\tif etype.Kind() == reflect.Uint8 && !reflect.PtrTo(etype).Implements(decoderInterface) {\n\t\tif typ.Kind() == reflect.Array {\n\t\t\treturn decodeByteArray, nil\n\t\t}\n\t\treturn decodeByteSlice, nil\n\t}\n\tetypeinfo, err := cachedTypeInfo1(etype, tags{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar dec decoder\n\tswitch {\n\tcase typ.Kind() == reflect.Array:\n\t\tdec = func(s *Stream, val reflect.Value) error {\n\t\t\treturn decodeListArray(s, val, etypeinfo.decoder)\n\t\t}\n\tcase tag.tail:\n\t\t// A slice with \"tail\" tag can occur as the last field\n\t\t// of a struct and is supposed to swallow all remaining\n\t\t// list elements. The struct decoder already called s.List,\n\t\t// proceed directly to decoding the elements.\n\t\tdec = func(s *Stream, val reflect.Value) error {\n\t\t\treturn decodeSliceElems(s, val, etypeinfo.decoder)\n\t\t}\n\tdefault:\n\t\tdec = func(s *Stream, val reflect.Value) error {\n\t\t\treturn decodeListSlice(s, val, etypeinfo.decoder)\n\t\t}\n\t}\n\treturn dec, nil\n}\n\nfunc decodeListSlice(s *Stream, val reflect.Value, elemdec decoder) error {\n\tsize, err := s.List()\n\tif err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\tif size == 0 {\n\t\tval.Set(reflect.MakeSlice(val.Type(), 0, 0))\n\t\treturn s.ListEnd()\n\t}\n\tif err := decodeSliceElems(s, val, elemdec); err != nil {\n\t\treturn err\n\t}\n\treturn s.ListEnd()\n}\n\nfunc decodeSliceElems(s *Stream, val reflect.Value, elemdec decoder) error {\n\ti := 0\n\tfor ; ; i++ {\n\t\t// grow slice if necessary\n\t\tif i >= val.Cap() {\n\t\t\tnewcap := val.Cap() + val.Cap()/2\n\t\t\tif newcap < 4 {\n\t\t\t\tnewcap = 4\n\t\t\t}\n\t\t\tnewv := reflect.MakeSlice(val.Type(), val.Len(), newcap)\n\t\t\treflect.Copy(newv, val)\n\t\t\tval.Set(newv)\n\t\t}\n\t\tif i >= val.Len() {\n\t\t\tval.SetLen(i + 1)\n\t\t}\n\t\t// decode into element\n\t\tif err := elemdec(s, val.Index(i)); err == EOL {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn addErrorContext(err, fmt.Sprint(\"[\", i, \"]\"))\n\t\t}\n\t}\n\tif i < val.Len() {\n\t\tval.SetLen(i)\n\t}\n\treturn nil\n}\n\nfunc decodeListArray(s *Stream, val reflect.Value, elemdec decoder) error {\n\tif _, err := s.List(); err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\tvlen := val.Len()\n\ti := 0\n\tfor ; i < vlen; i++ {\n\t\tif err := elemdec(s, val.Index(i)); err == EOL {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn addErrorContext(err, fmt.Sprint(\"[\", i, \"]\"))\n\t\t}\n\t}\n\tif i < vlen {\n\t\treturn &decodeError{msg: \"input list has too few elements\", typ: val.Type()}\n\t}\n\treturn wrapStreamError(s.ListEnd(), val.Type())\n}\n\nfunc decodeByteSlice(s *Stream, val reflect.Value) error {\n\tb, err := s.Bytes()\n\tif err != nil {\n\t\treturn wrapStreamError(err, val.Type())\n\t}\n\tval.SetBytes(b)\n\treturn nil\n}\n\nfunc decodeByteArray(s *Stream, val reflect.Value) error {\n\tkind, size, err := s.Kind()\n\tif err != nil {\n\t\treturn err\n\t}\n\tvlen := val.Len()\n\tswitch kind {\n\tcase Byte:\n\t\tif vlen == 0 {\n\t\t\treturn &decodeError{msg: \"input string too long\", typ: val.Type()}\n\t\t}\n\t\tif vlen > 1 {\n\t\t\treturn &decodeError{msg: \"input string too short\", typ: val.Type()}\n\t\t}\n\t\tbv, _ := s.Uint()\n\t\tval.Index(0).SetUint(bv)\n\tcase String:\n\t\tif uint64(vlen) < size {\n\t\t\treturn &decodeError{msg: \"input string too long\", typ: val.Type()}\n\t\t}\n\t\tif uint64(vlen) > size {\n\t\t\treturn &decodeError{msg: \"input string too short\", typ: val.Type()}\n\t\t}\n\t\tslice := val.Slice(0, vlen).Interface().([]byte)\n\t\tif err := s.readFull(slice); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Reject cases where single byte encoding should have been used.\n\t\tif size == 1 && slice[0] < 128 {\n\t\t\treturn wrapStreamError(ErrCanonSize, val.Type())\n\t\t}\n\tcase List:\n\t\treturn wrapStreamError(ErrExpectedString, val.Type())\n\t}\n\treturn nil\n}\n\nfunc makeStructDecoder(typ reflect.Type) (decoder, error) {\n\tfields, err := structFields(typ)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdec := func(s *Stream, val reflect.Value) (err error) {\n\t\tif _, err := s.List(); err != nil {\n\t\t\treturn wrapStreamError(err, typ)\n\t\t}\n\t\tfor _, f := range fields {\n\t\t\terr := f.info.decoder(s, val.Field(f.index))\n\t\t\tif err == EOL {\n\t\t\t\treturn &decodeError{msg: \"too few elements\", typ: typ}\n\t\t\t} else if err != nil {\n\t\t\t\treturn addErrorContext(err, \".\"+typ.Field(f.index).Name)\n\t\t\t}\n\t\t}\n\t\treturn wrapStreamError(s.ListEnd(), typ)\n\t}\n\treturn dec, nil\n}\n\n// makePtrDecoder creates a decoder that decodes into\n// the pointer's element type.\nfunc makePtrDecoder(typ reflect.Type) (decoder, error) {\n\tetype := typ.Elem()\n\tetypeinfo, err := cachedTypeInfo1(etype, tags{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdec := func(s *Stream, val reflect.Value) (err error) {\n\t\tnewval := val\n\t\tif val.IsNil() {\n\t\t\tnewval = reflect.New(etype)\n\t\t}\n\t\tif err = etypeinfo.decoder(s, newval.Elem()); err == nil {\n\t\t\tval.Set(newval)\n\t\t}\n\t\treturn err\n\t}\n\treturn dec, nil\n}\n\n// makeOptionalPtrDecoder creates a decoder that decodes empty values\n// as nil. Non-empty values are decoded into a value of the element type,\n// just like makePtrDecoder does.\n//\n// This decoder is used for pointer-typed struct fields with struct tag \"nil\".\nfunc makeOptionalPtrDecoder(typ reflect.Type) (decoder, error) {\n\tetype := typ.Elem()\n\tetypeinfo, err := cachedTypeInfo1(etype, tags{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdec := func(s *Stream, val reflect.Value) (err error) {\n\t\tkind, size, err := s.Kind()\n\t\tif err != nil || size == 0 && kind != Byte {\n\t\t\t// rearm s.Kind. This is important because the input\n\t\t\t// position must advance to the next value even though\n\t\t\t// we don't read anything.\n\t\t\ts.kind = -1\n\t\t\t// set the pointer to nil.\n\t\t\tval.Set(reflect.Zero(typ))\n\t\t\treturn err\n\t\t}\n\t\tnewval := val\n\t\tif val.IsNil() {\n\t\t\tnewval = reflect.New(etype)\n\t\t}\n\t\tif err = etypeinfo.decoder(s, newval.Elem()); err == nil {\n\t\t\tval.Set(newval)\n\t\t}\n\t\treturn err\n\t}\n\treturn dec, nil\n}\n\nvar ifsliceType = reflect.TypeOf([]interface{}{})\n\nfunc decodeInterface(s *Stream, val reflect.Value) error {\n\tif val.Type().NumMethod() != 0 {\n\t\treturn fmt.Errorf(\"rlp: type %v is not RLP-serializable\", val.Type())\n\t}\n\tkind, _, err := s.Kind()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif kind == List {\n\t\tslice := reflect.New(ifsliceType).Elem()\n\t\tif err := decodeListSlice(s, slice, decodeInterface); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tval.Set(slice)\n\t} else {\n\t\tb, err := s.Bytes()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tval.Set(reflect.ValueOf(b))\n\t}\n\treturn nil\n}\n\n// This decoder is used for non-pointer values of types\n// that implement the Decoder interface using a pointer receiver.\nfunc decodeDecoderNoPtr(s *Stream, val reflect.Value) error {\n\treturn val.Addr().Interface().(Decoder).DecodeRLP(s)\n}\n\nfunc decodeDecoder(s *Stream, val reflect.Value) error {\n\t// Decoder instances are not handled using the pointer rule if the type\n\t// implements Decoder with pointer receiver (i.e. always)\n\t// because it might handle empty values specially.\n\t// We need to allocate one here in this case, like makePtrDecoder does.\n\tif val.Kind() == reflect.Ptr && val.IsNil() {\n\t\tval.Set(reflect.New(val.Type().Elem()))\n\t}\n\treturn val.Interface().(Decoder).DecodeRLP(s)\n}\n\n// Kind represents the kind of value contained in an RLP stream.\ntype Kind int\n\nconst (\n\tByte Kind = iota\n\tString\n\tList\n)\n\nfunc (k Kind) String() string {\n\tswitch k {\n\tcase Byte:\n\t\treturn \"Byte\"\n\tcase String:\n\t\treturn \"String\"\n\tcase List:\n\t\treturn \"List\"\n\tdefault:\n\t\treturn fmt.Sprintf(\"Unknown(%d)\", k)\n\t}\n}\n\n// ByteReader must be implemented by any input reader for a Stream. It\n// is implemented by e.g. bufio.Reader and bytes.Reader.\ntype ByteReader interface {\n\tio.Reader\n\tio.ByteReader\n}\n\n// Stream can be used for piecemeal decoding of an input stream. This\n// is useful if the input is very large or if the decoding rules for a\n// type depend on the input structure. Stream does not keep an\n// internal buffer. After decoding a value, the input reader will be\n// positioned just before the type information for the next value.\n//\n// When decoding a list and the input position reaches the declared\n// length of the list, all operations will return error EOL.\n// The end of the list must be acknowledged using ListEnd to continue\n// reading the enclosing list.\n//\n// Stream is not safe for concurrent use.\ntype Stream struct {\n\tr ByteReader\n\n\t// number of bytes remaining to be read from r.\n\tremaining uint64\n\tlimited   bool\n\n\t// auxiliary buffer for integer decoding\n\tuintbuf []byte\n\n\tkind    Kind   // kind of value ahead\n\tsize    uint64 // size of value ahead\n\tbyteval byte   // value of single byte in type tag\n\tkinderr error  // error from last readKind\n\tstack   []listpos\n}\n\ntype listpos struct{ pos, size uint64 }\n\n// NewStream creates a new decoding stream reading from r.\n//\n// If r implements the ByteReader interface, Stream will\n// not introduce any buffering.\n//\n// For non-toplevel values, Stream returns ErrElemTooLarge\n// for values that do not fit into the enclosing list.\n//\n// Stream supports an optional input limit. If a limit is set, the\n// size of any toplevel value will be checked against the remaining\n// input length. Stream operations that encounter a value exceeding\n// the remaining input length will return ErrValueTooLarge. The limit\n// can be set by passing a non-zero value for inputLimit.\n//\n// If r is a bytes.Reader or strings.Reader, the input limit is set to\n// the length of r's underlying data unless an explicit limit is\n// provided.\nfunc NewStream(r io.Reader, inputLimit uint64) *Stream {\n\ts := new(Stream)\n\ts.Reset(r, inputLimit)\n\treturn s\n}\n\n// NewListStream creates a new stream that pretends to be positioned\n// at an encoded list of the given length.\nfunc NewListStream(r io.Reader, len uint64) *Stream {\n\ts := new(Stream)\n\ts.Reset(r, len)\n\ts.kind = List\n\ts.size = len\n\treturn s\n}\n\n// Bytes reads an RLP string and returns its contents as a byte slice.\n// If the input does not contain an RLP string, the returned\n// error will be ErrExpectedString.\nfunc (s *Stream) Bytes() ([]byte, error) {\n\tkind, size, err := s.Kind()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitch kind {\n\tcase Byte:\n\t\ts.kind = -1 // rearm Kind\n\t\treturn []byte{s.byteval}, nil\n\tcase String:\n\t\tb := make([]byte, size)\n\t\tif err = s.readFull(b); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif size == 1 && b[0] < 128 {\n\t\t\treturn nil, ErrCanonSize\n\t\t}\n\t\treturn b, nil\n\tdefault:\n\t\treturn nil, ErrExpectedString\n\t}\n}\n\n// Raw reads a raw encoded value including RLP type information.\nfunc (s *Stream) Raw() ([]byte, error) {\n\tkind, size, err := s.Kind()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif kind == Byte {\n\t\ts.kind = -1 // rearm Kind\n\t\treturn []byte{s.byteval}, nil\n\t}\n\t// the original header has already been read and is no longer\n\t// available. read content and put a new header in front of it.\n\tstart := headsize(size)\n\tbuf := make([]byte, uint64(start)+size)\n\tif err := s.readFull(buf[start:]); err != nil {\n\t\treturn nil, err\n\t}\n\tif kind == String {\n\t\tputhead(buf, 0x80, 0xB7, size)\n\t} else {\n\t\tputhead(buf, 0xC0, 0xF7, size)\n\t}\n\treturn buf, nil\n}\n\n// Uint reads an RLP string of up to 8 bytes and returns its contents\n// as an unsigned integer. If the input does not contain an RLP string, the\n// returned error will be ErrExpectedString.\nfunc (s *Stream) Uint() (uint64, error) {\n\treturn s.uint(64)\n}\n\nfunc (s *Stream) uint(maxbits int) (uint64, error) {\n\tkind, size, err := s.Kind()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tswitch kind {\n\tcase Byte:\n\t\tif s.byteval == 0 {\n\t\t\treturn 0, ErrCanonInt\n\t\t}\n\t\ts.kind = -1 // rearm Kind\n\t\treturn uint64(s.byteval), nil\n\tcase String:\n\t\tif size > uint64(maxbits/8) {\n\t\t\treturn 0, errUintOverflow\n\t\t}\n\t\tv, err := s.readUint(byte(size))\n\t\tswitch {\n\t\tcase err == ErrCanonSize:\n\t\t\t// Adjust error because we're not reading a size right now.\n\t\t\treturn 0, ErrCanonInt\n\t\tcase err != nil:\n\t\t\treturn 0, err\n\t\tcase size > 0 && v < 128:\n\t\t\treturn 0, ErrCanonSize\n\t\tdefault:\n\t\t\treturn v, nil\n\t\t}\n\tdefault:\n\t\treturn 0, ErrExpectedString\n\t}\n}\n\n// Bool reads an RLP string of up to 1 byte and returns its contents\n// as a boolean. If the input does not contain an RLP string, the\n// returned error will be ErrExpectedString.\nfunc (s *Stream) Bool() (bool, error) {\n\tnum, err := s.uint(8)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tswitch num {\n\tcase 0:\n\t\treturn false, nil\n\tcase 1:\n\t\treturn true, nil\n\tdefault:\n\t\treturn false, fmt.Errorf(\"rlp: invalid boolean value: %d\", num)\n\t}\n}\n\n// List starts decoding an RLP list. If the input does not contain a\n// list, the returned error will be ErrExpectedList. When the list's\n// end has been reached, any Stream operation will return EOL.\nfunc (s *Stream) List() (size uint64, err error) {\n\tkind, size, err := s.Kind()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif kind != List {\n\t\treturn 0, ErrExpectedList\n\t}\n\ts.stack = append(s.stack, listpos{0, size})\n\ts.kind = -1\n\ts.size = 0\n\treturn size, nil\n}\n\n// ListEnd returns to the enclosing list.\n// The input reader must be positioned at the end of a list.\nfunc (s *Stream) ListEnd() error {\n\tif len(s.stack) == 0 {\n\t\treturn errNotInList\n\t}\n\ttos := s.stack[len(s.stack)-1]\n\tif tos.pos != tos.size {\n\t\treturn errNotAtEOL\n\t}\n\ts.stack = s.stack[:len(s.stack)-1] // pop\n\tif len(s.stack) > 0 {\n\t\ts.stack[len(s.stack)-1].pos += tos.size\n\t}\n\ts.kind = -1\n\ts.size = 0\n\treturn nil\n}\n\n// Decode decodes a value and stores the result in the value pointed\n// to by val. Please see the documentation for the Decode function\n// to learn about the decoding rules.\nfunc (s *Stream) Decode(val interface{}) error {\n\tif val == nil {\n\t\treturn errDecodeIntoNil\n\t}\n\trval := reflect.ValueOf(val)\n\trtyp := rval.Type()\n\tif rtyp.Kind() != reflect.Ptr {\n\t\treturn errNoPointer\n\t}\n\tif rval.IsNil() {\n\t\treturn errDecodeIntoNil\n\t}\n\tinfo, err := cachedTypeInfo(rtyp.Elem(), tags{})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = info.decoder(s, rval.Elem())\n\tif decErr, ok := err.(*decodeError); ok && len(decErr.ctx) > 0 {\n\t\t// add decode target type to error so context has more meaning\n\t\tdecErr.ctx = append(decErr.ctx, fmt.Sprint(\"(\", rtyp.Elem(), \")\"))\n\t}\n\treturn err\n}\n\n// Reset discards any information about the current decoding context\n// and starts reading from r. This method is meant to facilitate reuse\n// of a preallocated Stream across many decoding operations.\n//\n// If r does not also implement ByteReader, Stream will do its own\n// buffering.\nfunc (s *Stream) Reset(r io.Reader, inputLimit uint64) {\n\tif inputLimit > 0 {\n\t\ts.remaining = inputLimit\n\t\ts.limited = true\n\t} else {\n\t\t// Attempt to automatically discover\n\t\t// the limit when reading from a byte slice.\n\t\tswitch br := r.(type) {\n\t\tcase *bytes.Reader:\n\t\t\ts.remaining = uint64(br.Len())\n\t\t\ts.limited = true\n\t\tcase *strings.Reader:\n\t\t\ts.remaining = uint64(br.Len())\n\t\t\ts.limited = true\n\t\tdefault:\n\t\t\ts.limited = false\n\t\t}\n\t}\n\t// Wrap r with a buffer if it doesn't have one.\n\tbufr, ok := r.(ByteReader)\n\tif !ok {\n\t\tbufr = bufio.NewReader(r)\n\t}\n\ts.r = bufr\n\t// Reset the decoding context.\n\ts.stack = s.stack[:0]\n\ts.size = 0\n\ts.kind = -1\n\ts.kinderr = nil\n\tif s.uintbuf == nil {\n\t\ts.uintbuf = make([]byte, 8)\n\t}\n}\n\n// Kind returns the kind and size of the next value in the\n// input stream.\n//\n// The returned size is the number of bytes that make up the value.\n// For kind == Byte, the size is zero because the value is\n// contained in the type tag.\n//\n// The first call to Kind will read size information from the input\n// reader and leave it positioned at the start of the actual bytes of\n// the value. Subsequent calls to Kind (until the value is decoded)\n// will not advance the input reader and return cached information.\nfunc (s *Stream) Kind() (kind Kind, size uint64, err error) {\n\tvar tos *listpos\n\tif len(s.stack) > 0 {\n\t\ttos = &s.stack[len(s.stack)-1]\n\t}\n\tif s.kind < 0 {\n\t\ts.kinderr = nil\n\t\t// Don't read further if we're at the end of the\n\t\t// innermost list.\n\t\tif tos != nil && tos.pos == tos.size {\n\t\t\treturn 0, 0, EOL\n\t\t}\n\t\ts.kind, s.size, s.kinderr = s.readKind()\n\t\tif s.kinderr == nil {\n\t\t\tif tos == nil {\n\t\t\t\t// At toplevel, check that the value is smaller\n\t\t\t\t// than the remaining input length.\n\t\t\t\tif s.limited && s.size > s.remaining {\n\t\t\t\t\ts.kinderr = ErrValueTooLarge\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Inside a list, check that the value doesn't overflow the list.\n\t\t\t\tif s.size > tos.size-tos.pos {\n\t\t\t\t\ts.kinderr = ErrElemTooLarge\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Note: this might return a sticky error generated\n\t// by an earlier call to readKind.\n\treturn s.kind, s.size, s.kinderr\n}\n\nfunc (s *Stream) readKind() (kind Kind, size uint64, err error) {\n\tb, err := s.readByte()\n\tif err != nil {\n\t\tif len(s.stack) == 0 {\n\t\t\t// At toplevel, Adjust the error to actual EOF. io.EOF is\n\t\t\t// used by callers to determine when to stop decoding.\n\t\t\tswitch err {\n\t\t\tcase io.ErrUnexpectedEOF:\n\t\t\t\terr = io.EOF\n\t\t\tcase ErrValueTooLarge:\n\t\t\t\terr = io.EOF\n\t\t\t}\n\t\t}\n\t\treturn 0, 0, err\n\t}\n\ts.byteval = 0\n\tswitch {\n\tcase b < 0x80:\n\t\t// For a single byte whose value is in the [0x00, 0x7F] range, that byte\n\t\t// is its own RLP encoding.\n\t\ts.byteval = b\n\t\treturn Byte, 0, nil\n\tcase b < 0xB8:\n\t\t// Otherwise, if a string is 0-55 bytes long,\n\t\t// the RLP encoding consists of a single byte with value 0x80 plus the\n\t\t// length of the string followed by the string. The range of the first\n\t\t// byte is thus [0x80, 0xB7].\n\t\treturn String, uint64(b - 0x80), nil\n\tcase b < 0xC0:\n\t\t// If a string is more than 55 bytes long, the\n\t\t// RLP encoding consists of a single byte with value 0xB7 plus the length\n\t\t// of the length of the string in binary form, followed by the length of\n\t\t// the string, followed by the string. For example, a length-1024 string\n\t\t// would be encoded as 0xB90400 followed by the string. The range of\n\t\t// the first byte is thus [0xB8, 0xBF].\n\t\tsize, err = s.readUint(b - 0xB7)\n\t\tif err == nil && size < 56 {\n\t\t\terr = ErrCanonSize\n\t\t}\n\t\treturn String, size, err\n\tcase b < 0xF8:\n\t\t// If the total payload of a list\n\t\t// (i.e. the combined length of all its items) is 0-55 bytes long, the\n\t\t// RLP encoding consists of a single byte with value 0xC0 plus the length\n\t\t// of the list followed by the concatenation of the RLP encodings of the\n\t\t// items. The range of the first byte is thus [0xC0, 0xF7].\n\t\treturn List, uint64(b - 0xC0), nil\n\tdefault:\n\t\t// If the total payload of a list is more than 55 bytes long,\n\t\t// the RLP encoding consists of a single byte with value 0xF7\n\t\t// plus the length of the length of the payload in binary\n\t\t// form, followed by the length of the payload, followed by\n\t\t// the concatenation of the RLP encodings of the items. The\n\t\t// range of the first byte is thus [0xF8, 0xFF].\n\t\tsize, err = s.readUint(b - 0xF7)\n\t\tif err == nil && size < 56 {\n\t\t\terr = ErrCanonSize\n\t\t}\n\t\treturn List, size, err\n\t}\n}\n\nfunc (s *Stream) readUint(size byte) (uint64, error) {\n\tswitch size {\n\tcase 0:\n\t\ts.kind = -1 // rearm Kind\n\t\treturn 0, nil\n\tcase 1:\n\t\tb, err := s.readByte()\n\t\treturn uint64(b), err\n\tdefault:\n\t\tstart := int(8 - size)\n\t\tfor i := 0; i < start; i++ {\n\t\t\ts.uintbuf[i] = 0\n\t\t}\n\t\tif err := s.readFull(s.uintbuf[start:]); err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tif s.uintbuf[start] == 0 {\n\t\t\t// Note: readUint is also used to decode integer\n\t\t\t// values. The error needs to be adjusted to become\n\t\t\t// ErrCanonInt in this case.\n\t\t\treturn 0, ErrCanonSize\n\t\t}\n\t\treturn binary.BigEndian.Uint64(s.uintbuf), nil\n\t}\n}\n\nfunc (s *Stream) readFull(buf []byte) (err error) {\n\tif err := s.willRead(uint64(len(buf))); err != nil {\n\t\treturn err\n\t}\n\tvar nn, n int\n\tfor n < len(buf) && err == nil {\n\t\tnn, err = s.r.Read(buf[n:])\n\t\tn += nn\n\t}\n\tif err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn err\n}\n\nfunc (s *Stream) readByte() (byte, error) {\n\tif err := s.willRead(1); err != nil {\n\t\treturn 0, err\n\t}\n\tb, err := s.r.ReadByte()\n\tif err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn b, err\n}\n\nfunc (s *Stream) willRead(n uint64) error {\n\ts.kind = -1 // rearm Kind\n\n\tif len(s.stack) > 0 {\n\t\t// check list overflow\n\t\ttos := s.stack[len(s.stack)-1]\n\t\tif n > tos.size-tos.pos {\n\t\t\treturn ErrElemTooLarge\n\t\t}\n\t\ts.stack[len(s.stack)-1].pos += n\n\t}\n\tif s.limited {\n\t\tif n > s.remaining {\n\t\t\treturn ErrValueTooLarge\n\t\t}\n\t\ts.remaining -= n\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "rlp/doc.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\nPackage rlp implements the RLP serialization format.\n\nThe purpose of RLP (Recursive Linear Prefix) is to encode arbitrarily\nnested arrays of binary data, and RLP is the main encoding method used\nto serialize objects in Ethereum. The only purpose of RLP is to encode\nstructure; encoding specific atomic data types (eg. strings, ints,\nfloats) is left up to higher-order protocols; in Ethereum integers\nmust be represented in big endian binary form with no leading zeroes\n(thus making the integer value zero equivalent to the empty byte\narray).\n\nRLP values are distinguished by a type tag. The type tag precedes the\nvalue in the input stream and defines the size and kind of the bytes\nthat follow.\n*/\npackage rlp\n"
  },
  {
    "path": "rlp/encode.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rlp\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"sync\"\n)\n\nvar (\n\t// Common encoded values.\n\t// These are useful when implementing EncodeRLP.\n\tEmptyString = []byte{0x80}\n\tEmptyList   = []byte{0xC0}\n)\n\n// Encoder is implemented by types that require custom\n// encoding rules or want to encode private fields.\ntype Encoder interface {\n\t// EncodeRLP should write the RLP encoding of its receiver to w.\n\t// If the implementation is a pointer method, it may also be\n\t// called for nil pointers.\n\t//\n\t// Implementations should generate valid RLP. The data written is\n\t// not verified at the moment, but a future version might. It is\n\t// recommended to write only a single value but writing multiple\n\t// values or no value at all is also permitted.\n\tEncodeRLP(io.Writer) error\n}\n\n// Encode writes the RLP encoding of val to w. Note that Encode may\n// perform many small writes in some cases. Consider making w\n// buffered.\n//\n// Encode uses the following type-dependent encoding rules:\n//\n// If the type implements the Encoder interface, Encode calls\n// EncodeRLP. This is true even for nil pointers, please see the\n// documentation for Encoder.\n//\n// To encode a pointer, the value being pointed to is encoded. For nil\n// pointers, Encode will encode the zero value of the type. A nil\n// pointer to a struct type always encodes as an empty RLP list.\n// A nil pointer to an array encodes as an empty list (or empty string\n// if the array has element type byte).\n//\n// Struct values are encoded as an RLP list of all their encoded\n// public fields. Recursive struct types are supported.\n//\n// To encode slices and arrays, the elements are encoded as an RLP\n// list of the value's elements. Note that arrays and slices with\n// element type uint8 or byte are always encoded as an RLP string.\n//\n// A Go string is encoded as an RLP string.\n//\n// An unsigned integer value is encoded as an RLP string. Zero always\n// encodes as an empty RLP string. Encode also supports *big.Int.\n//\n// An interface value encodes as the value contained in the interface.\n//\n// Boolean values are not supported, nor are signed integers, floating\n// point numbers, maps, channels and functions.\nfunc Encode(w io.Writer, val interface{}) error {\n\tif outer, ok := w.(*encbuf); ok {\n\t\t// Encode was called by some type's EncodeRLP.\n\t\t// Avoid copying by writing to the outer encbuf directly.\n\t\treturn outer.encode(val)\n\t}\n\teb := encbufPool.Get().(*encbuf)\n\tdefer encbufPool.Put(eb)\n\teb.reset()\n\tif err := eb.encode(val); err != nil {\n\t\treturn err\n\t}\n\treturn eb.toWriter(w)\n}\n\n// EncodeToBytes returns the RLP encoding of val.\n// Please see the documentation of Encode for the encoding rules.\nfunc EncodeToBytes(val interface{}) ([]byte, error) {\n\teb := encbufPool.Get().(*encbuf)\n\tdefer encbufPool.Put(eb)\n\teb.reset()\n\tif err := eb.encode(val); err != nil {\n\t\treturn nil, err\n\t}\n\treturn eb.toBytes(), nil\n}\n\n// EncodeToReader returns a reader from which the RLP encoding of val\n// can be read. The returned size is the total size of the encoded\n// data.\n//\n// Please see the documentation of Encode for the encoding rules.\nfunc EncodeToReader(val interface{}) (size int, r io.Reader, err error) {\n\teb := encbufPool.Get().(*encbuf)\n\teb.reset()\n\tif err := eb.encode(val); err != nil {\n\t\treturn 0, nil, err\n\t}\n\treturn eb.size(), &encReader{buf: eb}, nil\n}\n\ntype encbuf struct {\n\tstr     []byte      // string data, contains everything except list headers\n\tlheads  []*listhead // all list headers\n\tlhsize  int         // sum of sizes of all encoded list headers\n\tsizebuf []byte      // 9-byte auxiliary buffer for uint encoding\n}\n\ntype listhead struct {\n\toffset int // index of this header in string data\n\tsize   int // total size of encoded data (including list headers)\n}\n\n// encode writes head to the given buffer, which must be at least\n// 9 bytes long. It returns the encoded bytes.\nfunc (head *listhead) encode(buf []byte) []byte {\n\treturn buf[:puthead(buf, 0xC0, 0xF7, uint64(head.size))]\n}\n\n// headsize returns the size of a list or string header\n// for a value of the given size.\nfunc headsize(size uint64) int {\n\tif size < 56 {\n\t\treturn 1\n\t}\n\treturn 1 + intsize(size)\n}\n\n// puthead writes a list or string header to buf.\n// buf must be at least 9 bytes long.\nfunc puthead(buf []byte, smalltag, largetag byte, size uint64) int {\n\tif size < 56 {\n\t\tbuf[0] = smalltag + byte(size)\n\t\treturn 1\n\t}\n\tsizesize := putint(buf[1:], size)\n\tbuf[0] = largetag + byte(sizesize)\n\treturn sizesize + 1\n}\n\n// encbufs are pooled.\nvar encbufPool = sync.Pool{\n\tNew: func() interface{} { return &encbuf{sizebuf: make([]byte, 9)} },\n}\n\nfunc (w *encbuf) reset() {\n\tw.lhsize = 0\n\tif w.str != nil {\n\t\tw.str = w.str[:0]\n\t}\n\tif w.lheads != nil {\n\t\tw.lheads = w.lheads[:0]\n\t}\n}\n\n// encbuf implements io.Writer so it can be passed it into EncodeRLP.\nfunc (w *encbuf) Write(b []byte) (int, error) {\n\tw.str = append(w.str, b...)\n\treturn len(b), nil\n}\n\nfunc (w *encbuf) encode(val interface{}) error {\n\trval := reflect.ValueOf(val)\n\tti, err := cachedTypeInfo(rval.Type(), tags{})\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ti.writer(rval, w)\n}\n\nfunc (w *encbuf) encodeStringHeader(size int) {\n\tif size < 56 {\n\t\tw.str = append(w.str, 0x80+byte(size))\n\t} else {\n\t\t// TODO: encode to w.str directly\n\t\tsizesize := putint(w.sizebuf[1:], uint64(size))\n\t\tw.sizebuf[0] = 0xB7 + byte(sizesize)\n\t\tw.str = append(w.str, w.sizebuf[:sizesize+1]...)\n\t}\n}\n\nfunc (w *encbuf) encodeString(b []byte) {\n\tif len(b) == 1 && b[0] <= 0x7F {\n\t\t// fits single byte, no string header\n\t\tw.str = append(w.str, b[0])\n\t} else {\n\t\tw.encodeStringHeader(len(b))\n\t\tw.str = append(w.str, b...)\n\t}\n}\n\nfunc (w *encbuf) list() *listhead {\n\tlh := &listhead{offset: len(w.str), size: w.lhsize}\n\tw.lheads = append(w.lheads, lh)\n\treturn lh\n}\n\nfunc (w *encbuf) listEnd(lh *listhead) {\n\tlh.size = w.size() - lh.offset - lh.size\n\tif lh.size < 56 {\n\t\tw.lhsize++ // length encoded into kind tag\n\t} else {\n\t\tw.lhsize += 1 + intsize(uint64(lh.size))\n\t}\n}\n\nfunc (w *encbuf) size() int {\n\treturn len(w.str) + w.lhsize\n}\n\nfunc (w *encbuf) toBytes() []byte {\n\tout := make([]byte, w.size())\n\tstrpos := 0\n\tpos := 0\n\tfor _, head := range w.lheads {\n\t\t// write string data before header\n\t\tn := copy(out[pos:], w.str[strpos:head.offset])\n\t\tpos += n\n\t\tstrpos += n\n\t\t// write the header\n\t\tenc := head.encode(out[pos:])\n\t\tpos += len(enc)\n\t}\n\t// copy string data after the last list header\n\tcopy(out[pos:], w.str[strpos:])\n\treturn out\n}\n\nfunc (w *encbuf) toWriter(out io.Writer) (err error) {\n\tstrpos := 0\n\tfor _, head := range w.lheads {\n\t\t// write string data before header\n\t\tif head.offset-strpos > 0 {\n\t\t\tn, err := out.Write(w.str[strpos:head.offset])\n\t\t\tstrpos += n\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\t// write the header\n\t\tenc := head.encode(w.sizebuf)\n\t\tif _, err = out.Write(enc); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif strpos < len(w.str) {\n\t\t// write string data after the last list header\n\t\t_, err = out.Write(w.str[strpos:])\n\t}\n\treturn err\n}\n\n// encReader is the io.Reader returned by EncodeToReader.\n// It releases its encbuf at EOF.\ntype encReader struct {\n\tbuf    *encbuf // the buffer we're reading from. this is nil when we're at EOF.\n\tlhpos  int     // index of list header that we're reading\n\tstrpos int     // current position in string buffer\n\tpiece  []byte  // next piece to be read\n}\n\nfunc (r *encReader) Read(b []byte) (n int, err error) {\n\tfor {\n\t\tif r.piece = r.next(); r.piece == nil {\n\t\t\t// Put the encode buffer back into the pool at EOF when it\n\t\t\t// is first encountered. Subsequent calls still return EOF\n\t\t\t// as the error but the buffer is no longer valid.\n\t\t\tif r.buf != nil {\n\t\t\t\tencbufPool.Put(r.buf)\n\t\t\t\tr.buf = nil\n\t\t\t}\n\t\t\treturn n, io.EOF\n\t\t}\n\t\tnn := copy(b[n:], r.piece)\n\t\tn += nn\n\t\tif nn < len(r.piece) {\n\t\t\t// piece didn't fit, see you next time.\n\t\t\tr.piece = r.piece[nn:]\n\t\t\treturn n, nil\n\t\t}\n\t\tr.piece = nil\n\t}\n}\n\n// next returns the next piece of data to be read.\n// it returns nil at EOF.\nfunc (r *encReader) next() []byte {\n\tswitch {\n\tcase r.buf == nil:\n\t\treturn nil\n\n\tcase r.piece != nil:\n\t\t// There is still data available for reading.\n\t\treturn r.piece\n\n\tcase r.lhpos < len(r.buf.lheads):\n\t\t// We're before the last list header.\n\t\thead := r.buf.lheads[r.lhpos]\n\t\tsizebefore := head.offset - r.strpos\n\t\tif sizebefore > 0 {\n\t\t\t// String data before header.\n\t\t\tp := r.buf.str[r.strpos:head.offset]\n\t\t\tr.strpos += sizebefore\n\t\t\treturn p\n\t\t}\n\t\tr.lhpos++\n\t\treturn head.encode(r.buf.sizebuf)\n\n\tcase r.strpos < len(r.buf.str):\n\t\t// String data at the end, after all list headers.\n\t\tp := r.buf.str[r.strpos:]\n\t\tr.strpos = len(r.buf.str)\n\t\treturn p\n\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nvar (\n\tencoderInterface = reflect.TypeOf(new(Encoder)).Elem()\n\tbig0             = big.NewInt(0)\n)\n\n// makeWriter creates a writer function for the given type.\nfunc makeWriter(typ reflect.Type, ts tags) (writer, error) {\n\tkind := typ.Kind()\n\tswitch {\n\tcase typ == rawValueType:\n\t\treturn writeRawValue, nil\n\tcase typ.Implements(encoderInterface):\n\t\treturn writeEncoder, nil\n\tcase kind != reflect.Ptr && reflect.PtrTo(typ).Implements(encoderInterface):\n\t\treturn writeEncoderNoPtr, nil\n\tcase kind == reflect.Interface:\n\t\treturn writeInterface, nil\n\tcase typ.AssignableTo(reflect.PtrTo(bigInt)):\n\t\treturn writeBigIntPtr, nil\n\tcase typ.AssignableTo(bigInt):\n\t\treturn writeBigIntNoPtr, nil\n\tcase isInt(kind):\n\t\treturn writeInt, nil\n\tcase isUint(kind):\n\t\treturn writeUint, nil\n\tcase kind == reflect.Bool:\n\t\treturn writeBool, nil\n\tcase kind == reflect.String:\n\t\treturn writeString, nil\n\tcase kind == reflect.Slice && isByte(typ.Elem()):\n\t\treturn writeBytes, nil\n\tcase kind == reflect.Array && isByte(typ.Elem()):\n\t\treturn writeByteArray, nil\n\tcase kind == reflect.Slice || kind == reflect.Array:\n\t\treturn makeSliceWriter(typ, ts)\n\tcase kind == reflect.Struct:\n\t\treturn makeStructWriter(typ)\n\tcase kind == reflect.Ptr:\n\t\treturn makePtrWriter(typ)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"rlp: type %v is not RLP-serializable\", typ)\n\t}\n}\n\nfunc isByte(typ reflect.Type) bool {\n\treturn typ.Kind() == reflect.Uint8 && !typ.Implements(encoderInterface)\n}\n\nfunc writeRawValue(val reflect.Value, w *encbuf) error {\n\tw.str = append(w.str, val.Bytes()...)\n\treturn nil\n}\n\nfunc writeUint(val reflect.Value, w *encbuf) error {\n\ti := val.Uint()\n\tif i == 0 {\n\t\tw.str = append(w.str, 0x80)\n\t} else if i < 128 {\n\t\t// fits single byte\n\t\tw.str = append(w.str, byte(i))\n\t} else {\n\t\t// TODO: encode int to w.str directly\n\t\ts := putint(w.sizebuf[1:], i)\n\t\tw.sizebuf[0] = 0x80 + byte(s)\n\t\tw.str = append(w.str, w.sizebuf[:s+1]...)\n\t}\n\treturn nil\n}\n\nfunc writeInt(val reflect.Value, w *encbuf) error {\n\tv := val.Int()\n\ti := uint64(v)\n\tif i == 0 {\n\t\tw.str = append(w.str, 0x80)\n\t} else if i < 128 {\n\t\t// fits single byte\n\t\tw.str = append(w.str, byte(i))\n\t} else {\n\t\t// TODO: encode int to w.str directly\n\t\ts := putint(w.sizebuf[1:], i)\n\t\tw.sizebuf[0] = 0x80 + byte(s)\n\t\tw.str = append(w.str, w.sizebuf[:s+1]...)\n\t}\n\treturn nil\n}\n\nfunc writeBool(val reflect.Value, w *encbuf) error {\n\tif val.Bool() {\n\t\tw.str = append(w.str, 0x01)\n\t} else {\n\t\tw.str = append(w.str, 0x80)\n\t}\n\treturn nil\n}\n\nfunc writeBigIntPtr(val reflect.Value, w *encbuf) error {\n\tptr := val.Interface().(*big.Int)\n\tif ptr == nil {\n\t\tw.str = append(w.str, 0x80)\n\t\treturn nil\n\t}\n\treturn writeBigInt(ptr, w)\n}\n\nfunc writeBigIntNoPtr(val reflect.Value, w *encbuf) error {\n\ti := val.Interface().(big.Int)\n\treturn writeBigInt(&i, w)\n}\n\nfunc writeBigInt(i *big.Int, w *encbuf) error {\n\tif cmp := i.Cmp(big0); cmp == -1 {\n\t\treturn fmt.Errorf(\"rlp: cannot encode negative *big.Int\")\n\t} else if cmp == 0 {\n\t\tw.str = append(w.str, 0x80)\n\t} else {\n\t\tw.encodeString(i.Bytes())\n\t}\n\treturn nil\n}\n\nfunc writeBytes(val reflect.Value, w *encbuf) error {\n\tw.encodeString(val.Bytes())\n\treturn nil\n}\n\nfunc writeByteArray(val reflect.Value, w *encbuf) error {\n\tif !val.CanAddr() {\n\t\t// Slice requires the value to be addressable.\n\t\t// Make it addressable by copying.\n\t\tcopy := reflect.New(val.Type()).Elem()\n\t\tcopy.Set(val)\n\t\tval = copy\n\t}\n\tsize := val.Len()\n\tslice := val.Slice(0, size).Bytes()\n\tw.encodeString(slice)\n\treturn nil\n}\n\nfunc writeString(val reflect.Value, w *encbuf) error {\n\ts := val.String()\n\tif len(s) == 1 && s[0] <= 0x7f {\n\t\t// fits single byte, no string header\n\t\tw.str = append(w.str, s[0])\n\t} else {\n\t\tw.encodeStringHeader(len(s))\n\t\tw.str = append(w.str, s...)\n\t}\n\treturn nil\n}\n\nfunc writeEncoder(val reflect.Value, w *encbuf) error {\n\treturn val.Interface().(Encoder).EncodeRLP(w)\n}\n\n// writeEncoderNoPtr handles non-pointer values that implement Encoder\n// with a pointer receiver.\nfunc writeEncoderNoPtr(val reflect.Value, w *encbuf) error {\n\tif !val.CanAddr() {\n\t\t// We can't get the address. It would be possible to make the\n\t\t// value addressable by creating a shallow copy, but this\n\t\t// creates other problems so we're not doing it (yet).\n\t\t//\n\t\t// package json simply doesn't call MarshalJSON for cases like\n\t\t// this, but encodes the value as if it didn't implement the\n\t\t// interface. We don't want to handle it that way.\n\t\treturn fmt.Errorf(\"rlp: game over: unadressable value of type %v, EncodeRLP is pointer method\", val.Type())\n\t}\n\treturn val.Addr().Interface().(Encoder).EncodeRLP(w)\n}\n\nfunc writeInterface(val reflect.Value, w *encbuf) error {\n\tif val.IsNil() {\n\t\t// Write empty list. This is consistent with the previous RLP\n\t\t// encoder that we had and should therefore avoid any\n\t\t// problems.\n\t\tw.str = append(w.str, 0xC0)\n\t\treturn nil\n\t}\n\teval := val.Elem()\n\tti, err := cachedTypeInfo(eval.Type(), tags{})\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ti.writer(eval, w)\n}\n\nfunc makeSliceWriter(typ reflect.Type, ts tags) (writer, error) {\n\tetypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\twriter := func(val reflect.Value, w *encbuf) error {\n\t\tif !ts.tail {\n\t\t\tdefer w.listEnd(w.list())\n\t\t}\n\t\tvlen := val.Len()\n\t\tfor i := 0; i < vlen; i++ {\n\t\t\tif err := etypeinfo.writer(val.Index(i), w); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\treturn writer, nil\n}\n\nfunc makeStructWriter(typ reflect.Type) (writer, error) {\n\tfields, err := structFields(typ)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\twriter := func(val reflect.Value, w *encbuf) error {\n\t\tlh := w.list()\n\t\tfor _, f := range fields {\n\t\t\tif err := f.info.writer(val.Field(f.index), w); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tw.listEnd(lh)\n\t\treturn nil\n\t}\n\treturn writer, nil\n}\n\nfunc makePtrWriter(typ reflect.Type) (writer, error) {\n\tetypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// determine nil pointer handler\n\tvar nilfunc func(*encbuf) error\n\tkind := typ.Elem().Kind()\n\tswitch {\n\tcase kind == reflect.Array && isByte(typ.Elem().Elem()):\n\t\tnilfunc = func(w *encbuf) error {\n\t\t\tw.str = append(w.str, 0x80)\n\t\t\treturn nil\n\t\t}\n\tcase kind == reflect.Struct || kind == reflect.Array:\n\t\tnilfunc = func(w *encbuf) error {\n\t\t\t// encoding the zero value of a struct/array could trigger\n\t\t\t// infinite recursion, avoid that.\n\t\t\tw.listEnd(w.list())\n\t\t\treturn nil\n\t\t}\n\tdefault:\n\t\tzero := reflect.Zero(typ.Elem())\n\t\tnilfunc = func(w *encbuf) error {\n\t\t\treturn etypeinfo.writer(zero, w)\n\t\t}\n\t}\n\n\twriter := func(val reflect.Value, w *encbuf) error {\n\t\tif val.IsNil() {\n\t\t\treturn nilfunc(w)\n\t\t}\n\t\treturn etypeinfo.writer(val.Elem(), w)\n\t}\n\treturn writer, err\n}\n\n// putint writes i to the beginning of b in big endian byte\n// order, using the least number of bytes needed to represent i.\nfunc putint(b []byte, i uint64) (size int) {\n\tswitch {\n\tcase i < (1 << 8):\n\t\tb[0] = byte(i)\n\t\treturn 1\n\tcase i < (1 << 16):\n\t\tb[0] = byte(i >> 8)\n\t\tb[1] = byte(i)\n\t\treturn 2\n\tcase i < (1 << 24):\n\t\tb[0] = byte(i >> 16)\n\t\tb[1] = byte(i >> 8)\n\t\tb[2] = byte(i)\n\t\treturn 3\n\tcase i < (1 << 32):\n\t\tb[0] = byte(i >> 24)\n\t\tb[1] = byte(i >> 16)\n\t\tb[2] = byte(i >> 8)\n\t\tb[3] = byte(i)\n\t\treturn 4\n\tcase i < (1 << 40):\n\t\tb[0] = byte(i >> 32)\n\t\tb[1] = byte(i >> 24)\n\t\tb[2] = byte(i >> 16)\n\t\tb[3] = byte(i >> 8)\n\t\tb[4] = byte(i)\n\t\treturn 5\n\tcase i < (1 << 48):\n\t\tb[0] = byte(i >> 40)\n\t\tb[1] = byte(i >> 32)\n\t\tb[2] = byte(i >> 24)\n\t\tb[3] = byte(i >> 16)\n\t\tb[4] = byte(i >> 8)\n\t\tb[5] = byte(i)\n\t\treturn 6\n\tcase i < (1 << 56):\n\t\tb[0] = byte(i >> 48)\n\t\tb[1] = byte(i >> 40)\n\t\tb[2] = byte(i >> 32)\n\t\tb[3] = byte(i >> 24)\n\t\tb[4] = byte(i >> 16)\n\t\tb[5] = byte(i >> 8)\n\t\tb[6] = byte(i)\n\t\treturn 7\n\tdefault:\n\t\tb[0] = byte(i >> 56)\n\t\tb[1] = byte(i >> 48)\n\t\tb[2] = byte(i >> 40)\n\t\tb[3] = byte(i >> 32)\n\t\tb[4] = byte(i >> 24)\n\t\tb[5] = byte(i >> 16)\n\t\tb[6] = byte(i >> 8)\n\t\tb[7] = byte(i)\n\t\treturn 8\n\t}\n}\n\n// intsize computes the minimum number of bytes required to store i.\nfunc intsize(i uint64) (size int) {\n\tfor size = 1; ; size++ {\n\t\tif i >>= 8; i == 0 {\n\t\t\treturn size\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "rlp/raw.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rlp\n\nimport (\n\t\"io\"\n\t\"reflect\"\n)\n\n// RawValue represents an encoded RLP value and can be used to delay\n// RLP decoding or to precompute an encoding. Note that the decoder does\n// not verify whether the content of RawValues is valid RLP.\ntype RawValue []byte\n\nvar rawValueType = reflect.TypeOf(RawValue{})\n\n// ListSize returns the encoded size of an RLP list with the given\n// content size.\nfunc ListSize(contentSize uint64) uint64 {\n\treturn uint64(headsize(contentSize)) + contentSize\n}\n\n// Split returns the content of first RLP value and any\n// bytes after the value as subslices of b.\nfunc Split(b []byte) (k Kind, content, rest []byte, err error) {\n\tk, ts, cs, err := readKind(b)\n\tif err != nil {\n\t\treturn 0, nil, b, err\n\t}\n\treturn k, b[ts : ts+cs], b[ts+cs:], nil\n}\n\n// SplitString splits b into the content of an RLP string\n// and any remaining bytes after the string.\nfunc SplitString(b []byte) (content, rest []byte, err error) {\n\tk, content, rest, err := Split(b)\n\tif err != nil {\n\t\treturn nil, b, err\n\t}\n\tif k == List {\n\t\treturn nil, b, ErrExpectedString\n\t}\n\treturn content, rest, nil\n}\n\n// SplitList splits b into the content of a list and any remaining\n// bytes after the list.\nfunc SplitList(b []byte) (content, rest []byte, err error) {\n\tk, content, rest, err := Split(b)\n\tif err != nil {\n\t\treturn nil, b, err\n\t}\n\tif k != List {\n\t\treturn nil, b, ErrExpectedList\n\t}\n\treturn content, rest, nil\n}\n\n// CountValues counts the number of encoded values in b.\nfunc CountValues(b []byte) (int, error) {\n\ti := 0\n\tfor ; len(b) > 0; i++ {\n\t\t_, tagsize, size, err := readKind(b)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tb = b[tagsize+size:]\n\t}\n\treturn i, nil\n}\n\nfunc readKind(buf []byte) (k Kind, tagsize, contentsize uint64, err error) {\n\tif len(buf) == 0 {\n\t\treturn 0, 0, 0, io.ErrUnexpectedEOF\n\t}\n\tb := buf[0]\n\tswitch {\n\tcase b < 0x80:\n\t\tk = Byte\n\t\ttagsize = 0\n\t\tcontentsize = 1\n\tcase b < 0xB8:\n\t\tk = String\n\t\ttagsize = 1\n\t\tcontentsize = uint64(b - 0x80)\n\t\t// Reject strings that should've been single bytes.\n\t\tif contentsize == 1 && len(buf) > 1 && buf[1] < 128 {\n\t\t\treturn 0, 0, 0, ErrCanonSize\n\t\t}\n\tcase b < 0xC0:\n\t\tk = String\n\t\ttagsize = uint64(b-0xB7) + 1\n\t\tcontentsize, err = readSize(buf[1:], b-0xB7)\n\tcase b < 0xF8:\n\t\tk = List\n\t\ttagsize = 1\n\t\tcontentsize = uint64(b - 0xC0)\n\tdefault:\n\t\tk = List\n\t\ttagsize = uint64(b-0xF7) + 1\n\t\tcontentsize, err = readSize(buf[1:], b-0xF7)\n\t}\n\tif err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\t// Reject values larger than the input slice.\n\tif contentsize > uint64(len(buf))-tagsize {\n\t\treturn 0, 0, 0, ErrValueTooLarge\n\t}\n\treturn k, tagsize, contentsize, err\n}\n\nfunc readSize(b []byte, slen byte) (uint64, error) {\n\tif int(slen) > len(b) {\n\t\treturn 0, io.ErrUnexpectedEOF\n\t}\n\tvar s uint64\n\tswitch slen {\n\tcase 1:\n\t\ts = uint64(b[0])\n\tcase 2:\n\t\ts = uint64(b[0])<<8 | uint64(b[1])\n\tcase 3:\n\t\ts = uint64(b[0])<<16 | uint64(b[1])<<8 | uint64(b[2])\n\tcase 4:\n\t\ts = uint64(b[0])<<24 | uint64(b[1])<<16 | uint64(b[2])<<8 | uint64(b[3])\n\tcase 5:\n\t\ts = uint64(b[0])<<32 | uint64(b[1])<<24 | uint64(b[2])<<16 | uint64(b[3])<<8 | uint64(b[4])\n\tcase 6:\n\t\ts = uint64(b[0])<<40 | uint64(b[1])<<32 | uint64(b[2])<<24 | uint64(b[3])<<16 | uint64(b[4])<<8 | uint64(b[5])\n\tcase 7:\n\t\ts = uint64(b[0])<<48 | uint64(b[1])<<40 | uint64(b[2])<<32 | uint64(b[3])<<24 | uint64(b[4])<<16 | uint64(b[5])<<8 | uint64(b[6])\n\tcase 8:\n\t\ts = uint64(b[0])<<56 | uint64(b[1])<<48 | uint64(b[2])<<40 | uint64(b[3])<<32 | uint64(b[4])<<24 | uint64(b[5])<<16 | uint64(b[6])<<8 | uint64(b[7])\n\t}\n\t// Reject sizes < 56 (shouldn't have separate size) and sizes with\n\t// leading zero bytes.\n\tif s < 56 || b[0] == 0 {\n\t\treturn 0, ErrCanonSize\n\t}\n\treturn s, nil\n}\n"
  },
  {
    "path": "rlp/typecache.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rlp\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n)\n\nvar (\n\ttypeCacheMutex sync.RWMutex\n\ttypeCache      = make(map[typekey]*typeinfo)\n)\n\ntype typeinfo struct {\n\tdecoder\n\twriter\n}\n\n// represents struct tags\ntype tags struct {\n\t// rlp:\"nil\" controls whether empty input results in a nil pointer.\n\tnilOK bool\n\t// rlp:\"tail\" controls whether this field swallows additional list\n\t// elements. It can only be set for the last field, which must be\n\t// of slice type.\n\ttail bool\n\t// rlp:\"-\" ignores fields.\n\tignored bool\n}\n\ntype typekey struct {\n\treflect.Type\n\t// the key must include the struct tags because they\n\t// might generate a different decoder.\n\ttags\n}\n\ntype decoder func(*Stream, reflect.Value) error\n\ntype writer func(reflect.Value, *encbuf) error\n\nfunc cachedTypeInfo(typ reflect.Type, tags tags) (*typeinfo, error) {\n\ttypeCacheMutex.RLock()\n\tinfo := typeCache[typekey{typ, tags}]\n\ttypeCacheMutex.RUnlock()\n\tif info != nil {\n\t\treturn info, nil\n\t}\n\t// not in the cache, need to generate info for this type.\n\ttypeCacheMutex.Lock()\n\tdefer typeCacheMutex.Unlock()\n\treturn cachedTypeInfo1(typ, tags)\n}\n\nfunc cachedTypeInfo1(typ reflect.Type, tags tags) (*typeinfo, error) {\n\tkey := typekey{typ, tags}\n\tinfo := typeCache[key]\n\tif info != nil {\n\t\t// another goroutine got the write lock first\n\t\treturn info, nil\n\t}\n\t// put a dummmy value into the cache before generating.\n\t// if the generator tries to lookup itself, it will get\n\t// the dummy value and won't call itself recursively.\n\ttypeCache[key] = new(typeinfo)\n\tinfo, err := genTypeInfo(typ, tags)\n\tif err != nil {\n\t\t// remove the dummy value if the generator fails\n\t\tdelete(typeCache, key)\n\t\treturn nil, err\n\t}\n\t*typeCache[key] = *info\n\treturn typeCache[key], err\n}\n\ntype field struct {\n\tindex int\n\tinfo  *typeinfo\n}\n\nfunc structFields(typ reflect.Type) (fields []field, err error) {\n\tfor i := 0; i < typ.NumField(); i++ {\n\t\tif f := typ.Field(i); f.PkgPath == \"\" { // exported\n\t\t\ttags, err := parseStructTag(typ, i)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif tags.ignored {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tinfo, err := cachedTypeInfo1(f.Type, tags)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tfields = append(fields, field{i, info})\n\t\t}\n\t}\n\treturn fields, nil\n}\n\nfunc parseStructTag(typ reflect.Type, fi int) (tags, error) {\n\tf := typ.Field(fi)\n\tvar ts tags\n\tfor _, t := range strings.Split(f.Tag.Get(\"rlp\"), \",\") {\n\t\tswitch t = strings.TrimSpace(t); t {\n\t\tcase \"\":\n\t\tcase \"-\":\n\t\t\tts.ignored = true\n\t\tcase \"nil\":\n\t\t\tts.nilOK = true\n\t\tcase \"tail\":\n\t\t\tts.tail = true\n\t\t\tif fi != typ.NumField()-1 {\n\t\t\t\treturn ts, fmt.Errorf(`rlp: invalid struct tag \"tail\" for %v.%s (must be on last field)`, typ, f.Name)\n\t\t\t}\n\t\t\tif f.Type.Kind() != reflect.Slice {\n\t\t\t\treturn ts, fmt.Errorf(`rlp: invalid struct tag \"tail\" for %v.%s (field type is not slice)`, typ, f.Name)\n\t\t\t}\n\t\tdefault:\n\t\t\treturn ts, fmt.Errorf(\"rlp: unknown struct tag %q on %v.%s\", t, typ, f.Name)\n\t\t}\n\t}\n\treturn ts, nil\n}\n\nfunc genTypeInfo(typ reflect.Type, tags tags) (info *typeinfo, err error) {\n\tinfo = new(typeinfo)\n\tif info.decoder, err = makeDecoder(typ, tags); err != nil {\n\t\treturn nil, err\n\t}\n\tif info.writer, err = makeWriter(typ, tags); err != nil {\n\t\treturn nil, err\n\t}\n\treturn info, nil\n}\n\nfunc isUint(k reflect.Kind) bool {\n\treturn k >= reflect.Uint && k <= reflect.Uintptr\n}\n\nfunc isInt(k reflect.Kind) bool {\n\treturn k >= reflect.Int && k <= reflect.Int64\n}\n"
  },
  {
    "path": "rpc/client.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"bytes\"\n\t\"container/list\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/url\"\n\t\"os\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nvar (\n\tErrClientQuit                = errors.New(\"client is closed\")\n\tErrNoResult                  = errors.New(\"no result in JSON-RPC response\")\n\tErrSubscriptionQueueOverflow = errors.New(\"subscription queue overflow\")\n)\n\nconst (\n\t// Timeouts\n\ttcpKeepAliveInterval = 30 * time.Second\n\tdefaultDialTimeout   = 10 * time.Second // used when dialing if the context has no deadline\n\tdefaultWriteTimeout  = 10 * time.Second // used for calls if the context has no deadline\n\tsubscribeTimeout     = 5 * time.Second  // overall timeout sero_subscribe, rpc_modules calls\n)\n\nconst (\n\t// Subscriptions are removed when the subscriber cannot keep up.\n\t//\n\t// This can be worked around by supplying a channel with sufficiently sized buffer,\n\t// but this can be inconvenient and hard to explain in the docs. Another issue with\n\t// buffered channels is that the buffer is static even though it might not be needed\n\t// most of the time.\n\t//\n\t// The approach taken here is to maintain a per-subscription linked list buffer\n\t// shrinks on demand. If the buffer reaches the size below, the subscription is\n\t// dropped.\n\tmaxClientSubscriptionBuffer = 20000\n)\n\n// BatchElem is an element in a batch request.\ntype BatchElem struct {\n\tMethod string\n\tArgs   []interface{}\n\t// The result is unmarshaled into this field. Result must be set to a\n\t// non-nil pointer value of the desired type, otherwise the response will be\n\t// discarded.\n\tResult interface{}\n\t// Error is set if the server returns an error for this request, or if\n\t// unmarshaling into Result fails. It is not set for I/O errors.\n\tError error\n}\n\n// A value of this type can a JSON-RPC request, notification, successful response or\n// error response. Which one it is depends on the fields.\ntype jsonrpcMessage struct {\n\tVersion string          `json:\"jsonrpc\"`\n\tID      json.RawMessage `json:\"id,omitempty\"`\n\tMethod  string          `json:\"method,omitempty\"`\n\tParams  json.RawMessage `json:\"params,omitempty\"`\n\tError   *jsonError      `json:\"error,omitempty\"`\n\tResult  json.RawMessage `json:\"result,omitempty\"`\n}\n\nfunc (msg *jsonrpcMessage) isNotification() bool {\n\treturn msg.ID == nil && msg.Method != \"\"\n}\n\nfunc (msg *jsonrpcMessage) isResponse() bool {\n\treturn msg.hasValidID() && msg.Method == \"\" && len(msg.Params) == 0\n}\n\nfunc (msg *jsonrpcMessage) hasValidID() bool {\n\treturn len(msg.ID) > 0 && msg.ID[0] != '{' && msg.ID[0] != '['\n}\n\nfunc (msg *jsonrpcMessage) String() string {\n\tb, _ := json.Marshal(msg)\n\treturn string(b)\n}\n\n// Client represents a connection to an RPC server.\ntype Client struct {\n\tidCounter   uint32\n\tconnectFunc func(ctx context.Context) (net.Conn, error)\n\tisHTTP      bool\n\n\t// writeConn is only safe to access outside dispatch, with the\n\t// write lock held. The write lock is taken by sending on\n\t// requestOp and released by sending on sendDone.\n\twriteConn net.Conn\n\n\t// for dispatch\n\tclose       chan struct{}\n\tdidQuit     chan struct{}                  // closed when client quits\n\treconnected chan net.Conn                  // where write/reconnect sends the new connection\n\treadErr     chan error                     // errors from read\n\treadResp    chan []*jsonrpcMessage         // valid messages from read\n\trequestOp   chan *requestOp                // for registering response IDs\n\tsendDone    chan error                     // signals write completion, releases write lock\n\trespWait    map[string]*requestOp          // active requests\n\tsubs        map[string]*ClientSubscription // active subscriptions\n}\n\ntype requestOp struct {\n\tids  []json.RawMessage\n\terr  error\n\tresp chan *jsonrpcMessage // receives up to len(ids) responses\n\tsub  *ClientSubscription  // only set for EthSubscribe requests\n}\n\nfunc (op *requestOp) wait(ctx context.Context) (*jsonrpcMessage, error) {\n\tselect {\n\tcase <-ctx.Done():\n\t\treturn nil, ctx.Err()\n\tcase resp := <-op.resp:\n\t\treturn resp, op.err\n\t}\n}\n\n// Dial creates a new client for the given URL.\n//\n// The currently supported URL schemes are \"http\", \"https\", \"ws\" and \"wss\". If rawurl is a\n// file name with no URL scheme, a local socket connection is established using UNIX\n// domain sockets on supported platforms and named pipes on Windows. If you want to\n// configure transport options, use DialHTTP, DialWebsocket or DialIPC instead.\n//\n// For websocket connections, the origin is set to the local host name.\n//\n// The client reconnects automatically if the connection is lost.\nfunc Dial(rawurl string) (*Client, error) {\n\treturn DialContext(context.Background(), rawurl)\n}\n\n// DialContext creates a new RPC client, just like Dial.\n//\n// The context is used to cancel or time out the initial connection establishment. It does\n// not affect subsequent interactions with the client.\nfunc DialContext(ctx context.Context, rawurl string) (*Client, error) {\n\tu, err := url.Parse(rawurl)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitch u.Scheme {\n\tcase \"http\", \"https\":\n\t\treturn DialHTTP(rawurl)\n\tcase \"ws\", \"wss\":\n\t\treturn DialWebsocket(ctx, rawurl, \"\")\n\tcase \"stdio\":\n\t\treturn DialStdIO(ctx)\n\tcase \"\":\n\t\treturn DialIPC(ctx, rawurl)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"no known transport for URL scheme %q\", u.Scheme)\n\t}\n}\n\ntype StdIOConn struct{}\n\nfunc (io StdIOConn) Read(b []byte) (n int, err error) {\n\treturn os.Stdin.Read(b)\n}\n\nfunc (io StdIOConn) Write(b []byte) (n int, err error) {\n\treturn os.Stdout.Write(b)\n}\n\nfunc (io StdIOConn) Close() error {\n\treturn nil\n}\n\nfunc (io StdIOConn) LocalAddr() net.Addr {\n\treturn &net.UnixAddr{Name: \"stdio\", Net: \"stdio\"}\n}\n\nfunc (io StdIOConn) RemoteAddr() net.Addr {\n\treturn &net.UnixAddr{Name: \"stdio\", Net: \"stdio\"}\n}\n\nfunc (io StdIOConn) SetDeadline(t time.Time) error {\n\treturn &net.OpError{Op: \"set\", Net: \"stdio\", Source: nil, Addr: nil, Err: errors.New(\"deadline not supported\")}\n}\n\nfunc (io StdIOConn) SetReadDeadline(t time.Time) error {\n\treturn &net.OpError{Op: \"set\", Net: \"stdio\", Source: nil, Addr: nil, Err: errors.New(\"deadline not supported\")}\n}\n\nfunc (io StdIOConn) SetWriteDeadline(t time.Time) error {\n\treturn &net.OpError{Op: \"set\", Net: \"stdio\", Source: nil, Addr: nil, Err: errors.New(\"deadline not supported\")}\n}\nfunc DialStdIO(ctx context.Context) (*Client, error) {\n\treturn newClient(ctx, func(_ context.Context) (net.Conn, error) {\n\t\treturn StdIOConn{}, nil\n\t})\n}\n\nfunc newClient(initctx context.Context, connectFunc func(context.Context) (net.Conn, error)) (*Client, error) {\n\tconn, err := connectFunc(initctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t_, isHTTP := conn.(*httpConn)\n\tc := &Client{\n\t\twriteConn:   conn,\n\t\tisHTTP:      isHTTP,\n\t\tconnectFunc: connectFunc,\n\t\tclose:       make(chan struct{}),\n\t\tdidQuit:     make(chan struct{}),\n\t\treconnected: make(chan net.Conn),\n\t\treadErr:     make(chan error),\n\t\treadResp:    make(chan []*jsonrpcMessage),\n\t\trequestOp:   make(chan *requestOp),\n\t\tsendDone:    make(chan error, 1),\n\t\trespWait:    make(map[string]*requestOp),\n\t\tsubs:        make(map[string]*ClientSubscription),\n\t}\n\tif !isHTTP {\n\t\tgo c.dispatch(conn)\n\t}\n\treturn c, nil\n}\n\nfunc (c *Client) nextID() json.RawMessage {\n\tid := atomic.AddUint32(&c.idCounter, 1)\n\treturn []byte(strconv.FormatUint(uint64(id), 10))\n}\n\n// SupportedModules calls the rpc_modules method, retrieving the list of\n// APIs that are available on the server.\nfunc (c *Client) SupportedModules() (map[string]string, error) {\n\tvar result map[string]string\n\tctx, cancel := context.WithTimeout(context.Background(), subscribeTimeout)\n\tdefer cancel()\n\terr := c.CallContext(ctx, &result, \"rpc_modules\")\n\treturn result, err\n}\n\n// Close closes the client, aborting any in-flight requests.\nfunc (c *Client) Close() {\n\tif c.isHTTP {\n\t\treturn\n\t}\n\tselect {\n\tcase c.close <- struct{}{}:\n\t\t<-c.didQuit\n\tcase <-c.didQuit:\n\t}\n}\n\n// Call performs a JSON-RPC call with the given arguments and unmarshals into\n// result if no error occurred.\n//\n// The result must be a pointer so that package json can unmarshal into it. You\n// can also pass nil, in which case the result is ignored.\nfunc (c *Client) Call(result interface{}, method string, args ...interface{}) error {\n\tctx := context.Background()\n\treturn c.CallContext(ctx, result, method, args...)\n}\n\n// CallContext performs a JSON-RPC call with the given arguments. If the context is\n// canceled before the call has successfully returned, CallContext returns immediately.\n//\n// The result must be a pointer so that package json can unmarshal into it. You\n// can also pass nil, in which case the result is ignored.\nfunc (c *Client) CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error {\n\tmsg, err := c.newMessage(method, args...)\n\tif err != nil {\n\t\treturn err\n\t}\n\top := &requestOp{ids: []json.RawMessage{msg.ID}, resp: make(chan *jsonrpcMessage, 1)}\n\n\tif c.isHTTP {\n\t\terr = c.sendHTTP(ctx, op, msg)\n\t} else {\n\t\terr = c.send(ctx, op, msg)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// dispatch has accepted the request and will close the channel when it quits.\n\tswitch resp, err := op.wait(ctx); {\n\tcase err != nil:\n\t\treturn err\n\tcase resp.Error != nil:\n\t\treturn resp.Error\n\tcase len(resp.Result) == 0:\n\t\treturn ErrNoResult\n\tdefault:\n\t\treturn json.Unmarshal(resp.Result, &result)\n\t}\n}\n\n// BatchCall sends all given requests as a single batch and waits for the server\n// to return a response for all of them.\n//\n// In contrast to Call, BatchCall only returns I/O errors. Any error specific to\n// a request is reported through the Error field of the corresponding BatchElem.\n//\n// Note that batch calls may not be executed atomically on the server side.\nfunc (c *Client) BatchCall(b []BatchElem) error {\n\tctx := context.Background()\n\treturn c.BatchCallContext(ctx, b)\n}\n\n// BatchCall sends all given requests as a single batch and waits for the server\n// to return a response for all of them. The wait duration is bounded by the\n// context's deadline.\n//\n// In contrast to CallContext, BatchCallContext only returns errors that have occurred\n// while sending the request. Any error specific to a request is reported through the\n// Error field of the corresponding BatchElem.\n//\n// Note that batch calls may not be executed atomically on the server side.\nfunc (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error {\n\tmsgs := make([]*jsonrpcMessage, len(b))\n\top := &requestOp{\n\t\tids:  make([]json.RawMessage, len(b)),\n\t\tresp: make(chan *jsonrpcMessage, len(b)),\n\t}\n\tfor i, elem := range b {\n\t\tmsg, err := c.newMessage(elem.Method, elem.Args...)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmsgs[i] = msg\n\t\top.ids[i] = msg.ID\n\t}\n\n\tvar err error\n\tif c.isHTTP {\n\t\terr = c.sendBatchHTTP(ctx, op, msgs)\n\t} else {\n\t\terr = c.send(ctx, op, msgs)\n\t}\n\n\t// Wait for all responses to come back.\n\tfor n := 0; n < len(b) && err == nil; n++ {\n\t\tvar resp *jsonrpcMessage\n\t\tresp, err = op.wait(ctx)\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\t// Find the element corresponding to this response.\n\t\t// The element is guaranteed to be present because dispatch\n\t\t// only sends valid IDs to our channel.\n\t\tvar elem *BatchElem\n\t\tfor i := range msgs {\n\t\t\tif bytes.Equal(msgs[i].ID, resp.ID) {\n\t\t\t\telem = &b[i]\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif resp.Error != nil {\n\t\t\telem.Error = resp.Error\n\t\t\tcontinue\n\t\t}\n\t\tif len(resp.Result) == 0 {\n\t\t\telem.Error = ErrNoResult\n\t\t\tcontinue\n\t\t}\n\t\telem.Error = json.Unmarshal(resp.Result, elem.Result)\n\t}\n\treturn err\n}\n\n// EthSubscribe registers a subscripion under the \"sero\" namespace.\nfunc (c *Client) EthSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) {\n\treturn c.Subscribe(ctx, \"sero\", channel, args...)\n}\n\n// ShhSubscribe registers a subscripion under the \"shh\" namespace.\nfunc (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) {\n\treturn c.Subscribe(ctx, \"shh\", channel, args...)\n}\n\n// Subscribe calls the \"<namespace>_subscribe\" method with the given arguments,\n// registering a subscription. Server notifications for the subscription are\n// sent to the given channel. The element type of the channel must match the\n// expected type of content returned by the subscription.\n//\n// The context argument cancels the RPC request that sets up the subscription but has no\n// effect on the subscription after Subscribe has returned.\n//\n// Slow subscribers will be dropped eventually. Client buffers up to 8000 notifications\n// before considering the subscriber dead. The subscription Err channel will receive\n// ErrSubscriptionQueueOverflow. Use a sufficiently large buffer on the channel or ensure\n// that the channel usually has at least one reader to prevent this issue.\nfunc (c *Client) Subscribe(ctx context.Context, namespace string, channel interface{}, args ...interface{}) (*ClientSubscription, error) {\n\t// Check type of channel first.\n\tchanVal := reflect.ValueOf(channel)\n\tif chanVal.Kind() != reflect.Chan || chanVal.Type().ChanDir()&reflect.SendDir == 0 {\n\t\tpanic(\"first argument to Subscribe must be a writable channel\")\n\t}\n\tif chanVal.IsNil() {\n\t\tpanic(\"channel given to Subscribe must not be nil\")\n\t}\n\tif c.isHTTP {\n\t\treturn nil, ErrNotificationsUnsupported\n\t}\n\n\tmsg, err := c.newMessage(namespace+subscribeMethodSuffix, args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\top := &requestOp{\n\t\tids:  []json.RawMessage{msg.ID},\n\t\tresp: make(chan *jsonrpcMessage),\n\t\tsub:  newClientSubscription(c, namespace, chanVal),\n\t}\n\n\t// Send the subscription request.\n\t// The arrival and validity of the response is signaled on sub.quit.\n\tif err := c.send(ctx, op, msg); err != nil {\n\t\treturn nil, err\n\t}\n\tif _, err := op.wait(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\treturn op.sub, nil\n}\n\nfunc (c *Client) newMessage(method string, paramsIn ...interface{}) (*jsonrpcMessage, error) {\n\tparams, err := json.Marshal(paramsIn)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &jsonrpcMessage{Version: \"2.0\", ID: c.nextID(), Method: method, Params: params}, nil\n}\n\n// send registers op with the dispatch loop, then sends msg on the connection.\n// if sending fails, op is deregistered.\nfunc (c *Client) send(ctx context.Context, op *requestOp, msg interface{}) error {\n\tselect {\n\tcase c.requestOp <- op:\n\t\tlog.Trace(\"\", \"msg\", log.Lazy{Fn: func() string {\n\t\t\treturn fmt.Sprint(\"sending \", msg)\n\t\t}})\n\t\terr := c.write(ctx, msg)\n\t\tc.sendDone <- err\n\t\treturn err\n\tcase <-ctx.Done():\n\t\t// This can happen if the client is overloaded or unable to keep up with\n\t\t// subscription notifications.\n\t\treturn ctx.Err()\n\tcase <-c.didQuit:\n\t\treturn ErrClientQuit\n\t}\n}\n\nfunc (c *Client) write(ctx context.Context, msg interface{}) error {\n\tdeadline, ok := ctx.Deadline()\n\tif !ok {\n\t\tdeadline = time.Now().Add(defaultWriteTimeout)\n\t}\n\t// The previous write failed. Try to establish a new connection.\n\tif c.writeConn == nil {\n\t\tif err := c.reconnect(ctx); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tc.writeConn.SetWriteDeadline(deadline)\n\terr := json.NewEncoder(c.writeConn).Encode(msg)\n\tif err != nil {\n\t\tc.writeConn = nil\n\t}\n\treturn err\n}\n\nfunc (c *Client) reconnect(ctx context.Context) error {\n\tnewconn, err := c.connectFunc(ctx)\n\tif err != nil {\n\t\tlog.Trace(fmt.Sprintf(\"reconnect failed: %v\", err))\n\t\treturn err\n\t}\n\tselect {\n\tcase c.reconnected <- newconn:\n\t\tc.writeConn = newconn\n\t\treturn nil\n\tcase <-c.didQuit:\n\t\tnewconn.Close()\n\t\treturn ErrClientQuit\n\t}\n}\n\n// dispatch is the main loop of the client.\n// It sends read messages to waiting calls to Call and BatchCall\n// and subscription notifications to registered subscriptions.\nfunc (c *Client) dispatch(conn net.Conn) {\n\t// Spawn the initial read loop.\n\tgo c.read(conn)\n\n\tvar (\n\t\tlastOp        *requestOp    // tracks last send operation\n\t\trequestOpLock = c.requestOp // nil while the send lock is held\n\t\treading       = true        // if true, a read loop is running\n\t)\n\tdefer close(c.didQuit)\n\tdefer func() {\n\t\tc.closeRequestOps(ErrClientQuit)\n\t\tconn.Close()\n\t\tif reading {\n\t\t\t// Empty read channels until read is dead.\n\t\t\tfor {\n\t\t\t\tselect {\n\t\t\t\tcase <-c.readResp:\n\t\t\t\tcase <-c.readErr:\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}()\n\n\tfor {\n\t\tselect {\n\t\tcase <-c.close:\n\t\t\treturn\n\n\t\t// Read path.\n\t\tcase batch := <-c.readResp:\n\t\t\tfor _, msg := range batch {\n\t\t\t\tswitch {\n\t\t\t\tcase msg.isNotification():\n\t\t\t\t\tlog.Trace(\"\", \"msg\", log.Lazy{Fn: func() string {\n\t\t\t\t\t\treturn fmt.Sprint(\"<-readResp: notification \", msg)\n\t\t\t\t\t}})\n\t\t\t\t\tc.handleNotification(msg)\n\t\t\t\tcase msg.isResponse():\n\t\t\t\t\tlog.Trace(\"\", \"msg\", log.Lazy{Fn: func() string {\n\t\t\t\t\t\treturn fmt.Sprint(\"<-readResp: response \", msg)\n\t\t\t\t\t}})\n\t\t\t\t\tc.handleResponse(msg)\n\t\t\t\tdefault:\n\t\t\t\t\tlog.Debug(\"\", \"msg\", log.Lazy{Fn: func() string {\n\t\t\t\t\t\treturn fmt.Sprint(\"<-readResp: dropping weird message\", msg)\n\t\t\t\t\t}})\n\t\t\t\t\t// TODO: maybe close\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase err := <-c.readErr:\n\t\t\tlog.Debug(\"<-readErr\", \"err\", err)\n\t\t\tc.closeRequestOps(err)\n\t\t\tconn.Close()\n\t\t\treading = false\n\n\t\tcase newconn := <-c.reconnected:\n\t\t\tlog.Debug(\"<-reconnected\", \"reading\", reading, \"remote\", conn.RemoteAddr())\n\t\t\tif reading {\n\t\t\t\t// Wait for the previous read loop to exit. This is a rare case.\n\t\t\t\tconn.Close()\n\t\t\t\t<-c.readErr\n\t\t\t}\n\t\t\tgo c.read(newconn)\n\t\t\treading = true\n\t\t\tconn = newconn\n\n\t\t// Send path.\n\t\tcase op := <-requestOpLock:\n\t\t\t// Stop listening for further send ops until the current one is done.\n\t\t\trequestOpLock = nil\n\t\t\tlastOp = op\n\t\t\tfor _, id := range op.ids {\n\t\t\t\tc.respWait[string(id)] = op\n\t\t\t}\n\n\t\tcase err := <-c.sendDone:\n\t\t\tif err != nil {\n\t\t\t\t// Remove response handlers for the last send. We remove those here\n\t\t\t\t// because the error is already handled in Call or BatchCall. When the\n\t\t\t\t// read loop goes down, it will signal all other current operations.\n\t\t\t\tfor _, id := range lastOp.ids {\n\t\t\t\t\tdelete(c.respWait, string(id))\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Listen for send ops again.\n\t\t\trequestOpLock = c.requestOp\n\t\t\tlastOp = nil\n\t\t}\n\t}\n}\n\n// closeRequestOps unblocks pending send ops and active subscriptions.\nfunc (c *Client) closeRequestOps(err error) {\n\tdidClose := make(map[*requestOp]bool)\n\n\tfor id, op := range c.respWait {\n\t\t// Remove the op so that later calls will not close op.resp again.\n\t\tdelete(c.respWait, id)\n\n\t\tif !didClose[op] {\n\t\t\top.err = err\n\t\t\tclose(op.resp)\n\t\t\tdidClose[op] = true\n\t\t}\n\t}\n\tfor id, sub := range c.subs {\n\t\tdelete(c.subs, id)\n\t\tsub.quitWithError(err, false)\n\t}\n}\n\nfunc (c *Client) handleNotification(msg *jsonrpcMessage) {\n\tif !strings.HasSuffix(msg.Method, notificationMethodSuffix) {\n\t\tlog.Debug(\"dropping non-subscription message\", \"msg\", msg)\n\t\treturn\n\t}\n\tvar subResult struct {\n\t\tID     string          `json:\"subscription\"`\n\t\tResult json.RawMessage `json:\"result\"`\n\t}\n\tif err := json.Unmarshal(msg.Params, &subResult); err != nil {\n\t\tlog.Debug(\"dropping invalid subscription message\", \"msg\", msg)\n\t\treturn\n\t}\n\tif c.subs[subResult.ID] != nil {\n\t\tc.subs[subResult.ID].deliver(subResult.Result)\n\t}\n}\n\nfunc (c *Client) handleResponse(msg *jsonrpcMessage) {\n\top := c.respWait[string(msg.ID)]\n\tif op == nil {\n\t\tlog.Debug(\"unsolicited response\", \"msg\", msg)\n\t\treturn\n\t}\n\tdelete(c.respWait, string(msg.ID))\n\t// For normal responses, just forward the reply to Call/BatchCall.\n\tif op.sub == nil {\n\t\top.resp <- msg\n\t\treturn\n\t}\n\t// For subscription responses, start the subscription if the server\n\t// indicates success. EthSubscribe gets unblocked in either case through\n\t// the op.resp channel.\n\tdefer close(op.resp)\n\tif msg.Error != nil {\n\t\top.err = msg.Error\n\t\treturn\n\t}\n\tif op.err = json.Unmarshal(msg.Result, &op.sub.subid); op.err == nil {\n\t\tgo op.sub.start()\n\t\tc.subs[op.sub.subid] = op.sub\n\t}\n}\n\n// Reading happens on a dedicated goroutine.\n\nfunc (c *Client) read(conn net.Conn) error {\n\tvar (\n\t\tbuf json.RawMessage\n\t\tdec = json.NewDecoder(conn)\n\t)\n\treadMessage := func() (rs []*jsonrpcMessage, err error) {\n\t\tbuf = buf[:0]\n\t\tif err = dec.Decode(&buf); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif isBatch(buf) {\n\t\t\terr = json.Unmarshal(buf, &rs)\n\t\t} else {\n\t\t\trs = make([]*jsonrpcMessage, 1)\n\t\t\terr = json.Unmarshal(buf, &rs[0])\n\t\t}\n\t\treturn rs, err\n\t}\n\n\tfor {\n\t\tresp, err := readMessage()\n\t\tif err != nil {\n\t\t\tc.readErr <- err\n\t\t\treturn err\n\t\t}\n\t\tc.readResp <- resp\n\t}\n}\n\n// Subscriptions.\n\n// A ClientSubscription represents a subscription established through EthSubscribe.\ntype ClientSubscription struct {\n\tclient    *Client\n\tetype     reflect.Type\n\tchannel   reflect.Value\n\tnamespace string\n\tsubid     string\n\tin        chan json.RawMessage\n\n\tquitOnce sync.Once     // ensures quit is closed once\n\tquit     chan struct{} // quit is closed when the subscription exits\n\terrOnce  sync.Once     // ensures err is closed once\n\terr      chan error\n}\n\nfunc newClientSubscription(c *Client, namespace string, channel reflect.Value) *ClientSubscription {\n\tsub := &ClientSubscription{\n\t\tclient:    c,\n\t\tnamespace: namespace,\n\t\tetype:     channel.Type().Elem(),\n\t\tchannel:   channel,\n\t\tquit:      make(chan struct{}),\n\t\terr:       make(chan error, 1),\n\t\tin:        make(chan json.RawMessage),\n\t}\n\treturn sub\n}\n\n// Err returns the subscription error channel. The intended use of Err is to schedule\n// resubscription when the client connection is closed unexpectedly.\n//\n// The error channel receives a value when the subscription has ended due\n// to an error. The received error is nil if Close has been called\n// on the underlying client and no other error has occurred.\n//\n// The error channel is closed when Unsubscribe is called on the subscription.\nfunc (sub *ClientSubscription) Err() <-chan error {\n\treturn sub.err\n}\n\n// Unsubscribe unsubscribes the notification and closes the error channel.\n// It can safely be called more than once.\nfunc (sub *ClientSubscription) Unsubscribe() {\n\tsub.quitWithError(nil, true)\n\tsub.errOnce.Do(func() { close(sub.err) })\n}\n\nfunc (sub *ClientSubscription) quitWithError(err error, unsubscribeServer bool) {\n\tsub.quitOnce.Do(func() {\n\t\t// The dispatch loop won't be able to execute the unsubscribe call\n\t\t// if it is blocked on deliver. Close sub.quit first because it\n\t\t// unblocks deliver.\n\t\tclose(sub.quit)\n\t\tif unsubscribeServer {\n\t\t\tsub.requestUnsubscribe()\n\t\t}\n\t\tif err != nil {\n\t\t\tif err == ErrClientQuit {\n\t\t\t\terr = nil // Adhere to subscription semantics.\n\t\t\t}\n\t\t\tsub.err <- err\n\t\t}\n\t})\n}\n\nfunc (sub *ClientSubscription) deliver(result json.RawMessage) (ok bool) {\n\tselect {\n\tcase sub.in <- result:\n\t\treturn true\n\tcase <-sub.quit:\n\t\treturn false\n\t}\n}\n\nfunc (sub *ClientSubscription) start() {\n\tsub.quitWithError(sub.forward())\n}\n\nfunc (sub *ClientSubscription) forward() (err error, unsubscribeServer bool) {\n\tcases := []reflect.SelectCase{\n\t\t{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.quit)},\n\t\t{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.in)},\n\t\t{Dir: reflect.SelectSend, Chan: sub.channel},\n\t}\n\tbuffer := list.New()\n\tdefer buffer.Init()\n\tfor {\n\t\tvar chosen int\n\t\tvar recv reflect.Value\n\t\tif buffer.Len() == 0 {\n\t\t\t// Idle, omit send case.\n\t\t\tchosen, recv, _ = reflect.Select(cases[:2])\n\t\t} else {\n\t\t\t// Non-empty buffer, send the first queued item.\n\t\t\tcases[2].Send = reflect.ValueOf(buffer.Front().Value)\n\t\t\tchosen, recv, _ = reflect.Select(cases)\n\t\t}\n\n\t\tswitch chosen {\n\t\tcase 0: // <-sub.quit\n\t\t\treturn nil, false\n\t\tcase 1: // <-sub.in\n\t\t\tval, err := sub.unmarshal(recv.Interface().(json.RawMessage))\n\t\t\tif err != nil {\n\t\t\t\treturn err, true\n\t\t\t}\n\t\t\tif buffer.Len() == maxClientSubscriptionBuffer {\n\t\t\t\treturn ErrSubscriptionQueueOverflow, true\n\t\t\t}\n\t\t\tbuffer.PushBack(val)\n\t\tcase 2: // sub.channel<-\n\t\t\tcases[2].Send = reflect.Value{} // Don't hold onto the value.\n\t\t\tbuffer.Remove(buffer.Front())\n\t\t}\n\t}\n}\n\nfunc (sub *ClientSubscription) unmarshal(result json.RawMessage) (interface{}, error) {\n\tval := reflect.New(sub.etype)\n\terr := json.Unmarshal(result, val.Interface())\n\treturn val.Elem().Interface(), err\n}\n\nfunc (sub *ClientSubscription) requestUnsubscribe() error {\n\tvar result interface{}\n\treturn sub.client.Call(&result, sub.namespace+unsubscribeMethodSuffix, sub.subid)\n}\n"
  },
  {
    "path": "rpc/doc.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n/*\nPackage rpc provides access to the exported methods of an object across a network\nor other I/O connection. After creating a server instance objects can be registered,\nmaking it visible from the outside. Exported methods that follow specific\nconventions can be called remotely. It also has support for the publish/subscribe\npattern.\n\nMethods that satisfy the following criteria are made available for remote access:\n - object must be exported\n - method must be exported\n - method returns 0, 1 (response or error) or 2 (response and error) values\n - method argument(s) must be exported or builtin types\n - method returned value(s) must be exported or builtin types\n\nAn example method:\n func (s *CalcService) Add(a, b int) (int, error)\n\nWhen the returned error isn't nil the returned integer is ignored and the error is\nsend back to the client. Otherwise the returned integer is send back to the client.\n\nOptional arguments are supported by accepting pointer values as arguments. E.g.\nif we want to do the addition in an optional finite field we can accept a mod\nargument as pointer value.\n\n func (s *CalService) Add(a, b int, mod *int) (int, error)\n\nThis RPC method can be called with 2 integers and a null value as third argument.\nIn that case the mod argument will be nil. Or it can be called with 3 integers,\nin that case mod will be pointing to the given third argument. Since the optional\nargument is the last argument the RPC package will also accept 2 integers as\narguments. It will pass the mod argument as nil to the RPC method.\n\nThe server offers the ServeCodec method which accepts a ServerCodec instance. It will\nread requests from the codec, process the request and sends the response back to the\nclient using the codec. The server can execute requests concurrently. Responses\ncan be sent back to the client out of order.\n\nAn example server which uses the JSON codec:\n type CalculatorService struct {}\n\n func (s *CalculatorService) Add(a, b int) int {\n\treturn a + b\n }\n\n func (s *CalculatorService) Div(a, b int) (int, error) {\n\tif b == 0 {\n\t\treturn 0, errors.New(\"divide by zero\")\n\t}\n\treturn a/b, nil\n }\n\n calculator := new(CalculatorService)\n server := NewServer()\n server.RegisterName(\"calculator\", calculator\")\n\n l, _ := net.ListenUnix(\"unix\", &net.UnixAddr{Net: \"unix\", Name: \"/tmp/calculator.sock\"})\n for {\n\tc, _ := l.AcceptUnix()\n\tcodec := v2.NewJSONCodec(c)\n\tgo server.ServeCodec(codec)\n }\n\nThe package also supports the publish subscribe pattern through the use of subscriptions.\nA method that is considered eligible for notifications must satisfy the following criteria:\n - object must be exported\n - method must be exported\n - first method argument type must be context.Context\n - method argument(s) must be exported or builtin types\n - method must return the tuple Subscription, error\n\nAn example method:\n func (s *BlockChainService) NewBlocks(ctx context.Context) (Subscription, error) {\n \t...\n }\n\nSubscriptions are deleted when:\n - the user sends an unsubscribe request\n - the connection which was used to create the subscription is closed. This can be initiated\n   by the client and server. The server will close the connection on a write error or when\n   the queue of buffered notifications gets too big.\n*/\npackage rpc\n"
  },
  {
    "path": "rpc/endpoints.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"net\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// StartHTTPEndpoint starts the HTTP RPC endpoint, configured with cors/vhosts/modules\nfunc StartHTTPEndpoint(endpoint string, apis []API, modules []string, cors []string, vhosts []string, timeouts HTTPTimeouts) (net.Listener, *Server, error) {\n\t// Generate the whitelist based on the allowed modules\n\twhitelist := make(map[string]bool)\n\tfor _, module := range modules {\n\t\twhitelist[module] = true\n\t}\n\t// Register all the APIs exposed by the services\n\thandler := NewServer()\n\tfor _, api := range apis {\n\t\tif whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) {\n\t\t\tif err := handler.RegisterName(api.Namespace, api.Service); err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tlog.Debug(\"HTTP registered\", \"namespace\", api.Namespace)\n\t\t}\n\t}\n\t// All APIs registered, start the HTTP listener\n\tvar (\n\t\tlistener net.Listener\n\t\terr      error\n\t)\n\tif listener, err = net.Listen(\"tcp\", endpoint); err != nil {\n\t\treturn nil, nil, err\n\t}\n\tgo NewHTTPServer(cors, vhosts, timeouts, handler).Serve(listener)\n\treturn listener, handler, err\n}\n\n// StartWSEndpoint starts a websocket endpoint\nfunc StartWSEndpoint(endpoint string, apis []API, modules []string, wsOrigins []string, exposeAll bool) (net.Listener, *Server, error) {\n\n\t// Generate the whitelist based on the allowed modules\n\twhitelist := make(map[string]bool)\n\tfor _, module := range modules {\n\t\twhitelist[module] = true\n\t}\n\t// Register all the APIs exposed by the services\n\thandler := NewServer()\n\tfor _, api := range apis {\n\t\tif exposeAll || whitelist[api.Namespace] || (len(whitelist) == 0 && api.Public) {\n\t\t\tif err := handler.RegisterName(api.Namespace, api.Service); err != nil {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tlog.Debug(\"WebSocket registered\", \"service\", api.Service, \"namespace\", api.Namespace)\n\t\t}\n\t}\n\t// All APIs registered, start the HTTP listener\n\tvar (\n\t\tlistener net.Listener\n\t\terr      error\n\t)\n\tif listener, err = net.Listen(\"tcp\", endpoint); err != nil {\n\t\treturn nil, nil, err\n\t}\n\tgo NewWSServer(wsOrigins, handler).Serve(listener)\n\treturn listener, handler, err\n\n}\n\n// StartIPCEndpoint starts an IPC endpoint.\nfunc StartIPCEndpoint(ipcEndpoint string, apis []API) (net.Listener, *Server, error) {\n\t// Register all the APIs exposed by the services.\n\thandler := NewServer()\n\tfor _, api := range apis {\n\t\tif err := handler.RegisterName(api.Namespace, api.Service); err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tlog.Debug(\"IPC registered\", \"namespace\", api.Namespace)\n\t}\n\t// All APIs registered, start the IPC listener.\n\tlistener, err := ipcListen(ipcEndpoint)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tgo handler.ServeListener(listener)\n\treturn listener, handler, nil\n}\n"
  },
  {
    "path": "rpc/errors.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport \"fmt\"\n\n// request is for an unknown service\ntype methodNotFoundError struct {\n\tservice string\n\tmethod  string\n}\n\nfunc (e *methodNotFoundError) ErrorCode() int { return -32601 }\n\nfunc (e *methodNotFoundError) Error() string {\n\treturn fmt.Sprintf(\"The method %s%s%s does not exist/is not available\", e.service, serviceMethodSeparator, e.method)\n}\n\n// received message isn't a valid request\ntype invalidRequestError struct{ message string }\n\nfunc (e *invalidRequestError) ErrorCode() int { return -32600 }\n\nfunc (e *invalidRequestError) Error() string { return e.message }\n\n// received message is invalid\ntype invalidMessageError struct{ message string }\n\nfunc (e *invalidMessageError) ErrorCode() int { return -32700 }\n\nfunc (e *invalidMessageError) Error() string { return e.message }\n\n// unable to decode supplied params, or an invalid number of parameters\ntype invalidParamsError struct{ message string }\n\nfunc (e *invalidParamsError) ErrorCode() int { return -32602 }\n\nfunc (e *invalidParamsError) Error() string { return e.message }\n\n// logic error, callback returned an error\ntype callbackError struct{ message string }\n\nfunc (e *callbackError) ErrorCode() int { return -32000 }\n\nfunc (e *callbackError) Error() string { return e.message }\n\n// issued when a request is received after the server is issued to stop.\ntype shutdownError struct{}\n\nfunc (e *shutdownError) ErrorCode() int { return -32000 }\n\nfunc (e *shutdownError) Error() string { return \"server is shutting down\" }\n"
  },
  {
    "path": "rpc/http.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"mime\"\n\t\"net\"\n\t\"net/http\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/rs/cors\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tcontentType = \"application/json\"\n)\n\nvar maxRequestContentLength = int64(1024 * 512)\n\nfunc SetMaxRequestContentLength(l int64) {\n\tmaxRequestContentLength = l\n}\n\nvar nullAddr, _ = net.ResolveTCPAddr(\"tcp\", \"127.0.0.1:0\")\n\ntype httpConn struct {\n\tclient    *http.Client\n\treq       *http.Request\n\tcloseOnce sync.Once\n\tclosed    chan struct{}\n}\n\n// httpConn is treated specially by Client.\nfunc (hc *httpConn) LocalAddr() net.Addr              { return nullAddr }\nfunc (hc *httpConn) RemoteAddr() net.Addr             { return nullAddr }\nfunc (hc *httpConn) SetReadDeadline(time.Time) error  { return nil }\nfunc (hc *httpConn) SetWriteDeadline(time.Time) error { return nil }\nfunc (hc *httpConn) SetDeadline(time.Time) error      { return nil }\nfunc (hc *httpConn) Write([]byte) (int, error)        { panic(\"Write called\") }\n\nfunc (hc *httpConn) Read(b []byte) (int, error) {\n\t<-hc.closed\n\treturn 0, io.EOF\n}\n\nfunc (hc *httpConn) Close() error {\n\thc.closeOnce.Do(func() { close(hc.closed) })\n\treturn nil\n}\n\n// HTTPTimeouts represents the configuration params for the HTTP RPC server.\ntype HTTPTimeouts struct {\n\t// ReadTimeout is the maximum duration for reading the entire\n\t// request, including the body.\n\t//\n\t// Because ReadTimeout does not let Handlers make per-request\n\t// decisions on each request body's acceptable deadline or\n\t// upload rate, most users will prefer to use\n\t// ReadHeaderTimeout. It is valid to use them both.\n\tReadTimeout time.Duration\n\n\t// WriteTimeout is the maximum duration before timing out\n\t// writes of the response. It is reset whenever a new\n\t// request's header is read. Like ReadTimeout, it does not\n\t// let Handlers make decisions on a per-request basis.\n\tWriteTimeout time.Duration\n\n\t// IdleTimeout is the maximum amount of time to wait for the\n\t// next request when keep-alives are enabled. If IdleTimeout\n\t// is zero, the value of ReadTimeout is used. If both are\n\t// zero, ReadHeaderTimeout is used.\n\tIdleTimeout time.Duration\n}\n\n// DefaultHTTPTimeouts represents the default timeout values used if further\n// configuration is not provided.\nvar DefaultHTTPTimeouts = HTTPTimeouts{\n\tReadTimeout:  120 * time.Second,\n\tWriteTimeout: 120 * time.Second,\n\tIdleTimeout:  180 * time.Second,\n}\n\n// DialHTTPWithClient creates a new RPC client that connects to an RPC server over HTTP\n// using the provided HTTP Client.\nfunc DialHTTPWithClient(endpoint string, client *http.Client) (*Client, error) {\n\treq, err := http.NewRequest(http.MethodPost, endpoint, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Type\", contentType)\n\treq.Header.Set(\"Accept\", contentType)\n\n\tinitctx := context.Background()\n\treturn newClient(initctx, func(context.Context) (net.Conn, error) {\n\t\treturn &httpConn{client: client, req: req, closed: make(chan struct{})}, nil\n\t})\n}\n\n// DialHTTP creates a new RPC client that connects to an RPC server over HTTP.\nfunc DialHTTP(endpoint string) (*Client, error) {\n\treturn DialHTTPWithClient(endpoint, new(http.Client))\n}\n\nfunc (c *Client) sendHTTP(ctx context.Context, op *requestOp, msg interface{}) error {\n\thc := c.writeConn.(*httpConn)\n\trespBody, err := hc.doRequest(ctx, msg)\n\tif respBody != nil {\n\t\tdefer respBody.Close()\n\t}\n\n\tif err != nil {\n\t\tif respBody != nil {\n\t\t\tbuf := new(bytes.Buffer)\n\t\t\tif _, err2 := buf.ReadFrom(respBody); err2 == nil {\n\t\t\t\treturn fmt.Errorf(\"%v %v\", err, buf.String())\n\t\t\t}\n\t\t}\n\t\treturn err\n\t}\n\tvar respmsg jsonrpcMessage\n\tif err := json.NewDecoder(respBody).Decode(&respmsg); err != nil {\n\t\treturn err\n\t}\n\top.resp <- &respmsg\n\treturn nil\n}\n\nfunc (c *Client) sendBatchHTTP(ctx context.Context, op *requestOp, msgs []*jsonrpcMessage) error {\n\thc := c.writeConn.(*httpConn)\n\trespBody, err := hc.doRequest(ctx, msgs)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer respBody.Close()\n\tvar respmsgs []jsonrpcMessage\n\tif err := json.NewDecoder(respBody).Decode(&respmsgs); err != nil {\n\t\treturn err\n\t}\n\tfor i := 0; i < len(respmsgs); i++ {\n\t\top.resp <- &respmsgs[i]\n\t}\n\treturn nil\n}\n\nfunc (hc *httpConn) doRequest(ctx context.Context, msg interface{}) (io.ReadCloser, error) {\n\tbody, err := json.Marshal(msg)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq := hc.req.WithContext(ctx)\n\treq.Body = ioutil.NopCloser(bytes.NewReader(body))\n\treq.ContentLength = int64(len(body))\n\n\tresp, err := hc.client.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif resp.StatusCode < 200 || resp.StatusCode >= 300 {\n\t\treturn resp.Body, errors.New(resp.Status)\n\t}\n\treturn resp.Body, nil\n}\n\n// httpReadWriteNopCloser wraps a io.Reader and io.Writer with a NOP Close method.\ntype httpReadWriteNopCloser struct {\n\tio.Reader\n\tio.Writer\n}\n\n// Close does nothing and returns always nil\nfunc (t *httpReadWriteNopCloser) Close() error {\n\treturn nil\n}\n\n// NewHTTPServer creates a new HTTP RPC server around an API provider.\n//\n// Deprecated: Server implements http.Handler\nfunc NewHTTPServer(cors []string, vhosts []string, timeouts HTTPTimeouts, srv *Server) *http.Server {\n\t// Wrap the CORS-handler within a host-handler\n\thandler := newCorsHandler(srv, cors)\n\thandler = newVHostHandler(vhosts, handler)\n\n\t// Make sure timeout values are meaningful\n\tif timeouts.ReadTimeout < time.Second {\n\t\tlog.Warn(\"Sanitizing invalid HTTP read timeout\", \"provided\", timeouts.ReadTimeout, \"updated\", DefaultHTTPTimeouts.ReadTimeout)\n\t\ttimeouts.ReadTimeout = DefaultHTTPTimeouts.ReadTimeout\n\t}\n\tif timeouts.WriteTimeout < time.Second {\n\t\tlog.Warn(\"Sanitizing invalid HTTP write timeout\", \"provided\", timeouts.WriteTimeout, \"updated\", DefaultHTTPTimeouts.WriteTimeout)\n\t\ttimeouts.WriteTimeout = DefaultHTTPTimeouts.WriteTimeout\n\t}\n\tif timeouts.IdleTimeout < time.Second {\n\t\tlog.Warn(\"Sanitizing invalid HTTP idle timeout\", \"provided\", timeouts.IdleTimeout, \"updated\", DefaultHTTPTimeouts.IdleTimeout)\n\t\ttimeouts.IdleTimeout = DefaultHTTPTimeouts.IdleTimeout\n\t}\n\t// Bundle and start the HTTP server\n\treturn &http.Server{\n\t\tHandler:      handler,\n\t\tReadTimeout:  timeouts.ReadTimeout,\n\t\tWriteTimeout: timeouts.WriteTimeout,\n\t\tIdleTimeout:  timeouts.IdleTimeout,\n\t}\n}\n\n// ServeHTTP serves JSON-RPC requests over HTTP.\nfunc (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n\t// Permit dumb empty requests for remote health-checks (AWS)\n\tif r.Method == http.MethodGet && r.ContentLength == 0 && r.URL.RawQuery == \"\" {\n\t\treturn\n\t}\n\tif code, err := validateRequest(r); err != nil {\n\t\thttp.Error(w, err.Error(), code)\n\t\treturn\n\t}\n\t// All checks passed, create a codec that reads direct from the request body\n\t// untilEOF and writes the response to w and order the server to process a\n\t// single request.\n\tctx := r.Context()\n\tctx = context.WithValue(ctx, \"remote\", r.RemoteAddr)\n\tctx = context.WithValue(ctx, \"scheme\", r.Proto)\n\tctx = context.WithValue(ctx, \"local\", r.Host)\n\n\tbody := io.LimitReader(r.Body, maxRequestContentLength)\n\tcodec := NewJSONCodec(&httpReadWriteNopCloser{body, w})\n\tdefer codec.Close()\n\n\tw.Header().Set(\"content-type\", contentType)\n\tsrv.ServeSingleRequest(ctx, codec, OptionMethodInvocation)\n}\n\n// validateRequest returns a non-zero response code and error message if the\n// request is invalid.\nfunc validateRequest(r *http.Request) (int, error) {\n\tif r.Method == http.MethodPut || r.Method == http.MethodDelete {\n\t\treturn http.StatusMethodNotAllowed, errors.New(\"method not allowed\")\n\t}\n\tif r.ContentLength > maxRequestContentLength {\n\t\terr := fmt.Errorf(\"content length too large (%d>%d)\", r.ContentLength, maxRequestContentLength)\n\t\treturn http.StatusRequestEntityTooLarge, err\n\t}\n\tmt, _, err := mime.ParseMediaType(r.Header.Get(\"content-type\"))\n\tif r.Method != http.MethodOptions && (err != nil || mt != contentType) {\n\t\terr := fmt.Errorf(\"invalid content type, only %s is supported\", contentType)\n\t\treturn http.StatusUnsupportedMediaType, err\n\t}\n\treturn 0, nil\n}\n\nfunc newCorsHandler(srv *Server, allowedOrigins []string) http.Handler {\n\t// disable CORS support if user has not specified a custom CORS configuration\n\tif len(allowedOrigins) == 0 {\n\t\treturn srv\n\t}\n\tc := cors.New(cors.Options{\n\t\tAllowedOrigins: allowedOrigins,\n\t\tAllowedMethods: []string{http.MethodPost, http.MethodGet},\n\t\tMaxAge:         600,\n\t\tAllowedHeaders: []string{\"*\"},\n\t})\n\treturn c.Handler(srv)\n}\n\n// virtualHostHandler is a handler which validates the Host-header of incoming requests.\n// The virtualHostHandler can prevent DNS rebinding attacks, which do not utilize CORS-headers,\n// since they do in-domain requests against the RPC api. Instead, we can see on the Host-header\n// which domain was used, and validate that against a whitelist.\ntype virtualHostHandler struct {\n\tvhosts map[string]struct{}\n\tnext   http.Handler\n}\n\n// ServeHTTP serves JSON-RPC requests over HTTP, implements http.Handler\nfunc (h *virtualHostHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n\t// if r.Host is not set, we can continue serving since a browser would set the Host header\n\tif r.Host == \"\" {\n\t\th.next.ServeHTTP(w, r)\n\t\treturn\n\t}\n\thost, _, err := net.SplitHostPort(r.Host)\n\tif err != nil {\n\t\t// Either invalid (too many colons) or no port specified\n\t\thost = r.Host\n\t}\n\tif ipAddr := net.ParseIP(host); ipAddr != nil {\n\t\t// It's an IP address, we can serve that\n\t\th.next.ServeHTTP(w, r)\n\t\treturn\n\n\t}\n\t// Not an ip address, but a hostname. Need to validate\n\tif _, exist := h.vhosts[\"*\"]; exist {\n\t\th.next.ServeHTTP(w, r)\n\t\treturn\n\t}\n\tif _, exist := h.vhosts[host]; exist {\n\t\th.next.ServeHTTP(w, r)\n\t\treturn\n\t}\n\thttp.Error(w, \"invalid host specified\", http.StatusForbidden)\n}\n\nfunc newVHostHandler(vhosts []string, next http.Handler) http.Handler {\n\tvhostMap := make(map[string]struct{})\n\tfor _, allowedHost := range vhosts {\n\t\tvhostMap[strings.ToLower(allowedHost)] = struct{}{}\n\t}\n\treturn &virtualHostHandler{vhostMap, next}\n}\n"
  },
  {
    "path": "rpc/inproc.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"net\"\n)\n\n// DialInProc attaches an in-process connection to the given RPC server.\nfunc DialInProc(handler *Server) *Client {\n\tinitctx := context.Background()\n\tc, _ := newClient(initctx, func(context.Context) (net.Conn, error) {\n\t\tp1, p2 := net.Pipe()\n\t\tgo handler.ServeCodec(NewJSONCodec(p1), OptionMethodInvocation|OptionSubscriptions)\n\t\treturn p2, nil\n\t})\n\treturn c\n}\n"
  },
  {
    "path": "rpc/ipc.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"net\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/netutil\"\n)\n\n// ServeListener accepts connections on l, serving JSON-RPC on them.\nfunc (srv *Server) ServeListener(l net.Listener) error {\n\tfor {\n\t\tconn, err := l.Accept()\n\t\tif netutil.IsTemporaryError(err) {\n\t\t\tlog.Warn(\"RPC accept error\", \"err\", err)\n\t\t\tcontinue\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t\tlog.Trace(\"Accepted connection\", \"addr\", conn.RemoteAddr())\n\t\tgo srv.ServeCodec(NewJSONCodec(conn), OptionMethodInvocation|OptionSubscriptions)\n\t}\n}\n\n// DialIPC create a new IPC client that connects to the given endpoint. On Unix it assumes\n// the endpoint is the full path to a unix socket, and Windows the endpoint is an\n// identifier for a named pipe.\n//\n// The context is used for the initial connection establishment. It does not\n// affect subsequent interactions with the client.\nfunc DialIPC(ctx context.Context, endpoint string) (*Client, error) {\n\treturn newClient(ctx, func(ctx context.Context) (net.Conn, error) {\n\t\treturn newIPCConnection(ctx, endpoint)\n\t})\n}\n"
  },
  {
    "path": "rpc/ipc_unix.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// ipcListen will create a Unix socket on the given endpoint.\nfunc ipcListen(endpoint string) (net.Listener, error) {\n\t// Ensure the IPC path exists and remove any previous leftover\n\tif err := os.MkdirAll(filepath.Dir(endpoint), 0751); err != nil {\n\t\treturn nil, err\n\t}\n\tos.Remove(endpoint)\n\tl, err := net.Listen(\"unix\", endpoint)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tos.Chmod(endpoint, 0600)\n\treturn l, nil\n}\n\n// newIPCConnection will connect to a Unix socket on the given endpoint.\nfunc newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) {\n\treturn dialContext(ctx, \"unix\", endpoint)\n}\n"
  },
  {
    "path": "rpc/ipc_windows.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// +build windows\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"time\"\n\n\t\"gopkg.in/natefinch/npipe.v2\"\n)\n\n// This is used if the dialing context has no deadline. It is much smaller than the\n// defaultDialTimeout because named pipes are local and there is no need to wait so long.\nconst defaultPipeDialTimeout = 2 * time.Second\n\n// ipcListen will create a named pipe on the given endpoint.\nfunc ipcListen(endpoint string) (net.Listener, error) {\n\treturn npipe.Listen(endpoint)\n}\n\n// newIPCConnection will connect to a named pipe with the given endpoint as name.\nfunc newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) {\n\ttimeout := defaultPipeDialTimeout\n\tif deadline, ok := ctx.Deadline(); ok {\n\t\ttimeout = deadline.Sub(time.Now())\n\t\tif timeout < 0 {\n\t\t\ttimeout = 0\n\t\t}\n\t}\n\treturn npipe.DialTimeout(endpoint, timeout)\n}\n"
  },
  {
    "path": "rpc/json.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tjsonrpcVersion           = \"2.0\"\n\tserviceMethodSeparator   = \"_\"\n\tsubscribeMethodSuffix    = \"_subscribe\"\n\tunsubscribeMethodSuffix  = \"_unsubscribe\"\n\tnotificationMethodSuffix = \"_subscription\"\n)\n\ntype jsonRequest struct {\n\tMethod  string          `json:\"method\"`\n\tVersion string          `json:\"jsonrpc\"`\n\tId      json.RawMessage `json:\"id,omitempty\"`\n\tPayload json.RawMessage `json:\"params,omitempty\"`\n}\n\ntype jsonSuccessResponse struct {\n\tVersion string      `json:\"jsonrpc\"`\n\tId      interface{} `json:\"id,omitempty\"`\n\tResult  interface{} `json:\"result\"`\n}\n\ntype jsonError struct {\n\tCode    int         `json:\"code\"`\n\tMessage string      `json:\"message\"`\n\tData    interface{} `json:\"data,omitempty\"`\n}\n\ntype jsonErrResponse struct {\n\tVersion string      `json:\"jsonrpc\"`\n\tId      interface{} `json:\"id,omitempty\"`\n\tError   jsonError   `json:\"error\"`\n}\n\ntype jsonSubscription struct {\n\tSubscription string      `json:\"subscription\"`\n\tResult       interface{} `json:\"result,omitempty\"`\n}\n\ntype jsonNotification struct {\n\tVersion string           `json:\"jsonrpc\"`\n\tMethod  string           `json:\"method\"`\n\tParams  jsonSubscription `json:\"params\"`\n}\n\n// jsonCodec reads and writes JSON-RPC messages to the underlying connection. It\n// also has support for parsing arguments and serializing (result) objects.\ntype jsonCodec struct {\n\tcloser sync.Once                 // close closed channel once\n\tclosed chan interface{}          // closed on Close\n\tdecMu  sync.Mutex                // guards the decoder\n\tdecode func(v interface{}) error // decoder to allow multiple transports\n\tencMu  sync.Mutex                // guards the encoder\n\tencode func(v interface{}) error // encoder to allow multiple transports\n\trw     io.ReadWriteCloser        // connection\n}\n\nfunc (err *jsonError) Error() string {\n\tif err.Message == \"\" {\n\t\treturn fmt.Sprintf(\"json-rpc error %d\", err.Code)\n\t}\n\treturn err.Message\n}\n\nfunc (err *jsonError) ErrorCode() int {\n\treturn err.Code\n}\n\n// NewCodec creates a new RPC server codec with support for JSON-RPC 2.0 based\n// on explicitly given encoding and decoding methods.\nfunc NewCodec(rwc io.ReadWriteCloser, encode, decode func(v interface{}) error) ServerCodec {\n\treturn &jsonCodec{\n\t\tclosed: make(chan interface{}),\n\t\tencode: encode,\n\t\tdecode: decode,\n\t\trw:     rwc,\n\t}\n}\n\n// NewJSONCodec creates a new RPC server codec with support for JSON-RPC 2.0.\nfunc NewJSONCodec(rwc io.ReadWriteCloser) ServerCodec {\n\tenc := json.NewEncoder(rwc)\n\tdec := json.NewDecoder(rwc)\n\tdec.UseNumber()\n\n\treturn &jsonCodec{\n\t\tclosed: make(chan interface{}),\n\t\tencode: enc.Encode,\n\t\tdecode: dec.Decode,\n\t\trw:     rwc,\n\t}\n}\n\n// isBatch returns true when the first non-whitespace characters is '['\nfunc isBatch(msg json.RawMessage) bool {\n\tfor _, c := range msg {\n\t\t// skip insignificant whitespace (http://www.ietf.org/rfc/rfc4627.txt)\n\t\tif c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d {\n\t\t\tcontinue\n\t\t}\n\t\treturn c == '['\n\t}\n\treturn false\n}\n\n// ReadRequestHeaders will read new requests without parsing the arguments. It will\n// return a collection of requests, an indication if these requests are in batch\n// form or an error when the incoming message could not be read/parsed.\nfunc (c *jsonCodec) ReadRequestHeaders() ([]rpcRequest, bool, Error) {\n\tc.decMu.Lock()\n\tdefer c.decMu.Unlock()\n\n\tvar incomingMsg json.RawMessage\n\tif err := c.decode(&incomingMsg); err != nil {\n\t\treturn nil, false, &invalidRequestError{err.Error()}\n\t}\n\tif isBatch(incomingMsg) {\n\t\treturn parseBatchRequest(incomingMsg)\n\t}\n\treturn parseRequest(incomingMsg)\n}\n\n// checkReqId returns an error when the given reqId isn't valid for RPC method calls.\n// valid id's are strings, numbers or null\nfunc checkReqId(reqId json.RawMessage) error {\n\tif len(reqId) == 0 {\n\t\treturn fmt.Errorf(\"missing request id\")\n\t}\n\tif _, err := strconv.ParseFloat(string(reqId), 64); err == nil {\n\t\treturn nil\n\t}\n\tvar str string\n\tif err := json.Unmarshal(reqId, &str); err == nil {\n\t\treturn nil\n\t}\n\treturn fmt.Errorf(\"invalid request id\")\n}\n\n// parseRequest will parse a single request from the given RawMessage. It will return\n// the parsed request, an indication if the request was a batch or an error when\n// the request could not be parsed.\nfunc parseRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, Error) {\n\tvar in jsonRequest\n\tif err := json.Unmarshal(incomingMsg, &in); err != nil {\n\t\treturn nil, false, &invalidMessageError{err.Error()}\n\t}\n\n\tif err := checkReqId(in.Id); err != nil {\n\t\treturn nil, false, &invalidMessageError{err.Error()}\n\t}\n\n\t// subscribe are special, they will always use `subscribeMethod` as first param in the payload\n\tif strings.HasSuffix(in.Method, subscribeMethodSuffix) {\n\t\treqs := []rpcRequest{{id: &in.Id, isPubSub: true}}\n\t\tif len(in.Payload) > 0 {\n\t\t\t// first param must be subscription name\n\t\t\tvar subscribeMethod [1]string\n\t\t\tif err := json.Unmarshal(in.Payload, &subscribeMethod); err != nil {\n\t\t\t\tlog.Debug(fmt.Sprintf(\"Unable to parse subscription method: %v\\n\", err))\n\t\t\t\treturn nil, false, &invalidRequestError{\"Unable to parse subscription request\"}\n\t\t\t}\n\n\t\t\treqs[0].service, reqs[0].method = strings.TrimSuffix(in.Method, subscribeMethodSuffix), subscribeMethod[0]\n\t\t\treqs[0].params = in.Payload\n\t\t\treturn reqs, false, nil\n\t\t}\n\t\treturn nil, false, &invalidRequestError{\"Unable to parse subscription request\"}\n\t}\n\n\tif strings.HasSuffix(in.Method, unsubscribeMethodSuffix) {\n\t\treturn []rpcRequest{{id: &in.Id, isPubSub: true,\n\t\t\tmethod: in.Method, params: in.Payload}}, false, nil\n\t}\n\n\telems := strings.Split(in.Method, serviceMethodSeparator)\n\tif len(elems) != 2 {\n\t\treturn nil, false, &methodNotFoundError{in.Method, \"\"}\n\t}\n\n\tserviceName := elems[0]\n\n\tif elems[0] == \"eth\" {\n\t\tserviceName = \"sero\"\n\t}\n\t// regular RPC call\n\tif len(in.Payload) == 0 {\n\t\treturn []rpcRequest{{service: serviceName, method: elems[1], id: &in.Id}}, false, nil\n\t}\n\n\treturn []rpcRequest{{service: serviceName, method: elems[1], id: &in.Id, params: in.Payload}}, false, nil\n}\n\n// parseBatchRequest will parse a batch request into a collection of requests from the given RawMessage, an indication\n// if the request was a batch or an error when the request could not be read.\nfunc parseBatchRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, Error) {\n\tvar in []jsonRequest\n\tif err := json.Unmarshal(incomingMsg, &in); err != nil {\n\t\treturn nil, false, &invalidMessageError{err.Error()}\n\t}\n\n\trequests := make([]rpcRequest, len(in))\n\tfor i, r := range in {\n\t\tif err := checkReqId(r.Id); err != nil {\n\t\t\treturn nil, false, &invalidMessageError{err.Error()}\n\t\t}\n\n\t\tid := &in[i].Id\n\n\t\t// subscribe are special, they will always use `subscriptionMethod` as first param in the payload\n\t\tif strings.HasSuffix(r.Method, subscribeMethodSuffix) {\n\t\t\trequests[i] = rpcRequest{id: id, isPubSub: true}\n\t\t\tif len(r.Payload) > 0 {\n\t\t\t\t// first param must be subscription name\n\t\t\t\tvar subscribeMethod [1]string\n\t\t\t\tif err := json.Unmarshal(r.Payload, &subscribeMethod); err != nil {\n\t\t\t\t\tlog.Debug(fmt.Sprintf(\"Unable to parse subscription method: %v\\n\", err))\n\t\t\t\t\treturn nil, false, &invalidRequestError{\"Unable to parse subscription request\"}\n\t\t\t\t}\n\n\t\t\t\trequests[i].service, requests[i].method = strings.TrimSuffix(r.Method, subscribeMethodSuffix), subscribeMethod[0]\n\t\t\t\trequests[i].params = r.Payload\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\treturn nil, true, &invalidRequestError{\"Unable to parse (un)subscribe request arguments\"}\n\t\t}\n\n\t\tif strings.HasSuffix(r.Method, unsubscribeMethodSuffix) {\n\t\t\trequests[i] = rpcRequest{id: id, isPubSub: true, method: r.Method, params: r.Payload}\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(r.Payload) == 0 {\n\t\t\trequests[i] = rpcRequest{id: id, params: nil}\n\t\t} else {\n\t\t\trequests[i] = rpcRequest{id: id, params: r.Payload}\n\t\t}\n\t\tif elem := strings.Split(r.Method, serviceMethodSeparator); len(elem) == 2 {\n\t\t\tserviceName := elem[0]\n\t\t\tif elem[0] == \"eth\" {\n\t\t\t\tserviceName = \"sero\"\n\t\t\t}\n\t\t\trequests[i].service, requests[i].method = serviceName, elem[1]\n\t\t} else {\n\t\t\trequests[i].err = &methodNotFoundError{r.Method, \"\"}\n\t\t}\n\t}\n\n\treturn requests, true, nil\n}\n\n// ParseRequestArguments tries to parse the given params (json.RawMessage) with the given\n// types. It returns the parsed values or an error when the parsing failed.\nfunc (c *jsonCodec) ParseRequestArguments(argTypes []reflect.Type, params interface{}) ([]reflect.Value, Error) {\n\tif args, ok := params.(json.RawMessage); !ok {\n\t\treturn nil, &invalidParamsError{\"Invalid params supplied\"}\n\t} else {\n\t\treturn parsePositionalArguments(args, argTypes)\n\t}\n}\n\n// parsePositionalArguments tries to parse the given args to an array of values with the\n// given types. It returns the parsed values or an error when the args could not be\n// parsed. Missing optional arguments are returned as reflect.Zero values.\nfunc parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([]reflect.Value, Error) {\n\t// Read beginning of the args array.\n\tdec := json.NewDecoder(bytes.NewReader(rawArgs))\n\tif tok, _ := dec.Token(); tok != json.Delim('[') {\n\t\treturn nil, &invalidParamsError{\"non-array args\"}\n\t}\n\t// Read args.\n\targs := make([]reflect.Value, 0, len(types))\n\tfor i := 0; dec.More(); i++ {\n\t\tif i >= len(types) {\n\t\t\treturn nil, &invalidParamsError{fmt.Sprintf(\"too many arguments, want at most %d\", len(types))}\n\t\t}\n\t\targval := reflect.New(types[i])\n\t\tif err := dec.Decode(argval.Interface()); err != nil {\n\t\t\treturn nil, &invalidParamsError{fmt.Sprintf(\"invalid argument %d: %v\", i, err)}\n\t\t}\n\t\tif argval.IsNil() && types[i].Kind() != reflect.Ptr {\n\t\t\treturn nil, &invalidParamsError{fmt.Sprintf(\"missing value for required argument %d\", i)}\n\t\t}\n\t\targs = append(args, argval.Elem())\n\t}\n\t// Read end of args array.\n\tif _, err := dec.Token(); err != nil {\n\t\treturn nil, &invalidParamsError{err.Error()}\n\t}\n\t// Set any missing args to nil.\n\tfor i := len(args); i < len(types); i++ {\n\t\tif types[i].Kind() != reflect.Ptr {\n\t\t\treturn nil, &invalidParamsError{fmt.Sprintf(\"missing value for required argument %d\", i)}\n\t\t}\n\t\targs = append(args, reflect.Zero(types[i]))\n\t}\n\treturn args, nil\n}\n\n// CreateResponse will create a JSON-RPC success response with the given id and reply as result.\nfunc (c *jsonCodec) CreateResponse(id interface{}, reply interface{}) interface{} {\n\treturn &jsonSuccessResponse{Version: jsonrpcVersion, Id: id, Result: reply}\n}\n\n// CreateErrorResponse will create a JSON-RPC error response with the given id and error.\nfunc (c *jsonCodec) CreateErrorResponse(id interface{}, err Error) interface{} {\n\treturn &jsonErrResponse{Version: jsonrpcVersion, Id: id, Error: jsonError{Code: err.ErrorCode(), Message: err.Error()}}\n}\n\n// CreateErrorResponseWithInfo will create a JSON-RPC error response with the given id and error.\n// info is optional and contains additional information about the error. When an empty string is passed it is ignored.\nfunc (c *jsonCodec) CreateErrorResponseWithInfo(id interface{}, err Error, info interface{}) interface{} {\n\treturn &jsonErrResponse{Version: jsonrpcVersion, Id: id,\n\t\tError: jsonError{Code: err.ErrorCode(), Message: err.Error(), Data: info}}\n}\n\n// CreateNotification will create a JSON-RPC notification with the given subscription id and event as params.\nfunc (c *jsonCodec) CreateNotification(subid, namespace string, event interface{}) interface{} {\n\treturn &jsonNotification{Version: jsonrpcVersion, Method: namespace + notificationMethodSuffix,\n\t\tParams: jsonSubscription{Subscription: subid, Result: event}}\n}\n\n// Write message to client\nfunc (c *jsonCodec) Write(res interface{}) error {\n\tc.encMu.Lock()\n\tdefer c.encMu.Unlock()\n\n\treturn c.encode(res)\n}\n\n// Close the underlying connection\nfunc (c *jsonCodec) Close() {\n\tc.closer.Do(func() {\n\t\tclose(c.closed)\n\t\tc.rw.Close()\n\t})\n}\n\n// Closed returns a channel which will be closed when Close is called\nfunc (c *jsonCodec) Closed() <-chan interface{} {\n\treturn c.closed\n}\n"
  },
  {
    "path": "rpc/server.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst MetadataApi = \"rpc\"\n\n// CodecOption specifies which type of messages this codec supports\ntype CodecOption int\n\nconst (\n\t// OptionMethodInvocation is an indication that the codec supports RPC method calls\n\tOptionMethodInvocation CodecOption = 1 << iota\n\n\t// OptionSubscriptions is an indication that the codec suports RPC notifications\n\tOptionSubscriptions = 1 << iota // support pub sub\n)\n\n// NewServer will create a new server instance with no registered handlers.\nfunc NewServer() *Server {\n\tserver := &Server{\n\t\tservices: make(serviceRegistry),\n\t\tcodecs:   mapset.NewSet(),\n\t\trun:      1,\n\t}\n\n\t// register a default service which will provide meta information about the RPC service such as the services and\n\t// methods it offers.\n\trpcService := &RPCService{server}\n\tserver.RegisterName(MetadataApi, rpcService)\n\n\treturn server\n}\n\n// RPCService gives meta information about the server.\n// e.g. gives information about the loaded modules.\ntype RPCService struct {\n\tserver *Server\n}\n\n// Modules returns the list of RPC services with their version number\nfunc (s *RPCService) Modules() map[string]string {\n\tmodules := make(map[string]string)\n\tfor name := range s.server.services {\n\t\tmodules[name] = \"1.0\"\n\t}\n\treturn modules\n}\n\n// RegisterName will create a service for the given rcvr type under the given name. When no methods on the given rcvr\n// match the criteria to be either a RPC method or a subscription an error is returned. Otherwise a new service is\n// created and added to the service collection this server instance serves.\nfunc (s *Server) RegisterName(name string, rcvr interface{}) error {\n\tif s.services == nil {\n\t\ts.services = make(serviceRegistry)\n\t}\n\n\tsvc := new(service)\n\tsvc.typ = reflect.TypeOf(rcvr)\n\trcvrVal := reflect.ValueOf(rcvr)\n\n\tif name == \"\" {\n\t\treturn fmt.Errorf(\"no service name for type %s\", svc.typ.String())\n\t}\n\tif !isExported(reflect.Indirect(rcvrVal).Type().Name()) {\n\t\treturn fmt.Errorf(\"%s is not exported\", reflect.Indirect(rcvrVal).Type().Name())\n\t}\n\n\tmethods, subscriptions := suitableCallbacks(rcvrVal, svc.typ)\n\n\tif len(methods) == 0 && len(subscriptions) == 0 {\n\t\treturn fmt.Errorf(\"Service %T doesn't have any suitable methods/subscriptions to expose\", rcvr)\n\t}\n\n\t// already a previous service register under given name, merge methods/subscriptions\n\tif regsvc, present := s.services[name]; present {\n\t\tfor _, m := range methods {\n\t\t\tregsvc.callbacks[formatName(m.method.Name)] = m\n\t\t}\n\t\tfor _, s := range subscriptions {\n\t\t\tregsvc.subscriptions[formatName(s.method.Name)] = s\n\t\t}\n\t\treturn nil\n\t}\n\n\tsvc.name = name\n\tsvc.callbacks, svc.subscriptions = methods, subscriptions\n\n\ts.services[svc.name] = svc\n\treturn nil\n}\n\n// serveRequest will reads requests from the codec, calls the RPC callback and\n// writes the response to the given codec.\n//\n// If singleShot is true it will process a single request, otherwise it will handle\n// requests until the codec returns an error when reading a request (in most cases\n// an EOF). It executes requests in parallel when singleShot is false.\nfunc (s *Server) serveRequest(ctx context.Context, codec ServerCodec, singleShot bool, options CodecOption) error {\n\tvar pend sync.WaitGroup\n\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\t\t\tconst size = 64 << 10\n\t\t\tbuf := make([]byte, size)\n\t\t\tbuf = buf[:runtime.Stack(buf, false)]\n\t\t\tlog.Error(string(buf))\n\t\t}\n\t\ts.codecsMu.Lock()\n\t\ts.codecs.Remove(codec)\n\t\ts.codecsMu.Unlock()\n\t}()\n\n\t//\tctx, cancel := context.WithCancel(context.Background())\n\tctx, cancel := context.WithCancel(ctx)\n\tdefer cancel()\n\n\t// if the codec supports notification include a notifier that callbacks can use\n\t// to send notification to clients. It is tied to the codec/connection. If the\n\t// connection is closed the notifier will stop and cancels all active subscriptions.\n\tif options&OptionSubscriptions == OptionSubscriptions {\n\t\tctx = context.WithValue(ctx, notifierKey{}, newNotifier(codec))\n\t}\n\ts.codecsMu.Lock()\n\tif atomic.LoadInt32(&s.run) != 1 { // server stopped\n\t\ts.codecsMu.Unlock()\n\t\treturn &shutdownError{}\n\t}\n\ts.codecs.Add(codec)\n\ts.codecsMu.Unlock()\n\n\t// test if the server is ordered to stop\n\tfor atomic.LoadInt32(&s.run) == 1 {\n\t\treqs, batch, err := s.readRequest(codec)\n\t\tif err != nil {\n\t\t\t// If a parsing error occurred, send an error\n\t\t\tif err.Error() != \"EOF\" {\n\t\t\t\tlog.Debug(fmt.Sprintf(\"read error %v\\n\", err))\n\t\t\t\tcodec.Write(codec.CreateErrorResponse(nil, err))\n\t\t\t}\n\t\t\t// Error or end of stream, wait for requests and tear down\n\t\t\tpend.Wait()\n\t\t\treturn nil\n\t\t}\n\n\t\t// check if server is ordered to shutdown and return an error\n\t\t// telling the client that his request failed.\n\t\tif atomic.LoadInt32(&s.run) != 1 {\n\t\t\terr = &shutdownError{}\n\t\t\tif batch {\n\t\t\t\tresps := make([]interface{}, len(reqs))\n\t\t\t\tfor i, r := range reqs {\n\t\t\t\t\tresps[i] = codec.CreateErrorResponse(&r.id, err)\n\t\t\t\t}\n\t\t\t\tcodec.Write(resps)\n\t\t\t} else {\n\t\t\t\tcodec.Write(codec.CreateErrorResponse(&reqs[0].id, err))\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\t// If a single shot request is executing, run and return immediately\n\t\tif singleShot {\n\t\t\tif batch {\n\t\t\t\ts.execBatch(ctx, codec, reqs)\n\t\t\t} else {\n\t\t\t\ts.exec(ctx, codec, reqs[0])\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\t// For multi-shot connections, start a goroutine to serve and loop back\n\t\tpend.Add(1)\n\n\t\tgo func(reqs []*serverRequest, batch bool) {\n\t\t\tdefer pend.Done()\n\t\t\tif batch {\n\t\t\t\ts.execBatch(ctx, codec, reqs)\n\t\t\t} else {\n\t\t\t\ts.exec(ctx, codec, reqs[0])\n\t\t\t}\n\t\t}(reqs, batch)\n\t}\n\treturn nil\n}\n\n// ServeCodec reads incoming requests from codec, calls the appropriate callback and writes the\n// response back using the given codec. It will block until the codec is closed or the server is\n// stopped. In either case the codec is closed.\nfunc (s *Server) ServeCodec(codec ServerCodec, options CodecOption) {\n\tdefer codec.Close()\n\ts.serveRequest(context.Background(), codec, false, options)\n}\n\n// ServeSingleRequest reads and processes a single RPC request from the given codec. It will not\n// close the codec unless a non-recoverable error has occurred. Note, this method will return after\n// a single request has been processed!\nfunc (s *Server) ServeSingleRequest(ctx context.Context, codec ServerCodec, options CodecOption) {\n\ts.serveRequest(ctx, codec, true, options)\n}\n\n// Stop will stop reading new requests, wait for stopPendingRequestTimeout to allow pending requests to finish,\n// close all codecs which will cancel pending requests/subscriptions.\nfunc (s *Server) Stop() {\n\tif atomic.CompareAndSwapInt32(&s.run, 1, 0) {\n\t\tlog.Debug(\"RPC Server shutdown initiatied\")\n\t\ts.codecsMu.Lock()\n\t\tdefer s.codecsMu.Unlock()\n\t\ts.codecs.Each(func(c interface{}) bool {\n\t\t\tc.(ServerCodec).Close()\n\t\t\treturn true\n\t\t})\n\t}\n}\n\n// createSubscription will call the subscription callback and returns the subscription id or error.\nfunc (s *Server) createSubscription(ctx context.Context, c ServerCodec, req *serverRequest) (ID, error) {\n\t// subscription have as first argument the context following optional arguments\n\targs := []reflect.Value{req.callb.rcvr, reflect.ValueOf(ctx)}\n\targs = append(args, req.args...)\n\treply := req.callb.method.Func.Call(args)\n\n\tif !reply[1].IsNil() { // subscription creation failed\n\t\treturn \"\", reply[1].Interface().(error)\n\t}\n\n\treturn reply[0].Interface().(*Subscription).ID, nil\n}\n\n// handle executes a request and returns the response from the callback.\nfunc (s *Server) handle(ctx context.Context, codec ServerCodec, req *serverRequest) (interface{}, func()) {\n\tif req.err != nil {\n\t\treturn codec.CreateErrorResponse(&req.id, req.err), nil\n\t}\n\n\tif req.isUnsubscribe { // cancel subscription, first param must be the subscription id\n\t\tif len(req.args) >= 1 && req.args[0].Kind() == reflect.String {\n\t\t\tnotifier, supported := NotifierFromContext(ctx)\n\t\t\tif !supported { // interface doesn't support subscriptions (e.g. http)\n\t\t\t\treturn codec.CreateErrorResponse(&req.id, &callbackError{ErrNotificationsUnsupported.Error()}), nil\n\t\t\t}\n\n\t\t\tsubid := ID(req.args[0].String())\n\t\t\tif err := notifier.unsubscribe(subid); err != nil {\n\t\t\t\treturn codec.CreateErrorResponse(&req.id, &callbackError{err.Error()}), nil\n\t\t\t}\n\n\t\t\treturn codec.CreateResponse(req.id, true), nil\n\t\t}\n\t\treturn codec.CreateErrorResponse(&req.id, &invalidParamsError{\"Expected subscription id as first argument\"}), nil\n\t}\n\n\tif req.callb.isSubscribe {\n\t\tsubid, err := s.createSubscription(ctx, codec, req)\n\t\tif err != nil {\n\t\t\treturn codec.CreateErrorResponse(&req.id, &callbackError{err.Error()}), nil\n\t\t}\n\n\t\t// active the subscription after the sub id was successfully sent to the client\n\t\tactivateSub := func() {\n\t\t\tnotifier, _ := NotifierFromContext(ctx)\n\t\t\tnotifier.activate(subid, req.svcname)\n\t\t}\n\n\t\treturn codec.CreateResponse(req.id, subid), activateSub\n\t}\n\n\t// regular RPC call, prepare arguments\n\tif len(req.args) != len(req.callb.argTypes) {\n\t\trpcErr := &invalidParamsError{fmt.Sprintf(\"%s%s%s expects %d parameters, got %d\",\n\t\t\treq.svcname, serviceMethodSeparator, req.callb.method.Name,\n\t\t\tlen(req.callb.argTypes), len(req.args))}\n\t\treturn codec.CreateErrorResponse(&req.id, rpcErr), nil\n\t}\n\n\targuments := []reflect.Value{req.callb.rcvr}\n\tif req.callb.hasCtx {\n\t\targuments = append(arguments, reflect.ValueOf(ctx))\n\t}\n\tif len(req.args) > 0 {\n\t\targuments = append(arguments, req.args...)\n\t}\n\n\t// execute RPC method and return result\n\treply := req.callb.method.Func.Call(arguments)\n\tif len(reply) == 0 {\n\t\treturn codec.CreateResponse(req.id, nil), nil\n\t}\n\tif req.callb.errPos >= 0 { // test if method returned an error\n\t\tif !reply[req.callb.errPos].IsNil() {\n\t\t\te := reply[req.callb.errPos].Interface().(error)\n\t\t\tres := codec.CreateErrorResponse(&req.id, &callbackError{e.Error()})\n\t\t\treturn res, nil\n\t\t}\n\t}\n\treturn codec.CreateResponse(req.id, reply[0].Interface()), nil\n}\n\n// exec executes the given request and writes the result back using the codec.\nfunc (s *Server) exec(ctx context.Context, codec ServerCodec, req *serverRequest) {\n\tvar response interface{}\n\tvar callback func()\n\tif req.err != nil {\n\t\tresponse = codec.CreateErrorResponse(&req.id, req.err)\n\t} else {\n\t\tresponse, callback = s.handle(ctx, codec, req)\n\t}\n\n\tif err := codec.Write(response); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"%v\\n\", err))\n\t\tcodec.Close()\n\t}\n\n\t// when request was a subscribe request this allows these subscriptions to be actived\n\tif callback != nil {\n\t\tcallback()\n\t}\n}\n\n// execBatch executes the given requests and writes the result back using the codec.\n// It will only write the response back when the last request is processed.\nfunc (s *Server) execBatch(ctx context.Context, codec ServerCodec, requests []*serverRequest) {\n\tresponses := make([]interface{}, len(requests))\n\tvar callbacks []func()\n\tfor i, req := range requests {\n\t\tif req.err != nil {\n\t\t\tresponses[i] = codec.CreateErrorResponse(&req.id, req.err)\n\t\t} else {\n\t\t\tvar callback func()\n\t\t\tif responses[i], callback = s.handle(ctx, codec, req); callback != nil {\n\t\t\t\tcallbacks = append(callbacks, callback)\n\t\t\t}\n\t\t}\n\t}\n\n\tif err := codec.Write(responses); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"%v\\n\", err))\n\t\tcodec.Close()\n\t}\n\n\t// when request holds one of more subscribe requests this allows these subscriptions to be activated\n\tfor _, c := range callbacks {\n\t\tc()\n\t}\n}\n\n// readRequest requests the next (batch) request from the codec. It will return the collection\n// of requests, an indication if the request was a batch, the invalid request identifier and an\n// error when the request could not be read/parsed.\nfunc (s *Server) readRequest(codec ServerCodec) ([]*serverRequest, bool, Error) {\n\treqs, batch, err := codec.ReadRequestHeaders()\n\tif err != nil {\n\t\treturn nil, batch, err\n\t}\n\n\trequests := make([]*serverRequest, len(reqs))\n\n\t// verify requests\n\tfor i, r := range reqs {\n\t\tvar ok bool\n\t\tvar svc *service\n\n\t\tif r.err != nil {\n\t\t\trequests[i] = &serverRequest{id: r.id, err: r.err}\n\t\t\tcontinue\n\t\t}\n\n\t\tif r.isPubSub && strings.HasSuffix(r.method, unsubscribeMethodSuffix) {\n\t\t\trequests[i] = &serverRequest{id: r.id, isUnsubscribe: true}\n\t\t\targTypes := []reflect.Type{reflect.TypeOf(\"\")} // expect subscription id as first arg\n\t\t\tif args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil {\n\t\t\t\trequests[i].args = args\n\t\t\t} else {\n\t\t\t\trequests[i].err = &invalidParamsError{err.Error()}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif svc, ok = s.services[r.service]; !ok { // rpc method isn't available\n\t\t\trequests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}}\n\t\t\tcontinue\n\t\t}\n\n\t\tif r.isPubSub { // sero_subscribe, r.method contains the subscription method name\n\t\t\tif callb, ok := svc.subscriptions[r.method]; ok {\n\t\t\t\trequests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb}\n\t\t\t\tif r.params != nil && len(callb.argTypes) > 0 {\n\t\t\t\t\targTypes := []reflect.Type{reflect.TypeOf(\"\")}\n\t\t\t\t\targTypes = append(argTypes, callb.argTypes...)\n\t\t\t\t\tif args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil {\n\t\t\t\t\t\trequests[i].args = args[1:] // first one is service.method name which isn't an actual argument\n\t\t\t\t\t} else {\n\t\t\t\t\t\trequests[i].err = &invalidParamsError{err.Error()}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\trequests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif callb, ok := svc.callbacks[r.method]; ok { // lookup RPC method\n\t\t\trequests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb}\n\t\t\tif r.params != nil && len(callb.argTypes) > 0 {\n\t\t\t\tif args, err := codec.ParseRequestArguments(callb.argTypes, r.params); err == nil {\n\t\t\t\t\trequests[i].args = args\n\t\t\t\t} else {\n\t\t\t\t\trequests[i].err = &invalidParamsError{err.Error()}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\trequests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}}\n\t}\n\n\treturn requests, batch, nil\n}\n"
  },
  {
    "path": "rpc/subscription.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"sync\"\n)\n\nvar (\n\t// ErrNotificationsUnsupported is returned when the connection doesn't support notifications\n\tErrNotificationsUnsupported = errors.New(\"notifications not supported\")\n\t// ErrNotificationNotFound is returned when the notification for the given id is not found\n\tErrSubscriptionNotFound = errors.New(\"subscription not found\")\n)\n\n// ID defines a pseudo random number that is used to identify RPC subscriptions.\ntype ID string\n\n// a Subscription is created by a notifier and tight to that notifier. The client can use\n// this subscription to wait for an unsubscribe request for the client, see Err().\ntype Subscription struct {\n\tID        ID\n\tnamespace string\n\terr       chan error // closed on unsubscribe\n}\n\n// Err returns a channel that is closed when the client send an unsubscribe request.\nfunc (s *Subscription) Err() <-chan error {\n\treturn s.err\n}\n\n// notifierKey is used to store a notifier within the connection context.\ntype notifierKey struct{}\n\n// Notifier is tight to a RPC connection that supports subscriptions.\n// Server callbacks use the notifier to send notifications.\ntype Notifier struct {\n\tcodec    ServerCodec\n\tsubMu    sync.RWMutex // guards active and inactive maps\n\tactive   map[ID]*Subscription\n\tinactive map[ID]*Subscription\n}\n\n// newNotifier creates a new notifier that can be used to send subscription\n// notifications to the client.\nfunc newNotifier(codec ServerCodec) *Notifier {\n\treturn &Notifier{\n\t\tcodec:    codec,\n\t\tactive:   make(map[ID]*Subscription),\n\t\tinactive: make(map[ID]*Subscription),\n\t}\n}\n\n// NotifierFromContext returns the Notifier value stored in ctx, if any.\nfunc NotifierFromContext(ctx context.Context) (*Notifier, bool) {\n\tn, ok := ctx.Value(notifierKey{}).(*Notifier)\n\treturn n, ok\n}\n\n// CreateSubscription returns a new subscription that is coupled to the\n// RPC connection. By default subscriptions are inactive and notifications\n// are dropped until the subscription is marked as active. This is done\n// by the RPC server after the subscription ID is send to the client.\nfunc (n *Notifier) CreateSubscription() *Subscription {\n\ts := &Subscription{ID: NewID(), err: make(chan error)}\n\tn.subMu.Lock()\n\tn.inactive[s.ID] = s\n\tn.subMu.Unlock()\n\treturn s\n}\n\n// Notify sends a notification to the client with the given data as payload.\n// If an error occurs the RPC connection is closed and the error is returned.\nfunc (n *Notifier) Notify(id ID, data interface{}) error {\n\tn.subMu.RLock()\n\tdefer n.subMu.RUnlock()\n\n\tsub, active := n.active[id]\n\tif active {\n\t\tnotification := n.codec.CreateNotification(string(id), sub.namespace, data)\n\t\tif err := n.codec.Write(notification); err != nil {\n\t\t\tn.codec.Close()\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Closed returns a channel that is closed when the RPC connection is closed.\nfunc (n *Notifier) Closed() <-chan interface{} {\n\treturn n.codec.Closed()\n}\n\n// unsubscribe a subscription.\n// If the subscription could not be found ErrSubscriptionNotFound is returned.\nfunc (n *Notifier) unsubscribe(id ID) error {\n\tn.subMu.Lock()\n\tdefer n.subMu.Unlock()\n\tif s, found := n.active[id]; found {\n\t\tclose(s.err)\n\t\tdelete(n.active, id)\n\t\treturn nil\n\t}\n\treturn ErrSubscriptionNotFound\n}\n\n// activate enables a subscription. Until a subscription is enabled all\n// notifications are dropped. This method is called by the RPC server after\n// the subscription ID was sent to client. This prevents notifications being\n// send to the client before the subscription ID is send to the client.\nfunc (n *Notifier) activate(id ID, namespace string) {\n\tn.subMu.Lock()\n\tdefer n.subMu.Unlock()\n\tif sub, found := n.inactive[id]; found {\n\t\tsub.namespace = namespace\n\t\tn.active[id] = sub\n\t\tdelete(n.inactive, id)\n\t}\n}\n"
  },
  {
    "path": "rpc/types.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\n// API describes the set of methods offered over the RPC interface\ntype API struct {\n\tNamespace string      // namespace under which the rpc methods of Service are exposed\n\tVersion   string      // api version for DApp's\n\tService   interface{} // receiver instance which holds the methods\n\tPublic    bool        // indication if the methods must be considered safe for public use\n}\n\n// callback is a method callback which was registered in the server\ntype callback struct {\n\trcvr        reflect.Value  // receiver of method\n\tmethod      reflect.Method // callback\n\targTypes    []reflect.Type // input argument types\n\thasCtx      bool           // method's first argument is a context (not included in argTypes)\n\terrPos      int            // err return idx, of -1 when method cannot return error\n\tisSubscribe bool           // indication if the callback is a subscription\n}\n\n// service represents a registered object\ntype service struct {\n\tname          string        // name for service\n\ttyp           reflect.Type  // receiver type\n\tcallbacks     callbacks     // registered handlers\n\tsubscriptions subscriptions // available subscriptions/notifications\n}\n\n// serverRequest is an incoming request\ntype serverRequest struct {\n\tid            interface{}\n\tsvcname       string\n\tcallb         *callback\n\targs          []reflect.Value\n\tisUnsubscribe bool\n\terr           Error\n}\n\ntype serviceRegistry map[string]*service // collection of services\ntype callbacks map[string]*callback      // collection of RPC callbacks\ntype subscriptions map[string]*callback  // collection of subscription callbacks\n\n// Server represents a RPC server\ntype Server struct {\n\tservices serviceRegistry\n\n\trun      int32\n\tcodecsMu sync.Mutex\n\tcodecs   mapset.Set\n}\n\n// rpcRequest represents a raw incoming RPC request\ntype rpcRequest struct {\n\tservice  string\n\tmethod   string\n\tid       interface{}\n\tisPubSub bool\n\tparams   interface{}\n\terr      Error // invalid batch element\n}\n\n// Error wraps RPC errors, which contain an error code in addition to the message.\ntype Error interface {\n\tError() string  // returns the message\n\tErrorCode() int // returns the code\n}\n\n// ServerCodec implements reading, parsing and writing RPC messages for the server side of\n// a RPC session. Implementations must be go-routine safe since the codec can be called in\n// multiple go-routines concurrently.\ntype ServerCodec interface {\n\t// Read next request\n\tReadRequestHeaders() ([]rpcRequest, bool, Error)\n\t// Parse request argument to the given types\n\tParseRequestArguments(argTypes []reflect.Type, params interface{}) ([]reflect.Value, Error)\n\t// Assemble success response, expects response id and payload\n\tCreateResponse(id interface{}, reply interface{}) interface{}\n\t// Assemble error response, expects response id and error\n\tCreateErrorResponse(id interface{}, err Error) interface{}\n\t// Assemble error response with extra information about the error through info\n\tCreateErrorResponseWithInfo(id interface{}, err Error, info interface{}) interface{}\n\t// Create notification response\n\tCreateNotification(id, namespace string, event interface{}) interface{}\n\t// Write msg to client.\n\tWrite(msg interface{}) error\n\t// Close underlying data stream\n\tClose()\n\t// Closed when underlying connection is closed\n\tClosed() <-chan interface{}\n}\n\ntype BlockNumber int64\n\nconst (\n\tPendingBlockNumber  = BlockNumber(-2)\n\tLatestBlockNumber   = BlockNumber(-1)\n\tEarliestBlockNumber = BlockNumber(0)\n)\n\n// UnmarshalJSON parses the given JSON fragment into a BlockNumber. It supports:\n// - \"latest\", \"earliest\" or \"pending\" as string arguments\n// - the block number\n// Returned errors:\n// - an invalid block number error when the given argument isn't a known strings\n// - an out of range error when the given block number is either too little or too large\nfunc (bn *BlockNumber) UnmarshalJSON(data []byte) error {\n\tinput := strings.TrimSpace(string(data))\n\tif len(input) >= 2 && input[0] == '\"' && input[len(input)-1] == '\"' {\n\t\tinput = input[1 : len(input)-1]\n\t}\n\n\tswitch input {\n\tcase \"earliest\":\n\t\t*bn = EarliestBlockNumber\n\t\treturn nil\n\tcase \"latest\":\n\t\t*bn = LatestBlockNumber\n\t\treturn nil\n\tcase \"pending\":\n\t\t*bn = PendingBlockNumber\n\t\treturn nil\n\t}\n\n\tblckNum, err := hexutil.DecodeUint64(input)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif blckNum > math.MaxInt64 {\n\t\treturn fmt.Errorf(\"Blocknumber too high\")\n\t}\n\n\t*bn = BlockNumber(blckNum)\n\treturn nil\n}\n\nfunc (bn BlockNumber) Int64() int64 {\n\treturn (int64)(bn)\n}\n"
  },
  {
    "path": "rpc/utils.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"bufio\"\n\t\"context\"\n\tcrand \"crypto/rand\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"math/rand\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\nvar (\n\tsubscriptionIDGenMu sync.Mutex\n\tsubscriptionIDGen   = idGenerator()\n)\n\n// Is this an exported - upper case - name?\nfunc isExported(name string) bool {\n\trune, _ := utf8.DecodeRuneInString(name)\n\treturn unicode.IsUpper(rune)\n}\n\n// Is this type exported or a builtin?\nfunc isExportedOrBuiltinType(t reflect.Type) bool {\n\tfor t.Kind() == reflect.Ptr {\n\t\tt = t.Elem()\n\t}\n\t// PkgPath will be non-empty even for an exported type,\n\t// so we need to check the type name as well.\n\treturn isExported(t.Name()) || t.PkgPath() == \"\"\n}\n\nvar contextType = reflect.TypeOf((*context.Context)(nil)).Elem()\n\n// isContextType returns an indication if the given t is of context.Context or *context.Context type\nfunc isContextType(t reflect.Type) bool {\n\tfor t.Kind() == reflect.Ptr {\n\t\tt = t.Elem()\n\t}\n\treturn t == contextType\n}\n\nvar errorType = reflect.TypeOf((*error)(nil)).Elem()\n\n// Implements this type the error interface\nfunc isErrorType(t reflect.Type) bool {\n\tfor t.Kind() == reflect.Ptr {\n\t\tt = t.Elem()\n\t}\n\treturn t.Implements(errorType)\n}\n\nvar subscriptionType = reflect.TypeOf((*Subscription)(nil)).Elem()\n\n// isSubscriptionType returns an indication if the given t is of Subscription or *Subscription type\nfunc isSubscriptionType(t reflect.Type) bool {\n\tfor t.Kind() == reflect.Ptr {\n\t\tt = t.Elem()\n\t}\n\treturn t == subscriptionType\n}\n\n// isPubSub tests whether the given method has as as first argument a context.Context\n// and returns the pair (Subscription, error)\nfunc isPubSub(methodType reflect.Type) bool {\n\t// numIn(0) is the receiver type\n\tif methodType.NumIn() < 2 || methodType.NumOut() != 2 {\n\t\treturn false\n\t}\n\n\treturn isContextType(methodType.In(1)) &&\n\t\tisSubscriptionType(methodType.Out(0)) &&\n\t\tisErrorType(methodType.Out(1))\n}\n\n// formatName will convert to first character to lower case\nfunc formatName(name string) string {\n\tret := []rune(name)\n\tif len(ret) > 0 {\n\t\tret[0] = unicode.ToLower(ret[0])\n\t}\n\treturn string(ret)\n}\n\n// suitableCallbacks iterates over the methods of the given type. It will determine if a method satisfies the criteria\n// for a RPC callback or a subscription callback and adds it to the collection of callbacks or subscriptions. See server\n// documentation for a summary of these criteria.\nfunc suitableCallbacks(rcvr reflect.Value, typ reflect.Type) (callbacks, subscriptions) {\n\tcallbacks := make(callbacks)\n\tsubscriptions := make(subscriptions)\n\nMETHODS:\n\tfor m := 0; m < typ.NumMethod(); m++ {\n\t\tmethod := typ.Method(m)\n\t\tmtype := method.Type\n\t\tmname := formatName(method.Name)\n\t\tif method.PkgPath != \"\" { // method must be exported\n\t\t\tcontinue\n\t\t}\n\n\t\tvar h callback\n\t\th.isSubscribe = isPubSub(mtype)\n\t\th.rcvr = rcvr\n\t\th.method = method\n\t\th.errPos = -1\n\n\t\tfirstArg := 1\n\t\tnumIn := mtype.NumIn()\n\t\tif numIn >= 2 && mtype.In(1) == contextType {\n\t\t\th.hasCtx = true\n\t\t\tfirstArg = 2\n\t\t}\n\n\t\tif h.isSubscribe {\n\t\t\th.argTypes = make([]reflect.Type, numIn-firstArg) // skip rcvr type\n\t\t\tfor i := firstArg; i < numIn; i++ {\n\t\t\t\targType := mtype.In(i)\n\t\t\t\tif isExportedOrBuiltinType(argType) {\n\t\t\t\t\th.argTypes[i-firstArg] = argType\n\t\t\t\t} else {\n\t\t\t\t\tcontinue METHODS\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsubscriptions[mname] = &h\n\t\t\tcontinue METHODS\n\t\t}\n\n\t\t// determine method arguments, ignore first arg since it's the receiver type\n\t\t// Arguments must be exported or builtin types\n\t\th.argTypes = make([]reflect.Type, numIn-firstArg)\n\t\tfor i := firstArg; i < numIn; i++ {\n\t\t\targType := mtype.In(i)\n\t\t\tif !isExportedOrBuiltinType(argType) {\n\t\t\t\tcontinue METHODS\n\t\t\t}\n\t\t\th.argTypes[i-firstArg] = argType\n\t\t}\n\n\t\t// check that all returned values are exported or builtin types\n\t\tfor i := 0; i < mtype.NumOut(); i++ {\n\t\t\tif !isExportedOrBuiltinType(mtype.Out(i)) {\n\t\t\t\tcontinue METHODS\n\t\t\t}\n\t\t}\n\n\t\t// when a method returns an error it must be the last returned value\n\t\th.errPos = -1\n\t\tfor i := 0; i < mtype.NumOut(); i++ {\n\t\t\tif isErrorType(mtype.Out(i)) {\n\t\t\t\th.errPos = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif h.errPos >= 0 && h.errPos != mtype.NumOut()-1 {\n\t\t\tcontinue METHODS\n\t\t}\n\n\t\tswitch mtype.NumOut() {\n\t\tcase 0, 1, 2:\n\t\t\tif mtype.NumOut() == 2 && h.errPos == -1 { // method must one return value and 1 error\n\t\t\t\tcontinue METHODS\n\t\t\t}\n\t\t\tcallbacks[mname] = &h\n\t\t}\n\t}\n\n\treturn callbacks, subscriptions\n}\n\n// idGenerator helper utility that generates a (pseudo) random sequence of\n// bytes that are used to generate identifiers.\nfunc idGenerator() *rand.Rand {\n\tif seed, err := binary.ReadVarint(bufio.NewReader(crand.Reader)); err == nil {\n\t\treturn rand.New(rand.NewSource(seed))\n\t}\n\treturn rand.New(rand.NewSource(int64(time.Now().Nanosecond())))\n}\n\n// NewID generates a identifier that can be used as an identifier in the RPC interface.\n// e.g. filter and subscription identifier.\nfunc NewID() ID {\n\tsubscriptionIDGenMu.Lock()\n\tdefer subscriptionIDGenMu.Unlock()\n\n\tid := make([]byte, 16)\n\tfor i := 0; i < len(id); i += 7 {\n\t\tval := subscriptionIDGen.Int63()\n\t\tfor j := 0; i+j < len(id) && j < 7; j++ {\n\t\t\tid[i+j] = byte(val)\n\t\t\tval >>= 8\n\t\t}\n\t}\n\n\trpcId := hex.EncodeToString(id)\n\t// rpc ID's are RPC quantities, no leading zero's and 0 is 0x0\n\trpcId = strings.TrimLeft(rpcId, \"0\")\n\tif rpcId == \"\" {\n\t\trpcId = \"0\"\n\t}\n\n\treturn ID(\"0x\" + rpcId)\n}\n"
  },
  {
    "path": "rpc/websocket.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n\t\"time\"\n\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"golang.org/x/net/websocket\"\n)\n\n// websocketJSONCodec is a custom JSON codec with payload size enforcement and\n// special number parsing.\nvar websocketJSONCodec = websocket.Codec{\n\t// Marshal is the stock JSON marshaller used by the websocket library too.\n\tMarshal: func(v interface{}) ([]byte, byte, error) {\n\t\tmsg, err := json.Marshal(v)\n\t\treturn msg, websocket.TextFrame, err\n\t},\n\t// Unmarshal is a specialized unmarshaller to properly convert numbers.\n\tUnmarshal: func(msg []byte, payloadType byte, v interface{}) error {\n\t\tdec := json.NewDecoder(bytes.NewReader(msg))\n\t\tdec.UseNumber()\n\n\t\treturn dec.Decode(v)\n\t},\n}\n\n// WebsocketHandler returns a handler that serves JSON-RPC to WebSocket connections.\n//\n// allowedOrigins should be a comma-separated list of allowed origin URLs.\n// To allow connections with any origin, pass \"*\".\nfunc (srv *Server) WebsocketHandler(allowedOrigins []string) http.Handler {\n\treturn websocket.Server{\n\t\tHandshake: wsHandshakeValidator(allowedOrigins),\n\t\tHandler: func(conn *websocket.Conn) {\n\t\t\t// Create a custom encode/decode pair to enforce payload size and number encoding\n\t\t\tconn.MaxPayloadBytes = int(maxRequestContentLength)\n\n\t\t\tencoder := func(v interface{}) error {\n\t\t\t\treturn websocketJSONCodec.Send(conn, v)\n\t\t\t}\n\t\t\tdecoder := func(v interface{}) error {\n\t\t\t\treturn websocketJSONCodec.Receive(conn, v)\n\t\t\t}\n\t\t\tsrv.ServeCodec(NewCodec(conn, encoder, decoder), OptionMethodInvocation|OptionSubscriptions)\n\t\t},\n\t}\n}\n\n// NewWSServer creates a new websocket RPC server around an API provider.\n//\n// Deprecated: use Server.WebsocketHandler\nfunc NewWSServer(allowedOrigins []string, srv *Server) *http.Server {\n\treturn &http.Server{Handler: srv.WebsocketHandler(allowedOrigins)}\n}\n\n// wsHandshakeValidator returns a handler that verifies the origin during the\n// websocket upgrade process. When a '*' is specified as an allowed origins all\n// connections are accepted.\nfunc wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http.Request) error {\n\torigins := mapset.NewSet()\n\tallowAllOrigins := false\n\n\tfor _, origin := range allowedOrigins {\n\t\tif origin == \"*\" {\n\t\t\tallowAllOrigins = true\n\t\t}\n\t\tif origin != \"\" {\n\t\t\torigins.Add(strings.ToLower(origin))\n\t\t}\n\t}\n\n\t// allow localhost if no allowedOrigins are specified.\n\tif len(origins.ToSlice()) == 0 {\n\t\torigins.Add(\"http://localhost\")\n\t\tif hostname, err := os.Hostname(); err == nil {\n\t\t\torigins.Add(\"http://\" + strings.ToLower(hostname))\n\t\t}\n\t}\n\n\tlog.Debug(fmt.Sprintf(\"Allowed origin(s) for WS RPC interface %v\\n\", origins.ToSlice()))\n\n\tf := func(cfg *websocket.Config, req *http.Request) error {\n\t\torigin := strings.ToLower(req.Header.Get(\"Origin\"))\n\t\tif allowAllOrigins || origins.Contains(origin) {\n\t\t\treturn nil\n\t\t}\n\t\tlog.Warn(fmt.Sprintf(\"origin '%s' not allowed on WS-RPC interface\\n\", origin))\n\t\treturn fmt.Errorf(\"origin %s not allowed\", origin)\n\t}\n\n\treturn f\n}\n\n// DialWebsocket creates a new RPC client that communicates with a JSON-RPC server\n// that is listening on the given endpoint.\n//\n// The context is used for the initial connection establishment. It does not\n// affect subsequent interactions with the client.\nfunc DialWebsocket(ctx context.Context, endpoint, origin string) (*Client, error) {\n\tif origin == \"\" {\n\t\tvar err error\n\t\tif origin, err = os.Hostname(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif strings.HasPrefix(endpoint, \"wss\") {\n\t\t\torigin = \"https://\" + strings.ToLower(origin)\n\t\t} else {\n\t\t\torigin = \"http://\" + strings.ToLower(origin)\n\t\t}\n\t}\n\tconfig, err := websocket.NewConfig(endpoint, origin)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn newClient(ctx, func(ctx context.Context) (net.Conn, error) {\n\t\treturn wsDialContext(ctx, config)\n\t})\n}\n\nfunc wsDialContext(ctx context.Context, config *websocket.Config) (*websocket.Conn, error) {\n\tvar conn net.Conn\n\tvar err error\n\tswitch config.Location.Scheme {\n\tcase \"ws\":\n\t\tconn, err = dialContext(ctx, \"tcp\", wsDialAddress(config.Location))\n\tcase \"wss\":\n\t\tdialer := contextDialer(ctx)\n\t\tconn, err = tls.DialWithDialer(dialer, \"tcp\", wsDialAddress(config.Location), config.TlsConfig)\n\tdefault:\n\t\terr = websocket.ErrBadScheme\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tws, err := websocket.NewClient(config, conn)\n\tif err != nil {\n\t\tconn.Close()\n\t\treturn nil, err\n\t}\n\treturn ws, err\n}\n\nvar wsPortMap = map[string]string{\"ws\": \"80\", \"wss\": \"443\"}\n\nfunc wsDialAddress(location *url.URL) string {\n\tif _, ok := wsPortMap[location.Scheme]; ok {\n\t\tif _, _, err := net.SplitHostPort(location.Host); err != nil {\n\t\t\treturn net.JoinHostPort(location.Host, wsPortMap[location.Scheme])\n\t\t}\n\t}\n\treturn location.Host\n}\n\nfunc dialContext(ctx context.Context, network, addr string) (net.Conn, error) {\n\td := &net.Dialer{KeepAlive: tcpKeepAliveInterval}\n\treturn d.DialContext(ctx, network, addr)\n}\n\nfunc contextDialer(ctx context.Context) *net.Dialer {\n\tdialer := &net.Dialer{Cancel: ctx.Done(), KeepAlive: tcpKeepAliveInterval}\n\tif deadline, ok := ctx.Deadline(); ok {\n\t\tdialer.Deadline = deadline\n\t} else {\n\t\tdialer.Deadline = time.Now().Add(defaultDialTimeout)\n\t}\n\treturn dialer\n}\n"
  },
  {
    "path": "sero/api.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"compress/gzip\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/rpc\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/address\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/internal/ethapi\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/miner\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\n// PublicSeroAPI provides an API to access Sero full node-related\n// information.\ntype PublicSeroAPI struct {\n\te *Sero\n}\n\n// NewPublicSeroAPI creates a new Sero protocol API for full nodes.\nfunc NewPublicSeroAPI(e *Sero) *PublicSeroAPI {\n\treturn &PublicSeroAPI{e}\n}\n\n// Serobase is the address that mining rewards will be send to\nfunc (api *PublicSeroAPI) Serobase() (address.PKAddress, error) {\n\taccount, err := api.e.Serobase()\n\tif err != nil {\n\t\treturn address.PKAddress{}, err\n\t}\n\treturn account.Address, nil\n}\n\n// Coinbase is the address that mining rewards will be send to (alias for Serobase)\nfunc (api *PublicSeroAPI) Coinbase() (address.PKAddress, error) {\n\treturn api.Serobase()\n}\n\n// Hashrate returns the POW hashrate\nfunc (api *PublicSeroAPI) Hashrate() hexutil.Uint64 {\n\treturn hexutil.Uint64(api.e.Miner().HashRate())\n}\n\nfunc (api *PublicSeroAPI) StartHashrate() {\n\tapi.e.Miner().StartHashRate()\n}\n\nfunc (api *PublicSeroAPI) StopHashrate() {\n\tapi.e.Miner().StropHashRate()\n}\n\n// PublicMinerAPI provides an API to control the miner.\n// It offers only methods that operate on data that pose no security risk when it is publicly accessible.\ntype PublicMinerAPI struct {\n\te     *Sero\n\tagent *miner.RemoteAgent\n}\n\n// NewPublicMinerAPI create a new PublicMinerAPI instance.\nfunc NewPublicMinerAPI(e *Sero) *PublicMinerAPI {\n\tagent := miner.NewRemoteAgent(e.BlockChain(), e.Engine())\n\te.Miner().Register(agent)\n\n\treturn &PublicMinerAPI{e, agent}\n}\n\n// Mining returns an indication if this node is currently mining.\nfunc (api *PublicMinerAPI) Mining() bool {\n\treturn api.e.IsMining()\n}\n\n// SubmitWork can be used by external miner to submit their POW solution. It returns an indication if the work was\n// accepted. Note, this is not an indication if the provided work was valid!\nfunc (api *PublicMinerAPI) SubmitWork(nonce types.BlockNonce, solution, digest common.Hash) bool {\n\treturn api.agent.SubmitWork(nonce, digest, solution)\n}\n\n// GetWork returns a work package for external miner. The work package consists of 3 strings\n// result[0], 32 bytes hex encoded current block header pow-hash\n// result[1], 32 bytes hex encoded seed hash used for DAG\n// result[2], 32 bytes hex encoded boundary condition (\"target\"), 2^256/difficulty\nfunc (api *PublicMinerAPI) GetWork() ([4]string, error) {\n\tif !api.e.IsMining() {\n\t\tif err := api.e.StartMining(false); err != nil {\n\t\t\treturn [4]string{}, err\n\t\t}\n\t}\n\twork, err := api.agent.GetWork()\n\tif err != nil {\n\t\treturn work, fmt.Errorf(\"mining not ready: %v\", err)\n\t}\n\treturn work, nil\n}\n\n// SubmitHashrate can be used for remote miners to submit their hash rate. This enables the node to report the combined\n// hash rate of all miners which submit work through this node. It accepts the miner hash rate and an identifier which\n// must be unique between nodes.\nfunc (api *PublicMinerAPI) SubmitHashrate(hashrate hexutil.Uint64, id common.Hash) bool {\n\tapi.agent.SubmitHashrate(id, uint64(hashrate))\n\treturn true\n}\n\n// PrivateMinerAPI provides private RPC methods to control the miner.\n// These methods can be abused by external users and must be considered insecure for use by untrusted users.\ntype PrivateMinerAPI struct {\n\ts *Sero\n}\n\n// NewPrivateMinerAPI create a new RPC service which controls the miner of this node.\nfunc NewPrivateMinerAPI(e *Sero) *PrivateMinerAPI {\n\treturn &PrivateMinerAPI{s: e}\n}\n\n// Start the miner with the given number of threads. If threads is nil the number\n// of workers started is equal to the number of logical CPUs that are usable by\n// this process. If mining is already running, this method adjust the number of\n// threads allowed to use.\nfunc (api *PrivateMinerAPI) Start(threads *int) error {\n\t// Set the number of threads if the seal engine supports it\n\tif threads == nil {\n\t\tthreads = new(int)\n\t} else if *threads == 0 {\n\t\t*threads = -1 // Disable the miner from within\n\t}\n\ttype threaded interface {\n\t\tSetThreads(threads int)\n\t}\n\tif th, ok := api.s.engine.(threaded); ok {\n\t\tlog.Info(\"Updated mining threads\", \"threads\", *threads)\n\t\tth.SetThreads(*threads)\n\t}\n\t// Start the miner and return\n\tif !api.s.IsMining() {\n\t\t// Propagate the initial price point to the transaction pool\n\t\tapi.s.lock.RLock()\n\t\tprice := api.s.gasPrice\n\t\tapi.s.lock.RUnlock()\n\n\t\tapi.s.txPool.SetGasPrice(price)\n\t\treturn api.s.StartMining(true)\n\t}\n\treturn nil\n}\n\n// Stop the miner\nfunc (api *PrivateMinerAPI) Stop() bool {\n\ttype threaded interface {\n\t\tSetThreads(threads int)\n\t}\n\tif th, ok := api.s.engine.(threaded); ok {\n\t\tth.SetThreads(-1)\n\t}\n\tapi.s.StopMining()\n\treturn true\n}\n\n// SetExtra sets the extra data string that is included when this miner mines a block.\nfunc (api *PrivateMinerAPI) SetExtra(extra string) (bool, error) {\n\tif err := api.s.Miner().SetExtra([]byte(extra)); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\n// SetGasPrice sets the minimum accepted gas price for the miner.\nfunc (api *PrivateMinerAPI) SetGasPrice(gasPrice hexutil.Big) bool {\n\tapi.s.lock.Lock()\n\tapi.s.gasPrice = (*big.Int)(&gasPrice)\n\tapi.s.lock.Unlock()\n\n\tapi.s.txPool.SetGasPrice((*big.Int)(&gasPrice))\n\treturn true\n}\n\n// SetSerobase sets the serobase of the miner\nfunc (api *PrivateMinerAPI) SetSerobase(serobase address.MixBase58Adrress) bool {\n\tapi.s.SetSerobase(serobase)\n\treturn true\n}\n\n// GetHashrate returns the current hashrate of the miner.\nfunc (api *PrivateMinerAPI) GetHashrate() uint64 {\n\treturn uint64(api.s.miner.HashRate())\n}\n\n// PrivateAdminAPI is the collection of Sero full node-related APIs\n// exposed over the private admin endpoint.\ntype PrivateAdminAPI struct {\n\teth *Sero\n}\n\n// NewPrivateAdminAPI creates a new API definition for the full node private\n// admin methods of the Sero service.\nfunc NewPrivateAdminAPI(eth *Sero) *PrivateAdminAPI {\n\treturn &PrivateAdminAPI{eth: eth}\n}\n\n// ExportChain exports the current blockchain into a local file.\nfunc (api *PrivateAdminAPI) ExportChain(file string) (bool, error) {\n\t// Make sure we can create the file to export into\n\tout, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tdefer out.Close()\n\n\tvar writer io.Writer = out\n\tif strings.HasSuffix(file, \".gz\") {\n\t\twriter = gzip.NewWriter(writer)\n\t\tdefer writer.(*gzip.Writer).Close()\n\t}\n\n\t// Export the blockchain\n\tif err := api.eth.BlockChain().Export(writer); err != nil {\n\t\treturn false, err\n\t}\n\treturn true, nil\n}\n\nfunc hasAllBlocks(chain *core.BlockChain, bs []*types.Block) bool {\n\tfor _, b := range bs {\n\t\tif !chain.HasBlock(b.Hash(), b.NumberU64()) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// ImportChain imports a blockchain from a local file.\nfunc (api *PrivateAdminAPI) ImportChain(file string) (bool, error) {\n\t// Make sure the can access the file to import\n\tin, err := os.Open(file)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tdefer in.Close()\n\n\tvar reader io.Reader = in\n\tif strings.HasSuffix(file, \".gz\") {\n\t\tif reader, err = gzip.NewReader(reader); err != nil {\n\t\t\treturn false, err\n\t\t}\n\t}\n\n\t// Run actual the import in pre-configured batches\n\tstream := rlp.NewStream(reader, 0)\n\n\tblocks, index := make([]*types.Block, 0, 2500), 0\n\tfor batch := 0; ; batch++ {\n\t\t// Load a batch of blocks from the input file\n\t\tfor len(blocks) < cap(blocks) {\n\t\t\tblock := new(types.Block)\n\t\t\tif err := stream.Decode(block); err == io.EOF {\n\t\t\t\tbreak\n\t\t\t} else if err != nil {\n\t\t\t\treturn false, fmt.Errorf(\"block %d: failed to parse: %v\", index, err)\n\t\t\t}\n\t\t\tblocks = append(blocks, block)\n\t\t\tindex++\n\t\t}\n\t\tif len(blocks) == 0 {\n\t\t\tbreak\n\t\t}\n\n\t\tif hasAllBlocks(api.eth.BlockChain(), blocks) {\n\t\t\tblocks = blocks[:0]\n\t\t\tcontinue\n\t\t}\n\t\t// Import the batch and reset the buffer\n\t\tif _, err := api.eth.BlockChain().InsertChain(blocks); err != nil {\n\t\t\treturn false, fmt.Errorf(\"batch %d: failed to insert: %v\", batch, err)\n\t\t}\n\t\tblocks = blocks[:0]\n\t}\n\treturn true, nil\n}\n\nfunc (api *PrivateAdminAPI) Close() {\n\tapi.eth.Stop()\n}\n\n// PublicDebugAPI is the collection of Sero full node APIs exposed\n// over the public debugging endpoint.\ntype PublicDebugAPI struct {\n\tsero *Sero\n}\n\n// NewPublicDebugAPI creates a new API definition for the full node-\n// related public debug methods of the Sero service.\nfunc NewPublicDebugAPI(eth *Sero) *PublicDebugAPI {\n\treturn &PublicDebugAPI{sero: eth}\n}\n\n// DumpBlock retrieves the entire state of the database at a given block.\nfunc (api *PublicDebugAPI) DumpBlock(blockNr rpc.BlockNumber) (state.Dump, error) {\n\tif blockNr == rpc.PendingBlockNumber {\n\t\t// If we're dumping the pending state, we need to request\n\t\t// both the pending block as well as the pending state from\n\t\t// the miner and operate on those\n\t\t_, stateDb := api.sero.miner.Pending()\n\t\treturn stateDb.RawDump(), nil\n\t}\n\tvar block *types.Block\n\tif blockNr == rpc.LatestBlockNumber {\n\t\tblock = api.sero.blockchain.CurrentBlock()\n\t} else {\n\t\tblock = api.sero.blockchain.GetBlockByNumber(uint64(blockNr))\n\t}\n\tif block == nil {\n\t\treturn state.Dump{}, fmt.Errorf(\"block #%d not found\", blockNr)\n\t}\n\tstateDb, err := api.sero.BlockChain().StateAt(block.Header())\n\tif err != nil {\n\t\treturn state.Dump{}, err\n\t}\n\treturn stateDb.RawDump(), nil\n}\n\n// PrivateDebugAPI is the collection of Sero full node APIs exposed over\n// the private debugging endpoint.\ntype PrivateDebugAPI struct {\n\tconfig *params.ChainConfig\n\teth    *Sero\n}\n\n// NewPrivateDebugAPI creates a new API definition for the full node-related\n// private debug methods of the Sero service.\nfunc NewPrivateDebugAPI(config *params.ChainConfig, eth *Sero) *PrivateDebugAPI {\n\treturn &PrivateDebugAPI{config: config, eth: eth}\n}\n\n// Preimage is a debug API function that returns the preimage for a sha3 hash, if known.\nfunc (api *PrivateDebugAPI) Preimage(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) {\n\tif preimage := rawdb.ReadPreimage(api.eth.ChainDb(), hash); preimage != nil {\n\t\treturn preimage, nil\n\t}\n\treturn nil, errors.New(\"unknown preimage\")\n}\n\n// BadBlockArgs represents the entries in the list returned when bad blocks are queried.\ntype BadBlockArgs struct {\n\tHash  common.Hash            `json:\"hash\"`\n\tBlock map[string]interface{} `json:\"block\"`\n\tRLP   string                 `json:\"rlp\"`\n}\n\n// GetBadBlocks returns a list of the last 'bad blocks' that the client has seen on the network\n// and returns them as a JSON list of block-hashes\nfunc (api *PrivateDebugAPI) GetBadBlocks(ctx context.Context) ([]*BadBlockArgs, error) {\n\tblocks := api.eth.BlockChain().BadBlocks()\n\tresults := make([]*BadBlockArgs, len(blocks))\n\n\tvar err error\n\tfor i, block := range blocks {\n\t\tresults[i] = &BadBlockArgs{\n\t\t\tHash: block.Hash(),\n\t\t}\n\t\tif rlpBytes, err := rlp.EncodeToBytes(block); err != nil {\n\t\t\tresults[i].RLP = err.Error() // Hacky, but hey, it works\n\t\t} else {\n\t\t\tresults[i].RLP = fmt.Sprintf(\"0x%x\", rlpBytes)\n\t\t}\n\t\tif results[i].Block, err = ethapi.RPCMarshalBlock(block, true, true); err != nil {\n\t\t\tresults[i].Block = map[string]interface{}{\"error\": err.Error()}\n\t\t}\n\t}\n\treturn results, nil\n}\n\n// StorageRangeResult is the result of a debug_storageRangeAt API call.\ntype StorageRangeResult struct {\n\tStorage storageMap   `json:\"storage\"`\n\tNextKey *common.Hash `json:\"nextKey\"` // nil if Storage includes the last key in the trie.\n}\n\ntype storageMap map[common.Hash]storageEntry\n\ntype storageEntry struct {\n\tKey   *common.Hash `json:\"key\"`\n\tValue common.Hash  `json:\"value\"`\n}\n\n// StorageRangeAt returns the storage at the given block height and transaction index.\nfunc (api *PrivateDebugAPI) StorageRangeAt(ctx context.Context, blockHash common.Hash, txIndex int, contractAddress common.Address, keyStart hexutil.Bytes, maxResult int) (StorageRangeResult, error) {\n\t_, _, statedb, err := api.computeTxEnv(blockHash, txIndex, 0)\n\tif err != nil {\n\t\treturn StorageRangeResult{}, err\n\t}\n\tst := statedb.StorageTrie(contractAddress)\n\tif st == nil {\n\t\treturn StorageRangeResult{}, fmt.Errorf(\"account %x doesn't exist\", contractAddress)\n\t}\n\treturn storageRangeAt(st, keyStart, maxResult)\n}\n\nfunc storageRangeAt(st state.Trie, start []byte, maxResult int) (StorageRangeResult, error) {\n\tit := trie.NewIterator(st.NodeIterator(start))\n\tresult := StorageRangeResult{Storage: storageMap{}}\n\tfor i := 0; i < maxResult && it.Next(); i++ {\n\t\t_, content, _, err := rlp.Split(it.Value)\n\t\tif err != nil {\n\t\t\treturn StorageRangeResult{}, err\n\t\t}\n\t\te := storageEntry{Value: common.BytesToHash(content)}\n\t\tif preimage := st.GetKey(it.Key); preimage != nil {\n\t\t\tpreimage := common.BytesToHash(preimage)\n\t\t\te.Key = &preimage\n\t\t}\n\t\tresult.Storage[common.BytesToHash(it.Key)] = e\n\t}\n\t// Add the 'next key' so clients can continue downloading.\n\tif it.Next() {\n\t\tnext := common.BytesToHash(it.Key)\n\t\tresult.NextKey = &next\n\t}\n\treturn result, nil\n}\n\n// GetModifiedAccountsByNumber returns all accounts that have changed between the\n// two blocks specified. A change is defined as a difference in nonce, balance,\n// code hash, or storage hash.\n//\n// With one parameter, returns the list of accounts modified in the specified block.\nfunc (api *PrivateDebugAPI) GetModifiedAccountsByNumber(startNum uint64, endNum *uint64) ([]common.Address, error) {\n\tvar startBlock, endBlock *types.Block\n\n\tstartBlock = api.eth.blockchain.GetBlockByNumber(startNum)\n\tif startBlock == nil {\n\t\treturn nil, fmt.Errorf(\"start block %x not found\", startNum)\n\t}\n\n\tif endNum == nil {\n\t\tendBlock = startBlock\n\t\tstartBlock = api.eth.blockchain.GetBlockByHash(startBlock.ParentHash())\n\t\tif startBlock == nil {\n\t\t\treturn nil, fmt.Errorf(\"block %x has no parent\", endBlock.Number())\n\t\t}\n\t} else {\n\t\tendBlock = api.eth.blockchain.GetBlockByNumber(*endNum)\n\t\tif endBlock == nil {\n\t\t\treturn nil, fmt.Errorf(\"end block %d not found\", *endNum)\n\t\t}\n\t}\n\treturn api.getModifiedAccounts(startBlock, endBlock)\n}\n\n// GetModifiedAccountsByHash returns all accounts that have changed between the\n// two blocks specified. A change is defined as a difference in nonce, balance,\n// code hash, or storage hash.\n//\n// With one parameter, returns the list of accounts modified in the specified block.\nfunc (api *PrivateDebugAPI) GetModifiedAccountsByHash(startHash common.Hash, endHash *common.Hash) ([]common.Address, error) {\n\tvar startBlock, endBlock *types.Block\n\tstartBlock = api.eth.blockchain.GetBlockByHash(startHash)\n\tif startBlock == nil {\n\t\treturn nil, fmt.Errorf(\"start block %x not found\", startHash)\n\t}\n\n\tif endHash == nil {\n\t\tendBlock = startBlock\n\t\tstartBlock = api.eth.blockchain.GetBlockByHash(startBlock.ParentHash())\n\t\tif startBlock == nil {\n\t\t\treturn nil, fmt.Errorf(\"block %x has no parent\", endBlock.Number())\n\t\t}\n\t} else {\n\t\tendBlock = api.eth.blockchain.GetBlockByHash(*endHash)\n\t\tif endBlock == nil {\n\t\t\treturn nil, fmt.Errorf(\"end block %x not found\", *endHash)\n\t\t}\n\t}\n\treturn api.getModifiedAccounts(startBlock, endBlock)\n}\n\nfunc (api *PrivateDebugAPI) getModifiedAccounts(startBlock, endBlock *types.Block) ([]common.Address, error) {\n\tif startBlock.Number().Uint64() >= endBlock.Number().Uint64() {\n\t\treturn nil, fmt.Errorf(\"start block height (%d) must be less than end block height (%d)\", startBlock.Number().Uint64(), endBlock.Number().Uint64())\n\t}\n\n\toldTrie, err := trie.NewSecure(startBlock.Root(), trie.NewDatabase(api.eth.chainDb), 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnewTrie, err := trie.NewSecure(endBlock.Root(), trie.NewDatabase(api.eth.chainDb), 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdiff, _ := trie.NewDifferenceIterator(oldTrie.NodeIterator([]byte{}), newTrie.NodeIterator([]byte{}))\n\titer := trie.NewIterator(diff)\n\n\tvar dirty []common.Address\n\tfor iter.Next() {\n\t\tkey := newTrie.GetKey(iter.Key)\n\t\tif key == nil {\n\t\t\treturn nil, fmt.Errorf(\"no preimage found for hash %x\", iter.Key)\n\t\t}\n\t\tdirty = append(dirty, common.BytesToAddress(key))\n\t}\n\treturn dirty, nil\n}\n"
  },
  {
    "path": "sero/api_backend.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\n\t\"github.com/sero-cash/go-sero/zero/wallet/exchange\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/miner\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/bloombits\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/sero/gasprice\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/light\"\n)\n\n// SeroAPIBackend implements ethapi.Backend for full nodes\ntype SeroAPIBackend struct {\n\tsero *Sero\n\tgpo  *gasprice.Oracle\n}\n\n// ChainConfig returns the active chain configuration.\nfunc (b *SeroAPIBackend) ChainConfig() *params.ChainConfig {\n\treturn b.sero.chainConfig\n}\n\nfunc (b *SeroAPIBackend) CurrentBlock() *types.Block {\n\treturn b.sero.blockchain.CurrentBlock()\n}\n\nfunc (b *SeroAPIBackend) GetEngin() consensus.Engine {\n\treturn b.sero.engine\n}\n\nfunc (b *SeroAPIBackend) GetMiner() *miner.Miner {\n\treturn b.sero.miner\n}\n\nfunc (b *SeroAPIBackend) SetHead(number uint64) {\n\tb.sero.protocolManager.downloader.Cancel()\n\tb.sero.blockchain.SetHead(number, core.DelFn)\n}\n\nfunc (b *SeroAPIBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) {\n\t// Pending block is only known by the miner\n\tif blockNr == rpc.PendingBlockNumber {\n\t\tblock := b.sero.miner.PendingBlock()\n\t\treturn block.Header(), nil\n\t}\n\t// Otherwise resolve and return the block\n\tif blockNr == rpc.LatestBlockNumber {\n\t\treturn b.sero.blockchain.CurrentBlock().Header(), nil\n\t}\n\treturn b.sero.blockchain.GetHeaderByNumber(uint64(blockNr)), nil\n}\n\nfunc (b *SeroAPIBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {\n\treturn b.sero.blockchain.GetHeaderByHash(hash), nil\n}\n\nfunc (b *SeroAPIBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) {\n\t// Pending block is only known by the miner\n\tif blockNr == rpc.PendingBlockNumber {\n\t\tblock := b.sero.miner.PendingBlock()\n\t\treturn block, nil\n\t}\n\t// Otherwise resolve and return the block\n\tif blockNr == rpc.LatestBlockNumber {\n\t\treturn b.sero.blockchain.CurrentBlock(), nil\n\t}\n\treturn b.sero.blockchain.GetBlockByNumber(uint64(blockNr)), nil\n}\n\nfunc (b *SeroAPIBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) {\n\t// Pending state is only known by the miner\n\tif blockNr == rpc.PendingBlockNumber {\n\t\tblock, state := b.sero.miner.Pending()\n\t\treturn state, block.Header(), nil\n\t}\n\t// Otherwise resolve the block number and return its state\n\theader, err := b.HeaderByNumber(ctx, blockNr)\n\tif header == nil || err != nil {\n\t\treturn nil, nil, err\n\t}\n\tstateDb, err := b.sero.BlockChain().StateAt(header)\n\treturn stateDb, header, err\n}\n\nfunc (b *SeroAPIBackend) GetBlock(ctx context.Context, hash common.Hash) (*types.Block, error) {\n\treturn b.sero.blockchain.GetBlockByHash(hash), nil\n}\n\nfunc (b *SeroAPIBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) {\n\tif number := rawdb.ReadHeaderNumber(b.sero.chainDb, hash); number != nil {\n\t\treturn rawdb.ReadReceipts(b.sero.chainDb, hash, *number), nil\n\t}\n\treturn nil, nil\n}\n\nfunc (b *SeroAPIBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types.Log, error) {\n\tnumber := rawdb.ReadHeaderNumber(b.sero.chainDb, hash)\n\tif number == nil {\n\t\treturn nil, nil\n\t}\n\treceipts := rawdb.ReadReceipts(b.sero.chainDb, hash, *number)\n\tif receipts == nil {\n\t\treturn nil, nil\n\t}\n\tlogs := make([][]*types.Log, len(receipts))\n\tfor i, receipt := range receipts {\n\t\tlogs[i] = receipt.Logs\n\t}\n\treturn logs, nil\n}\n\nfunc (b *SeroAPIBackend) GetTd(blockHash common.Hash) *big.Int {\n\treturn b.sero.blockchain.GetTdByHash(blockHash)\n}\n\nfunc (b *SeroAPIBackend) GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header, vmCfg vm.Config) (*vm.EVM, func() error, error) {\n\tvmError := func() error { return nil }\n\n\tcontext := core.NewEVMContext(msg, header, b.sero.BlockChain(), nil)\n\treturn vm.NewEVM(context, state, b.sero.chainConfig, vmCfg), vmError, nil\n}\n\nfunc (b *SeroAPIBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {\n\treturn b.sero.BlockChain().SubscribeRemovedLogsEvent(ch)\n}\n\nfunc (b *SeroAPIBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription {\n\treturn b.sero.BlockChain().SubscribeChainEvent(ch)\n}\n\nfunc (b *SeroAPIBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription {\n\treturn b.sero.BlockChain().SubscribeChainHeadEvent(ch)\n}\n\nfunc (b *SeroAPIBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription {\n\treturn b.sero.BlockChain().SubscribeChainSideEvent(ch)\n}\n\nfunc (b *SeroAPIBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {\n\treturn b.sero.BlockChain().SubscribeLogsEvent(ch)\n}\n\nfunc (b *SeroAPIBackend) SendTx(ctx context.Context, signedTx *types.Transaction) error {\n\treturn b.sero.txPool.AddLocal(signedTx)\n}\n\nfunc (b *SeroAPIBackend) GetPoolTransactions() (types.Transactions, error) {\n\tpending, err := b.sero.txPool.Pending()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn pending, nil\n}\n\nfunc (b *SeroAPIBackend) GetPoolTransaction(hash common.Hash) *types.Transaction {\n\treturn b.sero.txPool.Get(hash)\n}\n\n//func (b *SeroAPIBackend) GetPoolNonce(ctx context.Context, addr common.Data) (uint64, error) {\n//\treturn b.sero.txPool.State().GetNonce(addr), nil\n//}\n\nfunc (b *SeroAPIBackend) Stats() (pending int, queued int, all int, total int) {\n\treturn b.sero.txPool.Stats()\n}\n\nfunc (b *SeroAPIBackend) TxPoolContent() (types.Transactions, types.Transactions, types.Transactions) {\n\treturn b.sero.TxPool().Content()\n}\n\nfunc (b *SeroAPIBackend) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription {\n\treturn b.sero.TxPool().SubscribeNewTxsEvent(ch)\n}\n\nfunc (b *SeroAPIBackend) Downloader() *downloader.Downloader {\n\treturn b.sero.Downloader()\n}\n\nfunc (b *SeroAPIBackend) ProtocolVersion() int {\n\treturn b.sero.EthVersion()\n}\n\nfunc (b *SeroAPIBackend) PeerCount() uint {\n\treturn uint(b.sero.netRPCService.PeerCount())\n}\n\nfunc (b *SeroAPIBackend) SuggestPrice(ctx context.Context) (*big.Int, error) {\n\treturn b.gpo.SuggestPrice(ctx)\n}\n\nfunc (b *SeroAPIBackend) ChainDb() serodb.Database {\n\treturn b.sero.ChainDb()\n}\n\nfunc (b *SeroAPIBackend) EventMux() *event.TypeMux {\n\treturn b.sero.EventMux()\n}\n\nfunc (b *SeroAPIBackend) AccountManager() *accounts.Manager {\n\treturn b.sero.AccountManager()\n}\n\nfunc (b *SeroAPIBackend) BloomStatus() (uint64, uint64) {\n\tsections, _, _ := b.sero.bloomIndexer.Sections()\n\treturn params.BloomBitsBlocks, sections\n}\n\nfunc (b *SeroAPIBackend) ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) {\n\tfor i := 0; i < bloomFilterThreads; i++ {\n\t\tgo session.Multiplex(bloomRetrievalBatch, bloomRetrievalWait, b.sero.bloomRequests)\n\t}\n}\n\nfunc (b *SeroAPIBackend) GetBlocksInfo(start uint64, count uint64) ([]txtool.Block, error) {\n\treturn flight.SRI_Inst.GetBlocksInfo(start, count)\n\n}\nfunc (b *SeroAPIBackend) GetAnchor(roots []c_type.Uint256) ([]txtool.Witness, error) {\n\treturn flight.SRI_Inst.GetAnchor(roots)\n}\n\nfunc (b *SeroAPIBackend) commitTx(tx *txtool.GTx) error {\n\tdifference := time.Now().Unix() - b.CurrentBlock().Time().Int64()\n\tif difference > 10*60 {\n\t\treturn errors.New(\"The current chain is too behind\")\n\t}\n\tgasPrice := big.Int(tx.GasPrice)\n\tgas := uint64(tx.Gas)\n\tsignedTx := types.NewTxWithGTx(gas, &gasPrice, &tx.Tx)\n\tlog.Info(\"commitTx\", \"txhash\", signedTx.Hash().String())\n\terr := b.sero.txPool.AddLocal(signedTx)\n\tif err != nil {\n\t\tlog.Info(\"commitTx\", \"txHash\", signedTx.Hash().String(), \"err\", err)\n\t}\n\treturn err\n}\n\nfunc (b *SeroAPIBackend) CommitTx(tx *txtool.GTx) error {\n\n\terr := b.sero.backup.PutCommittedTx(tx)\n\tif err != nil {\n\t\tlog.Info(\"commitTx save to db err\", \"err\", err)\n\t\treturn err\n\t}\n\treturn b.commitTx(tx)\n\n}\n\nfunc (b *SeroAPIBackend) GetCommittedTx(txHash c_type.Uint256) (*txtool.GTx, error) {\n\treturn b.sero.backup.GetCommittedTx(txHash)\n\n}\nfunc (b *SeroAPIBackend) ReSendCommittedTx(txHash c_type.Uint256) error {\n\tgtx, err := b.sero.backup.GetCommittedTx(txHash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn b.commitTx(gtx)\n}\n\nfunc (b *SeroAPIBackend) GetPkNumber(pk c_type.Uint512) (number uint64, e error) {\n\tif b.sero.exchange == nil {\n\t\te = errors.New(\"not start exchange\")\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetCurrencyNumber(pk), nil\n}\n\nfunc (b *SeroAPIBackend) GetPkr(pk *c_type.Uint512, index *c_type.Uint256) (pkr c_type.PKr, e error) {\n\tif b.sero.exchange == nil {\n\t\te = errors.New(\"not start exchange\")\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetPkr(pk, index)\n}\n\nfunc (b *SeroAPIBackend) GetLockedBalances(pk c_type.Uint512) (balances map[string]*big.Int) {\n\tif b.sero.exchange == nil {\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetLockedBalances(pk)\n}\n\nfunc (b *SeroAPIBackend) GetMaxAvailable(pk c_type.Uint512, currency string) (amount *big.Int) {\n\tif b.sero.exchange == nil {\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetMaxAvailable(pk, currency)\n}\n\nfunc (b *SeroAPIBackend) GetBalances(pk c_type.Uint512) (balances map[string]*big.Int, tickets map[string][]*common.Hash) {\n\tif b.sero.exchange == nil {\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetBalances(pk)\n}\n\nfunc (b *SeroAPIBackend) GenTx(param prepare.PreTxParam) (txParam *txtool.GTxParam, e error) {\n\tif b.sero.exchange == nil {\n\t\te = errors.New(\"not start exchange\")\n\t\treturn\n\t}\n\treturn b.sero.exchange.GenTx(param)\n}\n\nfunc (b *SeroAPIBackend) GetRecordsByPkr(pkr c_type.PKr, begin, end uint64) (records []exchange.Utxo, err error) {\n\tif b.sero.exchange == nil {\n\t\terr = errors.New(\"not start exchange\")\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetRecordsByPkr(pkr, begin, end)\n}\n\nfunc (b *SeroAPIBackend) GetRecordsByPk(pk *c_type.Uint512, begin, end uint64) (records []exchange.Utxo, err error) {\n\tif b.sero.exchange == nil {\n\t\terr = errors.New(\"not start exchange\")\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetRecordsByPk(pk, begin, end)\n}\n\nfunc (b *SeroAPIBackend) GetRecordsByTxHash(txHash c_type.Uint256) (records []exchange.Utxo, err error) {\n\tif b.sero.exchange == nil {\n\t\terr = errors.New(\"not start exchange\")\n\t\treturn\n\t}\n\treturn b.sero.exchange.GetRecordsByTxHash(txHash)\n}\n\nfunc (b *SeroAPIBackend) GetOutByPKr(pkrs []c_type.PKr, start uint64, end *uint64) (br light.BlockOutResp, e error) {\n\tif b.sero.lightNode == nil {\n\t\te = errors.New(\"not start light\")\n\t\treturn\n\t}\n\treturn b.sero.lightNode.GetOutsByPKr(pkrs, start, end)\n}\n\nfunc (b *SeroAPIBackend) CheckNil(Nils []c_type.Uint256) (nilResps []light.NilValue, e error) {\n\tif b.sero.lightNode == nil {\n\t\te = errors.New(\"not start light\")\n\t\treturn\n\t}\n\treturn b.sero.lightNode.CheckNil(Nils)\n}\n"
  },
  {
    "path": "sero/api_tracer.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"math\"\n\t\"runtime\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/internal/ethapi\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/sero/tracers\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\nconst (\n\t// defaultTraceTimeout is the amount of time a single transaction can execute\n\t// by default before being forcefully aborted.\n\tdefaultTraceTimeout = 5 * time.Second\n\n\t// defaultTraceReexec is the number of blocks the tracer is willing to go back\n\t// and reexecute to produce missing historical state necessary to run a specific\n\t// trace.\n\tdefaultTraceReexec = uint64(128)\n)\n\n// TraceConfig holds extra parameters to trace functions.\ntype TraceConfig struct {\n\t*vm.LogConfig\n\tTracer  *string\n\tTimeout *string\n\tReexec  *uint64\n}\n\n// txTraceResult is the result of a single transaction trace.\ntype txTraceResult struct {\n\tResult interface{} `json:\"result,omitempty\"` // Trace results produced by the tracer\n\tError  string      `json:\"error,omitempty\"`  // Trace failure produced by the tracer\n}\n\n// blockTraceTask represents a single block trace task when an entire chain is\n// being traced.\ntype blockTraceTask struct {\n\tstatedb *state.StateDB   // Intermediate state prepped for tracing\n\tblock   *types.Block     // Block to trace the transactions from\n\trootref common.Hash      // Trie root reference held for this task\n\tresults []*txTraceResult // Trace results procudes by the task\n}\n\n// blockTraceResult represets the results of tracing a single block when an entire\n// chain is being traced.\ntype blockTraceResult struct {\n\tBlock  hexutil.Uint64   `json:\"block\"`  // Block number corresponding to this trace\n\tHash   common.Hash      `json:\"hash\"`   // Block hash corresponding to this trace\n\tTraces []*txTraceResult `json:\"traces\"` // Trace results produced by the task\n}\n\n// txTraceTask represents a single transaction trace task when an entire block\n// is being traced.\ntype txTraceTask struct {\n\tstatedb *state.StateDB // Intermediate state prepped for tracing\n\tindex   int            // Transaction offset in the block\n}\n\n// TraceChain returns the structured logs created during the execution of EVM\n// between two blocks (excluding start) and returns them as a JSON object.\nfunc (api *PrivateDebugAPI) TraceChain(ctx context.Context, start, end rpc.BlockNumber, config *TraceConfig) (*rpc.Subscription, error) {\n\t// Fetch the block interval that we want to trace\n\tvar from, to *types.Block\n\n\tswitch start {\n\tcase rpc.PendingBlockNumber:\n\t\tfrom = api.eth.miner.PendingBlock()\n\tcase rpc.LatestBlockNumber:\n\t\tfrom = api.eth.blockchain.CurrentBlock()\n\tdefault:\n\t\tfrom = api.eth.blockchain.GetBlockByNumber(uint64(start))\n\t}\n\tswitch end {\n\tcase rpc.PendingBlockNumber:\n\t\tto = api.eth.miner.PendingBlock()\n\tcase rpc.LatestBlockNumber:\n\t\tto = api.eth.blockchain.CurrentBlock()\n\tdefault:\n\t\tto = api.eth.blockchain.GetBlockByNumber(uint64(end))\n\t}\n\t// Trace the chain if we've found all our blocks\n\tif from == nil {\n\t\treturn nil, fmt.Errorf(\"starting block #%d not found\", start)\n\t}\n\tif to == nil {\n\t\treturn nil, fmt.Errorf(\"end block #%d not found\", end)\n\t}\n\treturn api.traceChain(ctx, from, to, config)\n}\n\n// traceChain configures a new tracer according to the provided configuration, and\n// executes all the transactions contained within. The return value will be one item\n// per transaction, dependent on the requestd tracer.\nfunc (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Block, config *TraceConfig) (*rpc.Subscription, error) {\n\t// Tracing a chain is a **long** operation, only do with subscriptions\n\tnotifier, supported := rpc.NotifierFromContext(ctx)\n\tif !supported {\n\t\treturn &rpc.Subscription{}, rpc.ErrNotificationsUnsupported\n\t}\n\tsub := notifier.CreateSubscription()\n\n\t// Ensure we have a valid starting state before doing any work\n\torigin := start.NumberU64()\n\tdatabase := state.NewDatabase(api.eth.ChainDb())\n\n\tif number := start.NumberU64(); number > 0 {\n\t\tstart = api.eth.blockchain.GetBlock(start.ParentHash(), start.NumberU64()-1)\n\t\tif start == nil {\n\t\t\treturn nil, fmt.Errorf(\"parent block #%d not found\", number-1)\n\t\t}\n\t}\n\tstatedb, err := state.New(database, start.Header())\n\tif err != nil {\n\t\t// If the starting state is missing, allow some number of blocks to be reexecuted\n\t\treexec := defaultTraceReexec\n\t\tif config != nil && config.Reexec != nil {\n\t\t\treexec = *config.Reexec\n\t\t}\n\t\t// Find the most recent block that has the state available\n\t\tfor i := uint64(0); i < reexec; i++ {\n\t\t\tstart = api.eth.blockchain.GetBlock(start.ParentHash(), start.NumberU64()-1)\n\t\t\tif start == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif statedb, err = state.New(database, start.Header()); err == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// If we still don't have the state available, bail out\n\t\tif err != nil {\n\t\t\tswitch err.(type) {\n\t\t\tcase *trie.MissingNodeError:\n\t\t\t\treturn nil, errors.New(\"required historical state unavailable\")\n\t\t\tdefault:\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t}\n\t// Execute all the transaction contained within the chain concurrently for each block\n\tblocks := int(end.NumberU64() - origin)\n\n\tthreads := runtime.NumCPU()\n\tif threads > blocks {\n\t\tthreads = blocks\n\t}\n\tvar (\n\t\tpend    = new(sync.WaitGroup)\n\t\ttasks   = make(chan *blockTraceTask, threads)\n\t\tresults = make(chan *blockTraceTask, threads)\n\t)\n\tfor th := 0; th < threads; th++ {\n\t\tpend.Add(1)\n\t\tgo func() {\n\t\t\tdefer pend.Done()\n\n\t\t\t// Fetch and execute the next block trace tasks\n\t\t\tfor task := range tasks {\n\t\t\t\t//abi := types.MakeSigner(api.config, task.block.Number())\n\n\t\t\t\t// Trace all the transactions contained within\n\t\t\t\tfor i, tx := range task.block.Transactions() {\n\t\t\t\t\tmsg, _ := tx.AsMessage()\n\t\t\t\t\tvmctx := core.NewEVMContext(msg, task.block.Header(), api.eth.blockchain, nil)\n\n\t\t\t\t\tres, err := api.traceTx(ctx, msg, vmctx, task.statedb, config)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\ttask.results[i] = &txTraceResult{Error: err.Error()}\n\t\t\t\t\t\tlog.Warn(\"Tracing failed\", \"hash\", tx.Hash(), \"block\", task.block.NumberU64(), \"err\", err)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\ttask.statedb.Finalise(true)\n\t\t\t\t\ttask.results[i] = &txTraceResult{Result: res}\n\t\t\t\t}\n\t\t\t\t// Stream the result back to the user or abort on teardown\n\t\t\t\tselect {\n\t\t\t\tcase results <- task:\n\t\t\t\tcase <-notifier.Closed():\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n\t// Start a goroutine to feed all the blocks into the tracers\n\tbegin := time.Now()\n\n\tgo func() {\n\t\tvar (\n\t\t\tlogged time.Time\n\t\t\tnumber uint64\n\t\t\ttraced uint64\n\t\t\tfailed error\n\t\t\tproot  common.Hash\n\t\t)\n\t\t// Ensure everything is properly cleaned up on any exit path\n\t\tdefer func() {\n\t\t\tclose(tasks)\n\t\t\tpend.Wait()\n\n\t\t\tswitch {\n\t\t\tcase failed != nil:\n\t\t\t\tlog.Warn(\"Chain tracing failed\", \"start\", start.NumberU64(), \"end\", end.NumberU64(), \"transactions\", traced, \"elapsed\", time.Since(begin), \"err\", failed)\n\t\t\tcase number < end.NumberU64():\n\t\t\t\tlog.Warn(\"Chain tracing aborted\", \"start\", start.NumberU64(), \"end\", end.NumberU64(), \"abort\", number, \"transactions\", traced, \"elapsed\", time.Since(begin))\n\t\t\tdefault:\n\t\t\t\tlog.Info(\"Chain tracing finished\", \"start\", start.NumberU64(), \"end\", end.NumberU64(), \"transactions\", traced, \"elapsed\", time.Since(begin))\n\t\t\t}\n\t\t\tclose(results)\n\t\t}()\n\t\t// Feed all the blocks both into the tracer, as well as fast process concurrently\n\t\tfor number = start.NumberU64() + 1; number <= end.NumberU64(); number++ {\n\t\t\t// Stop tracing if interruption was requested\n\t\t\tselect {\n\t\t\tcase <-notifier.Closed():\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t}\n\t\t\t// Print progress logs if long enough time elapsed\n\t\t\tif time.Since(logged) > 8*time.Second {\n\t\t\t\tif number > origin {\n\t\t\t\t\tnodes, imgs := database.TrieDB().Size()\n\t\t\t\t\tlog.Info(\"Tracing chain segment\", \"start\", origin, \"end\", end.NumberU64(), \"current\", number, \"transactions\", traced, \"elapsed\", time.Since(begin), \"memory\", nodes+imgs)\n\t\t\t\t} else {\n\t\t\t\t\tlog.Info(\"Preparing state for chain trace\", \"block\", number, \"start\", origin, \"elapsed\", time.Since(begin))\n\t\t\t\t}\n\t\t\t\tlogged = time.Now()\n\t\t\t}\n\t\t\t// Retrieve the next block to trace\n\t\t\tblock := api.eth.blockchain.GetBlockByNumber(number)\n\t\t\tif block == nil {\n\t\t\t\tfailed = fmt.Errorf(\"block #%d not found\", number)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Send the block over to the concurrent tracers (if not in the fast-forward phase)\n\t\t\tif number > origin {\n\t\t\t\ttxs := block.Transactions()\n\n\t\t\t\tselect {\n\t\t\t\tcase tasks <- &blockTraceTask{statedb: statedb.Copy(), block: block, rootref: proot, results: make([]*txTraceResult, len(txs))}:\n\t\t\t\tcase <-notifier.Closed():\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\ttraced += uint64(len(txs))\n\t\t\t}\n\t\t\t// Generate the next state snapshot fast without tracing\n\t\t\t_, _, _, err := api.eth.blockchain.Processor().Process(block, statedb, vm.Config{})\n\t\t\tif err != nil {\n\t\t\t\tfailed = err\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Finalize the state so any modifications are written to the trie\n\t\t\troot, err := statedb.Commit(true)\n\t\t\tif err != nil {\n\t\t\t\tfailed = err\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif err := statedb.Reset(root); err != nil {\n\t\t\t\tfailed = err\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Reference the trie twice, once for us, once for the trancer\n\t\t\tdatabase.TrieDB().Reference(root, common.Hash{})\n\t\t\tif number >= origin {\n\t\t\t\tdatabase.TrieDB().Reference(root, common.Hash{})\n\t\t\t}\n\t\t\t// Dereference all past tries we ourselves are done working with\n\t\t\tdatabase.TrieDB().Dereference(proot)\n\t\t\tproot = root\n\n\t\t\t// TODO(karalabe): Do we need the preimages? Won't they accumulate too much?\n\t\t}\n\t}()\n\n\t// Keep reading the trace results and stream the to the user\n\tgo func() {\n\t\tvar (\n\t\t\tdone = make(map[uint64]*blockTraceResult)\n\t\t\tnext = origin + 1\n\t\t)\n\t\tfor res := range results {\n\t\t\t// Queue up next received result\n\t\t\tresult := &blockTraceResult{\n\t\t\t\tBlock:  hexutil.Uint64(res.block.NumberU64()),\n\t\t\t\tHash:   res.block.Hash(),\n\t\t\t\tTraces: res.results,\n\t\t\t}\n\t\t\tdone[uint64(result.Block)] = result\n\n\t\t\t// Dereference any paret tries held in memory by this task\n\t\t\tdatabase.TrieDB().Dereference(res.rootref)\n\n\t\t\t// Stream completed traces to the user, aborting on the first error\n\t\t\tfor result, ok := done[next]; ok; result, ok = done[next] {\n\t\t\t\tif len(result.Traces) > 0 || next == end.NumberU64() {\n\t\t\t\t\tnotifier.Notify(sub.ID, result)\n\t\t\t\t}\n\t\t\t\tdelete(done, next)\n\t\t\t\tnext++\n\t\t\t}\n\t\t}\n\t}()\n\treturn sub, nil\n}\n\n// TraceBlockByNumber returns the structured logs created during the execution of\n// EVM and returns them as a JSON object.\nfunc (api *PrivateDebugAPI) TraceBlockByNumber(ctx context.Context, number rpc.BlockNumber, config *TraceConfig) ([]*txTraceResult, error) {\n\t// Fetch the block that we want to trace\n\tvar block *types.Block\n\n\tswitch number {\n\tcase rpc.PendingBlockNumber:\n\t\tblock = api.eth.miner.PendingBlock()\n\tcase rpc.LatestBlockNumber:\n\t\tblock = api.eth.blockchain.CurrentBlock()\n\tdefault:\n\t\tblock = api.eth.blockchain.GetBlockByNumber(uint64(number))\n\t}\n\t// Trace the block if it was found\n\tif block == nil {\n\t\treturn nil, fmt.Errorf(\"block #%d not found\", number)\n\t}\n\treturn api.traceBlock(ctx, block, config)\n}\n\n// TraceBlockByHash returns the structured logs created during the execution of\n// EVM and returns them as a JSON object.\nfunc (api *PrivateDebugAPI) TraceBlockByHash(ctx context.Context, hash common.Hash, config *TraceConfig) ([]*txTraceResult, error) {\n\tblock := api.eth.blockchain.GetBlockByHash(hash)\n\tif block == nil {\n\t\treturn nil, fmt.Errorf(\"block #%x not found\", hash)\n\t}\n\treturn api.traceBlock(ctx, block, config)\n}\n\n// TraceBlock returns the structured logs created during the execution of EVM\n// and returns them as a JSON object.\nfunc (api *PrivateDebugAPI) TraceBlock(ctx context.Context, blob []byte, config *TraceConfig) ([]*txTraceResult, error) {\n\tblock := new(types.Block)\n\tif err := rlp.Decode(bytes.NewReader(blob), block); err != nil {\n\t\treturn nil, fmt.Errorf(\"could not decode block: %v\", err)\n\t}\n\treturn api.traceBlock(ctx, block, config)\n}\n\n// TraceBlockFromFile returns the structured logs created during the execution of\n// EVM and returns them as a JSON object.\nfunc (api *PrivateDebugAPI) TraceBlockFromFile(ctx context.Context, file string, config *TraceConfig) ([]*txTraceResult, error) {\n\tblob, err := ioutil.ReadFile(file)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"could not read file: %v\", err)\n\t}\n\treturn api.TraceBlock(ctx, blob, config)\n}\n\n// traceBlock configures a new tracer according to the provided configuration, and\n// executes all the transactions contained within. The return value will be one item\n// per transaction, dependent on the requestd tracer.\nfunc (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, config *TraceConfig) ([]*txTraceResult, error) {\n\t// Create the parent state database\n\tif err := api.eth.engine.VerifyHeader(api.eth.blockchain, block.Header(), true); err != nil {\n\t\treturn nil, err\n\t}\n\tparent := api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1)\n\tif parent == nil {\n\t\treturn nil, fmt.Errorf(\"parent %x not found\", block.ParentHash())\n\t}\n\treexec := defaultTraceReexec\n\tif config != nil && config.Reexec != nil {\n\t\treexec = *config.Reexec\n\t}\n\tstatedb, err := api.computeStateDB(parent, reexec)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Execute all the transaction contained within the block concurrently\n\tvar (\n\t\t//abi = types.MakeSigner(api.config, block.Number())\n\n\t\ttxs     = block.Transactions()\n\t\tresults = make([]*txTraceResult, len(txs))\n\n\t\tpend = new(sync.WaitGroup)\n\t\tjobs = make(chan *txTraceTask, len(txs))\n\t)\n\tthreads := runtime.NumCPU()\n\tif threads > len(txs) {\n\t\tthreads = len(txs)\n\t}\n\tfor th := 0; th < threads; th++ {\n\t\tpend.Add(1)\n\t\tgo func() {\n\t\t\tdefer pend.Done()\n\n\t\t\t// Fetch and execute the next transaction trace tasks\n\t\t\tfor task := range jobs {\n\t\t\t\tmsg, _ := txs[task.index].AsMessage()\n\t\t\t\tvmctx := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil)\n\n\t\t\t\tres, err := api.traceTx(ctx, msg, vmctx, task.statedb, config)\n\t\t\t\tif err != nil {\n\t\t\t\t\tresults[task.index] = &txTraceResult{Error: err.Error()}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tresults[task.index] = &txTraceResult{Result: res}\n\t\t\t}\n\t\t}()\n\t}\n\t// Feed the transactions into the tracers and return\n\tvar failed error\n\tfor i, tx := range txs {\n\t\t// Send the trace task over for execution\n\t\tjobs <- &txTraceTask{statedb: statedb.Copy(), index: i}\n\n\t\t// Generate the next state snapshot fast without tracing\n\t\tmsg, _ := tx.AsMessage()\n\t\tvmctx := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil)\n\n\t\tvmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{})\n\t\tif _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(math.MaxUint64)); err != nil {\n\t\t\tfailed = err\n\t\t\tbreak\n\t\t}\n\t\t// Finalize the state so any modifications are written to the trie\n\t\tstatedb.Finalise(true)\n\t}\n\tclose(jobs)\n\tpend.Wait()\n\n\t// If execution failed in between, abort\n\tif failed != nil {\n\t\treturn nil, failed\n\t}\n\treturn results, nil\n}\n\n// computeStateDB retrieves the state database associated with a certain block.\n// If no state is locally available for the given block, a number of blocks are\n// attempted to be reexecuted to generate the desired state.\nfunc (api *PrivateDebugAPI) computeStateDB(block *types.Block, reexec uint64) (*state.StateDB, error) {\n\t// If we have the state fully available, use that\n\tstatedb, err := api.eth.blockchain.StateAt(block.Header())\n\tif err == nil {\n\t\treturn statedb, nil\n\t}\n\t// Otherwise try to reexec blocks until we find a state or reach our limit\n\torigin := block.NumberU64()\n\tdatabase := state.NewDatabase(api.eth.ChainDb())\n\n\tfor i := uint64(0); i < reexec; i++ {\n\t\tblock = api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1)\n\t\tif block == nil {\n\t\t\tbreak\n\t\t}\n\t\tif statedb, err = state.New(database, block.Header()); err == nil {\n\t\t\tbreak\n\t\t}\n\t}\n\tif err != nil {\n\t\tswitch err.(type) {\n\t\tcase *trie.MissingNodeError:\n\t\t\treturn nil, errors.New(\"required historical state unavailable\")\n\t\tdefault:\n\t\t\treturn nil, err\n\t\t}\n\t}\n\t// State was available at historical point, regenerate\n\tvar (\n\t\tstart  = time.Now()\n\t\tlogged time.Time\n\t\tproot  common.Hash\n\t)\n\tfor block.NumberU64() < origin {\n\t\t// Print progress logs if long enough time elapsed\n\t\tif time.Since(logged) > 8*time.Second {\n\t\t\tlog.Info(\"Regenerating historical state\", \"block\", block.NumberU64()+1, \"target\", origin, \"elapsed\", time.Since(start))\n\t\t\tlogged = time.Now()\n\t\t}\n\t\t// Retrieve the next block to regenerate and process it\n\t\tif block = api.eth.blockchain.GetBlockByNumber(block.NumberU64() + 1); block == nil {\n\t\t\treturn nil, fmt.Errorf(\"block #%d not found\", block.NumberU64()+1)\n\t\t}\n\t\t_, _, _, err := api.eth.blockchain.Processor().Process(block, statedb, vm.Config{})\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// Finalize the state so any modifications are written to the trie\n\t\troot, err := statedb.Commit(true)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif err := statedb.Reset(root); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdatabase.TrieDB().Reference(root, common.Hash{})\n\t\tdatabase.TrieDB().Dereference(proot)\n\t\tproot = root\n\t}\n\tnodes, imgs := database.TrieDB().Size()\n\tlog.Info(\"Historical state regenerated\", \"block\", block.NumberU64(), \"elapsed\", time.Since(start), \"nodes\", nodes, \"preimages\", imgs)\n\treturn statedb, nil\n}\n\n// TraceTransaction returns the structured logs created during the execution of EVM\n// and returns them as a JSON object.\nfunc (api *PrivateDebugAPI) TraceTransaction(ctx context.Context, hash common.Hash, config *TraceConfig) (interface{}, error) {\n\t// Retrieve the transaction and assemble its EVM context\n\ttx, blockHash, _, index := rawdb.ReadTransaction(api.eth.ChainDb(), hash)\n\tif tx == nil {\n\t\treturn nil, fmt.Errorf(\"transaction %x not found\", hash)\n\t}\n\treexec := defaultTraceReexec\n\tif config != nil && config.Reexec != nil {\n\t\treexec = *config.Reexec\n\t}\n\tmsg, vmctx, statedb, err := api.computeTxEnv(blockHash, int(index), reexec)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Trace the transaction and return\n\treturn api.traceTx(ctx, msg, vmctx, statedb, config)\n}\n\n// traceTx configures a new tracer according to the provided configuration, and\n// executes the given message in the provided environment. The return value will\n// be tracer dependent.\nfunc (api *PrivateDebugAPI) traceTx(ctx context.Context, message core.Message, vmctx vm.Context, statedb *state.StateDB, config *TraceConfig) (interface{}, error) {\n\t// Assemble the structured logger or the JavaScript tracer\n\tvar (\n\t\ttracer vm.Tracer\n\t\terr    error\n\t)\n\tswitch {\n\tcase config != nil && config.Tracer != nil:\n\t\t// Define a meaningful timeout of a single transaction trace\n\t\ttimeout := defaultTraceTimeout\n\t\tif config.Timeout != nil {\n\t\t\tif timeout, err = time.ParseDuration(*config.Timeout); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\t// Constuct the JavaScript tracer to execute with\n\t\tif tracer, err = tracers.New(*config.Tracer); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// Handle timeouts and RPC cancellations\n\t\tdeadlineCtx, cancel := context.WithTimeout(ctx, timeout)\n\t\tgo func() {\n\t\t\t<-deadlineCtx.Done()\n\t\t\ttracer.(*tracers.Tracer).Stop(errors.New(\"execution timeout\"))\n\t\t}()\n\t\tdefer cancel()\n\n\tcase config == nil:\n\t\ttracer = vm.NewStructLogger(nil)\n\n\tdefault:\n\t\ttracer = vm.NewStructLogger(config.LogConfig)\n\t}\n\t// Run the transaction with tracing enabled.\n\tvmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{Debug: true, Tracer: tracer})\n\n\tret, gas, failed, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(math.MaxUint64))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"tracing failed: %v\", err)\n\t}\n\t// Depending on the tracer type, format and return the output\n\tswitch tracer := tracer.(type) {\n\tcase *vm.StructLogger:\n\t\treturn &ethapi.ExecutionResult{\n\t\t\tGas:         gas,\n\t\t\tFailed:      failed,\n\t\t\tReturnValue: fmt.Sprintf(\"%x\", ret),\n\t\t\tStructLogs:  ethapi.FormatLogs(tracer.StructLogs()),\n\t\t}, nil\n\n\tcase *tracers.Tracer:\n\t\treturn tracer.GetResult()\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"bad tracer type %T\", tracer))\n\t}\n}\n\n// computeTxEnv returns the execution environment of a certain transaction.\nfunc (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, reexec uint64) (core.Message, vm.Context, *state.StateDB, error) {\n\t// Create the parent state database\n\tblock := api.eth.blockchain.GetBlockByHash(blockHash)\n\tif block == nil {\n\t\treturn nil, vm.Context{}, nil, fmt.Errorf(\"block %x not found\", blockHash)\n\t}\n\tparent := api.eth.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1)\n\tif parent == nil {\n\t\treturn nil, vm.Context{}, nil, fmt.Errorf(\"parent %x not found\", block.ParentHash())\n\t}\n\tstatedb, err := api.computeStateDB(parent, reexec)\n\tif err != nil {\n\t\treturn nil, vm.Context{}, nil, err\n\t}\n\t// Recompute transactions up to the target index.\n\t//abi := types.MakeSigner(api.config, block.Number())\n\n\tfor idx, tx := range block.Transactions() {\n\t\t// Assemble the transaction call message and return if the requested offset\n\t\tmsg, _ := tx.AsMessage()\n\t\tcontext := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil)\n\t\tif idx == txIndex {\n\t\t\treturn msg, context, statedb, nil\n\t\t}\n\t\tvar gaslimit uint64\n\t\tif gas, e := statedb.GetTxGasLimit(tx); e != nil {\n\t\t\treturn nil, vm.Context{}, nil, e\n\t\t} else {\n\t\t\tgaslimit = gas\n\t\t}\n\t\t// Not yet the searched for transaction, execute on top of the current state\n\t\tvmenv := vm.NewEVM(context, statedb, api.config, vm.Config{})\n\t\tif _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(gaslimit)); err != nil {\n\t\t\treturn nil, vm.Context{}, nil, fmt.Errorf(\"tx %x failed: %v\", tx.Hash(), err)\n\t\t}\n\t\t// Ensure any modifications are committed to the state\n\t\tstatedb.Finalise(true)\n\t}\n\treturn nil, vm.Context{}, nil, fmt.Errorf(\"tx index %d out of range for block %x\", txIndex, blockHash)\n}\n"
  },
  {
    "path": "sero/backend.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package sero implements the Sero protocol.\npackage sero\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-sero/zero/wallet/stakeservice\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/voter\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-sero/internal/ethapi\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/exchange\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/bloombits\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/miner\"\n\t\"github.com/sero-cash/go-sero/node\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/sero/filters\"\n\t\"github.com/sero-cash/go-sero/sero/gasprice\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/light\"\n)\n\ntype LesServer interface {\n\tStart(srvr *p2p.Server)\n\tStop()\n\tProtocols() []p2p.Protocol\n\tSetBloomBitsIndexer(bbIndexer *core.ChainIndexer)\n}\n\n// Sero implements the Sero full node service.\ntype Sero struct {\n\tconfig      *Config\n\tchainConfig *params.ChainConfig\n\n\t// Channel for shutting down the service\n\tshutdownChan chan bool // Channel for shutting down the Sero\n\n\t// Handlers\n\ttxPool          *core.TxPool\n\tvoter           *voter.Voter\n\tblockchain      *core.BlockChain\n\texchange        *exchange.Exchange\n\tlightNode       *light.LightNode\n\tbackup          *Backup\n\tprotocolManager *ProtocolManager\n\tlesServer       LesServer\n\n\t// DB interfaces\n\tchainDb serodb.Database // Block chain database\n\n\teventMux       *event.TypeMux\n\tengine         consensus.Engine\n\taccountManager *accounts.Manager\n\n\tbloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests\n\tbloomIndexer  *core.ChainIndexer             // Bloom indexer operating during block imports\n\n\tAPIBackend *SeroAPIBackend\n\n\tminer    *miner.Miner\n\tgasPrice *big.Int\n\tserobase accounts.Account\n\n\tnetworkID     uint64\n\tnetRPCService *ethapi.PublicNetAPI\n\n\tlock sync.RWMutex // Protects the variadic fields (s.g. gas price and serobase)\n\twg   sync.WaitGroup\n}\n\nfunc (s *Sero) AddLesServer(ls LesServer) {\n\ts.lesServer = ls\n\tls.SetBloomBitsIndexer(s.bloomIndexer)\n}\n\nvar SeroInstance *Sero\n\n// New creates a new Sero object (including the\n// initialisation of the common Sero object)\nfunc New(ctx *node.ServiceContext, config *Config) (*Sero, error) {\n\tif config.SyncMode == downloader.LightSync {\n\t\treturn nil, errors.New(\"can't run sero.Sero in light sync mode, use les.LightEthereum\")\n\t}\n\tif !config.SyncMode.IsValid() {\n\t\treturn nil, fmt.Errorf(\"invalid sync mode %d\", config.SyncMode)\n\t}\n\tchainDb, err := CreateDB(ctx, config, \"chaindata\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tchainConfig, genesisHash, genesisErr := core.SetupGenesisBlock(chainDb, config.Genesis)\n\tif _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok {\n\t\treturn nil, genesisErr\n\t}\n\tlog.Info(\"Initialised chain configuration\", \"config\", chainConfig)\n\n\tsero := &Sero{\n\t\tconfig:         config,\n\t\tchainDb:        chainDb,\n\t\tchainConfig:    chainConfig,\n\t\teventMux:       ctx.EventMux,\n\t\taccountManager: ctx.AccountManager,\n\t\tengine:         CreateConsensusEngine(ctx, &config.Ethash, chainConfig, chainDb),\n\t\tshutdownChan:   make(chan bool),\n\t\tnetworkID:      config.NetworkId,\n\t\tgasPrice:       config.GasPrice,\n\t\tbloomRequests:  make(chan chan *bloombits.Retrieval),\n\t\tbloomIndexer:   NewBloomIndexer(chainDb, params.BloomBitsBlocks),\n\t}\n\n\tlog.Info(\"Initialising Sero protocol\", \"versions\", ProtocolVersions, \"network\", config.NetworkId)\n\n\tif !config.SkipBcVersionCheck {\n\t\tbcVersion := rawdb.ReadDatabaseVersion(chainDb)\n\t\tif bcVersion != core.BlockChainVersion && bcVersion != 0 {\n\t\t\treturn nil, fmt.Errorf(\"Blockchain DB version mismatch (%d / %d). Run gero upgradedb.\\n\", bcVersion, core.BlockChainVersion)\n\t\t}\n\t\trawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion)\n\t}\n\tvar (\n\t\tvmConfig    = vm.Config{EnablePreimageRecording: config.EnablePreimageRecording}\n\t\tcacheConfig = &core.CacheConfig{Disabled: config.NoPruning, TrieNodeLimit: config.TrieCache, TrieTimeLimit: config.TrieTimeout}\n\t)\n\n\tsero.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, sero.chainConfig, sero.engine, vmConfig, sero.accountManager)\n\n\ttxtool.Ref_inst.SetBC(&core.State1BlockChain{sero.blockchain})\n\n\t// Rewind the chain in case of an incompatible config upgrade.\n\tif compat, ok := genesisErr.(*params.ConfigCompatError); ok {\n\t\tlog.Warn(\"Rewinding chain to upgrade configuration\", \"err\", compat)\n\t\tsero.blockchain.SetHead(compat.RewindTo, core.DelFn)\n\t\trawdb.WriteChainConfig(chainDb, genesisHash, chainConfig)\n\t}\n\tsero.bloomIndexer.Start(sero.blockchain)\n\n\t// if config.TxPool.Journal != \"\" {\n\t//\tconfig.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal)\n\t// }\n\n\tconfig.TxPool.StartLight = config.StartLight\n\n\tsero.txPool = core.NewTxPool(config.TxPool, sero.chainConfig, sero.blockchain)\n\n\tsero.voter = voter.NewVoter(sero.chainConfig, sero.blockchain, sero)\n\n\tsero.miner = miner.New(sero, sero.chainConfig, sero.EventMux(), sero.voter, sero.engine)\n\n\tif sero.protocolManager, err = NewProtocolManager(sero.chainConfig, config.CloseAcceptTx, config.SyncMode, config.NetworkId, sero.eventMux, sero.voter, sero.txPool, sero.miner, sero.engine, sero.blockchain, chainDb); err != nil {\n\t\treturn nil, err\n\t}\n\tsero.miner.SetExtra(makeExtraData(config.ExtraData))\n\n\tsero.APIBackend = &SeroAPIBackend{sero, nil}\n\tgpoParams := config.GPO\n\tif gpoParams.Default == nil {\n\t\tgpoParams.Default = config.GasPrice\n\t}\n\tsero.APIBackend.gpo = gasprice.NewOracle(sero.APIBackend, gpoParams)\n\n\tethapi.Backend_Instance = sero.APIBackend\n\n\tsero.backup = NewBackup(zconfig.Backup_dir())\n\n\t// init exchange\n\tif config.StartExchange {\n\t\tsero.exchange = exchange.NewExchange(zconfig.Exchange_dir(), sero.txPool, sero.accountManager, config.AutoMerge)\n\t}\n\n\tif config.StartStake {\n\t\tstakeservice.NewStakeService(zconfig.Stake_dir(), sero.blockchain, sero.accountManager)\n\t}\n\n\t// init light\n\tif config.StartLight {\n\t\tsero.lightNode = light.NewLightNode(zconfig.Light_dir(), sero.txPool, sero.blockchain.GetDB())\n\t}\n\n\t// if config.Proof != nil {\n\t// \tif config.Proof.PKr == (c_type.PKr{}) {\n\t// \t\twallets := sero.accountManager.Wallets()\n\t// \t\tif len(wallets) == 0 {\n\t// \t\t\t// panic(\"init proofService error\")\n\t// \t\t}\n\t//\n\t// \t\taccount := wallets[0].Accounts()\n\t// \t\tconfig.Proof.PKr = superzk.Pk2PKr(account[0].Address.ToUint512(), &c_type.Uint256{1})\n\t// \t}\n\t// \tproofservice.NewProofService(\"\", sero.APIBackend, config.Proof);\n\t// }\n\n\tSeroInstance = sero\n\treturn sero, nil\n}\n\nfunc makeExtraData(extra []byte) []byte {\n\tif len(extra) == 0 {\n\t\t// create default extradata\n\t\textra, _ = rlp.EncodeToBytes([]interface{}{\n\t\t\tuint(params.VersionMajor<<16 | params.VersionMinor<<8 | params.VersionPatch),\n\t\t\t\"gero\",\n\t\t\truntime.Version(),\n\t\t\truntime.GOOS,\n\t\t})\n\t}\n\tif uint64(len(extra)) > params.MaximumExtraDataSize {\n\t\tlog.Warn(\"Miner extra data exceed limit\", \"extra\", hexutil.Bytes(extra), \"limit\", params.MaximumExtraDataSize)\n\t\textra = nil\n\t}\n\treturn extra\n}\n\n// CreateDB creates the chain database.\nfunc CreateDB(ctx *node.ServiceContext, config *Config, name string) (serodb.Database, error) {\n\tdb, err := ctx.OpenDatabase(name, config.DatabaseCache, config.DatabaseHandles)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif db, ok := db.(*serodb.LDBDatabase); ok {\n\t\tdb.Meter(\"sero/db/chaindata/\")\n\t}\n\treturn db, nil\n}\n\n// CreateConsensusEngine creates the required type of consensus engine instance for an Sero service\nfunc CreateConsensusEngine(ctx *node.ServiceContext, config *ethash.Config, chainConfig *params.ChainConfig, db serodb.Database) consensus.Engine { // If proof-of-authority is requested, set it up\n\t// Otherwise assume proof-of-work\n\tswitch config.PowMode {\n\tcase ethash.ModeFake:\n\t\tlog.Warn(\"Ethash used in fake mode\")\n\t\treturn ethash.NewFaker()\n\tcase ethash.ModeTest:\n\t\tlog.Warn(\"Ethash used in test mode\")\n\t\treturn ethash.NewTester()\n\tcase ethash.ModeShared:\n\t\tlog.Warn(\"Ethash used in shared mode\")\n\t\treturn ethash.NewShared()\n\tdefault:\n\t\tengine := ethash.New(ethash.Config{\n\t\t\tCacheDir:       ctx.ResolvePath(config.CacheDir),\n\t\t\tCachesInMem:    config.CachesInMem,\n\t\t\tCachesOnDisk:   config.CachesOnDisk,\n\t\t\tDatasetDir:     config.DatasetDir,\n\t\t\tDatasetsInMem:  config.DatasetsInMem,\n\t\t\tDatasetsOnDisk: config.DatasetsOnDisk,\n\t\t})\n\t\tengine.SetThreads(-1) // Disable CPU mining\n\t\treturn engine\n\t}\n}\n\n// APIs return the collection of RPC services the ethereum package offers.\n// NOTE, some of these services probably need to be moved to somewhere else.\nfunc (s *Sero) APIs() []rpc.API {\n\tapis := ethapi.GetAPIs(s.APIBackend)\n\n\t// Append any APIs exposed explicitly by the consensus engine\n\tapis = append(apis, s.engine.APIs(s.BlockChain())...)\n\n\t// Append all the local APIs and return\n\treturn append(apis, []rpc.API{\n\t\t{\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicSeroAPI(s),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicMinerAPI(s),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   downloader.NewPublicDownloaderAPI(s.protocolManager.downloader, s.eventMux),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"miner\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPrivateMinerAPI(s),\n\t\t\tPublic:    false,\n\t\t}, {\n\t\t\tNamespace: \"sero\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   filters.NewPublicFilterAPI(s.APIBackend, false),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"admin\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPrivateAdminAPI(s),\n\t\t}, {\n\t\t\tNamespace: \"debug\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPublicDebugAPI(s),\n\t\t\tPublic:    true,\n\t\t}, {\n\t\t\tNamespace: \"debug\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   NewPrivateDebugAPI(s.chainConfig, s),\n\t\t}, {\n\t\t\tNamespace: \"net\",\n\t\t\tVersion:   \"1.0\",\n\t\t\tService:   s.netRPCService,\n\t\t\tPublic:    true,\n\t\t},\n\t}...)\n}\n\nfunc (s *Sero) ResetWithGenesisBlock(gb *types.Block) {\n\ts.blockchain.ResetWithGenesisBlock(gb)\n}\n\nfunc (s *Sero) Serobase() (eb accounts.Account, err error) {\n\ts.lock.RLock()\n\tserobase := s.serobase\n\ts.lock.RUnlock()\n\n\tif serobase != (accounts.Account{}) {\n\t\treturn serobase, nil\n\t}\n\tif wallets := s.AccountManager().Wallets(); len(wallets) > 0 {\n\t\tif accounts := wallets[0].Accounts(); len(accounts) > 0 {\n\t\t\tserobase := accounts[0]\n\n\t\t\ts.lock.Lock()\n\t\t\ts.serobase = serobase\n\t\t\ts.lock.Unlock()\n\n\t\t\tlog.Info(\"Serobase automatically configured\", \"address\", serobase)\n\t\t\treturn serobase, nil\n\t\t}\n\t}\n\treturn accounts.Account{}, fmt.Errorf(\"Serobase must be explicitly specified\")\n}\n\n// SetSerobase sets the mining reward address.\nfunc (s *Sero) SetSerobase(serobase address.MixBase58Adrress) {\n\ts.lock.Lock()\n\taccount, _ := s.accountManager.FindAccountByPkr(serobase.ToPkr())\n\ts.serobase = account\n\ts.lock.Unlock()\n\n\ts.miner.SetSerobase(account)\n}\n\nfunc (s *Sero) StartMining(local bool) error {\n\teb, err := s.Serobase()\n\tif err != nil {\n\t\tlog.Error(\"Cannot start mining without serobase\", \"err\", err)\n\t\treturn fmt.Errorf(\"serobase missing: %v\", err)\n\t}\n\tcurrent_height := s.blockchain.CurrentHeader().Number.Uint64()\n\tpkr, lic, ret := superzk.Pk2PKrAndLICr(eb.Address.ToUint512().NewRef(), current_height)\n\tret = superzk.CheckLICr(&pkr, &lic, current_height)\n\tif !ret {\n\t\tlic_t := c_type.LICr{}\n\t\tif bytes.Equal(lic.Proof[:32], lic_t.Proof[:32]) {\n\t\t\tlog.Error(\"Cannot start mining , miner license does not exists, or coinBase is error\", \"\", \"\")\n\t\t\treturn fmt.Errorf(\" miner license does not exists\")\n\t\t} else {\n\t\t\tlog.Error(\"Cannot start mining ,invalid miner license, or coinBase is error\", \"\", \"\")\n\t\t\treturn fmt.Errorf(\"invalid miner license: %v\", common.Bytes2Hex(lic.Proof[:]))\n\t\t}\n\t}\n\n\tif local {\n\t\t// If local (CPU) mining is started, we can disable the transaction rejection\n\t\t// mechanism introduced to speed sync times. CPU mining on mainnet is ludicrous\n\t\t// so none will ever hit this path, whereas marking sync done on CPU mining\n\t\t// will ensure that private networks work in single miner mode too.\n\t\tatomic.StoreUint32(&s.protocolManager.acceptTxs, 1)\n\t}\n\tgo s.miner.Start(eb)\n\treturn nil\n}\n\nfunc (s *Sero) StopMining()         { s.miner.Stop() }\nfunc (s *Sero) IsMining() bool      { return s.miner.Mining() }\nfunc (s *Sero) Miner() *miner.Miner { return s.miner }\n\nfunc (s *Sero) AccountManager() *accounts.Manager  { return s.accountManager }\nfunc (s *Sero) BlockChain() *core.BlockChain       { return s.blockchain }\nfunc (s *Sero) TxPool() *core.TxPool               { return s.txPool }\nfunc (s *Sero) Voter() *voter.Voter                { return s.voter }\nfunc (s *Sero) EventMux() *event.TypeMux           { return s.eventMux }\nfunc (s *Sero) Engine() consensus.Engine           { return s.engine }\nfunc (s *Sero) ChainDb() serodb.Database           { return s.chainDb }\nfunc (s *Sero) IsListening() bool                  { return true } // Always listening\nfunc (s *Sero) EthVersion() int                    { return int(s.protocolManager.SubProtocols[0].Version) }\nfunc (s *Sero) NetVersion() uint64                 { return s.networkID }\nfunc (s *Sero) Downloader() *downloader.Downloader { return s.protocolManager.downloader }\n\n// Protocols implements node.Service, returning all the currently configured\n// network protocols to start.\nfunc (s *Sero) Protocols() []p2p.Protocol {\n\tif s.lesServer == nil {\n\t\treturn s.protocolManager.SubProtocols\n\t}\n\treturn append(s.protocolManager.SubProtocols, s.lesServer.Protocols()...)\n}\n\n// Start implements node.Service, starting all internal goroutines needed by the\n// Sero protocol implementation.\nfunc (s *Sero) Start(srvr *p2p.Server) error {\n\t// Start the bloom bits servicing goroutines\n\ts.startBloomHandlers()\n\n\t// Start the RPC service\n\ts.netRPCService = ethapi.NewPublicNetAPI(srvr, s.NetVersion())\n\n\t// Figure out a max peers count based on the server limits\n\tmaxPeers := srvr.MaxPeers\n\tif s.config.LightServ > 0 {\n\t\tif s.config.LightPeers >= srvr.MaxPeers {\n\t\t\treturn fmt.Errorf(\"invalid peer config: light peer count (%d) >= total peer count (%d)\", s.config.LightPeers, srvr.MaxPeers)\n\t\t}\n\t\tmaxPeers -= s.config.LightPeers\n\t}\n\t// Start the networking layer and the light server if requested\n\ts.protocolManager.Start(maxPeers)\n\tif s.lesServer != nil {\n\t\ts.lesServer.Start(srvr)\n\t}\n\treturn nil\n}\n\n// Stop implements node.Service, terminating all internal goroutines used by the\n// Sero protocol.\nfunc (s *Sero) Stop() error {\n\ts.bloomIndexer.Close()\n\ts.voter.Close()\n\ts.miner.Close()\n\ts.blockchain.Stop()\n\ts.protocolManager.Stop()\n\tif s.lesServer != nil {\n\t\ts.lesServer.Stop()\n\t}\n\ts.txPool.Stop()\n\ts.miner.Stop()\n\ts.eventMux.Stop()\n\n\ts.chainDb.Close()\n\tclose(s.shutdownChan)\n\n\treturn nil\n}\n"
  },
  {
    "path": "sero/backup.go",
    "content": "// Copyright 2020 The sero Authors\n// This file is part of the sero library.\n//\n// The sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nvar committedTxPrefix = []byte(\"COMMITEDTX\")\n\ntype Backup struct {\n\tdb *serodb.LDBDatabase\n}\n\nfunc NewBackup(dbpath string) *Backup {\n\tdb, err := serodb.NewLDBDatabase(dbpath, 1024, 1024)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn &Backup{db: db}\n}\n\nfunc committedTxKey(txhash c_type.Uint256) []byte {\n\treturn append(committedTxPrefix, txhash[:]...)\n}\n\nfunc (self *Backup) PutCommittedTx(args *txtool.GTx) error {\n\tblob, err := json.Marshal(args)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = self.db.Put(committedTxKey(args.Hash), blob)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (self *Backup) GetCommittedTx(txHash c_type.Uint256) (*txtool.GTx, error) {\n\tvalue, err := self.db.Get(committedTxKey(txHash))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar gtx txtool.GTx\n\terr = json.Unmarshal(value, &gtx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &gtx, nil\n}\n"
  },
  {
    "path": "sero/bloombits.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/bitutil\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/bloombits\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nconst (\n\t// bloomServiceThreads is the number of goroutines used globally by an Sero\n\t// instance to service bloombits lookups for all running filters.\n\tbloomServiceThreads = 16\n\n\t// bloomFilterThreads is the number of goroutines used locally per filter to\n\t// multiplex requests onto the global servicing goroutines.\n\tbloomFilterThreads = 3\n\n\t// bloomRetrievalBatch is the maximum number of bloom bit retrievals to service\n\t// in a single batch.\n\tbloomRetrievalBatch = 16\n\n\t// bloomRetrievalWait is the maximum time to wait for enough bloom bit requests\n\t// to accumulate request an entire batch (avoiding hysteresis).\n\tbloomRetrievalWait = time.Duration(0)\n)\n\n// startBloomHandlers starts a batch of goroutines to accept bloom bit database\n// retrievals from possibly a range of filters and serving the data to satisfy.\nfunc (eth *Sero) startBloomHandlers() {\n\tfor i := 0; i < bloomServiceThreads; i++ {\n\t\tgo func() {\n\t\t\tfor {\n\t\t\t\tselect {\n\t\t\t\tcase <-eth.shutdownChan:\n\t\t\t\t\treturn\n\n\t\t\t\tcase request := <-eth.bloomRequests:\n\t\t\t\t\ttask := <-request\n\t\t\t\t\ttask.Bitsets = make([][]byte, len(task.Sections))\n\t\t\t\t\tfor i, section := range task.Sections {\n\t\t\t\t\t\thead := rawdb.ReadCanonicalHash(eth.chainDb, (section+1)*params.BloomBitsBlocks-1)\n\t\t\t\t\t\tif compVector, err := rawdb.ReadBloomBits(eth.chainDb, task.Bit, section, head); err == nil {\n\t\t\t\t\t\t\tif blob, err := bitutil.DecompressBytes(compVector, int(params.BloomBitsBlocks)/8); err == nil {\n\t\t\t\t\t\t\t\ttask.Bitsets[i] = blob\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttask.Error = err\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttask.Error = err\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trequest <- task\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n}\n\nconst (\n\t// bloomConfirms is the number of confirmation blocks before a bloom section is\n\t// considered probably final and its rotated bits are calculated.\n\tbloomConfirms = 256\n\n\t// bloomThrottling is the time to wait between processing two consecutive index\n\t// sections. It's useful during chain upgrades to prevent disk overload.\n\tbloomThrottling = 100 * time.Millisecond\n)\n\n// BloomIndexer implements a core.ChainIndexer, building up a rotated bloom bits index\n// for the Sero header bloom filters, permitting blazing fast filtering.\ntype BloomIndexer struct {\n\tsize uint64 // section size to generate bloombits for\n\n\tdb  serodb.Database      // database instance to write index data and metadata into\n\tgen *bloombits.Generator // generator to rotate the bloom bits crating the bloom index\n\n\tsection uint64      // Section is the section number being processed currently\n\thead    common.Hash // Head is the hash of the last header processed\n}\n\n// NewBloomIndexer returns a chain indexer that generates bloom bits data for the\n// canonical chain for fast logs filtering.\nfunc NewBloomIndexer(db serodb.Database, size uint64) *core.ChainIndexer {\n\tbackend := &BloomIndexer{\n\t\tdb:   db,\n\t\tsize: size,\n\t}\n\ttable := serodb.NewTable(db, string(rawdb.BloomBitsIndexPrefix))\n\n\treturn core.NewChainIndexer(db, table, backend, size, bloomConfirms, bloomThrottling, \"bloombits\")\n}\n\n// Reset implements core.ChainIndexerBackend, starting a new bloombits index\n// section.\nfunc (b *BloomIndexer) Reset(section uint64, lastSectionHead common.Hash) error {\n\tgen, err := bloombits.NewGenerator(uint(b.size))\n\tb.gen, b.section, b.head = gen, section, common.Hash{}\n\treturn err\n}\n\n// Process implements core.ChainIndexerBackend, adding a new header's bloom into\n// the index.\nfunc (b *BloomIndexer) Process(header *types.Header) {\n\tb.gen.AddBloom(uint(header.Number.Uint64()-b.section*b.size), header.Bloom)\n\tb.head = header.Hash()\n}\n\n// Commit implements core.ChainIndexerBackend, finalizing the bloom section and\n// writing it out into the database.\nfunc (b *BloomIndexer) Commit() error {\n\tbatch := b.db.NewBatch()\n\n\tfor i := 0; i < types.BloomBitLength; i++ {\n\t\tbits, err := b.gen.Bitset(uint(i))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\trawdb.WriteBloomBits(batch, uint(i), b.section, b.head, bitutil.CompressBytes(bits))\n\t}\n\treturn batch.Write()\n}\n"
  },
  {
    "path": "sero/config.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"math/big\"\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/zero/proofservice\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/sero/gasprice\"\n)\n\n// DefaultConfig contains default settings for use on the Sero main net.\nvar DefaultConfig = Config{\n\tSyncMode: downloader.FullSync,\n\tEthash: ethash.Config{\n\t\tCacheDir:       \"ethash\",\n\t\tCachesInMem:    2,\n\t\tCachesOnDisk:   3,\n\t\tDatasetsInMem:  1,\n\t\tDatasetsOnDisk: 2,\n\t},\n\tNetworkId:     2019,\n\tLightPeers:    100,\n\tDatabaseCache: 768,\n\tTrieCache:     256,\n\tTrieTimeout:   60 * time.Minute,\n\tGasPrice:      big.NewInt(params.Gta),\n\n\tTxPool: core.DefaultTxPoolConfig,\n\tGPO: gasprice.Config{\n\t\tBlocks:     20,\n\t\tPercentile: 60,\n\t},\n}\n\nfunc init() {\n\thome := os.Getenv(\"HOME\")\n\tif home == \"\" {\n\t\tif user, err := user.Current(); err == nil {\n\t\t\thome = user.HomeDir\n\t\t}\n\t}\n\tif runtime.GOOS == \"windows\" {\n\t\tDefaultConfig.Ethash.DatasetDir = filepath.Join(home, \"AppData\", \"Ethash\")\n\t} else {\n\t\tDefaultConfig.Ethash.DatasetDir = filepath.Join(home, \".ethash\")\n\t}\n}\n\n//go:generate gencodec -type Config -field-override configMarshaling -formats toml -out gen_config.go\n\ntype Config struct {\n\t// The genesis block, which is inserted if the database is empty.\n\t// If nil, the Sero main net block is used.\n\tGenesis *core.Genesis `toml:\",omitempty\"`\n\n\t// Protocol options\n\tNetworkId uint64 // Network ID to use for selecting peers to connect to\n\tSyncMode  downloader.SyncMode\n\tNoPruning bool\n\n\tCloseAcceptTx bool\n\tMineMode      bool\n\tStartExchange bool\n\tAutoMerge     bool\n\tStartStake    bool\n\n\tStartLight bool\n\n\t// Light client options\n\tLightServ  int `toml:\",omitempty\"` // Maximum percentage of time allowed for serving LES requests\n\tLightPeers int `toml:\",omitempty\"` // Maximum number of LES client peers\n\n\t// Database options\n\tSkipBcVersionCheck bool `toml:\"-\"`\n\tDatabaseHandles    int  `toml:\"-\"`\n\tDatabaseCache      int\n\tTrieCache          int\n\tTrieTimeout        time.Duration\n\n\t// Mining-related options\n\tMinerThreads int    `toml:\",omitempty\"`\n\tExtraData    []byte `toml:\",omitempty\"`\n\tGasPrice     *big.Int\n\n\t// Ethash options\n\tEthash ethash.Config\n\n\t// Transaction pool options\n\tTxPool core.TxPoolConfig\n\n\tProof *proofservice.Config\n\n\t// Gas Price Oracle options\n\tGPO gasprice.Config\n\n\t// Enables tracking of SHA3 preimages in the VM\n\tEnablePreimageRecording bool\n\n\t// Miscellaneous options\n\tDocRoot string `toml:\"-\"`\n}\n\ntype configMarshaling struct {\n\tExtraData hexutil.Bytes\n}\n"
  },
  {
    "path": "sero/downloader/api.go",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage downloader\n\nimport (\n\t\"context\"\n\t\"sync\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// PublicDownloaderAPI provides an API which gives information about the current synchronisation status.\n// It offers only methods that operates on data that can be available to anyone without security risks.\ntype PublicDownloaderAPI struct {\n\td                         *Downloader\n\tmux                       *event.TypeMux\n\tinstallSyncSubscription   chan chan interface{}\n\tuninstallSyncSubscription chan *uninstallSyncSubscriptionRequest\n}\n\n// NewPublicDownloaderAPI create a new PublicDownloaderAPI. The API has an internal event loop that\n// listens for events from the downloader through the global event mux. In case it receives one of\n// these events it broadcasts it to all syncing subscriptions that are installed through the\n// installSyncSubscription channel.\nfunc NewPublicDownloaderAPI(d *Downloader, m *event.TypeMux) *PublicDownloaderAPI {\n\tapi := &PublicDownloaderAPI{\n\t\td:   d,\n\t\tmux: m,\n\t\tinstallSyncSubscription:   make(chan chan interface{}),\n\t\tuninstallSyncSubscription: make(chan *uninstallSyncSubscriptionRequest),\n\t}\n\n\tgo api.eventLoop()\n\n\treturn api\n}\n\n// eventLoop runs a loop until the event mux closes. It will install and uninstall new\n// sync subscriptions and broadcasts sync status updates to the installed sync subscriptions.\nfunc (api *PublicDownloaderAPI) eventLoop() {\n\tvar (\n\t\tsub               = api.mux.Subscribe(StartEvent{}, DoneEvent{}, FailedEvent{})\n\t\tsyncSubscriptions = make(map[chan interface{}]struct{})\n\t)\n\n\tfor {\n\t\tselect {\n\t\tcase i := <-api.installSyncSubscription:\n\t\t\tsyncSubscriptions[i] = struct{}{}\n\t\tcase u := <-api.uninstallSyncSubscription:\n\t\t\tdelete(syncSubscriptions, u.c)\n\t\t\tclose(u.uninstalled)\n\t\tcase event := <-sub.Chan():\n\t\t\tif event == nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar notification interface{}\n\t\t\tswitch event.Data.(type) {\n\t\t\tcase StartEvent:\n\t\t\t\tnotification = &SyncingResult{\n\t\t\t\t\tSyncing: true,\n\t\t\t\t\tStatus:  api.d.Progress(),\n\t\t\t\t}\n\t\t\tcase DoneEvent, FailedEvent:\n\t\t\t\tnotification = false\n\t\t\t}\n\t\t\t// broadcast\n\t\t\tfor c := range syncSubscriptions {\n\t\t\t\tc <- notification\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Syncing provides information when this nodes starts synchronising with the Ethereum network and when it's finished.\nfunc (api *PublicDownloaderAPI) Syncing(ctx context.Context) (*rpc.Subscription, error) {\n\tnotifier, supported := rpc.NotifierFromContext(ctx)\n\tif !supported {\n\t\treturn &rpc.Subscription{}, rpc.ErrNotificationsUnsupported\n\t}\n\n\trpcSub := notifier.CreateSubscription()\n\n\tgo func() {\n\t\tstatuses := make(chan interface{})\n\t\tsub := api.SubscribeSyncStatus(statuses)\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase status := <-statuses:\n\t\t\t\tnotifier.Notify(rpcSub.ID, status)\n\t\t\tcase <-rpcSub.Err():\n\t\t\t\tsub.Unsubscribe()\n\t\t\t\treturn\n\t\t\tcase <-notifier.Closed():\n\t\t\t\tsub.Unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn rpcSub, nil\n}\n\n// SyncingResult provides information about the current synchronisation status for this node.\ntype SyncingResult struct {\n\tSyncing bool              `json:\"syncing\"`\n\tStatus  sero.SyncProgress `json:\"status\"`\n}\n\n// uninstallSyncSubscriptionRequest uninstalles a syncing subscription in the API event loop.\ntype uninstallSyncSubscriptionRequest struct {\n\tc           chan interface{}\n\tuninstalled chan interface{}\n}\n\n// SyncStatusSubscription represents a syncing subscription.\ntype SyncStatusSubscription struct {\n\tapi       *PublicDownloaderAPI // register subscription in event loop of this api instance\n\tc         chan interface{}     // channel where events are broadcasted to\n\tunsubOnce sync.Once            // make sure unsubscribe logic is executed once\n}\n\n// Unsubscribe uninstalls the subscription from the DownloadAPI event loop.\n// The status channel that was passed to subscribeSyncStatus isn't used anymore\n// after this method returns.\nfunc (s *SyncStatusSubscription) Unsubscribe() {\n\ts.unsubOnce.Do(func() {\n\t\treq := uninstallSyncSubscriptionRequest{s.c, make(chan interface{})}\n\t\ts.api.uninstallSyncSubscription <- &req\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-s.c:\n\t\t\t\t// drop new status events until uninstall confirmation\n\t\t\t\tcontinue\n\t\t\tcase <-req.uninstalled:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t})\n}\n\n// SubscribeSyncStatus creates a subscription that will broadcast new synchronisation updates.\n// The given channel must receive interface values, the result can either\nfunc (api *PublicDownloaderAPI) SubscribeSyncStatus(status chan interface{}) *SyncStatusSubscription {\n\tapi.installSyncSubscription <- status\n\treturn &SyncStatusSubscription{api: api, c: status}\n}\n"
  },
  {
    "path": "sero/downloader/downloader.go",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package downloader contains the manual full chain synchronisation.\npackage downloader\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nvar (\n\tMaxBlockFetch   = 128 // Amount of blocks to be fetched per retrieval request\n\tMaxHeaderFetch  = 192 // Amount of block headers to be fetched per retrieval request\n\tMaxSkeletonSize = 128 // Number of header fetches to need for a skeleton assembly\n\tMaxReceiptFetch = 256 // Amount of transaction receipts to allow fetching per request\n\tMaxStateFetch   = 384 // Amount of node state values to allow fetching per request\n\n\tMaxForkAncestry  = 3 * params.EpochDuration // Maximum chain reorganisation\n\trttMinEstimate   = 2 * time.Second          // Minimum round-trip time to target for download requests\n\trttMaxEstimate   = 20 * time.Second         // Maximum round-trip time to target for download requests\n\trttMinConfidence = 0.1                      // Worse confidence factor in our estimated RTT value\n\tttlScaling       = 3                        // Constant scaling factor for RTT -> TTL conversion\n\tttlLimit         = time.Minute              // Maximum TTL allowance to prevent reaching crazy timeouts\n\n\tqosTuningPeers   = 5    // Number of peers to tune based on (best peers)\n\tqosConfidenceCap = 10   // Number of peers above which not to modify RTT confidence\n\tqosTuningImpact  = 0.25 // Impact that a new tuning target has on the previous value\n\n\tmaxQueuedHeaders  = 32 * 1024 // [sero/62] Maximum number of headers to queue for import (DOS protection)\n\tmaxHeadersProcess = 2048      // Number of header download results to import at once into the chain\n\tmaxResultsProcess = 2048      // Number of content download results to import at once into the chain\n\n\tfsHeaderCheckFrequency = 100             // Verification frequency of the downloaded headers during fast sync\n\tfsHeaderSafetyNet      = 2048            // Number of headers to discard in case a chain violation is detected\n\tfsHeaderForceVerify    = 24              // Number of headers to verify before and after the pivot to accept it\n\tfsHeaderContCheck      = 3 * time.Second // Time interval to check for header continuations during state download\n\tfsMinFullBlocks        = 64              // Number of blocks to retrieve fully even in fast sync\n)\n\nvar (\n\terrBusy                    = errors.New(\"busy\")\n\terrUnknownPeer             = errors.New(\"peer is unknown or unhealthy\")\n\terrBadPeer                 = errors.New(\"action from bad peer ignored\")\n\terrStallingPeer            = errors.New(\"peer is stalling\")\n\terrNoPeers                 = errors.New(\"no peers to keep download active\")\n\terrTimeout                 = errors.New(\"timeout\")\n\terrEmptyHeaderSet          = errors.New(\"empty header set by peer\")\n\terrPeersUnavailable        = errors.New(\"no peers available or all tried for download\")\n\terrInvalidAncestor         = errors.New(\"retrieved ancestor is invalid\")\n\terrInvalidChain            = errors.New(\"retrieved hash chain is invalid\")\n\terrInvalidBody             = errors.New(\"retrieved block body is invalid\")\n\terrInvalidReceipt          = errors.New(\"retrieved receipt is invalid\")\n\terrCancelBlockFetch        = errors.New(\"block download canceled (requested)\")\n\terrCancelHeaderFetch       = errors.New(\"block header download canceled (requested)\")\n\terrCancelBodyFetch         = errors.New(\"block body download canceled (requested)\")\n\terrCancelReceiptFetch      = errors.New(\"receipt download canceled (requested)\")\n\terrCancelStateFetch        = errors.New(\"state data download canceled (requested)\")\n\terrCancelHeaderProcessing  = errors.New(\"header processing canceled (requested)\")\n\terrCancelContentProcessing = errors.New(\"content processing canceled (requested)\")\n\terrNoSyncActive            = errors.New(\"no sync active\")\n\terrTooOld                  = errors.New(\"peer doesn't speak recent enough protocol version (need version >= 62)\")\n)\n\ntype Downloader struct {\n\tmode SyncMode       // Synchronisation mode defining the strategy used (per sync cycle)\n\tmux  *event.TypeMux // Event multiplexer to announce sync operation events\n\n\tqueue   *queue   // Scheduler for selecting the hashes to download\n\tpeers   *peerSet // Set of active peers from which download can proceed\n\tstateDB serodb.Database\n\n\trttEstimate   uint64 // Round trip time to target for download requests\n\trttConfidence uint64 // Confidence in the estimated RTT (unit: millionths to allow atomic ops)\n\n\t// Statistics\n\tsyncStatsChainOrigin uint64 // Origin block number where syncing started at\n\tsyncStatsChainHeight uint64 // Highest block number known when syncing started\n\tsyncStatsState       stateSyncStats\n\tsyncStatsLock        sync.RWMutex // Lock protecting the sync stats fields\n\n\tlightchain LightChain\n\tblockchain BlockChain\n\n\t// Callbacks\n\tdropPeer peerDropFn // Drops a peer for misbehaving\n\n\t// Status\n\tsynchroniseMock func(id string, hash common.Hash) error // Replacement for synchronise during testing\n\tsynchronising   int32\n\tnotified        int32\n\tcommitted       int32\n\n\t// Channels\n\theaderCh      chan dataPack        // [sero/62] Channel receiving inbound block headers\n\tbodyCh        chan dataPack        // [sero/62] Channel receiving inbound block bodies\n\treceiptCh     chan dataPack        // [sero/63] Channel receiving inbound receipts\n\tbodyWakeCh    chan bool            // [sero/62] Channel to signal the block body fetcher of new tasks\n\treceiptWakeCh chan bool            // [sero/63] Channel to signal the receipt fetcher of new tasks\n\theaderProcCh  chan []*types.Header // [sero/62] Channel to feed the header processor new tasks\n\n\t// for stateFetcher\n\tstateSyncStart chan *stateSync\n\ttrackStateReq  chan *stateReq\n\tstateCh        chan dataPack // [sero/63] Channel receiving inbound node state data\n\n\t// Cancellation and termination\n\tcancelPeer string         // Identifier of the peer currently being used as the master (cancel on drop)\n\tcancelCh   chan struct{}  // Channel to cancel mid-flight syncs\n\tcancelLock sync.RWMutex   // Lock to protect the cancel channel and peer in delivers\n\tcancelWg   sync.WaitGroup // Make sure all fetcher goroutines have exited.\n\n\tquitCh   chan struct{} // Quit channel to signal termination\n\tquitLock sync.RWMutex  // Lock to prevent double closes\n\n\t// Testing hooks\n\tsyncInitHook     func(uint64, uint64)  // Method to call upon initiating a new sync run\n\tbodyFetchHook    func([]*types.Header) // Method to call upon starting a block body fetch\n\treceiptFetchHook func([]*types.Header) // Method to call upon starting a receipt fetch\n\tchainInsertHook  func([]*fetchResult)  // Method to call upon inserting a chain of blocks (possibly in multiple invocations)\n}\n\n// LightChain encapsulates functions required to synchronise a light chain.\ntype LightChain interface {\n\t// HasHeader verifies a header's presence in the local chain.\n\tHasHeader(common.Hash, uint64) bool\n\n\t// GetHeaderByHash retrieves a header from the local chain.\n\tGetHeaderByHash(common.Hash) *types.Header\n\n\t// CurrentHeader retrieves the head header from the local chain.\n\tCurrentHeader() *types.Header\n\n\t// GetTd returns the total difficulty of a local block.\n\tGetTd(common.Hash, uint64) *big.Int\n\n\t// InsertHeaderChain inserts a batch of headers into the local chain.\n\tInsertHeaderChain([]*types.Header, int) (int, error)\n\n\t// Rollback removes a few recently added elements from the local chain.\n\tRollback([]common.Hash)\n}\n\n// BlockChain encapsulates functions required to sync a (full or fast) blockchain.\ntype BlockChain interface {\n\tLightChain\n\n\t// HasBlock verifies a block's presence in the local chain.\n\tHasBlock(common.Hash, uint64) bool\n\n\t// GetBlockByHash retrieves a block from the local chain.\n\tGetBlockByHash(common.Hash) *types.Block\n\n\t// CurrentBlock retrieves the head block from the local chain.\n\tCurrentBlock() *types.Block\n\n\t// CurrentFastBlock retrieves the head fast block from the local chain.\n\tCurrentFastBlock() *types.Block\n\n\t// FastSyncCommitHead directly commits the head block to a certain entity.\n\tFastSyncCommitHead(common.Hash) error\n\n\t// InsertChain inserts a batch of blocks into the local chain.\n\tInsertChain(types.Blocks) (int, error)\n\n\t// InsertReceiptChain inserts a batch of receipts into the local chain.\n\tInsertReceiptChain(types.Blocks, []types.Receipts) (int, error)\n}\n\n// New creates a new downloader to fetch hashes and blocks from remote peers.\nfunc New(mode SyncMode, stateDb serodb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader {\n\tif lightchain == nil {\n\t\tlightchain = chain\n\t}\n\n\tdl := &Downloader{\n\t\tmode:           mode,\n\t\tstateDB:        stateDb,\n\t\tmux:            mux,\n\t\tqueue:          newQueue(),\n\t\tpeers:          newPeerSet(),\n\t\trttEstimate:    uint64(rttMaxEstimate),\n\t\trttConfidence:  uint64(1000000),\n\t\tblockchain:     chain,\n\t\tlightchain:     lightchain,\n\t\tdropPeer:       dropPeer,\n\t\theaderCh:       make(chan dataPack, 1),\n\t\tbodyCh:         make(chan dataPack, 1),\n\t\treceiptCh:      make(chan dataPack, 1),\n\t\tbodyWakeCh:     make(chan bool, 1),\n\t\treceiptWakeCh:  make(chan bool, 1),\n\t\theaderProcCh:   make(chan []*types.Header, 1),\n\t\tquitCh:         make(chan struct{}),\n\t\tstateCh:        make(chan dataPack),\n\t\tstateSyncStart: make(chan *stateSync),\n\t\tsyncStatsState: stateSyncStats{\n\t\t\tprocessed: rawdb.ReadFastTrieProgress(stateDb),\n\t\t},\n\t\ttrackStateReq: make(chan *stateReq),\n\t}\n\tgo dl.qosTuner()\n\tgo dl.stateFetcher()\n\treturn dl\n}\n\n// Progress retrieves the synchronisation boundaries, specifically the origin\n// block where synchronisation started at (may have failed/suspended); the block\n// or header sync is currently at; and the latest known block which the sync targets.\n//\n// In addition, during the state download phase of fast synchronisation the number\n// of processed and the total number of known states are also returned. Otherwise\n// these are zero.\nfunc (d *Downloader) Progress() sero.SyncProgress {\n\t// Lock the current stats and return the progress\n\td.syncStatsLock.RLock()\n\tdefer d.syncStatsLock.RUnlock()\n\n\tcurrent := uint64(0)\n\tswitch d.mode {\n\tcase FullSync:\n\t\tcurrent = d.blockchain.CurrentBlock().NumberU64()\n\tcase FastSync:\n\t\tcurrent = d.blockchain.CurrentFastBlock().NumberU64()\n\tcase LightSync:\n\t\tcurrent = d.lightchain.CurrentHeader().Number.Uint64()\n\t}\n\treturn sero.SyncProgress{\n\t\tStartingBlock: d.syncStatsChainOrigin,\n\t\tCurrentBlock:  current,\n\t\tHighestBlock:  d.syncStatsChainHeight,\n\t\tPulledStates:  d.syncStatsState.processed,\n\t\tKnownStates:   d.syncStatsState.processed + d.syncStatsState.pending,\n\t}\n}\n\n// Synchronising returns whether the downloader is currently retrieving blocks.\nfunc (d *Downloader) Synchronising() bool {\n\treturn atomic.LoadInt32(&d.synchronising) > 0\n}\n\n// RegisterPeer injects a new download peer into the set of block source to be\n// used for fetching hashes and blocks from.\nfunc (d *Downloader) RegisterPeer(id string, version int, peer Peer) error {\n\tlogger := log.New(\"peer\", id)\n\tlogger.Trace(\"Registering sync peer\")\n\tif err := d.peers.Register(newPeerConnection(id, version, peer, logger)); err != nil {\n\t\tlogger.Error(\"Failed to register sync peer\", \"err\", err)\n\t\treturn err\n\t}\n\td.qosReduceConfidence()\n\n\treturn nil\n}\n\n// RegisterLightPeer injects a light client peer, wrapping it so it appears as a regular peer.\nfunc (d *Downloader) RegisterLightPeer(id string, version int, peer LightPeer) error {\n\treturn d.RegisterPeer(id, version, &lightPeerWrapper{peer})\n}\n\n// UnregisterPeer remove a peer from the known list, preventing any action from\n// the specified peer. An effort is also made to return any pending fetches into\n// the queue.\nfunc (d *Downloader) UnregisterPeer(id string) error {\n\t// Unregister the peer from the active peer set and revoke any fetch tasks\n\tlogger := log.New(\"peer\", id)\n\tlogger.Trace(\"Unregistering sync peer\")\n\tif err := d.peers.Unregister(id); err != nil {\n\t\tlogger.Error(\"Failed to unregister sync peer\", \"err\", err)\n\t\treturn err\n\t}\n\td.queue.Revoke(id)\n\n\t// If this peer was the master peer, abort sync immediately\n\td.cancelLock.RLock()\n\tmaster := id == d.cancelPeer\n\td.cancelLock.RUnlock()\n\n\tif master {\n\t\td.cancel()\n\t}\n\treturn nil\n}\n\n// Synchronise tries to sync up our local block chain with a remote peer, both\n// adding various sanity checks as well as wrapping it with various log entries.\nfunc (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode SyncMode) error {\n\terr := d.synchronise(id, head, td, mode)\n\tswitch err {\n\tcase nil:\n\tcase errBusy:\n\n\tcase errTimeout, errBadPeer, errStallingPeer,\n\t\terrEmptyHeaderSet, errPeersUnavailable, errTooOld,\n\t\terrInvalidAncestor, errInvalidChain:\n\t\tlog.Warn(\"Synchronisation failed, dropping peer\", \"peer\", id, \"err\", err)\n\t\tif d.dropPeer == nil {\n\t\t\t// The dropPeer method is nil when `--copydb` is used for a local copy.\n\t\t\t// Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored\n\t\t\tlog.Warn(\"Downloader wants to drop peer, but peerdrop-function is not set\", \"peer\", id)\n\t\t} else {\n\t\t\td.dropPeer(id)\n\t\t}\n\tdefault:\n\t\tlog.Warn(\"Synchronisation failed, retrying\", \"err\", err)\n\t}\n\treturn err\n}\n\nfunc (d *Downloader) Wait() {\n\tfor !atomic.CompareAndSwapInt32(&d.synchronising, 0, 1) {\n\t}\n}\n\nfunc (d *Downloader) Notify() {\n\tatomic.StoreInt32(&d.synchronising, 0)\n}\n\n// synchronise will select the peer and use it for synchronising. If an empty string is given\n// it will use the best peer possible and synchronize if its TD is higher than our own. If any of the\n// checks fail an error will be returned. This method is synchronous\nfunc (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode SyncMode) error {\n\t// Mock out the synchronisation if testing\n\tif d.synchroniseMock != nil {\n\t\treturn d.synchroniseMock(id, hash)\n\t}\n\t// Make sure only one goroutine is ever allowed past this point at once\n\tif !atomic.CompareAndSwapInt32(&d.synchronising, 0, 1) {\n\t\treturn errBusy\n\t}\n\tdefer atomic.StoreInt32(&d.synchronising, 0)\n\n\t// Post a user notification of the sync (only once per session)\n\tif atomic.CompareAndSwapInt32(&d.notified, 0, 1) {\n\t\tlog.Info(\"Block synchronisation started\")\n\t}\n\t// Reset the queue, peer set and wake channels to clean any internal leftover state\n\td.queue.Reset()\n\td.peers.Reset()\n\n\tfor _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} {\n\t\tselect {\n\t\tcase <-ch:\n\t\tdefault:\n\t\t}\n\t}\n\tfor _, ch := range []chan dataPack{d.headerCh, d.bodyCh, d.receiptCh} {\n\t\tfor empty := false; !empty; {\n\t\t\tselect {\n\t\t\tcase <-ch:\n\t\t\tdefault:\n\t\t\t\tempty = true\n\t\t\t}\n\t\t}\n\t}\n\tfor empty := false; !empty; {\n\t\tselect {\n\t\tcase <-d.headerProcCh:\n\t\tdefault:\n\t\t\tempty = true\n\t\t}\n\t}\n\t// Create cancel channel for aborting mid-flight and mark the master peer\n\td.cancelLock.Lock()\n\td.cancelCh = make(chan struct{})\n\td.cancelPeer = id\n\td.cancelLock.Unlock()\n\n\tdefer d.Cancel() // No matter what, we can't leave the cancel channel open\n\n\t// Set the requested sync mode, unless it's forbidden\n\td.mode = mode\n\n\t// Retrieve the origin peer and initiate the downloading process\n\tp := d.peers.Peer(id)\n\tif p == nil {\n\t\treturn errUnknownPeer\n\t}\n\treturn d.syncWithPeer(p, hash, td)\n}\n\n// syncWithPeer starts a block synchronization based on the hash chain from the\n// specified peer and head hash.\nfunc (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.Int) (err error) {\n\td.mux.Post(StartEvent{})\n\tdefer func() {\n\t\t// reset on error\n\t\tif err != nil {\n\t\t\td.mux.Post(FailedEvent{err})\n\t\t} else {\n\t\t\td.mux.Post(DoneEvent{})\n\t\t}\n\t}()\n\tif p.version < 62 {\n\t\treturn errTooOld\n\t}\n\n\tlog.Debug(\"Synchronising with the network\", \"peer\", p.id, \"sero\", p.version, \"head\", hash, \"td\", td, \"mode\", d.mode)\n\tdefer func(start time.Time) {\n\t\tlog.Debug(\"Synchronisation terminated\", \"elapsed\", time.Since(start))\n\t}(time.Now())\n\n\t// Look up the sync boundaries: the common ancestor and the target block\n\tlatest, err := d.fetchHeight(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\theight := latest.Number.Uint64()\n\n\torigin, err := d.findAncestor(p, height)\n\tif err != nil {\n\t\treturn err\n\t}\n\td.syncStatsLock.Lock()\n\tif d.syncStatsChainHeight <= origin || d.syncStatsChainOrigin > origin {\n\t\td.syncStatsChainOrigin = origin\n\t}\n\td.syncStatsChainHeight = height\n\td.syncStatsLock.Unlock()\n\n\t// Ensure our origin point is below any fast sync pivot point\n\tpivot := uint64(0)\n\tif d.mode == FastSync {\n\t\tif height <= uint64(fsMinFullBlocks) {\n\t\t\torigin = 0\n\t\t} else {\n\t\t\tpivot = height - uint64(fsMinFullBlocks)\n\t\t\tif pivot <= origin {\n\t\t\t\torigin = pivot - 1\n\t\t\t}\n\t\t}\n\t}\n\td.committed = 1\n\tif d.mode == FastSync && pivot != 0 {\n\t\td.committed = 0\n\t}\n\t// Initiate the sync using a concurrent header and content retrieval algorithm\n\td.queue.Prepare(origin+1, d.mode)\n\tif d.syncInitHook != nil {\n\t\td.syncInitHook(origin, height)\n\t}\n\n\tfetchers := []func() error{\n\t\tfunc() error { return d.fetchHeaders(p, origin+1, pivot) }, // Headers are always retrieved\n\t\tfunc() error { return d.fetchBodies(origin + 1) },          // Bodies are retrieved during normal and fast sync\n\t\tfunc() error { return d.fetchReceipts(origin + 1) },        // Receipts are retrieved during fast sync\n\t\tfunc() error { return d.processHeaders(origin+1, pivot, td) },\n\t}\n\tif d.mode == FastSync {\n\t\tfetchers = append(fetchers, func() error { return d.processFastSyncContent(latest) })\n\t} else if d.mode == FullSync {\n\t\tfetchers = append(fetchers, d.processFullSyncContent)\n\t}\n\treturn d.spawnSync(fetchers)\n}\n\n// spawnSync runs d.process and all given fetcher functions to completion in\n// separate goroutines, returning the first error that appears.\nfunc (d *Downloader) spawnSync(fetchers []func() error) error {\n\terrc := make(chan error, len(fetchers))\n\td.cancelWg.Add(len(fetchers))\n\tfor _, fn := range fetchers {\n\t\tfn := fn\n\t\tgo func() { defer d.cancelWg.Done(); errc <- fn() }()\n\t}\n\t// Wait for the first error, then terminate the others.\n\tvar err error\n\tfor i := 0; i < len(fetchers); i++ {\n\t\tif i == len(fetchers)-1 {\n\t\t\t// Close the queue when all fetchers have exited.\n\t\t\t// This will cause the block processor to end when\n\t\t\t// it has processed the queue.\n\t\t\td.queue.Close()\n\t\t}\n\t\tif err = <-errc; err != nil {\n\t\t\tbreak\n\t\t}\n\t}\n\td.queue.Close()\n\td.Cancel()\n\treturn err\n}\n\n// cancel aborts all of the operations and resets the queue. However, cancel does\n// not wait for the running download goroutines to finish. This method should be\n// used when cancelling the downloads from inside the downloader.\nfunc (d *Downloader) cancel() {\n\t// Close the current cancel channel\n\td.cancelLock.Lock()\n\tif d.cancelCh != nil {\n\t\tselect {\n\t\tcase <-d.cancelCh:\n\t\t\t// Channel was already closed\n\t\tdefault:\n\t\t\tclose(d.cancelCh)\n\t\t}\n\t}\n\td.cancelLock.Unlock()\n}\n\n// Cancel aborts all of the operations and waits for all download goroutines to\n// finish before returning.\nfunc (d *Downloader) Cancel() {\n\td.cancel()\n\td.cancelWg.Wait()\n}\n\n// Terminate interrupts the downloader, canceling all pending operations.\n// The downloader cannot be reused after calling Terminate.\nfunc (d *Downloader) Terminate() {\n\t// Close the termination channel (make sure double close is allowed)\n\td.quitLock.Lock()\n\tselect {\n\tcase <-d.quitCh:\n\tdefault:\n\t\tclose(d.quitCh)\n\t}\n\td.quitLock.Unlock()\n\n\t// Cancel any pending download requests\n\td.Cancel()\n}\n\n// fetchHeight retrieves the head header of the remote peer to aid in estimating\n// the total time a pending synchronisation would take.\nfunc (d *Downloader) fetchHeight(p *peerConnection) (*types.Header, error) {\n\tp.log.Debug(\"Retrieving remote chain height\")\n\n\t// Request the advertised remote head block and wait for the response\n\thead, _ := p.peer.Head()\n\tgo p.peer.RequestHeadersByHash(head, 1, 0, false)\n\n\tttl := d.requestTTL()\n\ttimeout := time.After(ttl)\n\tfor {\n\t\tselect {\n\t\tcase <-d.cancelCh:\n\t\t\treturn nil, errCancelBlockFetch\n\n\t\tcase packet := <-d.headerCh:\n\t\t\t// Discard anything not from the origin peer\n\t\t\tif packet.PeerId() != p.id {\n\t\t\t\tlog.Debug(\"Received headers from incorrect peer\", \"peer\", packet.PeerId())\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Make sure the peer actually gave something valid\n\t\t\theaders := packet.(*headerPack).headers\n\t\t\tif len(headers) != 1 {\n\t\t\t\tp.log.Debug(\"Multiple headers for single request\", \"headers\", len(headers))\n\t\t\t\treturn nil, errBadPeer\n\t\t\t}\n\t\t\thead := headers[0]\n\t\t\tp.log.Debug(\"Remote head header identified\", \"number\", head.Number, \"hash\", head.Hash())\n\t\t\treturn head, nil\n\n\t\tcase <-timeout:\n\t\t\tp.log.Debug(\"Waiting for head header timed out\", \"elapsed\", ttl)\n\t\t\treturn nil, errTimeout\n\n\t\tcase <-d.bodyCh:\n\t\tcase <-d.receiptCh:\n\t\t\t// Out of bounds delivery, ignore\n\t\t}\n\t}\n}\n\n// findAncestor tries to locate the common ancestor link of the local chain and\n// a remote peers blockchain. In the general case when our node was in sync and\n// on the correct chain, checking the top N links should already get us a match.\n// In the rare scenario when we ended up on a long reorganisation (i.e. none of\n// the head links match), we do a binary search to find the common ancestor.\nfunc (d *Downloader) findAncestor(p *peerConnection, height uint64) (uint64, error) {\n\t// Figure out the valid ancestor range to prevent rewrite attacks\n\tfloor, ceil := int64(-1), d.lightchain.CurrentHeader().Number.Uint64()\n\n\tif d.mode == FullSync {\n\t\tceil = d.blockchain.CurrentBlock().NumberU64()\n\t} else if d.mode == FastSync {\n\t\tceil = d.blockchain.CurrentFastBlock().NumberU64()\n\t}\n\tif ceil >= MaxForkAncestry {\n\t\tfloor = int64(ceil - MaxForkAncestry)\n\t}\n\tp.log.Debug(\"Looking for common ancestor\", \"local\", ceil, \"remote\", height)\n\n\t// Request the topmost blocks to short circuit binary ancestor lookup\n\thead := ceil\n\tif head > height {\n\t\thead = height\n\t}\n\tfrom := int64(head) - int64(MaxHeaderFetch)\n\tif from < 0 {\n\t\tfrom = 0\n\t}\n\t// Span out with 15 block gaps into the future to catch bad head reports\n\tlimit := 2 * MaxHeaderFetch / 16\n\tcount := 1 + int((int64(ceil)-from)/16)\n\tif count > limit {\n\t\tcount = limit\n\t}\n\tgo p.peer.RequestHeadersByNumber(uint64(from), count, 15, false)\n\n\t// Wait for the remote response to the head fetch\n\tnumber, hash := uint64(0), common.Hash{}\n\n\tttl := d.requestTTL()\n\ttimeout := time.After(ttl)\n\n\tfor finished := false; !finished; {\n\t\tselect {\n\t\tcase <-d.cancelCh:\n\t\t\treturn 0, errCancelHeaderFetch\n\n\t\tcase packet := <-d.headerCh:\n\t\t\t// Discard anything not from the origin peer\n\t\t\tif packet.PeerId() != p.id {\n\t\t\t\tlog.Debug(\"Received headers from incorrect peer\", \"peer\", packet.PeerId())\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Make sure the peer actually gave something valid\n\t\t\theaders := packet.(*headerPack).headers\n\t\t\tif len(headers) == 0 {\n\t\t\t\tp.log.Warn(\"Empty head header set\")\n\t\t\t\treturn 0, errEmptyHeaderSet\n\t\t\t}\n\t\t\t// Make sure the peer's reply conforms to the request\n\t\t\tfor i := 0; i < len(headers); i++ {\n\t\t\t\tif number := headers[i].Number.Int64(); number != from+int64(i)*16 {\n\t\t\t\t\tp.log.Warn(\"Head headers broke chain ordering\", \"index\", i, \"requested\", from+int64(i)*16, \"received\", number)\n\t\t\t\t\treturn 0, errInvalidChain\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check if a common ancestor was found\n\t\t\tfinished = true\n\t\t\tfor i := len(headers) - 1; i >= 0; i-- {\n\t\t\t\t// Skip any headers that underflow/overflow our requested set\n\t\t\t\tif headers[i].Number.Int64() < from || headers[i].Number.Uint64() > ceil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// Otherwise check if we already know the header or not\n\t\t\t\tif (d.mode == FullSync && d.blockchain.HasBlock(headers[i].Hash(), headers[i].Number.Uint64())) || (d.mode != FullSync && d.lightchain.HasHeader(headers[i].Hash(), headers[i].Number.Uint64())) {\n\t\t\t\t\tnumber, hash = headers[i].Number.Uint64(), headers[i].Hash()\n\n\t\t\t\t\t// If every header is known, even future ones, the peer straight out lied about its head\n\t\t\t\t\tif number > height && i == limit-1 {\n\t\t\t\t\t\tp.log.Warn(\"Lied about chain head\", \"reported\", height, \"found\", number)\n\t\t\t\t\t\treturn 0, errStallingPeer\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase <-timeout:\n\t\t\tp.log.Debug(\"Waiting for head header timed out\", \"elapsed\", ttl)\n\t\t\treturn 0, errTimeout\n\n\t\tcase <-d.bodyCh:\n\t\tcase <-d.receiptCh:\n\t\t\t// Out of bounds delivery, ignore\n\t\t}\n\t}\n\t// If the head fetch already found an ancestor, return\n\tif hash != (common.Hash{}) {\n\t\tif int64(number) <= floor {\n\t\t\tp.log.Warn(\"Ancestor below allowance\", \"number\", number, \"hash\", hash, \"allowance\", floor)\n\t\t\treturn 0, errInvalidAncestor\n\t\t}\n\t\tp.log.Debug(\"Found common ancestor\", \"number\", number, \"hash\", hash)\n\t\treturn number, nil\n\t}\n\t// Ancestor not found, we need to binary search over our chain\n\tstart, end := uint64(0), head\n\tif floor > 0 {\n\t\tstart = uint64(floor)\n\t}\n\tfor start+1 < end {\n\t\t// Split our chain interval in two, and request the hash to cross check\n\t\tcheck := (start + end) / 2\n\n\t\tttl := d.requestTTL()\n\t\ttimeout := time.After(ttl)\n\n\t\tgo p.peer.RequestHeadersByNumber(check, 1, 0, false)\n\n\t\t// Wait until a reply arrives to this request\n\t\tfor arrived := false; !arrived; {\n\t\t\tselect {\n\t\t\tcase <-d.cancelCh:\n\t\t\t\treturn 0, errCancelHeaderFetch\n\n\t\t\tcase packer := <-d.headerCh:\n\t\t\t\t// Discard anything not from the origin peer\n\t\t\t\tif packer.PeerId() != p.id {\n\t\t\t\t\tlog.Debug(\"Received headers from incorrect peer\", \"peer\", packer.PeerId())\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t// Make sure the peer actually gave something valid\n\t\t\t\theaders := packer.(*headerPack).headers\n\t\t\t\tif len(headers) != 1 {\n\t\t\t\t\tp.log.Debug(\"Multiple headers for single request\", \"headers\", len(headers))\n\t\t\t\t\treturn 0, errBadPeer\n\t\t\t\t}\n\t\t\t\tarrived = true\n\n\t\t\t\t// Modify the search interval based on the response\n\t\t\t\tif (d.mode == FullSync && !d.blockchain.HasBlock(headers[0].Hash(), headers[0].Number.Uint64())) || (d.mode != FullSync && !d.lightchain.HasHeader(headers[0].Hash(), headers[0].Number.Uint64())) {\n\t\t\t\t\tend = check\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\theader := d.lightchain.GetHeaderByHash(headers[0].Hash()) // Independent of sync mode, header surely exists\n\t\t\t\tif header.Number.Uint64() != check {\n\t\t\t\t\tp.log.Debug(\"Received non requested header\", \"number\", header.Number, \"hash\", header.Hash(), \"request\", check)\n\t\t\t\t\treturn 0, errBadPeer\n\t\t\t\t}\n\t\t\t\tstart = check\n\n\t\t\tcase <-timeout:\n\t\t\t\tp.log.Debug(\"Waiting for search header timed out\", \"elapsed\", ttl)\n\t\t\t\treturn 0, errTimeout\n\n\t\t\tcase <-d.bodyCh:\n\t\t\tcase <-d.receiptCh:\n\t\t\t\t// Out of bounds delivery, ignore\n\t\t\t}\n\t\t}\n\t}\n\t// Ensure valid ancestry and return\n\tif int64(start) <= floor {\n\t\tp.log.Warn(\"Ancestor below allowance\", \"number\", start, \"hash\", hash, \"allowance\", floor)\n\t\treturn 0, errInvalidAncestor\n\t}\n\tp.log.Debug(\"Found common ancestor\", \"number\", start, \"hash\", hash)\n\treturn start, nil\n}\n\n// fetchHeaders keeps retrieving headers concurrently from the number\n// requested, until no more are returned, potentially throttling on the way. To\n// facilitate concurrency but still protect against malicious nodes sending bad\n// headers, we construct a header chain skeleton using the \"origin\" peer we are\n// syncing with, and fill in the missing headers using anyone else. Headers from\n// other peers are only accepted if they map cleanly to the skeleton. If no one\n// can fill in the skeleton - not even the origin peer - it's assumed invalid and\n// the origin is dropped.\nfunc (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) error {\n\tp.log.Debug(\"Directing header downloads\", \"origin\", from)\n\tdefer p.log.Debug(\"Header download terminated\")\n\n\t// Create a timeout timer, and the associated header fetcher\n\tskeleton := true            // Skeleton assembly phase or finishing up\n\trequest := time.Now()       // time of the last skeleton fetch request\n\ttimeout := time.NewTimer(0) // timer to dump a non-responsive active peer\n\t<-timeout.C                 // timeout channel should be initially empty\n\tdefer timeout.Stop()\n\n\tvar ttl time.Duration\n\tgetHeaders := func(from uint64) {\n\t\trequest = time.Now()\n\n\t\tttl = d.requestTTL()\n\t\ttimeout.Reset(ttl)\n\n\t\tif skeleton {\n\t\t\tp.log.Trace(\"Fetching skeleton headers\", \"count\", MaxHeaderFetch, \"from\", from)\n\t\t\tgo p.peer.RequestHeadersByNumber(from+uint64(MaxHeaderFetch)-1, MaxSkeletonSize, MaxHeaderFetch-1, false)\n\t\t} else {\n\t\t\tp.log.Trace(\"Fetching full headers\", \"count\", MaxHeaderFetch, \"from\", from)\n\t\t\tgo p.peer.RequestHeadersByNumber(from, MaxHeaderFetch, 0, false)\n\t\t}\n\t}\n\t// Start pulling the header chain skeleton until all is done\n\tgetHeaders(from)\n\n\tfor {\n\t\tselect {\n\t\tcase <-d.cancelCh:\n\t\t\treturn errCancelHeaderFetch\n\n\t\tcase packet := <-d.headerCh:\n\t\t\t// Make sure the active peer is giving us the skeleton headers\n\t\t\tif packet.PeerId() != p.id {\n\t\t\t\tlog.Debug(\"Received skeleton from incorrect peer\", \"peer\", packet.PeerId())\n\t\t\t\tbreak\n\t\t\t}\n\t\t\theaderReqTimer.UpdateSince(request)\n\t\t\ttimeout.Stop()\n\n\t\t\t// If the skeleton's finished, pull any remaining head headers directly from the origin\n\t\t\tif packet.Items() == 0 && skeleton {\n\t\t\t\tskeleton = false\n\t\t\t\tgetHeaders(from)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// If no more headers are inbound, notify the content fetchers and return\n\t\t\tif packet.Items() == 0 {\n\t\t\t\t// Don't abort header fetches while the pivot is downloading\n\t\t\t\tif atomic.LoadInt32(&d.committed) == 0 && pivot <= from {\n\t\t\t\t\tp.log.Debug(\"No headers, waiting for pivot commit\")\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-time.After(fsHeaderContCheck):\n\t\t\t\t\t\tgetHeaders(from)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\tcase <-d.cancelCh:\n\t\t\t\t\t\treturn errCancelHeaderFetch\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Pivot done (or not in fast sync) and no more headers, terminate the process\n\t\t\t\tp.log.Debug(\"No more headers available\")\n\t\t\t\tselect {\n\t\t\t\tcase d.headerProcCh <- nil:\n\t\t\t\t\treturn nil\n\t\t\t\tcase <-d.cancelCh:\n\t\t\t\t\treturn errCancelHeaderFetch\n\t\t\t\t}\n\t\t\t}\n\t\t\theaders := packet.(*headerPack).headers\n\n\t\t\t// If we received a skeleton batch, resolve internals concurrently\n\t\t\tif skeleton {\n\t\t\t\tfilled, proced, err := d.fillHeaderSkeleton(from, headers)\n\t\t\t\tif err != nil {\n\t\t\t\t\tp.log.Debug(\"Skeleton chain invalid\", \"err\", err)\n\t\t\t\t\treturn errInvalidChain\n\t\t\t\t}\n\t\t\t\theaders = filled[proced:]\n\t\t\t\tfrom += uint64(proced)\n\t\t\t}\n\t\t\t// Insert all the new headers and fetch the next batch\n\t\t\tif len(headers) > 0 {\n\t\t\t\tp.log.Trace(\"Scheduling new headers\", \"count\", len(headers), \"from\", from)\n\t\t\t\tselect {\n\t\t\t\tcase d.headerProcCh <- headers:\n\t\t\t\tcase <-d.cancelCh:\n\t\t\t\t\treturn errCancelHeaderFetch\n\t\t\t\t}\n\t\t\t\tfrom += uint64(len(headers))\n\t\t\t}\n\t\t\tgetHeaders(from)\n\n\t\tcase <-timeout.C:\n\t\t\tif d.dropPeer == nil {\n\t\t\t\t// The dropPeer method is nil when `--copydb` is used for a local copy.\n\t\t\t\t// Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored\n\t\t\t\tp.log.Warn(\"Downloader wants to drop peer, but peerdrop-function is not set\", \"peer\", p.id)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Header retrieval timed out, consider the peer bad and drop\n\t\t\tp.log.Debug(\"Header request timed out\", \"elapsed\", ttl)\n\t\t\theaderTimeoutMeter.Mark(1)\n\t\t\td.dropPeer(p.id)\n\n\t\t\t// Finish the sync gracefully instead of dumping the gathered data though\n\t\t\tfor _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} {\n\t\t\t\tselect {\n\t\t\t\tcase ch <- false:\n\t\t\t\tcase <-d.cancelCh:\n\t\t\t\t}\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase d.headerProcCh <- nil:\n\t\t\tcase <-d.cancelCh:\n\t\t\t}\n\t\t\treturn errBadPeer\n\t\t}\n\t}\n}\n\n// fillHeaderSkeleton concurrently retrieves headers from all our available peers\n// and maps them to the provided skeleton header chain.\n//\n// Any partial results from the beginning of the skeleton is (if possible) forwarded\n// immediately to the header processor to keep the rest of the pipeline full even\n// in the case of header stalls.\n//\n// The method returns the entire filled skeleton and also the number of headers\n// already forwarded for processing.\nfunc (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ([]*types.Header, int, error) {\n\tlog.Debug(\"Filling up skeleton\", \"from\", from)\n\td.queue.ScheduleSkeleton(from, skeleton)\n\n\tvar (\n\t\tdeliver = func(packet dataPack) (int, error) {\n\t\t\tpack := packet.(*headerPack)\n\t\t\treturn d.queue.DeliverHeaders(pack.peerID, pack.headers, d.headerProcCh)\n\t\t}\n\t\texpire   = func() map[string]int { return d.queue.ExpireHeaders(d.requestTTL()) }\n\t\tthrottle = func() bool { return false }\n\t\treserve  = func(p *peerConnection, count int) (*fetchRequest, bool, error) {\n\t\t\treturn d.queue.ReserveHeaders(p, count), false, nil\n\t\t}\n\t\tfetch    = func(p *peerConnection, req *fetchRequest) error { return p.FetchHeaders(req.From, MaxHeaderFetch) }\n\t\tcapacity = func(p *peerConnection) int { return p.HeaderCapacity(d.requestRTT()) }\n\t\tsetIdle  = func(p *peerConnection, accepted int) { p.SetHeadersIdle(accepted) }\n\t)\n\terr := d.fetchParts(errCancelHeaderFetch, d.headerCh, deliver, d.queue.headerContCh, expire,\n\t\td.queue.PendingHeaders, d.queue.InFlightHeaders, throttle, reserve,\n\t\tnil, fetch, d.queue.CancelHeaders, capacity, d.peers.HeaderIdlePeers, setIdle, \"headers\")\n\n\tlog.Debug(\"Skeleton fill terminated\", \"err\", err)\n\n\tfilled, proced := d.queue.RetrieveHeaders()\n\treturn filled, proced, err\n}\n\n// fetchBodies iteratively downloads the scheduled block bodies, taking any\n// available peers, reserving a chunk of blocks for each, waiting for delivery\n// and also periodically checking for timeouts.\nfunc (d *Downloader) fetchBodies(from uint64) error {\n\tlog.Debug(\"Downloading block bodies\", \"origin\", from)\n\n\tvar (\n\t\tdeliver = func(packet dataPack) (int, error) {\n\t\t\tpack := packet.(*bodyPack)\n\t\t\treturn d.queue.DeliverBodies(pack.peerID, pack.transactions)\n\t\t}\n\t\texpire   = func() map[string]int { return d.queue.ExpireBodies(d.requestTTL()) }\n\t\tfetch    = func(p *peerConnection, req *fetchRequest) error { return p.FetchBodies(req) }\n\t\tcapacity = func(p *peerConnection) int { return p.BlockCapacity(d.requestRTT()) }\n\t\tsetIdle  = func(p *peerConnection, accepted int) { p.SetBodiesIdle(accepted) }\n\t)\n\terr := d.fetchParts(errCancelBodyFetch, d.bodyCh, deliver, d.bodyWakeCh, expire,\n\t\td.queue.PendingBlocks, d.queue.InFlightBlocks, d.queue.ShouldThrottleBlocks, d.queue.ReserveBodies,\n\t\td.bodyFetchHook, fetch, d.queue.CancelBodies, capacity, d.peers.BodyIdlePeers, setIdle, \"bodies\")\n\n\tlog.Debug(\"Block body download terminated\", \"err\", err)\n\treturn err\n}\n\n// fetchReceipts iteratively downloads the scheduled block receipts, taking any\n// available peers, reserving a chunk of receipts for each, waiting for delivery\n// and also periodically checking for timeouts.\nfunc (d *Downloader) fetchReceipts(from uint64) error {\n\tlog.Debug(\"Downloading transaction receipts\", \"origin\", from)\n\n\tvar (\n\t\tdeliver = func(packet dataPack) (int, error) {\n\t\t\tpack := packet.(*receiptPack)\n\t\t\treturn d.queue.DeliverReceipts(pack.peerID, pack.receipts)\n\t\t}\n\t\texpire   = func() map[string]int { return d.queue.ExpireReceipts(d.requestTTL()) }\n\t\tfetch    = func(p *peerConnection, req *fetchRequest) error { return p.FetchReceipts(req) }\n\t\tcapacity = func(p *peerConnection) int { return p.ReceiptCapacity(d.requestRTT()) }\n\t\tsetIdle  = func(p *peerConnection, accepted int) { p.SetReceiptsIdle(accepted) }\n\t)\n\terr := d.fetchParts(errCancelReceiptFetch, d.receiptCh, deliver, d.receiptWakeCh, expire,\n\t\td.queue.PendingReceipts, d.queue.InFlightReceipts, d.queue.ShouldThrottleReceipts, d.queue.ReserveReceipts,\n\t\td.receiptFetchHook, fetch, d.queue.CancelReceipts, capacity, d.peers.ReceiptIdlePeers, setIdle, \"receipts\")\n\n\tlog.Debug(\"Transaction receipt download terminated\", \"err\", err)\n\treturn err\n}\n\n// fetchParts iteratively downloads scheduled block parts, taking any available\n// peers, reserving a chunk of fetch requests for each, waiting for delivery and\n// also periodically checking for timeouts.\n//\n// As the scheduling/timeout logic mostly is the same for all downloaded data\n// types, this method is used by each for data gathering and is instrumented with\n// various callbacks to handle the slight differences between processing them.\n//\n// The instrumentation parameters:\n//  - errCancel:   error type to return if the fetch operation is cancelled (mostly makes logging nicer)\n//  - deliveryCh:  channel from which to retrieve downloaded data packets (merged from all concurrent peers)\n//  - deliver:     processing callback to deliver data packets into type specific download queues (usually within `queue`)\n//  - wakeCh:      notification channel for waking the fetcher when new tasks are available (or sync completed)\n//  - expire:      task callback method to abort requests that took too long and return the faulty peers (traffic shaping)\n//  - pending:     task callback for the number of requests still needing download (detect completion/non-completability)\n//  - inFlight:    task callback for the number of in-progress requests (wait for all active downloads to finish)\n//  - throttle:    task callback to check if the processing queue is full and activate throttling (bound memory use)\n//  - reserve:     task callback to reserve new download tasks to a particular peer (also signals partial completions)\n//  - fetchHook:   tester callback to notify of new tasks being initiated (allows testing the scheduling logic)\n//  - fetch:       network callback to actually send a particular download request to a physical remote peer\n//  - cancel:      task callback to abort an in-flight download request and allow rescheduling it (in case of lost peer)\n//  - capacity:    network callback to retrieve the estimated type-specific bandwidth capacity of a peer (traffic shaping)\n//  - idle:        network callback to retrieve the currently (type specific) idle peers that can be assigned tasks\n//  - setIdle:     network callback to set a peer back to idle and update its estimated capacity (traffic shaping)\n//  - kind:        textual label of the type being downloaded to display in log mesages\nfunc (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliver func(dataPack) (int, error), wakeCh chan bool,\n\texpire func() map[string]int, pending func() int, inFlight func() bool, throttle func() bool, reserve func(*peerConnection, int) (*fetchRequest, bool, error),\n\tfetchHook func([]*types.Header), fetch func(*peerConnection, *fetchRequest) error, cancel func(*fetchRequest), capacity func(*peerConnection) int,\n\tidle func() ([]*peerConnection, int), setIdle func(*peerConnection, int), kind string) error {\n\n\t// Create a ticker to detect expired retrieval tasks\n\tticker := time.NewTicker(100 * time.Millisecond)\n\tdefer ticker.Stop()\n\n\tupdate := make(chan struct{}, 1)\n\n\t// Prepare the queue and fetch block parts until the block header fetcher's done\n\tfinished := false\n\tfor {\n\t\tselect {\n\t\tcase <-d.cancelCh:\n\t\t\treturn errCancel\n\n\t\tcase packet := <-deliveryCh:\n\t\t\t// If the peer was previously banned and failed to deliver its pack\n\t\t\t// in a reasonable time frame, ignore its message.\n\t\t\tif peer := d.peers.Peer(packet.PeerId()); peer != nil {\n\t\t\t\t// Deliver the received chunk of data and check chain validity\n\t\t\t\taccepted, err := deliver(packet)\n\t\t\t\tif err == errInvalidChain {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\t// Unless a peer delivered something completely else than requested (usually\n\t\t\t\t// caused by a timed out request which came through in the end), set it to\n\t\t\t\t// idle. If the delivery's stale, the peer should have already been idled.\n\t\t\t\tif err != errStaleDelivery {\n\t\t\t\t\tsetIdle(peer, accepted)\n\t\t\t\t}\n\t\t\t\t// Issue a log to the user to see what's going on\n\t\t\t\tswitch {\n\t\t\t\tcase err == nil && packet.Items() == 0:\n\t\t\t\t\tpeer.log.Trace(\"Requested data not delivered\", \"type\", kind)\n\t\t\t\tcase err == nil:\n\t\t\t\t\tpeer.log.Trace(\"Delivered new batch of data\", \"type\", kind, \"count\", packet.Stats())\n\t\t\t\tdefault:\n\t\t\t\t\tpeer.log.Trace(\"Failed to deliver retrieved data\", \"type\", kind, \"err\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Blocks assembled, try to update the progress\n\t\t\tselect {\n\t\t\tcase update <- struct{}{}:\n\t\t\tdefault:\n\t\t\t}\n\n\t\tcase cont := <-wakeCh:\n\t\t\t// The header fetcher sent a continuation flag, check if it's done\n\t\t\tif !cont {\n\t\t\t\tfinished = true\n\t\t\t}\n\t\t\t// Headers arrive, try to update the progress\n\t\t\tselect {\n\t\t\tcase update <- struct{}{}:\n\t\t\tdefault:\n\t\t\t}\n\n\t\tcase <-ticker.C:\n\t\t\t// Sanity check update the progress\n\t\t\tselect {\n\t\t\tcase update <- struct{}{}:\n\t\t\tdefault:\n\t\t\t}\n\n\t\tcase <-update:\n\t\t\t// Short circuit if we lost all our peers\n\t\t\tif d.peers.Len() == 0 {\n\t\t\t\treturn errNoPeers\n\t\t\t}\n\t\t\t// Check for fetch request timeouts and demote the responsible peers\n\t\t\tfor pid, fails := range expire() {\n\t\t\t\tif peer := d.peers.Peer(pid); peer != nil {\n\t\t\t\t\t// If a lot of retrieval elements expired, we might have overestimated the remote peer or perhaps\n\t\t\t\t\t// ourselves. Only reset to minimal throughput but don't drop just yet. If even the minimal times\n\t\t\t\t\t// out that sync wise we need to get rid of the peer.\n\t\t\t\t\t//\n\t\t\t\t\t// The reason the minimum threshold is 2 is because the downloader tries to estimate the bandwidth\n\t\t\t\t\t// and latency of a peer separately, which requires pushing the measures capacity a bit and seeing\n\t\t\t\t\t// how response times reacts, to it always requests one more than the minimum (i.e. min 2).\n\t\t\t\t\tif fails > 2 {\n\t\t\t\t\t\tpeer.log.Trace(\"Data delivery timed out\", \"type\", kind)\n\t\t\t\t\t\tsetIdle(peer, 0)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpeer.log.Debug(\"Stalling delivery, dropping\", \"type\", kind)\n\t\t\t\t\t\tif d.dropPeer == nil {\n\t\t\t\t\t\t\t// The dropPeer method is nil when `--copydb` is used for a local copy.\n\t\t\t\t\t\t\t// Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored\n\t\t\t\t\t\t\tpeer.log.Warn(\"Downloader wants to drop peer, but peerdrop-function is not set\", \"peer\", pid)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\td.dropPeer(pid)\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\t// If there's nothing more to fetch, wait or terminate\n\t\t\tif pending() == 0 {\n\t\t\t\tif !inFlight() && finished {\n\t\t\t\t\tlog.Debug(\"Data fetching completed\", \"type\", kind)\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Send a download request to all idle peers, until throttled\n\t\t\tprogressed, throttled, running := false, false, inFlight()\n\t\t\tidles, total := idle()\n\n\t\t\tfor _, peer := range idles {\n\t\t\t\t// Short circuit if throttling activated\n\t\t\t\tif throttle() {\n\t\t\t\t\tthrottled = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t// Short circuit if there is no more available task.\n\t\t\t\tif pending() == 0 {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t// Reserve a chunk of fetches for a peer. A nil can mean either that\n\t\t\t\t// no more headers are available, or that the peer is known not to\n\t\t\t\t// have them.\n\t\t\t\trequest, progress, err := reserve(peer, capacity(peer))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif progress {\n\t\t\t\t\tprogressed = true\n\t\t\t\t}\n\t\t\t\tif request == nil {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif request.From > 0 {\n\t\t\t\t\tpeer.log.Trace(\"Requesting new batch of data\", \"type\", kind, \"from\", request.From)\n\t\t\t\t} else {\n\t\t\t\t\tpeer.log.Trace(\"Requesting new batch of data\", \"type\", kind, \"count\", len(request.Headers), \"from\", request.Headers[0].Number)\n\t\t\t\t}\n\t\t\t\t// Fetch the chunk and make sure any errors return the hashes to the queue\n\t\t\t\tif fetchHook != nil {\n\t\t\t\t\tfetchHook(request.Headers)\n\t\t\t\t}\n\t\t\t\tif err := fetch(peer, request); err != nil {\n\t\t\t\t\t// Although we could try and make an attempt to fix this, this error really\n\t\t\t\t\t// means that we've double allocated a fetch task to a peer. If that is the\n\t\t\t\t\t// case, the internal state of the downloader and the queue is very wrong so\n\t\t\t\t\t// better hard crash and note the error instead of silently accumulating into\n\t\t\t\t\t// a much bigger issue.\n\t\t\t\t\tpanic(fmt.Sprintf(\"%v: %s fetch assignment failed\", peer, kind))\n\t\t\t\t}\n\t\t\t\trunning = true\n\t\t\t}\n\t\t\t// Make sure that we have peers available for fetching. If all peers have been tried\n\t\t\t// and all failed throw an error\n\t\t\tif !progressed && !throttled && !running && len(idles) == total && pending() > 0 {\n\t\t\t\treturn errPeersUnavailable\n\t\t\t}\n\t\t}\n\t}\n}\n\n// processHeaders takes batches of retrieved headers from an input channel and\n// keeps processing and scheduling them into the header chain and downloader's\n// queue until the stream ends or a failure occurs.\nfunc (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) error {\n\t// Keep a count of uncertain headers to roll back\n\trollback := []*types.Header{}\n\tdefer func() {\n\t\tif len(rollback) > 0 {\n\t\t\t// Flatten the headers and roll them back\n\t\t\thashes := make([]common.Hash, len(rollback))\n\t\t\tfor i, header := range rollback {\n\t\t\t\thashes[i] = header.Hash()\n\t\t\t}\n\t\t\tlastHeader, lastFastBlock, lastBlock := d.lightchain.CurrentHeader().Number, common.Big0, common.Big0\n\t\t\tif d.mode != LightSync {\n\t\t\t\tlastFastBlock = d.blockchain.CurrentFastBlock().Number()\n\t\t\t\tlastBlock = d.blockchain.CurrentBlock().Number()\n\t\t\t}\n\t\t\td.lightchain.Rollback(hashes)\n\t\t\tcurFastBlock, curBlock := common.Big0, common.Big0\n\t\t\tif d.mode != LightSync {\n\t\t\t\tcurFastBlock = d.blockchain.CurrentFastBlock().Number()\n\t\t\t\tcurBlock = d.blockchain.CurrentBlock().Number()\n\t\t\t}\n\t\t\tlog.Warn(\"Rolled back headers\", \"count\", len(hashes),\n\t\t\t\t\"header\", fmt.Sprintf(\"%d->%d\", lastHeader, d.lightchain.CurrentHeader().Number),\n\t\t\t\t\"fast\", fmt.Sprintf(\"%d->%d\", lastFastBlock, curFastBlock),\n\t\t\t\t\"block\", fmt.Sprintf(\"%d->%d\", lastBlock, curBlock))\n\t\t}\n\t}()\n\n\t// Wait for batches of headers to process\n\tgotHeaders := false\n\n\tfor {\n\t\tselect {\n\t\tcase <-d.cancelCh:\n\t\t\treturn errCancelHeaderProcessing\n\n\t\tcase headers := <-d.headerProcCh:\n\t\t\t// Terminate header processing if we synced up\n\t\t\tif len(headers) == 0 {\n\t\t\t\t// Notify everyone that headers are fully processed\n\t\t\t\tfor _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase ch <- false:\n\t\t\t\t\tcase <-d.cancelCh:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If no headers were retrieved at all, the peer violated its TD promise that it had a\n\t\t\t\t// better chain compared to ours. The only exception is if its promised blocks were\n\t\t\t\t// already imported by other means (e.g. fecher):\n\t\t\t\t//\n\t\t\t\t// R <remote peer>, L <local node>: Both at block 10\n\t\t\t\t// R: Mine block 11, and propagate it to L\n\t\t\t\t// L: Queue block 11 for import\n\t\t\t\t// L: Notice that R's head and TD increased compared to ours, start sync\n\t\t\t\t// L: Import of block 11 finishes\n\t\t\t\t// L: Sync begins, and finds common ancestor at 11\n\t\t\t\t// L: Request new headers up from 11 (R's TD was higher, it must have something)\n\t\t\t\t// R: Nothing to give\n\t\t\t\tif d.mode != LightSync {\n\t\t\t\t\thead := d.blockchain.CurrentBlock()\n\t\t\t\t\tif !gotHeaders && td.Cmp(d.blockchain.GetTd(head.Hash(), head.NumberU64())) > 0 {\n\t\t\t\t\t\treturn errStallingPeer\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If fast or light syncing, ensure promised headers are indeed delivered. This is\n\t\t\t\t// needed to detect scenarios where an attacker feeds a bad pivot and then bails out\n\t\t\t\t// of delivering the post-pivot blocks that would flag the invalid content.\n\t\t\t\t//\n\t\t\t\t// This check cannot be executed \"as is\" for full imports, since blocks may still be\n\t\t\t\t// queued for processing when the header download completes. However, as long as the\n\t\t\t\t// peer gave us something useful, we're already happy/progressed (above check).\n\t\t\t\tif d.mode == FastSync || d.mode == LightSync {\n\t\t\t\t\thead := d.lightchain.CurrentHeader()\n\t\t\t\t\tif td.Cmp(d.lightchain.GetTd(head.Hash(), head.Number.Uint64())) > 0 {\n\t\t\t\t\t\treturn errStallingPeer\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Disable any rollback and return\n\t\t\t\trollback = nil\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\t// Otherwise split the chunk of headers into batches and process them\n\t\t\tgotHeaders = true\n\n\t\t\tfor len(headers) > 0 {\n\t\t\t\t// Terminate if something failed in between processing chunks\n\t\t\t\tselect {\n\t\t\t\tcase <-d.cancelCh:\n\t\t\t\t\treturn errCancelHeaderProcessing\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t\t// Select the next chunk of headers to import\n\t\t\t\tlimit := maxHeadersProcess\n\t\t\t\tif limit > len(headers) {\n\t\t\t\t\tlimit = len(headers)\n\t\t\t\t}\n\t\t\t\tchunk := headers[:limit]\n\n\t\t\t\t// In case of header only syncing, validate the chunk immediately\n\t\t\t\tif d.mode == FastSync || d.mode == LightSync {\n\t\t\t\t\t// Collect the yet unknown headers to mark them as uncertain\n\t\t\t\t\tunknown := make([]*types.Header, 0, len(headers))\n\t\t\t\t\tfor _, header := range chunk {\n\t\t\t\t\t\tif !d.lightchain.HasHeader(header.Hash(), header.Number.Uint64()) {\n\t\t\t\t\t\t\tunknown = append(unknown, header)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// If we're importing pure headers, verify based on their recentness\n\t\t\t\t\tfrequency := fsHeaderCheckFrequency\n\t\t\t\t\tif chunk[len(chunk)-1].Number.Uint64()+uint64(fsHeaderForceVerify) > pivot {\n\t\t\t\t\t\tfrequency = 1\n\t\t\t\t\t}\n\t\t\t\t\tif n, err := d.lightchain.InsertHeaderChain(chunk, frequency); err != nil {\n\t\t\t\t\t\t// If some headers were inserted, add them too to the rollback list\n\t\t\t\t\t\tif n > 0 {\n\t\t\t\t\t\t\trollback = append(rollback, chunk[:n]...)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlog.Debug(\"Invalid header encountered\", \"number\", chunk[n].Number, \"hash\", chunk[n].Hash(), \"err\", err)\n\t\t\t\t\t\treturn errInvalidChain\n\t\t\t\t\t}\n\t\t\t\t\t// All verifications passed, store newly found uncertain headers\n\t\t\t\t\trollback = append(rollback, unknown...)\n\t\t\t\t\tif len(rollback) > fsHeaderSafetyNet {\n\t\t\t\t\t\trollback = append(rollback[:0], rollback[len(rollback)-fsHeaderSafetyNet:]...)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Unless we're doing light chains, schedule the headers for associated content retrieval\n\t\t\t\tif d.mode == FullSync || d.mode == FastSync {\n\t\t\t\t\t// If we've reached the allowed number of pending headers, stall a bit\n\t\t\t\t\tfor d.queue.PendingBlocks() >= maxQueuedHeaders || d.queue.PendingReceipts() >= maxQueuedHeaders {\n\t\t\t\t\t\tselect {\n\t\t\t\t\t\tcase <-d.cancelCh:\n\t\t\t\t\t\t\treturn errCancelHeaderProcessing\n\t\t\t\t\t\tcase <-time.After(time.Second):\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// Otherwise insert the headers for content retrieval\n\t\t\t\t\tinserts := d.queue.Schedule(chunk, origin)\n\t\t\t\t\tif len(inserts) != len(chunk) {\n\t\t\t\t\t\tlog.Debug(\"Stale headers\")\n\t\t\t\t\t\treturn errBadPeer\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\theaders = headers[limit:]\n\t\t\t\torigin += uint64(limit)\n\t\t\t}\n\n\t\t\t// Update the highest block number we know if a higher one is found.\n\t\t\td.syncStatsLock.Lock()\n\t\t\tif d.syncStatsChainHeight < origin {\n\t\t\t\td.syncStatsChainHeight = origin - 1\n\t\t\t}\n\t\t\td.syncStatsLock.Unlock()\n\n\t\t\t// Signal the content downloaders of the availablility of new tasks\n\t\t\tfor _, ch := range []chan bool{d.bodyWakeCh, d.receiptWakeCh} {\n\t\t\t\tselect {\n\t\t\t\tcase ch <- true:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// processFullSyncContent takes fetch results from the queue and imports them into the chain.\nfunc (d *Downloader) processFullSyncContent() error {\n\tfor {\n\t\tresults := d.queue.Results(true)\n\t\tif len(results) == 0 {\n\t\t\treturn nil\n\t\t}\n\t\tif d.chainInsertHook != nil {\n\t\t\td.chainInsertHook(results)\n\t\t}\n\t\tif err := d.importBlockResults(results); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n}\n\nfunc (d *Downloader) importBlockResults(results []*fetchResult) error {\n\t// Check for any early termination requests\n\tif len(results) == 0 {\n\t\treturn nil\n\t}\n\tselect {\n\tcase <-d.quitCh:\n\t\treturn errCancelContentProcessing\n\tdefault:\n\t}\n\t// Retrieve the a batch of results to import\n\tfirst, last := results[0].Header, results[len(results)-1].Header\n\tlog.Debug(\"Inserting downloaded chain\", \"items\", len(results),\n\t\t\"firstnum\", first.Number, \"firsthash\", first.Hash(),\n\t\t\"lastnum\", last.Number, \"lasthash\", last.Hash(),\n\t)\n\tblocks := make([]*types.Block, len(results))\n\tfor i, result := range results {\n\t\tblocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions)\n\t}\n\tif index, err := d.blockchain.InsertChain(blocks); err != nil {\n\t\tlog.Debug(\"Downloaded item processing failed\", \"number\", results[index].Header.Number, \"hash\", results[index].Header.Hash(), \"err\", err)\n\t\treturn errInvalidChain\n\t}\n\treturn nil\n}\n\n// processFastSyncContent takes fetch results from the queue and writes them to the\n// database. It also controls the synchronisation of state nodes of the pivot block.\nfunc (d *Downloader) processFastSyncContent(latest *types.Header) error {\n\t// Start syncing state of the reported head block. This should get us most of\n\t// the state of the pivot block.\n\tstateSync := d.syncState(latest.Root)\n\tdefer stateSync.Cancel()\n\tgo func() {\n\t\tif err := stateSync.Wait(); err != nil && err != errCancelStateFetch {\n\t\t\td.queue.Close() // wake up WaitResults\n\t\t}\n\t}()\n\t// Figure out the ideal pivot block. Note, that this goalpost may move if the\n\t// sync takes long enough for the chain head to move significantly.\n\tpivot := uint64(0)\n\tif height := latest.Number.Uint64(); height > uint64(fsMinFullBlocks) {\n\t\tpivot = height - uint64(fsMinFullBlocks)\n\t}\n\t// To cater for moving pivot points, track the pivot block and subsequently\n\t// accumulated download results separately.\n\tvar (\n\t\toldPivot *fetchResult   // Locked in pivot block, might change eventually\n\t\toldTail  []*fetchResult // Downloaded content after the pivot\n\t)\n\tfor {\n\t\t// Wait for the next batch of downloaded data to be available, and if the pivot\n\t\t// block became stale, move the goalpost\n\t\tresults := d.queue.Results(oldPivot == nil) // Block if we're not monitoring pivot staleness\n\t\tif len(results) == 0 {\n\t\t\t// If pivot sync is done, stop\n\t\t\tif oldPivot == nil {\n\t\t\t\treturn stateSync.Cancel()\n\t\t\t}\n\t\t\t// If sync failed, stop\n\t\t\tselect {\n\t\t\tcase <-d.cancelCh:\n\t\t\t\treturn stateSync.Cancel()\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t\tif d.chainInsertHook != nil {\n\t\t\td.chainInsertHook(results)\n\t\t}\n\t\tif oldPivot != nil {\n\t\t\tresults = append(append([]*fetchResult{oldPivot}, oldTail...), results...)\n\t\t}\n\t\t// Split around the pivot block and process the two sides via fast/full sync\n\t\tif atomic.LoadInt32(&d.committed) == 0 {\n\t\t\tlatest = results[len(results)-1].Header\n\t\t\tif height := latest.Number.Uint64(); height > pivot+2*uint64(fsMinFullBlocks) {\n\t\t\t\tlog.Warn(\"Pivot became stale, moving\", \"old\", pivot, \"new\", height-uint64(fsMinFullBlocks))\n\t\t\t\tpivot = height - uint64(fsMinFullBlocks)\n\t\t\t}\n\t\t}\n\t\tP, beforeP, afterP := splitAroundPivot(pivot, results)\n\t\tif err := d.commitFastSyncData(beforeP, stateSync); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif P != nil {\n\t\t\t// If new pivot block found, cancel old state retrieval and restart\n\t\t\tif oldPivot != P {\n\t\t\t\tstateSync.Cancel()\n\n\t\t\t\tstateSync = d.syncState(P.Header.Root)\n\t\t\t\tdefer stateSync.Cancel()\n\t\t\t\tgo func() {\n\t\t\t\t\tif err := stateSync.Wait(); err != nil && err != errCancelStateFetch {\n\t\t\t\t\t\td.queue.Close() // wake up WaitResults\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t\toldPivot = P\n\t\t\t}\n\t\t\t// Wait for completion, occasionally checking for pivot staleness\n\t\t\tselect {\n\t\t\tcase <-stateSync.done:\n\t\t\t\tif stateSync.err != nil {\n\t\t\t\t\treturn stateSync.err\n\t\t\t\t}\n\t\t\t\tif err := d.commitPivotBlock(P); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\toldPivot = nil\n\n\t\t\tcase <-time.After(time.Second):\n\t\t\t\toldTail = afterP\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\t// Fast sync done, pivot commit done, full import\n\t\tif err := d.importBlockResults(afterP); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n}\n\nfunc splitAroundPivot(pivot uint64, results []*fetchResult) (p *fetchResult, before, after []*fetchResult) {\n\tfor _, result := range results {\n\t\tnum := result.Header.Number.Uint64()\n\t\tswitch {\n\t\tcase num < pivot:\n\t\t\tbefore = append(before, result)\n\t\tcase num == pivot:\n\t\t\tp = result\n\t\tdefault:\n\t\t\tafter = append(after, result)\n\t\t}\n\t}\n\treturn p, before, after\n}\n\nfunc (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *stateSync) error {\n\t// Check for any early termination requests\n\tif len(results) == 0 {\n\t\treturn nil\n\t}\n\tselect {\n\tcase <-d.quitCh:\n\t\treturn errCancelContentProcessing\n\tcase <-stateSync.done:\n\t\tif err := stateSync.Wait(); err != nil {\n\t\t\treturn err\n\t\t}\n\tdefault:\n\t}\n\t// Retrieve the a batch of results to import\n\tfirst, last := results[0].Header, results[len(results)-1].Header\n\tlog.Debug(\"Inserting fast-sync blocks\", \"items\", len(results),\n\t\t\"firstnum\", first.Number, \"firsthash\", first.Hash(),\n\t\t\"lastnumn\", last.Number, \"lasthash\", last.Hash(),\n\t)\n\tblocks := make([]*types.Block, len(results))\n\treceipts := make([]types.Receipts, len(results))\n\tfor i, result := range results {\n\t\tblocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions)\n\t\treceipts[i] = result.Receipts\n\t}\n\tif index, err := d.blockchain.InsertReceiptChain(blocks, receipts); err != nil {\n\t\tlog.Debug(\"Downloaded item processing failed\", \"number\", results[index].Header.Number, \"hash\", results[index].Header.Hash(), \"err\", err)\n\t\treturn errInvalidChain\n\t}\n\treturn nil\n}\n\nfunc (d *Downloader) commitPivotBlock(result *fetchResult) error {\n\tblock := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions)\n\tlog.Debug(\"Committing fast sync pivot as new head\", \"number\", block.Number(), \"hash\", block.Hash())\n\tif _, err := d.blockchain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{result.Receipts}); err != nil {\n\t\treturn err\n\t}\n\tif err := d.blockchain.FastSyncCommitHead(block.Hash()); err != nil {\n\t\treturn err\n\t}\n\tatomic.StoreInt32(&d.committed, 1)\n\treturn nil\n}\n\n// DeliverHeaders injects a new batch of block headers received from a remote\n// node into the download schedule.\nfunc (d *Downloader) DeliverHeaders(id string, headers []*types.Header) (err error) {\n\treturn d.deliver(id, d.headerCh, &headerPack{id, headers}, headerInMeter, headerDropMeter)\n}\n\n// DeliverBodies injects a new batch of block bodies received from a remote node.\nfunc (d *Downloader) DeliverBodies(id string, transactions [][]*types.Transaction) (err error) {\n\treturn d.deliver(id, d.bodyCh, &bodyPack{id, transactions}, bodyInMeter, bodyDropMeter)\n}\n\n// DeliverReceipts injects a new batch of receipts received from a remote node.\nfunc (d *Downloader) DeliverReceipts(id string, receipts [][]*types.Receipt) (err error) {\n\treturn d.deliver(id, d.receiptCh, &receiptPack{id, receipts}, receiptInMeter, receiptDropMeter)\n}\n\n// DeliverNodeData injects a new batch of node state data received from a remote node.\nfunc (d *Downloader) DeliverNodeData(id string, data [][]byte) (err error) {\n\treturn d.deliver(id, d.stateCh, &statePack{id, data}, stateInMeter, stateDropMeter)\n}\n\n// deliver injects a new batch of data received from a remote node.\nfunc (d *Downloader) deliver(id string, destCh chan dataPack, packet dataPack, inMeter, dropMeter metrics.Meter) (err error) {\n\t// Update the delivery metrics for both good and failed deliveries\n\tinMeter.Mark(int64(packet.Items()))\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tdropMeter.Mark(int64(packet.Items()))\n\t\t}\n\t}()\n\t// Deliver or abort if the sync is canceled while queuing\n\td.cancelLock.RLock()\n\tcancel := d.cancelCh\n\td.cancelLock.RUnlock()\n\tif cancel == nil {\n\t\treturn errNoSyncActive\n\t}\n\tselect {\n\tcase destCh <- packet:\n\t\treturn nil\n\tcase <-cancel:\n\t\treturn errNoSyncActive\n\t}\n}\n\n// qosTuner is the quality of service tuning loop that occasionally gathers the\n// peer latency statistics and updates the estimated request round trip time.\nfunc (d *Downloader) qosTuner() {\n\tfor {\n\t\t// Retrieve the current median RTT and integrate into the previoust target RTT\n\t\trtt := time.Duration((1-qosTuningImpact)*float64(atomic.LoadUint64(&d.rttEstimate)) + qosTuningImpact*float64(d.peers.medianRTT()))\n\t\tatomic.StoreUint64(&d.rttEstimate, uint64(rtt))\n\n\t\t// A new RTT cycle passed, increase our confidence in the estimated RTT\n\t\tconf := atomic.LoadUint64(&d.rttConfidence)\n\t\tconf = conf + (1000000-conf)/2\n\t\tatomic.StoreUint64(&d.rttConfidence, conf)\n\n\t\t// Log the new QoS values and sleep until the next RTT\n\t\tlog.Debug(\"Recalculated downloader QoS values\", \"rtt\", rtt, \"confidence\", float64(conf)/1000000.0, \"ttl\", d.requestTTL())\n\t\tselect {\n\t\tcase <-d.quitCh:\n\t\t\treturn\n\t\tcase <-time.After(rtt):\n\t\t}\n\t}\n}\n\n// qosReduceConfidence is meant to be called when a new peer joins the downloader's\n// peer set, needing to reduce the confidence we have in out QoS estimates.\nfunc (d *Downloader) qosReduceConfidence() {\n\t// If we have a single peer, confidence is always 1\n\tpeers := uint64(d.peers.Len())\n\tif peers == 0 {\n\t\t// Ensure peer connectivity races don't catch us off guard\n\t\treturn\n\t}\n\tif peers == 1 {\n\t\tatomic.StoreUint64(&d.rttConfidence, 1000000)\n\t\treturn\n\t}\n\t// If we have a ton of peers, don't drop confidence)\n\tif peers >= uint64(qosConfidenceCap) {\n\t\treturn\n\t}\n\t// Otherwise drop the confidence factor\n\tconf := atomic.LoadUint64(&d.rttConfidence) * (peers - 1) / peers\n\tif float64(conf)/1000000 < rttMinConfidence {\n\t\tconf = uint64(rttMinConfidence * 1000000)\n\t}\n\tatomic.StoreUint64(&d.rttConfidence, conf)\n\n\trtt := time.Duration(atomic.LoadUint64(&d.rttEstimate))\n\tlog.Debug(\"Relaxed downloader QoS values\", \"rtt\", rtt, \"confidence\", float64(conf)/1000000.0, \"ttl\", d.requestTTL())\n}\n\n// requestRTT returns the current target round trip time for a download request\n// to complete in.\n//\n// Note, the returned RTT is .9 of the actually estimated RTT. The reason is that\n// the downloader tries to adapt queries to the RTT, so multiple RTT values can\n// be adapted to, but smaller ones are preferred (stabler download stream).\nfunc (d *Downloader) requestRTT() time.Duration {\n\treturn time.Duration(atomic.LoadUint64(&d.rttEstimate)) * 9 / 10\n}\n\n// requestTTL returns the current timeout allowance for a single download request\n// to finish under.\nfunc (d *Downloader) requestTTL() time.Duration {\n\tvar (\n\t\trtt  = time.Duration(atomic.LoadUint64(&d.rttEstimate))\n\t\tconf = float64(atomic.LoadUint64(&d.rttConfidence)) / 1000000.0\n\t)\n\tttl := time.Duration(ttlScaling) * time.Duration(float64(rtt)/conf)\n\tif ttl > ttlLimit {\n\t\tttl = ttlLimit\n\t}\n\treturn ttl\n}\n"
  },
  {
    "path": "sero/downloader/events.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage downloader\n\ntype DoneEvent struct{}\ntype StartEvent struct{}\ntype FailedEvent struct{ Err error }\n"
  },
  {
    "path": "sero/downloader/fakepeer.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage downloader\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// FakePeer is a mock downloader peer that operates on a local database instance\n// instead of being an actual live node. It's useful for testing and to implement\n// sync commands from an existing local database.\ntype FakePeer struct {\n\tid string\n\tdb serodb.Database\n\thc *core.HeaderChain\n\tdl *Downloader\n}\n\n// NewFakePeer creates a new mock downloader peer with the given data sources.\nfunc NewFakePeer(id string, db serodb.Database, hc *core.HeaderChain, dl *Downloader) *FakePeer {\n\treturn &FakePeer{id: id, db: db, hc: hc, dl: dl}\n}\n\n// Head implements downloader.Peer, returning the current head hash and number\n// of the best known header.\nfunc (p *FakePeer) Head() (common.Hash, *big.Int) {\n\theader := p.hc.CurrentHeader()\n\treturn header.Hash(), header.Number\n}\n\n// RequestHeadersByHash implements downloader.Peer, returning a batch of headers\n// defined by the origin hash and the associated query parameters.\nfunc (p *FakePeer) RequestHeadersByHash(hash common.Hash, amount int, skip int, reverse bool) error {\n\tvar (\n\t\theaders []*types.Header\n\t\tunknown bool\n\t)\n\tfor !unknown && len(headers) < amount {\n\t\torigin := p.hc.GetHeaderByHash(hash)\n\t\tif origin == nil {\n\t\t\tbreak\n\t\t}\n\t\tnumber := origin.Number.Uint64()\n\t\theaders = append(headers, origin)\n\t\tif reverse {\n\t\t\tfor i := 0; i <= skip; i++ {\n\t\t\t\tif header := p.hc.GetHeader(hash, number); header != nil {\n\t\t\t\t\thash = header.ParentHash\n\t\t\t\t\tnumber--\n\t\t\t\t} else {\n\t\t\t\t\tunknown = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar (\n\t\t\t\tcurrent = origin.Number.Uint64()\n\t\t\t\tnext    = current + uint64(skip) + 1\n\t\t\t)\n\t\t\tif header := p.hc.GetHeaderByNumber(next); header != nil {\n\t\t\t\tif p.hc.GetBlockHashesFromHash(header.Hash(), uint64(skip+1))[skip] == hash {\n\t\t\t\t\thash = header.Hash()\n\t\t\t\t} else {\n\t\t\t\t\tunknown = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tunknown = true\n\t\t\t}\n\t\t}\n\t}\n\tp.dl.DeliverHeaders(p.id, headers)\n\treturn nil\n}\n\n// RequestHeadersByNumber implements downloader.Peer, returning a batch of headers\n// defined by the origin number and the associated query parameters.\nfunc (p *FakePeer) RequestHeadersByNumber(number uint64, amount int, skip int, reverse bool) error {\n\tvar (\n\t\theaders []*types.Header\n\t\tunknown bool\n\t)\n\tfor !unknown && len(headers) < amount {\n\t\torigin := p.hc.GetHeaderByNumber(number)\n\t\tif origin == nil {\n\t\t\tbreak\n\t\t}\n\t\tif reverse {\n\t\t\tif number >= uint64(skip+1) {\n\t\t\t\tnumber -= uint64(skip + 1)\n\t\t\t} else {\n\t\t\t\tunknown = true\n\t\t\t}\n\t\t} else {\n\t\t\tnumber += uint64(skip + 1)\n\t\t}\n\t\theaders = append(headers, origin)\n\t}\n\tp.dl.DeliverHeaders(p.id, headers)\n\treturn nil\n}\n\n// RequestBodies implements downloader.Peer, returning a batch of block bodies\n// corresponding to the specified block hashes.\nfunc (p *FakePeer) RequestBodies(hashes []common.Hash) error {\n\tvar (\n\t\ttxs [][]*types.Transaction\n\t)\n\tfor _, hash := range hashes {\n\t\tblock := rawdb.ReadBlock(p.db, hash, *p.hc.GetBlockNumber(hash))\n\n\t\ttxs = append(txs, block.Transactions())\n\t}\n\tp.dl.DeliverBodies(p.id, txs)\n\treturn nil\n}\n\n// RequestReceipts implements downloader.Peer, returning a batch of transaction\n// receipts corresponding to the specified block hashes.\nfunc (p *FakePeer) RequestReceipts(hashes []common.Hash) error {\n\tvar receipts [][]*types.Receipt\n\tfor _, hash := range hashes {\n\t\treceipts = append(receipts, rawdb.ReadReceipts(p.db, hash, *p.hc.GetBlockNumber(hash)))\n\t}\n\tp.dl.DeliverReceipts(p.id, receipts)\n\treturn nil\n}\n\n// RequestNodeData implements downloader.Peer, returning a batch of state trie\n// nodes corresponding to the specified trie hashes.\nfunc (p *FakePeer) RequestNodeData(hashes []common.Hash) error {\n\tvar data [][]byte\n\tfor _, hash := range hashes {\n\t\tif entry, err := p.db.Get(hash.Bytes()); err == nil {\n\t\t\tdata = append(data, entry)\n\t\t}\n\t}\n\tp.dl.DeliverNodeData(p.id, data)\n\treturn nil\n}\n"
  },
  {
    "path": "sero/downloader/metrics.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the metrics collected by the downloader.\n\npackage downloader\n\nimport (\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\nvar (\n\theaderInMeter      = metrics.NewRegisteredMeter(\"sero/downloader/headers/in\", nil)\n\theaderReqTimer     = metrics.NewRegisteredTimer(\"sero/downloader/headers/req\", nil)\n\theaderDropMeter    = metrics.NewRegisteredMeter(\"sero/downloader/headers/drop\", nil)\n\theaderTimeoutMeter = metrics.NewRegisteredMeter(\"sero/downloader/headers/timeout\", nil)\n\n\tbodyInMeter      = metrics.NewRegisteredMeter(\"sero/downloader/bodies/in\", nil)\n\tbodyReqTimer     = metrics.NewRegisteredTimer(\"sero/downloader/bodies/req\", nil)\n\tbodyDropMeter    = metrics.NewRegisteredMeter(\"sero/downloader/bodies/drop\", nil)\n\tbodyTimeoutMeter = metrics.NewRegisteredMeter(\"sero/downloader/bodies/timeout\", nil)\n\n\treceiptInMeter      = metrics.NewRegisteredMeter(\"sero/downloader/receipts/in\", nil)\n\treceiptReqTimer     = metrics.NewRegisteredTimer(\"sero/downloader/receipts/req\", nil)\n\treceiptDropMeter    = metrics.NewRegisteredMeter(\"sero/downloader/receipts/drop\", nil)\n\treceiptTimeoutMeter = metrics.NewRegisteredMeter(\"sero/downloader/receipts/timeout\", nil)\n\n\tstateInMeter   = metrics.NewRegisteredMeter(\"sero/downloader/states/in\", nil)\n\tstateDropMeter = metrics.NewRegisteredMeter(\"sero/downloader/states/drop\", nil)\n)\n"
  },
  {
    "path": "sero/downloader/modes.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage downloader\n\nimport \"fmt\"\n\n// SyncMode represents the synchronisation mode of the downloader.\ntype SyncMode int\n\nconst (\n\tFullSync  SyncMode = iota // Synchronise the entire blockchain history from full blocks\n\tFastSync                  // Quickly download the headers, full sync only at the chain head\n\tLightSync                 // Download only the headers and terminate afterwards\n)\n\nfunc (mode SyncMode) IsValid() bool {\n\treturn mode >= FullSync && mode <= LightSync\n}\n\n// String implements the stringer interface.\nfunc (mode SyncMode) String() string {\n\tswitch mode {\n\tcase FullSync:\n\t\treturn \"full\"\n\tcase FastSync:\n\t\treturn \"fast\"\n\tcase LightSync:\n\t\treturn \"light\"\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\nfunc (mode SyncMode) MarshalText() ([]byte, error) {\n\tswitch mode {\n\tcase FullSync:\n\t\treturn []byte(\"full\"), nil\n\tcase FastSync:\n\t\treturn []byte(\"fast\"), nil\n\tcase LightSync:\n\t\treturn []byte(\"light\"), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unknown sync mode %d\", mode)\n\t}\n}\n\nfunc (mode *SyncMode) UnmarshalText(text []byte) error {\n\tswitch string(text) {\n\tcase \"full\":\n\t\t*mode = FullSync\n\tcase \"fast\":\n\t\t*mode = FastSync\n\tcase \"light\":\n\t\t*mode = LightSync\n\tdefault:\n\t\treturn fmt.Errorf(`unknown sync mode %q, want \"full\", \"fast\" or \"light\"`, text)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "sero/downloader/peer.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the active peer-set of the downloader, maintaining both failures\n// as well as reputation metrics to prioritize the block retrievals.\n\npackage downloader\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"sort\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nconst (\n\tmaxLackingHashes  = 4096 // Maximum number of entries allowed on the list or lacking items\n\tmeasurementImpact = 0.1  // The impact a single measurement has on a peer's final throughput value.\n)\n\nvar (\n\terrAlreadyFetching   = errors.New(\"already fetching blocks from peer\")\n\terrAlreadyRegistered = errors.New(\"peer is already registered\")\n\terrNotRegistered     = errors.New(\"peer is not registered\")\n)\n\n// peerConnection represents an active peer from which hashes and blocks are retrieved.\ntype peerConnection struct {\n\tid string // Unique identifier of the peer\n\n\theaderIdle  int32 // Current header activity state of the peer (idle = 0, active = 1)\n\tblockIdle   int32 // Current block activity state of the peer (idle = 0, active = 1)\n\treceiptIdle int32 // Current receipt activity state of the peer (idle = 0, active = 1)\n\tstateIdle   int32 // Current node data activity state of the peer (idle = 0, active = 1)\n\n\theaderThroughput  float64 // Number of headers measured to be retrievable per second\n\tblockThroughput   float64 // Number of blocks (bodies) measured to be retrievable per second\n\treceiptThroughput float64 // Number of receipts measured to be retrievable per second\n\tstateThroughput   float64 // Number of node data pieces measured to be retrievable per second\n\n\trtt time.Duration // Request round trip time to track responsiveness (QoS)\n\n\theaderStarted  time.Time // Time instance when the last header fetch was started\n\tblockStarted   time.Time // Time instance when the last block (body) fetch was started\n\treceiptStarted time.Time // Time instance when the last receipt fetch was started\n\tstateStarted   time.Time // Time instance when the last node data fetch was started\n\n\tlacking map[common.Hash]struct{} // Set of hashes not to request (didn't have previously)\n\n\tpeer Peer\n\n\tversion int        // Eth protocol version number to switch strategies\n\tlog     log.Logger // Contextual logger to add extra infos to peer logs\n\tlock    sync.RWMutex\n}\n\n// LightPeer encapsulates the methods required to synchronise with a remote light peer.\ntype LightPeer interface {\n\tHead() (common.Hash, *big.Int)\n\tRequestHeadersByHash(common.Hash, int, int, bool) error\n\tRequestHeadersByNumber(uint64, int, int, bool) error\n}\n\n// Peer encapsulates the methods required to synchronise with a remote full peer.\ntype Peer interface {\n\tLightPeer\n\tRequestBodies([]common.Hash) error\n\tRequestReceipts([]common.Hash) error\n\tRequestNodeData([]common.Hash) error\n}\n\n// lightPeerWrapper wraps a LightPeer struct, stubbing out the Peer-only methods.\ntype lightPeerWrapper struct {\n\tpeer LightPeer\n}\n\nfunc (w *lightPeerWrapper) Head() (common.Hash, *big.Int) { return w.peer.Head() }\nfunc (w *lightPeerWrapper) RequestHeadersByHash(h common.Hash, amount int, skip int, reverse bool) error {\n\treturn w.peer.RequestHeadersByHash(h, amount, skip, reverse)\n}\nfunc (w *lightPeerWrapper) RequestHeadersByNumber(i uint64, amount int, skip int, reverse bool) error {\n\treturn w.peer.RequestHeadersByNumber(i, amount, skip, reverse)\n}\nfunc (w *lightPeerWrapper) RequestBodies([]common.Hash) error {\n\tpanic(\"RequestBodies not supported in light client mode sync\")\n}\nfunc (w *lightPeerWrapper) RequestReceipts([]common.Hash) error {\n\tpanic(\"RequestReceipts not supported in light client mode sync\")\n}\nfunc (w *lightPeerWrapper) RequestNodeData([]common.Hash) error {\n\tpanic(\"RequestNodeData not supported in light client mode sync\")\n}\n\n// newPeerConnection creates a new downloader peer.\nfunc newPeerConnection(id string, version int, peer Peer, logger log.Logger) *peerConnection {\n\treturn &peerConnection{\n\t\tid:      id,\n\t\tlacking: make(map[common.Hash]struct{}),\n\n\t\tpeer: peer,\n\n\t\tversion: version,\n\t\tlog:     logger,\n\t}\n}\n\n// Reset clears the internal state of a peer entity.\nfunc (p *peerConnection) Reset() {\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\n\tatomic.StoreInt32(&p.headerIdle, 0)\n\tatomic.StoreInt32(&p.blockIdle, 0)\n\tatomic.StoreInt32(&p.receiptIdle, 0)\n\tatomic.StoreInt32(&p.stateIdle, 0)\n\n\tp.headerThroughput = 0\n\tp.blockThroughput = 0\n\tp.receiptThroughput = 0\n\tp.stateThroughput = 0\n\n\tp.lacking = make(map[common.Hash]struct{})\n}\n\n// FetchHeaders sends a header retrieval request to the remote peer.\nfunc (p *peerConnection) FetchHeaders(from uint64, count int) error {\n\t// Sanity check the protocol version\n\tif p.version < 62 {\n\t\tpanic(fmt.Sprintf(\"header fetch [sero/62+] requested on sero/%d\", p.version))\n\t}\n\t// Short circuit if the peer is already fetching\n\tif !atomic.CompareAndSwapInt32(&p.headerIdle, 0, 1) {\n\t\treturn errAlreadyFetching\n\t}\n\tp.headerStarted = time.Now()\n\n\t// Issue the header retrieval request (absolut upwards without gaps)\n\tgo p.peer.RequestHeadersByNumber(from, count, 0, false)\n\n\treturn nil\n}\n\n// FetchBodies sends a block body retrieval request to the remote peer.\nfunc (p *peerConnection) FetchBodies(request *fetchRequest) error {\n\t// Sanity check the protocol version\n\tif p.version < 62 {\n\t\tpanic(fmt.Sprintf(\"body fetch [sero/62+] requested on sero/%d\", p.version))\n\t}\n\t// Short circuit if the peer is already fetching\n\tif !atomic.CompareAndSwapInt32(&p.blockIdle, 0, 1) {\n\t\treturn errAlreadyFetching\n\t}\n\tp.blockStarted = time.Now()\n\n\t// Convert the header set to a retrievable slice\n\thashes := make([]common.Hash, 0, len(request.Headers))\n\tfor _, header := range request.Headers {\n\t\thashes = append(hashes, header.Hash())\n\t}\n\tgo p.peer.RequestBodies(hashes)\n\n\treturn nil\n}\n\n// FetchReceipts sends a receipt retrieval request to the remote peer.\nfunc (p *peerConnection) FetchReceipts(request *fetchRequest) error {\n\t// Sanity check the protocol version\n\tif p.version < 63 {\n\t\tpanic(fmt.Sprintf(\"body fetch [sero/63+] requested on sero/%d\", p.version))\n\t}\n\t// Short circuit if the peer is already fetching\n\tif !atomic.CompareAndSwapInt32(&p.receiptIdle, 0, 1) {\n\t\treturn errAlreadyFetching\n\t}\n\tp.receiptStarted = time.Now()\n\n\t// Convert the header set to a retrievable slice\n\thashes := make([]common.Hash, 0, len(request.Headers))\n\tfor _, header := range request.Headers {\n\t\thashes = append(hashes, header.Hash())\n\t}\n\tgo p.peer.RequestReceipts(hashes)\n\n\treturn nil\n}\n\n// FetchNodeData sends a node state data retrieval request to the remote peer.\nfunc (p *peerConnection) FetchNodeData(hashes []common.Hash) error {\n\t// Sanity check the protocol version\n\tif p.version < 63 {\n\t\tpanic(fmt.Sprintf(\"node data fetch [sero/63+] requested on sero/%d\", p.version))\n\t}\n\t// Short circuit if the peer is already fetching\n\tif !atomic.CompareAndSwapInt32(&p.stateIdle, 0, 1) {\n\t\treturn errAlreadyFetching\n\t}\n\tp.stateStarted = time.Now()\n\n\tgo p.peer.RequestNodeData(hashes)\n\n\treturn nil\n}\n\n// SetHeadersIdle sets the peer to idle, allowing it to execute new header retrieval\n// requests. Its estimated header retrieval throughput is updated with that measured\n// just now.\nfunc (p *peerConnection) SetHeadersIdle(delivered int) {\n\tp.setIdle(p.headerStarted, delivered, &p.headerThroughput, &p.headerIdle)\n}\n\n// SetBlocksIdle sets the peer to idle, allowing it to execute new block retrieval\n// requests. Its estimated block retrieval throughput is updated with that measured\n// just now.\nfunc (p *peerConnection) SetBlocksIdle(delivered int) {\n\tp.setIdle(p.blockStarted, delivered, &p.blockThroughput, &p.blockIdle)\n}\n\n// SetBodiesIdle sets the peer to idle, allowing it to execute block body retrieval\n// requests. Its estimated body retrieval throughput is updated with that measured\n// just now.\nfunc (p *peerConnection) SetBodiesIdle(delivered int) {\n\tp.setIdle(p.blockStarted, delivered, &p.blockThroughput, &p.blockIdle)\n}\n\n// SetReceiptsIdle sets the peer to idle, allowing it to execute new receipt\n// retrieval requests. Its estimated receipt retrieval throughput is updated\n// with that measured just now.\nfunc (p *peerConnection) SetReceiptsIdle(delivered int) {\n\tp.setIdle(p.receiptStarted, delivered, &p.receiptThroughput, &p.receiptIdle)\n}\n\n// SetNodeDataIdle sets the peer to idle, allowing it to execute new state trie\n// data retrieval requests. Its estimated state retrieval throughput is updated\n// with that measured just now.\nfunc (p *peerConnection) SetNodeDataIdle(delivered int) {\n\tp.setIdle(p.stateStarted, delivered, &p.stateThroughput, &p.stateIdle)\n}\n\n// setIdle sets the peer to idle, allowing it to execute new retrieval requests.\n// Its estimated retrieval throughput is updated with that measured just now.\nfunc (p *peerConnection) setIdle(started time.Time, delivered int, throughput *float64, idle *int32) {\n\t// Irrelevant of the scaling, make sure the peer ends up idle\n\tdefer atomic.StoreInt32(idle, 0)\n\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\n\t// If nothing was delivered (hard timeout / unavailable data), reduce throughput to minimum\n\tif delivered == 0 {\n\t\t*throughput = 0\n\t\treturn\n\t}\n\t// Otherwise update the throughput with a new measurement\n\telapsed := time.Since(started) + 1 // +1 (ns) to ensure non-zero divisor\n\tmeasured := float64(delivered) / (float64(elapsed) / float64(time.Second))\n\n\t*throughput = (1-measurementImpact)*(*throughput) + measurementImpact*measured\n\tp.rtt = time.Duration((1-measurementImpact)*float64(p.rtt) + measurementImpact*float64(elapsed))\n\n\tp.log.Trace(\"Peer throughput measurements updated\",\n\t\t\"hps\", p.headerThroughput, \"bps\", p.blockThroughput,\n\t\t\"rps\", p.receiptThroughput, \"sps\", p.stateThroughput,\n\t\t\"miss\", len(p.lacking), \"rtt\", p.rtt)\n}\n\n// HeaderCapacity retrieves the peers header download allowance based on its\n// previously discovered throughput.\nfunc (p *peerConnection) HeaderCapacity(targetRTT time.Duration) int {\n\tp.lock.RLock()\n\tdefer p.lock.RUnlock()\n\n\treturn int(math.Min(1+math.Max(1, p.headerThroughput*float64(targetRTT)/float64(time.Second)), float64(MaxHeaderFetch)))\n}\n\n// BlockCapacity retrieves the peers block download allowance based on its\n// previously discovered throughput.\nfunc (p *peerConnection) BlockCapacity(targetRTT time.Duration) int {\n\tp.lock.RLock()\n\tdefer p.lock.RUnlock()\n\n\treturn int(math.Min(1+math.Max(1, p.blockThroughput*float64(targetRTT)/float64(time.Second)), float64(MaxBlockFetch)))\n}\n\n// ReceiptCapacity retrieves the peers receipt download allowance based on its\n// previously discovered throughput.\nfunc (p *peerConnection) ReceiptCapacity(targetRTT time.Duration) int {\n\tp.lock.RLock()\n\tdefer p.lock.RUnlock()\n\n\treturn int(math.Min(1+math.Max(1, p.receiptThroughput*float64(targetRTT)/float64(time.Second)), float64(MaxReceiptFetch)))\n}\n\n// NodeDataCapacity retrieves the peers state download allowance based on its\n// previously discovered throughput.\nfunc (p *peerConnection) NodeDataCapacity(targetRTT time.Duration) int {\n\tp.lock.RLock()\n\tdefer p.lock.RUnlock()\n\n\treturn int(math.Min(1+math.Max(1, p.stateThroughput*float64(targetRTT)/float64(time.Second)), float64(MaxStateFetch)))\n}\n\n// MarkLacking appends a new entity to the set of items (blocks, receipts, states)\n// that a peer is known not to have (i.e. have been requested before). If the\n// set reaches its maximum allowed capacity, items are randomly dropped off.\nfunc (p *peerConnection) MarkLacking(hash common.Hash) {\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\n\tfor len(p.lacking) >= maxLackingHashes {\n\t\tfor drop := range p.lacking {\n\t\t\tdelete(p.lacking, drop)\n\t\t\tbreak\n\t\t}\n\t}\n\tp.lacking[hash] = struct{}{}\n}\n\n// Lacks retrieves whether the hash of a blockchain item is on the peers lacking\n// list (i.e. whether we know that the peer does not have it).\nfunc (p *peerConnection) Lacks(hash common.Hash) bool {\n\tp.lock.RLock()\n\tdefer p.lock.RUnlock()\n\n\t_, ok := p.lacking[hash]\n\treturn ok\n}\n\n// peerSet represents the collection of active peer participating in the chain\n// download procedure.\ntype peerSet struct {\n\tpeers        map[string]*peerConnection\n\tnewPeerFeed  event.Feed\n\tpeerDropFeed event.Feed\n\tlock         sync.RWMutex\n}\n\n// newPeerSet creates a new peer set top track the active download sources.\nfunc newPeerSet() *peerSet {\n\treturn &peerSet{\n\t\tpeers: make(map[string]*peerConnection),\n\t}\n}\n\n// SubscribeNewPeers subscribes to peer arrival events.\nfunc (ps *peerSet) SubscribeNewPeers(ch chan<- *peerConnection) event.Subscription {\n\treturn ps.newPeerFeed.Subscribe(ch)\n}\n\n// SubscribePeerDrops subscribes to peer departure events.\nfunc (ps *peerSet) SubscribePeerDrops(ch chan<- *peerConnection) event.Subscription {\n\treturn ps.peerDropFeed.Subscribe(ch)\n}\n\n// Reset iterates over the current peer set, and resets each of the known peers\n// to prepare for a next batch of block retrieval.\nfunc (ps *peerSet) Reset() {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tfor _, peer := range ps.peers {\n\t\tpeer.Reset()\n\t}\n}\n\n// Register injects a new peer into the working set, or returns an error if the\n// peer is already known.\n//\n// The method also sets the starting throughput values of the new peer to the\n// average of all existing peers, to give it a realistic chance of being used\n// for data retrievals.\nfunc (ps *peerSet) Register(p *peerConnection) error {\n\t// Retrieve the current median RTT as a sane default\n\tp.rtt = ps.medianRTT()\n\n\t// Register the new peer with some meaningful defaults\n\tps.lock.Lock()\n\tif _, ok := ps.peers[p.id]; ok {\n\t\tps.lock.Unlock()\n\t\treturn errAlreadyRegistered\n\t}\n\tif len(ps.peers) > 0 {\n\t\tp.headerThroughput, p.blockThroughput, p.receiptThroughput, p.stateThroughput = 0, 0, 0, 0\n\n\t\tfor _, peer := range ps.peers {\n\t\t\tpeer.lock.RLock()\n\t\t\tp.headerThroughput += peer.headerThroughput\n\t\t\tp.blockThroughput += peer.blockThroughput\n\t\t\tp.receiptThroughput += peer.receiptThroughput\n\t\t\tp.stateThroughput += peer.stateThroughput\n\t\t\tpeer.lock.RUnlock()\n\t\t}\n\t\tp.headerThroughput /= float64(len(ps.peers))\n\t\tp.blockThroughput /= float64(len(ps.peers))\n\t\tp.receiptThroughput /= float64(len(ps.peers))\n\t\tp.stateThroughput /= float64(len(ps.peers))\n\t}\n\tps.peers[p.id] = p\n\tps.lock.Unlock()\n\n\tps.newPeerFeed.Send(p)\n\treturn nil\n}\n\n// Unregister removes a remote peer from the active set, disabling any further\n// actions to/from that particular entity.\nfunc (ps *peerSet) Unregister(id string) error {\n\tps.lock.Lock()\n\tp, ok := ps.peers[id]\n\tif !ok {\n\t\tdefer ps.lock.Unlock()\n\t\treturn errNotRegistered\n\t}\n\tdelete(ps.peers, id)\n\tps.lock.Unlock()\n\n\tps.peerDropFeed.Send(p)\n\treturn nil\n}\n\n// Peer retrieves the registered peer with the given id.\nfunc (ps *peerSet) Peer(id string) *peerConnection {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\treturn ps.peers[id]\n}\n\n// Len returns if the current number of peers in the set.\nfunc (ps *peerSet) Len() int {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\treturn len(ps.peers)\n}\n\n// AllPeers retrieves a flat list of all the peers within the set.\nfunc (ps *peerSet) AllPeers() []*peerConnection {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tlist := make([]*peerConnection, 0, len(ps.peers))\n\tfor _, p := range ps.peers {\n\t\tlist = append(list, p)\n\t}\n\treturn list\n}\n\n// HeaderIdlePeers retrieves a flat list of all the currently header-idle peers\n// within the active peer set, ordered by their reputation.\nfunc (ps *peerSet) HeaderIdlePeers() ([]*peerConnection, int) {\n\tidle := func(p *peerConnection) bool {\n\t\treturn atomic.LoadInt32(&p.headerIdle) == 0\n\t}\n\tthroughput := func(p *peerConnection) float64 {\n\t\tp.lock.RLock()\n\t\tdefer p.lock.RUnlock()\n\t\treturn p.headerThroughput\n\t}\n\treturn ps.idlePeers(62, 64, idle, throughput)\n}\n\n// BodyIdlePeers retrieves a flat list of all the currently body-idle peers within\n// the active peer set, ordered by their reputation.\nfunc (ps *peerSet) BodyIdlePeers() ([]*peerConnection, int) {\n\tidle := func(p *peerConnection) bool {\n\t\treturn atomic.LoadInt32(&p.blockIdle) == 0\n\t}\n\tthroughput := func(p *peerConnection) float64 {\n\t\tp.lock.RLock()\n\t\tdefer p.lock.RUnlock()\n\t\treturn p.blockThroughput\n\t}\n\treturn ps.idlePeers(62, 64, idle, throughput)\n}\n\n// ReceiptIdlePeers retrieves a flat list of all the currently receipt-idle peers\n// within the active peer set, ordered by their reputation.\nfunc (ps *peerSet) ReceiptIdlePeers() ([]*peerConnection, int) {\n\tidle := func(p *peerConnection) bool {\n\t\treturn atomic.LoadInt32(&p.receiptIdle) == 0\n\t}\n\tthroughput := func(p *peerConnection) float64 {\n\t\tp.lock.RLock()\n\t\tdefer p.lock.RUnlock()\n\t\treturn p.receiptThroughput\n\t}\n\treturn ps.idlePeers(63, 64, idle, throughput)\n}\n\n// NodeDataIdlePeers retrieves a flat list of all the currently node-data-idle\n// peers within the active peer set, ordered by their reputation.\nfunc (ps *peerSet) NodeDataIdlePeers() ([]*peerConnection, int) {\n\tidle := func(p *peerConnection) bool {\n\t\treturn atomic.LoadInt32(&p.stateIdle) == 0\n\t}\n\tthroughput := func(p *peerConnection) float64 {\n\t\tp.lock.RLock()\n\t\tdefer p.lock.RUnlock()\n\t\treturn p.stateThroughput\n\t}\n\treturn ps.idlePeers(63, 64, idle, throughput)\n}\n\n// idlePeers retrieves a flat list of all currently idle peers satisfying the\n// protocol version constraints, using the provided function to check idleness.\n// The resulting set of peers are sorted by their measure throughput.\nfunc (ps *peerSet) idlePeers(minProtocol, maxProtocol int, idleCheck func(*peerConnection) bool, throughput func(*peerConnection) float64) ([]*peerConnection, int) {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tidle, total := make([]*peerConnection, 0, len(ps.peers)), 0\n\tfor _, p := range ps.peers {\n\t\tif p.version >= minProtocol && p.version <= maxProtocol {\n\t\t\tif idleCheck(p) {\n\t\t\t\tidle = append(idle, p)\n\t\t\t}\n\t\t\ttotal++\n\t\t}\n\t}\n\tfor i := 0; i < len(idle); i++ {\n\t\tfor j := i + 1; j < len(idle); j++ {\n\t\t\tif throughput(idle[i]) < throughput(idle[j]) {\n\t\t\t\tidle[i], idle[j] = idle[j], idle[i]\n\t\t\t}\n\t\t}\n\t}\n\treturn idle, total\n}\n\n// medianRTT returns the median RTT of the peerset, considering only the tuning\n// peers if there are more peers available.\nfunc (ps *peerSet) medianRTT() time.Duration {\n\t// Gather all the currently measured round trip times\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\trtts := make([]float64, 0, len(ps.peers))\n\tfor _, p := range ps.peers {\n\t\tp.lock.RLock()\n\t\trtts = append(rtts, float64(p.rtt))\n\t\tp.lock.RUnlock()\n\t}\n\tsort.Float64s(rtts)\n\n\tmedian := rttMaxEstimate\n\tif qosTuningPeers <= len(rtts) {\n\t\tmedian = time.Duration(rtts[qosTuningPeers/2]) // Median of our tuning peers\n\t} else if len(rtts) > 0 {\n\t\tmedian = time.Duration(rtts[len(rtts)/2]) // Median of our connected peers (maintain even like this some baseline qos)\n\t}\n\t// Restrict the RTT into some QoS defaults, irrelevant of true RTT\n\tif median < rttMinEstimate {\n\t\tmedian = rttMinEstimate\n\t}\n\tif median > rttMaxEstimate {\n\t\tmedian = rttMaxEstimate\n\t}\n\treturn median\n}\n"
  },
  {
    "path": "sero/downloader/queue.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the block download scheduler to collect download tasks and schedule\n// them in an ordered, and throttled way.\n\npackage downloader\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"gopkg.in/karalabe/cookiejar.v2/collections/prque\"\n)\n\nvar (\n\tblockCacheItems      = 8192             // Maximum number of blocks to cache before throttling the download\n\tblockCacheMemory     = 64 * 1024 * 1024 // Maximum amount of memory to use for block caching\n\tblockCacheSizeWeight = 0.1              // Multiplier to approximate the average block size based on past ones\n)\n\nvar (\n\terrNoFetchesPending = errors.New(\"no fetches pending\")\n\terrStaleDelivery    = errors.New(\"stale delivery\")\n)\n\n// fetchRequest is a currently running data retrieval operation.\ntype fetchRequest struct {\n\tPeer    *peerConnection // Peer to which the request was sent\n\tFrom    uint64          // [sero/62] Requested chain element index (used for skeleton fills only)\n\tHeaders []*types.Header // [sero/62] Requested headers, sorted by request order\n\tTime    time.Time       // Time when the request was made\n}\n\n// fetchResult is a struct collecting partial results from data fetchers until\n// all outstanding pieces complete and the result as a whole can be processed.\ntype fetchResult struct {\n\tPending int         // Number of data fetches still pending\n\tHash    common.Hash // Hash of the header to prevent recalculating\n\n\tHeader       *types.Header\n\tTransactions types.Transactions\n\tReceipts     types.Receipts\n}\n\n// queue represents hashes that are either need fetching or are being fetched\ntype queue struct {\n\tmode SyncMode // Synchronisation mode to decide on the block parts to schedule for fetching\n\n\t// Headers are \"special\", they download in batches, supported by a skeleton chain\n\theaderHead      common.Hash                    // [sero/62] Hash of the last queued header to verify order\n\theaderTaskPool  map[uint64]*types.Header       // [sero/62] Pending header retrieval tasks, mapping starting indexes to skeleton headers\n\theaderTaskQueue *prque.Prque                   // [sero/62] Priority queue of the skeleton indexes to fetch the filling headers for\n\theaderPeerMiss  map[string]map[uint64]struct{} // [sero/62] Set of per-peer header batches known to be unavailable\n\theaderPendPool  map[string]*fetchRequest       // [sero/62] Currently pending header retrieval operations\n\theaderResults   []*types.Header                // [sero/62] Result cache accumulating the completed headers\n\theaderProced    int                            // [sero/62] Number of headers already processed from the results\n\theaderOffset    uint64                         // [sero/62] Number of the first header in the result cache\n\theaderContCh    chan bool                      // [sero/62] Channel to notify when header download finishes\n\n\t// All data retrievals below are based on an already assembles header chain\n\tblockTaskPool  map[common.Hash]*types.Header // [sero/62] Pending block (body) retrieval tasks, mapping hashes to headers\n\tblockTaskQueue *prque.Prque                  // [sero/62] Priority queue of the headers to fetch the blocks (bodies) for\n\tblockPendPool  map[string]*fetchRequest      // [sero/62] Currently pending block (body) retrieval operations\n\tblockDonePool  map[common.Hash]struct{}      // [sero/62] Set of the completed block (body) fetches\n\n\treceiptTaskPool  map[common.Hash]*types.Header // [sero/63] Pending receipt retrieval tasks, mapping hashes to headers\n\treceiptTaskQueue *prque.Prque                  // [sero/63] Priority queue of the headers to fetch the receipts for\n\treceiptPendPool  map[string]*fetchRequest      // [sero/63] Currently pending receipt retrieval operations\n\treceiptDonePool  map[common.Hash]struct{}      // [sero/63] Set of the completed receipt fetches\n\n\tresultCache  []*fetchResult     // Downloaded but not yet delivered fetch results\n\tresultOffset uint64             // Offset of the first cached fetch result in the block chain\n\tresultSize   common.StorageSize // Approximate size of a block (exponential moving average)\n\n\tlock   *sync.Mutex\n\tactive *sync.Cond\n\tclosed bool\n}\n\n// newQueue creates a new download queue for scheduling block retrieval.\nfunc newQueue() *queue {\n\tlock := new(sync.Mutex)\n\treturn &queue{\n\t\theaderPendPool:   make(map[string]*fetchRequest),\n\t\theaderContCh:     make(chan bool),\n\t\tblockTaskPool:    make(map[common.Hash]*types.Header),\n\t\tblockTaskQueue:   prque.New(),\n\t\tblockPendPool:    make(map[string]*fetchRequest),\n\t\tblockDonePool:    make(map[common.Hash]struct{}),\n\t\treceiptTaskPool:  make(map[common.Hash]*types.Header),\n\t\treceiptTaskQueue: prque.New(),\n\t\treceiptPendPool:  make(map[string]*fetchRequest),\n\t\treceiptDonePool:  make(map[common.Hash]struct{}),\n\t\tresultCache:      make([]*fetchResult, blockCacheItems),\n\t\tactive:           sync.NewCond(lock),\n\t\tlock:             lock,\n\t}\n}\n\n// Reset clears out the queue contents.\nfunc (q *queue) Reset() {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\tq.closed = false\n\tq.mode = FullSync\n\n\tq.headerHead = common.Hash{}\n\tq.headerPendPool = make(map[string]*fetchRequest)\n\n\tq.blockTaskPool = make(map[common.Hash]*types.Header)\n\tq.blockTaskQueue.Reset()\n\tq.blockPendPool = make(map[string]*fetchRequest)\n\tq.blockDonePool = make(map[common.Hash]struct{})\n\n\tq.receiptTaskPool = make(map[common.Hash]*types.Header)\n\tq.receiptTaskQueue.Reset()\n\tq.receiptPendPool = make(map[string]*fetchRequest)\n\tq.receiptDonePool = make(map[common.Hash]struct{})\n\n\tq.resultCache = make([]*fetchResult, blockCacheItems)\n\tq.resultOffset = 0\n}\n\n// Close marks the end of the sync, unblocking WaitResults.\n// It may be called even if the queue is already closed.\nfunc (q *queue) Close() {\n\tq.lock.Lock()\n\tq.closed = true\n\tq.lock.Unlock()\n\tq.active.Broadcast()\n}\n\n// PendingHeaders retrieves the number of header requests pending for retrieval.\nfunc (q *queue) PendingHeaders() int {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.headerTaskQueue.Size()\n}\n\n// PendingBlocks retrieves the number of block (body) requests pending for retrieval.\nfunc (q *queue) PendingBlocks() int {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.blockTaskQueue.Size()\n}\n\n// PendingReceipts retrieves the number of block receipts pending for retrieval.\nfunc (q *queue) PendingReceipts() int {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.receiptTaskQueue.Size()\n}\n\n// InFlightHeaders retrieves whether there are header fetch requests currently\n// in flight.\nfunc (q *queue) InFlightHeaders() bool {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn len(q.headerPendPool) > 0\n}\n\n// InFlightBlocks retrieves whether there are block fetch requests currently in\n// flight.\nfunc (q *queue) InFlightBlocks() bool {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn len(q.blockPendPool) > 0\n}\n\n// InFlightReceipts retrieves whether there are receipt fetch requests currently\n// in flight.\nfunc (q *queue) InFlightReceipts() bool {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn len(q.receiptPendPool) > 0\n}\n\n// Idle returns if the queue is fully idle or has some data still inside.\nfunc (q *queue) Idle() bool {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\tqueued := q.blockTaskQueue.Size() + q.receiptTaskQueue.Size()\n\tpending := len(q.blockPendPool) + len(q.receiptPendPool)\n\tcached := len(q.blockDonePool) + len(q.receiptDonePool)\n\n\treturn (queued + pending + cached) == 0\n}\n\n// ShouldThrottleBlocks checks if the download should be throttled (active block (body)\n// fetches exceed block cache).\nfunc (q *queue) ShouldThrottleBlocks() bool {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.resultSlots(q.blockPendPool, q.blockDonePool) <= 0\n}\n\n// ShouldThrottleReceipts checks if the download should be throttled (active receipt\n// fetches exceed block cache).\nfunc (q *queue) ShouldThrottleReceipts() bool {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.resultSlots(q.receiptPendPool, q.receiptDonePool) <= 0\n}\n\n// resultSlots calculates the number of results slots available for requests\n// whilst adhering to both the item and the memory limit too of the results\n// cache.\nfunc (q *queue) resultSlots(pendPool map[string]*fetchRequest, donePool map[common.Hash]struct{}) int {\n\t// Calculate the maximum length capped by the memory limit\n\tlimit := len(q.resultCache)\n\tif common.StorageSize(len(q.resultCache))*q.resultSize > common.StorageSize(blockCacheMemory) {\n\t\tlimit = int((common.StorageSize(blockCacheMemory) + q.resultSize - 1) / q.resultSize)\n\t}\n\t// Calculate the number of slots already finished\n\tfinished := 0\n\tfor _, result := range q.resultCache[:limit] {\n\t\tif result == nil {\n\t\t\tbreak\n\t\t}\n\t\tif _, ok := donePool[result.Hash]; ok {\n\t\t\tfinished++\n\t\t}\n\t}\n\t// Calculate the number of slots currently downloading\n\tpending := 0\n\tfor _, request := range pendPool {\n\t\tfor _, header := range request.Headers {\n\t\t\tif header.Number.Uint64() < q.resultOffset+uint64(limit) {\n\t\t\t\tpending++\n\t\t\t}\n\t\t}\n\t}\n\t// Return the free slots to distribute\n\treturn limit - finished - pending\n}\n\n// ScheduleSkeleton adds a batch of header retrieval tasks to the queue to fill\n// up an already retrieved header skeleton.\nfunc (q *queue) ScheduleSkeleton(from uint64, skeleton []*types.Header) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\t// No skeleton retrieval can be in progress, fail hard if so (huge implementation bug)\n\tif q.headerResults != nil {\n\t\tpanic(\"skeleton assembly already in progress\")\n\t}\n\t// Schedule all the header retrieval tasks for the skeleton assembly\n\tq.headerTaskPool = make(map[uint64]*types.Header)\n\tq.headerTaskQueue = prque.New()\n\tq.headerPeerMiss = make(map[string]map[uint64]struct{}) // Reset availability to correct invalid chains\n\tq.headerResults = make([]*types.Header, len(skeleton)*MaxHeaderFetch)\n\tq.headerProced = 0\n\tq.headerOffset = from\n\tq.headerContCh = make(chan bool, 1)\n\n\tfor i, header := range skeleton {\n\t\tindex := from + uint64(i*MaxHeaderFetch)\n\n\t\tq.headerTaskPool[index] = header\n\t\tq.headerTaskQueue.Push(index, -float32(index))\n\t}\n}\n\n// RetrieveHeaders retrieves the header chain assemble based on the scheduled\n// skeleton.\nfunc (q *queue) RetrieveHeaders() ([]*types.Header, int) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\theaders, proced := q.headerResults, q.headerProced\n\tq.headerResults, q.headerProced = nil, 0\n\n\treturn headers, proced\n}\n\n// Schedule adds a set of headers for the download queue for scheduling, returning\n// the new headers encountered.\nfunc (q *queue) Schedule(headers []*types.Header, from uint64) []*types.Header {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\t// Insert all the headers prioritised by the contained block number\n\tinserts := make([]*types.Header, 0, len(headers))\n\tfor _, header := range headers {\n\t\t// Make sure chain order is honoured and preserved throughout\n\t\thash := header.Hash()\n\t\tif header.Number == nil || header.Number.Uint64() != from {\n\t\t\tlog.Warn(\"Header broke chain ordering\", \"number\", header.Number, \"hash\", hash, \"expected\", from)\n\t\t\tbreak\n\t\t}\n\t\tif q.headerHead != (common.Hash{}) && q.headerHead != header.ParentHash {\n\t\t\tlog.Warn(\"Header broke chain ancestry\", \"number\", header.Number, \"hash\", hash)\n\t\t\tbreak\n\t\t}\n\t\t// Make sure no duplicate requests are executed\n\t\tif _, ok := q.blockTaskPool[hash]; ok {\n\t\t\tlog.Warn(\"Header  already scheduled for block fetch\", \"number\", header.Number, \"hash\", hash)\n\t\t\tcontinue\n\t\t}\n\t\tif _, ok := q.receiptTaskPool[hash]; ok {\n\t\t\tlog.Warn(\"Header already scheduled for receipt fetch\", \"number\", header.Number, \"hash\", hash)\n\t\t\tcontinue\n\t\t}\n\t\t// Queue the header for content retrieval\n\t\tq.blockTaskPool[hash] = header\n\t\tq.blockTaskQueue.Push(header, -float32(header.Number.Uint64()))\n\n\t\tif q.mode == FastSync {\n\t\t\tq.receiptTaskPool[hash] = header\n\t\t\tq.receiptTaskQueue.Push(header, -float32(header.Number.Uint64()))\n\t\t}\n\t\tinserts = append(inserts, header)\n\t\tq.headerHead = hash\n\t\tfrom++\n\t}\n\treturn inserts\n}\n\n// Results retrieves and permanently removes a batch of fetch results from\n// the cache. the result slice will be empty if the queue has been closed.\nfunc (q *queue) Results(block bool) []*fetchResult {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\t// Count the number of items available for processing\n\tnproc := q.countProcessableItems()\n\tfor nproc == 0 && !q.closed {\n\t\tif !block {\n\t\t\treturn nil\n\t\t}\n\t\tq.active.Wait()\n\t\tnproc = q.countProcessableItems()\n\t}\n\t// Since we have a batch limit, don't pull more into \"dangling\" memory\n\tif nproc > maxResultsProcess {\n\t\tnproc = maxResultsProcess\n\t}\n\tresults := make([]*fetchResult, nproc)\n\tcopy(results, q.resultCache[:nproc])\n\tif len(results) > 0 {\n\t\t// Mark results as done before dropping them from the cache.\n\t\tfor _, result := range results {\n\t\t\thash := result.Header.Hash()\n\t\t\tdelete(q.blockDonePool, hash)\n\t\t\tdelete(q.receiptDonePool, hash)\n\t\t}\n\t\t// Delete the results from the cache and clear the tail.\n\t\tcopy(q.resultCache, q.resultCache[nproc:])\n\t\tfor i := len(q.resultCache) - nproc; i < len(q.resultCache); i++ {\n\t\t\tq.resultCache[i] = nil\n\t\t}\n\t\t// Advance the expected block number of the first cache entry.\n\t\tq.resultOffset += uint64(nproc)\n\n\t\t// Recalculate the result item weights to prevent memory exhaustion\n\t\tfor _, result := range results {\n\t\t\tsize := result.Header.Size()\n\t\t\tfor _, receipt := range result.Receipts {\n\t\t\t\tsize += receipt.Size()\n\t\t\t}\n\t\t\tfor _, tx := range result.Transactions {\n\t\t\t\tsize += tx.Size()\n\t\t\t}\n\t\t\tq.resultSize = common.StorageSize(blockCacheSizeWeight)*size + (1-common.StorageSize(blockCacheSizeWeight))*q.resultSize\n\t\t}\n\t}\n\treturn results\n}\n\n// countProcessableItems counts the processable items.\nfunc (q *queue) countProcessableItems() int {\n\tfor i, result := range q.resultCache {\n\t\tif result == nil || result.Pending > 0 {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn len(q.resultCache)\n}\n\n// ReserveHeaders reserves a set of headers for the given peer, skipping any\n// previously failed batches.\nfunc (q *queue) ReserveHeaders(p *peerConnection, count int) *fetchRequest {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\t// Short circuit if the peer's already downloading something (sanity check to\n\t// not corrupt state)\n\tif _, ok := q.headerPendPool[p.id]; ok {\n\t\treturn nil\n\t}\n\t// Retrieve a batch of hashes, skipping previously failed ones\n\tsend, skip := uint64(0), []uint64{}\n\tfor send == 0 && !q.headerTaskQueue.Empty() {\n\t\tfrom, _ := q.headerTaskQueue.Pop()\n\t\tif q.headerPeerMiss[p.id] != nil {\n\t\t\tif _, ok := q.headerPeerMiss[p.id][from.(uint64)]; ok {\n\t\t\t\tskip = append(skip, from.(uint64))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tsend = from.(uint64)\n\t}\n\t// Merge all the skipped batches back\n\tfor _, from := range skip {\n\t\tq.headerTaskQueue.Push(from, -float32(from))\n\t}\n\t// Assemble and return the block download request\n\tif send == 0 {\n\t\treturn nil\n\t}\n\trequest := &fetchRequest{\n\t\tPeer: p,\n\t\tFrom: send,\n\t\tTime: time.Now(),\n\t}\n\tq.headerPendPool[p.id] = request\n\treturn request\n}\n\n// ReserveBodies reserves a set of body fetches for the given peer, skipping any\n// previously failed downloads. Beside the next batch of needed fetches, it also\n// returns a flag whether empty blocks were queued requiring processing.\nfunc (q *queue) ReserveBodies(p *peerConnection, count int) (*fetchRequest, bool, error) {\n\tisNoop := func(header *types.Header) bool {\n\t\treturn header.TxHash == types.EmptyRootHash\n\t}\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.reserveHeaders(p, count, q.blockTaskPool, q.blockTaskQueue, q.blockPendPool, q.blockDonePool, isNoop)\n}\n\n// ReserveReceipts reserves a set of receipt fetches for the given peer, skipping\n// any previously failed downloads. Beside the next batch of needed fetches, it\n// also returns a flag whether empty receipts were queued requiring importing.\nfunc (q *queue) ReserveReceipts(p *peerConnection, count int) (*fetchRequest, bool, error) {\n\tisNoop := func(header *types.Header) bool {\n\t\treturn header.ReceiptHash == types.EmptyRootHash\n\t}\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.reserveHeaders(p, count, q.receiptTaskPool, q.receiptTaskQueue, q.receiptPendPool, q.receiptDonePool, isNoop)\n}\n\n// reserveHeaders reserves a set of data download operations for a given peer,\n// skipping any previously failed ones. This method is a generic version used\n// by the individual special reservation functions.\n//\n// Note, this method expects the queue lock to be already held for writing. The\n// reason the lock is not obtained in here is because the parameters already need\n// to access the queue, so they already need a lock anyway.\nfunc (q *queue) reserveHeaders(p *peerConnection, count int, taskPool map[common.Hash]*types.Header, taskQueue *prque.Prque,\n\tpendPool map[string]*fetchRequest, donePool map[common.Hash]struct{}, isNoop func(*types.Header) bool) (*fetchRequest, bool, error) {\n\t// Short circuit if the pool has been depleted, or if the peer's already\n\t// downloading something (sanity check not to corrupt state)\n\tif taskQueue.Empty() {\n\t\treturn nil, false, nil\n\t}\n\tif _, ok := pendPool[p.id]; ok {\n\t\treturn nil, false, nil\n\t}\n\t// Calculate an upper limit on the items we might fetch (i.e. throttling)\n\tspace := q.resultSlots(pendPool, donePool)\n\n\t// Retrieve a batch of tasks, skipping previously failed ones\n\tsend := make([]*types.Header, 0, count)\n\tskip := make([]*types.Header, 0)\n\n\tprogress := false\n\tfor proc := 0; proc < space && len(send) < count && !taskQueue.Empty(); proc++ {\n\t\theader := taskQueue.PopItem().(*types.Header)\n\t\thash := header.Hash()\n\n\t\t// If we're the first to request this task, initialise the result container\n\t\tindex := int(header.Number.Int64() - int64(q.resultOffset))\n\t\tif index >= len(q.resultCache) || index < 0 {\n\t\t\tcommon.Report(\"index allocation went beyond available resultCache space\")\n\t\t\treturn nil, false, errInvalidChain\n\t\t}\n\t\tif q.resultCache[index] == nil {\n\t\t\tcomponents := 1\n\t\t\tif q.mode == FastSync {\n\t\t\t\tcomponents = 2\n\t\t\t}\n\t\t\tq.resultCache[index] = &fetchResult{\n\t\t\t\tPending: components,\n\t\t\t\tHash:    hash,\n\t\t\t\tHeader:  header,\n\t\t\t}\n\t\t}\n\t\t// If this fetch task is a noop, skip this fetch operation\n\t\tif isNoop(header) {\n\t\t\tdonePool[hash] = struct{}{}\n\t\t\tdelete(taskPool, hash)\n\n\t\t\tspace, proc = space-1, proc-1\n\t\t\tq.resultCache[index].Pending--\n\t\t\tprogress = true\n\t\t\tcontinue\n\t\t}\n\t\t// Otherwise unless the peer is known not to have the data, add to the retrieve list\n\t\tif p.Lacks(hash) {\n\t\t\tskip = append(skip, header)\n\t\t} else {\n\t\t\tsend = append(send, header)\n\t\t}\n\t}\n\t// Merge all the skipped headers back\n\tfor _, header := range skip {\n\t\ttaskQueue.Push(header, -float32(header.Number.Uint64()))\n\t}\n\tif progress {\n\t\t// Wake WaitResults, resultCache was modified\n\t\tq.active.Signal()\n\t}\n\t// Assemble and return the block download request\n\tif len(send) == 0 {\n\t\treturn nil, progress, nil\n\t}\n\trequest := &fetchRequest{\n\t\tPeer:    p,\n\t\tHeaders: send,\n\t\tTime:    time.Now(),\n\t}\n\tpendPool[p.id] = request\n\n\treturn request, progress, nil\n}\n\n// CancelHeaders aborts a fetch request, returning all pending skeleton indexes to the queue.\nfunc (q *queue) CancelHeaders(request *fetchRequest) {\n\tq.cancel(request, q.headerTaskQueue, q.headerPendPool)\n}\n\n// CancelBodies aborts a body fetch request, returning all pending headers to the\n// task queue.\nfunc (q *queue) CancelBodies(request *fetchRequest) {\n\tq.cancel(request, q.blockTaskQueue, q.blockPendPool)\n}\n\n// CancelReceipts aborts a body fetch request, returning all pending headers to\n// the task queue.\nfunc (q *queue) CancelReceipts(request *fetchRequest) {\n\tq.cancel(request, q.receiptTaskQueue, q.receiptPendPool)\n}\n\n// Cancel aborts a fetch request, returning all pending hashes to the task queue.\nfunc (q *queue) cancel(request *fetchRequest, taskQueue *prque.Prque, pendPool map[string]*fetchRequest) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\tif request.From > 0 {\n\t\ttaskQueue.Push(request.From, -float32(request.From))\n\t}\n\tfor _, header := range request.Headers {\n\t\ttaskQueue.Push(header, -float32(header.Number.Uint64()))\n\t}\n\tdelete(pendPool, request.Peer.id)\n}\n\n// Revoke cancels all pending requests belonging to a given peer. This method is\n// meant to be called during a peer drop to quickly reassign owned data fetches\n// to remaining nodes.\nfunc (q *queue) Revoke(peerID string) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\tif request, ok := q.blockPendPool[peerID]; ok {\n\t\tfor _, header := range request.Headers {\n\t\t\tq.blockTaskQueue.Push(header, -float32(header.Number.Uint64()))\n\t\t}\n\t\tdelete(q.blockPendPool, peerID)\n\t}\n\tif request, ok := q.receiptPendPool[peerID]; ok {\n\t\tfor _, header := range request.Headers {\n\t\t\tq.receiptTaskQueue.Push(header, -float32(header.Number.Uint64()))\n\t\t}\n\t\tdelete(q.receiptPendPool, peerID)\n\t}\n}\n\n// ExpireHeaders checks for in flight requests that exceeded a timeout allowance,\n// canceling them and returning the responsible peers for penalisation.\nfunc (q *queue) ExpireHeaders(timeout time.Duration) map[string]int {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.expire(timeout, q.headerPendPool, q.headerTaskQueue, headerTimeoutMeter)\n}\n\n// ExpireBodies checks for in flight block body requests that exceeded a timeout\n// allowance, canceling them and returning the responsible peers for penalisation.\nfunc (q *queue) ExpireBodies(timeout time.Duration) map[string]int {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.expire(timeout, q.blockPendPool, q.blockTaskQueue, bodyTimeoutMeter)\n}\n\n// ExpireReceipts checks for in flight receipt requests that exceeded a timeout\n// allowance, canceling them and returning the responsible peers for penalisation.\nfunc (q *queue) ExpireReceipts(timeout time.Duration) map[string]int {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treturn q.expire(timeout, q.receiptPendPool, q.receiptTaskQueue, receiptTimeoutMeter)\n}\n\n// expire is the generic check that move expired tasks from a pending pool back\n// into a task pool, returning all entities caught with expired tasks.\n//\n// Note, this method expects the queue lock to be already held. The\n// reason the lock is not obtained in here is because the parameters already need\n// to access the queue, so they already need a lock anyway.\nfunc (q *queue) expire(timeout time.Duration, pendPool map[string]*fetchRequest, taskQueue *prque.Prque, timeoutMeter metrics.Meter) map[string]int {\n\t// Iterate over the expired requests and return each to the queue\n\texpiries := make(map[string]int)\n\tfor id, request := range pendPool {\n\t\tif time.Since(request.Time) > timeout {\n\t\t\t// Update the metrics with the timeout\n\t\t\ttimeoutMeter.Mark(1)\n\n\t\t\t// Return any non satisfied requests to the pool\n\t\t\tif request.From > 0 {\n\t\t\t\ttaskQueue.Push(request.From, -float32(request.From))\n\t\t\t}\n\t\t\tfor _, header := range request.Headers {\n\t\t\t\ttaskQueue.Push(header, -float32(header.Number.Uint64()))\n\t\t\t}\n\t\t\t// Add the peer to the expiry report along the the number of failed requests\n\t\t\texpiries[id] = len(request.Headers)\n\t\t}\n\t}\n\t// Remove the expired requests from the pending pool\n\tfor id := range expiries {\n\t\tdelete(pendPool, id)\n\t}\n\treturn expiries\n}\n\n// DeliverHeaders injects a header retrieval response into the header results\n// cache. This method either accepts all headers it received, or none of them\n// if they do not map correctly to the skeleton.\n//\n// If the headers are accepted, the method makes an attempt to deliver the set\n// of ready headers to the processor to keep the pipeline full. However it will\n// not block to prevent stalling other pending deliveries.\nfunc (q *queue) DeliverHeaders(id string, headers []*types.Header, headerProcCh chan []*types.Header) (int, error) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\t// Short circuit if the data was never requested\n\trequest := q.headerPendPool[id]\n\tif request == nil {\n\t\treturn 0, errNoFetchesPending\n\t}\n\theaderReqTimer.UpdateSince(request.Time)\n\tdelete(q.headerPendPool, id)\n\n\t// Ensure headers can be mapped onto the skeleton chain\n\ttarget := q.headerTaskPool[request.From].Hash()\n\n\taccepted := len(headers) == MaxHeaderFetch\n\tif accepted {\n\t\tif headers[0].Number.Uint64() != request.From {\n\t\t\tlog.Trace(\"First header broke chain ordering\", \"peer\", id, \"number\", headers[0].Number, \"hash\", headers[0].Hash(), request.From)\n\t\t\taccepted = false\n\t\t} else if headers[len(headers)-1].Hash() != target {\n\t\t\tlog.Trace(\"Last header broke skeleton structure \", \"peer\", id, \"number\", headers[len(headers)-1].Number, \"hash\", headers[len(headers)-1].Hash(), \"expected\", target)\n\t\t\taccepted = false\n\t\t}\n\t}\n\tif accepted {\n\t\tfor i, header := range headers[1:] {\n\t\t\thash := header.Hash()\n\t\t\tif want := request.From + 1 + uint64(i); header.Number.Uint64() != want {\n\t\t\t\tlog.Warn(\"Header broke chain ordering\", \"peer\", id, \"number\", header.Number, \"hash\", hash, \"expected\", want)\n\t\t\t\taccepted = false\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif headers[i].Hash() != header.ParentHash {\n\t\t\t\tlog.Warn(\"Header broke chain ancestry\", \"peer\", id, \"number\", header.Number, \"hash\", hash)\n\t\t\t\taccepted = false\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\t// If the batch of headers wasn't accepted, mark as unavailable\n\tif !accepted {\n\t\tlog.Trace(\"Skeleton filling not accepted\", \"peer\", id, \"from\", request.From)\n\n\t\tmiss := q.headerPeerMiss[id]\n\t\tif miss == nil {\n\t\t\tq.headerPeerMiss[id] = make(map[uint64]struct{})\n\t\t\tmiss = q.headerPeerMiss[id]\n\t\t}\n\t\tmiss[request.From] = struct{}{}\n\n\t\tq.headerTaskQueue.Push(request.From, -float32(request.From))\n\t\treturn 0, errors.New(\"delivery not accepted\")\n\t}\n\t// Clean up a successful fetch and try to deliver any sub-results\n\tcopy(q.headerResults[request.From-q.headerOffset:], headers)\n\tdelete(q.headerTaskPool, request.From)\n\n\tready := 0\n\tfor q.headerProced+ready < len(q.headerResults) && q.headerResults[q.headerProced+ready] != nil {\n\t\tready += MaxHeaderFetch\n\t}\n\tif ready > 0 {\n\t\t// Headers are ready for delivery, gather them and push forward (non blocking)\n\t\tprocess := make([]*types.Header, ready)\n\t\tcopy(process, q.headerResults[q.headerProced:q.headerProced+ready])\n\n\t\tselect {\n\t\tcase headerProcCh <- process:\n\t\t\tlog.Trace(\"Pre-scheduled new headers\", \"peer\", id, \"count\", len(process), \"from\", process[0].Number)\n\t\t\tq.headerProced += len(process)\n\t\tdefault:\n\t\t}\n\t}\n\t// Check for termination and return\n\tif len(q.headerTaskPool) == 0 {\n\t\tq.headerContCh <- false\n\t}\n\treturn len(headers), nil\n}\n\n// DeliverBodies injects a block body retrieval response into the results queue.\n// The method returns the number of blocks bodies accepted from the delivery and\n// also wakes any threads waiting for data delivery.\nfunc (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction) (int, error) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treconstruct := func(header *types.Header, index int, result *fetchResult) error {\n\t\tif types.DeriveSha(types.Transactions(txLists[index])) != header.TxHash {\n\t\t\treturn errInvalidBody\n\t\t}\n\t\tresult.Transactions = txLists[index]\n\t\treturn nil\n\t}\n\treturn q.deliver(id, q.blockTaskPool, q.blockTaskQueue, q.blockPendPool, q.blockDonePool, bodyReqTimer, len(txLists), reconstruct)\n}\n\n// DeliverReceipts injects a receipt retrieval response into the results queue.\n// The method returns the number of transaction receipts accepted from the delivery\n// and also wakes any threads waiting for data delivery.\nfunc (q *queue) DeliverReceipts(id string, receiptList [][]*types.Receipt) (int, error) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\treconstruct := func(header *types.Header, index int, result *fetchResult) error {\n\t\tif types.DeriveSha(types.Receipts(receiptList[index])) != header.ReceiptHash {\n\t\t\treturn errInvalidReceipt\n\t\t}\n\t\tresult.Receipts = receiptList[index]\n\t\treturn nil\n\t}\n\treturn q.deliver(id, q.receiptTaskPool, q.receiptTaskQueue, q.receiptPendPool, q.receiptDonePool, receiptReqTimer, len(receiptList), reconstruct)\n}\n\n// deliver injects a data retrieval response into the results queue.\n//\n// Note, this method expects the queue lock to be already held for writing. The\n// reason the lock is not obtained in here is because the parameters already need\n// to access the queue, so they already need a lock anyway.\nfunc (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header, taskQueue *prque.Prque,\n\tpendPool map[string]*fetchRequest, donePool map[common.Hash]struct{}, reqTimer metrics.Timer,\n\tresults int, reconstruct func(header *types.Header, index int, result *fetchResult) error) (int, error) {\n\n\t// Short circuit if the data was never requested\n\trequest := pendPool[id]\n\tif request == nil {\n\t\treturn 0, errNoFetchesPending\n\t}\n\treqTimer.UpdateSince(request.Time)\n\tdelete(pendPool, id)\n\n\t// If no data items were retrieved, mark them as unavailable for the origin peer\n\tif results == 0 {\n\t\tfor _, header := range request.Headers {\n\t\t\trequest.Peer.MarkLacking(header.Hash())\n\t\t}\n\t}\n\t// Assemble each of the results with their headers and retrieved data parts\n\tvar (\n\t\taccepted int\n\t\tfailure  error\n\t\tuseful   bool\n\t)\n\tfor i, header := range request.Headers {\n\t\t// Short circuit assembly if no more fetch results are found\n\t\tif i >= results {\n\t\t\tbreak\n\t\t}\n\t\t// Reconstruct the next result if contents match up\n\t\tindex := int(header.Number.Int64() - int64(q.resultOffset))\n\t\tif index >= len(q.resultCache) || index < 0 || q.resultCache[index] == nil {\n\t\t\tfailure = errInvalidChain\n\t\t\tbreak\n\t\t}\n\t\tif err := reconstruct(header, i, q.resultCache[index]); err != nil {\n\t\t\tfailure = err\n\t\t\tbreak\n\t\t}\n\t\thash := header.Hash()\n\n\t\tdonePool[hash] = struct{}{}\n\t\tq.resultCache[index].Pending--\n\t\tuseful = true\n\t\taccepted++\n\n\t\t// Clean up a successful fetch\n\t\trequest.Headers[i] = nil\n\t\tdelete(taskPool, hash)\n\t}\n\t// Return all failed or missing fetches to the queue\n\tfor _, header := range request.Headers {\n\t\tif header != nil {\n\t\t\ttaskQueue.Push(header, -float32(header.Number.Uint64()))\n\t\t}\n\t}\n\t// Wake up WaitResults\n\tif accepted > 0 {\n\t\tq.active.Signal()\n\t}\n\t// If none of the data was good, it's a stale delivery\n\tswitch {\n\tcase failure == nil || failure == errInvalidChain:\n\t\treturn accepted, failure\n\tcase useful:\n\t\treturn accepted, fmt.Errorf(\"partial failure: %v\", failure)\n\tdefault:\n\t\treturn accepted, errStaleDelivery\n\t}\n}\n\n// Prepare configures the result cache to allow accepting and caching inbound\n// fetch results.\nfunc (q *queue) Prepare(offset uint64, mode SyncMode) {\n\tq.lock.Lock()\n\tdefer q.lock.Unlock()\n\n\t// Prepare the queue for sync results\n\tif q.resultOffset < offset {\n\t\tq.resultOffset = offset\n\t}\n\tq.mode = mode\n}\n"
  },
  {
    "path": "sero/downloader/statesync.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage downloader\n\nimport (\n\t\"fmt\"\n\t\"hash\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/trie\"\n)\n\n// stateReq represents a batch of state fetch requests grouped together into\n// a single data retrieval network packet.\ntype stateReq struct {\n\titems    []common.Hash              // Hashes of the state items to download\n\ttasks    map[common.Hash]*stateTask // Download tasks to track previous attempts\n\ttimeout  time.Duration              // Maximum round trip time for this to complete\n\ttimer    *time.Timer                // Timer to fire when the RTT timeout expires\n\tpeer     *peerConnection            // Peer that we're requesting from\n\tresponse [][]byte                   // Response data of the peer (nil for timeouts)\n\tdropped  bool                       // Flag whether the peer dropped off early\n}\n\n// timedOut returns if this request timed out.\nfunc (req *stateReq) timedOut() bool {\n\treturn req.response == nil\n}\n\n// stateSyncStats is a collection of progress stats to report during a state trie\n// sync to RPC requests as well as to display in user logs.\ntype stateSyncStats struct {\n\tprocessed  uint64 // Number of state entries processed\n\tduplicate  uint64 // Number of state entries downloaded twice\n\tunexpected uint64 // Number of non-requested state entries received\n\tpending    uint64 // Number of still pending state entries\n}\n\n// syncState starts downloading state with the given root hash.\nfunc (d *Downloader) syncState(root common.Hash) *stateSync {\n\ts := newStateSync(d, root)\n\tselect {\n\tcase d.stateSyncStart <- s:\n\tcase <-d.quitCh:\n\t\ts.err = errCancelStateFetch\n\t\tclose(s.done)\n\t}\n\treturn s\n}\n\n// stateFetcher manages the active state sync and accepts requests\n// on its behalf.\nfunc (d *Downloader) stateFetcher() {\n\tfor {\n\t\tselect {\n\t\tcase s := <-d.stateSyncStart:\n\t\t\tfor next := s; next != nil; {\n\t\t\t\tnext = d.runStateSync(next)\n\t\t\t}\n\t\tcase <-d.stateCh:\n\t\t\t// Ignore state responses while no sync is running.\n\t\tcase <-d.quitCh:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// runStateSync runs a state synchronisation until it completes or another root\n// hash is requested to be switched over to.\nfunc (d *Downloader) runStateSync(s *stateSync) *stateSync {\n\tvar (\n\t\tactive   = make(map[string]*stateReq) // Currently in-flight requests\n\t\tfinished []*stateReq                  // Completed or failed requests\n\t\ttimeout  = make(chan *stateReq)       // Timed out active requests\n\t)\n\tdefer func() {\n\t\t// Cancel active request timers on exit. Also set peers to idle so they're\n\t\t// available for the next sync.\n\t\tfor _, req := range active {\n\t\t\treq.timer.Stop()\n\t\t\treq.peer.SetNodeDataIdle(len(req.items))\n\t\t}\n\t}()\n\t// Run the state sync.\n\tgo s.run()\n\tdefer s.Cancel()\n\n\t// Listen for peer departure events to cancel assigned tasks\n\tpeerDrop := make(chan *peerConnection, 1024)\n\tpeerSub := s.d.peers.SubscribePeerDrops(peerDrop)\n\tdefer peerSub.Unsubscribe()\n\n\tfor {\n\t\t// Enable sending of the first buffered element if there is one.\n\t\tvar (\n\t\t\tdeliverReq   *stateReq\n\t\t\tdeliverReqCh chan *stateReq\n\t\t)\n\t\tif len(finished) > 0 {\n\t\t\tdeliverReq = finished[0]\n\t\t\tdeliverReqCh = s.deliver\n\t\t}\n\n\t\tselect {\n\t\t// The stateSync lifecycle:\n\t\tcase next := <-d.stateSyncStart:\n\t\t\treturn next\n\n\t\tcase <-s.done:\n\t\t\treturn nil\n\n\t\t// Send the next finished request to the current sync:\n\t\tcase deliverReqCh <- deliverReq:\n\t\t\t// Shift out the first request, but also set the emptied slot to nil for GC\n\t\t\tcopy(finished, finished[1:])\n\t\t\tfinished[len(finished)-1] = nil\n\t\t\tfinished = finished[:len(finished)-1]\n\n\t\t// Handle incoming state packs:\n\t\tcase pack := <-d.stateCh:\n\t\t\t// Discard any data not requested (or previously timed out)\n\t\t\treq := active[pack.PeerId()]\n\t\t\tif req == nil {\n\t\t\t\tlog.Debug(\"Unrequested node data\", \"peer\", pack.PeerId(), \"len\", pack.Items())\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Finalize the request and queue up for processing\n\t\t\treq.timer.Stop()\n\t\t\treq.response = pack.(*statePack).states\n\n\t\t\tfinished = append(finished, req)\n\t\t\tdelete(active, pack.PeerId())\n\n\t\t\t// Handle dropped peer connections:\n\t\tcase p := <-peerDrop:\n\t\t\t// Skip if no request is currently pending\n\t\t\treq := active[p.id]\n\t\t\tif req == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Finalize the request and queue up for processing\n\t\t\treq.timer.Stop()\n\t\t\treq.dropped = true\n\n\t\t\tfinished = append(finished, req)\n\t\t\tdelete(active, p.id)\n\n\t\t// Handle timed-out requests:\n\t\tcase req := <-timeout:\n\t\t\t// If the peer is already requesting something else, ignore the stale timeout.\n\t\t\t// This can happen when the timeout and the delivery happens simultaneously,\n\t\t\t// causing both pathways to trigger.\n\t\t\tif active[req.peer.id] != req {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Move the timed out data back into the download queue\n\t\t\tfinished = append(finished, req)\n\t\t\tdelete(active, req.peer.id)\n\n\t\t// Track outgoing state requests:\n\t\tcase req := <-d.trackStateReq:\n\t\t\t// If an active request already exists for this peer, we have a problem. In\n\t\t\t// theory the trie node schedule must never assign two requests to the same\n\t\t\t// peer. In practice however, a peer might receive a request, disconnect and\n\t\t\t// immediately reconnect before the previous times out. In this case the first\n\t\t\t// request is never honored, alas we must not silently overwrite it, as that\n\t\t\t// causes valid requests to go missing and sync to get stuck.\n\t\t\tif old := active[req.peer.id]; old != nil {\n\t\t\t\tlog.Warn(\"Busy peer assigned new state fetch\", \"peer\", old.peer.id)\n\n\t\t\t\t// Make sure the previous one doesn't get siletly lost\n\t\t\t\told.timer.Stop()\n\t\t\t\told.dropped = true\n\n\t\t\t\tfinished = append(finished, old)\n\t\t\t}\n\t\t\t// Start a timer to notify the sync loop if the peer stalled.\n\t\t\treq.timer = time.AfterFunc(req.timeout, func() {\n\t\t\t\tselect {\n\t\t\t\tcase timeout <- req:\n\t\t\t\tcase <-s.done:\n\t\t\t\t\t// Prevent leaking of timer goroutines in the unlikely case where a\n\t\t\t\t\t// timer is fired just before exiting runStateSync.\n\t\t\t\t}\n\t\t\t})\n\t\t\tactive[req.peer.id] = req\n\t\t}\n\t}\n}\n\n// stateSync schedules requests for downloading a particular state trie defined\n// by a given state root.\ntype stateSync struct {\n\td *Downloader // Downloader instance to access and manage current peerset\n\n\tsched  *trie.Sync                 // State trie sync scheduler defining the tasks\n\tkeccak hash.Hash                  // Keccak256 hasher to verify deliveries with\n\ttasks  map[common.Hash]*stateTask // Set of tasks currently queued for retrieval\n\n\tnumUncommitted   int\n\tbytesUncommitted int\n\n\tdeliver    chan *stateReq // Delivery channel multiplexing peer responses\n\tcancel     chan struct{}  // Channel to signal a termination request\n\tcancelOnce sync.Once      // Ensures cancel only ever gets called once\n\tdone       chan struct{}  // Channel to signal termination completion\n\terr        error          // Any error hit during sync (set before completion)\n}\n\n// stateTask represents a single trie node download task, containing a set of\n// peers already attempted retrieval from to detect stalled syncs and abort.\ntype stateTask struct {\n\tattempts map[string]struct{}\n}\n\n// newStateSync creates a new state trie download scheduler. This method does not\n// yet start the sync. The user needs to call run to initiate.\nfunc newStateSync(d *Downloader, root common.Hash) *stateSync {\n\treturn &stateSync{\n\t\td:       d,\n\t\tsched:   state.NewStateSync(root, d.stateDB),\n\t\tkeccak:  sha3.NewKeccak256(),\n\t\ttasks:   make(map[common.Hash]*stateTask),\n\t\tdeliver: make(chan *stateReq),\n\t\tcancel:  make(chan struct{}),\n\t\tdone:    make(chan struct{}),\n\t}\n}\n\n// run starts the task assignment and response processing loop, blocking until\n// it finishes, and finally notifying any goroutines waiting for the loop to\n// finish.\nfunc (s *stateSync) run() {\n\ts.err = s.loop()\n\tclose(s.done)\n}\n\n// Wait blocks until the sync is done or canceled.\nfunc (s *stateSync) Wait() error {\n\t<-s.done\n\treturn s.err\n}\n\n// Cancel cancels the sync and waits until it has shut down.\nfunc (s *stateSync) Cancel() error {\n\ts.cancelOnce.Do(func() { close(s.cancel) })\n\treturn s.Wait()\n}\n\n// loop is the main event loop of a state trie sync. It it responsible for the\n// assignment of new tasks to peers (including sending it to them) as well as\n// for the processing of inbound data. Note, that the loop does not directly\n// receive data from peers, rather those are buffered up in the downloader and\n// pushed here async. The reason is to decouple processing from data receipt\n// and timeouts.\nfunc (s *stateSync) loop() (err error) {\n\t// Listen for new peer events to assign tasks to them\n\tnewPeer := make(chan *peerConnection, 1024)\n\tpeerSub := s.d.peers.SubscribeNewPeers(newPeer)\n\tdefer peerSub.Unsubscribe()\n\tdefer func() {\n\t\tcerr := s.commit(true)\n\t\tif err == nil {\n\t\t\terr = cerr\n\t\t}\n\t}()\n\n\t// Keep assigning new tasks until the sync completes or aborts\n\tfor s.sched.Pending() > 0 {\n\t\tif err = s.commit(false); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ts.assignTasks()\n\t\t// Tasks assigned, wait for something to happen\n\t\tselect {\n\t\tcase <-newPeer:\n\t\t\t// New peer arrived, try to assign it download tasks\n\n\t\tcase <-s.cancel:\n\t\t\treturn errCancelStateFetch\n\n\t\tcase <-s.d.cancelCh:\n\t\t\treturn errCancelStateFetch\n\n\t\tcase req := <-s.deliver:\n\t\t\t// Response, disconnect or timeout triggered, drop the peer if stalling\n\t\t\tlog.Trace(\"Received node data response\", \"peer\", req.peer.id, \"count\", len(req.response), \"dropped\", req.dropped, \"timeout\", !req.dropped && req.timedOut())\n\t\t\tif len(req.items) <= 2 && !req.dropped && req.timedOut() {\n\t\t\t\t// 2 items are the minimum requested, if even that times out, we've no use of\n\t\t\t\t// this peer at the moment.\n\t\t\t\tlog.Warn(\"Stalling state sync, dropping peer\", \"peer\", req.peer.id)\n\t\t\t\ts.d.dropPeer(req.peer.id)\n\t\t\t}\n\t\t\t// Process all the received blobs and check for stale delivery\n\t\t\tif err = s.process(req); err != nil {\n\t\t\t\tlog.Warn(\"Node data write error\", \"err\", err)\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treq.peer.SetNodeDataIdle(len(req.response))\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (s *stateSync) commit(force bool) error {\n\tif !force && s.bytesUncommitted < serodb.IdealBatchSize {\n\t\treturn nil\n\t}\n\tstart := time.Now()\n\tb := s.d.stateDB.NewBatch()\n\tif written, err := s.sched.Commit(b); written == 0 || err != nil {\n\t\treturn err\n\t}\n\tif err := b.Write(); err != nil {\n\t\treturn fmt.Errorf(\"DB write error: %v\", err)\n\t}\n\ts.updateStats(s.numUncommitted, 0, 0, time.Since(start))\n\ts.numUncommitted = 0\n\ts.bytesUncommitted = 0\n\treturn nil\n}\n\n// assignTasks attempts to assign new tasks to all idle peers, either from the\n// batch currently being retried, or fetching new data from the trie sync itself.\nfunc (s *stateSync) assignTasks() {\n\t// Iterate over all idle peers and try to assign them state fetches\n\tpeers, _ := s.d.peers.NodeDataIdlePeers()\n\tfor _, p := range peers {\n\t\t// Assign a batch of fetches proportional to the estimated latency/bandwidth\n\t\tcap := p.NodeDataCapacity(s.d.requestRTT())\n\t\treq := &stateReq{peer: p, timeout: s.d.requestTTL()}\n\t\ts.fillTasks(cap, req)\n\n\t\t// If the peer was assigned tasks to fetch, send the network request\n\t\tif len(req.items) > 0 {\n\t\t\treq.peer.log.Trace(\"Requesting new batch of data\", \"type\", \"state\", \"count\", len(req.items))\n\t\t\tselect {\n\t\t\tcase s.d.trackStateReq <- req:\n\t\t\t\treq.peer.FetchNodeData(req.items)\n\t\t\tcase <-s.cancel:\n\t\t\tcase <-s.d.cancelCh:\n\t\t\t}\n\t\t}\n\t}\n}\n\n// fillTasks fills the given request object with a maximum of n state download\n// tasks to send to the remote peer.\nfunc (s *stateSync) fillTasks(n int, req *stateReq) {\n\t// Refill available tasks from the scheduler.\n\tif len(s.tasks) < n {\n\t\tnew := s.sched.Missing(n - len(s.tasks))\n\t\tfor _, hash := range new {\n\t\t\ts.tasks[hash] = &stateTask{make(map[string]struct{})}\n\t\t}\n\t}\n\t// Find tasks that haven't been tried with the request's peer.\n\treq.items = make([]common.Hash, 0, n)\n\treq.tasks = make(map[common.Hash]*stateTask, n)\n\tfor hash, t := range s.tasks {\n\t\t// Stop when we've gathered enough requests\n\t\tif len(req.items) == n {\n\t\t\tbreak\n\t\t}\n\t\t// Skip any requests we've already tried from this peer\n\t\tif _, ok := t.attempts[req.peer.id]; ok {\n\t\t\tcontinue\n\t\t}\n\t\t// Assign the request to this peer\n\t\tt.attempts[req.peer.id] = struct{}{}\n\t\treq.items = append(req.items, hash)\n\t\treq.tasks[hash] = t\n\t\tdelete(s.tasks, hash)\n\t}\n}\n\n// process iterates over a batch of delivered state data, injecting each item\n// into a running state sync, re-queuing any items that were requested but not\n// delivered.\nfunc (s *stateSync) process(req *stateReq) error {\n\t// Collect processing stats and update progress if valid data was received\n\tduplicate, unexpected := 0, 0\n\n\tdefer func(start time.Time) {\n\t\tif duplicate > 0 || unexpected > 0 {\n\t\t\ts.updateStats(0, duplicate, unexpected, time.Since(start))\n\t\t}\n\t}(time.Now())\n\n\t// Iterate over all the delivered data and inject one-by-one into the trie\n\tprogress := false\n\n\tfor _, blob := range req.response {\n\t\tprog, hash, err := s.processNodeData(blob)\n\t\tswitch err {\n\t\tcase nil:\n\t\t\ts.numUncommitted++\n\t\t\ts.bytesUncommitted += len(blob)\n\t\t\tprogress = progress || prog\n\t\tcase trie.ErrNotRequested:\n\t\t\tunexpected++\n\t\tcase trie.ErrAlreadyProcessed:\n\t\t\tduplicate++\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid state node %s: %v\", hash.TerminalString(), err)\n\t\t}\n\t\tif _, ok := req.tasks[hash]; ok {\n\t\t\tdelete(req.tasks, hash)\n\t\t}\n\t}\n\t// Put unfulfilled tasks back into the retry queue\n\tnpeers := s.d.peers.Len()\n\tfor hash, task := range req.tasks {\n\t\t// If the node did deliver something, missing items may be due to a protocol\n\t\t// limit or a previous timeout + delayed delivery. Both cases should permit\n\t\t// the node to retry the missing items (to avoid single-peer stalls).\n\t\tif len(req.response) > 0 || req.timedOut() {\n\t\t\tdelete(task.attempts, req.peer.id)\n\t\t}\n\t\t// If we've requested the node too many times already, it may be a malicious\n\t\t// sync where nobody has the right data. Abort.\n\t\tif len(task.attempts) >= npeers {\n\t\t\treturn fmt.Errorf(\"state node %s failed with all peers (%d tries, %d peers)\", hash.TerminalString(), len(task.attempts), npeers)\n\t\t}\n\t\t// Missing item, place into the retry queue.\n\t\ts.tasks[hash] = task\n\t}\n\treturn nil\n}\n\n// processNodeData tries to inject a trie node data blob delivered from a remote\n// peer into the state trie, returning whether anything useful was written or any\n// error occurred.\nfunc (s *stateSync) processNodeData(blob []byte) (bool, common.Hash, error) {\n\tres := trie.SyncResult{Data: blob}\n\ts.keccak.Reset()\n\ts.keccak.Write(blob)\n\ts.keccak.Sum(res.Hash[:0])\n\tcommitted, _, err := s.sched.Process([]trie.SyncResult{res})\n\treturn committed, res.Hash, err\n}\n\n// updateStats bumps the various state sync progress counters and displays a log\n// message for the user to see.\nfunc (s *stateSync) updateStats(written, duplicate, unexpected int, duration time.Duration) {\n\ts.d.syncStatsLock.Lock()\n\tdefer s.d.syncStatsLock.Unlock()\n\n\ts.d.syncStatsState.pending = uint64(s.sched.Pending())\n\ts.d.syncStatsState.processed += uint64(written)\n\ts.d.syncStatsState.duplicate += uint64(duplicate)\n\ts.d.syncStatsState.unexpected += uint64(unexpected)\n\n\tif written > 0 || duplicate > 0 || unexpected > 0 {\n\t\tlog.Info(\"Imported new state entries\", \"count\", written, \"elapsed\", common.PrettyDuration(duration), \"processed\", s.d.syncStatsState.processed, \"pending\", s.d.syncStatsState.pending, \"retry\", len(s.tasks), \"duplicate\", s.d.syncStatsState.duplicate, \"unexpected\", s.d.syncStatsState.unexpected)\n\t}\n\tif written > 0 {\n\t\trawdb.WriteFastTrieProgress(s.d.stateDB, s.d.syncStatsState.processed)\n\t}\n}\n"
  },
  {
    "path": "sero/downloader/types.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage downloader\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\n// peerDropFn is a callback type for dropping a peer detected as malicious.\ntype peerDropFn func(id string)\n\n// dataPack is a data message returned by a peer for some query.\ntype dataPack interface {\n\tPeerId() string\n\tItems() int\n\tStats() string\n}\n\n// headerPack is a batch of block headers returned by a peer.\ntype headerPack struct {\n\tpeerID  string\n\theaders []*types.Header\n}\n\nfunc (p *headerPack) PeerId() string { return p.peerID }\nfunc (p *headerPack) Items() int     { return len(p.headers) }\nfunc (p *headerPack) Stats() string  { return fmt.Sprintf(\"%d\", len(p.headers)) }\n\n// bodyPack is a batch of block bodies returned by a peer.\ntype bodyPack struct {\n\tpeerID       string\n\ttransactions [][]*types.Transaction\n}\n\nfunc (p *bodyPack) PeerId() string { return p.peerID }\nfunc (p *bodyPack) Items() int {\n\treturn len(p.transactions)\n}\nfunc (p *bodyPack) Stats() string { return fmt.Sprintf(\"%d\", len(p.transactions)) }\n\n// receiptPack is a batch of receipts returned by a peer.\ntype receiptPack struct {\n\tpeerID   string\n\treceipts [][]*types.Receipt\n}\n\nfunc (p *receiptPack) PeerId() string { return p.peerID }\nfunc (p *receiptPack) Items() int     { return len(p.receipts) }\nfunc (p *receiptPack) Stats() string  { return fmt.Sprintf(\"%d\", len(p.receipts)) }\n\n// statePack is a batch of states returned by a peer.\ntype statePack struct {\n\tpeerID string\n\tstates [][]byte\n}\n\nfunc (p *statePack) PeerId() string { return p.peerID }\nfunc (p *statePack) Items() int     { return len(p.states) }\nfunc (p *statePack) Stats() string  { return fmt.Sprintf(\"%d\", len(p.states)) }\n"
  },
  {
    "path": "sero/fetcher/fetcher.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package fetcher contains the block announcement based synchronisation.\npackage fetcher\n\nimport (\n\t\"errors\"\n\t\"math/rand\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"gopkg.in/karalabe/cookiejar.v2/collections/prque\"\n)\n\nconst (\n\tarriveTimeout = 500 * time.Millisecond // Time allowance before an announced block is explicitly requested\n\tgatherSlack   = 100 * time.Millisecond // Interval used to collate almost-expired announces with fetches\n\tfetchTimeout  = 5 * time.Second        // Maximum allotted time to return an explicitly requested block\n\tmaxUncleDist  = 7                      // Maximum allowed backward distance from the chain head\n\tmaxQueueDist  = 32                     // Maximum allowed distance from the chain head to queue\n\thashLimit     = 256                    // Maximum number of unique blocks a peer may have announced\n\tblockLimit    = 64                     // Maximum number of unique blocks a peer may have delivered\n)\n\nvar (\n\terrTerminated = errors.New(\"terminated\")\n)\n\n// blockRetrievalFn is a callback type for retrieving a block from the local chain.\ntype blockRetrievalFn func(common.Hash) *types.Block\n\n// headerRequesterFn is a callback type for sending a header retrieval request.\ntype headerRequesterFn func(common.Hash) error\n\n// bodyRequesterFn is a callback type for sending a body retrieval request.\ntype bodyRequesterFn func([]common.Hash) error\n\n// headerVerifierFn is a callback type to verify a block's header for fast propagation.\ntype headerVerifierFn func(header *types.Header) error\n\n// blockBroadcasterFn is a callback type for broadcasting a block to connected peers.\ntype blockBroadcasterFn func(block *types.Block, propagate bool)\n\n// chainHeightFn is a callback type to retrieve the current chain height.\ntype chainHeightFn func() uint64\n\n// chainInsertFn is a callback type to insert a batch of blocks into the local chain.\ntype chainInsertFn func(types.Blocks) (int, error)\n\n// peerDropFn is a callback type for dropping a peer detected as malicious.\ntype peerDropFn func(id string)\n\n// announce is the hash notification of the availability of a new block in the\n// network.\ntype announce struct {\n\thash   common.Hash   // Hash of the block being announced\n\tnumber uint64        // Number of the block being announced (0 = unknown | old protocol)\n\theader *types.Header // Header of the block partially reassembled (new protocol)\n\ttime   time.Time     // Timestamp of the announcement\n\n\torigin string // Identifier of the peer originating the notification\n\n\tfetchHeader headerRequesterFn // Fetcher function to retrieve the header of an announced block\n\tfetchBodies bodyRequesterFn   // Fetcher function to retrieve the body of an announced block\n}\n\n// headerFilterTask represents a batch of headers needing fetcher filtering.\ntype headerFilterTask struct {\n\tpeer    string          // The source peer of block headers\n\theaders []*types.Header // Collection of headers to filter\n\ttime    time.Time       // Arrival time of the headers\n}\n\n// bodyFilterTask represents a batch of block bodies (transactions)\n// needing fetcher filtering.\ntype bodyFilterTask struct {\n\tpeer         string                 // The source peer of block bodies\n\ttransactions [][]*types.Transaction // Collection of transactions per block bodies\n\ttime         time.Time              // Arrival time of the blocks' contents\n}\n\n// inject represents a schedules import operation.\ntype inject struct {\n\torigin string\n\tblock  *types.Block\n}\n\n// Fetcher is responsible for accumulating block announcements from various peers\n// and scheduling them for retrieval.\ntype Fetcher struct {\n\t// Various event channels\n\tnotify chan *announce\n\tinject chan *inject\n\n\tblockFilter  chan chan []*types.Block\n\theaderFilter chan chan *headerFilterTask\n\tbodyFilter   chan chan *bodyFilterTask\n\n\tdone chan common.Hash\n\tquit chan struct{}\n\n\t// Announce states\n\tannounces  map[string]int              // Per peer announce counts to prevent memory exhaustion\n\tannounced  map[common.Hash][]*announce // Announced blocks, scheduled for fetching\n\tfetching   map[common.Hash]*announce   // Announced blocks, currently fetching\n\tfetched    map[common.Hash][]*announce // Blocks with headers fetched, scheduled for body retrieval\n\tcompleting map[common.Hash]*announce   // Blocks with headers, currently body-completing\n\n\t// Block cache\n\tqueue  *prque.Prque            // Queue containing the import operations (block number sorted)\n\tqueues map[string]int          // Per peer block counts to prevent memory exhaustion\n\tqueued map[common.Hash]*inject // Set of already queued blocks (to dedupe imports)\n\n\t// Callbacks\n\tgetBlock       blockRetrievalFn   // Retrieves a block from the local chain\n\tverifyHeader   headerVerifierFn   // Checks if a block's headers have a valid proof of work\n\tbroadcastBlock blockBroadcasterFn // Broadcasts a block to connected peers\n\tchainHeight    chainHeightFn      // Retrieves the current chain's height\n\tinsertChain    chainInsertFn      // Injects a batch of blocks into the chain\n\tdropPeer       peerDropFn         // Drops a peer for misbehaving\n\n\t// Testing hooks\n\tannounceChangeHook func(common.Hash, bool) // Method to call upon adding or deleting a hash from the announce list\n\tqueueChangeHook    func(common.Hash, bool) // Method to call upon adding or deleting a block from the import queue\n\tfetchingHook       func([]common.Hash)     // Method to call upon starting a block (sero/61) or header (sero/62) fetch\n\tcompletingHook     func([]common.Hash)     // Method to call upon starting a block body fetch (sero/62)\n\timportedHook       func(*types.Block)      // Method to call upon successful block import (both sero/61 and sero/62)\n}\n\n// New creates a block fetcher to retrieve blocks based on hash announcements.\nfunc New(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertChain chainInsertFn, dropPeer peerDropFn) *Fetcher {\n\treturn &Fetcher{\n\t\tnotify:         make(chan *announce),\n\t\tinject:         make(chan *inject),\n\t\tblockFilter:    make(chan chan []*types.Block),\n\t\theaderFilter:   make(chan chan *headerFilterTask),\n\t\tbodyFilter:     make(chan chan *bodyFilterTask),\n\t\tdone:           make(chan common.Hash),\n\t\tquit:           make(chan struct{}),\n\t\tannounces:      make(map[string]int),\n\t\tannounced:      make(map[common.Hash][]*announce),\n\t\tfetching:       make(map[common.Hash]*announce),\n\t\tfetched:        make(map[common.Hash][]*announce),\n\t\tcompleting:     make(map[common.Hash]*announce),\n\t\tqueue:          prque.New(),\n\t\tqueues:         make(map[string]int),\n\t\tqueued:         make(map[common.Hash]*inject),\n\t\tgetBlock:       getBlock,\n\t\tverifyHeader:   verifyHeader,\n\t\tbroadcastBlock: broadcastBlock,\n\t\tchainHeight:    chainHeight,\n\t\tinsertChain:    insertChain,\n\t\tdropPeer:       dropPeer,\n\t}\n}\n\n// Start boots up the announcement based synchroniser, accepting and processing\n// hash notifications and block fetches until termination requested.\nfunc (f *Fetcher) Start() {\n\tgo f.loop()\n}\n\n// Stop terminates the announcement based synchroniser, canceling all pending\n// operations.\nfunc (f *Fetcher) Stop() {\n\tclose(f.quit)\n}\n\n// Notify announces the fetcher of the potential availability of a new block in\n// the network.\nfunc (f *Fetcher) Notify(peer string, hash common.Hash, number uint64, time time.Time,\n\theaderFetcher headerRequesterFn, bodyFetcher bodyRequesterFn) error {\n\tblock := &announce{\n\t\thash:        hash,\n\t\tnumber:      number,\n\t\ttime:        time,\n\t\torigin:      peer,\n\t\tfetchHeader: headerFetcher,\n\t\tfetchBodies: bodyFetcher,\n\t}\n\tselect {\n\tcase f.notify <- block:\n\t\treturn nil\n\tcase <-f.quit:\n\t\treturn errTerminated\n\t}\n}\n\n// Enqueue tries to fill gaps the the fetcher's future import queue.\nfunc (f *Fetcher) Enqueue(peer string, block *types.Block) error {\n\top := &inject{\n\t\torigin: peer,\n\t\tblock:  block,\n\t}\n\tselect {\n\tcase f.inject <- op:\n\t\treturn nil\n\tcase <-f.quit:\n\t\treturn errTerminated\n\t}\n}\n\n// FilterHeaders extracts all the headers that were explicitly requested by the fetcher,\n// returning those that should be handled differently.\nfunc (f *Fetcher) FilterHeaders(peer string, headers []*types.Header, time time.Time) []*types.Header {\n\tlog.Trace(\"Filtering headers\", \"peer\", peer, \"headers\", len(headers))\n\n\t// Send the filter channel to the fetcher\n\tfilter := make(chan *headerFilterTask)\n\n\tselect {\n\tcase f.headerFilter <- filter:\n\tcase <-f.quit:\n\t\treturn nil\n\t}\n\t// Request the filtering of the header list\n\tselect {\n\tcase filter <- &headerFilterTask{peer: peer, headers: headers, time: time}:\n\tcase <-f.quit:\n\t\treturn nil\n\t}\n\t// Retrieve the headers remaining after filtering\n\tselect {\n\tcase task := <-filter:\n\t\treturn task.headers\n\tcase <-f.quit:\n\t\treturn nil\n\t}\n}\n\n// FilterBodies extracts all the block bodies that were explicitly requested by\n// the fetcher, returning those that should be handled differently.\nfunc (f *Fetcher) FilterBodies(peer string, transactions [][]*types.Transaction, time time.Time) [][]*types.Transaction {\n\tlog.Trace(\"Filtering bodies\", \"peer\", peer, \"txs\", len(transactions))\n\n\t// Send the filter channel to the fetcher\n\tfilter := make(chan *bodyFilterTask)\n\n\tselect {\n\tcase f.bodyFilter <- filter:\n\tcase <-f.quit:\n\t\treturn nil\n\t}\n\t// Request the filtering of the body list\n\tselect {\n\tcase filter <- &bodyFilterTask{peer: peer, transactions: transactions, time: time}:\n\tcase <-f.quit:\n\t\treturn nil\n\t}\n\t// Retrieve the bodies remaining after filtering\n\tselect {\n\tcase task := <-filter:\n\t\treturn task.transactions\n\tcase <-f.quit:\n\t\treturn nil\n\t}\n}\n\n// Loop is the main fetcher loop, checking and processing various notification\n// events.\nfunc (f *Fetcher) loop() {\n\t// Iterate the block fetching until a quit is requested\n\tfetchTimer := time.NewTimer(0)\n\tcompleteTimer := time.NewTimer(0)\n\n\tfor {\n\t\t// Clean up any expired block fetches\n\t\tfor hash, announce := range f.fetching {\n\t\t\tif time.Since(announce.time) > fetchTimeout {\n\t\t\t\tf.forgetHash(hash)\n\t\t\t}\n\t\t}\n\t\t// Import any queued blocks that could potentially fit\n\t\theight := f.chainHeight()\n\t\tfor !f.queue.Empty() {\n\t\t\top := f.queue.PopItem().(*inject)\n\t\t\thash := op.block.Hash()\n\t\t\tif f.queueChangeHook != nil {\n\t\t\t\tf.queueChangeHook(hash, false)\n\t\t\t}\n\t\t\t// If too high up the chain or phase, continue later\n\t\t\tnumber := op.block.NumberU64()\n\t\t\tif number > height+1 {\n\t\t\t\tf.queue.Push(op, -float32(number))\n\t\t\t\tif f.queueChangeHook != nil {\n\t\t\t\t\tf.queueChangeHook(hash, true)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Otherwise if fresh and still unknown, try and import\n\t\t\tif number+maxUncleDist < height || f.getBlock(hash) != nil {\n\t\t\t\tf.forgetBlock(hash)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tf.insert(op.origin, op.block)\n\t\t}\n\t\t// Wait for an outside event to occur\n\t\tselect {\n\t\tcase <-f.quit:\n\t\t\t// Fetcher terminating, abort all operations\n\t\t\treturn\n\n\t\tcase notification := <-f.notify:\n\t\t\t// A block was announced, make sure the peer isn't DOSing us\n\t\t\tpropAnnounceInMeter.Mark(1)\n\n\t\t\tcount := f.announces[notification.origin] + 1\n\t\t\tif count > hashLimit {\n\t\t\t\tlog.Debug(\"Peer exceeded outstanding announces\", \"peer\", notification.origin, \"limit\", hashLimit)\n\t\t\t\tpropAnnounceDOSMeter.Mark(1)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// If we have a valid block number, check that it's potentially useful\n\t\t\tif notification.number > 0 {\n\t\t\t\tif dist := int64(notification.number) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist {\n\t\t\t\t\tlog.Debug(\"Peer discarded announcement\", \"peer\", notification.origin, \"number\", notification.number, \"hash\", notification.hash, \"distance\", dist)\n\t\t\t\t\tpropAnnounceDropMeter.Mark(1)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\t// All is well, schedule the announce if block's not yet downloading\n\t\t\tif _, ok := f.fetching[notification.hash]; ok {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif _, ok := f.completing[notification.hash]; ok {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tf.announces[notification.origin] = count\n\t\t\tf.announced[notification.hash] = append(f.announced[notification.hash], notification)\n\t\t\tif f.announceChangeHook != nil && len(f.announced[notification.hash]) == 1 {\n\t\t\t\tf.announceChangeHook(notification.hash, true)\n\t\t\t}\n\t\t\tif len(f.announced) == 1 {\n\t\t\t\tf.rescheduleFetch(fetchTimer)\n\t\t\t}\n\n\t\tcase op := <-f.inject:\n\t\t\t// A direct block insertion was requested, try and fill any pending gaps\n\t\t\tpropBroadcastInMeter.Mark(1)\n\t\t\tf.enqueue(op.origin, op.block)\n\n\t\tcase hash := <-f.done:\n\t\t\t// A pending import finished, remove all traces of the notification\n\t\t\tf.forgetHash(hash)\n\t\t\tf.forgetBlock(hash)\n\n\t\tcase <-fetchTimer.C:\n\t\t\t// At least one block's timer ran out, check for needing retrieval\n\t\t\trequest := make(map[string][]common.Hash)\n\n\t\t\tfor hash, announces := range f.announced {\n\t\t\t\tif time.Since(announces[0].time) > arriveTimeout-gatherSlack {\n\t\t\t\t\t// Pick a random peer to retrieve from, reset all others\n\t\t\t\t\tannounce := announces[rand.Intn(len(announces))]\n\t\t\t\t\tf.forgetHash(hash)\n\n\t\t\t\t\t// If the block still didn't arrive, queue for fetching\n\t\t\t\t\tif f.getBlock(hash) == nil {\n\t\t\t\t\t\trequest[announce.origin] = append(request[announce.origin], hash)\n\t\t\t\t\t\tf.fetching[hash] = announce\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Send out all block header requests\n\t\t\tfor peer, hashes := range request {\n\t\t\t\tlog.Trace(\"Fetching scheduled headers\", \"peer\", peer, \"list\", hashes)\n\n\t\t\t\t// Create a closure of the fetch and schedule in on a new thread\n\t\t\t\tfetchHeader, hashes := f.fetching[hashes[0]].fetchHeader, hashes\n\t\t\t\tgo func() {\n\t\t\t\t\tif f.fetchingHook != nil {\n\t\t\t\t\t\tf.fetchingHook(hashes)\n\t\t\t\t\t}\n\t\t\t\t\tfor _, hash := range hashes {\n\t\t\t\t\t\theaderFetchMeter.Mark(1)\n\t\t\t\t\t\tfetchHeader(hash) // Suboptimal, but protocol doesn't allow batch header retrievals\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t}\n\t\t\t// Schedule the next fetch if blocks are still pending\n\t\t\tf.rescheduleFetch(fetchTimer)\n\n\t\tcase <-completeTimer.C:\n\t\t\t// At least one header's timer ran out, retrieve everything\n\t\t\trequest := make(map[string][]common.Hash)\n\n\t\t\tfor hash, announces := range f.fetched {\n\t\t\t\t// Pick a random peer to retrieve from, reset all others\n\t\t\t\tannounce := announces[rand.Intn(len(announces))]\n\t\t\t\tf.forgetHash(hash)\n\n\t\t\t\t// If the block still didn't arrive, queue for completion\n\t\t\t\tif f.getBlock(hash) == nil {\n\t\t\t\t\trequest[announce.origin] = append(request[announce.origin], hash)\n\t\t\t\t\tf.completing[hash] = announce\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Send out all block body requests\n\t\t\tfor peer, hashes := range request {\n\t\t\t\tlog.Trace(\"Fetching scheduled bodies\", \"peer\", peer, \"list\", hashes)\n\n\t\t\t\t// Create a closure of the fetch and schedule in on a new thread\n\t\t\t\tif f.completingHook != nil {\n\t\t\t\t\tf.completingHook(hashes)\n\t\t\t\t}\n\t\t\t\tbodyFetchMeter.Mark(int64(len(hashes)))\n\t\t\t\tgo f.completing[hashes[0]].fetchBodies(hashes)\n\t\t\t}\n\t\t\t// Schedule the next fetch if blocks are still pending\n\t\t\tf.rescheduleComplete(completeTimer)\n\n\t\tcase filter := <-f.headerFilter:\n\t\t\t// Headers arrived from a remote peer. Extract those that were explicitly\n\t\t\t// requested by the fetcher, and return everything else so it's delivered\n\t\t\t// to other parts of the system.\n\t\t\tvar task *headerFilterTask\n\t\t\tselect {\n\t\t\tcase task = <-filter:\n\t\t\tcase <-f.quit:\n\t\t\t\treturn\n\t\t\t}\n\t\t\theaderFilterInMeter.Mark(int64(len(task.headers)))\n\n\t\t\t// Split the batch of headers into unknown ones (to return to the caller),\n\t\t\t// known incomplete ones (requiring body retrievals) and completed blocks.\n\t\t\tunknown, incomplete, complete := []*types.Header{}, []*announce{}, []*types.Block{}\n\t\t\tfor _, header := range task.headers {\n\t\t\t\thash := header.Hash()\n\n\t\t\t\t// Filter fetcher-requested headers from other synchronisation algorithms\n\t\t\t\tif announce := f.fetching[hash]; announce != nil && announce.origin == task.peer && f.fetched[hash] == nil && f.completing[hash] == nil && f.queued[hash] == nil {\n\t\t\t\t\t// If the delivered header does not match the promised number, drop the announcer\n\t\t\t\t\tif header.Number.Uint64() != announce.number {\n\t\t\t\t\t\tlog.Trace(\"Invalid block number fetched\", \"peer\", announce.origin, \"hash\", header.Hash(), \"announced\", announce.number, \"provided\", header.Number)\n\t\t\t\t\t\tf.dropPeer(announce.origin)\n\t\t\t\t\t\tf.forgetHash(hash)\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\t// Only keep if not imported by other means\n\t\t\t\t\tif f.getBlock(hash) == nil {\n\t\t\t\t\t\tannounce.header = header\n\t\t\t\t\t\tannounce.time = task.time\n\n\t\t\t\t\t\t// If the block is empty (header only), short circuit into the final import queue\n\t\t\t\t\t\tif header.TxHash == types.DeriveSha(types.Transactions{}) {\n\t\t\t\t\t\t\tlog.Trace(\"Block empty, skipping body retrieval\", \"peer\", announce.origin, \"number\", header.Number, \"hash\", header.Hash())\n\n\t\t\t\t\t\t\tblock := types.NewBlockWithHeader(header)\n\t\t\t\t\t\t\tblock.ReceivedAt = task.time\n\n\t\t\t\t\t\t\tcomplete = append(complete, block)\n\t\t\t\t\t\t\tf.completing[hash] = announce\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Otherwise add to the list of blocks needing completion\n\t\t\t\t\t\tincomplete = append(incomplete, announce)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog.Trace(\"Block already imported, discarding header\", \"peer\", announce.origin, \"number\", header.Number, \"hash\", header.Hash())\n\t\t\t\t\t\tf.forgetHash(hash)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Fetcher doesn't know about it, add to the return list\n\t\t\t\t\tunknown = append(unknown, header)\n\t\t\t\t}\n\t\t\t}\n\t\t\theaderFilterOutMeter.Mark(int64(len(unknown)))\n\t\t\tselect {\n\t\t\tcase filter <- &headerFilterTask{headers: unknown, time: task.time}:\n\t\t\tcase <-f.quit:\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Schedule the retrieved headers for body completion\n\t\t\tfor _, announce := range incomplete {\n\t\t\t\thash := announce.header.Hash()\n\t\t\t\tif _, ok := f.completing[hash]; ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tf.fetched[hash] = append(f.fetched[hash], announce)\n\t\t\t\tif len(f.fetched) == 1 {\n\t\t\t\t\tf.rescheduleComplete(completeTimer)\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Schedule the header-only blocks for import\n\t\t\tfor _, block := range complete {\n\t\t\t\tif announce := f.completing[block.Hash()]; announce != nil {\n\t\t\t\t\tf.enqueue(announce.origin, block)\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase filter := <-f.bodyFilter:\n\t\t\t// Block bodies arrived, extract any explicitly requested blocks, return the rest\n\t\t\tvar task *bodyFilterTask\n\t\t\tselect {\n\t\t\tcase task = <-filter:\n\t\t\tcase <-f.quit:\n\t\t\t\treturn\n\t\t\t}\n\t\t\tbodyFilterInMeter.Mark(int64(len(task.transactions)))\n\n\t\t\tblocks := []*types.Block{}\n\t\t\tfor i := 0; i < len(task.transactions); i++ {\n\t\t\t\t// Match up a body to any possible completion request\n\t\t\t\tmatched := false\n\n\t\t\t\tfor hash, announce := range f.completing {\n\t\t\t\t\tif f.queued[hash] == nil {\n\t\t\t\t\t\ttxnHash := types.DeriveSha(types.Transactions(task.transactions[i]))\n\n\t\t\t\t\t\tif txnHash == announce.header.TxHash && announce.origin == task.peer {\n\t\t\t\t\t\t\t// Mark the body matched, reassemble if still unknown\n\t\t\t\t\t\t\tmatched = true\n\n\t\t\t\t\t\t\tif f.getBlock(hash) == nil {\n\t\t\t\t\t\t\t\tblock := types.NewBlockWithHeader(announce.header).WithBody(task.transactions[i])\n\t\t\t\t\t\t\t\tblock.ReceivedAt = task.time\n\n\t\t\t\t\t\t\t\tblocks = append(blocks, block)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tf.forgetHash(hash)\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\tif matched {\n\t\t\t\t\ttask.transactions = append(task.transactions[:i], task.transactions[i+1:]...)\n\t\t\t\t\ti--\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbodyFilterOutMeter.Mark(int64(len(task.transactions)))\n\t\t\tselect {\n\t\t\tcase filter <- task:\n\t\t\tcase <-f.quit:\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Schedule the retrieved blocks for ordered import\n\t\t\tfor _, block := range blocks {\n\t\t\t\tif announce := f.completing[block.Hash()]; announce != nil {\n\t\t\t\t\tf.enqueue(announce.origin, block)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// rescheduleFetch resets the specified fetch timer to the next announce timeout.\nfunc (f *Fetcher) rescheduleFetch(fetch *time.Timer) {\n\t// Short circuit if no blocks are announced\n\tif len(f.announced) == 0 {\n\t\treturn\n\t}\n\t// Otherwise find the earliest expiring announcement\n\tearliest := time.Now()\n\tfor _, announces := range f.announced {\n\t\tif earliest.After(announces[0].time) {\n\t\t\tearliest = announces[0].time\n\t\t}\n\t}\n\tfetch.Reset(arriveTimeout - time.Since(earliest))\n}\n\n// rescheduleComplete resets the specified completion timer to the next fetch timeout.\nfunc (f *Fetcher) rescheduleComplete(complete *time.Timer) {\n\t// Short circuit if no headers are fetched\n\tif len(f.fetched) == 0 {\n\t\treturn\n\t}\n\t// Otherwise find the earliest expiring announcement\n\tearliest := time.Now()\n\tfor _, announces := range f.fetched {\n\t\tif earliest.After(announces[0].time) {\n\t\t\tearliest = announces[0].time\n\t\t}\n\t}\n\tcomplete.Reset(gatherSlack - time.Since(earliest))\n}\n\n// enqueue schedules a new future import operation, if the block to be imported\n// has not yet been seen.\nfunc (f *Fetcher) enqueue(peer string, block *types.Block) {\n\thash := block.Hash()\n\n\t// Ensure the peer isn't DOSing us\n\tcount := f.queues[peer] + 1\n\tif count > blockLimit {\n\t\tlog.Debug(\"Discarded propagated block, exceeded allowance\", \"peer\", peer, \"number\", block.Number(), \"hash\", hash, \"limit\", blockLimit)\n\t\tpropBroadcastDOSMeter.Mark(1)\n\t\tf.forgetHash(hash)\n\t\treturn\n\t}\n\t// Discard any past or too distant blocks\n\tif dist := int64(block.NumberU64()) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist {\n\t\tlog.Debug(\"Discarded propagated block, too far away\", \"peer\", peer, \"number\", block.Number(), \"hash\", hash, \"distance\", dist)\n\t\tpropBroadcastDropMeter.Mark(1)\n\t\tf.forgetHash(hash)\n\t\treturn\n\t}\n\t// Schedule the block for future importing\n\tif _, ok := f.queued[hash]; !ok {\n\t\top := &inject{\n\t\t\torigin: peer,\n\t\t\tblock:  block,\n\t\t}\n\t\tf.queues[peer] = count\n\t\tf.queued[hash] = op\n\t\tf.queue.Push(op, -float32(block.NumberU64()))\n\t\tif f.queueChangeHook != nil {\n\t\t\tf.queueChangeHook(op.block.Hash(), true)\n\t\t}\n\t\tlog.Debug(\"Queued propagated block\", \"peer\", peer, \"number\", block.Number(), \"hash\", hash, \"queued\", f.queue.Size())\n\t}\n}\n\n// insert spawns a new goroutine to run a block insertion into the chain. If the\n// block's number is at the same height as the current import phase, it updates\n// the phase states accordingly.\nfunc (f *Fetcher) insert(peer string, block *types.Block) {\n\thash := block.Hash()\n\n\t// Run the import on a new thread\n\tlog.Debug(\"Importing propagated block\", \"peer\", peer, \"number\", block.Number(), \"hash\", hash)\n\tgo func() {\n\t\tdefer func() { f.done <- hash }()\n\n\t\t// If the parent's unknown, abort insertion\n\t\tparent := f.getBlock(block.ParentHash())\n\t\tif parent == nil {\n\t\t\tlog.Debug(\"Unknown parent of propagated block\", \"peer\", peer, \"number\", block.Number(), \"hash\", hash, \"parent\", block.ParentHash())\n\t\t\treturn\n\t\t}\n\t\t// Quickly validate the header and propagate the block if it passes\n\t\tswitch err := f.verifyHeader(block.Header()); err {\n\t\tcase nil:\n\t\t\t// All ok, quickly propagate to our peers\n\t\t\tpropBroadcastOutTimer.UpdateSince(block.ReceivedAt)\n\t\t\tgo f.broadcastBlock(block, true)\n\n\t\tcase consensus.ErrFutureBlock:\n\t\t\t// Weird future block, don't fail, but neither propagate\n\n\t\tdefault:\n\t\t\t// Something went very wrong, drop the peer\n\t\t\tlog.Debug(\"Propagated block verification failed\", \"peer\", peer, \"number\", block.Number(), \"hash\", hash, \"err\", err)\n\t\t\tf.dropPeer(peer)\n\t\t\treturn\n\t\t}\n\t\t// Run the actual import and log any issues\n\t\tif _, err := f.insertChain(types.Blocks{block}); err != nil {\n\t\t\tlog.Debug(\"Propagated block import failed\", \"peer\", peer, \"number\", block.Number(), \"hash\", hash, \"err\", err)\n\t\t\treturn\n\t\t}\n\t\t// If import succeeded, broadcast the block\n\t\tpropAnnounceOutTimer.UpdateSince(block.ReceivedAt)\n\t\tgo f.broadcastBlock(block, false)\n\n\t\t// Invoke the testing hook if needed\n\t\tif f.importedHook != nil {\n\t\t\tf.importedHook(block)\n\t\t}\n\t}()\n}\n\n// forgetHash removes all traces of a block announcement from the fetcher's\n// internal state.\nfunc (f *Fetcher) forgetHash(hash common.Hash) {\n\t// Remove all pending announces and decrement DOS counters\n\tfor _, announce := range f.announced[hash] {\n\t\tf.announces[announce.origin]--\n\t\tif f.announces[announce.origin] == 0 {\n\t\t\tdelete(f.announces, announce.origin)\n\t\t}\n\t}\n\tdelete(f.announced, hash)\n\tif f.announceChangeHook != nil {\n\t\tf.announceChangeHook(hash, false)\n\t}\n\t// Remove any pending fetches and decrement the DOS counters\n\tif announce := f.fetching[hash]; announce != nil {\n\t\tf.announces[announce.origin]--\n\t\tif f.announces[announce.origin] == 0 {\n\t\t\tdelete(f.announces, announce.origin)\n\t\t}\n\t\tdelete(f.fetching, hash)\n\t}\n\n\t// Remove any pending completion requests and decrement the DOS counters\n\tfor _, announce := range f.fetched[hash] {\n\t\tf.announces[announce.origin]--\n\t\tif f.announces[announce.origin] == 0 {\n\t\t\tdelete(f.announces, announce.origin)\n\t\t}\n\t}\n\tdelete(f.fetched, hash)\n\n\t// Remove any pending completions and decrement the DOS counters\n\tif announce := f.completing[hash]; announce != nil {\n\t\tf.announces[announce.origin]--\n\t\tif f.announces[announce.origin] == 0 {\n\t\t\tdelete(f.announces, announce.origin)\n\t\t}\n\t\tdelete(f.completing, hash)\n\t}\n}\n\n// forgetBlock removes all traces of a queued block from the fetcher's internal\n// state.\nfunc (f *Fetcher) forgetBlock(hash common.Hash) {\n\tif insert := f.queued[hash]; insert != nil {\n\t\tf.queues[insert.origin]--\n\t\tif f.queues[insert.origin] == 0 {\n\t\t\tdelete(f.queues, insert.origin)\n\t\t}\n\t\tdelete(f.queued, hash)\n\t}\n}\n"
  },
  {
    "path": "sero/fetcher/metrics.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Contains the metrics collected by the fetcher.\n\npackage fetcher\n\nimport (\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\nvar (\n\tpropAnnounceInMeter   = metrics.NewRegisteredMeter(\"sero/fetcher/prop/announces/in\", nil)\n\tpropAnnounceOutTimer  = metrics.NewRegisteredTimer(\"sero/fetcher/prop/announces/out\", nil)\n\tpropAnnounceDropMeter = metrics.NewRegisteredMeter(\"sero/fetcher/prop/announces/drop\", nil)\n\tpropAnnounceDOSMeter  = metrics.NewRegisteredMeter(\"sero/fetcher/prop/announces/dos\", nil)\n\n\tpropBroadcastInMeter   = metrics.NewRegisteredMeter(\"sero/fetcher/prop/broadcasts/in\", nil)\n\tpropBroadcastOutTimer  = metrics.NewRegisteredTimer(\"sero/fetcher/prop/broadcasts/out\", nil)\n\tpropBroadcastDropMeter = metrics.NewRegisteredMeter(\"sero/fetcher/prop/broadcasts/drop\", nil)\n\tpropBroadcastDOSMeter  = metrics.NewRegisteredMeter(\"sero/fetcher/prop/broadcasts/dos\", nil)\n\n\theaderFetchMeter = metrics.NewRegisteredMeter(\"sero/fetcher/fetch/headers\", nil)\n\tbodyFetchMeter   = metrics.NewRegisteredMeter(\"sero/fetcher/fetch/bodies\", nil)\n\n\theaderFilterInMeter  = metrics.NewRegisteredMeter(\"sero/fetcher/filter/headers/in\", nil)\n\theaderFilterOutMeter = metrics.NewRegisteredMeter(\"sero/fetcher/filter/headers/out\", nil)\n\tbodyFilterInMeter    = metrics.NewRegisteredMeter(\"sero/fetcher/filter/bodies/in\", nil)\n\tbodyFilterOutMeter   = metrics.NewRegisteredMeter(\"sero/fetcher/filter/bodies/out\", nil)\n)\n"
  },
  {
    "path": "sero/filters/api.go",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage filters\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"sync\"\n\t\"time\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nvar (\n\tdeadline = 5 * time.Minute // consider a filter inactive if it has not been polled for within deadline\n)\n\n// filter is a helper struct that holds meta information over the filter type\n// and associated subscription in the event system.\ntype filter struct {\n\ttyp      Type\n\tdeadline *time.Timer // filter is inactiv when deadline triggers\n\thashes   []common.Hash\n\tcrit     FilterCriteria\n\tlogs     []*types.Log\n\ts        *Subscription // associated subscription in event system\n}\n\n// PublicFilterAPI offers support to create and manage filters. This will allow external clients to retrieve various\n// information related to the Ethereum protocol such als blocks, transactions and logs.\ntype PublicFilterAPI struct {\n\tbackend   Backend\n\tmux       *event.TypeMux\n\tquit      chan struct{}\n\tchainDb   serodb.Database\n\tevents    *EventSystem\n\tfiltersMu sync.Mutex\n\tfilters   map[rpc.ID]*filter\n}\n\n// NewPublicFilterAPI returns a new PublicFilterAPI instance.\nfunc NewPublicFilterAPI(backend Backend, lightMode bool) *PublicFilterAPI {\n\tapi := &PublicFilterAPI{\n\t\tbackend: backend,\n\t\tmux:     backend.EventMux(),\n\t\tchainDb: backend.ChainDb(),\n\t\tevents:  NewEventSystem(backend.EventMux(), backend, lightMode),\n\t\tfilters: make(map[rpc.ID]*filter),\n\t}\n\tgo api.timeoutLoop()\n\n\treturn api\n}\n\n// timeoutLoop runs every 5 minutes and deletes filters that have not been recently used.\n// Tt is started when the api is created.\nfunc (api *PublicFilterAPI) timeoutLoop() {\n\tticker := time.NewTicker(5 * time.Minute)\n\tfor {\n\t\t<-ticker.C\n\t\tapi.filtersMu.Lock()\n\t\tfor id, f := range api.filters {\n\t\t\tselect {\n\t\t\tcase <-f.deadline.C:\n\t\t\t\tf.s.Unsubscribe()\n\t\t\t\tdelete(api.filters, id)\n\t\t\tdefault:\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tapi.filtersMu.Unlock()\n\t}\n}\n\n// NewPendingTransactionFilter creates a filter that fetches pending transaction hashes\n// as transactions enter the pending state.\n//\n// It is part of the filter package because this filter can be used through the\n// `sero_getFilterChanges` polling method that is also used for log filters.\n//\n// https://github.com/ethereum/wiki/wiki/JSON-RPC#sero_newpendingtransactionfilter\nfunc (api *PublicFilterAPI) NewPendingTransactionFilter() rpc.ID {\n\tvar (\n\t\tpendingTxs   = make(chan []common.Hash)\n\t\tpendingTxSub = api.events.SubscribePendingTxs(pendingTxs)\n\t)\n\n\tapi.filtersMu.Lock()\n\tapi.filters[pendingTxSub.ID] = &filter{typ: PendingTransactionsSubscription, deadline: time.NewTimer(deadline), hashes: make([]common.Hash, 0), s: pendingTxSub}\n\tapi.filtersMu.Unlock()\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase ph := <-pendingTxs:\n\t\t\t\tapi.filtersMu.Lock()\n\t\t\t\tif f, found := api.filters[pendingTxSub.ID]; found {\n\t\t\t\t\tf.hashes = append(f.hashes, ph...)\n\t\t\t\t}\n\t\t\t\tapi.filtersMu.Unlock()\n\t\t\tcase <-pendingTxSub.Err():\n\t\t\t\tapi.filtersMu.Lock()\n\t\t\t\tdelete(api.filters, pendingTxSub.ID)\n\t\t\t\tapi.filtersMu.Unlock()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn pendingTxSub.ID\n}\n\n// NewPendingTransactions creates a subscription that is triggered each time a transaction\n// enters the transaction pool and was signed from one of the transactions this nodes manages.\nfunc (api *PublicFilterAPI) NewPendingTransactions(ctx context.Context) (*rpc.Subscription, error) {\n\tnotifier, supported := rpc.NotifierFromContext(ctx)\n\tif !supported {\n\t\treturn &rpc.Subscription{}, rpc.ErrNotificationsUnsupported\n\t}\n\n\trpcSub := notifier.CreateSubscription()\n\n\tgo func() {\n\t\ttxHashes := make(chan []common.Hash, 128)\n\t\tpendingTxSub := api.events.SubscribePendingTxs(txHashes)\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase hashes := <-txHashes:\n\t\t\t\t// To keep the original behaviour, send a single tx hash in one notification.\n\t\t\t\t// TODO(rjl493456442) Send a batch of tx hashes in one notification\n\t\t\t\tfor _, h := range hashes {\n\t\t\t\t\tnotifier.Notify(rpcSub.ID, h)\n\t\t\t\t}\n\t\t\tcase <-rpcSub.Err():\n\t\t\t\tpendingTxSub.Unsubscribe()\n\t\t\t\treturn\n\t\t\tcase <-notifier.Closed():\n\t\t\t\tpendingTxSub.Unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn rpcSub, nil\n}\n\n// NewBlockFilter creates a filter that fetches blocks that are imported into the chain.\n// It is part of the filter package since polling goes with sero_getFilterChanges.\n//\n// https://github.com/ethereum/wiki/wiki/JSON-RPC#sero_newblockfilter\nfunc (api *PublicFilterAPI) NewBlockFilter() rpc.ID {\n\tvar (\n\t\theaders   = make(chan *types.Header)\n\t\theaderSub = api.events.SubscribeNewHeads(headers)\n\t)\n\n\tapi.filtersMu.Lock()\n\tapi.filters[headerSub.ID] = &filter{typ: BlocksSubscription, deadline: time.NewTimer(deadline), hashes: make([]common.Hash, 0), s: headerSub}\n\tapi.filtersMu.Unlock()\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase h := <-headers:\n\t\t\t\tapi.filtersMu.Lock()\n\t\t\t\tif f, found := api.filters[headerSub.ID]; found {\n\t\t\t\t\tf.hashes = append(f.hashes, h.Hash())\n\t\t\t\t}\n\t\t\t\tapi.filtersMu.Unlock()\n\t\t\tcase <-headerSub.Err():\n\t\t\t\tapi.filtersMu.Lock()\n\t\t\t\tdelete(api.filters, headerSub.ID)\n\t\t\t\tapi.filtersMu.Unlock()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn headerSub.ID\n}\n\n// NewHeads send a notification each time a new (header) block is appended to the chain.\nfunc (api *PublicFilterAPI) NewHeads(ctx context.Context) (*rpc.Subscription, error) {\n\tnotifier, supported := rpc.NotifierFromContext(ctx)\n\tif !supported {\n\t\treturn &rpc.Subscription{}, rpc.ErrNotificationsUnsupported\n\t}\n\n\trpcSub := notifier.CreateSubscription()\n\n\tgo func() {\n\t\theaders := make(chan *types.Header)\n\t\theadersSub := api.events.SubscribeNewHeads(headers)\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase h := <-headers:\n\t\t\t\tnotifier.Notify(rpcSub.ID, h)\n\t\t\tcase <-rpcSub.Err():\n\t\t\t\theadersSub.Unsubscribe()\n\t\t\t\treturn\n\t\t\tcase <-notifier.Closed():\n\t\t\t\theadersSub.Unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn rpcSub, nil\n}\n\n// Logs creates a subscription that fires for all new log that match the given filter criteria.\nfunc (api *PublicFilterAPI) Logs(ctx context.Context, crit FilterCriteria) (*rpc.Subscription, error) {\n\tnotifier, supported := rpc.NotifierFromContext(ctx)\n\tif !supported {\n\t\treturn &rpc.Subscription{}, rpc.ErrNotificationsUnsupported\n\t}\n\n\tvar (\n\t\trpcSub      = notifier.CreateSubscription()\n\t\tmatchedLogs = make(chan []*types.Log)\n\t)\n\n\tlogsSub, err := api.events.SubscribeLogs(sero.FilterQuery(crit), matchedLogs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tgo func() {\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase logs := <-matchedLogs:\n\t\t\t\tfor _, log := range logs {\n\t\t\t\t\tnotifier.Notify(rpcSub.ID, &log)\n\t\t\t\t}\n\t\t\tcase <-rpcSub.Err(): // client send an unsubscribe request\n\t\t\t\tlogsSub.Unsubscribe()\n\t\t\t\treturn\n\t\t\tcase <-notifier.Closed(): // connection dropped\n\t\t\t\tlogsSub.Unsubscribe()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn rpcSub, nil\n}\n\n// FilterCriteria represents a request to create a new filter.\n// Same as sero.FilterQuery but with UnmarshalJSON() method.\ntype FilterCriteria sero.FilterQuery\n\n// NewFilter creates a new filter and returns the filter id. It can be\n// used to retrieve logs when the state changes. This method cannot be\n// used to fetch logs that are already stored in the state.\n//\n// Default criteria for the from and to block are \"latest\".\n// Using \"latest\" as block number will return logs for mined blocks.\n// Using \"pending\" as block number returns logs for not yet mined (pending) blocks.\n// In case logs are removed (chain reorg) previously returned logs are returned\n// again but with the removed property set to true.\n//\n// In case \"fromBlock\" > \"toBlock\" an error is returned.\n//\n// https://github.com/ethereum/wiki/wiki/JSON-RPC#sero_newfilter\nfunc (api *PublicFilterAPI) NewFilter(crit FilterCriteria) (rpc.ID, error) {\n\tlogs := make(chan []*types.Log)\n\tlogsSub, err := api.events.SubscribeLogs(sero.FilterQuery(crit), logs)\n\tif err != nil {\n\t\treturn rpc.ID(\"\"), err\n\t}\n\n\tapi.filtersMu.Lock()\n\tapi.filters[logsSub.ID] = &filter{typ: LogsSubscription, crit: crit, deadline: time.NewTimer(deadline), logs: make([]*types.Log, 0), s: logsSub}\n\tapi.filtersMu.Unlock()\n\n\tgo func() {\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase l := <-logs:\n\t\t\t\tapi.filtersMu.Lock()\n\t\t\t\tif f, found := api.filters[logsSub.ID]; found {\n\t\t\t\t\tf.logs = append(f.logs, l...)\n\t\t\t\t}\n\t\t\t\tapi.filtersMu.Unlock()\n\t\t\tcase <-logsSub.Err():\n\t\t\t\tapi.filtersMu.Lock()\n\t\t\t\tdelete(api.filters, logsSub.ID)\n\t\t\t\tapi.filtersMu.Unlock()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn logsSub.ID, nil\n}\n\n// GetLogs returns logs matching the given argument that are stored within the state.\n//\n// https://github.com/ethereum/wiki/wiki/JSON-RPC#sero_getlogs\nfunc (api *PublicFilterAPI) GetLogs(ctx context.Context, crit FilterCriteria) ([]*types.Log, error) {\n\tvar filter *Filter\n\tif crit.BlockHash != nil {\n\t\t// Block filter requested, construct a single-shot filter\n\t\tfilter = NewBlockFilter(api.backend, *crit.BlockHash, crit.Addresses, crit.Topics)\n\t} else {\n\t\t// Convert the RPC block numbers into internal representations\n\t\tbegin := rpc.LatestBlockNumber.Int64()\n\t\tif crit.FromBlock != nil {\n\t\t\tbegin = crit.FromBlock.Int64()\n\t\t}\n\t\tend := rpc.LatestBlockNumber.Int64()\n\t\tif crit.ToBlock != nil {\n\t\t\tend = crit.ToBlock.Int64()\n\t\t}\n\t\t// Construct the range filter\n\t\tfilter = NewRangeFilter(api.backend, begin, end, crit.Addresses, crit.Topics)\n\t}\n\t// Run the filter and return all the logs\n\tlogs, err := filter.Logs(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn returnLogs(logs), err\n}\n\n// UninstallFilter removes the filter with the given filter id.\n//\n// https://github.com/ethereum/wiki/wiki/JSON-RPC#sero_uninstallfilter\nfunc (api *PublicFilterAPI) UninstallFilter(id rpc.ID) bool {\n\tapi.filtersMu.Lock()\n\tf, found := api.filters[id]\n\tif found {\n\t\tdelete(api.filters, id)\n\t}\n\tapi.filtersMu.Unlock()\n\tif found {\n\t\tf.s.Unsubscribe()\n\t}\n\n\treturn found\n}\n\n// GetFilterLogs returns the logs for the filter with the given id.\n// If the filter could not be found an empty array of logs is returned.\n//\n// https://github.com/ethereum/wiki/wiki/JSON-RPC#sero_getfilterlogs\nfunc (api *PublicFilterAPI) GetFilterLogs(ctx context.Context, id rpc.ID) ([]*types.Log, error) {\n\tapi.filtersMu.Lock()\n\tf, found := api.filters[id]\n\tapi.filtersMu.Unlock()\n\n\tif !found || f.typ != LogsSubscription {\n\t\treturn nil, fmt.Errorf(\"filter not found\")\n\t}\n\n\tvar filter *Filter\n\tif f.crit.BlockHash != nil {\n\t\t// Block filter requested, construct a single-shot filter\n\t\tfilter = NewBlockFilter(api.backend, *f.crit.BlockHash, f.crit.Addresses, f.crit.Topics)\n\t} else {\n\t\t// Convert the RPC block numbers into internal representations\n\t\tbegin := rpc.LatestBlockNumber.Int64()\n\t\tif f.crit.FromBlock != nil {\n\t\t\tbegin = f.crit.FromBlock.Int64()\n\t\t}\n\t\tend := rpc.LatestBlockNumber.Int64()\n\t\tif f.crit.ToBlock != nil {\n\t\t\tend = f.crit.ToBlock.Int64()\n\t\t}\n\t\t// Construct the range filter\n\t\tfilter = NewRangeFilter(api.backend, begin, end, f.crit.Addresses, f.crit.Topics)\n\t}\n\t// Run the filter and return all the logs\n\tlogs, err := filter.Logs(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn returnLogs(logs), nil\n}\n\n// GetFilterChanges returns the logs for the filter with the given id since\n// last time it was called. This can be used for polling.\n//\n// For pending transaction and block filters the result is []common.Hash.\n// (pending)Log filters return []Log.\n//\n// https://github.com/ethereum/wiki/wiki/JSON-RPC#sero_getfilterchanges\nfunc (api *PublicFilterAPI) GetFilterChanges(id rpc.ID) (interface{}, error) {\n\tapi.filtersMu.Lock()\n\tdefer api.filtersMu.Unlock()\n\n\tif f, found := api.filters[id]; found {\n\t\tif !f.deadline.Stop() {\n\t\t\t// timer expired but filter is not yet removed in timeout loop\n\t\t\t// receive timer value and reset timer\n\t\t\t<-f.deadline.C\n\t\t}\n\t\tf.deadline.Reset(deadline)\n\n\t\tswitch f.typ {\n\t\tcase PendingTransactionsSubscription, BlocksSubscription:\n\t\t\thashes := f.hashes\n\t\t\tf.hashes = nil\n\t\t\treturn returnHashes(hashes), nil\n\t\tcase LogsSubscription:\n\t\t\tlogs := f.logs\n\t\t\tf.logs = nil\n\t\t\treturn returnLogs(logs), nil\n\t\t}\n\t}\n\n\treturn []interface{}{}, fmt.Errorf(\"filter not found\")\n}\n\n// returnHashes is a helper that will return an empty hash array case the given hash array is nil,\n// otherwise the given hashes array is returned.\nfunc returnHashes(hashes []common.Hash) []common.Hash {\n\tif hashes == nil {\n\t\treturn []common.Hash{}\n\t}\n\treturn hashes\n}\n\n// returnLogs is a helper that will return an empty log array in case the given logs array is nil,\n// otherwise the given logs array is returned.\nfunc returnLogs(logs []*types.Log) []*types.Log {\n\tif logs == nil {\n\t\treturn []*types.Log{}\n\t}\n\treturn logs\n}\n\n// UnmarshalJSON sets *args fields with given data.\nfunc (args *FilterCriteria) UnmarshalJSON(data []byte) error {\n\ttype input struct {\n\t\tBlockHash *common.Hash     `json:\"blockHash\"`\n\t\tFromBlock *rpc.BlockNumber `json:\"fromBlock\"`\n\t\tToBlock   *rpc.BlockNumber `json:\"toBlock\"`\n\t\tAddresses interface{}      `json:\"address\"`\n\t\tTopics    []interface{}    `json:\"topics\"`\n\t}\n\n\tvar raw input\n\tif err := json.Unmarshal(data, &raw); err != nil {\n\t\treturn err\n\t}\n\n\tif raw.BlockHash != nil {\n\t\tif raw.FromBlock != nil || raw.ToBlock != nil {\n\t\t\t// BlockHash is mutually exclusive with FromBlock/ToBlock criteria\n\t\t\treturn fmt.Errorf(\"cannot specify both BlockHash and FromBlock/ToBlock, choose one or the other\")\n\t\t}\n\t\targs.BlockHash = raw.BlockHash\n\t} else {\n\t\tif raw.FromBlock != nil {\n\t\t\targs.FromBlock = big.NewInt(raw.FromBlock.Int64())\n\t\t}\n\n\t\tif raw.ToBlock != nil {\n\t\t\targs.ToBlock = big.NewInt(raw.ToBlock.Int64())\n\t\t}\n\t}\n\n\targs.Addresses = []common.Address{}\n\n\tif raw.Addresses != nil {\n\t\t// raw.Data can contain a single address or an array of addresses\n\t\tswitch rawAddr := raw.Addresses.(type) {\n\t\tcase []interface{}:\n\t\t\tfor i, addr := range rawAddr {\n\t\t\t\tif strAddr, ok := addr.(string); ok {\n\t\t\t\t\taddr, err := decodeAddress(strAddr)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid address at index %d: %v\", i, err)\n\t\t\t\t\t}\n\t\t\t\t\targs.Addresses = append(args.Addresses, addr)\n\t\t\t\t} else {\n\t\t\t\t\treturn fmt.Errorf(\"non-string address at index %d\", i)\n\t\t\t\t}\n\t\t\t}\n\t\tcase string:\n\t\t\taddr, err := decodeAddress(rawAddr)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"invalid address: %v\", err)\n\t\t\t}\n\t\t\targs.Addresses = []common.Address{addr}\n\t\tdefault:\n\t\t\treturn errors.New(\"invalid addresses in query\")\n\t\t}\n\t}\n\n\t// topics is an array consisting of strings and/or arrays of strings.\n\t// JSON null values are converted to common.Hash{} and ignored by the filter manager.\n\tif len(raw.Topics) > 0 {\n\t\targs.Topics = make([][]common.Hash, len(raw.Topics))\n\t\tfor i, t := range raw.Topics {\n\t\t\tswitch topic := t.(type) {\n\t\t\tcase nil:\n\t\t\t\t// ignore topic when matching logs\n\n\t\t\tcase string:\n\t\t\t\t// match specific topic\n\t\t\t\ttop, err := decodeTopic(topic)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\targs.Topics[i] = []common.Hash{top}\n\n\t\t\tcase []interface{}:\n\t\t\t\t// or case e.g. [null, \"topic0\", \"topic1\"]\n\t\t\t\tfor _, rawTopic := range topic {\n\t\t\t\t\tif rawTopic == nil {\n\t\t\t\t\t\t// null component, match all\n\t\t\t\t\t\targs.Topics[i] = nil\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tif topic, ok := rawTopic.(string); ok {\n\t\t\t\t\t\tparsed, err := decodeTopic(topic)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.Topics[i] = append(args.Topics[i], parsed)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid topic(s)\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn fmt.Errorf(\"invalid topic(s)\")\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc decodeAddress(s string) (common.Address, error) {\n\treturn common.Base58ToAddress(s), nil\n}\n\nfunc decodeTopic(s string) (common.Hash, error) {\n\tb, err := hexutil.Decode(s)\n\tif err == nil && len(b) != common.HashLength {\n\t\terr = fmt.Errorf(\"hex has invalid length %d after decoding; expected %d for topic\", len(b), common.HashLength)\n\t}\n\treturn common.BytesToHash(b), err\n}\n"
  },
  {
    "path": "sero/filters/filter.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage filters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/bloombits\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\ntype Backend interface {\n\tChainDb() serodb.Database\n\tEventMux() *event.TypeMux\n\tHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error)\n\tHeaderByHash(ctx context.Context, blockHash common.Hash) (*types.Header, error)\n\tGetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error)\n\tGetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error)\n\n\tSubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription\n\tSubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription\n\tSubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription\n\tSubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription\n\n\tBloomStatus() (uint64, uint64)\n\tServiceFilter(ctx context.Context, session *bloombits.MatcherSession)\n}\n\n// Filter can be used to retrieve and filter logs.\ntype Filter struct {\n\tbackend Backend\n\n\tdb        serodb.Database\n\taddresses []common.Address\n\ttopics    [][]common.Hash\n\n\tblock      common.Hash // Block hash if filtering a single block\n\tbegin, end int64       // Range interval if filtering multiple blocks\n\n\tmatcher *bloombits.Matcher\n}\n\n// NewRangeFilter creates a new filter which uses a bloom filter on blocks to\n// figure out whether a particular block is interesting or not.\nfunc NewRangeFilter(backend Backend, begin, end int64, addresses []common.Address, topics [][]common.Hash) *Filter {\n\t// Flatten the address and topic filter clauses into a single bloombits filter\n\t// system. Since the bloombits are not positional, nil topics are permitted,\n\t// which get flattened into a nil byte slice.\n\tvar filters [][][]byte\n\tif len(addresses) > 0 {\n\t\tfilter := make([][]byte, len(addresses))\n\t\tfor i, address := range addresses {\n\t\t\tfilter[i] = address.Bytes()\n\t\t}\n\t\tfilters = append(filters, filter)\n\t}\n\tfor _, topicList := range topics {\n\t\tfilter := make([][]byte, len(topicList))\n\t\tfor i, topic := range topicList {\n\t\t\tfilter[i] = topic.Bytes()\n\t\t}\n\t\tfilters = append(filters, filter)\n\t}\n\tsize, _ := backend.BloomStatus()\n\n\t// Create a generic filter and convert it into a range filter\n\tfilter := newFilter(backend, addresses, topics)\n\n\tfilter.matcher = bloombits.NewMatcher(size, filters)\n\tfilter.begin = begin\n\tfilter.end = end\n\n\treturn filter\n}\n\n// NewBlockFilter creates a new filter which directly inspects the contents of\n// a block to figure out whether it is interesting or not.\nfunc NewBlockFilter(backend Backend, block common.Hash, addresses []common.Address, topics [][]common.Hash) *Filter {\n\t// Create a generic filter and convert it into a block filter\n\tfilter := newFilter(backend, addresses, topics)\n\tfilter.block = block\n\treturn filter\n}\n\n// newFilter creates a generic filter that can either filter based on a block hash,\n// or based on range queries. The search criteria needs to be explicitly set.\nfunc newFilter(backend Backend, addresses []common.Address, topics [][]common.Hash) *Filter {\n\treturn &Filter{\n\t\tbackend:   backend,\n\t\taddresses: addresses,\n\t\ttopics:    topics,\n\t\tdb:        backend.ChainDb(),\n\t}\n}\n\n// Logs searches the blockchain for matching log entries, returning all from the\n// first block that contains matches, updating the start of the filter accordingly.\nfunc (f *Filter) Logs(ctx context.Context) ([]*types.Log, error) {\n\t// If we're doing singleton block filtering, execute and return\n\tif f.block != (common.Hash{}) {\n\t\theader, err := f.backend.HeaderByHash(ctx, f.block)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif header == nil {\n\t\t\treturn nil, errors.New(\"unknown block\")\n\t\t}\n\t\treturn f.blockLogs(ctx, header)\n\t}\n\t// Figure out the limits of the filter range\n\theader, _ := f.backend.HeaderByNumber(ctx, rpc.LatestBlockNumber)\n\tif header == nil {\n\t\treturn nil, nil\n\t}\n\thead := header.Number.Uint64()\n\n\tif f.begin == -1 {\n\t\tf.begin = int64(head)\n\t}\n\tend := uint64(f.end)\n\tif f.end == -1 {\n\t\tend = head\n\t}\n\t// Gather all indexed logs, and finish with non indexed ones\n\tvar (\n\t\tlogs []*types.Log\n\t\terr  error\n\t)\n\tsize, sections := f.backend.BloomStatus()\n\tif indexed := sections * size; indexed > uint64(f.begin) {\n\t\tif indexed > end {\n\t\t\tlogs, err = f.indexedLogs(ctx, end)\n\t\t} else {\n\t\t\tlogs, err = f.indexedLogs(ctx, indexed-1)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn logs, err\n\t\t}\n\t}\n\trest, err := f.unindexedLogs(ctx, end)\n\tlogs = append(logs, rest...)\n\treturn logs, err\n}\n\n// indexedLogs returns the logs matching the filter criteria based on the bloom\n// bits indexed available locally or via the network.\nfunc (f *Filter) indexedLogs(ctx context.Context, end uint64) ([]*types.Log, error) {\n\t// Create a matcher session and request servicing from the backend\n\tmatches := make(chan uint64, 64)\n\n\tsession, err := f.matcher.Start(ctx, uint64(f.begin), end, matches)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer session.Close()\n\n\tf.backend.ServiceFilter(ctx, session)\n\n\t// Iterate over the matches until exhausted or context closed\n\tvar logs []*types.Log\n\n\tfor {\n\t\tselect {\n\t\tcase number, ok := <-matches:\n\t\t\t// Abort if all matches have been fulfilled\n\t\t\tif !ok {\n\t\t\t\terr := session.Error()\n\t\t\t\tif err == nil {\n\t\t\t\t\tf.begin = int64(end) + 1\n\t\t\t\t}\n\t\t\t\treturn logs, err\n\t\t\t}\n\t\t\tf.begin = int64(number) + 1\n\n\t\t\t// Retrieve the suggested block and pull any truly matching logs\n\t\t\theader, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(number))\n\t\t\tif header == nil || err != nil {\n\t\t\t\treturn logs, err\n\t\t\t}\n\t\t\tfound, err := f.checkMatches(ctx, header)\n\t\t\tif err != nil {\n\t\t\t\treturn logs, err\n\t\t\t}\n\t\t\tlogs = append(logs, found...)\n\n\t\tcase <-ctx.Done():\n\t\t\treturn logs, ctx.Err()\n\t\t}\n\t}\n}\n\n// indexedLogs returns the logs matching the filter criteria based on raw block\n// iteration and bloom matching.\nfunc (f *Filter) unindexedLogs(ctx context.Context, end uint64) ([]*types.Log, error) {\n\tvar logs []*types.Log\n\n\tfor ; f.begin <= int64(end); f.begin++ {\n\t\theader, err := f.backend.HeaderByNumber(ctx, rpc.BlockNumber(f.begin))\n\t\tif header == nil || err != nil {\n\t\t\treturn logs, err\n\t\t}\n\t\tfound, err := f.blockLogs(ctx, header)\n\t\tif err != nil {\n\t\t\treturn logs, err\n\t\t}\n\t\tlogs = append(logs, found...)\n\t}\n\treturn logs, nil\n}\n\n// blockLogs returns the logs matching the filter criteria within a single block.\nfunc (f *Filter) blockLogs(ctx context.Context, header *types.Header) (logs []*types.Log, err error) {\n\tif bloomFilter(header.Bloom, f.addresses, f.topics) {\n\t\tfound, err := f.checkMatches(ctx, header)\n\t\tif err != nil {\n\t\t\treturn logs, err\n\t\t}\n\t\tlogs = append(logs, found...)\n\t}\n\treturn logs, nil\n}\n\n// checkMatches checks if the receipts belonging to the given header contain any log events that\n// match the filter criteria. This function is called when the bloom filter signals a potential match.\nfunc (f *Filter) checkMatches(ctx context.Context, header *types.Header) (logs []*types.Log, err error) {\n\t// Get the logs of the block\n\tlogsList, err := f.backend.GetLogs(ctx, header.Hash())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar unfiltered []*types.Log\n\tfor _, logs := range logsList {\n\t\tunfiltered = append(unfiltered, logs...)\n\t}\n\tlogs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics)\n\tif len(logs) > 0 {\n\t\t// We have matching logs, check if we need to resolve full logs via the light client\n\t\tif logs[0].TxHash == (common.Hash{}) {\n\t\t\treceipts, err := f.backend.GetReceipts(ctx, header.Hash())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tunfiltered = unfiltered[:0]\n\t\t\tfor _, receipt := range receipts {\n\t\t\t\tunfiltered = append(unfiltered, receipt.Logs...)\n\t\t\t}\n\t\t\tlogs = filterLogs(unfiltered, nil, nil, f.addresses, f.topics)\n\t\t}\n\t\treturn logs, nil\n\t}\n\treturn nil, nil\n}\n\nfunc includes(addresses []common.Address, a common.Address) bool {\n\tfor _, addr := range addresses {\n\t\tif addr == a {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// filterLogs creates a slice of logs matching the given criteria.\nfunc filterLogs(logs []*types.Log, fromBlock, toBlock *big.Int, addresses []common.Address, topics [][]common.Hash) []*types.Log {\n\tvar ret []*types.Log\nLogs:\n\tfor _, log := range logs {\n\t\tif fromBlock != nil && fromBlock.Int64() >= 0 && fromBlock.Uint64() > log.BlockNumber {\n\t\t\tcontinue\n\t\t}\n\t\tif toBlock != nil && toBlock.Int64() >= 0 && toBlock.Uint64() < log.BlockNumber {\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(addresses) > 0 && !includes(addresses, log.Address) {\n\t\t\tcontinue\n\t\t}\n\t\t// If the to filtered topics is greater than the amount of topics in logs, skip.\n\t\tif len(topics) > len(log.Topics) {\n\t\t\tcontinue Logs\n\t\t}\n\t\tfor i, sub := range topics {\n\t\t\tmatch := len(sub) == 0 // empty rule set == wildcard\n\t\t\tfor _, topic := range sub {\n\t\t\t\tif log.Topics[i] == topic {\n\t\t\t\t\tmatch = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !match {\n\t\t\t\tcontinue Logs\n\t\t\t}\n\t\t}\n\t\tret = append(ret, log)\n\t}\n\treturn ret\n}\n\nfunc bloomFilter(bloom types.Bloom, addresses []common.Address, topics [][]common.Hash) bool {\n\tif len(addresses) > 0 {\n\t\tvar included bool\n\t\tfor _, addr := range addresses {\n\t\t\tif types.BloomLookup(bloom, addr) {\n\t\t\t\tincluded = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !included {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tfor _, sub := range topics {\n\t\tincluded := len(sub) == 0 // empty rule set == wildcard\n\t\tfor _, topic := range sub {\n\t\t\tif types.BloomLookup(bloom, topic) {\n\t\t\t\tincluded = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !included {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "sero/filters/filter_system.go",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package filters implements an sero filtering system for block,\n// transactions and log events.\npackage filters\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// Type determines the kind of filter and is used to put the filter in to\n// the correct bucket when added.\ntype Type byte\n\nconst (\n\t// UnknownSubscription indicates an unknown subscription type\n\tUnknownSubscription Type = iota\n\t// LogsSubscription queries for new or removed (chain reorg) logs\n\tLogsSubscription\n\t// PendingLogsSubscription queries for logs in pending blocks\n\tPendingLogsSubscription\n\t// MinedAndPendingLogsSubscription queries for logs in mined and pending blocks.\n\tMinedAndPendingLogsSubscription\n\t// PendingTransactionsSubscription queries tx hashes for pending\n\t// transactions entering the pending state\n\tPendingTransactionsSubscription\n\t// BlocksSubscription queries hashes for blocks that are imported\n\tBlocksSubscription\n\t// LastSubscription keeps track of the last index\n\tLastIndexSubscription\n)\n\nconst (\n\n\t// txChanSize is the size of channel listening to NewTxsEvent.\n\t// The number is referenced from the size of tx pool.\n\ttxChanSize = 4096\n\t// rmLogsChanSize is the size of channel listening to RemovedLogsEvent.\n\trmLogsChanSize = 10\n\t// logsChanSize is the size of channel listening to LogsEvent.\n\tlogsChanSize = 10\n\t// chainEvChanSize is the size of channel listening to ChainEvent.\n\tchainEvChanSize = 10\n)\n\nvar (\n\tErrInvalidSubscriptionID = errors.New(\"invalid id\")\n)\n\ntype subscription struct {\n\tid        rpc.ID\n\ttyp       Type\n\tcreated   time.Time\n\tlogsCrit  sero.FilterQuery\n\tlogs      chan []*types.Log\n\thashes    chan []common.Hash\n\theaders   chan *types.Header\n\tinstalled chan struct{} // closed when the filter is installed\n\terr       chan error    // closed when the filter is uninstalled\n}\n\n// EventSystem creates subscriptions, processes events and broadcasts them to the\n// subscription which match the subscription criteria.\ntype EventSystem struct {\n\tmux       *event.TypeMux\n\tbackend   Backend\n\tlightMode bool\n\tlastHead  *types.Header\n\n\t// Subscriptions\n\ttxsSub        event.Subscription         // Subscription for new transaction event\n\tlogsSub       event.Subscription         // Subscription for new log event\n\trmLogsSub     event.Subscription         // Subscription for removed log event\n\tchainSub      event.Subscription         // Subscription for new chain event\n\tpendingLogSub *event.TypeMuxSubscription // Subscription for pending log event\n\n\t// Channels\n\tinstall   chan *subscription         // install filter for event notification\n\tuninstall chan *subscription         // remove filter for event notification\n\ttxsCh     chan core.NewTxsEvent      // Channel to receive new transactions event\n\tlogsCh    chan []*types.Log          // Channel to receive new log event\n\trmLogsCh  chan core.RemovedLogsEvent // Channel to receive removed log event\n\tchainCh   chan core.ChainEvent       // Channel to receive new chain event\n}\n\n// NewEventSystem creates a new manager that listens for event on the given mux,\n// parses and filters them. It uses the all map to retrieve filter changes. The\n// work loop holds its own index that is used to forward events to filters.\n//\n// The returned manager has a loop that needs to be stopped with the Stop function\n// or by stopping the given mux.\nfunc NewEventSystem(mux *event.TypeMux, backend Backend, lightMode bool) *EventSystem {\n\tm := &EventSystem{\n\t\tmux:       mux,\n\t\tbackend:   backend,\n\t\tlightMode: lightMode,\n\t\tinstall:   make(chan *subscription),\n\t\tuninstall: make(chan *subscription),\n\t\ttxsCh:     make(chan core.NewTxsEvent, txChanSize),\n\t\tlogsCh:    make(chan []*types.Log, logsChanSize),\n\t\trmLogsCh:  make(chan core.RemovedLogsEvent, rmLogsChanSize),\n\t\tchainCh:   make(chan core.ChainEvent, chainEvChanSize),\n\t}\n\n\t// Subscribe events\n\tm.txsSub = m.backend.SubscribeNewTxsEvent(m.txsCh)\n\tm.logsSub = m.backend.SubscribeLogsEvent(m.logsCh)\n\tm.rmLogsSub = m.backend.SubscribeRemovedLogsEvent(m.rmLogsCh)\n\tm.chainSub = m.backend.SubscribeChainEvent(m.chainCh)\n\t// TODO(rjl493456442): use feed to subscribe pending log event\n\tm.pendingLogSub = m.mux.Subscribe(core.PendingLogsEvent{})\n\n\t// Make sure none of the subscriptions are empty\n\tif m.txsSub == nil || m.logsSub == nil || m.rmLogsSub == nil || m.chainSub == nil ||\n\t\tm.pendingLogSub.Closed() {\n\t\tlog.Crit(\"Subscribe for event system failed\")\n\t}\n\n\tgo m.eventLoop()\n\treturn m\n}\n\n// Subscription is created when the client registers itself for a particular event.\ntype Subscription struct {\n\tID        rpc.ID\n\tf         *subscription\n\tes        *EventSystem\n\tunsubOnce sync.Once\n}\n\n// Err returns a channel that is closed when unsubscribed.\nfunc (sub *Subscription) Err() <-chan error {\n\treturn sub.f.err\n}\n\n// Unsubscribe uninstalls the subscription from the event broadcast loop.\nfunc (sub *Subscription) Unsubscribe() {\n\tsub.unsubOnce.Do(func() {\n\tuninstallLoop:\n\t\tfor {\n\t\t\t// write uninstall request and consume logs/hashes. This prevents\n\t\t\t// the eventLoop broadcast method to deadlock when writing to the\n\t\t\t// filter event channel while the subscription loop is waiting for\n\t\t\t// this method to return (and thus not reading these events).\n\t\t\tselect {\n\t\t\tcase sub.es.uninstall <- sub.f:\n\t\t\t\tbreak uninstallLoop\n\t\t\tcase <-sub.f.logs:\n\t\t\tcase <-sub.f.hashes:\n\t\t\tcase <-sub.f.headers:\n\t\t\t}\n\t\t}\n\n\t\t// wait for filter to be uninstalled in work loop before returning\n\t\t// this ensures that the manager won't use the event channel which\n\t\t// will probably be closed by the client asap after this method returns.\n\t\t<-sub.Err()\n\t})\n}\n\n// subscribe installs the subscription in the event broadcast loop.\nfunc (es *EventSystem) subscribe(sub *subscription) *Subscription {\n\tes.install <- sub\n\t<-sub.installed\n\treturn &Subscription{ID: sub.id, f: sub, es: es}\n}\n\n// SubscribeLogs creates a subscription that will write all logs matching the\n// given criteria to the given logs channel. Default value for the from and to\n// block is \"latest\". If the fromBlock > toBlock an error is returned.\nfunc (es *EventSystem) SubscribeLogs(crit sero.FilterQuery, logs chan []*types.Log) (*Subscription, error) {\n\tvar from, to rpc.BlockNumber\n\tif crit.FromBlock == nil {\n\t\tfrom = rpc.LatestBlockNumber\n\t} else {\n\t\tfrom = rpc.BlockNumber(crit.FromBlock.Int64())\n\t}\n\tif crit.ToBlock == nil {\n\t\tto = rpc.LatestBlockNumber\n\t} else {\n\t\tto = rpc.BlockNumber(crit.ToBlock.Int64())\n\t}\n\n\t// only interested in pending logs\n\tif from == rpc.PendingBlockNumber && to == rpc.PendingBlockNumber {\n\t\treturn es.subscribePendingLogs(crit, logs), nil\n\t}\n\t// only interested in new mined logs\n\tif from == rpc.LatestBlockNumber && to == rpc.LatestBlockNumber {\n\t\treturn es.subscribeLogs(crit, logs), nil\n\t}\n\t// only interested in mined logs within a specific block range\n\tif from >= 0 && to >= 0 && to >= from {\n\t\treturn es.subscribeLogs(crit, logs), nil\n\t}\n\t// interested in mined logs from a specific block number, new logs and pending logs\n\tif from >= rpc.LatestBlockNumber && to == rpc.PendingBlockNumber {\n\t\treturn es.subscribeMinedPendingLogs(crit, logs), nil\n\t}\n\t// interested in logs from a specific block number to new mined blocks\n\tif from >= 0 && to == rpc.LatestBlockNumber {\n\t\treturn es.subscribeLogs(crit, logs), nil\n\t}\n\treturn nil, fmt.Errorf(\"invalid from and to block combination: from > to\")\n}\n\n// subscribeMinedPendingLogs creates a subscription that returned mined and\n// pending logs that match the given criteria.\nfunc (es *EventSystem) subscribeMinedPendingLogs(crit sero.FilterQuery, logs chan []*types.Log) *Subscription {\n\tsub := &subscription{\n\t\tid:        rpc.NewID(),\n\t\ttyp:       MinedAndPendingLogsSubscription,\n\t\tlogsCrit:  crit,\n\t\tcreated:   time.Now(),\n\t\tlogs:      logs,\n\t\thashes:    make(chan []common.Hash),\n\t\theaders:   make(chan *types.Header),\n\t\tinstalled: make(chan struct{}),\n\t\terr:       make(chan error),\n\t}\n\treturn es.subscribe(sub)\n}\n\n// subscribeLogs creates a subscription that will write all logs matching the\n// given criteria to the given logs channel.\nfunc (es *EventSystem) subscribeLogs(crit sero.FilterQuery, logs chan []*types.Log) *Subscription {\n\tsub := &subscription{\n\t\tid:        rpc.NewID(),\n\t\ttyp:       LogsSubscription,\n\t\tlogsCrit:  crit,\n\t\tcreated:   time.Now(),\n\t\tlogs:      logs,\n\t\thashes:    make(chan []common.Hash),\n\t\theaders:   make(chan *types.Header),\n\t\tinstalled: make(chan struct{}),\n\t\terr:       make(chan error),\n\t}\n\treturn es.subscribe(sub)\n}\n\n// subscribePendingLogs creates a subscription that writes transaction hashes for\n// transactions that enter the transaction pool.\nfunc (es *EventSystem) subscribePendingLogs(crit sero.FilterQuery, logs chan []*types.Log) *Subscription {\n\tsub := &subscription{\n\t\tid:        rpc.NewID(),\n\t\ttyp:       PendingLogsSubscription,\n\t\tlogsCrit:  crit,\n\t\tcreated:   time.Now(),\n\t\tlogs:      logs,\n\t\thashes:    make(chan []common.Hash),\n\t\theaders:   make(chan *types.Header),\n\t\tinstalled: make(chan struct{}),\n\t\terr:       make(chan error),\n\t}\n\treturn es.subscribe(sub)\n}\n\n// SubscribeNewHeads creates a subscription that writes the header of a block that is\n// imported in the chain.\nfunc (es *EventSystem) SubscribeNewHeads(headers chan *types.Header) *Subscription {\n\tsub := &subscription{\n\t\tid:        rpc.NewID(),\n\t\ttyp:       BlocksSubscription,\n\t\tcreated:   time.Now(),\n\t\tlogs:      make(chan []*types.Log),\n\t\thashes:    make(chan []common.Hash),\n\t\theaders:   headers,\n\t\tinstalled: make(chan struct{}),\n\t\terr:       make(chan error),\n\t}\n\treturn es.subscribe(sub)\n}\n\n// SubscribePendingTxs creates a subscription that writes transaction hashes for\n// transactions that enter the transaction pool.\nfunc (es *EventSystem) SubscribePendingTxs(hashes chan []common.Hash) *Subscription {\n\tsub := &subscription{\n\t\tid:        rpc.NewID(),\n\t\ttyp:       PendingTransactionsSubscription,\n\t\tcreated:   time.Now(),\n\t\tlogs:      make(chan []*types.Log),\n\t\thashes:    hashes,\n\t\theaders:   make(chan *types.Header),\n\t\tinstalled: make(chan struct{}),\n\t\terr:       make(chan error),\n\t}\n\treturn es.subscribe(sub)\n}\n\ntype filterIndex map[Type]map[rpc.ID]*subscription\n\n// broadcast event to filters that match criteria.\nfunc (es *EventSystem) broadcast(filters filterIndex, ev interface{}) {\n\tif ev == nil {\n\t\treturn\n\t}\n\n\tswitch e := ev.(type) {\n\tcase []*types.Log:\n\t\tif len(e) > 0 {\n\t\t\tfor _, f := range filters[LogsSubscription] {\n\t\t\t\tif matchedLogs := filterLogs(e, f.logsCrit.FromBlock, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 {\n\t\t\t\t\tf.logs <- matchedLogs\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase core.RemovedLogsEvent:\n\t\tfor _, f := range filters[LogsSubscription] {\n\t\t\tif matchedLogs := filterLogs(e.Logs, f.logsCrit.FromBlock, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 {\n\t\t\t\tf.logs <- matchedLogs\n\t\t\t}\n\t\t}\n\tcase *event.TypeMuxEvent:\n\t\tif muxe, ok := e.Data.(core.PendingLogsEvent); ok {\n\t\t\tfor _, f := range filters[PendingLogsSubscription] {\n\t\t\t\tif e.Time.After(f.created) {\n\t\t\t\t\tif matchedLogs := filterLogs(muxe.Logs, nil, f.logsCrit.ToBlock, f.logsCrit.Addresses, f.logsCrit.Topics); len(matchedLogs) > 0 {\n\t\t\t\t\t\tf.logs <- matchedLogs\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase core.NewTxsEvent:\n\t\thashes := make([]common.Hash, 0, len(e.Txs))\n\t\tfor _, tx := range e.Txs {\n\t\t\thashes = append(hashes, tx.Hash())\n\t\t}\n\t\tfor _, f := range filters[PendingTransactionsSubscription] {\n\t\t\tf.hashes <- hashes\n\t\t}\n\tcase core.ChainEvent:\n\t\tfor _, f := range filters[BlocksSubscription] {\n\t\t\tf.headers <- e.Block.Header()\n\t\t}\n\t\tif es.lightMode && len(filters[LogsSubscription]) > 0 {\n\t\t\tes.lightFilterNewHead(e.Block.Header(), func(header *types.Header, remove bool) {\n\t\t\t\tfor _, f := range filters[LogsSubscription] {\n\t\t\t\t\tif matchedLogs := es.lightFilterLogs(header, f.logsCrit.Addresses, f.logsCrit.Topics, remove); len(matchedLogs) > 0 {\n\t\t\t\t\t\tf.logs <- matchedLogs\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n}\n\nfunc (es *EventSystem) lightFilterNewHead(newHeader *types.Header, callBack func(*types.Header, bool)) {\n\toldh := es.lastHead\n\tes.lastHead = newHeader\n\tif oldh == nil {\n\t\treturn\n\t}\n\tnewh := newHeader\n\t// find common ancestor, create list of rolled back and new block hashes\n\tvar oldHeaders, newHeaders []*types.Header\n\tfor oldh.Hash() != newh.Hash() {\n\t\tif oldh.Number.Uint64() >= newh.Number.Uint64() {\n\t\t\toldHeaders = append(oldHeaders, oldh)\n\t\t\toldh = rawdb.ReadHeader(es.backend.ChainDb(), oldh.ParentHash, oldh.Number.Uint64()-1)\n\t\t}\n\t\tif oldh.Number.Uint64() < newh.Number.Uint64() {\n\t\t\tnewHeaders = append(newHeaders, newh)\n\t\t\tnewh = rawdb.ReadHeader(es.backend.ChainDb(), newh.ParentHash, newh.Number.Uint64()-1)\n\t\t\tif newh == nil {\n\t\t\t\t// happens when CHT syncing, nothing to do\n\t\t\t\tnewh = oldh\n\t\t\t}\n\t\t}\n\t}\n\t// roll back old blocks\n\tfor _, h := range oldHeaders {\n\t\tcallBack(h, true)\n\t}\n\t// check new blocks (array is in reverse order)\n\tfor i := len(newHeaders) - 1; i >= 0; i-- {\n\t\tcallBack(newHeaders[i], false)\n\t}\n}\n\n// filter logs of a single header in light client mode\nfunc (es *EventSystem) lightFilterLogs(header *types.Header, addresses []common.Address, topics [][]common.Hash, remove bool) []*types.Log {\n\tif bloomFilter(header.Bloom, addresses, topics) {\n\t\t// Get the logs of the block\n\t\tctx, cancel := context.WithTimeout(context.Background(), time.Second*5)\n\t\tdefer cancel()\n\t\tlogsList, err := es.backend.GetLogs(ctx, header.Hash())\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\tvar unfiltered []*types.Log\n\t\tfor _, logs := range logsList {\n\t\t\tfor _, log := range logs {\n\t\t\t\tlogcopy := *log\n\t\t\t\tlogcopy.Removed = remove\n\t\t\t\tunfiltered = append(unfiltered, &logcopy)\n\t\t\t}\n\t\t}\n\t\tlogs := filterLogs(unfiltered, nil, nil, addresses, topics)\n\t\tif len(logs) > 0 && logs[0].TxHash == (common.Hash{}) {\n\t\t\t// We have matching but non-derived logs\n\t\t\treceipts, err := es.backend.GetReceipts(ctx, header.Hash())\n\t\t\tif err != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tunfiltered = unfiltered[:0]\n\t\t\tfor _, receipt := range receipts {\n\t\t\t\tfor _, log := range receipt.Logs {\n\t\t\t\t\tlogcopy := *log\n\t\t\t\t\tlogcopy.Removed = remove\n\t\t\t\t\tunfiltered = append(unfiltered, &logcopy)\n\t\t\t\t}\n\t\t\t}\n\t\t\tlogs = filterLogs(unfiltered, nil, nil, addresses, topics)\n\t\t}\n\t\treturn logs\n\t}\n\treturn nil\n}\n\n// eventLoop (un)installs filters and processes mux events.\nfunc (es *EventSystem) eventLoop() {\n\t// Ensure all subscriptions get cleaned up\n\tdefer func() {\n\t\tes.pendingLogSub.Unsubscribe()\n\t\tes.txsSub.Unsubscribe()\n\t\tes.logsSub.Unsubscribe()\n\t\tes.rmLogsSub.Unsubscribe()\n\t\tes.chainSub.Unsubscribe()\n\t}()\n\n\tindex := make(filterIndex)\n\tfor i := UnknownSubscription; i < LastIndexSubscription; i++ {\n\t\tindex[i] = make(map[rpc.ID]*subscription)\n\t}\n\n\tfor {\n\t\tselect {\n\t\t// Handle subscribed events\n\t\tcase ev := <-es.txsCh:\n\t\t\tes.broadcast(index, ev)\n\t\tcase ev := <-es.logsCh:\n\t\t\tes.broadcast(index, ev)\n\t\tcase ev := <-es.rmLogsCh:\n\t\t\tes.broadcast(index, ev)\n\t\tcase ev := <-es.chainCh:\n\t\t\tes.broadcast(index, ev)\n\t\tcase ev, active := <-es.pendingLogSub.Chan():\n\t\t\tif !active { // system stopped\n\t\t\t\treturn\n\t\t\t}\n\t\t\tes.broadcast(index, ev)\n\n\t\tcase f := <-es.install:\n\t\t\tif f.typ == MinedAndPendingLogsSubscription {\n\t\t\t\t// the type are logs and pending logs subscriptions\n\t\t\t\tindex[LogsSubscription][f.id] = f\n\t\t\t\tindex[PendingLogsSubscription][f.id] = f\n\t\t\t} else {\n\t\t\t\tindex[f.typ][f.id] = f\n\t\t\t}\n\t\t\tclose(f.installed)\n\n\t\tcase f := <-es.uninstall:\n\t\t\tif f.typ == MinedAndPendingLogsSubscription {\n\t\t\t\t// the type are logs and pending logs subscriptions\n\t\t\t\tdelete(index[LogsSubscription], f.id)\n\t\t\t\tdelete(index[PendingLogsSubscription], f.id)\n\t\t\t} else {\n\t\t\t\tdelete(index[f.typ], f.id)\n\t\t\t}\n\t\t\tclose(f.err)\n\n\t\t// System stopped\n\t\tcase <-es.txsSub.Err():\n\t\t\treturn\n\t\tcase <-es.logsSub.Err():\n\t\t\treturn\n\t\tcase <-es.rmLogsSub.Err():\n\t\t\treturn\n\t\tcase <-es.chainSub.Err():\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "sero/gasprice/gasprice.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage gasprice\n\nimport (\n\t\"context\"\n\t\"math/big\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/internal/ethapi\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\nvar maxPrice = big.NewInt(500 * params.Gta)\n\ntype Config struct {\n\tBlocks     int\n\tPercentile int\n\tDefault    *big.Int `toml:\",omitempty\"`\n}\n\n// Oracle recommends gas prices based on the content of recent\n// blocks. Suitable for both light and full clients.\ntype Oracle struct {\n\tbackend   ethapi.Backend\n\tlastHead  common.Hash\n\tlastPrice *big.Int\n\tcacheLock sync.RWMutex\n\tfetchLock sync.Mutex\n\n\tcheckBlocks, maxEmpty, maxBlocks int\n\tpercentile                       int\n}\n\n// NewOracle returns a new oracle.\nfunc NewOracle(backend ethapi.Backend, params Config) *Oracle {\n\tblocks := params.Blocks\n\tif blocks < 1 {\n\t\tblocks = 1\n\t}\n\tpercent := params.Percentile\n\tif percent < 0 {\n\t\tpercent = 0\n\t}\n\tif percent > 100 {\n\t\tpercent = 100\n\t}\n\treturn &Oracle{\n\t\tbackend:     backend,\n\t\tlastPrice:   params.Default,\n\t\tcheckBlocks: blocks,\n\t\tmaxEmpty:    blocks / 2,\n\t\tmaxBlocks:   blocks * 5,\n\t\tpercentile:  percent,\n\t}\n}\n\n// SuggestPrice returns the recommended gas price.\nfunc (gpo *Oracle) SuggestPrice(ctx context.Context) (*big.Int, error) {\n\tgpo.cacheLock.RLock()\n\tlastHead := gpo.lastHead\n\tlastPrice := gpo.lastPrice\n\tgpo.cacheLock.RUnlock()\n\n\thead, _ := gpo.backend.HeaderByNumber(ctx, rpc.LatestBlockNumber)\n\theadHash := head.Hash()\n\tif headHash == lastHead {\n\t\treturn lastPrice, nil\n\t}\n\n\tgpo.fetchLock.Lock()\n\tdefer gpo.fetchLock.Unlock()\n\n\t// try checking the cache again, maybe the last fetch fetched what we need\n\tgpo.cacheLock.RLock()\n\tlastHead = gpo.lastHead\n\tlastPrice = gpo.lastPrice\n\tgpo.cacheLock.RUnlock()\n\tif headHash == lastHead {\n\t\treturn lastPrice, nil\n\t}\n\n\tblockNum := head.Number.Uint64()\n\tch := make(chan getBlockPricesResult, gpo.checkBlocks)\n\tsent := 0\n\texp := 0\n\tvar blockPrices []*big.Int\n\tfor sent < gpo.checkBlocks && blockNum > 0 {\n\t\tgo gpo.getBlockPrices(ctx, blockNum, ch)\n\t\tsent++\n\t\texp++\n\t\tblockNum--\n\t}\n\tmaxEmpty := gpo.maxEmpty\n\tfor exp > 0 {\n\t\tres := <-ch\n\t\tif res.err != nil {\n\t\t\treturn lastPrice, res.err\n\t\t}\n\t\texp--\n\t\tif res.price != nil {\n\t\t\tblockPrices = append(blockPrices, res.price)\n\t\t\tcontinue\n\t\t}\n\t\tif maxEmpty > 0 {\n\t\t\tmaxEmpty--\n\t\t\tcontinue\n\t\t}\n\t\tif blockNum > 0 && sent < gpo.maxBlocks {\n\t\t\tgo gpo.getBlockPrices(ctx, blockNum, ch)\n\t\t\tsent++\n\t\t\texp++\n\t\t\tblockNum--\n\t\t}\n\t}\n\tprice := lastPrice\n\tif len(blockPrices) > 0 {\n\t\tsort.Sort(bigIntArray(blockPrices))\n\t\tprice = blockPrices[(len(blockPrices)-1)*gpo.percentile/100]\n\t}\n\tif price.Cmp(maxPrice) > 0 {\n\t\tprice = new(big.Int).Set(maxPrice)\n\t}\n\n\tgpo.cacheLock.Lock()\n\tgpo.lastHead = headHash\n\tgpo.lastPrice = price\n\tgpo.cacheLock.Unlock()\n\treturn price, nil\n}\n\ntype getBlockPricesResult struct {\n\tprice *big.Int\n\terr   error\n}\n\ntype transactionsByGasPrice []*types.Transaction\n\nfunc (t transactionsByGasPrice) Len() int           { return len(t) }\nfunc (t transactionsByGasPrice) Swap(i, j int)      { t[i], t[j] = t[j], t[i] }\nfunc (t transactionsByGasPrice) Less(i, j int) bool { return t[i].GasPrice().Cmp(t[j].GasPrice()) < 0 }\n\n// getBlockPrices calculates the lowest transaction gas price in a given block\n// and sends it to the result channel. If the block is empty, price is nil.\nfunc (gpo *Oracle) getBlockPrices(ctx context.Context, blockNum uint64, ch chan getBlockPricesResult) {\n\tblock, err := gpo.backend.BlockByNumber(ctx, rpc.BlockNumber(blockNum))\n\tif block == nil {\n\t\tch <- getBlockPricesResult{nil, err}\n\t\treturn\n\t}\n\n\tblockTxs := block.Transactions()\n\ttxs := make([]*types.Transaction, len(blockTxs))\n\tcopy(txs, blockTxs)\n\tsort.Sort(transactionsByGasPrice(txs))\n\n\tfor _, tx := range txs {\n\t\t//sender, err := types.Sender(abi, tx)\n\t\tsender := tx.From()\n\t\tif err == nil && sender != block.Coinbase() {\n\t\t\tch <- getBlockPricesResult{tx.GasPrice(), nil}\n\t\t\treturn\n\t\t}\n\t}\n\tch <- getBlockPricesResult{nil, nil}\n}\n\ntype bigIntArray []*big.Int\n\nfunc (s bigIntArray) Len() int           { return len(s) }\nfunc (s bigIntArray) Less(i, j int) bool { return s[i].Cmp(s[j]) < 0 }\nfunc (s bigIntArray) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }\n"
  },
  {
    "path": "sero/gen_config.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage sero\n\nimport (\n\t\"math/big\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/sero/gasprice\"\n\t\"github.com/sero-cash/go-sero/zero/proofservice\"\n)\n\nvar _ = (*configMarshaling)(nil)\n\n// MarshalTOML marshals as TOML.\nfunc (c Config) MarshalTOML() (interface{}, error) {\n\ttype Config struct {\n\t\tGenesis                 *core.Genesis `toml:\",omitempty\"`\n\t\tNetworkId               uint64\n\t\tSyncMode                downloader.SyncMode\n\t\tNoPruning               bool\n\t\tMineMode                bool\n\t\tStartExchange           bool\n\t\tAutoMerge               bool\n\t\tStartLight              bool\n\t\tLightServ               int  `toml:\",omitempty\"`\n\t\tLightPeers              int  `toml:\",omitempty\"`\n\t\tSkipBcVersionCheck      bool `toml:\"-\"`\n\t\tDatabaseHandles         int  `toml:\"-\"`\n\t\tDatabaseCache           int\n\t\tTrieCache               int\n\t\tTrieTimeout             time.Duration\n\t\tMinerThreads            int           `toml:\",omitempty\"`\n\t\tExtraData               hexutil.Bytes `toml:\",omitempty\"`\n\t\tGasPrice                *big.Int\n\t\tEthash                  ethash.Config\n\t\tTxPool                  core.TxPoolConfig\n\t\tProof                   *proofservice.Config\n\t\tGPO                     gasprice.Config\n\t\tEnablePreimageRecording bool\n\t\tDocRoot                 string `toml:\"-\"`\n\t}\n\tvar enc Config\n\tenc.Genesis = c.Genesis\n\tenc.NetworkId = c.NetworkId\n\tenc.SyncMode = c.SyncMode\n\tenc.NoPruning = c.NoPruning\n\tenc.MineMode = c.MineMode\n\tenc.StartExchange = c.StartExchange\n\tenc.AutoMerge = c.AutoMerge\n\tenc.StartLight = c.StartLight\n\tenc.LightServ = c.LightServ\n\tenc.LightPeers = c.LightPeers\n\tenc.SkipBcVersionCheck = c.SkipBcVersionCheck\n\tenc.DatabaseHandles = c.DatabaseHandles\n\tenc.DatabaseCache = c.DatabaseCache\n\tenc.TrieCache = c.TrieCache\n\tenc.TrieTimeout = c.TrieTimeout\n\tenc.MinerThreads = c.MinerThreads\n\tenc.ExtraData = c.ExtraData\n\tenc.GasPrice = c.GasPrice\n\tenc.Ethash = c.Ethash\n\tenc.TxPool = c.TxPool\n\tenc.Proof = c.Proof\n\tenc.GPO = c.GPO\n\tenc.EnablePreimageRecording = c.EnablePreimageRecording\n\tenc.DocRoot = c.DocRoot\n\treturn &enc, nil\n}\n\n// UnmarshalTOML unmarshals from TOML.\nfunc (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error {\n\ttype Config struct {\n\t\tGenesis                 *core.Genesis `toml:\",omitempty\"`\n\t\tNetworkId               *uint64\n\t\tSyncMode                *downloader.SyncMode\n\t\tNoPruning               *bool\n\t\tMineMode                *bool\n\t\tStartExchange           *bool\n\t\tAutoMerge               *bool\n\t\tStartLight              *bool\n\t\tLightServ               *int  `toml:\",omitempty\"`\n\t\tLightPeers              *int  `toml:\",omitempty\"`\n\t\tSkipBcVersionCheck      *bool `toml:\"-\"`\n\t\tDatabaseHandles         *int  `toml:\"-\"`\n\t\tDatabaseCache           *int\n\t\tTrieCache               *int\n\t\tTrieTimeout             *time.Duration\n\t\tMinerThreads            *int           `toml:\",omitempty\"`\n\t\tExtraData               *hexutil.Bytes `toml:\",omitempty\"`\n\t\tGasPrice                *big.Int\n\t\tEthash                  *ethash.Config\n\t\tTxPool                  *core.TxPoolConfig\n\t\tProof                   *proofservice.Config\n\t\tGPO                     *gasprice.Config\n\t\tEnablePreimageRecording *bool\n\t\tDocRoot                 *string `toml:\"-\"`\n\t}\n\tvar dec Config\n\tif err := unmarshal(&dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Genesis != nil {\n\t\tc.Genesis = dec.Genesis\n\t}\n\tif dec.NetworkId != nil {\n\t\tc.NetworkId = *dec.NetworkId\n\t}\n\tif dec.SyncMode != nil {\n\t\tc.SyncMode = *dec.SyncMode\n\t}\n\tif dec.NoPruning != nil {\n\t\tc.NoPruning = *dec.NoPruning\n\t}\n\tif dec.MineMode != nil {\n\t\tc.MineMode = *dec.MineMode\n\t}\n\tif dec.StartExchange != nil {\n\t\tc.StartExchange = *dec.StartExchange\n\t}\n\tif dec.AutoMerge != nil {\n\t\tc.AutoMerge = *dec.AutoMerge\n\t}\n\tif dec.StartLight != nil {\n\t\tc.StartLight = *dec.StartLight\n\t}\n\tif dec.LightServ != nil {\n\t\tc.LightServ = *dec.LightServ\n\t}\n\tif dec.LightPeers != nil {\n\t\tc.LightPeers = *dec.LightPeers\n\t}\n\tif dec.SkipBcVersionCheck != nil {\n\t\tc.SkipBcVersionCheck = *dec.SkipBcVersionCheck\n\t}\n\tif dec.DatabaseHandles != nil {\n\t\tc.DatabaseHandles = *dec.DatabaseHandles\n\t}\n\tif dec.DatabaseCache != nil {\n\t\tc.DatabaseCache = *dec.DatabaseCache\n\t}\n\tif dec.TrieCache != nil {\n\t\tc.TrieCache = *dec.TrieCache\n\t}\n\tif dec.TrieTimeout != nil {\n\t\tc.TrieTimeout = *dec.TrieTimeout\n\t}\n\tif dec.MinerThreads != nil {\n\t\tc.MinerThreads = *dec.MinerThreads\n\t}\n\tif dec.ExtraData != nil {\n\t\tc.ExtraData = *dec.ExtraData\n\t}\n\tif dec.GasPrice != nil {\n\t\tc.GasPrice = dec.GasPrice\n\t}\n\tif dec.Ethash != nil {\n\t\tc.Ethash = *dec.Ethash\n\t}\n\tif dec.TxPool != nil {\n\t\tc.TxPool = *dec.TxPool\n\t}\n\tif dec.Proof != nil {\n\t\tc.Proof = dec.Proof\n\t}\n\tif dec.GPO != nil {\n\t\tc.GPO = *dec.GPO\n\t}\n\tif dec.EnablePreimageRecording != nil {\n\t\tc.EnablePreimageRecording = *dec.EnablePreimageRecording\n\t}\n\tif dec.DocRoot != nil {\n\t\tc.DocRoot = *dec.DocRoot\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "sero/handler.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"math/big\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n\t\"github.com/sero-cash/go-sero/sero/fetcher\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nconst (\n\tsoftResponseLimit = 2 * 1024 * 1024 // Target maximum size of returned blocks, headers or node data.\n\testHeaderRlpSize  = 500             // Approximate size of an RLP encoded block header\n\n\t// txChanSize is the size of channel listening to NewTxsEvent.\n\t// The number is referenced from the size of tx pool.\n\ttxChanSize       = 4096\n\tvoteChainSize    = 1000\n\tlotteryChainSize = 1000\n)\n\n// errIncompatibleConfig is returned if the requested protocols and configs are\n// not compatible (low protocol version restrictions and high requirements).\nvar errIncompatibleConfig = errors.New(\"incompatible configuration\")\n\nfunc errResp(code errCode, format string, v ...interface{}) error {\n\treturn fmt.Errorf(\"%v - %v\", code, fmt.Sprintf(format, v...))\n}\n\ntype ProtocolManager struct {\n\tnetworkID uint64\n\n\tfastSync      uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks)\n\tacceptTxs     uint32 // Flag whether we're considered synchronised (enables transaction processing)\n\tcloseAcceptTx bool\n\ttxpool        txPool\n\tminer         sero_miner\n\tvoter         shareVoter\n\tblockchain    *core.BlockChain\n\tchainconfig   *params.ChainConfig\n\tmaxPeers      int\n\n\tdownloader *downloader.Downloader\n\tfetcher    *fetcher.Fetcher\n\tpeers      *peerSet\n\n\tSubProtocols []p2p.Protocol\n\n\teventMux      *event.TypeMux\n\ttxsCh         chan core.NewTxsEvent\n\ttxsSub        event.Subscription\n\tvoteCh        chan core.NewVoteEvent\n\tvoteSub       event.Subscription\n\tminedBlockSub *event.TypeMuxSubscription\n\tlotteryCh     chan core.NewLotteryEvent\n\tlotterySub    event.Subscription\n\n\t// channels for fetcher, syncer, txsyncLoop\n\tnewPeerCh   chan *peer\n\ttxsyncCh    chan *txsync\n\tquitSync    chan struct{}\n\tnoMorePeers chan struct{}\n\n\t// wait group is used for graceful shutdowns during downloading\n\t// and processing\n\twg sync.WaitGroup\n}\n\n// NewProtocolManager returns a new Sero sub protocol manager. The Sero sub protocol manages peers capable\n// with the Sero network.\nfunc NewProtocolManager(config *params.ChainConfig, closeAcceptTx bool, mode downloader.SyncMode, networkID uint64, mux *event.TypeMux, voter shareVoter, txpool txPool, miner sero_miner, engine consensus.Engine, blockchain *core.BlockChain, chaindb serodb.Database) (*ProtocolManager, error) {\n\t// Create the protocol manager with the base fields\n\tmanager := &ProtocolManager{\n\t\tnetworkID:     networkID,\n\t\teventMux:      mux,\n\t\tcloseAcceptTx: closeAcceptTx,\n\t\ttxpool:        txpool,\n\t\tminer:         miner,\n\t\tvoter:         voter,\n\t\tblockchain:    blockchain,\n\t\tchainconfig:   config,\n\t\tpeers:         newPeerSet(),\n\t\tnewPeerCh:     make(chan *peer),\n\t\tnoMorePeers:   make(chan struct{}),\n\t\ttxsyncCh:      make(chan *txsync),\n\t\tquitSync:      make(chan struct{}),\n\t}\n\t// Figure out whether to allow fast sync or not\n\tif mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 {\n\t\tlog.Warn(\"Blockchain not empty, fast sync disabled\")\n\t\tmode = downloader.FullSync\n\t}\n\tif mode == downloader.FastSync {\n\t\tmanager.fastSync = uint32(1)\n\t}\n\t// Initiate a sub-protocol for every implemented version we can handle\n\tmanager.SubProtocols = make([]p2p.Protocol, 0, len(ProtocolVersions))\n\tfor i, version := range ProtocolVersions {\n\t\t// Skip protocol version if incompatible with the mode of operation\n\t\tif mode == downloader.FastSync && version < sero63 {\n\t\t\tcontinue\n\t\t}\n\t\t// Compatible; initialise the sub-protocol\n\t\tversion := version // Closure for the run\n\t\tprotocolName := ProtocolName\n\t\tif zconfig.IsTestFork() {\n\t\t\tprotocolName = \"fork-sero\"\n\t\t}\n\t\tmanager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{\n\t\t\tName:    protocolName,\n\t\t\tVersion: version,\n\t\t\tLength:  ProtocolLengths[i],\n\t\t\tRun: func(p *p2p.Peer, rw p2p.MsgReadWriter) error {\n\t\t\t\tpeer := manager.newPeer(int(version), p, rw)\n\t\t\t\tselect {\n\t\t\t\tcase manager.newPeerCh <- peer:\n\t\t\t\t\tmanager.wg.Add(1)\n\t\t\t\t\tdefer manager.wg.Done()\n\t\t\t\t\treturn manager.handle(peer)\n\t\t\t\tcase <-manager.quitSync:\n\t\t\t\t\treturn p2p.DiscQuitting\n\t\t\t\t}\n\t\t\t},\n\t\t\tNodeInfo: func() interface{} {\n\t\t\t\treturn manager.NodeInfo()\n\t\t\t},\n\t\t\tPeerInfo: func(id discover.NodeID) interface{} {\n\t\t\t\tif p := manager.peers.Peer(fmt.Sprintf(\"%x\", id[:8])); p != nil {\n\t\t\t\t\treturn p.Info()\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t},\n\t\t})\n\t}\n\tif len(manager.SubProtocols) == 0 {\n\t\treturn nil, errIncompatibleConfig\n\t}\n\t// Construct the different synchronisation mechanisms\n\tmanager.downloader = downloader.New(mode, chaindb, manager.eventMux, blockchain, nil, manager.removePeer)\n\n\tvalidator := func(header *types.Header) error {\n\t\treturn engine.VerifyHeader(blockchain, header, true)\n\t}\n\theighter := func() uint64 {\n\t\treturn blockchain.CurrentBlock().NumberU64()\n\t}\n\tinserter := func(blocks types.Blocks) (int, error) {\n\t\t// If fast sync is running, deny importing weird blocks\n\t\tif atomic.LoadUint32(&manager.fastSync) == 1 {\n\t\t\tlog.Warn(\"Discarded bad propagated block\", \"number\", blocks[0].Number(), \"hash\", blocks[0].Hash())\n\t\t\treturn 0, nil\n\t\t}\n\t\tatomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import\n\t\treturn manager.blockchain.InsertChain(blocks)\n\t}\n\tmanager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer)\n\n\treturn manager, nil\n}\n\nfunc (pm *ProtocolManager) removePeer(id string) {\n\t// Short circuit if the peer was already removed\n\tpeer := pm.peers.Peer(id)\n\tif peer == nil {\n\t\treturn\n\t}\n\tlog.Debug(\"Removing Sero peer\", \"peer\", id)\n\n\t// Unregister the peer from the downloader and Sero peer set\n\tpm.downloader.UnregisterPeer(id)\n\tif err := pm.peers.Unregister(id); err != nil {\n\t\tlog.Error(\"Peer removal failed\", \"peer\", id, \"err\", err)\n\t}\n\t// Hard disconnect at the networking layer\n\tif peer != nil {\n\t\tpeer.Peer.Disconnect(p2p.DiscUselessPeer)\n\t}\n}\n\nfunc (pm *ProtocolManager) Start(maxPeers int) {\n\tpm.maxPeers = maxPeers\n\n\t// broadcast transactions\n\tpm.txsCh = make(chan core.NewTxsEvent, txChanSize)\n\tpm.txsSub = pm.txpool.SubscribeNewTxsEvent(pm.txsCh)\n\tgo pm.txBroadcastLoop()\n\n\tpm.voteCh = make(chan core.NewVoteEvent, voteChainSize)\n\tpm.voteSub = pm.voter.SubscribeNewVoteEvent(pm.voteCh)\n\tgo pm.voteBroadLoop()\n\tpm.lotteryCh = make(chan core.NewLotteryEvent, lotteryChainSize)\n\tpm.lotterySub = pm.voter.SubscribeNewLotteryEvent(pm.lotteryCh)\n\tgo pm.lotteryBroadLoop()\n\n\t// broadcast mined blocks\n\tpm.minedBlockSub = pm.eventMux.Subscribe(core.NewMinedBlockEvent{})\n\tgo pm.minedBroadcastLoop()\n\n\t// start sync handlers\n\tgo pm.syncer()\n\tgo pm.txsyncLoop()\n}\n\nfunc (pm *ProtocolManager) Stop() {\n\tlog.Info(\"Stopping Sero protocol\")\n\n\tpm.txsSub.Unsubscribe()        // quits txBroadcastLoop\n\tpm.minedBlockSub.Unsubscribe() // quits blockBroadcastLoop\n\n\t// Quit the sync loop.\n\t// After this send has completed, no new peers will be accepted.\n\tpm.noMorePeers <- struct{}{}\n\n\t// Quit fetcher, txsyncLoop.\n\tclose(pm.quitSync)\n\n\t// Disconnect existing sessions.\n\t// This also closes the gate for any new registrations on the peer set.\n\t// sessions which are already established but not added to pm.peers yet\n\t// will exit when they try to register.\n\tpm.peers.Close()\n\n\t// Wait for all peer handler goroutines and the loops to come down.\n\tpm.wg.Wait()\n\n\tlog.Info(\"Sero protocol stopped\")\n}\n\nfunc (pm *ProtocolManager) newPeer(pv int, p *p2p.Peer, rw p2p.MsgReadWriter) *peer {\n\treturn newPeer(pv, p, newMeteredMsgWriter(rw))\n}\n\n// handle is the callback invoked to manage the life cycle of an sero peer. When\n// this function terminates, the peer is disconnected.\nfunc (pm *ProtocolManager) handle(p *peer) error {\n\t// Ignore maxPeers if this is a trusted peer\n\tif pm.peers.Len() >= pm.maxPeers && !p.Peer.Info().Network.Trusted {\n\t\treturn p2p.DiscTooManyPeers\n\t}\n\tp.Log().Debug(\"Sero peer connected\", \"name\", p.Name())\n\n\t// Execute the Sero handshake\n\tvar (\n\t\tgenesis = pm.blockchain.Genesis()\n\t\thead    = pm.blockchain.CurrentHeader()\n\t\thash    = head.Hash()\n\t\tnumber  = head.Number.Uint64()\n\t\ttd      = pm.blockchain.GetTd(hash, number)\n\t)\n\tif err := p.Handshake(pm.networkID, td, hash, genesis.Hash()); err != nil {\n\t\tp.Log().Debug(\"Sero handshake failed\", \"err\", err)\n\t\treturn err\n\t}\n\tif rw, ok := p.rw.(*meteredMsgReadWriter); ok {\n\t\trw.Init(p.version)\n\t}\n\t// Register the peer locally\n\tif err := pm.peers.Register(p); err != nil {\n\t\tp.Log().Error(\"Sero peer registration failed\", \"err\", err)\n\t\treturn err\n\t}\n\tdefer pm.removePeer(p.id)\n\n\t// Register the peer in the downloader. If the downloader considers it banned, we disconnect\n\tif err := pm.downloader.RegisterPeer(p.id, p.version, p); err != nil {\n\t\treturn err\n\t}\n\t// Propagate existing transactions. new transactions appearing\n\t// after this will be sent via broadcasts.\n\tpm.syncTransactions(p)\n\n\t// main loop. handle incoming messages.\n\tfor {\n\t\tif err := pm.handleMsg(p); err != nil {\n\t\t\tp.Log().Debug(\"Sero message handling failed\", \"err\", err)\n\t\t\treturn err\n\t\t}\n\t}\n}\n\n// handleMsg is invoked whenever an inbound message is received from a remote\n// peer. The remote connection is torn down upon returning any error.\nfunc (pm *ProtocolManager) handleMsg(p *peer) error {\n\t// Read the next message from the remote peer, and ensure it's fully consumed\n\tmsg, err := p.rw.ReadMsg()\n\tif err != nil {\n\t\tlog.Debug(\"handleMsg\", \"peer\", p.RemoteAddr().String(), \"err\", err)\n\t\treturn err\n\t}\n\tif msg.Size > ProtocolMaxMsgSize {\n\t\terr = errResp(ErrMsgTooLarge, \"%v > %v\", msg.Size, ProtocolMaxMsgSize)\n\t\tlog.Info(\"handleMsg\", \"err\", err)\n\t\treturn err\n\t}\n\tdefer msg.Discard()\n\n\t// Handle the message depending on its contents\n\tswitch {\n\tcase msg.Code == StatusMsg:\n\t\t// Status messages should never arrive after the handshake\n\t\treturn errResp(ErrExtraStatusMsg, \"uncontrolled status message\")\n\n\t// Block header query, collect the requested headers and reply\n\tcase msg.Code == GetBlockHeadersMsg:\n\t\t// Decode the complex header query\n\t\tvar query getBlockHeadersData\n\t\tif err := msg.Decode(&query); err != nil {\n\t\t\treturn errResp(ErrDecode, \"%v: %v\", msg, err)\n\t\t}\n\t\thashMode := query.Origin.Hash != (common.Hash{})\n\t\tfirst := true\n\t\tmaxNonCanonical := uint64(100)\n\n\t\t// Gather headers until the fetch or network limits is reached\n\t\tvar (\n\t\t\tbytes   common.StorageSize\n\t\t\theaders []*types.Header\n\t\t\tunknown bool\n\t\t)\n\t\tfor !unknown && len(headers) < int(query.Amount) && bytes < softResponseLimit && len(headers) < downloader.MaxHeaderFetch {\n\t\t\t// Retrieve the next header satisfying the query\n\t\t\tvar origin *types.Header\n\t\t\tif hashMode {\n\t\t\t\tif first {\n\t\t\t\t\tfirst = false\n\t\t\t\t\torigin = pm.blockchain.GetHeaderByHash(query.Origin.Hash)\n\t\t\t\t\tif origin != nil {\n\t\t\t\t\t\tquery.Origin.Number = origin.Number.Uint64()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\torigin = pm.blockchain.GetHeader(query.Origin.Hash, query.Origin.Number)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\torigin = pm.blockchain.GetHeaderByNumber(query.Origin.Number)\n\t\t\t}\n\t\t\tif origin == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\theaders = append(headers, origin)\n\t\t\tbytes += estHeaderRlpSize\n\n\t\t\t// Advance to the next header of the query\n\t\t\tswitch {\n\t\t\tcase hashMode && query.Reverse:\n\t\t\t\t// Hash based traversal towards the genesis block\n\t\t\t\tancestor := query.Skip + 1\n\t\t\t\tif ancestor == 0 {\n\t\t\t\t\tunknown = true\n\t\t\t\t} else {\n\t\t\t\t\tquery.Origin.Hash, query.Origin.Number = pm.blockchain.GetAncestor(query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical)\n\t\t\t\t\tunknown = (query.Origin.Hash == common.Hash{})\n\t\t\t\t}\n\t\t\tcase hashMode && !query.Reverse:\n\t\t\t\t// Hash based traversal towards the leaf block\n\t\t\t\tvar (\n\t\t\t\t\tcurrent = origin.Number.Uint64()\n\t\t\t\t\tnext    = current + query.Skip + 1\n\t\t\t\t)\n\t\t\t\tif next <= current {\n\t\t\t\t\tinfos, _ := json.MarshalIndent(p.Peer.Info(), \"\", \"  \")\n\t\t\t\t\tp.Log().Warn(\"GetBlockHeaders skip overflow attack\", \"current\", current, \"skip\", query.Skip, \"next\", next, \"attacker\", infos)\n\t\t\t\t\tunknown = true\n\t\t\t\t} else {\n\t\t\t\t\tif header := pm.blockchain.GetHeaderByNumber(next); header != nil {\n\t\t\t\t\t\tnextHash := header.Hash()\n\t\t\t\t\t\texpOldHash, _ := pm.blockchain.GetAncestor(nextHash, next, query.Skip+1, &maxNonCanonical)\n\t\t\t\t\t\tif expOldHash == query.Origin.Hash {\n\t\t\t\t\t\t\tquery.Origin.Hash, query.Origin.Number = nextHash, next\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunknown = true\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tunknown = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase query.Reverse:\n\t\t\t\t// Number based traversal towards the genesis block\n\t\t\t\tif query.Origin.Number >= query.Skip+1 {\n\t\t\t\t\tquery.Origin.Number -= query.Skip + 1\n\t\t\t\t} else {\n\t\t\t\t\tunknown = true\n\t\t\t\t}\n\n\t\t\tcase !query.Reverse:\n\t\t\t\t// Number based traversal towards the leaf block\n\t\t\t\tquery.Origin.Number += query.Skip + 1\n\t\t\t}\n\t\t}\n\t\treturn p.SendBlockHeaders(headers)\n\n\tcase msg.Code == BlockHeadersMsg:\n\t\t// A batch of headers arrived to one of our previous requests\n\t\tvar headers []*types.Header\n\t\tif err := msg.Decode(&headers); err != nil {\n\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t}\n\t\t// Filter out any explicitly requested headers, deliver the rest to the downloader\n\t\tfilter := len(headers) == 1\n\t\tif filter {\n\t\t\t// Irrelevant of the fork checks, send the header to the fetcher just in case\n\t\t\theaders = pm.fetcher.FilterHeaders(p.id, headers, time.Now())\n\t\t}\n\t\tif len(headers) > 0 || !filter {\n\t\t\terr := pm.downloader.DeliverHeaders(p.id, headers)\n\t\t\tif err != nil {\n\t\t\t\tlog.Debug(\"Failed to deliver headers\", \"err\", err)\n\t\t\t}\n\t\t}\n\n\tcase msg.Code == GetBlockBodiesMsg:\n\t\t// Decode the retrieval message\n\t\tmsgStream := rlp.NewStream(msg.Payload, uint64(msg.Size))\n\t\tif _, err := msgStream.List(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Gather blocks until the fetch or network limits is reached\n\t\tvar (\n\t\t\thash   common.Hash\n\t\t\tbytes  int\n\t\t\tbodies []rlp.RawValue\n\t\t)\n\t\tfor bytes < softResponseLimit && len(bodies) < downloader.MaxBlockFetch {\n\t\t\t// Retrieve the hash of the next block\n\t\t\tif err := msgStream.Decode(&hash); err == rlp.EOL {\n\t\t\t\tbreak\n\t\t\t} else if err != nil {\n\t\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t\t}\n\t\t\t// Retrieve the requested block body, stopping if enough was found\n\t\t\tif data := pm.blockchain.GetBodyRLP(hash); len(data) != 0 {\n\t\t\t\tbodies = append(bodies, data)\n\t\t\t\tbytes += len(data)\n\t\t\t}\n\t\t}\n\t\treturn p.SendBlockBodiesRLP(bodies)\n\n\tcase msg.Code == BlockBodiesMsg:\n\t\t// A batch of block bodies arrived to one of our previous requests\n\t\tvar request blockBodiesData\n\t\tif err := msg.Decode(&request); err != nil {\n\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t}\n\t\t// Deliver them all to the downloader for queuing\n\t\ttransactions := make([][]*types.Transaction, len(request))\n\n\t\tfor i, body := range request {\n\t\t\ttransactions[i] = body.Transactions\n\t\t}\n\t\t// Filter out any explicitly requested bodies, deliver the rest to the downloader\n\t\tfilter := len(transactions) > 0\n\t\tif filter {\n\t\t\ttransactions = pm.fetcher.FilterBodies(p.id, transactions, time.Now())\n\t\t}\n\t\tif len(transactions) > 0 || !filter {\n\t\t\terr := pm.downloader.DeliverBodies(p.id, transactions)\n\t\t\tif err != nil {\n\t\t\t\tlog.Debug(\"Failed to deliver bodies\", \"err\", err)\n\t\t\t}\n\t\t}\n\n\tcase p.version >= sero63 && msg.Code == GetNodeDataMsg:\n\t\t// Decode the retrieval message\n\t\tmsgStream := rlp.NewStream(msg.Payload, uint64(msg.Size))\n\t\tif _, err := msgStream.List(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Gather state data until the fetch or network limits is reached\n\t\tvar (\n\t\t\thash  common.Hash\n\t\t\tbytes int\n\t\t\tdata  [][]byte\n\t\t)\n\t\tfor bytes < softResponseLimit && len(data) < downloader.MaxStateFetch {\n\t\t\t// Retrieve the hash of the next state entry\n\t\t\tif err := msgStream.Decode(&hash); err == rlp.EOL {\n\t\t\t\tbreak\n\t\t\t} else if err != nil {\n\t\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t\t}\n\t\t\t// Retrieve the requested state entry, stopping if enough was found\n\t\t\tif entry, err := pm.blockchain.TrieNode(hash); err == nil {\n\t\t\t\tdata = append(data, entry)\n\t\t\t\tbytes += len(entry)\n\t\t\t}\n\t\t}\n\t\treturn p.SendNodeData(data)\n\n\tcase p.version >= sero63 && msg.Code == NodeDataMsg:\n\t\t// A batch of node state data arrived to one of our previous requests\n\t\tvar data [][]byte\n\t\tif err := msg.Decode(&data); err != nil {\n\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t}\n\t\t// Deliver all to the downloader\n\t\tif err := pm.downloader.DeliverNodeData(p.id, data); err != nil {\n\t\t\tlog.Debug(\"Failed to deliver node state data\", \"err\", err)\n\t\t}\n\n\tcase p.version >= sero63 && msg.Code == GetReceiptsMsg:\n\t\t// Decode the retrieval message\n\t\tmsgStream := rlp.NewStream(msg.Payload, uint64(msg.Size))\n\t\tif _, err := msgStream.List(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Gather state data until the fetch or network limits is reached\n\t\tvar (\n\t\t\thash     common.Hash\n\t\t\tbytes    int\n\t\t\treceipts []rlp.RawValue\n\t\t)\n\t\tfor bytes < softResponseLimit && len(receipts) < downloader.MaxReceiptFetch {\n\t\t\t// Retrieve the hash of the next block\n\t\t\tif err := msgStream.Decode(&hash); err == rlp.EOL {\n\t\t\t\tbreak\n\t\t\t} else if err != nil {\n\t\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t\t}\n\t\t\t// Retrieve the requested block's receipts, skipping if unknown to us\n\t\t\tresults := pm.blockchain.GetReceiptsByHash(hash)\n\t\t\tif results == nil {\n\t\t\t\tif header := pm.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If known, encode and queue for response packet\n\t\t\tif encoded, err := rlp.EncodeToBytes(results); err != nil {\n\t\t\t\tlog.Error(\"Failed to encode receipt\", \"err\", err)\n\t\t\t} else {\n\t\t\t\treceipts = append(receipts, encoded)\n\t\t\t\tbytes += len(encoded)\n\t\t\t}\n\t\t}\n\t\treturn p.SendReceiptsRLP(receipts)\n\n\tcase p.version >= sero63 && msg.Code == ReceiptsMsg:\n\t\t// A batch of receipts arrived to one of our previous requests\n\t\tvar receipts [][]*types.Receipt\n\t\tif err := msg.Decode(&receipts); err != nil {\n\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t}\n\t\t// Deliver all to the downloader\n\t\tif err := pm.downloader.DeliverReceipts(p.id, receipts); err != nil {\n\t\t\tlog.Debug(\"Failed to deliver receipts\", \"err\", err)\n\t\t}\n\n\tcase msg.Code == NewBlockHashesMsg:\n\t\tvar announces newBlockHashesData\n\t\tif err := msg.Decode(&announces); err != nil {\n\t\t\treturn errResp(ErrDecode, \"%v: %v\", msg, err)\n\t\t}\n\t\t// Mark the hashes as present at the remote node\n\t\tfor _, block := range announces {\n\t\t\tp.MarkBlock(block.Hash)\n\t\t}\n\t\t// Schedule all the unknown hashes for retrieval\n\t\tunknown := make(newBlockHashesData, 0, len(announces))\n\t\tfor _, block := range announces {\n\t\t\tif !pm.blockchain.HasBlock(block.Hash, block.Number) {\n\t\t\t\tunknown = append(unknown, block)\n\t\t\t}\n\t\t}\n\t\tfor _, block := range unknown {\n\t\t\tpm.fetcher.Notify(p.id, block.Hash, block.Number, time.Now(), p.RequestOneHeader, p.RequestBodies)\n\t\t}\n\n\tcase msg.Code == NewBlockMsg:\n\t\t// Retrieve and decode the propagated block\n\t\tvar request newBlockData\n\t\tif err := msg.Decode(&request); err != nil {\n\t\t\treturn errResp(ErrDecode, \"%v: %v\", msg, err)\n\t\t}\n\t\trequest.Block.ReceivedAt = msg.ReceivedAt\n\t\trequest.Block.ReceivedFrom = p\n\n\t\t// Mark the peer as owning the block and schedule it for import\n\t\tp.MarkBlock(request.Block.Hash())\n\t\tpm.fetcher.Enqueue(p.id, request.Block)\n\n\t\t// Assuming the block is importable by the peer, but possibly not yet done so,\n\t\t// calculate the head hash and TD that the peer truly must have.\n\t\tvar (\n\t\t\ttrueHead = request.Block.ParentHash()\n\t\t\ttrueTD   = new(big.Int).Sub(request.TD, request.Block.Difficulty())\n\t\t)\n\t\t// Update the peers total difficulty if better than the previous\n\t\tif _, td := p.Head(); trueTD.Cmp(td) > 0 {\n\t\t\tp.SetHead(trueHead, trueTD)\n\n\t\t\t// Schedule a sync if above ours. Note, this will not fire a sync for a gap of\n\t\t\t// a singe block (as the true TD is below the propagated block), however this\n\t\t\t// scenario should easily be covered by the fetcher.\n\t\t\tcurrentBlock := pm.blockchain.CurrentBlock()\n\t\t\tif trueTD.Cmp(pm.blockchain.GetTd(currentBlock.Hash(), currentBlock.NumberU64())) > 0 {\n\t\t\t\tgo pm.synchronise(p)\n\t\t\t}\n\t\t}\n\n\tcase msg.Code == TxMsg:\n\t\tif pm.closeAcceptTx {\n\t\t\tbreak\n\t\t}\n\t\t// Transactions arrived, make sure we have a valid and fresh chain to handle them\n\t\tif atomic.LoadUint32(&pm.acceptTxs) == 0 {\n\t\t\tbreak\n\t\t}\n\t\tcurrentBlock := pm.blockchain.CurrentBlock()\n\t\tdifference := time.Now().Unix() - currentBlock.Time().Int64()\n\t\tif difference > 2*60 {\n\t\t\tlog.Info(\"to behind,dont receive remote txs\")\n\t\t\tbreak\n\t\t}\n\n\t\t// Transactions can be processed, parse all of them and deliver to the pool\n\t\tvar txs []*types.Transaction\n\t\tif err := msg.Decode(&txs); err != nil {\n\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t}\n\t\tfor i, tx := range txs {\n\t\t\t// Validate and mark the remote transaction\n\t\t\tif tx == nil {\n\t\t\t\treturn errResp(ErrDecode, \"transaction %d is nil\", i)\n\t\t\t}\n\t\t\tpm.peers.AddKnowTx(p.id, tx.Hash())\n\t\t\t//p.MarkTransaction(tx.Hash())\n\t\t}\n\n\t\terrs := pm.txpool.AddRemotes(txs)\n\t\taddedTxs := len(txs) - len(errs)\n\t\tif addedTxs > 0 {\n\t\t\tlog.Debug(\"received from\", \"remote peer\", p.RemoteAddr().String(), \"txs\", len(txs), \"added\", addedTxs)\n\t\t}\n\n\tcase msg.Code == NewVoteMsg:\n\t\tvar vote types.Vote\n\n\t\tif err := msg.Decode(&vote); err != nil {\n\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t}\n\t\tp.MarkVote(vote.Hash())\n\t\tpm.voter.AddVote(&vote)\n\n\tcase msg.Code == NewLotteryMsg:\n\n\t\tvar lottery types.Lottery\n\n\t\tif err := msg.Decode(&lottery); err != nil {\n\t\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t\t}\n\t\tp.MarkLottery(lottery.PosHash)\n\t\tpm.voter.AddLottery(&lottery)\n\n\tdefault:\n\t\treturn errResp(ErrInvalidMsgCode, \"%v\", msg.Code)\n\t}\n\treturn nil\n}\n\n// BroadcastBlock will either propagate a block to a subset of it's peers, or\n// will only announce it's availability (depending what's requested).\nfunc (pm *ProtocolManager) BroadcastBlock(block *types.Block, propagate bool) {\n\thash := block.Hash()\n\tpeers := pm.peers.PeersWithoutBlock(hash)\n\n\t// If propagation is requested, send to a subset of the peer\n\tif propagate {\n\t\t// Calculate the TD of the block (it's not imported yet, so block.Td is not valid)\n\t\tvar td *big.Int\n\t\tif parent := pm.blockchain.GetBlock(block.ParentHash(), block.NumberU64()-1); parent != nil {\n\t\t\ttd = new(big.Int).Add(block.Difficulty(), pm.blockchain.GetTd(block.ParentHash(), block.NumberU64()-1))\n\t\t} else {\n\t\t\tlog.Error(\"Propagating dangling block\", \"number\", block.Number(), \"hash\", hash)\n\t\t\treturn\n\t\t}\n\t\t// Send the block to a subset of our peers\n\t\ttransfer := peers[:int(math.Sqrt(float64(len(peers))))]\n\t\tfor _, peer := range transfer {\n\t\t\tpeer.AsyncSendNewBlock(block, td)\n\t\t}\n\t\tlog.Trace(\"Propagated block\", \"hash\", hash, \"recipients\", len(transfer), \"duration\", common.PrettyDuration(time.Since(block.ReceivedAt)))\n\t\treturn\n\t}\n\t// Otherwise if the block is indeed in out own chain, announce it\n\tif pm.blockchain.HasBlock(hash, block.NumberU64()) {\n\t\tfor _, peer := range peers {\n\t\t\tpeer.AsyncSendNewBlockHash(block)\n\t\t}\n\t\tlog.Trace(\"Announced block\", \"hash\", hash, \"recipients\", len(peers), \"duration\", common.PrettyDuration(time.Since(block.ReceivedAt)))\n\t}\n}\n\n// BroadcastTxs will propagate a batch of transactions to all peers which are not known to\n// already have the given transaction.\nfunc (pm *ProtocolManager) BroadcastTxs(txs types.Transactions) {\n\tvar txset = make(map[*peer]types.Transactions)\n\n\t// Broadcast transactions to a batch of peers not knowing about it\n\tfor _, tx := range txs {\n\t\tpeers := pm.peers.PeersWithoutTx(tx.Hash())\n\t\tfor _, peer := range peers {\n\t\t\ttxset[peer] = append(txset[peer], tx)\n\t\t\tpm.peers.AddKnowTx(peer.id, tx.Hash())\n\t\t}\n\t\tlog.Trace(\"Broadcast transaction\", \"hash\", tx.Hash(), \"recipients\", len(peers))\n\t}\n\n\tcurrentBlock := pm.blockchain.CurrentBlock()\n\tdifference := time.Now().Unix() - currentBlock.Time().Int64()\n\tif difference > 2*60 {\n\t\treturn\n\t}\n\n\t// FIXME include this again: peers = peers[:int(math.Sqrt(float64(len(peers))))]\n\tfor peer, txs := range txset {\n\n\t\tpeer.AsyncSendTransactions(txs)\n\t}\n}\n\nfunc (pm *ProtocolManager) BroadcastVote(vote *types.Vote) {\n\n\tpeers := pm.peers.PeersWithoutVote(vote.Hash())\n\tfor _, peer := range peers {\n\t\tpeer.AsyncSendNewVote(vote)\n\t}\n}\n\nfunc (pm *ProtocolManager) BroadcastLottery(lottery *types.Lottery) {\n\n\tpeers := pm.peers.PeersWithoutLottery(lottery.PosHash)\n\tfor _, peer := range peers {\n\t\tpeer.AsyncSendNewLottery(lottery)\n\t}\n}\n\n// Mined broadcast loop\nfunc (pm *ProtocolManager) minedBroadcastLoop() {\n\t// automatically stops if unsubscribe\n\tfor obj := range pm.minedBlockSub.Chan() {\n\t\tif ev, ok := obj.Data.(core.NewMinedBlockEvent); ok {\n\t\t\tpm.BroadcastBlock(ev.Block, true)  // First propagate block to peers\n\t\t\tpm.BroadcastBlock(ev.Block, false) // Only then announce to the rest\n\t\t}\n\t}\n}\n\nfunc (pm *ProtocolManager) txBroadcastLoop() {\n\tfor {\n\t\tselect {\n\t\tcase event := <-pm.txsCh:\n\t\t\tpm.BroadcastTxs(event.Txs)\n\n\t\t// Err() channel will be closed when unsubscribing.\n\t\tcase <-pm.txsSub.Err():\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (pm *ProtocolManager) voteBroadLoop() {\n\tfor {\n\t\tselect {\n\t\tcase event := <-pm.voteCh:\n\t\t\tpm.BroadcastVote(event.Vote)\n\n\t\t\t// Err() channel will be closed when unsubscribing.\n\t\tcase <-pm.voteSub.Err():\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (pm *ProtocolManager) lotteryBroadLoop() {\n\tfor {\n\t\tselect {\n\t\tcase event := <-pm.lotteryCh:\n\t\t\tpm.BroadcastLottery(event.Lottery)\n\n\t\t\t// Err() channel will be closed when unsubscribing.\n\t\tcase e := <-pm.lotterySub.Err():\n\t\t\tlog.Error(\"lotteryBroadLoop \", \"err\", e)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// NodeInfo represents a short summary of the Sero sub-protocol metadata\n// known about the host peer.\ntype NodeInfo struct {\n\tNetwork    uint64              `json:\"network\"`    // Sero network ID (1=Frontier, 2=Morden, Ropsten=3, Rinkeby=4)\n\tDifficulty *big.Int            `json:\"difficulty\"` // Total difficulty of the host's blockchain\n\tGenesis    common.Hash         `json:\"genesis\"`    // SHA3 hash of the host's genesis block\n\tConfig     *params.ChainConfig `json:\"config\"`     // Chain configuration for the fork rules\n\tHead       common.Hash         `json:\"head\"`       // SHA3 hash of the host's best owned block\n}\n\n// NodeInfo retrieves some protocol metadata about the running host node.\nfunc (pm *ProtocolManager) NodeInfo() *NodeInfo {\n\tcurrentBlock := pm.blockchain.CurrentBlock()\n\treturn &NodeInfo{\n\t\tNetwork:    pm.networkID,\n\t\tDifficulty: pm.blockchain.GetTd(currentBlock.Hash(), currentBlock.NumberU64()),\n\t\tGenesis:    pm.blockchain.Genesis().Hash(),\n\t\tConfig:     pm.blockchain.Config(),\n\t\tHead:       currentBlock.Hash(),\n\t}\n}\n"
  },
  {
    "path": "sero/metrics.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n)\n\nvar (\n\tpropTxnInPacketsMeter     = metrics.NewRegisteredMeter(\"sero/prop/txns/in/packets\", nil)\n\tpropTxnInTrafficMeter     = metrics.NewRegisteredMeter(\"sero/prop/txns/in/traffic\", nil)\n\tpropTxnOutPacketsMeter    = metrics.NewRegisteredMeter(\"sero/prop/txns/out/packets\", nil)\n\tpropTxnOutTrafficMeter    = metrics.NewRegisteredMeter(\"sero/prop/txns/out/traffic\", nil)\n\tpropHashInPacketsMeter    = metrics.NewRegisteredMeter(\"sero/prop/hashes/in/packets\", nil)\n\tpropHashInTrafficMeter    = metrics.NewRegisteredMeter(\"sero/prop/hashes/in/traffic\", nil)\n\tpropHashOutPacketsMeter   = metrics.NewRegisteredMeter(\"sero/prop/hashes/out/packets\", nil)\n\tpropHashOutTrafficMeter   = metrics.NewRegisteredMeter(\"sero/prop/hashes/out/traffic\", nil)\n\tpropBlockInPacketsMeter   = metrics.NewRegisteredMeter(\"sero/prop/blocks/in/packets\", nil)\n\tpropBlockInTrafficMeter   = metrics.NewRegisteredMeter(\"sero/prop/blocks/in/traffic\", nil)\n\tpropBlockOutPacketsMeter  = metrics.NewRegisteredMeter(\"sero/prop/blocks/out/packets\", nil)\n\tpropBlockOutTrafficMeter  = metrics.NewRegisteredMeter(\"sero/prop/blocks/out/traffic\", nil)\n\treqHeaderInPacketsMeter   = metrics.NewRegisteredMeter(\"sero/req/headers/in/packets\", nil)\n\treqHeaderInTrafficMeter   = metrics.NewRegisteredMeter(\"sero/req/headers/in/traffic\", nil)\n\treqHeaderOutPacketsMeter  = metrics.NewRegisteredMeter(\"sero/req/headers/out/packets\", nil)\n\treqHeaderOutTrafficMeter  = metrics.NewRegisteredMeter(\"sero/req/headers/out/traffic\", nil)\n\treqBodyInPacketsMeter     = metrics.NewRegisteredMeter(\"sero/req/bodies/in/packets\", nil)\n\treqBodyInTrafficMeter     = metrics.NewRegisteredMeter(\"sero/req/bodies/in/traffic\", nil)\n\treqBodyOutPacketsMeter    = metrics.NewRegisteredMeter(\"sero/req/bodies/out/packets\", nil)\n\treqBodyOutTrafficMeter    = metrics.NewRegisteredMeter(\"sero/req/bodies/out/traffic\", nil)\n\treqStateInPacketsMeter    = metrics.NewRegisteredMeter(\"sero/req/states/in/packets\", nil)\n\treqStateInTrafficMeter    = metrics.NewRegisteredMeter(\"sero/req/states/in/traffic\", nil)\n\treqStateOutPacketsMeter   = metrics.NewRegisteredMeter(\"sero/req/states/out/packets\", nil)\n\treqStateOutTrafficMeter   = metrics.NewRegisteredMeter(\"sero/req/states/out/traffic\", nil)\n\treqReceiptInPacketsMeter  = metrics.NewRegisteredMeter(\"sero/req/receipts/in/packets\", nil)\n\treqReceiptInTrafficMeter  = metrics.NewRegisteredMeter(\"sero/req/receipts/in/traffic\", nil)\n\treqReceiptOutPacketsMeter = metrics.NewRegisteredMeter(\"sero/req/receipts/out/packets\", nil)\n\treqReceiptOutTrafficMeter = metrics.NewRegisteredMeter(\"sero/req/receipts/out/traffic\", nil)\n\tmiscInPacketsMeter        = metrics.NewRegisteredMeter(\"sero/misc/in/packets\", nil)\n\tmiscInTrafficMeter        = metrics.NewRegisteredMeter(\"sero/misc/in/traffic\", nil)\n\tmiscOutPacketsMeter       = metrics.NewRegisteredMeter(\"sero/misc/out/packets\", nil)\n\tmiscOutTrafficMeter       = metrics.NewRegisteredMeter(\"sero/misc/out/traffic\", nil)\n)\n\n// meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of\n// accumulating the above defined metrics based on the data stream contents.\ntype meteredMsgReadWriter struct {\n\tp2p.MsgReadWriter     // Wrapped message stream to meter\n\tversion           int // Protocol version to select correct meters\n}\n\n// newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the\n// metrics system is disabled, this function returns the original object.\nfunc newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter {\n\tif !metrics.Enabled {\n\t\treturn rw\n\t}\n\treturn &meteredMsgReadWriter{MsgReadWriter: rw}\n}\n\n// Init sets the protocol version used by the stream to know which meters to\n// increment in case of overlapping message ids between protocol versions.\nfunc (rw *meteredMsgReadWriter) Init(version int) {\n\trw.version = version\n}\n\nfunc (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) {\n\t// Read the message and short circuit in case of an error\n\tmsg, err := rw.MsgReadWriter.ReadMsg()\n\tif err != nil {\n\t\treturn msg, err\n\t}\n\t// Account for the data traffic\n\tpackets, traffic := miscInPacketsMeter, miscInTrafficMeter\n\tswitch {\n\tcase msg.Code == BlockHeadersMsg:\n\t\tpackets, traffic = reqHeaderInPacketsMeter, reqHeaderInTrafficMeter\n\tcase msg.Code == BlockBodiesMsg:\n\t\tpackets, traffic = reqBodyInPacketsMeter, reqBodyInTrafficMeter\n\n\tcase rw.version >= sero63 && msg.Code == NodeDataMsg:\n\t\tpackets, traffic = reqStateInPacketsMeter, reqStateInTrafficMeter\n\tcase rw.version >= sero63 && msg.Code == ReceiptsMsg:\n\t\tpackets, traffic = reqReceiptInPacketsMeter, reqReceiptInTrafficMeter\n\n\tcase msg.Code == NewBlockHashesMsg:\n\t\tpackets, traffic = propHashInPacketsMeter, propHashInTrafficMeter\n\tcase msg.Code == NewBlockMsg:\n\t\tpackets, traffic = propBlockInPacketsMeter, propBlockInTrafficMeter\n\tcase msg.Code == TxMsg:\n\t\tpackets, traffic = propTxnInPacketsMeter, propTxnInTrafficMeter\n\t}\n\tpackets.Mark(1)\n\ttraffic.Mark(int64(msg.Size))\n\n\treturn msg, err\n}\n\nfunc (rw *meteredMsgReadWriter) WriteMsg(msg p2p.Msg) error {\n\t// Account for the data traffic\n\tpackets, traffic := miscOutPacketsMeter, miscOutTrafficMeter\n\tswitch {\n\tcase msg.Code == BlockHeadersMsg:\n\t\tpackets, traffic = reqHeaderOutPacketsMeter, reqHeaderOutTrafficMeter\n\tcase msg.Code == BlockBodiesMsg:\n\t\tpackets, traffic = reqBodyOutPacketsMeter, reqBodyOutTrafficMeter\n\n\tcase rw.version >= sero63 && msg.Code == NodeDataMsg:\n\t\tpackets, traffic = reqStateOutPacketsMeter, reqStateOutTrafficMeter\n\tcase rw.version >= sero63 && msg.Code == ReceiptsMsg:\n\t\tpackets, traffic = reqReceiptOutPacketsMeter, reqReceiptOutTrafficMeter\n\n\tcase msg.Code == NewBlockHashesMsg:\n\t\tpackets, traffic = propHashOutPacketsMeter, propHashOutTrafficMeter\n\tcase msg.Code == NewBlockMsg:\n\t\tpackets, traffic = propBlockOutPacketsMeter, propBlockOutTrafficMeter\n\tcase msg.Code == TxMsg:\n\t\tpackets, traffic = propTxnOutPacketsMeter, propTxnOutTrafficMeter\n\t}\n\tpackets.Mark(1)\n\ttraffic.Mark(int64(msg.Size))\n\n\t// Send the packet to the p2p layer\n\treturn rw.MsgReadWriter.WriteMsg(msg)\n}\n"
  },
  {
    "path": "sero/peer.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"sync\"\n\t\"time\"\n\n\tmapset \"github.com/deckarep/golang-set\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nvar (\n\terrClosed            = errors.New(\"peer set is closed\")\n\terrAlreadyRegistered = errors.New(\"peer is already registered\")\n\terrNotRegistered     = errors.New(\"peer is not registered\")\n)\n\nconst (\n\tmaxKnownTxs      = 32768 // Maximum transactions hashes to keep in the known list (prevent DOS)\n\tmaxKnownBlocks   = 1024  // Maximum block hashes to keep in the known list (prevent DOS)\n\tmaxKnownVotes    = 128\n\tmaxKnownLotterys = 128\n\n\t// maxQueuedTxs is the maximum number of transaction lists to queue up before\n\t// dropping broadcasts. This is a sensitive number as a transaction list might\n\t// contain a single transaction, or thousands.\n\tmaxQueuedTxs = 128\n\n\t// maxQueuedProps is the maximum number of block propagations to queue up before\n\t// dropping broadcasts. There's not much point in queueing stale blocks.\n\tmaxQueuedProps = 4\n\n\t// maxQueuedAnns is the maximum number of block announcements to queue up before\n\t// dropping broadcasts. Similarly to block propagations, there's no point to queue\n\t// above some healthy, so use that.\n\tmaxQueuedAnns = 4\n\n\tmaxQueuedLotterys = 4\n\n\tmaxQueuedVotes = 12\n\n\thandshakeTimeout = 5 * time.Second\n)\n\n// PeerInfo represents a short summary of the Sero sub-protocol metadata known\n// about a connected peer.\ntype PeerInfo struct {\n\tVersion    int      `json:\"version\"`    // Sero protocol version negotiated\n\tDifficulty *big.Int `json:\"difficulty\"` // Total difficulty of the peer's blockchain\n\tHead       string   `json:\"head\"`       // SHA3 hash of the peer's best owned block\n}\n\n// propEvent is a block propagation, waiting for its turn in the broadcast queue.\ntype propEvent struct {\n\tblock *types.Block\n\ttd    *big.Int\n}\n\ntype peer struct {\n\tid string\n\n\t*p2p.Peer\n\trw p2p.MsgReadWriter\n\n\tversion  int         // Protocol version negotiated\n\tforkDrop *time.Timer // Timed connection dropper if forks aren't validated in time\n\n\thead common.Hash\n\ttd   *big.Int\n\tlock sync.RWMutex\n\n\tknownLotterys mapset.Set\n\tknownVotes    mapset.Set\n\t//knownTxs       mapset.Set                // Set of transaction hashes known to be known by this peer\n\tknownBlocks    mapset.Set                // Set of block hashes known to be known by this peer\n\tqueuedTxs      chan []*types.Transaction // Queue of transactions to broadcast to the peer\n\tqueuedProps    chan *propEvent           // Queue of blocks to broadcast to the peer\n\tqueuedAnns     chan *types.Block         // Queue of blocks to announce to the peer\n\tqueuedLotterys chan *types.Lottery\n\tqueuedVotes    chan *types.Vote\n\tterm           chan struct{} // Termination channel to stop the broadcaster\n}\n\nfunc newPeer(version int, p *p2p.Peer, rw p2p.MsgReadWriter) *peer {\n\treturn &peer{\n\t\tPeer:          p,\n\t\trw:            rw,\n\t\tversion:       version,\n\t\tid:            fmt.Sprintf(\"%x\", p.ID().Bytes()[:8]),\n\t\tknownLotterys: mapset.NewSet(),\n\t\tknownVotes:    mapset.NewSet(),\n\t\t//knownTxs:       mapset.NewSet(),\n\t\tknownBlocks:    mapset.NewSet(),\n\t\tqueuedTxs:      make(chan []*types.Transaction, maxQueuedTxs),\n\t\tqueuedProps:    make(chan *propEvent, maxQueuedProps),\n\t\tqueuedAnns:     make(chan *types.Block, maxQueuedAnns),\n\t\tqueuedLotterys: make(chan *types.Lottery, maxQueuedLotterys),\n\t\tqueuedVotes:    make(chan *types.Vote, maxQueuedVotes),\n\t\tterm:           make(chan struct{}),\n\t}\n}\n\n// broadcast is a write loop that multiplexes block propagations, announcements\n// and transaction broadcasts into the remote peer. The goal is to have an async\n// writer that does not lock up node internals.\nfunc (p *peer) broadcast() {\n\tfor {\n\t\tselect {\n\t\tcase txs := <-p.queuedTxs:\n\t\t\tif err := p.SendTransactions(txs); err != nil {\n\t\t\t\tp.Log().Error(\"Broadcast SendTransations failed\", \"err\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif len(txs) > 1 {\n\t\t\t\tp.Log().Info(\"Broadcast transactions\", \"receiver\", p.RemoteAddr().String(), \"count\", len(txs))\n\t\t\t}\n\n\t\tcase prop := <-p.queuedProps:\n\t\t\tif err := p.SendNewBlock(prop.block, prop.td); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tp.Log().Trace(\"Propagated block\", \"number\", prop.block.Number(), \"hash\", prop.block.Hash(), \"td\", prop.td)\n\n\t\tcase block := <-p.queuedAnns:\n\t\t\tif err := p.SendNewBlockHashes([]common.Hash{block.Hash()}, []uint64{block.NumberU64()}); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tp.Log().Trace(\"Announced block\", \"number\", block.Number(), \"hash\", block.Hash())\n\n\t\tcase vote := <-p.queuedVotes:\n\t\t\tif err := p.SendNewVote(vote); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tp.Log().Trace(\"Announced vote\", \"hash\", vote.Hash())\n\t\tcase lottery := <-p.queuedLotterys:\n\t\t\tif err := p.SendNewLottery(lottery); err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tp.Log().Trace(\"Announced lottery\", \"hash\", lottery.PosHash)\n\n\t\tcase <-p.term:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// close signals the broadcast goroutine to terminate.\nfunc (p *peer) close() {\n\tclose(p.term)\n}\n\n// Info gathers and returns a collection of metadata known about a peer.\nfunc (p *peer) Info() *PeerInfo {\n\thash, td := p.Head()\n\n\treturn &PeerInfo{\n\t\tVersion:    p.version,\n\t\tDifficulty: td,\n\t\tHead:       hash.Hex(),\n\t}\n}\n\n// Head retrieves a copy of the current head hash and total difficulty of the\n// peer.\nfunc (p *peer) Head() (hash common.Hash, td *big.Int) {\n\tp.lock.RLock()\n\tdefer p.lock.RUnlock()\n\n\tcopy(hash[:], p.head[:])\n\treturn hash, new(big.Int).Set(p.td)\n}\n\n// SetHead updates the head hash and total difficulty of the peer.\nfunc (p *peer) SetHead(hash common.Hash, td *big.Int) {\n\tp.lock.Lock()\n\tdefer p.lock.Unlock()\n\n\tcopy(p.head[:], hash[:])\n\tp.td.Set(td)\n}\n\n// MarkBlock marks a block as known for the peer, ensuring that the block will\n// never be propagated to this particular peer.\nfunc (p *peer) MarkBlock(hash common.Hash) {\n\t// If we reached the memory allowance, drop a previously known block hash\n\tfor p.knownBlocks.Cardinality() >= maxKnownBlocks {\n\t\tp.knownBlocks.Pop()\n\t}\n\tp.knownBlocks.Add(hash)\n}\n\n// MarkTransaction marks a transaction as known for the peer, ensuring that it\n// will never be propagated to this particular peer.\n//func (p *peer) MarkTransaction(hash common.Hash) {\n//\t// If we reached the memory allowance, drop a previously known transaction hash\n//\tfor p.knownTxs.Cardinality() >= maxKnownTxs {\n//\t\tp.knownTxs.Pop()\n//\t}\n//\tp.knownTxs.Add(hash)\n//}\n\nfunc (p *peer) MarkVote(hash common.Hash) {\n\t// If we reached the memory allowance, drop a previously known transaction hash\n\tfor p.knownVotes.Cardinality() >= maxKnownVotes {\n\t\tp.knownVotes.Pop()\n\t}\n\tp.knownVotes.Add(hash)\n}\n\nfunc (p *peer) MarkLottery(hash common.Hash) {\n\t// If we reached the memory allowance, drop a previously known transaction hash\n\tfor p.knownLotterys.Cardinality() >= maxKnownLotterys {\n\t\tp.knownLotterys.Pop()\n\t}\n\tp.knownLotterys.Add(hash)\n}\n\n// SendTransactions sends transactions to the peer and includes the hashes\n// in its transaction hash set for future reference.\nfunc (p *peer) SendTransactions(txs types.Transactions) error {\n\t//for _, tx := range txs {\n\t//\tp.knownTxs.Add(tx.Hash())\n\t//}\n\tif len(txs) > 0 {\n\t\tsubLen := 200\n\t\tstart := 0\n\t\tfor {\n\t\t\tif start >= len(txs) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tend := start + subLen\n\t\t\tif end > len(txs) {\n\t\t\t\tend = len(txs)\n\t\t\t}\n\t\t\tsubTxs := txs[start:end]\n\t\t\t//log.Info(\"peer SendTransactions\", \"txs\", len(subTxs))\n\t\t\terr := p2p.Send(p.rw, TxMsg, subTxs)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tstart += subLen\n\t\t}\n\n\t}\n\treturn nil\n\t//return p2p.Send(p.rw, TxMsg, txs)\n}\n\n// AsyncSendTransactions queues list of transactions propagation to a remote\n// peer. If the peer's broadcast queue is full, the event is silently dropped.\nfunc (p *peer) AsyncSendTransactions(txs []*types.Transaction) {\n\tselect {\n\tcase p.queuedTxs <- txs:\n\t\t//for _, tx := range txs {\n\t\t//\tp.knownTxs.Add(tx.Hash())\n\t\t//}\n\tdefault:\n\t\tp.Log().Debug(\"Dropping transaction propagation\", \"count\", len(txs))\n\t}\n}\n\n// SendNewBlockHashes announces the availability of a number of blocks through\n// a hash notification.\nfunc (p *peer) SendNewBlockHashes(hashes []common.Hash, numbers []uint64) error {\n\tfor _, hash := range hashes {\n\t\tp.knownBlocks.Add(hash)\n\t}\n\trequest := make(newBlockHashesData, len(hashes))\n\tfor i := 0; i < len(hashes); i++ {\n\t\trequest[i].Hash = hashes[i]\n\t\trequest[i].Number = numbers[i]\n\t}\n\treturn p2p.Send(p.rw, NewBlockHashesMsg, request)\n}\n\n// AsyncSendNewBlockHash queues the availability of a block for propagation to a\n// remote peer. If the peer's broadcast queue is full, the event is silently\n// dropped.\nfunc (p *peer) AsyncSendNewBlockHash(block *types.Block) {\n\tselect {\n\tcase p.queuedAnns <- block:\n\t\tp.knownBlocks.Add(block.Hash())\n\tdefault:\n\t\tp.Log().Debug(\"Dropping block announcement\", \"number\", block.NumberU64(), \"hash\", block.Hash())\n\t}\n}\n\n// SendNewBlock propagates an entire block to a remote peer.\nfunc (p *peer) SendNewBlock(block *types.Block, td *big.Int) error {\n\tp.knownBlocks.Add(block.Hash())\n\treturn p2p.Send(p.rw, NewBlockMsg, []interface{}{block, td})\n}\n\nfunc (p *peer) AsyncSendNewVote(vote *types.Vote) {\n\tselect {\n\tcase p.queuedVotes <- vote:\n\t\tp.knownVotes.Add(vote.Hash())\n\tdefault:\n\t\tp.Log().Debug(\"Dropping vote announcement\", \"hash\", vote.Hash())\n\t}\n}\n\nfunc (p *peer) SendNewVote(vote *types.Vote) error {\n\tp.knownVotes.Add(vote.Hash())\n\treturn p2p.Send(p.rw, NewVoteMsg, vote)\n}\n\nfunc (p *peer) AsyncSendNewLottery(lottery *types.Lottery) {\n\tselect {\n\tcase p.queuedLotterys <- lottery:\n\t\tp.knownLotterys.Add(lottery.PosHash)\n\tdefault:\n\t\tp.Log().Debug(\"Dropping lottery announcement\", \"hash\", lottery.PosHash)\n\t}\n}\n\nfunc (p *peer) SendNewLottery(lottery *types.Lottery) error {\n\tp.knownLotterys.Add(lottery.PosHash)\n\treturn p2p.Send(p.rw, NewLotteryMsg, lottery)\n}\n\n// AsyncSendNewBlock queues an entire block for propagation to a remote peer. If\n// the peer's broadcast queue is full, the event is silently dropped.\nfunc (p *peer) AsyncSendNewBlock(block *types.Block, td *big.Int) {\n\tselect {\n\tcase p.queuedProps <- &propEvent{block: block, td: td}:\n\t\tp.knownBlocks.Add(block.Hash())\n\tdefault:\n\t\tp.Log().Debug(\"Dropping block propagation\", \"number\", block.NumberU64(), \"hash\", block.Hash())\n\t}\n}\n\n// SendBlockHeaders sends a batch of block headers to the remote peer.\nfunc (p *peer) SendBlockHeaders(headers []*types.Header) error {\n\treturn p2p.Send(p.rw, BlockHeadersMsg, headers)\n}\n\n// SendBlockBodies sends a batch of block contents to the remote peer.\nfunc (p *peer) SendBlockBodies(bodies []*blockBody) error {\n\treturn p2p.Send(p.rw, BlockBodiesMsg, blockBodiesData(bodies))\n}\n\n// SendBlockBodiesRLP sends a batch of block contents to the remote peer from\n// an already RLP encoded format.\nfunc (p *peer) SendBlockBodiesRLP(bodies []rlp.RawValue) error {\n\treturn p2p.Send(p.rw, BlockBodiesMsg, bodies)\n}\n\n// SendNodeDataRLP sends a batch of arbitrary internal data, corresponding to the\n// hashes requested.\nfunc (p *peer) SendNodeData(data [][]byte) error {\n\treturn p2p.Send(p.rw, NodeDataMsg, data)\n}\n\n// SendReceiptsRLP sends a batch of transaction receipts, corresponding to the\n// ones requested from an already RLP encoded format.\nfunc (p *peer) SendReceiptsRLP(receipts []rlp.RawValue) error {\n\treturn p2p.Send(p.rw, ReceiptsMsg, receipts)\n}\n\n// RequestOneHeader is a wrapper around the header query functions to fetch a\n// single header. It is used solely by the fetcher.\nfunc (p *peer) RequestOneHeader(hash common.Hash) error {\n\tp.Log().Debug(\"Fetching single header\", \"hash\", hash)\n\treturn p2p.Send(p.rw, GetBlockHeadersMsg, &getBlockHeadersData{Origin: hashOrNumber{Hash: hash}, Amount: uint64(1), Skip: uint64(0), Reverse: false})\n}\n\n// RequestHeadersByHash fetches a batch of blocks' headers corresponding to the\n// specified header query, based on the hash of an origin block.\nfunc (p *peer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error {\n\tp.Log().Debug(\"Fetching batch of headers\", \"count\", amount, \"fromhash\", origin, \"skip\", skip, \"reverse\", reverse)\n\treturn p2p.Send(p.rw, GetBlockHeadersMsg, &getBlockHeadersData{Origin: hashOrNumber{Hash: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse})\n}\n\n// RequestHeadersByNumber fetches a batch of blocks' headers corresponding to the\n// specified header query, based on the number of an origin block.\nfunc (p *peer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error {\n\tp.Log().Debug(\"Fetching batch of headers\", \"count\", amount, \"fromnum\", origin, \"skip\", skip, \"reverse\", reverse)\n\treturn p2p.Send(p.rw, GetBlockHeadersMsg, &getBlockHeadersData{Origin: hashOrNumber{Number: origin}, Amount: uint64(amount), Skip: uint64(skip), Reverse: reverse})\n}\n\n// RequestBodies fetches a batch of blocks' bodies corresponding to the hashes\n// specified.\nfunc (p *peer) RequestBodies(hashes []common.Hash) error {\n\tp.Log().Debug(\"Fetching batch of block bodies\", \"count\", len(hashes))\n\treturn p2p.Send(p.rw, GetBlockBodiesMsg, hashes)\n}\n\n// RequestNodeData fetches a batch of arbitrary data from a node's known state\n// data, corresponding to the specified hashes.\nfunc (p *peer) RequestNodeData(hashes []common.Hash) error {\n\tp.Log().Debug(\"Fetching batch of state data\", \"count\", len(hashes))\n\treturn p2p.Send(p.rw, GetNodeDataMsg, hashes)\n}\n\n// RequestReceipts fetches a batch of transaction receipts from a remote node.\nfunc (p *peer) RequestReceipts(hashes []common.Hash) error {\n\tp.Log().Debug(\"Fetching batch of receipts\", \"count\", len(hashes))\n\treturn p2p.Send(p.rw, GetReceiptsMsg, hashes)\n}\n\n// Handshake executes the sero protocol handshake, negotiating version number,\n// network IDs, difficulties, head and genesis blocks.\nfunc (p *peer) Handshake(network uint64, td *big.Int, head common.Hash, genesis common.Hash) error {\n\t// Send out own handshake in a new thread\n\terrc := make(chan error, 2)\n\tvar status statusData // safe to read after two values have been received from errc\n\n\tgo func() {\n\t\terrc <- p2p.Send(p.rw, StatusMsg, &statusData{\n\t\t\tProtocolVersion: uint32(p.version),\n\t\t\tNetworkId:       network,\n\t\t\tTD:              td,\n\t\t\tCurrentBlock:    head,\n\t\t\tGenesisBlock:    genesis,\n\t\t})\n\t}()\n\tgo func() {\n\t\terrc <- p.readStatus(network, &status, genesis)\n\t}()\n\ttimeout := time.NewTimer(handshakeTimeout)\n\tdefer timeout.Stop()\n\tfor i := 0; i < 2; i++ {\n\t\tselect {\n\t\tcase err := <-errc:\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase <-timeout.C:\n\t\t\treturn p2p.DiscReadTimeout\n\t\t}\n\t}\n\tp.td, p.head = status.TD, status.CurrentBlock\n\treturn nil\n}\n\nfunc (p *peer) readStatus(network uint64, status *statusData, genesis common.Hash) (err error) {\n\tmsg, err := p.rw.ReadMsg()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif msg.Code != StatusMsg {\n\t\treturn errResp(ErrNoStatusMsg, \"first msg has code %x (!= %x)\", msg.Code, StatusMsg)\n\t}\n\tif msg.Size > ProtocolMaxMsgSize {\n\t\treturn errResp(ErrMsgTooLarge, \"%v > %v\", msg.Size, ProtocolMaxMsgSize)\n\t}\n\t// Decode the handshake and make sure everything matches\n\tif err := msg.Decode(&status); err != nil {\n\t\treturn errResp(ErrDecode, \"msg %v: %v\", msg, err)\n\t}\n\tif status.GenesisBlock != genesis {\n\t\treturn errResp(ErrGenesisBlockMismatch, \"%x (!= %x)\", status.GenesisBlock[:8], genesis[:8])\n\t}\n\tif status.NetworkId != network {\n\t\treturn errResp(ErrNetworkIdMismatch, \"%d (!= %d)\", status.NetworkId, network)\n\t}\n\tif int(status.ProtocolVersion) != p.version {\n\t\treturn errResp(ErrProtocolVersionMismatch, \"%d (!= %d)\", status.ProtocolVersion, p.version)\n\t}\n\treturn nil\n}\n\n// String implements fmt.Stringer.\nfunc (p *peer) String() string {\n\treturn fmt.Sprintf(\"Peer %s [%s]\", p.id,\n\t\tfmt.Sprintf(\"sero/%2d\", p.version),\n\t)\n}\n\n// peerSet represents the collection of active peers currently participating in\n// the Sero sub-protocol.\ntype peerSet struct {\n\tpeers   map[string]*peer\n\tknowTxs map[string]mapset.Set\n\tlock    sync.RWMutex\n\ttxLock  sync.RWMutex\n\n\tclosed bool\n}\n\n// newPeerSet creates a new peer set to track the active participants.\nfunc newPeerSet() *peerSet {\n\treturn &peerSet{\n\t\tpeers:   make(map[string]*peer),\n\t\tknowTxs: make(map[string]mapset.Set),\n\t}\n}\n\n// Register injects a new peer into the working set, or returns an error if the\n// peer is already known. If a new peer it registered, its broadcast loop is also\n// started.\nfunc (ps *peerSet) Register(p *peer) error {\n\tps.lock.Lock()\n\tdefer ps.lock.Unlock()\n\n\tif ps.closed {\n\t\treturn errClosed\n\t}\n\tif _, ok := ps.peers[p.id]; ok {\n\t\treturn errAlreadyRegistered\n\t}\n\tps.peers[p.id] = p\n\tgo p.broadcast()\n\n\treturn nil\n}\n\n// Unregister removes a remote peer from the active set, disabling any further\n// actions to/from that particular entity.\nfunc (ps *peerSet) Unregister(id string) error {\n\tps.lock.Lock()\n\tdefer ps.lock.Unlock()\n\n\tp, ok := ps.peers[id]\n\tif !ok {\n\t\treturn errNotRegistered\n\t}\n\tdelete(ps.peers, id)\n\tp.close()\n\n\treturn nil\n}\n\n// Peer retrieves the registered peer with the given id.\nfunc (ps *peerSet) Peer(id string) *peer {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\treturn ps.peers[id]\n}\n\n// Len returns if the current number of peers in the set.\nfunc (ps *peerSet) Len() int {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\treturn len(ps.peers)\n}\n\n// PeersWithoutBlock retrieves a list of peers that do not have a given block in\n// their set of known hashes.\nfunc (ps *peerSet) PeersWithoutBlock(hash common.Hash) []*peer {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tlist := make([]*peer, 0, len(ps.peers))\n\tfor _, p := range ps.peers {\n\t\tif !p.knownBlocks.Contains(hash) {\n\t\t\tlist = append(list, p)\n\t\t}\n\t}\n\treturn list\n}\n\nfunc (ps *peerSet) AddKnowTx(id string, hash common.Hash) {\n\tps.txLock.Lock()\n\tdefer ps.txLock.Unlock()\n\tif ps.knowTxs[id] == nil {\n\t\tps.knowTxs[id] = mapset.NewSet()\n\t}\n\tif ps.knowTxs[id].Cardinality() >= maxKnownTxs {\n\t\tps.knowTxs[id].Pop()\n\t}\n\tps.knowTxs[id].Add(hash)\n}\n\nfunc (ps *peerSet) ContainsTx(id string, hash common.Hash) bool {\n\tps.txLock.RLock()\n\tdefer ps.txLock.RUnlock()\n\treturn ps.containsTx(id, hash)\n}\n\nfunc (ps *peerSet) containsTx(id string, hash common.Hash) bool {\n\treturn ps.knowTxs[id] != nil && ps.knowTxs[id].Contains(hash)\n\n}\n\n// PeersWithoutTx retrieves a list of peers that do not have a given transaction\n// in their set of known hashes.\nfunc (ps *peerSet) PeersWithoutTx(hash common.Hash) []*peer {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tps.txLock.RLock()\n\tdefer ps.txLock.RUnlock()\n\tlist := make([]*peer, 0, len(ps.peers))\n\tfor _, p := range ps.peers {\n\t\tif !ps.containsTx(p.id, hash) {\n\t\t\tlist = append(list, p)\n\t\t}\n\t}\n\n\treturn list\n}\n\nfunc (ps *peerSet) PeersWithoutVote(hash common.Hash) []*peer {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tlist := make([]*peer, 0, len(ps.peers))\n\tfor _, p := range ps.peers {\n\t\tif !p.knownVotes.Contains(hash) {\n\t\t\tlist = append(list, p)\n\t\t}\n\t}\n\treturn list\n}\n\nfunc (ps *peerSet) PeersWithoutLottery(hash common.Hash) []*peer {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tlist := make([]*peer, 0, len(ps.peers))\n\tfor _, p := range ps.peers {\n\t\tif !p.knownLotterys.Contains(hash) {\n\t\t\tlist = append(list, p)\n\t\t}\n\t}\n\treturn list\n}\n\n// BestPeer retrieves the known peer with the currently highest total difficulty.\nfunc (ps *peerSet) BestPeer() *peer {\n\tps.lock.RLock()\n\tdefer ps.lock.RUnlock()\n\n\tvar (\n\t\tbestPeer *peer\n\t\tbestTd   *big.Int\n\t)\n\tfor _, p := range ps.peers {\n\t\tif _, td := p.Head(); bestPeer == nil || td.Cmp(bestTd) > 0 {\n\t\t\tbestPeer, bestTd = p, td\n\t\t}\n\t}\n\treturn bestPeer\n}\n\n// Close disconnects all peers.\n// No new peers can be registered after Close has returned.\nfunc (ps *peerSet) Close() {\n\tps.lock.Lock()\n\tdefer ps.lock.Unlock()\n\n\tfor _, p := range ps.peers {\n\t\tp.Disconnect(p2p.DiscQuitting)\n\t}\n\tps.closed = true\n}\n"
  },
  {
    "path": "sero/protocol.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// Constants to match up protocol versions and messages\nconst (\n\tsero62 = 62\n\tsero63 = 63\n)\n\n// ProtocolName is the official short name of the protocol used during capability negotiation.\nvar ProtocolName = \"sero\"\n\n// ProtocolVersions are the upported versions of the sero protocol (first is primary).\nvar ProtocolVersions = []uint{sero63, sero62}\n\n// ProtocolLengths are the number of implemented message corresponding to different protocol versions.\nvar ProtocolLengths = []uint64{24, 8}\n\nconst ProtocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message\n\n// sero protocol message codes\nconst (\n\t// Protocol messages belonging to sero/62\n\tStatusMsg          = 0x00\n\tNewBlockHashesMsg  = 0x01\n\tTxMsg              = 0x02\n\tGetBlockHeadersMsg = 0x03\n\tBlockHeadersMsg    = 0x04\n\tGetBlockBodiesMsg  = 0x05\n\tBlockBodiesMsg     = 0x06\n\tNewBlockMsg        = 0x07\n\n\t// Protocol messages belonging to sero/63\n\tGetNodeDataMsg = 0x0d\n\tNodeDataMsg    = 0x0e\n\tGetReceiptsMsg = 0x0f\n\tReceiptsMsg    = 0x10\n\n\tNewVoteMsg    = 0x16\n\tNewLotteryMsg = 0x17\n)\n\ntype errCode int\n\nconst (\n\tErrMsgTooLarge = iota\n\tErrDecode\n\tErrInvalidMsgCode\n\tErrProtocolVersionMismatch\n\tErrNetworkIdMismatch\n\tErrGenesisBlockMismatch\n\tErrNoStatusMsg\n\tErrExtraStatusMsg\n\tErrSuspendedPeer\n)\n\nfunc (e errCode) String() string {\n\treturn errorToString[int(e)]\n}\n\n// XXX change once legacy code is out\nvar errorToString = map[int]string{\n\tErrMsgTooLarge:             \"Message too long\",\n\tErrDecode:                  \"Invalid message\",\n\tErrInvalidMsgCode:          \"Invalid message code\",\n\tErrProtocolVersionMismatch: \"Protocol version mismatch\",\n\tErrNetworkIdMismatch:       \"NetworkId mismatch\",\n\tErrGenesisBlockMismatch:    \"Genesis block mismatch\",\n\tErrNoStatusMsg:             \"No status message\",\n\tErrExtraStatusMsg:          \"Extra status message\",\n\tErrSuspendedPeer:           \"Suspended peer\",\n}\n\ntype txPool interface {\n\t// AddRemotes should add the given transactions to the pool.\n\tAddRemotes([]*types.Transaction) []error\n\n\t// Pending should return pending transactions.\n\t// The slice should be modifiable by the caller.\n\tPending() (types.Transactions, error)\n\n\t// SubscribeNewTxsEvent should return an event subscription of\n\t// NewTxsEvent and send events to the given channel.\n\tSubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription\n}\n\ntype sero_miner interface {\n\tMining() bool\n}\n\ntype shareVoter interface {\n\tSubscribeNewVoteEvent(chan<- core.NewVoteEvent) event.Subscription\n\tSubscribeNewLotteryEvent(chan<- core.NewLotteryEvent) event.Subscription\n\tAddLottery(lottery *types.Lottery)\n\tAddVote(vote *types.Vote)\n}\n\n// statusData is the network packet for the status message.\ntype statusData struct {\n\tProtocolVersion uint32\n\tNetworkId       uint64\n\tTD              *big.Int\n\tCurrentBlock    common.Hash\n\tGenesisBlock    common.Hash\n}\n\n// newBlockHashesData is the network packet for the block announcements.\ntype newBlockHashesData []struct {\n\tHash   common.Hash // Hash of one particular block being announced\n\tNumber uint64      // Number of one particular block being announced\n}\n\n// getBlockHeadersData represents a block header query.\ntype getBlockHeadersData struct {\n\tOrigin  hashOrNumber // Block from which to retrieve headers\n\tAmount  uint64       // Maximum number of headers to retrieve\n\tSkip    uint64       // Blocks to skip between consecutive headers\n\tReverse bool         // Query direction (false = rising towards latest, true = falling towards genesis)\n}\n\n// hashOrNumber is a combined field for specifying an origin block.\ntype hashOrNumber struct {\n\tHash   common.Hash // Block hash from which to retrieve headers (excludes Number)\n\tNumber uint64      // Block hash from which to retrieve headers (excludes Hash)\n}\n\n// EncodeRLP is a specialized encoder for hashOrNumber to encode only one of the\n// two contained union fields.\nfunc (hn *hashOrNumber) EncodeRLP(w io.Writer) error {\n\tif hn.Hash == (common.Hash{}) {\n\t\treturn rlp.Encode(w, hn.Number)\n\t}\n\tif hn.Number != 0 {\n\t\treturn fmt.Errorf(\"both origin hash (%x) and number (%d) provided\", hn.Hash, hn.Number)\n\t}\n\treturn rlp.Encode(w, hn.Hash)\n}\n\n// DecodeRLP is a specialized decoder for hashOrNumber to decode the contents\n// into either a block hash or a block number.\nfunc (hn *hashOrNumber) DecodeRLP(s *rlp.Stream) error {\n\t_, size, _ := s.Kind()\n\torigin, err := s.Raw()\n\tif err == nil {\n\t\tswitch {\n\t\tcase size == 32:\n\t\t\terr = rlp.DecodeBytes(origin, &hn.Hash)\n\t\tcase size <= 8:\n\t\t\terr = rlp.DecodeBytes(origin, &hn.Number)\n\t\tdefault:\n\t\t\terr = fmt.Errorf(\"invalid input size %d for origin\", size)\n\t\t}\n\t}\n\treturn err\n}\n\n// newBlockData is the network packet for the block propagation message.\ntype newBlockData struct {\n\tBlock *types.Block\n\tTD    *big.Int\n}\n\n// blockBody represents the data content of a single block.\ntype blockBody struct {\n\tTransactions []*types.Transaction // Transactions contained within a block\n}\n\n// blockBodiesData is the network packet for block content distribution.\ntype blockBodiesData []*blockBody\n"
  },
  {
    "path": "sero/sync.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage sero\n\nimport (\n\t\"math/rand\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p/discover\"\n\t\"github.com/sero-cash/go-sero/sero/downloader\"\n)\n\nconst (\n\tforceSyncCycle      = 10 * time.Second // Time interval to force syncs, even if few peers are available\n\tminDesiredPeerCount = 5                // Amount of peers desired to start syncing\n\n\t// This is the target size for the packs of transactions sent by txsyncLoop.\n\t// A pack can get larger than this if a single transactions exceeds this size.\n\ttxsyncPackSize = 100 * 1024\n)\n\ntype txsync struct {\n\tp   *peer\n\ttxs []*types.Transaction\n}\n\n// syncTransactions starts sending all currently pending transactions to the given peer.\nfunc (pm *ProtocolManager) syncTransactions(p *peer) {\n\tif pm.miner.Mining() {\n\t\treturn\n\t}\n\t//var txs types.Transactions\n\ttxs, _ := pm.txpool.Pending()\n\t//for _, batch := range pending {\n\t//\ttxs = append(txs, batch...)\n\t//}\n\tif len(txs) == 0 {\n\t\treturn\n\t}\n\tsendTxs := types.Transactions{}\n\tfor _, tx := range txs {\n\t\tif !pm.peers.ContainsTx(p.id, tx.Hash()) {\n\t\t\tsendTxs = append(sendTxs, tx)\n\t\t\tpm.peers.AddKnowTx(p.id, tx.Hash())\n\t\t}\n\t}\n\tif sendTxs.Len() == 0 {\n\t\treturn\n\t}\n\tif sendTxs.Len() > 1 {\n\t\tlog.Info(\"send to \", \"remote peer\", p.RemoteAddr().String(), \"pending txs\", len(txs), \"send Txs\", len(sendTxs))\n\n\t}\n\n\tselect {\n\tcase pm.txsyncCh <- &txsync{p, sendTxs}:\n\tcase <-pm.quitSync:\n\t}\n}\n\n// txsyncLoop takes care of the initial transaction sync for each new\n// connection. When a new peer appears, we relay all currently pending\n// transactions. In order to minimise egress bandwidth usage, we send\n// the transactions in small packs to one peer at a time.\nfunc (pm *ProtocolManager) txsyncLoop() {\n\tvar (\n\t\tpending = make(map[discover.NodeID]*txsync)\n\t\tsending = false               // whether a send is active\n\t\tpack    = new(txsync)         // the pack that is being sent\n\t\tdone    = make(chan error, 1) // result of the send\n\t)\n\n\t// send starts a sending a pack of transactions from the sync.\n\tsend := func(s *txsync) {\n\t\t// Fill pack with transactions up to the target size.\n\t\tsize := common.StorageSize(0)\n\t\tpack.p = s.p\n\t\tpack.txs = pack.txs[:0]\n\t\tfor i := 0; i < len(s.txs) && size < txsyncPackSize; i++ {\n\t\t\tpack.txs = append(pack.txs, s.txs[i])\n\t\t\tsize += s.txs[i].Size()\n\t\t}\n\t\t// Remove the transactions that will be sent.\n\t\ts.txs = s.txs[:copy(s.txs, s.txs[len(pack.txs):])]\n\t\tif len(s.txs) == 0 {\n\t\t\tdelete(pending, s.p.ID())\n\t\t}\n\t\t// Send the pack in the background.\n\t\ts.p.Log().Trace(\"Sending batch of transactions\", \"count\", len(pack.txs), \"bytes\", size)\n\t\tsending = true\n\t\tgo func() { done <- pack.p.SendTransactions(pack.txs) }()\n\t}\n\n\t// pick chooses the next pending sync.\n\tpick := func() *txsync {\n\t\tif len(pending) == 0 {\n\t\t\treturn nil\n\t\t}\n\t\tn := rand.Intn(len(pending)) + 1\n\t\tfor _, s := range pending {\n\t\t\tif n--; n == 0 {\n\t\t\t\treturn s\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\tfor {\n\t\tselect {\n\t\tcase s := <-pm.txsyncCh:\n\t\t\tpending[s.p.ID()] = s\n\t\t\tif !sending {\n\t\t\t\tsend(s)\n\t\t\t}\n\t\tcase err := <-done:\n\t\t\tsending = false\n\t\t\t// Stop tracking peers that cause send failures.\n\t\t\tif err != nil {\n\t\t\t\tpack.p.Log().Debug(\"Transaction send failed\", \"err\", err)\n\t\t\t\tdelete(pending, pack.p.ID())\n\t\t\t}\n\t\t\t// Schedule the next send.\n\t\t\tif s := pick(); s != nil {\n\t\t\t\tsend(s)\n\t\t\t}\n\t\tcase <-pm.quitSync:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// syncer is responsible for periodically synchronising with the network, both\n// downloading hashes and blocks as well as handling the announcement handler.\nfunc (pm *ProtocolManager) syncer() {\n\t// Start and ensure cleanup of sync mechanisms\n\tpm.fetcher.Start()\n\tdefer pm.fetcher.Stop()\n\tdefer pm.downloader.Terminate()\n\n\t// Wait for different events to fire synchronisation operations\n\tforceSync := time.NewTicker(forceSyncCycle)\n\tdefer forceSync.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase <-pm.newPeerCh:\n\t\t\t// Make sure we have peers to select from, then sync\n\t\t\tif pm.peers.Len() < minDesiredPeerCount {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tgo pm.synchronise(pm.peers.BestPeer())\n\n\t\tcase <-forceSync.C:\n\t\t\t// Force a sync even if not enough peers are present\n\t\t\tgo pm.synchronise(pm.peers.BestPeer())\n\n\t\tcase <-pm.noMorePeers:\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// synchronise tries to sync up our local block chain with a remote peer.\nfunc (pm *ProtocolManager) synchronise(peer *peer) {\n\t// Short circuit if no peers are available\n\tif peer == nil {\n\t\treturn\n\t}\n\t// Make sure the peer's TD is higher than our own\n\tcurrentBlock := pm.blockchain.CurrentBlock()\n\ttd := pm.blockchain.GetTd(currentBlock.Hash(), currentBlock.NumberU64())\n\n\tpHead, pTd := peer.Head()\n\tif pTd.Cmp(td) <= 0 {\n\t\treturn\n\t}\n\t// Otherwise try to sync with the downloader\n\tmode := downloader.FullSync\n\tif atomic.LoadUint32(&pm.fastSync) == 1 {\n\t\t// Fast sync was explicitly requested, and explicitly granted\n\t\tmode = downloader.FastSync\n\t} else if currentBlock.NumberU64() == 0 && pm.blockchain.CurrentFastBlock().NumberU64() > 0 {\n\t\t// The database seems empty as the current block is the genesis. Yet the fast\n\t\t// block is ahead, so fast sync was enabled for this node at a certain point.\n\t\t// The only scenario where this can happen is if the user manually (or via a\n\t\t// bad block) rolled back a fast sync node below the sync point. In this case\n\t\t// however it's safe to reenable fast sync.\n\t\t//atomic.StoreUint32(&pm.fastSync, 1)\n\t\t//mode = downloader.FastSync\n\t}\n\n\tif mode == downloader.FastSync {\n\t\t// Make sure the peer's total difficulty we are synchronizing is higher.\n\t\tif pm.blockchain.GetTdByHash(pm.blockchain.CurrentFastBlock().Hash()).Cmp(pTd) >= 0 {\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Run the sync cycle, and disable fast sync if we've went past the pivot block\n\tif err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode); err != nil {\n\t\treturn\n\t}\n\tif atomic.LoadUint32(&pm.fastSync) == 1 {\n\t\tlog.Info(\"Fast sync complete, auto disabling\")\n\t\tatomic.StoreUint32(&pm.fastSync, 0)\n\t}\n\tatomic.StoreUint32(&pm.acceptTxs, 1) // Mark initial sync done\n\tif head := pm.blockchain.CurrentBlock(); head.NumberU64() > 0 {\n\t\t// We've completed a sync cycle, notify all peers of new state. This path is\n\t\t// essential in star-topology networks where a gateway node needs to notify\n\t\t// all its out-of-date peers of the availability of a new block. This failure\n\t\t// scenario will most often crop up in private and hackathon networks with\n\t\t// degenerate connectivity, but it should be healthy for the mainnet too to\n\t\t// more reliably update peers or the local TD state.\n\t\tgo pm.BroadcastBlock(head, false)\n\t}\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/4byte_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// 4byteTracer searches for 4byte-identifiers, and collects them for post-processing.\n// It collects the methods identifiers along with the size of the supplied data, so\n// a reversed signature can be matched against the size of the data.\n//\n// Example:\n//   > debug.traceTransaction( \"0x214e597e35da083692f5386141e69f47e973b2c56e7a8073b1ea08fd7571e9de\", {tracer: \"4byteTracer\"})\n//   {\n//     0x27dc297e-128: 1,\n//     0x38cc4831-0: 2,\n//     0x524f3889-96: 1,\n//     0xadf59f99-288: 1,\n//     0xc281d19e-0: 1\n//   }\n{\n\t// ids aggregates the 4byte ids found.\n\tids : {},\n\n\t// callType returns 'false' for non-calls, or the peek-index for the first param\n\t// after 'value', i.e. meminstart.\n\tcallType: function(opstr){\n\t\tswitch(opstr){\n\t\tcase \"CALL\": case \"CALLCODE\":\n\t\t\t// gas, addr, val, memin, meminsz, memout, memoutsz\n\t\t\treturn 3; // stack ptr to memin\n\n\t\tcase \"DELEGATECALL\": case \"STATICCALL\":\n\t\t\t// gas, addr, memin, meminsz, memout, memoutsz\n\t\t\treturn 2; // stack ptr to memin\n\t\t}\n\t\treturn false;\n\t},\n\n\t// store save the given indentifier and datasize.\n\tstore: function(id, size){\n\t\tvar key = \"\" + toHex(id) + \"-\" + size;\n\t\tthis.ids[key] = this.ids[key] + 1 || 1;\n\t},\n\n\t// step is invoked for every opcode that the VM executes.\n\tstep: function(log, db) {\n\t\t// Skip any opcodes that are not internal calls\n\t\tvar ct = this.callType(log.op.toString());\n\t\tif (!ct) {\n\t\t\treturn;\n\t\t}\n\t\t// Skip any pre-compile invocations, those are just fancy opcodes\n\t\tif (isPrecompiled(toAddress(log.stack.peek(1).toString(16)))) {\n\t\t\treturn;\n\t\t}\n\t\t// Gather internal call details\n\t\tvar inSz = log.stack.peek(ct + 1).valueOf();\n\t\tif (inSz >= 4) {\n\t\t\tvar inOff = log.stack.peek(ct).valueOf();\n\t\t\tthis.store(log.memory.slice(inOff, inOff + 4), inSz-4);\n\t\t}\n\t},\n\n\t// fault is invoked when the actual execution of an opcode fails.\n\tfault: function(log, db) { },\n\n\t// result is invoked when all the opcodes have been iterated over and returns\n\t// the final result of the tracing.\n\tresult: function(ctx) {\n\t\t// Save the outer calldata also\n\t\tif (ctx.input.length >= 4) {\n\t\t\tthis.store(slice(ctx.input, 0, 4), ctx.input.length-4)\n\t\t}\n\t\treturn this.ids;\n\t},\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/assets.go",
    "content": "// Code generated by go-bindata. DO NOT EDIT.\n// sources:\n// 4byte_tracer.js\n// bigram_tracer.js\n// call_tracer.js\n// evmdis_tracer.js\n// noop_tracer.js\n// opcount_tracer.js\n// prestate_tracer.js\n// trigram_tracer.js\n// unigram_tracer.js\n\npackage tracers\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n\tgz, err := gzip.NewReader(bytes.NewBuffer(data))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\n\tvar buf bytes.Buffer\n\t_, err = io.Copy(&buf, gz)\n\tclErr := gz.Close()\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"Read %q: %v\", name, err)\n\t}\n\tif clErr != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\ntype asset struct {\n\tbytes  []byte\n\tinfo   os.FileInfo\n\tdigest [sha256.Size]byte\n}\n\ntype bindataFileInfo struct {\n\tname    string\n\tsize    int64\n\tmode    os.FileMode\n\tmodTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n\treturn fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n\treturn fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n\treturn fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n\treturn fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n\treturn false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n\treturn nil\n}\n\nvar __4byte_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x94\\x56\\x5b\\x6f\\xdb\\x4a\\x0e\\x7e\\xb6\\x7f\\x05\\xd7\\x2f\\xb5\\x51\\x59\\x8e\\x2f\\x89\\x2f\\xd9\\x16\\xf0\\xe6\\xa4\\x6d\\x80\\x9c\\x24\\x88\\xdd\\x3d\\x28\\x16\\xfb\\x30\\x9e\\xa1\\xac\\xd9\\xc8\\x33\\xc2\\x0c\\xe5\\x4b\\x73\\xf2\\xdf\\x17\\x1c\\x49\\x89\\x93\\xd3\\x62\\xbb\\x4f\\x96\\x47\\xc3\\x8f\\x1f\\xc9\\x8f\\xa4\\x7a\\x3d\\xb8\\xb0\\xf9\\xc1\\xe9\\x75\\x4a\\x30\\x38\\xe9\\x8f\\x61\\x99\\x22\\xac\\x6d\\x17\\x29\\x45\\x87\\xc5\\x06\\xe6\\x05\\xa5\\xd6\\xf9\\x66\\xaf\\x07\\xcb\\x54\\x7b\\x48\\x74\\x86\\xa0\\x3d\\xe4\\xc2\\x11\\xd8\\x04\\xe8\\xcd\\xfd\\x4c\\xaf\\x9c\\x70\\x87\\xb8\\xd9\\xeb\\x95\\x36\\x3f\\x7c\\xcd\\x08\\x89\\x43\\x04\\x6f\\x13\\xda\\x09\\x87\\x33\\x38\\xd8\\x02\\xa4\\x30\\xe0\\x50\\x69\\x4f\\x4e\\xaf\\x0a\\x42\\xd0\\x04\\xc2\\xa8\\x9e\\x75\\xb0\\xb1\\x4a\\x27\\x07\\x86\\xd4\\x04\\x85\\x51\\xe8\\x82\\x6b\\x42\\xb7\\xf1\\x35\\x8f\\xcf\\x37\\x5f\\xe1\\x1a\\xbd\\x47\\x07\\x9f\\xd1\\xa0\\x13\\x19\\xdc\\x15\\xab\\x4c\\x4b\\xb8\\xd6\\x12\\x8d\\x47\\x10\\x1e\\x72\\x3e\\xf1\\x29\\x2a\\x58\\x05\\x38\\x36\\xfc\\xc4\\x54\\x16\\x15\\x15\\xf8\\x64\\x0b\\xa3\\x04\\x69\\x6b\\x22\\x40\\xcd\\xcc\\x61\\x8b\\xce\\x6b\\x6b\\x60\\x58\\xbb\\xaa\\x00\\x23\\xb0\\x8e\\x41\\xda\\x82\\x38\\x00\\x07\\x36\\x67\\xbb\\x0e\\x08\\x73\\x80\\x4c\\xd0\\x8b\\xe9\\x2f\\x24\\xe4\\x25\\x6e\\x05\\xda\\x04\\x37\\xa9\\xcd\\x11\\x28\\x15\\xc4\\x51\\xef\\x74\\x96\\xc1\\x0a\\xa1\\xf0\\x98\\x14\\x59\\xc4\\x68\\xab\\x82\\xe0\\x8f\\xab\\xe5\\x97\\xdb\\xaf\\x4b\\x98\\xdf\\x7c\\x83\\x3f\\xe6\\xf7\\xf7\\xf3\\x9b\\xe5\\xb7\\x73\\xd8\\x69\\x4a\\x6d\\x41\\x80\\x5b\\x2c\\xa1\\xf4\\x26\\xcf\\x34\\x2a\\xd8\\x09\\xe7\\x84\\xa1\\x03\\xd8\\x84\\x11\\x7e\\xbf\\xbc\\xbf\\xf8\\x32\\xbf\\x59\\xce\\xff\\x71\\x75\\x7d\\xb5\\xfc\\x06\\xd6\\xc1\\xa7\\xab\\xe5\\xcd\\xe5\\x62\\x01\\x9f\\x6e\\xef\\x61\\x0e\\x77\\xf3\\xfb\\xe5\\xd5\\xc5\\xd7\\xeb\\xf9\\x3d\\xdc\\x7d\\xbd\\xbf\\xbb\\x5d\\x5c\\xc6\\xb0\\x40\\x66\\x85\\x6c\\xff\\xbf\\x73\\x9e\\x84\\xea\\x39\\x04\\x85\\x24\\x74\\xe6\\xeb\\x4c\\x7c\\xb3\\x05\\xf8\\xd4\\x16\\x99\\x82\\x54\\x6c\\x11\\x1c\\x4a\\xd4\\x5b\\x54\\x20\\x40\\xda\\xfc\\xf0\\xcb\\x45\\x65\\x2c\\x91\\x59\\xb3\\x0e\\x31\\xff\\x54\\x90\\x70\\x95\\x80\\xb1\\x14\\x81\\x47\\x84\\xbf\\xa7\\x44\\xf9\\xac\\xd7\\xdb\\xed\\x76\\xf1\\xda\\x14\\xb1\\x75\\xeb\\x5e\\x56\\xc2\\xf9\\xde\\xc7\\xb8\\xc9\\x98\\xa3\\xd5\\x81\\x70\\xe9\\x84\\x44\\x07\\x1e\\x85\\x93\\x29\\xfa\\x10\\x4c\\x78\\xd1\\xd5\\x0a\\x0d\\xe9\\x44\\xa3\\xf3\\x11\\x8b\\x14\\xa4\\xcd\\x32\\x94\\xe4\\x99\\xc1\\x26\\x5c\\xcc\\xad\\xa7\\x6e\\xee\\xac\\x44\\xef\\xb5\\x59\\x73\\xe0\\x70\\x45\\xaf\\x2e\\xc2\\x06\\x29\\xb5\\xca\\xc3\\x11\\xdc\\xdb\\x68\\xbc\\xfe\\x8e\\x75\\x36\\x7c\\x91\\x97\\x65\\x54\\x82\\x44\\x04\\xde\\x86\\xe8\\xc1\\x21\\xcb\\x0c\\x15\\x78\\xbd\\x36\\x82\\x0a\\x87\\xa1\\x97\\x56\\x08\\x1b\\x41\\x92\\xc5\\x2e\\xd6\\x42\\x1b\\x4f\\x7f\\x01\\x64\\x9c\\xba\\x22\\x97\\x7b\\xb1\\xc9\\x33\\x9c\\xf1\\x33\\xc0\\x47\\x50\\xb8\\x2a\\xd6\\x31\\x71\\x0a\\x96\\x4e\\x18\\x2f\\x24\\x8b\\xbb\\x0d\\xad\\x93\\xfd\\xa0\\x3f\\xc2\\xd3\\xe9\\x18\\x87\\xa7\\x4a\\x9c\\x4c\\x86\\x67\\xd3\\x41\\x72\\x3a\\x9c\\x9c\\xf5\\x47\\x7d\\x3c\\x9b\\x26\\xa3\\x31\\x4e\\xc7\\xc3\\xd5\\x40\\x9e\\x9e\\xe1\\x58\\x4c\\x4e\\xc6\\xc3\\x55\\x1f\\xc5\\xc9\\x24\\x51\\xe3\\xd3\\x71\\x1f\\xa7\\x0a\\x5b\\x11\\x3c\\x06\\x60\\x37\\x83\\xd6\\x51\\xa6\\x5b\\x4f\\x9d\\xd2\\xfb\\x63\\xf9\\x03\\x70\\xb2\\x1f\\x8c\\x95\\x1c\\x4c\\xc7\\xd8\\xed\\x0f\\x26\\x33\\xe8\\x47\\x2f\\x6f\\x86\\x13\\x29\\x47\\x93\\x61\\xbf\\x7b\\x32\\x83\\xc1\\xd1\\xf9\\xe9\\x60\\x94\\x0c\\x27\\x93\\x69\\x77\\x7a\\xf6\\xda\\x40\\xa8\\xe4\\x74\\x9a\\x4c\\xa7\\xdd\\xc1\\xe4\\x0d\\x94\\x1c\\x4c\\xfa\\xaa\\x3f\\x45\\x86\\xea\\x97\\xc7\\x4f\\xcd\\xc7\\x66\\x83\\x07\\x8e\\xf2\\x20\\xd6\\x6b\\x87\\x6b\\x41\\x58\\x56\\x2d\\x30\\x0e\\x2f\\x12\\x1e\\x16\\x71\\xb3\\xc1\\xcf\\x33\\x78\\x7c\\x8a\\x9a\\xc1\\x46\\x8a\\x2c\\x5b\\x1e\\x72\\x56\\x35\\x15\\xce\\x78\\x78\\x97\\x88\\xcc\\xe3\\xbb\\xa0\\x0b\\x63\\x4d\\x97\\x2f\\x78\\x1e\\x1f\\x01\\x2f\\x47\\x7c\\xe8\\x6a\\xa3\\x70\\x1f\\x2e\\xf0\\x51\\xa2\\x9d\\x27\\x1e\\xb3\\x62\\x13\\x10\\x45\\xc2\\xd3\\xe4\\xdd\\x56\\x64\\x05\\xbe\\x8b\\x40\\xc7\\x18\\xc3\\x06\\x37\\x5c\\x54\\xe1\\x28\\x6e\\x36\\x6a\\x97\\x33\\x48\\x0a\\x53\\x56\\xca\\xe6\\x9e\\x5c\\xe7\\xb1\\xd9\\x68\\xf8\\x9d\\x26\\x99\\x1e\\x1d\\x48\\xe1\\x11\\x5a\\x17\\xf3\\xeb\\xeb\\xd6\\x0c\\x5e\\xfe\\x5c\\xdc\\xfe\\x76\\xd9\\x9a\\x35\\x1b\\x0d\\x76\\xb9\\x16\\x2c\\x6d\\xa5\\x5c\\x04\\x5b\\x91\\x45\\xa5\\xbb\\xea\\xc7\\x7f\\x0f\\x0f\\xb6\\xa0\\xfa\\xd7\\x7f\\x67\\xb3\\x32\\x5e\\x18\\x9e\\x43\\xaf\\x07\\x9e\\x84\\x7c\\x80\\x9c\\x1c\\x90\\x2d\\xcd\\x9a\\xcf\\xae\\x7f\\xbb\\xbc\\xbe\\xfc\\x3c\\x5f\\x5e\\xbe\\xa2\\xb0\\x58\\xce\\x97\\x57\\x17\\xe5\\xd1\\x5f\\x49\\xfc\\x1f\\xfe\\x07\\x3f\\xf3\\xdf\\x68\\x3c\\x35\\x9f\\x6f\\x85\\x9a\\x9c\\x37\\x1b\\x75\\xd5\\x3c\\xf1\\x9c\\xf2\\x3c\\x8d\\xc2\\x18\\xd1\\x3c\\x3c\\xb9\\x2c\\x55\\x6b\\x86\\x3e\\xe7\\x8e\\xe1\\x0e\\x8a\\x9b\\x8d\\x70\\xff\\x28\\xdf\\x5a\\x45\\xa1\\xb9\\x42\\x86\\xb7\\xc2\\xc1\\x03\\x1e\\xe0\\x03\\xb4\\x5a\\xf0\\x1e\\xc8\\x7e\\xc1\\x7d\\x5b\\xab\\x0e\\xbc\\x87\\x56\\x97\\x4f\\xf8\\xe6\\x79\\xb3\\xd1\\xa0\\x54\\xfb\\x58\\x2b\\xff\\xaf\\x07\\x3c\\xfc\\x1b\\x3e\\xc0\\xeb\\xff\\xef\\xa1\\x0f\\x7f\\xfe\\x09\\xfd\\x57\\x34\\x31\\xe7\\x85\\xa1\\xcd\\xd6\\x3e\\xa0\\x0a\\x92\\xe1\\x01\\x70\\x00\\x9b\\x4b\\xab\\xaa\\x8d\\xc1\\x11\\xfc\\xf3\\x77\\xc0\\x3d\\xca\\x82\\xd0\\x07\\xba\\x98\\x1f\\xb1\\xcd\\xec\\x3a\\x02\\xb5\\xea\\x00\\xb3\\xed\\xf5\\x60\\xf1\\xa0\\xf3\\xb0\\xb8\\x4a\\x14\\x5f\\xc2\\xf0\\x46\\x34\\x96\\x40\\x1b\\x42\\x67\\x44\\x16\\xa4\\xed\\xab\\xf8\\x24\\xd5\\x7c\\x6b\\xf5\\x31\\x6a\\x6c\\xf3\\x98\\xec\\x82\\x9c\\x36\\xeb\\x76\\xa7\\xc3\\x31\\xea\\x04\\xda\\x7f\\x93\\x54\\xfa\\xaa\\xd2\\x7f\\x5e\\x15\\xe3\\xd8\\x75\\xee\\xb0\\x2b\\xed\\x26\\x0f\\x5f\\x19\\x66\\x6b\\x65\\xd8\\xc3\\x3e\\x02\\x4a\\x2d\\xef\\x6f\\x87\\xf0\\x9f\\xc2\\x13\\x24\\xc2\\xc8\\x67\\xa2\\x15\\xbe\\xf6\\x77\\x0e\\x2b\\x63\\xd5\\x26\\x3b\\x57\\xca\\xa1\\xf7\\x81\\x51\\x50\\x42\\xcc\\x6d\\xd6\\xee\\x77\\x5e\\xc8\\xf5\\xcf\\x3a\\x9d\\xce\\xcf\\x48\\x7d\\x16\\x61\\xf7\\xbf\\x0a\\xbc\\x5e\\x62\\x55\\xfc\\xda\\x2c\\xbe\\xc3\\x07\\x78\\xe3\\x41\\x12\\x57\\xad\\x13\\x87\\x5e\\xbd\\x4d\\xda\\xcf\\x19\\x08\\xd7\\x3f\\x7e\\x80\\x51\\xe5\\xb2\\x84\\xb8\\x4d\\x92\\x1f\\x61\\xbc\\xb1\\x2f\\x65\\x12\\x14\\x17\\x22\\x62\\xd1\\xbb\\x43\\xec\\x79\\x6d\\xb5\\x03\\x48\\x54\\x61\\xbd\\x87\\x51\\x27\\x0a\\xd4\\xba\\xa3\\x4e\\x15\\x4f\\x2d\\x9d\\x44\\x14\\x19\\x1d\\x6b\\x67\\x97\\x56\\xdf\\x07\\x42\\x52\\x21\\xb2\\x4a\\x2e\\xfc\\xad\\x63\\x13\\x10\\xa6\\x56\\x54\\x52\\x6e\\xee\\x46\\xb0\\xff\\xa1\\x86\\xa0\\x76\\xe1\\xd0\\xff\\xc8\\x07\\x27\\x8f\\xfd\\xd4\\xe2\\x0a\\x3b\\x7f\\x85\\xdc\\x60\\x84\\x4e\\xf0\\x47\\x8f\\xdd\\x56\\x2d\\x56\\x0d\\xcd\\x00\\x57\\xce\\x42\\xce\\x7f\\x05\\x5c\\x2d\\x2e\\xde\\x1e\\x61\\xa9\\x36\\xca\\xf3\\x23\\x52\\x92\\xf6\\x2f\\xa2\\xae\\x9b\\xd9\\x16\\x3c\\x3f\\xb9\\x86\\xdc\\xc0\\x20\\x32\\x6f\\xab\\xaa\\x48\\xda\\xc7\\xda\\xe4\\x05\\xc5\\x19\\x9a\\x35\\xa5\\xc7\\x15\\x3a\\x4a\\x7a\\x99\\xe9\\xe7\\xcb\\x11\\x9c\\x44\\x21\\xd1\\x6f\\xcd\\xbb\\xa3\\xce\\xeb\\x29\\x53\\xf7\\x73\\xd9\\xc1\\x4f\\xcd\\xff\\x06\\x00\\x00\\xff\\xff\\x8e\\xc8\\x27\\x72\\x75\\x0b\\x00\\x00\")\n\nfunc _4byte_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t__4byte_tracerJs,\n\t\t\"4byte_tracer.js\",\n\t)\n}\n\nfunc _4byte_tracerJs() (*asset, error) {\n\tbytes, err := _4byte_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"4byte_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb4, 0xc5, 0x48, 0x2d, 0xd9, 0x43, 0x95, 0x93, 0x3b, 0x93, 0x2c, 0x47, 0x8c, 0x84, 0x32, 0x3c, 0x8b, 0x2e, 0xf3, 0x72, 0xc4, 0x57, 0xe6, 0x3a, 0xb3, 0xdf, 0x1d, 0xbf, 0x45, 0x3, 0xfc, 0xa}}\n\treturn a, nil\n}\n\nvar _bigram_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x8c\\x54\\x5b\\x6f\\xdb\\x36\\x14\\x7e\\xf7\\xaf\\xf8\\xde\\x92\\x20\\xae\\xd4\\x6e\\x2f\\x83\\x33\\x0f\\xd0\\xb2\\xa4\\x35\\x90\\xda\\x81\\xad\\xac\\x30\\x86\\x3d\\x50\\xd2\\x91\\x44\\x84\\x26\\x05\\xf2\\xd0\\xae\\x50\\xe4\\xbf\\x17\\x94\\x2c\\x5f\\x8a\\x14\\x8d\\x9e\\x64\\xf3\\xbb\\x9d\\x0b\\x15\\xc7\\xb8\\x35\\x4d\\x6b\\x65\\x55\\x33\\x7e\\x7b\\xff\\xe1\\x0f\\xa4\\x35\\xa1\\x32\\xef\\x88\\x6b\\xb2\\xe4\\x37\\x48\\x3c\\xd7\\xc6\\xba\\x51\\x1c\\x23\\xad\\xa5\\x43\\x29\\x15\\x41\\x3a\\x34\\xc2\\x32\\x4c\\x09\\xfe\\x01\\xaf\\x64\\x66\\x85\\x6d\\xa3\\x51\\x1c\\xf7\\x9c\\x57\\x8f\\x83\\x42\\x69\\x89\\xe0\\x4c\\xc9\\x3b\\x61\\x69\\x82\\xd6\\x78\\xe4\\x42\\xc3\\x52\\x21\\x1d\\x5b\\x99\\x79\\x26\\x48\\x86\\xd0\\x45\\x6c\\x2c\\x36\\xa6\\x90\\x65\\x1b\\x24\\x25\\xc3\\xeb\\x82\\x6c\\x67\\xcd\\x64\\x37\\x6e\\xc8\\xf1\\x71\\xfe\\x84\\x07\\x72\\x8e\\x2c\\x3e\\x92\\x26\\x2b\\x14\\x1e\\x7d\\xa6\\x64\\x8e\\x07\\x99\\x93\\x76\\x04\\xe1\\xd0\\x84\\x7f\\x5c\\x4d\\x05\\xb2\\x4e\\x2e\\x10\\xef\\x43\\x94\\xd5\\x3e\\x0a\\xee\\x8d\\xd7\\x85\\x60\\x69\\xf4\\x18\\x24\\x43\\x72\\x6c\\xc9\\x3a\\x69\\x34\\x7e\\x1f\\xac\\xf6\\x82\\x63\\x18\\x1b\\x44\\x2e\\x05\\x87\\x02\\x2c\\x4c\\x13\\x78\\x57\\x10\\xba\\x85\\x12\\x7c\\xa4\\xbe\\xa1\\x21\\xc7\\xba\\x0b\\x48\\xdd\\xd9\\xd4\\xa6\\x21\\x70\\x2d\\x38\\x54\\xbd\\x93\\x4a\\x21\\x23\\x78\\x47\\xa5\\x57\\xe3\\xa0\\x96\\x79\\xc6\\x97\\x59\\xfa\\x69\\xf1\\x94\\x22\\x99\\xaf\\xf1\\x25\\x59\\x2e\\x93\\x79\\xba\\xbe\\xc1\\x4e\\x72\\x6d\\x3c\\x83\\xb6\\xd4\\x4b\\xc9\\x4d\\xa3\\x24\\x15\\xd8\\x09\\x6b\\x85\\xe6\\x16\\xa6\\x0c\\x0a\\x9f\\xef\\x96\\xb7\\x9f\\x92\\x79\\x9a\\xfc\\x3d\\x7b\\x98\\xa5\\x6b\\x18\\x8b\\xfb\\x59\\x3a\\xbf\\x5b\\xad\\x70\\xbf\\x58\\x22\\xc1\\x63\\xb2\\x4c\\x67\\xb7\\x4f\\x0f\\xc9\\x12\\x8f\\x4f\\xcb\\xc7\\xc5\\xea\\x2e\\xc2\\x8a\\x42\\x2a\\x0a\\xfc\\x5f\\xf7\\xbc\\xec\\xa6\\x67\\x09\\x05\\xb1\\x90\\xca\\x0d\\x9d\\x58\\x1b\\x0f\\x57\\x1b\\xaf\\x0a\\xd4\\x62\\x4b\\xb0\\x94\\x93\\xdc\\x52\\x01\\x81\\xdc\\x34\\xed\\x9b\\x87\\x1a\\xb4\\x84\\x32\\xba\\xea\\x6a\\xfe\\xe9\\x42\\x62\\x56\\x42\\x1b\\x1e\\xc3\\x11\\xe1\\xcf\\x9a\\xb9\\x99\\xc4\\xf1\\x6e\\xb7\\x8b\\x2a\\xed\\x23\\x63\\xab\\x58\\xf5\\x72\\x2e\\xfe\\x2b\\x1a\\x8d\\xbe\\x8d\\x00\\x20\\x8e\\x51\\x4b\\xc7\\x61\\x38\\x41\\x36\\x37\\x5e\\x33\\xd9\\x6e\\xdf\\x4c\\x93\\x9b\\x82\\x90\\xc9\\xca\\x8a\\x8d\\xeb\\xd0\\x01\\x3a\\xc1\\xb7\\x97\\xf1\\xc0\\x55\\xc2\\xf1\\xa2\\x09\\xec\\xf0\\x06\\xd3\\x90\\xed\\xd6\\xaa\\x3b\\xef\\x0f\\x27\\xb8\\xb8\\x38\\xe0\\xe9\\x2b\\xe5\\x3e\\x00\\x50\\x50\\xc3\\x75\\xb0\\xd9\\x13\\x0f\\x8c\\x7f\\xc2\\xc1\\x04\\xef\\x0f\\x1c\\xc7\\xd4\\x39\\x48\\xbd\\x35\\xcf\\x54\\x74\\xdd\\xa6\\x2d\\xd9\\x76\\x48\\xd8\\x6d\\x4f\\x48\\xff\\xef\\xe7\\xbd\\x01\\xb9\\xa8\\x63\\x07\\xea\\x04\\xa5\\xd7\\x79\\xf0\\xbc\\x54\\xa6\\x1a\\xa3\\xc8\\xae\\xd0\\xd7\\x1e\\x9e\\xad\\x08\\x1b\\x8d\\x29\\x94\\xa9\\x22\\xd3\\x44\\x6c\\x56\\x6c\\xa5\\xae\\x2e\\xaf\\x6e\\xce\\x30\\x7d\\xdc\\x1e\\x56\\x51\\x1f\\xf2\\x14\\x23\\x4b\\x5c\\xee\\x31\\x53\\x70\\x2d\\x5d\\x74\\xa8\\xe5\\xea\\xe8\\x36\\xa8\\x3d\\x53\\x8b\\x13\\xd8\\xa2\\xb9\\xbe\\x78\\x77\\x71\\x6d\\x9a\\x9b\\x33\\x64\\xd0\\xec\\x30\\xa1\\xed\\xff\\x3d\\x53\\xfb\\xff\\x0f\\x52\\xe1\\x39\\x07\\x5c\\x5f\\x9f\\x4b\\xbc\\x9c\\xfd\\x22\\xe5\\x08\\xbf\\x92\\xc0\\x14\\x1f\\x7e\\x26\\x72\\x7c\\x3b\\xc9\\x8e\\x29\\x4e\\x93\\x9f\\x17\\x8f\\x69\\xdf\\xba\\xfe\\xfc\\xb8\\x38\\xa5\\xf0\\x8a\\x4f\\xa7\\xba\\xab\\xf7\\xb7\\x58\\xe4\\xec\\x85\\x3a\\xd9\\x14\\x53\\x42\\xe8\\x61\\xd6\\x65\\x7f\\xbf\\x82\\x4a\\x27\\xf1\\xea\\x74\\x8f\\x36\\x96\\xdc\\x6b\\x3e\\x42\\xa9\\xce\\xab\\x17\\x75\\xfd\\xed\\xcc\\x88\\x34\\x24\\x87\\x0d\\xa6\\x02\\x66\\x4b\\x36\\x7c\\x99\\x61\\x89\\xbd\\xd5\\x6e\\x50\\x0c\\xb4\\x52\\x6a\\xa1\\x06\\xed\\xfd\\x25\\x66\\x2b\\x72\\xa9\\xab\\x3e\\x5a\\x7f\\x74\\x92\\x2d\\xe7\\xaf\\xa7\\x5b\\xd7\\x6b\\x1e\\x1b\\x7f\\xe8\\xce\\xcb\\xe8\\x7b\\x00\\x00\\x00\\xff\\xff\\x83\\xb5\\xcb\\x27\\xb0\\x06\\x00\\x00\")\n\nfunc bigram_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_bigram_tracerJs,\n\t\t\"bigram_tracer.js\",\n\t)\n}\n\nfunc bigram_tracerJs() (*asset, error) {\n\tbytes, err := bigram_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"bigram_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0x6c, 0xd, 0x24, 0xf2, 0x49, 0xbd, 0x58, 0x8b, 0xb5, 0xd1, 0xc9, 0xcd, 0xcf, 0x5b, 0x3e, 0x5c, 0xfb, 0x14, 0x50, 0xe7, 0xe3, 0xb9, 0xd1, 0x54, 0x69, 0xe6, 0x5e, 0x45, 0xa6, 0x2c, 0x6c}}\n\treturn a, nil\n}\n\nvar _call_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xd4\\x59\\xdf\\x6f\\x1b\\x37\\xf2\\x7f\\x96\\xfe\\x8a\\x49\\x1e\\x6a\\x09\\x51\\x24\\x27\\xe9\\xb7\\x5f\\xc0\\xae\\x7a\\xd0\\x39\\x4a\\x6a\\xc0\\x8d\\x03\\x5b\\x69\\x10\\x04\\x79\\xa0\\x76\\x67\\x25\\xd6\\x5c\\x72\\x4b\\x72\\x2d\\xef\\xa5\\xfe\\xdf\\x0f\\x33\\xe4\\xae\\x56\\x3f\\xec\\xe8\\x7a\\xb8\\x43\\xef\\x45\\xd0\\x2e\\x67\\x86\\xc3\\x99\\xcf\\xfc\\xe2\\x8e\\x46\\x70\\x66\\x8a\\xca\\xca\\xc5\\xd2\\xc3\\xcb\\xe3\\x17\\xff\\x0f\\xb3\\x25\\xc2\\xc2\\x3c\\x47\\xbf\\x44\\x8b\\x65\\x0e\\x93\\xd2\\x2f\\x8d\\x75\\xdd\\xd1\\x08\\x66\\x4b\\xe9\\x20\\x93\\x0a\\x41\\x3a\\x28\\x84\\xf5\\x60\\x32\\xf0\\x5b\\xf4\\x4a\\xce\\xad\\xb0\\xd5\\xb0\\x3b\\x1a\\x05\\x9e\\xbd\\xcb\\x24\\x21\\xb3\\x88\\xe0\\x4c\\xe6\\x57\\xc2\\xe2\\x09\\x54\\xa6\\x84\\x44\\x68\\xb0\\x98\\x4a\\xe7\\xad\\x9c\\x97\\x1e\\x41\\x7a\\x10\\x3a\\x1d\\x19\\x0b\\xb9\\x49\\x65\\x56\\x91\\x48\\xe9\\xa1\\xd4\\x29\\x5a\\xde\\xda\\xa3\\xcd\\x5d\\xad\\xc7\\xdb\\x77\\x1f\\xe0\\x02\\x9d\\x43\\x0b\\x6f\\x51\\xa3\\x15\\x0a\\xde\\x97\\x73\\x25\\x13\\xb8\\x90\\x09\\x6a\\x87\\x20\\x1c\\x14\\xf4\\xc6\\x2d\\x31\\x85\\x39\\x8b\\x23\\xc6\\x37\\xa4\\xca\\x75\\x54\\x05\\xde\\x98\\x52\\xa7\\xc2\\x4b\\xa3\\x07\\x80\\x92\\x34\\x87\\x5b\\xb4\\x4e\\x1a\\x0d\\xaf\\xea\\xad\\xa2\\xc0\\x01\\x18\\x4b\\x42\\x7a\\xc2\\xd3\\x01\\x2c\\x98\\x82\\xf8\\xfa\\x20\\x74\\x05\\x4a\\xf8\\x35\\xeb\\x01\\x06\\x59\\x9f\\x3b\\x05\\xa9\\x79\\x9b\\xa5\\x29\\x10\\xfc\\x52\\x78\\x3a\\xf5\\x4a\\x2a\\x05\\x73\\x84\\xd2\\x61\\x56\\xaa\\x01\\x49\\x9b\\x97\\x1e\\x3e\\x9e\\xcf\\x7e\\xbe\\xfc\\x30\\x83\\xc9\\xbb\\x4f\\xf0\\x71\\x72\\x75\\x35\\x79\\x37\\xfb\\x74\\x0a\\x2b\\xe9\\x97\\xa6\\xf4\\x80\\xb7\\x18\\x44\\xc9\\xbc\\x50\\x12\\x53\\x58\\x09\\x6b\\x85\\xf6\\x15\\x98\\x8c\\x24\\xfc\\x32\\xbd\\x3a\\xfb\\x79\\xf2\\x6e\\x36\\xf9\\xfb\\xf9\\xc5\\xf9\\xec\\x13\\x18\\x0b\\x6f\\xce\\x67\\xef\\xa6\\xd7\\xd7\\xf0\\xe6\\xf2\\x0a\\x26\\xf0\\x7e\\x72\\x35\\x3b\\x3f\\xfb\\x70\\x31\\xb9\\x82\\xf7\\x1f\\xae\\xde\\x5f\\x5e\\x4f\\x87\\x70\\x8d\\xa4\\x15\\x12\\xff\\xb7\\x6d\\x9e\\xb1\\xf7\\x2c\\x42\\x8a\\x5e\\x48\\xe5\\x6a\\x4b\\x7c\\x32\\x25\\xb8\\xa5\\x29\\x55\\x0a\\x4b\\x71\\x8b\\x60\\x31\\x41\\x79\\x8b\\x29\\x08\\x48\\x4c\\x51\\x1d\\xec\\x54\\x92\\x25\\x94\\xd1\\x0b\\x3e\\xf3\\x83\\x80\\x84\\xf3\\x0c\\xb4\\xf1\\x03\\x70\\x88\\xf0\\xe3\\xd2\\xfb\\xe2\\x64\\x34\\x5a\\xad\\x56\\xc3\\x85\\x2e\\x87\\xc6\\x2e\\x46\\x2a\\x88\\x73\\xa3\\x9f\\x86\\x5d\\x92\\x99\\x08\\xa5\\x66\\x56\\x24\\x68\\xc9\\x39\\x02\\xb2\\x92\\xcc\\xaf\\xcc\\x4a\\x83\\xb7\\x42\\x3b\\x91\\x90\\xab\\xe9\\x7f\\xc2\\x60\\x14\\x1e\\xf0\\x8e\\x9e\\xbc\\x23\\xd0\\x82\\xc5\\xc2\\x58\\xfa\\xaf\\x54\\x8d\\x33\\xa9\\x3d\\x5a\\x2d\\x14\\xcb\\x76\\x90\\x8b\\x14\\x61\\x5e\\x81\\x68\\x0b\\x1c\\xb4\\x0f\\x43\\x30\\x0a\\xee\\x06\\xa9\\x33\\x63\\x73\\x86\\xe5\\xb0\\xfb\\xb5\\xdb\\x89\\x1a\\x3a\\x2f\\x92\\x1b\\x52\\x90\\xe4\\x27\\xa5\\xb5\\xa8\\x3d\\x99\\xb2\\xb4\\x4e\\xde\\x22\\x93\\x40\\xa0\\x89\\xf6\\x9c\\xfe\\xfa\\x0b\\xe0\\x1d\\x26\\x65\\x90\\xd4\\x69\\x84\\x9c\\xc0\\xe7\\xaf\\xf7\\x5f\\x06\\x5d\\x16\\x9d\\xa2\\x4b\\x50\\xa7\\x98\\xf2\\xf9\\x6e\\x1c\\xac\\x96\\x6c\\x51\\x58\\xe1\\xd1\\x2d\\xc2\\x6f\\xa5\\xf3\\x2d\\x9a\\xcc\\x9a\\x1c\\x84\\x06\\x53\\x12\\xe2\\xdb\\xd6\\x91\\xda\\x1b\\x16\\x28\\xe8\\xbf\\x46\\xcb\\x1a\\x0d\\xbb\\x9d\\x86\\xf9\\x04\\x32\\xa1\\x1c\\xc6\\x7d\\x9d\\xc7\\x82\\x4e\\x23\\xf5\\xad\\xb9\\x21\\xc9\\xc6\\x12\\x84\\x6d\\x05\\xa6\\x48\\x4c\\x1a\\x83\\x81\\xce\\xd1\\x1c\\x03\\xdd\\xb0\\xdb\\x21\\xbe\\x13\\xc8\\x4a\\xcd\\xdb\\xf6\\x94\\x59\\x0c\\x20\\x9d\\xf7\\xe1\\x6b\\xb7\\x43\\x62\\xcf\\x44\\xe1\\x4b\\x8b\\x6c\\x4f\\xb4\\xd6\\x58\\x07\\x32\\xcf\\x31\\x95\\xc2\\xa3\\xaa\\xba\\x9d\\xce\\xad\\xb0\\x61\\x01\\xc6\\xa0\\xcc\\x62\\xb8\\x40\\x3f\\xa5\\xc7\\x5e\\xff\\xb4\\xdb\\xe9\\xc8\\x0c\\x7a\\x61\\xf5\\xc9\\x78\\xcc\\xd9\\x27\\x93\\x1a\\xd3\\x20\\xbe\\xe3\\x97\\xd2\\x0d\\x33\\x51\\x2a\\xdf\\xec\\x4b\\x4c\\x1d\\x8b\\xbe\\xb4\\x9a\\xfe\\xde\\x07\\x2d\\x3e\\x22\\x18\\xad\\x2a\\x48\\x28\\xcb\\x88\\x39\\x85\\xa7\\xab\\x9c\\xc7\\x3c\\x1e\\xce\\x0d\\x20\\x13\\x8e\\x4c\\x28\\x33\\x58\\x21\\x14\\x16\\x9f\\x27\\x4b\\x24\\xdf\\xe9\\x04\\xa3\\x96\\xae\\x72\\xec\\xd4\\x31\\xd0\\x6e\\x43\\x53\\x0c\\xbd\\x79\\x57\\xe6\\x73\\xb4\\xbd\\x3e\\x7c\\x07\\xc7\\x77\\xd9\\x71\\x1f\\xc6\\x63\\xfe\\x53\\xeb\\x1e\\x79\\xa2\\xbe\\x24\\xc5\\x14\\xf1\\xa0\\xcc\\x7f\\xed\\xad\\xd4\\x8b\\x70\\xd6\\xa8\\xeb\\x79\\x06\\x02\\x34\\xae\\x20\\x31\\x9a\\x41\\x4d\\x5e\\x99\\xa3\\xd4\\x0b\\x48\\x2c\\x0a\\x8f\\xe9\\x00\\x44\\x9a\\x82\\x37\\x01\\x79\\x0d\\xce\\x36\\xb7\\x84\\xef\\xbe\\xe3\\xbd\\xc6\\x70\\x74\\x76\\x35\\x9d\\xcc\\xa6\\x47\\x2d\\x25\\xa4\\xbe\\xcc\\xb2\\xa8\\x07\\xf3\\x0e\\x0b\\xc4\\x9b\\xde\\x8b\\xfe\\xf0\\x56\\xa8\\x12\\x2f\\xb3\\xa0\\x51\\xa4\\x9d\\xea\\x14\\xc6\\x91\\xe7\\xd9\\x36\\xcf\\xcb\\x0d\\x1e\\x62\\x1a\\x8d\\x60\\xe2\\x1c\\xe6\\x73\\x85\\xbb\\xb1\\x17\\x83\\x93\\xe3\\xd4\\x79\\x4a\\x4e\\x04\\xb4\\xc4\\xe4\\x85\\x42\\x02\\x50\\xbd\\x6b\\xb4\\x34\\x6b\\xdc\\xf1\\x55\\x81\\x27\\x00\\x00\\xa6\\x18\\xf0\\x0b\\x82\\x3d\\xbf\\xf0\\xe6\\x67\\xbc\\x63\\x77\\xd4\\xd6\\x22\\x00\\x4d\\xd2\\xd4\\xa2\\x73\\xbd\\x7e\\x3f\\x90\\x4b\\x5d\\x94\\xfe\\x64\\x83\\x3c\\xc7\\xdc\\xd8\\x6a\\xe8\\x28\\xf7\\xf4\\xf8\\x68\\x83\\x70\\xd2\\x9a\\x67\\x21\\xdc\\xb9\\x26\\x9e\\x08\\xca\\xb7\\xc2\\xf5\\xd6\\x4b\\x67\\xc6\\xf9\\x93\\x7a\\x89\\x1e\\xea\\x35\\xb6\\x05\\xb1\\x1d\\x1d\\xdf\\x1d\\xed\\x5a\\xeb\\xb8\\xbf\\x76\\xfa\\x8b\\x1f\\xfa\\xc4\\x72\\x7f\\xda\\x40\\xb9\\xc9\\x08\\xc3\\xa2\\x74\\xcb\\x1e\\x23\\x67\\xbd\\xba\\x8e\\xfa\\x31\\x78\\x5b\\xe2\\x5e\\xa4\\x33\\x7a\\x76\\x91\\xe3\\x50\\x65\\x94\\x36\\xbc\\x2d\\x13\\x46\\xd0\\x42\\x70\\x52\\xe1\\xa0\\x16\\x94\\x64\\x5d\\x39\\x67\\x9b\\x7b\\x63\\x1e\\x04\\xd2\\xf5\\xf4\\xe2\\xcd\\xeb\\xe9\\xf5\\xec\\xea\\xc3\\xd9\\xac\\x0d\\x27\\x85\\x99\\x27\\xa5\\x36\\xcf\\xa0\\x50\\x2f\\xfc\\x92\\xf5\\x27\\x71\\x9b\\xab\\x9f\\x89\\xe7\\xf9\\x8b\\x2f\\xe1\\x0d\\x8c\\xf7\\x44\\x77\\xe7\\x71\\x0e\\xf8\\xfc\\x85\\x65\\xdf\\xef\\x9a\\x6f\\x93\\x34\\x18\\xf3\\x6b\\x00\\x91\\x29\\xee\\xdb\\x39\\x62\\x4f\\xd8\\xe5\\xe8\\x97\\x26\\xe5\\x3c\\x98\\x88\\x90\\x4a\\x6b\\x2b\\xa6\\x46\\xe3\\xc1\\xc1\\xd7\\xab\\xa3\\x6f\\x72\\x71\\x71\\x04\\x7f\\xfc\\x01\\xad\\xe7\\xb3\\xcb\\xd7\\xd3\\xf6\\xbb\\xd7\\xd3\\x8b\\xe9\\xdb\\xc9\\x6c\\xba\\x4d\\x7b\\x3d\\x9b\\xcc\\xce\\xcf\\xf8\\x6d\\x3f\\x5a\\x65\\x34\\x82\\xeb\\x1b\\x59\\x70\\x42\\xe5\\x34\\x65\\xf2\\x82\\x3b\\xc3\\x46\\x5f\\x37\\x00\\xbf\\x34\\xd4\\x73\\xd9\\x58\\x2f\\x32\\xa1\\x93\\x3a\\x8f\\xbb\\xda\\x69\\xde\\x90\\xcb\\x4c\\x1d\\x2b\\xbb\\xa9\\xa0\\x0d\\xd4\\x7e\\xe3\\x46\\xe9\\xde\\x5b\\x8c\\x9b\\xa6\\x3d\\x6f\\x6a\\xbd\\xd6\\x06\\x0d\\x1e\\xe1\\x5c\\xc7\\x49\\xa6\\x77\\xf8\\x21\\xe1\\x6f\\x70\\x0c\\x27\\xf0\\x22\\x66\\x92\\x47\\x52\\xd5\\x4b\\x78\\x46\\xe2\\xff\\x44\\xc2\\x7a\\xb5\\x87\\xf3\\xaf\\x99\\xb6\\xbc\\x61\\xe2\\x9a\\xdc\\x9b\\xff\\x7e\\x3a\\x33\\xa5\\xbf\\xcc\\xb2\\x13\\xd8\\x36\\xe2\\xf7\\x3b\\x46\\x6c\\xe8\\x2f\\x50\\xef\\xd2\\xff\\xdf\\x0e\\xfd\\x3a\\xf5\\x11\\xaa\\x4c\\x01\\x4f\\x76\\x20\\x12\\x12\\xcf\\x93\\xad\\x38\\x88\\xc6\\xe5\\x6e\\x86\\xa5\\xc1\\xf8\\x81\\x64\\xfb\\x72\\x13\\xc3\\x0f\\x65\\x8b\\x7f\\x2b\\xd9\\xee\\xed\\xca\\xa8\\xf7\\xda\\xec\\xbb\\x06\\x60\\xd1\\x5b\\x89\\xb7\\x34\\x59\\x1d\\x39\\x16\\x49\\xfd\\xa9\\x59\\x09\\x9d\\xe0\\x10\\x3e\\x62\\x90\\xa8\\x11\\x39\\xb9\\xc4\\x7e\\x96\\xda\\x11\\x6e\\xf1\\xa8\\x27\\x8d\\x93\\x09\\x43\\x4c\\x70\\xdb\\x69\\x11\\x72\\x51\\xd1\\x64\\x92\\x95\\xfa\\xa6\\x82\\x85\\x70\\x90\\x56\\x5a\\xe4\\x32\\x71\\x41\\x1e\\xf7\\xb2\\x16\\x17\\xc2\\xb2\\x58\\x8b\\xbf\\x97\\xe8\\x68\\xcc\\x21\\x20\\x8b\\xc4\\x97\\x42\\xa9\\x0a\\x16\\x92\\x66\\x15\\xe2\\xee\\xbd\\x7c\\x75\\x7c\\x0c\\xce\\xcb\\x02\\x75\\x3a\\x80\\x1f\\x5e\\x8d\\x7e\\xf8\\x1e\\x6c\\xa9\\xb0\\x3f\\xec\\xb6\\xd2\\x78\\x73\\xd4\\xe8\\x0d\\x5a\\x88\\xe8\\x79\\x8d\\x85\\x5f\\xf6\\xfa\\xf0\\xd3\\x03\\xf5\\xe0\\x81\\xe4\\xbe\\x97\\x16\\x9e\\xc3\\x8b\\x2f\\x43\\xd2\\x6b\\xbc\\x81\\xdb\\xe0\\x49\\x40\\xe5\\x30\\x4a\\xa3\\xf9\\xee\\xf2\\xf5\\x65\\xef\\x46\\x58\\xa1\\xc4\\x1c\\xfb\\x27\\x3c\\xef\\xb1\\xad\\x56\\x22\\x36\\xfc\\xe4\\x14\\x28\\x94\\x90\\x1a\\x44\\x92\\x98\\x52\\x7b\\x32\\x7c\\xdd\\xbb\\xab\\x8a\\xf2\\xfb\\x91\\xaf\\xe5\\xf1\\x68\\x24\\x92\\x04\\x9d\\xab\\xd3\\x3d\\x7b\\x8d\\xd4\\x11\\x39\\x71\\x83\\xd4\\x4e\\xa6\\xd8\\xf2\\x0a\\x65\\x07\\xc3\\xa9\\x39\\x52\\xd0\\xe4\\x58\\x0b\\xcc\\x8d\\xa3\\x4d\\xe6\\x08\\x2b\\x4b\\x73\\x86\\x93\\x3a\\xe1\\x41\\x3b\\x45\\xb2\\xb6\\x03\\xa3\\x41\\x80\\x32\\x3c\\xdd\\x73\\x8c\\x83\\xb0\\x0b\\x37\\x0c\\xf9\\x9e\\xb6\\xa5\\x9c\\xa3\\xcd\\x6a\\xb8\\x09\\xe4\\x36\\x54\\xb9\\xa3\\xdf\\x6a\\x07\\x34\\xe0\\x9d\\x74\\x9e\\x1b\\x48\\xd2\\x52\\x3a\\x08\\x48\\x96\\x7a\\x31\\x80\\xc2\\x14\\x9c\\xa7\\x0f\\xec\\x25\\xaf\\xa6\\xbf\\x4e\\xaf\\x9a\\xe2\\x7f\\xb8\\x13\\xeb\\x16\\xff\\x69\\x33\\x01\\x81\\xa5\\xf1\\xc2\\x63\\xfa\\x74\\x4f\\xcf\\xbe\\x07\\x50\\xe3\\x07\\x00\\x45\\xf2\\xd7\\xb5\\xf1\\x7d\\xeb\\x38\\x4a\\x38\\xbf\\x76\\xcc\\x02\\xc3\\xf8\\xd2\\x56\\xc0\\x95\\xca\\xbb\\xad\\xdc\\xbd\\x9d\\x1c\\x4c\\x51\\x57\\x08\\x52\\x8a\\xd3\\x0e\\x25\\xf6\\x3d\\x9d\\x75\\x34\\xb8\\x6f\\x03\\x4f\\x40\\xa0\\x69\\x25\\x00\\x5e\\xaf\\x3b\\x34\\x11\\x72\\x3e\\x6b\\x68\\x4a\\x4f\\x4e\\xa7\\x2a\\xbd\\x4e\\x71\\x0b\\xe1\\x3e\\x38\\xf6\\x6d\\x4c\\x72\\x73\\xb9\\x38\\xd7\\xbe\\x57\\x2f\\x9e\\x6b\\x78\\x0e\\xf5\\x03\\xa5\\x6e\\x78\\xbe\\x11\\x2b\\x7b\\x72\\x60\\x27\\x45\\x85\\x1e\\x61\\x2d\\xe2\\x14\\xb6\\x5e\\x91\\xa0\\x70\\x68\\x36\\x8d\\x45\\xbf\\x5b\\x82\\x8f\\xa3\\x34\\x32\\xcb\\x13\\x8b\\x7e\\x88\\xbf\\x97\\x42\\xb9\\xde\\x71\\xd3\\x12\\x84\\x13\\x78\\xc3\\x45\\x6c\\xdc\\x94\\xb1\\xba\\xce\\x11\\xcf\\x46\\x93\\x11\\x05\\x06\\xb6\\x68\\x8d\\x9a\\x2d\\x9d\\x87\\xda\\x94\\xe2\\xa3\\x12\\xa2\\x88\\x98\\x1c\\x1a\\x8f\\x45\\xf8\\xed\\xeb\\x32\\x3b\\x6d\\x02\\x78\\xda\\x94\\xfd\\x4c\\x48\\x55\\x5a\\x7c\\x7a\\x0a\\x7b\\x92\\x8b\\x2b\\x6d\\x26\\x12\\xf6\\xa5\\x43\\xe0\\x11\\xd4\\x81\\x33\\x39\\x2e\\xcd\\x2a\\x28\\xb0\\x2f\\x45\\xed\\x82\\xa3\\xc1\\xc1\\x56\\x91\\xe0\\xbb\\x14\\xe1\\xa0\\x74\\x62\\x81\\x2d\\x70\\x34\\x06\\xaf\\x1d\\xb5\\x77\\x2e\\xfe\\xd3\\xd0\\x79\\xd6\\x3c\\x7e\\x03\\x45\\x61\\x97\\x6f\\x42\\xe3\\x31\\x6c\\xec\\xf5\\xf2\\x4e\\x2f\\x53\\x13\\x71\\x47\\xd3\\x7a\\xa8\\x55\\x0d\\x0d\\x47\\x83\\x9c\\x7f\\xc5\\xef\\xff\\x19\\xc7\\x07\\xcf\\xc7\\xdf\\x43\\x03\\x6d\\x9b\\x36\\x9c\\x71\\x93\\x38\\x9c\\x74\\xdd\\xc4\\x7c\\x1b\\x05\\xcd\\xea\\x43\\x00\\x78\\xa8\\x3f\\x22\\xa8\\xea\\xdf\\x30\\xf1\\x6b\\xb8\\x72\\x4b\\x43\\x4f\\x85\\xc5\\x5b\\x69\\x4a\\xaa\\x56\\xf8\\xbf\\x34\\xff\\x35\\xfd\\xdd\\x7d\\xb7\\x73\\x1f\\xef\\xbc\\xd8\\x7d\\xed\\x4b\\xaf\\xd5\\x32\\xde\\xd9\\x86\\xd6\\xa8\\x55\\x2b\\x0c\\x17\\xd2\\x78\\x15\\x96\\x85\\xdb\\xd4\\x0e\\xf3\\x3f\\x72\\xf9\\x15\\xe3\\xdd\\x9b\\x82\\x6a\\x7f\\x2c\\x45\\xca\\xa2\\x48\\xab\\xa6\\xfa\\x0d\\x42\\xd7\\x01\\x4b\\xa1\\xd3\\x38\\x79\\x88\\x34\\x95\\x24\\x8f\\xb1\\x48\\x1a\\x8a\\x85\\x90\\xba\\xbb\\xd7\\x8c\\xdf\\x2c\\xb9\\xfb\\x90\\xb1\\xd3\\xc8\\xb6\\xab\\x66\\x9c\\x18\\x69\\xbc\\x63\\x8d\\xbb\\x07\\x54\\xc7\\xad\\x58\\xda\\xbe\\xc7\\x8b\\x57\\x81\\x46\\xbb\\x32\\xe7\\xb6\\x17\\xc4\\xad\\x90\\x4a\\xd0\\xa8\\xc5\\xed\\x94\\x4e\\x21\\x51\\x28\\x74\\xb8\\xbd\\xc7\\xcc\\x9b\\x5b\\xb4\\xae\\x7b\\x00\\xc8\\xff\\x0c\\xc6\\xb7\\x92\\x63\\xfd\\x18\\xcd\\x71\\x78\\xcc\\x1e\\x1a\\xb1\\xe1\\xf8\\x6f\\x94\\xf0\\x3e\\xc2\\xab\\x65\\xde\\x10\\x59\\xd2\\xf3\\x87\\x1d\\xd4\\xbe\\x7b\\x58\\x48\\x71\\x83\\x44\\x34\\x3f\\xc1\\x71\\xab\\x09\\xff\\xab\\x04\\xd9\\x2e\\xc4\\x2e\\x9a\\x66\\x2c\\x1e\\xde\\x1b\\x33\\x00\\x85\\x82\\x47\\xa2\\xfa\\xb3\\x4b\\xdd\\x7c\\x3e\\x36\\xa1\\xd5\\xd1\\x1b\\xda\\xb7\\x9d\\xf0\\xe5\\x4b\\xac\\x25\\xd6\\xd7\\x1d\\xa1\\x8f\\x9f\\x23\\x6a\\x90\\x1e\\xad\\xa0\\xe1\\x87\\xd0\\x15\\xbf\\x14\\x90\\x96\\x8e\\xc5\\xb1\\x5f\\x24\\x05\\x5d\\x14\\x1c\\xaf\\xed\\xa9\\x3e\\x4b\\xbd\\x18\\x76\\x3b\\xe1\\x7d\\x2b\\xde\\x13\\x7f\\xb7\\x8e\\xf7\\x50\\x0c\\x99\\x33\\x5e\\x00\\x34\\xf3\\x7f\\xe2\\xef\\xb8\\x67\\xe4\\x19\\x79\\xeb\\x12\\x80\\xd6\\xe8\\x55\\x18\\xa0\\xb7\\x46\\x7e\\x66\\x8c\\x63\\xff\\xf6\\xcd\\x22\\xad\\xf1\\xbb\\x0d\\x80\\x33\\xe9\\x42\\xb8\\x20\\x66\\x2b\\x24\\xfc\\xdd\\x6e\\x44\\xd4\\x0c\\x14\\x0c\\x27\\xfb\\x19\\x68\\x69\\x0f\\xd3\\xd6\\x35\\x04\\x11\\xf3\\xab\\xb0\\x1a\\x0a\\xfb\\x49\\x7b\\x35\\xbc\\x8a\\x07\\x95\\x79\\xcb\\x36\\x32\\x67\\xdb\\xdc\\x9f\\xee\\x4f\\x72\\xc7\\x35\\x1e\\xf7\\x27\\x33\\xb2\\x79\\x03\\xd8\\x07\\x58\\xdb\\x83\\xc5\\x2e\\xc9\\x63\\xa9\\x92\\xa5\\xd7\\x99\\xed\\x01\\x56\\x96\\xde\\x6a\\x3d\\xfc\\xdd\\xe1\\x22\\x1b\\xe2\\xb6\\x8a\\x1b\\x34\\xfb\\x84\\xc4\\x3c\\x13\\xe9\\x82\\x65\\x6b\\x01\\x01\\xd5\\x41\\x57\\x46\\xb4\\xfc\\x07\\x46\\x89\\xed\\xf8\\xa9\\x97\\xc0\\x62\\xf8\\xb0\\xc0\\x0d\\x29\\x85\\x8f\\x99\\x73\\xf1\\x2f\\x1d\\xcd\\x8c\\xeb\\xb8\\x48\\xd1\\x49\\x8b\\x29\\x64\\x12\\x55\\x0a\\x26\\x45\\xcb\\x13\\xe9\\x6f\\xce\\xe8\\xf0\\x09\\x09\\xad\\x24\\x89\\xe1\\x53\\x59\\xf8\\x6a\\xcd\\x1f\\xf0\\xb4\\x4c\\xd0\\x57\\x90\\xa1\\xe0\\x6f\\x41\\xde\\x40\\x21\\x9c\\x83\\x1c\\x05\\xcd\\xa0\\x59\\xa9\\x54\\x05\\xc6\\xa6\\x48\\xc2\\x9b\\xa1\\x8c\\x42\\xd2\\x40\\xe9\\xd0\\x3a\\x58\\x2d\\x4d\\x2c\\x93\\xdc\\xa5\\x15\\xd4\\x74\\x4a\\x3f\\x88\\xf7\\x2e\\xd2\\x15\\x4a\\x54\\x20\\x3d\\x95\\xe4\\x78\\xa8\\x76\\x94\\x36\\x1f\\x60\\xf8\\x2b\\x8e\\xa1\\xaa\\xbb\\x1b\\xa2\\xf5\\x5c\\xb7\\x19\\xa3\\xfc\\x9a\\x9e\\x36\\xa3\\x33\\xce\\x35\\x9b\\x71\\xb9\\xbe\\x91\\xda\\x0c\\xc2\\xba\\x6c\\x6c\\x46\\x5a\\xbb\\x08\\x6d\\x86\\x13\\xaf\\xf0\\xd3\\x66\\x20\\xb5\\xfa\\x65\\x5e\\x60\\x70\\x34\\x0c\\xfc\\xb4\\x15\\x5a\\xac\\x65\\x8c\\xad\\xf0\\xb9\\xb1\\x21\\xe7\\xa7\\x41\\x04\\x0c\\x79\\xb1\\x47\\xc6\\xb9\\xc1\\x8a\\x32\\x71\\xb0\\x51\\xab\\xac\\x84\\x17\\x9f\\x6f\\xb0\\xfa\\xb2\\xbf\\x8a\\x44\\x38\\xb6\\xe8\\x9a\\xb2\\x51\\x43\\x3a\\xac\\x3d\\x12\\xc8\\x8d\\x16\\x72\\x7c\\x7c\\x0a\\xf2\\xc7\\x36\\x43\\x5d\\xf9\\x40\\x3e\\x7b\\x56\\xef\\xd9\\x5e\\xff\\x2c\\xbf\\xd4\\xd1\\xd9\\x20\\x7e\\x6b\\xbd\\xbf\\xa1\\x51\\x8c\\x91\\x40\\x43\\x41\\xd1\\xbd\\xef\\xfe\\x33\\x00\\x00\\xff\\xff\\xb5\\x25\\x8b\\x4d\\x94\\x21\\x00\\x00\")\n\nfunc call_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_call_tracerJs,\n\t\t\"call_tracer.js\",\n\t)\n}\n\nfunc call_tracerJs() (*asset, error) {\n\tbytes, err := call_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"call_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf5, 0xb3, 0xb6, 0xe8, 0x19, 0xc3, 0xa, 0xce, 0xfd, 0x50, 0x84, 0xf7, 0x8a, 0xc5, 0x99, 0x10, 0x58, 0xc4, 0x69, 0xfb, 0x8, 0xad, 0x67, 0xea, 0x12, 0x38, 0xcb, 0xd, 0x2a, 0x94, 0xa1, 0x70}}\n\treturn a, nil\n}\n\nvar _evmdis_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xac\\x57\\xdf\\x6f\\xda\\xca\\x12\\x7e\\x86\\xbf\\x62\\x94\\x27\\x50\\x29\\x60\\x63\\x08\\x38\\x27\\x47\\xe2\\xa6\\xf4\\x1c\\xae\\xd2\\x24\\x02\\x72\\x8f\\x2a\\x94\\x87\\x05\\xc6\\xb0\\xaa\\xf1\\x5a\\xbb\\x6b\\x72\\xb8\\x55\\xfe\\xf7\\xab\\xd9\\x59\\x03\\xf9\\x75\\xdb\\x4a\\xa7\\x0f\\x3b\\xb5\\x77\\xbe\\x6f\\xbe\\x9d\\x19\\xcf\\x92\\x56\\x0b\\xae\\x54\\xbe\\xd7\\x72\\xbd\\xb1\\x10\\xb6\\x83\\x73\\x98\\x6d\\x10\\xd6\\xea\\x23\\xda\\x0d\\x6a\\x2c\\xb6\\x30\\x2c\\xec\\x46\\x69\\x53\\x6d\\xb5\\x60\\xb6\\x91\\x06\\x12\\x99\\x22\\x48\\x03\\xb9\\xd0\\x16\\x54\\x02\\xf6\\x85\\x7f\\x2a\\x17\\x5a\\xe8\\x7d\\xb3\\xda\\x6a\\x31\\xe6\\xcd\\x6d\\x62\\x48\\x34\\x22\\x18\\x95\\xd8\\x47\\xa1\\x31\\x86\\xbd\\x2a\\x60\\x29\\x32\\xd0\\xb8\\x92\\xc6\\x6a\\xb9\\x28\\x2c\\x82\\xb4\\x20\\xb2\\x55\\x4b\\x69\\xd8\\xaa\\x95\\x4c\\xf6\\x44\\x29\\x2d\\x14\\xd9\\x0a\\xb5\\x0b\\x6d\\x51\\x6f\\x4d\\xa9\\xe3\\x8f\\x9b\\x7b\\xb8\\x46\\x63\\x50\\xc3\\x1f\\x98\\xa1\\x16\\x29\\xdc\\x15\\x8b\\x54\\x2e\\xe1\\x5a\\x2e\\x31\\x33\\x08\\xc2\\x40\\x4e\\x6f\\xcc\\x06\\x57\\xb0\\x70\\x74\\x04\\xfc\\x4c\\x52\\xa6\\x5e\\x0a\\x7c\\x56\\x45\\xb6\\x12\\x56\\xaa\\xac\\x01\\x28\\x49\\x39\\xec\\x50\\x1b\\xa9\\x32\\xe8\\x94\\xa1\\x3c\\x61\\x03\\x94\\x26\\x92\\x9a\\xb0\\x74\\x00\\x0d\\x2a\\x27\\x5c\\x1d\\x44\\xb6\\x87\\x54\\xd8\\x23\\xf4\\x27\\x12\\x72\\x3c\\xf7\\x0a\\x64\\xe6\\xc2\\x6c\\x54\\x8e\\x60\\x37\\xc2\\xd2\\xa9\\x1f\\x65\\x9a\\xc2\\x02\\xa1\\x30\\x98\\x14\\x69\\x83\\xd8\\x16\\x85\\x85\\xbf\\xc6\\xb3\\x3f\\x6f\\xef\\x67\\x30\\xbc\\xf9\\x0a\\x7f\\x0d\\x27\\x93\\xe1\\xcd\\xec\\xeb\\x05\\x3c\\x4a\\xbb\\x51\\x85\\x05\\xdc\\x21\\x53\\xc9\\x6d\\x9e\\x4a\\x5c\\xc1\\xa3\\xd0\\x5a\\x64\\x76\\x0f\\x2a\\x21\\x86\\x2f\\xa3\\xc9\\xd5\\x9f\\xc3\\x9b\\xd9\\xf0\\x5f\\xe3\\xeb\\xf1\\xec\\x2b\\x28\\x0d\\x9f\\xc7\\xb3\\x9b\\xd1\\x74\\x0a\\x9f\\x6f\\x27\\x30\\x84\\xbb\\xe1\\x64\\x36\\xbe\\xba\\xbf\\x1e\\x4e\\xe0\\xee\\x7e\\x72\\x77\\x3b\\x1d\\x35\\x61\\x8a\\xa4\\x0a\\x09\\xff\\xe3\\x9c\\x27\\xae\\x7a\\x1a\\x61\\x85\\x56\\xc8\\xd4\\x94\\x99\\xf8\\xaa\\x0a\\x30\\x1b\\x55\\xa4\\x2b\\xd8\\x88\\x1d\\x82\\xc6\\x25\\xca\\x1d\\xae\\x40\\xc0\\x52\\xe5\\xfb\\x9f\\x2e\\x2a\\x71\\x89\\x54\\x65\\x6b\\x77\\xe6\\x77\\x1b\\x12\\xc6\\x09\\x64\\xca\\x36\\xc0\\x20\\xc2\\x6f\\x1b\\x6b\\xf3\\xb8\\xd5\\x7a\\x7c\\x7c\\x6c\\xae\\xb3\\xa2\\xa9\\xf4\\xba\\x95\\x32\\x9d\\x69\\xfd\\xde\\xac\\x12\\x27\\xee\\xb6\\x2b\\x69\\x66\\x5a\\x2c\\x51\\x83\\x46\\x5b\\xe8\\xcc\\x80\\x29\\x92\\x84\\xfc\\x2c\\xc8\\x2c\\x51\\x7a\\xeb\\xda\\x04\\x12\\xad\\xb6\\x20\\xc0\\x92\\x2f\\x58\\x05\\x39\\x6a\\xda\\xf4\\x14\\x1f\\x8d\\xdd\\xa7\\x4e\\xe6\\x4a\\x1a\\x61\\x0c\\x6e\\x17\\xe9\\xbe\\x59\\xfd\\x5e\\xad\\x18\\x2b\\x96\\xdf\\x62\\x98\\x7f\\x57\\xb9\\x89\\x61\\xfe\\xf0\\xf4\\xd0\\xa8\\x56\\x2b\\x59\\x5e\\x98\\x0d\\x9a\\x18\\xbe\\xb7\\x63\\x68\\x37\\x20\\x88\\x21\\x68\\x40\\xe8\\xd6\\x8e\\x5b\\x23\\xb7\\x76\\xdd\\xda\\x73\\xeb\\xb9\\x5b\\xfb\\x6e\\x1d\\xb8\\x35\\x68\\xb3\\x61\\x74\\xc0\\x6e\\x01\\xfb\\x05\\xec\\x18\\xb0\\x67\\xc8\\x9e\\xa1\\x8f\\xc3\\x81\\x42\\x8e\\x14\\x72\\xa8\\x90\\x63\\x85\\xcc\\xd2\\x61\\x97\\x88\\x59\\x22\\x66\\xe9\\x32\\x4b\\x97\\x59\\xba\\xec\\xd2\\x65\\x96\\xae\\x17\\xdc\\x75\\xe7\\xe9\\x32\\x4b\\xf7\\x9c\\x9f\\x98\\xa5\\xcb\\x2c\\x3d\\x3e\\x72\\x8f\\x01\\x3d\\x7f\\x44\\x06\\xf4\\x58\\x7c\\x8f\\x01\\x3d\\x06\\xf4\\x19\\xd0\\xe7\\xb0\\xfd\\x90\\x9f\\x3a\\x6c\\x98\\xa5\\xcf\\x61\\xfb\\x3d\\x36\\x1c\\xb6\\xcf\\x2c\\x7d\\x66\\x19\\xb0\\xf8\\x41\\xe0\\xf6\\x06\\x1c\\x6f\\xc0\\xf1\\x06\\x3e\\xab\\x65\\x5a\\x7d\\x5e\\xdb\\x3e\\xb1\\xed\\xd0\\xdb\\x8e\\xb7\\x91\\xb7\\x5d\\x6f\\x7d\\xe6\\xdb\\x3e\\xf5\\x6d\\x9f\\xfb\\xb6\\xe7\\x3b\\xd4\\xc9\\xf3\\x05\\x9e\\x2f\\xf0\\x7c\\x81\\xe7\\x0b\\x3c\\x5f\\x59\\xc9\\xb2\\x94\\x65\\x2d\\x7d\\x31\\x03\\x5f\\xcd\\xc0\\x97\\x33\\xf0\\xf5\\x0c\\x7c\\x41\\x03\\x5f\\xd1\\xc0\\x97\\x34\\xf0\\x35\\x0d\\x42\\xcf\\x17\\xf6\\x63\\x08\\xc9\\x0e\\x62\\xe8\\x34\\x20\\xe8\\xb4\\x63\\x88\\xc8\\x06\\x31\\x74\\xc9\\x86\\x31\\xf4\\xc8\\x76\\x62\\x38\\x27\\x1b\\xc5\\xd0\\x27\\xdb\\x8d\\x61\\x40\\x96\\xf8\\xa8\\x6b\\x3b\\x44\\x48\\x8c\\x1d\\x52\\x48\\x94\\x1d\\x92\\x48\\x9c\\x11\\x69\\x24\\xd2\\x88\\x44\\x12\\x6b\\x44\\x2a\\x89\\x36\\x22\\x99\\xc4\\x1b\\x45\\xac\\x23\\xea\\xb2\\x8e\\xa8\\xc7\\x3a\\xa2\\x73\\xd6\\x41\\xdd\\xe7\\x00\\x03\\xd6\\x41\\xfd\\x47\\x3a\\xa8\\x01\\x49\\x87\\xeb\\x40\\xd2\\xe1\\x7a\\x90\\x74\\xb8\\x2e\\x24\\x4a\\xea\\x43\\xa7\\xc3\\x75\\x22\\x91\\x52\\x2f\\x3a\\x1d\\xae\\x1b\\x89\\xd6\\xf5\\x23\\xf1\\xfa\\x8e\\x0c\\x7a\\x81\\xb7\\xa1\\xb7\\x1d\\x6f\\x23\\x67\\xc3\\xc8\\x7f\\x45\\x91\\xff\\x8c\\x22\\xff\\x1d\\x45\\x1d\\xbf\\xef\\xfd\\xdc\\x47\\xf0\\x44\\xdf\\x79\\xab\\x05\\x1a\\x4d\\x91\\x5a\\x1a\\xfe\\x32\\xdb\\xa9\\x6f\\x34\\x9e\\x37\\x98\\x81\\x48\\x53\\x37\\xc7\\x54\\xbe\\x54\\x2b\\x34\\x3c\\x1f\\x17\\x88\\x19\\x48\\x8b\\x5a\\xd0\\x05\\xa1\\x76\\xa8\\xe9\\x6e\\x2c\\x27\\x93\\xa3\\x23\\x4c\\x22\\x33\\x91\\x96\\xc4\\x7e\\x86\\xd2\\x60\\x92\\xd9\\xba\\x59\\xad\\xf0\\xfb\\x18\\x92\\x22\\x5b\\xd2\\xe8\\xaa\\xd5\\xe1\\xbb\\xa7\\x00\\xbb\\x91\\xa6\\xe9\\x46\\xd2\\xbc\\xfd\\xd0\\x54\\xb9\\xb9\\x80\\x52\\x67\\x22\\xde\\x92\\x49\\xd4\\x62\\x69\\x0b\\x91\\x02\\xfe\\x8d\\xcb\\xc2\\xcd\\x42\\x95\\x80\\xc8\\xbc\\x72\\x48\\x78\\xe0\\x57\\x1c\\xfe\\x24\\x6a\\xaa\\xd6\\x0d\\x58\\x2d\\x28\\x78\\x19\\xc2\\x58\\xcc\\x4f\\x23\\xd0\\xb5\\x81\\x3b\\xd4\\xfb\\x92\\xcb\\x5d\\x83\\x14\\xf2\\x3f\\x5f\\x7c\\x38\\x24\\x6a\\xc2\\xbd\\xc9\\x5c\\xad\\x54\\x76\\x42\\x43\\xa2\\xc5\\x16\\xe1\\xf2\\xf4\\x74\\xc7\\xff\\x36\\x53\\xcc\\xd6\\x76\\x03\\x1f\\x21\\x78\\xb8\\xa8\\x7a\\x04\\x6a\\xad\\x34\\x5c\\x42\\xaa\\xd6\\xcd\\x35\\xda\\x11\\x3d\\xd6\\xea\\x17\\xd5\\x4a\\x45\\x26\\x50\\x73\\xbb\\x4c\\x5f\\x71\\xdc\\xf3\\x33\\xf7\\xea\\xec\\x01\\x2e\\x19\\x4a\\x9e\\x4f\\x80\\xa9\\x41\\x20\\x80\\xa7\\xf9\\x84\\xb9\\xdd\\xd4\\xea\\x70\\x79\\x2a\\xc5\\xc7\\xf7\\x74\\x2a\\xa7\\x4b\\x05\\x2e\\xf9\\xa9\\xa2\\xf2\\x18\\xe8\\x1f\\x11\\xa8\\xbc\\x69\\xd5\\x4d\\xb1\\x5d\\xa0\\xae\\xd5\\x1b\\x6e\\x7b\\x45\\x84\\x10\\xc3\\x73\\x7e\\xde\\x2b\\xcb\\x3c\\x7f\\x70\\xcf\\x4f\\x24\\xc9\\xa9\\x77\\x8a\\xa9\\xb6\\xe5\\xc9\\x7f\\x87\\xb6\\x8f\\xee\\xce\\x9e\\x6b\\xdc\\xa9\\x1c\\x2e\\xe1\\xe0\\x38\\x7f\\x05\\xe1\\x64\\x11\\x22\\x51\\xba\\x46\\x28\\x09\\x97\\xd0\\xbe\\x00\\x09\\xbf\\xf1\\xd9\\xfc\\x0d\\x36\\x67\\xb6\\xa6\\xca\\x1f\\x2e\\x40\\x7e\\xf8\\x50\\x77\\xa0\\x8a\\x7f\\xcb\\x1a\\x9b\\xe4\\xea\\x72\\xc4\\x09\\xc9\\x11\\xbf\\xd5\\x64\\xbd\\x69\\xd5\\xd4\\x6a\\x99\\xad\\x6b\\x41\\xaf\\xee\\x72\\x5f\\x79\\xa2\\xc5\\x3c\\x4a\\xbb\\x64\\x7f\\x97\\x12\\xef\\x54\\xf7\\x67\\x58\\x0a\\x83\\x70\\x76\\x35\\xbc\\xbe\\x3e\\x8b\\xe1\\xf8\\x70\\x75\\xfb\\x69\\x74\\x16\\x1f\\x0e\\x29\\x33\\x63\\xe9\\xe7\\x2b\\x97\\xf8\\x24\\x6e\\xa7\\xde\\xdc\\x89\\xb4\\xc0\\xdb\\x84\\xeb\\x7d\\x70\\x97\\xff\\xc5\\xd7\\xde\\xd1\\x2b\\x6f\\x2e\\xe0\\xfc\\x6c\\x2d\\x8c\\x6b\\x87\\x17\\x80\\xf6\\xbb\\x00\\xab\\xde\\xf2\\x0f\\x9e\\xa7\\xe1\\x39\\xc4\\x31\\xbd\\x85\\x0a\\x4f\\x50\\x2f\\x30\\x32\\xcb\\x0b\\x7b\\xc0\\x6c\\x71\\xab\\xf4\\xbe\\x69\\xe8\\x87\\x4f\\xcd\\xe7\\xa4\\x71\\x48\\xce\\x07\\x7f\\xee\\x17\\x14\\xc7\\x5e\\xcf\\x8a\\x34\\x7d\\xbe\\xc7\\x73\\xe4\\x9d\\x4d\\x95\\x73\\x4e\\xe6\\xbe\\x77\\x4e\\x3e\\x02\\xd7\\x02\\xec\\xe7\\xa3\\x2d\\x34\\x8a\\x6f\\x17\\xc7\\x8a\\x7e\\x1a\\x5d\\x8f\\xfe\\x18\\xce\\x46\\xcf\\x2a\\x3b\\x9d\\x0d\\x67\\xe3\\x2b\\x7e\\xf5\\xe3\\xda\\x86\\xbf\\x54\\xdb\\xd7\\x9d\\x70\\x3c\\x87\\x3b\\x06\\xbc\\x6a\\xc1\\xb7\\x5b\\xe0\\x97\\x7b\\xe0\\x97\\x9a\\xe0\\x58\\xd0\\x7f\\xa2\\xa2\\xff\\xbf\\xa4\\xff\\x74\\x4d\\x27\\xa3\\xd9\\xfd\\xe4\\xe6\\xa4\\x74\\xf4\\xe7\\xca\\x4f\\x7c\\x33\\xde\\xf5\\xed\\xba\\x05\\xaf\\xdc\\x79\\x7c\\xf9\\x2b\\xee\\x8d\\xc6\\x57\\x85\\x6d\\xb8\\xd0\\x1f\\x4a\\xd6\\x77\\xf4\\x4e\\x67\\xb7\\x77\\xc7\\xde\\xbb\\x1f\\x5f\\x8d\\x0f\\x43\\xe5\\x47\\x31\\xda\\x0d\\x68\\xbf\\xc3\\xfa\\xef\\xfb\\x2f\\x77\\x9f\\x46\\xd3\\x99\\x67\\x2a\\x33\\x9b\\x2f\\x0f\\x9f\\xe9\\x1a\\xed\\xdd\\x55\\xed\\x64\\x06\\xca\\xa4\\x9c\\x7f\\xd2\\xdc\\x51\\x9a\\xcb\\xe9\\x77\\x40\\xa7\\x98\\x1d\\xe0\\xcf\\x6e\\x0e\\xf8\\x08\\xed\\xbf\\xbb\\x78\\xe4\\x3a\\x0e\\xf7\\x97\\x05\\xf3\\x37\\x98\\x23\\x3e\\xd6\\xf5\\xd9\\x45\\x7a\\x3c\\xdd\\xf3\\x3b\\x88\\xf1\\xd5\\xca\\x53\\xf5\\xa9\\xfa\\xbf\\x00\\x00\\x00\\xff\\xff\\x51\\x4b\\xdc\\x7e\\x62\\x10\\x00\\x00\")\n\nfunc evmdis_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_evmdis_tracerJs,\n\t\t\"evmdis_tracer.js\",\n\t)\n}\n\nfunc evmdis_tracerJs() (*asset, error) {\n\tbytes, err := evmdis_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"evmdis_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0xe8, 0x96, 0xa1, 0x8b, 0xc, 0x68, 0x3c, 0xe8, 0x5d, 0x7e, 0xf0, 0xab, 0xfe, 0xec, 0xd1, 0xb, 0x3d, 0xfc, 0xc7, 0xac, 0xb5, 0xa, 0x41, 0x55, 0x0, 0x3a, 0x60, 0xa7, 0x8e, 0x46, 0x93}}\n\treturn a, nil\n}\n\nvar _noop_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x8c\\x93\\x4f\\x6f\\xdb\\x46\\x10\\xc5\\xcf\\xe6\\xa7\\x78\\xc7\\x04\\x50\\xc5\\xfe\\x39\\x14\\x70\\x8a\\x02\\xac\\x61\\x27\\x2a\\x1c\\xdb\\x90\\xe8\\x06\\x3e\\x0e\\xc9\\xa1\\xb8\\xe9\\x6a\\x87\\x9d\\x9d\\x95\\x22\\x18\\xfe\\xee\\xc5\\x92\\x12\\x12\\x14\\x69\\x9b\\x9b\\xb0\\xd2\\xfb\\xbd\\x37\\xf3\\x46\\x65\\x89\\x2b\\x19\\x8f\\xea\\xb6\\x83\\xe1\\xc7\\xef\\x7f\\xf8\\x19\\xf5\\xc0\\xd8\\xca\\x77\\x6c\\x03\\x2b\\xa7\\x1d\\xaa\\x64\\x83\\x68\\x2c\\xca\\x12\\xf5\\xe0\\x22\\x7a\\xe7\\x19\\x2e\\x62\\x24\\x35\\x48\\x0f\\xfb\\xc7\\xef\\xbd\\x6b\\x94\\xf4\\xb8\\x2c\\xca\\x72\\xd6\\x7c\\xf5\\xeb\\x4c\\xe8\\x95\\x19\\x51\\x7a\\x3b\\x90\\xf2\\x25\\x8e\\x92\\xd0\\x52\\x80\\x72\\xe7\\xa2\\xa9\\x6b\\x92\\x31\\x9c\\x81\\x42\\x57\\x8a\\x62\\x27\\x9d\\xeb\\x8f\\x19\\xe9\\x0c\\x29\\x74\\xac\\x93\\xb5\\xb1\\xee\\xe2\\x39\\xc7\\xdb\\xbb\\x47\\xdc\\x72\\x8c\\xac\\x78\\xcb\\x81\\x95\\x3c\\x1e\\x52\\xe3\\x5d\\x8b\\x5b\\xd7\\x72\\x88\\x0c\\x8a\\x18\\xf3\\x4b\\x1c\\xb8\\x43\\x33\\xe1\\xb2\\xf0\\x26\\x47\\xd9\\x9c\\xa2\\xe0\\x46\\x52\\xe8\\xc8\\x9c\\x84\\x05\\xd8\\xe5\\xe4\\xd8\\xb3\\x46\\x27\\x01\\x3f\\x9d\\xad\\x4e\\xc0\\x05\\x44\\x33\\xe4\\x15\\x59\\x1e\\x40\\x21\\x63\\xd6\\xbd\\x06\\x85\\x23\\x3c\\xd9\\x67\\xe9\\x37\\x2c\\xe4\\xf3\\xdc\\x1d\\x5c\\x98\\x6c\\x06\\x19\\x19\\x36\\x90\\xe5\\xa9\\x0f\\xce\\x7b\\x34\\x8c\\x14\\xb9\\x4f\\x7e\\x91\\x69\\x4d\\x32\\x7c\\x58\\xd5\\xef\\xee\\x1f\\x6b\\x54\\x77\\x4f\\xf8\\x50\\xad\\xd7\\xd5\\x5d\\xfd\\xf4\\x06\\x07\\x67\\x83\\x24\\x03\\xef\\x79\\x46\\xb9\\xdd\\xe8\\x1d\\x77\\x38\\x90\\x2a\\x05\\x3b\\x42\\xfa\\x4c\\x78\\x7f\\xbd\\xbe\\x7a\\x57\\xdd\\xd5\\xd5\\x6f\\xab\\xdb\\x55\\xfd\\x04\\x51\\xdc\\xac\\xea\\xbb\\xeb\\xcd\\x06\\x37\\xf7\\x6b\\x54\\x78\\xa8\\xd6\\xf5\\xea\\xea\\xf1\\xb6\\x5a\\xe3\\xe1\\x71\\xfd\\x70\\xbf\\xb9\\x5e\\x62\\xc3\\x39\\x15\\x67\\xfd\\xff\\xef\\xbc\\x9f\\xda\\x53\\x46\\xc7\\x46\\xce\\xc7\\xf3\\x26\\x9e\\x24\\x21\\x0e\\x92\\x7c\\x87\\x81\\xf6\\x0c\\xe5\\x96\\xdd\\x9e\\x3b\\x10\\x5a\\x19\\x8f\\xdf\\x5c\\x6a\\x66\\x91\\x97\\xb0\\x9d\\x66\\xfe\\xd7\\x83\\xc4\\xaa\\x47\\x10\\x5b\\x20\\x32\\xe3\\x97\\xc1\\x6c\\xbc\\x2c\\xcb\\xc3\\xe1\\xb0\\xdc\\x86\\xb4\\x14\\xdd\\x96\\x7e\\xc6\\xc5\\xf2\\xd7\\x65\\x91\\x99\\x41\\x64\\xac\\x95\\x5a\\xd6\\x5c\\xce\\xc7\\x14\\x6d\\x62\\x37\\xa4\\xdc\\x48\\x60\\x34\\xe2\\x3c\\xeb\\x98\\x5b\\x46\\x2b\\x5d\\x1e\\xe0\\xaf\\xe4\\x94\\x3b\\xf4\\x2a\\x3b\\x10\\x7e\\xa7\\x3d\\x6d\\x5a\\x75\\xa3\\x65\\x9c\\x34\\x1f\\xb9\\x35\\x98\\xcc\\x15\\x52\\xe3\\xa7\\x73\\x24\\x98\\x52\\x88\\xd4\\xe6\\xbb\\xc9\\x9f\\x5b\\xd6\\x65\\xf1\\x5c\\x5c\\x94\\x25\\xa2\\xf1\\x98\\xbd\\x5d\\xd8\\xcb\\x9f\\x99\\x2b\\x9a\\xfb\\xd4\\x23\\x64\\x9c\\x1c\\xa7\\xcb\\xc8\\xa1\\xfe\\x78\\x0f\\xfe\\xc4\\x6d\\x32\\x8e\\xcb\\xe2\\x22\\xeb\\x2e\\xd1\\xa7\\x30\\x41\\x5f\\x79\\xd9\\x2e\\xd0\\x35\\xaf\\xf1\\x8c\\x97\\x45\\x31\\x91\\x7b\\x4a\\xde\\xbe\\x44\\x1f\\x86\\xd3\\x99\\x50\\x6b\\x89\\xfc\\x89\\x96\\x23\\x49\\x0f\\x0a\\x67\\xc3\\x7e\\x2e\\xf0\\x62\\xd2\\xff\\xb7\\x85\\x72\\xfc\\x9a\\x07\\x79\\x3f\\xf9\\xcc\\xc0\\x38\\x57\\xdf\\x30\\x07\\x38\\x63\\xa5\\x7c\\xfb\\xb2\\x67\\xcd\\x7f\\x7b\\x28\\x5b\\xd2\\x10\\x27\\x5c\\xd6\\xf4\\x2e\\x90\\x3f\\x83\\x4f\\xe7\\x91\\x37\\xe6\\xc2\\x76\\x59\\x5c\\xcc\\xef\\x5f\\x84\\x6a\\xed\\xd3\\x39\\xd4\\x4c\\xc2\\xf3\\xcb\\x1b\\xbc\\x14\\x2f\\xc5\\xdf\\x01\\x00\\x00\\xff\\xff\\x77\\x56\\xe7\\x1a\\xf7\\x04\\x00\\x00\")\n\nfunc noop_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_noop_tracerJs,\n\t\t\"noop_tracer.js\",\n\t)\n}\n\nfunc noop_tracerJs() (*asset, error) {\n\tbytes, err := noop_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"noop_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe3, 0xf, 0x1c, 0x6f, 0x65, 0xaf, 0x90, 0x31, 0xab, 0xf, 0xe0, 0xca, 0x54, 0x7, 0xfd, 0xd3, 0xa1, 0x4a, 0x14, 0x1, 0x2a, 0x9d, 0xdc, 0xb9, 0x64, 0x69, 0x83, 0x30, 0xb1, 0x2a, 0xbd, 0xfb}}\n\treturn a, nil\n}\n\nvar _opcount_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x8c\\x94\\xcf\\x6e\\xdb\\x46\\x10\\x87\\xcf\\xe2\\x53\\xfc\\x8e\\x09\\xa2\\x92\\x69\\x7b\\x28\\xe0\\x16\\x05\\x58\\xc3\\x4e\\x04\\xd8\\xb2\\x21\\xd1\\x09\\x7c\\x5c\\x92\\x43\\x71\\x9b\\xd5\\x2e\\x31\\x3b\\x2b\\x86\\x08\\xfc\\xee\\xc5\\x2e\\xc5\\xc6\\x08\\x5c\\xd4\\xd7\\xd5\\xcc\\xf7\\xcd\\x3f\\xb1\\x28\\x70\\xe9\\x86\\x89\\xf5\\xa1\\x17\\xfc\\xf2\\xfe\\xe7\\xdf\\x50\\xf5\\x84\\x83\\xfb\\x89\\xa4\\x27\\xa6\\x70\\x44\\x19\\xa4\\x77\\xec\\xb3\\xa2\\x40\\xd5\\x6b\\x8f\\x4e\\x1b\\x82\\xf6\\x18\\x14\\x0b\\x5c\\x07\\xf9\\x21\\xde\\xe8\\x9a\\x15\\x4f\\x79\\x56\\x14\\x73\\xce\\x8b\\x3f\\x47\\x42\\xc7\\x44\\xf0\\xae\\x93\\x51\\x31\\x5d\\x60\\x72\\x01\\x8d\\xb2\\x60\\x6a\\xb5\\x17\\xd6\\x75\\x10\\x82\\x16\\x28\\xdb\\x16\\x8e\\x71\\x74\\xad\\xee\\xa6\\x88\\xd4\\x82\\x60\\x5b\\xe2\\xa4\\x16\\xe2\\xa3\\x5f\\xea\\xf8\\xb0\\x7d\\xc0\\x0d\\x79\\x4f\\x8c\\x0f\\x64\\x89\\x95\\xc1\\x7d\\xa8\\x8d\\x6e\\x70\\xa3\\x1b\\xb2\\x9e\\xa0\\x3c\\x86\\xf8\\xe2\\x7b\\x6a\\x51\\x27\\x5c\\x4c\\xbc\\x8e\\xa5\\xec\\xcf\\xa5\\xe0\\xda\\x05\\xdb\\x2a\\xd1\\xce\\xae\\x41\\x3a\\x56\\x8e\\x13\\xb1\\xd7\\xce\\xe2\\xd7\\x45\\x75\\x06\\xae\\xe1\\x38\\x42\\xde\\x28\\x89\\x0d\\x30\\xdc\\x10\\xf3\\xde\\x42\\xd9\\x09\\x46\\xc9\\xf7\\xd4\\x57\\x0c\\xe4\\x7b\\xdf\\x2d\\xb4\\x4d\\x9a\\xde\\x0d\\x04\\xe9\\x95\\xc4\\xae\\x47\\x6d\\x0c\\x6a\\x42\\xf0\\xd4\\x05\\xb3\\x8e\\xb4\\x3a\\x08\\x3e\\x6f\\xaa\\x8f\\x77\\x0f\\x15\\xca\\xed\\x23\\x3e\\x97\\xbb\\x5d\\xb9\\xad\\x1e\\x7f\\xc7\\xa8\\xa5\\x77\\x41\\x40\\x27\\x9a\\x51\\xfa\\x38\\x18\\x4d\\x2d\\x46\\xc5\\xac\\xac\\x4c\\x70\\x5d\\x24\\xdc\\x5e\\xed\\x2e\\x3f\\x96\\xdb\\xaa\\xfc\\x6b\\x73\\xb3\\xa9\\x1e\\xe1\\x18\\xd7\\x9b\\x6a\\x7b\\xb5\\xdf\\xe3\\xfa\\x6e\\x87\\x12\\xf7\\xe5\\xae\\xda\\x5c\\x3e\\xdc\\x94\\x3b\\xdc\\x3f\\xec\\xee\\xef\\xf6\\x57\\x39\\xf6\\x14\\xab\\xa2\\x98\\xff\\xff\\x33\\xef\\xd2\\xf6\\x98\\xd0\\x92\\x28\\x6d\\xfc\\x32\\x89\\x47\\x17\\xe0\\x7b\\x17\\x4c\\x8b\\x5e\\x9d\\x08\\x4c\\x0d\\xe9\\x13\\xb5\\x50\\x68\\xdc\\x30\\xbd\\x7a\\xa9\\x91\\xa5\\x8c\\xb3\\x87\\xd4\\xf3\\x7f\\x1e\\x24\\x36\\x1d\\xac\\x93\\x35\\x3c\\x11\\xfe\\xe8\\x45\\x86\\x8b\\xa2\\x18\\xc7\\x31\\x3f\\xd8\\x90\\x3b\\x3e\\x14\\x66\\xc6\\xf9\\xe2\\xcf\\x3c\\x8b\\x4c\\x37\\x34\\x2e\\x58\\xa9\\x58\\x35\\xc4\\x71\\x3f\\x0a\\x5e\\x1d\\x07\\x43\\x90\\xf9\\x29\\xed\\xe5\\xef\\xe0\\x05\\x29\\xd0\\x27\\xb5\\x0d\\xc7\\x9a\\x38\\x16\\xaf\\xad\\x17\\x0e\\x4d\\xbc\\x87\\xf4\\xf7\\xa1\\xaf\\xd4\\xa4\\xdd\\xd6\\x53\\x8a\\xbc\\xfa\\x74\\x8b\\x9a\\xba\\x38\\x99\\x74\\xc9\\xac\\xac\\x57\\x29\\x3c\\x5d\\xb5\\xb6\\x4a\\xa8\\xcd\\xb3\\x6f\\xd9\\xaa\\x28\\x66\\x43\\x12\\x7f\\xf9\\xd1\\x13\\x39\\xcf\\x5d\\xff\\x8a\\xf2\\x6c\\x95\\xd2\\x2e\\xf0\\x7e\\x9d\\x25\\x8a\\x17\\x1a\\x62\\x27\\xda\\x9e\\xdc\\x17\\x6a\\xd3\\x6a\\xe8\\x44\\x3c\\xa5\\x66\\xdb\\xf3\\xa9\\x45\\xfc\\xa7\\xdb\\x05\\xe3\\xf3\\x6c\\x15\\xf3\\x2e\\xd0\\x05\\x9b\\x0c\\x6f\\x8c\\x3b\\xac\\xd1\\xd6\\x6f\\xf1\\x0d\\xd2\\x6b\\x9f\\x27\\xcb\\xbb\\x77\\x78\\x3a\\x6b\\x3a\\x15\\x8c\\x3c\\xf7\\x8c\\xfd\\xf9\\x08\\x55\\x23\\x41\\x99\\x33\\x3a\\x76\\xea\\x3a\\x28\\xbb\\xd8\\xbb\\xf9\\x3c\\x56\\x29\\xff\\x65\\xdf\\xa2\\x60\\xf2\\x2f\\x39\\x94\\x31\\xc9\\x33\\x03\\xfd\\x7c\\x58\\x35\\x91\\x85\\x16\\xe2\\x38\\x50\\xb8\\x13\\x71\\xfc\\xa8\\x80\\x49\\x02\\x5b\\x9f\\x70\\x31\\xa7\\xd3\\x56\\x99\\x05\\x7c\\x3e\\xbe\\x38\\x70\\x6d\\x0f\\x79\\xb6\\x9a\\xdf\\x9f\\x15\\xd5\\xc8\\xd7\\xa5\\xa8\\x99\\xf4\\x6c\\x16\\x78\\xca\\x9e\\xb2\\x7f\\x02\\x00\\x00\\xff\\xff\\xdd\\xd8\\xa1\\x0a\\x5c\\x05\\x00\\x00\")\n\nfunc opcount_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_opcount_tracerJs,\n\t\t\"opcount_tracer.js\",\n\t)\n}\n\nfunc opcount_tracerJs() (*asset, error) {\n\tbytes, err := opcount_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"opcount_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0x27, 0xe, 0x97, 0x88, 0x9b, 0x53, 0xbb, 0x20, 0x44, 0xd8, 0xf5, 0xeb, 0x41, 0xd2, 0x7e, 0xd6, 0xda, 0x6b, 0xf5, 0xaf, 0x0, 0x75, 0x9f, 0xd9, 0x22, 0xc, 0x6e, 0x74, 0xac, 0x2a, 0xa9, 0xa7}}\n\treturn a, nil\n}\n\nvar _prestate_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xa4\\x57\\xdd\\x6f\\x1b\\xb9\\x11\\x7f\\xde\\xfd\\x2b\\xa6\\x7e\\x91\\x84\\x53\\x56\\xce\\x15\\xb8\\x02\\x72\\x5d\\x60\\xa3\\x28\\x89\\x00\\x9d\\x6d\\x48\\x4a\\x5d\\xf7\\x70\\x0f\\x5c\\x72\\x76\\xc5\\x13\\x45\\x2e\\x48\\xae\\x3e\\x10\\xf8\\x7f\\x2f\\x86\\xfb\\x21\\xcb\\x67\\x27\\x6e\\xeb\\x27\\x2f\\x39\\xfc\\xcd\\xf7\\x6f\\x46\\xa3\\x11\\x4c\\x4c\\x79\\xb4\\xb2\\x58\\x7b\\xf8\\xf9\\xf2\\xfd\\xdf\\x60\\xb5\\x46\\x28\\xcc\\x3b\\xf4\\x6b\\xb4\\x58\\x6d\\x21\\xad\\xfc\\xda\\x58\\x17\\x8f\\x46\\xb0\\x5a\\x4b\\x07\\xb9\\x54\\x08\\xd2\\x41\\xc9\\xac\\x07\\x93\\x83\\x7f\\x26\\xaf\\x64\\x66\\x99\\x3d\\x26\\xf1\\x68\\x54\\xbf\\x79\\xf1\\x9a\\x10\\x72\\x8b\\x08\\xce\\xe4\\x7e\\xcf\\x2c\\x8e\\xe1\\x68\\x2a\\xe0\\x4c\\x83\\x45\\x21\\x9d\\xb7\\x32\\xab\\x3c\\x82\\xf4\\xc0\\xb4\\x18\\x19\\x0b\\x5b\\x23\\x64\\x7e\\x24\\x48\\xe9\\xa1\\xd2\\x02\\x6d\\x50\\xed\\xd1\\x6e\\x5d\\x6b\\xc7\\xe7\\x9b\\xaf\\x30\\x47\\xe7\\xd0\\xc2\\x67\\xd4\\x68\\x99\\x82\\xbb\\x2a\\x53\\x92\\xc3\\x5c\\x72\\xd4\\x0e\\x81\\x39\\x28\\xe9\\xc4\\xad\\x51\\x40\\x16\\xe0\\xe8\\xe1\\x27\\x32\\x65\\xd9\\x98\\x02\\x9f\\x4c\\xa5\\x05\\xf3\\xd2\\xe8\\x21\\xa0\\x24\\xcb\\x61\\x87\\xd6\\x49\\xa3\\xe1\\xaf\\xad\\xaa\\x06\\x70\\x08\\xc6\\x12\\x48\\x9f\\x79\\x72\\xc0\\x82\\x29\\xe9\\xdd\\x00\\x98\\x3e\\x82\\x62\\xfe\\xf4\\xf4\\x0d\\x01\\x39\\xf9\\x2d\\x40\\xea\\xa0\\x66\\x6d\\x4a\\x04\\xbf\\x66\\x9e\\xbc\\xde\\x4b\\xa5\\x20\\x43\\xa8\\x1c\\xe6\\x95\\x1a\\x12\\x5a\\x56\\x79\\xb8\\x9f\\xad\\xbe\\xdc\\x7e\\x5d\\x41\\x7a\\xf3\\x00\\xf7\\xe9\\x62\\x91\\xde\\xac\\x1e\\xae\\x60\\x2f\\xfd\\xda\\x54\\x1e\\x70\\x87\\x35\\x94\\xdc\\x96\\x4a\\xa2\\x80\\x3d\\xb3\\x96\\x69\\x7f\\x04\\x93\\x13\\xc2\\xaf\\xd3\\xc5\\xe4\\x4b\\x7a\\xb3\\x4a\\x3f\\xcc\\xe6\\xb3\\xd5\\x03\\x18\\x0b\\x9f\\x66\\xab\\x9b\\xe9\\x72\\x09\\x9f\\x6e\\x17\\x90\\xc2\\x5d\\xba\\x58\\xcd\\x26\\x5f\\xe7\\xe9\\x02\\xee\\xbe\\x2e\\xee\\x6e\\x97\\xd3\\x04\\x96\\x48\\x56\\x21\\xbd\\xff\\x71\\xcc\\xf3\\x90\\x3d\\x8b\\x20\\xd0\\x33\\xa9\\x5c\\x1b\\x89\\x07\\x53\\x81\\x5b\\x9b\\x4a\\x09\\x58\\xb3\\x1d\\x82\\x45\\x8e\\x72\\x87\\x02\\x18\\x70\\x53\\x1e\\xdf\\x9c\\x54\\xc2\\x62\\xca\\xe8\\x22\\xf8\\xfc\\x6a\\x41\\xc2\\x2c\\x07\\x6d\\xfc\\x10\\x1c\\x22\\xfc\\x7d\\xed\\x7d\\x39\\x1e\\x8d\\xf6\\xfb\\x7d\\x52\\xe8\\x2a\\x31\\xb6\\x18\\xa9\\x1a\\xce\\x8d\\xfe\\x91\\xc4\\x84\\x59\\x5a\\x74\\x9e\\x79\\x5c\\x59\\xc6\\xd1\\x82\\xa9\\x7c\\x59\\x79\\x07\\xae\\xca\\x73\\xc9\\x25\\x6a\\x0f\\x52\\xe7\\xc6\\x6e\\x43\\xa5\\x80\\x37\\xc0\\x2d\\x32\\x8f\\xc0\\x40\\x19\\xce\\x14\\xe0\\x01\\x79\\x15\\xee\\xea\\x48\\x87\\x72\\xb5\\x4c\\x3b\\xc6\\xc3\\x69\\x6e\\xcd\\x96\\x7c\\xad\\x9c\\xa7\\x7f\\x9c\\xc3\\x6d\\xa6\\x50\\x40\\x81\\x1a\\x9d\\x74\\x90\\x29\\xc3\\x37\\x49\\xfc\\x2d\\x8e\\x9e\\x18\\x43\\x75\\x12\\x3c\\x6c\\x84\\x42\\x6d\\xec\\xb1\\x67\\x11\\xb2\\x4a\\x2a\\x21\\x75\\x91\\xc4\\x51\\x2b\\x3d\\x06\\x5d\\x29\\x35\\x8c\\x03\\x84\\x32\\x66\\x53\\x95\\x29\\xe7\\xa6\\x0a\\xb6\\xff\\x81\\xdc\\xd7\\x60\\xae\\x44\\x2e\\x73\\x2a\\x0e\\xd6\\xdd\\x7a\\x13\\xae\\x3a\\xbd\\x26\\x23\\xf9\\x24\\x8e\\xce\\x60\\xc6\\x90\\x57\\x3a\\xb8\\xd3\\x67\\x42\\xd8\\x21\\x88\\x6c\\xf0\\x2d\\x8e\\xa2\\x1d\\xb3\\x84\\x05\\xd7\\xe0\\xcd\\x17\\x3c\\x84\\xcb\\xc1\\x55\\x1c\\x45\\x32\\x87\\xbe\\x5f\\x4b\\x97\\xb4\\xc0\\xbf\\x31\\xce\\x7f\\x87\\xeb\\xeb\\xeb\\xd0\\xd4\\xb9\\xd4\\x28\\x06\\x40\\x10\\xd1\\x4b\\x62\\xf5\\x4d\\x94\\x31\\xc5\\x34\\xc7\\x31\\xf4\\x2e\\x0f\\x3d\\xf8\\x09\\x44\\x96\\x14\\xe8\\x3f\\xd4\\xa7\\xb5\\xb2\\xc4\\x9b\\xa5\\xb7\\x52\\x17\\xfd\\xf7\\xbf\\x0c\\x86\\xe1\\x95\\x36\\xe1\\x0d\\x34\\xe2\\x37\\xa6\\x13\\xae\\xef\\xb9\\x11\\xe1\\xba\\xb1\\xb9\\x96\\x9a\\x18\\xd1\\x08\\x35\\x52\\xce\\x1b\\xcb\\x0a\\x1c\\xc3\\xb7\\x47\\xfa\\x7e\\x24\\xaf\\x1e\\xe3\\xe8\\xf1\\x2c\\xca\\xcb\\x5a\\xe8\\x95\\x28\\x37\\x10\\x80\\xda\\xdb\\xae\\xce\\x0b\\x49\\x9d\\xfa\\x34\\x01\\x01\\xef\\x7b\\x49\\x58\\xb6\\xa6\\x3c\\x4b\\xc2\\x06\\x8f\\x3f\\xce\\x04\\x5d\\x48\\x71\\xe8\\x2e\\x36\\x78\\x1c\\x5c\\xc5\\xaf\\xa6\\x28\\x69\\x8c\\xfe\\x4d\\x8a\\xc3\\xcb\\xf9\\x22\\xc0\\x1d\\x53\\x1d\\x60\\x1d\\xbf\\x25\\x21\\x9c\\xec\\x1a\\x04\\xdd\\x41\\x07\\xc9\\xfe\\xe5\\x1a\\x2e\\x2e\\x0f\\x97\\xff\\xe7\\xdf\\x45\\x63\\xc1\\x0b\\x25\\xf3\\xcc\\xec\\x37\\x98\\xf6\\x78\\x9e\\x4f\\x8b\\xae\\x52\\x9e\\xda\\x4e\\xea\\x9d\\xd9\\x10\\x81\\xae\\x29\\x4f\\x4a\\x85\\xd4\\x98\\x92\\xaa\\xc6\\xd5\\x0c\\x96\\x21\\x6a\\x90\\x1e\\x2d\\x23\\x0a\\x37\\x3b\\xb4\\x34\\xbd\\xc0\\xa2\\xaf\\xac\\x76\\x5d\\x3a\\x73\\xa9\\x99\\x6a\\x81\\x9b\\xec\\x7b\\xcb\\x78\\xdd\\xbb\\xf5\\xf9\\x93\\x9c\\x72\\x7f\\x08\\xd9\\x0c\\x3e\\x8e\\x46\\x90\\x7a\\x20\\x3f\\xa1\\x34\\x52\\xfb\\x21\\xec\\x11\\x34\\xa2\\x20\\x02\\x12\\x28\\x2a\\xee\\x03\\x5e\\x6f\\xc7\\x54\\x85\\xbd\\x9a\\x64\\x88\\xaa\\xc3\\x53\\x53\\xd1\\x44\\x7a\\x42\\x42\\xc3\\x60\\xe0\\xd6\\xec\\xc2\\xa8\\xcd\\x18\\xdf\\x40\\xd3\\xf8\\xc6\\xca\\x42\\xea\\xb8\\x89\\xe9\\x59\\xd3\\x93\\x45\\x09\\x01\\x07\\xb3\\x42\\xcd\\x50\\xee\\xe9\\xe4\\x43\\xc8\\x7f\\x26\\x8b\\x99\\xf6\\xcf\\x8a\\xa8\\x8e\\x7c\\xfb\\x74\\xf0\\x7b\\xd2\\x34\\x71\\xe2\\x88\\x78\\xfb\\x3f\\x0f\\x86\\xf0\\xfe\\x97\\xae\\x32\\xbd\\x21\\x28\\xf8\\x31\\x98\\x37\\xaf\\x43\\xc5\\xcf\\x2b\\xe2\\xe5\\x67\\x41\\x0d\\x31\\xc9\\x4f\\x41\\x6b\\xe2\\xaa\\x8c\\xd2\\x51\\xfb\\x19\\xe2\\x78\\xce\\x26\\x57\\xdf\\xc1\\x3d\\xf7\\xad\\xc5\\x6d\\x42\\x93\\x30\\x21\\x5e\\x07\\xad\\x53\\xf4\\x11\\xb9\\xc5\\x2d\\x4d\\x17\\xca\\x02\\x67\\x4a\\xa1\\xed\\x39\\x08\\xdc\\x35\\x6c\\xca\\x29\\xe4\\x0b\\xb7\\xa5\\x3f\\xb6\\x33\\xc7\\x33\\x5b\\xa0\\x77\\x3f\\x36\\x2c\\xe0\\xbc\\x7b\\xd7\\x52\\x71\\x08\\xc5\\xb1\\x44\\xb8\\xbe\\x86\\xde\\x64\\x31\\x4d\\x57\\xd3\\x5e\\xd3\\x4c\\xa3\\x11\\xdc\\x63\\xd8\\xc8\\x32\\x25\\x33\\xa1\\x8e\\x20\\x50\\xa1\\xc7\\xda\\x2e\\xa3\\x43\\x88\\x3a\\x6a\\x1a\\xd2\\x6a\\x45\\x4b\\x0f\\x1e\\xa4\\xf3\\x52\\x17\\x50\\x33\\xd6\\x9e\\xe6\\x7b\\x03\\x17\\x7a\\x84\\xb3\\xca\\x51\\xb5\\x3e\\x1b\\x86\\xde\\xd0\\x66\\x63\\x91\\xf8\\x8d\\xe6\\x50\\x68\\x37\\xa6\\x64\\xb7\\x09\\xe5\\xd2\\x3a\\x0f\\xa5\\x62\\x1c\\x13\\xc2\\xeb\\x8c\\x79\\x3d\\xbf\\x0d\\x33\\x93\\xea\\x45\\x68\\xc1\\x00\\x74\\x1a\\xb4\\x4c\\xd1\\xa0\\x26\\xf5\\x0e\\xfa\\x2d\\xc6\\x20\\x8e\\x22\\xdb\\x4a\\x3f\\xc1\\xbe\\x3a\\x51\\x82\\xf3\\x58\\x3e\\x25\\x04\\x5a\\x70\\x70\\x87\\x44\\xe5\\x81\\x0d\\xea\\xa1\\x4c\\xba\\xfe\\xf9\\x6b\\xb3\\x05\\xa0\\x4b\\xe2\\x88\\xde\\x3d\\xe9\\x6b\\x65\\x8a\\xf3\\xbe\\x16\\x75\\x58\\x78\\x65\\x2d\\xe5\\xbf\\x1b\\x05\\x39\\xf5\\xf8\\x1f\\x95\\xf3\\x14\\x53\\x4b\\xe1\\x69\\xd8\\xe2\\x25\\xb2\\x0e\\xd4\\x4c\\x53\\x7f\\xf0\\xe7\\x21\\x4a\\xf3\\x33\\xcc\\x2b\\x52\\xd7\\x4c\\xcb\\x7a\\xab\\x2c\\x8d\\x47\\xed\\x25\\x53\\xea\\x48\\x79\\xd8\\x5b\\x5a\\xa7\\x68\\x81\\x1a\\x82\\x93\\x24\\x15\\x18\\x27\\x88\\x4a\\xcd\\x55\\x25\\xea\\x32\\x08\\x75\\xdc\\xe0\\xb9\\x60\\xf3\\xf9\\x1e\\xb6\\x45\\xe7\\x58\\x81\\x09\\x55\\x52\\x2e\\x0f\\xcd\\x26\\xab\\xa1\\x57\\x93\\x5c\\x7f\\xd0\\x4b\\x3a\\x23\\xcf\\x29\\x46\\x99\\x22\\x69\\x8b\\x8c\\xb8\\x3a\\x15\\xc2\\xa2\\x73\\xfd\\x41\\xc3\\x39\\x5d\\x66\\xef\\xd7\\xa8\\x29\\xf8\\xa0\\x71\\x0f\\xdd\\x8a\\xc4\\x38\\xa7\\x95\\x51\\x0c\\x81\\x09\\x41\\xd4\\xf6\\x6c\\x9d\\x89\\xa3\\xc8\\xed\\xa5\\xe7\\x6b\\x08\\x9a\\x4c\\x79\\xea\\xc5\\x41\\x53\\xff\\x9c\\x39\\x84\\x8b\\xe9\\xbf\\x56\\x93\\xdb\\x8f\\xd3\\xc9\\xed\\xdd\\xc3\\xc5\\x18\\xce\\xce\\x96\\xb3\\x7f\\x4f\\xbb\\xb3\\x0f\\xe9\\x3c\\xbd\\x99\\x4c\\x2f\\xc6\\xa7\\x39\\x74\\xee\\x90\\x37\\xad\\x0b\\xa4\\xd0\\x79\\xc6\\x37\\x49\\x89\\xb8\\xe9\\x5f\\x9e\\xf3\\xc0\\xc9\\xc1\\x28\\xca\\x2c\\xb2\\xcd\\xd5\\xc9\\x98\\xba\\x41\\x1b\\x1d\\x2d\\xe5\\xc2\\x35\\xbc\\x1a\\xac\\xab\\xd7\\xad\\x99\\x34\\xf2\\xfd\\x96\\xc8\\x4f\\x2b\\x51\\xa0\\x8a\\xef\\xda\\x91\\xce\\xe7\\x9d\\xe7\\xf4\\x41\\xe1\\xe8\\x0e\\x3e\\x4e\\xe7\\xd3\\xcf\\xe9\\x6a\\x7a\\x26\\xb5\\x5c\\xa5\\xab\\xd9\\xa4\\x3e\\xfa\\xaf\\x43\\xf4\\xfe\\xcd\\x21\\xea\\x2d\\x97\\xab\\xdb\\xc5\\xb4\\x37\\x6e\\xbe\\xe6\\xb7\\xe9\\xc7\\xde\\x9f\\x14\\x36\\x7b\\xd3\\xf7\\x8a\\xcc\\x9b\\x7b\\x63\\xc5\\xff\\x92\\xab\\x27\\xbb\\x43\\xce\\x5e\\x5a\\x1d\\x02\\x09\\x71\\x5f\\x3d\\xfb\\x89\\x00\\x4c\\xb7\\xfc\\x91\\xd7\\x3f\\x93\\xa2\\xf0\\xfe\\x45\\xc6\\x78\\x8c\\x1f\\xe3\\xff\\x04\\x00\\x00\\xff\\xff\\xb5\\x44\\x89\\xaf\\xbc\\x0f\\x00\\x00\")\n\nfunc prestate_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_prestate_tracerJs,\n\t\t\"prestate_tracer.js\",\n\t)\n}\n\nfunc prestate_tracerJs() (*asset, error) {\n\tbytes, err := prestate_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"prestate_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd0, 0xd5, 0x5, 0x92, 0xed, 0xf4, 0x69, 0x2e, 0x14, 0x48, 0x35, 0x67, 0xcc, 0xf2, 0x3e, 0xc7, 0xf, 0x18, 0x22, 0x7a, 0x4d, 0x6f, 0x31, 0xad, 0x3c, 0x92, 0x77, 0xb4, 0x1, 0x2a, 0xd3, 0x7c}}\n\treturn a, nil\n}\n\nvar _trigram_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x8c\\x94\\x4f\\x6f\\xe3\\x36\\x10\\xc5\\xef\\xfe\\x14\\xaf\\x27\\x27\\x88\\xd7\\x4a\\xda\\x4b\\xe1\\xd4\\x05\\xdc\\x6c\\xb2\\x6b\\x20\\x6b\\x07\\xb6\\xd2\\x45\\x10\\xe4\\x40\\x4b\\x23\\x89\\x08\\x4d\\x0a\\xe4\\xd0\\x5e\\x21\\xc8\\x77\\x2f\\xa8\\x3f\\xfe\\x13\\xb8\\xed\\xfa\\x64\\x70\\xe6\\xfd\\xe6\\xcd\\x70\\xc4\\x28\\xc2\\x8d\\x29\\x2b\\x2b\\xf3\\x82\\xf1\\xeb\\xe5\\xd5\\xef\\x88\\x0b\\x42\\x6e\\x3e\\x11\\x17\\x64\\xc9\\xaf\\x31\\xf1\\x5c\\x18\\xeb\\x7a\\x51\\x84\\xb8\\x90\\x0e\\x99\\x54\\x04\\xe9\\x50\\x0a\\xcb\\x30\\x19\\xf8\\x43\\xbe\\x92\\x2b\\x2b\\x6c\\x35\\xec\\x45\\x51\\xa3\\x39\\x19\\x0e\\x84\\xcc\\x12\\xc1\\x99\\x8c\\xb7\\xc2\\xd2\\x08\\x95\\xf1\\x48\\x84\\x86\\xa5\\x54\\x3a\\xb6\\x72\\xe5\\x99\\x20\\x19\\x42\\xa7\\x91\\xb1\\x58\\x9b\\x54\\x66\\x55\\x40\\x4a\\x86\\xd7\\x29\\xd9\\xba\\x34\\x93\\x5d\\xbb\\xce\\xc7\\x97\\xd9\\x23\\xee\\xc9\\x39\\xb2\\xf8\\x42\\x9a\\xac\\x50\\x78\\xf0\\x2b\\x25\\x13\\xdc\\xcb\\x84\\xb4\\x23\\x08\\x87\\x32\\x9c\\xb8\\x82\\x52\\xac\\x6a\\x5c\\x10\\xde\\x05\\x2b\\xcb\\xd6\\x0a\\xee\\x8c\\xd7\\xa9\\x60\\x69\\xf4\\x00\\x24\\x83\\x73\\x6c\\xc8\\x3a\\x69\\x34\\x7e\\xeb\\x4a\\xb5\\xc0\\x01\\x8c\\x0d\\x90\\x33\\xc1\\xa1\\x01\\x0b\\x53\\x06\\xdd\\x39\\x84\\xae\\xa0\\x04\\xef\\xa5\\x3f\\x31\\x90\\x7d\\xdf\\x29\\xa4\\xae\\xcb\\x14\\xa6\\x24\\x70\\x21\\x38\\x74\\xbd\\x95\\x4a\\x61\\x45\\xf0\\x8e\\x32\\xaf\\x06\\x81\\xb6\\xf2\\x8c\\xef\\xd3\\xf8\\xeb\\xfc\\x31\\xc6\\x64\\xf6\\x84\\xef\\x93\\xc5\\x62\\x32\\x8b\\x9f\\xae\\xb1\\x95\\x5c\\x18\\xcf\\xa0\\x0d\\x35\\x28\\xb9\\x2e\\x95\\xa4\\x14\\x5b\\x61\\xad\\xd0\\x5c\\xc1\\x64\\x81\\xf0\\xed\\x76\\x71\\xf3\\x75\\x32\\x8b\\x27\\x7f\\x4d\\xef\\xa7\\xf1\\x13\\x8c\\xc5\\xdd\\x34\\x9e\\xdd\\x2e\\x97\\xb8\\x9b\\x2f\\x30\\xc1\\xc3\\x64\\x11\\x4f\\x6f\\x1e\\xef\\x27\\x0b\\x3c\\x3c\\x2e\\x1e\\xe6\\xcb\\xdb\\x21\\x96\\x14\\x5c\\x51\\xd0\\xff\\xff\\xcc\\xb3\\xfa\\xf6\\x2c\\x21\\x25\\x16\\x52\\xb9\\x6e\\x12\\x4f\\xc6\\xc3\\x15\\xc6\\xab\\x14\\x85\\xd8\\x10\\x2c\\x25\\x24\\x37\\x94\\x42\\x20\\x31\\x65\\xf5\\xd3\\x97\\x1a\\x58\\x42\\x19\\x9d\\xd7\\x3d\\xff\\xeb\\x42\\x62\\x9a\\x41\\x1b\\x1e\\xc0\\x11\\xe1\\x8f\\x82\\xb9\\x1c\\x45\\xd1\\x76\\xbb\\x1d\\xe6\\xda\\x0f\\x8d\\xcd\\x23\\xd5\\xe0\\x5c\\xf4\\xe7\\xb0\\xd7\\x7b\\xeb\\x01\\x40\\x14\\xa1\\x90\\x8e\\xc3\\xe5\\x04\\xec\\x5a\\x94\\xb5\\x2b\\x2b\\x73\\x2b\\xd6\\x48\\x8c\\xd7\\x4c\\xd6\\xd5\\xa9\\x21\\x6f\\x84\\xb7\\xf7\\x41\\x27\\x54\\xc2\\xf1\\xbc\\x0c\\xd2\\xf0\\x0f\\xa6\\x24\\x5b\\xef\\x54\\x1d\\x6f\\x82\\x6e\\x84\\xe7\\x7e\\x7f\\xd0\\xef\\xbf\\x0c\\x76\\xa7\\x9f\\xa9\\xe4\\x62\\x84\\xcb\\xe6\\xa4\\x65\\x39\\xa6\\x9a\\x24\\xf5\\xc6\\xbc\\x52\\x5a\\x8f\\x94\\x36\\x64\\x2b\\x98\\x32\\x31\\x69\\xbb\\x22\\xc1\\xe2\\xdf\\xdf\\x40\\x3f\\x28\\xf1\\x4c\\x6e\\x58\\x13\\x82\\x74\\x84\\xcc\\xeb\\x24\\x14\\x3f\\x53\\x26\\x1f\\x20\\x5d\\x9d\\xe3\\x6d\\xc7\\xdf\\x08\\x8b\\x34\\x54\\xc5\\x18\\xca\\xe4\\xc3\\x9c\\x1a\\x13\\x67\\xe7\\xd7\\xbb\\x1c\\x99\\xe1\\xac\\xc9\\xf9\\x65\\x0c\\x2e\\xa4\\x1b\\xee\\xbc\\x9e\\xef\\x49\\xe1\\xb7\\x0b\\xce\\x4b\\x87\\x71\\xd7\\xdf\\xf5\\xe9\\x9c\\xcf\\x6d\\xd9\\x1a\\x7d\\x9c\\x63\\x89\\xbd\\xd5\\xfb\\xb3\\xf7\\x23\\xbf\\xa6\\x6c\\xcd\\x9a\\x72\\xc8\\x66\\xc9\\x56\\xea\\xfc\\xd0\\x6f\\xc8\\x79\\xa5\\x0a\\xe3\\x23\\x3f\\xcf\\x97\\x2f\\x17\\xfd\\x4f\\xfd\\x8b\\xa3\\xb3\\xab\\xe6\\xcc\\x94\\xc7\\xdd\\xd6\\x39\\xe1\\x52\\x9f\\x5f\\xa9\\x7a\\x39\\xd5\\xe4\\x2e\\x78\\x71\\x71\\xca\\x26\\x29\\x47\\xf8\\x2f\\x19\\xc6\\xb8\\x3a\\x25\\xfc\\xe0\\xf8\\x63\\x0f\\x57\\x07\\xc3\\xfc\\x10\\xc0\\x18\\x5d\\x1b\\xfb\\x3d\\xcc\\x84\\x57\\x7c\\xb8\\x3c\\xdb\\xa2\\x7d\\x11\\x44\\xc2\\x5e\\xa8\\x76\\x5f\\xc2\\xeb\\x66\\x32\\x08\\xdd\\xad\\x54\\xd6\\x7c\\xab\\x81\\x52\\x23\\x4e\\x2e\\xd1\\xbe\\x8c\\x25\\x77\\xaa\\x8e\\x50\\xaa\\xae\\xd5\\x40\\x5d\\xf3\\xa5\\xaf\\x88\\x34\\x24\\x87\\x0f\\x82\\x52\\x98\\x0d\\xd9\\xf0\\xca\\xb7\\x57\\xee\\x3a\\x62\\x90\\x65\\x52\\x0b\\xd5\\xb1\\xdb\\x07\\x81\\xad\\x48\\xa4\\xce\\x1b\\x6b\\x4d\\xe8\\xc0\\x5b\\xc2\\x3f\\x0e\\x97\\xbb\\x61\\xee\\x27\\xbf\\x9b\\xce\\x7b\\xef\\x9f\\x00\\x00\\x00\\xff\\xff\\xb3\\x93\\x16\\xd5\\xfc\\x06\\x00\\x00\")\n\nfunc trigram_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_trigram_tracerJs,\n\t\t\"trigram_tracer.js\",\n\t)\n}\n\nfunc trigram_tracerJs() (*asset, error) {\n\tbytes, err := trigram_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"trigram_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0x40, 0x63, 0xe1, 0x42, 0x60, 0x7, 0x1b, 0x79, 0x47, 0x1, 0xa1, 0xbf, 0xc4, 0x66, 0x19, 0x9b, 0x2b, 0x5a, 0x1f, 0x82, 0x3d, 0xcf, 0xee, 0xe7, 0x60, 0x25, 0x2c, 0x4f, 0x13, 0x97, 0xc7, 0x18}}\n\treturn a, nil\n}\n\nvar _unigram_tracerJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\x8c\\x54\\x4d\\x6f\\xdb\\x46\\x10\\xbd\\xeb\\x57\\xbc\\xa3\\x8c\\xa8\\xa4\\xd3\\x5e\\x0a\\xa5\\x09\\xc0\\x1a\\x76\\x22\\xc0\\x91\\x0d\\x89\\x6e\\x60\\x14\\x3d\\x2c\\xc9\\x21\\xb9\\xe8\\x6a\\x87\\xd8\\x9d\\x95\\x42\\x04\\xfa\\xef\\xc5\\x92\\xa2\\xe5\\x1a\\x6e\\x13\\x9e\\x04\\xcd\\xbc\\x8f\\x79\\x33\\x64\\x9a\\xe2\\x8a\\xbb\\xde\\xe9\\xa6\\x15\\xfc\\x7c\\xf9\\xf6\\x57\\xe4\\x2d\\xa1\\xe1\\x9f\\x48\\x5a\\x72\\x14\\x76\\xc8\\x82\\xb4\\xec\\xfc\\x2c\\x4d\\x91\\xb7\\xda\\xa3\\xd6\\x86\\xa0\\x3d\\x3a\\xe5\\x04\\x5c\\x43\\x5e\\xf4\\x1b\\x5d\\x38\\xe5\\xfa\\x64\\x96\\xa6\\x23\\xe6\\xd5\\x72\\x64\\xa8\\x1d\\x11\\x3c\\xd7\\x72\\x50\\x8e\\x96\\xe8\\x39\\xa0\\x54\\x16\\x8e\\x2a\\xed\\xc5\\xe9\\x22\\x08\\x41\\x0b\\x94\\xad\\x52\\x76\\xd8\\x71\\xa5\\xeb\\x3e\\x52\\x6a\\x41\\xb0\\x15\\xb9\\x41\\x5a\\xc8\\xed\\xfc\\xe4\\xe3\\xe3\\xfa\\x01\\xb7\\xe4\\x3d\\x39\\x7c\\x24\\x4b\\x4e\\x19\\xdc\\x87\\xc2\\xe8\\x12\\xb7\\xba\\x24\\xeb\\x09\\xca\\xa3\\x8b\\xff\\xf8\\x96\\x2a\\x14\\x03\\x5d\\x04\\xde\\x44\\x2b\\xdb\\x93\\x15\\xdc\\x70\\xb0\\x95\\x12\\xcd\\x76\\x01\\xd2\\xd1\\x39\\xf6\\xe4\\xbc\\x66\\x8b\\x5f\\x26\\xa9\\x13\\xe1\\x02\\xec\\x22\\xc9\\x5c\\x49\\x1c\\xc0\\x81\\xbb\\x88\\xbb\\x80\\xb2\\x3d\\x8c\\x92\\x33\\xf4\\x07\\x02\\x39\\xcf\\x5d\\x41\\xdb\\x41\\xa6\\xe5\\x8e\\x20\\xad\\x92\\x38\\xf5\\x41\\x1b\\x83\\x82\\x10\\x3c\\xd5\\xc1\\x2c\\x22\\x5b\\x11\\x04\\x5f\\x56\\xf9\\xa7\\xbb\\x87\\x1c\\xd9\\xfa\\x11\\x5f\\xb2\\xcd\\x26\\x5b\\xe7\\x8f\\xef\\x70\\xd0\\xd2\\x72\\x10\\xd0\\x9e\\x46\\x2a\\xbd\\xeb\\x8c\\xa6\\x0a\\x07\\xe5\\x9c\\xb2\\xd2\\x83\\xeb\\xc8\\xf0\\xf9\\x7a\\x73\\xf5\\x29\\x5b\\xe7\\xd9\\xef\\xab\\xdb\\x55\\xfe\\x08\\x76\\xb8\\x59\\xe5\\xeb\\xeb\\xed\\x16\\x37\\x77\\x1b\\x64\\xb8\\xcf\\x36\\xf9\\xea\\xea\\xe1\\x36\\xdb\\xe0\\xfe\\x61\\x73\\x7f\\xb7\\xbd\\x4e\\xb0\\xa5\\xe8\\x8a\\x22\\xfe\\xfb\\x99\\xd7\\xc3\\xf6\\x1c\\xa1\\x22\\x51\\xda\\xf8\\x29\\x89\\x47\\x0e\\xf0\\x2d\\x07\\x53\\xa1\\x55\\x7b\\x82\\xa3\\x92\\xf4\\x9e\\x2a\\x28\\x94\\xdc\\xf5\\x3f\\xbc\\xd4\\xc8\\xa5\\x0c\\xdb\\x66\\x98\\xf9\\x3f\\x0f\\x12\\xab\\x1a\\x96\\x65\\x01\\x4f\\x84\\xdf\\x5a\\x91\\x6e\\x99\\xa6\\x87\\xc3\\x21\\x69\\x6c\\x48\\xd8\\x35\\xa9\\x19\\xe9\\x7c\\xfa\\x21\\x99\\xcd\\xbe\\xcd\\x00\\x20\\x4d\\xd1\\x6a\\x2f\\x71\\x39\\x91\\x76\\xa7\\xba\\xe8\\x8a\\xbb\\x92\\x2b\\xf2\\x10\\x46\\xc9\\xc1\\x0a\\x39\\x3f\\x74\\xc7\\xd6\\x25\\xbe\\x1d\\x17\\x13\\xd6\\x72\\xe7\\xc7\\x16\\x0f\\x1b\\x76\\x05\\xb9\\x11\\x3e\\xb6\\xc7\\xea\\x12\\x97\\x4f\\xdd\\x5e\\xa8\\x8b\\x4a\\xda\\xee\\xf9\\x6f\\xaa\\x86\\xdc\\x68\\x4f\\xae\\x3f\\x09\\x8e\\x77\\x10\\x7d\\xfc\\xf1\\x19\\xf4\\x95\\xca\\x20\\xe4\\x93\\x01\\x1d\\xa1\\x4b\\xd4\\xc1\\x96\\xf1\\xfa\\xe6\\x86\\x9b\\x05\\xaa\\xe2\\x02\\xe3\\x14\\xf1\\xd9\\xab\\x78\\x9b\\x78\\x0f\\xc3\\x4d\\xc2\\x5d\\x22\\xbc\\x15\\xa7\\x6d\\x33\\xbf\\x78\\xf7\\xd4\\xa3\\x6b\\xcc\\xa5\\xd5\\x3e\\x89\\x83\\xfc\\xc9\\xdd\\x5f\\x17\\x67\\x7c\\x7c\\xfe\\x55\\x7b\\xf3\\xe6\\x0c\\x3c\\x3e\\xfd\\x22\\xe3\\x09\\xff\\x83\\xc2\\x7b\\xbc\\x7d\\x0d\\x37\\x34\\xc5\\x40\\x26\\xda\\x73\\x88\\xb5\\x0a\\x46\\x9e\\xe7\\x72\\x68\\x4f\\x17\\xad\\x4a\\x09\\xca\\x9c\\xa2\\x88\\x6f\\x27\\xd7\\x50\\x76\\x4a\\xab\\x1e\\x6f\\x2d\\xb2\\x0c\\x14\\xaf\\xe6\\x73\\x5c\\xcc\\x26\\x1d\\x47\\xfe\\x35\\x21\\x65\\xcc\\x20\\x36\\x2d\\x7d\\x38\\xd5\\x82\\xc8\\x42\\x0b\\x39\\x15\\xdf\\x55\\xde\\x93\\x8b\\x9f\\x29\\x38\\x92\\xe0\\xac\\x9f\\x18\\x23\\xac\\xd6\\x56\\x99\\x89\\xfb\\x74\\xd1\\xe2\\x54\\xa9\\x6d\\x33\\x7a\\x1b\\x4b\\xcf\\xcc\\x95\\xf2\\xf5\\xf9\\xe2\\x74\\x3d\\x7f\\x0a\\x07\\x1f\\x70\\xf9\\x62\\x27\\xa3\\xe4\\x39\\xe4\\x97\\xe1\\x1e\\x17\\xb3\\xe3\\xec\\x9f\\x00\\x00\\x00\\xff\\xff\\x8d\\xba\\x8d\\xa8\\xe6\\x05\\x00\\x00\")\n\nfunc unigram_tracerJsBytes() ([]byte, error) {\n\treturn bindataRead(\n\t\t_unigram_tracerJs,\n\t\t\"unigram_tracer.js\",\n\t)\n}\n\nfunc unigram_tracerJs() (*asset, error) {\n\tbytes, err := unigram_tracerJsBytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := bindataFileInfo{name: \"unigram_tracer.js\", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}\n\ta := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2f, 0x36, 0x14, 0xc2, 0xf6, 0xc3, 0x80, 0x2b, 0x4a, 0x11, 0x7d, 0xd5, 0x3e, 0xef, 0x23, 0xb5, 0xd6, 0xe6, 0xe6, 0x5, 0x41, 0xf6, 0x14, 0x7a, 0x39, 0xf7, 0xf8, 0xac, 0x89, 0x8e, 0x43, 0xe6}}\n\treturn a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.bytes, nil\n\t}\n\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// AssetString returns the asset contents as a string (instead of a []byte).\nfunc AssetString(name string) (string, error) {\n\tdata, err := Asset(name)\n\treturn string(data), err\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n\ta, err := Asset(name)\n\tif err != nil {\n\t\tpanic(\"asset: Asset(\" + name + \"): \" + err.Error())\n\t}\n\n\treturn a\n}\n\n// MustAssetString is like AssetString but panics when Asset would return an\n// error. It simplifies safe initialization of global variables.\nfunc MustAssetString(name string) string {\n\treturn string(MustAsset(name))\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.info, nil\n\t}\n\treturn nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetDigest returns the digest of the file with the given name. It returns an\n// error if the asset could not be found or the digest could not be loaded.\nfunc AssetDigest(name string) ([sha256.Size]byte, error) {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\tif f, ok := _bindata[canonicalName]; ok {\n\t\ta, err := f()\n\t\tif err != nil {\n\t\t\treturn [sha256.Size]byte{}, fmt.Errorf(\"AssetDigest %s can't read by error: %v\", name, err)\n\t\t}\n\t\treturn a.digest, nil\n\t}\n\treturn [sha256.Size]byte{}, fmt.Errorf(\"AssetDigest %s not found\", name)\n}\n\n// Digests returns a map of all known files and their checksums.\nfunc Digests() (map[string][sha256.Size]byte, error) {\n\tmp := make(map[string][sha256.Size]byte, len(_bindata))\n\tfor name := range _bindata {\n\t\ta, err := _bindata[name]()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tmp[name] = a.digest\n\t}\n\treturn mp, nil\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n\tnames := make([]string, 0, len(_bindata))\n\tfor name := range _bindata {\n\t\tnames = append(names, name)\n\t}\n\treturn names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n\t\"4byte_tracer.js\": _4byte_tracerJs,\n\n\t\"bigram_tracer.js\": bigram_tracerJs,\n\n\t\"call_tracer.js\": call_tracerJs,\n\n\t\"evmdis_tracer.js\": evmdis_tracerJs,\n\n\t\"noop_tracer.js\": noop_tracerJs,\n\n\t\"opcount_tracer.js\": opcount_tracerJs,\n\n\t\"prestate_tracer.js\": prestate_tracerJs,\n\n\t\"trigram_tracer.js\": trigram_tracerJs,\n\n\t\"unigram_tracer.js\": unigram_tracerJs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"},\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"},\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error, and\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n\tnode := _bintree\n\tif len(name) != 0 {\n\t\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\t\tpathList := strings.Split(canonicalName, \"/\")\n\t\tfor _, p := range pathList {\n\t\t\tnode = node.Children[p]\n\t\t\tif node == nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t\t\t}\n\t\t}\n\t}\n\tif node.Func != nil {\n\t\treturn nil, fmt.Errorf(\"Asset %s not found\", name)\n\t}\n\trv := make([]string, 0, len(node.Children))\n\tfor childName := range node.Children {\n\t\trv = append(rv, childName)\n\t}\n\treturn rv, nil\n}\n\ntype bintree struct {\n\tFunc     func() (*asset, error)\n\tChildren map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n\t\"4byte_tracer.js\":    {_4byte_tracerJs, map[string]*bintree{}},\n\t\"bigram_tracer.js\":   {bigram_tracerJs, map[string]*bintree{}},\n\t\"call_tracer.js\":     {call_tracerJs, map[string]*bintree{}},\n\t\"evmdis_tracer.js\":   {evmdis_tracerJs, map[string]*bintree{}},\n\t\"noop_tracer.js\":     {noop_tracerJs, map[string]*bintree{}},\n\t\"opcount_tracer.js\":  {opcount_tracerJs, map[string]*bintree{}},\n\t\"prestate_tracer.js\": {prestate_tracerJs, map[string]*bintree{}},\n\t\"trigram_tracer.js\":  {trigram_tracerJs, map[string]*bintree{}},\n\t\"unigram_tracer.js\":  {unigram_tracerJs, map[string]*bintree{}},\n}}\n\n// RestoreAsset restores an asset under the given directory.\nfunc RestoreAsset(dir, name string) error {\n\tdata, err := Asset(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tinfo, err := AssetInfo(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n}\n\n// RestoreAssets restores an asset under the given directory recursively.\nfunc RestoreAssets(dir, name string) error {\n\tchildren, err := AssetDir(name)\n\t// File\n\tif err != nil {\n\t\treturn RestoreAsset(dir, name)\n\t}\n\t// Dir\n\tfor _, child := range children {\n\t\terr = RestoreAssets(dir, filepath.Join(name, child))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc _filePath(dir, name string) string {\n\tcanonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n\treturn filepath.Join(append([]string{dir}, strings.Split(canonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/bigram_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n{\n    // hist is the counters of opcode bigrams\n    hist: {},\n    // lastOp is last operation\n    lastOp: '',\n    // execution depth of last op\n    lastDepth: 0,\n    // step is invoked for every opcode that the VM executes.\n    step: function(log, db) {\n        var op = log.op.toString();\n        var depth = log.getDepth();\n        if (depth == this.lastDepth){\n            var key = this.lastOp+'-'+op;\n            if (this.hist[key]){\n                this.hist[key]++;\n            }\n            else {\n                this.hist[key] = 1;\n            }\n        }\n        this.lastOp = op;\n        this.lastDepth = depth;\n    },\n    // fault is invoked when the actual execution of an opcode fails.\n    fault: function(log, db) {},\n    // result is invoked when all the opcodes have been iterated over and returns\n    // the final result of the tracing.\n    result: function(ctx) {\n        return this.hist;\n    },\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/call_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// callTracer is a full blown transaction tracer that extracts and reports all\n// the internal calls made by a transaction, along with any useful information.\n{\n\t// callstack is the current recursive call stack of the EVM execution.\n\tcallstack: [{}],\n\n\t// descended tracks whether we've just descended from an outer transaction into\n\t// an inner call.\n\tdescended: false,\n\n\t// step is invoked for every opcode that the VM executes.\n\tstep: function(log, db) {\n\t\t// Capture any errors immediately\n\t\tvar error = log.getError();\n\t\tif (error !== undefined) {\n\t\t\tthis.fault(log, db);\n\t\t\treturn;\n\t\t}\n\t\t// We only care about system opcodes, faster if we pre-check once\n\t\tvar syscall = (log.op.toNumber() & 0xf0) == 0xf0;\n\t\tif (syscall) {\n\t\t\tvar op = log.op.toString();\n\t\t}\n\t\t// If a new contract is being created, add to the call stack\n\t\tif (syscall && op == 'CREATE') {\n\t\t\tvar inOff = log.stack.peek(1).valueOf();\n\t\t\tvar inEnd = inOff + log.stack.peek(2).valueOf();\n\n\t\t\t// Assemble the internal call report and store for completion\n\t\t\tvar call = {\n\t\t\t\ttype:    op,\n\t\t\t\tfrom:    toHex(log.contract.getAddress()),\n\t\t\t\tinput:   toHex(log.memory.slice(inOff, inEnd)),\n\t\t\t\tgasIn:   log.getGas(),\n\t\t\t\tgasCost: log.getCost(),\n\t\t\t\tvalue:   '0x' + log.stack.peek(0).toString(16)\n\t\t\t};\n\t\t\tthis.callstack.push(call);\n\t\t\tthis.descended = true\n\t\t\treturn;\n\t\t}\n\t\t// If a contract is being self destructed, gather that as a subcall too\n\t\tif (syscall && op == 'SELFDESTRUCT') {\n\t\t\tvar left = this.callstack.length;\n\t\t\tif (this.callstack[left-1].calls === undefined) {\n\t\t\t\tthis.callstack[left-1].calls = [];\n\t\t\t}\n\t\t\tthis.callstack[left-1].calls.push({type: op});\n\t\t\treturn\n\t\t}\n\t\t// If a new method invocation is being done, add to the call stack\n\t\tif (syscall && (op == 'CALL' || op == 'CALLCODE' || op == 'DELEGATECALL' || op == 'STATICCALL')) {\n\t\t\t// Skip any pre-compile invocations, those are just fancy opcodes\n\t\t\tvar to = toAddress(log.stack.peek(1).toString(16));\n\t\t\tif (isPrecompiled(to)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tvar off = (op == 'DELEGATECALL' || op == 'STATICCALL' ? 0 : 1);\n\n\t\t\tvar inOff = log.stack.peek(2 + off).valueOf();\n\t\t\tvar inEnd = inOff + log.stack.peek(3 + off).valueOf();\n\n\t\t\t// Assemble the internal call report and store for completion\n\t\t\tvar call = {\n\t\t\t\ttype:    op,\n\t\t\t\tfrom:    toHex(log.contract.getAddress()),\n\t\t\t\tto:      toHex(to),\n\t\t\t\tinput:   toHex(log.memory.slice(inOff, inEnd)),\n\t\t\t\tgasIn:   log.getGas(),\n\t\t\t\tgasCost: log.getCost(),\n\t\t\t\toutOff:  log.stack.peek(4 + off).valueOf(),\n\t\t\t\toutLen:  log.stack.peek(5 + off).valueOf()\n\t\t\t};\n\t\t\tif (op != 'DELEGATECALL' && op != 'STATICCALL') {\n\t\t\t\tcall.value = '0x' + log.stack.peek(2).toString(16);\n\t\t\t}\n\t\t\tthis.callstack.push(call);\n\t\t\tthis.descended = true\n\t\t\treturn;\n\t\t}\n\t\t// If we've just descended into an inner call, retrieve it's true allowance. We\n\t\t// need to extract if from within the call as there may be funky gas dynamics\n\t\t// with regard to requested and actually given gas (2300 stipend, 63/64 rule).\n\t\tif (this.descended) {\n\t\t\tif (log.getDepth() >= this.callstack.length) {\n\t\t\t\tthis.callstack[this.callstack.length - 1].gas = log.getGas();\n\t\t\t} else {\n\t\t\t\t// TODO(karalabe): The call was made to a plain account. We currently don't\n\t\t\t\t// have access to the true gas amount inside the call and so any amount will\n\t\t\t\t// mostly be wrong since it depends on a lot of input args. Skip gas for now.\n\t\t\t}\n\t\t\tthis.descended = false;\n\t\t}\n\t\t// If an existing call is returning, pop off the call stack\n\t\tif (syscall && op == 'REVERT') {\n\t\t\tthis.callstack[this.callstack.length - 1].error = \"execution reverted\";\n\t\t\treturn;\n\t\t}\n\t\tif (log.getDepth() == this.callstack.length - 1) {\n\t\t\t// Pop off the last call and get the execution results\n\t\t\tvar call = this.callstack.pop();\n\n\t\t\tif (call.type == 'CREATE') {\n\t\t\t\t// If the call was a CREATE, retrieve the contract address and output code\n\t\t\t\tcall.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost - log.getGas()).toString(16);\n\t\t\t\tdelete call.gasIn; delete call.gasCost;\n\n\t\t\t\tvar ret = log.stack.peek(0);\n\t\t\t\tif (!ret.equals(0)) {\n\t\t\t\t\tcall.to     = toHex(toAddress(ret.toString(16)));\n\t\t\t\t\tcall.output = toHex(db.getCode(toAddress(ret.toString(16))));\n\t\t\t\t} else if (call.error === undefined) {\n\t\t\t\t\tcall.error = \"internal failure\"; // TODO(karalabe): surface these faults somehow\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the call was a contract call, retrieve the gas usage and output\n\t\t\t\tif (call.gas !== undefined) {\n\t\t\t\t\tcall.gasUsed = '0x' + bigInt(call.gasIn - call.gasCost + call.gas - log.getGas()).toString(16);\n\n\t\t\t\t\tvar ret = log.stack.peek(0);\n\t\t\t\t\tif (!ret.equals(0)) {\n\t\t\t\t\t\tcall.output = toHex(log.memory.slice(call.outOff, call.outOff + call.outLen));\n\t\t\t\t\t} else if (call.error === undefined) {\n\t\t\t\t\t\tcall.error = \"internal failure\"; // TODO(karalabe): surface these faults somehow\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdelete call.gasIn; delete call.gasCost;\n\t\t\t\tdelete call.outOff; delete call.outLen;\n\t\t\t}\n\t\t\tif (call.gas !== undefined) {\n\t\t\t\tcall.gas = '0x' + bigInt(call.gas).toString(16);\n\t\t\t}\n\t\t\t// Inject the call into the previous one\n\t\t\tvar left = this.callstack.length;\n\t\t\tif (this.callstack[left-1].calls === undefined) {\n\t\t\t\tthis.callstack[left-1].calls = [];\n\t\t\t}\n\t\t\tthis.callstack[left-1].calls.push(call);\n\t\t}\n\t},\n\n\t// fault is invoked when the actual execution of an opcode fails.\n\tfault: function(log, db) {\n\t\t// If the topmost call already reverted, don't handle the additional fault again\n\t\tif (this.callstack[this.callstack.length - 1].error !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\t// Pop off the just failed call\n\t\tvar call = this.callstack.pop();\n\t\tcall.error = log.getError();\n\n\t\t// Consume all available gas and clean any leftovers\n\t\tif (call.gas !== undefined) {\n\t\t\tcall.gas = '0x' + bigInt(call.gas).toString(16);\n\t\t\tcall.gasUsed = call.gas\n\t\t}\n\t\tdelete call.gasIn; delete call.gasCost;\n\t\tdelete call.outOff; delete call.outLen;\n\n\t\t// Flatten the failed call into its parent\n\t\tvar left = this.callstack.length;\n\t\tif (left > 0) {\n\t\t\tif (this.callstack[left-1].calls === undefined) {\n\t\t\t\tthis.callstack[left-1].calls = [];\n\t\t\t}\n\t\t\tthis.callstack[left-1].calls.push(call);\n\t\t\treturn;\n\t\t}\n\t\t// Last call failed too, leave it in the stack\n\t\tthis.callstack.push(call);\n\t},\n\n\t// result is invoked when all the opcodes have been iterated over and returns\n\t// the final result of the tracing.\n\tresult: function(ctx, db) {\n\t\tvar result = {\n\t\t\ttype:    ctx.type,\n\t\t\tfrom:    toHex(ctx.from),\n\t\t\tto:      toHex(ctx.to),\n\t\t\tvalue:   '0x' + ctx.value.toString(16),\n\t\t\tgas:     '0x' + bigInt(ctx.gas).toString(16),\n\t\t\tgasUsed: '0x' + bigInt(ctx.gasUsed).toString(16),\n\t\t\tinput:   toHex(ctx.input),\n\t\t\toutput:  toHex(ctx.output),\n\t\t\ttime:    ctx.time,\n\t\t};\n\t\tif (this.callstack[0].calls !== undefined) {\n\t\t\tresult.calls = this.callstack[0].calls;\n\t\t}\n\t\tif (this.callstack[0].error !== undefined) {\n\t\t\tresult.error = this.callstack[0].error;\n\t\t} else if (ctx.error !== undefined) {\n\t\t\tresult.error = ctx.error;\n\t\t}\n\t\tif (result.error !== undefined) {\n\t\t\tdelete result.output;\n\t\t}\n\t\treturn this.finalize(result);\n\t},\n\n\t// finalize recreates a call object using the final desired field oder for json\n\t// serialization. This is a nicety feature to pass meaningfully ordered results\n\t// to users who don't interpret it, just display it.\n\tfinalize: function(call) {\n\t\tvar sorted = {\n\t\t\ttype:    call.type,\n\t\t\tfrom:    call.from,\n\t\t\tto:      call.to,\n\t\t\tvalue:   call.value,\n\t\t\tgas:     call.gas,\n\t\t\tgasUsed: call.gasUsed,\n\t\t\tinput:   call.input,\n\t\t\toutput:  call.output,\n\t\t\terror:   call.error,\n\t\t\ttime:    call.time,\n\t\t\tcalls:   call.calls,\n\t\t}\n\t\tfor (var key in sorted) {\n\t\t\tif (sorted[key] === undefined) {\n\t\t\t\tdelete sorted[key];\n\t\t\t}\n\t\t}\n\t\tif (sorted.calls !== undefined) {\n\t\t\tfor (var i=0; i<sorted.calls.length; i++) {\n\t\t\t\tsorted.calls[i] = this.finalize(sorted.calls[i]);\n\t\t\t}\n\t\t}\n\t\treturn sorted;\n\t}\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/evmdis_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// evmdisTracer returns sufficent information from a trace to perform evmdis-style\n// disassembly.\n{\n\tstack: [{ops: []}],\n\n\tnpushes: {0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 32: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 0, 56: 1, 57: 0, 58: 1, 59: 1, 60: 0, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 80: 0, 81: 1, 82: 0, 83: 0, 84: 1, 85: 0, 86: 0, 87: 0, 88: 1, 89: 1, 90: 1, 91: 0, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1, 128: 2, 129: 3, 130: 4, 131: 5, 132: 6, 133: 7, 134: 8, 135: 9, 136: 10, 137: 11, 138: 12, 139: 13, 140: 14, 141: 15, 142: 16, 143: 17, 144: 2, 145: 3, 146: 4, 147: 5, 148: 6, 149: 7, 150: 8, 151: 9, 152: 10, 153: 11, 154: 12, 155: 13, 156: 14, 157: 15, 158: 16, 159: 17, 160: 0, 161: 0, 162: 0, 163: 0, 164: 0, 240: 1, 241: 1, 242: 1, 243: 0, 244: 0, 255: 0},\n\n\t// result is invoked when all the opcodes have been iterated over and returns\n\t// the final result of the tracing.\n\tresult: function() { return this.stack[0].ops; },\n\n\t// fault is invoked when the actual execution of an opcode fails.\n\tfault: function(log, db) { },\n\n\t// step is invoked for every opcode that the VM executes.\n\tstep: function(log, db) {\n\t\tvar frame = this.stack[this.stack.length - 1];\n\n\t\tvar error = log.getError();\n\t\tif (error) {\n\t\t\tframe[\"error\"] = error;\n\t\t} else if (log.getDepth() == this.stack.length) {\n\t\t\topinfo = {\n\t\t\t\top:     log.op.toNumber(),\n\t\t\t\tdepth : log.getDepth(),\n\t\t\t\tresult: [],\n\t\t\t};\n\t\t\tif (frame.ops.length > 0) {\n\t\t\t\tvar prevop = frame.ops[frame.ops.length - 1];\n\t\t\t\tfor(var i = 0; i < this.npushes[prevop.op]; i++)\n\t\t\t\t\tprevop.result.push(log.stack.peek(i).toString(16));\n\t\t\t}\n\t\t\tswitch(log.op.toString()) {\n\t\t\tcase \"CALL\": case \"CALLCODE\":\n\t\t\t\tvar instart = log.stack.peek(3).valueOf();\n\t\t\t\tvar insize = log.stack.peek(4).valueOf();\n\t\t\t\topinfo[\"gas\"] = log.stack.peek(0).valueOf();\n\t\t\t\topinfo[\"to\"] = log.stack.peek(1).toString(16);\n\t\t\t\topinfo[\"value\"] = log.stack.peek(2).toString();\n\t\t\t\topinfo[\"input\"] = log.memory.slice(instart, instart + insize);\n\t\t\t\topinfo[\"error\"] = null;\n\t\t\t\topinfo[\"return\"] = null;\n\t\t\t\topinfo[\"ops\"] = [];\n\t\t\t\tthis.stack.push(opinfo);\n\t\t\t\tbreak;\n\t\t\tcase \"DELEGATECALL\": case \"STATICCALL\":\n\t\t\t\tvar instart = log.stack.peek(2).valueOf();\n\t\t\t\tvar insize = log.stack.peek(3).valueOf();\n\t\t\t\topinfo[\"op\"] =  log.op.toString();\n\t\t\t\topinfo[\"gas\"] =  log.stack.peek(0).valueOf();\n\t\t\t\topinfo[\"to\"] =  log.stack.peek(1).toString(16);\n\t\t\t\topinfo[\"input\"] =  log.memory.slice(instart, instart + insize);\n\t\t\t\topinfo[\"error\"] =  null;\n\t\t\t\topinfo[\"return\"] =  null;\n\t\t\t\topinfo[\"ops\"] = [];\n\t\t\t\tthis.stack.push(opinfo);\n\t\t\t\tbreak;\n\t\t\tcase \"RETURN\":\n\t\t\t\tvar out = log.stack.peek(0).valueOf();\n\t\t\t\tvar outsize = log.stack.peek(1).valueOf();\n\t\t\t\tframe.return = log.memory.slice(out, out + outsize);\n\t\t\t\tbreak;\n\t\t\tcase \"STOP\": case \"SUICIDE\":\n\t\t\t\tframe.return = log.memory.slice(0, 0);\n\t\t\t\tbreak;\n\t\t\tcase \"JUMPDEST\":\n\t\t\t\topinfo[\"pc\"] = log.getPC();\n\t\t\t}\n\t\t\tif(log.op.isPush()) {\n\t\t\t\topinfo[\"len\"] = log.op.toNumber() - 0x5e;\n\t\t\t}\n\t\t\tframe.ops.push(opinfo);\n\t\t} else {\n\t\t\tthis.stack = this.stack.slice(0, log.getDepth());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/noop_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// noopTracer is just the barebone boilerplate code required from a JavaScript\n// object to be usable as a transaction tracer.\n{\n\t// step is invoked for every opcode that the VM executes.\n\tstep: function(log, db) { },\n\n\t// fault is invoked when the actual execution of an opcode fails.\n\tfault: function(log, db) { },\n\n\t// result is invoked when all the opcodes have been iterated over and returns\n\t// the final result of the tracing.\n\tresult: function(ctx, db) { return {}; }\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/opcount_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// opcountTracer is a sample tracer that just counts the number of instructions\n// executed by the EVM before the transaction terminated.\n{\n\t// count tracks the number of EVM instructions executed.\n\tcount: 0,\n\n\t// step is invoked for every opcode that the VM executes.\n\tstep: function(log, db) { this.count++ },\n\n\t// fault is invoked when the actual execution of an opcode fails.\n\tfault: function(log, db) { },\n\n\t// result is invoked when all the opcodes have been iterated over and returns\n\t// the final result of the tracing.\n\tresult: function(ctx, db) { return this.count }\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/prestate_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n// prestateTracer outputs sufficient information to create a local execution of\n// the transaction from a custom assembled genesis block.\n{\n\t// prestate is the genesis that we're building.\n\tprestate: null,\n\n\t// lookupAccount injects the specified account into the prestate object.\n\tlookupAccount: function(addr, db){\n\t\tvar acc = toHex(addr);\n\t\tif (this.prestate[acc] === undefined) {\n\t\t\tthis.prestate[acc] = {\n\t\t\t\tbalance: '0x' + db.getBalance(addr).toString(16),\n\t\t\t\tnonce:   db.getNonce(addr),\n\t\t\t\tcode:    toHex(db.getCode(addr)),\n\t\t\t\tstorage: {}\n\t\t\t};\n\t\t}\n\t},\n\n\t// lookupStorage injects the specified storage entry of the given account into\n\t// the prestate object.\n\tlookupStorage: function(addr, key, db){\n\t\tvar acc = toHex(addr);\n\t\tvar idx = toHex(key);\n\n\t\tif (this.prestate[acc].storage[idx] === undefined) {\n\t\t\tvar val = toHex(db.getState(addr, key));\n\t\t\tif (val != \"0x0000000000000000000000000000000000000000000000000000000000000000\") {\n\t\t\t\tthis.prestate[acc].storage[idx] = toHex(db.getState(addr, key));\n\t\t\t}\n\t\t}\n\t},\n\n\t// result is invoked when all the opcodes have been iterated over and returns\n\t// the final result of the tracing.\n\tresult: function(ctx, db) {\n\t\t// At this point, we need to deduct the 'value' from the\n\t\t// outer transaction, and move it back to the origin\n\t\tthis.lookupAccount(ctx.from, db);\n\n\t\tvar fromBal = bigInt(this.prestate[toHex(ctx.from)].balance.slice(2), 16);\n\t\tvar toBal   = bigInt(this.prestate[toHex(ctx.to)].balance.slice(2), 16);\n\n\t\tthis.prestate[toHex(ctx.to)].balance   = '0x'+toBal.subtract(ctx.value).toString(16);\n\t\tthis.prestate[toHex(ctx.from)].balance = '0x'+fromBal.add(ctx.value).toString(16);\n\n\t\t// Decrement the caller's nonce, and remove empty create targets\n\t\tthis.prestate[toHex(ctx.from)].nonce--;\n\t\tif (ctx.type == 'CREATE') {\n\t\t\t// We can blibdly delete the contract prestate, as any existing state would\n\t\t\t// have caused the transaction to be rejected as invalid in the first place.\n\t\t\tdelete this.prestate[toHex(ctx.to)];\n\t\t}\n\t\t// Return the assembled allocations (prestate)\n\t\treturn this.prestate;\n\t},\n\n\t// step is invoked for every opcode that the VM executes.\n\tstep: function(log, db) {\n\t\t// Add the current account if we just started tracing\n\t\tif (this.prestate === null){\n\t\t\tthis.prestate = {};\n\t\t\t// Balance will potentially be wrong here, since this will include the value\n\t\t\t// sent along with the message. We fix that in 'result()'.\n\t\t\tthis.lookupAccount(log.contract.getAddress(), db);\n\t\t}\n\t\t// Whenever new state is accessed, add it to the prestate\n\t\tswitch (log.op.toString()) {\n\t\t\tcase \"EXTCODECOPY\": case \"EXTCODESIZE\": case \"BALANCE\":\n\t\t\t\tthis.lookupAccount(toAddress(log.stack.peek(0).toString(16)), db);\n\t\t\t\tbreak;\n\t\t\tcase \"CREATE\":\n\t\t\t\tvar from = log.contract.getAddress();\n\t\t\t\tthis.lookupAccount(toContract(from, db.getNonce(from)), db);\n\t\t\t\tbreak;\n\t\t\tcase \"CALL\": case \"CALLCODE\": case \"DELEGATECALL\": case \"STATICCALL\":\n\t\t\t\tthis.lookupAccount(toAddress(log.stack.peek(1).toString(16)), db);\n\t\t\t\tbreak;\n\t\t\tcase 'SSTORE':case 'SLOAD':\n\t\t\t\tthis.lookupStorage(log.contract.getAddress(), toWord(log.stack.peek(0).toString(16)), db);\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\t// fault is invoked when the actual execution of an opcode fails.\n\tfault: function(log, db) {}\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/tracers.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n//go:generate go-bindata -nometadata -o assets.go -pkg tracers -ignore ((tracers)|(assets)).go ./...\n//go:generate gofmt -s -w assets.go\n\n// Package tracers contains the actual JavaScript tracer assets.\npackage tracers\n"
  },
  {
    "path": "sero/tracers/internal/tracers/trigram_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n{\n    // hist is the map of trigram counters\n    hist: {},\n    // lastOp is last operation\n    lastOps: ['',''],\n    lastDepth: 0,\n        // step is invoked for every opcode that the VM executes.\n    step: function(log, db) {\n        var depth = log.getDepth();\n        if (depth != this.lastDepth){\n            this.lastOps = ['',''];\n            this.lastDepth = depth;\n            return;\n        }\n        var op = log.op.toString();\n        var key = this.lastOps[0]+'-'+this.lastOps[1]+'-'+op;\n        if (this.hist[key]){\n            this.hist[key]++;\n        }\n        else {\n            this.hist[key] = 1;\n        }\n        this.lastOps[0] = this.lastOps[1];\n        this.lastOps[1] = op;\n    },\n    // fault is invoked when the actual execution of an opcode fails.\n    fault: function(log, db) {},\n    // result is invoked when all the opcodes have been iterated over and returns\n    // the final result of the tracing.\n    result: function(ctx) {\n        return this.hist;\n    },\n}\n"
  },
  {
    "path": "sero/tracers/internal/tracers/unigram_tracer.js",
    "content": "// copyright 2018 The go-sero Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\n{\n    // hist is the map of opcodes to counters\n    hist: {},\n    // nops counts number of ops\n    nops: 0,\n    // step is invoked for every opcode that the VM executes.\n    step: function(log, db) {\n        var op = log.op.toString();\n        if (this.hist[op]){\n            this.hist[op]++;\n        }\n        else {\n            this.hist[op] = 1;\n        }\n        this.nops++;\n    },\n    // fault is invoked when the actual execution of an opcode fails.\n    fault: function(log, db) {},\n\n    // result is invoked when all the opcodes have been iterated over and returns\n    // the final result of the tracing.\n    result: function(ctx) {\n        if(this.nops > 0){\n            return this.hist;\n        }\n    },\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_create.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"3755480783\",\n    \"gasLimit\": \"5401723\",\n    \"miner\": \"0xd049bfd667cb46aa3ef5df0da3e57db3be39e511\",\n    \"number\": \"2294702\",\n    \"timestamp\": \"1513676146\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x13e4acefe6a6700604929946e70e6443e4e73447\": {\n        \"balance\": \"0xcf3e0938579f000\",\n        \"code\": \"0x\",\n        \"nonce\": \"9\",\n        \"storage\": {}\n      },\n      \"0x7dc9c9730689ff0b0fd506c67db815f12d90a448\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x\",\n        \"nonce\": \"0\",\n        \"storage\": {}\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"3757315409\",\n    \"extraData\": \"0x566961425443\",\n    \"gasLimit\": \"5406414\",\n    \"hash\": \"0xae107f592eebdd9ff8d6ba00363676096e6afb0e1007a7d3d0af88173077378d\",\n    \"miner\": \"0xd049bfd667cb46aa3ef5df0da3e57db3be39e511\",\n    \"mixHash\": \"0xc927aa05a38bc3de864e95c33b3ae559d3f39c4ccd51cef6f113f9c50ba0caf1\",\n    \"nonce\": \"0x93363bbd2c95f410\",\n    \"number\": \"2294701\",\n    \"stateRoot\": \"0x6b6737d5bde8058990483e915866bd1578014baeff57bd5e4ed228a2bfad635c\",\n    \"timestamp\": \"1513676127\",\n    \"totalDifficulty\": \"7160808139332585\"\n  },\n  \"input\": \"0xf907ef098504e3b29200830897be8080b9079c606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a1129a01060f46676a5dff6f407f0f51eb6f37f5c8c54e238c70221e18e65fc29d3ea65a0557b01c50ff4ffaac8ed6e5d31237a4ecbac843ab1bfe8bb0165a0060df7c54f\",\n  \"result\": {\n    \"from\": \"0x13e4acefe6a6700604929946e70e6443e4e73447\",\n    \"gas\": \"0x5e106\",\n    \"gasUsed\": \"0x5e106\",\n    \"input\": \"0x606060405260405160208061077c83398101604052808051906020019091905050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415151561007d57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600460006101000a81548160ff02191690831515021790555050610653806101296000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029000000000000000000000000c65e620a3a55451316168d57e268f5702ef56a11\",\n    \"output\": \"0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305e4382a146100855780631c02708d146100ae5780632e1a7d4d146100c35780635114cb52146100e6578063a37dda2c146100fe578063ae200e7914610153578063b5769f70146101a8575b005b341561009057600080fd5b6100986101d1565b6040518082815260200191505060405180910390f35b34156100b957600080fd5b6100c16101d7565b005b34156100ce57600080fd5b6100e460048080359060200190919050506102eb565b005b6100fc6004808035906020019091905050610513565b005b341561010957600080fd5b6101116105d6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b6101666105fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610621565b6040518082815260200191505060405180910390f35b60025481565b60011515600460009054906101000a900460ff1615151415156101f957600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102a15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156102ac57600080fd5b6000600460006101000a81548160ff0219169083151502179055506003543073ffffffffffffffffffffffffffffffffffffffff163103600281905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103935750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561039e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561048357600060025411801561040757506002548111155b151561041257600080fd5b80600254036002819055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561047e57600080fd5b610510565b600060035411801561049757506003548111155b15156104a257600080fd5b8060035403600381905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561050f57600080fd5b5b50565b60011515600460009054906101000a900460ff16151514151561053557600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614801561059657506003548160035401115b80156105bd575080600354013073ffffffffffffffffffffffffffffffffffffffff163110155b15156105c857600080fd5b806003540160038190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600354815600a165627a7a72305820c3b849e8440987ce43eae3097b77672a69234d516351368b03fe5b7de03807910029\",\n    \"to\": \"0x7dc9c9730689ff0b0fd506c67db815f12d90a448\",\n    \"type\": \"CREATE\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_deep_calls.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"117066904\",\n    \"gasLimit\": \"4712384\",\n    \"miner\": \"0x1977c248e1014cc103929dd7f154199c916e39ec\",\n    \"number\": \"25001\",\n    \"timestamp\": \"1479891545\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156100825760e060020a600035046302d05d3f811461008a5780630accce061461009c5780631ab9075a146100c757806331ed274614610102578063645a3b7214610133578063772fdae314610155578063a7f4377914610180578063ae5f80801461019e578063c9bded21146101ea578063f905c15a14610231575b61023a610002565b61023c600054600160a060020a031681565b61023a600435602435604435606435608435600254600160a060020a03166000141561024657610002565b61023a600435600254600160a060020a03166000148015906100f8575060025433600160a060020a03908116911614155b156102f457610002565b61023a60043560243560443560643560843560a43560c435600254600160a060020a03166000141561031657610002565b61023a600435602435600254600160a060020a0316600014156103d057610002565b61023a600435602435604435606435608435600254600160a060020a03166000141561046157610002565b61023a60025433600160a060020a0390811691161461051657610002565b61023a6004356024356044356060828152600160a060020a0382169060ff8516907fa6c2f0913db6f79ff0a4365762c61718973b3413d6e40382e704782a9a5099f690602090a3505050565b61023a600435602435600160a060020a038116606090815260ff8316907fee6348a7ec70f74e3d6cba55a53e9f9110d180d7698e9117fc466ae29a43e34790602090a25050565b61023c60035481565b005b6060908152602090f35b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f115610002575050604051511515905061029d57610002565b60408051858152602081018390528151600160a060020a03858116939087169260ff8a16927f5a690ecd0cb15c1c1fd6b6f8a32df0d4f56cb41a54fea7e94020f013595de796929181900390910190a45050505050565b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f115610002575050604051511515905061036d57610002565b6040805186815260208101869052808201859052606081018490529051600160a060020a03831691889160ff8b16917fd65d9ddafbad8824e2bbd6f56cc9f4ac27ba60737035c10a321ea2f681c94d47919081900360800190a450505050505050565b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f115610002575050604051511515905061042757610002565b60408051828152905183917fa9c6cbc4bd352a6940479f6d802a1001550581858b310d7f68f7bea51218cda6919081900360200190a25050565b60025460e060020a6313bc6d4b02606090815233600160a060020a0390811660645291909116906313bc6d4b906084906020906024816000876161da5a03f11561000257505060405151151590506104b857610002565b80600160a060020a031684600160a060020a03168660ff167f69bdaf789251e1d3a0151259c0c715315496a7404bce9fd0b714674685c2cab78686604051808381526020018281526020019250505060405180910390a45050505050565b600254600160a060020a0316ff\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000002\": \"0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396\"\n        }\n      },\n      \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156100775760e060020a600035046302d05d3f811461007f57806313bc6d4b146100915780633688a877146100b95780635188f9961461012f5780637eadc976146101545780638ad79680146101d3578063a43e04d814610238578063a7f437791461025e578063e16c7d981461027c575b61029f610002565b6102a1600054600160a060020a031681565b6102be600435600160a060020a03811660009081526002602052604090205460ff165b919050565b6102d26004356040805160208181018352600080835284815260038252835190849020805460026001821615610100026000190190911604601f8101849004840283018401909552848252929390929183018282801561037d5780601f106103525761010080835404028352916020019161037d565b61029f6004356024356000805433600160a060020a039081169116146104a957610002565b61034060043560008181526001602090815260408083205481517ff905c15a0000000000000000000000000000000000000000000000000000000081529151600160a060020a03909116928392839263f905c15a92600483810193919291829003018189876161da5a03f1156100025750506040515195945050505050565b60408051602060248035600481810135601f810185900485028601850190965285855261029f9581359591946044949293909201918190840183828082843750949650505050505050600054600160a060020a0390811633909116146104f657610002565b61029f6004355b600080548190600160a060020a0390811633909116146105a457610002565b61029f60005433600160a060020a0390811691161461072957610002565b6102a1600435600081815260016020526040902054600160a060020a03166100b4565b005b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b820191906000526020600020905b81548152906001019060200180831161036057829003601f168201915b505050505090506100b4565b506000828152600160208181526040808420805473ffffffffffffffffffffffffffffffffffffffff191686179055600160a060020a038581168086526002909352818520805460ff191690941790935580517f1ab9075a0000000000000000000000000000000000000000000000000000000081523090931660048401525184939192631ab9075a926024828101939192829003018183876161da5a03f11561000257505060408051602081018690528082019290925243606083015260808083526003908301527f414444000000000000000000000000000000000000000000000000000000000060a0830152517f8ac68d4e97d65912f220b4c5f87978b8186320a5e378c1369850b5b5f90323d39181900360c00190a15b505050565b600083815260016020526040902054600160a060020a03838116911614156104d0576104a4565b600083815260016020526040812054600160a060020a031614610389576103898361023f565b600082815260036020908152604082208054845182855293839020919360026001831615610100026000190190921691909104601f90810184900483019391929186019083901061056a57805160ff19168380011785555b5061059a9291505b808211156105a05760008155600101610556565b8280016001018555821561054e579182015b8281111561054e57825182600050559160200191906001019061057c565b50505050565b5090565b600083815260016020526040812054600160a060020a031614156105c757610002565b50506000818152600160205260408082205481517fa7f437790000000000000000000000000000000000000000000000000000000081529151600160a060020a0391909116928392839263a7f4377992600483810193919291829003018183876161da5a03f11561000257505050600160005060008460001916815260200190815260200160002060006101000a815490600160a060020a0302191690556002600050600083600160a060020a0316815260200190815260200160002060006101000a81549060ff02191690557f8ac68d4e97d65912f220b4c5f87978b8186320a5e378c1369850b5b5f90323d383834360405180806020018560001916815260200184600160a060020a03168152602001838152602001828103825260038152602001807f44454c000000000000000000000000000000000000000000000000000000000081526020015060200194505050505060405180910390a1505050565b600054600160a060020a0316ff\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0684ac65a9fa32414dda56996f4183597d695987fdb82b145d722743891a6fe8\": \"0x0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690\",\n          \"0x1cd76f78169a420d99346e3501dd3e541622c38a226f9b63e01cfebc69879dc7\": \"0x000000000000000000000000b4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n          \"0x8e54a4494fe5da016bfc01363f4f6cdc91013bb5434bd2a4a3359f13a23afa2f\": \"0x000000000000000000000000cf00ffd997ad14939736f026006498e3f099baaf\",\n          \"0x94edf7f600ba56655fd65fca1f1424334ce369326c1dc3e53151dcd1ad06bc13\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n          \"0xbbee47108b275f55f98482c6800f6372165e88b0330d3f5dae6419df4734366c\": \"0x0000000000000000000000002a98c5f40bfa3dee83431103c535f6fae9a8ad38\",\n          \"0xd38c0c4e84de118cfdcc775130155d83b8bbaaf23dc7f3c83a626b10473213bd\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n          \"0xfb3aa5c655c2ec9d40609401f88d505d1da61afaa550e36ef5da0509ada257ba\": \"0x0000000000000000000000007986bad81f4cbd9317f5a46861437dae58d69113\"\n        }\n      },\n      \"0x3e9286eafa2db8101246c2131c09b49080d00690\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156100cf5760e060020a600035046302d05d3f81146100d7578063056d4470146100e957806316c66cc61461010c5780631ab9075a146101935780633ae1005c146101ce57806358541662146101fe5780635ed61af014610231578063644e3b791461025457806384dbac3b146102db578063949ae479146102fd5780639859387b14610321578063a7f4377914610340578063ab03fc261461035e578063e8161b7814610385578063e964d4e114610395578063f905c15a146103a5578063f92eb774146103ae575b6103be610002565b6103c0600054600160a060020a031681565b6103be6004356002546000908190600160a060020a031681141561040357610002565b6103dd60043560006108365b6040805160025460e360020a631c2d8fb30282527f636f6e747261637464620000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b6103be600435600254600160a060020a03166000148015906101c4575060025433600160a060020a03908116911614155b1561088d57610002565b6103be600435602435604435606435600254600090819081908190600160a060020a03168114156108af57610002565b6103c0600435602435604435606435608435600254600090819081908190600160a060020a03168114156110e857610002565b6103be6004356002546000908190600160a060020a03168114156115ec57610002565b6103c06004356000611b635b6040805160025460e360020a631c2d8fb30282527f6d61726b6574646200000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b6103be600435602435600254600160a060020a031660001415611bb557610002565b6103be600435602435600254600090600160a060020a0316811415611d2e57610002565b6103be600435600254600160a060020a031660001415611fc657610002565b6103be60025433600160a060020a0390811691161461207e57610002565b6103be600435602435604435600254600090600160a060020a031681141561208c57610002565b6103dd60043560006124b8610260565b6103c0600435600061250a610118565b6103f160035481565b6103f16004356000612561610260565b005b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061046557610002565b8291506104e55b6040805160025460e360020a631c2d8fb30282527f63706f6f6c00000000000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f115610002575050604051519150505b90565b600160a060020a031663b2206e6d83600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fb2206e6d0000000000000000000000000000000000000000000000000000000082526004820152600160a060020a038816602482015290516044808301935060209282900301816000876161da5a03f11561000257505060405151915061059b90506106ba565b600160a060020a031663d5b205ce83600160a060020a03166336da44686040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a636ad902e7028252600160a060020a0390811660048301526024820187905288166044820152905160648281019350600092829003018183876161da5a03f115610002575050506107355b6040805160025460e360020a631c2d8fb30282527f6c6f676d6772000000000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b50826120ee5b6040805160025460e360020a631c2d8fb30282527f6163636f756e7463746c0000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b600160a060020a0316630accce06600684600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6306db488d02825291519192899290916336da446891600482810192602092919082900301816000876161da5a03f1156100025750505060405180519060200150866040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050505050565b600160a060020a03166316c66cc6836040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f115610002575050604051519150505b919050565b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061091157610002565b87935061091c610260565b600160a060020a031663bdbdb08685600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fbdbdb0860000000000000000000000000000000000000000000000000000000082526004820152602481018a905290516044808301935060209282900301816000876161da5a03f1156100025750506040515193506109ca90506106ba565b600160a060020a03166381982a7a8885876040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f11561000257505050610a3661046c565b600160a060020a03166308636bdb85600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517f08636bdb000000000000000000000000000000000000000000000000000000008252600482015260248101889052604481019290925251606482810192602092919082900301816000876161da5a03f11561000257505060408051805160e160020a630a5d50db028252600482018190529151919450600160a060020a03871692506314baa1b6916024828101926000929190829003018183876161da5a03f11561000257505050610b3561046c565b600160a060020a0316630a3b6ede85600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a63051db76f0282526004820152600160a060020a038d16602482015290516044808301935060209282900301816000876161da5a03f115610002575050604051519150610bd590506106ba565b600160a060020a031663d5b205ce87838b6040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f11561000257505050610c41610118565b600160a060020a031663988db79c888a6040518360e060020a0281526004018083600160a060020a0316815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050610ca5610260565b600160a060020a031663f4f2821b896040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050610d6f5b6040805160025460e360020a631c2d8fb30282527f747261646564620000000000000000000000000000000000000000000000000060048301529151600092600160a060020a03169163e16c7d98916024828101926020929190829003018187876161da5a03f1156100025750506040515191506104e29050565b600160a060020a0316635f539d69896040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050610dc2610639565b600160a060020a0316630accce06600386600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6315b1ea01028252915191928e928e9263ad8f500891600482810192602092919082900301816000876161da5a03f11561000257505050604051805190602001506040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050610ec5610639565b600160a060020a0316630accce06600386600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6315b1ea01028252915191928e928d9263ad8f500891600482810192602092919082900301816000876161da5a03f11561000257505050604051805190602001506040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050610fc8610639565b600160a060020a031663645a3b7285600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060405151905061101e610260565b600160a060020a031663f92eb77488600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e260020a633e4baddd028252600482015290516024828101935060209282900301816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448381019360009350829003018183876161da5a03f115610002575050505050505050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061114a57610002565b604051600254600160a060020a0316908a908a908a908a908a90611579806125b38339018087600160a060020a0316815260200186600160a060020a03168152602001856000191681526020018481526020018381526020018281526020019650505050505050604051809103906000f092506111c5610118565b600160a060020a031663b9858a288a856040518360e060020a0281526004018083600160a060020a0316815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611229610260565b600160a060020a0316635188f99689856040518360e060020a028152600401808360001916815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611288610260565b600160a060020a031663bdbdb08689896040518360e060020a0281526004018083600019168152602001828152602001925050506020604051808303816000876161da5a03f1156100025750506040515192506112e590506106ba565b600160a060020a03166346d88e7d8a858a6040518460e060020a0281526004018084600160a060020a0316815260200183600160a060020a0316815260200182815260200193505050506000604051808303816000876161da5a03f115610002575050506113516106ba565b600160a060020a03166381982a7a8a84866040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f115610002575050506113bd61046c565b600160a060020a0316632b58469689856040518360e060020a028152600401808360001916815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f1156100025750505061141c61046c565b600160a060020a03166308636bdb8984866040518460e060020a028152600401808460001916815260200183815260200182600160a060020a0316815260200193505050506020604051808303816000876161da5a03f11561000257505060408051805160e160020a630a5d50db028252600482018190529151919350600160a060020a03861692506314baa1b6916024828101926000929190829003018183876161da5a03f115610002575050506114d3610639565b6040805160e160020a630566670302815260016004820152602481018b9052600160a060020a0386811660448301528c811660648301526000608483018190529251931692630accce069260a480840193919291829003018183876161da5a03f11561000257505050611544610639565b600160a060020a031663645a3b728961155b610260565b600160a060020a031663f92eb7748c6040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448084019360009350829003018183876161da5a03f1156100025750939a9950505050505050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061164e57610002565b82915061165961046c565b600160a060020a0316630a3b6ede83600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a63051db76f0282526004820152600160a060020a038816602482015290516044808301935060209282900301816000876161da5a03f1156100025750506040515191506116f990506106ba565b600160a060020a031663d5b205ce83600160a060020a03166336da44686040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a636ad902e7028252600160a060020a0390811660048301526024820187905288166044820152905160648281019350600092829003018183876161da5a03f1156100025750505061179b6106ba565b600160a060020a031663d653078983600160a060020a03166336da44686040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517ff1ff78a0000000000000000000000000000000000000000000000000000000008252915191929163f1ff78a09160048181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150866040518460e060020a0281526004018084600160a060020a0316815260200183815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f1156100025750505061189f610260565b600160a060020a031663f4f2821b846040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f115610002575050506118f2610118565b600160a060020a031663f4f2821b846040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050611945610639565b600160a060020a0316630accce06600484600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6306db488d02825291519192899290916336da44689181870191602091908190038801816000876161da5a03f115610002575050506040518051906020015060006040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f11561000257505050611a48610639565b600160a060020a031663645a3b7283600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050604051519050611a9e610260565b600160a060020a031663f92eb77486600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e260020a633e4baddd028252600482015290516024828101935060209282900301816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448381019360009350829003018183876161da5a03f11561000257505050505050565b600160a060020a03166381738c59836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750506040515191506108889050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f1156100025750506040515115159050611c1757610002565b611c1f610260565b600160a060020a03166338a699a4836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f11561000257505060405151159050611c7457610002565b611c7c610260565b600160a060020a0316632243118a836040518260e060020a02815260040180826000191681526020019150506000604051808303816000876161da5a03f11561000257505050611cca610639565b600160a060020a031663ae5f8080600184846040518460e060020a028152600401808481526020018360001916815260200182600160a060020a0316815260200193505050506000604051808303816000876161da5a03f115610002575050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f1156100025750506040515115159050611d9057610002565b5081611d9a610260565b600160a060020a031663581d5d6084846040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505050611df5610639565b600160a060020a0316630accce06600283600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e160020a630566670302825260048201949094526024810193909352600160a060020a038816604484015260006064840181905260848401819052905160a4808501949293509091829003018183876161da5a03f11561000257505050611eab610639565b600160a060020a031663645a3b7282600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050604051519050611f01610260565b600160a060020a031663f92eb77485600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e260020a633e4baddd028252600482015290516024828101935060209282900301816000876161da5a03f11561000257505060408051805160e060020a86028252600482019490945260248101939093525160448381019360009350829003018183876161da5a03f11561000257505050505050565b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061202857610002565b612030610118565b600160a060020a0316639859387b826040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f1156100025750505050565b600254600160a060020a0316ff5b6040805160025460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f11561000257505060405151151590506106b457610002565b600160a060020a031663d65307898383600160a060020a031663f1ff78a06040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fd6530789000000000000000000000000000000000000000000000000000000008252600160a060020a039485166004830152602482015292891660448401525160648381019360009350829003018183876161da5a03f115610002575050506121a5610118565b600160a060020a031663f4f2821b856040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f115610002575050506121f8610cf4565b600160a060020a031663f4f2821b856040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f1156100025750505061224b610639565b600160a060020a0316630accce06600583600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e360020a6306db488d028252915191928a9290916336da446891600482810192602092919082900301816000876161da5a03f1156100025750505060405180519060200150886040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f1156100025750505080600160a060020a031663ea71b02d6040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060405151600160a060020a031660001490506124b25761239f610639565b600160a060020a0316630accce06600583600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750506040805180517fea71b02d000000000000000000000000000000000000000000000000000000008252915191928a92909163ea71b02d91600482810192602092919082900301816000876161da5a03f1156100025750505060405180519060200150886040518660e060020a028152600401808681526020018560001916815260200184600160a060020a0316815260200183600160a060020a03168152602001828152602001955050505050506000604051808303816000876161da5a03f115610002575050505b50505050565b600160a060020a03166338a699a4836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f1156100025750506040515191506108889050565b600160a060020a031663213fe2b7836040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515191506108889050565b600160a060020a031663f92eb774836040518260e060020a02815260040180826000191681526020019150506020604051808303816000876161da5a03f115610002575050604051519150610888905056606060405260405160c08061157983396101206040819052825160805160a051935160e0516101005160008054600160a060020a03199081163317909155600180546005805484168817905560048a90556006869055600b8590556008849055909116861760a060020a60ff02191690554360038190556002558686526101408390526101608190529396929594919390929091600160a060020a033016917f76885d242fb71c6f74a7e717416e42eff4d96faf54f6de75c6a0a6bbd8890c6b91a230600160a060020a03167fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff600b600050546040518082815260200191505060405180910390a250505050505061145e8061011b6000396000f3606060405236156101745760e060020a600035046302d05d3f811461017c57806304a7fdbc1461018e5780630e90f957146101fb5780630fb5a6b41461021257806314baa1b61461021b57806317fc45e21461023a5780632b096926146102435780632e94420f1461025b578063325a19f11461026457806336da44681461026d5780633f81a2c01461027f5780633fc306821461029757806345ecd3d7146102d45780634665096d146102dd5780634e71d92d146102e657806351a34eb8146103085780636111bb951461032d5780636f265b93146103445780637e9014e11461034d57806390ba009114610360578063927df5e014610393578063a7f437791461046c578063ad8f50081461046e578063bc6d909414610477578063bdec3ad114610557578063c19d93fb1461059a578063c9503fe2146105ad578063e0a73a93146105b6578063ea71b02d146105bf578063ea8a1af0146105d1578063ee4a96f9146105f3578063f1ff78a01461065c575b61046c610002565b610665600054600160a060020a031681565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600554600090600160a060020a0390811633909116146106a857610002565b61068260015460a060020a900460ff166000145b90565b61069660085481565b61046c600435600154600160a060020a03166000141561072157610002565b610696600d5481565b610696600435600f8160068110156100025750015481565b61069660045481565b61069660035481565b610665600554600160a060020a031681565b61069660043560158160068110156100025750015481565b6106966004355b600b54600f5460009160028202808203928083039290810191018386101561078357601054840186900394505b50505050919050565b61069660025481565b61069660095481565b61046c600554600090600160a060020a03908116339091161461085857610002565b61046c600435600554600090600160a060020a03908116339091161461092e57610002565b6106826001805460a060020a900460ff161461020f565b610696600b5481565b61068260075460a060020a900460ff1681565b6106966004355b600b54601554600091600282028082039280830392908101910183861015610a6c5760165494506102cb565b61046c6004356024356044356040805160015460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b02600483015291516000928392600160a060020a03919091169163e16c7d9891602481810192602092909190829003018187876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610b4657610002565b005b610696600a5481565b61046c60006000600060006000600160009054906101000a9004600160a060020a0316600160a060020a031663e16c7d986040518160e060020a028152600401808060b260020a691858d8dbdd5b9d18dd1b0281526020015060200190506020604051808303816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f1757610002565b61046c5b60015b60058160ff16101561071e57600f6001820160ff166006811015610002578101549060ff83166006811015610002570154101561129057610002565b61069660015460a060020a900460ff1681565b61069660065481565b610696600c5481565b610665600754600160a060020a031681565b61046c600554600090600160a060020a0390811633909116146112c857610002565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600154600090600160a060020a03168114156113fb57610002565b610696600e5481565b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060005b60068160ff16101561070857828160ff166006811015610002576020020151600f60ff831660068110156100025701558160ff82166006811015610002576020020151601560ff831660068110156100025701556001016106ac565b61071061055b565b505050565b600e8054820190555b50565b6040805160015460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061071557610002565b83861015801561079257508286105b156107b457600f546010546011548689039082030291909104900394506102cb565b8286101580156107c55750600b5486105b156107e757600f546011546012548589039082030291909104900394506102cb565b600b5486108015906107f857508186105b1561081d57600b54600f546012546013549289039281039290920204900394506102cb565b81861015801561082c57508086105b1561084e57600f546013546014548489039082030291909104900394506102cb565b60145494506102cb565b60015460a060020a900460ff1660001461087157610002565b600254600a01431161088257610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663771d50e16040518160e060020a0281526004018090506000604051808303816000876161da5a03f1156100025750505050565b60015460a060020a900460ff1660001461094757610002565b600254600a01431161095857610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180517f51a34eb8000000000000000000000000000000000000000000000000000000008252600482018690529151919350600160a060020a03841692506351a34eb8916024808301926000929190829003018183876161da5a03f11561000257505050600b8290554360025560408051838152905130600160a060020a0316917fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff919081900360200190a25050565b838610158015610a7b57508286105b15610a9d576015546016546017548689039082900302919091040194506102cb565b828610158015610aae5750600b5486105b15610ad0576015546017546018548589039082900302919091040194506102cb565b600b548610801590610ae157508186105b15610b0657600b546015546018546019549289039281900392909202040194506102cb565b818610158015610b1557508086105b15610b3757601554601954601a548489039082900302919091040194506102cb565b601a54860181900394506102cb565b60015460a060020a900460ff16600014610b5f57610002565b6001805460a060020a60ff02191660a060020a17908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919450600160a060020a038516925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604080518051600a556005547ffebf661200000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015216602482015260448101879052905163febf661291606480820192600092909190829003018183876161da5a03f115610002575050508215610cc7576007805473ffffffffffffffffffffffffffffffffffffffff191633179055610dbb565b6040805160055460065460e060020a63599efa6b028352600160a060020a039182166004840152602483015291519184169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050604080516006547f56ccb6f000000000000000000000000000000000000000000000000000000000825233600160a060020a03166004830152602482015290516356ccb6f091604480820192600092909190829003018183876161da5a03f115610002575050600580546007805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551633179055505b6007805460a060020a60ff02191660a060020a87810291909117918290556008544301600955900460ff1615610df757600a54610e039061029e565b600a54610e0b90610367565b600c55610e0f565b600c555b600c54670de0b6b3a7640000850204600d55600754600554604080517f759297bb000000000000000000000000000000000000000000000000000000008152600160a060020a039384166004820152918316602483015260448201879052519184169163759297bb91606481810192600092909190829003018183876161da5a03f11561000257505060408051600754600a54600d54600554600c5460a060020a850460ff161515865260208601929092528486019290925260608401529251600160a060020a0391821694509281169230909116917f3b3d1986083d191be01d28623dc19604728e29ae28bdb9ba52757fdee1a18de2919081900360800190a45050505050565b600954431015610f2657610002565b6001805460a060020a900460ff1614610f3e57610002565b6001805460a060020a60ff0219167402000000000000000000000000000000000000000017908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919750600160a060020a038816925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604051516007549095506000945060a060020a900460ff1615905061105c57600a5484111561105757600a54600d54670de0b6b3a7640000918603020492505b61107e565b600a5484101561107e57600a54600d54670de0b6b3a764000091869003020492505b60065483111561108e5760065492505b6006548390039150600083111561111857604080516005546007547f5928d37f000000000000000000000000000000000000000000000000000000008352600160a060020a0391821660048401528116602483015260448201869052915191871691635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505b600082111561117a576040805160055460e060020a63599efa6b028252600160a060020a0390811660048301526024820185905291519187169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050505b6040805185815260208101849052808201859052905130600160a060020a0316917f89e690b1d5aaae14f3e85f108dc92d9ab3763a58d45aed8b59daedbbae8fe794919081900360600190a260008311156112285784600160a060020a0316634cc927d785336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611282565b84600160a060020a0316634cc927d7600a60005054336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f115610002575050505b600054600160a060020a0316ff5b60156001820160ff166006811015610002578101549060ff8316600681101561000257015411156112c057610002565b60010161055e565b60015460a060020a900460ff166000146112e157610002565b600254600a0143116112f257610002565b6001546040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f11561000257505060408051805160055460065460e060020a63599efa6b028452600160a060020a03918216600485015260248401529251909450918416925063599efa6b916044808301926000929190829003018183876161da5a03f1156100025750505080600160a060020a0316632b68bb2d6040518160e060020a0281526004018090506000604051808303816000876161da5a03f115610002575050600054600160a060020a03169050ff5b6001546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602480830192602092919082900301816000876161da5a03f11561000257505060405151151590506106a85761000256\",\n        \"nonce\": \"16\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000002\": \"0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396\"\n        }\n      },\n      \"0x70c9217d814985faef62b124420f8dfbddd96433\": {\n        \"balance\": \"0x4ef436dcbda6cd4a\",\n        \"code\": \"0x\",\n        \"nonce\": \"1634\",\n        \"storage\": {}\n      },\n      \"0x7986bad81f4cbd9317f5a46861437dae58d69113\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x6060604052361561008d5760e060020a600035046302d05d3f811461009557806316c66cc6146100a75780631ab9075a146100d7578063213fe2b7146101125780639859387b1461013f578063988db79c1461015e578063a7f4377914610180578063b9858a281461019e578063c8e40fbf146101c0578063f4f2821b146101e8578063f905c15a14610209575b610212610002565b610214600054600160a060020a031681565b600160a060020a0360043581811660009081526005602052604081205461023193168114610257575060016101e3565b610212600435600254600160a060020a0316600014801590610108575060025433600160a060020a03908116911614155b1561025f57610002565b610214600435600160a060020a03811660009081526004602052604081205460ff16151561027557610002565b610212600435600254600160a060020a03166000141561029b57610002565b610212600435602435600254600160a060020a03166000141561050457610002565b61021260025433600160a060020a0390811691161461056757610002565b610212600435602435600254600160a060020a03166000141561057557610002565b610231600435600160a060020a03811660009081526004602052604090205460ff165b919050565b610212600435600254600090600160a060020a031681141561072057610002565b61024560035481565b005b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060006101e3565b60028054600160a060020a031916821790555b50565b50600160a060020a038181166000908152600460205260409020546101009004166101e3565b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f11561000257505060405151151590506102fe57610002565b600160a060020a03811660009081526004602052604090205460ff161515610272576040516104028061092e833901809050604051809103906000f06004600050600083600160a060020a0316815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555060016004600050600083600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555050565b600160a060020a03821660009081526004602052604090205460ff1615156104725760405161040280610d30833901809050604051809103906000f06004600050600084600160a060020a0316815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555060016004600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff021916908302179055505b600160a060020a03828116600090815260046020819052604080518184205460e060020a630a3b0a4f02825286861693820193909352905161010090920490931692630a3b0a4f926024828101939192829003018183876161da5a03f11561000257505050600160a060020a03811660009081526006602052604090208054600160a060020a031916831790555b5050565b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f11561000257505060405151151590506103b957610002565b600254600160a060020a0316ff5b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f11561000257505060405151151590506105d857610002565b600160a060020a03821660009081526004602052604090205460ff1615156106915760405161040280611132833901809050604051809103906000f06004600050600084600160a060020a0316815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555060016004600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff021916908302179055505b600160a060020a03828116600090815260046020819052604080518184205460e060020a630a3b0a4f02825286861693820193909352905161010090920490931692630a3b0a4f926024828101939192829003018183876161da5a03f11561000257505050600160a060020a031660009081526005602052604090208054600160a060020a0319169091179055565b6002546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602482810192602092919082900301816000876161da5a03f115610002575050604051511515905061078357610002565b50600160a060020a0381811660009081526005602090815260408083205490931680835260049091529190205460ff161561080f576040600081812054825160e260020a632e72bafd028152600160a060020a03868116600483015293516101009092049093169263b9caebf4926024828101939192829003018183876161da5a03f115610002575050505b600160a060020a03828116600090815260056020526040812054909116146108545760406000908120600160a060020a0384169091528054600160a060020a03191690555b50600160a060020a0381811660009081526006602090815260408083205490931680835260049091529190205460ff16156108e657600160a060020a038181166000908152604080518183205460e260020a632e72bafd028252868516600483015291516101009092049093169263b9caebf4926024828101939192829003018183876161da5a03f115610002575050505b600160a060020a03828116600090815260066020526040812054909116146105005760406000908120600160a060020a0384169091528054600160a060020a0319169055505056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056\",\n        \"nonce\": \"7\",\n        \"storage\": {\n          \"0xffc4df2d4f3d2cffad590bed6296406ab7926ca9e74784f74a95191fa069a174\": \"0x00000000000000000000000070c9217d814985faef62b124420f8dfbddd96433\"\n        }\n      },\n      \"0xb4fe7aa695b326c9d219158d2ca50db77b39f99f\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156100ae5760e060020a600035046302d05d3f81146100b65780631ab9075a146100c85780632b68bb2d146101035780634cc927d7146101c557806351a34eb81461028e57806356ccb6f0146103545780635928d37f1461041d578063599efa6b146104e9578063759297bb146105b2578063771d50e11461067e578063a7f4377914610740578063f905c15a1461075e578063f92eb77414610767578063febf661214610836575b610902610002565b610904600054600160a060020a031681565b610902600435600254600160a060020a03166000148015906100f9575060025433600160a060020a03908116911614155b1561092057610002565b60025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b02606452610902916000918291600160a060020a03169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f115610002575050604051511515905061094257610002565b61090260043560243560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610a0d57610002565b61090260043560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610ae957610002565b61090260043560243560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610bbc57610002565b61090260043560243560443560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610c9657610002565b61090260043560243560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610de057610002565b61090260043560243560443560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610ebb57610002565b60025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b02606452610902916000918291600160a060020a03169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f9e57610002565b61090260025433600160a060020a0390811691161461106957610002565b61090e60035481565b61090e60043560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750506040805180517ff92eb774000000000000000000000000000000000000000000000000000000008252600482018790529151919350600160a060020a038416925063f92eb774916024828101926020929190829003018188876161da5a03f11561000257505060405151949350505050565b61090260043560243560443560025460e360020a631c2d8fb302606090815260aa60020a6a18dbdb9d1c9858dd18dd1b026064526000918291600160a060020a039091169063e16c7d989060849060209060248187876161da5a03f1156100025750505060405180519060200150905080600160a060020a03166316c66cc6336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f115610002575050604051511515905061107757610002565b005b6060908152602090f35b60408051918252519081900360200190f35b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f5ed61af000000000000000000000000000000000000000000000000000000000825233600160a060020a039081166004840152925190959286169350635ed61af092602483810193919291829003018183876161da5a03f115610002575050505050565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517fab03fc2600000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015260248301899052808816604484015292519095928616935063ab03fc2692606483810193919291829003018183876161da5a03f1156100025750505050505050565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f949ae47900000000000000000000000000000000000000000000000000000000825233600160a060020a0390811660048401526024830188905292519095928616935063949ae47992604483810193919291829003018183876161da5a03f11561000257505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f46d88e7d000000000000000000000000000000000000000000000000000000008252600160a060020a0380891660048401523381166024840152604483018890529251909592861693506346d88e7d92606483810193919291829003018183876161da5a03f1156100025750505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f5315cdde00000000000000000000000000000000000000000000000000000000825233600160a060020a039081166004840152808a16602484015260448301889052925190959286169350635315cdde92606483810193919291829003018183876161da5a03f115610002575050604080517f5928d37f00000000000000000000000000000000000000000000000000000000815233600160a060020a03908116600483015287166024820152604481018690529051635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517fe68e401c00000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015280891660248401526044830188905292519095928616935063e68e401c92606483810193919291829003018183876161da5a03f1156100025750505050505050565b6040805160025460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f5152f381000000000000000000000000000000000000000000000000000000008252600160a060020a03808a1660048401528089166024840152604483018890523381166064840152925190959286169350635152f38192608483810193919291829003018183876161da5a03f115610002575050505050505050565b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f056d447000000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015292519095928616935063056d447092602483810193919291829003018183876161da5a03f115610002575050505050565b600254600160a060020a0316ff5b6040805160025460e360020a631c2d8fb302825260aa60020a6a18dbdb9d1c9858dd18dd1b0260048301529151600160a060020a03929092169163e16c7d9891602481810192602092909190829003018188876161da5a03f1156100025750506040805180517f3ae1005c00000000000000000000000000000000000000000000000000000000825233600160a060020a039081166004840152808a166024840152808916604484015260648301889052925190959286169350633ae1005c92608483810193919291829003018183876161da5a03f11561000257505050505050505056\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000002\": \"0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396\"\n        }\n      },\n      \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156101745760e060020a600035046302d05d3f811461017c57806304a7fdbc1461018e5780630e90f957146101fb5780630fb5a6b41461021257806314baa1b61461021b57806317fc45e21461023a5780632b096926146102435780632e94420f1461025b578063325a19f11461026457806336da44681461026d5780633f81a2c01461027f5780633fc306821461029757806345ecd3d7146102d45780634665096d146102dd5780634e71d92d146102e657806351a34eb8146103085780636111bb951461032d5780636f265b93146103445780637e9014e11461034d57806390ba009114610360578063927df5e014610393578063a7f437791461046c578063ad8f50081461046e578063bc6d909414610477578063bdec3ad114610557578063c19d93fb1461059a578063c9503fe2146105ad578063e0a73a93146105b6578063ea71b02d146105bf578063ea8a1af0146105d1578063ee4a96f9146105f3578063f1ff78a01461065c575b61046c610002565b610665600054600160a060020a031681565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600554600090600160a060020a0390811633909116146106a857610002565b61068260015460a060020a900460ff166000145b90565b61069660085481565b61046c600435600154600160a060020a03166000141561072157610002565b610696600d5481565b610696600435600f8160068110156100025750015481565b61069660045481565b61069660035481565b610665600554600160a060020a031681565b61069660043560158160068110156100025750015481565b6106966004355b600b54600f5460009160028202808203928083039290810191018386101561078357601054840186900394505b50505050919050565b61069660025481565b61069660095481565b61046c600554600090600160a060020a03908116339091161461085857610002565b61046c600435600554600090600160a060020a03908116339091161461092e57610002565b6106826001805460a060020a900460ff161461020f565b610696600b5481565b61068260075460a060020a900460ff1681565b6106966004355b600b54601554600091600282028082039280830392908101910183861015610a6c5760165494506102cb565b61046c6004356024356044356040805160015460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b02600483015291516000928392600160a060020a03919091169163e16c7d9891602481810192602092909190829003018187876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610b4657610002565b005b610696600a5481565b61046c60006000600060006000600160009054906101000a9004600160a060020a0316600160a060020a031663e16c7d986040518160e060020a028152600401808060b260020a691858d8dbdd5b9d18dd1b0281526020015060200190506020604051808303816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f1757610002565b61046c5b60015b60058160ff16101561071e57600f6001820160ff166006811015610002578101549060ff83166006811015610002570154101561129057610002565b61069660015460a060020a900460ff1681565b61069660065481565b610696600c5481565b610665600754600160a060020a031681565b61046c600554600090600160a060020a0390811633909116146112c857610002565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600154600090600160a060020a03168114156113fb57610002565b610696600e5481565b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060005b60068160ff16101561070857828160ff166006811015610002576020020151600f60ff831660068110156100025701558160ff82166006811015610002576020020151601560ff831660068110156100025701556001016106ac565b61071061055b565b505050565b600e8054820190555b50565b6040805160015460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061071557610002565b83861015801561079257508286105b156107b457600f546010546011548689039082030291909104900394506102cb565b8286101580156107c55750600b5486105b156107e757600f546011546012548589039082030291909104900394506102cb565b600b5486108015906107f857508186105b1561081d57600b54600f546012546013549289039281039290920204900394506102cb565b81861015801561082c57508086105b1561084e57600f546013546014548489039082030291909104900394506102cb565b60145494506102cb565b60015460a060020a900460ff1660001461087157610002565b600254600a01431161088257610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663771d50e16040518160e060020a0281526004018090506000604051808303816000876161da5a03f1156100025750505050565b60015460a060020a900460ff1660001461094757610002565b600254600a01431161095857610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180517f51a34eb8000000000000000000000000000000000000000000000000000000008252600482018690529151919350600160a060020a03841692506351a34eb8916024808301926000929190829003018183876161da5a03f11561000257505050600b8290554360025560408051838152905130600160a060020a0316917fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff919081900360200190a25050565b838610158015610a7b57508286105b15610a9d576015546016546017548689039082900302919091040194506102cb565b828610158015610aae5750600b5486105b15610ad0576015546017546018548589039082900302919091040194506102cb565b600b548610801590610ae157508186105b15610b0657600b546015546018546019549289039281900392909202040194506102cb565b818610158015610b1557508086105b15610b3757601554601954601a548489039082900302919091040194506102cb565b601a54860181900394506102cb565b60015460a060020a900460ff16600014610b5f57610002565b6001805460a060020a60ff02191660a060020a17908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919450600160a060020a038516925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604080518051600a556005547ffebf661200000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015216602482015260448101879052905163febf661291606480820192600092909190829003018183876161da5a03f115610002575050508215610cc7576007805473ffffffffffffffffffffffffffffffffffffffff191633179055610dbb565b6040805160055460065460e060020a63599efa6b028352600160a060020a039182166004840152602483015291519184169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050604080516006547f56ccb6f000000000000000000000000000000000000000000000000000000000825233600160a060020a03166004830152602482015290516356ccb6f091604480820192600092909190829003018183876161da5a03f115610002575050600580546007805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551633179055505b6007805460a060020a60ff02191660a060020a87810291909117918290556008544301600955900460ff1615610df757600a54610e039061029e565b600a54610e0b90610367565b600c55610e0f565b600c555b600c54670de0b6b3a7640000850204600d55600754600554604080517f759297bb000000000000000000000000000000000000000000000000000000008152600160a060020a039384166004820152918316602483015260448201879052519184169163759297bb91606481810192600092909190829003018183876161da5a03f11561000257505060408051600754600a54600d54600554600c5460a060020a850460ff161515865260208601929092528486019290925260608401529251600160a060020a0391821694509281169230909116917f3b3d1986083d191be01d28623dc19604728e29ae28bdb9ba52757fdee1a18de2919081900360800190a45050505050565b600954431015610f2657610002565b6001805460a060020a900460ff1614610f3e57610002565b6001805460a060020a60ff0219167402000000000000000000000000000000000000000017908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919750600160a060020a038816925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604051516007549095506000945060a060020a900460ff1615905061105c57600a5484111561105757600a54600d54670de0b6b3a7640000918603020492505b61107e565b600a5484101561107e57600a54600d54670de0b6b3a764000091869003020492505b60065483111561108e5760065492505b6006548390039150600083111561111857604080516005546007547f5928d37f000000000000000000000000000000000000000000000000000000008352600160a060020a0391821660048401528116602483015260448201869052915191871691635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505b600082111561117a576040805160055460e060020a63599efa6b028252600160a060020a0390811660048301526024820185905291519187169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050505b6040805185815260208101849052808201859052905130600160a060020a0316917f89e690b1d5aaae14f3e85f108dc92d9ab3763a58d45aed8b59daedbbae8fe794919081900360600190a260008311156112285784600160a060020a0316634cc927d785336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611282565b84600160a060020a0316634cc927d7600a60005054336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f115610002575050505b600054600160a060020a0316ff5b60156001820160ff166006811015610002578101549060ff8316600681101561000257015411156112c057610002565b60010161055e565b60015460a060020a900460ff166000146112e157610002565b600254600a0143116112f257610002565b6001546040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f11561000257505060408051805160055460065460e060020a63599efa6b028452600160a060020a03918216600485015260248401529251909450918416925063599efa6b916044808301926000929190829003018183876161da5a03f1156100025750505080600160a060020a0316632b68bb2d6040518160e060020a0281526004018090506000604051808303816000876161da5a03f115610002575050600054600160a060020a03169050ff5b6001546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602480830192602092919082900301816000876161da5a03f11561000257505060405151151590506106a85761000256\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000001\": \"0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000002\": \"0x0000000000000000000000000000000000000000000000000000000000006195\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000004\": \"0x5842545553440000000000000000000000000000000000000000000000000000\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000005\": \"0x00000000000000000000000070c9217d814985faef62b124420f8dfbddd96433\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000006\": \"0x0000000000000000000000000000000000000000000000008ac7230489e80000\",\n          \"0x000000000000000000000000000000000000000000000000000000000000000b\": \"0x0000000000000000000000000000000000000000000000283c7b9181eca20000\"\n        }\n      },\n      \"0xcf00ffd997ad14939736f026006498e3f099baaf\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156100cf5760e060020a600035046302d05d3f81146100d7578063031e7f5d146100e95780631ab9075a1461010b5780632243118a1461014657806327aad68a1461016557806338a699a4146101da5780635188f996146101f8578063581d5d601461021e57806381738c5914610246578063977da54014610269578063a07421ce14610288578063a7f43779146102be578063bdbdb086146102dc578063e1c7111914610303578063f4f2821b14610325578063f905c15a1461034a578063f92eb77414610353575b610387610002565b610389600054600160a060020a031681565b610387600435602435600254600160a060020a0316600014156103a857610002565b610387600435600254600160a060020a031660001480159061013c575060025433600160a060020a03908116911614155b1561042957610002565b610387600435600254600160a060020a03166000141561044b57610002565b6102ac60043560008181526004602081815260408320547f524d81d3000000000000000000000000000000000000000000000000000000006060908152610100909104600160a060020a031692839263524d81d3926064928188876161da5a03f1156100025750506040515192506103819050565b61039c60043560008181526004602052604090205460ff165b919050565b6103876004356024356002546000908190600160a060020a031681141561079457610002565b61038760043560243560025460009081908190600160a060020a031681141561080457610002565b61038960043560008181526004602052604081205460ff1615156109e357610002565b610387600435600254600160a060020a0316600014156109fb57610002565b600435600090815260096020526040902054670de0b6b3a764000090810360243502045b60408051918252519081900360200190f35b61038760025433600160a060020a03908116911614610a9257610002565b600435600090815260086020526040902054670de0b6b3a7640000602435909102046102ac565b610387600435602435600254600160a060020a031660001415610aa057610002565b61038760043560025460009081908190600160a060020a0316811415610b3657610002565b6102ac60035481565b6102ac600435600081815260076020908152604080832054600690925290912054670de0b6b3a76400000204805b50919050565b005b600160a060020a03166060908152602090f35b15156060908152602090f35b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f11561000257505060405151151590506103fe57610002565b60008281526004602052604090205460ff16151561041b57610002565b600860205260406000205550565b6002805473ffffffffffffffffffffffffffffffffffffffff19168217905550565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f11561000257505060405151151590506104a157610002565b604080516000838152600460205291909120805460ff1916600117905561040280610de2833901809050604051809103906000f0600460005060008360001916815260200190815260200160002060005060000160016101000a815481600160a060020a030219169083021790555066470de4df8200006008600050600083600019168152602001908152602001600020600050819055506703782dace9d9000060096000506000836000191681526020019081526020016000206000508190555050565b600460005060008560001916815260200190815260200160002060005060000160019054906101000a9004600160a060020a0316915081600160a060020a031663524d81d36040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060405151821415905061060057838152600660209081526040808320839055600790915281208190555b81600160a060020a0316630a3b0a4f846040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f11561000257505050600160a060020a038316808252600560209081526040808420879055805160e160020a6364a81ff102815290518694670de0b6b3a7640000949363c9503fe29360048181019492939183900301908290876161da5a03f11561000257505060408051805160e060020a636f265b930282529151919291636f265b939160048181019260209290919082900301816000876161da5a03f11561000257505050604051805190602001500204600660005060008660001916815260200190815260200160002060008282825054019250508190555080600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050506040518051906020015060076000506000866000191681526020019081526020016000206000828282505401925050819055505b50505050565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b9060849060209060248187876161da5a03f11561000257505060405151151590506107e957610002565b8381526004602052604081205460ff16151561056657610002565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b9060849060209060248187876161da5a03f115610002575050604051511515905061085957610002565b849250670de0b6b3a764000083600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575060408051805160e160020a6364a81ff102825291519189028590049650600481810192602092909190829003018188876161da5a03f11561000257505060408051805160e060020a636f265b930282529151919291636f265b9391600481810192602092909190829003018189876161da5a03f115610002575050506040518051906020015002049050806006600050600085600160a060020a0316632e94420f6040518160e060020a0281526004018090506020604051808303816000876161da5a03f1156100025750604080518051855260208681528286208054989098039097557f2e94420f00000000000000000000000000000000000000000000000000000000815290518896600483810193919291829003018187876161da5a03f115610002575050604080515183526020939093525020805490910190555050505050565b60409020546101009004600160a060020a03166101f3565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f1156100025750506040515115159050610a5157610002565b60008181526004602052604090205460ff161515610a6e57610002565b6040600020805474ffffffffffffffffffffffffffffffffffffffffff1916905550565b600254600160a060020a0316ff5b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b906084906020906024816000876161da5a03f1156100025750506040515115159050610af657610002565b60008281526004602052604090205460ff161515610b1357610002565b670de0b6b3a7640000811115610b2857610002565b600960205260406000205550565b60025460e060020a6313bc6d4b02606090815233600160a060020a03908116606452909116906313bc6d4b9060849060209060248187876161da5a03f1156100025750506040515115159050610b8b57610002565b600160a060020a038416815260056020908152604080832054808452600490925282205490935060ff161515610bc057610002565b600460005060008460001916815260200190815260200160002060005060000160019054906101000a9004600160a060020a0316915081600160a060020a031663b9caebf4856040518260e060020a0281526004018082600160a060020a031681526020019150506000604051808303816000876161da5a03f115610002575050506005600050600085600160a060020a0316815260200190815260200160002060005060009055839050600082600160a060020a031663524d81d36040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050604051519190911115905061078e57670de0b6b3a764000081600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f11561000257505060408051805160e060020a636f265b930282529151919291636f265b939160048181019260209290919082900301816000876161da5a03f11561000257505050604051805190602001500204600660005060008560001916815260200190815260200160002060008282825054039250508190555080600160a060020a031663c9503fe26040518160e060020a0281526004018090506020604051808303816000876161da5a03f115610002575050506040518051906020015060076000506000856000191681526020019081526020016000206000828282505403925050819055505050505056606060405260008054600160a060020a031916331790556103de806100246000396000f3606060405236156100615760e060020a600035046302d05d3f81146100695780630a3b0a4f1461007b5780630d327fa7146100f6578063524d81d314610109578063a7f4377914610114578063b9caebf414610132578063bbec3bae14610296575b6102ce610002565b6102d0600054600160a060020a031681565b6102ce600435600254600090600160a060020a03168114156102ed5760028054600160a060020a03199081168417808355600160a060020a03808616855260036020526040852060018101805493831694909316939093179091559154815461010060a860020a031916921661010002919091179055610372565b6102d0600254600160a060020a03165b90565b6102e3600154610106565b6102ce60005433600160a060020a039081169116146103c657610002565b6102ce600435600160a060020a038116600090815260036020526040812054819060ff16801561016457506001548190115b1561029157506040808220600180820154915461010090819004600160a060020a039081168087528587209093018054600160a060020a031916948216948517905583865293909420805461010060a860020a03191694820294909417909355600254909190811690841614156101e85760028054600160a060020a031916821790555b600254600160a060020a0390811690841614156102105760028054600160a060020a03191690555b6003600050600084600160a060020a0316815260200190815260200160002060006000820160006101000a81549060ff02191690556000820160016101000a815490600160a060020a0302191690556001820160006101000a815490600160a060020a03021916905550506001600081815054809291906001900391905055505b505050565b600160a060020a036004358181166000908152600360205260408120600101546002546102d09491821691168114156103d4576103d8565b005b600160a060020a03166060908152602090f35b6060908152602090f35b60028054600160a060020a03908116835260036020526040808420805461010060a860020a0319808216610100808a029190911790935590829004841680875283872060019081018054600160a060020a03199081168b179091559654868a168952949097209687018054949095169390951692909217909255835416908202179091555b60016003600050600084600160a060020a0316815260200190815260200160002060005060000160006101000a81548160ff0219169083021790555060016000818150548092919060010191905055505050565b600054600160a060020a0316ff5b8091505b5091905056\",\n        \"nonce\": \"3\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000002\": \"0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396\",\n          \"0x3571d73f14f31a1463bd0a2f92f7fde1653d4e1ead7aedf4b0a5df02f16092ab\": \"0x0000000000000000000000000000000000000000000007d634e4c55188be0000\",\n          \"0x4e64fe2d1b72d95a0a31945cc6e4f4e524ac5ad56d6bd44a85ec7bc9cc0462c0\": \"0x000000000000000000000000000000000000000000000002b5e3af16b1880000\"\n        }\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"117124093\",\n    \"extraData\": \"0xd5830105008650617269747986312e31322e31826d61\",\n    \"gasLimit\": \"4707788\",\n    \"hash\": \"0xad325e4c49145fb7a4058a68ac741cc8607a71114e23fc88083c7e881dd653e7\",\n    \"miner\": \"0x00714b9ac97fd6bd9325a059a70c9b9fa94ce050\",\n    \"mixHash\": \"0x0af918f65cb4af04b608fc1f14a849707696986a0e7049e97ef3981808bcc65f\",\n    \"nonce\": \"0x38dee147326a8d40\",\n    \"number\": \"25000\",\n    \"stateRoot\": \"0xc5d6bbcd46236fcdcc80b332ffaaa5476b980b01608f9708408cfef01b58bd5b\",\n    \"timestamp\": \"1479891517\",\n    \"totalDifficulty\": \"1895410389427\"\n  },\n  \"input\": \"0xf88b8206628504a817c8008303d09094c212e03b9e060e36facad5fd8f4435412ca22e6b80a451a34eb80000000000000000000000000000000000000000000000280faf689c35ac00002aa0a7ee5b7877811bf671d121b40569462e722657044808dc1d6c4f1e4233ec145ba0417e7543d52b65738d9df419cbe40a708424f4d54b0fc145c0a64545a2bb1065\",\n  \"result\": {\n    \"calls\": [\n      {\n        \"from\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n        \"gas\": \"0x31217\",\n        \"gasUsed\": \"0x334\",\n        \"input\": \"0xe16c7d98636f6e7472616374617069000000000000000000000000000000000000000000\",\n        \"output\": \"0x000000000000000000000000b4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n        \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n        \"type\": \"CALL\",\n        \"value\": \"0x0\"\n      },\n      {\n        \"calls\": [\n          {\n            \"from\": \"0xb4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n            \"gas\": \"0x2a68d\",\n            \"gasUsed\": \"0x334\",\n            \"input\": \"0xe16c7d98636f6e747261637463746c000000000000000000000000000000000000000000\",\n            \"output\": \"0x0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690\",\n            \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n            \"type\": \"CALL\",\n            \"value\": \"0x0\"\n          },\n          {\n            \"calls\": [\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x23ac9\",\n                \"gasUsed\": \"0x334\",\n                \"input\": \"0xe16c7d98636f6e7472616374646200000000000000000000000000000000000000000000\",\n                \"output\": \"0x0000000000000000000000007986bad81f4cbd9317f5a46861437dae58d69113\",\n                \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x23366\",\n                \"gasUsed\": \"0x273\",\n                \"input\": \"0x16c66cc6000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n                \"to\": \"0x7986bad81f4cbd9317f5a46861437dae58d69113\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              }\n            ],\n            \"from\": \"0xb4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n            \"gas\": \"0x29f35\",\n            \"gasUsed\": \"0xf8d\",\n            \"input\": \"0x16c66cc6000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b\",\n            \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n            \"to\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n            \"type\": \"CALL\",\n            \"value\": \"0x0\"\n          },\n          {\n            \"from\": \"0xb4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n            \"gas\": \"0x28a9e\",\n            \"gasUsed\": \"0x334\",\n            \"input\": \"0xe16c7d98636f6e747261637463746c000000000000000000000000000000000000000000\",\n            \"output\": \"0x0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690\",\n            \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n            \"type\": \"CALL\",\n            \"value\": \"0x0\"\n          },\n          {\n            \"calls\": [\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x21d79\",\n                \"gasUsed\": \"0x24d\",\n                \"input\": \"0x13bc6d4b000000000000000000000000b4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n                \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n                \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x2165b\",\n                \"gasUsed\": \"0x334\",\n                \"input\": \"0xe16c7d986d61726b65746462000000000000000000000000000000000000000000000000\",\n                \"output\": \"0x000000000000000000000000cf00ffd997ad14939736f026006498e3f099baaf\",\n                \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"calls\": [\n                  {\n                    \"from\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                    \"gas\": \"0x1a8e8\",\n                    \"gasUsed\": \"0x24d\",\n                    \"input\": \"0x13bc6d4b0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690\",\n                    \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n                    \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  },\n                  {\n                    \"from\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                    \"gas\": \"0x1a2c6\",\n                    \"gasUsed\": \"0x3cb\",\n                    \"input\": \"0xc9503fe2\",\n                    \"output\": \"0x0000000000000000000000000000000000000000000000008ac7230489e80000\",\n                    \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  },\n                  {\n                    \"from\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                    \"gas\": \"0x19b72\",\n                    \"gasUsed\": \"0x3cb\",\n                    \"input\": \"0xc9503fe2\",\n                    \"output\": \"0x0000000000000000000000000000000000000000000000008ac7230489e80000\",\n                    \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  },\n                  {\n                    \"from\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                    \"gas\": \"0x19428\",\n                    \"gasUsed\": \"0x305\",\n                    \"input\": \"0x6f265b93\",\n                    \"output\": \"0x0000000000000000000000000000000000000000000000283c7b9181eca20000\",\n                    \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  },\n                  {\n                    \"from\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                    \"gas\": \"0x18d45\",\n                    \"gasUsed\": \"0x229\",\n                    \"input\": \"0x2e94420f\",\n                    \"output\": \"0x5842545553440000000000000000000000000000000000000000000000000000\",\n                    \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  },\n                  {\n                    \"from\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                    \"gas\": \"0x1734e\",\n                    \"gasUsed\": \"0x229\",\n                    \"input\": \"0x2e94420f\",\n                    \"output\": \"0x5842545553440000000000000000000000000000000000000000000000000000\",\n                    \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  }\n                ],\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x20ee1\",\n                \"gasUsed\": \"0x5374\",\n                \"input\": \"0x581d5d60000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b0000000000000000000000000000000000000000000000280faf689c35ac0000\",\n                \"output\": \"0x\",\n                \"to\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x1b6c1\",\n                \"gasUsed\": \"0x334\",\n                \"input\": \"0xe16c7d986c6f676d67720000000000000000000000000000000000000000000000000000\",\n                \"output\": \"0x0000000000000000000000002a98c5f40bfa3dee83431103c535f6fae9a8ad38\",\n                \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x1af69\",\n                \"gasUsed\": \"0x229\",\n                \"input\": \"0x2e94420f\",\n                \"output\": \"0x5842545553440000000000000000000000000000000000000000000000000000\",\n                \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"calls\": [\n                  {\n                    \"from\": \"0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38\",\n                    \"gas\": \"0x143a5\",\n                    \"gasUsed\": \"0x24d\",\n                    \"input\": \"0x13bc6d4b0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690\",\n                    \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n                    \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  }\n                ],\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x1a91d\",\n                \"gasUsed\": \"0x12fa\",\n                \"input\": \"0x0accce0600000000000000000000000000000000000000000000000000000000000000025842545553440000000000000000000000000000000000000000000000000000000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n                \"output\": \"0x\",\n                \"to\": \"0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x19177\",\n                \"gasUsed\": \"0x334\",\n                \"input\": \"0xe16c7d986c6f676d67720000000000000000000000000000000000000000000000000000\",\n                \"output\": \"0x0000000000000000000000002a98c5f40bfa3dee83431103c535f6fae9a8ad38\",\n                \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x18a22\",\n                \"gasUsed\": \"0x229\",\n                \"input\": \"0x2e94420f\",\n                \"output\": \"0x5842545553440000000000000000000000000000000000000000000000000000\",\n                \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x18341\",\n                \"gasUsed\": \"0x334\",\n                \"input\": \"0xe16c7d986d61726b65746462000000000000000000000000000000000000000000000000\",\n                \"output\": \"0x000000000000000000000000cf00ffd997ad14939736f026006498e3f099baaf\",\n                \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x17bec\",\n                \"gasUsed\": \"0x229\",\n                \"input\": \"0x2e94420f\",\n                \"output\": \"0x5842545553440000000000000000000000000000000000000000000000000000\",\n                \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x1764e\",\n                \"gasUsed\": \"0x45c\",\n                \"input\": \"0xf92eb7745842545553440000000000000000000000000000000000000000000000000000\",\n                \"output\": \"0x00000000000000000000000000000000000000000000002816d180e30c390000\",\n                \"to\": \"0xcf00ffd997ad14939736f026006498e3f099baaf\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              },\n              {\n                \"calls\": [\n                  {\n                    \"from\": \"0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38\",\n                    \"gas\": \"0x108ba\",\n                    \"gasUsed\": \"0x24d\",\n                    \"input\": \"0x13bc6d4b0000000000000000000000003e9286eafa2db8101246c2131c09b49080d00690\",\n                    \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n                    \"to\": \"0x2cccf5e0538493c235d1c5ef6580f77d99e91396\",\n                    \"type\": \"CALL\",\n                    \"value\": \"0x0\"\n                  }\n                ],\n                \"from\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n                \"gas\": \"0x16e62\",\n                \"gasUsed\": \"0xebb\",\n                \"input\": \"0x645a3b72584254555344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002816d180e30c390000\",\n                \"output\": \"0x\",\n                \"to\": \"0x2a98c5f40bfa3dee83431103c535f6fae9a8ad38\",\n                \"type\": \"CALL\",\n                \"value\": \"0x0\"\n              }\n            ],\n            \"from\": \"0xb4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n            \"gas\": \"0x283b9\",\n            \"gasUsed\": \"0xc51c\",\n            \"input\": \"0x949ae479000000000000000000000000c212e03b9e060e36facad5fd8f4435412ca22e6b0000000000000000000000000000000000000000000000280faf689c35ac0000\",\n            \"output\": \"0x\",\n            \"to\": \"0x3e9286eafa2db8101246c2131c09b49080d00690\",\n            \"type\": \"CALL\",\n            \"value\": \"0x0\"\n          }\n        ],\n        \"from\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n        \"gas\": \"0x30b4a\",\n        \"gasUsed\": \"0xedb7\",\n        \"input\": \"0x51a34eb80000000000000000000000000000000000000000000000280faf689c35ac0000\",\n        \"output\": \"0x\",\n        \"to\": \"0xb4fe7aa695b326c9d219158d2ca50db77b39f99f\",\n        \"type\": \"CALL\",\n        \"value\": \"0x0\"\n      }\n    ],\n    \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n    \"gas\": \"0x37b38\",\n    \"gasUsed\": \"0x12bb3\",\n    \"input\": \"0x51a34eb80000000000000000000000000000000000000000000000280faf689c35ac0000\",\n    \"output\": \"0x\",\n    \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n    \"type\": \"CALL\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_delegatecall.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"31927752\",\n    \"gasLimit\": \"4707788\",\n    \"miner\": \"0x5659922ce141eedbc2733678f9806c77b4eebee8\",\n    \"number\": \"11495\",\n    \"timestamp\": \"1479735917\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x13204f5d64c28326fd7bd05fd4ea855302d7f2ff\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156100825760e060020a60003504630a0313a981146100875780630a3b0a4f146101095780630cd40fea1461021257806329092d0e1461021f5780634cd06a5f146103295780635dbe47e8146103395780637a9e5410146103d9578063825db5f7146103e6578063a820b44d146103f3578063efa52fb31461047a575b610002565b34610002576104fc600435600060006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a26333556e849091846000604051602001526040518360e060020a028152600401808381526020018281526020019250505060206040518083038186803b156100025760325a03f415610002575050604051519150505b919050565b346100025761051060043560006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a2637d65837a9091336000604051602001526040518360e060020a0281526004018083815260200182600160a060020a031681526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515115905061008257604080517f21ce24d4000000000000000000000000000000000000000000000000000000008152600060048201819052600160a060020a038416602483015291517342b02b5deeb78f34cd5ac896473b63e6c99a71a2926321ce24d49260448082019391829003018186803b156100025760325a03f415610002575050505b50565b3461000257610512600181565b346100025761051060043560006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a2637d65837a9091336000604051602001526040518360e060020a0281526004018083815260200182600160a060020a031681526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515115905061008257604080517f89489a87000000000000000000000000000000000000000000000000000000008152600060048201819052600160a060020a038416602483015291517342b02b5deeb78f34cd5ac896473b63e6c99a71a2926389489a879260448082019391829003018186803b156100025760325a03f4156100025750505061020f565b3461000257610528600435610403565b34610002576104fc600435604080516000602091820181905282517f7d65837a00000000000000000000000000000000000000000000000000000000815260048101829052600160a060020a0385166024820152925190927342b02b5deeb78f34cd5ac896473b63e6c99a71a292637d65837a92604480840193829003018186803b156100025760325a03f4156100025750506040515191506101049050565b3461000257610512600c81565b3461000257610512600081565b3461000257610528600061055660005b600060006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a263685a1f3c9091846000604051602001526040518360e060020a028152600401808381526020018281526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515191506101049050565b346100025761053a600435600060006000507342b02b5deeb78f34cd5ac896473b63e6c99a71a263f775b6b59091846000604051602001526040518360e060020a028152600401808381526020018281526020019250505060206040518083038186803b156100025760325a03f4156100025750506040515191506101049050565b604080519115158252519081900360200190f35b005b6040805160ff9092168252519081900360200190f35b60408051918252519081900360200190f35b60408051600160a060020a039092168252519081900360200190f35b90509056\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x4d140b25abf3c71052885c66f73ce07cff141c1afabffdaf5cba04d625b7ebcc\": \"0x0000000000000000000000000000000000000000000000000000000000000001\"\n        }\n      },\n      \"0x269296dddce321a6bcbaa2f0181127593d732cba\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156101275760e060020a60003504630cd40fea811461012c578063173825d9146101395780631849cb5a146101c7578063285791371461030f5780632a58b3301461033f5780632cb0d48a146103565780632f54bf6e1461036a578063332b9f061461039d5780633ca8b002146103c55780633df4ddf4146103d557806341c0e1b5146103f457806347799da81461040557806362a51eee1461042457806366907d13146104575780637065cb48146104825780637a9e541014610496578063825db5f7146104a3578063949d225d146104b0578063a51687df146104c7578063b4da4e37146104e6578063b4e6850b146104ff578063bd7474ca14610541578063e75623d814610541578063e9938e1114610555578063f5d241d314610643575b610002565b3461000257610682600181565b34610002576106986004356106ff335b60006001600a9054906101000a9004600160a060020a0316600160a060020a0316635dbe47e8836000604051602001526040518260e060020a0281526004018082600160a060020a03168152602001915050602060405180830381600087803b156100025760325a03f1156100025750506040515191506103989050565b3461000257604080516101008082018352600080835260208084018290528385018290526060808501839052608080860184905260a080870185905260c080880186905260e09788018690526001605060020a0360043581168752600586529589902089519788018a528054808816808a52605060020a91829004600160a060020a0316978a01889052600183015463ffffffff8082169d8c018e905264010000000082048116988c01899052604060020a90910416958a018690526002830154948a01859052600390920154808916938a01849052049096169690970186905293969495949293604080516001605060020a03998a16815297891660208901529590971686860152600160a060020a03909316606086015263ffffffff9182166080860152811660a08501521660c083015260e08201929092529051908190036101000190f35b346100025761069a60043560018054600091829160ff60f060020a909104161515141561063d5761072833610376565b34610002576106ae6004546001605060020a031681565b34610002576106986004356108b333610149565b346100025761069a6004355b600160a060020a03811660009081526002602052604090205460ff1615156001145b919050565b34610002576106986001805460ff60f060020a9091041615151415610913576108ed33610376565b346100025761069a600435610149565b34610002576106ae6003546001605060020a03605060020a9091041681565b346100025761069861091533610149565b34610002576106ae6003546001605060020a0360a060020a9091041681565b346100025761069a60043560243560018054600091829160ff60f060020a909104161515141561095e5761092633610376565b34610002576106986004356001805460ff60f060020a909104161515141561072557610a8b33610376565b3461000257610698600435610aa533610149565b3461000257610682600c81565b3461000257610682600081565b34610002576106ae6003546001605060020a031681565b34610002576106ca600154600160a060020a03605060020a9091041681565b346100025761069a60015460ff60f060020a9091041681565b346100025761069a60043560243560443560643560843560a43560c43560018054600091829160ff60f060020a9091041615151415610b5857610ad233610376565b3461000257610698600435610bd633610149565b34610002576106e6600435604080516101008181018352600080835260208084018290528385018290526060808501839052608080860184905260a080870185905260c080880186905260e09788018690526001605060020a03808b168752600586529589902089519788018a5280548088168952600160a060020a03605060020a918290041696890196909652600181015463ffffffff8082169b8a019b909b5264010000000081048b1695890195909552604060020a90940490981691860182905260028301549086015260039091015480841696850196909652940416918101919091525b50919050565b346100025761069a60043560243560443560643560843560a43560018054600091829160ff60f060020a9091041615151415610c8e57610bfb33610376565b6040805160ff9092168252519081900360200190f35b005b604080519115158252519081900360200190f35b604080516001605060020a039092168252519081900360200190f35b60408051600160a060020a039092168252519081900360200190f35b6040805163ffffffff9092168252519081900360200190f35b1561012757600160a060020a0381166000908152600260205260409020805460ff191690555b50565b1561063d57506001605060020a0380831660009081526005602052604090208054909116151561075b576000915061063d565b604080516101008101825282546001605060020a038082168352600160a060020a03605060020a92839004166020840152600185015463ffffffff80821695850195909552640100000000810485166060850152604060020a90049093166080830152600284015460a0830152600384015480841660c08401520490911660e0820152610817905b8051600354600090819060016001605060020a0390911611610c995760038054605060020a60f060020a0319169055610ddf565b600380546001605060020a031981166000196001605060020a03928316011782558416600090815260056020526040812080547fffff000000000000000000000000000000000000000000000000000000000000168155600181810180546bffffffffffffffffffffffff191690556002820192909255909101805473ffffffffffffffffffffffffffffffffffffffff19169055915061063d565b1561012757600180547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660f060020a8302179055610725565b1561091357600480546001605060020a031981166001605060020a039091166001011790555b565b156101275733600160a060020a0316ff5b1561095e57506001605060020a03808416600090815260056020526040902080549091161515610965576000915061095e565b600191505b5092915050565b60038101546001605060020a0384811691161415610986576001915061095e565b604080516101008101825282546001605060020a038082168352600160a060020a03605060020a92839004166020840152600185015463ffffffff80821695850195909552640100000000810485166060850152604060020a90049093166080830152600284015460a0830152600384015480841660c08401520490911660e0820152610a12906107e3565b61095983825b80546003546001605060020a0391821691600091161515610de55760038054605060020a60a060020a031916605060020a84021760a060020a69ffffffffffffffffffff02191660a060020a84021781558301805473ffffffffffffffffffffffffffffffffffffffff19169055610ddf565b1561072557600480546001605060020a0319168217905550565b1561012757600160a060020a0381166000908152600260205260409020805460ff19166001179055610725565b15610b5857506001605060020a038088166000908152600560205260409020805490911615610b645760009150610b58565b6004546001605060020a0390811690891610610b3057600480546001605060020a03191660018a011790555b6003805460016001605060020a03821681016001605060020a03199092169190911790915591505b50979650505050505050565b80546001605060020a0319168817605060020a60f060020a031916605060020a880217815560018101805463ffffffff1916871767ffffffff0000000019166401000000008702176bffffffff00000000000000001916604060020a860217905560028101839055610b048982610a18565b156101275760018054605060020a60f060020a031916605060020a8302179055610725565b15610c8e57506001605060020a03808816600090815260056020526040902080549091161515610c2e5760009150610c8e565b8054605060020a60f060020a031916605060020a88021781556001808201805463ffffffff1916881767ffffffff0000000019166401000000008802176bffffffff00000000000000001916604060020a87021790556002820184905591505b509695505050505050565b6003546001605060020a03848116605060020a909204161415610d095760e084015160038054605060020a928302605060020a60a060020a031990911617808255919091046001605060020a031660009081526005602052604090200180546001605060020a0319169055610ddf565b6003546001605060020a0384811660a060020a909204161415610d825760c08401516003805460a060020a92830260a060020a69ffffffffffffffffffff021990911617808255919091046001605060020a03166000908152600560205260409020018054605060020a60a060020a0319169055610ddf565b505060c082015160e08301516001605060020a0380831660009081526005602052604080822060039081018054605060020a60a060020a031916605060020a8702179055928416825290200180546001605060020a031916831790555b50505050565b6001605060020a0384161515610e6457600380546001605060020a03605060020a9182900481166000908152600560205260409020830180546001605060020a0319908116871790915583548785018054918590049093168402605060020a60a060020a03199182161790911690915582549185029116179055610ddf565b506001605060020a038381166000908152600560205260409020600390810180549185018054605060020a60a060020a0319908116605060020a94859004909516808502959095176001605060020a0319168817909155815416918402919091179055801515610ef4576003805460a060020a69ffffffffffffffffffff02191660a060020a8402179055610ddf565b6003808401546001605060020a03605060020a9091041660009081526005602052604090200180546001605060020a031916831790555050505056\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000001\": \"0x000113204f5d64c28326fd7bd05fd4ea855302d7f2ff00000000000000000000\"\n        }\n      },\n      \"0x42b02b5deeb78f34cd5ac896473b63e6c99a71a2\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x6504032353da7150606060405236156100695760e060020a60003504631bf7509d811461006e57806321ce24d41461008157806333556e84146100ec578063685a1f3c146101035780637d65837a1461011757806389489a8714610140578063f775b6b5146101fc575b610007565b61023460043560006100fd82600061010d565b610246600435602435600160a060020a03811660009081526020839052604081205415156102cb57826001016000508054806001018281815481835581811511610278576000838152602090206102789181019083015b808211156102d057600081556001016100d8565b610248600435602435600182015481105b92915050565b6102346004356024355b60018101906100fd565b610248600435602435600160a060020a03811660009081526020839052604090205415156100fd565b61024660043560243580600160a060020a031632600160a060020a03161415156101f857600160a060020a038116600090815260208390526040902054156101f857600160a060020a038116600090815260208390526040902054600183018054909160001901908110156100075760009182526020808320909101805473ffffffffffffffffffffffffffffffffffffffff19169055600160a060020a038316825283905260408120556002820180546000190190555b5050565b61025c60043560243560008260010160005082815481101561000757600091825260209091200154600160a060020a03169392505050565b60408051918252519081900360200190f35b005b604080519115158252519081900360200190f35b60408051600160a060020a039092168252519081900360200190f35b50505060009283526020808420909201805473ffffffffffffffffffffffffffffffffffffffff191686179055600160a060020a0385168352908590526040909120819055600284018054600101905590505b505050565b509056\",\n        \"nonce\": \"1\",\n        \"storage\": {}\n      },\n      \"0xa529806c67cc6486d4d62024471772f47f6fd672\": {\n        \"balance\": \"0x67820e39ac8fe9800\",\n        \"code\": \"0x\",\n        \"nonce\": \"68\",\n        \"storage\": {}\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"31912170\",\n    \"extraData\": \"0xd783010502846765746887676f312e372e33856c696e7578\",\n    \"gasLimit\": \"4712388\",\n    \"hash\": \"0x0855914bdc581bccdc62591fd438498386ffb59ea4d5361ed5c3702e26e2c72f\",\n    \"miner\": \"0x334391aa808257952a462d1475562ee2106a6c90\",\n    \"mixHash\": \"0x64bb70b8ca883cadb8fbbda2c70a861612407864089ed87b98e5de20acceada6\",\n    \"nonce\": \"0x684129f283aaef18\",\n    \"number\": \"11494\",\n    \"stateRoot\": \"0x7057f31fe3dab1d620771adad35224aae43eb70e94861208bc84c557ff5b9d10\",\n    \"timestamp\": \"1479735912\",\n    \"totalDifficulty\": \"90744064339\"\n  },\n  \"input\": \"0xf889448504a817c800832dc6c094269296dddce321a6bcbaa2f0181127593d732cba80a47065cb480000000000000000000000001523e55a1ca4efbae03355775ae89f8d7699ad9e29a080ed81e4c5e9971a730efab4885566e2c868cd80bd4166d0ed8c287fdf181650a069d7c49215e3d4416ad239cd09dbb71b9f04c16b33b385d14f40b618a7a65115\",\n  \"result\": {\n    \"calls\": [\n      {\n        \"calls\": [\n          {\n            \"from\": \"0x13204f5d64c28326fd7bd05fd4ea855302d7f2ff\",\n            \"gas\": \"0x2bf459\",\n            \"gasUsed\": \"0x2aa\",\n            \"input\": \"0x7d65837a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a529806c67cc6486d4d62024471772f47f6fd672\",\n            \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n            \"to\": \"0x42b02b5deeb78f34cd5ac896473b63e6c99a71a2\",\n            \"type\": \"DELEGATECALL\"\n          }\n        ],\n        \"from\": \"0x269296dddce321a6bcbaa2f0181127593d732cba\",\n        \"gas\": \"0x2cae73\",\n        \"gasUsed\": \"0xa9d\",\n        \"input\": \"0x5dbe47e8000000000000000000000000a529806c67cc6486d4d62024471772f47f6fd672\",\n        \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n        \"to\": \"0x13204f5d64c28326fd7bd05fd4ea855302d7f2ff\",\n        \"type\": \"CALL\",\n        \"value\": \"0x0\"\n      }\n    ],\n    \"from\": \"0xa529806c67cc6486d4d62024471772f47f6fd672\",\n    \"gas\": \"0x2d6e28\",\n    \"gasUsed\": \"0x64bd\",\n    \"input\": \"0x7065cb480000000000000000000000001523e55a1ca4efbae03355775ae89f8d7699ad9e\",\n    \"output\": \"0x\",\n    \"to\": \"0x269296dddce321a6bcbaa2f0181127593d732cba\",\n    \"type\": \"CALL\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"3451177886\",\n    \"gasLimit\": \"4709286\",\n    \"miner\": \"0x1585936b53834b021f68cc13eeefdec2efc8e724\",\n    \"number\": \"2290744\",\n    \"timestamp\": \"1513616439\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x1d3ddf7caf024f253487e18bc4a15b1a360c170a\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405263ffffffff60e060020a6000350416633b91f50681146100505780635bb47808146100715780635f51fca01461008c578063bc7647a9146100ad578063f1bd0d7a146100c8575b610000565b346100005761006f600160a060020a03600435811690602435166100e9565b005b346100005761006f600160a060020a0360043516610152565b005b346100005761006f600160a060020a036004358116906024351661019c565b005b346100005761006f600160a060020a03600435166101fa565b005b346100005761006f600160a060020a0360043581169060243516610db8565b005b600160a060020a038083166000908152602081905260408120549091908116903316811461011657610000565b839150600160a060020a038316151561012d573392505b6101378284610e2e565b6101418284610db8565b61014a826101fa565b5b5b50505050565b600154600160a060020a03908116903316811461016e57610000565b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b5b5050565b600254600160a060020a0390811690331681146101b857610000565b600160a060020a038381166000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff19169184169190911790555b5b505050565b6040805160e260020a631a481fc102815260016024820181905260026044830152606482015262093a8060848201819052600060a4830181905260c06004840152601e60c48401527f736574456e7469747953746174757328616464726573732c75696e743829000060e484015292519091600160a060020a038516916369207f049161010480820192879290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526000602482018190526001604483015260606004830152602360648301527f626567696e506f6c6c28616464726573732c75696e7436342c626f6f6c2c626f60848301527f6f6c29000000000000000000000000000000000000000000000000000000000060a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152601960c48201527f61646453746f636b28616464726573732c75696e74323536290000000000000060e48201529051600160a060020a03861692506369207f04916101048082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152601960c48201527f697373756553746f636b2875696e74382c75696e74323536290000000000000060e48201529051600160a060020a03861692506369207f04916101048082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152602160648301527f6772616e7453746f636b2875696e74382c75696e743235362c61646472657373608483015260f860020a60290260a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f115610000575050604080517f010555b8000000000000000000000000000000000000000000000000000000008152600160a060020a03338116602483015260006044830181905260606004840152603c60648401527f6772616e7456657374656453746f636b2875696e74382c75696e743235362c6160848401527f6464726573732c75696e7436342c75696e7436342c75696e743634290000000060a48401529251908716935063010555b89260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152601260c48201527f626567696e53616c65286164647265737329000000000000000000000000000060e48201529051600160a060020a03861692506369207f04916101048082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152601a60648301527f7472616e7366657253616c6546756e64732875696e743235362900000000000060848301529151600160a060020a038716935063de64e15c9260a48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260016024820181905260026044830152606482015267ffffffffffffffff8416608482015260ff851660a482015260c06004820152602d60c48201527f7365744163636f756e74696e6753657474696e67732875696e743235362c756960e48201527f6e7436342c75696e7432353629000000000000000000000000000000000000006101048201529051600160a060020a03861692506369207f04916101248082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152603460648301527f637265617465526563757272696e6752657761726428616464726573732c756960848301527f6e743235362c75696e7436342c737472696e672900000000000000000000000060a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152601b60648301527f72656d6f7665526563757272696e675265776172642875696e7429000000000060848301529151600160a060020a038716935063de64e15c9260a48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a63379938570281526002602482015260006044820181905260606004830152602360648301527f697373756552657761726428616464726573732c75696e743235362c7374726960848301527f6e6729000000000000000000000000000000000000000000000000000000000060a48301529151600160a060020a038716935063de64e15c9260c48084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a6337993857028152600160248201819052604482015260606004820152602260648201527f61737369676e53746f636b2875696e74382c616464726573732c75696e743235608482015260f060020a6136290260a48201529051600160a060020a038616925063de64e15c9160c48082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a6337993857028152600160248201819052604482015260606004820152602260648201527f72656d6f766553746f636b2875696e74382c616464726573732c75696e743235608482015260f060020a6136290260a48201529051600160a060020a038616925063de64e15c9160c48082019260009290919082900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc102815260026024808301919091526003604483015260006064830181905267ffffffffffffffff8616608484015260ff871660a484015260c0600484015260c48301919091527f7365744164647265737342796c617728737472696e672c616464726573732c6260e48301527f6f6f6c29000000000000000000000000000000000000000000000000000000006101048301529151600160a060020a03871693506369207f04926101248084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc1028152600260248201526003604482015260006064820181905267ffffffffffffffff8516608483015260ff861660a483015260c06004830152602160c48301527f73657453746174757342796c617728737472696e672c75696e74382c626f6f6c60e483015260f860020a6029026101048301529151600160a060020a03871693506369207f04926101248084019391929182900301818387803b156100005760325a03f1156100005750506040805160e260020a631a481fc1028152600260248201526003604482015260006064820181905267ffffffffffffffff8516608483015260ff861660a483015260c06004830152603860c48301527f736574566f74696e6742796c617728737472696e672c75696e743235362c756960e48301527f6e743235362c626f6f6c2c75696e7436342c75696e74382900000000000000006101048301529151600160a060020a03871693506369207f04926101248084019391929182900301818387803b156100005760325a03f115610000575050505b505050565b604080517f225553a4000000000000000000000000000000000000000000000000000000008152600160a060020a0383811660048301526002602483015291519184169163225553a49160448082019260009290919082900301818387803b156100005760325a03f115610000575050505b5050565b600082604051611fd280610f488339600160a060020a03909216910190815260405190819003602001906000f0801561000057905082600160a060020a03166308b027418260016040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050600060405180830381600087803b156100005760325a03f115610000575050604080517fa14e3ee300000000000000000000000000000000000000000000000000000000815260006004820181905260016024830152600160a060020a0386811660448401529251928716935063a14e3ee39260648084019382900301818387803b156100005760325a03f115610000575050505b5050505600606060405234620000005760405160208062001fd283398101604052515b805b600a8054600160a060020a031916600160a060020a0383161790555b506001600d819055600e81905560408051808201909152600c8082527f566f74696e672053746f636b00000000000000000000000000000000000000006020928301908152600b805460008290528251601860ff1990911617825590947f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600291831615610100026000190190921604601f0193909304830192906200010c565b828001600101855582156200010c579182015b828111156200010c578251825591602001919060010190620000ef565b5b50620001309291505b808211156200012c576000815560010162000116565b5090565b50506040805180820190915260038082527f43565300000000000000000000000000000000000000000000000000000000006020928301908152600c805460008290528251600660ff1990911617825590937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c760026001841615610100026000190190931692909204601f010481019291620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b5b506200021b9291505b808211156200012c576000815560010162000116565b5090565b50505b505b611da280620002306000396000f3006060604052361561019a5763ffffffff60e060020a600035041662e1986d811461019f57806302a72a4c146101d657806306eb4e421461020157806306fdde0314610220578063095ea7b3146102ad578063158ccb99146102dd57806318160ddd146102f85780631cf65a781461031757806323b872dd146103365780632c71e60a1461036c57806333148fd6146103ca578063435ebc2c146103f55780635eeb6e451461041e578063600e85b71461043c5780636103d70b146104a157806362c1e46a146104b05780636c182e99146104ba578063706dc87c146104f057806370a082311461052557806377174f851461055057806395d89b411461056f578063a7771ee3146105fc578063a9059cbb14610629578063ab377daa14610659578063b25dbb5e14610685578063b89a73cb14610699578063ca5eb5e1146106c6578063cbcf2e5a146106e1578063d21f05ba1461070e578063d347c2051461072d578063d96831e114610765578063dd62ed3e14610777578063df3c211b146107a8578063e2982c21146107d6578063eb944e4c14610801575b610000565b34610000576101d4600160a060020a036004351660243567ffffffffffffffff6044358116906064358116906084351661081f565b005b34610000576101ef600160a060020a0360043516610a30565b60408051918252519081900360200190f35b34610000576101ef610a4f565b60408051918252519081900360200190f35b346100005761022d610a55565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516602435610ae3565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516610b4e565b005b34610000576101ef610b89565b60408051918252519081900360200190f35b34610000576101ef610b8f565b60408051918252519081900360200190f35b34610000576102c9600160a060020a0360043581169060243516604435610b95565b604080519115158252519081900360200190f35b3461000057610388600160a060020a0360043516602435610bb7565b60408051600160a060020a039096168652602086019490945267ffffffffffffffff928316858501529082166060850152166080830152519081900360a00190f35b34610000576101ef600160a060020a0360043516610c21565b60408051918252519081900360200190f35b3461000057610402610c40565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d4600160a060020a0360043516602435610c4f565b005b3461000057610458600160a060020a0360043516602435610cc9565b60408051600160a060020a03909716875260208701959095528585019390935267ffffffffffffffff9182166060860152811660808501521660a0830152519081900360c00190f35b34610000576101d4610d9e565b005b6101d4610e1e565b005b34610000576104d3600160a060020a0360043516610e21565b6040805167ffffffffffffffff9092168252519081900360200190f35b3461000057610402600160a060020a0360043516610ead565b60408051600160a060020a039092168252519081900360200190f35b34610000576101ef600160a060020a0360043516610ef9565b60408051918252519081900360200190f35b34610000576101ef610f18565b60408051918252519081900360200190f35b346100005761022d610f1e565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516610fac565b604080519115158252519081900360200190f35b34610000576102c9600160a060020a0360043516602435610fc2565b604080519115158252519081900360200190f35b3461000057610402600435610fe2565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d46004351515610ffd565b005b34610000576102c9600160a060020a036004351661104c565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516611062565b005b34610000576102c9600160a060020a0360043516611070565b604080519115158252519081900360200190f35b34610000576101ef6110f4565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351667ffffffffffffffff602435166110fa565b60408051918252519081900360200190f35b34610000576101d4600435611121565b005b34610000576101ef600160a060020a03600435811690602435166111c6565b60408051918252519081900360200190f35b34610000576101ef6004356024356044356064356084356111f3565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351661128c565b60408051918252519081900360200190f35b34610000576101d4600160a060020a036004351660243561129e565b005b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff848116908416101561086457610000565b8367ffffffffffffffff168267ffffffffffffffff16101561088557610000565b8267ffffffffffffffff168267ffffffffffffffff1610156108a657610000565b506040805160a081018252600160a060020a033381168252602080830188905267ffffffffffffffff80871684860152858116606085015287166080840152908816600090815260039091529190912080546001810180835582818380158290116109615760030281600302836000526020600020918201910161096191905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050916000526020600020906003020160005b5082518154600160a060020a031916600160a060020a03909116178155602083015160018201556040830151600290910180546060850151608086015167ffffffffffffffff1990921667ffffffffffffffff948516176fffffffffffffffff00000000000000001916604060020a918516919091021777ffffffffffffffff000000000000000000000000000000001916608060020a939091169290920291909117905550610a268686610fc2565b505b505050505050565b600160a060020a0381166000908152600360205260409020545b919050565b60055481565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b600a5433600160a060020a03908116911614610b6957610000565b600a8054600160a060020a031916600160a060020a0383161790555b5b50565b60005481565b60005b90565b6000610ba2848484611600565b610bad8484846116e2565b90505b9392505050565b600360205281600052604060002081815481101561000057906000526020600020906003020160005b5080546001820154600290920154600160a060020a03909116935090915067ffffffffffffffff80821691604060020a8104821691608060020a9091041685565b600160a060020a0381166000908152600860205260409020545b919050565b600a54600160a060020a031681565b600a5433600160a060020a03908116911614610c6a57610000565b610c7660005482611714565b6000908155600160a060020a038316815260016020526040902054610c9b9082611714565b600160a060020a038316600090815260016020526040812091909155610cc390839083611600565b5b5b5050565b6000600060006000600060006000600360008a600160a060020a0316600160a060020a0316815260200190815260200160002088815481101561000057906000526020600020906003020160005b508054600182015460028301546040805160a081018252600160a060020a039094168085526020850184905267ffffffffffffffff808416928601839052604060020a8404811660608701819052608060020a9094041660808601819052909c50929a509197509095509350909150610d90904261172d565b94505b509295509295509295565b33600160a060020a038116600090815260066020526040902054801515610dc457610000565b8030600160a060020a0316311015610ddb57610000565b600160a060020a0382166000818152600660205260408082208290555183156108fc0291849190818181858888f193505050501515610cc357610000565b5b5050565b5b565b600160a060020a03811660009081526003602052604081205442915b81811015610ea557600160a060020a03841660009081526003602052604090208054610e9a9190839081101561000057906000526020600020906003020160005b5060020154604060020a900467ffffffffffffffff168461177d565b92505b600101610e3d565b5b5050919050565b600160a060020a0380821660009081526007602052604081205490911615610eef57600160a060020a0380831660009081526007602052604090205416610ef1565b815b90505b919050565b600160a060020a0381166000908152600160205260409020545b919050565b600d5481565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b60006000610fb983610c21565b1190505b919050565b6000610fcf338484611600565b610fd983836117ac565b90505b92915050565b600460205260009081526040902054600160a060020a031681565b8015801561101a575061100f33610ef9565b61101833610c21565b115b1561102457610000565b33600160a060020a03166000908152600960205260409020805460ff19168215151790555b50565b60006000610fb983610ef9565b1190505b919050565b610b8533826117dc565b5b50565b600a54604080516000602091820181905282517fcbcf2e5a000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015293519194939093169263cbcf2e5a92602480830193919282900301818787803b156100005760325a03f115610000575050604051519150505b919050565b600e5481565b6000610fd961110984846118b2565b61111385856119b6565b611a05565b90505b92915050565b600a5433600160a060020a0390811691161461113c57610000565b61114860005482611a1f565b600055600554600190101561116c57600a5461116c90600160a060020a0316611a47565b5b600a54600160a060020a03166000908152600160205260409020546111929082611a1f565b600a8054600160a060020a039081166000908152600160205260408120939093559054610b8592911683611600565b5b5b50565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b6000600060008487101561120a5760009250611281565b8387111561121a57879250611281565b61123f6112308961122b888a611714565b611a90565b61123a8689611714565b611abc565b915081925061124e8883611714565b905061127e8361127961126a8461122b8c8b611714565b611a90565b61123a888b611714565b611abc565b611a1f565b92505b505095945050505050565b60066020526000908152604090205481565b600160a060020a03821660009081526003602052604081208054829190849081101561000057906000526020600020906003020160005b50805490925033600160a060020a039081169116146112f357610000565b6040805160a0810182528354600160a060020a0316815260018401546020820152600284015467ffffffffffffffff80821693830193909352604060020a810483166060830152608060020a900490911660808201526113539042611af9565b600160a060020a0385166000908152600360205260409020805491925090849081101561000057906000526020600020906003020160005b508054600160a060020a031916815560006001820181905560029091018054600160c060020a0319169055600160a060020a0385168152600360205260409020805460001981019081101561000057906000526020600020906003020160005b50600160a060020a03851660009081526003602052604090208054859081101561000057906000526020600020906003020160005b5081548154600160a060020a031916600160a060020a03918216178255600180840154908301556002928301805493909201805467ffffffffffffffff191667ffffffffffffffff948516178082558354604060020a908190048616026fffffffffffffffff000000000000000019909116178082559254608060020a9081900490941690930277ffffffffffffffff00000000000000000000000000000000199092169190911790915584166000908152600360205260409020805460001981018083559190829080158290116115485760030281600302836000526020600020918201910161154891905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050600160a060020a033316600090815260016020526040902054611570915082611a1f565b600160a060020a03338116600090815260016020526040808220939093559086168152205461159f9082611714565b600160a060020a038086166000818152600160209081526040918290209490945580518581529051339093169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35b50505050565b600160a060020a0383161561166e576116466008600061161f86610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611714565b6008600061165386610ead565b600160a060020a031681526020810191909152604001600020555b600160a060020a038216156116dc576116b46008600061168d85610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611a1f565b600860006116c185610ead565b600160a060020a031681526020810191909152604001600020555b5b505050565b600083826116f082426110fa565b8111156116fc57610000565b611707868686611b1b565b92505b5b50509392505050565b600061172283831115611b4d565b508082035b92915050565b6000610fd983602001518367ffffffffffffffff16856080015167ffffffffffffffff16866040015167ffffffffffffffff16876060015167ffffffffffffffff166111f3565b90505b92915050565b60008167ffffffffffffffff168367ffffffffffffffff1610156117a15781610fd9565b825b90505b92915050565b600033826117ba82426110fa565b8111156117c657610000565b6117d08585611b5d565b92505b5b505092915050565b6117e582610ef9565b6117ee83610c21565b11156117f957610000565b600160a060020a03811660009081526009602052604090205460ff16158015611834575081600160a060020a031681600160a060020a031614155b1561183e57610000565b61184782611070565b1561185157610000565b611864828261185f85610ef9565b611600565b600160a060020a0382811660009081526007602052604090208054600160a060020a031916918316918217905561189a82610ead565b600160a060020a031614610cc357610000565b5b5050565b600160a060020a038216600090815260036020526040812054815b818110156119885761197d836112796003600089600160a060020a0316600160a060020a0316815260200190815260200160002084815481101561000057906000526020600020906003020160005b506040805160a0810182528254600160a060020a031681526001830154602082015260029092015467ffffffffffffffff80821692840192909252604060020a810482166060840152608060020a900416608082015287611af9565b611a1f565b92505b6001016118cd565b600160a060020a0385166000908152600160205260409020546117d09084611714565b92505b505092915050565b600060006119c384611070565b80156119d157506000600d54115b90506119fb816119e9576119e485610ef9565b6119ec565b60005b6111138686611b7b565b611a05565b91505b5092915050565b60008183106117a15781610fd9565b825b90505b92915050565b6000828201611a3c848210801590611a375750838210155b611b4d565b8091505b5092915050565b611a508161104c565b15611a5a57610b85565b6005805460009081526004602052604090208054600160a060020a031916600160a060020a038416179055805460010190555b50565b6000828202611a3c841580611a37575083858381156100005704145b611b4d565b8091505b5092915050565b60006000611acc60008411611b4d565b8284811561000057049050611a3c838581156100005706828502018514611b4d565b8091505b5092915050565b6000610fd98360200151611b0d858561172d565b611714565b90505b92915050565b60008382611b2982426110fa565b811115611b3557610000565b611707868686611b8f565b92505b5b50509392505050565b801515610b8557610000565b5b50565b6000611b6883611a47565b610fd98383611c92565b90505b92915050565b6000610fd983610ef9565b90505b92915050565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152812054909190611bd09084611a1f565b600160a060020a038086166000908152600160205260408082209390935590871681522054611bff9084611714565b600160a060020a038616600090815260016020526040902055611c228184611714565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b60003382611ca082426110fa565b811115611cac57610000565b6117d08585611cc2565b92505b5b505092915050565b600160a060020a033316600090815260016020526040812054611ce59083611714565b600160a060020a033381166000908152600160205260408082209390935590851681522054611d149083611a1f565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b929150505600a165627a7a72305820bfa5ddd3fecf3f43aed25385ec7ec3ef79638c2e58d99f85d9a3cc494183bf160029a165627a7a723058200e78a5f7e0f91739035d0fbf5eca02f79377210b722f63431f29a22e2880b3bd0029\",\n        \"nonce\": \"789\",\n        \"storage\": {\n          \"0xfe9ec0542a1c009be8b1f3acf43af97100ffff42eb736850fb038fa1151ad4d9\": \"0x000000000000000000000000e4a13bc304682a903e9472f469c33801dd18d9e8\"\n        }\n      },\n      \"0x5cb4a6b902fcb21588c86c3517e797b07cdaadb9\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x\",\n        \"nonce\": \"0\",\n        \"storage\": {}\n      },\n      \"0xe4a13bc304682a903e9472f469c33801dd18d9e8\": {\n        \"balance\": \"0x33c763c929f62c4f\",\n        \"code\": \"0x\",\n        \"nonce\": \"14\",\n        \"storage\": {}\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"3451177886\",\n    \"extraData\": \"0x4554482e45544846414e532e4f52472d4641313738394444\",\n    \"gasLimit\": \"4713874\",\n    \"hash\": \"0x5d52a672417cd1269bf4f7095e25dcbf837747bba908cd5ef809dc1bd06144b5\",\n    \"miner\": \"0xbbf5029fd710d227630c8b7d338051b8e76d50b3\",\n    \"mixHash\": \"0x01a12845ed546b94a038a7a03e8df8d7952024ed41ccb3db7a7ade4abc290ce1\",\n    \"nonce\": \"0x28c446f1cb9748c1\",\n    \"number\": \"2290743\",\n    \"stateRoot\": \"0x4898aceede76739daef76448a367d10015a2c022c9e7909b99a10fbf6fb16708\",\n    \"timestamp\": \"1513616414\",\n    \"totalDifficulty\": \"7146523769022564\"\n  },\n  \"input\": \"0xf8aa0e8509502f9000830493e0941d3ddf7caf024f253487e18bc4a15b1a360c170a80b8443b91f506000000000000000000000000a14bdd7e5666d784dcce98ad24d383a6b1cd4182000000000000000000000000e4a13bc304682a903e9472f469c33801dd18d9e829a0524564944fa419f5c189b5074044f89210c6d6b2d77ee8f7f12a927d59b636dfa0015b28986807a424b18b186ee6642d76739df36cad802d20e8c00e79a61d7281\",\n  \"result\": {\n    \"calls\": [\n      {\n        \"error\": \"internal failure\",\n        \"from\": \"0x1d3ddf7caf024f253487e18bc4a15b1a360c170a\",\n        \"gas\": \"0x39ff0\",\n        \"gasUsed\": \"0x39ff0\",\n        \"input\": \"0x606060405234620000005760405160208062001fd283398101604052515b805b600a8054600160a060020a031916600160a060020a0383161790555b506001600d819055600e81905560408051808201909152600c8082527f566f74696e672053746f636b00000000000000000000000000000000000000006020928301908152600b805460008290528251601860ff1990911617825590947f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9600291831615610100026000190190921604601f0193909304830192906200010c565b828001600101855582156200010c579182015b828111156200010c578251825591602001919060010190620000ef565b5b50620001309291505b808211156200012c576000815560010162000116565b5090565b50506040805180820190915260038082527f43565300000000000000000000000000000000000000000000000000000000006020928301908152600c805460008290528251600660ff1990911617825590937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c760026001841615610100026000190190931692909204601f010481019291620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b5b506200021b9291505b808211156200012c576000815560010162000116565b5090565b50505b505b611da280620002306000396000f3006060604052361561019a5763ffffffff60e060020a600035041662e1986d811461019f57806302a72a4c146101d657806306eb4e421461020157806306fdde0314610220578063095ea7b3146102ad578063158ccb99146102dd57806318160ddd146102f85780631cf65a781461031757806323b872dd146103365780632c71e60a1461036c57806333148fd6146103ca578063435ebc2c146103f55780635eeb6e451461041e578063600e85b71461043c5780636103d70b146104a157806362c1e46a146104b05780636c182e99146104ba578063706dc87c146104f057806370a082311461052557806377174f851461055057806395d89b411461056f578063a7771ee3146105fc578063a9059cbb14610629578063ab377daa14610659578063b25dbb5e14610685578063b89a73cb14610699578063ca5eb5e1146106c6578063cbcf2e5a146106e1578063d21f05ba1461070e578063d347c2051461072d578063d96831e114610765578063dd62ed3e14610777578063df3c211b146107a8578063e2982c21146107d6578063eb944e4c14610801575b610000565b34610000576101d4600160a060020a036004351660243567ffffffffffffffff6044358116906064358116906084351661081f565b005b34610000576101ef600160a060020a0360043516610a30565b60408051918252519081900360200190f35b34610000576101ef610a4f565b60408051918252519081900360200190f35b346100005761022d610a55565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516602435610ae3565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516610b4e565b005b34610000576101ef610b89565b60408051918252519081900360200190f35b34610000576101ef610b8f565b60408051918252519081900360200190f35b34610000576102c9600160a060020a0360043581169060243516604435610b95565b604080519115158252519081900360200190f35b3461000057610388600160a060020a0360043516602435610bb7565b60408051600160a060020a039096168652602086019490945267ffffffffffffffff928316858501529082166060850152166080830152519081900360a00190f35b34610000576101ef600160a060020a0360043516610c21565b60408051918252519081900360200190f35b3461000057610402610c40565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d4600160a060020a0360043516602435610c4f565b005b3461000057610458600160a060020a0360043516602435610cc9565b60408051600160a060020a03909716875260208701959095528585019390935267ffffffffffffffff9182166060860152811660808501521660a0830152519081900360c00190f35b34610000576101d4610d9e565b005b6101d4610e1e565b005b34610000576104d3600160a060020a0360043516610e21565b6040805167ffffffffffffffff9092168252519081900360200190f35b3461000057610402600160a060020a0360043516610ead565b60408051600160a060020a039092168252519081900360200190f35b34610000576101ef600160a060020a0360043516610ef9565b60408051918252519081900360200190f35b34610000576101ef610f18565b60408051918252519081900360200190f35b346100005761022d610f1e565b604080516020808252835181830152835191928392908301918501908083838215610273575b80518252602083111561027357601f199092019160209182019101610253565b505050905090810190601f16801561029f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34610000576102c9600160a060020a0360043516610fac565b604080519115158252519081900360200190f35b34610000576102c9600160a060020a0360043516602435610fc2565b604080519115158252519081900360200190f35b3461000057610402600435610fe2565b60408051600160a060020a039092168252519081900360200190f35b34610000576101d46004351515610ffd565b005b34610000576102c9600160a060020a036004351661104c565b604080519115158252519081900360200190f35b34610000576101d4600160a060020a0360043516611062565b005b34610000576102c9600160a060020a0360043516611070565b604080519115158252519081900360200190f35b34610000576101ef6110f4565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351667ffffffffffffffff602435166110fa565b60408051918252519081900360200190f35b34610000576101d4600435611121565b005b34610000576101ef600160a060020a03600435811690602435166111c6565b60408051918252519081900360200190f35b34610000576101ef6004356024356044356064356084356111f3565b60408051918252519081900360200190f35b34610000576101ef600160a060020a036004351661128c565b60408051918252519081900360200190f35b34610000576101d4600160a060020a036004351660243561129e565b005b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff848116908416101561086457610000565b8367ffffffffffffffff168267ffffffffffffffff16101561088557610000565b8267ffffffffffffffff168267ffffffffffffffff1610156108a657610000565b506040805160a081018252600160a060020a033381168252602080830188905267ffffffffffffffff80871684860152858116606085015287166080840152908816600090815260039091529190912080546001810180835582818380158290116109615760030281600302836000526020600020918201910161096191905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050916000526020600020906003020160005b5082518154600160a060020a031916600160a060020a03909116178155602083015160018201556040830151600290910180546060850151608086015167ffffffffffffffff1990921667ffffffffffffffff948516176fffffffffffffffff00000000000000001916604060020a918516919091021777ffffffffffffffff000000000000000000000000000000001916608060020a939091169290920291909117905550610a268686610fc2565b505b505050505050565b600160a060020a0381166000908152600360205260409020545b919050565b60055481565b600b805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b600a5433600160a060020a03908116911614610b6957610000565b600a8054600160a060020a031916600160a060020a0383161790555b5b50565b60005481565b60005b90565b6000610ba2848484611600565b610bad8484846116e2565b90505b9392505050565b600360205281600052604060002081815481101561000057906000526020600020906003020160005b5080546001820154600290920154600160a060020a03909116935090915067ffffffffffffffff80821691604060020a8104821691608060020a9091041685565b600160a060020a0381166000908152600860205260409020545b919050565b600a54600160a060020a031681565b600a5433600160a060020a03908116911614610c6a57610000565b610c7660005482611714565b6000908155600160a060020a038316815260016020526040902054610c9b9082611714565b600160a060020a038316600090815260016020526040812091909155610cc390839083611600565b5b5b5050565b6000600060006000600060006000600360008a600160a060020a0316600160a060020a0316815260200190815260200160002088815481101561000057906000526020600020906003020160005b508054600182015460028301546040805160a081018252600160a060020a039094168085526020850184905267ffffffffffffffff808416928601839052604060020a8404811660608701819052608060020a9094041660808601819052909c50929a509197509095509350909150610d90904261172d565b94505b509295509295509295565b33600160a060020a038116600090815260066020526040902054801515610dc457610000565b8030600160a060020a0316311015610ddb57610000565b600160a060020a0382166000818152600660205260408082208290555183156108fc0291849190818181858888f193505050501515610cc357610000565b5b5050565b5b565b600160a060020a03811660009081526003602052604081205442915b81811015610ea557600160a060020a03841660009081526003602052604090208054610e9a9190839081101561000057906000526020600020906003020160005b5060020154604060020a900467ffffffffffffffff168461177d565b92505b600101610e3d565b5b5050919050565b600160a060020a0380821660009081526007602052604081205490911615610eef57600160a060020a0380831660009081526007602052604090205416610ef1565b815b90505b919050565b600160a060020a0381166000908152600160205260409020545b919050565b600d5481565b600c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610adb5780601f10610ab057610100808354040283529160200191610adb565b820191906000526020600020905b815481529060010190602001808311610abe57829003601f168201915b505050505081565b60006000610fb983610c21565b1190505b919050565b6000610fcf338484611600565b610fd983836117ac565b90505b92915050565b600460205260009081526040902054600160a060020a031681565b8015801561101a575061100f33610ef9565b61101833610c21565b115b1561102457610000565b33600160a060020a03166000908152600960205260409020805460ff19168215151790555b50565b60006000610fb983610ef9565b1190505b919050565b610b8533826117dc565b5b50565b600a54604080516000602091820181905282517fcbcf2e5a000000000000000000000000000000000000000000000000000000008152600160a060020a03868116600483015293519194939093169263cbcf2e5a92602480830193919282900301818787803b156100005760325a03f115610000575050604051519150505b919050565b600e5481565b6000610fd961110984846118b2565b61111385856119b6565b611a05565b90505b92915050565b600a5433600160a060020a0390811691161461113c57610000565b61114860005482611a1f565b600055600554600190101561116c57600a5461116c90600160a060020a0316611a47565b5b600a54600160a060020a03166000908152600160205260409020546111929082611a1f565b600a8054600160a060020a039081166000908152600160205260408120939093559054610b8592911683611600565b5b5b50565b600160a060020a038083166000908152600260209081526040808320938516835292905220545b92915050565b6000600060008487101561120a5760009250611281565b8387111561121a57879250611281565b61123f6112308961122b888a611714565b611a90565b61123a8689611714565b611abc565b915081925061124e8883611714565b905061127e8361127961126a8461122b8c8b611714565b611a90565b61123a888b611714565b611abc565b611a1f565b92505b505095945050505050565b60066020526000908152604090205481565b600160a060020a03821660009081526003602052604081208054829190849081101561000057906000526020600020906003020160005b50805490925033600160a060020a039081169116146112f357610000565b6040805160a0810182528354600160a060020a0316815260018401546020820152600284015467ffffffffffffffff80821693830193909352604060020a810483166060830152608060020a900490911660808201526113539042611af9565b600160a060020a0385166000908152600360205260409020805491925090849081101561000057906000526020600020906003020160005b508054600160a060020a031916815560006001820181905560029091018054600160c060020a0319169055600160a060020a0385168152600360205260409020805460001981019081101561000057906000526020600020906003020160005b50600160a060020a03851660009081526003602052604090208054859081101561000057906000526020600020906003020160005b5081548154600160a060020a031916600160a060020a03918216178255600180840154908301556002928301805493909201805467ffffffffffffffff191667ffffffffffffffff948516178082558354604060020a908190048616026fffffffffffffffff000000000000000019909116178082559254608060020a9081900490941690930277ffffffffffffffff00000000000000000000000000000000199092169190911790915584166000908152600360205260409020805460001981018083559190829080158290116115485760030281600302836000526020600020918201910161154891905b8082111561095d578054600160a060020a031916815560006001820155600281018054600160c060020a0319169055600301610926565b5090565b5b505050600160a060020a033316600090815260016020526040902054611570915082611a1f565b600160a060020a03338116600090815260016020526040808220939093559086168152205461159f9082611714565b600160a060020a038086166000818152600160209081526040918290209490945580518581529051339093169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35b50505050565b600160a060020a0383161561166e576116466008600061161f86610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611714565b6008600061165386610ead565b600160a060020a031681526020810191909152604001600020555b600160a060020a038216156116dc576116b46008600061168d85610ead565b600160a060020a0316600160a060020a031681526020019081526020016000205482611a1f565b600860006116c185610ead565b600160a060020a031681526020810191909152604001600020555b5b505050565b600083826116f082426110fa565b8111156116fc57610000565b611707868686611b1b565b92505b5b50509392505050565b600061172283831115611b4d565b508082035b92915050565b6000610fd983602001518367ffffffffffffffff16856080015167ffffffffffffffff16866040015167ffffffffffffffff16876060015167ffffffffffffffff166111f3565b90505b92915050565b60008167ffffffffffffffff168367ffffffffffffffff1610156117a15781610fd9565b825b90505b92915050565b600033826117ba82426110fa565b8111156117c657610000565b6117d08585611b5d565b92505b5b505092915050565b6117e582610ef9565b6117ee83610c21565b11156117f957610000565b600160a060020a03811660009081526009602052604090205460ff16158015611834575081600160a060020a031681600160a060020a031614155b1561183e57610000565b61184782611070565b1561185157610000565b611864828261185f85610ef9565b611600565b600160a060020a0382811660009081526007602052604090208054600160a060020a031916918316918217905561189a82610ead565b600160a060020a031614610cc357610000565b5b5050565b600160a060020a038216600090815260036020526040812054815b818110156119885761197d836112796003600089600160a060020a0316600160a060020a0316815260200190815260200160002084815481101561000057906000526020600020906003020160005b506040805160a0810182528254600160a060020a031681526001830154602082015260029092015467ffffffffffffffff80821692840192909252604060020a810482166060840152608060020a900416608082015287611af9565b611a1f565b92505b6001016118cd565b600160a060020a0385166000908152600160205260409020546117d09084611714565b92505b505092915050565b600060006119c384611070565b80156119d157506000600d54115b90506119fb816119e9576119e485610ef9565b6119ec565b60005b6111138686611b7b565b611a05565b91505b5092915050565b60008183106117a15781610fd9565b825b90505b92915050565b6000828201611a3c848210801590611a375750838210155b611b4d565b8091505b5092915050565b611a508161104c565b15611a5a57610b85565b6005805460009081526004602052604090208054600160a060020a031916600160a060020a038416179055805460010190555b50565b6000828202611a3c841580611a37575083858381156100005704145b611b4d565b8091505b5092915050565b60006000611acc60008411611b4d565b8284811561000057049050611a3c838581156100005706828502018514611b4d565b8091505b5092915050565b6000610fd98360200151611b0d858561172d565b611714565b90505b92915050565b60008382611b2982426110fa565b811115611b3557610000565b611707868686611b8f565b92505b5b50509392505050565b801515610b8557610000565b5b50565b6000611b6883611a47565b610fd98383611c92565b90505b92915050565b6000610fd983610ef9565b90505b92915050565b600160a060020a038084166000908152600260209081526040808320338516845282528083205493861683526001909152812054909190611bd09084611a1f565b600160a060020a038086166000908152600160205260408082209390935590871681522054611bff9084611714565b600160a060020a038616600090815260016020526040902055611c228184611714565b600160a060020a038087166000818152600260209081526040808320338616845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3600191505b509392505050565b60003382611ca082426110fa565b811115611cac57610000565b6117d08585611cc2565b92505b5b505092915050565b600160a060020a033316600090815260016020526040812054611ce59083611714565b600160a060020a033381166000908152600160205260408082209390935590851681522054611d149083611a1f565b600160a060020a038085166000818152600160209081526040918290209490945580518681529051919333909316927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b929150505600a165627a7a72305820bfa5ddd3fecf3f43aed25385ec7ec3ef79638c2e58d99f85d9a3cc494183bf160029000000000000000000000000a14bdd7e5666d784dcce98ad24d383a6b1cd4182\",\n        \"type\": \"CREATE\",\n        \"value\": \"0x0\"\n      }\n    ],\n    \"error\": \"invalid jump destination (PUSH1) 0\",\n    \"from\": \"0xe4a13bc304682a903e9472f469c33801dd18d9e8\",\n    \"gas\": \"0x435c8\",\n    \"gasUsed\": \"0x435c8\",\n    \"input\": \"0x3b91f506000000000000000000000000a14bdd7e5666d784dcce98ad24d383a6b1cd4182000000000000000000000000e4a13bc304682a903e9472f469c33801dd18d9e8\",\n    \"to\": \"0x1d3ddf7caf024f253487e18bc4a15b1a360c170a\",\n    \"type\": \"CALL\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_inner_throw_outer_revert.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"3956606365\",\n    \"gasLimit\": \"5413248\",\n    \"miner\": \"0x00d8ae40d9a06d0e7a2877b62e32eb959afbe16d\",\n    \"number\": \"2295104\",\n    \"timestamp\": \"1513681256\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x60606040526004361061015e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680625b4487146101a257806311df9995146101cb578063278ecde11461022057806330adce0e146102435780633197cbb61461026c5780634bb278f3146102955780636103d70b146102aa57806363a599a4146102bf5780636a2d1cb8146102d457806375f12b21146102fd57806378e979251461032a578063801db9cc1461035357806386d1a69f1461037c5780638da5cb5b146103915780638ef26a71146103e65780639890220b1461040f5780639b39caef14610424578063b85dfb801461044d578063be9a6555146104a1578063ccb07cef146104b6578063d06c91e4146104e3578063d669e1d414610538578063df40503c14610561578063e2982c2114610576578063f02e030d146105c3578063f2fde38b146105d8578063f3283fba14610611575b600060149054906101000a900460ff1615151561017a57600080fd5b60075442108061018b575060085442115b15151561019757600080fd5b6101a03361064a565b005b34156101ad57600080fd5b6101b5610925565b6040518082815260200191505060405180910390f35b34156101d657600080fd5b6101de61092b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561022b57600080fd5b6102416004808035906020019091905050610951565b005b341561024e57600080fd5b610256610c48565b6040518082815260200191505060405180910390f35b341561027757600080fd5b61027f610c4e565b6040518082815260200191505060405180910390f35b34156102a057600080fd5b6102a8610c54565b005b34156102b557600080fd5b6102bd610f3e565b005b34156102ca57600080fd5b6102d261105d565b005b34156102df57600080fd5b6102e76110d5565b6040518082815260200191505060405180910390f35b341561030857600080fd5b6103106110e1565b604051808215151515815260200191505060405180910390f35b341561033557600080fd5b61033d6110f4565b6040518082815260200191505060405180910390f35b341561035e57600080fd5b6103666110fa565b6040518082815260200191505060405180910390f35b341561038757600080fd5b61038f611104565b005b341561039c57600080fd5b6103a4611196565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f157600080fd5b6103f96111bb565b6040518082815260200191505060405180910390f35b341561041a57600080fd5b6104226111c1565b005b341561042f57600080fd5b610437611296565b6040518082815260200191505060405180910390f35b341561045857600080fd5b610484600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061129c565b604051808381526020018281526020019250505060405180910390f35b34156104ac57600080fd5b6104b46112c0565b005b34156104c157600080fd5b6104c9611341565b604051808215151515815260200191505060405180910390f35b34156104ee57600080fd5b6104f6611354565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561054357600080fd5b61054b61137a565b6040518082815260200191505060405180910390f35b341561056c57600080fd5b610574611385565b005b341561058157600080fd5b6105ad600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116c3565b6040518082815260200191505060405180910390f35b34156105ce57600080fd5b6105d66116db565b005b34156105e357600080fd5b61060f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611829565b005b341561061c57600080fd5b610648600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118fe565b005b600080670de0b6b3a7640000341015151561066457600080fd5b61069b610696670de0b6b3a7640000610688610258346119d990919063ffffffff16565b611a0c90919063ffffffff16565b611a27565b9150660221b262dd80006106ba60065484611a7e90919063ffffffff16565b111515156106c757600080fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156107d557600080fd5b6102c65a03f115156107e657600080fd5b5050506040518051905050610808828260010154611a7e90919063ffffffff16565b8160010181905550610827348260000154611a7e90919063ffffffff16565b816000018190555061084434600554611a7e90919063ffffffff16565b60058190555061085f82600654611a7e90919063ffffffff16565b6006819055503373ffffffffffffffffffffffffffffffffffffffff167ff3c1c7c0eb1328ddc834c4c9e579c06d35f443bf1102b034653624a239c7a40c836040518082815260200191505060405180910390a27fd1dc370699ae69fb860ed754789a4327413ec1cd379b93f2cbedf449a26b0e8583600554604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505050565b60025481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060085442108061096b5750651b48eb57e00060065410155b15151561097757600080fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154821415156109c757600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610ac857600080fd5b6102c65a03f11515610ad957600080fd5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68836000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b7d57600080fd5b6102c65a03f11515610b8e57600080fd5b505050604051805190501515610ba357600080fd5b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000811115610c4457610c433382611a9c565b5b5050565b60055481565b60085481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cb157600080fd5b600854421015610cd357660221b262dd8000600654141515610cd257600080fd5b5b651b48eb57e000600654108015610cf057506213c6806008540142105b151515610cfc57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501515610d7557600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610e3a57600080fd5b6102c65a03f11515610e4b57600080fd5b5050506040518051905090506000811115610f2057600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68826000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610ef957600080fd5b6102c65a03f11515610f0a57600080fd5b505050604051805190501515610f1f57600080fd5b5b6001600960006101000a81548160ff02191690831515021790555050565b600080339150600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114151515610f9657600080fd5b803073ffffffffffffffffffffffffffffffffffffffff163110151515610fbc57600080fd5b610fd181600254611b5090919063ffffffff16565b6002819055506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561105957fe5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110b857600080fd5b6001600060146101000a81548160ff021916908315150217905550565b670de0b6b3a764000081565b600060149054906101000a900460ff1681565b60075481565b651b48eb57e00081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561115f57600080fd5b600060149054906101000a900460ff16151561117a57600080fd5b60008060146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121c57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050151561129457600080fd5b565b61025881565b600a6020528060005260406000206000915090508060000154908060010154905082565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561131b57600080fd5b600060075414151561132c57600080fd5b4260078190555062278d004201600881905550565b600960009054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b660221b262dd800081565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113e557600080fd5b600654660221b262dd800003925061142b670de0b6b3a764000061141c610258670de0b6b3a76400006119d990919063ffffffff16565b81151561142557fe5b04611a27565b915081831115151561143c57600080fd5b600a60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561158c57600080fd5b6102c65a03f1151561159d57600080fd5b50505060405180519050506115bf838260010154611a7e90919063ffffffff16565b81600101819055506115dc83600654611a7e90919063ffffffff16565b6006819055503073ffffffffffffffffffffffffffffffffffffffff167ff3c1c7c0eb1328ddc834c4c9e579c06d35f443bf1102b034653624a239c7a40c846040518082815260200191505060405180910390a27fd1dc370699ae69fb860ed754789a4327413ec1cd379b93f2cbedf449a26b0e856000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600554604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505050565b60016020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173657600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2fde38b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561181357600080fd5b6102c65a03f1151561182457600080fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561188457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156118fb57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561195957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561199557600080fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080828402905060008414806119fa57508284828115156119f757fe5b04145b1515611a0257fe5b8091505092915050565b6000808284811515611a1a57fe5b0490508091505092915050565b6000611a416202a300600754611a7e90919063ffffffff16565b421015611a7557611a6e611a5f600584611a0c90919063ffffffff16565b83611a7e90919063ffffffff16565b9050611a79565b8190505b919050565b6000808284019050838110151515611a9257fe5b8091505092915050565b611aee81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a7e90919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611b4681600254611a7e90919063ffffffff16565b6002819055505050565b6000828211151515611b5e57fe5b8183039050929150505600a165627a7a72305820ec0d82a406896ccf20989b3d6e650abe4dc104e400837f1f58e67ef499493ae90029\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000000\": \"0x0000000000000000000000008d69d00910d0b2afb2a99ed6c16c8129fa8e1751\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000003\": \"0x000000000000000000000000e819f024b41358d2c08e3a868a5c5dd0566078d4\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000007\": \"0x000000000000000000000000000000000000000000000000000000005a388981\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000008\": \"0x000000000000000000000000000000000000000000000000000000005a3b38e6\"\n        }\n      },\n      \"0xd4fcab9f0a6dc0493af47c864f6f17a8a5e2e826\": {\n        \"balance\": \"0x2a2dd979a35cf000\",\n        \"code\": \"0x\",\n        \"nonce\": \"0\",\n        \"storage\": {}\n      },\n      \"0xe819f024b41358d2c08e3a868a5c5dd0566078d4\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d0578063313ce5671461024957806342966c681461027257806370a08231146102ad5780638da5cb5b146102fa57806395d89b411461034f578063a9059cbb146103dd578063dd62ed3e14610437578063f2fde38b146104a3575b600080fd5b34156100ca57600080fd5b6100d26104dc565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610515565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba61069c565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506106a2565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b61025c610952565b6040518082815260200191505060405180910390f35b341561027d57600080fd5b6102936004808035906020019091905050610957565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102e4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610abe565b6040518082815260200191505060405180910390f35b341561030557600080fd5b61030d610b07565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035a57600080fd5b610362610b2d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103a2578082015181840152602081019050610387565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103e857600080fd5b61041d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b66565b604051808215151515815260200191505060405180910390f35b341561044257600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d01565b6040518082815260200191505060405180910390f35b34156104ae57600080fd5b6104da600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d88565b005b6040805190810160405280600b81526020017f416c6c436f6465436f696e00000000000000000000000000000000000000000081525081565b6000808214806105a157506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15156105ac57600080fd5b81600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b600080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061077683600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e5f90919063ffffffff16565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061080b83600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e7d90919063ffffffff16565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506108618382610e7d90919063ffffffff16565b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b600681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b557600080fd5b610a0782600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e7d90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a5f82600054610e7d90919063ffffffff16565b60008190555060003373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600481526020017f414c4c430000000000000000000000000000000000000000000000000000000081525081565b6000610bba82600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e7d90919063ffffffff16565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610c4f82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e5f90919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610de457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e5c5780600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6000808284019050838110151515610e7357fe5b8091505092915050565b6000828211151515610e8b57fe5b8183039050929150505600a165627a7a7230582059f3ea3df0b054e9ab711f37969684ba83fe38f255ffe2c8d850d951121c51100029\",\n        \"nonce\": \"1\",\n        \"storage\": {}\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"3956606365\",\n    \"extraData\": \"0x566961425443\",\n    \"gasLimit\": \"5418523\",\n    \"hash\": \"0x6f37eb930a25da673ea1bb80fd9e32ddac19cdf7cd4bb2eac62cc13598624077\",\n    \"miner\": \"0xd049bfd667cb46aa3ef5df0da3e57db3be39e511\",\n    \"mixHash\": \"0x10971cde68c587c750c23b8589ae868ce82c2c646636b97e7d9856470c5297c7\",\n    \"nonce\": \"0x810f923ff4b450a1\",\n    \"number\": \"2295103\",\n    \"stateRoot\": \"0xff403612573d76dfdaf4fea2429b77dbe9764021ae0e38dc8ac79a3cf551179e\",\n    \"timestamp\": \"1513681246\",\n    \"totalDifficulty\": \"7162347056825919\"\n  },\n  \"input\": \"0xf86d808504e3b292008307dfa69433056b5dcac09a9b4becad0e1dcf92c19bd0af76880e92596fd62900008029a0e5f27bb66431f7081bb7f1f242003056d7f3f35414c352cd3d1848b52716dac2a07d0be78980edb0bd2a0678fc53aa90ea9558ce346b0d947967216918ac74ccea\",\n  \"result\": {\n    \"calls\": [\n      {\n        \"error\": \"invalid opcode 0xfe\",\n        \"from\": \"0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76\",\n        \"gas\": \"0x75fe3\",\n        \"gasUsed\": \"0x75fe3\",\n        \"input\": \"0xa9059cbb000000000000000000000000d4fcab9f0a6dc0493af47c864f6f17a8a5e2e82600000000000000000000000000000000000000000000000000000000000002f4\",\n        \"to\": \"0xe819f024b41358d2c08e3a868a5c5dd0566078d4\",\n        \"type\": \"CALL\",\n        \"value\": \"0x0\"\n      }\n    ],\n    \"error\": \"execution reverted\",\n    \"from\": \"0xd4fcab9f0a6dc0493af47c864f6f17a8a5e2e826\",\n    \"gas\": \"0x78d9e\",\n    \"gasUsed\": \"0x76fc0\",\n    \"input\": \"0x\",\n    \"to\": \"0x33056b5dcac09a9b4becad0e1dcf92c19bd0af76\",\n    \"type\": \"CALL\",\n    \"value\": \"0xe92596fd6290000\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_oog.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"3699098917\",\n    \"gasLimit\": \"5258985\",\n    \"miner\": \"0xd049bfd667cb46aa3ef5df0da3e57db3be39e511\",\n    \"number\": \"2294631\",\n    \"timestamp\": \"1513675366\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x43064693d3d38ad6a7cb579e0d6d9718c8aa6b62\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100bf578063095ea7b31461014d57806318160ddd146101a757806323b872dd146101d0578063313ce5671461024957806342966c68146102785780635a3b7e42146102b357806370a082311461034157806379cc67901461038e57806395d89b41146103e8578063a9059cbb14610476578063dd62ed3e146104b8575b600080fd5b34156100ca57600080fd5b6100d2610524565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101125780820151818401526020810190506100f7565b50505050905090810190601f16801561013f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015857600080fd5b61018d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061055d565b604051808215151515815260200191505060405180910390f35b34156101b257600080fd5b6101ba6105ea565b6040518082815260200191505060405180910390f35b34156101db57600080fd5b61022f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f0565b604051808215151515815260200191505060405180910390f35b341561025457600080fd5b61025c610910565b604051808260ff1660ff16815260200191505060405180910390f35b341561028357600080fd5b6102996004808035906020019091905050610915565b604051808215151515815260200191505060405180910390f35b34156102be57600080fd5b6102c6610a18565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103065780820151818401526020810190506102eb565b50505050905090810190601f1680156103335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a51565b6040518082815260200191505060405180910390f35b341561039957600080fd5b6103ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a69565b604051808215151515815260200191505060405180910390f35b34156103f357600080fd5b6103fb610bf8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561043b578082015181840152602081019050610420565b50505050905090810190601f1680156104685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561048157600080fd5b6104b6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c31565b005b34156104c357600080fd5b61050e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e34565b6040518082815260200191505060405180910390f35b6040805190810160405280600881526020017f446f70616d696e6500000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001905092915050565b60005481565b6000808373ffffffffffffffffffffffffffffffffffffffff161415151561061757600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561066557600080fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401101515156106f157fe5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561077c57600080fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561096557600080fd5b81600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508160008082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a260019050919050565b6040805190810160405280600981526020017f446f706d6e20302e32000000000000000000000000000000000000000000000081525081565b60016020528060005260406000206000915090505481565b600081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610ab957600080fd5b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610b4457600080fd5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508160008082825403925050819055508273ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040518082815260200191505060405180910390a26001905092915050565b6040805190810160405280600581526020017f444f504d4e00000000000000000000000000000000000000000000000000000081525081565b60008273ffffffffffffffffffffffffffffffffffffffff1614151515610c5757600080fd5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610ca557600080fd5b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110151515610d3157fe5b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60026020528160005260406000206020528060005260406000206000915091505054815600a165627a7a723058206d93424f4e7b11929b8276a269038402c10c0ddf21800e999916ddd9dff4a7630029\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x296b66049cc4f9c8bf3d4f14752add261d1a980b39bdd194a7897baf39ac7579\": \"0x0000000000000000000000000000000000000000033b2e3c9fc9653f9e72b1e0\"\n        }\n      },\n      \"0x94194bc2aaf494501d7880b61274a169f6502a54\": {\n        \"balance\": \"0xea8c39a876d19888d\",\n        \"code\": \"0x\",\n        \"nonce\": \"265\",\n        \"storage\": {}\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"3699098917\",\n    \"extraData\": \"0x4554482e45544846414e532e4f52472d4641313738394444\",\n    \"gasLimit\": \"5263953\",\n    \"hash\": \"0x03a0f62a8106793dafcfae7b75fd2654322062d585a19cea568314d7205790dc\",\n    \"miner\": \"0xbbf5029fd710d227630c8b7d338051b8e76d50b3\",\n    \"mixHash\": \"0x15482cc64b7c00a947f5bf015dfc010db1a6a668c74df61974d6a7848c174408\",\n    \"nonce\": \"0xd1bdb150f6fd170e\",\n    \"number\": \"2294630\",\n    \"stateRoot\": \"0x1ab1a534e84cc787cda1db21e0d5920ab06017948075b759166cfea7274657a1\",\n    \"timestamp\": \"1513675347\",\n    \"totalDifficulty\": \"7160543502214733\"\n  },\n  \"input\": \"0xf8ab820109855d21dba00082ca1d9443064693d3d38ad6a7cb579e0d6d9718c8aa6b6280b844a9059cbb000000000000000000000000e77b1ac803616503510bed0086e3a7be2627a69900000000000000000000000000000000000000000000000000000009502f90001ba0ce3ad83f5530136467b7c2bb225f406bd170f4ad59c254e5103c34eeabb5bd69a0455154527224a42ab405cacf0fe92918a75641ce4152f8db292019a5527aa956\",\n  \"result\": {\n    \"error\": \"out of gas\",\n    \"from\": \"0x94194bc2aaf494501d7880b61274a169f6502a54\",\n    \"gas\": \"0x7045\",\n    \"gasUsed\": \"0x7045\",\n    \"input\": \"0xa9059cbb000000000000000000000000e77b1ac803616503510bed0086e3a7be2627a69900000000000000000000000000000000000000000000000000000009502f9000\",\n    \"to\": \"0x43064693d3d38ad6a7cb579e0d6d9718c8aa6b62\",\n    \"type\": \"CALL\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_revert.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"3665057456\",\n    \"gasLimit\": \"5232723\",\n    \"miner\": \"0xf4d8e706cfb25c0decbbdd4d2e2cc10c66376a3f\",\n    \"number\": \"2294501\",\n    \"timestamp\": \"1513673601\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9\": {\n        \"balance\": \"0x2a3fc32bcc019283\",\n        \"code\": \"0x\",\n        \"nonce\": \"10\",\n        \"storage\": {}\n      },\n      \"0xabbcd5b340c80b5f1c0545c04c987b87310296ae\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156100755763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632d0335ab811461007a578063548db174146100ab5780637f649783146100fc578063b092145e1461014d578063c3f44c0a14610186578063c47cf5de14610203575b600080fd5b341561008557600080fd5b610099600160a060020a0360043516610270565b60405190815260200160405180910390f35b34156100b657600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061028f95505050505050565b005b341561010757600080fd5b6100fa600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061029e95505050505050565b005b341561015857600080fd5b610172600160a060020a03600435811690602435166102ad565b604051901515815260200160405180910390f35b341561019157600080fd5b6100fa6004803560ff1690602480359160443591606435600160a060020a0316919060a49060843590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965050509235600160a060020a031692506102cd915050565b005b341561020e57600080fd5b61025460046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061056a95505050505050565b604051600160a060020a03909116815260200160405180910390f35b600160a060020a0381166000908152602081905260409020545b919050565b61029a816000610594565b5b50565b61029a816001610594565b5b50565b600160209081526000928352604080842090915290825290205460ff1681565b60008080600160a060020a038416158061030d5750600160a060020a038085166000908152600160209081526040808320339094168352929052205460ff165b151561031857600080fd5b6103218561056a565b600160a060020a038116600090815260208190526040808220549295507f19000000000000000000000000000000000000000000000000000000000000009230918891908b908b90517fff000000000000000000000000000000000000000000000000000000000000008089168252871660018201526c01000000000000000000000000600160a060020a038088168202600284015286811682026016840152602a8301869052841602604a820152605e810182805190602001908083835b6020831061040057805182525b601f1990920191602091820191016103e0565b6001836020036101000a0380198251168184511617909252505050919091019850604097505050505050505051809103902091506001828a8a8a6040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f1151561049957600080fd5b5050602060405103519050600160a060020a03838116908216146104bc57600080fd5b600160a060020a0380841660009081526020819052604090819020805460010190559087169086905180828051906020019080838360005b8381101561050d5780820151818401525b6020016104f4565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008661646e5a03f1915050151561055e57600080fd5b5b505050505050505050565b600060248251101561057e5750600061028a565b600160a060020a0360248301511690505b919050565b60005b825181101561060157600160a060020a033316600090815260016020526040812083918584815181106105c657fe5b90602001906020020151600160a060020a031681526020810191909152604001600020805460ff19169115159190911790555b600101610597565b5b5050505600a165627a7a723058200027e8b695e9d2dea9f3629519022a69f3a1d23055ce86406e686ea54f31ee9c0029\",\n        \"nonce\": \"1\",\n        \"storage\": {}\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"3672229776\",\n    \"extraData\": \"0x4554482e45544846414e532e4f52472d4641313738394444\",\n    \"gasLimit\": \"5227619\",\n    \"hash\": \"0xa07b3d6c6bf63f5f981016db9f2d1d93033833f2c17e8bf7209e85f1faf08076\",\n    \"miner\": \"0xbbf5029fd710d227630c8b7d338051b8e76d50b3\",\n    \"mixHash\": \"0x806e151ce2817be922e93e8d5921fa0f0d0fd213d6b2b9a3fa17458e74a163d0\",\n    \"nonce\": \"0xbc5d43adc2c30c7d\",\n    \"number\": \"2294500\",\n    \"stateRoot\": \"0xca645b335888352ef9d8b1ef083e9019648180b259026572e3139717270de97d\",\n    \"timestamp\": \"1513673552\",\n    \"totalDifficulty\": \"7160066586979149\"\n  },\n  \"input\": \"0xf9018b0a8505d21dba00832dc6c094abbcd5b340c80b5f1c0545c04c987b87310296ae80b9012473b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988000000000000000000000000000000000000000000000000000000000000000000000000000000001ba0fd659d76a4edbd2a823e324c93f78ad6803b30ff4a9c8bce71ba82798975c70ca06571eecc0b765688ec6c78942c5ee8b585e00988c0141b518287e9be919bc48a\",\n  \"result\": {\n    \"error\": \"execution reverted\",\n    \"from\": \"0x0f6cef2b7fbb504782e35aa82a2207e816a2b7a9\",\n    \"gas\": \"0x2d55e8\",\n    \"gasUsed\": \"0xc3\",\n    \"input\": \"0x73b40a5c000000000000000000000000400de2e016bda6577407dfc379faba9899bc73ef0000000000000000000000002cc31912b2b0f3075a87b3640923d45a26cef3ee000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000064d79d8e6c7265636f76657279416464726573730000000000000000000000000000000000000000000000000000000000383e3ec32dc0f66d8fe60dbdc2f6815bdf73a988383e3ec32dc0f66d8fe60dbdc2f6815bdf73a98800000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n    \"to\": \"0xabbcd5b340c80b5f1c0545c04c987b87310296ae\",\n    \"type\": \"CALL\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_simple.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"3502894804\",\n    \"gasLimit\": \"4722976\",\n    \"miner\": \"0x1585936b53834b021f68cc13eeefdec2efc8e724\",\n    \"number\": \"2289806\",\n    \"timestamp\": \"1513601314\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x\",\n        \"nonce\": \"22\",\n        \"storage\": {}\n      },\n      \"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe\": {\n        \"balance\": \"0x4d87094125a369d9bd5\",\n        \"code\": \"0x606060405236156100935763ffffffff60e060020a60003504166311ee8382811461009c57806313af4035146100be5780631f5e8f4c146100ee57806324daddc5146101125780634921a91a1461013b57806363e4bff414610157578063764978f91461017f578063893d20e8146101a1578063ba40aaa1146101cd578063cebc9a82146101f4578063e177246e14610216575b61009a5b5b565b005b34156100a457fe5b6100ac61023d565b60408051918252519081900360200190f35b34156100c657fe5b6100da600160a060020a0360043516610244565b604080519115158252519081900360200190f35b34156100f657fe5b6100da610307565b604080519115158252519081900360200190f35b341561011a57fe5b6100da6004351515610318565b604080519115158252519081900360200190f35b6100da6103d6565b604080519115158252519081900360200190f35b6100da600160a060020a0360043516610420565b604080519115158252519081900360200190f35b341561018757fe5b6100ac61046c565b60408051918252519081900360200190f35b34156101a957fe5b6101b1610473565b60408051600160a060020a039092168252519081900360200190f35b34156101d557fe5b6100da600435610483565b604080519115158252519081900360200190f35b34156101fc57fe5b6100ac61050d565b60408051918252519081900360200190f35b341561021e57fe5b6100da600435610514565b604080519115158252519081900360200190f35b6003545b90565b60006000610250610473565b600160a060020a031633600160a060020a03161415156102705760006000fd5b600160a060020a03831615156102865760006000fd5b50600054600160a060020a0390811690831681146102fb57604051600160a060020a0380851691908316907ffcf23a92150d56e85e3a3d33b357493246e55783095eb6a733eb8439ffc752c890600090a360008054600160a060020a031916600160a060020a03851617905560019150610300565b600091505b5b50919050565b60005460a060020a900460ff165b90565b60006000610324610473565b600160a060020a031633600160a060020a03161415156103445760006000fd5b5060005460a060020a900460ff16801515831515146102fb576000546040805160a060020a90920460ff1615158252841515602083015280517fe6cd46a119083b86efc6884b970bfa30c1708f53ba57b86716f15b2f4551a9539281900390910190a16000805460a060020a60ff02191660a060020a8515150217905560019150610300565b600091505b5b50919050565b60006103e0610307565b801561040557506103ef610473565b600160a060020a031633600160a060020a031614155b156104105760006000fd5b610419336105a0565b90505b5b90565b600061042a610307565b801561044f5750610439610473565b600160a060020a031633600160a060020a031614155b1561045a5760006000fd5b610463826105a0565b90505b5b919050565b6001545b90565b600054600160a060020a03165b90565b6000600061048f610473565b600160a060020a031633600160a060020a03161415156104af5760006000fd5b506001548281146102fb57604080518281526020810185905281517f79a3746dde45672c9e8ab3644b8bb9c399a103da2dc94b56ba09777330a83509929181900390910190a160018381559150610300565b600091505b5b50919050565b6002545b90565b60006000610520610473565b600160a060020a031633600160a060020a03161415156105405760006000fd5b506002548281146102fb57604080518281526020810185905281517ff6991a728965fedd6e927fdf16bdad42d8995970b4b31b8a2bf88767516e2494929181900390910190a1600283905560019150610300565b600091505b5b50919050565b60006000426105ad61023d565b116102fb576105c46105bd61050d565b4201610652565b6105cc61046c565b604051909150600160a060020a038416908290600081818185876187965a03f1925050501561063d57604080518281529051600160a060020a038516917f9bca65ce52fdef8a470977b51f247a2295123a4807dfa9e502edf0d30722da3b919081900360200190a260019150610300565b6102fb42610652565b5b600091505b50919050565b60038190555b505600a165627a7a72305820f3c973c8b7ed1f62000b6701bd5b708469e19d0f1d73fde378a56c07fd0b19090029\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000000\": \"0x000000000000000000000001b436ba50d378d4bbc8660d312a13df6af6e89dfb\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000001\": \"0x00000000000000000000000000000000000000000000000006f05b59d3b20000\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000002\": \"0x000000000000000000000000000000000000000000000000000000000000003c\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000003\": \"0x000000000000000000000000000000000000000000000000000000005a37b834\"\n        }\n      },\n      \"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb\": {\n        \"balance\": \"0x1780d77678137ac1b775\",\n        \"code\": \"0x\",\n        \"nonce\": \"29072\",\n        \"storage\": {}\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"3509749784\",\n    \"extraData\": \"0x4554482e45544846414e532e4f52472d4641313738394444\",\n    \"gasLimit\": \"4727564\",\n    \"hash\": \"0x609948ac3bd3c00b7736b933248891d6c901ee28f066241bddb28f4e00a9f440\",\n    \"miner\": \"0xbbf5029fd710d227630c8b7d338051b8e76d50b3\",\n    \"mixHash\": \"0xb131e4507c93c7377de00e7c271bf409ec7492767142ff0f45c882f8068c2ada\",\n    \"nonce\": \"0x4eb12e19c16d43da\",\n    \"number\": \"2289805\",\n    \"stateRoot\": \"0xc7f10f352bff82fac3c2999d3085093d12652e19c7fd32591de49dc5d91b4f1f\",\n    \"timestamp\": \"1513601261\",\n    \"totalDifficulty\": \"7143276353481064\"\n  },\n  \"input\": \"0xf88b8271908506fc23ac0083015f90943b873a919aa0512d5a0f09e6dcceaa4a6727fafe80a463e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c52aa0bdce0b59e8761854e857fe64015f06dd08a4fbb7624f6094893a79a72e6ad6bea01d9dde033cff7bb235a3163f348a6d7ab8d6b52bc0963a95b91612e40ca766a4\",\n  \"result\": {\n    \"calls\": [\n      {\n        \"from\": \"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe\",\n        \"input\": \"0x\",\n        \"to\": \"0x0024f658a46fbb89d8ac105e98d7ac7cbbaf27c5\",\n        \"type\": \"CALL\",\n        \"value\": \"0x6f05b59d3b20000\"\n      }\n    ],\n    \"from\": \"0xb436ba50d378d4bbc8660d312a13df6af6e89dfb\",\n    \"gas\": \"0x10738\",\n    \"gasUsed\": \"0x3ef9\",\n    \"input\": \"0x63e4bff40000000000000000000000000024f658a46fbb89d8ac105e98d7ac7cbbaf27c5\",\n    \"output\": \"0x0000000000000000000000000000000000000000000000000000000000000001\",\n    \"to\": \"0x3b873a919aa0512d5a0f09e6dcceaa4a6727fafe\",\n    \"type\": \"CALL\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/testdata/call_tracer_throw.json",
    "content": "{\n  \"context\": {\n    \"difficulty\": \"117009631\",\n    \"gasLimit\": \"4712388\",\n    \"miner\": \"0x294e5d6c39a36ce38af1dca70c1060f78dee8070\",\n    \"number\": \"25009\",\n    \"timestamp\": \"1479891666\"\n  },\n  \"genesis\": {\n    \"alloc\": {\n      \"0x70c9217d814985faef62b124420f8dfbddd96433\": {\n        \"balance\": \"0x4ecd70668f5d854a\",\n        \"code\": \"0x\",\n        \"nonce\": \"1638\",\n        \"storage\": {}\n      },\n      \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\": {\n        \"balance\": \"0x0\",\n        \"code\": \"0x606060405236156101745760e060020a600035046302d05d3f811461017c57806304a7fdbc1461018e5780630e90f957146101fb5780630fb5a6b41461021257806314baa1b61461021b57806317fc45e21461023a5780632b096926146102435780632e94420f1461025b578063325a19f11461026457806336da44681461026d5780633f81a2c01461027f5780633fc306821461029757806345ecd3d7146102d45780634665096d146102dd5780634e71d92d146102e657806351a34eb8146103085780636111bb951461032d5780636f265b93146103445780637e9014e11461034d57806390ba009114610360578063927df5e014610393578063a7f437791461046c578063ad8f50081461046e578063bc6d909414610477578063bdec3ad114610557578063c19d93fb1461059a578063c9503fe2146105ad578063e0a73a93146105b6578063ea71b02d146105bf578063ea8a1af0146105d1578063ee4a96f9146105f3578063f1ff78a01461065c575b61046c610002565b610665600054600160a060020a031681565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600554600090600160a060020a0390811633909116146106a857610002565b61068260015460a060020a900460ff166000145b90565b61069660085481565b61046c600435600154600160a060020a03166000141561072157610002565b610696600d5481565b610696600435600f8160068110156100025750015481565b61069660045481565b61069660035481565b610665600554600160a060020a031681565b61069660043560158160068110156100025750015481565b6106966004355b600b54600f5460009160028202808203928083039290810191018386101561078357601054840186900394505b50505050919050565b61069660025481565b61069660095481565b61046c600554600090600160a060020a03908116339091161461085857610002565b61046c600435600554600090600160a060020a03908116339091161461092e57610002565b6106826001805460a060020a900460ff161461020f565b610696600b5481565b61068260075460a060020a900460ff1681565b6106966004355b600b54601554600091600282028082039280830392908101910183861015610a6c5760165494506102cb565b61046c6004356024356044356040805160015460e360020a631c2d8fb302825260b260020a691858d8dbdd5b9d18dd1b02600483015291516000928392600160a060020a03919091169163e16c7d9891602481810192602092909190829003018187876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610b4657610002565b005b610696600a5481565b61046c60006000600060006000600160009054906101000a9004600160a060020a0316600160a060020a031663e16c7d986040518160e060020a028152600401808060b260020a691858d8dbdd5b9d18dd1b0281526020015060200190506020604051808303816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663c4b0c96a336040518260e060020a0281526004018082600160a060020a031681526020019150506020604051808303816000876161da5a03f1156100025750506040515115159050610f1757610002565b61046c5b60015b60058160ff16101561071e57600f6001820160ff166006811015610002578101549060ff83166006811015610002570154101561129057610002565b61069660015460a060020a900460ff1681565b61069660065481565b610696600c5481565b610665600754600160a060020a031681565b61046c600554600090600160a060020a0390811633909116146112c857610002565b6040805160c081810190925261046c9160049160c4918390600690839083908082843760408051808301909152929750909561018495509193509091908390839080828437509095505050505050600154600090600160a060020a03168114156113fb57610002565b610696600e5481565b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b60408051918252519081900360200190f35b5060005b60068160ff16101561070857828160ff166006811015610002576020020151600f60ff831660068110156100025701558160ff82166006811015610002576020020151601560ff831660068110156100025701556001016106ac565b61071061055b565b505050565b600e8054820190555b50565b6040805160015460e060020a6313bc6d4b02825233600160a060020a03908116600484015292519216916313bc6d4b9160248181019260209290919082900301816000876161da5a03f115610002575050604051511515905061071557610002565b83861015801561079257508286105b156107b457600f546010546011548689039082030291909104900394506102cb565b8286101580156107c55750600b5486105b156107e757600f546011546012548589039082030291909104900394506102cb565b600b5486108015906107f857508186105b1561081d57600b54600f546012546013549289039281039290920204900394506102cb565b81861015801561082c57508086105b1561084e57600f546013546014548489039082030291909104900394506102cb565b60145494506102cb565b60015460a060020a900460ff1660001461087157610002565b600254600a01431161088257610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750505060405180519060200150905080600160a060020a031663771d50e16040518160e060020a0281526004018090506000604051808303816000876161da5a03f1156100025750505050565b60015460a060020a900460ff1660001461094757610002565b600254600a01431161095857610002565b6040805160015460e360020a631c2d8fb302825260a860020a6a636f6e74726163746170690260048301529151600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180517f51a34eb8000000000000000000000000000000000000000000000000000000008252600482018690529151919350600160a060020a03841692506351a34eb8916024808301926000929190829003018183876161da5a03f11561000257505050600b8290554360025560408051838152905130600160a060020a0316917fa609f6bd4ad0b4f419ddad4ac9f0d02c2b9295c5e6891469055cf73c2b568fff919081900360200190a25050565b838610158015610a7b57508286105b15610a9d576015546016546017548689039082900302919091040194506102cb565b828610158015610aae5750600b5486105b15610ad0576015546017546018548589039082900302919091040194506102cb565b600b548610801590610ae157508186105b15610b0657600b546015546018546019549289039281900392909202040194506102cb565b818610158015610b1557508086105b15610b3757601554601954601a548489039082900302919091040194506102cb565b601a54860181900394506102cb565b60015460a060020a900460ff16600014610b5f57610002565b6001805460a060020a60ff02191660a060020a17908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919450600160a060020a038516925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604080518051600a556005547ffebf661200000000000000000000000000000000000000000000000000000000825233600160a060020a03908116600484015216602482015260448101879052905163febf661291606480820192600092909190829003018183876161da5a03f115610002575050508215610cc7576007805473ffffffffffffffffffffffffffffffffffffffff191633179055610dbb565b6040805160055460065460e060020a63599efa6b028352600160a060020a039182166004840152602483015291519184169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050604080516006547f56ccb6f000000000000000000000000000000000000000000000000000000000825233600160a060020a03166004830152602482015290516356ccb6f091604480820192600092909190829003018183876161da5a03f115610002575050600580546007805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a038416179091551633179055505b6007805460a060020a60ff02191660a060020a87810291909117918290556008544301600955900460ff1615610df757600a54610e039061029e565b600a54610e0b90610367565b600c55610e0f565b600c555b600c54670de0b6b3a7640000850204600d55600754600554604080517f759297bb000000000000000000000000000000000000000000000000000000008152600160a060020a039384166004820152918316602483015260448201879052519184169163759297bb91606481810192600092909190829003018183876161da5a03f11561000257505060408051600754600a54600d54600554600c5460a060020a850460ff161515865260208601929092528486019290925260608401529251600160a060020a0391821694509281169230909116917f3b3d1986083d191be01d28623dc19604728e29ae28bdb9ba52757fdee1a18de2919081900360800190a45050505050565b600954431015610f2657610002565b6001805460a060020a900460ff1614610f3e57610002565b6001805460a060020a60ff0219167402000000000000000000000000000000000000000017908190556040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f1156100025750506040805180516004805460e260020a633e4baddd028452908301529151919750600160a060020a038816925063f92eb77491602482810192602092919082900301816000876161da5a03f115610002575050604051516007549095506000945060a060020a900460ff1615905061105c57600a5484111561105757600a54600d54670de0b6b3a7640000918603020492505b61107e565b600a5484101561107e57600a54600d54670de0b6b3a764000091869003020492505b60065483111561108e5760065492505b6006548390039150600083111561111857604080516005546007547f5928d37f000000000000000000000000000000000000000000000000000000008352600160a060020a0391821660048401528116602483015260448201869052915191871691635928d37f91606481810192600092909190829003018183876161da5a03f115610002575050505b600082111561117a576040805160055460e060020a63599efa6b028252600160a060020a0390811660048301526024820185905291519187169163599efa6b91604481810192600092909190829003018183876161da5a03f115610002575050505b6040805185815260208101849052808201859052905130600160a060020a0316917f89e690b1d5aaae14f3e85f108dc92d9ab3763a58d45aed8b59daedbbae8fe794919081900360600190a260008311156112285784600160a060020a0316634cc927d785336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f11561000257505050611282565b84600160a060020a0316634cc927d7600a60005054336040518360e060020a0281526004018083815260200182600160a060020a03168152602001925050506000604051808303816000876161da5a03f115610002575050505b600054600160a060020a0316ff5b60156001820160ff166006811015610002578101549060ff8316600681101561000257015411156112c057610002565b60010161055e565b60015460a060020a900460ff166000146112e157610002565b600254600a0143116112f257610002565b6001546040805160e360020a631c2d8fb302815260a860020a6a636f6e74726163746170690260048201529051600160a060020a03929092169163e16c7d989160248181019260209290919082900301816000876161da5a03f11561000257505060408051805160055460065460e060020a63599efa6b028452600160a060020a03918216600485015260248401529251909450918416925063599efa6b916044808301926000929190829003018183876161da5a03f1156100025750505080600160a060020a0316632b68bb2d6040518160e060020a0281526004018090506000604051808303816000876161da5a03f115610002575050600054600160a060020a03169050ff5b6001546040805160e060020a6313bc6d4b02815233600160a060020a039081166004830152915191909216916313bc6d4b91602480830192602092919082900301816000876161da5a03f11561000257505060405151151590506106a85761000256\",\n        \"nonce\": \"1\",\n        \"storage\": {\n          \"0x0000000000000000000000000000000000000000000000000000000000000001\": \"0x0000000000000000000000002cccf5e0538493c235d1c5ef6580f77d99e91396\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000002\": \"0x00000000000000000000000000000000000000000000000000000000000061a9\",\n          \"0x0000000000000000000000000000000000000000000000000000000000000005\": \"0x00000000000000000000000070c9217d814985faef62b124420f8dfbddd96433\"\n        }\n      }\n    },\n    \"config\": {\n      \"byzantiumBlock\": 1700000,\n      \"chainId\": 3,\n      \"daoForkSupport\": true,\n      \"eip150Block\": 0,\n      \"eip150Hash\": \"0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d\",\n      \"eip155Block\": 10,\n      \"eip158Block\": 10,\n      \"ethash\": {},\n      \"homesteadBlock\": 0\n    },\n    \"difficulty\": \"117066792\",\n    \"extraData\": \"0xd783010502846765746887676f312e372e33856c696e7578\",\n    \"gasLimit\": \"4712388\",\n    \"hash\": \"0xe23e8d4562a1045b70cbc99fefb20c101a8f0fc8559a80d65fea8896e2f1d46e\",\n    \"miner\": \"0x71842f946b98800fe6feb49f0ae4e253259031c9\",\n    \"mixHash\": \"0x0aada9d6e93dd4db0d09c0488dc0a048fca2ccdc1f3fc7b83ba2a8d393a3a4ff\",\n    \"nonce\": \"0x70849d5838dee2e9\",\n    \"number\": \"25008\",\n    \"stateRoot\": \"0x1e01d2161794768c5b917069e73d86e8dca80cd7f3168c0597de420ab93a3b7b\",\n    \"timestamp\": \"1479891641\",\n    \"totalDifficulty\": \"1896347038589\"\n  },\n  \"input\": \"0xf88b8206668504a817c8008303d09094c212e03b9e060e36facad5fd8f4435412ca22e6b80a451a34eb8000000000000000000000000000000000000000000000027fad02094277c000029a0692a3b4e7b2842f8dd7832e712c21e09f451f416c8976d5b8d02e8c0c2b4bea9a07645e90fc421b63dd755767fd93d3c03b4ec0c4d8fafa059558d08cf11d59750\",\n  \"result\": {\n    \"error\": \"invalid jump destination (PUSH1) 2\",\n    \"from\": \"0x70c9217d814985faef62b124420f8dfbddd96433\",\n    \"gas\": \"0x37b38\",\n    \"gasUsed\": \"0x37b38\",\n    \"input\": \"0x51a34eb8000000000000000000000000000000000000000000000027fad02094277c0000\",\n    \"to\": \"0xc212e03b9e060e36facad5fd8f4435412ca22e6b\",\n    \"type\": \"CALL\",\n    \"value\": \"0x0\"\n  }\n}\n"
  },
  {
    "path": "sero/tracers/tracer.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tracers\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"sync/atomic\"\n\t\"time\"\n\t\"unsafe\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"gopkg.in/olebedev/go-duktape.v3\"\n)\n\n// bigIntegerJS is the minified version of https://github.com/peterolson/BigInteger.js.\nconst bigIntegerJS = `var bigInt=function(undefined){\"use strict\";var BASE=1e7,LOG_BASE=7,MAX_INT=9007199254740992,MAX_INT_ARR=smallToArray(MAX_INT),LOG_MAX_INT=Math.log(MAX_INT);function Integer(v,radix){if(typeof v===\"undefined\")return Integer[0];if(typeof radix!==\"undefined\")return+radix===10?parseValue(v):parseBase(v,radix);return parseValue(v)}function BigInteger(value,sign){this.value=value;this.sign=sign;this.isSmall=false}BigInteger.prototype=Object.create(Integer.prototype);function SmallInteger(value){this.value=value;this.sign=value<0;this.isSmall=true}SmallInteger.prototype=Object.create(Integer.prototype);function isPrecise(n){return-MAX_INT<n&&n<MAX_INT}function smallToArray(n){if(n<1e7)return[n];if(n<1e14)return[n%1e7,Math.floor(n/1e7)];return[n%1e7,Math.floor(n/1e7)%1e7,Math.floor(n/1e14)]}function arrayToSmall(arr){trim(arr);var length=arr.length;if(length<4&&compareAbs(arr,MAX_INT_ARR)<0){switch(length){case 0:return 0;case 1:return arr[0];case 2:return arr[0]+arr[1]*BASE;default:return arr[0]+(arr[1]+arr[2]*BASE)*BASE}}return arr}function trim(v){var i=v.length;while(v[--i]===0);v.length=i+1}function createArray(length){var x=new Array(length);var i=-1;while(++i<length){x[i]=0}return x}function truncate(n){if(n>0)return Math.floor(n);return Math.ceil(n)}function add(a,b){var l_a=a.length,l_b=b.length,r=new Array(l_a),carry=0,base=BASE,sum,i;for(i=0;i<l_b;i++){sum=a[i]+b[i]+carry;carry=sum>=base?1:0;r[i]=sum-carry*base}while(i<l_a){sum=a[i]+carry;carry=sum===base?1:0;r[i++]=sum-carry*base}if(carry>0)r.push(carry);return r}function addAny(a,b){if(a.length>=b.length)return add(a,b);return add(b,a)}function addSmall(a,carry){var l=a.length,r=new Array(l),base=BASE,sum,i;for(i=0;i<l;i++){sum=a[i]-base+carry;carry=Math.floor(sum/base);r[i]=sum-carry*base;carry+=1}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}BigInteger.prototype.add=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.subtract(n.negate())}var a=this.value,b=n.value;if(n.isSmall){return new BigInteger(addSmall(a,Math.abs(b)),this.sign)}return new BigInteger(addAny(a,b),this.sign)};BigInteger.prototype.plus=BigInteger.prototype.add;SmallInteger.prototype.add=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.subtract(n.negate())}var b=n.value;if(n.isSmall){if(isPrecise(a+b))return new SmallInteger(a+b);b=smallToArray(Math.abs(b))}return new BigInteger(addSmall(b,Math.abs(a)),a<0)};SmallInteger.prototype.plus=SmallInteger.prototype.add;function subtract(a,b){var a_l=a.length,b_l=b.length,r=new Array(a_l),borrow=0,base=BASE,i,difference;for(i=0;i<b_l;i++){difference=a[i]-borrow-b[i];if(difference<0){difference+=base;borrow=1}else borrow=0;r[i]=difference}for(i=b_l;i<a_l;i++){difference=a[i]-borrow;if(difference<0)difference+=base;else{r[i++]=difference;break}r[i]=difference}for(;i<a_l;i++){r[i]=a[i]}trim(r);return r}function subtractAny(a,b,sign){var value;if(compareAbs(a,b)>=0){value=subtract(a,b)}else{value=subtract(b,a);sign=!sign}value=arrayToSmall(value);if(typeof value===\"number\"){if(sign)value=-value;return new SmallInteger(value)}return new BigInteger(value,sign)}function subtractSmall(a,b,sign){var l=a.length,r=new Array(l),carry=-b,base=BASE,i,difference;for(i=0;i<l;i++){difference=a[i]+carry;carry=Math.floor(difference/base);difference%=base;r[i]=difference<0?difference+base:difference}r=arrayToSmall(r);if(typeof r===\"number\"){if(sign)r=-r;return new SmallInteger(r)}return new BigInteger(r,sign)}BigInteger.prototype.subtract=function(v){var n=parseValue(v);if(this.sign!==n.sign){return this.add(n.negate())}var a=this.value,b=n.value;if(n.isSmall)return subtractSmall(a,Math.abs(b),this.sign);return subtractAny(a,b,this.sign)};BigInteger.prototype.minus=BigInteger.prototype.subtract;SmallInteger.prototype.subtract=function(v){var n=parseValue(v);var a=this.value;if(a<0!==n.sign){return this.add(n.negate())}var b=n.value;if(n.isSmall){return new SmallInteger(a-b)}return subtractSmall(b,Math.abs(a),a>=0)};SmallInteger.prototype.minus=SmallInteger.prototype.subtract;BigInteger.prototype.negate=function(){return new BigInteger(this.value,!this.sign)};SmallInteger.prototype.negate=function(){var sign=this.sign;var small=new SmallInteger(-this.value);small.sign=!sign;return small};BigInteger.prototype.abs=function(){return new BigInteger(this.value,false)};SmallInteger.prototype.abs=function(){return new SmallInteger(Math.abs(this.value))};function multiplyLong(a,b){var a_l=a.length,b_l=b.length,l=a_l+b_l,r=createArray(l),base=BASE,product,carry,i,a_i,b_j;for(i=0;i<a_l;++i){a_i=a[i];for(var j=0;j<b_l;++j){b_j=b[j];product=a_i*b_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}function multiplySmall(a,b){var l=a.length,r=new Array(l),base=BASE,carry=0,product,i;for(i=0;i<l;i++){product=a[i]*b+carry;carry=Math.floor(product/base);r[i]=product-carry*base}while(carry>0){r[i++]=carry%base;carry=Math.floor(carry/base)}return r}function shiftLeft(x,n){var r=[];while(n-- >0)r.push(0);return r.concat(x)}function multiplyKaratsuba(x,y){var n=Math.max(x.length,y.length);if(n<=30)return multiplyLong(x,y);n=Math.ceil(n/2);var b=x.slice(n),a=x.slice(0,n),d=y.slice(n),c=y.slice(0,n);var ac=multiplyKaratsuba(a,c),bd=multiplyKaratsuba(b,d),abcd=multiplyKaratsuba(addAny(a,b),addAny(c,d));var product=addAny(addAny(ac,shiftLeft(subtract(subtract(abcd,ac),bd),n)),shiftLeft(bd,2*n));trim(product);return product}function useKaratsuba(l1,l2){return-.012*l1-.012*l2+15e-6*l1*l2>0}BigInteger.prototype.multiply=function(v){var n=parseValue(v),a=this.value,b=n.value,sign=this.sign!==n.sign,abs;if(n.isSmall){if(b===0)return Integer[0];if(b===1)return this;if(b===-1)return this.negate();abs=Math.abs(b);if(abs<BASE){return new BigInteger(multiplySmall(a,abs),sign)}b=smallToArray(abs)}if(useKaratsuba(a.length,b.length))return new BigInteger(multiplyKaratsuba(a,b),sign);return new BigInteger(multiplyLong(a,b),sign)};BigInteger.prototype.times=BigInteger.prototype.multiply;function multiplySmallAndArray(a,b,sign){if(a<BASE){return new BigInteger(multiplySmall(b,a),sign)}return new BigInteger(multiplyLong(b,smallToArray(a)),sign)}SmallInteger.prototype._multiplyBySmall=function(a){if(isPrecise(a.value*this.value)){return new SmallInteger(a.value*this.value)}return multiplySmallAndArray(Math.abs(a.value),smallToArray(Math.abs(this.value)),this.sign!==a.sign)};BigInteger.prototype._multiplyBySmall=function(a){if(a.value===0)return Integer[0];if(a.value===1)return this;if(a.value===-1)return this.negate();return multiplySmallAndArray(Math.abs(a.value),this.value,this.sign!==a.sign)};SmallInteger.prototype.multiply=function(v){return parseValue(v)._multiplyBySmall(this)};SmallInteger.prototype.times=SmallInteger.prototype.multiply;function square(a){var l=a.length,r=createArray(l+l),base=BASE,product,carry,i,a_i,a_j;for(i=0;i<l;i++){a_i=a[i];for(var j=0;j<l;j++){a_j=a[j];product=a_i*a_j+r[i+j];carry=Math.floor(product/base);r[i+j]=product-carry*base;r[i+j+1]+=carry}}trim(r);return r}BigInteger.prototype.square=function(){return new BigInteger(square(this.value),false)};SmallInteger.prototype.square=function(){var value=this.value*this.value;if(isPrecise(value))return new SmallInteger(value);return new BigInteger(square(smallToArray(Math.abs(this.value))),false)};function divMod1(a,b){var a_l=a.length,b_l=b.length,base=BASE,result=createArray(b.length),divisorMostSignificantDigit=b[b_l-1],lambda=Math.ceil(base/(2*divisorMostSignificantDigit)),remainder=multiplySmall(a,lambda),divisor=multiplySmall(b,lambda),quotientDigit,shift,carry,borrow,i,l,q;if(remainder.length<=a_l)remainder.push(0);divisor.push(0);divisorMostSignificantDigit=divisor[b_l-1];for(shift=a_l-b_l;shift>=0;shift--){quotientDigit=base-1;if(remainder[shift+b_l]!==divisorMostSignificantDigit){quotientDigit=Math.floor((remainder[shift+b_l]*base+remainder[shift+b_l-1])/divisorMostSignificantDigit)}carry=0;borrow=0;l=divisor.length;for(i=0;i<l;i++){carry+=quotientDigit*divisor[i];q=Math.floor(carry/base);borrow+=remainder[shift+i]-(carry-q*base);carry=q;if(borrow<0){remainder[shift+i]=borrow+base;borrow=-1}else{remainder[shift+i]=borrow;borrow=0}}while(borrow!==0){quotientDigit-=1;carry=0;for(i=0;i<l;i++){carry+=remainder[shift+i]-base+divisor[i];if(carry<0){remainder[shift+i]=carry+base;carry=0}else{remainder[shift+i]=carry;carry=1}}borrow+=carry}result[shift]=quotientDigit}remainder=divModSmall(remainder,lambda)[0];return[arrayToSmall(result),arrayToSmall(remainder)]}function divMod2(a,b){var a_l=a.length,b_l=b.length,result=[],part=[],base=BASE,guess,xlen,highx,highy,check;while(a_l){part.unshift(a[--a_l]);trim(part);if(compareAbs(part,b)<0){result.push(0);continue}xlen=part.length;highx=part[xlen-1]*base+part[xlen-2];highy=b[b_l-1]*base+b[b_l-2];if(xlen>b_l){highx=(highx+1)*base}guess=Math.ceil(highx/highy);do{check=multiplySmall(b,guess);if(compareAbs(check,part)<=0)break;guess--}while(guess);result.push(guess);part=subtract(part,check)}result.reverse();return[arrayToSmall(result),arrayToSmall(part)]}function divModSmall(value,lambda){var length=value.length,quotient=createArray(length),base=BASE,i,q,remainder,divisor;remainder=0;for(i=length-1;i>=0;--i){divisor=remainder*base+value[i];q=truncate(divisor/lambda);remainder=divisor-q*lambda;quotient[i]=q|0}return[quotient,remainder|0]}function divModAny(self,v){var value,n=parseValue(v);var a=self.value,b=n.value;var quotient;if(b===0)throw new Error(\"Cannot divide by zero\");if(self.isSmall){if(n.isSmall){return[new SmallInteger(truncate(a/b)),new SmallInteger(a%b)]}return[Integer[0],self]}if(n.isSmall){if(b===1)return[self,Integer[0]];if(b==-1)return[self.negate(),Integer[0]];var abs=Math.abs(b);if(abs<BASE){value=divModSmall(a,abs);quotient=arrayToSmall(value[0]);var remainder=value[1];if(self.sign)remainder=-remainder;if(typeof quotient===\"number\"){if(self.sign!==n.sign)quotient=-quotient;return[new SmallInteger(quotient),new SmallInteger(remainder)]}return[new BigInteger(quotient,self.sign!==n.sign),new SmallInteger(remainder)]}b=smallToArray(abs)}var comparison=compareAbs(a,b);if(comparison===-1)return[Integer[0],self];if(comparison===0)return[Integer[self.sign===n.sign?1:-1],Integer[0]];if(a.length+b.length<=200)value=divMod1(a,b);else value=divMod2(a,b);quotient=value[0];var qSign=self.sign!==n.sign,mod=value[1],mSign=self.sign;if(typeof quotient===\"number\"){if(qSign)quotient=-quotient;quotient=new SmallInteger(quotient)}else quotient=new BigInteger(quotient,qSign);if(typeof mod===\"number\"){if(mSign)mod=-mod;mod=new SmallInteger(mod)}else mod=new BigInteger(mod,mSign);return[quotient,mod]}BigInteger.prototype.divmod=function(v){var result=divModAny(this,v);return{quotient:result[0],remainder:result[1]}};SmallInteger.prototype.divmod=BigInteger.prototype.divmod;BigInteger.prototype.divide=function(v){return divModAny(this,v)[0]};SmallInteger.prototype.over=SmallInteger.prototype.divide=BigInteger.prototype.over=BigInteger.prototype.divide;BigInteger.prototype.mod=function(v){return divModAny(this,v)[1]};SmallInteger.prototype.remainder=SmallInteger.prototype.mod=BigInteger.prototype.remainder=BigInteger.prototype.mod;BigInteger.prototype.pow=function(v){var n=parseValue(v),a=this.value,b=n.value,value,x,y;if(b===0)return Integer[1];if(a===0)return Integer[0];if(a===1)return Integer[1];if(a===-1)return n.isEven()?Integer[1]:Integer[-1];if(n.sign){return Integer[0]}if(!n.isSmall)throw new Error(\"The exponent \"+n.toString()+\" is too large.\");if(this.isSmall){if(isPrecise(value=Math.pow(a,b)))return new SmallInteger(truncate(value))}x=this;y=Integer[1];while(true){if(b&1===1){y=y.times(x);--b}if(b===0)break;b/=2;x=x.square()}return y};SmallInteger.prototype.pow=BigInteger.prototype.pow;BigInteger.prototype.modPow=function(exp,mod){exp=parseValue(exp);mod=parseValue(mod);if(mod.isZero())throw new Error(\"Cannot take modPow with modulus 0\");var r=Integer[1],base=this.mod(mod);while(exp.isPositive()){if(base.isZero())return Integer[0];if(exp.isOdd())r=r.multiply(base).mod(mod);exp=exp.divide(2);base=base.square().mod(mod)}return r};SmallInteger.prototype.modPow=BigInteger.prototype.modPow;function compareAbs(a,b){if(a.length!==b.length){return a.length>b.length?1:-1}for(var i=a.length-1;i>=0;i--){if(a[i]!==b[i])return a[i]>b[i]?1:-1}return 0}BigInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall)return 1;return compareAbs(a,b)};SmallInteger.prototype.compareAbs=function(v){var n=parseValue(v),a=Math.abs(this.value),b=n.value;if(n.isSmall){b=Math.abs(b);return a===b?0:a>b?1:-1}return-1};BigInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(this.sign!==n.sign){return n.sign?1:-1}if(n.isSmall){return this.sign?-1:1}return compareAbs(a,b)*(this.sign?-1:1)};BigInteger.prototype.compareTo=BigInteger.prototype.compare;SmallInteger.prototype.compare=function(v){if(v===Infinity){return-1}if(v===-Infinity){return 1}var n=parseValue(v),a=this.value,b=n.value;if(n.isSmall){return a==b?0:a>b?1:-1}if(a<0!==n.sign){return a<0?-1:1}return a<0?1:-1};SmallInteger.prototype.compareTo=SmallInteger.prototype.compare;BigInteger.prototype.equals=function(v){return this.compare(v)===0};SmallInteger.prototype.eq=SmallInteger.prototype.equals=BigInteger.prototype.eq=BigInteger.prototype.equals;BigInteger.prototype.notEquals=function(v){return this.compare(v)!==0};SmallInteger.prototype.neq=SmallInteger.prototype.notEquals=BigInteger.prototype.neq=BigInteger.prototype.notEquals;BigInteger.prototype.greater=function(v){return this.compare(v)>0};SmallInteger.prototype.gt=SmallInteger.prototype.greater=BigInteger.prototype.gt=BigInteger.prototype.greater;BigInteger.prototype.lesser=function(v){return this.compare(v)<0};SmallInteger.prototype.lt=SmallInteger.prototype.lesser=BigInteger.prototype.lt=BigInteger.prototype.lesser;BigInteger.prototype.greaterOrEquals=function(v){return this.compare(v)>=0};SmallInteger.prototype.geq=SmallInteger.prototype.greaterOrEquals=BigInteger.prototype.geq=BigInteger.prototype.greaterOrEquals;BigInteger.prototype.lesserOrEquals=function(v){return this.compare(v)<=0};SmallInteger.prototype.leq=SmallInteger.prototype.lesserOrEquals=BigInteger.prototype.leq=BigInteger.prototype.lesserOrEquals;BigInteger.prototype.isEven=function(){return(this.value[0]&1)===0};SmallInteger.prototype.isEven=function(){return(this.value&1)===0};BigInteger.prototype.isOdd=function(){return(this.value[0]&1)===1};SmallInteger.prototype.isOdd=function(){return(this.value&1)===1};BigInteger.prototype.isPositive=function(){return!this.sign};SmallInteger.prototype.isPositive=function(){return this.value>0};BigInteger.prototype.isNegative=function(){return this.sign};SmallInteger.prototype.isNegative=function(){return this.value<0};BigInteger.prototype.isUnit=function(){return false};SmallInteger.prototype.isUnit=function(){return Math.abs(this.value)===1};BigInteger.prototype.isZero=function(){return false};SmallInteger.prototype.isZero=function(){return this.value===0};BigInteger.prototype.isDivisibleBy=function(v){var n=parseValue(v);var value=n.value;if(value===0)return false;if(value===1)return true;if(value===2)return this.isEven();return this.mod(n).equals(Integer[0])};SmallInteger.prototype.isDivisibleBy=BigInteger.prototype.isDivisibleBy;function isBasicPrime(v){var n=v.abs();if(n.isUnit())return false;if(n.equals(2)||n.equals(3)||n.equals(5))return true;if(n.isEven()||n.isDivisibleBy(3)||n.isDivisibleBy(5))return false;if(n.lesser(25))return true}BigInteger.prototype.isPrime=function(){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs(),nPrev=n.prev();var a=[2,3,5,7,11,13,17,19],b=nPrev,d,t,i,x;while(b.isEven())b=b.divide(2);for(i=0;i<a.length;i++){x=bigInt(a[i]).modPow(b,n);if(x.equals(Integer[1])||x.equals(nPrev))continue;for(t=true,d=b;t&&d.lesser(nPrev);d=d.multiply(2)){x=x.square().mod(n);if(x.equals(nPrev))t=false}if(t)return false}return true};SmallInteger.prototype.isPrime=BigInteger.prototype.isPrime;BigInteger.prototype.isProbablePrime=function(iterations){var isPrime=isBasicPrime(this);if(isPrime!==undefined)return isPrime;var n=this.abs();var t=iterations===undefined?5:iterations;for(var i=0;i<t;i++){var a=bigInt.randBetween(2,n.minus(2));if(!a.modPow(n.prev(),n).isUnit())return false}return true};SmallInteger.prototype.isProbablePrime=BigInteger.prototype.isProbablePrime;BigInteger.prototype.modInv=function(n){var t=bigInt.zero,newT=bigInt.one,r=parseValue(n),newR=this.abs(),q,lastT,lastR;while(!newR.equals(bigInt.zero)){q=r.divide(newR);lastT=t;lastR=r;t=newT;r=newR;newT=lastT.subtract(q.multiply(newT));newR=lastR.subtract(q.multiply(newR))}if(!r.equals(1))throw new Error(this.toString()+\" and \"+n.toString()+\" are not co-prime\");if(t.compare(0)===-1){t=t.add(n)}if(this.isNegative()){return t.negate()}return t};SmallInteger.prototype.modInv=BigInteger.prototype.modInv;BigInteger.prototype.next=function(){var value=this.value;if(this.sign){return subtractSmall(value,1,this.sign)}return new BigInteger(addSmall(value,1),this.sign)};SmallInteger.prototype.next=function(){var value=this.value;if(value+1<MAX_INT)return new SmallInteger(value+1);return new BigInteger(MAX_INT_ARR,false)};BigInteger.prototype.prev=function(){var value=this.value;if(this.sign){return new BigInteger(addSmall(value,1),true)}return subtractSmall(value,1,this.sign)};SmallInteger.prototype.prev=function(){var value=this.value;if(value-1>-MAX_INT)return new SmallInteger(value-1);return new BigInteger(MAX_INT_ARR,true)};var powersOfTwo=[1];while(2*powersOfTwo[powersOfTwo.length-1]<=BASE)powersOfTwo.push(2*powersOfTwo[powersOfTwo.length-1]);var powers2Length=powersOfTwo.length,highestPower2=powersOfTwo[powers2Length-1];function shift_isSmall(n){return(typeof n===\"number\"||typeof n===\"string\")&&+Math.abs(n)<=BASE||n instanceof BigInteger&&n.value.length<=1}BigInteger.prototype.shiftLeft=function(n){if(!shift_isSmall(n)){throw new Error(String(n)+\" is too large for shifting.\")}n=+n;if(n<0)return this.shiftRight(-n);var result=this;while(n>=powers2Length){result=result.multiply(highestPower2);n-=powers2Length-1}return result.multiply(powersOfTwo[n])};SmallInteger.prototype.shiftLeft=BigInteger.prototype.shiftLeft;BigInteger.prototype.shiftRight=function(n){var remQuo;if(!shift_isSmall(n)){throw new Error(String(n)+\" is too large for shifting.\")}n=+n;if(n<0)return this.shiftLeft(-n);var result=this;while(n>=powers2Length){if(result.isZero())return result;remQuo=divModAny(result,highestPower2);result=remQuo[1].isNegative()?remQuo[0].prev():remQuo[0];n-=powers2Length-1}remQuo=divModAny(result,powersOfTwo[n]);return remQuo[1].isNegative()?remQuo[0].prev():remQuo[0]};SmallInteger.prototype.shiftRight=BigInteger.prototype.shiftRight;function bitwise(x,y,fn){y=parseValue(y);var xSign=x.isNegative(),ySign=y.isNegative();var xRem=xSign?x.not():x,yRem=ySign?y.not():y;var xDigit=0,yDigit=0;var xDivMod=null,yDivMod=null;var result=[];while(!xRem.isZero()||!yRem.isZero()){xDivMod=divModAny(xRem,highestPower2);xDigit=xDivMod[1].toJSNumber();if(xSign){xDigit=highestPower2-1-xDigit}yDivMod=divModAny(yRem,highestPower2);yDigit=yDivMod[1].toJSNumber();if(ySign){yDigit=highestPower2-1-yDigit}xRem=xDivMod[0];yRem=yDivMod[0];result.push(fn(xDigit,yDigit))}var sum=fn(xSign?1:0,ySign?1:0)!==0?bigInt(-1):bigInt(0);for(var i=result.length-1;i>=0;i-=1){sum=sum.multiply(highestPower2).add(bigInt(result[i]))}return sum}BigInteger.prototype.not=function(){return this.negate().prev()};SmallInteger.prototype.not=BigInteger.prototype.not;BigInteger.prototype.and=function(n){return bitwise(this,n,function(a,b){return a&b})};SmallInteger.prototype.and=BigInteger.prototype.and;BigInteger.prototype.or=function(n){return bitwise(this,n,function(a,b){return a|b})};SmallInteger.prototype.or=BigInteger.prototype.or;BigInteger.prototype.xor=function(n){return bitwise(this,n,function(a,b){return a^b})};SmallInteger.prototype.xor=BigInteger.prototype.xor;var LOBMASK_I=1<<30,LOBMASK_BI=(BASE&-BASE)*(BASE&-BASE)|LOBMASK_I;function roughLOB(n){var v=n.value,x=typeof v===\"number\"?v|LOBMASK_I:v[0]+v[1]*BASE|LOBMASK_BI;return x&-x}function max(a,b){a=parseValue(a);b=parseValue(b);return a.greater(b)?a:b}function min(a,b){a=parseValue(a);b=parseValue(b);return a.lesser(b)?a:b}function gcd(a,b){a=parseValue(a).abs();b=parseValue(b).abs();if(a.equals(b))return a;if(a.isZero())return b;if(b.isZero())return a;var c=Integer[1],d,t;while(a.isEven()&&b.isEven()){d=Math.min(roughLOB(a),roughLOB(b));a=a.divide(d);b=b.divide(d);c=c.multiply(d)}while(a.isEven()){a=a.divide(roughLOB(a))}do{while(b.isEven()){b=b.divide(roughLOB(b))}if(a.greater(b)){t=b;b=a;a=t}b=b.subtract(a)}while(!b.isZero());return c.isUnit()?a:a.multiply(c)}function lcm(a,b){a=parseValue(a).abs();b=parseValue(b).abs();return a.divide(gcd(a,b)).multiply(b)}function randBetween(a,b){a=parseValue(a);b=parseValue(b);var low=min(a,b),high=max(a,b);var range=high.subtract(low).add(1);if(range.isSmall)return low.add(Math.floor(Math.random()*range));var length=range.value.length-1;var result=[],restricted=true;for(var i=length;i>=0;i--){var top=restricted?range.value[i]:BASE;var digit=truncate(Math.random()*top);result.unshift(digit);if(digit<top)restricted=false}result=arrayToSmall(result);return low.add(typeof result===\"number\"?new SmallInteger(result):new BigInteger(result,false))}var parseBase=function(text,base){var length=text.length;var i;var absBase=Math.abs(base);for(var i=0;i<length;i++){var c=text[i].toLowerCase();if(c===\"-\")continue;if(/[a-z0-9]/.test(c)){if(/[0-9]/.test(c)&&+c>=absBase){if(c===\"1\"&&absBase===1)continue;throw new Error(c+\" is not a valid digit in base \"+base+\".\")}else if(c.charCodeAt(0)-87>=absBase){throw new Error(c+\" is not a valid digit in base \"+base+\".\")}}}if(2<=base&&base<=36){if(length<=LOG_MAX_INT/Math.log(base)){var result=parseInt(text,base);if(isNaN(result)){throw new Error(c+\" is not a valid digit in base \"+base+\".\")}return new SmallInteger(parseInt(text,base))}}base=parseValue(base);var digits=[];var isNegative=text[0]===\"-\";for(i=isNegative?1:0;i<text.length;i++){var c=text[i].toLowerCase(),charCode=c.charCodeAt(0);if(48<=charCode&&charCode<=57)digits.push(parseValue(c));else if(97<=charCode&&charCode<=122)digits.push(parseValue(c.charCodeAt(0)-87));else if(c===\"<\"){var start=i;do{i++}while(text[i]!==\">\");digits.push(parseValue(text.slice(start+1,i)))}else throw new Error(c+\" is not a valid character\")}return parseBaseFromArray(digits,base,isNegative)};function parseBaseFromArray(digits,base,isNegative){var val=Integer[0],pow=Integer[1],i;for(i=digits.length-1;i>=0;i--){val=val.add(digits[i].times(pow));pow=pow.times(base)}return isNegative?val.negate():val}function stringify(digit){var v=digit.value;if(typeof v===\"number\")v=[v];if(v.length===1&&v[0]<=35){return\"0123456789abcdefghijklmnopqrstuvwxyz\".charAt(v[0])}return\"<\"+v+\">\"}function toBase(n,base){base=bigInt(base);if(base.isZero()){if(n.isZero())return\"0\";throw new Error(\"Cannot convert nonzero numbers to base 0.\")}if(base.equals(-1)){if(n.isZero())return\"0\";if(n.isNegative())return new Array(1-n).join(\"10\");return\"1\"+new Array(+n).join(\"01\")}var minusSign=\"\";if(n.isNegative()&&base.isPositive()){minusSign=\"-\";n=n.abs()}if(base.equals(1)){if(n.isZero())return\"0\";return minusSign+new Array(+n+1).join(1)}var out=[];var left=n,divmod;while(left.isNegative()||left.compareAbs(base)>=0){divmod=left.divmod(base);left=divmod.quotient;var digit=divmod.remainder;if(digit.isNegative()){digit=base.minus(digit).abs();left=left.next()}out.push(stringify(digit))}out.push(stringify(left));return minusSign+out.reverse().join(\"\")}BigInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!==10)return toBase(this,radix);var v=this.value,l=v.length,str=String(v[--l]),zeros=\"0000000\",digit;while(--l>=0){digit=String(v[l]);str+=zeros.slice(digit.length)+digit}var sign=this.sign?\"-\":\"\";return sign+str};SmallInteger.prototype.toString=function(radix){if(radix===undefined)radix=10;if(radix!=10)return toBase(this,radix);return String(this.value)};BigInteger.prototype.toJSON=SmallInteger.prototype.toJSON=function(){return this.toString()};BigInteger.prototype.valueOf=function(){return+this.toString()};BigInteger.prototype.toJSNumber=BigInteger.prototype.valueOf;SmallInteger.prototype.valueOf=function(){return this.value};SmallInteger.prototype.toJSNumber=SmallInteger.prototype.valueOf;function parseStringValue(v){if(isPrecise(+v)){var x=+v;if(x===truncate(x))return new SmallInteger(x);throw\"Invalid integer: \"+v}var sign=v[0]===\"-\";if(sign)v=v.slice(1);var split=v.split(/e/i);if(split.length>2)throw new Error(\"Invalid integer: \"+split.join(\"e\"));if(split.length===2){var exp=split[1];if(exp[0]===\"+\")exp=exp.slice(1);exp=+exp;if(exp!==truncate(exp)||!isPrecise(exp))throw new Error(\"Invalid integer: \"+exp+\" is not a valid exponent.\");var text=split[0];var decimalPlace=text.indexOf(\".\");if(decimalPlace>=0){exp-=text.length-decimalPlace-1;text=text.slice(0,decimalPlace)+text.slice(decimalPlace+1)}if(exp<0)throw new Error(\"Cannot include negative exponent part for integers\");text+=new Array(exp+1).join(\"0\");v=text}var isValid=/^([0-9][0-9]*)$/.test(v);if(!isValid)throw new Error(\"Invalid integer: \"+v);var r=[],max=v.length,l=LOG_BASE,min=max-l;while(max>0){r.push(+v.slice(min,max));min-=l;if(min<0)min=0;max-=l}trim(r);return new BigInteger(r,sign)}function parseNumberValue(v){if(isPrecise(v)){if(v!==truncate(v))throw new Error(v+\" is not an integer.\");return new SmallInteger(v)}return parseStringValue(v.toString())}function parseValue(v){if(typeof v===\"number\"){return parseNumberValue(v)}if(typeof v===\"string\"){return parseStringValue(v)}return v}for(var i=0;i<1e3;i++){Integer[i]=new SmallInteger(i);if(i>0)Integer[-i]=new SmallInteger(-i)}Integer.one=Integer[1];Integer.zero=Integer[0];Integer.minusOne=Integer[-1];Integer.max=max;Integer.min=min;Integer.gcd=gcd;Integer.lcm=lcm;Integer.isInstance=function(x){return x instanceof BigInteger||x instanceof SmallInteger};Integer.randBetween=randBetween;Integer.fromArray=function(digits,base,isNegative){return parseBaseFromArray(digits.map(parseValue),parseValue(base||10),isNegative)};return Integer}();if(typeof module!==\"undefined\"&&module.hasOwnProperty(\"exports\")){module.exports=bigInt}if(typeof define===\"function\"&&define.amd){define(\"big-integer\",[],function(){return bigInt})}; bigInt`\n\n// makeSlice convert an unsafe memory pointer with the given type into a Go byte\n// slice.\n//\n// Note, the returned slice uses the same memory area as the input arguments.\n// If those are duktape stack items, popping them off **will** make the slice\n// contents change.\nfunc makeSlice(ptr unsafe.Pointer, size uint) []byte {\n\tvar sl = struct {\n\t\taddr uintptr\n\t\tlen  int\n\t\tcap  int\n\t}{uintptr(ptr), int(size), int(size)}\n\n\treturn *(*[]byte)(unsafe.Pointer(&sl))\n}\n\n// popSlice pops a buffer off the JavaScript stack and returns it as a slice.\nfunc popSlice(ctx *duktape.Context) []byte {\n\tblob := common.CopyBytes(makeSlice(ctx.GetBuffer(-1)))\n\tctx.Pop()\n\treturn blob\n}\n\n// pushBigInt create a JavaScript BigInteger in the VM.\nfunc pushBigInt(n *big.Int, ctx *duktape.Context) {\n\tctx.GetGlobalString(\"bigInt\")\n\tctx.PushString(n.String())\n\tctx.Call(1)\n}\n\n// opWrapper provides a JavaScript wrapper around OpCode.\ntype opWrapper struct {\n\top vm.OpCode\n}\n\n// pushObject assembles a JSVM object wrapping a swappable opcode and pushes it\n// onto the VM stack.\nfunc (ow *opWrapper) pushObject(vm *duktape.Context) {\n\tobj := vm.PushObject()\n\n\tvm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(int(ow.op)); return 1 })\n\tvm.PutPropString(obj, \"toNumber\")\n\n\tvm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushString(ow.op.String()); return 1 })\n\tvm.PutPropString(obj, \"toString\")\n\n\tvm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushBoolean(ow.op.IsPush()); return 1 })\n\tvm.PutPropString(obj, \"isPush\")\n}\n\n// memoryWrapper provides a JavaScript wrapper around vm.Memory.\ntype memoryWrapper struct {\n\tmemory *vm.Memory\n}\n\n// slice returns the requested range of memory as a byte slice.\nfunc (mw *memoryWrapper) slice(begin, end int64) []byte {\n\tif mw.memory.Len() < int(end) {\n\t\t// TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go\n\t\t// runtime goes belly up https://github.com/golang/go/issues/15639.\n\t\tlog.Warn(\"Tracer accessed out of bound memory\", \"available\", mw.memory.Len(), \"offset\", begin, \"size\", end-begin)\n\t\treturn nil\n\t}\n\treturn mw.memory.Get(begin, end-begin)\n}\n\n// getUint returns the 32 bytes at the specified address interpreted as a uint.\nfunc (mw *memoryWrapper) getUint(addr int64) *big.Int {\n\tif mw.memory.Len() < int(addr)+32 {\n\t\t// TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go\n\t\t// runtime goes belly up https://github.com/golang/go/issues/15639.\n\t\tlog.Warn(\"Tracer accessed out of bound memory\", \"available\", mw.memory.Len(), \"offset\", addr, \"size\", 32)\n\t\treturn new(big.Int)\n\t}\n\treturn new(big.Int).SetBytes(mw.memory.GetPtr(addr, 32))\n}\n\n// pushObject assembles a JSVM object wrapping a swappable memory and pushes it\n// onto the VM stack.\nfunc (mw *memoryWrapper) pushObject(vm *duktape.Context) {\n\tobj := vm.PushObject()\n\n\t// Generate the `slice` method which takes two ints and returns a buffer\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tblob := mw.slice(int64(ctx.GetInt(-2)), int64(ctx.GetInt(-1)))\n\t\tctx.Pop2()\n\n\t\tptr := ctx.PushFixedBuffer(len(blob))\n\t\tcopy(makeSlice(ptr, uint(len(blob))), blob[:])\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"slice\")\n\n\t// Generate the `getUint` method which takes an int and returns a bigint\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\toffset := int64(ctx.GetInt(-1))\n\t\tctx.Pop()\n\n\t\tpushBigInt(mw.getUint(offset), ctx)\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getUint\")\n}\n\n// stackWrapper provides a JavaScript wrapper around vm.Stack.\ntype stackWrapper struct {\n\tstack *vm.Stack\n}\n\n// peek returns the nth-from-the-top element of the stack.\nfunc (sw *stackWrapper) peek(idx int) *big.Int {\n\tif len(sw.stack.Data()) <= idx {\n\t\t// TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go\n\t\t// runtime goes belly up https://github.com/golang/go/issues/15639.\n\t\tlog.Warn(\"Tracer accessed out of bound stack\", \"size\", len(sw.stack.Data()), \"index\", idx)\n\t\treturn new(big.Int)\n\t}\n\treturn sw.stack.Data()[len(sw.stack.Data())-idx-1]\n}\n\n// pushObject assembles a JSVM object wrapping a swappable stack and pushes it\n// onto the VM stack.\nfunc (sw *stackWrapper) pushObject(vm *duktape.Context) {\n\tobj := vm.PushObject()\n\n\tvm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(len(sw.stack.Data())); return 1 })\n\tvm.PutPropString(obj, \"length\")\n\n\t// Generate the `peek` method which takes an int and returns a bigint\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\toffset := ctx.GetInt(-1)\n\t\tctx.Pop()\n\n\t\tpushBigInt(sw.peek(offset), ctx)\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"peek\")\n}\n\n// dbWrapper provides a JavaScript wrapper around vm.Database.\ntype dbWrapper struct {\n\tdb vm.StateDB\n}\n\n// pushObject assembles a JSVM object wrapping a swappable database and pushes it\n// onto the VM stack.\nfunc (dw *dbWrapper) pushObject(vm *duktape.Context) {\n\tobj := vm.PushObject()\n\n\t// Push the wrapper for statedb.GetBalance\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tpushBigInt(dw.db.GetBalance(common.BytesToAddress(popSlice(ctx)), \"sero\"), ctx)\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getBalance\")\n\n\t// Push the wrapper for statedb.GetNonce\n\t//vm.PushGoFunction(func(ctx *duktape.Context) int {\n\t//\tctx.PushInt(int(dw.db.GetNonce(common.BytesToAddress(popSlice(ctx)))))\n\t//\treturn 1\n\t//})\n\t//vm.PutPropString(obj, \"getNonce\")\n\n\t// Push the wrapper for statedb.GetCode\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tcode := dw.db.GetCode(common.BytesToAddress(popSlice(ctx)))\n\n\t\tptr := ctx.PushFixedBuffer(len(code))\n\t\tcopy(makeSlice(ptr, uint(len(code))), code[:])\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getCode\")\n\n\t// Push the wrapper for statedb.GetState\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\thash := popSlice(ctx)\n\t\taddr := popSlice(ctx)\n\n\t\tstate := dw.db.GetState(common.BytesToAddress(addr), common.BytesToHash(hash))\n\n\t\tptr := ctx.PushFixedBuffer(len(state))\n\t\tcopy(makeSlice(ptr, uint(len(state))), state[:])\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getState\")\n\n\t// Push the wrapper for statedb.Exists\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tctx.PushBoolean(dw.db.Exist(common.BytesToAddress(popSlice(ctx))))\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"exists\")\n}\n\n// contractWrapper provides a JavaScript wrapper around vm.Contract\ntype contractWrapper struct {\n\tcontract *vm.Contract\n}\n\n// pushObject assembles a JSVM object wrapping a swappable contract and pushes it\n// onto the VM stack.\nfunc (cw *contractWrapper) pushObject(vm *duktape.Context) {\n\tobj := vm.PushObject()\n\n\t// Push the wrapper for contract.Caller\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tptr := ctx.PushFixedBuffer(20)\n\t\tcopy(makeSlice(ptr, 20), cw.contract.Caller().Bytes())\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getCaller\")\n\n\t// Push the wrapper for contract.Data\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tptr := ctx.PushFixedBuffer(20)\n\t\tcopy(makeSlice(ptr, 20), cw.contract.Address().Bytes())\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getAddress\")\n\n\t// Push the wrapper for contract.Value\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tpushBigInt(cw.contract.Value(), ctx)\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getValue\")\n\n\t// Push the wrapper for contract.Input\n\tvm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tblob := cw.contract.Input\n\n\t\tptr := ctx.PushFixedBuffer(len(blob))\n\t\tcopy(makeSlice(ptr, uint(len(blob))), blob[:])\n\t\treturn 1\n\t})\n\tvm.PutPropString(obj, \"getInput\")\n}\n\n// Tracer provides an implementation of Tracer that evaluates a Javascript\n// function for each VM execution step.\ntype Tracer struct {\n\tinited bool // Flag whether the context was already inited from the EVM\n\n\tvm *duktape.Context // Javascript VM instance\n\n\ttracerObject int // Stack index of the tracer JavaScript object\n\tstateObject  int // Stack index of the global state to pull arguments from\n\n\topWrapper       *opWrapper       // Wrapper around the VM opcode\n\tstackWrapper    *stackWrapper    // Wrapper around the VM stack\n\tmemoryWrapper   *memoryWrapper   // Wrapper around the VM memory\n\tcontractWrapper *contractWrapper // Wrapper around the contract object\n\tdbWrapper       *dbWrapper       // Wrapper around the VM environment\n\n\tpcValue    *uint   // Swappable pc value wrapped by a log accessor\n\tgasValue   *uint   // Swappable gas value wrapped by a log accessor\n\tcostValue  *uint   // Swappable cost value wrapped by a log accessor\n\tdepthValue *uint   // Swappable depth value wrapped by a log accessor\n\terrorValue *string // Swappable error value wrapped by a log accessor\n\n\tctx map[string]interface{} // Transaction context gathered throughout execution\n\terr error                  // Error, if one has occurred\n\n\tinterrupt uint32 // Atomic flag to signal execution interruption\n\treason    error  // Textual reason for the interruption\n}\n\n// New instantiates a new tracer instance. code specifies a Javascript snippet,\n// which must evaluate to an expression returning an object with 'step', 'fault'\n// and 'result' functions.\nfunc New(code string) (*Tracer, error) {\n\t// Resolve any tracers by name and assemble the tracer object\n\tif tracer, ok := tracer(code); ok {\n\t\tcode = tracer\n\t}\n\ttracer := &Tracer{\n\t\tvm:              duktape.New(),\n\t\tctx:             make(map[string]interface{}),\n\t\topWrapper:       new(opWrapper),\n\t\tstackWrapper:    new(stackWrapper),\n\t\tmemoryWrapper:   new(memoryWrapper),\n\t\tcontractWrapper: new(contractWrapper),\n\t\tdbWrapper:       new(dbWrapper),\n\t\tpcValue:         new(uint),\n\t\tgasValue:        new(uint),\n\t\tcostValue:       new(uint),\n\t\tdepthValue:      new(uint),\n\t}\n\t// Set up builtins for this environment\n\ttracer.vm.PushGlobalGoFunction(\"toHex\", func(ctx *duktape.Context) int {\n\t\tctx.PushString(hexutil.Encode(popSlice(ctx)))\n\t\treturn 1\n\t})\n\ttracer.vm.PushGlobalGoFunction(\"toWord\", func(ctx *duktape.Context) int {\n\t\tvar word common.Hash\n\t\tif ptr, size := ctx.GetBuffer(-1); ptr != nil {\n\t\t\tword = common.BytesToHash(makeSlice(ptr, size))\n\t\t} else {\n\t\t\tword = common.HexToHash(ctx.GetString(-1))\n\t\t}\n\t\tctx.Pop()\n\t\tcopy(makeSlice(ctx.PushFixedBuffer(32), 32), word[:])\n\t\treturn 1\n\t})\n\ttracer.vm.PushGlobalGoFunction(\"toAddress\", func(ctx *duktape.Context) int {\n\t\tvar addr common.Address\n\t\tif ptr, size := ctx.GetBuffer(-1); ptr != nil {\n\t\t\taddr = common.BytesToAddress(makeSlice(ptr, size))\n\t\t} else {\n\t\t\taddr = common.Base58ToAddress(ctx.GetString(-1))\n\t\t}\n\t\tctx.Pop()\n\t\tcopy(makeSlice(ctx.PushFixedBuffer(20), 20), addr.Bytes())\n\t\treturn 1\n\t})\n\ttracer.vm.PushGlobalGoFunction(\"toContract\", func(ctx *duktape.Context) int {\n\t\t//var from common.Data\n\t\t//if ptr, size := ctx.GetBuffer(-2); ptr != nil {\n\t\t//\tfrom = common.BytesToAddress(makeSlice(ptr, size))\n\t\t//} else {\n\t\t//\tfrom = common.Base58ToAddress(ctx.GetString(-2))\n\t\t//}\n\t\t//nonce := uint64(ctx.GetInt(-1))\n\t\t//ctx.Pop2()\n\n\t\t//contract := crypto.CreateAddress(from, nonce)\n\t\t//copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:])\n\t\treturn 1\n\t})\n\t//tracer.vm.PushGlobalGoFunction(\"isPrecompiled\", func(ctx *duktape.Context) int {\n\t//\t_, ok := vm.PrecompiledContractsAutumnTwilight[common.BytesToAddress(popSlice(ctx))]\n\t//\tctx.PushBoolean(ok)\n\t//\treturn 1\n\t//})\n\ttracer.vm.PushGlobalGoFunction(\"slice\", func(ctx *duktape.Context) int {\n\t\tstart, end := ctx.GetInt(-2), ctx.GetInt(-1)\n\t\tctx.Pop2()\n\n\t\tblob := popSlice(ctx)\n\t\tsize := end - start\n\n\t\tif start < 0 || start > end || end > len(blob) {\n\t\t\t// TODO(karalabe): We can't js-throw from Go inside duktape inside Go. The Go\n\t\t\t// runtime goes belly up https://github.com/golang/go/issues/15639.\n\t\t\tlog.Warn(\"Tracer accessed out of bound memory\", \"available\", len(blob), \"offset\", start, \"size\", size)\n\t\t\tctx.PushFixedBuffer(0)\n\t\t\treturn 1\n\t\t}\n\t\tcopy(makeSlice(ctx.PushFixedBuffer(size), uint(size)), blob[start:end])\n\t\treturn 1\n\t})\n\t// Push the JavaScript tracer as object #0 onto the JSVM stack and validate it\n\tif err := tracer.vm.PevalString(\"(\" + code + \")\"); err != nil {\n\t\tlog.Warn(\"Failed to compile tracer\", \"err\", err)\n\t\treturn nil, err\n\t}\n\ttracer.tracerObject = 0 // yeah, nice, eval can't return the index itself\n\n\tif !tracer.vm.GetPropString(tracer.tracerObject, \"step\") {\n\t\treturn nil, fmt.Errorf(\"Trace object must expose a function step()\")\n\t}\n\ttracer.vm.Pop()\n\n\tif !tracer.vm.GetPropString(tracer.tracerObject, \"fault\") {\n\t\treturn nil, fmt.Errorf(\"Trace object must expose a function fault()\")\n\t}\n\ttracer.vm.Pop()\n\n\tif !tracer.vm.GetPropString(tracer.tracerObject, \"result\") {\n\t\treturn nil, fmt.Errorf(\"Trace object must expose a function result()\")\n\t}\n\ttracer.vm.Pop()\n\n\t// Tracer is valid, inject the big int library to access large numbers\n\ttracer.vm.EvalString(bigIntegerJS)\n\ttracer.vm.PutGlobalString(\"bigInt\")\n\n\t// Push the global environment state as object #1 into the JSVM stack\n\ttracer.stateObject = tracer.vm.PushObject()\n\n\tlogObject := tracer.vm.PushObject()\n\n\ttracer.opWrapper.pushObject(tracer.vm)\n\ttracer.vm.PutPropString(logObject, \"op\")\n\n\ttracer.stackWrapper.pushObject(tracer.vm)\n\ttracer.vm.PutPropString(logObject, \"stack\")\n\n\ttracer.memoryWrapper.pushObject(tracer.vm)\n\ttracer.vm.PutPropString(logObject, \"memory\")\n\n\ttracer.contractWrapper.pushObject(tracer.vm)\n\ttracer.vm.PutPropString(logObject, \"contract\")\n\n\ttracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.pcValue); return 1 })\n\ttracer.vm.PutPropString(logObject, \"getPC\")\n\n\ttracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.gasValue); return 1 })\n\ttracer.vm.PutPropString(logObject, \"getGas\")\n\n\ttracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.costValue); return 1 })\n\ttracer.vm.PutPropString(logObject, \"getCost\")\n\n\ttracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.depthValue); return 1 })\n\ttracer.vm.PutPropString(logObject, \"getDepth\")\n\n\ttracer.vm.PushGoFunction(func(ctx *duktape.Context) int {\n\t\tif tracer.errorValue != nil {\n\t\t\tctx.PushString(*tracer.errorValue)\n\t\t} else {\n\t\t\tctx.PushUndefined()\n\t\t}\n\t\treturn 1\n\t})\n\ttracer.vm.PutPropString(logObject, \"getError\")\n\n\ttracer.vm.PutPropString(tracer.stateObject, \"log\")\n\n\ttracer.dbWrapper.pushObject(tracer.vm)\n\ttracer.vm.PutPropString(tracer.stateObject, \"db\")\n\n\treturn tracer, nil\n}\n\n// Stop terminates execution of the tracer at the first opportune moment.\nfunc (jst *Tracer) Stop(err error) {\n\tjst.reason = err\n\tatomic.StoreUint32(&jst.interrupt, 1)\n}\n\n// call executes a method on a JS object, catching any errors, formatting and\n// returning them as error objects.\nfunc (jst *Tracer) call(method string, args ...string) (json.RawMessage, error) {\n\t// Execute the JavaScript call and return any error\n\tjst.vm.PushString(method)\n\tfor _, arg := range args {\n\t\tjst.vm.GetPropString(jst.stateObject, arg)\n\t}\n\tcode := jst.vm.PcallProp(jst.tracerObject, len(args))\n\tdefer jst.vm.Pop()\n\n\tif code != 0 {\n\t\terr := jst.vm.SafeToString(-1)\n\t\treturn nil, errors.New(err)\n\t}\n\t// No error occurred, extract return value and return\n\treturn json.RawMessage(jst.vm.JsonEncode(-1)), nil\n}\n\nfunc wrapError(context string, err error) error {\n\treturn fmt.Errorf(\"%v    in server-side tracer function '%v'\", err, context)\n}\n\n// CaptureStart implements the Tracer interface to initialize the tracing operation.\nfunc (jst *Tracer) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, asset *assets.Asset) error {\n\tjst.ctx[\"type\"] = \"CALL\"\n\tif create {\n\t\tjst.ctx[\"type\"] = \"CREATE\"\n\t}\n\tjst.ctx[\"from\"] = from\n\tjst.ctx[\"to\"] = to\n\tjst.ctx[\"input\"] = input\n\tjst.ctx[\"gas\"] = gas\n\tif asset.Tkt != nil {\n\t\tjst.ctx[\"value\"] = asset.Tkt.Value\n\t}\n\treturn nil\n}\n\n// CaptureState implements the Tracer interface to trace a single step of VM execution.\nfunc (jst *Tracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {\n\tif jst.err == nil {\n\t\t// Initialize the context if it wasn't done yet\n\t\tif !jst.inited {\n\t\t\tjst.ctx[\"block\"] = env.BlockNumber.Uint64()\n\t\t\tjst.inited = true\n\t\t}\n\t\t// If tracing was interrupted, set the error and stop\n\t\tif atomic.LoadUint32(&jst.interrupt) > 0 {\n\t\t\tjst.err = jst.reason\n\t\t\treturn nil\n\t\t}\n\t\tjst.opWrapper.op = op\n\t\tjst.stackWrapper.stack = stack\n\t\tjst.memoryWrapper.memory = memory\n\t\tjst.contractWrapper.contract = contract\n\t\tjst.dbWrapper.db = env.StateDB\n\n\t\t*jst.pcValue = uint(pc)\n\t\t*jst.gasValue = uint(gas)\n\t\t*jst.costValue = uint(cost)\n\t\t*jst.depthValue = uint(depth)\n\n\t\tjst.errorValue = nil\n\t\tif err != nil {\n\t\t\tjst.errorValue = new(string)\n\t\t\t*jst.errorValue = err.Error()\n\t\t}\n\t\t_, err := jst.call(\"step\", \"log\", \"db\")\n\t\tif err != nil {\n\t\t\tjst.err = wrapError(\"step\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// CaptureFault implements the Tracer interface to trace an execution fault\n// while running an opcode.\nfunc (jst *Tracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *vm.Stack, contract *vm.Contract, depth int, err error) error {\n\tif jst.err == nil {\n\t\t// Apart from the error, everything matches the previous invocation\n\t\tjst.errorValue = new(string)\n\t\t*jst.errorValue = err.Error()\n\n\t\t_, err := jst.call(\"fault\", \"log\", \"db\")\n\t\tif err != nil {\n\t\t\tjst.err = wrapError(\"fault\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// CaptureEnd is called after the call finishes to finalize the tracing.\nfunc (jst *Tracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) error {\n\tjst.ctx[\"output\"] = output\n\tjst.ctx[\"gasUsed\"] = gasUsed\n\tjst.ctx[\"time\"] = t.String()\n\n\tif err != nil {\n\t\tjst.ctx[\"error\"] = err.Error()\n\t}\n\treturn nil\n}\n\n// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error\nfunc (jst *Tracer) GetResult() (json.RawMessage, error) {\n\t// Transform the context into a JavaScript object and inject into the state\n\tobj := jst.vm.PushObject()\n\n\tfor key, val := range jst.ctx {\n\t\tswitch val := val.(type) {\n\t\tcase uint64:\n\t\t\tjst.vm.PushUint(uint(val))\n\n\t\tcase string:\n\t\t\tjst.vm.PushString(val)\n\n\t\tcase []byte:\n\t\t\tptr := jst.vm.PushFixedBuffer(len(val))\n\t\t\tcopy(makeSlice(ptr, uint(len(val))), val[:])\n\n\t\tcase common.Address:\n\t\t\tptr := jst.vm.PushFixedBuffer(20)\n\t\t\tcopy(makeSlice(ptr, 20), val.Bytes())\n\n\t\tcase *big.Int:\n\t\t\tpushBigInt(val, jst.vm)\n\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"unsupported type: %T\", val))\n\t\t}\n\t\tjst.vm.PutPropString(obj, key)\n\t}\n\tjst.vm.PutPropString(jst.stateObject, \"ctx\")\n\n\t// Finalize the trace and return the results\n\tresult, err := jst.call(\"result\", \"ctx\", \"db\")\n\tif err != nil {\n\t\tjst.err = wrapError(\"result\", err)\n\t}\n\t// Clean up the JavaScript environment\n\tjst.vm.DestroyHeap()\n\tjst.vm.Destroy()\n\n\treturn result, jst.err\n}\n"
  },
  {
    "path": "sero/tracers/tracers.go",
    "content": "// copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package tracers is a collection of JavaScript transaction tracers.\npackage tracers\n\nimport (\n\t\"strings\"\n\t\"unicode\"\n\n\t\"github.com/sero-cash/go-sero/sero/tracers/internal/tracers\"\n)\n\n// all contains all the built in JavaScript tracers by name.\nvar all = make(map[string]string)\n\n// camel converts a snake cased input string into a camel cased output.\nfunc camel(str string) string {\n\tpieces := strings.Split(str, \"_\")\n\tfor i := 1; i < len(pieces); i++ {\n\t\tpieces[i] = string(unicode.ToUpper(rune(pieces[i][0]))) + pieces[i][1:]\n\t}\n\treturn strings.Join(pieces, \"\")\n}\n\n// init retrieves the JavaScript transaction tracers included in go-sero.\nfunc init() {\n\tfor _, file := range tracers.AssetNames() {\n\t\tname := camel(strings.TrimSuffix(file, \".js\"))\n\t\tall[name] = string(tracers.MustAsset(file))\n\t}\n}\n\n// tracer retrieves a specific JavaScript tracer by name.\nfunc tracer(name string) (string, bool) {\n\tif tracer, ok := all[name]; ok {\n\t\treturn tracer, true\n\t}\n\treturn \"\", false\n}\n"
  },
  {
    "path": "seroclient/seroclient.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package seroclient provides a client for the Ethereum RPC API.\npackage seroclient\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n)\n\n// Client defines typed wrappers for the Ethereum RPC API.\ntype Client struct {\n\tc *rpc.Client\n}\n\n// Dial connects a client to the given URL.\nfunc Dial(rawurl string) (*Client, error) {\n\treturn DialContext(context.Background(), rawurl)\n}\n\nfunc DialContext(ctx context.Context, rawurl string) (*Client, error) {\n\tc, err := rpc.DialContext(ctx, rawurl)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewClient(c), nil\n}\n\n// NewClient creates a client that uses the given RPC client.\nfunc NewClient(c *rpc.Client) *Client {\n\treturn &Client{c}\n}\n\nfunc (ec *Client) Close() {\n\tec.c.Close()\n}\n\n// Blockchain Access\n\n// BlockByHash returns the given full block.\n//\n// Note that loading full blocks requires two requests. Use HeaderByHash\n// if you don't need all transactions.\nfunc (ec *Client) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {\n\treturn ec.getBlock(ctx, \"sero_getBlockByHash\", hash, true)\n}\n\n// BlockByNumber returns a block from the current canonical chain. If number is nil, the\n// latest known block is returned.\n//\n// Note that loading full blocks requires two requests. Use HeaderByNumber\n// if you don't need all transactions headers.\nfunc (ec *Client) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) {\n\treturn ec.getBlock(ctx, \"sero_getBlockByNumber\", toBlockNumArg(number), true)\n}\n\ntype rpcBlock struct {\n\tHash         common.Hash      `json:\"hash\"`\n\tTransactions []rpcTransaction `json:\"transactions\"`\n}\n\nfunc (ec *Client) getBlock(ctx context.Context, method string, args ...interface{}) (*types.Block, error) {\n\tvar raw json.RawMessage\n\terr := ec.c.CallContext(ctx, &raw, method, args...)\n\tif err != nil {\n\t\treturn nil, err\n\t} else if len(raw) == 0 {\n\t\treturn nil, sero.NotFound\n\t}\n\t// Decode header and transactions.\n\tvar head *types.Header\n\tvar body rpcBlock\n\tif err := json.Unmarshal(raw, &head); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := json.Unmarshal(raw, &body); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif head.TxHash == types.EmptyRootHash && len(body.Transactions) > 0 {\n\t\treturn nil, fmt.Errorf(\"server returned non-empty transaction list but block header indicates no transactions\")\n\t}\n\tif head.TxHash != types.EmptyRootHash && len(body.Transactions) == 0 {\n\t\treturn nil, fmt.Errorf(\"server returned empty transaction list but block header indicates transactions\")\n\t}\n\t// Fill the sender cache of transactions in the block.\n\ttxs := make([]*types.Transaction, len(body.Transactions))\n\tfor i, tx := range body.Transactions {\n\t\tif tx.From != nil {\n\t\t\treturn nil, fmt.Errorf(\"got null tx.From for %d of tx block %x\", i, body.Hash[:])\n\t\t}\n\t\ttxs[i] = tx.tx\n\t}\n\treturn types.NewBlockWithHeader(head).WithBody(txs), nil\n}\n\n// HeaderByHash returns the block header with the given hash.\nfunc (ec *Client) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {\n\tvar head *types.Header\n\terr := ec.c.CallContext(ctx, &head, \"sero_getBlockByHash\", hash, false)\n\tif err == nil && head == nil {\n\t\terr = sero.NotFound\n\t}\n\treturn head, err\n}\n\n// HeaderByNumber returns a block header from the current canonical chain. If number is\n// nil, the latest known header is returned.\nfunc (ec *Client) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) {\n\tvar head *types.Header\n\terr := ec.c.CallContext(ctx, &head, \"sero_getBlockByNumber\", toBlockNumArg(number), false)\n\tif err == nil && head == nil {\n\t\terr = sero.NotFound\n\t}\n\treturn head, err\n}\n\ntype rpcTransaction struct {\n\ttx *types.Transaction\n\ttxExtraInfo\n}\n\ntype txExtraInfo struct {\n\tBlockNumber *string         `json:\"blockNumber,omitempty\"`\n\tBlockHash   *common.Hash    `json:\"blockHash,omitempty\"`\n\tFrom        *common.Address `json:\"from,omitempty\"`\n}\n\nfunc (tx *rpcTransaction) UnmarshalJSON(msg []byte) error {\n\tif err := json.Unmarshal(msg, &tx.tx); err != nil {\n\t\treturn err\n\t}\n\treturn json.Unmarshal(msg, &tx.txExtraInfo)\n}\n\n// TransactionByHash returns the transaction with the given hash.\nfunc (ec *Client) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) {\n\tvar json *rpcTransaction\n\terr = ec.c.CallContext(ctx, &json, \"sero_getTransactionByHash\", hash)\n\tif err != nil {\n\t\treturn nil, false, err\n\t} else if json == nil {\n\t\treturn nil, false, sero.NotFound\n\t} else if r := json.tx.RawEncrptyValue(); r == nil {\n\t\treturn nil, false, fmt.Errorf(\"server returned transaction without signature\")\n\t}\n\tif json.From != nil && json.BlockHash != nil {\n\t\t//setSenderFromServer(json.tx, *json.From, *json.BlockHash)\n\t}\n\treturn json.tx, json.BlockNumber == nil, nil\n}\n\n// TransactionSender returns the sender address of the given transaction. The transaction\n// must be known to the remote node and included in the blockchain at the given block and\n// index. The sender is the one derived by the protocol at the time of inclusion.\n//\n// There is a fast-path for transactions retrieved by TransactionByHash and\n// TransactionInBlock. Getting their sender address can be done without an RPC interaction.\nfunc (ec *Client) TransactionSender(ctx context.Context, tx *types.Transaction, block common.Hash, index uint) (common.Address, error) {\n\t// Try to load the address from the cache.\n\t//sender, err := types.Sender(&senderFromServer{blockhash: block}, tx)\n\tsender := tx.From()\n\tif sender != (common.Address{}) {\n\t\treturn sender, nil\n\t}\n\tvar meta struct {\n\t\tHash common.Hash\n\t\tFrom common.Address\n\t}\n\tif err := ec.c.CallContext(ctx, &meta, \"sero_getTransactionByBlockHashAndIndex\", block, hexutil.Uint64(index)); err != nil {\n\t\treturn common.Address{}, err\n\t}\n\tif meta.Hash == (common.Hash{}) || meta.Hash != tx.Hash() {\n\t\treturn common.Address{}, errors.New(\"wrong inclusion block/index\")\n\t}\n\treturn meta.From, nil\n}\n\n// TransactionCount returns the total number of transactions in the given block.\nfunc (ec *Client) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) {\n\tvar num hexutil.Uint\n\terr := ec.c.CallContext(ctx, &num, \"sero_getBlockTransactionCountByHash\", blockHash)\n\treturn uint(num), err\n}\n\n// TransactionInBlock returns a single transaction at index in the given block.\nfunc (ec *Client) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) {\n\tvar json *rpcTransaction\n\terr := ec.c.CallContext(ctx, &json, \"sero_getTransactionByBlockHashAndIndex\", blockHash, hexutil.Uint64(index))\n\tif err == nil {\n\t\tif json == nil {\n\t\t\treturn nil, sero.NotFound\n\t\t} else if r := json.tx.RawEncrptyValue(); r == nil {\n\t\t\treturn nil, fmt.Errorf(\"server returned transaction without signature\")\n\t\t}\n\t}\n\tif json.From != nil && json.BlockHash != nil {\n\t\t//setSenderFromServer(json.tx, *json.From, *json.BlockHash)\n\t}\n\treturn json.tx, err\n}\n\n// TransactionReceipt returns the receipt of a transaction by transaction hash.\n// Note that the receipt is not available for pending transactions.\nfunc (ec *Client) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) {\n\tvar r *types.Receipt\n\terr := ec.c.CallContext(ctx, &r, \"sero_getTransactionReceipt\", txHash)\n\tif err == nil {\n\t\tif r == nil {\n\t\t\treturn nil, sero.NotFound\n\t\t}\n\t}\n\treturn r, err\n}\n\nfunc toBlockNumArg(number *big.Int) string {\n\tif number == nil {\n\t\treturn \"latest\"\n\t}\n\treturn hexutil.EncodeBig(number)\n}\n\ntype rpcProgress struct {\n\tStartingBlock hexutil.Uint64\n\tCurrentBlock  hexutil.Uint64\n\tHighestBlock  hexutil.Uint64\n\tPulledStates  hexutil.Uint64\n\tKnownStates   hexutil.Uint64\n}\n\n// SyncProgress retrieves the current progress of the sync algorithm. If there's\n// no sync currently running, it returns nil.\nfunc (ec *Client) SyncProgress(ctx context.Context) (*sero.SyncProgress, error) {\n\tvar raw json.RawMessage\n\tif err := ec.c.CallContext(ctx, &raw, \"sero_syncing\"); err != nil {\n\t\treturn nil, err\n\t}\n\t// Handle the possible response types\n\tvar syncing bool\n\tif err := json.Unmarshal(raw, &syncing); err == nil {\n\t\treturn nil, nil // Not syncing (always false)\n\t}\n\tvar progress *rpcProgress\n\tif err := json.Unmarshal(raw, &progress); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &sero.SyncProgress{\n\t\tStartingBlock: uint64(progress.StartingBlock),\n\t\tCurrentBlock:  uint64(progress.CurrentBlock),\n\t\tHighestBlock:  uint64(progress.HighestBlock),\n\t\tPulledStates:  uint64(progress.PulledStates),\n\t\tKnownStates:   uint64(progress.KnownStates),\n\t}, nil\n}\n\n// SubscribeNewHead subscribes to notifications about the current blockchain head\n// on the given channel.\nfunc (ec *Client) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (sero.Subscription, error) {\n\treturn ec.c.EthSubscribe(ctx, ch, \"newHeads\")\n}\n\n// State Access\n\n// NetworkID returns the network ID (also known as the chain ID) for this chain.\nfunc (ec *Client) NetworkID(ctx context.Context) (*big.Int, error) {\n\tversion := new(big.Int)\n\tvar ver string\n\tif err := ec.c.CallContext(ctx, &ver, \"net_version\"); err != nil {\n\t\treturn nil, err\n\t}\n\tif _, ok := version.SetString(ver, 10); !ok {\n\t\treturn nil, fmt.Errorf(\"invalid net_version result %q\", ver)\n\t}\n\treturn version, nil\n}\n\n// BalanceAt returns the wei balance of the given account.\n// The block number can be nil, in which case the balance is taken from the latest known block.\nfunc (ec *Client) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) {\n\tvar result hexutil.Big\n\terr := ec.c.CallContext(ctx, &result, \"sero_getBalance\", account, toBlockNumArg(blockNumber))\n\treturn (*big.Int)(&result), err\n}\n\n// StorageAt returns the value of key in the contract storage of the given account.\n// The block number can be nil, in which case the value is taken from the latest known block.\nfunc (ec *Client) StorageAt(ctx context.Context, account common.Address, key common.Hash, blockNumber *big.Int) ([]byte, error) {\n\tvar result hexutil.Bytes\n\terr := ec.c.CallContext(ctx, &result, \"sero_getStorageAt\", account, key, toBlockNumArg(blockNumber))\n\treturn result, err\n}\n\n// CodeAt returns the contract code of the given account.\n// The block number can be nil, in which case the code is taken from the latest known block.\nfunc (ec *Client) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) {\n\tvar result hexutil.Bytes\n\terr := ec.c.CallContext(ctx, &result, \"sero_getCode\", account, toBlockNumArg(blockNumber))\n\treturn result, err\n}\n\n// NonceAt returns the account nonce of the given account.\n// The block number can be nil, in which case the nonce is taken from the latest known block.\nfunc (ec *Client) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) {\n\tvar result hexutil.Uint64\n\terr := ec.c.CallContext(ctx, &result, \"sero_getTransactionCount\", account, toBlockNumArg(blockNumber))\n\treturn uint64(result), err\n}\n\n// Filters\n\n// FilterLogs executes a filter query.\nfunc (ec *Client) FilterLogs(ctx context.Context, q sero.FilterQuery) ([]types.Log, error) {\n\tvar result []types.Log\n\terr := ec.c.CallContext(ctx, &result, \"sero_getLogs\", toFilterArg(q))\n\treturn result, err\n}\n\n// SubscribeFilterLogs subscribes to the results of a streaming filter query.\nfunc (ec *Client) SubscribeFilterLogs(ctx context.Context, q sero.FilterQuery, ch chan<- types.Log) (sero.Subscription, error) {\n\treturn ec.c.EthSubscribe(ctx, ch, \"logs\", toFilterArg(q))\n}\n\nfunc toFilterArg(q sero.FilterQuery) interface{} {\n\targ := map[string]interface{}{\n\t\t\"fromBlock\": toBlockNumArg(q.FromBlock),\n\t\t\"toBlock\":   toBlockNumArg(q.ToBlock),\n\t\t\"address\":   q.Addresses,\n\t\t\"topics\":    q.Topics,\n\t}\n\tif q.FromBlock == nil {\n\t\targ[\"fromBlock\"] = \"0x0\"\n\t}\n\treturn arg\n}\n\n// Pending State\n\n// PendingBalanceAt returns the wei balance of the given account in the pending state.\nfunc (ec *Client) PendingBalanceAt(ctx context.Context, account common.Address) (*big.Int, error) {\n\tvar result hexutil.Big\n\terr := ec.c.CallContext(ctx, &result, \"sero_getBalance\", account, \"pending\")\n\treturn (*big.Int)(&result), err\n}\n\n// PendingStorageAt returns the value of key in the contract storage of the given account in the pending state.\nfunc (ec *Client) PendingStorageAt(ctx context.Context, account common.Address, key common.Hash) ([]byte, error) {\n\tvar result hexutil.Bytes\n\terr := ec.c.CallContext(ctx, &result, \"sero_getStorageAt\", account, key, \"pending\")\n\treturn result, err\n}\n\n// PendingCodeAt returns the contract code of the given account in the pending state.\nfunc (ec *Client) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) {\n\tvar result hexutil.Bytes\n\terr := ec.c.CallContext(ctx, &result, \"sero_getCode\", account, \"pending\")\n\treturn result, err\n}\n\n// PendingNonceAt returns the account nonce of the given account in the pending state.\n// This is the nonce that should be used for the next transaction.\nfunc (ec *Client) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) {\n\tvar result hexutil.Uint64\n\terr := ec.c.CallContext(ctx, &result, \"sero_getTransactionCount\", account, \"pending\")\n\treturn uint64(result), err\n}\n\n// PendingTransactionCount returns the total number of transactions in the pending state.\nfunc (ec *Client) PendingTransactionCount(ctx context.Context) (uint, error) {\n\tvar num hexutil.Uint\n\terr := ec.c.CallContext(ctx, &num, \"sero_getBlockTransactionCountByNumber\", \"pending\")\n\treturn uint(num), err\n}\n\n// TODO: SubscribePendingTransactions (needs server side)\n\n// Contract Calling\n\n// CallContract executes a message call transaction, which is directly executed in the VM\n// of the node, but never mined into the blockchain.\n//\n// blockNumber selects the block height at which the call runs. It can be nil, in which\n// case the code is taken from the latest known block. Note that state from very old\n// blocks might not be available.\nfunc (ec *Client) CallContract(ctx context.Context, msg sero.CallMsg, blockNumber *big.Int) ([]byte, error) {\n\tvar hex hexutil.Bytes\n\terr := ec.c.CallContext(ctx, &hex, \"sero_call\", toCallArg(msg), toBlockNumArg(blockNumber))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn hex, nil\n}\n\n// PendingCallContract executes a message call transaction using the EVM.\n// The state seen by the contract call is the pending state.\nfunc (ec *Client) PendingCallContract(ctx context.Context, msg sero.CallMsg) ([]byte, error) {\n\tvar hex hexutil.Bytes\n\terr := ec.c.CallContext(ctx, &hex, \"sero_call\", toCallArg(msg), \"pending\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn hex, nil\n}\n\n// SuggestGasPrice retrieves the currently suggested gas price to allow a timely\n// execution of a transaction.\nfunc (ec *Client) SuggestGasPrice(ctx context.Context) (*big.Int, error) {\n\tvar hex hexutil.Big\n\tif err := ec.c.CallContext(ctx, &hex, \"sero_gasPrice\"); err != nil {\n\t\treturn nil, err\n\t}\n\treturn (*big.Int)(&hex), nil\n}\n\n// EstimateGas tries to estimate the gas needed to execute a specific transaction based on\n// the current pending state of the backend blockchain. There is no guarantee that this is\n// the true gas limit requirement as other transactions may be added or removed by miners,\n// but it should provide a basis for setting a reasonable default.\nfunc (ec *Client) EstimateGas(ctx context.Context, msg sero.CallMsg) (uint64, error) {\n\tvar hex hexutil.Uint64\n\terr := ec.c.CallContext(ctx, &hex, \"sero_estimateGas\", toCallArg(msg))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn uint64(hex), nil\n}\n\nfunc (ec *Client) GenContractTx(ctx context.Context, msg sero.CallMsg) (*txtool.GTxParam, error) {\n\tvar param txtool.GTxParam\n\tif msg.FromPKr == nil {\n\t\treturn nil, errors.New(\"from is nil\")\n\t}\n\tif err := ec.c.CallContext(ctx, &param, \"sero_genTx\", toContractTxArgs(msg)); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &param, nil\n}\n\nfunc (ec *Client) CommitTx(ctx context.Context, arg *txtool.GTx) error {\n\tvar hash common.Hash\n\tif err := ec.c.CallContext(ctx, &hash, \"sero_commitContractTx\", arg); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc toContractTxArgs(msg sero.CallMsg) interface{} {\n\targ := map[string]interface{}{\n\t\t\"to\": msg.To,\n\t}\n\targ[\"From\"] = msg.From\n\tvar fromPkr common.Address\n\tcopy(fromPkr[:], msg.FromPKr[:])\n\targ[\"RefundTo\"] = fromPkr\n\n\tif msg.Gas != 0 {\n\t\targ[\"Gas\"] = msg.Gas\n\t}\n\tif msg.GasPrice != nil {\n\t\targ[\"GasPrice\"] = msg.GasPrice\n\t}\n\n\tcontractArgs := map[string]interface{}{}\n\n\tif msg.Currency != \"\" {\n\t\tcontractArgs[\"Currency\"] = msg.Currency\n\t} else {\n\t\tcontractArgs[\"Currency\"] = \"SERO\"\n\t}\n\tcontractArgs[\"Value\"] = msg.Value\n\n\tif msg.Category != \"\" {\n\t\tcontractArgs[\"Category\"] = msg.Category\n\t}\n\tcontractArgs[\"Tkt\"] = msg.Tkt\n\n\tif msg.To != nil {\n\t\tcontractArgs[\"To\"] = hexutil.Bytes(msg.To[:])\n\t}\n\tif len(msg.Data) > 0 {\n\t\tcontractArgs[\"Data\"] = hexutil.Bytes(msg.Data)\n\t}\n\tcmdArgs := map[string]interface{}{}\n\tcmdArgs[\"Contract\"] = contractArgs\n\n\targ[\"Cmds\"] = cmdArgs\n\treturn arg\n}\n\nfunc toCallArg(msg sero.CallMsg) interface{} {\n\targ := map[string]interface{}{\n\t\t\"to\": msg.To,\n\t}\n\tif msg.FromPKr != nil {\n\t\tvar fromPkr common.Address\n\t\tcopy(fromPkr[:], msg.FromPKr[:])\n\t\targ[\"from\"] = fromPkr\n\t}\n\tif len(msg.Data) > 0 {\n\t\targ[\"data\"] = hexutil.Bytes(msg.Data)\n\t}\n\tif msg.Value != nil {\n\t\targ[\"value\"] = (*hexutil.Big)(msg.Value)\n\t}\n\tif msg.Gas != 0 {\n\t\targ[\"gas\"] = hexutil.Uint64(msg.Gas)\n\t}\n\tif msg.GasPrice != nil {\n\t\targ[\"gasPrice\"] = (*hexutil.Big)(msg.GasPrice)\n\t}\n\tif msg.Currency != \"\" {\n\t\targ[\"cy\"] = msg.Currency\n\t} else {\n\t\targ[\"cy\"] = \"SERO\"\n\t}\n\n\tif msg.Category != \"\" {\n\t\targ[\"catg\"] = msg.Category\n\t}\n\tif msg.Tkt != nil {\n\t\targ[\"tkt\"] = msg.Tkt\n\t}\n\n\treturn arg\n}\n"
  },
  {
    "path": "serodb/.gitignore",
    "content": "# See http://help.github.com/ignore-files/ for more about ignoring files.\n#\n# If you find yourself ignoring temporary files generated by your text editor\n# or operating system, you probably want to add a global ignore instead:\n#   git config --global core.excludesfile ~/.gitignore_global\n\n/tmp\n*/**/*un~\n*un~\n.DS_Store\n*/**/.DS_Store\n\n"
  },
  {
    "path": "serodb/database.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage serodb\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/syndtr/goleveldb/leveldb\"\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/filter\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nconst (\n\twritePauseWarningThrottler = 1 * time.Minute\n)\n\nvar OpenFileLimit = 64\n\ntype LDBDatabase struct {\n\tfn string      // filename for reporting\n\tdb *leveldb.DB // LevelDB instance\n\n\tcompTimeMeter    metrics.Meter // Meter for measuring the total time spent in database compaction\n\tcompReadMeter    metrics.Meter // Meter for measuring the data read during compaction\n\tcompWriteMeter   metrics.Meter // Meter for measuring the data written during compaction\n\twriteDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction\n\twriteDelayMeter  metrics.Meter // Meter for measuring the write delay duration due to database compaction\n\tdiskReadMeter    metrics.Meter // Meter for measuring the effective amount of data read\n\tdiskWriteMeter   metrics.Meter // Meter for measuring the effective amount of data written\n\n\tquitLock sync.Mutex      // Mutex protecting the quit channel access\n\tquitChan chan chan error // Quit channel to stop the metrics collection before closing the database\n\n\tlog log.Logger // Contextual logger tracking the database path\n}\n\n// NewLDBDatabase returns a LevelDB wrapped object.\nfunc NewLDBDatabaseEx(file string, cache int, handles int,readOnly bool) (*LDBDatabase, error) {\n\tlogger := log.New(\"database\", file)\n\n\t// Ensure we have some minimal caching and file guarantees\n\tif cache < 16 {\n\t\tcache = 16\n\t}\n\tif handles < 16 {\n\t\thandles = 16\n\t}\n\tlogger.Info(\"Allocated cache and file handles\", \"cache\", cache, \"handles\", handles)\n\n\t// Open the db and recover any potential corruptions\n\tdb, err := leveldb.OpenFile(file, &opt.Options{\n\t\tOpenFilesCacheCapacity: handles,\n\t\tBlockCacheCapacity:     cache / 2 * opt.MiB,\n\t\tWriteBuffer:            cache / 4 * opt.MiB, // Two of these are used internally\n\t\tFilter:                 filter.NewBloomFilter(10),\n\t\tReadOnly: readOnly,\n\t})\n\tif _, corrupted := err.(*errors.ErrCorrupted); corrupted {\n\t\tdb, err = leveldb.RecoverFile(file, nil)\n\t}\n\t// (Re)check for errors and abort if opening of the db failed\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &LDBDatabase{\n\t\tfn:  file,\n\t\tdb:  db,\n\t\tlog: logger,\n\t}, nil\n}\nfunc NewLDBDatabase(file string, cache int, handles int) (*LDBDatabase, error) {\n\treturn NewLDBDatabaseEx(file,cache,handles,false)\n}\n\n// Path returns the path to the database directory.\nfunc (db *LDBDatabase) Path() string {\n\treturn db.fn\n}\n\n// Put puts the given key / value to the queue\nfunc (db *LDBDatabase) Put(key []byte, value []byte) error {\n\treturn db.db.Put(key, value, nil)\n}\n\nfunc (db *LDBDatabase) Has(key []byte) (bool, error) {\n\treturn db.db.Has(key, nil)\n}\n\n// Get returns the given key if it's present.\nfunc (db *LDBDatabase) Get(key []byte) ([]byte, error) {\n\tdat, err := db.db.Get(key, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn dat, nil\n}\n\n// Delete deletes the key from the queue and database\nfunc (db *LDBDatabase) Delete(key []byte) error {\n\treturn db.db.Delete(key, nil)\n}\n\nfunc (db *LDBDatabase) NewIterator() iterator.Iterator {\n\treturn db.db.NewIterator(nil, nil)\n}\n\n// NewIteratorWithPrefix returns a iterator to iterate over subset of database content with a particular prefix.\nfunc (db *LDBDatabase) NewIteratorWithPrefix(prefix []byte) iterator.Iterator {\n\treturn db.db.NewIterator(util.BytesPrefix(prefix), nil)\n}\n\nfunc (db *LDBDatabase) Close() {\n\t// Stop the metrics collection to avoid internal database races\n\tdb.quitLock.Lock()\n\tdefer db.quitLock.Unlock()\n\n\tif db.quitChan != nil {\n\t\terrc := make(chan error)\n\t\tdb.quitChan <- errc\n\t\tif err := <-errc; err != nil {\n\t\t\tdb.log.Error(\"Metrics collection failed\", \"err\", err)\n\t\t}\n\t\tdb.quitChan = nil\n\t}\n\terr := db.db.Close()\n\tif err == nil {\n\t\tdb.log.Info(\"Database closed\")\n\t} else {\n\t\tdb.log.Error(\"Failed to close database\", \"err\", err)\n\t}\n}\n\nfunc (db *LDBDatabase) LDB() *leveldb.DB {\n\treturn db.db\n}\n\n// Meter configures the database metrics collectors and\nfunc (db *LDBDatabase) Meter(prefix string) {\n\tif metrics.Enabled {\n\t\t// Initialize all the metrics collector at the requested prefix\n\t\tdb.compTimeMeter = metrics.NewRegisteredMeter(prefix+\"compact/time\", nil)\n\t\tdb.compReadMeter = metrics.NewRegisteredMeter(prefix+\"compact/input\", nil)\n\t\tdb.compWriteMeter = metrics.NewRegisteredMeter(prefix+\"compact/output\", nil)\n\t\tdb.diskReadMeter = metrics.NewRegisteredMeter(prefix+\"disk/read\", nil)\n\t\tdb.diskWriteMeter = metrics.NewRegisteredMeter(prefix+\"disk/write\", nil)\n\t}\n\t// Initialize write delay metrics no matter we are in metric mode or not.\n\tdb.writeDelayMeter = metrics.NewRegisteredMeter(prefix+\"compact/writedelay/duration\", nil)\n\tdb.writeDelayNMeter = metrics.NewRegisteredMeter(prefix+\"compact/writedelay/counter\", nil)\n\n\t// Create a quit channel for the periodic collector and run it\n\tdb.quitLock.Lock()\n\tdb.quitChan = make(chan chan error)\n\tdb.quitLock.Unlock()\n\n\tgo db.meter(3 * time.Second)\n}\n\n// meter periodically retrieves internal leveldb counters and reports them to\n// the metrics subsystem.\n//\n// This is how a stats table look like (currently):\n//   Compactions\n//    Level |   Tables   |    Size(MB)   |    Time(sec)  |    Read(MB)   |   Write(MB)\n//   -------+------------+---------------+---------------+---------------+---------------\n//      0   |          0 |       0.00000 |       1.27969 |       0.00000 |      12.31098\n//      1   |         85 |     109.27913 |      28.09293 |     213.92493 |     214.26294\n//      2   |        523 |    1000.37159 |       7.26059 |      66.86342 |      66.77884\n//      3   |        570 |    1113.18458 |       0.00000 |       0.00000 |       0.00000\n//\n// This is how the write delay look like (currently):\n// DelayN:5 Delay:406.604657ms Paused: false\n//\n// This is how the iostats look like (currently):\n// Read(MB):3895.04860 Write(MB):3654.64712\nfunc (db *LDBDatabase) meter(refresh time.Duration) {\n\t// Create the counters to store current and previous compaction values\n\tcompactions := make([][]float64, 2)\n\tfor i := 0; i < 2; i++ {\n\t\tcompactions[i] = make([]float64, 3)\n\t}\n\t// Create storage for iostats.\n\tvar iostats [2]float64\n\n\t// Create storage and warning log tracer for write delay.\n\tvar (\n\t\tdelaystats      [2]int64\n\t\tlastWritePaused time.Time\n\t)\n\n\tvar (\n\t\terrc chan error\n\t\tmerr error\n\t)\n\n\t// Iterate ad infinitum and collect the stats\n\tfor i := 1; errc == nil && merr == nil; i++ {\n\t\t// Retrieve the database stats\n\t\tstats, err := db.db.GetProperty(\"leveldb.stats\")\n\t\tif err != nil {\n\t\t\tdb.log.Error(\"Failed to read database stats\", \"err\", err)\n\t\t\tmerr = err\n\t\t\tcontinue\n\t\t}\n\t\t// Find the compaction table, skip the header\n\t\tlines := strings.Split(stats, \"\\n\")\n\t\tfor len(lines) > 0 && strings.TrimSpace(lines[0]) != \"Compactions\" {\n\t\t\tlines = lines[1:]\n\t\t}\n\t\tif len(lines) <= 3 {\n\t\t\tdb.log.Error(\"Compaction table not found\")\n\t\t\tmerr = errors.New(\"compaction table not found\")\n\t\t\tcontinue\n\t\t}\n\t\tlines = lines[3:]\n\n\t\t// Iterate over all the table rows, and accumulate the entries\n\t\tfor j := 0; j < len(compactions[i%2]); j++ {\n\t\t\tcompactions[i%2][j] = 0\n\t\t}\n\t\tfor _, line := range lines {\n\t\t\tparts := strings.Split(line, \"|\")\n\t\t\tif len(parts) != 6 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tfor idx, counter := range parts[3:] {\n\t\t\t\tvalue, err := strconv.ParseFloat(strings.TrimSpace(counter), 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\tdb.log.Error(\"Compaction entry parsing failed\", \"err\", err)\n\t\t\t\t\tmerr = err\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcompactions[i%2][idx] += value\n\t\t\t}\n\t\t}\n\t\t// Update all the requested meters\n\t\tif db.compTimeMeter != nil {\n\t\t\tdb.compTimeMeter.Mark(int64((compactions[i%2][0] - compactions[(i-1)%2][0]) * 1000 * 1000 * 1000))\n\t\t}\n\t\tif db.compReadMeter != nil {\n\t\t\tdb.compReadMeter.Mark(int64((compactions[i%2][1] - compactions[(i-1)%2][1]) * 1024 * 1024))\n\t\t}\n\t\tif db.compWriteMeter != nil {\n\t\t\tdb.compWriteMeter.Mark(int64((compactions[i%2][2] - compactions[(i-1)%2][2]) * 1024 * 1024))\n\t\t}\n\n\t\t// Retrieve the write delay statistic\n\t\twritedelay, err := db.db.GetProperty(\"leveldb.writedelay\")\n\t\tif err != nil {\n\t\t\tdb.log.Error(\"Failed to read database write delay statistic\", \"err\", err)\n\t\t\tmerr = err\n\t\t\tcontinue\n\t\t}\n\t\tvar (\n\t\t\tdelayN        int64\n\t\t\tdelayDuration string\n\t\t\tduration      time.Duration\n\t\t\tpaused        bool\n\t\t)\n\t\tif n, err := fmt.Sscanf(writedelay, \"DelayN:%d Delay:%s Paused:%t\", &delayN, &delayDuration, &paused); n != 3 || err != nil {\n\t\t\tdb.log.Error(\"Write delay statistic not found\")\n\t\t\tmerr = err\n\t\t\tcontinue\n\t\t}\n\t\tduration, err = time.ParseDuration(delayDuration)\n\t\tif err != nil {\n\t\t\tdb.log.Error(\"Failed to parse delay duration\", \"err\", err)\n\t\t\tmerr = err\n\t\t\tcontinue\n\t\t}\n\t\tif db.writeDelayNMeter != nil {\n\t\t\tdb.writeDelayNMeter.Mark(delayN - delaystats[0])\n\t\t}\n\t\tif db.writeDelayMeter != nil {\n\t\t\tdb.writeDelayMeter.Mark(duration.Nanoseconds() - delaystats[1])\n\t\t}\n\t\t// If a warning that db is performing compaction has been displayed, any subsequent\n\t\t// warnings will be withheld for one minute not to overwhelm the user.\n\t\tif paused && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 &&\n\t\t\ttime.Now().After(lastWritePaused.Add(writePauseWarningThrottler)) {\n\t\t\tdb.log.Warn(\"Database compacting, degraded performance\")\n\t\t\tlastWritePaused = time.Now()\n\t\t}\n\t\tdelaystats[0], delaystats[1] = delayN, duration.Nanoseconds()\n\n\t\t// Retrieve the database iostats.\n\t\tioStats, err := db.db.GetProperty(\"leveldb.iostats\")\n\t\tif err != nil {\n\t\t\tdb.log.Error(\"Failed to read database iostats\", \"err\", err)\n\t\t\tmerr = err\n\t\t\tcontinue\n\t\t}\n\t\tvar nRead, nWrite float64\n\t\tparts := strings.Split(ioStats, \" \")\n\t\tif len(parts) < 2 {\n\t\t\tdb.log.Error(\"Bad syntax of ioStats\", \"ioStats\", ioStats)\n\t\t\tmerr = fmt.Errorf(\"bad syntax of ioStats %s\", ioStats)\n\t\t\tcontinue\n\t\t}\n\t\tif n, err := fmt.Sscanf(parts[0], \"Read(MB):%f\", &nRead); n != 1 || err != nil {\n\t\t\tdb.log.Error(\"Bad syntax of read entry\", \"entry\", parts[0])\n\t\t\tmerr = err\n\t\t\tcontinue\n\t\t}\n\t\tif n, err := fmt.Sscanf(parts[1], \"Write(MB):%f\", &nWrite); n != 1 || err != nil {\n\t\t\tdb.log.Error(\"Bad syntax of write entry\", \"entry\", parts[1])\n\t\t\tmerr = err\n\t\t\tcontinue\n\t\t}\n\t\tif db.diskReadMeter != nil {\n\t\t\tdb.diskReadMeter.Mark(int64((nRead - iostats[0]) * 1024 * 1024))\n\t\t}\n\t\tif db.diskWriteMeter != nil {\n\t\t\tdb.diskWriteMeter.Mark(int64((nWrite - iostats[1]) * 1024 * 1024))\n\t\t}\n\t\tiostats[0], iostats[1] = nRead, nWrite\n\n\t\t// Sleep a bit, then repeat the stats collection\n\t\tselect {\n\t\tcase errc = <-db.quitChan:\n\t\t\t// Quit requesting, stop hammering the database\n\t\tcase <-time.After(refresh):\n\t\t\t// Timeout, gather a new set of stats\n\t\t}\n\t}\n\n\tif errc == nil {\n\t\terrc = <-db.quitChan\n\t}\n\terrc <- merr\n}\n\nfunc (db *LDBDatabase) NewBatch() Batch {\n\treturn &ldbBatch{db: db.db, b: new(leveldb.Batch)}\n}\n\ntype ldbBatch struct {\n\tdb   *leveldb.DB\n\tb    *leveldb.Batch\n\tsize int\n}\n\nfunc (b *ldbBatch) Put(key, value []byte) error {\n\tb.b.Put(key, value)\n\tb.size += len(value)\n\treturn nil\n}\n\nfunc (b *ldbBatch) Delete(key []byte) error {\n\tb.b.Delete(key)\n\tb.size += 1\n\treturn nil\n}\n\nfunc (b *ldbBatch) Write() error {\n\treturn b.db.Write(b.b, nil)\n}\n\nfunc (b *ldbBatch) ValueSize() int {\n\treturn b.size\n}\n\nfunc (b *ldbBatch) Reset() {\n\tb.b.Reset()\n\tb.size = 0\n}\n\ntype table struct {\n\tdb     Database\n\tprefix string\n}\n\n// NewTable returns a Database object that prefixes all keys with a given\n// string.\nfunc NewTable(db Database, prefix string) Database {\n\treturn &table{\n\t\tdb:     db,\n\t\tprefix: prefix,\n\t}\n}\n\nfunc (dt *table) Put(key []byte, value []byte) error {\n\treturn dt.db.Put(append([]byte(dt.prefix), key...), value)\n}\n\nfunc (dt *table) Has(key []byte) (bool, error) {\n\treturn dt.db.Has(append([]byte(dt.prefix), key...))\n}\n\nfunc (dt *table) Get(key []byte) ([]byte, error) {\n\treturn dt.db.Get(append([]byte(dt.prefix), key...))\n}\n\nfunc (dt *table) Delete(key []byte) error {\n\treturn dt.db.Delete(append([]byte(dt.prefix), key...))\n}\n\nfunc (dt *table) Close() {\n\t// Do nothing; don't close the underlying DB.\n}\n\ntype tableBatch struct {\n\tbatch  Batch\n\tprefix string\n}\n\n// NewTableBatch returns a Batch object which prefixes all keys with a given string.\nfunc NewTableBatch(db Database, prefix string) Batch {\n\treturn &tableBatch{db.NewBatch(), prefix}\n}\n\nfunc (dt *table) NewBatch() Batch {\n\treturn &tableBatch{dt.db.NewBatch(), dt.prefix}\n}\n\nfunc (tb *tableBatch) Put(key, value []byte) error {\n\treturn tb.batch.Put(append([]byte(tb.prefix), key...), value)\n}\n\nfunc (tb *tableBatch) Delete(key []byte) error {\n\treturn tb.batch.Delete(append([]byte(tb.prefix), key...))\n}\n\nfunc (tb *tableBatch) Write() error {\n\treturn tb.batch.Write()\n}\n\nfunc (tb *tableBatch) ValueSize() int {\n\treturn tb.batch.ValueSize()\n}\n\nfunc (tb *tableBatch) Reset() {\n\ttb.batch.Reset()\n}\n"
  },
  {
    "path": "serodb/interface.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage serodb\n\n// Code using batches should try to add this much data to the batch.\n// The value was determined empirically.\nconst IdealBatchSize = 100 * 1024\n\n// Putter wraps the database write operation supported by both batches and regular databases.\ntype Putter interface {\n\tPut(key []byte, value []byte) error\n}\n\n// Deleter wraps the database delete operation supported by both batches and regular databases.\ntype Deleter interface {\n\tDelete(key []byte) error\n}\n\ntype Getter interface {\n\tGet(key []byte) ([]byte, error)\n\tHas(key []byte) (bool, error)\n}\n\n// Database wraps all database operations. All methods are safe for concurrent use.\ntype Database interface {\n\tPutter\n\tDeleter\n\tGetter\n\tClose()\n\tNewBatch() Batch\n}\n\n// Batch is a write-only database that commits changes to its host database\n// when Write is called. Batch cannot be used concurrently.\ntype Batch interface {\n\tPutter\n\tDeleter\n\tValueSize() int // amount of data in the batch\n\tWrite() error\n\t// Reset resets the batch for reuse\n\tReset()\n}\n\ntype Tri interface {\n\tTryGet(key []byte) ([]byte, error)\n\tTryUpdate(key, value []byte) error\n\tTryDelete(key []byte) error\n}\n"
  },
  {
    "path": "serodb/memory_database.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage serodb\n\nimport (\n\t\"errors\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\n/*\n * This is a test memory database. Do not use for any production it does not get persisted\n */\ntype MemDatabase struct {\n\tdb   map[string][]byte\n\tlock sync.RWMutex\n}\n\nfunc NewMemDatabase() *MemDatabase {\n\treturn &MemDatabase{\n\t\tdb: make(map[string][]byte),\n\t}\n}\n\nfunc NewMemDatabaseWithCap(size int) *MemDatabase {\n\treturn &MemDatabase{\n\t\tdb: make(map[string][]byte, size),\n\t}\n}\n\nfunc (db *MemDatabase) Put(key []byte, value []byte) error {\n\tdb.lock.Lock()\n\tdefer db.lock.Unlock()\n\n\tdb.db[string(key)] = common.CopyBytes(value)\n\treturn nil\n}\n\nfunc (db *MemDatabase) Has(key []byte) (bool, error) {\n\tdb.lock.RLock()\n\tdefer db.lock.RUnlock()\n\n\t_, ok := db.db[string(key)]\n\treturn ok, nil\n}\n\nfunc (db *MemDatabase) Get(key []byte) ([]byte, error) {\n\tdb.lock.RLock()\n\tdefer db.lock.RUnlock()\n\n\tif entry, ok := db.db[string(key)]; ok {\n\t\treturn common.CopyBytes(entry), nil\n\t}\n\treturn nil, errors.New(\"not found\")\n}\n\nfunc (db *MemDatabase) Keys() [][]byte {\n\tdb.lock.RLock()\n\tdefer db.lock.RUnlock()\n\n\tkeys := [][]byte{}\n\tfor key := range db.db {\n\t\tkeys = append(keys, []byte(key))\n\t}\n\treturn keys\n}\n\nfunc (db *MemDatabase) Delete(key []byte) error {\n\tdb.lock.Lock()\n\tdefer db.lock.Unlock()\n\n\tdelete(db.db, string(key))\n\treturn nil\n}\n\nfunc (db *MemDatabase) Close() {}\n\nfunc (db *MemDatabase) NewBatch() Batch {\n\treturn &memBatch{db: db}\n}\n\nfunc (db *MemDatabase) Len() int { return len(db.db) }\n\ntype kv struct {\n\tk, v []byte\n\tdel  bool\n}\n\ntype memBatch struct {\n\tdb     *MemDatabase\n\twrites []kv\n\tsize   int\n\tlock   sync.RWMutex\n}\n\nfunc (b *memBatch) Put(key, value []byte) error {\n\tb.lock.Lock()\n\tdefer b.lock.Unlock()\n\n\tb.writes = append(b.writes, kv{common.CopyBytes(key), common.CopyBytes(value), false})\n\tb.size += len(value)\n\treturn nil\n}\n\nfunc (b *memBatch) Delete(key []byte) error {\n\tb.lock.Lock()\n\tdefer b.lock.Unlock()\n\n\tb.writes = append(b.writes, kv{common.CopyBytes(key), nil, true})\n\tb.size += 1\n\treturn nil\n}\n\nfunc (b *memBatch) Write() error {\n\tb.db.lock.Lock()\n\tdefer b.db.lock.Unlock()\n\n\tfor _, kv := range b.writes {\n\t\tif kv.del {\n\t\t\tdelete(b.db.db, string(kv.k))\n\t\t\tcontinue\n\t\t}\n\t\tb.db.db[string(kv.k)] = kv.v\n\t}\n\treturn nil\n}\n\nfunc (b *memBatch) ValueSize() int {\n\treturn b.size\n}\n\nfunc (b *memBatch) Reset() {\n\tb.writes = b.writes[:0]\n\tb.size = 0\n}\n"
  },
  {
    "path": "serostats/serostats.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package serostats implements the network stats reporting service.\npackage serostats\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"net\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/mclock\"\n\t\"github.com/sero-cash/go-sero/consensus\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/sero\"\n\n\t//\"github.com/sero-cash/go-sero/lesdeprecate\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/p2p\"\n\t\"github.com/sero-cash/go-sero/rpc\"\n\t\"golang.org/x/net/websocket\"\n)\n\nconst (\n\t// historyUpdateRange is the number of blocks a node should report upon login or\n\t// history request.\n\thistoryUpdateRange = 50\n\n\t// txChanSize is the size of channel listening to NewTxsEvent.\n\t// The number is referenced from the size of tx pool.\n\ttxChanSize = 4096\n\t// chainHeadChanSize is the size of channel listening to ChainHeadEvent.\n\tchainHeadChanSize = 10\n)\n\ntype txPool interface {\n\t// SubscribeNewTxsEvent should return an event subscription of\n\t// NewTxsEvent and send events to the given channel.\n\tSubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription\n}\n\ntype blockChain interface {\n\tSubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription\n}\n\n// Service implements an Sero netstats reporting daemon that pushes local\n// chain statistics up to a monitoring server.\ntype Service struct {\n\tserver *p2p.Server // Peer-to-peer server to retrieve networking infos\n\teth    *sero.Sero  // Full Sero service if monitoring a full node\n\t//lesdeprecate    *lesdeprecate.LightEthereum // Light Sero service if monitoring a light node\n\tengine consensus.Engine // Consensus engine to retrieve variadic block fields\n\n\tnode string // Name of the node to display on the monitoring page\n\tpass string // Password to authorize access to the monitoring page\n\thost string // Remote address of the monitoring service\n\n\tpongCh chan struct{} // Pong notifications are fed into this channel\n\thistCh chan []uint64 // History request block numbers are fed into this channel\n}\n\n// New returns a monitoring service ready for stats reporting.\n//func New(url string, ethServ *sero.Sero, lesServ *lesdeprecate.LightEthereum) (*Service, error) {\nfunc New(url string, ethServ *sero.Sero) (*Service, error) {\n\t// Parse the netstats connection url\n\tre := regexp.MustCompile(\"([^:@]*)(:([^@]*))?@(.+)\")\n\tparts := re.FindStringSubmatch(url)\n\tif len(parts) != 5 {\n\t\treturn nil, fmt.Errorf(\"invalid netstats url: \\\"%s\\\", should be nodename:secret@host:port\", url)\n\t}\n\t// Assemble and return the stats service\n\tvar engine consensus.Engine\n\tif ethServ != nil {\n\t\tengine = ethServ.Engine()\n\t} else {\n\t\tlog.Error(\"les is not supported\")\n\t\t//engine = lesServ.Engine()\n\t}\n\treturn &Service{\n\t\teth: ethServ,\n\t\t//lesdeprecate:    lesServ,\n\t\tengine: engine,\n\t\tnode:   parts[1],\n\t\tpass:   parts[3],\n\t\thost:   parts[4],\n\t\tpongCh: make(chan struct{}),\n\t\thistCh: make(chan []uint64, 1),\n\t}, nil\n}\n\n// Protocols implements node.Service, returning the P2P network protocols used\n// by the stats service (nil as it doesn't use the devp2p overlay network).\nfunc (s *Service) Protocols() []p2p.Protocol { return nil }\n\n// APIs implements node.Service, returning the RPC API endpoints provided by the\n// stats service (nil as it doesn't provide any user callable APIs).\nfunc (s *Service) APIs() []rpc.API { return nil }\n\n// Start implements node.Service, starting up the monitoring and reporting daemon.\nfunc (s *Service) Start(server *p2p.Server) error {\n\ts.server = server\n\tgo s.loop()\n\n\tlog.Info(\"Stats daemon started\")\n\treturn nil\n}\n\n// Stop implements node.Service, terminating the monitoring and reporting daemon.\nfunc (s *Service) Stop() error {\n\tlog.Info(\"Stats daemon stopped\")\n\treturn nil\n}\n\n// loop keeps trying to connect to the netstats server, reporting chain events\n// until termination.\nfunc (s *Service) loop() {\n\t// Subscribe to chain events to execute updates on\n\tvar blockchain blockChain\n\tvar txpool txPool\n\tif s.eth != nil {\n\t\tblockchain = s.eth.BlockChain()\n\t\ttxpool = s.eth.TxPool()\n\t} else {\n\t\tlog.Error(\"les is not supported\")\n\t}\n\t//else {\n\t//\tblockchain = s.lesdeprecate.BlockChain()\n\t//\ttxpool = s.lesdeprecate.TxPool()\n\t//}\n\n\tchainHeadCh := make(chan core.ChainHeadEvent, chainHeadChanSize)\n\theadSub := blockchain.SubscribeChainHeadEvent(chainHeadCh)\n\tdefer headSub.Unsubscribe()\n\n\ttxEventCh := make(chan core.NewTxsEvent, txChanSize)\n\ttxSub := txpool.SubscribeNewTxsEvent(txEventCh)\n\tdefer txSub.Unsubscribe()\n\n\t// Start a goroutine that exhausts the subsciptions to avoid events piling up\n\tvar (\n\t\tquitCh = make(chan struct{})\n\t\theadCh = make(chan *types.Block, 1)\n\t\ttxCh   = make(chan struct{}, 1)\n\t)\n\tgo func() {\n\t\tvar lastTx mclock.AbsTime\n\n\tHandleLoop:\n\t\tfor {\n\t\t\tselect {\n\t\t\t// Notify of chain head events, but drop if too frequent\n\t\t\tcase head := <-chainHeadCh:\n\t\t\t\tselect {\n\t\t\t\tcase headCh <- head.Block:\n\t\t\t\tdefault:\n\t\t\t\t}\n\n\t\t\t// Notify of new transaction events, but drop if too frequent\n\t\t\tcase <-txEventCh:\n\t\t\t\tif time.Duration(mclock.Now()-lastTx) < time.Second {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tlastTx = mclock.Now()\n\n\t\t\t\tselect {\n\t\t\t\tcase txCh <- struct{}{}:\n\t\t\t\tdefault:\n\t\t\t\t}\n\n\t\t\t// node stopped\n\t\t\tcase <-txSub.Err():\n\t\t\t\tbreak HandleLoop\n\t\t\tcase <-headSub.Err():\n\t\t\t\tbreak HandleLoop\n\t\t\t}\n\t\t}\n\t\tclose(quitCh)\n\t}()\n\t// Loop reporting until termination\n\tfor {\n\t\t// Resolve the URL, defaulting to TLS, but falling back to none too\n\t\tpath := fmt.Sprintf(\"%s/api\", s.host)\n\t\turls := []string{path}\n\n\t\tif !strings.Contains(path, \"://\") { // url.Parse and url.IsAbs is unsuitable (https://github.com/golang/go/issues/19779)\n\t\t\turls = []string{\"wss://\" + path, \"ws://\" + path}\n\t\t}\n\t\t// Establish a websocket connection to the server on any supported URL\n\t\tvar (\n\t\t\tconf *websocket.Config\n\t\t\tconn *websocket.Conn\n\t\t\terr  error\n\t\t)\n\t\tfor _, url := range urls {\n\t\t\tif conf, err = websocket.NewConfig(url, \"http://localhost/\"); err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconf.Dialer = &net.Dialer{Timeout: 5 * time.Second}\n\t\t\tif conn, err = websocket.DialConfig(conf); err == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif err != nil {\n\t\t\tlog.Warn(\"Stats server unreachable\", \"err\", err)\n\t\t\ttime.Sleep(10 * time.Second)\n\t\t\tcontinue\n\t\t}\n\t\t// Authenticate the client with the server\n\t\tif err = s.login(conn); err != nil {\n\t\t\tlog.Warn(\"Stats login failed\", \"err\", err)\n\t\t\tconn.Close()\n\t\t\ttime.Sleep(10 * time.Second)\n\t\t\tcontinue\n\t\t}\n\t\tgo s.readLoop(conn)\n\n\t\t// Send the initial stats so our node looks decent from the get go\n\t\tif err = s.report(conn); err != nil {\n\t\t\tlog.Warn(\"Initial stats report failed\", \"err\", err)\n\t\t\tconn.Close()\n\t\t\tcontinue\n\t\t}\n\t\t// Keep sending status updates until the connection breaks\n\t\tfullReport := time.NewTicker(15 * time.Second)\n\n\t\tfor err == nil {\n\t\t\tselect {\n\t\t\tcase <-quitCh:\n\t\t\t\tconn.Close()\n\t\t\t\treturn\n\n\t\t\tcase <-fullReport.C:\n\t\t\t\tif err = s.report(conn); err != nil {\n\t\t\t\t\tlog.Warn(\"Full stats report failed\", \"err\", err)\n\t\t\t\t}\n\t\t\tcase list := <-s.histCh:\n\t\t\t\tif err = s.reportHistory(conn, list); err != nil {\n\t\t\t\t\tlog.Warn(\"Requested history report failed\", \"err\", err)\n\t\t\t\t}\n\t\t\tcase head := <-headCh:\n\t\t\t\tif err = s.reportBlock(conn, head); err != nil {\n\t\t\t\t\tlog.Warn(\"Block stats report failed\", \"err\", err)\n\t\t\t\t}\n\t\t\t\tif err = s.reportPending(conn); err != nil {\n\t\t\t\t\tlog.Warn(\"Post-block transaction stats report failed\", \"err\", err)\n\t\t\t\t}\n\t\t\tcase <-txCh:\n\t\t\t\tif err = s.reportPending(conn); err != nil {\n\t\t\t\t\tlog.Warn(\"Transaction stats report failed\", \"err\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Make sure the connection is closed\n\t\tconn.Close()\n\t}\n}\n\n// readLoop loops as long as the connection is alive and retrieves data packets\n// from the network socket. If any of them match an active request, it forwards\n// it, if they themselves are requests it initiates a reply, and lastly it drops\n// unknown packets.\nfunc (s *Service) readLoop(conn *websocket.Conn) {\n\t// If the read loop exists, close the connection\n\tdefer conn.Close()\n\n\tfor {\n\t\t// Retrieve the next generic network packet and bail out on error\n\t\tvar msg map[string][]interface{}\n\t\tif err := websocket.JSON.Receive(conn, &msg); err != nil {\n\t\t\tlog.Warn(\"Failed to decode stats server message\", \"err\", err)\n\t\t\treturn\n\t\t}\n\t\tlog.Trace(\"Received message from stats server\", \"msg\", msg)\n\t\tif len(msg[\"emit\"]) == 0 {\n\t\t\tlog.Warn(\"Stats server sent non-broadcast\", \"msg\", msg)\n\t\t\treturn\n\t\t}\n\t\tcommand, ok := msg[\"emit\"][0].(string)\n\t\tif !ok {\n\t\t\tlog.Warn(\"Invalid stats server message type\", \"type\", msg[\"emit\"][0])\n\t\t\treturn\n\t\t}\n\t\t// If the message is a ping reply, deliver (someone must be listening!)\n\t\tif len(msg[\"emit\"]) == 2 && command == \"node-pong\" {\n\t\t\tselect {\n\t\t\tcase s.pongCh <- struct{}{}:\n\t\t\t\t// Pong delivered, continue listening\n\t\t\t\tcontinue\n\t\t\tdefault:\n\t\t\t\t// Ping routine dead, abort\n\t\t\t\tlog.Warn(\"Stats server pinger seems to have died\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\t// If the message is a history request, forward to the event processor\n\t\tif len(msg[\"emit\"]) == 2 && command == \"history\" {\n\t\t\t// Make sure the request is valid and doesn't crash us\n\t\t\trequest, ok := msg[\"emit\"][1].(map[string]interface{})\n\t\t\tif !ok {\n\t\t\t\tlog.Warn(\"Invalid stats history request\", \"msg\", msg[\"emit\"][1])\n\t\t\t\ts.histCh <- nil\n\t\t\t\tcontinue // Ethstats sometime sends invalid history requests, ignore those\n\t\t\t}\n\t\t\tlist, ok := request[\"list\"].([]interface{})\n\t\t\tif !ok {\n\t\t\t\tlog.Warn(\"Invalid stats history block list\", \"list\", request[\"list\"])\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Convert the block number list to an integer list\n\t\t\tnumbers := make([]uint64, len(list))\n\t\t\tfor i, num := range list {\n\t\t\t\tn, ok := num.(float64)\n\t\t\t\tif !ok {\n\t\t\t\t\tlog.Warn(\"Invalid stats history block number\", \"number\", num)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tnumbers[i] = uint64(n)\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase s.histCh <- numbers:\n\t\t\t\tcontinue\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\t\t// Report anything else and continue\n\t\tlog.Info(\"Unknown stats message\", \"msg\", msg)\n\t}\n}\n\n// nodeInfo is the collection of metainformation about a node that is displayed\n// on the monitoring page.\ntype nodeInfo struct {\n\tName     string `json:\"name\"`\n\tNode     string `json:\"node\"`\n\tPort     int    `json:\"port\"`\n\tNetwork  string `json:\"net\"`\n\tProtocol string `json:\"protocol\"`\n\tAPI      string `json:\"api\"`\n\tOs       string `json:\"os\"`\n\tOsVer    string `json:\"os_v\"`\n\tClient   string `json:\"client\"`\n\tHistory  bool   `json:\"canUpdateHistory\"`\n}\n\n// authMsg is the authentication infos needed to login to a monitoring server.\ntype authMsg struct {\n\tID     string   `json:\"id\"`\n\tInfo   nodeInfo `json:\"info\"`\n\tSecret string   `json:\"secret\"`\n}\n\n// login tries to authorize the client at the remote server.\nfunc (s *Service) login(conn *websocket.Conn) error {\n\t// Construct and send the login authentication\n\tinfos := s.server.NodeInfo()\n\n\tvar network, protocol string\n\tif info := infos.Protocols[\"sero\"]; info != nil {\n\t\tnetwork = fmt.Sprintf(\"%d\", info.(*sero.NodeInfo).Network)\n\t\tprotocol = fmt.Sprintf(\"sero/%d\", sero.ProtocolVersions[0])\n\t} else {\n\t\t//network = fmt.Sprintf(\"%d\", infos.Protocols[\"lesdeprecate\"].(*lesdeprecate.NodeInfo).Network)\n\t\t//protocol = fmt.Sprintf(\"lesdeprecate/%d\", lesdeprecate.ClientProtocolVersions[0])\n\t\tlog.Error(\"les is not supported\")\n\t}\n\tauth := &authMsg{\n\t\tID: s.node,\n\t\tInfo: nodeInfo{\n\t\t\tName:     s.node,\n\t\t\tNode:     infos.Name,\n\t\t\tPort:     infos.Ports.Listener,\n\t\t\tNetwork:  network,\n\t\t\tProtocol: protocol,\n\t\t\tAPI:      \"No\",\n\t\t\tOs:       runtime.GOOS,\n\t\t\tOsVer:    runtime.GOARCH,\n\t\t\tClient:   \"0.1.1\",\n\t\t\tHistory:  true,\n\t\t},\n\t\tSecret: s.pass,\n\t}\n\tlogin := map[string][]interface{}{\n\t\t\"emit\": {\"hello\", auth},\n\t}\n\tif err := websocket.JSON.Send(conn, login); err != nil {\n\t\treturn err\n\t}\n\t// Retrieve the remote ack or connection termination\n\tvar ack map[string][]string\n\tif err := websocket.JSON.Receive(conn, &ack); err != nil || len(ack[\"emit\"]) != 1 || ack[\"emit\"][0] != \"ready\" {\n\t\treturn errors.New(\"unauthorized\")\n\t}\n\treturn nil\n}\n\n// report collects all possible data to report and send it to the stats server.\n// This should only be used on reconnects or rarely to avoid overloading the\n// server. Use the individual methods for reporting subscribed events.\nfunc (s *Service) report(conn *websocket.Conn) error {\n\tif err := s.reportLatency(conn); err != nil {\n\t\treturn err\n\t}\n\tif err := s.reportBlock(conn, nil); err != nil {\n\t\treturn err\n\t}\n\tif err := s.reportPending(conn); err != nil {\n\t\treturn err\n\t}\n\tif err := s.reportStats(conn); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// reportLatency sends a ping request to the server, measures the RTT time and\n// finally sends a latency update.\nfunc (s *Service) reportLatency(conn *websocket.Conn) error {\n\t// Send the current time to the serostats server\n\tstart := time.Now()\n\n\tping := map[string][]interface{}{\n\t\t\"emit\": {\"node-ping\", map[string]string{\n\t\t\t\"id\":         s.node,\n\t\t\t\"clientTime\": start.String(),\n\t\t}},\n\t}\n\tif err := websocket.JSON.Send(conn, ping); err != nil {\n\t\treturn err\n\t}\n\t// Wait for the pong request to arrive back\n\tselect {\n\tcase <-s.pongCh:\n\t\t// Pong delivered, report the latency\n\tcase <-time.After(5 * time.Second):\n\t\t// Ping timeout, abort\n\t\treturn errors.New(\"ping timed out\")\n\t}\n\tlatency := strconv.Itoa(int((time.Since(start) / time.Duration(2)).Nanoseconds() / 1000000))\n\n\t// Send back the measured latency\n\tlog.Trace(\"Sending measured latency to serostats\", \"latency\", latency)\n\n\tstats := map[string][]interface{}{\n\t\t\"emit\": {\"latency\", map[string]string{\n\t\t\t\"id\":      s.node,\n\t\t\t\"latency\": latency,\n\t\t}},\n\t}\n\treturn websocket.JSON.Send(conn, stats)\n}\n\n// blockStats is the information to report about individual blocks.\ntype blockStats struct {\n\tNumber     *big.Int       `json:\"number\"`\n\tHash       common.Hash    `json:\"hash\"`\n\tParentHash common.Hash    `json:\"parentHash\"`\n\tTimestamp  *big.Int       `json:\"timestamp\"`\n\tMiner      common.Address `json:\"miner\"`\n\tGasUsed    uint64         `json:\"gasUsed\"`\n\tGasLimit   uint64         `json:\"gasLimit\"`\n\tDiff       string         `json:\"difficulty\"`\n\tTotalDiff  string         `json:\"totalDifficulty\"`\n\tTxs        []txStats      `json:\"transactions\"`\n\tTxHash     common.Hash    `json:\"transactionsRoot\"`\n\tRoot       common.Hash    `json:\"stateRoot\"`\n}\n\n// txStats is the information to report about individual transactions.\ntype txStats struct {\n\tHash common.Hash `json:\"hash\"`\n}\n\n// reportBlock retrieves the current chain head and reports it to the stats server.\nfunc (s *Service) reportBlock(conn *websocket.Conn, block *types.Block) error {\n\t// Gather the block details from the header or block chain\n\tdetails := s.assembleBlockStats(block)\n\n\t// Assemble the block report and send it to the server\n\tlog.Trace(\"Sending new block to serostats\", \"number\", details.Number, \"hash\", details.Hash)\n\n\tstats := map[string]interface{}{\n\t\t\"id\":    s.node,\n\t\t\"block\": details,\n\t}\n\treport := map[string][]interface{}{\n\t\t\"emit\": {\"block\", stats},\n\t}\n\treturn websocket.JSON.Send(conn, report)\n}\n\n// assembleBlockStats retrieves any required metadata to report a single block\n// and assembles the block stats. If block is nil, the current head is processed.\nfunc (s *Service) assembleBlockStats(block *types.Block) *blockStats {\n\t// Gather the block infos from the local blockchain\n\tvar (\n\t\theader *types.Header\n\t\ttd     *big.Int\n\t\ttxs    []txStats\n\t)\n\tif s.eth != nil {\n\t\t// Full nodes have all needed information available\n\t\tif block == nil {\n\t\t\tblock = s.eth.BlockChain().CurrentBlock()\n\t\t}\n\t\theader = block.Header()\n\t\ttd = s.eth.BlockChain().GetTd(header.Hash(), header.Number.Uint64())\n\n\t\ttxs = make([]txStats, len(block.Transactions()))\n\t\tfor i, tx := range block.Transactions() {\n\t\t\ttxs[i].Hash = tx.Hash()\n\t\t}\n\t} else {\n\t\tlog.Error(\"les is not supported\")\n\t}\n\n\t// Assemble and return the block stats\n\tauthor, _ := s.engine.Author(header)\n\n\treturn &blockStats{\n\t\tNumber:     header.Number,\n\t\tHash:       header.Hash(),\n\t\tParentHash: header.ParentHash,\n\t\tTimestamp:  header.Time,\n\t\tMiner:      author,\n\t\tGasUsed:    header.GasUsed,\n\t\tGasLimit:   header.GasLimit,\n\t\tDiff:       header.Difficulty.String(),\n\t\tTotalDiff:  td.String(),\n\t\tTxs:        txs,\n\t\tTxHash:     header.TxHash,\n\t\tRoot:       header.Root,\n\t}\n}\n\n// reportHistory retrieves the most recent batch of blocks and reports it to the\n// stats server.\nfunc (s *Service) reportHistory(conn *websocket.Conn, list []uint64) error {\n\t// Figure out the indexes that need reporting\n\tindexes := make([]uint64, 0, historyUpdateRange)\n\tif len(list) > 0 {\n\t\t// Specific indexes requested, send them back in particular\n\t\tindexes = append(indexes, list...)\n\t} else {\n\t\t// No indexes requested, send back the top ones\n\t\tvar head int64\n\t\tif s.eth != nil {\n\t\t\thead = s.eth.BlockChain().CurrentHeader().Number.Int64()\n\t\t} else {\n\t\t\tlog.Error(\"les is not supported\")\n\t\t}\n\t\t//else {\n\t\t//\thead = s.lesdeprecate.BlockChain().CurrentHeader().Number.Int64()\n\t\t//}\n\t\tstart := head - historyUpdateRange + 1\n\t\tif start < 0 {\n\t\t\tstart = 0\n\t\t}\n\t\tfor i := uint64(start); i <= uint64(head); i++ {\n\t\t\tindexes = append(indexes, i)\n\t\t}\n\t}\n\t// Gather the batch of blocks to report\n\thistory := make([]*blockStats, len(indexes))\n\tfor i, number := range indexes {\n\t\t// Retrieve the next block if it's known to us\n\t\tvar block *types.Block\n\t\tif s.eth != nil {\n\t\t\tblock = s.eth.BlockChain().GetBlockByNumber(number)\n\t\t} else {\n\t\t\tlog.Error(\"les is not supported\")\n\t\t}\n\t\t//else {\n\t\t//\tif header := s.lesdeprecate.BlockChain().GetHeaderByNumber(number); header != nil {\n\t\t//\t\tblock = types.NewBlockWithHeader(header)\n\t\t//\t}\n\t\t//}\n\t\t// If we do have the block, add to the history and continue\n\t\tif block != nil {\n\t\t\thistory[len(history)-1-i] = s.assembleBlockStats(block)\n\t\t\tcontinue\n\t\t}\n\t\t// Ran out of blocks, cut the report short and send\n\t\thistory = history[len(history)-i:]\n\t\tbreak\n\t}\n\t// Assemble the history report and send it to the server\n\tif len(history) > 0 {\n\t\tlog.Trace(\"Sending historical blocks to serostats\", \"first\", history[0].Number, \"last\", history[len(history)-1].Number)\n\t} else {\n\t\tlog.Trace(\"No history to send to stats server\")\n\t}\n\tstats := map[string]interface{}{\n\t\t\"id\":      s.node,\n\t\t\"history\": history,\n\t}\n\treport := map[string][]interface{}{\n\t\t\"emit\": {\"history\", stats},\n\t}\n\treturn websocket.JSON.Send(conn, report)\n}\n\n// pendStats is the information to report about pending transactions.\ntype pendStats struct {\n\tPending int `json:\"pending\"`\n}\n\n// reportPending retrieves the current number of pending transactions and reports\n// it to the stats server.\nfunc (s *Service) reportPending(conn *websocket.Conn) error {\n\t// Retrieve the pending count from the local blockchain\n\tvar pending int\n\tif s.eth != nil {\n\t\tpending, _, _, _ = s.eth.TxPool().Stats()\n\t} else {\n\t\tlog.Error(\"les is not supported\")\n\t}\n\t//else {\n\t//\tpending = s.lesdeprecate.TxPool().Stats()\n\t//}\n\t// Assemble the transaction stats and send it to the server\n\tlog.Trace(\"Sending pending transactions to serostats\", \"count\", pending)\n\n\tstats := map[string]interface{}{\n\t\t\"id\": s.node,\n\t\t\"stats\": &pendStats{\n\t\t\tPending: pending,\n\t\t},\n\t}\n\treport := map[string][]interface{}{\n\t\t\"emit\": {\"pending\", stats},\n\t}\n\treturn websocket.JSON.Send(conn, report)\n}\n\n// nodeStats is the information to report about the local node.\ntype nodeStats struct {\n\tActive   bool `json:\"active\"`\n\tSyncing  bool `json:\"syncing\"`\n\tMining   bool `json:\"mining\"`\n\tHashrate int  `json:\"hashrate\"`\n\tPeers    int  `json:\"peers\"`\n\tGasPrice int  `json:\"gasPrice\"`\n\tUptime   int  `json:\"uptime\"`\n}\n\n// reportPending retrieves various stats about the node at the networking and\n// mining layer and reports it to the stats server.\nfunc (s *Service) reportStats(conn *websocket.Conn) error {\n\t// Gather the syncing and mining infos from the local miner instance\n\tvar (\n\t\tmining   bool\n\t\thashrate int\n\t\tsyncing  bool\n\t\tgasprice int\n\t)\n\tif s.eth != nil {\n\t\tmining = s.eth.Miner().Mining()\n\t\thashrate = int(s.eth.Miner().HashRate())\n\n\t\tsync := s.eth.Downloader().Progress()\n\t\tsyncing = s.eth.BlockChain().CurrentHeader().Number.Uint64() >= sync.HighestBlock\n\n\t\tprice, _ := s.eth.APIBackend.SuggestPrice(context.Background())\n\t\tgasprice = int(price.Uint64())\n\t} else {\n\t\tlog.Error(\"les is not supported\")\n\t}\n\t//else {\n\t//\tsync := s.lesdeprecate.Downloader().Progress()\n\t//\tsyncing = s.lesdeprecate.BlockChain().CurrentHeader().Number.Uint64() >= sync.HighestBlock\n\t//}\n\t// Assemble the node stats and send it to the server\n\tlog.Trace(\"Sending node details to serostats\")\n\n\tstats := map[string]interface{}{\n\t\t\"id\": s.node,\n\t\t\"stats\": &nodeStats{\n\t\t\tActive:   true,\n\t\t\tMining:   mining,\n\t\t\tHashrate: hashrate,\n\t\t\tPeers:    s.server.PeerCount(),\n\t\t\tGasPrice: gasprice,\n\t\t\tSyncing:  syncing,\n\t\t\tUptime:   100,\n\t\t},\n\t}\n\treport := map[string][]interface{}{\n\t\t\"emit\": {\"stats\", stats},\n\t}\n\treturn websocket.JSON.Send(conn, report)\n}\n"
  },
  {
    "path": "tests/abigen/testAbi.go",
    "content": "// Code generated - DO NOT EDIT.\n// This file is a generated binding and any manual changes will be lost.\n\npackage abigen\n\nimport (\n\t\"math/big\"\n\t\"strings\"\n\n\tsero \"github.com/sero-cash/go-sero\"\n\t\"github.com/sero-cash/go-sero/accounts/abi\"\n\t\"github.com/sero-cash/go-sero/accounts/abi/bind\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n)\n\n// TestabiABI is the input ABI used to generate the binding from.\nconst TestabiABI = \"[{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"count\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint16\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"totalSupply\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint256\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"registerscode\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"string\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"decimals\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint8\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"infon\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"},{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address[]\\\"},{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint8\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"number\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"a\\\",\\\"type\\\":\\\"uint32\\\"},{\\\"name\\\":\\\"b\\\",\\\"type\\\":\\\"uint64\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"own\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"registers\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"address[]\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":true,\\\"inputs\\\":[],\\\"name\\\":\\\"blockN\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"uint64\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"view\\\",\\\"type\\\":\\\"function\\\"},{\\\"constant\\\":false,\\\"inputs\\\":[{\\\"name\\\":\\\"addrs\\\",\\\"type\\\":\\\"address[]\\\"}],\\\"name\\\":\\\"registers\\\",\\\"outputs\\\":[{\\\"name\\\":\\\"\\\",\\\"type\\\":\\\"bool\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"function\\\"},{\\\"inputs\\\":[{\\\"name\\\":\\\"registers\\\",\\\"type\\\":\\\"address[]\\\"},{\\\"name\\\":\\\"registerscode\\\",\\\"type\\\":\\\"string\\\"},{\\\"name\\\":\\\"decimals\\\",\\\"type\\\":\\\"uint8\\\"},{\\\"name\\\":\\\"count\\\",\\\"type\\\":\\\"uint16\\\"},{\\\"name\\\":\\\"number\\\",\\\"type\\\":\\\"uint32\\\"},{\\\"name\\\":\\\"blockN\\\",\\\"type\\\":\\\"uint64\\\"},{\\\"name\\\":\\\"totalSupply\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"name\\\":\\\"own\\\",\\\"type\\\":\\\"address\\\"}],\\\"payable\\\":false,\\\"stateMutability\\\":\\\"nonpayable\\\",\\\"type\\\":\\\"constructor\\\"},{\\\"anonymous\\\":false,\\\"inputs\\\":[{\\\"indexed\\\":false,\\\"name\\\":\\\"registers\\\",\\\"type\\\":\\\"address[]\\\"},{\\\"indexed\\\":false,\\\"name\\\":\\\"registerscode\\\",\\\"type\\\":\\\"string\\\"},{\\\"indexed\\\":false,\\\"name\\\":\\\"decimals\\\",\\\"type\\\":\\\"uint8\\\"},{\\\"indexed\\\":false,\\\"name\\\":\\\"count\\\",\\\"type\\\":\\\"uint16\\\"},{\\\"indexed\\\":false,\\\"name\\\":\\\"number\\\",\\\"type\\\":\\\"uint32\\\"},{\\\"indexed\\\":false,\\\"name\\\":\\\"blockN\\\",\\\"type\\\":\\\"uint64\\\"},{\\\"indexed\\\":false,\\\"name\\\":\\\"totalSupply\\\",\\\"type\\\":\\\"uint256\\\"},{\\\"indexed\\\":false,\\\"name\\\":\\\"own\\\",\\\"type\\\":\\\"address\\\"}],\\\"name\\\":\\\"constructorEvent\\\",\\\"type\\\":\\\"event\\\"}]\"\n\n// TestabiBin is the compiled bytecode used for deploying new contracts.\nconst TestabiBin = `0x608060405234801561001057600080fd5b50604051610a3e380380610a3e8339810160409081528151602080840151928401516060850151608086015160a087015160c088015160e089015196890180519099989098019794969395929491939092909161007391600091908b0190610290565b5086516100879060019060208a01906102f5565b5085600260006101000a81548160ff021916908360ff16021790555084600260016101000a81548161ffff021916908361ffff16021790555083600260036101000a81548163ffffffff021916908363ffffffff16021790555082600260076101000a8154816001604060020a0302191690836001604060020a031602179055508160038190555080600460006101000a815481600160a060020a030219169083600160a060020a031602179055507f5d4c6f231ce175a28c0d89b77cb4a74c6a5f61efcc537d422a66c2220c8f8c0388888888888888886040518080602001806020018960ff1660ff1681526020018861ffff1661ffff1681526020018763ffffffff1663ffffffff168152602001866001604060020a03166001604060020a0316815260200185815260200184600160a060020a0316600160a060020a0316815260200183810383528b818151815260200191508051906020019060200280838360005b838110156102055781810151838201526020016101ed565b5050505090500183810382528a818151815260200191508051906020019080838360005b83811015610241578181015183820152602001610229565b50505050905090810190601f16801561026e5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390a150505050505050506103b0565b8280548282559060005260206000209081019282156102e5579160200282015b828111156102e55782518254600160a060020a031916600160a060020a039091161782556020909201916001909101906102b0565b506102f192915061036f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061033657805160ff1916838001178555610363565b82800160010185558215610363579182015b82811115610363578251825591602001919060010190610348565b506102f1929150610396565b61039391905b808211156102f1578054600160a060020a0319168155600101610375565b90565b61039391905b808211156102f1576000815560010161039c565b61067f806103bf6000396000f3006080604052600436106100a35763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306661abd81146100a857806318160ddd146100d45780631d44b1c2146100fb578063313ce5671461018557806359593c70146101b05780638381f58a1461023357806399cdee0e14610271578063a0d3d084146102a2578063a52dc2e714610307578063a818131a14610339575b600080fd5b3480156100b457600080fd5b506100bd6103a2565b6040805161ffff9092168252519081900360200190f35b3480156100e057600080fd5b506100e96103b2565b60408051918252519081900360200190f35b34801561010757600080fd5b506101106103b8565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014a578181015183820152602001610132565b50505050905090810190601f1680156101775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561019157600080fd5b5061019a61044d565b6040805160ff9092168252519081900360200190f35b3480156101bc57600080fd5b506101c5610456565b60408051600160a060020a038516815260ff8316918101919091526060602080830182815285519284019290925284516080840191868101910280838360005b8381101561021d578181015183820152602001610205565b5050505090500194505050505060405180910390f35b34801561023f57600080fd5b506102486104dd565b6040805163ffffffff909316835267ffffffffffffffff90911660208301528051918290030190f35b34801561027d57600080fd5b50610286610507565b60408051600160a060020a039092168252519081900360200190f35b3480156102ae57600080fd5b506102b7610516565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102f35781810151838201526020016102db565b505050509050019250505060405180910390f35b34801561031357600080fd5b5061031c610577565b6040805167ffffffffffffffff9092168252519081900360200190f35b34801561034557600080fd5b506040805160206004803580820135838102808601850190965280855261038e953695939460249493850192918291850190849080828437509497506105929650505050505050565b604080519115158252519081900360200190f35b600254610100900461ffff165b90565b60035490565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104435780601f1061041857610100808354040283529160200191610443565b820191906000526020600020905b81548152906001019060200180831161042657829003601f168201915b5050505050905090565b60025460ff1690565b600454600254600080546040805160208084028201810190925282815292946060948694600160a060020a0390921693859360ff90921692918491908301828280156104cb57602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116104ad575b50505050509150925092509250909192565b6002546301000000810463ffffffff169167010000000000000090910467ffffffffffffffff1690565b600454600160a060020a031690565b6060600080548060200260200160405190810160405280929190818152602001828054801561044357602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610550575050505050905090565b600254670100000000000000900467ffffffffffffffff1690565b80516000906105a790829060208501906105b0565b50600192915050565b828054828255906000526020600020908101928215610612579160200282015b82811115610612578251825473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039091161782556020909201916001909101906105d0565b5061061e929150610622565b5090565b6103af91905b8082111561061e57805473ffffffffffffffffffffffffffffffffffffffff191681556001016106285600a165627a7a72305820ca5b03515993c293931836dd754566ba471e6435977179567ef9c5e54c721d320029`\n\n// DeployTestabi deploys a new Ethereum contract, binding an instance of Testabi to it.\nfunc DeployTestabi(auth *bind.TransactOpts, backend bind.ContractBackend, registers []common.Address, registerscode string, decimals uint8, count uint16, number uint32, blockN uint64, totalSupply *big.Int, own common.Address) (common.Address, *types.Transaction, *Testabi, error) {\n\tparsed, err := abi.JSON(strings.NewReader(TestabiABI))\n\tif err != nil {\n\t\treturn common.Address{}, nil, nil, err\n\t}\n\taddress, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(TestabiBin), backend, registers, registerscode, decimals, count, number, blockN, totalSupply, own)\n\tif err != nil {\n\t\treturn common.Address{}, nil, nil, err\n\t}\n\treturn address, tx, &Testabi{TestabiCaller: TestabiCaller{contract: contract}, TestabiTransactor: TestabiTransactor{contract: contract}, TestabiFilterer: TestabiFilterer{contract: contract}}, nil\n}\n\n// Testabi is an auto generated Go binding around an Ethereum contract.\ntype Testabi struct {\n\tTestabiCaller     // Read-only binding to the contract\n\tTestabiTransactor // Write-only binding to the contract\n\tTestabiFilterer   // Log filterer for contract events\n}\n\n// TestabiCaller is an auto generated read-only Go binding around an Ethereum contract.\ntype TestabiCaller struct {\n\tcontract *bind.BoundContract // Generic contract wrapper for the low level calls\n}\n\n// TestabiTransactor is an auto generated write-only Go binding around an Ethereum contract.\ntype TestabiTransactor struct {\n\tcontract *bind.BoundContract // Generic contract wrapper for the low level calls\n}\n\n// TestabiFilterer is an auto generated log filtering Go binding around an Ethereum contract events.\ntype TestabiFilterer struct {\n\tcontract *bind.BoundContract // Generic contract wrapper for the low level calls\n}\n\n// TestabiSession is an auto generated Go binding around an Ethereum contract,\n// with pre-set call and transact options.\ntype TestabiSession struct {\n\tContract     *Testabi          // Generic contract binding to set the session for\n\tCallOpts     bind.CallOpts     // Call options to use throughout this session\n\tTransactOpts bind.TransactOpts // Transaction auth options to use throughout this session\n}\n\n// TestabiCallerSession is an auto generated read-only Go binding around an Ethereum contract,\n// with pre-set call options.\ntype TestabiCallerSession struct {\n\tContract *TestabiCaller // Generic contract caller binding to set the session for\n\tCallOpts bind.CallOpts  // Call options to use throughout this session\n}\n\n// TestabiTransactorSession is an auto generated write-only Go binding around an Ethereum contract,\n// with pre-set transact options.\ntype TestabiTransactorSession struct {\n\tContract     *TestabiTransactor // Generic contract transactor binding to set the session for\n\tTransactOpts bind.TransactOpts  // Transaction auth options to use throughout this session\n}\n\n// TestabiRaw is an auto generated low-level Go binding around an Ethereum contract.\ntype TestabiRaw struct {\n\tContract *Testabi // Generic contract binding to access the raw methods on\n}\n\n// TestabiCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.\ntype TestabiCallerRaw struct {\n\tContract *TestabiCaller // Generic read-only contract binding to access the raw methods on\n}\n\n// TestabiTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.\ntype TestabiTransactorRaw struct {\n\tContract *TestabiTransactor // Generic write-only contract binding to access the raw methods on\n}\n\n// NewTestabi creates a new instance of Testabi, bound to a specific deployed contract.\nfunc NewTestabi(address common.Address, backend bind.ContractBackend) (*Testabi, error) {\n\tcontract, err := bindTestabi(address, backend, backend, backend)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Testabi{TestabiCaller: TestabiCaller{contract: contract}, TestabiTransactor: TestabiTransactor{contract: contract}, TestabiFilterer: TestabiFilterer{contract: contract}}, nil\n}\n\n// NewTestabiCaller creates a new read-only instance of Testabi, bound to a specific deployed contract.\nfunc NewTestabiCaller(address common.Address, caller bind.ContractCaller) (*TestabiCaller, error) {\n\tcontract, err := bindTestabi(address, caller, nil, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &TestabiCaller{contract: contract}, nil\n}\n\n// NewTestabiTransactor creates a new write-only instance of Testabi, bound to a specific deployed contract.\nfunc NewTestabiTransactor(address common.Address, transactor bind.ContractTransactor) (*TestabiTransactor, error) {\n\tcontract, err := bindTestabi(address, nil, transactor, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &TestabiTransactor{contract: contract}, nil\n}\n\n// NewTestabiFilterer creates a new log filterer instance of Testabi, bound to a specific deployed contract.\nfunc NewTestabiFilterer(address common.Address, filterer bind.ContractFilterer) (*TestabiFilterer, error) {\n\tcontract, err := bindTestabi(address, nil, nil, filterer)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &TestabiFilterer{contract: contract}, nil\n}\n\n// bindTestabi binds a generic wrapper to an already deployed contract.\nfunc bindTestabi(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {\n\tparsed, err := abi.JSON(strings.NewReader(TestabiABI))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil\n}\n\n// Call invokes the (constant) contract method with params as input values and\n// sets the output to result. The result type might be a single field for simple\n// returns, a slice of interfaces for anonymous returns and a struct for named\n// returns.\nfunc (_Testabi *TestabiRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {\n\treturn _Testabi.Contract.TestabiCaller.contract.Call(opts, result, method, params...)\n}\n\n// Transfer initiates a plain transaction to move funds to the contract, calling\n// its default method if one is available.\nfunc (_Testabi *TestabiRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {\n\treturn _Testabi.Contract.TestabiTransactor.contract.Transfer(opts)\n}\n\n// Transact invokes the (paid) contract method with params as input values.\nfunc (_Testabi *TestabiRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {\n\treturn _Testabi.Contract.TestabiTransactor.contract.Transact(opts, method, params...)\n}\n\n// Call invokes the (constant) contract method with params as input values and\n// sets the output to result. The result type might be a single field for simple\n// returns, a slice of interfaces for anonymous returns and a struct for named\n// returns.\nfunc (_Testabi *TestabiCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {\n\treturn _Testabi.Contract.contract.Call(opts, result, method, params...)\n}\n\n// Transfer initiates a plain transaction to move funds to the contract, calling\n// its default method if one is available.\nfunc (_Testabi *TestabiTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {\n\treturn _Testabi.Contract.contract.Transfer(opts)\n}\n\n// Transact invokes the (paid) contract method with params as input values.\nfunc (_Testabi *TestabiTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {\n\treturn _Testabi.Contract.contract.Transact(opts, method, params...)\n}\n\n// BlockN is a free data retrieval call binding the contract method 0xa52dc2e7.\n//\n// Solidity: function blockN() constant returns(uint64)\nfunc (_Testabi *TestabiCaller) BlockN(opts *bind.CallOpts) (uint64, error) {\n\tvar (\n\t\tret0 = new(uint64)\n\t)\n\tout := ret0\n\terr := _Testabi.contract.Call(opts, out, \"blockN\")\n\treturn *ret0, err\n}\n\n// BlockN is a free data retrieval call binding the contract method 0xa52dc2e7.\n//\n// Solidity: function blockN() constant returns(uint64)\nfunc (_Testabi *TestabiSession) BlockN() (uint64, error) {\n\treturn _Testabi.Contract.BlockN(&_Testabi.CallOpts)\n}\n\n// BlockN is a free data retrieval call binding the contract method 0xa52dc2e7.\n//\n// Solidity: function blockN() constant returns(uint64)\nfunc (_Testabi *TestabiCallerSession) BlockN() (uint64, error) {\n\treturn _Testabi.Contract.BlockN(&_Testabi.CallOpts)\n}\n\n// Count is a free data retrieval call binding the contract method 0x06661abd.\n//\n// Solidity: function count() constant returns(uint16)\nfunc (_Testabi *TestabiCaller) Count(opts *bind.CallOpts) (uint16, error) {\n\tvar (\n\t\tret0 = new(uint16)\n\t)\n\tout := ret0\n\terr := _Testabi.contract.Call(opts, out, \"count\")\n\treturn *ret0, err\n}\n\n// Count is a free data retrieval call binding the contract method 0x06661abd.\n//\n// Solidity: function count() constant returns(uint16)\nfunc (_Testabi *TestabiSession) Count() (uint16, error) {\n\treturn _Testabi.Contract.Count(&_Testabi.CallOpts)\n}\n\n// Count is a free data retrieval call binding the contract method 0x06661abd.\n//\n// Solidity: function count() constant returns(uint16)\nfunc (_Testabi *TestabiCallerSession) Count() (uint16, error) {\n\treturn _Testabi.Contract.Count(&_Testabi.CallOpts)\n}\n\n// Decimals is a free data retrieval call binding the contract method 0x313ce567.\n//\n// Solidity: function decimals() constant returns(uint8)\nfunc (_Testabi *TestabiCaller) Decimals(opts *bind.CallOpts) (uint8, error) {\n\tvar (\n\t\tret0 = new(uint8)\n\t)\n\tout := ret0\n\terr := _Testabi.contract.Call(opts, out, \"decimals\")\n\treturn *ret0, err\n}\n\n// Decimals is a free data retrieval call binding the contract method 0x313ce567.\n//\n// Solidity: function decimals() constant returns(uint8)\nfunc (_Testabi *TestabiSession) Decimals() (uint8, error) {\n\treturn _Testabi.Contract.Decimals(&_Testabi.CallOpts)\n}\n\n// Decimals is a free data retrieval call binding the contract method 0x313ce567.\n//\n// Solidity: function decimals() constant returns(uint8)\nfunc (_Testabi *TestabiCallerSession) Decimals() (uint8, error) {\n\treturn _Testabi.Contract.Decimals(&_Testabi.CallOpts)\n}\n\n// Infon is a free data retrieval call binding the contract method 0x59593c70.\n//\n// Solidity: function infon() constant returns(address, address[], uint8)\nfunc (_Testabi *TestabiCaller) Infon(opts *bind.CallOpts) (common.Address, []common.Address, uint8, error) {\n\tvar (\n\t\tret0 = new(common.Address)\n\t\tret1 = new([]common.Address)\n\t\tret2 = new(uint8)\n\t)\n\tout := &[]interface{}{\n\t\tret0,\n\t\tret1,\n\t\tret2,\n\t}\n\terr := _Testabi.contract.Call(opts, out, \"infon\")\n\treturn *ret0, *ret1, *ret2, err\n}\n\n// Infon is a free data retrieval call binding the contract method 0x59593c70.\n//\n// Solidity: function infon() constant returns(address, address[], uint8)\nfunc (_Testabi *TestabiSession) Infon() (common.Address, []common.Address, uint8, error) {\n\treturn _Testabi.Contract.Infon(&_Testabi.CallOpts)\n}\n\n// Infon is a free data retrieval call binding the contract method 0x59593c70.\n//\n// Solidity: function infon() constant returns(address, address[], uint8)\nfunc (_Testabi *TestabiCallerSession) Infon() (common.Address, []common.Address, uint8, error) {\n\treturn _Testabi.Contract.Infon(&_Testabi.CallOpts)\n}\n\n// Number is a free data retrieval call binding the contract method 0x8381f58a.\n//\n// Solidity: function number() constant returns(a uint32, b uint64)\nfunc (_Testabi *TestabiCaller) Number(opts *bind.CallOpts) (struct {\n\tA uint32\n\tB uint64\n}, error) {\n\tret := new(struct {\n\t\tA uint32\n\t\tB uint64\n\t})\n\tout := ret\n\terr := _Testabi.contract.Call(opts, out, \"number\")\n\treturn *ret, err\n}\n\n// Number is a free data retrieval call binding the contract method 0x8381f58a.\n//\n// Solidity: function number() constant returns(a uint32, b uint64)\nfunc (_Testabi *TestabiSession) Number() (struct {\n\tA uint32\n\tB uint64\n}, error) {\n\treturn _Testabi.Contract.Number(&_Testabi.CallOpts)\n}\n\n// Number is a free data retrieval call binding the contract method 0x8381f58a.\n//\n// Solidity: function number() constant returns(a uint32, b uint64)\nfunc (_Testabi *TestabiCallerSession) Number() (struct {\n\tA uint32\n\tB uint64\n}, error) {\n\treturn _Testabi.Contract.Number(&_Testabi.CallOpts)\n}\n\n// Own is a free data retrieval call binding the contract method 0x99cdee0e.\n//\n// Solidity: function own() constant returns(address)\nfunc (_Testabi *TestabiCaller) Own(opts *bind.CallOpts) (common.Address, error) {\n\tvar (\n\t\tret0 = new(common.Address)\n\t)\n\tout := ret0\n\terr := _Testabi.contract.Call(opts, out, \"own\")\n\treturn *ret0, err\n}\n\n// Own is a free data retrieval call binding the contract method 0x99cdee0e.\n//\n// Solidity: function own() constant returns(address)\nfunc (_Testabi *TestabiSession) Own() (common.Address, error) {\n\treturn _Testabi.Contract.Own(&_Testabi.CallOpts)\n}\n\n// Own is a free data retrieval call binding the contract method 0x99cdee0e.\n//\n// Solidity: function own() constant returns(address)\nfunc (_Testabi *TestabiCallerSession) Own() (common.Address, error) {\n\treturn _Testabi.Contract.Own(&_Testabi.CallOpts)\n}\n\n// Registerscode is a free data retrieval call binding the contract method 0x1d44b1c2.\n//\n// Solidity: function registerscode() constant returns(string)\nfunc (_Testabi *TestabiCaller) Registerscode(opts *bind.CallOpts) (string, error) {\n\tvar (\n\t\tret0 = new(string)\n\t)\n\tout := ret0\n\terr := _Testabi.contract.Call(opts, out, \"registerscode\")\n\treturn *ret0, err\n}\n\n// Registerscode is a free data retrieval call binding the contract method 0x1d44b1c2.\n//\n// Solidity: function registerscode() constant returns(string)\nfunc (_Testabi *TestabiSession) Registerscode() (string, error) {\n\treturn _Testabi.Contract.Registerscode(&_Testabi.CallOpts)\n}\n\n// Registerscode is a free data retrieval call binding the contract method 0x1d44b1c2.\n//\n// Solidity: function registerscode() constant returns(string)\nfunc (_Testabi *TestabiCallerSession) Registerscode() (string, error) {\n\treturn _Testabi.Contract.Registerscode(&_Testabi.CallOpts)\n}\n\n// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.\n//\n// Solidity: function totalSupply() constant returns(uint256)\nfunc (_Testabi *TestabiCaller) TotalSupply(opts *bind.CallOpts) (*big.Int, error) {\n\tvar (\n\t\tret0 = new(*big.Int)\n\t)\n\tout := ret0\n\terr := _Testabi.contract.Call(opts, out, \"totalSupply\")\n\treturn *ret0, err\n}\n\n// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.\n//\n// Solidity: function totalSupply() constant returns(uint256)\nfunc (_Testabi *TestabiSession) TotalSupply() (*big.Int, error) {\n\treturn _Testabi.Contract.TotalSupply(&_Testabi.CallOpts)\n}\n\n// TotalSupply is a free data retrieval call binding the contract method 0x18160ddd.\n//\n// Solidity: function totalSupply() constant returns(uint256)\nfunc (_Testabi *TestabiCallerSession) TotalSupply() (*big.Int, error) {\n\treturn _Testabi.Contract.TotalSupply(&_Testabi.CallOpts)\n}\n\n// Registers is a paid mutator transaction binding the contract method 0xa818131a.\n//\n// Solidity: function registers(addrs address[]) returns(bool)\nfunc (_Testabi *TestabiTransactor) Registers(opts *bind.TransactOpts, addrs []common.Address) (*types.Transaction, error) {\n\treturn _Testabi.contract.Transact(opts, \"registers\", addrs)\n}\n\n// Registers is a paid mutator transaction binding the contract method 0xa818131a.\n//\n// Solidity: function registers(addrs address[]) returns(bool)\nfunc (_Testabi *TestabiSession) Registers(addrs []common.Address) (*types.Transaction, error) {\n\treturn _Testabi.Contract.Registers(&_Testabi.TransactOpts, addrs)\n}\n\n// Registers is a paid mutator transaction binding the contract method 0xa818131a.\n//\n// Solidity: function registers(addrs address[]) returns(bool)\nfunc (_Testabi *TestabiTransactorSession) Registers(addrs []common.Address) (*types.Transaction, error) {\n\treturn _Testabi.Contract.Registers(&_Testabi.TransactOpts, addrs)\n}\n\n// TestabiConstructorEventIterator is returned from FilterConstructorEvent and is used to iterate over the raw logs and unpacked data for ConstructorEvent events raised by the Testabi contract.\ntype TestabiConstructorEventIterator struct {\n\tEvent *TestabiConstructorEvent // Event containing the contract specifics and raw log\n\n\tcontract *bind.BoundContract // Generic contract to use for unpacking event data\n\tevent    string              // Event name to use for unpacking event data\n\n\tlogs chan types.Log    // Log channel receiving the found contract events\n\tsub  sero.Subscription // Subscription for errors, completion and termination\n\tdone bool              // Whether the subscription completed delivering logs\n\tfail error             // Occurred error to stop iteration\n}\n\n// Next advances the iterator to the subsequent event, returning whether there\n// are any more events found. In case of a retrieval or parsing error, false is\n// returned and Error() can be queried for the exact failure.\nfunc (it *TestabiConstructorEventIterator) Next() bool {\n\t// If the iterator failed, stop iterating\n\tif it.fail != nil {\n\t\treturn false\n\t}\n\t// If the iterator completed, deliver directly whatever's available\n\tif it.done {\n\t\tselect {\n\t\tcase log := <-it.logs:\n\t\t\tit.Event = new(TestabiConstructorEvent)\n\t\t\tif err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {\n\t\t\t\tit.fail = err\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tit.Event.Raw = log\n\t\t\treturn true\n\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t}\n\t// Iterator still in progress, wait for either a data or an error event\n\tselect {\n\tcase log := <-it.logs:\n\t\tit.Event = new(TestabiConstructorEvent)\n\t\tif err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {\n\t\t\tit.fail = err\n\t\t\treturn false\n\t\t}\n\t\tit.Event.Raw = log\n\t\treturn true\n\n\tcase err := <-it.sub.Err():\n\t\tit.done = true\n\t\tit.fail = err\n\t\treturn it.Next()\n\t}\n}\n\n// Error returns any retrieval or parsing error occurred during filtering.\nfunc (it *TestabiConstructorEventIterator) Error() error {\n\treturn it.fail\n}\n\n// Close terminates the iteration process, releasing any pending underlying\n// resources.\nfunc (it *TestabiConstructorEventIterator) Close() error {\n\tit.sub.Unsubscribe()\n\treturn nil\n}\n\n// TestabiConstructorEvent represents a ConstructorEvent event raised by the Testabi contract.\ntype TestabiConstructorEvent struct {\n\tRegisters     []common.Address\n\tRegisterscode string\n\tDecimals      uint8\n\tCount         uint16\n\tNumber        uint32\n\tBlockN        uint64\n\tTotalSupply   *big.Int\n\tOwn           common.Address\n\tRaw           types.Log // Blockchain specific contextual infos\n}\n\n// FilterConstructorEvent is a free log retrieval operation binding the contract event 0x5d4c6f231ce175a28c0d89b77cb4a74c6a5f61efcc537d422a66c2220c8f8c03.\n//\n// Solidity: e constructorEvent(registers address[], registerscode string, decimals uint8, count uint16, number uint32, blockN uint64, totalSupply uint256, own address)\nfunc (_Testabi *TestabiFilterer) FilterConstructorEvent(opts *bind.FilterOpts) (*TestabiConstructorEventIterator, error) {\n\n\tlogs, sub, err := _Testabi.contract.FilterLogs(opts, \"constructorEvent\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &TestabiConstructorEventIterator{contract: _Testabi.contract, event: \"constructorEvent\", logs: logs, sub: sub}, nil\n}\n\n// WatchConstructorEvent is a free log subscription operation binding the contract event 0x5d4c6f231ce175a28c0d89b77cb4a74c6a5f61efcc537d422a66c2220c8f8c03.\n//\n// Solidity: e constructorEvent(registers address[], registerscode string, decimals uint8, count uint16, number uint32, blockN uint64, totalSupply uint256, own address)\nfunc (_Testabi *TestabiFilterer) WatchConstructorEvent(opts *bind.WatchOpts, sink chan<- *TestabiConstructorEvent) (event.Subscription, error) {\n\n\tlogs, sub, err := _Testabi.contract.WatchLogs(opts, \"constructorEvent\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn event.NewSubscription(func(quit <-chan struct{}) error {\n\t\tdefer sub.Unsubscribe()\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase log := <-logs:\n\t\t\t\t// New log arrived, parse the event and forward to the user\n\t\t\t\tevent := new(TestabiConstructorEvent)\n\t\t\t\tif err := _Testabi.contract.UnpackLog(event, \"constructorEvent\", log); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tevent.Raw = log\n\n\t\t\t\tselect {\n\t\t\t\tcase sink <- event:\n\t\t\t\tcase err := <-sub.Err():\n\t\t\t\t\treturn err\n\t\t\t\tcase <-quit:\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\tcase err := <-sub.Err():\n\t\t\t\treturn err\n\t\t\tcase <-quit:\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}), nil\n}\n"
  },
  {
    "path": "tests/abigen/testAbi.sol",
    "content": "pragma solidity ^0.4.16;\n\n\ncontract testabi {\n\n\n    address[] private _registers;\n    string private _registerscode;\n    uint8 private _decimals;\n    uint16 private _count;\n    uint32 private _number;\n    uint64 private _block;\n    uint256 _totalSupply;\n    address private _own;\n\n    event constructorEvent( address[] registers,\n    string registerscode,\n    uint8 decimals,\n    uint16 count,\n    uint32 number,\n    uint64 blockN,\n    uint256 totalSupply,\n    address own);\n\n    constructor(\n        address[] registers,\n    string registerscode,\n    uint8 decimals,\n    uint16 count,\n    uint32 number,\n    uint64 blockN,\n    uint256 totalSupply,\n    address own) public{\n        _registers = registers;\n    _registerscode=registerscode;\n    _decimals=decimals;\n    _count=count;\n    _number=number;\n    _block=blockN;\n    _totalSupply=totalSupply;\n    _own=own;\n    emit constructorEvent(registers,registerscode,decimals,count,number,blockN,totalSupply,own);\n    }\n\n    function registers( address[] addrs) public returns(bool){\n        _registers=addrs;\n        return true;\n    }\n\n    function infon() public view returns(address,address[],uint8){\n        return (_own,_registers,_decimals);\n    }\n\n    /**\n     * @return the number of decimals of the token.\n     */\n    function decimals() public view returns (uint8) {\n        return _decimals;\n    }\n\n    function totalSupply() public view returns (uint256) {\n        return _totalSupply;\n    }\n\n    function registerscode() public view returns (string) {\n        return _registerscode;\n    }\n\n    function number() public view returns ( uint32 a, uint64 b) {\n        a=_number;\n        b=_block;\n        return;\n    }\n\n    function blockN() public view returns (uint64) {\n        return _block;\n    }\n\n    function registers() public view returns (address[]) {\n        return _registers;\n    }\n    function count() public view returns (uint16) {\n        return _count;\n    }\n\n    function own() public view returns (address) {\n        return _own;\n    }\n\n}"
  },
  {
    "path": "tests/abigen_test.go",
    "content": "package tests\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"math/big\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/tests/abigen\"\n\n\t\"github.com/sero-cash/go-sero/accounts/abi/bind\"\n\t\"github.com/sero-cash/go-sero/seroclient\"\n)\n\nconst keyStr = `\n{\n\t\"address\": \"3bG34svmC3pwCazHtsV7t1p5ihvaSBu2pA27CsnrsdJY5yCkf1ZqAKGArV6gHpeDHieiXScL5FKdgJTgHBiwe1uU\",\n\t\"tk\": \"3bG34svmC3pwCazHtsV7t1p5ihvaSBu2pA27CsnrsdJY1ENvjxfeC4vGQfigJ54nX4od4BM5tsT48WbnDpFFGAJn\",\n\t\"crypto\": {\n\t\t\"cipher\": \"aes-128-ctr\",\n\t\t\"ciphertext\": \"3138a97b25721f0829106aa652d3ea76483078be253bacb30449c0e6f970a097\",\n\t\t\"cipherparams\": {\n\t\t\t\"iv\": \"b29008189567795220a84bf7d8dfaf01\"\n\t\t},\n\t\t\"kdf\": \"scrypt\",\n\t\t\"kdfparams\": {\n\t\t\t\"dklen\": 32,\n\t\t\t\"n\": 262144,\n\t\t\t\"p\": 1,\n\t\t\t\"r\": 8,\n\t\t\t\"salt\": \"1a238ac93b466659368dbd89cb5558fbc09a8fde256c7e3daef5b778857e456c\"\n\t\t},\n\t\t\"mac\": \"a23300101025fd7ed170f69a283655688e0d05e073177f252fb9326fc626127b\"\n\t},\n\t\"id\": \"e5b057ac-2119-4cf5-9584-047828207eb3\",\n\t\"version\": 1,\n\t\"at\": 0\n}\n`\n\nfunc TestDeploy(t *testing.T) {\n\tconn, err := seroclient.Dial(\"http://127.0.0.1:8545\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to connect to the Ethereum client: %v\", err)\n\t}\n\t//value := big.NewInt(0).Mul(big.NewInt(1000000000), big.NewInt(1000000000))\n\tauth, err := bind.NewTransactor(strings.NewReader(keyStr), \"123456\", nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create authorized transactor: %v\", err)\n\t}\n\t// Deploy a new awesome contract for the binding demo\n\n\tregisters := []common.Address{common.Base58ToAddress(\"iQe7iX45yGZeQnxjdxgo7SZJfyWpWPaKmQJyR5UuPM2Aq1BJDUuFvh5bLtquiwuzdWCxmYXMW1LbhHZC4vDBgAhuRxZGtQr7zoTjkHH6Z1vMzUQNGjBAXE5nkufjjAzfWBZ\")}\n\n\tregisterscode := \"registerscode\"\n\tdecimals := uint8(8)\n\tcount := uint16(16)\n\tnumber := uint32(32)\n\tblockN := uint64(64)\n\ttotalSupply := big.NewInt(1000000)\n\town := common.Base58ToAddress(\"wg5cNrx3qeh6xea8nNQqrWEu5etbCauo7Ek75XhmWQnmQAyesBjVMbDwWLZdeUYfXj4eB7YAPBmqAyUcBgYuCFBRdHjuE8PQsaEPp5MTXpE7zBt6wcsEyzuguGd4NMw3i7H\")\n\n\t_, tx, testAbi, err := abigen.DeployTestabi(auth, conn, registers, registerscode, decimals, count, number, blockN, totalSupply, own)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to deploy new token contract: %v\", err)\n\t}\n\tfmt.Printf(\"Transaction waiting to be mined: 0x%x\\n\\n\", tx.Hash())\n\tstartTime := time.Now()\n\tfmt.Printf(\"TX start @:%s\", time.Now())\n\tctx := context.Background()\n\taddressAfterMined, err := bind.WaitDeployed(ctx, conn, tx)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to deploy contact when mining :%v\", err)\n\t}\n\tfmt.Printf(\"tx mining take time:%s\\n\", time.Now().Sub(startTime))\n\tlog.Printf(\"mined address :%s\", addressAfterMined.String())\n\n\tname, err := testAbi.Own(&bind.CallOpts{Pending: true})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to retrieve pending name: %v\", err)\n\t}\n\tfmt.Println(\"Pending name:\", name)\n}\n\nfunc TestCall(t *testing.T) {\n\tconn, err := seroclient.Dial(\"http://127.0.0.1:8545\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to connect to the Ethereum client: %v\", err)\n\t}\n\tcontractAddress := common.Base58ToAddress(\"5RiKcXABU1GpCqpYU8xxEiCP4niwF1ue1DRyCstpTo4L5VTEVEbMfYNLTXitkXbqpSTYPfuMc1pwsbYoBji5dStr\")\n\ttestAbi, err := abigen.NewTestabi(contractAddress, conn)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to NewTestabi : %v\", err)\n\t}\n\te, err := testAbi.Number(&bind.CallOpts{})\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to retrieve pending name: %v\", err)\n\t}\n\tfmt.Println(e.A, e.B)\n}\n\nfunc TestExcute(t *testing.T) {\n\tconn, err := seroclient.Dial(\"http://127.0.0.1:8545\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to connect to the Ethereum client: %v\", err)\n\t}\n\t//value := big.NewInt(0).Mul(big.NewInt(1000000000), big.NewInt(1000000000))\n\tauth, err := bind.NewTransactor(strings.NewReader(keyStr), \"123456\", nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to create authorized transactor: %v\", err)\n\t}\n\t// Deploy a new awesome contract for the binding demo\n\n\tregisters := []common.Address{common.Base58ToAddress(\"2WmLwyPZ7e8E1pSrQavxXGtXbHyqQGuWAWnZdPGG5UQ7y1epSFJWNMdtmrfbYoHKviQ42AB872Ccp3EP3uzpWxCSxx9ZBn6a6E3fbGQEMT6xETV4xKEc8Nf5VMYRZYYXszHh\")}\n\n\tcontractAddress := common.Base58ToAddress(\"25rwV92apLVTVcTyjhAKx2izEmEvpVv5kwoDBi1anWC2HtChJNVg3o4uHTaMxAPmYTUTRM1kLvNDdZLiFXgCJVsg\")\n\ttestAbi, err := abigen.NewTestabi(contractAddress, conn)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to NewTestabi : %v\", err)\n\t}\n\te, err := testAbi.Registers(auth, registers)\n\tif err != nil {\n\t\tlog.Fatalf(\"Failed to retrieve pending name: %v\", err)\n\t}\n\tfmt.Println(e)\n}\n"
  },
  {
    "path": "tests/block_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"testing\"\n)\n\nfunc TestBlockchain(t *testing.T) {\n\tt.Parallel()\n\n\tbt := new(testMatcher)\n\t// General state tests are 'exported' as blockchain tests, but we can run them natively.\n\tbt.skipLoad(`^GeneralStateTests/`)\n\t// Skip random failures due to selfish mining test.\n\tbt.skipLoad(`^bcForgedTest/bcForkUncle\\.json`)\n\tbt.skipLoad(`^bcMultiChainTest/(ChainAtoChainB_blockorder|CallContractFromNotBestBlock)`)\n\tbt.skipLoad(`^bcTotalDifficultyTest/(lotsOfLeafs|lotsOfBranches|sideChainWithMoreTransactions)`)\n\t// Constantinople is not implemented yet.\n\tbt.skipLoad(`(?i)(constantinople)`)\n\n\t// Still failing tests\n\tbt.skipLoad(`^bcWalletTest.*_AutumnTwilight$`)\n\n\tbt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) {\n\t\tif err := bt.checkFailure(t, name, test.Run()); err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "tests/block_test_util.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package tests implements execution of Ethereum JSON tests.\npackage tests\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// A BlockTest checks handling of entire blocks.\ntype BlockTest struct {\n\tjson btJSON\n}\n\n// UnmarshalJSON implements json.Unmarshaler interface.\nfunc (t *BlockTest) UnmarshalJSON(in []byte) error {\n\treturn json.Unmarshal(in, &t.json)\n}\n\ntype btJSON struct {\n\tBlocks    []btBlock             `json:\"blocks\"`\n\tGenesis   btHeader              `json:\"genesisBlockHeader\"`\n\tPre       core.GenesisAlloc     `json:\"pre\"`\n\tPost      core.GenesisAlloc     `json:\"postState\"`\n\tBestBlock common.UnprefixedHash `json:\"lastblockhash\"`\n\tNetwork   string                `json:\"network\"`\n}\n\ntype btBlock struct {\n\tBlockHeader  *btHeader\n\tRlp          string\n\tUncleHeaders []*btHeader\n}\n\n//go:generate gencodec -type btHeader -field-override btHeaderMarshaling -out gen_btheader.go\n\ntype btHeader struct {\n\tBloom            types.Bloom\n\tCoinbase         common.Address\n\tMixHash          common.Hash\n\tNonce            types.BlockNonce\n\tNumber           *big.Int\n\tHash             common.Hash\n\tParentHash       common.Hash\n\tReceiptTrie      common.Hash\n\tStateRoot        common.Hash\n\tTransactionsTrie common.Hash\n\tUncleHash        common.Hash\n\tExtraData        []byte\n\tDifficulty       *big.Int\n\tGasLimit         uint64\n\tGasUsed          uint64\n\tTimestamp        *big.Int\n}\n\ntype btHeaderMarshaling struct {\n\tExtraData  hexutil.Bytes\n\tNumber     *math.HexOrDecimal256\n\tDifficulty *math.HexOrDecimal256\n\tGasLimit   math.HexOrDecimal64\n\tGasUsed    math.HexOrDecimal64\n\tTimestamp  *math.HexOrDecimal256\n}\n\nfunc (t *BlockTest) Run() error {\n\tconfig, ok := Forks[t.json.Network]\n\tif !ok {\n\t\treturn UnsupportedForkError{t.json.Network}\n\t}\n\n\t// import pre accounts & construct test genesis block & state root\n\tdb := serodb.NewMemDatabase()\n\tgblock, err := t.genesis(config).Commit(db)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif gblock.Hash() != t.json.Genesis.Hash {\n\t\treturn fmt.Errorf(\"genesis block hash doesn't match test: computed=%x, test=%x\", gblock.Hash().Bytes()[:6], t.json.Genesis.Hash[:6])\n\t}\n\tif gblock.Root() != t.json.Genesis.StateRoot {\n\t\treturn fmt.Errorf(\"genesis block state root does not match test: computed=%x, test=%x\", gblock.Root().Bytes()[:6], t.json.Genesis.StateRoot[:6])\n\t}\n\n\tchain, err := core.NewBlockChain(db, nil, config, ethash.NewShared(), vm.Config{}, nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer chain.Stop()\n\n\tvalidBlocks, err := t.insertBlocks(chain)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcmlast := chain.CurrentBlock().Hash()\n\tif common.Hash(t.json.BestBlock) != cmlast {\n\t\treturn fmt.Errorf(\"last block hash validation mismatch: want: %x, have: %x\", t.json.BestBlock, cmlast)\n\t}\n\tnewDB, err := chain.State()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = t.validatePostState(newDB); err != nil {\n\t\treturn fmt.Errorf(\"post state validation failed: %v\", err)\n\t}\n\treturn t.validateImportedHeaders(chain, validBlocks)\n}\n\nfunc (t *BlockTest) genesis(config *params.ChainConfig) *core.Genesis {\n\treturn &core.Genesis{\n\t\tConfig: config,\n\t\t//Nonce:      t.json.Genesis.Nonce.Uint64(),\n\t\tTimestamp:  t.json.Genesis.Timestamp.Uint64(),\n\t\tParentHash: t.json.Genesis.ParentHash,\n\t\tExtraData:  t.json.Genesis.ExtraData,\n\t\tGasLimit:   t.json.Genesis.GasLimit,\n\t\tGasUsed:    t.json.Genesis.GasUsed,\n\t\tDifficulty: t.json.Genesis.Difficulty,\n\t\tMixhash:    t.json.Genesis.MixHash,\n\t\tCoinbase:   t.json.Genesis.Coinbase,\n\t\tAlloc:      t.json.Pre,\n\t}\n}\n\n/* See https://github.com/ethereum/tests/wiki/Blockchain-Tests-II\n\n   Whether a block is valid or not is a bit subtle, it's defined by presence of\n   blockHeader, transactions. If they are missing, the block is\n   invalid and we must verify that we do not accept it.\n\n   Since some tests mix valid and invalid blocks we need to check this for every block.\n\n   If a block is invalid it does not necessarily fail the test, if it's invalidness is\n   expected we are expected to ignore it and continue processing and then validate the\n   post state.\n*/\nfunc (t *BlockTest) insertBlocks(blockchain *core.BlockChain) ([]btBlock, error) {\n\tvalidBlocks := make([]btBlock, 0)\n\t// insert the test blocks, which will execute all transactions\n\tfor _, b := range t.json.Blocks {\n\t\tcb, err := b.decode()\n\t\tif err != nil {\n\t\t\tif b.BlockHeader == nil {\n\t\t\t\tcontinue // OK - block is supposed to be invalid, continue with next block\n\t\t\t} else {\n\t\t\t\treturn nil, fmt.Errorf(\"Block RLP decoding failed when expected to succeed: %v\", err)\n\t\t\t}\n\t\t}\n\t\t// RLP decoding worked, try to insert into chain:\n\t\tblocks := types.Blocks{cb}\n\t\ti, err := blockchain.InsertChain(blocks)\n\t\tif err != nil {\n\t\t\tif b.BlockHeader == nil {\n\t\t\t\tcontinue // OK - block is supposed to be invalid, continue with next block\n\t\t\t} else {\n\t\t\t\treturn nil, fmt.Errorf(\"Block #%v insertion into chain failed: %v\", blocks[i].Number(), err)\n\t\t\t}\n\t\t}\n\t\tif b.BlockHeader == nil {\n\t\t\treturn nil, fmt.Errorf(\"Block insertion should have failed\")\n\t\t}\n\n\t\t// validate RLP decoding by checking all values against test file JSON\n\t\tif err = validateHeader(b.BlockHeader, cb.Header()); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Deserialised block header validation failed: %v\", err)\n\t\t}\n\t\tvalidBlocks = append(validBlocks, b)\n\t}\n\treturn validBlocks, nil\n}\n\nfunc validateHeader(h *btHeader, h2 *types.Header) error {\n\tif h.Bloom != h2.Bloom {\n\t\treturn fmt.Errorf(\"Bloom: want: %x have: %x\", h.Bloom, h2.Bloom)\n\t}\n\tif h.Coinbase != h2.Coinbase {\n\t\treturn fmt.Errorf(\"Coinbase: want: %x have: %x\", h.Coinbase, h2.Coinbase)\n\t}\n\tif h.MixHash != h2.MixDigest {\n\t\treturn fmt.Errorf(\"MixHash: want: %x have: %x\", h.MixHash, h2.MixDigest)\n\t}\n\tif h.Nonce != h2.Nonce {\n\t\treturn fmt.Errorf(\"Nonce: want: %x have: %x\", h.Nonce, h2.Nonce)\n\t}\n\tif h.Number.Cmp(h2.Number) != 0 {\n\t\treturn fmt.Errorf(\"Number: want: %v have: %v\", h.Number, h2.Number)\n\t}\n\tif h.ParentHash != h2.ParentHash {\n\t\treturn fmt.Errorf(\"Parent hash: want: %x have: %x\", h.ParentHash, h2.ParentHash)\n\t}\n\tif h.ReceiptTrie != h2.ReceiptHash {\n\t\treturn fmt.Errorf(\"Receipt hash: want: %x have: %x\", h.ReceiptTrie, h2.ReceiptHash)\n\t}\n\tif h.TransactionsTrie != h2.TxHash {\n\t\treturn fmt.Errorf(\"Tx hash: want: %x have: %x\", h.TransactionsTrie, h2.TxHash)\n\t}\n\tif h.StateRoot != h2.Root {\n\t\treturn fmt.Errorf(\"State hash: want: %x have: %x\", h.StateRoot, h2.Root)\n\t}\n\tif !bytes.Equal(h.ExtraData, h2.Extra) {\n\t\treturn fmt.Errorf(\"Extra data: want: %x have: %x\", h.ExtraData, h2.Extra)\n\t}\n\tif h.Difficulty.Cmp(h2.Difficulty) != 0 {\n\t\treturn fmt.Errorf(\"Difficulty: want: %v have: %v\", h.Difficulty, h2.Difficulty)\n\t}\n\tif h.GasLimit != h2.GasLimit {\n\t\treturn fmt.Errorf(\"GasLimit: want: %d have: %d\", h.GasLimit, h2.GasLimit)\n\t}\n\tif h.GasUsed != h2.GasUsed {\n\t\treturn fmt.Errorf(\"GasUsed: want: %d have: %d\", h.GasUsed, h2.GasUsed)\n\t}\n\tif h.Timestamp.Cmp(h2.Time) != 0 {\n\t\treturn fmt.Errorf(\"Timestamp: want: %v have: %v\", h.Timestamp, h2.Time)\n\t}\n\treturn nil\n}\n\nfunc (t *BlockTest) validatePostState(statedb *state.StateDB) error {\n\t// validate post state accounts in test file against what we have in state db\n\tfor addr, acct := range t.json.Post {\n\t\t// address is indirectly verified by the other fields, as it's the db key\n\t\tcode2 := statedb.GetCode(addr)\n\t\tbalance2 := statedb.GetBalance(addr, \"sero\")\n\t\t//nonce2 := statedb.GetNonce(addr)\n\t\tif !bytes.Equal(code2, acct.Code) {\n\t\t\treturn fmt.Errorf(\"account code mismatch for addr: %s want: %v have: %s\", addr, acct.Code, hex.EncodeToString(code2))\n\t\t}\n\t\tif balance2.Cmp(acct.Balance) != 0 {\n\t\t\treturn fmt.Errorf(\"account balance mismatch for addr: %s, want: %d, have: %d\", addr, acct.Balance, balance2)\n\t\t}\n\t\t//if nonce2 != acct.Nonce {\n\t\t//\treturn fmt.Errorf(\"account nonce mismatch for addr: %s want: %d have: %d\", addr, acct.Nonce, nonce2)\n\t\t//}\n\t}\n\treturn nil\n}\n\nfunc (t *BlockTest) validateImportedHeaders(cm *core.BlockChain, validBlocks []btBlock) error {\n\t// to get constant lookup when verifying block headers by hash (some tests have many blocks)\n\tbmap := make(map[common.Hash]btBlock, len(t.json.Blocks))\n\tfor _, b := range validBlocks {\n\t\tbmap[b.BlockHeader.Hash] = b\n\t}\n\t// iterate over blocks backwards from HEAD and validate imported\n\t// headers vs test file. some tests have reorgs, and we import\n\t// block-by-block, so we can only validate imported headers after\n\t// all blocks have been processed by BlockChain, as they may not\n\t// be part of the longest chain until last block is imported.\n\tfor b := cm.CurrentBlock(); b != nil && b.NumberU64() != 0; b = cm.GetBlockByHash(b.Header().ParentHash) {\n\t\tif err := validateHeader(bmap[b.Hash()].BlockHeader, b.Header()); err != nil {\n\t\t\treturn fmt.Errorf(\"Imported block header validation failed: %v\", err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (bb *btBlock) decode() (*types.Block, error) {\n\tdata, err := hexutil.Decode(bb.Rlp)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar b types.Block\n\terr = rlp.DecodeBytes(data, &b)\n\treturn &b, err\n}\n"
  },
  {
    "path": "tests/difficulty_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"testing\"\n\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nvar (\n\tmainnetChainConfig = params.ChainConfig{\n\t\tChainID:             big.NewInt(1),\n\t\tAutumnTwilightBlock: big.NewInt(4370000),\n\t}\n)\n\nfunc TestDifficulty(t *testing.T) {\n\tt.Parallel()\n\n\tdt := new(testMatcher)\n\t// Not difficulty-tests\n\tdt.skipLoad(\"hexencodetest.*\")\n\tdt.skipLoad(\"crypto.*\")\n\tdt.skipLoad(\"blockgenesistest\\\\.json\")\n\tdt.skipLoad(\"genesishashestest\\\\.json\")\n\tdt.skipLoad(\"keyaddrtest\\\\.json\")\n\tdt.skipLoad(\"txtest\\\\.json\")\n\n\t// files are 2 years old, contains strange values\n\tdt.skipLoad(\"difficultyCustomHomestead\\\\.json\")\n\tdt.skipLoad(\"difficultyMorden\\\\.json\")\n\tdt.skipLoad(\"difficultyOlimpic\\\\.json\")\n\n\tdt.config(\"Ropsten\", *params.AlphanetChainConfig)\n\tdt.config(\"Morden\", *params.AlphanetChainConfig)\n\tdt.config(\"Frontier\", params.ChainConfig{})\n\n\tdt.config(\"AutumnTwilight\", params.ChainConfig{\n\t\tAutumnTwilightBlock: big.NewInt(0),\n\t})\n\n\tdt.config(\"AutumnTwilight\", params.ChainConfig{\n\t\tAutumnTwilightBlock: big.NewInt(0),\n\t})\n\n\tdt.config(\"Frontier\", *params.AlphanetChainConfig)\n\tdt.config(\"MainNetwork\", mainnetChainConfig)\n\tdt.config(\"CustomMainNetwork\", mainnetChainConfig)\n\tdt.config(\"difficulty.json\", mainnetChainConfig)\n\n\tdt.walk(t, difficultyTestDir, func(t *testing.T, name string, test *DifficultyTest) {\n\t\tcfg := dt.findConfig(name)\n\t\tif test.ParentDifficulty.Cmp(params.MinimumDifficulty) < 0 {\n\t\t\tt.Skip(\"difficulty below minimum\")\n\t\t\treturn\n\t\t}\n\t\tif err := dt.checkFailure(t, name, test.Run(cfg)); err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "tests/difficulty_test_util.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n//go:generate gencodec -type DifficultyTest -field-override difficultyTestMarshaling -out gen_difficultytest.go\n\ntype DifficultyTest struct {\n\tParentTimestamp    *big.Int `json:\"parentTimestamp\"`\n\tParentDifficulty   *big.Int `json:\"parentDifficulty\"`\n\tCurrentTimestamp   *big.Int `json:\"currentTimestamp\"`\n\tCurrentBlockNumber uint64   `json:\"currentBlockNumber\"`\n\tCurrentDifficulty  *big.Int `json:\"currentDifficulty\"`\n}\n\ntype difficultyTestMarshaling struct {\n\tParentTimestamp    *math.HexOrDecimal256\n\tParentDifficulty   *math.HexOrDecimal256\n\tCurrentTimestamp   *math.HexOrDecimal256\n\tCurrentDifficulty  *math.HexOrDecimal256\n\tCurrentBlockNumber math.HexOrDecimal64\n}\n\nfunc (test *DifficultyTest) Run(config *params.ChainConfig) error {\n\tparentNumber := big.NewInt(int64(test.CurrentBlockNumber - 1))\n\tparent := &types.Header{\n\t\tDifficulty: test.ParentDifficulty,\n\t\tTime:       test.ParentTimestamp,\n\t\tNumber:     parentNumber,\n\t}\n\n\tactual := ethash.CalcDifficulty(config, test.CurrentTimestamp.Uint64(), parent)\n\texp := test.CurrentDifficulty\n\n\tif actual.Cmp(exp) != 0 {\n\t\treturn fmt.Errorf(\"parent[time %v diff %v] child[time %v number %v] diff %v != expected %v\",\n\t\t\ttest.ParentTimestamp, test.ParentDifficulty,\n\t\t\ttest.CurrentTimestamp, test.CurrentBlockNumber, actual, exp)\n\t}\n\treturn nil\n\n}\n"
  },
  {
    "path": "tests/gen_btheader.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\nvar _ = (*btHeaderMarshaling)(nil)\n\nfunc (b btHeader) MarshalJSON() ([]byte, error) {\n\ttype btHeader struct {\n\t\tBloom            types.Bloom\n\t\tCoinbase         common.Address\n\t\tMixHash          common.Hash\n\t\tNonce            types.BlockNonce\n\t\tNumber           *math.HexOrDecimal256\n\t\tHash             common.Hash\n\t\tParentHash       common.Hash\n\t\tReceiptTrie      common.Hash\n\t\tStateRoot        common.Hash\n\t\tTransactionsTrie common.Hash\n\t\tUncleHash        common.Hash\n\t\tExtraData        hexutil.Bytes\n\t\tDifficulty       *math.HexOrDecimal256\n\t\tGasLimit         math.HexOrDecimal64\n\t\tGasUsed          math.HexOrDecimal64\n\t\tTimestamp        *math.HexOrDecimal256\n\t}\n\tvar enc btHeader\n\tenc.Bloom = b.Bloom\n\tenc.Coinbase = b.Coinbase\n\tenc.MixHash = b.MixHash\n\tenc.Nonce = b.Nonce\n\tenc.Number = (*math.HexOrDecimal256)(b.Number)\n\tenc.Hash = b.Hash\n\tenc.ParentHash = b.ParentHash\n\tenc.ReceiptTrie = b.ReceiptTrie\n\tenc.StateRoot = b.StateRoot\n\tenc.TransactionsTrie = b.TransactionsTrie\n\tenc.UncleHash = b.UncleHash\n\tenc.ExtraData = b.ExtraData\n\tenc.Difficulty = (*math.HexOrDecimal256)(b.Difficulty)\n\tenc.GasLimit = math.HexOrDecimal64(b.GasLimit)\n\tenc.GasUsed = math.HexOrDecimal64(b.GasUsed)\n\tenc.Timestamp = (*math.HexOrDecimal256)(b.Timestamp)\n\treturn json.Marshal(&enc)\n}\n\nfunc (b *btHeader) UnmarshalJSON(input []byte) error {\n\ttype btHeader struct {\n\t\tBloom            *types.Bloom\n\t\tCoinbase         *common.Address\n\t\tMixHash          *common.Hash\n\t\tNonce            *types.BlockNonce\n\t\tNumber           *math.HexOrDecimal256\n\t\tHash             *common.Hash\n\t\tParentHash       *common.Hash\n\t\tReceiptTrie      *common.Hash\n\t\tStateRoot        *common.Hash\n\t\tTransactionsTrie *common.Hash\n\t\tUncleHash        *common.Hash\n\t\tExtraData        *hexutil.Bytes\n\t\tDifficulty       *math.HexOrDecimal256\n\t\tGasLimit         *math.HexOrDecimal64\n\t\tGasUsed          *math.HexOrDecimal64\n\t\tTimestamp        *math.HexOrDecimal256\n\t}\n\tvar dec btHeader\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Bloom != nil {\n\t\tb.Bloom = *dec.Bloom\n\t}\n\tif dec.Coinbase != nil {\n\t\tb.Coinbase = *dec.Coinbase\n\t}\n\tif dec.MixHash != nil {\n\t\tb.MixHash = *dec.MixHash\n\t}\n\tif dec.Nonce != nil {\n\t\tb.Nonce = *dec.Nonce\n\t}\n\tif dec.Number != nil {\n\t\tb.Number = (*big.Int)(dec.Number)\n\t}\n\tif dec.Hash != nil {\n\t\tb.Hash = *dec.Hash\n\t}\n\tif dec.ParentHash != nil {\n\t\tb.ParentHash = *dec.ParentHash\n\t}\n\tif dec.ReceiptTrie != nil {\n\t\tb.ReceiptTrie = *dec.ReceiptTrie\n\t}\n\tif dec.StateRoot != nil {\n\t\tb.StateRoot = *dec.StateRoot\n\t}\n\tif dec.TransactionsTrie != nil {\n\t\tb.TransactionsTrie = *dec.TransactionsTrie\n\t}\n\tif dec.UncleHash != nil {\n\t\tb.UncleHash = *dec.UncleHash\n\t}\n\tif dec.ExtraData != nil {\n\t\tb.ExtraData = *dec.ExtraData\n\t}\n\tif dec.Difficulty != nil {\n\t\tb.Difficulty = (*big.Int)(dec.Difficulty)\n\t}\n\tif dec.GasLimit != nil {\n\t\tb.GasLimit = uint64(*dec.GasLimit)\n\t}\n\tif dec.GasUsed != nil {\n\t\tb.GasUsed = uint64(*dec.GasUsed)\n\t}\n\tif dec.Timestamp != nil {\n\t\tb.Timestamp = (*big.Int)(dec.Timestamp)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tests/gen_difficultytest.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar _ = (*difficultyTestMarshaling)(nil)\n\nfunc (d DifficultyTest) MarshalJSON() ([]byte, error) {\n\ttype DifficultyTest struct {\n\t\tParentTimestamp    *math.HexOrDecimal256 `json:\"parentTimestamp\"`\n\t\tParentDifficulty   *math.HexOrDecimal256 `json:\"parentDifficulty\"`\n\t\tCurrentTimestamp   *math.HexOrDecimal256 `json:\"currentTimestamp\"`\n\t\tCurrentBlockNumber math.HexOrDecimal64   `json:\"currentBlockNumber\"`\n\t\tCurrentDifficulty  *math.HexOrDecimal256 `json:\"currentDifficulty\"`\n\t}\n\tvar enc DifficultyTest\n\tenc.ParentTimestamp = (*math.HexOrDecimal256)(d.ParentTimestamp)\n\tenc.ParentDifficulty = (*math.HexOrDecimal256)(d.ParentDifficulty)\n\tenc.CurrentTimestamp = (*math.HexOrDecimal256)(d.CurrentTimestamp)\n\tenc.CurrentBlockNumber = math.HexOrDecimal64(d.CurrentBlockNumber)\n\tenc.CurrentDifficulty = (*math.HexOrDecimal256)(d.CurrentDifficulty)\n\treturn json.Marshal(&enc)\n}\n\nfunc (d *DifficultyTest) UnmarshalJSON(input []byte) error {\n\ttype DifficultyTest struct {\n\t\tParentTimestamp    *math.HexOrDecimal256 `json:\"parentTimestamp\"`\n\t\tParentDifficulty   *math.HexOrDecimal256 `json:\"parentDifficulty\"`\n\t\tCurrentTimestamp   *math.HexOrDecimal256 `json:\"currentTimestamp\"`\n\t\tCurrentBlockNumber *math.HexOrDecimal64  `json:\"currentBlockNumber\"`\n\t\tCurrentDifficulty  *math.HexOrDecimal256 `json:\"currentDifficulty\"`\n\t}\n\tvar dec DifficultyTest\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.ParentTimestamp != nil {\n\t\td.ParentTimestamp = (*big.Int)(dec.ParentTimestamp)\n\t}\n\tif dec.ParentDifficulty != nil {\n\t\td.ParentDifficulty = (*big.Int)(dec.ParentDifficulty)\n\t}\n\tif dec.CurrentTimestamp != nil {\n\t\td.CurrentTimestamp = (*big.Int)(dec.CurrentTimestamp)\n\t}\n\tif dec.CurrentBlockNumber != nil {\n\t\td.CurrentBlockNumber = uint64(*dec.CurrentBlockNumber)\n\t}\n\tif dec.CurrentDifficulty != nil {\n\t\td.CurrentDifficulty = (*big.Int)(dec.CurrentDifficulty)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tests/gen_stenv.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar _ = (*stEnvMarshaling)(nil)\n\nfunc (s stEnv) MarshalJSON() ([]byte, error) {\n\ttype stEnv struct {\n\t\tCoinbase   common.UnprefixedAddress `json:\"currentCoinbase\"   gencodec:\"required\"`\n\t\tDifficulty *math.HexOrDecimal256    `json:\"currentDifficulty\" gencodec:\"required\"`\n\t\tGasLimit   math.HexOrDecimal64      `json:\"currentGasLimit\"   gencodec:\"required\"`\n\t\tNumber     math.HexOrDecimal64      `json:\"currentNumber\"     gencodec:\"required\"`\n\t\tTimestamp  math.HexOrDecimal64      `json:\"currentTimestamp\"  gencodec:\"required\"`\n\t}\n\tvar enc stEnv\n\tenc.Coinbase = common.UnprefixedAddress(s.Coinbase)\n\tenc.Difficulty = (*math.HexOrDecimal256)(s.Difficulty)\n\tenc.GasLimit = math.HexOrDecimal64(s.GasLimit)\n\tenc.Number = math.HexOrDecimal64(s.Number)\n\tenc.Timestamp = math.HexOrDecimal64(s.Timestamp)\n\treturn json.Marshal(&enc)\n}\n\nfunc (s *stEnv) UnmarshalJSON(input []byte) error {\n\ttype stEnv struct {\n\t\tCoinbase   *common.UnprefixedAddress `json:\"currentCoinbase\"   gencodec:\"required\"`\n\t\tDifficulty *math.HexOrDecimal256     `json:\"currentDifficulty\" gencodec:\"required\"`\n\t\tGasLimit   *math.HexOrDecimal64      `json:\"currentGasLimit\"   gencodec:\"required\"`\n\t\tNumber     *math.HexOrDecimal64      `json:\"currentNumber\"     gencodec:\"required\"`\n\t\tTimestamp  *math.HexOrDecimal64      `json:\"currentTimestamp\"  gencodec:\"required\"`\n\t}\n\tvar dec stEnv\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Coinbase == nil {\n\t\treturn errors.New(\"missing required field 'currentCoinbase' for stEnv\")\n\t}\n\ts.Coinbase = common.Address(*dec.Coinbase)\n\tif dec.Difficulty == nil {\n\t\treturn errors.New(\"missing required field 'currentDifficulty' for stEnv\")\n\t}\n\ts.Difficulty = (*big.Int)(dec.Difficulty)\n\tif dec.GasLimit == nil {\n\t\treturn errors.New(\"missing required field 'currentGasLimit' for stEnv\")\n\t}\n\ts.GasLimit = uint64(*dec.GasLimit)\n\tif dec.Number == nil {\n\t\treturn errors.New(\"missing required field 'currentNumber' for stEnv\")\n\t}\n\ts.Number = uint64(*dec.Number)\n\tif dec.Timestamp == nil {\n\t\treturn errors.New(\"missing required field 'currentTimestamp' for stEnv\")\n\t}\n\ts.Timestamp = uint64(*dec.Timestamp)\n\treturn nil\n}\n"
  },
  {
    "path": "tests/gen_sttransaction.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar _ = (*stTransactionMarshaling)(nil)\n\nfunc (s stTransaction) MarshalJSON() ([]byte, error) {\n\ttype stTransaction struct {\n\t\tGasPrice   *math.HexOrDecimal256 `json:\"gasPrice\"`\n\t\tNonce      math.HexOrDecimal64   `json:\"nonce\"`\n\t\tTo         string                `json:\"to\"`\n\t\tData       []string              `json:\"data\"`\n\t\tGasLimit   []math.HexOrDecimal64 `json:\"gasLimit\"`\n\t\tValue      []string              `json:\"value\"`\n\t\tPrivateKey hexutil.Bytes         `json:\"secretKey\"`\n\t}\n\tvar enc stTransaction\n\tenc.GasPrice = (*math.HexOrDecimal256)(s.GasPrice)\n\tenc.Nonce = math.HexOrDecimal64(s.Nonce)\n\tenc.To = s.To\n\tenc.Data = s.Data\n\tif s.GasLimit != nil {\n\t\tenc.GasLimit = make([]math.HexOrDecimal64, len(s.GasLimit))\n\t\tfor k, v := range s.GasLimit {\n\t\t\tenc.GasLimit[k] = math.HexOrDecimal64(v)\n\t\t}\n\t}\n\tenc.Value = s.Value\n\tenc.PrivateKey = s.PrivateKey\n\treturn json.Marshal(&enc)\n}\n\nfunc (s *stTransaction) UnmarshalJSON(input []byte) error {\n\ttype stTransaction struct {\n\t\tGasPrice   *math.HexOrDecimal256 `json:\"gasPrice\"`\n\t\tNonce      *math.HexOrDecimal64  `json:\"nonce\"`\n\t\tTo         *string               `json:\"to\"`\n\t\tData       []string              `json:\"data\"`\n\t\tGasLimit   []math.HexOrDecimal64 `json:\"gasLimit\"`\n\t\tValue      []string              `json:\"value\"`\n\t\tPrivateKey *hexutil.Bytes        `json:\"secretKey\"`\n\t}\n\tvar dec stTransaction\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.GasPrice != nil {\n\t\ts.GasPrice = (*big.Int)(dec.GasPrice)\n\t}\n\tif dec.Nonce != nil {\n\t\ts.Nonce = uint64(*dec.Nonce)\n\t}\n\tif dec.To != nil {\n\t\ts.To = *dec.To\n\t}\n\tif dec.Data != nil {\n\t\ts.Data = dec.Data\n\t}\n\tif dec.GasLimit != nil {\n\t\ts.GasLimit = make([]uint64, len(dec.GasLimit))\n\t\tfor k, v := range dec.GasLimit {\n\t\t\ts.GasLimit[k] = uint64(v)\n\t\t}\n\t}\n\tif dec.Value != nil {\n\t\ts.Value = dec.Value\n\t}\n\tif dec.PrivateKey != nil {\n\t\ts.PrivateKey = *dec.PrivateKey\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "tests/gen_tttransaction.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar _ = (*ttTransactionMarshaling)(nil)\n\nfunc (t ttTransaction) MarshalJSON() ([]byte, error) {\n\ttype ttTransaction struct {\n\t\tData     hexutil.Bytes         `gencodec:\"required\"`\n\t\tGasLimit math.HexOrDecimal64   `gencodec:\"required\"`\n\t\tGasPrice *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tNonce    math.HexOrDecimal64   `gencodec:\"required\"`\n\t\tValue    *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tR        *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tS        *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tV        *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tTo       common.Address        `gencodec:\"required\"`\n\t}\n\tvar enc ttTransaction\n\tenc.Data = t.Data\n\tenc.GasLimit = math.HexOrDecimal64(t.GasLimit)\n\tenc.GasPrice = (*math.HexOrDecimal256)(t.GasPrice)\n\tenc.Nonce = math.HexOrDecimal64(t.Nonce)\n\tenc.Value = (*math.HexOrDecimal256)(t.Value)\n\tenc.R = (*math.HexOrDecimal256)(t.R)\n\tenc.S = (*math.HexOrDecimal256)(t.S)\n\tenc.V = (*math.HexOrDecimal256)(t.V)\n\tenc.To = t.To\n\treturn json.Marshal(&enc)\n}\n\nfunc (t *ttTransaction) UnmarshalJSON(input []byte) error {\n\ttype ttTransaction struct {\n\t\tData     *hexutil.Bytes        `gencodec:\"required\"`\n\t\tGasLimit *math.HexOrDecimal64  `gencodec:\"required\"`\n\t\tGasPrice *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tNonce    *math.HexOrDecimal64  `gencodec:\"required\"`\n\t\tValue    *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tR        *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tS        *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tV        *math.HexOrDecimal256 `gencodec:\"required\"`\n\t\tTo       *common.Address       `gencodec:\"required\"`\n\t}\n\tvar dec ttTransaction\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Data == nil {\n\t\treturn errors.New(\"missing required field 'data' for ttTransaction\")\n\t}\n\tt.Data = *dec.Data\n\tif dec.GasLimit == nil {\n\t\treturn errors.New(\"missing required field 'gasLimit' for ttTransaction\")\n\t}\n\tt.GasLimit = uint64(*dec.GasLimit)\n\tif dec.GasPrice == nil {\n\t\treturn errors.New(\"missing required field 'gasPrice' for ttTransaction\")\n\t}\n\tt.GasPrice = (*big.Int)(dec.GasPrice)\n\tif dec.Nonce == nil {\n\t\treturn errors.New(\"missing required field 'nonce' for ttTransaction\")\n\t}\n\tt.Nonce = uint64(*dec.Nonce)\n\tif dec.Value == nil {\n\t\treturn errors.New(\"missing required field 'value' for ttTransaction\")\n\t}\n\tt.Value = (*big.Int)(dec.Value)\n\tif dec.R == nil {\n\t\treturn errors.New(\"missing required field 'r' for ttTransaction\")\n\t}\n\tt.R = (*big.Int)(dec.R)\n\tif dec.S == nil {\n\t\treturn errors.New(\"missing required field 's' for ttTransaction\")\n\t}\n\tt.S = (*big.Int)(dec.S)\n\tif dec.V == nil {\n\t\treturn errors.New(\"missing required field 'v' for ttTransaction\")\n\t}\n\tt.V = (*big.Int)(dec.V)\n\tif dec.To == nil {\n\t\treturn errors.New(\"missing required field 'to' for ttTransaction\")\n\t}\n\tt.To = *dec.To\n\treturn nil\n}\n"
  },
  {
    "path": "tests/gen_vmexec.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n)\n\nvar _ = (*vmExecMarshaling)(nil)\n\nfunc (v vmExec) MarshalJSON() ([]byte, error) {\n\ttype vmExec struct {\n\t\tAddress  common.UnprefixedAddress `json:\"address\"  gencodec:\"required\"`\n\t\tCaller   common.UnprefixedAddress `json:\"caller\"   gencodec:\"required\"`\n\t\tOrigin   common.UnprefixedAddress `json:\"origin\"   gencodec:\"required\"`\n\t\tCode     hexutil.Bytes            `json:\"code\"     gencodec:\"required\"`\n\t\tData     hexutil.Bytes            `json:\"data\"     gencodec:\"required\"`\n\t\tValue    *math.HexOrDecimal256    `json:\"value\"    gencodec:\"required\"`\n\t\tGasLimit math.HexOrDecimal64      `json:\"gas\"      gencodec:\"required\"`\n\t\tGasPrice *math.HexOrDecimal256    `json:\"gasPrice\" gencodec:\"required\"`\n\t}\n\tvar enc vmExec\n\tenc.Address = common.UnprefixedAddress(v.Address)\n\tenc.Caller = common.UnprefixedAddress(v.Caller)\n\tenc.Origin = common.UnprefixedAddress(v.Origin)\n\tenc.Code = v.Code\n\tenc.Data = v.Data\n\tenc.Value = (*math.HexOrDecimal256)(v.Value)\n\tenc.GasLimit = math.HexOrDecimal64(v.GasLimit)\n\tenc.GasPrice = (*math.HexOrDecimal256)(v.GasPrice)\n\treturn json.Marshal(&enc)\n}\n\nfunc (v *vmExec) UnmarshalJSON(input []byte) error {\n\ttype vmExec struct {\n\t\tAddress  *common.UnprefixedAddress `json:\"address\"  gencodec:\"required\"`\n\t\tCaller   *common.UnprefixedAddress `json:\"caller\"   gencodec:\"required\"`\n\t\tOrigin   *common.UnprefixedAddress `json:\"origin\"   gencodec:\"required\"`\n\t\tCode     *hexutil.Bytes            `json:\"code\"     gencodec:\"required\"`\n\t\tData     *hexutil.Bytes            `json:\"data\"     gencodec:\"required\"`\n\t\tValue    *math.HexOrDecimal256     `json:\"value\"    gencodec:\"required\"`\n\t\tGasLimit *math.HexOrDecimal64      `json:\"gas\"      gencodec:\"required\"`\n\t\tGasPrice *math.HexOrDecimal256     `json:\"gasPrice\" gencodec:\"required\"`\n\t}\n\tvar dec vmExec\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Address == nil {\n\t\treturn errors.New(\"missing required field 'address' for vmExec\")\n\t}\n\tv.Address = common.Address(*dec.Address)\n\tif dec.Caller == nil {\n\t\treturn errors.New(\"missing required field 'caller' for vmExec\")\n\t}\n\tv.Caller = common.Address(*dec.Caller)\n\tif dec.Origin == nil {\n\t\treturn errors.New(\"missing required field 'origin' for vmExec\")\n\t}\n\tv.Origin = common.Address(*dec.Origin)\n\tif dec.Code == nil {\n\t\treturn errors.New(\"missing required field 'code' for vmExec\")\n\t}\n\tv.Code = *dec.Code\n\tif dec.Data == nil {\n\t\treturn errors.New(\"missing required field 'data' for vmExec\")\n\t}\n\tv.Data = *dec.Data\n\tif dec.Value == nil {\n\t\treturn errors.New(\"missing required field 'value' for vmExec\")\n\t}\n\tv.Value = (*big.Int)(dec.Value)\n\tif dec.GasLimit == nil {\n\t\treturn errors.New(\"missing required field 'gas' for vmExec\")\n\t}\n\tv.GasLimit = uint64(*dec.GasLimit)\n\tif dec.GasPrice == nil {\n\t\treturn errors.New(\"missing required field 'gasPrice' for vmExec\")\n\t}\n\tv.GasPrice = (*big.Int)(dec.GasPrice)\n\treturn nil\n}\n"
  },
  {
    "path": "tests/init.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\n// Forks table defines supported forks and their chain config.\nvar Forks = map[string]*params.ChainConfig{\n\t\"AutumnTwilight\": {\n\t\tChainID:             big.NewInt(1),\n\t\tAutumnTwilightBlock: big.NewInt(0),\n\t},\n}\n\n// UnsupportedForkError is returned when a test requests a fork that isn't implemented.\ntype UnsupportedForkError struct {\n\tName string\n}\n\nfunc (e UnsupportedForkError) Error() string {\n\treturn fmt.Sprintf(\"unsupported fork %q\", e.Name)\n}\n"
  },
  {
    "path": "tests/init_test.go",
    "content": "// Copyright 2017 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nvar (\n\tbaseDir           = filepath.Join(\".\", \"testdata\")\n\tblockTestDir      = filepath.Join(baseDir, \"BlockchainTests\")\n\tstateTestDir      = filepath.Join(baseDir, \"GeneralStateTests\")\n\tvmTestDir         = filepath.Join(baseDir, \"VMTests\")\n\trlpTestDir        = filepath.Join(baseDir, \"RLPTests\")\n\tdifficultyTestDir = filepath.Join(baseDir, \"BasicTests\")\n)\n\nfunc readJSON(reader io.Reader, value interface{}) error {\n\tdata, err := ioutil.ReadAll(reader)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error reading JSON file: %v\", err)\n\t}\n\tif err = json.Unmarshal(data, &value); err != nil {\n\t\tif syntaxerr, ok := err.(*json.SyntaxError); ok {\n\t\t\tline := findLine(data, syntaxerr.Offset)\n\t\t\treturn fmt.Errorf(\"JSON syntax error at line %v: %v\", line, err)\n\t\t}\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc readJSONFile(fn string, value interface{}) error {\n\tfile, err := os.Open(fn)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer file.Close()\n\n\terr = readJSON(file, value)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"%s in file %s\", err.Error(), fn)\n\t}\n\treturn nil\n}\n\n// findLine returns the line number for the given offset into data.\nfunc findLine(data []byte, offset int64) (line int) {\n\tline = 1\n\tfor i, r := range string(data) {\n\t\tif int64(i) >= offset {\n\t\t\treturn\n\t\t}\n\t\tif r == '\\n' {\n\t\t\tline++\n\t\t}\n\t}\n\treturn\n}\n\n// testMatcher controls skipping and chain config assignment to tests.\ntype testMatcher struct {\n\tconfigpat    []testConfig\n\tfailpat      []testFailure\n\tskiploadpat  []*regexp.Regexp\n\tskipshortpat []*regexp.Regexp\n}\n\ntype testConfig struct {\n\tp      *regexp.Regexp\n\tconfig params.ChainConfig\n}\n\ntype testFailure struct {\n\tp      *regexp.Regexp\n\treason string\n}\n\n// skipShortMode skips tests matching when the -short flag is used.\nfunc (tm *testMatcher) skipShortMode(pattern string) {\n\ttm.skipshortpat = append(tm.skipshortpat, regexp.MustCompile(pattern))\n}\n\n// skipLoad skips JSON loading of tests matching the pattern.\nfunc (tm *testMatcher) skipLoad(pattern string) {\n\ttm.skiploadpat = append(tm.skiploadpat, regexp.MustCompile(pattern))\n}\n\n// fails adds an expected failure for tests matching the pattern.\nfunc (tm *testMatcher) fails(pattern string, reason string) {\n\tif reason == \"\" {\n\t\tpanic(\"empty fail reason\")\n\t}\n\ttm.failpat = append(tm.failpat, testFailure{regexp.MustCompile(pattern), reason})\n}\n\n// config defines chain config for tests matching the pattern.\nfunc (tm *testMatcher) config(pattern string, cfg params.ChainConfig) {\n\ttm.configpat = append(tm.configpat, testConfig{regexp.MustCompile(pattern), cfg})\n}\n\n// findSkip matches name against test skip patterns.\nfunc (tm *testMatcher) findSkip(name string) (reason string, skipload bool) {\n\tif testing.Short() {\n\t\tfor _, re := range tm.skipshortpat {\n\t\t\tif re.MatchString(name) {\n\t\t\t\treturn \"skipped in -short mode\", false\n\t\t\t}\n\t\t}\n\t}\n\tfor _, re := range tm.skiploadpat {\n\t\tif re.MatchString(name) {\n\t\t\treturn \"skipped by skipLoad\", true\n\t\t}\n\t}\n\treturn \"\", false\n}\n\n// findConfig returns the chain config matching defined patterns.\nfunc (tm *testMatcher) findConfig(name string) *params.ChainConfig {\n\t// TODO(fjl): name can be derived from testing.T when min Go version is 1.8\n\tfor _, m := range tm.configpat {\n\t\tif m.p.MatchString(name) {\n\t\t\treturn &m.config\n\t\t}\n\t}\n\treturn new(params.ChainConfig)\n}\n\n// checkFailure checks whether a failure is expected.\nfunc (tm *testMatcher) checkFailure(t *testing.T, name string, err error) error {\n\t// TODO(fjl): name can be derived from t when min Go version is 1.8\n\tfailReason := \"\"\n\tfor _, m := range tm.failpat {\n\t\tif m.p.MatchString(name) {\n\t\t\tfailReason = m.reason\n\t\t\tbreak\n\t\t}\n\t}\n\tif failReason != \"\" {\n\t\tt.Logf(\"expected failure: %s\", failReason)\n\t\tif err != nil {\n\t\t\tt.Logf(\"error: %v\", err)\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"test succeeded unexpectedly\")\n\t}\n\treturn err\n}\n\n// walk invokes its runTest argument for all subtests in the given directory.\n//\n// runTest should be a function of type func(t *testing.T, name string, x <TestType>),\n// where TestType is the type of the test contained in test files.\nfunc (tm *testMatcher) walk(t *testing.T, dir string, runTest interface{}) {\n\t// Walk the directory.\n\tdirinfo, err := os.Stat(dir)\n\tif os.IsNotExist(err) || !dirinfo.IsDir() {\n\t\tfmt.Fprintf(os.Stderr, \"can't find test files in %s, did you clone the tests submodule?\\n\", dir)\n\t\tt.Skip(\"missing test files\")\n\t}\n\terr = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {\n\t\tname := filepath.ToSlash(strings.TrimPrefix(path, dir+string(filepath.Separator)))\n\t\tif info.IsDir() {\n\t\t\tif _, skipload := tm.findSkip(name + \"/\"); skipload {\n\t\t\t\treturn filepath.SkipDir\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\tif filepath.Ext(path) == \".json\" {\n\t\t\tt.Run(name, func(t *testing.T) { tm.runTestFile(t, path, name, runTest) })\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n}\n\nfunc (tm *testMatcher) runTestFile(t *testing.T, path, name string, runTest interface{}) {\n\tif r, _ := tm.findSkip(name); r != \"\" {\n\t\tt.Skip(r)\n\t}\n\tt.Parallel()\n\n\t// Load the file as map[string]<testType>.\n\tm := makeMapFromTestFunc(runTest)\n\tif err := readJSONFile(path, m.Addr().Interface()); err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\t// Run all tests from the map. Don't wrap in a subtest if there is only one test in the file.\n\tkeys := sortedMapKeys(m)\n\tif len(keys) == 1 {\n\t\trunTestFunc(runTest, t, name, m, keys[0])\n\t} else {\n\t\tfor _, key := range keys {\n\t\t\tname := name + \"/\" + key\n\t\t\tt.Run(key, func(t *testing.T) {\n\t\t\t\tif r, _ := tm.findSkip(name); r != \"\" {\n\t\t\t\t\tt.Skip(r)\n\t\t\t\t}\n\t\t\t\trunTestFunc(runTest, t, name, m, key)\n\t\t\t})\n\t\t}\n\t}\n}\n\nfunc makeMapFromTestFunc(f interface{}) reflect.Value {\n\tstringT := reflect.TypeOf(\"\")\n\ttestingT := reflect.TypeOf((*testing.T)(nil))\n\tftyp := reflect.TypeOf(f)\n\tif ftyp.Kind() != reflect.Func || ftyp.NumIn() != 3 || ftyp.NumOut() != 0 || ftyp.In(0) != testingT || ftyp.In(1) != stringT {\n\t\tpanic(fmt.Sprintf(\"bad test function type: want func(*testing.T, string, <TestType>), have %s\", ftyp))\n\t}\n\ttestType := ftyp.In(2)\n\tmp := reflect.New(reflect.MapOf(stringT, testType))\n\treturn mp.Elem()\n}\n\nfunc sortedMapKeys(m reflect.Value) []string {\n\tkeys := make([]string, m.Len())\n\tfor i, k := range m.MapKeys() {\n\t\tkeys[i] = k.String()\n\t}\n\tsort.Strings(keys)\n\treturn keys\n}\n\nfunc runTestFunc(runTest interface{}, t *testing.T, name string, m reflect.Value, key string) {\n\treflect.ValueOf(runTest).Call([]reflect.Value{\n\t\treflect.ValueOf(t),\n\t\treflect.ValueOf(name),\n\t\tm.MapIndex(reflect.ValueOf(key)),\n\t})\n}\n"
  },
  {
    "path": "tests/rlp_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"testing\"\n)\n\nfunc TestRLP(t *testing.T) {\n\tt.Parallel()\n\ttm := new(testMatcher)\n\ttm.walk(t, rlpTestDir, func(t *testing.T, name string, test *RLPTest) {\n\t\tif err := tm.checkFailure(t, name, test.Run()); err != nil {\n\t\t\tt.Error(err)\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "tests/rlp_test_util.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// RLPTest is the JSON structure of a single RLP test.\ntype RLPTest struct {\n\t// If the value of In is \"INVALID\" or \"VALID\", the test\n\t// checks whether Out can be decoded into a value of\n\t// type interface{}.\n\t//\n\t// For other JSON values, In is treated as a driver for\n\t// calls to rlp.Stream. The test also verifies that encoding\n\t// In produces the bytes in Out.\n\tIn interface{}\n\n\t// Out is a hex-encoded RLP value.\n\tOut string\n}\n\n// Run executes the test.\nfunc (t *RLPTest) Run() error {\n\toutb, err := hex.DecodeString(t.Out)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"invalid hex in Out\")\n\t}\n\n\t// Handle simple decoding tests with no actual In value.\n\tif t.In == \"VALID\" || t.In == \"INVALID\" {\n\t\treturn checkDecodeInterface(outb, t.In == \"VALID\")\n\t}\n\n\t// Check whether encoding the value produces the same bytes.\n\tin := translateJSON(t.In)\n\tb, err := rlp.EncodeToBytes(in)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"encode failed: %v\", err)\n\t}\n\tif !bytes.Equal(b, outb) {\n\t\treturn fmt.Errorf(\"encode produced %x, want %x\", b, outb)\n\t}\n\t// Test stream decoding.\n\ts := rlp.NewStream(bytes.NewReader(outb), 0)\n\treturn checkDecodeFromJSON(s, in)\n}\n\nfunc checkDecodeInterface(b []byte, isValid bool) error {\n\terr := rlp.DecodeBytes(b, new(interface{}))\n\tswitch {\n\tcase isValid && err != nil:\n\t\treturn fmt.Errorf(\"decoding failed: %v\", err)\n\tcase !isValid && err == nil:\n\t\treturn fmt.Errorf(\"decoding of invalid value succeeded\")\n\t}\n\treturn nil\n}\n\n// translateJSON makes test json values encodable with RLP.\nfunc translateJSON(v interface{}) interface{} {\n\tswitch v := v.(type) {\n\tcase float64:\n\t\treturn uint64(v)\n\tcase string:\n\t\tif len(v) > 0 && v[0] == '#' { // # starts a faux big int.\n\t\t\tbig, ok := new(big.Int).SetString(v[1:], 10)\n\t\t\tif !ok {\n\t\t\t\tpanic(fmt.Errorf(\"bad test: bad big int: %q\", v))\n\t\t\t}\n\t\t\treturn big\n\t\t}\n\t\treturn []byte(v)\n\tcase []interface{}:\n\t\tnew := make([]interface{}, len(v))\n\t\tfor i := range v {\n\t\t\tnew[i] = translateJSON(v[i])\n\t\t}\n\t\treturn new\n\tdefault:\n\t\tpanic(fmt.Errorf(\"can't handle %T\", v))\n\t}\n}\n\n// checkDecodeFromJSON decodes from s guided by exp. exp drives the\n// Stream by invoking decoding operations (Uint, Big, List, ...) based\n// on the type of each value. The value decoded from the RLP stream\n// must match the JSON value.\nfunc checkDecodeFromJSON(s *rlp.Stream, exp interface{}) error {\n\tswitch exp := exp.(type) {\n\tcase uint64:\n\t\ti, err := s.Uint()\n\t\tif err != nil {\n\t\t\treturn addStack(\"Uint\", exp, err)\n\t\t}\n\t\tif i != exp {\n\t\t\treturn addStack(\"Uint\", exp, fmt.Errorf(\"result mismatch: got %d\", i))\n\t\t}\n\tcase *big.Int:\n\t\tbig := new(big.Int)\n\t\tif err := s.Decode(&big); err != nil {\n\t\t\treturn addStack(\"Big\", exp, err)\n\t\t}\n\t\tif big.Cmp(exp) != 0 {\n\t\t\treturn addStack(\"Big\", exp, fmt.Errorf(\"result mismatch: got %d\", big))\n\t\t}\n\tcase []byte:\n\t\tb, err := s.Bytes()\n\t\tif err != nil {\n\t\t\treturn addStack(\"Bytes\", exp, err)\n\t\t}\n\t\tif !bytes.Equal(b, exp) {\n\t\t\treturn addStack(\"Bytes\", exp, fmt.Errorf(\"result mismatch: got %x\", b))\n\t\t}\n\tcase []interface{}:\n\t\tif _, err := s.List(); err != nil {\n\t\t\treturn addStack(\"List\", exp, err)\n\t\t}\n\t\tfor i, v := range exp {\n\t\t\tif err := checkDecodeFromJSON(s, v); err != nil {\n\t\t\t\treturn addStack(fmt.Sprintf(\"[%d]\", i), exp, err)\n\t\t\t}\n\t\t}\n\t\tif err := s.ListEnd(); err != nil {\n\t\t\treturn addStack(\"ListEnd\", exp, err)\n\t\t}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unhandled type: %T\", exp))\n\t}\n\treturn nil\n}\n\nfunc addStack(op string, val interface{}, err error) error {\n\tlines := strings.Split(err.Error(), \"\\n\")\n\tlines = append(lines, fmt.Sprintf(\"\\t%s: %v\", op, val))\n\treturn errors.New(strings.Join(lines, \"\\n\"))\n}\n"
  },
  {
    "path": "tests/state_test.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/core/vm\"\n)\n\nfunc TestState(t *testing.T) {\n\tt.Parallel()\n\n\tst := new(testMatcher)\n\t// Long tests:\n\tst.skipShortMode(`^stQuadraticComplexityTest/`)\n\t// Broken tests:\n\tst.skipLoad(`^stTransactionTest/OverflowGasRequire\\.json`) // gasLimit > 256 bits\n\tst.skipLoad(`^stTransactionTest/zeroSigTransa[^/]*\\.json`) // EIP-86 is not supported yet\n\t// Expected failures:\n\tst.fails(`^stRevertTest/RevertPrecompiledTouch\\.json/AutumnTwilight`, \"bug in test\")\n\n\tst.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) {\n\t\tfor _, subtest := range test.Subtests() {\n\t\t\tsubtest := subtest\n\t\t\tkey := fmt.Sprintf(\"%s/%d\", subtest.Fork, subtest.Index)\n\t\t\tname := name + \"/\" + key\n\t\t\tt.Run(key, func(t *testing.T) {\n\t\t\t\tif subtest.Fork == \"Constantinople\" {\n\t\t\t\t\tt.Skip(\"constantinople not supported yet\")\n\t\t\t\t}\n\t\t\t\twithTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error {\n\t\t\t\t\t//_, err := test.Run(subtest, vmconfig)\n\t\t\t\t\treturn st.checkFailure(t, name, nil)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t})\n}\n\n// Transactions with gasLimit above this value will not get a VM trace on failure.\nconst traceErrorLimit = 400000\n\nfunc withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) {\n\terr := test(vm.Config{})\n\tif err == nil {\n\t\treturn\n\t}\n\tt.Error(err)\n\tif gasLimit > traceErrorLimit {\n\t\tt.Log(\"gas limit too high for EVM trace\")\n\t\treturn\n\t}\n\ttracer := vm.NewStructLogger(nil)\n\terr2 := test(vm.Config{Debug: true, Tracer: tracer})\n\tif !reflect.DeepEqual(err, err2) {\n\t\tt.Errorf(\"different error for second run: %v\", err2)\n\t}\n\tbuf := new(bytes.Buffer)\n\tvm.WriteTrace(buf, tracer.StructLogs())\n\tif buf.Len() == 0 {\n\t\tt.Log(\"no EVM operation logs generated\")\n\t} else {\n\t\tt.Log(\"EVM operation log:\\n\" + buf.String())\n\t}\n\tt.Logf(\"EVM output: 0x%x\", tracer.Output())\n\tt.Logf(\"EVM error: %v\", tracer.Error())\n}\n"
  },
  {
    "path": "tests/state_test_util.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"encoding/json\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// StateTest checks transaction processing without block context.\n// See https://github.com/ethereum/EIPs/issues/176 for the test format specification.\ntype StateTest struct {\n\tjson stJSON\n}\n\n// StateSubtest selects a specific configuration of a General State Test.\ntype StateSubtest struct {\n\tFork  string\n\tIndex int\n}\n\nfunc (t *StateTest) UnmarshalJSON(in []byte) error {\n\treturn json.Unmarshal(in, &t.json)\n}\n\ntype stJSON struct {\n\tEnv  stEnv                    `json:\"env\"`\n\tPre  core.GenesisAlloc        `json:\"pre\"`\n\tTx   stTransaction            `json:\"transaction\"`\n\tOut  hexutil.Bytes            `json:\"out\"`\n\tPost map[string][]stPostState `json:\"post\"`\n}\n\ntype stPostState struct {\n\tRoot    common.UnprefixedHash `json:\"hash\"`\n\tLogs    common.UnprefixedHash `json:\"logs\"`\n\tIndexes struct {\n\t\tData  int `json:\"data\"`\n\t\tGas   int `json:\"gas\"`\n\t\tValue int `json:\"value\"`\n\t}\n}\n\n//go:generate gencodec -type stEnv -field-override stEnvMarshaling -out gen_stenv.go\n\ntype stEnv struct {\n\tCoinbase   common.Address `json:\"currentCoinbase\"   gencodec:\"required\"`\n\tDifficulty *big.Int       `json:\"currentDifficulty\" gencodec:\"required\"`\n\tGasLimit   uint64         `json:\"currentGasLimit\"   gencodec:\"required\"`\n\tNumber     uint64         `json:\"currentNumber\"     gencodec:\"required\"`\n\tTimestamp  uint64         `json:\"currentTimestamp\"  gencodec:\"required\"`\n}\n\ntype stEnvMarshaling struct {\n\tCoinbase   common.UnprefixedAddress\n\tDifficulty *math.HexOrDecimal256\n\tGasLimit   math.HexOrDecimal64\n\tNumber     math.HexOrDecimal64\n\tTimestamp  math.HexOrDecimal64\n}\n\n//go:generate gencodec -type stTransaction -field-override stTransactionMarshaling -out gen_sttransaction.go\n\ntype stTransaction struct {\n\tGasPrice   *big.Int `json:\"gasPrice\"`\n\tNonce      uint64   `json:\"nonce\"`\n\tTo         string   `json:\"to\"`\n\tData       []string `json:\"data\"`\n\tGasLimit   []uint64 `json:\"gasLimit\"`\n\tValue      []string `json:\"value\"`\n\tPrivateKey []byte   `json:\"secretKey\"`\n}\n\ntype stTransactionMarshaling struct {\n\tGasPrice   *math.HexOrDecimal256\n\tNonce      math.HexOrDecimal64\n\tGasLimit   []math.HexOrDecimal64\n\tPrivateKey hexutil.Bytes\n}\n\n// Subtests returns all valid subtests of the test.\nfunc (t *StateTest) Subtests() []StateSubtest {\n\tvar sub []StateSubtest\n\tfor fork, pss := range t.json.Post {\n\t\tfor i := range pss {\n\t\t\tsub = append(sub, StateSubtest{fork, i})\n\t\t}\n\t}\n\treturn sub\n}\n\nfunc (t *StateTest) gasLimit(subtest StateSubtest) uint64 {\n\treturn t.json.Tx.GasLimit[t.json.Post[subtest.Fork][subtest.Index].Indexes.Gas]\n}\n\nfunc MakePreState(db serodb.Database, accounts core.GenesisAlloc) *state.StateDB {\n\tsdb := state.NewDatabase(db)\n\tstatedb, _ := state.New(sdb, nil)\n\tfor addr, a := range accounts {\n\t\tstatedb.SetCode(addr, a.Code)\n\t\t//statedb.SetNonce(addr, a.Nonce)\n\t\tstatedb.SetBalance(addr, \"sero\", a.Balance)\n\t\tfor k, v := range a.Storage {\n\t\t\tstatedb.SetState(addr, k, v)\n\t\t}\n\t}\n\t// Commit and re-open to start with a clean state.\n\troot, _ := statedb.Commit(false)\n\tstatedb, _ = state.New(sdb, &types.Header{Root: root})\n\treturn statedb\n}\n\nfunc (t *StateTest) genesis(config *params.ChainConfig) *core.Genesis {\n\treturn &core.Genesis{\n\t\tConfig:     config,\n\t\tCoinbase:   t.json.Env.Coinbase,\n\t\tDifficulty: t.json.Env.Difficulty,\n\t\tGasLimit:   t.json.Env.GasLimit,\n\t\tNumber:     t.json.Env.Number,\n\t\tTimestamp:  t.json.Env.Timestamp,\n\t\tAlloc:      t.json.Pre,\n\t}\n}\nfunc rlpHash(x interface{}) (h common.Hash) {\n\thw := sha3.NewKeccak256()\n\trlp.Encode(hw, x)\n\thw.Sum(h[:0])\n\treturn h\n}\n"
  },
  {
    "path": "tests/transaction_test_util.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// TransactionTest checks RLP decoding and sender derivation of transactions.\ntype TransactionTest struct {\n\tjson ttJSON\n}\n\ntype ttJSON struct {\n\tBlockNumber math.HexOrDecimal64 `json:\"blockNumber\"`\n\tRLP         hexutil.Bytes       `json:\"rlp\"`\n\tSender      hexutil.Bytes       `json:\"sender\"`\n\tTransaction *ttTransaction      `json:\"transaction\"`\n}\n\n//go:generate gencodec -type ttTransaction -field-override ttTransactionMarshaling -out gen_tttransaction.go\n\ntype ttTransaction struct {\n\tData     []byte         `gencodec:\"required\"`\n\tGasLimit uint64         `gencodec:\"required\"`\n\tGasPrice *big.Int       `gencodec:\"required\"`\n\tNonce    uint64         `gencodec:\"required\"`\n\tValue    *big.Int       `gencodec:\"required\"`\n\tR        *big.Int       `gencodec:\"required\"`\n\tS        *big.Int       `gencodec:\"required\"`\n\tV        *big.Int       `gencodec:\"required\"`\n\tTo       common.Address `gencodec:\"required\"`\n}\n\ntype ttTransactionMarshaling struct {\n\tData     hexutil.Bytes\n\tGasLimit math.HexOrDecimal64\n\tGasPrice *math.HexOrDecimal256\n\tNonce    math.HexOrDecimal64\n\tValue    *math.HexOrDecimal256\n\tR        *math.HexOrDecimal256\n\tS        *math.HexOrDecimal256\n\tV        *math.HexOrDecimal256\n}\n\nfunc (tt *TransactionTest) Run(config *params.ChainConfig) error {\n\ttx := new(types.Transaction)\n\tif err := rlp.DecodeBytes(tt.json.RLP, tx); err != nil {\n\t\tif tt.json.Transaction == nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn fmt.Errorf(\"RLP decoding failed: %v\", err)\n\t}\n\t// Check sender derivation.\n\t//abi := types.MakeSigner(config, new(big.Int).SetUint64(uint64(tt.json.BlockNumber)))\n\t//sender, err := types.Sender(abi, tx)\n\t//if err != nil {\n\t//\treturn err\n\t//}\n\t//if sender != common.BytesToAddress(tt.json.Sender) {\n\t//\treturn fmt.Errorf(\"Sender mismatch: got %x, want %x\", sender, tt.json.Sender)\n\t//}\n\t// Check decoded fields.\n\terr := tt.json.Transaction.verify(tx)\n\tif tt.json.Sender == nil && err == nil {\n\t\treturn errors.New(\"field validations succeeded but should fail\")\n\t}\n\tif tt.json.Sender != nil && err != nil {\n\t\treturn fmt.Errorf(\"field validations failed after RLP decoding: %s\", err)\n\t}\n\treturn nil\n}\n\nfunc (tt *ttTransaction) verify(tx *types.Transaction) error {\n\tif !bytes.Equal(tx.Data(), tt.Data) {\n\t\treturn fmt.Errorf(\"Tx input data mismatch: got %x want %x\", tx.Data(), tt.Data)\n\t}\n\tif tx.Gas() != tt.GasLimit {\n\t\treturn fmt.Errorf(\"GasLimit mismatch: got %d, want %d\", tx.Gas(), tt.GasLimit)\n\t}\n\tif tx.GasPrice().Cmp(tt.GasPrice) != 0 {\n\t\treturn fmt.Errorf(\"GasPrice mismatch: got %v, want %v\", tx.GasPrice(), tt.GasPrice)\n\t}\n\n\tif tx.To() == nil {\n\t\tif tt.To != (common.Address{}) {\n\t\t\treturn fmt.Errorf(\"To mismatch when recipient is nil (contract creation): %x\", tt.To)\n\t\t}\n\t} else if *tx.To() != tt.To {\n\t\treturn fmt.Errorf(\"To mismatch: got %x, want %x\", *tx.To(), tt.To)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "tests/vm_test.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/core/vm\"\n)\n\nfunc TestVM(t *testing.T) {\n\tt.Parallel()\n\tvmt := new(testMatcher)\n\tvmt.fails(\"^vmSystemOperationsTest.json/createNameRegistrator$\", \"fails without parallel execution\")\n\n\tvmt.skipLoad(`^vmInputLimits(Light)?.json`) // log format broken\n\n\tvmt.skipShortMode(\"^vmPerformanceTest.json\")\n\tvmt.skipShortMode(\"^vmInputLimits(Light)?.json\")\n\n\tvmt.walk(t, vmTestDir, func(t *testing.T, name string, test *VMTest) {\n\t\twithTrace(t, test.json.Exec.GasLimit, func(vmconfig vm.Config) error {\n\t\t\treturn vmt.checkFailure(t, name, test.Run(vmconfig))\n\t\t})\n\t})\n}\n"
  },
  {
    "path": "tests/vm_test_util.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tests\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/vm\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/params\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// VMTest checks EVM execution without block or transaction context.\n// See https://github.com/ethereum/tests/wiki/VM-Tests for the test format specification.\ntype VMTest struct {\n\tjson vmJSON\n}\n\nfunc (t *VMTest) UnmarshalJSON(data []byte) error {\n\treturn json.Unmarshal(data, &t.json)\n}\n\ntype vmJSON struct {\n\tEnv           stEnv                 `json:\"env\"`\n\tExec          vmExec                `json:\"exec\"`\n\tLogs          common.UnprefixedHash `json:\"logs\"`\n\tGasRemaining  *math.HexOrDecimal64  `json:\"gas\"`\n\tOut           hexutil.Bytes         `json:\"out\"`\n\tPre           core.GenesisAlloc     `json:\"pre\"`\n\tPost          core.GenesisAlloc     `json:\"post\"`\n\tPostStateRoot common.Hash           `json:\"postStateRoot\"`\n}\n\n//go:generate gencodec -type vmExec -field-override vmExecMarshaling -out gen_vmexec.go\n\ntype vmExec struct {\n\tAddress  common.Address `json:\"address\"  gencodec:\"required\"`\n\tCaller   common.Address `json:\"caller\"   gencodec:\"required\"`\n\tOrigin   common.Address `json:\"origin\"   gencodec:\"required\"`\n\tCode     []byte         `json:\"code\"     gencodec:\"required\"`\n\tData     []byte         `json:\"data\"     gencodec:\"required\"`\n\tValue    *big.Int       `json:\"value\"    gencodec:\"required\"`\n\tGasLimit uint64         `json:\"gas\"      gencodec:\"required\"`\n\tGasPrice *big.Int       `json:\"gasPrice\" gencodec:\"required\"`\n}\n\ntype vmExecMarshaling struct {\n\tAddress  common.UnprefixedAddress\n\tCaller   common.UnprefixedAddress\n\tOrigin   common.UnprefixedAddress\n\tCode     hexutil.Bytes\n\tData     hexutil.Bytes\n\tValue    *math.HexOrDecimal256\n\tGasLimit math.HexOrDecimal64\n\tGasPrice *math.HexOrDecimal256\n}\n\nfunc (t *VMTest) Run(vmconfig vm.Config) error {\n\tstatedb := MakePreState(serodb.NewMemDatabase(), t.json.Pre)\n\tret, gasRemaining, err := t.exec(statedb, vmconfig)\n\n\tif t.json.GasRemaining == nil {\n\t\tif err == nil {\n\t\t\treturn fmt.Errorf(\"gas unspecified (indicating an error), but VM returned no error\")\n\t\t}\n\t\tif gasRemaining > 0 {\n\t\t\treturn fmt.Errorf(\"gas unspecified (indicating an error), but VM returned gas remaining > 0\")\n\t\t}\n\t\treturn nil\n\t}\n\t// Test declares gas, expecting outputs to match.\n\tif !bytes.Equal(ret, t.json.Out) {\n\t\treturn fmt.Errorf(\"return data mismatch: got %x, want %x\", ret, t.json.Out)\n\t}\n\tif gasRemaining != uint64(*t.json.GasRemaining) {\n\t\treturn fmt.Errorf(\"remaining gas %v, want %v\", gasRemaining, *t.json.GasRemaining)\n\t}\n\tfor addr, account := range t.json.Post {\n\t\tfor k, wantV := range account.Storage {\n\t\t\tif haveV := statedb.GetState(addr, k); haveV != wantV {\n\t\t\t\treturn fmt.Errorf(\"wrong storage value at %x:\\n  got  %x\\n  want %x\", k, haveV, wantV)\n\t\t\t}\n\t\t}\n\t}\n\t// if root := statedb.IntermediateRoot(false); root != t.json.PostStateRoot {\n\t// \treturn fmt.Errorf(\"post state root mismatch, got %x, want %x\", root, t.json.PostStateRoot)\n\t// }\n\tif logs := rlpHash(statedb.Logs()); logs != common.Hash(t.json.Logs) {\n\t\treturn fmt.Errorf(\"post state logs hash mismatch: got %x, want %x\", logs, t.json.Logs)\n\t}\n\treturn nil\n}\n\nfunc (t *VMTest) exec(statedb *state.StateDB, vmconfig vm.Config) ([]byte, uint64, error) {\n\tevm := t.newEVM(statedb, vmconfig)\n\te := t.json.Exec\n\tasset := assets.Asset{Tkn: &assets.Token{\n\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"sero\"), 32)).HashToUint256(),\n\t\tValue:    utils.U256(*e.Value),\n\t},\n\t}\n\ta, b, c, _ := evm.Call(vm.AccountRef(e.Caller), e.Address, e.Data, e.GasLimit, &asset)\n\treturn a, b, c\n}\n\nfunc (t *VMTest) newEVM(statedb *state.StateDB, vmconfig vm.Config) *vm.EVM {\n\t//initialCall := true\n\t//canTransfer := func(db vm.StateDB, address common.Data, amount *big.Int) bool {\n\t//\tif initialCall {\n\t//\t\tinitialCall = false\n\t//\t\treturn true\n\t//\t}\n\t//\treturn core.CanTransfer(db, address, amount)\n\t//}\n\ttransfer := func(db vm.StateDB, sender, recipient common.Address, pkg *assets.Asset, txHash common.Hash) (alarm bool) {\n\t\treturn false\n\t}\n\tcontext := vm.Context{\n\t\t//CanTransfer: canTransfer,\n\t\tTransfer:    transfer,\n\t\tGetHash:     vmTestBlockHash,\n\t\tOrigin:      t.json.Exec.Origin,\n\t\tCoinbase:    t.json.Env.Coinbase,\n\t\tBlockNumber: new(big.Int).SetUint64(t.json.Env.Number),\n\t\tTime:        new(big.Int).SetUint64(t.json.Env.Timestamp),\n\t\tGasLimit:    t.json.Env.GasLimit,\n\t\tDifficulty:  t.json.Env.Difficulty,\n\t\tGasPrice:    t.json.Exec.GasPrice,\n\t}\n\tvmconfig.NoRecursion = true\n\treturn vm.NewEVM(context, statedb, params.BetanetChainConfig, vmconfig)\n}\n\nfunc vmTestBlockHash(n uint64) common.Hash {\n\treturn common.BytesToHash(crypto.Keccak256([]byte(big.NewInt(int64(n)).String())))\n}\n"
  },
  {
    "path": "trie/database.go",
    "content": "// Copyright 2018 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nvar (\n\tmemcacheFlushTimeTimer  = metrics.NewRegisteredResettingTimer(\"trie/memcache/flush/time\", nil)\n\tmemcacheFlushNodesMeter = metrics.NewRegisteredMeter(\"trie/memcache/flush/nodes\", nil)\n\tmemcacheFlushSizeMeter  = metrics.NewRegisteredMeter(\"trie/memcache/flush/size\", nil)\n\n\tmemcacheGCTimeTimer  = metrics.NewRegisteredResettingTimer(\"trie/memcache/gc/time\", nil)\n\tmemcacheGCNodesMeter = metrics.NewRegisteredMeter(\"trie/memcache/gc/nodes\", nil)\n\tmemcacheGCSizeMeter  = metrics.NewRegisteredMeter(\"trie/memcache/gc/size\", nil)\n\n\tmemcacheCommitTimeTimer  = metrics.NewRegisteredResettingTimer(\"trie/memcache/commit/time\", nil)\n\tmemcacheCommitNodesMeter = metrics.NewRegisteredMeter(\"trie/memcache/commit/nodes\", nil)\n\tmemcacheCommitSizeMeter  = metrics.NewRegisteredMeter(\"trie/memcache/commit/size\", nil)\n)\n\n// secureKeyPrefix is the database key prefix used to store trie node preimages.\nvar secureKeyPrefix = []byte(\"secure-key-\")\n\n// secureKeyLength is the length of the above prefix + 32byte hash.\nconst secureKeyLength = 11 + 32\n\n// DatabaseReader wraps the Get and Has method of a backing store for the trie.\ntype DatabaseReader interface {\n\t// Get retrieves the value associated with key form the database.\n\tGet(key []byte) (value []byte, err error)\n\n\t// Has retrieves whether a key is present in the database.\n\tHas(key []byte) (bool, error)\n}\n\n// Database is an intermediate write layer between the trie data structures and\n// the disk database. The aim is to accumulate trie writes in-memory and only\n// periodically flush a couple tries to disk, garbage collecting the remainder.\ntype Database struct {\n\tdiskdb serodb.Database // Persistent storage for matured trie nodes\n\n\tnodes  map[common.Hash]*cachedNode // Data and references relationships of a node\n\toldest common.Hash                 // Oldest tracked node, flush-list head\n\tnewest common.Hash                 // Newest tracked node, flush-list tail\n\n\tpreimages map[common.Hash][]byte // Preimages of nodes from the secure trie\n\tseckeybuf [secureKeyLength]byte  // Ephemeral buffer for calculating preimage keys\n\n\tgctime  time.Duration      // Time spent on garbage collection since last commit\n\tgcnodes uint64             // Nodes garbage collected since last commit\n\tgcsize  common.StorageSize // Data storage garbage collected since last commit\n\n\tflushtime  time.Duration      // Time spent on data flushing since last commit\n\tflushnodes uint64             // Nodes flushed since last commit\n\tflushsize  common.StorageSize // Data storage flushed since last commit\n\n\tnodesSize     common.StorageSize // Storage size of the nodes cache (exc. flushlist)\n\tpreimagesSize common.StorageSize // Storage size of the preimages cache\n\n\tlock sync.RWMutex\n}\n\n// rawNode is a simple binary blob used to differentiate between collapsed trie\n// nodes and already encoded RLP binary blobs (while at the same time store them\n// in the same cache fields).\ntype rawNode []byte\n\nfunc (n rawNode) canUnload(uint16, uint16) bool { panic(\"this should never end up in a live trie\") }\nfunc (n rawNode) cache() (hashNode, bool)       { panic(\"this should never end up in a live trie\") }\nfunc (n rawNode) fstring(ind string) string     { panic(\"this should never end up in a live trie\") }\n\n// rawFullNode represents only the useful data content of a full node, with the\n// caches and flags stripped out to minimize its data storage. This type honors\n// the same RLP encoding as the original parent.\ntype rawFullNode [17]node\n\nfunc (n rawFullNode) canUnload(uint16, uint16) bool { panic(\"this should never end up in a live trie\") }\nfunc (n rawFullNode) cache() (hashNode, bool)       { panic(\"this should never end up in a live trie\") }\nfunc (n rawFullNode) fstring(ind string) string     { panic(\"this should never end up in a live trie\") }\n\nfunc (n rawFullNode) EncodeRLP(w io.Writer) error {\n\tvar nodes [17]node\n\n\tfor i, child := range n {\n\t\tif child != nil {\n\t\t\tnodes[i] = child\n\t\t} else {\n\t\t\tnodes[i] = nilValueNode\n\t\t}\n\t}\n\treturn rlp.Encode(w, nodes)\n}\n\n// rawShortNode represents only the useful data content of a short node, with the\n// caches and flags stripped out to minimize its data storage. This type honors\n// the same RLP encoding as the original parent.\ntype rawShortNode struct {\n\tKey []byte\n\tVal node\n}\n\nfunc (n rawShortNode) canUnload(uint16, uint16) bool { panic(\"this should never end up in a live trie\") }\nfunc (n rawShortNode) cache() (hashNode, bool)       { panic(\"this should never end up in a live trie\") }\nfunc (n rawShortNode) fstring(ind string) string     { panic(\"this should never end up in a live trie\") }\n\n// cachedNode is all the information we know about a single cached node in the\n// memory database write layer.\ntype cachedNode struct {\n\tnode node   // Cached collapsed trie node, or raw rlp data\n\tsize uint16 // Byte size of the useful cached data\n\n\tparents  uint16                 // Number of live nodes referencing this one\n\tchildren map[common.Hash]uint16 // External children referenced by this node\n\n\tflushPrev common.Hash // Previous node in the flush-list\n\tflushNext common.Hash // Next node in the flush-list\n}\n\n// rlp returns the raw rlp encoded blob of the cached node, either directly from\n// the cache, or by regenerating it from the collapsed node.\nfunc (n *cachedNode) rlp() []byte {\n\tif node, ok := n.node.(rawNode); ok {\n\t\treturn node\n\t}\n\tblob, err := rlp.EncodeToBytes(n.node)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn blob\n}\n\n// obj returns the decoded and expanded trie node, either directly from the cache,\n// or by regenerating it from the rlp encoded blob.\nfunc (n *cachedNode) obj(hash common.Hash, cachegen uint16) node {\n\tif node, ok := n.node.(rawNode); ok {\n\t\treturn mustDecodeNode(hash[:], node, cachegen)\n\t}\n\treturn expandNode(hash[:], n.node, cachegen)\n}\n\n// childs returns all the tracked children of this node, both the implicit ones\n// from inside the node as well as the explicit ones from outside the node.\nfunc (n *cachedNode) childs() []common.Hash {\n\tchildren := make([]common.Hash, 0, 16)\n\tfor child := range n.children {\n\t\tchildren = append(children, child)\n\t}\n\tif _, ok := n.node.(rawNode); !ok {\n\t\tgatherChildren(n.node, &children)\n\t}\n\treturn children\n}\n\n// gatherChildren traverses the node hierarchy of a collapsed storage node and\n// retrieves all the hashnode children.\nfunc gatherChildren(n node, children *[]common.Hash) {\n\tswitch n := n.(type) {\n\tcase *rawShortNode:\n\t\tgatherChildren(n.Val, children)\n\n\tcase rawFullNode:\n\t\tfor i := 0; i < 16; i++ {\n\t\t\tgatherChildren(n[i], children)\n\t\t}\n\tcase hashNode:\n\t\t*children = append(*children, common.BytesToHash(n))\n\n\tcase valueNode, nil:\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown node type: %T\", n))\n\t}\n}\n\n// simplifyNode traverses the hierarchy of an expanded memory node and discards\n// all the internal caches, returning a node that only contains the raw data.\nfunc simplifyNode(n node) node {\n\tswitch n := n.(type) {\n\tcase *shortNode:\n\t\t// Short nodes discard the flags and cascade\n\t\treturn &rawShortNode{Key: n.Key, Val: simplifyNode(n.Val)}\n\n\tcase *fullNode:\n\t\t// Full nodes discard the flags and cascade\n\t\tnode := rawFullNode(n.Children)\n\t\tfor i := 0; i < len(node); i++ {\n\t\t\tif node[i] != nil {\n\t\t\t\tnode[i] = simplifyNode(node[i])\n\t\t\t}\n\t\t}\n\t\treturn node\n\n\tcase valueNode, hashNode, rawNode:\n\t\treturn n\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown node type: %T\", n))\n\t}\n}\n\n// expandNode traverses the node hierarchy of a collapsed storage node and converts\n// all fields and keys into expanded memory form.\nfunc expandNode(hash hashNode, n node, cachegen uint16) node {\n\tswitch n := n.(type) {\n\tcase *rawShortNode:\n\t\t// Short nodes need key and child expansion\n\t\treturn &shortNode{\n\t\t\tKey: compactToHex(n.Key),\n\t\t\tVal: expandNode(nil, n.Val, cachegen),\n\t\t\tflags: nodeFlag{\n\t\t\t\thash: hash,\n\t\t\t\tgen:  cachegen,\n\t\t\t},\n\t\t}\n\n\tcase rawFullNode:\n\t\t// Full nodes need child expansion\n\t\tnode := &fullNode{\n\t\t\tflags: nodeFlag{\n\t\t\t\thash: hash,\n\t\t\t\tgen:  cachegen,\n\t\t\t},\n\t\t}\n\t\tfor i := 0; i < len(node.Children); i++ {\n\t\t\tif n[i] != nil {\n\t\t\t\tnode.Children[i] = expandNode(nil, n[i], cachegen)\n\t\t\t}\n\t\t}\n\t\treturn node\n\n\tcase valueNode, hashNode:\n\t\treturn n\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown node type: %T\", n))\n\t}\n}\n\n// NewDatabase creates a new trie database to store ephemeral trie content before\n// its written out to disk or garbage collected.\nfunc NewDatabase(diskdb serodb.Database) *Database {\n\treturn &Database{\n\t\tdiskdb:    diskdb,\n\t\tnodes:     map[common.Hash]*cachedNode{{}: {}},\n\t\tpreimages: make(map[common.Hash][]byte),\n\t}\n}\n\n// DiskDB retrieves the persistent storage backing the trie database.\nfunc (db *Database) DiskDB() DatabaseReader {\n\treturn db.diskdb\n}\n\ntype DatabaseWriter interface {\n\tPut(key []byte, value []byte) error\n}\n\nfunc (db *Database) WDiskDB() DatabaseWriter {\n\treturn db.diskdb\n}\n\n// InsertBlob writes a new reference tracked blob to the memory database if it's\n// yet unknown. This method should only be used for non-trie nodes that require\n// reference counting, since trie nodes are garbage collected directly through\n// their embedded children.\nfunc (db *Database) InsertBlob(hash common.Hash, blob []byte) {\n\tdb.lock.Lock()\n\tdefer db.lock.Unlock()\n\n\tdb.insert(hash, blob, rawNode(blob))\n}\n\n// insert inserts a collapsed trie node into the memory database. This method is\n// a more generic version of InsertBlob, supporting both raw blob insertions as\n// well ex trie node insertions. The blob must always be specified to allow proper\n// size tracking.\nfunc (db *Database) insert(hash common.Hash, blob []byte, node node) {\n\t// If the node's already cached, skip\n\tif _, ok := db.nodes[hash]; ok {\n\t\treturn\n\t}\n\t// Create the cached entry for this node\n\tentry := &cachedNode{\n\t\tnode:      simplifyNode(node),\n\t\tsize:      uint16(len(blob)),\n\t\tflushPrev: db.newest,\n\t}\n\tfor _, child := range entry.childs() {\n\t\tif c := db.nodes[child]; c != nil {\n\t\t\tc.parents++\n\t\t}\n\t}\n\tdb.nodes[hash] = entry\n\n\t// Update the flush-list endpoints\n\tif db.oldest == (common.Hash{}) {\n\t\tdb.oldest, db.newest = hash, hash\n\t} else {\n\t\tdb.nodes[db.newest].flushNext, db.newest = hash, hash\n\t}\n\tdb.nodesSize += common.StorageSize(common.HashLength + entry.size)\n}\n\n// insertPreimage writes a new trie node pre-image to the memory database if it's\n// yet unknown. The method will make a copy of the slice.\n//\n// Note, this method assumes that the database's lock is held!\nfunc (db *Database) insertPreimage(hash common.Hash, preimage []byte) {\n\tif _, ok := db.preimages[hash]; ok {\n\t\treturn\n\t}\n\tdb.preimages[hash] = common.CopyBytes(preimage)\n\tdb.preimagesSize += common.StorageSize(common.HashLength + len(preimage))\n}\n\n// node retrieves a cached trie node from memory, or returns nil if none can be\n// found in the memory cache.\nfunc (db *Database) node(hash common.Hash, cachegen uint16) node {\n\t// Retrieve the node from cache if available\n\tdb.lock.RLock()\n\tnode := db.nodes[hash]\n\tdb.lock.RUnlock()\n\n\tif node != nil {\n\t\treturn node.obj(hash, cachegen)\n\t}\n\t// Content unavailable in memory, attempt to retrieve from disk\n\tenc, err := db.diskdb.Get(hash[:])\n\tif err != nil || enc == nil {\n\t\treturn nil\n\t}\n\treturn mustDecodeNode(hash[:], enc, cachegen)\n}\n\n// Node retrieves an encoded cached trie node from memory. If it cannot be found\n// cached, the method queries the persistent database for the content.\nfunc (db *Database) Node(hash common.Hash) ([]byte, error) {\n\t// Retrieve the node from cache if available\n\tdb.lock.RLock()\n\tnode := db.nodes[hash]\n\tdb.lock.RUnlock()\n\n\tif node != nil {\n\t\treturn node.rlp(), nil\n\t}\n\t// Content unavailable in memory, attempt to retrieve from disk\n\treturn db.diskdb.Get(hash[:])\n}\n\n// preimage retrieves a cached trie node pre-image from memory. If it cannot be\n// found cached, the method queries the persistent database for the content.\nfunc (db *Database) preimage(hash common.Hash) ([]byte, error) {\n\t// Retrieve the node from cache if available\n\tdb.lock.RLock()\n\tpreimage := db.preimages[hash]\n\tdb.lock.RUnlock()\n\n\tif preimage != nil {\n\t\treturn preimage, nil\n\t}\n\t// Content unavailable in memory, attempt to retrieve from disk\n\treturn db.diskdb.Get(db.secureKey(hash[:]))\n}\n\n// secureKey returns the database key for the preimage of key, as an ephemeral\n// buffer. The caller must not hold onto the return value because it will become\n// invalid on the next call.\nfunc (db *Database) secureKey(key []byte) []byte {\n\tbuf := append(db.seckeybuf[:0], secureKeyPrefix...)\n\tbuf = append(buf, key...)\n\treturn buf\n}\n\n// Nodes retrieves the hashes of all the nodes cached within the memory database.\n// This method is extremely expensive and should only be used to validate internal\n// states in test code.\nfunc (db *Database) Nodes() []common.Hash {\n\tdb.lock.RLock()\n\tdefer db.lock.RUnlock()\n\n\tvar hashes = make([]common.Hash, 0, len(db.nodes))\n\tfor hash := range db.nodes {\n\t\tif hash != (common.Hash{}) { // Special case for \"root\" references/nodes\n\t\t\thashes = append(hashes, hash)\n\t\t}\n\t}\n\treturn hashes\n}\n\n// Reference adds a new reference from a parent node to a child node.\nfunc (db *Database) Reference(child common.Hash, parent common.Hash) {\n\tdb.lock.RLock()\n\tdefer db.lock.RUnlock()\n\n\tdb.reference(child, parent)\n}\n\n// reference is the private locked version of Reference.\nfunc (db *Database) reference(child common.Hash, parent common.Hash) {\n\t// If the node does not exist, it's a node pulled from disk, skip\n\tnode, ok := db.nodes[child]\n\tif !ok {\n\t\treturn\n\t}\n\t// If the reference already exists, only duplicate for roots\n\tif db.nodes[parent].children == nil {\n\t\tdb.nodes[parent].children = make(map[common.Hash]uint16)\n\t} else if _, ok = db.nodes[parent].children[child]; ok && parent != (common.Hash{}) {\n\t\treturn\n\t}\n\tnode.parents++\n\tdb.nodes[parent].children[child]++\n}\n\n// Dereference removes an existing reference from a root node.\nfunc (db *Database) Dereference(root common.Hash) {\n\tdb.lock.Lock()\n\tdefer db.lock.Unlock()\n\n\tnodes, storage, start := len(db.nodes), db.nodesSize, time.Now()\n\tdb.dereference(root, common.Hash{})\n\n\tdb.gcnodes += uint64(nodes - len(db.nodes))\n\tdb.gcsize += storage - db.nodesSize\n\tdb.gctime += time.Since(start)\n\n\tmemcacheGCTimeTimer.Update(time.Since(start))\n\tmemcacheGCSizeMeter.Mark(int64(storage - db.nodesSize))\n\tmemcacheGCNodesMeter.Mark(int64(nodes - len(db.nodes)))\n\n\tlog.Debug(\"Dereferenced trie from memory database\", \"nodes\", nodes-len(db.nodes), \"size\", storage-db.nodesSize, \"time\", time.Since(start),\n\t\t\"gcnodes\", db.gcnodes, \"gcsize\", db.gcsize, \"gctime\", db.gctime, \"livenodes\", len(db.nodes), \"livesize\", db.nodesSize)\n}\n\n// dereference is the private locked version of Dereference.\nfunc (db *Database) dereference(child common.Hash, parent common.Hash) {\n\t// Dereference the parent-child\n\tnode := db.nodes[parent]\n\n\tif node.children != nil && node.children[child] > 0 {\n\t\tnode.children[child]--\n\t\tif node.children[child] == 0 {\n\t\t\tdelete(node.children, child)\n\t\t}\n\t}\n\t// If the child does not exist, it's a previously committed node.\n\tnode, ok := db.nodes[child]\n\tif !ok {\n\t\treturn\n\t}\n\t// If there are no more references to the child, delete it and cascade\n\tif node.parents > 0 {\n\t\t// This is a special cornercase where a node loaded from disk (i.e. not in the\n\t\t// memcache any more) gets reinjected as a new node (short node split into full,\n\t\t// then reverted into short), causing a cached node to have no parents. That is\n\t\t// no problem in itself, but don't make maxint parents out of it.\n\t\tnode.parents--\n\t}\n\tif node.parents == 0 {\n\t\t// Remove the node from the flush-list\n\t\tswitch child {\n\t\tcase db.oldest:\n\t\t\tdb.oldest = node.flushNext\n\t\t\tdb.nodes[node.flushNext].flushPrev = common.Hash{}\n\t\tcase db.newest:\n\t\t\tdb.newest = node.flushPrev\n\t\t\tdb.nodes[node.flushPrev].flushNext = common.Hash{}\n\t\tdefault:\n\t\t\tdb.nodes[node.flushPrev].flushNext = node.flushNext\n\t\t\tdb.nodes[node.flushNext].flushPrev = node.flushPrev\n\t\t}\n\t\t// Dereference all children and delete the node\n\t\tfor _, hash := range node.childs() {\n\t\t\tdb.dereference(hash, child)\n\t\t}\n\t\tdelete(db.nodes, child)\n\t\tdb.nodesSize -= common.StorageSize(common.HashLength + int(node.size))\n\t}\n}\n\n// Cap iteratively flushes old but still referenced trie nodes until the total\n// memory usage goes below the given threshold.\nfunc (db *Database) Cap(limit common.StorageSize) error {\n\t// Create a database batch to flush persistent data out. It is important that\n\t// outside code doesn't see an inconsistent state (referenced data removed from\n\t// memory cache during commit but not yet in persistent storage). This is ensured\n\t// by only uncaching existing data when the database write finalizes.\n\tdb.lock.RLock()\n\n\tnodes, storage, start := len(db.nodes), db.nodesSize, time.Now()\n\tbatch := db.diskdb.NewBatch()\n\n\t// db.nodesSize only contains the useful data in the cache, but when reporting\n\t// the total memory consumption, the maintenance metadata is also needed to be\n\t// counted. For every useful node, we track 2 extra hashes as the flushlist.\n\tsize := db.nodesSize + common.StorageSize((len(db.nodes)-1)*2*common.HashLength)\n\n\t// If the preimage cache got large enough, push to disk. If it's still small\n\t// leave for later to deduplicate writes.\n\tflushPreimages := db.preimagesSize > 4*1024*1024\n\tif flushPreimages {\n\t\tfor hash, preimage := range db.preimages {\n\t\t\tif err := batch.Put(db.secureKey(hash[:]), preimage); err != nil {\n\t\t\t\tlog.Error(\"Failed to commit preimage from trie database\", \"err\", err)\n\t\t\t\tdb.lock.RUnlock()\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif batch.ValueSize() > serodb.IdealBatchSize {\n\t\t\t\tif err := batch.Write(); err != nil {\n\t\t\t\t\tdb.lock.RUnlock()\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tbatch.Reset()\n\t\t\t}\n\t\t}\n\t}\n\t// Keep committing nodes from the flush-list until we're below allowance\n\toldest := db.oldest\n\tfor size > limit && oldest != (common.Hash{}) {\n\t\t// Fetch the oldest referenced node and push into the batch\n\t\tnode := db.nodes[oldest]\n\t\tif err := batch.Put(oldest[:], node.rlp()); err != nil {\n\t\t\tdb.lock.RUnlock()\n\t\t\treturn err\n\t\t}\n\t\t// If we exceeded the ideal batch size, commit and reset\n\t\tif batch.ValueSize() >= serodb.IdealBatchSize {\n\t\t\tif err := batch.Write(); err != nil {\n\t\t\t\tlog.Error(\"Failed to write flush list to disk\", \"err\", err)\n\t\t\t\tdb.lock.RUnlock()\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tbatch.Reset()\n\t\t}\n\t\t// Iterate to the next flush item, or abort if the size cap was achieved. Size\n\t\t// is the total size, including both the useful cached data (hash -> blob), as\n\t\t// well as the flushlist metadata (2*hash). When flushing items from the cache,\n\t\t// we need to reduce both.\n\t\tsize -= common.StorageSize(3*common.HashLength + int(node.size))\n\t\toldest = node.flushNext\n\t}\n\t// Flush out any remainder data from the last batch\n\tif err := batch.Write(); err != nil {\n\t\tlog.Error(\"Failed to write flush list to disk\", \"err\", err)\n\t\tdb.lock.RUnlock()\n\t\treturn err\n\t}\n\tdb.lock.RUnlock()\n\n\t// Write successful, clear out the flushed data\n\tdb.lock.Lock()\n\tdefer db.lock.Unlock()\n\n\tif flushPreimages {\n\t\tdb.preimages = make(map[common.Hash][]byte)\n\t\tdb.preimagesSize = 0\n\t}\n\tfor db.oldest != oldest {\n\t\tnode := db.nodes[db.oldest]\n\t\tdelete(db.nodes, db.oldest)\n\t\tdb.oldest = node.flushNext\n\n\t\tdb.nodesSize -= common.StorageSize(common.HashLength + int(node.size))\n\t}\n\tif db.oldest != (common.Hash{}) {\n\t\tdb.nodes[db.oldest].flushPrev = common.Hash{}\n\t}\n\tdb.flushnodes += uint64(nodes - len(db.nodes))\n\tdb.flushsize += storage - db.nodesSize\n\tdb.flushtime += time.Since(start)\n\n\tmemcacheFlushTimeTimer.Update(time.Since(start))\n\tmemcacheFlushSizeMeter.Mark(int64(storage - db.nodesSize))\n\tmemcacheFlushNodesMeter.Mark(int64(nodes - len(db.nodes)))\n\n\tlog.Debug(\"Persisted nodes from memory database\", \"nodes\", nodes-len(db.nodes), \"size\", storage-db.nodesSize, \"time\", time.Since(start),\n\t\t\"flushnodes\", db.flushnodes, \"flushsize\", db.flushsize, \"flushtime\", db.flushtime, \"livenodes\", len(db.nodes), \"livesize\", db.nodesSize)\n\n\treturn nil\n}\n\n// Commit iterates over all the children of a particular node, writes them out\n// to disk, forcefully tearing down all references in both directions.\n//\n// As a side effect, all pre-images accumulated up to this point are also written.\nfunc (db *Database) Commit(node common.Hash, report bool) error {\n\t// Create a database batch to flush persistent data out. It is important that\n\t// outside code doesn't see an inconsistent state (referenced data removed from\n\t// memory cache during commit but not yet in persistent storage). This is ensured\n\t// by only uncaching existing data when the database write finalizes.\n\tdb.lock.RLock()\n\n\tstart := time.Now()\n\tbatch := db.diskdb.NewBatch()\n\n\t// Move all of the accumulated preimages into a write batch\n\tfor hash, preimage := range db.preimages {\n\t\tif err := batch.Put(db.secureKey(hash[:]), preimage); err != nil {\n\t\t\tlog.Error(\"Failed to commit preimage from trie database\", \"err\", err)\n\t\t\tdb.lock.RUnlock()\n\t\t\treturn err\n\t\t}\n\t\tif batch.ValueSize() > serodb.IdealBatchSize {\n\t\t\tif err := batch.Write(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tbatch.Reset()\n\t\t}\n\t}\n\t// Move the trie itself into the batch, flushing if enough data is accumulated\n\tnodes, storage := len(db.nodes), db.nodesSize\n\tif err := db.commit(node, batch); err != nil {\n\t\tlog.Error(\"Failed to commit trie from trie database\", \"err\", err)\n\t\tdb.lock.RUnlock()\n\t\treturn err\n\t}\n\t// Write batch ready, unlock for readers during persistence\n\tif err := batch.Write(); err != nil {\n\t\tlog.Error(\"Failed to write trie to disk\", \"err\", err)\n\t\tdb.lock.RUnlock()\n\t\treturn err\n\t}\n\tdb.lock.RUnlock()\n\n\t// Write successful, clear out the flushed data\n\tdb.lock.Lock()\n\tdefer db.lock.Unlock()\n\n\tdb.preimages = make(map[common.Hash][]byte)\n\tdb.preimagesSize = 0\n\n\tdb.uncache(node)\n\n\tmemcacheCommitTimeTimer.Update(time.Since(start))\n\tmemcacheCommitSizeMeter.Mark(int64(storage - db.nodesSize))\n\tmemcacheCommitNodesMeter.Mark(int64(nodes - len(db.nodes)))\n\n\tlogger := log.Info\n\tif !report {\n\t\tlogger = log.Debug\n\t}\n\tlogger(\"Persisted trie from memory database\", \"nodes\", nodes-len(db.nodes)+int(db.flushnodes), \"size\", storage-db.nodesSize+db.flushsize, \"time\", time.Since(start)+db.flushtime,\n\t\t\"gcnodes\", db.gcnodes, \"gcsize\", db.gcsize, \"gctime\", db.gctime, \"livenodes\", len(db.nodes), \"livesize\", db.nodesSize)\n\n\t// Reset the garbage collection statistics\n\tdb.gcnodes, db.gcsize, db.gctime = 0, 0, 0\n\tdb.flushnodes, db.flushsize, db.flushtime = 0, 0, 0\n\n\treturn nil\n}\n\n// commit is the private locked version of Commit.\nfunc (db *Database) commit(hash common.Hash, batch serodb.Batch) error {\n\t// If the node does not exist, it's a previously committed node\n\tnode, ok := db.nodes[hash]\n\tif !ok {\n\t\treturn nil\n\t}\n\tfor _, child := range node.childs() {\n\t\tif err := db.commit(child, batch); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := batch.Put(hash[:], node.rlp()); err != nil {\n\t\treturn err\n\t}\n\t// If we've reached an optimal batch size, commit and start over\n\tif batch.ValueSize() >= serodb.IdealBatchSize {\n\t\tif err := batch.Write(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tbatch.Reset()\n\t}\n\treturn nil\n}\n\n// uncache is the post-processing step of a commit operation where the already\n// persisted trie is removed from the cache. The reason behind the two-phase\n// commit is to ensure consistent data availability while moving from memory\n// to disk.\nfunc (db *Database) uncache(hash common.Hash) {\n\t// If the node does not exist, we're done on this path\n\tnode, ok := db.nodes[hash]\n\tif !ok {\n\t\treturn\n\t}\n\t// Node still exists, remove it from the flush-list\n\tswitch hash {\n\tcase db.oldest:\n\t\tdb.oldest = node.flushNext\n\t\tdb.nodes[node.flushNext].flushPrev = common.Hash{}\n\tcase db.newest:\n\t\tdb.newest = node.flushPrev\n\t\tdb.nodes[node.flushPrev].flushNext = common.Hash{}\n\tdefault:\n\t\tdb.nodes[node.flushPrev].flushNext = node.flushNext\n\t\tdb.nodes[node.flushNext].flushPrev = node.flushPrev\n\t}\n\t// Uncache the node's subtries and remove the node itself too\n\tfor _, child := range node.childs() {\n\t\tdb.uncache(child)\n\t}\n\tdelete(db.nodes, hash)\n\tdb.nodesSize -= common.StorageSize(common.HashLength + int(node.size))\n}\n\n// Size returns the current storage size of the memory cache in front of the\n// persistent database layer.\nfunc (db *Database) Size() (common.StorageSize, common.StorageSize) {\n\tdb.lock.RLock()\n\tdefer db.lock.RUnlock()\n\n\t// db.nodesSize only contains the useful data in the cache, but when reporting\n\t// the total memory consumption, the maintenance metadata is also needed to be\n\t// counted. For every useful node, we track 2 extra hashes as the flushlist.\n\tvar flushlistSize = common.StorageSize((len(db.nodes) - 1) * 2 * common.HashLength)\n\treturn db.nodesSize + flushlistSize, db.preimagesSize\n}\n\n// verifyIntegrity is a debug method to iterate over the entire trie stored in\n// memory and check whether every node is reachable from the meta root. The goal\n// is to find any errors that might cause memory leaks and or trie nodes to go\n// missing.\n//\n// This method is extremely CPU and memory intensive, only use when must.\nfunc (db *Database) verifyIntegrity() {\n\t// Iterate over all the cached nodes and accumulate them into a set\n\treachable := map[common.Hash]struct{}{{}: {}}\n\n\tfor child := range db.nodes[common.Hash{}].children {\n\t\tdb.accumulate(child, reachable)\n\t}\n\t// Find any unreachable but cached nodes\n\tunreachable := []string{}\n\tfor hash, node := range db.nodes {\n\t\tif _, ok := reachable[hash]; !ok {\n\t\t\tunreachable = append(unreachable, fmt.Sprintf(\"%x: {Node: %v, Parents: %d, Prev: %x, Next: %x}\",\n\t\t\t\thash, node.node, node.parents, node.flushPrev, node.flushNext))\n\t\t}\n\t}\n\tif len(unreachable) != 0 {\n\t\tpanic(fmt.Sprintf(\"trie cache memory leak: %v\", unreachable))\n\t}\n}\n\n// accumulate iterates over the trie defined by hash and accumulates all the\n// cached children found in memory.\nfunc (db *Database) accumulate(hash common.Hash, reachable map[common.Hash]struct{}) {\n\t// Mark the node reachable if present in the memory cache\n\tnode, ok := db.nodes[hash]\n\tif !ok {\n\t\treturn\n\t}\n\treachable[hash] = struct{}{}\n\n\t// Iterate over all the children and accumulate them too\n\tfor _, child := range node.childs() {\n\t\tdb.accumulate(child, reachable)\n\t}\n}\n"
  },
  {
    "path": "trie/encoding.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\n// Trie keys are dealt with in three distinct encodings:\n//\n// KEYBYTES encoding contains the actual key and nothing else. This encoding is the\n// input to most API functions.\n//\n// HEX encoding contains one byte for each nibble of the key and an optional trailing\n// 'terminator' byte of value 0x10 which indicates whether or not the node at the key\n// contains a value. Hex key encoding is used for nodes loaded in memory because it's\n// convenient to access.\n//\n// COMPACT encoding is defined by the Ethereum Yellow Paper (it's called \"hex prefix\n// encoding\" there) and contains the bytes of the key and a flag. The high nibble of the\n// first byte contains the flag; the lowest bit encoding the oddness of the length and\n// the second-lowest encoding whether the node at the key is a value node. The low nibble\n// of the first byte is zero in the case of an even number of nibbles and the first nibble\n// in the case of an odd number. All remaining nibbles (now an even number) fit properly\n// into the remaining bytes. Compact encoding is used for nodes stored on disk.\n\nfunc hexToCompact(hex []byte) []byte {\n\tterminator := byte(0)\n\tif hasTerm(hex) {\n\t\tterminator = 1\n\t\thex = hex[:len(hex)-1]\n\t}\n\tbuf := make([]byte, len(hex)/2+1)\n\tbuf[0] = terminator << 5 // the flag byte\n\tif len(hex)&1 == 1 {\n\t\tbuf[0] |= 1 << 4 // odd flag\n\t\tbuf[0] |= hex[0] // first nibble is contained in the first byte\n\t\thex = hex[1:]\n\t}\n\tdecodeNibbles(hex, buf[1:])\n\treturn buf\n}\n\nfunc compactToHex(compact []byte) []byte {\n\tbase := keybytesToHex(compact)\n\t// delete terminator flag\n\tif base[0] < 2 {\n\t\tbase = base[:len(base)-1]\n\t}\n\t// apply odd flag\n\tchop := 2 - base[0]&1\n\treturn base[chop:]\n}\n\nfunc keybytesToHex(str []byte) []byte {\n\tl := len(str)*2 + 1\n\tvar nibbles = make([]byte, l)\n\tfor i, b := range str {\n\t\tnibbles[i*2] = b / 16\n\t\tnibbles[i*2+1] = b % 16\n\t}\n\tnibbles[l-1] = 16\n\treturn nibbles\n}\n\n// hexToKeybytes turns hex nibbles into key bytes.\n// This can only be used for keys of even length.\nfunc hexToKeybytes(hex []byte) []byte {\n\tif hasTerm(hex) {\n\t\thex = hex[:len(hex)-1]\n\t}\n\tif len(hex)&1 != 0 {\n\t\tpanic(\"can't convert hex key of odd length\")\n\t}\n\tkey := make([]byte, len(hex)/2)\n\tdecodeNibbles(hex, key)\n\treturn key\n}\n\nfunc decodeNibbles(nibbles []byte, bytes []byte) {\n\tfor bi, ni := 0, 0; ni < len(nibbles); bi, ni = bi+1, ni+2 {\n\t\tbytes[bi] = nibbles[ni]<<4 | nibbles[ni+1]\n\t}\n}\n\n// prefixLen returns the length of the common prefix of a and b.\nfunc prefixLen(a, b []byte) int {\n\tvar i, length = 0, len(a)\n\tif len(b) < length {\n\t\tlength = len(b)\n\t}\n\tfor ; i < length; i++ {\n\t\tif a[i] != b[i] {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn i\n}\n\n// hasTerm returns whether a hex key has the terminator flag.\nfunc hasTerm(s []byte) bool {\n\treturn len(s) > 0 && s[len(s)-1] == 16\n}\n"
  },
  {
    "path": "trie/errors.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\n// MissingNodeError is returned by the trie functions (TryGet, TryUpdate, TryDelete)\n// in the case where a trie node is not present in the local database. It contains\n// information necessary for retrieving the missing node.\ntype MissingNodeError struct {\n\tNodeHash common.Hash // hash of the missing node\n\tPath     []byte      // hex-encoded path to the missing node\n}\n\nfunc (err *MissingNodeError) Error() string {\n\treturn fmt.Sprintf(\"missing trie node %x (path %x)\", err.NodeHash, err.Path)\n}\n"
  },
  {
    "path": "trie/hasher.go",
    "content": "// Copyright 2016 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"hash\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype hasher struct {\n\ttmp        sliceBuffer\n\tsha        keccakState\n\tcachegen   uint16\n\tcachelimit uint16\n\tonleaf     LeafCallback\n}\n\n// keccakState wraps sha3.state. In addition to the usual hash methods, it also supports\n// Read to get a variable amount of data from the hash state. Read is faster than Sum\n// because it doesn't copy the internal state, but also modifies the internal state.\ntype keccakState interface {\n\thash.Hash\n\tRead([]byte) (int, error)\n}\n\ntype sliceBuffer []byte\n\nfunc (b *sliceBuffer) Write(data []byte) (n int, err error) {\n\t*b = append(*b, data...)\n\treturn len(data), nil\n}\n\nfunc (b *sliceBuffer) Reset() {\n\t*b = (*b)[:0]\n}\n\n// hashers live in a global db.\nvar hasherPool = sync.Pool{\n\tNew: func() interface{} {\n\t\treturn &hasher{\n\t\t\ttmp: make(sliceBuffer, 0, 550), // cap is as large as a full fullNode.\n\t\t\tsha: sha3.NewKeccak256().(keccakState),\n\t\t}\n\t},\n}\n\nfunc newHasher(cachegen, cachelimit uint16, onleaf LeafCallback) *hasher {\n\th := hasherPool.Get().(*hasher)\n\th.cachegen, h.cachelimit, h.onleaf = cachegen, cachelimit, onleaf\n\treturn h\n}\n\nfunc returnHasherToPool(h *hasher) {\n\thasherPool.Put(h)\n}\n\n// hash collapses a node down into a hash node, also returning a copy of the\n// original node initialized with the computed hash to replace the original one.\nfunc (h *hasher) hash(n node, db *Database, force bool) (node, node, error) {\n\t// If we're not storing the node, just hashing, use available cached data\n\tif hash, dirty := n.cache(); hash != nil {\n\t\tif db == nil {\n\t\t\treturn hash, n, nil\n\t\t}\n\t\tif n.canUnload(h.cachegen, h.cachelimit) {\n\t\t\t// Unload the node from cache. All of its subnodes will have a lower or equal\n\t\t\t// cache generation number.\n\t\t\tcacheUnloadCounter.Inc(1)\n\t\t\treturn hash, hash, nil\n\t\t}\n\t\tif !dirty {\n\t\t\treturn hash, n, nil\n\t\t}\n\t}\n\t// Trie not processed yet or needs storage, walk the children\n\tcollapsed, cached, err := h.hashChildren(n, db)\n\tif err != nil {\n\t\treturn hashNode{}, n, err\n\t}\n\thashed, err := h.store(collapsed, db, force)\n\tif err != nil {\n\t\treturn hashNode{}, n, err\n\t}\n\t// Cache the hash of the node for later reuse and remove\n\t// the dirty flag in commit mode. It's fine to assign these values directly\n\t// without copying the node first because hashChildren copies it.\n\tcachedHash, _ := hashed.(hashNode)\n\tswitch cn := cached.(type) {\n\tcase *shortNode:\n\t\tcn.flags.hash = cachedHash\n\t\tif db != nil {\n\t\t\tcn.flags.dirty = false\n\t\t}\n\tcase *fullNode:\n\t\tcn.flags.hash = cachedHash\n\t\tif db != nil {\n\t\t\tcn.flags.dirty = false\n\t\t}\n\t}\n\treturn hashed, cached, nil\n}\n\n// hashChildren replaces the children of a node with their hashes if the encoded\n// size of the child is larger than a hash, returning the collapsed node as well\n// as a replacement for the original node with the child hashes cached in.\nfunc (h *hasher) hashChildren(original node, db *Database) (node, node, error) {\n\tvar err error\n\n\tswitch n := original.(type) {\n\tcase *shortNode:\n\t\t// Hash the short node's child, caching the newly hashed subtree\n\t\tcollapsed, cached := n.copy(), n.copy()\n\t\tcollapsed.Key = hexToCompact(n.Key)\n\t\tcached.Key = common.CopyBytes(n.Key)\n\n\t\tif _, ok := n.Val.(valueNode); !ok {\n\t\t\tcollapsed.Val, cached.Val, err = h.hash(n.Val, db, false)\n\t\t\tif err != nil {\n\t\t\t\treturn original, original, err\n\t\t\t}\n\t\t}\n\t\treturn collapsed, cached, nil\n\n\tcase *fullNode:\n\t\t// Hash the full node's children, caching the newly hashed subtrees\n\t\tcollapsed, cached := n.copy(), n.copy()\n\n\t\tfor i := 0; i < 16; i++ {\n\t\t\tif n.Children[i] != nil {\n\t\t\t\tcollapsed.Children[i], cached.Children[i], err = h.hash(n.Children[i], db, false)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn original, original, err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcached.Children[16] = n.Children[16]\n\t\treturn collapsed, cached, nil\n\n\tdefault:\n\t\t// Value and hash nodes don't have children so they're left as were\n\t\treturn n, original, nil\n\t}\n}\n\n// store hashes the node n and if we have a storage layer specified, it writes\n// the key/value pair to it and tracks any node->child references as well as any\n// node->external trie references.\nfunc (h *hasher) store(n node, db *Database, force bool) (node, error) {\n\t// Don't store hashes or empty nodes.\n\tif _, isHash := n.(hashNode); n == nil || isHash {\n\t\treturn n, nil\n\t}\n\t// Generate the RLP encoding of the node\n\th.tmp.Reset()\n\tif err := rlp.Encode(&h.tmp, n); err != nil {\n\t\tpanic(\"encode error: \" + err.Error())\n\t}\n\tif len(h.tmp) < 32 && !force {\n\t\treturn n, nil // Nodes smaller than 32 bytes are stored inside their parent\n\t}\n\t// Larger nodes are replaced by their hash and stored in the database.\n\thash, _ := n.cache()\n\tif hash == nil {\n\t\thash = h.makeHashNode(h.tmp)\n\t}\n\n\tif db != nil {\n\t\t// We are pooling the trie nodes into an intermediate memory cache\n\t\thash := common.BytesToHash(hash)\n\n\t\tdb.lock.Lock()\n\t\tdb.insert(hash, h.tmp, n)\n\t\tdb.lock.Unlock()\n\n\t\t// Track external references from account->storage trie\n\t\tif h.onleaf != nil {\n\t\t\tswitch n := n.(type) {\n\t\t\tcase *shortNode:\n\t\t\t\tif child, ok := n.Val.(valueNode); ok {\n\t\t\t\t\th.onleaf(child, hash)\n\t\t\t\t}\n\t\t\tcase *fullNode:\n\t\t\t\tfor i := 0; i < 16; i++ {\n\t\t\t\t\tif child, ok := n.Children[i].(valueNode); ok {\n\t\t\t\t\t\th.onleaf(child, hash)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn hash, nil\n}\n\nfunc (h *hasher) makeHashNode(data []byte) hashNode {\n\tn := make(hashNode, h.sha.Size())\n\th.sha.Reset()\n\th.sha.Write(data)\n\th.sha.Read(n)\n\treturn n\n}\n"
  },
  {
    "path": "trie/iterator.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"bytes\"\n\t\"container/heap\"\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\n// Iterator is a key-value trie iterator that traverses a Trie.\ntype Iterator struct {\n\tnodeIt NodeIterator\n\n\tKey   []byte // Current data key on which the iterator is positioned on\n\tValue []byte // Current data value on which the iterator is positioned on\n\tErr   error\n}\n\n// NewIterator creates a new key-value iterator from a node iterator\nfunc NewIterator(it NodeIterator) *Iterator {\n\treturn &Iterator{\n\t\tnodeIt: it,\n\t}\n}\n\n// Next moves the iterator forward one key-value entry.\nfunc (it *Iterator) Next() bool {\n\tfor it.nodeIt.Next(true) {\n\t\tif it.nodeIt.Leaf() {\n\t\t\tit.Key = it.nodeIt.LeafKey()\n\t\t\tit.Value = it.nodeIt.LeafBlob()\n\t\t\treturn true\n\t\t}\n\t}\n\tit.Key = nil\n\tit.Value = nil\n\tit.Err = it.nodeIt.Error()\n\treturn false\n}\n\n// Prove generates the Merkle proof for the leaf node the iterator is currently\n// positioned on.\nfunc (it *Iterator) Prove() [][]byte {\n\treturn it.nodeIt.LeafProof()\n}\n\n// NodeIterator is an iterator to traverse the trie pre-order.\ntype NodeIterator interface {\n\t// Next moves the iterator to the next node. If the parameter is false, any child\n\t// nodes will be skipped.\n\tNext(bool) bool\n\n\t// Error returns the error status of the iterator.\n\tError() error\n\n\t// Hash returns the hash of the current node.\n\tHash() common.Hash\n\n\t// Parent returns the hash of the parent of the current node. The hash may be the one\n\t// grandparent if the immediate parent is an internal node with no hash.\n\tParent() common.Hash\n\n\t// Path returns the hex-encoded path to the current node.\n\t// Callers must not retain references to the return value after calling Next.\n\t// For leaf nodes, the last element of the path is the 'terminator symbol' 0x10.\n\tPath() []byte\n\n\t// Leaf returns true iff the current node is a leaf node.\n\tLeaf() bool\n\n\t// LeafKey returns the key of the leaf. The method panics if the iterator is not\n\t// positioned at a leaf. Callers must not retain references to the value after\n\t// calling Next.\n\tLeafKey() []byte\n\n\t// LeafBlob returns the content of the leaf. The method panics if the iterator\n\t// is not positioned at a leaf. Callers must not retain references to the value\n\t// after calling Next.\n\tLeafBlob() []byte\n\n\t// LeafProof returns the Merkle proof of the leaf. The method panics if the\n\t// iterator is not positioned at a leaf. Callers must not retain references\n\t// to the value after calling Next.\n\tLeafProof() [][]byte\n}\n\n// nodeIteratorState represents the iteration state at one particular node of the\n// trie, which can be resumed at a later invocation.\ntype nodeIteratorState struct {\n\thash    common.Hash // Hash of the node being iterated (nil if not standalone)\n\tnode    node        // Trie node being iterated\n\tparent  common.Hash // Hash of the first full ancestor node (nil if current is the root)\n\tindex   int         // Child to be processed next\n\tpathlen int         // Length of the path to this node\n}\n\ntype nodeIterator struct {\n\ttrie  *Trie                // Trie being iterated\n\tstack []*nodeIteratorState // Hierarchy of trie nodes persisting the iteration state\n\tpath  []byte               // Path to the current node\n\terr   error                // Failure set in case of an internal error in the iterator\n}\n\n// errIteratorEnd is stored in nodeIterator.err when iteration is done.\nvar errIteratorEnd = errors.New(\"end of iteration\")\n\n// seekError is stored in nodeIterator.err if the initial seek has failed.\ntype seekError struct {\n\tkey []byte\n\terr error\n}\n\nfunc (e seekError) Error() string {\n\treturn \"seek error: \" + e.err.Error()\n}\n\nfunc newNodeIterator(trie *Trie, start []byte) NodeIterator {\n\tif trie.Hash() == emptyState {\n\t\treturn new(nodeIterator)\n\t}\n\tit := &nodeIterator{trie: trie}\n\tit.err = it.seek(start)\n\treturn it\n}\n\nfunc (it *nodeIterator) Hash() common.Hash {\n\tif len(it.stack) == 0 {\n\t\treturn common.Hash{}\n\t}\n\treturn it.stack[len(it.stack)-1].hash\n}\n\nfunc (it *nodeIterator) Parent() common.Hash {\n\tif len(it.stack) == 0 {\n\t\treturn common.Hash{}\n\t}\n\treturn it.stack[len(it.stack)-1].parent\n}\n\nfunc (it *nodeIterator) Leaf() bool {\n\treturn hasTerm(it.path)\n}\n\nfunc (it *nodeIterator) LeafKey() []byte {\n\tif len(it.stack) > 0 {\n\t\tif _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok {\n\t\t\treturn hexToKeybytes(it.path)\n\t\t}\n\t}\n\tpanic(\"not at leaf\")\n}\n\nfunc (it *nodeIterator) LeafBlob() []byte {\n\tif len(it.stack) > 0 {\n\t\tif node, ok := it.stack[len(it.stack)-1].node.(valueNode); ok {\n\t\t\treturn []byte(node)\n\t\t}\n\t}\n\tpanic(\"not at leaf\")\n}\n\nfunc (it *nodeIterator) LeafProof() [][]byte {\n\tif len(it.stack) > 0 {\n\t\tif _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok {\n\t\t\thasher := newHasher(0, 0, nil)\n\t\t\tproofs := make([][]byte, 0, len(it.stack))\n\n\t\t\tfor i, item := range it.stack[:len(it.stack)-1] {\n\t\t\t\t// Gather nodes that end up as hash nodes (or the root)\n\t\t\t\tnode, _, _ := hasher.hashChildren(item.node, nil)\n\t\t\t\thashed, _ := hasher.store(node, nil, false)\n\t\t\t\tif _, ok := hashed.(hashNode); ok || i == 0 {\n\t\t\t\t\tenc, _ := rlp.EncodeToBytes(node)\n\t\t\t\t\tproofs = append(proofs, enc)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn proofs\n\t\t}\n\t}\n\tpanic(\"not at leaf\")\n}\n\nfunc (it *nodeIterator) Path() []byte {\n\treturn it.path\n}\n\nfunc (it *nodeIterator) Error() error {\n\tif it.err == errIteratorEnd {\n\t\treturn nil\n\t}\n\tif seek, ok := it.err.(seekError); ok {\n\t\treturn seek.err\n\t}\n\treturn it.err\n}\n\n// Next moves the iterator to the next node, returning whether there are any\n// further nodes. In case of an internal error this method returns false and\n// sets the Error field to the encountered failure. If `descend` is false,\n// skips iterating over any subnodes of the current node.\nfunc (it *nodeIterator) Next(descend bool) bool {\n\tif it.err == errIteratorEnd {\n\t\treturn false\n\t}\n\tif seek, ok := it.err.(seekError); ok {\n\t\tif it.err = it.seek(seek.key); it.err != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\t// Otherwise step forward with the iterator and report any errors.\n\tstate, parentIndex, path, err := it.peek(descend)\n\tit.err = err\n\tif it.err != nil {\n\t\treturn false\n\t}\n\tit.push(state, parentIndex, path)\n\treturn true\n}\n\nfunc (it *nodeIterator) seek(prefix []byte) error {\n\t// The path we're looking for is the hex encoded key without terminator.\n\tkey := keybytesToHex(prefix)\n\tkey = key[:len(key)-1]\n\t// Move forward until we're just before the closest match to key.\n\tfor {\n\t\tstate, parentIndex, path, err := it.peek(bytes.HasPrefix(key, it.path))\n\t\tif err == errIteratorEnd {\n\t\t\treturn errIteratorEnd\n\t\t} else if err != nil {\n\t\t\treturn seekError{prefix, err}\n\t\t} else if bytes.Compare(path, key) >= 0 {\n\t\t\treturn nil\n\t\t}\n\t\tit.push(state, parentIndex, path)\n\t}\n}\n\n// peek creates the next state of the iterator.\nfunc (it *nodeIterator) peek(descend bool) (*nodeIteratorState, *int, []byte, error) {\n\tif len(it.stack) == 0 {\n\t\t// Initialize the iterator if we've just started.\n\t\troot := it.trie.Hash()\n\t\tstate := &nodeIteratorState{node: it.trie.root, index: -1}\n\t\tif root != emptyRoot {\n\t\t\tstate.hash = root\n\t\t}\n\t\terr := state.resolve(it.trie, nil)\n\t\treturn state, nil, nil, err\n\t}\n\tif !descend {\n\t\t// If we're skipping children, pop the current node first\n\t\tit.pop()\n\t}\n\n\t// Continue iteration to the next child\n\tfor len(it.stack) > 0 {\n\t\tparent := it.stack[len(it.stack)-1]\n\t\tancestor := parent.hash\n\t\tif (ancestor == common.Hash{}) {\n\t\t\tancestor = parent.parent\n\t\t}\n\t\tstate, path, ok := it.nextChild(parent, ancestor)\n\t\tif ok {\n\t\t\tif err := state.resolve(it.trie, path); err != nil {\n\t\t\t\treturn parent, &parent.index, path, err\n\t\t\t}\n\t\t\treturn state, &parent.index, path, nil\n\t\t}\n\t\t// No more child nodes, move back up.\n\t\tit.pop()\n\t}\n\treturn nil, nil, nil, errIteratorEnd\n}\n\nfunc (st *nodeIteratorState) resolve(tr *Trie, path []byte) error {\n\tif hash, ok := st.node.(hashNode); ok {\n\t\tresolved, err := tr.resolveHash(hash, path)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tst.node = resolved\n\t\tst.hash = common.BytesToHash(hash)\n\t}\n\treturn nil\n}\n\nfunc (it *nodeIterator) nextChild(parent *nodeIteratorState, ancestor common.Hash) (*nodeIteratorState, []byte, bool) {\n\tswitch node := parent.node.(type) {\n\tcase *fullNode:\n\t\t// Full node, move to the first non-nil child.\n\t\tfor i := parent.index + 1; i < len(node.Children); i++ {\n\t\t\tchild := node.Children[i]\n\t\t\tif child != nil {\n\t\t\t\thash, _ := child.cache()\n\t\t\t\tstate := &nodeIteratorState{\n\t\t\t\t\thash:    common.BytesToHash(hash),\n\t\t\t\t\tnode:    child,\n\t\t\t\t\tparent:  ancestor,\n\t\t\t\t\tindex:   -1,\n\t\t\t\t\tpathlen: len(it.path),\n\t\t\t\t}\n\t\t\t\tpath := append(it.path, byte(i))\n\t\t\t\tparent.index = i - 1\n\t\t\t\treturn state, path, true\n\t\t\t}\n\t\t}\n\tcase *shortNode:\n\t\t// Short node, return the pointer singleton child\n\t\tif parent.index < 0 {\n\t\t\thash, _ := node.Val.cache()\n\t\t\tstate := &nodeIteratorState{\n\t\t\t\thash:    common.BytesToHash(hash),\n\t\t\t\tnode:    node.Val,\n\t\t\t\tparent:  ancestor,\n\t\t\t\tindex:   -1,\n\t\t\t\tpathlen: len(it.path),\n\t\t\t}\n\t\t\tpath := append(it.path, node.Key...)\n\t\t\treturn state, path, true\n\t\t}\n\t}\n\treturn parent, it.path, false\n}\n\nfunc (it *nodeIterator) push(state *nodeIteratorState, parentIndex *int, path []byte) {\n\tit.path = path\n\tit.stack = append(it.stack, state)\n\tif parentIndex != nil {\n\t\t*parentIndex++\n\t}\n}\n\nfunc (it *nodeIterator) pop() {\n\tparent := it.stack[len(it.stack)-1]\n\tit.path = it.path[:parent.pathlen]\n\tit.stack = it.stack[:len(it.stack)-1]\n}\n\nfunc compareNodes(a, b NodeIterator) int {\n\tif cmp := bytes.Compare(a.Path(), b.Path()); cmp != 0 {\n\t\treturn cmp\n\t}\n\tif a.Leaf() && !b.Leaf() {\n\t\treturn -1\n\t} else if b.Leaf() && !a.Leaf() {\n\t\treturn 1\n\t}\n\tif cmp := bytes.Compare(a.Hash().Bytes(), b.Hash().Bytes()); cmp != 0 {\n\t\treturn cmp\n\t}\n\tif a.Leaf() && b.Leaf() {\n\t\treturn bytes.Compare(a.LeafBlob(), b.LeafBlob())\n\t}\n\treturn 0\n}\n\ntype differenceIterator struct {\n\ta, b  NodeIterator // Nodes returned are those in b - a.\n\teof   bool         // Indicates a has run out of elements\n\tcount int          // Number of nodes scanned on either trie\n}\n\n// NewDifferenceIterator constructs a NodeIterator that iterates over elements in b that\n// are not in a. Returns the iterator, and a pointer to an integer recording the number\n// of nodes seen.\nfunc NewDifferenceIterator(a, b NodeIterator) (NodeIterator, *int) {\n\ta.Next(true)\n\tit := &differenceIterator{\n\t\ta: a,\n\t\tb: b,\n\t}\n\treturn it, &it.count\n}\n\nfunc (it *differenceIterator) Hash() common.Hash {\n\treturn it.b.Hash()\n}\n\nfunc (it *differenceIterator) Parent() common.Hash {\n\treturn it.b.Parent()\n}\n\nfunc (it *differenceIterator) Leaf() bool {\n\treturn it.b.Leaf()\n}\n\nfunc (it *differenceIterator) LeafKey() []byte {\n\treturn it.b.LeafKey()\n}\n\nfunc (it *differenceIterator) LeafBlob() []byte {\n\treturn it.b.LeafBlob()\n}\n\nfunc (it *differenceIterator) LeafProof() [][]byte {\n\treturn it.b.LeafProof()\n}\n\nfunc (it *differenceIterator) Path() []byte {\n\treturn it.b.Path()\n}\n\nfunc (it *differenceIterator) Next(bool) bool {\n\t// Invariants:\n\t// - We always advance at least one element in b.\n\t// - At the start of this function, a's path is lexically greater than b's.\n\tif !it.b.Next(true) {\n\t\treturn false\n\t}\n\tit.count++\n\n\tif it.eof {\n\t\t// a has reached eof, so we just return all elements from b\n\t\treturn true\n\t}\n\n\tfor {\n\t\tswitch compareNodes(it.a, it.b) {\n\t\tcase -1:\n\t\t\t// b jumped past a; advance a\n\t\t\tif !it.a.Next(true) {\n\t\t\t\tit.eof = true\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tit.count++\n\t\tcase 1:\n\t\t\t// b is before a\n\t\t\treturn true\n\t\tcase 0:\n\t\t\t// a and b are identical; skip this whole subtree if the nodes have hashes\n\t\t\thasHash := it.a.Hash() == common.Hash{}\n\t\t\tif !it.b.Next(hasHash) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tit.count++\n\t\t\tif !it.a.Next(hasHash) {\n\t\t\t\tit.eof = true\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tit.count++\n\t\t}\n\t}\n}\n\nfunc (it *differenceIterator) Error() error {\n\tif err := it.a.Error(); err != nil {\n\t\treturn err\n\t}\n\treturn it.b.Error()\n}\n\ntype nodeIteratorHeap []NodeIterator\n\nfunc (h nodeIteratorHeap) Len() int            { return len(h) }\nfunc (h nodeIteratorHeap) Less(i, j int) bool  { return compareNodes(h[i], h[j]) < 0 }\nfunc (h nodeIteratorHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }\nfunc (h *nodeIteratorHeap) Push(x interface{}) { *h = append(*h, x.(NodeIterator)) }\nfunc (h *nodeIteratorHeap) Pop() interface{} {\n\tn := len(*h)\n\tx := (*h)[n-1]\n\t*h = (*h)[0 : n-1]\n\treturn x\n}\n\ntype unionIterator struct {\n\titems *nodeIteratorHeap // Nodes returned are the union of the ones in these iterators\n\tcount int               // Number of nodes scanned across all tries\n}\n\n// NewUnionIterator constructs a NodeIterator that iterates over elements in the union\n// of the provided NodeIterators. Returns the iterator, and a pointer to an integer\n// recording the number of nodes visited.\nfunc NewUnionIterator(iters []NodeIterator) (NodeIterator, *int) {\n\th := make(nodeIteratorHeap, len(iters))\n\tcopy(h, iters)\n\theap.Init(&h)\n\n\tui := &unionIterator{items: &h}\n\treturn ui, &ui.count\n}\n\nfunc (it *unionIterator) Hash() common.Hash {\n\treturn (*it.items)[0].Hash()\n}\n\nfunc (it *unionIterator) Parent() common.Hash {\n\treturn (*it.items)[0].Parent()\n}\n\nfunc (it *unionIterator) Leaf() bool {\n\treturn (*it.items)[0].Leaf()\n}\n\nfunc (it *unionIterator) LeafKey() []byte {\n\treturn (*it.items)[0].LeafKey()\n}\n\nfunc (it *unionIterator) LeafBlob() []byte {\n\treturn (*it.items)[0].LeafBlob()\n}\n\nfunc (it *unionIterator) LeafProof() [][]byte {\n\treturn (*it.items)[0].LeafProof()\n}\n\nfunc (it *unionIterator) Path() []byte {\n\treturn (*it.items)[0].Path()\n}\n\n// Next returns the next node in the union of tries being iterated over.\n//\n// It does this by maintaining a heap of iterators, sorted by the iteration\n// order of their next elements, with one entry for each source trie. Each\n// time Next() is called, it takes the least element from the heap to return,\n// advancing any other iterators that also point to that same element. These\n// iterators are called with descend=false, since we know that any nodes under\n// these nodes will also be duplicates, found in the currently selected iterator.\n// Whenever an iterator is advanced, it is pushed back into the heap if it still\n// has elements remaining.\n//\n// In the case that descend=false - eg, we're asked to ignore all subnodes of the\n// current node - we also advance any iterators in the heap that have the current\n// path as a prefix.\nfunc (it *unionIterator) Next(descend bool) bool {\n\tif len(*it.items) == 0 {\n\t\treturn false\n\t}\n\n\t// Get the next key from the union\n\tleast := heap.Pop(it.items).(NodeIterator)\n\n\t// Skip over other nodes as long as they're identical, or, if we're not descending, as\n\t// long as they have the same prefix as the current node.\n\tfor len(*it.items) > 0 && ((!descend && bytes.HasPrefix((*it.items)[0].Path(), least.Path())) || compareNodes(least, (*it.items)[0]) == 0) {\n\t\tskipped := heap.Pop(it.items).(NodeIterator)\n\t\t// Skip the whole subtree if the nodes have hashes; otherwise just skip this node\n\t\tif skipped.Next(skipped.Hash() == common.Hash{}) {\n\t\t\tit.count++\n\t\t\t// If there are more elements, push the iterator back on the heap\n\t\t\theap.Push(it.items, skipped)\n\t\t}\n\t}\n\tif least.Next(descend) {\n\t\tit.count++\n\t\theap.Push(it.items, least)\n\t}\n\treturn len(*it.items) > 0\n}\n\nfunc (it *unionIterator) Error() error {\n\tfor i := 0; i < len(*it.items); i++ {\n\t\tif err := (*it.items)[i].Error(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "trie/node.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nvar indices = []string{\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"[17]\"}\n\ntype node interface {\n\tfstring(string) string\n\tcache() (hashNode, bool)\n\tcanUnload(cachegen, cachelimit uint16) bool\n}\n\ntype (\n\tfullNode struct {\n\t\tChildren [17]node // Actual trie node data to encode/decode (needs custom encoder)\n\t\tflags    nodeFlag\n\t}\n\tshortNode struct {\n\t\tKey   []byte\n\t\tVal   node\n\t\tflags nodeFlag\n\t}\n\thashNode  []byte\n\tvalueNode []byte\n)\n\n// nilValueNode is used when collapsing internal trie nodes for hashing, since\n// unset children need to serialize correctly.\nvar nilValueNode = valueNode(nil)\n\n// EncodeRLP encodes a full node into the consensus RLP format.\nfunc (n *fullNode) EncodeRLP(w io.Writer) error {\n\tvar nodes [17]node\n\n\tfor i, child := range n.Children {\n\t\tif child != nil {\n\t\t\tnodes[i] = child\n\t\t} else {\n\t\t\tnodes[i] = nilValueNode\n\t\t}\n\t}\n\treturn rlp.Encode(w, nodes)\n}\n\nfunc (n *fullNode) copy() *fullNode   { copy := *n; return &copy }\nfunc (n *shortNode) copy() *shortNode { copy := *n; return &copy }\n\n// nodeFlag contains caching-related metadata about a node.\ntype nodeFlag struct {\n\thash  hashNode // cached hash of the node (may be nil)\n\tgen   uint16   // cache generation counter\n\tdirty bool     // whether the node has changes that must be written to the database\n}\n\n// canUnload tells whether a node can be unloaded.\nfunc (n *nodeFlag) canUnload(cachegen, cachelimit uint16) bool {\n\treturn !n.dirty && cachegen-n.gen >= cachelimit\n}\n\nfunc (n *fullNode) canUnload(gen, limit uint16) bool  { return n.flags.canUnload(gen, limit) }\nfunc (n *shortNode) canUnload(gen, limit uint16) bool { return n.flags.canUnload(gen, limit) }\nfunc (n hashNode) canUnload(uint16, uint16) bool      { return false }\nfunc (n valueNode) canUnload(uint16, uint16) bool     { return false }\n\nfunc (n *fullNode) cache() (hashNode, bool)  { return n.flags.hash, n.flags.dirty }\nfunc (n *shortNode) cache() (hashNode, bool) { return n.flags.hash, n.flags.dirty }\nfunc (n hashNode) cache() (hashNode, bool)   { return nil, true }\nfunc (n valueNode) cache() (hashNode, bool)  { return nil, true }\n\n// Pretty printing.\nfunc (n *fullNode) String() string  { return n.fstring(\"\") }\nfunc (n *shortNode) String() string { return n.fstring(\"\") }\nfunc (n hashNode) String() string   { return n.fstring(\"\") }\nfunc (n valueNode) String() string  { return n.fstring(\"\") }\n\nfunc (n *fullNode) fstring(ind string) string {\n\tresp := fmt.Sprintf(\"[\\n%s  \", ind)\n\tfor i, node := range n.Children {\n\t\tif node == nil {\n\t\t\tresp += fmt.Sprintf(\"%s: <nil> \", indices[i])\n\t\t} else {\n\t\t\tresp += fmt.Sprintf(\"%s: %v\", indices[i], node.fstring(ind+\"  \"))\n\t\t}\n\t}\n\treturn resp + fmt.Sprintf(\"\\n%s] \", ind)\n}\nfunc (n *shortNode) fstring(ind string) string {\n\treturn fmt.Sprintf(\"{%x: %v} \", n.Key, n.Val.fstring(ind+\"  \"))\n}\nfunc (n hashNode) fstring(ind string) string {\n\treturn fmt.Sprintf(\"<%x> \", []byte(n))\n}\nfunc (n valueNode) fstring(ind string) string {\n\treturn fmt.Sprintf(\"%x \", []byte(n))\n}\n\nfunc mustDecodeNode(hash, buf []byte, cachegen uint16) node {\n\tn, err := decodeNode(hash, buf, cachegen)\n\tif err != nil {\n\t\tpanic(fmt.Sprintf(\"node %x: %v\", hash, err))\n\t}\n\treturn n\n}\n\n// decodeNode parses the RLP encoding of a trie node.\nfunc decodeNode(hash, buf []byte, cachegen uint16) (node, error) {\n\tif len(buf) == 0 {\n\t\treturn nil, io.ErrUnexpectedEOF\n\t}\n\telems, _, err := rlp.SplitList(buf)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"decode error: %v\", err)\n\t}\n\tswitch c, _ := rlp.CountValues(elems); c {\n\tcase 2:\n\t\tn, err := decodeShort(hash, elems, cachegen)\n\t\treturn n, wrapError(err, \"short\")\n\tcase 17:\n\t\tn, err := decodeFull(hash, elems, cachegen)\n\t\treturn n, wrapError(err, \"full\")\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"invalid number of list elements: %v\", c)\n\t}\n}\n\nfunc decodeShort(hash, elems []byte, cachegen uint16) (node, error) {\n\tkbuf, rest, err := rlp.SplitString(elems)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tflag := nodeFlag{hash: hash, gen: cachegen}\n\tkey := compactToHex(kbuf)\n\tif hasTerm(key) {\n\t\t// value node\n\t\tval, _, err := rlp.SplitString(rest)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid value node: %v\", err)\n\t\t}\n\t\treturn &shortNode{key, append(valueNode{}, val...), flag}, nil\n\t}\n\tr, _, err := decodeRef(rest, cachegen)\n\tif err != nil {\n\t\treturn nil, wrapError(err, \"val\")\n\t}\n\treturn &shortNode{key, r, flag}, nil\n}\n\nfunc decodeFull(hash, elems []byte, cachegen uint16) (*fullNode, error) {\n\tn := &fullNode{flags: nodeFlag{hash: hash, gen: cachegen}}\n\tfor i := 0; i < 16; i++ {\n\t\tcld, rest, err := decodeRef(elems, cachegen)\n\t\tif err != nil {\n\t\t\treturn n, wrapError(err, fmt.Sprintf(\"[%d]\", i))\n\t\t}\n\t\tn.Children[i], elems = cld, rest\n\t}\n\tval, _, err := rlp.SplitString(elems)\n\tif err != nil {\n\t\treturn n, err\n\t}\n\tif len(val) > 0 {\n\t\tn.Children[16] = append(valueNode{}, val...)\n\t}\n\treturn n, nil\n}\n\nconst hashLen = len(common.Hash{})\n\nfunc decodeRef(buf []byte, cachegen uint16) (node, []byte, error) {\n\tkind, val, rest, err := rlp.Split(buf)\n\tif err != nil {\n\t\treturn nil, buf, err\n\t}\n\tswitch {\n\tcase kind == rlp.List:\n\t\t// 'embedded' node reference. The encoding must be smaller\n\t\t// than a hash in order to be valid.\n\t\tif size := len(buf) - len(rest); size > hashLen {\n\t\t\terr := fmt.Errorf(\"oversized embedded node (size is %d bytes, want size < %d)\", size, hashLen)\n\t\t\treturn nil, buf, err\n\t\t}\n\t\tn, err := decodeNode(nil, buf, cachegen)\n\t\treturn n, rest, err\n\tcase kind == rlp.String && len(val) == 0:\n\t\t// empty node\n\t\treturn nil, rest, nil\n\tcase kind == rlp.String && len(val) == 32:\n\t\treturn append(hashNode{}, val...), rest, nil\n\tdefault:\n\t\treturn nil, nil, fmt.Errorf(\"invalid RLP string size %d (want 0 or 32)\", len(val))\n\t}\n}\n\n// wraps a decoding error with information about the path to the\n// invalid child node (for debugging encoding issues).\ntype decodeError struct {\n\twhat  error\n\tstack []string\n}\n\nfunc wrapError(err error, ctx string) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\tif decErr, ok := err.(*decodeError); ok {\n\t\tdecErr.stack = append(decErr.stack, ctx)\n\t\treturn decErr\n\t}\n\treturn &decodeError{err, []string{ctx}}\n}\n\nfunc (err *decodeError) Error() string {\n\treturn fmt.Sprintf(\"%v (decode path: %s)\", err.what, strings.Join(err.stack, \"<-\"))\n}\n"
  },
  {
    "path": "trie/proof.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\n// Prove constructs a merkle proof for key. The result contains all encoded nodes\n// on the path to the value at key. The value itself is also included in the last\n// node and can be retrieved by verifying the proof.\n//\n// If the trie does not contain a value for key, the returned proof contains all\n// nodes of the longest existing prefix of the key (at least the root node), ending\n// with the node that proves the absence of the key.\nfunc (t *Trie) Prove(key []byte, fromLevel uint, proofDb serodb.Putter) error {\n\t// Collect all nodes on the path to key.\n\tkey = keybytesToHex(key)\n\tnodes := []node{}\n\ttn := t.root\n\tfor len(key) > 0 && tn != nil {\n\t\tswitch n := tn.(type) {\n\t\tcase *shortNode:\n\t\t\tif len(key) < len(n.Key) || !bytes.Equal(n.Key, key[:len(n.Key)]) {\n\t\t\t\t// The trie doesn't contain the key.\n\t\t\t\ttn = nil\n\t\t\t} else {\n\t\t\t\ttn = n.Val\n\t\t\t\tkey = key[len(n.Key):]\n\t\t\t}\n\t\t\tnodes = append(nodes, n)\n\t\tcase *fullNode:\n\t\t\ttn = n.Children[key[0]]\n\t\t\tkey = key[1:]\n\t\t\tnodes = append(nodes, n)\n\t\tcase hashNode:\n\t\t\tvar err error\n\t\t\ttn, err = t.resolveHash(n, nil)\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(fmt.Sprintf(\"Unhandled trie error: %v\", err))\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"%T: invalid node: %v\", tn, tn))\n\t\t}\n\t}\n\thasher := newHasher(0, 0, nil)\n\tfor i, n := range nodes {\n\t\t// Don't bother checking for errors here since hasher panics\n\t\t// if encoding doesn't work and we're not writing to any database.\n\t\tn, _, _ = hasher.hashChildren(n, nil)\n\t\thn, _ := hasher.store(n, nil, false)\n\t\tif hash, ok := hn.(hashNode); ok || i == 0 {\n\t\t\t// If the node's database encoding is a hash (or is the\n\t\t\t// root node), it becomes a proof element.\n\t\t\tif fromLevel > 0 {\n\t\t\t\tfromLevel--\n\t\t\t} else {\n\t\t\t\tenc, _ := rlp.EncodeToBytes(n)\n\t\t\t\tif !ok {\n\t\t\t\t\thash = crypto.Keccak256(enc)\n\t\t\t\t}\n\t\t\t\tproofDb.Put(hash, enc)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// Prove constructs a merkle proof for key. The result contains all encoded nodes\n// on the path to the value at key. The value itself is also included in the last\n// node and can be retrieved by verifying the proof.\n//\n// If the trie does not contain a value for key, the returned proof contains all\n// nodes of the longest existing prefix of the key (at least the root node), ending\n// with the node that proves the absence of the key.\nfunc (t *SecureTrie) Prove(key []byte, fromLevel uint, proofDb serodb.Putter) error {\n\treturn t.trie.Prove(key, fromLevel, proofDb)\n}\n\n// VerifyProof checks merkle proofs. The given proof must contain the value for\n// key in a trie with the given root hash. VerifyProof returns an error if the\n// proof contains invalid trie nodes or the wrong value.\nfunc VerifyProof(rootHash common.Hash, key []byte, proofDb DatabaseReader) (value []byte, nodes int, err error) {\n\tkey = keybytesToHex(key)\n\twantHash := rootHash\n\tfor i := 0; ; i++ {\n\t\tbuf, _ := proofDb.Get(wantHash[:])\n\t\tif buf == nil {\n\t\t\treturn nil, i, fmt.Errorf(\"proof node %d (hash %064x) missing\", i, wantHash)\n\t\t}\n\t\tn, err := decodeNode(wantHash[:], buf, 0)\n\t\tif err != nil {\n\t\t\treturn nil, i, fmt.Errorf(\"bad proof node %d: %v\", i, err)\n\t\t}\n\t\tkeyrest, cld := get(n, key)\n\t\tswitch cld := cld.(type) {\n\t\tcase nil:\n\t\t\t// The trie doesn't contain the key.\n\t\t\treturn nil, i, nil\n\t\tcase hashNode:\n\t\t\tkey = keyrest\n\t\t\tcopy(wantHash[:], cld)\n\t\tcase valueNode:\n\t\t\treturn cld, i + 1, nil\n\t\t}\n\t}\n}\n\nfunc get(tn node, key []byte) ([]byte, node) {\n\tfor {\n\t\tswitch n := tn.(type) {\n\t\tcase *shortNode:\n\t\t\tif len(key) < len(n.Key) || !bytes.Equal(n.Key, key[:len(n.Key)]) {\n\t\t\t\treturn nil, nil\n\t\t\t}\n\t\t\ttn = n.Val\n\t\t\tkey = key[len(n.Key):]\n\t\tcase *fullNode:\n\t\t\ttn = n.Children[key[0]]\n\t\t\tkey = key[1:]\n\t\tcase hashNode:\n\t\t\treturn key, n\n\t\tcase nil:\n\t\t\treturn key, nil\n\t\tcase valueNode:\n\t\t\treturn nil, n\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"%T: invalid node: %v\", tn, tn))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "trie/secure_trie.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\n// SecureTrie wraps a trie with key hashing. In a secure trie, all\n// access operations hash the key using keccak256. This prevents\n// calling code from creating long chains of nodes that\n// increase the access time.\n//\n// Contrary to a regular trie, a SecureTrie can only be created with\n// New and must have an attached database. The database also stores\n// the preimage of each key.\n//\n// SecureTrie is not safe for concurrent use.\ntype SecureTrie struct {\n\ttrie             Trie\n\thashKeyBuf       [common.HashLength]byte\n\tsecKeyCache      map[string][]byte\n\tsecKeyCacheOwner *SecureTrie // Pointer to self, replace the key cache on mismatch\n}\n\n// NewSecure creates a trie with an existing root node from a backing database\n// and optional intermediate in-memory node pool.\n//\n// If root is the zero hash or the sha3 hash of an empty string, the\n// trie is initially empty. Otherwise, New will panic if db is nil\n// and returns MissingNodeError if the root node cannot be found.\n//\n// Accessing the trie loads nodes from the database or node pool on demand.\n// Loaded nodes are kept around until their 'cache generation' expires.\n// A new cache generation is created by each call to Commit.\n// cachelimit sets the number of past cache generations to keep.\nfunc NewSecure(root common.Hash, db *Database, cachelimit uint16) (*SecureTrie, error) {\n\tif db == nil {\n\t\tpanic(\"trie.NewSecure called without a database\")\n\t}\n\ttrie, err := New(root, db)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ttrie.SetCacheLimit(cachelimit)\n\treturn &SecureTrie{trie: *trie}, nil\n}\n\n// Get returns the value for key stored in the trie.\n// The value bytes must not be modified by the caller.\nfunc (t *SecureTrie) Get(key []byte) []byte {\n\tres, err := t.TryGet(key)\n\tif err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Unhandled trie error: %v\", err))\n\t}\n\treturn res\n}\n\n// TryGet returns the value for key stored in the trie.\n// The value bytes must not be modified by the caller.\n// If a node was not found in the database, a MissingNodeError is returned.\nfunc (t *SecureTrie) TryGet(key []byte) ([]byte, error) {\n\treturn t.trie.TryGet(t.hashKey(key))\n}\n\n// Update associates key with value in the trie. Subsequent calls to\n// Get will return value. If value has length zero, any existing value\n// is deleted from the trie and calls to Get will return nil.\n//\n// The value bytes must not be modified by the caller while they are\n// stored in the trie.\nfunc (t *SecureTrie) Update(key, value []byte) {\n\tif err := t.TryUpdate(key, value); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Unhandled trie error: %v\", err))\n\t}\n}\n\n// TryUpdate associates key with value in the trie. Subsequent calls to\n// Get will return value. If value has length zero, any existing value\n// is deleted from the trie and calls to Get will return nil.\n//\n// The value bytes must not be modified by the caller while they are\n// stored in the trie.\n//\n// If a node was not found in the database, a MissingNodeError is returned.\nfunc (t *SecureTrie) TryUpdate(key, value []byte) error {\n\thk := t.hashKey(key)\n\terr := t.trie.TryUpdate(hk, value)\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.getSecKeyCache()[string(hk)] = common.CopyBytes(key)\n\treturn nil\n}\n\n// Delete removes any existing value for key from the trie.\nfunc (t *SecureTrie) Delete(key []byte) {\n\tif err := t.TryDelete(key); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Unhandled trie error: %v\", err))\n\t}\n}\n\n// TryDelete removes any existing value for key from the trie.\n// If a node was not found in the database, a MissingNodeError is returned.\nfunc (t *SecureTrie) TryDelete(key []byte) error {\n\thk := t.hashKey(key)\n\tdelete(t.getSecKeyCache(), string(hk))\n\treturn t.trie.TryDelete(hk)\n}\n\n// GetKey returns the sha3 preimage of a hashed key that was\n// previously used to store a value.\nfunc (t *SecureTrie) GetKey(shaKey []byte) []byte {\n\tif key, ok := t.getSecKeyCache()[string(shaKey)]; ok {\n\t\treturn key\n\t}\n\tkey, _ := t.trie.db.preimage(common.BytesToHash(shaKey))\n\treturn key\n}\n\n// Commit writes all nodes and the secure hash pre-images to the trie's database.\n// Nodes are stored with their sha3 hash as the key.\n//\n// Committing flushes nodes from memory. Subsequent Get calls will load nodes\n// from the database.\nfunc (t *SecureTrie) Commit(onleaf LeafCallback) (root common.Hash, err error) {\n\t// Write all the pre-images to the actual disk database\n\tif len(t.getSecKeyCache()) > 0 {\n\t\tt.trie.db.lock.Lock()\n\t\tfor hk, key := range t.secKeyCache {\n\t\t\tt.trie.db.insertPreimage(common.BytesToHash([]byte(hk)), key)\n\t\t}\n\t\tt.trie.db.lock.Unlock()\n\n\t\tt.secKeyCache = make(map[string][]byte)\n\t}\n\t// Commit the trie to its intermediate node database\n\treturn t.trie.Commit(onleaf)\n}\n\n// Hash returns the root hash of SecureTrie. It does not write to the\n// database and can be used even if the trie doesn't have one.\nfunc (t *SecureTrie) Hash() common.Hash {\n\treturn t.trie.Hash()\n}\n\n// Root returns the root hash of SecureTrie.\n// Deprecated: use Hash instead.\nfunc (t *SecureTrie) Root() []byte {\n\treturn t.trie.Root()\n}\n\n// Copy returns a copy of SecureTrie.\nfunc (t *SecureTrie) Copy() *SecureTrie {\n\tcpy := *t\n\treturn &cpy\n}\n\n// NodeIterator returns an iterator that returns nodes of the underlying trie. Iteration\n// starts at the key after the given start key.\nfunc (t *SecureTrie) NodeIterator(start []byte) NodeIterator {\n\treturn t.trie.NodeIterator(start)\n}\n\n// hashKey returns the hash of key as an ephemeral buffer.\n// The caller must not hold onto the return value because it will become\n// invalid on the next call to hashKey or secKey.\nfunc (t *SecureTrie) hashKey(key []byte) []byte {\n\th := newHasher(0, 0, nil)\n\th.sha.Reset()\n\th.sha.Write(key)\n\tbuf := h.sha.Sum(t.hashKeyBuf[:0])\n\treturnHasherToPool(h)\n\treturn buf\n}\n\n// getSecKeyCache returns the current secure key cache, creating a new one if\n// ownership changed (i.e. the current secure trie is a copy of another owning\n// the actual cache).\nfunc (t *SecureTrie) getSecKeyCache() map[string][]byte {\n\tif t != t.secKeyCacheOwner {\n\t\tt.secKeyCacheOwner = t\n\t\tt.secKeyCache = make(map[string][]byte)\n\t}\n\treturn t.secKeyCache\n}\n"
  },
  {
    "path": "trie/sync.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\npackage trie\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"gopkg.in/karalabe/cookiejar.v2/collections/prque\"\n)\n\n// ErrNotRequested is returned by the trie sync when it's requested to process a\n// node it did not request.\nvar ErrNotRequested = errors.New(\"not requested\")\n\n// ErrAlreadyProcessed is returned by the trie sync when it's requested to process a\n// node it already processed previously.\nvar ErrAlreadyProcessed = errors.New(\"already processed\")\n\n// request represents a scheduled or already in-flight state retrieval request.\ntype request struct {\n\thash common.Hash // Hash of the node data content to retrieve\n\tdata []byte      // Data content of the node, cached until all subtrees complete\n\traw  bool        // Whether this is a raw entry (code) or a trie node\n\n\tparents []*request // Parent state nodes referencing this entry (notify all upon completion)\n\tdepth   int        // Depth level within the trie the node is located to prioritise DFS\n\tdeps    int        // Number of dependencies before allowed to commit this node\n\n\tcallback LeafCallback // Callback to invoke if a leaf node it reached on this branch\n}\n\n// SyncResult is a simple list to return missing nodes along with their request\n// hashes.\ntype SyncResult struct {\n\tHash common.Hash // Hash of the originally unknown trie node\n\tData []byte      // Data content of the retrieved node\n}\n\n// syncMemBatch is an in-memory buffer of successfully downloaded but not yet\n// persisted data items.\ntype syncMemBatch struct {\n\tbatch map[common.Hash][]byte // In-memory membatch of recently completed items\n\torder []common.Hash          // Order of completion to prevent out-of-order data loss\n}\n\n// newSyncMemBatch allocates a new memory-buffer for not-yet persisted trie nodes.\nfunc newSyncMemBatch() *syncMemBatch {\n\treturn &syncMemBatch{\n\t\tbatch: make(map[common.Hash][]byte),\n\t\torder: make([]common.Hash, 0, 256),\n\t}\n}\n\n// Sync is the main state trie synchronisation scheduler, which provides yet\n// unknown trie hashes to retrieve, accepts node data associated with said hashes\n// and reconstructs the trie step by step until all is done.\ntype Sync struct {\n\tdatabase DatabaseReader           // Persistent database to check for existing entries\n\tmembatch *syncMemBatch            // Memory buffer to avoid frequest database writes\n\trequests map[common.Hash]*request // Pending requests pertaining to a key hash\n\tqueue    *prque.Prque             // Priority queue with the pending requests\n}\n\n// NewSync creates a new trie data download scheduler.\nfunc NewSync(root common.Hash, database DatabaseReader, callback LeafCallback) *Sync {\n\tts := &Sync{\n\t\tdatabase: database,\n\t\tmembatch: newSyncMemBatch(),\n\t\trequests: make(map[common.Hash]*request),\n\t\tqueue:    prque.New(),\n\t}\n\tts.AddSubTrie(root, 0, common.Hash{}, callback)\n\treturn ts\n}\n\n// AddSubTrie registers a new trie to the sync code, rooted at the designated parent.\nfunc (s *Sync) AddSubTrie(root common.Hash, depth int, parent common.Hash, callback LeafCallback) {\n\t// Short circuit if the trie is empty or already known\n\tif root == emptyRoot {\n\t\treturn\n\t}\n\tif _, ok := s.membatch.batch[root]; ok {\n\t\treturn\n\t}\n\tkey := root.Bytes()\n\tblob, _ := s.database.Get(key)\n\tif local, err := decodeNode(key, blob, 0); local != nil && err == nil {\n\t\treturn\n\t}\n\t// Assemble the new sub-trie sync request\n\treq := &request{\n\t\thash:     root,\n\t\tdepth:    depth,\n\t\tcallback: callback,\n\t}\n\t// If this sub-trie has a designated parent, link them together\n\tif parent != (common.Hash{}) {\n\t\tancestor := s.requests[parent]\n\t\tif ancestor == nil {\n\t\t\tpanic(fmt.Sprintf(\"sub-trie ancestor not found: %x\", parent))\n\t\t}\n\t\tancestor.deps++\n\t\treq.parents = append(req.parents, ancestor)\n\t}\n\ts.schedule(req)\n}\n\n// AddRawEntry schedules the direct retrieval of a state entry that should not be\n// interpreted as a trie node, but rather accepted and stored into the database\n// as is. This method's goal is to support misc state metadata retrievals (e.g.\n// contract code).\nfunc (s *Sync) AddRawEntry(hash common.Hash, depth int, parent common.Hash) {\n\t// Short circuit if the entry is empty or already known\n\tif hash == emptyState {\n\t\treturn\n\t}\n\tif _, ok := s.membatch.batch[hash]; ok {\n\t\treturn\n\t}\n\tif ok, _ := s.database.Has(hash.Bytes()); ok {\n\t\treturn\n\t}\n\t// Assemble the new sub-trie sync request\n\treq := &request{\n\t\thash:  hash,\n\t\traw:   true,\n\t\tdepth: depth,\n\t}\n\t// If this sub-trie has a designated parent, link them together\n\tif parent != (common.Hash{}) {\n\t\tancestor := s.requests[parent]\n\t\tif ancestor == nil {\n\t\t\tpanic(fmt.Sprintf(\"raw-entry ancestor not found: %x\", parent))\n\t\t}\n\t\tancestor.deps++\n\t\treq.parents = append(req.parents, ancestor)\n\t}\n\ts.schedule(req)\n}\n\n// Missing retrieves the known missing nodes from the trie for retrieval.\nfunc (s *Sync) Missing(max int) []common.Hash {\n\trequests := []common.Hash{}\n\tfor !s.queue.Empty() && (max == 0 || len(requests) < max) {\n\t\trequests = append(requests, s.queue.PopItem().(common.Hash))\n\t}\n\treturn requests\n}\n\n// Process injects a batch of retrieved trie nodes data, returning if something\n// was committed to the database and also the index of an entry if processing of\n// it failed.\nfunc (s *Sync) Process(results []SyncResult) (bool, int, error) {\n\tcommitted := false\n\n\tfor i, item := range results {\n\t\t// If the item was not requested, bail out\n\t\trequest := s.requests[item.Hash]\n\t\tif request == nil {\n\t\t\treturn committed, i, ErrNotRequested\n\t\t}\n\t\tif request.data != nil {\n\t\t\treturn committed, i, ErrAlreadyProcessed\n\t\t}\n\t\t// If the item is a raw entry request, commit directly\n\t\tif request.raw {\n\t\t\trequest.data = item.Data\n\t\t\ts.commit(request)\n\t\t\tcommitted = true\n\t\t\tcontinue\n\t\t}\n\t\t// Decode the node data content and update the request\n\t\tnode, err := decodeNode(item.Hash[:], item.Data, 0)\n\t\tif err != nil {\n\t\t\treturn committed, i, err\n\t\t}\n\t\trequest.data = item.Data\n\n\t\t// Create and schedule a request for all the children nodes\n\t\trequests, err := s.children(request, node)\n\t\tif err != nil {\n\t\t\treturn committed, i, err\n\t\t}\n\t\tif len(requests) == 0 && request.deps == 0 {\n\t\t\ts.commit(request)\n\t\t\tcommitted = true\n\t\t\tcontinue\n\t\t}\n\t\trequest.deps += len(requests)\n\t\tfor _, child := range requests {\n\t\t\ts.schedule(child)\n\t\t}\n\t}\n\treturn committed, 0, nil\n}\n\n// Commit flushes the data stored in the internal membatch out to persistent\n// storage, returning the number of items written and any occurred error.\nfunc (s *Sync) Commit(dbw serodb.Putter) (int, error) {\n\t// Dump the membatch into a database dbw\n\tfor i, key := range s.membatch.order {\n\t\tif err := dbw.Put(key[:], s.membatch.batch[key]); err != nil {\n\t\t\treturn i, err\n\t\t}\n\t}\n\twritten := len(s.membatch.order)\n\n\t// Drop the membatch data and return\n\ts.membatch = newSyncMemBatch()\n\treturn written, nil\n}\n\n// Pending returns the number of state entries currently pending for download.\nfunc (s *Sync) Pending() int {\n\treturn len(s.requests)\n}\n\n// schedule inserts a new state retrieval request into the fetch queue. If there\n// is already a pending request for this node, the new request will be discarded\n// and only a parent reference added to the old one.\nfunc (s *Sync) schedule(req *request) {\n\t// If we're already requesting this node, add a new reference and stop\n\tif old, ok := s.requests[req.hash]; ok {\n\t\told.parents = append(old.parents, req.parents...)\n\t\treturn\n\t}\n\t// Schedule the request for future retrieval\n\ts.queue.Push(req.hash, float32(req.depth))\n\ts.requests[req.hash] = req\n}\n\n// children retrieves all the missing children of a state trie entry for future\n// retrieval scheduling.\nfunc (s *Sync) children(req *request, object node) ([]*request, error) {\n\t// Gather all the children of the node, irrelevant whether known or not\n\ttype child struct {\n\t\tnode  node\n\t\tdepth int\n\t}\n\tchildren := []child{}\n\n\tswitch node := (object).(type) {\n\tcase *shortNode:\n\t\tchildren = []child{{\n\t\t\tnode:  node.Val,\n\t\t\tdepth: req.depth + len(node.Key),\n\t\t}}\n\tcase *fullNode:\n\t\tfor i := 0; i < 17; i++ {\n\t\t\tif node.Children[i] != nil {\n\t\t\t\tchildren = append(children, child{\n\t\t\t\t\tnode:  node.Children[i],\n\t\t\t\t\tdepth: req.depth + 1,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"unknown node: %+v\", node))\n\t}\n\t// Iterate over the children, and request all unknown ones\n\trequests := make([]*request, 0, len(children))\n\tfor _, child := range children {\n\t\t// Notify any external watcher of a new key/value node\n\t\tif req.callback != nil {\n\t\t\tif node, ok := (child.node).(valueNode); ok {\n\t\t\t\tif err := req.callback(node, req.hash); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// If the child references another node, resolve or schedule\n\t\tif node, ok := (child.node).(hashNode); ok {\n\t\t\t// Try to resolve the node from the local database\n\t\t\thash := common.BytesToHash(node)\n\t\t\tif _, ok := s.membatch.batch[hash]; ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif ok, _ := s.database.Has(node); ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Locally unknown node, schedule for retrieval\n\t\t\trequests = append(requests, &request{\n\t\t\t\thash:     hash,\n\t\t\t\tparents:  []*request{req},\n\t\t\t\tdepth:    child.depth,\n\t\t\t\tcallback: req.callback,\n\t\t\t})\n\t\t}\n\t}\n\treturn requests, nil\n}\n\n// commit finalizes a retrieval request and stores it into the membatch. If any\n// of the referencing parent requests complete due to this commit, they are also\n// committed themselves.\nfunc (s *Sync) commit(req *request) (err error) {\n\t// Write the node content to the membatch\n\ts.membatch.batch[req.hash] = req.data\n\ts.membatch.order = append(s.membatch.order, req.hash)\n\n\tdelete(s.requests, req.hash)\n\n\t// Check all parents for completion\n\tfor _, parent := range req.parents {\n\t\tparent.deps--\n\t\tif parent.deps == 0 {\n\t\t\tif err := s.commit(parent); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "trie/trie.go",
    "content": "// Copyright 2014 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package trie implements Merkle Patricia Tries.\npackage trie\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/metrics\"\n)\n\nvar (\n\t// emptyRoot is the known root hash of an empty trie.\n\temptyRoot = common.HexToHash(\"56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421\")\n\n\t// emptyState is the known hash of an empty state trie entry.\n\temptyState = crypto.Keccak256Hash(nil)\n)\n\nvar (\n\tcacheMissCounter   = metrics.NewRegisteredCounter(\"trie/cachemiss\", nil)\n\tcacheUnloadCounter = metrics.NewRegisteredCounter(\"trie/cacheunload\", nil)\n)\n\n// CacheMisses retrieves a global counter measuring the number of cache misses\n// the trie had since process startup. This isn't useful for anything apart from\n// trie debugging purposes.\nfunc CacheMisses() int64 {\n\treturn cacheMissCounter.Count()\n}\n\n// CacheUnloads retrieves a global counter measuring the number of cache unloads\n// the trie did since process startup. This isn't useful for anything apart from\n// trie debugging purposes.\nfunc CacheUnloads() int64 {\n\treturn cacheUnloadCounter.Count()\n}\n\n// LeafCallback is a callback type invoked when a trie operation reaches a leaf\n// node. It's used by state sync and commit to allow handling external references\n// between account and storage tries.\ntype LeafCallback func(leaf []byte, parent common.Hash) error\n\n// Trie is a Merkle Patricia Trie.\n// The zero value is an empty trie with no database.\n// Use New to create a trie that sits on top of a database.\n//\n// Trie is not safe for concurrent use.\ntype Trie struct {\n\tdb           *Database\n\troot         node\n\toriginalRoot common.Hash\n\n\t// Cache generation values.\n\t// cachegen increases by one with each commit operation.\n\t// new nodes are tagged with the current generation and unloaded\n\t// when their generation is older than than cachegen-cachelimit.\n\tcachegen, cachelimit uint16\n}\n\n// SetCacheLimit sets the number of 'cache generations' to keep.\n// A cache generation is created by a call to Commit.\nfunc (t *Trie) SetCacheLimit(l uint16) {\n\tt.cachelimit = l\n}\n\n// newFlag returns the cache flag value for a newly created node.\nfunc (t *Trie) newFlag() nodeFlag {\n\treturn nodeFlag{dirty: true, gen: t.cachegen}\n}\n\n// New creates a trie with an existing root node from db.\n//\n// If root is the zero hash or the sha3 hash of an empty string, the\n// trie is initially empty and does not require a database. Otherwise,\n// New will panic if db is nil and returns a MissingNodeError if root does\n// not exist in the database. Accessing the trie loads nodes from db on demand.\nfunc New(root common.Hash, db *Database) (*Trie, error) {\n\tif db == nil {\n\t\tpanic(\"trie.New called without a database\")\n\t}\n\ttrie := &Trie{\n\t\tdb:           db,\n\t\toriginalRoot: root,\n\t}\n\tif root != (common.Hash{}) && root != emptyRoot {\n\t\trootnode, err := trie.resolveHash(root[:], nil)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\ttrie.root = rootnode\n\t}\n\treturn trie, nil\n}\n\n// NodeIterator returns an iterator that returns nodes of the trie. Iteration starts at\n// the key after the given start key.\nfunc (t *Trie) NodeIterator(start []byte) NodeIterator {\n\treturn newNodeIterator(t, start)\n}\n\n// Get returns the value for key stored in the trie.\n// The value bytes must not be modified by the caller.\nfunc (t *Trie) Get(key []byte) []byte {\n\tres, err := t.TryGet(key)\n\tif err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Unhandled trie error: %v\", err))\n\t}\n\treturn res\n}\n\n// TryGet returns the value for key stored in the trie.\n// The value bytes must not be modified by the caller.\n// If a node was not found in the database, a MissingNodeError is returned.\nfunc (t *Trie) TryGet(key []byte) ([]byte, error) {\n\tkey = keybytesToHex(key)\n\tvalue, newroot, didResolve, err := t.tryGet(t.root, key, 0)\n\tif err == nil && didResolve {\n\t\tt.root = newroot\n\t}\n\treturn value, err\n}\n\nfunc (t *Trie) tryGet(origNode node, key []byte, pos int) (value []byte, newnode node, didResolve bool, err error) {\n\tswitch n := (origNode).(type) {\n\tcase nil:\n\t\treturn nil, nil, false, nil\n\tcase valueNode:\n\t\treturn n, n, false, nil\n\tcase *shortNode:\n\t\tif len(key)-pos < len(n.Key) || !bytes.Equal(n.Key, key[pos:pos+len(n.Key)]) {\n\t\t\t// key not found in trie\n\t\t\treturn nil, n, false, nil\n\t\t}\n\t\tvalue, newnode, didResolve, err = t.tryGet(n.Val, key, pos+len(n.Key))\n\t\tif err == nil && didResolve {\n\t\t\tn = n.copy()\n\t\t\tn.Val = newnode\n\t\t\tn.flags.gen = t.cachegen\n\t\t}\n\t\treturn value, n, didResolve, err\n\tcase *fullNode:\n\t\tvalue, newnode, didResolve, err = t.tryGet(n.Children[key[pos]], key, pos+1)\n\t\tif err == nil && didResolve {\n\t\t\tn = n.copy()\n\t\t\tn.flags.gen = t.cachegen\n\t\t\tn.Children[key[pos]] = newnode\n\t\t}\n\t\treturn value, n, didResolve, err\n\tcase hashNode:\n\t\tchild, err := t.resolveHash(n, key[:pos])\n\t\tif err != nil {\n\t\t\treturn nil, n, true, err\n\t\t}\n\t\tvalue, newnode, _, err := t.tryGet(child, key, pos)\n\t\treturn value, newnode, true, err\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"%T: invalid node: %v\", origNode, origNode))\n\t}\n}\n\n// Update associates key with value in the trie. Subsequent calls to\n// Get will return value. If value has length zero, any existing value\n// is deleted from the trie and calls to Get will return nil.\n//\n// The value bytes must not be modified by the caller while they are\n// stored in the trie.\nfunc (t *Trie) Update(key, value []byte) {\n\tif err := t.TryUpdate(key, value); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Unhandled trie error: %v\", err))\n\t}\n}\n\n// TryUpdate associates key with value in the trie. Subsequent calls to\n// Get will return value. If value has length zero, any existing value\n// is deleted from the trie and calls to Get will return nil.\n//\n// The value bytes must not be modified by the caller while they are\n// stored in the trie.\n//\n// If a node was not found in the database, a MissingNodeError is returned.\nfunc (t *Trie) TryUpdate(key, value []byte) error {\n\tk := keybytesToHex(key)\n\tif len(value) != 0 {\n\t\t_, n, err := t.insert(t.root, nil, k, valueNode(value))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tt.root = n\n\t} else {\n\t\t_, n, err := t.delete(t.root, nil, k)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tt.root = n\n\t}\n\treturn nil\n}\n\nfunc (t *Trie) insert(n node, prefix, key []byte, value node) (bool, node, error) {\n\tif len(key) == 0 {\n\t\tif v, ok := n.(valueNode); ok {\n\t\t\treturn !bytes.Equal(v, value.(valueNode)), value, nil\n\t\t}\n\t\treturn true, value, nil\n\t}\n\tswitch n := n.(type) {\n\tcase *shortNode:\n\t\tmatchlen := prefixLen(key, n.Key)\n\t\t// If the whole key matches, keep this short node as is\n\t\t// and only update the value.\n\t\tif matchlen == len(n.Key) {\n\t\t\tdirty, nn, err := t.insert(n.Val, append(prefix, key[:matchlen]...), key[matchlen:], value)\n\t\t\tif !dirty || err != nil {\n\t\t\t\treturn false, n, err\n\t\t\t}\n\t\t\treturn true, &shortNode{n.Key, nn, t.newFlag()}, nil\n\t\t}\n\t\t// Otherwise branch out at the index where they differ.\n\t\tbranch := &fullNode{flags: t.newFlag()}\n\t\tvar err error\n\t\t_, branch.Children[n.Key[matchlen]], err = t.insert(nil, append(prefix, n.Key[:matchlen+1]...), n.Key[matchlen+1:], n.Val)\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\t\t_, branch.Children[key[matchlen]], err = t.insert(nil, append(prefix, key[:matchlen+1]...), key[matchlen+1:], value)\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\t\t// Replace this shortNode with the branch if it occurs at index 0.\n\t\tif matchlen == 0 {\n\t\t\treturn true, branch, nil\n\t\t}\n\t\t// Otherwise, replace it with a short node leading up to the branch.\n\t\treturn true, &shortNode{key[:matchlen], branch, t.newFlag()}, nil\n\n\tcase *fullNode:\n\t\tdirty, nn, err := t.insert(n.Children[key[0]], append(prefix, key[0]), key[1:], value)\n\t\tif !dirty || err != nil {\n\t\t\treturn false, n, err\n\t\t}\n\t\tn = n.copy()\n\t\tn.flags = t.newFlag()\n\t\tn.Children[key[0]] = nn\n\t\treturn true, n, nil\n\n\tcase nil:\n\t\treturn true, &shortNode{key, value, t.newFlag()}, nil\n\n\tcase hashNode:\n\t\t// We've hit a part of the trie that isn't loaded yet. Load\n\t\t// the node and insert into it. This leaves all child nodes on\n\t\t// the path to the value in the trie.\n\t\trn, err := t.resolveHash(n, prefix)\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\t\tdirty, nn, err := t.insert(rn, prefix, key, value)\n\t\tif !dirty || err != nil {\n\t\t\treturn false, rn, err\n\t\t}\n\t\treturn true, nn, nil\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"%T: invalid node: %v\", n, n))\n\t}\n}\n\n// Delete removes any existing value for key from the trie.\nfunc (t *Trie) Delete(key []byte) {\n\tif err := t.TryDelete(key); err != nil {\n\t\tlog.Error(fmt.Sprintf(\"Unhandled trie error: %v\", err))\n\t}\n}\n\n// TryDelete removes any existing value for key from the trie.\n// If a node was not found in the database, a MissingNodeError is returned.\nfunc (t *Trie) TryDelete(key []byte) error {\n\tk := keybytesToHex(key)\n\t_, n, err := t.delete(t.root, nil, k)\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.root = n\n\treturn nil\n}\n\n// delete returns the new root of the trie with key deleted.\n// It reduces the trie to minimal form by simplifying\n// nodes on the way up after deleting recursively.\nfunc (t *Trie) delete(n node, prefix, key []byte) (bool, node, error) {\n\tswitch n := n.(type) {\n\tcase *shortNode:\n\t\tmatchlen := prefixLen(key, n.Key)\n\t\tif matchlen < len(n.Key) {\n\t\t\treturn false, n, nil // don't replace n on mismatch\n\t\t}\n\t\tif matchlen == len(key) {\n\t\t\treturn true, nil, nil // remove n entirely for whole matches\n\t\t}\n\t\t// The key is longer than n.Key. Remove the remaining suffix\n\t\t// from the subtrie. Child can never be nil here since the\n\t\t// subtrie must contain at least two other values with keys\n\t\t// longer than n.Key.\n\t\tdirty, child, err := t.delete(n.Val, append(prefix, key[:len(n.Key)]...), key[len(n.Key):])\n\t\tif !dirty || err != nil {\n\t\t\treturn false, n, err\n\t\t}\n\t\tswitch child := child.(type) {\n\t\tcase *shortNode:\n\t\t\t// Deleting from the subtrie reduced it to another\n\t\t\t// short node. Merge the nodes to avoid creating a\n\t\t\t// shortNode{..., shortNode{...}}. Use concat (which\n\t\t\t// always creates a new slice) instead of append to\n\t\t\t// avoid modifying n.Key since it might be shared with\n\t\t\t// other nodes.\n\t\t\treturn true, &shortNode{concat(n.Key, child.Key...), child.Val, t.newFlag()}, nil\n\t\tdefault:\n\t\t\treturn true, &shortNode{n.Key, child, t.newFlag()}, nil\n\t\t}\n\n\tcase *fullNode:\n\t\tdirty, nn, err := t.delete(n.Children[key[0]], append(prefix, key[0]), key[1:])\n\t\tif !dirty || err != nil {\n\t\t\treturn false, n, err\n\t\t}\n\t\tn = n.copy()\n\t\tn.flags = t.newFlag()\n\t\tn.Children[key[0]] = nn\n\n\t\t// Check how many non-nil entries are left after deleting and\n\t\t// reduce the full node to a short node if only one entry is\n\t\t// left. Since n must've contained at least two children\n\t\t// before deletion (otherwise it would not be a full node) n\n\t\t// can never be reduced to nil.\n\t\t//\n\t\t// When the loop is done, pos contains the index of the single\n\t\t// value that is left in n or -2 if n contains at least two\n\t\t// values.\n\t\tpos := -1\n\t\tfor i, cld := range n.Children {\n\t\t\tif cld != nil {\n\t\t\t\tif pos == -1 {\n\t\t\t\t\tpos = i\n\t\t\t\t} else {\n\t\t\t\t\tpos = -2\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif pos >= 0 {\n\t\t\tif pos != 16 {\n\t\t\t\t// If the remaining entry is a short node, it replaces\n\t\t\t\t// n and its key gets the missing nibble tacked to the\n\t\t\t\t// front. This avoids creating an invalid\n\t\t\t\t// shortNode{..., shortNode{...}}.  Since the entry\n\t\t\t\t// might not be loaded yet, resolve it just for this\n\t\t\t\t// check.\n\t\t\t\tcnode, err := t.resolve(n.Children[pos], prefix)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn false, nil, err\n\t\t\t\t}\n\t\t\t\tif cnode, ok := cnode.(*shortNode); ok {\n\t\t\t\t\tk := append([]byte{byte(pos)}, cnode.Key...)\n\t\t\t\t\treturn true, &shortNode{k, cnode.Val, t.newFlag()}, nil\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Otherwise, n is replaced by a one-nibble short node\n\t\t\t// containing the child.\n\t\t\treturn true, &shortNode{[]byte{byte(pos)}, n.Children[pos], t.newFlag()}, nil\n\t\t}\n\t\t// n still contains at least two values and cannot be reduced.\n\t\treturn true, n, nil\n\n\tcase valueNode:\n\t\treturn true, nil, nil\n\n\tcase nil:\n\t\treturn false, nil, nil\n\n\tcase hashNode:\n\t\t// We've hit a part of the trie that isn't loaded yet. Load\n\t\t// the node and delete from it. This leaves all child nodes on\n\t\t// the path to the value in the trie.\n\t\trn, err := t.resolveHash(n, prefix)\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\t\tdirty, nn, err := t.delete(rn, prefix, key)\n\t\tif !dirty || err != nil {\n\t\t\treturn false, rn, err\n\t\t}\n\t\treturn true, nn, nil\n\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"%T: invalid node: %v (%v)\", n, n, key))\n\t}\n}\n\nfunc concat(s1 []byte, s2 ...byte) []byte {\n\tr := make([]byte, len(s1)+len(s2))\n\tcopy(r, s1)\n\tcopy(r[len(s1):], s2)\n\treturn r\n}\n\nfunc (t *Trie) resolve(n node, prefix []byte) (node, error) {\n\tif n, ok := n.(hashNode); ok {\n\t\treturn t.resolveHash(n, prefix)\n\t}\n\treturn n, nil\n}\n\nfunc (t *Trie) resolveHash(n hashNode, prefix []byte) (node, error) {\n\tcacheMissCounter.Inc(1)\n\n\thash := common.BytesToHash(n)\n\tif node := t.db.node(hash, t.cachegen); node != nil {\n\t\treturn node, nil\n\t}\n\treturn nil, &MissingNodeError{NodeHash: hash, Path: prefix}\n}\n\n// Root returns the root hash of the trie.\n// Deprecated: use Hash instead.\nfunc (t *Trie) Root() []byte { return t.Hash().Bytes() }\n\n// Hash returns the root hash of the trie. It does not write to the\n// database and can be used even if the trie doesn't have one.\nfunc (t *Trie) Hash() common.Hash {\n\thash, cached, _ := t.hashRoot(nil, nil)\n\tt.root = cached\n\treturn common.BytesToHash(hash.(hashNode))\n}\n\n// Commit writes all nodes to the trie's memory database, tracking the internal\n// and external (for account tries) references.\nfunc (t *Trie) Commit(onleaf LeafCallback) (root common.Hash, err error) {\n\tif t.db == nil {\n\t\tpanic(\"commit called on trie with nil database\")\n\t}\n\thash, cached, err := t.hashRoot(t.db, onleaf)\n\tif err != nil {\n\t\treturn common.Hash{}, err\n\t}\n\tt.root = cached\n\tt.cachegen++\n\treturn common.BytesToHash(hash.(hashNode)), nil\n}\n\nfunc (t *Trie) hashRoot(db *Database, onleaf LeafCallback) (node, node, error) {\n\tif t.root == nil {\n\t\treturn hashNode(emptyRoot.Bytes()), nil, nil\n\t}\n\th := newHasher(t.cachegen, t.cachelimit, onleaf)\n\tdefer returnHasherToPool(h)\n\treturn h.hash(t.root, db, true)\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/LICENSE",
    "content": "Copyright (c) 2013-2015 Tommi Virtanen.\nCopyright (c) 2009, 2011, 2012 The Go Authors.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n\nThe following included software components have additional copyright\nnotices and license terms that may differ from the above.\n\n\nFile fuse.go:\n\n// Adapted from Plan 9 from User Space's src/cmd/9pfuse/fuse.c,\n// which carries this notice:\n//\n// The files in this directory are subject to the following license.\n//\n// The author of this software is Russ Cox.\n//\n//         Copyright (c) 2006 Russ Cox\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose without fee is hereby granted, provided that this entire notice\n// is included in all copies of any software which is or includes a copy\n// or modification of this software and in all copies of the supporting\n// documentation for such software.\n//\n// THIS SOFTWARE IS BEING PROVIDED \"AS IS\", WITHOUT ANY EXPRESS OR IMPLIED\n// WARRANTY.  IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION OR WARRANTY\n// OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS\n// FITNESS FOR ANY PARTICULAR PURPOSE.\n\n\nFile fuse_kernel.go:\n\n// Derived from FUSE's fuse_kernel.h\n/*\n   This file defines the kernel interface of FUSE\n   Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>\n\n\n   This -- and only this -- header file may also be distributed under\n   the terms of the BSD Licence as follows:\n\n   Copyright (C) 2001-2007 Miklos Szeredi. 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   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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n   ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE\n   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n   SUCH DAMAGE.\n*/\n"
  },
  {
    "path": "vendor/bazil.org/fuse/README.md",
    "content": "bazil.org/fuse -- Filesystems in Go\n===================================\n\n`bazil.org/fuse` is a Go library for writing FUSE userspace\nfilesystems.\n\nIt is a from-scratch implementation of the kernel-userspace\ncommunication protocol, and does not use the C library from the\nproject called FUSE. `bazil.org/fuse` embraces Go fully for safety and\nease of programming.\n\nHere’s how to get going:\n\n    go get bazil.org/fuse\n\nWebsite: http://bazil.org/fuse/\n\nGithub repository: https://github.com/bazil/fuse\n\nAPI docs: http://godoc.org/bazil.org/fuse\n\nOur thanks to Russ Cox for his fuse library, which this project is\nbased on.\n"
  },
  {
    "path": "vendor/bazil.org/fuse/buffer.go",
    "content": "package fuse\n\nimport \"unsafe\"\n\n// buffer provides a mechanism for constructing a message from\n// multiple segments.\ntype buffer []byte\n\n// alloc allocates size bytes and returns a pointer to the new\n// segment.\nfunc (w *buffer) alloc(size uintptr) unsafe.Pointer {\n\ts := int(size)\n\tif len(*w)+s > cap(*w) {\n\t\told := *w\n\t\t*w = make([]byte, len(*w), 2*cap(*w)+s)\n\t\tcopy(*w, old)\n\t}\n\tl := len(*w)\n\t*w = (*w)[:l+s]\n\treturn unsafe.Pointer(&(*w)[l])\n}\n\n// reset clears out the contents of the buffer.\nfunc (w *buffer) reset() {\n\tfor i := range (*w)[:cap(*w)] {\n\t\t(*w)[i] = 0\n\t}\n\t*w = (*w)[:0]\n}\n\nfunc newBuffer(extra uintptr) buffer {\n\tconst hdrSize = unsafe.Sizeof(outHeader{})\n\tbuf := make(buffer, hdrSize, hdrSize+extra)\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/debug.go",
    "content": "package fuse\n\nimport (\n\t\"runtime\"\n)\n\nfunc stack() string {\n\tbuf := make([]byte, 1024)\n\treturn string(buf[:runtime.Stack(buf, false)])\n}\n\nfunc nop(msg interface{}) {}\n\n// Debug is called to output debug messages, including protocol\n// traces. The default behavior is to do nothing.\n//\n// The messages have human-friendly string representations and are\n// safe to marshal to JSON.\n//\n// Implementations must not retain msg.\nvar Debug func(msg interface{}) = nop\n"
  },
  {
    "path": "vendor/bazil.org/fuse/error_darwin.go",
    "content": "package fuse\n\nimport (\n\t\"syscall\"\n)\n\nconst (\n\tENOATTR = Errno(syscall.ENOATTR)\n)\n\nconst (\n\terrNoXattr = ENOATTR\n)\n\nfunc init() {\n\terrnoNames[errNoXattr] = \"ENOATTR\"\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/error_freebsd.go",
    "content": "package fuse\n\nimport \"syscall\"\n\nconst (\n\tENOATTR = Errno(syscall.ENOATTR)\n)\n\nconst (\n\terrNoXattr = ENOATTR\n)\n\nfunc init() {\n\terrnoNames[errNoXattr] = \"ENOATTR\"\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/error_linux.go",
    "content": "package fuse\n\nimport (\n\t\"syscall\"\n)\n\nconst (\n\tENODATA = Errno(syscall.ENODATA)\n)\n\nconst (\n\terrNoXattr = ENODATA\n)\n\nfunc init() {\n\terrnoNames[errNoXattr] = \"ENODATA\"\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/error_std.go",
    "content": "package fuse\n\n// There is very little commonality in extended attribute errors\n// across platforms.\n//\n// getxattr return value for \"extended attribute does not exist\" is\n// ENOATTR on OS X, and ENODATA on Linux and apparently at least\n// NetBSD. There may be a #define ENOATTR on Linux too, but the value\n// is ENODATA in the actual syscalls. FreeBSD and OpenBSD have no\n// ENODATA, only ENOATTR. ENOATTR is not in any of the standards,\n// ENODATA exists but is only used for STREAMs.\n//\n// Each platform will define it a errNoXattr constant, and this file\n// will enforce that it implements the right interfaces and hide the\n// implementation.\n//\n// https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/getxattr.2.html\n// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013090.html\n// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013097.html\n// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html\n// http://www.freebsd.org/cgi/man.cgi?query=extattr_get_file&sektion=2\n// http://nixdoc.net/man-pages/openbsd/man2/extattr_get_file.2.html\n\n// ErrNoXattr is a platform-independent error value meaning the\n// extended attribute was not found. It can be used to respond to\n// GetxattrRequest and such.\nconst ErrNoXattr = errNoXattr\n\nvar _ error = ErrNoXattr\nvar _ Errno = ErrNoXattr\nvar _ ErrorNumber = ErrNoXattr\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fs/serve.go",
    "content": "// FUSE service loop, for servers that wish to use it.\n\npackage fs // import \"bazil.org/fuse/fs\"\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash/fnv\"\n\t\"io\"\n\t\"log\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"golang.org/x/net/context\"\n)\n\nimport (\n\t\"bytes\"\n\n\t\"bazil.org/fuse\"\n\t\"bazil.org/fuse/fuseutil\"\n)\n\nconst (\n\tattrValidTime  = 1 * time.Minute\n\tentryValidTime = 1 * time.Minute\n)\n\n// TODO: FINISH DOCS\n\n// An FS is the interface required of a file system.\n//\n// Other FUSE requests can be handled by implementing methods from the\n// FS* interfaces, for example FSStatfser.\ntype FS interface {\n\t// Root is called to obtain the Node for the file system root.\n\tRoot() (Node, error)\n}\n\ntype FSStatfser interface {\n\t// Statfs is called to obtain file system metadata.\n\t// It should write that data to resp.\n\tStatfs(ctx context.Context, req *fuse.StatfsRequest, resp *fuse.StatfsResponse) error\n}\n\ntype FSDestroyer interface {\n\t// Destroy is called when the file system is shutting down.\n\t//\n\t// Linux only sends this request for block device backed (fuseblk)\n\t// filesystems, to allow them to flush writes to disk before the\n\t// unmount completes.\n\tDestroy()\n}\n\ntype FSInodeGenerator interface {\n\t// GenerateInode is called to pick a dynamic inode number when it\n\t// would otherwise be 0.\n\t//\n\t// Not all filesystems bother tracking inodes, but FUSE requires\n\t// the inode to be set, and fewer duplicates in general makes UNIX\n\t// tools work better.\n\t//\n\t// Operations where the nodes may return 0 inodes include Getattr,\n\t// Setattr and ReadDir.\n\t//\n\t// If FS does not implement FSInodeGenerator, GenerateDynamicInode\n\t// is used.\n\t//\n\t// Implementing this is useful to e.g. constrain the range of\n\t// inode values used for dynamic inodes.\n\tGenerateInode(parentInode uint64, name string) uint64\n}\n\n// A Node is the interface required of a file or directory.\n// See the documentation for type FS for general information\n// pertaining to all methods.\n//\n// A Node must be usable as a map key, that is, it cannot be a\n// function, map or slice.\n//\n// Other FUSE requests can be handled by implementing methods from the\n// Node* interfaces, for example NodeOpener.\n//\n// Methods returning Node should take care to return the same Node\n// when the result is logically the same instance. Without this, each\n// Node will get a new NodeID, causing spurious cache invalidations,\n// extra lookups and aliasing anomalies. This may not matter for a\n// simple, read-only filesystem.\ntype Node interface {\n\t// Attr fills attr with the standard metadata for the node.\n\t//\n\t// Fields with reasonable defaults are prepopulated. For example,\n\t// all times are set to a fixed moment when the program started.\n\t//\n\t// If Inode is left as 0, a dynamic inode number is chosen.\n\t//\n\t// The result may be cached for the duration set in Valid.\n\tAttr(ctx context.Context, attr *fuse.Attr) error\n}\n\ntype NodeGetattrer interface {\n\t// Getattr obtains the standard metadata for the receiver.\n\t// It should store that metadata in resp.\n\t//\n\t// If this method is not implemented, the attributes will be\n\t// generated based on Attr(), with zero values filled in.\n\tGetattr(ctx context.Context, req *fuse.GetattrRequest, resp *fuse.GetattrResponse) error\n}\n\ntype NodeSetattrer interface {\n\t// Setattr sets the standard metadata for the receiver.\n\t//\n\t// Note, this is also used to communicate changes in the size of\n\t// the file, outside of Writes.\n\t//\n\t// req.Valid is a bitmask of what fields are actually being set.\n\t// For example, the method should not change the mode of the file\n\t// unless req.Valid.Mode() is true.\n\tSetattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error\n}\n\ntype NodeSymlinker interface {\n\t// Symlink creates a new symbolic link in the receiver, which must be a directory.\n\t//\n\t// TODO is the above true about directories?\n\tSymlink(ctx context.Context, req *fuse.SymlinkRequest) (Node, error)\n}\n\n// This optional request will be called only for symbolic link nodes.\ntype NodeReadlinker interface {\n\t// Readlink reads a symbolic link.\n\tReadlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error)\n}\n\ntype NodeLinker interface {\n\t// Link creates a new directory entry in the receiver based on an\n\t// existing Node. Receiver must be a directory.\n\tLink(ctx context.Context, req *fuse.LinkRequest, old Node) (Node, error)\n}\n\ntype NodeRemover interface {\n\t// Remove removes the entry with the given name from\n\t// the receiver, which must be a directory.  The entry to be removed\n\t// may correspond to a file (unlink) or to a directory (rmdir).\n\tRemove(ctx context.Context, req *fuse.RemoveRequest) error\n}\n\ntype NodeAccesser interface {\n\t// Access checks whether the calling context has permission for\n\t// the given operations on the receiver. If so, Access should\n\t// return nil. If not, Access should return EPERM.\n\t//\n\t// Note that this call affects the result of the access(2) system\n\t// call but not the open(2) system call. If Access is not\n\t// implemented, the Node behaves as if it always returns nil\n\t// (permission granted), relying on checks in Open instead.\n\tAccess(ctx context.Context, req *fuse.AccessRequest) error\n}\n\ntype NodeStringLookuper interface {\n\t// Lookup looks up a specific entry in the receiver,\n\t// which must be a directory.  Lookup should return a Node\n\t// corresponding to the entry.  If the name does not exist in\n\t// the directory, Lookup should return ENOENT.\n\t//\n\t// Lookup need not to handle the names \".\" and \"..\".\n\tLookup(ctx context.Context, name string) (Node, error)\n}\n\ntype NodeRequestLookuper interface {\n\t// Lookup looks up a specific entry in the receiver.\n\t// See NodeStringLookuper for more.\n\tLookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (Node, error)\n}\n\ntype NodeMkdirer interface {\n\tMkdir(ctx context.Context, req *fuse.MkdirRequest) (Node, error)\n}\n\ntype NodeOpener interface {\n\t// Open opens the receiver. After a successful open, a client\n\t// process has a file descriptor referring to this Handle.\n\t//\n\t// Open can also be also called on non-files. For example,\n\t// directories are Opened for ReadDir or fchdir(2).\n\t//\n\t// If this method is not implemented, the open will always\n\t// succeed, and the Node itself will be used as the Handle.\n\t//\n\t// XXX note about access.  XXX OpenFlags.\n\tOpen(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (Handle, error)\n}\n\ntype NodeCreater interface {\n\t// Create creates a new directory entry in the receiver, which\n\t// must be a directory.\n\tCreate(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (Node, Handle, error)\n}\n\ntype NodeForgetter interface {\n\t// Forget about this node. This node will not receive further\n\t// method calls.\n\t//\n\t// Forget is not necessarily seen on unmount, as all nodes are\n\t// implicitly forgotten as part part of the unmount.\n\tForget()\n}\n\ntype NodeRenamer interface {\n\tRename(ctx context.Context, req *fuse.RenameRequest, newDir Node) error\n}\n\ntype NodeMknoder interface {\n\tMknod(ctx context.Context, req *fuse.MknodRequest) (Node, error)\n}\n\n// TODO this should be on Handle not Node\ntype NodeFsyncer interface {\n\tFsync(ctx context.Context, req *fuse.FsyncRequest) error\n}\n\ntype NodeGetxattrer interface {\n\t// Getxattr gets an extended attribute by the given name from the\n\t// node.\n\t//\n\t// If there is no xattr by that name, returns fuse.ErrNoXattr.\n\tGetxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error\n}\n\ntype NodeListxattrer interface {\n\t// Listxattr lists the extended attributes recorded for the node.\n\tListxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error\n}\n\ntype NodeSetxattrer interface {\n\t// Setxattr sets an extended attribute with the given name and\n\t// value for the node.\n\tSetxattr(ctx context.Context, req *fuse.SetxattrRequest) error\n}\n\ntype NodeRemovexattrer interface {\n\t// Removexattr removes an extended attribute for the name.\n\t//\n\t// If there is no xattr by that name, returns fuse.ErrNoXattr.\n\tRemovexattr(ctx context.Context, req *fuse.RemovexattrRequest) error\n}\n\nvar startTime = time.Now()\n\nfunc nodeAttr(ctx context.Context, n Node, attr *fuse.Attr) error {\n\tattr.Valid = attrValidTime\n\tattr.Nlink = 1\n\tattr.Atime = startTime\n\tattr.Mtime = startTime\n\tattr.Ctime = startTime\n\tattr.Crtime = startTime\n\tif err := n.Attr(ctx, attr); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// A Handle is the interface required of an opened file or directory.\n// See the documentation for type FS for general information\n// pertaining to all methods.\n//\n// Other FUSE requests can be handled by implementing methods from the\n// Handle* interfaces. The most common to implement are HandleReader,\n// HandleReadDirer, and HandleWriter.\n//\n// TODO implement methods: Getlk, Setlk, Setlkw\ntype Handle interface {\n}\n\ntype HandleFlusher interface {\n\t// Flush is called each time the file or directory is closed.\n\t// Because there can be multiple file descriptors referring to a\n\t// single opened file, Flush can be called multiple times.\n\tFlush(ctx context.Context, req *fuse.FlushRequest) error\n}\n\ntype HandleReadAller interface {\n\tReadAll(ctx context.Context) ([]byte, error)\n}\n\ntype HandleReadDirAller interface {\n\tReadDirAll(ctx context.Context) ([]fuse.Dirent, error)\n}\n\ntype HandleReader interface {\n\t// Read requests to read data from the handle.\n\t//\n\t// There is a page cache in the kernel that normally submits only\n\t// page-aligned reads spanning one or more pages. However, you\n\t// should not rely on this. To see individual requests as\n\t// submitted by the file system clients, set OpenDirectIO.\n\t//\n\t// Note that reads beyond the size of the file as reported by Attr\n\t// are not even attempted (except in OpenDirectIO mode).\n\tRead(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error\n}\n\ntype HandleWriter interface {\n\t// Write requests to write data into the handle at the given offset.\n\t// Store the amount of data written in resp.Size.\n\t//\n\t// There is a writeback page cache in the kernel that normally submits\n\t// only page-aligned writes spanning one or more pages. However,\n\t// you should not rely on this. To see individual requests as\n\t// submitted by the file system clients, set OpenDirectIO.\n\t//\n\t// Writes that grow the file are expected to update the file size\n\t// (as seen through Attr). Note that file size changes are\n\t// communicated also through Setattr.\n\tWrite(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error\n}\n\ntype HandleReleaser interface {\n\tRelease(ctx context.Context, req *fuse.ReleaseRequest) error\n}\n\ntype Config struct {\n\t// Function to send debug log messages to. If nil, use fuse.Debug.\n\t// Note that changing this or fuse.Debug may not affect existing\n\t// calls to Serve.\n\t//\n\t// See fuse.Debug for the rules that log functions must follow.\n\tDebug func(msg interface{})\n\n\t// Function to put things into context for processing the request.\n\t// The returned context must have ctx as its parent.\n\t//\n\t// Note that changing this may not affect existing calls to Serve.\n\t//\n\t// Must not retain req.\n\tWithContext func(ctx context.Context, req fuse.Request) context.Context\n}\n\n// New returns a new FUSE server ready to serve this kernel FUSE\n// connection.\n//\n// Config may be nil.\nfunc New(conn *fuse.Conn, config *Config) *Server {\n\ts := &Server{\n\t\tconn:         conn,\n\t\treq:          map[fuse.RequestID]*serveRequest{},\n\t\tnodeRef:      map[Node]fuse.NodeID{},\n\t\tdynamicInode: GenerateDynamicInode,\n\t}\n\tif config != nil {\n\t\ts.debug = config.Debug\n\t\ts.context = config.WithContext\n\t}\n\tif s.debug == nil {\n\t\ts.debug = fuse.Debug\n\t}\n\treturn s\n}\n\ntype Server struct {\n\t// set in New\n\tconn    *fuse.Conn\n\tdebug   func(msg interface{})\n\tcontext func(ctx context.Context, req fuse.Request) context.Context\n\n\t// set once at Serve time\n\tfs           FS\n\tdynamicInode func(parent uint64, name string) uint64\n\n\t// state, protected by meta\n\tmeta       sync.Mutex\n\treq        map[fuse.RequestID]*serveRequest\n\tnode       []*serveNode\n\tnodeRef    map[Node]fuse.NodeID\n\thandle     []*serveHandle\n\tfreeNode   []fuse.NodeID\n\tfreeHandle []fuse.HandleID\n\tnodeGen    uint64\n\n\t// Used to ensure worker goroutines finish before Serve returns\n\twg sync.WaitGroup\n}\n\n// Serve serves the FUSE connection by making calls to the methods\n// of fs and the Nodes and Handles it makes available.  It returns only\n// when the connection has been closed or an unexpected error occurs.\nfunc (s *Server) Serve(fs FS) error {\n\tdefer s.wg.Wait() // Wait for worker goroutines to complete before return\n\n\ts.fs = fs\n\tif dyn, ok := fs.(FSInodeGenerator); ok {\n\t\ts.dynamicInode = dyn.GenerateInode\n\t}\n\n\troot, err := fs.Root()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"cannot obtain root node: %v\", err)\n\t}\n\t// Recognize the root node if it's ever returned from Lookup,\n\t// passed to Invalidate, etc.\n\ts.nodeRef[root] = 1\n\ts.node = append(s.node, nil, &serveNode{\n\t\tinode:      1,\n\t\tgeneration: s.nodeGen,\n\t\tnode:       root,\n\t\trefs:       1,\n\t})\n\ts.handle = append(s.handle, nil)\n\n\tfor {\n\t\treq, err := s.conn.ReadRequest()\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\n\t\ts.wg.Add(1)\n\t\tgo func() {\n\t\t\tdefer s.wg.Done()\n\t\t\ts.serve(req)\n\t\t}()\n\t}\n\treturn nil\n}\n\n// Serve serves a FUSE connection with the default settings. See\n// Server.Serve.\nfunc Serve(c *fuse.Conn, fs FS) error {\n\tserver := New(c, nil)\n\treturn server.Serve(fs)\n}\n\ntype nothing struct{}\n\ntype serveRequest struct {\n\tRequest fuse.Request\n\tcancel  func()\n}\n\ntype serveNode struct {\n\tinode      uint64\n\tgeneration uint64\n\tnode       Node\n\trefs       uint64\n\n\t// Delay freeing the NodeID until waitgroup is done. This allows\n\t// using the NodeID for short periods of time without holding the\n\t// Server.meta lock.\n\t//\n\t// Rules:\n\t//\n\t//     - hold Server.meta while calling wg.Add, then unlock\n\t//     - do NOT try to reacquire Server.meta\n\twg sync.WaitGroup\n}\n\nfunc (sn *serveNode) attr(ctx context.Context, attr *fuse.Attr) error {\n\terr := nodeAttr(ctx, sn.node, attr)\n\tif attr.Inode == 0 {\n\t\tattr.Inode = sn.inode\n\t}\n\treturn err\n}\n\ntype serveHandle struct {\n\thandle   Handle\n\treadData []byte\n\tnodeID   fuse.NodeID\n}\n\n// NodeRef is deprecated. It remains here to decrease code churn on\n// FUSE library users. You may remove it from your program now;\n// returning the same Node values are now recognized automatically,\n// without needing NodeRef.\ntype NodeRef struct{}\n\nfunc (c *Server) saveNode(inode uint64, node Node) (id fuse.NodeID, gen uint64) {\n\tc.meta.Lock()\n\tdefer c.meta.Unlock()\n\n\tif id, ok := c.nodeRef[node]; ok {\n\t\tsn := c.node[id]\n\t\tsn.refs++\n\t\treturn id, sn.generation\n\t}\n\n\tsn := &serveNode{inode: inode, node: node, refs: 1}\n\tif n := len(c.freeNode); n > 0 {\n\t\tid = c.freeNode[n-1]\n\t\tc.freeNode = c.freeNode[:n-1]\n\t\tc.node[id] = sn\n\t\tc.nodeGen++\n\t} else {\n\t\tid = fuse.NodeID(len(c.node))\n\t\tc.node = append(c.node, sn)\n\t}\n\tsn.generation = c.nodeGen\n\tc.nodeRef[node] = id\n\treturn id, sn.generation\n}\n\nfunc (c *Server) saveHandle(handle Handle, nodeID fuse.NodeID) (id fuse.HandleID) {\n\tc.meta.Lock()\n\tshandle := &serveHandle{handle: handle, nodeID: nodeID}\n\tif n := len(c.freeHandle); n > 0 {\n\t\tid = c.freeHandle[n-1]\n\t\tc.freeHandle = c.freeHandle[:n-1]\n\t\tc.handle[id] = shandle\n\t} else {\n\t\tid = fuse.HandleID(len(c.handle))\n\t\tc.handle = append(c.handle, shandle)\n\t}\n\tc.meta.Unlock()\n\treturn\n}\n\ntype nodeRefcountDropBug struct {\n\tN    uint64\n\tRefs uint64\n\tNode fuse.NodeID\n}\n\nfunc (n *nodeRefcountDropBug) String() string {\n\treturn fmt.Sprintf(\"bug: trying to drop %d of %d references to %v\", n.N, n.Refs, n.Node)\n}\n\nfunc (c *Server) dropNode(id fuse.NodeID, n uint64) (forget bool) {\n\tc.meta.Lock()\n\tdefer c.meta.Unlock()\n\tsnode := c.node[id]\n\n\tif snode == nil {\n\t\t// this should only happen if refcounts kernel<->us disagree\n\t\t// *and* two ForgetRequests for the same node race each other;\n\t\t// this indicates a bug somewhere\n\t\tc.debug(nodeRefcountDropBug{N: n, Node: id})\n\n\t\t// we may end up triggering Forget twice, but that's better\n\t\t// than not even once, and that's the best we can do\n\t\treturn true\n\t}\n\n\tif n > snode.refs {\n\t\tc.debug(nodeRefcountDropBug{N: n, Refs: snode.refs, Node: id})\n\t\tn = snode.refs\n\t}\n\n\tsnode.refs -= n\n\tif snode.refs == 0 {\n\t\tsnode.wg.Wait()\n\t\tc.node[id] = nil\n\t\tdelete(c.nodeRef, snode.node)\n\t\tc.freeNode = append(c.freeNode, id)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (c *Server) dropHandle(id fuse.HandleID) {\n\tc.meta.Lock()\n\tc.handle[id] = nil\n\tc.freeHandle = append(c.freeHandle, id)\n\tc.meta.Unlock()\n}\n\ntype missingHandle struct {\n\tHandle    fuse.HandleID\n\tMaxHandle fuse.HandleID\n}\n\nfunc (m missingHandle) String() string {\n\treturn fmt.Sprint(\"missing handle: \", m.Handle, m.MaxHandle)\n}\n\n// Returns nil for invalid handles.\nfunc (c *Server) getHandle(id fuse.HandleID) (shandle *serveHandle) {\n\tc.meta.Lock()\n\tdefer c.meta.Unlock()\n\tif id < fuse.HandleID(len(c.handle)) {\n\t\tshandle = c.handle[uint(id)]\n\t}\n\tif shandle == nil {\n\t\tc.debug(missingHandle{\n\t\t\tHandle:    id,\n\t\t\tMaxHandle: fuse.HandleID(len(c.handle)),\n\t\t})\n\t}\n\treturn\n}\n\ntype request struct {\n\tOp      string\n\tRequest *fuse.Header\n\tIn      interface{} `json:\",omitempty\"`\n}\n\nfunc (r request) String() string {\n\treturn fmt.Sprintf(\"<- %s\", r.In)\n}\n\ntype logResponseHeader struct {\n\tID fuse.RequestID\n}\n\nfunc (m logResponseHeader) String() string {\n\treturn fmt.Sprintf(\"ID=%v\", m.ID)\n}\n\ntype response struct {\n\tOp      string\n\tRequest logResponseHeader\n\tOut     interface{} `json:\",omitempty\"`\n\t// Errno contains the errno value as a string, for example \"EPERM\".\n\tErrno string `json:\",omitempty\"`\n\t// Error may contain a free form error message.\n\tError string `json:\",omitempty\"`\n}\n\nfunc (r response) errstr() string {\n\ts := r.Errno\n\tif r.Error != \"\" {\n\t\t// prefix the errno constant to the long form message\n\t\ts = s + \": \" + r.Error\n\t}\n\treturn s\n}\n\nfunc (r response) String() string {\n\tswitch {\n\tcase r.Errno != \"\" && r.Out != nil:\n\t\treturn fmt.Sprintf(\"-> [%v] %v error=%s\", r.Request, r.Out, r.errstr())\n\tcase r.Errno != \"\":\n\t\treturn fmt.Sprintf(\"-> [%v] %s error=%s\", r.Request, r.Op, r.errstr())\n\tcase r.Out != nil:\n\t\t// make sure (seemingly) empty values are readable\n\t\tswitch r.Out.(type) {\n\t\tcase string:\n\t\t\treturn fmt.Sprintf(\"-> [%v] %s %q\", r.Request, r.Op, r.Out)\n\t\tcase []byte:\n\t\t\treturn fmt.Sprintf(\"-> [%v] %s [% x]\", r.Request, r.Op, r.Out)\n\t\tdefault:\n\t\t\treturn fmt.Sprintf(\"-> [%v] %v\", r.Request, r.Out)\n\t\t}\n\tdefault:\n\t\treturn fmt.Sprintf(\"-> [%v] %s\", r.Request, r.Op)\n\t}\n}\n\ntype notification struct {\n\tOp   string\n\tNode fuse.NodeID\n\tOut  interface{} `json:\",omitempty\"`\n\tErr  string      `json:\",omitempty\"`\n}\n\nfunc (n notification) String() string {\n\tvar buf bytes.Buffer\n\tfmt.Fprintf(&buf, \"=> %s %v\", n.Op, n.Node)\n\tif n.Out != nil {\n\t\t// make sure (seemingly) empty values are readable\n\t\tswitch n.Out.(type) {\n\t\tcase string:\n\t\t\tfmt.Fprintf(&buf, \" %q\", n.Out)\n\t\tcase []byte:\n\t\t\tfmt.Fprintf(&buf, \" [% x]\", n.Out)\n\t\tdefault:\n\t\t\tfmt.Fprintf(&buf, \" %s\", n.Out)\n\t\t}\n\t}\n\tif n.Err != \"\" {\n\t\tfmt.Fprintf(&buf, \" Err:%v\", n.Err)\n\t}\n\treturn buf.String()\n}\n\ntype logMissingNode struct {\n\tMaxNode fuse.NodeID\n}\n\nfunc opName(req fuse.Request) string {\n\tt := reflect.Indirect(reflect.ValueOf(req)).Type()\n\ts := t.Name()\n\ts = strings.TrimSuffix(s, \"Request\")\n\treturn s\n}\n\ntype logLinkRequestOldNodeNotFound struct {\n\tRequest *fuse.Header\n\tIn      *fuse.LinkRequest\n}\n\nfunc (m *logLinkRequestOldNodeNotFound) String() string {\n\treturn fmt.Sprintf(\"In LinkRequest (request %v), node %d not found\", m.Request.Hdr().ID, m.In.OldNode)\n}\n\ntype renameNewDirNodeNotFound struct {\n\tRequest *fuse.Header\n\tIn      *fuse.RenameRequest\n}\n\nfunc (m *renameNewDirNodeNotFound) String() string {\n\treturn fmt.Sprintf(\"In RenameRequest (request %v), node %d not found\", m.Request.Hdr().ID, m.In.NewDir)\n}\n\ntype handlerPanickedError struct {\n\tRequest interface{}\n\tErr     interface{}\n}\n\nvar _ error = handlerPanickedError{}\n\nfunc (h handlerPanickedError) Error() string {\n\treturn fmt.Sprintf(\"handler panicked: %v\", h.Err)\n}\n\nvar _ fuse.ErrorNumber = handlerPanickedError{}\n\nfunc (h handlerPanickedError) Errno() fuse.Errno {\n\tif err, ok := h.Err.(fuse.ErrorNumber); ok {\n\t\treturn err.Errno()\n\t}\n\treturn fuse.DefaultErrno\n}\n\n// handlerTerminatedError happens when a handler terminates itself\n// with runtime.Goexit. This is most commonly because of incorrect use\n// of testing.TB.FailNow, typically via t.Fatal.\ntype handlerTerminatedError struct {\n\tRequest interface{}\n}\n\nvar _ error = handlerTerminatedError{}\n\nfunc (h handlerTerminatedError) Error() string {\n\treturn fmt.Sprintf(\"handler terminated (called runtime.Goexit)\")\n}\n\nvar _ fuse.ErrorNumber = handlerTerminatedError{}\n\nfunc (h handlerTerminatedError) Errno() fuse.Errno {\n\treturn fuse.DefaultErrno\n}\n\ntype handleNotReaderError struct {\n\thandle Handle\n}\n\nvar _ error = handleNotReaderError{}\n\nfunc (e handleNotReaderError) Error() string {\n\treturn fmt.Sprintf(\"handle has no Read: %T\", e.handle)\n}\n\nvar _ fuse.ErrorNumber = handleNotReaderError{}\n\nfunc (e handleNotReaderError) Errno() fuse.Errno {\n\treturn fuse.ENOTSUP\n}\n\nfunc initLookupResponse(s *fuse.LookupResponse) {\n\ts.EntryValid = entryValidTime\n}\n\nfunc (c *Server) serve(r fuse.Request) {\n\tctx, cancel := context.WithCancel(context.Background())\n\tdefer cancel()\n\tparentCtx := ctx\n\tif c.context != nil {\n\t\tctx = c.context(ctx, r)\n\t}\n\n\treq := &serveRequest{Request: r, cancel: cancel}\n\n\tc.debug(request{\n\t\tOp:      opName(r),\n\t\tRequest: r.Hdr(),\n\t\tIn:      r,\n\t})\n\tvar node Node\n\tvar snode *serveNode\n\tc.meta.Lock()\n\thdr := r.Hdr()\n\tif id := hdr.Node; id != 0 {\n\t\tif id < fuse.NodeID(len(c.node)) {\n\t\t\tsnode = c.node[uint(id)]\n\t\t}\n\t\tif snode == nil {\n\t\t\tc.meta.Unlock()\n\t\t\tc.debug(response{\n\t\t\t\tOp:      opName(r),\n\t\t\t\tRequest: logResponseHeader{ID: hdr.ID},\n\t\t\t\tError:   fuse.ESTALE.ErrnoName(),\n\t\t\t\t// this is the only place that sets both Error and\n\t\t\t\t// Out; not sure if i want to do that; might get rid\n\t\t\t\t// of len(c.node) things altogether\n\t\t\t\tOut: logMissingNode{\n\t\t\t\t\tMaxNode: fuse.NodeID(len(c.node)),\n\t\t\t\t},\n\t\t\t})\n\t\t\tr.RespondError(fuse.ESTALE)\n\t\t\treturn\n\t\t}\n\t\tnode = snode.node\n\t}\n\tif c.req[hdr.ID] != nil {\n\t\t// This happens with OSXFUSE.  Assume it's okay and\n\t\t// that we'll never see an interrupt for this one.\n\t\t// Otherwise everything wedges.  TODO: Report to OSXFUSE?\n\t\t//\n\t\t// TODO this might have been because of missing done() calls\n\t} else {\n\t\tc.req[hdr.ID] = req\n\t}\n\tc.meta.Unlock()\n\n\t// Call this before responding.\n\t// After responding is too late: we might get another request\n\t// with the same ID and be very confused.\n\tdone := func(resp interface{}) {\n\t\tmsg := response{\n\t\t\tOp:      opName(r),\n\t\t\tRequest: logResponseHeader{ID: hdr.ID},\n\t\t}\n\t\tif err, ok := resp.(error); ok {\n\t\t\tmsg.Error = err.Error()\n\t\t\tif ferr, ok := err.(fuse.ErrorNumber); ok {\n\t\t\t\terrno := ferr.Errno()\n\t\t\t\tmsg.Errno = errno.ErrnoName()\n\t\t\t\tif errno == err {\n\t\t\t\t\t// it's just a fuse.Errno with no extra detail;\n\t\t\t\t\t// skip the textual message for log readability\n\t\t\t\t\tmsg.Error = \"\"\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmsg.Errno = fuse.DefaultErrno.ErrnoName()\n\t\t\t}\n\t\t} else {\n\t\t\tmsg.Out = resp\n\t\t}\n\t\tc.debug(msg)\n\n\t\tc.meta.Lock()\n\t\tdelete(c.req, hdr.ID)\n\t\tc.meta.Unlock()\n\t}\n\n\tvar responded bool\n\tdefer func() {\n\t\tif rec := recover(); rec != nil {\n\t\t\tconst size = 1 << 16\n\t\t\tbuf := make([]byte, size)\n\t\t\tn := runtime.Stack(buf, false)\n\t\t\tbuf = buf[:n]\n\t\t\tlog.Printf(\"fuse: panic in handler for %v: %v\\n%s\", r, rec, buf)\n\t\t\terr := handlerPanickedError{\n\t\t\t\tRequest: r,\n\t\t\t\tErr:     rec,\n\t\t\t}\n\t\t\tdone(err)\n\t\t\tr.RespondError(err)\n\t\t\treturn\n\t\t}\n\n\t\tif !responded {\n\t\t\terr := handlerTerminatedError{\n\t\t\t\tRequest: r,\n\t\t\t}\n\t\t\tdone(err)\n\t\t\tr.RespondError(err)\n\t\t}\n\t}()\n\n\tif err := c.handleRequest(ctx, node, snode, r, done); err != nil {\n\t\tif err == context.Canceled {\n\t\t\tselect {\n\t\t\tcase <-parentCtx.Done():\n\t\t\t\t// We canceled the parent context because of an\n\t\t\t\t// incoming interrupt request, so return EINTR\n\t\t\t\t// to trigger the right behavior in the client app.\n\t\t\t\t//\n\t\t\t\t// Only do this when it's the parent context that was\n\t\t\t\t// canceled, not a context controlled by the program\n\t\t\t\t// using this library, so we don't return EINTR too\n\t\t\t\t// eagerly -- it might cause busy loops.\n\t\t\t\t//\n\t\t\t\t// Decent write-up on role of EINTR:\n\t\t\t\t// http://250bpm.com/blog:12\n\t\t\t\terr = fuse.EINTR\n\t\t\tdefault:\n\t\t\t\t// nothing\n\t\t\t}\n\t\t}\n\t\tdone(err)\n\t\tr.RespondError(err)\n\t}\n\n\t// disarm runtime.Goexit protection\n\tresponded = true\n}\n\n// handleRequest will either a) call done(s) and r.Respond(s) OR b) return an error.\nfunc (c *Server) handleRequest(ctx context.Context, node Node, snode *serveNode, r fuse.Request, done func(resp interface{})) error {\n\tswitch r := r.(type) {\n\tdefault:\n\t\t// Note: To FUSE, ENOSYS means \"this server never implements this request.\"\n\t\t// It would be inappropriate to return ENOSYS for other operations in this\n\t\t// switch that might only be unavailable in some contexts, not all.\n\t\treturn fuse.ENOSYS\n\n\tcase *fuse.StatfsRequest:\n\t\ts := &fuse.StatfsResponse{}\n\t\tif fs, ok := c.fs.(FSStatfser); ok {\n\t\t\tif err := fs.Statfs(ctx, r, s); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\t// Node operations.\n\tcase *fuse.GetattrRequest:\n\t\ts := &fuse.GetattrResponse{}\n\t\tif n, ok := node.(NodeGetattrer); ok {\n\t\t\tif err := n.Getattr(ctx, r, s); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif err := snode.attr(ctx, &s.Attr); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.SetattrRequest:\n\t\ts := &fuse.SetattrResponse{}\n\t\tif n, ok := node.(NodeSetattrer); ok {\n\t\t\tif err := n.Setattr(ctx, r, s); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif err := snode.attr(ctx, &s.Attr); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.SymlinkRequest:\n\t\ts := &fuse.SymlinkResponse{}\n\t\tinitLookupResponse(&s.LookupResponse)\n\t\tn, ok := node.(NodeSymlinker)\n\t\tif !ok {\n\t\t\treturn fuse.EIO // XXX or EPERM like Mkdir?\n\t\t}\n\t\tn2, err := n.Symlink(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := c.saveLookup(ctx, &s.LookupResponse, snode, r.NewName, n2); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.ReadlinkRequest:\n\t\tn, ok := node.(NodeReadlinker)\n\t\tif !ok {\n\t\t\treturn fuse.EIO /// XXX or EPERM?\n\t\t}\n\t\ttarget, err := n.Readlink(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(target)\n\t\tr.Respond(target)\n\t\treturn nil\n\n\tcase *fuse.LinkRequest:\n\t\tn, ok := node.(NodeLinker)\n\t\tif !ok {\n\t\t\treturn fuse.EIO /// XXX or EPERM?\n\t\t}\n\t\tc.meta.Lock()\n\t\tvar oldNode *serveNode\n\t\tif int(r.OldNode) < len(c.node) {\n\t\t\toldNode = c.node[r.OldNode]\n\t\t}\n\t\tc.meta.Unlock()\n\t\tif oldNode == nil {\n\t\t\tc.debug(logLinkRequestOldNodeNotFound{\n\t\t\t\tRequest: r.Hdr(),\n\t\t\t\tIn:      r,\n\t\t\t})\n\t\t\treturn fuse.EIO\n\t\t}\n\t\tn2, err := n.Link(ctx, r, oldNode.node)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ts := &fuse.LookupResponse{}\n\t\tinitLookupResponse(s)\n\t\tif err := c.saveLookup(ctx, s, snode, r.NewName, n2); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.RemoveRequest:\n\t\tn, ok := node.(NodeRemover)\n\t\tif !ok {\n\t\t\treturn fuse.EIO /// XXX or EPERM?\n\t\t}\n\t\terr := n.Remove(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.AccessRequest:\n\t\tif n, ok := node.(NodeAccesser); ok {\n\t\t\tif err := n.Access(ctx, r); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.LookupRequest:\n\t\tvar n2 Node\n\t\tvar err error\n\t\ts := &fuse.LookupResponse{}\n\t\tinitLookupResponse(s)\n\t\tif n, ok := node.(NodeStringLookuper); ok {\n\t\t\tn2, err = n.Lookup(ctx, r.Name)\n\t\t} else if n, ok := node.(NodeRequestLookuper); ok {\n\t\t\tn2, err = n.Lookup(ctx, r, s)\n\t\t} else {\n\t\t\treturn fuse.ENOENT\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := c.saveLookup(ctx, s, snode, r.Name, n2); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.MkdirRequest:\n\t\ts := &fuse.MkdirResponse{}\n\t\tinitLookupResponse(&s.LookupResponse)\n\t\tn, ok := node.(NodeMkdirer)\n\t\tif !ok {\n\t\t\treturn fuse.EPERM\n\t\t}\n\t\tn2, err := n.Mkdir(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := c.saveLookup(ctx, &s.LookupResponse, snode, r.Name, n2); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.OpenRequest:\n\t\ts := &fuse.OpenResponse{}\n\t\tvar h2 Handle\n\t\tif n, ok := node.(NodeOpener); ok {\n\t\t\thh, err := n.Open(ctx, r, s)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\th2 = hh\n\t\t} else {\n\t\t\th2 = node\n\t\t}\n\t\ts.Handle = c.saveHandle(h2, r.Hdr().Node)\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.CreateRequest:\n\t\tn, ok := node.(NodeCreater)\n\t\tif !ok {\n\t\t\t// If we send back ENOSYS, FUSE will try mknod+open.\n\t\t\treturn fuse.EPERM\n\t\t}\n\t\ts := &fuse.CreateResponse{OpenResponse: fuse.OpenResponse{}}\n\t\tinitLookupResponse(&s.LookupResponse)\n\t\tn2, h2, err := n.Create(ctx, r, s)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := c.saveLookup(ctx, &s.LookupResponse, snode, r.Name, n2); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ts.Handle = c.saveHandle(h2, r.Hdr().Node)\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.GetxattrRequest:\n\t\tn, ok := node.(NodeGetxattrer)\n\t\tif !ok {\n\t\t\treturn fuse.ENOTSUP\n\t\t}\n\t\ts := &fuse.GetxattrResponse{}\n\t\terr := n.Getxattr(ctx, r, s)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif r.Size != 0 && uint64(len(s.Xattr)) > uint64(r.Size) {\n\t\t\treturn fuse.ERANGE\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.ListxattrRequest:\n\t\tn, ok := node.(NodeListxattrer)\n\t\tif !ok {\n\t\t\treturn fuse.ENOTSUP\n\t\t}\n\t\ts := &fuse.ListxattrResponse{}\n\t\terr := n.Listxattr(ctx, r, s)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif r.Size != 0 && uint64(len(s.Xattr)) > uint64(r.Size) {\n\t\t\treturn fuse.ERANGE\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.SetxattrRequest:\n\t\tn, ok := node.(NodeSetxattrer)\n\t\tif !ok {\n\t\t\treturn fuse.ENOTSUP\n\t\t}\n\t\terr := n.Setxattr(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.RemovexattrRequest:\n\t\tn, ok := node.(NodeRemovexattrer)\n\t\tif !ok {\n\t\t\treturn fuse.ENOTSUP\n\t\t}\n\t\terr := n.Removexattr(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.ForgetRequest:\n\t\tforget := c.dropNode(r.Hdr().Node, r.N)\n\t\tif forget {\n\t\t\tn, ok := node.(NodeForgetter)\n\t\t\tif ok {\n\t\t\t\tn.Forget()\n\t\t\t}\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\t// Handle operations.\n\tcase *fuse.ReadRequest:\n\t\tshandle := c.getHandle(r.Handle)\n\t\tif shandle == nil {\n\t\t\treturn fuse.ESTALE\n\t\t}\n\t\thandle := shandle.handle\n\n\t\ts := &fuse.ReadResponse{Data: make([]byte, 0, r.Size)}\n\t\tif r.Dir {\n\t\t\tif h, ok := handle.(HandleReadDirAller); ok {\n\t\t\t\t// detect rewinddir(3) or similar seek and refresh\n\t\t\t\t// contents\n\t\t\t\tif r.Offset == 0 {\n\t\t\t\t\tshandle.readData = nil\n\t\t\t\t}\n\n\t\t\t\tif shandle.readData == nil {\n\t\t\t\t\tdirs, err := h.ReadDirAll(ctx)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tvar data []byte\n\t\t\t\t\tfor _, dir := range dirs {\n\t\t\t\t\t\tif dir.Inode == 0 {\n\t\t\t\t\t\t\tdir.Inode = c.dynamicInode(snode.inode, dir.Name)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdata = fuse.AppendDirent(data, dir)\n\t\t\t\t\t}\n\t\t\t\t\tshandle.readData = data\n\t\t\t\t}\n\t\t\t\tfuseutil.HandleRead(r, s, shandle.readData)\n\t\t\t\tdone(s)\n\t\t\t\tr.Respond(s)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t} else {\n\t\t\tif h, ok := handle.(HandleReadAller); ok {\n\t\t\t\tif shandle.readData == nil {\n\t\t\t\t\tdata, err := h.ReadAll(ctx)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif data == nil {\n\t\t\t\t\t\tdata = []byte{}\n\t\t\t\t\t}\n\t\t\t\t\tshandle.readData = data\n\t\t\t\t}\n\t\t\t\tfuseutil.HandleRead(r, s, shandle.readData)\n\t\t\t\tdone(s)\n\t\t\t\tr.Respond(s)\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\th, ok := handle.(HandleReader)\n\t\t\tif !ok {\n\t\t\t\terr := handleNotReaderError{handle: handle}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := h.Read(ctx, r, s); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.WriteRequest:\n\t\tshandle := c.getHandle(r.Handle)\n\t\tif shandle == nil {\n\t\t\treturn fuse.ESTALE\n\t\t}\n\n\t\ts := &fuse.WriteResponse{}\n\t\tif h, ok := shandle.handle.(HandleWriter); ok {\n\t\t\tif err := h.Write(ctx, r, s); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdone(s)\n\t\t\tr.Respond(s)\n\t\t\treturn nil\n\t\t}\n\t\treturn fuse.EIO\n\n\tcase *fuse.FlushRequest:\n\t\tshandle := c.getHandle(r.Handle)\n\t\tif shandle == nil {\n\t\t\treturn fuse.ESTALE\n\t\t}\n\t\thandle := shandle.handle\n\n\t\tif h, ok := handle.(HandleFlusher); ok {\n\t\t\tif err := h.Flush(ctx, r); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.ReleaseRequest:\n\t\tshandle := c.getHandle(r.Handle)\n\t\tif shandle == nil {\n\t\t\treturn fuse.ESTALE\n\t\t}\n\t\thandle := shandle.handle\n\n\t\t// No matter what, release the handle.\n\t\tc.dropHandle(r.Handle)\n\n\t\tif h, ok := handle.(HandleReleaser); ok {\n\t\t\tif err := h.Release(ctx, r); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.DestroyRequest:\n\t\tif fs, ok := c.fs.(FSDestroyer); ok {\n\t\t\tfs.Destroy()\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.RenameRequest:\n\t\tc.meta.Lock()\n\t\tvar newDirNode *serveNode\n\t\tif int(r.NewDir) < len(c.node) {\n\t\t\tnewDirNode = c.node[r.NewDir]\n\t\t}\n\t\tc.meta.Unlock()\n\t\tif newDirNode == nil {\n\t\t\tc.debug(renameNewDirNodeNotFound{\n\t\t\t\tRequest: r.Hdr(),\n\t\t\t\tIn:      r,\n\t\t\t})\n\t\t\treturn fuse.EIO\n\t\t}\n\t\tn, ok := node.(NodeRenamer)\n\t\tif !ok {\n\t\t\treturn fuse.EIO // XXX or EPERM like Mkdir?\n\t\t}\n\t\terr := n.Rename(ctx, r, newDirNode.node)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.MknodRequest:\n\t\tn, ok := node.(NodeMknoder)\n\t\tif !ok {\n\t\t\treturn fuse.EIO\n\t\t}\n\t\tn2, err := n.Mknod(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ts := &fuse.LookupResponse{}\n\t\tinitLookupResponse(s)\n\t\tif err := c.saveLookup(ctx, s, snode, r.Name, n2); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(s)\n\t\tr.Respond(s)\n\t\treturn nil\n\n\tcase *fuse.FsyncRequest:\n\t\tn, ok := node.(NodeFsyncer)\n\t\tif !ok {\n\t\t\treturn fuse.EIO\n\t\t}\n\t\terr := n.Fsync(ctx, r)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\tcase *fuse.InterruptRequest:\n\t\tc.meta.Lock()\n\t\tireq := c.req[r.IntrID]\n\t\tif ireq != nil && ireq.cancel != nil {\n\t\t\tireq.cancel()\n\t\t\tireq.cancel = nil\n\t\t}\n\t\tc.meta.Unlock()\n\t\tdone(nil)\n\t\tr.Respond()\n\t\treturn nil\n\n\t\t/*\tcase *FsyncdirRequest:\n\t\t\t\treturn ENOSYS\n\n\t\t\tcase *GetlkRequest, *SetlkRequest, *SetlkwRequest:\n\t\t\t\treturn ENOSYS\n\n\t\t\tcase *BmapRequest:\n\t\t\t\treturn ENOSYS\n\n\t\t\tcase *SetvolnameRequest, *GetxtimesRequest, *ExchangeRequest:\n\t\t\t\treturn ENOSYS\n\t\t*/\n\t}\n\n\tpanic(\"not reached\")\n}\n\nfunc (c *Server) saveLookup(ctx context.Context, s *fuse.LookupResponse, snode *serveNode, elem string, n2 Node) error {\n\tif err := nodeAttr(ctx, n2, &s.Attr); err != nil {\n\t\treturn err\n\t}\n\tif s.Attr.Inode == 0 {\n\t\ts.Attr.Inode = c.dynamicInode(snode.inode, elem)\n\t}\n\n\ts.Node, s.Generation = c.saveNode(s.Attr.Inode, n2)\n\treturn nil\n}\n\ntype invalidateNodeDetail struct {\n\tOff  int64\n\tSize int64\n}\n\nfunc (i invalidateNodeDetail) String() string {\n\treturn fmt.Sprintf(\"Off:%d Size:%d\", i.Off, i.Size)\n}\n\nfunc errstr(err error) string {\n\tif err == nil {\n\t\treturn \"\"\n\t}\n\treturn err.Error()\n}\n\nfunc (s *Server) invalidateNode(node Node, off int64, size int64) error {\n\ts.meta.Lock()\n\tid, ok := s.nodeRef[node]\n\tif ok {\n\t\tsnode := s.node[id]\n\t\tsnode.wg.Add(1)\n\t\tdefer snode.wg.Done()\n\t}\n\ts.meta.Unlock()\n\tif !ok {\n\t\t// This is what the kernel would have said, if we had been\n\t\t// able to send this message; it's not cached.\n\t\treturn fuse.ErrNotCached\n\t}\n\t// Delay logging until after we can record the error too. We\n\t// consider a /dev/fuse write to be instantaneous enough to not\n\t// need separate before and after messages.\n\terr := s.conn.InvalidateNode(id, off, size)\n\ts.debug(notification{\n\t\tOp:   \"InvalidateNode\",\n\t\tNode: id,\n\t\tOut: invalidateNodeDetail{\n\t\t\tOff:  off,\n\t\t\tSize: size,\n\t\t},\n\t\tErr: errstr(err),\n\t})\n\treturn err\n}\n\n// InvalidateNodeAttr invalidates the kernel cache of the attributes\n// of node.\n//\n// Returns fuse.ErrNotCached if the kernel is not currently caching\n// the node.\nfunc (s *Server) InvalidateNodeAttr(node Node) error {\n\treturn s.invalidateNode(node, 0, 0)\n}\n\n// InvalidateNodeData invalidates the kernel cache of the attributes\n// and data of node.\n//\n// Returns fuse.ErrNotCached if the kernel is not currently caching\n// the node.\nfunc (s *Server) InvalidateNodeData(node Node) error {\n\treturn s.invalidateNode(node, 0, -1)\n}\n\n// InvalidateNodeDataRange invalidates the kernel cache of the\n// attributes and a range of the data of node.\n//\n// Returns fuse.ErrNotCached if the kernel is not currently caching\n// the node.\nfunc (s *Server) InvalidateNodeDataRange(node Node, off int64, size int64) error {\n\treturn s.invalidateNode(node, off, size)\n}\n\ntype invalidateEntryDetail struct {\n\tName string\n}\n\nfunc (i invalidateEntryDetail) String() string {\n\treturn fmt.Sprintf(\"%q\", i.Name)\n}\n\n// InvalidateEntry invalidates the kernel cache of the directory entry\n// identified by parent node and entry basename.\n//\n// Kernel may or may not cache directory listings. To invalidate\n// those, use InvalidateNode to invalidate all of the data for a\n// directory. (As of 2015-06, Linux FUSE does not cache directory\n// listings.)\n//\n// Returns ErrNotCached if the kernel is not currently caching the\n// node.\nfunc (s *Server) InvalidateEntry(parent Node, name string) error {\n\ts.meta.Lock()\n\tid, ok := s.nodeRef[parent]\n\tif ok {\n\t\tsnode := s.node[id]\n\t\tsnode.wg.Add(1)\n\t\tdefer snode.wg.Done()\n\t}\n\ts.meta.Unlock()\n\tif !ok {\n\t\t// This is what the kernel would have said, if we had been\n\t\t// able to send this message; it's not cached.\n\t\treturn fuse.ErrNotCached\n\t}\n\terr := s.conn.InvalidateEntry(id, name)\n\ts.debug(notification{\n\t\tOp:   \"InvalidateEntry\",\n\t\tNode: id,\n\t\tOut: invalidateEntryDetail{\n\t\t\tName: name,\n\t\t},\n\t\tErr: errstr(err),\n\t})\n\treturn err\n}\n\n// DataHandle returns a read-only Handle that satisfies reads\n// using the given data.\nfunc DataHandle(data []byte) Handle {\n\treturn &dataHandle{data}\n}\n\ntype dataHandle struct {\n\tdata []byte\n}\n\nfunc (d *dataHandle) ReadAll(ctx context.Context) ([]byte, error) {\n\treturn d.data, nil\n}\n\n// GenerateDynamicInode returns a dynamic inode.\n//\n// The parent inode and current entry name are used as the criteria\n// for choosing a pseudorandom inode. This makes it likely the same\n// entry will get the same inode on multiple runs.\nfunc GenerateDynamicInode(parent uint64, name string) uint64 {\n\th := fnv.New64a()\n\tvar buf [8]byte\n\tbinary.LittleEndian.PutUint64(buf[:], parent)\n\t_, _ = h.Write(buf[:])\n\t_, _ = h.Write([]byte(name))\n\tvar inode uint64\n\tfor {\n\t\tinode = h.Sum64()\n\t\tif inode != 0 {\n\t\t\tbreak\n\t\t}\n\t\t// there's a tiny probability that result is zero; change the\n\t\t// input a little and try again\n\t\t_, _ = h.Write([]byte{'x'})\n\t}\n\treturn inode\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fs/tree.go",
    "content": "// FUSE directory tree, for servers that wish to use it with the service loop.\n\npackage fs\n\nimport (\n\t\"os\"\n\tpathpkg \"path\"\n\t\"strings\"\n\n\t\"golang.org/x/net/context\"\n)\n\nimport (\n\t\"bazil.org/fuse\"\n)\n\n// A Tree implements a basic read-only directory tree for FUSE.\n// The Nodes contained in it may still be writable.\ntype Tree struct {\n\ttree\n}\n\nfunc (t *Tree) Root() (Node, error) {\n\treturn &t.tree, nil\n}\n\n// Add adds the path to the tree, resolving to the given node.\n// If path or a prefix of path has already been added to the tree,\n// Add panics.\n//\n// Add is only safe to call before starting to serve requests.\nfunc (t *Tree) Add(path string, node Node) {\n\tpath = pathpkg.Clean(\"/\" + path)[1:]\n\telems := strings.Split(path, \"/\")\n\tdir := Node(&t.tree)\n\tfor i, elem := range elems {\n\t\tdt, ok := dir.(*tree)\n\t\tif !ok {\n\t\t\tpanic(\"fuse: Tree.Add for \" + strings.Join(elems[:i], \"/\") + \" and \" + path)\n\t\t}\n\t\tn := dt.lookup(elem)\n\t\tif n != nil {\n\t\t\tif i+1 == len(elems) {\n\t\t\t\tpanic(\"fuse: Tree.Add for \" + path + \" conflicts with \" + elem)\n\t\t\t}\n\t\t\tdir = n\n\t\t} else {\n\t\t\tif i+1 == len(elems) {\n\t\t\t\tdt.add(elem, node)\n\t\t\t} else {\n\t\t\t\tdir = &tree{}\n\t\t\t\tdt.add(elem, dir)\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype treeDir struct {\n\tname string\n\tnode Node\n}\n\ntype tree struct {\n\tdir []treeDir\n}\n\nfunc (t *tree) lookup(name string) Node {\n\tfor _, d := range t.dir {\n\t\tif d.name == name {\n\t\t\treturn d.node\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (t *tree) add(name string, n Node) {\n\tt.dir = append(t.dir, treeDir{name, n})\n}\n\nfunc (t *tree) Attr(ctx context.Context, a *fuse.Attr) error {\n\ta.Mode = os.ModeDir | 0555\n\treturn nil\n}\n\nfunc (t *tree) Lookup(ctx context.Context, name string) (Node, error) {\n\tn := t.lookup(name)\n\tif n != nil {\n\t\treturn n, nil\n\t}\n\treturn nil, fuse.ENOENT\n}\n\nfunc (t *tree) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {\n\tvar out []fuse.Dirent\n\tfor _, d := range t.dir {\n\t\tout = append(out, fuse.Dirent{Name: d.name})\n\t}\n\treturn out, nil\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse.go",
    "content": "// See the file LICENSE for copyright and licensing information.\n\n// Adapted from Plan 9 from User Space's src/cmd/9pfuse/fuse.c,\n// which carries this notice:\n//\n// The files in this directory are subject to the following license.\n//\n// The author of this software is Russ Cox.\n//\n//         Copyright (c) 2006 Russ Cox\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose without fee is hereby granted, provided that this entire notice\n// is included in all copies of any software which is or includes a copy\n// or modification of this software and in all copies of the supporting\n// documentation for such software.\n//\n// THIS SOFTWARE IS BEING PROVIDED \"AS IS\", WITHOUT ANY EXPRESS OR IMPLIED\n// WARRANTY.  IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION OR WARRANTY\n// OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS\n// FITNESS FOR ANY PARTICULAR PURPOSE.\n\n// Package fuse enables writing FUSE file systems on Linux, OS X, and FreeBSD.\n//\n// On OS X, it requires OSXFUSE (http://osxfuse.github.com/).\n//\n// There are two approaches to writing a FUSE file system.  The first is to speak\n// the low-level message protocol, reading from a Conn using ReadRequest and\n// writing using the various Respond methods.  This approach is closest to\n// the actual interaction with the kernel and can be the simplest one in contexts\n// such as protocol translators.\n//\n// Servers of synthesized file systems tend to share common\n// bookkeeping abstracted away by the second approach, which is to\n// call fs.Serve to serve the FUSE protocol using an implementation of\n// the service methods in the interfaces FS* (file system), Node* (file\n// or directory), and Handle* (opened file or directory).\n// There are a daunting number of such methods that can be written,\n// but few are required.\n// The specific methods are described in the documentation for those interfaces.\n//\n// The hellofs subdirectory contains a simple illustration of the fs.Serve approach.\n//\n// Service Methods\n//\n// The required and optional methods for the FS, Node, and Handle interfaces\n// have the general form\n//\n//\tOp(ctx context.Context, req *OpRequest, resp *OpResponse) error\n//\n// where Op is the name of a FUSE operation. Op reads request\n// parameters from req and writes results to resp. An operation whose\n// only result is the error result omits the resp parameter.\n//\n// Multiple goroutines may call service methods simultaneously; the\n// methods being called are responsible for appropriate\n// synchronization.\n//\n// The operation must not hold on to the request or response,\n// including any []byte fields such as WriteRequest.Data or\n// SetxattrRequest.Xattr.\n//\n// Errors\n//\n// Operations can return errors. The FUSE interface can only\n// communicate POSIX errno error numbers to file system clients, the\n// message is not visible to file system clients. The returned error\n// can implement ErrorNumber to control the errno returned. Without\n// ErrorNumber, a generic errno (EIO) is returned.\n//\n// Error messages will be visible in the debug log as part of the\n// response.\n//\n// Interrupted Operations\n//\n// In some file systems, some operations\n// may take an undetermined amount of time.  For example, a Read waiting for\n// a network message or a matching Write might wait indefinitely.  If the request\n// is cancelled and no longer needed, the context will be cancelled.\n// Blocking operations should select on a receive from ctx.Done() and attempt to\n// abort the operation early if the receive succeeds (meaning the channel is closed).\n// To indicate that the operation failed because it was aborted, return fuse.EINTR.\n//\n// If an operation does not block for an indefinite amount of time, supporting\n// cancellation is not necessary.\n//\n// Authentication\n//\n// All requests types embed a Header, meaning that the method can\n// inspect req.Pid, req.Uid, and req.Gid as necessary to implement\n// permission checking. The kernel FUSE layer normally prevents other\n// users from accessing the FUSE file system (to change this, see\n// AllowOther, AllowRoot), but does not enforce access modes (to\n// change this, see DefaultPermissions).\n//\n// Mount Options\n//\n// Behavior and metadata of the mounted file system can be changed by\n// passing MountOption values to Mount.\n//\npackage fuse // import \"bazil.org/fuse\"\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\t\"unsafe\"\n)\n\n// A Conn represents a connection to a mounted FUSE file system.\ntype Conn struct {\n\t// Ready is closed when the mount is complete or has failed.\n\tReady <-chan struct{}\n\n\t// MountError stores any error from the mount process. Only valid\n\t// after Ready is closed.\n\tMountError error\n\n\t// File handle for kernel communication. Only safe to access if\n\t// rio or wio is held.\n\tdev *os.File\n\twio sync.RWMutex\n\trio sync.RWMutex\n\n\t// Protocol version negotiated with InitRequest/InitResponse.\n\tproto Protocol\n}\n\n// MountpointDoesNotExistError is an error returned when the\n// mountpoint does not exist.\ntype MountpointDoesNotExistError struct {\n\tPath string\n}\n\nvar _ error = (*MountpointDoesNotExistError)(nil)\n\nfunc (e *MountpointDoesNotExistError) Error() string {\n\treturn fmt.Sprintf(\"mountpoint does not exist: %v\", e.Path)\n}\n\n// Mount mounts a new FUSE connection on the named directory\n// and returns a connection for reading and writing FUSE messages.\n//\n// After a successful return, caller must call Close to free\n// resources.\n//\n// Even on successful return, the new mount is not guaranteed to be\n// visible until after Conn.Ready is closed. See Conn.MountError for\n// possible errors. Incoming requests on Conn must be served to make\n// progress.\nfunc Mount(dir string, options ...MountOption) (*Conn, error) {\n\tconf := mountConfig{\n\t\toptions: make(map[string]string),\n\t}\n\tfor _, option := range options {\n\t\tif err := option(&conf); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tready := make(chan struct{}, 1)\n\tc := &Conn{\n\t\tReady: ready,\n\t}\n\tf, err := mount(dir, &conf, ready, &c.MountError)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc.dev = f\n\n\tif err := initMount(c, &conf); err != nil {\n\t\tc.Close()\n\t\tif err == ErrClosedWithoutInit {\n\t\t\t// see if we can provide a better error\n\t\t\t<-c.Ready\n\t\t\tif err := c.MountError; err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\treturn nil, err\n\t}\n\n\treturn c, nil\n}\n\ntype OldVersionError struct {\n\tKernel     Protocol\n\tLibraryMin Protocol\n}\n\nfunc (e *OldVersionError) Error() string {\n\treturn fmt.Sprintf(\"kernel FUSE version is too old: %v < %v\", e.Kernel, e.LibraryMin)\n}\n\nvar (\n\tErrClosedWithoutInit = errors.New(\"fuse connection closed without init\")\n)\n\nfunc initMount(c *Conn, conf *mountConfig) error {\n\treq, err := c.ReadRequest()\n\tif err != nil {\n\t\tif err == io.EOF {\n\t\t\treturn ErrClosedWithoutInit\n\t\t}\n\t\treturn err\n\t}\n\tr, ok := req.(*InitRequest)\n\tif !ok {\n\t\treturn fmt.Errorf(\"missing init, got: %T\", req)\n\t}\n\n\tmin := Protocol{protoVersionMinMajor, protoVersionMinMinor}\n\tif r.Kernel.LT(min) {\n\t\treq.RespondError(Errno(syscall.EPROTO))\n\t\tc.Close()\n\t\treturn &OldVersionError{\n\t\t\tKernel:     r.Kernel,\n\t\t\tLibraryMin: min,\n\t\t}\n\t}\n\n\tproto := Protocol{protoVersionMaxMajor, protoVersionMaxMinor}\n\tif r.Kernel.LT(proto) {\n\t\t// Kernel doesn't support the latest version we have.\n\t\tproto = r.Kernel\n\t}\n\tc.proto = proto\n\n\ts := &InitResponse{\n\t\tLibrary:      proto,\n\t\tMaxReadahead: conf.maxReadahead,\n\t\tMaxWrite:     maxWrite,\n\t\tFlags:        InitBigWrites | conf.initFlags,\n\t}\n\tr.Respond(s)\n\treturn nil\n}\n\n// A Request represents a single FUSE request received from the kernel.\n// Use a type switch to determine the specific kind.\n// A request of unrecognized type will have concrete type *Header.\ntype Request interface {\n\t// Hdr returns the Header associated with this request.\n\tHdr() *Header\n\n\t// RespondError responds to the request with the given error.\n\tRespondError(error)\n\n\tString() string\n}\n\n// A RequestID identifies an active FUSE request.\ntype RequestID uint64\n\nfunc (r RequestID) String() string {\n\treturn fmt.Sprintf(\"%#x\", uint64(r))\n}\n\n// A NodeID is a number identifying a directory or file.\n// It must be unique among IDs returned in LookupResponses\n// that have not yet been forgotten by ForgetRequests.\ntype NodeID uint64\n\nfunc (n NodeID) String() string {\n\treturn fmt.Sprintf(\"%#x\", uint64(n))\n}\n\n// A HandleID is a number identifying an open directory or file.\n// It only needs to be unique while the directory or file is open.\ntype HandleID uint64\n\nfunc (h HandleID) String() string {\n\treturn fmt.Sprintf(\"%#x\", uint64(h))\n}\n\n// The RootID identifies the root directory of a FUSE file system.\nconst RootID NodeID = rootID\n\n// A Header describes the basic information sent in every request.\ntype Header struct {\n\tConn *Conn     `json:\"-\"` // connection this request was received on\n\tID   RequestID // unique ID for request\n\tNode NodeID    // file or directory the request is about\n\tUid  uint32    // user ID of process making request\n\tGid  uint32    // group ID of process making request\n\tPid  uint32    // process ID of process making request\n\n\t// for returning to reqPool\n\tmsg *message\n}\n\nfunc (h *Header) String() string {\n\treturn fmt.Sprintf(\"ID=%v Node=%v Uid=%d Gid=%d Pid=%d\", h.ID, h.Node, h.Uid, h.Gid, h.Pid)\n}\n\nfunc (h *Header) Hdr() *Header {\n\treturn h\n}\n\nfunc (h *Header) noResponse() {\n\tputMessage(h.msg)\n}\n\nfunc (h *Header) respond(msg []byte) {\n\tout := (*outHeader)(unsafe.Pointer(&msg[0]))\n\tout.Unique = uint64(h.ID)\n\th.Conn.respond(msg)\n\tputMessage(h.msg)\n}\n\n// An ErrorNumber is an error with a specific error number.\n//\n// Operations may return an error value that implements ErrorNumber to\n// control what specific error number (errno) to return.\ntype ErrorNumber interface {\n\t// Errno returns the the error number (errno) for this error.\n\tErrno() Errno\n}\n\nconst (\n\t// ENOSYS indicates that the call is not supported.\n\tENOSYS = Errno(syscall.ENOSYS)\n\n\t// ESTALE is used by Serve to respond to violations of the FUSE protocol.\n\tESTALE = Errno(syscall.ESTALE)\n\n\tENOENT = Errno(syscall.ENOENT)\n\tEIO    = Errno(syscall.EIO)\n\tEPERM  = Errno(syscall.EPERM)\n\n\t// EINTR indicates request was interrupted by an InterruptRequest.\n\t// See also fs.Intr.\n\tEINTR = Errno(syscall.EINTR)\n\n\tERANGE  = Errno(syscall.ERANGE)\n\tENOTSUP = Errno(syscall.ENOTSUP)\n\tEEXIST  = Errno(syscall.EEXIST)\n)\n\n// DefaultErrno is the errno used when error returned does not\n// implement ErrorNumber.\nconst DefaultErrno = EIO\n\nvar errnoNames = map[Errno]string{\n\tENOSYS: \"ENOSYS\",\n\tESTALE: \"ESTALE\",\n\tENOENT: \"ENOENT\",\n\tEIO:    \"EIO\",\n\tEPERM:  \"EPERM\",\n\tEINTR:  \"EINTR\",\n\tEEXIST: \"EEXIST\",\n}\n\n// Errno implements Error and ErrorNumber using a syscall.Errno.\ntype Errno syscall.Errno\n\nvar _ = ErrorNumber(Errno(0))\nvar _ = error(Errno(0))\n\nfunc (e Errno) Errno() Errno {\n\treturn e\n}\n\nfunc (e Errno) String() string {\n\treturn syscall.Errno(e).Error()\n}\n\nfunc (e Errno) Error() string {\n\treturn syscall.Errno(e).Error()\n}\n\n// ErrnoName returns the short non-numeric identifier for this errno.\n// For example, \"EIO\".\nfunc (e Errno) ErrnoName() string {\n\ts := errnoNames[e]\n\tif s == \"\" {\n\t\ts = fmt.Sprint(e.Errno())\n\t}\n\treturn s\n}\n\nfunc (e Errno) MarshalText() ([]byte, error) {\n\ts := e.ErrnoName()\n\treturn []byte(s), nil\n}\n\nfunc (h *Header) RespondError(err error) {\n\terrno := DefaultErrno\n\tif ferr, ok := err.(ErrorNumber); ok {\n\t\terrno = ferr.Errno()\n\t}\n\t// FUSE uses negative errors!\n\t// TODO: File bug report against OSXFUSE: positive error causes kernel panic.\n\tbuf := newBuffer(0)\n\thOut := (*outHeader)(unsafe.Pointer(&buf[0]))\n\thOut.Error = -int32(errno)\n\th.respond(buf)\n}\n\n// All requests read from the kernel, without data, are shorter than\n// this.\nvar maxRequestSize = syscall.Getpagesize()\nvar bufSize = maxRequestSize + maxWrite\n\n// reqPool is a pool of messages.\n//\n// Lifetime of a logical message is from getMessage to putMessage.\n// getMessage is called by ReadRequest. putMessage is called by\n// Conn.ReadRequest, Request.Respond, or Request.RespondError.\n//\n// Messages in the pool are guaranteed to have conn and off zeroed,\n// buf allocated and len==bufSize, and hdr set.\nvar reqPool = sync.Pool{\n\tNew: allocMessage,\n}\n\nfunc allocMessage() interface{} {\n\tm := &message{buf: make([]byte, bufSize)}\n\tm.hdr = (*inHeader)(unsafe.Pointer(&m.buf[0]))\n\treturn m\n}\n\nfunc getMessage(c *Conn) *message {\n\tm := reqPool.Get().(*message)\n\tm.conn = c\n\treturn m\n}\n\nfunc putMessage(m *message) {\n\tm.buf = m.buf[:bufSize]\n\tm.conn = nil\n\tm.off = 0\n\treqPool.Put(m)\n}\n\n// a message represents the bytes of a single FUSE message\ntype message struct {\n\tconn *Conn\n\tbuf  []byte    // all bytes\n\thdr  *inHeader // header\n\toff  int       // offset for reading additional fields\n}\n\nfunc (m *message) len() uintptr {\n\treturn uintptr(len(m.buf) - m.off)\n}\n\nfunc (m *message) data() unsafe.Pointer {\n\tvar p unsafe.Pointer\n\tif m.off < len(m.buf) {\n\t\tp = unsafe.Pointer(&m.buf[m.off])\n\t}\n\treturn p\n}\n\nfunc (m *message) bytes() []byte {\n\treturn m.buf[m.off:]\n}\n\nfunc (m *message) Header() Header {\n\th := m.hdr\n\treturn Header{\n\t\tConn: m.conn,\n\t\tID:   RequestID(h.Unique),\n\t\tNode: NodeID(h.Nodeid),\n\t\tUid:  h.Uid,\n\t\tGid:  h.Gid,\n\t\tPid:  h.Pid,\n\n\t\tmsg: m,\n\t}\n}\n\n// fileMode returns a Go os.FileMode from a Unix mode.\nfunc fileMode(unixMode uint32) os.FileMode {\n\tmode := os.FileMode(unixMode & 0777)\n\tswitch unixMode & syscall.S_IFMT {\n\tcase syscall.S_IFREG:\n\t\t// nothing\n\tcase syscall.S_IFDIR:\n\t\tmode |= os.ModeDir\n\tcase syscall.S_IFCHR:\n\t\tmode |= os.ModeCharDevice | os.ModeDevice\n\tcase syscall.S_IFBLK:\n\t\tmode |= os.ModeDevice\n\tcase syscall.S_IFIFO:\n\t\tmode |= os.ModeNamedPipe\n\tcase syscall.S_IFLNK:\n\t\tmode |= os.ModeSymlink\n\tcase syscall.S_IFSOCK:\n\t\tmode |= os.ModeSocket\n\tdefault:\n\t\t// no idea\n\t\tmode |= os.ModeDevice\n\t}\n\tif unixMode&syscall.S_ISUID != 0 {\n\t\tmode |= os.ModeSetuid\n\t}\n\tif unixMode&syscall.S_ISGID != 0 {\n\t\tmode |= os.ModeSetgid\n\t}\n\treturn mode\n}\n\ntype noOpcode struct {\n\tOpcode uint32\n}\n\nfunc (m noOpcode) String() string {\n\treturn fmt.Sprintf(\"No opcode %v\", m.Opcode)\n}\n\ntype malformedMessage struct {\n}\n\nfunc (malformedMessage) String() string {\n\treturn \"malformed message\"\n}\n\n// Close closes the FUSE connection.\nfunc (c *Conn) Close() error {\n\tc.wio.Lock()\n\tdefer c.wio.Unlock()\n\tc.rio.Lock()\n\tdefer c.rio.Unlock()\n\treturn c.dev.Close()\n}\n\n// caller must hold wio or rio\nfunc (c *Conn) fd() int {\n\treturn int(c.dev.Fd())\n}\n\nfunc (c *Conn) Protocol() Protocol {\n\treturn c.proto\n}\n\n// ReadRequest returns the next FUSE request from the kernel.\n//\n// Caller must call either Request.Respond or Request.RespondError in\n// a reasonable time. Caller must not retain Request after that call.\nfunc (c *Conn) ReadRequest() (Request, error) {\n\tm := getMessage(c)\nloop:\n\tc.rio.RLock()\n\tn, err := syscall.Read(c.fd(), m.buf)\n\tc.rio.RUnlock()\n\tif err == syscall.EINTR {\n\t\t// OSXFUSE sends EINTR to userspace when a request interrupt\n\t\t// completed before it got sent to userspace?\n\t\tgoto loop\n\t}\n\tif err != nil && err != syscall.ENODEV {\n\t\tputMessage(m)\n\t\treturn nil, err\n\t}\n\tif n <= 0 {\n\t\tputMessage(m)\n\t\treturn nil, io.EOF\n\t}\n\tm.buf = m.buf[:n]\n\n\tif n < inHeaderSize {\n\t\tputMessage(m)\n\t\treturn nil, errors.New(\"fuse: message too short\")\n\t}\n\n\t// FreeBSD FUSE sends a short length in the header\n\t// for FUSE_INIT even though the actual read length is correct.\n\tif n == inHeaderSize+initInSize && m.hdr.Opcode == opInit && m.hdr.Len < uint32(n) {\n\t\tm.hdr.Len = uint32(n)\n\t}\n\n\t// OSXFUSE sometimes sends the wrong m.hdr.Len in a FUSE_WRITE message.\n\tif m.hdr.Len < uint32(n) && m.hdr.Len >= uint32(unsafe.Sizeof(writeIn{})) && m.hdr.Opcode == opWrite {\n\t\tm.hdr.Len = uint32(n)\n\t}\n\n\tif m.hdr.Len != uint32(n) {\n\t\t// prepare error message before returning m to pool\n\t\terr := fmt.Errorf(\"fuse: read %d opcode %d but expected %d\", n, m.hdr.Opcode, m.hdr.Len)\n\t\tputMessage(m)\n\t\treturn nil, err\n\t}\n\n\tm.off = inHeaderSize\n\n\t// Convert to data structures.\n\t// Do not trust kernel to hand us well-formed data.\n\tvar req Request\n\tswitch m.hdr.Opcode {\n\tdefault:\n\t\tDebug(noOpcode{Opcode: m.hdr.Opcode})\n\t\tgoto unrecognized\n\n\tcase opLookup:\n\t\tbuf := m.bytes()\n\t\tn := len(buf)\n\t\tif n == 0 || buf[n-1] != '\\x00' {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &LookupRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tName:   string(buf[:n-1]),\n\t\t}\n\n\tcase opForget:\n\t\tin := (*forgetIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &ForgetRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tN:      in.Nlookup,\n\t\t}\n\n\tcase opGetattr:\n\t\tswitch {\n\t\tcase c.proto.LT(Protocol{7, 9}):\n\t\t\treq = &GetattrRequest{\n\t\t\t\tHeader: m.Header(),\n\t\t\t}\n\n\t\tdefault:\n\t\t\tin := (*getattrIn)(m.data())\n\t\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\t\tgoto corrupt\n\t\t\t}\n\t\t\treq = &GetattrRequest{\n\t\t\t\tHeader: m.Header(),\n\t\t\t\tFlags:  GetattrFlags(in.GetattrFlags),\n\t\t\t\tHandle: HandleID(in.Fh),\n\t\t\t}\n\t\t}\n\n\tcase opSetattr:\n\t\tin := (*setattrIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &SetattrRequest{\n\t\t\tHeader:   m.Header(),\n\t\t\tValid:    SetattrValid(in.Valid),\n\t\t\tHandle:   HandleID(in.Fh),\n\t\t\tSize:     in.Size,\n\t\t\tAtime:    time.Unix(int64(in.Atime), int64(in.AtimeNsec)),\n\t\t\tMtime:    time.Unix(int64(in.Mtime), int64(in.MtimeNsec)),\n\t\t\tMode:     fileMode(in.Mode),\n\t\t\tUid:      in.Uid,\n\t\t\tGid:      in.Gid,\n\t\t\tBkuptime: in.BkupTime(),\n\t\t\tChgtime:  in.Chgtime(),\n\t\t\tFlags:    in.Flags(),\n\t\t}\n\n\tcase opReadlink:\n\t\tif len(m.bytes()) > 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &ReadlinkRequest{\n\t\t\tHeader: m.Header(),\n\t\t}\n\n\tcase opSymlink:\n\t\t// m.bytes() is \"newName\\0target\\0\"\n\t\tnames := m.bytes()\n\t\tif len(names) == 0 || names[len(names)-1] != 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\ti := bytes.IndexByte(names, '\\x00')\n\t\tif i < 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\tnewName, target := names[0:i], names[i+1:len(names)-1]\n\t\treq = &SymlinkRequest{\n\t\t\tHeader:  m.Header(),\n\t\t\tNewName: string(newName),\n\t\t\tTarget:  string(target),\n\t\t}\n\n\tcase opLink:\n\t\tin := (*linkIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\tnewName := m.bytes()[unsafe.Sizeof(*in):]\n\t\tif len(newName) < 2 || newName[len(newName)-1] != 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\tnewName = newName[:len(newName)-1]\n\t\treq = &LinkRequest{\n\t\t\tHeader:  m.Header(),\n\t\t\tOldNode: NodeID(in.Oldnodeid),\n\t\t\tNewName: string(newName),\n\t\t}\n\n\tcase opMknod:\n\t\tsize := mknodInSize(c.proto)\n\t\tif m.len() < size {\n\t\t\tgoto corrupt\n\t\t}\n\t\tin := (*mknodIn)(m.data())\n\t\tname := m.bytes()[size:]\n\t\tif len(name) < 2 || name[len(name)-1] != '\\x00' {\n\t\t\tgoto corrupt\n\t\t}\n\t\tname = name[:len(name)-1]\n\t\tr := &MknodRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tMode:   fileMode(in.Mode),\n\t\t\tRdev:   in.Rdev,\n\t\t\tName:   string(name),\n\t\t}\n\t\tif c.proto.GE(Protocol{7, 12}) {\n\t\t\tr.Umask = fileMode(in.Umask) & os.ModePerm\n\t\t}\n\t\treq = r\n\n\tcase opMkdir:\n\t\tsize := mkdirInSize(c.proto)\n\t\tif m.len() < size {\n\t\t\tgoto corrupt\n\t\t}\n\t\tin := (*mkdirIn)(m.data())\n\t\tname := m.bytes()[size:]\n\t\ti := bytes.IndexByte(name, '\\x00')\n\t\tif i < 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\tr := &MkdirRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tName:   string(name[:i]),\n\t\t\t// observed on Linux: mkdirIn.Mode & syscall.S_IFMT == 0,\n\t\t\t// and this causes fileMode to go into it's \"no idea\"\n\t\t\t// code branch; enforce type to directory\n\t\t\tMode: fileMode((in.Mode &^ syscall.S_IFMT) | syscall.S_IFDIR),\n\t\t}\n\t\tif c.proto.GE(Protocol{7, 12}) {\n\t\t\tr.Umask = fileMode(in.Umask) & os.ModePerm\n\t\t}\n\t\treq = r\n\n\tcase opUnlink, opRmdir:\n\t\tbuf := m.bytes()\n\t\tn := len(buf)\n\t\tif n == 0 || buf[n-1] != '\\x00' {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &RemoveRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tName:   string(buf[:n-1]),\n\t\t\tDir:    m.hdr.Opcode == opRmdir,\n\t\t}\n\n\tcase opRename:\n\t\tin := (*renameIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\tnewDirNodeID := NodeID(in.Newdir)\n\t\toldNew := m.bytes()[unsafe.Sizeof(*in):]\n\t\t// oldNew should be \"old\\x00new\\x00\"\n\t\tif len(oldNew) < 4 {\n\t\t\tgoto corrupt\n\t\t}\n\t\tif oldNew[len(oldNew)-1] != '\\x00' {\n\t\t\tgoto corrupt\n\t\t}\n\t\ti := bytes.IndexByte(oldNew, '\\x00')\n\t\tif i < 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\toldName, newName := string(oldNew[:i]), string(oldNew[i+1:len(oldNew)-1])\n\t\treq = &RenameRequest{\n\t\t\tHeader:  m.Header(),\n\t\t\tNewDir:  newDirNodeID,\n\t\t\tOldName: oldName,\n\t\t\tNewName: newName,\n\t\t}\n\n\tcase opOpendir, opOpen:\n\t\tin := (*openIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &OpenRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tDir:    m.hdr.Opcode == opOpendir,\n\t\t\tFlags:  openFlags(in.Flags),\n\t\t}\n\n\tcase opRead, opReaddir:\n\t\tin := (*readIn)(m.data())\n\t\tif m.len() < readInSize(c.proto) {\n\t\t\tgoto corrupt\n\t\t}\n\t\tr := &ReadRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tDir:    m.hdr.Opcode == opReaddir,\n\t\t\tHandle: HandleID(in.Fh),\n\t\t\tOffset: int64(in.Offset),\n\t\t\tSize:   int(in.Size),\n\t\t}\n\t\tif c.proto.GE(Protocol{7, 9}) {\n\t\t\tr.Flags = ReadFlags(in.ReadFlags)\n\t\t\tr.LockOwner = in.LockOwner\n\t\t\tr.FileFlags = openFlags(in.Flags)\n\t\t}\n\t\treq = r\n\n\tcase opWrite:\n\t\tin := (*writeIn)(m.data())\n\t\tif m.len() < writeInSize(c.proto) {\n\t\t\tgoto corrupt\n\t\t}\n\t\tr := &WriteRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tHandle: HandleID(in.Fh),\n\t\t\tOffset: int64(in.Offset),\n\t\t\tFlags:  WriteFlags(in.WriteFlags),\n\t\t}\n\t\tif c.proto.GE(Protocol{7, 9}) {\n\t\t\tr.LockOwner = in.LockOwner\n\t\t\tr.FileFlags = openFlags(in.Flags)\n\t\t}\n\t\tbuf := m.bytes()[writeInSize(c.proto):]\n\t\tif uint32(len(buf)) < in.Size {\n\t\t\tgoto corrupt\n\t\t}\n\t\tr.Data = buf\n\t\treq = r\n\n\tcase opStatfs:\n\t\treq = &StatfsRequest{\n\t\t\tHeader: m.Header(),\n\t\t}\n\n\tcase opRelease, opReleasedir:\n\t\tin := (*releaseIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &ReleaseRequest{\n\t\t\tHeader:       m.Header(),\n\t\t\tDir:          m.hdr.Opcode == opReleasedir,\n\t\t\tHandle:       HandleID(in.Fh),\n\t\t\tFlags:        openFlags(in.Flags),\n\t\t\tReleaseFlags: ReleaseFlags(in.ReleaseFlags),\n\t\t\tLockOwner:    in.LockOwner,\n\t\t}\n\n\tcase opFsync, opFsyncdir:\n\t\tin := (*fsyncIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &FsyncRequest{\n\t\t\tDir:    m.hdr.Opcode == opFsyncdir,\n\t\t\tHeader: m.Header(),\n\t\t\tHandle: HandleID(in.Fh),\n\t\t\tFlags:  in.FsyncFlags,\n\t\t}\n\n\tcase opSetxattr:\n\t\tin := (*setxattrIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\tm.off += int(unsafe.Sizeof(*in))\n\t\tname := m.bytes()\n\t\ti := bytes.IndexByte(name, '\\x00')\n\t\tif i < 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\txattr := name[i+1:]\n\t\tif uint32(len(xattr)) < in.Size {\n\t\t\tgoto corrupt\n\t\t}\n\t\txattr = xattr[:in.Size]\n\t\treq = &SetxattrRequest{\n\t\t\tHeader:   m.Header(),\n\t\t\tFlags:    in.Flags,\n\t\t\tPosition: in.position(),\n\t\t\tName:     string(name[:i]),\n\t\t\tXattr:    xattr,\n\t\t}\n\n\tcase opGetxattr:\n\t\tin := (*getxattrIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\tname := m.bytes()[unsafe.Sizeof(*in):]\n\t\ti := bytes.IndexByte(name, '\\x00')\n\t\tif i < 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &GetxattrRequest{\n\t\t\tHeader:   m.Header(),\n\t\t\tName:     string(name[:i]),\n\t\t\tSize:     in.Size,\n\t\t\tPosition: in.position(),\n\t\t}\n\n\tcase opListxattr:\n\t\tin := (*getxattrIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &ListxattrRequest{\n\t\t\tHeader:   m.Header(),\n\t\t\tSize:     in.Size,\n\t\t\tPosition: in.position(),\n\t\t}\n\n\tcase opRemovexattr:\n\t\tbuf := m.bytes()\n\t\tn := len(buf)\n\t\tif n == 0 || buf[n-1] != '\\x00' {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &RemovexattrRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tName:   string(buf[:n-1]),\n\t\t}\n\n\tcase opFlush:\n\t\tin := (*flushIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &FlushRequest{\n\t\t\tHeader:    m.Header(),\n\t\t\tHandle:    HandleID(in.Fh),\n\t\t\tFlags:     in.FlushFlags,\n\t\t\tLockOwner: in.LockOwner,\n\t\t}\n\n\tcase opInit:\n\t\tin := (*initIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &InitRequest{\n\t\t\tHeader:       m.Header(),\n\t\t\tKernel:       Protocol{in.Major, in.Minor},\n\t\t\tMaxReadahead: in.MaxReadahead,\n\t\t\tFlags:        InitFlags(in.Flags),\n\t\t}\n\n\tcase opGetlk:\n\t\tpanic(\"opGetlk\")\n\tcase opSetlk:\n\t\tpanic(\"opSetlk\")\n\tcase opSetlkw:\n\t\tpanic(\"opSetlkw\")\n\n\tcase opAccess:\n\t\tin := (*accessIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &AccessRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tMask:   in.Mask,\n\t\t}\n\n\tcase opCreate:\n\t\tsize := createInSize(c.proto)\n\t\tif m.len() < size {\n\t\t\tgoto corrupt\n\t\t}\n\t\tin := (*createIn)(m.data())\n\t\tname := m.bytes()[size:]\n\t\ti := bytes.IndexByte(name, '\\x00')\n\t\tif i < 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\tr := &CreateRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tFlags:  openFlags(in.Flags),\n\t\t\tMode:   fileMode(in.Mode),\n\t\t\tName:   string(name[:i]),\n\t\t}\n\t\tif c.proto.GE(Protocol{7, 12}) {\n\t\t\tr.Umask = fileMode(in.Umask) & os.ModePerm\n\t\t}\n\t\treq = r\n\n\tcase opInterrupt:\n\t\tin := (*interruptIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\treq = &InterruptRequest{\n\t\t\tHeader: m.Header(),\n\t\t\tIntrID: RequestID(in.Unique),\n\t\t}\n\n\tcase opBmap:\n\t\tpanic(\"opBmap\")\n\n\tcase opDestroy:\n\t\treq = &DestroyRequest{\n\t\t\tHeader: m.Header(),\n\t\t}\n\n\t// OS X\n\tcase opSetvolname:\n\t\tpanic(\"opSetvolname\")\n\tcase opGetxtimes:\n\t\tpanic(\"opGetxtimes\")\n\tcase opExchange:\n\t\tin := (*exchangeIn)(m.data())\n\t\tif m.len() < unsafe.Sizeof(*in) {\n\t\t\tgoto corrupt\n\t\t}\n\t\toldDirNodeID := NodeID(in.Olddir)\n\t\tnewDirNodeID := NodeID(in.Newdir)\n\t\toldNew := m.bytes()[unsafe.Sizeof(*in):]\n\t\t// oldNew should be \"oldname\\x00newname\\x00\"\n\t\tif len(oldNew) < 4 {\n\t\t\tgoto corrupt\n\t\t}\n\t\tif oldNew[len(oldNew)-1] != '\\x00' {\n\t\t\tgoto corrupt\n\t\t}\n\t\ti := bytes.IndexByte(oldNew, '\\x00')\n\t\tif i < 0 {\n\t\t\tgoto corrupt\n\t\t}\n\t\toldName, newName := string(oldNew[:i]), string(oldNew[i+1:len(oldNew)-1])\n\t\treq = &ExchangeDataRequest{\n\t\t\tHeader:  m.Header(),\n\t\t\tOldDir:  oldDirNodeID,\n\t\t\tNewDir:  newDirNodeID,\n\t\t\tOldName: oldName,\n\t\t\tNewName: newName,\n\t\t\t// TODO options\n\t\t}\n\t}\n\n\treturn req, nil\n\ncorrupt:\n\tDebug(malformedMessage{})\n\tputMessage(m)\n\treturn nil, fmt.Errorf(\"fuse: malformed message\")\n\nunrecognized:\n\t// Unrecognized message.\n\t// Assume higher-level code will send a \"no idea what you mean\" error.\n\th := m.Header()\n\treturn &h, nil\n}\n\ntype bugShortKernelWrite struct {\n\tWritten int64\n\tLength  int64\n\tError   string\n\tStack   string\n}\n\nfunc (b bugShortKernelWrite) String() string {\n\treturn fmt.Sprintf(\"short kernel write: written=%d/%d error=%q stack=\\n%s\", b.Written, b.Length, b.Error, b.Stack)\n}\n\ntype bugKernelWriteError struct {\n\tError string\n\tStack string\n}\n\nfunc (b bugKernelWriteError) String() string {\n\treturn fmt.Sprintf(\"kernel write error: error=%q stack=\\n%s\", b.Error, b.Stack)\n}\n\n// safe to call even with nil error\nfunc errorString(err error) string {\n\tif err == nil {\n\t\treturn \"\"\n\t}\n\treturn err.Error()\n}\n\nfunc (c *Conn) writeToKernel(msg []byte) error {\n\tout := (*outHeader)(unsafe.Pointer(&msg[0]))\n\tout.Len = uint32(len(msg))\n\n\tc.wio.RLock()\n\tdefer c.wio.RUnlock()\n\tnn, err := syscall.Write(c.fd(), msg)\n\tif err == nil && nn != len(msg) {\n\t\tDebug(bugShortKernelWrite{\n\t\t\tWritten: int64(nn),\n\t\t\tLength:  int64(len(msg)),\n\t\t\tError:   errorString(err),\n\t\t\tStack:   stack(),\n\t\t})\n\t}\n\treturn err\n}\n\nfunc (c *Conn) respond(msg []byte) {\n\tif err := c.writeToKernel(msg); err != nil {\n\t\tDebug(bugKernelWriteError{\n\t\t\tError: errorString(err),\n\t\t\tStack: stack(),\n\t\t})\n\t}\n}\n\ntype notCachedError struct{}\n\nfunc (notCachedError) Error() string {\n\treturn \"node not cached\"\n}\n\nvar _ ErrorNumber = notCachedError{}\n\nfunc (notCachedError) Errno() Errno {\n\t// Behave just like if the original syscall.ENOENT had been passed\n\t// straight through.\n\treturn ENOENT\n}\n\nvar (\n\tErrNotCached = notCachedError{}\n)\n\n// sendInvalidate sends an invalidate notification to kernel.\n//\n// A returned ENOENT is translated to a friendlier error.\nfunc (c *Conn) sendInvalidate(msg []byte) error {\n\tswitch err := c.writeToKernel(msg); err {\n\tcase syscall.ENOENT:\n\t\treturn ErrNotCached\n\tdefault:\n\t\treturn err\n\t}\n}\n\n// InvalidateNode invalidates the kernel cache of the attributes and a\n// range of the data of a node.\n//\n// Giving offset 0 and size -1 means all data. To invalidate just the\n// attributes, give offset 0 and size 0.\n//\n// Returns ErrNotCached if the kernel is not currently caching the\n// node.\nfunc (c *Conn) InvalidateNode(nodeID NodeID, off int64, size int64) error {\n\tbuf := newBuffer(unsafe.Sizeof(notifyInvalInodeOut{}))\n\th := (*outHeader)(unsafe.Pointer(&buf[0]))\n\t// h.Unique is 0\n\th.Error = notifyCodeInvalInode\n\tout := (*notifyInvalInodeOut)(buf.alloc(unsafe.Sizeof(notifyInvalInodeOut{})))\n\tout.Ino = uint64(nodeID)\n\tout.Off = off\n\tout.Len = size\n\treturn c.sendInvalidate(buf)\n}\n\n// InvalidateEntry invalidates the kernel cache of the directory entry\n// identified by parent directory node ID and entry basename.\n//\n// Kernel may or may not cache directory listings. To invalidate\n// those, use InvalidateNode to invalidate all of the data for a\n// directory. (As of 2015-06, Linux FUSE does not cache directory\n// listings.)\n//\n// Returns ErrNotCached if the kernel is not currently caching the\n// node.\nfunc (c *Conn) InvalidateEntry(parent NodeID, name string) error {\n\tconst maxUint32 = ^uint32(0)\n\tif uint64(len(name)) > uint64(maxUint32) {\n\t\t// very unlikely, but we don't want to silently truncate\n\t\treturn syscall.ENAMETOOLONG\n\t}\n\tbuf := newBuffer(unsafe.Sizeof(notifyInvalEntryOut{}) + uintptr(len(name)) + 1)\n\th := (*outHeader)(unsafe.Pointer(&buf[0]))\n\t// h.Unique is 0\n\th.Error = notifyCodeInvalEntry\n\tout := (*notifyInvalEntryOut)(buf.alloc(unsafe.Sizeof(notifyInvalEntryOut{})))\n\tout.Parent = uint64(parent)\n\tout.Namelen = uint32(len(name))\n\tbuf = append(buf, name...)\n\tbuf = append(buf, '\\x00')\n\treturn c.sendInvalidate(buf)\n}\n\n// An InitRequest is the first request sent on a FUSE file system.\ntype InitRequest struct {\n\tHeader `json:\"-\"`\n\tKernel Protocol\n\t// Maximum readahead in bytes that the kernel plans to use.\n\tMaxReadahead uint32\n\tFlags        InitFlags\n}\n\nvar _ = Request(&InitRequest{})\n\nfunc (r *InitRequest) String() string {\n\treturn fmt.Sprintf(\"Init [%v] %v ra=%d fl=%v\", &r.Header, r.Kernel, r.MaxReadahead, r.Flags)\n}\n\n// An InitResponse is the response to an InitRequest.\ntype InitResponse struct {\n\tLibrary Protocol\n\t// Maximum readahead in bytes that the kernel can use. Ignored if\n\t// greater than InitRequest.MaxReadahead.\n\tMaxReadahead uint32\n\tFlags        InitFlags\n\t// Maximum size of a single write operation.\n\t// Linux enforces a minimum of 4 KiB.\n\tMaxWrite uint32\n}\n\nfunc (r *InitResponse) String() string {\n\treturn fmt.Sprintf(\"Init %v ra=%d fl=%v w=%d\", r.Library, r.MaxReadahead, r.Flags, r.MaxWrite)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *InitRequest) Respond(resp *InitResponse) {\n\tbuf := newBuffer(unsafe.Sizeof(initOut{}))\n\tout := (*initOut)(buf.alloc(unsafe.Sizeof(initOut{})))\n\tout.Major = resp.Library.Major\n\tout.Minor = resp.Library.Minor\n\tout.MaxReadahead = resp.MaxReadahead\n\tout.Flags = uint32(resp.Flags)\n\tout.MaxWrite = resp.MaxWrite\n\n\t// MaxWrite larger than our receive buffer would just lead to\n\t// errors on large writes.\n\tif out.MaxWrite > maxWrite {\n\t\tout.MaxWrite = maxWrite\n\t}\n\tr.respond(buf)\n}\n\n// A StatfsRequest requests information about the mounted file system.\ntype StatfsRequest struct {\n\tHeader `json:\"-\"`\n}\n\nvar _ = Request(&StatfsRequest{})\n\nfunc (r *StatfsRequest) String() string {\n\treturn fmt.Sprintf(\"Statfs [%s]\", &r.Header)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *StatfsRequest) Respond(resp *StatfsResponse) {\n\tbuf := newBuffer(unsafe.Sizeof(statfsOut{}))\n\tout := (*statfsOut)(buf.alloc(unsafe.Sizeof(statfsOut{})))\n\tout.St = kstatfs{\n\t\tBlocks:  resp.Blocks,\n\t\tBfree:   resp.Bfree,\n\t\tBavail:  resp.Bavail,\n\t\tFiles:   resp.Files,\n\t\tBsize:   resp.Bsize,\n\t\tNamelen: resp.Namelen,\n\t\tFrsize:  resp.Frsize,\n\t}\n\tr.respond(buf)\n}\n\n// A StatfsResponse is the response to a StatfsRequest.\ntype StatfsResponse struct {\n\tBlocks  uint64 // Total data blocks in file system.\n\tBfree   uint64 // Free blocks in file system.\n\tBavail  uint64 // Free blocks in file system if you're not root.\n\tFiles   uint64 // Total files in file system.\n\tFfree   uint64 // Free files in file system.\n\tBsize   uint32 // Block size\n\tNamelen uint32 // Maximum file name length?\n\tFrsize  uint32 // Fragment size, smallest addressable data size in the file system.\n}\n\nfunc (r *StatfsResponse) String() string {\n\treturn fmt.Sprintf(\"Statfs blocks=%d/%d/%d files=%d/%d bsize=%d frsize=%d namelen=%d\",\n\t\tr.Bavail, r.Bfree, r.Blocks,\n\t\tr.Ffree, r.Files,\n\t\tr.Bsize,\n\t\tr.Frsize,\n\t\tr.Namelen,\n\t)\n}\n\n// An AccessRequest asks whether the file can be accessed\n// for the purpose specified by the mask.\ntype AccessRequest struct {\n\tHeader `json:\"-\"`\n\tMask   uint32\n}\n\nvar _ = Request(&AccessRequest{})\n\nfunc (r *AccessRequest) String() string {\n\treturn fmt.Sprintf(\"Access [%s] mask=%#x\", &r.Header, r.Mask)\n}\n\n// Respond replies to the request indicating that access is allowed.\n// To deny access, use RespondError.\nfunc (r *AccessRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// An Attr is the metadata for a single file or directory.\ntype Attr struct {\n\tValid time.Duration // how long Attr can be cached\n\n\tInode     uint64      // inode number\n\tSize      uint64      // size in bytes\n\tBlocks    uint64      // size in 512-byte units\n\tAtime     time.Time   // time of last access\n\tMtime     time.Time   // time of last modification\n\tCtime     time.Time   // time of last inode change\n\tCrtime    time.Time   // time of creation (OS X only)\n\tMode      os.FileMode // file mode\n\tNlink     uint32      // number of links (usually 1)\n\tUid       uint32      // owner uid\n\tGid       uint32      // group gid\n\tRdev      uint32      // device numbers\n\tFlags     uint32      // chflags(2) flags (OS X only)\n\tBlockSize uint32      // preferred blocksize for filesystem I/O\n}\n\nfunc (a Attr) String() string {\n\treturn fmt.Sprintf(\"valid=%v ino=%v size=%d mode=%v\", a.Valid, a.Inode, a.Size, a.Mode)\n}\n\nfunc unix(t time.Time) (sec uint64, nsec uint32) {\n\tnano := t.UnixNano()\n\tsec = uint64(nano / 1e9)\n\tnsec = uint32(nano % 1e9)\n\treturn\n}\n\nfunc (a *Attr) attr(out *attr, proto Protocol) {\n\tout.Ino = a.Inode\n\tout.Size = a.Size\n\tout.Blocks = a.Blocks\n\tout.Atime, out.AtimeNsec = unix(a.Atime)\n\tout.Mtime, out.MtimeNsec = unix(a.Mtime)\n\tout.Ctime, out.CtimeNsec = unix(a.Ctime)\n\tout.SetCrtime(unix(a.Crtime))\n\tout.Mode = uint32(a.Mode) & 0777\n\tswitch {\n\tdefault:\n\t\tout.Mode |= syscall.S_IFREG\n\tcase a.Mode&os.ModeDir != 0:\n\t\tout.Mode |= syscall.S_IFDIR\n\tcase a.Mode&os.ModeDevice != 0:\n\t\tif a.Mode&os.ModeCharDevice != 0 {\n\t\t\tout.Mode |= syscall.S_IFCHR\n\t\t} else {\n\t\t\tout.Mode |= syscall.S_IFBLK\n\t\t}\n\tcase a.Mode&os.ModeNamedPipe != 0:\n\t\tout.Mode |= syscall.S_IFIFO\n\tcase a.Mode&os.ModeSymlink != 0:\n\t\tout.Mode |= syscall.S_IFLNK\n\tcase a.Mode&os.ModeSocket != 0:\n\t\tout.Mode |= syscall.S_IFSOCK\n\t}\n\tif a.Mode&os.ModeSetuid != 0 {\n\t\tout.Mode |= syscall.S_ISUID\n\t}\n\tif a.Mode&os.ModeSetgid != 0 {\n\t\tout.Mode |= syscall.S_ISGID\n\t}\n\tout.Nlink = a.Nlink\n\tout.Uid = a.Uid\n\tout.Gid = a.Gid\n\tout.Rdev = a.Rdev\n\tout.SetFlags(a.Flags)\n\tif proto.GE(Protocol{7, 9}) {\n\t\tout.Blksize = a.BlockSize\n\t}\n\n\treturn\n}\n\n// A GetattrRequest asks for the metadata for the file denoted by r.Node.\ntype GetattrRequest struct {\n\tHeader `json:\"-\"`\n\tFlags  GetattrFlags\n\tHandle HandleID\n}\n\nvar _ = Request(&GetattrRequest{})\n\nfunc (r *GetattrRequest) String() string {\n\treturn fmt.Sprintf(\"Getattr [%s] %v fl=%v\", &r.Header, r.Handle, r.Flags)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *GetattrRequest) Respond(resp *GetattrResponse) {\n\tsize := attrOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(size)\n\tout := (*attrOut)(buf.alloc(size))\n\tout.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\tout.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&out.Attr, r.Header.Conn.proto)\n\tr.respond(buf)\n}\n\n// A GetattrResponse is the response to a GetattrRequest.\ntype GetattrResponse struct {\n\tAttr Attr // file attributes\n}\n\nfunc (r *GetattrResponse) String() string {\n\treturn fmt.Sprintf(\"Getattr %v\", r.Attr)\n}\n\n// A GetxattrRequest asks for the extended attributes associated with r.Node.\ntype GetxattrRequest struct {\n\tHeader `json:\"-\"`\n\n\t// Maximum size to return.\n\tSize uint32\n\n\t// Name of the attribute requested.\n\tName string\n\n\t// Offset within extended attributes.\n\t//\n\t// Only valid for OS X, and then only with the resource fork\n\t// attribute.\n\tPosition uint32\n}\n\nvar _ = Request(&GetxattrRequest{})\n\nfunc (r *GetxattrRequest) String() string {\n\treturn fmt.Sprintf(\"Getxattr [%s] %q %d @%d\", &r.Header, r.Name, r.Size, r.Position)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *GetxattrRequest) Respond(resp *GetxattrResponse) {\n\tif r.Size == 0 {\n\t\tbuf := newBuffer(unsafe.Sizeof(getxattrOut{}))\n\t\tout := (*getxattrOut)(buf.alloc(unsafe.Sizeof(getxattrOut{})))\n\t\tout.Size = uint32(len(resp.Xattr))\n\t\tr.respond(buf)\n\t} else {\n\t\tbuf := newBuffer(uintptr(len(resp.Xattr)))\n\t\tbuf = append(buf, resp.Xattr...)\n\t\tr.respond(buf)\n\t}\n}\n\n// A GetxattrResponse is the response to a GetxattrRequest.\ntype GetxattrResponse struct {\n\tXattr []byte\n}\n\nfunc (r *GetxattrResponse) String() string {\n\treturn fmt.Sprintf(\"Getxattr %x\", r.Xattr)\n}\n\n// A ListxattrRequest asks to list the extended attributes associated with r.Node.\ntype ListxattrRequest struct {\n\tHeader   `json:\"-\"`\n\tSize     uint32 // maximum size to return\n\tPosition uint32 // offset within attribute list\n}\n\nvar _ = Request(&ListxattrRequest{})\n\nfunc (r *ListxattrRequest) String() string {\n\treturn fmt.Sprintf(\"Listxattr [%s] %d @%d\", &r.Header, r.Size, r.Position)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *ListxattrRequest) Respond(resp *ListxattrResponse) {\n\tif r.Size == 0 {\n\t\tbuf := newBuffer(unsafe.Sizeof(getxattrOut{}))\n\t\tout := (*getxattrOut)(buf.alloc(unsafe.Sizeof(getxattrOut{})))\n\t\tout.Size = uint32(len(resp.Xattr))\n\t\tr.respond(buf)\n\t} else {\n\t\tbuf := newBuffer(uintptr(len(resp.Xattr)))\n\t\tbuf = append(buf, resp.Xattr...)\n\t\tr.respond(buf)\n\t}\n}\n\n// A ListxattrResponse is the response to a ListxattrRequest.\ntype ListxattrResponse struct {\n\tXattr []byte\n}\n\nfunc (r *ListxattrResponse) String() string {\n\treturn fmt.Sprintf(\"Listxattr %x\", r.Xattr)\n}\n\n// Append adds an extended attribute name to the response.\nfunc (r *ListxattrResponse) Append(names ...string) {\n\tfor _, name := range names {\n\t\tr.Xattr = append(r.Xattr, name...)\n\t\tr.Xattr = append(r.Xattr, '\\x00')\n\t}\n}\n\n// A RemovexattrRequest asks to remove an extended attribute associated with r.Node.\ntype RemovexattrRequest struct {\n\tHeader `json:\"-\"`\n\tName   string // name of extended attribute\n}\n\nvar _ = Request(&RemovexattrRequest{})\n\nfunc (r *RemovexattrRequest) String() string {\n\treturn fmt.Sprintf(\"Removexattr [%s] %q\", &r.Header, r.Name)\n}\n\n// Respond replies to the request, indicating that the attribute was removed.\nfunc (r *RemovexattrRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// A SetxattrRequest asks to set an extended attribute associated with a file.\ntype SetxattrRequest struct {\n\tHeader `json:\"-\"`\n\n\t// Flags can make the request fail if attribute does/not already\n\t// exist. Unfortunately, the constants are platform-specific and\n\t// not exposed by Go1.2. Look for XATTR_CREATE, XATTR_REPLACE.\n\t//\n\t// TODO improve this later\n\t//\n\t// TODO XATTR_CREATE and exist -> EEXIST\n\t//\n\t// TODO XATTR_REPLACE and not exist -> ENODATA\n\tFlags uint32\n\n\t// Offset within extended attributes.\n\t//\n\t// Only valid for OS X, and then only with the resource fork\n\t// attribute.\n\tPosition uint32\n\n\tName  string\n\tXattr []byte\n}\n\nvar _ = Request(&SetxattrRequest{})\n\nfunc trunc(b []byte, max int) ([]byte, string) {\n\tif len(b) > max {\n\t\treturn b[:max], \"...\"\n\t}\n\treturn b, \"\"\n}\n\nfunc (r *SetxattrRequest) String() string {\n\txattr, tail := trunc(r.Xattr, 16)\n\treturn fmt.Sprintf(\"Setxattr [%s] %q %x%s fl=%v @%#x\", &r.Header, r.Name, xattr, tail, r.Flags, r.Position)\n}\n\n// Respond replies to the request, indicating that the extended attribute was set.\nfunc (r *SetxattrRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// A LookupRequest asks to look up the given name in the directory named by r.Node.\ntype LookupRequest struct {\n\tHeader `json:\"-\"`\n\tName   string\n}\n\nvar _ = Request(&LookupRequest{})\n\nfunc (r *LookupRequest) String() string {\n\treturn fmt.Sprintf(\"Lookup [%s] %q\", &r.Header, r.Name)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *LookupRequest) Respond(resp *LookupResponse) {\n\tsize := entryOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(size)\n\tout := (*entryOut)(buf.alloc(size))\n\tout.Nodeid = uint64(resp.Node)\n\tout.Generation = resp.Generation\n\tout.EntryValid = uint64(resp.EntryValid / time.Second)\n\tout.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond)\n\tout.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\tout.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&out.Attr, r.Header.Conn.proto)\n\tr.respond(buf)\n}\n\n// A LookupResponse is the response to a LookupRequest.\ntype LookupResponse struct {\n\tNode       NodeID\n\tGeneration uint64\n\tEntryValid time.Duration\n\tAttr       Attr\n}\n\nfunc (r *LookupResponse) string() string {\n\treturn fmt.Sprintf(\"%v gen=%d valid=%v attr={%v}\", r.Node, r.Generation, r.EntryValid, r.Attr)\n}\n\nfunc (r *LookupResponse) String() string {\n\treturn fmt.Sprintf(\"Lookup %s\", r.string())\n}\n\n// An OpenRequest asks to open a file or directory\ntype OpenRequest struct {\n\tHeader `json:\"-\"`\n\tDir    bool // is this Opendir?\n\tFlags  OpenFlags\n}\n\nvar _ = Request(&OpenRequest{})\n\nfunc (r *OpenRequest) String() string {\n\treturn fmt.Sprintf(\"Open [%s] dir=%v fl=%v\", &r.Header, r.Dir, r.Flags)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *OpenRequest) Respond(resp *OpenResponse) {\n\tbuf := newBuffer(unsafe.Sizeof(openOut{}))\n\tout := (*openOut)(buf.alloc(unsafe.Sizeof(openOut{})))\n\tout.Fh = uint64(resp.Handle)\n\tout.OpenFlags = uint32(resp.Flags)\n\tr.respond(buf)\n}\n\n// A OpenResponse is the response to a OpenRequest.\ntype OpenResponse struct {\n\tHandle HandleID\n\tFlags  OpenResponseFlags\n}\n\nfunc (r *OpenResponse) string() string {\n\treturn fmt.Sprintf(\"%v fl=%v\", r.Handle, r.Flags)\n}\n\nfunc (r *OpenResponse) String() string {\n\treturn fmt.Sprintf(\"Open %s\", r.string())\n}\n\n// A CreateRequest asks to create and open a file (not a directory).\ntype CreateRequest struct {\n\tHeader `json:\"-\"`\n\tName   string\n\tFlags  OpenFlags\n\tMode   os.FileMode\n\t// Umask of the request. Not supported on OS X.\n\tUmask os.FileMode\n}\n\nvar _ = Request(&CreateRequest{})\n\nfunc (r *CreateRequest) String() string {\n\treturn fmt.Sprintf(\"Create [%s] %q fl=%v mode=%v umask=%v\", &r.Header, r.Name, r.Flags, r.Mode, r.Umask)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *CreateRequest) Respond(resp *CreateResponse) {\n\teSize := entryOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(eSize + unsafe.Sizeof(openOut{}))\n\n\te := (*entryOut)(buf.alloc(eSize))\n\te.Nodeid = uint64(resp.Node)\n\te.Generation = resp.Generation\n\te.EntryValid = uint64(resp.EntryValid / time.Second)\n\te.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond)\n\te.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\te.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&e.Attr, r.Header.Conn.proto)\n\n\to := (*openOut)(buf.alloc(unsafe.Sizeof(openOut{})))\n\to.Fh = uint64(resp.Handle)\n\to.OpenFlags = uint32(resp.Flags)\n\n\tr.respond(buf)\n}\n\n// A CreateResponse is the response to a CreateRequest.\n// It describes the created node and opened handle.\ntype CreateResponse struct {\n\tLookupResponse\n\tOpenResponse\n}\n\nfunc (r *CreateResponse) String() string {\n\treturn fmt.Sprintf(\"Create {%s} {%s}\", r.LookupResponse.string(), r.OpenResponse.string())\n}\n\n// A MkdirRequest asks to create (but not open) a directory.\ntype MkdirRequest struct {\n\tHeader `json:\"-\"`\n\tName   string\n\tMode   os.FileMode\n\t// Umask of the request. Not supported on OS X.\n\tUmask os.FileMode\n}\n\nvar _ = Request(&MkdirRequest{})\n\nfunc (r *MkdirRequest) String() string {\n\treturn fmt.Sprintf(\"Mkdir [%s] %q mode=%v umask=%v\", &r.Header, r.Name, r.Mode, r.Umask)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *MkdirRequest) Respond(resp *MkdirResponse) {\n\tsize := entryOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(size)\n\tout := (*entryOut)(buf.alloc(size))\n\tout.Nodeid = uint64(resp.Node)\n\tout.Generation = resp.Generation\n\tout.EntryValid = uint64(resp.EntryValid / time.Second)\n\tout.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond)\n\tout.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\tout.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&out.Attr, r.Header.Conn.proto)\n\tr.respond(buf)\n}\n\n// A MkdirResponse is the response to a MkdirRequest.\ntype MkdirResponse struct {\n\tLookupResponse\n}\n\nfunc (r *MkdirResponse) String() string {\n\treturn fmt.Sprintf(\"Mkdir %v\", r.LookupResponse.string())\n}\n\n// A ReadRequest asks to read from an open file.\ntype ReadRequest struct {\n\tHeader    `json:\"-\"`\n\tDir       bool // is this Readdir?\n\tHandle    HandleID\n\tOffset    int64\n\tSize      int\n\tFlags     ReadFlags\n\tLockOwner uint64\n\tFileFlags OpenFlags\n}\n\nvar _ = Request(&ReadRequest{})\n\nfunc (r *ReadRequest) String() string {\n\treturn fmt.Sprintf(\"Read [%s] %v %d @%#x dir=%v fl=%v lock=%d ffl=%v\", &r.Header, r.Handle, r.Size, r.Offset, r.Dir, r.Flags, r.LockOwner, r.FileFlags)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *ReadRequest) Respond(resp *ReadResponse) {\n\tbuf := newBuffer(uintptr(len(resp.Data)))\n\tbuf = append(buf, resp.Data...)\n\tr.respond(buf)\n}\n\n// A ReadResponse is the response to a ReadRequest.\ntype ReadResponse struct {\n\tData []byte\n}\n\nfunc (r *ReadResponse) String() string {\n\treturn fmt.Sprintf(\"Read %d\", len(r.Data))\n}\n\ntype jsonReadResponse struct {\n\tLen uint64\n}\n\nfunc (r *ReadResponse) MarshalJSON() ([]byte, error) {\n\tj := jsonReadResponse{\n\t\tLen: uint64(len(r.Data)),\n\t}\n\treturn json.Marshal(j)\n}\n\n// A ReleaseRequest asks to release (close) an open file handle.\ntype ReleaseRequest struct {\n\tHeader       `json:\"-\"`\n\tDir          bool // is this Releasedir?\n\tHandle       HandleID\n\tFlags        OpenFlags // flags from OpenRequest\n\tReleaseFlags ReleaseFlags\n\tLockOwner    uint32\n}\n\nvar _ = Request(&ReleaseRequest{})\n\nfunc (r *ReleaseRequest) String() string {\n\treturn fmt.Sprintf(\"Release [%s] %v fl=%v rfl=%v owner=%#x\", &r.Header, r.Handle, r.Flags, r.ReleaseFlags, r.LockOwner)\n}\n\n// Respond replies to the request, indicating that the handle has been released.\nfunc (r *ReleaseRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// A DestroyRequest is sent by the kernel when unmounting the file system.\n// No more requests will be received after this one, but it should still be\n// responded to.\ntype DestroyRequest struct {\n\tHeader `json:\"-\"`\n}\n\nvar _ = Request(&DestroyRequest{})\n\nfunc (r *DestroyRequest) String() string {\n\treturn fmt.Sprintf(\"Destroy [%s]\", &r.Header)\n}\n\n// Respond replies to the request.\nfunc (r *DestroyRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// A ForgetRequest is sent by the kernel when forgetting about r.Node\n// as returned by r.N lookup requests.\ntype ForgetRequest struct {\n\tHeader `json:\"-\"`\n\tN      uint64\n}\n\nvar _ = Request(&ForgetRequest{})\n\nfunc (r *ForgetRequest) String() string {\n\treturn fmt.Sprintf(\"Forget [%s] %d\", &r.Header, r.N)\n}\n\n// Respond replies to the request, indicating that the forgetfulness has been recorded.\nfunc (r *ForgetRequest) Respond() {\n\t// Don't reply to forget messages.\n\tr.noResponse()\n}\n\n// A Dirent represents a single directory entry.\ntype Dirent struct {\n\t// Inode this entry names.\n\tInode uint64\n\n\t// Type of the entry, for example DT_File.\n\t//\n\t// Setting this is optional. The zero value (DT_Unknown) means\n\t// callers will just need to do a Getattr when the type is\n\t// needed. Providing a type can speed up operations\n\t// significantly.\n\tType DirentType\n\n\t// Name of the entry\n\tName string\n}\n\n// Type of an entry in a directory listing.\ntype DirentType uint32\n\nconst (\n\t// These don't quite match os.FileMode; especially there's an\n\t// explicit unknown, instead of zero value meaning file. They\n\t// are also not quite syscall.DT_*; nothing says the FUSE\n\t// protocol follows those, and even if they were, we don't\n\t// want each fs to fiddle with syscall.\n\n\t// The shift by 12 is hardcoded in the FUSE userspace\n\t// low-level C library, so it's safe here.\n\n\tDT_Unknown DirentType = 0\n\tDT_Socket  DirentType = syscall.S_IFSOCK >> 12\n\tDT_Link    DirentType = syscall.S_IFLNK >> 12\n\tDT_File    DirentType = syscall.S_IFREG >> 12\n\tDT_Block   DirentType = syscall.S_IFBLK >> 12\n\tDT_Dir     DirentType = syscall.S_IFDIR >> 12\n\tDT_Char    DirentType = syscall.S_IFCHR >> 12\n\tDT_FIFO    DirentType = syscall.S_IFIFO >> 12\n)\n\nfunc (t DirentType) String() string {\n\tswitch t {\n\tcase DT_Unknown:\n\t\treturn \"unknown\"\n\tcase DT_Socket:\n\t\treturn \"socket\"\n\tcase DT_Link:\n\t\treturn \"link\"\n\tcase DT_File:\n\t\treturn \"file\"\n\tcase DT_Block:\n\t\treturn \"block\"\n\tcase DT_Dir:\n\t\treturn \"dir\"\n\tcase DT_Char:\n\t\treturn \"char\"\n\tcase DT_FIFO:\n\t\treturn \"fifo\"\n\t}\n\treturn \"invalid\"\n}\n\n// AppendDirent appends the encoded form of a directory entry to data\n// and returns the resulting slice.\nfunc AppendDirent(data []byte, dir Dirent) []byte {\n\tde := dirent{\n\t\tIno:     dir.Inode,\n\t\tNamelen: uint32(len(dir.Name)),\n\t\tType:    uint32(dir.Type),\n\t}\n\tde.Off = uint64(len(data) + direntSize + (len(dir.Name)+7)&^7)\n\tdata = append(data, (*[direntSize]byte)(unsafe.Pointer(&de))[:]...)\n\tdata = append(data, dir.Name...)\n\tn := direntSize + uintptr(len(dir.Name))\n\tif n%8 != 0 {\n\t\tvar pad [8]byte\n\t\tdata = append(data, pad[:8-n%8]...)\n\t}\n\treturn data\n}\n\n// A WriteRequest asks to write to an open file.\ntype WriteRequest struct {\n\tHeader\n\tHandle    HandleID\n\tOffset    int64\n\tData      []byte\n\tFlags     WriteFlags\n\tLockOwner uint64\n\tFileFlags OpenFlags\n}\n\nvar _ = Request(&WriteRequest{})\n\nfunc (r *WriteRequest) String() string {\n\treturn fmt.Sprintf(\"Write [%s] %v %d @%d fl=%v lock=%d ffl=%v\", &r.Header, r.Handle, len(r.Data), r.Offset, r.Flags, r.LockOwner, r.FileFlags)\n}\n\ntype jsonWriteRequest struct {\n\tHandle HandleID\n\tOffset int64\n\tLen    uint64\n\tFlags  WriteFlags\n}\n\nfunc (r *WriteRequest) MarshalJSON() ([]byte, error) {\n\tj := jsonWriteRequest{\n\t\tHandle: r.Handle,\n\t\tOffset: r.Offset,\n\t\tLen:    uint64(len(r.Data)),\n\t\tFlags:  r.Flags,\n\t}\n\treturn json.Marshal(j)\n}\n\n// Respond replies to the request with the given response.\nfunc (r *WriteRequest) Respond(resp *WriteResponse) {\n\tbuf := newBuffer(unsafe.Sizeof(writeOut{}))\n\tout := (*writeOut)(buf.alloc(unsafe.Sizeof(writeOut{})))\n\tout.Size = uint32(resp.Size)\n\tr.respond(buf)\n}\n\n// A WriteResponse replies to a write indicating how many bytes were written.\ntype WriteResponse struct {\n\tSize int\n}\n\nfunc (r *WriteResponse) String() string {\n\treturn fmt.Sprintf(\"Write %d\", r.Size)\n}\n\n// A SetattrRequest asks to change one or more attributes associated with a file,\n// as indicated by Valid.\ntype SetattrRequest struct {\n\tHeader `json:\"-\"`\n\tValid  SetattrValid\n\tHandle HandleID\n\tSize   uint64\n\tAtime  time.Time\n\tMtime  time.Time\n\tMode   os.FileMode\n\tUid    uint32\n\tGid    uint32\n\n\t// OS X only\n\tBkuptime time.Time\n\tChgtime  time.Time\n\tCrtime   time.Time\n\tFlags    uint32 // see chflags(2)\n}\n\nvar _ = Request(&SetattrRequest{})\n\nfunc (r *SetattrRequest) String() string {\n\tvar buf bytes.Buffer\n\tfmt.Fprintf(&buf, \"Setattr [%s]\", &r.Header)\n\tif r.Valid.Mode() {\n\t\tfmt.Fprintf(&buf, \" mode=%v\", r.Mode)\n\t}\n\tif r.Valid.Uid() {\n\t\tfmt.Fprintf(&buf, \" uid=%d\", r.Uid)\n\t}\n\tif r.Valid.Gid() {\n\t\tfmt.Fprintf(&buf, \" gid=%d\", r.Gid)\n\t}\n\tif r.Valid.Size() {\n\t\tfmt.Fprintf(&buf, \" size=%d\", r.Size)\n\t}\n\tif r.Valid.Atime() {\n\t\tfmt.Fprintf(&buf, \" atime=%v\", r.Atime)\n\t}\n\tif r.Valid.AtimeNow() {\n\t\tfmt.Fprintf(&buf, \" atime=now\")\n\t}\n\tif r.Valid.Mtime() {\n\t\tfmt.Fprintf(&buf, \" mtime=%v\", r.Mtime)\n\t}\n\tif r.Valid.MtimeNow() {\n\t\tfmt.Fprintf(&buf, \" mtime=now\")\n\t}\n\tif r.Valid.Handle() {\n\t\tfmt.Fprintf(&buf, \" handle=%v\", r.Handle)\n\t} else {\n\t\tfmt.Fprintf(&buf, \" handle=INVALID-%v\", r.Handle)\n\t}\n\tif r.Valid.LockOwner() {\n\t\tfmt.Fprintf(&buf, \" lockowner\")\n\t}\n\tif r.Valid.Crtime() {\n\t\tfmt.Fprintf(&buf, \" crtime=%v\", r.Crtime)\n\t}\n\tif r.Valid.Chgtime() {\n\t\tfmt.Fprintf(&buf, \" chgtime=%v\", r.Chgtime)\n\t}\n\tif r.Valid.Bkuptime() {\n\t\tfmt.Fprintf(&buf, \" bkuptime=%v\", r.Bkuptime)\n\t}\n\tif r.Valid.Flags() {\n\t\tfmt.Fprintf(&buf, \" flags=%v\", r.Flags)\n\t}\n\treturn buf.String()\n}\n\n// Respond replies to the request with the given response,\n// giving the updated attributes.\nfunc (r *SetattrRequest) Respond(resp *SetattrResponse) {\n\tsize := attrOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(size)\n\tout := (*attrOut)(buf.alloc(size))\n\tout.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\tout.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&out.Attr, r.Header.Conn.proto)\n\tr.respond(buf)\n}\n\n// A SetattrResponse is the response to a SetattrRequest.\ntype SetattrResponse struct {\n\tAttr Attr // file attributes\n}\n\nfunc (r *SetattrResponse) String() string {\n\treturn fmt.Sprintf(\"Setattr %v\", r.Attr)\n}\n\n// A FlushRequest asks for the current state of an open file to be flushed\n// to storage, as when a file descriptor is being closed.  A single opened Handle\n// may receive multiple FlushRequests over its lifetime.\ntype FlushRequest struct {\n\tHeader    `json:\"-\"`\n\tHandle    HandleID\n\tFlags     uint32\n\tLockOwner uint64\n}\n\nvar _ = Request(&FlushRequest{})\n\nfunc (r *FlushRequest) String() string {\n\treturn fmt.Sprintf(\"Flush [%s] %v fl=%#x lk=%#x\", &r.Header, r.Handle, r.Flags, r.LockOwner)\n}\n\n// Respond replies to the request, indicating that the flush succeeded.\nfunc (r *FlushRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// A RemoveRequest asks to remove a file or directory from the\n// directory r.Node.\ntype RemoveRequest struct {\n\tHeader `json:\"-\"`\n\tName   string // name of the entry to remove\n\tDir    bool   // is this rmdir?\n}\n\nvar _ = Request(&RemoveRequest{})\n\nfunc (r *RemoveRequest) String() string {\n\treturn fmt.Sprintf(\"Remove [%s] %q dir=%v\", &r.Header, r.Name, r.Dir)\n}\n\n// Respond replies to the request, indicating that the file was removed.\nfunc (r *RemoveRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// A SymlinkRequest is a request to create a symlink making NewName point to Target.\ntype SymlinkRequest struct {\n\tHeader          `json:\"-\"`\n\tNewName, Target string\n}\n\nvar _ = Request(&SymlinkRequest{})\n\nfunc (r *SymlinkRequest) String() string {\n\treturn fmt.Sprintf(\"Symlink [%s] from %q to target %q\", &r.Header, r.NewName, r.Target)\n}\n\n// Respond replies to the request, indicating that the symlink was created.\nfunc (r *SymlinkRequest) Respond(resp *SymlinkResponse) {\n\tsize := entryOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(size)\n\tout := (*entryOut)(buf.alloc(size))\n\tout.Nodeid = uint64(resp.Node)\n\tout.Generation = resp.Generation\n\tout.EntryValid = uint64(resp.EntryValid / time.Second)\n\tout.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond)\n\tout.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\tout.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&out.Attr, r.Header.Conn.proto)\n\tr.respond(buf)\n}\n\n// A SymlinkResponse is the response to a SymlinkRequest.\ntype SymlinkResponse struct {\n\tLookupResponse\n}\n\nfunc (r *SymlinkResponse) String() string {\n\treturn fmt.Sprintf(\"Symlink %v\", r.LookupResponse.string())\n}\n\n// A ReadlinkRequest is a request to read a symlink's target.\ntype ReadlinkRequest struct {\n\tHeader `json:\"-\"`\n}\n\nvar _ = Request(&ReadlinkRequest{})\n\nfunc (r *ReadlinkRequest) String() string {\n\treturn fmt.Sprintf(\"Readlink [%s]\", &r.Header)\n}\n\nfunc (r *ReadlinkRequest) Respond(target string) {\n\tbuf := newBuffer(uintptr(len(target)))\n\tbuf = append(buf, target...)\n\tr.respond(buf)\n}\n\n// A LinkRequest is a request to create a hard link.\ntype LinkRequest struct {\n\tHeader  `json:\"-\"`\n\tOldNode NodeID\n\tNewName string\n}\n\nvar _ = Request(&LinkRequest{})\n\nfunc (r *LinkRequest) String() string {\n\treturn fmt.Sprintf(\"Link [%s] node %d to %q\", &r.Header, r.OldNode, r.NewName)\n}\n\nfunc (r *LinkRequest) Respond(resp *LookupResponse) {\n\tsize := entryOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(size)\n\tout := (*entryOut)(buf.alloc(size))\n\tout.Nodeid = uint64(resp.Node)\n\tout.Generation = resp.Generation\n\tout.EntryValid = uint64(resp.EntryValid / time.Second)\n\tout.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond)\n\tout.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\tout.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&out.Attr, r.Header.Conn.proto)\n\tr.respond(buf)\n}\n\n// A RenameRequest is a request to rename a file.\ntype RenameRequest struct {\n\tHeader           `json:\"-\"`\n\tNewDir           NodeID\n\tOldName, NewName string\n}\n\nvar _ = Request(&RenameRequest{})\n\nfunc (r *RenameRequest) String() string {\n\treturn fmt.Sprintf(\"Rename [%s] from %q to dirnode %v %q\", &r.Header, r.OldName, r.NewDir, r.NewName)\n}\n\nfunc (r *RenameRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\ntype MknodRequest struct {\n\tHeader `json:\"-\"`\n\tName   string\n\tMode   os.FileMode\n\tRdev   uint32\n\t// Umask of the request. Not supported on OS X.\n\tUmask os.FileMode\n}\n\nvar _ = Request(&MknodRequest{})\n\nfunc (r *MknodRequest) String() string {\n\treturn fmt.Sprintf(\"Mknod [%s] Name %q mode=%v umask=%v rdev=%d\", &r.Header, r.Name, r.Mode, r.Umask, r.Rdev)\n}\n\nfunc (r *MknodRequest) Respond(resp *LookupResponse) {\n\tsize := entryOutSize(r.Header.Conn.proto)\n\tbuf := newBuffer(size)\n\tout := (*entryOut)(buf.alloc(size))\n\tout.Nodeid = uint64(resp.Node)\n\tout.Generation = resp.Generation\n\tout.EntryValid = uint64(resp.EntryValid / time.Second)\n\tout.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond)\n\tout.AttrValid = uint64(resp.Attr.Valid / time.Second)\n\tout.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond)\n\tresp.Attr.attr(&out.Attr, r.Header.Conn.proto)\n\tr.respond(buf)\n}\n\ntype FsyncRequest struct {\n\tHeader `json:\"-\"`\n\tHandle HandleID\n\t// TODO bit 1 is datasync, not well documented upstream\n\tFlags uint32\n\tDir   bool\n}\n\nvar _ = Request(&FsyncRequest{})\n\nfunc (r *FsyncRequest) String() string {\n\treturn fmt.Sprintf(\"Fsync [%s] Handle %v Flags %v\", &r.Header, r.Handle, r.Flags)\n}\n\nfunc (r *FsyncRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n\n// An InterruptRequest is a request to interrupt another pending request. The\n// response to that request should return an error status of EINTR.\ntype InterruptRequest struct {\n\tHeader `json:\"-\"`\n\tIntrID RequestID // ID of the request to be interrupt.\n}\n\nvar _ = Request(&InterruptRequest{})\n\nfunc (r *InterruptRequest) Respond() {\n\t// nothing to do here\n\tr.noResponse()\n}\n\nfunc (r *InterruptRequest) String() string {\n\treturn fmt.Sprintf(\"Interrupt [%s] ID %v\", &r.Header, r.IntrID)\n}\n\n// An ExchangeDataRequest is a request to exchange the contents of two\n// files, while leaving most metadata untouched.\n//\n// This request comes from OS X exchangedata(2) and represents its\n// specific semantics. Crucially, it is very different from Linux\n// renameat(2) RENAME_EXCHANGE.\n//\n// https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/exchangedata.2.html\ntype ExchangeDataRequest struct {\n\tHeader           `json:\"-\"`\n\tOldDir, NewDir   NodeID\n\tOldName, NewName string\n\t// TODO options\n}\n\nvar _ = Request(&ExchangeDataRequest{})\n\nfunc (r *ExchangeDataRequest) String() string {\n\t// TODO options\n\treturn fmt.Sprintf(\"ExchangeData [%s] %v %q and %v %q\", &r.Header, r.OldDir, r.OldName, r.NewDir, r.NewName)\n}\n\nfunc (r *ExchangeDataRequest) Respond() {\n\tbuf := newBuffer(0)\n\tr.respond(buf)\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"GO_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\" />\n    <orderEntry type=\"inheritedJdk\" />\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n  </component>\n</module>"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_darwin.go",
    "content": "package fuse\n\n// Maximum file write size we are prepared to receive from the kernel.\n//\n// This value has to be >=16MB or OSXFUSE (3.4.0 observed) will\n// forcibly close the /dev/fuse file descriptor on a Setxattr with a\n// 16MB value. See TestSetxattr16MB and\n// https://github.com/bazil/fuse/issues/42\nconst maxWrite = 16 * 1024 * 1024\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_freebsd.go",
    "content": "package fuse\n\n// Maximum file write size we are prepared to receive from the kernel.\n//\n// This number is just a guess.\nconst maxWrite = 128 * 1024\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_kernel.go",
    "content": "// See the file LICENSE for copyright and licensing information.\n\n// Derived from FUSE's fuse_kernel.h, which carries this notice:\n/*\n   This file defines the kernel interface of FUSE\n   Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>\n\n\n   This -- and only this -- header file may also be distributed under\n   the terms of the BSD Licence as follows:\n\n   Copyright (C) 2001-2007 Miklos Szeredi. 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   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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n   ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE\n   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n   SUCH DAMAGE.\n*/\n\npackage fuse\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n// The FUSE version implemented by the package.\nconst (\n\tprotoVersionMinMajor = 7\n\tprotoVersionMinMinor = 8\n\tprotoVersionMaxMajor = 7\n\tprotoVersionMaxMinor = 12\n)\n\nconst (\n\trootID = 1\n)\n\ntype kstatfs struct {\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tBsize   uint32\n\tNamelen uint32\n\tFrsize  uint32\n\t_       uint32\n\tSpare   [6]uint32\n}\n\ntype fileLock struct {\n\tStart uint64\n\tEnd   uint64\n\tType  uint32\n\tPid   uint32\n}\n\n// GetattrFlags are bit flags that can be seen in GetattrRequest.\ntype GetattrFlags uint32\n\nconst (\n\t// Indicates the handle is valid.\n\tGetattrFh GetattrFlags = 1 << 0\n)\n\nvar getattrFlagsNames = []flagName{\n\t{uint32(GetattrFh), \"GetattrFh\"},\n}\n\nfunc (fl GetattrFlags) String() string {\n\treturn flagString(uint32(fl), getattrFlagsNames)\n}\n\n// The SetattrValid are bit flags describing which fields in the SetattrRequest\n// are included in the change.\ntype SetattrValid uint32\n\nconst (\n\tSetattrMode   SetattrValid = 1 << 0\n\tSetattrUid    SetattrValid = 1 << 1\n\tSetattrGid    SetattrValid = 1 << 2\n\tSetattrSize   SetattrValid = 1 << 3\n\tSetattrAtime  SetattrValid = 1 << 4\n\tSetattrMtime  SetattrValid = 1 << 5\n\tSetattrHandle SetattrValid = 1 << 6\n\n\t// Linux only(?)\n\tSetattrAtimeNow  SetattrValid = 1 << 7\n\tSetattrMtimeNow  SetattrValid = 1 << 8\n\tSetattrLockOwner SetattrValid = 1 << 9 // http://www.mail-archive.com/git-commits-head@vger.kernel.org/msg27852.html\n\n\t// OS X only\n\tSetattrCrtime   SetattrValid = 1 << 28\n\tSetattrChgtime  SetattrValid = 1 << 29\n\tSetattrBkuptime SetattrValid = 1 << 30\n\tSetattrFlags    SetattrValid = 1 << 31\n)\n\nfunc (fl SetattrValid) Mode() bool      { return fl&SetattrMode != 0 }\nfunc (fl SetattrValid) Uid() bool       { return fl&SetattrUid != 0 }\nfunc (fl SetattrValid) Gid() bool       { return fl&SetattrGid != 0 }\nfunc (fl SetattrValid) Size() bool      { return fl&SetattrSize != 0 }\nfunc (fl SetattrValid) Atime() bool     { return fl&SetattrAtime != 0 }\nfunc (fl SetattrValid) Mtime() bool     { return fl&SetattrMtime != 0 }\nfunc (fl SetattrValid) Handle() bool    { return fl&SetattrHandle != 0 }\nfunc (fl SetattrValid) AtimeNow() bool  { return fl&SetattrAtimeNow != 0 }\nfunc (fl SetattrValid) MtimeNow() bool  { return fl&SetattrMtimeNow != 0 }\nfunc (fl SetattrValid) LockOwner() bool { return fl&SetattrLockOwner != 0 }\nfunc (fl SetattrValid) Crtime() bool    { return fl&SetattrCrtime != 0 }\nfunc (fl SetattrValid) Chgtime() bool   { return fl&SetattrChgtime != 0 }\nfunc (fl SetattrValid) Bkuptime() bool  { return fl&SetattrBkuptime != 0 }\nfunc (fl SetattrValid) Flags() bool     { return fl&SetattrFlags != 0 }\n\nfunc (fl SetattrValid) String() string {\n\treturn flagString(uint32(fl), setattrValidNames)\n}\n\nvar setattrValidNames = []flagName{\n\t{uint32(SetattrMode), \"SetattrMode\"},\n\t{uint32(SetattrUid), \"SetattrUid\"},\n\t{uint32(SetattrGid), \"SetattrGid\"},\n\t{uint32(SetattrSize), \"SetattrSize\"},\n\t{uint32(SetattrAtime), \"SetattrAtime\"},\n\t{uint32(SetattrMtime), \"SetattrMtime\"},\n\t{uint32(SetattrHandle), \"SetattrHandle\"},\n\t{uint32(SetattrAtimeNow), \"SetattrAtimeNow\"},\n\t{uint32(SetattrMtimeNow), \"SetattrMtimeNow\"},\n\t{uint32(SetattrLockOwner), \"SetattrLockOwner\"},\n\t{uint32(SetattrCrtime), \"SetattrCrtime\"},\n\t{uint32(SetattrChgtime), \"SetattrChgtime\"},\n\t{uint32(SetattrBkuptime), \"SetattrBkuptime\"},\n\t{uint32(SetattrFlags), \"SetattrFlags\"},\n}\n\n// Flags that can be seen in OpenRequest.Flags.\nconst (\n\t// Access modes. These are not 1-bit flags, but alternatives where\n\t// only one can be chosen. See the IsReadOnly etc convenience\n\t// methods.\n\tOpenReadOnly  OpenFlags = syscall.O_RDONLY\n\tOpenWriteOnly OpenFlags = syscall.O_WRONLY\n\tOpenReadWrite OpenFlags = syscall.O_RDWR\n\n\t// File was opened in append-only mode, all writes will go to end\n\t// of file. OS X does not provide this information.\n\tOpenAppend    OpenFlags = syscall.O_APPEND\n\tOpenCreate    OpenFlags = syscall.O_CREAT\n\tOpenDirectory OpenFlags = syscall.O_DIRECTORY\n\tOpenExclusive OpenFlags = syscall.O_EXCL\n\tOpenNonblock  OpenFlags = syscall.O_NONBLOCK\n\tOpenSync      OpenFlags = syscall.O_SYNC\n\tOpenTruncate  OpenFlags = syscall.O_TRUNC\n)\n\n// OpenAccessModeMask is a bitmask that separates the access mode\n// from the other flags in OpenFlags.\nconst OpenAccessModeMask OpenFlags = syscall.O_ACCMODE\n\n// OpenFlags are the O_FOO flags passed to open/create/etc calls. For\n// example, os.O_WRONLY | os.O_APPEND.\ntype OpenFlags uint32\n\nfunc (fl OpenFlags) String() string {\n\t// O_RDONLY, O_RWONLY, O_RDWR are not flags\n\ts := accModeName(fl & OpenAccessModeMask)\n\tflags := uint32(fl &^ OpenAccessModeMask)\n\tif flags != 0 {\n\t\ts = s + \"+\" + flagString(flags, openFlagNames)\n\t}\n\treturn s\n}\n\n// Return true if OpenReadOnly is set.\nfunc (fl OpenFlags) IsReadOnly() bool {\n\treturn fl&OpenAccessModeMask == OpenReadOnly\n}\n\n// Return true if OpenWriteOnly is set.\nfunc (fl OpenFlags) IsWriteOnly() bool {\n\treturn fl&OpenAccessModeMask == OpenWriteOnly\n}\n\n// Return true if OpenReadWrite is set.\nfunc (fl OpenFlags) IsReadWrite() bool {\n\treturn fl&OpenAccessModeMask == OpenReadWrite\n}\n\nfunc accModeName(flags OpenFlags) string {\n\tswitch flags {\n\tcase OpenReadOnly:\n\t\treturn \"OpenReadOnly\"\n\tcase OpenWriteOnly:\n\t\treturn \"OpenWriteOnly\"\n\tcase OpenReadWrite:\n\t\treturn \"OpenReadWrite\"\n\tdefault:\n\t\treturn \"\"\n\t}\n}\n\nvar openFlagNames = []flagName{\n\t{uint32(OpenAppend), \"OpenAppend\"},\n\t{uint32(OpenCreate), \"OpenCreate\"},\n\t{uint32(OpenDirectory), \"OpenDirectory\"},\n\t{uint32(OpenExclusive), \"OpenExclusive\"},\n\t{uint32(OpenNonblock), \"OpenNonblock\"},\n\t{uint32(OpenSync), \"OpenSync\"},\n\t{uint32(OpenTruncate), \"OpenTruncate\"},\n}\n\n// The OpenResponseFlags are returned in the OpenResponse.\ntype OpenResponseFlags uint32\n\nconst (\n\tOpenDirectIO    OpenResponseFlags = 1 << 0 // bypass page cache for this open file\n\tOpenKeepCache   OpenResponseFlags = 1 << 1 // don't invalidate the data cache on open\n\tOpenNonSeekable OpenResponseFlags = 1 << 2 // mark the file as non-seekable (not supported on OS X)\n\n\tOpenPurgeAttr OpenResponseFlags = 1 << 30 // OS X\n\tOpenPurgeUBC  OpenResponseFlags = 1 << 31 // OS X\n)\n\nfunc (fl OpenResponseFlags) String() string {\n\treturn flagString(uint32(fl), openResponseFlagNames)\n}\n\nvar openResponseFlagNames = []flagName{\n\t{uint32(OpenDirectIO), \"OpenDirectIO\"},\n\t{uint32(OpenKeepCache), \"OpenKeepCache\"},\n\t{uint32(OpenNonSeekable), \"OpenNonSeekable\"},\n\t{uint32(OpenPurgeAttr), \"OpenPurgeAttr\"},\n\t{uint32(OpenPurgeUBC), \"OpenPurgeUBC\"},\n}\n\n// The InitFlags are used in the Init exchange.\ntype InitFlags uint32\n\nconst (\n\tInitAsyncRead     InitFlags = 1 << 0\n\tInitPosixLocks    InitFlags = 1 << 1\n\tInitFileOps       InitFlags = 1 << 2\n\tInitAtomicTrunc   InitFlags = 1 << 3\n\tInitExportSupport InitFlags = 1 << 4\n\tInitBigWrites     InitFlags = 1 << 5\n\t// Do not mask file access modes with umask. Not supported on OS X.\n\tInitDontMask        InitFlags = 1 << 6\n\tInitSpliceWrite     InitFlags = 1 << 7\n\tInitSpliceMove      InitFlags = 1 << 8\n\tInitSpliceRead      InitFlags = 1 << 9\n\tInitFlockLocks      InitFlags = 1 << 10\n\tInitHasIoctlDir     InitFlags = 1 << 11\n\tInitAutoInvalData   InitFlags = 1 << 12\n\tInitDoReaddirplus   InitFlags = 1 << 13\n\tInitReaddirplusAuto InitFlags = 1 << 14\n\tInitAsyncDIO        InitFlags = 1 << 15\n\tInitWritebackCache  InitFlags = 1 << 16\n\tInitNoOpenSupport   InitFlags = 1 << 17\n\n\tInitCaseSensitive InitFlags = 1 << 29 // OS X only\n\tInitVolRename     InitFlags = 1 << 30 // OS X only\n\tInitXtimes        InitFlags = 1 << 31 // OS X only\n)\n\ntype flagName struct {\n\tbit  uint32\n\tname string\n}\n\nvar initFlagNames = []flagName{\n\t{uint32(InitAsyncRead), \"InitAsyncRead\"},\n\t{uint32(InitPosixLocks), \"InitPosixLocks\"},\n\t{uint32(InitFileOps), \"InitFileOps\"},\n\t{uint32(InitAtomicTrunc), \"InitAtomicTrunc\"},\n\t{uint32(InitExportSupport), \"InitExportSupport\"},\n\t{uint32(InitBigWrites), \"InitBigWrites\"},\n\t{uint32(InitDontMask), \"InitDontMask\"},\n\t{uint32(InitSpliceWrite), \"InitSpliceWrite\"},\n\t{uint32(InitSpliceMove), \"InitSpliceMove\"},\n\t{uint32(InitSpliceRead), \"InitSpliceRead\"},\n\t{uint32(InitFlockLocks), \"InitFlockLocks\"},\n\t{uint32(InitHasIoctlDir), \"InitHasIoctlDir\"},\n\t{uint32(InitAutoInvalData), \"InitAutoInvalData\"},\n\t{uint32(InitDoReaddirplus), \"InitDoReaddirplus\"},\n\t{uint32(InitReaddirplusAuto), \"InitReaddirplusAuto\"},\n\t{uint32(InitAsyncDIO), \"InitAsyncDIO\"},\n\t{uint32(InitWritebackCache), \"InitWritebackCache\"},\n\t{uint32(InitNoOpenSupport), \"InitNoOpenSupport\"},\n\n\t{uint32(InitCaseSensitive), \"InitCaseSensitive\"},\n\t{uint32(InitVolRename), \"InitVolRename\"},\n\t{uint32(InitXtimes), \"InitXtimes\"},\n}\n\nfunc (fl InitFlags) String() string {\n\treturn flagString(uint32(fl), initFlagNames)\n}\n\nfunc flagString(f uint32, names []flagName) string {\n\tvar s string\n\n\tif f == 0 {\n\t\treturn \"0\"\n\t}\n\n\tfor _, n := range names {\n\t\tif f&n.bit != 0 {\n\t\t\ts += \"+\" + n.name\n\t\t\tf &^= n.bit\n\t\t}\n\t}\n\tif f != 0 {\n\t\ts += fmt.Sprintf(\"%+#x\", f)\n\t}\n\treturn s[1:]\n}\n\n// The ReleaseFlags are used in the Release exchange.\ntype ReleaseFlags uint32\n\nconst (\n\tReleaseFlush ReleaseFlags = 1 << 0\n)\n\nfunc (fl ReleaseFlags) String() string {\n\treturn flagString(uint32(fl), releaseFlagNames)\n}\n\nvar releaseFlagNames = []flagName{\n\t{uint32(ReleaseFlush), \"ReleaseFlush\"},\n}\n\n// Opcodes\nconst (\n\topLookup      = 1\n\topForget      = 2 // no reply\n\topGetattr     = 3\n\topSetattr     = 4\n\topReadlink    = 5\n\topSymlink     = 6\n\topMknod       = 8\n\topMkdir       = 9\n\topUnlink      = 10\n\topRmdir       = 11\n\topRename      = 12\n\topLink        = 13\n\topOpen        = 14\n\topRead        = 15\n\topWrite       = 16\n\topStatfs      = 17\n\topRelease     = 18\n\topFsync       = 20\n\topSetxattr    = 21\n\topGetxattr    = 22\n\topListxattr   = 23\n\topRemovexattr = 24\n\topFlush       = 25\n\topInit        = 26\n\topOpendir     = 27\n\topReaddir     = 28\n\topReleasedir  = 29\n\topFsyncdir    = 30\n\topGetlk       = 31\n\topSetlk       = 32\n\topSetlkw      = 33\n\topAccess      = 34\n\topCreate      = 35\n\topInterrupt   = 36\n\topBmap        = 37\n\topDestroy     = 38\n\topIoctl       = 39 // Linux?\n\topPoll        = 40 // Linux?\n\n\t// OS X\n\topSetvolname = 61\n\topGetxtimes  = 62\n\topExchange   = 63\n)\n\ntype entryOut struct {\n\tNodeid         uint64 // Inode ID\n\tGeneration     uint64 // Inode generation\n\tEntryValid     uint64 // Cache timeout for the name\n\tAttrValid      uint64 // Cache timeout for the attributes\n\tEntryValidNsec uint32\n\tAttrValidNsec  uint32\n\tAttr           attr\n}\n\nfunc entryOutSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 9}):\n\t\treturn unsafe.Offsetof(entryOut{}.Attr) + unsafe.Offsetof(entryOut{}.Attr.Blksize)\n\tdefault:\n\t\treturn unsafe.Sizeof(entryOut{})\n\t}\n}\n\ntype forgetIn struct {\n\tNlookup uint64\n}\n\ntype getattrIn struct {\n\tGetattrFlags uint32\n\t_            uint32\n\tFh           uint64\n}\n\ntype attrOut struct {\n\tAttrValid     uint64 // Cache timeout for the attributes\n\tAttrValidNsec uint32\n\t_             uint32\n\tAttr          attr\n}\n\nfunc attrOutSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 9}):\n\t\treturn unsafe.Offsetof(attrOut{}.Attr) + unsafe.Offsetof(attrOut{}.Attr.Blksize)\n\tdefault:\n\t\treturn unsafe.Sizeof(attrOut{})\n\t}\n}\n\n// OS X\ntype getxtimesOut struct {\n\tBkuptime     uint64\n\tCrtime       uint64\n\tBkuptimeNsec uint32\n\tCrtimeNsec   uint32\n}\n\ntype mknodIn struct {\n\tMode  uint32\n\tRdev  uint32\n\tUmask uint32\n\t_     uint32\n\t// \"filename\\x00\" follows.\n}\n\nfunc mknodInSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 12}):\n\t\treturn unsafe.Offsetof(mknodIn{}.Umask)\n\tdefault:\n\t\treturn unsafe.Sizeof(mknodIn{})\n\t}\n}\n\ntype mkdirIn struct {\n\tMode  uint32\n\tUmask uint32\n\t// filename follows\n}\n\nfunc mkdirInSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 12}):\n\t\treturn unsafe.Offsetof(mkdirIn{}.Umask) + 4\n\tdefault:\n\t\treturn unsafe.Sizeof(mkdirIn{})\n\t}\n}\n\ntype renameIn struct {\n\tNewdir uint64\n\t// \"oldname\\x00newname\\x00\" follows\n}\n\n// OS X\ntype exchangeIn struct {\n\tOlddir  uint64\n\tNewdir  uint64\n\tOptions uint64\n\t// \"oldname\\x00newname\\x00\" follows\n}\n\ntype linkIn struct {\n\tOldnodeid uint64\n}\n\ntype setattrInCommon struct {\n\tValid     uint32\n\t_         uint32\n\tFh        uint64\n\tSize      uint64\n\tLockOwner uint64 // unused on OS X?\n\tAtime     uint64\n\tMtime     uint64\n\tUnused2   uint64\n\tAtimeNsec uint32\n\tMtimeNsec uint32\n\tUnused3   uint32\n\tMode      uint32\n\tUnused4   uint32\n\tUid       uint32\n\tGid       uint32\n\tUnused5   uint32\n}\n\ntype openIn struct {\n\tFlags  uint32\n\tUnused uint32\n}\n\ntype openOut struct {\n\tFh        uint64\n\tOpenFlags uint32\n\t_         uint32\n}\n\ntype createIn struct {\n\tFlags uint32\n\tMode  uint32\n\tUmask uint32\n\t_     uint32\n}\n\nfunc createInSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 12}):\n\t\treturn unsafe.Offsetof(createIn{}.Umask)\n\tdefault:\n\t\treturn unsafe.Sizeof(createIn{})\n\t}\n}\n\ntype releaseIn struct {\n\tFh           uint64\n\tFlags        uint32\n\tReleaseFlags uint32\n\tLockOwner    uint32\n}\n\ntype flushIn struct {\n\tFh         uint64\n\tFlushFlags uint32\n\t_          uint32\n\tLockOwner  uint64\n}\n\ntype readIn struct {\n\tFh        uint64\n\tOffset    uint64\n\tSize      uint32\n\tReadFlags uint32\n\tLockOwner uint64\n\tFlags     uint32\n\t_         uint32\n}\n\nfunc readInSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 9}):\n\t\treturn unsafe.Offsetof(readIn{}.ReadFlags) + 4\n\tdefault:\n\t\treturn unsafe.Sizeof(readIn{})\n\t}\n}\n\n// The ReadFlags are passed in ReadRequest.\ntype ReadFlags uint32\n\nconst (\n\t// LockOwner field is valid.\n\tReadLockOwner ReadFlags = 1 << 1\n)\n\nvar readFlagNames = []flagName{\n\t{uint32(ReadLockOwner), \"ReadLockOwner\"},\n}\n\nfunc (fl ReadFlags) String() string {\n\treturn flagString(uint32(fl), readFlagNames)\n}\n\ntype writeIn struct {\n\tFh         uint64\n\tOffset     uint64\n\tSize       uint32\n\tWriteFlags uint32\n\tLockOwner  uint64\n\tFlags      uint32\n\t_          uint32\n}\n\nfunc writeInSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 9}):\n\t\treturn unsafe.Offsetof(writeIn{}.LockOwner)\n\tdefault:\n\t\treturn unsafe.Sizeof(writeIn{})\n\t}\n}\n\ntype writeOut struct {\n\tSize uint32\n\t_    uint32\n}\n\n// The WriteFlags are passed in WriteRequest.\ntype WriteFlags uint32\n\nconst (\n\tWriteCache WriteFlags = 1 << 0\n\t// LockOwner field is valid.\n\tWriteLockOwner WriteFlags = 1 << 1\n)\n\nvar writeFlagNames = []flagName{\n\t{uint32(WriteCache), \"WriteCache\"},\n\t{uint32(WriteLockOwner), \"WriteLockOwner\"},\n}\n\nfunc (fl WriteFlags) String() string {\n\treturn flagString(uint32(fl), writeFlagNames)\n}\n\nconst compatStatfsSize = 48\n\ntype statfsOut struct {\n\tSt kstatfs\n}\n\ntype fsyncIn struct {\n\tFh         uint64\n\tFsyncFlags uint32\n\t_          uint32\n}\n\ntype setxattrInCommon struct {\n\tSize  uint32\n\tFlags uint32\n}\n\nfunc (setxattrInCommon) position() uint32 {\n\treturn 0\n}\n\ntype getxattrInCommon struct {\n\tSize uint32\n\t_    uint32\n}\n\nfunc (getxattrInCommon) position() uint32 {\n\treturn 0\n}\n\ntype getxattrOut struct {\n\tSize uint32\n\t_    uint32\n}\n\ntype lkIn struct {\n\tFh      uint64\n\tOwner   uint64\n\tLk      fileLock\n\tLkFlags uint32\n\t_       uint32\n}\n\nfunc lkInSize(p Protocol) uintptr {\n\tswitch {\n\tcase p.LT(Protocol{7, 9}):\n\t\treturn unsafe.Offsetof(lkIn{}.LkFlags)\n\tdefault:\n\t\treturn unsafe.Sizeof(lkIn{})\n\t}\n}\n\ntype lkOut struct {\n\tLk fileLock\n}\n\ntype accessIn struct {\n\tMask uint32\n\t_    uint32\n}\n\ntype initIn struct {\n\tMajor        uint32\n\tMinor        uint32\n\tMaxReadahead uint32\n\tFlags        uint32\n}\n\nconst initInSize = int(unsafe.Sizeof(initIn{}))\n\ntype initOut struct {\n\tMajor        uint32\n\tMinor        uint32\n\tMaxReadahead uint32\n\tFlags        uint32\n\tUnused       uint32\n\tMaxWrite     uint32\n}\n\ntype interruptIn struct {\n\tUnique uint64\n}\n\ntype bmapIn struct {\n\tBlock     uint64\n\tBlockSize uint32\n\t_         uint32\n}\n\ntype bmapOut struct {\n\tBlock uint64\n}\n\ntype inHeader struct {\n\tLen    uint32\n\tOpcode uint32\n\tUnique uint64\n\tNodeid uint64\n\tUid    uint32\n\tGid    uint32\n\tPid    uint32\n\t_      uint32\n}\n\nconst inHeaderSize = int(unsafe.Sizeof(inHeader{}))\n\ntype outHeader struct {\n\tLen    uint32\n\tError  int32\n\tUnique uint64\n}\n\ntype dirent struct {\n\tIno     uint64\n\tOff     uint64\n\tNamelen uint32\n\tType    uint32\n\tName    [0]byte\n}\n\nconst direntSize = 8 + 8 + 4 + 4\n\nconst (\n\tnotifyCodePoll       int32 = 1\n\tnotifyCodeInvalInode int32 = 2\n\tnotifyCodeInvalEntry int32 = 3\n)\n\ntype notifyInvalInodeOut struct {\n\tIno uint64\n\tOff int64\n\tLen int64\n}\n\ntype notifyInvalEntryOut struct {\n\tParent  uint64\n\tNamelen uint32\n\t_       uint32\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_kernel_darwin.go",
    "content": "package fuse\n\nimport (\n\t\"time\"\n)\n\ntype attr struct {\n\tIno        uint64\n\tSize       uint64\n\tBlocks     uint64\n\tAtime      uint64\n\tMtime      uint64\n\tCtime      uint64\n\tCrtime_    uint64 // OS X only\n\tAtimeNsec  uint32\n\tMtimeNsec  uint32\n\tCtimeNsec  uint32\n\tCrtimeNsec uint32 // OS X only\n\tMode       uint32\n\tNlink      uint32\n\tUid        uint32\n\tGid        uint32\n\tRdev       uint32\n\tFlags_     uint32 // OS X only; see chflags(2)\n\tBlksize    uint32\n\tpadding    uint32\n}\n\nfunc (a *attr) SetCrtime(s uint64, ns uint32) {\n\ta.Crtime_, a.CrtimeNsec = s, ns\n}\n\nfunc (a *attr) SetFlags(f uint32) {\n\ta.Flags_ = f\n}\n\ntype setattrIn struct {\n\tsetattrInCommon\n\n\t// OS X only\n\tBkuptime_    uint64\n\tChgtime_     uint64\n\tCrtime       uint64\n\tBkuptimeNsec uint32\n\tChgtimeNsec  uint32\n\tCrtimeNsec   uint32\n\tFlags_       uint32 // see chflags(2)\n}\n\nfunc (in *setattrIn) BkupTime() time.Time {\n\treturn time.Unix(int64(in.Bkuptime_), int64(in.BkuptimeNsec))\n}\n\nfunc (in *setattrIn) Chgtime() time.Time {\n\treturn time.Unix(int64(in.Chgtime_), int64(in.ChgtimeNsec))\n}\n\nfunc (in *setattrIn) Flags() uint32 {\n\treturn in.Flags_\n}\n\nfunc openFlags(flags uint32) OpenFlags {\n\treturn OpenFlags(flags)\n}\n\ntype getxattrIn struct {\n\tgetxattrInCommon\n\n\t// OS X only\n\tPosition uint32\n\tPadding  uint32\n}\n\nfunc (g *getxattrIn) position() uint32 {\n\treturn g.Position\n}\n\ntype setxattrIn struct {\n\tsetxattrInCommon\n\n\t// OS X only\n\tPosition uint32\n\tPadding  uint32\n}\n\nfunc (s *setxattrIn) position() uint32 {\n\treturn s.Position\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_kernel_freebsd.go",
    "content": "package fuse\n\nimport \"time\"\n\ntype attr struct {\n\tIno       uint64\n\tSize      uint64\n\tBlocks    uint64\n\tAtime     uint64\n\tMtime     uint64\n\tCtime     uint64\n\tAtimeNsec uint32\n\tMtimeNsec uint32\n\tCtimeNsec uint32\n\tMode      uint32\n\tNlink     uint32\n\tUid       uint32\n\tGid       uint32\n\tRdev      uint32\n\tBlksize   uint32\n\tpadding   uint32\n}\n\nfunc (a *attr) Crtime() time.Time {\n\treturn time.Time{}\n}\n\nfunc (a *attr) SetCrtime(s uint64, ns uint32) {\n\t// ignored on freebsd\n}\n\nfunc (a *attr) SetFlags(f uint32) {\n\t// ignored on freebsd\n}\n\ntype setattrIn struct {\n\tsetattrInCommon\n}\n\nfunc (in *setattrIn) BkupTime() time.Time {\n\treturn time.Time{}\n}\n\nfunc (in *setattrIn) Chgtime() time.Time {\n\treturn time.Time{}\n}\n\nfunc (in *setattrIn) Flags() uint32 {\n\treturn 0\n}\n\nfunc openFlags(flags uint32) OpenFlags {\n\treturn OpenFlags(flags)\n}\n\ntype getxattrIn struct {\n\tgetxattrInCommon\n}\n\ntype setxattrIn struct {\n\tsetxattrInCommon\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_kernel_linux.go",
    "content": "package fuse\n\nimport \"time\"\n\ntype attr struct {\n\tIno       uint64\n\tSize      uint64\n\tBlocks    uint64\n\tAtime     uint64\n\tMtime     uint64\n\tCtime     uint64\n\tAtimeNsec uint32\n\tMtimeNsec uint32\n\tCtimeNsec uint32\n\tMode      uint32\n\tNlink     uint32\n\tUid       uint32\n\tGid       uint32\n\tRdev      uint32\n\tBlksize   uint32\n\tpadding   uint32\n}\n\nfunc (a *attr) Crtime() time.Time {\n\treturn time.Time{}\n}\n\nfunc (a *attr) SetCrtime(s uint64, ns uint32) {\n\t// Ignored on Linux.\n}\n\nfunc (a *attr) SetFlags(f uint32) {\n\t// Ignored on Linux.\n}\n\ntype setattrIn struct {\n\tsetattrInCommon\n}\n\nfunc (in *setattrIn) BkupTime() time.Time {\n\treturn time.Time{}\n}\n\nfunc (in *setattrIn) Chgtime() time.Time {\n\treturn time.Time{}\n}\n\nfunc (in *setattrIn) Flags() uint32 {\n\treturn 0\n}\n\nfunc openFlags(flags uint32) OpenFlags {\n\t// on amd64, the 32-bit O_LARGEFILE flag is always seen;\n\t// on i386, the flag probably depends on the app\n\t// requesting, but in any case should be utterly\n\t// uninteresting to us here; our kernel protocol messages\n\t// are not directly related to the client app's kernel\n\t// API/ABI\n\tflags &^= 0x8000\n\n\treturn OpenFlags(flags)\n}\n\ntype getxattrIn struct {\n\tgetxattrInCommon\n}\n\ntype setxattrIn struct {\n\tsetxattrInCommon\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_kernel_std.go",
    "content": "package fuse\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuse_linux.go",
    "content": "package fuse\n\n// Maximum file write size we are prepared to receive from the kernel.\n//\n// Linux 4.2.0 has been observed to cap this value at 128kB\n// (FUSE_MAX_PAGES_PER_REQ=32, 4kB pages).\nconst maxWrite = 128 * 1024\n"
  },
  {
    "path": "vendor/bazil.org/fuse/fuseutil/fuseutil.go",
    "content": "package fuseutil // import \"bazil.org/fuse/fuseutil\"\n\nimport (\n\t\"bazil.org/fuse\"\n)\n\n// HandleRead handles a read request assuming that data is the entire file content.\n// It adjusts the amount returned in resp according to req.Offset and req.Size.\nfunc HandleRead(req *fuse.ReadRequest, resp *fuse.ReadResponse, data []byte) {\n\tif req.Offset >= int64(len(data)) {\n\t\tdata = nil\n\t} else {\n\t\tdata = data[req.Offset:]\n\t}\n\tif len(data) > req.Size {\n\t\tdata = data[:req.Size]\n\t}\n\tn := copy(resp.Data[:req.Size], data)\n\tresp.Data = resp.Data[:n]\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/mount.go",
    "content": "package fuse\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"io\"\n\t\"log\"\n\t\"sync\"\n)\n\nvar (\n\t// ErrOSXFUSENotFound is returned from Mount when the OSXFUSE\n\t// installation is not detected.\n\t//\n\t// Only happens on OS X. Make sure OSXFUSE is installed, or see\n\t// OSXFUSELocations for customization.\n\tErrOSXFUSENotFound = errors.New(\"cannot locate OSXFUSE\")\n)\n\nfunc neverIgnoreLine(line string) bool {\n\treturn false\n}\n\nfunc lineLogger(wg *sync.WaitGroup, prefix string, ignore func(line string) bool, r io.ReadCloser) {\n\tdefer wg.Done()\n\n\tscanner := bufio.NewScanner(r)\n\tfor scanner.Scan() {\n\t\tline := scanner.Text()\n\t\tif ignore(line) {\n\t\t\tcontinue\n\t\t}\n\t\tlog.Printf(\"%s: %s\", prefix, line)\n\t}\n\tif err := scanner.Err(); err != nil {\n\t\tlog.Printf(\"%s, error reading: %v\", prefix, err)\n\t}\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/mount_darwin.go",
    "content": "package fuse\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n)\n\nvar (\n\terrNoAvail   = errors.New(\"no available fuse devices\")\n\terrNotLoaded = errors.New(\"osxfuse is not loaded\")\n)\n\nfunc loadOSXFUSE(bin string) error {\n\tcmd := exec.Command(bin)\n\tcmd.Dir = \"/\"\n\tcmd.Stdout = os.Stdout\n\tcmd.Stderr = os.Stderr\n\terr := cmd.Run()\n\treturn err\n}\n\nfunc openOSXFUSEDev(devPrefix string) (*os.File, error) {\n\tvar f *os.File\n\tvar err error\n\tfor i := uint64(0); ; i++ {\n\t\tpath := devPrefix + strconv.FormatUint(i, 10)\n\t\tf, err = os.OpenFile(path, os.O_RDWR, 0000)\n\t\tif os.IsNotExist(err) {\n\t\t\tif i == 0 {\n\t\t\t\t// not even the first device was found -> fuse is not loaded\n\t\t\t\treturn nil, errNotLoaded\n\t\t\t}\n\n\t\t\t// we've run out of kernel-provided devices\n\t\t\treturn nil, errNoAvail\n\t\t}\n\n\t\tif err2, ok := err.(*os.PathError); ok && err2.Err == syscall.EBUSY {\n\t\t\t// try the next one\n\t\t\tcontinue\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn f, nil\n\t}\n}\n\nfunc handleMountOSXFUSE(helperName string, errCh chan<- error) func(line string) (ignore bool) {\n\tvar noMountpointPrefix = helperName + `: `\n\tconst noMountpointSuffix = `: No such file or directory`\n\treturn func(line string) (ignore bool) {\n\t\tif strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) {\n\t\t\t// re-extract it from the error message in case some layer\n\t\t\t// changed the path\n\t\t\tmountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)]\n\t\t\terr := &MountpointDoesNotExistError{\n\t\t\t\tPath: mountpoint,\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase errCh <- err:\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\t// not the first error; fall back to logging it\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n}\n\n// isBoringMountOSXFUSEError returns whether the Wait error is\n// uninteresting; exit status 64 is.\nfunc isBoringMountOSXFUSEError(err error) bool {\n\tif err, ok := err.(*exec.ExitError); ok && err.Exited() {\n\t\tif status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 64 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc callMount(bin string, daemonVar string, dir string, conf *mountConfig, f *os.File, ready chan<- struct{}, errp *error) error {\n\tfor k, v := range conf.options {\n\t\tif strings.Contains(k, \",\") || strings.Contains(v, \",\") {\n\t\t\t// Silly limitation but the mount helper does not\n\t\t\t// understand any escaping. See TestMountOptionCommaError.\n\t\t\treturn fmt.Errorf(\"mount options cannot contain commas on darwin: %q=%q\", k, v)\n\t\t}\n\t}\n\tcmd := exec.Command(\n\t\tbin,\n\t\t\"-o\", conf.getOptions(),\n\t\t// Tell osxfuse-kext how large our buffer is. It must split\n\t\t// writes larger than this into multiple writes.\n\t\t//\n\t\t// OSXFUSE seems to ignore InitResponse.MaxWrite, and uses\n\t\t// this instead.\n\t\t\"-o\", \"iosize=\"+strconv.FormatUint(maxWrite, 10),\n\t\t// refers to fd passed in cmd.ExtraFiles\n\t\t\"3\",\n\t\tdir,\n\t)\n\tcmd.ExtraFiles = []*os.File{f}\n\tcmd.Env = os.Environ()\n\t// OSXFUSE <3.3.0\n\tcmd.Env = append(cmd.Env, \"MOUNT_FUSEFS_CALL_BY_LIB=\")\n\t// OSXFUSE >=3.3.0\n\tcmd.Env = append(cmd.Env, \"MOUNT_OSXFUSE_CALL_BY_LIB=\")\n\n\tdaemon := os.Args[0]\n\tif daemonVar != \"\" {\n\t\tcmd.Env = append(cmd.Env, daemonVar+\"=\"+daemon)\n\t}\n\n\tstdout, err := cmd.StdoutPipe()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"setting up mount_osxfusefs stderr: %v\", err)\n\t}\n\tstderr, err := cmd.StderrPipe()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"setting up mount_osxfusefs stderr: %v\", err)\n\t}\n\n\tif err := cmd.Start(); err != nil {\n\t\treturn fmt.Errorf(\"mount_osxfusefs: %v\", err)\n\t}\n\thelperErrCh := make(chan error, 1)\n\tgo func() {\n\t\tvar wg sync.WaitGroup\n\t\twg.Add(2)\n\t\tgo lineLogger(&wg, \"mount helper output\", neverIgnoreLine, stdout)\n\t\thelperName := path.Base(bin)\n\t\tgo lineLogger(&wg, \"mount helper error\", handleMountOSXFUSE(helperName, helperErrCh), stderr)\n\t\twg.Wait()\n\t\tif err := cmd.Wait(); err != nil {\n\t\t\t// see if we have a better error to report\n\t\t\tselect {\n\t\t\tcase helperErr := <-helperErrCh:\n\t\t\t\t// log the Wait error if it's not what we expected\n\t\t\t\tif !isBoringMountOSXFUSEError(err) {\n\t\t\t\t\tlog.Printf(\"mount helper failed: %v\", err)\n\t\t\t\t}\n\t\t\t\t// and now return what we grabbed from stderr as the real\n\t\t\t\t// error\n\t\t\t\t*errp = helperErr\n\t\t\t\tclose(ready)\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\t// nope, fall back to generic message\n\t\t\t}\n\n\t\t\t*errp = fmt.Errorf(\"mount_osxfusefs: %v\", err)\n\t\t\tclose(ready)\n\t\t\treturn\n\t\t}\n\n\t\t*errp = nil\n\t\tclose(ready)\n\t}()\n\treturn nil\n}\n\nfunc mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (*os.File, error) {\n\tlocations := conf.osxfuseLocations\n\tif locations == nil {\n\t\tlocations = []OSXFUSEPaths{\n\t\t\tOSXFUSELocationV3,\n\t\t\tOSXFUSELocationV2,\n\t\t}\n\t}\n\tfor _, loc := range locations {\n\t\tif _, err := os.Stat(loc.Mount); os.IsNotExist(err) {\n\t\t\t// try the other locations\n\t\t\tcontinue\n\t\t}\n\n\t\tf, err := openOSXFUSEDev(loc.DevicePrefix)\n\t\tif err == errNotLoaded {\n\t\t\terr = loadOSXFUSE(loc.Load)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\t// try again\n\t\t\tf, err = openOSXFUSEDev(loc.DevicePrefix)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\terr = callMount(loc.Mount, loc.DaemonVar, dir, conf, f, ready, errp)\n\t\tif err != nil {\n\t\t\tf.Close()\n\t\t\treturn nil, err\n\t\t}\n\t\treturn f, nil\n\t}\n\treturn nil, ErrOSXFUSENotFound\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/mount_freebsd.go",
    "content": "package fuse\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n)\n\nfunc handleMountFusefsStderr(errCh chan<- error) func(line string) (ignore bool) {\n\treturn func(line string) (ignore bool) {\n\t\tconst (\n\t\t\tnoMountpointPrefix = `mount_fusefs: `\n\t\t\tnoMountpointSuffix = `: No such file or directory`\n\t\t)\n\t\tif strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) {\n\t\t\t// re-extract it from the error message in case some layer\n\t\t\t// changed the path\n\t\t\tmountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)]\n\t\t\terr := &MountpointDoesNotExistError{\n\t\t\t\tPath: mountpoint,\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase errCh <- err:\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\t// not the first error; fall back to logging it\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n}\n\n// isBoringMountFusefsError returns whether the Wait error is\n// uninteresting; exit status 1 is.\nfunc isBoringMountFusefsError(err error) bool {\n\tif err, ok := err.(*exec.ExitError); ok && err.Exited() {\n\t\tif status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 1 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (*os.File, error) {\n\tfor k, v := range conf.options {\n\t\tif strings.Contains(k, \",\") || strings.Contains(v, \",\") {\n\t\t\t// Silly limitation but the mount helper does not\n\t\t\t// understand any escaping. See TestMountOptionCommaError.\n\t\t\treturn nil, fmt.Errorf(\"mount options cannot contain commas on FreeBSD: %q=%q\", k, v)\n\t\t}\n\t}\n\n\tf, err := os.OpenFile(\"/dev/fuse\", os.O_RDWR, 0000)\n\tif err != nil {\n\t\t*errp = err\n\t\treturn nil, err\n\t}\n\n\tcmd := exec.Command(\n\t\t\"/sbin/mount_fusefs\",\n\t\t\"--safe\",\n\t\t\"-o\", conf.getOptions(),\n\t\t\"3\",\n\t\tdir,\n\t)\n\tcmd.ExtraFiles = []*os.File{f}\n\n\tstdout, err := cmd.StdoutPipe()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"setting up mount_fusefs stderr: %v\", err)\n\t}\n\tstderr, err := cmd.StderrPipe()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"setting up mount_fusefs stderr: %v\", err)\n\t}\n\n\tif err := cmd.Start(); err != nil {\n\t\treturn nil, fmt.Errorf(\"mount_fusefs: %v\", err)\n\t}\n\thelperErrCh := make(chan error, 1)\n\tvar wg sync.WaitGroup\n\twg.Add(2)\n\tgo lineLogger(&wg, \"mount helper output\", neverIgnoreLine, stdout)\n\tgo lineLogger(&wg, \"mount helper error\", handleMountFusefsStderr(helperErrCh), stderr)\n\twg.Wait()\n\tif err := cmd.Wait(); err != nil {\n\t\t// see if we have a better error to report\n\t\tselect {\n\t\tcase helperErr := <-helperErrCh:\n\t\t\t// log the Wait error if it's not what we expected\n\t\t\tif !isBoringMountFusefsError(err) {\n\t\t\t\tlog.Printf(\"mount helper failed: %v\", err)\n\t\t\t}\n\t\t\t// and now return what we grabbed from stderr as the real\n\t\t\t// error\n\t\t\treturn nil, helperErr\n\t\tdefault:\n\t\t\t// nope, fall back to generic message\n\t\t}\n\t\treturn nil, fmt.Errorf(\"mount_fusefs: %v\", err)\n\t}\n\n\tclose(ready)\n\treturn f, nil\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/mount_linux.go",
    "content": "package fuse\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n)\n\nfunc handleFusermountStderr(errCh chan<- error) func(line string) (ignore bool) {\n\treturn func(line string) (ignore bool) {\n\t\tif line == `fusermount: failed to open /etc/fuse.conf: Permission denied` {\n\t\t\t// Silence this particular message, it occurs way too\n\t\t\t// commonly and isn't very relevant to whether the mount\n\t\t\t// succeeds or not.\n\t\t\treturn true\n\t\t}\n\n\t\tconst (\n\t\t\tnoMountpointPrefix = `fusermount: failed to access mountpoint `\n\t\t\tnoMountpointSuffix = `: No such file or directory`\n\t\t)\n\t\tif strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) {\n\t\t\t// re-extract it from the error message in case some layer\n\t\t\t// changed the path\n\t\t\tmountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)]\n\t\t\terr := &MountpointDoesNotExistError{\n\t\t\t\tPath: mountpoint,\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase errCh <- err:\n\t\t\t\treturn true\n\t\t\tdefault:\n\t\t\t\t// not the first error; fall back to logging it\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n}\n\n// isBoringFusermountError returns whether the Wait error is\n// uninteresting; exit status 1 is.\nfunc isBoringFusermountError(err error) bool {\n\tif err, ok := err.(*exec.ExitError); ok && err.Exited() {\n\t\tif status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 1 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (fusefd *os.File, err error) {\n\t// linux mount is never delayed\n\tclose(ready)\n\n\tfds, err := syscall.Socketpair(syscall.AF_FILE, syscall.SOCK_STREAM, 0)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"socketpair error: %v\", err)\n\t}\n\n\twriteFile := os.NewFile(uintptr(fds[0]), \"fusermount-child-writes\")\n\tdefer writeFile.Close()\n\n\treadFile := os.NewFile(uintptr(fds[1]), \"fusermount-parent-reads\")\n\tdefer readFile.Close()\n\n\tcmd := exec.Command(\n\t\t\"fusermount\",\n\t\t\"-o\", conf.getOptions(),\n\t\t\"--\",\n\t\tdir,\n\t)\n\tcmd.Env = append(os.Environ(), \"_FUSE_COMMFD=3\")\n\n\tcmd.ExtraFiles = []*os.File{writeFile}\n\n\tvar wg sync.WaitGroup\n\tstdout, err := cmd.StdoutPipe()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"setting up fusermount stderr: %v\", err)\n\t}\n\tstderr, err := cmd.StderrPipe()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"setting up fusermount stderr: %v\", err)\n\t}\n\n\tif err := cmd.Start(); err != nil {\n\t\treturn nil, fmt.Errorf(\"fusermount: %v\", err)\n\t}\n\thelperErrCh := make(chan error, 1)\n\twg.Add(2)\n\tgo lineLogger(&wg, \"mount helper output\", neverIgnoreLine, stdout)\n\tgo lineLogger(&wg, \"mount helper error\", handleFusermountStderr(helperErrCh), stderr)\n\twg.Wait()\n\tif err := cmd.Wait(); err != nil {\n\t\t// see if we have a better error to report\n\t\tselect {\n\t\tcase helperErr := <-helperErrCh:\n\t\t\t// log the Wait error if it's not what we expected\n\t\t\tif !isBoringFusermountError(err) {\n\t\t\t\tlog.Printf(\"mount helper failed: %v\", err)\n\t\t\t}\n\t\t\t// and now return what we grabbed from stderr as the real\n\t\t\t// error\n\t\t\treturn nil, helperErr\n\t\tdefault:\n\t\t\t// nope, fall back to generic message\n\t\t}\n\n\t\treturn nil, fmt.Errorf(\"fusermount: %v\", err)\n\t}\n\n\tc, err := net.FileConn(readFile)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"FileConn from fusermount socket: %v\", err)\n\t}\n\tdefer c.Close()\n\n\tuc, ok := c.(*net.UnixConn)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"unexpected FileConn type; expected UnixConn, got %T\", c)\n\t}\n\n\tbuf := make([]byte, 32) // expect 1 byte\n\toob := make([]byte, 32) // expect 24 bytes\n\t_, oobn, _, _, err := uc.ReadMsgUnix(buf, oob)\n\tscms, err := syscall.ParseSocketControlMessage(oob[:oobn])\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"ParseSocketControlMessage: %v\", err)\n\t}\n\tif len(scms) != 1 {\n\t\treturn nil, fmt.Errorf(\"expected 1 SocketControlMessage; got scms = %#v\", scms)\n\t}\n\tscm := scms[0]\n\tgotFds, err := syscall.ParseUnixRights(&scm)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"syscall.ParseUnixRights: %v\", err)\n\t}\n\tif len(gotFds) != 1 {\n\t\treturn nil, fmt.Errorf(\"wanted 1 fd; got %#v\", gotFds)\n\t}\n\tf := os.NewFile(uintptr(gotFds[0]), \"/dev/fuse\")\n\treturn f, nil\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/options.go",
    "content": "package fuse\n\nimport (\n\t\"errors\"\n\t\"strings\"\n)\n\nfunc dummyOption(conf *mountConfig) error {\n\treturn nil\n}\n\n// mountConfig holds the configuration for a mount operation.\n// Use it by passing MountOption values to Mount.\ntype mountConfig struct {\n\toptions          map[string]string\n\tmaxReadahead     uint32\n\tinitFlags        InitFlags\n\tosxfuseLocations []OSXFUSEPaths\n}\n\nfunc escapeComma(s string) string {\n\ts = strings.Replace(s, `\\`, `\\\\`, -1)\n\ts = strings.Replace(s, `,`, `\\,`, -1)\n\treturn s\n}\n\n// getOptions makes a string of options suitable for passing to FUSE\n// mount flag `-o`. Returns an empty string if no options were set.\n// Any platform specific adjustments should happen before the call.\nfunc (m *mountConfig) getOptions() string {\n\tvar opts []string\n\tfor k, v := range m.options {\n\t\tk = escapeComma(k)\n\t\tif v != \"\" {\n\t\t\tk += \"=\" + escapeComma(v)\n\t\t}\n\t\topts = append(opts, k)\n\t}\n\treturn strings.Join(opts, \",\")\n}\n\ntype mountOption func(*mountConfig) error\n\n// MountOption is passed to Mount to change the behavior of the mount.\ntype MountOption mountOption\n\n// FSName sets the file system name (also called source) that is\n// visible in the list of mounted file systems.\n//\n// FreeBSD ignores this option.\nfunc FSName(name string) MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"fsname\"] = name\n\t\treturn nil\n\t}\n}\n\n// Subtype sets the subtype of the mount. The main type is always\n// `fuse`. The type in a list of mounted file systems will look like\n// `fuse.foo`.\n//\n// OS X ignores this option.\n// FreeBSD ignores this option.\nfunc Subtype(fstype string) MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"subtype\"] = fstype\n\t\treturn nil\n\t}\n}\n\n// LocalVolume sets the volume to be local (instead of network),\n// changing the behavior of Finder, Spotlight, and such.\n//\n// OS X only. Others ignore this option.\nfunc LocalVolume() MountOption {\n\treturn localVolume\n}\n\n// VolumeName sets the volume name shown in Finder.\n//\n// OS X only. Others ignore this option.\nfunc VolumeName(name string) MountOption {\n\treturn volumeName(name)\n}\n\n// NoAppleDouble makes OSXFUSE disallow files with names used by OS X\n// to store extended attributes on file systems that do not support\n// them natively.\n//\n// Such file names are:\n//\n//     ._*\n//     .DS_Store\n//\n// OS X only.  Others ignore this option.\nfunc NoAppleDouble() MountOption {\n\treturn noAppleDouble\n}\n\n// NoAppleXattr makes OSXFUSE disallow extended attributes with the\n// prefix \"com.apple.\". This disables persistent Finder state and\n// other such information.\n//\n// OS X only.  Others ignore this option.\nfunc NoAppleXattr() MountOption {\n\treturn noAppleXattr\n}\n\n// ExclCreate causes O_EXCL flag to be set for only \"truly\" exclusive creates,\n// i.e. create calls for which the initiator explicitly set the O_EXCL flag.\n//\n// OSXFUSE expects all create calls to return EEXIST in case the file\n// already exists, regardless of whether O_EXCL was specified or not.\n// To ensure this behavior, it normally sets OpenExclusive for all\n// Create calls, regardless of whether the original call had it set.\n// For distributed filesystems, that may force every file create to be\n// a distributed consensus action, causing undesirable delays.\n//\n// This option makes the FUSE filesystem see the original flag value,\n// and better decide when to ensure global consensus.\n//\n// Note that returning EEXIST on existing file create is still\n// expected with OSXFUSE, regardless of the presence of the\n// OpenExclusive flag.\n//\n// For more information, see\n// https://github.com/osxfuse/osxfuse/issues/209\n//\n// OS X only. Others ignore this options.\n// Requires OSXFUSE 3.4.1 or newer.\nfunc ExclCreate() MountOption {\n\treturn exclCreate\n}\n\n// DaemonTimeout sets the time in seconds between a request and a reply before\n// the FUSE mount is declared dead.\n//\n// OS X and FreeBSD only. Others ignore this option.\nfunc DaemonTimeout(name string) MountOption {\n\treturn daemonTimeout(name)\n}\n\nvar ErrCannotCombineAllowOtherAndAllowRoot = errors.New(\"cannot combine AllowOther and AllowRoot\")\n\n// AllowOther allows other users to access the file system.\n//\n// Only one of AllowOther or AllowRoot can be used.\nfunc AllowOther() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tif _, ok := conf.options[\"allow_root\"]; ok {\n\t\t\treturn ErrCannotCombineAllowOtherAndAllowRoot\n\t\t}\n\t\tconf.options[\"allow_other\"] = \"\"\n\t\treturn nil\n\t}\n}\n\n// AllowRoot allows other users to access the file system.\n//\n// Only one of AllowOther or AllowRoot can be used.\n//\n// FreeBSD ignores this option.\nfunc AllowRoot() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tif _, ok := conf.options[\"allow_other\"]; ok {\n\t\t\treturn ErrCannotCombineAllowOtherAndAllowRoot\n\t\t}\n\t\tconf.options[\"allow_root\"] = \"\"\n\t\treturn nil\n\t}\n}\n\n// AllowDev enables interpreting character or block special devices on the\n// filesystem.\nfunc AllowDev() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"dev\"] = \"\"\n\t\treturn nil\n\t}\n}\n\n// AllowSUID allows set-user-identifier or set-group-identifier bits to take\n// effect.\nfunc AllowSUID() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"suid\"] = \"\"\n\t\treturn nil\n\t}\n}\n\n// DefaultPermissions makes the kernel enforce access control based on\n// the file mode (as in chmod).\n//\n// Without this option, the Node itself decides what is and is not\n// allowed. This is normally ok because FUSE file systems cannot be\n// accessed by other users without AllowOther/AllowRoot.\n//\n// FreeBSD ignores this option.\nfunc DefaultPermissions() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"default_permissions\"] = \"\"\n\t\treturn nil\n\t}\n}\n\n// ReadOnly makes the mount read-only.\nfunc ReadOnly() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"ro\"] = \"\"\n\t\treturn nil\n\t}\n}\n\n// MaxReadahead sets the number of bytes that can be prefetched for\n// sequential reads. The kernel can enforce a maximum value lower than\n// this.\n//\n// This setting makes the kernel perform speculative reads that do not\n// originate from any client process. This usually tremendously\n// improves read performance.\nfunc MaxReadahead(n uint32) MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.maxReadahead = n\n\t\treturn nil\n\t}\n}\n\n// AsyncRead enables multiple outstanding read requests for the same\n// handle. Without this, there is at most one request in flight at a\n// time.\nfunc AsyncRead() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.initFlags |= InitAsyncRead\n\t\treturn nil\n\t}\n}\n\n// WritebackCache enables the kernel to buffer writes before sending\n// them to the FUSE server. Without this, writethrough caching is\n// used.\nfunc WritebackCache() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.initFlags |= InitWritebackCache\n\t\treturn nil\n\t}\n}\n\n// OSXFUSEPaths describes the paths used by an installed OSXFUSE\n// version. See OSXFUSELocationV3 for typical values.\ntype OSXFUSEPaths struct {\n\t// Prefix for the device file. At mount time, an incrementing\n\t// number is suffixed until a free FUSE device is found.\n\tDevicePrefix string\n\t// Path of the load helper, used to load the kernel extension if\n\t// no device files are found.\n\tLoad string\n\t// Path of the mount helper, used for the actual mount operation.\n\tMount string\n\t// Environment variable used to pass the path to the executable\n\t// calling the mount helper.\n\tDaemonVar string\n}\n\n// Default paths for OSXFUSE. See OSXFUSELocations.\nvar (\n\tOSXFUSELocationV3 = OSXFUSEPaths{\n\t\tDevicePrefix: \"/dev/osxfuse\",\n\t\tLoad:         \"/Library/Filesystems/osxfuse.fs/Contents/Resources/load_osxfuse\",\n\t\tMount:        \"/Library/Filesystems/osxfuse.fs/Contents/Resources/mount_osxfuse\",\n\t\tDaemonVar:    \"MOUNT_OSXFUSE_DAEMON_PATH\",\n\t}\n\tOSXFUSELocationV2 = OSXFUSEPaths{\n\t\tDevicePrefix: \"/dev/osxfuse\",\n\t\tLoad:         \"/Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs\",\n\t\tMount:        \"/Library/Filesystems/osxfusefs.fs/Support/mount_osxfusefs\",\n\t\tDaemonVar:    \"MOUNT_FUSEFS_DAEMON_PATH\",\n\t}\n)\n\n// OSXFUSELocations sets where to look for OSXFUSE files. The\n// arguments are all the possible locations. The previous locations\n// are replaced.\n//\n// Without this option, OSXFUSELocationV3 and OSXFUSELocationV2 are\n// used.\n//\n// OS X only. Others ignore this option.\nfunc OSXFUSELocations(paths ...OSXFUSEPaths) MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tif len(paths) == 0 {\n\t\t\treturn errors.New(\"must specify at least one location for OSXFUSELocations\")\n\t\t}\n\t\t// replace previous values, but make a copy so there's no\n\t\t// worries about caller mutating their slice\n\t\tconf.osxfuseLocations = append(conf.osxfuseLocations[:0], paths...)\n\t\treturn nil\n\t}\n}\n\n// AllowNonEmptyMount allows the mounting over a non-empty directory.\n//\n// The files in it will be shadowed by the freshly created mount. By\n// default these mounts are rejected to prevent accidental covering up\n// of data, which could for example prevent automatic backup.\nfunc AllowNonEmptyMount() MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"nonempty\"] = \"\"\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/options_darwin.go",
    "content": "package fuse\n\nfunc localVolume(conf *mountConfig) error {\n\tconf.options[\"local\"] = \"\"\n\treturn nil\n}\n\nfunc volumeName(name string) MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"volname\"] = name\n\t\treturn nil\n\t}\n}\n\nfunc daemonTimeout(name string) MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"daemon_timeout\"] = name\n\t\treturn nil\n\t}\n}\n\nfunc noAppleXattr(conf *mountConfig) error {\n\tconf.options[\"noapplexattr\"] = \"\"\n\treturn nil\n}\n\nfunc noAppleDouble(conf *mountConfig) error {\n\tconf.options[\"noappledouble\"] = \"\"\n\treturn nil\n}\n\nfunc exclCreate(conf *mountConfig) error {\n\tconf.options[\"excl_create\"] = \"\"\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/options_freebsd.go",
    "content": "package fuse\n\nfunc localVolume(conf *mountConfig) error {\n\treturn nil\n}\n\nfunc volumeName(name string) MountOption {\n\treturn dummyOption\n}\n\nfunc daemonTimeout(name string) MountOption {\n\treturn func(conf *mountConfig) error {\n\t\tconf.options[\"timeout\"] = name\n\t\treturn nil\n\t}\n}\n\nfunc noAppleXattr(conf *mountConfig) error {\n\treturn nil\n}\n\nfunc noAppleDouble(conf *mountConfig) error {\n\treturn nil\n}\n\nfunc exclCreate(conf *mountConfig) error {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/options_linux.go",
    "content": "package fuse\n\nfunc localVolume(conf *mountConfig) error {\n\treturn nil\n}\n\nfunc volumeName(name string) MountOption {\n\treturn dummyOption\n}\n\nfunc daemonTimeout(name string) MountOption {\n\treturn dummyOption\n}\n\nfunc noAppleXattr(conf *mountConfig) error {\n\treturn nil\n}\n\nfunc noAppleDouble(conf *mountConfig) error {\n\treturn nil\n}\n\nfunc exclCreate(conf *mountConfig) error {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/protocol.go",
    "content": "package fuse\n\nimport (\n\t\"fmt\"\n)\n\n// Protocol is a FUSE protocol version number.\ntype Protocol struct {\n\tMajor uint32\n\tMinor uint32\n}\n\nfunc (p Protocol) String() string {\n\treturn fmt.Sprintf(\"%d.%d\", p.Major, p.Minor)\n}\n\n// LT returns whether a is less than b.\nfunc (a Protocol) LT(b Protocol) bool {\n\treturn a.Major < b.Major ||\n\t\t(a.Major == b.Major && a.Minor < b.Minor)\n}\n\n// GE returns whether a is greater than or equal to b.\nfunc (a Protocol) GE(b Protocol) bool {\n\treturn a.Major > b.Major ||\n\t\t(a.Major == b.Major && a.Minor >= b.Minor)\n}\n\nfunc (a Protocol) is79() bool {\n\treturn a.GE(Protocol{7, 9})\n}\n\n// HasAttrBlockSize returns whether Attr.BlockSize is respected by the\n// kernel.\nfunc (a Protocol) HasAttrBlockSize() bool {\n\treturn a.is79()\n}\n\n// HasReadWriteFlags returns whether ReadRequest/WriteRequest\n// fields Flags and FileFlags are valid.\nfunc (a Protocol) HasReadWriteFlags() bool {\n\treturn a.is79()\n}\n\n// HasGetattrFlags returns whether GetattrRequest field Flags is\n// valid.\nfunc (a Protocol) HasGetattrFlags() bool {\n\treturn a.is79()\n}\n\nfunc (a Protocol) is710() bool {\n\treturn a.GE(Protocol{7, 10})\n}\n\n// HasOpenNonSeekable returns whether OpenResponse field Flags flag\n// OpenNonSeekable is supported.\nfunc (a Protocol) HasOpenNonSeekable() bool {\n\treturn a.is710()\n}\n\nfunc (a Protocol) is712() bool {\n\treturn a.GE(Protocol{7, 12})\n}\n\n// HasUmask returns whether CreateRequest/MkdirRequest/MknodRequest\n// field Umask is valid.\nfunc (a Protocol) HasUmask() bool {\n\treturn a.is712()\n}\n\n// HasInvalidate returns whether InvalidateNode/InvalidateEntry are\n// supported.\nfunc (a Protocol) HasInvalidate() bool {\n\treturn a.is712()\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/unmount.go",
    "content": "package fuse\n\n// Unmount tries to unmount the filesystem mounted at dir.\nfunc Unmount(dir string) error {\n\treturn unmount(dir)\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/unmount_linux.go",
    "content": "package fuse\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"os/exec\"\n)\n\nfunc unmount(dir string) error {\n\tcmd := exec.Command(\"fusermount\", \"-u\", dir)\n\toutput, err := cmd.CombinedOutput()\n\tif err != nil {\n\t\tif len(output) > 0 {\n\t\t\toutput = bytes.TrimRight(output, \"\\n\")\n\t\t\tmsg := err.Error() + \": \" + string(output)\n\t\t\terr = errors.New(msg)\n\t\t}\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/bazil.org/fuse/unmount_std.go",
    "content": "// +build !linux\n\npackage fuse\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\nfunc unmount(dir string) error {\n\terr := syscall.Unmount(dir, 0)\n\tif err != nil {\n\t\terr = &os.PathError{Op: \"unmount\", Path: dir, Err: err}\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\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"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go",
    "content": "package pipeline\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n)\n\n// The Factory interface represents an object that can create its Policy object. Each HTTP request sent\n// requires that this Factory create a new instance of its Policy object.\ntype Factory interface {\n\tNew(next Policy, po *PolicyOptions) Policy\n}\n\n// FactoryFunc is an adapter that allows the use of an ordinary function as a Factory interface.\ntype FactoryFunc func(next Policy, po *PolicyOptions) PolicyFunc\n\n// New calls f(next,po).\nfunc (f FactoryFunc) New(next Policy, po *PolicyOptions) Policy {\n\treturn f(next, po)\n}\n\n// The Policy interface represents a mutable Policy object created by a Factory. The object can mutate/process\n// the HTTP request and then forward it on to the next Policy object in the linked-list. The returned\n// Response goes backward through the linked-list for additional processing.\n// NOTE: Request is passed by value so changes do not change the caller's version of\n// the request. However, Request has some fields that reference mutable objects (not strings).\n// These references are copied; a deep copy is not performed. Specifically, this means that\n// you should avoid modifying the objects referred to by these fields: URL, Header, Body,\n// GetBody, TransferEncoding, Form, MultipartForm, Trailer, TLS, Cancel, and Response.\ntype Policy interface {\n\tDo(ctx context.Context, request Request) (Response, error)\n}\n\n// PolicyFunc is an adapter that allows the use of an ordinary function as a Policy interface.\ntype PolicyFunc func(ctx context.Context, request Request) (Response, error)\n\n// Do calls f(ctx, request).\nfunc (f PolicyFunc) Do(ctx context.Context, request Request) (Response, error) {\n\treturn f(ctx, request)\n}\n\n// Options configures a Pipeline's behavior.\ntype Options struct {\n\tHTTPSender Factory // If sender is nil, then the pipeline's default client is used to send the HTTP requests.\n\tLog        LogOptions\n}\n\n// LogLevel tells a logger the minimum level to log. When code reports a log entry,\n// the LogLevel indicates the level of the log entry. The logger only records entries\n// whose level is at least the level it was told to log. See the Log* constants.\n// For example, if a logger is configured with LogError, then LogError, LogPanic,\n// and LogFatal entries will be logged; lower level entries are ignored.\ntype LogLevel uint32\n\nconst (\n\t// LogNone tells a logger not to log any entries passed to it.\n\tLogNone LogLevel = iota\n\n\t// LogFatal tells a logger to log all LogFatal entries passed to it.\n\tLogFatal\n\n\t// LogPanic tells a logger to log all LogPanic and LogFatal entries passed to it.\n\tLogPanic\n\n\t// LogError tells a logger to log all LogError, LogPanic and LogFatal entries passed to it.\n\tLogError\n\n\t// LogWarning tells a logger to log all LogWarning, LogError, LogPanic and LogFatal entries passed to it.\n\tLogWarning\n\n\t// LogInfo tells a logger to log all LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.\n\tLogInfo\n\n\t// LogDebug tells a logger to log all LogDebug, LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.\n\tLogDebug\n)\n\n// LogOptions configures the pipeline's logging mechanism & level filtering.\ntype LogOptions struct {\n\tLog func(level LogLevel, message string)\n\n\t// ShouldLog is called periodically allowing you to return whether the specified LogLevel should be logged or not.\n\t// An application can return different values over the its lifetime; this allows the application to dynamically\n\t// alter what is logged. NOTE: This method can be called by multiple goroutines simultaneously so make sure\n\t// you implement it in a goroutine-safe way. If nil, nothing is logged (the equivalent of returning LogNone).\n\t// Usually, the function will be implemented simply like this: return level <= LogWarning\n\tShouldLog func(level LogLevel) bool\n}\n\ntype pipeline struct {\n\tfactories []Factory\n\toptions   Options\n}\n\n// The Pipeline interface represents an ordered list of Factory objects and an object implementing the HTTPSender interface.\n// You construct a Pipeline by calling the pipeline.NewPipeline function. To send an HTTP request, call pipeline.NewRequest\n// and then call Pipeline's Do method passing a context, the request, and a method-specific Factory (or nil). Passing a\n// method-specific Factory allows this one call to Do to inject a Policy into the linked-list. The policy is injected where\n// the MethodFactoryMarker (see the pipeline.MethodFactoryMarker function) is in the slice of Factory objects.\n//\n// When Do is called, the Pipeline object asks each Factory object to construct its Policy object and adds each Policy to a linked-list.\n// THen, Do sends the Context and Request through all the Policy objects. The final Policy object sends the request over the network\n// (via the HTTPSender object passed to NewPipeline) and the response is returned backwards through all the Policy objects.\n// Since Pipeline and Factory objects are goroutine-safe, you typically create 1 Pipeline object and reuse it to make many HTTP requests.\ntype Pipeline interface {\n\tDo(ctx context.Context, methodFactory Factory, request Request) (Response, error)\n}\n\n// NewPipeline creates a new goroutine-safe Pipeline object from the slice of Factory objects and the specified options.\nfunc NewPipeline(factories []Factory, o Options) Pipeline {\n\tif o.HTTPSender == nil {\n\t\to.HTTPSender = newDefaultHTTPClientFactory()\n\t}\n\tif o.Log.Log == nil {\n\t\to.Log.Log = func(LogLevel, string) {} // No-op logger\n\t}\n\treturn &pipeline{factories: factories, options: o}\n}\n\n// Do is called for each and every HTTP request. It tells each Factory to create its own (mutable) Policy object\n// replacing a MethodFactoryMarker factory (if it exists) with the methodFactory passed in. Then, the Context and Request\n// are sent through the pipeline of Policy objects (which can transform the Request's URL/query parameters/headers) and\n// ultimately sends the transformed HTTP request over the network.\nfunc (p *pipeline) Do(ctx context.Context, methodFactory Factory, request Request) (Response, error) {\n\tresponse, err := p.newPolicies(methodFactory).Do(ctx, request)\n\trequest.close()\n\treturn response, err\n}\n\nfunc (p *pipeline) newPolicies(methodFactory Factory) Policy {\n\t// The last Policy is the one that actually sends the request over the wire and gets the response.\n\t// It is overridable via the Options' HTTPSender field.\n\tpo := &PolicyOptions{pipeline: p} // One object shared by all policy objects\n\tnext := p.options.HTTPSender.New(nil, po)\n\n\t// Walk over the slice of Factory objects in reverse (from wire to API)\n\tmarkers := 0\n\tfor i := len(p.factories) - 1; i >= 0; i-- {\n\t\tfactory := p.factories[i]\n\t\tif _, ok := factory.(methodFactoryMarker); ok {\n\t\t\tmarkers++\n\t\t\tif markers > 1 {\n\t\t\t\tpanic(\"MethodFactoryMarker can only appear once in the pipeline\")\n\t\t\t}\n\t\t\tif methodFactory != nil {\n\t\t\t\t// Replace MethodFactoryMarker with passed-in methodFactory\n\t\t\t\tnext = methodFactory.New(next, po)\n\t\t\t}\n\t\t} else {\n\t\t\t// Use the slice's Factory to construct its Policy\n\t\t\tnext = factory.New(next, po)\n\t\t}\n\t}\n\n\t// Each Factory has created its Policy\n\tif markers == 0 && methodFactory != nil {\n\t\tpanic(\"Non-nil methodFactory requires MethodFactoryMarker in the pipeline\")\n\t}\n\treturn next // Return head of the Policy object linked-list\n}\n\n// A PolicyOptions represents optional information that can be used by a node in the\n// linked-list of Policy objects. A PolicyOptions is passed to the Factory's New method\n// which passes it (if desired) to the Policy object it creates. Today, the Policy object\n// uses the options to perform logging. But, in the future, this could be used for more.\ntype PolicyOptions struct {\n\tpipeline *pipeline\n}\n\n// ShouldLog returns true if the specified log level should be logged.\nfunc (po *PolicyOptions) ShouldLog(level LogLevel) bool {\n\tif po.pipeline.options.Log.ShouldLog != nil {\n\t\treturn po.pipeline.options.Log.ShouldLog(level)\n\t}\n\treturn false\n}\n\n// Log logs a string to the Pipeline's Logger.\nfunc (po *PolicyOptions) Log(level LogLevel, msg string) {\n\tif !po.ShouldLog(level) {\n\t\treturn // Short circuit message formatting if we're not logging it\n\t}\n\n\t// We are logging it, ensure trailing newline\n\tif len(msg) == 0 || msg[len(msg)-1] != '\\n' {\n\t\tmsg += \"\\n\" // Ensure trailing newline\n\t}\n\tpo.pipeline.options.Log.Log(level, msg)\n\n\t// If logger doesn't handle fatal/panic, we'll do it here.\n\tif level == LogFatal {\n\t\tos.Exit(1)\n\t} else if level == LogPanic {\n\t\tpanic(msg)\n\t}\n}\n\nvar pipelineHTTPClient = newDefaultHTTPClient()\n\nfunc newDefaultHTTPClient() *http.Client {\n\t// We want the Transport to have a large connection pool\n\treturn &http.Client{\n\t\tTransport: &http.Transport{\n\t\t\tProxy: http.ProxyFromEnvironment,\n\t\t\t// We use Dial instead of DialContext as DialContext has been reported to cause slower performance.\n\t\t\tDial /*Context*/ : (&net.Dialer{\n\t\t\t\tTimeout:   30 * time.Second,\n\t\t\t\tKeepAlive: 30 * time.Second,\n\t\t\t\tDualStack: true,\n\t\t\t}).Dial, /*Context*/\n\t\t\tMaxIdleConns:           0, // No limit\n\t\t\tMaxIdleConnsPerHost:    100,\n\t\t\tIdleConnTimeout:        90 * time.Second,\n\t\t\tTLSHandshakeTimeout:    10 * time.Second,\n\t\t\tExpectContinueTimeout:  1 * time.Second,\n\t\t\tDisableKeepAlives:      false,\n\t\t\tDisableCompression:     false,\n\t\t\tMaxResponseHeaderBytes: 0,\n\t\t\t//ResponseHeaderTimeout:  time.Duration{},\n\t\t\t//ExpectContinueTimeout:  time.Duration{},\n\t\t},\n\t}\n}\n\n// newDefaultHTTPClientFactory creates a DefaultHTTPClientPolicyFactory object that sends HTTP requests to a Go's default http.Client.\nfunc newDefaultHTTPClientFactory() Factory {\n\treturn FactoryFunc(func(next Policy, po *PolicyOptions) PolicyFunc {\n\t\treturn func(ctx context.Context, request Request) (Response, error) {\n\t\t\tr, err := pipelineHTTPClient.Do(request.WithContext(ctx))\n\t\t\tif err != nil {\n\t\t\t\terr = NewError(err, \"HTTP request failed\")\n\t\t\t}\n\t\t\treturn NewHTTPResponse(r), err\n\t\t}\n\t})\n}\n\nvar mfm = methodFactoryMarker{} // Singleton\n\n// MethodFactoryMarker returns a special marker Factory object. When Pipeline's Do method is called, any\n// MethodMarkerFactory object is replaced with the specified methodFactory object. If nil is passed fro Do's\n// methodFactory parameter, then the MethodFactoryMarker is ignored as the linked-list of Policy objects is created.\nfunc MethodFactoryMarker() Factory {\n\treturn mfm\n}\n\ntype methodFactoryMarker struct {\n}\n\nfunc (methodFactoryMarker) New(next Policy, po *PolicyOptions) Policy {\n\tpanic(\"methodFactoryMarker policy should have been replaced with a method policy\")\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go",
    "content": "// +build !windows,!nacl,!plan9\n\npackage pipeline\n\nimport (\n\t\"log\"\n\t\"log/syslog\"\n)\n\n// ForceLog should rarely be used. It forceable logs an entry to the\n// Windows Event Log (on Windows) or to the SysLog (on Linux)\nfunc ForceLog(level LogLevel, msg string) {\n\tif defaultLogger == nil {\n\t\treturn // Return fast if we failed to create the logger.\n\t}\n\t// We are logging it, ensure trailing newline\n\tif len(msg) == 0 || msg[len(msg)-1] != '\\n' {\n\t\tmsg += \"\\n\" // Ensure trailing newline\n\t}\n\tswitch level {\n\tcase LogFatal:\n\t\tdefaultLogger.Fatal(msg)\n\tcase LogPanic:\n\t\tdefaultLogger.Panic(msg)\n\tcase LogError, LogWarning, LogInfo:\n\t\tdefaultLogger.Print(msg)\n\t}\n}\n\nvar defaultLogger = func() *log.Logger {\n\tl, _ := syslog.NewLogger(syslog.LOG_USER|syslog.LOG_WARNING, log.LstdFlags)\n\treturn l\n}()\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go",
    "content": "package pipeline\n\nimport (\n\t\"os\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n// ForceLog should rarely be used. It forceable logs an entry to the\n// Windows Event Log (on Windows) or to the SysLog (on Linux)\nfunc ForceLog(level LogLevel, msg string) {\n\tvar el eventType\n\tswitch level {\n\tcase LogError, LogFatal, LogPanic:\n\t\tel = elError\n\tcase LogWarning:\n\t\tel = elWarning\n\tcase LogInfo:\n\t\tel = elInfo\n\t}\n\t// We are logging it, ensure trailing newline\n\tif len(msg) == 0 || msg[len(msg)-1] != '\\n' {\n\t\tmsg += \"\\n\" // Ensure trailing newline\n\t}\n\treportEvent(el, 0, msg)\n}\n\ntype eventType int16\n\nconst (\n\telSuccess eventType = 0\n\telError   eventType = 1\n\telWarning eventType = 2\n\telInfo    eventType = 4\n)\n\nvar reportEvent = func() func(eventType eventType, eventID int32, msg string) {\n\tadvAPI32 := syscall.MustLoadDLL(\"AdvAPI32.dll\")\n\tregisterEventSource := advAPI32.MustFindProc(\"RegisterEventSourceW\")\n\n\tsourceName, _ := os.Executable()\n\tsourceNameUTF16, _ := syscall.UTF16PtrFromString(sourceName)\n\thandle, _, lastErr := registerEventSource.Call(uintptr(0), uintptr(unsafe.Pointer(sourceNameUTF16)))\n\tif lastErr == nil { // On error, logging is a no-op\n\t\treturn func(eventType eventType, eventID int32, msg string) {}\n\t}\n\treportEvent := advAPI32.MustFindProc(\"ReportEventW\")\n\treturn func(eventType eventType, eventID int32, msg string) {\n\t\ts, _ := syscall.UTF16PtrFromString(msg)\n\t\t_, _, _ = reportEvent.Call(\n\t\t\tuintptr(handle),             // HANDLE  hEventLog\n\t\t\tuintptr(eventType),          // WORD    wType\n\t\t\tuintptr(0),                  // WORD    wCategory\n\t\t\tuintptr(eventID),            // DWORD   dwEventID\n\t\t\tuintptr(0),                  // PSID    lpUserSid\n\t\t\tuintptr(1),                  // WORD    wNumStrings\n\t\t\tuintptr(0),                  // DWORD   dwDataSize\n\t\t\tuintptr(unsafe.Pointer(&s)), // LPCTSTR *lpStrings\n\t\t\tuintptr(0))                  // LPVOID  lpRawData\n\t}\n}()\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/doc.go",
    "content": "// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n/*\nPackage pipeline implements an HTTP request/response middleware pipeline whose\npolicy objects mutate an HTTP request's URL, query parameters, and/or headers before\nthe request is sent over the wire.\n\nNot all policy objects mutate an HTTP request; some policy objects simply impact the\nflow of requests/responses by performing operations such as logging, retry policies,\ntimeouts, failure injection, and deserialization of response payloads.\n\nImplementing the Policy Interface\n\nTo implement a policy, define a struct that implements the pipeline.Policy interface's Do method. Your Do\nmethod is called when an HTTP request wants to be sent over the network. Your Do method can perform any\noperation(s) it desires. For example, it can log the outgoing request, mutate the URL, headers, and/or query\nparameters, inject a failure, etc. Your Do method must then forward the HTTP request to next Policy object\nin a linked-list ensuring that the remaining Policy objects perform their work. Ultimately, the last Policy\nobject sends the HTTP request over the network (by calling the HTTPSender's Do method).\n\nWhen an HTTP response comes back, each Policy object in the linked-list gets a chance to process the response\n(in reverse order). The Policy object can log the response, retry the operation if due to a transient failure\nor timeout, deserialize the response body, etc. Ultimately, the last Policy object returns the HTTP response\nto the code that initiated the original HTTP request.\n\nHere is a template for how to define a pipeline.Policy object:\n\n   type myPolicy struct {\n      node   PolicyNode\n      // TODO: Add configuration/setting fields here (if desired)...\n   }\n\n   func (p *myPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {\n      // TODO: Mutate/process the HTTP request here...\n      response, err := p.node.Do(ctx, request)\t// Forward HTTP request to next Policy & get HTTP response\n      // TODO: Mutate/process the HTTP response here...\n      return response, err\t// Return response/error to previous Policy\n   }\n\nImplementing the Factory Interface\n\nEach Policy struct definition requires a factory struct definition that implements the pipeline.Factory interface's New\nmethod. The New method is called when application code wants to initiate a new HTTP request. Factory's New method is\npassed a pipeline.PolicyNode object which contains a reference to the owning pipeline.Pipeline object (discussed later) and\na reference to the next Policy object in the linked list. The New method should create its corresponding Policy object\npassing it the PolicyNode and any other configuration/settings fields appropriate for the specific Policy object.\n\nHere is a template for how to define a pipeline.Policy object:\n\n   // NOTE: Once created & initialized, Factory objects should be goroutine-safe (ex: immutable);\n   // this allows reuse (efficient use of memory) and makes these objects usable by multiple goroutines concurrently.\n   type myPolicyFactory struct {\n      // TODO: Add any configuration/setting fields if desired...\n   }\n\n   func (f *myPolicyFactory) New(node pipeline.PolicyNode) Policy {\n      return &myPolicy{node: node} // TODO: Also initialize any configuration/setting fields here (if desired)...\n   }\n\nUsing your Factory and Policy objects via a Pipeline\n\nTo use the Factory and Policy objects, an application constructs a slice of Factory objects and passes\nthis slice to the pipeline.NewPipeline function.\n\n   func NewPipeline(factories []pipeline.Factory, sender pipeline.HTTPSender) Pipeline\n\nThis function also requires an object implementing the HTTPSender interface. For simple scenarios,\npassing nil for HTTPSender causes a standard Go http.Client object to be created and used to actually\nsend the HTTP response over the network. For more advanced scenarios, you can pass your own HTTPSender\nobject in. This allows sharing of http.Client objects or the use of custom-configured http.Client objects\nor other objects that can simulate the network requests for testing purposes.\n\nNow that you have a pipeline.Pipeline object, you can create a pipeline.Request object (which is a simple\nwrapper around Go's standard http.Request object) and pass it to Pipeline's Do method along with passing a\ncontext.Context for cancelling the HTTP request (if desired).\n\n   type Pipeline interface {\n      Do(ctx context.Context, methodFactory pipeline.Factory, request pipeline.Request) (pipeline.Response, error)\n   }\n\nDo iterates over the slice of Factory objects and tells each one to create its corresponding\nPolicy object. After the linked-list of Policy objects have been created, Do calls the first\nPolicy object passing it the Context & HTTP request parameters. These parameters now flow through\nall the Policy objects giving each object a chance to look at and/or mutate the HTTP request.\nThe last Policy object sends the message over the network.\n\nWhen the network operation completes, the HTTP response and error return values pass\nback through the same Policy objects in reverse order. Most Policy objects ignore the\nresponse/error but some log the result, retry the operation (depending on the exact\nreason the operation failed), or deserialize the response's body. Your own Policy\nobjects can do whatever they like when processing outgoing requests or incoming responses.\n\nNote that after an I/O request runs to completion, the Policy objects for that request\nare garbage collected. However, Pipeline object (like Factory objects) are goroutine-safe allowing\nthem to be created once and reused over many I/O operations. This allows for efficient use of\nmemory and also makes them safely usable by multiple goroutines concurrently.\n\nInserting a Method-Specific Factory into the Linked-List of Policy Objects\n\nWhile Pipeline and Factory objects can be reused over many different operations, it is\ncommon to have special behavior for a specific operation/method. For example, a method\nmay need to deserialize the response's body to an instance of a specific data type.\nTo accommodate this, the Pipeline's Do method takes an additional method-specific\nFactory object. The Do method tells this Factory to create a Policy object and\ninjects this method-specific Policy object into the linked-list of Policy objects.\n\nWhen creating a Pipeline object, the slice of Factory objects passed must have 1\n(and only 1) entry marking where the method-specific Factory should be injected.\nThe Factory marker is obtained by calling the pipeline.MethodFactoryMarker() function:\n\n   func MethodFactoryMarker() pipeline.Factory\n\nCreating an HTTP Request Object\n\nThe HTTP request object passed to Pipeline's Do method is not Go's http.Request struct.\nInstead, it is a pipeline.Request struct which is a simple wrapper around Go's standard\nhttp.Request. You create a pipeline.Request object by calling the pipeline.NewRequest function:\n\n   func NewRequest(method string, url url.URL, options pipeline.RequestOptions) (request pipeline.Request, err error)\n\nTo this function, you must pass a pipeline.RequestOptions that looks like this:\n\n   type RequestOptions struct {\n      // The readable and seekable stream to be sent to the server as the request's body.\n      Body io.ReadSeeker\n\n      // The callback method (if not nil) to be invoked to report progress as the stream is uploaded in the HTTP request.\n      Progress ProgressReceiver\n   }\n\nThe method and struct ensure that the request's body stream is a read/seekable stream.\nA seekable stream is required so that upon retry, the final Policy object can seek\nthe stream back to the beginning before retrying the network request and re-uploading the\nbody. In addition, you can associate a ProgressReceiver callback function which will be\ninvoked periodically to report progress while bytes are being read from the body stream\nand sent over the network.\n\nProcessing the HTTP Response\n\nWhen an HTTP response comes in from the network, a reference to Go's http.Response struct is\nembedded in a struct that implements the pipeline.Response interface:\n\n   type Response interface {\n      Response() *http.Response\n   }\n\nThis interface is returned through all the Policy objects. Each Policy object can call the Response\ninterface's Response method to examine (or mutate) the embedded http.Response object.\n\nA Policy object can internally define another struct (implementing the pipeline.Response interface)\nthat embeds an http.Response and adds additional fields and return this structure to other Policy\nobjects. This allows a Policy object to deserialize the body to some other struct and return the\noriginal http.Response and the additional struct back through the Policy chain. Other Policy objects\ncan see the Response but cannot see the additional struct with the deserialized body. After all the\nPolicy objects have returned, the pipeline.Response interface is returned by Pipeline's Do method.\nThe caller of this method can perform a type assertion attempting to get back to the struct type\nreally returned by the Policy object. If the type assertion is successful, the caller now has\naccess to both the http.Response and the deserialized struct object.*/\npackage pipeline\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go",
    "content": "package pipeline\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n)\n\ntype causer interface {\n\tCause() error\n}\n\n// ErrorNode can be an embedded field in a private error object. This field\n// adds Program Counter support and a 'cause' (reference to a preceding error).\n// When initializing a error type with this embedded field, initialize the\n// ErrorNode field by calling ErrorNode{}.Initialize(cause).\ntype ErrorNode struct {\n\tpc    uintptr // Represents a Program Counter that you can get symbols for.\n\tcause error   // Refers to the preceding error (or nil)\n}\n\n// Error returns a string with the PC's symbols or \"\" if the PC is invalid.\n// When defining a new error type, have its Error method call this one passing\n// it the string representation of the error.\nfunc (e *ErrorNode) Error(msg string) string {\n\ts := \"\"\n\tif fn := runtime.FuncForPC(e.pc); fn != nil {\n\t\tfile, line := fn.FileLine(e.pc)\n\t\ts = fmt.Sprintf(\"-> %v, %v:%v\\n\", fn.Name(), file, line)\n\t}\n\ts += msg + \"\\n\\n\"\n\tif e.cause != nil {\n\t\ts += e.cause.Error() + \"\\n\"\n\t}\n\treturn s\n}\n\n// Cause returns the error that preceded this error.\nfunc (e *ErrorNode) Cause() error { return e.cause }\n\n// Temporary returns true if the error occurred due to a temporary condition.\nfunc (e ErrorNode) Temporary() bool {\n\ttype temporary interface {\n\t\tTemporary() bool\n\t}\n\n\tfor err := e.cause; err != nil; {\n\t\tif t, ok := err.(temporary); ok {\n\t\t\treturn t.Temporary()\n\t\t}\n\n\t\tif cause, ok := err.(causer); ok {\n\t\t\terr = cause.Cause()\n\t\t} else {\n\t\t\terr = nil\n\t\t}\n\t}\n\treturn false\n}\n\n// Timeout returns true if the error occurred due to time expiring.\nfunc (e ErrorNode) Timeout() bool {\n\ttype timeout interface {\n\t\tTimeout() bool\n\t}\n\n\tfor err := e.cause; err != nil; {\n\t\tif t, ok := err.(timeout); ok {\n\t\t\treturn t.Timeout()\n\t\t}\n\n\t\tif cause, ok := err.(causer); ok {\n\t\t\terr = cause.Cause()\n\t\t} else {\n\t\t\terr = nil\n\t\t}\n\t}\n\treturn false\n}\n\n// Initialize is used to initialize an embedded ErrorNode field.\n// It captures the caller's program counter and saves the cause (preceding error).\n// To initialize the field, use \"ErrorNode{}.Initialize(cause, 3)\". A callersToSkip\n// value of 3 is very common; but, depending on your code nesting, you may need\n// a different value.\nfunc (ErrorNode) Initialize(cause error, callersToSkip int) ErrorNode {\n\t// Get the PC of Initialize method's caller.\n\tpc := [1]uintptr{}\n\t_ = runtime.Callers(callersToSkip, pc[:])\n\treturn ErrorNode{pc: pc[0], cause: cause}\n}\n\n// Cause walks all the preceding errors and return the originating error.\nfunc Cause(err error) error {\n\tfor err != nil {\n\t\tcause, ok := err.(causer)\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t\terr = cause.Cause()\n\t}\n\treturn err\n}\n\n// NewError creates a simple string error (like Error.New). But, this\n// error also captures the caller's Program Counter and the preceding error.\nfunc NewError(cause error, msg string) error {\n\treturn &pcError{\n\t\tErrorNode: ErrorNode{}.Initialize(cause, 3),\n\t\tmsg:       msg,\n\t}\n}\n\n// pcError is a simple string error (like error.New) with an ErrorNode (PC & cause).\ntype pcError struct {\n\tErrorNode\n\tmsg string\n}\n\n// Error satisfies the error interface. It shows the error with Program Counter\n// symbols and calls Error on the preceding error so you can see the full error chain.\nfunc (e *pcError) Error() string { return e.ErrorNode.Error(e.msg) }\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/progress.go",
    "content": "package pipeline\n\nimport \"io\"\n\n// ********** The following is common between the request body AND the response body.\n\n// ProgressReceiver defines the signature of a callback function invoked as progress is reported.\ntype ProgressReceiver func(bytesTransferred int64)\n\n// ********** The following are specific to the request body (a ReadSeekCloser)\n\n// This struct is used when sending a body to the network\ntype requestBodyProgress struct {\n\trequestBody io.ReadSeeker // Seeking is required to support retries\n\tpr          ProgressReceiver\n}\n\n// NewRequestBodyProgress adds progress reporting to an HTTP request's body stream.\nfunc NewRequestBodyProgress(requestBody io.ReadSeeker, pr ProgressReceiver) io.ReadSeeker {\n\tif pr == nil {\n\t\tpanic(\"pr must not be nil\")\n\t}\n\treturn &requestBodyProgress{requestBody: requestBody, pr: pr}\n}\n\n// Read reads a block of data from an inner stream and reports progress\nfunc (rbp *requestBodyProgress) Read(p []byte) (n int, err error) {\n\tn, err = rbp.requestBody.Read(p)\n\tif err != nil {\n\t\treturn\n\t}\n\t// Invokes the user's callback method to report progress\n\tposition, err := rbp.requestBody.Seek(0, io.SeekCurrent)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\trbp.pr(position)\n\treturn\n}\n\nfunc (rbp *requestBodyProgress) Seek(offset int64, whence int) (offsetFromStart int64, err error) {\n\treturn rbp.requestBody.Seek(offset, whence)\n}\n\n// requestBodyProgress supports Close but the underlying stream may not; if it does, Close will close it.\nfunc (rbp *requestBodyProgress) Close() error {\n\tif c, ok := rbp.requestBody.(io.Closer); ok {\n\t\treturn c.Close()\n\t}\n\treturn nil\n}\n\n// ********** The following are specific to the response body (a ReadCloser)\n\n// This struct is used when sending a body to the network\ntype responseBodyProgress struct {\n\tresponseBody io.ReadCloser\n\tpr           ProgressReceiver\n\toffset       int64\n}\n\n// NewResponseBodyProgress adds progress reporting to an HTTP response's body stream.\nfunc NewResponseBodyProgress(responseBody io.ReadCloser, pr ProgressReceiver) io.ReadCloser {\n\tif pr == nil {\n\t\tpanic(\"pr must not be nil\")\n\t}\n\treturn &responseBodyProgress{responseBody: responseBody, pr: pr, offset: 0}\n}\n\n// Read reads a block of data from an inner stream and reports progress\nfunc (rbp *responseBodyProgress) Read(p []byte) (n int, err error) {\n\tn, err = rbp.responseBody.Read(p)\n\trbp.offset += int64(n)\n\n\t// Invokes the user's callback method to report progress\n\trbp.pr(rbp.offset)\n\treturn\n}\n\nfunc (rbp *responseBodyProgress) Close() error {\n\treturn rbp.responseBody.Close()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/request.go",
    "content": "package pipeline\n\nimport (\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n)\n\n// Request is a thin wrapper over an http.Request. The wrapper provides several helper methods.\ntype Request struct {\n\t*http.Request\n}\n\n// NewRequest initializes a new HTTP request object with any desired options.\nfunc NewRequest(method string, url url.URL, body io.ReadSeeker) (request Request, err error) {\n\t// Note: the url is passed by value so that any pipeline operations that modify it do so on a copy.\n\n\t// This code to construct an http.Request is copied from http.NewRequest(); we intentionally omitted removeEmptyPort for now.\n\trequest.Request = &http.Request{\n\t\tMethod:     method,\n\t\tURL:        &url,\n\t\tProto:      \"HTTP/1.1\",\n\t\tProtoMajor: 1,\n\t\tProtoMinor: 1,\n\t\tHeader:     make(http.Header),\n\t\tHost:       url.Host,\n\t}\n\n\tif body != nil {\n\t\terr = request.SetBody(body)\n\t}\n\treturn\n}\n\n// SetBody sets the body and content length, assumes body is not nil.\nfunc (r Request) SetBody(body io.ReadSeeker) error {\n\tsize, err := body.Seek(0, io.SeekEnd)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbody.Seek(0, io.SeekStart)\n\tr.ContentLength = size\n\tr.Header[\"Content-Length\"] = []string{strconv.FormatInt(size, 10)}\n\n\tif size != 0 {\n\t\tr.Body = &retryableRequestBody{body: body}\n\t\tr.GetBody = func() (io.ReadCloser, error) {\n\t\t\t_, err := body.Seek(0, io.SeekStart)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn r.Body, nil\n\t\t}\n\t} else {\n\t\t// in case the body is an empty stream, we need to use http.NoBody to explicitly provide no content\n\t\tr.Body = http.NoBody\n\t\tr.GetBody = func() (io.ReadCloser, error) {\n\t\t\treturn http.NoBody, nil\n\t\t}\n\n\t\t// close the user-provided empty body\n\t\tif c, ok := body.(io.Closer); ok {\n\t\t\tc.Close()\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Copy makes a copy of an http.Request. Specifically, it makes a deep copy\n// of its Method, URL, Host, Proto(Major/Minor), Header. ContentLength, Close,\n// RemoteAddr, RequestURI. Copy makes a shallow copy of the Body, GetBody, TLS,\n// Cancel, Response, and ctx fields. Copy panics if any of these fields are\n// not nil: TransferEncoding, Form, PostForm, MultipartForm, or Trailer.\nfunc (r Request) Copy() Request {\n\tif r.TransferEncoding != nil || r.Form != nil || r.PostForm != nil || r.MultipartForm != nil || r.Trailer != nil {\n\t\tpanic(\"Can't make a deep copy of the http.Request because at least one of the following is not nil:\" +\n\t\t\t\"TransferEncoding, Form, PostForm, MultipartForm, or Trailer.\")\n\t}\n\tcopy := *r.Request          // Copy the request\n\turlCopy := *(r.Request.URL) // Copy the URL\n\tcopy.URL = &urlCopy\n\tcopy.Header = http.Header{} // Copy the header\n\tfor k, vs := range r.Header {\n\t\tfor _, value := range vs {\n\t\t\tcopy.Header.Add(k, value)\n\t\t}\n\t}\n\treturn Request{Request: &copy} // Return the copy\n}\n\nfunc (r Request) close() error {\n\tif r.Body != nil && r.Body != http.NoBody {\n\t\tc, ok := r.Body.(*retryableRequestBody)\n\t\tif !ok {\n\t\t\tpanic(\"unexpected request body type (should be *retryableReadSeekerCloser)\")\n\t\t}\n\t\treturn c.realClose()\n\t}\n\treturn nil\n}\n\n// RewindBody seeks the request's Body stream back to the beginning so it can be resent when retrying an operation.\nfunc (r Request) RewindBody() error {\n\tif r.Body != nil && r.Body != http.NoBody {\n\t\ts, ok := r.Body.(io.Seeker)\n\t\tif !ok {\n\t\t\tpanic(\"unexpected request body type (should be io.Seeker)\")\n\t\t}\n\n\t\t// Reset the stream back to the beginning\n\t\t_, err := s.Seek(0, io.SeekStart)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ********** The following type/methods implement the retryableRequestBody (a ReadSeekCloser)\n\n// This struct is used when sending a body to the network\ntype retryableRequestBody struct {\n\tbody io.ReadSeeker // Seeking is required to support retries\n}\n\n// Read reads a block of data from an inner stream and reports progress\nfunc (b *retryableRequestBody) Read(p []byte) (n int, err error) {\n\treturn b.body.Read(p)\n}\n\nfunc (b *retryableRequestBody) Seek(offset int64, whence int) (offsetFromStart int64, err error) {\n\treturn b.body.Seek(offset, whence)\n}\n\nfunc (b *retryableRequestBody) Close() error {\n\t// We don't want the underlying transport to close the request body on transient failures so this is a nop.\n\t// The pipeline closes the request body upon success.\n\treturn nil\n}\n\nfunc (b *retryableRequestBody) realClose() error {\n\tif c, ok := b.body.(io.Closer); ok {\n\t\treturn c.Close()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/response.go",
    "content": "package pipeline\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sort\"\n\t\"strings\"\n)\n\n// The Response interface exposes an http.Response object as it returns through the pipeline of Policy objects.\n// This ensures that Policy objects have access to the HTTP response. However, the object this interface encapsulates\n// might be a struct with additional fields that is created by a Policy object (typically a method-specific Factory).\n// The method that injected the method-specific Factory gets this returned Response and performs a type assertion\n// to the expected struct and returns the struct to its caller.\ntype Response interface {\n\tResponse() *http.Response\n}\n\n// This is the default struct that has the http.Response.\n// A method can replace this struct with its own struct containing an http.Response\n// field and any other additional fields.\ntype httpResponse struct {\n\tresponse *http.Response\n}\n\n// NewHTTPResponse is typically called by a Policy object to return a Response object.\nfunc NewHTTPResponse(response *http.Response) Response {\n\treturn &httpResponse{response: response}\n}\n\n// This method satisfies the public Response interface's Response method\nfunc (r httpResponse) Response() *http.Response {\n\treturn r.response\n}\n\n// WriteRequestWithResponse appends a formatted HTTP request into a Buffer. If request and/or err are\n// not nil, then these are also written into the Buffer.\nfunc WriteRequestWithResponse(b *bytes.Buffer, request *http.Request, response *http.Response, err error) {\n\t// Write the request into the buffer.\n\tfmt.Fprint(b, \"   \"+request.Method+\" \"+request.URL.String()+\"\\n\")\n\twriteHeader(b, request.Header)\n\tif response != nil {\n\t\tfmt.Fprintln(b, \"   --------------------------------------------------------------------------------\")\n\t\tfmt.Fprint(b, \"   RESPONSE Status: \"+response.Status+\"\\n\")\n\t\twriteHeader(b, response.Header)\n\t}\n\tif err != nil {\n\t\tfmt.Fprintln(b, \"   --------------------------------------------------------------------------------\")\n\t\tfmt.Fprint(b, \"   ERROR:\\n\"+err.Error()+\"\\n\")\n\t}\n}\n\n// formatHeaders appends an HTTP request's or response's header into a Buffer.\nfunc writeHeader(b *bytes.Buffer, header map[string][]string) {\n\tif len(header) == 0 {\n\t\tb.WriteString(\"   (no headers)\\n\")\n\t\treturn\n\t}\n\tkeys := make([]string, 0, len(header))\n\t// Alphabetize the headers\n\tfor k := range header {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Strings(keys)\n\tfor _, k := range keys {\n\t\t// Redact the value of any Authorization header to prevent security information from persisting in logs\n\t\tvalue := interface{}(\"REDACTED\")\n\t\tif !strings.EqualFold(k, \"Authorization\") {\n\t\t\tvalue = header[k]\n\t\t}\n\t\tfmt.Fprintf(b, \"   %s: %+v\\n\", k, value)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go",
    "content": "package pipeline\n\nconst (\n\t// UserAgent is the string to be used in the user agent string when making requests.\n\tUserAgent = \"azure-pipeline-go/\" + Version\n\n\t// Version is the semantic version (see http://semver.org) of the pipeline package.\n\tVersion = \"0.1.0\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/CHANGELOG.md",
    "content": "# CHANGELOG\n\n-----\n\n## `v6.0.0-beta`\n\n| api                            | version            | note                               |\n|:-------------------------------|:-------------------|:-----------------------------------|\n| arm/authorization              | no change          | code refactoring                   |\n| arm/batch                      | no change          | code refactoring                   |\n| arm/compute                    | no change          | code refactoring                   |\n| arm/containerservice           | 2016-03-30         | return                             |\n| arm/datalake-analytics/account | 2015-10-01-preview | new                                |\n| arm/datalake-store/filesystem  | no change          | moved to datalake-store/filesystem |\n| arm/eventhub                   | no change          | code refactoring                   |\n| arm/intune                     | no change          | code refactoring                   |\n| arm/iothub                     | no change          | code refactoring                   |\n| arm/keyvault                   | no change          | code refactoring                   |\n| arm/mediaservices              | no change          | code refactoring                   |\n| arm/network                    | no change          | code refactoring                   |\n| arm/notificationhubs           | no change          | code refactoring                   |\n| arm/redis                      | no change          | code refactoring                   |\n| arm/resources/resources        | no change          | code refactoring                   |\n| arm/resources/links            | 2016-09-01         | new                                |\n| arm/resources/locks            | 2016-09-01         | updated                            |\n| arm/resources/policy           | no change          | code refactoring                   |\n| arm/resources/resources        | 2016-09-01         | updated                            |\n| arm/servermanagement           | 2016-07-01-preview | updated                            |\n| arm/web                        | no change          | code refactoring                   |\n\n- storage: Added blob lease functionality and tests\n\n## `v5.0.0-beta`\n\n| api                           | version             | note             |\n|:------------------------------|:--------------------|:-----------------|\n| arm/network                   | 2016-09-01          | updated          |\n| arm/servermanagement          | 2015-07-01-preview  | new              |\n| arm/eventhub                  | 2015-08-01          | new              |\n| arm/containerservice          | --                  | removed          |\n| arm/resources/subscriptions   | no change           | code refactoring |\n| arm/resources/features        | no change           | code refactoring |\n| arm/resources/resources       | no change           | code refactoring |\n| arm/datalake-store/accounts   | no change           | code refactoring |\n| arm/datalake-store/filesystem | no change           | code refactoring |\n| arm/notificationhubs          | no change           | code refactoring |\n| arm/redis                     | no change           | code refactoring |\n\n- storage: Add more file storage share operations.\n- azure-rest-api-specs/commit/b8cdc2c50a0872fc0039f20c2b6b33aa0c2af4bf\n- Uses go-autorest v7.2.1\n\n## `v4.0.0-beta`\n\n- arm/logic: breaking change in package logic.\n- arm: parameter validation code added in all arm packages.\n- Uses go-autorest v7.2.0.\n\n\n## `v3.2.0-beta`\n\n| api                         | version             | note      |\n|:----------------------------|:--------------------|:----------|\n| arm/mediaservices           | 2015-10-01          | new       |\n| arm/keyvault                | 2015-06-01          | new       |\n| arm/iothub                  | 2016-02-03          | new       |\n| arm/datalake-store          | 2015-12-01          | new       |\n| arm/network                 | 2016-06-01          | updated   |\n| arm/resources/resources     | 2016-07-01          | updated   |\n| arm/resources/policy        | 2016-04-01          | updated   |\n| arm/servicebus              | 2015-08-01          | updated   |\n\n- arm: uses go-autorest version v7.1.0.\n- storage: fix for operating on blobs names containing special characters.\n- storage: add SetBlobProperties(), update BlobProperties response fields.\n- storage: make storage client work correctly with read-only secondary account.\n- storage: add Azure Storage Emulator support.\n\n\n## `v3.1.0-beta`\n\n- Added a new arm/compute/containerservice (2016-03-30) package\n- Reintroduced NewxxClientWithBaseURI method.\n- Uses go-autorest version - v7.0.7.\n\n\n## `v3.0.0-beta`\n\nThis release brings the Go SDK ARM packages up-to-date with Azure ARM Swagger files for most\nservices. Since the underlying [Swagger files](https://github.com/Azure/azure-rest-api-specs)\ncontinue to change substantially, the ARM packages are still in *beta* status.\n\nThe ARM packages now align with the following API versions (*highlighted* packages are new or\nupdated in this release):\n\n| api                         | version             | note      |\n|:----------------------------|:--------------------|:----------|\n| arm/authorization           | 2015-07-01          | no change |\n| arm/intune                  | 2015-01-14-preview  | no change |\n| arm/notificationhubs        | 2014-09-01          | no change |\n| arm/resources/features      | 2015-12-01          | no change |\n| arm/resources/subscriptions | 2015-11-01          | no change |\n| arm/web                     | 2015-08-01          | no change |\n| arm/cdn                     | 2016-04-02          | updated   |\n| arm/compute                 | 2016-03-30          | updated   |\n| arm/dns                     | 2016-04-01          | updated   |\n| arm/logic                   | 2015-08-01-preview  | updated   |\n| arm/network                 | 2016-03-30          | updated   |\n| arm/redis                   | 2016-04-01          | updated   |\n| arm/resources/resources     | 2016-02-01          | updated   |\n| arm/resources/policy        | 2015-10-01-preview  | updated   |\n| arm/resources/locks         | 2015-01-01          | updated (resources/authorization earlier)|\n| arm/scheduler               | 2016-03-01          | updated   |\n| arm/storage                 | 2016-01-01          | updated   |\n| arm/search                  | 2015-02-28          | updated   |\n| arm/batch                   | 2015-12-01          | new       |\n| arm/cognitiveservices       | 2016-02-01-preview  | new       |\n| arm/devtestlabs             | 2016-05-15          | new       |\n| arm/machinelearning         | 2016-05-01-preview  | new       |\n| arm/powerbiembedded         | 2016-01-29          | new       |\n| arm/mobileengagement        | 2014-12-01          | new       |\n| arm/servicebus              | 2014-09-01          | new       |\n| arm/sql                     | 2015-05-01          | new       |\n| arm/trafficmanager          | 2015-11-01          | new       |\n\n\nBelow are some design changes.\n- Removed Api version from method arguments.\n- Removed New...ClientWithBaseURI() method in all clients. BaseURI value is set in client.go.\n- Uses go-autorest version v7.0.6.\n\n\n## `v2.2.0-beta`\n\n- Uses go-autorest version v7.0.5.\n- Update version of pacakges \"jwt-go\" and \"crypto\" in glide.lock.\n\n\n## `v2.1.1-beta`\n\n- arm: Better error messages for long running operation failures (Uses go-autorest version v7.0.4).\n\n\n## `v2.1.0-beta`\n\n- arm: Uses go-autorest v7.0.3 (polling related updates).\n- arm: Cancel channel argument added in long-running calls.\n- storage: Allow caller to provide headers for DeleteBlob methods.\n- storage: Enables connection sharing with http keepalive.\n- storage: Add BlobPrefixes and Delimiter to BlobListResponse\n\n\n## `v2.0.0-beta`\n\n- Uses go-autorest v6.0.0 (Polling and Asynchronous requests related changes).\n\n \n## `v0.5.0-beta`\n\nUpdated following packages to new API versions:\n- arm/resources/features 2015-12-01\n- arm/resources/resources 2015-11-01\n- arm/resources/subscriptions 2015-11-01\n\n\n### Changes \n\n - SDK now uses go-autorest v3.0.0.\n\n\n\n## `v0.4.0-beta`\n\nThis release brings the Go SDK ARM packages up-to-date with Azure ARM Swagger files for most\nservices. Since the underlying [Swagger files](https://github.com/Azure/azure-rest-api-specs)\ncontinue to change substantially, the ARM packages are still in *beta* status.\n\nThe ARM packages now align with the following API versions (*highlighted* packages are new or\nupdated in this release):\n\n- *arm/authorization 2015-07-01*\n- *arm/cdn 2015-06-01*\n- arm/compute 2015-06-15\n- arm/dns 2015-05-04-preview\n- *arm/intune 2015-01-14-preview*\n- arm/logic 2015-02-01-preview\n- *arm/network 2015-06-15*\n- *arm/notificationhubs 2014-09-01*\n- arm/redis 2015-08-01\n- *arm/resources/authorization 2015-01-01*\n- *arm/resources/features 2014-08-01-preview*\n- *arm/resources/resources 2014-04-01-preview*\n- *arm/resources/subscriptions 2014-04-01-preview*\n- *arm/scheduler 2016-01-01*\n- arm/storage 2015-06-15\n- arm/web 2015-08-01\n\n### Changes\n\n- Moved the arm/authorization, arm/features, arm/resources, and arm/subscriptions packages under a new, resources, package (to reflect the corresponding Swagger structure)\n- Added a new arm/authoriation (2015-07-01) package\n- Added a new arm/cdn (2015-06-01) package\n- Added a new arm/intune (2015-01-14-preview) package\n- Udated arm/network (2015-06-01)\n- Added a new arm/notificationhubs (2014-09-01) package\n- Updated arm/scheduler (2016-01-01) package\n\n\n-----\n\n## `v0.3.0-beta`\n\n- Corrected unintentional struct field renaming and client renaming in v0.2.0-beta\n\n-----\n\n## `v0.2.0-beta`\n\n- Added support for DNS, Redis, and Web site services\n- Updated Storage service to API version 2015-06-15\n- Updated Network to include routing table support\n- Address https://github.com/Azure/azure-sdk-for-go/issues/232\n- Address https://github.com/Azure/azure-sdk-for-go/issues/231\n- Address https://github.com/Azure/azure-sdk-for-go/issues/230\n- Address https://github.com/Azure/azure-sdk-for-go/issues/224\n- Address https://github.com/Azure/azure-sdk-for-go/issues/184\n- Address https://github.com/Azure/azure-sdk-for-go/issues/183\n\n------\n\n## `v0.1.1-beta`\n\n- Improves the UserAgent string to disambiguate arm packages from others in the SDK\n- Improves setting the http.Response into generated results (reduces likelihood of a nil reference)\n- Adds gofmt, golint, and govet to Travis CI for the arm packages\n\n##### Fixed Issues\n\n- https://github.com/Azure/azure-sdk-for-go/issues/196\n- https://github.com/Azure/azure-sdk-for-go/issues/213\n\n------\n\n## v0.1.0-beta\n\nThis release addresses the issues raised against the alpha release and adds more features. Most\nnotably, to address the challenges of encoding JSON\n(see the [comments](https://github.com/Azure/go-autorest#handling-empty-values) in the\n[go-autorest](https://github.com/Azure/go-autorest) package) by using pointers for *all* structure\nfields (with the exception of enumerations). The\n[go-autorest/autorest/to](https://github.com/Azure/go-autorest/tree/master/autorest/to) package\nprovides helpers to convert to / from pointers. The examples demonstrate their usage.\n\nAdditionally, the packages now align with Go coding standards and pass both `golint` and `govet`.\nAccomplishing this required renaming various fields and parameters (such as changing Url to URL).\n\n##### Changes\n\n- Changed request / response structures to use pointer fields.\n- Changed methods to return `error` instead of `autorest.Error`.\n- Re-divided methods to ease asynchronous requests.\n- Added paged results support.\n- Added a UserAgent string.\n- Added changes necessary to pass golint and govet.\n- Updated README.md with details on asynchronous requests and paging.\n- Saved package dependencies through Godep (for the entire SDK).\n\n##### Fixed Issues:\n\n- https://github.com/Azure/azure-sdk-for-go/issues/205\n- https://github.com/Azure/azure-sdk-for-go/issues/206\n- https://github.com/Azure/azure-sdk-for-go/issues/211\n- https://github.com/Azure/azure-sdk-for-go/issues/212\n\n-----\n\n## v0.1.0-alpha\n\nThis release introduces the Azure Resource Manager packages generated from the corresponding\n[Swagger API](http://swagger.io) [definitions](https://github.com/Azure/azure-rest-api-specs)."
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2016 Microsoft Corporation\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/README.md",
    "content": "# Microsoft Azure SDK for Go\n\nThis project provides various Go packages to perform operations\non Microsoft Azure REST APIs.\n\n[![GoDoc](https://godoc.org/github.com/Azure/azure-sdk-for-go?status.svg)](https://godoc.org/github.com/Azure/azure-sdk-for-go) [![Build Status](https://travis-ci.org/Azure/azure-sdk-for-go.svg?branch=master)](https://travis-ci.org/Azure/azure-sdk-for-go)\n\n> **NOTE:** This repository is under heavy ongoing development and\nis likely to break over time. We currently do not have any releases\nyet. If you are planning to use the repository, please consider vendoring\nthe packages in your project and update them when a stable tag is out.\n\n# Packages\n\n## Azure Resource Manager (ARM)\n\n[About ARM](/arm/README.md)\n\n- [authorization](/arm/authorization)\n- [batch](/arm/batch)\n- [cdn](/arm/cdn)\n- [cognitiveservices](/arm/cognitiveservices)\n- [compute](/arm/compute)\n- [containerservice](/arm/containerservice)\n- [datalake-store](/arm/datalake-store)\n- [devtestlabs](/arm/devtestlabs)\n- [dns](/arm/dns)\n- [intune](/arm/intune)\n- [iothub](/arm/iothub)\n- [keyvault](/arm/keyvault)\n- [logic](/arm/logic)\n- [machinelearning](/arm/machinelearning)\n- [mediaservices](/arm/mediaservices)\n- [mobileengagement](/arm/mobileengagement)\n- [network](/arm/network)\n- [notificationhubs](/arm/notificationhubs)\n- [powerbiembedded](/arm/powerbiembedded)\n- [redis](/arm/redis)\n- [resources](/arm/resources)\n- [scheduler](/arm/scheduler)\n- [search](/arm/search)\n- [servicebus](/arm/servicebus)\n- [sql](/arm/sql)\n- [storage](/arm/storage)\n- [trafficmanager](/arm/trafficmanager)\n- [web](/arm/web)\n\n## Azure Service Management (ASM), aka classic deployment\n\n[About ASM](/management/README.md)\n\n- [affinitygroup](/management/affinitygroup)\n- [hostedservice](/management/hostedservice)\n- [location](/management/location)\n- [networksecuritygroup](/management/networksecuritygroup)\n- [osimage](/management/osimage)\n- [sql](/management/sql)\n- [storageservice](/management/storageservice)\n- [virtualmachine](/management/virtualmachine)\n- [virtualmachinedisk](/management/virtualmachinedisk)\n- [virtualmachineimage](/management/virtualmachineimage)\n- [virtualnetwork](/management/virtualnetwork)\n- [vmutils](/management/vmutils)\n\n## Azure Storage SDK for Go\n\n[About Storage](/storage/README.md)\n\n- [storage](/storage)\n\n# Installation\n\n- [Install Go 1.7](https://golang.org/dl/).\n\n- Go get the SDK:\n\n```\n$ go get -d github.com/Azure/azure-sdk-for-go\n```\n\n> **IMPORTANT:** We highly suggest vendoring Azure SDK for Go as a dependency. For vendoring dependencies, Azure SDK for Go uses [glide](https://github.com/Masterminds/glide). If you haven't already, install glide. Navigate to your project directory and install the dependencies.\n\n```\n$ cd your/project\n$ glide create\n$ glide install\n```\n\n# Documentation\n\nRead the Godoc of the repository at [Godoc.org](http://godoc.org/github.com/Azure/azure-sdk-for-go/).\n\n# Contribute\n\nIf you would like to become an active contributor to this project please follow the instructions provided in [Microsoft Azure Projects Contribution Guidelines](http://azure.github.io/guidelines/).\n\n# License\n\nThis project is published under [Apache 2.0 License](LICENSE).\n\n-----\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-sdk-for-go/glide.yaml",
    "content": "package: github.com/Azure/azure-sdk-for-go\nimport:\n- package: github.com/Azure/go-autorest\n  subpackages:\n  - /autorest\n  - autorest/azure\n  - autorest/date\n  - autorest/to\n- package: golang.org/x/crypto\n  subpackages:\n  - /pkcs12\n- package: gopkg.in/check.v1"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/access_conditions.go",
    "content": "package azblob\n\nimport (\n\t\"time\"\n)\n\n// HTTPAccessConditions identifies standard HTTP access conditions which you optionally set.\ntype HTTPAccessConditions struct {\n\tIfModifiedSince   time.Time\n\tIfUnmodifiedSince time.Time\n\tIfMatch           ETag\n\tIfNoneMatch       ETag\n}\n\n// pointers is for internal infrastructure. It returns the fields as pointers.\nfunc (ac HTTPAccessConditions) pointers() (ims *time.Time, ius *time.Time, ime *ETag, inme *ETag) {\n\tif !ac.IfModifiedSince.IsZero() {\n\t\tims = &ac.IfModifiedSince\n\t}\n\tif !ac.IfUnmodifiedSince.IsZero() {\n\t\tius = &ac.IfUnmodifiedSince\n\t}\n\tif ac.IfMatch != ETagNone {\n\t\time = &ac.IfMatch\n\t}\n\tif ac.IfNoneMatch != ETagNone {\n\t\tinme = &ac.IfNoneMatch\n\t}\n\treturn\n}\n\n// ContainerAccessConditions identifies container-specific access conditions which you optionally set.\ntype ContainerAccessConditions struct {\n\tHTTPAccessConditions\n\tLeaseAccessConditions\n}\n\n// BlobAccessConditions identifies blob-specific access conditions which you optionally set.\ntype BlobAccessConditions struct {\n\tHTTPAccessConditions\n\tLeaseAccessConditions\n\tAppendBlobAccessConditions\n\tPageBlobAccessConditions\n}\n\n// LeaseAccessConditions identifies lease access conditions for a container or blob which you optionally set.\ntype LeaseAccessConditions struct {\n\tLeaseID string\n}\n\n// pointers is for internal infrastructure. It returns the fields as pointers.\nfunc (ac LeaseAccessConditions) pointers() (leaseID *string) {\n\tif ac.LeaseID != \"\" {\n\t\tleaseID = &ac.LeaseID\n\t}\n\treturn\n}\n\n/*\n// getInt32 is for internal infrastructure. It is used with access condition values where\n// 0 (the default setting) is meaningful. The library interprets 0 as do not send the header\n// and the privately-storage field in the access condition object is stored as +1 higher than desired.\n// THis method returns true, if the value is > 0 (explicitly set) and the stored value - 1 (the set desired value).\nfunc getInt32(value int32) (bool, int32) {\n\treturn value > 0, value - 1\n}\n*/\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/atomicmorph.go",
    "content": "package azblob\n\nimport \"sync/atomic\"\n\n// AtomicMorpherInt32 identifies a method passed to and invoked by the AtomicMorphInt32 function.\n// The AtomicMorpher callback is passed a startValue and based on this value it returns\n// what the new value should be and the result that AtomicMorph should return to its caller.\ntype AtomicMorpherInt32 func(startVal int32) (val int32, morphResult interface{})\n\n// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function.\nfunc AtomicMorphInt32(target *int32, morpher AtomicMorpherInt32) interface{} {\n\tif target == nil || morpher == nil {\n\t\tpanic(\"target and morpher mut not be nil\")\n\t}\n\tfor {\n\t\tcurrentVal := atomic.LoadInt32(target)\n\t\tdesiredVal, morphResult := morpher(currentVal)\n\t\tif atomic.CompareAndSwapInt32(target, currentVal, desiredVal) {\n\t\t\treturn morphResult\n\t\t}\n\t}\n}\n\n// AtomicMorpherUint32 identifies a method passed to and invoked by the AtomicMorph function.\n// The AtomicMorpher callback is passed a startValue and based on this value it returns\n// what the new value should be and the result that AtomicMorph should return to its caller.\ntype AtomicMorpherUint32 func(startVal uint32) (val uint32, morphResult interface{})\n\n// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function.\nfunc AtomicMorphUint32(target *uint32, morpher AtomicMorpherUint32) interface{} {\n\tif target == nil || morpher == nil {\n\t\tpanic(\"target and morpher mut not be nil\")\n\t}\n\tfor {\n\t\tcurrentVal := atomic.LoadUint32(target)\n\t\tdesiredVal, morphResult := morpher(currentVal)\n\t\tif atomic.CompareAndSwapUint32(target, currentVal, desiredVal) {\n\t\t\treturn morphResult\n\t\t}\n\t}\n}\n\n// AtomicMorpherUint64 identifies a method passed to and invoked by the AtomicMorphUint64 function.\n// The AtomicMorpher callback is passed a startValue and based on this value it returns\n// what the new value should be and the result that AtomicMorph should return to its caller.\ntype AtomicMorpherInt64 func(startVal int64) (val int64, morphResult interface{})\n\n// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function.\nfunc AtomicMorphInt64(target *int64, morpher AtomicMorpherInt64) interface{} {\n\tif target == nil || morpher == nil {\n\t\tpanic(\"target and morpher mut not be nil\")\n\t}\n\tfor {\n\t\tcurrentVal := atomic.LoadInt64(target)\n\t\tdesiredVal, morphResult := morpher(currentVal)\n\t\tif atomic.CompareAndSwapInt64(target, currentVal, desiredVal) {\n\t\t\treturn morphResult\n\t\t}\n\t}\n}\n\n// AtomicMorpherUint64 identifies a method passed to and invoked by the AtomicMorphUint64 function.\n// The AtomicMorpher callback is passed a startValue and based on this value it returns\n// what the new value should be and the result that AtomicMorph should return to its caller.\ntype AtomicMorpherUint64 func(startVal uint64) (val uint64, morphResult interface{})\n\n// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function.\nfunc AtomicMorphUint64(target *uint64, morpher AtomicMorpherUint64) interface{} {\n\tif target == nil || morpher == nil {\n\t\tpanic(\"target and morpher mut not be nil\")\n\t}\n\tfor {\n\t\tcurrentVal := atomic.LoadUint64(target)\n\t\tdesiredVal, morphResult := morpher(currentVal)\n\t\tif atomic.CompareAndSwapUint64(target, currentVal, desiredVal) {\n\t\t\treturn morphResult\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/highlevel.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\n\t\"bytes\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// CommonResponseHeaders returns the headers common to all blob REST API responses.\ntype CommonResponse interface {\n\t// ETag returns the value for header ETag.\n\tETag() ETag\n\n\t// LastModified returns the value for header Last-Modified.\n\tLastModified() time.Time\n\n\t// RequestID returns the value for header x-ms-request-id.\n\tRequestID() string\n\n\t// Date returns the value for header Date.\n\tDate() time.Time\n\n\t// Version returns the value for header x-ms-version.\n\tVersion() string\n\n\t// Response returns the raw HTTP response object.\n\tResponse() *http.Response\n}\n\n// UploadToBlockBlobOptions identifies options used by the UploadBufferToBlockBlob and UploadFileToBlockBlob functions.\ntype UploadToBlockBlobOptions struct {\n\t// BlockSize specifies the block size to use; the default (and maximum size) is BlockBlobMaxStageBlockBytes.\n\tBlockSize int64\n\n\t// Progress is a function that is invoked periodically as bytes are sent to the BlockBlobURL.\n\tProgress pipeline.ProgressReceiver\n\n\t// BlobHTTPHeaders indicates the HTTP headers to be associated with the blob.\n\tBlobHTTPHeaders BlobHTTPHeaders\n\n\t// Metadata indicates the metadata to be associated with the blob when PutBlockList is called.\n\tMetadata Metadata\n\n\t// AccessConditions indicates the access conditions for the block blob.\n\tAccessConditions BlobAccessConditions\n\n\t// Parallelism indicates the maximum number of blocks to upload in parallel (0=default)\n\tParallelism uint16\n}\n\n// UploadBufferToBlockBlob uploads a buffer in blocks to a block blob.\nfunc UploadBufferToBlockBlob(ctx context.Context, b []byte,\n\tblockBlobURL BlockBlobURL, o UploadToBlockBlobOptions) (CommonResponse, error) {\n\n\t// Validate parameters and set defaults\n\tif o.BlockSize < 0 || o.BlockSize > BlockBlobMaxUploadBlobBytes {\n\t\tpanic(fmt.Sprintf(\"BlockSize option must be > 0 and <= %d\", BlockBlobMaxUploadBlobBytes))\n\t}\n\tif o.BlockSize == 0 {\n\t\to.BlockSize = BlockBlobMaxUploadBlobBytes // Default if unspecified\n\t}\n\tsize := int64(len(b))\n\n\tif size <= BlockBlobMaxUploadBlobBytes {\n\t\t// If the size can fit in 1 Upload call, do it this way\n\t\tvar body io.ReadSeeker = bytes.NewReader(b)\n\t\tif o.Progress != nil {\n\t\t\tbody = pipeline.NewRequestBodyProgress(body, o.Progress)\n\t\t}\n\t\treturn blockBlobURL.Upload(ctx, body, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions)\n\t}\n\n\tvar numBlocks = uint16(((size - 1) / o.BlockSize) + 1)\n\tif numBlocks > BlockBlobMaxBlocks {\n\t\tpanic(fmt.Sprintf(\"The buffer's size is too big or the BlockSize is too small; the number of blocks must be <= %d\", BlockBlobMaxBlocks))\n\t}\n\n\tblockIDList := make([]string, numBlocks) // Base-64 encoded block IDs\n\tprogress := int64(0)\n\tprogressLock := &sync.Mutex{}\n\n\terr := doBatchTransfer(ctx, batchTransferOptions{\n\t\toperationName: \"UploadBufferToBlockBlob\",\n\t\ttransferSize:  size,\n\t\tchunkSize:     o.BlockSize,\n\t\tparallelism:   o.Parallelism,\n\t\toperation: func(offset int64, count int64) error {\n\t\t\t// This function is called once per block.\n\t\t\t// It is passed this block's offset within the buffer and its count of bytes\n\t\t\t// Prepare to read the proper block/section of the buffer\n\t\t\tvar body io.ReadSeeker = bytes.NewReader(b[offset : offset+count])\n\t\t\tblockNum := offset / o.BlockSize\n\t\t\tif o.Progress != nil {\n\t\t\t\tblockProgress := int64(0)\n\t\t\t\tbody = pipeline.NewRequestBodyProgress(body,\n\t\t\t\t\tfunc(bytesTransferred int64) {\n\t\t\t\t\t\tdiff := bytesTransferred - blockProgress\n\t\t\t\t\t\tblockProgress = bytesTransferred\n\t\t\t\t\t\tprogressLock.Lock() // 1 goroutine at a time gets a progress report\n\t\t\t\t\t\tprogress += diff\n\t\t\t\t\t\to.Progress(progress)\n\t\t\t\t\t\tprogressLock.Unlock()\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\t// Block IDs are unique values to avoid issue if 2+ clients are uploading blocks\n\t\t\t// at the same time causing PutBlockList to get a mix of blocks from all the clients.\n\t\t\tblockIDList[blockNum] = base64.StdEncoding.EncodeToString(newUUID().bytes())\n\t\t\t_, err := blockBlobURL.StageBlock(ctx, blockIDList[blockNum], body, o.AccessConditions.LeaseAccessConditions)\n\t\t\treturn err\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// All put blocks were successful, call Put Block List to finalize the blob\n\treturn blockBlobURL.CommitBlockList(ctx, blockIDList, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions)\n}\n\n// UploadFileToBlockBlob uploads a file in blocks to a block blob.\nfunc UploadFileToBlockBlob(ctx context.Context, file *os.File,\n\tblockBlobURL BlockBlobURL, o UploadToBlockBlobOptions) (CommonResponse, error) {\n\n\tstat, err := file.Stat()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm := mmf{} // Default to an empty slice; used for 0-size file\n\tif stat.Size() != 0 {\n\t\tm, err = newMMF(file, false, 0, int(stat.Size()))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tdefer m.unmap()\n\t}\n\treturn UploadBufferToBlockBlob(ctx, m, blockBlobURL, o)\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n\nconst BlobDefaultDownloadBlockSize = int64(4 * 1024 * 1024) // 4MB\n\n// DownloadFromAzureFileOptions identifies options used by the DownloadAzureFileToBuffer and DownloadAzureFileToFile functions.\ntype DownloadFromBlobOptions struct {\n\t// BlockSize specifies the block size to use for each parallel download; the default size is BlobDefaultDownloadBlockSize.\n\tBlockSize int64\n\n\t// Progress is a function that is invoked periodically as bytes are received.\n\tProgress pipeline.ProgressReceiver\n\n\t// AccessConditions indicates the access conditions used when making HTTP GET requests against the blob.\n\tAccessConditions BlobAccessConditions\n\n\t// Parallelism indicates the maximum number of blocks to download in parallel (0=default)\n\tParallelism uint16\n\n\t// RetryReaderOptionsPerBlock is used when downloading each block.\n\tRetryReaderOptionsPerBlock RetryReaderOptions\n}\n\n// downloadAzureFileToBuffer downloads an Azure file to a buffer with parallel.\nfunc downloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, count int64,\n\tac BlobAccessConditions, b []byte, o DownloadFromBlobOptions,\n\tinitialDownloadResponse *DownloadResponse) error {\n\t// Validate parameters, and set defaults.\n\tif o.BlockSize < 0 {\n\t\tpanic(\"BlockSize option must be >= 0\")\n\t}\n\tif o.BlockSize == 0 {\n\t\to.BlockSize = BlobDefaultDownloadBlockSize\n\t}\n\n\tif offset < 0 {\n\t\tpanic(\"offset option must be >= 0\")\n\t}\n\n\tif count < 0 {\n\t\tpanic(\"count option must be >= 0\")\n\t}\n\n\tif count == CountToEnd { // If size not specified, calculate it\n\t\tif initialDownloadResponse != nil {\n\t\t\tcount = initialDownloadResponse.ContentLength() - offset // if we have the length, use it\n\t\t} else {\n\t\t\t// If we don't have the length at all, get it\n\t\t\tdr, err := blobURL.Download(ctx, 0, CountToEnd, ac, false)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcount = dr.ContentLength() - offset\n\t\t}\n\t}\n\n\tif int64(len(b)) < count {\n\t\tpanic(fmt.Errorf(\"the buffer's size should be equal to or larger than the request count of bytes: %d\", count))\n\t}\n\n\t// Prepare and do parallel download.\n\tprogress := int64(0)\n\tprogressLock := &sync.Mutex{}\n\n\terr := doBatchTransfer(ctx, batchTransferOptions{\n\t\toperationName: \"downloadBlobToBuffer\",\n\t\ttransferSize:    count,\n\t\tchunkSize:     o.BlockSize,\n\t\tparallelism:   o.Parallelism,\n\t\toperation: func(chunkStart int64, count int64) error {\n\t\t\tdr, err := blobURL.Download(ctx, chunkStart+ offset, count, ac, false)\n\t\t\tbody := dr.Body(o.RetryReaderOptionsPerBlock)\n\t\t\tif o.Progress != nil {\n\t\t\t\trangeProgress := int64(0)\n\t\t\t\tbody = pipeline.NewResponseBodyProgress(\n\t\t\t\t\tbody,\n\t\t\t\t\tfunc(bytesTransferred int64) {\n\t\t\t\t\t\tdiff := bytesTransferred - rangeProgress\n\t\t\t\t\t\trangeProgress = bytesTransferred\n\t\t\t\t\t\tprogressLock.Lock()\n\t\t\t\t\t\tprogress += diff\n\t\t\t\t\t\to.Progress(progress)\n\t\t\t\t\t\tprogressLock.Unlock()\n\t\t\t\t\t})\n\t\t\t}\n\t\t\t_, err = io.ReadFull(body, b[chunkStart:chunkStart+count])\n\t\t\tbody.Close()\n\t\t\treturn err\n\t\t},\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// DownloadAzureFileToBuffer downloads an Azure file to a buffer with parallel.\n// Offset and count are optional, pass 0 for both to download the entire blob.\nfunc DownloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, count int64,\n\tac BlobAccessConditions, b []byte, o DownloadFromBlobOptions) error {\n\treturn downloadBlobToBuffer(ctx, blobURL, offset, count, ac, b, o, nil)\n}\n\n// DownloadBlobToFile downloads an Azure file to a local file.\n// The file would be truncated if the size doesn't match.\n// Offset and count are optional, pass 0 for both to download the entire blob.\nfunc DownloadBlobToFile(ctx context.Context, blobURL BlobURL, offset int64, count int64,\n\tac BlobAccessConditions, file *os.File, o DownloadFromBlobOptions) error {\n\t// 1. Validate parameters.\n\tif file == nil {\n\t\tpanic(\"file must not be nil\")\n\t}\n\n\t// 2. Calculate the size of the destination file\n\tvar size int64\n\n\tif count == CountToEnd {\n\t\t// Try to get Azure file's size\n\t\tprops, err := blobURL.GetProperties(ctx, ac)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tsize = props.ContentLength() - offset\n\t} else {\n\t\tsize = count\n\t}\n\n\t// 3. Compare and try to resize local file's size if it doesn't match Azure file's size.\n\tstat, err := file.Stat()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif stat.Size() != size {\n\t\tif err = file.Truncate(size); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif size > 0 {\n\t\t// 4. Set mmap and call DownloadAzureFileToBuffer.\n\t\tm, err := newMMF(file, true, 0, int(size))\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdefer m.unmap()\n\t\treturn downloadBlobToBuffer(ctx, blobURL, offset, size, ac, m, o, nil)\n\t} else { // if the blob's size is 0, there is no need in downloading it\n\t\treturn nil\n\t}\n}\n\n\n///////////////////////////////////////////////////////////////////////////////\n\n// BatchTransferOptions identifies options used by doBatchTransfer.\ntype batchTransferOptions struct {\n\ttransferSize  int64\n\tchunkSize     int64\n\tparallelism   uint16\n\toperation     func(offset int64, chunkSize int64) error\n\toperationName string\n}\n\n// doBatchTransfer helps to execute operations in a batch manner.\nfunc doBatchTransfer(ctx context.Context, o batchTransferOptions) error {\n\t// Prepare and do parallel operations.\n\tnumChunks := uint16(((o.transferSize - 1) / o.chunkSize) + 1)\n\toperationChannel := make(chan func() error, o.parallelism) // Create the channel that release 'parallelism' goroutines concurrently\n\toperationResponseChannel := make(chan error, numChunks)    // Holds each response\n\tctx, cancel := context.WithCancel(ctx)\n\tdefer cancel()\n\n\t// Create the goroutines that process each operation (in parallel).\n\tif o.parallelism == 0 {\n\t\to.parallelism = 5 // default parallelism\n\t}\n\tfor g := uint16(0); g < o.parallelism; g++ {\n\t\t//grIndex := g\n\t\tgo func() {\n\t\t\tfor f := range operationChannel {\n\t\t\t\t//fmt.Printf(\"[%s] gr-%d start action\\n\", o.operationName, grIndex)\n\t\t\t\terr := f()\n\t\t\t\toperationResponseChannel <- err\n\t\t\t\t//fmt.Printf(\"[%s] gr-%d end action\\n\", o.operationName, grIndex)\n\t\t\t}\n\t\t}()\n\t}\n\n\t// Add each chunk's operation to the channel.\n\tfor chunkNum := uint16(0); chunkNum < numChunks; chunkNum++ {\n\t\tcurChunkSize := o.chunkSize\n\n\t\tif chunkNum == numChunks-1 { // Last chunk\n\t\t\tcurChunkSize = o.transferSize - (int64(chunkNum) * o.chunkSize) // Remove size of all transferred chunks from total\n\t\t}\n\t\toffset := int64(chunkNum) * o.chunkSize\n\n\t\toperationChannel <- func() error {\n\t\t\treturn o.operation(offset, curChunkSize)\n\t\t}\n\t}\n\tclose(operationChannel)\n\n\t// Wait for the operations to complete.\n\tfor chunkNum := uint16(0); chunkNum < numChunks; chunkNum++ {\n\t\tresponseError := <-operationResponseChannel\n\t\tif responseError != nil {\n\t\t\tcancel()             // As soon as any operation fails, cancel all remaining operation calls\n\t\t\treturn responseError // No need to process anymore responses\n\t\t}\n\t}\n\treturn nil\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////\n\ntype UploadStreamToBlockBlobOptions struct {\n\tBufferSize       int\n\tMaxBuffers       int\n\tBlobHTTPHeaders  BlobHTTPHeaders\n\tMetadata         Metadata\n\tAccessConditions BlobAccessConditions\n}\n\nfunc UploadStreamToBlockBlob(ctx context.Context, reader io.Reader, blockBlobURL BlockBlobURL,\n\to UploadStreamToBlockBlobOptions) (CommonResponse, error) {\n\tresult, err := uploadStream(ctx, reader,\n\t\tUploadStreamOptions{BufferSize: o.BufferSize, MaxBuffers: o.MaxBuffers},\n\t\t&uploadStreamToBlockBlobOptions{b: blockBlobURL, o: o, blockIDPrefix: newUUID()})\n\treturn result.(CommonResponse), err\n}\n\ntype uploadStreamToBlockBlobOptions struct {\n\tb             BlockBlobURL\n\to             UploadStreamToBlockBlobOptions\n\tblockIDPrefix uuid   // UUID used with all blockIDs\n\tmaxBlockNum   uint32 // defaults to 0\n\tfirstBlock    []byte // Used only if maxBlockNum is 0\n}\n\nfunc (t *uploadStreamToBlockBlobOptions) start(ctx context.Context) (interface{}, error) {\n\treturn nil, nil\n}\n\nfunc (t *uploadStreamToBlockBlobOptions) chunk(ctx context.Context, num uint32, buffer []byte) error {\n\tif num == 0 && len(buffer) < t.o.BufferSize {\n\t\t// If whole payload fits in 1 block, don't stage it; End will upload it with 1 I/O operation\n\t\tt.firstBlock = buffer\n\t\treturn nil\n\t}\n\t// Else, upload a staged block...\n\tAtomicMorphUint32(&t.maxBlockNum, func(startVal uint32) (val uint32, morphResult interface{}) {\n\t\t// Atomically remember (in t.numBlocks) the maximum block num we've ever seen\n\t\tif startVal < num {\n\t\t\treturn num, nil\n\t\t}\n\t\treturn startVal, nil\n\t})\n\tblockID := newUuidBlockID(t.blockIDPrefix).WithBlockNumber(num).ToBase64()\n\t_, err := t.b.StageBlock(ctx, blockID, bytes.NewReader(buffer), LeaseAccessConditions{})\n\treturn err\n}\n\nfunc (t *uploadStreamToBlockBlobOptions) end(ctx context.Context) (interface{}, error) {\n\tif t.maxBlockNum == 0 {\n\t\t// If whole payload fits in 1 block (block #0), upload it with 1 I/O operation\n\t\treturn t.b.Upload(ctx, bytes.NewReader(t.firstBlock),\n\t\t\tt.o.BlobHTTPHeaders, t.o.Metadata, t.o.AccessConditions)\n\t}\n\t// Multiple blocks staged, commit them all now\n\tblockID := newUuidBlockID(t.blockIDPrefix)\n\tblockIDs := make([]string, t.maxBlockNum + 1)\n\tfor bn := uint32(0); bn <= t.maxBlockNum; bn++ {\n\t\tblockIDs[bn] = blockID.WithBlockNumber(bn).ToBase64()\n\t}\n\treturn t.b.CommitBlockList(ctx, blockIDs, t.o.BlobHTTPHeaders, t.o.Metadata, t.o.AccessConditions)\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////\n\ntype iTransfer interface {\n\tstart(ctx context.Context) (interface{}, error)\n\tchunk(ctx context.Context, num uint32, buffer []byte) error\n\tend(ctx context.Context) (interface{}, error)\n}\n\ntype UploadStreamOptions struct {\n\tMaxBuffers int\n\tBufferSize int\n}\n\nfunc uploadStream(ctx context.Context, reader io.Reader, o UploadStreamOptions, t iTransfer) (interface{}, error) {\n\tctx, cancel := context.WithCancel(ctx) // New context so that any failure cancels everything\n\tdefer cancel()\n\twg := sync.WaitGroup{} // Used to know when all outgoing messages have finished processing\n\ttype OutgoingMsg struct {\n\t\tchunkNum uint32\n\t\tbuffer   []byte\n\t}\n\n\t// Create a channel to hold the buffers usable for incoming datsa\n\tincoming := make(chan []byte, o.MaxBuffers)\n\toutgoing := make(chan OutgoingMsg, o.MaxBuffers) // Channel holding outgoing buffers\n\tif result, err := t.start(ctx); err != nil {\n\t\treturn result, err\n\t}\n\n\tnumBuffers := 0 // The number of buffers & out going goroutines created so far\n\tinjectBuffer := func() {\n\t\t// For each Buffer, create it and a goroutine to upload it\n\t\tincoming <- make([]byte, o.BufferSize) // Add the new buffer to the incoming channel so this goroutine can from the reader into it\n\t\tnumBuffers++\n\t\tgo func() {\n\t\t\tfor outgoingMsg := range outgoing {\n\t\t\t\t// Upload the outgoing buffer\n\t\t\t\terr := t.chunk(ctx, outgoingMsg.chunkNum, outgoingMsg.buffer)\n\t\t\t\twg.Done() // Indicate this buffer was sent\n\t\t\t\tif nil != err {\n\t\t\t\t\tcancel()\n\t\t\t\t}\n\t\t\t\tincoming <- outgoingMsg.buffer // The goroutine reading from the stream can use reuse this buffer now\n\t\t\t}\n\t\t}()\n\t}\n\tinjectBuffer() // Create our 1st buffer & outgoing goroutine\n\n\t// This goroutine grabs a buffer, reads from the stream into the buffer,\n\t// and inserts the buffer into the outgoing channel to be uploaded\n\tfor c := uint32(0); true; c++ { // Iterate once per chunk\n\t\tvar buffer []byte\n\t\tif numBuffers < o.MaxBuffers {\n\t\t\tselect {\n\t\t\t// We're not at max buffers, see if a previously-created buffer is available\n\t\t\tcase buffer = <-incoming:\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\t// No buffer available; inject a new buffer & go routine to process it\n\t\t\t\tinjectBuffer()\n\t\t\t\tbuffer = <-incoming // Grab the just-injected buffer\n\t\t\t}\n\t\t} else {\n\t\t\t// We are at max buffers, block until we get to reuse one\n\t\t\tbuffer = <-incoming\n\t\t}\n\t\tn, err := io.ReadFull(reader, buffer)\n\t\tif err != nil {\n\t\t\tbuffer = buffer[:n] // Make slice match the # of read bytes\n\t\t}\n\t\tif len(buffer) > 0 {\n\t\t\t// Buffer not empty, upload it\n\t\t\twg.Add(1) // We're posting a buffer to be sent\n\t\t\toutgoing <- OutgoingMsg{chunkNum: c, buffer: buffer}\n\t\t}\n\t\tif err != nil { // The reader is done, no more outgoing buffers\n\t\t\tbreak\n\t\t}\n\t}\n\t// NOTE: Don't close the incoming channel because the outgoing goroutines post buffers into it when they are done\n\tclose(outgoing) // Make all the outgoing goroutines terminate when this channel is empty\n\twg.Wait()       // Wait for all pending outgoing messages to complete\n\t// After all blocks uploaded, commit them to the blob & return the result\n\treturn t.end(ctx)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/parsing_urls.go",
    "content": "package azblob\n\nimport (\n\t\"net/url\"\n\t\"strings\"\n)\n\nconst (\n\tsnapshot           = \"snapshot\"\n\tSnapshotTimeFormat = \"2006-01-02T15:04:05.0000000Z07:00\"\n)\n\n// A BlobURLParts object represents the components that make up an Azure Storage Container/Blob URL. You parse an\n// existing URL into its parts by calling NewBlobURLParts(). You construct a URL from parts by calling URL().\n// NOTE: Changing any SAS-related field requires computing a new SAS signature.\ntype BlobURLParts struct {\n\tScheme         string // Ex: \"https://\"\n\tHost           string // Ex: \"account.blob.core.windows.net\"\n\tContainerName  string // \"\" if no container\n\tBlobName       string // \"\" if no blob\n\tSnapshot       string // \"\" if not a snapshot\n\tSAS            SASQueryParameters\n\tUnparsedParams string\n}\n\n// NewBlobURLParts parses a URL initializing BlobURLParts' fields including any SAS-related & snapshot query parameters. Any other\n// query parameters remain in the UnparsedParams field. This method overwrites all fields in the BlobURLParts object.\nfunc NewBlobURLParts(u url.URL) BlobURLParts {\n\tup := BlobURLParts{\n\t\tScheme: u.Scheme,\n\t\tHost:   u.Host,\n\t}\n\n\t// Find the container & blob names (if any)\n\tif u.Path != \"\" {\n\t\tpath := u.Path\n\t\tif path[0] == '/' {\n\t\t\tpath = path[1:] // If path starts with a slash, remove it\n\t\t}\n\n\t\t// Find the next slash (if it exists)\n\t\tcontainerEndIndex := strings.Index(path, \"/\")\n\t\tif containerEndIndex == -1 { // Slash not found; path has container name & no blob name\n\t\t\tup.ContainerName = path\n\t\t} else {\n\t\t\tup.ContainerName = path[:containerEndIndex] // The container name is the part between the slashes\n\t\t\tup.BlobName = path[containerEndIndex+1:]    // The blob name is after the container slash\n\t\t}\n\t}\n\n\t// Convert the query parameters to a case-sensitive map & trim whitespace\n\tparamsMap := u.Query()\n\n\tup.Snapshot = \"\" // Assume no snapshot\n\tif snapshotStr, ok := caseInsensitiveValues(paramsMap).Get(snapshot); ok {\n\t\tup.Snapshot = snapshotStr[0]\n\t\t// If we recognized the query parameter, remove it from the map\n\t\tdelete(paramsMap, snapshot)\n\t}\n\tup.SAS = newSASQueryParameters(paramsMap, true)\n\tup.UnparsedParams = paramsMap.Encode()\n\treturn up\n}\n\ntype caseInsensitiveValues url.Values // map[string][]string\nfunc (values caseInsensitiveValues) Get(key string) ([]string, bool) {\n\tkey = strings.ToLower(key)\n\tfor k, v := range values {\n\t\tif strings.ToLower(k) == key {\n\t\t\treturn v, true\n\t\t}\n\t}\n\treturn []string{}, false\n}\n\n// URL returns a URL object whose fields are initialized from the BlobURLParts fields. The URL's RawQuery\n// field contains the SAS, snapshot, and unparsed query parameters.\nfunc (up BlobURLParts) URL() url.URL {\n\tpath := \"\"\n\t// Concatenate container & blob names (if they exist)\n\tif up.ContainerName != \"\" {\n\t\tpath += \"/\" + up.ContainerName\n\t\tif up.BlobName != \"\" {\n\t\t\tpath += \"/\" + up.BlobName\n\t\t}\n\t}\n\n\trawQuery := up.UnparsedParams\n\n\t// Concatenate blob snapshot query parameter (if it exists)\n\tif up.Snapshot != \"\" {\n\t\tif len(rawQuery) > 0 {\n\t\t\trawQuery += \"&\"\n\t\t}\n\t\trawQuery += snapshot + \"=\" + up.Snapshot\n\t}\n\tsas := up.SAS.Encode()\n\tif sas != \"\" {\n\t\tif len(rawQuery) > 0 {\n\t\t\trawQuery += \"&\"\n\t\t}\n\t\trawQuery += sas\n\t}\n\tu := url.URL{\n\t\tScheme:   up.Scheme,\n\t\tHost:     up.Host,\n\t\tPath:     path,\n\t\tRawQuery: rawQuery,\n\t}\n\treturn u\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/sas_service.go",
    "content": "package azblob\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\n// BlobSASSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage container or blob.\ntype BlobSASSignatureValues struct {\n\tVersion            string      `param:\"sv\"`  // If not specified, this defaults to SASVersion\n\tProtocol           SASProtocol `param:\"spr\"` // See the SASProtocol* constants\n\tStartTime          time.Time   `param:\"st\"`  // Not specified if IsZero\n\tExpiryTime         time.Time   `param:\"se\"`  // Not specified if IsZero\n\tPermissions        string      `param:\"sp\"`  // Create by initializing a ContainerSASPermissions or BlobSASPermissions and then call String()\n\tIPRange            IPRange     `param:\"sip\"`\n\tIdentifier         string      `param:\"si\"`\n\tContainerName      string\n\tBlobName           string // Use \"\" to create a Container SAS\n\tCacheControl       string // rscc\n\tContentDisposition string // rscd\n\tContentEncoding    string // rsce\n\tContentLanguage    string // rscl\n\tContentType        string // rsct\n}\n\n// NewSASQueryParameters uses an account's shared key credential to sign this signature values to produce\n// the proper SAS query parameters.\nfunc (v BlobSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *SharedKeyCredential) SASQueryParameters {\n\tif sharedKeyCredential == nil {\n\t\tpanic(\"sharedKeyCredential can't be nil\")\n\t}\n\n\tresource := \"c\"\n\tif v.BlobName == \"\" {\n\t\t// Make sure the permission characters are in the correct order\n\t\tperms := &ContainerSASPermissions{}\n\t\tif err := perms.Parse(v.Permissions); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tv.Permissions = perms.String()\n\t} else {\n\t\tresource = \"b\"\n\t\t// Make sure the permission characters are in the correct order\n\t\tperms := &BlobSASPermissions{}\n\t\tif err := perms.Parse(v.Permissions); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tv.Permissions = perms.String()\n\t}\n\tif v.Version == \"\" {\n\t\tv.Version = SASVersion\n\t}\n\tstartTime, expiryTime := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime)\n\n\t// String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx\n\tstringToSign := strings.Join([]string{\n\t\tv.Permissions,\n\t\tstartTime,\n\t\texpiryTime,\n\t\tgetCanonicalName(sharedKeyCredential.AccountName(), v.ContainerName, v.BlobName),\n\t\tv.Identifier,\n\t\tv.IPRange.String(),\n\t\tstring(v.Protocol),\n\t\tv.Version,\n\t\tv.CacheControl,       // rscc\n\t\tv.ContentDisposition, // rscd\n\t\tv.ContentEncoding,    // rsce\n\t\tv.ContentLanguage,    // rscl\n\t\tv.ContentType},       // rsct\n\t\t\"\\n\")\n\tsignature := sharedKeyCredential.ComputeHMACSHA256(stringToSign)\n\n\tp := SASQueryParameters{\n\t\t// Common SAS parameters\n\t\tversion:     v.Version,\n\t\tprotocol:    v.Protocol,\n\t\tstartTime:   v.StartTime,\n\t\texpiryTime:  v.ExpiryTime,\n\t\tpermissions: v.Permissions,\n\t\tipRange:     v.IPRange,\n\n\t\t// Container/Blob-specific SAS parameters\n\t\tresource:   resource,\n\t\tidentifier: v.Identifier,\n\n\t\t// Calculated SAS signature\n\t\tsignature: signature,\n\t}\n\treturn p\n}\n\n// getCanonicalName computes the canonical name for a container or blob resource for SAS signing.\nfunc getCanonicalName(account string, containerName string, blobName string) string {\n\t// Container: \"/blob/account/containername\"\n\t// Blob:      \"/blob/account/containername/blobname\"\n\telements := []string{\"/blob/\", account, \"/\", containerName}\n\tif blobName != \"\" {\n\t\telements = append(elements, \"/\", strings.Replace(blobName, \"\\\\\", \"/\", -1))\n\t}\n\treturn strings.Join(elements, \"\")\n}\n\n// The ContainerSASPermissions type simplifies creating the permissions string for an Azure Storage container SAS.\n// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field.\ntype ContainerSASPermissions struct {\n\tRead, Add, Create, Write, Delete, List bool\n}\n\n// String produces the SAS permissions string for an Azure Storage container.\n// Call this method to set BlobSASSignatureValues's Permissions field.\nfunc (p ContainerSASPermissions) String() string {\n\tvar b bytes.Buffer\n\tif p.Read {\n\t\tb.WriteRune('r')\n\t}\n\tif p.Add {\n\t\tb.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tb.WriteRune('c')\n\t}\n\tif p.Write {\n\t\tb.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tb.WriteRune('d')\n\t}\n\tif p.List {\n\t\tb.WriteRune('l')\n\t}\n\treturn b.String()\n}\n\n// Parse initializes the ContainerSASPermissions's fields from a string.\nfunc (p *ContainerSASPermissions) Parse(s string) error {\n\t*p = ContainerSASPermissions{} // Clear the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tcase 'l':\n\t\t\tp.List = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"Invalid permission: '%v'\", r)\n\t\t}\n\t}\n\treturn nil\n}\n\n// The BlobSASPermissions type simplifies creating the permissions string for an Azure Storage blob SAS.\n// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field.\ntype BlobSASPermissions struct{ Read, Add, Create, Write, Delete bool }\n\n// String produces the SAS permissions string for an Azure Storage blob.\n// Call this method to set BlobSASSignatureValues's Permissions field.\nfunc (p BlobSASPermissions) String() string {\n\tvar b bytes.Buffer\n\tif p.Read {\n\t\tb.WriteRune('r')\n\t}\n\tif p.Add {\n\t\tb.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tb.WriteRune('c')\n\t}\n\tif p.Write {\n\t\tb.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tb.WriteRune('d')\n\t}\n\treturn b.String()\n}\n\n// Parse initializes the BlobSASPermissions's fields from a string.\nfunc (p *BlobSASPermissions) Parse(s string) error {\n\t*p = BlobSASPermissions{} // Clear the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"Invalid permission: '%v'\", r)\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/service_codes_blob.go",
    "content": "package azblob\n\n// https://docs.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes\n\n// ServiceCode values indicate a service failure.\nconst (\n\t// ServiceCodeAppendPositionConditionNotMet means the append position condition specified was not met.\n\tServiceCodeAppendPositionConditionNotMet ServiceCodeType = \"AppendPositionConditionNotMet\"\n\n\t// ServiceCodeBlobAlreadyExists means the specified blob already exists.\n\tServiceCodeBlobAlreadyExists ServiceCodeType = \"BlobAlreadyExists\"\n\n\t// ServiceCodeBlobNotFound means the specified blob does not exist.\n\tServiceCodeBlobNotFound ServiceCodeType = \"BlobNotFound\"\n\n\t// ServiceCodeBlobOverwritten means the blob has been recreated since the previous snapshot was taken.\n\tServiceCodeBlobOverwritten ServiceCodeType = \"BlobOverwritten\"\n\n\t// ServiceCodeBlobTierInadequateForContentLength means the specified blob tier size limit cannot be less than content length.\n\tServiceCodeBlobTierInadequateForContentLength ServiceCodeType = \"BlobTierInadequateForContentLength\"\n\n\t// ServiceCodeBlockCountExceedsLimit means the committed block count cannot exceed the maximum limit of 50,000 blocks\n\t// or that the uncommitted block count cannot exceed the maximum limit of 100,000 blocks.\n\tServiceCodeBlockCountExceedsLimit ServiceCodeType = \"BlockCountExceedsLimit\"\n\n\t// ServiceCodeBlockListTooLong means the block list may not contain more than 50,000 blocks.\n\tServiceCodeBlockListTooLong ServiceCodeType = \"BlockListTooLong\"\n\n\t// ServiceCodeCannotChangeToLowerTier means that a higher blob tier has already been explicitly set.\n\tServiceCodeCannotChangeToLowerTier ServiceCodeType = \"CannotChangeToLowerTier\"\n\n\t// ServiceCodeCannotVerifyCopySource means that the service could not verify the copy source within the specified time.\n\t// Examine the HTTP status code and message for more information about the failure.\n\tServiceCodeCannotVerifyCopySource ServiceCodeType = \"CannotVerifyCopySource\"\n\n\t// ServiceCodeContainerAlreadyExists means the specified container already exists.\n\tServiceCodeContainerAlreadyExists ServiceCodeType = \"ContainerAlreadyExists\"\n\n\t// ServiceCodeContainerBeingDeleted means the specified container is being deleted.\n\tServiceCodeContainerBeingDeleted ServiceCodeType = \"ContainerBeingDeleted\"\n\n\t// ServiceCodeContainerDisabled means the specified container has been disabled by the administrator.\n\tServiceCodeContainerDisabled ServiceCodeType = \"ContainerDisabled\"\n\n\t// ServiceCodeContainerNotFound means the specified container does not exist.\n\tServiceCodeContainerNotFound ServiceCodeType = \"ContainerNotFound\"\n\n\t// ServiceCodeContentLengthLargerThanTierLimit means the blob's content length cannot exceed its tier limit.\n\tServiceCodeContentLengthLargerThanTierLimit ServiceCodeType = \"ContentLengthLargerThanTierLimit\"\n\n\t// ServiceCodeCopyAcrossAccountsNotSupported means the copy source account and destination account must be the same.\n\tServiceCodeCopyAcrossAccountsNotSupported ServiceCodeType = \"CopyAcrossAccountsNotSupported\"\n\n\t// ServiceCodeCopyIDMismatch means the specified copy ID did not match the copy ID for the pending copy operation.\n\tServiceCodeCopyIDMismatch ServiceCodeType = \"CopyIdMismatch\"\n\n\t// ServiceCodeFeatureVersionMismatch means the type of blob in the container is unrecognized by this version or\n\t// that the operation for AppendBlob requires at least version 2015-02-21.\n\tServiceCodeFeatureVersionMismatch ServiceCodeType = \"FeatureVersionMismatch\"\n\n\t// ServiceCodeIncrementalCopyBlobMismatch means the specified source blob is different than the copy source of the existing incremental copy blob.\n\tServiceCodeIncrementalCopyBlobMismatch ServiceCodeType = \"IncrementalCopyBlobMismatch\"\n\n\t// ServiceCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed means the specified snapshot is earlier than the last snapshot copied into the incremental copy blob.\n\tServiceCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed ServiceCodeType = \"IncrementalCopyOfEralierVersionSnapshotNotAllowed\"\n\n\t// ServiceCodeIncrementalCopySourceMustBeSnapshot means the source for incremental copy request must be a snapshot.\n\tServiceCodeIncrementalCopySourceMustBeSnapshot ServiceCodeType = \"IncrementalCopySourceMustBeSnapshot\"\n\n\t// ServiceCodeInfiniteLeaseDurationRequired means the lease ID matched, but the specified lease must be an infinite-duration lease.\n\tServiceCodeInfiniteLeaseDurationRequired ServiceCodeType = \"InfiniteLeaseDurationRequired\"\n\n\t// ServiceCodeInvalidBlobOrBlock means the specified blob or block content is invalid.\n\tServiceCodeInvalidBlobOrBlock ServiceCodeType = \"InvalidBlobOrBlock\"\n\n\t// ServiceCodeInvalidBlobType means the blob type is invalid for this operation.\n\tServiceCodeInvalidBlobType ServiceCodeType = \"InvalidBlobType\"\n\n\t// ServiceCodeInvalidBlockID means the specified block ID is invalid. The block ID must be Base64-encoded.\n\tServiceCodeInvalidBlockID ServiceCodeType = \"InvalidBlockId\"\n\n\t// ServiceCodeInvalidBlockList means the specified block list is invalid.\n\tServiceCodeInvalidBlockList ServiceCodeType = \"InvalidBlockList\"\n\n\t// ServiceCodeInvalidOperation means an invalid operation against a blob snapshot.\n\tServiceCodeInvalidOperation ServiceCodeType = \"InvalidOperation\"\n\n\t// ServiceCodeInvalidPageRange means the page range specified is invalid.\n\tServiceCodeInvalidPageRange ServiceCodeType = \"InvalidPageRange\"\n\n\t// ServiceCodeInvalidSourceBlobType means the copy source blob type is invalid for this operation.\n\tServiceCodeInvalidSourceBlobType ServiceCodeType = \"InvalidSourceBlobType\"\n\n\t// ServiceCodeInvalidSourceBlobURL means the source URL for incremental copy request must be valid Azure Storage blob URL.\n\tServiceCodeInvalidSourceBlobURL ServiceCodeType = \"InvalidSourceBlobUrl\"\n\n\t// ServiceCodeInvalidVersionForPageBlobOperation means that all operations on page blobs require at least version 2009-09-19.\n\tServiceCodeInvalidVersionForPageBlobOperation ServiceCodeType = \"InvalidVersionForPageBlobOperation\"\n\n\t// ServiceCodeLeaseAlreadyPresent means there is already a lease present.\n\tServiceCodeLeaseAlreadyPresent ServiceCodeType = \"LeaseAlreadyPresent\"\n\n\t// ServiceCodeLeaseAlreadyBroken means the lease has already been broken and cannot be broken again.\n\tServiceCodeLeaseAlreadyBroken ServiceCodeType = \"LeaseAlreadyBroken\"\n\n\t// ServiceCodeLeaseIDMismatchWithBlobOperation means the lease ID specified did not match the lease ID for the blob.\n\tServiceCodeLeaseIDMismatchWithBlobOperation ServiceCodeType = \"LeaseIdMismatchWithBlobOperation\"\n\n\t// ServiceCodeLeaseIDMismatchWithContainerOperation means the lease ID specified did not match the lease ID for the container.\n\tServiceCodeLeaseIDMismatchWithContainerOperation ServiceCodeType = \"LeaseIdMismatchWithContainerOperation\"\n\n\t// ServiceCodeLeaseIDMismatchWithLeaseOperation means the lease ID specified did not match the lease ID for the blob/container.\n\tServiceCodeLeaseIDMismatchWithLeaseOperation ServiceCodeType = \"LeaseIdMismatchWithLeaseOperation\"\n\n\t// ServiceCodeLeaseIDMissing means there is currently a lease on the blob/container and no lease ID was specified in the request.\n\tServiceCodeLeaseIDMissing ServiceCodeType = \"LeaseIdMissing\"\n\n\t// ServiceCodeLeaseIsBreakingAndCannotBeAcquired means the lease ID matched, but the lease is currently in breaking state and cannot be acquired until it is broken.\n\tServiceCodeLeaseIsBreakingAndCannotBeAcquired ServiceCodeType = \"LeaseIsBreakingAndCannotBeAcquired\"\n\n\t// ServiceCodeLeaseIsBreakingAndCannotBeChanged means the lease ID matched, but the lease is currently in breaking state and cannot be changed.\n\tServiceCodeLeaseIsBreakingAndCannotBeChanged ServiceCodeType = \"LeaseIsBreakingAndCannotBeChanged\"\n\n\t// ServiceCodeLeaseIsBrokenAndCannotBeRenewed means the lease ID matched, but the lease has been broken explicitly and cannot be renewed.\n\tServiceCodeLeaseIsBrokenAndCannotBeRenewed ServiceCodeType = \"LeaseIsBrokenAndCannotBeRenewed\"\n\n\t// ServiceCodeLeaseLost means a lease ID was specified, but the lease for the blob/container has expired.\n\tServiceCodeLeaseLost ServiceCodeType = \"LeaseLost\"\n\n\t// ServiceCodeLeaseNotPresentWithBlobOperation means there is currently no lease on the blob.\n\tServiceCodeLeaseNotPresentWithBlobOperation ServiceCodeType = \"LeaseNotPresentWithBlobOperation\"\n\n\t// ServiceCodeLeaseNotPresentWithContainerOperation means there is currently no lease on the container.\n\tServiceCodeLeaseNotPresentWithContainerOperation ServiceCodeType = \"LeaseNotPresentWithContainerOperation\"\n\n\t// ServiceCodeLeaseNotPresentWithLeaseOperation means there is currently no lease on the blob/container.\n\tServiceCodeLeaseNotPresentWithLeaseOperation ServiceCodeType = \"LeaseNotPresentWithLeaseOperation\"\n\n\t// ServiceCodeMaxBlobSizeConditionNotMet means the max blob size condition specified was not met.\n\tServiceCodeMaxBlobSizeConditionNotMet ServiceCodeType = \"MaxBlobSizeConditionNotMet\"\n\n\t// ServiceCodeNoPendingCopyOperation means there is currently no pending copy operation.\n\tServiceCodeNoPendingCopyOperation ServiceCodeType = \"NoPendingCopyOperation\"\n\n\t// ServiceCodeOperationNotAllowedOnIncrementalCopyBlob means the specified operation is not allowed on an incremental copy blob.\n\tServiceCodeOperationNotAllowedOnIncrementalCopyBlob ServiceCodeType = \"OperationNotAllowedOnIncrementalCopyBlob\"\n\n\t// ServiceCodePendingCopyOperation means there is currently a pending copy operation.\n\tServiceCodePendingCopyOperation ServiceCodeType = \"PendingCopyOperation\"\n\n\t// ServiceCodePreviousSnapshotCannotBeNewer means the prevsnapshot query parameter value cannot be newer than snapshot query parameter value.\n\tServiceCodePreviousSnapshotCannotBeNewer ServiceCodeType = \"PreviousSnapshotCannotBeNewer\"\n\n\t// ServiceCodePreviousSnapshotNotFound means the previous snapshot is not found.\n\tServiceCodePreviousSnapshotNotFound ServiceCodeType = \"PreviousSnapshotNotFound\"\n\n\t// ServiceCodePreviousSnapshotOperationNotSupported means that differential Get Page Ranges is not supported on the previous snapshot.\n\tServiceCodePreviousSnapshotOperationNotSupported ServiceCodeType = \"PreviousSnapshotOperationNotSupported\"\n\n\t// ServiceCodeSequenceNumberConditionNotMet means the sequence number condition specified was not met.\n\tServiceCodeSequenceNumberConditionNotMet ServiceCodeType = \"SequenceNumberConditionNotMet\"\n\n\t// ServiceCodeSequenceNumberIncrementTooLarge means the sequence number increment cannot be performed because it would result in overflow of the sequence number.\n\tServiceCodeSequenceNumberIncrementTooLarge ServiceCodeType = \"SequenceNumberIncrementTooLarge\"\n\n\t// ServiceCodeSnapshotCountExceeded means the snapshot count against this blob has been exceeded.\n\tServiceCodeSnapshotCountExceeded ServiceCodeType = \"SnapshotCountExceeded\"\n\n\t// ServiceCodeSnaphotOperationRateExceeded means the rate of snapshot operations against this blob has been exceeded.\n\tServiceCodeSnaphotOperationRateExceeded ServiceCodeType = \"SnaphotOperationRateExceeded\"\n\n\t// ServiceCodeSnapshotsPresent means this operation is not permitted while the blob has snapshots.\n\tServiceCodeSnapshotsPresent ServiceCodeType = \"SnapshotsPresent\"\n\n\t// ServiceCodeSourceConditionNotMet means the source condition specified using HTTP conditional header(s) is not met.\n\tServiceCodeSourceConditionNotMet ServiceCodeType = \"SourceConditionNotMet\"\n\n\t// ServiceCodeSystemInUse means this blob is in use by the system.\n\tServiceCodeSystemInUse ServiceCodeType = \"SystemInUse\"\n\n\t// ServiceCodeTargetConditionNotMet means the target condition specified using HTTP conditional header(s) is not met.\n\tServiceCodeTargetConditionNotMet ServiceCodeType = \"TargetConditionNotMet\"\n\n\t// ServiceCodeUnauthorizedBlobOverwrite means this request is not authorized to perform blob overwrites.\n\tServiceCodeUnauthorizedBlobOverwrite ServiceCodeType = \"UnauthorizedBlobOverwrite\"\n\n\t// ServiceCodeBlobBeingRehydrated means this operation is not permitted because the blob is being rehydrated.\n\tServiceCodeBlobBeingRehydrated ServiceCodeType = \"BlobBeingRehydrated\"\n\n\t// ServiceCodeBlobArchived means this operation is not permitted on an archived blob.\n\tServiceCodeBlobArchived ServiceCodeType = \"BlobArchived\"\n\n\t// ServiceCodeBlobNotArchived means this blob is currently not in the archived state.\n\tServiceCodeBlobNotArchived ServiceCodeType = \"BlobNotArchived\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_append_blob.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/url\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\nconst (\n\t// AppendBlobMaxAppendBlockBytes indicates the maximum number of bytes that can be sent in a call to AppendBlock.\n\tAppendBlobMaxAppendBlockBytes = 4 * 1024 * 1024 // 4MB\n\n\t// AppendBlobMaxBlocks indicates the maximum number of blocks allowed in an append blob.\n\tAppendBlobMaxBlocks = 50000\n)\n\n// AppendBlobURL defines a set of operations applicable to append blobs.\ntype AppendBlobURL struct {\n\tBlobURL\n\tabClient appendBlobClient\n}\n\n// NewAppendBlobURL creates an AppendBlobURL object using the specified URL and request policy pipeline.\nfunc NewAppendBlobURL(url url.URL, p pipeline.Pipeline) AppendBlobURL {\n\tblobClient := newBlobClient(url, p)\n\tabClient := newAppendBlobClient(url, p)\n\treturn AppendBlobURL{BlobURL: BlobURL{blobClient: blobClient}, abClient: abClient}\n}\n\n// WithPipeline creates a new AppendBlobURL object identical to the source but with the specific request policy pipeline.\nfunc (ab AppendBlobURL) WithPipeline(p pipeline.Pipeline) AppendBlobURL {\n\treturn NewAppendBlobURL(ab.blobClient.URL(), p)\n}\n\n// WithSnapshot creates a new AppendBlobURL object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (ab AppendBlobURL) WithSnapshot(snapshot string) AppendBlobURL {\n\tp := NewBlobURLParts(ab.URL())\n\tp.Snapshot = snapshot\n\treturn NewAppendBlobURL(p.URL(), ab.blobClient.Pipeline())\n}\n\n// Create creates a 0-length append blob. Call AppendBlock to append data to an append blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob.\nfunc (ab AppendBlobURL) Create(ctx context.Context, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*AppendBlobCreateResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.HTTPAccessConditions.pointers()\n\treturn ab.abClient.Create(ctx, 0, nil,\n\t\t&h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5,\n\t\t&h.CacheControl, metadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, nil)\n}\n\n// AppendBlock writes a stream to a new block of data to the end of the existing append blob.\n// This method panics if the stream is not at position 0.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block.\nfunc (ab AppendBlobURL) AppendBlock(ctx context.Context, body io.ReadSeeker, ac BlobAccessConditions) (*AppendBlobAppendBlockResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\tifAppendPositionEqual, ifMaxSizeLessThanOrEqual := ac.AppendBlobAccessConditions.pointers()\n\treturn ab.abClient.AppendBlock(ctx, body, validateSeekableStreamAt0AndGetCount(body), nil,\n\t\tac.LeaseAccessConditions.pointers(),\n\t\tifMaxSizeLessThanOrEqual, ifAppendPositionEqual,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// AppendBlobAccessConditions identifies append blob-specific access conditions which you optionally set.\ntype AppendBlobAccessConditions struct {\n\t// IfAppendPositionEqual ensures that the AppendBlock operation succeeds\n\t// only if the append position is equal to a value.\n\t// IfAppendPositionEqual=0 means no 'IfAppendPositionEqual' header specified.\n\t// IfAppendPositionEqual>0 means 'IfAppendPositionEqual' header specified with its value\n\t// IfAppendPositionEqual==-1 means IfAppendPositionEqual' header specified with a value of 0\n\tIfAppendPositionEqual int64\n\n\t// IfMaxSizeLessThanOrEqual ensures that the AppendBlock operation succeeds\n\t// only if the append blob's size is less than or equal to a value.\n\t// IfMaxSizeLessThanOrEqual=0 means no 'IfMaxSizeLessThanOrEqual' header specified.\n\t// IfMaxSizeLessThanOrEqual>0 means 'IfMaxSizeLessThanOrEqual' header specified with its value\n\t// IfMaxSizeLessThanOrEqual==-1 means 'IfMaxSizeLessThanOrEqual' header specified with a value of 0\n\tIfMaxSizeLessThanOrEqual int64\n}\n\n// pointers is for internal infrastructure. It returns the fields as pointers.\nfunc (ac AppendBlobAccessConditions) pointers() (iape *int64, imsltoe *int64) {\n\tif ac.IfAppendPositionEqual < -1 {\n\t\tpanic(\"IfAppendPositionEqual can't be less than -1\")\n\t}\n\tif ac.IfMaxSizeLessThanOrEqual < -1 {\n\t\tpanic(\"IfMaxSizeLessThanOrEqual can't be less than -1\")\n\t}\n\tvar zero int64 // defaults to 0\n\tswitch ac.IfAppendPositionEqual {\n\tcase -1:\n\t\tiape = &zero\n\tcase 0:\n\t\tiape = nil\n\tdefault:\n\t\tiape = &ac.IfAppendPositionEqual\n\t}\n\n\tswitch ac.IfMaxSizeLessThanOrEqual {\n\tcase -1:\n\t\timsltoe = &zero\n\tcase 0:\n\t\timsltoe = nil\n\tdefault:\n\t\timsltoe = &ac.IfMaxSizeLessThanOrEqual\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_blob.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"net/url\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// A BlobURL represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob.\ntype BlobURL struct {\n\tblobClient blobClient\n}\n\n// NewBlobURL creates a BlobURL object using the specified URL and request policy pipeline.\nfunc NewBlobURL(url url.URL, p pipeline.Pipeline) BlobURL {\n\tif p == nil {\n\t\tpanic(\"p can't be nil\")\n\t}\n\tblobClient := newBlobClient(url, p)\n\treturn BlobURL{blobClient: blobClient}\n}\n\n// URL returns the URL endpoint used by the BlobURL object.\nfunc (b BlobURL) URL() url.URL {\n\treturn b.blobClient.URL()\n}\n\n// String returns the URL as a string.\nfunc (b BlobURL) String() string {\n\tu := b.URL()\n\treturn u.String()\n}\n\n// WithPipeline creates a new BlobURL object identical to the source but with the specified request policy pipeline.\nfunc (b BlobURL) WithPipeline(p pipeline.Pipeline) BlobURL {\n\tif p == nil {\n\t\tpanic(\"p can't be nil\")\n\t}\n\treturn NewBlobURL(b.blobClient.URL(), p)\n}\n\n// WithSnapshot creates a new BlobURL object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (b BlobURL) WithSnapshot(snapshot string) BlobURL {\n\tp := NewBlobURLParts(b.URL())\n\tp.Snapshot = snapshot\n\treturn NewBlobURL(p.URL(), b.blobClient.Pipeline())\n}\n\n// ToAppendBlobURL creates an AppendBlobURL using the source's URL and pipeline.\nfunc (b BlobURL) ToAppendBlobURL() AppendBlobURL {\n\treturn NewAppendBlobURL(b.URL(), b.blobClient.Pipeline())\n}\n\n// ToBlockBlobURL creates a BlockBlobURL using the source's URL and pipeline.\nfunc (b BlobURL) ToBlockBlobURL() BlockBlobURL {\n\treturn NewBlockBlobURL(b.URL(), b.blobClient.Pipeline())\n}\n\n// ToPageBlobURL creates a PageBlobURL using the source's URL and pipeline.\nfunc (b BlobURL) ToPageBlobURL() PageBlobURL {\n\treturn NewPageBlobURL(b.URL(), b.blobClient.Pipeline())\n}\n\n// DownloadBlob reads a range of bytes from a blob. The response also includes the blob's properties and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob.\nfunc (b BlobURL) Download(ctx context.Context, offset int64, count int64, ac BlobAccessConditions, rangeGetContentMD5 bool) (*DownloadResponse, error) {\n\tvar xRangeGetContentMD5 *bool\n\tif rangeGetContentMD5 {\n\t\txRangeGetContentMD5 = &rangeGetContentMD5\n\t}\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\tdr, err := b.blobClient.Download(ctx, nil, nil,\n\t\thttpRange{offset: offset, count: count}.pointers(),\n\t\tac.LeaseAccessConditions.pointers(), xRangeGetContentMD5,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &DownloadResponse{\n\t\tb:       b,\n\t\tr:       dr,\n\t\tctx:     ctx,\n\t\tgetInfo: HTTPGetterInfo{Offset: offset, Count: count, ETag: dr.ETag()},\n\t}, err\n}\n\n// DeleteBlob marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection.\n// Note that deleting a blob also deletes all its snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob.\nfunc (b BlobURL) Delete(ctx context.Context, deleteOptions DeleteSnapshotsOptionType, ac BlobAccessConditions) (*BlobDeleteResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn b.blobClient.Delete(ctx, nil, nil, ac.LeaseAccessConditions.pointers(), deleteOptions,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob.\nfunc (b BlobURL) Undelete(ctx context.Context) (*BlobUndeleteResponse, error) {\n\treturn b.blobClient.Undelete(ctx, nil, nil)\n}\n\n// SetTier operation sets the tier on a blob. The operation is allowed on a page\n// blob in a premium storage account and on a block blob in a blob storage account (locally\n// redundant storage only). A premium page blob's tier determines the allowed size, IOPS, and\n// bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation\n// does not update the blob's ETag.\n// For detailed information about block blob level tiering see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers.\nfunc (b BlobURL) SetTier(ctx context.Context, tier AccessTierType) (*BlobSetTierResponse, error) {\n\treturn b.blobClient.SetTier(ctx, tier, nil, nil)\n}\n\n// GetBlobProperties returns the blob's properties.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties.\nfunc (b BlobURL) GetProperties(ctx context.Context, ac BlobAccessConditions) (*BlobGetPropertiesResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn b.blobClient.GetProperties(ctx, nil, nil, ac.LeaseAccessConditions.pointers(),\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// SetBlobHTTPHeaders changes a blob's HTTP headers.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties.\nfunc (b BlobURL) SetHTTPHeaders(ctx context.Context, h BlobHTTPHeaders, ac BlobAccessConditions) (*BlobSetHTTPHeadersResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn b.blobClient.SetHTTPHeaders(ctx, nil,\n\t\t&h.CacheControl, &h.ContentType, h.ContentMD5, &h.ContentEncoding, &h.ContentLanguage,\n\t\tac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag,\n\t\t&h.ContentDisposition, nil)\n}\n\n// SetBlobMetadata changes a blob's metadata.\n// https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata.\nfunc (b BlobURL) SetMetadata(ctx context.Context, metadata Metadata, ac BlobAccessConditions) (*BlobSetMetadataResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn b.blobClient.SetMetadata(ctx, nil, metadata, ac.LeaseAccessConditions.pointers(),\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// CreateSnapshot creates a read-only snapshot of a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob.\nfunc (b BlobURL) CreateSnapshot(ctx context.Context, metadata Metadata, ac BlobAccessConditions) (*BlobCreateSnapshotResponse, error) {\n\t// CreateSnapshot does NOT panic if the user tries to create a snapshot using a URL that already has a snapshot query parameter\n\t// because checking this would be a performance hit for a VERY unusual path and I don't think the common case should suffer this\n\t// performance hit.\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn b.blobClient.CreateSnapshot(ctx, nil, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, ac.LeaseAccessConditions.pointers(), nil)\n}\n\n// AcquireLease acquires a lease on the blob for write and delete operations. The lease duration must be between\n// 15 to 60 seconds, or infinite (-1).\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob.\nfunc (b BlobURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac HTTPAccessConditions) (*BlobAcquireLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers()\n\treturn b.blobClient.AcquireLease(ctx, nil, &duration, &proposedID,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// RenewLease renews the blob's previously-acquired lease.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob.\nfunc (b BlobURL) RenewLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*BlobRenewLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers()\n\treturn b.blobClient.RenewLease(ctx, leaseID, nil,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// ReleaseLease releases the blob's previously-acquired lease.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob.\nfunc (b BlobURL) ReleaseLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*BlobReleaseLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers()\n\treturn b.blobClient.ReleaseLease(ctx, leaseID, nil,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// BreakLease breaks the blob's previously-acquired lease (if it exists). Pass the LeaseBreakDefault (-1)\n// constant to break a fixed-duration lease when it expires or an infinite lease immediately.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob.\nfunc (b BlobURL) BreakLease(ctx context.Context, breakPeriodInSeconds int32, ac HTTPAccessConditions) (*BlobBreakLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers()\n\treturn b.blobClient.BreakLease(ctx, nil, leasePeriodPointer(breakPeriodInSeconds),\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// ChangeLease changes the blob's lease ID.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob.\nfunc (b BlobURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac HTTPAccessConditions) (*BlobChangeLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers()\n\treturn b.blobClient.ChangeLease(ctx, leaseID, proposedID,\n\t\tnil, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// LeaseBreakNaturally tells ContainerURL's or BlobURL's BreakLease method to break the lease using service semantics.\nconst LeaseBreakNaturally = -1\n\nfunc leasePeriodPointer(period int32) (p *int32) {\n\tif period != LeaseBreakNaturally {\n\t\tp = &period\n\t}\n\treturn nil\n}\n\n// StartCopyFromURL copies the data at the source URL to a blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob.\nfunc (b BlobURL) StartCopyFromURL(ctx context.Context, source url.URL, metadata Metadata, srcac BlobAccessConditions, dstac BlobAccessConditions) (*BlobStartCopyFromURLResponse, error) {\n\tsrcIfModifiedSince, srcIfUnmodifiedSince, srcIfMatchETag, srcIfNoneMatchETag := srcac.HTTPAccessConditions.pointers()\n\tdstIfModifiedSince, dstIfUnmodifiedSince, dstIfMatchETag, dstIfNoneMatchETag := dstac.HTTPAccessConditions.pointers()\n\tsrcLeaseID := srcac.LeaseAccessConditions.pointers()\n\tdstLeaseID := dstac.LeaseAccessConditions.pointers()\n\n\treturn b.blobClient.StartCopyFromURL(ctx, source.String(), nil, metadata,\n\t\tsrcIfModifiedSince, srcIfUnmodifiedSince,\n\t\tsrcIfMatchETag, srcIfNoneMatchETag,\n\t\tdstIfModifiedSince, dstIfUnmodifiedSince,\n\t\tdstIfMatchETag, dstIfNoneMatchETag,\n\t\tdstLeaseID, srcLeaseID, nil)\n}\n\n// AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob.\nfunc (b BlobURL) AbortCopyFromURL(ctx context.Context, copyID string, ac LeaseAccessConditions) (*BlobAbortCopyFromURLResponse, error) {\n\treturn b.blobClient.AbortCopyFromURL(ctx, copyID, nil, ac.pointers(), nil)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_block_blob.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/url\"\n\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\nconst (\n\t// BlockBlobMaxPutBlobBytes indicates the maximum number of bytes that can be sent in a call to Upload.\n\tBlockBlobMaxUploadBlobBytes = 256 * 1024 * 1024 // 256MB\n\n\t// BlockBlobMaxStageBlockBytes indicates the maximum number of bytes that can be sent in a call to StageBlock.\n\tBlockBlobMaxStageBlockBytes = 100 * 1024 * 1024 // 100MB\n\n\t// BlockBlobMaxBlocks indicates the maximum number of blocks allowed in a block blob.\n\tBlockBlobMaxBlocks = 50000\n)\n\n// BlockBlobURL defines a set of operations applicable to block blobs.\ntype BlockBlobURL struct {\n\tBlobURL\n\tbbClient blockBlobClient\n}\n\n// NewBlockBlobURL creates a BlockBlobURL object using the specified URL and request policy pipeline.\nfunc NewBlockBlobURL(url url.URL, p pipeline.Pipeline) BlockBlobURL {\n\tif p == nil {\n\t\tpanic(\"p can't be nil\")\n\t}\n\tblobClient := newBlobClient(url, p)\n\tbbClient := newBlockBlobClient(url, p)\n\treturn BlockBlobURL{BlobURL: BlobURL{blobClient: blobClient}, bbClient: bbClient}\n}\n\n// WithPipeline creates a new BlockBlobURL object identical to the source but with the specific request policy pipeline.\nfunc (bb BlockBlobURL) WithPipeline(p pipeline.Pipeline) BlockBlobURL {\n\treturn NewBlockBlobURL(bb.blobClient.URL(), p)\n}\n\n// WithSnapshot creates a new BlockBlobURL object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (bb BlockBlobURL) WithSnapshot(snapshot string) BlockBlobURL {\n\tp := NewBlobURLParts(bb.URL())\n\tp.Snapshot = snapshot\n\treturn NewBlockBlobURL(p.URL(), bb.blobClient.Pipeline())\n}\n\n// Upload creates a new block blob or overwrites an existing block blob.\n// Updating an existing block blob overwrites any existing metadata on the blob. Partial updates are not\n// supported with Upload; the content of the existing blob is overwritten with the new content. To\n// perform a partial update of a block blob, use StageBlock and CommitBlockList.\n// This method panics if the stream is not at position 0.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob.\nfunc (bb BlockBlobURL) Upload(ctx context.Context, body io.ReadSeeker, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*BlockBlobUploadResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn bb.bbClient.Upload(ctx, body, validateSeekableStreamAt0AndGetCount(body), nil,\n\t\t&h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5,\n\t\t&h.CacheControl, metadata, ac.LeaseAccessConditions.pointers(),\n\t\t&h.ContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag,\n\t\tnil)\n}\n\n// StageBlock uploads the specified block to the block blob's \"staging area\" to be later committed by a call to CommitBlockList.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block.\nfunc (bb BlockBlobURL) StageBlock(ctx context.Context, base64BlockID string, body io.ReadSeeker, ac LeaseAccessConditions) (*BlockBlobStageBlockResponse, error) {\n\treturn bb.bbClient.StageBlock(ctx, base64BlockID, validateSeekableStreamAt0AndGetCount(body), body, nil, ac.pointers(), nil)\n}\n\n// StageBlockFromURL copies the specified block from a source URL to the block blob's \"staging area\" to be later committed by a call to CommitBlockList.\n// If count is CountToEnd (0), then data is read from specified offset to the end.\n// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url.\nfunc (bb BlockBlobURL) StageBlockFromURL(ctx context.Context, base64BlockID string, sourceURL url.URL, offset int64, count int64, ac LeaseAccessConditions) (*BlockBlobStageBlockFromURLResponse, error) {\n\tsourceURLStr := sourceURL.String()\n\treturn bb.bbClient.StageBlockFromURL(ctx, base64BlockID, 0, &sourceURLStr, httpRange{offset: offset, count: count}.pointers(), nil, nil, ac.pointers(), nil)\n}\n\n// CommitBlockList writes a blob by specifying the list of block IDs that make up the blob.\n// In order to be written as part of a blob, a block must have been successfully written\n// to the server in a prior PutBlock operation. You can call PutBlockList to update a blob\n// by uploading only those blocks that have changed, then committing the new and existing\n// blocks together. Any blocks not specified in the block list and permanently deleted.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block-list.\nfunc (bb BlockBlobURL) CommitBlockList(ctx context.Context, base64BlockIDs []string, h BlobHTTPHeaders,\n\tmetadata Metadata, ac BlobAccessConditions) (*BlockBlobCommitBlockListResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn bb.bbClient.CommitBlockList(ctx, BlockLookupList{Latest: base64BlockIDs}, nil,\n\t\t&h.CacheControl, &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5,\n\t\tmetadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// GetBlockList returns the list of blocks that have been uploaded as part of a block blob using the specified block list filter.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-block-list.\nfunc (bb BlockBlobURL) GetBlockList(ctx context.Context, listType BlockListType, ac LeaseAccessConditions) (*BlockList, error) {\n\treturn bb.bbClient.GetBlockList(ctx, listType, nil, nil, ac.pointers(), nil)\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\ntype BlockID [64]byte\n\nfunc (blockID BlockID) ToBase64() string {\n\treturn base64.StdEncoding.EncodeToString(blockID[:])\n}\n\nfunc (blockID *BlockID) FromBase64(s string) error {\n\t*blockID = BlockID{} // Zero out the block ID\n\t_, err := base64.StdEncoding.Decode(blockID[:], ([]byte)(s))\n\treturn err\n}\n\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\ntype uuidBlockID BlockID\n\nfunc (ubi uuidBlockID) UUID() uuid {\n\tu := uuid{}\n\tcopy(u[:], ubi[:len(u)])\n\treturn u\n}\n\nfunc (ubi uuidBlockID) Number() uint32 {\n\treturn binary.BigEndian.Uint32(ubi[len(uuid{}):])\n}\n\nfunc newUuidBlockID(u uuid) uuidBlockID {\n\tubi := uuidBlockID{}     // Create a new uuidBlockID\n\tcopy(ubi[:len(u)], u[:]) // Copy the specified UUID into it\n\t// Block number defaults to 0\n\treturn ubi\n}\n\nfunc (ubi *uuidBlockID) SetUUID(u uuid) *uuidBlockID {\n\tcopy(ubi[:len(u)], u[:])\n\treturn ubi\n}\n\nfunc (ubi uuidBlockID) WithBlockNumber(blockNumber uint32) uuidBlockID {\n\tbinary.BigEndian.PutUint32(ubi[len(uuid{}):], blockNumber) // Put block number after UUID\n\treturn ubi                                                 // Return the passed-in copy\n}\n\nfunc (ubi uuidBlockID) ToBase64() string {\n\treturn BlockID(ubi).ToBase64()\n}\n\nfunc (ubi *uuidBlockID) FromBase64(s string) error {\n\treturn (*BlockID)(ubi).FromBase64(s)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_container.go",
    "content": "package azblob\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// A ContainerURL represents a URL to the Azure Storage container allowing you to manipulate its blobs.\ntype ContainerURL struct {\n\tclient containerClient\n}\n\n// NewContainerURL creates a ContainerURL object using the specified URL and request policy pipeline.\nfunc NewContainerURL(url url.URL, p pipeline.Pipeline) ContainerURL {\n\tif p == nil {\n\t\tpanic(\"p can't be nil\")\n\t}\n\tclient := newContainerClient(url, p)\n\treturn ContainerURL{client: client}\n}\n\n// URL returns the URL endpoint used by the ContainerURL object.\nfunc (c ContainerURL) URL() url.URL {\n\treturn c.client.URL()\n}\n\n// String returns the URL as a string.\nfunc (c ContainerURL) String() string {\n\tu := c.URL()\n\treturn u.String()\n}\n\n// WithPipeline creates a new ContainerURL object identical to the source but with the specified request policy pipeline.\nfunc (c ContainerURL) WithPipeline(p pipeline.Pipeline) ContainerURL {\n\treturn NewContainerURL(c.URL(), p)\n}\n\n// NewBlobURL creates a new BlobURL object by concatenating blobName to the end of\n// ContainerURL's URL. The new BlobURL uses the same request policy pipeline as the ContainerURL.\n// To change the pipeline, create the BlobURL and then call its WithPipeline method passing in the\n// desired pipeline object. Or, call this package's NewBlobURL instead of calling this object's\n// NewBlobURL method.\nfunc (c ContainerURL) NewBlobURL(blobName string) BlobURL {\n\tblobURL := appendToURLPath(c.URL(), blobName)\n\treturn NewBlobURL(blobURL, c.client.Pipeline())\n}\n\n// NewAppendBlobURL creates a new AppendBlobURL object by concatenating blobName to the end of\n// ContainerURL's URL. The new AppendBlobURL uses the same request policy pipeline as the ContainerURL.\n// To change the pipeline, create the AppendBlobURL and then call its WithPipeline method passing in the\n// desired pipeline object. Or, call this package's NewAppendBlobURL instead of calling this object's\n// NewAppendBlobURL method.\nfunc (c ContainerURL) NewAppendBlobURL(blobName string) AppendBlobURL {\n\tblobURL := appendToURLPath(c.URL(), blobName)\n\treturn NewAppendBlobURL(blobURL, c.client.Pipeline())\n}\n\n// NewBlockBlobURL creates a new BlockBlobURL object by concatenating blobName to the end of\n// ContainerURL's URL. The new BlockBlobURL uses the same request policy pipeline as the ContainerURL.\n// To change the pipeline, create the BlockBlobURL and then call its WithPipeline method passing in the\n// desired pipeline object. Or, call this package's NewBlockBlobURL instead of calling this object's\n// NewBlockBlobURL method.\nfunc (c ContainerURL) NewBlockBlobURL(blobName string) BlockBlobURL {\n\tblobURL := appendToURLPath(c.URL(), blobName)\n\treturn NewBlockBlobURL(blobURL, c.client.Pipeline())\n}\n\n// NewPageBlobURL creates a new PageBlobURL object by concatenating blobName to the end of\n// ContainerURL's URL. The new PageBlobURL uses the same request policy pipeline as the ContainerURL.\n// To change the pipeline, create the PageBlobURL and then call its WithPipeline method passing in the\n// desired pipeline object. Or, call this package's NewPageBlobURL instead of calling this object's\n// NewPageBlobURL method.\nfunc (c ContainerURL) NewPageBlobURL(blobName string) PageBlobURL {\n\tblobURL := appendToURLPath(c.URL(), blobName)\n\treturn NewPageBlobURL(blobURL, c.client.Pipeline())\n}\n\n// Create creates a new container within a storage account. If a container with the same name already exists, the operation fails.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/create-container.\nfunc (c ContainerURL) Create(ctx context.Context, metadata Metadata, publicAccessType PublicAccessType) (*ContainerCreateResponse, error) {\n\treturn c.client.Create(ctx, nil, metadata, publicAccessType, nil)\n}\n\n// Delete marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-container.\nfunc (c ContainerURL) Delete(ctx context.Context, ac ContainerAccessConditions) (*ContainerDeleteResponse, error) {\n\tif ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone {\n\t\tpanic(\"the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service\")\n\t}\n\n\tifModifiedSince, ifUnmodifiedSince, _, _ := ac.HTTPAccessConditions.pointers()\n\treturn c.client.Delete(ctx, nil, ac.LeaseAccessConditions.pointers(),\n\t\tifModifiedSince, ifUnmodifiedSince, nil)\n}\n\n// GetProperties returns the container's properties.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-metadata.\nfunc (c ContainerURL) GetProperties(ctx context.Context, ac LeaseAccessConditions) (*ContainerGetPropertiesResponse, error) {\n\t// NOTE: GetMetadata actually calls GetProperties internally because GetProperties returns the metadata AND the properties.\n\t// This allows us to not expose a GetProperties method at all simplifying the API.\n\treturn c.client.GetProperties(ctx, nil, ac.pointers(), nil)\n}\n\n// SetMetadata sets the container's metadata.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-metadata.\nfunc (c ContainerURL) SetMetadata(ctx context.Context, metadata Metadata, ac ContainerAccessConditions) (*ContainerSetMetadataResponse, error) {\n\tif !ac.IfUnmodifiedSince.IsZero() || ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone {\n\t\tpanic(\"the IfUnmodifiedSince, IfMatch, and IfNoneMatch must have their default values because they are ignored by the blob service\")\n\t}\n\tifModifiedSince, _, _, _ := ac.HTTPAccessConditions.pointers()\n\treturn c.client.SetMetadata(ctx, nil, ac.LeaseAccessConditions.pointers(), metadata, ifModifiedSince, nil)\n}\n\n// GetAccessPolicy returns the container's access policy. The access policy indicates whether container's blobs may be accessed publicly.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-acl.\nfunc (c ContainerURL) GetAccessPolicy(ctx context.Context, ac LeaseAccessConditions) (*SignedIdentifiers, error) {\n\treturn c.client.GetAccessPolicy(ctx, nil, ac.pointers(), nil)\n}\n\n// The AccessPolicyPermission type simplifies creating the permissions string for a container's access policy.\n// Initialize an instance of this type and then call its String method to set AccessPolicy's Permission field.\ntype AccessPolicyPermission struct {\n\tRead, Add, Create, Write, Delete, List bool\n}\n\n// String produces the access policy permission string for an Azure Storage container.\n// Call this method to set AccessPolicy's Permission field.\nfunc (p AccessPolicyPermission) String() string {\n\tvar b bytes.Buffer\n\tif p.Read {\n\t\tb.WriteRune('r')\n\t}\n\tif p.Add {\n\t\tb.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tb.WriteRune('c')\n\t}\n\tif p.Write {\n\t\tb.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tb.WriteRune('d')\n\t}\n\tif p.List {\n\t\tb.WriteRune('l')\n\t}\n\treturn b.String()\n}\n\n// Parse initializes the AccessPolicyPermission's fields from a string.\nfunc (p *AccessPolicyPermission) Parse(s string) error {\n\t*p = AccessPolicyPermission{} // Clear the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tcase 'l':\n\t\t\tp.List = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"invalid permission: '%v'\", r)\n\t\t}\n\t}\n\treturn nil\n}\n\n// SetAccessPolicy sets the container's permissions. The access policy indicates whether blobs in a container may be accessed publicly.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-acl.\nfunc (c ContainerURL) SetAccessPolicy(ctx context.Context, accessType PublicAccessType, si []SignedIdentifier,\n\tac ContainerAccessConditions) (*ContainerSetAccessPolicyResponse, error) {\n\tif ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone {\n\t\tpanic(\"the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service\")\n\t}\n\tifModifiedSince, ifUnmodifiedSince, _, _ := ac.HTTPAccessConditions.pointers()\n\treturn c.client.SetAccessPolicy(ctx, si, nil, ac.LeaseAccessConditions.pointers(),\n\t\taccessType, ifModifiedSince, ifUnmodifiedSince, nil)\n}\n\n// AcquireLease acquires a lease on the container for delete operations. The lease duration must be between 15 to 60 seconds, or infinite (-1).\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container.\nfunc (c ContainerURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac HTTPAccessConditions) (*ContainerAcquireLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers()\n\treturn c.client.AcquireLease(ctx, nil, &duration, &proposedID,\n\t\tifModifiedSince, ifUnmodifiedSince, nil)\n}\n\n// RenewLease renews the container's previously-acquired lease.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container.\nfunc (c ContainerURL) RenewLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*ContainerRenewLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers()\n\treturn c.client.RenewLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, nil)\n}\n\n// ReleaseLease releases the container's previously-acquired lease.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container.\nfunc (c ContainerURL) ReleaseLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*ContainerReleaseLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers()\n\treturn c.client.ReleaseLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, nil)\n}\n\n// BreakLease breaks the container's previously-acquired lease (if it exists).\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container.\nfunc (c ContainerURL) BreakLease(ctx context.Context, period int32, ac HTTPAccessConditions) (*ContainerBreakLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers()\n\treturn c.client.BreakLease(ctx, nil, leasePeriodPointer(period), ifModifiedSince, ifUnmodifiedSince, nil)\n}\n\n// ChangeLease changes the container's lease ID.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container.\nfunc (c ContainerURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac HTTPAccessConditions) (*ContainerChangeLeaseResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers()\n\treturn c.client.ChangeLease(ctx, leaseID, proposedID, nil, ifModifiedSince, ifUnmodifiedSince, nil)\n}\n\n// ListBlobsFlatSegment returns a single segment of blobs starting from the specified Marker. Use an empty\n// Marker to start enumeration from the beginning. Blob names are returned in lexicographic order.\n// After getting a segment, process it, and then call ListBlobsFlatSegment again (passing the the\n// previously-returned Marker) to get the next segment.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs.\nfunc (c ContainerURL) ListBlobsFlatSegment(ctx context.Context, marker Marker, o ListBlobsSegmentOptions) (*ListBlobsFlatSegmentResponse, error) {\n\tprefix, include, maxResults := o.pointers()\n\treturn c.client.ListBlobFlatSegment(ctx, prefix, marker.val, maxResults, include, nil, nil)\n}\n\n// ListBlobsHierarchySegment returns a single segment of blobs starting from the specified Marker. Use an empty\n// Marker to start enumeration from the beginning. Blob names are returned in lexicographic order.\n// After getting a segment, process it, and then call ListBlobsHierarchicalSegment again (passing the the\n// previously-returned Marker) to get the next segment.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs.\nfunc (c ContainerURL) ListBlobsHierarchySegment(ctx context.Context, marker Marker, delimiter string, o ListBlobsSegmentOptions) (*ListBlobsHierarchySegmentResponse, error) {\n\tif o.Details.Snapshots {\n\t\tpanic(\"snapshots are not supported in this listing operation\")\n\t}\n\tprefix, include, maxResults := o.pointers()\n\treturn c.client.ListBlobHierarchySegment(ctx, delimiter, prefix, marker.val, maxResults, include, nil, nil)\n}\n\n// ListBlobsSegmentOptions defines options available when calling ListBlobs.\ntype ListBlobsSegmentOptions struct {\n\tDetails BlobListingDetails // No IncludeType header is produced if \"\"\n\tPrefix  string             // No Prefix header is produced if \"\"\n\n\t// SetMaxResults sets the maximum desired results you want the service to return. Note, the\n\t// service may return fewer results than requested.\n\t// MaxResults=0 means no 'MaxResults' header specified.\n\tMaxResults int32\n}\n\nfunc (o *ListBlobsSegmentOptions) pointers() (prefix *string, include []ListBlobsIncludeItemType, maxResults *int32) {\n\tif o.Prefix != \"\" {\n\t\tprefix = &o.Prefix\n\t}\n\tinclude = o.Details.slice()\n\tif o.MaxResults != 0 {\n\t\tif o.MaxResults < 0 {\n\t\t\tpanic(\"MaxResults must be >= 0\")\n\t\t}\n\t\tmaxResults = &o.MaxResults\n\t}\n\treturn\n}\n\n// BlobListingDetails indicates what additional information the service should return with each blob.\ntype BlobListingDetails struct {\n\tCopy, Metadata, Snapshots, UncommittedBlobs, Deleted bool\n}\n\n// string produces the Include query parameter's value.\nfunc (d *BlobListingDetails) slice() []ListBlobsIncludeItemType {\n\titems := []ListBlobsIncludeItemType{}\n\t// NOTE: Multiple strings MUST be appended in alphabetic order or signing the string for authentication fails!\n\tif d.Copy {\n\t\titems = append(items, ListBlobsIncludeItemCopy)\n\t}\n\tif d.Deleted {\n\t\titems = append(items, ListBlobsIncludeItemDeleted)\n\t}\n\tif d.Metadata {\n\t\titems = append(items, ListBlobsIncludeItemMetadata)\n\t}\n\tif d.Snapshots {\n\t\titems = append(items, ListBlobsIncludeItemSnapshots)\n\t}\n\tif d.UncommittedBlobs {\n\t\titems = append(items, ListBlobsIncludeItemUncommittedblobs)\n\t}\n\treturn items\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_page_blob.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/url\"\n\t\"strconv\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\nconst (\n\t// PageBlobPageBytes indicates the number of bytes in a page (512).\n\tPageBlobPageBytes = 512\n\n\t// PageBlobMaxPutPagesBytes indicates the maximum number of bytes that can be sent in a call to PutPage.\n\tPageBlobMaxUploadPagesBytes = 4 * 1024 * 1024 // 4MB\n)\n\n// PageBlobURL defines a set of operations applicable to page blobs.\ntype PageBlobURL struct {\n\tBlobURL\n\tpbClient pageBlobClient\n}\n\n// NewPageBlobURL creates a PageBlobURL object using the specified URL and request policy pipeline.\nfunc NewPageBlobURL(url url.URL, p pipeline.Pipeline) PageBlobURL {\n\tif p == nil {\n\t\tpanic(\"p can't be nil\")\n\t}\n\tblobClient := newBlobClient(url, p)\n\tpbClient := newPageBlobClient(url, p)\n\treturn PageBlobURL{BlobURL: BlobURL{blobClient: blobClient}, pbClient: pbClient}\n}\n\n// WithPipeline creates a new PageBlobURL object identical to the source but with the specific request policy pipeline.\nfunc (pb PageBlobURL) WithPipeline(p pipeline.Pipeline) PageBlobURL {\n\treturn NewPageBlobURL(pb.blobClient.URL(), p)\n}\n\n// WithSnapshot creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp.\n// Pass \"\" to remove the snapshot returning a URL to the base blob.\nfunc (pb PageBlobURL) WithSnapshot(snapshot string) PageBlobURL {\n\tp := NewBlobURLParts(pb.URL())\n\tp.Snapshot = snapshot\n\treturn NewPageBlobURL(p.URL(), pb.blobClient.Pipeline())\n}\n\n// CreatePageBlob creates a page blob of the specified length. Call PutPage to upload data data to a page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob.\nfunc (pb PageBlobURL) Create(ctx context.Context, size int64, sequenceNumber int64, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*PageBlobCreateResponse, error) {\n\tif sequenceNumber < 0 {\n\t\tpanic(\"sequenceNumber must be greater than or equal to 0\")\n\t}\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn pb.pbClient.Create(ctx, 0, nil,\n\t\t&h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, &h.CacheControl,\n\t\tmetadata, ac.LeaseAccessConditions.pointers(),\n\t\t&h.ContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, &size, &sequenceNumber, nil)\n}\n\n// UploadPages writes 1 or more pages to the page blob. The start offset and the stream size must be a multiple of 512 bytes.\n// This method panics if the stream is not at position 0.\n// Note that the http client closes the body stream after the request is sent to the service.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page.\nfunc (pb PageBlobURL) UploadPages(ctx context.Context, offset int64, body io.ReadSeeker, ac BlobAccessConditions) (*PageBlobUploadPagesResponse, error) {\n\tcount := validateSeekableStreamAt0AndGetCount(body)\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\tifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.PageBlobAccessConditions.pointers()\n\treturn pb.pbClient.UploadPages(ctx, body, count, nil,\n\t\tPageRange{Start: offset, End: offset + count - 1}.pointers(),\n\t\tac.LeaseAccessConditions.pointers(),\n\t\tifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// ClearPages frees the specified pages from the page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page.\nfunc (pb PageBlobURL) ClearPages(ctx context.Context, offset int64, count int64, ac BlobAccessConditions) (*PageBlobClearPagesResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\tifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.PageBlobAccessConditions.pointers()\n\treturn pb.pbClient.ClearPages(ctx, 0, nil,\n\t\tPageRange{Start: offset, End: offset + count - 1}.pointers(),\n\t\tac.LeaseAccessConditions.pointers(),\n\t\tifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan,\n\t\tifSequenceNumberEqual, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// GetPageRanges returns the list of valid page ranges for a page blob or snapshot of a page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges.\nfunc (pb PageBlobURL) GetPageRanges(ctx context.Context, offset int64, count int64, ac BlobAccessConditions) (*PageList, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn pb.pbClient.GetPageRanges(ctx, nil, nil,\n\t\thttpRange{offset: offset, count: count}.pointers(),\n\t\tac.LeaseAccessConditions.pointers(),\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// GetPageRangesDiff gets the collection of page ranges that differ between a specified snapshot and this page blob.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges.\nfunc (pb PageBlobURL) GetPageRangesDiff(ctx context.Context, offset int64, count int64, prevSnapshot string, ac BlobAccessConditions) (*PageList, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn pb.pbClient.GetPageRangesDiff(ctx, nil, nil, &prevSnapshot,\n\t\thttpRange{offset: offset, count: count}.pointers(),\n\t\tac.LeaseAccessConditions.pointers(),\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag,\n\t\tnil)\n}\n\n// Resize resizes the page blob to the specified size (which must be a multiple of 512).\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties.\nfunc (pb PageBlobURL) Resize(ctx context.Context, size int64, ac BlobAccessConditions) (*PageBlobResizeResponse, error) {\n\tif size%PageBlobPageBytes != 0 {\n\t\tpanic(\"Size must be a multiple of PageBlobPageBytes (512)\")\n\t}\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\treturn pb.pbClient.Resize(ctx, size, nil, ac.LeaseAccessConditions.pointers(),\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\n// SetSequenceNumber sets the page blob's sequence number.\nfunc (pb PageBlobURL) UpdateSequenceNumber(ctx context.Context, action SequenceNumberActionType, sequenceNumber int64,\n\tac BlobAccessConditions) (*PageBlobUpdateSequenceNumberResponse, error) {\n\tif sequenceNumber < 0 {\n\t\tpanic(\"sequenceNumber must be greater than or equal to 0\")\n\t}\n\tsn := &sequenceNumber\n\tif action == SequenceNumberActionIncrement {\n\t\tsn = nil\n\t}\n\tifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.HTTPAccessConditions.pointers()\n\treturn pb.pbClient.UpdateSequenceNumber(ctx, action, nil,\n\t\tac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch,\n\t\tsn, nil)\n}\n\n// StartIncrementalCopy begins an operation to start an incremental copy from one page blob's snapshot to this page blob.\n// The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination.\n// The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob and\n// https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots.\nfunc (pb PageBlobURL) StartCopyIncremental(ctx context.Context, source url.URL, snapshot string, ac BlobAccessConditions) (*PageBlobCopyIncrementalResponse, error) {\n\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers()\n\tqp := source.Query()\n\tqp.Set(\"snapshot\", snapshot)\n\tsource.RawQuery = qp.Encode()\n\treturn pb.pbClient.CopyIncremental(ctx, source.String(), nil, nil,\n\t\tifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil)\n}\n\nfunc (pr PageRange) pointers() *string {\n\tif pr.Start < 0 {\n\t\tpanic(\"PageRange's Start value must be greater than or equal to 0\")\n\t}\n\tif pr.End <= 0 {\n\t\tpanic(\"PageRange's End value must be greater than 0\")\n\t}\n\tif pr.Start%PageBlobPageBytes != 0 {\n\t\tpanic(\"PageRange's Start value must be a multiple of 512\")\n\t}\n\tif pr.End%PageBlobPageBytes != (PageBlobPageBytes - 1) {\n\t\tpanic(\"PageRange's End value must be 1 less than a multiple of 512\")\n\t}\n\tif pr.End <= pr.Start {\n\t\tpanic(\"PageRange's End value must be after the start\")\n\t}\n\tendOffset := strconv.FormatInt(int64(pr.End), 10)\n\tasString := fmt.Sprintf(\"bytes=%v-%s\", pr.Start, endOffset)\n\treturn &asString\n}\n\n// PageBlobAccessConditions identifies page blob-specific access conditions which you optionally set.\ntype PageBlobAccessConditions struct {\n\t// IfSequenceNumberLessThan ensures that the page blob operation succeeds\n\t// only if the blob's sequence number is less than a value.\n\t// IfSequenceNumberLessThan=0 means no 'IfSequenceNumberLessThan' header specified.\n\t// IfSequenceNumberLessThan>0 means 'IfSequenceNumberLessThan' header specified with its value\n\t// IfSequenceNumberLessThan==-1 means 'IfSequenceNumberLessThan' header specified with a value of 0\n\tIfSequenceNumberLessThan int64\n\n\t// IfSequenceNumberLessThanOrEqual ensures that the page blob operation succeeds\n\t// only if the blob's sequence number is less than or equal to a value.\n\t// IfSequenceNumberLessThanOrEqual=0 means no 'IfSequenceNumberLessThanOrEqual' header specified.\n\t// IfSequenceNumberLessThanOrEqual>0 means 'IfSequenceNumberLessThanOrEqual' header specified with its value\n\t// IfSequenceNumberLessThanOrEqual=-1 means 'IfSequenceNumberLessThanOrEqual' header specified with a value of 0\n\tIfSequenceNumberLessThanOrEqual int64\n\n\t// IfSequenceNumberEqual ensures that the page blob operation succeeds\n\t// only if the blob's sequence number is equal to a value.\n\t// IfSequenceNumberEqual=0 means no 'IfSequenceNumberEqual' header specified.\n\t// IfSequenceNumberEqual>0 means 'IfSequenceNumberEqual' header specified with its value\n\t// IfSequenceNumberEqual=-1 means 'IfSequenceNumberEqual' header specified with a value of 0\n\tIfSequenceNumberEqual int64\n}\n\n// pointers is for internal infrastructure. It returns the fields as pointers.\nfunc (ac PageBlobAccessConditions) pointers() (snltoe *int64, snlt *int64, sne *int64) {\n\tif ac.IfSequenceNumberLessThan < -1 {\n\t\tpanic(\"Ifsequencenumberlessthan can't be less than -1\")\n\t}\n\tif ac.IfSequenceNumberLessThanOrEqual < -1 {\n\t\tpanic(\"IfSequenceNumberLessThanOrEqual can't be less than -1\")\n\t}\n\tif ac.IfSequenceNumberEqual < -1 {\n\t\tpanic(\"IfSequenceNumberEqual can't be less than -1\")\n\t}\n\n\tvar zero int64 // Defaults to 0\n\tswitch ac.IfSequenceNumberLessThan {\n\tcase -1:\n\t\tsnlt = &zero\n\tcase 0:\n\t\tsnlt = nil\n\tdefault:\n\t\tsnlt = &ac.IfSequenceNumberLessThan\n\t}\n\n\tswitch ac.IfSequenceNumberLessThanOrEqual {\n\tcase -1:\n\t\tsnltoe = &zero\n\tcase 0:\n\t\tsnltoe = nil\n\tdefault:\n\t\tsnltoe = &ac.IfSequenceNumberLessThanOrEqual\n\t}\n\tswitch ac.IfSequenceNumberEqual {\n\tcase -1:\n\t\tsne = &zero\n\tcase 0:\n\t\tsne = nil\n\tdefault:\n\t\tsne = &ac.IfSequenceNumberEqual\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_service.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\nconst (\n\t// ContainerNameRoot is the special Azure Storage name used to identify a storage account's root container.\n\tContainerNameRoot = \"$root\"\n\n\t// ContainerNameLogs is the special Azure Storage name used to identify a storage account's logs container.\n\tContainerNameLogs = \"$logs\"\n)\n\n// A ServiceURL represents a URL to the Azure Storage Blob service allowing you to manipulate blob containers.\ntype ServiceURL struct {\n\tclient serviceClient\n}\n\n// NewServiceURL creates a ServiceURL object using the specified URL and request policy pipeline.\nfunc NewServiceURL(primaryURL url.URL, p pipeline.Pipeline) ServiceURL {\n\tif p == nil {\n\t\tpanic(\"p can't be nil\")\n\t}\n\tclient := newServiceClient(primaryURL, p)\n\treturn ServiceURL{client: client}\n}\n\n// URL returns the URL endpoint used by the ServiceURL object.\nfunc (s ServiceURL) URL() url.URL {\n\treturn s.client.URL()\n}\n\n// String returns the URL as a string.\nfunc (s ServiceURL) String() string {\n\tu := s.URL()\n\treturn u.String()\n}\n\n// WithPipeline creates a new ServiceURL object identical to the source but with the specified request policy pipeline.\nfunc (s ServiceURL) WithPipeline(p pipeline.Pipeline) ServiceURL {\n\treturn NewServiceURL(s.URL(), p)\n}\n\n// NewContainerURL creates a new ContainerURL object by concatenating containerName to the end of\n// ServiceURL's URL. The new ContainerURL uses the same request policy pipeline as the ServiceURL.\n// To change the pipeline, create the ContainerURL and then call its WithPipeline method passing in the\n// desired pipeline object. Or, call this package's NewContainerURL instead of calling this object's\n// NewContainerURL method.\nfunc (s ServiceURL) NewContainerURL(containerName string) ContainerURL {\n\tcontainerURL := appendToURLPath(s.URL(), containerName)\n\treturn NewContainerURL(containerURL, s.client.Pipeline())\n}\n\n// appendToURLPath appends a string to the end of a URL's path (prefixing the string with a '/' if required)\nfunc appendToURLPath(u url.URL, name string) url.URL {\n\t// e.g. \"https://ms.com/a/b/?k1=v1&k2=v2#f\"\n\t// When you call url.Parse() this is what you'll get:\n\t//     Scheme: \"https\"\n\t//     Opaque: \"\"\n\t//       User: nil\n\t//       Host: \"ms.com\"\n\t//       Path: \"/a/b/\"\tThis should start with a / and it might or might not have a trailing slash\n\t//    RawPath: \"\"\n\t// ForceQuery: false\n\t//   RawQuery: \"k1=v1&k2=v2\"\n\t//   Fragment: \"f\"\n\tif len(u.Path) == 0 || u.Path[len(u.Path)-1] != '/' {\n\t\tu.Path += \"/\" // Append \"/\" to end before appending name\n\t}\n\tu.Path += name\n\treturn u\n}\n\n// ListContainersFlatSegment returns a single segment of containers starting from the specified Marker. Use an empty\n// Marker to start enumeration from the beginning. Container names are returned in lexicographic order.\n// After getting a segment, process it, and then call ListContainersFlatSegment again (passing the the\n// previously-returned Marker) to get the next segment. For more information, see\n// https://docs.microsoft.com/rest/api/storageservices/list-containers2.\nfunc (s ServiceURL) ListContainersSegment(ctx context.Context, marker Marker, o ListContainersSegmentOptions) (*ListContainersResponse, error) {\n\tprefix, include, maxResults := o.pointers()\n\treturn s.client.ListContainersSegment(ctx, prefix, marker.val, maxResults, include, nil, nil)\n}\n\n// ListContainersOptions defines options available when calling ListContainers.\ntype ListContainersSegmentOptions struct {\n\tDetail     ListContainersDetail // No IncludeType header is produced if \"\"\n\tPrefix     string                   // No Prefix header is produced if \"\"\n\tMaxResults int32                    // 0 means unspecified\n\t// TODO: update swagger to generate this type?\n}\n\nfunc (o *ListContainersSegmentOptions) pointers() (prefix *string, include ListContainersIncludeType, maxResults *int32) {\n\tif o.Prefix != \"\" {\n\t\tprefix = &o.Prefix\n\t}\n\tif o.MaxResults != 0 {\n\t\tif o.MaxResults < 0 {\n\t\t\tpanic(\"MaxResults must be >= 0\")\n\t\t}\n\t\tmaxResults = &o.MaxResults\n\t}\n\tinclude = ListContainersIncludeType(o.Detail.string())\n\treturn\n}\n\n// ListContainersFlatDetail indicates what additional information the service should return with each container.\ntype ListContainersDetail struct {\n\t// Tells the service whether to return metadata for each container.\n\tMetadata bool\n}\n\n// string produces the Include query parameter's value.\nfunc (d *ListContainersDetail) string() string {\n\titems := make([]string, 0, 1)\n\t// NOTE: Multiple strings MUST be appended in alphabetic order or signing the string for authentication fails!\n\tif d.Metadata {\n\t\titems = append(items, string(ListContainersIncludeMetadata))\n\t}\n\tif len(items) > 0 {\n\t\treturn strings.Join(items, \",\")\n\t}\n\treturn string(ListContainersIncludeNone)\n}\n\nfunc (bsu ServiceURL) GetProperties(ctx context.Context) (*StorageServiceProperties, error) {\n\treturn bsu.client.GetProperties(ctx, nil, nil)\n}\n\nfunc (bsu ServiceURL) SetProperties(ctx context.Context, properties StorageServiceProperties) (*ServiceSetPropertiesResponse, error) {\n\treturn bsu.client.SetProperties(ctx, properties, nil, nil)\n}\n\nfunc (bsu ServiceURL) GetStatistics(ctx context.Context) (*StorageServiceStats, error) {\n\treturn bsu.client.GetStatistics(ctx, nil, nil)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/version.go",
    "content": "package azblob\n\nconst serviceLibVersion = \"0.1\"\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_anonymous.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// Credential represent any credential type; it is used to create a credential policy Factory.\ntype Credential interface {\n\tpipeline.Factory\n\tcredentialMarker()\n}\n\ntype credentialFunc pipeline.FactoryFunc\n\nfunc (f credentialFunc) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {\n\treturn f(next, po)\n}\n\n// credentialMarker is a package-internal method that exists just to satisfy the Credential interface.\nfunc (credentialFunc) credentialMarker() {}\n\n//////////////////////////////\n\n// NewAnonymousCredential creates an anonymous credential for use with HTTP(S) requests that read public resource\n// or for use with Shared Access Signatures (SAS).\nfunc NewAnonymousCredential() Credential {\n\treturn anonymousCredentialFactory\n}\n\nvar anonymousCredentialFactory Credential = &anonymousCredentialPolicyFactory{} // Singleton\n\n// anonymousCredentialPolicyFactory is the credential's policy factory.\ntype anonymousCredentialPolicyFactory struct {\n}\n\n// New creates a credential policy object.\nfunc (f *anonymousCredentialPolicyFactory) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {\n\treturn &anonymousCredentialPolicy{next: next}\n}\n\n// credentialMarker is a package-internal method that exists just to satisfy the Credential interface.\nfunc (*anonymousCredentialPolicyFactory) credentialMarker() {}\n\n// anonymousCredentialPolicy is the credential's policy object.\ntype anonymousCredentialPolicy struct {\n\tnext pipeline.Policy\n}\n\n// Do implements the credential's policy interface.\nfunc (p anonymousCredentialPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {\n\t// For anonymous credentials, this is effectively a no-op\n\treturn p.next.Do(ctx, request)\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_shared_key.go",
    "content": "package azblob\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"sort\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// NewSharedKeyCredential creates an immutable SharedKeyCredential containing the\n// storage account's name and either its primary or secondary key.\nfunc NewSharedKeyCredential(accountName, accountKey string) *SharedKeyCredential {\n\tbytes, err := base64.StdEncoding.DecodeString(accountKey)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn &SharedKeyCredential{accountName: accountName, accountKey: bytes}\n}\n\n// SharedKeyCredential contains an account's name and its primary or secondary key.\n// It is immutable making it shareable and goroutine-safe.\ntype SharedKeyCredential struct {\n\t// Only the NewSharedKeyCredential method should set these; all other methods should treat them as read-only\n\taccountName string\n\taccountKey  []byte\n}\n\n// AccountName returns the Storage account's name.\nfunc (f SharedKeyCredential) AccountName() string {\n\treturn f.accountName\n}\n\n// New creates a credential policy object.\nfunc (f *SharedKeyCredential) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {\n\treturn pipeline.PolicyFunc(func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {\n\t\t// Add a x-ms-date header if it doesn't already exist\n\t\tif d := request.Header.Get(headerXmsDate); d == \"\" {\n\t\t\trequest.Header[headerXmsDate] = []string{time.Now().UTC().Format(http.TimeFormat)}\n\t\t}\n\t\tstringToSign := f.buildStringToSign(request)\n\t\tsignature := f.ComputeHMACSHA256(stringToSign)\n\t\tauthHeader := strings.Join([]string{\"SharedKey \", f.accountName, \":\", signature}, \"\")\n\t\trequest.Header[headerAuthorization] = []string{authHeader}\n\n\t\tresponse, err := next.Do(ctx, request)\n\t\tif err != nil && response != nil && response.Response() != nil && response.Response().StatusCode == http.StatusForbidden {\n\t\t\t// Service failed to authenticate request, log it\n\t\t\tpo.Log(pipeline.LogError, \"===== HTTP Forbidden status, String-to-Sign:\\n\"+stringToSign+\"\\n===============================\\n\")\n\t\t}\n\t\treturn response, err\n\t})\n}\n\n// credentialMarker is a package-internal method that exists just to satisfy the Credential interface.\nfunc (*SharedKeyCredential) credentialMarker() {}\n\n// Constants ensuring that header names are correctly spelled and consistently cased.\nconst (\n\theaderAuthorization      = \"Authorization\"\n\theaderCacheControl       = \"Cache-Control\"\n\theaderContentEncoding    = \"Content-Encoding\"\n\theaderContentDisposition = \"Content-Disposition\"\n\theaderContentLanguage    = \"Content-Language\"\n\theaderContentLength      = \"Content-Length\"\n\theaderContentMD5         = \"Content-MD5\"\n\theaderContentType        = \"Content-Type\"\n\theaderDate               = \"Date\"\n\theaderIfMatch            = \"If-Match\"\n\theaderIfModifiedSince    = \"If-Modified-Since\"\n\theaderIfNoneMatch        = \"If-None-Match\"\n\theaderIfUnmodifiedSince  = \"If-Unmodified-Since\"\n\theaderRange              = \"Range\"\n\theaderUserAgent          = \"User-Agent\"\n\theaderXmsDate            = \"x-ms-date\"\n\theaderXmsVersion         = \"x-ms-version\"\n)\n\n// ComputeHMACSHA256 generates a hash signature for an HTTP request or for a SAS.\nfunc (f *SharedKeyCredential) ComputeHMACSHA256(message string) (base64String string) {\n\th := hmac.New(sha256.New, f.accountKey)\n\th.Write([]byte(message))\n\treturn base64.StdEncoding.EncodeToString(h.Sum(nil))\n}\n\nfunc (f *SharedKeyCredential) buildStringToSign(request pipeline.Request) string {\n\t// https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services\n\theaders := request.Header\n\tcontentLength := headers.Get(headerContentLength)\n\tif contentLength == \"0\" {\n\t\tcontentLength = \"\"\n\t}\n\n\tstringToSign := strings.Join([]string{\n\t\trequest.Method,\n\t\theaders.Get(headerContentEncoding),\n\t\theaders.Get(headerContentLanguage),\n\t\tcontentLength,\n\t\theaders.Get(headerContentMD5),\n\t\theaders.Get(headerContentType),\n\t\t\"\", // Empty date because x-ms-date is expected (as per web page above)\n\t\theaders.Get(headerIfModifiedSince),\n\t\theaders.Get(headerIfMatch),\n\t\theaders.Get(headerIfNoneMatch),\n\t\theaders.Get(headerIfUnmodifiedSince),\n\t\theaders.Get(headerRange),\n\t\tbuildCanonicalizedHeader(headers),\n\t\tf.buildCanonicalizedResource(request.URL),\n\t}, \"\\n\")\n\treturn stringToSign\n}\n\nfunc buildCanonicalizedHeader(headers http.Header) string {\n\tcm := map[string][]string{}\n\tfor k, v := range headers {\n\t\theaderName := strings.TrimSpace(strings.ToLower(k))\n\t\tif strings.HasPrefix(headerName, \"x-ms-\") {\n\t\t\tcm[headerName] = v // NOTE: the value must not have any whitespace around it.\n\t\t}\n\t}\n\tif len(cm) == 0 {\n\t\treturn \"\"\n\t}\n\n\tkeys := make([]string, 0, len(cm))\n\tfor key := range cm {\n\t\tkeys = append(keys, key)\n\t}\n\tsort.Strings(keys)\n\tch := bytes.NewBufferString(\"\")\n\tfor i, key := range keys {\n\t\tif i > 0 {\n\t\t\tch.WriteRune('\\n')\n\t\t}\n\t\tch.WriteString(key)\n\t\tch.WriteRune(':')\n\t\tch.WriteString(strings.Join(cm[key], \",\"))\n\t}\n\treturn string(ch.Bytes())\n}\n\nfunc (f *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) string {\n\t// https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services\n\tcr := bytes.NewBufferString(\"/\")\n\tcr.WriteString(f.accountName)\n\n\tif len(u.Path) > 0 {\n\t\t// Any portion of the CanonicalizedResource string that is derived from\n\t\t// the resource's URI should be encoded exactly as it is in the URI.\n\t\t// -- https://msdn.microsoft.com/en-gb/library/azure/dd179428.aspx\n\t\tcr.WriteString(u.EscapedPath())\n\t} else {\n\t\t// a slash is required to indicate the root path\n\t\tcr.WriteString(\"/\")\n\t}\n\n\t// params is a map[string][]string; param name is key; params values is []string\n\tparams, err := url.ParseQuery(u.RawQuery) // Returns URL decoded values\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif len(params) > 0 { // There is at least 1 query parameter\n\t\tparamNames := []string{} // We use this to sort the parameter key names\n\t\tfor paramName := range params {\n\t\t\tparamNames = append(paramNames, paramName) // paramNames must be lowercase\n\t\t}\n\t\tsort.Strings(paramNames)\n\n\t\tfor _, paramName := range paramNames {\n\t\t\tparamValues := params[paramName]\n\t\t\tsort.Strings(paramValues)\n\n\t\t\t// Join the sorted key values separated by ','\n\t\t\t// Then prepend \"keyName:\"; then add this string to the buffer\n\t\t\tcr.WriteString(\"\\n\" + paramName + \":\" + strings.Join(paramValues, \",\"))\n\t\t}\n\t}\n\treturn string(cr.Bytes())\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_token.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"sync/atomic\"\n\n\t\"runtime\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// TokenCredential represents a token credential (which is also a pipeline.Factory).\ntype TokenCredential interface {\n\tCredential\n\tToken() string\n\tSetToken(newToken string)\n}\n\n// NewTokenCredential creates a token credential for use with role-based access control (RBAC) access to Azure Storage\n// resources. You initialize the TokenCredential with an initial token value. If you pass a non-nil value for\n// tokenRefresher, then the function you pass will be called immediately (so it can refresh and change the\n// TokenCredential's token value by calling SetToken; your tokenRefresher function must return a time.Duration\n// indicating how long the TokenCredential object should wait before calling your tokenRefresher function again.\nfunc NewTokenCredential(initialToken string, tokenRefresher func(credential TokenCredential) time.Duration) TokenCredential {\n\ttc := &tokenCredential{}\n\ttc.SetToken(initialToken) // We dont' set it above to guarantee atomicity\n\tif tokenRefresher == nil {\n\t\treturn tc // If no callback specified, return the simple tokenCredential\n\t}\n\n\ttcwr := &tokenCredentialWithRefresh{token: tc}\n\ttcwr.token.startRefresh(tokenRefresher)\n\truntime.SetFinalizer(tcwr, func(deadTC *tokenCredentialWithRefresh) {\n\t\tdeadTC.token.stopRefresh()\n\t\tdeadTC.token = nil //  Sanity (not really required)\n\t})\n\treturn tcwr\n}\n\n// tokenCredentialWithRefresh is a wrapper over a token credential.\n// When this wrapper object gets GC'd, it stops the tokenCredential's timer\n// which allows the tokenCredential object to also be GC'd.\ntype tokenCredentialWithRefresh struct {\n\ttoken *tokenCredential\n}\n\n// credentialMarker is a package-internal method that exists just to satisfy the Credential interface.\nfunc (*tokenCredentialWithRefresh) credentialMarker() {}\n\n// Token returns the current token value\nfunc (f *tokenCredentialWithRefresh) Token() string { return f.token.Token() }\n\n// SetToken changes the current token value\nfunc (f *tokenCredentialWithRefresh) SetToken(token string) { f.token.SetToken(token) }\n\n// New satisfies pipeline.Factory's New method creating a pipeline policy object.\nfunc (f *tokenCredentialWithRefresh) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {\n\treturn f.token.New(next, po)\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// tokenCredential is a pipeline.Factory is the credential's policy factory.\ntype tokenCredential struct {\n\ttoken atomic.Value\n\n\t// The members below are only used if the user specified a tokenRefresher callback function.\n\ttimer          *time.Timer\n\ttokenRefresher func(c TokenCredential) time.Duration\n\tlock           sync.Mutex\n\tstopped        bool\n}\n\n// credentialMarker is a package-internal method that exists just to satisfy the Credential interface.\nfunc (*tokenCredential) credentialMarker() {}\n\n// Token returns the current token value\nfunc (f *tokenCredential) Token() string { return f.token.Load().(string) }\n\n// SetToken changes the current token value\nfunc (f *tokenCredential) SetToken(token string) { f.token.Store(token) }\n\n// startRefresh calls refresh which immediately calls tokenRefresher\n// and then starts a timer to call tokenRefresher in the future.\nfunc (f *tokenCredential) startRefresh(tokenRefresher func(c TokenCredential) time.Duration) {\n\tf.tokenRefresher = tokenRefresher\n\tf.stopped = false // In case user calls StartRefresh, StopRefresh, & then StartRefresh again\n\tf.refresh()\n}\n\n// refresh calls the user's tokenRefresher so they can refresh the token (by\n// calling SetToken) and then starts another time (based on the returned duration)\n// in order to refresh the token again in the future.\nfunc (f *tokenCredential) refresh() {\n\td := f.tokenRefresher(f) // Invoke the user's refresh callback outside of the lock\n\tf.lock.Lock()\n\tif !f.stopped {\n\t\tf.timer = time.AfterFunc(d, f.refresh)\n\t}\n\tf.lock.Unlock()\n}\n\n// stopRefresh stops any pending timer and sets stopped field to true to prevent\n// any new timer from starting.\n// NOTE: Stopping the timer allows the GC to destroy the tokenCredential object.\nfunc (f *tokenCredential) stopRefresh() {\n\tf.lock.Lock()\n\tf.stopped = true\n\tif f.timer != nil {\n\t\tf.timer.Stop()\n\t}\n\tf.lock.Unlock()\n}\n\n// New satisfies pipeline.Factory's New method creating a pipeline policy object.\nfunc (f *tokenCredential) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {\n\treturn pipeline.PolicyFunc(func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {\n\t\tif request.URL.Scheme != \"https\" {\n\t\t\tpanic(\"Token credentials require a URL using the https protocol scheme.\")\n\t\t}\n\t\trequest.Header[headerAuthorization] = []string{\"Bearer \" + f.Token()}\n\t\treturn next.Do(ctx, request)\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_unix.go",
    "content": "// +build linux darwin freebsd\n\npackage azblob\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\ntype mmf []byte\n\nfunc newMMF(file *os.File, writable bool, offset int64, length int) (mmf, error) {\n\tprot, flags := syscall.PROT_READ, syscall.MAP_SHARED // Assume read-only\n\tif writable {\n\t\tprot, flags = syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED\n\t}\n\taddr, err := syscall.Mmap(int(file.Fd()), offset, length, prot, flags)\n\treturn mmf(addr), err\n}\n\nfunc (m *mmf) unmap() {\n\terr := syscall.Munmap(*m)\n\t*m = nil\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go",
    "content": "package azblob\n\nimport (\n\t\"os\"\n\t\"reflect\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\ntype mmf []byte\n\nfunc newMMF(file *os.File, writable bool, offset int64, length int) (mmf, error) {\n\tprot, access := uint32(syscall.PAGE_READONLY), uint32(syscall.FILE_MAP_READ) // Assume read-only\n\tif writable {\n\t\tprot, access = uint32(syscall.PAGE_READWRITE), uint32(syscall.FILE_MAP_WRITE)\n\t}\n\thMMF, errno := syscall.CreateFileMapping(syscall.Handle(file.Fd()), nil, prot, uint32(int64(length)>>32), uint32(int64(length)&0xffffffff), nil)\n\tif hMMF == 0 {\n\t\treturn nil, os.NewSyscallError(\"CreateFileMapping\", errno)\n\t}\n\tdefer syscall.CloseHandle(hMMF)\n\taddr, errno := syscall.MapViewOfFile(hMMF, access, uint32(offset>>32), uint32(offset&0xffffffff), uintptr(length))\n\tm := mmf{}\n\th := (*reflect.SliceHeader)(unsafe.Pointer(&m))\n\th.Data = addr\n\th.Len = length\n\th.Cap = h.Len\n\treturn m, nil\n}\n\nfunc (m *mmf) unmap() {\n\taddr := uintptr(unsafe.Pointer(&(([]byte)(*m)[0])))\n\t*m = mmf{}\n\terr := syscall.UnmapViewOfFile(addr)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_pipeline.go",
    "content": "package azblob\n\nimport (\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// PipelineOptions is used to configure a request policy pipeline's retry policy and logging.\ntype PipelineOptions struct {\n\t// Log configures the pipeline's logging infrastructure indicating what information is logged and where.\n\tLog pipeline.LogOptions\n\n\t// Retry configures the built-in retry policy behavior.\n\tRetry RetryOptions\n\n\t// RequestLog configures the built-in request logging policy.\n\tRequestLog RequestLogOptions\n\n\t// Telemetry configures the built-in telemetry policy behavior.\n\tTelemetry TelemetryOptions\n}\n\n// NewPipeline creates a Pipeline using the specified credentials and options.\nfunc NewPipeline(c Credential, o PipelineOptions) pipeline.Pipeline {\n\tif c == nil {\n\t\tpanic(\"c can't be nil\")\n\t}\n\n\t// Closest to API goes first; closest to the wire goes last\n\tf := []pipeline.Factory{\n\t\tNewTelemetryPolicyFactory(o.Telemetry),\n\t\tNewUniqueRequestIDPolicyFactory(),\n\t\tNewRetryPolicyFactory(o.Retry),\n\t}\n\n\tif _, ok := c.(*anonymousCredentialPolicyFactory); !ok {\n\t\t// For AnonymousCredential, we optimize out the policy factory since it doesn't do anything\n\t\t// NOTE: The credential's policy factory must appear close to the wire so it can sign any\n\t\t// changes made by other factories (like UniqueRequestIDPolicyFactory)\n\t\tf = append(f, c)\n\t}\n\tf = append(f,\n\t\tpipeline.MethodFactoryMarker(), // indicates at what stage in the pipeline the method factory is invoked\n\t\tNewRequestLogPolicyFactory(o.RequestLog))\n\n\treturn pipeline.NewPipeline(f, pipeline.Options{HTTPSender: nil, Log: o.Log})\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_request_log.go",
    "content": "package azblob\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// RequestLogOptions configures the retry policy's behavior.\ntype RequestLogOptions struct {\n\t// LogWarningIfTryOverThreshold logs a warning if a tried operation takes longer than the specified\n\t// duration (-1=no logging; 0=default threshold).\n\tLogWarningIfTryOverThreshold time.Duration\n}\n\nfunc (o RequestLogOptions) defaults() RequestLogOptions {\n\tif o.LogWarningIfTryOverThreshold == 0 {\n\t\t// It would be good to relate this to https://azure.microsoft.com/en-us/support/legal/sla/storage/v1_2/\n\t\t// But this monitors the time to get the HTTP response; NOT the time to download the response body.\n\t\to.LogWarningIfTryOverThreshold = 3 * time.Second // Default to 3 seconds\n\t}\n\treturn o\n}\n\n// NewRequestLogPolicyFactory creates a RequestLogPolicyFactory object configured using the specified options.\nfunc NewRequestLogPolicyFactory(o RequestLogOptions) pipeline.Factory {\n\to = o.defaults() // Force defaults to be calculated\n\treturn pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc {\n\t\t// These variables are per-policy; shared by multiple calls to Do\n\t\tvar try int32\n\t\toperationStart := time.Now() // If this is the 1st try, record the operation state time\n\t\treturn func(ctx context.Context, request pipeline.Request) (response pipeline.Response, err error) {\n\t\t\ttry++ // The first try is #1 (not #0)\n\n\t\t\t// Log the outgoing request as informational\n\t\t\tif po.ShouldLog(pipeline.LogInfo) {\n\t\t\t\tb := &bytes.Buffer{}\n\t\t\t\tfmt.Fprintf(b, \"==> OUTGOING REQUEST (Try=%d)\\n\", try)\n\t\t\t\tpipeline.WriteRequestWithResponse(b, prepareRequestForLogging(request), nil, nil)\n\t\t\t\tpo.Log(pipeline.LogInfo, b.String())\n\t\t\t}\n\n\t\t\t// Set the time for this particular retry operation and then Do the operation.\n\t\t\ttryStart := time.Now()\n\t\t\tresponse, err = next.Do(ctx, request) // Make the request\n\t\t\ttryEnd := time.Now()\n\t\t\ttryDuration := tryEnd.Sub(tryStart)\n\t\t\topDuration := tryEnd.Sub(operationStart)\n\n\t\t\tlogLevel, forceLog := pipeline.LogInfo, false // Default logging information\n\n\t\t\t// If the response took too long, we'll upgrade to warning.\n\t\t\tif o.LogWarningIfTryOverThreshold > 0 && tryDuration > o.LogWarningIfTryOverThreshold {\n\t\t\t\t// Log a warning if the try duration exceeded the specified threshold\n\t\t\t\tlogLevel, forceLog = pipeline.LogWarning, true\n\t\t\t}\n\n\t\t\tif err == nil { // We got a response from the service\n\t\t\t\tsc := response.Response().StatusCode\n\t\t\t\tif ((sc >= 400 && sc <= 499) && sc != http.StatusNotFound && sc != http.StatusConflict && sc != http.StatusPreconditionFailed && sc != http.StatusRequestedRangeNotSatisfiable) || (sc >= 500 && sc <= 599) {\n\t\t\t\t\tlogLevel, forceLog = pipeline.LogError, true // Promote to Error any 4xx (except those listed is an error) or any 5xx\n\t\t\t\t} else {\n\t\t\t\t\t// For other status codes, we leave the level as is.\n\t\t\t\t}\n\t\t\t} else { // This error did not get an HTTP response from the service; upgrade the severity to Error\n\t\t\t\tlogLevel, forceLog = pipeline.LogError, true\n\t\t\t}\n\n\t\t\tif shouldLog := po.ShouldLog(logLevel); forceLog || shouldLog {\n\t\t\t\t// We're going to log this; build the string to log\n\t\t\t\tb := &bytes.Buffer{}\n\t\t\t\tslow := \"\"\n\t\t\t\tif o.LogWarningIfTryOverThreshold > 0 && tryDuration > o.LogWarningIfTryOverThreshold {\n\t\t\t\t\tslow = fmt.Sprintf(\"[SLOW >%v]\", o.LogWarningIfTryOverThreshold)\n\t\t\t\t}\n\t\t\t\tfmt.Fprintf(b, \"==> REQUEST/RESPONSE (Try=%d/%v%s, OpTime=%v) -- \", try, tryDuration, slow, opDuration)\n\t\t\t\tif err != nil { // This HTTP request did not get a response from the service\n\t\t\t\t\tfmt.Fprint(b, \"REQUEST ERROR\\n\")\n\t\t\t\t} else {\n\t\t\t\t\tif logLevel == pipeline.LogError {\n\t\t\t\t\t\tfmt.Fprint(b, \"RESPONSE STATUS CODE ERROR\\n\")\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfmt.Fprint(b, \"RESPONSE SUCCESSFULLY RECEIVED\\n\")\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpipeline.WriteRequestWithResponse(b, prepareRequestForLogging(request), response.Response(), err)\n\t\t\t\tif logLevel <= pipeline.LogError {\n\t\t\t\t\tb.Write(stack()) // For errors (or lower levels), we append the stack trace (an expensive operation)\n\t\t\t\t}\n\t\t\t\tmsg := b.String()\n\n\t\t\t\tif forceLog {\n\t\t\t\t\tpipeline.ForceLog(logLevel, msg)\n\t\t\t\t}\n\t\t\t\tif shouldLog {\n\t\t\t\t\tpo.Log(logLevel, msg)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn response, err\n\t\t}\n\t})\n}\n\nfunc redactSigQueryParam(rawQuery string) (bool, string) {\n\trawQuery = strings.ToLower(rawQuery) // lowercase the string so we can look for ?sig= and &sig=\n\tsigFound := strings.Contains(rawQuery, \"?sig=\")\n\tif !sigFound {\n\t\tsigFound = strings.Contains(rawQuery, \"&sig=\")\n\t\tif !sigFound {\n\t\t\treturn sigFound, rawQuery // [?|&]sig= not found; return same rawQuery passed in (no memory allocation)\n\t\t}\n\t}\n\t// [?|&]sig= found, redact its value\n\tvalues, _ := url.ParseQuery(rawQuery)\n\tfor name := range values {\n\t\tif strings.EqualFold(name, \"sig\") {\n\t\t\tvalues[name] = []string{\"REDACTED\"}\n\t\t}\n\t}\n\treturn sigFound, values.Encode()\n}\n\nfunc prepareRequestForLogging(request pipeline.Request) *http.Request {\n\treq := request\n\tif sigFound, rawQuery := redactSigQueryParam(req.URL.RawQuery); sigFound {\n\t\t// Make copy so we don't destroy the query parameters we actually need to send in the request\n\t\treq = request.Copy()\n\t\treq.Request.URL.RawQuery = rawQuery\n\t}\n\treturn req.Request\n}\n\nfunc stack() []byte {\n\tbuf := make([]byte, 1024)\n\tfor {\n\t\tn := runtime.Stack(buf, false)\n\t\tif n < len(buf) {\n\t\t\treturn buf[:n]\n\t\t}\n\t\tbuf = make([]byte, 2*len(buf))\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_retry.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"math/rand\"\n\t\"net\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"io/ioutil\"\n\t\"io\"\n)\n\n// RetryPolicy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants.\ntype RetryPolicy int32\n\nconst (\n\t// RetryPolicyExponential tells the pipeline to use an exponential back-off retry policy\n\tRetryPolicyExponential RetryPolicy = 0\n\n\t// RetryPolicyFixed tells the pipeline to use a fixed back-off retry policy\n\tRetryPolicyFixed RetryPolicy = 1\n)\n\n// RetryOptions configures the retry policy's behavior.\ntype RetryOptions struct {\n\t// Policy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants.\\\n\t// A value of zero means that you accept our default policy.\n\tPolicy RetryPolicy\n\n\t// MaxTries specifies the maximum number of attempts an operation will be tried before producing an error (0=default).\n\t// A value of zero means that you accept our default policy. A value of 1 means 1 try and no retries.\n\tMaxTries int32\n\n\t// TryTimeout indicates the maximum time allowed for any single try of an HTTP request.\n\t// A value of zero means that you accept our default timeout. NOTE: When transferring large amounts\n\t// of data, the default TryTimeout will probably not be sufficient. You should override this value\n\t// based on the bandwidth available to the host machine and proximity to the Storage service. A good\n\t// starting point may be something like (60 seconds per MB of anticipated-payload-size).\n\tTryTimeout time.Duration\n\n\t// RetryDelay specifies the amount of delay to use before retrying an operation (0=default).\n\t// When RetryPolicy is specified as RetryPolicyExponential, the delay increases exponentially\n\t// with each retry up to a maximum specified by MaxRetryDelay.\n\t// If you specify 0, then you must also specify 0 for MaxRetryDelay.\n\t// If you specify RetryDelay, then you must also specify MaxRetryDelay, and MaxRetryDelay should be\n\t// equal to or greater than RetryDelay.\n\tRetryDelay time.Duration\n\n\t// MaxRetryDelay specifies the maximum delay allowed before retrying an operation (0=default).\n\t// If you specify 0, then you must also specify 0 for RetryDelay.\n\tMaxRetryDelay time.Duration\n\n\t// RetryReadsFromSecondaryHost specifies whether the retry policy should retry a read operation against another host.\n\t// If RetryReadsFromSecondaryHost is \"\" (the default) then operations are not retried against another host.\n\t// NOTE: Before setting this field, make sure you understand the issues around reading stale & potentially-inconsistent\n\t// data at this webpage: https://docs.microsoft.com/en-us/azure/storage/common/storage-designing-ha-apps-with-ragrs\n\tRetryReadsFromSecondaryHost string\t// Comment this our for non-Blob SDKs\n}\n\nfunc (o RetryOptions) retryReadsFromSecondaryHost() string {\n\treturn o.RetryReadsFromSecondaryHost\t// This is for the Blob SDK only\n\t//return \"\" // This is for non-blob SDKs\n}\n\nfunc (o RetryOptions) defaults() RetryOptions {\n\tif o.Policy != RetryPolicyExponential && o.Policy != RetryPolicyFixed {\n\t\tpanic(\"RetryPolicy must be RetryPolicyExponential or RetryPolicyFixed\")\n\t}\n\tif o.MaxTries < 0 {\n\t\tpanic(\"MaxTries must be >= 0\")\n\t}\n\tif o.TryTimeout < 0 || o.RetryDelay < 0 || o.MaxRetryDelay < 0 {\n\t\tpanic(\"TryTimeout, RetryDelay, and MaxRetryDelay must all be >= 0\")\n\t}\n\tif o.RetryDelay > o.MaxRetryDelay {\n\t\tpanic(\"RetryDelay must be <= MaxRetryDelay\")\n\t}\n\tif (o.RetryDelay == 0 && o.MaxRetryDelay != 0) || (o.RetryDelay != 0 && o.MaxRetryDelay == 0) {\n\t\tpanic(\"Both RetryDelay and MaxRetryDelay must be 0 or neither can be 0\")\n\t}\n\n\tIfDefault := func(current *time.Duration, desired time.Duration) {\n\t\tif *current == time.Duration(0) {\n\t\t\t*current = desired\n\t\t}\n\t}\n\n\t// Set defaults if unspecified\n\tif o.MaxTries == 0 {\n\t\to.MaxTries = 4\n\t}\n\tswitch o.Policy {\n\tcase RetryPolicyExponential:\n\t\tIfDefault(&o.TryTimeout, 1*time.Minute)\n\t\tIfDefault(&o.RetryDelay, 4*time.Second)\n\t\tIfDefault(&o.MaxRetryDelay, 120*time.Second)\n\n\tcase RetryPolicyFixed:\n\t\tIfDefault(&o.TryTimeout, 1*time.Minute)\n\t\tIfDefault(&o.RetryDelay, 30*time.Second)\n\t\tIfDefault(&o.MaxRetryDelay, 120*time.Second)\n\t}\n\treturn o\n}\n\nfunc (o RetryOptions) calcDelay(try int32) time.Duration { // try is >=1; never 0\n\tpow := func(number int64, exponent int32) int64 { // pow is nested helper function\n\t\tvar result int64 = 1\n\t\tfor n := int32(0); n < exponent; n++ {\n\t\t\tresult *= number\n\t\t}\n\t\treturn result\n\t}\n\n\tdelay := time.Duration(0)\n\tswitch o.Policy {\n\tcase RetryPolicyExponential:\n\t\tdelay = time.Duration(pow(2, try-1)-1) * o.RetryDelay\n\n\tcase RetryPolicyFixed:\n\t\tif try > 1 { // Any try after the 1st uses the fixed delay\n\t\t\tdelay = o.RetryDelay\n\t\t}\n\t}\n\n\t// Introduce some jitter:  [0.0, 1.0) / 2 = [0.0, 0.5) + 0.8 = [0.8, 1.3)\n\tdelay = time.Duration(delay.Seconds() * (rand.Float64()/2 + 0.8) * float64(time.Second)) // NOTE: We want math/rand; not crypto/rand\n\tif delay > o.MaxRetryDelay {\n\t\tdelay = o.MaxRetryDelay\n\t}\n\treturn delay\n}\n\n// NewRetryPolicyFactory creates a RetryPolicyFactory object configured using the specified options.\nfunc NewRetryPolicyFactory(o RetryOptions) pipeline.Factory {\n\to = o.defaults() // Force defaults to be calculated\n\treturn pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc {\n\t\treturn func(ctx context.Context, request pipeline.Request) (response pipeline.Response, err error) {\n\t\t\t// Before each try, we'll select either the primary or secondary URL.\n\t\t\tprimaryTry := int32(0) // This indicates how many tries we've attempted against the primary DC\n\n\t\t\t// We only consider retrying against a secondary if we have a read request (GET/HEAD) AND this policy has a Secondary URL it can use\n\t\t\tconsiderSecondary := (request.Method == http.MethodGet || request.Method == http.MethodHead) && o.retryReadsFromSecondaryHost() != \"\"\n\n\t\t\t// Exponential retry algorithm: ((2 ^ attempt) - 1) * delay * random(0.8, 1.2)\n\t\t\t// When to retry: connection failure or temporary/timeout. NOTE: StorageError considers HTTP 500/503 as temporary & is therefore retryable\n\t\t\t// If using a secondary:\n\t\t\t//    Even tries go against primary; odd tries go against the secondary\n\t\t\t//    For a primary wait ((2 ^ primaryTries - 1) * delay * random(0.8, 1.2)\n\t\t\t//    If secondary gets a 404, don't fail, retry but future retries are only against the primary\n\t\t\t//    When retrying against a secondary, ignore the retry count and wait (.1 second * random(0.8, 1.2))\n\t\t\tfor try := int32(1); try <= o.MaxTries; try++ {\n\t\t\t\tlogf(\"\\n=====> Try=%d\\n\", try)\n\n\t\t\t\t// Determine which endpoint to try. It's primary if there is no secondary or if it is an add # attempt.\n\t\t\t\ttryingPrimary := !considerSecondary || (try%2 == 1)\n\t\t\t\t// Select the correct host and delay\n\t\t\t\tif tryingPrimary {\n\t\t\t\t\tprimaryTry++\n\t\t\t\t\tdelay := o.calcDelay(primaryTry)\n\t\t\t\t\tlogf(\"Primary try=%d, Delay=%v\\n\", primaryTry, delay)\n\t\t\t\t\ttime.Sleep(delay) // The 1st try returns 0 delay\n\t\t\t\t} else {\n\t\t\t\t\tdelay := time.Second * time.Duration(rand.Float32()/2+0.8)\n\t\t\t\t\tlogf(\"Secondary try=%d, Delay=%v\\n\", try-primaryTry, delay)\n\t\t\t\t\ttime.Sleep(delay) // Delay with some jitter before trying secondary\n\t\t\t\t}\n\n\t\t\t\t// Clone the original request to ensure that each try starts with the original (unmutated) request.\n\t\t\t\trequestCopy := request.Copy()\n\n\t\t\t\t// For each try, seek to the beginning of the Body stream. We do this even for the 1st try because\n\t\t\t\t// the stream may not be at offset 0 when we first get it and we want the same behavior for the\n\t\t\t\t// 1st try as for additional tries.\n\t\t\t\tif err = requestCopy.RewindBody(); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t\tif !tryingPrimary {\n\t\t\t\t\trequestCopy.Request.URL.Host = o.retryReadsFromSecondaryHost()\n\t\t\t\t}\n\n\t\t\t\t// Set the server-side timeout query parameter \"timeout=[seconds]\"\n\t\t\t\ttimeout := int32(o.TryTimeout.Seconds()) // Max seconds per try\n\t\t\t\tif deadline, ok := ctx.Deadline(); ok {  // If user's ctx has a deadline, make the timeout the smaller of the two\n\t\t\t\t\tt := int32(deadline.Sub(time.Now()).Seconds()) // Duration from now until user's ctx reaches its deadline\n\t\t\t\t\tlogf(\"MaxTryTimeout=%d secs, TimeTilDeadline=%d sec\\n\", timeout, t)\n\t\t\t\t\tif t < timeout {\n\t\t\t\t\t\ttimeout = t\n\t\t\t\t\t}\n\t\t\t\t\tif timeout < 0 {\n\t\t\t\t\t\ttimeout = 0 // If timeout ever goes negative, set it to zero; this happen while debugging\n\t\t\t\t\t}\n\t\t\t\t\tlogf(\"TryTimeout adjusted to=%d sec\\n\", timeout)\n\t\t\t\t}\n\t\t\t\tq := requestCopy.Request.URL.Query()\n\t\t\t\tq.Set(\"timeout\", strconv.Itoa(int(timeout+1))) // Add 1 to \"round up\"\n\t\t\t\trequestCopy.Request.URL.RawQuery = q.Encode()\n\t\t\t\tlogf(\"Url=%s\\n\", requestCopy.Request.URL.String())\n\n\t\t\t\t// Set the time for this particular retry operation and then Do the operation.\n\t\t\t\ttryCtx, tryCancel := context.WithTimeout(ctx, time.Second*time.Duration(timeout))\n\t\t\t\t//requestCopy.Body = &deadlineExceededReadCloser{r: requestCopy.Request.Body}\n\t\t\t\tresponse, err = next.Do(tryCtx, requestCopy) // Make the request\n\t\t\t\t/*err = improveDeadlineExceeded(err)\n\t\t\t\tif err == nil {\n\t\t\t\t\tresponse.Response().Body = &deadlineExceededReadCloser{r: response.Response().Body}\n\t\t\t\t}*/\n\t\t\t\tlogf(\"Err=%v, response=%v\\n\", err, response)\n\n\t\t\t\taction := \"\" // This MUST get changed within the switch code below\n\t\t\t\tswitch {\n\t\t\t\tcase ctx.Err() != nil:\n\t\t\t\t\taction = \"NoRetry: Op timeout\"\n\t\t\t\tcase !tryingPrimary && response != nil && response.Response().StatusCode == http.StatusNotFound:\n\t\t\t\t\t// If attempt was against the secondary & it returned a StatusNotFound (404), then\n\t\t\t\t\t// the resource was not found. This may be due to replication delay. So, in this\n\t\t\t\t\t// case, we'll never try the secondary again for this operation.\n\t\t\t\t\tconsiderSecondary = false\n\t\t\t\t\taction = \"Retry: Secondary URL returned 404\"\n\t\t\t\tcase err != nil:\n\t\t\t\t\t// NOTE: Protocol Responder returns non-nil if REST API returns invalid status code for the invoked operation\n\t\t\t\t\tif netErr, ok := err.(net.Error); ok && (netErr.Temporary() || netErr.Timeout()) {\n\t\t\t\t\t\taction = \"Retry: net.Error and Temporary() or Timeout()\"\n\t\t\t\t\t} else {\n\t\t\t\t\t\taction = \"NoRetry: unrecognized error\"\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\taction = \"NoRetry: successful HTTP request\" // no error\n\t\t\t\t}\n\n\t\t\t\tlogf(\"Action=%s\\n\", action)\n\t\t\t\t// fmt.Println(action + \"\\n\") // This is where we could log the retry operation; action is why we're retrying\n\t\t\t\tif action[0] != 'R' { // Retry only if action starts with 'R'\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\ttryCancel() // If we're returning an error, cancel this current/last per-retry timeout context\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// TODO: Right now, we've decided to leak the per-try Context until the user's Context is canceled.\n\t\t\t\t\t\t// Another option is that we wrap the last per-try context in a body and overwrite the Response's Body field with our wrapper.\n\t\t\t\t\t\t// So, when the user closes the Body, the our per-try context gets closed too.\n\t\t\t\t\t\t// Another option, is that the Last Policy do this wrapping for a per-retry context (not for the user's context)\n\t\t\t\t\t\t_ = tryCancel // So, for now, we don't call cancel: cancel()\n\t\t\t\t\t}\n\t\t\t\t\tbreak // Don't retry\n\t\t\t\t}\n\t\t\t\tif response != nil && response.Response() != nil && response.Response().Body != nil {\n\t\t\t\t\t// If we're going to retry and we got a previous response, then flush its body to avoid leaking its TCP connection\n\t\t\t\t\tbody := response.Response().Body\n\t\t\t\t\tio.Copy(ioutil.Discard, body)\n\t\t\t\t\tbody.Close()\n\t\t\t\t}\n\t\t\t\t// If retrying, cancel the current per-try timeout context\n\t\t\t\ttryCancel()\n\t\t\t}\n\t\t\treturn response, err // Not retryable or too many retries; return the last response/error\n\t\t}\n\t})\n}\n\n// According to https://github.com/golang/go/wiki/CompilerOptimizations, the compiler will inline this method and hopefully optimize all calls to it away\nvar logf = func(format string, a ...interface{}) {}\n\n// Use this version to see the retry method's code path (import \"fmt\")\n//var logf = fmt.Printf\n\n/*\ntype deadlineExceededReadCloser struct {\n\tr io.ReadCloser\n}\n\nfunc (r *deadlineExceededReadCloser) Read(p []byte) (int, error) {\n\tn, err := 0, io.EOF\n\tif r.r != nil {\n\t\tn, err = r.r.Read(p)\n\t}\n\treturn n, improveDeadlineExceeded(err)\n}\nfunc (r *deadlineExceededReadCloser) Seek(offset int64, whence int) (int64, error) {\n\t// For an HTTP request, the ReadCloser MUST also implement seek\n\t// For an HTTP response, Seek MUST not be called (or this will panic)\n\to, err := r.r.(io.Seeker).Seek(offset, whence)\n\treturn o, improveDeadlineExceeded(err)\n}\nfunc (r *deadlineExceededReadCloser) Close() error {\n\tif c, ok := r.r.(io.Closer); ok {\n\t\tc.Close()\n\t}\n\treturn nil\n}\n\n// timeoutError is the internal struct that implements our richer timeout error.\ntype deadlineExceeded struct {\n\tresponseError\n}\n\nvar _ net.Error = (*deadlineExceeded)(nil) // Ensure deadlineExceeded implements the net.Error interface at compile time\n\n// improveDeadlineExceeded creates a timeoutError object that implements the error interface IF cause is a context.DeadlineExceeded error.\nfunc improveDeadlineExceeded(cause error) error {\n\t// If cause is not DeadlineExceeded, return the same error passed in.\n\tif cause != context.DeadlineExceeded {\n\t\treturn cause\n\t}\n\t// Else, convert DeadlineExceeded to our timeoutError which gives a richer string message\n\treturn &deadlineExceeded{\n\t\tresponseError: responseError{\n\t\t\tErrorNode: pipeline.ErrorNode{}.Initialize(cause, 3),\n\t\t},\n\t}\n}\n\n// Error implements the error interface's Error method to return a string representation of the error.\nfunc (e *deadlineExceeded) Error() string {\n\treturn e.ErrorNode.Error(\"context deadline exceeded; when creating a pipeline, consider increasing RetryOptions' TryTimeout field\")\n}\n*/\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_telemetry.go",
    "content": "package azblob\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// TelemetryOptions configures the telemetry policy's behavior.\ntype TelemetryOptions struct {\n\t// Value is a string prepended to each request's User-Agent and sent to the service.\n\t// The service records the user-agent in logs for diagnostics and tracking of client requests.\n\tValue string\n}\n\n// NewTelemetryPolicyFactory creates a factory that can create telemetry policy objects\n// which add telemetry information to outgoing HTTP requests.\nfunc NewTelemetryPolicyFactory(o TelemetryOptions) pipeline.Factory {\n\tb := &bytes.Buffer{}\n\tb.WriteString(o.Value)\n\tif b.Len() > 0 {\n\t\tb.WriteRune(' ')\n\t}\n\tfmt.Fprintf(b, \"Azure-Storage/%s %s\", serviceLibVersion, platformInfo)\n\ttelemetryValue := b.String()\n\n\treturn pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc {\n\t\treturn func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {\n\t\t\trequest.Header.Set(\"User-Agent\", telemetryValue)\n\t\t\treturn next.Do(ctx, request)\n\t\t}\n\t})\n}\n\n// NOTE: the ONLY function that should write to this variable is this func\nvar platformInfo = func() string {\n\t// Azure-Storage/version (runtime; os type and version)”\n\t// Azure-Storage/1.4.0 (NODE-VERSION v4.5.0; Windows_NT 10.0.14393)'\n\toperatingSystem := runtime.GOOS // Default OS string\n\tswitch operatingSystem {\n\tcase \"windows\":\n\t\toperatingSystem = os.Getenv(\"OS\") // Get more specific OS information\n\tcase \"linux\": // accept default OS info\n\tcase \"freebsd\": //  accept default OS info\n\t}\n\treturn fmt.Sprintf(\"(%s; %s)\", runtime.Version(), operatingSystem)\n}()\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_unique_request_id.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// NewUniqueRequestIDPolicyFactory creates a UniqueRequestIDPolicyFactory object\n// that sets the request's x-ms-client-request-id header if it doesn't already exist.\nfunc NewUniqueRequestIDPolicyFactory() pipeline.Factory {\n\treturn pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc {\n\t\t// This is Policy's Do method:\n\t\treturn func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {\n\t\t\tid := request.Header.Get(xMsClientRequestID)\n\t\t\tif id == \"\" { // Add a unique request ID if the caller didn't specify one already\n\t\t\t\trequest.Header.Set(xMsClientRequestID, newUUID().String())\n\t\t\t}\n\t\t\treturn next.Do(ctx, request)\n\t\t}\n\t})\n}\n\nconst xMsClientRequestID = \"x-ms-client-request-id\"\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_retry_reader.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n)\n\nconst CountToEnd = 0\n\n// HTTPGetter is a function type that refers to a method that performs an HTTP GET operation.\ntype HTTPGetter func(ctx context.Context, i HTTPGetterInfo) (*http.Response, error)\n\n// HTTPGetterInfo is passed to an HTTPGetter function passing it parameters\n// that should be used to make an HTTP GET request.\ntype HTTPGetterInfo struct {\n\t// Offset specifies the start offset that should be used when\n\t// creating the HTTP GET request's Range header\n\tOffset int64\n\n\t// Count specifies the count of bytes that should be used to calculate\n\t// the end offset when creating the HTTP GET request's Range header\n\tCount int64\n\n\t// ETag specifies the resource's etag that should be used when creating\n\t// the HTTP GET request's If-Match header\n\tETag ETag\n}\n\n// RetryReaderOptions contains properties which can help to decide when to do retry.\ntype RetryReaderOptions struct {\n\t// MaxRetryRequests specifies the maximum number of HTTP GET requests that will be made\n\t// while reading from a RetryReader. A value of zero means that no additional HTTP\n\t// GET requests will be made.\n\tMaxRetryRequests   int\n\tdoInjectError      bool\n\tdoInjectErrorRound int\n}\n\n// retryReader implements io.ReaderCloser methods.\n// retryReader tries to read from response, and if there is retriable network error\n// returned during reading, it will retry according to retry reader option through executing\n// user defined action with provided data to get a new response, and continue the overall reading process\n// through reading from the new response.\ntype retryReader struct {\n\tctx             context.Context\n\tresponse        *http.Response\n\tinfo            HTTPGetterInfo\n\tcountWasBounded bool\n\to               RetryReaderOptions\n\tgetter          HTTPGetter\n}\n\n// NewRetryReader creates a retry reader.\nfunc NewRetryReader(ctx context.Context, initialResponse *http.Response,\n\tinfo HTTPGetterInfo, o RetryReaderOptions, getter HTTPGetter) io.ReadCloser {\n\tif getter == nil {\n\t\tpanic(\"getter must not be nil\")\n\t}\n\tif info.Count < 0 {\n\t\tpanic(\"info.Count must be >= 0\")\n\t}\n\tif o.MaxRetryRequests < 0 {\n\t\tpanic(\"o.MaxRetryRequests must be >= 0\")\n\t}\n\treturn &retryReader{ctx: ctx, getter: getter, info: info, countWasBounded: info.Count != CountToEnd, response: initialResponse, o: o}\n}\n\nfunc (s *retryReader) Read(p []byte) (n int, err error) {\n\tfor try := 0; ; try++ {\n\t\t//fmt.Println(try)       // Comment out for debugging.\n\t\tif s.countWasBounded && s.info.Count == CountToEnd {\n\t\t\t// User specified an original count and the remaining bytes are 0, return 0, EOF\n\t\t\treturn 0, io.EOF\n\t\t}\n\n\t\tif s.response == nil { // We don't have a response stream to read from, try to get one.\n\t\t\tresponse, err := s.getter(s.ctx, s.info)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\t\t// Successful GET; this is the network stream we'll read from.\n\t\t\ts.response = response\n\t\t}\n\t\tn, err := s.response.Body.Read(p) // Read from the stream\n\n\t\t// Injection mechanism for testing.\n\t\tif s.o.doInjectError && try == s.o.doInjectErrorRound {\n\t\t\terr = &net.DNSError{IsTemporary: true}\n\t\t}\n\n\t\t// We successfully read data or end EOF.\n\t\tif err == nil || err == io.EOF {\n\t\t\ts.info.Offset += int64(n) // Increments the start offset in case we need to make a new HTTP request in the future\n\t\t\tif s.info.Count != CountToEnd {\n\t\t\t\ts.info.Count -= int64(n) // Decrement the count in case we need to make a new HTTP request in the future\n\t\t\t}\n\t\t\treturn n, err // Return the return to the caller\n\t\t}\n\t\ts.Close()        // Error, close stream\n\t\ts.response = nil // Our stream is no longer good\n\n\t\t// Check the retry count and error code, and decide whether to retry.\n\t\tif try >= s.o.MaxRetryRequests {\n\t\t\treturn n, err // All retries exhausted\n\t\t}\n\n\t\tif netErr, ok := err.(net.Error); ok && (netErr.Timeout() || netErr.Temporary()) {\n\t\t\tcontinue\n\t\t\t// Loop around and try to get and read from new stream.\n\t\t}\n\t\treturn n, err // Not retryable, just return\n\t}\n}\n\nfunc (s *retryReader) Close() error {\n\tif s.response != nil && s.response.Body != nil {\n\t\treturn s.response.Body.Close()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_account.go",
    "content": "package azblob\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\n// AccountSASSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage account.\n// For more information, see https://docs.microsoft.com/rest/api/storageservices/constructing-an-account-sas\ntype AccountSASSignatureValues struct {\n\tVersion       string      `param:\"sv\"`  // If not specified, this defaults to SASVersion\n\tProtocol      SASProtocol `param:\"spr\"` // See the SASProtocol* constants\n\tStartTime     time.Time   `param:\"st\"`  // Not specified if IsZero\n\tExpiryTime    time.Time   `param:\"se\"`  // Not specified if IsZero\n\tPermissions   string      `param:\"sp\"`  // Create by initializing a AccountSASPermissions and then call String()\n\tIPRange       IPRange     `param:\"sip\"`\n\tServices      string      `param:\"ss\"`  // Create by initializing AccountSASServices and then call String()\n\tResourceTypes string      `param:\"srt\"` // Create by initializing AccountSASResourceTypes and then call String()\n}\n\n// NewSASQueryParameters uses an account's shared key credential to sign this signature values to produce\n// the proper SAS query parameters.\nfunc (v AccountSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *SharedKeyCredential) SASQueryParameters {\n\t// https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-an-Account-SAS\n\tif v.ExpiryTime.IsZero() || v.Permissions == \"\" || v.ResourceTypes == \"\" || v.Services == \"\" {\n\t\tpanic(\"Account SAS is missing at least one of these: ExpiryTime, Permissions, Service, or ResourceType\")\n\t}\n\tif v.Version == \"\" {\n\t\tv.Version = SASVersion\n\t}\n\tperms := &AccountSASPermissions{}\n\tif err := perms.Parse(v.Permissions); err != nil {\n\t\tpanic(err)\n\t}\n\tv.Permissions = perms.String()\n\n\tstartTime, expiryTime := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime)\n\n\tstringToSign := strings.Join([]string{\n\t\tsharedKeyCredential.AccountName(),\n\t\tv.Permissions,\n\t\tv.Services,\n\t\tv.ResourceTypes,\n\t\tstartTime,\n\t\texpiryTime,\n\t\tv.IPRange.String(),\n\t\tstring(v.Protocol),\n\t\tv.Version,\n\t\t\"\"}, // That right, the account SAS requires a terminating extra newline\n\t\t\"\\n\")\n\n\tsignature := sharedKeyCredential.ComputeHMACSHA256(stringToSign)\n\tp := SASQueryParameters{\n\t\t// Common SAS parameters\n\t\tversion:     v.Version,\n\t\tprotocol:    v.Protocol,\n\t\tstartTime:   v.StartTime,\n\t\texpiryTime:  v.ExpiryTime,\n\t\tpermissions: v.Permissions,\n\t\tipRange:     v.IPRange,\n\n\t\t// Account-specific SAS parameters\n\t\tservices:      v.Services,\n\t\tresourceTypes: v.ResourceTypes,\n\n\t\t// Calculated SAS signature\n\t\tsignature: signature,\n\t}\n\treturn p\n}\n\n// The AccountSASPermissions type simplifies creating the permissions string for an Azure Storage Account SAS.\n// Initialize an instance of this type and then call its String method to set AccountSASSignatureValues's Permissions field.\ntype AccountSASPermissions struct {\n\tRead, Write, Delete, List, Add, Create, Update, Process bool\n}\n\n// String produces the SAS permissions string for an Azure Storage account.\n// Call this method to set AccountSASSignatureValues's Permissions field.\nfunc (p AccountSASPermissions) String() string {\n\tvar buffer bytes.Buffer\n\tif p.Read {\n\t\tbuffer.WriteRune('r')\n\t}\n\tif p.Write {\n\t\tbuffer.WriteRune('w')\n\t}\n\tif p.Delete {\n\t\tbuffer.WriteRune('d')\n\t}\n\tif p.List {\n\t\tbuffer.WriteRune('l')\n\t}\n\tif p.Add {\n\t\tbuffer.WriteRune('a')\n\t}\n\tif p.Create {\n\t\tbuffer.WriteRune('c')\n\t}\n\tif p.Update {\n\t\tbuffer.WriteRune('u')\n\t}\n\tif p.Process {\n\t\tbuffer.WriteRune('p')\n\t}\n\treturn buffer.String()\n}\n\n// Parse initializes the AccountSASPermissions's fields from a string.\nfunc (p *AccountSASPermissions) Parse(s string) error {\n\t*p = AccountSASPermissions{} // Clear out the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'r':\n\t\t\tp.Read = true\n\t\tcase 'w':\n\t\t\tp.Write = true\n\t\tcase 'd':\n\t\t\tp.Delete = true\n\t\tcase 'l':\n\t\t\tp.List = true\n\t\tcase 'a':\n\t\t\tp.Add = true\n\t\tcase 'c':\n\t\t\tp.Create = true\n\t\tcase 'u':\n\t\t\tp.Update = true\n\t\tcase 'p':\n\t\t\tp.Process = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"Invalid permission character: '%v'\", r)\n\t\t}\n\t}\n\treturn nil\n}\n\n// The AccountSASServices type simplifies creating the services string for an Azure Storage Account SAS.\n// Initialize an instance of this type and then call its String method to set AccountSASSignatureValues's Services field.\ntype AccountSASServices struct {\n\tBlob, Queue, File bool\n}\n\n// String produces the SAS services string for an Azure Storage account.\n// Call this method to set AccountSASSignatureValues's Services field.\nfunc (s AccountSASServices) String() string {\n\tvar buffer bytes.Buffer\n\tif s.Blob {\n\t\tbuffer.WriteRune('b')\n\t}\n\tif s.Queue {\n\t\tbuffer.WriteRune('q')\n\t}\n\tif s.File {\n\t\tbuffer.WriteRune('f')\n\t}\n\treturn buffer.String()\n}\n\n// Parse initializes the AccountSASServices' fields from a string.\nfunc (a *AccountSASServices) Parse(s string) error {\n\t*a = AccountSASServices{} // Clear out the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 'b':\n\t\t\ta.Blob = true\n\t\tcase 'q':\n\t\t\ta.Queue = true\n\t\tcase 'f':\n\t\t\ta.File = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"Invalid service character: '%v'\", r)\n\t\t}\n\t}\n\treturn nil\n}\n\n// The AccountSASResourceTypes type simplifies creating the resource types string for an Azure Storage Account SAS.\n// Initialize an instance of this type and then call its String method to set AccountSASSignatureValues's ResourceTypes field.\ntype AccountSASResourceTypes struct {\n\tService, Container, Object bool\n}\n\n// String produces the SAS resource types string for an Azure Storage account.\n// Call this method to set AccountSASSignatureValues's ResourceTypes field.\nfunc (rt AccountSASResourceTypes) String() string {\n\tvar buffer bytes.Buffer\n\tif rt.Service {\n\t\tbuffer.WriteRune('s')\n\t}\n\tif rt.Container {\n\t\tbuffer.WriteRune('c')\n\t}\n\tif rt.Object {\n\t\tbuffer.WriteRune('o')\n\t}\n\treturn buffer.String()\n}\n\n// Parse initializes the AccountSASResourceType's fields from a string.\nfunc (rt *AccountSASResourceTypes) Parse(s string) error {\n\t*rt = AccountSASResourceTypes{} // Clear out the flags\n\tfor _, r := range s {\n\t\tswitch r {\n\t\tcase 's':\n\t\t\trt.Service = true\n\t\tcase 'q':\n\t\t\trt.Container = true\n\t\tcase 'o':\n\t\t\trt.Object = true\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"Invalid resource type: '%v'\", r)\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_query_params.go",
    "content": "package azblob\n\nimport (\n\t\"net\"\n\t\"net/url\"\n\t\"strings\"\n\t\"time\"\n)\n\n// SASVersion indicates the SAS version.\nconst SASVersion = ServiceVersion\n\ntype SASProtocol string\n\nconst (\n\t// SASProtocolHTTPS can be specified for a SAS protocol\n\tSASProtocolHTTPS SASProtocol = \"https\"\n\n\t// SASProtocolHTTPSandHTTP can be specified for a SAS protocol\n\tSASProtocolHTTPSandHTTP SASProtocol = \"https,http\"\n)\n\n// FormatTimesForSASSigning converts a time.Time to a snapshotTimeFormat string suitable for a\n// SASField's StartTime or ExpiryTime fields. Returns \"\" if value.IsZero().\nfunc FormatTimesForSASSigning(startTime, expiryTime time.Time) (string, string) {\n\tss := \"\"\n\tif !startTime.IsZero() {\n\t\tss = startTime.Format(SASTimeFormat) // \"yyyy-MM-ddTHH:mm:ssZ\"\n\t}\n\tse := \"\"\n\tif !expiryTime.IsZero() {\n\t\tse = expiryTime.Format(SASTimeFormat) // \"yyyy-MM-ddTHH:mm:ssZ\"\n\t}\n\treturn ss, se\n}\n\n// SASTimeFormat represents the format of a SAS start or expiry time. Use it when formatting/parsing a time.Time.\nconst SASTimeFormat = \"2006-01-02T15:04:05Z\" //\"2017-07-27T00:00:00Z\" // ISO 8601\n\n// https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas\n\n// A SASQueryParameters object represents the components that make up an Azure Storage SAS' query parameters.\n// You parse a map of query parameters into its fields by calling NewSASQueryParameters(). You add the components\n// to a query parameter map by calling AddToValues().\n// NOTE: Changing any field requires computing a new SAS signature using a XxxSASSignatureValues type.\n//\n// This type defines the components used by all Azure Storage resources (Containers, Blobs, Files, & Queues).\ntype SASQueryParameters struct {\n\t// All members are immutable or values so copies of this struct are goroutine-safe.\n\tversion       string      `param:\"sv\"`\n\tservices      string      `param:\"ss\"`\n\tresourceTypes string      `param:\"srt\"`\n\tprotocol      SASProtocol `param:\"spr\"`\n\tstartTime     time.Time   `param:\"st\"`\n\texpiryTime    time.Time   `param:\"se\"`\n\tipRange       IPRange     `param:\"sip\"`\n\tidentifier    string      `param:\"si\"`\n\tresource      string      `param:\"sr\"`\n\tpermissions   string      `param:\"sp\"`\n\tsignature     string      `param:\"sig\"`\n}\n\nfunc (p *SASQueryParameters) Version() string {\n\treturn p.version\n}\n\nfunc (p *SASQueryParameters) Services() string {\n\treturn p.services\n}\nfunc (p *SASQueryParameters) ResourceTypes() string {\n\treturn p.resourceTypes\n}\nfunc (p *SASQueryParameters) Protocol() SASProtocol {\n\treturn p.protocol\n}\nfunc (p *SASQueryParameters) StartTime() time.Time {\n\treturn p.startTime\n}\nfunc (p *SASQueryParameters) ExpiryTime() time.Time {\n\treturn p.expiryTime\n}\n\nfunc (p *SASQueryParameters) IPRange() IPRange {\n\treturn p.ipRange\n}\n\nfunc (p *SASQueryParameters) Identifier() string {\n\treturn p.identifier\n}\n\nfunc (p *SASQueryParameters) Resource() string {\n\treturn p.resource\n}\nfunc (p *SASQueryParameters) Permissions() string {\n\treturn p.permissions\n}\n\nfunc (p *SASQueryParameters) Signature() string {\n\treturn p.signature\n}\n\n// IPRange represents a SAS IP range's start IP and (optionally) end IP.\ntype IPRange struct {\n\tStart net.IP // Not specified if length = 0\n\tEnd   net.IP // Not specified if length = 0\n}\n\n// String returns a string representation of an IPRange.\nfunc (ipr *IPRange) String() string {\n\tif len(ipr.Start) == 0 {\n\t\treturn \"\"\n\t}\n\tstart := ipr.Start.String()\n\tif len(ipr.End) == 0 {\n\t\treturn start\n\t}\n\treturn start + \"-\" + ipr.End.String()\n}\n\n// NewSASQueryParameters creates and initializes a SASQueryParameters object based on the\n// query parameter map's passed-in values. If deleteSASParametersFromValues is true,\n// all SAS-related query parameters are removed from the passed-in map. If\n// deleteSASParametersFromValues is false, the map passed-in map is unaltered.\nfunc newSASQueryParameters(values url.Values, deleteSASParametersFromValues bool) SASQueryParameters {\n\tp := SASQueryParameters{}\n\tfor k, v := range values {\n\t\tval := v[0]\n\t\tisSASKey := true\n\t\tswitch strings.ToLower(k) {\n\t\tcase \"sv\":\n\t\t\tp.version = val\n\t\tcase \"ss\":\n\t\t\tp.services = val\n\t\tcase \"srt\":\n\t\t\tp.resourceTypes = val\n\t\tcase \"spr\":\n\t\t\tp.protocol = SASProtocol(val)\n\t\tcase \"st\":\n\t\t\tp.startTime, _ = time.Parse(SASTimeFormat, val)\n\t\tcase \"se\":\n\t\t\tp.expiryTime, _ = time.Parse(SASTimeFormat, val)\n\t\tcase \"sip\":\n\t\t\tdashIndex := strings.Index(val, \"-\")\n\t\t\tif dashIndex == -1 {\n\t\t\t\tp.ipRange.Start = net.ParseIP(val)\n\t\t\t} else {\n\t\t\t\tp.ipRange.Start = net.ParseIP(val[:dashIndex])\n\t\t\t\tp.ipRange.End = net.ParseIP(val[dashIndex+1:])\n\t\t\t}\n\t\tcase \"si\":\n\t\t\tp.identifier = val\n\t\tcase \"sr\":\n\t\t\tp.resource = val\n\t\tcase \"sp\":\n\t\t\tp.permissions = val\n\t\tcase \"sig\":\n\t\t\tp.signature = val\n\t\tdefault:\n\t\t\tisSASKey = false // We didn't recognize the query parameter\n\t\t}\n\t\tif isSASKey && deleteSASParametersFromValues {\n\t\t\tdelete(values, k)\n\t\t}\n\t}\n\treturn p\n}\n\n// AddToValues adds the SAS components to the specified query parameters map.\nfunc (p *SASQueryParameters) addToValues(v url.Values) url.Values {\n\tif p.version != \"\" {\n\t\tv.Add(\"sv\", p.version)\n\t}\n\tif p.services != \"\" {\n\t\tv.Add(\"ss\", p.services)\n\t}\n\tif p.resourceTypes != \"\" {\n\t\tv.Add(\"srt\", p.resourceTypes)\n\t}\n\tif p.protocol != \"\" {\n\t\tv.Add(\"spr\", string(p.protocol))\n\t}\n\tif !p.startTime.IsZero() {\n\t\tv.Add(\"st\", p.startTime.Format(SASTimeFormat))\n\t}\n\tif !p.expiryTime.IsZero() {\n\t\tv.Add(\"se\", p.expiryTime.Format(SASTimeFormat))\n\t}\n\tif len(p.ipRange.Start) > 0 {\n\t\tv.Add(\"sip\", p.ipRange.String())\n\t}\n\tif p.identifier != \"\" {\n\t\tv.Add(\"si\", p.identifier)\n\t}\n\tif p.resource != \"\" {\n\t\tv.Add(\"sr\", p.resource)\n\t}\n\tif p.permissions != \"\" {\n\t\tv.Add(\"sp\", p.permissions)\n\t}\n\tif p.signature != \"\" {\n\t\tv.Add(\"sig\", p.signature)\n\t}\n\treturn v\n}\n\n// Encode encodes the SAS query parameters into URL encoded form sorted by key.\nfunc (p *SASQueryParameters) Encode() string {\n\tv := url.Values{}\n\tp.addToValues(v)\n\treturn v.Encode()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_service_codes_common.go",
    "content": "package azblob\n\n// https://docs.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes\n\nconst (\n\t// ServiceCodeNone is the default value. It indicates that the error was related to the service or that the service didn't return a code.\n\tServiceCodeNone ServiceCodeType = \"\"\n\n\t// ServiceCodeAccountAlreadyExists means the specified account already exists.\n\tServiceCodeAccountAlreadyExists ServiceCodeType = \"AccountAlreadyExists\"\n\n\t// ServiceCodeAccountBeingCreated means the specified account is in the process of being created (403).\n\tServiceCodeAccountBeingCreated ServiceCodeType = \"AccountBeingCreated\"\n\n\t// ServiceCodeAccountIsDisabled means the specified account is disabled (403).\n\tServiceCodeAccountIsDisabled ServiceCodeType = \"AccountIsDisabled\"\n\n\t// ServiceCodeAuthenticationFailed means the server failed to authenticate the request. Make sure the value of the Authorization header is formed correctly including the signature (403).\n\tServiceCodeAuthenticationFailed ServiceCodeType = \"AuthenticationFailed\"\n\n\t// ServiceCodeConditionHeadersNotSupported means the condition headers are not supported (400).\n\tServiceCodeConditionHeadersNotSupported ServiceCodeType = \"ConditionHeadersNotSupported\"\n\n\t// ServiceCodeConditionNotMet means the condition specified in the conditional header(s) was not met for a read/write operation (304/412).\n\tServiceCodeConditionNotMet ServiceCodeType = \"ConditionNotMet\"\n\n\t// ServiceCodeEmptyMetadataKey means the key for one of the metadata key-value pairs is empty (400).\n\tServiceCodeEmptyMetadataKey ServiceCodeType = \"EmptyMetadataKey\"\n\n\t// ServiceCodeInsufficientAccountPermissions means read operations are currently disabled or Write operations are not allowed or The account being accessed does not have sufficient permissions to execute this operation (403).\n\tServiceCodeInsufficientAccountPermissions ServiceCodeType = \"InsufficientAccountPermissions\"\n\n\t// ServiceCodeInternalError means the server encountered an internal error. Please retry the request (500).\n\tServiceCodeInternalError ServiceCodeType = \"InternalError\"\n\n\t// ServiceCodeInvalidAuthenticationInfo means the authentication information was not provided in the correct format. Verify the value of Authorization header (400).\n\tServiceCodeInvalidAuthenticationInfo ServiceCodeType = \"InvalidAuthenticationInfo\"\n\n\t// ServiceCodeInvalidHeaderValue means the value provided for one of the HTTP headers was not in the correct format (400).\n\tServiceCodeInvalidHeaderValue ServiceCodeType = \"InvalidHeaderValue\"\n\n\t// ServiceCodeInvalidHTTPVerb means the HTTP verb specified was not recognized by the server (400).\n\tServiceCodeInvalidHTTPVerb ServiceCodeType = \"InvalidHttpVerb\"\n\n\t// ServiceCodeInvalidInput means one of the request inputs is not valid (400).\n\tServiceCodeInvalidInput ServiceCodeType = \"InvalidInput\"\n\n\t// ServiceCodeInvalidMd5 means the MD5 value specified in the request is invalid. The MD5 value must be 128 bits and Base64-encoded (400).\n\tServiceCodeInvalidMd5 ServiceCodeType = \"InvalidMd5\"\n\n\t// ServiceCodeInvalidMetadata means the specified metadata is invalid. It includes characters that are not permitted (400).\n\tServiceCodeInvalidMetadata ServiceCodeType = \"InvalidMetadata\"\n\n\t// ServiceCodeInvalidQueryParameterValue means an invalid value was specified for one of the query parameters in the request URI (400).\n\tServiceCodeInvalidQueryParameterValue ServiceCodeType = \"InvalidQueryParameterValue\"\n\n\t// ServiceCodeInvalidRange means the range specified is invalid for the current size of the resource (416).\n\tServiceCodeInvalidRange ServiceCodeType = \"InvalidRange\"\n\n\t// ServiceCodeInvalidResourceName means the specified resource name contains invalid characters (400).\n\tServiceCodeInvalidResourceName ServiceCodeType = \"InvalidResourceName\"\n\n\t// ServiceCodeInvalidURI means the requested URI does not represent any resource on the server (400).\n\tServiceCodeInvalidURI ServiceCodeType = \"InvalidUri\"\n\n\t// ServiceCodeInvalidXMLDocument means the specified XML is not syntactically valid (400).\n\tServiceCodeInvalidXMLDocument ServiceCodeType = \"InvalidXmlDocument\"\n\n\t// ServiceCodeInvalidXMLNodeValue means the value provided for one of the XML nodes in the request body was not in the correct format (400).\n\tServiceCodeInvalidXMLNodeValue ServiceCodeType = \"InvalidXmlNodeValue\"\n\n\t// ServiceCodeMd5Mismatch means the MD5 value specified in the request did not match the MD5 value calculated by the server (400).\n\tServiceCodeMd5Mismatch ServiceCodeType = \"Md5Mismatch\"\n\n\t// ServiceCodeMetadataTooLarge means the size of the specified metadata exceeds the maximum size permitted (400).\n\tServiceCodeMetadataTooLarge ServiceCodeType = \"MetadataTooLarge\"\n\n\t// ServiceCodeMissingContentLengthHeader means the Content-Length header was not specified (411).\n\tServiceCodeMissingContentLengthHeader ServiceCodeType = \"MissingContentLengthHeader\"\n\n\t// ServiceCodeMissingRequiredQueryParameter means a required query parameter was not specified for this request (400).\n\tServiceCodeMissingRequiredQueryParameter ServiceCodeType = \"MissingRequiredQueryParameter\"\n\n\t// ServiceCodeMissingRequiredHeader means a required HTTP header was not specified (400).\n\tServiceCodeMissingRequiredHeader ServiceCodeType = \"MissingRequiredHeader\"\n\n\t// ServiceCodeMissingRequiredXMLNode means a required XML node was not specified in the request body (400).\n\tServiceCodeMissingRequiredXMLNode ServiceCodeType = \"MissingRequiredXmlNode\"\n\n\t// ServiceCodeMultipleConditionHeadersNotSupported means multiple condition headers are not supported (400).\n\tServiceCodeMultipleConditionHeadersNotSupported ServiceCodeType = \"MultipleConditionHeadersNotSupported\"\n\n\t// ServiceCodeOperationTimedOut means the operation could not be completed within the permitted time (500).\n\tServiceCodeOperationTimedOut ServiceCodeType = \"OperationTimedOut\"\n\n\t// ServiceCodeOutOfRangeInput means one of the request inputs is out of range (400).\n\tServiceCodeOutOfRangeInput ServiceCodeType = \"OutOfRangeInput\"\n\n\t// ServiceCodeOutOfRangeQueryParameterValue means a query parameter specified in the request URI is outside the permissible range (400).\n\tServiceCodeOutOfRangeQueryParameterValue ServiceCodeType = \"OutOfRangeQueryParameterValue\"\n\n\t// ServiceCodeRequestBodyTooLarge means the size of the request body exceeds the maximum size permitted (413).\n\tServiceCodeRequestBodyTooLarge ServiceCodeType = \"RequestBodyTooLarge\"\n\n\t// ServiceCodeResourceTypeMismatch means the specified resource type does not match the type of the existing resource (409).\n\tServiceCodeResourceTypeMismatch ServiceCodeType = \"ResourceTypeMismatch\"\n\n\t// ServiceCodeRequestURLFailedToParse means the url in the request could not be parsed (400).\n\tServiceCodeRequestURLFailedToParse ServiceCodeType = \"RequestUrlFailedToParse\"\n\n\t// ServiceCodeResourceAlreadyExists means the specified resource already exists (409).\n\tServiceCodeResourceAlreadyExists ServiceCodeType = \"ResourceAlreadyExists\"\n\n\t// ServiceCodeResourceNotFound means the specified resource does not exist (404).\n\tServiceCodeResourceNotFound ServiceCodeType = \"ResourceNotFound\"\n\n\t// ServiceCodeServerBusy means the server is currently unable to receive requests. Please retry your request or Ingress/egress is over the account limit or operations per second is over the account limit (503).\n\tServiceCodeServerBusy ServiceCodeType = \"ServerBusy\"\n\n\t// ServiceCodeUnsupportedHeader means one of the HTTP headers specified in the request is not supported (400).\n\tServiceCodeUnsupportedHeader ServiceCodeType = \"UnsupportedHeader\"\n\n\t// ServiceCodeUnsupportedXMLNode means one of the XML nodes specified in the request body is not supported (400).\n\tServiceCodeUnsupportedXMLNode ServiceCodeType = \"UnsupportedXmlNode\"\n\n\t// ServiceCodeUnsupportedQueryParameter means one of the query parameters specified in the request URI is not supported (400).\n\tServiceCodeUnsupportedQueryParameter ServiceCodeType = \"UnsupportedQueryParameter\"\n\n\t// ServiceCodeUnsupportedHTTPVerb means the resource doesn't support the specified HTTP verb (405).\n\tServiceCodeUnsupportedHTTPVerb ServiceCodeType = \"UnsupportedHttpVerb\"\n)\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_storage_error.go",
    "content": "package azblob\n\nimport (\n\t\"bytes\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sort\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\nfunc init() {\n\t// wire up our custom error handling constructor\n\tresponseErrorFactory = newStorageError\n}\n\n// ServiceCodeType is a string identifying a storage service error.\n// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/status-and-error-codes2\ntype ServiceCodeType string\n\n// StorageError identifies a responder-generated network or response parsing error.\ntype StorageError interface {\n\t// ResponseError implements error's Error(), net.Error's Temporary() and Timeout() methods & Response().\n\tResponseError\n\n\t// ServiceCode returns a service error code. Your code can use this to make error recovery decisions.\n\tServiceCode() ServiceCodeType\n}\n\n// storageError is the internal struct that implements the public StorageError interface.\ntype storageError struct {\n\tresponseError\n\tserviceCode ServiceCodeType\n\tdetails     map[string]string\n}\n\n// newStorageError creates an error object that implements the error interface.\nfunc newStorageError(cause error, response *http.Response, description string) error {\n\treturn &storageError{\n\t\tresponseError: responseError{\n\t\t\tErrorNode:   pipeline.ErrorNode{}.Initialize(cause, 3),\n\t\t\tresponse:    response,\n\t\t\tdescription: description,\n\t\t},\n\t}\n}\n\n// ServiceCode returns service-error information. The caller may examine these values but should not modify any of them.\nfunc (e *storageError) ServiceCode() ServiceCodeType { return e.serviceCode }\n\n// Error implements the error interface's Error method to return a string representation of the error.\nfunc (e *storageError) Error() string {\n\tb := &bytes.Buffer{}\n\tfmt.Fprintf(b, \"===== RESPONSE ERROR (ServiceCode=%s) =====\\n\", e.serviceCode)\n\tfmt.Fprintf(b, \"Description=%s, Details: \", e.description)\n\tif len(e.details) == 0 {\n\t\tb.WriteString(\"(none)\\n\")\n\t} else {\n\t\tb.WriteRune('\\n')\n\t\tkeys := make([]string, 0, len(e.details))\n\t\t// Alphabetize the details\n\t\tfor k := range e.details {\n\t\t\tkeys = append(keys, k)\n\t\t}\n\t\tsort.Strings(keys)\n\t\tfor _, k := range keys {\n\t\t\tfmt.Fprintf(b, \"   %s: %+v\\n\", k, e.details[k])\n\t\t}\n\t}\n\treq := pipeline.Request{Request: e.response.Request}.Copy() // Make a copy of the response's request\n\tpipeline.WriteRequestWithResponse(b, prepareRequestForLogging(req), e.response, nil)\n\treturn e.ErrorNode.Error(b.String())\n}\n\n// Temporary returns true if the error occurred due to a temporary condition (including an HTTP status of 500 or 503).\nfunc (e *storageError) Temporary() bool {\n\tif e.response != nil {\n\t\tif (e.response.StatusCode == http.StatusInternalServerError) || (e.response.StatusCode == http.StatusServiceUnavailable) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn e.ErrorNode.Temporary()\n}\n\n// UnmarshalXML performs custom unmarshalling of XML-formatted Azure storage request errors.\nfunc (e *storageError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err error) {\n\ttokName := \"\"\n\tvar t xml.Token\n\tfor t, err = d.Token(); err == nil; t, err = d.Token() {\n\t\tswitch tt := t.(type) {\n\t\tcase xml.StartElement:\n\t\t\ttokName = tt.Name.Local\n\t\t\tbreak\n\t\tcase xml.CharData:\n\t\t\tswitch tokName {\n\t\t\tcase \"Code\":\n\t\t\t\te.serviceCode = ServiceCodeType(tt)\n\t\t\tcase \"Message\":\n\t\t\t\te.description = string(tt)\n\t\t\tdefault:\n\t\t\t\tif e.details == nil {\n\t\t\t\t\te.details = map[string]string{}\n\t\t\t\t}\n\t\t\t\te.details[tokName] = string(tt)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_util_validate.go",
    "content": "package azblob\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n)\n\n// httpRange defines a range of bytes within an HTTP resource, starting at offset and\n// ending at offset+count. A zero-value httpRange indicates the entire resource. An httpRange\n// which has an offset but na zero value count indicates from the offset to the resource's end.\ntype httpRange struct {\n\toffset int64\n\tcount  int64\n}\n\nfunc (r httpRange) pointers() *string {\n\tif r.offset == 0 && r.count == 0 { // Do common case first for performance\n\t\treturn nil\t// No specified range\n\t}\n\tif r.offset < 0 {\n\t\tpanic(\"The range offset must be >= 0\")\n\t}\n\tif r.count < 0 {\n\t\tpanic(\"The range count must be >= 0\")\n\t}\n\tendOffset := \"\" // if count == 0\n\tif r.count > 0 {\n\t\tendOffset = strconv.FormatInt((r.offset+r.count)-1, 10)\n\t}\n\tdataRange := fmt.Sprintf(\"bytes=%v-%s\", r.offset, endOffset)\n\treturn &dataRange\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\nfunc validateSeekableStreamAt0AndGetCount(body io.ReadSeeker) int64 {\n\tif body == nil { // nil body's are \"logically\" seekable to 0 and are 0 bytes long\n\t\treturn 0\n\t}\n\tvalidateSeekableStreamAt0(body)\n\tcount, err := body.Seek(0, io.SeekEnd)\n\tif err != nil {\n\t\tpanic(\"failed to seek stream\")\n\t}\n\tbody.Seek(0, io.SeekStart)\n\treturn count\n}\n\nfunc validateSeekableStreamAt0(body io.ReadSeeker) {\n\tif body == nil { // nil body's are \"logically\" seekable to 0\n\t\treturn\n\t}\n\tif pos, err := body.Seek(0, io.SeekCurrent); pos != 0 || err != nil {\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tpanic(errors.New(\"stream must be set to position 0\"))\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_uuid.go",
    "content": "package azblob\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\n// The UUID reserved variants.\nconst (\n\treservedNCS       byte = 0x80\n\treservedRFC4122   byte = 0x40\n\treservedMicrosoft byte = 0x20\n\treservedFuture    byte = 0x00\n)\n\n// A UUID representation compliant with specification in RFC 4122 document.\ntype uuid [16]byte\n\n// NewUUID returns a new uuid using RFC 4122 algorithm.\nfunc newUUID() (u uuid) {\n\tu = uuid{}\n\t// Set all bits to randomly (or pseudo-randomly) chosen values.\n\t_, err := rand.Read(u[:])\n\tif err != nil {\n\t\tpanic(\"ran.Read failed\")\n\t}\n\tu[8] = (u[8] | reservedRFC4122) & 0x7F // u.setVariant(ReservedRFC4122)\n\n\tvar version byte = 4\n\tu[6] = (u[6] & 0xF) | (version << 4) // u.setVersion(4)\n\treturn\n}\n\n// String returns an unparsed version of the generated UUID sequence.\nfunc (u uuid) String() string {\n\treturn fmt.Sprintf(\"%x-%x-%x-%x-%x\", u[0:4], u[4:6], u[6:8], u[8:10], u[10:])\n}\n\n// ParseUUID parses a string formatted as \"003020100-0504-0706-0809-0a0b0c0d0e0f\"\n// or \"{03020100-0504-0706-0809-0a0b0c0d0e0f}\" into a UUID.\nfunc parseUUID(uuidStr string) uuid {\n\tchar := func(hexString string) byte {\n\t\ti, _ := strconv.ParseUint(hexString, 16, 8)\n\t\treturn byte(i)\n\t}\n\tif uuidStr[0] == '{' {\n\t\tuuidStr = uuidStr[1:] // Skip over the '{'\n\t}\n\t// 03020100 - 05 04 - 07 06 - 08 09 - 0a 0b 0c 0d 0e 0f\n\t//             1 11 1 11 11 1 12 22 2 22 22 22 33 33 33\n\t// 01234567 8 90 12 3 45 67 8 90 12 3 45 67 89 01 23 45\n\tuuidVal := uuid{\n\t\tchar(uuidStr[0:2]),\n\t\tchar(uuidStr[2:4]),\n\t\tchar(uuidStr[4:6]),\n\t\tchar(uuidStr[6:8]),\n\n\t\tchar(uuidStr[9:11]),\n\t\tchar(uuidStr[11:13]),\n\n\t\tchar(uuidStr[14:16]),\n\t\tchar(uuidStr[16:18]),\n\n\t\tchar(uuidStr[19:21]),\n\t\tchar(uuidStr[21:23]),\n\n\t\tchar(uuidStr[24:26]),\n\t\tchar(uuidStr[26:28]),\n\t\tchar(uuidStr[28:30]),\n\t\tchar(uuidStr[30:32]),\n\t\tchar(uuidStr[32:34]),\n\t\tchar(uuidStr[34:36]),\n\t}\n\treturn uuidVal\n}\n\nfunc (u uuid) bytes() []byte {\n\treturn u[:]\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zt_doc.go",
    "content": "// Copyright 2017 Microsoft Corporation. All rights reserved.\n// Use of this source code is governed by an MIT\n// license that can be found in the LICENSE file.\n\n/*\nPackage azblob allows you to manipulate Azure Storage containers and blobs objects.\n\nURL Types\n\nThe most common types you'll work with are the XxxURL types. The methods of these types make requests\nagainst the Azure Storage Service.\n\n - ServiceURL's          methods perform operations on a storage account.\n    - ContainerURL's     methods perform operations on an account's container.\n       - BlockBlobURL's  methods perform operations on a container's block blob.\n       - AppendBlobURL's methods perform operations on a container's append blob.\n       - PageBlobURL's   methods perform operations on a container's page blob.\n       - BlobURL's       methods perform operations on a container's blob regardless of the blob's type.\n\nInternally, each XxxURL object contains a URL and a request pipeline. The URL indicates the endpoint where each HTTP\nrequest is sent and the pipeline indicates how the outgoing HTTP request and incoming HTTP response is processed.\nThe pipeline specifies things like retry policies, logging, deserialization of HTTP response payloads, and more.\n\nPipelines are threadsafe and may be shared by multiple XxxURL objects. When you create a ServiceURL, you pass\nan initial pipeline. When you call ServiceURL's NewContainerURL method, the new ContainerURL object has its own\nURL but it shares the same pipeline as the parent ServiceURL object.\n\nTo work with a blob, call one of ContainerURL's 4 NewXxxBlobURL methods depending on how you want to treat the blob.\nTo treat the blob as a block blob, append blob, or page blob, call NewBlockBlobURL, NewAppendBlobURL, or NewPageBlobURL\nrespectively. These three types are all identical except for the methods they expose; each type exposes the methods\nrelevant to the type of blob represented. If you're not sure how you want to treat a blob, you can call NewBlobURL;\nthis returns an object whose methods are relevant to any kind of blob. When you call ContainerURL's NewXxxBlobURL,\nthe new XxxBlobURL object has its own URL but it shares the same pipeline as the parent ContainerURL object. You\ncan easily switch between blob types (method sets) by calling a ToXxxBlobURL method.\n\nIf you'd like to use a different pipeline with a ServiceURL, ContainerURL, or XxxBlobURL object, then call the XxxURL\nobject's WithPipeline method passing in the desired pipeline. The WithPipeline methods create a new XxxURL object\nwith the same URL as the original but with the specified pipeline.\n\nNote that XxxURL objects use little memory, are goroutine-safe, and many objects share the same pipeline. This means that\nXxxURL objects share a lot of system resources making them very efficient.\n\nAll of XxxURL's methods that make HTTP requests return rich error handling information so you can discern network failures,\ntransient failures, timeout failures, service failures, etc. See the StorageError interface for more information and an\nexample of how to do deal with errors.\n\nURL and Shared Access Signature Manipulation\n\nThe library includes a BlobURLParts type for deconstructing and reconstructing URLs. And you can use the following types\nfor generating and parsing Shared Access Signature (SAS)\n - Use the AccountSASSignatureValues type to create a SAS for a storage account.\n - Use the BlobSASSignatureValues type to create a SAS for a container or blob.\n - Use the SASQueryParameters type to turn signature values in to query parameres or to parse query parameters.\n\nTo generate a SAS, you must use the SharedKeyCredential type.\n\nCredentials\n\nWhen creating a request pipeline, you must specify one of this package's credential types.\n - Call the NewAnonymousCredential function for requests that contain a Shared Access Signature (SAS).\n - Call the NewSharedKeyCredential function (with an account name & key) to access any account resources. You must also use this\n   to generate Shared Access Signatures.\n\nHTTP Request Policy Factories\n\nThis package defines several request policy factories for use with the pipeline package.\nMost applications will not use these factories directly; instead, the NewPipeline\nfunction creates these factories, initializes them (via the PipelineOptions type)\nand returns a pipeline object for use by the XxxURL objects.\n\nHowever, for advanced scenarios, developers can access these policy factories directly\nand even create their own and then construct their own pipeline in order to affect HTTP\nrequests and responses performed by the XxxURL objects. For example, developers can\nintroduce their own logging, random failures, request recording & playback for fast\ntesting, HTTP request pacing, alternate retry mechanisms, metering, metrics, etc. The\npossibilities are endless!\n\nBelow are the request pipeline policy factory functions that are provided with this\npackage:\n - NewRetryPolicyFactory           Enables rich retry semantics for failed HTTP requests.\n - NewRequestLogPolicyFactory      Enables rich logging support for HTTP requests/responses & failures.\n - NewTelemetryPolicyFactory       Enables simple modification of the HTTP request's User-Agent header so each request reports the SDK version & language/runtime making the requests.\n - NewUniqueRequestIDPolicyFactory Adds a x-ms-client-request-id header with a unique UUID value to an HTTP request to help with diagnosing failures.\n\nAlso, note that all the NewXxxCredential functions return request policy factory objects which get injected into the pipeline.\n*/\npackage azblob\n\n// \tTokenCredential     Use this to access resources using Role-Based Access Control (RBAC).\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_append_blob.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// appendBlobClient is the client for the AppendBlob methods of the Azblob service.\ntype appendBlobClient struct {\n\tmanagementClient\n}\n\n// newAppendBlobClient creates an instance of the appendBlobClient client.\nfunc newAppendBlobClient(url url.URL, p pipeline.Pipeline) appendBlobClient {\n\treturn appendBlobClient{newManagementClient(url, p)}\n}\n\n// AppendBlock the Append Block operation commits a new block of data to the end of an existing append blob. The Append\n// Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is\n// supported only on version 2015-02-21 version or later.\n//\n// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an\n// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. maxSize is optional conditional header. The max length in bytes permitted for\n// the append blob. If the Append Block operation would cause the blob to exceed that limit or if the blob size is\n// already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error\n// (HTTP status code 412 - Precondition Failed). appendPosition is optional conditional header, used only for the\n// Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only if the append\n// position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error\n// (HTTP status code 412 - Precondition Failed). ifModifiedSince is specify this header value to operate only on a blob\n// if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate\n// only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to\n// operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a\n// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded\n// in the analytics logs when storage analytics logging is enabled.\nfunc (client appendBlobClient) AppendBlock(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobAppendBlockResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: body,\n\t\t\tconstraints: []constraint{{target: \"body\", name: null, rule: true, chain: nil}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.appendBlockPreparer(body, contentLength, timeout, leaseID, maxSize, appendPosition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.appendBlockResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*AppendBlobAppendBlockResponse), err\n}\n\n// appendBlockPreparer prepares the AppendBlock request.\nfunc (client appendBlobClient) appendBlockPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, body)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"appendblock\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif maxSize != nil {\n\t\treq.Header.Set(\"x-ms-blob-condition-maxsize\", strconv.FormatInt(*maxSize, 10))\n\t}\n\tif appendPosition != nil {\n\t\treq.Header.Set(\"x-ms-blob-condition-appendpos\", strconv.FormatInt(*appendPosition, 10))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// appendBlockResponder handles the response to the AppendBlock request.\nfunc (client appendBlobClient) appendBlockResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &AppendBlobAppendBlockResponse{rawResponse: resp.Response()}, err\n}\n\n// Create the Create Append Blob operation creates a new append blob.\n//\n// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> blobContentType is optional. Sets the blob's content type. If specified,\n// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the\n// blob's content encoding. If specified, this property is stored with the blob and returned with a read request.\n// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the\n// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this\n// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded.\n// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and\n// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the\n// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the\n// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified\n// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19,\n// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and\n// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is\n// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header.\n// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified\n// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified\n// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value.\n// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client appendBlobClient) Create(ctx context.Context, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobCreateResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.createPreparer(contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*AppendBlobCreateResponse), err\n}\n\n// createPreparer prepares the Create request.\nfunc (client appendBlobClient) createPreparer(contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif blobContentType != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-type\", *blobContentType)\n\t}\n\tif blobContentEncoding != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-encoding\", *blobContentEncoding)\n\t}\n\tif blobContentLanguage != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-language\", *blobContentLanguage)\n\t}\n\tif blobContentMD5 != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-md5\", base64.StdEncoding.EncodeToString(blobContentMD5))\n\t}\n\tif blobCacheControl != nil {\n\t\treq.Header.Set(\"x-ms-blob-cache-control\", *blobCacheControl)\n\t}\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif blobContentDisposition != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-disposition\", *blobContentDisposition)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-blob-type\", \"AppendBlob\")\n\treturn req, nil\n}\n\n// createResponder handles the response to the Create request.\nfunc (client appendBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &AppendBlobCreateResponse{rawResponse: resp.Response()}, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_blob.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// blobClient is the client for the Blob methods of the Azblob service.\ntype blobClient struct {\n\tmanagementClient\n}\n\n// newBlobClient creates an instance of the blobClient client.\nfunc newBlobClient(url url.URL, p pipeline.Pipeline) blobClient {\n\treturn blobClient{newManagementClient(url, p)}\n}\n\n// AbortCopyFromURL the Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a\n// destination blob with zero length and full metadata.\n//\n// copyID is the copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation. timeout is\n// the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character\n// limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) AbortCopyFromURL(ctx context.Context, copyID string, timeout *int32, leaseID *string, requestID *string) (*BlobAbortCopyFromURLResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.abortCopyFromURLPreparer(copyID, timeout, leaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.abortCopyFromURLResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobAbortCopyFromURLResponse), err\n}\n\n// abortCopyFromURLPreparer prepares the AbortCopyFromURL request.\nfunc (client blobClient) abortCopyFromURLPreparer(copyID string, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tparams.Set(\"copyid\", copyID)\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"copy\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-copy-action\", \"abort\")\n\treturn req, nil\n}\n\n// abortCopyFromURLResponder handles the response to the AbortCopyFromURL request.\nfunc (client blobClient) abortCopyFromURLResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusNoContent)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobAbortCopyFromURLResponse{rawResponse: resp.Response()}, err\n}\n\n// AcquireLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n// operations\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> duration is specifies the duration of the lease, in seconds, or negative\n// one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration\n// cannot be changed using renew or change. proposedLeaseID is proposed lease ID, in a GUID string format. The Blob\n// service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor\n// (String) for a list of valid GUID string formats. ifModifiedSince is specify this header value to operate only on a\n// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value\n// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs\n// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is\n// recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) AcquireLease(ctx context.Context, timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobAcquireLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.acquireLeasePreparer(timeout, duration, proposedLeaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.acquireLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobAcquireLeaseResponse), err\n}\n\n// acquireLeasePreparer prepares the AcquireLease request.\nfunc (client blobClient) acquireLeasePreparer(timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\treq.URL.RawQuery = params.Encode()\n\tif duration != nil {\n\t\treq.Header.Set(\"x-ms-lease-duration\", strconv.FormatInt(int64(*duration), 10))\n\t}\n\tif proposedLeaseID != nil {\n\t\treq.Header.Set(\"x-ms-proposed-lease-id\", *proposedLeaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"acquire\")\n\treturn req, nil\n}\n\n// acquireLeaseResponder handles the response to the AcquireLease request.\nfunc (client blobClient) acquireLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobAcquireLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// BreakLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n// operations\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> breakPeriod is for a break operation, proposed duration the lease should\n// continue before it is broken, in seconds, between 0 and 60. This break period is only used if it is shorter than the\n// time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available\n// before the break period has expired, but the lease may be held for longer than the break period. If this header does\n// not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an\n// infinite lease breaks immediately. ifModifiedSince is specify this header value to operate only on a blob if it has\n// been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a\n// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only\n// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching\n// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the\n// analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) BreakLease(ctx context.Context, timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobBreakLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.breakLeasePreparer(timeout, breakPeriod, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.breakLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobBreakLeaseResponse), err\n}\n\n// breakLeasePreparer prepares the BreakLease request.\nfunc (client blobClient) breakLeasePreparer(timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\treq.URL.RawQuery = params.Encode()\n\tif breakPeriod != nil {\n\t\treq.Header.Set(\"x-ms-lease-break-period\", strconv.FormatInt(int64(*breakPeriod), 10))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"break\")\n\treturn req, nil\n}\n\n// breakLeaseResponder handles the response to the BreakLease request.\nfunc (client blobClient) breakLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobBreakLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// ChangeLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n// operations\n//\n// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID.\n// proposedLeaseID is proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the\n// proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string\n// formats. timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> ifModifiedSince is specify this header value to operate only on a blob if\n// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only\n// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate\n// only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a\n// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded\n// in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobChangeLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.changeLeasePreparer(leaseID, proposedLeaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.changeLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobChangeLeaseResponse), err\n}\n\n// changeLeasePreparer prepares the ChangeLease request.\nfunc (client blobClient) changeLeasePreparer(leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-lease-id\", leaseID)\n\treq.Header.Set(\"x-ms-proposed-lease-id\", proposedLeaseID)\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"change\")\n\treturn req, nil\n}\n\n// changeLeaseResponder handles the response to the ChangeLease request.\nfunc (client blobClient) changeLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobChangeLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// CreateSnapshot the Create Snapshot operation creates a read-only snapshot of a blob\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> metadata is optional. Specifies a user-defined name-value pair associated\n// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or\n// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with\n// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version\n// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing\n// Containers, Blobs, and Metadata for more information. ifModifiedSince is specify this header value to operate only\n// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value\n// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs\n// without a matching value. leaseID is if specified, the operation only succeeds if the container's lease is active\n// and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character limit that is\n// recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) CreateSnapshot(ctx context.Context, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (*BlobCreateSnapshotResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.createSnapshotPreparer(timeout, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, leaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createSnapshotResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobCreateSnapshotResponse), err\n}\n\n// createSnapshotPreparer prepares the CreateSnapshot request.\nfunc (client blobClient) createSnapshotPreparer(timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"snapshot\")\n\treq.URL.RawQuery = params.Encode()\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// createSnapshotResponder handles the response to the CreateSnapshot request.\nfunc (client blobClient) createSnapshotResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobCreateSnapshotResponse{rawResponse: resp.Response()}, err\n}\n\n// Delete if the storage account's soft delete feature is disabled then, when a blob is deleted, it is permanently\n// removed from the storage account. If the storage account's soft delete feature is enabled, then, when a blob is\n// deleted, it is marked for deletion and becomes inaccessible immediately. However, the blob service retains the blob\n// or snapshot for the number of days specified by the DeleteRetentionPolicy section of [Storage service properties]\n// (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is permanently\n// removed from the storage account. Note that you continue to be charged for the soft-deleted blob's storage until it\n// is permanently removed. Use the List Blobs API and specify the \"include=deleted\" query parameter to discover which\n// blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob.\n// All other operations on a soft-deleted blob or snapshot causes the service to return an HTTP status code of 404\n// (ResourceNotFound).\n//\n// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to\n// retrieve. For more information on working with blob snapshots, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob\">Creating\n// a Snapshot of a Blob.</a> timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. deleteSnapshots is required if the blob has associated snapshots. Specify one\n// of the following two options: include: Delete the base blob and all of its snapshots. only: Delete only the blob's\n// snapshots and not the blob itself ifModifiedSince is specify this header value to operate only on a blob if it has\n// been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a\n// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only\n// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching\n// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the\n// analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) Delete(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobDeleteResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.deletePreparer(snapshot, timeout, leaseID, deleteSnapshots, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.deleteResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobDeleteResponse), err\n}\n\n// deletePreparer prepares the Delete request.\nfunc (client blobClient) deletePreparer(snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"DELETE\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif snapshot != nil && len(*snapshot) > 0 {\n\t\tparams.Set(\"snapshot\", *snapshot)\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif deleteSnapshots != DeleteSnapshotsOptionNone {\n\t\treq.Header.Set(\"x-ms-delete-snapshots\", string(deleteSnapshots))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// deleteResponder handles the response to the Delete request.\nfunc (client blobClient) deleteResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobDeleteResponse{rawResponse: resp.Response()}, err\n}\n\n// Download the Download operation reads or downloads a blob from the system, including its metadata and properties.\n// You can also call Download to read a snapshot.\n//\n// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to\n// retrieve. For more information on working with blob snapshots, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob\">Creating\n// a Snapshot of a Blob.</a> timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> rangeParameter is return only the bytes of the blob in the specified\n// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID.\n// rangeGetContentMD5 is when set to true and specified together with the Range, the service returns the MD5 hash for\n// the range, as long as the range is less than or equal to 4 MB in size. ifModifiedSince is specify this header value\n// to operate only on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this\n// header value to operate only on a blob if it has not been modified since the specified date/time. ifMatches is\n// specify an ETag value to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to\n// operate only on blobs without a matching value. requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) Download(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*downloadResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.downloadPreparer(snapshot, timeout, rangeParameter, leaseID, rangeGetContentMD5, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.downloadResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*downloadResponse), err\n}\n\n// downloadPreparer prepares the Download request.\nfunc (client blobClient) downloadPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif snapshot != nil && len(*snapshot) > 0 {\n\t\tparams.Set(\"snapshot\", *snapshot)\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\treq.URL.RawQuery = params.Encode()\n\tif rangeParameter != nil {\n\t\treq.Header.Set(\"x-ms-range\", *rangeParameter)\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif rangeGetContentMD5 != nil {\n\t\treq.Header.Set(\"x-ms-range-get-content-md5\", strconv.FormatBool(*rangeGetContentMD5))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// downloadResponder handles the response to the Download request.\nfunc (client blobClient) downloadResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusPartialContent)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\treturn &downloadResponse{rawResponse: resp.Response()}, err\n}\n\n// GetProperties the Get Properties operation returns all user-defined metadata, standard HTTP properties, and system\n// properties for the blob. It does not return the content of the blob.\n//\n// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to\n// retrieve. For more information on working with blob snapshots, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob\">Creating\n// a Snapshot of a Blob.</a> timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it\n// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a\n// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only\n// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching\n// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the\n// analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) GetProperties(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobGetPropertiesResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getPropertiesPreparer(snapshot, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPropertiesResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobGetPropertiesResponse), err\n}\n\n// getPropertiesPreparer prepares the GetProperties request.\nfunc (client blobClient) getPropertiesPreparer(snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"HEAD\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif snapshot != nil && len(*snapshot) > 0 {\n\t\tparams.Set(\"snapshot\", *snapshot)\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getPropertiesResponder handles the response to the GetProperties request.\nfunc (client blobClient) getPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobGetPropertiesResponse{rawResponse: resp.Response()}, err\n}\n\n// ReleaseLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n// operations\n//\n// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout\n// is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> ifModifiedSince is specify this header value to operate only on a blob if\n// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only\n// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate\n// only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a\n// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded\n// in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) ReleaseLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobReleaseLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.releaseLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.releaseLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobReleaseLeaseResponse), err\n}\n\n// releaseLeasePreparer prepares the ReleaseLease request.\nfunc (client blobClient) releaseLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-lease-id\", leaseID)\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"release\")\n\treturn req, nil\n}\n\n// releaseLeaseResponder handles the response to the ReleaseLease request.\nfunc (client blobClient) releaseLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobReleaseLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// RenewLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete\n// operations\n//\n// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout\n// is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> ifModifiedSince is specify this header value to operate only on a blob if\n// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only\n// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate\n// only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a\n// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded\n// in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) RenewLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobRenewLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.renewLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.renewLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobRenewLeaseResponse), err\n}\n\n// renewLeasePreparer prepares the RenewLease request.\nfunc (client blobClient) renewLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-lease-id\", leaseID)\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"renew\")\n\treturn req, nil\n}\n\n// renewLeaseResponder handles the response to the RenewLease request.\nfunc (client blobClient) renewLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobRenewLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// SetHTTPHeaders the Set HTTP Headers operation sets system properties on the blob\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> blobCacheControl is optional. Sets the blob's cache control. If specified,\n// this property is stored with the blob and returned with a read request. blobContentType is optional. Sets the blob's\n// content type. If specified, this property is stored with the blob and returned with a read request. blobContentMD5\n// is optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual\n// blocks were validated when each was uploaded. blobContentEncoding is optional. Sets the blob's content encoding. If\n// specified, this property is stored with the blob and returned with a read request. blobContentLanguage is optional.\n// Set the blob's content language. If specified, this property is stored with the blob and returned with a read\n// request. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this\n// ID. ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the\n// specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been\n// modified since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching\n// value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value.\n// blobContentDisposition is optional. Sets the blob's Content-Disposition header. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client blobClient) SetHTTPHeaders(ctx context.Context, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (*BlobSetHTTPHeadersResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.setHTTPHeadersPreparer(timeout, blobCacheControl, blobContentType, blobContentMD5, blobContentEncoding, blobContentLanguage, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobContentDisposition, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setHTTPHeadersResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobSetHTTPHeadersResponse), err\n}\n\n// setHTTPHeadersPreparer prepares the SetHTTPHeaders request.\nfunc (client blobClient) setHTTPHeadersPreparer(timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"properties\")\n\treq.URL.RawQuery = params.Encode()\n\tif blobCacheControl != nil {\n\t\treq.Header.Set(\"x-ms-blob-cache-control\", *blobCacheControl)\n\t}\n\tif blobContentType != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-type\", *blobContentType)\n\t}\n\tif blobContentMD5 != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-md5\", base64.StdEncoding.EncodeToString(blobContentMD5))\n\t}\n\tif blobContentEncoding != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-encoding\", *blobContentEncoding)\n\t}\n\tif blobContentLanguage != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-language\", *blobContentLanguage)\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\tif blobContentDisposition != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-disposition\", *blobContentDisposition)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// setHTTPHeadersResponder handles the response to the SetHTTPHeaders request.\nfunc (client blobClient) setHTTPHeadersResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobSetHTTPHeadersResponse{rawResponse: resp.Response()}, err\n}\n\n// SetMetadata the Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more\n// name-value pairs\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> metadata is optional. Specifies a user-defined name-value pair associated\n// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or\n// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with\n// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version\n// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing\n// Containers, Blobs, and Metadata for more information. leaseID is if specified, the operation only succeeds if the\n// container's lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a\n// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value\n// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs\n// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is\n// recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) SetMetadata(ctx context.Context, timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobSetMetadataResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.setMetadataPreparer(timeout, metadata, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setMetadataResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobSetMetadataResponse), err\n}\n\n// setMetadataPreparer prepares the SetMetadata request.\nfunc (client blobClient) setMetadataPreparer(timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"metadata\")\n\treq.URL.RawQuery = params.Encode()\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// setMetadataResponder handles the response to the SetMetadata request.\nfunc (client blobClient) setMetadataResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobSetMetadataResponse{rawResponse: resp.Response()}, err\n}\n\n// SetTier the Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium storage\n// account and on a block blob in a blob storage account (locally redundant storage only). A premium page blob's tier\n// determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive\n// storage type. This operation does not update the blob's ETag.\n//\n// tier is indicates the tier to be set on the blob. timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) SetTier(ctx context.Context, tier AccessTierType, timeout *int32, requestID *string) (*BlobSetTierResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.setTierPreparer(tier, timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setTierResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobSetTierResponse), err\n}\n\n// setTierPreparer prepares the SetTier request.\nfunc (client blobClient) setTierPreparer(tier AccessTierType, timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"tier\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-access-tier\", string(tier))\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// setTierResponder handles the response to the SetTier request.\nfunc (client blobClient) setTierResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobSetTierResponse{rawResponse: resp.Response()}, err\n}\n\n// StartCopyFromURL the Start Copy From URL operation copies a blob or an internet resource to a new blob.\n//\n// copySource is specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that\n// specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob\n// must either be public or must be authenticated via a shared access signature. timeout is the timeout parameter is\n// expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> metadata is optional. Specifies a user-defined name-value pair associated\n// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or\n// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with\n// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version\n// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing\n// Containers, Blobs, and Metadata for more information. sourceIfModifiedSince is specify this header value to operate\n// only on a blob if it has been modified since the specified date/time. sourceIfUnmodifiedSince is specify this header\n// value to operate only on a blob if it has not been modified since the specified date/time. sourceIfMatches is\n// specify an ETag value to operate only on blobs with a matching value. sourceIfNoneMatch is specify an ETag value to\n// operate only on blobs without a matching value. ifModifiedSince is specify this header value to operate only on a\n// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value\n// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs\n// without a matching value. leaseID is if specified, the operation only succeeds if the container's lease is active\n// and matches this ID. sourceLeaseID is specify this header to perform the operation only if the lease ID given\n// matches the active lease ID of the source blob. requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) StartCopyFromURL(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatches *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, sourceLeaseID *string, requestID *string) (*BlobStartCopyFromURLResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.startCopyFromURLPreparer(copySource, timeout, metadata, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatches, sourceIfNoneMatch, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, leaseID, sourceLeaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.startCopyFromURLResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobStartCopyFromURLResponse), err\n}\n\n// startCopyFromURLPreparer prepares the StartCopyFromURL request.\nfunc (client blobClient) startCopyFromURLPreparer(copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatches *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, sourceLeaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\treq.URL.RawQuery = params.Encode()\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif sourceIfModifiedSince != nil {\n\t\treq.Header.Set(\"x-ms-source-if-modified-since\", (*sourceIfModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif sourceIfUnmodifiedSince != nil {\n\t\treq.Header.Set(\"x-ms-source-if-unmodified-since\", (*sourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif sourceIfMatches != nil {\n\t\treq.Header.Set(\"x-ms-source-if-match\", string(*sourceIfMatches))\n\t}\n\tif sourceIfNoneMatch != nil {\n\t\treq.Header.Set(\"x-ms-source-if-none-match\", string(*sourceIfNoneMatch))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-copy-source\", copySource)\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif sourceLeaseID != nil {\n\t\treq.Header.Set(\"x-ms-source-lease-id\", *sourceLeaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// startCopyFromURLResponder handles the response to the StartCopyFromURL request.\nfunc (client blobClient) startCopyFromURLResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobStartCopyFromURLResponse{rawResponse: resp.Response()}, err\n}\n\n// Undelete undelete a blob that was previously soft deleted\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blobClient) Undelete(ctx context.Context, timeout *int32, requestID *string) (*BlobUndeleteResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.undeletePreparer(timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.undeleteResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlobUndeleteResponse), err\n}\n\n// undeletePreparer prepares the Undelete request.\nfunc (client blobClient) undeletePreparer(timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"undelete\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// undeleteResponder handles the response to the Undelete request.\nfunc (client blobClient) undeleteResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlobUndeleteResponse{rawResponse: resp.Response()}, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_block_blob.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/xml\"\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// blockBlobClient is the client for the BlockBlob methods of the Azblob service.\ntype blockBlobClient struct {\n\tmanagementClient\n}\n\n// newBlockBlobClient creates an instance of the blockBlobClient client.\nfunc newBlockBlobClient(url url.URL, p pipeline.Pipeline) blockBlobClient {\n\treturn blockBlobClient{newManagementClient(url, p)}\n}\n\n// CommitBlockList the Commit Block List operation writes a blob by specifying the list of block IDs that make up the\n// blob. In order to be written as part of a blob, a block must have been successfully written to the server in a prior\n// Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that have changed,\n// then committing the new and existing blocks together. You can do this by specifying whether to commit a block from\n// the committed block list or from the uncommitted block list, or to commit the most recently uploaded version of the\n// block, whichever list it may belong to.\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> blobCacheControl is optional. Sets the blob's cache control. If specified,\n// this property is stored with the blob and returned with a read request. blobContentType is optional. Sets the blob's\n// content type. If specified, this property is stored with the blob and returned with a read request.\n// blobContentEncoding is optional. Sets the blob's content encoding. If specified, this property is stored with the\n// blob and returned with a read request. blobContentLanguage is optional. Set the blob's content language. If\n// specified, this property is stored with the blob and returned with a read request. blobContentMD5 is optional. An\n// MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks were\n// validated when each was uploaded. metadata is optional. Specifies a user-defined name-value pair associated with the\n// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the\n// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified\n// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19,\n// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and\n// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is\n// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header.\n// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified\n// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified\n// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value.\n// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client blockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobCommitBlockListResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.commitBlockListPreparer(blocks, timeout, blobCacheControl, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.commitBlockListResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlockBlobCommitBlockListResponse), err\n}\n\n// commitBlockListPreparer prepares the CommitBlockList request.\nfunc (client blockBlobClient) commitBlockListPreparer(blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"blocklist\")\n\treq.URL.RawQuery = params.Encode()\n\tif blobCacheControl != nil {\n\t\treq.Header.Set(\"x-ms-blob-cache-control\", *blobCacheControl)\n\t}\n\tif blobContentType != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-type\", *blobContentType)\n\t}\n\tif blobContentEncoding != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-encoding\", *blobContentEncoding)\n\t}\n\tif blobContentLanguage != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-language\", *blobContentLanguage)\n\t}\n\tif blobContentMD5 != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-md5\", base64.StdEncoding.EncodeToString(blobContentMD5))\n\t}\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif blobContentDisposition != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-disposition\", *blobContentDisposition)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\tb, err := xml.Marshal(blocks)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to marshal request body\")\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/xml\")\n\terr = req.SetBody(bytes.NewReader(b))\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to set request body\")\n\t}\n\treturn req, nil\n}\n\n// commitBlockListResponder handles the response to the CommitBlockList request.\nfunc (client blockBlobClient) commitBlockListResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlockBlobCommitBlockListResponse{rawResponse: resp.Response()}, err\n}\n\n// GetBlockList the Get Block List operation retrieves the list of blocks that have been uploaded as part of a block\n// blob\n//\n// listType is specifies whether to return the list of committed blocks, the list of uncommitted blocks, or both lists\n// together. snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob\n// snapshot to retrieve. For more information on working with blob snapshots, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob\">Creating\n// a Snapshot of a Blob.</a> timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character\n// limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blockBlobClient) GetBlockList(ctx context.Context, listType BlockListType, snapshot *string, timeout *int32, leaseID *string, requestID *string) (*BlockList, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getBlockListPreparer(listType, snapshot, timeout, leaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getBlockListResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlockList), err\n}\n\n// getBlockListPreparer prepares the GetBlockList request.\nfunc (client blockBlobClient) getBlockListPreparer(listType BlockListType, snapshot *string, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif snapshot != nil && len(*snapshot) > 0 {\n\t\tparams.Set(\"snapshot\", *snapshot)\n\t}\n\tparams.Set(\"blocklisttype\", string(listType))\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"blocklist\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getBlockListResponder handles the response to the GetBlockList request.\nfunc (client blockBlobClient) getBlockListResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &BlockList{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// StageBlock the Stage Block operation creates a new block to be committed as part of a blob\n//\n// blockID is a valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or\n// equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the\n// same size for each block. contentLength is the length of the request. body is initial data body will be closed upon\n// successful return. Callers should ensure closure when receiving an error.timeout is the timeout parameter is\n// expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character\n// limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blockBlobClient) StageBlock(ctx context.Context, blockID string, contentLength int64, body io.ReadSeeker, timeout *int32, leaseID *string, requestID *string) (*BlockBlobStageBlockResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: body,\n\t\t\tconstraints: []constraint{{target: \"body\", name: null, rule: true, chain: nil}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.stageBlockPreparer(blockID, contentLength, body, timeout, leaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.stageBlockResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlockBlobStageBlockResponse), err\n}\n\n// stageBlockPreparer prepares the StageBlock request.\nfunc (client blockBlobClient) stageBlockPreparer(blockID string, contentLength int64, body io.ReadSeeker, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, body)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tparams.Set(\"blockid\", blockID)\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"block\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// stageBlockResponder handles the response to the StageBlock request.\nfunc (client blockBlobClient) stageBlockResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlockBlobStageBlockResponse{rawResponse: resp.Response()}, err\n}\n\n// StageBlockFromURL the Stage Block operation creates a new block to be committed as part of a blob where the contents\n// are read from a URL.\n//\n// blockID is a valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or\n// equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the\n// same size for each block. contentLength is the length of the request. sourceURL is specifiy an URL to the copy\n// source. sourceRange is bytes of source data in the specified range. sourceContentMD5 is specify the md5 calculated\n// for the range of bytes that must be read from the copy source. timeout is the timeout parameter is expressed in\n// seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character\n// limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client blockBlobClient) StageBlockFromURL(ctx context.Context, blockID string, contentLength int64, sourceURL *string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (*BlockBlobStageBlockFromURLResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.stageBlockFromURLPreparer(blockID, contentLength, sourceURL, sourceRange, sourceContentMD5, timeout, leaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.stageBlockFromURLResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlockBlobStageBlockFromURLResponse), err\n}\n\n// stageBlockFromURLPreparer prepares the StageBlockFromURL request.\nfunc (client blockBlobClient) stageBlockFromURLPreparer(blockID string, contentLength int64, sourceURL *string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tparams.Set(\"blockid\", blockID)\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"block\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif sourceURL != nil {\n\t\treq.Header.Set(\"x-ms-copy-source\", *sourceURL)\n\t}\n\tif sourceRange != nil {\n\t\treq.Header.Set(\"x-ms-source-range\", *sourceRange)\n\t}\n\tif sourceContentMD5 != nil {\n\t\treq.Header.Set(\"x-ms-source-content-md5\", base64.StdEncoding.EncodeToString(sourceContentMD5))\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// stageBlockFromURLResponder handles the response to the StageBlockFromURL request.\nfunc (client blockBlobClient) stageBlockFromURLResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlockBlobStageBlockFromURLResponse{rawResponse: resp.Response()}, err\n}\n\n// Upload the Upload Block Blob operation updates the content of an existing block blob. Updating an existing block\n// blob overwrites any existing metadata on the blob. Partial updates are not supported with Put Blob; the content of\n// the existing blob is overwritten with the content of the new blob. To perform a partial update of the content of a\n// block blob, use the Put Block List operation.\n//\n// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an\n// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> blobContentType is optional. Sets the blob's content type. If specified,\n// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the\n// blob's content encoding. If specified, this property is stored with the blob and returned with a read request.\n// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the\n// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this\n// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded.\n// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and\n// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the\n// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the\n// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified\n// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19,\n// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and\n// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is\n// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header.\n// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified\n// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified\n// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value.\n// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client blockBlobClient) Upload(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobUploadResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: body,\n\t\t\tconstraints: []constraint{{target: \"body\", name: null, rule: true, chain: nil}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.uploadPreparer(body, contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.uploadResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*BlockBlobUploadResponse), err\n}\n\n// uploadPreparer prepares the Upload request.\nfunc (client blockBlobClient) uploadPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, body)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif blobContentType != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-type\", *blobContentType)\n\t}\n\tif blobContentEncoding != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-encoding\", *blobContentEncoding)\n\t}\n\tif blobContentLanguage != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-language\", *blobContentLanguage)\n\t}\n\tif blobContentMD5 != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-md5\", base64.StdEncoding.EncodeToString(blobContentMD5))\n\t}\n\tif blobCacheControl != nil {\n\t\treq.Header.Set(\"x-ms-blob-cache-control\", *blobCacheControl)\n\t}\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif blobContentDisposition != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-disposition\", *blobContentDisposition)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-blob-type\", \"BlockBlob\")\n\treturn req, nil\n}\n\n// uploadResponder handles the response to the Upload request.\nfunc (client blockBlobClient) uploadResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &BlockBlobUploadResponse{rawResponse: resp.Response()}, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_client.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"net/url\"\n)\n\nconst (\n\t// ServiceVersion specifies the version of the operations used in this package.\n\tServiceVersion = \"2018-03-28\"\n)\n\n// managementClient is the base client for Azblob.\ntype managementClient struct {\n\turl url.URL\n\tp   pipeline.Pipeline\n}\n\n// newManagementClient creates an instance of the managementClient client.\nfunc newManagementClient(url url.URL, p pipeline.Pipeline) managementClient {\n\treturn managementClient{\n\t\turl: url,\n\t\tp:   p,\n\t}\n}\n\n// URL returns a copy of the URL for this client.\nfunc (mc managementClient) URL() url.URL {\n\treturn mc.url\n}\n\n// Pipeline returns the pipeline for this client.\nfunc (mc managementClient) Pipeline() pipeline.Pipeline {\n\treturn mc.p\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_container.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/xml\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n)\n\n// containerClient is the client for the Container methods of the Azblob service.\ntype containerClient struct {\n\tmanagementClient\n}\n\n// newContainerClient creates an instance of the containerClient client.\nfunc newContainerClient(url url.URL, p pipeline.Pipeline) containerClient {\n\treturn containerClient{newManagementClient(url, p)}\n}\n\n// AcquireLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be\n// 15 to 60 seconds, or can be infinite\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> duration is specifies the duration of the lease, in seconds, or negative\n// one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration\n// cannot be changed using renew or change. proposedLeaseID is proposed lease ID, in a GUID string format. The Blob\n// service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor\n// (String) for a list of valid GUID string formats. ifModifiedSince is specify this header value to operate only on a\n// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client containerClient) AcquireLease(ctx context.Context, timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerAcquireLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.acquireLeasePreparer(timeout, duration, proposedLeaseID, ifModifiedSince, ifUnmodifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.acquireLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerAcquireLeaseResponse), err\n}\n\n// acquireLeasePreparer prepares the AcquireLease request.\nfunc (client containerClient) acquireLeasePreparer(timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\tif duration != nil {\n\t\treq.Header.Set(\"x-ms-lease-duration\", strconv.FormatInt(int64(*duration), 10))\n\t}\n\tif proposedLeaseID != nil {\n\t\treq.Header.Set(\"x-ms-proposed-lease-id\", *proposedLeaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"acquire\")\n\treturn req, nil\n}\n\n// acquireLeaseResponder handles the response to the AcquireLease request.\nfunc (client containerClient) acquireLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerAcquireLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// BreakLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15\n// to 60 seconds, or can be infinite\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> breakPeriod is for a break operation, proposed duration the lease should\n// continue before it is broken, in seconds, between 0 and 60. This break period is only used if it is shorter than the\n// time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available\n// before the break period has expired, but the lease may be held for longer than the break period. If this header does\n// not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an\n// infinite lease breaks immediately. ifModifiedSince is specify this header value to operate only on a blob if it has\n// been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a\n// blob if it has not been modified since the specified date/time. requestID is provides a client-generated, opaque\n// value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) BreakLease(ctx context.Context, timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerBreakLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.breakLeasePreparer(timeout, breakPeriod, ifModifiedSince, ifUnmodifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.breakLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerBreakLeaseResponse), err\n}\n\n// breakLeasePreparer prepares the BreakLease request.\nfunc (client containerClient) breakLeasePreparer(timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\tif breakPeriod != nil {\n\t\treq.Header.Set(\"x-ms-lease-break-period\", strconv.FormatInt(int64(*breakPeriod), 10))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"break\")\n\treturn req, nil\n}\n\n// breakLeaseResponder handles the response to the BreakLease request.\nfunc (client containerClient) breakLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerBreakLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// ChangeLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be\n// 15 to 60 seconds, or can be infinite\n//\n// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID.\n// proposedLeaseID is proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the\n// proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string\n// formats. timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> ifModifiedSince is specify this header value to operate only on a blob if\n// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only\n// on a blob if it has not been modified since the specified date/time. requestID is provides a client-generated,\n// opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is\n// enabled.\nfunc (client containerClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerChangeLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.changeLeasePreparer(leaseID, proposedLeaseID, timeout, ifModifiedSince, ifUnmodifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.changeLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerChangeLeaseResponse), err\n}\n\n// changeLeasePreparer prepares the ChangeLease request.\nfunc (client containerClient) changeLeasePreparer(leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-lease-id\", leaseID)\n\treq.Header.Set(\"x-ms-proposed-lease-id\", proposedLeaseID)\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"change\")\n\treturn req, nil\n}\n\n// changeLeaseResponder handles the response to the ChangeLease request.\nfunc (client containerClient) changeLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerChangeLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// Create creates a new container under the specified account. If the container with the same name already exists, the\n// operation fails\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> metadata is optional. Specifies a user-defined name-value pair associated\n// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or\n// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with\n// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version\n// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing\n// Containers, Blobs, and Metadata for more information. access is specifies whether data in the container may be\n// accessed publicly and the level of access requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) Create(ctx context.Context, timeout *int32, metadata map[string]string, access PublicAccessType, requestID *string) (*ContainerCreateResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.createPreparer(timeout, metadata, access, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerCreateResponse), err\n}\n\n// createPreparer prepares the Create request.\nfunc (client containerClient) createPreparer(timeout *int32, metadata map[string]string, access PublicAccessType, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif access != PublicAccessNone {\n\t\treq.Header.Set(\"x-ms-blob-public-access\", string(access))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// createResponder handles the response to the Create request.\nfunc (client containerClient) createResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerCreateResponse{rawResponse: resp.Response()}, err\n}\n\n// Delete operation marks the specified container for deletion. The container and any blobs contained within it are\n// later deleted during garbage collection\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it\n// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a\n// blob if it has not been modified since the specified date/time. requestID is provides a client-generated, opaque\n// value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) Delete(ctx context.Context, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerDeleteResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.deletePreparer(timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.deleteResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerDeleteResponse), err\n}\n\n// deletePreparer prepares the Delete request.\nfunc (client containerClient) deletePreparer(timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"DELETE\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// deleteResponder handles the response to the Delete request.\nfunc (client containerClient) deleteResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerDeleteResponse{rawResponse: resp.Response()}, err\n}\n\n// GetAccessPolicy gets the permissions for the specified container. The permissions indicate whether container data\n// may be accessed publicly.\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character\n// limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) GetAccessPolicy(ctx context.Context, timeout *int32, leaseID *string, requestID *string) (*SignedIdentifiers, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getAccessPolicyPreparer(timeout, leaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getAccessPolicyResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*SignedIdentifiers), err\n}\n\n// getAccessPolicyPreparer prepares the GetAccessPolicy request.\nfunc (client containerClient) getAccessPolicyPreparer(timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\tparams.Set(\"comp\", \"acl\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getAccessPolicyResponder handles the response to the GetAccessPolicy request.\nfunc (client containerClient) getAccessPolicyResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &SignedIdentifiers{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// GetProperties returns all user-defined metadata and system properties for the specified container. The data returned\n// does not include the container's list of blobs\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character\n// limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) GetProperties(ctx context.Context, timeout *int32, leaseID *string, requestID *string) (*ContainerGetPropertiesResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getPropertiesPreparer(timeout, leaseID, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPropertiesResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerGetPropertiesResponse), err\n}\n\n// getPropertiesPreparer prepares the GetProperties request.\nfunc (client containerClient) getPropertiesPreparer(timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getPropertiesResponder handles the response to the GetProperties request.\nfunc (client containerClient) getPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerGetPropertiesResponse{rawResponse: resp.Response()}, err\n}\n\n// ListBlobFlatSegment [Update] The List Blobs operation returns a list of the blobs under the specified container\n//\n// prefix is filters the results to return only containers whose name begins with the specified prefix. marker is a\n// string value that identifies the portion of the list of containers to be returned with the next listing operation.\n// The operation returns the NextMarker value within the response body if the listing operation did not return all\n// containers remaining to be listed with the current page. The NextMarker value can be used as the value for the\n// marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the\n// client. maxresults is specifies the maximum number of containers to return. If the request does not specify\n// maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the\n// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the\n// remainder of the results. For this reason, it is possible that the service will return fewer results than specified\n// by maxresults, or than the default of 5000. include is include this parameter to specify one or more datasets to\n// include in the response. timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) ListBlobFlatSegment(ctx context.Context, prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (*ListBlobsFlatSegmentResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: maxresults,\n\t\t\tconstraints: []constraint{{target: \"maxresults\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"maxresults\", name: inclusiveMinimum, rule: 1, chain: nil}}}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.listBlobFlatSegmentPreparer(prefix, marker, maxresults, include, timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.listBlobFlatSegmentResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ListBlobsFlatSegmentResponse), err\n}\n\n// listBlobFlatSegmentPreparer prepares the ListBlobFlatSegment request.\nfunc (client containerClient) listBlobFlatSegmentPreparer(prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif prefix != nil && len(*prefix) > 0 {\n\t\tparams.Set(\"prefix\", *prefix)\n\t}\n\tif marker != nil && len(*marker) > 0 {\n\t\tparams.Set(\"marker\", *marker)\n\t}\n\tif maxresults != nil {\n\t\tparams.Set(\"maxresults\", strconv.FormatInt(int64(*maxresults), 10))\n\t}\n\tif include != nil && len(include) > 0 {\n\t\tparams.Set(\"include\", joinConst(include, \",\"))\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\tparams.Set(\"comp\", \"list\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// listBlobFlatSegmentResponder handles the response to the ListBlobFlatSegment request.\nfunc (client containerClient) listBlobFlatSegmentResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &ListBlobsFlatSegmentResponse{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// ListBlobHierarchySegment [Update] The List Blobs operation returns a list of the blobs under the specified container\n//\n// delimiter is when the request includes this parameter, the operation returns a BlobPrefix element in the response\n// body that acts as a placeholder for all blobs whose names begin with the same substring up to the appearance of the\n// delimiter character. The delimiter may be a single character or a string. prefix is filters the results to return\n// only containers whose name begins with the specified prefix. marker is a string value that identifies the portion of\n// the list of containers to be returned with the next listing operation. The operation returns the NextMarker value\n// within the response body if the listing operation did not return all containers remaining to be listed with the\n// current page. The NextMarker value can be used as the value for the marker parameter in a subsequent call to request\n// the next page of list items. The marker value is opaque to the client. maxresults is specifies the maximum number of\n// containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server\n// will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will\n// return a continuation token for retrieving the remainder of the results. For this reason, it is possible that the\n// service will return fewer results than specified by maxresults, or than the default of 5000. include is include this\n// parameter to specify one or more datasets to include in the response. timeout is the timeout parameter is expressed\n// in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) ListBlobHierarchySegment(ctx context.Context, delimiter string, prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (*ListBlobsHierarchySegmentResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: maxresults,\n\t\t\tconstraints: []constraint{{target: \"maxresults\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"maxresults\", name: inclusiveMinimum, rule: 1, chain: nil}}}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.listBlobHierarchySegmentPreparer(delimiter, prefix, marker, maxresults, include, timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.listBlobHierarchySegmentResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ListBlobsHierarchySegmentResponse), err\n}\n\n// listBlobHierarchySegmentPreparer prepares the ListBlobHierarchySegment request.\nfunc (client containerClient) listBlobHierarchySegmentPreparer(delimiter string, prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif prefix != nil && len(*prefix) > 0 {\n\t\tparams.Set(\"prefix\", *prefix)\n\t}\n\tparams.Set(\"delimiter\", delimiter)\n\tif marker != nil && len(*marker) > 0 {\n\t\tparams.Set(\"marker\", *marker)\n\t}\n\tif maxresults != nil {\n\t\tparams.Set(\"maxresults\", strconv.FormatInt(int64(*maxresults), 10))\n\t}\n\tif include != nil && len(include) > 0 {\n\t\tparams.Set(\"include\", joinConst(include, \",\"))\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\tparams.Set(\"comp\", \"list\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// listBlobHierarchySegmentResponder handles the response to the ListBlobHierarchySegment request.\nfunc (client containerClient) listBlobHierarchySegmentResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &ListBlobsHierarchySegmentResponse{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// ReleaseLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be\n// 15 to 60 seconds, or can be infinite\n//\n// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout\n// is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> ifModifiedSince is specify this header value to operate only on a blob if\n// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only\n// on a blob if it has not been modified since the specified date/time. requestID is provides a client-generated,\n// opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is\n// enabled.\nfunc (client containerClient) ReleaseLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerReleaseLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.releaseLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.releaseLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerReleaseLeaseResponse), err\n}\n\n// releaseLeasePreparer prepares the ReleaseLease request.\nfunc (client containerClient) releaseLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-lease-id\", leaseID)\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"release\")\n\treturn req, nil\n}\n\n// releaseLeaseResponder handles the response to the ReleaseLease request.\nfunc (client containerClient) releaseLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerReleaseLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// RenewLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15\n// to 60 seconds, or can be infinite\n//\n// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout\n// is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> ifModifiedSince is specify this header value to operate only on a blob if\n// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only\n// on a blob if it has not been modified since the specified date/time. requestID is provides a client-generated,\n// opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is\n// enabled.\nfunc (client containerClient) RenewLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerRenewLeaseResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.renewLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.renewLeaseResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerRenewLeaseResponse), err\n}\n\n// renewLeasePreparer prepares the RenewLease request.\nfunc (client containerClient) renewLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"lease\")\n\tparams.Set(\"restype\", \"container\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-lease-id\", leaseID)\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-lease-action\", \"renew\")\n\treturn req, nil\n}\n\n// renewLeaseResponder handles the response to the RenewLease request.\nfunc (client containerClient) renewLeaseResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerRenewLeaseResponse{rawResponse: resp.Response()}, err\n}\n\n// SetAccessPolicy sets the permissions for the specified container. The permissions indicate whether blobs in a\n// container may be accessed publicly.\n//\n// containerACL is the acls for the container timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. access is specifies whether data in the container may be accessed publicly and\n// the level of access ifModifiedSince is specify this header value to operate only on a blob if it has been modified\n// since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has\n// not been modified since the specified date/time. requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) SetAccessPolicy(ctx context.Context, containerACL []SignedIdentifier, timeout *int32, leaseID *string, access PublicAccessType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerSetAccessPolicyResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.setAccessPolicyPreparer(containerACL, timeout, leaseID, access, ifModifiedSince, ifUnmodifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setAccessPolicyResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerSetAccessPolicyResponse), err\n}\n\n// setAccessPolicyPreparer prepares the SetAccessPolicy request.\nfunc (client containerClient) setAccessPolicyPreparer(containerACL []SignedIdentifier, timeout *int32, leaseID *string, access PublicAccessType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\tparams.Set(\"comp\", \"acl\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif access != PublicAccessNone {\n\t\treq.Header.Set(\"x-ms-blob-public-access\", string(access))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\tb, err := xml.Marshal(SignedIdentifiers{Items: containerACL})\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to marshal request body\")\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/xml\")\n\terr = req.SetBody(bytes.NewReader(b))\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to set request body\")\n\t}\n\treturn req, nil\n}\n\n// setAccessPolicyResponder handles the response to the SetAccessPolicy request.\nfunc (client containerClient) setAccessPolicyResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerSetAccessPolicyResponse{rawResponse: resp.Response()}, err\n}\n\n// SetMetadata operation sets one or more user-defined name-value pairs for the specified container.\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. metadata is optional. Specifies a user-defined name-value pair associated with\n// the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to\n// the destination blob. If one or more name-value pairs are specified, the destination blob is created with the\n// specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version\n// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing\n// Containers, Blobs, and Metadata for more information. ifModifiedSince is specify this header value to operate only\n// on a blob if it has been modified since the specified date/time. requestID is provides a client-generated, opaque\n// value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client containerClient) SetMetadata(ctx context.Context, timeout *int32, leaseID *string, metadata map[string]string, ifModifiedSince *time.Time, requestID *string) (*ContainerSetMetadataResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.setMetadataPreparer(timeout, leaseID, metadata, ifModifiedSince, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setMetadataResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ContainerSetMetadataResponse), err\n}\n\n// setMetadataPreparer prepares the SetMetadata request.\nfunc (client containerClient) setMetadataPreparer(timeout *int32, leaseID *string, metadata map[string]string, ifModifiedSince *time.Time, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"container\")\n\tparams.Set(\"comp\", \"metadata\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// setMetadataResponder handles the response to the SetMetadata request.\nfunc (client containerClient) setMetadataResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ContainerSetMetadataResponse{rawResponse: resp.Response()}, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_models.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/xml\"\n\t\"io\"\n\t\"net/http\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\t\"unsafe\"\n)\n\n// ETag is an entity tag.\ntype ETag string\n\nconst (\n\t// ETagNone represents an empty entity tag.\n\tETagNone ETag = \"\"\n\n\t// ETagAny matches any entity tag.\n\tETagAny ETag = \"*\"\n)\n\n// Metadata contains metadata key/value pairs.\ntype Metadata map[string]string\n\nconst mdPrefix = \"x-ms-meta-\"\n\nconst mdPrefixLen = len(mdPrefix)\n\n// UnmarshalXML implements the xml.Unmarshaler interface for Metadata.\nfunc (md *Metadata) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {\n\ttokName := \"\"\n\tfor t, err := d.Token(); err == nil; t, err = d.Token() {\n\t\tswitch tt := t.(type) {\n\t\tcase xml.StartElement:\n\t\t\ttokName = strings.ToLower(tt.Name.Local)\n\t\t\tbreak\n\t\tcase xml.CharData:\n\t\t\tif *md == nil {\n\t\t\t\t*md = Metadata{}\n\t\t\t}\n\t\t\t(*md)[tokName] = string(tt)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn nil\n}\n\n// Marker represents an opaque value used in paged responses.\ntype Marker struct {\n\tval *string\n}\n\n// NotDone returns true if the list enumeration should be started or is not yet complete. Specifically, NotDone returns true\n// for a just-initialized (zero value) Marker indicating that you should make an initial request to get a result portion from\n// the service. NotDone also returns true whenever the service returns an interim result portion. NotDone returns false only\n// after the service has returned the final result portion.\nfunc (m Marker) NotDone() bool {\n\treturn m.val == nil || *m.val != \"\"\n}\n\n// UnmarshalXML implements the xml.Unmarshaler interface for Marker.\nfunc (m *Marker) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {\n\tvar out string\n\terr := d.DecodeElement(&out, &start)\n\tm.val = &out\n\treturn err\n}\n\n// concatenates a slice of const values with the specified separator between each item\nfunc joinConst(s interface{}, sep string) string {\n\tv := reflect.ValueOf(s)\n\tif v.Kind() != reflect.Slice && v.Kind() != reflect.Array {\n\t\tpanic(\"s wasn't a slice or array\")\n\t}\n\tss := make([]string, 0, v.Len())\n\tfor i := 0; i < v.Len(); i++ {\n\t\tss = append(ss, v.Index(i).String())\n\t}\n\treturn strings.Join(ss, sep)\n}\n\n// AccessTierType enumerates the values for access tier type.\ntype AccessTierType string\n\nconst (\n\t// AccessTierArchive ...\n\tAccessTierArchive AccessTierType = \"Archive\"\n\t// AccessTierCool ...\n\tAccessTierCool AccessTierType = \"Cool\"\n\t// AccessTierHot ...\n\tAccessTierHot AccessTierType = \"Hot\"\n\t// AccessTierNone represents an empty AccessTierType.\n\tAccessTierNone AccessTierType = \"\"\n\t// AccessTierP10 ...\n\tAccessTierP10 AccessTierType = \"P10\"\n\t// AccessTierP20 ...\n\tAccessTierP20 AccessTierType = \"P20\"\n\t// AccessTierP30 ...\n\tAccessTierP30 AccessTierType = \"P30\"\n\t// AccessTierP4 ...\n\tAccessTierP4 AccessTierType = \"P4\"\n\t// AccessTierP40 ...\n\tAccessTierP40 AccessTierType = \"P40\"\n\t// AccessTierP50 ...\n\tAccessTierP50 AccessTierType = \"P50\"\n\t// AccessTierP6 ...\n\tAccessTierP6 AccessTierType = \"P6\"\n)\n\n// PossibleAccessTierTypeValues returns an array of possible values for the AccessTierType const type.\nfunc PossibleAccessTierTypeValues() []AccessTierType {\n\treturn []AccessTierType{AccessTierArchive, AccessTierCool, AccessTierHot, AccessTierNone, AccessTierP10, AccessTierP20, AccessTierP30, AccessTierP4, AccessTierP40, AccessTierP50, AccessTierP6}\n}\n\n// ArchiveStatusType enumerates the values for archive status type.\ntype ArchiveStatusType string\n\nconst (\n\t// ArchiveStatusNone represents an empty ArchiveStatusType.\n\tArchiveStatusNone ArchiveStatusType = \"\"\n\t// ArchiveStatusRehydratePendingToCool ...\n\tArchiveStatusRehydratePendingToCool ArchiveStatusType = \"rehydrate-pending-to-cool\"\n\t// ArchiveStatusRehydratePendingToHot ...\n\tArchiveStatusRehydratePendingToHot ArchiveStatusType = \"rehydrate-pending-to-hot\"\n)\n\n// PossibleArchiveStatusTypeValues returns an array of possible values for the ArchiveStatusType const type.\nfunc PossibleArchiveStatusTypeValues() []ArchiveStatusType {\n\treturn []ArchiveStatusType{ArchiveStatusNone, ArchiveStatusRehydratePendingToCool, ArchiveStatusRehydratePendingToHot}\n}\n\n// BlobType enumerates the values for blob type.\ntype BlobType string\n\nconst (\n\t// BlobAppendBlob ...\n\tBlobAppendBlob BlobType = \"AppendBlob\"\n\t// BlobBlockBlob ...\n\tBlobBlockBlob BlobType = \"BlockBlob\"\n\t// BlobNone represents an empty BlobType.\n\tBlobNone BlobType = \"\"\n\t// BlobPageBlob ...\n\tBlobPageBlob BlobType = \"PageBlob\"\n)\n\n// PossibleBlobTypeValues returns an array of possible values for the BlobType const type.\nfunc PossibleBlobTypeValues() []BlobType {\n\treturn []BlobType{BlobAppendBlob, BlobBlockBlob, BlobNone, BlobPageBlob}\n}\n\n// BlockListType enumerates the values for block list type.\ntype BlockListType string\n\nconst (\n\t// BlockListAll ...\n\tBlockListAll BlockListType = \"all\"\n\t// BlockListCommitted ...\n\tBlockListCommitted BlockListType = \"committed\"\n\t// BlockListNone represents an empty BlockListType.\n\tBlockListNone BlockListType = \"\"\n\t// BlockListUncommitted ...\n\tBlockListUncommitted BlockListType = \"uncommitted\"\n)\n\n// PossibleBlockListTypeValues returns an array of possible values for the BlockListType const type.\nfunc PossibleBlockListTypeValues() []BlockListType {\n\treturn []BlockListType{BlockListAll, BlockListCommitted, BlockListNone, BlockListUncommitted}\n}\n\n// CopyStatusType enumerates the values for copy status type.\ntype CopyStatusType string\n\nconst (\n\t// CopyStatusAborted ...\n\tCopyStatusAborted CopyStatusType = \"aborted\"\n\t// CopyStatusFailed ...\n\tCopyStatusFailed CopyStatusType = \"failed\"\n\t// CopyStatusNone represents an empty CopyStatusType.\n\tCopyStatusNone CopyStatusType = \"\"\n\t// CopyStatusPending ...\n\tCopyStatusPending CopyStatusType = \"pending\"\n\t// CopyStatusSuccess ...\n\tCopyStatusSuccess CopyStatusType = \"success\"\n)\n\n// PossibleCopyStatusTypeValues returns an array of possible values for the CopyStatusType const type.\nfunc PossibleCopyStatusTypeValues() []CopyStatusType {\n\treturn []CopyStatusType{CopyStatusAborted, CopyStatusFailed, CopyStatusNone, CopyStatusPending, CopyStatusSuccess}\n}\n\n// DeleteSnapshotsOptionType enumerates the values for delete snapshots option type.\ntype DeleteSnapshotsOptionType string\n\nconst (\n\t// DeleteSnapshotsOptionInclude ...\n\tDeleteSnapshotsOptionInclude DeleteSnapshotsOptionType = \"include\"\n\t// DeleteSnapshotsOptionNone represents an empty DeleteSnapshotsOptionType.\n\tDeleteSnapshotsOptionNone DeleteSnapshotsOptionType = \"\"\n\t// DeleteSnapshotsOptionOnly ...\n\tDeleteSnapshotsOptionOnly DeleteSnapshotsOptionType = \"only\"\n)\n\n// PossibleDeleteSnapshotsOptionTypeValues returns an array of possible values for the DeleteSnapshotsOptionType const type.\nfunc PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType {\n\treturn []DeleteSnapshotsOptionType{DeleteSnapshotsOptionInclude, DeleteSnapshotsOptionNone, DeleteSnapshotsOptionOnly}\n}\n\n// GeoReplicationStatusType enumerates the values for geo replication status type.\ntype GeoReplicationStatusType string\n\nconst (\n\t// GeoReplicationStatusBootstrap ...\n\tGeoReplicationStatusBootstrap GeoReplicationStatusType = \"bootstrap\"\n\t// GeoReplicationStatusLive ...\n\tGeoReplicationStatusLive GeoReplicationStatusType = \"live\"\n\t// GeoReplicationStatusNone represents an empty GeoReplicationStatusType.\n\tGeoReplicationStatusNone GeoReplicationStatusType = \"\"\n\t// GeoReplicationStatusUnavailable ...\n\tGeoReplicationStatusUnavailable GeoReplicationStatusType = \"unavailable\"\n)\n\n// PossibleGeoReplicationStatusTypeValues returns an array of possible values for the GeoReplicationStatusType const type.\nfunc PossibleGeoReplicationStatusTypeValues() []GeoReplicationStatusType {\n\treturn []GeoReplicationStatusType{GeoReplicationStatusBootstrap, GeoReplicationStatusLive, GeoReplicationStatusNone, GeoReplicationStatusUnavailable}\n}\n\n// LeaseDurationType enumerates the values for lease duration type.\ntype LeaseDurationType string\n\nconst (\n\t// LeaseDurationFixed ...\n\tLeaseDurationFixed LeaseDurationType = \"fixed\"\n\t// LeaseDurationInfinite ...\n\tLeaseDurationInfinite LeaseDurationType = \"infinite\"\n\t// LeaseDurationNone represents an empty LeaseDurationType.\n\tLeaseDurationNone LeaseDurationType = \"\"\n)\n\n// PossibleLeaseDurationTypeValues returns an array of possible values for the LeaseDurationType const type.\nfunc PossibleLeaseDurationTypeValues() []LeaseDurationType {\n\treturn []LeaseDurationType{LeaseDurationFixed, LeaseDurationInfinite, LeaseDurationNone}\n}\n\n// LeaseStateType enumerates the values for lease state type.\ntype LeaseStateType string\n\nconst (\n\t// LeaseStateAvailable ...\n\tLeaseStateAvailable LeaseStateType = \"available\"\n\t// LeaseStateBreaking ...\n\tLeaseStateBreaking LeaseStateType = \"breaking\"\n\t// LeaseStateBroken ...\n\tLeaseStateBroken LeaseStateType = \"broken\"\n\t// LeaseStateExpired ...\n\tLeaseStateExpired LeaseStateType = \"expired\"\n\t// LeaseStateLeased ...\n\tLeaseStateLeased LeaseStateType = \"leased\"\n\t// LeaseStateNone represents an empty LeaseStateType.\n\tLeaseStateNone LeaseStateType = \"\"\n)\n\n// PossibleLeaseStateTypeValues returns an array of possible values for the LeaseStateType const type.\nfunc PossibleLeaseStateTypeValues() []LeaseStateType {\n\treturn []LeaseStateType{LeaseStateAvailable, LeaseStateBreaking, LeaseStateBroken, LeaseStateExpired, LeaseStateLeased, LeaseStateNone}\n}\n\n// LeaseStatusType enumerates the values for lease status type.\ntype LeaseStatusType string\n\nconst (\n\t// LeaseStatusLocked ...\n\tLeaseStatusLocked LeaseStatusType = \"locked\"\n\t// LeaseStatusNone represents an empty LeaseStatusType.\n\tLeaseStatusNone LeaseStatusType = \"\"\n\t// LeaseStatusUnlocked ...\n\tLeaseStatusUnlocked LeaseStatusType = \"unlocked\"\n)\n\n// PossibleLeaseStatusTypeValues returns an array of possible values for the LeaseStatusType const type.\nfunc PossibleLeaseStatusTypeValues() []LeaseStatusType {\n\treturn []LeaseStatusType{LeaseStatusLocked, LeaseStatusNone, LeaseStatusUnlocked}\n}\n\n// ListBlobsIncludeItemType enumerates the values for list blobs include item type.\ntype ListBlobsIncludeItemType string\n\nconst (\n\t// ListBlobsIncludeItemCopy ...\n\tListBlobsIncludeItemCopy ListBlobsIncludeItemType = \"copy\"\n\t// ListBlobsIncludeItemDeleted ...\n\tListBlobsIncludeItemDeleted ListBlobsIncludeItemType = \"deleted\"\n\t// ListBlobsIncludeItemMetadata ...\n\tListBlobsIncludeItemMetadata ListBlobsIncludeItemType = \"metadata\"\n\t// ListBlobsIncludeItemNone represents an empty ListBlobsIncludeItemType.\n\tListBlobsIncludeItemNone ListBlobsIncludeItemType = \"\"\n\t// ListBlobsIncludeItemSnapshots ...\n\tListBlobsIncludeItemSnapshots ListBlobsIncludeItemType = \"snapshots\"\n\t// ListBlobsIncludeItemUncommittedblobs ...\n\tListBlobsIncludeItemUncommittedblobs ListBlobsIncludeItemType = \"uncommittedblobs\"\n)\n\n// PossibleListBlobsIncludeItemTypeValues returns an array of possible values for the ListBlobsIncludeItemType const type.\nfunc PossibleListBlobsIncludeItemTypeValues() []ListBlobsIncludeItemType {\n\treturn []ListBlobsIncludeItemType{ListBlobsIncludeItemCopy, ListBlobsIncludeItemDeleted, ListBlobsIncludeItemMetadata, ListBlobsIncludeItemNone, ListBlobsIncludeItemSnapshots, ListBlobsIncludeItemUncommittedblobs}\n}\n\n// ListContainersIncludeType enumerates the values for list containers include type.\ntype ListContainersIncludeType string\n\nconst (\n\t// ListContainersIncludeMetadata ...\n\tListContainersIncludeMetadata ListContainersIncludeType = \"metadata\"\n\t// ListContainersIncludeNone represents an empty ListContainersIncludeType.\n\tListContainersIncludeNone ListContainersIncludeType = \"\"\n)\n\n// PossibleListContainersIncludeTypeValues returns an array of possible values for the ListContainersIncludeType const type.\nfunc PossibleListContainersIncludeTypeValues() []ListContainersIncludeType {\n\treturn []ListContainersIncludeType{ListContainersIncludeMetadata, ListContainersIncludeNone}\n}\n\n// PublicAccessType enumerates the values for public access type.\ntype PublicAccessType string\n\nconst (\n\t// PublicAccessBlob ...\n\tPublicAccessBlob PublicAccessType = \"blob\"\n\t// PublicAccessContainer ...\n\tPublicAccessContainer PublicAccessType = \"container\"\n\t// PublicAccessNone represents an empty PublicAccessType.\n\tPublicAccessNone PublicAccessType = \"\"\n)\n\n// PossiblePublicAccessTypeValues returns an array of possible values for the PublicAccessType const type.\nfunc PossiblePublicAccessTypeValues() []PublicAccessType {\n\treturn []PublicAccessType{PublicAccessBlob, PublicAccessContainer, PublicAccessNone}\n}\n\n// SequenceNumberActionType enumerates the values for sequence number action type.\ntype SequenceNumberActionType string\n\nconst (\n\t// SequenceNumberActionIncrement ...\n\tSequenceNumberActionIncrement SequenceNumberActionType = \"increment\"\n\t// SequenceNumberActionMax ...\n\tSequenceNumberActionMax SequenceNumberActionType = \"max\"\n\t// SequenceNumberActionNone represents an empty SequenceNumberActionType.\n\tSequenceNumberActionNone SequenceNumberActionType = \"\"\n\t// SequenceNumberActionUpdate ...\n\tSequenceNumberActionUpdate SequenceNumberActionType = \"update\"\n)\n\n// PossibleSequenceNumberActionTypeValues returns an array of possible values for the SequenceNumberActionType const type.\nfunc PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType {\n\treturn []SequenceNumberActionType{SequenceNumberActionIncrement, SequenceNumberActionMax, SequenceNumberActionNone, SequenceNumberActionUpdate}\n}\n\n// StorageErrorCodeType enumerates the values for storage error code type.\ntype StorageErrorCodeType string\n\nconst (\n\t// StorageErrorCodeAccountAlreadyExists ...\n\tStorageErrorCodeAccountAlreadyExists StorageErrorCodeType = \"AccountAlreadyExists\"\n\t// StorageErrorCodeAccountBeingCreated ...\n\tStorageErrorCodeAccountBeingCreated StorageErrorCodeType = \"AccountBeingCreated\"\n\t// StorageErrorCodeAccountIsDisabled ...\n\tStorageErrorCodeAccountIsDisabled StorageErrorCodeType = \"AccountIsDisabled\"\n\t// StorageErrorCodeAppendPositionConditionNotMet ...\n\tStorageErrorCodeAppendPositionConditionNotMet StorageErrorCodeType = \"AppendPositionConditionNotMet\"\n\t// StorageErrorCodeAuthenticationFailed ...\n\tStorageErrorCodeAuthenticationFailed StorageErrorCodeType = \"AuthenticationFailed\"\n\t// StorageErrorCodeBlobAlreadyExists ...\n\tStorageErrorCodeBlobAlreadyExists StorageErrorCodeType = \"BlobAlreadyExists\"\n\t// StorageErrorCodeBlobArchived ...\n\tStorageErrorCodeBlobArchived StorageErrorCodeType = \"BlobArchived\"\n\t// StorageErrorCodeBlobBeingRehydrated ...\n\tStorageErrorCodeBlobBeingRehydrated StorageErrorCodeType = \"BlobBeingRehydrated\"\n\t// StorageErrorCodeBlobNotArchived ...\n\tStorageErrorCodeBlobNotArchived StorageErrorCodeType = \"BlobNotArchived\"\n\t// StorageErrorCodeBlobNotFound ...\n\tStorageErrorCodeBlobNotFound StorageErrorCodeType = \"BlobNotFound\"\n\t// StorageErrorCodeBlobOverwritten ...\n\tStorageErrorCodeBlobOverwritten StorageErrorCodeType = \"BlobOverwritten\"\n\t// StorageErrorCodeBlobTierInadequateForContentLength ...\n\tStorageErrorCodeBlobTierInadequateForContentLength StorageErrorCodeType = \"BlobTierInadequateForContentLength\"\n\t// StorageErrorCodeBlockCountExceedsLimit ...\n\tStorageErrorCodeBlockCountExceedsLimit StorageErrorCodeType = \"BlockCountExceedsLimit\"\n\t// StorageErrorCodeBlockListTooLong ...\n\tStorageErrorCodeBlockListTooLong StorageErrorCodeType = \"BlockListTooLong\"\n\t// StorageErrorCodeCannotChangeToLowerTier ...\n\tStorageErrorCodeCannotChangeToLowerTier StorageErrorCodeType = \"CannotChangeToLowerTier\"\n\t// StorageErrorCodeCannotVerifyCopySource ...\n\tStorageErrorCodeCannotVerifyCopySource StorageErrorCodeType = \"CannotVerifyCopySource\"\n\t// StorageErrorCodeConditionHeadersNotSupported ...\n\tStorageErrorCodeConditionHeadersNotSupported StorageErrorCodeType = \"ConditionHeadersNotSupported\"\n\t// StorageErrorCodeConditionNotMet ...\n\tStorageErrorCodeConditionNotMet StorageErrorCodeType = \"ConditionNotMet\"\n\t// StorageErrorCodeContainerAlreadyExists ...\n\tStorageErrorCodeContainerAlreadyExists StorageErrorCodeType = \"ContainerAlreadyExists\"\n\t// StorageErrorCodeContainerBeingDeleted ...\n\tStorageErrorCodeContainerBeingDeleted StorageErrorCodeType = \"ContainerBeingDeleted\"\n\t// StorageErrorCodeContainerDisabled ...\n\tStorageErrorCodeContainerDisabled StorageErrorCodeType = \"ContainerDisabled\"\n\t// StorageErrorCodeContainerNotFound ...\n\tStorageErrorCodeContainerNotFound StorageErrorCodeType = \"ContainerNotFound\"\n\t// StorageErrorCodeContentLengthLargerThanTierLimit ...\n\tStorageErrorCodeContentLengthLargerThanTierLimit StorageErrorCodeType = \"ContentLengthLargerThanTierLimit\"\n\t// StorageErrorCodeCopyAcrossAccountsNotSupported ...\n\tStorageErrorCodeCopyAcrossAccountsNotSupported StorageErrorCodeType = \"CopyAcrossAccountsNotSupported\"\n\t// StorageErrorCodeCopyIDMismatch ...\n\tStorageErrorCodeCopyIDMismatch StorageErrorCodeType = \"CopyIdMismatch\"\n\t// StorageErrorCodeEmptyMetadataKey ...\n\tStorageErrorCodeEmptyMetadataKey StorageErrorCodeType = \"EmptyMetadataKey\"\n\t// StorageErrorCodeFeatureVersionMismatch ...\n\tStorageErrorCodeFeatureVersionMismatch StorageErrorCodeType = \"FeatureVersionMismatch\"\n\t// StorageErrorCodeIncrementalCopyBlobMismatch ...\n\tStorageErrorCodeIncrementalCopyBlobMismatch StorageErrorCodeType = \"IncrementalCopyBlobMismatch\"\n\t// StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed ...\n\tStorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed StorageErrorCodeType = \"IncrementalCopyOfEralierVersionSnapshotNotAllowed\"\n\t// StorageErrorCodeIncrementalCopySourceMustBeSnapshot ...\n\tStorageErrorCodeIncrementalCopySourceMustBeSnapshot StorageErrorCodeType = \"IncrementalCopySourceMustBeSnapshot\"\n\t// StorageErrorCodeInfiniteLeaseDurationRequired ...\n\tStorageErrorCodeInfiniteLeaseDurationRequired StorageErrorCodeType = \"InfiniteLeaseDurationRequired\"\n\t// StorageErrorCodeInsufficientAccountPermissions ...\n\tStorageErrorCodeInsufficientAccountPermissions StorageErrorCodeType = \"InsufficientAccountPermissions\"\n\t// StorageErrorCodeInternalError ...\n\tStorageErrorCodeInternalError StorageErrorCodeType = \"InternalError\"\n\t// StorageErrorCodeInvalidAuthenticationInfo ...\n\tStorageErrorCodeInvalidAuthenticationInfo StorageErrorCodeType = \"InvalidAuthenticationInfo\"\n\t// StorageErrorCodeInvalidBlobOrBlock ...\n\tStorageErrorCodeInvalidBlobOrBlock StorageErrorCodeType = \"InvalidBlobOrBlock\"\n\t// StorageErrorCodeInvalidBlobTier ...\n\tStorageErrorCodeInvalidBlobTier StorageErrorCodeType = \"InvalidBlobTier\"\n\t// StorageErrorCodeInvalidBlobType ...\n\tStorageErrorCodeInvalidBlobType StorageErrorCodeType = \"InvalidBlobType\"\n\t// StorageErrorCodeInvalidBlockID ...\n\tStorageErrorCodeInvalidBlockID StorageErrorCodeType = \"InvalidBlockId\"\n\t// StorageErrorCodeInvalidBlockList ...\n\tStorageErrorCodeInvalidBlockList StorageErrorCodeType = \"InvalidBlockList\"\n\t// StorageErrorCodeInvalidHeaderValue ...\n\tStorageErrorCodeInvalidHeaderValue StorageErrorCodeType = \"InvalidHeaderValue\"\n\t// StorageErrorCodeInvalidHTTPVerb ...\n\tStorageErrorCodeInvalidHTTPVerb StorageErrorCodeType = \"InvalidHttpVerb\"\n\t// StorageErrorCodeInvalidInput ...\n\tStorageErrorCodeInvalidInput StorageErrorCodeType = \"InvalidInput\"\n\t// StorageErrorCodeInvalidMd5 ...\n\tStorageErrorCodeInvalidMd5 StorageErrorCodeType = \"InvalidMd5\"\n\t// StorageErrorCodeInvalidMetadata ...\n\tStorageErrorCodeInvalidMetadata StorageErrorCodeType = \"InvalidMetadata\"\n\t// StorageErrorCodeInvalidOperation ...\n\tStorageErrorCodeInvalidOperation StorageErrorCodeType = \"InvalidOperation\"\n\t// StorageErrorCodeInvalidPageRange ...\n\tStorageErrorCodeInvalidPageRange StorageErrorCodeType = \"InvalidPageRange\"\n\t// StorageErrorCodeInvalidQueryParameterValue ...\n\tStorageErrorCodeInvalidQueryParameterValue StorageErrorCodeType = \"InvalidQueryParameterValue\"\n\t// StorageErrorCodeInvalidRange ...\n\tStorageErrorCodeInvalidRange StorageErrorCodeType = \"InvalidRange\"\n\t// StorageErrorCodeInvalidResourceName ...\n\tStorageErrorCodeInvalidResourceName StorageErrorCodeType = \"InvalidResourceName\"\n\t// StorageErrorCodeInvalidSourceBlobType ...\n\tStorageErrorCodeInvalidSourceBlobType StorageErrorCodeType = \"InvalidSourceBlobType\"\n\t// StorageErrorCodeInvalidSourceBlobURL ...\n\tStorageErrorCodeInvalidSourceBlobURL StorageErrorCodeType = \"InvalidSourceBlobUrl\"\n\t// StorageErrorCodeInvalidURI ...\n\tStorageErrorCodeInvalidURI StorageErrorCodeType = \"InvalidUri\"\n\t// StorageErrorCodeInvalidVersionForPageBlobOperation ...\n\tStorageErrorCodeInvalidVersionForPageBlobOperation StorageErrorCodeType = \"InvalidVersionForPageBlobOperation\"\n\t// StorageErrorCodeInvalidXMLDocument ...\n\tStorageErrorCodeInvalidXMLDocument StorageErrorCodeType = \"InvalidXmlDocument\"\n\t// StorageErrorCodeInvalidXMLNodeValue ...\n\tStorageErrorCodeInvalidXMLNodeValue StorageErrorCodeType = \"InvalidXmlNodeValue\"\n\t// StorageErrorCodeLeaseAlreadyBroken ...\n\tStorageErrorCodeLeaseAlreadyBroken StorageErrorCodeType = \"LeaseAlreadyBroken\"\n\t// StorageErrorCodeLeaseAlreadyPresent ...\n\tStorageErrorCodeLeaseAlreadyPresent StorageErrorCodeType = \"LeaseAlreadyPresent\"\n\t// StorageErrorCodeLeaseIDMismatchWithBlobOperation ...\n\tStorageErrorCodeLeaseIDMismatchWithBlobOperation StorageErrorCodeType = \"LeaseIdMismatchWithBlobOperation\"\n\t// StorageErrorCodeLeaseIDMismatchWithContainerOperation ...\n\tStorageErrorCodeLeaseIDMismatchWithContainerOperation StorageErrorCodeType = \"LeaseIdMismatchWithContainerOperation\"\n\t// StorageErrorCodeLeaseIDMismatchWithLeaseOperation ...\n\tStorageErrorCodeLeaseIDMismatchWithLeaseOperation StorageErrorCodeType = \"LeaseIdMismatchWithLeaseOperation\"\n\t// StorageErrorCodeLeaseIDMissing ...\n\tStorageErrorCodeLeaseIDMissing StorageErrorCodeType = \"LeaseIdMissing\"\n\t// StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired ...\n\tStorageErrorCodeLeaseIsBreakingAndCannotBeAcquired StorageErrorCodeType = \"LeaseIsBreakingAndCannotBeAcquired\"\n\t// StorageErrorCodeLeaseIsBreakingAndCannotBeChanged ...\n\tStorageErrorCodeLeaseIsBreakingAndCannotBeChanged StorageErrorCodeType = \"LeaseIsBreakingAndCannotBeChanged\"\n\t// StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed ...\n\tStorageErrorCodeLeaseIsBrokenAndCannotBeRenewed StorageErrorCodeType = \"LeaseIsBrokenAndCannotBeRenewed\"\n\t// StorageErrorCodeLeaseLost ...\n\tStorageErrorCodeLeaseLost StorageErrorCodeType = \"LeaseLost\"\n\t// StorageErrorCodeLeaseNotPresentWithBlobOperation ...\n\tStorageErrorCodeLeaseNotPresentWithBlobOperation StorageErrorCodeType = \"LeaseNotPresentWithBlobOperation\"\n\t// StorageErrorCodeLeaseNotPresentWithContainerOperation ...\n\tStorageErrorCodeLeaseNotPresentWithContainerOperation StorageErrorCodeType = \"LeaseNotPresentWithContainerOperation\"\n\t// StorageErrorCodeLeaseNotPresentWithLeaseOperation ...\n\tStorageErrorCodeLeaseNotPresentWithLeaseOperation StorageErrorCodeType = \"LeaseNotPresentWithLeaseOperation\"\n\t// StorageErrorCodeMaxBlobSizeConditionNotMet ...\n\tStorageErrorCodeMaxBlobSizeConditionNotMet StorageErrorCodeType = \"MaxBlobSizeConditionNotMet\"\n\t// StorageErrorCodeMd5Mismatch ...\n\tStorageErrorCodeMd5Mismatch StorageErrorCodeType = \"Md5Mismatch\"\n\t// StorageErrorCodeMetadataTooLarge ...\n\tStorageErrorCodeMetadataTooLarge StorageErrorCodeType = \"MetadataTooLarge\"\n\t// StorageErrorCodeMissingContentLengthHeader ...\n\tStorageErrorCodeMissingContentLengthHeader StorageErrorCodeType = \"MissingContentLengthHeader\"\n\t// StorageErrorCodeMissingRequiredHeader ...\n\tStorageErrorCodeMissingRequiredHeader StorageErrorCodeType = \"MissingRequiredHeader\"\n\t// StorageErrorCodeMissingRequiredQueryParameter ...\n\tStorageErrorCodeMissingRequiredQueryParameter StorageErrorCodeType = \"MissingRequiredQueryParameter\"\n\t// StorageErrorCodeMissingRequiredXMLNode ...\n\tStorageErrorCodeMissingRequiredXMLNode StorageErrorCodeType = \"MissingRequiredXmlNode\"\n\t// StorageErrorCodeMultipleConditionHeadersNotSupported ...\n\tStorageErrorCodeMultipleConditionHeadersNotSupported StorageErrorCodeType = \"MultipleConditionHeadersNotSupported\"\n\t// StorageErrorCodeNone represents an empty StorageErrorCodeType.\n\tStorageErrorCodeNone StorageErrorCodeType = \"\"\n\t// StorageErrorCodeNoPendingCopyOperation ...\n\tStorageErrorCodeNoPendingCopyOperation StorageErrorCodeType = \"NoPendingCopyOperation\"\n\t// StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob ...\n\tStorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob StorageErrorCodeType = \"OperationNotAllowedOnIncrementalCopyBlob\"\n\t// StorageErrorCodeOperationTimedOut ...\n\tStorageErrorCodeOperationTimedOut StorageErrorCodeType = \"OperationTimedOut\"\n\t// StorageErrorCodeOutOfRangeInput ...\n\tStorageErrorCodeOutOfRangeInput StorageErrorCodeType = \"OutOfRangeInput\"\n\t// StorageErrorCodeOutOfRangeQueryParameterValue ...\n\tStorageErrorCodeOutOfRangeQueryParameterValue StorageErrorCodeType = \"OutOfRangeQueryParameterValue\"\n\t// StorageErrorCodePendingCopyOperation ...\n\tStorageErrorCodePendingCopyOperation StorageErrorCodeType = \"PendingCopyOperation\"\n\t// StorageErrorCodePreviousSnapshotCannotBeNewer ...\n\tStorageErrorCodePreviousSnapshotCannotBeNewer StorageErrorCodeType = \"PreviousSnapshotCannotBeNewer\"\n\t// StorageErrorCodePreviousSnapshotNotFound ...\n\tStorageErrorCodePreviousSnapshotNotFound StorageErrorCodeType = \"PreviousSnapshotNotFound\"\n\t// StorageErrorCodePreviousSnapshotOperationNotSupported ...\n\tStorageErrorCodePreviousSnapshotOperationNotSupported StorageErrorCodeType = \"PreviousSnapshotOperationNotSupported\"\n\t// StorageErrorCodeRequestBodyTooLarge ...\n\tStorageErrorCodeRequestBodyTooLarge StorageErrorCodeType = \"RequestBodyTooLarge\"\n\t// StorageErrorCodeRequestURLFailedToParse ...\n\tStorageErrorCodeRequestURLFailedToParse StorageErrorCodeType = \"RequestUrlFailedToParse\"\n\t// StorageErrorCodeResourceAlreadyExists ...\n\tStorageErrorCodeResourceAlreadyExists StorageErrorCodeType = \"ResourceAlreadyExists\"\n\t// StorageErrorCodeResourceNotFound ...\n\tStorageErrorCodeResourceNotFound StorageErrorCodeType = \"ResourceNotFound\"\n\t// StorageErrorCodeResourceTypeMismatch ...\n\tStorageErrorCodeResourceTypeMismatch StorageErrorCodeType = \"ResourceTypeMismatch\"\n\t// StorageErrorCodeSequenceNumberConditionNotMet ...\n\tStorageErrorCodeSequenceNumberConditionNotMet StorageErrorCodeType = \"SequenceNumberConditionNotMet\"\n\t// StorageErrorCodeSequenceNumberIncrementTooLarge ...\n\tStorageErrorCodeSequenceNumberIncrementTooLarge StorageErrorCodeType = \"SequenceNumberIncrementTooLarge\"\n\t// StorageErrorCodeServerBusy ...\n\tStorageErrorCodeServerBusy StorageErrorCodeType = \"ServerBusy\"\n\t// StorageErrorCodeSnaphotOperationRateExceeded ...\n\tStorageErrorCodeSnaphotOperationRateExceeded StorageErrorCodeType = \"SnaphotOperationRateExceeded\"\n\t// StorageErrorCodeSnapshotCountExceeded ...\n\tStorageErrorCodeSnapshotCountExceeded StorageErrorCodeType = \"SnapshotCountExceeded\"\n\t// StorageErrorCodeSnapshotsPresent ...\n\tStorageErrorCodeSnapshotsPresent StorageErrorCodeType = \"SnapshotsPresent\"\n\t// StorageErrorCodeSourceConditionNotMet ...\n\tStorageErrorCodeSourceConditionNotMet StorageErrorCodeType = \"SourceConditionNotMet\"\n\t// StorageErrorCodeSystemInUse ...\n\tStorageErrorCodeSystemInUse StorageErrorCodeType = \"SystemInUse\"\n\t// StorageErrorCodeTargetConditionNotMet ...\n\tStorageErrorCodeTargetConditionNotMet StorageErrorCodeType = \"TargetConditionNotMet\"\n\t// StorageErrorCodeUnauthorizedBlobOverwrite ...\n\tStorageErrorCodeUnauthorizedBlobOverwrite StorageErrorCodeType = \"UnauthorizedBlobOverwrite\"\n\t// StorageErrorCodeUnsupportedHeader ...\n\tStorageErrorCodeUnsupportedHeader StorageErrorCodeType = \"UnsupportedHeader\"\n\t// StorageErrorCodeUnsupportedHTTPVerb ...\n\tStorageErrorCodeUnsupportedHTTPVerb StorageErrorCodeType = \"UnsupportedHttpVerb\"\n\t// StorageErrorCodeUnsupportedQueryParameter ...\n\tStorageErrorCodeUnsupportedQueryParameter StorageErrorCodeType = \"UnsupportedQueryParameter\"\n\t// StorageErrorCodeUnsupportedXMLNode ...\n\tStorageErrorCodeUnsupportedXMLNode StorageErrorCodeType = \"UnsupportedXmlNode\"\n)\n\n// PossibleStorageErrorCodeTypeValues returns an array of possible values for the StorageErrorCodeType const type.\nfunc PossibleStorageErrorCodeTypeValues() []StorageErrorCodeType {\n\treturn []StorageErrorCodeType{StorageErrorCodeAccountAlreadyExists, StorageErrorCodeAccountBeingCreated, StorageErrorCodeAccountIsDisabled, StorageErrorCodeAppendPositionConditionNotMet, StorageErrorCodeAuthenticationFailed, StorageErrorCodeBlobAlreadyExists, StorageErrorCodeBlobArchived, StorageErrorCodeBlobBeingRehydrated, StorageErrorCodeBlobNotArchived, StorageErrorCodeBlobNotFound, StorageErrorCodeBlobOverwritten, StorageErrorCodeBlobTierInadequateForContentLength, StorageErrorCodeBlockCountExceedsLimit, StorageErrorCodeBlockListTooLong, StorageErrorCodeCannotChangeToLowerTier, StorageErrorCodeCannotVerifyCopySource, StorageErrorCodeConditionHeadersNotSupported, StorageErrorCodeConditionNotMet, StorageErrorCodeContainerAlreadyExists, StorageErrorCodeContainerBeingDeleted, StorageErrorCodeContainerDisabled, StorageErrorCodeContainerNotFound, StorageErrorCodeContentLengthLargerThanTierLimit, StorageErrorCodeCopyAcrossAccountsNotSupported, StorageErrorCodeCopyIDMismatch, StorageErrorCodeEmptyMetadataKey, StorageErrorCodeFeatureVersionMismatch, StorageErrorCodeIncrementalCopyBlobMismatch, StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed, StorageErrorCodeIncrementalCopySourceMustBeSnapshot, StorageErrorCodeInfiniteLeaseDurationRequired, StorageErrorCodeInsufficientAccountPermissions, StorageErrorCodeInternalError, StorageErrorCodeInvalidAuthenticationInfo, StorageErrorCodeInvalidBlobOrBlock, StorageErrorCodeInvalidBlobTier, StorageErrorCodeInvalidBlobType, StorageErrorCodeInvalidBlockID, StorageErrorCodeInvalidBlockList, StorageErrorCodeInvalidHeaderValue, StorageErrorCodeInvalidHTTPVerb, StorageErrorCodeInvalidInput, StorageErrorCodeInvalidMd5, StorageErrorCodeInvalidMetadata, StorageErrorCodeInvalidOperation, StorageErrorCodeInvalidPageRange, StorageErrorCodeInvalidQueryParameterValue, StorageErrorCodeInvalidRange, StorageErrorCodeInvalidResourceName, StorageErrorCodeInvalidSourceBlobType, StorageErrorCodeInvalidSourceBlobURL, StorageErrorCodeInvalidURI, StorageErrorCodeInvalidVersionForPageBlobOperation, StorageErrorCodeInvalidXMLDocument, StorageErrorCodeInvalidXMLNodeValue, StorageErrorCodeLeaseAlreadyBroken, StorageErrorCodeLeaseAlreadyPresent, StorageErrorCodeLeaseIDMismatchWithBlobOperation, StorageErrorCodeLeaseIDMismatchWithContainerOperation, StorageErrorCodeLeaseIDMismatchWithLeaseOperation, StorageErrorCodeLeaseIDMissing, StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired, StorageErrorCodeLeaseIsBreakingAndCannotBeChanged, StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed, StorageErrorCodeLeaseLost, StorageErrorCodeLeaseNotPresentWithBlobOperation, StorageErrorCodeLeaseNotPresentWithContainerOperation, StorageErrorCodeLeaseNotPresentWithLeaseOperation, StorageErrorCodeMaxBlobSizeConditionNotMet, StorageErrorCodeMd5Mismatch, StorageErrorCodeMetadataTooLarge, StorageErrorCodeMissingContentLengthHeader, StorageErrorCodeMissingRequiredHeader, StorageErrorCodeMissingRequiredQueryParameter, StorageErrorCodeMissingRequiredXMLNode, StorageErrorCodeMultipleConditionHeadersNotSupported, StorageErrorCodeNone, StorageErrorCodeNoPendingCopyOperation, StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob, StorageErrorCodeOperationTimedOut, StorageErrorCodeOutOfRangeInput, StorageErrorCodeOutOfRangeQueryParameterValue, StorageErrorCodePendingCopyOperation, StorageErrorCodePreviousSnapshotCannotBeNewer, StorageErrorCodePreviousSnapshotNotFound, StorageErrorCodePreviousSnapshotOperationNotSupported, StorageErrorCodeRequestBodyTooLarge, StorageErrorCodeRequestURLFailedToParse, StorageErrorCodeResourceAlreadyExists, StorageErrorCodeResourceNotFound, StorageErrorCodeResourceTypeMismatch, StorageErrorCodeSequenceNumberConditionNotMet, StorageErrorCodeSequenceNumberIncrementTooLarge, StorageErrorCodeServerBusy, StorageErrorCodeSnaphotOperationRateExceeded, StorageErrorCodeSnapshotCountExceeded, StorageErrorCodeSnapshotsPresent, StorageErrorCodeSourceConditionNotMet, StorageErrorCodeSystemInUse, StorageErrorCodeTargetConditionNotMet, StorageErrorCodeUnauthorizedBlobOverwrite, StorageErrorCodeUnsupportedHeader, StorageErrorCodeUnsupportedHTTPVerb, StorageErrorCodeUnsupportedQueryParameter, StorageErrorCodeUnsupportedXMLNode}\n}\n\n// AccessPolicy - An Access policy\ntype AccessPolicy struct {\n\t// Start - the date-time the policy is active\n\tStart time.Time `xml:\"Start\"`\n\t// Expiry - the date-time the policy expires\n\tExpiry time.Time `xml:\"Expiry\"`\n\t// Permission - the permissions for the acl policy\n\tPermission string `xml:\"Permission\"`\n}\n\n// MarshalXML implements the xml.Marshaler interface for AccessPolicy.\nfunc (ap AccessPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*AccessPolicy)(nil)).Elem().Size() != reflect.TypeOf((*accessPolicy)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between AccessPolicy and accessPolicy\")\n\t}\n\tap2 := (*accessPolicy)(unsafe.Pointer(&ap))\n\treturn e.EncodeElement(*ap2, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaler interface for AccessPolicy.\nfunc (ap *AccessPolicy) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*AccessPolicy)(nil)).Elem().Size() != reflect.TypeOf((*accessPolicy)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between AccessPolicy and accessPolicy\")\n\t}\n\tap2 := (*accessPolicy)(unsafe.Pointer(ap))\n\treturn d.DecodeElement(ap2, &start)\n}\n\n// AppendBlobAppendBlockResponse ...\ntype AppendBlobAppendBlockResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (ababr AppendBlobAppendBlockResponse) Response() *http.Response {\n\treturn ababr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (ababr AppendBlobAppendBlockResponse) StatusCode() int {\n\treturn ababr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (ababr AppendBlobAppendBlockResponse) Status() string {\n\treturn ababr.rawResponse.Status\n}\n\n// BlobAppendOffset returns the value for header x-ms-blob-append-offset.\nfunc (ababr AppendBlobAppendBlockResponse) BlobAppendOffset() string {\n\treturn ababr.rawResponse.Header.Get(\"x-ms-blob-append-offset\")\n}\n\n// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count.\nfunc (ababr AppendBlobAppendBlockResponse) BlobCommittedBlockCount() int32 {\n\ts := ababr.rawResponse.Header.Get(\"x-ms-blob-committed-block-count\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 32)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn int32(i)\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (ababr AppendBlobAppendBlockResponse) ContentMD5() []byte {\n\ts := ababr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (ababr AppendBlobAppendBlockResponse) Date() time.Time {\n\ts := ababr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (ababr AppendBlobAppendBlockResponse) ErrorCode() string {\n\treturn ababr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (ababr AppendBlobAppendBlockResponse) ETag() ETag {\n\treturn ETag(ababr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (ababr AppendBlobAppendBlockResponse) LastModified() time.Time {\n\ts := ababr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (ababr AppendBlobAppendBlockResponse) RequestID() string {\n\treturn ababr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (ababr AppendBlobAppendBlockResponse) Version() string {\n\treturn ababr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// AppendBlobCreateResponse ...\ntype AppendBlobCreateResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (abcr AppendBlobCreateResponse) Response() *http.Response {\n\treturn abcr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (abcr AppendBlobCreateResponse) StatusCode() int {\n\treturn abcr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (abcr AppendBlobCreateResponse) Status() string {\n\treturn abcr.rawResponse.Status\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (abcr AppendBlobCreateResponse) ContentMD5() []byte {\n\ts := abcr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (abcr AppendBlobCreateResponse) Date() time.Time {\n\ts := abcr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (abcr AppendBlobCreateResponse) ErrorCode() string {\n\treturn abcr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (abcr AppendBlobCreateResponse) ETag() ETag {\n\treturn ETag(abcr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (abcr AppendBlobCreateResponse) IsServerEncrypted() string {\n\treturn abcr.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (abcr AppendBlobCreateResponse) LastModified() time.Time {\n\ts := abcr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (abcr AppendBlobCreateResponse) RequestID() string {\n\treturn abcr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (abcr AppendBlobCreateResponse) Version() string {\n\treturn abcr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobAbortCopyFromURLResponse ...\ntype BlobAbortCopyFromURLResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bacfur BlobAbortCopyFromURLResponse) Response() *http.Response {\n\treturn bacfur.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bacfur BlobAbortCopyFromURLResponse) StatusCode() int {\n\treturn bacfur.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bacfur BlobAbortCopyFromURLResponse) Status() string {\n\treturn bacfur.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (bacfur BlobAbortCopyFromURLResponse) Date() time.Time {\n\ts := bacfur.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bacfur BlobAbortCopyFromURLResponse) ErrorCode() string {\n\treturn bacfur.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bacfur BlobAbortCopyFromURLResponse) RequestID() string {\n\treturn bacfur.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bacfur BlobAbortCopyFromURLResponse) Version() string {\n\treturn bacfur.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobAcquireLeaseResponse ...\ntype BlobAcquireLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (balr BlobAcquireLeaseResponse) Response() *http.Response {\n\treturn balr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (balr BlobAcquireLeaseResponse) StatusCode() int {\n\treturn balr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (balr BlobAcquireLeaseResponse) Status() string {\n\treturn balr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (balr BlobAcquireLeaseResponse) Date() time.Time {\n\ts := balr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (balr BlobAcquireLeaseResponse) ErrorCode() string {\n\treturn balr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (balr BlobAcquireLeaseResponse) ETag() ETag {\n\treturn ETag(balr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (balr BlobAcquireLeaseResponse) LastModified() time.Time {\n\ts := balr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseID returns the value for header x-ms-lease-id.\nfunc (balr BlobAcquireLeaseResponse) LeaseID() string {\n\treturn balr.rawResponse.Header.Get(\"x-ms-lease-id\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (balr BlobAcquireLeaseResponse) RequestID() string {\n\treturn balr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (balr BlobAcquireLeaseResponse) Version() string {\n\treturn balr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobBreakLeaseResponse ...\ntype BlobBreakLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bblr BlobBreakLeaseResponse) Response() *http.Response {\n\treturn bblr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bblr BlobBreakLeaseResponse) StatusCode() int {\n\treturn bblr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bblr BlobBreakLeaseResponse) Status() string {\n\treturn bblr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (bblr BlobBreakLeaseResponse) Date() time.Time {\n\ts := bblr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bblr BlobBreakLeaseResponse) ErrorCode() string {\n\treturn bblr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bblr BlobBreakLeaseResponse) ETag() ETag {\n\treturn ETag(bblr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bblr BlobBreakLeaseResponse) LastModified() time.Time {\n\ts := bblr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseTime returns the value for header x-ms-lease-time.\nfunc (bblr BlobBreakLeaseResponse) LeaseTime() int32 {\n\ts := bblr.rawResponse.Header.Get(\"x-ms-lease-time\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 32)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn int32(i)\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bblr BlobBreakLeaseResponse) RequestID() string {\n\treturn bblr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bblr BlobBreakLeaseResponse) Version() string {\n\treturn bblr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobChangeLeaseResponse ...\ntype BlobChangeLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bclr BlobChangeLeaseResponse) Response() *http.Response {\n\treturn bclr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bclr BlobChangeLeaseResponse) StatusCode() int {\n\treturn bclr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bclr BlobChangeLeaseResponse) Status() string {\n\treturn bclr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (bclr BlobChangeLeaseResponse) Date() time.Time {\n\ts := bclr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bclr BlobChangeLeaseResponse) ErrorCode() string {\n\treturn bclr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bclr BlobChangeLeaseResponse) ETag() ETag {\n\treturn ETag(bclr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bclr BlobChangeLeaseResponse) LastModified() time.Time {\n\ts := bclr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseID returns the value for header x-ms-lease-id.\nfunc (bclr BlobChangeLeaseResponse) LeaseID() string {\n\treturn bclr.rawResponse.Header.Get(\"x-ms-lease-id\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bclr BlobChangeLeaseResponse) RequestID() string {\n\treturn bclr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bclr BlobChangeLeaseResponse) Version() string {\n\treturn bclr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobCreateSnapshotResponse ...\ntype BlobCreateSnapshotResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bcsr BlobCreateSnapshotResponse) Response() *http.Response {\n\treturn bcsr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bcsr BlobCreateSnapshotResponse) StatusCode() int {\n\treturn bcsr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bcsr BlobCreateSnapshotResponse) Status() string {\n\treturn bcsr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (bcsr BlobCreateSnapshotResponse) Date() time.Time {\n\ts := bcsr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bcsr BlobCreateSnapshotResponse) ErrorCode() string {\n\treturn bcsr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bcsr BlobCreateSnapshotResponse) ETag() ETag {\n\treturn ETag(bcsr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bcsr BlobCreateSnapshotResponse) LastModified() time.Time {\n\ts := bcsr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bcsr BlobCreateSnapshotResponse) RequestID() string {\n\treturn bcsr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Snapshot returns the value for header x-ms-snapshot.\nfunc (bcsr BlobCreateSnapshotResponse) Snapshot() string {\n\treturn bcsr.rawResponse.Header.Get(\"x-ms-snapshot\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bcsr BlobCreateSnapshotResponse) Version() string {\n\treturn bcsr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobDeleteResponse ...\ntype BlobDeleteResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bdr BlobDeleteResponse) Response() *http.Response {\n\treturn bdr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bdr BlobDeleteResponse) StatusCode() int {\n\treturn bdr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bdr BlobDeleteResponse) Status() string {\n\treturn bdr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (bdr BlobDeleteResponse) Date() time.Time {\n\ts := bdr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bdr BlobDeleteResponse) ErrorCode() string {\n\treturn bdr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bdr BlobDeleteResponse) RequestID() string {\n\treturn bdr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bdr BlobDeleteResponse) Version() string {\n\treturn bdr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobFlatList ...\ntype BlobFlatList struct {\n\tBlobItems []BlobItem `xml:\"Blob\"`\n}\n\n// BlobGetPropertiesResponse ...\ntype BlobGetPropertiesResponse struct {\n\trawResponse *http.Response\n}\n\n// NewMetadata returns user-defined key/value pairs.\nfunc (bgpr BlobGetPropertiesResponse) NewMetadata() Metadata {\n\tmd := Metadata{}\n\tfor k, v := range bgpr.rawResponse.Header {\n\t\tif len(k) > mdPrefixLen {\n\t\t\tif prefix := k[0:mdPrefixLen]; strings.EqualFold(prefix, mdPrefix) {\n\t\t\t\tmd[strings.ToLower(k[mdPrefixLen:])] = v[0]\n\t\t\t}\n\t\t}\n\t}\n\treturn md\n}\n\n// Response returns the raw HTTP response object.\nfunc (bgpr BlobGetPropertiesResponse) Response() *http.Response {\n\treturn bgpr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bgpr BlobGetPropertiesResponse) StatusCode() int {\n\treturn bgpr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bgpr BlobGetPropertiesResponse) Status() string {\n\treturn bgpr.rawResponse.Status\n}\n\n// AcceptRanges returns the value for header Accept-Ranges.\nfunc (bgpr BlobGetPropertiesResponse) AcceptRanges() string {\n\treturn bgpr.rawResponse.Header.Get(\"Accept-Ranges\")\n}\n\n// AccessTier returns the value for header x-ms-access-tier.\nfunc (bgpr BlobGetPropertiesResponse) AccessTier() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-access-tier\")\n}\n\n// AccessTierInferred returns the value for header x-ms-access-tier-inferred.\nfunc (bgpr BlobGetPropertiesResponse) AccessTierInferred() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-access-tier-inferred\")\n}\n\n// ArchiveStatus returns the value for header x-ms-archive-status.\nfunc (bgpr BlobGetPropertiesResponse) ArchiveStatus() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-archive-status\")\n}\n\n// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count.\nfunc (bgpr BlobGetPropertiesResponse) BlobCommittedBlockCount() int32 {\n\ts := bgpr.rawResponse.Header.Get(\"x-ms-blob-committed-block-count\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 32)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn int32(i)\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (bgpr BlobGetPropertiesResponse) BlobSequenceNumber() int64 {\n\ts := bgpr.rawResponse.Header.Get(\"x-ms-blob-sequence-number\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// BlobType returns the value for header x-ms-blob-type.\nfunc (bgpr BlobGetPropertiesResponse) BlobType() BlobType {\n\treturn BlobType(bgpr.rawResponse.Header.Get(\"x-ms-blob-type\"))\n}\n\n// CacheControl returns the value for header Cache-Control.\nfunc (bgpr BlobGetPropertiesResponse) CacheControl() string {\n\treturn bgpr.rawResponse.Header.Get(\"Cache-Control\")\n}\n\n// ContentDisposition returns the value for header Content-Disposition.\nfunc (bgpr BlobGetPropertiesResponse) ContentDisposition() string {\n\treturn bgpr.rawResponse.Header.Get(\"Content-Disposition\")\n}\n\n// ContentEncoding returns the value for header Content-Encoding.\nfunc (bgpr BlobGetPropertiesResponse) ContentEncoding() string {\n\treturn bgpr.rawResponse.Header.Get(\"Content-Encoding\")\n}\n\n// ContentLanguage returns the value for header Content-Language.\nfunc (bgpr BlobGetPropertiesResponse) ContentLanguage() string {\n\treturn bgpr.rawResponse.Header.Get(\"Content-Language\")\n}\n\n// ContentLength returns the value for header Content-Length.\nfunc (bgpr BlobGetPropertiesResponse) ContentLength() int64 {\n\ts := bgpr.rawResponse.Header.Get(\"Content-Length\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (bgpr BlobGetPropertiesResponse) ContentMD5() []byte {\n\ts := bgpr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// ContentType returns the value for header Content-Type.\nfunc (bgpr BlobGetPropertiesResponse) ContentType() string {\n\treturn bgpr.rawResponse.Header.Get(\"Content-Type\")\n}\n\n// CopyCompletionTime returns the value for header x-ms-copy-completion-time.\nfunc (bgpr BlobGetPropertiesResponse) CopyCompletionTime() time.Time {\n\ts := bgpr.rawResponse.Header.Get(\"x-ms-copy-completion-time\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// CopyID returns the value for header x-ms-copy-id.\nfunc (bgpr BlobGetPropertiesResponse) CopyID() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-copy-id\")\n}\n\n// CopyProgress returns the value for header x-ms-copy-progress.\nfunc (bgpr BlobGetPropertiesResponse) CopyProgress() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-copy-progress\")\n}\n\n// CopySource returns the value for header x-ms-copy-source.\nfunc (bgpr BlobGetPropertiesResponse) CopySource() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-copy-source\")\n}\n\n// CopyStatus returns the value for header x-ms-copy-status.\nfunc (bgpr BlobGetPropertiesResponse) CopyStatus() CopyStatusType {\n\treturn CopyStatusType(bgpr.rawResponse.Header.Get(\"x-ms-copy-status\"))\n}\n\n// CopyStatusDescription returns the value for header x-ms-copy-status-description.\nfunc (bgpr BlobGetPropertiesResponse) CopyStatusDescription() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-copy-status-description\")\n}\n\n// Date returns the value for header Date.\nfunc (bgpr BlobGetPropertiesResponse) Date() time.Time {\n\ts := bgpr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// DestinationSnapshot returns the value for header x-ms-copy-destination-snapshot.\nfunc (bgpr BlobGetPropertiesResponse) DestinationSnapshot() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-copy-destination-snapshot\")\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bgpr BlobGetPropertiesResponse) ErrorCode() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bgpr BlobGetPropertiesResponse) ETag() ETag {\n\treturn ETag(bgpr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsIncrementalCopy returns the value for header x-ms-incremental-copy.\nfunc (bgpr BlobGetPropertiesResponse) IsIncrementalCopy() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-incremental-copy\")\n}\n\n// IsServerEncrypted returns the value for header x-ms-server-encrypted.\nfunc (bgpr BlobGetPropertiesResponse) IsServerEncrypted() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bgpr BlobGetPropertiesResponse) LastModified() time.Time {\n\ts := bgpr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseDuration returns the value for header x-ms-lease-duration.\nfunc (bgpr BlobGetPropertiesResponse) LeaseDuration() LeaseDurationType {\n\treturn LeaseDurationType(bgpr.rawResponse.Header.Get(\"x-ms-lease-duration\"))\n}\n\n// LeaseState returns the value for header x-ms-lease-state.\nfunc (bgpr BlobGetPropertiesResponse) LeaseState() LeaseStateType {\n\treturn LeaseStateType(bgpr.rawResponse.Header.Get(\"x-ms-lease-state\"))\n}\n\n// LeaseStatus returns the value for header x-ms-lease-status.\nfunc (bgpr BlobGetPropertiesResponse) LeaseStatus() LeaseStatusType {\n\treturn LeaseStatusType(bgpr.rawResponse.Header.Get(\"x-ms-lease-status\"))\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bgpr BlobGetPropertiesResponse) RequestID() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bgpr BlobGetPropertiesResponse) Version() string {\n\treturn bgpr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobHierarchyList ...\ntype BlobHierarchyList struct {\n\tBlobPrefixes []BlobPrefix `xml:\"BlobPrefix\"`\n\tBlobItems    []BlobItem   `xml:\"Blob\"`\n}\n\n// BlobItem - An Azure Storage blob\ntype BlobItem struct {\n\tName       string         `xml:\"Name\"`\n\tDeleted    bool           `xml:\"Deleted\"`\n\tSnapshot   string         `xml:\"Snapshot\"`\n\tProperties BlobProperties `xml:\"Properties\"`\n\tMetadata   Metadata       `xml:\"Metadata\"`\n}\n\n// BlobPrefix ...\ntype BlobPrefix struct {\n\tName string `xml:\"Name\"`\n}\n\n// BlobProperties - Properties of a blob\ntype BlobProperties struct {\n\tLastModified time.Time `xml:\"Last-Modified\"`\n\tEtag         ETag      `xml:\"Etag\"`\n\t// ContentLength - Size in bytes\n\tContentLength      *int64  `xml:\"Content-Length\"`\n\tContentType        *string `xml:\"Content-Type\"`\n\tContentEncoding    *string `xml:\"Content-Encoding\"`\n\tContentLanguage    *string `xml:\"Content-Language\"`\n\tContentMD5         []byte  `xml:\"Content-MD5\"`\n\tContentDisposition *string `xml:\"Content-Disposition\"`\n\tCacheControl       *string `xml:\"Cache-Control\"`\n\tBlobSequenceNumber *int64  `xml:\"x-ms-blob-sequence-number\"`\n\t// BlobType - Possible values include: 'BlobBlockBlob', 'BlobPageBlob', 'BlobAppendBlob', 'BlobNone'\n\tBlobType BlobType `xml:\"BlobType\"`\n\t// LeaseStatus - Possible values include: 'LeaseStatusLocked', 'LeaseStatusUnlocked', 'LeaseStatusNone'\n\tLeaseStatus LeaseStatusType `xml:\"LeaseStatus\"`\n\t// LeaseState - Possible values include: 'LeaseStateAvailable', 'LeaseStateLeased', 'LeaseStateExpired', 'LeaseStateBreaking', 'LeaseStateBroken', 'LeaseStateNone'\n\tLeaseState LeaseStateType `xml:\"LeaseState\"`\n\t// LeaseDuration - Possible values include: 'LeaseDurationInfinite', 'LeaseDurationFixed', 'LeaseDurationNone'\n\tLeaseDuration LeaseDurationType `xml:\"LeaseDuration\"`\n\tCopyID        *string           `xml:\"CopyId\"`\n\t// CopyStatus - Possible values include: 'CopyStatusPending', 'CopyStatusSuccess', 'CopyStatusAborted', 'CopyStatusFailed', 'CopyStatusNone'\n\tCopyStatus             CopyStatusType `xml:\"CopyStatus\"`\n\tCopySource             *string        `xml:\"CopySource\"`\n\tCopyProgress           *string        `xml:\"CopyProgress\"`\n\tCopyCompletionTime     *time.Time     `xml:\"CopyCompletionTime\"`\n\tCopyStatusDescription  *string        `xml:\"CopyStatusDescription\"`\n\tServerEncrypted        *bool          `xml:\"ServerEncrypted\"`\n\tIncrementalCopy        *bool          `xml:\"IncrementalCopy\"`\n\tDestinationSnapshot    *string        `xml:\"DestinationSnapshot\"`\n\tDeletedTime            *time.Time     `xml:\"DeletedTime\"`\n\tRemainingRetentionDays *int32         `xml:\"RemainingRetentionDays\"`\n\t// AccessTier - Possible values include: 'AccessTierP4', 'AccessTierP6', 'AccessTierP10', 'AccessTierP20', 'AccessTierP30', 'AccessTierP40', 'AccessTierP50', 'AccessTierHot', 'AccessTierCool', 'AccessTierArchive', 'AccessTierNone'\n\tAccessTier         AccessTierType `xml:\"AccessTier\"`\n\tAccessTierInferred *bool          `xml:\"AccessTierInferred\"`\n\t// ArchiveStatus - Possible values include: 'ArchiveStatusRehydratePendingToHot', 'ArchiveStatusRehydratePendingToCool', 'ArchiveStatusNone'\n\tArchiveStatus ArchiveStatusType `xml:\"ArchiveStatus\"`\n}\n\n// MarshalXML implements the xml.Marshaler interface for BlobProperties.\nfunc (bp BlobProperties) MarshalXML(e *xml.Encoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*BlobProperties)(nil)).Elem().Size() != reflect.TypeOf((*blobProperties)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between BlobProperties and blobProperties\")\n\t}\n\tbp2 := (*blobProperties)(unsafe.Pointer(&bp))\n\treturn e.EncodeElement(*bp2, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaler interface for BlobProperties.\nfunc (bp *BlobProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*BlobProperties)(nil)).Elem().Size() != reflect.TypeOf((*blobProperties)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between BlobProperties and blobProperties\")\n\t}\n\tbp2 := (*blobProperties)(unsafe.Pointer(bp))\n\treturn d.DecodeElement(bp2, &start)\n}\n\n// BlobReleaseLeaseResponse ...\ntype BlobReleaseLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (brlr BlobReleaseLeaseResponse) Response() *http.Response {\n\treturn brlr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (brlr BlobReleaseLeaseResponse) StatusCode() int {\n\treturn brlr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (brlr BlobReleaseLeaseResponse) Status() string {\n\treturn brlr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (brlr BlobReleaseLeaseResponse) Date() time.Time {\n\ts := brlr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (brlr BlobReleaseLeaseResponse) ErrorCode() string {\n\treturn brlr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (brlr BlobReleaseLeaseResponse) ETag() ETag {\n\treturn ETag(brlr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (brlr BlobReleaseLeaseResponse) LastModified() time.Time {\n\ts := brlr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (brlr BlobReleaseLeaseResponse) RequestID() string {\n\treturn brlr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (brlr BlobReleaseLeaseResponse) Version() string {\n\treturn brlr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobRenewLeaseResponse ...\ntype BlobRenewLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (brlr BlobRenewLeaseResponse) Response() *http.Response {\n\treturn brlr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (brlr BlobRenewLeaseResponse) StatusCode() int {\n\treturn brlr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (brlr BlobRenewLeaseResponse) Status() string {\n\treturn brlr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (brlr BlobRenewLeaseResponse) Date() time.Time {\n\ts := brlr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (brlr BlobRenewLeaseResponse) ErrorCode() string {\n\treturn brlr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (brlr BlobRenewLeaseResponse) ETag() ETag {\n\treturn ETag(brlr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (brlr BlobRenewLeaseResponse) LastModified() time.Time {\n\ts := brlr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseID returns the value for header x-ms-lease-id.\nfunc (brlr BlobRenewLeaseResponse) LeaseID() string {\n\treturn brlr.rawResponse.Header.Get(\"x-ms-lease-id\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (brlr BlobRenewLeaseResponse) RequestID() string {\n\treturn brlr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (brlr BlobRenewLeaseResponse) Version() string {\n\treturn brlr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobSetHTTPHeadersResponse ...\ntype BlobSetHTTPHeadersResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bshhr BlobSetHTTPHeadersResponse) Response() *http.Response {\n\treturn bshhr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bshhr BlobSetHTTPHeadersResponse) StatusCode() int {\n\treturn bshhr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bshhr BlobSetHTTPHeadersResponse) Status() string {\n\treturn bshhr.rawResponse.Status\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (bshhr BlobSetHTTPHeadersResponse) BlobSequenceNumber() int64 {\n\ts := bshhr.rawResponse.Header.Get(\"x-ms-blob-sequence-number\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// Date returns the value for header Date.\nfunc (bshhr BlobSetHTTPHeadersResponse) Date() time.Time {\n\ts := bshhr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bshhr BlobSetHTTPHeadersResponse) ErrorCode() string {\n\treturn bshhr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bshhr BlobSetHTTPHeadersResponse) ETag() ETag {\n\treturn ETag(bshhr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bshhr BlobSetHTTPHeadersResponse) LastModified() time.Time {\n\ts := bshhr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bshhr BlobSetHTTPHeadersResponse) RequestID() string {\n\treturn bshhr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bshhr BlobSetHTTPHeadersResponse) Version() string {\n\treturn bshhr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobSetMetadataResponse ...\ntype BlobSetMetadataResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bsmr BlobSetMetadataResponse) Response() *http.Response {\n\treturn bsmr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bsmr BlobSetMetadataResponse) StatusCode() int {\n\treturn bsmr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bsmr BlobSetMetadataResponse) Status() string {\n\treturn bsmr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (bsmr BlobSetMetadataResponse) Date() time.Time {\n\ts := bsmr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bsmr BlobSetMetadataResponse) ErrorCode() string {\n\treturn bsmr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bsmr BlobSetMetadataResponse) ETag() ETag {\n\treturn ETag(bsmr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (bsmr BlobSetMetadataResponse) IsServerEncrypted() string {\n\treturn bsmr.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bsmr BlobSetMetadataResponse) LastModified() time.Time {\n\ts := bsmr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bsmr BlobSetMetadataResponse) RequestID() string {\n\treturn bsmr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bsmr BlobSetMetadataResponse) Version() string {\n\treturn bsmr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobSetTierResponse ...\ntype BlobSetTierResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bstr BlobSetTierResponse) Response() *http.Response {\n\treturn bstr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bstr BlobSetTierResponse) StatusCode() int {\n\treturn bstr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bstr BlobSetTierResponse) Status() string {\n\treturn bstr.rawResponse.Status\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bstr BlobSetTierResponse) ErrorCode() string {\n\treturn bstr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bstr BlobSetTierResponse) RequestID() string {\n\treturn bstr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bstr BlobSetTierResponse) Version() string {\n\treturn bstr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobStartCopyFromURLResponse ...\ntype BlobStartCopyFromURLResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bscfur BlobStartCopyFromURLResponse) Response() *http.Response {\n\treturn bscfur.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bscfur BlobStartCopyFromURLResponse) StatusCode() int {\n\treturn bscfur.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bscfur BlobStartCopyFromURLResponse) Status() string {\n\treturn bscfur.rawResponse.Status\n}\n\n// CopyID returns the value for header x-ms-copy-id.\nfunc (bscfur BlobStartCopyFromURLResponse) CopyID() string {\n\treturn bscfur.rawResponse.Header.Get(\"x-ms-copy-id\")\n}\n\n// CopyStatus returns the value for header x-ms-copy-status.\nfunc (bscfur BlobStartCopyFromURLResponse) CopyStatus() CopyStatusType {\n\treturn CopyStatusType(bscfur.rawResponse.Header.Get(\"x-ms-copy-status\"))\n}\n\n// Date returns the value for header Date.\nfunc (bscfur BlobStartCopyFromURLResponse) Date() time.Time {\n\ts := bscfur.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bscfur BlobStartCopyFromURLResponse) ErrorCode() string {\n\treturn bscfur.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bscfur BlobStartCopyFromURLResponse) ETag() ETag {\n\treturn ETag(bscfur.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bscfur BlobStartCopyFromURLResponse) LastModified() time.Time {\n\ts := bscfur.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bscfur BlobStartCopyFromURLResponse) RequestID() string {\n\treturn bscfur.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bscfur BlobStartCopyFromURLResponse) Version() string {\n\treturn bscfur.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlobUndeleteResponse ...\ntype BlobUndeleteResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bur BlobUndeleteResponse) Response() *http.Response {\n\treturn bur.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bur BlobUndeleteResponse) StatusCode() int {\n\treturn bur.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bur BlobUndeleteResponse) Status() string {\n\treturn bur.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (bur BlobUndeleteResponse) Date() time.Time {\n\ts := bur.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bur BlobUndeleteResponse) ErrorCode() string {\n\treturn bur.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bur BlobUndeleteResponse) RequestID() string {\n\treturn bur.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bur BlobUndeleteResponse) Version() string {\n\treturn bur.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// Block - Represents a single block in a block blob.  It describes the block's ID and size.\ntype Block struct {\n\t// Name - The base64 encoded block ID.\n\tName string `xml:\"Name\"`\n\t// Size - The block size in bytes.\n\tSize int32 `xml:\"Size\"`\n}\n\n// BlockBlobCommitBlockListResponse ...\ntype BlockBlobCommitBlockListResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bbcblr BlockBlobCommitBlockListResponse) Response() *http.Response {\n\treturn bbcblr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bbcblr BlockBlobCommitBlockListResponse) StatusCode() int {\n\treturn bbcblr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bbcblr BlockBlobCommitBlockListResponse) Status() string {\n\treturn bbcblr.rawResponse.Status\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (bbcblr BlockBlobCommitBlockListResponse) ContentMD5() []byte {\n\ts := bbcblr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (bbcblr BlockBlobCommitBlockListResponse) Date() time.Time {\n\ts := bbcblr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bbcblr BlockBlobCommitBlockListResponse) ErrorCode() string {\n\treturn bbcblr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bbcblr BlockBlobCommitBlockListResponse) ETag() ETag {\n\treturn ETag(bbcblr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (bbcblr BlockBlobCommitBlockListResponse) IsServerEncrypted() string {\n\treturn bbcblr.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bbcblr BlockBlobCommitBlockListResponse) LastModified() time.Time {\n\ts := bbcblr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bbcblr BlockBlobCommitBlockListResponse) RequestID() string {\n\treturn bbcblr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bbcblr BlockBlobCommitBlockListResponse) Version() string {\n\treturn bbcblr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlockBlobStageBlockFromURLResponse ...\ntype BlockBlobStageBlockFromURLResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) Response() *http.Response {\n\treturn bbsbfur.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) StatusCode() int {\n\treturn bbsbfur.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) Status() string {\n\treturn bbsbfur.rawResponse.Status\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) ContentMD5() []byte {\n\ts := bbsbfur.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) Date() time.Time {\n\ts := bbsbfur.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) ErrorCode() string {\n\treturn bbsbfur.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) IsServerEncrypted() string {\n\treturn bbsbfur.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) RequestID() string {\n\treturn bbsbfur.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bbsbfur BlockBlobStageBlockFromURLResponse) Version() string {\n\treturn bbsbfur.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlockBlobStageBlockResponse ...\ntype BlockBlobStageBlockResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bbsbr BlockBlobStageBlockResponse) Response() *http.Response {\n\treturn bbsbr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bbsbr BlockBlobStageBlockResponse) StatusCode() int {\n\treturn bbsbr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bbsbr BlockBlobStageBlockResponse) Status() string {\n\treturn bbsbr.rawResponse.Status\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (bbsbr BlockBlobStageBlockResponse) ContentMD5() []byte {\n\ts := bbsbr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (bbsbr BlockBlobStageBlockResponse) Date() time.Time {\n\ts := bbsbr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bbsbr BlockBlobStageBlockResponse) ErrorCode() string {\n\treturn bbsbr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (bbsbr BlockBlobStageBlockResponse) IsServerEncrypted() string {\n\treturn bbsbr.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bbsbr BlockBlobStageBlockResponse) RequestID() string {\n\treturn bbsbr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bbsbr BlockBlobStageBlockResponse) Version() string {\n\treturn bbsbr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlockBlobUploadResponse ...\ntype BlockBlobUploadResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (bbur BlockBlobUploadResponse) Response() *http.Response {\n\treturn bbur.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bbur BlockBlobUploadResponse) StatusCode() int {\n\treturn bbur.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bbur BlockBlobUploadResponse) Status() string {\n\treturn bbur.rawResponse.Status\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (bbur BlockBlobUploadResponse) ContentMD5() []byte {\n\ts := bbur.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (bbur BlockBlobUploadResponse) Date() time.Time {\n\ts := bbur.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bbur BlockBlobUploadResponse) ErrorCode() string {\n\treturn bbur.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bbur BlockBlobUploadResponse) ETag() ETag {\n\treturn ETag(bbur.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (bbur BlockBlobUploadResponse) IsServerEncrypted() string {\n\treturn bbur.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bbur BlockBlobUploadResponse) LastModified() time.Time {\n\ts := bbur.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bbur BlockBlobUploadResponse) RequestID() string {\n\treturn bbur.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bbur BlockBlobUploadResponse) Version() string {\n\treturn bbur.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlockList ...\ntype BlockList struct {\n\trawResponse       *http.Response\n\tCommittedBlocks   []Block `xml:\"CommittedBlocks>Block\"`\n\tUncommittedBlocks []Block `xml:\"UncommittedBlocks>Block\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (bl BlockList) Response() *http.Response {\n\treturn bl.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (bl BlockList) StatusCode() int {\n\treturn bl.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (bl BlockList) Status() string {\n\treturn bl.rawResponse.Status\n}\n\n// BlobContentLength returns the value for header x-ms-blob-content-length.\nfunc (bl BlockList) BlobContentLength() int64 {\n\ts := bl.rawResponse.Header.Get(\"x-ms-blob-content-length\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// ContentType returns the value for header Content-Type.\nfunc (bl BlockList) ContentType() string {\n\treturn bl.rawResponse.Header.Get(\"Content-Type\")\n}\n\n// Date returns the value for header Date.\nfunc (bl BlockList) Date() time.Time {\n\ts := bl.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (bl BlockList) ErrorCode() string {\n\treturn bl.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (bl BlockList) ETag() ETag {\n\treturn ETag(bl.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (bl BlockList) LastModified() time.Time {\n\ts := bl.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (bl BlockList) RequestID() string {\n\treturn bl.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (bl BlockList) Version() string {\n\treturn bl.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// BlockLookupList ...\ntype BlockLookupList struct {\n\t// XMLName is used for marshalling and is subject to removal in a future release.\n\tXMLName     xml.Name `xml:\"BlockList\"`\n\tCommitted   []string `xml:\"Committed\"`\n\tUncommitted []string `xml:\"Uncommitted\"`\n\tLatest      []string `xml:\"Latest\"`\n}\n\n// ClearRange ...\ntype ClearRange struct {\n\tStart int64 `xml:\"Start\"`\n\tEnd   int64 `xml:\"End\"`\n}\n\n// ContainerAcquireLeaseResponse ...\ntype ContainerAcquireLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (calr ContainerAcquireLeaseResponse) Response() *http.Response {\n\treturn calr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (calr ContainerAcquireLeaseResponse) StatusCode() int {\n\treturn calr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (calr ContainerAcquireLeaseResponse) Status() string {\n\treturn calr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (calr ContainerAcquireLeaseResponse) Date() time.Time {\n\ts := calr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (calr ContainerAcquireLeaseResponse) ErrorCode() string {\n\treturn calr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (calr ContainerAcquireLeaseResponse) ETag() ETag {\n\treturn ETag(calr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (calr ContainerAcquireLeaseResponse) LastModified() time.Time {\n\ts := calr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseID returns the value for header x-ms-lease-id.\nfunc (calr ContainerAcquireLeaseResponse) LeaseID() string {\n\treturn calr.rawResponse.Header.Get(\"x-ms-lease-id\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (calr ContainerAcquireLeaseResponse) RequestID() string {\n\treturn calr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (calr ContainerAcquireLeaseResponse) Version() string {\n\treturn calr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerBreakLeaseResponse ...\ntype ContainerBreakLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (cblr ContainerBreakLeaseResponse) Response() *http.Response {\n\treturn cblr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (cblr ContainerBreakLeaseResponse) StatusCode() int {\n\treturn cblr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (cblr ContainerBreakLeaseResponse) Status() string {\n\treturn cblr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (cblr ContainerBreakLeaseResponse) Date() time.Time {\n\ts := cblr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (cblr ContainerBreakLeaseResponse) ErrorCode() string {\n\treturn cblr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (cblr ContainerBreakLeaseResponse) ETag() ETag {\n\treturn ETag(cblr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (cblr ContainerBreakLeaseResponse) LastModified() time.Time {\n\ts := cblr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseTime returns the value for header x-ms-lease-time.\nfunc (cblr ContainerBreakLeaseResponse) LeaseTime() int32 {\n\ts := cblr.rawResponse.Header.Get(\"x-ms-lease-time\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 32)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn int32(i)\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (cblr ContainerBreakLeaseResponse) RequestID() string {\n\treturn cblr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (cblr ContainerBreakLeaseResponse) Version() string {\n\treturn cblr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerChangeLeaseResponse ...\ntype ContainerChangeLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (cclr ContainerChangeLeaseResponse) Response() *http.Response {\n\treturn cclr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (cclr ContainerChangeLeaseResponse) StatusCode() int {\n\treturn cclr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (cclr ContainerChangeLeaseResponse) Status() string {\n\treturn cclr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (cclr ContainerChangeLeaseResponse) Date() time.Time {\n\ts := cclr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (cclr ContainerChangeLeaseResponse) ErrorCode() string {\n\treturn cclr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (cclr ContainerChangeLeaseResponse) ETag() ETag {\n\treturn ETag(cclr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (cclr ContainerChangeLeaseResponse) LastModified() time.Time {\n\ts := cclr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseID returns the value for header x-ms-lease-id.\nfunc (cclr ContainerChangeLeaseResponse) LeaseID() string {\n\treturn cclr.rawResponse.Header.Get(\"x-ms-lease-id\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (cclr ContainerChangeLeaseResponse) RequestID() string {\n\treturn cclr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (cclr ContainerChangeLeaseResponse) Version() string {\n\treturn cclr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerCreateResponse ...\ntype ContainerCreateResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (ccr ContainerCreateResponse) Response() *http.Response {\n\treturn ccr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (ccr ContainerCreateResponse) StatusCode() int {\n\treturn ccr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (ccr ContainerCreateResponse) Status() string {\n\treturn ccr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (ccr ContainerCreateResponse) Date() time.Time {\n\ts := ccr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (ccr ContainerCreateResponse) ErrorCode() string {\n\treturn ccr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (ccr ContainerCreateResponse) ETag() ETag {\n\treturn ETag(ccr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (ccr ContainerCreateResponse) LastModified() time.Time {\n\ts := ccr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (ccr ContainerCreateResponse) RequestID() string {\n\treturn ccr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (ccr ContainerCreateResponse) Version() string {\n\treturn ccr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerDeleteResponse ...\ntype ContainerDeleteResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (cdr ContainerDeleteResponse) Response() *http.Response {\n\treturn cdr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (cdr ContainerDeleteResponse) StatusCode() int {\n\treturn cdr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (cdr ContainerDeleteResponse) Status() string {\n\treturn cdr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (cdr ContainerDeleteResponse) Date() time.Time {\n\ts := cdr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (cdr ContainerDeleteResponse) ErrorCode() string {\n\treturn cdr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (cdr ContainerDeleteResponse) RequestID() string {\n\treturn cdr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (cdr ContainerDeleteResponse) Version() string {\n\treturn cdr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerGetPropertiesResponse ...\ntype ContainerGetPropertiesResponse struct {\n\trawResponse *http.Response\n}\n\n// NewMetadata returns user-defined key/value pairs.\nfunc (cgpr ContainerGetPropertiesResponse) NewMetadata() Metadata {\n\tmd := Metadata{}\n\tfor k, v := range cgpr.rawResponse.Header {\n\t\tif len(k) > mdPrefixLen {\n\t\t\tif prefix := k[0:mdPrefixLen]; strings.EqualFold(prefix, mdPrefix) {\n\t\t\t\tmd[strings.ToLower(k[mdPrefixLen:])] = v[0]\n\t\t\t}\n\t\t}\n\t}\n\treturn md\n}\n\n// Response returns the raw HTTP response object.\nfunc (cgpr ContainerGetPropertiesResponse) Response() *http.Response {\n\treturn cgpr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (cgpr ContainerGetPropertiesResponse) StatusCode() int {\n\treturn cgpr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (cgpr ContainerGetPropertiesResponse) Status() string {\n\treturn cgpr.rawResponse.Status\n}\n\n// BlobPublicAccess returns the value for header x-ms-blob-public-access.\nfunc (cgpr ContainerGetPropertiesResponse) BlobPublicAccess() PublicAccessType {\n\treturn PublicAccessType(cgpr.rawResponse.Header.Get(\"x-ms-blob-public-access\"))\n}\n\n// Date returns the value for header Date.\nfunc (cgpr ContainerGetPropertiesResponse) Date() time.Time {\n\ts := cgpr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (cgpr ContainerGetPropertiesResponse) ErrorCode() string {\n\treturn cgpr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (cgpr ContainerGetPropertiesResponse) ETag() ETag {\n\treturn ETag(cgpr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (cgpr ContainerGetPropertiesResponse) LastModified() time.Time {\n\ts := cgpr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseDuration returns the value for header x-ms-lease-duration.\nfunc (cgpr ContainerGetPropertiesResponse) LeaseDuration() LeaseDurationType {\n\treturn LeaseDurationType(cgpr.rawResponse.Header.Get(\"x-ms-lease-duration\"))\n}\n\n// LeaseState returns the value for header x-ms-lease-state.\nfunc (cgpr ContainerGetPropertiesResponse) LeaseState() LeaseStateType {\n\treturn LeaseStateType(cgpr.rawResponse.Header.Get(\"x-ms-lease-state\"))\n}\n\n// LeaseStatus returns the value for header x-ms-lease-status.\nfunc (cgpr ContainerGetPropertiesResponse) LeaseStatus() LeaseStatusType {\n\treturn LeaseStatusType(cgpr.rawResponse.Header.Get(\"x-ms-lease-status\"))\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (cgpr ContainerGetPropertiesResponse) RequestID() string {\n\treturn cgpr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (cgpr ContainerGetPropertiesResponse) Version() string {\n\treturn cgpr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerItem - An Azure Storage container\ntype ContainerItem struct {\n\tName       string              `xml:\"Name\"`\n\tProperties ContainerProperties `xml:\"Properties\"`\n\tMetadata   Metadata            `xml:\"Metadata\"`\n}\n\n// ContainerProperties - Properties of a container\ntype ContainerProperties struct {\n\tLastModified time.Time `xml:\"Last-Modified\"`\n\tEtag         ETag      `xml:\"Etag\"`\n\t// LeaseStatus - Possible values include: 'LeaseStatusLocked', 'LeaseStatusUnlocked', 'LeaseStatusNone'\n\tLeaseStatus LeaseStatusType `xml:\"LeaseStatus\"`\n\t// LeaseState - Possible values include: 'LeaseStateAvailable', 'LeaseStateLeased', 'LeaseStateExpired', 'LeaseStateBreaking', 'LeaseStateBroken', 'LeaseStateNone'\n\tLeaseState LeaseStateType `xml:\"LeaseState\"`\n\t// LeaseDuration - Possible values include: 'LeaseDurationInfinite', 'LeaseDurationFixed', 'LeaseDurationNone'\n\tLeaseDuration LeaseDurationType `xml:\"LeaseDuration\"`\n\t// PublicAccess - Possible values include: 'PublicAccessContainer', 'PublicAccessBlob', 'PublicAccessNone'\n\tPublicAccess PublicAccessType `xml:\"PublicAccess\"`\n}\n\n// MarshalXML implements the xml.Marshaler interface for ContainerProperties.\nfunc (cp ContainerProperties) MarshalXML(e *xml.Encoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*ContainerProperties)(nil)).Elem().Size() != reflect.TypeOf((*containerProperties)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between ContainerProperties and containerProperties\")\n\t}\n\tcp2 := (*containerProperties)(unsafe.Pointer(&cp))\n\treturn e.EncodeElement(*cp2, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaler interface for ContainerProperties.\nfunc (cp *ContainerProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*ContainerProperties)(nil)).Elem().Size() != reflect.TypeOf((*containerProperties)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between ContainerProperties and containerProperties\")\n\t}\n\tcp2 := (*containerProperties)(unsafe.Pointer(cp))\n\treturn d.DecodeElement(cp2, &start)\n}\n\n// ContainerReleaseLeaseResponse ...\ntype ContainerReleaseLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (crlr ContainerReleaseLeaseResponse) Response() *http.Response {\n\treturn crlr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (crlr ContainerReleaseLeaseResponse) StatusCode() int {\n\treturn crlr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (crlr ContainerReleaseLeaseResponse) Status() string {\n\treturn crlr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (crlr ContainerReleaseLeaseResponse) Date() time.Time {\n\ts := crlr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (crlr ContainerReleaseLeaseResponse) ErrorCode() string {\n\treturn crlr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (crlr ContainerReleaseLeaseResponse) ETag() ETag {\n\treturn ETag(crlr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (crlr ContainerReleaseLeaseResponse) LastModified() time.Time {\n\ts := crlr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (crlr ContainerReleaseLeaseResponse) RequestID() string {\n\treturn crlr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (crlr ContainerReleaseLeaseResponse) Version() string {\n\treturn crlr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerRenewLeaseResponse ...\ntype ContainerRenewLeaseResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (crlr ContainerRenewLeaseResponse) Response() *http.Response {\n\treturn crlr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (crlr ContainerRenewLeaseResponse) StatusCode() int {\n\treturn crlr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (crlr ContainerRenewLeaseResponse) Status() string {\n\treturn crlr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (crlr ContainerRenewLeaseResponse) Date() time.Time {\n\ts := crlr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (crlr ContainerRenewLeaseResponse) ErrorCode() string {\n\treturn crlr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (crlr ContainerRenewLeaseResponse) ETag() ETag {\n\treturn ETag(crlr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (crlr ContainerRenewLeaseResponse) LastModified() time.Time {\n\ts := crlr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseID returns the value for header x-ms-lease-id.\nfunc (crlr ContainerRenewLeaseResponse) LeaseID() string {\n\treturn crlr.rawResponse.Header.Get(\"x-ms-lease-id\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (crlr ContainerRenewLeaseResponse) RequestID() string {\n\treturn crlr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (crlr ContainerRenewLeaseResponse) Version() string {\n\treturn crlr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerSetAccessPolicyResponse ...\ntype ContainerSetAccessPolicyResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (csapr ContainerSetAccessPolicyResponse) Response() *http.Response {\n\treturn csapr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (csapr ContainerSetAccessPolicyResponse) StatusCode() int {\n\treturn csapr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (csapr ContainerSetAccessPolicyResponse) Status() string {\n\treturn csapr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (csapr ContainerSetAccessPolicyResponse) Date() time.Time {\n\ts := csapr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (csapr ContainerSetAccessPolicyResponse) ErrorCode() string {\n\treturn csapr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (csapr ContainerSetAccessPolicyResponse) ETag() ETag {\n\treturn ETag(csapr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (csapr ContainerSetAccessPolicyResponse) LastModified() time.Time {\n\ts := csapr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (csapr ContainerSetAccessPolicyResponse) RequestID() string {\n\treturn csapr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (csapr ContainerSetAccessPolicyResponse) Version() string {\n\treturn csapr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ContainerSetMetadataResponse ...\ntype ContainerSetMetadataResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (csmr ContainerSetMetadataResponse) Response() *http.Response {\n\treturn csmr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (csmr ContainerSetMetadataResponse) StatusCode() int {\n\treturn csmr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (csmr ContainerSetMetadataResponse) Status() string {\n\treturn csmr.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (csmr ContainerSetMetadataResponse) Date() time.Time {\n\ts := csmr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (csmr ContainerSetMetadataResponse) ErrorCode() string {\n\treturn csmr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (csmr ContainerSetMetadataResponse) ETag() ETag {\n\treturn ETag(csmr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (csmr ContainerSetMetadataResponse) LastModified() time.Time {\n\ts := csmr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (csmr ContainerSetMetadataResponse) RequestID() string {\n\treturn csmr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (csmr ContainerSetMetadataResponse) Version() string {\n\treturn csmr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// CorsRule - CORS is an HTTP feature that enables a web application running under one domain to access\n// resources in another domain. Web browsers implement a security restriction known as same-origin policy that\n// prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain\n// (the origin domain) to call APIs in another domain\ntype CorsRule struct {\n\t// AllowedOrigins - The origin domains that are permitted to make a request against the storage service via CORS. The origin domain is the domain from which the request originates. Note that the origin must be an exact case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains to make requests via CORS.\n\tAllowedOrigins string `xml:\"AllowedOrigins\"`\n\t// AllowedMethods - The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated)\n\tAllowedMethods string `xml:\"AllowedMethods\"`\n\t// AllowedHeaders - the request headers that the origin domain may specify on the CORS request.\n\tAllowedHeaders string `xml:\"AllowedHeaders\"`\n\t// ExposedHeaders - The response headers that may be sent in the response to the CORS request and exposed by the browser to the request issuer\n\tExposedHeaders string `xml:\"ExposedHeaders\"`\n\t// MaxAgeInSeconds - The maximum amount time that a browser should cache the preflight OPTIONS request.\n\tMaxAgeInSeconds int32 `xml:\"MaxAgeInSeconds\"`\n}\n\n// downloadResponse ...\ntype downloadResponse struct {\n\trawResponse *http.Response\n}\n\n// NewMetadata returns user-defined key/value pairs.\nfunc (dr downloadResponse) NewMetadata() Metadata {\n\tmd := Metadata{}\n\tfor k, v := range dr.rawResponse.Header {\n\t\tif len(k) > mdPrefixLen {\n\t\t\tif prefix := k[0:mdPrefixLen]; strings.EqualFold(prefix, mdPrefix) {\n\t\t\t\tmd[strings.ToLower(k[mdPrefixLen:])] = v[0]\n\t\t\t}\n\t\t}\n\t}\n\treturn md\n}\n\n// Response returns the raw HTTP response object.\nfunc (dr downloadResponse) Response() *http.Response {\n\treturn dr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (dr downloadResponse) StatusCode() int {\n\treturn dr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (dr downloadResponse) Status() string {\n\treturn dr.rawResponse.Status\n}\n\n// Body returns the raw HTTP response object's Body.\nfunc (dr downloadResponse) Body() io.ReadCloser {\n\treturn dr.rawResponse.Body\n}\n\n// AcceptRanges returns the value for header Accept-Ranges.\nfunc (dr downloadResponse) AcceptRanges() string {\n\treturn dr.rawResponse.Header.Get(\"Accept-Ranges\")\n}\n\n// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count.\nfunc (dr downloadResponse) BlobCommittedBlockCount() int32 {\n\ts := dr.rawResponse.Header.Get(\"x-ms-blob-committed-block-count\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 32)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn int32(i)\n}\n\n// BlobContentMD5 returns the value for header x-ms-blob-content-md5.\nfunc (dr downloadResponse) BlobContentMD5() []byte {\n\ts := dr.rawResponse.Header.Get(\"x-ms-blob-content-md5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (dr downloadResponse) BlobSequenceNumber() int64 {\n\ts := dr.rawResponse.Header.Get(\"x-ms-blob-sequence-number\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// BlobType returns the value for header x-ms-blob-type.\nfunc (dr downloadResponse) BlobType() BlobType {\n\treturn BlobType(dr.rawResponse.Header.Get(\"x-ms-blob-type\"))\n}\n\n// CacheControl returns the value for header Cache-Control.\nfunc (dr downloadResponse) CacheControl() string {\n\treturn dr.rawResponse.Header.Get(\"Cache-Control\")\n}\n\n// ContentDisposition returns the value for header Content-Disposition.\nfunc (dr downloadResponse) ContentDisposition() string {\n\treturn dr.rawResponse.Header.Get(\"Content-Disposition\")\n}\n\n// ContentEncoding returns the value for header Content-Encoding.\nfunc (dr downloadResponse) ContentEncoding() string {\n\treturn dr.rawResponse.Header.Get(\"Content-Encoding\")\n}\n\n// ContentLanguage returns the value for header Content-Language.\nfunc (dr downloadResponse) ContentLanguage() string {\n\treturn dr.rawResponse.Header.Get(\"Content-Language\")\n}\n\n// ContentLength returns the value for header Content-Length.\nfunc (dr downloadResponse) ContentLength() int64 {\n\ts := dr.rawResponse.Header.Get(\"Content-Length\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (dr downloadResponse) ContentMD5() []byte {\n\ts := dr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// ContentRange returns the value for header Content-Range.\nfunc (dr downloadResponse) ContentRange() string {\n\treturn dr.rawResponse.Header.Get(\"Content-Range\")\n}\n\n// ContentType returns the value for header Content-Type.\nfunc (dr downloadResponse) ContentType() string {\n\treturn dr.rawResponse.Header.Get(\"Content-Type\")\n}\n\n// CopyCompletionTime returns the value for header x-ms-copy-completion-time.\nfunc (dr downloadResponse) CopyCompletionTime() time.Time {\n\ts := dr.rawResponse.Header.Get(\"x-ms-copy-completion-time\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// CopyID returns the value for header x-ms-copy-id.\nfunc (dr downloadResponse) CopyID() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-copy-id\")\n}\n\n// CopyProgress returns the value for header x-ms-copy-progress.\nfunc (dr downloadResponse) CopyProgress() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-copy-progress\")\n}\n\n// CopySource returns the value for header x-ms-copy-source.\nfunc (dr downloadResponse) CopySource() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-copy-source\")\n}\n\n// CopyStatus returns the value for header x-ms-copy-status.\nfunc (dr downloadResponse) CopyStatus() CopyStatusType {\n\treturn CopyStatusType(dr.rawResponse.Header.Get(\"x-ms-copy-status\"))\n}\n\n// CopyStatusDescription returns the value for header x-ms-copy-status-description.\nfunc (dr downloadResponse) CopyStatusDescription() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-copy-status-description\")\n}\n\n// Date returns the value for header Date.\nfunc (dr downloadResponse) Date() time.Time {\n\ts := dr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (dr downloadResponse) ErrorCode() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (dr downloadResponse) ETag() ETag {\n\treturn ETag(dr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsServerEncrypted returns the value for header x-ms-server-encrypted.\nfunc (dr downloadResponse) IsServerEncrypted() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (dr downloadResponse) LastModified() time.Time {\n\ts := dr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// LeaseDuration returns the value for header x-ms-lease-duration.\nfunc (dr downloadResponse) LeaseDuration() LeaseDurationType {\n\treturn LeaseDurationType(dr.rawResponse.Header.Get(\"x-ms-lease-duration\"))\n}\n\n// LeaseState returns the value for header x-ms-lease-state.\nfunc (dr downloadResponse) LeaseState() LeaseStateType {\n\treturn LeaseStateType(dr.rawResponse.Header.Get(\"x-ms-lease-state\"))\n}\n\n// LeaseStatus returns the value for header x-ms-lease-status.\nfunc (dr downloadResponse) LeaseStatus() LeaseStatusType {\n\treturn LeaseStatusType(dr.rawResponse.Header.Get(\"x-ms-lease-status\"))\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (dr downloadResponse) RequestID() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (dr downloadResponse) Version() string {\n\treturn dr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// GeoReplication ...\ntype GeoReplication struct {\n\t// Status - The status of the secondary location. Possible values include: 'GeoReplicationStatusLive', 'GeoReplicationStatusBootstrap', 'GeoReplicationStatusUnavailable', 'GeoReplicationStatusNone'\n\tStatus GeoReplicationStatusType `xml:\"Status\"`\n\t// LastSyncTime - A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available for read operations at the secondary. Primary writes after this point in time may or may not be available for reads.\n\tLastSyncTime time.Time `xml:\"LastSyncTime\"`\n}\n\n// MarshalXML implements the xml.Marshaler interface for GeoReplication.\nfunc (gr GeoReplication) MarshalXML(e *xml.Encoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*GeoReplication)(nil)).Elem().Size() != reflect.TypeOf((*geoReplication)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between GeoReplication and geoReplication\")\n\t}\n\tgr2 := (*geoReplication)(unsafe.Pointer(&gr))\n\treturn e.EncodeElement(*gr2, start)\n}\n\n// UnmarshalXML implements the xml.Unmarshaler interface for GeoReplication.\nfunc (gr *GeoReplication) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {\n\tif reflect.TypeOf((*GeoReplication)(nil)).Elem().Size() != reflect.TypeOf((*geoReplication)(nil)).Elem().Size() {\n\t\tpanic(\"size mismatch between GeoReplication and geoReplication\")\n\t}\n\tgr2 := (*geoReplication)(unsafe.Pointer(gr))\n\treturn d.DecodeElement(gr2, &start)\n}\n\n// ListBlobsFlatSegmentResponse - An enumeration of blobs\ntype ListBlobsFlatSegmentResponse struct {\n\trawResponse *http.Response\n\t// XMLName is used for marshalling and is subject to removal in a future release.\n\tXMLName         xml.Name     `xml:\"EnumerationResults\"`\n\tServiceEndpoint string       `xml:\"ServiceEndpoint,attr\"`\n\tContainerName   string       `xml:\"ContainerName,attr\"`\n\tPrefix          string       `xml:\"Prefix\"`\n\tMarker          string       `xml:\"Marker\"`\n\tMaxResults      int32        `xml:\"MaxResults\"`\n\tDelimiter       string       `xml:\"Delimiter\"`\n\tSegment         BlobFlatList `xml:\"Blobs\"`\n\tNextMarker      Marker       `xml:\"NextMarker\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (lbfsr ListBlobsFlatSegmentResponse) Response() *http.Response {\n\treturn lbfsr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (lbfsr ListBlobsFlatSegmentResponse) StatusCode() int {\n\treturn lbfsr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (lbfsr ListBlobsFlatSegmentResponse) Status() string {\n\treturn lbfsr.rawResponse.Status\n}\n\n// ContentType returns the value for header Content-Type.\nfunc (lbfsr ListBlobsFlatSegmentResponse) ContentType() string {\n\treturn lbfsr.rawResponse.Header.Get(\"Content-Type\")\n}\n\n// Date returns the value for header Date.\nfunc (lbfsr ListBlobsFlatSegmentResponse) Date() time.Time {\n\ts := lbfsr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (lbfsr ListBlobsFlatSegmentResponse) ErrorCode() string {\n\treturn lbfsr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (lbfsr ListBlobsFlatSegmentResponse) RequestID() string {\n\treturn lbfsr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (lbfsr ListBlobsFlatSegmentResponse) Version() string {\n\treturn lbfsr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ListBlobsHierarchySegmentResponse - An enumeration of blobs\ntype ListBlobsHierarchySegmentResponse struct {\n\trawResponse *http.Response\n\t// XMLName is used for marshalling and is subject to removal in a future release.\n\tXMLName         xml.Name          `xml:\"EnumerationResults\"`\n\tServiceEndpoint string            `xml:\"ServiceEndpoint,attr\"`\n\tContainerName   string            `xml:\"ContainerName,attr\"`\n\tPrefix          string            `xml:\"Prefix\"`\n\tMarker          string            `xml:\"Marker\"`\n\tMaxResults      int32             `xml:\"MaxResults\"`\n\tDelimiter       string            `xml:\"Delimiter\"`\n\tSegment         BlobHierarchyList `xml:\"Blobs\"`\n\tNextMarker      Marker            `xml:\"NextMarker\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (lbhsr ListBlobsHierarchySegmentResponse) Response() *http.Response {\n\treturn lbhsr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (lbhsr ListBlobsHierarchySegmentResponse) StatusCode() int {\n\treturn lbhsr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (lbhsr ListBlobsHierarchySegmentResponse) Status() string {\n\treturn lbhsr.rawResponse.Status\n}\n\n// ContentType returns the value for header Content-Type.\nfunc (lbhsr ListBlobsHierarchySegmentResponse) ContentType() string {\n\treturn lbhsr.rawResponse.Header.Get(\"Content-Type\")\n}\n\n// Date returns the value for header Date.\nfunc (lbhsr ListBlobsHierarchySegmentResponse) Date() time.Time {\n\ts := lbhsr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (lbhsr ListBlobsHierarchySegmentResponse) ErrorCode() string {\n\treturn lbhsr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (lbhsr ListBlobsHierarchySegmentResponse) RequestID() string {\n\treturn lbhsr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (lbhsr ListBlobsHierarchySegmentResponse) Version() string {\n\treturn lbhsr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// ListContainersResponse - An enumeration of containers\ntype ListContainersResponse struct {\n\trawResponse *http.Response\n\t// XMLName is used for marshalling and is subject to removal in a future release.\n\tXMLName         xml.Name        `xml:\"EnumerationResults\"`\n\tServiceEndpoint string          `xml:\"ServiceEndpoint,attr\"`\n\tPrefix          string          `xml:\"Prefix\"`\n\tMarker          *string         `xml:\"Marker\"`\n\tMaxResults      int32           `xml:\"MaxResults\"`\n\tContainerItems  []ContainerItem `xml:\"Containers>Container\"`\n\tNextMarker      Marker          `xml:\"NextMarker\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (lcr ListContainersResponse) Response() *http.Response {\n\treturn lcr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (lcr ListContainersResponse) StatusCode() int {\n\treturn lcr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (lcr ListContainersResponse) Status() string {\n\treturn lcr.rawResponse.Status\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (lcr ListContainersResponse) ErrorCode() string {\n\treturn lcr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (lcr ListContainersResponse) RequestID() string {\n\treturn lcr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (lcr ListContainersResponse) Version() string {\n\treturn lcr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// Logging - Azure Analytics Logging settings.\ntype Logging struct {\n\t// Version - The version of Storage Analytics to configure.\n\tVersion string `xml:\"Version\"`\n\t// Delete - Indicates whether all delete requests should be logged.\n\tDelete bool `xml:\"Delete\"`\n\t// Read - Indicates whether all read requests should be logged.\n\tRead bool `xml:\"Read\"`\n\t// Write - Indicates whether all write requests should be logged.\n\tWrite           bool            `xml:\"Write\"`\n\tRetentionPolicy RetentionPolicy `xml:\"RetentionPolicy\"`\n}\n\n// Metrics ...\ntype Metrics struct {\n\t// Version - The version of Storage Analytics to configure.\n\tVersion *string `xml:\"Version\"`\n\t// Enabled - Indicates whether metrics are enabled for the Blob service.\n\tEnabled bool `xml:\"Enabled\"`\n\t// IncludeAPIs - Indicates whether metrics should generate summary statistics for called API operations.\n\tIncludeAPIs     *bool            `xml:\"IncludeAPIs\"`\n\tRetentionPolicy *RetentionPolicy `xml:\"RetentionPolicy\"`\n}\n\n// PageBlobClearPagesResponse ...\ntype PageBlobClearPagesResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (pbcpr PageBlobClearPagesResponse) Response() *http.Response {\n\treturn pbcpr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (pbcpr PageBlobClearPagesResponse) StatusCode() int {\n\treturn pbcpr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (pbcpr PageBlobClearPagesResponse) Status() string {\n\treturn pbcpr.rawResponse.Status\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (pbcpr PageBlobClearPagesResponse) BlobSequenceNumber() int64 {\n\ts := pbcpr.rawResponse.Header.Get(\"x-ms-blob-sequence-number\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (pbcpr PageBlobClearPagesResponse) ContentMD5() []byte {\n\ts := pbcpr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (pbcpr PageBlobClearPagesResponse) Date() time.Time {\n\ts := pbcpr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (pbcpr PageBlobClearPagesResponse) ErrorCode() string {\n\treturn pbcpr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (pbcpr PageBlobClearPagesResponse) ETag() ETag {\n\treturn ETag(pbcpr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (pbcpr PageBlobClearPagesResponse) LastModified() time.Time {\n\ts := pbcpr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (pbcpr PageBlobClearPagesResponse) RequestID() string {\n\treturn pbcpr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (pbcpr PageBlobClearPagesResponse) Version() string {\n\treturn pbcpr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// PageBlobCopyIncrementalResponse ...\ntype PageBlobCopyIncrementalResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (pbcir PageBlobCopyIncrementalResponse) Response() *http.Response {\n\treturn pbcir.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (pbcir PageBlobCopyIncrementalResponse) StatusCode() int {\n\treturn pbcir.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (pbcir PageBlobCopyIncrementalResponse) Status() string {\n\treturn pbcir.rawResponse.Status\n}\n\n// CopyID returns the value for header x-ms-copy-id.\nfunc (pbcir PageBlobCopyIncrementalResponse) CopyID() string {\n\treturn pbcir.rawResponse.Header.Get(\"x-ms-copy-id\")\n}\n\n// CopyStatus returns the value for header x-ms-copy-status.\nfunc (pbcir PageBlobCopyIncrementalResponse) CopyStatus() CopyStatusType {\n\treturn CopyStatusType(pbcir.rawResponse.Header.Get(\"x-ms-copy-status\"))\n}\n\n// Date returns the value for header Date.\nfunc (pbcir PageBlobCopyIncrementalResponse) Date() time.Time {\n\ts := pbcir.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (pbcir PageBlobCopyIncrementalResponse) ErrorCode() string {\n\treturn pbcir.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (pbcir PageBlobCopyIncrementalResponse) ETag() ETag {\n\treturn ETag(pbcir.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (pbcir PageBlobCopyIncrementalResponse) LastModified() time.Time {\n\ts := pbcir.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (pbcir PageBlobCopyIncrementalResponse) RequestID() string {\n\treturn pbcir.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (pbcir PageBlobCopyIncrementalResponse) Version() string {\n\treturn pbcir.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// PageBlobCreateResponse ...\ntype PageBlobCreateResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (pbcr PageBlobCreateResponse) Response() *http.Response {\n\treturn pbcr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (pbcr PageBlobCreateResponse) StatusCode() int {\n\treturn pbcr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (pbcr PageBlobCreateResponse) Status() string {\n\treturn pbcr.rawResponse.Status\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (pbcr PageBlobCreateResponse) ContentMD5() []byte {\n\ts := pbcr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (pbcr PageBlobCreateResponse) Date() time.Time {\n\ts := pbcr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (pbcr PageBlobCreateResponse) ErrorCode() string {\n\treturn pbcr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (pbcr PageBlobCreateResponse) ETag() ETag {\n\treturn ETag(pbcr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (pbcr PageBlobCreateResponse) IsServerEncrypted() string {\n\treturn pbcr.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (pbcr PageBlobCreateResponse) LastModified() time.Time {\n\ts := pbcr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (pbcr PageBlobCreateResponse) RequestID() string {\n\treturn pbcr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (pbcr PageBlobCreateResponse) Version() string {\n\treturn pbcr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// PageBlobResizeResponse ...\ntype PageBlobResizeResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (pbrr PageBlobResizeResponse) Response() *http.Response {\n\treturn pbrr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (pbrr PageBlobResizeResponse) StatusCode() int {\n\treturn pbrr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (pbrr PageBlobResizeResponse) Status() string {\n\treturn pbrr.rawResponse.Status\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (pbrr PageBlobResizeResponse) BlobSequenceNumber() int64 {\n\ts := pbrr.rawResponse.Header.Get(\"x-ms-blob-sequence-number\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// Date returns the value for header Date.\nfunc (pbrr PageBlobResizeResponse) Date() time.Time {\n\ts := pbrr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (pbrr PageBlobResizeResponse) ErrorCode() string {\n\treturn pbrr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (pbrr PageBlobResizeResponse) ETag() ETag {\n\treturn ETag(pbrr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (pbrr PageBlobResizeResponse) LastModified() time.Time {\n\ts := pbrr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (pbrr PageBlobResizeResponse) RequestID() string {\n\treturn pbrr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (pbrr PageBlobResizeResponse) Version() string {\n\treturn pbrr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// PageBlobUpdateSequenceNumberResponse ...\ntype PageBlobUpdateSequenceNumberResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) Response() *http.Response {\n\treturn pbusnr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) StatusCode() int {\n\treturn pbusnr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) Status() string {\n\treturn pbusnr.rawResponse.Status\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) BlobSequenceNumber() int64 {\n\ts := pbusnr.rawResponse.Header.Get(\"x-ms-blob-sequence-number\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// Date returns the value for header Date.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) Date() time.Time {\n\ts := pbusnr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) ErrorCode() string {\n\treturn pbusnr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) ETag() ETag {\n\treturn ETag(pbusnr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) LastModified() time.Time {\n\ts := pbusnr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) RequestID() string {\n\treturn pbusnr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (pbusnr PageBlobUpdateSequenceNumberResponse) Version() string {\n\treturn pbusnr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// PageBlobUploadPagesResponse ...\ntype PageBlobUploadPagesResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (pbupr PageBlobUploadPagesResponse) Response() *http.Response {\n\treturn pbupr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (pbupr PageBlobUploadPagesResponse) StatusCode() int {\n\treturn pbupr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (pbupr PageBlobUploadPagesResponse) Status() string {\n\treturn pbupr.rawResponse.Status\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (pbupr PageBlobUploadPagesResponse) BlobSequenceNumber() int64 {\n\ts := pbupr.rawResponse.Header.Get(\"x-ms-blob-sequence-number\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (pbupr PageBlobUploadPagesResponse) ContentMD5() []byte {\n\ts := pbupr.rawResponse.Header.Get(\"Content-MD5\")\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\tb, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// Date returns the value for header Date.\nfunc (pbupr PageBlobUploadPagesResponse) Date() time.Time {\n\ts := pbupr.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (pbupr PageBlobUploadPagesResponse) ErrorCode() string {\n\treturn pbupr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (pbupr PageBlobUploadPagesResponse) ETag() ETag {\n\treturn ETag(pbupr.rawResponse.Header.Get(\"ETag\"))\n}\n\n// IsServerEncrypted returns the value for header x-ms-request-server-encrypted.\nfunc (pbupr PageBlobUploadPagesResponse) IsServerEncrypted() string {\n\treturn pbupr.rawResponse.Header.Get(\"x-ms-request-server-encrypted\")\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (pbupr PageBlobUploadPagesResponse) LastModified() time.Time {\n\ts := pbupr.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (pbupr PageBlobUploadPagesResponse) RequestID() string {\n\treturn pbupr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (pbupr PageBlobUploadPagesResponse) Version() string {\n\treturn pbupr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// PageList - the list of pages\ntype PageList struct {\n\trawResponse *http.Response\n\tPageRange   []PageRange  `xml:\"PageRange\"`\n\tClearRange  []ClearRange `xml:\"ClearRange\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (pl PageList) Response() *http.Response {\n\treturn pl.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (pl PageList) StatusCode() int {\n\treturn pl.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (pl PageList) Status() string {\n\treturn pl.rawResponse.Status\n}\n\n// BlobContentLength returns the value for header x-ms-blob-content-length.\nfunc (pl PageList) BlobContentLength() int64 {\n\ts := pl.rawResponse.Header.Get(\"x-ms-blob-content-length\")\n\tif s == \"\" {\n\t\treturn -1\n\t}\n\ti, err := strconv.ParseInt(s, 10, 64)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn i\n}\n\n// Date returns the value for header Date.\nfunc (pl PageList) Date() time.Time {\n\ts := pl.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (pl PageList) ErrorCode() string {\n\treturn pl.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (pl PageList) ETag() ETag {\n\treturn ETag(pl.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (pl PageList) LastModified() time.Time {\n\ts := pl.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (pl PageList) RequestID() string {\n\treturn pl.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (pl PageList) Version() string {\n\treturn pl.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// PageRange ...\ntype PageRange struct {\n\tStart int64 `xml:\"Start\"`\n\tEnd   int64 `xml:\"End\"`\n}\n\n// RetentionPolicy - the retention policy\ntype RetentionPolicy struct {\n\t// Enabled - Indicates whether a retention policy is enabled for the storage service\n\tEnabled bool `xml:\"Enabled\"`\n\t// Days - Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this value will be deleted\n\tDays *int32 `xml:\"Days\"`\n}\n\n// ServiceSetPropertiesResponse ...\ntype ServiceSetPropertiesResponse struct {\n\trawResponse *http.Response\n}\n\n// Response returns the raw HTTP response object.\nfunc (sspr ServiceSetPropertiesResponse) Response() *http.Response {\n\treturn sspr.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (sspr ServiceSetPropertiesResponse) StatusCode() int {\n\treturn sspr.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (sspr ServiceSetPropertiesResponse) Status() string {\n\treturn sspr.rawResponse.Status\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (sspr ServiceSetPropertiesResponse) ErrorCode() string {\n\treturn sspr.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (sspr ServiceSetPropertiesResponse) RequestID() string {\n\treturn sspr.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (sspr ServiceSetPropertiesResponse) Version() string {\n\treturn sspr.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// SignedIdentifier - signed identifier\ntype SignedIdentifier struct {\n\t// ID - a unique id\n\tID string `xml:\"Id\"`\n\t// AccessPolicy - The access policy\n\tAccessPolicy AccessPolicy `xml:\"AccessPolicy\"`\n}\n\n// SignedIdentifiers ...\ntype SignedIdentifiers struct {\n\trawResponse *http.Response\n\tItems       []SignedIdentifier `xml:\"SignedIdentifier\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (si SignedIdentifiers) Response() *http.Response {\n\treturn si.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (si SignedIdentifiers) StatusCode() int {\n\treturn si.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (si SignedIdentifiers) Status() string {\n\treturn si.rawResponse.Status\n}\n\n// BlobPublicAccess returns the value for header x-ms-blob-public-access.\nfunc (si SignedIdentifiers) BlobPublicAccess() PublicAccessType {\n\treturn PublicAccessType(si.rawResponse.Header.Get(\"x-ms-blob-public-access\"))\n}\n\n// Date returns the value for header Date.\nfunc (si SignedIdentifiers) Date() time.Time {\n\ts := si.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (si SignedIdentifiers) ErrorCode() string {\n\treturn si.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// ETag returns the value for header ETag.\nfunc (si SignedIdentifiers) ETag() ETag {\n\treturn ETag(si.rawResponse.Header.Get(\"ETag\"))\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (si SignedIdentifiers) LastModified() time.Time {\n\ts := si.rawResponse.Header.Get(\"Last-Modified\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (si SignedIdentifiers) RequestID() string {\n\treturn si.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (si SignedIdentifiers) Version() string {\n\treturn si.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// StorageServiceProperties - Storage Service Properties.\ntype StorageServiceProperties struct {\n\trawResponse *http.Response\n\t// Logging - Azure Analytics Logging settings\n\tLogging *Logging `xml:\"Logging\"`\n\t// HourMetrics - A summary of request statistics grouped by API in hourly aggregates for blobs\n\tHourMetrics *Metrics `xml:\"HourMetrics\"`\n\t// MinuteMetrics - a summary of request statistics grouped by API in minute aggregates for blobs\n\tMinuteMetrics *Metrics `xml:\"MinuteMetrics\"`\n\t// Cors - The set of CORS rules.\n\tCors []CorsRule `xml:\"Cors>CorsRule\"`\n\t// DefaultServiceVersion - The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible values include version 2008-10-27 and all more recent versions\n\tDefaultServiceVersion *string `xml:\"DefaultServiceVersion\"`\n\t// DeleteRetentionPolicy - The Delete Retention Policy for the service\n\tDeleteRetentionPolicy *RetentionPolicy `xml:\"DeleteRetentionPolicy\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (ssp StorageServiceProperties) Response() *http.Response {\n\treturn ssp.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (ssp StorageServiceProperties) StatusCode() int {\n\treturn ssp.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (ssp StorageServiceProperties) Status() string {\n\treturn ssp.rawResponse.Status\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (ssp StorageServiceProperties) ErrorCode() string {\n\treturn ssp.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (ssp StorageServiceProperties) RequestID() string {\n\treturn ssp.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (ssp StorageServiceProperties) Version() string {\n\treturn ssp.rawResponse.Header.Get(\"x-ms-version\")\n}\n\n// StorageServiceStats - Stats for the storage service.\ntype StorageServiceStats struct {\n\trawResponse *http.Response\n\t// GeoReplication - Geo-Replication information for the Secondary Storage Service\n\tGeoReplication *GeoReplication `xml:\"GeoReplication\"`\n}\n\n// Response returns the raw HTTP response object.\nfunc (sss StorageServiceStats) Response() *http.Response {\n\treturn sss.rawResponse\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (sss StorageServiceStats) StatusCode() int {\n\treturn sss.rawResponse.StatusCode\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (sss StorageServiceStats) Status() string {\n\treturn sss.rawResponse.Status\n}\n\n// Date returns the value for header Date.\nfunc (sss StorageServiceStats) Date() time.Time {\n\ts := sss.rawResponse.Header.Get(\"Date\")\n\tif s == \"\" {\n\t\treturn time.Time{}\n\t}\n\tt, err := time.Parse(time.RFC1123, s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// ErrorCode returns the value for header x-ms-error-code.\nfunc (sss StorageServiceStats) ErrorCode() string {\n\treturn sss.rawResponse.Header.Get(\"x-ms-error-code\")\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (sss StorageServiceStats) RequestID() string {\n\treturn sss.rawResponse.Header.Get(\"x-ms-request-id\")\n}\n\n// Version returns the value for header x-ms-version.\nfunc (sss StorageServiceStats) Version() string {\n\treturn sss.rawResponse.Header.Get(\"x-ms-version\")\n}\n\nconst (\n\trfc3339Format = \"2006-01-02T15:04:05.0000000Z07:00\"\n)\n\n// used to convert times from UTC to GMT before sending across the wire\nvar gmt = time.FixedZone(\"GMT\", 0)\n\n// internal type used for marshalling time in RFC1123 format\ntype timeRFC1123 struct {\n\ttime.Time\n}\n\n// MarshalText implements the encoding.TextMarshaler interface for timeRFC1123.\nfunc (t timeRFC1123) MarshalText() ([]byte, error) {\n\treturn []byte(t.Format(time.RFC1123)), nil\n}\n\n// UnmarshalText implements the encoding.TextUnmarshaler interface for timeRFC1123.\nfunc (t *timeRFC1123) UnmarshalText(data []byte) (err error) {\n\tt.Time, err = time.Parse(time.RFC1123, string(data))\n\treturn\n}\n\n// internal type used for marshalling time in RFC3339 format\ntype timeRFC3339 struct {\n\ttime.Time\n}\n\n// MarshalText implements the encoding.TextMarshaler interface for timeRFC3339.\nfunc (t timeRFC3339) MarshalText() ([]byte, error) {\n\treturn []byte(t.Format(rfc3339Format)), nil\n}\n\n// UnmarshalText implements the encoding.TextUnmarshaler interface for timeRFC3339.\nfunc (t *timeRFC3339) UnmarshalText(data []byte) (err error) {\n\tt.Time, err = time.Parse(rfc3339Format, string(data))\n\treturn\n}\n\n// internal type used for marshalling\ntype accessPolicy struct {\n\tStart      timeRFC3339 `xml:\"Start\"`\n\tExpiry     timeRFC3339 `xml:\"Expiry\"`\n\tPermission string      `xml:\"Permission\"`\n}\n\n// internal type used for marshalling\ntype blobProperties struct {\n\tLastModified           timeRFC1123       `xml:\"Last-Modified\"`\n\tEtag                   ETag              `xml:\"Etag\"`\n\tContentLength          *int64            `xml:\"Content-Length\"`\n\tContentType            *string           `xml:\"Content-Type\"`\n\tContentEncoding        *string           `xml:\"Content-Encoding\"`\n\tContentLanguage        *string           `xml:\"Content-Language\"`\n\tContentMD5             []byte            `xml:\"Content-MD5\"`\n\tContentDisposition     *string           `xml:\"Content-Disposition\"`\n\tCacheControl           *string           `xml:\"Cache-Control\"`\n\tBlobSequenceNumber     *int64            `xml:\"x-ms-blob-sequence-number\"`\n\tBlobType               BlobType          `xml:\"BlobType\"`\n\tLeaseStatus            LeaseStatusType   `xml:\"LeaseStatus\"`\n\tLeaseState             LeaseStateType    `xml:\"LeaseState\"`\n\tLeaseDuration          LeaseDurationType `xml:\"LeaseDuration\"`\n\tCopyID                 *string           `xml:\"CopyId\"`\n\tCopyStatus             CopyStatusType    `xml:\"CopyStatus\"`\n\tCopySource             *string           `xml:\"CopySource\"`\n\tCopyProgress           *string           `xml:\"CopyProgress\"`\n\tCopyCompletionTime     *timeRFC1123      `xml:\"CopyCompletionTime\"`\n\tCopyStatusDescription  *string           `xml:\"CopyStatusDescription\"`\n\tServerEncrypted        *bool             `xml:\"ServerEncrypted\"`\n\tIncrementalCopy        *bool             `xml:\"IncrementalCopy\"`\n\tDestinationSnapshot    *string           `xml:\"DestinationSnapshot\"`\n\tDeletedTime            *timeRFC1123      `xml:\"DeletedTime\"`\n\tRemainingRetentionDays *int32            `xml:\"RemainingRetentionDays\"`\n\tAccessTier             AccessTierType    `xml:\"AccessTier\"`\n\tAccessTierInferred     *bool             `xml:\"AccessTierInferred\"`\n\tArchiveStatus          ArchiveStatusType `xml:\"ArchiveStatus\"`\n}\n\n// internal type used for marshalling\ntype containerProperties struct {\n\tLastModified  timeRFC1123       `xml:\"Last-Modified\"`\n\tEtag          ETag              `xml:\"Etag\"`\n\tLeaseStatus   LeaseStatusType   `xml:\"LeaseStatus\"`\n\tLeaseState    LeaseStateType    `xml:\"LeaseState\"`\n\tLeaseDuration LeaseDurationType `xml:\"LeaseDuration\"`\n\tPublicAccess  PublicAccessType  `xml:\"PublicAccess\"`\n}\n\n// internal type used for marshalling\ntype geoReplication struct {\n\tStatus       GeoReplicationStatusType `xml:\"Status\"`\n\tLastSyncTime timeRFC1123              `xml:\"LastSyncTime\"`\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_page_blob.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/xml\"\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// pageBlobClient is the client for the PageBlob methods of the Azblob service.\ntype pageBlobClient struct {\n\tmanagementClient\n}\n\n// newPageBlobClient creates an instance of the pageBlobClient client.\nfunc newPageBlobClient(url url.URL, p pipeline.Pipeline) pageBlobClient {\n\treturn pageBlobClient{newManagementClient(url, p)}\n}\n\n// ClearPages the Clear Pages operation clears a set of pages from a page blob\n//\n// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> rangeParameter is return only the bytes of the blob in the specified\n// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID.\n// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number\n// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob\n// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate\n// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only\n// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value\n// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs\n// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is\n// recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client pageBlobClient) ClearPages(ctx context.Context, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobClearPagesResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.clearPagesPreparer(contentLength, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.clearPagesResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageBlobClearPagesResponse), err\n}\n\n// clearPagesPreparer prepares the ClearPages request.\nfunc (client pageBlobClient) clearPagesPreparer(contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"page\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif rangeParameter != nil {\n\t\treq.Header.Set(\"x-ms-range\", *rangeParameter)\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifSequenceNumberLessThanOrEqualTo != nil {\n\t\treq.Header.Set(\"x-ms-if-sequence-number-le\", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10))\n\t}\n\tif ifSequenceNumberLessThan != nil {\n\t\treq.Header.Set(\"x-ms-if-sequence-number-lt\", strconv.FormatInt(*ifSequenceNumberLessThan, 10))\n\t}\n\tif ifSequenceNumberEqualTo != nil {\n\t\treq.Header.Set(\"x-ms-if-sequence-number-eq\", strconv.FormatInt(*ifSequenceNumberEqualTo, 10))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-page-write\", \"clear\")\n\treturn req, nil\n}\n\n// clearPagesResponder handles the response to the ClearPages request.\nfunc (client pageBlobClient) clearPagesResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &PageBlobClearPagesResponse{rawResponse: resp.Response()}, err\n}\n\n// CopyIncremental the Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.\n// The snapshot is copied such that only the differential changes between the previously copied snapshot are\n// transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or\n// copied from as usual. This API is supported since REST version 2016-05-31.\n//\n// copySource is specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that\n// specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob\n// must either be public or must be authenticated via a shared access signature. timeout is the timeout parameter is\n// expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> metadata is optional. Specifies a user-defined name-value pair associated\n// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or\n// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with\n// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version\n// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing\n// Containers, Blobs, and Metadata for more information. ifModifiedSince is specify this header value to operate only\n// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value\n// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs\n// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is\n// recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client pageBlobClient) CopyIncremental(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobCopyIncrementalResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.copyIncrementalPreparer(copySource, timeout, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.copyIncrementalResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageBlobCopyIncrementalResponse), err\n}\n\n// copyIncrementalPreparer prepares the CopyIncremental request.\nfunc (client pageBlobClient) copyIncrementalPreparer(copySource string, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"incrementalcopy\")\n\treq.URL.RawQuery = params.Encode()\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-copy-source\", copySource)\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// copyIncrementalResponder handles the response to the CopyIncremental request.\nfunc (client pageBlobClient) copyIncrementalResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &PageBlobCopyIncrementalResponse{rawResponse: resp.Response()}, err\n}\n\n// Create the Create operation creates a new page blob.\n//\n// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> blobContentType is optional. Sets the blob's content type. If specified,\n// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the\n// blob's content encoding. If specified, this property is stored with the blob and returned with a read request.\n// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the\n// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this\n// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded.\n// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and\n// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the\n// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the\n// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified\n// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19,\n// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and\n// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is\n// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header.\n// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified\n// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified\n// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value.\n// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. blobContentLength is this\n// header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte\n// boundary. blobSequenceNumber is set for page blobs only. The sequence number is a user-controlled value that you can\n// use to track requests. The value of the sequence number must be between 0 and 2^63 - 1. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client pageBlobClient) Create(ctx context.Context, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentLength *int64, blobSequenceNumber *int64, requestID *string) (*PageBlobCreateResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}},\n\t\t{targetValue: metadata,\n\t\t\tconstraints: []constraint{{target: \"metadata\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"metadata\", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.createPreparer(contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobContentLength, blobSequenceNumber, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageBlobCreateResponse), err\n}\n\n// createPreparer prepares the Create request.\nfunc (client pageBlobClient) createPreparer(contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentLength *int64, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif blobContentType != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-type\", *blobContentType)\n\t}\n\tif blobContentEncoding != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-encoding\", *blobContentEncoding)\n\t}\n\tif blobContentLanguage != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-language\", *blobContentLanguage)\n\t}\n\tif blobContentMD5 != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-md5\", base64.StdEncoding.EncodeToString(blobContentMD5))\n\t}\n\tif blobCacheControl != nil {\n\t\treq.Header.Set(\"x-ms-blob-cache-control\", *blobCacheControl)\n\t}\n\tif metadata != nil {\n\t\tfor k, v := range metadata {\n\t\t\treq.Header.Set(\"x-ms-meta-\"+k, v)\n\t\t}\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif blobContentDisposition != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-disposition\", *blobContentDisposition)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\tif blobContentLength != nil {\n\t\treq.Header.Set(\"x-ms-blob-content-length\", strconv.FormatInt(*blobContentLength, 10))\n\t}\n\tif blobSequenceNumber != nil {\n\t\treq.Header.Set(\"x-ms-blob-sequence-number\", strconv.FormatInt(*blobSequenceNumber, 10))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-blob-type\", \"PageBlob\")\n\treturn req, nil\n}\n\n// createResponder handles the response to the Create request.\nfunc (client pageBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &PageBlobCreateResponse{rawResponse: resp.Response()}, err\n}\n\n// GetPageRanges the Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a\n// page blob\n//\n// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to\n// retrieve. For more information on working with blob snapshots, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob\">Creating\n// a Snapshot of a Blob.</a> timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> rangeParameter is return only the bytes of the blob in the specified\n// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID.\n// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified\n// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified\n// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value.\n// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client pageBlobClient) GetPageRanges(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getPageRangesPreparer(snapshot, timeout, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageList), err\n}\n\n// getPageRangesPreparer prepares the GetPageRanges request.\nfunc (client pageBlobClient) getPageRangesPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif snapshot != nil && len(*snapshot) > 0 {\n\t\tparams.Set(\"snapshot\", *snapshot)\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"pagelist\")\n\treq.URL.RawQuery = params.Encode()\n\tif rangeParameter != nil {\n\t\treq.Header.Set(\"x-ms-range\", *rangeParameter)\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getPageRangesResponder handles the response to the GetPageRanges request.\nfunc (client pageBlobClient) getPageRangesResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &PageList{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// GetPageRangesDiff [Update] The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob\n// that were changed between target blob and previous snapshot.\n//\n// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to\n// retrieve. For more information on working with blob snapshots, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/creating-a-snapshot-of-a-blob\">Creating\n// a Snapshot of a Blob.</a> timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> prevsnapshot is optional in version 2015-07-08 and newer. The prevsnapshot\n// parameter is a DateTime value that specifies that the response will contain only pages that were changed between\n// target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a\n// snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots\n// are currently supported only for blobs created on or after January 1, 2016. rangeParameter is return only the bytes\n// of the blob in the specified range. leaseID is if specified, the operation only succeeds if the container's lease is\n// active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it has been\n// modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if\n// it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only on blobs\n// with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value.\n// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics\n// logs when storage analytics logging is enabled.\nfunc (client pageBlobClient) GetPageRangesDiff(ctx context.Context, snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getPageRangesDiffPreparer(snapshot, timeout, prevsnapshot, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesDiffResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageList), err\n}\n\n// getPageRangesDiffPreparer prepares the GetPageRangesDiff request.\nfunc (client pageBlobClient) getPageRangesDiffPreparer(snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif snapshot != nil && len(*snapshot) > 0 {\n\t\tparams.Set(\"snapshot\", *snapshot)\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tif prevsnapshot != nil && len(*prevsnapshot) > 0 {\n\t\tparams.Set(\"prevsnapshot\", *prevsnapshot)\n\t}\n\tparams.Set(\"comp\", \"pagelist\")\n\treq.URL.RawQuery = params.Encode()\n\tif rangeParameter != nil {\n\t\treq.Header.Set(\"x-ms-range\", *rangeParameter)\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getPageRangesDiffResponder handles the response to the GetPageRangesDiff request.\nfunc (client pageBlobClient) getPageRangesDiffResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &PageList{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// Resize resize the Blob\n//\n// blobContentLength is this header specifies the maximum size for the page blob, up to 1 TB. The page blob size must\n// be aligned to a 512-byte boundary. timeout is the timeout parameter is expressed in seconds. For more information,\n// see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it\n// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a\n// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only\n// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching\n// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the\n// analytics logs when storage analytics logging is enabled.\nfunc (client pageBlobClient) Resize(ctx context.Context, blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobResizeResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.resizePreparer(blobContentLength, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.resizeResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageBlobResizeResponse), err\n}\n\n// resizePreparer prepares the Resize request.\nfunc (client pageBlobClient) resizePreparer(blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"properties\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-blob-content-length\", strconv.FormatInt(blobContentLength, 10))\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// resizeResponder handles the response to the Resize request.\nfunc (client pageBlobClient) resizeResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &PageBlobResizeResponse{rawResponse: resp.Response()}, err\n}\n\n// UpdateSequenceNumber update the sequence number of the blob\n//\n// sequenceNumberAction is required if the x-ms-blob-sequence-number header is set for the request. This property\n// applies to page blobs only. This property indicates how the service should modify the blob's sequence number timeout\n// is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> leaseID is if specified, the operation only succeeds if the container's\n// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it\n// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a\n// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only\n// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching\n// value. blobSequenceNumber is set for page blobs only. The sequence number is a user-controlled value that you can\n// use to track requests. The value of the sequence number must be between 0 and 2^63 - 1. requestID is provides a\n// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage\n// analytics logging is enabled.\nfunc (client pageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (*PageBlobUpdateSequenceNumberResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.updateSequenceNumberPreparer(sequenceNumberAction, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobSequenceNumber, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.updateSequenceNumberResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageBlobUpdateSequenceNumberResponse), err\n}\n\n// updateSequenceNumberPreparer prepares the UpdateSequenceNumber request.\nfunc (client pageBlobClient) updateSequenceNumberPreparer(sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"properties\")\n\treq.URL.RawQuery = params.Encode()\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-sequence-number-action\", string(sequenceNumberAction))\n\tif blobSequenceNumber != nil {\n\t\treq.Header.Set(\"x-ms-blob-sequence-number\", strconv.FormatInt(*blobSequenceNumber, 10))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// updateSequenceNumberResponder handles the response to the UpdateSequenceNumber request.\nfunc (client pageBlobClient) updateSequenceNumberResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &PageBlobUpdateSequenceNumberResponse{rawResponse: resp.Response()}, err\n}\n\n// UploadPages the Upload Pages operation writes a range of pages to a page blob\n//\n// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an\n// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more\n// information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> rangeParameter is return only the bytes of the blob in the specified\n// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID.\n// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number\n// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob\n// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate\n// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only\n// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to\n// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value\n// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs\n// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is\n// recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client pageBlobClient) UploadPages(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobUploadPagesResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: body,\n\t\t\tconstraints: []constraint{{target: \"body\", name: null, rule: true, chain: nil}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.uploadPagesPreparer(body, contentLength, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.uploadPagesResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*PageBlobUploadPagesResponse), err\n}\n\n// uploadPagesPreparer prepares the UploadPages request.\nfunc (client pageBlobClient) uploadPagesPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, body)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"page\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"Content-Length\", strconv.FormatInt(contentLength, 10))\n\tif rangeParameter != nil {\n\t\treq.Header.Set(\"x-ms-range\", *rangeParameter)\n\t}\n\tif leaseID != nil {\n\t\treq.Header.Set(\"x-ms-lease-id\", *leaseID)\n\t}\n\tif ifSequenceNumberLessThanOrEqualTo != nil {\n\t\treq.Header.Set(\"x-ms-if-sequence-number-le\", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10))\n\t}\n\tif ifSequenceNumberLessThan != nil {\n\t\treq.Header.Set(\"x-ms-if-sequence-number-lt\", strconv.FormatInt(*ifSequenceNumberLessThan, 10))\n\t}\n\tif ifSequenceNumberEqualTo != nil {\n\t\treq.Header.Set(\"x-ms-if-sequence-number-eq\", strconv.FormatInt(*ifSequenceNumberEqualTo, 10))\n\t}\n\tif ifModifiedSince != nil {\n\t\treq.Header.Set(\"If-Modified-Since\", (*ifModifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifUnmodifiedSince != nil {\n\t\treq.Header.Set(\"If-Unmodified-Since\", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123))\n\t}\n\tif ifMatches != nil {\n\t\treq.Header.Set(\"If-Match\", string(*ifMatches))\n\t}\n\tif ifNoneMatch != nil {\n\t\treq.Header.Set(\"If-None-Match\", string(*ifNoneMatch))\n\t}\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treq.Header.Set(\"x-ms-page-write\", \"update\")\n\treturn req, nil\n}\n\n// uploadPagesResponder handles the response to the UploadPages request.\nfunc (client pageBlobClient) uploadPagesResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusCreated)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &PageBlobUploadPagesResponse{rawResponse: resp.Response()}, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/xml\"\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"io/ioutil\"\n)\n\ntype responder func(resp pipeline.Response) (result pipeline.Response, err error)\n\n// ResponderPolicyFactory is a Factory capable of creating a responder pipeline.\ntype responderPolicyFactory struct {\n\tresponder responder\n}\n\n// New creates a responder policy factory.\nfunc (arpf responderPolicyFactory) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {\n\treturn responderPolicy{next: next, responder: arpf.responder}\n}\n\ntype responderPolicy struct {\n\tnext      pipeline.Policy\n\tresponder responder\n}\n\n// Do sends the request to the service and validates/deserializes the HTTP response.\nfunc (arp responderPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {\n\tresp, err := arp.next.Do(ctx, request)\n\tif err != nil {\n\t\treturn resp, err\n\t}\n\treturn arp.responder(resp)\n}\n\n// validateResponse checks an HTTP response's status code against a legal set of codes.\n// If the response code is not legal, then validateResponse reads all of the response's body\n// (containing error information) and returns a response error.\nfunc validateResponse(resp pipeline.Response, successStatusCodes ...int) error {\n\tif resp == nil {\n\t\treturn NewResponseError(nil, nil, \"nil response\")\n\t}\n\tresponseCode := resp.Response().StatusCode\n\tfor _, i := range successStatusCodes {\n\t\tif i == responseCode {\n\t\t\treturn nil\n\t\t}\n\t}\n\t// only close the body in the failure case. in the\n\t// success case responders will close the body as required.\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\t// the service code, description and details will be populated during unmarshalling\n\tresponseError := NewResponseError(nil, resp.Response(), resp.Response().Status)\n\tif len(b) > 0 {\n\t\tif err = xml.Unmarshal(b, &responseError); err != nil {\n\t\t\treturn NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn responseError\n}\n\n// removes any BOM from the byte slice\nfunc removeBOM(b []byte) []byte {\n\t// UTF8\n\treturn bytes.TrimPrefix(b, []byte(\"\\xef\\xbb\\xbf\"))\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_response_error.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"net\"\n\t\"net/http\"\n)\n\n// if you want to provide custom error handling set this variable to your constructor function\nvar responseErrorFactory func(cause error, response *http.Response, description string) error\n\n// ResponseError identifies a responder-generated network or response parsing error.\ntype ResponseError interface {\n\t// Error exposes the Error(), Temporary() and Timeout() methods.\n\tnet.Error // Includes the Go error interface\n\t// Response returns the HTTP response. You may examine this but you should not modify it.\n\tResponse() *http.Response\n}\n\n// NewResponseError creates an error object that implements the error interface.\nfunc NewResponseError(cause error, response *http.Response, description string) error {\n\tif responseErrorFactory != nil {\n\t\treturn responseErrorFactory(cause, response, description)\n\t}\n\treturn &responseError{\n\t\tErrorNode:   pipeline.ErrorNode{}.Initialize(cause, 3),\n\t\tresponse:    response,\n\t\tdescription: description,\n\t}\n}\n\n// responseError is the internal struct that implements the public ResponseError interface.\ntype responseError struct {\n\tpipeline.ErrorNode // This is embedded so that responseError \"inherits\" Error, Temporary, Timeout, and Cause\n\tresponse           *http.Response\n\tdescription        string\n}\n\n// Error implements the error interface's Error method to return a string representation of the error.\nfunc (e *responseError) Error() string {\n\tb := &bytes.Buffer{}\n\tfmt.Fprintf(b, \"===== RESPONSE ERROR (Code=%v) =====\\n\", e.response.StatusCode)\n\tfmt.Fprintf(b, \"Status=%s, Description: %s\\n\", e.response.Status, e.description)\n\ts := b.String()\n\treturn e.ErrorNode.Error(s)\n}\n\n// Response implements the ResponseError interface's method to return the HTTP response.\nfunc (e *responseError) Response() *http.Response {\n\treturn e.response\n}\n\n// RFC7807 PROBLEM ------------------------------------------------------------------------------------\n// RFC7807Problem ... This type can be publicly embedded in another type that wants to add additional members.\n/*type RFC7807Problem struct {\n\t// Mandatory: A (relative) URI reference identifying the problem type (it MAY refer to human-readable documentation).\n\ttypeURI string // Should default to \"about:blank\"\n\t// Optional: Short, human-readable summary (maybe localized).\n\ttitle string\n\t// Optional: HTTP status code generated by the origin server\n\tstatus int\n\t// Optional: Human-readable explanation for this problem occurance.\n\t// Should help client correct the problem. Clients should NOT parse this string.\n\tdetail string\n\t// Optional: A (relative) URI identifying this specific problem occurence (it may or may not be dereferenced).\n\tinstance string\n}\n// NewRFC7807Problem ...\nfunc NewRFC7807Problem(typeURI string, status int, titleFormat string, a ...interface{}) error {\n\treturn &RFC7807Problem{\n\t\ttypeURI: typeURI,\n\t\tstatus:  status,\n\t\ttitle:   fmt.Sprintf(titleFormat, a...),\n\t}\n}\n// Error returns the error information as a string.\nfunc (e *RFC7807Problem) Error() string {\n\treturn e.title\n}\n// TypeURI ...\nfunc (e *RFC7807Problem) TypeURI() string {\n\tif e.typeURI == \"\" {\n\t\te.typeURI = \"about:blank\"\n\t}\n\treturn e.typeURI\n}\n// Members ...\nfunc (e *RFC7807Problem) Members() (status int, title, detail, instance string) {\n\treturn e.status, e.title, e.detail, e.instance\n}*/\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_service.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/xml\"\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n)\n\n// serviceClient is the client for the Service methods of the Azblob service.\ntype serviceClient struct {\n\tmanagementClient\n}\n\n// newServiceClient creates an instance of the serviceClient client.\nfunc newServiceClient(url url.URL, p pipeline.Pipeline) serviceClient {\n\treturn serviceClient{newManagementClient(url, p)}\n}\n\n// GetProperties gets the properties of a storage account's Blob service, including properties for Storage Analytics\n// and CORS (Cross-Origin Resource Sharing) rules.\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client serviceClient) GetProperties(ctx context.Context, timeout *int32, requestID *string) (*StorageServiceProperties, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getPropertiesPreparer(timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPropertiesResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*StorageServiceProperties), err\n}\n\n// getPropertiesPreparer prepares the GetProperties request.\nfunc (client serviceClient) getPropertiesPreparer(timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"service\")\n\tparams.Set(\"comp\", \"properties\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getPropertiesResponder handles the response to the GetProperties request.\nfunc (client serviceClient) getPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &StorageServiceProperties{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// GetStatistics retrieves statistics related to replication for the Blob service. It is only available on the\n// secondary location endpoint when read-access geo-redundant replication is enabled for the storage account.\n//\n// timeout is the timeout parameter is expressed in seconds. For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client serviceClient) GetStatistics(ctx context.Context, timeout *int32, requestID *string) (*StorageServiceStats, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.getStatisticsPreparer(timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getStatisticsResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*StorageServiceStats), err\n}\n\n// getStatisticsPreparer prepares the GetStatistics request.\nfunc (client serviceClient) getStatisticsPreparer(timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"service\")\n\tparams.Set(\"comp\", \"stats\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// getStatisticsResponder handles the response to the GetStatistics request.\nfunc (client serviceClient) getStatisticsResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &StorageServiceStats{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// ListContainersSegment the List Containers Segment operation returns a list of the containers under the specified\n// account\n//\n// prefix is filters the results to return only containers whose name begins with the specified prefix. marker is a\n// string value that identifies the portion of the list of containers to be returned with the next listing operation.\n// The operation returns the NextMarker value within the response body if the listing operation did not return all\n// containers remaining to be listed with the current page. The NextMarker value can be used as the value for the\n// marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the\n// client. maxresults is specifies the maximum number of containers to return. If the request does not specify\n// maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the\n// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the\n// remainder of the results. For this reason, it is possible that the service will return fewer results than specified\n// by maxresults, or than the default of 5000. include is include this parameter to specify that the container's\n// metadata be returned as part of the response body. timeout is the timeout parameter is expressed in seconds. For\n// more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client serviceClient) ListContainersSegment(ctx context.Context, prefix *string, marker *string, maxresults *int32, include ListContainersIncludeType, timeout *int32, requestID *string) (*ListContainersResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: maxresults,\n\t\t\tconstraints: []constraint{{target: \"maxresults\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"maxresults\", name: inclusiveMinimum, rule: 1, chain: nil}}}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.listContainersSegmentPreparer(prefix, marker, maxresults, include, timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.listContainersSegmentResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ListContainersResponse), err\n}\n\n// listContainersSegmentPreparer prepares the ListContainersSegment request.\nfunc (client serviceClient) listContainersSegmentPreparer(prefix *string, marker *string, maxresults *int32, include ListContainersIncludeType, timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"GET\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif prefix != nil && len(*prefix) > 0 {\n\t\tparams.Set(\"prefix\", *prefix)\n\t}\n\tif marker != nil && len(*marker) > 0 {\n\t\tparams.Set(\"marker\", *marker)\n\t}\n\tif maxresults != nil {\n\t\tparams.Set(\"maxresults\", strconv.FormatInt(int64(*maxresults), 10))\n\t}\n\tif include != ListContainersIncludeNone {\n\t\tparams.Set(\"include\", string(include))\n\t}\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"comp\", \"list\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\treturn req, nil\n}\n\n// listContainersSegmentResponder handles the response to the ListContainersSegment request.\nfunc (client serviceClient) listContainersSegmentResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tresult := &ListContainersResponse{rawResponse: resp.Response()}\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tdefer resp.Response().Body.Close()\n\tb, err := ioutil.ReadAll(resp.Response().Body)\n\tif err != nil {\n\t\treturn result, NewResponseError(err, resp.Response(), \"failed to read response body\")\n\t}\n\tif len(b) > 0 {\n\t\tb = removeBOM(b)\n\t\terr = xml.Unmarshal(b, result)\n\t\tif err != nil {\n\t\t\treturn result, NewResponseError(err, resp.Response(), \"failed to unmarshal response body\")\n\t\t}\n\t}\n\treturn result, nil\n}\n\n// SetProperties sets properties for a storage account's Blob service endpoint, including properties for Storage\n// Analytics and CORS (Cross-Origin Resource Sharing) rules\n//\n// storageServiceProperties is the StorageService properties. timeout is the timeout parameter is expressed in seconds.\n// For more information, see <a\n// href=\"https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/setting-timeouts-for-blob-service-operations\">Setting\n// Timeouts for Blob Service Operations.</a> requestID is provides a client-generated, opaque value with a 1 KB\n// character limit that is recorded in the analytics logs when storage analytics logging is enabled.\nfunc (client serviceClient) SetProperties(ctx context.Context, storageServiceProperties StorageServiceProperties, timeout *int32, requestID *string) (*ServiceSetPropertiesResponse, error) {\n\tif err := validate([]validation{\n\t\t{targetValue: storageServiceProperties,\n\t\t\tconstraints: []constraint{{target: \"storageServiceProperties.Logging\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.Logging.RetentionPolicy\", name: null, rule: true,\n\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.Logging.RetentionPolicy.Days\", name: null, rule: false,\n\t\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.Logging.RetentionPolicy.Days\", name: inclusiveMinimum, rule: 1, chain: nil}}},\n\t\t\t\t\t}},\n\t\t\t\t}},\n\t\t\t\t{target: \"storageServiceProperties.HourMetrics\", name: null, rule: false,\n\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.HourMetrics.RetentionPolicy\", name: null, rule: false,\n\t\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.HourMetrics.RetentionPolicy.Days\", name: null, rule: false,\n\t\t\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.HourMetrics.RetentionPolicy.Days\", name: inclusiveMinimum, rule: 1, chain: nil}}},\n\t\t\t\t\t\t}},\n\t\t\t\t\t}},\n\t\t\t\t{target: \"storageServiceProperties.MinuteMetrics\", name: null, rule: false,\n\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.MinuteMetrics.RetentionPolicy\", name: null, rule: false,\n\t\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.MinuteMetrics.RetentionPolicy.Days\", name: null, rule: false,\n\t\t\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.MinuteMetrics.RetentionPolicy.Days\", name: inclusiveMinimum, rule: 1, chain: nil}}},\n\t\t\t\t\t\t}},\n\t\t\t\t\t}},\n\t\t\t\t{target: \"storageServiceProperties.DeleteRetentionPolicy\", name: null, rule: false,\n\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.DeleteRetentionPolicy.Days\", name: null, rule: false,\n\t\t\t\t\t\tchain: []constraint{{target: \"storageServiceProperties.DeleteRetentionPolicy.Days\", name: inclusiveMinimum, rule: 1, chain: nil}}},\n\t\t\t\t\t}}}},\n\t\t{targetValue: timeout,\n\t\t\tconstraints: []constraint{{target: \"timeout\", name: null, rule: false,\n\t\t\t\tchain: []constraint{{target: \"timeout\", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil {\n\t\treturn nil, err\n\t}\n\treq, err := client.setPropertiesPreparer(storageServiceProperties, timeout, requestID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tresp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setPropertiesResponder}, req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn resp.(*ServiceSetPropertiesResponse), err\n}\n\n// setPropertiesPreparer prepares the SetProperties request.\nfunc (client serviceClient) setPropertiesPreparer(storageServiceProperties StorageServiceProperties, timeout *int32, requestID *string) (pipeline.Request, error) {\n\treq, err := pipeline.NewRequest(\"PUT\", client.url, nil)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to create request\")\n\t}\n\tparams := req.URL.Query()\n\tif timeout != nil {\n\t\tparams.Set(\"timeout\", strconv.FormatInt(int64(*timeout), 10))\n\t}\n\tparams.Set(\"restype\", \"service\")\n\tparams.Set(\"comp\", \"properties\")\n\treq.URL.RawQuery = params.Encode()\n\treq.Header.Set(\"x-ms-version\", ServiceVersion)\n\tif requestID != nil {\n\t\treq.Header.Set(\"x-ms-client-request-id\", *requestID)\n\t}\n\tb, err := xml.Marshal(storageServiceProperties)\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to marshal request body\")\n\t}\n\treq.Header.Set(\"Content-Type\", \"application/xml\")\n\terr = req.SetBody(bytes.NewReader(b))\n\tif err != nil {\n\t\treturn req, pipeline.NewError(err, \"failed to set request body\")\n\t}\n\treturn req, nil\n}\n\n// setPropertiesResponder handles the response to the SetProperties request.\nfunc (client serviceClient) setPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) {\n\terr := validateResponse(resp, http.StatusOK, http.StatusAccepted)\n\tif resp == nil {\n\t\treturn nil, err\n\t}\n\tio.Copy(ioutil.Discard, resp.Response().Body)\n\tresp.Response().Body.Close()\n\treturn &ServiceSetPropertiesResponse{rawResponse: resp.Response()}, err\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_validation.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\nimport (\n\t\"fmt\"\n\t\"github.com/Azure/azure-pipeline-go/pipeline\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strings\"\n)\n\n// Constraint stores constraint name, target field name\n// Rule and chain validations.\ntype constraint struct {\n\t// Target field name for validation.\n\ttarget string\n\n\t// Constraint name e.g. minLength, MaxLength, Pattern, etc.\n\tname string\n\n\t// Rule for constraint e.g. greater than 10, less than 5 etc.\n\trule interface{}\n\n\t// Chain validations for struct type\n\tchain []constraint\n}\n\n// Validation stores parameter-wise validation.\ntype validation struct {\n\ttargetValue interface{}\n\tconstraints []constraint\n}\n\n// Constraint list\nconst (\n\tempty            = \"Empty\"\n\tnull             = \"Null\"\n\treadOnly         = \"ReadOnly\"\n\tpattern          = \"Pattern\"\n\tmaxLength        = \"MaxLength\"\n\tminLength        = \"MinLength\"\n\tmaxItems         = \"MaxItems\"\n\tminItems         = \"MinItems\"\n\tmultipleOf       = \"MultipleOf\"\n\tuniqueItems      = \"UniqueItems\"\n\tinclusiveMaximum = \"InclusiveMaximum\"\n\texclusiveMaximum = \"ExclusiveMaximum\"\n\texclusiveMinimum = \"ExclusiveMinimum\"\n\tinclusiveMinimum = \"InclusiveMinimum\"\n)\n\n// Validate method validates constraints on parameter\n// passed in validation array.\nfunc validate(m []validation) error {\n\tfor _, item := range m {\n\t\tv := reflect.ValueOf(item.targetValue)\n\t\tfor _, constraint := range item.constraints {\n\t\t\tvar err error\n\t\t\tswitch v.Kind() {\n\t\t\tcase reflect.Ptr:\n\t\t\t\terr = validatePtr(v, constraint)\n\t\t\tcase reflect.String:\n\t\t\t\terr = validateString(v, constraint)\n\t\t\tcase reflect.Struct:\n\t\t\t\terr = validateStruct(v, constraint)\n\t\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\t\terr = validateInt(v, constraint)\n\t\t\tcase reflect.Float32, reflect.Float64:\n\t\t\t\terr = validateFloat(v, constraint)\n\t\t\tcase reflect.Array, reflect.Slice, reflect.Map:\n\t\t\t\terr = validateArrayMap(v, constraint)\n\t\t\tdefault:\n\t\t\t\terr = createError(v, constraint, fmt.Sprintf(\"unknown type %v\", v.Kind()))\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc validateStruct(x reflect.Value, v constraint, name ...string) error {\n\t//Get field name from target name which is in format a.b.c\n\ts := strings.Split(v.target, \".\")\n\tf := x.FieldByName(s[len(s)-1])\n\tif isZero(f) {\n\t\treturn createError(x, v, fmt.Sprintf(\"field %q doesn't exist\", v.target))\n\t}\n\terr := validate([]validation{\n\t\t{\n\t\t\ttargetValue: getInterfaceValue(f),\n\t\t\tconstraints: []constraint{v},\n\t\t},\n\t})\n\treturn err\n}\n\nfunc validatePtr(x reflect.Value, v constraint) error {\n\tif v.name == readOnly {\n\t\tif !x.IsNil() {\n\t\t\treturn createError(x.Elem(), v, \"readonly parameter; must send as nil or empty in request\")\n\t\t}\n\t\treturn nil\n\t}\n\tif x.IsNil() {\n\t\treturn checkNil(x, v)\n\t}\n\tif v.chain != nil {\n\t\treturn validate([]validation{\n\t\t\t{\n\t\t\t\ttargetValue: getInterfaceValue(x.Elem()),\n\t\t\t\tconstraints: v.chain,\n\t\t\t},\n\t\t})\n\t}\n\treturn nil\n}\n\nfunc validateInt(x reflect.Value, v constraint) error {\n\ti := x.Int()\n\tr, ok := v.rule.(int)\n\tif !ok {\n\t\treturn createError(x, v, fmt.Sprintf(\"rule must be integer value for %v constraint; got: %v\", v.name, v.rule))\n\t}\n\tswitch v.name {\n\tcase multipleOf:\n\t\tif i%int64(r) != 0 {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be a multiple of %v\", r))\n\t\t}\n\tcase exclusiveMinimum:\n\t\tif i <= int64(r) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be greater than %v\", r))\n\t\t}\n\tcase exclusiveMaximum:\n\t\tif i >= int64(r) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be less than %v\", r))\n\t\t}\n\tcase inclusiveMinimum:\n\t\tif i < int64(r) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be greater than or equal to %v\", r))\n\t\t}\n\tcase inclusiveMaximum:\n\t\tif i > int64(r) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be less than or equal to %v\", r))\n\t\t}\n\tdefault:\n\t\treturn createError(x, v, fmt.Sprintf(\"constraint %v is not applicable for type integer\", v.name))\n\t}\n\treturn nil\n}\n\nfunc validateFloat(x reflect.Value, v constraint) error {\n\tf := x.Float()\n\tr, ok := v.rule.(float64)\n\tif !ok {\n\t\treturn createError(x, v, fmt.Sprintf(\"rule must be float value for %v constraint; got: %v\", v.name, v.rule))\n\t}\n\tswitch v.name {\n\tcase exclusiveMinimum:\n\t\tif f <= r {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be greater than %v\", r))\n\t\t}\n\tcase exclusiveMaximum:\n\t\tif f >= r {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be less than %v\", r))\n\t\t}\n\tcase inclusiveMinimum:\n\t\tif f < r {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be greater than or equal to %v\", r))\n\t\t}\n\tcase inclusiveMaximum:\n\t\tif f > r {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value must be less than or equal to %v\", r))\n\t\t}\n\tdefault:\n\t\treturn createError(x, v, fmt.Sprintf(\"constraint %s is not applicable for type float\", v.name))\n\t}\n\treturn nil\n}\n\nfunc validateString(x reflect.Value, v constraint) error {\n\ts := x.String()\n\tswitch v.name {\n\tcase empty:\n\t\tif len(s) == 0 {\n\t\t\treturn checkEmpty(x, v)\n\t\t}\n\tcase pattern:\n\t\treg, err := regexp.Compile(v.rule.(string))\n\t\tif err != nil {\n\t\t\treturn createError(x, v, err.Error())\n\t\t}\n\t\tif !reg.MatchString(s) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value doesn't match pattern %v\", v.rule))\n\t\t}\n\tcase maxLength:\n\t\tif _, ok := v.rule.(int); !ok {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"rule must be integer value for %v constraint; got: %v\", v.name, v.rule))\n\t\t}\n\t\tif len(s) > v.rule.(int) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value length must be less than %v\", v.rule))\n\t\t}\n\tcase minLength:\n\t\tif _, ok := v.rule.(int); !ok {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"rule must be integer value for %v constraint; got: %v\", v.name, v.rule))\n\t\t}\n\t\tif len(s) < v.rule.(int) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"value length must be greater than %v\", v.rule))\n\t\t}\n\tcase readOnly:\n\t\tif len(s) > 0 {\n\t\t\treturn createError(reflect.ValueOf(s), v, \"readonly parameter; must send as nil or empty in request\")\n\t\t}\n\tdefault:\n\t\treturn createError(x, v, fmt.Sprintf(\"constraint %s is not applicable to string type\", v.name))\n\t}\n\tif v.chain != nil {\n\t\treturn validate([]validation{\n\t\t\t{\n\t\t\t\ttargetValue: getInterfaceValue(x),\n\t\t\t\tconstraints: v.chain,\n\t\t\t},\n\t\t})\n\t}\n\treturn nil\n}\n\nfunc validateArrayMap(x reflect.Value, v constraint) error {\n\tswitch v.name {\n\tcase null:\n\t\tif x.IsNil() {\n\t\t\treturn checkNil(x, v)\n\t\t}\n\tcase empty:\n\t\tif x.IsNil() || x.Len() == 0 {\n\t\t\treturn checkEmpty(x, v)\n\t\t}\n\tcase maxItems:\n\t\tif _, ok := v.rule.(int); !ok {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"rule must be integer for %v constraint; got: %v\", v.name, v.rule))\n\t\t}\n\t\tif x.Len() > v.rule.(int) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"maximum item limit is %v; got: %v\", v.rule, x.Len()))\n\t\t}\n\tcase minItems:\n\t\tif _, ok := v.rule.(int); !ok {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"rule must be integer for %v constraint; got: %v\", v.name, v.rule))\n\t\t}\n\t\tif x.Len() < v.rule.(int) {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"minimum item limit is %v; got: %v\", v.rule, x.Len()))\n\t\t}\n\tcase uniqueItems:\n\t\tif x.Kind() == reflect.Array || x.Kind() == reflect.Slice {\n\t\t\tif !checkForUniqueInArray(x) {\n\t\t\t\treturn createError(x, v, fmt.Sprintf(\"all items in parameter %q must be unique; got:%v\", v.target, x))\n\t\t\t}\n\t\t} else if x.Kind() == reflect.Map {\n\t\t\tif !checkForUniqueInMap(x) {\n\t\t\t\treturn createError(x, v, fmt.Sprintf(\"all items in parameter %q must be unique; got:%v\", v.target, x))\n\t\t\t}\n\t\t} else {\n\t\t\treturn createError(x, v, fmt.Sprintf(\"type must be array, slice or map for constraint %v; got: %v\", v.name, x.Kind()))\n\t\t}\n\tcase readOnly:\n\t\tif x.Len() != 0 {\n\t\t\treturn createError(x, v, \"readonly parameter; must send as nil or empty in request\")\n\t\t}\n\tcase pattern:\n\t\treg, err := regexp.Compile(v.rule.(string))\n\t\tif err != nil {\n\t\t\treturn createError(x, v, err.Error())\n\t\t}\n\t\tkeys := x.MapKeys()\n\t\tfor _, k := range keys {\n\t\t\tif !reg.MatchString(k.String()) {\n\t\t\t\treturn createError(k, v, fmt.Sprintf(\"map key doesn't match pattern %v\", v.rule))\n\t\t\t}\n\t\t}\n\tdefault:\n\t\treturn createError(x, v, fmt.Sprintf(\"constraint %v is not applicable to array, slice and map type\", v.name))\n\t}\n\tif v.chain != nil {\n\t\treturn validate([]validation{\n\t\t\t{\n\t\t\t\ttargetValue: getInterfaceValue(x),\n\t\t\t\tconstraints: v.chain,\n\t\t\t},\n\t\t})\n\t}\n\treturn nil\n}\n\nfunc checkNil(x reflect.Value, v constraint) error {\n\tif _, ok := v.rule.(bool); !ok {\n\t\treturn createError(x, v, fmt.Sprintf(\"rule must be bool value for %v constraint; got: %v\", v.name, v.rule))\n\t}\n\tif v.rule.(bool) {\n\t\treturn createError(x, v, \"value can not be null; required parameter\")\n\t}\n\treturn nil\n}\n\nfunc checkEmpty(x reflect.Value, v constraint) error {\n\tif _, ok := v.rule.(bool); !ok {\n\t\treturn createError(x, v, fmt.Sprintf(\"rule must be bool value for %v constraint; got: %v\", v.name, v.rule))\n\t}\n\tif v.rule.(bool) {\n\t\treturn createError(x, v, \"value can not be null or empty; required parameter\")\n\t}\n\treturn nil\n}\n\nfunc checkForUniqueInArray(x reflect.Value) bool {\n\tif x == reflect.Zero(reflect.TypeOf(x)) || x.Len() == 0 {\n\t\treturn false\n\t}\n\tarrOfInterface := make([]interface{}, x.Len())\n\tfor i := 0; i < x.Len(); i++ {\n\t\tarrOfInterface[i] = x.Index(i).Interface()\n\t}\n\tm := make(map[interface{}]bool)\n\tfor _, val := range arrOfInterface {\n\t\tif m[val] {\n\t\t\treturn false\n\t\t}\n\t\tm[val] = true\n\t}\n\treturn true\n}\n\nfunc checkForUniqueInMap(x reflect.Value) bool {\n\tif x == reflect.Zero(reflect.TypeOf(x)) || x.Len() == 0 {\n\t\treturn false\n\t}\n\tmapOfInterface := make(map[interface{}]interface{}, x.Len())\n\tkeys := x.MapKeys()\n\tfor _, k := range keys {\n\t\tmapOfInterface[k.Interface()] = x.MapIndex(k).Interface()\n\t}\n\tm := make(map[interface{}]bool)\n\tfor _, val := range mapOfInterface {\n\t\tif m[val] {\n\t\t\treturn false\n\t\t}\n\t\tm[val] = true\n\t}\n\treturn true\n}\n\nfunc getInterfaceValue(x reflect.Value) interface{} {\n\tif x.Kind() == reflect.Invalid {\n\t\treturn nil\n\t}\n\treturn x.Interface()\n}\n\nfunc isZero(x interface{}) bool {\n\treturn x == reflect.Zero(reflect.TypeOf(x)).Interface()\n}\n\nfunc createError(x reflect.Value, v constraint, message string) error {\n\treturn pipeline.NewError(nil, fmt.Sprintf(\"validation failed: parameter=%s constraint=%s value=%#v details: %s\",\n\t\tv.target, v.name, getInterfaceValue(x), message))\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_version.go",
    "content": "package azblob\n\n// Code generated by Microsoft (R) AutoRest Code Generator.\n// Changes may cause incorrect behavior and will be lost if the code is regenerated.\n\n// UserAgent returns the UserAgent string to use when sending http.Requests.\nfunc UserAgent() string {\n\treturn \"Azure-SDK-For-Go/0.0.0 azblob/2018-03-28\"\n}\n\n// Version returns the semantic version (see http://semver.org) of the client.\nfunc Version() string {\n\treturn \"0.0.0\"\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_response_helpers.go",
    "content": "package azblob\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"net/http\"\n\t\"time\"\n)\n\n// BlobHTTPHeaders contains read/writeable blob properties.\ntype BlobHTTPHeaders struct {\n\tContentType        string\n\tContentMD5         []byte\n\tContentEncoding    string\n\tContentLanguage    string\n\tContentDisposition string\n\tCacheControl       string\n}\n\n// NewHTTPHeaders returns the user-modifiable properties for this blob.\nfunc (bgpr BlobGetPropertiesResponse) NewHTTPHeaders() BlobHTTPHeaders {\n\treturn BlobHTTPHeaders{\n\t\tContentType:        bgpr.ContentType(),\n\t\tContentEncoding:    bgpr.ContentEncoding(),\n\t\tContentLanguage:    bgpr.ContentLanguage(),\n\t\tContentDisposition: bgpr.ContentDisposition(),\n\t\tCacheControl:       bgpr.CacheControl(),\n\t\tContentMD5:         bgpr.ContentMD5(),\n\t}\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// NewHTTPHeaders returns the user-modifiable properties for this blob.\nfunc (dr downloadResponse) NewHTTPHeaders() BlobHTTPHeaders {\n\treturn BlobHTTPHeaders{\n\t\tContentType:        dr.ContentType(),\n\t\tContentEncoding:    dr.ContentEncoding(),\n\t\tContentLanguage:    dr.ContentLanguage(),\n\t\tContentDisposition: dr.ContentDisposition(),\n\t\tCacheControl:       dr.CacheControl(),\n\t\tContentMD5:         dr.ContentMD5(),\n\t}\n}\n\n///////////////////////////////////////////////////////////////////////////////\n\n// DownloadResponse wraps AutoRest generated downloadResponse and helps to provide info for retry.\ntype DownloadResponse struct {\n\tr       *downloadResponse\n\tctx     context.Context\n\tb       BlobURL\n\tgetInfo HTTPGetterInfo\n}\n\n// Body constructs new RetryReader stream for reading data. If a connection failes\n// while reading, it will make additional requests to reestablish a connection and\n// continue reading. Specifying a RetryReaderOption's with MaxRetryRequests set to 0\n// (the default), returns the original response body and no retries will be performed.\nfunc (r *DownloadResponse) Body(o RetryReaderOptions) io.ReadCloser {\n\tif o.MaxRetryRequests == 0 { // No additional retries\n\t\treturn r.Response().Body\n\t}\n\treturn NewRetryReader(r.ctx, r.Response(), r.getInfo, o,\n\t\tfunc(ctx context.Context, getInfo HTTPGetterInfo) (*http.Response, error) {\n\t\t\tresp, err := r.b.Download(ctx, getInfo.Offset, getInfo.Count,\n\t\t\t\tBlobAccessConditions{\n\t\t\t\t\tHTTPAccessConditions: HTTPAccessConditions{IfMatch: getInfo.ETag},\n\t\t\t\t},\n\t\t\t\tfalse)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn resp.Response(), err\n\t\t},\n\t)\n}\n\n// Response returns the raw HTTP response object.\nfunc (r DownloadResponse) Response() *http.Response {\n\treturn r.r.Response()\n}\n\n// NewHTTPHeaders returns the user-modifiable properties for this blob.\nfunc (r DownloadResponse) NewHTTPHeaders() BlobHTTPHeaders {\n\treturn r.r.NewHTTPHeaders()\n}\n\n// BlobContentMD5 returns the value for header x-ms-blob-content-md5.\nfunc (r DownloadResponse) BlobContentMD5() []byte {\n\treturn r.r.BlobContentMD5()\n}\n\n// ContentMD5 returns the value for header Content-MD5.\nfunc (r DownloadResponse) ContentMD5() []byte {\n\treturn r.r.ContentMD5()\n}\n\n// StatusCode returns the HTTP status code of the response, e.g. 200.\nfunc (r DownloadResponse) StatusCode() int {\n\treturn r.r.StatusCode()\n}\n\n// Status returns the HTTP status message of the response, e.g. \"200 OK\".\nfunc (r DownloadResponse) Status() string {\n\treturn r.r.Status()\n}\n\n// AcceptRanges returns the value for header Accept-Ranges.\nfunc (r DownloadResponse) AcceptRanges() string {\n\treturn r.r.AcceptRanges()\n}\n\n// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count.\nfunc (r DownloadResponse) BlobCommittedBlockCount() int32 {\n\treturn r.r.BlobCommittedBlockCount()\n}\n\n// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number.\nfunc (r DownloadResponse) BlobSequenceNumber() int64 {\n\treturn r.r.BlobSequenceNumber()\n}\n\n// BlobType returns the value for header x-ms-blob-type.\nfunc (r DownloadResponse) BlobType() BlobType {\n\treturn r.r.BlobType()\n}\n\n// CacheControl returns the value for header Cache-Control.\nfunc (r DownloadResponse) CacheControl() string {\n\treturn r.r.CacheControl()\n}\n\n// ContentDisposition returns the value for header Content-Disposition.\nfunc (r DownloadResponse) ContentDisposition() string {\n\treturn r.r.ContentDisposition()\n}\n\n// ContentEncoding returns the value for header Content-Encoding.\nfunc (r DownloadResponse) ContentEncoding() string {\n\treturn r.r.ContentEncoding()\n}\n\n// ContentLanguage returns the value for header Content-Language.\nfunc (r DownloadResponse) ContentLanguage() string {\n\treturn r.r.ContentLanguage()\n}\n\n// ContentLength returns the value for header Content-Length.\nfunc (r DownloadResponse) ContentLength() int64 {\n\treturn r.r.ContentLength()\n}\n\n// ContentRange returns the value for header Content-Range.\nfunc (r DownloadResponse) ContentRange() string {\n\treturn r.r.ContentRange()\n}\n\n// ContentType returns the value for header Content-Type.\nfunc (r DownloadResponse) ContentType() string {\n\treturn r.r.ContentType()\n}\n\n// CopyCompletionTime returns the value for header x-ms-copy-completion-time.\nfunc (r DownloadResponse) CopyCompletionTime() time.Time {\n\treturn r.r.CopyCompletionTime()\n}\n\n// CopyID returns the value for header x-ms-copy-id.\nfunc (r DownloadResponse) CopyID() string {\n\treturn r.r.CopyID()\n}\n\n// CopyProgress returns the value for header x-ms-copy-progress.\nfunc (r DownloadResponse) CopyProgress() string {\n\treturn r.r.CopyProgress()\n}\n\n// CopySource returns the value for header x-ms-copy-source.\nfunc (r DownloadResponse) CopySource() string {\n\treturn r.r.CopySource()\n}\n\n// CopyStatus returns the value for header x-ms-copy-status.\nfunc (r DownloadResponse) CopyStatus() CopyStatusType {\n\treturn r.r.CopyStatus()\n}\n\n// CopyStatusDescription returns the value for header x-ms-copy-status-description.\nfunc (r DownloadResponse) CopyStatusDescription() string {\n\treturn r.r.CopyStatusDescription()\n}\n\n// Date returns the value for header Date.\nfunc (r DownloadResponse) Date() time.Time {\n\treturn r.r.Date()\n}\n\n// ETag returns the value for header ETag.\nfunc (r DownloadResponse) ETag() ETag {\n\treturn r.r.ETag()\n}\n\n// IsServerEncrypted returns the value for header x-ms-server-encrypted.\nfunc (r DownloadResponse) IsServerEncrypted() string {\n\treturn r.r.IsServerEncrypted()\n}\n\n// LastModified returns the value for header Last-Modified.\nfunc (r DownloadResponse) LastModified() time.Time {\n\treturn r.r.LastModified()\n}\n\n// LeaseDuration returns the value for header x-ms-lease-duration.\nfunc (r DownloadResponse) LeaseDuration() LeaseDurationType {\n\treturn r.r.LeaseDuration()\n}\n\n// LeaseState returns the value for header x-ms-lease-state.\nfunc (r DownloadResponse) LeaseState() LeaseStateType {\n\treturn r.r.LeaseState()\n}\n\n// LeaseStatus returns the value for header x-ms-lease-status.\nfunc (r DownloadResponse) LeaseStatus() LeaseStatusType {\n\treturn r.r.LeaseStatus()\n}\n\n// RequestID returns the value for header x-ms-request-id.\nfunc (r DownloadResponse) RequestID() string {\n\treturn r.r.RequestID()\n}\n\n// Version returns the value for header x-ms-version.\nfunc (r DownloadResponse) Version() string {\n\treturn r.r.Version()\n}\n\n// NewMetadata returns user-defined key/value pairs.\nfunc (r DownloadResponse) NewMetadata() Metadata {\n\treturn r.r.NewMetadata()\n}\n"
  },
  {
    "path": "vendor/github.com/Azure/azure-storage-blob-go/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\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"
  },
  {
    "path": "vendor/github.com/StackExchange/wmi/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013 Stack Exchange\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/StackExchange/wmi/README.md",
    "content": "wmi\n===\n\nPackage wmi provides a WQL interface to Windows WMI.\n\nNote: It interfaces with WMI on the local machine, therefore it only runs on Windows.\n"
  },
  {
    "path": "vendor/github.com/StackExchange/wmi/swbemservices.go",
    "content": "// +build windows\n\npackage wmi\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"sync\"\n\n\t\"github.com/go-ole/go-ole\"\n\t\"github.com/go-ole/go-ole/oleutil\"\n)\n\n// SWbemServices is used to access wmi. See https://msdn.microsoft.com/en-us/library/aa393719(v=vs.85).aspx\ntype SWbemServices struct {\n\t//TODO: track namespace. Not sure if we can re connect to a different namespace using the same instance\n\tcWMIClient            *Client //This could also be an embedded struct, but then we would need to branch on Client vs SWbemServices in the Query method\n\tsWbemLocatorIUnknown  *ole.IUnknown\n\tsWbemLocatorIDispatch *ole.IDispatch\n\tqueries               chan *queryRequest\n\tcloseError            chan error\n\tlQueryorClose         sync.Mutex\n}\n\ntype queryRequest struct {\n\tquery    string\n\tdst      interface{}\n\targs     []interface{}\n\tfinished chan error\n}\n\n// InitializeSWbemServices will return a new SWbemServices object that can be used to query WMI\nfunc InitializeSWbemServices(c *Client, connectServerArgs ...interface{}) (*SWbemServices, error) {\n\t//fmt.Println(\"InitializeSWbemServices: Starting\")\n\t//TODO: implement connectServerArgs as optional argument for init with connectServer call\n\ts := new(SWbemServices)\n\ts.cWMIClient = c\n\ts.queries = make(chan *queryRequest)\n\tinitError := make(chan error)\n\tgo s.process(initError)\n\n\terr, ok := <-initError\n\tif ok {\n\t\treturn nil, err //Send error to caller\n\t}\n\t//fmt.Println(\"InitializeSWbemServices: Finished\")\n\treturn s, nil\n}\n\n// Close will clear and release all of the SWbemServices resources\nfunc (s *SWbemServices) Close() error {\n\ts.lQueryorClose.Lock()\n\tif s == nil || s.sWbemLocatorIDispatch == nil {\n\t\ts.lQueryorClose.Unlock()\n\t\treturn fmt.Errorf(\"SWbemServices is not Initialized\")\n\t}\n\tif s.queries == nil {\n\t\ts.lQueryorClose.Unlock()\n\t\treturn fmt.Errorf(\"SWbemServices has been closed\")\n\t}\n\t//fmt.Println(\"Close: sending close request\")\n\tvar result error\n\tce := make(chan error)\n\ts.closeError = ce //Race condition if multiple callers to close. May need to lock here\n\tclose(s.queries)  //Tell background to shut things down\n\ts.lQueryorClose.Unlock()\n\terr, ok := <-ce\n\tif ok {\n\t\tresult = err\n\t}\n\t//fmt.Println(\"Close: finished\")\n\treturn result\n}\n\nfunc (s *SWbemServices) process(initError chan error) {\n\t//fmt.Println(\"process: starting background thread initialization\")\n\t//All OLE/WMI calls must happen on the same initialized thead, so lock this goroutine\n\truntime.LockOSThread()\n\tdefer runtime.LockOSThread()\n\n\terr := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)\n\tif err != nil {\n\t\toleCode := err.(*ole.OleError).Code()\n\t\tif oleCode != ole.S_OK && oleCode != S_FALSE {\n\t\t\tinitError <- fmt.Errorf(\"ole.CoInitializeEx error: %v\", err)\n\t\t\treturn\n\t\t}\n\t}\n\tdefer ole.CoUninitialize()\n\n\tunknown, err := oleutil.CreateObject(\"WbemScripting.SWbemLocator\")\n\tif err != nil {\n\t\tinitError <- fmt.Errorf(\"CreateObject SWbemLocator error: %v\", err)\n\t\treturn\n\t} else if unknown == nil {\n\t\tinitError <- ErrNilCreateObject\n\t\treturn\n\t}\n\tdefer unknown.Release()\n\ts.sWbemLocatorIUnknown = unknown\n\n\tdispatch, err := s.sWbemLocatorIUnknown.QueryInterface(ole.IID_IDispatch)\n\tif err != nil {\n\t\tinitError <- fmt.Errorf(\"SWbemLocator QueryInterface error: %v\", err)\n\t\treturn\n\t}\n\tdefer dispatch.Release()\n\ts.sWbemLocatorIDispatch = dispatch\n\n\t// we can't do the ConnectServer call outside the loop unless we find a way to track and re-init the connectServerArgs\n\t//fmt.Println(\"process: initialized. closing initError\")\n\tclose(initError)\n\t//fmt.Println(\"process: waiting for queries\")\n\tfor q := range s.queries {\n\t\t//fmt.Printf(\"process: new query: len(query)=%d\\n\", len(q.query))\n\t\terrQuery := s.queryBackground(q)\n\t\t//fmt.Println(\"process: s.queryBackground finished\")\n\t\tif errQuery != nil {\n\t\t\tq.finished <- errQuery\n\t\t}\n\t\tclose(q.finished)\n\t}\n\t//fmt.Println(\"process: queries channel closed\")\n\ts.queries = nil //set channel to nil so we know it is closed\n\t//TODO: I think the Release/Clear calls can panic if things are in a bad state.\n\t//TODO: May need to recover from panics and send error to method caller instead.\n\tclose(s.closeError)\n}\n\n// Query runs the WQL query using a SWbemServices instance and appends the values to dst.\n//\n// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in\n// the query must have the same name in dst. Supported types are all signed and\n// unsigned integers, time.Time, string, bool, or a pointer to one of those.\n// Array types are not supported.\n//\n// By default, the local machine and default namespace are used. These can be\n// changed using connectServerArgs. See\n// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.\nfunc (s *SWbemServices) Query(query string, dst interface{}, connectServerArgs ...interface{}) error {\n\ts.lQueryorClose.Lock()\n\tif s == nil || s.sWbemLocatorIDispatch == nil {\n\t\ts.lQueryorClose.Unlock()\n\t\treturn fmt.Errorf(\"SWbemServices is not Initialized\")\n\t}\n\tif s.queries == nil {\n\t\ts.lQueryorClose.Unlock()\n\t\treturn fmt.Errorf(\"SWbemServices has been closed\")\n\t}\n\n\t//fmt.Println(\"Query: Sending query request\")\n\tqr := queryRequest{\n\t\tquery:    query,\n\t\tdst:      dst,\n\t\targs:     connectServerArgs,\n\t\tfinished: make(chan error),\n\t}\n\ts.queries <- &qr\n\ts.lQueryorClose.Unlock()\n\terr, ok := <-qr.finished\n\tif ok {\n\t\t//fmt.Println(\"Query: Finished with error\")\n\t\treturn err //Send error to caller\n\t}\n\t//fmt.Println(\"Query: Finished\")\n\treturn nil\n}\n\nfunc (s *SWbemServices) queryBackground(q *queryRequest) error {\n\tif s == nil || s.sWbemLocatorIDispatch == nil {\n\t\treturn fmt.Errorf(\"SWbemServices is not Initialized\")\n\t}\n\twmi := s.sWbemLocatorIDispatch //Should just rename in the code, but this will help as we break things apart\n\t//fmt.Println(\"queryBackground: Starting\")\n\n\tdv := reflect.ValueOf(q.dst)\n\tif dv.Kind() != reflect.Ptr || dv.IsNil() {\n\t\treturn ErrInvalidEntityType\n\t}\n\tdv = dv.Elem()\n\tmat, elemType := checkMultiArg(dv)\n\tif mat == multiArgTypeInvalid {\n\t\treturn ErrInvalidEntityType\n\t}\n\n\t// service is a SWbemServices\n\tserviceRaw, err := oleutil.CallMethod(wmi, \"ConnectServer\", q.args...)\n\tif err != nil {\n\t\treturn err\n\t}\n\tservice := serviceRaw.ToIDispatch()\n\tdefer serviceRaw.Clear()\n\n\t// result is a SWBemObjectSet\n\tresultRaw, err := oleutil.CallMethod(service, \"ExecQuery\", q.query)\n\tif err != nil {\n\t\treturn err\n\t}\n\tresult := resultRaw.ToIDispatch()\n\tdefer resultRaw.Clear()\n\n\tcount, err := oleInt64(result, \"Count\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tenumProperty, err := result.GetProperty(\"_NewEnum\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer enumProperty.Clear()\n\n\tenum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif enum == nil {\n\t\treturn fmt.Errorf(\"can't get IEnumVARIANT, enum is nil\")\n\t}\n\tdefer enum.Release()\n\n\t// Initialize a slice with Count capacity\n\tdv.Set(reflect.MakeSlice(dv.Type(), 0, int(count)))\n\n\tvar errFieldMismatch error\n\tfor itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr := func() error {\n\t\t\t// item is a SWbemObject, but really a Win32_Process\n\t\t\titem := itemRaw.ToIDispatch()\n\t\t\tdefer item.Release()\n\n\t\t\tev := reflect.New(elemType)\n\t\t\tif err = s.cWMIClient.loadEntity(ev.Interface(), item); err != nil {\n\t\t\t\tif _, ok := err.(*ErrFieldMismatch); ok {\n\t\t\t\t\t// We continue loading entities even in the face of field mismatch errors.\n\t\t\t\t\t// If we encounter any other error, that other error is returned. Otherwise,\n\t\t\t\t\t// an ErrFieldMismatch is returned.\n\t\t\t\t\terrFieldMismatch = err\n\t\t\t\t} else {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tif mat != multiArgTypeStructPtr {\n\t\t\t\tev = ev.Elem()\n\t\t\t}\n\t\t\tdv.Set(reflect.Append(dv, ev))\n\t\t\treturn nil\n\t\t}()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\t//fmt.Println(\"queryBackground: Finished\")\n\treturn errFieldMismatch\n}\n"
  },
  {
    "path": "vendor/github.com/StackExchange/wmi/wmi.go",
    "content": "// +build windows\n\n/*\nPackage wmi provides a WQL interface for WMI on Windows.\n\nExample code to print names of running processes:\n\n\ttype Win32_Process struct {\n\t\tName string\n\t}\n\n\tfunc main() {\n\t\tvar dst []Win32_Process\n\t\tq := wmi.CreateQuery(&dst, \"\")\n\t\terr := wmi.Query(q, &dst)\n\t\tif err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tfor i, v := range dst {\n\t\t\tprintln(i, v.Name)\n\t\t}\n\t}\n\n*/\npackage wmi\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/go-ole/go-ole\"\n\t\"github.com/go-ole/go-ole/oleutil\"\n)\n\nvar l = log.New(os.Stdout, \"\", log.LstdFlags)\n\nvar (\n\tErrInvalidEntityType = errors.New(\"wmi: invalid entity type\")\n\t// ErrNilCreateObject is the error returned if CreateObject returns nil even\n\t// if the error was nil.\n\tErrNilCreateObject = errors.New(\"wmi: create object returned nil\")\n\tlock               sync.Mutex\n)\n\n// S_FALSE is returned by CoInitializeEx if it was already called on this thread.\nconst S_FALSE = 0x00000001\n\n// QueryNamespace invokes Query with the given namespace on the local machine.\nfunc QueryNamespace(query string, dst interface{}, namespace string) error {\n\treturn Query(query, dst, nil, namespace)\n}\n\n// Query runs the WQL query and appends the values to dst.\n//\n// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in\n// the query must have the same name in dst. Supported types are all signed and\n// unsigned integers, time.Time, string, bool, or a pointer to one of those.\n// Array types are not supported.\n//\n// By default, the local machine and default namespace are used. These can be\n// changed using connectServerArgs. See\n// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.\n//\n// Query is a wrapper around DefaultClient.Query.\nfunc Query(query string, dst interface{}, connectServerArgs ...interface{}) error {\n\tif DefaultClient.SWbemServicesClient == nil {\n\t\treturn DefaultClient.Query(query, dst, connectServerArgs...)\n\t}\n\treturn DefaultClient.SWbemServicesClient.Query(query, dst, connectServerArgs...)\n}\n\n// A Client is an WMI query client.\n//\n// Its zero value (DefaultClient) is a usable client.\ntype Client struct {\n\t// NonePtrZero specifies if nil values for fields which aren't pointers\n\t// should be returned as the field types zero value.\n\t//\n\t// Setting this to true allows stucts without pointer fields to be used\n\t// without the risk failure should a nil value returned from WMI.\n\tNonePtrZero bool\n\n\t// PtrNil specifies if nil values for pointer fields should be returned\n\t// as nil.\n\t//\n\t// Setting this to true will set pointer fields to nil where WMI\n\t// returned nil, otherwise the types zero value will be returned.\n\tPtrNil bool\n\n\t// AllowMissingFields specifies that struct fields not present in the\n\t// query result should not result in an error.\n\t//\n\t// Setting this to true allows custom queries to be used with full\n\t// struct definitions instead of having to define multiple structs.\n\tAllowMissingFields bool\n\n\t// SWbemServiceClient is an optional SWbemServices object that can be\n\t// initialized and then reused across multiple queries. If it is null\n\t// then the method will initialize a new temporary client each time.\n\tSWbemServicesClient *SWbemServices\n}\n\n// DefaultClient is the default Client and is used by Query, QueryNamespace\nvar DefaultClient = &Client{}\n\n// Query runs the WQL query and appends the values to dst.\n//\n// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in\n// the query must have the same name in dst. Supported types are all signed and\n// unsigned integers, time.Time, string, bool, or a pointer to one of those.\n// Array types are not supported.\n//\n// By default, the local machine and default namespace are used. These can be\n// changed using connectServerArgs. See\n// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details.\nfunc (c *Client) Query(query string, dst interface{}, connectServerArgs ...interface{}) error {\n\tdv := reflect.ValueOf(dst)\n\tif dv.Kind() != reflect.Ptr || dv.IsNil() {\n\t\treturn ErrInvalidEntityType\n\t}\n\tdv = dv.Elem()\n\tmat, elemType := checkMultiArg(dv)\n\tif mat == multiArgTypeInvalid {\n\t\treturn ErrInvalidEntityType\n\t}\n\n\tlock.Lock()\n\tdefer lock.Unlock()\n\truntime.LockOSThread()\n\tdefer runtime.UnlockOSThread()\n\n\terr := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED)\n\tif err != nil {\n\t\toleCode := err.(*ole.OleError).Code()\n\t\tif oleCode != ole.S_OK && oleCode != S_FALSE {\n\t\t\treturn err\n\t\t}\n\t}\n\tdefer ole.CoUninitialize()\n\n\tunknown, err := oleutil.CreateObject(\"WbemScripting.SWbemLocator\")\n\tif err != nil {\n\t\treturn err\n\t} else if unknown == nil {\n\t\treturn ErrNilCreateObject\n\t}\n\tdefer unknown.Release()\n\n\twmi, err := unknown.QueryInterface(ole.IID_IDispatch)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer wmi.Release()\n\n\t// service is a SWbemServices\n\tserviceRaw, err := oleutil.CallMethod(wmi, \"ConnectServer\", connectServerArgs...)\n\tif err != nil {\n\t\treturn err\n\t}\n\tservice := serviceRaw.ToIDispatch()\n\tdefer serviceRaw.Clear()\n\n\t// result is a SWBemObjectSet\n\tresultRaw, err := oleutil.CallMethod(service, \"ExecQuery\", query)\n\tif err != nil {\n\t\treturn err\n\t}\n\tresult := resultRaw.ToIDispatch()\n\tdefer resultRaw.Clear()\n\n\tcount, err := oleInt64(result, \"Count\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tenumProperty, err := result.GetProperty(\"_NewEnum\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer enumProperty.Clear()\n\n\tenum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif enum == nil {\n\t\treturn fmt.Errorf(\"can't get IEnumVARIANT, enum is nil\")\n\t}\n\tdefer enum.Release()\n\n\t// Initialize a slice with Count capacity\n\tdv.Set(reflect.MakeSlice(dv.Type(), 0, int(count)))\n\n\tvar errFieldMismatch error\n\tfor itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\terr := func() error {\n\t\t\t// item is a SWbemObject, but really a Win32_Process\n\t\t\titem := itemRaw.ToIDispatch()\n\t\t\tdefer item.Release()\n\n\t\t\tev := reflect.New(elemType)\n\t\t\tif err = c.loadEntity(ev.Interface(), item); err != nil {\n\t\t\t\tif _, ok := err.(*ErrFieldMismatch); ok {\n\t\t\t\t\t// We continue loading entities even in the face of field mismatch errors.\n\t\t\t\t\t// If we encounter any other error, that other error is returned. Otherwise,\n\t\t\t\t\t// an ErrFieldMismatch is returned.\n\t\t\t\t\terrFieldMismatch = err\n\t\t\t\t} else {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tif mat != multiArgTypeStructPtr {\n\t\t\t\tev = ev.Elem()\n\t\t\t}\n\t\t\tdv.Set(reflect.Append(dv, ev))\n\t\t\treturn nil\n\t\t}()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn errFieldMismatch\n}\n\n// ErrFieldMismatch is returned when a field is to be loaded into a different\n// type than the one it was stored from, or when a field is missing or\n// unexported in the destination struct.\n// StructType is the type of the struct pointed to by the destination argument.\ntype ErrFieldMismatch struct {\n\tStructType reflect.Type\n\tFieldName  string\n\tReason     string\n}\n\nfunc (e *ErrFieldMismatch) Error() string {\n\treturn fmt.Sprintf(\"wmi: cannot load field %q into a %q: %s\",\n\t\te.FieldName, e.StructType, e.Reason)\n}\n\nvar timeType = reflect.TypeOf(time.Time{})\n\n// loadEntity loads a SWbemObject into a struct pointer.\nfunc (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismatch error) {\n\tv := reflect.ValueOf(dst).Elem()\n\tfor i := 0; i < v.NumField(); i++ {\n\t\tf := v.Field(i)\n\t\tof := f\n\t\tisPtr := f.Kind() == reflect.Ptr\n\t\tif isPtr {\n\t\t\tptr := reflect.New(f.Type().Elem())\n\t\t\tf.Set(ptr)\n\t\t\tf = f.Elem()\n\t\t}\n\t\tn := v.Type().Field(i).Name\n\t\tif !f.CanSet() {\n\t\t\treturn &ErrFieldMismatch{\n\t\t\t\tStructType: of.Type(),\n\t\t\t\tFieldName:  n,\n\t\t\t\tReason:     \"CanSet() is false\",\n\t\t\t}\n\t\t}\n\t\tprop, err := oleutil.GetProperty(src, n)\n\t\tif err != nil {\n\t\t\tif !c.AllowMissingFields {\n\t\t\t\terrFieldMismatch = &ErrFieldMismatch{\n\t\t\t\t\tStructType: of.Type(),\n\t\t\t\t\tFieldName:  n,\n\t\t\t\t\tReason:     \"no such struct field\",\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tdefer prop.Clear()\n\n\t\tswitch val := prop.Value().(type) {\n\t\tcase int8, int16, int32, int64, int:\n\t\t\tv := reflect.ValueOf(val).Int()\n\t\t\tswitch f.Kind() {\n\t\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\t\tf.SetInt(v)\n\t\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\t\tf.SetUint(uint64(v))\n\t\t\tdefault:\n\t\t\t\treturn &ErrFieldMismatch{\n\t\t\t\t\tStructType: of.Type(),\n\t\t\t\t\tFieldName:  n,\n\t\t\t\t\tReason:     \"not an integer class\",\n\t\t\t\t}\n\t\t\t}\n\t\tcase uint8, uint16, uint32, uint64:\n\t\t\tv := reflect.ValueOf(val).Uint()\n\t\t\tswitch f.Kind() {\n\t\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\t\tf.SetInt(int64(v))\n\t\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\t\tf.SetUint(v)\n\t\t\tdefault:\n\t\t\t\treturn &ErrFieldMismatch{\n\t\t\t\t\tStructType: of.Type(),\n\t\t\t\t\tFieldName:  n,\n\t\t\t\t\tReason:     \"not an integer class\",\n\t\t\t\t}\n\t\t\t}\n\t\tcase string:\n\t\t\tswitch f.Kind() {\n\t\t\tcase reflect.String:\n\t\t\t\tf.SetString(val)\n\t\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\t\tiv, err := strconv.ParseInt(val, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tf.SetInt(iv)\n\t\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\t\tuv, err := strconv.ParseUint(val, 10, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tf.SetUint(uv)\n\t\t\tcase reflect.Struct:\n\t\t\t\tswitch f.Type() {\n\t\t\t\tcase timeType:\n\t\t\t\t\tif len(val) == 25 {\n\t\t\t\t\t\tmins, err := strconv.Atoi(val[22:])\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval = val[:22] + fmt.Sprintf(\"%02d%02d\", mins/60, mins%60)\n\t\t\t\t\t}\n\t\t\t\t\tt, err := time.Parse(\"20060102150405.000000-0700\", val)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tf.Set(reflect.ValueOf(t))\n\t\t\t\t}\n\t\t\t}\n\t\tcase bool:\n\t\t\tswitch f.Kind() {\n\t\t\tcase reflect.Bool:\n\t\t\t\tf.SetBool(val)\n\t\t\tdefault:\n\t\t\t\treturn &ErrFieldMismatch{\n\t\t\t\t\tStructType: of.Type(),\n\t\t\t\t\tFieldName:  n,\n\t\t\t\t\tReason:     \"not a bool\",\n\t\t\t\t}\n\t\t\t}\n\t\tcase float32:\n\t\t\tswitch f.Kind() {\n\t\t\tcase reflect.Float32:\n\t\t\t\tf.SetFloat(float64(val))\n\t\t\tdefault:\n\t\t\t\treturn &ErrFieldMismatch{\n\t\t\t\t\tStructType: of.Type(),\n\t\t\t\t\tFieldName:  n,\n\t\t\t\t\tReason:     \"not a Float32\",\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif f.Kind() == reflect.Slice {\n\t\t\t\tswitch f.Type().Elem().Kind() {\n\t\t\t\tcase reflect.String:\n\t\t\t\t\tsafeArray := prop.ToArray()\n\t\t\t\t\tif safeArray != nil {\n\t\t\t\t\t\tarr := safeArray.ToValueArray()\n\t\t\t\t\t\tfArr := reflect.MakeSlice(f.Type(), len(arr), len(arr))\n\t\t\t\t\t\tfor i, v := range arr {\n\t\t\t\t\t\t\ts := fArr.Index(i)\n\t\t\t\t\t\t\ts.SetString(v.(string))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tf.Set(fArr)\n\t\t\t\t\t}\n\t\t\t\tcase reflect.Uint8:\n\t\t\t\t\tsafeArray := prop.ToArray()\n\t\t\t\t\tif safeArray != nil {\n\t\t\t\t\t\tarr := safeArray.ToValueArray()\n\t\t\t\t\t\tfArr := reflect.MakeSlice(f.Type(), len(arr), len(arr))\n\t\t\t\t\t\tfor i, v := range arr {\n\t\t\t\t\t\t\ts := fArr.Index(i)\n\t\t\t\t\t\t\ts.SetUint(reflect.ValueOf(v).Uint())\n\t\t\t\t\t\t}\n\t\t\t\t\t\tf.Set(fArr)\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn &ErrFieldMismatch{\n\t\t\t\t\t\tStructType: of.Type(),\n\t\t\t\t\t\tFieldName:  n,\n\t\t\t\t\t\tReason:     fmt.Sprintf(\"unsupported slice type (%T)\", val),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttypeof := reflect.TypeOf(val)\n\t\t\t\tif typeof == nil && (isPtr || c.NonePtrZero) {\n\t\t\t\t\tif (isPtr && c.PtrNil) || (!isPtr && c.NonePtrZero) {\n\t\t\t\t\t\tof.Set(reflect.Zero(of.Type()))\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\treturn &ErrFieldMismatch{\n\t\t\t\t\tStructType: of.Type(),\n\t\t\t\t\tFieldName:  n,\n\t\t\t\t\tReason:     fmt.Sprintf(\"unsupported type (%T)\", val),\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn errFieldMismatch\n}\n\ntype multiArgType int\n\nconst (\n\tmultiArgTypeInvalid multiArgType = iota\n\tmultiArgTypeStruct\n\tmultiArgTypeStructPtr\n)\n\n// checkMultiArg checks that v has type []S, []*S for some struct type S.\n//\n// It returns what category the slice's elements are, and the reflect.Type\n// that represents S.\nfunc checkMultiArg(v reflect.Value) (m multiArgType, elemType reflect.Type) {\n\tif v.Kind() != reflect.Slice {\n\t\treturn multiArgTypeInvalid, nil\n\t}\n\telemType = v.Type().Elem()\n\tswitch elemType.Kind() {\n\tcase reflect.Struct:\n\t\treturn multiArgTypeStruct, elemType\n\tcase reflect.Ptr:\n\t\telemType = elemType.Elem()\n\t\tif elemType.Kind() == reflect.Struct {\n\t\t\treturn multiArgTypeStructPtr, elemType\n\t\t}\n\t}\n\treturn multiArgTypeInvalid, nil\n}\n\nfunc oleInt64(item *ole.IDispatch, prop string) (int64, error) {\n\tv, err := oleutil.GetProperty(item, prop)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdefer v.Clear()\n\n\ti := int64(v.Val)\n\treturn i, nil\n}\n\n// CreateQuery returns a WQL query string that queries all columns of src. where\n// is an optional string that is appended to the query, to be used with WHERE\n// clauses. In such a case, the \"WHERE\" string should appear at the beginning.\nfunc CreateQuery(src interface{}, where string) string {\n\tvar b bytes.Buffer\n\tb.WriteString(\"SELECT \")\n\ts := reflect.Indirect(reflect.ValueOf(src))\n\tt := s.Type()\n\tif s.Kind() == reflect.Slice {\n\t\tt = t.Elem()\n\t}\n\tif t.Kind() != reflect.Struct {\n\t\treturn \"\"\n\t}\n\tvar fields []string\n\tfor i := 0; i < t.NumField(); i++ {\n\t\tfields = append(fields, t.Field(i).Name)\n\t}\n\tb.WriteString(strings.Join(fields, \", \"))\n\tb.WriteString(\" FROM \")\n\tb.WriteString(t.Name())\n\tb.WriteString(\" \" + where)\n\treturn b.String()\n}\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/.travis.yml",
    "content": "language: go\ngo:\n- 1.7.3\n- tip\nbefore_install:\n- go get -v github.com/golang/lint/golint\n- go get -v -t -d ./...\nafter_success:\n- make coverdata\n- bash <(curl -s https://codecov.io/bash)\nscript:\n- make -j4 check GOTEST_FLAGS=-v\nnotifications:\n  slack:\n    secure: MO/3LqbyALbi9vAY3pZetp/LfRuKEPAYEUya7XKmTWA3OFHYkTGqJWNosVkFJd6eSKwnc3HP4jlKADEBNVxADHzcA3uMPUQi1mIcNk/Ps1WWMNDv1liE2XOoOmHSHZ/8ksk6TNq83x+d17ZffYq8KAH6iKNKvllO1JzQPgJJdf+cNXQQlg6uPSe+ggMpjqVLkKcHqA4L3/BWo6fNcyvkqaN3uXcEzYPi7Nb2q9tl0ja6ToyZV4H6SinwitZmpedN3RkBcm4fKmGyw5ikzH93ycA5SvWrnXTh1dJvq6DU0FV7iwI6oqPTbAUc3FE5g7aEkK0qVR21s2j+KNaOLnuX10ZGQFwj2r3SW2REHq4j+qqFla/2EmSFZJt3GXYS+plmGCxqCgyjSw6tTi7LaGZ/mWBJEA9/EaXG1NkwlQYx5tdUMeGj77OczjXClynpb2hJ7MM2b32Rnp0JmNaXAh01SmClo+8nDWuksAsIdPtWsbF0/XHmEJiqpu8ojvVXOQIbPt43bjG7PS1t5jaRAU/N1n56SiCGgCSGd3Ui5eX5vmgWdpZMl8NG05G4LFsgmkdphRT5fru0C2PrhNZYRDGWs63XKapBxsvfqGzdHxTtYuaDjHjrI+9w0BC/8kEzSWoPmabQ5ci4wf4DeplcIay4tDMgMSo8pGAf52vrne4rmUo=\n    on_success: change\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/AUTHORS",
    "content": "All contributors are required to sign a \"Contributor License Agreement\" at\n  <TBD>\n\nThe following organizations and people have contributed code to this library.\n(Please keep both lists sorted alphabetically.)\n\n\nArista Networks, Inc.\n\n\nBenoit Sigoure\nFabrice Rabaute\n\n\n\nThe list of individual contributors for code currently in HEAD can be obtained\nat any time with the following script:\n\nfind . -type f \\\n| while read i; do \\\n  git blame -t $i 2>/dev/null; \\\n  done \\\n| sed 's/^[0-9a-f]\\{8\\} [^(]*(\\([^)]*\\) [-+0-9 ]\\{14,\\}).*/\\1/;s/ *$//' \\\n| awk '{a[$0]++; t++} END{for(n in a) print n}' \\\n| sort\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/COPYING",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/Dockerfile",
    "content": "# Copyright (C) 2016  Arista Networks, Inc.\n# Use of this source code is governed by the Apache License 2.0\n# that can be found in the COPYING file.\n\n# TODO: move this to cmd/ockafka (https://github.com/docker/hub-feedback/issues/292)\nFROM golang:1.7.3\n\nRUN mkdir -p /go/src/github.com/aristanetworks/goarista/cmd\nWORKDIR /go/src/github.com/aristanetworks/goarista\nCOPY ./ .\nRUN go get -d ./cmd/ockafka/... \\\n  && go install ./cmd/ockafka\n\nENTRYPOINT [\"/go/bin/ockafka\"]\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/Makefile",
    "content": "# Copyright (C) 2015  Arista Networks, Inc.\n# Use of this source code is governed by the Apache License 2.0\n# that can be found in the COPYING file.\n\nGO := go\nTEST_TIMEOUT := 30s\nGOTEST_FLAGS :=\n\nDEFAULT_GOPATH := $${GOPATH%%:*}\nGOPATH_BIN := $(DEFAULT_GOPATH)/bin\nGOPATH_PKG := $(DEFAULT_GOPATH)/pkg\nGOLINT := $(GOPATH_BIN)/golint\nGOFOLDERS := find . -type d ! -path \"./.git/*\"\n\nall: install\n\ninstall:\n\t$(GO) install ./...\n\ncheck: vet test fmtcheck lint\n\nCOVER_PKGS := key test\nCOVER_MODE := count\ncoverdata:\n\techo 'mode: $(COVER_MODE)' >coverage.out\n\tfor dir in $(COVER_PKGS); do \\\n\t  $(GO) test -covermode=$(COVER_MODE) -coverprofile=cov.out-t ./$$dir || exit; \\\n\t  tail -n +2 cov.out-t >> coverage.out && \\\n\t  rm cov.out-t; \\\n\tdone;\n\ncoverage: coverdata\n\t$(GO) tool cover -html=coverage.out\n\trm -f coverage.out\n\nfmtcheck:\n\terrors=`gofmt -l .`; if test -n \"$$errors\"; then echo Check these files for style errors:; echo \"$$errors\"; exit 1; fi\n\tfind . -name '*.go' ! -name '*.pb.go' -exec ./check_line_len.awk {} +\n\nvet:\n\t$(GO) vet ./...\n\nlint:\n\tlint=`$(GOFOLDERS) | xargs -L 1 $(GOLINT) | fgrep -v .pb.go`; if test -n \"$$lint\"; then echo \"$$lint\"; exit 1; fi\n# The above is ugly, but unfortunately golint doesn't exit 1 when it finds\n# lint.  See https://github.com/golang/lint/issues/65\n\ntest:\n\t$(GO) test $(GOTEST_FLAGS) -timeout=$(TEST_TIMEOUT) ./...\n\ndocker:\n\tdocker build -f cmd/occlient/Dockerfile .\n\nclean:\n\trm -rf $(GOPATH_PKG)/*/github.com/aristanetworks/goarista\n\t$(GO) clean ./...\n\n.PHONY: all check coverage coverdata docker fmtcheck install lint test vet\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/README.md",
    "content": "# Arista Go library [![Build Status](https://travis-ci.org/aristanetworks/goarista.svg?branch=master)](https://travis-ci.org/aristanetworks/goarista) [![codecov.io](http://codecov.io/github/aristanetworks/goarista/coverage.svg?branch=master)](http://codecov.io/github/aristanetworks/goarista?branch=master) [![GoDoc](https://godoc.org/github.com/aristanetworks/goarista?status.png)](https://godoc.org/github.com/aristanetworks/goarista) [![Go Report Card](https://goreportcard.com/badge/github.com/aristanetworks/goarista)](https://goreportcard.com/report/github.com/aristanetworks/goarista)\n\n## areflect\n\nHelper functions to work with the `reflect` package.  Contains\n`ForceExport()`, which bypasses the check in `reflect.Value` that\nprevents accessing unexported attributes.\n\n## monotime\n\nProvides access to a fast monotonic clock source, to fill in the gap in the\n[Go standard library, which lacks one](https://github.com/golang/go/issues/12914).\nDon't use `time.Now()` in code that needs to time things or otherwise assume\nthat time passes at a constant rate, instead use `monotime.Now()`.\n\n## cmd\n\nSee the [cmd](cmd) directory.\n\n## dscp\n\nProvides `ListenTCPWithTOS()`, which is a replacement for `net.ListenTCP()`\nthat allows specifying the ToS (Type of Service), to specify DSCP / ECN /\nclass of service flags to use for incoming connections.\n\n## key\n\nProvides a common type used across various Arista projects, named `key.Key`,\nwhich is used to work around the fact that Go can't let one\nuse a non-hashable type as a key to a `map`, and we sometimes need to use\na `map[string]interface{}` (or something containing one) as a key to maps.\nAs a result, we frequently use `map[key.Key]interface{}` instead of just\n`map[interface{}]interface{}` when we need a generic key-value collection.\n\n## lanz\nA client for [LANZ](https://eos.arista.com/latency-analyzer-lanz-architectures-and-configuration/)\nstreaming servers. It connects to a LANZ streaming server,\nlistens for notifications, decodes them and sends the LANZ protobuf on the\nprovided channel.\n\n## monitor\n\nA library to help expose monitoring metrics on top of the\n[`expvar`](https://golang.org/pkg/expvar/) infrastructure.\n\n## netns\n\n`netns.Do(namespace, cb)` provides a handy mechanism to execute the given\ncallback `cb` in the given [network namespace](https://lwn.net/Articles/580893/).\n\n## pathmap\n\nA datastructure for mapping keys of type string slice to values. It\nallows for some fuzzy matching.\n\n## test\n\nThis is a [Go](http://golang.org/) library to help in writing unit tests.\n\n## Examples\n\nTBD\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/check_line_len.awk",
    "content": "#!/usr/bin/awk -f\n# Copyright (C) 2015  Arista Networks, Inc.\n# Use of this source code is governed by the Apache License 2.0\n# that can be found in the COPYING file.\n\nBEGIN {\n  max = 100;\n}\n\n# Expand tabs to 4 spaces.\n{\n  gsub(/\\t/, \"    \");\n}\n\nlength() > max {\n  errors++;\n  print FILENAME \":\" FNR \": Line too long (\" length() \"/\" max \")\";\n}\n\nEND {\n  if (errors >= 125) {\n    errors = 125;\n  }\n  exit errors;\n}\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/iptables.sh",
    "content": "#!/bin/sh\n\nDEFAULT_PORT=6042\n\nset -e\n\nif [ \"$#\" -lt 1 ]\nthen\n   echo \"usage: $0 <host> [<port>]\"\n   exit 1\nfi\n\nhost=$1\nport=$DEFAULT_PORT\nif [ \"$#\" -gt 1 ]\nthen\n   port=$2\nfi\niptables=\"bash sudo iptables -A INPUT -p tcp --dport $port -j ACCEPT\"\nssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $host \"$iptables\"\necho \"opened TCP port $port on $host\"\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/monotime/issue15006.s",
    "content": "// Copyright (C) 2016  Arista Networks, Inc.\n// Use of this source code is governed by the Apache License 2.0\n// that can be found in the COPYING file.\n\n// This file is intentionally empty.\n// It's a workaround for https://github.com/golang/go/issues/15006\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/monotime/nanotime.go",
    "content": "// Copyright (C) 2016  Arista Networks, Inc.\n// Use of this source code is governed by the Apache License 2.0\n// that can be found in the COPYING file.\n\n// Package monotime provides a fast monotonic clock source.\npackage monotime\n\nimport (\n\t\"time\"\n\t_ \"unsafe\" // required to use //go:linkname\n)\n\n//go:noescape\n//go:linkname nanotime runtime.nanotime\nfunc nanotime() int64\n\n// Now returns the current time in nanoseconds from a monotonic clock.\n// The time returned is based on some arbitrary platform-specific point in the\n// past.  The time returned is guaranteed to increase monotonically at a\n// constant rate, unlike time.Now() from the Go standard library, which may\n// slow down, speed up, jump forward or backward, due to NTP activity or leap\n// seconds.\nfunc Now() uint64 {\n\treturn uint64(nanotime())\n}\n\n// Since returns the amount of time that has elapsed since t. t should be\n// the result of a call to Now() on the same machine.\nfunc Since(t uint64) time.Duration {\n\treturn time.Duration(Now() - t)\n}\n"
  },
  {
    "path": "vendor/github.com/aristanetworks/goarista/rpmbuild.sh",
    "content": "#!/bin/sh\n\n# Copyright (C) 2016  Arista Networks, Inc.\n# Use of this source code is governed by the Apache License 2.0\n# that can be found in the COPYING file.\n\nif [ \"$#\" -lt 1 ]\nthen\n   echo \"usage: $0 <binary>\"\n   exit 1\nfi\nbinary=$1\n\nif [ -z \"$GOPATH\" ] || [ -z \"$GOOS\" ] || [ -z \"$GOARCH\" ]\nthen\n    echo \"Please set \\$GOPATH, \\$GOOS and \\$GOARCH\"\n    exit 1\nfi\n\nset -e\n\nversion=$(git rev-parse --short=7 HEAD)\npwd=$(pwd)\ncd $GOPATH/bin\nif [ -d $GOOS_$GOARCH ]\nthen\n   cd $GOOS_GOARCH\nfi\nos=$GOOS\narch=$GOARCH\nif [ \"$arch\" == \"386\" ]\nthen\n   arch=\"i686\"\nfi\ncmd=\"fpm -n $binary -v $version -s dir -t rpm --rpm-os $os -a $arch --epoch 0 --prefix /usr/bin $binary\"\necho $cmd\n$cmd\nmv $binary-$version-1.$arch.rpm $pwd\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/LICENSE",
    "content": "ISC License\n\nCopyright (c) 2013-2017 The btcsuite developers\nCopyright (c) 2016-2017 The Lightning Network Developers\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/README.md",
    "content": "btcutil\n=======\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![Coverage Status](http://img.shields.io/coveralls/btcsuite/btcutil.svg)](https://coveralls.io/r/btcsuite/btcutil?branch=master)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](http://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcutil)\n\nPackage btcutil provides bitcoin-specific convenience functions and types.\nA comprehensive suite of tests is provided to ensure proper functionality.  See\n`test_coverage.txt` for the gocov coverage report.  Alternatively, if you are\nrunning a POSIX OS, you can run the `cov_report.sh` script for a real-time\nreport.\n\nThis package was developed for btcd, an alternative full-node implementation of\nbitcoin which is under active development by Conformal.  Although it was\nprimarily written for btcd, this package has intentionally been designed so it\ncan be used as a standalone package for any projects needing the functionality\nprovided.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcutil\n```\n\n## GPG Verification Key\n\nAll official release tags are signed by Conformal so users can ensure the code\nhas not been tampered with and is coming from the btcsuite developers.  To\nverify the signature perform the following:\n\n- Download the public key from the Conformal website at\n  https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt\n\n- Import the public key into your GPG keyring:\n  ```bash\n  gpg --import GIT-GPG-KEY-conformal.txt\n  ```\n\n- Verify the release tag with the following command where `TAG_NAME` is a\n  placeholder for the specific tag:\n  ```bash\n  git tag -v TAG_NAME\n  ```\n\n## License\n\nPackage btcutil is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/address.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/btcsuite/btcd/btcec\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcutil/base58\"\n\t\"github.com/btcsuite/btcutil/bech32\"\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\n// UnsupportedWitnessVerError describes an error where a segwit address being\n// decoded has an unsupported witness version.\ntype UnsupportedWitnessVerError byte\n\nfunc (e UnsupportedWitnessVerError) Error() string {\n\treturn \"unsupported witness version: \" + string(e)\n}\n\n// UnsupportedWitnessProgLenError describes an error where a segwit address\n// being decoded has an unsupported witness program length.\ntype UnsupportedWitnessProgLenError int\n\nfunc (e UnsupportedWitnessProgLenError) Error() string {\n\treturn \"unsupported witness program length: \" + string(e)\n}\n\nvar (\n\t// ErrChecksumMismatch describes an error where decoding failed due\n\t// to a bad checksum.\n\tErrChecksumMismatch = errors.New(\"checksum mismatch\")\n\n\t// ErrUnknownAddressType describes an error where an address can not\n\t// decoded as a specific address type due to the string encoding\n\t// begining with an identifier byte unknown to any standard or\n\t// registered (via chaincfg.Register) network.\n\tErrUnknownAddressType = errors.New(\"unknown address type\")\n\n\t// ErrAddressCollision describes an error where an address can not\n\t// be uniquely determined as either a pay-to-pubkey-hash or\n\t// pay-to-script-hash address since the leading identifier is used for\n\t// describing both address kinds, but for different networks.  Rather\n\t// than assuming or defaulting to one or the other, this error is\n\t// returned and the caller must decide how to decode the address.\n\tErrAddressCollision = errors.New(\"address collision\")\n)\n\n// encodeAddress returns a human-readable payment address given a ripemd160 hash\n// and netID which encodes the bitcoin network and address type.  It is used\n// in both pay-to-pubkey-hash (P2PKH) and pay-to-script-hash (P2SH) address\n// encoding.\nfunc encodeAddress(hash160 []byte, netID byte) string {\n\t// Format is 1 byte for a network and address class (i.e. P2PKH vs\n\t// P2SH), 20 bytes for a RIPEMD160 hash, and 4 bytes of checksum.\n\treturn base58.CheckEncode(hash160[:ripemd160.Size], netID)\n}\n\n// encodeSegWitAddress creates a bech32 encoded address string representation\n// from witness version and witness program.\nfunc encodeSegWitAddress(hrp string, witnessVersion byte, witnessProgram []byte) (string, error) {\n\t// Group the address bytes into 5 bit groups, as this is what is used to\n\t// encode each character in the address string.\n\tconverted, err := bech32.ConvertBits(witnessProgram, 8, 5, true)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Concatenate the witness version and program, and encode the resulting\n\t// bytes using bech32 encoding.\n\tcombined := make([]byte, len(converted)+1)\n\tcombined[0] = witnessVersion\n\tcopy(combined[1:], converted)\n\tbech, err := bech32.Encode(hrp, combined)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Check validity by decoding the created address.\n\tversion, program, err := decodeSegWitAddress(bech)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid segwit address: %v\", err)\n\t}\n\n\tif version != witnessVersion || !bytes.Equal(program, witnessProgram) {\n\t\treturn \"\", fmt.Errorf(\"invalid segwit address\")\n\t}\n\n\treturn bech, nil\n}\n\n// Address is an interface type for any type of destination a transaction\n// output may spend to.  This includes pay-to-pubkey (P2PK), pay-to-pubkey-hash\n// (P2PKH), and pay-to-script-hash (P2SH).  Address is designed to be generic\n// enough that other kinds of addresses may be added in the future without\n// changing the decoding and encoding API.\ntype Address interface {\n\t// String returns the string encoding of the transaction output\n\t// destination.\n\t//\n\t// Please note that String differs subtly from EncodeAddress: String\n\t// will return the value as a string without any conversion, while\n\t// EncodeAddress may convert destination types (for example,\n\t// converting pubkeys to P2PKH addresses) before encoding as a\n\t// payment address string.\n\tString() string\n\n\t// EncodeAddress returns the string encoding of the payment address\n\t// associated with the Address value.  See the comment on String\n\t// for how this method differs from String.\n\tEncodeAddress() string\n\n\t// ScriptAddress returns the raw bytes of the address to be used\n\t// when inserting the address into a txout's script.\n\tScriptAddress() []byte\n\n\t// IsForNet returns whether or not the address is associated with the\n\t// passed bitcoin network.\n\tIsForNet(*chaincfg.Params) bool\n}\n\n// DecodeAddress decodes the string encoding of an address and returns\n// the Address if addr is a valid encoding for a known address type.\n//\n// The bitcoin network the address is associated with is extracted if possible.\n// When the address does not encode the network, such as in the case of a raw\n// public key, the address will be associated with the passed defaultNet.\nfunc DecodeAddress(addr string, defaultNet *chaincfg.Params) (Address, error) {\n\t// Bech32 encoded segwit addresses start with a human-readable part\n\t// (hrp) followed by '1'. For Bitcoin mainnet the hrp is \"bc\", and for\n\t// testnet it is \"tb\". If the address string has a prefix that matches\n\t// one of the prefixes for the known networks, we try to decode it as\n\t// a segwit address.\n\toneIndex := strings.LastIndexByte(addr, '1')\n\tif oneIndex > 1 {\n\t\tprefix := addr[:oneIndex+1]\n\t\tif chaincfg.IsBech32SegwitPrefix(prefix) {\n\t\t\twitnessVer, witnessProg, err := decodeSegWitAddress(addr)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\t// We currently only support P2WPKH and P2WSH, which is\n\t\t\t// witness version 0.\n\t\t\tif witnessVer != 0 {\n\t\t\t\treturn nil, UnsupportedWitnessVerError(witnessVer)\n\t\t\t}\n\n\t\t\t// The HRP is everything before the found '1'.\n\t\t\thrp := prefix[:len(prefix)-1]\n\n\t\t\tswitch len(witnessProg) {\n\t\t\tcase 20:\n\t\t\t\treturn newAddressWitnessPubKeyHash(hrp, witnessProg)\n\t\t\tcase 32:\n\t\t\t\treturn newAddressWitnessScriptHash(hrp, witnessProg)\n\t\t\tdefault:\n\t\t\t\treturn nil, UnsupportedWitnessProgLenError(len(witnessProg))\n\t\t\t}\n\t\t}\n\t}\n\n\t// Serialized public keys are either 65 bytes (130 hex chars) if\n\t// uncompressed/hybrid or 33 bytes (66 hex chars) if compressed.\n\tif len(addr) == 130 || len(addr) == 66 {\n\t\tserializedPubKey, err := hex.DecodeString(addr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn NewAddressPubKey(serializedPubKey, defaultNet)\n\t}\n\n\t// Switch on decoded length to determine the type.\n\tdecoded, netID, err := base58.CheckDecode(addr)\n\tif err != nil {\n\t\tif err == base58.ErrChecksum {\n\t\t\treturn nil, ErrChecksumMismatch\n\t\t}\n\t\treturn nil, errors.New(\"decoded address is of unknown format\")\n\t}\n\tswitch len(decoded) {\n\tcase ripemd160.Size: // P2PKH or P2SH\n\t\tisP2PKH := netID == defaultNet.PubKeyHashAddrID\n\t\tisP2SH := netID == defaultNet.ScriptHashAddrID\n\t\tswitch hash160 := decoded; {\n\t\tcase isP2PKH && isP2SH:\n\t\t\treturn nil, ErrAddressCollision\n\t\tcase isP2PKH:\n\t\t\treturn newAddressPubKeyHash(hash160, netID)\n\t\tcase isP2SH:\n\t\t\treturn newAddressScriptHashFromHash(hash160, netID)\n\t\tdefault:\n\t\t\treturn nil, ErrUnknownAddressType\n\t\t}\n\n\tdefault:\n\t\treturn nil, errors.New(\"decoded address is of unknown size\")\n\t}\n}\n\n// decodeSegWitAddress parses a bech32 encoded segwit address string and\n// returns the witness version and witness program byte representation.\nfunc decodeSegWitAddress(address string) (byte, []byte, error) {\n\t// Decode the bech32 encoded address.\n\t_, data, err := bech32.Decode(address)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\t// The first byte of the decoded address is the witness version, it must\n\t// exist.\n\tif len(data) < 1 {\n\t\treturn 0, nil, fmt.Errorf(\"no witness version\")\n\t}\n\n\t// ...and be <= 16.\n\tversion := data[0]\n\tif version > 16 {\n\t\treturn 0, nil, fmt.Errorf(\"invalid witness version: %v\", version)\n\t}\n\n\t// The remaining characters of the address returned are grouped into\n\t// words of 5 bits. In order to restore the original witness program\n\t// bytes, we'll need to regroup into 8 bit words.\n\tregrouped, err := bech32.ConvertBits(data[1:], 5, 8, false)\n\tif err != nil {\n\t\treturn 0, nil, err\n\t}\n\n\t// The regrouped data must be between 2 and 40 bytes.\n\tif len(regrouped) < 2 || len(regrouped) > 40 {\n\t\treturn 0, nil, fmt.Errorf(\"invalid data length\")\n\t}\n\n\t// For witness version 0, address MUST be exactly 20 or 32 bytes.\n\tif version == 0 && len(regrouped) != 20 && len(regrouped) != 32 {\n\t\treturn 0, nil, fmt.Errorf(\"invalid data length for witness \"+\n\t\t\t\"version 0: %v\", len(regrouped))\n\t}\n\n\treturn version, regrouped, nil\n}\n\n// AddressPubKeyHash is an Address for a pay-to-pubkey-hash (P2PKH)\n// transaction.\ntype AddressPubKeyHash struct {\n\thash  [ripemd160.Size]byte\n\tnetID byte\n}\n\n// NewAddressPubKeyHash returns a new AddressPubKeyHash.  pkHash mustbe 20\n// bytes.\nfunc NewAddressPubKeyHash(pkHash []byte, net *chaincfg.Params) (*AddressPubKeyHash, error) {\n\treturn newAddressPubKeyHash(pkHash, net.PubKeyHashAddrID)\n}\n\n// newAddressPubKeyHash is the internal API to create a pubkey hash address\n// with a known leading identifier byte for a network, rather than looking\n// it up through its parameters.  This is useful when creating a new address\n// structure from a string encoding where the identifer byte is already\n// known.\nfunc newAddressPubKeyHash(pkHash []byte, netID byte) (*AddressPubKeyHash, error) {\n\t// Check for a valid pubkey hash length.\n\tif len(pkHash) != ripemd160.Size {\n\t\treturn nil, errors.New(\"pkHash must be 20 bytes\")\n\t}\n\n\taddr := &AddressPubKeyHash{netID: netID}\n\tcopy(addr.hash[:], pkHash)\n\treturn addr, nil\n}\n\n// EncodeAddress returns the string encoding of a pay-to-pubkey-hash\n// address.  Part of the Address interface.\nfunc (a *AddressPubKeyHash) EncodeAddress() string {\n\treturn encodeAddress(a.hash[:], a.netID)\n}\n\n// ScriptAddress returns the bytes to be included in a txout script to pay\n// to a pubkey hash.  Part of the Address interface.\nfunc (a *AddressPubKeyHash) ScriptAddress() []byte {\n\treturn a.hash[:]\n}\n\n// IsForNet returns whether or not the pay-to-pubkey-hash address is associated\n// with the passed bitcoin network.\nfunc (a *AddressPubKeyHash) IsForNet(net *chaincfg.Params) bool {\n\treturn a.netID == net.PubKeyHashAddrID\n}\n\n// String returns a human-readable string for the pay-to-pubkey-hash address.\n// This is equivalent to calling EncodeAddress, but is provided so the type can\n// be used as a fmt.Stringer.\nfunc (a *AddressPubKeyHash) String() string {\n\treturn a.EncodeAddress()\n}\n\n// Hash160 returns the underlying array of the pubkey hash.  This can be useful\n// when an array is more appropiate than a slice (for example, when used as map\n// keys).\nfunc (a *AddressPubKeyHash) Hash160() *[ripemd160.Size]byte {\n\treturn &a.hash\n}\n\n// AddressScriptHash is an Address for a pay-to-script-hash (P2SH)\n// transaction.\ntype AddressScriptHash struct {\n\thash  [ripemd160.Size]byte\n\tnetID byte\n}\n\n// NewAddressScriptHash returns a new AddressScriptHash.\nfunc NewAddressScriptHash(serializedScript []byte, net *chaincfg.Params) (*AddressScriptHash, error) {\n\tscriptHash := Hash160(serializedScript)\n\treturn newAddressScriptHashFromHash(scriptHash, net.ScriptHashAddrID)\n}\n\n// NewAddressScriptHashFromHash returns a new AddressScriptHash.  scriptHash\n// must be 20 bytes.\nfunc NewAddressScriptHashFromHash(scriptHash []byte, net *chaincfg.Params) (*AddressScriptHash, error) {\n\treturn newAddressScriptHashFromHash(scriptHash, net.ScriptHashAddrID)\n}\n\n// newAddressScriptHashFromHash is the internal API to create a script hash\n// address with a known leading identifier byte for a network, rather than\n// looking it up through its parameters.  This is useful when creating a new\n// address structure from a string encoding where the identifer byte is already\n// known.\nfunc newAddressScriptHashFromHash(scriptHash []byte, netID byte) (*AddressScriptHash, error) {\n\t// Check for a valid script hash length.\n\tif len(scriptHash) != ripemd160.Size {\n\t\treturn nil, errors.New(\"scriptHash must be 20 bytes\")\n\t}\n\n\taddr := &AddressScriptHash{netID: netID}\n\tcopy(addr.hash[:], scriptHash)\n\treturn addr, nil\n}\n\n// EncodeAddress returns the string encoding of a pay-to-script-hash\n// address.  Part of the Address interface.\nfunc (a *AddressScriptHash) EncodeAddress() string {\n\treturn encodeAddress(a.hash[:], a.netID)\n}\n\n// ScriptAddress returns the bytes to be included in a txout script to pay\n// to a script hash.  Part of the Address interface.\nfunc (a *AddressScriptHash) ScriptAddress() []byte {\n\treturn a.hash[:]\n}\n\n// IsForNet returns whether or not the pay-to-script-hash address is associated\n// with the passed bitcoin network.\nfunc (a *AddressScriptHash) IsForNet(net *chaincfg.Params) bool {\n\treturn a.netID == net.ScriptHashAddrID\n}\n\n// String returns a human-readable string for the pay-to-script-hash address.\n// This is equivalent to calling EncodeAddress, but is provided so the type can\n// be used as a fmt.Stringer.\nfunc (a *AddressScriptHash) String() string {\n\treturn a.EncodeAddress()\n}\n\n// Hash160 returns the underlying array of the script hash.  This can be useful\n// when an array is more appropiate than a slice (for example, when used as map\n// keys).\nfunc (a *AddressScriptHash) Hash160() *[ripemd160.Size]byte {\n\treturn &a.hash\n}\n\n// PubKeyFormat describes what format to use for a pay-to-pubkey address.\ntype PubKeyFormat int\n\nconst (\n\t// PKFUncompressed indicates the pay-to-pubkey address format is an\n\t// uncompressed public key.\n\tPKFUncompressed PubKeyFormat = iota\n\n\t// PKFCompressed indicates the pay-to-pubkey address format is a\n\t// compressed public key.\n\tPKFCompressed\n\n\t// PKFHybrid indicates the pay-to-pubkey address format is a hybrid\n\t// public key.\n\tPKFHybrid\n)\n\n// AddressPubKey is an Address for a pay-to-pubkey transaction.\ntype AddressPubKey struct {\n\tpubKeyFormat PubKeyFormat\n\tpubKey       *btcec.PublicKey\n\tpubKeyHashID byte\n}\n\n// NewAddressPubKey returns a new AddressPubKey which represents a pay-to-pubkey\n// address.  The serializedPubKey parameter must be a valid pubkey and can be\n// uncompressed, compressed, or hybrid.\nfunc NewAddressPubKey(serializedPubKey []byte, net *chaincfg.Params) (*AddressPubKey, error) {\n\tpubKey, err := btcec.ParsePubKey(serializedPubKey, btcec.S256())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Set the format of the pubkey.  This probably should be returned\n\t// from btcec, but do it here to avoid API churn.  We already know the\n\t// pubkey is valid since it parsed above, so it's safe to simply examine\n\t// the leading byte to get the format.\n\tpkFormat := PKFUncompressed\n\tswitch serializedPubKey[0] {\n\tcase 0x02, 0x03:\n\t\tpkFormat = PKFCompressed\n\tcase 0x06, 0x07:\n\t\tpkFormat = PKFHybrid\n\t}\n\n\treturn &AddressPubKey{\n\t\tpubKeyFormat: pkFormat,\n\t\tpubKey:       pubKey,\n\t\tpubKeyHashID: net.PubKeyHashAddrID,\n\t}, nil\n}\n\n// serialize returns the serialization of the public key according to the\n// format associated with the address.\nfunc (a *AddressPubKey) serialize() []byte {\n\tswitch a.pubKeyFormat {\n\tdefault:\n\t\tfallthrough\n\tcase PKFUncompressed:\n\t\treturn a.pubKey.SerializeUncompressed()\n\n\tcase PKFCompressed:\n\t\treturn a.pubKey.SerializeCompressed()\n\n\tcase PKFHybrid:\n\t\treturn a.pubKey.SerializeHybrid()\n\t}\n}\n\n// EncodeAddress returns the string encoding of the public key as a\n// pay-to-pubkey-hash.  Note that the public key format (uncompressed,\n// compressed, etc) will change the resulting address.  This is expected since\n// pay-to-pubkey-hash is a hash of the serialized public key which obviously\n// differs with the format.  At the time of this writing, most Bitcoin addresses\n// are pay-to-pubkey-hash constructed from the uncompressed public key.\n//\n// Part of the Address interface.\nfunc (a *AddressPubKey) EncodeAddress() string {\n\treturn encodeAddress(Hash160(a.serialize()), a.pubKeyHashID)\n}\n\n// ScriptAddress returns the bytes to be included in a txout script to pay\n// to a public key.  Setting the public key format will affect the output of\n// this function accordingly.  Part of the Address interface.\nfunc (a *AddressPubKey) ScriptAddress() []byte {\n\treturn a.serialize()\n}\n\n// IsForNet returns whether or not the pay-to-pubkey address is associated\n// with the passed bitcoin network.\nfunc (a *AddressPubKey) IsForNet(net *chaincfg.Params) bool {\n\treturn a.pubKeyHashID == net.PubKeyHashAddrID\n}\n\n// String returns the hex-encoded human-readable string for the pay-to-pubkey\n// address.  This is not the same as calling EncodeAddress.\nfunc (a *AddressPubKey) String() string {\n\treturn hex.EncodeToString(a.serialize())\n}\n\n// Format returns the format (uncompressed, compressed, etc) of the\n// pay-to-pubkey address.\nfunc (a *AddressPubKey) Format() PubKeyFormat {\n\treturn a.pubKeyFormat\n}\n\n// SetFormat sets the format (uncompressed, compressed, etc) of the\n// pay-to-pubkey address.\nfunc (a *AddressPubKey) SetFormat(pkFormat PubKeyFormat) {\n\ta.pubKeyFormat = pkFormat\n}\n\n// AddressPubKeyHash returns the pay-to-pubkey address converted to a\n// pay-to-pubkey-hash address.  Note that the public key format (uncompressed,\n// compressed, etc) will change the resulting address.  This is expected since\n// pay-to-pubkey-hash is a hash of the serialized public key which obviously\n// differs with the format.  At the time of this writing, most Bitcoin addresses\n// are pay-to-pubkey-hash constructed from the uncompressed public key.\nfunc (a *AddressPubKey) AddressPubKeyHash() *AddressPubKeyHash {\n\taddr := &AddressPubKeyHash{netID: a.pubKeyHashID}\n\tcopy(addr.hash[:], Hash160(a.serialize()))\n\treturn addr\n}\n\n// PubKey returns the underlying public key for the address.\nfunc (a *AddressPubKey) PubKey() *btcec.PublicKey {\n\treturn a.pubKey\n}\n\n// AddressWitnessPubKeyHash is an Address for a pay-to-witness-pubkey-hash\n// (P2WPKH) output. See BIP 173 for further details regarding native segregated\n// witness address encoding:\n// https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki\ntype AddressWitnessPubKeyHash struct {\n\thrp            string\n\twitnessVersion byte\n\twitnessProgram [20]byte\n}\n\n// NewAddressWitnessPubKeyHash returns a new AddressWitnessPubKeyHash.\nfunc NewAddressWitnessPubKeyHash(witnessProg []byte, net *chaincfg.Params) (*AddressWitnessPubKeyHash, error) {\n\treturn newAddressWitnessPubKeyHash(net.Bech32HRPSegwit, witnessProg)\n}\n\n// newAddressWitnessPubKeyHash is an internal helper function to create an\n// AddressWitnessPubKeyHash with a known human-readable part, rather than\n// looking it up through its parameters.\nfunc newAddressWitnessPubKeyHash(hrp string, witnessProg []byte) (*AddressWitnessPubKeyHash, error) {\n\t// Check for valid program length for witness version 0, which is 20\n\t// for P2WPKH.\n\tif len(witnessProg) != 20 {\n\t\treturn nil, errors.New(\"witness program must be 20 \" +\n\t\t\t\"bytes for p2wpkh\")\n\t}\n\n\taddr := &AddressWitnessPubKeyHash{\n\t\thrp:            strings.ToLower(hrp),\n\t\twitnessVersion: 0x00,\n\t}\n\n\tcopy(addr.witnessProgram[:], witnessProg)\n\n\treturn addr, nil\n}\n\n// EncodeAddress returns the bech32 string encoding of an\n// AddressWitnessPubKeyHash.\n// Part of the Address interface.\nfunc (a *AddressWitnessPubKeyHash) EncodeAddress() string {\n\tstr, err := encodeSegWitAddress(a.hrp, a.witnessVersion,\n\t\ta.witnessProgram[:])\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn str\n}\n\n// ScriptAddress returns the witness program for this address.\n// Part of the Address interface.\nfunc (a *AddressWitnessPubKeyHash) ScriptAddress() []byte {\n\treturn a.witnessProgram[:]\n}\n\n// IsForNet returns whether or not the AddressWitnessPubKeyHash is associated\n// with the passed bitcoin network.\n// Part of the Address interface.\nfunc (a *AddressWitnessPubKeyHash) IsForNet(net *chaincfg.Params) bool {\n\treturn a.hrp == net.Bech32HRPSegwit\n}\n\n// String returns a human-readable string for the AddressWitnessPubKeyHash.\n// This is equivalent to calling EncodeAddress, but is provided so the type\n// can be used as a fmt.Stringer.\n// Part of the Address interface.\nfunc (a *AddressWitnessPubKeyHash) String() string {\n\treturn a.EncodeAddress()\n}\n\n// Hrp returns the human-readable part of the bech32 encoded\n// AddressWitnessPubKeyHash.\nfunc (a *AddressWitnessPubKeyHash) Hrp() string {\n\treturn a.hrp\n}\n\n// WitnessVersion returns the witness version of the AddressWitnessPubKeyHash.\nfunc (a *AddressWitnessPubKeyHash) WitnessVersion() byte {\n\treturn a.witnessVersion\n}\n\n// WitnessProgram returns the witness program of the AddressWitnessPubKeyHash.\nfunc (a *AddressWitnessPubKeyHash) WitnessProgram() []byte {\n\treturn a.witnessProgram[:]\n}\n\n// Hash160 returns the witness program of the AddressWitnessPubKeyHash as a\n// byte array.\nfunc (a *AddressWitnessPubKeyHash) Hash160() *[20]byte {\n\treturn &a.witnessProgram\n}\n\n// AddressWitnessScriptHash is an Address for a pay-to-witness-script-hash\n// (P2WSH) output. See BIP 173 for further details regarding native segregated\n// witness address encoding:\n// https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki\ntype AddressWitnessScriptHash struct {\n\thrp            string\n\twitnessVersion byte\n\twitnessProgram [32]byte\n}\n\n// NewAddressWitnessScriptHash returns a new AddressWitnessPubKeyHash.\nfunc NewAddressWitnessScriptHash(witnessProg []byte, net *chaincfg.Params) (*AddressWitnessScriptHash, error) {\n\treturn newAddressWitnessScriptHash(net.Bech32HRPSegwit, witnessProg)\n}\n\n// newAddressWitnessScriptHash is an internal helper function to create an\n// AddressWitnessScriptHash with a known human-readable part, rather than\n// looking it up through its parameters.\nfunc newAddressWitnessScriptHash(hrp string, witnessProg []byte) (*AddressWitnessScriptHash, error) {\n\t// Check for valid program length for witness version 0, which is 32\n\t// for P2WSH.\n\tif len(witnessProg) != 32 {\n\t\treturn nil, errors.New(\"witness program must be 32 \" +\n\t\t\t\"bytes for p2wsh\")\n\t}\n\n\taddr := &AddressWitnessScriptHash{\n\t\thrp:            strings.ToLower(hrp),\n\t\twitnessVersion: 0x00,\n\t}\n\n\tcopy(addr.witnessProgram[:], witnessProg)\n\n\treturn addr, nil\n}\n\n// EncodeAddress returns the bech32 string encoding of an\n// AddressWitnessScriptHash.\n// Part of the Address interface.\nfunc (a *AddressWitnessScriptHash) EncodeAddress() string {\n\tstr, err := encodeSegWitAddress(a.hrp, a.witnessVersion,\n\t\ta.witnessProgram[:])\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn str\n}\n\n// ScriptAddress returns the witness program for this address.\n// Part of the Address interface.\nfunc (a *AddressWitnessScriptHash) ScriptAddress() []byte {\n\treturn a.witnessProgram[:]\n}\n\n// IsForNet returns whether or not the AddressWitnessScriptHash is associated\n// with the passed bitcoin network.\n// Part of the Address interface.\nfunc (a *AddressWitnessScriptHash) IsForNet(net *chaincfg.Params) bool {\n\treturn a.hrp == net.Bech32HRPSegwit\n}\n\n// String returns a human-readable string for the AddressWitnessScriptHash.\n// This is equivalent to calling EncodeAddress, but is provided so the type\n// can be used as a fmt.Stringer.\n// Part of the Address interface.\nfunc (a *AddressWitnessScriptHash) String() string {\n\treturn a.EncodeAddress()\n}\n\n// Hrp returns the human-readable part of the bech32 encoded\n// AddressWitnessScriptHash.\nfunc (a *AddressWitnessScriptHash) Hrp() string {\n\treturn a.hrp\n}\n\n// WitnessVersion returns the witness version of the AddressWitnessScriptHash.\nfunc (a *AddressWitnessScriptHash) WitnessVersion() byte {\n\treturn a.witnessVersion\n}\n\n// WitnessProgram returns the witness program of the AddressWitnessScriptHash.\nfunc (a *AddressWitnessScriptHash) WitnessProgram() []byte {\n\treturn a.witnessProgram[:]\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/amount.go",
    "content": "// Copyright (c) 2013, 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"errors\"\n\t\"math\"\n\t\"strconv\"\n)\n\n// AmountUnit describes a method of converting an Amount to something\n// other than the base unit of a bitcoin.  The value of the AmountUnit\n// is the exponent component of the decadic multiple to convert from\n// an amount in bitcoin to an amount counted in units.\ntype AmountUnit int\n\n// These constants define various units used when describing a bitcoin\n// monetary amount.\nconst (\n\tAmountMegaBTC  AmountUnit = 6\n\tAmountKiloBTC  AmountUnit = 3\n\tAmountBTC      AmountUnit = 0\n\tAmountMilliBTC AmountUnit = -3\n\tAmountMicroBTC AmountUnit = -6\n\tAmountSatoshi  AmountUnit = -8\n)\n\n// String returns the unit as a string.  For recognized units, the SI\n// prefix is used, or \"Satoshi\" for the base unit.  For all unrecognized\n// units, \"1eN BTC\" is returned, where N is the AmountUnit.\nfunc (u AmountUnit) String() string {\n\tswitch u {\n\tcase AmountMegaBTC:\n\t\treturn \"MBTC\"\n\tcase AmountKiloBTC:\n\t\treturn \"kBTC\"\n\tcase AmountBTC:\n\t\treturn \"BTC\"\n\tcase AmountMilliBTC:\n\t\treturn \"mBTC\"\n\tcase AmountMicroBTC:\n\t\treturn \"μBTC\"\n\tcase AmountSatoshi:\n\t\treturn \"Satoshi\"\n\tdefault:\n\t\treturn \"1e\" + strconv.FormatInt(int64(u), 10) + \" BTC\"\n\t}\n}\n\n// Amount represents the base bitcoin monetary unit (colloquially referred\n// to as a `Satoshi').  A single Amount is equal to 1e-8 of a bitcoin.\ntype Amount int64\n\n// round converts a floating point number, which may or may not be representable\n// as an integer, to the Amount integer type by rounding to the nearest integer.\n// This is performed by adding or subtracting 0.5 depending on the sign, and\n// relying on integer truncation to round the value to the nearest Amount.\nfunc round(f float64) Amount {\n\tif f < 0 {\n\t\treturn Amount(f - 0.5)\n\t}\n\treturn Amount(f + 0.5)\n}\n\n// NewAmount creates an Amount from a floating point value representing\n// some value in bitcoin.  NewAmount errors if f is NaN or +-Infinity, but\n// does not check that the amount is within the total amount of bitcoin\n// producible as f may not refer to an amount at a single moment in time.\n//\n// NewAmount is for specifically for converting BTC to Satoshi.\n// For creating a new Amount with an int64 value which denotes a quantity of Satoshi,\n// do a simple type conversion from type int64 to Amount.\n// See GoDoc for example: http://godoc.org/github.com/btcsuite/btcutil#example-Amount\nfunc NewAmount(f float64) (Amount, error) {\n\t// The amount is only considered invalid if it cannot be represented\n\t// as an integer type.  This may happen if f is NaN or +-Infinity.\n\tswitch {\n\tcase math.IsNaN(f):\n\t\tfallthrough\n\tcase math.IsInf(f, 1):\n\t\tfallthrough\n\tcase math.IsInf(f, -1):\n\t\treturn 0, errors.New(\"invalid bitcoin amount\")\n\t}\n\n\treturn round(f * SatoshiPerBitcoin), nil\n}\n\n// ToUnit converts a monetary amount counted in bitcoin base units to a\n// floating point value representing an amount of bitcoin.\nfunc (a Amount) ToUnit(u AmountUnit) float64 {\n\treturn float64(a) / math.Pow10(int(u+8))\n}\n\n// ToBTC is the equivalent of calling ToUnit with AmountBTC.\nfunc (a Amount) ToBTC() float64 {\n\treturn a.ToUnit(AmountBTC)\n}\n\n// Format formats a monetary amount counted in bitcoin base units as a\n// string for a given unit.  The conversion will succeed for any unit,\n// however, known units will be formated with an appended label describing\n// the units with SI notation, or \"Satoshi\" for the base unit.\nfunc (a Amount) Format(u AmountUnit) string {\n\tunits := \" \" + u.String()\n\treturn strconv.FormatFloat(a.ToUnit(u), 'f', -int(u+8), 64) + units\n}\n\n// String is the equivalent of calling Format with AmountBTC.\nfunc (a Amount) String() string {\n\treturn a.Format(AmountBTC)\n}\n\n// MulF64 multiplies an Amount by a floating point value.  While this is not\n// an operation that must typically be done by a full node or wallet, it is\n// useful for services that build on top of bitcoin (for example, calculating\n// a fee by multiplying by a percentage).\nfunc (a Amount) MulF64(f float64) Amount {\n\treturn round(float64(a) * f)\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/appdata.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"unicode\"\n)\n\n// appDataDir returns an operating system specific directory to be used for\n// storing application data for an application.  See AppDataDir for more\n// details.  This unexported version takes an operating system argument\n// primarily to enable the testing package to properly test the function by\n// forcing an operating system that is not the currently one.\nfunc appDataDir(goos, appName string, roaming bool) string {\n\tif appName == \"\" || appName == \".\" {\n\t\treturn \".\"\n\t}\n\n\t// The caller really shouldn't prepend the appName with a period, but\n\t// if they do, handle it gracefully by trimming it.\n\tappName = strings.TrimPrefix(appName, \".\")\n\tappNameUpper := string(unicode.ToUpper(rune(appName[0]))) + appName[1:]\n\tappNameLower := string(unicode.ToLower(rune(appName[0]))) + appName[1:]\n\n\t// Get the OS specific home directory via the Go standard lib.\n\tvar homeDir string\n\tusr, err := user.Current()\n\tif err == nil {\n\t\thomeDir = usr.HomeDir\n\t}\n\n\t// Fall back to standard HOME environment variable that works\n\t// for most POSIX OSes if the directory from the Go standard\n\t// lib failed.\n\tif err != nil || homeDir == \"\" {\n\t\thomeDir = os.Getenv(\"HOME\")\n\t}\n\n\tswitch goos {\n\t// Attempt to use the LOCALAPPDATA or APPDATA environment variable on\n\t// Windows.\n\tcase \"windows\":\n\t\t// Windows XP and before didn't have a LOCALAPPDATA, so fallback\n\t\t// to regular APPDATA when LOCALAPPDATA is not set.\n\t\tappData := os.Getenv(\"LOCALAPPDATA\")\n\t\tif roaming || appData == \"\" {\n\t\t\tappData = os.Getenv(\"APPDATA\")\n\t\t}\n\n\t\tif appData != \"\" {\n\t\t\treturn filepath.Join(appData, appNameUpper)\n\t\t}\n\n\tcase \"darwin\":\n\t\tif homeDir != \"\" {\n\t\t\treturn filepath.Join(homeDir, \"Library\",\n\t\t\t\t\"Application Support\", appNameUpper)\n\t\t}\n\n\tcase \"plan9\":\n\t\tif homeDir != \"\" {\n\t\t\treturn filepath.Join(homeDir, appNameLower)\n\t\t}\n\n\tdefault:\n\t\tif homeDir != \"\" {\n\t\t\treturn filepath.Join(homeDir, \".\"+appNameLower)\n\t\t}\n\t}\n\n\t// Fall back to the current directory if all else fails.\n\treturn \".\"\n}\n\n// AppDataDir returns an operating system specific directory to be used for\n// storing application data for an application.\n//\n// The appName parameter is the name of the application the data directory is\n// being requested for.  This function will prepend a period to the appName for\n// POSIX style operating systems since that is standard practice.  An empty\n// appName or one with a single dot is treated as requesting the current\n// directory so only \".\" will be returned.  Further, the first character\n// of appName will be made lowercase for POSIX style operating systems and\n// uppercase for Mac and Windows since that is standard practice.\n//\n// The roaming parameter only applies to Windows where it specifies the roaming\n// application data profile (%APPDATA%) should be used instead of the local one\n// (%LOCALAPPDATA%) that is used by default.\n//\n// Example results:\n//  dir := AppDataDir(\"myapp\", false)\n//   POSIX (Linux/BSD): ~/.myapp\n//   Mac OS: $HOME/Library/Application Support/Myapp\n//   Windows: %LOCALAPPDATA%\\Myapp\n//   Plan 9: $home/myapp\nfunc AppDataDir(appName string, roaming bool) string {\n\treturn appDataDir(runtime.GOOS, appName, roaming)\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/base58/README.md",
    "content": "base58\n==========\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/btcsuite/btcutil/base58)\n\nPackage base58 provides an API for encoding and decoding to and from the\nmodified base58 encoding.  It also provides an API to do Base58Check encoding,\nas described [here](https://en.bitcoin.it/wiki/Base58Check_encoding).\n\nA comprehensive suite of tests is provided to ensure proper functionality.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcutil/base58\n```\n\n## Examples\n\n* [Decode Example](http://godoc.org/github.com/btcsuite/btcutil/base58#example-Decode)  \n  Demonstrates how to decode modified base58 encoded data.\n* [Encode Example](http://godoc.org/github.com/btcsuite/btcutil/base58#example-Encode)  \n  Demonstrates how to encode data using the modified base58 encoding scheme.\n* [CheckDecode Example](http://godoc.org/github.com/btcsuite/btcutil/base58#example-CheckDecode)  \n  Demonstrates how to decode Base58Check encoded data.\n* [CheckEncode Example](http://godoc.org/github.com/btcsuite/btcutil/base58#example-CheckEncode)  \n  Demonstrates how to encode data using the Base58Check encoding scheme.\n\n## License\n\nPackage base58 is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/base58/alphabet.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// AUTOGENERATED by genalphabet.go; do not edit.\n\npackage base58\n\nconst (\n\t// alphabet is the modified base58 alphabet used by Bitcoin.\n\talphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n\n\talphabetIdx0 = '1'\n)\n\nvar b58 = [256]byte{\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 0, 1, 2, 3, 4, 5, 6,\n\t7, 8, 255, 255, 255, 255, 255, 255,\n\t255, 9, 10, 11, 12, 13, 14, 15,\n\t16, 255, 17, 18, 19, 20, 21, 255,\n\t22, 23, 24, 25, 26, 27, 28, 29,\n\t30, 31, 32, 255, 255, 255, 255, 255,\n\t255, 33, 34, 35, 36, 37, 38, 39,\n\t40, 41, 42, 43, 255, 44, 45, 46,\n\t47, 48, 49, 50, 51, 52, 53, 54,\n\t55, 56, 57, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255,\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/base58/base58.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58\n\nimport (\n\t\"math/big\"\n)\n\n//go:generate go run genalphabet.go\n\nvar bigRadix = big.NewInt(58)\nvar bigZero = big.NewInt(0)\n\n// Decode decodes a modified base58 string to a byte slice.\nfunc Decode(b string) []byte {\n\tanswer := big.NewInt(0)\n\tj := big.NewInt(1)\n\n\tscratch := new(big.Int)\n\tfor i := len(b) - 1; i >= 0; i-- {\n\t\ttmp := b58[b[i]]\n\t\tif tmp == 255 {\n\t\t\treturn []byte(\"\")\n\t\t}\n\t\tscratch.SetInt64(int64(tmp))\n\t\tscratch.Mul(j, scratch)\n\t\tanswer.Add(answer, scratch)\n\t\tj.Mul(j, bigRadix)\n\t}\n\n\ttmpval := answer.Bytes()\n\n\tvar numZeros int\n\tfor numZeros = 0; numZeros < len(b); numZeros++ {\n\t\tif b[numZeros] != alphabetIdx0 {\n\t\t\tbreak\n\t\t}\n\t}\n\tflen := numZeros + len(tmpval)\n\tval := make([]byte, flen)\n\tcopy(val[numZeros:], tmpval)\n\n\treturn val\n}\n\n// Encode encodes a byte slice to a modified base58 string.\nfunc Encode(b []byte) string {\n\tx := new(big.Int)\n\tx.SetBytes(b)\n\n\tanswer := make([]byte, 0, len(b)*136/100)\n\tfor x.Cmp(bigZero) > 0 {\n\t\tmod := new(big.Int)\n\t\tx.DivMod(x, bigRadix, mod)\n\t\tanswer = append(answer, alphabet[mod.Int64()])\n\t}\n\n\t// leading zero bytes\n\tfor _, i := range b {\n\t\tif i != 0 {\n\t\t\tbreak\n\t\t}\n\t\tanswer = append(answer, alphabetIdx0)\n\t}\n\n\t// reverse\n\talen := len(answer)\n\tfor i := 0; i < alen/2; i++ {\n\t\tanswer[i], answer[alen-1-i] = answer[alen-1-i], answer[i]\n\t}\n\n\treturn string(answer)\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/base58/base58check.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage base58\n\nimport (\n\t\"crypto/sha256\"\n\t\"errors\"\n)\n\n// ErrChecksum indicates that the checksum of a check-encoded string does not verify against\n// the checksum.\nvar ErrChecksum = errors.New(\"checksum error\")\n\n// ErrInvalidFormat indicates that the check-encoded string has an invalid format.\nvar ErrInvalidFormat = errors.New(\"invalid format: version and/or checksum bytes missing\")\n\n// checksum: first four bytes of sha256^2\nfunc checksum(input []byte) (cksum [4]byte) {\n\th := sha256.Sum256(input)\n\th2 := sha256.Sum256(h[:])\n\tcopy(cksum[:], h2[:4])\n\treturn\n}\n\n// CheckEncode prepends a version byte and appends a four byte checksum.\nfunc CheckEncode(input []byte, version byte) string {\n\tb := make([]byte, 0, 1+len(input)+4)\n\tb = append(b, version)\n\tb = append(b, input[:]...)\n\tcksum := checksum(b)\n\tb = append(b, cksum[:]...)\n\treturn Encode(b)\n}\n\n// CheckDecode decodes a string that was encoded with CheckEncode and verifies the checksum.\nfunc CheckDecode(input string) (result []byte, version byte, err error) {\n\tdecoded := Decode(input)\n\tif len(decoded) < 5 {\n\t\treturn nil, 0, ErrInvalidFormat\n\t}\n\tversion = decoded[0]\n\tvar cksum [4]byte\n\tcopy(cksum[:], decoded[len(decoded)-4:])\n\tif checksum(decoded[:len(decoded)-4]) != cksum {\n\t\treturn nil, 0, ErrChecksum\n\t}\n\tpayload := decoded[1 : len(decoded)-4]\n\tresult = append(result, payload...)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/base58/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses gocov to generate a test coverage report.\n# The gocov tool my be obtained with the following command:\n#   go get github.com/axw/gocov/gocov\n#\n# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH.\n\n# Check for gocov.\ntype gocov >/dev/null 2>&1\nif [ $? -ne 0 ]; then\n\techo >&2 \"This script requires the gocov tool.\"\n\techo >&2 \"You may obtain it with the following command:\"\n\techo >&2 \"go get github.com/axw/gocov/gocov\"\n\texit 1\nfi\ngocov test | gocov report\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/base58/doc.go",
    "content": "// Copyright (c) 2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage base58 provides an API for working with modified base58 and Base58Check\nencodings.\n\nModified Base58 Encoding\n\nStandard base58 encoding is similar to standard base64 encoding except, as the\nname implies, it uses a 58 character alphabet which results in an alphanumeric\nstring and allows some characters which are problematic for humans to be\nexcluded.  Due to this, there can be various base58 alphabets.\n\nThe modified base58 alphabet used by Bitcoin, and hence this package, omits the\n0, O, I, and l characters that look the same in many fonts and are therefore\nhard to humans to distinguish.\n\nBase58Check Encoding Scheme\n\nThe Base58Check encoding scheme is primarily used for Bitcoin addresses at the\ntime of this writing, however it can be used to generically encode arbitrary\nbyte arrays into human-readable strings along with a version byte that can be\nused to differentiate the same payload.  For Bitcoin addresses, the extra\nversion is used to differentiate the network of otherwise identical public keys\nwhich helps prevent using an address intended for one network on another.\n*/\npackage base58\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/base58/genalphabet.go",
    "content": "// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n//+build ignore\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"strconv\"\n)\n\nvar (\n\tstart = []byte(`// Copyright (c) 2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// AUTOGENERATED by genalphabet.go; do not edit.\n\npackage base58\n\nconst (\n\t// alphabet is the modified base58 alphabet used by Bitcoin.\n\talphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n\n\talphabetIdx0 = '1'\n)\n\nvar b58 = [256]byte{`)\n\n\tend = []byte(`}`)\n\n\talphabet = []byte(\"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\")\n\ttab      = []byte(\"\\t\")\n\tinvalid  = []byte(\"255\")\n\tcomma    = []byte(\",\")\n\tspace    = []byte(\" \")\n\tnl       = []byte(\"\\n\")\n)\n\nfunc write(w io.Writer, b []byte) {\n\t_, err := w.Write(b)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc main() {\n\tfi, err := os.Create(\"alphabet.go\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tdefer fi.Close()\n\n\twrite(fi, start)\n\twrite(fi, nl)\n\tfor i := byte(0); i < 32; i++ {\n\t\twrite(fi, tab)\n\t\tfor j := byte(0); j < 8; j++ {\n\t\t\tidx := bytes.IndexByte(alphabet, i*8+j)\n\t\t\tif idx == -1 {\n\t\t\t\twrite(fi, invalid)\n\t\t\t} else {\n\t\t\t\twrite(fi, strconv.AppendInt(nil, int64(idx), 10))\n\t\t\t}\n\t\t\twrite(fi, comma)\n\t\t\tif j != 7 {\n\t\t\t\twrite(fi, space)\n\t\t\t}\n\t\t}\n\t\twrite(fi, nl)\n\t}\n\twrite(fi, end)\n\twrite(fi, nl)\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/bech32/README.md",
    "content": "bech32\n==========\n\n[![Build Status](http://img.shields.io/travis/btcsuite/btcutil.svg)](https://travis-ci.org/btcsuite/btcutil)\n[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org)\n[![GoDoc](https://godoc.org/github.com/btcsuite/btcutil/bech32?status.png)](http://godoc.org/github.com/btcsuite/btcutil/bech32)\n\nPackage bech32 provides a Go implementation of the bech32 format specified in\n[BIP 173](https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki).\n\nTest vectors from BIP 173 are added to ensure compatibility with the BIP.\n\n## Installation and Updating\n\n```bash\n$ go get -u github.com/btcsuite/btcutil/bech32\n```\n\n## Examples\n\n* [Bech32 decode Example](http://godoc.org/github.com/btcsuite/btcutil/bech32#example-Bech32Decode)\n  Demonstrates how to decode a bech32 encoded string.\n* [Bech32 encode Example](http://godoc.org/github.com/btcsuite/btcutil/bech32#example-BechEncode)\n  Demonstrates how to encode data into a bech32 string.\n\n## License\n\nPackage bech32 is licensed under the [copyfree](http://copyfree.org) ISC\nLicense.\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/bech32/bech32.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage bech32\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\nconst charset = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\"\n\nvar gen = []int{0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3}\n\n// Decode decodes a bech32 encoded string, returning the human-readable\n// part and the data part excluding the checksum.\nfunc Decode(bech string) (string, []byte, error) {\n\t// The maximum allowed length for a bech32 string is 90. It must also\n\t// be at least 8 characters, since it needs a non-empty HRP, a\n\t// separator, and a 6 character checksum.\n\tif len(bech) < 8 || len(bech) > 90 {\n\t\treturn \"\", nil, fmt.Errorf(\"invalid bech32 string length %d\",\n\t\t\tlen(bech))\n\t}\n\t// Only\tASCII characters between 33 and 126 are allowed.\n\tfor i := 0; i < len(bech); i++ {\n\t\tif bech[i] < 33 || bech[i] > 126 {\n\t\t\treturn \"\", nil, fmt.Errorf(\"invalid character in \"+\n\t\t\t\t\"string: '%c'\", bech[i])\n\t\t}\n\t}\n\n\t// The characters must be either all lowercase or all uppercase.\n\tlower := strings.ToLower(bech)\n\tupper := strings.ToUpper(bech)\n\tif bech != lower && bech != upper {\n\t\treturn \"\", nil, fmt.Errorf(\"string not all lowercase or all \" +\n\t\t\t\"uppercase\")\n\t}\n\n\t// We'll work with the lowercase string from now on.\n\tbech = lower\n\n\t// The string is invalid if the last '1' is non-existent, it is the\n\t// first character of the string (no human-readable part) or one of the\n\t// last 6 characters of the string (since checksum cannot contain '1'),\n\t// or if the string is more than 90 characters in total.\n\tone := strings.LastIndexByte(bech, '1')\n\tif one < 1 || one+7 > len(bech) {\n\t\treturn \"\", nil, fmt.Errorf(\"invalid index of 1\")\n\t}\n\n\t// The human-readable part is everything before the last '1'.\n\thrp := bech[:one]\n\tdata := bech[one+1:]\n\n\t// Each character corresponds to the byte with value of the index in\n\t// 'charset'.\n\tdecoded, err := toBytes(data)\n\tif err != nil {\n\t\treturn \"\", nil, fmt.Errorf(\"failed converting data to bytes: \"+\n\t\t\t\"%v\", err)\n\t}\n\n\tif !bech32VerifyChecksum(hrp, decoded) {\n\t\tmoreInfo := \"\"\n\t\tchecksum := bech[len(bech)-6:]\n\t\texpected, err := toChars(bech32Checksum(hrp,\n\t\t\tdecoded[:len(decoded)-6]))\n\t\tif err == nil {\n\t\t\tmoreInfo = fmt.Sprintf(\"Expected %v, got %v.\",\n\t\t\t\texpected, checksum)\n\t\t}\n\t\treturn \"\", nil, fmt.Errorf(\"checksum failed. \" + moreInfo)\n\t}\n\n\t// We exclude the last 6 bytes, which is the checksum.\n\treturn hrp, decoded[:len(decoded)-6], nil\n}\n\n// Encode encodes a byte slice into a bech32 string with the\n// human-readable part hrb. Note that the bytes must each encode 5 bits\n// (base32).\nfunc Encode(hrp string, data []byte) (string, error) {\n\t// Calculate the checksum of the data and append it at the end.\n\tchecksum := bech32Checksum(hrp, data)\n\tcombined := append(data, checksum...)\n\n\t// The resulting bech32 string is the concatenation of the hrp, the\n\t// separator 1, data and checksum. Everything after the separator is\n\t// represented using the specified charset.\n\tdataChars, err := toChars(combined)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"unable to convert data bytes to chars: \"+\n\t\t\t\"%v\", err)\n\t}\n\treturn hrp + \"1\" + dataChars, nil\n}\n\n// toBytes converts each character in the string 'chars' to the value of the\n// index of the correspoding character in 'charset'.\nfunc toBytes(chars string) ([]byte, error) {\n\tdecoded := make([]byte, 0, len(chars))\n\tfor i := 0; i < len(chars); i++ {\n\t\tindex := strings.IndexByte(charset, chars[i])\n\t\tif index < 0 {\n\t\t\treturn nil, fmt.Errorf(\"invalid character not part of \"+\n\t\t\t\t\"charset: %v\", chars[i])\n\t\t}\n\t\tdecoded = append(decoded, byte(index))\n\t}\n\treturn decoded, nil\n}\n\n// toChars converts the byte slice 'data' to a string where each byte in 'data'\n// encodes the index of a character in 'charset'.\nfunc toChars(data []byte) (string, error) {\n\tresult := make([]byte, 0, len(data))\n\tfor _, b := range data {\n\t\tif int(b) >= len(charset) {\n\t\t\treturn \"\", fmt.Errorf(\"invalid data byte: %v\", b)\n\t\t}\n\t\tresult = append(result, charset[b])\n\t}\n\treturn string(result), nil\n}\n\n// ConvertBits converts a byte slice where each byte is encoding fromBits bits,\n// to a byte slice where each byte is encoding toBits bits.\nfunc ConvertBits(data []byte, fromBits, toBits uint8, pad bool) ([]byte, error) {\n\tif fromBits < 1 || fromBits > 8 || toBits < 1 || toBits > 8 {\n\t\treturn nil, fmt.Errorf(\"only bit groups between 1 and 8 allowed\")\n\t}\n\n\t// The final bytes, each byte encoding toBits bits.\n\tvar regrouped []byte\n\n\t// Keep track of the next byte we create and how many bits we have\n\t// added to it out of the toBits goal.\n\tnextByte := byte(0)\n\tfilledBits := uint8(0)\n\n\tfor _, b := range data {\n\n\t\t// Discard unused bits.\n\t\tb = b << (8 - fromBits)\n\n\t\t// How many bits remaining to extract from the input data.\n\t\tremFromBits := fromBits\n\t\tfor remFromBits > 0 {\n\t\t\t// How many bits remaining to be added to the next byte.\n\t\t\tremToBits := toBits - filledBits\n\n\t\t\t// The number of bytes to next extract is the minimum of\n\t\t\t// remFromBits and remToBits.\n\t\t\ttoExtract := remFromBits\n\t\t\tif remToBits < toExtract {\n\t\t\t\ttoExtract = remToBits\n\t\t\t}\n\n\t\t\t// Add the next bits to nextByte, shifting the already\n\t\t\t// added bits to the left.\n\t\t\tnextByte = (nextByte << toExtract) | (b >> (8 - toExtract))\n\n\t\t\t// Discard the bits we just extracted and get ready for\n\t\t\t// next iteration.\n\t\t\tb = b << toExtract\n\t\t\tremFromBits -= toExtract\n\t\t\tfilledBits += toExtract\n\n\t\t\t// If the nextByte is completely filled, we add it to\n\t\t\t// our regrouped bytes and start on the next byte.\n\t\t\tif filledBits == toBits {\n\t\t\t\tregrouped = append(regrouped, nextByte)\n\t\t\t\tfilledBits = 0\n\t\t\t\tnextByte = 0\n\t\t\t}\n\t\t}\n\t}\n\n\t// We pad any unfinished group if specified.\n\tif pad && filledBits > 0 {\n\t\tnextByte = nextByte << (toBits - filledBits)\n\t\tregrouped = append(regrouped, nextByte)\n\t\tfilledBits = 0\n\t\tnextByte = 0\n\t}\n\n\t// Any incomplete group must be <= 4 bits, and all zeroes.\n\tif filledBits > 0 && (filledBits > 4 || nextByte != 0) {\n\t\treturn nil, fmt.Errorf(\"invalid incomplete group\")\n\t}\n\n\treturn regrouped, nil\n}\n\n// For more details on the checksum calculation, please refer to BIP 173.\nfunc bech32Checksum(hrp string, data []byte) []byte {\n\t// Convert the bytes to list of integers, as this is needed for the\n\t// checksum calculation.\n\tintegers := make([]int, len(data))\n\tfor i, b := range data {\n\t\tintegers[i] = int(b)\n\t}\n\tvalues := append(bech32HrpExpand(hrp), integers...)\n\tvalues = append(values, []int{0, 0, 0, 0, 0, 0}...)\n\tpolymod := bech32Polymod(values) ^ 1\n\tvar res []byte\n\tfor i := 0; i < 6; i++ {\n\t\tres = append(res, byte((polymod>>uint(5*(5-i)))&31))\n\t}\n\treturn res\n}\n\n// For more details on the polymod calculation, please refer to BIP 173.\nfunc bech32Polymod(values []int) int {\n\tchk := 1\n\tfor _, v := range values {\n\t\tb := chk >> 25\n\t\tchk = (chk&0x1ffffff)<<5 ^ v\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tif (b>>uint(i))&1 == 1 {\n\t\t\t\tchk ^= gen[i]\n\t\t\t}\n\t\t}\n\t}\n\treturn chk\n}\n\n// For more details on HRP expansion, please refer to BIP 173.\nfunc bech32HrpExpand(hrp string) []int {\n\tv := make([]int, 0, len(hrp)*2+1)\n\tfor i := 0; i < len(hrp); i++ {\n\t\tv = append(v, int(hrp[i]>>5))\n\t}\n\tv = append(v, 0)\n\tfor i := 0; i < len(hrp); i++ {\n\t\tv = append(v, int(hrp[i]&31))\n\t}\n\treturn v\n}\n\n// For more details on the checksum verification, please refer to BIP 173.\nfunc bech32VerifyChecksum(hrp string, data []byte) bool {\n\tintegers := make([]int, len(data))\n\tfor i, b := range data {\n\t\tintegers[i] = int(b)\n\t}\n\tconcat := append(bech32HrpExpand(hrp), integers...)\n\treturn bech32Polymod(concat) == 1\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/bech32/doc.go",
    "content": "// Copyright (c) 2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage bech32 provides a Go implementation of the bech32 format specified in\nBIP 173.\n\nBech32 strings consist of a human-readable part (hrp), followed by the\nseparator 1, then a checksummed data part encoded using the 32 characters\n\"qpzry9x8gf2tvdw0s3jn54khce6mua7l\".\n\nMore info: https://github.com/bitcoin/bips/blob/master/bip-0173.mediawiki\n*/\npackage bech32\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/block.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// OutOfRangeError describes an error due to accessing an element that is out\n// of range.\ntype OutOfRangeError string\n\n// BlockHeightUnknown is the value returned for a block height that is unknown.\n// This is typically because the block has not been inserted into the main chain\n// yet.\nconst BlockHeightUnknown = int32(-1)\n\n// Error satisfies the error interface and prints human-readable errors.\nfunc (e OutOfRangeError) Error() string {\n\treturn string(e)\n}\n\n// Block defines a bitcoin block that provides easier and more efficient\n// manipulation of raw blocks.  It also memoizes hashes for the block and its\n// transactions on their first access so subsequent accesses don't have to\n// repeat the relatively expensive hashing operations.\ntype Block struct {\n\tmsgBlock                 *wire.MsgBlock  // Underlying MsgBlock\n\tserializedBlock          []byte          // Serialized bytes for the block\n\tserializedBlockNoWitness []byte          // Serialized bytes for block w/o witness data\n\tblockHash                *chainhash.Hash // Cached block hash\n\tblockHeight              int32           // Height in the main block chain\n\ttransactions             []*Tx           // Transactions\n\ttxnsGenerated            bool            // ALL wrapped transactions generated\n}\n\n// MsgBlock returns the underlying wire.MsgBlock for the Block.\nfunc (b *Block) MsgBlock() *wire.MsgBlock {\n\t// Return the cached block.\n\treturn b.msgBlock\n}\n\n// Bytes returns the serialized bytes for the Block.  This is equivalent to\n// calling Serialize on the underlying wire.MsgBlock, however it caches the\n// result so subsequent calls are more efficient.\nfunc (b *Block) Bytes() ([]byte, error) {\n\t// Return the cached serialized bytes if it has already been generated.\n\tif len(b.serializedBlock) != 0 {\n\t\treturn b.serializedBlock, nil\n\t}\n\n\t// Serialize the MsgBlock.\n\tw := bytes.NewBuffer(make([]byte, 0, b.msgBlock.SerializeSize()))\n\terr := b.msgBlock.Serialize(w)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserializedBlock := w.Bytes()\n\n\t// Cache the serialized bytes and return them.\n\tb.serializedBlock = serializedBlock\n\treturn serializedBlock, nil\n}\n\n// BytesNoWitness returns the serialized bytes for the block with transactions\n// encoded without any witness data.\nfunc (b *Block) BytesNoWitness() ([]byte, error) {\n\t// Return the cached serialized bytes if it has already been generated.\n\tif len(b.serializedBlockNoWitness) != 0 {\n\t\treturn b.serializedBlockNoWitness, nil\n\t}\n\n\t// Serialize the MsgBlock.\n\tvar w bytes.Buffer\n\terr := b.msgBlock.SerializeNoWitness(&w)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tserializedBlock := w.Bytes()\n\n\t// Cache the serialized bytes and return them.\n\tb.serializedBlockNoWitness = serializedBlock\n\treturn serializedBlock, nil\n}\n\n// Hash returns the block identifier hash for the Block.  This is equivalent to\n// calling BlockHash on the underlying wire.MsgBlock, however it caches the\n// result so subsequent calls are more efficient.\nfunc (b *Block) Hash() *chainhash.Hash {\n\t// Return the cached block hash if it has already been generated.\n\tif b.blockHash != nil {\n\t\treturn b.blockHash\n\t}\n\n\t// Cache the block hash and return it.\n\thash := b.msgBlock.BlockHash()\n\tb.blockHash = &hash\n\treturn &hash\n}\n\n// Tx returns a wrapped transaction (btcutil.Tx) for the transaction at the\n// specified index in the Block.  The supplied index is 0 based.  That is to\n// say, the first transaction in the block is txNum 0.  This is nearly\n// equivalent to accessing the raw transaction (wire.MsgTx) from the\n// underlying wire.MsgBlock, however the wrapped transaction has some helpful\n// properties such as caching the hash so subsequent calls are more efficient.\nfunc (b *Block) Tx(txNum int) (*Tx, error) {\n\t// Ensure the requested transaction is in range.\n\tnumTx := uint64(len(b.msgBlock.Transactions))\n\tif txNum < 0 || uint64(txNum) > numTx {\n\t\tstr := fmt.Sprintf(\"transaction index %d is out of range - max %d\",\n\t\t\ttxNum, numTx-1)\n\t\treturn nil, OutOfRangeError(str)\n\t}\n\n\t// Generate slice to hold all of the wrapped transactions if needed.\n\tif len(b.transactions) == 0 {\n\t\tb.transactions = make([]*Tx, numTx)\n\t}\n\n\t// Return the wrapped transaction if it has already been generated.\n\tif b.transactions[txNum] != nil {\n\t\treturn b.transactions[txNum], nil\n\t}\n\n\t// Generate and cache the wrapped transaction and return it.\n\tnewTx := NewTx(b.msgBlock.Transactions[txNum])\n\tnewTx.SetIndex(txNum)\n\tb.transactions[txNum] = newTx\n\treturn newTx, nil\n}\n\n// Transactions returns a slice of wrapped transactions (btcutil.Tx) for all\n// transactions in the Block.  This is nearly equivalent to accessing the raw\n// transactions (wire.MsgTx) in the underlying wire.MsgBlock, however it\n// instead provides easy access to wrapped versions (btcutil.Tx) of them.\nfunc (b *Block) Transactions() []*Tx {\n\t// Return transactions if they have ALL already been generated.  This\n\t// flag is necessary because the wrapped transactions are lazily\n\t// generated in a sparse fashion.\n\tif b.txnsGenerated {\n\t\treturn b.transactions\n\t}\n\n\t// Generate slice to hold all of the wrapped transactions if needed.\n\tif len(b.transactions) == 0 {\n\t\tb.transactions = make([]*Tx, len(b.msgBlock.Transactions))\n\t}\n\n\t// Generate and cache the wrapped transactions for all that haven't\n\t// already been done.\n\tfor i, tx := range b.transactions {\n\t\tif tx == nil {\n\t\t\tnewTx := NewTx(b.msgBlock.Transactions[i])\n\t\t\tnewTx.SetIndex(i)\n\t\t\tb.transactions[i] = newTx\n\t\t}\n\t}\n\n\tb.txnsGenerated = true\n\treturn b.transactions\n}\n\n// TxHash returns the hash for the requested transaction number in the Block.\n// The supplied index is 0 based.  That is to say, the first transaction in the\n// block is txNum 0.  This is equivalent to calling TxHash on the underlying\n// wire.MsgTx, however it caches the result so subsequent calls are more\n// efficient.\nfunc (b *Block) TxHash(txNum int) (*chainhash.Hash, error) {\n\t// Attempt to get a wrapped transaction for the specified index.  It\n\t// will be created lazily if needed or simply return the cached version\n\t// if it has already been generated.\n\ttx, err := b.Tx(txNum)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Defer to the wrapped transaction which will return the cached hash if\n\t// it has already been generated.\n\treturn tx.Hash(), nil\n}\n\n// TxLoc returns the offsets and lengths of each transaction in a raw block.\n// It is used to allow fast indexing into transactions within the raw byte\n// stream.\nfunc (b *Block) TxLoc() ([]wire.TxLoc, error) {\n\trawMsg, err := b.Bytes()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trbuf := bytes.NewBuffer(rawMsg)\n\n\tvar mblock wire.MsgBlock\n\ttxLocs, err := mblock.DeserializeTxLoc(rbuf)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn txLocs, err\n}\n\n// Height returns the saved height of the block in the block chain.  This value\n// will be BlockHeightUnknown if it hasn't already explicitly been set.\nfunc (b *Block) Height() int32 {\n\treturn b.blockHeight\n}\n\n// SetHeight sets the height of the block in the block chain.\nfunc (b *Block) SetHeight(height int32) {\n\tb.blockHeight = height\n}\n\n// NewBlock returns a new instance of a bitcoin block given an underlying\n// wire.MsgBlock.  See Block.\nfunc NewBlock(msgBlock *wire.MsgBlock) *Block {\n\treturn &Block{\n\t\tmsgBlock:    msgBlock,\n\t\tblockHeight: BlockHeightUnknown,\n\t}\n}\n\n// NewBlockFromBytes returns a new instance of a bitcoin block given the\n// serialized bytes.  See Block.\nfunc NewBlockFromBytes(serializedBlock []byte) (*Block, error) {\n\tbr := bytes.NewReader(serializedBlock)\n\tb, err := NewBlockFromReader(br)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tb.serializedBlock = serializedBlock\n\treturn b, nil\n}\n\n// NewBlockFromReader returns a new instance of a bitcoin block given a\n// Reader to deserialize the block.  See Block.\nfunc NewBlockFromReader(r io.Reader) (*Block, error) {\n\t// Deserialize the bytes into a MsgBlock.\n\tvar msgBlock wire.MsgBlock\n\terr := msgBlock.Deserialize(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tb := Block{\n\t\tmsgBlock:    &msgBlock,\n\t\tblockHeight: BlockHeightUnknown,\n\t}\n\treturn &b, nil\n}\n\n// NewBlockFromBlockAndBytes returns a new instance of a bitcoin block given\n// an underlying wire.MsgBlock and the serialized bytes for it.  See Block.\nfunc NewBlockFromBlockAndBytes(msgBlock *wire.MsgBlock, serializedBlock []byte) *Block {\n\treturn &Block{\n\t\tmsgBlock:        msgBlock,\n\t\tserializedBlock: serializedBlock,\n\t\tblockHeight:     BlockHeightUnknown,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/certgen.go",
    "content": "// Copyright (c) 2013-2015 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t_ \"crypto/sha512\" // Needed for RegisterHash in init\n\t\"crypto/x509\"\n\t\"crypto/x509/pkix\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"net\"\n\t\"os\"\n\t\"time\"\n)\n\n// NewTLSCertPair returns a new PEM-encoded x.509 certificate pair\n// based on a 521-bit ECDSA private key.  The machine's local interface\n// addresses and all variants of IPv4 and IPv6 localhost are included as\n// valid IP addresses.\nfunc NewTLSCertPair(organization string, validUntil time.Time, extraHosts []string) (cert, key []byte, err error) {\n\tnow := time.Now()\n\tif validUntil.Before(now) {\n\t\treturn nil, nil, errors.New(\"validUntil would create an already-expired certificate\")\n\t}\n\n\tpriv, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// end of ASN.1 time\n\tendOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC)\n\tif validUntil.After(endOfTime) {\n\t\tvalidUntil = endOfTime\n\t}\n\n\tserialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)\n\tserialNumber, err := rand.Int(rand.Reader, serialNumberLimit)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to generate serial number: %s\", err)\n\t}\n\n\thost, err := os.Hostname()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tipAddresses := []net.IP{net.ParseIP(\"127.0.0.1\"), net.ParseIP(\"::1\")}\n\tdnsNames := []string{host}\n\tif host != \"localhost\" {\n\t\tdnsNames = append(dnsNames, \"localhost\")\n\t}\n\n\taddIP := func(ipAddr net.IP) {\n\t\tfor _, ip := range ipAddresses {\n\t\t\tif bytes.Equal(ip, ipAddr) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tipAddresses = append(ipAddresses, ipAddr)\n\t}\n\taddHost := func(host string) {\n\t\tfor _, dnsName := range dnsNames {\n\t\t\tif host == dnsName {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tdnsNames = append(dnsNames, host)\n\t}\n\n\taddrs, err := interfaceAddrs()\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tfor _, a := range addrs {\n\t\tipAddr, _, err := net.ParseCIDR(a.String())\n\t\tif err == nil {\n\t\t\taddIP(ipAddr)\n\t\t}\n\t}\n\n\tfor _, hostStr := range extraHosts {\n\t\thost, _, err := net.SplitHostPort(hostStr)\n\t\tif err != nil {\n\t\t\thost = hostStr\n\t\t}\n\t\tif ip := net.ParseIP(host); ip != nil {\n\t\t\taddIP(ip)\n\t\t} else {\n\t\t\taddHost(host)\n\t\t}\n\t}\n\n\ttemplate := x509.Certificate{\n\t\tSerialNumber: serialNumber,\n\t\tSubject: pkix.Name{\n\t\t\tOrganization: []string{organization},\n\t\t\tCommonName:   host,\n\t\t},\n\t\tNotBefore: now.Add(-time.Hour * 24),\n\t\tNotAfter:  validUntil,\n\n\t\tKeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature |\n\t\t\tx509.KeyUsageCertSign,\n\t\tIsCA: true, // so can sign self.\n\t\tBasicConstraintsValid: true,\n\n\t\tDNSNames:    dnsNames,\n\t\tIPAddresses: ipAddresses,\n\t}\n\n\tderBytes, err := x509.CreateCertificate(rand.Reader, &template,\n\t\t&template, &priv.PublicKey, priv)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to create certificate: %v\", err)\n\t}\n\n\tcertBuf := &bytes.Buffer{}\n\terr = pem.Encode(certBuf, &pem.Block{Type: \"CERTIFICATE\", Bytes: derBytes})\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to encode certificate: %v\", err)\n\t}\n\n\tkeybytes, err := x509.MarshalECPrivateKey(priv)\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to marshal private key: %v\", err)\n\t}\n\n\tkeyBuf := &bytes.Buffer{}\n\terr = pem.Encode(keyBuf, &pem.Block{Type: \"EC PRIVATE KEY\", Bytes: keybytes})\n\tif err != nil {\n\t\treturn nil, nil, fmt.Errorf(\"failed to encode private key: %v\", err)\n\t}\n\n\treturn certBuf.Bytes(), keyBuf.Bytes(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/const.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nconst (\n\t// SatoshiPerBitcent is the number of satoshi in one bitcoin cent.\n\tSatoshiPerBitcent = 1e6\n\n\t// SatoshiPerBitcoin is the number of satoshi in one bitcoin (1 BTC).\n\tSatoshiPerBitcoin = 1e8\n\n\t// MaxSatoshi is the maximum transaction amount allowed in satoshi.\n\tMaxSatoshi = 21e6 * SatoshiPerBitcoin\n)\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses gocov to generate a test coverage report.\n# The gocov tool my be obtained with the following command:\n#   go get github.com/axw/gocov/gocov\n#\n# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH.\n\n# Check for gocov.\ntype gocov >/dev/null 2>&1\nif [ $? -ne 0 ]; then\n\techo >&2 \"This script requires the gocov tool.\"\n\techo >&2 \"You may obtain it with the following command:\"\n\techo >&2 \"go get github.com/axw/gocov/gocov\"\n\texit 1\nfi\ngocov test | gocov report\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/doc.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n/*\nPackage btcutil provides bitcoin-specific convenience functions and types.\n\nBlock Overview\n\nA Block defines a bitcoin block that provides easier and more efficient\nmanipulation of raw wire protocol blocks.  It also memoizes hashes for the\nblock and its transactions on their first access so subsequent accesses don't\nhave to repeat the relatively expensive hashing operations.\n\nTx Overview\n\nA Tx defines a bitcoin transaction that provides more efficient manipulation of\nraw wire protocol transactions.  It memoizes the hash for the transaction on its\nfirst access so subsequent accesses don't have to repeat the relatively\nexpensive hashing operations.\n\nAddress Overview\n\nThe Address interface provides an abstraction for a Bitcoin address.  While the\nmost common type is a pay-to-pubkey-hash, Bitcoin already supports others and\nmay well support more in the future.  This package currently provides\nimplementations for the pay-to-pubkey, pay-to-pubkey-hash, and\npay-to-script-hash address types.\n\nTo decode/encode an address:\n\n\t// NOTE: The default network is only used for address types which do not\n\t// already contain that information.  At this time, that is only\n\t// pay-to-pubkey addresses.\n\taddrString := \"04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962\" +\n\t\t\"e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d57\" +\n\t\t\"8a4c702b6bf11d5f\"\n\tdefaultNet := &chaincfg.MainNetParams\n\taddr, err := btcutil.DecodeAddress(addrString, defaultNet)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(addr.EncodeAddress())\n*/\npackage btcutil\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/goclean.sh",
    "content": "#!/bin/bash\n# The script does automatic checking on a Go package and its sub-packages, including:\n# 1. gofmt         (http://golang.org/cmd/gofmt/)\n# 2. goimports     (https://github.com/bradfitz/goimports)\n# 3. golint        (https://github.com/golang/lint)\n# 4. go vet        (http://golang.org/cmd/vet)\n# 5. gosimple      (https://github.com/dominikh/go-simple)\n# 6. unconvert     (https://github.com/mdempsky/unconvert)\n# 7. race detector (http://blog.golang.org/race-detector)\n# 8. test coverage (http://blog.golang.org/cover)\n#\n# gometalint (github.com/alecthomas/gometalinter) is used to run each each\n# static checker.\n\nset -ex\n\n# Automatic checks\ntest -z \"$(gometalinter --disable-all \\\n--enable=gofmt \\\n--enable=goimports \\\n--enable=golint \\\n--enable=vet \\\n--enable=gosimple \\\n--enable=unconvert \\\n--deadline=120s ./... | grep -v 'ExampleNew' 2>&1 | tee /dev/stderr)\"\nenv GORACE=\"halt_on_error=1\" go test -race ./...\n\n# Run test coverage on each subdirectories and merge the coverage profile.\n\necho \"mode: count\" > profile.cov\n\n# Standard go tooling behavior is to ignore dirs with leading underscores.\nfor dir in $(find . -maxdepth 10 -not -path './.git*' -not -path '*/_*' -type d);\ndo\nif ls $dir/*.go &> /dev/null; then\n  go test -covermode=count -coverprofile=$dir/profile.tmp $dir\n  if [ -f $dir/profile.tmp ]; then\n    cat $dir/profile.tmp | tail -n +2 >> profile.cov\n    rm $dir/profile.tmp\n  fi\nfi\ndone\n\ngo tool cover -func profile.cov\n\n# To submit the test coverage result to coveralls.io,\n# use goveralls (https://github.com/mattn/goveralls)\n# goveralls -coverprofile=profile.cov -service=travis-ci\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/hash160.go",
    "content": "// Copyright (c) 2013-2017 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"crypto/sha256\"\n\t\"hash\"\n\n\t\"golang.org/x/crypto/ripemd160\"\n)\n\n// Calculate the hash of hasher over buf.\nfunc calcHash(buf []byte, hasher hash.Hash) []byte {\n\thasher.Write(buf)\n\treturn hasher.Sum(nil)\n}\n\n// Hash160 calculates the hash ripemd160(sha256(b)).\nfunc Hash160(buf []byte) []byte {\n\treturn calcHash(calcHash(buf, sha256.New()), ripemd160.New())\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/net.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// +build !appengine\n\npackage btcutil\n\nimport (\n\t\"net\"\n)\n\n// interfaceAddrs returns a list of the system's network interface addresses.\n// It is wrapped here so that we can substitute it for other functions when\n// building for systems that do not allow access to net.InterfaceAddrs().\nfunc interfaceAddrs() ([]net.Addr, error) {\n\treturn net.InterfaceAddrs()\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/net_noop.go",
    "content": "// Copyright (c) 2013-2014 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\n// +build appengine\n\npackage btcutil\n\nimport (\n\t\"net\"\n)\n\n// interfaceAddrs returns a list of the system's network interface addresses.\n// It is wrapped here so that we can substitute it for a no-op function that\n// returns an empty slice of net.Addr when building for systems that do not\n// allow access to net.InterfaceAddrs().\nfunc interfaceAddrs() ([]net.Addr, error) {\n\treturn []net.Addr{}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/test_coverage.txt",
    "content": "\ngithub.com/conformal/btcutil/base58.go\t Base58Decode\t\t\t 100.00% (20/20)\ngithub.com/conformal/btcutil/base58.go\t Base58Encode\t\t\t 100.00% (15/15)\ngithub.com/conformal/btcutil/block.go\t Block.Tx\t\t\t 100.00% (12/12)\ngithub.com/conformal/btcutil/wif.go\t WIF.String\t\t\t 100.00% (11/11)\ngithub.com/conformal/btcutil/block.go\t Block.Transactions\t\t 100.00% (11/11)\ngithub.com/conformal/btcutil/amount.go\t AmountUnit.String\t\t 100.00% (8/8)\ngithub.com/conformal/btcutil/tx.go\t NewTxFromReader\t\t 100.00% (6/6)\ngithub.com/conformal/btcutil/block.go\t NewBlockFromBytes\t\t 100.00% (6/6)\ngithub.com/conformal/btcutil/block.go\t NewBlockFromReader\t\t 100.00% (6/6)\ngithub.com/conformal/btcutil/address.go\t encodeAddress\t\t\t 100.00% (6/6)\ngithub.com/conformal/btcutil/address.go\t newAddressPubKeyHash\t\t 100.00% (5/5)\ngithub.com/conformal/btcutil/address.go\t newAddressScriptHashFromHash\t 100.00% (5/5)\ngithub.com/conformal/btcutil/tx.go\t Tx.Sha\t\t\t\t 100.00% (5/5)\ngithub.com/conformal/btcutil/block.go\t Block.Sha\t\t\t 100.00% (5/5)\ngithub.com/conformal/btcutil/amount.go\t NewAmount\t\t\t 100.00% (5/5)\ngithub.com/conformal/btcutil/amount.go\t round\t\t\t\t 100.00% (3/3)\ngithub.com/conformal/btcutil/address.go\t NewAddressScriptHash\t\t 100.00% (2/2)\ngithub.com/conformal/btcutil/amount.go\t Amount.Format\t\t\t 100.00% (2/2)\ngithub.com/conformal/btcutil/tx.go\t NewTxFromBytes\t\t\t 100.00% (2/2)\ngithub.com/conformal/btcutil/hash160.go\t calcHash\t\t\t 100.00% (2/2)\ngithub.com/conformal/btcutil/address.go\t AddressPubKeyHash.Hash160\t 100.00% (1/1)\ngithub.com/conformal/btcutil/block.go\t OutOfRangeError.Error\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/block.go\t Block.MsgBlock\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/tx.go\t Tx.MsgTx\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/hash160.go\t Hash160\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/block.go\t NewBlockFromBlockAndBytes\t 100.00% (1/1)\ngithub.com/conformal/btcutil/block.go\t Block.Height\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/block.go\t Block.SetHeight\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/block.go\t NewBlock\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKeyHash.IsForNet\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.EncodeAddress\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t NewAddressPubKeyHash\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKeyHash.EncodeAddress 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKeyHash.ScriptAddress 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKeyHash.String\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t NewAddressScriptHashFromHash\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressScriptHash.EncodeAddress 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressScriptHash.ScriptAddress 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressScriptHash.IsForNet\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressScriptHash.String\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressScriptHash.Hash160\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.ScriptAddress\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.IsForNet\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.String\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/tx.go\t NewTx\t\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/tx.go\t Tx.SetIndex\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/amount.go\t Amount.ToUnit\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/tx.go\t Tx.Index\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/amount.go\t Amount.String\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/amount.go\t Amount.MulF64\t\t\t 100.00% (1/1)\ngithub.com/conformal/btcutil/appdata.go\t appDataDir\t\t\t 92.00% (23/25)\ngithub.com/conformal/btcutil/block.go\t Block.TxLoc\t\t\t 88.89% (8/9)\ngithub.com/conformal/btcutil/block.go\t Block.Bytes\t\t\t 88.89% (8/9)\ngithub.com/conformal/btcutil/address.go\t NewAddressPubKey\t\t 87.50% (7/8)\ngithub.com/conformal/btcutil/address.go\t DecodeAddress\t\t\t 85.00% (17/20)\ngithub.com/conformal/btcutil/wif.go\t DecodeWIF\t\t\t 85.00% (17/20)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.serialize\t 80.00% (4/5)\ngithub.com/conformal/btcutil/block.go\t Block.TxSha\t\t\t 75.00% (3/4)\ngithub.com/conformal/btcutil/wif.go\t paddedAppend\t\t\t 66.67% (2/3)\ngithub.com/conformal/btcutil/wif.go\t NewWIF\t\t\t\t 66.67% (2/3)\ngithub.com/conformal/btcutil/certgen.go\t NewTLSCertPair\t\t\t 0.00% (0/54)\ngithub.com/conformal/btcutil/wif.go\t WIF.SerializePubKey\t\t 0.00% (0/4)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.AddressPubKeyHash 0.00% (0/3)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.Format\t\t 0.00% (0/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.PubKey\t\t 0.00% (0/1)\ngithub.com/conformal/btcutil/address.go\t AddressPubKey.SetFormat\t 0.00% (0/1)\ngithub.com/conformal/btcutil/wif.go\t WIF.IsForNet\t\t\t 0.00% (0/1)\ngithub.com/conformal/btcutil/appdata.go\t AppDataDir\t\t\t 0.00% (0/1)\ngithub.com/conformal/btcutil/net.go\t interfaceAddrs\t\t\t 0.00% (0/1)\ngithub.com/conformal/btcutil\t\t ------------------------------- 75.88% (258/340)\n\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/tx.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcd/wire\"\n)\n\n// TxIndexUnknown is the value returned for a transaction index that is unknown.\n// This is typically because the transaction has not been inserted into a block\n// yet.\nconst TxIndexUnknown = -1\n\n// Tx defines a bitcoin transaction that provides easier and more efficient\n// manipulation of raw transactions.  It also memoizes the hash for the\n// transaction on its first access so subsequent accesses don't have to repeat\n// the relatively expensive hashing operations.\ntype Tx struct {\n\tmsgTx         *wire.MsgTx     // Underlying MsgTx\n\ttxHash        *chainhash.Hash // Cached transaction hash\n\ttxHashWitness *chainhash.Hash // Cached transaction witness hash\n\ttxHasWitness  *bool           // If the transaction has witness data\n\ttxIndex       int             // Position within a block or TxIndexUnknown\n}\n\n// MsgTx returns the underlying wire.MsgTx for the transaction.\nfunc (t *Tx) MsgTx() *wire.MsgTx {\n\t// Return the cached transaction.\n\treturn t.msgTx\n}\n\n// Hash returns the hash of the transaction.  This is equivalent to\n// calling TxHash on the underlying wire.MsgTx, however it caches the\n// result so subsequent calls are more efficient.\nfunc (t *Tx) Hash() *chainhash.Hash {\n\t// Return the cached hash if it has already been generated.\n\tif t.txHash != nil {\n\t\treturn t.txHash\n\t}\n\n\t// Cache the hash and return it.\n\thash := t.msgTx.TxHash()\n\tt.txHash = &hash\n\treturn &hash\n}\n\n// WitnessHash returns the witness hash (wtxid) of the transaction.  This is\n// equivalent to calling WitnessHash on the underlying wire.MsgTx, however it\n// caches the result so subsequent calls are more efficient.\nfunc (t *Tx) WitnessHash() *chainhash.Hash {\n\t// Return the cached hash if it has already been generated.\n\tif t.txHashWitness != nil {\n\t\treturn t.txHashWitness\n\t}\n\n\t// Cache the hash and return it.\n\thash := t.msgTx.WitnessHash()\n\tt.txHashWitness = &hash\n\treturn &hash\n}\n\n// HasWitness returns false if none of the inputs within the transaction\n// contain witness data, true false otherwise. This equivalent to calling\n// HasWitness on the underlying wire.MsgTx, however it caches the result so\n// subsequent calls are more efficient.\nfunc (t *Tx) HasWitness() bool {\n\tif t.txHashWitness != nil {\n\t\treturn *t.txHasWitness\n\t}\n\n\thasWitness := t.msgTx.HasWitness()\n\tt.txHasWitness = &hasWitness\n\treturn hasWitness\n}\n\n// Index returns the saved index of the transaction within a block.  This value\n// will be TxIndexUnknown if it hasn't already explicitly been set.\nfunc (t *Tx) Index() int {\n\treturn t.txIndex\n}\n\n// SetIndex sets the index of the transaction in within a block.\nfunc (t *Tx) SetIndex(index int) {\n\tt.txIndex = index\n}\n\n// NewTx returns a new instance of a bitcoin transaction given an underlying\n// wire.MsgTx.  See Tx.\nfunc NewTx(msgTx *wire.MsgTx) *Tx {\n\treturn &Tx{\n\t\tmsgTx:   msgTx,\n\t\ttxIndex: TxIndexUnknown,\n\t}\n}\n\n// NewTxFromBytes returns a new instance of a bitcoin transaction given the\n// serialized bytes.  See Tx.\nfunc NewTxFromBytes(serializedTx []byte) (*Tx, error) {\n\tbr := bytes.NewReader(serializedTx)\n\treturn NewTxFromReader(br)\n}\n\n// NewTxFromReader returns a new instance of a bitcoin transaction given a\n// Reader to deserialize the transaction.  See Tx.\nfunc NewTxFromReader(r io.Reader) (*Tx, error) {\n\t// Deserialize the bytes into a MsgTx.\n\tvar msgTx wire.MsgTx\n\terr := msgTx.Deserialize(r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tt := Tx{\n\t\tmsgTx:   &msgTx,\n\t\ttxIndex: TxIndexUnknown,\n\t}\n\treturn &t, nil\n}\n"
  },
  {
    "path": "vendor/github.com/btcsuite/btcutil/wif.go",
    "content": "// Copyright (c) 2013-2016 The btcsuite developers\n// Use of this source code is governed by an ISC\n// license that can be found in the LICENSE file.\n\npackage btcutil\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcd/btcec\"\n\t\"github.com/btcsuite/btcd/chaincfg\"\n\t\"github.com/btcsuite/btcd/chaincfg/chainhash\"\n\t\"github.com/btcsuite/btcutil/base58\"\n)\n\n// ErrMalformedPrivateKey describes an error where a WIF-encoded private\n// key cannot be decoded due to being improperly formatted.  This may occur\n// if the byte length is incorrect or an unexpected magic number was\n// encountered.\nvar ErrMalformedPrivateKey = errors.New(\"malformed private key\")\n\n// compressMagic is the magic byte used to identify a WIF encoding for\n// an address created from a compressed serialized public key.\nconst compressMagic byte = 0x01\n\n// WIF contains the individual components described by the Wallet Import Format\n// (WIF).  A WIF string is typically used to represent a private key and its\n// associated address in a way that  may be easily copied and imported into or\n// exported from wallet software.  WIF strings may be decoded into this\n// structure by calling DecodeWIF or created with a user-provided private key\n// by calling NewWIF.\ntype WIF struct {\n\t// PrivKey is the private key being imported or exported.\n\tPrivKey *btcec.PrivateKey\n\n\t// CompressPubKey specifies whether the address controlled by the\n\t// imported or exported private key was created by hashing a\n\t// compressed (33-byte) serialized public key, rather than an\n\t// uncompressed (65-byte) one.\n\tCompressPubKey bool\n\n\t// netID is the bitcoin network identifier byte used when\n\t// WIF encoding the private key.\n\tnetID byte\n}\n\n// NewWIF creates a new WIF structure to export an address and its private key\n// as a string encoded in the Wallet Import Format.  The compress argument\n// specifies whether the address intended to be imported or exported was created\n// by serializing the public key compressed rather than uncompressed.\nfunc NewWIF(privKey *btcec.PrivateKey, net *chaincfg.Params, compress bool) (*WIF, error) {\n\tif net == nil {\n\t\treturn nil, errors.New(\"no network\")\n\t}\n\treturn &WIF{privKey, compress, net.PrivateKeyID}, nil\n}\n\n// IsForNet returns whether or not the decoded WIF structure is associated\n// with the passed bitcoin network.\nfunc (w *WIF) IsForNet(net *chaincfg.Params) bool {\n\treturn w.netID == net.PrivateKeyID\n}\n\n// DecodeWIF creates a new WIF structure by decoding the string encoding of\n// the import format.\n//\n// The WIF string must be a base58-encoded string of the following byte\n// sequence:\n//\n//  * 1 byte to identify the network, must be 0x80 for mainnet or 0xef for\n//    either testnet3 or the regression test network\n//  * 32 bytes of a binary-encoded, big-endian, zero-padded private key\n//  * Optional 1 byte (equal to 0x01) if the address being imported or exported\n//    was created by taking the RIPEMD160 after SHA256 hash of a serialized\n//    compressed (33-byte) public key\n//  * 4 bytes of checksum, must equal the first four bytes of the double SHA256\n//    of every byte before the checksum in this sequence\n//\n// If the base58-decoded byte sequence does not match this, DecodeWIF will\n// return a non-nil error.  ErrMalformedPrivateKey is returned when the WIF\n// is of an impossible length or the expected compressed pubkey magic number\n// does not equal the expected value of 0x01.  ErrChecksumMismatch is returned\n// if the expected WIF checksum does not match the calculated checksum.\nfunc DecodeWIF(wif string) (*WIF, error) {\n\tdecoded := base58.Decode(wif)\n\tdecodedLen := len(decoded)\n\tvar compress bool\n\n\t// Length of base58 decoded WIF must be 32 bytes + an optional 1 byte\n\t// (0x01) if compressed, plus 1 byte for netID + 4 bytes of checksum.\n\tswitch decodedLen {\n\tcase 1 + btcec.PrivKeyBytesLen + 1 + 4:\n\t\tif decoded[33] != compressMagic {\n\t\t\treturn nil, ErrMalformedPrivateKey\n\t\t}\n\t\tcompress = true\n\tcase 1 + btcec.PrivKeyBytesLen + 4:\n\t\tcompress = false\n\tdefault:\n\t\treturn nil, ErrMalformedPrivateKey\n\t}\n\n\t// Checksum is first four bytes of double SHA256 of the identifier byte\n\t// and privKey.  Verify this matches the final 4 bytes of the decoded\n\t// private key.\n\tvar tosum []byte\n\tif compress {\n\t\ttosum = decoded[:1+btcec.PrivKeyBytesLen+1]\n\t} else {\n\t\ttosum = decoded[:1+btcec.PrivKeyBytesLen]\n\t}\n\tcksum := chainhash.DoubleHashB(tosum)[:4]\n\tif !bytes.Equal(cksum, decoded[decodedLen-4:]) {\n\t\treturn nil, ErrChecksumMismatch\n\t}\n\n\tnetID := decoded[0]\n\tprivKeyBytes := decoded[1 : 1+btcec.PrivKeyBytesLen]\n\tprivKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), privKeyBytes)\n\treturn &WIF{privKey, compress, netID}, nil\n}\n\n// String creates the Wallet Import Format string encoding of a WIF structure.\n// See DecodeWIF for a detailed breakdown of the format and requirements of\n// a valid WIF string.\nfunc (w *WIF) String() string {\n\t// Precalculate size.  Maximum number of bytes before base58 encoding\n\t// is one byte for the network, 32 bytes of private key, possibly one\n\t// extra byte if the pubkey is to be compressed, and finally four\n\t// bytes of checksum.\n\tencodeLen := 1 + btcec.PrivKeyBytesLen + 4\n\tif w.CompressPubKey {\n\t\tencodeLen++\n\t}\n\n\ta := make([]byte, 0, encodeLen)\n\ta = append(a, w.netID)\n\t// Pad and append bytes manually, instead of using Serialize, to\n\t// avoid another call to make.\n\ta = paddedAppend(btcec.PrivKeyBytesLen, a, w.PrivKey.D.Bytes())\n\tif w.CompressPubKey {\n\t\ta = append(a, compressMagic)\n\t}\n\tcksum := chainhash.DoubleHashB(a)[:4]\n\ta = append(a, cksum...)\n\treturn base58.Encode(a)\n}\n\n// SerializePubKey serializes the associated public key of the imported or\n// exported private key in either a compressed or uncompressed format.  The\n// serialization format chosen depends on the value of w.CompressPubKey.\nfunc (w *WIF) SerializePubKey() []byte {\n\tpk := (*btcec.PublicKey)(&w.PrivKey.PublicKey)\n\tif w.CompressPubKey {\n\t\treturn pk.SerializeCompressed()\n\t}\n\treturn pk.SerializeUncompressed()\n}\n\n// paddedAppend appends the src byte slice to dst, returning the new slice.\n// If the length of the source is smaller than the passed size, leading zero\n// bytes are appended to the dst slice before appending src.\nfunc paddedAppend(size uint, dst, src []byte) []byte {\n\tfor i := 0; i < int(size)-len(src); i++ {\n\t\tdst = append(dst, 0)\n\t}\n\treturn append(dst, src...)\n}\n"
  },
  {
    "path": "vendor/github.com/cespare/cp/LICENSE.txt",
    "content": "Copyright (c) 2015 Caleb Spare\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/cespare/cp/README.md",
    "content": "# cp\n\n[![GoDoc](https://godoc.org/github.com/cespare/cp?status.svg)](https://godoc.org/github.com/cespare/cp)\n\ncp is a small Go package for copying files and directories.\n\nThe API may change because I want to add some options in the future (for merging with existing dirs).\n\nIt does not currently handle Windows specifically (I think it may require some special treatment).\n"
  },
  {
    "path": "vendor/github.com/cespare/cp/cp.go",
    "content": "// Package cp offers simple file and directory copying for Go.\npackage cp\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\nvar errCopyFileWithDir = errors.New(\"dir argument to CopyFile\")\n\n// CopyFile copies the file with path src to dst. The new file must not exist.\n// It is created with the same permissions as src.\nfunc CopyFile(dst, src string) error {\n\trf, err := os.Open(src)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer rf.Close()\n\trstat, err := rf.Stat()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif rstat.IsDir() {\n\t\treturn errCopyFileWithDir\n\t}\n\n\twf, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_EXCL, rstat.Mode())\n\tif err != nil {\n\t\treturn err\n\t}\n\tif _, err := io.Copy(wf, rf); err != nil {\n\t\twf.Close()\n\t\treturn err\n\t}\n\treturn wf.Close()\n}\n\n// CopyAll copies the file or (recursively) the directory at src to dst.\n// Permissions are preserved. dst must not already exist.\nfunc CopyAll(dst, src string) error {\n\treturn filepath.Walk(src, makeWalkFn(dst, src))\n}\n\nfunc makeWalkFn(dst, src string) filepath.WalkFunc {\n\treturn func(path string, info os.FileInfo, err error) error {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdstPath := filepath.Join(dst, strings.TrimPrefix(path, src))\n\t\tif info.IsDir() {\n\t\t\treturn os.Mkdir(dstPath, info.Mode())\n\t\t}\n\t\treturn CopyFile(dstPath, path)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/codahale/hdrhistogram/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Coda Hale\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/codahale/hdrhistogram/README.md",
    "content": "hdrhistogram\n============\n\n[![Build Status](https://travis-ci.org/codahale/hdrhistogram.png?branch=master)](https://travis-ci.org/codahale/hdrhistogram)\n\nA pure Go implementation of the [HDR Histogram](https://github.com/HdrHistogram/HdrHistogram).\n\n> A Histogram that supports recording and analyzing sampled data value counts\n> across a configurable integer value range with configurable value precision\n> within the range. Value precision is expressed as the number of significant\n> digits in the value recording, and provides control over value quantization\n> behavior across the value range and the subsequent value resolution at any\n> given level.\n\nFor documentation, check [godoc](http://godoc.org/github.com/codahale/hdrhistogram).\n"
  },
  {
    "path": "vendor/github.com/codahale/hdrhistogram/hdr.go",
    "content": "// Package hdrhistogram provides an implementation of Gil Tene's HDR Histogram\n// data structure. The HDR Histogram allows for fast and accurate analysis of\n// the extreme ranges of data with non-normal distributions, like latency.\npackage hdrhistogram\n\nimport (\n\t\"fmt\"\n\t\"math\"\n)\n\n// A Bracket is a part of a cumulative distribution.\ntype Bracket struct {\n\tQuantile       float64\n\tCount, ValueAt int64\n}\n\n// A Snapshot is an exported view of a Histogram, useful for serializing them.\n// A Histogram can be constructed from it by passing it to Import.\ntype Snapshot struct {\n\tLowestTrackableValue  int64\n\tHighestTrackableValue int64\n\tSignificantFigures    int64\n\tCounts                []int64\n}\n\n// A Histogram is a lossy data structure used to record the distribution of\n// non-normally distributed data (like latency) with a high degree of accuracy\n// and a bounded degree of precision.\ntype Histogram struct {\n\tlowestTrackableValue        int64\n\thighestTrackableValue       int64\n\tunitMagnitude               int64\n\tsignificantFigures          int64\n\tsubBucketHalfCountMagnitude int32\n\tsubBucketHalfCount          int32\n\tsubBucketMask               int64\n\tsubBucketCount              int32\n\tbucketCount                 int32\n\tcountsLen                   int32\n\ttotalCount                  int64\n\tcounts                      []int64\n}\n\n// New returns a new Histogram instance capable of tracking values in the given\n// range and with the given amount of precision.\nfunc New(minValue, maxValue int64, sigfigs int) *Histogram {\n\tif sigfigs < 1 || 5 < sigfigs {\n\t\tpanic(fmt.Errorf(\"sigfigs must be [1,5] (was %d)\", sigfigs))\n\t}\n\n\tlargestValueWithSingleUnitResolution := 2 * math.Pow10(sigfigs)\n\tsubBucketCountMagnitude := int32(math.Ceil(math.Log2(float64(largestValueWithSingleUnitResolution))))\n\n\tsubBucketHalfCountMagnitude := subBucketCountMagnitude\n\tif subBucketHalfCountMagnitude < 1 {\n\t\tsubBucketHalfCountMagnitude = 1\n\t}\n\tsubBucketHalfCountMagnitude--\n\n\tunitMagnitude := int32(math.Floor(math.Log2(float64(minValue))))\n\tif unitMagnitude < 0 {\n\t\tunitMagnitude = 0\n\t}\n\n\tsubBucketCount := int32(math.Pow(2, float64(subBucketHalfCountMagnitude)+1))\n\n\tsubBucketHalfCount := subBucketCount / 2\n\tsubBucketMask := int64(subBucketCount-1) << uint(unitMagnitude)\n\n\t// determine exponent range needed to support the trackable value with no\n\t// overflow:\n\tsmallestUntrackableValue := int64(subBucketCount) << uint(unitMagnitude)\n\tbucketsNeeded := int32(1)\n\tfor smallestUntrackableValue < maxValue {\n\t\tsmallestUntrackableValue <<= 1\n\t\tbucketsNeeded++\n\t}\n\n\tbucketCount := bucketsNeeded\n\tcountsLen := (bucketCount + 1) * (subBucketCount / 2)\n\n\treturn &Histogram{\n\t\tlowestTrackableValue:        minValue,\n\t\thighestTrackableValue:       maxValue,\n\t\tunitMagnitude:               int64(unitMagnitude),\n\t\tsignificantFigures:          int64(sigfigs),\n\t\tsubBucketHalfCountMagnitude: subBucketHalfCountMagnitude,\n\t\tsubBucketHalfCount:          subBucketHalfCount,\n\t\tsubBucketMask:               subBucketMask,\n\t\tsubBucketCount:              subBucketCount,\n\t\tbucketCount:                 bucketCount,\n\t\tcountsLen:                   countsLen,\n\t\ttotalCount:                  0,\n\t\tcounts:                      make([]int64, countsLen),\n\t}\n}\n\n// ByteSize returns an estimate of the amount of memory allocated to the\n// histogram in bytes.\n//\n// N.B.: This does not take into account the overhead for slices, which are\n// small, constant, and specific to the compiler version.\nfunc (h *Histogram) ByteSize() int {\n\treturn 6*8 + 5*4 + len(h.counts)*8\n}\n\n// Merge merges the data stored in the given histogram with the receiver,\n// returning the number of recorded values which had to be dropped.\nfunc (h *Histogram) Merge(from *Histogram) (dropped int64) {\n\ti := from.rIterator()\n\tfor i.next() {\n\t\tv := i.valueFromIdx\n\t\tc := i.countAtIdx\n\n\t\tif h.RecordValues(v, c) != nil {\n\t\t\tdropped += c\n\t\t}\n\t}\n\n\treturn\n}\n\n// TotalCount returns total number of values recorded.\nfunc (h *Histogram) TotalCount() int64 {\n\treturn h.totalCount\n}\n\n// Max returns the approximate maximum recorded value.\nfunc (h *Histogram) Max() int64 {\n\tvar max int64\n\ti := h.iterator()\n\tfor i.next() {\n\t\tif i.countAtIdx != 0 {\n\t\t\tmax = i.highestEquivalentValue\n\t\t}\n\t}\n\treturn h.highestEquivalentValue(max)\n}\n\n// Min returns the approximate minimum recorded value.\nfunc (h *Histogram) Min() int64 {\n\tvar min int64\n\ti := h.iterator()\n\tfor i.next() {\n\t\tif i.countAtIdx != 0 && min == 0 {\n\t\t\tmin = i.highestEquivalentValue\n\t\t\tbreak\n\t\t}\n\t}\n\treturn h.lowestEquivalentValue(min)\n}\n\n// Mean returns the approximate arithmetic mean of the recorded values.\nfunc (h *Histogram) Mean() float64 {\n\tif h.totalCount == 0 {\n\t\treturn 0\n\t}\n\tvar total int64\n\ti := h.iterator()\n\tfor i.next() {\n\t\tif i.countAtIdx != 0 {\n\t\t\ttotal += i.countAtIdx * h.medianEquivalentValue(i.valueFromIdx)\n\t\t}\n\t}\n\treturn float64(total) / float64(h.totalCount)\n}\n\n// StdDev returns the approximate standard deviation of the recorded values.\nfunc (h *Histogram) StdDev() float64 {\n\tif h.totalCount == 0 {\n\t\treturn 0\n\t}\n\n\tmean := h.Mean()\n\tgeometricDevTotal := 0.0\n\n\ti := h.iterator()\n\tfor i.next() {\n\t\tif i.countAtIdx != 0 {\n\t\t\tdev := float64(h.medianEquivalentValue(i.valueFromIdx)) - mean\n\t\t\tgeometricDevTotal += (dev * dev) * float64(i.countAtIdx)\n\t\t}\n\t}\n\n\treturn math.Sqrt(geometricDevTotal / float64(h.totalCount))\n}\n\n// Reset deletes all recorded values and restores the histogram to its original\n// state.\nfunc (h *Histogram) Reset() {\n\th.totalCount = 0\n\tfor i := range h.counts {\n\t\th.counts[i] = 0\n\t}\n}\n\n// RecordValue records the given value, returning an error if the value is out\n// of range.\nfunc (h *Histogram) RecordValue(v int64) error {\n\treturn h.RecordValues(v, 1)\n}\n\n// RecordCorrectedValue records the given value, correcting for stalls in the\n// recording process. This only works for processes which are recording values\n// at an expected interval (e.g., doing jitter analysis). Processes which are\n// recording ad-hoc values (e.g., latency for incoming requests) can't take\n// advantage of this.\nfunc (h *Histogram) RecordCorrectedValue(v, expectedInterval int64) error {\n\tif err := h.RecordValue(v); err != nil {\n\t\treturn err\n\t}\n\n\tif expectedInterval <= 0 || v <= expectedInterval {\n\t\treturn nil\n\t}\n\n\tmissingValue := v - expectedInterval\n\tfor missingValue >= expectedInterval {\n\t\tif err := h.RecordValue(missingValue); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tmissingValue -= expectedInterval\n\t}\n\n\treturn nil\n}\n\n// RecordValues records n occurrences of the given value, returning an error if\n// the value is out of range.\nfunc (h *Histogram) RecordValues(v, n int64) error {\n\tidx := h.countsIndexFor(v)\n\tif idx < 0 || int(h.countsLen) <= idx {\n\t\treturn fmt.Errorf(\"value %d is too large to be recorded\", v)\n\t}\n\th.counts[idx] += n\n\th.totalCount += n\n\n\treturn nil\n}\n\n// ValueAtQuantile returns the recorded value at the given quantile (0..100).\nfunc (h *Histogram) ValueAtQuantile(q float64) int64 {\n\tif q > 100 {\n\t\tq = 100\n\t}\n\n\ttotal := int64(0)\n\tcountAtPercentile := int64(((q / 100) * float64(h.totalCount)) + 0.5)\n\n\ti := h.iterator()\n\tfor i.next() {\n\t\ttotal += i.countAtIdx\n\t\tif total >= countAtPercentile {\n\t\t\treturn h.highestEquivalentValue(i.valueFromIdx)\n\t\t}\n\t}\n\n\treturn 0\n}\n\n// CumulativeDistribution returns an ordered list of brackets of the\n// distribution of recorded values.\nfunc (h *Histogram) CumulativeDistribution() []Bracket {\n\tvar result []Bracket\n\n\ti := h.pIterator(1)\n\tfor i.next() {\n\t\tresult = append(result, Bracket{\n\t\t\tQuantile: i.percentile,\n\t\t\tCount:    i.countToIdx,\n\t\t\tValueAt:  i.highestEquivalentValue,\n\t\t})\n\t}\n\n\treturn result\n}\n\n// SignificantFigures returns the significant figures used to create the\n// histogram\nfunc (h *Histogram) SignificantFigures() int64 {\n\treturn h.significantFigures\n}\n\n// LowestTrackableValue returns the lower bound on values that will be added\n// to the histogram\nfunc (h *Histogram) LowestTrackableValue() int64 {\n\treturn h.lowestTrackableValue\n}\n\n// HighestTrackableValue returns the upper bound on values that will be added\n// to the histogram\nfunc (h *Histogram) HighestTrackableValue() int64 {\n\treturn h.highestTrackableValue\n}\n\n// Histogram bar for plotting\ntype Bar struct {\n\tFrom, To, Count int64\n}\n\n// Pretty print as csv for easy plotting\nfunc (b Bar) String() string {\n\treturn fmt.Sprintf(\"%v, %v, %v\\n\", b.From, b.To, b.Count)\n}\n\n// Distribution returns an ordered list of bars of the\n// distribution of recorded values, counts can be normalized to a probability\nfunc (h *Histogram) Distribution() (result []Bar) {\n\ti := h.iterator()\n\tfor i.next() {\n\t\tresult = append(result, Bar{\n\t\t\tCount: i.countAtIdx,\n\t\t\tFrom:  h.lowestEquivalentValue(i.valueFromIdx),\n\t\t\tTo:    i.highestEquivalentValue,\n\t\t})\n\t}\n\n\treturn result\n}\n\n// Equals returns true if the two Histograms are equivalent, false if not.\nfunc (h *Histogram) Equals(other *Histogram) bool {\n\tswitch {\n\tcase\n\t\th.lowestTrackableValue != other.lowestTrackableValue,\n\t\th.highestTrackableValue != other.highestTrackableValue,\n\t\th.unitMagnitude != other.unitMagnitude,\n\t\th.significantFigures != other.significantFigures,\n\t\th.subBucketHalfCountMagnitude != other.subBucketHalfCountMagnitude,\n\t\th.subBucketHalfCount != other.subBucketHalfCount,\n\t\th.subBucketMask != other.subBucketMask,\n\t\th.subBucketCount != other.subBucketCount,\n\t\th.bucketCount != other.bucketCount,\n\t\th.countsLen != other.countsLen,\n\t\th.totalCount != other.totalCount:\n\t\treturn false\n\tdefault:\n\t\tfor i, c := range h.counts {\n\t\t\tif c != other.counts[i] {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n\n// Export returns a snapshot view of the Histogram. This can be later passed to\n// Import to construct a new Histogram with the same state.\nfunc (h *Histogram) Export() *Snapshot {\n\treturn &Snapshot{\n\t\tLowestTrackableValue:  h.lowestTrackableValue,\n\t\tHighestTrackableValue: h.highestTrackableValue,\n\t\tSignificantFigures:    h.significantFigures,\n\t\tCounts:                append([]int64(nil), h.counts...), // copy\n\t}\n}\n\n// Import returns a new Histogram populated from the Snapshot data (which the\n// caller must stop accessing).\nfunc Import(s *Snapshot) *Histogram {\n\th := New(s.LowestTrackableValue, s.HighestTrackableValue, int(s.SignificantFigures))\n\th.counts = s.Counts\n\ttotalCount := int64(0)\n\tfor i := int32(0); i < h.countsLen; i++ {\n\t\tcountAtIndex := h.counts[i]\n\t\tif countAtIndex > 0 {\n\t\t\ttotalCount += countAtIndex\n\t\t}\n\t}\n\th.totalCount = totalCount\n\treturn h\n}\n\nfunc (h *Histogram) iterator() *iterator {\n\treturn &iterator{\n\t\th:            h,\n\t\tsubBucketIdx: -1,\n\t}\n}\n\nfunc (h *Histogram) rIterator() *rIterator {\n\treturn &rIterator{\n\t\titerator: iterator{\n\t\t\th:            h,\n\t\t\tsubBucketIdx: -1,\n\t\t},\n\t}\n}\n\nfunc (h *Histogram) pIterator(ticksPerHalfDistance int32) *pIterator {\n\treturn &pIterator{\n\t\titerator: iterator{\n\t\t\th:            h,\n\t\t\tsubBucketIdx: -1,\n\t\t},\n\t\tticksPerHalfDistance: ticksPerHalfDistance,\n\t}\n}\n\nfunc (h *Histogram) sizeOfEquivalentValueRange(v int64) int64 {\n\tbucketIdx := h.getBucketIndex(v)\n\tsubBucketIdx := h.getSubBucketIdx(v, bucketIdx)\n\tadjustedBucket := bucketIdx\n\tif subBucketIdx >= h.subBucketCount {\n\t\tadjustedBucket++\n\t}\n\treturn int64(1) << uint(h.unitMagnitude+int64(adjustedBucket))\n}\n\nfunc (h *Histogram) valueFromIndex(bucketIdx, subBucketIdx int32) int64 {\n\treturn int64(subBucketIdx) << uint(int64(bucketIdx)+h.unitMagnitude)\n}\n\nfunc (h *Histogram) lowestEquivalentValue(v int64) int64 {\n\tbucketIdx := h.getBucketIndex(v)\n\tsubBucketIdx := h.getSubBucketIdx(v, bucketIdx)\n\treturn h.valueFromIndex(bucketIdx, subBucketIdx)\n}\n\nfunc (h *Histogram) nextNonEquivalentValue(v int64) int64 {\n\treturn h.lowestEquivalentValue(v) + h.sizeOfEquivalentValueRange(v)\n}\n\nfunc (h *Histogram) highestEquivalentValue(v int64) int64 {\n\treturn h.nextNonEquivalentValue(v) - 1\n}\n\nfunc (h *Histogram) medianEquivalentValue(v int64) int64 {\n\treturn h.lowestEquivalentValue(v) + (h.sizeOfEquivalentValueRange(v) >> 1)\n}\n\nfunc (h *Histogram) getCountAtIndex(bucketIdx, subBucketIdx int32) int64 {\n\treturn h.counts[h.countsIndex(bucketIdx, subBucketIdx)]\n}\n\nfunc (h *Histogram) countsIndex(bucketIdx, subBucketIdx int32) int32 {\n\tbucketBaseIdx := (bucketIdx + 1) << uint(h.subBucketHalfCountMagnitude)\n\toffsetInBucket := subBucketIdx - h.subBucketHalfCount\n\treturn bucketBaseIdx + offsetInBucket\n}\n\nfunc (h *Histogram) getBucketIndex(v int64) int32 {\n\tpow2Ceiling := bitLen(v | h.subBucketMask)\n\treturn int32(pow2Ceiling - int64(h.unitMagnitude) -\n\t\tint64(h.subBucketHalfCountMagnitude+1))\n}\n\nfunc (h *Histogram) getSubBucketIdx(v int64, idx int32) int32 {\n\treturn int32(v >> uint(int64(idx)+int64(h.unitMagnitude)))\n}\n\nfunc (h *Histogram) countsIndexFor(v int64) int {\n\tbucketIdx := h.getBucketIndex(v)\n\tsubBucketIdx := h.getSubBucketIdx(v, bucketIdx)\n\treturn int(h.countsIndex(bucketIdx, subBucketIdx))\n}\n\ntype iterator struct {\n\th                                    *Histogram\n\tbucketIdx, subBucketIdx              int32\n\tcountAtIdx, countToIdx, valueFromIdx int64\n\thighestEquivalentValue               int64\n}\n\nfunc (i *iterator) next() bool {\n\tif i.countToIdx >= i.h.totalCount {\n\t\treturn false\n\t}\n\n\t// increment bucket\n\ti.subBucketIdx++\n\tif i.subBucketIdx >= i.h.subBucketCount {\n\t\ti.subBucketIdx = i.h.subBucketHalfCount\n\t\ti.bucketIdx++\n\t}\n\n\tif i.bucketIdx >= i.h.bucketCount {\n\t\treturn false\n\t}\n\n\ti.countAtIdx = i.h.getCountAtIndex(i.bucketIdx, i.subBucketIdx)\n\ti.countToIdx += i.countAtIdx\n\ti.valueFromIdx = i.h.valueFromIndex(i.bucketIdx, i.subBucketIdx)\n\ti.highestEquivalentValue = i.h.highestEquivalentValue(i.valueFromIdx)\n\n\treturn true\n}\n\ntype rIterator struct {\n\titerator\n\tcountAddedThisStep int64\n}\n\nfunc (r *rIterator) next() bool {\n\tfor r.iterator.next() {\n\t\tif r.countAtIdx != 0 {\n\t\t\tr.countAddedThisStep = r.countAtIdx\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\ntype pIterator struct {\n\titerator\n\tseenLastValue          bool\n\tticksPerHalfDistance   int32\n\tpercentileToIteratorTo float64\n\tpercentile             float64\n}\n\nfunc (p *pIterator) next() bool {\n\tif !(p.countToIdx < p.h.totalCount) {\n\t\tif p.seenLastValue {\n\t\t\treturn false\n\t\t}\n\n\t\tp.seenLastValue = true\n\t\tp.percentile = 100\n\n\t\treturn true\n\t}\n\n\tif p.subBucketIdx == -1 && !p.iterator.next() {\n\t\treturn false\n\t}\n\n\tvar done = false\n\tfor !done {\n\t\tcurrentPercentile := (100.0 * float64(p.countToIdx)) / float64(p.h.totalCount)\n\t\tif p.countAtIdx != 0 && p.percentileToIteratorTo <= currentPercentile {\n\t\t\tp.percentile = p.percentileToIteratorTo\n\t\t\thalfDistance := math.Trunc(math.Pow(2, math.Trunc(math.Log2(100.0/(100.0-p.percentileToIteratorTo)))+1))\n\t\t\tpercentileReportingTicks := float64(p.ticksPerHalfDistance) * halfDistance\n\t\t\tp.percentileToIteratorTo += 100.0 / percentileReportingTicks\n\t\t\treturn true\n\t\t}\n\t\tdone = !p.iterator.next()\n\t}\n\n\treturn true\n}\n\nfunc bitLen(x int64) (n int64) {\n\tfor ; x >= 0x8000; x >>= 16 {\n\t\tn += 16\n\t}\n\tif x >= 0x80 {\n\t\tx >>= 8\n\t\tn += 8\n\t}\n\tif x >= 0x8 {\n\t\tx >>= 4\n\t\tn += 4\n\t}\n\tif x >= 0x2 {\n\t\tx >>= 2\n\t\tn += 2\n\t}\n\tif x >= 0x1 {\n\t\tn++\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/codahale/hdrhistogram/window.go",
    "content": "package hdrhistogram\n\n// A WindowedHistogram combines histograms to provide windowed statistics.\ntype WindowedHistogram struct {\n\tidx int\n\th   []Histogram\n\tm   *Histogram\n\n\tCurrent *Histogram\n}\n\n// NewWindowed creates a new WindowedHistogram with N underlying histograms with\n// the given parameters.\nfunc NewWindowed(n int, minValue, maxValue int64, sigfigs int) *WindowedHistogram {\n\tw := WindowedHistogram{\n\t\tidx: -1,\n\t\th:   make([]Histogram, n),\n\t\tm:   New(minValue, maxValue, sigfigs),\n\t}\n\n\tfor i := range w.h {\n\t\tw.h[i] = *New(minValue, maxValue, sigfigs)\n\t}\n\tw.Rotate()\n\n\treturn &w\n}\n\n// Merge returns a histogram which includes the recorded values from all the\n// sections of the window.\nfunc (w *WindowedHistogram) Merge() *Histogram {\n\tw.m.Reset()\n\tfor _, h := range w.h {\n\t\tw.m.Merge(&h)\n\t}\n\treturn w.m\n}\n\n// Rotate resets the oldest histogram and rotates it to be used as the current\n// histogram.\nfunc (w *WindowedHistogram) Rotate() {\n\tw.idx++\n\tw.Current = &w.h[w.idx%len(w.h)]\n\tw.Current.Reset()\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/.gitignore",
    "content": "# Compiled Object files, Static and Dynamic libs (Shared Objects)\n*.o\n*.a\n*.so\n\n# Folders\n_obj\n_test\n\n# Architecture specific extensions/prefixes\n*.[568vq]\n[568vq].out\n\n*.cgo1.go\n*.cgo2.c\n_cgo_defun.c\n_cgo_gotypes.go\n_cgo_export.*\n\n_testmain.go\n\n*.exe\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/.travis.yml",
    "content": "language: go\ngo:\n    - 1.5.4\n    - 1.6.3\n    - 1.7\ninstall:\n    - go get -v golang.org/x/tools/cmd/cover\nscript:\n    - go test -v -tags=safe ./spew\n    - go test -v -tags=testcgo ./spew -covermode=count -coverprofile=profile.cov\nafter_success:\n    - go get -v github.com/mattn/goveralls\n    - export PATH=$PATH:$HOME/gopath/bin\n    - goveralls -coverprofile=profile.cov -service=travis-ci\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/LICENSE",
    "content": "ISC License\n\nCopyright (c) 2012-2016 Dave Collins <dave@davec.name>\n\nPermission to use, copy, modify, and distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/README.md",
    "content": "go-spew\n=======\n\n[![Build Status](https://img.shields.io/travis/davecgh/go-spew.svg)]\n(https://travis-ci.org/davecgh/go-spew) [![ISC License]\n(http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) [![Coverage Status]\n(https://img.shields.io/coveralls/davecgh/go-spew.svg)]\n(https://coveralls.io/r/davecgh/go-spew?branch=master)\n\n\nGo-spew implements a deep pretty printer for Go data structures to aid in\ndebugging.  A comprehensive suite of tests with 100% test coverage is provided\nto ensure proper functionality.  See `test_coverage.txt` for the gocov coverage\nreport.  Go-spew is licensed under the liberal ISC license, so it may be used in\nopen source or commercial projects.\n\nIf you're interested in reading about how this package came to life and some\nof the challenges involved in providing a deep pretty printer, there is a blog\npost about it\n[here](https://web.archive.org/web/20160304013555/https://blog.cyphertite.com/go-spew-a-journey-into-dumping-go-data-structures/).\n\n## Documentation\n\n[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)]\n(http://godoc.org/github.com/davecgh/go-spew/spew)\n\nFull `go doc` style documentation for the project can be viewed online without\ninstalling this package by using the excellent GoDoc site here:\nhttp://godoc.org/github.com/davecgh/go-spew/spew\n\nYou can also view the documentation locally once the package is installed with\nthe `godoc` tool by running `godoc -http=\":6060\"` and pointing your browser to\nhttp://localhost:6060/pkg/github.com/davecgh/go-spew/spew\n\n## Installation\n\n```bash\n$ go get -u github.com/davecgh/go-spew/spew\n```\n\n## Quick Start\n\nAdd this import line to the file you're working in:\n\n```Go\nimport \"github.com/davecgh/go-spew/spew\"\n```\n\nTo dump a variable with full newlines, indentation, type, and pointer\ninformation use Dump, Fdump, or Sdump:\n\n```Go\nspew.Dump(myVar1, myVar2, ...)\nspew.Fdump(someWriter, myVar1, myVar2, ...)\nstr := spew.Sdump(myVar1, myVar2, ...)\n```\n\nAlternatively, if you would prefer to use format strings with a compacted inline\nprinting style, use the convenience wrappers Printf, Fprintf, etc with %v (most\ncompact), %+v (adds pointer addresses), %#v (adds types), or %#+v (adds types\nand pointer addresses): \n\n```Go\nspew.Printf(\"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\nspew.Printf(\"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\nspew.Fprintf(someWriter, \"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\nspew.Fprintf(someWriter, \"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n```\n\n## Debugging a Web Application Example\n\nHere is an example of how you can use `spew.Sdump()` to help debug a web application. Please be sure to wrap your output using the `html.EscapeString()` function for safety reasons. You should also only use this debugging technique in a development environment, never in production.\n\n```Go\npackage main\n\nimport (\n    \"fmt\"\n    \"html\"\n    \"net/http\"\n\n    \"github.com/davecgh/go-spew/spew\"\n)\n\nfunc handler(w http.ResponseWriter, r *http.Request) {\n    w.Header().Set(\"Content-Type\", \"text/html\")\n    fmt.Fprintf(w, \"Hi there, %s!\", r.URL.Path[1:])\n    fmt.Fprintf(w, \"<!--\\n\" + html.EscapeString(spew.Sdump(w)) + \"\\n-->\")\n}\n\nfunc main() {\n    http.HandleFunc(\"/\", handler)\n    http.ListenAndServe(\":8080\", nil)\n}\n```\n\n## Sample Dump Output\n\n```\n(main.Foo) {\n unexportedField: (*main.Bar)(0xf84002e210)({\n  flag: (main.Flag) flagTwo,\n  data: (uintptr) <nil>\n }),\n ExportedField: (map[interface {}]interface {}) {\n  (string) \"one\": (bool) true\n }\n}\n([]uint8) {\n 00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20  |............... |\n 00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30  |!\"#$%&'()*+,-./0|\n 00000020  31 32                                             |12|\n}\n```\n\n## Sample Formatter Output\n\nDouble pointer to a uint8:\n```\n\t  %v: <**>5\n\t %+v: <**>(0xf8400420d0->0xf8400420c8)5\n\t %#v: (**uint8)5\n\t%#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5\n```\n\nPointer to circular struct with a uint8 field and a pointer to itself:\n```\n\t  %v: <*>{1 <*><shown>}\n\t %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)<shown>}\n\t %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)<shown>}\n\t%#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)<shown>}\n```\n\n## Configuration Options\n\nConfiguration of spew is handled by fields in the ConfigState type. For\nconvenience, all of the top-level functions use a global state available via the\nspew.Config global.\n\nIt is also possible to create a ConfigState instance that provides methods\nequivalent to the top-level functions. This allows concurrent configuration\noptions. See the ConfigState documentation for more details.\n\n```\n* Indent\n\tString to use for each indentation level for Dump functions.\n\tIt is a single space by default.  A popular alternative is \"\\t\".\n\n* MaxDepth\n\tMaximum number of levels to descend into nested data structures.\n\tThere is no limit by default.\n\n* DisableMethods\n\tDisables invocation of error and Stringer interface methods.\n\tMethod invocation is enabled by default.\n\n* DisablePointerMethods\n\tDisables invocation of error and Stringer interface methods on types\n\twhich only accept pointer receivers from non-pointer variables.  This option\n\trelies on access to the unsafe package, so it will not have any effect when\n\trunning in environments without access to the unsafe package such as Google\n\tApp Engine or with the \"safe\" build tag specified.\n\tPointer method invocation is enabled by default.\n\n* DisablePointerAddresses\n\tDisablePointerAddresses specifies whether to disable the printing of\n\tpointer addresses. This is useful when diffing data structures in tests.\n\n* DisableCapacities\n\tDisableCapacities specifies whether to disable the printing of capacities\n\tfor arrays, slices, maps and channels. This is useful when diffing data\n\tstructures in tests.\n\n* ContinueOnMethod\n\tEnables recursion into types after invoking error and Stringer interface\n\tmethods. Recursion after method invocation is disabled by default.\n\n* SortKeys\n\tSpecifies map keys should be sorted before being printed. Use\n\tthis to have a more deterministic, diffable output.  Note that\n\tonly native types (bool, int, uint, floats, uintptr and string)\n\tand types which implement error or Stringer interfaces are supported,\n\twith other types sorted according to the reflect.Value.String() output\n\twhich guarantees display stability.  Natural map order is used by\n\tdefault.\n\n* SpewKeys\n\tSpewKeys specifies that, as a last resort attempt, map keys should be\n\tspewed to strings and sorted by those strings.  This is only considered\n\tif SortKeys is true.\n\n```\n\n## Unsafe Package Dependency\n\nThis package relies on the unsafe package to perform some of the more advanced\nfeatures, however it also supports a \"limited\" mode which allows it to work in\nenvironments where the unsafe package is not available.  By default, it will\noperate in this mode on Google App Engine and when compiled with GopherJS.  The\n\"safe\" build tag may also be specified to force the package to build without\nusing the unsafe package.\n\n## License\n\nGo-spew is licensed under the [copyfree](http://copyfree.org) ISC License.\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/cov_report.sh",
    "content": "#!/bin/sh\n\n# This script uses gocov to generate a test coverage report.\n# The gocov tool my be obtained with the following command:\n#   go get github.com/axw/gocov/gocov\n#\n# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH.\n\n# Check for gocov.\nif ! type gocov >/dev/null 2>&1; then\n\techo >&2 \"This script requires the gocov tool.\"\n\techo >&2 \"You may obtain it with the following command:\"\n\techo >&2 \"go get github.com/axw/gocov/gocov\"\n\texit 1\nfi\n\n# Only run the cgo tests if gcc is installed.\nif type gcc >/dev/null 2>&1; then\n\t(cd spew && gocov test -tags testcgo | gocov report)\nelse\n\t(cd spew && gocov test | gocov report)\nfi\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/bypass.go",
    "content": "// Copyright (c) 2015-2016 Dave Collins <dave@davec.name>\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when the code is not running on Google App Engine, compiled by GopherJS, and\n// \"-tags safe\" is not added to the go build command line.  The \"disableunsafe\"\n// tag is deprecated and thus should not be used.\n// +build !js,!appengine,!safe,!disableunsafe\n\npackage spew\n\nimport (\n\t\"reflect\"\n\t\"unsafe\"\n)\n\nconst (\n\t// UnsafeDisabled is a build-time constant which specifies whether or\n\t// not access to the unsafe package is available.\n\tUnsafeDisabled = false\n\n\t// ptrSize is the size of a pointer on the current arch.\n\tptrSize = unsafe.Sizeof((*byte)(nil))\n)\n\nvar (\n\t// offsetPtr, offsetScalar, and offsetFlag are the offsets for the\n\t// internal reflect.Value fields.  These values are valid before golang\n\t// commit ecccf07e7f9d which changed the format.  The are also valid\n\t// after commit 82f48826c6c7 which changed the format again to mirror\n\t// the original format.  Code in the init function updates these offsets\n\t// as necessary.\n\toffsetPtr    = uintptr(ptrSize)\n\toffsetScalar = uintptr(0)\n\toffsetFlag   = uintptr(ptrSize * 2)\n\n\t// flagKindWidth and flagKindShift indicate various bits that the\n\t// reflect package uses internally to track kind information.\n\t//\n\t// flagRO indicates whether or not the value field of a reflect.Value is\n\t// read-only.\n\t//\n\t// flagIndir indicates whether the value field of a reflect.Value is\n\t// the actual data or a pointer to the data.\n\t//\n\t// These values are valid before golang commit 90a7c3c86944 which\n\t// changed their positions.  Code in the init function updates these\n\t// flags as necessary.\n\tflagKindWidth = uintptr(5)\n\tflagKindShift = uintptr(flagKindWidth - 1)\n\tflagRO        = uintptr(1 << 0)\n\tflagIndir     = uintptr(1 << 1)\n)\n\nfunc init() {\n\t// Older versions of reflect.Value stored small integers directly in the\n\t// ptr field (which is named val in the older versions).  Versions\n\t// between commits ecccf07e7f9d and 82f48826c6c7 added a new field named\n\t// scalar for this purpose which unfortunately came before the flag\n\t// field, so the offset of the flag field is different for those\n\t// versions.\n\t//\n\t// This code constructs a new reflect.Value from a known small integer\n\t// and checks if the size of the reflect.Value struct indicates it has\n\t// the scalar field. When it does, the offsets are updated accordingly.\n\tvv := reflect.ValueOf(0xf00)\n\tif unsafe.Sizeof(vv) == (ptrSize * 4) {\n\t\toffsetScalar = ptrSize * 2\n\t\toffsetFlag = ptrSize * 3\n\t}\n\n\t// Commit 90a7c3c86944 changed the flag positions such that the low\n\t// order bits are the kind.  This code extracts the kind from the flags\n\t// field and ensures it's the correct type.  When it's not, the flag\n\t// order has been changed to the newer format, so the flags are updated\n\t// accordingly.\n\tupf := unsafe.Pointer(uintptr(unsafe.Pointer(&vv)) + offsetFlag)\n\tupfv := *(*uintptr)(upf)\n\tflagKindMask := uintptr((1<<flagKindWidth - 1) << flagKindShift)\n\tif (upfv&flagKindMask)>>flagKindShift != uintptr(reflect.Int) {\n\t\tflagKindShift = 0\n\t\tflagRO = 1 << 5\n\t\tflagIndir = 1 << 6\n\n\t\t// Commit adf9b30e5594 modified the flags to separate the\n\t\t// flagRO flag into two bits which specifies whether or not the\n\t\t// field is embedded.  This causes flagIndir to move over a bit\n\t\t// and means that flagRO is the combination of either of the\n\t\t// original flagRO bit and the new bit.\n\t\t//\n\t\t// This code detects the change by extracting what used to be\n\t\t// the indirect bit to ensure it's set.  When it's not, the flag\n\t\t// order has been changed to the newer format, so the flags are\n\t\t// updated accordingly.\n\t\tif upfv&flagIndir == 0 {\n\t\t\tflagRO = 3 << 5\n\t\t\tflagIndir = 1 << 7\n\t\t}\n\t}\n}\n\n// unsafeReflectValue converts the passed reflect.Value into a one that bypasses\n// the typical safety restrictions preventing access to unaddressable and\n// unexported data.  It works by digging the raw pointer to the underlying\n// value out of the protected value and generating a new unprotected (unsafe)\n// reflect.Value to it.\n//\n// This allows us to check for implementations of the Stringer and error\n// interfaces to be used for pretty printing ordinarily unaddressable and\n// inaccessible values such as unexported struct fields.\nfunc unsafeReflectValue(v reflect.Value) (rv reflect.Value) {\n\tindirects := 1\n\tvt := v.Type()\n\tupv := unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetPtr)\n\trvf := *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetFlag))\n\tif rvf&flagIndir != 0 {\n\t\tvt = reflect.PtrTo(v.Type())\n\t\tindirects++\n\t} else if offsetScalar != 0 {\n\t\t// The value is in the scalar field when it's not one of the\n\t\t// reference types.\n\t\tswitch vt.Kind() {\n\t\tcase reflect.Uintptr:\n\t\tcase reflect.Chan:\n\t\tcase reflect.Func:\n\t\tcase reflect.Map:\n\t\tcase reflect.Ptr:\n\t\tcase reflect.UnsafePointer:\n\t\tdefault:\n\t\t\tupv = unsafe.Pointer(uintptr(unsafe.Pointer(&v)) +\n\t\t\t\toffsetScalar)\n\t\t}\n\t}\n\n\tpv := reflect.NewAt(vt, upv)\n\trv = pv\n\tfor i := 0; i < indirects; i++ {\n\t\trv = rv.Elem()\n\t}\n\treturn rv\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/bypasssafe.go",
    "content": "// Copyright (c) 2015-2016 Dave Collins <dave@davec.name>\n//\n// Permission to use, copy, modify, and distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// NOTE: Due to the following build constraints, this file will only be compiled\n// when the code is running on Google App Engine, compiled by GopherJS, or\n// \"-tags safe\" is added to the go build command line.  The \"disableunsafe\"\n// tag is deprecated and thus should not be used.\n// +build js appengine safe disableunsafe\n\npackage spew\n\nimport \"reflect\"\n\nconst (\n\t// UnsafeDisabled is a build-time constant which specifies whether or\n\t// not access to the unsafe package is available.\n\tUnsafeDisabled = true\n)\n\n// unsafeReflectValue typically converts the passed reflect.Value into a one\n// that bypasses the typical safety restrictions preventing access to\n// unaddressable and unexported data.  However, doing this relies on access to\n// the unsafe package.  This is a stub version which simply returns the passed\n// reflect.Value when the unsafe package is not available.\nfunc unsafeReflectValue(v reflect.Value) reflect.Value {\n\treturn v\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/common.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n)\n\n// Some constants in the form of bytes to avoid string overhead.  This mirrors\n// the technique used in the fmt package.\nvar (\n\tpanicBytes            = []byte(\"(PANIC=\")\n\tplusBytes             = []byte(\"+\")\n\tiBytes                = []byte(\"i\")\n\ttrueBytes             = []byte(\"true\")\n\tfalseBytes            = []byte(\"false\")\n\tinterfaceBytes        = []byte(\"(interface {})\")\n\tcommaNewlineBytes     = []byte(\",\\n\")\n\tnewlineBytes          = []byte(\"\\n\")\n\topenBraceBytes        = []byte(\"{\")\n\topenBraceNewlineBytes = []byte(\"{\\n\")\n\tcloseBraceBytes       = []byte(\"}\")\n\tasteriskBytes         = []byte(\"*\")\n\tcolonBytes            = []byte(\":\")\n\tcolonSpaceBytes       = []byte(\": \")\n\topenParenBytes        = []byte(\"(\")\n\tcloseParenBytes       = []byte(\")\")\n\tspaceBytes            = []byte(\" \")\n\tpointerChainBytes     = []byte(\"->\")\n\tnilAngleBytes         = []byte(\"<nil>\")\n\tmaxNewlineBytes       = []byte(\"<max depth reached>\\n\")\n\tmaxShortBytes         = []byte(\"<max>\")\n\tcircularBytes         = []byte(\"<already shown>\")\n\tcircularShortBytes    = []byte(\"<shown>\")\n\tinvalidAngleBytes     = []byte(\"<invalid>\")\n\topenBracketBytes      = []byte(\"[\")\n\tcloseBracketBytes     = []byte(\"]\")\n\tpercentBytes          = []byte(\"%\")\n\tprecisionBytes        = []byte(\".\")\n\topenAngleBytes        = []byte(\"<\")\n\tcloseAngleBytes       = []byte(\">\")\n\topenMapBytes          = []byte(\"map[\")\n\tcloseMapBytes         = []byte(\"]\")\n\tlenEqualsBytes        = []byte(\"len=\")\n\tcapEqualsBytes        = []byte(\"cap=\")\n)\n\n// hexDigits is used to map a decimal value to a hex digit.\nvar hexDigits = \"0123456789abcdef\"\n\n// catchPanic handles any panics that might occur during the handleMethods\n// calls.\nfunc catchPanic(w io.Writer, v reflect.Value) {\n\tif err := recover(); err != nil {\n\t\tw.Write(panicBytes)\n\t\tfmt.Fprintf(w, \"%v\", err)\n\t\tw.Write(closeParenBytes)\n\t}\n}\n\n// handleMethods attempts to call the Error and String methods on the underlying\n// type the passed reflect.Value represents and outputes the result to Writer w.\n//\n// It handles panics in any called methods by catching and displaying the error\n// as the formatted value.\nfunc handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) {\n\t// We need an interface to check if the type implements the error or\n\t// Stringer interface.  However, the reflect package won't give us an\n\t// interface on certain things like unexported struct fields in order\n\t// to enforce visibility rules.  We use unsafe, when it's available,\n\t// to bypass these restrictions since this package does not mutate the\n\t// values.\n\tif !v.CanInterface() {\n\t\tif UnsafeDisabled {\n\t\t\treturn false\n\t\t}\n\n\t\tv = unsafeReflectValue(v)\n\t}\n\n\t// Choose whether or not to do error and Stringer interface lookups against\n\t// the base type or a pointer to the base type depending on settings.\n\t// Technically calling one of these methods with a pointer receiver can\n\t// mutate the value, however, types which choose to satisify an error or\n\t// Stringer interface with a pointer receiver should not be mutating their\n\t// state inside these interface methods.\n\tif !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() {\n\t\tv = unsafeReflectValue(v)\n\t}\n\tif v.CanAddr() {\n\t\tv = v.Addr()\n\t}\n\n\t// Is it an error or Stringer?\n\tswitch iface := v.Interface().(type) {\n\tcase error:\n\t\tdefer catchPanic(w, v)\n\t\tif cs.ContinueOnMethod {\n\t\t\tw.Write(openParenBytes)\n\t\t\tw.Write([]byte(iface.Error()))\n\t\t\tw.Write(closeParenBytes)\n\t\t\tw.Write(spaceBytes)\n\t\t\treturn false\n\t\t}\n\n\t\tw.Write([]byte(iface.Error()))\n\t\treturn true\n\n\tcase fmt.Stringer:\n\t\tdefer catchPanic(w, v)\n\t\tif cs.ContinueOnMethod {\n\t\t\tw.Write(openParenBytes)\n\t\t\tw.Write([]byte(iface.String()))\n\t\t\tw.Write(closeParenBytes)\n\t\t\tw.Write(spaceBytes)\n\t\t\treturn false\n\t\t}\n\t\tw.Write([]byte(iface.String()))\n\t\treturn true\n\t}\n\treturn false\n}\n\n// printBool outputs a boolean value as true or false to Writer w.\nfunc printBool(w io.Writer, val bool) {\n\tif val {\n\t\tw.Write(trueBytes)\n\t} else {\n\t\tw.Write(falseBytes)\n\t}\n}\n\n// printInt outputs a signed integer value to Writer w.\nfunc printInt(w io.Writer, val int64, base int) {\n\tw.Write([]byte(strconv.FormatInt(val, base)))\n}\n\n// printUint outputs an unsigned integer value to Writer w.\nfunc printUint(w io.Writer, val uint64, base int) {\n\tw.Write([]byte(strconv.FormatUint(val, base)))\n}\n\n// printFloat outputs a floating point value using the specified precision,\n// which is expected to be 32 or 64bit, to Writer w.\nfunc printFloat(w io.Writer, val float64, precision int) {\n\tw.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision)))\n}\n\n// printComplex outputs a complex value using the specified float precision\n// for the real and imaginary parts to Writer w.\nfunc printComplex(w io.Writer, c complex128, floatPrecision int) {\n\tr := real(c)\n\tw.Write(openParenBytes)\n\tw.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision)))\n\ti := imag(c)\n\tif i >= 0 {\n\t\tw.Write(plusBytes)\n\t}\n\tw.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision)))\n\tw.Write(iBytes)\n\tw.Write(closeParenBytes)\n}\n\n// printHexPtr outputs a uintptr formatted as hexidecimal with a leading '0x'\n// prefix to Writer w.\nfunc printHexPtr(w io.Writer, p uintptr) {\n\t// Null pointer.\n\tnum := uint64(p)\n\tif num == 0 {\n\t\tw.Write(nilAngleBytes)\n\t\treturn\n\t}\n\n\t// Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix\n\tbuf := make([]byte, 18)\n\n\t// It's simpler to construct the hex string right to left.\n\tbase := uint64(16)\n\ti := len(buf) - 1\n\tfor num >= base {\n\t\tbuf[i] = hexDigits[num%base]\n\t\tnum /= base\n\t\ti--\n\t}\n\tbuf[i] = hexDigits[num]\n\n\t// Add '0x' prefix.\n\ti--\n\tbuf[i] = 'x'\n\ti--\n\tbuf[i] = '0'\n\n\t// Strip unused leading bytes.\n\tbuf = buf[i:]\n\tw.Write(buf)\n}\n\n// valuesSorter implements sort.Interface to allow a slice of reflect.Value\n// elements to be sorted.\ntype valuesSorter struct {\n\tvalues  []reflect.Value\n\tstrings []string // either nil or same len and values\n\tcs      *ConfigState\n}\n\n// newValuesSorter initializes a valuesSorter instance, which holds a set of\n// surrogate keys on which the data should be sorted.  It uses flags in\n// ConfigState to decide if and how to populate those surrogate keys.\nfunc newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface {\n\tvs := &valuesSorter{values: values, cs: cs}\n\tif canSortSimply(vs.values[0].Kind()) {\n\t\treturn vs\n\t}\n\tif !cs.DisableMethods {\n\t\tvs.strings = make([]string, len(values))\n\t\tfor i := range vs.values {\n\t\t\tb := bytes.Buffer{}\n\t\t\tif !handleMethods(cs, &b, vs.values[i]) {\n\t\t\t\tvs.strings = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvs.strings[i] = b.String()\n\t\t}\n\t}\n\tif vs.strings == nil && cs.SpewKeys {\n\t\tvs.strings = make([]string, len(values))\n\t\tfor i := range vs.values {\n\t\t\tvs.strings[i] = Sprintf(\"%#v\", vs.values[i].Interface())\n\t\t}\n\t}\n\treturn vs\n}\n\n// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted\n// directly, or whether it should be considered for sorting by surrogate keys\n// (if the ConfigState allows it).\nfunc canSortSimply(kind reflect.Kind) bool {\n\t// This switch parallels valueSortLess, except for the default case.\n\tswitch kind {\n\tcase reflect.Bool:\n\t\treturn true\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\treturn true\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\treturn true\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn true\n\tcase reflect.String:\n\t\treturn true\n\tcase reflect.Uintptr:\n\t\treturn true\n\tcase reflect.Array:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Len returns the number of values in the slice.  It is part of the\n// sort.Interface implementation.\nfunc (s *valuesSorter) Len() int {\n\treturn len(s.values)\n}\n\n// Swap swaps the values at the passed indices.  It is part of the\n// sort.Interface implementation.\nfunc (s *valuesSorter) Swap(i, j int) {\n\ts.values[i], s.values[j] = s.values[j], s.values[i]\n\tif s.strings != nil {\n\t\ts.strings[i], s.strings[j] = s.strings[j], s.strings[i]\n\t}\n}\n\n// valueSortLess returns whether the first value should sort before the second\n// value.  It is used by valueSorter.Less as part of the sort.Interface\n// implementation.\nfunc valueSortLess(a, b reflect.Value) bool {\n\tswitch a.Kind() {\n\tcase reflect.Bool:\n\t\treturn !a.Bool() && b.Bool()\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\treturn a.Int() < b.Int()\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\treturn a.Uint() < b.Uint()\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn a.Float() < b.Float()\n\tcase reflect.String:\n\t\treturn a.String() < b.String()\n\tcase reflect.Uintptr:\n\t\treturn a.Uint() < b.Uint()\n\tcase reflect.Array:\n\t\t// Compare the contents of both arrays.\n\t\tl := a.Len()\n\t\tfor i := 0; i < l; i++ {\n\t\t\tav := a.Index(i)\n\t\t\tbv := b.Index(i)\n\t\t\tif av.Interface() == bv.Interface() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn valueSortLess(av, bv)\n\t\t}\n\t}\n\treturn a.String() < b.String()\n}\n\n// Less returns whether the value at index i should sort before the\n// value at index j.  It is part of the sort.Interface implementation.\nfunc (s *valuesSorter) Less(i, j int) bool {\n\tif s.strings == nil {\n\t\treturn valueSortLess(s.values[i], s.values[j])\n\t}\n\treturn s.strings[i] < s.strings[j]\n}\n\n// sortValues is a sort function that handles both native types and any type that\n// can be converted to error or Stringer.  Other inputs are sorted according to\n// their Value.String() value to ensure display stability.\nfunc sortValues(values []reflect.Value, cs *ConfigState) {\n\tif len(values) == 0 {\n\t\treturn\n\t}\n\tsort.Sort(newValuesSorter(values, cs))\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/config.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n)\n\n// ConfigState houses the configuration options used by spew to format and\n// display values.  There is a global instance, Config, that is used to control\n// all top-level Formatter and Dump functionality.  Each ConfigState instance\n// provides methods equivalent to the top-level functions.\n//\n// The zero value for ConfigState provides no indentation.  You would typically\n// want to set it to a space or a tab.\n//\n// Alternatively, you can use NewDefaultConfig to get a ConfigState instance\n// with default settings.  See the documentation of NewDefaultConfig for default\n// values.\ntype ConfigState struct {\n\t// Indent specifies the string to use for each indentation level.  The\n\t// global config instance that all top-level functions use set this to a\n\t// single space by default.  If you would like more indentation, you might\n\t// set this to a tab with \"\\t\" or perhaps two spaces with \"  \".\n\tIndent string\n\n\t// MaxDepth controls the maximum number of levels to descend into nested\n\t// data structures.  The default, 0, means there is no limit.\n\t//\n\t// NOTE: Circular data structures are properly detected, so it is not\n\t// necessary to set this value unless you specifically want to limit deeply\n\t// nested data structures.\n\tMaxDepth int\n\n\t// DisableMethods specifies whether or not error and Stringer interfaces are\n\t// invoked for types that implement them.\n\tDisableMethods bool\n\n\t// DisablePointerMethods specifies whether or not to check for and invoke\n\t// error and Stringer interfaces on types which only accept a pointer\n\t// receiver when the current type is not a pointer.\n\t//\n\t// NOTE: This might be an unsafe action since calling one of these methods\n\t// with a pointer receiver could technically mutate the value, however,\n\t// in practice, types which choose to satisify an error or Stringer\n\t// interface with a pointer receiver should not be mutating their state\n\t// inside these interface methods.  As a result, this option relies on\n\t// access to the unsafe package, so it will not have any effect when\n\t// running in environments without access to the unsafe package such as\n\t// Google App Engine or with the \"safe\" build tag specified.\n\tDisablePointerMethods bool\n\n\t// DisablePointerAddresses specifies whether to disable the printing of\n\t// pointer addresses. This is useful when diffing data structures in tests.\n\tDisablePointerAddresses bool\n\n\t// DisableCapacities specifies whether to disable the printing of capacities\n\t// for arrays, slices, maps and channels. This is useful when diffing\n\t// data structures in tests.\n\tDisableCapacities bool\n\n\t// ContinueOnMethod specifies whether or not recursion should continue once\n\t// a custom error or Stringer interface is invoked.  The default, false,\n\t// means it will print the results of invoking the custom error or Stringer\n\t// interface and return immediately instead of continuing to recurse into\n\t// the internals of the data type.\n\t//\n\t// NOTE: This flag does not have any effect if method invocation is disabled\n\t// via the DisableMethods or DisablePointerMethods options.\n\tContinueOnMethod bool\n\n\t// SortKeys specifies map keys should be sorted before being printed. Use\n\t// this to have a more deterministic, diffable output.  Note that only\n\t// native types (bool, int, uint, floats, uintptr and string) and types\n\t// that support the error or Stringer interfaces (if methods are\n\t// enabled) are supported, with other types sorted according to the\n\t// reflect.Value.String() output which guarantees display stability.\n\tSortKeys bool\n\n\t// SpewKeys specifies that, as a last resort attempt, map keys should\n\t// be spewed to strings and sorted by those strings.  This is only\n\t// considered if SortKeys is true.\n\tSpewKeys bool\n}\n\n// Config is the active configuration of the top-level functions.\n// The configuration can be changed by modifying the contents of spew.Config.\nvar Config = ConfigState{Indent: \" \"}\n\n// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the formatted string as a value that satisfies error.  See NewFormatter\n// for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Errorf(format string, a ...interface{}) (err error) {\n\treturn fmt.Errorf(format, c.convertArgs(a)...)\n}\n\n// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprint(w, c.convertArgs(a)...)\n}\n\n// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintf(w, format, c.convertArgs(a)...)\n}\n\n// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it\n// passed with a Formatter interface returned by c.NewFormatter.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintln(w, c.convertArgs(a)...)\n}\n\n// Print is a wrapper for fmt.Print that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Print(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Print(a ...interface{}) (n int, err error) {\n\treturn fmt.Print(c.convertArgs(a)...)\n}\n\n// Printf is a wrapper for fmt.Printf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Printf(format, c.convertArgs(a)...)\n}\n\n// Println is a wrapper for fmt.Println that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Println(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Println(a ...interface{}) (n int, err error) {\n\treturn fmt.Println(c.convertArgs(a)...)\n}\n\n// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprint(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Sprint(a ...interface{}) string {\n\treturn fmt.Sprint(c.convertArgs(a)...)\n}\n\n// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were\n// passed with a Formatter interface returned by c.NewFormatter.  It returns\n// the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Sprintf(format string, a ...interface{}) string {\n\treturn fmt.Sprintf(format, c.convertArgs(a)...)\n}\n\n// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it\n// were passed with a Formatter interface returned by c.NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b))\nfunc (c *ConfigState) Sprintln(a ...interface{}) string {\n\treturn fmt.Sprintln(c.convertArgs(a)...)\n}\n\n/*\nNewFormatter returns a custom formatter that satisfies the fmt.Formatter\ninterface.  As a result, it integrates cleanly with standard fmt package\nprinting functions.  The formatter is useful for inline printing of smaller data\ntypes similar to the standard %v format specifier.\n\nThe custom formatter only responds to the %v (most compact), %+v (adds pointer\naddresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb\ncombinations.  Any other verbs such as %x and %q will be sent to the the\nstandard fmt package for formatting.  In addition, the custom formatter ignores\nthe width and precision arguments (however they will still work on the format\nspecifiers not handled by the custom formatter).\n\nTypically this function shouldn't be called directly.  It is much easier to make\nuse of the custom formatter by calling one of the convenience functions such as\nc.Printf, c.Println, or c.Printf.\n*/\nfunc (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter {\n\treturn newFormatter(c, v)\n}\n\n// Fdump formats and displays the passed arguments to io.Writer w.  It formats\n// exactly the same as Dump.\nfunc (c *ConfigState) Fdump(w io.Writer, a ...interface{}) {\n\tfdump(c, w, a...)\n}\n\n/*\nDump displays the passed parameters to standard out with newlines, customizable\nindentation, and additional debug information such as complete types and all\npointer addresses used to indirect to the final value.  It provides the\nfollowing features over the built-in printing facilities provided by the fmt\npackage:\n\n\t* Pointers are dereferenced and followed\n\t* Circular data structures are detected and handled properly\n\t* Custom Stringer/error interfaces are optionally invoked, including\n\t  on unexported types\n\t* Custom types which only implement the Stringer/error interfaces via\n\t  a pointer receiver are optionally invoked when passing non-pointer\n\t  variables\n\t* Byte arrays and slices are dumped like the hexdump -C command which\n\t  includes offsets, byte values in hex, and ASCII output\n\nThe configuration options are controlled by modifying the public members\nof c.  See ConfigState for options documentation.\n\nSee Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to\nget the formatted result as a string.\n*/\nfunc (c *ConfigState) Dump(a ...interface{}) {\n\tfdump(c, os.Stdout, a...)\n}\n\n// Sdump returns a string with the passed arguments formatted exactly the same\n// as Dump.\nfunc (c *ConfigState) Sdump(a ...interface{}) string {\n\tvar buf bytes.Buffer\n\tfdump(c, &buf, a...)\n\treturn buf.String()\n}\n\n// convertArgs accepts a slice of arguments and returns a slice of the same\n// length with each argument converted to a spew Formatter interface using\n// the ConfigState associated with s.\nfunc (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) {\n\tformatters = make([]interface{}, len(args))\n\tfor index, arg := range args {\n\t\tformatters[index] = newFormatter(c, arg)\n\t}\n\treturn formatters\n}\n\n// NewDefaultConfig returns a ConfigState with the following default settings.\n//\n// \tIndent: \" \"\n// \tMaxDepth: 0\n// \tDisableMethods: false\n// \tDisablePointerMethods: false\n// \tContinueOnMethod: false\n// \tSortKeys: false\nfunc NewDefaultConfig() *ConfigState {\n\treturn &ConfigState{Indent: \" \"}\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/doc.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\nPackage spew implements a deep pretty printer for Go data structures to aid in\ndebugging.\n\nA quick overview of the additional features spew provides over the built-in\nprinting facilities for Go data types are as follows:\n\n\t* Pointers are dereferenced and followed\n\t* Circular data structures are detected and handled properly\n\t* Custom Stringer/error interfaces are optionally invoked, including\n\t  on unexported types\n\t* Custom types which only implement the Stringer/error interfaces via\n\t  a pointer receiver are optionally invoked when passing non-pointer\n\t  variables\n\t* Byte arrays and slices are dumped like the hexdump -C command which\n\t  includes offsets, byte values in hex, and ASCII output (only when using\n\t  Dump style)\n\nThere are two different approaches spew allows for dumping Go data structures:\n\n\t* Dump style which prints with newlines, customizable indentation,\n\t  and additional debug information such as types and all pointer addresses\n\t  used to indirect to the final value\n\t* A custom Formatter interface that integrates cleanly with the standard fmt\n\t  package and replaces %v, %+v, %#v, and %#+v to provide inline printing\n\t  similar to the default %v while providing the additional functionality\n\t  outlined above and passing unsupported format verbs such as %x and %q\n\t  along to fmt\n\nQuick Start\n\nThis section demonstrates how to quickly get started with spew.  See the\nsections below for further details on formatting and configuration options.\n\nTo dump a variable with full newlines, indentation, type, and pointer\ninformation use Dump, Fdump, or Sdump:\n\tspew.Dump(myVar1, myVar2, ...)\n\tspew.Fdump(someWriter, myVar1, myVar2, ...)\n\tstr := spew.Sdump(myVar1, myVar2, ...)\n\nAlternatively, if you would prefer to use format strings with a compacted inline\nprinting style, use the convenience wrappers Printf, Fprintf, etc with\n%v (most compact), %+v (adds pointer addresses), %#v (adds types), or\n%#+v (adds types and pointer addresses):\n\tspew.Printf(\"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Printf(\"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\tspew.Fprintf(someWriter, \"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Fprintf(someWriter, \"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\nConfiguration Options\n\nConfiguration of spew is handled by fields in the ConfigState type.  For\nconvenience, all of the top-level functions use a global state available\nvia the spew.Config global.\n\nIt is also possible to create a ConfigState instance that provides methods\nequivalent to the top-level functions.  This allows concurrent configuration\noptions.  See the ConfigState documentation for more details.\n\nThe following configuration options are available:\n\t* Indent\n\t\tString to use for each indentation level for Dump functions.\n\t\tIt is a single space by default.  A popular alternative is \"\\t\".\n\n\t* MaxDepth\n\t\tMaximum number of levels to descend into nested data structures.\n\t\tThere is no limit by default.\n\n\t* DisableMethods\n\t\tDisables invocation of error and Stringer interface methods.\n\t\tMethod invocation is enabled by default.\n\n\t* DisablePointerMethods\n\t\tDisables invocation of error and Stringer interface methods on types\n\t\twhich only accept pointer receivers from non-pointer variables.\n\t\tPointer method invocation is enabled by default.\n\n\t* DisablePointerAddresses\n\t\tDisablePointerAddresses specifies whether to disable the printing of\n\t\tpointer addresses. This is useful when diffing data structures in tests.\n\n\t* DisableCapacities\n\t\tDisableCapacities specifies whether to disable the printing of\n\t\tcapacities for arrays, slices, maps and channels. This is useful when\n\t\tdiffing data structures in tests.\n\n\t* ContinueOnMethod\n\t\tEnables recursion into types after invoking error and Stringer interface\n\t\tmethods. Recursion after method invocation is disabled by default.\n\n\t* SortKeys\n\t\tSpecifies map keys should be sorted before being printed. Use\n\t\tthis to have a more deterministic, diffable output.  Note that\n\t\tonly native types (bool, int, uint, floats, uintptr and string)\n\t\tand types which implement error or Stringer interfaces are\n\t\tsupported with other types sorted according to the\n\t\treflect.Value.String() output which guarantees display\n\t\tstability.  Natural map order is used by default.\n\n\t* SpewKeys\n\t\tSpecifies that, as a last resort attempt, map keys should be\n\t\tspewed to strings and sorted by those strings.  This is only\n\t\tconsidered if SortKeys is true.\n\nDump Usage\n\nSimply call spew.Dump with a list of variables you want to dump:\n\n\tspew.Dump(myVar1, myVar2, ...)\n\nYou may also call spew.Fdump if you would prefer to output to an arbitrary\nio.Writer.  For example, to dump to standard error:\n\n\tspew.Fdump(os.Stderr, myVar1, myVar2, ...)\n\nA third option is to call spew.Sdump to get the formatted output as a string:\n\n\tstr := spew.Sdump(myVar1, myVar2, ...)\n\nSample Dump Output\n\nSee the Dump example for details on the setup of the types and variables being\nshown here.\n\n\t(main.Foo) {\n\t unexportedField: (*main.Bar)(0xf84002e210)({\n\t  flag: (main.Flag) flagTwo,\n\t  data: (uintptr) <nil>\n\t }),\n\t ExportedField: (map[interface {}]interface {}) (len=1) {\n\t  (string) (len=3) \"one\": (bool) true\n\t }\n\t}\n\nByte (and uint8) arrays and slices are displayed uniquely like the hexdump -C\ncommand as shown.\n\t([]uint8) (len=32 cap=32) {\n\t 00000000  11 12 13 14 15 16 17 18  19 1a 1b 1c 1d 1e 1f 20  |............... |\n\t 00000010  21 22 23 24 25 26 27 28  29 2a 2b 2c 2d 2e 2f 30  |!\"#$%&'()*+,-./0|\n\t 00000020  31 32                                             |12|\n\t}\n\nCustom Formatter\n\nSpew provides a custom formatter that implements the fmt.Formatter interface\nso that it integrates cleanly with standard fmt package printing functions. The\nformatter is useful for inline printing of smaller data types similar to the\nstandard %v format specifier.\n\nThe custom formatter only responds to the %v (most compact), %+v (adds pointer\naddresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb\ncombinations.  Any other verbs such as %x and %q will be sent to the the\nstandard fmt package for formatting.  In addition, the custom formatter ignores\nthe width and precision arguments (however they will still work on the format\nspecifiers not handled by the custom formatter).\n\nCustom Formatter Usage\n\nThe simplest way to make use of the spew custom formatter is to call one of the\nconvenience functions such as spew.Printf, spew.Println, or spew.Printf.  The\nfunctions have syntax you are most likely already familiar with:\n\n\tspew.Printf(\"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Printf(\"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\tspew.Println(myVar, myVar2)\n\tspew.Fprintf(os.Stderr, \"myVar1: %v -- myVar2: %+v\", myVar1, myVar2)\n\tspew.Fprintf(os.Stderr, \"myVar3: %#v -- myVar4: %#+v\", myVar3, myVar4)\n\nSee the Index for the full list convenience functions.\n\nSample Formatter Output\n\nDouble pointer to a uint8:\n\t  %v: <**>5\n\t %+v: <**>(0xf8400420d0->0xf8400420c8)5\n\t %#v: (**uint8)5\n\t%#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5\n\nPointer to circular struct with a uint8 field and a pointer to itself:\n\t  %v: <*>{1 <*><shown>}\n\t %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)<shown>}\n\t %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)<shown>}\n\t%#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)<shown>}\n\nSee the Printf example for details on the setup of variables being shown\nhere.\n\nErrors\n\nSince it is possible for custom Stringer/error interfaces to panic, spew\ndetects them and handles them internally by printing the panic information\ninline with the output.  Since spew is intended to provide deep pretty printing\ncapabilities on structures, it intentionally does not return any errors.\n*/\npackage spew\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/dump.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nvar (\n\t// uint8Type is a reflect.Type representing a uint8.  It is used to\n\t// convert cgo types to uint8 slices for hexdumping.\n\tuint8Type = reflect.TypeOf(uint8(0))\n\n\t// cCharRE is a regular expression that matches a cgo char.\n\t// It is used to detect character arrays to hexdump them.\n\tcCharRE = regexp.MustCompile(\"^.*\\\\._Ctype_char$\")\n\n\t// cUnsignedCharRE is a regular expression that matches a cgo unsigned\n\t// char.  It is used to detect unsigned character arrays to hexdump\n\t// them.\n\tcUnsignedCharRE = regexp.MustCompile(\"^.*\\\\._Ctype_unsignedchar$\")\n\n\t// cUint8tCharRE is a regular expression that matches a cgo uint8_t.\n\t// It is used to detect uint8_t arrays to hexdump them.\n\tcUint8tCharRE = regexp.MustCompile(\"^.*\\\\._Ctype_uint8_t$\")\n)\n\n// dumpState contains information about the state of a dump operation.\ntype dumpState struct {\n\tw                io.Writer\n\tdepth            int\n\tpointers         map[uintptr]int\n\tignoreNextType   bool\n\tignoreNextIndent bool\n\tcs               *ConfigState\n}\n\n// indent performs indentation according to the depth level and cs.Indent\n// option.\nfunc (d *dumpState) indent() {\n\tif d.ignoreNextIndent {\n\t\td.ignoreNextIndent = false\n\t\treturn\n\t}\n\td.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth))\n}\n\n// unpackValue returns values inside of non-nil interfaces when possible.\n// This is useful for data types like structs, arrays, slices, and maps which\n// can contain varying types packed inside an interface.\nfunc (d *dumpState) unpackValue(v reflect.Value) reflect.Value {\n\tif v.Kind() == reflect.Interface && !v.IsNil() {\n\t\tv = v.Elem()\n\t}\n\treturn v\n}\n\n// dumpPtr handles formatting of pointers by indirecting them as necessary.\nfunc (d *dumpState) dumpPtr(v reflect.Value) {\n\t// Remove pointers at or below the current depth from map used to detect\n\t// circular refs.\n\tfor k, depth := range d.pointers {\n\t\tif depth >= d.depth {\n\t\t\tdelete(d.pointers, k)\n\t\t}\n\t}\n\n\t// Keep list of all dereferenced pointers to show later.\n\tpointerChain := make([]uintptr, 0)\n\n\t// Figure out how many levels of indirection there are by dereferencing\n\t// pointers and unpacking interfaces down the chain while detecting circular\n\t// references.\n\tnilFound := false\n\tcycleFound := false\n\tindirects := 0\n\tve := v\n\tfor ve.Kind() == reflect.Ptr {\n\t\tif ve.IsNil() {\n\t\t\tnilFound = true\n\t\t\tbreak\n\t\t}\n\t\tindirects++\n\t\taddr := ve.Pointer()\n\t\tpointerChain = append(pointerChain, addr)\n\t\tif pd, ok := d.pointers[addr]; ok && pd < d.depth {\n\t\t\tcycleFound = true\n\t\t\tindirects--\n\t\t\tbreak\n\t\t}\n\t\td.pointers[addr] = d.depth\n\n\t\tve = ve.Elem()\n\t\tif ve.Kind() == reflect.Interface {\n\t\t\tif ve.IsNil() {\n\t\t\t\tnilFound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tve = ve.Elem()\n\t\t}\n\t}\n\n\t// Display type information.\n\td.w.Write(openParenBytes)\n\td.w.Write(bytes.Repeat(asteriskBytes, indirects))\n\td.w.Write([]byte(ve.Type().String()))\n\td.w.Write(closeParenBytes)\n\n\t// Display pointer information.\n\tif !d.cs.DisablePointerAddresses && len(pointerChain) > 0 {\n\t\td.w.Write(openParenBytes)\n\t\tfor i, addr := range pointerChain {\n\t\t\tif i > 0 {\n\t\t\t\td.w.Write(pointerChainBytes)\n\t\t\t}\n\t\t\tprintHexPtr(d.w, addr)\n\t\t}\n\t\td.w.Write(closeParenBytes)\n\t}\n\n\t// Display dereferenced value.\n\td.w.Write(openParenBytes)\n\tswitch {\n\tcase nilFound == true:\n\t\td.w.Write(nilAngleBytes)\n\n\tcase cycleFound == true:\n\t\td.w.Write(circularBytes)\n\n\tdefault:\n\t\td.ignoreNextType = true\n\t\td.dump(ve)\n\t}\n\td.w.Write(closeParenBytes)\n}\n\n// dumpSlice handles formatting of arrays and slices.  Byte (uint8 under\n// reflection) arrays and slices are dumped in hexdump -C fashion.\nfunc (d *dumpState) dumpSlice(v reflect.Value) {\n\t// Determine whether this type should be hex dumped or not.  Also,\n\t// for types which should be hexdumped, try to use the underlying data\n\t// first, then fall back to trying to convert them to a uint8 slice.\n\tvar buf []uint8\n\tdoConvert := false\n\tdoHexDump := false\n\tnumEntries := v.Len()\n\tif numEntries > 0 {\n\t\tvt := v.Index(0).Type()\n\t\tvts := vt.String()\n\t\tswitch {\n\t\t// C types that need to be converted.\n\t\tcase cCharRE.MatchString(vts):\n\t\t\tfallthrough\n\t\tcase cUnsignedCharRE.MatchString(vts):\n\t\t\tfallthrough\n\t\tcase cUint8tCharRE.MatchString(vts):\n\t\t\tdoConvert = true\n\n\t\t// Try to use existing uint8 slices and fall back to converting\n\t\t// and copying if that fails.\n\t\tcase vt.Kind() == reflect.Uint8:\n\t\t\t// We need an addressable interface to convert the type\n\t\t\t// to a byte slice.  However, the reflect package won't\n\t\t\t// give us an interface on certain things like\n\t\t\t// unexported struct fields in order to enforce\n\t\t\t// visibility rules.  We use unsafe, when available, to\n\t\t\t// bypass these restrictions since this package does not\n\t\t\t// mutate the values.\n\t\t\tvs := v\n\t\t\tif !vs.CanInterface() || !vs.CanAddr() {\n\t\t\t\tvs = unsafeReflectValue(vs)\n\t\t\t}\n\t\t\tif !UnsafeDisabled {\n\t\t\t\tvs = vs.Slice(0, numEntries)\n\n\t\t\t\t// Use the existing uint8 slice if it can be\n\t\t\t\t// type asserted.\n\t\t\t\tiface := vs.Interface()\n\t\t\t\tif slice, ok := iface.([]uint8); ok {\n\t\t\t\t\tbuf = slice\n\t\t\t\t\tdoHexDump = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// The underlying data needs to be converted if it can't\n\t\t\t// be type asserted to a uint8 slice.\n\t\t\tdoConvert = true\n\t\t}\n\n\t\t// Copy and convert the underlying type if needed.\n\t\tif doConvert && vt.ConvertibleTo(uint8Type) {\n\t\t\t// Convert and copy each element into a uint8 byte\n\t\t\t// slice.\n\t\t\tbuf = make([]uint8, numEntries)\n\t\t\tfor i := 0; i < numEntries; i++ {\n\t\t\t\tvv := v.Index(i)\n\t\t\t\tbuf[i] = uint8(vv.Convert(uint8Type).Uint())\n\t\t\t}\n\t\t\tdoHexDump = true\n\t\t}\n\t}\n\n\t// Hexdump the entire slice as needed.\n\tif doHexDump {\n\t\tindent := strings.Repeat(d.cs.Indent, d.depth)\n\t\tstr := indent + hex.Dump(buf)\n\t\tstr = strings.Replace(str, \"\\n\", \"\\n\"+indent, -1)\n\t\tstr = strings.TrimRight(str, d.cs.Indent)\n\t\td.w.Write([]byte(str))\n\t\treturn\n\t}\n\n\t// Recursively call dump for each item.\n\tfor i := 0; i < numEntries; i++ {\n\t\td.dump(d.unpackValue(v.Index(i)))\n\t\tif i < (numEntries - 1) {\n\t\t\td.w.Write(commaNewlineBytes)\n\t\t} else {\n\t\t\td.w.Write(newlineBytes)\n\t\t}\n\t}\n}\n\n// dump is the main workhorse for dumping a value.  It uses the passed reflect\n// value to figure out what kind of object we are dealing with and formats it\n// appropriately.  It is a recursive function, however circular data structures\n// are detected and handled properly.\nfunc (d *dumpState) dump(v reflect.Value) {\n\t// Handle invalid reflect values immediately.\n\tkind := v.Kind()\n\tif kind == reflect.Invalid {\n\t\td.w.Write(invalidAngleBytes)\n\t\treturn\n\t}\n\n\t// Handle pointers specially.\n\tif kind == reflect.Ptr {\n\t\td.indent()\n\t\td.dumpPtr(v)\n\t\treturn\n\t}\n\n\t// Print type information unless already handled elsewhere.\n\tif !d.ignoreNextType {\n\t\td.indent()\n\t\td.w.Write(openParenBytes)\n\t\td.w.Write([]byte(v.Type().String()))\n\t\td.w.Write(closeParenBytes)\n\t\td.w.Write(spaceBytes)\n\t}\n\td.ignoreNextType = false\n\n\t// Display length and capacity if the built-in len and cap functions\n\t// work with the value's kind and the len/cap itself is non-zero.\n\tvalueLen, valueCap := 0, 0\n\tswitch v.Kind() {\n\tcase reflect.Array, reflect.Slice, reflect.Chan:\n\t\tvalueLen, valueCap = v.Len(), v.Cap()\n\tcase reflect.Map, reflect.String:\n\t\tvalueLen = v.Len()\n\t}\n\tif valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 {\n\t\td.w.Write(openParenBytes)\n\t\tif valueLen != 0 {\n\t\t\td.w.Write(lenEqualsBytes)\n\t\t\tprintInt(d.w, int64(valueLen), 10)\n\t\t}\n\t\tif !d.cs.DisableCapacities && valueCap != 0 {\n\t\t\tif valueLen != 0 {\n\t\t\t\td.w.Write(spaceBytes)\n\t\t\t}\n\t\t\td.w.Write(capEqualsBytes)\n\t\t\tprintInt(d.w, int64(valueCap), 10)\n\t\t}\n\t\td.w.Write(closeParenBytes)\n\t\td.w.Write(spaceBytes)\n\t}\n\n\t// Call Stringer/error interfaces if they exist and the handle methods flag\n\t// is enabled\n\tif !d.cs.DisableMethods {\n\t\tif (kind != reflect.Invalid) && (kind != reflect.Interface) {\n\t\t\tif handled := handleMethods(d.cs, d.w, v); handled {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch kind {\n\tcase reflect.Invalid:\n\t\t// Do nothing.  We should never get here since invalid has already\n\t\t// been handled above.\n\n\tcase reflect.Bool:\n\t\tprintBool(d.w, v.Bool())\n\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\tprintInt(d.w, v.Int(), 10)\n\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\tprintUint(d.w, v.Uint(), 10)\n\n\tcase reflect.Float32:\n\t\tprintFloat(d.w, v.Float(), 32)\n\n\tcase reflect.Float64:\n\t\tprintFloat(d.w, v.Float(), 64)\n\n\tcase reflect.Complex64:\n\t\tprintComplex(d.w, v.Complex(), 32)\n\n\tcase reflect.Complex128:\n\t\tprintComplex(d.w, v.Complex(), 64)\n\n\tcase reflect.Slice:\n\t\tif v.IsNil() {\n\t\t\td.w.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\t\tfallthrough\n\n\tcase reflect.Array:\n\t\td.w.Write(openBraceNewlineBytes)\n\t\td.depth++\n\t\tif (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) {\n\t\t\td.indent()\n\t\t\td.w.Write(maxNewlineBytes)\n\t\t} else {\n\t\t\td.dumpSlice(v)\n\t\t}\n\t\td.depth--\n\t\td.indent()\n\t\td.w.Write(closeBraceBytes)\n\n\tcase reflect.String:\n\t\td.w.Write([]byte(strconv.Quote(v.String())))\n\n\tcase reflect.Interface:\n\t\t// The only time we should get here is for nil interfaces due to\n\t\t// unpackValue calls.\n\t\tif v.IsNil() {\n\t\t\td.w.Write(nilAngleBytes)\n\t\t}\n\n\tcase reflect.Ptr:\n\t\t// Do nothing.  We should never get here since pointers have already\n\t\t// been handled above.\n\n\tcase reflect.Map:\n\t\t// nil maps should be indicated as different than empty maps\n\t\tif v.IsNil() {\n\t\t\td.w.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\n\t\td.w.Write(openBraceNewlineBytes)\n\t\td.depth++\n\t\tif (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) {\n\t\t\td.indent()\n\t\t\td.w.Write(maxNewlineBytes)\n\t\t} else {\n\t\t\tnumEntries := v.Len()\n\t\t\tkeys := v.MapKeys()\n\t\t\tif d.cs.SortKeys {\n\t\t\t\tsortValues(keys, d.cs)\n\t\t\t}\n\t\t\tfor i, key := range keys {\n\t\t\t\td.dump(d.unpackValue(key))\n\t\t\t\td.w.Write(colonSpaceBytes)\n\t\t\t\td.ignoreNextIndent = true\n\t\t\t\td.dump(d.unpackValue(v.MapIndex(key)))\n\t\t\t\tif i < (numEntries - 1) {\n\t\t\t\t\td.w.Write(commaNewlineBytes)\n\t\t\t\t} else {\n\t\t\t\t\td.w.Write(newlineBytes)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\td.depth--\n\t\td.indent()\n\t\td.w.Write(closeBraceBytes)\n\n\tcase reflect.Struct:\n\t\td.w.Write(openBraceNewlineBytes)\n\t\td.depth++\n\t\tif (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) {\n\t\t\td.indent()\n\t\t\td.w.Write(maxNewlineBytes)\n\t\t} else {\n\t\t\tvt := v.Type()\n\t\t\tnumFields := v.NumField()\n\t\t\tfor i := 0; i < numFields; i++ {\n\t\t\t\td.indent()\n\t\t\t\tvtf := vt.Field(i)\n\t\t\t\td.w.Write([]byte(vtf.Name))\n\t\t\t\td.w.Write(colonSpaceBytes)\n\t\t\t\td.ignoreNextIndent = true\n\t\t\t\td.dump(d.unpackValue(v.Field(i)))\n\t\t\t\tif i < (numFields - 1) {\n\t\t\t\t\td.w.Write(commaNewlineBytes)\n\t\t\t\t} else {\n\t\t\t\t\td.w.Write(newlineBytes)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\td.depth--\n\t\td.indent()\n\t\td.w.Write(closeBraceBytes)\n\n\tcase reflect.Uintptr:\n\t\tprintHexPtr(d.w, uintptr(v.Uint()))\n\n\tcase reflect.UnsafePointer, reflect.Chan, reflect.Func:\n\t\tprintHexPtr(d.w, v.Pointer())\n\n\t// There were not any other types at the time this code was written, but\n\t// fall back to letting the default fmt package handle it in case any new\n\t// types are added.\n\tdefault:\n\t\tif v.CanInterface() {\n\t\t\tfmt.Fprintf(d.w, \"%v\", v.Interface())\n\t\t} else {\n\t\t\tfmt.Fprintf(d.w, \"%v\", v.String())\n\t\t}\n\t}\n}\n\n// fdump is a helper function to consolidate the logic from the various public\n// methods which take varying writers and config states.\nfunc fdump(cs *ConfigState, w io.Writer, a ...interface{}) {\n\tfor _, arg := range a {\n\t\tif arg == nil {\n\t\t\tw.Write(interfaceBytes)\n\t\t\tw.Write(spaceBytes)\n\t\t\tw.Write(nilAngleBytes)\n\t\t\tw.Write(newlineBytes)\n\t\t\tcontinue\n\t\t}\n\n\t\td := dumpState{w: w, cs: cs}\n\t\td.pointers = make(map[uintptr]int)\n\t\td.dump(reflect.ValueOf(arg))\n\t\td.w.Write(newlineBytes)\n\t}\n}\n\n// Fdump formats and displays the passed arguments to io.Writer w.  It formats\n// exactly the same as Dump.\nfunc Fdump(w io.Writer, a ...interface{}) {\n\tfdump(&Config, w, a...)\n}\n\n// Sdump returns a string with the passed arguments formatted exactly the same\n// as Dump.\nfunc Sdump(a ...interface{}) string {\n\tvar buf bytes.Buffer\n\tfdump(&Config, &buf, a...)\n\treturn buf.String()\n}\n\n/*\nDump displays the passed parameters to standard out with newlines, customizable\nindentation, and additional debug information such as complete types and all\npointer addresses used to indirect to the final value.  It provides the\nfollowing features over the built-in printing facilities provided by the fmt\npackage:\n\n\t* Pointers are dereferenced and followed\n\t* Circular data structures are detected and handled properly\n\t* Custom Stringer/error interfaces are optionally invoked, including\n\t  on unexported types\n\t* Custom types which only implement the Stringer/error interfaces via\n\t  a pointer receiver are optionally invoked when passing non-pointer\n\t  variables\n\t* Byte arrays and slices are dumped like the hexdump -C command which\n\t  includes offsets, byte values in hex, and ASCII output\n\nThe configuration options are controlled by an exported package global,\nspew.Config.  See ConfigState for options documentation.\n\nSee Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to\nget the formatted result as a string.\n*/\nfunc Dump(a ...interface{}) {\n\tfdump(&Config, os.Stdout, a...)\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/format.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// supportedFlags is a list of all the character flags supported by fmt package.\nconst supportedFlags = \"0-+# \"\n\n// formatState implements the fmt.Formatter interface and contains information\n// about the state of a formatting operation.  The NewFormatter function can\n// be used to get a new Formatter which can be used directly as arguments\n// in standard fmt package printing calls.\ntype formatState struct {\n\tvalue          interface{}\n\tfs             fmt.State\n\tdepth          int\n\tpointers       map[uintptr]int\n\tignoreNextType bool\n\tcs             *ConfigState\n}\n\n// buildDefaultFormat recreates the original format string without precision\n// and width information to pass in to fmt.Sprintf in the case of an\n// unrecognized type.  Unless new types are added to the language, this\n// function won't ever be called.\nfunc (f *formatState) buildDefaultFormat() (format string) {\n\tbuf := bytes.NewBuffer(percentBytes)\n\n\tfor _, flag := range supportedFlags {\n\t\tif f.fs.Flag(int(flag)) {\n\t\t\tbuf.WriteRune(flag)\n\t\t}\n\t}\n\n\tbuf.WriteRune('v')\n\n\tformat = buf.String()\n\treturn format\n}\n\n// constructOrigFormat recreates the original format string including precision\n// and width information to pass along to the standard fmt package.  This allows\n// automatic deferral of all format strings this package doesn't support.\nfunc (f *formatState) constructOrigFormat(verb rune) (format string) {\n\tbuf := bytes.NewBuffer(percentBytes)\n\n\tfor _, flag := range supportedFlags {\n\t\tif f.fs.Flag(int(flag)) {\n\t\t\tbuf.WriteRune(flag)\n\t\t}\n\t}\n\n\tif width, ok := f.fs.Width(); ok {\n\t\tbuf.WriteString(strconv.Itoa(width))\n\t}\n\n\tif precision, ok := f.fs.Precision(); ok {\n\t\tbuf.Write(precisionBytes)\n\t\tbuf.WriteString(strconv.Itoa(precision))\n\t}\n\n\tbuf.WriteRune(verb)\n\n\tformat = buf.String()\n\treturn format\n}\n\n// unpackValue returns values inside of non-nil interfaces when possible and\n// ensures that types for values which have been unpacked from an interface\n// are displayed when the show types flag is also set.\n// This is useful for data types like structs, arrays, slices, and maps which\n// can contain varying types packed inside an interface.\nfunc (f *formatState) unpackValue(v reflect.Value) reflect.Value {\n\tif v.Kind() == reflect.Interface {\n\t\tf.ignoreNextType = false\n\t\tif !v.IsNil() {\n\t\t\tv = v.Elem()\n\t\t}\n\t}\n\treturn v\n}\n\n// formatPtr handles formatting of pointers by indirecting them as necessary.\nfunc (f *formatState) formatPtr(v reflect.Value) {\n\t// Display nil if top level pointer is nil.\n\tshowTypes := f.fs.Flag('#')\n\tif v.IsNil() && (!showTypes || f.ignoreNextType) {\n\t\tf.fs.Write(nilAngleBytes)\n\t\treturn\n\t}\n\n\t// Remove pointers at or below the current depth from map used to detect\n\t// circular refs.\n\tfor k, depth := range f.pointers {\n\t\tif depth >= f.depth {\n\t\t\tdelete(f.pointers, k)\n\t\t}\n\t}\n\n\t// Keep list of all dereferenced pointers to possibly show later.\n\tpointerChain := make([]uintptr, 0)\n\n\t// Figure out how many levels of indirection there are by derferencing\n\t// pointers and unpacking interfaces down the chain while detecting circular\n\t// references.\n\tnilFound := false\n\tcycleFound := false\n\tindirects := 0\n\tve := v\n\tfor ve.Kind() == reflect.Ptr {\n\t\tif ve.IsNil() {\n\t\t\tnilFound = true\n\t\t\tbreak\n\t\t}\n\t\tindirects++\n\t\taddr := ve.Pointer()\n\t\tpointerChain = append(pointerChain, addr)\n\t\tif pd, ok := f.pointers[addr]; ok && pd < f.depth {\n\t\t\tcycleFound = true\n\t\t\tindirects--\n\t\t\tbreak\n\t\t}\n\t\tf.pointers[addr] = f.depth\n\n\t\tve = ve.Elem()\n\t\tif ve.Kind() == reflect.Interface {\n\t\t\tif ve.IsNil() {\n\t\t\t\tnilFound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tve = ve.Elem()\n\t\t}\n\t}\n\n\t// Display type or indirection level depending on flags.\n\tif showTypes && !f.ignoreNextType {\n\t\tf.fs.Write(openParenBytes)\n\t\tf.fs.Write(bytes.Repeat(asteriskBytes, indirects))\n\t\tf.fs.Write([]byte(ve.Type().String()))\n\t\tf.fs.Write(closeParenBytes)\n\t} else {\n\t\tif nilFound || cycleFound {\n\t\t\tindirects += strings.Count(ve.Type().String(), \"*\")\n\t\t}\n\t\tf.fs.Write(openAngleBytes)\n\t\tf.fs.Write([]byte(strings.Repeat(\"*\", indirects)))\n\t\tf.fs.Write(closeAngleBytes)\n\t}\n\n\t// Display pointer information depending on flags.\n\tif f.fs.Flag('+') && (len(pointerChain) > 0) {\n\t\tf.fs.Write(openParenBytes)\n\t\tfor i, addr := range pointerChain {\n\t\t\tif i > 0 {\n\t\t\t\tf.fs.Write(pointerChainBytes)\n\t\t\t}\n\t\t\tprintHexPtr(f.fs, addr)\n\t\t}\n\t\tf.fs.Write(closeParenBytes)\n\t}\n\n\t// Display dereferenced value.\n\tswitch {\n\tcase nilFound == true:\n\t\tf.fs.Write(nilAngleBytes)\n\n\tcase cycleFound == true:\n\t\tf.fs.Write(circularShortBytes)\n\n\tdefault:\n\t\tf.ignoreNextType = true\n\t\tf.format(ve)\n\t}\n}\n\n// format is the main workhorse for providing the Formatter interface.  It\n// uses the passed reflect value to figure out what kind of object we are\n// dealing with and formats it appropriately.  It is a recursive function,\n// however circular data structures are detected and handled properly.\nfunc (f *formatState) format(v reflect.Value) {\n\t// Handle invalid reflect values immediately.\n\tkind := v.Kind()\n\tif kind == reflect.Invalid {\n\t\tf.fs.Write(invalidAngleBytes)\n\t\treturn\n\t}\n\n\t// Handle pointers specially.\n\tif kind == reflect.Ptr {\n\t\tf.formatPtr(v)\n\t\treturn\n\t}\n\n\t// Print type information unless already handled elsewhere.\n\tif !f.ignoreNextType && f.fs.Flag('#') {\n\t\tf.fs.Write(openParenBytes)\n\t\tf.fs.Write([]byte(v.Type().String()))\n\t\tf.fs.Write(closeParenBytes)\n\t}\n\tf.ignoreNextType = false\n\n\t// Call Stringer/error interfaces if they exist and the handle methods\n\t// flag is enabled.\n\tif !f.cs.DisableMethods {\n\t\tif (kind != reflect.Invalid) && (kind != reflect.Interface) {\n\t\t\tif handled := handleMethods(f.cs, f.fs, v); handled {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch kind {\n\tcase reflect.Invalid:\n\t\t// Do nothing.  We should never get here since invalid has already\n\t\t// been handled above.\n\n\tcase reflect.Bool:\n\t\tprintBool(f.fs, v.Bool())\n\n\tcase reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:\n\t\tprintInt(f.fs, v.Int(), 10)\n\n\tcase reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:\n\t\tprintUint(f.fs, v.Uint(), 10)\n\n\tcase reflect.Float32:\n\t\tprintFloat(f.fs, v.Float(), 32)\n\n\tcase reflect.Float64:\n\t\tprintFloat(f.fs, v.Float(), 64)\n\n\tcase reflect.Complex64:\n\t\tprintComplex(f.fs, v.Complex(), 32)\n\n\tcase reflect.Complex128:\n\t\tprintComplex(f.fs, v.Complex(), 64)\n\n\tcase reflect.Slice:\n\t\tif v.IsNil() {\n\t\t\tf.fs.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\t\tfallthrough\n\n\tcase reflect.Array:\n\t\tf.fs.Write(openBracketBytes)\n\t\tf.depth++\n\t\tif (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) {\n\t\t\tf.fs.Write(maxShortBytes)\n\t\t} else {\n\t\t\tnumEntries := v.Len()\n\t\t\tfor i := 0; i < numEntries; i++ {\n\t\t\t\tif i > 0 {\n\t\t\t\t\tf.fs.Write(spaceBytes)\n\t\t\t\t}\n\t\t\t\tf.ignoreNextType = true\n\t\t\t\tf.format(f.unpackValue(v.Index(i)))\n\t\t\t}\n\t\t}\n\t\tf.depth--\n\t\tf.fs.Write(closeBracketBytes)\n\n\tcase reflect.String:\n\t\tf.fs.Write([]byte(v.String()))\n\n\tcase reflect.Interface:\n\t\t// The only time we should get here is for nil interfaces due to\n\t\t// unpackValue calls.\n\t\tif v.IsNil() {\n\t\t\tf.fs.Write(nilAngleBytes)\n\t\t}\n\n\tcase reflect.Ptr:\n\t\t// Do nothing.  We should never get here since pointers have already\n\t\t// been handled above.\n\n\tcase reflect.Map:\n\t\t// nil maps should be indicated as different than empty maps\n\t\tif v.IsNil() {\n\t\t\tf.fs.Write(nilAngleBytes)\n\t\t\tbreak\n\t\t}\n\n\t\tf.fs.Write(openMapBytes)\n\t\tf.depth++\n\t\tif (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) {\n\t\t\tf.fs.Write(maxShortBytes)\n\t\t} else {\n\t\t\tkeys := v.MapKeys()\n\t\t\tif f.cs.SortKeys {\n\t\t\t\tsortValues(keys, f.cs)\n\t\t\t}\n\t\t\tfor i, key := range keys {\n\t\t\t\tif i > 0 {\n\t\t\t\t\tf.fs.Write(spaceBytes)\n\t\t\t\t}\n\t\t\t\tf.ignoreNextType = true\n\t\t\t\tf.format(f.unpackValue(key))\n\t\t\t\tf.fs.Write(colonBytes)\n\t\t\t\tf.ignoreNextType = true\n\t\t\t\tf.format(f.unpackValue(v.MapIndex(key)))\n\t\t\t}\n\t\t}\n\t\tf.depth--\n\t\tf.fs.Write(closeMapBytes)\n\n\tcase reflect.Struct:\n\t\tnumFields := v.NumField()\n\t\tf.fs.Write(openBraceBytes)\n\t\tf.depth++\n\t\tif (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) {\n\t\t\tf.fs.Write(maxShortBytes)\n\t\t} else {\n\t\t\tvt := v.Type()\n\t\t\tfor i := 0; i < numFields; i++ {\n\t\t\t\tif i > 0 {\n\t\t\t\t\tf.fs.Write(spaceBytes)\n\t\t\t\t}\n\t\t\t\tvtf := vt.Field(i)\n\t\t\t\tif f.fs.Flag('+') || f.fs.Flag('#') {\n\t\t\t\t\tf.fs.Write([]byte(vtf.Name))\n\t\t\t\t\tf.fs.Write(colonBytes)\n\t\t\t\t}\n\t\t\t\tf.format(f.unpackValue(v.Field(i)))\n\t\t\t}\n\t\t}\n\t\tf.depth--\n\t\tf.fs.Write(closeBraceBytes)\n\n\tcase reflect.Uintptr:\n\t\tprintHexPtr(f.fs, uintptr(v.Uint()))\n\n\tcase reflect.UnsafePointer, reflect.Chan, reflect.Func:\n\t\tprintHexPtr(f.fs, v.Pointer())\n\n\t// There were not any other types at the time this code was written, but\n\t// fall back to letting the default fmt package handle it if any get added.\n\tdefault:\n\t\tformat := f.buildDefaultFormat()\n\t\tif v.CanInterface() {\n\t\t\tfmt.Fprintf(f.fs, format, v.Interface())\n\t\t} else {\n\t\t\tfmt.Fprintf(f.fs, format, v.String())\n\t\t}\n\t}\n}\n\n// Format satisfies the fmt.Formatter interface. See NewFormatter for usage\n// details.\nfunc (f *formatState) Format(fs fmt.State, verb rune) {\n\tf.fs = fs\n\n\t// Use standard formatting for verbs that are not v.\n\tif verb != 'v' {\n\t\tformat := f.constructOrigFormat(verb)\n\t\tfmt.Fprintf(fs, format, f.value)\n\t\treturn\n\t}\n\n\tif f.value == nil {\n\t\tif fs.Flag('#') {\n\t\t\tfs.Write(interfaceBytes)\n\t\t}\n\t\tfs.Write(nilAngleBytes)\n\t\treturn\n\t}\n\n\tf.format(reflect.ValueOf(f.value))\n}\n\n// newFormatter is a helper function to consolidate the logic from the various\n// public methods which take varying config states.\nfunc newFormatter(cs *ConfigState, v interface{}) fmt.Formatter {\n\tfs := &formatState{value: v, cs: cs}\n\tfs.pointers = make(map[uintptr]int)\n\treturn fs\n}\n\n/*\nNewFormatter returns a custom formatter that satisfies the fmt.Formatter\ninterface.  As a result, it integrates cleanly with standard fmt package\nprinting functions.  The formatter is useful for inline printing of smaller data\ntypes similar to the standard %v format specifier.\n\nThe custom formatter only responds to the %v (most compact), %+v (adds pointer\naddresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb\ncombinations.  Any other verbs such as %x and %q will be sent to the the\nstandard fmt package for formatting.  In addition, the custom formatter ignores\nthe width and precision arguments (however they will still work on the format\nspecifiers not handled by the custom formatter).\n\nTypically this function shouldn't be called directly.  It is much easier to make\nuse of the custom formatter by calling one of the convenience functions such as\nPrintf, Println, or Fprintf.\n*/\nfunc NewFormatter(v interface{}) fmt.Formatter {\n\treturn newFormatter(&Config, v)\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/spew/spew.go",
    "content": "/*\n * Copyright (c) 2013-2016 Dave Collins <dave@davec.name>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\npackage spew\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the formatted string as a value that satisfies error.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Errorf(format string, a ...interface{}) (err error) {\n\treturn fmt.Errorf(format, convertArgs(a)...)\n}\n\n// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Fprint(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprint(w, convertArgs(a)...)\n}\n\n// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintf(w, format, convertArgs(a)...)\n}\n\n// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it\n// passed with a default Formatter interface returned by NewFormatter.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Fprintln(w io.Writer, a ...interface{}) (n int, err error) {\n\treturn fmt.Fprintln(w, convertArgs(a)...)\n}\n\n// Print is a wrapper for fmt.Print that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Print(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Print(a ...interface{}) (n int, err error) {\n\treturn fmt.Print(convertArgs(a)...)\n}\n\n// Printf is a wrapper for fmt.Printf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Printf(format string, a ...interface{}) (n int, err error) {\n\treturn fmt.Printf(format, convertArgs(a)...)\n}\n\n// Println is a wrapper for fmt.Println that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the number of bytes written and any write error encountered.  See\n// NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Println(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Println(a ...interface{}) (n int, err error) {\n\treturn fmt.Println(convertArgs(a)...)\n}\n\n// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Sprint(a ...interface{}) string {\n\treturn fmt.Sprint(convertArgs(a)...)\n}\n\n// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were\n// passed with a default Formatter interface returned by NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Sprintf(format string, a ...interface{}) string {\n\treturn fmt.Sprintf(format, convertArgs(a)...)\n}\n\n// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it\n// were passed with a default Formatter interface returned by NewFormatter.  It\n// returns the resulting string.  See NewFormatter for formatting details.\n//\n// This function is shorthand for the following syntax:\n//\n//\tfmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b))\nfunc Sprintln(a ...interface{}) string {\n\treturn fmt.Sprintln(convertArgs(a)...)\n}\n\n// convertArgs accepts a slice of arguments and returns a slice of the same\n// length with each argument converted to a default spew Formatter interface.\nfunc convertArgs(args []interface{}) (formatters []interface{}) {\n\tformatters = make([]interface{}, len(args))\n\tfor index, arg := range args {\n\t\tformatters[index] = NewFormatter(arg)\n\t}\n\treturn formatters\n}\n"
  },
  {
    "path": "vendor/github.com/davecgh/go-spew/test_coverage.txt",
    "content": "\ngithub.com/davecgh/go-spew/spew/dump.go\t\t dumpState.dump\t\t\t 100.00% (88/88)\ngithub.com/davecgh/go-spew/spew/format.go\t formatState.format\t\t 100.00% (82/82)\ngithub.com/davecgh/go-spew/spew/format.go\t formatState.formatPtr\t\t 100.00% (52/52)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t dumpState.dumpPtr\t\t 100.00% (44/44)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t dumpState.dumpSlice\t\t 100.00% (39/39)\ngithub.com/davecgh/go-spew/spew/common.go\t handleMethods\t\t\t 100.00% (30/30)\ngithub.com/davecgh/go-spew/spew/common.go\t printHexPtr\t\t\t 100.00% (18/18)\ngithub.com/davecgh/go-spew/spew/common.go\t unsafeReflectValue\t\t 100.00% (13/13)\ngithub.com/davecgh/go-spew/spew/format.go\t formatState.constructOrigFormat 100.00% (12/12)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t fdump\t\t\t\t 100.00% (11/11)\ngithub.com/davecgh/go-spew/spew/format.go\t formatState.Format\t\t 100.00% (11/11)\ngithub.com/davecgh/go-spew/spew/common.go\t init\t\t\t\t 100.00% (10/10)\ngithub.com/davecgh/go-spew/spew/common.go\t printComplex\t\t\t 100.00% (9/9)\ngithub.com/davecgh/go-spew/spew/common.go\t valuesSorter.Less\t\t 100.00% (8/8)\ngithub.com/davecgh/go-spew/spew/format.go\t formatState.buildDefaultFormat\t 100.00% (7/7)\ngithub.com/davecgh/go-spew/spew/format.go\t formatState.unpackValue\t 100.00% (5/5)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t dumpState.indent\t\t 100.00% (4/4)\ngithub.com/davecgh/go-spew/spew/common.go\t catchPanic\t\t\t 100.00% (4/4)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.convertArgs\t 100.00% (4/4)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t convertArgs\t\t\t 100.00% (4/4)\ngithub.com/davecgh/go-spew/spew/format.go\t newFormatter\t\t\t 100.00% (3/3)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t Sdump\t\t\t\t 100.00% (3/3)\ngithub.com/davecgh/go-spew/spew/common.go\t printBool\t\t\t 100.00% (3/3)\ngithub.com/davecgh/go-spew/spew/common.go\t sortValues\t\t\t 100.00% (3/3)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Sdump\t\t 100.00% (3/3)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t dumpState.unpackValue\t\t 100.00% (3/3)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Printf\t\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Println\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Sprint\t\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Sprintf\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Sprintln\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/common.go\t printFloat\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t NewDefaultConfig\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/common.go\t printInt\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/common.go\t printUint\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/common.go\t valuesSorter.Len\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/common.go\t valuesSorter.Swap\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Errorf\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Fprint\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Fprintf\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Fprintln\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Print\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Printf\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Println\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Sprint\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Sprintf\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Sprintln\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.NewFormatter\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Fdump\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/config.go\t ConfigState.Dump\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t Fdump\t\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/dump.go\t\t Dump\t\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Fprintln\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/format.go\t NewFormatter\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Errorf\t\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Fprint\t\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Fprintf\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew/spew.go\t\t Print\t\t\t\t 100.00% (1/1)\ngithub.com/davecgh/go-spew/spew\t\t\t ------------------------------- 100.00% (505/505)\n\n"
  },
  {
    "path": "vendor/github.com/deckarep/golang-set/LICENSE",
    "content": "Open Source Initiative OSI - The MIT License (MIT):Licensing\n\nThe MIT License (MIT)\nCopyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "vendor/github.com/deckarep/golang-set/README.md",
    "content": "[![Build Status](https://travis-ci.org/deckarep/golang-set.svg?branch=master)](https://travis-ci.org/deckarep/golang-set)\n[![Go Report Card](https://goreportcard.com/badge/github.com/deckarep/golang-set)](https://goreportcard.com/report/github.com/deckarep/golang-set)\n[![GoDoc](https://godoc.org/github.com/deckarep/golang-set?status.svg)](http://godoc.org/github.com/deckarep/golang-set)\n\n## golang-set\n\n\nThe missing set collection for the Go language.  Until Go has sets built-in...use this.\n\nComing from Python one of the things I miss is the superbly wonderful set collection.  This is my attempt to mimic the primary features of the set from Python.\nYou can of course argue that there is no need for a set in Go, otherwise the creators would have added one to the standard library.  To those I say simply ignore this repository\nand carry-on and to the rest that find this useful please contribute in helping me make it better by:\n\n* Helping to make more idiomatic improvements to the code.\n* Helping to increase the performance of it. ~~(So far, no attempt has been made, but since it uses a map internally, I expect it to be mostly performant.)~~\n* Helping to make the unit-tests more robust and kick-ass.\n* Helping to fill in the [documentation.](http://godoc.org/github.com/deckarep/golang-set)\n* Simply offering feedback and suggestions.  (Positive, constructive feedback is appreciated.)\n\nI have to give some credit for helping seed the idea with this post on [stackoverflow.](http://programmers.stackexchange.com/questions/177428/sets-data-structure-in-golang)\n\n*Update* - as of 3/9/2014, you can use a compile-time generic version of this package in the [gen](http://clipperhouse.github.io/gen/) framework.  This framework allows you to use the golang-set in a completely generic and type-safe way by allowing you to generate a supporting .go file based on your custom types.\n\n## Features (as of 9/22/2014)\n\n* a CartesianProduct() method has been added with unit-tests: [Read more about the cartesian product](http://en.wikipedia.org/wiki/Cartesian_product)\n\n## Features (as of 9/15/2014)\n\n* a PowerSet() method has been added with unit-tests: [Read more about the Power set](http://en.wikipedia.org/wiki/Power_set)\n\n## Features (as of 4/22/2014)\n\n* One common interface to both implementations\n* Two set implementations to choose from\n  * a thread-safe implementation designed for concurrent use\n  * a non-thread-safe implementation designed for performance\n* 75 benchmarks for both implementations\n* 35 unit tests for both implementations\n* 14 concurrent tests for the thread-safe implementation\n\n\n\nPlease see the unit test file for additional usage examples.  The Python set documentation will also do a better job than I can of explaining how a set typically [works.](http://docs.python.org/2/library/sets.html)    Please keep in mind\nhowever that the Python set is a built-in type and supports additional features and syntax that make it awesome.\n\n## Examples but not exhaustive:\n\n```go\nrequiredClasses := mapset.NewSet()\nrequiredClasses.Add(\"Cooking\")\nrequiredClasses.Add(\"English\")\nrequiredClasses.Add(\"Math\")\nrequiredClasses.Add(\"Biology\")\n\nscienceSlice := []interface{}{\"Biology\", \"Chemistry\"}\nscienceClasses := mapset.NewSetFromSlice(scienceSlice)\n\nelectiveClasses := mapset.NewSet()\nelectiveClasses.Add(\"Welding\")\nelectiveClasses.Add(\"Music\")\nelectiveClasses.Add(\"Automotive\")\n\nbonusClasses := mapset.NewSet()\nbonusClasses.Add(\"Go Programming\")\nbonusClasses.Add(\"Python Programming\")\n\n//Show me all the available classes I can take\nallClasses := requiredClasses.Union(scienceClasses).Union(electiveClasses).Union(bonusClasses)\nfmt.Println(allClasses) //Set{Cooking, English, Math, Chemistry, Welding, Biology, Music, Automotive, Go Programming, Python Programming}\n\n\n//Is cooking considered a science class?\nfmt.Println(scienceClasses.Contains(\"Cooking\")) //false\n\n//Show me all classes that are not science classes, since I hate science.\nfmt.Println(allClasses.Difference(scienceClasses)) //Set{Music, Automotive, Go Programming, Python Programming, Cooking, English, Math, Welding}\n\n//Which science classes are also required classes?\nfmt.Println(scienceClasses.Intersect(requiredClasses)) //Set{Biology}\n\n//How many bonus classes do you offer?\nfmt.Println(bonusClasses.Cardinality()) //2\n\n//Do you have the following classes? Welding, Automotive and English?\nfmt.Println(allClasses.IsSuperset(mapset.NewSetFromSlice([]interface{}{\"Welding\", \"Automotive\", \"English\"}))) //true\n```\n\nThanks!\n\n-Ralph\n\n[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/deckarep/golang-set/trend.png)](https://bitdeli.com/free \"Bitdeli Badge\")\n\n[![Analytics](https://ga-beacon.appspot.com/UA-42584447-2/deckarep/golang-set)](https://github.com/igrigorik/ga-beacon)\n"
  },
  {
    "path": "vendor/github.com/deckarep/golang-set/iterator.go",
    "content": "/*\nOpen Source Initiative OSI - The MIT License (MIT):Licensing\n\nThe MIT License (MIT)\nCopyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, 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\npackage mapset\n\n// Iterator defines an iterator over a Set, its C channel can be used to range over the Set's\n// elements.\ntype Iterator struct {\n\tC    <-chan interface{}\n\tstop chan struct{}\n}\n\n// Stop stops the Iterator, no further elements will be received on C, C will be closed.\nfunc (i *Iterator) Stop() {\n\t// Allows for Stop() to be called multiple times\n\t// (close() panics when called on already closed channel)\n\tdefer func() {\n\t\trecover()\n\t}()\n\n\tclose(i.stop)\n\n\t// Exhaust any remaining elements.\n\tfor range i.C {\n\t}\n}\n\n// newIterator returns a new Iterator instance together with its item and stop channels.\nfunc newIterator() (*Iterator, chan<- interface{}, <-chan struct{}) {\n\titemChan := make(chan interface{})\n\tstopChan := make(chan struct{})\n\treturn &Iterator{\n\t\tC:    itemChan,\n\t\tstop: stopChan,\n\t}, itemChan, stopChan\n}\n"
  },
  {
    "path": "vendor/github.com/deckarep/golang-set/set.go",
    "content": "/*\nOpen Source Initiative OSI - The MIT License (MIT):Licensing\n\nThe MIT License (MIT)\nCopyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, 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// Package mapset implements a simple and generic set collection.\n// Items stored within it are unordered and unique. It supports\n// typical set operations: membership testing, intersection, union,\n// difference, symmetric difference and cloning.\n//\n// Package mapset provides two implementations of the Set\n// interface. The default implementation is safe for concurrent\n// access, but a non-thread-safe implementation is also provided for\n// programs that can benefit from the slight speed improvement and\n// that can enforce mutual exclusion through other means.\npackage mapset\n\n// Set is the primary interface provided by the mapset package.  It\n// represents an unordered set of data and a large number of\n// operations that can be applied to that set.\ntype Set interface {\n\t// Adds an element to the set. Returns whether\n\t// the item was added.\n\tAdd(i interface{}) bool\n\n\t// Returns the number of elements in the set.\n\tCardinality() int\n\n\t// Removes all elements from the set, leaving\n\t// the empty set.\n\tClear()\n\n\t// Returns a clone of the set using the same\n\t// implementation, duplicating all keys.\n\tClone() Set\n\n\t// Returns whether the given items\n\t// are all in the set.\n\tContains(i ...interface{}) bool\n\n\t// Returns the difference between this set\n\t// and other. The returned set will contain\n\t// all elements of this set that are not also\n\t// elements of other.\n\t//\n\t// Note that the argument to Difference\n\t// must be of the same type as the receiver\n\t// of the method. Otherwise, Difference will\n\t// panic.\n\tDifference(other Set) Set\n\n\t// Determines if two sets are equal to each\n\t// other. If they have the same cardinality\n\t// and contain the same elements, they are\n\t// considered equal. The order in which\n\t// the elements were added is irrelevant.\n\t//\n\t// Note that the argument to Equal must be\n\t// of the same type as the receiver of the\n\t// method. Otherwise, Equal will panic.\n\tEqual(other Set) bool\n\n\t// Returns a new set containing only the elements\n\t// that exist only in both sets.\n\t//\n\t// Note that the argument to Intersect\n\t// must be of the same type as the receiver\n\t// of the method. Otherwise, Intersect will\n\t// panic.\n\tIntersect(other Set) Set\n\n\t// Determines if every element in this set is in\n\t// the other set but the two sets are not equal.\n\t//\n\t// Note that the argument to IsProperSubset\n\t// must be of the same type as the receiver\n\t// of the method. Otherwise, IsProperSubset\n\t// will panic.\n\tIsProperSubset(other Set) bool\n\n\t// Determines if every element in the other set\n\t// is in this set but the two sets are not\n\t// equal.\n\t//\n\t// Note that the argument to IsSuperset\n\t// must be of the same type as the receiver\n\t// of the method. Otherwise, IsSuperset will\n\t// panic.\n\tIsProperSuperset(other Set) bool\n\n\t// Determines if every element in this set is in\n\t// the other set.\n\t//\n\t// Note that the argument to IsSubset\n\t// must be of the same type as the receiver\n\t// of the method. Otherwise, IsSubset will\n\t// panic.\n\tIsSubset(other Set) bool\n\n\t// Determines if every element in the other set\n\t// is in this set.\n\t//\n\t// Note that the argument to IsSuperset\n\t// must be of the same type as the receiver\n\t// of the method. Otherwise, IsSuperset will\n\t// panic.\n\tIsSuperset(other Set) bool\n\n\t// Iterates over elements and executes the passed func against each element.\n\t// If passed func returns true, stop iteration at the time.\n\tEach(func(interface{}) bool)\n\n\t// Returns a channel of elements that you can\n\t// range over.\n\tIter() <-chan interface{}\n\n\t// Returns an Iterator object that you can\n\t// use to range over the set.\n\tIterator() *Iterator\n\n\t// Remove a single element from the set.\n\tRemove(i interface{})\n\n\t// Provides a convenient string representation\n\t// of the current state of the set.\n\tString() string\n\n\t// Returns a new set with all elements which are\n\t// in either this set or the other set but not in both.\n\t//\n\t// Note that the argument to SymmetricDifference\n\t// must be of the same type as the receiver\n\t// of the method. Otherwise, SymmetricDifference\n\t// will panic.\n\tSymmetricDifference(other Set) Set\n\n\t// Returns a new set with all elements in both sets.\n\t//\n\t// Note that the argument to Union must be of the\n\n\t// same type as the receiver of the method.\n\t// Otherwise, IsSuperset will panic.\n\tUnion(other Set) Set\n\n\t// Pop removes and returns an arbitrary item from the set.\n\tPop() interface{}\n\n\t// Returns all subsets of a given set (Power Set).\n\tPowerSet() Set\n\n\t// Returns the Cartesian Product of two sets.\n\tCartesianProduct(other Set) Set\n\n\t// Returns the members of the set as a slice.\n\tToSlice() []interface{}\n}\n\n// NewSet creates and returns a reference to an empty set.  Operations\n// on the resulting set are thread-safe.\nfunc NewSet(s ...interface{}) Set {\n\tset := newThreadSafeSet()\n\tfor _, item := range s {\n\t\tset.Add(item)\n\t}\n\treturn &set\n}\n\n// NewSetWith creates and returns a new set with the given elements.\n// Operations on the resulting set are thread-safe.\nfunc NewSetWith(elts ...interface{}) Set {\n\treturn NewSetFromSlice(elts)\n}\n\n// NewSetFromSlice creates and returns a reference to a set from an\n// existing slice.  Operations on the resulting set are thread-safe.\nfunc NewSetFromSlice(s []interface{}) Set {\n\ta := NewSet(s...)\n\treturn a\n}\n\n// NewThreadUnsafeSet creates and returns a reference to an empty set.\n// Operations on the resulting set are not thread-safe.\nfunc NewThreadUnsafeSet() Set {\n\tset := newThreadUnsafeSet()\n\treturn &set\n}\n\n// NewThreadUnsafeSetFromSlice creates and returns a reference to a\n// set from an existing slice.  Operations on the resulting set are\n// not thread-safe.\nfunc NewThreadUnsafeSetFromSlice(s []interface{}) Set {\n\ta := NewThreadUnsafeSet()\n\tfor _, item := range s {\n\t\ta.Add(item)\n\t}\n\treturn a\n}\n"
  },
  {
    "path": "vendor/github.com/deckarep/golang-set/threadsafe.go",
    "content": "/*\nOpen Source Initiative OSI - The MIT License (MIT):Licensing\n\nThe MIT License (MIT)\nCopyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, 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\npackage mapset\n\nimport \"sync\"\n\ntype threadSafeSet struct {\n\ts threadUnsafeSet\n\tsync.RWMutex\n}\n\nfunc newThreadSafeSet() threadSafeSet {\n\treturn threadSafeSet{s: newThreadUnsafeSet()}\n}\n\nfunc (set *threadSafeSet) Add(i interface{}) bool {\n\tset.Lock()\n\tret := set.s.Add(i)\n\tset.Unlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) Contains(i ...interface{}) bool {\n\tset.RLock()\n\tret := set.s.Contains(i...)\n\tset.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) IsSubset(other Set) bool {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\to.RLock()\n\n\tret := set.s.IsSubset(&o.s)\n\tset.RUnlock()\n\to.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) IsProperSubset(other Set) bool {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\tdefer set.RUnlock()\n\to.RLock()\n\tdefer o.RUnlock()\n\n\treturn set.s.IsProperSubset(&o.s)\n}\n\nfunc (set *threadSafeSet) IsSuperset(other Set) bool {\n\treturn other.IsSubset(set)\n}\n\nfunc (set *threadSafeSet) IsProperSuperset(other Set) bool {\n\treturn other.IsProperSubset(set)\n}\n\nfunc (set *threadSafeSet) Union(other Set) Set {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\to.RLock()\n\n\tunsafeUnion := set.s.Union(&o.s).(*threadUnsafeSet)\n\tret := &threadSafeSet{s: *unsafeUnion}\n\tset.RUnlock()\n\to.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) Intersect(other Set) Set {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\to.RLock()\n\n\tunsafeIntersection := set.s.Intersect(&o.s).(*threadUnsafeSet)\n\tret := &threadSafeSet{s: *unsafeIntersection}\n\tset.RUnlock()\n\to.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) Difference(other Set) Set {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\to.RLock()\n\n\tunsafeDifference := set.s.Difference(&o.s).(*threadUnsafeSet)\n\tret := &threadSafeSet{s: *unsafeDifference}\n\tset.RUnlock()\n\to.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) SymmetricDifference(other Set) Set {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\to.RLock()\n\n\tunsafeDifference := set.s.SymmetricDifference(&o.s).(*threadUnsafeSet)\n\tret := &threadSafeSet{s: *unsafeDifference}\n\tset.RUnlock()\n\to.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) Clear() {\n\tset.Lock()\n\tset.s = newThreadUnsafeSet()\n\tset.Unlock()\n}\n\nfunc (set *threadSafeSet) Remove(i interface{}) {\n\tset.Lock()\n\tdelete(set.s, i)\n\tset.Unlock()\n}\n\nfunc (set *threadSafeSet) Cardinality() int {\n\tset.RLock()\n\tdefer set.RUnlock()\n\treturn len(set.s)\n}\n\nfunc (set *threadSafeSet) Each(cb func(interface{}) bool) {\n\tset.RLock()\n\tfor elem := range set.s {\n\t\tif cb(elem) {\n\t\t\tbreak\n\t\t}\n\t}\n\tset.RUnlock()\n}\n\nfunc (set *threadSafeSet) Iter() <-chan interface{} {\n\tch := make(chan interface{})\n\tgo func() {\n\t\tset.RLock()\n\n\t\tfor elem := range set.s {\n\t\t\tch <- elem\n\t\t}\n\t\tclose(ch)\n\t\tset.RUnlock()\n\t}()\n\n\treturn ch\n}\n\nfunc (set *threadSafeSet) Iterator() *Iterator {\n\titerator, ch, stopCh := newIterator()\n\n\tgo func() {\n\t\tset.RLock()\n\tL:\n\t\tfor elem := range set.s {\n\t\t\tselect {\n\t\t\tcase <-stopCh:\n\t\t\t\tbreak L\n\t\t\tcase ch <- elem:\n\t\t\t}\n\t\t}\n\t\tclose(ch)\n\t\tset.RUnlock()\n\t}()\n\n\treturn iterator\n}\n\nfunc (set *threadSafeSet) Equal(other Set) bool {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\to.RLock()\n\n\tret := set.s.Equal(&o.s)\n\tset.RUnlock()\n\to.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) Clone() Set {\n\tset.RLock()\n\n\tunsafeClone := set.s.Clone().(*threadUnsafeSet)\n\tret := &threadSafeSet{s: *unsafeClone}\n\tset.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) String() string {\n\tset.RLock()\n\tret := set.s.String()\n\tset.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) PowerSet() Set {\n\tset.RLock()\n\tret := set.s.PowerSet()\n\tset.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) Pop() interface{} {\n\tset.Lock()\n\tdefer set.Unlock()\n\treturn set.s.Pop()\n}\n\nfunc (set *threadSafeSet) CartesianProduct(other Set) Set {\n\to := other.(*threadSafeSet)\n\n\tset.RLock()\n\to.RLock()\n\n\tunsafeCartProduct := set.s.CartesianProduct(&o.s).(*threadUnsafeSet)\n\tret := &threadSafeSet{s: *unsafeCartProduct}\n\tset.RUnlock()\n\to.RUnlock()\n\treturn ret\n}\n\nfunc (set *threadSafeSet) ToSlice() []interface{} {\n\tkeys := make([]interface{}, 0, set.Cardinality())\n\tset.RLock()\n\tfor elem := range set.s {\n\t\tkeys = append(keys, elem)\n\t}\n\tset.RUnlock()\n\treturn keys\n}\n\nfunc (set *threadSafeSet) MarshalJSON() ([]byte, error) {\n\tset.RLock()\n\tb, err := set.s.MarshalJSON()\n\tset.RUnlock()\n\n\treturn b, err\n}\n\nfunc (set *threadSafeSet) UnmarshalJSON(p []byte) error {\n\tset.RLock()\n\terr := set.s.UnmarshalJSON(p)\n\tset.RUnlock()\n\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/deckarep/golang-set/threadunsafe.go",
    "content": "/*\nOpen Source Initiative OSI - The MIT License (MIT):Licensing\n\nThe MIT License (MIT)\nCopyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, 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\npackage mapset\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\ntype threadUnsafeSet map[interface{}]struct{}\n\n// An OrderedPair represents a 2-tuple of values.\ntype OrderedPair struct {\n\tFirst  interface{}\n\tSecond interface{}\n}\n\nfunc newThreadUnsafeSet() threadUnsafeSet {\n\treturn make(threadUnsafeSet)\n}\n\n// Equal says whether two 2-tuples contain the same values in the same order.\nfunc (pair *OrderedPair) Equal(other OrderedPair) bool {\n\tif pair.First == other.First &&\n\t\tpair.Second == other.Second {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc (set *threadUnsafeSet) Add(i interface{}) bool {\n\t_, found := (*set)[i]\n\tif found {\n\t\treturn false //False if it existed already\n\t}\n\n\t(*set)[i] = struct{}{}\n\treturn true\n}\n\nfunc (set *threadUnsafeSet) Contains(i ...interface{}) bool {\n\tfor _, val := range i {\n\t\tif _, ok := (*set)[val]; !ok {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (set *threadUnsafeSet) IsSubset(other Set) bool {\n\t_ = other.(*threadUnsafeSet)\n\tfor elem := range *set {\n\t\tif !other.Contains(elem) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (set *threadUnsafeSet) IsProperSubset(other Set) bool {\n\treturn set.IsSubset(other) && !set.Equal(other)\n}\n\nfunc (set *threadUnsafeSet) IsSuperset(other Set) bool {\n\treturn other.IsSubset(set)\n}\n\nfunc (set *threadUnsafeSet) IsProperSuperset(other Set) bool {\n\treturn set.IsSuperset(other) && !set.Equal(other)\n}\n\nfunc (set *threadUnsafeSet) Union(other Set) Set {\n\to := other.(*threadUnsafeSet)\n\n\tunionedSet := newThreadUnsafeSet()\n\n\tfor elem := range *set {\n\t\tunionedSet.Add(elem)\n\t}\n\tfor elem := range *o {\n\t\tunionedSet.Add(elem)\n\t}\n\treturn &unionedSet\n}\n\nfunc (set *threadUnsafeSet) Intersect(other Set) Set {\n\to := other.(*threadUnsafeSet)\n\n\tintersection := newThreadUnsafeSet()\n\t// loop over smaller set\n\tif set.Cardinality() < other.Cardinality() {\n\t\tfor elem := range *set {\n\t\t\tif other.Contains(elem) {\n\t\t\t\tintersection.Add(elem)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor elem := range *o {\n\t\t\tif set.Contains(elem) {\n\t\t\t\tintersection.Add(elem)\n\t\t\t}\n\t\t}\n\t}\n\treturn &intersection\n}\n\nfunc (set *threadUnsafeSet) Difference(other Set) Set {\n\t_ = other.(*threadUnsafeSet)\n\n\tdifference := newThreadUnsafeSet()\n\tfor elem := range *set {\n\t\tif !other.Contains(elem) {\n\t\t\tdifference.Add(elem)\n\t\t}\n\t}\n\treturn &difference\n}\n\nfunc (set *threadUnsafeSet) SymmetricDifference(other Set) Set {\n\t_ = other.(*threadUnsafeSet)\n\n\taDiff := set.Difference(other)\n\tbDiff := other.Difference(set)\n\treturn aDiff.Union(bDiff)\n}\n\nfunc (set *threadUnsafeSet) Clear() {\n\t*set = newThreadUnsafeSet()\n}\n\nfunc (set *threadUnsafeSet) Remove(i interface{}) {\n\tdelete(*set, i)\n}\n\nfunc (set *threadUnsafeSet) Cardinality() int {\n\treturn len(*set)\n}\n\nfunc (set *threadUnsafeSet) Each(cb func(interface{}) bool) {\n\tfor elem := range *set {\n\t\tif cb(elem) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (set *threadUnsafeSet) Iter() <-chan interface{} {\n\tch := make(chan interface{})\n\tgo func() {\n\t\tfor elem := range *set {\n\t\t\tch <- elem\n\t\t}\n\t\tclose(ch)\n\t}()\n\n\treturn ch\n}\n\nfunc (set *threadUnsafeSet) Iterator() *Iterator {\n\titerator, ch, stopCh := newIterator()\n\n\tgo func() {\n\tL:\n\t\tfor elem := range *set {\n\t\t\tselect {\n\t\t\tcase <-stopCh:\n\t\t\t\tbreak L\n\t\t\tcase ch <- elem:\n\t\t\t}\n\t\t}\n\t\tclose(ch)\n\t}()\n\n\treturn iterator\n}\n\nfunc (set *threadUnsafeSet) Equal(other Set) bool {\n\t_ = other.(*threadUnsafeSet)\n\n\tif set.Cardinality() != other.Cardinality() {\n\t\treturn false\n\t}\n\tfor elem := range *set {\n\t\tif !other.Contains(elem) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (set *threadUnsafeSet) Clone() Set {\n\tclonedSet := newThreadUnsafeSet()\n\tfor elem := range *set {\n\t\tclonedSet.Add(elem)\n\t}\n\treturn &clonedSet\n}\n\nfunc (set *threadUnsafeSet) String() string {\n\titems := make([]string, 0, len(*set))\n\n\tfor elem := range *set {\n\t\titems = append(items, fmt.Sprintf(\"%v\", elem))\n\t}\n\treturn fmt.Sprintf(\"Set{%s}\", strings.Join(items, \", \"))\n}\n\n// String outputs a 2-tuple in the form \"(A, B)\".\nfunc (pair OrderedPair) String() string {\n\treturn fmt.Sprintf(\"(%v, %v)\", pair.First, pair.Second)\n}\n\nfunc (set *threadUnsafeSet) Pop() interface{} {\n\tfor item := range *set {\n\t\tdelete(*set, item)\n\t\treturn item\n\t}\n\treturn nil\n}\n\nfunc (set *threadUnsafeSet) PowerSet() Set {\n\tpowSet := NewThreadUnsafeSet()\n\tnullset := newThreadUnsafeSet()\n\tpowSet.Add(&nullset)\n\n\tfor es := range *set {\n\t\tu := newThreadUnsafeSet()\n\t\tj := powSet.Iter()\n\t\tfor er := range j {\n\t\t\tp := newThreadUnsafeSet()\n\t\t\tif reflect.TypeOf(er).Name() == \"\" {\n\t\t\t\tk := er.(*threadUnsafeSet)\n\t\t\t\tfor ek := range *(k) {\n\t\t\t\t\tp.Add(ek)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tp.Add(er)\n\t\t\t}\n\t\t\tp.Add(es)\n\t\t\tu.Add(&p)\n\t\t}\n\n\t\tpowSet = powSet.Union(&u)\n\t}\n\n\treturn powSet\n}\n\nfunc (set *threadUnsafeSet) CartesianProduct(other Set) Set {\n\to := other.(*threadUnsafeSet)\n\tcartProduct := NewThreadUnsafeSet()\n\n\tfor i := range *set {\n\t\tfor j := range *o {\n\t\t\telem := OrderedPair{First: i, Second: j}\n\t\t\tcartProduct.Add(elem)\n\t\t}\n\t}\n\n\treturn cartProduct\n}\n\nfunc (set *threadUnsafeSet) ToSlice() []interface{} {\n\tkeys := make([]interface{}, 0, set.Cardinality())\n\tfor elem := range *set {\n\t\tkeys = append(keys, elem)\n\t}\n\n\treturn keys\n}\n\n// MarshalJSON creates a JSON array from the set, it marshals all elements\nfunc (set *threadUnsafeSet) MarshalJSON() ([]byte, error) {\n\titems := make([]string, 0, set.Cardinality())\n\n\tfor elem := range *set {\n\t\tb, err := json.Marshal(elem)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\titems = append(items, string(b))\n\t}\n\n\treturn []byte(fmt.Sprintf(\"[%s]\", strings.Join(items, \",\"))), nil\n}\n\n// UnmarshalJSON recreates a set from a JSON array, it only decodes\n// primitive types. Numbers are decoded as json.Number.\nfunc (set *threadUnsafeSet) UnmarshalJSON(b []byte) error {\n\tvar i []interface{}\n\n\td := json.NewDecoder(bytes.NewReader(b))\n\td.UseNumber()\n\terr := d.Decode(&i)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, v := range i {\n\t\tswitch t := v.(type) {\n\t\tcase []interface{}, map[string]interface{}:\n\t\t\tcontinue\n\t\tdefault:\n\t\t\tset.Add(t)\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/LICENSE",
    "content": "Copyright (c) 2012 Dave Grijalva\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md",
    "content": "## Migration Guide from v2 -> v3\n\nVersion 3 adds several new, frequently requested features.  To do so, it introduces a few breaking changes.  We've worked to keep these as minimal as possible.  This guide explains the breaking changes and how you can quickly update your code.\n\n### `Token.Claims` is now an interface type\n\nThe most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`.  We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`.\n\n`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior.  It is the default claims type when using `Parse`.  The usage is unchanged except you must type cast the claims property.\n\nThe old example for parsing a token looked like this..\n\n```go\n\tif token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil {\n\t\tfmt.Printf(\"Token for user %v expires %v\", token.Claims[\"user\"], token.Claims[\"exp\"])\n\t}\n```\n\nis now directly mapped to...\n\n```go\n\tif token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil {\n\t\tclaims := token.Claims.(jwt.MapClaims)\n\t\tfmt.Printf(\"Token for user %v expires %v\", claims[\"user\"], claims[\"exp\"])\n\t}\n```\n\n`StandardClaims` is designed to be embedded in your custom type.  You can supply a custom claims type with the new `ParseWithClaims` function.  Here's an example of using a custom claims type.\n\n```go\n\ttype MyCustomClaims struct {\n\t\tUser string\n\t\t*StandardClaims\n\t}\n\t\n\tif token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil {\n\t\tclaims := token.Claims.(*MyCustomClaims)\n\t\tfmt.Printf(\"Token for user %v expires %v\", claims.User, claims.StandardClaims.ExpiresAt)\n\t}\n```\n\n### `ParseFromRequest` has been moved\n\nTo keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`.  The method signatues have also been augmented to receive a new argument: `Extractor`.\n\n`Extractors` do the work of picking the token string out of a request.  The interface is simple and composable.\n\nThis simple parsing example:\n\n```go\n\tif token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil {\n\t\tfmt.Printf(\"Token for user %v expires %v\", token.Claims[\"user\"], token.Claims[\"exp\"])\n\t}\n```\n\nis directly mapped to:\n\n```go\n\tif token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil {\n\t\tclaims := token.Claims.(jwt.MapClaims)\n\t\tfmt.Printf(\"Token for user %v expires %v\", claims[\"user\"], claims[\"exp\"])\n\t}\n```\n\nThere are several concrete `Extractor` types provided for your convenience:\n\n* `HeaderExtractor` will search a list of headers until one contains content.\n* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content.\n* `MultiExtractor` will try a list of `Extractors` in order until one returns content.\n* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token.\n* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument\n* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed.  A simple example is stripping the `Bearer ` text from a header\n\n\n### RSA signing methods no longer accept `[]byte` keys\n\nDue to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse.\n\nTo replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`.  These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types.\n\n```go \n\tfunc keyLookupFunc(*Token) (interface{}, error) {\n\t\t// Don't forget to validate the alg is what you expect:\n\t\tif _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {\n\t\t\treturn nil, fmt.Errorf(\"Unexpected signing method: %v\", token.Header[\"alg\"])\n\t\t}\n\t\t\n\t\t// Look up key \n\t\tkey, err := lookupPublicKey(token.Header[\"kid\"])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t\n\t\t// Unpack key from PEM encoded PKCS8\n\t\treturn jwt.ParseRSAPublicKeyFromPEM(key)\n\t}\n```\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/README.md",
    "content": "A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html)\n\n[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go)\n\n**BREAKING CHANGES:*** Version 3.0.0 is here. It includes _a lot_ of changes including a few that break the API.  We've tried to break as few things as possible, so there should just be a few type signature changes.  A full list of breaking changes is available in `VERSION_HISTORY.md`.  See `MIGRATION_GUIDE.md` for more information on updating your code.\n\n**NOTICE:** A vulnerability in JWT was [recently published](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/).  As this library doesn't force users to validate the `alg` is what they expected, it's possible your usage is effected.  There will be an update soon to remedy this, and it will likey require backwards-incompatible changes to the API.  In the short term, please make sure your implementation verifies the `alg` is what you expect.\n\n\n## What the heck is a JWT?\n\nJWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens.\n\nIn short, it's a signed JSON object that does something useful (for example, authentication).  It's commonly used for `Bearer` tokens in Oauth 2.  A token is made of three parts, separated by `.`'s.  The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded.  The last part is the signature, encoded the same way.\n\nThe first part is called the header.  It contains the necessary information for verifying the last part, the signature.  For example, which encryption method was used for signing and what key was used.\n\nThe part in the middle is the interesting bit.  It's called the Claims and contains the actual stuff you care about.  Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own.\n\n## What's in the box?\n\nThis library supports the parsing and verification as well as the generation and signing of JWTs.  Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own.\n\n## Examples\n\nSee [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage:\n\n* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac)\n* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac)\n* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples)\n\n## Extensions\n\nThis library publishes all the necessary components for adding your own signing methods.  Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`.  \n\nHere's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go\n\n## Compliance\n\nThis library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences: \n\n* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key.\n\n## Project Status & Versioning\n\nThis library is considered production ready.  Feedback and feature requests are appreciated.  The API should be considered stable.  There should be very few backwards-incompatible changes outside of major version updates (and only with good reason).\n\nThis project uses [Semantic Versioning 2.0.0](http://semver.org).  Accepted pull requests will land on `master`.  Periodically, versions will be tagged from `master`.  You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases).\n\nWhile we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users.  You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v2`.  It will do the right thing WRT semantic versioning.\n\n## Usage Tips\n\n### Signing vs Encryption\n\nA token is simply a JSON object that is signed by its author. this tells you exactly two things about the data:\n\n* The author of the token was in the possession of the signing secret\n* The data has not been modified since it was signed\n\nIt's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library.\n\n### Choosing a Signing Method\n\nThere are several signing methods available, and you should probably take the time to learn about the various options before choosing one.  The principal design decision is most likely going to be symmetric vs asymmetric.\n\nSymmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation.\n\nAsymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification.\n\n### JWT and OAuth\n\nIt's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication.\n\nWithout going too far down the rabbit hole, here's a description of the interaction of these technologies:\n\n* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to.  For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth.\n* OAuth defines several options for passing around authentication data. One popular method is called a \"bearer token\". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token.\n* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL.\n \n## More\n\nDocumentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go).\n\nThe command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration.  You'll also find several implementation examples in to documentation.\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md",
    "content": "## `jwt-go` Version History\n\n#### 3.0.0\n\n* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code\n\t* Dropped support for `[]byte` keys when using RSA signing methods.  This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods.\n\t* `ParseFromRequest` has been moved to `request` subpackage and usage has changed\n\t* The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`.  The default value is type `MapClaims`, which is an alias to `map[string]interface{}`.  This makes it possible to use a custom type when decoding claims.\n* Other Additions and Changes\n\t* Added `Claims` interface type to allow users to decode the claims into a custom type\n\t* Added `ParseWithClaims`, which takes a third argument of type `Claims`.  Use this function instead of `Parse` if you have a custom type you'd like to decode into.\n\t* Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage\n\t* Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims`\n\t* Added new interface type `Extractor`, which is used for extracting JWT strings from http requests.  Used with `ParseFromRequest` and `ParseFromRequestWithClaims`.\n\t* Added several new, more specific, validation errors to error type bitmask\n\t* Moved examples from README to executable example files\n\t* Signing method registry is now thread safe\n\t* Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser)\n\n#### 2.7.0\n\nThis will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes.\n\n* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying\n* Error text for expired tokens includes how long it's been expired\n* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM`\n* Documentation updates\n\n#### 2.6.0\n\n* Exposed inner error within ValidationError\n* Fixed validation errors when using UseJSONNumber flag\n* Added several unit tests\n\n#### 2.5.0\n\n* Added support for signing method none.  You shouldn't use this.  The API tries to make this clear.\n* Updated/fixed some documentation\n* Added more helpful error message when trying to parse tokens that begin with `BEARER `\n\n#### 2.4.0\n\n* Added new type, Parser, to allow for configuration of various parsing parameters\n\t* You can now specify a list of valid signing methods.  Anything outside this set will be rejected.\n\t* You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON\n* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go)\n* Fixed some bugs with ECDSA parsing\n\n#### 2.3.0\n\n* Added support for ECDSA signing methods\n* Added support for RSA PSS signing methods (requires go v1.4)\n\n#### 2.2.0\n\n* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`.  Result will now be the parsed token and an error, instead of a panic.\n\n#### 2.1.0\n\nBackwards compatible API change that was missed in 2.0.0.\n\n* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte`\n\n#### 2.0.0\n\nThere were two major reasons for breaking backwards compatibility with this update.  The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations.  There will likely be no required code changes to support this change.\n\nThe second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods.  Not all keys used for all signing methods have a single standard on-disk representation.  Requiring `[]byte` as the type for all keys proved too limiting.  Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys.  Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`.\n\nIt is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`.\n\n* **Compatibility Breaking Changes**\n\t* `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct`\n\t* `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct`\n\t* `KeyFunc` now returns `interface{}` instead of `[]byte`\n\t* `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key\n\t* `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key\n* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`.  Specific sizes are now just instances of this type.\n    * Added public package global `SigningMethodHS256`\n    * Added public package global `SigningMethodHS384`\n    * Added public package global `SigningMethodHS512`\n* Renamed type `SigningMethodRS256` to `SigningMethodRSA`.  Specific sizes are now just instances of this type.\n    * Added public package global `SigningMethodRS256`\n    * Added public package global `SigningMethodRS384`\n    * Added public package global `SigningMethodRS512`\n* Moved sample private key for HMAC tests from an inline value to a file on disk.  Value is unchanged.\n* Refactored the RSA implementation to be easier to read\n* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM`\n\n#### 1.0.2\n\n* Fixed bug in parsing public keys from certificates\n* Added more tests around the parsing of keys for RS256\n* Code refactoring in RS256 implementation.  No functional changes\n\n#### 1.0.1\n\n* Fixed panic if RS256 signing method was passed an invalid key\n\n#### 1.0.0\n\n* First versioned release\n* API stabilized\n* Supports creating, signing, parsing, and validating JWT tokens\n* Supports RS256 and HS256 signing methods"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/claims.go",
    "content": "package jwt\n\nimport (\n\t\"crypto/subtle\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// For a type to be a Claims object, it must just have a Valid method that determines\n// if the token is invalid for any supported reason\ntype Claims interface {\n\tValid() error\n}\n\n// Structured version of Claims Section, as referenced at\n// https://tools.ietf.org/html/rfc7519#section-4.1\n// See examples for how to use this with your own claim types\ntype StandardClaims struct {\n\tAudience  string `json:\"aud,omitempty\"`\n\tExpiresAt int64  `json:\"exp,omitempty\"`\n\tId        string `json:\"jti,omitempty\"`\n\tIssuedAt  int64  `json:\"iat,omitempty\"`\n\tIssuer    string `json:\"iss,omitempty\"`\n\tNotBefore int64  `json:\"nbf,omitempty\"`\n\tSubject   string `json:\"sub,omitempty\"`\n}\n\n// Validates time based claims \"exp, iat, nbf\".\n// There is no accounting for clock skew.\n// As well, if any of the above claims are not in the token, it will still\n// be considered a valid claim.\nfunc (c StandardClaims) Valid() error {\n\tvErr := new(ValidationError)\n\tnow := TimeFunc().Unix()\n\n\t// The claims below are optional, by default, so if they are set to the\n\t// default value in Go, let's not fail the verification for them.\n\tif c.VerifyExpiresAt(now, false) == false {\n\t\tdelta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0))\n\t\tvErr.Inner = fmt.Errorf(\"token is expired by %v\", delta)\n\t\tvErr.Errors |= ValidationErrorExpired\n\t}\n\n\tif c.VerifyIssuedAt(now, false) == false {\n\t\tvErr.Inner = fmt.Errorf(\"Token used before issued\")\n\t\tvErr.Errors |= ValidationErrorIssuedAt\n\t}\n\n\tif c.VerifyNotBefore(now, false) == false {\n\t\tvErr.Inner = fmt.Errorf(\"token is not valid yet\")\n\t\tvErr.Errors |= ValidationErrorNotValidYet\n\t}\n\n\tif vErr.valid() {\n\t\treturn nil\n\t}\n\n\treturn vErr\n}\n\n// Compares the aud claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (c *StandardClaims) VerifyAudience(cmp string, req bool) bool {\n\treturn verifyAud(c.Audience, cmp, req)\n}\n\n// Compares the exp claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool {\n\treturn verifyExp(c.ExpiresAt, cmp, req)\n}\n\n// Compares the iat claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool {\n\treturn verifyIat(c.IssuedAt, cmp, req)\n}\n\n// Compares the iss claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool {\n\treturn verifyIss(c.Issuer, cmp, req)\n}\n\n// Compares the nbf claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool {\n\treturn verifyNbf(c.NotBefore, cmp, req)\n}\n\n// ----- helpers\n\nfunc verifyAud(aud string, cmp string, required bool) bool {\n\tif aud == \"\" {\n\t\treturn !required\n\t}\n\tif subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunc verifyExp(exp int64, now int64, required bool) bool {\n\tif exp == 0 {\n\t\treturn !required\n\t}\n\treturn now <= exp\n}\n\nfunc verifyIat(iat int64, now int64, required bool) bool {\n\tif iat == 0 {\n\t\treturn !required\n\t}\n\treturn now >= iat\n}\n\nfunc verifyIss(iss string, cmp string, required bool) bool {\n\tif iss == \"\" {\n\t\treturn !required\n\t}\n\tif subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunc verifyNbf(nbf int64, now int64, required bool) bool {\n\tif nbf == 0 {\n\t\treturn !required\n\t}\n\treturn now >= nbf\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/doc.go",
    "content": "// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html\n//\n// See README.md for more info.\npackage jwt\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/ecdsa.go",
    "content": "package jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/ecdsa\"\n\t\"crypto/rand\"\n\t\"errors\"\n\t\"math/big\"\n)\n\nvar (\n\t// Sadly this is missing from crypto/ecdsa compared to crypto/rsa\n\tErrECDSAVerification = errors.New(\"crypto/ecdsa: verification error\")\n)\n\n// Implements the ECDSA family of signing methods signing methods\ntype SigningMethodECDSA struct {\n\tName      string\n\tHash      crypto.Hash\n\tKeySize   int\n\tCurveBits int\n}\n\n// Specific instances for EC256 and company\nvar (\n\tSigningMethodES256 *SigningMethodECDSA\n\tSigningMethodES384 *SigningMethodECDSA\n\tSigningMethodES512 *SigningMethodECDSA\n)\n\nfunc init() {\n\t// ES256\n\tSigningMethodES256 = &SigningMethodECDSA{\"ES256\", crypto.SHA256, 32, 256}\n\tRegisterSigningMethod(SigningMethodES256.Alg(), func() SigningMethod {\n\t\treturn SigningMethodES256\n\t})\n\n\t// ES384\n\tSigningMethodES384 = &SigningMethodECDSA{\"ES384\", crypto.SHA384, 48, 384}\n\tRegisterSigningMethod(SigningMethodES384.Alg(), func() SigningMethod {\n\t\treturn SigningMethodES384\n\t})\n\n\t// ES512\n\tSigningMethodES512 = &SigningMethodECDSA{\"ES512\", crypto.SHA512, 66, 521}\n\tRegisterSigningMethod(SigningMethodES512.Alg(), func() SigningMethod {\n\t\treturn SigningMethodES512\n\t})\n}\n\nfunc (m *SigningMethodECDSA) Alg() string {\n\treturn m.Name\n}\n\n// Implements the Verify method from SigningMethod\n// For this verify method, key must be an ecdsa.PublicKey struct\nfunc (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error {\n\tvar err error\n\n\t// Decode the signature\n\tvar sig []byte\n\tif sig, err = DecodeSegment(signature); err != nil {\n\t\treturn err\n\t}\n\n\t// Get the key\n\tvar ecdsaKey *ecdsa.PublicKey\n\tswitch k := key.(type) {\n\tcase *ecdsa.PublicKey:\n\t\tecdsaKey = k\n\tdefault:\n\t\treturn ErrInvalidKeyType\n\t}\n\n\tif len(sig) != 2*m.KeySize {\n\t\treturn ErrECDSAVerification\n\t}\n\n\tr := big.NewInt(0).SetBytes(sig[:m.KeySize])\n\ts := big.NewInt(0).SetBytes(sig[m.KeySize:])\n\n\t// Create hasher\n\tif !m.Hash.Available() {\n\t\treturn ErrHashUnavailable\n\t}\n\thasher := m.Hash.New()\n\thasher.Write([]byte(signingString))\n\n\t// Verify the signature\n\tif verifystatus := ecdsa.Verify(ecdsaKey, hasher.Sum(nil), r, s); verifystatus == true {\n\t\treturn nil\n\t} else {\n\t\treturn ErrECDSAVerification\n\t}\n}\n\n// Implements the Sign method from SigningMethod\n// For this signing method, key must be an ecdsa.PrivateKey struct\nfunc (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) {\n\t// Get the key\n\tvar ecdsaKey *ecdsa.PrivateKey\n\tswitch k := key.(type) {\n\tcase *ecdsa.PrivateKey:\n\t\tecdsaKey = k\n\tdefault:\n\t\treturn \"\", ErrInvalidKeyType\n\t}\n\n\t// Create the hasher\n\tif !m.Hash.Available() {\n\t\treturn \"\", ErrHashUnavailable\n\t}\n\n\thasher := m.Hash.New()\n\thasher.Write([]byte(signingString))\n\n\t// Sign the string and return r, s\n\tif r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil {\n\t\tcurveBits := ecdsaKey.Curve.Params().BitSize\n\n\t\tif m.CurveBits != curveBits {\n\t\t\treturn \"\", ErrInvalidKey\n\t\t}\n\n\t\tkeyBytes := curveBits / 8\n\t\tif curveBits%8 > 0 {\n\t\t\tkeyBytes += 1\n\t\t}\n\n\t\t// We serialize the outpus (r and s) into big-endian byte arrays and pad\n\t\t// them with zeros on the left to make sure the sizes work out. Both arrays\n\t\t// must be keyBytes long, and the output must be 2*keyBytes long.\n\t\trBytes := r.Bytes()\n\t\trBytesPadded := make([]byte, keyBytes)\n\t\tcopy(rBytesPadded[keyBytes-len(rBytes):], rBytes)\n\n\t\tsBytes := s.Bytes()\n\t\tsBytesPadded := make([]byte, keyBytes)\n\t\tcopy(sBytesPadded[keyBytes-len(sBytes):], sBytes)\n\n\t\tout := append(rBytesPadded, sBytesPadded...)\n\n\t\treturn EncodeSegment(out), nil\n\t} else {\n\t\treturn \"\", err\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go",
    "content": "package jwt\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"errors\"\n)\n\nvar (\n\tErrNotECPublicKey  = errors.New(\"Key is not a valid ECDSA public key\")\n\tErrNotECPrivateKey = errors.New(\"Key is not a valid ECDSA private key\")\n)\n\n// Parse PEM encoded Elliptic Curve Private Key Structure\nfunc ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) {\n\tvar err error\n\n\t// Parse PEM block\n\tvar block *pem.Block\n\tif block, _ = pem.Decode(key); block == nil {\n\t\treturn nil, ErrKeyMustBePEMEncoded\n\t}\n\n\t// Parse the key\n\tvar parsedKey interface{}\n\tif parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar pkey *ecdsa.PrivateKey\n\tvar ok bool\n\tif pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok {\n\t\treturn nil, ErrNotECPrivateKey\n\t}\n\n\treturn pkey, nil\n}\n\n// Parse PEM encoded PKCS1 or PKCS8 public key\nfunc ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) {\n\tvar err error\n\n\t// Parse PEM block\n\tvar block *pem.Block\n\tif block, _ = pem.Decode(key); block == nil {\n\t\treturn nil, ErrKeyMustBePEMEncoded\n\t}\n\n\t// Parse the key\n\tvar parsedKey interface{}\n\tif parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil {\n\t\tif cert, err := x509.ParseCertificate(block.Bytes); err == nil {\n\t\t\tparsedKey = cert.PublicKey\n\t\t} else {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar pkey *ecdsa.PublicKey\n\tvar ok bool\n\tif pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok {\n\t\treturn nil, ErrNotECPublicKey\n\t}\n\n\treturn pkey, nil\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/errors.go",
    "content": "package jwt\n\nimport (\n\t\"errors\"\n)\n\n// Error constants\nvar (\n\tErrInvalidKey      = errors.New(\"key is invalid\")\n\tErrInvalidKeyType  = errors.New(\"key is of invalid type\")\n\tErrHashUnavailable = errors.New(\"the requested hash function is unavailable\")\n)\n\n// The errors that might occur when parsing and validating a token\nconst (\n\tValidationErrorMalformed        uint32 = 1 << iota // Token is malformed\n\tValidationErrorUnverifiable                        // Token could not be verified because of signing problems\n\tValidationErrorSignatureInvalid                    // Signature validation failed\n\n\t// Standard Claim validation errors\n\tValidationErrorAudience      // AUD validation failed\n\tValidationErrorExpired       // EXP validation failed\n\tValidationErrorIssuedAt      // IAT validation failed\n\tValidationErrorIssuer        // ISS validation failed\n\tValidationErrorNotValidYet   // NBF validation failed\n\tValidationErrorId            // JTI validation failed\n\tValidationErrorClaimsInvalid // Generic claims validation error\n)\n\n// Helper for constructing a ValidationError with a string error message\nfunc NewValidationError(errorText string, errorFlags uint32) *ValidationError {\n\treturn &ValidationError{\n\t\ttext:   errorText,\n\t\tErrors: errorFlags,\n\t}\n}\n\n// The error from Parse if token is not valid\ntype ValidationError struct {\n\tInner  error  // stores the error returned by external dependencies, i.e.: KeyFunc\n\tErrors uint32 // bitfield.  see ValidationError... constants\n\ttext   string // errors that do not have a valid error just have text\n}\n\n// Validation error is an error type\nfunc (e ValidationError) Error() string {\n\tif e.Inner != nil {\n\t\treturn e.Inner.Error()\n\t} else if e.text != \"\" {\n\t\treturn e.text\n\t} else {\n\t\treturn \"token is invalid\"\n\t}\n}\n\n// No errors\nfunc (e *ValidationError) valid() bool {\n\treturn e.Errors == 0\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/hmac.go",
    "content": "package jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/hmac\"\n\t\"errors\"\n)\n\n// Implements the HMAC-SHA family of signing methods signing methods\ntype SigningMethodHMAC struct {\n\tName string\n\tHash crypto.Hash\n}\n\n// Specific instances for HS256 and company\nvar (\n\tSigningMethodHS256  *SigningMethodHMAC\n\tSigningMethodHS384  *SigningMethodHMAC\n\tSigningMethodHS512  *SigningMethodHMAC\n\tErrSignatureInvalid = errors.New(\"signature is invalid\")\n)\n\nfunc init() {\n\t// HS256\n\tSigningMethodHS256 = &SigningMethodHMAC{\"HS256\", crypto.SHA256}\n\tRegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod {\n\t\treturn SigningMethodHS256\n\t})\n\n\t// HS384\n\tSigningMethodHS384 = &SigningMethodHMAC{\"HS384\", crypto.SHA384}\n\tRegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod {\n\t\treturn SigningMethodHS384\n\t})\n\n\t// HS512\n\tSigningMethodHS512 = &SigningMethodHMAC{\"HS512\", crypto.SHA512}\n\tRegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod {\n\t\treturn SigningMethodHS512\n\t})\n}\n\nfunc (m *SigningMethodHMAC) Alg() string {\n\treturn m.Name\n}\n\n// Verify the signature of HSXXX tokens.  Returns nil if the signature is valid.\nfunc (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error {\n\t// Verify the key is the right type\n\tkeyBytes, ok := key.([]byte)\n\tif !ok {\n\t\treturn ErrInvalidKeyType\n\t}\n\n\t// Decode signature, for comparison\n\tsig, err := DecodeSegment(signature)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Can we use the specified hashing method?\n\tif !m.Hash.Available() {\n\t\treturn ErrHashUnavailable\n\t}\n\n\t// This signing method is symmetric, so we validate the signature\n\t// by reproducing the signature from the signing string and key, then\n\t// comparing that against the provided signature.\n\thasher := hmac.New(m.Hash.New, keyBytes)\n\thasher.Write([]byte(signingString))\n\tif !hmac.Equal(sig, hasher.Sum(nil)) {\n\t\treturn ErrSignatureInvalid\n\t}\n\n\t// No validation errors.  Signature is good.\n\treturn nil\n}\n\n// Implements the Sign method from SigningMethod for this signing method.\n// Key must be []byte\nfunc (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) {\n\tif keyBytes, ok := key.([]byte); ok {\n\t\tif !m.Hash.Available() {\n\t\t\treturn \"\", ErrHashUnavailable\n\t\t}\n\n\t\thasher := hmac.New(m.Hash.New, keyBytes)\n\t\thasher.Write([]byte(signingString))\n\n\t\treturn EncodeSegment(hasher.Sum(nil)), nil\n\t}\n\n\treturn \"\", ErrInvalidKey\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/map_claims.go",
    "content": "package jwt\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t// \"fmt\"\n)\n\n// Claims type that uses the map[string]interface{} for JSON decoding\n// This is the default claims type if you don't supply one\ntype MapClaims map[string]interface{}\n\n// Compares the aud claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (m MapClaims) VerifyAudience(cmp string, req bool) bool {\n\taud, _ := m[\"aud\"].(string)\n\treturn verifyAud(aud, cmp, req)\n}\n\n// Compares the exp claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool {\n\tswitch exp := m[\"exp\"].(type) {\n\tcase float64:\n\t\treturn verifyExp(int64(exp), cmp, req)\n\tcase json.Number:\n\t\tv, _ := exp.Int64()\n\t\treturn verifyExp(v, cmp, req)\n\t}\n\treturn req == false\n}\n\n// Compares the iat claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool {\n\tswitch iat := m[\"iat\"].(type) {\n\tcase float64:\n\t\treturn verifyIat(int64(iat), cmp, req)\n\tcase json.Number:\n\t\tv, _ := iat.Int64()\n\t\treturn verifyIat(v, cmp, req)\n\t}\n\treturn req == false\n}\n\n// Compares the iss claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (m MapClaims) VerifyIssuer(cmp string, req bool) bool {\n\tiss, _ := m[\"iss\"].(string)\n\treturn verifyIss(iss, cmp, req)\n}\n\n// Compares the nbf claim against cmp.\n// If required is false, this method will return true if the value matches or is unset\nfunc (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool {\n\tswitch nbf := m[\"nbf\"].(type) {\n\tcase float64:\n\t\treturn verifyNbf(int64(nbf), cmp, req)\n\tcase json.Number:\n\t\tv, _ := nbf.Int64()\n\t\treturn verifyNbf(v, cmp, req)\n\t}\n\treturn req == false\n}\n\n// Validates time based claims \"exp, iat, nbf\".\n// There is no accounting for clock skew.\n// As well, if any of the above claims are not in the token, it will still\n// be considered a valid claim.\nfunc (m MapClaims) Valid() error {\n\tvErr := new(ValidationError)\n\tnow := TimeFunc().Unix()\n\n\tif m.VerifyExpiresAt(now, false) == false {\n\t\tvErr.Inner = errors.New(\"Token is expired\")\n\t\tvErr.Errors |= ValidationErrorExpired\n\t}\n\n\tif m.VerifyIssuedAt(now, false) == false {\n\t\tvErr.Inner = errors.New(\"Token used before issued\")\n\t\tvErr.Errors |= ValidationErrorIssuedAt\n\t}\n\n\tif m.VerifyNotBefore(now, false) == false {\n\t\tvErr.Inner = errors.New(\"Token is not valid yet\")\n\t\tvErr.Errors |= ValidationErrorNotValidYet\n\t}\n\n\tif vErr.valid() {\n\t\treturn nil\n\t}\n\n\treturn vErr\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/none.go",
    "content": "package jwt\n\n// Implements the none signing method.  This is required by the spec\n// but you probably should never use it.\nvar SigningMethodNone *signingMethodNone\n\nconst UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = \"none signing method allowed\"\n\nvar NoneSignatureTypeDisallowedError error\n\ntype signingMethodNone struct{}\ntype unsafeNoneMagicConstant string\n\nfunc init() {\n\tSigningMethodNone = &signingMethodNone{}\n\tNoneSignatureTypeDisallowedError = NewValidationError(\"'none' signature type is not allowed\", ValidationErrorSignatureInvalid)\n\n\tRegisterSigningMethod(SigningMethodNone.Alg(), func() SigningMethod {\n\t\treturn SigningMethodNone\n\t})\n}\n\nfunc (m *signingMethodNone) Alg() string {\n\treturn \"none\"\n}\n\n// Only allow 'none' alg type if UnsafeAllowNoneSignatureType is specified as the key\nfunc (m *signingMethodNone) Verify(signingString, signature string, key interface{}) (err error) {\n\t// Key must be UnsafeAllowNoneSignatureType to prevent accidentally\n\t// accepting 'none' signing method\n\tif _, ok := key.(unsafeNoneMagicConstant); !ok {\n\t\treturn NoneSignatureTypeDisallowedError\n\t}\n\t// If signing method is none, signature must be an empty string\n\tif signature != \"\" {\n\t\treturn NewValidationError(\n\t\t\t\"'none' signing method with non-empty signature\",\n\t\t\tValidationErrorSignatureInvalid,\n\t\t)\n\t}\n\n\t// Accept 'none' signing method.\n\treturn nil\n}\n\n// Only allow 'none' signing if UnsafeAllowNoneSignatureType is specified as the key\nfunc (m *signingMethodNone) Sign(signingString string, key interface{}) (string, error) {\n\tif _, ok := key.(unsafeNoneMagicConstant); ok {\n\t\treturn \"\", nil\n\t}\n\treturn \"\", NoneSignatureTypeDisallowedError\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/parser.go",
    "content": "package jwt\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Parser struct {\n\tValidMethods         []string // If populated, only these methods will be considered valid\n\tUseJSONNumber        bool     // Use JSON Number format in JSON decoder\n\tSkipClaimsValidation bool     // Skip claims validation during token parsing\n}\n\n// Parse, validate, and return a token.\n// keyFunc will receive the parsed token and should return the key for validating.\n// If everything is kosher, err will be nil\nfunc (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {\n\treturn p.ParseWithClaims(tokenString, MapClaims{}, keyFunc)\n}\n\nfunc (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) {\n\tparts := strings.Split(tokenString, \".\")\n\tif len(parts) != 3 {\n\t\treturn nil, NewValidationError(\"token contains an invalid number of segments\", ValidationErrorMalformed)\n\t}\n\n\tvar err error\n\ttoken := &Token{Raw: tokenString}\n\n\t// parse Header\n\tvar headerBytes []byte\n\tif headerBytes, err = DecodeSegment(parts[0]); err != nil {\n\t\tif strings.HasPrefix(strings.ToLower(tokenString), \"bearer \") {\n\t\t\treturn token, NewValidationError(\"tokenstring should not contain 'bearer '\", ValidationErrorMalformed)\n\t\t}\n\t\treturn token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed}\n\t}\n\tif err = json.Unmarshal(headerBytes, &token.Header); err != nil {\n\t\treturn token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed}\n\t}\n\n\t// parse Claims\n\tvar claimBytes []byte\n\ttoken.Claims = claims\n\n\tif claimBytes, err = DecodeSegment(parts[1]); err != nil {\n\t\treturn token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed}\n\t}\n\tdec := json.NewDecoder(bytes.NewBuffer(claimBytes))\n\tif p.UseJSONNumber {\n\t\tdec.UseNumber()\n\t}\n\t// JSON Decode.  Special case for map type to avoid weird pointer behavior\n\tif c, ok := token.Claims.(MapClaims); ok {\n\t\terr = dec.Decode(&c)\n\t} else {\n\t\terr = dec.Decode(&claims)\n\t}\n\t// Handle decode error\n\tif err != nil {\n\t\treturn token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed}\n\t}\n\n\t// Lookup signature method\n\tif method, ok := token.Header[\"alg\"].(string); ok {\n\t\tif token.Method = GetSigningMethod(method); token.Method == nil {\n\t\t\treturn token, NewValidationError(\"signing method (alg) is unavailable.\", ValidationErrorUnverifiable)\n\t\t}\n\t} else {\n\t\treturn token, NewValidationError(\"signing method (alg) is unspecified.\", ValidationErrorUnverifiable)\n\t}\n\n\t// Verify signing method is in the required set\n\tif p.ValidMethods != nil {\n\t\tvar signingMethodValid = false\n\t\tvar alg = token.Method.Alg()\n\t\tfor _, m := range p.ValidMethods {\n\t\t\tif m == alg {\n\t\t\t\tsigningMethodValid = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !signingMethodValid {\n\t\t\t// signing method is not in the listed set\n\t\t\treturn token, NewValidationError(fmt.Sprintf(\"signing method %v is invalid\", alg), ValidationErrorSignatureInvalid)\n\t\t}\n\t}\n\n\t// Lookup key\n\tvar key interface{}\n\tif keyFunc == nil {\n\t\t// keyFunc was not provided.  short circuiting validation\n\t\treturn token, NewValidationError(\"no Keyfunc was provided.\", ValidationErrorUnverifiable)\n\t}\n\tif key, err = keyFunc(token); err != nil {\n\t\t// keyFunc returned an error\n\t\treturn token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable}\n\t}\n\n\tvErr := &ValidationError{}\n\n\t// Validate Claims\n\tif !p.SkipClaimsValidation {\n\t\tif err := token.Claims.Valid(); err != nil {\n\n\t\t\t// If the Claims Valid returned an error, check if it is a validation error,\n\t\t\t// If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set\n\t\t\tif e, ok := err.(*ValidationError); !ok {\n\t\t\t\tvErr = &ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid}\n\t\t\t} else {\n\t\t\t\tvErr = e\n\t\t\t}\n\t\t}\n\t}\n\n\t// Perform validation\n\ttoken.Signature = parts[2]\n\tif err = token.Method.Verify(strings.Join(parts[0:2], \".\"), token.Signature, key); err != nil {\n\t\tvErr.Inner = err\n\t\tvErr.Errors |= ValidationErrorSignatureInvalid\n\t}\n\n\tif vErr.valid() {\n\t\ttoken.Valid = true\n\t\treturn token, nil\n\t}\n\n\treturn token, vErr\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/rsa.go",
    "content": "package jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n)\n\n// Implements the RSA family of signing methods signing methods\ntype SigningMethodRSA struct {\n\tName string\n\tHash crypto.Hash\n}\n\n// Specific instances for RS256 and company\nvar (\n\tSigningMethodRS256 *SigningMethodRSA\n\tSigningMethodRS384 *SigningMethodRSA\n\tSigningMethodRS512 *SigningMethodRSA\n)\n\nfunc init() {\n\t// RS256\n\tSigningMethodRS256 = &SigningMethodRSA{\"RS256\", crypto.SHA256}\n\tRegisterSigningMethod(SigningMethodRS256.Alg(), func() SigningMethod {\n\t\treturn SigningMethodRS256\n\t})\n\n\t// RS384\n\tSigningMethodRS384 = &SigningMethodRSA{\"RS384\", crypto.SHA384}\n\tRegisterSigningMethod(SigningMethodRS384.Alg(), func() SigningMethod {\n\t\treturn SigningMethodRS384\n\t})\n\n\t// RS512\n\tSigningMethodRS512 = &SigningMethodRSA{\"RS512\", crypto.SHA512}\n\tRegisterSigningMethod(SigningMethodRS512.Alg(), func() SigningMethod {\n\t\treturn SigningMethodRS512\n\t})\n}\n\nfunc (m *SigningMethodRSA) Alg() string {\n\treturn m.Name\n}\n\n// Implements the Verify method from SigningMethod\n// For this signing method, must be an rsa.PublicKey structure.\nfunc (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error {\n\tvar err error\n\n\t// Decode the signature\n\tvar sig []byte\n\tif sig, err = DecodeSegment(signature); err != nil {\n\t\treturn err\n\t}\n\n\tvar rsaKey *rsa.PublicKey\n\tvar ok bool\n\n\tif rsaKey, ok = key.(*rsa.PublicKey); !ok {\n\t\treturn ErrInvalidKeyType\n\t}\n\n\t// Create hasher\n\tif !m.Hash.Available() {\n\t\treturn ErrHashUnavailable\n\t}\n\thasher := m.Hash.New()\n\thasher.Write([]byte(signingString))\n\n\t// Verify the signature\n\treturn rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig)\n}\n\n// Implements the Sign method from SigningMethod\n// For this signing method, must be an rsa.PrivateKey structure.\nfunc (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) {\n\tvar rsaKey *rsa.PrivateKey\n\tvar ok bool\n\n\t// Validate type of key\n\tif rsaKey, ok = key.(*rsa.PrivateKey); !ok {\n\t\treturn \"\", ErrInvalidKey\n\t}\n\n\t// Create the hasher\n\tif !m.Hash.Available() {\n\t\treturn \"\", ErrHashUnavailable\n\t}\n\n\thasher := m.Hash.New()\n\thasher.Write([]byte(signingString))\n\n\t// Sign the string and return the encoded bytes\n\tif sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil)); err == nil {\n\t\treturn EncodeSegment(sigBytes), nil\n\t} else {\n\t\treturn \"\", err\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/rsa_pss.go",
    "content": "// +build go1.4\n\npackage jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n)\n\n// Implements the RSAPSS family of signing methods signing methods\ntype SigningMethodRSAPSS struct {\n\t*SigningMethodRSA\n\tOptions *rsa.PSSOptions\n}\n\n// Specific instances for RS/PS and company\nvar (\n\tSigningMethodPS256 *SigningMethodRSAPSS\n\tSigningMethodPS384 *SigningMethodRSAPSS\n\tSigningMethodPS512 *SigningMethodRSAPSS\n)\n\nfunc init() {\n\t// PS256\n\tSigningMethodPS256 = &SigningMethodRSAPSS{\n\t\t&SigningMethodRSA{\n\t\t\tName: \"PS256\",\n\t\t\tHash: crypto.SHA256,\n\t\t},\n\t\t&rsa.PSSOptions{\n\t\t\tSaltLength: rsa.PSSSaltLengthAuto,\n\t\t\tHash:       crypto.SHA256,\n\t\t},\n\t}\n\tRegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod {\n\t\treturn SigningMethodPS256\n\t})\n\n\t// PS384\n\tSigningMethodPS384 = &SigningMethodRSAPSS{\n\t\t&SigningMethodRSA{\n\t\t\tName: \"PS384\",\n\t\t\tHash: crypto.SHA384,\n\t\t},\n\t\t&rsa.PSSOptions{\n\t\t\tSaltLength: rsa.PSSSaltLengthAuto,\n\t\t\tHash:       crypto.SHA384,\n\t\t},\n\t}\n\tRegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod {\n\t\treturn SigningMethodPS384\n\t})\n\n\t// PS512\n\tSigningMethodPS512 = &SigningMethodRSAPSS{\n\t\t&SigningMethodRSA{\n\t\t\tName: \"PS512\",\n\t\t\tHash: crypto.SHA512,\n\t\t},\n\t\t&rsa.PSSOptions{\n\t\t\tSaltLength: rsa.PSSSaltLengthAuto,\n\t\t\tHash:       crypto.SHA512,\n\t\t},\n\t}\n\tRegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod {\n\t\treturn SigningMethodPS512\n\t})\n}\n\n// Implements the Verify method from SigningMethod\n// For this verify method, key must be an rsa.PublicKey struct\nfunc (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error {\n\tvar err error\n\n\t// Decode the signature\n\tvar sig []byte\n\tif sig, err = DecodeSegment(signature); err != nil {\n\t\treturn err\n\t}\n\n\tvar rsaKey *rsa.PublicKey\n\tswitch k := key.(type) {\n\tcase *rsa.PublicKey:\n\t\trsaKey = k\n\tdefault:\n\t\treturn ErrInvalidKey\n\t}\n\n\t// Create hasher\n\tif !m.Hash.Available() {\n\t\treturn ErrHashUnavailable\n\t}\n\thasher := m.Hash.New()\n\thasher.Write([]byte(signingString))\n\n\treturn rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options)\n}\n\n// Implements the Sign method from SigningMethod\n// For this signing method, key must be an rsa.PrivateKey struct\nfunc (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) {\n\tvar rsaKey *rsa.PrivateKey\n\n\tswitch k := key.(type) {\n\tcase *rsa.PrivateKey:\n\t\trsaKey = k\n\tdefault:\n\t\treturn \"\", ErrInvalidKeyType\n\t}\n\n\t// Create the hasher\n\tif !m.Hash.Available() {\n\t\treturn \"\", ErrHashUnavailable\n\t}\n\n\thasher := m.Hash.New()\n\thasher.Write([]byte(signingString))\n\n\t// Sign the string and return the encoded bytes\n\tif sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil {\n\t\treturn EncodeSegment(sigBytes), nil\n\t} else {\n\t\treturn \"\", err\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/rsa_utils.go",
    "content": "package jwt\n\nimport (\n\t\"crypto/rsa\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"errors\"\n)\n\nvar (\n\tErrKeyMustBePEMEncoded = errors.New(\"Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key\")\n\tErrNotRSAPrivateKey    = errors.New(\"Key is not a valid RSA private key\")\n\tErrNotRSAPublicKey     = errors.New(\"Key is not a valid RSA public key\")\n)\n\n// Parse PEM encoded PKCS1 or PKCS8 private key\nfunc ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) {\n\tvar err error\n\n\t// Parse PEM block\n\tvar block *pem.Block\n\tif block, _ = pem.Decode(key); block == nil {\n\t\treturn nil, ErrKeyMustBePEMEncoded\n\t}\n\n\tvar parsedKey interface{}\n\tif parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil {\n\t\tif parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar pkey *rsa.PrivateKey\n\tvar ok bool\n\tif pkey, ok = parsedKey.(*rsa.PrivateKey); !ok {\n\t\treturn nil, ErrNotRSAPrivateKey\n\t}\n\n\treturn pkey, nil\n}\n\n// Parse PEM encoded PKCS1 or PKCS8 public key\nfunc ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) {\n\tvar err error\n\n\t// Parse PEM block\n\tvar block *pem.Block\n\tif block, _ = pem.Decode(key); block == nil {\n\t\treturn nil, ErrKeyMustBePEMEncoded\n\t}\n\n\t// Parse the key\n\tvar parsedKey interface{}\n\tif parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil {\n\t\tif cert, err := x509.ParseCertificate(block.Bytes); err == nil {\n\t\t\tparsedKey = cert.PublicKey\n\t\t} else {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tvar pkey *rsa.PublicKey\n\tvar ok bool\n\tif pkey, ok = parsedKey.(*rsa.PublicKey); !ok {\n\t\treturn nil, ErrNotRSAPublicKey\n\t}\n\n\treturn pkey, nil\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/signing_method.go",
    "content": "package jwt\n\nimport (\n\t\"sync\"\n)\n\nvar signingMethods = map[string]func() SigningMethod{}\nvar signingMethodLock = new(sync.RWMutex)\n\n// Implement SigningMethod to add new methods for signing or verifying tokens.\ntype SigningMethod interface {\n\tVerify(signingString, signature string, key interface{}) error // Returns nil if signature is valid\n\tSign(signingString string, key interface{}) (string, error)    // Returns encoded signature or error\n\tAlg() string                                                   // returns the alg identifier for this method (example: 'HS256')\n}\n\n// Register the \"alg\" name and a factory function for signing method.\n// This is typically done during init() in the method's implementation\nfunc RegisterSigningMethod(alg string, f func() SigningMethod) {\n\tsigningMethodLock.Lock()\n\tdefer signingMethodLock.Unlock()\n\n\tsigningMethods[alg] = f\n}\n\n// Get a signing method from an \"alg\" string\nfunc GetSigningMethod(alg string) (method SigningMethod) {\n\tsigningMethodLock.RLock()\n\tdefer signingMethodLock.RUnlock()\n\n\tif methodF, ok := signingMethods[alg]; ok {\n\t\tmethod = methodF()\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/dgrijalva/jwt-go/token.go",
    "content": "package jwt\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"strings\"\n\t\"time\"\n)\n\n// TimeFunc provides the current time when parsing token to validate \"exp\" claim (expiration time).\n// You can override it to use another time value.  This is useful for testing or if your\n// server uses a different time zone than your tokens.\nvar TimeFunc = time.Now\n\n// Parse methods use this callback function to supply\n// the key for verification.  The function receives the parsed,\n// but unverified Token.  This allows you to use properties in the\n// Header of the token (such as `kid`) to identify which key to use.\ntype Keyfunc func(*Token) (interface{}, error)\n\n// A JWT Token.  Different fields will be used depending on whether you're\n// creating or parsing/verifying a token.\ntype Token struct {\n\tRaw       string                 // The raw token.  Populated when you Parse a token\n\tMethod    SigningMethod          // The signing method used or to be used\n\tHeader    map[string]interface{} // The first segment of the token\n\tClaims    Claims                 // The second segment of the token\n\tSignature string                 // The third segment of the token.  Populated when you Parse a token\n\tValid     bool                   // Is the token valid?  Populated when you Parse/Verify a token\n}\n\n// Create a new Token.  Takes a signing method\nfunc New(method SigningMethod) *Token {\n\treturn NewWithClaims(method, MapClaims{})\n}\n\nfunc NewWithClaims(method SigningMethod, claims Claims) *Token {\n\treturn &Token{\n\t\tHeader: map[string]interface{}{\n\t\t\t\"typ\": \"JWT\",\n\t\t\t\"alg\": method.Alg(),\n\t\t},\n\t\tClaims: claims,\n\t\tMethod: method,\n\t}\n}\n\n// Get the complete, signed token\nfunc (t *Token) SignedString(key interface{}) (string, error) {\n\tvar sig, sstr string\n\tvar err error\n\tif sstr, err = t.SigningString(); err != nil {\n\t\treturn \"\", err\n\t}\n\tif sig, err = t.Method.Sign(sstr, key); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn strings.Join([]string{sstr, sig}, \".\"), nil\n}\n\n// Generate the signing string.  This is the\n// most expensive part of the whole deal.  Unless you\n// need this for something special, just go straight for\n// the SignedString.\nfunc (t *Token) SigningString() (string, error) {\n\tvar err error\n\tparts := make([]string, 2)\n\tfor i, _ := range parts {\n\t\tvar jsonValue []byte\n\t\tif i == 0 {\n\t\t\tif jsonValue, err = json.Marshal(t.Header); err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t} else {\n\t\t\tif jsonValue, err = json.Marshal(t.Claims); err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t}\n\n\t\tparts[i] = EncodeSegment(jsonValue)\n\t}\n\treturn strings.Join(parts, \".\"), nil\n}\n\n// Parse, validate, and return a token.\n// keyFunc will receive the parsed token and should return the key for validating.\n// If everything is kosher, err will be nil\nfunc Parse(tokenString string, keyFunc Keyfunc) (*Token, error) {\n\treturn new(Parser).Parse(tokenString, keyFunc)\n}\n\nfunc ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) {\n\treturn new(Parser).ParseWithClaims(tokenString, claims, keyFunc)\n}\n\n// Encode JWT specific base64url encoding with padding stripped\nfunc EncodeSegment(seg []byte) string {\n\treturn strings.TrimRight(base64.URLEncoding.EncodeToString(seg), \"=\")\n}\n\n// Decode JWT specific base64url encoding with padding stripped\nfunc DecodeSegment(seg string) ([]byte, error) {\n\tif l := len(seg) % 4; l > 0 {\n\t\tseg += strings.Repeat(\"=\", 4-l)\n\t}\n\n\treturn base64.URLEncoding.DecodeString(seg)\n}\n"
  },
  {
    "path": "vendor/github.com/docker/docker/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        https://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   Copyright 2013-2017 Docker, Inc.\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       https://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/docker/docker/NOTICE",
    "content": "Docker\nCopyright 2012-2017 Docker, Inc.\n\nThis product includes software developed at Docker, Inc. (https://www.docker.com).\n\nThis product contains software (https://github.com/kr/pty) developed\nby Keith Rarick, licensed under the MIT License.\n\nThe following is courtesy of our legal counsel:\n\n\nUse and transfer of Docker may be subject to certain restrictions by the\nUnited States and other governments.\nIt is your responsibility to ensure that your use and/or transfer does not\nviolate applicable laws.\n\nFor more information, please see https://www.bis.doc.gov\n\nSee also https://www.apache.org/dev/crypto.html and/or seek legal counsel.\n"
  },
  {
    "path": "vendor/github.com/docker/docker/pkg/reexec/README.md",
    "content": "# reexec\n\nThe `reexec` package facilitates the busybox style reexec of the docker binary that we require because \nof the forking limitations of using Go.  Handlers can be registered with a name and the argv 0 of \nthe exec of the binary will be used to find and execute custom init paths.\n"
  },
  {
    "path": "vendor/github.com/docker/docker/pkg/reexec/command_linux.go",
    "content": "package reexec // import \"github.com/docker/docker/pkg/reexec\"\n\nimport (\n\t\"os/exec\"\n\t\"syscall\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\n// Self returns the path to the current process's binary.\n// Returns \"/proc/self/exe\".\nfunc Self() string {\n\treturn \"/proc/self/exe\"\n}\n\n// Command returns *exec.Cmd which has Path as current binary. Also it setting\n// SysProcAttr.Pdeathsig to SIGTERM.\n// This will use the in-memory version (/proc/self/exe) of the current binary,\n// it is thus safe to delete or replace the on-disk binary (os.Args[0]).\nfunc Command(args ...string) *exec.Cmd {\n\treturn &exec.Cmd{\n\t\tPath: Self(),\n\t\tArgs: args,\n\t\tSysProcAttr: &syscall.SysProcAttr{\n\t\t\tPdeathsig: unix.SIGTERM,\n\t\t},\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/docker/docker/pkg/reexec/command_unix.go",
    "content": "// +build freebsd darwin\n\npackage reexec // import \"github.com/docker/docker/pkg/reexec\"\n\nimport (\n\t\"os/exec\"\n)\n\n// Self returns the path to the current process's binary.\n// Uses os.Args[0].\nfunc Self() string {\n\treturn naiveSelf()\n}\n\n// Command returns *exec.Cmd which has Path as current binary.\n// For example if current binary is \"docker\" at \"/usr/bin/\", then cmd.Path will\n// be set to \"/usr/bin/docker\".\nfunc Command(args ...string) *exec.Cmd {\n\treturn &exec.Cmd{\n\t\tPath: Self(),\n\t\tArgs: args,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go",
    "content": "// +build !linux,!windows,!freebsd,!darwin\n\npackage reexec // import \"github.com/docker/docker/pkg/reexec\"\n\nimport (\n\t\"os/exec\"\n)\n\nfunc Self() string {\n\treturn \"\"\n}\n\n// Command is unsupported on operating systems apart from Linux, Windows, and Darwin.\nfunc Command(args ...string) *exec.Cmd {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/docker/docker/pkg/reexec/command_windows.go",
    "content": "package reexec // import \"github.com/docker/docker/pkg/reexec\"\n\nimport (\n\t\"os/exec\"\n)\n\n// Self returns the path to the current process's binary.\n// Uses os.Args[0].\nfunc Self() string {\n\treturn naiveSelf()\n}\n\n// Command returns *exec.Cmd which has Path as current binary.\n// For example if current binary is \"docker.exe\" at \"C:\\\", then cmd.Path will\n// be set to \"C:\\docker.exe\".\nfunc Command(args ...string) *exec.Cmd {\n\treturn &exec.Cmd{\n\t\tPath: Self(),\n\t\tArgs: args,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/docker/docker/pkg/reexec/reexec.go",
    "content": "package reexec // import \"github.com/docker/docker/pkg/reexec\"\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n)\n\nvar registeredInitializers = make(map[string]func())\n\n// Register adds an initialization func under the specified name\nfunc Register(name string, initializer func()) {\n\tif _, exists := registeredInitializers[name]; exists {\n\t\tpanic(fmt.Sprintf(\"reexec func already registered under name %q\", name))\n\t}\n\n\tregisteredInitializers[name] = initializer\n}\n\n// Init is called as the first part of the exec process and returns true if an\n// initialization function was called.\nfunc Init() bool {\n\tinitializer, exists := registeredInitializers[os.Args[0]]\n\tif exists {\n\t\tinitializer()\n\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc naiveSelf() string {\n\tname := os.Args[0]\n\tif filepath.Base(name) == name {\n\t\tif lp, err := exec.LookPath(name); err == nil {\n\t\t\treturn lp\n\t\t}\n\t}\n\t// handle conversion of relative paths to absolute\n\tif absName, err := filepath.Abs(name); err == nil {\n\t\treturn absName\n\t}\n\t// if we couldn't get absolute name, return original\n\t// (NOTE: Go only errors on Abs() if os.Getwd fails)\n\treturn name\n}\n"
  },
  {
    "path": "vendor/github.com/edsrzf/mmap-go/LICENSE",
    "content": "Copyright (c) 2011, Evan Shaw <edsrzf@gmail.com>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * 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    * Neither the name of the copyright holder nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "vendor/github.com/edsrzf/mmap-go/README.md",
    "content": "mmap-go\n=======\n\nmmap-go is a portable mmap package for the [Go programming language](http://golang.org).\nIt has been tested on Linux (386, amd64), OS X, and Windows (386). It should also\nwork on other Unix-like platforms, but hasn't been tested with them. I'm interested\nto hear about the results.\n\nI haven't been able to add more features without adding significant complexity,\nso mmap-go doesn't support mprotect, mincore, and maybe a few other things.\nIf you're running on a Unix-like platform and need some of these features,\nI suggest Gustavo Niemeyer's [gommap](http://labix.org/gommap).\n"
  },
  {
    "path": "vendor/github.com/edsrzf/mmap-go/mmap.go",
    "content": "// Copyright 2011 Evan Shaw. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This file defines the common package interface and contains a little bit of\n// factored out logic.\n\n// Package mmap allows mapping files into memory. It tries to provide a simple, reasonably portable interface,\n// but doesn't go out of its way to abstract away every little platform detail.\n// This specifically means:\n//\t* forked processes may or may not inherit mappings\n//\t* a file's timestamp may or may not be updated by writes through mappings\n//\t* specifying a size larger than the file's actual size can increase the file's size\n//\t* If the mapped file is being modified by another process while your program's running, don't expect consistent results between platforms\npackage mmap\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"reflect\"\n\t\"unsafe\"\n)\n\nconst (\n\t// RDONLY maps the memory read-only.\n\t// Attempts to write to the MMap object will result in undefined behavior.\n\tRDONLY = 0\n\t// RDWR maps the memory as read-write. Writes to the MMap object will update the\n\t// underlying file.\n\tRDWR = 1 << iota\n\t// COPY maps the memory as copy-on-write. Writes to the MMap object will affect\n\t// memory, but the underlying file will remain unchanged.\n\tCOPY\n\t// If EXEC is set, the mapped memory is marked as executable.\n\tEXEC\n)\n\nconst (\n\t// If the ANON flag is set, the mapped memory will not be backed by a file.\n\tANON = 1 << iota\n)\n\n// MMap represents a file mapped into memory.\ntype MMap []byte\n\n// Map maps an entire file into memory.\n// If ANON is set in flags, f is ignored.\nfunc Map(f *os.File, prot, flags int) (MMap, error) {\n\treturn MapRegion(f, -1, prot, flags, 0)\n}\n\n// MapRegion maps part of a file into memory.\n// The offset parameter must be a multiple of the system's page size.\n// If length < 0, the entire file will be mapped.\n// If ANON is set in flags, f is ignored.\nfunc MapRegion(f *os.File, length int, prot, flags int, offset int64) (MMap, error) {\n\tvar fd uintptr\n\tif flags&ANON == 0 {\n\t\tfd = uintptr(f.Fd())\n\t\tif length < 0 {\n\t\t\tfi, err := f.Stat()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tlength = int(fi.Size())\n\t\t}\n\t} else {\n\t\tif length <= 0 {\n\t\t\treturn nil, errors.New(\"anonymous mapping requires non-zero length\")\n\t\t}\n\t\tfd = ^uintptr(0)\n\t}\n\treturn mmap(length, uintptr(prot), uintptr(flags), fd, offset)\n}\n\nfunc (m *MMap) header() *reflect.SliceHeader {\n\treturn (*reflect.SliceHeader)(unsafe.Pointer(m))\n}\n\n// Lock keeps the mapped region in physical memory, ensuring that it will not be\n// swapped out.\nfunc (m MMap) Lock() error {\n\tdh := m.header()\n\treturn lock(dh.Data, uintptr(dh.Len))\n}\n\n// Unlock reverses the effect of Lock, allowing the mapped region to potentially\n// be swapped out.\n// If m is already unlocked, aan error will result.\nfunc (m MMap) Unlock() error {\n\tdh := m.header()\n\treturn unlock(dh.Data, uintptr(dh.Len))\n}\n\n// Flush synchronizes the mapping's contents to the file's contents on disk.\nfunc (m MMap) Flush() error {\n\tdh := m.header()\n\treturn flush(dh.Data, uintptr(dh.Len))\n}\n\n// Unmap deletes the memory mapped region, flushes any remaining changes, and sets\n// m to nil.\n// Trying to read or write any remaining references to m after Unmap is called will\n// result in undefined behavior.\n// Unmap should only be called on the slice value that was originally returned from\n// a call to Map. Calling Unmap on a derived slice may cause errors.\nfunc (m *MMap) Unmap() error {\n\tdh := m.header()\n\terr := unmap(dh.Data, uintptr(dh.Len))\n\t*m = nil\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/edsrzf/mmap-go/mmap_unix.go",
    "content": "// Copyright 2011 Evan Shaw. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux openbsd solaris netbsd\n\npackage mmap\n\nimport (\n\t\"syscall\"\n)\n\nfunc mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) {\n\tflags := syscall.MAP_SHARED\n\tprot := syscall.PROT_READ\n\tswitch {\n\tcase inprot&COPY != 0:\n\t\tprot |= syscall.PROT_WRITE\n\t\tflags = syscall.MAP_PRIVATE\n\tcase inprot&RDWR != 0:\n\t\tprot |= syscall.PROT_WRITE\n\t}\n\tif inprot&EXEC != 0 {\n\t\tprot |= syscall.PROT_EXEC\n\t}\n\tif inflags&ANON != 0 {\n\t\tflags |= syscall.MAP_ANON\n\t}\n\n\tb, err := syscall.Mmap(int(fd), off, len, prot, flags)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn b, nil\n}\n\nfunc flush(addr, len uintptr) error {\n\t_, _, errno := syscall.Syscall(_SYS_MSYNC, addr, len, _MS_SYNC)\n\tif errno != 0 {\n\t\treturn syscall.Errno(errno)\n\t}\n\treturn nil\n}\n\nfunc lock(addr, len uintptr) error {\n\t_, _, errno := syscall.Syscall(syscall.SYS_MLOCK, addr, len, 0)\n\tif errno != 0 {\n\t\treturn syscall.Errno(errno)\n\t}\n\treturn nil\n}\n\nfunc unlock(addr, len uintptr) error {\n\t_, _, errno := syscall.Syscall(syscall.SYS_MUNLOCK, addr, len, 0)\n\tif errno != 0 {\n\t\treturn syscall.Errno(errno)\n\t}\n\treturn nil\n}\n\nfunc unmap(addr, len uintptr) error {\n\t_, _, errno := syscall.Syscall(syscall.SYS_MUNMAP, addr, len, 0)\n\tif errno != 0 {\n\t\treturn syscall.Errno(errno)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/edsrzf/mmap-go/mmap_windows.go",
    "content": "// Copyright 2011 Evan Shaw. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage mmap\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"sync\"\n\t\"syscall\"\n)\n\n// mmap on Windows is a two-step process.\n// First, we call CreateFileMapping to get a handle.\n// Then, we call MapviewToFile to get an actual pointer into memory.\n// Because we want to emulate a POSIX-style mmap, we don't want to expose\n// the handle -- only the pointer. We also want to return only a byte slice,\n// not a struct, so it's convenient to manipulate.\n\n// We keep this map so that we can get back the original handle from the memory address.\nvar handleLock sync.Mutex\nvar handleMap = map[uintptr]syscall.Handle{}\n\nfunc mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) {\n\tflProtect := uint32(syscall.PAGE_READONLY)\n\tdwDesiredAccess := uint32(syscall.FILE_MAP_READ)\n\tswitch {\n\tcase prot&COPY != 0:\n\t\tflProtect = syscall.PAGE_WRITECOPY\n\t\tdwDesiredAccess = syscall.FILE_MAP_COPY\n\tcase prot&RDWR != 0:\n\t\tflProtect = syscall.PAGE_READWRITE\n\t\tdwDesiredAccess = syscall.FILE_MAP_WRITE\n\t}\n\tif prot&EXEC != 0 {\n\t\tflProtect <<= 4\n\t\tdwDesiredAccess |= syscall.FILE_MAP_EXECUTE\n\t}\n\n\t// The maximum size is the area of the file, starting from 0,\n\t// that we wish to allow to be mappable. It is the sum of\n\t// the length the user requested, plus the offset where that length\n\t// is starting from. This does not map the data into memory.\n\tmaxSizeHigh := uint32((off + int64(len)) >> 32)\n\tmaxSizeLow := uint32((off + int64(len)) & 0xFFFFFFFF)\n\t// TODO: Do we need to set some security attributes? It might help portability.\n\th, errno := syscall.CreateFileMapping(syscall.Handle(hfile), nil, flProtect, maxSizeHigh, maxSizeLow, nil)\n\tif h == 0 {\n\t\treturn nil, os.NewSyscallError(\"CreateFileMapping\", errno)\n\t}\n\n\t// Actually map a view of the data into memory. The view's size\n\t// is the length the user requested.\n\tfileOffsetHigh := uint32(off >> 32)\n\tfileOffsetLow := uint32(off & 0xFFFFFFFF)\n\taddr, errno := syscall.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len))\n\tif addr == 0 {\n\t\treturn nil, os.NewSyscallError(\"MapViewOfFile\", errno)\n\t}\n\thandleLock.Lock()\n\thandleMap[addr] = h\n\thandleLock.Unlock()\n\n\tm := MMap{}\n\tdh := m.header()\n\tdh.Data = addr\n\tdh.Len = len\n\tdh.Cap = dh.Len\n\n\treturn m, nil\n}\n\nfunc flush(addr, len uintptr) error {\n\terrno := syscall.FlushViewOfFile(addr, len)\n\tif errno != nil {\n\t\treturn os.NewSyscallError(\"FlushViewOfFile\", errno)\n\t}\n\n\thandleLock.Lock()\n\tdefer handleLock.Unlock()\n\thandle, ok := handleMap[addr]\n\tif !ok {\n\t\t// should be impossible; we would've errored above\n\t\treturn errors.New(\"unknown base address\")\n\t}\n\n\terrno = syscall.FlushFileBuffers(handle)\n\treturn os.NewSyscallError(\"FlushFileBuffers\", errno)\n}\n\nfunc lock(addr, len uintptr) error {\n\terrno := syscall.VirtualLock(addr, len)\n\treturn os.NewSyscallError(\"VirtualLock\", errno)\n}\n\nfunc unlock(addr, len uintptr) error {\n\terrno := syscall.VirtualUnlock(addr, len)\n\treturn os.NewSyscallError(\"VirtualUnlock\", errno)\n}\n\nfunc unmap(addr, len uintptr) error {\n\tflush(addr, len)\n\t// Lock the UnmapViewOfFile along with the handleMap deletion.\n\t// As soon as we unmap the view, the OS is free to give the\n\t// same addr to another new map. We don't want another goroutine\n\t// to insert and remove the same addr into handleMap while\n\t// we're trying to remove our old addr/handle pair.\n\thandleLock.Lock()\n\tdefer handleLock.Unlock()\n\terr := syscall.UnmapViewOfFile(addr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thandle, ok := handleMap[addr]\n\tif !ok {\n\t\t// should be impossible; we would've errored above\n\t\treturn errors.New(\"unknown base address\")\n\t}\n\tdelete(handleMap, addr)\n\n\te := syscall.CloseHandle(syscall.Handle(handle))\n\treturn os.NewSyscallError(\"CloseHandle\", e)\n}\n"
  },
  {
    "path": "vendor/github.com/edsrzf/mmap-go/msync_netbsd.go",
    "content": "// Copyright 2011 Evan Shaw. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage mmap\n\nconst _SYS_MSYNC = 277\nconst _MS_SYNC = 0x04\n"
  },
  {
    "path": "vendor/github.com/edsrzf/mmap-go/msync_unix.go",
    "content": "// Copyright 2011 Evan Shaw. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux openbsd solaris\n\npackage mmap\n\nimport (\n\t\"syscall\"\n)\n\nconst _SYS_MSYNC = syscall.SYS_MSYNC\nconst _MS_SYNC = syscall.MS_SYNC\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project will be documented in this file.\nThis project adheres to [Semantic Versioning](http://semver.org/).\n\n## [Unreleased]\n\n### Added\n\n### Fixed\n\n- Added missing runtime import for FreeBSD. #104\n\n### Changed\n\n### Deprecated\n\n## [0.9.0]\n\n### Added\n- Added support for huge TLB pages on Linux #97  \n- Added support for big endian platform #100 \n\n### Fixed\n- Add missing method for OpenBSD #99\n\n## [0.8.0]\n\n### Added\n- Added partial `getrusage` support for Windows to retrieve system CPU time and user CPU time. #95\n- Added full `getrusage` support for Unix. #95\n\n## [0.7.0]\n\n### Added\n- Added method stubs for process handling for operating system that are not supported\n  by gosigar. All methods return `ErrNotImplemented` on such systems. #88\n\n### Fixed\n- Fix freebsd build by using the common version of Get(pid). #91\n\n### Changed\n- Fixed issues in cgroup package by adding missing error checks and closing\n  file handles. #92\n\n## [0.6.0]\n\n### Added\n- Added method stubs to enable compilation for operating systems that are not\n  supported by gosigar. All methods return `ErrNotImplemented` on these unsupported\n  operating systems. #83\n- FreeBSD returns `ErrNotImplemented` for `ProcTime.Get`. #83\n\n### Changed\n- OpenBSD returns `ErrNotImplemented` for `ProcTime.Get` instead of `nil`. #83\n- Fixed incorrect `Mem.Used` calculation under linux. #82\n- Fixed `ProcState` on Linux and FreeBSD when process names contain parentheses. #81\n\n### Removed\n- Remove NetBSD build from sigar_unix.go as it is not supported by gosigar. #83\n\n## [0.5.0]\n\n### Changed\n- Fixed Trim environment variables when comparing values in the test suite. #79\n- Make `kern_procargs` more robust under darwin when we cannot retrieve\n  all the information about a process. #78\n\n## [0.4.0]\n\n### Changed\n- Fixed Windows issue that caused a hang during `init()` if WMI wasn't ready. #74\n\n## [0.3.0]\n\n### Added\n- Read `MemAvailable` value for kernel 3.14+ #71\n\n## [0.2.0]\n\n### Added\n- Added `ErrCgroupsMissing` to indicate that /proc/cgroups is missing which is\n  an indicator that cgroups were disabled at compile time. #64\n\n### Changed\n- Changed `cgroup.SupportedSubsystems()` to honor the \"enabled\" column in the\n  /proc/cgroups file. #64\n\n## [0.1.0]\n\n### Added\n- Added `CpuList` implementation for Windows that returns CPU timing information\n  on a per CPU basis. #55\n- Added `Uptime` implementation for Windows. #55\n- Added `Swap` implementation for Windows based on page file metrics. #55\n- Added support to `github.com/gosigar/sys/windows` for querying and enabling\n  privileges in a process token.\n- Added utility code for interfacing with linux NETLINK_INET_DIAG. #60\n- Added `ProcEnv` for getting a process's environment variables. #61\n\n### Changed\n- Changed several `OpenProcess` calls on Windows to request the lowest possible\n  access privileges. #50\n- Removed cgo usage from Windows code.\n- Added OS version checks to `ProcArgs.Get` on Windows because the\n  `Win32_Process` WMI query is not available prior to Windows vista. On XP and\n  Windows 2003, this method returns `ErrNotImplemented`. #55\n\n### Fixed\n- Fixed value of `Mem.ActualFree` and `Mem.ActualUsed` on Windows. #49\n- Fixed `ProcTime.StartTime` on Windows to report value in milliseconds since\n  Unix epoch. #51\n- Fixed `ProcStatus.PPID` value is wrong on Windows. #55\n- Fixed `ProcStatus.Username` error on Windows XP #56\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/LICENSE",
    "content": "                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\n   To apply the Apache License to your work, attach the following\n   boilerplate notice, with the fields enclosed by brackets \"[]\"\n   replaced with your own identifying information. (Don't include\n   the brackets!)  The text should be enclosed in the appropriate\n   comment syntax for the file format. We also recommend that a\n   file or class name and description of purpose be included on the\n   same \"printed page\" as the copyright notice for easier\n   identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/NOTICE",
    "content": "Copyright (c) [2009-2011] VMware, Inc. All Rights Reserved. \n\nThis product is licensed to you under the Apache License, Version 2.0 (the \"License\").  \nYou may not use this product except in compliance with the License.  \n\nThis product includes a number of subcomponents with\nseparate copyright notices and license terms. Your use of these\nsubcomponents is subject to the terms and conditions of the \nsubcomponent's license, as noted in the LICENSE file."
  },
  {
    "path": "vendor/github.com/elastic/gosigar/README.md",
    "content": "# Go sigar [![Build Status](https://travis-ci.org/elastic/gosigar.svg?branch=master)](https://travis-ci.org/elastic/gosigar) [![Build status](https://ci.appveyor.com/api/projects/status/4yh6sa7u97ek5uib/branch/master?svg=true)](https://ci.appveyor.com/project/elastic-beats/gosigar/branch/master)\n\n\n## Overview\n\nGo sigar is a golang implementation of the\n[sigar API](https://github.com/hyperic/sigar).  The Go version of\nsigar has a very similar interface, but is being written from scratch\nin pure go/cgo, rather than cgo bindings for libsigar.\n\n## Test drive\n\n    $ go get github.com/elastic/gosigar\n    $ cd $GOPATH/src/github.com/elastic/gosigar/examples/ps\n    $ go build\n    $ ./ps\n\n## Supported platforms\n\nThe features vary by operating system.\n\n| Feature         | Linux | Darwin | Windows | OpenBSD | FreeBSD |\n|-----------------|:-----:|:------:|:-------:|:-------:|:-------:|\n| Cpu             |   X   |    X   |    X    |    X    |    X    |\n| CpuList         |   X   |    X   |         |    X    |    X    |\n| FDUsage         |   X   |        |         |         |    X    |\n| FileSystemList  |   X   |    X   |    X    |    X    |    X    |\n| FileSystemUsage |   X   |    X   |    X    |    X    |    X    |\n| HugeTLBPages    |   X   |        |         |         |         |\n| LoadAverage     |   X   |    X   |         |    X    |    X    |\n| Mem             |   X   |    X   |    X    |    X    |    X    |\n| ProcArgs        |   X   |    X   |    X    |         |    X    |\n| ProcEnv         |   X   |    X   |         |         |    X    |\n| ProcExe         |   X   |    X   |         |         |    X    |\n| ProcFDUsage     |   X   |        |         |         |    X    |\n| ProcList        |   X   |    X   |    X    |         |    X    |\n| ProcMem         |   X   |    X   |    X    |         |    X    |\n| ProcState       |   X   |    X   |    X    |         |    X    |\n| ProcTime        |   X   |    X   |    X    |         |    X    |\n| Swap            |   X   |    X   |         |    X    |    X    |\n| Uptime          |   X   |    X   |         |    X    |    X    |\n\n## OS Specific Notes\n\n### FreeBSD\n\nMount both `linprocfs` and `procfs` for compatability. Consider adding these\nmounts to your `/etc/fstab` file so they are mounted automatically at boot.\n\n```\nsudo mount -t procfs proc /proc\nsudo mkdir -p /compat/linux/proc\nsudo mount -t linprocfs /dev/null /compat/linux/proc\n```\n\n## License\n\nApache 2.0\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/Vagrantfile",
    "content": "# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!\nVAGRANTFILE_API_VERSION = \"2\"\n\nVagrant.configure(VAGRANTFILE_API_VERSION) do |config|\n  config.vm.box = \"hashicorp/precise64\"\n  config.vm.provision \"shell\", inline: \"mkdir -p /home/vagrant/go\"\n  config.vm.synced_folder \".\", \"/home/vagrant/go/src/github.com/cloudfoundry/gosigar\"\n  config.vm.provision \"shell\", inline: \"chown -R vagrant:vagrant /home/vagrant/go\"\n  install_go = <<-BASH\n  set -e\n\nif [ ! -d \"/usr/local/go\" ]; then\n\tcd /tmp && wget https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz\n\tcd /usr/local\n\ttar xvzf /tmp/go1.3.3.linux-amd64.tar.gz\n\techo 'export GOPATH=/home/vagrant/go; export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin' >> /home/vagrant/.bashrc\nfi\nexport GOPATH=/home/vagrant/go\nexport PATH=/usr/local/go/bin:$PATH:$GOPATH/bin\n/usr/local/go/bin/go get -u github.com/onsi/ginkgo/ginkgo\n/usr/local/go/bin/go get -u github.com/onsi/gomega;\nBASH\n  config.vm.provision \"shell\", inline: 'apt-get install -y git-core'\n  config.vm.provision \"shell\", inline: install_go\nend\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/codecov.yml",
    "content": "# Enable coverage report message for diff on commit\ncoverage:\n  status:\n    project: off\n    patch:\n      default:\n        # basic\n        target: auto\n        threshold: null\n        base: auto\n        # advanced\n        branches: null\n        if_no_uploads: error\n        if_not_found: success\n        if_ci_failed: error\n        only_pulls: false\n        flags: null\n        paths: null\n\n# Disable comments on Pull Requests\ncomment: false\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/concrete_sigar.go",
    "content": "package gosigar\n\nimport (\n\t\"time\"\n)\n\ntype ConcreteSigar struct{}\n\nfunc (c *ConcreteSigar) CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{}) {\n\t// samplesCh is buffered to 1 value to immediately return first CPU sample\n\tsamplesCh := make(chan Cpu, 1)\n\n\tstopCh := make(chan struct{})\n\n\tgo func() {\n\t\tvar cpuUsage Cpu\n\n\t\t// Immediately provide non-delta value.\n\t\t// samplesCh is buffered to 1 value, so it will not block.\n\t\tcpuUsage.Get()\n\t\tsamplesCh <- cpuUsage\n\n\t\tticker := time.NewTicker(collectionInterval)\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-ticker.C:\n\t\t\t\tpreviousCpuUsage := cpuUsage\n\n\t\t\t\tcpuUsage.Get()\n\n\t\t\t\tselect {\n\t\t\t\tcase samplesCh <- cpuUsage.Delta(previousCpuUsage):\n\t\t\t\tdefault:\n\t\t\t\t\t// Include default to avoid channel blocking\n\t\t\t\t}\n\n\t\t\tcase <-stopCh:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\treturn samplesCh, stopCh\n}\n\nfunc (c *ConcreteSigar) GetLoadAverage() (LoadAverage, error) {\n\tl := LoadAverage{}\n\terr := l.Get()\n\treturn l, err\n}\n\nfunc (c *ConcreteSigar) GetMem() (Mem, error) {\n\tm := Mem{}\n\terr := m.Get()\n\treturn m, err\n}\n\nfunc (c *ConcreteSigar) GetSwap() (Swap, error) {\n\ts := Swap{}\n\terr := s.Get()\n\treturn s, err\n}\n\nfunc (c *ConcreteSigar) GetHugeTLBPages() (HugeTLBPages, error) {\n\tp := HugeTLBPages{}\n\terr := p.Get()\n\treturn p, err\n}\n\nfunc (c *ConcreteSigar) GetFileSystemUsage(path string) (FileSystemUsage, error) {\n\tf := FileSystemUsage{}\n\terr := f.Get(path)\n\treturn f, err\n}\n\nfunc (c *ConcreteSigar) GetFDUsage() (FDUsage, error) {\n\tfd := FDUsage{}\n\terr := fd.Get()\n\treturn fd, err\n}\n\n// GetRusage return the resource usage of the process\n// Possible params: 0 = RUSAGE_SELF, 1 = RUSAGE_CHILDREN, 2 = RUSAGE_THREAD\nfunc (c *ConcreteSigar) GetRusage(who int) (Rusage, error) {\n\tr := Rusage{}\n\terr := r.Get(who)\n\treturn r, err\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_darwin.go",
    "content": "// Copyright (c) 2012 VMware, Inc.\n\npackage gosigar\n\n/*\n#include <stdlib.h>\n#include <sys/sysctl.h>\n#include <sys/mount.h>\n#include <mach/mach_init.h>\n#include <mach/mach_host.h>\n#include <mach/host_info.h>\n#include <libproc.h>\n#include <mach/processor_info.h>\n#include <mach/vm_map.h>\n*/\nimport \"C\"\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"os/user\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"syscall\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc (self *LoadAverage) Get() error {\n\tavg := []C.double{0, 0, 0}\n\n\tC.getloadavg(&avg[0], C.int(len(avg)))\n\n\tself.One = float64(avg[0])\n\tself.Five = float64(avg[1])\n\tself.Fifteen = float64(avg[2])\n\n\treturn nil\n}\n\nfunc (self *Uptime) Get() error {\n\ttv := syscall.Timeval32{}\n\n\tif err := sysctlbyname(\"kern.boottime\", &tv); err != nil {\n\t\treturn err\n\t}\n\n\tself.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds()\n\n\treturn nil\n}\n\nfunc (self *Mem) Get() error {\n\tvar vmstat C.vm_statistics_data_t\n\n\tif err := sysctlbyname(\"hw.memsize\", &self.Total); err != nil {\n\t\treturn err\n\t}\n\n\tif err := vm_info(&vmstat); err != nil {\n\t\treturn err\n\t}\n\n\tkern := uint64(vmstat.inactive_count) << 12\n\tself.Free = uint64(vmstat.free_count) << 12\n\n\tself.Used = self.Total - self.Free\n\tself.ActualFree = self.Free + kern\n\tself.ActualUsed = self.Used - kern\n\n\treturn nil\n}\n\ntype xsw_usage struct {\n\tTotal, Avail, Used uint64\n}\n\nfunc (self *Swap) Get() error {\n\tsw_usage := xsw_usage{}\n\n\tif err := sysctlbyname(\"vm.swapusage\", &sw_usage); err != nil {\n\t\treturn err\n\t}\n\n\tself.Total = sw_usage.Total\n\tself.Used = sw_usage.Used\n\tself.Free = sw_usage.Avail\n\n\treturn nil\n}\n\nfunc (self *HugeTLBPages) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *Cpu) Get() error {\n\tvar count C.mach_msg_type_number_t = C.HOST_CPU_LOAD_INFO_COUNT\n\tvar cpuload C.host_cpu_load_info_data_t\n\n\tstatus := C.host_statistics(C.host_t(C.mach_host_self()),\n\t\tC.HOST_CPU_LOAD_INFO,\n\t\tC.host_info_t(unsafe.Pointer(&cpuload)),\n\t\t&count)\n\n\tif status != C.KERN_SUCCESS {\n\t\treturn fmt.Errorf(\"host_statistics error=%d\", status)\n\t}\n\n\tself.User = uint64(cpuload.cpu_ticks[C.CPU_STATE_USER])\n\tself.Sys = uint64(cpuload.cpu_ticks[C.CPU_STATE_SYSTEM])\n\tself.Idle = uint64(cpuload.cpu_ticks[C.CPU_STATE_IDLE])\n\tself.Nice = uint64(cpuload.cpu_ticks[C.CPU_STATE_NICE])\n\n\treturn nil\n}\n\nfunc (self *CpuList) Get() error {\n\tvar count C.mach_msg_type_number_t\n\tvar cpuload *C.processor_cpu_load_info_data_t\n\tvar ncpu C.natural_t\n\n\tstatus := C.host_processor_info(C.host_t(C.mach_host_self()),\n\t\tC.PROCESSOR_CPU_LOAD_INFO,\n\t\t&ncpu,\n\t\t(*C.processor_info_array_t)(unsafe.Pointer(&cpuload)),\n\t\t&count)\n\n\tif status != C.KERN_SUCCESS {\n\t\treturn fmt.Errorf(\"host_processor_info error=%d\", status)\n\t}\n\n\t// jump through some cgo casting hoops and ensure we properly free\n\t// the memory that cpuload points to\n\ttarget := C.vm_map_t(C.mach_task_self_)\n\taddress := C.vm_address_t(uintptr(unsafe.Pointer(cpuload)))\n\tdefer C.vm_deallocate(target, address, C.vm_size_t(ncpu))\n\n\t// the body of struct processor_cpu_load_info\n\t// aka processor_cpu_load_info_data_t\n\tvar cpu_ticks [C.CPU_STATE_MAX]uint32\n\n\t// copy the cpuload array to a []byte buffer\n\t// where we can binary.Read the data\n\tsize := int(ncpu) * binary.Size(cpu_ticks)\n\tbuf := C.GoBytes(unsafe.Pointer(cpuload), C.int(size))\n\n\tbbuf := bytes.NewBuffer(buf)\n\n\tself.List = make([]Cpu, 0, ncpu)\n\n\tfor i := 0; i < int(ncpu); i++ {\n\t\tcpu := Cpu{}\n\n\t\terr := binary.Read(bbuf, binary.LittleEndian, &cpu_ticks)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tcpu.User = uint64(cpu_ticks[C.CPU_STATE_USER])\n\t\tcpu.Sys = uint64(cpu_ticks[C.CPU_STATE_SYSTEM])\n\t\tcpu.Idle = uint64(cpu_ticks[C.CPU_STATE_IDLE])\n\t\tcpu.Nice = uint64(cpu_ticks[C.CPU_STATE_NICE])\n\n\t\tself.List = append(self.List, cpu)\n\t}\n\n\treturn nil\n}\n\nfunc (self *FDUsage) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *FileSystemList) Get() error {\n\tnum, err := syscall.Getfsstat(nil, C.MNT_NOWAIT)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbuf := make([]syscall.Statfs_t, num)\n\n\t_, err = syscall.Getfsstat(buf, C.MNT_NOWAIT)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfslist := make([]FileSystem, 0, num)\n\n\tfor i := 0; i < num; i++ {\n\t\tfs := FileSystem{}\n\n\t\tfs.DirName = bytePtrToString(&buf[i].Mntonname[0])\n\t\tfs.DevName = bytePtrToString(&buf[i].Mntfromname[0])\n\t\tfs.SysTypeName = bytePtrToString(&buf[i].Fstypename[0])\n\n\t\tfslist = append(fslist, fs)\n\t}\n\n\tself.List = fslist\n\n\treturn err\n}\n\nfunc (self *ProcList) Get() error {\n\tn := C.proc_listpids(C.PROC_ALL_PIDS, 0, nil, 0)\n\tif n <= 0 {\n\t\treturn syscall.EINVAL\n\t}\n\tbuf := make([]byte, n)\n\tn = C.proc_listpids(C.PROC_ALL_PIDS, 0, unsafe.Pointer(&buf[0]), n)\n\tif n <= 0 {\n\t\treturn syscall.ENOMEM\n\t}\n\n\tvar pid int32\n\tnum := int(n) / binary.Size(pid)\n\tlist := make([]int, 0, num)\n\tbbuf := bytes.NewBuffer(buf)\n\n\tfor i := 0; i < num; i++ {\n\t\tif err := binary.Read(bbuf, binary.LittleEndian, &pid); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif pid == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tlist = append(list, int(pid))\n\t}\n\n\tself.List = list\n\n\treturn nil\n}\n\nfunc (self *ProcState) Get(pid int) error {\n\tinfo := C.struct_proc_taskallinfo{}\n\n\tif err := task_info(pid, &info); err != nil {\n\t\treturn err\n\t}\n\n\tself.Name = C.GoString(&info.pbsd.pbi_comm[0])\n\n\tswitch info.pbsd.pbi_status {\n\tcase C.SIDL:\n\t\tself.State = RunStateIdle\n\tcase C.SRUN:\n\t\tself.State = RunStateRun\n\tcase C.SSLEEP:\n\t\tself.State = RunStateSleep\n\tcase C.SSTOP:\n\t\tself.State = RunStateStop\n\tcase C.SZOMB:\n\t\tself.State = RunStateZombie\n\tdefault:\n\t\tself.State = RunStateUnknown\n\t}\n\n\tself.Ppid = int(info.pbsd.pbi_ppid)\n\n\tself.Pgid = int(info.pbsd.pbi_pgid)\n\n\tself.Tty = int(info.pbsd.e_tdev)\n\n\tself.Priority = int(info.ptinfo.pti_priority)\n\n\tself.Nice = int(info.pbsd.pbi_nice)\n\n\t// Get process username. Fallback to UID if username is not available.\n\tuid := strconv.Itoa(int(info.pbsd.pbi_uid))\n\tuser, err := user.LookupId(uid)\n\tif err == nil && user.Username != \"\" {\n\t\tself.Username = user.Username\n\t} else {\n\t\tself.Username = uid\n\t}\n\n\treturn nil\n}\n\nfunc (self *ProcMem) Get(pid int) error {\n\tinfo := C.struct_proc_taskallinfo{}\n\n\tif err := task_info(pid, &info); err != nil {\n\t\treturn err\n\t}\n\n\tself.Size = uint64(info.ptinfo.pti_virtual_size)\n\tself.Resident = uint64(info.ptinfo.pti_resident_size)\n\tself.PageFaults = uint64(info.ptinfo.pti_faults)\n\n\treturn nil\n}\n\nfunc (self *ProcTime) Get(pid int) error {\n\tinfo := C.struct_proc_taskallinfo{}\n\n\tif err := task_info(pid, &info); err != nil {\n\t\treturn err\n\t}\n\n\tself.User =\n\t\tuint64(info.ptinfo.pti_total_user) / uint64(time.Millisecond)\n\n\tself.Sys =\n\t\tuint64(info.ptinfo.pti_total_system) / uint64(time.Millisecond)\n\n\tself.Total = self.User + self.Sys\n\n\tself.StartTime = (uint64(info.pbsd.pbi_start_tvsec) * 1000) +\n\t\t(uint64(info.pbsd.pbi_start_tvusec) / 1000)\n\n\treturn nil\n}\n\nfunc (self *ProcArgs) Get(pid int) error {\n\tvar args []string\n\n\targv := func(arg string) {\n\t\targs = append(args, arg)\n\t}\n\n\terr := kern_procargs(pid, nil, argv, nil)\n\n\tself.List = args\n\n\treturn err\n}\n\nfunc (self *ProcEnv) Get(pid int) error {\n\tif self.Vars == nil {\n\t\tself.Vars = map[string]string{}\n\t}\n\n\tenv := func(k, v string) {\n\t\tself.Vars[k] = v\n\t}\n\n\treturn kern_procargs(pid, nil, nil, env)\n}\n\nfunc (self *ProcExe) Get(pid int) error {\n\texe := func(arg string) {\n\t\tself.Name = arg\n\t}\n\n\treturn kern_procargs(pid, exe, nil, nil)\n}\n\nfunc (self *ProcFDUsage) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\n// wrapper around sysctl KERN_PROCARGS2\n// callbacks params are optional,\n// up to the caller as to which pieces of data they want\nfunc kern_procargs(pid int,\n\texe func(string),\n\targv func(string),\n\tenv func(string, string)) error {\n\n\tmib := []C.int{C.CTL_KERN, C.KERN_PROCARGS2, C.int(pid)}\n\targmax := uintptr(C.ARG_MAX)\n\tbuf := make([]byte, argmax)\n\terr := sysctl(mib, &buf[0], &argmax, nil, 0)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\tbbuf := bytes.NewBuffer(buf)\n\tbbuf.Truncate(int(argmax))\n\n\tvar argc int32\n\tbinary.Read(bbuf, binary.LittleEndian, &argc)\n\n\tpath, err := bbuf.ReadBytes(0)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"Error reading the argv[0]: %v\", err)\n\t}\n\tif exe != nil {\n\t\texe(string(chop(path)))\n\t}\n\n\t// skip trailing \\0's\n\tfor {\n\t\tc, err := bbuf.ReadByte()\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Error skipping nils: %v\", err)\n\t\t}\n\t\tif c != 0 {\n\t\t\tbbuf.UnreadByte()\n\t\t\tbreak // start of argv[0]\n\t\t}\n\t}\n\n\tfor i := 0; i < int(argc); i++ {\n\t\targ, err := bbuf.ReadBytes(0)\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Error reading args: %v\", err)\n\t\t}\n\t\tif argv != nil {\n\t\t\targv(string(chop(arg)))\n\t\t}\n\t}\n\n\tif env == nil {\n\t\treturn nil\n\t}\n\n\tdelim := []byte{61} // \"=\"\n\n\tfor {\n\t\tline, err := bbuf.ReadBytes(0)\n\t\tif err == io.EOF || line[0] == 0 {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"Error reading args: %v\", err)\n\t\t}\n\t\tpair := bytes.SplitN(chop(line), delim, 2)\n\n\t\tif len(pair) != 2 {\n\t\t\treturn fmt.Errorf(\"Error reading process information for PID: %d\", pid)\n\t\t}\n\n\t\tenv(string(pair[0]), string(pair[1]))\n\t}\n\n\treturn nil\n}\n\n// XXX copied from zsyscall_darwin_amd64.go\nfunc sysctl(mib []C.int, old *byte, oldlen *uintptr,\n\tnew *byte, newlen uintptr) (err error) {\n\tvar p0 unsafe.Pointer\n\tp0 = unsafe.Pointer(&mib[0])\n\t_, _, e1 := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(p0),\n\t\tuintptr(len(mib)),\n\t\tuintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)),\n\t\tuintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc vm_info(vmstat *C.vm_statistics_data_t) error {\n\tvar count C.mach_msg_type_number_t = C.HOST_VM_INFO_COUNT\n\n\tstatus := C.host_statistics(\n\t\tC.host_t(C.mach_host_self()),\n\t\tC.HOST_VM_INFO,\n\t\tC.host_info_t(unsafe.Pointer(vmstat)),\n\t\t&count)\n\n\tif status != C.KERN_SUCCESS {\n\t\treturn fmt.Errorf(\"host_statistics=%d\", status)\n\t}\n\n\treturn nil\n}\n\n// generic Sysctl buffer unmarshalling\nfunc sysctlbyname(name string, data interface{}) (err error) {\n\tval, err := syscall.Sysctl(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbuf := []byte(val)\n\n\tswitch v := data.(type) {\n\tcase *uint64:\n\t\t*v = *(*uint64)(unsafe.Pointer(&buf[0]))\n\t\treturn\n\t}\n\n\tbbuf := bytes.NewBuffer([]byte(val))\n\treturn binary.Read(bbuf, binary.LittleEndian, data)\n}\n\nfunc task_info(pid int, info *C.struct_proc_taskallinfo) error {\n\tsize := C.int(unsafe.Sizeof(*info))\n\tptr := unsafe.Pointer(info)\n\n\tn := C.proc_pidinfo(C.int(pid), C.PROC_PIDTASKALLINFO, 0, ptr, size)\n\tif n != size {\n\t\treturn fmt.Errorf(\"Could not read process info for pid %d\", pid)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_format.go",
    "content": "// Copyright (c) 2012 VMware, Inc.\n\npackage gosigar\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// Go version of apr_strfsize\nfunc FormatSize(size uint64) string {\n\tord := []string{\"K\", \"M\", \"G\", \"T\", \"P\", \"E\"}\n\to := 0\n\tbuf := new(bytes.Buffer)\n\tw := bufio.NewWriter(buf)\n\n\tif size < 973 {\n\t\tfmt.Fprintf(w, \"%3d \", size)\n\t\tw.Flush()\n\t\treturn buf.String()\n\t}\n\n\tfor {\n\t\tremain := size & 1023\n\t\tsize >>= 10\n\n\t\tif size >= 973 {\n\t\t\to++\n\t\t\tcontinue\n\t\t}\n\n\t\tif size < 9 || (size == 9 && remain < 973) {\n\t\t\tremain = ((remain * 5) + 256) / 512\n\t\t\tif remain >= 10 {\n\t\t\t\tsize++\n\t\t\t\tremain = 0\n\t\t\t}\n\n\t\t\tfmt.Fprintf(w, \"%d.%d%s\", size, remain, ord[o])\n\t\t\tbreak\n\t\t}\n\n\t\tif remain >= 512 {\n\t\t\tsize++\n\t\t}\n\n\t\tfmt.Fprintf(w, \"%3d%s\", size, ord[o])\n\t\tbreak\n\t}\n\n\tw.Flush()\n\treturn buf.String()\n}\n\nfunc FormatPercent(percent float64) string {\n\treturn strconv.FormatFloat(percent, 'f', -1, 64) + \"%\"\n}\n\nfunc (self *FileSystemUsage) UsePercent() float64 {\n\tb_used := (self.Total - self.Free) / 1024\n\tb_avail := self.Avail / 1024\n\tutotal := b_used + b_avail\n\tused := b_used\n\n\tif utotal != 0 {\n\t\tu100 := used * 100\n\t\tpct := u100 / utotal\n\t\tif u100%utotal != 0 {\n\t\t\tpct += 1\n\t\t}\n\t\treturn (float64(pct) / float64(100)) * 100.0\n\t}\n\n\treturn 0.0\n}\n\nfunc (self *Uptime) Format() string {\n\tbuf := new(bytes.Buffer)\n\tw := bufio.NewWriter(buf)\n\tuptime := uint64(self.Length)\n\n\tdays := uptime / (60 * 60 * 24)\n\n\tif days != 0 {\n\t\ts := \"\"\n\t\tif days > 1 {\n\t\t\ts = \"s\"\n\t\t}\n\t\tfmt.Fprintf(w, \"%d day%s, \", days, s)\n\t}\n\n\tminutes := uptime / 60\n\thours := minutes / 60\n\thours %= 24\n\tminutes %= 60\n\n\tfmt.Fprintf(w, \"%2d:%02d\", hours, minutes)\n\n\tw.Flush()\n\treturn buf.String()\n}\n\nfunc (self *ProcTime) FormatStartTime() string {\n\tif self.StartTime == 0 {\n\t\treturn \"00:00\"\n\t}\n\tstart := time.Unix(int64(self.StartTime)/1000, 0)\n\tformat := \"Jan02\"\n\tif time.Since(start).Seconds() < (60 * 60 * 24) {\n\t\tformat = \"15:04\"\n\t}\n\treturn start.Format(format)\n}\n\nfunc (self *ProcTime) FormatTotal() string {\n\tt := self.Total / 1000\n\tss := t % 60\n\tt /= 60\n\tmm := t % 60\n\tt /= 60\n\thh := t % 24\n\treturn fmt.Sprintf(\"%02d:%02d:%02d\", hh, mm, ss)\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_freebsd.go",
    "content": "// Copied and modified from sigar_linux.go.\n\npackage gosigar\n\nimport (\n\t\"io/ioutil\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unsafe\"\n)\n\n/*\n#include <sys/param.h>\n#include <sys/mount.h>\n#include <sys/ucred.h>\n#include <sys/types.h>\n#include <sys/sysctl.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <unistd.h>\n#include <time.h>\n*/\nimport \"C\"\n\nfunc init() {\n\tsystem.ticks = uint64(C.sysconf(C._SC_CLK_TCK))\n\n\tProcd = \"/compat/linux/proc\"\n\n\tgetLinuxBootTime()\n}\n\nfunc getMountTableFileName() string {\n\treturn Procd + \"/mtab\"\n}\n\nfunc (self *Uptime) Get() error {\n\tts := C.struct_timespec{}\n\n\tif _, err := C.clock_gettime(C.CLOCK_UPTIME, &ts); err != nil {\n\t\treturn err\n\t}\n\n\tself.Length = float64(ts.tv_sec) + 1e-9*float64(ts.tv_nsec)\n\n\treturn nil\n}\n\nfunc (self *FDUsage) Get() error {\n\tval := C.uint32_t(0)\n\tsc := C.size_t(4)\n\n\tname := C.CString(\"kern.openfiles\")\n\t_, err := C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)\n\tC.free(unsafe.Pointer(name))\n\tif err != nil {\n\t\treturn err\n\t}\n\tself.Open = uint64(val)\n\n\tname = C.CString(\"kern.maxfiles\")\n\t_, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)\n\tC.free(unsafe.Pointer(name))\n\tif err != nil {\n\t\treturn err\n\t}\n\tself.Max = uint64(val)\n\n\tself.Unused = self.Max - self.Open\n\n\treturn nil\n}\n\nfunc (self *ProcFDUsage) Get(pid int) error {\n\terr := readFile(\"/proc/\"+strconv.Itoa(pid)+\"/rlimit\", func(line string) bool {\n\t\tif strings.HasPrefix(line, \"nofile\") {\n\t\t\tfields := strings.Fields(line)\n\t\t\tif len(fields) == 3 {\n\t\t\t\tself.SoftLimit, _ = strconv.ParseUint(fields[1], 10, 64)\n\t\t\t\tself.HardLimit, _ = strconv.ParseUint(fields[2], 10, 64)\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// linprocfs only provides this information for this process (self).\n\tfds, err := ioutil.ReadDir(procFileName(pid, \"fd\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\tself.Open = uint64(len(fds))\n\n\treturn nil\n}\n\nfunc (self *HugeTLBPages) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc parseCpuStat(self *Cpu, line string) error {\n\tfields := strings.Fields(line)\n\n\tself.User, _ = strtoull(fields[1])\n\tself.Nice, _ = strtoull(fields[2])\n\tself.Sys, _ = strtoull(fields[3])\n\tself.Idle, _ = strtoull(fields[4])\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_interface.go",
    "content": "package gosigar\n\nimport (\n\t\"time\"\n)\n\ntype ErrNotImplemented struct {\n\tOS string\n}\n\nfunc (e ErrNotImplemented) Error() string {\n\treturn \"not implemented on \" + e.OS\n}\n\nfunc IsNotImplemented(err error) bool {\n\tswitch err.(type) {\n\tcase ErrNotImplemented, *ErrNotImplemented:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\ntype Sigar interface {\n\tCollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{})\n\tGetLoadAverage() (LoadAverage, error)\n\tGetMem() (Mem, error)\n\tGetSwap() (Swap, error)\n\tGetHugeTLBPages(HugeTLBPages, error)\n\tGetFileSystemUsage(string) (FileSystemUsage, error)\n\tGetFDUsage() (FDUsage, error)\n\tGetRusage(who int) (Rusage, error)\n}\n\ntype Cpu struct {\n\tUser    uint64\n\tNice    uint64\n\tSys     uint64\n\tIdle    uint64\n\tWait    uint64\n\tIrq     uint64\n\tSoftIrq uint64\n\tStolen  uint64\n}\n\nfunc (cpu *Cpu) Total() uint64 {\n\treturn cpu.User + cpu.Nice + cpu.Sys + cpu.Idle +\n\t\tcpu.Wait + cpu.Irq + cpu.SoftIrq + cpu.Stolen\n}\n\nfunc (cpu Cpu) Delta(other Cpu) Cpu {\n\treturn Cpu{\n\t\tUser:    cpu.User - other.User,\n\t\tNice:    cpu.Nice - other.Nice,\n\t\tSys:     cpu.Sys - other.Sys,\n\t\tIdle:    cpu.Idle - other.Idle,\n\t\tWait:    cpu.Wait - other.Wait,\n\t\tIrq:     cpu.Irq - other.Irq,\n\t\tSoftIrq: cpu.SoftIrq - other.SoftIrq,\n\t\tStolen:  cpu.Stolen - other.Stolen,\n\t}\n}\n\ntype LoadAverage struct {\n\tOne, Five, Fifteen float64\n}\n\ntype Uptime struct {\n\tLength float64\n}\n\ntype Mem struct {\n\tTotal      uint64\n\tUsed       uint64\n\tFree       uint64\n\tActualFree uint64\n\tActualUsed uint64\n}\n\ntype Swap struct {\n\tTotal uint64\n\tUsed  uint64\n\tFree  uint64\n}\n\ntype HugeTLBPages struct {\n\tTotal              uint64\n\tFree               uint64\n\tReserved           uint64\n\tSurplus            uint64\n\tDefaultSize        uint64\n\tTotalAllocatedSize uint64\n}\n\ntype CpuList struct {\n\tList []Cpu\n}\n\ntype FDUsage struct {\n\tOpen   uint64\n\tUnused uint64\n\tMax    uint64\n}\n\ntype FileSystem struct {\n\tDirName     string\n\tDevName     string\n\tTypeName    string\n\tSysTypeName string\n\tOptions     string\n\tFlags       uint32\n}\n\ntype FileSystemList struct {\n\tList []FileSystem\n}\n\ntype FileSystemUsage struct {\n\tTotal     uint64\n\tUsed      uint64\n\tFree      uint64\n\tAvail     uint64\n\tFiles     uint64\n\tFreeFiles uint64\n}\n\ntype ProcList struct {\n\tList []int\n}\n\ntype RunState byte\n\nconst (\n\tRunStateSleep   = 'S'\n\tRunStateRun     = 'R'\n\tRunStateStop    = 'T'\n\tRunStateZombie  = 'Z'\n\tRunStateIdle    = 'D'\n\tRunStateUnknown = '?'\n)\n\ntype ProcState struct {\n\tName      string\n\tUsername  string\n\tState     RunState\n\tPpid      int\n\tPgid      int\n\tTty       int\n\tPriority  int\n\tNice      int\n\tProcessor int\n}\n\ntype ProcMem struct {\n\tSize        uint64\n\tResident    uint64\n\tShare       uint64\n\tMinorFaults uint64\n\tMajorFaults uint64\n\tPageFaults  uint64\n}\n\ntype ProcTime struct {\n\tStartTime uint64\n\tUser      uint64\n\tSys       uint64\n\tTotal     uint64\n}\n\ntype ProcArgs struct {\n\tList []string\n}\n\ntype ProcEnv struct {\n\tVars map[string]string\n}\n\ntype ProcExe struct {\n\tName string\n\tCwd  string\n\tRoot string\n}\n\ntype ProcFDUsage struct {\n\tOpen      uint64\n\tSoftLimit uint64\n\tHardLimit uint64\n}\n\ntype Rusage struct {\n\tUtime    time.Duration\n\tStime    time.Duration\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_linux.go",
    "content": "// Copyright (c) 2012 VMware, Inc.\n\npackage gosigar\n\nimport (\n\t\"io/ioutil\"\n\t\"strconv\"\n\t\"strings\"\n\t\"syscall\"\n)\n\nfunc init() {\n\tsystem.ticks = 100 // C.sysconf(C._SC_CLK_TCK)\n\n\tProcd = \"/proc\"\n\n\tgetLinuxBootTime()\n}\n\nfunc getMountTableFileName() string {\n\treturn \"/etc/mtab\"\n}\n\nfunc (self *Uptime) Get() error {\n\tsysinfo := syscall.Sysinfo_t{}\n\n\tif err := syscall.Sysinfo(&sysinfo); err != nil {\n\t\treturn err\n\t}\n\n\tself.Length = float64(sysinfo.Uptime)\n\n\treturn nil\n}\n\nfunc (self *FDUsage) Get() error {\n\treturn readFile(Procd+\"/sys/fs/file-nr\", func(line string) bool {\n\t\tfields := strings.Fields(line)\n\t\tif len(fields) == 3 {\n\t\t\tself.Open, _ = strconv.ParseUint(fields[0], 10, 64)\n\t\t\tself.Unused, _ = strconv.ParseUint(fields[1], 10, 64)\n\t\t\tself.Max, _ = strconv.ParseUint(fields[2], 10, 64)\n\t\t}\n\t\treturn false\n\t})\n}\n\nfunc (self *HugeTLBPages) Get() error {\n\ttable, err := parseMeminfo()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tself.Total, _ = table[\"HugePages_Total\"]\n\tself.Free, _ = table[\"HugePages_Free\"]\n\tself.Reserved, _ = table[\"HugePages_Rsvd\"]\n\tself.Surplus, _ = table[\"HugePages_Surp\"]\n\tself.DefaultSize, _ = table[\"Hugepagesize\"]\n\n\tif totalSize, found := table[\"Hugetlb\"]; found {\n\t\tself.TotalAllocatedSize = totalSize\n\t} else {\n\t\t// If Hugetlb is not present, or huge pages of different sizes\n\t\t// are used, this figure can be unaccurate.\n\t\t// TODO (jsoriano): Extract information from /sys/kernel/mm/hugepages too\n\t\tself.TotalAllocatedSize = (self.Total - self.Free + self.Reserved) * self.DefaultSize\n\t}\n\n\treturn nil\n}\n\nfunc (self *ProcFDUsage) Get(pid int) error {\n\terr := readFile(procFileName(pid, \"limits\"), func(line string) bool {\n\t\tif strings.HasPrefix(line, \"Max open files\") {\n\t\t\tfields := strings.Fields(line)\n\t\t\tif len(fields) == 6 {\n\t\t\t\tself.SoftLimit, _ = strconv.ParseUint(fields[3], 10, 64)\n\t\t\t\tself.HardLimit, _ = strconv.ParseUint(fields[4], 10, 64)\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tfds, err := ioutil.ReadDir(procFileName(pid, \"fd\"))\n\tif err != nil {\n\t\treturn err\n\t}\n\tself.Open = uint64(len(fds))\n\treturn nil\n}\n\nfunc parseCpuStat(self *Cpu, line string) error {\n\tfields := strings.Fields(line)\n\n\tself.User, _ = strtoull(fields[1])\n\tself.Nice, _ = strtoull(fields[2])\n\tself.Sys, _ = strtoull(fields[3])\n\tself.Idle, _ = strtoull(fields[4])\n\tself.Wait, _ = strtoull(fields[5])\n\tself.Irq, _ = strtoull(fields[6])\n\tself.SoftIrq, _ = strtoull(fields[7])\n\tself.Stolen, _ = strtoull(fields[8])\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_linux_common.go",
    "content": "// Copyright (c) 2012 VMware, Inc.\n\n// +build freebsd linux\n\npackage gosigar\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"strings\"\n\t\"syscall\"\n)\n\nvar system struct {\n\tticks uint64\n\tbtime uint64\n}\n\nvar Procd string\n\nfunc getLinuxBootTime() {\n\t// grab system boot time\n\treadFile(Procd+\"/stat\", func(line string) bool {\n\t\tif strings.HasPrefix(line, \"btime\") {\n\t\t\tsystem.btime, _ = strtoull(line[6:])\n\t\t\treturn false // stop reading\n\t\t}\n\t\treturn true\n\t})\n}\n\nfunc (self *LoadAverage) Get() error {\n\tline, err := ioutil.ReadFile(Procd + \"/loadavg\")\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\tfields := strings.Fields(string(line))\n\n\tself.One, _ = strconv.ParseFloat(fields[0], 64)\n\tself.Five, _ = strconv.ParseFloat(fields[1], 64)\n\tself.Fifteen, _ = strconv.ParseFloat(fields[2], 64)\n\n\treturn nil\n}\n\nfunc (self *Mem) Get() error {\n\n\ttable, err := parseMeminfo()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tself.Total, _ = table[\"MemTotal\"]\n\tself.Free, _ = table[\"MemFree\"]\n\tbuffers, _ := table[\"Buffers\"]\n\tcached, _ := table[\"Cached\"]\n\n\tif available, ok := table[\"MemAvailable\"]; ok {\n\t\t// MemAvailable is in /proc/meminfo (kernel 3.14+)\n\t\tself.ActualFree = available\n\t} else {\n\t\tself.ActualFree = self.Free + buffers + cached\n\t}\n\n\tself.Used = self.Total - self.Free\n\tself.ActualUsed = self.Total - self.ActualFree\n\n\treturn nil\n}\n\nfunc (self *Swap) Get() error {\n\n\ttable, err := parseMeminfo()\n\tif err != nil {\n\t\treturn err\n\t}\n\tself.Total, _ = table[\"SwapTotal\"]\n\tself.Free, _ = table[\"SwapFree\"]\n\n\tself.Used = self.Total - self.Free\n\treturn nil\n}\n\nfunc (self *Cpu) Get() error {\n\treturn readFile(Procd+\"/stat\", func(line string) bool {\n\t\tif len(line) > 4 && line[0:4] == \"cpu \" {\n\t\t\tparseCpuStat(self, line)\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\n\t})\n}\n\nfunc (self *CpuList) Get() error {\n\tcapacity := len(self.List)\n\tif capacity == 0 {\n\t\tcapacity = 4\n\t}\n\tlist := make([]Cpu, 0, capacity)\n\n\terr := readFile(Procd+\"/stat\", func(line string) bool {\n\t\tif len(line) > 3 && line[0:3] == \"cpu\" && line[3] != ' ' {\n\t\t\tcpu := Cpu{}\n\t\t\tparseCpuStat(&cpu, line)\n\t\t\tlist = append(list, cpu)\n\t\t}\n\t\treturn true\n\t})\n\n\tself.List = list\n\n\treturn err\n}\n\nfunc (self *FileSystemList) Get() error {\n\tcapacity := len(self.List)\n\tif capacity == 0 {\n\t\tcapacity = 10\n\t}\n\tfslist := make([]FileSystem, 0, capacity)\n\n\terr := readFile(getMountTableFileName(), func(line string) bool {\n\t\tfields := strings.Fields(line)\n\n\t\tfs := FileSystem{}\n\t\tfs.DevName = fields[0]\n\t\tfs.DirName = fields[1]\n\t\tfs.SysTypeName = fields[2]\n\t\tfs.Options = fields[3]\n\n\t\tfslist = append(fslist, fs)\n\n\t\treturn true\n\t})\n\n\tself.List = fslist\n\n\treturn err\n}\n\nfunc (self *ProcList) Get() error {\n\tdir, err := os.Open(Procd)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer dir.Close()\n\n\tconst readAllDirnames = -1 // see os.File.Readdirnames doc\n\n\tnames, err := dir.Readdirnames(readAllDirnames)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcapacity := len(names)\n\tlist := make([]int, 0, capacity)\n\n\tfor _, name := range names {\n\t\tif name[0] < '0' || name[0] > '9' {\n\t\t\tcontinue\n\t\t}\n\t\tpid, err := strconv.Atoi(name)\n\t\tif err == nil {\n\t\t\tlist = append(list, pid)\n\t\t}\n\t}\n\n\tself.List = list\n\n\treturn nil\n}\n\nfunc (self *ProcState) Get(pid int) error {\n\tdata, err := readProcFile(pid, \"stat\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Extract the comm value with is surrounded by parentheses.\n\tlIdx := bytes.Index(data, []byte(\"(\"))\n\trIdx := bytes.LastIndex(data, []byte(\")\"))\n\tif lIdx < 0 || rIdx < 0 || lIdx >= rIdx || rIdx+2 >= len(data) {\n\t\treturn fmt.Errorf(\"failed to extract comm for pid %d from '%v'\", pid, string(data))\n\t}\n\tself.Name = string(data[lIdx+1 : rIdx])\n\n\t// Extract the rest of the fields that we are interested in.\n\tfields := bytes.Fields(data[rIdx+2:])\n\tif len(fields) <= 36 {\n\t\treturn fmt.Errorf(\"expected more stat fields for pid %d from '%v'\", pid, string(data))\n\t}\n\n\tinterests := bytes.Join([][]byte{\n\t\tfields[0],  // state\n\t\tfields[1],  // ppid\n\t\tfields[2],  // pgrp\n\t\tfields[4],  // tty_nr\n\t\tfields[15], // priority\n\t\tfields[16], // nice\n\t\tfields[36], // processor (last processor executed on)\n\t}, []byte(\" \"))\n\n\tvar state string\n\t_, err = fmt.Fscan(bytes.NewBuffer(interests),\n\t\t&state,\n\t\t&self.Ppid,\n\t\t&self.Pgid,\n\t\t&self.Tty,\n\t\t&self.Priority,\n\t\t&self.Nice,\n\t\t&self.Processor,\n\t)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to parse stat fields for pid %d from '%v': %v\", pid, string(data), err)\n\t}\n\tself.State = RunState(state[0])\n\n\t// Read /proc/[pid]/status to get the uid, then lookup uid to get username.\n\tstatus, err := getProcStatus(pid)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read process status for pid %d: %v\", pid, err)\n\t}\n\tuids, err := getUIDs(status)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to read process status for pid %d: %v\", pid, err)\n\t}\n\tuser, err := user.LookupId(uids[0])\n\tif err == nil {\n\t\tself.Username = user.Username\n\t} else {\n\t\tself.Username = uids[0]\n\t}\n\n\treturn nil\n}\n\nfunc (self *ProcMem) Get(pid int) error {\n\tcontents, err := readProcFile(pid, \"statm\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfields := strings.Fields(string(contents))\n\n\tsize, _ := strtoull(fields[0])\n\tself.Size = size << 12\n\n\trss, _ := strtoull(fields[1])\n\tself.Resident = rss << 12\n\n\tshare, _ := strtoull(fields[2])\n\tself.Share = share << 12\n\n\tcontents, err = readProcFile(pid, \"stat\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfields = strings.Fields(string(contents))\n\n\tself.MinorFaults, _ = strtoull(fields[10])\n\tself.MajorFaults, _ = strtoull(fields[12])\n\tself.PageFaults = self.MinorFaults + self.MajorFaults\n\n\treturn nil\n}\n\nfunc (self *ProcTime) Get(pid int) error {\n\tcontents, err := readProcFile(pid, \"stat\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfields := strings.Fields(string(contents))\n\n\tuser, _ := strtoull(fields[13])\n\tsys, _ := strtoull(fields[14])\n\t// convert to millis\n\tself.User = user * (1000 / system.ticks)\n\tself.Sys = sys * (1000 / system.ticks)\n\tself.Total = self.User + self.Sys\n\n\t// convert to millis\n\tself.StartTime, _ = strtoull(fields[21])\n\tself.StartTime /= system.ticks\n\tself.StartTime += system.btime\n\tself.StartTime *= 1000\n\n\treturn nil\n}\n\nfunc (self *ProcArgs) Get(pid int) error {\n\tcontents, err := readProcFile(pid, \"cmdline\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbbuf := bytes.NewBuffer(contents)\n\n\tvar args []string\n\n\tfor {\n\t\targ, err := bbuf.ReadBytes(0)\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\targs = append(args, string(chop(arg)))\n\t}\n\n\tself.List = args\n\n\treturn nil\n}\n\nfunc (self *ProcEnv) Get(pid int) error {\n\tcontents, err := readProcFile(pid, \"environ\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif self.Vars == nil {\n\t\tself.Vars = map[string]string{}\n\t}\n\n\tpairs := bytes.Split(contents, []byte{0})\n\tfor _, kv := range pairs {\n\t\tparts := bytes.SplitN(kv, []byte{'='}, 2)\n\t\tif len(parts) != 2 {\n\t\t\tcontinue\n\t\t}\n\n\t\tkey := string(bytes.TrimSpace(parts[0]))\n\t\tif key == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tself.Vars[key] = string(bytes.TrimSpace(parts[1]))\n\t}\n\n\treturn nil\n}\n\nfunc (self *ProcExe) Get(pid int) error {\n\tfields := map[string]*string{\n\t\t\"exe\":  &self.Name,\n\t\t\"cwd\":  &self.Cwd,\n\t\t\"root\": &self.Root,\n\t}\n\n\tfor name, field := range fields {\n\t\tval, err := os.Readlink(procFileName(pid, name))\n\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t*field = val\n\t}\n\n\treturn nil\n}\n\nfunc parseMeminfo() (map[string]uint64, error) {\n\ttable := map[string]uint64{}\n\n\terr := readFile(Procd+\"/meminfo\", func(line string) bool {\n\t\tfields := strings.Split(line, \":\")\n\n\t\tif len(fields) != 2 {\n\t\t\treturn true // skip on errors\n\t\t}\n\n\t\tvalueUnit := strings.Fields(fields[1])\n\t\tvalue, err := strtoull(valueUnit[0])\n\t\tif err != nil {\n\t\t\treturn true // skip on errors\n\t\t}\n\n\t\tif len(valueUnit) > 1 && valueUnit[1] == \"kB\" {\n\t\t\tvalue *= 1024\n\t\t}\n\t\ttable[fields[0]] = value\n\n\t\treturn true\n\t})\n\treturn table, err\n}\n\nfunc readFile(file string, handler func(string) bool) error {\n\tcontents, err := ioutil.ReadFile(file)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treader := bufio.NewReader(bytes.NewBuffer(contents))\n\n\tfor {\n\t\tline, _, err := reader.ReadLine()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif !handler(string(line)) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc strtoull(val string) (uint64, error) {\n\treturn strconv.ParseUint(val, 10, 64)\n}\n\nfunc procFileName(pid int, name string) string {\n\treturn Procd + \"/\" + strconv.Itoa(pid) + \"/\" + name\n}\n\nfunc readProcFile(pid int, name string) (content []byte, err error) {\n\tpath := procFileName(pid, name)\n\n\t// Panics have been reported when reading proc files, let's recover and\n\t// report the path if this happens\n\t// See https://github.com/elastic/beats/issues/6692\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tcontent = nil\n\t\t\terr = fmt.Errorf(\"recovered panic when reading proc file '%s': %v\", path, r)\n\t\t}\n\t}()\n\tcontents, err := ioutil.ReadFile(path)\n\n\tif err != nil {\n\t\tif perr, ok := err.(*os.PathError); ok {\n\t\t\tif perr.Err == syscall.ENOENT {\n\t\t\t\treturn nil, syscall.ESRCH\n\t\t\t}\n\t\t}\n\t}\n\n\treturn contents, err\n}\n\n// getProcStatus reads /proc/[pid]/status which contains process status\n// information in human readable form.\nfunc getProcStatus(pid int) (map[string]string, error) {\n\tstatus := make(map[string]string, 42)\n\tpath := filepath.Join(Procd, strconv.Itoa(pid), \"status\")\n\terr := readFile(path, func(line string) bool {\n\t\tfields := strings.SplitN(line, \":\", 2)\n\t\tif len(fields) == 2 {\n\t\t\tstatus[fields[0]] = strings.TrimSpace(fields[1])\n\t\t}\n\n\t\treturn true\n\t})\n\treturn status, err\n}\n\n// getUIDs reads the \"Uid\" value from status and splits it into four values --\n// real, effective, saved set, and  file system UIDs.\nfunc getUIDs(status map[string]string) ([]string, error) {\n\tuidLine, ok := status[\"Uid\"]\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"Uid not found in proc status\")\n\t}\n\n\tuidStrs := strings.Fields(uidLine)\n\tif len(uidStrs) != 4 {\n\t\treturn nil, fmt.Errorf(\"Uid line ('%s') did not contain four values\", uidLine)\n\t}\n\n\treturn uidStrs, nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_openbsd.go",
    "content": "// Copyright (c) 2016 Jasper Lievisse Adriaanse <j@jasper.la>.\n\n// +build openbsd\n\npackage gosigar\n\n/*\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/sysctl.h>\n#include <sys/mount.h>\n#include <sys/sched.h>\n#include <sys/swap.h>\n#include <stdlib.h>\n#include <unistd.h>\n*/\nimport \"C\"\n\n//import \"github.com/davecgh/go-spew/spew\"\n\nimport (\n\t\"runtime\"\n\t\"syscall\"\n\t\"time\"\n\t\"unsafe\"\n)\n\ntype Uvmexp struct {\n\tpagesize           uint32\n\tpagemask           uint32\n\tpageshift          uint32\n\tnpages             uint32\n\tfree               uint32\n\tactive             uint32\n\tinactive           uint32\n\tpaging             uint32\n\twired              uint32\n\tzeropages          uint32\n\treserve_pagedaemon uint32\n\treserve_kernel     uint32\n\tanonpages          uint32\n\tvnodepages         uint32\n\tvtextpages         uint32\n\tfreemin            uint32\n\tfreetarg           uint32\n\tinactarg           uint32\n\twiredmax           uint32\n\tanonmin            uint32\n\tvtextmin           uint32\n\tvnodemin           uint32\n\tanonminpct         uint32\n\tvtextmi            uint32\n\tnpct               uint32\n\tvnodeminpct        uint32\n\tnswapdev           uint32\n\tswpages            uint32\n\tswpginuse          uint32\n\tswpgonly           uint32\n\tnswget             uint32\n\tnanon              uint32\n\tnanonneeded        uint32\n\tnfreeanon          uint32\n\tfaults             uint32\n\ttraps              uint32\n\tintrs              uint32\n\tswtch              uint32\n\tsofts              uint32\n\tsyscalls           uint32\n\tpageins            uint32\n\tobsolete_swapins   uint32\n\tobsolete_swapouts  uint32\n\tpgswapin           uint32\n\tpgswapout          uint32\n\tforks              uint32\n\tforks_ppwait       uint32\n\tforks_sharevm      uint32\n\tpga_zerohit        uint32\n\tpga_zeromiss       uint32\n\tzeroaborts         uint32\n\tfltnoram           uint32\n\tfltnoanon          uint32\n\tfltpgwait          uint32\n\tfltpgrele          uint32\n\tfltrelck           uint32\n\tfltrelckok         uint32\n\tfltanget           uint32\n\tfltanretry         uint32\n\tfltamcopy          uint32\n\tfltnamap           uint32\n\tfltnomap           uint32\n\tfltlget            uint32\n\tfltget             uint32\n\tflt_anon           uint32\n\tflt_acow           uint32\n\tflt_obj            uint32\n\tflt_prcopy         uint32\n\tflt_przero         uint32\n\tpdwoke             uint32\n\tpdrevs             uint32\n\tpdswout            uint32\n\tpdfreed            uint32\n\tpdscans            uint32\n\tpdanscan           uint32\n\tpdobscan           uint32\n\tpdreact            uint32\n\tpdbusy             uint32\n\tpdpageouts         uint32\n\tpdpending          uint32\n\tpddeact            uint32\n\tpdreanon           uint32\n\tpdrevnode          uint32\n\tpdrevtext          uint32\n\tfpswtch            uint32\n\tkmapent            uint32\n}\n\ntype Bcachestats struct {\n\tnumbufs        uint64\n\tnumbufpages    uint64\n\tnumdirtypages  uint64\n\tnumcleanpages  uint64\n\tpendingwrites  uint64\n\tpendingreads   uint64\n\tnumwrites      uint64\n\tnumreads       uint64\n\tcachehits      uint64\n\tbusymapped     uint64\n\tdmapages       uint64\n\thighpages      uint64\n\tdelwribufs     uint64\n\tkvaslots       uint64\n\tkvaslots_avail uint64\n}\n\ntype Swapent struct {\n\tse_dev      C.dev_t\n\tse_flags    int32\n\tse_nblks    int32\n\tse_inuse    int32\n\tse_priority int32\n\tsw_path     []byte\n}\n\nfunc (self *FileSystemList) Get() error {\n\tnum, err := syscall.Getfsstat(nil, C.MNT_NOWAIT)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbuf := make([]syscall.Statfs_t, num)\n\n\t_, err = syscall.Getfsstat(buf, C.MNT_NOWAIT)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfslist := make([]FileSystem, 0, num)\n\n\tfor i := 0; i < num; i++ {\n\t\tfs := FileSystem{}\n\n\t\tfs.DirName = bytePtrToString(&buf[i].F_mntonname[0])\n\t\tfs.DevName = bytePtrToString(&buf[i].F_mntfromname[0])\n\t\tfs.SysTypeName = bytePtrToString(&buf[i].F_fstypename[0])\n\n\t\tfslist = append(fslist, fs)\n\t}\n\n\tself.List = fslist\n\n\treturn err\n}\n\nfunc (self *FileSystemUsage) Get(path string) error {\n\tstat := syscall.Statfs_t{}\n\terr := syscall.Statfs(path, &stat)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tself.Total = uint64(stat.F_blocks) * uint64(stat.F_bsize)\n\tself.Free = uint64(stat.F_bfree) * uint64(stat.F_bsize)\n\tself.Avail = uint64(stat.F_bavail) * uint64(stat.F_bsize)\n\tself.Used = self.Total - self.Free\n\tself.Files = stat.F_files\n\tself.FreeFiles = stat.F_ffree\n\n\treturn nil\n}\n\nfunc (self *FDUsage) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *LoadAverage) Get() error {\n\tavg := []C.double{0, 0, 0}\n\n\tC.getloadavg(&avg[0], C.int(len(avg)))\n\n\tself.One = float64(avg[0])\n\tself.Five = float64(avg[1])\n\tself.Fifteen = float64(avg[2])\n\n\treturn nil\n}\n\nfunc (self *Uptime) Get() error {\n\ttv := syscall.Timeval{}\n\tmib := [2]int32{C.CTL_KERN, C.KERN_BOOTTIME}\n\n\tn := uintptr(0)\n\t// First we determine how much memory we'll need to pass later on (via `n`)\n\t_, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)\n\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\t// Now perform the actual sysctl(3) call, storing the result in tv\n\t_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&tv)), uintptr(unsafe.Pointer(&n)), 0, 0)\n\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\tself.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds()\n\n\treturn nil\n}\n\nfunc (self *Mem) Get() error {\n\tn := uintptr(0)\n\n\tvar uvmexp Uvmexp\n\tmib := [2]int32{C.CTL_VM, C.VM_UVMEXP}\n\tn = uintptr(0)\n\t// First we determine how much memory we'll need to pass later on (via `n`)\n\t_, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\t_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&uvmexp)), uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\tvar bcachestats Bcachestats\n\tmib3 := [3]int32{C.CTL_VFS, C.VFS_GENERIC, C.VFS_BCACHESTAT}\n\tn = uintptr(0)\n\t_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, 0, uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\t_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, uintptr(unsafe.Pointer(&bcachestats)), uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\tself.Total = uint64(uvmexp.npages) << uvmexp.pageshift\n\tself.Used = uint64(uvmexp.npages-uvmexp.free) << uvmexp.pageshift\n\tself.Free = uint64(uvmexp.free) << uvmexp.pageshift\n\n\tself.ActualFree = self.Free + (uint64(bcachestats.numbufpages) << uvmexp.pageshift)\n\tself.ActualUsed = self.Used - (uint64(bcachestats.numbufpages) << uvmexp.pageshift)\n\n\treturn nil\n}\n\nfunc (self *Swap) Get() error {\n\tnswap := C.swapctl(C.SWAP_NSWAP, unsafe.Pointer(uintptr(0)), 0)\n\n\t// If there are no swap devices, nothing to do here.\n\tif nswap == 0 {\n\t\treturn nil\n\t}\n\n\tswdev := make([]Swapent, nswap)\n\n\trnswap := C.swapctl(C.SWAP_STATS, unsafe.Pointer(&swdev[0]), nswap)\n\tif rnswap == 0 {\n\t\treturn nil\n\t}\n\n\tfor i := 0; i < int(nswap); i++ {\n\t\tif swdev[i].se_flags&C.SWF_ENABLE == 2 {\n\t\t\tself.Used = self.Used + uint64(swdev[i].se_inuse/(1024/C.DEV_BSIZE))\n\t\t\tself.Total = self.Total + uint64(swdev[i].se_nblks/(1024/C.DEV_BSIZE))\n\t\t}\n\t}\n\n\tself.Free = self.Total - self.Used\n\n\treturn nil\n}\n\nfunc (self *HugeTLBPages) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *Cpu) Get() error {\n\tload := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE}\n\n\tmib := [2]int32{C.CTL_KERN, C.KERN_CPTIME}\n\tn := uintptr(0)\n\t// First we determine how much memory we'll need to pass later on (via `n`)\n\t_, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\t_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&load)), uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\tself.User = uint64(load[0])\n\tself.Nice = uint64(load[1])\n\tself.Sys = uint64(load[2])\n\tself.Irq = uint64(load[3])\n\tself.Idle = uint64(load[4])\n\n\treturn nil\n}\n\nfunc (self *CpuList) Get() error {\n\tmib := [2]int32{C.CTL_HW, C.HW_NCPU}\n\tvar ncpu int\n\n\tn := uintptr(0)\n\t// First we determine how much memory we'll need to pass later on (via `n`)\n\t_, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0)\n\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\t// Now perform the actual sysctl(3) call, storing the result in ncpu\n\t_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&ncpu)), uintptr(unsafe.Pointer(&n)), 0, 0)\n\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\tload := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE}\n\n\tself.List = make([]Cpu, ncpu)\n\tfor curcpu := range self.List {\n\t\tsysctlCptime(ncpu, curcpu, &load)\n\t\tfillCpu(&self.List[curcpu], load)\n\t}\n\n\treturn nil\n}\n\nfunc (self *ProcList) Get() error {\n\treturn nil\n}\n\nfunc (self *ProcArgs) Get(pid int) error {\n\treturn nil\n}\n\nfunc (self *ProcEnv) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *ProcState) Get(pid int) error {\n\treturn nil\n}\n\nfunc (self *ProcMem) Get(pid int) error {\n\treturn nil\n}\n\nfunc (self *ProcTime) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *ProcExe) Get(pid int) error {\n\treturn nil\n}\n\nfunc (self *ProcFDUsage) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *Rusage) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc fillCpu(cpu *Cpu, load [C.CPUSTATES]C.long) {\n\tcpu.User = uint64(load[0])\n\tcpu.Nice = uint64(load[1])\n\tcpu.Sys = uint64(load[2])\n\tcpu.Irq = uint64(load[3])\n\tcpu.Idle = uint64(load[4])\n}\n\nfunc sysctlCptime(ncpu int, curcpu int, load *[C.CPUSTATES]C.long) error {\n\tvar mib []int32\n\n\t// Use the correct mib based on the number of CPUs and fill out the\n\t// current CPU number in case of SMP. (0 indexed cf. self.List)\n\tif ncpu == 0 {\n\t\tmib = []int32{C.CTL_KERN, C.KERN_CPTIME}\n\t} else {\n\t\tmib = []int32{C.CTL_KERN, C.KERN_CPTIME2, int32(curcpu)}\n\t}\n\n\tlen := len(mib)\n\n\tn := uintptr(0)\n\t// First we determine how much memory we'll need to pass later on (via `n`)\n\t_, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), 0, uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\t_, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), uintptr(unsafe.Pointer(load)), uintptr(unsafe.Pointer(&n)), 0, 0)\n\tif errno != 0 || n == 0 {\n\t\treturn nil\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_stub.go",
    "content": "// +build !darwin,!freebsd,!linux,!openbsd,!windows\n\npackage gosigar\n\nimport (\n\t\"runtime\"\n)\n\nfunc (c *Cpu) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (l *LoadAverage) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (m *Mem) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (s *Swap) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (s *HugeTLBPages) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (f *FDUsage) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcTime) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *FileSystemUsage) Get(path string) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *CpuList) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcState) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcExe) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcMem) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcFDUsage) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcEnv) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcList) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (p *ProcArgs) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *Rusage) Get(int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_unix.go",
    "content": "// Copyright (c) 2012 VMware, Inc.\n\n// +build darwin freebsd linux\n\npackage gosigar\n\nimport (\n\t\"syscall\"\n\t\"time\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\nfunc (self *FileSystemUsage) Get(path string) error {\n\tstat := syscall.Statfs_t{}\n\terr := syscall.Statfs(path, &stat)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tself.Total = uint64(stat.Blocks) * uint64(stat.Bsize)\n\tself.Free = uint64(stat.Bfree) * uint64(stat.Bsize)\n\tself.Avail = uint64(stat.Bavail) * uint64(stat.Bsize)\n\tself.Used = self.Total - self.Free\n\tself.Files = stat.Files\n\tself.FreeFiles = uint64(stat.Ffree)\n\n\treturn nil\n}\n\nfunc (r *Rusage) Get(who int) error {\n\tru, err := getResourceUsage(who)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tuTime := convertRtimeToDur(ru.Utime)\n\tsTime := convertRtimeToDur(ru.Stime)\n\n\tr.Utime = uTime\n\tr.Stime = sTime\n\tr.Maxrss = int64(ru.Maxrss)\n\tr.Ixrss = int64(ru.Ixrss)\n\tr.Idrss = int64(ru.Idrss)\n\tr.Isrss = int64(ru.Isrss)\n\tr.Minflt = int64(ru.Minflt)\n\tr.Majflt = int64(ru.Majflt)\n\tr.Nswap = int64(ru.Nswap)\n\tr.Inblock = int64(ru.Inblock)\n\tr.Oublock = int64(ru.Oublock)\n\tr.Msgsnd = int64(ru.Msgsnd)\n\tr.Msgrcv = int64(ru.Msgrcv)\n\tr.Nsignals = int64(ru.Nsignals)\n\tr.Nvcsw = int64(ru.Nvcsw)\n\tr.Nivcsw = int64(ru.Nivcsw)\n\n\treturn nil\n}\n\nfunc getResourceUsage(who int) (unix.Rusage, error) {\n\tr := unix.Rusage{}\n\terr := unix.Getrusage(who, &r)\n\n\treturn r, err\n}\n\nfunc convertRtimeToDur(t unix.Timeval) time.Duration {\n\treturn time.Duration(t.Nano())\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_util.go",
    "content": "// Copyright (c) 2012 VMware, Inc.\n\npackage gosigar\n\nimport (\n\t\"unsafe\"\n)\n\nfunc bytePtrToString(ptr *int8) string {\n\tbytes := (*[10000]byte)(unsafe.Pointer(ptr))\n\n\tn := 0\n\tfor bytes[n] != 0 {\n\t\tn++\n\t}\n\n\treturn string(bytes[0:n])\n}\n\nfunc chop(buf []byte) []byte {\n\treturn buf[0 : len(buf)-1]\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sigar_windows.go",
    "content": "// Copyright (c) 2012 VMware, Inc.\n\npackage gosigar\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/StackExchange/wmi\"\n\t\"github.com/elastic/gosigar/sys/windows\"\n\t\"github.com/pkg/errors\"\n)\n\n// Win32_Process represents a process on the Windows operating system. If\n// additional fields are added here (that match the Windows struct) they will\n// automatically be populated when calling getWin32Process.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx\ntype Win32_Process struct {\n\tCommandLine string\n}\n\n// Win32_OperatingSystem WMI class represents a Windows-based operating system\n// installed on a computer.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx\ntype Win32_OperatingSystem struct {\n\tLastBootUpTime time.Time\n}\n\nvar (\n\t// version is Windows version of the host OS.\n\tversion = windows.GetWindowsVersion()\n\n\t// processQueryLimitedInfoAccess is set to PROCESS_QUERY_INFORMATION for Windows\n\t// 2003 and XP where PROCESS_QUERY_LIMITED_INFORMATION is unknown. For all newer\n\t// OS versions it is set to PROCESS_QUERY_LIMITED_INFORMATION.\n\tprocessQueryLimitedInfoAccess = windows.PROCESS_QUERY_LIMITED_INFORMATION\n\n\t// bootTime is the time when the OS was last booted. This value may be nil\n\t// on operating systems that do not support the WMI query used to obtain it.\n\tbootTime     *time.Time\n\tbootTimeLock sync.Mutex\n)\n\nfunc init() {\n\tif !version.IsWindowsVistaOrGreater() {\n\t\t// PROCESS_QUERY_LIMITED_INFORMATION cannot be used on 2003 or XP.\n\t\tprocessQueryLimitedInfoAccess = syscall.PROCESS_QUERY_INFORMATION\n\t}\n}\n\nfunc (self *LoadAverage) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *FDUsage) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *ProcEnv) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *ProcExe) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *ProcFDUsage) Get(pid int) error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *Uptime) Get() error {\n\t// Minimum supported OS is Windows Vista.\n\tif !version.IsWindowsVistaOrGreater() {\n\t\treturn ErrNotImplemented{runtime.GOOS}\n\t}\n\n\tbootTimeLock.Lock()\n\tdefer bootTimeLock.Unlock()\n\tif bootTime == nil {\n\t\tos, err := getWin32OperatingSystem()\n\t\tif err != nil {\n\t\t\treturn errors.Wrap(err, \"failed to get boot time using WMI\")\n\t\t}\n\t\tbootTime = &os.LastBootUpTime\n\t}\n\n\tself.Length = time.Since(*bootTime).Seconds()\n\treturn nil\n}\n\nfunc (self *Mem) Get() error {\n\tmemoryStatusEx, err := windows.GlobalMemoryStatusEx()\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"GlobalMemoryStatusEx failed\")\n\t}\n\n\tself.Total = memoryStatusEx.TotalPhys\n\tself.Free = memoryStatusEx.AvailPhys\n\tself.Used = self.Total - self.Free\n\tself.ActualFree = self.Free\n\tself.ActualUsed = self.Used\n\treturn nil\n}\n\nfunc (self *Swap) Get() error {\n\tmemoryStatusEx, err := windows.GlobalMemoryStatusEx()\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"GlobalMemoryStatusEx failed\")\n\t}\n\n\tself.Total = memoryStatusEx.TotalPageFile\n\tself.Free = memoryStatusEx.AvailPageFile\n\tself.Used = self.Total - self.Free\n\treturn nil\n}\n\nfunc (self *HugeTLBPages) Get() error {\n\treturn ErrNotImplemented{runtime.GOOS}\n}\n\nfunc (self *Cpu) Get() error {\n\tidle, kernel, user, err := windows.GetSystemTimes()\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"GetSystemTimes failed\")\n\t}\n\n\t// CPU times are reported in milliseconds by gosigar.\n\tself.Idle = uint64(idle / time.Millisecond)\n\tself.Sys = uint64(kernel / time.Millisecond)\n\tself.User = uint64(user / time.Millisecond)\n\treturn nil\n}\n\nfunc (self *CpuList) Get() error {\n\tcpus, err := windows.NtQuerySystemProcessorPerformanceInformation()\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"NtQuerySystemProcessorPerformanceInformation failed\")\n\t}\n\n\tself.List = make([]Cpu, 0, len(cpus))\n\tfor _, cpu := range cpus {\n\t\tself.List = append(self.List, Cpu{\n\t\t\tIdle: uint64(cpu.IdleTime / time.Millisecond),\n\t\t\tSys:  uint64(cpu.KernelTime / time.Millisecond),\n\t\t\tUser: uint64(cpu.UserTime / time.Millisecond),\n\t\t})\n\t}\n\treturn nil\n}\n\nfunc (self *FileSystemList) Get() error {\n\tdrives, err := windows.GetLogicalDriveStrings()\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"GetLogicalDriveStrings failed\")\n\t}\n\n\tfor _, drive := range drives {\n\t\tdt, err := windows.GetDriveType(drive)\n\t\tif err != nil {\n\t\t\treturn errors.Wrapf(err, \"GetDriveType failed\")\n\t\t}\n\n\t\tself.List = append(self.List, FileSystem{\n\t\t\tDirName:  drive,\n\t\t\tDevName:  drive,\n\t\t\tTypeName: dt.String(),\n\t\t})\n\t}\n\treturn nil\n}\n\n// Get retrieves a list of all process identifiers (PIDs) in the system.\nfunc (self *ProcList) Get() error {\n\tpids, err := windows.EnumProcesses()\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"EnumProcesses failed\")\n\t}\n\n\t// Convert uint32 PIDs to int.\n\tself.List = make([]int, 0, len(pids))\n\tfor _, pid := range pids {\n\t\tself.List = append(self.List, int(pid))\n\t}\n\treturn nil\n}\n\nfunc (self *ProcState) Get(pid int) error {\n\tvar errs []error\n\n\tvar err error\n\tself.Name, err = getProcName(pid)\n\tif err != nil {\n\t\terrs = append(errs, errors.Wrap(err, \"getProcName failed\"))\n\t}\n\n\tself.State, err = getProcStatus(pid)\n\tif err != nil {\n\t\terrs = append(errs, errors.Wrap(err, \"getProcStatus failed\"))\n\t}\n\n\tself.Ppid, err = getParentPid(pid)\n\tif err != nil {\n\t\terrs = append(errs, errors.Wrap(err, \"getParentPid failed\"))\n\t}\n\n\tself.Username, err = getProcCredName(pid)\n\tif err != nil {\n\t\terrs = append(errs, errors.Wrap(err, \"getProcCredName failed\"))\n\t}\n\n\tif len(errs) > 0 {\n\t\terrStrs := make([]string, 0, len(errs))\n\t\tfor _, e := range errs {\n\t\t\terrStrs = append(errStrs, e.Error())\n\t\t}\n\t\treturn errors.New(strings.Join(errStrs, \"; \"))\n\t}\n\treturn nil\n}\n\n// getProcName returns the process name associated with the PID.\nfunc getProcName(pid int) (string, error) {\n\thandle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))\n\tif err != nil {\n\t\treturn \"\", errors.Wrapf(err, \"OpenProcess failed for pid=%v\", pid)\n\t}\n\tdefer syscall.CloseHandle(handle)\n\n\tfilename, err := windows.GetProcessImageFileName(handle)\n\tif err != nil {\n\t\treturn \"\", errors.Wrapf(err, \"GetProcessImageFileName failed for pid=%v\", pid)\n\t}\n\n\treturn filepath.Base(filename), nil\n}\n\n// getProcStatus returns the status of a process.\nfunc getProcStatus(pid int) (RunState, error) {\n\thandle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))\n\tif err != nil {\n\t\treturn RunStateUnknown, errors.Wrapf(err, \"OpenProcess failed for pid=%v\", pid)\n\t}\n\tdefer syscall.CloseHandle(handle)\n\n\tvar exitCode uint32\n\terr = syscall.GetExitCodeProcess(handle, &exitCode)\n\tif err != nil {\n\t\treturn RunStateUnknown, errors.Wrapf(err, \"GetExitCodeProcess failed for pid=%v\")\n\t}\n\n\tif exitCode == 259 { //still active\n\t\treturn RunStateRun, nil\n\t}\n\treturn RunStateSleep, nil\n}\n\n// getParentPid returns the parent process ID of a process.\nfunc getParentPid(pid int) (int, error) {\n\thandle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))\n\tif err != nil {\n\t\treturn RunStateUnknown, errors.Wrapf(err, \"OpenProcess failed for pid=%v\", pid)\n\t}\n\tdefer syscall.CloseHandle(handle)\n\n\tprocInfo, err := windows.NtQueryProcessBasicInformation(handle)\n\tif err != nil {\n\t\treturn 0, errors.Wrapf(err, \"NtQueryProcessBasicInformation failed for pid=%v\", pid)\n\t}\n\n\treturn int(procInfo.InheritedFromUniqueProcessID), nil\n}\n\nfunc getProcCredName(pid int) (string, error) {\n\thandle, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid))\n\tif err != nil {\n\t\treturn \"\", errors.Wrapf(err, \"OpenProcess failed for pid=%v\", pid)\n\t}\n\tdefer syscall.CloseHandle(handle)\n\n\t// Find process token via win32.\n\tvar token syscall.Token\n\terr = syscall.OpenProcessToken(handle, syscall.TOKEN_QUERY, &token)\n\tif err != nil {\n\t\treturn \"\", errors.Wrapf(err, \"OpenProcessToken failed for pid=%v\", pid)\n\t}\n\n\t// Find the token user.\n\ttokenUser, err := token.GetTokenUser()\n\tif err != nil {\n\t\treturn \"\", errors.Wrapf(err, \"GetTokenInformation failed for pid=%v\", pid)\n\t}\n\n\t// Close token to prevent handle leaks.\n\terr = token.Close()\n\tif err != nil {\n\t\treturn \"\", errors.Wrapf(err, \"failed while closing process token handle for pid=%v\", pid)\n\t}\n\n\t// Look up domain account by SID.\n\taccount, domain, _, err := tokenUser.User.Sid.LookupAccount(\"\")\n\tif err != nil {\n\t\tsid, sidErr := tokenUser.User.Sid.String()\n\t\tif sidErr != nil {\n\t\t\treturn \"\", errors.Wrapf(err, \"failed while looking up account name for pid=%v\", pid)\n\t\t}\n\t\treturn \"\", errors.Wrapf(err, \"failed while looking up account name for SID=%v of pid=%v\", sid, pid)\n\t}\n\n\treturn fmt.Sprintf(`%s\\%s`, domain, account), nil\n}\n\nfunc (self *ProcMem) Get(pid int) error {\n\thandle, err := syscall.OpenProcess(processQueryLimitedInfoAccess|windows.PROCESS_VM_READ, false, uint32(pid))\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"OpenProcess failed for pid=%v\", pid)\n\t}\n\tdefer syscall.CloseHandle(handle)\n\n\tcounters, err := windows.GetProcessMemoryInfo(handle)\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"GetProcessMemoryInfo failed for pid=%v\", pid)\n\t}\n\n\tself.Resident = uint64(counters.WorkingSetSize)\n\tself.Size = uint64(counters.PrivateUsage)\n\treturn nil\n}\n\nfunc (self *ProcTime) Get(pid int) error {\n\tcpu, err := getProcTimes(pid)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Windows epoch times are expressed as time elapsed since midnight on\n\t// January 1, 1601 at Greenwich, England. This converts the Filetime to\n\t// unix epoch in milliseconds.\n\tself.StartTime = uint64(cpu.CreationTime.Nanoseconds() / 1e6)\n\n\t// Convert to millis.\n\tself.User = uint64(windows.FiletimeToDuration(&cpu.UserTime).Nanoseconds() / 1e6)\n\tself.Sys = uint64(windows.FiletimeToDuration(&cpu.KernelTime).Nanoseconds() / 1e6)\n\tself.Total = self.User + self.Sys\n\n\treturn nil\n}\n\nfunc getProcTimes(pid int) (*syscall.Rusage, error) {\n\thandle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid))\n\tif err != nil {\n\t\treturn nil, errors.Wrapf(err, \"OpenProcess failed for pid=%v\", pid)\n\t}\n\tdefer syscall.CloseHandle(handle)\n\n\tvar cpu syscall.Rusage\n\tif err := syscall.GetProcessTimes(handle, &cpu.CreationTime, &cpu.ExitTime, &cpu.KernelTime, &cpu.UserTime); err != nil {\n\t\treturn nil, errors.Wrapf(err, \"GetProcessTimes failed for pid=%v\", pid)\n\t}\n\n\treturn &cpu, nil\n}\n\nfunc (self *ProcArgs) Get(pid int) error {\n\t// The minimum supported client for Win32_Process is Windows Vista.\n\tif !version.IsWindowsVistaOrGreater() {\n\t\treturn ErrNotImplemented{runtime.GOOS}\n\t}\n\n\tprocess, err := getWin32Process(int32(pid))\n\tif err != nil {\n\t\treturn errors.Wrapf(err, \"ProcArgs failed for pid=%v\", pid)\n\t}\n\n\tself.List = []string{process.CommandLine}\n\treturn nil\n}\n\nfunc (self *FileSystemUsage) Get(path string) error {\n\tfreeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, err := windows.GetDiskFreeSpaceEx(path)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"GetDiskFreeSpaceEx failed\")\n\t}\n\n\tself.Total = totalNumberOfBytes\n\tself.Free = totalNumberOfFreeBytes\n\tself.Used = self.Total - self.Free\n\tself.Avail = freeBytesAvailable\n\treturn nil\n}\n\n// getWin32Process gets information about the process with the given process ID.\n// It uses a WMI query to get the information from the local system.\nfunc getWin32Process(pid int32) (Win32_Process, error) {\n\tvar dst []Win32_Process\n\tquery := fmt.Sprintf(\"WHERE ProcessId = %d\", pid)\n\tq := wmi.CreateQuery(&dst, query)\n\terr := wmi.Query(q, &dst)\n\tif err != nil {\n\t\treturn Win32_Process{}, fmt.Errorf(\"could not get Win32_Process %s: %v\", query, err)\n\t}\n\tif len(dst) < 1 {\n\t\treturn Win32_Process{}, fmt.Errorf(\"could not get Win32_Process %s: Process not found\", query)\n\t}\n\treturn dst[0], nil\n}\n\nfunc getWin32OperatingSystem() (Win32_OperatingSystem, error) {\n\tvar dst []Win32_OperatingSystem\n\tq := wmi.CreateQuery(&dst, \"\")\n\terr := wmi.Query(q, &dst)\n\tif err != nil {\n\t\treturn Win32_OperatingSystem{}, errors.Wrap(err, \"wmi query for Win32_OperatingSystem failed\")\n\t}\n\tif len(dst) != 1 {\n\t\treturn Win32_OperatingSystem{}, errors.New(\"wmi query for Win32_OperatingSystem failed\")\n\t}\n\treturn dst[0], nil\n}\n\nfunc (self *Rusage) Get(who int) error {\n\tif who != 0 {\n\t\treturn ErrNotImplemented{runtime.GOOS}\n\t}\n\n\tpid := os.Getpid()\n\tcpu, err := getProcTimes(pid)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tself.Utime = windows.FiletimeToDuration(&cpu.UserTime)\n\tself.Stime = windows.FiletimeToDuration(&cpu.KernelTime)\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sys/windows/doc.go",
    "content": "// Package windows contains various Windows system call.\npackage windows\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sys/windows/ntquery.go",
    "content": "// +build windows\n\npackage windows\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"runtime\"\n\t\"syscall\"\n\t\"time\"\n\t\"unsafe\"\n\n\t\"github.com/pkg/errors\"\n)\n\n// On both 32-bit and 64-bit systems NtQuerySystemInformation expects the\n// size of SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION to be 48.\nconst sizeofSystemProcessorPerformanceInformation = 48\n\n// ProcessBasicInformation is an equivalent representation of\n// PROCESS_BASIC_INFORMATION in the Windows API.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx\ntype ProcessBasicInformation struct {\n\tExitStatus                   uint\n\tPebBaseAddress               uintptr\n\tAffinityMask                 uint\n\tBasePriority                 uint\n\tUniqueProcessID              uint\n\tInheritedFromUniqueProcessID uint\n}\n\n// NtQueryProcessBasicInformation queries basic information about the process\n// associated with the given handle (provided by OpenProcess). It uses the\n// NtQueryInformationProcess function to collect the data.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx\nfunc NtQueryProcessBasicInformation(handle syscall.Handle) (ProcessBasicInformation, error) {\n\tvar processBasicInfo ProcessBasicInformation\n\tprocessBasicInfoPtr := (*byte)(unsafe.Pointer(&processBasicInfo))\n\tsize := uint32(unsafe.Sizeof(processBasicInfo))\n\tntStatus, _ := _NtQueryInformationProcess(handle, 0, processBasicInfoPtr, size, nil)\n\tif ntStatus != 0 {\n\t\treturn ProcessBasicInformation{}, errors.Errorf(\"NtQueryInformationProcess failed, NTSTATUS=0x%X\", ntStatus)\n\t}\n\n\treturn processBasicInfo, nil\n}\n\n// SystemProcessorPerformanceInformation contains CPU performance information\n// for a single CPU.\ntype SystemProcessorPerformanceInformation struct {\n\tIdleTime   time.Duration // Amount of time spent idle.\n\tKernelTime time.Duration // Kernel time does NOT include time spent in idle.\n\tUserTime   time.Duration // Amount of time spent executing in user mode.\n}\n\n// _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION is an equivalent representation of\n// SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION in the Windows API. This struct is\n// used internally with NtQuerySystemInformation call and is not exported. The\n// exported equivalent is SystemProcessorPerformanceInformation.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx\ntype _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION struct {\n\tIdleTime   int64\n\tKernelTime int64\n\tUserTime   int64\n\tReserved1  [2]int64\n\tReserved2  uint32\n}\n\n// NtQuerySystemProcessorPerformanceInformation queries CPU performance\n// information for each CPU. It uses the NtQuerySystemInformation function to\n// collect the SystemProcessorPerformanceInformation.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx\nfunc NtQuerySystemProcessorPerformanceInformation() ([]SystemProcessorPerformanceInformation, error) {\n\t// NTSTATUS code for success.\n\t// https://msdn.microsoft.com/en-us/library/cc704588.aspx\n\tconst STATUS_SUCCESS = 0\n\n\t// From the _SYSTEM_INFORMATION_CLASS enum.\n\t// http://processhacker.sourceforge.net/doc/ntexapi_8h.html#ad5d815b48e8f4da1ef2eb7a2f18a54e0\n\tconst systemProcessorPerformanceInformation = 8\n\n\t// Create a buffer large enough to hold an entry for each processor.\n\tb := make([]byte, runtime.NumCPU()*sizeofSystemProcessorPerformanceInformation)\n\n\t// Query the performance information. Note that this function uses 0 to\n\t// indicate success. Most other Windows functions use non-zero for success.\n\tvar returnLength uint32\n\tntStatus, _ := _NtQuerySystemInformation(systemProcessorPerformanceInformation, &b[0], uint32(len(b)), &returnLength)\n\tif ntStatus != STATUS_SUCCESS {\n\t\treturn nil, errors.Errorf(\"NtQuerySystemInformation failed, NTSTATUS=0x%X, bufLength=%v, returnLength=%v\", ntStatus, len(b), returnLength)\n\t}\n\n\treturn readSystemProcessorPerformanceInformationBuffer(b)\n}\n\n// readSystemProcessorPerformanceInformationBuffer reads from a buffer\n// containing SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION data. The buffer should\n// contain one entry for each CPU.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx\nfunc readSystemProcessorPerformanceInformationBuffer(b []byte) ([]SystemProcessorPerformanceInformation, error) {\n\tn := len(b) / sizeofSystemProcessorPerformanceInformation\n\tr := bytes.NewReader(b)\n\n\trtn := make([]SystemProcessorPerformanceInformation, 0, n)\n\tfor i := 0; i < n; i++ {\n\t\t_, err := r.Seek(int64(i*sizeofSystemProcessorPerformanceInformation), io.SeekStart)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"failed to seek to cpuN=%v in buffer\", i)\n\t\t}\n\n\t\ttimes := make([]uint64, 3)\n\t\tfor j := range times {\n\t\t\terr := binary.Read(r, binary.LittleEndian, &times[j])\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.Wrapf(err, \"failed reading cpu times for cpuN=%v\", i)\n\t\t\t}\n\t\t}\n\n\t\tidleTime := time.Duration(times[0] * 100)\n\t\tkernelTime := time.Duration(times[1] * 100)\n\t\tuserTime := time.Duration(times[2] * 100)\n\n\t\trtn = append(rtn, SystemProcessorPerformanceInformation{\n\t\t\tIdleTime:   idleTime,\n\t\t\tKernelTime: kernelTime - idleTime, // Subtract out idle time from kernel time.\n\t\t\tUserTime:   userTime,\n\t\t})\n\t}\n\n\treturn rtn, nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sys/windows/privileges.go",
    "content": "// +build windows\n\npackage windows\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n\n\t\"github.com/pkg/errors\"\n\t\"golang.org/x/sys/windows\"\n)\n\n// Cache of privilege names to LUIDs.\nvar (\n\tprivNames     = make(map[string]int64)\n\tprivNameMutex sync.Mutex\n)\n\nconst (\n\t// SeDebugPrivilege is the name of the privilege used to debug programs.\n\tSeDebugPrivilege = \"SeDebugPrivilege\"\n)\n\n// Errors returned by AdjustTokenPrivileges.\nconst (\n\tERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300\n)\n\n// Attribute bits for privileges.\nconst (\n\t_SE_PRIVILEGE_ENABLED_BY_DEFAULT uint32 = 0x00000001\n\t_SE_PRIVILEGE_ENABLED            uint32 = 0x00000002\n\t_SE_PRIVILEGE_REMOVED            uint32 = 0x00000004\n\t_SE_PRIVILEGE_USED_FOR_ACCESS    uint32 = 0x80000000\n)\n\n// Privilege contains information about a single privilege associated with a\n// Token.\ntype Privilege struct {\n\tLUID             int64  `json:\"-\"` // Locally unique identifier (guaranteed only until the system is restarted).\n\tName             string `json:\"-\"`\n\tEnabledByDefault bool   `json:\"enabled_by_default,omitempty\"`\n\tEnabled          bool   `json:\"enabled\"`\n\tRemoved          bool   `json:\"removed,omitempty\"`\n\tUsed             bool   `json:\"used,omitempty\"`\n}\n\nfunc (p Privilege) String() string {\n\tvar buf bytes.Buffer\n\tbuf.WriteString(p.Name)\n\tbuf.WriteString(\"=(\")\n\n\topts := make([]string, 0, 4)\n\tif p.EnabledByDefault {\n\t\topts = append(opts, \"Default\")\n\t}\n\tif p.Enabled {\n\t\topts = append(opts, \"Enabled\")\n\t}\n\tif !p.EnabledByDefault && !p.Enabled {\n\t\topts = append(opts, \"Disabled\")\n\t}\n\tif p.Removed {\n\t\topts = append(opts, \"Removed\")\n\t}\n\tif p.Used {\n\t\topts = append(opts, \"Used\")\n\t}\n\n\tbuf.WriteString(strings.Join(opts, \", \"))\n\tbuf.WriteString(\")\")\n\n\t// Example: SeDebugPrivilege=(Default, Enabled)\n\treturn buf.String()\n}\n\n// User represent the information about a Windows account.\ntype User struct {\n\tSID     string\n\tAccount string\n\tDomain  string\n\tType    uint32\n}\n\nfunc (u User) String() string {\n\treturn fmt.Sprintf(`User:%v\\%v, SID:%v, Type:%v`, u.Domain, u.Account, u.SID, u.Type)\n}\n\n// DebugInfo contains general debug info about the current process.\ntype DebugInfo struct {\n\tOSVersion    Version              // OS version info.\n\tArch         string               // Architecture of the machine.\n\tNumCPU       int                  // Number of CPUs.\n\tUser         User                 // User that this process is running as.\n\tProcessPrivs map[string]Privilege // Privileges held by the process.\n}\n\nfunc (d DebugInfo) String() string {\n\tbytes, _ := json.Marshal(d)\n\treturn string(bytes)\n}\n\n// LookupPrivilegeName looks up a privilege name given a LUID value.\nfunc LookupPrivilegeName(systemName string, luid int64) (string, error) {\n\tbuf := make([]uint16, 256)\n\tbufSize := uint32(len(buf))\n\terr := _LookupPrivilegeName(systemName, &luid, &buf[0], &bufSize)\n\tif err != nil {\n\t\treturn \"\", errors.Wrapf(err, \"LookupPrivilegeName failed for luid=%v\", luid)\n\t}\n\n\treturn syscall.UTF16ToString(buf), nil\n}\n\n// mapPrivileges maps privilege names to LUID values.\nfunc mapPrivileges(names []string) ([]int64, error) {\n\tvar privileges []int64\n\tprivNameMutex.Lock()\n\tdefer privNameMutex.Unlock()\n\tfor _, name := range names {\n\t\tp, ok := privNames[name]\n\t\tif !ok {\n\t\t\terr := _LookupPrivilegeValue(\"\", name, &p)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, errors.Wrapf(err, \"LookupPrivilegeValue failed on '%v'\", name)\n\t\t\t}\n\t\t\tprivNames[name] = p\n\t\t}\n\t\tprivileges = append(privileges, p)\n\t}\n\treturn privileges, nil\n}\n\n// EnableTokenPrivileges enables the specified privileges in the given\n// Token. The token must have TOKEN_ADJUST_PRIVILEGES access. If the token\n// does not already contain the privilege it cannot be enabled.\nfunc EnableTokenPrivileges(token syscall.Token, privileges ...string) error {\n\tprivValues, err := mapPrivileges(privileges)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar b bytes.Buffer\n\tbinary.Write(&b, binary.LittleEndian, uint32(len(privValues)))\n\tfor _, p := range privValues {\n\t\tbinary.Write(&b, binary.LittleEndian, p)\n\t\tbinary.Write(&b, binary.LittleEndian, uint32(_SE_PRIVILEGE_ENABLED))\n\t}\n\n\tsuccess, err := _AdjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(b.Len()), nil, nil)\n\tif !success {\n\t\treturn err\n\t}\n\tif err == ERROR_NOT_ALL_ASSIGNED {\n\t\treturn errors.Wrap(err, \"error not all privileges were assigned\")\n\t}\n\n\treturn nil\n}\n\n// GetTokenPrivileges returns a list of privileges associated with a token.\n// The provided token must have at a minimum TOKEN_QUERY access. This is a\n// wrapper around the GetTokenInformation function.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx\nfunc GetTokenPrivileges(token syscall.Token) (map[string]Privilege, error) {\n\t// Determine the required buffer size.\n\tvar size uint32\n\tsyscall.GetTokenInformation(token, syscall.TokenPrivileges, nil, 0, &size)\n\n\t// This buffer will receive a TOKEN_PRIVILEGE structure.\n\tb := bytes.NewBuffer(make([]byte, size))\n\terr := syscall.GetTokenInformation(token, syscall.TokenPrivileges, &b.Bytes()[0], uint32(b.Len()), &size)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"GetTokenInformation failed\")\n\t}\n\n\tvar privilegeCount uint32\n\terr = binary.Read(b, binary.LittleEndian, &privilegeCount)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"failed to read PrivilegeCount\")\n\t}\n\n\trtn := make(map[string]Privilege, privilegeCount)\n\tfor i := 0; i < int(privilegeCount); i++ {\n\t\tvar luid int64\n\t\terr = binary.Read(b, binary.LittleEndian, &luid)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"failed to read LUID value\")\n\t\t}\n\n\t\tvar attributes uint32\n\t\terr = binary.Read(b, binary.LittleEndian, &attributes)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"failed to read attributes\")\n\t\t}\n\n\t\tname, err := LookupPrivilegeName(\"\", luid)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrapf(err, \"LookupPrivilegeName failed for LUID=%v\", luid)\n\t\t}\n\n\t\trtn[name] = Privilege{\n\t\t\tLUID:             luid,\n\t\t\tName:             name,\n\t\t\tEnabledByDefault: (attributes & _SE_PRIVILEGE_ENABLED_BY_DEFAULT) > 0,\n\t\t\tEnabled:          (attributes & _SE_PRIVILEGE_ENABLED) > 0,\n\t\t\tRemoved:          (attributes & _SE_PRIVILEGE_REMOVED) > 0,\n\t\t\tUsed:             (attributes & _SE_PRIVILEGE_USED_FOR_ACCESS) > 0,\n\t\t}\n\t}\n\n\treturn rtn, nil\n}\n\n// GetTokenUser returns the User associated with the given Token.\nfunc GetTokenUser(token syscall.Token) (User, error) {\n\ttokenUser, err := token.GetTokenUser()\n\tif err != nil {\n\t\treturn User{}, errors.Wrap(err, \"GetTokenUser failed\")\n\t}\n\n\tvar user User\n\tuser.SID, err = tokenUser.User.Sid.String()\n\tif err != nil {\n\t\treturn user, errors.Wrap(err, \"ConvertSidToStringSid failed\")\n\t}\n\n\tuser.Account, user.Domain, user.Type, err = tokenUser.User.Sid.LookupAccount(\"\")\n\tif err != nil {\n\t\treturn user, errors.Wrap(err, \"LookupAccountSid failed\")\n\t}\n\n\treturn user, nil\n}\n\n// GetDebugInfo returns general debug info about the current process.\nfunc GetDebugInfo() (*DebugInfo, error) {\n\th, err := windows.GetCurrentProcess()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar token syscall.Token\n\terr = syscall.OpenProcessToken(syscall.Handle(h), syscall.TOKEN_QUERY, &token)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tprivs, err := GetTokenPrivileges(token)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuser, err := GetTokenUser(token)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &DebugInfo{\n\t\tUser:         user,\n\t\tProcessPrivs: privs,\n\t\tOSVersion:    GetWindowsVersion(),\n\t\tArch:         runtime.GOARCH,\n\t\tNumCPU:       runtime.NumCPU(),\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go",
    "content": "package windows\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n\t\"time\"\n\t\"unsafe\"\n\n\t\"github.com/pkg/errors\"\n)\n\nvar (\n\tsizeofUint32                  = 4\n\tsizeofProcessEntry32          = uint32(unsafe.Sizeof(ProcessEntry32{}))\n\tsizeofProcessMemoryCountersEx = uint32(unsafe.Sizeof(ProcessMemoryCountersEx{}))\n\tsizeofMemoryStatusEx          = uint32(unsafe.Sizeof(MemoryStatusEx{}))\n)\n\n// Process-specific access rights. Others are declared in the syscall package.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx\nconst (\n\tPROCESS_QUERY_LIMITED_INFORMATION uint32 = 0x1000\n\tPROCESS_VM_READ                   uint32 = 0x0010\n)\n\n// MAX_PATH is the maximum length for a path in Windows.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx\nconst MAX_PATH = 260\n\n// DriveType represents a type of drive (removable, fixed, CD-ROM, RAM disk, or\n// network drive).\ntype DriveType uint32\n\n// Drive types as returned by GetDriveType.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx\nconst (\n\tDRIVE_UNKNOWN DriveType = iota\n\tDRIVE_NO_ROOT_DIR\n\tDRIVE_REMOVABLE\n\tDRIVE_FIXED\n\tDRIVE_REMOTE\n\tDRIVE_CDROM\n\tDRIVE_RAMDISK\n)\n\nfunc (dt DriveType) String() string {\n\tnames := map[DriveType]string{\n\t\tDRIVE_UNKNOWN:     \"unknown\",\n\t\tDRIVE_NO_ROOT_DIR: \"invalid\",\n\t\tDRIVE_REMOVABLE:   \"removable\",\n\t\tDRIVE_FIXED:       \"fixed\",\n\t\tDRIVE_REMOTE:      \"remote\",\n\t\tDRIVE_CDROM:       \"cdrom\",\n\t\tDRIVE_RAMDISK:     \"ramdisk\",\n\t}\n\n\tname, found := names[dt]\n\tif !found {\n\t\treturn \"unknown DriveType value\"\n\t}\n\treturn name\n}\n\n// Flags that can be used with CreateToolhelp32Snapshot.\nconst (\n\tTH32CS_INHERIT      uint32 = 0x80000000 // Indicates that the snapshot handle is to be inheritable.\n\tTH32CS_SNAPHEAPLIST uint32 = 0x00000001 // Includes all heaps of the process specified in th32ProcessID in the snapshot.\n\tTH32CS_SNAPMODULE   uint32 = 0x00000008 // Includes all modules of the process specified in th32ProcessID in the snapshot.\n\tTH32CS_SNAPMODULE32 uint32 = 0x00000010 // Includes all 32-bit modules of the process specified in th32ProcessID in the snapshot when called from a 64-bit process.\n\tTH32CS_SNAPPROCESS  uint32 = 0x00000002 // Includes all processes in the system in the snapshot.\n\tTH32CS_SNAPTHREAD   uint32 = 0x00000004 // Includes all threads in the system in the snapshot.\n)\n\n// ProcessEntry32 is an equivalent representation of PROCESSENTRY32 in the\n// Windows API. It contains a process's information. Do not modify or reorder.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx\ntype ProcessEntry32 struct {\n\tsize              uint32\n\tCntUsage          uint32\n\tProcessID         uint32\n\tDefaultHeapID     uintptr\n\tModuleID          uint32\n\tCntThreads        uint32\n\tParentProcessID   uint32\n\tPriorityClassBase int32\n\tFlags             uint32\n\texeFile           [MAX_PATH]uint16\n}\n\n// ExeFile returns the name of the executable file for the process. It does\n// not contain the full path.\nfunc (p ProcessEntry32) ExeFile() string {\n\treturn syscall.UTF16ToString(p.exeFile[:])\n}\n\nfunc (p ProcessEntry32) String() string {\n\treturn fmt.Sprintf(\"{CntUsage:%v ProcessID:%v DefaultHeapID:%v ModuleID:%v \"+\n\t\t\"CntThreads:%v ParentProcessID:%v PriorityClassBase:%v Flags:%v ExeFile:%v\",\n\t\tp.CntUsage, p.ProcessID, p.DefaultHeapID, p.ModuleID, p.CntThreads,\n\t\tp.ParentProcessID, p.PriorityClassBase, p.Flags, p.ExeFile())\n}\n\n// MemoryStatusEx is an equivalent representation of MEMORYSTATUSEX in the\n// Windows API. It contains information about the current state of both physical\n// and virtual memory, including extended memory.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770\ntype MemoryStatusEx struct {\n\tlength               uint32\n\tMemoryLoad           uint32\n\tTotalPhys            uint64\n\tAvailPhys            uint64\n\tTotalPageFile        uint64\n\tAvailPageFile        uint64\n\tTotalVirtual         uint64\n\tAvailVirtual         uint64\n\tAvailExtendedVirtual uint64\n}\n\n// ProcessMemoryCountersEx is an equivalent representation of\n// PROCESS_MEMORY_COUNTERS_EX in the Windows API.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684874(v=vs.85).aspx\ntype ProcessMemoryCountersEx struct {\n\tcb                         uint32\n\tPageFaultCount             uint32\n\tPeakWorkingSetSize         uintptr\n\tWorkingSetSize             uintptr\n\tQuotaPeakPagedPoolUsage    uintptr\n\tQuotaPagedPoolUsage        uintptr\n\tQuotaPeakNonPagedPoolUsage uintptr\n\tQuotaNonPagedPoolUsage     uintptr\n\tPagefileUsage              uintptr\n\tPeakPagefileUsage          uintptr\n\tPrivateUsage               uintptr\n}\n\n// GetLogicalDriveStrings returns a list of drives in the system.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364975(v=vs.85).aspx\nfunc GetLogicalDriveStrings() ([]string, error) {\n\t// Determine the size of the buffer required to receive all drives.\n\tbufferLength, err := _GetLogicalDriveStringsW(0, nil)\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"GetLogicalDriveStringsW failed to get buffer length\")\n\t}\n\tif bufferLength < 0 {\n\t\treturn nil, errors.New(\"GetLogicalDriveStringsW returned an invalid buffer length\")\n\t}\n\n\tbuffer := make([]uint16, bufferLength)\n\t_, err = _GetLogicalDriveStringsW(uint32(len(buffer)), &buffer[0])\n\tif err != nil {\n\t\treturn nil, errors.Wrap(err, \"GetLogicalDriveStringsW failed\")\n\t}\n\n\t// Split the uint16 slice at null-terminators.\n\tvar startIdx int\n\tvar drivesUTF16 [][]uint16\n\tfor i, value := range buffer {\n\t\tif value == 0 {\n\t\t\tdrivesUTF16 = append(drivesUTF16, buffer[startIdx:i])\n\t\t\tstartIdx = i + 1\n\t\t}\n\t}\n\n\t// Convert the utf16 slices to strings.\n\tdrives := make([]string, 0, len(drivesUTF16))\n\tfor _, driveUTF16 := range drivesUTF16 {\n\t\tif len(driveUTF16) > 0 {\n\t\t\tdrives = append(drives, syscall.UTF16ToString(driveUTF16))\n\t\t}\n\t}\n\n\treturn drives, nil\n}\n\n// GlobalMemoryStatusEx retrieves information about the system's current usage\n// of both physical and virtual memory.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx\nfunc GlobalMemoryStatusEx() (MemoryStatusEx, error) {\n\tmemoryStatusEx := MemoryStatusEx{length: sizeofMemoryStatusEx}\n\terr := _GlobalMemoryStatusEx(&memoryStatusEx)\n\tif err != nil {\n\t\treturn MemoryStatusEx{}, errors.Wrap(err, \"GlobalMemoryStatusEx failed\")\n\t}\n\n\treturn memoryStatusEx, nil\n}\n\n// GetProcessMemoryInfo retrieves information about the memory usage of the\n// specified process.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx\nfunc GetProcessMemoryInfo(handle syscall.Handle) (ProcessMemoryCountersEx, error) {\n\tprocessMemoryCountersEx := ProcessMemoryCountersEx{cb: sizeofProcessMemoryCountersEx}\n\terr := _GetProcessMemoryInfo(handle, &processMemoryCountersEx, processMemoryCountersEx.cb)\n\tif err != nil {\n\t\treturn ProcessMemoryCountersEx{}, errors.Wrap(err, \"GetProcessMemoryInfo failed\")\n\t}\n\n\treturn processMemoryCountersEx, nil\n}\n\n// GetProcessImageFileName Retrieves the name of the executable file for the\n// specified process.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683217(v=vs.85).aspx\nfunc GetProcessImageFileName(handle syscall.Handle) (string, error) {\n\tbuffer := make([]uint16, MAX_PATH)\n\t_, err := _GetProcessImageFileName(handle, &buffer[0], uint32(len(buffer)))\n\tif err != nil {\n\t\treturn \"\", errors.Wrap(err, \"GetProcessImageFileName failed\")\n\t}\n\n\treturn syscall.UTF16ToString(buffer), nil\n}\n\n// GetSystemTimes retrieves system timing information. On a multiprocessor\n// system, the values returned are the sum of the designated times across all\n// processors. The returned kernel time does not include the system idle time.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724400(v=vs.85).aspx\nfunc GetSystemTimes() (idle, kernel, user time.Duration, err error) {\n\tvar idleTime, kernelTime, userTime syscall.Filetime\n\terr = _GetSystemTimes(&idleTime, &kernelTime, &userTime)\n\tif err != nil {\n\t\treturn 0, 0, 0, errors.Wrap(err, \"GetSystemTimes failed\")\n\t}\n\n\tidle = FiletimeToDuration(&idleTime)\n\tkernel = FiletimeToDuration(&kernelTime) // Kernel time includes idle time so we subtract it out.\n\tuser = FiletimeToDuration(&userTime)\n\n\treturn idle, kernel - idle, user, nil\n}\n\n// FiletimeToDuration converts a Filetime to a time.Duration. Do not use this\n// method to convert a Filetime to an actual clock time, for that use\n// Filetime.Nanosecond().\nfunc FiletimeToDuration(ft *syscall.Filetime) time.Duration {\n\tn := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // in 100-nanosecond intervals\n\treturn time.Duration(n * 100)\n}\n\n// GetDriveType Determines whether a disk drive is a removable, fixed, CD-ROM,\n// RAM disk, or network drive. A trailing backslash is required on the\n// rootPathName.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939\nfunc GetDriveType(rootPathName string) (DriveType, error) {\n\trootPathNamePtr, err := syscall.UTF16PtrFromString(rootPathName)\n\tif err != nil {\n\t\treturn DRIVE_UNKNOWN, errors.Wrapf(err, \"UTF16PtrFromString failed for rootPathName=%v\", rootPathName)\n\t}\n\n\tdt, err := _GetDriveType(rootPathNamePtr)\n\tif err != nil {\n\t\treturn DRIVE_UNKNOWN, errors.Wrapf(err, \"GetDriveType failed for rootPathName=%v\", rootPathName)\n\t}\n\n\treturn dt, nil\n}\n\n// EnumProcesses retrieves the process identifier for each process object in the\n// system. This function can return a max of 65536 PIDs. If there are more\n// processes than that then this will not return them all.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682629(v=vs.85).aspx\nfunc EnumProcesses() ([]uint32, error) {\n\tenumProcesses := func(size int) ([]uint32, error) {\n\t\tvar (\n\t\t\tpids         = make([]uint32, size)\n\t\t\tsizeBytes    = len(pids) * sizeofUint32\n\t\t\tbytesWritten uint32\n\t\t)\n\n\t\terr := _EnumProcesses(&pids[0], uint32(sizeBytes), &bytesWritten)\n\n\t\tpidsWritten := int(bytesWritten) / sizeofUint32\n\t\tif int(bytesWritten)%sizeofUint32 != 0 || pidsWritten > len(pids) {\n\t\t\treturn nil, errors.Errorf(\"EnumProcesses returned an invalid bytesWritten value of %v\", bytesWritten)\n\t\t}\n\t\tpids = pids[:pidsWritten]\n\n\t\treturn pids, err\n\t}\n\n\t// Retry the EnumProcesses call with larger arrays if needed.\n\tsize := 2048\n\tvar pids []uint32\n\tfor tries := 0; tries < 5; tries++ {\n\t\tvar err error\n\t\tpids, err = enumProcesses(size)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"EnumProcesses failed\")\n\t\t}\n\n\t\tif len(pids) < size {\n\t\t\tbreak\n\t\t}\n\n\t\t// Increase the size the pids array and retry the enumProcesses call\n\t\t// because the array wasn't large enough to hold all of the processes.\n\t\tsize *= 2\n\t}\n\n\treturn pids, nil\n}\n\n// GetDiskFreeSpaceEx retrieves information about the amount of space that is\n// available on a disk volume, which is the total amount of space, the total\n// amount of free space, and the total amount of free space available to the\n// user that is associated with the calling thread.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx\nfunc GetDiskFreeSpaceEx(directoryName string) (freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64, err error) {\n\tdirectoryNamePtr, err := syscall.UTF16PtrFromString(directoryName)\n\tif err != nil {\n\t\treturn 0, 0, 0, errors.Wrapf(err, \"UTF16PtrFromString failed for directoryName=%v\", directoryName)\n\t}\n\n\terr = _GetDiskFreeSpaceEx(directoryNamePtr, &freeBytesAvailable, &totalNumberOfBytes, &totalNumberOfFreeBytes)\n\tif err != nil {\n\t\treturn 0, 0, 0, err\n\t}\n\n\treturn freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, nil\n}\n\n// CreateToolhelp32Snapshot takes a snapshot of the specified processes, as well\n// as the heaps, modules, and threads used by these processes.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx\nfunc CreateToolhelp32Snapshot(flags, pid uint32) (syscall.Handle, error) {\n\th, err := _CreateToolhelp32Snapshot(flags, pid)\n\tif err != nil {\n\t\treturn syscall.InvalidHandle, err\n\t}\n\tif h == syscall.InvalidHandle {\n\t\treturn syscall.InvalidHandle, syscall.GetLastError()\n\t}\n\n\treturn h, nil\n}\n\n// Process32First retrieves information about the first process encountered in a\n// system snapshot.\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834\nfunc Process32First(handle syscall.Handle) (ProcessEntry32, error) {\n\tprocessEntry32 := ProcessEntry32{size: sizeofProcessEntry32}\n\terr := _Process32First(handle, &processEntry32)\n\tif err != nil {\n\t\treturn ProcessEntry32{}, errors.Wrap(err, \"Process32First failed\")\n\t}\n\n\treturn processEntry32, nil\n}\n\n// Process32Next retrieves information about the next process recorded in a\n// system snapshot. When there are no more processes to iterate then\n// syscall.ERROR_NO_MORE_FILES is returned (use errors.Cause() to unwrap).\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684836\nfunc Process32Next(handle syscall.Handle) (ProcessEntry32, error) {\n\tprocessEntry32 := ProcessEntry32{size: sizeofProcessEntry32}\n\terr := _Process32Next(handle, &processEntry32)\n\tif err != nil {\n\t\treturn ProcessEntry32{}, errors.Wrap(err, \"Process32Next failed\")\n\t}\n\n\treturn processEntry32, nil\n}\n\n// Use \"GOOS=windows go generate -v -x .\" to generate the source.\n\n// Add -trace to enable debug prints around syscalls.\n//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go\n\n// Windows API calls\n//sys   _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) = kernel32.GlobalMemoryStatusEx\n//sys   _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) = kernel32.GetLogicalDriveStringsW\n//sys   _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) = psapi.GetProcessMemoryInfo\n//sys   _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) = psapi.GetProcessImageFileNameW\n//sys   _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) = kernel32.GetSystemTimes\n//sys   _GetDriveType(rootPathName *uint16) (dt DriveType, err error) = kernel32.GetDriveTypeW\n//sys   _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses\n//sys   _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = kernel32.GetDiskFreeSpaceExW\n//sys   _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32FirstW\n//sys   _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32NextW\n//sys   _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) = kernel32.CreateToolhelp32Snapshot\n//sys   _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQuerySystemInformation\n//sys   _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQueryInformationProcess\n//sys   _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW\n//sys   _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) = advapi32.LookupPrivilegeValueW\n//sys   _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sys/windows/version.go",
    "content": "// +build windows\n\npackage windows\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n)\n\n// Version identifies a Windows version by major, minor, and build number.\ntype Version struct {\n\tMajor int\n\tMinor int\n\tBuild int\n}\n\n// GetWindowsVersion returns the Windows version information. Applications not\n// manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version\n// value (6.2).\n//\n// For a table of version numbers see:\n// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx\nfunc GetWindowsVersion() Version {\n\t// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx\n\tver, err := syscall.GetVersion()\n\tif err != nil {\n\t\t// GetVersion should never return an error.\n\t\tpanic(fmt.Errorf(\"GetVersion failed: %v\", err))\n\t}\n\n\treturn Version{\n\t\tMajor: int(ver & 0xFF),\n\t\tMinor: int(ver >> 8 & 0xFF),\n\t\tBuild: int(ver >> 16),\n\t}\n}\n\n// IsWindowsVistaOrGreater returns true if the Windows version is Vista or\n// greater.\nfunc (v Version) IsWindowsVistaOrGreater() bool {\n\t// Vista is 6.0.\n\treturn v.Major >= 6 && v.Minor >= 0\n}\n"
  },
  {
    "path": "vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go",
    "content": "// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT\n\npackage windows\n\nimport \"unsafe\"\nimport \"syscall\"\n\nvar _ unsafe.Pointer\n\nvar (\n\tmodkernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\n\tmodpsapi    = syscall.NewLazyDLL(\"psapi.dll\")\n\tmodntdll    = syscall.NewLazyDLL(\"ntdll.dll\")\n\tmodadvapi32 = syscall.NewLazyDLL(\"advapi32.dll\")\n\n\tprocGlobalMemoryStatusEx      = modkernel32.NewProc(\"GlobalMemoryStatusEx\")\n\tprocGetLogicalDriveStringsW   = modkernel32.NewProc(\"GetLogicalDriveStringsW\")\n\tprocGetProcessMemoryInfo      = modpsapi.NewProc(\"GetProcessMemoryInfo\")\n\tprocGetProcessImageFileNameW  = modpsapi.NewProc(\"GetProcessImageFileNameW\")\n\tprocGetSystemTimes            = modkernel32.NewProc(\"GetSystemTimes\")\n\tprocGetDriveTypeW             = modkernel32.NewProc(\"GetDriveTypeW\")\n\tprocEnumProcesses             = modpsapi.NewProc(\"EnumProcesses\")\n\tprocGetDiskFreeSpaceExW       = modkernel32.NewProc(\"GetDiskFreeSpaceExW\")\n\tprocProcess32FirstW           = modkernel32.NewProc(\"Process32FirstW\")\n\tprocProcess32NextW            = modkernel32.NewProc(\"Process32NextW\")\n\tprocCreateToolhelp32Snapshot  = modkernel32.NewProc(\"CreateToolhelp32Snapshot\")\n\tprocNtQuerySystemInformation  = modntdll.NewProc(\"NtQuerySystemInformation\")\n\tprocNtQueryInformationProcess = modntdll.NewProc(\"NtQueryInformationProcess\")\n\tprocLookupPrivilegeNameW      = modadvapi32.NewProc(\"LookupPrivilegeNameW\")\n\tprocLookupPrivilegeValueW     = modadvapi32.NewProc(\"LookupPrivilegeValueW\")\n\tprocAdjustTokenPrivileges     = modadvapi32.NewProc(\"AdjustTokenPrivileges\")\n)\n\nfunc _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGlobalMemoryStatusEx.Addr(), 1, uintptr(unsafe.Pointer(buffer)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetLogicalDriveStringsW.Addr(), 2, uintptr(bufferLength), uintptr(unsafe.Pointer(buffer)), 0)\n\tlength = uint32(r0)\n\tif length == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(psmemCounters)), uintptr(cb))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetProcessImageFileNameW.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(outImageFileName)), uintptr(size))\n\tlength = uint32(r0)\n\tif length == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetSystemTimes.Addr(), 3, uintptr(unsafe.Pointer(idleTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _GetDriveType(rootPathName *uint16) (dt DriveType, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0)\n\tdt = DriveType(r0)\n\tif dt == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(processIds)), uintptr(sizeBytes), uintptr(unsafe.Pointer(bytesReturned)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procGetDiskFreeSpaceExW.Addr(), 4, uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailable)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processID), 0)\n\thandle = syscall.Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) {\n\tr0, _, e1 := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInformationClass), uintptr(unsafe.Pointer(systemInformation)), uintptr(systemInformationLength), uintptr(unsafe.Pointer(returnLength)), 0, 0)\n\tntstatus = uint32(r0)\n\tif ntstatus == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) {\n\tr0, _, e1 := syscall.Syscall6(procNtQueryInformationProcess.Addr(), 5, uintptr(processHandle), uintptr(processInformationClass), uintptr(unsafe.Pointer(processInformation)), uintptr(processInformationLength), uintptr(unsafe.Pointer(returnLength)), 0)\n\tntstatus = uint32(r0)\n\tif ntstatus == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(systemName)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn __LookupPrivilegeName(_p0, luid, buffer, size)\n}\n\nfunc __LookupPrivilegeName(systemName *uint16, luid *int64, buffer *uint16, size *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(systemName)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *uint16\n\t_p1, err = syscall.UTF16PtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn __LookupPrivilegeValue(_p0, _p1, luid)\n}\n\nfunc __LookupPrivilegeValue(systemName *uint16, name *uint16, luid *int64) (err error) {\n\tr1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) {\n\tvar _p0 uint32\n\tif releaseAll {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize)))\n\tsuccess = r0 != 0\n\tif true {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/fatih/color/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013 Fatih Arslan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/fatih/color/README.md",
    "content": "# Color [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/fatih/color) [![Build Status](http://img.shields.io/travis/fatih/color.svg?style=flat-square)](https://travis-ci.org/fatih/color)\n\n\n\nColor lets you use colorized outputs in terms of [ANSI Escape\nCodes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It\nhas support for Windows too! The API can be used in several ways, pick one that\nsuits you.\n\n\n\n![Color](http://i.imgur.com/c1JI0lA.png)\n\n\n## Install\n\n```bash\ngo get github.com/fatih/color\n```\n\n## Examples\n\n### Standard colors\n\n```go\n// Print with default helper functions\ncolor.Cyan(\"Prints text in cyan.\")\n\n// A newline will be appended automatically\ncolor.Blue(\"Prints %s in blue.\", \"text\")\n\n// These are using the default foreground colors\ncolor.Red(\"We have red\")\ncolor.Magenta(\"And many others ..\")\n\n```\n\n### Mix and reuse colors\n\n```go\n// Create a new color object\nc := color.New(color.FgCyan).Add(color.Underline)\nc.Println(\"Prints cyan text with an underline.\")\n\n// Or just add them to New()\nd := color.New(color.FgCyan, color.Bold)\nd.Printf(\"This prints bold cyan %s\\n\", \"too!.\")\n\n// Mix up foreground and background colors, create new mixes!\nred := color.New(color.FgRed)\n\nboldRed := red.Add(color.Bold)\nboldRed.Println(\"This will print text in bold red.\")\n\nwhiteBackground := red.Add(color.BgWhite)\nwhiteBackground.Println(\"Red text with white background.\")\n```\n\n### Use your own output (io.Writer)\n\n```go\n// Use your own io.Writer output\ncolor.New(color.FgBlue).Fprintln(myWriter, \"blue color!\")\n\nblue := color.New(color.FgBlue)\nblue.Fprint(writer, \"This will print text in blue.\")\n```\n\n### Custom print functions (PrintFunc)\n\n```go\n// Create a custom print function for convenience\nred := color.New(color.FgRed).PrintfFunc()\nred(\"Warning\")\nred(\"Error: %s\", err)\n\n// Mix up multiple attributes\nnotice := color.New(color.Bold, color.FgGreen).PrintlnFunc()\nnotice(\"Don't forget this...\")\n```\n\n### Custom fprint functions (FprintFunc)\n\n```go\nblue := color.New(FgBlue).FprintfFunc()\nblue(myWriter, \"important notice: %s\", stars)\n\n// Mix up with multiple attributes\nsuccess := color.New(color.Bold, color.FgGreen).FprintlnFunc()\nsuccess(myWriter, \"Don't forget this...\")\n```\n\n### Insert into noncolor strings (SprintFunc)\n\n```go\n// Create SprintXxx functions to mix strings with other non-colorized strings:\nyellow := color.New(color.FgYellow).SprintFunc()\nred := color.New(color.FgRed).SprintFunc()\nfmt.Printf(\"This is a %s and this is %s.\\n\", yellow(\"warning\"), red(\"error\"))\n\ninfo := color.New(color.FgWhite, color.BgGreen).SprintFunc()\nfmt.Printf(\"This %s rocks!\\n\", info(\"package\"))\n\n// Use helper functions\nfmt.Println(\"This\", color.RedString(\"warning\"), \"should be not neglected.\")\nfmt.Printf(\"%v %v\\n\", color.GreenString(\"Info:\"), \"an important message.\")\n\n// Windows supported too! Just don't forget to change the output to color.Output\nfmt.Fprintf(color.Output, \"Windows support: %s\", color.GreenString(\"PASS\"))\n```\n\n### Plug into existing code\n\n```go\n// Use handy standard colors\ncolor.Set(color.FgYellow)\n\nfmt.Println(\"Existing text will now be in yellow\")\nfmt.Printf(\"This one %s\\n\", \"too\")\n\ncolor.Unset() // Don't forget to unset\n\n// You can mix up parameters\ncolor.Set(color.FgMagenta, color.Bold)\ndefer color.Unset() // Use it in your function\n\nfmt.Println(\"All text will now be bold magenta.\")\n```\n\n### Disable color\n\nThere might be a case where you want to disable color output (for example to\npipe the standard output of your app to somewhere else). `Color` has support to\ndisable colors both globally and for single color definition. For example\nsuppose you have a CLI app and a `--no-color` bool flag. You can easily disable\nthe color output with:\n\n```go\n\nvar flagNoColor = flag.Bool(\"no-color\", false, \"Disable color output\")\n\nif *flagNoColor {\n\tcolor.NoColor = true // disables colorized output\n}\n```\n\nIt also has support for single color definitions (local). You can\ndisable/enable color output on the fly:\n\n```go\nc := color.New(color.FgCyan)\nc.Println(\"Prints cyan text\")\n\nc.DisableColor()\nc.Println(\"This is printed without any color\")\n\nc.EnableColor()\nc.Println(\"This prints again cyan...\")\n```\n\n## Todo\n\n* Save/Return previous values\n* Evaluate fmt.Formatter interface\n\n\n## Credits\n\n * [Fatih Arslan](https://github.com/fatih)\n * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable)\n\n## License\n\nThe MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details\n\n"
  },
  {
    "path": "vendor/github.com/fatih/color/color.go",
    "content": "package color\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/mattn/go-colorable\"\n\t\"github.com/mattn/go-isatty\"\n)\n\nvar (\n\t// NoColor defines if the output is colorized or not. It's dynamically set to\n\t// false or true based on the stdout's file descriptor referring to a terminal\n\t// or not. This is a global option and affects all colors. For more control\n\t// over each color block use the methods DisableColor() individually.\n\tNoColor = !isatty.IsTerminal(os.Stdout.Fd()) || os.Getenv(\"TERM\") == \"dumb\"\n\n\t// Output defines the standard output of the print functions. By default\n\t// os.Stdout is used.\n\tOutput = colorable.NewColorableStdout()\n\n\t// colorsCache is used to reduce the count of created Color objects and\n\t// allows to reuse already created objects with required Attribute.\n\tcolorsCache   = make(map[Attribute]*Color)\n\tcolorsCacheMu sync.Mutex // protects colorsCache\n)\n\n// Color defines a custom color object which is defined by SGR parameters.\ntype Color struct {\n\tparams  []Attribute\n\tnoColor *bool\n}\n\n// Attribute defines a single SGR Code\ntype Attribute int\n\nconst escape = \"\\x1b\"\n\n// Base attributes\nconst (\n\tReset Attribute = iota\n\tBold\n\tFaint\n\tItalic\n\tUnderline\n\tBlinkSlow\n\tBlinkRapid\n\tReverseVideo\n\tConcealed\n\tCrossedOut\n)\n\n// Foreground text colors\nconst (\n\tFgBlack Attribute = iota + 30\n\tFgRed\n\tFgGreen\n\tFgYellow\n\tFgBlue\n\tFgMagenta\n\tFgCyan\n\tFgWhite\n)\n\n// Foreground Hi-Intensity text colors\nconst (\n\tFgHiBlack Attribute = iota + 90\n\tFgHiRed\n\tFgHiGreen\n\tFgHiYellow\n\tFgHiBlue\n\tFgHiMagenta\n\tFgHiCyan\n\tFgHiWhite\n)\n\n// Background text colors\nconst (\n\tBgBlack Attribute = iota + 40\n\tBgRed\n\tBgGreen\n\tBgYellow\n\tBgBlue\n\tBgMagenta\n\tBgCyan\n\tBgWhite\n)\n\n// Background Hi-Intensity text colors\nconst (\n\tBgHiBlack Attribute = iota + 100\n\tBgHiRed\n\tBgHiGreen\n\tBgHiYellow\n\tBgHiBlue\n\tBgHiMagenta\n\tBgHiCyan\n\tBgHiWhite\n)\n\n// New returns a newly created color object.\nfunc New(value ...Attribute) *Color {\n\tc := &Color{params: make([]Attribute, 0)}\n\tc.Add(value...)\n\treturn c\n}\n\n// Set sets the given parameters immediately. It will change the color of\n// output with the given SGR parameters until color.Unset() is called.\nfunc Set(p ...Attribute) *Color {\n\tc := New(p...)\n\tc.Set()\n\treturn c\n}\n\n// Unset resets all escape attributes and clears the output. Usually should\n// be called after Set().\nfunc Unset() {\n\tif NoColor {\n\t\treturn\n\t}\n\n\tfmt.Fprintf(Output, \"%s[%dm\", escape, Reset)\n}\n\n// Set sets the SGR sequence.\nfunc (c *Color) Set() *Color {\n\tif c.isNoColorSet() {\n\t\treturn c\n\t}\n\n\tfmt.Fprintf(Output, c.format())\n\treturn c\n}\n\nfunc (c *Color) unset() {\n\tif c.isNoColorSet() {\n\t\treturn\n\t}\n\n\tUnset()\n}\n\nfunc (c *Color) setWriter(w io.Writer) *Color {\n\tif c.isNoColorSet() {\n\t\treturn c\n\t}\n\n\tfmt.Fprintf(w, c.format())\n\treturn c\n}\n\nfunc (c *Color) unsetWriter(w io.Writer) {\n\tif c.isNoColorSet() {\n\t\treturn\n\t}\n\n\tif NoColor {\n\t\treturn\n\t}\n\n\tfmt.Fprintf(w, \"%s[%dm\", escape, Reset)\n}\n\n// Add is used to chain SGR parameters. Use as many as parameters to combine\n// and create custom color objects. Example: Add(color.FgRed, color.Underline).\nfunc (c *Color) Add(value ...Attribute) *Color {\n\tc.params = append(c.params, value...)\n\treturn c\n}\n\nfunc (c *Color) prepend(value Attribute) {\n\tc.params = append(c.params, 0)\n\tcopy(c.params[1:], c.params[0:])\n\tc.params[0] = value\n}\n\n// Fprint formats using the default formats for its operands and writes to w.\n// Spaces are added between operands when neither is a string.\n// It returns the number of bytes written and any write error encountered.\n// On Windows, users should wrap w with colorable.NewColorable() if w is of\n// type *os.File.\nfunc (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) {\n\tc.setWriter(w)\n\tdefer c.unsetWriter(w)\n\n\treturn fmt.Fprint(w, a...)\n}\n\n// Print formats using the default formats for its operands and writes to\n// standard output. Spaces are added between operands when neither is a\n// string. It returns the number of bytes written and any write error\n// encountered. This is the standard fmt.Print() method wrapped with the given\n// color.\nfunc (c *Color) Print(a ...interface{}) (n int, err error) {\n\tc.Set()\n\tdefer c.unset()\n\n\treturn fmt.Fprint(Output, a...)\n}\n\n// Fprintf formats according to a format specifier and writes to w.\n// It returns the number of bytes written and any write error encountered.\n// On Windows, users should wrap w with colorable.NewColorable() if w is of\n// type *os.File.\nfunc (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {\n\tc.setWriter(w)\n\tdefer c.unsetWriter(w)\n\n\treturn fmt.Fprintf(w, format, a...)\n}\n\n// Printf formats according to a format specifier and writes to standard output.\n// It returns the number of bytes written and any write error encountered.\n// This is the standard fmt.Printf() method wrapped with the given color.\nfunc (c *Color) Printf(format string, a ...interface{}) (n int, err error) {\n\tc.Set()\n\tdefer c.unset()\n\n\treturn fmt.Fprintf(Output, format, a...)\n}\n\n// Fprintln formats using the default formats for its operands and writes to w.\n// Spaces are always added between operands and a newline is appended.\n// On Windows, users should wrap w with colorable.NewColorable() if w is of\n// type *os.File.\nfunc (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) {\n\tc.setWriter(w)\n\tdefer c.unsetWriter(w)\n\n\treturn fmt.Fprintln(w, a...)\n}\n\n// Println formats using the default formats for its operands and writes to\n// standard output. Spaces are always added between operands and a newline is\n// appended. It returns the number of bytes written and any write error\n// encountered. This is the standard fmt.Print() method wrapped with the given\n// color.\nfunc (c *Color) Println(a ...interface{}) (n int, err error) {\n\tc.Set()\n\tdefer c.unset()\n\n\treturn fmt.Fprintln(Output, a...)\n}\n\n// Sprint is just like Print, but returns a string instead of printing it.\nfunc (c *Color) Sprint(a ...interface{}) string {\n\treturn c.wrap(fmt.Sprint(a...))\n}\n\n// Sprintln is just like Println, but returns a string instead of printing it.\nfunc (c *Color) Sprintln(a ...interface{}) string {\n\treturn c.wrap(fmt.Sprintln(a...))\n}\n\n// Sprintf is just like Printf, but returns a string instead of printing it.\nfunc (c *Color) Sprintf(format string, a ...interface{}) string {\n\treturn c.wrap(fmt.Sprintf(format, a...))\n}\n\n// FprintFunc returns a new function that prints the passed arguments as\n// colorized with color.Fprint().\nfunc (c *Color) FprintFunc() func(w io.Writer, a ...interface{}) {\n\treturn func(w io.Writer, a ...interface{}) {\n\t\tc.Fprint(w, a...)\n\t}\n}\n\n// PrintFunc returns a new function that prints the passed arguments as\n// colorized with color.Print().\nfunc (c *Color) PrintFunc() func(a ...interface{}) {\n\treturn func(a ...interface{}) {\n\t\tc.Print(a...)\n\t}\n}\n\n// FprintfFunc returns a new function that prints the passed arguments as\n// colorized with color.Fprintf().\nfunc (c *Color) FprintfFunc() func(w io.Writer, format string, a ...interface{}) {\n\treturn func(w io.Writer, format string, a ...interface{}) {\n\t\tc.Fprintf(w, format, a...)\n\t}\n}\n\n// PrintfFunc returns a new function that prints the passed arguments as\n// colorized with color.Printf().\nfunc (c *Color) PrintfFunc() func(format string, a ...interface{}) {\n\treturn func(format string, a ...interface{}) {\n\t\tc.Printf(format, a...)\n\t}\n}\n\n// FprintlnFunc returns a new function that prints the passed arguments as\n// colorized with color.Fprintln().\nfunc (c *Color) FprintlnFunc() func(w io.Writer, a ...interface{}) {\n\treturn func(w io.Writer, a ...interface{}) {\n\t\tc.Fprintln(w, a...)\n\t}\n}\n\n// PrintlnFunc returns a new function that prints the passed arguments as\n// colorized with color.Println().\nfunc (c *Color) PrintlnFunc() func(a ...interface{}) {\n\treturn func(a ...interface{}) {\n\t\tc.Println(a...)\n\t}\n}\n\n// SprintFunc returns a new function that returns colorized strings for the\n// given arguments with fmt.Sprint(). Useful to put into or mix into other\n// string. Windows users should use this in conjunction with color.Output, example:\n//\n//\tput := New(FgYellow).SprintFunc()\n//\tfmt.Fprintf(color.Output, \"This is a %s\", put(\"warning\"))\nfunc (c *Color) SprintFunc() func(a ...interface{}) string {\n\treturn func(a ...interface{}) string {\n\t\treturn c.wrap(fmt.Sprint(a...))\n\t}\n}\n\n// SprintfFunc returns a new function that returns colorized strings for the\n// given arguments with fmt.Sprintf(). Useful to put into or mix into other\n// string. Windows users should use this in conjunction with color.Output.\nfunc (c *Color) SprintfFunc() func(format string, a ...interface{}) string {\n\treturn func(format string, a ...interface{}) string {\n\t\treturn c.wrap(fmt.Sprintf(format, a...))\n\t}\n}\n\n// SprintlnFunc returns a new function that returns colorized strings for the\n// given arguments with fmt.Sprintln(). Useful to put into or mix into other\n// string. Windows users should use this in conjunction with color.Output.\nfunc (c *Color) SprintlnFunc() func(a ...interface{}) string {\n\treturn func(a ...interface{}) string {\n\t\treturn c.wrap(fmt.Sprintln(a...))\n\t}\n}\n\n// sequence returns a formated SGR sequence to be plugged into a \"\\x1b[...m\"\n// an example output might be: \"1;36\" -> bold cyan\nfunc (c *Color) sequence() string {\n\tformat := make([]string, len(c.params))\n\tfor i, v := range c.params {\n\t\tformat[i] = strconv.Itoa(int(v))\n\t}\n\n\treturn strings.Join(format, \";\")\n}\n\n// wrap wraps the s string with the colors attributes. The string is ready to\n// be printed.\nfunc (c *Color) wrap(s string) string {\n\tif c.isNoColorSet() {\n\t\treturn s\n\t}\n\n\treturn c.format() + s + c.unformat()\n}\n\nfunc (c *Color) format() string {\n\treturn fmt.Sprintf(\"%s[%sm\", escape, c.sequence())\n}\n\nfunc (c *Color) unformat() string {\n\treturn fmt.Sprintf(\"%s[%dm\", escape, Reset)\n}\n\n// DisableColor disables the color output. Useful to not change any existing\n// code and still being able to output. Can be used for flags like\n// \"--no-color\". To enable back use EnableColor() method.\nfunc (c *Color) DisableColor() {\n\tc.noColor = boolPtr(true)\n}\n\n// EnableColor enables the color output. Use it in conjunction with\n// DisableColor(). Otherwise this method has no side effects.\nfunc (c *Color) EnableColor() {\n\tc.noColor = boolPtr(false)\n}\n\nfunc (c *Color) isNoColorSet() bool {\n\t// check first if we have user setted action\n\tif c.noColor != nil {\n\t\treturn *c.noColor\n\t}\n\n\t// if not return the global option, which is disabled by default\n\treturn NoColor\n}\n\n// Equals returns a boolean value indicating whether two colors are equal.\nfunc (c *Color) Equals(c2 *Color) bool {\n\tif len(c.params) != len(c2.params) {\n\t\treturn false\n\t}\n\n\tfor _, attr := range c.params {\n\t\tif !c2.attrExists(attr) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc (c *Color) attrExists(a Attribute) bool {\n\tfor _, attr := range c.params {\n\t\tif attr == a {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc boolPtr(v bool) *bool {\n\treturn &v\n}\n\nfunc getCachedColor(p Attribute) *Color {\n\tcolorsCacheMu.Lock()\n\tdefer colorsCacheMu.Unlock()\n\n\tc, ok := colorsCache[p]\n\tif !ok {\n\t\tc = New(p)\n\t\tcolorsCache[p] = c\n\t}\n\n\treturn c\n}\n\nfunc colorPrint(format string, p Attribute, a ...interface{}) {\n\tc := getCachedColor(p)\n\n\tif !strings.HasSuffix(format, \"\\n\") {\n\t\tformat += \"\\n\"\n\t}\n\n\tif len(a) == 0 {\n\t\tc.Print(format)\n\t} else {\n\t\tc.Printf(format, a...)\n\t}\n}\n\nfunc colorString(format string, p Attribute, a ...interface{}) string {\n\tc := getCachedColor(p)\n\n\tif len(a) == 0 {\n\t\treturn c.SprintFunc()(format)\n\t}\n\n\treturn c.SprintfFunc()(format, a...)\n}\n\n// Black is an convenient helper function to print with black foreground. A\n// newline is appended to format by default.\nfunc Black(format string, a ...interface{}) { colorPrint(format, FgBlack, a...) }\n\n// Red is an convenient helper function to print with red foreground. A\n// newline is appended to format by default.\nfunc Red(format string, a ...interface{}) { colorPrint(format, FgRed, a...) }\n\n// Green is an convenient helper function to print with green foreground. A\n// newline is appended to format by default.\nfunc Green(format string, a ...interface{}) { colorPrint(format, FgGreen, a...) }\n\n// Yellow is an convenient helper function to print with yellow foreground.\n// A newline is appended to format by default.\nfunc Yellow(format string, a ...interface{}) { colorPrint(format, FgYellow, a...) }\n\n// Blue is an convenient helper function to print with blue foreground. A\n// newline is appended to format by default.\nfunc Blue(format string, a ...interface{}) { colorPrint(format, FgBlue, a...) }\n\n// Magenta is an convenient helper function to print with magenta foreground.\n// A newline is appended to format by default.\nfunc Magenta(format string, a ...interface{}) { colorPrint(format, FgMagenta, a...) }\n\n// Cyan is an convenient helper function to print with cyan foreground. A\n// newline is appended to format by default.\nfunc Cyan(format string, a ...interface{}) { colorPrint(format, FgCyan, a...) }\n\n// White is an convenient helper function to print with white foreground. A\n// newline is appended to format by default.\nfunc White(format string, a ...interface{}) { colorPrint(format, FgWhite, a...) }\n\n// BlackString is an convenient helper function to return a string with black\n// foreground.\nfunc BlackString(format string, a ...interface{}) string { return colorString(format, FgBlack, a...) }\n\n// RedString is an convenient helper function to return a string with red\n// foreground.\nfunc RedString(format string, a ...interface{}) string { return colorString(format, FgRed, a...) }\n\n// GreenString is an convenient helper function to return a string with green\n// foreground.\nfunc GreenString(format string, a ...interface{}) string { return colorString(format, FgGreen, a...) }\n\n// YellowString is an convenient helper function to return a string with yellow\n// foreground.\nfunc YellowString(format string, a ...interface{}) string { return colorString(format, FgYellow, a...) }\n\n// BlueString is an convenient helper function to return a string with blue\n// foreground.\nfunc BlueString(format string, a ...interface{}) string { return colorString(format, FgBlue, a...) }\n\n// MagentaString is an convenient helper function to return a string with magenta\n// foreground.\nfunc MagentaString(format string, a ...interface{}) string {\n\treturn colorString(format, FgMagenta, a...)\n}\n\n// CyanString is an convenient helper function to return a string with cyan\n// foreground.\nfunc CyanString(format string, a ...interface{}) string { return colorString(format, FgCyan, a...) }\n\n// WhiteString is an convenient helper function to return a string with white\n// foreground.\nfunc WhiteString(format string, a ...interface{}) string { return colorString(format, FgWhite, a...) }\n"
  },
  {
    "path": "vendor/github.com/fatih/color/doc.go",
    "content": "/*\nPackage color is an ANSI color package to output colorized or SGR defined\noutput to the standard output. The API can be used in several way, pick one\nthat suits you.\n\nUse simple and default helper functions with predefined foreground colors:\n\n    color.Cyan(\"Prints text in cyan.\")\n\n    // a newline will be appended automatically\n    color.Blue(\"Prints %s in blue.\", \"text\")\n\n    // More default foreground colors..\n    color.Red(\"We have red\")\n    color.Yellow(\"Yellow color too!\")\n    color.Magenta(\"And many others ..\")\n\nHowever there are times where custom color mixes are required. Below are some\nexamples to create custom color objects and use the print functions of each\nseparate color object.\n\n    // Create a new color object\n    c := color.New(color.FgCyan).Add(color.Underline)\n    c.Println(\"Prints cyan text with an underline.\")\n\n    // Or just add them to New()\n    d := color.New(color.FgCyan, color.Bold)\n    d.Printf(\"This prints bold cyan %s\\n\", \"too!.\")\n\n\n    // Mix up foreground and background colors, create new mixes!\n    red := color.New(color.FgRed)\n\n    boldRed := red.Add(color.Bold)\n    boldRed.Println(\"This will print text in bold red.\")\n\n    whiteBackground := red.Add(color.BgWhite)\n    whiteBackground.Println(\"Red text with White background.\")\n\n    // Use your own io.Writer output\n    color.New(color.FgBlue).Fprintln(myWriter, \"blue color!\")\n\n    blue := color.New(color.FgBlue)\n    blue.Fprint(myWriter, \"This will print text in blue.\")\n\nYou can create PrintXxx functions to simplify even more:\n\n    // Create a custom print function for convenient\n    red := color.New(color.FgRed).PrintfFunc()\n    red(\"warning\")\n    red(\"error: %s\", err)\n\n    // Mix up multiple attributes\n    notice := color.New(color.Bold, color.FgGreen).PrintlnFunc()\n    notice(\"don't forget this...\")\n\nYou can also FprintXxx functions to pass your own io.Writer:\n\n    blue := color.New(FgBlue).FprintfFunc()\n    blue(myWriter, \"important notice: %s\", stars)\n\n    // Mix up with multiple attributes\n    success := color.New(color.Bold, color.FgGreen).FprintlnFunc()\n    success(myWriter, don't forget this...\")\n\n\nOr create SprintXxx functions to mix strings with other non-colorized strings:\n\n    yellow := New(FgYellow).SprintFunc()\n    red := New(FgRed).SprintFunc()\n\n    fmt.Printf(\"this is a %s and this is %s.\\n\", yellow(\"warning\"), red(\"error\"))\n\n    info := New(FgWhite, BgGreen).SprintFunc()\n    fmt.Printf(\"this %s rocks!\\n\", info(\"package\"))\n\nWindows support is enabled by default. All Print functions works as intended.\nHowever only for color.SprintXXX functions, user should use fmt.FprintXXX and\nset the output to color.Output:\n\n    fmt.Fprintf(color.Output, \"Windows support: %s\", color.GreenString(\"PASS\"))\n\n    info := New(FgWhite, BgGreen).SprintFunc()\n    fmt.Fprintf(color.Output, \"this %s rocks!\\n\", info(\"package\"))\n\nUsing with existing code is possible. Just use the Set() method to set the\nstandard output to the given parameters. That way a rewrite of an existing\ncode is not required.\n\n    // Use handy standard colors.\n    color.Set(color.FgYellow)\n\n    fmt.Println(\"Existing text will be now in Yellow\")\n    fmt.Printf(\"This one %s\\n\", \"too\")\n\n    color.Unset() // don't forget to unset\n\n    // You can mix up parameters\n    color.Set(color.FgMagenta, color.Bold)\n    defer color.Unset() // use it in your function\n\n    fmt.Println(\"All text will be now bold magenta.\")\n\nThere might be a case where you want to disable color output (for example to\npipe the standard output of your app to somewhere else). `Color` has support to\ndisable colors both globally and for single color definition. For example\nsuppose you have a CLI app and a `--no-color` bool flag. You can easily disable\nthe color output with:\n\n    var flagNoColor = flag.Bool(\"no-color\", false, \"Disable color output\")\n\n    if *flagNoColor {\n    \tcolor.NoColor = true // disables colorized output\n    }\n\nIt also has support for single color definitions (local). You can\ndisable/enable color output on the fly:\n\n     c := color.New(color.FgCyan)\n     c.Println(\"Prints cyan text\")\n\n     c.DisableColor()\n     c.Println(\"This is printed without any color\")\n\n     c.EnableColor()\n     c.Println(\"This prints again cyan...\")\n*/\npackage color\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Felix Lange\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": "vendor/github.com/fjl/memsize/bitmap.go",
    "content": "package memsize\n\nimport (\n\t\"math/bits\"\n)\n\nconst (\n\tuintptrBits  = 32 << (uint64(^uintptr(0)) >> 63)\n\tuintptrBytes = uintptrBits / 8\n\tbmBlockRange = 1 * 1024 * 1024 // bytes covered by bmBlock\n\tbmBlockWords = bmBlockRange / uintptrBits\n)\n\n// bitmap is a sparse bitmap.\ntype bitmap struct {\n\tblocks map[uintptr]*bmBlock\n}\n\nfunc newBitmap() *bitmap {\n\treturn &bitmap{make(map[uintptr]*bmBlock)}\n}\n\n// markRange sets n consecutive bits starting at addr.\nfunc (b *bitmap) markRange(addr, n uintptr) {\n\tfor end := addr + n; addr < end; {\n\t\tblock, baddr := b.block(addr)\n\t\tfor i := baddr; i < bmBlockRange && addr < end; i++ {\n\t\t\tblock.mark(i)\n\t\t\taddr++\n\t\t}\n\t}\n}\n\n// isMarked returns the value of the bit at the given address.\nfunc (b *bitmap) isMarked(addr uintptr) bool {\n\tblock, baddr := b.block(addr)\n\treturn block.isMarked(baddr)\n}\n\n// countRange returns the number of set bits in the range (addr,addr+n).\nfunc (b *bitmap) countRange(addr, n uintptr) uintptr {\n\tc := uintptr(0)\n\tfor end := addr + n; addr < end; {\n\t\tblock, baddr := b.block(addr)\n\t\tbend := uintptr(bmBlockRange - 1)\n\t\tif baddr+(end-addr) < bmBlockRange {\n\t\t\tbend = baddr + (end - addr)\n\t\t}\n\t\tc += uintptr(block.count(baddr, bend))\n\t\t// Move addr to next block.\n\t\taddr += bmBlockRange - baddr\n\t}\n\treturn c\n}\n\n// block finds the block corresponding to the given memory address.\n// It also returns the block's starting address.\nfunc (b *bitmap) block(addr uintptr) (*bmBlock, uintptr) {\n\tindex := addr / bmBlockRange\n\tblock := b.blocks[index]\n\tif block == nil {\n\t\tblock = new(bmBlock)\n\t\tb.blocks[index] = block\n\t}\n\treturn block, addr % bmBlockRange\n}\n\n// size returns the sum of the byte sizes of all blocks.\nfunc (b *bitmap) size() uintptr {\n\treturn uintptr(len(b.blocks)) * bmBlockWords * uintptrBytes\n}\n\n// utilization returns the mean percentage of one bits across all blocks.\nfunc (b *bitmap) utilization() float32 {\n\tvar avg float32\n\tfor _, block := range b.blocks {\n\t\tavg += float32(block.count(0, bmBlockRange-1)) / float32(bmBlockRange)\n\t}\n\treturn avg / float32(len(b.blocks))\n}\n\n// bmBlock is a bitmap block.\ntype bmBlock [bmBlockWords]uintptr\n\n// mark sets the i'th bit to one.\nfunc (b *bmBlock) mark(i uintptr) {\n\tb[i/uintptrBits] |= 1 << (i % uintptrBits)\n}\n\n// isMarked returns the value of the i'th bit.\nfunc (b *bmBlock) isMarked(i uintptr) bool {\n\treturn (b[i/uintptrBits] & (1 << (i % uintptrBits))) != 0\n}\n\n// count returns the number of set bits in the range (start,end).\nfunc (b *bmBlock) count(start, end uintptr) (count int) {\n\tbr := b[start/uintptrBits : end/uintptrBits+1]\n\tfor i, w := range br {\n\t\tif i == 0 {\n\t\t\tw &= blockmask(start)\n\t\t}\n\t\tif i == len(br)-1 {\n\t\t\tw &^= blockmask(end)\n\t\t}\n\t\tcount += onesCountPtr(w)\n\t}\n\treturn count\n}\n\nfunc blockmask(x uintptr) uintptr {\n\treturn ^uintptr(0) << (x % uintptrBits)\n}\n\nfunc onesCountPtr(x uintptr) int {\n\tif uintptrBits == 64 {\n\t\treturn bits.OnesCount64(uint64(x))\n\t}\n\treturn bits.OnesCount32(uint32(x))\n}\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/doc.go",
    "content": "/*\nPackage memsize computes the size of your object graph.\n\nSo you made a spiffy algorithm and it works really well, but geez it's using\nway too much memory. Where did it all go? memsize to the rescue!\n\nTo get started, find a value that references all your objects and scan it.\nThis traverses the graph, counting sizes per type.\n\n    sizes := memsize.Scan(myValue)\n    fmt.Println(sizes.Total)\n\nmemsize can handle cycles just fine and tracks both private and public struct fields.\nUnfortunately function closures cannot be inspected in any way.\n*/\npackage memsize\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/memsize.go",
    "content": "package memsize\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\t\"unsafe\"\n)\n\n// Scan traverses all objects reachable from v and counts how much memory\n// is used per type. The value must be a non-nil pointer to any value.\nfunc Scan(v interface{}) Sizes {\n\trv := reflect.ValueOf(v)\n\tif rv.Kind() != reflect.Ptr || rv.IsNil() {\n\t\tpanic(\"value to scan must be non-nil pointer\")\n\t}\n\n\tstopTheWorld(\"memsize scan\")\n\tdefer startTheWorld()\n\n\tctx := newContext()\n\tctx.scan(invalidAddr, rv, false)\n\tctx.s.BitmapSize = ctx.seen.size()\n\tctx.s.BitmapUtilization = ctx.seen.utilization()\n\treturn *ctx.s\n}\n\n// Sizes is the result of a scan.\ntype Sizes struct {\n\tTotal  uintptr\n\tByType map[reflect.Type]*TypeSize\n\t// Internal stats (for debugging)\n\tBitmapSize        uintptr\n\tBitmapUtilization float32\n}\n\ntype TypeSize struct {\n\tTotal uintptr\n\tCount uintptr\n}\n\nfunc newSizes() *Sizes {\n\treturn &Sizes{ByType: make(map[reflect.Type]*TypeSize)}\n}\n\n// Report returns a human-readable report.\nfunc (s Sizes) Report() string {\n\ttype typLine struct {\n\t\tname  string\n\t\tcount uintptr\n\t\ttotal uintptr\n\t}\n\ttab := []typLine{{\"ALL\", 0, s.Total}}\n\tfor _, typ := range s.ByType {\n\t\ttab[0].count += typ.Count\n\t}\n\tmaxname := 0\n\tfor typ, s := range s.ByType {\n\t\tline := typLine{typ.String(), s.Count, s.Total}\n\t\ttab = append(tab, line)\n\t\tif len(line.name) > maxname {\n\t\t\tmaxname = len(line.name)\n\t\t}\n\t}\n\tsort.Slice(tab, func(i, j int) bool { return tab[i].total > tab[j].total })\n\n\tbuf := new(bytes.Buffer)\n\tw := tabwriter.NewWriter(buf, 0, 0, 0, ' ', tabwriter.AlignRight)\n\tfor _, line := range tab {\n\t\tnamespace := strings.Repeat(\" \", maxname-len(line.name))\n\t\tfmt.Fprintf(w, \"%s%s\\t  %v\\t  %s\\t\\n\", line.name, namespace, line.count, HumanSize(line.total))\n\t}\n\tw.Flush()\n\treturn buf.String()\n}\n\n// addValue is called during scan and adds the memory of given object.\nfunc (s *Sizes) addValue(v reflect.Value, size uintptr) {\n\ts.Total += size\n\trs := s.ByType[v.Type()]\n\tif rs == nil {\n\t\trs = new(TypeSize)\n\t\ts.ByType[v.Type()] = rs\n\t}\n\trs.Total += size\n\trs.Count++\n}\n\ntype context struct {\n\t// We track previously scanned objects to prevent infinite loops\n\t// when scanning cycles and to prevent counting objects more than once.\n\tseen *bitmap\n\ttc   typCache\n\ts    *Sizes\n}\n\nfunc newContext() *context {\n\treturn &context{seen: newBitmap(), tc: make(typCache), s: newSizes()}\n}\n\n// scan walks all objects below v, determining their size. All scan* functions return the\n// amount of 'extra' memory (e.g. slice data) that is referenced by the object.\nfunc (c *context) scan(addr address, v reflect.Value, add bool) (extraSize uintptr) {\n\tsize := v.Type().Size()\n\tvar marked uintptr\n\tif addr.valid() {\n\t\tmarked = c.seen.countRange(uintptr(addr), size)\n\t\tif marked == size {\n\t\t\treturn 0 // Skip if we have already seen the whole object.\n\t\t}\n\t\tc.seen.markRange(uintptr(addr), size)\n\t}\n\t// fmt.Printf(\"%v: %v ⮑ (marked %d)\\n\", addr, v.Type(), marked)\n\tif c.tc.needScan(v.Type()) {\n\t\textraSize = c.scanContent(addr, v)\n\t}\n\t// fmt.Printf(\"%v: %v %d (add %v, size %d, marked %d, extra %d)\\n\", addr, v.Type(), size+extraSize, add, v.Type().Size(), marked, extraSize)\n\tif add {\n\t\tsize -= marked\n\t\tsize += extraSize\n\t\tc.s.addValue(v, size)\n\t}\n\treturn extraSize\n}\n\nfunc (c *context) scanContent(addr address, v reflect.Value) uintptr {\n\tswitch v.Kind() {\n\tcase reflect.Array:\n\t\treturn c.scanArray(addr, v)\n\tcase reflect.Chan:\n\t\treturn c.scanChan(v)\n\tcase reflect.Func:\n\t\t// can't do anything here\n\t\treturn 0\n\tcase reflect.Interface:\n\t\treturn c.scanInterface(v)\n\tcase reflect.Map:\n\t\treturn c.scanMap(v)\n\tcase reflect.Ptr:\n\t\tif !v.IsNil() {\n\t\t\tc.scan(address(v.Pointer()), v.Elem(), true)\n\t\t}\n\t\treturn 0\n\tcase reflect.Slice:\n\t\treturn c.scanSlice(v)\n\tcase reflect.String:\n\t\treturn uintptr(v.Len())\n\tcase reflect.Struct:\n\t\treturn c.scanStruct(addr, v)\n\tdefault:\n\t\tunhandledKind(v.Kind())\n\t\treturn 0\n\t}\n}\n\nfunc (c *context) scanChan(v reflect.Value) uintptr {\n\tetyp := v.Type().Elem()\n\textra := uintptr(0)\n\tif c.tc.needScan(etyp) {\n\t\t// Scan the channel buffer. This is unsafe but doesn't race because\n\t\t// the world is stopped during scan.\n\t\thchan := unsafe.Pointer(v.Pointer())\n\t\tfor i := uint(0); i < uint(v.Cap()); i++ {\n\t\t\taddr := chanbuf(hchan, i)\n\t\t\telem := reflect.NewAt(etyp, addr).Elem()\n\t\t\textra += c.scanContent(address(addr), elem)\n\t\t}\n\t}\n\treturn uintptr(v.Cap())*etyp.Size() + extra\n}\n\nfunc (c *context) scanStruct(base address, v reflect.Value) uintptr {\n\textra := uintptr(0)\n\tfor i := 0; i < v.NumField(); i++ {\n\t\tf := v.Type().Field(i)\n\t\tif c.tc.needScan(f.Type) {\n\t\t\taddr := base.addOffset(f.Offset)\n\t\t\textra += c.scanContent(addr, v.Field(i))\n\t\t}\n\t}\n\treturn extra\n}\n\nfunc (c *context) scanArray(addr address, v reflect.Value) uintptr {\n\tesize := v.Type().Elem().Size()\n\textra := uintptr(0)\n\tfor i := 0; i < v.Len(); i++ {\n\t\textra += c.scanContent(addr, v.Index(i))\n\t\taddr = addr.addOffset(esize)\n\t}\n\treturn extra\n}\n\nfunc (c *context) scanSlice(v reflect.Value) uintptr {\n\tslice := v.Slice(0, v.Cap())\n\tesize := slice.Type().Elem().Size()\n\tbase := slice.Pointer()\n\t// Add size of the unscanned portion of the backing array to extra.\n\tblen := uintptr(slice.Len()) * esize\n\tmarked := c.seen.countRange(base, blen)\n\textra := blen - marked\n\tc.seen.markRange(uintptr(base), blen)\n\tif c.tc.needScan(slice.Type().Elem()) {\n\t\t// Elements may contain pointers, scan them individually.\n\t\taddr := address(base)\n\t\tfor i := 0; i < slice.Len(); i++ {\n\t\t\textra += c.scanContent(addr, slice.Index(i))\n\t\t\taddr = addr.addOffset(esize)\n\t\t}\n\t}\n\treturn extra\n}\n\nfunc (c *context) scanMap(v reflect.Value) uintptr {\n\tvar (\n\t\ttyp   = v.Type()\n\t\tlen   = uintptr(v.Len())\n\t\textra = uintptr(0)\n\t)\n\tif c.tc.needScan(typ.Key()) || c.tc.needScan(typ.Elem()) {\n\t\tfor _, k := range v.MapKeys() {\n\t\t\textra += c.scan(invalidAddr, k, false)\n\t\t\textra += c.scan(invalidAddr, v.MapIndex(k), false)\n\t\t}\n\t}\n\treturn len*typ.Key().Size() + len*typ.Elem().Size() + extra\n}\n\nfunc (c *context) scanInterface(v reflect.Value) uintptr {\n\telem := v.Elem()\n\tif !elem.IsValid() {\n\t\treturn 0 // nil interface\n\t}\n\tc.scan(invalidAddr, elem, false)\n\tif !c.tc.isPointer(elem.Type()) {\n\t\t// Account for non-pointer size of the value.\n\t\treturn elem.Type().Size()\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/memsizeui/template.go",
    "content": "package memsizeui\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\t\"sync\"\n\n\t\"github.com/fjl/memsize\"\n)\n\nvar (\n\tbase         *template.Template // the \"base\" template\n\tbaseInitOnce sync.Once\n)\n\nfunc baseInit() {\n\tbase = template.Must(template.New(\"base\").Parse(`<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<title>memsize</title>\n\t\t<style>\n\t\tbody {\n\t\t\t font-family: sans-serif;\n\t\t}\n\t\tbutton, .button {\n\t\t\t display: inline-block;\n\t\t\t font-weight: bold;\n\t\t\t color: black;\n\t\t\t text-decoration: none;\n\t\t\t font-size: inherit;\n\t\t\t padding: 3pt;\n\t\t\t margin: 3pt;\n\t\t\t background-color: #eee;\n\t\t\t border: 1px solid #999;\n\t\t\t border-radius: 2pt;\n\t\t}\n\t\tform.inline {\n\t\t\tdisplay: inline-block;\n\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t{{template \"content\" .}}\n\t</body>\n</html>`))\n\n\tbase.Funcs(template.FuncMap{\n\t\t\"quote\":     strconv.Quote,\n\t\t\"humansize\": memsize.HumanSize,\n\t})\n\n\ttemplate.Must(base.New(\"rootbuttons\").Parse(`\n<a class=\"button\" href=\"{{$.Link \"\"}}\">Overview</a>\n{{- range $root := .Roots -}}\n<form class=\"inline\" method=\"POST\" action=\"{{$.Link \"scan?root=\" $root}}\">\n\t<button type=\"submit\">Scan {{quote $root}}</button>\n</form>\n{{- end -}}`))\n}\n\nfunc contentTemplate(source string) *template.Template {\n\tbaseInitOnce.Do(baseInit)\n\tt := template.Must(base.Clone())\n\ttemplate.Must(t.New(\"content\").Parse(source))\n\treturn t\n}\n\nvar rootTemplate = contentTemplate(`\n<h1>Memsize</h1>\n{{template \"rootbuttons\" .}}\n<hr/>\n<h3>Reports</h3>\n<ul>\n\t{{range .Reports}}\n\t\t<li><a href=\"{{printf \"%d\" | $.Link \"report/\"}}\">{{quote .RootName}} @ {{.Date}}</a></li>\n\t{{else}}\n\t\tNo reports yet, hit a scan button to create one.\n\t{{end}}\n</ul>\n`)\n\nvar notFoundTemplate = contentTemplate(`\n<h1>{{.Data}}</h1>\n{{template \"rootbuttons\" .}}\n`)\n\nvar reportTemplate = contentTemplate(`\n{{- $report := .Data -}}\n<h1>Memsize Report {{$report.ID}}</h1>\n<form method=\"POST\" action=\"{{$.Link \"scan?root=\" $report.RootName}}\">\n\t<a class=\"button\" href=\"{{$.Link \"\"}}\">Overview</a>\n\t<button type=\"submit\">Scan Again</button>\n</form>\n<pre>\nRoot: {{quote $report.RootName}}\nDate: {{$report.Date}}\nDuration: {{$report.Duration}}\nBitmap Size: {{$report.Sizes.BitmapSize | humansize}}\nBitmap Utilization: {{$report.Sizes.BitmapUtilization}}\n</pre>\n<hr/>\n<pre>\n{{$report.Sizes.Report}}\n</pre>\n`)\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/memsizeui/ui.go",
    "content": "package memsizeui\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"net/http\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/fjl/memsize\"\n)\n\ntype Handler struct {\n\tinit     sync.Once\n\tmux      http.ServeMux\n\tmu       sync.Mutex\n\treports  map[int]Report\n\troots    map[string]interface{}\n\treportID int\n}\n\ntype Report struct {\n\tID       int\n\tDate     time.Time\n\tDuration time.Duration\n\tRootName string\n\tSizes    memsize.Sizes\n}\n\ntype templateInfo struct {\n\tRoots     []string\n\tReports   map[int]Report\n\tPathDepth int\n\tData      interface{}\n}\n\nfunc (ti *templateInfo) Link(path ...string) string {\n\tprefix := strings.Repeat(\"../\", ti.PathDepth)\n\treturn prefix + strings.Join(path, \"\")\n}\n\nfunc (h *Handler) Add(name string, v interface{}) {\n\trv := reflect.ValueOf(v)\n\tif rv.Kind() != reflect.Ptr || rv.IsNil() {\n\t\tpanic(\"root must be non-nil pointer\")\n\t}\n\th.mu.Lock()\n\tif h.roots == nil {\n\t\th.roots = make(map[string]interface{})\n\t}\n\th.roots[name] = v\n\th.mu.Unlock()\n}\n\nfunc (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n\th.init.Do(func() {\n\t\th.reports = make(map[int]Report)\n\t\th.mux.HandleFunc(\"/\", h.handleRoot)\n\t\th.mux.HandleFunc(\"/scan\", h.handleScan)\n\t\th.mux.HandleFunc(\"/report/\", h.handleReport)\n\t})\n\th.mux.ServeHTTP(w, r)\n}\n\nfunc (h *Handler) templateInfo(r *http.Request, data interface{}) *templateInfo {\n\th.mu.Lock()\n\troots := make([]string, 0, len(h.roots))\n\tfor name := range h.roots {\n\t\troots = append(roots, name)\n\t}\n\th.mu.Unlock()\n\tsort.Strings(roots)\n\n\treturn &templateInfo{\n\t\tRoots:     roots,\n\t\tReports:   h.reports,\n\t\tPathDepth: strings.Count(r.URL.Path, \"/\") - 1,\n\t\tData:      data,\n\t}\n}\n\nfunc (h *Handler) handleRoot(w http.ResponseWriter, r *http.Request) {\n\tif r.URL.Path != \"/\" {\n\t\thttp.NotFound(w, r)\n\t\treturn\n\t}\n\tserveHTML(w, rootTemplate, http.StatusOK, h.templateInfo(r, nil))\n}\n\nfunc (h *Handler) handleScan(w http.ResponseWriter, r *http.Request) {\n\tif r.Method != http.MethodPost {\n\t\thttp.Error(w, \"invalid HTTP method, want POST\", http.StatusMethodNotAllowed)\n\t\treturn\n\t}\n\tti := h.templateInfo(r, \"Unknown root\")\n\tid, ok := h.scan(r.URL.Query().Get(\"root\"))\n\tif !ok {\n\t\tserveHTML(w, notFoundTemplate, http.StatusNotFound, ti)\n\t\treturn\n\t}\n\tw.Header().Add(\"Location\", ti.Link(fmt.Sprintf(\"report/%d\", id)))\n\tw.WriteHeader(http.StatusSeeOther)\n}\n\nfunc (h *Handler) handleReport(w http.ResponseWriter, r *http.Request) {\n\tvar id int\n\tfmt.Sscan(strings.TrimPrefix(r.URL.Path, \"/report/\"), &id)\n\th.mu.Lock()\n\treport, ok := h.reports[id]\n\th.mu.Unlock()\n\n\tif !ok {\n\t\tserveHTML(w, notFoundTemplate, http.StatusNotFound, h.templateInfo(r, \"Report not found\"))\n\t} else {\n\t\tserveHTML(w, reportTemplate, http.StatusOK, h.templateInfo(r, report))\n\t}\n}\n\nfunc (h *Handler) scan(root string) (int, bool) {\n\th.mu.Lock()\n\tdefer h.mu.Unlock()\n\n\tval, ok := h.roots[root]\n\tif !ok {\n\t\treturn 0, false\n\t}\n\tid := h.reportID\n\tstart := time.Now()\n\tsizes := memsize.Scan(val)\n\th.reports[id] = Report{\n\t\tID:       id,\n\t\tRootName: root,\n\t\tDate:     start.Truncate(1 * time.Second),\n\t\tDuration: time.Since(start),\n\t\tSizes:    sizes,\n\t}\n\th.reportID++\n\treturn id, true\n}\n\nfunc serveHTML(w http.ResponseWriter, tpl *template.Template, status int, ti *templateInfo) {\n\tw.Header().Set(\"content-type\", \"text/html\")\n\tvar buf bytes.Buffer\n\tif err := tpl.Execute(&buf, ti); err != nil {\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\tbuf.WriteTo(w)\n}\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/runtimefunc.go",
    "content": "package memsize\n\nimport \"unsafe\"\n\nvar _ = unsafe.Pointer(nil)\n\n//go:linkname stopTheWorld runtime.stopTheWorld\nfunc stopTheWorld(reason string)\n\n//go:linkname startTheWorld runtime.startTheWorld\nfunc startTheWorld()\n\n//go:linkname chanbuf runtime.chanbuf\nfunc chanbuf(ch unsafe.Pointer, i uint) unsafe.Pointer\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/runtimefunc.s",
    "content": "// This file is required to make stub function declarations work.\n"
  },
  {
    "path": "vendor/github.com/fjl/memsize/type.go",
    "content": "package memsize\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n)\n\n// address is a memory location.\n//\n// Code dealing with uintptr is oblivious to the zero address.\n// Code dealing with address is not: it treats the zero address\n// as invalid. Offsetting an invalid address doesn't do anything.\n//\n// This distinction is useful because there are objects that we can't\n// get the pointer to.\ntype address uintptr\n\nconst invalidAddr = address(0)\n\nfunc (a address) valid() bool {\n\treturn a != 0\n}\n\nfunc (a address) addOffset(off uintptr) address {\n\tif !a.valid() {\n\t\treturn invalidAddr\n\t}\n\treturn a + address(off)\n}\n\nfunc (a address) String() string {\n\tif uintptrBits == 32 {\n\t\treturn fmt.Sprintf(\"%#0.8x\", uintptr(a))\n\t}\n\treturn fmt.Sprintf(\"%#0.16x\", uintptr(a))\n}\n\ntype typCache map[reflect.Type]typInfo\n\ntype typInfo struct {\n\tisPointer bool\n\tneedScan  bool\n}\n\n// isPointer returns true for pointer-ish values. The notion of\n// pointer includes everything but plain values, i.e. slices, maps\n// channels, interfaces are 'pointer', too.\nfunc (tc *typCache) isPointer(typ reflect.Type) bool {\n\treturn tc.info(typ).isPointer\n}\n\n// needScan reports whether a value of the type needs to be scanned\n// recursively because it may contain pointers.\nfunc (tc *typCache) needScan(typ reflect.Type) bool {\n\treturn tc.info(typ).needScan\n}\n\nfunc (tc *typCache) info(typ reflect.Type) typInfo {\n\tinfo, found := (*tc)[typ]\n\tswitch {\n\tcase found:\n\t\treturn info\n\tcase isPointer(typ):\n\t\tinfo = typInfo{true, true}\n\tdefault:\n\t\tinfo = typInfo{false, tc.checkNeedScan(typ)}\n\t}\n\t(*tc)[typ] = info\n\treturn info\n}\n\nfunc (tc *typCache) checkNeedScan(typ reflect.Type) bool {\n\tswitch k := typ.Kind(); k {\n\tcase reflect.Struct:\n\t\t// Structs don't need scan if none of their fields need it.\n\t\tfor i := 0; i < typ.NumField(); i++ {\n\t\t\tif tc.needScan(typ.Field(i).Type) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\tcase reflect.Array:\n\t\t// Arrays don't need scan if their element type doesn't.\n\t\treturn tc.needScan(typ.Elem())\n\t}\n\treturn false\n}\n\nfunc isPointer(typ reflect.Type) bool {\n\tk := typ.Kind()\n\tswitch {\n\tcase k <= reflect.Complex128:\n\t\treturn false\n\tcase k == reflect.Array:\n\t\treturn false\n\tcase k >= reflect.Chan && k <= reflect.String:\n\t\treturn true\n\tcase k == reflect.Struct || k == reflect.UnsafePointer:\n\t\treturn false\n\tdefault:\n\t\tunhandledKind(k)\n\t\treturn false\n\t}\n}\n\nfunc unhandledKind(k reflect.Kind) {\n\tpanic(\"unhandled kind \" + k.String())\n}\n\n// HumanSize formats the given number of bytes as a readable string.\nfunc HumanSize(bytes uintptr) string {\n\tswitch {\n\tcase bytes < 1024:\n\t\treturn fmt.Sprintf(\"%d B\", bytes)\n\tcase bytes < 1024*1024:\n\t\treturn fmt.Sprintf(\"%.3f KB\", float64(bytes)/1024)\n\tdefault:\n\t\treturn fmt.Sprintf(\"%.3f MB\", float64(bytes)/1024/1024)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Zack Guo\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"
  },
  {
    "path": "vendor/github.com/gizak/termui/README.md",
    "content": "# termui [![Build Status](https://travis-ci.org/gizak/termui.svg?branch=master)](https://travis-ci.org/gizak/termui) [![Doc Status](https://godoc.org/github.com/gizak/termui?status.png)](https://godoc.org/github.com/gizak/termui)\n\n<img src=\"./_example/dashboard.gif\" alt=\"demo cast under osx 10.10; Terminal.app; Menlo Regular 12pt.)\" width=\"80%\">\n\n`termui` is a cross-platform, easy-to-compile, and fully-customizable terminal dashboard. It is inspired by [blessed-contrib](https://github.com/yaronn/blessed-contrib), but purely in Go.\n\nNow version v2 has arrived! It brings new event system, new theme system, new `Buffer` interface and specific colour text rendering. (some docs are missing, but it will be completed soon!)\n\n## Installation\n\n`master` mirrors v2 branch, to install:\n\n\tgo get -u github.com/gizak/termui\n\nIt is recommanded to use locked deps by using [glide](https://glide.sh): move to `termui` src directory then run `glide up`.\n\nFor the compatible reason, you can choose to install the legacy version of `termui`:\n\n\tgo get gopkg.in/gizak/termui.v1\n\n## Usage\n\n### Layout\n\nTo use `termui`, the very first thing you may want to know is how to manage layout. `termui` offers two ways of doing this, known as absolute layout and grid layout.\n\n__Absolute layout__\n\nEach widget has an underlying block structure which basically is a box model. It has border, label and padding properties. A border of a widget can be chosen to hide or display (with its border label), you can pick a different front/back colour for the border as well. To display such a widget at a specific location in terminal window, you need to assign `.X`, `.Y`, `.Height`, `.Width` values for each widget before sending it to `.Render`. Let's demonstrate these by a code snippet:\n\n`````go\n\timport ui \"github.com/gizak/termui\" // <- ui shortcut, optional\n\n\tfunc main() {\n\t\terr := ui.Init()\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tdefer ui.Close()\n\n\t\tp := ui.NewPar(\":PRESS q TO QUIT DEMO\")\n\t\tp.Height = 3\n\t\tp.Width = 50\n\t\tp.TextFgColor = ui.ColorWhite\n\t\tp.BorderLabel = \"Text Box\"\n\t\tp.BorderFg = ui.ColorCyan\n\n\t\tg := ui.NewGauge()\n\t\tg.Percent = 50\n\t\tg.Width = 50\n\t\tg.Height = 3\n\t\tg.Y = 11\n\t\tg.BorderLabel = \"Gauge\"\n\t\tg.BarColor = ui.ColorRed\n\t\tg.BorderFg = ui.ColorWhite\n\t\tg.BorderLabelFg = ui.ColorCyan\n\n\t\tui.Render(p, g) // feel free to call Render, it's async and non-block\n\n\t\t// event handler...\n\t}\n`````\n\nNote that components can be overlapped (I'd rather call this a feature...), `Render(rs ...Renderer)` renders its args from left to right (i.e. each component's weight is arising from left to right).\n\n__Grid layout:__\n\n<img src=\"./_example/grid.gif\" alt=\"grid\" width=\"60%\">\n\nGrid layout uses [12 columns grid system](http://www.w3schools.com/bootstrap/bootstrap_grid_system.asp) with expressive syntax. To use `Grid`, all we need to do is build a widget tree consisting of `Row`s and `Col`s (Actually a `Col` is also a `Row` but with a widget endpoint attached).\n\n```go\n\timport ui \"github.com/gizak/termui\"\n\t// init and create widgets...\n\n\t// build\n\tui.Body.AddRows(\n\t\tui.NewRow(\n\t\t\tui.NewCol(6, 0, widget0),\n\t\t\tui.NewCol(6, 0, widget1)),\n\t\tui.NewRow(\n\t\t\tui.NewCol(3, 0, widget2),\n\t\t\tui.NewCol(3, 0, widget30, widget31, widget32),\n\t\t\tui.NewCol(6, 0, widget4)))\n\n\t// calculate layout\n\tui.Body.Align()\n\n\tui.Render(ui.Body)\n```\n\n### Events\n\n`termui` ships with a http-like event mux handling system. All events are channeled up from different sources (typing, click, windows resize, custom event) and then encoded as universal `Event` object. `Event.Path` indicates the event type and `Event.Data` stores the event data struct. Add a handler to a certain event is easy as below:\n\n```go\n\t// handle key q pressing\n\tui.Handle(\"/sys/kbd/q\", func(ui.Event) {\n\t\t// press q to quit\n\t\tui.StopLoop()\n\t})\n\n\tui.Handle(\"/sys/kbd/C-x\", func(ui.Event) {\n\t\t// handle Ctrl + x combination\n\t})\n\n\tui.Handle(\"/sys/kbd\", func(ui.Event) {\n\t\t// handle all other key pressing\n\t})\n\n\t// handle a 1s timer\n\tui.Handle(\"/timer/1s\", func(e ui.Event) {\n\t\tt := e.Data.(ui.EvtTimer)\n\t\t// t is a EvtTimer\n\t\tif t.Count%2 ==0 {\n\t\t\t// do something\n\t\t}\n\t})\n\n\tui.Loop() // block until StopLoop is called\n```\n\n### Widgets\n\nClick image to see the corresponding demo codes.\n\n[<img src=\"./_example/par.png\" alt=\"par\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/par.go)\n[<img src=\"./_example/list.png\" alt=\"list\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/list.go)\n[<img src=\"./_example/gauge.png\" alt=\"gauge\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/gauge.go)\n[<img src=\"./_example/linechart.png\" alt=\"linechart\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/linechart.go)\n[<img src=\"./_example/barchart.png\" alt=\"barchart\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/barchart.go)\n[<img src=\"./_example/mbarchart.png\" alt=\"barchart\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/mbarchart.go)\n[<img src=\"./_example/sparklines.png\" alt=\"sparklines\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/sparklines.go)\n[<img src=\"./_example/table.png\" alt=\"table\" type=\"image/png\" width=\"45%\">](https://github.com/gizak/termui/blob/master/_example/table.go)\n\n## GoDoc\n\n[godoc](https://godoc.org/github.com/gizak/termui)\n\n## TODO\n\n- [x] Grid layout\n- [x] Event system\n- [x] Canvas widget\n- [x] Refine APIs\n- [ ] Focusable widgets\n\n## Changelog\n\n## License\nThis library is under the [MIT License](http://opensource.org/licenses/MIT)\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/barchart.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport \"fmt\"\n\n// BarChart creates multiple bars in a widget:\n/*\n   bc := termui.NewBarChart()\n   data := []int{3, 2, 5, 3, 9, 5}\n   bclabels := []string{\"S0\", \"S1\", \"S2\", \"S3\", \"S4\", \"S5\"}\n   bc.BorderLabel = \"Bar Chart\"\n   bc.Data = data\n   bc.Width = 26\n   bc.Height = 10\n   bc.DataLabels = bclabels\n   bc.TextColor = termui.ColorGreen\n   bc.BarColor = termui.ColorRed\n   bc.NumColor = termui.ColorYellow\n*/\ntype BarChart struct {\n\tBlock\n\tBarColor   Attribute\n\tTextColor  Attribute\n\tNumColor   Attribute\n\tData       []int\n\tDataLabels []string\n\tBarWidth   int\n\tBarGap     int\n\tCellChar   rune\n\tlabels     [][]rune\n\tdataNum    [][]rune\n\tnumBar     int\n\tscale      float64\n\tmax        int\n}\n\n// NewBarChart returns a new *BarChart with current theme.\nfunc NewBarChart() *BarChart {\n\tbc := &BarChart{Block: *NewBlock()}\n\tbc.BarColor = ThemeAttr(\"barchart.bar.bg\")\n\tbc.NumColor = ThemeAttr(\"barchart.num.fg\")\n\tbc.TextColor = ThemeAttr(\"barchart.text.fg\")\n\tbc.BarGap = 1\n\tbc.BarWidth = 3\n\tbc.CellChar = ' '\n\treturn bc\n}\n\nfunc (bc *BarChart) layout() {\n\tbc.numBar = bc.innerArea.Dx() / (bc.BarGap + bc.BarWidth)\n\tbc.labels = make([][]rune, bc.numBar)\n\tbc.dataNum = make([][]rune, len(bc.Data))\n\n\tfor i := 0; i < bc.numBar && i < len(bc.DataLabels) && i < len(bc.Data); i++ {\n\t\tbc.labels[i] = trimStr2Runes(bc.DataLabels[i], bc.BarWidth)\n\t\tn := bc.Data[i]\n\t\ts := fmt.Sprint(n)\n\t\tbc.dataNum[i] = trimStr2Runes(s, bc.BarWidth)\n\t}\n\n\t//bc.max = bc.Data[0] //  what if Data is nil? Sometimes when bar graph is nill it produces panic with panic: runtime error: index out of range\n\t// Asign a negative value to get maxvalue auto-populates\n\tif bc.max == 0 {\n\t\tbc.max = -1\n\t}\n\tfor i := 0; i < len(bc.Data); i++ {\n\t\tif bc.max < bc.Data[i] {\n\t\t\tbc.max = bc.Data[i]\n\t\t}\n\t}\n\tbc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-1)\n}\n\nfunc (bc *BarChart) SetMax(max int) {\n\n\tif max > 0 {\n\t\tbc.max = max\n\t}\n}\n\n// Buffer implements Bufferer interface.\nfunc (bc *BarChart) Buffer() Buffer {\n\tbuf := bc.Block.Buffer()\n\tbc.layout()\n\n\tfor i := 0; i < bc.numBar && i < len(bc.Data) && i < len(bc.DataLabels); i++ {\n\t\th := int(float64(bc.Data[i]) / bc.scale)\n\t\toftX := i * (bc.BarWidth + bc.BarGap)\n\n\t\tbarBg := bc.Bg\n\t\tbarFg := bc.BarColor\n\n\t\tif bc.CellChar == ' ' {\n\t\t\tbarBg = bc.BarColor\n\t\t\tbarFg = ColorDefault\n\t\t\tif bc.BarColor == ColorDefault { // the same as above\n\t\t\t\tbarBg |= AttrReverse\n\t\t\t}\n\t\t}\n\n\t\t// plot bar\n\t\tfor j := 0; j < bc.BarWidth; j++ {\n\t\t\tfor k := 0; k < h; k++ {\n\t\t\t\tc := Cell{\n\t\t\t\t\tCh: bc.CellChar,\n\t\t\t\t\tBg: barBg,\n\t\t\t\t\tFg: barFg,\n\t\t\t\t}\n\n\t\t\t\tx := bc.innerArea.Min.X + i*(bc.BarWidth+bc.BarGap) + j\n\t\t\t\ty := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - k\n\t\t\t\tbuf.Set(x, y, c)\n\t\t\t}\n\t\t}\n\t\t// plot text\n\t\tfor j, k := 0, 0; j < len(bc.labels[i]); j++ {\n\t\t\tw := charWidth(bc.labels[i][j])\n\t\t\tc := Cell{\n\t\t\t\tCh: bc.labels[i][j],\n\t\t\t\tBg: bc.Bg,\n\t\t\t\tFg: bc.TextColor,\n\t\t\t}\n\t\t\ty := bc.innerArea.Min.Y + bc.innerArea.Dy() - 1\n\t\t\tx := bc.innerArea.Min.X + oftX + k\n\t\t\tbuf.Set(x, y, c)\n\t\t\tk += w\n\t\t}\n\t\t// plot num\n\t\tfor j := 0; j < len(bc.dataNum[i]); j++ {\n\t\t\tc := Cell{\n\t\t\t\tCh: bc.dataNum[i][j],\n\t\t\t\tFg: bc.NumColor,\n\t\t\t\tBg: barBg,\n\t\t\t}\n\n\t\t\tif h == 0 {\n\t\t\t\tc.Bg = bc.Bg\n\t\t\t}\n\t\t\tx := bc.innerArea.Min.X + oftX + (bc.BarWidth-len(bc.dataNum[i]))/2 + j\n\t\t\ty := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2\n\t\t\tbuf.Set(x, y, c)\n\t\t}\n\t}\n\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/block.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport \"image\"\n\n// Hline is a horizontal line.\ntype Hline struct {\n\tX   int\n\tY   int\n\tLen int\n\tFg  Attribute\n\tBg  Attribute\n}\n\n// Vline is a vertical line.\ntype Vline struct {\n\tX   int\n\tY   int\n\tLen int\n\tFg  Attribute\n\tBg  Attribute\n}\n\n// Buffer draws a horizontal line.\nfunc (l Hline) Buffer() Buffer {\n\tif l.Len <= 0 {\n\t\treturn NewBuffer()\n\t}\n\treturn NewFilledBuffer(l.X, l.Y, l.X+l.Len, l.Y+1, HORIZONTAL_LINE, l.Fg, l.Bg)\n}\n\n// Buffer draws a vertical line.\nfunc (l Vline) Buffer() Buffer {\n\tif l.Len <= 0 {\n\t\treturn NewBuffer()\n\t}\n\treturn NewFilledBuffer(l.X, l.Y, l.X+1, l.Y+l.Len, VERTICAL_LINE, l.Fg, l.Bg)\n}\n\n// Buffer draws a box border.\nfunc (b Block) drawBorder(buf Buffer) {\n\tif !b.Border {\n\t\treturn\n\t}\n\n\tmin := b.area.Min\n\tmax := b.area.Max\n\n\tx0 := min.X\n\ty0 := min.Y\n\tx1 := max.X - 1\n\ty1 := max.Y - 1\n\n\t// draw lines\n\tif b.BorderTop {\n\t\tbuf.Merge(Hline{x0, y0, x1 - x0, b.BorderFg, b.BorderBg}.Buffer())\n\t}\n\tif b.BorderBottom {\n\t\tbuf.Merge(Hline{x0, y1, x1 - x0, b.BorderFg, b.BorderBg}.Buffer())\n\t}\n\tif b.BorderLeft {\n\t\tbuf.Merge(Vline{x0, y0, y1 - y0, b.BorderFg, b.BorderBg}.Buffer())\n\t}\n\tif b.BorderRight {\n\t\tbuf.Merge(Vline{x1, y0, y1 - y0, b.BorderFg, b.BorderBg}.Buffer())\n\t}\n\n\t// draw corners\n\tif b.BorderTop && b.BorderLeft && b.area.Dx() > 0 && b.area.Dy() > 0 {\n\t\tbuf.Set(x0, y0, Cell{TOP_LEFT, b.BorderFg, b.BorderBg})\n\t}\n\tif b.BorderTop && b.BorderRight && b.area.Dx() > 1 && b.area.Dy() > 0 {\n\t\tbuf.Set(x1, y0, Cell{TOP_RIGHT, b.BorderFg, b.BorderBg})\n\t}\n\tif b.BorderBottom && b.BorderLeft && b.area.Dx() > 0 && b.area.Dy() > 1 {\n\t\tbuf.Set(x0, y1, Cell{BOTTOM_LEFT, b.BorderFg, b.BorderBg})\n\t}\n\tif b.BorderBottom && b.BorderRight && b.area.Dx() > 1 && b.area.Dy() > 1 {\n\t\tbuf.Set(x1, y1, Cell{BOTTOM_RIGHT, b.BorderFg, b.BorderBg})\n\t}\n}\n\nfunc (b Block) drawBorderLabel(buf Buffer) {\n\tmaxTxtW := b.area.Dx() - 2\n\ttx := DTrimTxCls(DefaultTxBuilder.Build(b.BorderLabel, b.BorderLabelFg, b.BorderLabelBg), maxTxtW)\n\n\tfor i, w := 0, 0; i < len(tx); i++ {\n\t\tbuf.Set(b.area.Min.X+1+w, b.area.Min.Y, tx[i])\n\t\tw += tx[i].Width()\n\t}\n}\n\n// Block is a base struct for all other upper level widgets,\n// consider it as css: display:block.\n// Normally you do not need to create it manually.\ntype Block struct {\n\tarea          image.Rectangle\n\tinnerArea     image.Rectangle\n\tX             int\n\tY             int\n\tBorder        bool\n\tBorderFg      Attribute\n\tBorderBg      Attribute\n\tBorderLeft    bool\n\tBorderRight   bool\n\tBorderTop     bool\n\tBorderBottom  bool\n\tBorderLabel   string\n\tBorderLabelFg Attribute\n\tBorderLabelBg Attribute\n\tDisplay       bool\n\tBg            Attribute\n\tWidth         int\n\tHeight        int\n\tPaddingTop    int\n\tPaddingBottom int\n\tPaddingLeft   int\n\tPaddingRight  int\n\tid            string\n\tFloat         Align\n}\n\n// NewBlock returns a *Block which inherits styles from current theme.\nfunc NewBlock() *Block {\n\tb := Block{}\n\tb.Display = true\n\tb.Border = true\n\tb.BorderLeft = true\n\tb.BorderRight = true\n\tb.BorderTop = true\n\tb.BorderBottom = true\n\tb.BorderBg = ThemeAttr(\"border.bg\")\n\tb.BorderFg = ThemeAttr(\"border.fg\")\n\tb.BorderLabelBg = ThemeAttr(\"label.bg\")\n\tb.BorderLabelFg = ThemeAttr(\"label.fg\")\n\tb.Bg = ThemeAttr(\"block.bg\")\n\tb.Width = 2\n\tb.Height = 2\n\tb.id = GenId()\n\tb.Float = AlignNone\n\treturn &b\n}\n\nfunc (b Block) Id() string {\n\treturn b.id\n}\n\n// Align computes box model\nfunc (b *Block) Align() {\n\t// outer\n\tb.area.Min.X = 0\n\tb.area.Min.Y = 0\n\tb.area.Max.X = b.Width\n\tb.area.Max.Y = b.Height\n\n\t// float\n\tb.area = AlignArea(TermRect(), b.area, b.Float)\n\tb.area = MoveArea(b.area, b.X, b.Y)\n\n\t// inner\n\tb.innerArea.Min.X = b.area.Min.X + b.PaddingLeft\n\tb.innerArea.Min.Y = b.area.Min.Y + b.PaddingTop\n\tb.innerArea.Max.X = b.area.Max.X - b.PaddingRight\n\tb.innerArea.Max.Y = b.area.Max.Y - b.PaddingBottom\n\n\tif b.Border {\n\t\tif b.BorderLeft {\n\t\t\tb.innerArea.Min.X++\n\t\t}\n\t\tif b.BorderRight {\n\t\t\tb.innerArea.Max.X--\n\t\t}\n\t\tif b.BorderTop {\n\t\t\tb.innerArea.Min.Y++\n\t\t}\n\t\tif b.BorderBottom {\n\t\t\tb.innerArea.Max.Y--\n\t\t}\n\t}\n}\n\n// InnerBounds returns the internal bounds of the block after aligning and\n// calculating the padding and border, if any.\nfunc (b *Block) InnerBounds() image.Rectangle {\n\tb.Align()\n\treturn b.innerArea\n}\n\n// Buffer implements Bufferer interface.\n// Draw background and border (if any).\nfunc (b *Block) Buffer() Buffer {\n\tb.Align()\n\n\tbuf := NewBuffer()\n\tbuf.SetArea(b.area)\n\tbuf.Fill(' ', ColorDefault, b.Bg)\n\n\tb.drawBorder(buf)\n\tb.drawBorderLabel(buf)\n\n\treturn buf\n}\n\n// GetHeight implements GridBufferer.\n// It returns current height of the block.\nfunc (b Block) GetHeight() int {\n\treturn b.Height\n}\n\n// SetX implements GridBufferer interface, which sets block's x position.\nfunc (b *Block) SetX(x int) {\n\tb.X = x\n}\n\n// SetY implements GridBufferer interface, it sets y position for block.\nfunc (b *Block) SetY(y int) {\n\tb.Y = y\n}\n\n// SetWidth implements GridBuffer interface, it sets block's width.\nfunc (b *Block) SetWidth(w int) {\n\tb.Width = w\n}\n\nfunc (b Block) InnerWidth() int {\n\treturn b.innerArea.Dx()\n}\n\nfunc (b Block) InnerHeight() int {\n\treturn b.innerArea.Dy()\n}\n\nfunc (b Block) InnerX() int {\n\treturn b.innerArea.Min.X\n}\n\nfunc (b Block) InnerY() int { return b.innerArea.Min.Y }\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/block_common.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\n// +build !windows\n\npackage termui\n\nconst TOP_RIGHT = '┐'\nconst VERTICAL_LINE = '│'\nconst HORIZONTAL_LINE = '─'\nconst TOP_LEFT = '┌'\nconst BOTTOM_RIGHT = '┘'\nconst BOTTOM_LEFT = '└'\nconst VERTICAL_LEFT = '┤'\nconst VERTICAL_RIGHT = '├'\nconst HORIZONTAL_DOWN = '┬'\nconst HORIZONTAL_UP = '┴'\nconst QUOTA_LEFT = '«'\nconst QUOTA_RIGHT = '»'\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/block_windows.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\n// +build windows\n\npackage termui\n\nconst TOP_RIGHT = '+'\nconst VERTICAL_LINE = '|'\nconst HORIZONTAL_LINE = '-'\nconst TOP_LEFT = '+'\nconst BOTTOM_RIGHT = '+'\nconst BOTTOM_LEFT = '+'\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/buffer.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport \"image\"\n\n// Cell is a rune with assigned Fg and Bg\ntype Cell struct {\n\tCh rune\n\tFg Attribute\n\tBg Attribute\n}\n\n// Buffer is a renderable rectangle cell data container.\ntype Buffer struct {\n\tArea    image.Rectangle // selected drawing area\n\tCellMap map[image.Point]Cell\n}\n\n// At returns the cell at (x,y).\nfunc (b Buffer) At(x, y int) Cell {\n\treturn b.CellMap[image.Pt(x, y)]\n}\n\n// Set assigns a char to (x,y)\nfunc (b Buffer) Set(x, y int, c Cell) {\n\tb.CellMap[image.Pt(x, y)] = c\n}\n\n// Bounds returns the domain for which At can return non-zero color.\nfunc (b Buffer) Bounds() image.Rectangle {\n\tx0, y0, x1, y1 := 0, 0, 0, 0\n\tfor p := range b.CellMap {\n\t\tif p.X > x1 {\n\t\t\tx1 = p.X\n\t\t}\n\t\tif p.X < x0 {\n\t\t\tx0 = p.X\n\t\t}\n\t\tif p.Y > y1 {\n\t\t\ty1 = p.Y\n\t\t}\n\t\tif p.Y < y0 {\n\t\t\ty0 = p.Y\n\t\t}\n\t}\n\treturn image.Rect(x0, y0, x1+1, y1+1)\n}\n\n// SetArea assigns a new rect area to Buffer b.\nfunc (b *Buffer) SetArea(r image.Rectangle) {\n\tb.Area.Max = r.Max\n\tb.Area.Min = r.Min\n}\n\n// Sync sets drawing area to the buffer's bound\nfunc (b *Buffer) Sync() {\n\tb.SetArea(b.Bounds())\n}\n\n// NewCell returns a new cell\nfunc NewCell(ch rune, fg, bg Attribute) Cell {\n\treturn Cell{ch, fg, bg}\n}\n\n// Merge merges bs Buffers onto b\nfunc (b *Buffer) Merge(bs ...Buffer) {\n\tfor _, buf := range bs {\n\t\tfor p, v := range buf.CellMap {\n\t\t\tb.Set(p.X, p.Y, v)\n\t\t}\n\t\tb.SetArea(b.Area.Union(buf.Area))\n\t}\n}\n\n// NewBuffer returns a new Buffer\nfunc NewBuffer() Buffer {\n\treturn Buffer{\n\t\tCellMap: make(map[image.Point]Cell),\n\t\tArea:    image.Rectangle{}}\n}\n\n// Fill fills the Buffer b with ch,fg and bg.\nfunc (b Buffer) Fill(ch rune, fg, bg Attribute) {\n\tfor x := b.Area.Min.X; x < b.Area.Max.X; x++ {\n\t\tfor y := b.Area.Min.Y; y < b.Area.Max.Y; y++ {\n\t\t\tb.Set(x, y, Cell{ch, fg, bg})\n\t\t}\n\t}\n}\n\n// NewFilledBuffer returns a new Buffer filled with ch, fb and bg.\nfunc NewFilledBuffer(x0, y0, x1, y1 int, ch rune, fg, bg Attribute) Buffer {\n\tbuf := NewBuffer()\n\tbuf.Area.Min = image.Pt(x0, y0)\n\tbuf.Area.Max = image.Pt(x1, y1)\n\n\tfor x := buf.Area.Min.X; x < buf.Area.Max.X; x++ {\n\t\tfor y := buf.Area.Min.Y; y < buf.Area.Max.Y; y++ {\n\t\t\tbuf.Set(x, y, Cell{ch, fg, bg})\n\t\t}\n\t}\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/canvas.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\n/*\ndots:\n   ,___,\n   |1 4|\n   |2 5|\n   |3 6|\n   |7 8|\n   `````\n*/\n\nvar brailleBase = '\\u2800'\n\nvar brailleOftMap = [4][2]rune{\n\t{'\\u0001', '\\u0008'},\n\t{'\\u0002', '\\u0010'},\n\t{'\\u0004', '\\u0020'},\n\t{'\\u0040', '\\u0080'}}\n\n// Canvas contains drawing map: i,j -> rune\ntype Canvas map[[2]int]rune\n\n// NewCanvas returns an empty Canvas\nfunc NewCanvas() Canvas {\n\treturn make(map[[2]int]rune)\n}\n\nfunc chOft(x, y int) rune {\n\treturn brailleOftMap[y%4][x%2]\n}\n\nfunc (c Canvas) rawCh(x, y int) rune {\n\tif ch, ok := c[[2]int{x, y}]; ok {\n\t\treturn ch\n\t}\n\treturn '\\u0000' //brailleOffset\n}\n\n// return coordinate in terminal\nfunc chPos(x, y int) (int, int) {\n\treturn y / 4, x / 2\n}\n\n// Set sets a point (x,y) in the virtual coordinate\nfunc (c Canvas) Set(x, y int) {\n\ti, j := chPos(x, y)\n\tch := c.rawCh(i, j)\n\tch |= chOft(x, y)\n\tc[[2]int{i, j}] = ch\n}\n\n// Unset removes point (x,y)\nfunc (c Canvas) Unset(x, y int) {\n\ti, j := chPos(x, y)\n\tch := c.rawCh(i, j)\n\tch &= ^chOft(x, y)\n\tc[[2]int{i, j}] = ch\n}\n\n// Buffer returns un-styled points\nfunc (c Canvas) Buffer() Buffer {\n\tbuf := NewBuffer()\n\tfor k, v := range c {\n\t\tbuf.Set(k[0], k[1], Cell{Ch: v + brailleBase})\n\t}\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/config.py",
    "content": "#!/usr/bin/env python3\n\nimport re\nimport os\nimport io\n\ncopyright = \"\"\"// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\n\"\"\"\n\nexclude_dirs = [\".git\", \"_docs\"]\nexclude_files = []\ninclude_dirs = [\".\", \"debug\", \"extra\", \"test\", \"_example\"]\n\n\ndef is_target(fpath):\n    if os.path.splitext(fpath)[-1] == \".go\":\n        return True\n    return False\n\n\ndef update_copyright(fpath):\n    print(\"processing \" + fpath)\n    f = io.open(fpath, 'r', encoding='utf-8')\n    fstr = f.read()\n    f.close()\n\n    # remove old\n    m = re.search('^// Copyright .+?\\r?\\n\\r?\\n', fstr, re.MULTILINE|re.DOTALL)\n    if m:\n        fstr = fstr[m.end():]\n\n    # add new\n    fstr = copyright + fstr\n    f = io.open(fpath, 'w',encoding='utf-8')\n    f.write(fstr)\n    f.close()\n\n\ndef main():\n    for d in include_dirs:\n        files = [\n            os.path.join(d, f) for f in os.listdir(d)\n            if os.path.isfile(os.path.join(d, f))\n        ]\n        for f in files:\n            if is_target(f):\n                update_copyright(f)\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/doc.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\n/*\nPackage termui is a library designed for creating command line UI. For more info, goto http://github.com/gizak/termui\n\nA simplest example:\n    package main\n\n    import ui \"github.com/gizak/termui\"\n\n    func main() {\n        if err:=ui.Init(); err != nil {\n            panic(err)\n        }\n        defer ui.Close()\n\n        g := ui.NewGauge()\n        g.Percent = 50\n        g.Width = 50\n        g.BorderLabel = \"Gauge\"\n\n        ui.Render(g)\n\n        ui.Loop()\n    }\n*/\npackage termui\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/events.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"path\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/nsf/termbox-go\"\n)\n\ntype Event struct {\n\tType string\n\tPath string\n\tFrom string\n\tTo   string\n\tData interface{}\n\tTime int64\n}\n\nvar sysEvtChs []chan Event\n\ntype EvtKbd struct {\n\tKeyStr string\n}\n\nfunc evtKbd(e termbox.Event) EvtKbd {\n\tek := EvtKbd{}\n\n\tk := string(e.Ch)\n\tpre := \"\"\n\tmod := \"\"\n\n\tif e.Mod == termbox.ModAlt {\n\t\tmod = \"M-\"\n\t}\n\tif e.Ch == 0 {\n\t\tif e.Key > 0xFFFF-12 {\n\t\t\tk = \"<f\" + strconv.Itoa(0xFFFF-int(e.Key)+1) + \">\"\n\t\t} else if e.Key > 0xFFFF-25 {\n\t\t\tks := []string{\"<insert>\", \"<delete>\", \"<home>\", \"<end>\", \"<previous>\", \"<next>\", \"<up>\", \"<down>\", \"<left>\", \"<right>\"}\n\t\t\tk = ks[0xFFFF-int(e.Key)-12]\n\t\t}\n\n\t\tif e.Key <= 0x7F {\n\t\t\tpre = \"C-\"\n\t\t\tk = string('a' - 1 + int(e.Key))\n\t\t\tkmap := map[termbox.Key][2]string{\n\t\t\t\ttermbox.KeyCtrlSpace:     {\"C-\", \"<space>\"},\n\t\t\t\ttermbox.KeyBackspace:     {\"\", \"<backspace>\"},\n\t\t\t\ttermbox.KeyTab:           {\"\", \"<tab>\"},\n\t\t\t\ttermbox.KeyEnter:         {\"\", \"<enter>\"},\n\t\t\t\ttermbox.KeyEsc:           {\"\", \"<escape>\"},\n\t\t\t\ttermbox.KeyCtrlBackslash: {\"C-\", \"\\\\\"},\n\t\t\t\ttermbox.KeyCtrlSlash:     {\"C-\", \"/\"},\n\t\t\t\ttermbox.KeySpace:         {\"\", \"<space>\"},\n\t\t\t\ttermbox.KeyCtrl8:         {\"C-\", \"8\"},\n\t\t\t}\n\t\t\tif sk, ok := kmap[e.Key]; ok {\n\t\t\t\tpre = sk[0]\n\t\t\t\tk = sk[1]\n\t\t\t}\n\t\t}\n\t}\n\n\tek.KeyStr = pre + mod + k\n\treturn ek\n}\n\nfunc crtTermboxEvt(e termbox.Event) Event {\n\tsystypemap := map[termbox.EventType]string{\n\t\ttermbox.EventKey:       \"keyboard\",\n\t\ttermbox.EventResize:    \"window\",\n\t\ttermbox.EventMouse:     \"mouse\",\n\t\ttermbox.EventError:     \"error\",\n\t\ttermbox.EventInterrupt: \"interrupt\",\n\t}\n\tne := Event{From: \"/sys\", Time: time.Now().Unix()}\n\ttyp := e.Type\n\tne.Type = systypemap[typ]\n\n\tswitch typ {\n\tcase termbox.EventKey:\n\t\tkbd := evtKbd(e)\n\t\tne.Path = \"/sys/kbd/\" + kbd.KeyStr\n\t\tne.Data = kbd\n\tcase termbox.EventResize:\n\t\twnd := EvtWnd{}\n\t\twnd.Width = e.Width\n\t\twnd.Height = e.Height\n\t\tne.Path = \"/sys/wnd/resize\"\n\t\tne.Data = wnd\n\tcase termbox.EventError:\n\t\terr := EvtErr(e.Err)\n\t\tne.Path = \"/sys/err\"\n\t\tne.Data = err\n\tcase termbox.EventMouse:\n\t\tm := EvtMouse{}\n\t\tm.X = e.MouseX\n\t\tm.Y = e.MouseY\n\t\tne.Path = \"/sys/mouse\"\n\t\tne.Data = m\n\t}\n\treturn ne\n}\n\ntype EvtWnd struct {\n\tWidth  int\n\tHeight int\n}\n\ntype EvtMouse struct {\n\tX     int\n\tY     int\n\tPress string\n}\n\ntype EvtErr error\n\nfunc hookTermboxEvt() {\n\tfor {\n\t\te := termbox.PollEvent()\n\n\t\tfor _, c := range sysEvtChs {\n\t\t\tgo func(ch chan Event) {\n\t\t\t\tch <- crtTermboxEvt(e)\n\t\t\t}(c)\n\t\t}\n\t}\n}\n\nfunc NewSysEvtCh() chan Event {\n\tec := make(chan Event)\n\tsysEvtChs = append(sysEvtChs, ec)\n\treturn ec\n}\n\nvar DefaultEvtStream = NewEvtStream()\n\ntype EvtStream struct {\n\tsync.RWMutex\n\tsrcMap      map[string]chan Event\n\tstream      chan Event\n\twg          sync.WaitGroup\n\tsigStopLoop chan Event\n\tHandlers    map[string]func(Event)\n\thook        func(Event)\n}\n\nfunc NewEvtStream() *EvtStream {\n\treturn &EvtStream{\n\t\tsrcMap:      make(map[string]chan Event),\n\t\tstream:      make(chan Event),\n\t\tHandlers:    make(map[string]func(Event)),\n\t\tsigStopLoop: make(chan Event),\n\t}\n}\n\nfunc (es *EvtStream) Init() {\n\tes.Merge(\"internal\", es.sigStopLoop)\n\tgo func() {\n\t\tes.wg.Wait()\n\t\tclose(es.stream)\n\t}()\n}\n\nfunc cleanPath(p string) string {\n\tif p == \"\" {\n\t\treturn \"/\"\n\t}\n\tif p[0] != '/' {\n\t\tp = \"/\" + p\n\t}\n\treturn path.Clean(p)\n}\n\nfunc isPathMatch(pattern, path string) bool {\n\tif len(pattern) == 0 {\n\t\treturn false\n\t}\n\tn := len(pattern)\n\treturn len(path) >= n && path[0:n] == pattern\n}\n\nfunc (es *EvtStream) Merge(name string, ec chan Event) {\n\tes.Lock()\n\tdefer es.Unlock()\n\n\tes.wg.Add(1)\n\tes.srcMap[name] = ec\n\n\tgo func(a chan Event) {\n\t\tfor n := range a {\n\t\t\tn.From = name\n\t\t\tes.stream <- n\n\t\t}\n\t\tes.wg.Done()\n\t}(ec)\n}\n\nfunc (es *EvtStream) Handle(path string, handler func(Event)) {\n\tes.Handlers[cleanPath(path)] = handler\n}\n\nfunc findMatch(mux map[string]func(Event), path string) string {\n\tn := -1\n\tpattern := \"\"\n\tfor m := range mux {\n\t\tif !isPathMatch(m, path) {\n\t\t\tcontinue\n\t\t}\n\t\tif len(m) > n {\n\t\t\tpattern = m\n\t\t\tn = len(m)\n\t\t}\n\t}\n\treturn pattern\n\n}\n\n// Remove all existing defined Handlers from the map\nfunc (es *EvtStream) ResetHandlers() {\n\tfor Path, _ := range es.Handlers {\n\t\tdelete(es.Handlers, Path)\n\t}\n\treturn\n}\n\nfunc (es *EvtStream) match(path string) string {\n\treturn findMatch(es.Handlers, path)\n}\n\nfunc (es *EvtStream) Hook(f func(Event)) {\n\tes.hook = f\n}\n\nfunc (es *EvtStream) Loop() {\n\tfor e := range es.stream {\n\t\tswitch e.Path {\n\t\tcase \"/sig/stoploop\":\n\t\t\treturn\n\t\t}\n\t\tgo func(a Event) {\n\t\t\tes.RLock()\n\t\t\tdefer es.RUnlock()\n\t\t\tif pattern := es.match(a.Path); pattern != \"\" {\n\t\t\t\tes.Handlers[pattern](a)\n\t\t\t}\n\t\t}(e)\n\t\tif es.hook != nil {\n\t\t\tes.hook(e)\n\t\t}\n\t}\n}\n\nfunc (es *EvtStream) StopLoop() {\n\tgo func() {\n\t\te := Event{\n\t\t\tPath: \"/sig/stoploop\",\n\t\t}\n\t\tes.sigStopLoop <- e\n\t}()\n}\n\nfunc Merge(name string, ec chan Event) {\n\tDefaultEvtStream.Merge(name, ec)\n}\n\nfunc Handle(path string, handler func(Event)) {\n\tDefaultEvtStream.Handle(path, handler)\n}\n\nfunc Loop() {\n\tDefaultEvtStream.Loop()\n}\n\nfunc StopLoop() {\n\tDefaultEvtStream.StopLoop()\n}\n\ntype EvtTimer struct {\n\tDuration time.Duration\n\tCount    uint64\n}\n\nfunc NewTimerCh(du time.Duration) chan Event {\n\tt := make(chan Event)\n\n\tgo func(a chan Event) {\n\t\tn := uint64(0)\n\t\tfor {\n\t\t\tn++\n\t\t\ttime.Sleep(du)\n\t\t\te := Event{}\n\t\t\te.Type = \"timer\"\n\t\t\te.Path = \"/timer/\" + du.String()\n\t\t\te.Time = time.Now().Unix()\n\t\t\te.Data = EvtTimer{\n\t\t\t\tDuration: du,\n\t\t\t\tCount:    n,\n\t\t\t}\n\t\t\tt <- e\n\n\t\t}\n\t}(t)\n\treturn t\n}\n\nvar DefaultHandler = func(e Event) {\n}\n\nvar usrEvtCh = make(chan Event)\n\nfunc SendCustomEvt(path string, data interface{}) {\n\te := Event{}\n\te.Path = path\n\te.Data = data\n\te.Time = time.Now().Unix()\n\tusrEvtCh <- e\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/gauge.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\n// Gauge is a progress bar like widget.\n// A simple example:\n/*\n  g := termui.NewGauge()\n  g.Percent = 40\n  g.Width = 50\n  g.Height = 3\n  g.BorderLabel = \"Slim Gauge\"\n  g.BarColor = termui.ColorRed\n  g.PercentColor = termui.ColorBlue\n*/\n\nconst ColorUndef Attribute = Attribute(^uint16(0))\n\ntype Gauge struct {\n\tBlock\n\tPercent                 int\n\tBarColor                Attribute\n\tPercentColor            Attribute\n\tPercentColorHighlighted Attribute\n\tLabel                   string\n\tLabelAlign              Align\n}\n\n// NewGauge return a new gauge with current theme.\nfunc NewGauge() *Gauge {\n\tg := &Gauge{\n\t\tBlock:                   *NewBlock(),\n\t\tPercentColor:            ThemeAttr(\"gauge.percent.fg\"),\n\t\tBarColor:                ThemeAttr(\"gauge.bar.bg\"),\n\t\tLabel:                   \"{{percent}}%\",\n\t\tLabelAlign:              AlignCenter,\n\t\tPercentColorHighlighted: ColorUndef,\n\t}\n\n\tg.Width = 12\n\tg.Height = 5\n\treturn g\n}\n\n// Buffer implements Bufferer interface.\nfunc (g *Gauge) Buffer() Buffer {\n\tbuf := g.Block.Buffer()\n\n\t// plot bar\n\tw := g.Percent * g.innerArea.Dx() / 100\n\tfor i := 0; i < g.innerArea.Dy(); i++ {\n\t\tfor j := 0; j < w; j++ {\n\t\t\tc := Cell{}\n\t\t\tc.Ch = ' '\n\t\t\tc.Bg = g.BarColor\n\t\t\tif c.Bg == ColorDefault {\n\t\t\t\tc.Bg |= AttrReverse\n\t\t\t}\n\t\t\tbuf.Set(g.innerArea.Min.X+j, g.innerArea.Min.Y+i, c)\n\t\t}\n\t}\n\n\t// plot percentage\n\ts := strings.Replace(g.Label, \"{{percent}}\", strconv.Itoa(g.Percent), -1)\n\tpry := g.innerArea.Min.Y + g.innerArea.Dy()/2\n\trs := str2runes(s)\n\tvar pos int\n\tswitch g.LabelAlign {\n\tcase AlignLeft:\n\t\tpos = 0\n\n\tcase AlignCenter:\n\t\tpos = (g.innerArea.Dx() - strWidth(s)) / 2\n\n\tcase AlignRight:\n\t\tpos = g.innerArea.Dx() - strWidth(s) - 1\n\t}\n\tpos += g.innerArea.Min.X\n\n\tfor i, v := range rs {\n\t\tc := Cell{\n\t\t\tCh: v,\n\t\t\tFg: g.PercentColor,\n\t\t}\n\n\t\tif w+g.innerArea.Min.X > pos+i {\n\t\t\tc.Bg = g.BarColor\n\t\t\tif c.Bg == ColorDefault {\n\t\t\t\tc.Bg |= AttrReverse\n\t\t\t}\n\n\t\t\tif g.PercentColorHighlighted != ColorUndef {\n\t\t\t\tc.Fg = g.PercentColorHighlighted\n\t\t\t}\n\t\t} else {\n\t\t\tc.Bg = g.Block.Bg\n\t\t}\n\n\t\tbuf.Set(1+pos+i, pry, c)\n\t}\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/glide.yaml",
    "content": "package: github.com/gizak/termui\nimport:\n- package: github.com/mattn/go-runewidth\n- package: github.com/mitchellh/go-wordwrap\n- package: github.com/nsf/termbox-go\n- package: golang.org/x/net\n  subpackages:\n  - websocket\n- package: github.com/maruel/panicparse\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/grid.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\n// GridBufferer introduces a Bufferer that can be manipulated by Grid.\ntype GridBufferer interface {\n\tBufferer\n\tGetHeight() int\n\tSetWidth(int)\n\tSetX(int)\n\tSetY(int)\n}\n\n// Row builds a layout tree\ntype Row struct {\n\tCols   []*Row       //children\n\tWidget GridBufferer // root\n\tX      int\n\tY      int\n\tWidth  int\n\tHeight int\n\tSpan   int\n\tOffset int\n}\n\n// calculate and set the underlying layout tree's x, y, height and width.\nfunc (r *Row) calcLayout() {\n\tr.assignWidth(r.Width)\n\tr.Height = r.solveHeight()\n\tr.assignX(r.X)\n\tr.assignY(r.Y)\n}\n\n// tell if the node is leaf in the tree.\nfunc (r *Row) isLeaf() bool {\n\treturn r.Cols == nil || len(r.Cols) == 0\n}\n\nfunc (r *Row) isRenderableLeaf() bool {\n\treturn r.isLeaf() && r.Widget != nil\n}\n\n// assign widgets' (and their parent rows') width recursively.\nfunc (r *Row) assignWidth(w int) {\n\tr.SetWidth(w)\n\n\taccW := 0                            // acc span and offset\n\tcalcW := make([]int, len(r.Cols))    // calculated width\n\tcalcOftX := make([]int, len(r.Cols)) // computated start position of x\n\n\tfor i, c := range r.Cols {\n\t\taccW += c.Span + c.Offset\n\t\tcw := int(float64(c.Span*r.Width) / 12.0)\n\n\t\tif i >= 1 {\n\t\t\tcalcOftX[i] = calcOftX[i-1] +\n\t\t\t\tcalcW[i-1] +\n\t\t\t\tint(float64(r.Cols[i-1].Offset*r.Width)/12.0)\n\t\t}\n\n\t\t// use up the space if it is the last col\n\t\tif i == len(r.Cols)-1 && accW == 12 {\n\t\t\tcw = r.Width - calcOftX[i]\n\t\t}\n\t\tcalcW[i] = cw\n\t\tr.Cols[i].assignWidth(cw)\n\t}\n}\n\n// bottom up calc and set rows' (and their widgets') height,\n// return r's total height.\nfunc (r *Row) solveHeight() int {\n\tif r.isRenderableLeaf() {\n\t\tr.Height = r.Widget.GetHeight()\n\t\treturn r.Widget.GetHeight()\n\t}\n\n\tmaxh := 0\n\tif !r.isLeaf() {\n\t\tfor _, c := range r.Cols {\n\t\t\tnh := c.solveHeight()\n\t\t\t// when embed rows in Cols, row widgets stack up\n\t\t\tif r.Widget != nil {\n\t\t\t\tnh += r.Widget.GetHeight()\n\t\t\t}\n\t\t\tif nh > maxh {\n\t\t\t\tmaxh = nh\n\t\t\t}\n\t\t}\n\t}\n\n\tr.Height = maxh\n\treturn maxh\n}\n\n// recursively assign x position for r tree.\nfunc (r *Row) assignX(x int) {\n\tr.SetX(x)\n\n\tif !r.isLeaf() {\n\t\tacc := 0\n\t\tfor i, c := range r.Cols {\n\t\t\tif c.Offset != 0 {\n\t\t\t\tacc += int(float64(c.Offset*r.Width) / 12.0)\n\t\t\t}\n\t\t\tr.Cols[i].assignX(x + acc)\n\t\t\tacc += c.Width\n\t\t}\n\t}\n}\n\n// recursively assign y position to r.\nfunc (r *Row) assignY(y int) {\n\tr.SetY(y)\n\n\tif r.isLeaf() {\n\t\treturn\n\t}\n\n\tfor i := range r.Cols {\n\t\tacc := 0\n\t\tif r.Widget != nil {\n\t\t\tacc = r.Widget.GetHeight()\n\t\t}\n\t\tr.Cols[i].assignY(y + acc)\n\t}\n\n}\n\n// GetHeight implements GridBufferer interface.\nfunc (r Row) GetHeight() int {\n\treturn r.Height\n}\n\n// SetX implements GridBufferer interface.\nfunc (r *Row) SetX(x int) {\n\tr.X = x\n\tif r.Widget != nil {\n\t\tr.Widget.SetX(x)\n\t}\n}\n\n// SetY implements GridBufferer interface.\nfunc (r *Row) SetY(y int) {\n\tr.Y = y\n\tif r.Widget != nil {\n\t\tr.Widget.SetY(y)\n\t}\n}\n\n// SetWidth implements GridBufferer interface.\nfunc (r *Row) SetWidth(w int) {\n\tr.Width = w\n\tif r.Widget != nil {\n\t\tr.Widget.SetWidth(w)\n\t}\n}\n\n// Buffer implements Bufferer interface,\n// recursively merge all widgets buffer\nfunc (r *Row) Buffer() Buffer {\n\tmerged := NewBuffer()\n\n\tif r.isRenderableLeaf() {\n\t\treturn r.Widget.Buffer()\n\t}\n\n\t// for those are not leaves but have a renderable widget\n\tif r.Widget != nil {\n\t\tmerged.Merge(r.Widget.Buffer())\n\t}\n\n\t// collect buffer from children\n\tif !r.isLeaf() {\n\t\tfor _, c := range r.Cols {\n\t\t\tmerged.Merge(c.Buffer())\n\t\t}\n\t}\n\n\treturn merged\n}\n\n// Grid implements 12 columns system.\n// A simple example:\n/*\n   import ui \"github.com/gizak/termui\"\n   // init and create widgets...\n\n   // build\n   ui.Body.AddRows(\n       ui.NewRow(\n           ui.NewCol(6, 0, widget0),\n           ui.NewCol(6, 0, widget1)),\n       ui.NewRow(\n           ui.NewCol(3, 0, widget2),\n           ui.NewCol(3, 0, widget30, widget31, widget32),\n           ui.NewCol(6, 0, widget4)))\n\n   // calculate layout\n   ui.Body.Align()\n\n   ui.Render(ui.Body)\n*/\ntype Grid struct {\n\tRows    []*Row\n\tWidth   int\n\tX       int\n\tY       int\n\tBgColor Attribute\n}\n\n// NewGrid returns *Grid with given rows.\nfunc NewGrid(rows ...*Row) *Grid {\n\treturn &Grid{Rows: rows}\n}\n\n// AddRows appends given rows to Grid.\nfunc (g *Grid) AddRows(rs ...*Row) {\n\tg.Rows = append(g.Rows, rs...)\n}\n\n// NewRow creates a new row out of given columns.\nfunc NewRow(cols ...*Row) *Row {\n\trs := &Row{Span: 12, Cols: cols}\n\treturn rs\n}\n\n// NewCol accepts: widgets are LayoutBufferer or widgets is A NewRow.\n// Note that if multiple widgets are provided, they will stack up in the col.\nfunc NewCol(span, offset int, widgets ...GridBufferer) *Row {\n\tr := &Row{Span: span, Offset: offset}\n\n\tif widgets != nil && len(widgets) == 1 {\n\t\twgt := widgets[0]\n\t\tnw, isRow := wgt.(*Row)\n\t\tif isRow {\n\t\t\tr.Cols = nw.Cols\n\t\t} else {\n\t\t\tr.Widget = wgt\n\t\t}\n\t\treturn r\n\t}\n\n\tr.Cols = []*Row{}\n\tir := r\n\tfor _, w := range widgets {\n\t\tnr := &Row{Span: 12, Widget: w}\n\t\tir.Cols = []*Row{nr}\n\t\tir = nr\n\t}\n\n\treturn r\n}\n\n// Align calculate each rows' layout.\nfunc (g *Grid) Align() {\n\th := 0\n\tfor _, r := range g.Rows {\n\t\tr.SetWidth(g.Width)\n\t\tr.SetX(g.X)\n\t\tr.SetY(g.Y + h)\n\t\tr.calcLayout()\n\t\th += r.GetHeight()\n\t}\n}\n\n// Buffer implments Bufferer interface.\nfunc (g Grid) Buffer() Buffer {\n\tbuf := NewBuffer()\n\n\tfor _, r := range g.Rows {\n\t\tbuf.Merge(r.Buffer())\n\t}\n\treturn buf\n}\n\nvar Body *Grid\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/helper.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"regexp\"\n\t\"strings\"\n\n\ttm \"github.com/nsf/termbox-go\"\n)\nimport rw \"github.com/mattn/go-runewidth\"\n\n/* ---------------Port from termbox-go --------------------- */\n\n// Attribute is printable cell's color and style.\ntype Attribute uint16\n\n// 8 basic clolrs\nconst (\n\tColorDefault Attribute = iota\n\tColorBlack\n\tColorRed\n\tColorGreen\n\tColorYellow\n\tColorBlue\n\tColorMagenta\n\tColorCyan\n\tColorWhite\n)\n\n//Have a constant that defines number of colors\nconst NumberofColors = 8\n\n// Text style\nconst (\n\tAttrBold Attribute = 1 << (iota + 9)\n\tAttrUnderline\n\tAttrReverse\n)\n\nvar (\n\tdot  = \"…\"\n\tdotw = rw.StringWidth(dot)\n)\n\n/* ----------------------- End ----------------------------- */\n\nfunc toTmAttr(x Attribute) tm.Attribute {\n\treturn tm.Attribute(x)\n}\n\nfunc str2runes(s string) []rune {\n\treturn []rune(s)\n}\n\n// Here for backwards-compatibility.\nfunc trimStr2Runes(s string, w int) []rune {\n\treturn TrimStr2Runes(s, w)\n}\n\n// TrimStr2Runes trims string to w[-1 rune], appends …, and returns the runes\n// of that string if string is grather then n. If string is small then w,\n// return the runes.\nfunc TrimStr2Runes(s string, w int) []rune {\n\tif w <= 0 {\n\t\treturn []rune{}\n\t}\n\n\tsw := rw.StringWidth(s)\n\tif sw > w {\n\t\treturn []rune(rw.Truncate(s, w, dot))\n\t}\n\treturn str2runes(s)\n}\n\n// TrimStrIfAppropriate trim string to \"s[:-1] + …\"\n// if string > width otherwise return string\nfunc TrimStrIfAppropriate(s string, w int) string {\n\tif w <= 0 {\n\t\treturn \"\"\n\t}\n\n\tsw := rw.StringWidth(s)\n\tif sw > w {\n\t\treturn rw.Truncate(s, w, dot)\n\t}\n\n\treturn s\n}\n\nfunc strWidth(s string) int {\n\treturn rw.StringWidth(s)\n}\n\nfunc charWidth(ch rune) int {\n\treturn rw.RuneWidth(ch)\n}\n\nvar whiteSpaceRegex = regexp.MustCompile(`\\s`)\n\n// StringToAttribute converts text to a termui attribute. You may specifiy more\n// then one attribute like that: \"BLACK, BOLD, ...\". All whitespaces\n// are ignored.\nfunc StringToAttribute(text string) Attribute {\n\ttext = whiteSpaceRegex.ReplaceAllString(strings.ToLower(text), \"\")\n\tattributes := strings.Split(text, \",\")\n\tresult := Attribute(0)\n\n\tfor _, theAttribute := range attributes {\n\t\tvar match Attribute\n\t\tswitch theAttribute {\n\t\tcase \"reset\", \"default\":\n\t\t\tmatch = ColorDefault\n\n\t\tcase \"black\":\n\t\t\tmatch = ColorBlack\n\n\t\tcase \"red\":\n\t\t\tmatch = ColorRed\n\n\t\tcase \"green\":\n\t\t\tmatch = ColorGreen\n\n\t\tcase \"yellow\":\n\t\t\tmatch = ColorYellow\n\n\t\tcase \"blue\":\n\t\t\tmatch = ColorBlue\n\n\t\tcase \"magenta\":\n\t\t\tmatch = ColorMagenta\n\n\t\tcase \"cyan\":\n\t\t\tmatch = ColorCyan\n\n\t\tcase \"white\":\n\t\t\tmatch = ColorWhite\n\n\t\tcase \"bold\":\n\t\t\tmatch = AttrBold\n\n\t\tcase \"underline\":\n\t\t\tmatch = AttrUnderline\n\n\t\tcase \"reverse\":\n\t\t\tmatch = AttrReverse\n\t\t}\n\n\t\tresult |= match\n\t}\n\n\treturn result\n}\n\n// TextCells returns a coloured text cells []Cell\nfunc TextCells(s string, fg, bg Attribute) []Cell {\n\tcs := make([]Cell, 0, len(s))\n\n\t// sequence := MarkdownTextRendererFactory{}.TextRenderer(s).Render(fg, bg)\n\t// runes := []rune(sequence.NormalizedText)\n\trunes := str2runes(s)\n\n\tfor n := range runes {\n\t\t// point, _ := sequence.PointAt(n, 0, 0)\n\t\t// cs = append(cs, Cell{point.Ch, point.Fg, point.Bg})\n\t\tcs = append(cs, Cell{runes[n], fg, bg})\n\t}\n\treturn cs\n}\n\n// Width returns the actual screen space the cell takes (usually 1 or 2).\nfunc (c Cell) Width() int {\n\treturn charWidth(c.Ch)\n}\n\n// Copy return a copy of c\nfunc (c Cell) Copy() Cell {\n\treturn c\n}\n\n// TrimTxCells trims the overflowed text cells sequence.\nfunc TrimTxCells(cs []Cell, w int) []Cell {\n\tif len(cs) <= w {\n\t\treturn cs\n\t}\n\treturn cs[:w]\n}\n\n// DTrimTxCls trims the overflowed text cells sequence and append dots at the end.\nfunc DTrimTxCls(cs []Cell, w int) []Cell {\n\tl := len(cs)\n\tif l <= 0 {\n\t\treturn []Cell{}\n\t}\n\n\trt := make([]Cell, 0, w)\n\tcsw := 0\n\tfor i := 0; i < l && csw <= w; i++ {\n\t\tc := cs[i]\n\t\tcw := c.Width()\n\n\t\tif cw+csw < w {\n\t\t\trt = append(rt, c)\n\t\t\tcsw += cw\n\t\t} else {\n\t\t\trt = append(rt, Cell{'…', c.Fg, c.Bg})\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn rt\n}\n\nfunc CellsToStr(cs []Cell) string {\n\tstr := \"\"\n\tfor _, c := range cs {\n\t\tstr += string(c.Ch)\n\t}\n\treturn str\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/linechart.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"fmt\"\n\t\"math\"\n)\n\n// only 16 possible combinations, why bother\nvar braillePatterns = map[[2]int]rune{\n\t[2]int{0, 0}: '⣀',\n\t[2]int{0, 1}: '⡠',\n\t[2]int{0, 2}: '⡐',\n\t[2]int{0, 3}: '⡈',\n\n\t[2]int{1, 0}: '⢄',\n\t[2]int{1, 1}: '⠤',\n\t[2]int{1, 2}: '⠔',\n\t[2]int{1, 3}: '⠌',\n\n\t[2]int{2, 0}: '⢂',\n\t[2]int{2, 1}: '⠢',\n\t[2]int{2, 2}: '⠒',\n\t[2]int{2, 3}: '⠊',\n\n\t[2]int{3, 0}: '⢁',\n\t[2]int{3, 1}: '⠡',\n\t[2]int{3, 2}: '⠑',\n\t[2]int{3, 3}: '⠉',\n}\n\nvar lSingleBraille = [4]rune{'\\u2840', '⠄', '⠂', '⠁'}\nvar rSingleBraille = [4]rune{'\\u2880', '⠠', '⠐', '⠈'}\n\n// LineChart has two modes: braille(default) and dot. Using braille gives 2x capicity as dot mode,\n// because one braille char can represent two data points.\n/*\n  lc := termui.NewLineChart()\n  lc.BorderLabel = \"braille-mode Line Chart\"\n  lc.Data = [1.2, 1.3, 1.5, 1.7, 1.5, 1.6, 1.8, 2.0]\n  lc.Width = 50\n  lc.Height = 12\n  lc.AxesColor = termui.ColorWhite\n  lc.LineColor = termui.ColorGreen | termui.AttrBold\n  // termui.Render(lc)...\n*/\ntype LineChart struct {\n\tBlock\n\tData          []float64\n\tDataLabels    []string // if unset, the data indices will be used\n\tMode          string   // braille | dot\n\tDotStyle      rune\n\tLineColor     Attribute\n\tscale         float64 // data span per cell on y-axis\n\tAxesColor     Attribute\n\tdrawingX      int\n\tdrawingY      int\n\taxisYHeight   int\n\taxisXWidth    int\n\taxisYLabelGap int\n\taxisXLabelGap int\n\ttopValue      float64\n\tbottomValue   float64\n\tlabelX        [][]rune\n\tlabelY        [][]rune\n\tlabelYSpace   int\n\tmaxY          float64\n\tminY          float64\n\tautoLabels    bool\n}\n\n// NewLineChart returns a new LineChart with current theme.\nfunc NewLineChart() *LineChart {\n\tlc := &LineChart{Block: *NewBlock()}\n\tlc.AxesColor = ThemeAttr(\"linechart.axes.fg\")\n\tlc.LineColor = ThemeAttr(\"linechart.line.fg\")\n\tlc.Mode = \"braille\"\n\tlc.DotStyle = '•'\n\tlc.axisXLabelGap = 2\n\tlc.axisYLabelGap = 1\n\tlc.bottomValue = math.Inf(1)\n\tlc.topValue = math.Inf(-1)\n\treturn lc\n}\n\n// one cell contains two data points\n// so the capicity is 2x as dot-mode\nfunc (lc *LineChart) renderBraille() Buffer {\n\tbuf := NewBuffer()\n\n\t// return: b -> which cell should the point be in\n\t//         m -> in the cell, divided into 4 equal height levels, which subcell?\n\tgetPos := func(d float64) (b, m int) {\n\t\tcnt4 := int((d-lc.bottomValue)/(lc.scale/4) + 0.5)\n\t\tb = cnt4 / 4\n\t\tm = cnt4 % 4\n\t\treturn\n\t}\n\t// plot points\n\tfor i := 0; 2*i+1 < len(lc.Data) && i < lc.axisXWidth; i++ {\n\t\tb0, m0 := getPos(lc.Data[2*i])\n\t\tb1, m1 := getPos(lc.Data[2*i+1])\n\n\t\tif b0 == b1 {\n\t\t\tc := Cell{\n\t\t\t\tCh: braillePatterns[[2]int{m0, m1}],\n\t\t\t\tBg: lc.Bg,\n\t\t\t\tFg: lc.LineColor,\n\t\t\t}\n\t\t\ty := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b0\n\t\t\tx := lc.innerArea.Min.X + lc.labelYSpace + 1 + i\n\t\t\tbuf.Set(x, y, c)\n\t\t} else {\n\t\t\tc0 := Cell{Ch: lSingleBraille[m0],\n\t\t\t\tFg: lc.LineColor,\n\t\t\t\tBg: lc.Bg}\n\t\t\tx0 := lc.innerArea.Min.X + lc.labelYSpace + 1 + i\n\t\t\ty0 := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b0\n\t\t\tbuf.Set(x0, y0, c0)\n\n\t\t\tc1 := Cell{Ch: rSingleBraille[m1],\n\t\t\t\tFg: lc.LineColor,\n\t\t\t\tBg: lc.Bg}\n\t\t\tx1 := lc.innerArea.Min.X + lc.labelYSpace + 1 + i\n\t\t\ty1 := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b1\n\t\t\tbuf.Set(x1, y1, c1)\n\t\t}\n\n\t}\n\treturn buf\n}\n\nfunc (lc *LineChart) renderDot() Buffer {\n\tbuf := NewBuffer()\n\tfor i := 0; i < len(lc.Data) && i < lc.axisXWidth; i++ {\n\t\tc := Cell{\n\t\t\tCh: lc.DotStyle,\n\t\t\tFg: lc.LineColor,\n\t\t\tBg: lc.Bg,\n\t\t}\n\t\tx := lc.innerArea.Min.X + lc.labelYSpace + 1 + i\n\t\ty := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - int((lc.Data[i]-lc.bottomValue)/lc.scale+0.5)\n\t\tbuf.Set(x, y, c)\n\t}\n\n\treturn buf\n}\n\nfunc (lc *LineChart) calcLabelX() {\n\tlc.labelX = [][]rune{}\n\n\tfor i, l := 0, 0; i < len(lc.DataLabels) && l < lc.axisXWidth; i++ {\n\t\tif lc.Mode == \"dot\" {\n\t\t\tif l >= len(lc.DataLabels) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\ts := str2runes(lc.DataLabels[l])\n\t\t\tw := strWidth(lc.DataLabels[l])\n\t\t\tif l+w <= lc.axisXWidth {\n\t\t\t\tlc.labelX = append(lc.labelX, s)\n\t\t\t}\n\t\t\tl += w + lc.axisXLabelGap\n\t\t} else { // braille\n\t\t\tif 2*l >= len(lc.DataLabels) {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\ts := str2runes(lc.DataLabels[2*l])\n\t\t\tw := strWidth(lc.DataLabels[2*l])\n\t\t\tif l+w <= lc.axisXWidth {\n\t\t\t\tlc.labelX = append(lc.labelX, s)\n\t\t\t}\n\t\t\tl += w + lc.axisXLabelGap\n\n\t\t}\n\t}\n}\n\nfunc shortenFloatVal(x float64) string {\n\ts := fmt.Sprintf(\"%.2f\", x)\n\tif len(s)-3 > 3 {\n\t\ts = fmt.Sprintf(\"%.2e\", x)\n\t}\n\n\tif x < 0 {\n\t\ts = fmt.Sprintf(\"%.2f\", x)\n\t}\n\treturn s\n}\n\nfunc (lc *LineChart) calcLabelY() {\n\tspan := lc.topValue - lc.bottomValue\n\tlc.scale = span / float64(lc.axisYHeight)\n\n\tn := (1 + lc.axisYHeight) / (lc.axisYLabelGap + 1)\n\tlc.labelY = make([][]rune, n)\n\tmaxLen := 0\n\tfor i := 0; i < n; i++ {\n\t\ts := str2runes(shortenFloatVal(lc.bottomValue + float64(i)*span/float64(n)))\n\t\tif len(s) > maxLen {\n\t\t\tmaxLen = len(s)\n\t\t}\n\t\tlc.labelY[i] = s\n\t}\n\n\tlc.labelYSpace = maxLen\n}\n\nfunc (lc *LineChart) calcLayout() {\n\t// set datalabels if it is not provided\n\tif (lc.DataLabels == nil || len(lc.DataLabels) == 0) || lc.autoLabels {\n\t\tlc.autoLabels = true\n\t\tlc.DataLabels = make([]string, len(lc.Data))\n\t\tfor i := range lc.Data {\n\t\t\tlc.DataLabels[i] = fmt.Sprint(i)\n\t\t}\n\t}\n\n\t// lazy increase, to avoid y shaking frequently\n\t// update bound Y when drawing is gonna overflow\n\tlc.minY = lc.Data[0]\n\tlc.maxY = lc.Data[0]\n\n\t// valid visible range\n\tvrange := lc.innerArea.Dx()\n\tif lc.Mode == \"braille\" {\n\t\tvrange = 2 * lc.innerArea.Dx()\n\t}\n\tif vrange > len(lc.Data) {\n\t\tvrange = len(lc.Data)\n\t}\n\n\tfor _, v := range lc.Data[:vrange] {\n\t\tif v > lc.maxY {\n\t\t\tlc.maxY = v\n\t\t}\n\t\tif v < lc.minY {\n\t\t\tlc.minY = v\n\t\t}\n\t}\n\n\tspan := lc.maxY - lc.minY\n\n\tif lc.minY < lc.bottomValue {\n\t\tlc.bottomValue = lc.minY - 0.2*span\n\t}\n\n\tif lc.maxY > lc.topValue {\n\t\tlc.topValue = lc.maxY + 0.2*span\n\t}\n\n\tlc.axisYHeight = lc.innerArea.Dy() - 2\n\tlc.calcLabelY()\n\n\tlc.axisXWidth = lc.innerArea.Dx() - 1 - lc.labelYSpace\n\tlc.calcLabelX()\n\n\tlc.drawingX = lc.innerArea.Min.X + 1 + lc.labelYSpace\n\tlc.drawingY = lc.innerArea.Min.Y\n}\n\nfunc (lc *LineChart) plotAxes() Buffer {\n\tbuf := NewBuffer()\n\n\torigY := lc.innerArea.Min.Y + lc.innerArea.Dy() - 2\n\torigX := lc.innerArea.Min.X + lc.labelYSpace\n\n\tbuf.Set(origX, origY, Cell{Ch: ORIGIN, Fg: lc.AxesColor, Bg: lc.Bg})\n\n\tfor x := origX + 1; x < origX+lc.axisXWidth; x++ {\n\t\tbuf.Set(x, origY, Cell{Ch: HDASH, Fg: lc.AxesColor, Bg: lc.Bg})\n\t}\n\n\tfor dy := 1; dy <= lc.axisYHeight; dy++ {\n\t\tbuf.Set(origX, origY-dy, Cell{Ch: VDASH, Fg: lc.AxesColor, Bg: lc.Bg})\n\t}\n\n\t// x label\n\toft := 0\n\tfor _, rs := range lc.labelX {\n\t\tif oft+len(rs) > lc.axisXWidth {\n\t\t\tbreak\n\t\t}\n\t\tfor j, r := range rs {\n\t\t\tc := Cell{\n\t\t\t\tCh: r,\n\t\t\t\tFg: lc.AxesColor,\n\t\t\t\tBg: lc.Bg,\n\t\t\t}\n\t\t\tx := origX + oft + j\n\t\t\ty := lc.innerArea.Min.Y + lc.innerArea.Dy() - 1\n\t\t\tbuf.Set(x, y, c)\n\t\t}\n\t\toft += len(rs) + lc.axisXLabelGap\n\t}\n\n\t// y labels\n\tfor i, rs := range lc.labelY {\n\t\tfor j, r := range rs {\n\t\t\tbuf.Set(\n\t\t\t\tlc.innerArea.Min.X+j,\n\t\t\t\torigY-i*(lc.axisYLabelGap+1),\n\t\t\t\tCell{Ch: r, Fg: lc.AxesColor, Bg: lc.Bg})\n\t\t}\n\t}\n\n\treturn buf\n}\n\n// Buffer implements Bufferer interface.\nfunc (lc *LineChart) Buffer() Buffer {\n\tbuf := lc.Block.Buffer()\n\n\tif lc.Data == nil || len(lc.Data) == 0 {\n\t\treturn buf\n\t}\n\tlc.calcLayout()\n\tbuf.Merge(lc.plotAxes())\n\n\tif lc.Mode == \"dot\" {\n\t\tbuf.Merge(lc.renderDot())\n\t} else {\n\t\tbuf.Merge(lc.renderBraille())\n\t}\n\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/linechart_others.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\n// +build !windows\n\npackage termui\n\nconst VDASH = '┊'\nconst HDASH = '┈'\nconst ORIGIN = '└'\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/linechart_windows.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\n// +build windows\n\npackage termui\n\nconst VDASH = '|'\nconst HDASH = '-'\nconst ORIGIN = '+'\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/list.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport \"strings\"\n\n// List displays []string as its items,\n// it has a Overflow option (default is \"hidden\"), when set to \"hidden\",\n// the item exceeding List's width is truncated, but when set to \"wrap\",\n// the overflowed text breaks into next line.\n/*\n  strs := []string{\n\t\t\"[0] github.com/gizak/termui\",\n\t\t\"[1] editbox.go\",\n\t\t\"[2] iterrupt.go\",\n\t\t\"[3] keyboard.go\",\n\t\t\"[4] output.go\",\n\t\t\"[5] random_out.go\",\n\t\t\"[6] dashboard.go\",\n\t\t\"[7] nsf/termbox-go\"}\n\n  ls := termui.NewList()\n  ls.Items = strs\n  ls.ItemFgColor = termui.ColorYellow\n  ls.BorderLabel = \"List\"\n  ls.Height = 7\n  ls.Width = 25\n  ls.Y = 0\n*/\ntype List struct {\n\tBlock\n\tItems       []string\n\tOverflow    string\n\tItemFgColor Attribute\n\tItemBgColor Attribute\n}\n\n// NewList returns a new *List with current theme.\nfunc NewList() *List {\n\tl := &List{Block: *NewBlock()}\n\tl.Overflow = \"hidden\"\n\tl.ItemFgColor = ThemeAttr(\"list.item.fg\")\n\tl.ItemBgColor = ThemeAttr(\"list.item.bg\")\n\treturn l\n}\n\n// Buffer implements Bufferer interface.\nfunc (l *List) Buffer() Buffer {\n\tbuf := l.Block.Buffer()\n\n\tswitch l.Overflow {\n\tcase \"wrap\":\n\t\tcs := DefaultTxBuilder.Build(strings.Join(l.Items, \"\\n\"), l.ItemFgColor, l.ItemBgColor)\n\t\ti, j, k := 0, 0, 0\n\t\tfor i < l.innerArea.Dy() && k < len(cs) {\n\t\t\tw := cs[k].Width()\n\t\t\tif cs[k].Ch == '\\n' || j+w > l.innerArea.Dx() {\n\t\t\t\ti++\n\t\t\t\tj = 0\n\t\t\t\tif cs[k].Ch == '\\n' {\n\t\t\t\t\tk++\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbuf.Set(l.innerArea.Min.X+j, l.innerArea.Min.Y+i, cs[k])\n\n\t\t\tk++\n\t\t\tj++\n\t\t}\n\n\tcase \"hidden\":\n\t\ttrimItems := l.Items\n\t\tif len(trimItems) > l.innerArea.Dy() {\n\t\t\ttrimItems = trimItems[:l.innerArea.Dy()]\n\t\t}\n\t\tfor i, v := range trimItems {\n\t\t\tcs := DTrimTxCls(DefaultTxBuilder.Build(v, l.ItemFgColor, l.ItemBgColor), l.innerArea.Dx())\n\t\t\tj := 0\n\t\t\tfor _, vv := range cs {\n\t\t\t\tw := vv.Width()\n\t\t\t\tbuf.Set(l.innerArea.Min.X+j, l.innerArea.Min.Y+i, vv)\n\t\t\t\tj += w\n\t\t\t}\n\t\t}\n\t}\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/mbarchart.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"fmt\"\n)\n\n// This is the implemetation of multi-colored or stacked bar graph.  This is different from default barGraph which is implemented in bar.go\n// Multi-Colored-BarChart creates multiple bars in a widget:\n/*\n   bc := termui.NewMBarChart()\n   data := make([][]int, 2)\n   data[0] := []int{3, 2, 5, 7, 9, 4}\n   data[1] := []int{7, 8, 5, 3, 1, 6}\n   bclabels := []string{\"S0\", \"S1\", \"S2\", \"S3\", \"S4\", \"S5\"}\n   bc.BorderLabel = \"Bar Chart\"\n   bc.Data = data\n   bc.Width = 26\n   bc.Height = 10\n   bc.DataLabels = bclabels\n   bc.TextColor = termui.ColorGreen\n   bc.BarColor = termui.ColorRed\n   bc.NumColor = termui.ColorYellow\n*/\ntype MBarChart struct {\n\tBlock\n\tBarColor   [NumberofColors]Attribute\n\tTextColor  Attribute\n\tNumColor   [NumberofColors]Attribute\n\tData       [NumberofColors][]int\n\tDataLabels []string\n\tBarWidth   int\n\tBarGap     int\n\tlabels     [][]rune\n\tdataNum    [NumberofColors][][]rune\n\tnumBar     int\n\tscale      float64\n\tmax        int\n\tminDataLen int\n\tnumStack   int\n\tShowScale  bool\n\tmaxScale   []rune\n}\n\n// NewBarChart returns a new *BarChart with current theme.\nfunc NewMBarChart() *MBarChart {\n\tbc := &MBarChart{Block: *NewBlock()}\n\tbc.BarColor[0] = ThemeAttr(\"mbarchart.bar.bg\")\n\tbc.NumColor[0] = ThemeAttr(\"mbarchart.num.fg\")\n\tbc.TextColor = ThemeAttr(\"mbarchart.text.fg\")\n\tbc.BarGap = 1\n\tbc.BarWidth = 3\n\treturn bc\n}\n\nfunc (bc *MBarChart) layout() {\n\tbc.numBar = bc.innerArea.Dx() / (bc.BarGap + bc.BarWidth)\n\tbc.labels = make([][]rune, bc.numBar)\n\tDataLen := 0\n\tLabelLen := len(bc.DataLabels)\n\tbc.minDataLen = 9999 //Set this to some very hight value so that we find the minimum one We want to know which array among data[][] has got the least length\n\n\t// We need to know how many stack/data array data[0] , data[1] are there\n\tfor i := 0; i < len(bc.Data); i++ {\n\t\tif bc.Data[i] == nil {\n\t\t\tbreak\n\t\t}\n\t\tDataLen++\n\t}\n\tbc.numStack = DataLen\n\n\t//We need to know what is the mimimum size of data array data[0] could have 10 elements data[1] could have only 5, so we plot only 5 bar graphs\n\n\tfor i := 0; i < DataLen; i++ {\n\t\tif bc.minDataLen > len(bc.Data[i]) {\n\t\t\tbc.minDataLen = len(bc.Data[i])\n\t\t}\n\t}\n\n\tif LabelLen > bc.minDataLen {\n\t\tLabelLen = bc.minDataLen\n\t}\n\n\tfor i := 0; i < LabelLen && i < bc.numBar; i++ {\n\t\tbc.labels[i] = trimStr2Runes(bc.DataLabels[i], bc.BarWidth)\n\t}\n\n\tfor i := 0; i < bc.numStack; i++ {\n\t\tbc.dataNum[i] = make([][]rune, len(bc.Data[i]))\n\t\t//For each stack of bar calcualte the rune\n\t\tfor j := 0; j < LabelLen && i < bc.numBar; j++ {\n\t\t\tn := bc.Data[i][j]\n\t\t\ts := fmt.Sprint(n)\n\t\t\tbc.dataNum[i][j] = trimStr2Runes(s, bc.BarWidth)\n\t\t}\n\t\t//If color is not defined by default then populate a color that is different from the prevous bar\n\t\tif bc.BarColor[i] == ColorDefault && bc.NumColor[i] == ColorDefault {\n\t\t\tif i == 0 {\n\t\t\t\tbc.BarColor[i] = ColorBlack\n\t\t\t} else {\n\t\t\t\tbc.BarColor[i] = bc.BarColor[i-1] + 1\n\t\t\t\tif bc.BarColor[i] > NumberofColors {\n\t\t\t\t\tbc.BarColor[i] = ColorBlack\n\t\t\t\t}\n\t\t\t}\n\t\t\tbc.NumColor[i] = (NumberofColors + 1) - bc.BarColor[i] //Make NumColor opposite of barColor for visibility\n\t\t}\n\t}\n\n\t//If Max value is not set then we have to populate, this time the max value will be max(sum(d1[0],d2[0],d3[0]) .... sum(d1[n], d2[n], d3[n]))\n\n\tif bc.max == 0 {\n\t\tbc.max = -1\n\t}\n\tfor i := 0; i < bc.minDataLen && i < LabelLen; i++ {\n\t\tvar dsum int\n\t\tfor j := 0; j < bc.numStack; j++ {\n\t\t\tdsum += bc.Data[j][i]\n\t\t}\n\t\tif dsum > bc.max {\n\t\t\tbc.max = dsum\n\t\t}\n\t}\n\n\t//Finally Calculate max sale\n\tif bc.ShowScale {\n\t\ts := fmt.Sprintf(\"%d\", bc.max)\n\t\tbc.maxScale = trimStr2Runes(s, len(s))\n\t\tbc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-2)\n\t} else {\n\t\tbc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-1)\n\t}\n\n}\n\nfunc (bc *MBarChart) SetMax(max int) {\n\n\tif max > 0 {\n\t\tbc.max = max\n\t}\n}\n\n// Buffer implements Bufferer interface.\nfunc (bc *MBarChart) Buffer() Buffer {\n\tbuf := bc.Block.Buffer()\n\tbc.layout()\n\tvar oftX int\n\n\tfor i := 0; i < bc.numBar && i < bc.minDataLen && i < len(bc.DataLabels); i++ {\n\t\tph := 0 //Previous Height to stack up\n\t\toftX = i * (bc.BarWidth + bc.BarGap)\n\t\tfor i1 := 0; i1 < bc.numStack; i1++ {\n\t\t\th := int(float64(bc.Data[i1][i]) / bc.scale)\n\t\t\t// plot bars\n\t\t\tfor j := 0; j < bc.BarWidth; j++ {\n\t\t\t\tfor k := 0; k < h; k++ {\n\t\t\t\t\tc := Cell{\n\t\t\t\t\t\tCh: ' ',\n\t\t\t\t\t\tBg: bc.BarColor[i1],\n\t\t\t\t\t}\n\t\t\t\t\tif bc.BarColor[i1] == ColorDefault { // when color is default, space char treated as transparent!\n\t\t\t\t\t\tc.Bg |= AttrReverse\n\t\t\t\t\t}\n\t\t\t\t\tx := bc.innerArea.Min.X + i*(bc.BarWidth+bc.BarGap) + j\n\t\t\t\t\ty := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - k - ph\n\t\t\t\t\tbuf.Set(x, y, c)\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tph += h\n\t\t}\n\t\t// plot text\n\t\tfor j, k := 0, 0; j < len(bc.labels[i]); j++ {\n\t\t\tw := charWidth(bc.labels[i][j])\n\t\t\tc := Cell{\n\t\t\t\tCh: bc.labels[i][j],\n\t\t\t\tBg: bc.Bg,\n\t\t\t\tFg: bc.TextColor,\n\t\t\t}\n\t\t\ty := bc.innerArea.Min.Y + bc.innerArea.Dy() - 1\n\t\t\tx := bc.innerArea.Max.X + oftX + ((bc.BarWidth - len(bc.labels[i])) / 2) + k\n\t\t\tbuf.Set(x, y, c)\n\t\t\tk += w\n\t\t}\n\t\t// plot num\n\t\tph = 0 //re-initialize previous height\n\t\tfor i1 := 0; i1 < bc.numStack; i1++ {\n\t\t\th := int(float64(bc.Data[i1][i]) / bc.scale)\n\t\t\tfor j := 0; j < len(bc.dataNum[i1][i]) && h > 0; j++ {\n\t\t\t\tc := Cell{\n\t\t\t\t\tCh: bc.dataNum[i1][i][j],\n\t\t\t\t\tFg: bc.NumColor[i1],\n\t\t\t\t\tBg: bc.BarColor[i1],\n\t\t\t\t}\n\t\t\t\tif bc.BarColor[i1] == ColorDefault { // the same as above\n\t\t\t\t\tc.Bg |= AttrReverse\n\t\t\t\t}\n\t\t\t\tif h == 0 {\n\t\t\t\t\tc.Bg = bc.Bg\n\t\t\t\t}\n\t\t\t\tx := bc.innerArea.Min.X + oftX + (bc.BarWidth-len(bc.dataNum[i1][i]))/2 + j\n\t\t\t\ty := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - ph\n\t\t\t\tbuf.Set(x, y, c)\n\t\t\t}\n\t\t\tph += h\n\t\t}\n\t}\n\n\tif bc.ShowScale {\n\t\t//Currently bar graph only supprts data range from 0 to MAX\n\t\t//Plot 0\n\t\tc := Cell{\n\t\t\tCh: '0',\n\t\t\tBg: bc.Bg,\n\t\t\tFg: bc.TextColor,\n\t\t}\n\n\t\ty := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2\n\t\tx := bc.X\n\t\tbuf.Set(x, y, c)\n\n\t\t//Plot the maximum sacle value\n\t\tfor i := 0; i < len(bc.maxScale); i++ {\n\t\t\tc := Cell{\n\t\t\t\tCh: bc.maxScale[i],\n\t\t\t\tBg: bc.Bg,\n\t\t\t\tFg: bc.TextColor,\n\t\t\t}\n\n\t\t\ty := bc.innerArea.Min.Y\n\t\t\tx := bc.X + i\n\n\t\t\tbuf.Set(x, y, c)\n\t\t}\n\n\t}\n\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/mkdocs.yml",
    "content": "pages:\n- Home: 'index.md'\n- Quickstart: 'quickstart.md'\n- Recipes: 'recipes.md'\n- References:\n    - Layouts: 'layouts.md'\n    - Components: 'components.md'\n    - Events: 'events.md'\n    - Themes: 'themes.md'\n- Versions: 'versions.md'\n- About: 'about.md'\n\nsite_name: termui\nrepo_url: https://github.com/gizak/termui/\nsite_description: 'termui user guide'\nsite_author: gizak\n\ndocs_dir: '_docs'\n\ntheme: readthedocs\n\nmarkdown_extensions:\n  - smarty\n  - admonition\n  - toc\n\nextra:\n    version: 1.0\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/par.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\n// Par displays a paragraph.\n/*\n  par := termui.NewPar(\"Simple Text\")\n  par.Height = 3\n  par.Width = 17\n  par.BorderLabel = \"Label\"\n*/\ntype Par struct {\n\tBlock\n\tText        string\n\tTextFgColor Attribute\n\tTextBgColor Attribute\n\tWrapLength  int // words wrap limit. Note it may not work properly with multi-width char\n}\n\n// NewPar returns a new *Par with given text as its content.\nfunc NewPar(s string) *Par {\n\treturn &Par{\n\t\tBlock:       *NewBlock(),\n\t\tText:        s,\n\t\tTextFgColor: ThemeAttr(\"par.text.fg\"),\n\t\tTextBgColor: ThemeAttr(\"par.text.bg\"),\n\t\tWrapLength:  0,\n\t}\n}\n\n// Buffer implements Bufferer interface.\nfunc (p *Par) Buffer() Buffer {\n\tbuf := p.Block.Buffer()\n\n\tfg, bg := p.TextFgColor, p.TextBgColor\n\tcs := DefaultTxBuilder.Build(p.Text, fg, bg)\n\n\t// wrap if WrapLength set\n\tif p.WrapLength < 0 {\n\t\tcs = wrapTx(cs, p.Width-2)\n\t} else if p.WrapLength > 0 {\n\t\tcs = wrapTx(cs, p.WrapLength)\n\t}\n\n\ty, x, n := 0, 0, 0\n\tfor y < p.innerArea.Dy() && n < len(cs) {\n\t\tw := cs[n].Width()\n\t\tif cs[n].Ch == '\\n' || x+w > p.innerArea.Dx() {\n\t\t\ty++\n\t\t\tx = 0 // set x = 0\n\t\t\tif cs[n].Ch == '\\n' {\n\t\t\t\tn++\n\t\t\t}\n\n\t\t\tif y >= p.innerArea.Dy() {\n\t\t\t\tbuf.Set(p.innerArea.Min.X+p.innerArea.Dx()-1,\n\t\t\t\t\tp.innerArea.Min.Y+p.innerArea.Dy()-1,\n\t\t\t\t\tCell{Ch: '…', Fg: p.TextFgColor, Bg: p.TextBgColor})\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tbuf.Set(p.innerArea.Min.X+x, p.innerArea.Min.Y+y, cs[n])\n\n\t\tn++\n\t\tx += w\n\t}\n\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/pos.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport \"image\"\n\n// Align is the position of the gauge's label.\ntype Align uint\n\n// All supported positions.\nconst (\n\tAlignNone Align = 0\n\tAlignLeft Align = 1 << iota\n\tAlignRight\n\tAlignBottom\n\tAlignTop\n\tAlignCenterVertical\n\tAlignCenterHorizontal\n\tAlignCenter = AlignCenterVertical | AlignCenterHorizontal\n)\n\nfunc AlignArea(parent, child image.Rectangle, a Align) image.Rectangle {\n\tw, h := child.Dx(), child.Dy()\n\n\t// parent center\n\tpcx, pcy := parent.Min.X+parent.Dx()/2, parent.Min.Y+parent.Dy()/2\n\t// child center\n\tccx, ccy := child.Min.X+child.Dx()/2, child.Min.Y+child.Dy()/2\n\n\tif a&AlignLeft == AlignLeft {\n\t\tchild.Min.X = parent.Min.X\n\t\tchild.Max.X = child.Min.X + w\n\t}\n\n\tif a&AlignRight == AlignRight {\n\t\tchild.Max.X = parent.Max.X\n\t\tchild.Min.X = child.Max.X - w\n\t}\n\n\tif a&AlignBottom == AlignBottom {\n\t\tchild.Max.Y = parent.Max.Y\n\t\tchild.Min.Y = child.Max.Y - h\n\t}\n\n\tif a&AlignTop == AlignRight {\n\t\tchild.Min.Y = parent.Min.Y\n\t\tchild.Max.Y = child.Min.Y + h\n\t}\n\n\tif a&AlignCenterHorizontal == AlignCenterHorizontal {\n\t\tchild.Min.X += pcx - ccx\n\t\tchild.Max.X = child.Min.X + w\n\t}\n\n\tif a&AlignCenterVertical == AlignCenterVertical {\n\t\tchild.Min.Y += pcy - ccy\n\t\tchild.Max.Y = child.Min.Y + h\n\t}\n\n\treturn child\n}\n\nfunc MoveArea(a image.Rectangle, dx, dy int) image.Rectangle {\n\ta.Min.X += dx\n\ta.Max.X += dx\n\ta.Min.Y += dy\n\ta.Max.Y += dy\n\treturn a\n}\n\nvar termWidth int\nvar termHeight int\n\nfunc TermRect() image.Rectangle {\n\treturn image.Rect(0, 0, termWidth, termHeight)\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/render.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"image\"\n\t\"io\"\n\t\"sync\"\n\t\"time\"\n\n\t\"fmt\"\n\n\t\"os\"\n\n\t\"runtime/debug\"\n\n\t\"bytes\"\n\n\t\"github.com/maruel/panicparse/stack\"\n\ttm \"github.com/nsf/termbox-go\"\n)\n\n// Bufferer should be implemented by all renderable components.\ntype Bufferer interface {\n\tBuffer() Buffer\n}\n\n// Init initializes termui library. This function should be called before any others.\n// After initialization, the library must be finalized by 'Close' function.\nfunc Init() error {\n\tif err := tm.Init(); err != nil {\n\t\treturn err\n\t}\n\n\tsysEvtChs = make([]chan Event, 0)\n\tgo hookTermboxEvt()\n\n\trenderJobs = make(chan []Bufferer)\n\t//renderLock = new(sync.RWMutex)\n\n\tBody = NewGrid()\n\tBody.X = 0\n\tBody.Y = 0\n\tBody.BgColor = ThemeAttr(\"bg\")\n\tBody.Width = TermWidth()\n\n\tDefaultEvtStream.Init()\n\tDefaultEvtStream.Merge(\"termbox\", NewSysEvtCh())\n\tDefaultEvtStream.Merge(\"timer\", NewTimerCh(time.Second))\n\tDefaultEvtStream.Merge(\"custom\", usrEvtCh)\n\n\tDefaultEvtStream.Handle(\"/\", DefaultHandler)\n\tDefaultEvtStream.Handle(\"/sys/wnd/resize\", func(e Event) {\n\t\tw := e.Data.(EvtWnd)\n\t\tBody.Width = w.Width\n\t})\n\n\tDefaultWgtMgr = NewWgtMgr()\n\tDefaultEvtStream.Hook(DefaultWgtMgr.WgtHandlersHook())\n\n\tgo func() {\n\t\tfor bs := range renderJobs {\n\t\t\trender(bs...)\n\t\t}\n\t}()\n\n\treturn nil\n}\n\n// Close finalizes termui library,\n// should be called after successful initialization when termui's functionality isn't required anymore.\nfunc Close() {\n\ttm.Close()\n}\n\nvar renderLock sync.Mutex\n\nfunc termSync() {\n\trenderLock.Lock()\n\ttm.Sync()\n\ttermWidth, termHeight = tm.Size()\n\trenderLock.Unlock()\n}\n\n// TermWidth returns the current terminal's width.\nfunc TermWidth() int {\n\ttermSync()\n\treturn termWidth\n}\n\n// TermHeight returns the current terminal's height.\nfunc TermHeight() int {\n\ttermSync()\n\treturn termHeight\n}\n\n// Render renders all Bufferer in the given order from left to right,\n// right could overlap on left ones.\nfunc render(bs ...Bufferer) {\n\tdefer func() {\n\t\tif e := recover(); e != nil {\n\t\t\tClose()\n\t\t\tfmt.Fprintf(os.Stderr, \"Captured a panic(value=%v) when rendering Bufferer. Exit termui and clean terminal...\\nPrint stack trace:\\n\\n\", e)\n\t\t\t//debug.PrintStack()\n\t\t\tgs, err := stack.ParseDump(bytes.NewReader(debug.Stack()), os.Stderr)\n\t\t\tif err != nil {\n\t\t\t\tdebug.PrintStack()\n\t\t\t\tos.Exit(1)\n\t\t\t}\n\t\t\tp := &stack.Palette{}\n\t\t\tbuckets := stack.SortBuckets(stack.Bucketize(gs, stack.AnyValue))\n\t\t\tsrcLen, pkgLen := stack.CalcLengths(buckets, false)\n\t\t\tfor _, bucket := range buckets {\n\t\t\t\tio.WriteString(os.Stdout, p.BucketHeader(&bucket, false, len(buckets) > 1))\n\t\t\t\tio.WriteString(os.Stdout, p.StackLines(&bucket.Signature, srcLen, pkgLen, false))\n\t\t\t}\n\t\t\tos.Exit(1)\n\t\t}\n\t}()\n\tfor _, b := range bs {\n\n\t\tbuf := b.Buffer()\n\t\t// set cels in buf\n\t\tfor p, c := range buf.CellMap {\n\t\t\tif p.In(buf.Area) {\n\n\t\t\t\ttm.SetCell(p.X, p.Y, c.Ch, toTmAttr(c.Fg), toTmAttr(c.Bg))\n\n\t\t\t}\n\t\t}\n\n\t}\n\n\trenderLock.Lock()\n\t// render\n\ttm.Flush()\n\trenderLock.Unlock()\n}\n\nfunc Clear() {\n\ttm.Clear(tm.ColorDefault, toTmAttr(ThemeAttr(\"bg\")))\n}\n\nfunc clearArea(r image.Rectangle, bg Attribute) {\n\tfor i := r.Min.X; i < r.Max.X; i++ {\n\t\tfor j := r.Min.Y; j < r.Max.Y; j++ {\n\t\t\ttm.SetCell(i, j, ' ', tm.ColorDefault, toTmAttr(bg))\n\t\t}\n\t}\n}\n\nfunc ClearArea(r image.Rectangle, bg Attribute) {\n\tclearArea(r, bg)\n\ttm.Flush()\n}\n\nvar renderJobs chan []Bufferer\n\nfunc Render(bs ...Bufferer) {\n\t//go func() { renderJobs <- bs }()\n\trenderJobs <- bs\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/sparkline.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\n// Sparkline is like: ▅▆▂▂▅▇▂▂▃▆▆▆▅▃. The data points should be non-negative integers.\n/*\n  data := []int{4, 2, 1, 6, 3, 9, 1, 4, 2, 15, 14, 9, 8, 6, 10, 13, 15, 12, 10, 5, 3, 6, 1}\n  spl := termui.NewSparkline()\n  spl.Data = data\n  spl.Title = \"Sparkline 0\"\n  spl.LineColor = termui.ColorGreen\n*/\ntype Sparkline struct {\n\tData          []int\n\tHeight        int\n\tTitle         string\n\tTitleColor    Attribute\n\tLineColor     Attribute\n\tdisplayHeight int\n\tscale         float32\n\tmax           int\n}\n\n// Sparklines is a renderable widget which groups together the given sparklines.\n/*\n  spls := termui.NewSparklines(spl0,spl1,spl2) //...\n  spls.Height = 2\n  spls.Width = 20\n*/\ntype Sparklines struct {\n\tBlock\n\tLines        []Sparkline\n\tdisplayLines int\n\tdisplayWidth int\n}\n\nvar sparks = []rune{'▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'}\n\n// Add appends a given Sparkline to s *Sparklines.\nfunc (s *Sparklines) Add(sl Sparkline) {\n\ts.Lines = append(s.Lines, sl)\n}\n\n// NewSparkline returns a unrenderable single sparkline that intended to be added into Sparklines.\nfunc NewSparkline() Sparkline {\n\treturn Sparkline{\n\t\tHeight:     1,\n\t\tTitleColor: ThemeAttr(\"sparkline.title.fg\"),\n\t\tLineColor:  ThemeAttr(\"sparkline.line.fg\")}\n}\n\n// NewSparklines return a new *Spaklines with given Sparkline(s), you can always add a new Sparkline later.\nfunc NewSparklines(ss ...Sparkline) *Sparklines {\n\ts := &Sparklines{Block: *NewBlock(), Lines: ss}\n\treturn s\n}\n\nfunc (sl *Sparklines) update() {\n\tfor i, v := range sl.Lines {\n\t\tif v.Title == \"\" {\n\t\t\tsl.Lines[i].displayHeight = v.Height\n\t\t} else {\n\t\t\tsl.Lines[i].displayHeight = v.Height + 1\n\t\t}\n\t}\n\tsl.displayWidth = sl.innerArea.Dx()\n\n\t// get how many lines gotta display\n\th := 0\n\tsl.displayLines = 0\n\tfor _, v := range sl.Lines {\n\t\tif h+v.displayHeight <= sl.innerArea.Dy() {\n\t\t\tsl.displayLines++\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t\th += v.displayHeight\n\t}\n\n\tfor i := 0; i < sl.displayLines; i++ {\n\t\tdata := sl.Lines[i].Data\n\n\t\tmax := 0\n\t\tfor _, v := range data {\n\t\t\tif max < v {\n\t\t\t\tmax = v\n\t\t\t}\n\t\t}\n\t\tsl.Lines[i].max = max\n\t\tif max != 0 {\n\t\t\tsl.Lines[i].scale = float32(8*sl.Lines[i].Height) / float32(max)\n\t\t} else { // when all negative\n\t\t\tsl.Lines[i].scale = 0\n\t\t}\n\t}\n}\n\n// Buffer implements Bufferer interface.\nfunc (sl *Sparklines) Buffer() Buffer {\n\tbuf := sl.Block.Buffer()\n\tsl.update()\n\n\toftY := 0\n\tfor i := 0; i < sl.displayLines; i++ {\n\t\tl := sl.Lines[i]\n\t\tdata := l.Data\n\n\t\tif len(data) > sl.innerArea.Dx() {\n\t\t\tdata = data[len(data)-sl.innerArea.Dx():]\n\t\t}\n\n\t\tif l.Title != \"\" {\n\t\t\trs := trimStr2Runes(l.Title, sl.innerArea.Dx())\n\t\t\toftX := 0\n\t\t\tfor _, v := range rs {\n\t\t\t\tw := charWidth(v)\n\t\t\t\tc := Cell{\n\t\t\t\t\tCh: v,\n\t\t\t\t\tFg: l.TitleColor,\n\t\t\t\t\tBg: sl.Bg,\n\t\t\t\t}\n\t\t\t\tx := sl.innerArea.Min.X + oftX\n\t\t\t\ty := sl.innerArea.Min.Y + oftY\n\t\t\t\tbuf.Set(x, y, c)\n\t\t\t\toftX += w\n\t\t\t}\n\t\t}\n\n\t\tfor j, v := range data {\n\t\t\t// display height of the data point, zero when data is negative\n\t\t\th := int(float32(v)*l.scale + 0.5)\n\t\t\tif v < 0 {\n\t\t\t\th = 0\n\t\t\t}\n\n\t\t\tbarCnt := h / 8\n\t\t\tbarMod := h % 8\n\t\t\tfor jj := 0; jj < barCnt; jj++ {\n\t\t\t\tc := Cell{\n\t\t\t\t\tCh: ' ', // => sparks[7]\n\t\t\t\t\tBg: l.LineColor,\n\t\t\t\t}\n\t\t\t\tx := sl.innerArea.Min.X + j\n\t\t\t\ty := sl.innerArea.Min.Y + oftY + l.Height - jj\n\n\t\t\t\t//p.Bg = sl.BgColor\n\t\t\t\tbuf.Set(x, y, c)\n\t\t\t}\n\t\t\tif barMod != 0 {\n\t\t\t\tc := Cell{\n\t\t\t\t\tCh: sparks[barMod-1],\n\t\t\t\t\tFg: l.LineColor,\n\t\t\t\t\tBg: sl.Bg,\n\t\t\t\t}\n\t\t\t\tx := sl.innerArea.Min.X + j\n\t\t\t\ty := sl.innerArea.Min.Y + oftY + l.Height - barCnt\n\t\t\t\tbuf.Set(x, y, c)\n\t\t\t}\n\t\t}\n\n\t\toftY += l.displayHeight\n\t}\n\n\treturn buf\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/table.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport \"strings\"\n\n/* Table is like:\n\n┌Awesome Table ────────────────────────────────────────────────┐\n│  Col0          | Col1 | Col2 | Col3  | Col4  | Col5  | Col6  |\n│──────────────────────────────────────────────────────────────│\n│  Some Item #1  | AAA  | 123  | CCCCC | EEEEE | GGGGG | IIIII |\n│──────────────────────────────────────────────────────────────│\n│  Some Item #2  | BBB  | 456  | DDDDD | FFFFF | HHHHH | JJJJJ |\n└──────────────────────────────────────────────────────────────┘\n\nDatapoints are a two dimensional array of strings: [][]string\n\nExample:\n\tdata := [][]string{\n\t\t{\"Col0\", \"Col1\", \"Col3\", \"Col4\", \"Col5\", \"Col6\"},\n\t\t{\"Some Item #1\", \"AAA\", \"123\", \"CCCCC\", \"EEEEE\", \"GGGGG\", \"IIIII\"},\n\t\t{\"Some Item #2\", \"BBB\", \"456\", \"DDDDD\", \"FFFFF\", \"HHHHH\", \"JJJJJ\"},\n\t}\n\n\ttable := termui.NewTable()\n\ttable.Rows = data  // type [][]string\n\ttable.FgColor = termui.ColorWhite\n\ttable.BgColor = termui.ColorDefault\n\ttable.Height = 7\n\ttable.Width = 62\n\ttable.Y = 0\n\ttable.X = 0\n\ttable.Border = true\n*/\n\n// Table tracks all the attributes of a Table instance\ntype Table struct {\n\tBlock\n\tRows      [][]string\n\tCellWidth []int\n\tFgColor   Attribute\n\tBgColor   Attribute\n\tFgColors  []Attribute\n\tBgColors  []Attribute\n\tSeparator bool\n\tTextAlign Align\n}\n\n// NewTable returns a new Table instance\nfunc NewTable() *Table {\n\ttable := &Table{Block: *NewBlock()}\n\ttable.FgColor = ColorWhite\n\ttable.BgColor = ColorDefault\n\ttable.Separator = true\n\treturn table\n}\n\n// CellsWidth calculates the width of a cell array and returns an int\nfunc cellsWidth(cells []Cell) int {\n\twidth := 0\n\tfor _, c := range cells {\n\t\twidth += c.Width()\n\t}\n\treturn width\n}\n\n// Analysis generates and returns an array of []Cell that represent all columns in the Table\nfunc (table *Table) Analysis() [][]Cell {\n\tvar rowCells [][]Cell\n\tlength := len(table.Rows)\n\tif length < 1 {\n\t\treturn rowCells\n\t}\n\n\tif len(table.FgColors) == 0 {\n\t\ttable.FgColors = make([]Attribute, len(table.Rows))\n\t}\n\tif len(table.BgColors) == 0 {\n\t\ttable.BgColors = make([]Attribute, len(table.Rows))\n\t}\n\n\tcellWidths := make([]int, len(table.Rows[0]))\n\n\tfor y, row := range table.Rows {\n\t\tif table.FgColors[y] == 0 {\n\t\t\ttable.FgColors[y] = table.FgColor\n\t\t}\n\t\tif table.BgColors[y] == 0 {\n\t\t\ttable.BgColors[y] = table.BgColor\n\t\t}\n\t\tfor x, str := range row {\n\t\t\tcells := DefaultTxBuilder.Build(str, table.FgColors[y], table.BgColors[y])\n\t\t\tcw := cellsWidth(cells)\n\t\t\tif cellWidths[x] < cw {\n\t\t\t\tcellWidths[x] = cw\n\t\t\t}\n\t\t\trowCells = append(rowCells, cells)\n\t\t}\n\t}\n\ttable.CellWidth = cellWidths\n\treturn rowCells\n}\n\n// SetSize calculates the table size and sets the internal value\nfunc (table *Table) SetSize() {\n\tlength := len(table.Rows)\n\tif table.Separator {\n\t\ttable.Height = length*2 + 1\n\t} else {\n\t\ttable.Height = length + 2\n\t}\n\ttable.Width = 2\n\tif length != 0 {\n\t\tfor _, cellWidth := range table.CellWidth {\n\t\t\ttable.Width += cellWidth + 3\n\t\t}\n\t}\n}\n\n// CalculatePosition ...\nfunc (table *Table) CalculatePosition(x int, y int, coordinateX *int, coordinateY *int, cellStart *int) {\n\tif table.Separator {\n\t\t*coordinateY = table.innerArea.Min.Y + y*2\n\t} else {\n\t\t*coordinateY = table.innerArea.Min.Y + y\n\t}\n\tif x == 0 {\n\t\t*cellStart = table.innerArea.Min.X\n\t} else {\n\t\t*cellStart += table.CellWidth[x-1] + 3\n\t}\n\n\tswitch table.TextAlign {\n\tcase AlignRight:\n\t\t*coordinateX = *cellStart + (table.CellWidth[x] - len(table.Rows[y][x])) + 2\n\tcase AlignCenter:\n\t\t*coordinateX = *cellStart + (table.CellWidth[x]-len(table.Rows[y][x]))/2 + 2\n\tdefault:\n\t\t*coordinateX = *cellStart + 2\n\t}\n}\n\n// Buffer ...\nfunc (table *Table) Buffer() Buffer {\n\tbuffer := table.Block.Buffer()\n\trowCells := table.Analysis()\n\tpointerX := table.innerArea.Min.X + 2\n\tpointerY := table.innerArea.Min.Y\n\tborderPointerX := table.innerArea.Min.X\n\tfor y, row := range table.Rows {\n\t\tfor x := range row {\n\t\t\ttable.CalculatePosition(x, y, &pointerX, &pointerY, &borderPointerX)\n\t\t\tbackground := DefaultTxBuilder.Build(strings.Repeat(\" \", table.CellWidth[x]+3), table.BgColors[y], table.BgColors[y])\n\t\t\tcells := rowCells[y*len(row)+x]\n\t\t\tfor i, back := range background {\n\t\t\t\tbuffer.Set(borderPointerX+i, pointerY, back)\n\t\t\t}\n\n\t\t\tcoordinateX := pointerX\n\t\t\tfor _, printer := range cells {\n\t\t\t\tbuffer.Set(coordinateX, pointerY, printer)\n\t\t\t\tcoordinateX += printer.Width()\n\t\t\t}\n\n\t\t\tif x != 0 {\n\t\t\t\tdividors := DefaultTxBuilder.Build(\"|\", table.FgColors[y], table.BgColors[y])\n\t\t\t\tfor _, dividor := range dividors {\n\t\t\t\t\tbuffer.Set(borderPointerX, pointerY, dividor)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif table.Separator {\n\t\t\tborder := DefaultTxBuilder.Build(strings.Repeat(\"─\", table.Width-2), table.FgColor, table.BgColor)\n\t\t\tfor i, cell := range border {\n\t\t\t\tbuffer.Set(i+1, pointerY+1, cell)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn buffer\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/textbuilder.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/mitchellh/go-wordwrap\"\n)\n\n// TextBuilder is a minimal interface to produce text []Cell using specific syntax (markdown).\ntype TextBuilder interface {\n\tBuild(s string, fg, bg Attribute) []Cell\n}\n\n// DefaultTxBuilder is set to be MarkdownTxBuilder.\nvar DefaultTxBuilder = NewMarkdownTxBuilder()\n\n// MarkdownTxBuilder implements TextBuilder interface, using markdown syntax.\ntype MarkdownTxBuilder struct {\n\tbaseFg  Attribute\n\tbaseBg  Attribute\n\tplainTx []rune\n\tmarkers []marker\n}\n\ntype marker struct {\n\tst int\n\ted int\n\tfg Attribute\n\tbg Attribute\n}\n\nvar colorMap = map[string]Attribute{\n\t\"red\":     ColorRed,\n\t\"blue\":    ColorBlue,\n\t\"black\":   ColorBlack,\n\t\"cyan\":    ColorCyan,\n\t\"yellow\":  ColorYellow,\n\t\"white\":   ColorWhite,\n\t\"default\": ColorDefault,\n\t\"green\":   ColorGreen,\n\t\"magenta\": ColorMagenta,\n}\n\nvar attrMap = map[string]Attribute{\n\t\"bold\":      AttrBold,\n\t\"underline\": AttrUnderline,\n\t\"reverse\":   AttrReverse,\n}\n\nfunc rmSpc(s string) string {\n\treg := regexp.MustCompile(`\\s+`)\n\treturn reg.ReplaceAllString(s, \"\")\n}\n\n// readAttr translates strings like `fg-red,fg-bold,bg-white` to fg and bg Attribute\nfunc (mtb MarkdownTxBuilder) readAttr(s string) (Attribute, Attribute) {\n\tfg := mtb.baseFg\n\tbg := mtb.baseBg\n\n\tupdateAttr := func(a Attribute, attrs []string) Attribute {\n\t\tfor _, s := range attrs {\n\t\t\t// replace the color\n\t\t\tif c, ok := colorMap[s]; ok {\n\t\t\t\ta &= 0xFF00 // erase clr 0 ~ 8 bits\n\t\t\t\ta |= c      // set clr\n\t\t\t}\n\t\t\t// add attrs\n\t\t\tif c, ok := attrMap[s]; ok {\n\t\t\t\ta |= c\n\t\t\t}\n\t\t}\n\t\treturn a\n\t}\n\n\tss := strings.Split(s, \",\")\n\tfgs := []string{}\n\tbgs := []string{}\n\tfor _, v := range ss {\n\t\tsubs := strings.Split(v, \"-\")\n\t\tif len(subs) > 1 {\n\t\t\tif subs[0] == \"fg\" {\n\t\t\t\tfgs = append(fgs, subs[1])\n\t\t\t}\n\t\t\tif subs[0] == \"bg\" {\n\t\t\t\tbgs = append(bgs, subs[1])\n\t\t\t}\n\t\t}\n\t}\n\n\tfg = updateAttr(fg, fgs)\n\tbg = updateAttr(bg, bgs)\n\treturn fg, bg\n}\n\nfunc (mtb *MarkdownTxBuilder) reset() {\n\tmtb.plainTx = []rune{}\n\tmtb.markers = []marker{}\n}\n\n// parse streams and parses text into normalized text and render sequence.\nfunc (mtb *MarkdownTxBuilder) parse(str string) {\n\trs := str2runes(str)\n\tnormTx := []rune{}\n\tsquare := []rune{}\n\tbrackt := []rune{}\n\taccSquare := false\n\taccBrackt := false\n\tcntSquare := 0\n\n\treset := func() {\n\t\tsquare = []rune{}\n\t\tbrackt = []rune{}\n\t\taccSquare = false\n\t\taccBrackt = false\n\t\tcntSquare = 0\n\t}\n\t// pipe stacks into normTx and clear\n\trollback := func() {\n\t\tnormTx = append(normTx, square...)\n\t\tnormTx = append(normTx, brackt...)\n\t\treset()\n\t}\n\t// chop first and last\n\tchop := func(s []rune) []rune {\n\t\treturn s[1 : len(s)-1]\n\t}\n\n\tfor i, r := range rs {\n\t\tswitch {\n\t\t// stacking brackt\n\t\tcase accBrackt:\n\t\t\tbrackt = append(brackt, r)\n\t\t\tif ')' == r {\n\t\t\t\tfg, bg := mtb.readAttr(string(chop(brackt)))\n\t\t\t\tst := len(normTx)\n\t\t\t\ted := len(normTx) + len(square) - 2\n\t\t\t\tmtb.markers = append(mtb.markers, marker{st, ed, fg, bg})\n\t\t\t\tnormTx = append(normTx, chop(square)...)\n\t\t\t\treset()\n\t\t\t} else if i+1 == len(rs) {\n\t\t\t\trollback()\n\t\t\t}\n\t\t// stacking square\n\t\tcase accSquare:\n\t\t\tswitch {\n\t\t\t// squares closed and followed by a '('\n\t\t\tcase cntSquare == 0 && '(' == r:\n\t\t\t\taccBrackt = true\n\t\t\t\tbrackt = append(brackt, '(')\n\t\t\t// squares closed but not followed by a '('\n\t\t\tcase cntSquare == 0:\n\t\t\t\trollback()\n\t\t\t\tif '[' == r {\n\t\t\t\t\taccSquare = true\n\t\t\t\t\tcntSquare = 1\n\t\t\t\t\tbrackt = append(brackt, '[')\n\t\t\t\t} else {\n\t\t\t\t\tnormTx = append(normTx, r)\n\t\t\t\t}\n\t\t\t// hit the end\n\t\t\tcase i+1 == len(rs):\n\t\t\t\tsquare = append(square, r)\n\t\t\t\trollback()\n\t\t\tcase '[' == r:\n\t\t\t\tcntSquare++\n\t\t\t\tsquare = append(square, '[')\n\t\t\tcase ']' == r:\n\t\t\t\tcntSquare--\n\t\t\t\tsquare = append(square, ']')\n\t\t\t// normal char\n\t\t\tdefault:\n\t\t\t\tsquare = append(square, r)\n\t\t\t}\n\t\t// stacking normTx\n\t\tdefault:\n\t\t\tif '[' == r {\n\t\t\t\taccSquare = true\n\t\t\t\tcntSquare = 1\n\t\t\t\tsquare = append(square, '[')\n\t\t\t} else {\n\t\t\t\tnormTx = append(normTx, r)\n\t\t\t}\n\t\t}\n\t}\n\n\tmtb.plainTx = normTx\n}\n\nfunc wrapTx(cs []Cell, wl int) []Cell {\n\ttmpCell := make([]Cell, len(cs))\n\tcopy(tmpCell, cs)\n\n\t// get the plaintext\n\tplain := CellsToStr(cs)\n\n\t// wrap\n\tplainWrapped := wordwrap.WrapString(plain, uint(wl))\n\n\t// find differences and insert\n\tfinalCell := tmpCell // finalcell will get the inserts and is what is returned\n\n\tplainRune := []rune(plain)\n\tplainWrappedRune := []rune(plainWrapped)\n\ttrigger := \"go\"\n\tplainRuneNew := plainRune\n\n\tfor trigger != \"stop\" {\n\t\tplainRune = plainRuneNew\n\t\tfor i := range plainRune {\n\t\t\tif plainRune[i] == plainWrappedRune[i] {\n\t\t\t\ttrigger = \"stop\"\n\t\t\t} else if plainRune[i] != plainWrappedRune[i] && plainWrappedRune[i] == 10 {\n\t\t\t\ttrigger = \"go\"\n\t\t\t\tcell := Cell{10, 0, 0}\n\t\t\t\tj := i - 0\n\n\t\t\t\t// insert a cell into the []Cell in correct position\n\t\t\t\ttmpCell[i] = cell\n\n\t\t\t\t// insert the newline into plain so we avoid indexing errors\n\t\t\t\tplainRuneNew = append(plainRune, 10)\n\t\t\t\tcopy(plainRuneNew[j+1:], plainRuneNew[j:])\n\t\t\t\tplainRuneNew[j] = plainWrappedRune[j]\n\n\t\t\t\t// restart the inner for loop until plain and plain wrapped are\n\t\t\t\t// the same; yeah, it's inefficient, but the text amounts\n\t\t\t\t// should be small\n\t\t\t\tbreak\n\n\t\t\t} else if plainRune[i] != plainWrappedRune[i] &&\n\t\t\t\tplainWrappedRune[i-1] == 10 && // if the prior rune is a newline\n\t\t\t\tplainRune[i] == 32 { // and this rune is a space\n\t\t\t\ttrigger = \"go\"\n\t\t\t\t// need to delete plainRune[i] because it gets rid of an extra\n\t\t\t\t// space\n\t\t\t\tplainRuneNew = append(plainRune[:i], plainRune[i+1:]...)\n\t\t\t\tbreak\n\n\t\t\t} else {\n\t\t\t\ttrigger = \"stop\" // stops the outer for loop\n\t\t\t}\n\t\t}\n\t}\n\n\tfinalCell = tmpCell\n\n\treturn finalCell\n}\n\n// Build implements TextBuilder interface.\nfunc (mtb MarkdownTxBuilder) Build(s string, fg, bg Attribute) []Cell {\n\tmtb.baseFg = fg\n\tmtb.baseBg = bg\n\tmtb.reset()\n\tmtb.parse(s)\n\tcs := make([]Cell, len(mtb.plainTx))\n\tfor i := range cs {\n\t\tcs[i] = Cell{Ch: mtb.plainTx[i], Fg: fg, Bg: bg}\n\t}\n\tfor _, mrk := range mtb.markers {\n\t\tfor i := mrk.st; i < mrk.ed; i++ {\n\t\t\tcs[i].Fg = mrk.fg\n\t\t\tcs[i].Bg = mrk.bg\n\t\t}\n\t}\n\n\treturn cs\n}\n\n// NewMarkdownTxBuilder returns a TextBuilder employing markdown syntax.\nfunc NewMarkdownTxBuilder() TextBuilder {\n\treturn MarkdownTxBuilder{}\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/theme.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport \"strings\"\n\n/*\n// A ColorScheme represents the current look-and-feel of the dashboard.\ntype ColorScheme struct {\n\tBodyBg            Attribute\n\tBlockBg           Attribute\n\tHasBorder         bool\n\tBorderFg          Attribute\n\tBorderBg          Attribute\n\tBorderLabelTextFg Attribute\n\tBorderLabelTextBg Attribute\n\tParTextFg         Attribute\n\tParTextBg         Attribute\n\tSparklineLine     Attribute\n\tSparklineTitle    Attribute\n\tGaugeBar          Attribute\n\tGaugePercent      Attribute\n\tLineChartLine     Attribute\n\tLineChartAxes     Attribute\n\tListItemFg        Attribute\n\tListItemBg        Attribute\n\tBarChartBar       Attribute\n\tBarChartText      Attribute\n\tBarChartNum       Attribute\n\tMBarChartBar      Attribute\n\tMBarChartText     Attribute\n\tMBarChartNum      Attribute\n\tTabActiveBg\t\t  Attribute\n}\n\n// default color scheme depends on the user's terminal setting.\nvar themeDefault = ColorScheme{HasBorder: true}\n\nvar themeHelloWorld = ColorScheme{\n\tBodyBg:            ColorBlack,\n\tBlockBg:           ColorBlack,\n\tHasBorder:         true,\n\tBorderFg:          ColorWhite,\n\tBorderBg:          ColorBlack,\n\tBorderLabelTextBg: ColorBlack,\n\tBorderLabelTextFg: ColorGreen,\n\tParTextBg:         ColorBlack,\n\tParTextFg:         ColorWhite,\n\tSparklineLine:     ColorMagenta,\n\tSparklineTitle:    ColorWhite,\n\tGaugeBar:          ColorRed,\n\tGaugePercent:      ColorWhite,\n\tLineChartLine:     ColorYellow | AttrBold,\n\tLineChartAxes:     ColorWhite,\n\tListItemBg:        ColorBlack,\n\tListItemFg:        ColorYellow,\n\tBarChartBar:       ColorRed,\n\tBarChartNum:       ColorWhite,\n\tBarChartText:      ColorCyan,\n\tMBarChartBar:      ColorRed,\n\tMBarChartNum:      ColorWhite,\n\tMBarChartText:     ColorCyan,\n\tTabActiveBg:\t   ColorMagenta,\n}\n\nvar theme = themeDefault // global dep\n\n// Theme returns the currently used theme.\nfunc Theme() ColorScheme {\n\treturn theme\n}\n\n// SetTheme sets a new, custom theme.\nfunc SetTheme(newTheme ColorScheme) {\n\ttheme = newTheme\n}\n\n// UseTheme sets a predefined scheme. Currently available: \"hello-world\" and\n// \"black-and-white\".\nfunc UseTheme(th string) {\n\tswitch th {\n\tcase \"helloworld\":\n\t\ttheme = themeHelloWorld\n\tdefault:\n\t\ttheme = themeDefault\n\t}\n}\n*/\n\nvar ColorMap = map[string]Attribute{\n\t\"fg\":           ColorWhite,\n\t\"bg\":           ColorDefault,\n\t\"border.fg\":    ColorWhite,\n\t\"label.fg\":     ColorGreen,\n\t\"par.fg\":       ColorYellow,\n\t\"par.label.bg\": ColorWhite,\n}\n\nfunc ThemeAttr(name string) Attribute {\n\treturn lookUpAttr(ColorMap, name)\n}\n\nfunc lookUpAttr(clrmap map[string]Attribute, name string) Attribute {\n\n\ta, ok := clrmap[name]\n\tif ok {\n\t\treturn a\n\t}\n\n\tns := strings.Split(name, \".\")\n\tfor i := range ns {\n\t\tnn := strings.Join(ns[i:len(ns)], \".\")\n\t\ta, ok = ColorMap[nn]\n\t\tif ok {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn a\n}\n\n// 0<=r,g,b <= 5\nfunc ColorRGB(r, g, b int) Attribute {\n\twithin := func(n int) int {\n\t\tif n < 0 {\n\t\t\treturn 0\n\t\t}\n\n\t\tif n > 5 {\n\t\t\treturn 5\n\t\t}\n\n\t\treturn n\n\t}\n\n\tr, b, g = within(r), within(b), within(g)\n\treturn Attribute(0x0f + 36*r + 6*g + b)\n}\n"
  },
  {
    "path": "vendor/github.com/gizak/termui/widget.go",
    "content": "// Copyright 2017 Zack Guo <zack.y.guo@gmail.com>. All rights reserved.\n// Use of this source code is governed by a MIT license that can\n// be found in the LICENSE file.\n\npackage termui\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n)\n\n// event mixins\ntype WgtMgr map[string]WgtInfo\n\ntype WgtInfo struct {\n\tHandlers map[string]func(Event)\n\tWgtRef   Widget\n\tId       string\n}\n\ntype Widget interface {\n\tId() string\n}\n\nfunc NewWgtInfo(wgt Widget) WgtInfo {\n\treturn WgtInfo{\n\t\tHandlers: make(map[string]func(Event)),\n\t\tWgtRef:   wgt,\n\t\tId:       wgt.Id(),\n\t}\n}\n\nfunc NewWgtMgr() WgtMgr {\n\twm := WgtMgr(make(map[string]WgtInfo))\n\treturn wm\n\n}\n\nfunc (wm WgtMgr) AddWgt(wgt Widget) {\n\twm[wgt.Id()] = NewWgtInfo(wgt)\n}\n\nfunc (wm WgtMgr) RmWgt(wgt Widget) {\n\twm.RmWgtById(wgt.Id())\n}\n\nfunc (wm WgtMgr) RmWgtById(id string) {\n\tdelete(wm, id)\n}\n\nfunc (wm WgtMgr) AddWgtHandler(id, path string, h func(Event)) {\n\tif w, ok := wm[id]; ok {\n\t\tw.Handlers[path] = h\n\t}\n}\n\nfunc (wm WgtMgr) RmWgtHandler(id, path string) {\n\tif w, ok := wm[id]; ok {\n\t\tdelete(w.Handlers, path)\n\t}\n}\n\nvar counter struct {\n\tsync.RWMutex\n\tcount int\n}\n\nfunc GenId() string {\n\tcounter.Lock()\n\tdefer counter.Unlock()\n\n\tcounter.count += 1\n\treturn fmt.Sprintf(\"%d\", counter.count)\n}\n\nfunc (wm WgtMgr) WgtHandlersHook() func(Event) {\n\treturn func(e Event) {\n\t\tfor _, v := range wm {\n\t\t\tif k := findMatch(v.Handlers, e.Path); k != \"\" {\n\t\t\t\tv.Handlers[k](e)\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar DefaultWgtMgr WgtMgr\n\nfunc (b *Block) Handle(path string, handler func(Event)) {\n\tif _, ok := DefaultWgtMgr[b.Id()]; !ok {\n\t\tDefaultWgtMgr.AddWgt(b)\n\t}\n\n\tDefaultWgtMgr.AddWgtHandler(b.Id(), path, handler)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/ChangeLog.md",
    "content": "# Version 1.x.x\n\n* **Add more test cases and reference new test COM server project.** (Placeholder for future additions)\n\n# Version 1.2.0-alphaX\n\n**Minimum supported version is now Go 1.4. Go 1.1 support is deprecated, but should still build.**\n\n * Added CI configuration for Travis-CI and AppVeyor.\n * Added test InterfaceID and ClassID for the COM Test Server project.\n * Added more inline documentation (#83).\n * Added IEnumVARIANT implementation (#88).\n * Added IEnumVARIANT test cases (#99, #100, #101).\n * Added support for retrieving `time.Time` from VARIANT (#92).\n * Added test case for IUnknown (#64).\n * Added test case for IDispatch (#64).\n * Added test cases for scalar variants (#64, #76).\n\n# Version 1.1.1\n\n * Fixes for Linux build.\n * Fixes for Windows build.\n\n# Version 1.1.0\n\nThe change to provide building on all platforms is a new feature. The increase in minor version reflects that and allows those who wish to stay on 1.0.x to continue to do so. Support for 1.0.x will be limited to bug fixes.\n\n * Move GUID out of variables.go into its own file to make new documentation available.\n * Move OleError out of ole.go into its own file to make new documentation available.\n * Add documentation to utility functions.\n * Add documentation to variant receiver functions.\n * Add documentation to ole structures.\n * Make variant available to other systems outside of Windows.\n * Make OLE structures available to other systems outside of Windows.\n\n## New Features\n\n * Library should now be built on all platforms supported by Go. Library will NOOP on any platform that is not Windows.\n * More functions are now documented and available on godoc.org.\n\n# Version 1.0.1\n\n 1. Fix package references from repository location change.\n\n# Version 1.0.0\n\nThis version is stable enough for use. The COM API is still incomplete, but provides enough functionality for accessing COM servers using IDispatch interface.\n\nThere is no changelog for this version. Check commits for history.\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright © 2013-2017 Yasuhiro Matsumoto, <mattn.jp@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the “Software”), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, 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": "vendor/github.com/go-ole/go-ole/README.md",
    "content": "#Go OLE\n\n[![Build status](https://ci.appveyor.com/api/projects/status/qr0u2sf7q43us9fj?svg=true)](https://ci.appveyor.com/project/jacobsantos/go-ole-jgs28)\n[![Build Status](https://travis-ci.org/go-ole/go-ole.svg?branch=master)](https://travis-ci.org/go-ole/go-ole)\n[![GoDoc](https://godoc.org/github.com/go-ole/go-ole?status.svg)](https://godoc.org/github.com/go-ole/go-ole)\n\nGo bindings for Windows COM using shared libraries instead of cgo.\n\nBy Yasuhiro Matsumoto.\n\n## Install\n\nTo experiment with go-ole, you can just compile and run the example program:\n\n```\ngo get github.com/go-ole/go-ole\ncd /path/to/go-ole/\ngo test\n\ncd /path/to/go-ole/example/excel\ngo run excel.go\n```\n\n## Continuous Integration\n\nContinuous integration configuration has been added for both Travis-CI and AppVeyor. You will have to add these to your own account for your fork in order for it to run.\n\n**Travis-CI**\n\nTravis-CI was added to check builds on Linux to ensure that `go get` works when cross building. Currently, Travis-CI is not used to test cross-building, but this may be changed in the future. It is also not currently possible to test the library on Linux, since COM API is specific to Windows and it is not currently possible to run a COM server on Linux or even connect to a remote COM server.\n\n**AppVeyor**\n\nAppVeyor is used to build on Windows using the (in-development) test COM server. It is currently only used to test the build and ensure that the code works on Windows. It will be used to register a COM server and then run the test cases based on the test COM server.\n\nThe tests currently do run and do pass and this should be maintained with commits.\n\n##Versioning\n\nGo OLE uses [semantic versioning](http://semver.org) for version numbers, which is similar to the version contract of the Go language. Which means that the major version will always maintain backwards compatibility with minor versions. Minor versions will only add new additions and changes. Fixes will always be in patch. \n\nThis contract should allow you to upgrade to new minor and patch versions without breakage or modifications to your existing code. Leave a ticket, if there is breakage, so that it could be fixed.\n\n##LICENSE\n\nUnder the MIT License: http://mattn.mit-license.org/2013\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/appveyor.yml",
    "content": "# Notes:\n#   - Minimal appveyor.yml file is an empty file. All sections are optional.\n#   - Indent each level of configuration with 2 spaces. Do not use tabs!\n#   - All section names are case-sensitive.\n#   - Section names should be unique on each level.\n\nversion: \"1.3.0.{build}-alpha-{branch}\"\n\nos: Windows Server 2012 R2\n\nbranches:\n  only:\n    - master\n    - v1.2\n    - v1.1\n    - v1.0\n\nskip_tags: true\n\nclone_folder: c:\\gopath\\src\\github.com\\go-ole\\go-ole\n\nenvironment:\n  GOPATH: c:\\gopath\n  matrix:\n  - GOARCH: amd64\n    GOVERSION: 1.5\n    GOROOT: c:\\go\n    DOWNLOADPLATFORM: \"x64\"\n\ninstall:\n  - choco install mingw\n  - SET PATH=c:\\tools\\mingw64\\bin;%PATH%\n  # - Download COM Server\n  - ps: Start-FileDownload \"https://github.com/go-ole/test-com-server/releases/download/v1.0.2/test-com-server-${env:DOWNLOADPLATFORM}.zip\"\n  - 7z e test-com-server-%DOWNLOADPLATFORM%.zip -oc:\\gopath\\src\\github.com\\go-ole\\go-ole > NUL\n  - c:\\gopath\\src\\github.com\\go-ole\\go-ole\\build\\register-assembly.bat\n  # - set\n  - go version\n  - go env\n  - go get -u golang.org/x/tools/cmd/cover\n  - go get -u golang.org/x/tools/cmd/godoc\n  - go get -u golang.org/x/tools/cmd/stringer\n\nbuild_script:\n  - cd c:\\gopath\\src\\github.com\\go-ole\\go-ole\n  - go get -v -t ./...\n  - go build\n  - go test -v -cover ./...\n\n# disable automatic tests\ntest: off\n\n# disable deployment\ndeploy: off\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/com.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"errors\"\n\t\"syscall\"\n\t\"time\"\n\t\"unicode/utf16\"\n\t\"unsafe\"\n)\n\nvar (\n\tprocCoInitialize, _            = modole32.FindProc(\"CoInitialize\")\n\tprocCoInitializeEx, _          = modole32.FindProc(\"CoInitializeEx\")\n\tprocCoUninitialize, _          = modole32.FindProc(\"CoUninitialize\")\n\tprocCoCreateInstance, _        = modole32.FindProc(\"CoCreateInstance\")\n\tprocCoTaskMemFree, _           = modole32.FindProc(\"CoTaskMemFree\")\n\tprocCLSIDFromProgID, _         = modole32.FindProc(\"CLSIDFromProgID\")\n\tprocCLSIDFromString, _         = modole32.FindProc(\"CLSIDFromString\")\n\tprocStringFromCLSID, _         = modole32.FindProc(\"StringFromCLSID\")\n\tprocStringFromIID, _           = modole32.FindProc(\"StringFromIID\")\n\tprocIIDFromString, _           = modole32.FindProc(\"IIDFromString\")\n\tprocGetUserDefaultLCID, _      = modkernel32.FindProc(\"GetUserDefaultLCID\")\n\tprocCopyMemory, _              = modkernel32.FindProc(\"RtlMoveMemory\")\n\tprocVariantInit, _             = modoleaut32.FindProc(\"VariantInit\")\n\tprocVariantClear, _            = modoleaut32.FindProc(\"VariantClear\")\n\tprocVariantTimeToSystemTime, _ = modoleaut32.FindProc(\"VariantTimeToSystemTime\")\n\tprocSysAllocString, _          = modoleaut32.FindProc(\"SysAllocString\")\n\tprocSysAllocStringLen, _       = modoleaut32.FindProc(\"SysAllocStringLen\")\n\tprocSysFreeString, _           = modoleaut32.FindProc(\"SysFreeString\")\n\tprocSysStringLen, _            = modoleaut32.FindProc(\"SysStringLen\")\n\tprocCreateDispTypeInfo, _      = modoleaut32.FindProc(\"CreateDispTypeInfo\")\n\tprocCreateStdDispatch, _       = modoleaut32.FindProc(\"CreateStdDispatch\")\n\tprocGetActiveObject, _         = modoleaut32.FindProc(\"GetActiveObject\")\n\n\tprocGetMessageW, _      = moduser32.FindProc(\"GetMessageW\")\n\tprocDispatchMessageW, _ = moduser32.FindProc(\"DispatchMessageW\")\n)\n\n// coInitialize initializes COM library on current thread.\n//\n// MSDN documentation suggests that this function should not be called. Call\n// CoInitializeEx() instead. The reason has to do with threading and this\n// function is only for single-threaded apartments.\n//\n// That said, most users of the library have gotten away with just this\n// function. If you are experiencing threading issues, then use\n// CoInitializeEx().\nfunc coInitialize() (err error) {\n\t// http://msdn.microsoft.com/en-us/library/windows/desktop/ms678543(v=vs.85).aspx\n\t// Suggests that no value should be passed to CoInitialized.\n\t// Could just be Call() since the parameter is optional. <-- Needs testing to be sure.\n\thr, _, _ := procCoInitialize.Call(uintptr(0))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// coInitializeEx initializes COM library with concurrency model.\nfunc coInitializeEx(coinit uint32) (err error) {\n\t// http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v=vs.85).aspx\n\t// Suggests that the first parameter is not only optional but should always be NULL.\n\thr, _, _ := procCoInitializeEx.Call(uintptr(0), uintptr(coinit))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// CoInitialize initializes COM library on current thread.\n//\n// MSDN documentation suggests that this function should not be called. Call\n// CoInitializeEx() instead. The reason has to do with threading and this\n// function is only for single-threaded apartments.\n//\n// That said, most users of the library have gotten away with just this\n// function. If you are experiencing threading issues, then use\n// CoInitializeEx().\nfunc CoInitialize(p uintptr) (err error) {\n\t// p is ignored and won't be used.\n\t// Avoid any variable not used errors.\n\tp = uintptr(0)\n\treturn coInitialize()\n}\n\n// CoInitializeEx initializes COM library with concurrency model.\nfunc CoInitializeEx(p uintptr, coinit uint32) (err error) {\n\t// Avoid any variable not used errors.\n\tp = uintptr(0)\n\treturn coInitializeEx(coinit)\n}\n\n// CoUninitialize uninitializes COM Library.\nfunc CoUninitialize() {\n\tprocCoUninitialize.Call()\n}\n\n// CoTaskMemFree frees memory pointer.\nfunc CoTaskMemFree(memptr uintptr) {\n\tprocCoTaskMemFree.Call(memptr)\n}\n\n// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier.\n//\n// The Programmatic Identifier must be registered, because it will be looked up\n// in the Windows Registry. The registry entry has the following keys: CLSID,\n// Insertable, Protocol and Shell\n// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx).\n//\n// programID identifies the class id with less precision and is not guaranteed\n// to be unique. These are usually found in the registry under\n// HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes, usually with the format of\n// \"Program.Component.Version\" with version being optional.\n//\n// CLSIDFromProgID in Windows API.\nfunc CLSIDFromProgID(progId string) (clsid *GUID, err error) {\n\tvar guid GUID\n\tlpszProgID := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId)))\n\thr, _, _ := procCLSIDFromProgID.Call(lpszProgID, uintptr(unsafe.Pointer(&guid)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\tclsid = &guid\n\treturn\n}\n\n// CLSIDFromString retrieves Class ID from string representation.\n//\n// This is technically the string version of the GUID and will convert the\n// string to object.\n//\n// CLSIDFromString in Windows API.\nfunc CLSIDFromString(str string) (clsid *GUID, err error) {\n\tvar guid GUID\n\tlpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str)))\n\thr, _, _ := procCLSIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\tclsid = &guid\n\treturn\n}\n\n// StringFromCLSID returns GUID formated string from GUID object.\nfunc StringFromCLSID(clsid *GUID) (str string, err error) {\n\tvar p *uint16\n\thr, _, _ := procStringFromCLSID.Call(uintptr(unsafe.Pointer(clsid)), uintptr(unsafe.Pointer(&p)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\tstr = LpOleStrToString(p)\n\treturn\n}\n\n// IIDFromString returns GUID from program ID.\nfunc IIDFromString(progId string) (clsid *GUID, err error) {\n\tvar guid GUID\n\tlpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId)))\n\thr, _, _ := procIIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\tclsid = &guid\n\treturn\n}\n\n// StringFromIID returns GUID formatted string from GUID object.\nfunc StringFromIID(iid *GUID) (str string, err error) {\n\tvar p *uint16\n\thr, _, _ := procStringFromIID.Call(uintptr(unsafe.Pointer(iid)), uintptr(unsafe.Pointer(&p)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\tstr = LpOleStrToString(p)\n\treturn\n}\n\n// CreateInstance of single uninitialized object with GUID.\nfunc CreateInstance(clsid *GUID, iid *GUID) (unk *IUnknown, err error) {\n\tif iid == nil {\n\t\tiid = IID_IUnknown\n\t}\n\thr, _, _ := procCoCreateInstance.Call(\n\t\tuintptr(unsafe.Pointer(clsid)),\n\t\t0,\n\t\tCLSCTX_SERVER,\n\t\tuintptr(unsafe.Pointer(iid)),\n\t\tuintptr(unsafe.Pointer(&unk)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// GetActiveObject retrieves pointer to active object.\nfunc GetActiveObject(clsid *GUID, iid *GUID) (unk *IUnknown, err error) {\n\tif iid == nil {\n\t\tiid = IID_IUnknown\n\t}\n\thr, _, _ := procGetActiveObject.Call(\n\t\tuintptr(unsafe.Pointer(clsid)),\n\t\tuintptr(unsafe.Pointer(iid)),\n\t\tuintptr(unsafe.Pointer(&unk)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// VariantInit initializes variant.\nfunc VariantInit(v *VARIANT) (err error) {\n\thr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// VariantClear clears value in Variant settings to VT_EMPTY.\nfunc VariantClear(v *VARIANT) (err error) {\n\thr, _, _ := procVariantClear.Call(uintptr(unsafe.Pointer(v)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// SysAllocString allocates memory for string and copies string into memory.\nfunc SysAllocString(v string) (ss *int16) {\n\tpss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v))))\n\tss = (*int16)(unsafe.Pointer(pss))\n\treturn\n}\n\n// SysAllocStringLen copies up to length of given string returning pointer.\nfunc SysAllocStringLen(v string) (ss *int16) {\n\tutf16 := utf16.Encode([]rune(v + \"\\x00\"))\n\tptr := &utf16[0]\n\n\tpss, _, _ := procSysAllocStringLen.Call(uintptr(unsafe.Pointer(ptr)), uintptr(len(utf16)-1))\n\tss = (*int16)(unsafe.Pointer(pss))\n\treturn\n}\n\n// SysFreeString frees string system memory. This must be called with SysAllocString.\nfunc SysFreeString(v *int16) (err error) {\n\thr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// SysStringLen is the length of the system allocated string.\nfunc SysStringLen(v *int16) uint32 {\n\tl, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v)))\n\treturn uint32(l)\n}\n\n// CreateStdDispatch provides default IDispatch implementation for IUnknown.\n//\n// This handles default IDispatch implementation for objects. It haves a few\n// limitations with only supporting one language. It will also only return\n// default exception codes.\nfunc CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (disp *IDispatch, err error) {\n\thr, _, _ := procCreateStdDispatch.Call(\n\t\tuintptr(unsafe.Pointer(unk)),\n\t\tv,\n\t\tuintptr(unsafe.Pointer(ptinfo)),\n\t\tuintptr(unsafe.Pointer(&disp)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch.\n//\n// This will not handle the full implementation of the interface.\nfunc CreateDispTypeInfo(idata *INTERFACEDATA) (pptinfo *IUnknown, err error) {\n\thr, _, _ := procCreateDispTypeInfo.Call(\n\t\tuintptr(unsafe.Pointer(idata)),\n\t\tuintptr(GetUserDefaultLCID()),\n\t\tuintptr(unsafe.Pointer(&pptinfo)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// copyMemory moves location of a block of memory.\nfunc copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) {\n\tprocCopyMemory.Call(uintptr(dest), uintptr(src), uintptr(length))\n}\n\n// GetUserDefaultLCID retrieves current user default locale.\nfunc GetUserDefaultLCID() (lcid uint32) {\n\tret, _, _ := procGetUserDefaultLCID.Call()\n\tlcid = uint32(ret)\n\treturn\n}\n\n// GetMessage in message queue from runtime.\n//\n// This function appears to block. PeekMessage does not block.\nfunc GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (ret int32, err error) {\n\tr0, _, err := procGetMessageW.Call(uintptr(unsafe.Pointer(msg)), uintptr(hwnd), uintptr(MsgFilterMin), uintptr(MsgFilterMax))\n\tret = int32(r0)\n\treturn\n}\n\n// DispatchMessage to window procedure.\nfunc DispatchMessage(msg *Msg) (ret int32) {\n\tr0, _, _ := procDispatchMessageW.Call(uintptr(unsafe.Pointer(msg)))\n\tret = int32(r0)\n\treturn\n}\n\n// GetVariantDate converts COM Variant Time value to Go time.Time.\nfunc GetVariantDate(value float64) (time.Time, error) {\n\tvar st syscall.Systemtime\n\tr, _, _ := procVariantTimeToSystemTime.Call(uintptr(value), uintptr(unsafe.Pointer(&st)))\n\tif r != 0 {\n\t\treturn time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil\n\t}\n\treturn time.Now(), errors.New(\"Could not convert to time, passing current time.\")\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/com_func.go",
    "content": "// +build !windows\n\npackage ole\n\nimport (\n\t\"time\"\n\t\"unsafe\"\n)\n\n// coInitialize initializes COM library on current thread.\n//\n// MSDN documentation suggests that this function should not be called. Call\n// CoInitializeEx() instead. The reason has to do with threading and this\n// function is only for single-threaded apartments.\n//\n// That said, most users of the library have gotten away with just this\n// function. If you are experiencing threading issues, then use\n// CoInitializeEx().\nfunc coInitialize() error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// coInitializeEx initializes COM library with concurrency model.\nfunc coInitializeEx(coinit uint32) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// CoInitialize initializes COM library on current thread.\n//\n// MSDN documentation suggests that this function should not be called. Call\n// CoInitializeEx() instead. The reason has to do with threading and this\n// function is only for single-threaded apartments.\n//\n// That said, most users of the library have gotten away with just this\n// function. If you are experiencing threading issues, then use\n// CoInitializeEx().\nfunc CoInitialize(p uintptr) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// CoInitializeEx initializes COM library with concurrency model.\nfunc CoInitializeEx(p uintptr, coinit uint32) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// CoUninitialize uninitializes COM Library.\nfunc CoUninitialize() {}\n\n// CoTaskMemFree frees memory pointer.\nfunc CoTaskMemFree(memptr uintptr) {}\n\n// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier.\n//\n// The Programmatic Identifier must be registered, because it will be looked up\n// in the Windows Registry. The registry entry has the following keys: CLSID,\n// Insertable, Protocol and Shell\n// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx).\n//\n// programID identifies the class id with less precision and is not guaranteed\n// to be unique. These are usually found in the registry under\n// HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes, usually with the format of\n// \"Program.Component.Version\" with version being optional.\n//\n// CLSIDFromProgID in Windows API.\nfunc CLSIDFromProgID(progId string) (*GUID, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// CLSIDFromString retrieves Class ID from string representation.\n//\n// This is technically the string version of the GUID and will convert the\n// string to object.\n//\n// CLSIDFromString in Windows API.\nfunc CLSIDFromString(str string) (*GUID, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// StringFromCLSID returns GUID formated string from GUID object.\nfunc StringFromCLSID(clsid *GUID) (string, error) {\n\treturn \"\", NewError(E_NOTIMPL)\n}\n\n// IIDFromString returns GUID from program ID.\nfunc IIDFromString(progId string) (*GUID, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// StringFromIID returns GUID formatted string from GUID object.\nfunc StringFromIID(iid *GUID) (string, error) {\n\treturn \"\", NewError(E_NOTIMPL)\n}\n\n// CreateInstance of single uninitialized object with GUID.\nfunc CreateInstance(clsid *GUID, iid *GUID) (*IUnknown, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// GetActiveObject retrieves pointer to active object.\nfunc GetActiveObject(clsid *GUID, iid *GUID) (*IUnknown, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// VariantInit initializes variant.\nfunc VariantInit(v *VARIANT) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// VariantClear clears value in Variant settings to VT_EMPTY.\nfunc VariantClear(v *VARIANT) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// SysAllocString allocates memory for string and copies string into memory.\nfunc SysAllocString(v string) *int16 {\n\tu := int16(0)\n\treturn &u\n}\n\n// SysAllocStringLen copies up to length of given string returning pointer.\nfunc SysAllocStringLen(v string) *int16 {\n\tu := int16(0)\n\treturn &u\n}\n\n// SysFreeString frees string system memory. This must be called with SysAllocString.\nfunc SysFreeString(v *int16) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// SysStringLen is the length of the system allocated string.\nfunc SysStringLen(v *int16) uint32 {\n\treturn uint32(0)\n}\n\n// CreateStdDispatch provides default IDispatch implementation for IUnknown.\n//\n// This handles default IDispatch implementation for objects. It haves a few\n// limitations with only supporting one language. It will also only return\n// default exception codes.\nfunc CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (*IDispatch, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch.\n//\n// This will not handle the full implementation of the interface.\nfunc CreateDispTypeInfo(idata *INTERFACEDATA) (*IUnknown, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// copyMemory moves location of a block of memory.\nfunc copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) {}\n\n// GetUserDefaultLCID retrieves current user default locale.\nfunc GetUserDefaultLCID() uint32 {\n\treturn uint32(0)\n}\n\n// GetMessage in message queue from runtime.\n//\n// This function appears to block. PeekMessage does not block.\nfunc GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (int32, error) {\n\treturn int32(0), NewError(E_NOTIMPL)\n}\n\n// DispatchMessage to window procedure.\nfunc DispatchMessage(msg *Msg) int32 {\n\treturn int32(0)\n}\n\nfunc GetVariantDate(value float64) (time.Time, error) {\n\treturn time.Now(), NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/connect.go",
    "content": "package ole\n\n// Connection contains IUnknown for fluent interface interaction.\n//\n// Deprecated. Use oleutil package instead.\ntype Connection struct {\n\tObject *IUnknown // Access COM\n}\n\n// Initialize COM.\nfunc (*Connection) Initialize() (err error) {\n\treturn coInitialize()\n}\n\n// Uninitialize COM.\nfunc (*Connection) Uninitialize() {\n\tCoUninitialize()\n}\n\n// Create IUnknown object based first on ProgId and then from String.\nfunc (c *Connection) Create(progId string) (err error) {\n\tvar clsid *GUID\n\tclsid, err = CLSIDFromProgID(progId)\n\tif err != nil {\n\t\tclsid, err = CLSIDFromString(progId)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tunknown, err := CreateInstance(clsid, IID_IUnknown)\n\tif err != nil {\n\t\treturn\n\t}\n\tc.Object = unknown\n\n\treturn\n}\n\n// Release IUnknown object.\nfunc (c *Connection) Release() {\n\tc.Object.Release()\n}\n\n// Load COM object from list of programIDs or strings.\nfunc (c *Connection) Load(names ...string) (errors []error) {\n\tvar tempErrors []error = make([]error, len(names))\n\tvar numErrors int = 0\n\tfor _, name := range names {\n\t\terr := c.Create(name)\n\t\tif err != nil {\n\t\t\ttempErrors = append(tempErrors, err)\n\t\t\tnumErrors += 1\n\t\t\tcontinue\n\t\t}\n\t\tbreak\n\t}\n\n\tcopy(errors, tempErrors[0:numErrors])\n\treturn\n}\n\n// Dispatch returns Dispatch object.\nfunc (c *Connection) Dispatch() (object *Dispatch, err error) {\n\tdispatch, err := c.Object.QueryInterface(IID_IDispatch)\n\tif err != nil {\n\t\treturn\n\t}\n\tobject = &Dispatch{dispatch}\n\treturn\n}\n\n// Dispatch stores IDispatch object.\ntype Dispatch struct {\n\tObject *IDispatch // Dispatch object.\n}\n\n// Call method on IDispatch with parameters.\nfunc (d *Dispatch) Call(method string, params ...interface{}) (result *VARIANT, err error) {\n\tid, err := d.GetId(method)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult, err = d.Invoke(id, DISPATCH_METHOD, params)\n\treturn\n}\n\n// MustCall method on IDispatch with parameters.\nfunc (d *Dispatch) MustCall(method string, params ...interface{}) (result *VARIANT) {\n\tid, err := d.GetId(method)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tresult, err = d.Invoke(id, DISPATCH_METHOD, params)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn\n}\n\n// Get property on IDispatch with parameters.\nfunc (d *Dispatch) Get(name string, params ...interface{}) (result *VARIANT, err error) {\n\tid, err := d.GetId(name)\n\tif err != nil {\n\t\treturn\n\t}\n\tresult, err = d.Invoke(id, DISPATCH_PROPERTYGET, params)\n\treturn\n}\n\n// MustGet property on IDispatch with parameters.\nfunc (d *Dispatch) MustGet(name string, params ...interface{}) (result *VARIANT) {\n\tid, err := d.GetId(name)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tresult, err = d.Invoke(id, DISPATCH_PROPERTYGET, params)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn\n}\n\n// Set property on IDispatch with parameters.\nfunc (d *Dispatch) Set(name string, params ...interface{}) (result *VARIANT, err error) {\n\tid, err := d.GetId(name)\n\tif err != nil {\n\t\treturn\n\t}\n\tresult, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params)\n\treturn\n}\n\n// MustSet property on IDispatch with parameters.\nfunc (d *Dispatch) MustSet(name string, params ...interface{}) (result *VARIANT) {\n\tid, err := d.GetId(name)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tresult, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn\n}\n\n// GetId retrieves ID of name on IDispatch.\nfunc (d *Dispatch) GetId(name string) (id int32, err error) {\n\tvar dispid []int32\n\tdispid, err = d.Object.GetIDsOfName([]string{name})\n\tif err != nil {\n\t\treturn\n\t}\n\tid = dispid[0]\n\treturn\n}\n\n// GetIds retrieves all IDs of names on IDispatch.\nfunc (d *Dispatch) GetIds(names ...string) (dispid []int32, err error) {\n\tdispid, err = d.Object.GetIDsOfName(names)\n\treturn\n}\n\n// Invoke IDispatch on DisplayID of dispatch type with parameters.\n//\n// There have been problems where if send cascading params..., it would error\n// out because the parameters would be empty.\nfunc (d *Dispatch) Invoke(id int32, dispatch int16, params []interface{}) (result *VARIANT, err error) {\n\tif len(params) < 1 {\n\t\tresult, err = d.Object.Invoke(id, dispatch)\n\t} else {\n\t\tresult, err = d.Object.Invoke(id, dispatch, params...)\n\t}\n\treturn\n}\n\n// Release IDispatch object.\nfunc (d *Dispatch) Release() {\n\td.Object.Release()\n}\n\n// Connect initializes COM and attempts to load IUnknown based on given names.\nfunc Connect(names ...string) (connection *Connection) {\n\tconnection.Initialize()\n\tconnection.Load(names...)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/constants.go",
    "content": "package ole\n\nconst (\n\tCLSCTX_INPROC_SERVER   = 1\n\tCLSCTX_INPROC_HANDLER  = 2\n\tCLSCTX_LOCAL_SERVER    = 4\n\tCLSCTX_INPROC_SERVER16 = 8\n\tCLSCTX_REMOTE_SERVER   = 16\n\tCLSCTX_ALL             = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER\n\tCLSCTX_INPROC          = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER\n\tCLSCTX_SERVER          = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER\n)\n\nconst (\n\tCOINIT_APARTMENTTHREADED = 0x2\n\tCOINIT_MULTITHREADED     = 0x0\n\tCOINIT_DISABLE_OLE1DDE   = 0x4\n\tCOINIT_SPEED_OVER_MEMORY = 0x8\n)\n\nconst (\n\tDISPATCH_METHOD         = 1\n\tDISPATCH_PROPERTYGET    = 2\n\tDISPATCH_PROPERTYPUT    = 4\n\tDISPATCH_PROPERTYPUTREF = 8\n)\n\nconst (\n\tS_OK           = 0x00000000\n\tE_UNEXPECTED   = 0x8000FFFF\n\tE_NOTIMPL      = 0x80004001\n\tE_OUTOFMEMORY  = 0x8007000E\n\tE_INVALIDARG   = 0x80070057\n\tE_NOINTERFACE  = 0x80004002\n\tE_POINTER      = 0x80004003\n\tE_HANDLE       = 0x80070006\n\tE_ABORT        = 0x80004004\n\tE_FAIL         = 0x80004005\n\tE_ACCESSDENIED = 0x80070005\n\tE_PENDING      = 0x8000000A\n\n\tCO_E_CLASSSTRING = 0x800401F3\n)\n\nconst (\n\tCC_FASTCALL = iota\n\tCC_CDECL\n\tCC_MSCPASCAL\n\tCC_PASCAL = CC_MSCPASCAL\n\tCC_MACPASCAL\n\tCC_STDCALL\n\tCC_FPFASTCALL\n\tCC_SYSCALL\n\tCC_MPWCDECL\n\tCC_MPWPASCAL\n\tCC_MAX = CC_MPWPASCAL\n)\n\ntype VT uint16\n\nconst (\n\tVT_EMPTY           VT = 0x0\n\tVT_NULL            VT = 0x1\n\tVT_I2              VT = 0x2\n\tVT_I4              VT = 0x3\n\tVT_R4              VT = 0x4\n\tVT_R8              VT = 0x5\n\tVT_CY              VT = 0x6\n\tVT_DATE            VT = 0x7\n\tVT_BSTR            VT = 0x8\n\tVT_DISPATCH        VT = 0x9\n\tVT_ERROR           VT = 0xa\n\tVT_BOOL            VT = 0xb\n\tVT_VARIANT         VT = 0xc\n\tVT_UNKNOWN         VT = 0xd\n\tVT_DECIMAL         VT = 0xe\n\tVT_I1              VT = 0x10\n\tVT_UI1             VT = 0x11\n\tVT_UI2             VT = 0x12\n\tVT_UI4             VT = 0x13\n\tVT_I8              VT = 0x14\n\tVT_UI8             VT = 0x15\n\tVT_INT             VT = 0x16\n\tVT_UINT            VT = 0x17\n\tVT_VOID            VT = 0x18\n\tVT_HRESULT         VT = 0x19\n\tVT_PTR             VT = 0x1a\n\tVT_SAFEARRAY       VT = 0x1b\n\tVT_CARRAY          VT = 0x1c\n\tVT_USERDEFINED     VT = 0x1d\n\tVT_LPSTR           VT = 0x1e\n\tVT_LPWSTR          VT = 0x1f\n\tVT_RECORD          VT = 0x24\n\tVT_INT_PTR         VT = 0x25\n\tVT_UINT_PTR        VT = 0x26\n\tVT_FILETIME        VT = 0x40\n\tVT_BLOB            VT = 0x41\n\tVT_STREAM          VT = 0x42\n\tVT_STORAGE         VT = 0x43\n\tVT_STREAMED_OBJECT VT = 0x44\n\tVT_STORED_OBJECT   VT = 0x45\n\tVT_BLOB_OBJECT     VT = 0x46\n\tVT_CF              VT = 0x47\n\tVT_CLSID           VT = 0x48\n\tVT_BSTR_BLOB       VT = 0xfff\n\tVT_VECTOR          VT = 0x1000\n\tVT_ARRAY           VT = 0x2000\n\tVT_BYREF           VT = 0x4000\n\tVT_RESERVED        VT = 0x8000\n\tVT_ILLEGAL         VT = 0xffff\n\tVT_ILLEGALMASKED   VT = 0xfff\n\tVT_TYPEMASK        VT = 0xfff\n)\n\nconst (\n\tDISPID_UNKNOWN     = -1\n\tDISPID_VALUE       = 0\n\tDISPID_PROPERTYPUT = -3\n\tDISPID_NEWENUM     = -4\n\tDISPID_EVALUATE    = -5\n\tDISPID_CONSTRUCTOR = -6\n\tDISPID_DESTRUCTOR  = -7\n\tDISPID_COLLECT     = -8\n)\n\nconst (\n\tTKIND_ENUM      = 1\n\tTKIND_RECORD    = 2\n\tTKIND_MODULE    = 3\n\tTKIND_INTERFACE = 4\n\tTKIND_DISPATCH  = 5\n\tTKIND_COCLASS   = 6\n\tTKIND_ALIAS     = 7\n\tTKIND_UNION     = 8\n\tTKIND_MAX       = 9\n)\n\n// Safe Array Feature Flags\n\nconst (\n\tFADF_AUTO        = 0x0001\n\tFADF_STATIC      = 0x0002\n\tFADF_EMBEDDED    = 0x0004\n\tFADF_FIXEDSIZE   = 0x0010\n\tFADF_RECORD      = 0x0020\n\tFADF_HAVEIID     = 0x0040\n\tFADF_HAVEVARTYPE = 0x0080\n\tFADF_BSTR        = 0x0100\n\tFADF_UNKNOWN     = 0x0200\n\tFADF_DISPATCH    = 0x0400\n\tFADF_VARIANT     = 0x0800\n\tFADF_RESERVED    = 0xF008\n)\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/error.go",
    "content": "package ole\n\n// OleError stores COM errors.\ntype OleError struct {\n\thr          uintptr\n\tdescription string\n\tsubError    error\n}\n\n// NewError creates new error with HResult.\nfunc NewError(hr uintptr) *OleError {\n\treturn &OleError{hr: hr}\n}\n\n// NewErrorWithDescription creates new COM error with HResult and description.\nfunc NewErrorWithDescription(hr uintptr, description string) *OleError {\n\treturn &OleError{hr: hr, description: description}\n}\n\n// NewErrorWithSubError creates new COM error with parent error.\nfunc NewErrorWithSubError(hr uintptr, description string, err error) *OleError {\n\treturn &OleError{hr: hr, description: description, subError: err}\n}\n\n// Code is the HResult.\nfunc (v *OleError) Code() uintptr {\n\treturn uintptr(v.hr)\n}\n\n// String description, either manually set or format message with error code.\nfunc (v *OleError) String() string {\n\tif v.description != \"\" {\n\t\treturn errstr(int(v.hr)) + \" (\" + v.description + \")\"\n\t}\n\treturn errstr(int(v.hr))\n}\n\n// Error implements error interface.\nfunc (v *OleError) Error() string {\n\treturn v.String()\n}\n\n// Description retrieves error summary, if there is one.\nfunc (v *OleError) Description() string {\n\treturn v.description\n}\n\n// SubError returns parent error, if there is one.\nfunc (v *OleError) SubError() error {\n\treturn v.subError\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/error_func.go",
    "content": "// +build !windows\n\npackage ole\n\n// errstr converts error code to string.\nfunc errstr(errno int) string {\n\treturn \"\"\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/error_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"fmt\"\n\t\"syscall\"\n\t\"unicode/utf16\"\n)\n\n// errstr converts error code to string.\nfunc errstr(errno int) string {\n\t// ask windows for the remaining errors\n\tvar flags uint32 = syscall.FORMAT_MESSAGE_FROM_SYSTEM | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS\n\tb := make([]uint16, 300)\n\tn, err := syscall.FormatMessage(flags, 0, uint32(errno), 0, b, nil)\n\tif err != nil {\n\t\treturn fmt.Sprintf(\"error %d (FormatMessage failed with: %v)\", errno, err)\n\t}\n\t// trim terminating \\r and \\n\n\tfor ; n > 0 && (b[n-1] == '\\n' || b[n-1] == '\\r'); n-- {\n\t}\n\treturn string(utf16.Decode(b[:n]))\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/guid.go",
    "content": "package ole\n\nvar (\n\t// IID_NULL is null Interface ID, used when no other Interface ID is known.\n\tIID_NULL = NewGUID(\"{00000000-0000-0000-0000-000000000000}\")\n\n\t// IID_IUnknown is for IUnknown interfaces.\n\tIID_IUnknown = NewGUID(\"{00000000-0000-0000-C000-000000000046}\")\n\n\t// IID_IDispatch is for IDispatch interfaces.\n\tIID_IDispatch = NewGUID(\"{00020400-0000-0000-C000-000000000046}\")\n\n\t// IID_IEnumVariant is for IEnumVariant interfaces\n\tIID_IEnumVariant = NewGUID(\"{00020404-0000-0000-C000-000000000046}\")\n\n\t// IID_IConnectionPointContainer is for IConnectionPointContainer interfaces.\n\tIID_IConnectionPointContainer = NewGUID(\"{B196B284-BAB4-101A-B69C-00AA00341D07}\")\n\n\t// IID_IConnectionPoint is for IConnectionPoint interfaces.\n\tIID_IConnectionPoint = NewGUID(\"{B196B286-BAB4-101A-B69C-00AA00341D07}\")\n\n\t// IID_IInspectable is for IInspectable interfaces.\n\tIID_IInspectable = NewGUID(\"{AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90}\")\n\n\t// IID_IProvideClassInfo is for IProvideClassInfo interfaces.\n\tIID_IProvideClassInfo = NewGUID(\"{B196B283-BAB4-101A-B69C-00AA00341D07}\")\n)\n\n// These are for testing and not part of any library.\nvar (\n\t// IID_ICOMTestString is for ICOMTestString interfaces.\n\t//\n\t// {E0133EB4-C36F-469A-9D3D-C66B84BE19ED}\n\tIID_ICOMTestString = NewGUID(\"{E0133EB4-C36F-469A-9D3D-C66B84BE19ED}\")\n\n\t// IID_ICOMTestInt8 is for ICOMTestInt8 interfaces.\n\t//\n\t// {BEB06610-EB84-4155-AF58-E2BFF53680B4}\n\tIID_ICOMTestInt8 = NewGUID(\"{BEB06610-EB84-4155-AF58-E2BFF53680B4}\")\n\n\t// IID_ICOMTestInt16 is for ICOMTestInt16 interfaces.\n\t//\n\t// {DAA3F9FA-761E-4976-A860-8364CE55F6FC}\n\tIID_ICOMTestInt16 = NewGUID(\"{DAA3F9FA-761E-4976-A860-8364CE55F6FC}\")\n\n\t// IID_ICOMTestInt32 is for ICOMTestInt32 interfaces.\n\t//\n\t// {E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0}\n\tIID_ICOMTestInt32 = NewGUID(\"{E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0}\")\n\n\t// IID_ICOMTestInt64 is for ICOMTestInt64 interfaces.\n\t//\n\t// {8D437CBC-B3ED-485C-BC32-C336432A1623}\n\tIID_ICOMTestInt64 = NewGUID(\"{8D437CBC-B3ED-485C-BC32-C336432A1623}\")\n\n\t// IID_ICOMTestFloat is for ICOMTestFloat interfaces.\n\t//\n\t// {BF1ED004-EA02-456A-AA55-2AC8AC6B054C}\n\tIID_ICOMTestFloat = NewGUID(\"{BF1ED004-EA02-456A-AA55-2AC8AC6B054C}\")\n\n\t// IID_ICOMTestDouble is for ICOMTestDouble interfaces.\n\t//\n\t// {BF908A81-8687-4E93-999F-D86FAB284BA0}\n\tIID_ICOMTestDouble = NewGUID(\"{BF908A81-8687-4E93-999F-D86FAB284BA0}\")\n\n\t// IID_ICOMTestBoolean is for ICOMTestBoolean interfaces.\n\t//\n\t// {D530E7A6-4EE8-40D1-8931-3D63B8605010}\n\tIID_ICOMTestBoolean = NewGUID(\"{D530E7A6-4EE8-40D1-8931-3D63B8605010}\")\n\n\t// IID_ICOMEchoTestObject is for ICOMEchoTestObject interfaces.\n\t//\n\t// {6485B1EF-D780-4834-A4FE-1EBB51746CA3}\n\tIID_ICOMEchoTestObject = NewGUID(\"{6485B1EF-D780-4834-A4FE-1EBB51746CA3}\")\n\n\t// IID_ICOMTestTypes is for ICOMTestTypes interfaces.\n\t//\n\t// {CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0}\n\tIID_ICOMTestTypes = NewGUID(\"{CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0}\")\n\n\t// CLSID_COMEchoTestObject is for COMEchoTestObject class.\n\t//\n\t// {3C24506A-AE9E-4D50-9157-EF317281F1B0}\n\tCLSID_COMEchoTestObject = NewGUID(\"{3C24506A-AE9E-4D50-9157-EF317281F1B0}\")\n\n\t// CLSID_COMTestScalarClass is for COMTestScalarClass class.\n\t//\n\t// {865B85C5-0334-4AC6-9EF6-AACEC8FC5E86}\n\tCLSID_COMTestScalarClass = NewGUID(\"{865B85C5-0334-4AC6-9EF6-AACEC8FC5E86}\")\n)\n\nconst hextable = \"0123456789ABCDEF\"\nconst emptyGUID = \"{00000000-0000-0000-0000-000000000000}\"\n\n// GUID is Windows API specific GUID type.\n//\n// This exists to match Windows GUID type for direct passing for COM.\n// Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx.\ntype GUID struct {\n\tData1 uint32\n\tData2 uint16\n\tData3 uint16\n\tData4 [8]byte\n}\n\n// NewGUID converts the given string into a globally unique identifier that is\n// compliant with the Windows API.\n//\n// The supplied string may be in any of these formats:\n//\n//  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n//  XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n//  {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\n//\n// The conversion of the supplied string is not case-sensitive.\nfunc NewGUID(guid string) *GUID {\n\td := []byte(guid)\n\tvar d1, d2, d3, d4a, d4b []byte\n\n\tswitch len(d) {\n\tcase 38:\n\t\tif d[0] != '{' || d[37] != '}' {\n\t\t\treturn nil\n\t\t}\n\t\td = d[1:37]\n\t\tfallthrough\n\tcase 36:\n\t\tif d[8] != '-' || d[13] != '-' || d[18] != '-' || d[23] != '-' {\n\t\t\treturn nil\n\t\t}\n\t\td1 = d[0:8]\n\t\td2 = d[9:13]\n\t\td3 = d[14:18]\n\t\td4a = d[19:23]\n\t\td4b = d[24:36]\n\tcase 32:\n\t\td1 = d[0:8]\n\t\td2 = d[8:12]\n\t\td3 = d[12:16]\n\t\td4a = d[16:20]\n\t\td4b = d[20:32]\n\tdefault:\n\t\treturn nil\n\t}\n\n\tvar g GUID\n\tvar ok1, ok2, ok3, ok4 bool\n\tg.Data1, ok1 = decodeHexUint32(d1)\n\tg.Data2, ok2 = decodeHexUint16(d2)\n\tg.Data3, ok3 = decodeHexUint16(d3)\n\tg.Data4, ok4 = decodeHexByte64(d4a, d4b)\n\tif ok1 && ok2 && ok3 && ok4 {\n\t\treturn &g\n\t}\n\treturn nil\n}\n\nfunc decodeHexUint32(src []byte) (value uint32, ok bool) {\n\tvar b1, b2, b3, b4 byte\n\tvar ok1, ok2, ok3, ok4 bool\n\tb1, ok1 = decodeHexByte(src[0], src[1])\n\tb2, ok2 = decodeHexByte(src[2], src[3])\n\tb3, ok3 = decodeHexByte(src[4], src[5])\n\tb4, ok4 = decodeHexByte(src[6], src[7])\n\tvalue = (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4)\n\tok = ok1 && ok2 && ok3 && ok4\n\treturn\n}\n\nfunc decodeHexUint16(src []byte) (value uint16, ok bool) {\n\tvar b1, b2 byte\n\tvar ok1, ok2 bool\n\tb1, ok1 = decodeHexByte(src[0], src[1])\n\tb2, ok2 = decodeHexByte(src[2], src[3])\n\tvalue = (uint16(b1) << 8) | uint16(b2)\n\tok = ok1 && ok2\n\treturn\n}\n\nfunc decodeHexByte64(s1 []byte, s2 []byte) (value [8]byte, ok bool) {\n\tvar ok1, ok2, ok3, ok4, ok5, ok6, ok7, ok8 bool\n\tvalue[0], ok1 = decodeHexByte(s1[0], s1[1])\n\tvalue[1], ok2 = decodeHexByte(s1[2], s1[3])\n\tvalue[2], ok3 = decodeHexByte(s2[0], s2[1])\n\tvalue[3], ok4 = decodeHexByte(s2[2], s2[3])\n\tvalue[4], ok5 = decodeHexByte(s2[4], s2[5])\n\tvalue[5], ok6 = decodeHexByte(s2[6], s2[7])\n\tvalue[6], ok7 = decodeHexByte(s2[8], s2[9])\n\tvalue[7], ok8 = decodeHexByte(s2[10], s2[11])\n\tok = ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8\n\treturn\n}\n\nfunc decodeHexByte(c1, c2 byte) (value byte, ok bool) {\n\tvar n1, n2 byte\n\tvar ok1, ok2 bool\n\tn1, ok1 = decodeHexChar(c1)\n\tn2, ok2 = decodeHexChar(c2)\n\tvalue = (n1 << 4) | n2\n\tok = ok1 && ok2\n\treturn\n}\n\nfunc decodeHexChar(c byte) (byte, bool) {\n\tswitch {\n\tcase '0' <= c && c <= '9':\n\t\treturn c - '0', true\n\tcase 'a' <= c && c <= 'f':\n\t\treturn c - 'a' + 10, true\n\tcase 'A' <= c && c <= 'F':\n\t\treturn c - 'A' + 10, true\n\t}\n\n\treturn 0, false\n}\n\n// String converts the GUID to string form. It will adhere to this pattern:\n//\n//  {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\n//\n// If the GUID is nil, the string representation of an empty GUID is returned:\n//\n//  {00000000-0000-0000-0000-000000000000}\nfunc (guid *GUID) String() string {\n\tif guid == nil {\n\t\treturn emptyGUID\n\t}\n\n\tvar c [38]byte\n\tc[0] = '{'\n\tputUint32Hex(c[1:9], guid.Data1)\n\tc[9] = '-'\n\tputUint16Hex(c[10:14], guid.Data2)\n\tc[14] = '-'\n\tputUint16Hex(c[15:19], guid.Data3)\n\tc[19] = '-'\n\tputByteHex(c[20:24], guid.Data4[0:2])\n\tc[24] = '-'\n\tputByteHex(c[25:37], guid.Data4[2:8])\n\tc[37] = '}'\n\treturn string(c[:])\n}\n\nfunc putUint32Hex(b []byte, v uint32) {\n\tb[0] = hextable[byte(v>>24)>>4]\n\tb[1] = hextable[byte(v>>24)&0x0f]\n\tb[2] = hextable[byte(v>>16)>>4]\n\tb[3] = hextable[byte(v>>16)&0x0f]\n\tb[4] = hextable[byte(v>>8)>>4]\n\tb[5] = hextable[byte(v>>8)&0x0f]\n\tb[6] = hextable[byte(v)>>4]\n\tb[7] = hextable[byte(v)&0x0f]\n}\n\nfunc putUint16Hex(b []byte, v uint16) {\n\tb[0] = hextable[byte(v>>8)>>4]\n\tb[1] = hextable[byte(v>>8)&0x0f]\n\tb[2] = hextable[byte(v)>>4]\n\tb[3] = hextable[byte(v)&0x0f]\n}\n\nfunc putByteHex(dst, src []byte) {\n\tfor i := 0; i < len(src); i++ {\n\t\tdst[i*2] = hextable[src[i]>>4]\n\t\tdst[i*2+1] = hextable[src[i]&0x0f]\n\t}\n}\n\n// IsEqualGUID compares two GUID.\n//\n// Not constant time comparison.\nfunc IsEqualGUID(guid1 *GUID, guid2 *GUID) bool {\n\treturn guid1.Data1 == guid2.Data1 &&\n\t\tguid1.Data2 == guid2.Data2 &&\n\t\tguid1.Data3 == guid2.Data3 &&\n\t\tguid1.Data4[0] == guid2.Data4[0] &&\n\t\tguid1.Data4[1] == guid2.Data4[1] &&\n\t\tguid1.Data4[2] == guid2.Data4[2] &&\n\t\tguid1.Data4[3] == guid2.Data4[3] &&\n\t\tguid1.Data4[4] == guid2.Data4[4] &&\n\t\tguid1.Data4[5] == guid2.Data4[5] &&\n\t\tguid1.Data4[6] == guid2.Data4[6] &&\n\t\tguid1.Data4[7] == guid2.Data4[7]\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iconnectionpoint.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype IConnectionPoint struct {\n\tIUnknown\n}\n\ntype IConnectionPointVtbl struct {\n\tIUnknownVtbl\n\tGetConnectionInterface      uintptr\n\tGetConnectionPointContainer uintptr\n\tAdvise                      uintptr\n\tUnadvise                    uintptr\n\tEnumConnections             uintptr\n}\n\nfunc (v *IConnectionPoint) VTable() *IConnectionPointVtbl {\n\treturn (*IConnectionPointVtbl)(unsafe.Pointer(v.RawVTable))\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go",
    "content": "// +build !windows\n\npackage ole\n\nimport \"unsafe\"\n\nfunc (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 {\n\treturn int32(0)\n}\n\nfunc (v *IConnectionPoint) Advise(unknown *IUnknown) (uint32, error) {\n\treturn uint32(0), NewError(E_NOTIMPL)\n}\n\nfunc (v *IConnectionPoint) Unadvise(cookie uint32) error {\n\treturn NewError(E_NOTIMPL)\n}\n\nfunc (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) (err error) {\n\treturn NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 {\n\t// XXX: This doesn't look like it does what it's supposed to\n\treturn release((*IUnknown)(unsafe.Pointer(v)))\n}\n\nfunc (v *IConnectionPoint) Advise(unknown *IUnknown) (cookie uint32, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tv.VTable().Advise,\n\t\t3,\n\t\tuintptr(unsafe.Pointer(v)),\n\t\tuintptr(unsafe.Pointer(unknown)),\n\t\tuintptr(unsafe.Pointer(&cookie)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc (v *IConnectionPoint) Unadvise(cookie uint32) (err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tv.VTable().Unadvise,\n\t\t2,\n\t\tuintptr(unsafe.Pointer(v)),\n\t\tuintptr(cookie),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) error {\n\treturn NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype IConnectionPointContainer struct {\n\tIUnknown\n}\n\ntype IConnectionPointContainerVtbl struct {\n\tIUnknownVtbl\n\tEnumConnectionPoints uintptr\n\tFindConnectionPoint  uintptr\n}\n\nfunc (v *IConnectionPointContainer) VTable() *IConnectionPointContainerVtbl {\n\treturn (*IConnectionPointContainerVtbl)(unsafe.Pointer(v.RawVTable))\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go",
    "content": "// +build !windows\n\npackage ole\n\nfunc (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error {\n\treturn NewError(E_NOTIMPL)\n}\n\nfunc (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) error {\n\treturn NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error {\n\treturn NewError(E_NOTIMPL)\n}\n\nfunc (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) (err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tv.VTable().FindConnectionPoint,\n\t\t3,\n\t\tuintptr(unsafe.Pointer(v)),\n\t\tuintptr(unsafe.Pointer(iid)),\n\t\tuintptr(unsafe.Pointer(point)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/idispatch.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype IDispatch struct {\n\tIUnknown\n}\n\ntype IDispatchVtbl struct {\n\tIUnknownVtbl\n\tGetTypeInfoCount uintptr\n\tGetTypeInfo      uintptr\n\tGetIDsOfNames    uintptr\n\tInvoke           uintptr\n}\n\nfunc (v *IDispatch) VTable() *IDispatchVtbl {\n\treturn (*IDispatchVtbl)(unsafe.Pointer(v.RawVTable))\n}\n\nfunc (v *IDispatch) GetIDsOfName(names []string) (dispid []int32, err error) {\n\tdispid, err = getIDsOfName(v, names)\n\treturn\n}\n\nfunc (v *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) {\n\tresult, err = invoke(v, dispid, dispatch, params...)\n\treturn\n}\n\nfunc (v *IDispatch) GetTypeInfoCount() (c uint32, err error) {\n\tc, err = getTypeInfoCount(v)\n\treturn\n}\n\nfunc (v *IDispatch) GetTypeInfo() (tinfo *ITypeInfo, err error) {\n\ttinfo, err = getTypeInfo(v)\n\treturn\n}\n\n// GetSingleIDOfName is a helper that returns single display ID for IDispatch name.\n//\n// This replaces the common pattern of attempting to get a single name from the list of available\n// IDs. It gives the first ID, if it is available.\nfunc (v *IDispatch) GetSingleIDOfName(name string) (displayID int32, err error) {\n\tvar displayIDs []int32\n\tdisplayIDs, err = v.GetIDsOfName([]string{name})\n\tif err != nil {\n\t\treturn\n\t}\n\tdisplayID = displayIDs[0]\n\treturn\n}\n\n// InvokeWithOptionalArgs accepts arguments as an array, works like Invoke.\n//\n// Accepts name and will attempt to retrieve Display ID to pass to Invoke.\n//\n// Passing params as an array is a workaround that could be fixed in later versions of Go that\n// prevent passing empty params. During testing it was discovered that this is an acceptable way of\n// getting around not being able to pass params normally.\nfunc (v *IDispatch) InvokeWithOptionalArgs(name string, dispatch int16, params []interface{}) (result *VARIANT, err error) {\n\tdisplayID, err := v.GetSingleIDOfName(name)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif len(params) < 1 {\n\t\tresult, err = v.Invoke(displayID, dispatch)\n\t} else {\n\t\tresult, err = v.Invoke(displayID, dispatch, params...)\n\t}\n\n\treturn\n}\n\n// CallMethod invokes named function with arguments on object.\nfunc (v *IDispatch) CallMethod(name string, params ...interface{}) (*VARIANT, error) {\n\treturn v.InvokeWithOptionalArgs(name, DISPATCH_METHOD, params)\n}\n\n// GetProperty retrieves the property with the name with the ability to pass arguments.\n//\n// Most of the time you will not need to pass arguments as most objects do not allow for this\n// feature. Or at least, should not allow for this feature. Some servers don't follow best practices\n// and this is provided for those edge cases.\nfunc (v *IDispatch) GetProperty(name string, params ...interface{}) (*VARIANT, error) {\n\treturn v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYGET, params)\n}\n\n// PutProperty attempts to mutate a property in the object.\nfunc (v *IDispatch) PutProperty(name string, params ...interface{}) (*VARIANT, error) {\n\treturn v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYPUT, params)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/idispatch_func.go",
    "content": "// +build !windows\n\npackage ole\n\nfunc getIDsOfName(disp *IDispatch, names []string) ([]int32, error) {\n\treturn []int32{}, NewError(E_NOTIMPL)\n}\n\nfunc getTypeInfoCount(disp *IDispatch) (uint32, error) {\n\treturn uint32(0), NewError(E_NOTIMPL)\n}\n\nfunc getTypeInfo(disp *IDispatch) (*ITypeInfo, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\nfunc invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (*VARIANT, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/idispatch_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"syscall\"\n\t\"time\"\n\t\"unsafe\"\n)\n\nfunc getIDsOfName(disp *IDispatch, names []string) (dispid []int32, err error) {\n\twnames := make([]*uint16, len(names))\n\tfor i := 0; i < len(names); i++ {\n\t\twnames[i] = syscall.StringToUTF16Ptr(names[i])\n\t}\n\tdispid = make([]int32, len(names))\n\tnamelen := uint32(len(names))\n\thr, _, _ := syscall.Syscall6(\n\t\tdisp.VTable().GetIDsOfNames,\n\t\t6,\n\t\tuintptr(unsafe.Pointer(disp)),\n\t\tuintptr(unsafe.Pointer(IID_NULL)),\n\t\tuintptr(unsafe.Pointer(&wnames[0])),\n\t\tuintptr(namelen),\n\t\tuintptr(GetUserDefaultLCID()),\n\t\tuintptr(unsafe.Pointer(&dispid[0])))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc getTypeInfoCount(disp *IDispatch) (c uint32, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tdisp.VTable().GetTypeInfoCount,\n\t\t2,\n\t\tuintptr(unsafe.Pointer(disp)),\n\t\tuintptr(unsafe.Pointer(&c)),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc getTypeInfo(disp *IDispatch) (tinfo *ITypeInfo, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tdisp.VTable().GetTypeInfo,\n\t\t3,\n\t\tuintptr(unsafe.Pointer(disp)),\n\t\tuintptr(GetUserDefaultLCID()),\n\t\tuintptr(unsafe.Pointer(&tinfo)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) {\n\tvar dispparams DISPPARAMS\n\n\tif dispatch&DISPATCH_PROPERTYPUT != 0 {\n\t\tdispnames := [1]int32{DISPID_PROPERTYPUT}\n\t\tdispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))\n\t\tdispparams.cNamedArgs = 1\n\t} else if dispatch&DISPATCH_PROPERTYPUTREF != 0 {\n\t\tdispnames := [1]int32{DISPID_PROPERTYPUT}\n\t\tdispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))\n\t\tdispparams.cNamedArgs = 1\n\t}\n\tvar vargs []VARIANT\n\tif len(params) > 0 {\n\t\tvargs = make([]VARIANT, len(params))\n\t\tfor i, v := range params {\n\t\t\t//n := len(params)-i-1\n\t\t\tn := len(params) - i - 1\n\t\t\tVariantInit(&vargs[n])\n\t\t\tswitch vv := v.(type) {\n\t\t\tcase bool:\n\t\t\t\tif vv {\n\t\t\t\t\tvargs[n] = NewVariant(VT_BOOL, 0xffff)\n\t\t\t\t} else {\n\t\t\t\t\tvargs[n] = NewVariant(VT_BOOL, 0)\n\t\t\t\t}\n\t\t\tcase *bool:\n\t\t\t\tvargs[n] = NewVariant(VT_BOOL|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*bool)))))\n\t\t\tcase uint8:\n\t\t\t\tvargs[n] = NewVariant(VT_I1, int64(v.(uint8)))\n\t\t\tcase *uint8:\n\t\t\t\tvargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8)))))\n\t\t\tcase int8:\n\t\t\t\tvargs[n] = NewVariant(VT_I1, int64(v.(int8)))\n\t\t\tcase *int8:\n\t\t\t\tvargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8)))))\n\t\t\tcase int16:\n\t\t\t\tvargs[n] = NewVariant(VT_I2, int64(v.(int16)))\n\t\t\tcase *int16:\n\t\t\t\tvargs[n] = NewVariant(VT_I2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int16)))))\n\t\t\tcase uint16:\n\t\t\t\tvargs[n] = NewVariant(VT_UI2, int64(v.(uint16)))\n\t\t\tcase *uint16:\n\t\t\t\tvargs[n] = NewVariant(VT_UI2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint16)))))\n\t\t\tcase int32:\n\t\t\t\tvargs[n] = NewVariant(VT_I4, int64(v.(int32)))\n\t\t\tcase *int32:\n\t\t\t\tvargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int32)))))\n\t\t\tcase uint32:\n\t\t\t\tvargs[n] = NewVariant(VT_UI4, int64(v.(uint32)))\n\t\t\tcase *uint32:\n\t\t\t\tvargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint32)))))\n\t\t\tcase int64:\n\t\t\t\tvargs[n] = NewVariant(VT_I8, int64(v.(int64)))\n\t\t\tcase *int64:\n\t\t\t\tvargs[n] = NewVariant(VT_I8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int64)))))\n\t\t\tcase uint64:\n\t\t\t\tvargs[n] = NewVariant(VT_UI8, int64(uintptr(v.(uint64))))\n\t\t\tcase *uint64:\n\t\t\t\tvargs[n] = NewVariant(VT_UI8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint64)))))\n\t\t\tcase int:\n\t\t\t\tvargs[n] = NewVariant(VT_I4, int64(v.(int)))\n\t\t\tcase *int:\n\t\t\t\tvargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int)))))\n\t\t\tcase uint:\n\t\t\t\tvargs[n] = NewVariant(VT_UI4, int64(v.(uint)))\n\t\t\tcase *uint:\n\t\t\t\tvargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint)))))\n\t\t\tcase float32:\n\t\t\t\tvargs[n] = NewVariant(VT_R4, *(*int64)(unsafe.Pointer(&vv)))\n\t\t\tcase *float32:\n\t\t\t\tvargs[n] = NewVariant(VT_R4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float32)))))\n\t\t\tcase float64:\n\t\t\t\tvargs[n] = NewVariant(VT_R8, *(*int64)(unsafe.Pointer(&vv)))\n\t\t\tcase *float64:\n\t\t\t\tvargs[n] = NewVariant(VT_R8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float64)))))\n\t\t\tcase string:\n\t\t\t\tvargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(v.(string))))))\n\t\t\tcase *string:\n\t\t\t\tvargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*string)))))\n\t\t\tcase time.Time:\n\t\t\t\ts := vv.Format(\"2006-01-02 15:04:05\")\n\t\t\t\tvargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(s)))))\n\t\t\tcase *time.Time:\n\t\t\t\ts := vv.Format(\"2006-01-02 15:04:05\")\n\t\t\t\tvargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(&s))))\n\t\t\tcase *IDispatch:\n\t\t\t\tvargs[n] = NewVariant(VT_DISPATCH, int64(uintptr(unsafe.Pointer(v.(*IDispatch)))))\n\t\t\tcase **IDispatch:\n\t\t\t\tvargs[n] = NewVariant(VT_DISPATCH|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(**IDispatch)))))\n\t\t\tcase nil:\n\t\t\t\tvargs[n] = NewVariant(VT_NULL, 0)\n\t\t\tcase *VARIANT:\n\t\t\t\tvargs[n] = NewVariant(VT_VARIANT|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*VARIANT)))))\n\t\t\tcase []byte:\n\t\t\t\tsafeByteArray := safeArrayFromByteSlice(v.([]byte))\n\t\t\t\tvargs[n] = NewVariant(VT_ARRAY|VT_UI1, int64(uintptr(unsafe.Pointer(safeByteArray))))\n\t\t\t\tdefer VariantClear(&vargs[n])\n\t\t\tcase []string:\n\t\t\t\tsafeByteArray := safeArrayFromStringSlice(v.([]string))\n\t\t\t\tvargs[n] = NewVariant(VT_ARRAY|VT_BSTR, int64(uintptr(unsafe.Pointer(safeByteArray))))\n\t\t\t\tdefer VariantClear(&vargs[n])\n\t\t\tdefault:\n\t\t\t\tpanic(\"unknown type\")\n\t\t\t}\n\t\t}\n\t\tdispparams.rgvarg = uintptr(unsafe.Pointer(&vargs[0]))\n\t\tdispparams.cArgs = uint32(len(params))\n\t}\n\n\tresult = new(VARIANT)\n\tvar excepInfo EXCEPINFO\n\tVariantInit(result)\n\thr, _, _ := syscall.Syscall9(\n\t\tdisp.VTable().Invoke,\n\t\t9,\n\t\tuintptr(unsafe.Pointer(disp)),\n\t\tuintptr(dispid),\n\t\tuintptr(unsafe.Pointer(IID_NULL)),\n\t\tuintptr(GetUserDefaultLCID()),\n\t\tuintptr(dispatch),\n\t\tuintptr(unsafe.Pointer(&dispparams)),\n\t\tuintptr(unsafe.Pointer(result)),\n\t\tuintptr(unsafe.Pointer(&excepInfo)),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewErrorWithSubError(hr, BstrToString(excepInfo.bstrDescription), excepInfo)\n\t}\n\tfor i, varg := range vargs {\n\t\tn := len(params) - i - 1\n\t\tif varg.VT == VT_BSTR && varg.Val != 0 {\n\t\t\tSysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val)))))\n\t\t}\n\t\tif varg.VT == (VT_BSTR|VT_BYREF) && varg.Val != 0 {\n\t\t\t*(params[n].(*string)) = LpOleStrToString(*(**uint16)(unsafe.Pointer(uintptr(varg.Val))))\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/ienumvariant.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype IEnumVARIANT struct {\n\tIUnknown\n}\n\ntype IEnumVARIANTVtbl struct {\n\tIUnknownVtbl\n\tNext  uintptr\n\tSkip  uintptr\n\tReset uintptr\n\tClone uintptr\n}\n\nfunc (v *IEnumVARIANT) VTable() *IEnumVARIANTVtbl {\n\treturn (*IEnumVARIANTVtbl)(unsafe.Pointer(v.RawVTable))\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/ienumvariant_func.go",
    "content": "// +build !windows\n\npackage ole\n\nfunc (enum *IEnumVARIANT) Clone() (*IEnumVARIANT, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\nfunc (enum *IEnumVARIANT) Reset() error {\n\treturn NewError(E_NOTIMPL)\n}\n\nfunc (enum *IEnumVARIANT) Skip(celt uint) error {\n\treturn NewError(E_NOTIMPL)\n}\n\nfunc (enum *IEnumVARIANT) Next(celt uint) (VARIANT, uint, error) {\n\treturn NewVariant(VT_NULL, int64(0)), 0, NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/ienumvariant_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc (enum *IEnumVARIANT) Clone() (cloned *IEnumVARIANT, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tenum.VTable().Clone,\n\t\t2,\n\t\tuintptr(unsafe.Pointer(enum)),\n\t\tuintptr(unsafe.Pointer(&cloned)),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc (enum *IEnumVARIANT) Reset() (err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tenum.VTable().Reset,\n\t\t1,\n\t\tuintptr(unsafe.Pointer(enum)),\n\t\t0,\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc (enum *IEnumVARIANT) Skip(celt uint) (err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tenum.VTable().Skip,\n\t\t2,\n\t\tuintptr(unsafe.Pointer(enum)),\n\t\tuintptr(celt),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc (enum *IEnumVARIANT) Next(celt uint) (array VARIANT, length uint, err error) {\n\thr, _, _ := syscall.Syscall6(\n\t\tenum.VTable().Next,\n\t\t4,\n\t\tuintptr(unsafe.Pointer(enum)),\n\t\tuintptr(celt),\n\t\tuintptr(unsafe.Pointer(&array)),\n\t\tuintptr(unsafe.Pointer(&length)),\n\t\t0,\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iinspectable.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype IInspectable struct {\n\tIUnknown\n}\n\ntype IInspectableVtbl struct {\n\tIUnknownVtbl\n\tGetIIds             uintptr\n\tGetRuntimeClassName uintptr\n\tGetTrustLevel       uintptr\n}\n\nfunc (v *IInspectable) VTable() *IInspectableVtbl {\n\treturn (*IInspectableVtbl)(unsafe.Pointer(v.RawVTable))\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iinspectable_func.go",
    "content": "// +build !windows\n\npackage ole\n\nfunc (v *IInspectable) GetIids() ([]*GUID, error) {\n\treturn []*GUID{}, NewError(E_NOTIMPL)\n}\n\nfunc (v *IInspectable) GetRuntimeClassName() (string, error) {\n\treturn \"\", NewError(E_NOTIMPL)\n}\n\nfunc (v *IInspectable) GetTrustLevel() (uint32, error) {\n\treturn uint32(0), NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iinspectable_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"reflect\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc (v *IInspectable) GetIids() (iids []*GUID, err error) {\n\tvar count uint32\n\tvar array uintptr\n\thr, _, _ := syscall.Syscall(\n\t\tv.VTable().GetIIds,\n\t\t3,\n\t\tuintptr(unsafe.Pointer(v)),\n\t\tuintptr(unsafe.Pointer(&count)),\n\t\tuintptr(unsafe.Pointer(&array)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t\treturn\n\t}\n\tdefer CoTaskMemFree(array)\n\n\tiids = make([]*GUID, count)\n\tbyteCount := count * uint32(unsafe.Sizeof(GUID{}))\n\tslicehdr := reflect.SliceHeader{Data: array, Len: int(byteCount), Cap: int(byteCount)}\n\tbyteSlice := *(*[]byte)(unsafe.Pointer(&slicehdr))\n\treader := bytes.NewReader(byteSlice)\n\tfor i := range iids {\n\t\tguid := GUID{}\n\t\terr = binary.Read(reader, binary.LittleEndian, &guid)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tiids[i] = &guid\n\t}\n\treturn\n}\n\nfunc (v *IInspectable) GetRuntimeClassName() (s string, err error) {\n\tvar hstring HString\n\thr, _, _ := syscall.Syscall(\n\t\tv.VTable().GetRuntimeClassName,\n\t\t2,\n\t\tuintptr(unsafe.Pointer(v)),\n\t\tuintptr(unsafe.Pointer(&hstring)),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t\treturn\n\t}\n\ts = hstring.String()\n\tDeleteHString(hstring)\n\treturn\n}\n\nfunc (v *IInspectable) GetTrustLevel() (level uint32, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tv.VTable().GetTrustLevel,\n\t\t2,\n\t\tuintptr(unsafe.Pointer(v)),\n\t\tuintptr(unsafe.Pointer(&level)),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iprovideclassinfo.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype IProvideClassInfo struct {\n\tIUnknown\n}\n\ntype IProvideClassInfoVtbl struct {\n\tIUnknownVtbl\n\tGetClassInfo uintptr\n}\n\nfunc (v *IProvideClassInfo) VTable() *IProvideClassInfoVtbl {\n\treturn (*IProvideClassInfoVtbl)(unsafe.Pointer(v.RawVTable))\n}\n\nfunc (v *IProvideClassInfo) GetClassInfo() (cinfo *ITypeInfo, err error) {\n\tcinfo, err = getClassInfo(v)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go",
    "content": "// +build !windows\n\npackage ole\n\nfunc getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tdisp.VTable().GetClassInfo,\n\t\t2,\n\t\tuintptr(unsafe.Pointer(disp)),\n\t\tuintptr(unsafe.Pointer(&tinfo)),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/itypeinfo.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype ITypeInfo struct {\n\tIUnknown\n}\n\ntype ITypeInfoVtbl struct {\n\tIUnknownVtbl\n\tGetTypeAttr          uintptr\n\tGetTypeComp          uintptr\n\tGetFuncDesc          uintptr\n\tGetVarDesc           uintptr\n\tGetNames             uintptr\n\tGetRefTypeOfImplType uintptr\n\tGetImplTypeFlags     uintptr\n\tGetIDsOfNames        uintptr\n\tInvoke               uintptr\n\tGetDocumentation     uintptr\n\tGetDllEntry          uintptr\n\tGetRefTypeInfo       uintptr\n\tAddressOfMember      uintptr\n\tCreateInstance       uintptr\n\tGetMops              uintptr\n\tGetContainingTypeLib uintptr\n\tReleaseTypeAttr      uintptr\n\tReleaseFuncDesc      uintptr\n\tReleaseVarDesc       uintptr\n}\n\nfunc (v *ITypeInfo) VTable() *ITypeInfoVtbl {\n\treturn (*ITypeInfoVtbl)(unsafe.Pointer(v.RawVTable))\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/itypeinfo_func.go",
    "content": "// +build !windows\n\npackage ole\n\nfunc (v *ITypeInfo) GetTypeAttr() (*TYPEATTR, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/itypeinfo_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc (v *ITypeInfo) GetTypeAttr() (tattr *TYPEATTR, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tuintptr(v.VTable().GetTypeAttr),\n\t\t2,\n\t\tuintptr(unsafe.Pointer(v)),\n\t\tuintptr(unsafe.Pointer(&tattr)),\n\t\t0)\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iunknown.go",
    "content": "package ole\n\nimport \"unsafe\"\n\ntype IUnknown struct {\n\tRawVTable *interface{}\n}\n\ntype IUnknownVtbl struct {\n\tQueryInterface uintptr\n\tAddRef         uintptr\n\tRelease        uintptr\n}\n\ntype UnknownLike interface {\n\tQueryInterface(iid *GUID) (disp *IDispatch, err error)\n\tAddRef() int32\n\tRelease() int32\n}\n\nfunc (v *IUnknown) VTable() *IUnknownVtbl {\n\treturn (*IUnknownVtbl)(unsafe.Pointer(v.RawVTable))\n}\n\nfunc (v *IUnknown) PutQueryInterface(interfaceID *GUID, obj interface{}) error {\n\treturn reflectQueryInterface(v, v.VTable().QueryInterface, interfaceID, obj)\n}\n\nfunc (v *IUnknown) IDispatch(interfaceID *GUID) (dispatch *IDispatch, err error) {\n\terr = v.PutQueryInterface(interfaceID, &dispatch)\n\treturn\n}\n\nfunc (v *IUnknown) IEnumVARIANT(interfaceID *GUID) (enum *IEnumVARIANT, err error) {\n\terr = v.PutQueryInterface(interfaceID, &enum)\n\treturn\n}\n\nfunc (v *IUnknown) QueryInterface(iid *GUID) (*IDispatch, error) {\n\treturn queryInterface(v, iid)\n}\n\nfunc (v *IUnknown) MustQueryInterface(iid *GUID) (disp *IDispatch) {\n\tunk, err := queryInterface(v, iid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn unk\n}\n\nfunc (v *IUnknown) AddRef() int32 {\n\treturn addRef(v)\n}\n\nfunc (v *IUnknown) Release() int32 {\n\treturn release(v)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iunknown_func.go",
    "content": "// +build !windows\n\npackage ole\n\nfunc reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) {\n\treturn NewError(E_NOTIMPL)\n}\n\nfunc queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\nfunc addRef(unk *IUnknown) int32 {\n\treturn 0\n}\n\nfunc release(unk *IUnknown) int32 {\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/iunknown_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"reflect\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) {\n\tselfValue := reflect.ValueOf(self).Elem()\n\tobjValue := reflect.ValueOf(obj).Elem()\n\n\thr, _, _ := syscall.Syscall(\n\t\tmethod,\n\t\t3,\n\t\tselfValue.UnsafeAddr(),\n\t\tuintptr(unsafe.Pointer(interfaceID)),\n\t\tobjValue.Addr().Pointer())\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) {\n\thr, _, _ := syscall.Syscall(\n\t\tunk.VTable().QueryInterface,\n\t\t3,\n\t\tuintptr(unsafe.Pointer(unk)),\n\t\tuintptr(unsafe.Pointer(iid)),\n\t\tuintptr(unsafe.Pointer(&disp)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc addRef(unk *IUnknown) int32 {\n\tret, _, _ := syscall.Syscall(\n\t\tunk.VTable().AddRef,\n\t\t1,\n\t\tuintptr(unsafe.Pointer(unk)),\n\t\t0,\n\t\t0)\n\treturn int32(ret)\n}\n\nfunc release(unk *IUnknown) int32 {\n\tret, _, _ := syscall.Syscall(\n\t\tunk.VTable().Release,\n\t\t1,\n\t\tuintptr(unsafe.Pointer(unk)),\n\t\t0,\n\t\t0)\n\treturn int32(ret)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/ole.go",
    "content": "package ole\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// DISPPARAMS are the arguments that passed to methods or property.\ntype DISPPARAMS struct {\n\trgvarg            uintptr\n\trgdispidNamedArgs uintptr\n\tcArgs             uint32\n\tcNamedArgs        uint32\n}\n\n// EXCEPINFO defines exception info.\ntype EXCEPINFO struct {\n\twCode             uint16\n\twReserved         uint16\n\tbstrSource        *uint16\n\tbstrDescription   *uint16\n\tbstrHelpFile      *uint16\n\tdwHelpContext     uint32\n\tpvReserved        uintptr\n\tpfnDeferredFillIn uintptr\n\tscode             uint32\n}\n\n// WCode return wCode in EXCEPINFO.\nfunc (e EXCEPINFO) WCode() uint16 {\n\treturn e.wCode\n}\n\n// SCODE return scode in EXCEPINFO.\nfunc (e EXCEPINFO) SCODE() uint32 {\n\treturn e.scode\n}\n\n// String convert EXCEPINFO to string.\nfunc (e EXCEPINFO) String() string {\n\tvar src, desc, hlp string\n\tif e.bstrSource == nil {\n\t\tsrc = \"<nil>\"\n\t} else {\n\t\tsrc = BstrToString(e.bstrSource)\n\t}\n\n\tif e.bstrDescription == nil {\n\t\tdesc = \"<nil>\"\n\t} else {\n\t\tdesc = BstrToString(e.bstrDescription)\n\t}\n\n\tif e.bstrHelpFile == nil {\n\t\thlp = \"<nil>\"\n\t} else {\n\t\thlp = BstrToString(e.bstrHelpFile)\n\t}\n\n\treturn fmt.Sprintf(\n\t\t\"wCode: %#x, bstrSource: %v, bstrDescription: %v, bstrHelpFile: %v, dwHelpContext: %#x, scode: %#x\",\n\t\te.wCode, src, desc, hlp, e.dwHelpContext, e.scode,\n\t)\n}\n\n// Error implements error interface and returns error string.\nfunc (e EXCEPINFO) Error() string {\n\tif e.bstrDescription != nil {\n\t\treturn strings.TrimSpace(BstrToString(e.bstrDescription))\n\t}\n\n\tsrc := \"Unknown\"\n\tif e.bstrSource != nil {\n\t\tsrc = BstrToString(e.bstrSource)\n\t}\n\n\tcode := e.scode\n\tif e.wCode != 0 {\n\t\tcode = uint32(e.wCode)\n\t}\n\n\treturn fmt.Sprintf(\"%v: %#x\", src, code)\n}\n\n// PARAMDATA defines parameter data type.\ntype PARAMDATA struct {\n\tName *int16\n\tVt   uint16\n}\n\n// METHODDATA defines method info.\ntype METHODDATA struct {\n\tName     *uint16\n\tData     *PARAMDATA\n\tDispid   int32\n\tMeth     uint32\n\tCC       int32\n\tCArgs    uint32\n\tFlags    uint16\n\tVtReturn uint32\n}\n\n// INTERFACEDATA defines interface info.\ntype INTERFACEDATA struct {\n\tMethodData *METHODDATA\n\tCMembers   uint32\n}\n\n// Point is 2D vector type.\ntype Point struct {\n\tX int32\n\tY int32\n}\n\n// Msg is message between processes.\ntype Msg struct {\n\tHwnd    uint32\n\tMessage uint32\n\tWparam  int32\n\tLparam  int32\n\tTime    uint32\n\tPt      Point\n}\n\n// TYPEDESC defines data type.\ntype TYPEDESC struct {\n\tHreftype uint32\n\tVT       uint16\n}\n\n// IDLDESC defines IDL info.\ntype IDLDESC struct {\n\tDwReserved uint32\n\tWIDLFlags  uint16\n}\n\n// TYPEATTR defines type info.\ntype TYPEATTR struct {\n\tGuid             GUID\n\tLcid             uint32\n\tdwReserved       uint32\n\tMemidConstructor int32\n\tMemidDestructor  int32\n\tLpstrSchema      *uint16\n\tCbSizeInstance   uint32\n\tTypekind         int32\n\tCFuncs           uint16\n\tCVars            uint16\n\tCImplTypes       uint16\n\tCbSizeVft        uint16\n\tCbAlignment      uint16\n\tWTypeFlags       uint16\n\tWMajorVerNum     uint16\n\tWMinorVerNum     uint16\n\tTdescAlias       TYPEDESC\n\tIdldescType      IDLDESC\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/oleutil/connection.go",
    "content": "// +build windows\n\npackage oleutil\n\nimport (\n\t\"reflect\"\n\t\"unsafe\"\n\n\tole \"github.com/go-ole/go-ole\"\n)\n\ntype stdDispatch struct {\n\tlpVtbl  *stdDispatchVtbl\n\tref     int32\n\tiid     *ole.GUID\n\tiface   interface{}\n\tfuncMap map[string]int32\n}\n\ntype stdDispatchVtbl struct {\n\tpQueryInterface   uintptr\n\tpAddRef           uintptr\n\tpRelease          uintptr\n\tpGetTypeInfoCount uintptr\n\tpGetTypeInfo      uintptr\n\tpGetIDsOfNames    uintptr\n\tpInvoke           uintptr\n}\n\nfunc dispQueryInterface(this *ole.IUnknown, iid *ole.GUID, punk **ole.IUnknown) uint32 {\n\tpthis := (*stdDispatch)(unsafe.Pointer(this))\n\t*punk = nil\n\tif ole.IsEqualGUID(iid, ole.IID_IUnknown) ||\n\t\tole.IsEqualGUID(iid, ole.IID_IDispatch) {\n\t\tdispAddRef(this)\n\t\t*punk = this\n\t\treturn ole.S_OK\n\t}\n\tif ole.IsEqualGUID(iid, pthis.iid) {\n\t\tdispAddRef(this)\n\t\t*punk = this\n\t\treturn ole.S_OK\n\t}\n\treturn ole.E_NOINTERFACE\n}\n\nfunc dispAddRef(this *ole.IUnknown) int32 {\n\tpthis := (*stdDispatch)(unsafe.Pointer(this))\n\tpthis.ref++\n\treturn pthis.ref\n}\n\nfunc dispRelease(this *ole.IUnknown) int32 {\n\tpthis := (*stdDispatch)(unsafe.Pointer(this))\n\tpthis.ref--\n\treturn pthis.ref\n}\n\nfunc dispGetIDsOfNames(this *ole.IUnknown, iid *ole.GUID, wnames []*uint16, namelen int, lcid int, pdisp []int32) uintptr {\n\tpthis := (*stdDispatch)(unsafe.Pointer(this))\n\tnames := make([]string, len(wnames))\n\tfor i := 0; i < len(names); i++ {\n\t\tnames[i] = ole.LpOleStrToString(wnames[i])\n\t}\n\tfor n := 0; n < namelen; n++ {\n\t\tif id, ok := pthis.funcMap[names[n]]; ok {\n\t\t\tpdisp[n] = id\n\t\t}\n\t}\n\treturn ole.S_OK\n}\n\nfunc dispGetTypeInfoCount(pcount *int) uintptr {\n\tif pcount != nil {\n\t\t*pcount = 0\n\t}\n\treturn ole.S_OK\n}\n\nfunc dispGetTypeInfo(ptypeif *uintptr) uintptr {\n\treturn ole.E_NOTIMPL\n}\n\nfunc dispInvoke(this *ole.IDispatch, dispid int32, riid *ole.GUID, lcid int, flags int16, dispparams *ole.DISPPARAMS, result *ole.VARIANT, pexcepinfo *ole.EXCEPINFO, nerr *uint) uintptr {\n\tpthis := (*stdDispatch)(unsafe.Pointer(this))\n\tfound := \"\"\n\tfor name, id := range pthis.funcMap {\n\t\tif id == dispid {\n\t\t\tfound = name\n\t\t}\n\t}\n\tif found != \"\" {\n\t\trv := reflect.ValueOf(pthis.iface).Elem()\n\t\trm := rv.MethodByName(found)\n\t\trr := rm.Call([]reflect.Value{})\n\t\tprintln(len(rr))\n\t\treturn ole.S_OK\n\t}\n\treturn ole.E_NOTIMPL\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/oleutil/connection_func.go",
    "content": "// +build !windows\n\npackage oleutil\n\nimport ole \"github.com/go-ole/go-ole\"\n\n// ConnectObject creates a connection point between two services for communication.\nfunc ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (uint32, error) {\n\treturn 0, ole.NewError(ole.E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go",
    "content": "// +build windows\n\npackage oleutil\n\nimport (\n\t\"reflect\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\tole \"github.com/go-ole/go-ole\"\n)\n\n// ConnectObject creates a connection point between two services for communication.\nfunc ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (cookie uint32, err error) {\n\tunknown, err := disp.QueryInterface(ole.IID_IConnectionPointContainer)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tcontainer := (*ole.IConnectionPointContainer)(unsafe.Pointer(unknown))\n\tvar point *ole.IConnectionPoint\n\terr = container.FindConnectionPoint(iid, &point)\n\tif err != nil {\n\t\treturn\n\t}\n\tif edisp, ok := idisp.(*ole.IUnknown); ok {\n\t\tcookie, err = point.Advise(edisp)\n\t\tcontainer.Release()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\trv := reflect.ValueOf(disp).Elem()\n\tif rv.Type().Kind() == reflect.Struct {\n\t\tdest := &stdDispatch{}\n\t\tdest.lpVtbl = &stdDispatchVtbl{}\n\t\tdest.lpVtbl.pQueryInterface = syscall.NewCallback(dispQueryInterface)\n\t\tdest.lpVtbl.pAddRef = syscall.NewCallback(dispAddRef)\n\t\tdest.lpVtbl.pRelease = syscall.NewCallback(dispRelease)\n\t\tdest.lpVtbl.pGetTypeInfoCount = syscall.NewCallback(dispGetTypeInfoCount)\n\t\tdest.lpVtbl.pGetTypeInfo = syscall.NewCallback(dispGetTypeInfo)\n\t\tdest.lpVtbl.pGetIDsOfNames = syscall.NewCallback(dispGetIDsOfNames)\n\t\tdest.lpVtbl.pInvoke = syscall.NewCallback(dispInvoke)\n\t\tdest.iface = disp\n\t\tdest.iid = iid\n\t\tcookie, err = point.Advise((*ole.IUnknown)(unsafe.Pointer(dest)))\n\t\tcontainer.Release()\n\t\tif err != nil {\n\t\t\tpoint.Release()\n\t\t\treturn\n\t\t}\n\t\treturn\n\t}\n\n\tcontainer.Release()\n\n\treturn 0, ole.NewError(ole.E_INVALIDARG)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/oleutil/go-get.go",
    "content": "// This file is here so go get succeeds as without it errors with:\n// no buildable Go source files in ...\n//\n// +build !windows\n\npackage oleutil\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/oleutil/oleutil.go",
    "content": "package oleutil\n\nimport ole \"github.com/go-ole/go-ole\"\n\n// ClassIDFrom retrieves class ID whether given is program ID or application string.\nfunc ClassIDFrom(programID string) (classID *ole.GUID, err error) {\n\treturn ole.ClassIDFrom(programID)\n}\n\n// CreateObject creates object from programID based on interface type.\n//\n// Only supports IUnknown.\n//\n// Program ID can be either program ID or application string.\nfunc CreateObject(programID string) (unknown *ole.IUnknown, err error) {\n\tclassID, err := ole.ClassIDFrom(programID)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tunknown, err = ole.CreateInstance(classID, ole.IID_IUnknown)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn\n}\n\n// GetActiveObject retrieves active object for program ID and interface ID based\n// on interface type.\n//\n// Only supports IUnknown.\n//\n// Program ID can be either program ID or application string.\nfunc GetActiveObject(programID string) (unknown *ole.IUnknown, err error) {\n\tclassID, err := ole.ClassIDFrom(programID)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tunknown, err = ole.GetActiveObject(classID, ole.IID_IUnknown)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn\n}\n\n// CallMethod calls method on IDispatch with parameters.\nfunc CallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {\n\treturn disp.InvokeWithOptionalArgs(name, ole.DISPATCH_METHOD, params)\n}\n\n// MustCallMethod calls method on IDispatch with parameters or panics.\nfunc MustCallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {\n\tr, err := CallMethod(disp, name, params...)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn r\n}\n\n// GetProperty retrieves property from IDispatch.\nfunc GetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {\n\treturn disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYGET, params)\n}\n\n// MustGetProperty retrieves property from IDispatch or panics.\nfunc MustGetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {\n\tr, err := GetProperty(disp, name, params...)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn r\n}\n\n// PutProperty mutates property.\nfunc PutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {\n\treturn disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUT, params)\n}\n\n// MustPutProperty mutates property or panics.\nfunc MustPutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {\n\tr, err := PutProperty(disp, name, params...)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn r\n}\n\n// PutPropertyRef mutates property reference.\nfunc PutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) {\n\treturn disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUTREF, params)\n}\n\n// MustPutPropertyRef mutates property reference or panics.\nfunc MustPutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) {\n\tr, err := PutPropertyRef(disp, name, params...)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn r\n}\n\nfunc ForEach(disp *ole.IDispatch, f func(v *ole.VARIANT) error) error {\n\tnewEnum, err := disp.GetProperty(\"_NewEnum\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer newEnum.Clear()\n\n\tenum, err := newEnum.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer enum.Release()\n\n\tfor item, length, err := enum.Next(1); length > 0; item, length, err = enum.Next(1) {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif ferr := f(&item); ferr != nil {\n\t\t\treturn ferr\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/safearray.go",
    "content": "// Package is meant to retrieve and process safe array data returned from COM.\n\npackage ole\n\n// SafeArrayBound defines the SafeArray boundaries.\ntype SafeArrayBound struct {\n\tElements   uint32\n\tLowerBound int32\n}\n\n// SafeArray is how COM handles arrays.\ntype SafeArray struct {\n\tDimensions   uint16\n\tFeaturesFlag uint16\n\tElementsSize uint32\n\tLocksAmount  uint32\n\tData         uint32\n\tBounds       [16]byte\n}\n\n// SAFEARRAY is obsolete, exists for backwards compatibility.\n// Use SafeArray\ntype SAFEARRAY SafeArray\n\n// SAFEARRAYBOUND is obsolete, exists for backwards compatibility.\n// Use SafeArrayBound\ntype SAFEARRAYBOUND SafeArrayBound\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/safearray_func.go",
    "content": "// +build !windows\n\npackage ole\n\nimport (\n\t\"unsafe\"\n)\n\n// safeArrayAccessData returns raw array pointer.\n//\n// AKA: SafeArrayAccessData in Windows API.\nfunc safeArrayAccessData(safearray *SafeArray) (uintptr, error) {\n\treturn uintptr(0), NewError(E_NOTIMPL)\n}\n\n// safeArrayUnaccessData releases raw array.\n//\n// AKA: SafeArrayUnaccessData in Windows API.\nfunc safeArrayUnaccessData(safearray *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayAllocData allocates SafeArray.\n//\n// AKA: SafeArrayAllocData in Windows API.\nfunc safeArrayAllocData(safearray *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayAllocDescriptor allocates SafeArray.\n//\n// AKA: SafeArrayAllocDescriptor in Windows API.\nfunc safeArrayAllocDescriptor(dimensions uint32) (*SafeArray, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayAllocDescriptorEx allocates SafeArray.\n//\n// AKA: SafeArrayAllocDescriptorEx in Windows API.\nfunc safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (*SafeArray, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayCopy returns copy of SafeArray.\n//\n// AKA: SafeArrayCopy in Windows API.\nfunc safeArrayCopy(original *SafeArray) (*SafeArray, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayCopyData duplicates SafeArray into another SafeArray object.\n//\n// AKA: SafeArrayCopyData in Windows API.\nfunc safeArrayCopyData(original *SafeArray, duplicate *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayCreate creates SafeArray.\n//\n// AKA: SafeArrayCreate in Windows API.\nfunc safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (*SafeArray, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayCreateEx creates SafeArray.\n//\n// AKA: SafeArrayCreateEx in Windows API.\nfunc safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (*SafeArray, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayCreateVector creates SafeArray.\n//\n// AKA: SafeArrayCreateVector in Windows API.\nfunc safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (*SafeArray, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayCreateVectorEx creates SafeArray.\n//\n// AKA: SafeArrayCreateVectorEx in Windows API.\nfunc safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (*SafeArray, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayDestroy destroys SafeArray object.\n//\n// AKA: SafeArrayDestroy in Windows API.\nfunc safeArrayDestroy(safearray *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayDestroyData destroys SafeArray object.\n//\n// AKA: SafeArrayDestroyData in Windows API.\nfunc safeArrayDestroyData(safearray *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayDestroyDescriptor destroys SafeArray object.\n//\n// AKA: SafeArrayDestroyDescriptor in Windows API.\nfunc safeArrayDestroyDescriptor(safearray *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayGetDim is the amount of dimensions in the SafeArray.\n//\n// SafeArrays may have multiple dimensions. Meaning, it could be\n// multidimensional array.\n//\n// AKA: SafeArrayGetDim in Windows API.\nfunc safeArrayGetDim(safearray *SafeArray) (*uint32, error) {\n\tu := uint32(0)\n\treturn &u, NewError(E_NOTIMPL)\n}\n\n// safeArrayGetElementSize is the element size in bytes.\n//\n// AKA: SafeArrayGetElemsize in Windows API.\nfunc safeArrayGetElementSize(safearray *SafeArray) (*uint32, error) {\n\tu := uint32(0)\n\treturn &u, NewError(E_NOTIMPL)\n}\n\n// safeArrayGetElement retrieves element at given index.\nfunc safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayGetElement retrieves element at given index and converts to string.\nfunc safeArrayGetElementString(safearray *SafeArray, index int64) (string, error) {\n\treturn \"\", NewError(E_NOTIMPL)\n}\n\n// safeArrayGetIID is the InterfaceID of the elements in the SafeArray.\n//\n// AKA: SafeArrayGetIID in Windows API.\nfunc safeArrayGetIID(safearray *SafeArray) (*GUID, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArrayGetLBound returns lower bounds of SafeArray.\n//\n// SafeArrays may have multiple dimensions. Meaning, it could be\n// multidimensional array.\n//\n// AKA: SafeArrayGetLBound in Windows API.\nfunc safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int64, error) {\n\treturn int64(0), NewError(E_NOTIMPL)\n}\n\n// safeArrayGetUBound returns upper bounds of SafeArray.\n//\n// SafeArrays may have multiple dimensions. Meaning, it could be\n// multidimensional array.\n//\n// AKA: SafeArrayGetUBound in Windows API.\nfunc safeArrayGetUBound(safearray *SafeArray, dimension uint32) (int64, error) {\n\treturn int64(0), NewError(E_NOTIMPL)\n}\n\n// safeArrayGetVartype returns data type of SafeArray.\n//\n// AKA: SafeArrayGetVartype in Windows API.\nfunc safeArrayGetVartype(safearray *SafeArray) (uint16, error) {\n\treturn uint16(0), NewError(E_NOTIMPL)\n}\n\n// safeArrayLock locks SafeArray for reading to modify SafeArray.\n//\n// This must be called during some calls to ensure that another process does not\n// read or write to the SafeArray during editing.\n//\n// AKA: SafeArrayLock in Windows API.\nfunc safeArrayLock(safearray *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayUnlock unlocks SafeArray for reading.\n//\n// AKA: SafeArrayUnlock in Windows API.\nfunc safeArrayUnlock(safearray *SafeArray) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayPutElement stores the data element at the specified location in the\n// array.\n//\n// AKA: SafeArrayPutElement in Windows API.\nfunc safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) error {\n\treturn NewError(E_NOTIMPL)\n}\n\n// safeArrayGetRecordInfo accesses IRecordInfo info for custom types.\n//\n// AKA: SafeArrayGetRecordInfo in Windows API.\n//\n// XXX: Must implement IRecordInfo interface for this to return.\nfunc safeArrayGetRecordInfo(safearray *SafeArray) (interface{}, error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// safeArraySetRecordInfo mutates IRecordInfo info for custom types.\n//\n// AKA: SafeArraySetRecordInfo in Windows API.\n//\n// XXX: Must implement IRecordInfo interface for this to return.\nfunc safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) error {\n\treturn NewError(E_NOTIMPL)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/safearray_windows.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"unsafe\"\n)\n\nvar (\n\tprocSafeArrayAccessData, _        = modoleaut32.FindProc(\"SafeArrayAccessData\")\n\tprocSafeArrayAllocData, _         = modoleaut32.FindProc(\"SafeArrayAllocData\")\n\tprocSafeArrayAllocDescriptor, _   = modoleaut32.FindProc(\"SafeArrayAllocDescriptor\")\n\tprocSafeArrayAllocDescriptorEx, _ = modoleaut32.FindProc(\"SafeArrayAllocDescriptorEx\")\n\tprocSafeArrayCopy, _              = modoleaut32.FindProc(\"SafeArrayCopy\")\n\tprocSafeArrayCopyData, _          = modoleaut32.FindProc(\"SafeArrayCopyData\")\n\tprocSafeArrayCreate, _            = modoleaut32.FindProc(\"SafeArrayCreate\")\n\tprocSafeArrayCreateEx, _          = modoleaut32.FindProc(\"SafeArrayCreateEx\")\n\tprocSafeArrayCreateVector, _      = modoleaut32.FindProc(\"SafeArrayCreateVector\")\n\tprocSafeArrayCreateVectorEx, _    = modoleaut32.FindProc(\"SafeArrayCreateVectorEx\")\n\tprocSafeArrayDestroy, _           = modoleaut32.FindProc(\"SafeArrayDestroy\")\n\tprocSafeArrayDestroyData, _       = modoleaut32.FindProc(\"SafeArrayDestroyData\")\n\tprocSafeArrayDestroyDescriptor, _ = modoleaut32.FindProc(\"SafeArrayDestroyDescriptor\")\n\tprocSafeArrayGetDim, _            = modoleaut32.FindProc(\"SafeArrayGetDim\")\n\tprocSafeArrayGetElement, _        = modoleaut32.FindProc(\"SafeArrayGetElement\")\n\tprocSafeArrayGetElemsize, _       = modoleaut32.FindProc(\"SafeArrayGetElemsize\")\n\tprocSafeArrayGetIID, _            = modoleaut32.FindProc(\"SafeArrayGetIID\")\n\tprocSafeArrayGetLBound, _         = modoleaut32.FindProc(\"SafeArrayGetLBound\")\n\tprocSafeArrayGetUBound, _         = modoleaut32.FindProc(\"SafeArrayGetUBound\")\n\tprocSafeArrayGetVartype, _        = modoleaut32.FindProc(\"SafeArrayGetVartype\")\n\tprocSafeArrayLock, _              = modoleaut32.FindProc(\"SafeArrayLock\")\n\tprocSafeArrayPtrOfIndex, _        = modoleaut32.FindProc(\"SafeArrayPtrOfIndex\")\n\tprocSafeArrayUnaccessData, _      = modoleaut32.FindProc(\"SafeArrayUnaccessData\")\n\tprocSafeArrayUnlock, _            = modoleaut32.FindProc(\"SafeArrayUnlock\")\n\tprocSafeArrayPutElement, _        = modoleaut32.FindProc(\"SafeArrayPutElement\")\n\t//procSafeArrayRedim, _             = modoleaut32.FindProc(\"SafeArrayRedim\") // TODO\n\t//procSafeArraySetIID, _            = modoleaut32.FindProc(\"SafeArraySetIID\") // TODO\n\tprocSafeArrayGetRecordInfo, _ = modoleaut32.FindProc(\"SafeArrayGetRecordInfo\")\n\tprocSafeArraySetRecordInfo, _ = modoleaut32.FindProc(\"SafeArraySetRecordInfo\")\n)\n\n// safeArrayAccessData returns raw array pointer.\n//\n// AKA: SafeArrayAccessData in Windows API.\n// Todo: Test\nfunc safeArrayAccessData(safearray *SafeArray) (element uintptr, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayAccessData.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&element))))\n\treturn\n}\n\n// safeArrayUnaccessData releases raw array.\n//\n// AKA: SafeArrayUnaccessData in Windows API.\nfunc safeArrayUnaccessData(safearray *SafeArray) (err error) {\n\terr = convertHresultToError(procSafeArrayUnaccessData.Call(uintptr(unsafe.Pointer(safearray))))\n\treturn\n}\n\n// safeArrayAllocData allocates SafeArray.\n//\n// AKA: SafeArrayAllocData in Windows API.\nfunc safeArrayAllocData(safearray *SafeArray) (err error) {\n\terr = convertHresultToError(procSafeArrayAllocData.Call(uintptr(unsafe.Pointer(safearray))))\n\treturn\n}\n\n// safeArrayAllocDescriptor allocates SafeArray.\n//\n// AKA: SafeArrayAllocDescriptor in Windows API.\nfunc safeArrayAllocDescriptor(dimensions uint32) (safearray *SafeArray, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayAllocDescriptor.Call(uintptr(dimensions), uintptr(unsafe.Pointer(&safearray))))\n\treturn\n}\n\n// safeArrayAllocDescriptorEx allocates SafeArray.\n//\n// AKA: SafeArrayAllocDescriptorEx in Windows API.\nfunc safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (safearray *SafeArray, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayAllocDescriptorEx.Call(\n\t\t\tuintptr(variantType),\n\t\t\tuintptr(dimensions),\n\t\t\tuintptr(unsafe.Pointer(&safearray))))\n\treturn\n}\n\n// safeArrayCopy returns copy of SafeArray.\n//\n// AKA: SafeArrayCopy in Windows API.\nfunc safeArrayCopy(original *SafeArray) (safearray *SafeArray, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayCopy.Call(\n\t\t\tuintptr(unsafe.Pointer(original)),\n\t\t\tuintptr(unsafe.Pointer(&safearray))))\n\treturn\n}\n\n// safeArrayCopyData duplicates SafeArray into another SafeArray object.\n//\n// AKA: SafeArrayCopyData in Windows API.\nfunc safeArrayCopyData(original *SafeArray, duplicate *SafeArray) (err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayCopyData.Call(\n\t\t\tuintptr(unsafe.Pointer(original)),\n\t\t\tuintptr(unsafe.Pointer(duplicate))))\n\treturn\n}\n\n// safeArrayCreate creates SafeArray.\n//\n// AKA: SafeArrayCreate in Windows API.\nfunc safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (safearray *SafeArray, err error) {\n\tsa, _, err := procSafeArrayCreate.Call(\n\t\tuintptr(variantType),\n\t\tuintptr(dimensions),\n\t\tuintptr(unsafe.Pointer(bounds)))\n\tsafearray = (*SafeArray)(unsafe.Pointer(&sa))\n\treturn\n}\n\n// safeArrayCreateEx creates SafeArray.\n//\n// AKA: SafeArrayCreateEx in Windows API.\nfunc safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (safearray *SafeArray, err error) {\n\tsa, _, err := procSafeArrayCreateEx.Call(\n\t\tuintptr(variantType),\n\t\tuintptr(dimensions),\n\t\tuintptr(unsafe.Pointer(bounds)),\n\t\textra)\n\tsafearray = (*SafeArray)(unsafe.Pointer(sa))\n\treturn\n}\n\n// safeArrayCreateVector creates SafeArray.\n//\n// AKA: SafeArrayCreateVector in Windows API.\nfunc safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (safearray *SafeArray, err error) {\n\tsa, _, err := procSafeArrayCreateVector.Call(\n\t\tuintptr(variantType),\n\t\tuintptr(lowerBound),\n\t\tuintptr(length))\n\tsafearray = (*SafeArray)(unsafe.Pointer(sa))\n\treturn\n}\n\n// safeArrayCreateVectorEx creates SafeArray.\n//\n// AKA: SafeArrayCreateVectorEx in Windows API.\nfunc safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (safearray *SafeArray, err error) {\n\tsa, _, err := procSafeArrayCreateVectorEx.Call(\n\t\tuintptr(variantType),\n\t\tuintptr(lowerBound),\n\t\tuintptr(length),\n\t\textra)\n\tsafearray = (*SafeArray)(unsafe.Pointer(sa))\n\treturn\n}\n\n// safeArrayDestroy destroys SafeArray object.\n//\n// AKA: SafeArrayDestroy in Windows API.\nfunc safeArrayDestroy(safearray *SafeArray) (err error) {\n\terr = convertHresultToError(procSafeArrayDestroy.Call(uintptr(unsafe.Pointer(safearray))))\n\treturn\n}\n\n// safeArrayDestroyData destroys SafeArray object.\n//\n// AKA: SafeArrayDestroyData in Windows API.\nfunc safeArrayDestroyData(safearray *SafeArray) (err error) {\n\terr = convertHresultToError(procSafeArrayDestroyData.Call(uintptr(unsafe.Pointer(safearray))))\n\treturn\n}\n\n// safeArrayDestroyDescriptor destroys SafeArray object.\n//\n// AKA: SafeArrayDestroyDescriptor in Windows API.\nfunc safeArrayDestroyDescriptor(safearray *SafeArray) (err error) {\n\terr = convertHresultToError(procSafeArrayDestroyDescriptor.Call(uintptr(unsafe.Pointer(safearray))))\n\treturn\n}\n\n// safeArrayGetDim is the amount of dimensions in the SafeArray.\n//\n// SafeArrays may have multiple dimensions. Meaning, it could be\n// multidimensional array.\n//\n// AKA: SafeArrayGetDim in Windows API.\nfunc safeArrayGetDim(safearray *SafeArray) (dimensions *uint32, err error) {\n\tl, _, err := procSafeArrayGetDim.Call(uintptr(unsafe.Pointer(safearray)))\n\tdimensions = (*uint32)(unsafe.Pointer(l))\n\treturn\n}\n\n// safeArrayGetElementSize is the element size in bytes.\n//\n// AKA: SafeArrayGetElemsize in Windows API.\nfunc safeArrayGetElementSize(safearray *SafeArray) (length *uint32, err error) {\n\tl, _, err := procSafeArrayGetElemsize.Call(uintptr(unsafe.Pointer(safearray)))\n\tlength = (*uint32)(unsafe.Pointer(l))\n\treturn\n}\n\n// safeArrayGetElement retrieves element at given index.\nfunc safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error {\n\treturn convertHresultToError(\n\t\tprocSafeArrayGetElement.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&index)),\n\t\t\tuintptr(pv)))\n}\n\n// safeArrayGetElementString retrieves element at given index and converts to string.\nfunc safeArrayGetElementString(safearray *SafeArray, index int64) (str string, err error) {\n\tvar element *int16\n\terr = convertHresultToError(\n\t\tprocSafeArrayGetElement.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&index)),\n\t\t\tuintptr(unsafe.Pointer(&element))))\n\tstr = BstrToString(*(**uint16)(unsafe.Pointer(&element)))\n\tSysFreeString(element)\n\treturn\n}\n\n// safeArrayGetIID is the InterfaceID of the elements in the SafeArray.\n//\n// AKA: SafeArrayGetIID in Windows API.\nfunc safeArrayGetIID(safearray *SafeArray) (guid *GUID, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayGetIID.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&guid))))\n\treturn\n}\n\n// safeArrayGetLBound returns lower bounds of SafeArray.\n//\n// SafeArrays may have multiple dimensions. Meaning, it could be\n// multidimensional array.\n//\n// AKA: SafeArrayGetLBound in Windows API.\nfunc safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int64, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayGetLBound.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(dimension),\n\t\t\tuintptr(unsafe.Pointer(&lowerBound))))\n\treturn\n}\n\n// safeArrayGetUBound returns upper bounds of SafeArray.\n//\n// SafeArrays may have multiple dimensions. Meaning, it could be\n// multidimensional array.\n//\n// AKA: SafeArrayGetUBound in Windows API.\nfunc safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int64, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayGetUBound.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(dimension),\n\t\t\tuintptr(unsafe.Pointer(&upperBound))))\n\treturn\n}\n\n// safeArrayGetVartype returns data type of SafeArray.\n//\n// AKA: SafeArrayGetVartype in Windows API.\nfunc safeArrayGetVartype(safearray *SafeArray) (varType uint16, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayGetVartype.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&varType))))\n\treturn\n}\n\n// safeArrayLock locks SafeArray for reading to modify SafeArray.\n//\n// This must be called during some calls to ensure that another process does not\n// read or write to the SafeArray during editing.\n//\n// AKA: SafeArrayLock in Windows API.\nfunc safeArrayLock(safearray *SafeArray) (err error) {\n\terr = convertHresultToError(procSafeArrayLock.Call(uintptr(unsafe.Pointer(safearray))))\n\treturn\n}\n\n// safeArrayUnlock unlocks SafeArray for reading.\n//\n// AKA: SafeArrayUnlock in Windows API.\nfunc safeArrayUnlock(safearray *SafeArray) (err error) {\n\terr = convertHresultToError(procSafeArrayUnlock.Call(uintptr(unsafe.Pointer(safearray))))\n\treturn\n}\n\n// safeArrayPutElement stores the data element at the specified location in the\n// array.\n//\n// AKA: SafeArrayPutElement in Windows API.\nfunc safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) (err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayPutElement.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&index)),\n\t\t\tuintptr(unsafe.Pointer(element))))\n\treturn\n}\n\n// safeArrayGetRecordInfo accesses IRecordInfo info for custom types.\n//\n// AKA: SafeArrayGetRecordInfo in Windows API.\n//\n// XXX: Must implement IRecordInfo interface for this to return.\nfunc safeArrayGetRecordInfo(safearray *SafeArray) (recordInfo interface{}, err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArrayGetRecordInfo.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&recordInfo))))\n\treturn\n}\n\n// safeArraySetRecordInfo mutates IRecordInfo info for custom types.\n//\n// AKA: SafeArraySetRecordInfo in Windows API.\n//\n// XXX: Must implement IRecordInfo interface for this to return.\nfunc safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) (err error) {\n\terr = convertHresultToError(\n\t\tprocSafeArraySetRecordInfo.Call(\n\t\t\tuintptr(unsafe.Pointer(safearray)),\n\t\t\tuintptr(unsafe.Pointer(&recordInfo))))\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/safearrayconversion.go",
    "content": "// Helper for converting SafeArray to array of objects.\n\npackage ole\n\nimport (\n\t\"unsafe\"\n)\n\ntype SafeArrayConversion struct {\n\tArray *SafeArray\n}\n\nfunc (sac *SafeArrayConversion) ToStringArray() (strings []string) {\n\ttotalElements, _ := sac.TotalElements(0)\n\tstrings = make([]string, totalElements)\n\n\tfor i := int64(0); i < totalElements; i++ {\n\t\tstrings[int32(i)], _ = safeArrayGetElementString(sac.Array, i)\n\t}\n\n\treturn\n}\n\nfunc (sac *SafeArrayConversion) ToByteArray() (bytes []byte) {\n\ttotalElements, _ := sac.TotalElements(0)\n\tbytes = make([]byte, totalElements)\n\n\tfor i := int64(0); i < totalElements; i++ {\n\t\tsafeArrayGetElement(sac.Array, i, unsafe.Pointer(&bytes[int32(i)]))\n\t}\n\n\treturn\n}\n\nfunc (sac *SafeArrayConversion) ToValueArray() (values []interface{}) {\n\ttotalElements, _ := sac.TotalElements(0)\n\tvalues = make([]interface{}, totalElements)\n\tvt, _ := safeArrayGetVartype(sac.Array)\n\n\tfor i := 0; i < int(totalElements); i++ {\n\t\tswitch VT(vt) {\n\t\tcase VT_BOOL:\n\t\t\tvar v bool\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_I1:\n\t\t\tvar v int8\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_I2:\n\t\t\tvar v int16\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_I4:\n\t\t\tvar v int32\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_I8:\n\t\t\tvar v int64\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_UI1:\n\t\t\tvar v uint8\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_UI2:\n\t\t\tvar v uint16\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_UI4:\n\t\t\tvar v uint32\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_UI8:\n\t\t\tvar v uint64\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_R4:\n\t\t\tvar v float32\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_R8:\n\t\t\tvar v float64\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_BSTR:\n\t\t\tvar v string\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v\n\t\tcase VT_VARIANT:\n\t\t\tvar v VARIANT\n\t\t\tsafeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v))\n\t\t\tvalues[i] = v.Value()\n\t\tdefault:\n\t\t\t// TODO\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc (sac *SafeArrayConversion) GetType() (varType uint16, err error) {\n\treturn safeArrayGetVartype(sac.Array)\n}\n\nfunc (sac *SafeArrayConversion) GetDimensions() (dimensions *uint32, err error) {\n\treturn safeArrayGetDim(sac.Array)\n}\n\nfunc (sac *SafeArrayConversion) GetSize() (length *uint32, err error) {\n\treturn safeArrayGetElementSize(sac.Array)\n}\n\nfunc (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int64, err error) {\n\tif index < 1 {\n\t\tindex = 1\n\t}\n\n\t// Get array bounds\n\tvar LowerBounds int64\n\tvar UpperBounds int64\n\n\tLowerBounds, err = safeArrayGetLBound(sac.Array, index)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tUpperBounds, err = safeArrayGetUBound(sac.Array, index)\n\tif err != nil {\n\t\treturn\n\t}\n\n\ttotalElements = UpperBounds - LowerBounds + 1\n\treturn\n}\n\n// Release Safe Array memory\nfunc (sac *SafeArrayConversion) Release() {\n\tsafeArrayDestroy(sac.Array)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/safearrayslices.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"unsafe\"\n)\n\nfunc safeArrayFromByteSlice(slice []byte) *SafeArray {\n\tarray, _ := safeArrayCreateVector(VT_UI1, 0, uint32(len(slice)))\n\n\tif array == nil {\n\t\tpanic(\"Could not convert []byte to SAFEARRAY\")\n\t}\n\n\tfor i, v := range slice {\n\t\tsafeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(&v)))\n\t}\n\treturn array\n}\n\nfunc safeArrayFromStringSlice(slice []string) *SafeArray {\n\tarray, _ := safeArrayCreateVector(VT_BSTR, 0, uint32(len(slice)))\n\n\tif array == nil {\n\t\tpanic(\"Could not convert []string to SAFEARRAY\")\n\t}\n\t// SysAllocStringLen(s)\n\tfor i, v := range slice {\n\t\tsafeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(SysAllocStringLen(v))))\n\t}\n\treturn array\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/utility.go",
    "content": "package ole\n\nimport (\n\t\"unicode/utf16\"\n\t\"unsafe\"\n)\n\n// ClassIDFrom retrieves class ID whether given is program ID or application string.\n//\n// Helper that provides check against both Class ID from Program ID and Class ID from string. It is\n// faster, if you know which you are using, to use the individual functions, but this will check\n// against available functions for you.\nfunc ClassIDFrom(programID string) (classID *GUID, err error) {\n\tclassID, err = CLSIDFromProgID(programID)\n\tif err != nil {\n\t\tclassID, err = CLSIDFromString(programID)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\n// BytePtrToString converts byte pointer to a Go string.\nfunc BytePtrToString(p *byte) string {\n\ta := (*[10000]uint8)(unsafe.Pointer(p))\n\ti := 0\n\tfor a[i] != 0 {\n\t\ti++\n\t}\n\treturn string(a[:i])\n}\n\n// UTF16PtrToString is alias for LpOleStrToString.\n//\n// Kept for compatibility reasons.\nfunc UTF16PtrToString(p *uint16) string {\n\treturn LpOleStrToString(p)\n}\n\n// LpOleStrToString converts COM Unicode to Go string.\nfunc LpOleStrToString(p *uint16) string {\n\tif p == nil {\n\t\treturn \"\"\n\t}\n\n\tlength := lpOleStrLen(p)\n\ta := make([]uint16, length)\n\n\tptr := unsafe.Pointer(p)\n\n\tfor i := 0; i < int(length); i++ {\n\t\ta[i] = *(*uint16)(ptr)\n\t\tptr = unsafe.Pointer(uintptr(ptr) + 2)\n\t}\n\n\treturn string(utf16.Decode(a))\n}\n\n// BstrToString converts COM binary string to Go string.\nfunc BstrToString(p *uint16) string {\n\tif p == nil {\n\t\treturn \"\"\n\t}\n\tlength := SysStringLen((*int16)(unsafe.Pointer(p)))\n\ta := make([]uint16, length)\n\n\tptr := unsafe.Pointer(p)\n\n\tfor i := 0; i < int(length); i++ {\n\t\ta[i] = *(*uint16)(ptr)\n\t\tptr = unsafe.Pointer(uintptr(ptr) + 2)\n\t}\n\treturn string(utf16.Decode(a))\n}\n\n// lpOleStrLen returns the length of Unicode string.\nfunc lpOleStrLen(p *uint16) (length int64) {\n\tif p == nil {\n\t\treturn 0\n\t}\n\n\tptr := unsafe.Pointer(p)\n\n\tfor i := 0; ; i++ {\n\t\tif 0 == *(*uint16)(ptr) {\n\t\t\tlength = int64(i)\n\t\t\tbreak\n\t\t}\n\t\tptr = unsafe.Pointer(uintptr(ptr) + 2)\n\t}\n\treturn\n}\n\n// convertHresultToError converts syscall to error, if call is unsuccessful.\nfunc convertHresultToError(hr uintptr, r2 uintptr, ignore error) (err error) {\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/variables.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"syscall\"\n)\n\nvar (\n\tmodcombase     = syscall.NewLazyDLL(\"combase.dll\")\n\tmodkernel32, _ = syscall.LoadDLL(\"kernel32.dll\")\n\tmodole32, _    = syscall.LoadDLL(\"ole32.dll\")\n\tmodoleaut32, _ = syscall.LoadDLL(\"oleaut32.dll\")\n\tmodmsvcrt, _   = syscall.LoadDLL(\"msvcrt.dll\")\n\tmoduser32, _   = syscall.LoadDLL(\"user32.dll\")\n)\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/variant.go",
    "content": "package ole\n\nimport \"unsafe\"\n\n// NewVariant returns new variant based on type and value.\nfunc NewVariant(vt VT, val int64) VARIANT {\n\treturn VARIANT{VT: vt, Val: val}\n}\n\n// ToIUnknown converts Variant to Unknown object.\nfunc (v *VARIANT) ToIUnknown() *IUnknown {\n\tif v.VT != VT_UNKNOWN {\n\t\treturn nil\n\t}\n\treturn (*IUnknown)(unsafe.Pointer(uintptr(v.Val)))\n}\n\n// ToIDispatch converts variant to dispatch object.\nfunc (v *VARIANT) ToIDispatch() *IDispatch {\n\tif v.VT != VT_DISPATCH {\n\t\treturn nil\n\t}\n\treturn (*IDispatch)(unsafe.Pointer(uintptr(v.Val)))\n}\n\n// ToArray converts variant to SafeArray helper.\nfunc (v *VARIANT) ToArray() *SafeArrayConversion {\n\tif v.VT != VT_SAFEARRAY {\n\t\tif v.VT&VT_ARRAY == 0 {\n\t\t\treturn nil\n\t\t}\n\t}\n\tvar safeArray *SafeArray = (*SafeArray)(unsafe.Pointer(uintptr(v.Val)))\n\treturn &SafeArrayConversion{safeArray}\n}\n\n// ToString converts variant to Go string.\nfunc (v *VARIANT) ToString() string {\n\tif v.VT != VT_BSTR {\n\t\treturn \"\"\n\t}\n\treturn BstrToString(*(**uint16)(unsafe.Pointer(&v.Val)))\n}\n\n// Clear the memory of variant object.\nfunc (v *VARIANT) Clear() error {\n\treturn VariantClear(v)\n}\n\n// Value returns variant value based on its type.\n//\n// Currently supported types: 2- and 4-byte integers, strings, bools.\n// Note that 64-bit integers, datetimes, and other types are stored as strings\n// and will be returned as strings.\n//\n// Needs to be further converted, because this returns an interface{}.\nfunc (v *VARIANT) Value() interface{} {\n\tswitch v.VT {\n\tcase VT_I1:\n\t\treturn int8(v.Val)\n\tcase VT_UI1:\n\t\treturn uint8(v.Val)\n\tcase VT_I2:\n\t\treturn int16(v.Val)\n\tcase VT_UI2:\n\t\treturn uint16(v.Val)\n\tcase VT_I4:\n\t\treturn int32(v.Val)\n\tcase VT_UI4:\n\t\treturn uint32(v.Val)\n\tcase VT_I8:\n\t\treturn int64(v.Val)\n\tcase VT_UI8:\n\t\treturn uint64(v.Val)\n\tcase VT_INT:\n\t\treturn int(v.Val)\n\tcase VT_UINT:\n\t\treturn uint(v.Val)\n\tcase VT_INT_PTR:\n\t\treturn uintptr(v.Val) // TODO\n\tcase VT_UINT_PTR:\n\t\treturn uintptr(v.Val)\n\tcase VT_R4:\n\t\treturn *(*float32)(unsafe.Pointer(&v.Val))\n\tcase VT_R8:\n\t\treturn *(*float64)(unsafe.Pointer(&v.Val))\n\tcase VT_BSTR:\n\t\treturn v.ToString()\n\tcase VT_DATE:\n\t\t// VT_DATE type will either return float64 or time.Time.\n\t\td := float64(v.Val)\n\t\tdate, err := GetVariantDate(d)\n\t\tif err != nil {\n\t\t\treturn d\n\t\t}\n\t\treturn date\n\tcase VT_UNKNOWN:\n\t\treturn v.ToIUnknown()\n\tcase VT_DISPATCH:\n\t\treturn v.ToIDispatch()\n\tcase VT_BOOL:\n\t\treturn v.Val != 0\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/variant_386.go",
    "content": "// +build 386\n\npackage ole\n\ntype VARIANT struct {\n\tVT         VT     //  2\n\twReserved1 uint16 //  4\n\twReserved2 uint16 //  6\n\twReserved3 uint16 //  8\n\tVal        int64  // 16\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/variant_amd64.go",
    "content": "// +build amd64\n\npackage ole\n\ntype VARIANT struct {\n\tVT         VT      //  2\n\twReserved1 uint16  //  4\n\twReserved2 uint16  //  6\n\twReserved3 uint16  //  8\n\tVal        int64   // 16\n\t_          [8]byte // 24\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/variant_s390x.go",
    "content": "// +build s390x\n\npackage ole\n\ntype VARIANT struct {\n\tVT         VT      //  2\n\twReserved1 uint16  //  4\n\twReserved2 uint16  //  6\n\twReserved3 uint16  //  8\n\tVal        int64   // 16\n\t_          [8]byte // 24\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/vt_string.go",
    "content": "// generated by stringer -output vt_string.go -type VT; DO NOT EDIT\n\npackage ole\n\nimport \"fmt\"\n\nconst (\n\t_VT_name_0 = \"VT_EMPTYVT_NULLVT_I2VT_I4VT_R4VT_R8VT_CYVT_DATEVT_BSTRVT_DISPATCHVT_ERRORVT_BOOLVT_VARIANTVT_UNKNOWNVT_DECIMAL\"\n\t_VT_name_1 = \"VT_I1VT_UI1VT_UI2VT_UI4VT_I8VT_UI8VT_INTVT_UINTVT_VOIDVT_HRESULTVT_PTRVT_SAFEARRAYVT_CARRAYVT_USERDEFINEDVT_LPSTRVT_LPWSTR\"\n\t_VT_name_2 = \"VT_RECORDVT_INT_PTRVT_UINT_PTR\"\n\t_VT_name_3 = \"VT_FILETIMEVT_BLOBVT_STREAMVT_STORAGEVT_STREAMED_OBJECTVT_STORED_OBJECTVT_BLOB_OBJECTVT_CFVT_CLSID\"\n\t_VT_name_4 = \"VT_BSTR_BLOBVT_VECTOR\"\n\t_VT_name_5 = \"VT_ARRAY\"\n\t_VT_name_6 = \"VT_BYREF\"\n\t_VT_name_7 = \"VT_RESERVED\"\n\t_VT_name_8 = \"VT_ILLEGAL\"\n)\n\nvar (\n\t_VT_index_0 = [...]uint8{0, 8, 15, 20, 25, 30, 35, 40, 47, 54, 65, 73, 80, 90, 100, 110}\n\t_VT_index_1 = [...]uint8{0, 5, 11, 17, 23, 28, 34, 40, 47, 54, 64, 70, 82, 91, 105, 113, 122}\n\t_VT_index_2 = [...]uint8{0, 9, 19, 30}\n\t_VT_index_3 = [...]uint8{0, 11, 18, 27, 37, 55, 71, 85, 90, 98}\n\t_VT_index_4 = [...]uint8{0, 12, 21}\n\t_VT_index_5 = [...]uint8{0, 8}\n\t_VT_index_6 = [...]uint8{0, 8}\n\t_VT_index_7 = [...]uint8{0, 11}\n\t_VT_index_8 = [...]uint8{0, 10}\n)\n\nfunc (i VT) String() string {\n\tswitch {\n\tcase 0 <= i && i <= 14:\n\t\treturn _VT_name_0[_VT_index_0[i]:_VT_index_0[i+1]]\n\tcase 16 <= i && i <= 31:\n\t\ti -= 16\n\t\treturn _VT_name_1[_VT_index_1[i]:_VT_index_1[i+1]]\n\tcase 36 <= i && i <= 38:\n\t\ti -= 36\n\t\treturn _VT_name_2[_VT_index_2[i]:_VT_index_2[i+1]]\n\tcase 64 <= i && i <= 72:\n\t\ti -= 64\n\t\treturn _VT_name_3[_VT_index_3[i]:_VT_index_3[i+1]]\n\tcase 4095 <= i && i <= 4096:\n\t\ti -= 4095\n\t\treturn _VT_name_4[_VT_index_4[i]:_VT_index_4[i+1]]\n\tcase i == 8192:\n\t\treturn _VT_name_5\n\tcase i == 16384:\n\t\treturn _VT_name_6\n\tcase i == 32768:\n\t\treturn _VT_name_7\n\tcase i == 65535:\n\t\treturn _VT_name_8\n\tdefault:\n\t\treturn fmt.Sprintf(\"VT(%d)\", i)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/winrt.go",
    "content": "// +build windows\n\npackage ole\n\nimport (\n\t\"reflect\"\n\t\"syscall\"\n\t\"unicode/utf8\"\n\t\"unsafe\"\n)\n\nvar (\n\tprocRoInitialize              = modcombase.NewProc(\"RoInitialize\")\n\tprocRoActivateInstance        = modcombase.NewProc(\"RoActivateInstance\")\n\tprocRoGetActivationFactory    = modcombase.NewProc(\"RoGetActivationFactory\")\n\tprocWindowsCreateString       = modcombase.NewProc(\"WindowsCreateString\")\n\tprocWindowsDeleteString       = modcombase.NewProc(\"WindowsDeleteString\")\n\tprocWindowsGetStringRawBuffer = modcombase.NewProc(\"WindowsGetStringRawBuffer\")\n)\n\nfunc RoInitialize(thread_type uint32) (err error) {\n\thr, _, _ := procRoInitialize.Call(uintptr(thread_type))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc RoActivateInstance(clsid string) (ins *IInspectable, err error) {\n\thClsid, err := NewHString(clsid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer DeleteHString(hClsid)\n\n\thr, _, _ := procRoActivateInstance.Call(\n\t\tuintptr(unsafe.Pointer(hClsid)),\n\t\tuintptr(unsafe.Pointer(&ins)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\nfunc RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) {\n\thClsid, err := NewHString(clsid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer DeleteHString(hClsid)\n\n\thr, _, _ := procRoGetActivationFactory.Call(\n\t\tuintptr(unsafe.Pointer(hClsid)),\n\t\tuintptr(unsafe.Pointer(iid)),\n\t\tuintptr(unsafe.Pointer(&ins)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// HString is handle string for pointers.\ntype HString uintptr\n\n// NewHString returns a new HString for Go string.\nfunc NewHString(s string) (hstring HString, err error) {\n\tu16 := syscall.StringToUTF16Ptr(s)\n\tlen := uint32(utf8.RuneCountInString(s))\n\thr, _, _ := procWindowsCreateString.Call(\n\t\tuintptr(unsafe.Pointer(u16)),\n\t\tuintptr(len),\n\t\tuintptr(unsafe.Pointer(&hstring)))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// DeleteHString deletes HString.\nfunc DeleteHString(hstring HString) (err error) {\n\thr, _, _ := procWindowsDeleteString.Call(uintptr(hstring))\n\tif hr != 0 {\n\t\terr = NewError(hr)\n\t}\n\treturn\n}\n\n// String returns Go string value of HString.\nfunc (h HString) String() string {\n\tvar u16buf uintptr\n\tvar u16len uint32\n\tu16buf, _, _ = procWindowsGetStringRawBuffer.Call(\n\t\tuintptr(h),\n\t\tuintptr(unsafe.Pointer(&u16len)))\n\n\tu16hdr := reflect.SliceHeader{Data: u16buf, Len: int(u16len), Cap: int(u16len)}\n\tu16 := *(*[]uint16)(unsafe.Pointer(&u16hdr))\n\treturn syscall.UTF16ToString(u16)\n}\n"
  },
  {
    "path": "vendor/github.com/go-ole/go-ole/winrt_doc.go",
    "content": "// +build !windows\n\npackage ole\n\n// RoInitialize\nfunc RoInitialize(thread_type uint32) (err error) {\n\treturn NewError(E_NOTIMPL)\n}\n\n// RoActivateInstance\nfunc RoActivateInstance(clsid string) (ins *IInspectable, err error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// RoGetActivationFactory\nfunc RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) {\n\treturn nil, NewError(E_NOTIMPL)\n}\n\n// HString is handle string for pointers.\ntype HString uintptr\n\n// NewHString returns a new HString for Go string.\nfunc NewHString(s string) (hstring HString, err error) {\n\treturn HString(uintptr(0)), NewError(E_NOTIMPL)\n}\n\n// DeleteHString deletes HString.\nfunc DeleteHString(hstring HString) (err error) {\n\treturn NewError(E_NOTIMPL)\n}\n\n// String returns Go string value of HString.\nfunc (h HString) String() string {\n\treturn \"\"\n}\n"
  },
  {
    "path": "vendor/github.com/go-stack/stack/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Chris Hines\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": "vendor/github.com/go-stack/stack/README.md",
    "content": "[![GoDoc](https://godoc.org/github.com/go-stack/stack?status.svg)](https://godoc.org/github.com/go-stack/stack)\n[![Go Report Card](https://goreportcard.com/badge/go-stack/stack)](https://goreportcard.com/report/go-stack/stack)\n[![TravisCI](https://travis-ci.org/go-stack/stack.svg?branch=master)](https://travis-ci.org/go-stack/stack)\n[![Coverage Status](https://coveralls.io/repos/github/go-stack/stack/badge.svg?branch=master)](https://coveralls.io/github/go-stack/stack?branch=master)\n\n# stack\n\nPackage stack implements utilities to capture, manipulate, and format call\nstacks. It provides a simpler API than package runtime.\n\nThe implementation takes care of the minutia and special cases of interpreting\nthe program counter (pc) values returned by runtime.Callers.\n\n## Versioning\n\nPackage stack publishes releases via [semver](http://semver.org/) compatible Git\ntags prefixed with a single 'v'. The master branch always contains the latest\nrelease. The develop branch contains unreleased commits.\n\n## Formatting\n\nPackage stack's types implement fmt.Formatter, which provides a simple and\nflexible way to declaratively configure formatting when used with logging or\nerror tracking packages.\n\n```go\nfunc DoTheThing() {\n    c := stack.Caller(0)\n    log.Print(c)          // \"source.go:10\"\n    log.Printf(\"%+v\", c)  // \"pkg/path/source.go:10\"\n    log.Printf(\"%n\", c)   // \"DoTheThing\"\n\n    s := stack.Trace().TrimRuntime()\n    log.Print(s)          // \"[source.go:15 caller.go:42 main.go:14]\"\n}\n```\n\nSee the docs for all of the supported formatting options.\n"
  },
  {
    "path": "vendor/github.com/go-stack/stack/stack.go",
    "content": "// Package stack implements utilities to capture, manipulate, and format call\n// stacks. It provides a simpler API than package runtime.\n//\n// The implementation takes care of the minutia and special cases of\n// interpreting the program counter (pc) values returned by runtime.Callers.\n//\n// Package stack's types implement fmt.Formatter, which provides a simple and\n// flexible way to declaratively configure formatting when used with logging\n// or error tracking packages.\npackage stack\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// Call records a single function invocation from a goroutine stack.\ntype Call struct {\n\tfn *runtime.Func\n\tpc uintptr\n}\n\n// Caller returns a Call from the stack of the current goroutine. The argument\n// skip is the number of stack frames to ascend, with 0 identifying the\n// calling function.\nfunc Caller(skip int) Call {\n\tvar pcs [2]uintptr\n\tn := runtime.Callers(skip+1, pcs[:])\n\n\tvar c Call\n\n\tif n < 2 {\n\t\treturn c\n\t}\n\n\tc.pc = pcs[1]\n\tif runtime.FuncForPC(pcs[0]).Name() != \"runtime.sigpanic\" {\n\t\tc.pc--\n\t}\n\tc.fn = runtime.FuncForPC(c.pc)\n\treturn c\n}\n\n// String implements fmt.Stinger. It is equivalent to fmt.Sprintf(\"%v\", c).\nfunc (c Call) String() string {\n\treturn fmt.Sprint(c)\n}\n\n// MarshalText implements encoding.TextMarshaler. It formats the Call the same\n// as fmt.Sprintf(\"%v\", c).\nfunc (c Call) MarshalText() ([]byte, error) {\n\tif c.fn == nil {\n\t\treturn nil, ErrNoFunc\n\t}\n\tbuf := bytes.Buffer{}\n\tfmt.Fprint(&buf, c)\n\treturn buf.Bytes(), nil\n}\n\n// ErrNoFunc means that the Call has a nil *runtime.Func. The most likely\n// cause is a Call with the zero value.\nvar ErrNoFunc = errors.New(\"no call stack information\")\n\n// Format implements fmt.Formatter with support for the following verbs.\n//\n//    %s    source file\n//    %d    line number\n//    %n    function name\n//    %v    equivalent to %s:%d\n//\n// It accepts the '+' and '#' flags for most of the verbs as follows.\n//\n//    %+s   path of source file relative to the compile time GOPATH\n//    %#s   full path of source file\n//    %+n   import path qualified function name\n//    %+v   equivalent to %+s:%d\n//    %#v   equivalent to %#s:%d\nfunc (c Call) Format(s fmt.State, verb rune) {\n\tif c.fn == nil {\n\t\tfmt.Fprintf(s, \"%%!%c(NOFUNC)\", verb)\n\t\treturn\n\t}\n\n\tswitch verb {\n\tcase 's', 'v':\n\t\tfile, line := c.fn.FileLine(c.pc)\n\t\tswitch {\n\t\tcase s.Flag('#'):\n\t\t\t// done\n\t\tcase s.Flag('+'):\n\t\t\tfile = file[pkgIndex(file, c.fn.Name()):]\n\t\tdefault:\n\t\t\tconst sep = \"/\"\n\t\t\tif i := strings.LastIndex(file, sep); i != -1 {\n\t\t\t\tfile = file[i+len(sep):]\n\t\t\t}\n\t\t}\n\t\tio.WriteString(s, file)\n\t\tif verb == 'v' {\n\t\t\tbuf := [7]byte{':'}\n\t\t\ts.Write(strconv.AppendInt(buf[:1], int64(line), 10))\n\t\t}\n\n\tcase 'd':\n\t\t_, line := c.fn.FileLine(c.pc)\n\t\tbuf := [6]byte{}\n\t\ts.Write(strconv.AppendInt(buf[:0], int64(line), 10))\n\n\tcase 'n':\n\t\tname := c.fn.Name()\n\t\tif !s.Flag('+') {\n\t\t\tconst pathSep = \"/\"\n\t\t\tif i := strings.LastIndex(name, pathSep); i != -1 {\n\t\t\t\tname = name[i+len(pathSep):]\n\t\t\t}\n\t\t\tconst pkgSep = \".\"\n\t\t\tif i := strings.Index(name, pkgSep); i != -1 {\n\t\t\t\tname = name[i+len(pkgSep):]\n\t\t\t}\n\t\t}\n\t\tio.WriteString(s, name)\n\t}\n}\n\n// PC returns the program counter for this call frame; multiple frames may\n// have the same PC value.\nfunc (c Call) PC() uintptr {\n\treturn c.pc\n}\n\n// name returns the import path qualified name of the function containing the\n// call.\nfunc (c Call) name() string {\n\tif c.fn == nil {\n\t\treturn \"???\"\n\t}\n\treturn c.fn.Name()\n}\n\nfunc (c Call) file() string {\n\tif c.fn == nil {\n\t\treturn \"???\"\n\t}\n\tfile, _ := c.fn.FileLine(c.pc)\n\treturn file\n}\n\nfunc (c Call) line() int {\n\tif c.fn == nil {\n\t\treturn 0\n\t}\n\t_, line := c.fn.FileLine(c.pc)\n\treturn line\n}\n\n// CallStack records a sequence of function invocations from a goroutine\n// stack.\ntype CallStack []Call\n\n// String implements fmt.Stinger. It is equivalent to fmt.Sprintf(\"%v\", cs).\nfunc (cs CallStack) String() string {\n\treturn fmt.Sprint(cs)\n}\n\nvar (\n\topenBracketBytes  = []byte(\"[\")\n\tcloseBracketBytes = []byte(\"]\")\n\tspaceBytes        = []byte(\" \")\n)\n\n// MarshalText implements encoding.TextMarshaler. It formats the CallStack the\n// same as fmt.Sprintf(\"%v\", cs).\nfunc (cs CallStack) MarshalText() ([]byte, error) {\n\tbuf := bytes.Buffer{}\n\tbuf.Write(openBracketBytes)\n\tfor i, pc := range cs {\n\t\tif pc.fn == nil {\n\t\t\treturn nil, ErrNoFunc\n\t\t}\n\t\tif i > 0 {\n\t\t\tbuf.Write(spaceBytes)\n\t\t}\n\t\tfmt.Fprint(&buf, pc)\n\t}\n\tbuf.Write(closeBracketBytes)\n\treturn buf.Bytes(), nil\n}\n\n// Format implements fmt.Formatter by printing the CallStack as square brackets\n// ([, ]) surrounding a space separated list of Calls each formatted with the\n// supplied verb and options.\nfunc (cs CallStack) Format(s fmt.State, verb rune) {\n\ts.Write(openBracketBytes)\n\tfor i, pc := range cs {\n\t\tif i > 0 {\n\t\t\ts.Write(spaceBytes)\n\t\t}\n\t\tpc.Format(s, verb)\n\t}\n\ts.Write(closeBracketBytes)\n}\n\n// Trace returns a CallStack for the current goroutine with element 0\n// identifying the calling function.\nfunc Trace() CallStack {\n\tvar pcs [512]uintptr\n\tn := runtime.Callers(2, pcs[:])\n\tcs := make([]Call, n)\n\n\tfor i, pc := range pcs[:n] {\n\t\tpcFix := pc\n\t\tif i > 0 && cs[i-1].fn.Name() != \"runtime.sigpanic\" {\n\t\t\tpcFix--\n\t\t}\n\t\tcs[i] = Call{\n\t\t\tfn: runtime.FuncForPC(pcFix),\n\t\t\tpc: pcFix,\n\t\t}\n\t}\n\n\treturn cs\n}\n\n// TrimBelow returns a slice of the CallStack with all entries below c\n// removed.\nfunc (cs CallStack) TrimBelow(c Call) CallStack {\n\tfor len(cs) > 0 && cs[0].pc != c.pc {\n\t\tcs = cs[1:]\n\t}\n\treturn cs\n}\n\n// TrimAbove returns a slice of the CallStack with all entries above c\n// removed.\nfunc (cs CallStack) TrimAbove(c Call) CallStack {\n\tfor len(cs) > 0 && cs[len(cs)-1].pc != c.pc {\n\t\tcs = cs[:len(cs)-1]\n\t}\n\treturn cs\n}\n\n// pkgIndex returns the index that results in file[index:] being the path of\n// file relative to the compile time GOPATH, and file[:index] being the\n// $GOPATH/src/ portion of file. funcName must be the name of a function in\n// file as returned by runtime.Func.Name.\nfunc pkgIndex(file, funcName string) int {\n\t// As of Go 1.6.2 there is no direct way to know the compile time GOPATH\n\t// at runtime, but we can infer the number of path segments in the GOPATH.\n\t// We note that runtime.Func.Name() returns the function name qualified by\n\t// the import path, which does not include the GOPATH. Thus we can trim\n\t// segments from the beginning of the file path until the number of path\n\t// separators remaining is one more than the number of path separators in\n\t// the function name. For example, given:\n\t//\n\t//    GOPATH     /home/user\n\t//    file       /home/user/src/pkg/sub/file.go\n\t//    fn.Name()  pkg/sub.Type.Method\n\t//\n\t// We want to produce:\n\t//\n\t//    file[:idx] == /home/user/src/\n\t//    file[idx:] == pkg/sub/file.go\n\t//\n\t// From this we can easily see that fn.Name() has one less path separator\n\t// than our desired result for file[idx:]. We count separators from the\n\t// end of the file path until it finds two more than in the function name\n\t// and then move one character forward to preserve the initial path\n\t// segment without a leading separator.\n\tconst sep = \"/\"\n\ti := len(file)\n\tfor n := strings.Count(funcName, sep) + 2; n > 0; n-- {\n\t\ti = strings.LastIndex(file[:i], sep)\n\t\tif i == -1 {\n\t\t\ti = -len(sep)\n\t\t\tbreak\n\t\t}\n\t}\n\t// get back to 0 or trim the leading separator\n\treturn i + len(sep)\n}\n\nvar runtimePath string\n\nfunc init() {\n\tvar pcs [1]uintptr\n\truntime.Callers(0, pcs[:])\n\tfn := runtime.FuncForPC(pcs[0])\n\tfile, _ := fn.FileLine(pcs[0])\n\n\tidx := pkgIndex(file, fn.Name())\n\n\truntimePath = file[:idx]\n\tif runtime.GOOS == \"windows\" {\n\t\truntimePath = strings.ToLower(runtimePath)\n\t}\n}\n\nfunc inGoroot(c Call) bool {\n\tfile := c.file()\n\tif len(file) == 0 || file[0] == '?' {\n\t\treturn true\n\t}\n\tif runtime.GOOS == \"windows\" {\n\t\tfile = strings.ToLower(file)\n\t}\n\treturn strings.HasPrefix(file, runtimePath) || strings.HasSuffix(file, \"/_testmain.go\")\n}\n\n// TrimRuntime returns a slice of the CallStack with the topmost entries from\n// the go runtime removed. It considers any calls originating from unknown\n// files, files under GOROOT, or _testmain.go as part of the runtime.\nfunc (cs CallStack) TrimRuntime() CallStack {\n\tfor len(cs) > 0 && inGoroot(cs[len(cs)-1]) {\n\t\tcs = cs[:len(cs)-1]\n\t}\n\treturn cs\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/LICENSE",
    "content": "Go support for Protocol Buffers - Google's data interchange format\n\nCopyright 2010 The Go Authors.  All rights reserved.\nhttps://github.com/golang/protobuf\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/Makefile",
    "content": "# Go support for Protocol Buffers - Google's data interchange format\n#\n# Copyright 2010 The Go Authors.  All rights reserved.\n# https://github.com/golang/protobuf\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# 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\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\ninstall:\n\tgo install\n\ntest: install generate-test-pbs\n\tgo test\n\n\ngenerate-test-pbs:\n\tmake install\n\tmake -C testdata\n\tprotoc --go_out=Mtestdata/test.proto=github.com/golang/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. proto3_proto/proto3.proto\n\tmake\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/clone.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2011 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Protocol buffer deep copy and merge.\n// TODO: RawMessage.\n\npackage proto\n\nimport (\n\t\"log\"\n\t\"reflect\"\n\t\"strings\"\n)\n\n// Clone returns a deep copy of a protocol buffer.\nfunc Clone(pb Message) Message {\n\tin := reflect.ValueOf(pb)\n\tif in.IsNil() {\n\t\treturn pb\n\t}\n\n\tout := reflect.New(in.Type().Elem())\n\t// out is empty so a merge is a deep copy.\n\tmergeStruct(out.Elem(), in.Elem())\n\treturn out.Interface().(Message)\n}\n\n// Merge merges src into dst.\n// Required and optional fields that are set in src will be set to that value in dst.\n// Elements of repeated fields will be appended.\n// Merge panics if src and dst are not the same type, or if dst is nil.\nfunc Merge(dst, src Message) {\n\tin := reflect.ValueOf(src)\n\tout := reflect.ValueOf(dst)\n\tif out.IsNil() {\n\t\tpanic(\"proto: nil destination\")\n\t}\n\tif in.Type() != out.Type() {\n\t\t// Explicit test prior to mergeStruct so that mistyped nils will fail\n\t\tpanic(\"proto: type mismatch\")\n\t}\n\tif in.IsNil() {\n\t\t// Merging nil into non-nil is a quiet no-op\n\t\treturn\n\t}\n\tmergeStruct(out.Elem(), in.Elem())\n}\n\nfunc mergeStruct(out, in reflect.Value) {\n\tsprop := GetProperties(in.Type())\n\tfor i := 0; i < in.NumField(); i++ {\n\t\tf := in.Type().Field(i)\n\t\tif strings.HasPrefix(f.Name, \"XXX_\") {\n\t\t\tcontinue\n\t\t}\n\t\tmergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i])\n\t}\n\n\tif emIn, ok := extendable(in.Addr().Interface()); ok {\n\t\temOut, _ := extendable(out.Addr().Interface())\n\t\tmIn, muIn := emIn.extensionsRead()\n\t\tif mIn != nil {\n\t\t\tmOut := emOut.extensionsWrite()\n\t\t\tmuIn.Lock()\n\t\t\tmergeExtension(mOut, mIn)\n\t\t\tmuIn.Unlock()\n\t\t}\n\t}\n\n\tuf := in.FieldByName(\"XXX_unrecognized\")\n\tif !uf.IsValid() {\n\t\treturn\n\t}\n\tuin := uf.Bytes()\n\tif len(uin) > 0 {\n\t\tout.FieldByName(\"XXX_unrecognized\").SetBytes(append([]byte(nil), uin...))\n\t}\n}\n\n// mergeAny performs a merge between two values of the same type.\n// viaPtr indicates whether the values were indirected through a pointer (implying proto2).\n// prop is set if this is a struct field (it may be nil).\nfunc mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) {\n\tif in.Type() == protoMessageType {\n\t\tif !in.IsNil() {\n\t\t\tif out.IsNil() {\n\t\t\t\tout.Set(reflect.ValueOf(Clone(in.Interface().(Message))))\n\t\t\t} else {\n\t\t\t\tMerge(out.Interface().(Message), in.Interface().(Message))\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\tswitch in.Kind() {\n\tcase reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64,\n\t\treflect.String, reflect.Uint32, reflect.Uint64:\n\t\tif !viaPtr && isProto3Zero(in) {\n\t\t\treturn\n\t\t}\n\t\tout.Set(in)\n\tcase reflect.Interface:\n\t\t// Probably a oneof field; copy non-nil values.\n\t\tif in.IsNil() {\n\t\t\treturn\n\t\t}\n\t\t// Allocate destination if it is not set, or set to a different type.\n\t\t// Otherwise we will merge as normal.\n\t\tif out.IsNil() || out.Elem().Type() != in.Elem().Type() {\n\t\t\tout.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T)\n\t\t}\n\t\tmergeAny(out.Elem(), in.Elem(), false, nil)\n\tcase reflect.Map:\n\t\tif in.Len() == 0 {\n\t\t\treturn\n\t\t}\n\t\tif out.IsNil() {\n\t\t\tout.Set(reflect.MakeMap(in.Type()))\n\t\t}\n\t\t// For maps with value types of *T or []byte we need to deep copy each value.\n\t\telemKind := in.Type().Elem().Kind()\n\t\tfor _, key := range in.MapKeys() {\n\t\t\tvar val reflect.Value\n\t\t\tswitch elemKind {\n\t\t\tcase reflect.Ptr:\n\t\t\t\tval = reflect.New(in.Type().Elem().Elem())\n\t\t\t\tmergeAny(val, in.MapIndex(key), false, nil)\n\t\t\tcase reflect.Slice:\n\t\t\t\tval = in.MapIndex(key)\n\t\t\t\tval = reflect.ValueOf(append([]byte{}, val.Bytes()...))\n\t\t\tdefault:\n\t\t\t\tval = in.MapIndex(key)\n\t\t\t}\n\t\t\tout.SetMapIndex(key, val)\n\t\t}\n\tcase reflect.Ptr:\n\t\tif in.IsNil() {\n\t\t\treturn\n\t\t}\n\t\tif out.IsNil() {\n\t\t\tout.Set(reflect.New(in.Elem().Type()))\n\t\t}\n\t\tmergeAny(out.Elem(), in.Elem(), true, nil)\n\tcase reflect.Slice:\n\t\tif in.IsNil() {\n\t\t\treturn\n\t\t}\n\t\tif in.Type().Elem().Kind() == reflect.Uint8 {\n\t\t\t// []byte is a scalar bytes field, not a repeated field.\n\n\t\t\t// Edge case: if this is in a proto3 message, a zero length\n\t\t\t// bytes field is considered the zero value, and should not\n\t\t\t// be merged.\n\t\t\tif prop != nil && prop.proto3 && in.Len() == 0 {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Make a deep copy.\n\t\t\t// Append to []byte{} instead of []byte(nil) so that we never end up\n\t\t\t// with a nil result.\n\t\t\tout.SetBytes(append([]byte{}, in.Bytes()...))\n\t\t\treturn\n\t\t}\n\t\tn := in.Len()\n\t\tif out.IsNil() {\n\t\t\tout.Set(reflect.MakeSlice(in.Type(), 0, n))\n\t\t}\n\t\tswitch in.Type().Elem().Kind() {\n\t\tcase reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64,\n\t\t\treflect.String, reflect.Uint32, reflect.Uint64:\n\t\t\tout.Set(reflect.AppendSlice(out, in))\n\t\tdefault:\n\t\t\tfor i := 0; i < n; i++ {\n\t\t\t\tx := reflect.Indirect(reflect.New(in.Type().Elem()))\n\t\t\t\tmergeAny(x, in.Index(i), false, nil)\n\t\t\t\tout.Set(reflect.Append(out, x))\n\t\t\t}\n\t\t}\n\tcase reflect.Struct:\n\t\tmergeStruct(out, in)\n\tdefault:\n\t\t// unknown type, so not a protocol buffer\n\t\tlog.Printf(\"proto: don't know how to copy %v\", in)\n\t}\n}\n\nfunc mergeExtension(out, in map[int32]Extension) {\n\tfor extNum, eIn := range in {\n\t\teOut := Extension{desc: eIn.desc}\n\t\tif eIn.value != nil {\n\t\t\tv := reflect.New(reflect.TypeOf(eIn.value)).Elem()\n\t\t\tmergeAny(v, reflect.ValueOf(eIn.value), false, nil)\n\t\t\teOut.value = v.Interface()\n\t\t}\n\t\tif eIn.enc != nil {\n\t\t\teOut.enc = make([]byte, len(eIn.enc))\n\t\t\tcopy(eOut.enc, eIn.enc)\n\t\t}\n\n\t\tout[extNum] = eOut\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/decode.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage proto\n\n/*\n * Routines for decoding protocol buffer data to construct in-memory representations.\n */\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"reflect\"\n)\n\n// errOverflow is returned when an integer is too large to be represented.\nvar errOverflow = errors.New(\"proto: integer overflow\")\n\n// ErrInternalBadWireType is returned by generated code when an incorrect\n// wire type is encountered. It does not get returned to user code.\nvar ErrInternalBadWireType = errors.New(\"proto: internal error: bad wiretype for oneof\")\n\n// The fundamental decoders that interpret bytes on the wire.\n// Those that take integer types all return uint64 and are\n// therefore of type valueDecoder.\n\n// DecodeVarint reads a varint-encoded integer from the slice.\n// It returns the integer and the number of bytes consumed, or\n// zero if there is not enough.\n// This is the format for the\n// int32, int64, uint32, uint64, bool, and enum\n// protocol buffer types.\nfunc DecodeVarint(buf []byte) (x uint64, n int) {\n\tfor shift := uint(0); shift < 64; shift += 7 {\n\t\tif n >= len(buf) {\n\t\t\treturn 0, 0\n\t\t}\n\t\tb := uint64(buf[n])\n\t\tn++\n\t\tx |= (b & 0x7F) << shift\n\t\tif (b & 0x80) == 0 {\n\t\t\treturn x, n\n\t\t}\n\t}\n\n\t// The number is too large to represent in a 64-bit value.\n\treturn 0, 0\n}\n\nfunc (p *Buffer) decodeVarintSlow() (x uint64, err error) {\n\ti := p.index\n\tl := len(p.buf)\n\n\tfor shift := uint(0); shift < 64; shift += 7 {\n\t\tif i >= l {\n\t\t\terr = io.ErrUnexpectedEOF\n\t\t\treturn\n\t\t}\n\t\tb := p.buf[i]\n\t\ti++\n\t\tx |= (uint64(b) & 0x7F) << shift\n\t\tif b < 0x80 {\n\t\t\tp.index = i\n\t\t\treturn\n\t\t}\n\t}\n\n\t// The number is too large to represent in a 64-bit value.\n\terr = errOverflow\n\treturn\n}\n\n// DecodeVarint reads a varint-encoded integer from the Buffer.\n// This is the format for the\n// int32, int64, uint32, uint64, bool, and enum\n// protocol buffer types.\nfunc (p *Buffer) DecodeVarint() (x uint64, err error) {\n\ti := p.index\n\tbuf := p.buf\n\n\tif i >= len(buf) {\n\t\treturn 0, io.ErrUnexpectedEOF\n\t} else if buf[i] < 0x80 {\n\t\tp.index++\n\t\treturn uint64(buf[i]), nil\n\t} else if len(buf)-i < 10 {\n\t\treturn p.decodeVarintSlow()\n\t}\n\n\tvar b uint64\n\t// we already checked the first byte\n\tx = uint64(buf[i]) - 0x80\n\ti++\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 7\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 7\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 14\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 14\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 21\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 21\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 28\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 28\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 35\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 35\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 42\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 42\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 49\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 49\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 56\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\tx -= 0x80 << 56\n\n\tb = uint64(buf[i])\n\ti++\n\tx += b << 63\n\tif b&0x80 == 0 {\n\t\tgoto done\n\t}\n\t// x -= 0x80 << 63 // Always zero.\n\n\treturn 0, errOverflow\n\ndone:\n\tp.index = i\n\treturn x, nil\n}\n\n// DecodeFixed64 reads a 64-bit integer from the Buffer.\n// This is the format for the\n// fixed64, sfixed64, and double protocol buffer types.\nfunc (p *Buffer) DecodeFixed64() (x uint64, err error) {\n\t// x, err already 0\n\ti := p.index + 8\n\tif i < 0 || i > len(p.buf) {\n\t\terr = io.ErrUnexpectedEOF\n\t\treturn\n\t}\n\tp.index = i\n\n\tx = uint64(p.buf[i-8])\n\tx |= uint64(p.buf[i-7]) << 8\n\tx |= uint64(p.buf[i-6]) << 16\n\tx |= uint64(p.buf[i-5]) << 24\n\tx |= uint64(p.buf[i-4]) << 32\n\tx |= uint64(p.buf[i-3]) << 40\n\tx |= uint64(p.buf[i-2]) << 48\n\tx |= uint64(p.buf[i-1]) << 56\n\treturn\n}\n\n// DecodeFixed32 reads a 32-bit integer from the Buffer.\n// This is the format for the\n// fixed32, sfixed32, and float protocol buffer types.\nfunc (p *Buffer) DecodeFixed32() (x uint64, err error) {\n\t// x, err already 0\n\ti := p.index + 4\n\tif i < 0 || i > len(p.buf) {\n\t\terr = io.ErrUnexpectedEOF\n\t\treturn\n\t}\n\tp.index = i\n\n\tx = uint64(p.buf[i-4])\n\tx |= uint64(p.buf[i-3]) << 8\n\tx |= uint64(p.buf[i-2]) << 16\n\tx |= uint64(p.buf[i-1]) << 24\n\treturn\n}\n\n// DecodeZigzag64 reads a zigzag-encoded 64-bit integer\n// from the Buffer.\n// This is the format used for the sint64 protocol buffer type.\nfunc (p *Buffer) DecodeZigzag64() (x uint64, err error) {\n\tx, err = p.DecodeVarint()\n\tif err != nil {\n\t\treturn\n\t}\n\tx = (x >> 1) ^ uint64((int64(x&1)<<63)>>63)\n\treturn\n}\n\n// DecodeZigzag32 reads a zigzag-encoded 32-bit integer\n// from  the Buffer.\n// This is the format used for the sint32 protocol buffer type.\nfunc (p *Buffer) DecodeZigzag32() (x uint64, err error) {\n\tx, err = p.DecodeVarint()\n\tif err != nil {\n\t\treturn\n\t}\n\tx = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31))\n\treturn\n}\n\n// These are not ValueDecoders: they produce an array of bytes or a string.\n// bytes, embedded messages\n\n// DecodeRawBytes reads a count-delimited byte buffer from the Buffer.\n// This is the format used for the bytes protocol buffer\n// type and for embedded messages.\nfunc (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) {\n\tn, err := p.DecodeVarint()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnb := int(n)\n\tif nb < 0 {\n\t\treturn nil, fmt.Errorf(\"proto: bad byte length %d\", nb)\n\t}\n\tend := p.index + nb\n\tif end < p.index || end > len(p.buf) {\n\t\treturn nil, io.ErrUnexpectedEOF\n\t}\n\n\tif !alloc {\n\t\t// todo: check if can get more uses of alloc=false\n\t\tbuf = p.buf[p.index:end]\n\t\tp.index += nb\n\t\treturn\n\t}\n\n\tbuf = make([]byte, nb)\n\tcopy(buf, p.buf[p.index:])\n\tp.index += nb\n\treturn\n}\n\n// DecodeStringBytes reads an encoded string from the Buffer.\n// This is the format used for the proto2 string type.\nfunc (p *Buffer) DecodeStringBytes() (s string, err error) {\n\tbuf, err := p.DecodeRawBytes(false)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn string(buf), nil\n}\n\n// Skip the next item in the buffer. Its wire type is decoded and presented as an argument.\n// If the protocol buffer has extensions, and the field matches, add it as an extension.\n// Otherwise, if the XXX_unrecognized field exists, append the skipped data there.\nfunc (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error {\n\toi := o.index\n\n\terr := o.skip(t, tag, wire)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !unrecField.IsValid() {\n\t\treturn nil\n\t}\n\n\tptr := structPointer_Bytes(base, unrecField)\n\n\t// Add the skipped field to struct field\n\tobuf := o.buf\n\n\to.buf = *ptr\n\to.EncodeVarint(uint64(tag<<3 | wire))\n\t*ptr = append(o.buf, obuf[oi:o.index]...)\n\n\to.buf = obuf\n\n\treturn nil\n}\n\n// Skip the next item in the buffer. Its wire type is decoded and presented as an argument.\nfunc (o *Buffer) skip(t reflect.Type, tag, wire int) error {\n\n\tvar u uint64\n\tvar err error\n\n\tswitch wire {\n\tcase WireVarint:\n\t\t_, err = o.DecodeVarint()\n\tcase WireFixed64:\n\t\t_, err = o.DecodeFixed64()\n\tcase WireBytes:\n\t\t_, err = o.DecodeRawBytes(false)\n\tcase WireFixed32:\n\t\t_, err = o.DecodeFixed32()\n\tcase WireStartGroup:\n\t\tfor {\n\t\t\tu, err = o.DecodeVarint()\n\t\t\tif err != nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tfwire := int(u & 0x7)\n\t\t\tif fwire == WireEndGroup {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tftag := int(u >> 3)\n\t\t\terr = o.skip(t, ftag, fwire)\n\t\t\tif err != nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\tdefault:\n\t\terr = fmt.Errorf(\"proto: can't skip unknown wire type %d for %s\", wire, t)\n\t}\n\treturn err\n}\n\n// Unmarshaler is the interface representing objects that can\n// unmarshal themselves.  The method should reset the receiver before\n// decoding starts.  The argument points to data that may be\n// overwritten, so implementations should not keep references to the\n// buffer.\ntype Unmarshaler interface {\n\tUnmarshal([]byte) error\n}\n\n// Unmarshal parses the protocol buffer representation in buf and places the\n// decoded result in pb.  If the struct underlying pb does not match\n// the data in buf, the results can be unpredictable.\n//\n// Unmarshal resets pb before starting to unmarshal, so any\n// existing data in pb is always removed. Use UnmarshalMerge\n// to preserve and append to existing data.\nfunc Unmarshal(buf []byte, pb Message) error {\n\tpb.Reset()\n\treturn UnmarshalMerge(buf, pb)\n}\n\n// UnmarshalMerge parses the protocol buffer representation in buf and\n// writes the decoded result to pb.  If the struct underlying pb does not match\n// the data in buf, the results can be unpredictable.\n//\n// UnmarshalMerge merges into existing data in pb.\n// Most code should use Unmarshal instead.\nfunc UnmarshalMerge(buf []byte, pb Message) error {\n\t// If the object can unmarshal itself, let it.\n\tif u, ok := pb.(Unmarshaler); ok {\n\t\treturn u.Unmarshal(buf)\n\t}\n\treturn NewBuffer(buf).Unmarshal(pb)\n}\n\n// DecodeMessage reads a count-delimited message from the Buffer.\nfunc (p *Buffer) DecodeMessage(pb Message) error {\n\tenc, err := p.DecodeRawBytes(false)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn NewBuffer(enc).Unmarshal(pb)\n}\n\n// DecodeGroup reads a tag-delimited group from the Buffer.\nfunc (p *Buffer) DecodeGroup(pb Message) error {\n\ttyp, base, err := getbase(pb)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base)\n}\n\n// Unmarshal parses the protocol buffer representation in the\n// Buffer and places the decoded result in pb.  If the struct\n// underlying pb does not match the data in the buffer, the results can be\n// unpredictable.\n//\n// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal.\nfunc (p *Buffer) Unmarshal(pb Message) error {\n\t// If the object can unmarshal itself, let it.\n\tif u, ok := pb.(Unmarshaler); ok {\n\t\terr := u.Unmarshal(p.buf[p.index:])\n\t\tp.index = len(p.buf)\n\t\treturn err\n\t}\n\n\ttyp, base, err := getbase(pb)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base)\n\n\tif collectStats {\n\t\tstats.Decode++\n\t}\n\n\treturn err\n}\n\n// unmarshalType does the work of unmarshaling a structure.\nfunc (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error {\n\tvar state errorState\n\trequired, reqFields := prop.reqCount, uint64(0)\n\n\tvar err error\n\tfor err == nil && o.index < len(o.buf) {\n\t\toi := o.index\n\t\tvar u uint64\n\t\tu, err = o.DecodeVarint()\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\twire := int(u & 0x7)\n\t\tif wire == WireEndGroup {\n\t\t\tif is_group {\n\t\t\t\tif required > 0 {\n\t\t\t\t\t// Not enough information to determine the exact field.\n\t\t\t\t\t// (See below.)\n\t\t\t\t\treturn &RequiredNotSetError{\"{Unknown}\"}\n\t\t\t\t}\n\t\t\t\treturn nil // input is satisfied\n\t\t\t}\n\t\t\treturn fmt.Errorf(\"proto: %s: wiretype end group for non-group\", st)\n\t\t}\n\t\ttag := int(u >> 3)\n\t\tif tag <= 0 {\n\t\t\treturn fmt.Errorf(\"proto: %s: illegal tag %d (wire type %d)\", st, tag, wire)\n\t\t}\n\t\tfieldnum, ok := prop.decoderTags.get(tag)\n\t\tif !ok {\n\t\t\t// Maybe it's an extension?\n\t\t\tif prop.extendable {\n\t\t\t\tif e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) {\n\t\t\t\t\tif err = o.skip(st, tag, wire); err == nil {\n\t\t\t\t\t\textmap := e.extensionsWrite()\n\t\t\t\t\t\text := extmap[int32(tag)] // may be missing\n\t\t\t\t\t\text.enc = append(ext.enc, o.buf[oi:o.index]...)\n\t\t\t\t\t\textmap[int32(tag)] = ext\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Maybe it's a oneof?\n\t\t\tif prop.oneofUnmarshaler != nil {\n\t\t\t\tm := structPointer_Interface(base, st).(Message)\n\t\t\t\t// First return value indicates whether tag is a oneof field.\n\t\t\t\tok, err = prop.oneofUnmarshaler(m, tag, wire, o)\n\t\t\t\tif err == ErrInternalBadWireType {\n\t\t\t\t\t// Map the error to something more descriptive.\n\t\t\t\t\t// Do the formatting here to save generated code space.\n\t\t\t\t\terr = fmt.Errorf(\"bad wiretype for oneof field in %T\", m)\n\t\t\t\t}\n\t\t\t\tif ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\terr = o.skipAndSave(st, tag, wire, base, prop.unrecField)\n\t\t\tcontinue\n\t\t}\n\t\tp := prop.Prop[fieldnum]\n\n\t\tif p.dec == nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"proto: no protobuf decoder for %s.%s\\n\", st, st.Field(fieldnum).Name)\n\t\t\tcontinue\n\t\t}\n\t\tdec := p.dec\n\t\tif wire != WireStartGroup && wire != p.WireType {\n\t\t\tif wire == WireBytes && p.packedDec != nil {\n\t\t\t\t// a packable field\n\t\t\t\tdec = p.packedDec\n\t\t\t} else {\n\t\t\t\terr = fmt.Errorf(\"proto: bad wiretype for field %s.%s: got wiretype %d, want %d\", st, st.Field(fieldnum).Name, wire, p.WireType)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tdecErr := dec(o, p, base)\n\t\tif decErr != nil && !state.shouldContinue(decErr, p) {\n\t\t\terr = decErr\n\t\t}\n\t\tif err == nil && p.Required {\n\t\t\t// Successfully decoded a required field.\n\t\t\tif tag <= 64 {\n\t\t\t\t// use bitmap for fields 1-64 to catch field reuse.\n\t\t\t\tvar mask uint64 = 1 << uint64(tag-1)\n\t\t\t\tif reqFields&mask == 0 {\n\t\t\t\t\t// new required field\n\t\t\t\t\treqFields |= mask\n\t\t\t\t\trequired--\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// This is imprecise. It can be fooled by a required field\n\t\t\t\t// with a tag > 64 that is encoded twice; that's very rare.\n\t\t\t\t// A fully correct implementation would require allocating\n\t\t\t\t// a data structure, which we would like to avoid.\n\t\t\t\trequired--\n\t\t\t}\n\t\t}\n\t}\n\tif err == nil {\n\t\tif is_group {\n\t\t\treturn io.ErrUnexpectedEOF\n\t\t}\n\t\tif state.err != nil {\n\t\t\treturn state.err\n\t\t}\n\t\tif required > 0 {\n\t\t\t// Not enough information to determine the exact field. If we use extra\n\t\t\t// CPU, we could determine the field only if the missing required field\n\t\t\t// has a tag <= 64 and we check reqFields.\n\t\t\treturn &RequiredNotSetError{\"{Unknown}\"}\n\t\t}\n\t}\n\treturn err\n}\n\n// Individual type decoders\n// For each,\n//\tu is the decoded value,\n//\tv is a pointer to the field (pointer) in the struct\n\n// Sizes of the pools to allocate inside the Buffer.\n// The goal is modest amortization and allocation\n// on at least 16-byte boundaries.\nconst (\n\tboolPoolSize   = 16\n\tuint32PoolSize = 8\n\tuint64PoolSize = 4\n)\n\n// Decode a bool.\nfunc (o *Buffer) dec_bool(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif len(o.bools) == 0 {\n\t\to.bools = make([]bool, boolPoolSize)\n\t}\n\to.bools[0] = u != 0\n\t*structPointer_Bool(base, p.field) = &o.bools[0]\n\to.bools = o.bools[1:]\n\treturn nil\n}\n\nfunc (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*structPointer_BoolVal(base, p.field) = u != 0\n\treturn nil\n}\n\n// Decode an int32.\nfunc (o *Buffer) dec_int32(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tword32_Set(structPointer_Word32(base, p.field), o, uint32(u))\n\treturn nil\n}\n\nfunc (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tword32Val_Set(structPointer_Word32Val(base, p.field), uint32(u))\n\treturn nil\n}\n\n// Decode an int64.\nfunc (o *Buffer) dec_int64(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tword64_Set(structPointer_Word64(base, p.field), o, u)\n\treturn nil\n}\n\nfunc (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tword64Val_Set(structPointer_Word64Val(base, p.field), o, u)\n\treturn nil\n}\n\n// Decode a string.\nfunc (o *Buffer) dec_string(p *Properties, base structPointer) error {\n\ts, err := o.DecodeStringBytes()\n\tif err != nil {\n\t\treturn err\n\t}\n\t*structPointer_String(base, p.field) = &s\n\treturn nil\n}\n\nfunc (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error {\n\ts, err := o.DecodeStringBytes()\n\tif err != nil {\n\t\treturn err\n\t}\n\t*structPointer_StringVal(base, p.field) = s\n\treturn nil\n}\n\n// Decode a slice of bytes ([]byte).\nfunc (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error {\n\tb, err := o.DecodeRawBytes(true)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*structPointer_Bytes(base, p.field) = b\n\treturn nil\n}\n\n// Decode a slice of bools ([]bool).\nfunc (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tv := structPointer_BoolSlice(base, p.field)\n\t*v = append(*v, u != 0)\n\treturn nil\n}\n\n// Decode a slice of bools ([]bool) in packed format.\nfunc (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error {\n\tv := structPointer_BoolSlice(base, p.field)\n\n\tnn, err := o.DecodeVarint()\n\tif err != nil {\n\t\treturn err\n\t}\n\tnb := int(nn) // number of bytes of encoded bools\n\tfin := o.index + nb\n\tif fin < o.index {\n\t\treturn errOverflow\n\t}\n\n\ty := *v\n\tfor o.index < fin {\n\t\tu, err := p.valDec(o)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ty = append(y, u != 0)\n\t}\n\n\t*v = y\n\treturn nil\n}\n\n// Decode a slice of int32s ([]int32).\nfunc (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tstructPointer_Word32Slice(base, p.field).Append(uint32(u))\n\treturn nil\n}\n\n// Decode a slice of int32s ([]int32) in packed format.\nfunc (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error {\n\tv := structPointer_Word32Slice(base, p.field)\n\n\tnn, err := o.DecodeVarint()\n\tif err != nil {\n\t\treturn err\n\t}\n\tnb := int(nn) // number of bytes of encoded int32s\n\n\tfin := o.index + nb\n\tif fin < o.index {\n\t\treturn errOverflow\n\t}\n\tfor o.index < fin {\n\t\tu, err := p.valDec(o)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.Append(uint32(u))\n\t}\n\treturn nil\n}\n\n// Decode a slice of int64s ([]int64).\nfunc (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error {\n\tu, err := p.valDec(o)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tstructPointer_Word64Slice(base, p.field).Append(u)\n\treturn nil\n}\n\n// Decode a slice of int64s ([]int64) in packed format.\nfunc (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error {\n\tv := structPointer_Word64Slice(base, p.field)\n\n\tnn, err := o.DecodeVarint()\n\tif err != nil {\n\t\treturn err\n\t}\n\tnb := int(nn) // number of bytes of encoded int64s\n\n\tfin := o.index + nb\n\tif fin < o.index {\n\t\treturn errOverflow\n\t}\n\tfor o.index < fin {\n\t\tu, err := p.valDec(o)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tv.Append(u)\n\t}\n\treturn nil\n}\n\n// Decode a slice of strings ([]string).\nfunc (o *Buffer) dec_slice_string(p *Properties, base structPointer) error {\n\ts, err := o.DecodeStringBytes()\n\tif err != nil {\n\t\treturn err\n\t}\n\tv := structPointer_StringSlice(base, p.field)\n\t*v = append(*v, s)\n\treturn nil\n}\n\n// Decode a slice of slice of bytes ([][]byte).\nfunc (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error {\n\tb, err := o.DecodeRawBytes(true)\n\tif err != nil {\n\t\treturn err\n\t}\n\tv := structPointer_BytesSlice(base, p.field)\n\t*v = append(*v, b)\n\treturn nil\n}\n\n// Decode a map field.\nfunc (o *Buffer) dec_new_map(p *Properties, base structPointer) error {\n\traw, err := o.DecodeRawBytes(false)\n\tif err != nil {\n\t\treturn err\n\t}\n\toi := o.index       // index at the end of this map entry\n\to.index -= len(raw) // move buffer back to start of map entry\n\n\tmptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V\n\tif mptr.Elem().IsNil() {\n\t\tmptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem()))\n\t}\n\tv := mptr.Elem() // map[K]V\n\n\t// Prepare addressable doubly-indirect placeholders for the key and value types.\n\t// See enc_new_map for why.\n\tkeyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K\n\tkeybase := toStructPointer(keyptr.Addr())                  // **K\n\n\tvar valbase structPointer\n\tvar valptr reflect.Value\n\tswitch p.mtype.Elem().Kind() {\n\tcase reflect.Slice:\n\t\t// []byte\n\t\tvar dummy []byte\n\t\tvalptr = reflect.ValueOf(&dummy)  // *[]byte\n\t\tvalbase = toStructPointer(valptr) // *[]byte\n\tcase reflect.Ptr:\n\t\t// message; valptr is **Msg; need to allocate the intermediate pointer\n\t\tvalptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V\n\t\tvalptr.Set(reflect.New(valptr.Type().Elem()))\n\t\tvalbase = toStructPointer(valptr)\n\tdefault:\n\t\t// everything else\n\t\tvalptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V\n\t\tvalbase = toStructPointer(valptr.Addr())                   // **V\n\t}\n\n\t// Decode.\n\t// This parses a restricted wire format, namely the encoding of a message\n\t// with two fields. See enc_new_map for the format.\n\tfor o.index < oi {\n\t\t// tagcode for key and value properties are always a single byte\n\t\t// because they have tags 1 and 2.\n\t\ttagcode := o.buf[o.index]\n\t\to.index++\n\t\tswitch tagcode {\n\t\tcase p.mkeyprop.tagcode[0]:\n\t\t\tif err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase p.mvalprop.tagcode[0]:\n\t\t\tif err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\t// TODO: Should we silently skip this instead?\n\t\t\treturn fmt.Errorf(\"proto: bad map data tag %d\", raw[0])\n\t\t}\n\t}\n\tkeyelem, valelem := keyptr.Elem(), valptr.Elem()\n\tif !keyelem.IsValid() {\n\t\tkeyelem = reflect.Zero(p.mtype.Key())\n\t}\n\tif !valelem.IsValid() {\n\t\tvalelem = reflect.Zero(p.mtype.Elem())\n\t}\n\n\tv.SetMapIndex(keyelem, valelem)\n\treturn nil\n}\n\n// Decode a group.\nfunc (o *Buffer) dec_struct_group(p *Properties, base structPointer) error {\n\tbas := structPointer_GetStructPointer(base, p.field)\n\tif structPointer_IsNil(bas) {\n\t\t// allocate new nested message\n\t\tbas = toStructPointer(reflect.New(p.stype))\n\t\tstructPointer_SetStructPointer(base, p.field, bas)\n\t}\n\treturn o.unmarshalType(p.stype, p.sprop, true, bas)\n}\n\n// Decode an embedded message.\nfunc (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) {\n\traw, e := o.DecodeRawBytes(false)\n\tif e != nil {\n\t\treturn e\n\t}\n\n\tbas := structPointer_GetStructPointer(base, p.field)\n\tif structPointer_IsNil(bas) {\n\t\t// allocate new nested message\n\t\tbas = toStructPointer(reflect.New(p.stype))\n\t\tstructPointer_SetStructPointer(base, p.field, bas)\n\t}\n\n\t// If the object can unmarshal itself, let it.\n\tif p.isUnmarshaler {\n\t\tiv := structPointer_Interface(bas, p.stype)\n\t\treturn iv.(Unmarshaler).Unmarshal(raw)\n\t}\n\n\tobuf := o.buf\n\toi := o.index\n\to.buf = raw\n\to.index = 0\n\n\terr = o.unmarshalType(p.stype, p.sprop, false, bas)\n\to.buf = obuf\n\to.index = oi\n\n\treturn err\n}\n\n// Decode a slice of embedded messages.\nfunc (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error {\n\treturn o.dec_slice_struct(p, false, base)\n}\n\n// Decode a slice of embedded groups.\nfunc (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error {\n\treturn o.dec_slice_struct(p, true, base)\n}\n\n// Decode a slice of structs ([]*struct).\nfunc (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error {\n\tv := reflect.New(p.stype)\n\tbas := toStructPointer(v)\n\tstructPointer_StructPointerSlice(base, p.field).Append(bas)\n\n\tif is_group {\n\t\terr := o.unmarshalType(p.stype, p.sprop, is_group, bas)\n\t\treturn err\n\t}\n\n\traw, err := o.DecodeRawBytes(false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// If the object can unmarshal itself, let it.\n\tif p.isUnmarshaler {\n\t\tiv := v.Interface()\n\t\treturn iv.(Unmarshaler).Unmarshal(raw)\n\t}\n\n\tobuf := o.buf\n\toi := o.index\n\to.buf = raw\n\to.index = 0\n\n\terr = o.unmarshalType(p.stype, p.sprop, is_group, bas)\n\n\to.buf = obuf\n\to.index = oi\n\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/encode.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage proto\n\n/*\n * Routines for encoding data into the wire format for protocol buffers.\n */\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sort\"\n)\n\n// RequiredNotSetError is the error returned if Marshal is called with\n// a protocol buffer struct whose required fields have not\n// all been initialized. It is also the error returned if Unmarshal is\n// called with an encoded protocol buffer that does not include all the\n// required fields.\n//\n// When printed, RequiredNotSetError reports the first unset required field in a\n// message. If the field cannot be precisely determined, it is reported as\n// \"{Unknown}\".\ntype RequiredNotSetError struct {\n\tfield string\n}\n\nfunc (e *RequiredNotSetError) Error() string {\n\treturn fmt.Sprintf(\"proto: required field %q not set\", e.field)\n}\n\nvar (\n\t// errRepeatedHasNil is the error returned if Marshal is called with\n\t// a struct with a repeated field containing a nil element.\n\terrRepeatedHasNil = errors.New(\"proto: repeated field has nil element\")\n\n\t// errOneofHasNil is the error returned if Marshal is called with\n\t// a struct with a oneof field containing a nil element.\n\terrOneofHasNil = errors.New(\"proto: oneof field has nil value\")\n\n\t// ErrNil is the error returned if Marshal is called with nil.\n\tErrNil = errors.New(\"proto: Marshal called with nil\")\n\n\t// ErrTooLarge is the error returned if Marshal is called with a\n\t// message that encodes to >2GB.\n\tErrTooLarge = errors.New(\"proto: message encodes to over 2 GB\")\n)\n\n// The fundamental encoders that put bytes on the wire.\n// Those that take integer types all accept uint64 and are\n// therefore of type valueEncoder.\n\nconst maxVarintBytes = 10 // maximum length of a varint\n\n// maxMarshalSize is the largest allowed size of an encoded protobuf,\n// since C++ and Java use signed int32s for the size.\nconst maxMarshalSize = 1<<31 - 1\n\n// EncodeVarint returns the varint encoding of x.\n// This is the format for the\n// int32, int64, uint32, uint64, bool, and enum\n// protocol buffer types.\n// Not used by the package itself, but helpful to clients\n// wishing to use the same encoding.\nfunc EncodeVarint(x uint64) []byte {\n\tvar buf [maxVarintBytes]byte\n\tvar n int\n\tfor n = 0; x > 127; n++ {\n\t\tbuf[n] = 0x80 | uint8(x&0x7F)\n\t\tx >>= 7\n\t}\n\tbuf[n] = uint8(x)\n\tn++\n\treturn buf[0:n]\n}\n\n// EncodeVarint writes a varint-encoded integer to the Buffer.\n// This is the format for the\n// int32, int64, uint32, uint64, bool, and enum\n// protocol buffer types.\nfunc (p *Buffer) EncodeVarint(x uint64) error {\n\tfor x >= 1<<7 {\n\t\tp.buf = append(p.buf, uint8(x&0x7f|0x80))\n\t\tx >>= 7\n\t}\n\tp.buf = append(p.buf, uint8(x))\n\treturn nil\n}\n\n// SizeVarint returns the varint encoding size of an integer.\nfunc SizeVarint(x uint64) int {\n\treturn sizeVarint(x)\n}\n\nfunc sizeVarint(x uint64) (n int) {\n\tfor {\n\t\tn++\n\t\tx >>= 7\n\t\tif x == 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn n\n}\n\n// EncodeFixed64 writes a 64-bit integer to the Buffer.\n// This is the format for the\n// fixed64, sfixed64, and double protocol buffer types.\nfunc (p *Buffer) EncodeFixed64(x uint64) error {\n\tp.buf = append(p.buf,\n\t\tuint8(x),\n\t\tuint8(x>>8),\n\t\tuint8(x>>16),\n\t\tuint8(x>>24),\n\t\tuint8(x>>32),\n\t\tuint8(x>>40),\n\t\tuint8(x>>48),\n\t\tuint8(x>>56))\n\treturn nil\n}\n\nfunc sizeFixed64(x uint64) int {\n\treturn 8\n}\n\n// EncodeFixed32 writes a 32-bit integer to the Buffer.\n// This is the format for the\n// fixed32, sfixed32, and float protocol buffer types.\nfunc (p *Buffer) EncodeFixed32(x uint64) error {\n\tp.buf = append(p.buf,\n\t\tuint8(x),\n\t\tuint8(x>>8),\n\t\tuint8(x>>16),\n\t\tuint8(x>>24))\n\treturn nil\n}\n\nfunc sizeFixed32(x uint64) int {\n\treturn 4\n}\n\n// EncodeZigzag64 writes a zigzag-encoded 64-bit integer\n// to the Buffer.\n// This is the format used for the sint64 protocol buffer type.\nfunc (p *Buffer) EncodeZigzag64(x uint64) error {\n\t// use signed number to get arithmetic right shift.\n\treturn p.EncodeVarint((x << 1) ^ uint64((int64(x) >> 63)))\n}\n\nfunc sizeZigzag64(x uint64) int {\n\treturn sizeVarint((x << 1) ^ uint64((int64(x) >> 63)))\n}\n\n// EncodeZigzag32 writes a zigzag-encoded 32-bit integer\n// to the Buffer.\n// This is the format used for the sint32 protocol buffer type.\nfunc (p *Buffer) EncodeZigzag32(x uint64) error {\n\t// use signed number to get arithmetic right shift.\n\treturn p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31))))\n}\n\nfunc sizeZigzag32(x uint64) int {\n\treturn sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31))))\n}\n\n// EncodeRawBytes writes a count-delimited byte buffer to the Buffer.\n// This is the format used for the bytes protocol buffer\n// type and for embedded messages.\nfunc (p *Buffer) EncodeRawBytes(b []byte) error {\n\tp.EncodeVarint(uint64(len(b)))\n\tp.buf = append(p.buf, b...)\n\treturn nil\n}\n\nfunc sizeRawBytes(b []byte) int {\n\treturn sizeVarint(uint64(len(b))) +\n\t\tlen(b)\n}\n\n// EncodeStringBytes writes an encoded string to the Buffer.\n// This is the format used for the proto2 string type.\nfunc (p *Buffer) EncodeStringBytes(s string) error {\n\tp.EncodeVarint(uint64(len(s)))\n\tp.buf = append(p.buf, s...)\n\treturn nil\n}\n\nfunc sizeStringBytes(s string) int {\n\treturn sizeVarint(uint64(len(s))) +\n\t\tlen(s)\n}\n\n// Marshaler is the interface representing objects that can marshal themselves.\ntype Marshaler interface {\n\tMarshal() ([]byte, error)\n}\n\n// Marshal takes the protocol buffer\n// and encodes it into the wire format, returning the data.\nfunc Marshal(pb Message) ([]byte, error) {\n\t// Can the object marshal itself?\n\tif m, ok := pb.(Marshaler); ok {\n\t\treturn m.Marshal()\n\t}\n\tp := NewBuffer(nil)\n\terr := p.Marshal(pb)\n\tif p.buf == nil && err == nil {\n\t\t// Return a non-nil slice on success.\n\t\treturn []byte{}, nil\n\t}\n\treturn p.buf, err\n}\n\n// EncodeMessage writes the protocol buffer to the Buffer,\n// prefixed by a varint-encoded length.\nfunc (p *Buffer) EncodeMessage(pb Message) error {\n\tt, base, err := getbase(pb)\n\tif structPointer_IsNil(base) {\n\t\treturn ErrNil\n\t}\n\tif err == nil {\n\t\tvar state errorState\n\t\terr = p.enc_len_struct(GetProperties(t.Elem()), base, &state)\n\t}\n\treturn err\n}\n\n// Marshal takes the protocol buffer\n// and encodes it into the wire format, writing the result to the\n// Buffer.\nfunc (p *Buffer) Marshal(pb Message) error {\n\t// Can the object marshal itself?\n\tif m, ok := pb.(Marshaler); ok {\n\t\tdata, err := m.Marshal()\n\t\tp.buf = append(p.buf, data...)\n\t\treturn err\n\t}\n\n\tt, base, err := getbase(pb)\n\tif structPointer_IsNil(base) {\n\t\treturn ErrNil\n\t}\n\tif err == nil {\n\t\terr = p.enc_struct(GetProperties(t.Elem()), base)\n\t}\n\n\tif collectStats {\n\t\t(stats).Encode++ // Parens are to work around a goimports bug.\n\t}\n\n\tif len(p.buf) > maxMarshalSize {\n\t\treturn ErrTooLarge\n\t}\n\treturn err\n}\n\n// Size returns the encoded size of a protocol buffer.\nfunc Size(pb Message) (n int) {\n\t// Can the object marshal itself?  If so, Size is slow.\n\t// TODO: add Size to Marshaler, or add a Sizer interface.\n\tif m, ok := pb.(Marshaler); ok {\n\t\tb, _ := m.Marshal()\n\t\treturn len(b)\n\t}\n\n\tt, base, err := getbase(pb)\n\tif structPointer_IsNil(base) {\n\t\treturn 0\n\t}\n\tif err == nil {\n\t\tn = size_struct(GetProperties(t.Elem()), base)\n\t}\n\n\tif collectStats {\n\t\t(stats).Size++ // Parens are to work around a goimports bug.\n\t}\n\n\treturn\n}\n\n// Individual type encoders.\n\n// Encode a bool.\nfunc (o *Buffer) enc_bool(p *Properties, base structPointer) error {\n\tv := *structPointer_Bool(base, p.field)\n\tif v == nil {\n\t\treturn ErrNil\n\t}\n\tx := 0\n\tif *v {\n\t\tx = 1\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, uint64(x))\n\treturn nil\n}\n\nfunc (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error {\n\tv := *structPointer_BoolVal(base, p.field)\n\tif !v {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, 1)\n\treturn nil\n}\n\nfunc size_bool(p *Properties, base structPointer) int {\n\tv := *structPointer_Bool(base, p.field)\n\tif v == nil {\n\t\treturn 0\n\t}\n\treturn len(p.tagcode) + 1 // each bool takes exactly one byte\n}\n\nfunc size_proto3_bool(p *Properties, base structPointer) int {\n\tv := *structPointer_BoolVal(base, p.field)\n\tif !v && !p.oneof {\n\t\treturn 0\n\t}\n\treturn len(p.tagcode) + 1 // each bool takes exactly one byte\n}\n\n// Encode an int32.\nfunc (o *Buffer) enc_int32(p *Properties, base structPointer) error {\n\tv := structPointer_Word32(base, p.field)\n\tif word32_IsNil(v) {\n\t\treturn ErrNil\n\t}\n\tx := int32(word32_Get(v)) // permit sign extension to use full 64-bit range\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, uint64(x))\n\treturn nil\n}\n\nfunc (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error {\n\tv := structPointer_Word32Val(base, p.field)\n\tx := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range\n\tif x == 0 {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, uint64(x))\n\treturn nil\n}\n\nfunc size_int32(p *Properties, base structPointer) (n int) {\n\tv := structPointer_Word32(base, p.field)\n\tif word32_IsNil(v) {\n\t\treturn 0\n\t}\n\tx := int32(word32_Get(v)) // permit sign extension to use full 64-bit range\n\tn += len(p.tagcode)\n\tn += p.valSize(uint64(x))\n\treturn\n}\n\nfunc size_proto3_int32(p *Properties, base structPointer) (n int) {\n\tv := structPointer_Word32Val(base, p.field)\n\tx := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range\n\tif x == 0 && !p.oneof {\n\t\treturn 0\n\t}\n\tn += len(p.tagcode)\n\tn += p.valSize(uint64(x))\n\treturn\n}\n\n// Encode a uint32.\n// Exactly the same as int32, except for no sign extension.\nfunc (o *Buffer) enc_uint32(p *Properties, base structPointer) error {\n\tv := structPointer_Word32(base, p.field)\n\tif word32_IsNil(v) {\n\t\treturn ErrNil\n\t}\n\tx := word32_Get(v)\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, uint64(x))\n\treturn nil\n}\n\nfunc (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error {\n\tv := structPointer_Word32Val(base, p.field)\n\tx := word32Val_Get(v)\n\tif x == 0 {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, uint64(x))\n\treturn nil\n}\n\nfunc size_uint32(p *Properties, base structPointer) (n int) {\n\tv := structPointer_Word32(base, p.field)\n\tif word32_IsNil(v) {\n\t\treturn 0\n\t}\n\tx := word32_Get(v)\n\tn += len(p.tagcode)\n\tn += p.valSize(uint64(x))\n\treturn\n}\n\nfunc size_proto3_uint32(p *Properties, base structPointer) (n int) {\n\tv := structPointer_Word32Val(base, p.field)\n\tx := word32Val_Get(v)\n\tif x == 0 && !p.oneof {\n\t\treturn 0\n\t}\n\tn += len(p.tagcode)\n\tn += p.valSize(uint64(x))\n\treturn\n}\n\n// Encode an int64.\nfunc (o *Buffer) enc_int64(p *Properties, base structPointer) error {\n\tv := structPointer_Word64(base, p.field)\n\tif word64_IsNil(v) {\n\t\treturn ErrNil\n\t}\n\tx := word64_Get(v)\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, x)\n\treturn nil\n}\n\nfunc (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error {\n\tv := structPointer_Word64Val(base, p.field)\n\tx := word64Val_Get(v)\n\tif x == 0 {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\tp.valEnc(o, x)\n\treturn nil\n}\n\nfunc size_int64(p *Properties, base structPointer) (n int) {\n\tv := structPointer_Word64(base, p.field)\n\tif word64_IsNil(v) {\n\t\treturn 0\n\t}\n\tx := word64_Get(v)\n\tn += len(p.tagcode)\n\tn += p.valSize(x)\n\treturn\n}\n\nfunc size_proto3_int64(p *Properties, base structPointer) (n int) {\n\tv := structPointer_Word64Val(base, p.field)\n\tx := word64Val_Get(v)\n\tif x == 0 && !p.oneof {\n\t\treturn 0\n\t}\n\tn += len(p.tagcode)\n\tn += p.valSize(x)\n\treturn\n}\n\n// Encode a string.\nfunc (o *Buffer) enc_string(p *Properties, base structPointer) error {\n\tv := *structPointer_String(base, p.field)\n\tif v == nil {\n\t\treturn ErrNil\n\t}\n\tx := *v\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeStringBytes(x)\n\treturn nil\n}\n\nfunc (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error {\n\tv := *structPointer_StringVal(base, p.field)\n\tif v == \"\" {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeStringBytes(v)\n\treturn nil\n}\n\nfunc size_string(p *Properties, base structPointer) (n int) {\n\tv := *structPointer_String(base, p.field)\n\tif v == nil {\n\t\treturn 0\n\t}\n\tx := *v\n\tn += len(p.tagcode)\n\tn += sizeStringBytes(x)\n\treturn\n}\n\nfunc size_proto3_string(p *Properties, base structPointer) (n int) {\n\tv := *structPointer_StringVal(base, p.field)\n\tif v == \"\" && !p.oneof {\n\t\treturn 0\n\t}\n\tn += len(p.tagcode)\n\tn += sizeStringBytes(v)\n\treturn\n}\n\n// All protocol buffer fields are nillable, but be careful.\nfunc isNil(v reflect.Value) bool {\n\tswitch v.Kind() {\n\tcase reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:\n\t\treturn v.IsNil()\n\t}\n\treturn false\n}\n\n// Encode a message struct.\nfunc (o *Buffer) enc_struct_message(p *Properties, base structPointer) error {\n\tvar state errorState\n\tstructp := structPointer_GetStructPointer(base, p.field)\n\tif structPointer_IsNil(structp) {\n\t\treturn ErrNil\n\t}\n\n\t// Can the object marshal itself?\n\tif p.isMarshaler {\n\t\tm := structPointer_Interface(structp, p.stype).(Marshaler)\n\t\tdata, err := m.Marshal()\n\t\tif err != nil && !state.shouldContinue(err, nil) {\n\t\t\treturn err\n\t\t}\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\to.EncodeRawBytes(data)\n\t\treturn state.err\n\t}\n\n\to.buf = append(o.buf, p.tagcode...)\n\treturn o.enc_len_struct(p.sprop, structp, &state)\n}\n\nfunc size_struct_message(p *Properties, base structPointer) int {\n\tstructp := structPointer_GetStructPointer(base, p.field)\n\tif structPointer_IsNil(structp) {\n\t\treturn 0\n\t}\n\n\t// Can the object marshal itself?\n\tif p.isMarshaler {\n\t\tm := structPointer_Interface(structp, p.stype).(Marshaler)\n\t\tdata, _ := m.Marshal()\n\t\tn0 := len(p.tagcode)\n\t\tn1 := sizeRawBytes(data)\n\t\treturn n0 + n1\n\t}\n\n\tn0 := len(p.tagcode)\n\tn1 := size_struct(p.sprop, structp)\n\tn2 := sizeVarint(uint64(n1)) // size of encoded length\n\treturn n0 + n1 + n2\n}\n\n// Encode a group struct.\nfunc (o *Buffer) enc_struct_group(p *Properties, base structPointer) error {\n\tvar state errorState\n\tb := structPointer_GetStructPointer(base, p.field)\n\tif structPointer_IsNil(b) {\n\t\treturn ErrNil\n\t}\n\n\to.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup))\n\terr := o.enc_struct(p.sprop, b)\n\tif err != nil && !state.shouldContinue(err, nil) {\n\t\treturn err\n\t}\n\to.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup))\n\treturn state.err\n}\n\nfunc size_struct_group(p *Properties, base structPointer) (n int) {\n\tb := structPointer_GetStructPointer(base, p.field)\n\tif structPointer_IsNil(b) {\n\t\treturn 0\n\t}\n\n\tn += sizeVarint(uint64((p.Tag << 3) | WireStartGroup))\n\tn += size_struct(p.sprop, b)\n\tn += sizeVarint(uint64((p.Tag << 3) | WireEndGroup))\n\treturn\n}\n\n// Encode a slice of bools ([]bool).\nfunc (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error {\n\ts := *structPointer_BoolSlice(base, p.field)\n\tl := len(s)\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\tfor _, x := range s {\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\tv := uint64(0)\n\t\tif x {\n\t\t\tv = 1\n\t\t}\n\t\tp.valEnc(o, v)\n\t}\n\treturn nil\n}\n\nfunc size_slice_bool(p *Properties, base structPointer) int {\n\ts := *structPointer_BoolSlice(base, p.field)\n\tl := len(s)\n\tif l == 0 {\n\t\treturn 0\n\t}\n\treturn l * (len(p.tagcode) + 1) // each bool takes exactly one byte\n}\n\n// Encode a slice of bools ([]bool) in packed format.\nfunc (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error {\n\ts := *structPointer_BoolSlice(base, p.field)\n\tl := len(s)\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeVarint(uint64(l)) // each bool takes exactly one byte\n\tfor _, x := range s {\n\t\tv := uint64(0)\n\t\tif x {\n\t\t\tv = 1\n\t\t}\n\t\tp.valEnc(o, v)\n\t}\n\treturn nil\n}\n\nfunc size_slice_packed_bool(p *Properties, base structPointer) (n int) {\n\ts := *structPointer_BoolSlice(base, p.field)\n\tl := len(s)\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tn += len(p.tagcode)\n\tn += sizeVarint(uint64(l))\n\tn += l // each bool takes exactly one byte\n\treturn\n}\n\n// Encode a slice of bytes ([]byte).\nfunc (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error {\n\ts := *structPointer_Bytes(base, p.field)\n\tif s == nil {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeRawBytes(s)\n\treturn nil\n}\n\nfunc (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error {\n\ts := *structPointer_Bytes(base, p.field)\n\tif len(s) == 0 {\n\t\treturn ErrNil\n\t}\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeRawBytes(s)\n\treturn nil\n}\n\nfunc size_slice_byte(p *Properties, base structPointer) (n int) {\n\ts := *structPointer_Bytes(base, p.field)\n\tif s == nil && !p.oneof {\n\t\treturn 0\n\t}\n\tn += len(p.tagcode)\n\tn += sizeRawBytes(s)\n\treturn\n}\n\nfunc size_proto3_slice_byte(p *Properties, base structPointer) (n int) {\n\ts := *structPointer_Bytes(base, p.field)\n\tif len(s) == 0 && !p.oneof {\n\t\treturn 0\n\t}\n\tn += len(p.tagcode)\n\tn += sizeRawBytes(s)\n\treturn\n}\n\n// Encode a slice of int32s ([]int32).\nfunc (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\tfor i := 0; i < l; i++ {\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\tx := int32(s.Index(i)) // permit sign extension to use full 64-bit range\n\t\tp.valEnc(o, uint64(x))\n\t}\n\treturn nil\n}\n\nfunc size_slice_int32(p *Properties, base structPointer) (n int) {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tfor i := 0; i < l; i++ {\n\t\tn += len(p.tagcode)\n\t\tx := int32(s.Index(i)) // permit sign extension to use full 64-bit range\n\t\tn += p.valSize(uint64(x))\n\t}\n\treturn\n}\n\n// Encode a slice of int32s ([]int32) in packed format.\nfunc (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\t// TODO: Reuse a Buffer.\n\tbuf := NewBuffer(nil)\n\tfor i := 0; i < l; i++ {\n\t\tx := int32(s.Index(i)) // permit sign extension to use full 64-bit range\n\t\tp.valEnc(buf, uint64(x))\n\t}\n\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeVarint(uint64(len(buf.buf)))\n\to.buf = append(o.buf, buf.buf...)\n\treturn nil\n}\n\nfunc size_slice_packed_int32(p *Properties, base structPointer) (n int) {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tvar bufSize int\n\tfor i := 0; i < l; i++ {\n\t\tx := int32(s.Index(i)) // permit sign extension to use full 64-bit range\n\t\tbufSize += p.valSize(uint64(x))\n\t}\n\n\tn += len(p.tagcode)\n\tn += sizeVarint(uint64(bufSize))\n\tn += bufSize\n\treturn\n}\n\n// Encode a slice of uint32s ([]uint32).\n// Exactly the same as int32, except for no sign extension.\nfunc (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\tfor i := 0; i < l; i++ {\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\tx := s.Index(i)\n\t\tp.valEnc(o, uint64(x))\n\t}\n\treturn nil\n}\n\nfunc size_slice_uint32(p *Properties, base structPointer) (n int) {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tfor i := 0; i < l; i++ {\n\t\tn += len(p.tagcode)\n\t\tx := s.Index(i)\n\t\tn += p.valSize(uint64(x))\n\t}\n\treturn\n}\n\n// Encode a slice of uint32s ([]uint32) in packed format.\n// Exactly the same as int32, except for no sign extension.\nfunc (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\t// TODO: Reuse a Buffer.\n\tbuf := NewBuffer(nil)\n\tfor i := 0; i < l; i++ {\n\t\tp.valEnc(buf, uint64(s.Index(i)))\n\t}\n\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeVarint(uint64(len(buf.buf)))\n\to.buf = append(o.buf, buf.buf...)\n\treturn nil\n}\n\nfunc size_slice_packed_uint32(p *Properties, base structPointer) (n int) {\n\ts := structPointer_Word32Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tvar bufSize int\n\tfor i := 0; i < l; i++ {\n\t\tbufSize += p.valSize(uint64(s.Index(i)))\n\t}\n\n\tn += len(p.tagcode)\n\tn += sizeVarint(uint64(bufSize))\n\tn += bufSize\n\treturn\n}\n\n// Encode a slice of int64s ([]int64).\nfunc (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error {\n\ts := structPointer_Word64Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\tfor i := 0; i < l; i++ {\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\tp.valEnc(o, s.Index(i))\n\t}\n\treturn nil\n}\n\nfunc size_slice_int64(p *Properties, base structPointer) (n int) {\n\ts := structPointer_Word64Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tfor i := 0; i < l; i++ {\n\t\tn += len(p.tagcode)\n\t\tn += p.valSize(s.Index(i))\n\t}\n\treturn\n}\n\n// Encode a slice of int64s ([]int64) in packed format.\nfunc (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error {\n\ts := structPointer_Word64Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\t// TODO: Reuse a Buffer.\n\tbuf := NewBuffer(nil)\n\tfor i := 0; i < l; i++ {\n\t\tp.valEnc(buf, s.Index(i))\n\t}\n\n\to.buf = append(o.buf, p.tagcode...)\n\to.EncodeVarint(uint64(len(buf.buf)))\n\to.buf = append(o.buf, buf.buf...)\n\treturn nil\n}\n\nfunc size_slice_packed_int64(p *Properties, base structPointer) (n int) {\n\ts := structPointer_Word64Slice(base, p.field)\n\tl := s.Len()\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tvar bufSize int\n\tfor i := 0; i < l; i++ {\n\t\tbufSize += p.valSize(s.Index(i))\n\t}\n\n\tn += len(p.tagcode)\n\tn += sizeVarint(uint64(bufSize))\n\tn += bufSize\n\treturn\n}\n\n// Encode a slice of slice of bytes ([][]byte).\nfunc (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error {\n\tss := *structPointer_BytesSlice(base, p.field)\n\tl := len(ss)\n\tif l == 0 {\n\t\treturn ErrNil\n\t}\n\tfor i := 0; i < l; i++ {\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\to.EncodeRawBytes(ss[i])\n\t}\n\treturn nil\n}\n\nfunc size_slice_slice_byte(p *Properties, base structPointer) (n int) {\n\tss := *structPointer_BytesSlice(base, p.field)\n\tl := len(ss)\n\tif l == 0 {\n\t\treturn 0\n\t}\n\tn += l * len(p.tagcode)\n\tfor i := 0; i < l; i++ {\n\t\tn += sizeRawBytes(ss[i])\n\t}\n\treturn\n}\n\n// Encode a slice of strings ([]string).\nfunc (o *Buffer) enc_slice_string(p *Properties, base structPointer) error {\n\tss := *structPointer_StringSlice(base, p.field)\n\tl := len(ss)\n\tfor i := 0; i < l; i++ {\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\to.EncodeStringBytes(ss[i])\n\t}\n\treturn nil\n}\n\nfunc size_slice_string(p *Properties, base structPointer) (n int) {\n\tss := *structPointer_StringSlice(base, p.field)\n\tl := len(ss)\n\tn += l * len(p.tagcode)\n\tfor i := 0; i < l; i++ {\n\t\tn += sizeStringBytes(ss[i])\n\t}\n\treturn\n}\n\n// Encode a slice of message structs ([]*struct).\nfunc (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error {\n\tvar state errorState\n\ts := structPointer_StructPointerSlice(base, p.field)\n\tl := s.Len()\n\n\tfor i := 0; i < l; i++ {\n\t\tstructp := s.Index(i)\n\t\tif structPointer_IsNil(structp) {\n\t\t\treturn errRepeatedHasNil\n\t\t}\n\n\t\t// Can the object marshal itself?\n\t\tif p.isMarshaler {\n\t\t\tm := structPointer_Interface(structp, p.stype).(Marshaler)\n\t\t\tdata, err := m.Marshal()\n\t\t\tif err != nil && !state.shouldContinue(err, nil) {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\to.buf = append(o.buf, p.tagcode...)\n\t\t\to.EncodeRawBytes(data)\n\t\t\tcontinue\n\t\t}\n\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\terr := o.enc_len_struct(p.sprop, structp, &state)\n\t\tif err != nil && !state.shouldContinue(err, nil) {\n\t\t\tif err == ErrNil {\n\t\t\t\treturn errRepeatedHasNil\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\t}\n\treturn state.err\n}\n\nfunc size_slice_struct_message(p *Properties, base structPointer) (n int) {\n\ts := structPointer_StructPointerSlice(base, p.field)\n\tl := s.Len()\n\tn += l * len(p.tagcode)\n\tfor i := 0; i < l; i++ {\n\t\tstructp := s.Index(i)\n\t\tif structPointer_IsNil(structp) {\n\t\t\treturn // return the size up to this point\n\t\t}\n\n\t\t// Can the object marshal itself?\n\t\tif p.isMarshaler {\n\t\t\tm := structPointer_Interface(structp, p.stype).(Marshaler)\n\t\t\tdata, _ := m.Marshal()\n\t\t\tn += sizeRawBytes(data)\n\t\t\tcontinue\n\t\t}\n\n\t\tn0 := size_struct(p.sprop, structp)\n\t\tn1 := sizeVarint(uint64(n0)) // size of encoded length\n\t\tn += n0 + n1\n\t}\n\treturn\n}\n\n// Encode a slice of group structs ([]*struct).\nfunc (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error {\n\tvar state errorState\n\ts := structPointer_StructPointerSlice(base, p.field)\n\tl := s.Len()\n\n\tfor i := 0; i < l; i++ {\n\t\tb := s.Index(i)\n\t\tif structPointer_IsNil(b) {\n\t\t\treturn errRepeatedHasNil\n\t\t}\n\n\t\to.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup))\n\n\t\terr := o.enc_struct(p.sprop, b)\n\n\t\tif err != nil && !state.shouldContinue(err, nil) {\n\t\t\tif err == ErrNil {\n\t\t\t\treturn errRepeatedHasNil\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\n\t\to.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup))\n\t}\n\treturn state.err\n}\n\nfunc size_slice_struct_group(p *Properties, base structPointer) (n int) {\n\ts := structPointer_StructPointerSlice(base, p.field)\n\tl := s.Len()\n\n\tn += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup))\n\tn += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup))\n\tfor i := 0; i < l; i++ {\n\t\tb := s.Index(i)\n\t\tif structPointer_IsNil(b) {\n\t\t\treturn // return size up to this point\n\t\t}\n\n\t\tn += size_struct(p.sprop, b)\n\t}\n\treturn\n}\n\n// Encode an extension map.\nfunc (o *Buffer) enc_map(p *Properties, base structPointer) error {\n\texts := structPointer_ExtMap(base, p.field)\n\tif err := encodeExtensionsMap(*exts); err != nil {\n\t\treturn err\n\t}\n\n\treturn o.enc_map_body(*exts)\n}\n\nfunc (o *Buffer) enc_exts(p *Properties, base structPointer) error {\n\texts := structPointer_Extensions(base, p.field)\n\n\tv, mu := exts.extensionsRead()\n\tif v == nil {\n\t\treturn nil\n\t}\n\n\tmu.Lock()\n\tdefer mu.Unlock()\n\tif err := encodeExtensionsMap(v); err != nil {\n\t\treturn err\n\t}\n\n\treturn o.enc_map_body(v)\n}\n\nfunc (o *Buffer) enc_map_body(v map[int32]Extension) error {\n\t// Fast-path for common cases: zero or one extensions.\n\tif len(v) <= 1 {\n\t\tfor _, e := range v {\n\t\t\to.buf = append(o.buf, e.enc...)\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Sort keys to provide a deterministic encoding.\n\tkeys := make([]int, 0, len(v))\n\tfor k := range v {\n\t\tkeys = append(keys, int(k))\n\t}\n\tsort.Ints(keys)\n\n\tfor _, k := range keys {\n\t\to.buf = append(o.buf, v[int32(k)].enc...)\n\t}\n\treturn nil\n}\n\nfunc size_map(p *Properties, base structPointer) int {\n\tv := structPointer_ExtMap(base, p.field)\n\treturn extensionsMapSize(*v)\n}\n\nfunc size_exts(p *Properties, base structPointer) int {\n\tv := structPointer_Extensions(base, p.field)\n\treturn extensionsSize(v)\n}\n\n// Encode a map field.\nfunc (o *Buffer) enc_new_map(p *Properties, base structPointer) error {\n\tvar state errorState // XXX: or do we need to plumb this through?\n\n\t/*\n\t\tA map defined as\n\t\t\tmap<key_type, value_type> map_field = N;\n\t\tis encoded in the same way as\n\t\t\tmessage MapFieldEntry {\n\t\t\t\tkey_type key = 1;\n\t\t\t\tvalue_type value = 2;\n\t\t\t}\n\t\t\trepeated MapFieldEntry map_field = N;\n\t*/\n\n\tv := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V\n\tif v.Len() == 0 {\n\t\treturn nil\n\t}\n\n\tkeycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype)\n\n\tenc := func() error {\n\t\tif err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t}\n\n\t// Don't sort map keys. It is not required by the spec, and C++ doesn't do it.\n\tfor _, key := range v.MapKeys() {\n\t\tval := v.MapIndex(key)\n\n\t\tkeycopy.Set(key)\n\t\tvalcopy.Set(val)\n\n\t\to.buf = append(o.buf, p.tagcode...)\n\t\tif err := o.enc_len_thing(enc, &state); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc size_new_map(p *Properties, base structPointer) int {\n\tv := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V\n\n\tkeycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype)\n\n\tn := 0\n\tfor _, key := range v.MapKeys() {\n\t\tval := v.MapIndex(key)\n\t\tkeycopy.Set(key)\n\t\tvalcopy.Set(val)\n\n\t\t// Tag codes for key and val are the responsibility of the sub-sizer.\n\t\tkeysize := p.mkeyprop.size(p.mkeyprop, keybase)\n\t\tvalsize := p.mvalprop.size(p.mvalprop, valbase)\n\t\tentry := keysize + valsize\n\t\t// Add on tag code and length of map entry itself.\n\t\tn += len(p.tagcode) + sizeVarint(uint64(entry)) + entry\n\t}\n\treturn n\n}\n\n// mapEncodeScratch returns a new reflect.Value matching the map's value type,\n// and a structPointer suitable for passing to an encoder or sizer.\nfunc mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) {\n\t// Prepare addressable doubly-indirect placeholders for the key and value types.\n\t// This is needed because the element-type encoders expect **T, but the map iteration produces T.\n\n\tkeycopy = reflect.New(mapType.Key()).Elem()                 // addressable K\n\tkeyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K\n\tkeyptr.Set(keycopy.Addr())                                  //\n\tkeybase = toStructPointer(keyptr.Addr())                    // **K\n\n\t// Value types are more varied and require special handling.\n\tswitch mapType.Elem().Kind() {\n\tcase reflect.Slice:\n\t\t// []byte\n\t\tvar dummy []byte\n\t\tvalcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte\n\t\tvalbase = toStructPointer(valcopy.Addr())\n\tcase reflect.Ptr:\n\t\t// message; the generated field type is map[K]*Msg (so V is *Msg),\n\t\t// so we only need one level of indirection.\n\t\tvalcopy = reflect.New(mapType.Elem()).Elem() // addressable V\n\t\tvalbase = toStructPointer(valcopy.Addr())\n\tdefault:\n\t\t// everything else\n\t\tvalcopy = reflect.New(mapType.Elem()).Elem()                // addressable V\n\t\tvalptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V\n\t\tvalptr.Set(valcopy.Addr())                                  //\n\t\tvalbase = toStructPointer(valptr.Addr())                    // **V\n\t}\n\treturn\n}\n\n// Encode a struct.\nfunc (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error {\n\tvar state errorState\n\t// Encode fields in tag order so that decoders may use optimizations\n\t// that depend on the ordering.\n\t// https://developers.google.com/protocol-buffers/docs/encoding#order\n\tfor _, i := range prop.order {\n\t\tp := prop.Prop[i]\n\t\tif p.enc != nil {\n\t\t\terr := p.enc(o, p, base)\n\t\t\tif err != nil {\n\t\t\t\tif err == ErrNil {\n\t\t\t\t\tif p.Required && state.err == nil {\n\t\t\t\t\t\tstate.err = &RequiredNotSetError{p.Name}\n\t\t\t\t\t}\n\t\t\t\t} else if err == errRepeatedHasNil {\n\t\t\t\t\t// Give more context to nil values in repeated fields.\n\t\t\t\t\treturn errors.New(\"repeated field \" + p.OrigName + \" has nil element\")\n\t\t\t\t} else if !state.shouldContinue(err, p) {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tif len(o.buf) > maxMarshalSize {\n\t\t\t\treturn ErrTooLarge\n\t\t\t}\n\t\t}\n\t}\n\n\t// Do oneof fields.\n\tif prop.oneofMarshaler != nil {\n\t\tm := structPointer_Interface(base, prop.stype).(Message)\n\t\tif err := prop.oneofMarshaler(m, o); err == ErrNil {\n\t\t\treturn errOneofHasNil\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Add unrecognized fields at the end.\n\tif prop.unrecField.IsValid() {\n\t\tv := *structPointer_Bytes(base, prop.unrecField)\n\t\tif len(o.buf)+len(v) > maxMarshalSize {\n\t\t\treturn ErrTooLarge\n\t\t}\n\t\tif len(v) > 0 {\n\t\t\to.buf = append(o.buf, v...)\n\t\t}\n\t}\n\n\treturn state.err\n}\n\nfunc size_struct(prop *StructProperties, base structPointer) (n int) {\n\tfor _, i := range prop.order {\n\t\tp := prop.Prop[i]\n\t\tif p.size != nil {\n\t\t\tn += p.size(p, base)\n\t\t}\n\t}\n\n\t// Add unrecognized fields at the end.\n\tif prop.unrecField.IsValid() {\n\t\tv := *structPointer_Bytes(base, prop.unrecField)\n\t\tn += len(v)\n\t}\n\n\t// Factor in any oneof fields.\n\tif prop.oneofSizer != nil {\n\t\tm := structPointer_Interface(base, prop.stype).(Message)\n\t\tn += prop.oneofSizer(m)\n\t}\n\n\treturn\n}\n\nvar zeroes [20]byte // longer than any conceivable sizeVarint\n\n// Encode a struct, preceded by its encoded length (as a varint).\nfunc (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error {\n\treturn o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state)\n}\n\n// Encode something, preceded by its encoded length (as a varint).\nfunc (o *Buffer) enc_len_thing(enc func() error, state *errorState) error {\n\tiLen := len(o.buf)\n\to.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length\n\tiMsg := len(o.buf)\n\terr := enc()\n\tif err != nil && !state.shouldContinue(err, nil) {\n\t\treturn err\n\t}\n\tlMsg := len(o.buf) - iMsg\n\tlLen := sizeVarint(uint64(lMsg))\n\tswitch x := lLen - (iMsg - iLen); {\n\tcase x > 0: // actual length is x bytes larger than the space we reserved\n\t\t// Move msg x bytes right.\n\t\to.buf = append(o.buf, zeroes[:x]...)\n\t\tcopy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg])\n\tcase x < 0: // actual length is x bytes smaller than the space we reserved\n\t\t// Move msg x bytes left.\n\t\tcopy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg])\n\t\to.buf = o.buf[:len(o.buf)+x] // x is negative\n\t}\n\t// Encode the length in the reserved space.\n\to.buf = o.buf[:iLen]\n\to.EncodeVarint(uint64(lMsg))\n\to.buf = o.buf[:len(o.buf)+lMsg]\n\treturn state.err\n}\n\n// errorState maintains the first error that occurs and updates that error\n// with additional context.\ntype errorState struct {\n\terr error\n}\n\n// shouldContinue reports whether encoding should continue upon encountering the\n// given error. If the error is RequiredNotSetError, shouldContinue returns true\n// and, if this is the first appearance of that error, remembers it for future\n// reporting.\n//\n// If prop is not nil, it may update any error with additional context about the\n// field with the error.\nfunc (s *errorState) shouldContinue(err error, prop *Properties) bool {\n\t// Ignore unset required fields.\n\treqNotSet, ok := err.(*RequiredNotSetError)\n\tif !ok {\n\t\treturn false\n\t}\n\tif s.err == nil {\n\t\tif prop != nil {\n\t\t\terr = &RequiredNotSetError{prop.Name + \".\" + reqNotSet.field}\n\t\t}\n\t\ts.err = err\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/equal.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2011 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Protocol buffer comparison.\n\npackage proto\n\nimport (\n\t\"bytes\"\n\t\"log\"\n\t\"reflect\"\n\t\"strings\"\n)\n\n/*\nEqual returns true iff protocol buffers a and b are equal.\nThe arguments must both be pointers to protocol buffer structs.\n\nEquality is defined in this way:\n  - Two messages are equal iff they are the same type,\n    corresponding fields are equal, unknown field sets\n    are equal, and extensions sets are equal.\n  - Two set scalar fields are equal iff their values are equal.\n    If the fields are of a floating-point type, remember that\n    NaN != x for all x, including NaN. If the message is defined\n    in a proto3 .proto file, fields are not \"set\"; specifically,\n    zero length proto3 \"bytes\" fields are equal (nil == {}).\n  - Two repeated fields are equal iff their lengths are the same,\n    and their corresponding elements are equal. Note a \"bytes\" field,\n    although represented by []byte, is not a repeated field and the\n    rule for the scalar fields described above applies.\n  - Two unset fields are equal.\n  - Two unknown field sets are equal if their current\n    encoded state is equal.\n  - Two extension sets are equal iff they have corresponding\n    elements that are pairwise equal.\n  - Two map fields are equal iff their lengths are the same,\n    and they contain the same set of elements. Zero-length map\n    fields are equal.\n  - Every other combination of things are not equal.\n\nThe return value is undefined if a and b are not protocol buffers.\n*/\nfunc Equal(a, b Message) bool {\n\tif a == nil || b == nil {\n\t\treturn a == b\n\t}\n\tv1, v2 := reflect.ValueOf(a), reflect.ValueOf(b)\n\tif v1.Type() != v2.Type() {\n\t\treturn false\n\t}\n\tif v1.Kind() == reflect.Ptr {\n\t\tif v1.IsNil() {\n\t\t\treturn v2.IsNil()\n\t\t}\n\t\tif v2.IsNil() {\n\t\t\treturn false\n\t\t}\n\t\tv1, v2 = v1.Elem(), v2.Elem()\n\t}\n\tif v1.Kind() != reflect.Struct {\n\t\treturn false\n\t}\n\treturn equalStruct(v1, v2)\n}\n\n// v1 and v2 are known to have the same type.\nfunc equalStruct(v1, v2 reflect.Value) bool {\n\tsprop := GetProperties(v1.Type())\n\tfor i := 0; i < v1.NumField(); i++ {\n\t\tf := v1.Type().Field(i)\n\t\tif strings.HasPrefix(f.Name, \"XXX_\") {\n\t\t\tcontinue\n\t\t}\n\t\tf1, f2 := v1.Field(i), v2.Field(i)\n\t\tif f.Type.Kind() == reflect.Ptr {\n\t\t\tif n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 {\n\t\t\t\t// both unset\n\t\t\t\tcontinue\n\t\t\t} else if n1 != n2 {\n\t\t\t\t// set/unset mismatch\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tb1, ok := f1.Interface().(raw)\n\t\t\tif ok {\n\t\t\t\tb2 := f2.Interface().(raw)\n\t\t\t\t// RawMessage\n\t\t\t\tif !bytes.Equal(b1.Bytes(), b2.Bytes()) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tf1, f2 = f1.Elem(), f2.Elem()\n\t\t}\n\t\tif !equalAny(f1, f2, sprop.Prop[i]) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tif em1 := v1.FieldByName(\"XXX_InternalExtensions\"); em1.IsValid() {\n\t\tem2 := v2.FieldByName(\"XXX_InternalExtensions\")\n\t\tif !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tif em1 := v1.FieldByName(\"XXX_extensions\"); em1.IsValid() {\n\t\tem2 := v2.FieldByName(\"XXX_extensions\")\n\t\tif !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tuf := v1.FieldByName(\"XXX_unrecognized\")\n\tif !uf.IsValid() {\n\t\treturn true\n\t}\n\n\tu1 := uf.Bytes()\n\tu2 := v2.FieldByName(\"XXX_unrecognized\").Bytes()\n\tif !bytes.Equal(u1, u2) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// v1 and v2 are known to have the same type.\n// prop may be nil.\nfunc equalAny(v1, v2 reflect.Value, prop *Properties) bool {\n\tif v1.Type() == protoMessageType {\n\t\tm1, _ := v1.Interface().(Message)\n\t\tm2, _ := v2.Interface().(Message)\n\t\treturn Equal(m1, m2)\n\t}\n\tswitch v1.Kind() {\n\tcase reflect.Bool:\n\t\treturn v1.Bool() == v2.Bool()\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn v1.Float() == v2.Float()\n\tcase reflect.Int32, reflect.Int64:\n\t\treturn v1.Int() == v2.Int()\n\tcase reflect.Interface:\n\t\t// Probably a oneof field; compare the inner values.\n\t\tn1, n2 := v1.IsNil(), v2.IsNil()\n\t\tif n1 || n2 {\n\t\t\treturn n1 == n2\n\t\t}\n\t\te1, e2 := v1.Elem(), v2.Elem()\n\t\tif e1.Type() != e2.Type() {\n\t\t\treturn false\n\t\t}\n\t\treturn equalAny(e1, e2, nil)\n\tcase reflect.Map:\n\t\tif v1.Len() != v2.Len() {\n\t\t\treturn false\n\t\t}\n\t\tfor _, key := range v1.MapKeys() {\n\t\t\tval2 := v2.MapIndex(key)\n\t\t\tif !val2.IsValid() {\n\t\t\t\t// This key was not found in the second map.\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif !equalAny(v1.MapIndex(key), val2, nil) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\tcase reflect.Ptr:\n\t\t// Maps may have nil values in them, so check for nil.\n\t\tif v1.IsNil() && v2.IsNil() {\n\t\t\treturn true\n\t\t}\n\t\tif v1.IsNil() != v2.IsNil() {\n\t\t\treturn false\n\t\t}\n\t\treturn equalAny(v1.Elem(), v2.Elem(), prop)\n\tcase reflect.Slice:\n\t\tif v1.Type().Elem().Kind() == reflect.Uint8 {\n\t\t\t// short circuit: []byte\n\n\t\t\t// Edge case: if this is in a proto3 message, a zero length\n\t\t\t// bytes field is considered the zero value.\n\t\t\tif prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tif v1.IsNil() != v2.IsNil() {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte))\n\t\t}\n\n\t\tif v1.Len() != v2.Len() {\n\t\t\treturn false\n\t\t}\n\t\tfor i := 0; i < v1.Len(); i++ {\n\t\t\tif !equalAny(v1.Index(i), v2.Index(i), prop) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\tcase reflect.String:\n\t\treturn v1.Interface().(string) == v2.Interface().(string)\n\tcase reflect.Struct:\n\t\treturn equalStruct(v1, v2)\n\tcase reflect.Uint32, reflect.Uint64:\n\t\treturn v1.Uint() == v2.Uint()\n\t}\n\n\t// unknown type, so not a protocol buffer\n\tlog.Printf(\"proto: don't know how to compare %v\", v1)\n\treturn false\n}\n\n// base is the struct type that the extensions are based on.\n// x1 and x2 are InternalExtensions.\nfunc equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool {\n\tem1, _ := x1.extensionsRead()\n\tem2, _ := x2.extensionsRead()\n\treturn equalExtMap(base, em1, em2)\n}\n\nfunc equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool {\n\tif len(em1) != len(em2) {\n\t\treturn false\n\t}\n\n\tfor extNum, e1 := range em1 {\n\t\te2, ok := em2[extNum]\n\t\tif !ok {\n\t\t\treturn false\n\t\t}\n\n\t\tm1, m2 := e1.value, e2.value\n\n\t\tif m1 != nil && m2 != nil {\n\t\t\t// Both are unencoded.\n\t\t\tif !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// At least one is encoded. To do a semantically correct comparison\n\t\t// we need to unmarshal them first.\n\t\tvar desc *ExtensionDesc\n\t\tif m := extensionMaps[base]; m != nil {\n\t\t\tdesc = m[extNum]\n\t\t}\n\t\tif desc == nil {\n\t\t\tlog.Printf(\"proto: don't know how to compare extension %d of %v\", extNum, base)\n\t\t\tcontinue\n\t\t}\n\t\tvar err error\n\t\tif m1 == nil {\n\t\t\tm1, err = decodeExtension(e1.enc, desc)\n\t\t}\n\t\tif m2 == nil && err == nil {\n\t\t\tm2, err = decodeExtension(e2.enc, desc)\n\t\t}\n\t\tif err != nil {\n\t\t\t// The encoded form is invalid.\n\t\t\tlog.Printf(\"proto: badly encoded extension %d of %v: %v\", extNum, base, err)\n\t\t\treturn false\n\t\t}\n\t\tif !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/extensions.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage proto\n\n/*\n * Types and routines for supporting protocol buffer extensions.\n */\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"sync\"\n)\n\n// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message.\nvar ErrMissingExtension = errors.New(\"proto: missing extension\")\n\n// ExtensionRange represents a range of message extensions for a protocol buffer.\n// Used in code generated by the protocol compiler.\ntype ExtensionRange struct {\n\tStart, End int32 // both inclusive\n}\n\n// extendableProto is an interface implemented by any protocol buffer generated by the current\n// proto compiler that may be extended.\ntype extendableProto interface {\n\tMessage\n\tExtensionRangeArray() []ExtensionRange\n\textensionsWrite() map[int32]Extension\n\textensionsRead() (map[int32]Extension, sync.Locker)\n}\n\n// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous\n// version of the proto compiler that may be extended.\ntype extendableProtoV1 interface {\n\tMessage\n\tExtensionRangeArray() []ExtensionRange\n\tExtensionMap() map[int32]Extension\n}\n\n// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto.\ntype extensionAdapter struct {\n\textendableProtoV1\n}\n\nfunc (e extensionAdapter) extensionsWrite() map[int32]Extension {\n\treturn e.ExtensionMap()\n}\n\nfunc (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) {\n\treturn e.ExtensionMap(), notLocker{}\n}\n\n// notLocker is a sync.Locker whose Lock and Unlock methods are nops.\ntype notLocker struct{}\n\nfunc (n notLocker) Lock()   {}\nfunc (n notLocker) Unlock() {}\n\n// extendable returns the extendableProto interface for the given generated proto message.\n// If the proto message has the old extension format, it returns a wrapper that implements\n// the extendableProto interface.\nfunc extendable(p interface{}) (extendableProto, bool) {\n\tif ep, ok := p.(extendableProto); ok {\n\t\treturn ep, ok\n\t}\n\tif ep, ok := p.(extendableProtoV1); ok {\n\t\treturn extensionAdapter{ep}, ok\n\t}\n\treturn nil, false\n}\n\n// XXX_InternalExtensions is an internal representation of proto extensions.\n//\n// Each generated message struct type embeds an anonymous XXX_InternalExtensions field,\n// thus gaining the unexported 'extensions' method, which can be called only from the proto package.\n//\n// The methods of XXX_InternalExtensions are not concurrency safe in general,\n// but calls to logically read-only methods such as has and get may be executed concurrently.\ntype XXX_InternalExtensions struct {\n\t// The struct must be indirect so that if a user inadvertently copies a\n\t// generated message and its embedded XXX_InternalExtensions, they\n\t// avoid the mayhem of a copied mutex.\n\t//\n\t// The mutex serializes all logically read-only operations to p.extensionMap.\n\t// It is up to the client to ensure that write operations to p.extensionMap are\n\t// mutually exclusive with other accesses.\n\tp *struct {\n\t\tmu           sync.Mutex\n\t\textensionMap map[int32]Extension\n\t}\n}\n\n// extensionsWrite returns the extension map, creating it on first use.\nfunc (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension {\n\tif e.p == nil {\n\t\te.p = new(struct {\n\t\t\tmu           sync.Mutex\n\t\t\textensionMap map[int32]Extension\n\t\t})\n\t\te.p.extensionMap = make(map[int32]Extension)\n\t}\n\treturn e.p.extensionMap\n}\n\n// extensionsRead returns the extensions map for read-only use.  It may be nil.\n// The caller must hold the returned mutex's lock when accessing Elements within the map.\nfunc (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) {\n\tif e.p == nil {\n\t\treturn nil, nil\n\t}\n\treturn e.p.extensionMap, &e.p.mu\n}\n\nvar extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem()\nvar extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem()\n\n// ExtensionDesc represents an extension specification.\n// Used in generated code from the protocol compiler.\ntype ExtensionDesc struct {\n\tExtendedType  Message     // nil pointer to the type that is being extended\n\tExtensionType interface{} // nil pointer to the extension type\n\tField         int32       // field number\n\tName          string      // fully-qualified name of extension, for text formatting\n\tTag           string      // protobuf tag style\n\tFilename      string      // name of the file in which the extension is defined\n}\n\nfunc (ed *ExtensionDesc) repeated() bool {\n\tt := reflect.TypeOf(ed.ExtensionType)\n\treturn t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8\n}\n\n// Extension represents an extension in a message.\ntype Extension struct {\n\t// When an extension is stored in a message using SetExtension\n\t// only desc and value are set. When the message is marshaled\n\t// enc will be set to the encoded form of the message.\n\t//\n\t// When a message is unmarshaled and contains extensions, each\n\t// extension will have only enc set. When such an extension is\n\t// accessed using GetExtension (or GetExtensions) desc and value\n\t// will be set.\n\tdesc  *ExtensionDesc\n\tvalue interface{}\n\tenc   []byte\n}\n\n// SetRawExtension is for testing only.\nfunc SetRawExtension(base Message, id int32, b []byte) {\n\tepb, ok := extendable(base)\n\tif !ok {\n\t\treturn\n\t}\n\textmap := epb.extensionsWrite()\n\textmap[id] = Extension{enc: b}\n}\n\n// isExtensionField returns true iff the given field number is in an extension range.\nfunc isExtensionField(pb extendableProto, field int32) bool {\n\tfor _, er := range pb.ExtensionRangeArray() {\n\t\tif er.Start <= field && field <= er.End {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// checkExtensionTypes checks that the given extension is valid for pb.\nfunc checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error {\n\tvar pbi interface{} = pb\n\t// Check the extended type.\n\tif ea, ok := pbi.(extensionAdapter); ok {\n\t\tpbi = ea.extendableProtoV1\n\t}\n\tif a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b {\n\t\treturn errors.New(\"proto: bad extended type; \" + b.String() + \" does not extend \" + a.String())\n\t}\n\t// Check the range.\n\tif !isExtensionField(pb, extension.Field) {\n\t\treturn errors.New(\"proto: bad extension number; not in declared ranges\")\n\t}\n\treturn nil\n}\n\n// extPropKey is sufficient to uniquely identify an extension.\ntype extPropKey struct {\n\tbase  reflect.Type\n\tfield int32\n}\n\nvar extProp = struct {\n\tsync.RWMutex\n\tm map[extPropKey]*Properties\n}{\n\tm: make(map[extPropKey]*Properties),\n}\n\nfunc extensionProperties(ed *ExtensionDesc) *Properties {\n\tkey := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field}\n\n\textProp.RLock()\n\tif prop, ok := extProp.m[key]; ok {\n\t\textProp.RUnlock()\n\t\treturn prop\n\t}\n\textProp.RUnlock()\n\n\textProp.Lock()\n\tdefer extProp.Unlock()\n\t// Check again.\n\tif prop, ok := extProp.m[key]; ok {\n\t\treturn prop\n\t}\n\n\tprop := new(Properties)\n\tprop.Init(reflect.TypeOf(ed.ExtensionType), \"unknown_name\", ed.Tag, nil)\n\textProp.m[key] = prop\n\treturn prop\n}\n\n// encode encodes any unmarshaled (unencoded) extensions in e.\nfunc encodeExtensions(e *XXX_InternalExtensions) error {\n\tm, mu := e.extensionsRead()\n\tif m == nil {\n\t\treturn nil // fast path\n\t}\n\tmu.Lock()\n\tdefer mu.Unlock()\n\treturn encodeExtensionsMap(m)\n}\n\n// encode encodes any unmarshaled (unencoded) extensions in e.\nfunc encodeExtensionsMap(m map[int32]Extension) error {\n\tfor k, e := range m {\n\t\tif e.value == nil || e.desc == nil {\n\t\t\t// Extension is only in its encoded form.\n\t\t\tcontinue\n\t\t}\n\n\t\t// We don't skip extensions that have an encoded form set,\n\t\t// because the extension value may have been mutated after\n\t\t// the last time this function was called.\n\n\t\tet := reflect.TypeOf(e.desc.ExtensionType)\n\t\tprops := extensionProperties(e.desc)\n\n\t\tp := NewBuffer(nil)\n\t\t// If e.value has type T, the encoder expects a *struct{ X T }.\n\t\t// Pass a *T with a zero field and hope it all works out.\n\t\tx := reflect.New(et)\n\t\tx.Elem().Set(reflect.ValueOf(e.value))\n\t\tif err := props.enc(p, props, toStructPointer(x)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\te.enc = p.buf\n\t\tm[k] = e\n\t}\n\treturn nil\n}\n\nfunc extensionsSize(e *XXX_InternalExtensions) (n int) {\n\tm, mu := e.extensionsRead()\n\tif m == nil {\n\t\treturn 0\n\t}\n\tmu.Lock()\n\tdefer mu.Unlock()\n\treturn extensionsMapSize(m)\n}\n\nfunc extensionsMapSize(m map[int32]Extension) (n int) {\n\tfor _, e := range m {\n\t\tif e.value == nil || e.desc == nil {\n\t\t\t// Extension is only in its encoded form.\n\t\t\tn += len(e.enc)\n\t\t\tcontinue\n\t\t}\n\n\t\t// We don't skip extensions that have an encoded form set,\n\t\t// because the extension value may have been mutated after\n\t\t// the last time this function was called.\n\n\t\tet := reflect.TypeOf(e.desc.ExtensionType)\n\t\tprops := extensionProperties(e.desc)\n\n\t\t// If e.value has type T, the encoder expects a *struct{ X T }.\n\t\t// Pass a *T with a zero field and hope it all works out.\n\t\tx := reflect.New(et)\n\t\tx.Elem().Set(reflect.ValueOf(e.value))\n\t\tn += props.size(props, toStructPointer(x))\n\t}\n\treturn\n}\n\n// HasExtension returns whether the given extension is present in pb.\nfunc HasExtension(pb Message, extension *ExtensionDesc) bool {\n\t// TODO: Check types, field numbers, etc.?\n\tepb, ok := extendable(pb)\n\tif !ok {\n\t\treturn false\n\t}\n\textmap, mu := epb.extensionsRead()\n\tif extmap == nil {\n\t\treturn false\n\t}\n\tmu.Lock()\n\t_, ok = extmap[extension.Field]\n\tmu.Unlock()\n\treturn ok\n}\n\n// ClearExtension removes the given extension from pb.\nfunc ClearExtension(pb Message, extension *ExtensionDesc) {\n\tepb, ok := extendable(pb)\n\tif !ok {\n\t\treturn\n\t}\n\t// TODO: Check types, field numbers, etc.?\n\textmap := epb.extensionsWrite()\n\tdelete(extmap, extension.Field)\n}\n\n// GetExtension parses and returns the given extension of pb.\n// If the extension is not present and has no default value it returns ErrMissingExtension.\nfunc GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) {\n\tepb, ok := extendable(pb)\n\tif !ok {\n\t\treturn nil, errors.New(\"proto: not an extendable proto\")\n\t}\n\n\tif err := checkExtensionTypes(epb, extension); err != nil {\n\t\treturn nil, err\n\t}\n\n\temap, mu := epb.extensionsRead()\n\tif emap == nil {\n\t\treturn defaultExtensionValue(extension)\n\t}\n\tmu.Lock()\n\tdefer mu.Unlock()\n\te, ok := emap[extension.Field]\n\tif !ok {\n\t\t// defaultExtensionValue returns the default value or\n\t\t// ErrMissingExtension if there is no default.\n\t\treturn defaultExtensionValue(extension)\n\t}\n\n\tif e.value != nil {\n\t\t// Already decoded. Check the descriptor, though.\n\t\tif e.desc != extension {\n\t\t\t// This shouldn't happen. If it does, it means that\n\t\t\t// GetExtension was called twice with two different\n\t\t\t// descriptors with the same field number.\n\t\t\treturn nil, errors.New(\"proto: descriptor conflict\")\n\t\t}\n\t\treturn e.value, nil\n\t}\n\n\tv, err := decodeExtension(e.enc, extension)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Remember the decoded version and drop the encoded version.\n\t// That way it is safe to mutate what we return.\n\te.value = v\n\te.desc = extension\n\te.enc = nil\n\temap[extension.Field] = e\n\treturn e.value, nil\n}\n\n// defaultExtensionValue returns the default value for extension.\n// If no default for an extension is defined ErrMissingExtension is returned.\nfunc defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) {\n\tt := reflect.TypeOf(extension.ExtensionType)\n\tprops := extensionProperties(extension)\n\n\tsf, _, err := fieldDefault(t, props)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif sf == nil || sf.value == nil {\n\t\t// There is no default value.\n\t\treturn nil, ErrMissingExtension\n\t}\n\n\tif t.Kind() != reflect.Ptr {\n\t\t// We do not need to return a Ptr, we can directly return sf.value.\n\t\treturn sf.value, nil\n\t}\n\n\t// We need to return an interface{} that is a pointer to sf.value.\n\tvalue := reflect.New(t).Elem()\n\tvalue.Set(reflect.New(value.Type().Elem()))\n\tif sf.kind == reflect.Int32 {\n\t\t// We may have an int32 or an enum, but the underlying data is int32.\n\t\t// Since we can't set an int32 into a non int32 reflect.value directly\n\t\t// set it as a int32.\n\t\tvalue.Elem().SetInt(int64(sf.value.(int32)))\n\t} else {\n\t\tvalue.Elem().Set(reflect.ValueOf(sf.value))\n\t}\n\treturn value.Interface(), nil\n}\n\n// decodeExtension decodes an extension encoded in b.\nfunc decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) {\n\to := NewBuffer(b)\n\n\tt := reflect.TypeOf(extension.ExtensionType)\n\n\tprops := extensionProperties(extension)\n\n\t// t is a pointer to a struct, pointer to basic type or a slice.\n\t// Allocate a \"field\" to store the pointer/slice itself; the\n\t// pointer/slice will be stored here. We pass\n\t// the address of this field to props.dec.\n\t// This passes a zero field and a *t and lets props.dec\n\t// interpret it as a *struct{ x t }.\n\tvalue := reflect.New(t).Elem()\n\n\tfor {\n\t\t// Discard wire type and field number varint. It isn't needed.\n\t\tif _, err := o.DecodeVarint(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif err := props.dec(o, props, toStructPointer(value.Addr())); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif o.index >= len(o.buf) {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn value.Interface(), nil\n}\n\n// GetExtensions returns a slice of the extensions present in pb that are also listed in es.\n// The returned slice has the same length as es; missing extensions will appear as nil elements.\nfunc GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) {\n\tepb, ok := extendable(pb)\n\tif !ok {\n\t\treturn nil, errors.New(\"proto: not an extendable proto\")\n\t}\n\textensions = make([]interface{}, len(es))\n\tfor i, e := range es {\n\t\textensions[i], err = GetExtension(epb, e)\n\t\tif err == ErrMissingExtension {\n\t\t\terr = nil\n\t\t}\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\n// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order.\n// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing\n// just the Field field, which defines the extension's field number.\nfunc ExtensionDescs(pb Message) ([]*ExtensionDesc, error) {\n\tepb, ok := extendable(pb)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"proto: %T is not an extendable proto.Message\", pb)\n\t}\n\tregisteredExtensions := RegisteredExtensions(pb)\n\n\temap, mu := epb.extensionsRead()\n\tif emap == nil {\n\t\treturn nil, nil\n\t}\n\tmu.Lock()\n\tdefer mu.Unlock()\n\textensions := make([]*ExtensionDesc, 0, len(emap))\n\tfor extid, e := range emap {\n\t\tdesc := e.desc\n\t\tif desc == nil {\n\t\t\tdesc = registeredExtensions[extid]\n\t\t\tif desc == nil {\n\t\t\t\tdesc = &ExtensionDesc{Field: extid}\n\t\t\t}\n\t\t}\n\n\t\textensions = append(extensions, desc)\n\t}\n\treturn extensions, nil\n}\n\n// SetExtension sets the specified extension of pb to the specified value.\nfunc SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error {\n\tepb, ok := extendable(pb)\n\tif !ok {\n\t\treturn errors.New(\"proto: not an extendable proto\")\n\t}\n\tif err := checkExtensionTypes(epb, extension); err != nil {\n\t\treturn err\n\t}\n\ttyp := reflect.TypeOf(extension.ExtensionType)\n\tif typ != reflect.TypeOf(value) {\n\t\treturn errors.New(\"proto: bad extension value type\")\n\t}\n\t// nil extension values need to be caught early, because the\n\t// encoder can't distinguish an ErrNil due to a nil extension\n\t// from an ErrNil due to a missing field. Extensions are\n\t// always optional, so the encoder would just swallow the error\n\t// and drop all the extensions from the encoded message.\n\tif reflect.ValueOf(value).IsNil() {\n\t\treturn fmt.Errorf(\"proto: SetExtension called with nil value of type %T\", value)\n\t}\n\n\textmap := epb.extensionsWrite()\n\textmap[extension.Field] = Extension{desc: extension, value: value}\n\treturn nil\n}\n\n// ClearAllExtensions clears all extensions from pb.\nfunc ClearAllExtensions(pb Message) {\n\tepb, ok := extendable(pb)\n\tif !ok {\n\t\treturn\n\t}\n\tm := epb.extensionsWrite()\n\tfor k := range m {\n\t\tdelete(m, k)\n\t}\n}\n\n// A global registry of extensions.\n// The generated code will register the generated descriptors by calling RegisterExtension.\n\nvar extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc)\n\n// RegisterExtension is called from the generated code.\nfunc RegisterExtension(desc *ExtensionDesc) {\n\tst := reflect.TypeOf(desc.ExtendedType).Elem()\n\tm := extensionMaps[st]\n\tif m == nil {\n\t\tm = make(map[int32]*ExtensionDesc)\n\t\textensionMaps[st] = m\n\t}\n\tif _, ok := m[desc.Field]; ok {\n\t\tpanic(\"proto: duplicate extension registered: \" + st.String() + \" \" + strconv.Itoa(int(desc.Field)))\n\t}\n\tm[desc.Field] = desc\n}\n\n// RegisteredExtensions returns a map of the registered extensions of a\n// protocol buffer struct, indexed by the extension number.\n// The argument pb should be a nil pointer to the struct type.\nfunc RegisteredExtensions(pb Message) map[int32]*ExtensionDesc {\n\treturn extensionMaps[reflect.TypeOf(pb).Elem()]\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/lib.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n/*\nPackage proto converts data structures to and from the wire format of\nprotocol buffers.  It works in concert with the Go source code generated\nfor .proto files by the protocol compiler.\n\nA summary of the properties of the protocol buffer interface\nfor a protocol buffer variable v:\n\n  - Names are turned from camel_case to CamelCase for export.\n  - There are no methods on v to set fields; just treat\n\tthem as structure fields.\n  - There are getters that return a field's value if set,\n\tand return the field's default value if unset.\n\tThe getters work even if the receiver is a nil message.\n  - The zero value for a struct is its correct initialization state.\n\tAll desired fields must be set before marshaling.\n  - A Reset() method will restore a protobuf struct to its zero state.\n  - Non-repeated fields are pointers to the values; nil means unset.\n\tThat is, optional or required field int32 f becomes F *int32.\n  - Repeated fields are slices.\n  - Helper functions are available to aid the setting of fields.\n\tmsg.Foo = proto.String(\"hello\") // set field\n  - Constants are defined to hold the default values of all fields that\n\thave them.  They have the form Default_StructName_FieldName.\n\tBecause the getter methods handle defaulted values,\n\tdirect use of these constants should be rare.\n  - Enums are given type names and maps from names to values.\n\tEnum values are prefixed by the enclosing message's name, or by the\n\tenum's type name if it is a top-level enum. Enum types have a String\n\tmethod, and a Enum method to assist in message construction.\n  - Nested messages, groups and enums have type names prefixed with the name of\n\tthe surrounding message type.\n  - Extensions are given descriptor names that start with E_,\n\tfollowed by an underscore-delimited list of the nested messages\n\tthat contain it (if any) followed by the CamelCased name of the\n\textension field itself.  HasExtension, ClearExtension, GetExtension\n\tand SetExtension are functions for manipulating extensions.\n  - Oneof field sets are given a single field in their message,\n\twith distinguished wrapper types for each possible field value.\n  - Marshal and Unmarshal are functions to encode and decode the wire format.\n\nWhen the .proto file specifies `syntax=\"proto3\"`, there are some differences:\n\n  - Non-repeated fields of non-message type are values instead of pointers.\n  - Enum types do not get an Enum method.\n\nThe simplest way to describe this is to see an example.\nGiven file test.proto, containing\n\n\tpackage example;\n\n\tenum FOO { X = 17; }\n\n\tmessage Test {\n\t  required string label = 1;\n\t  optional int32 type = 2 [default=77];\n\t  repeated int64 reps = 3;\n\t  optional group OptionalGroup = 4 {\n\t    required string RequiredField = 5;\n\t  }\n\t  oneof union {\n\t    int32 number = 6;\n\t    string name = 7;\n\t  }\n\t}\n\nThe resulting file, test.pb.go, is:\n\n\tpackage example\n\n\timport proto \"github.com/golang/protobuf/proto\"\n\timport math \"math\"\n\n\ttype FOO int32\n\tconst (\n\t\tFOO_X FOO = 17\n\t)\n\tvar FOO_name = map[int32]string{\n\t\t17: \"X\",\n\t}\n\tvar FOO_value = map[string]int32{\n\t\t\"X\": 17,\n\t}\n\n\tfunc (x FOO) Enum() *FOO {\n\t\tp := new(FOO)\n\t\t*p = x\n\t\treturn p\n\t}\n\tfunc (x FOO) String() string {\n\t\treturn proto.EnumName(FOO_name, int32(x))\n\t}\n\tfunc (x *FOO) UnmarshalJSON(data []byte) error {\n\t\tvalue, err := proto.UnmarshalJSONEnum(FOO_value, data)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*x = FOO(value)\n\t\treturn nil\n\t}\n\n\ttype Test struct {\n\t\tLabel         *string             `protobuf:\"bytes,1,req,name=label\" json:\"label,omitempty\"`\n\t\tType          *int32              `protobuf:\"varint,2,opt,name=type,def=77\" json:\"type,omitempty\"`\n\t\tReps          []int64             `protobuf:\"varint,3,rep,name=reps\" json:\"reps,omitempty\"`\n\t\tOptionalgroup *Test_OptionalGroup `protobuf:\"group,4,opt,name=OptionalGroup\" json:\"optionalgroup,omitempty\"`\n\t\t// Types that are valid to be assigned to Union:\n\t\t//\t*Test_Number\n\t\t//\t*Test_Name\n\t\tUnion            isTest_Union `protobuf_oneof:\"union\"`\n\t\tXXX_unrecognized []byte       `json:\"-\"`\n\t}\n\tfunc (m *Test) Reset()         { *m = Test{} }\n\tfunc (m *Test) String() string { return proto.CompactTextString(m) }\n\tfunc (*Test) ProtoMessage() {}\n\n\ttype isTest_Union interface {\n\t\tisTest_Union()\n\t}\n\n\ttype Test_Number struct {\n\t\tNumber int32 `protobuf:\"varint,6,opt,name=number\"`\n\t}\n\ttype Test_Name struct {\n\t\tName string `protobuf:\"bytes,7,opt,name=name\"`\n\t}\n\n\tfunc (*Test_Number) isTest_Union() {}\n\tfunc (*Test_Name) isTest_Union()   {}\n\n\tfunc (m *Test) GetUnion() isTest_Union {\n\t\tif m != nil {\n\t\t\treturn m.Union\n\t\t}\n\t\treturn nil\n\t}\n\tconst Default_Test_Type int32 = 77\n\n\tfunc (m *Test) GetLabel() string {\n\t\tif m != nil && m.Label != nil {\n\t\t\treturn *m.Label\n\t\t}\n\t\treturn \"\"\n\t}\n\n\tfunc (m *Test) GetType() int32 {\n\t\tif m != nil && m.Type != nil {\n\t\t\treturn *m.Type\n\t\t}\n\t\treturn Default_Test_Type\n\t}\n\n\tfunc (m *Test) GetOptionalgroup() *Test_OptionalGroup {\n\t\tif m != nil {\n\t\t\treturn m.Optionalgroup\n\t\t}\n\t\treturn nil\n\t}\n\n\ttype Test_OptionalGroup struct {\n\t\tRequiredField *string `protobuf:\"bytes,5,req\" json:\"RequiredField,omitempty\"`\n\t}\n\tfunc (m *Test_OptionalGroup) Reset()         { *m = Test_OptionalGroup{} }\n\tfunc (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) }\n\n\tfunc (m *Test_OptionalGroup) GetRequiredField() string {\n\t\tif m != nil && m.RequiredField != nil {\n\t\t\treturn *m.RequiredField\n\t\t}\n\t\treturn \"\"\n\t}\n\n\tfunc (m *Test) GetNumber() int32 {\n\t\tif x, ok := m.GetUnion().(*Test_Number); ok {\n\t\t\treturn x.Number\n\t\t}\n\t\treturn 0\n\t}\n\n\tfunc (m *Test) GetName() string {\n\t\tif x, ok := m.GetUnion().(*Test_Name); ok {\n\t\t\treturn x.Name\n\t\t}\n\t\treturn \"\"\n\t}\n\n\tfunc init() {\n\t\tproto.RegisterEnum(\"example.FOO\", FOO_name, FOO_value)\n\t}\n\nTo create and play with a Test object:\n\n\tpackage main\n\n\timport (\n\t\t\"log\"\n\n\t\t\"github.com/golang/protobuf/proto\"\n\t\tpb \"./example.pb\"\n\t)\n\n\tfunc main() {\n\t\ttest := &pb.Test{\n\t\t\tLabel: proto.String(\"hello\"),\n\t\t\tType:  proto.Int32(17),\n\t\t\tReps:  []int64{1, 2, 3},\n\t\t\tOptionalgroup: &pb.Test_OptionalGroup{\n\t\t\t\tRequiredField: proto.String(\"good bye\"),\n\t\t\t},\n\t\t\tUnion: &pb.Test_Name{\"fred\"},\n\t\t}\n\t\tdata, err := proto.Marshal(test)\n\t\tif err != nil {\n\t\t\tlog.Fatal(\"marshaling error: \", err)\n\t\t}\n\t\tnewTest := &pb.Test{}\n\t\terr = proto.Unmarshal(data, newTest)\n\t\tif err != nil {\n\t\t\tlog.Fatal(\"unmarshaling error: \", err)\n\t\t}\n\t\t// Now test and newTest contain the same data.\n\t\tif test.GetLabel() != newTest.GetLabel() {\n\t\t\tlog.Fatalf(\"data mismatch %q != %q\", test.GetLabel(), newTest.GetLabel())\n\t\t}\n\t\t// Use a type switch to determine which oneof was set.\n\t\tswitch u := test.Union.(type) {\n\t\tcase *pb.Test_Number: // u.Number contains the number.\n\t\tcase *pb.Test_Name: // u.Name contains the string.\n\t\t}\n\t\t// etc.\n\t}\n*/\npackage proto\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n\t\"sync\"\n)\n\n// Message is implemented by generated protocol buffer messages.\ntype Message interface {\n\tReset()\n\tString() string\n\tProtoMessage()\n}\n\n// Stats records allocation details about the protocol buffer encoders\n// and decoders.  Useful for tuning the library itself.\ntype Stats struct {\n\tEmalloc uint64 // mallocs in encode\n\tDmalloc uint64 // mallocs in decode\n\tEncode  uint64 // number of encodes\n\tDecode  uint64 // number of decodes\n\tChit    uint64 // number of cache hits\n\tCmiss   uint64 // number of cache misses\n\tSize    uint64 // number of sizes\n}\n\n// Set to true to enable stats collection.\nconst collectStats = false\n\nvar stats Stats\n\n// GetStats returns a copy of the global Stats structure.\nfunc GetStats() Stats { return stats }\n\n// A Buffer is a buffer manager for marshaling and unmarshaling\n// protocol buffers.  It may be reused between invocations to\n// reduce memory usage.  It is not necessary to use a Buffer;\n// the global functions Marshal and Unmarshal create a\n// temporary Buffer and are fine for most applications.\ntype Buffer struct {\n\tbuf   []byte // encode/decode byte stream\n\tindex int    // read point\n\n\t// pools of basic types to amortize allocation.\n\tbools   []bool\n\tuint32s []uint32\n\tuint64s []uint64\n\n\t// extra pools, only used with pointer_reflect.go\n\tint32s   []int32\n\tint64s   []int64\n\tfloat32s []float32\n\tfloat64s []float64\n}\n\n// NewBuffer allocates a new Buffer and initializes its internal data to\n// the contents of the argument slice.\nfunc NewBuffer(e []byte) *Buffer {\n\treturn &Buffer{buf: e}\n}\n\n// Reset resets the Buffer, ready for marshaling a new protocol buffer.\nfunc (p *Buffer) Reset() {\n\tp.buf = p.buf[0:0] // for reading/writing\n\tp.index = 0        // for reading\n}\n\n// SetBuf replaces the internal buffer with the slice,\n// ready for unmarshaling the contents of the slice.\nfunc (p *Buffer) SetBuf(s []byte) {\n\tp.buf = s\n\tp.index = 0\n}\n\n// Bytes returns the contents of the Buffer.\nfunc (p *Buffer) Bytes() []byte { return p.buf }\n\n/*\n * Helper routines for simplifying the creation of optional fields of basic type.\n */\n\n// Bool is a helper routine that allocates a new bool value\n// to store v and returns a pointer to it.\nfunc Bool(v bool) *bool {\n\treturn &v\n}\n\n// Int32 is a helper routine that allocates a new int32 value\n// to store v and returns a pointer to it.\nfunc Int32(v int32) *int32 {\n\treturn &v\n}\n\n// Int is a helper routine that allocates a new int32 value\n// to store v and returns a pointer to it, but unlike Int32\n// its argument value is an int.\nfunc Int(v int) *int32 {\n\tp := new(int32)\n\t*p = int32(v)\n\treturn p\n}\n\n// Int64 is a helper routine that allocates a new int64 value\n// to store v and returns a pointer to it.\nfunc Int64(v int64) *int64 {\n\treturn &v\n}\n\n// Float32 is a helper routine that allocates a new float32 value\n// to store v and returns a pointer to it.\nfunc Float32(v float32) *float32 {\n\treturn &v\n}\n\n// Float64 is a helper routine that allocates a new float64 value\n// to store v and returns a pointer to it.\nfunc Float64(v float64) *float64 {\n\treturn &v\n}\n\n// Uint32 is a helper routine that allocates a new uint32 value\n// to store v and returns a pointer to it.\nfunc Uint32(v uint32) *uint32 {\n\treturn &v\n}\n\n// Uint64 is a helper routine that allocates a new uint64 value\n// to store v and returns a pointer to it.\nfunc Uint64(v uint64) *uint64 {\n\treturn &v\n}\n\n// String is a helper routine that allocates a new string value\n// to store v and returns a pointer to it.\nfunc String(v string) *string {\n\treturn &v\n}\n\n// EnumName is a helper function to simplify printing protocol buffer enums\n// by name.  Given an enum map and a value, it returns a useful string.\nfunc EnumName(m map[int32]string, v int32) string {\n\ts, ok := m[v]\n\tif ok {\n\t\treturn s\n\t}\n\treturn strconv.Itoa(int(v))\n}\n\n// UnmarshalJSONEnum is a helper function to simplify recovering enum int values\n// from their JSON-encoded representation. Given a map from the enum's symbolic\n// names to its int values, and a byte buffer containing the JSON-encoded\n// value, it returns an int32 that can be cast to the enum type by the caller.\n//\n// The function can deal with both JSON representations, numeric and symbolic.\nfunc UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) {\n\tif data[0] == '\"' {\n\t\t// New style: enums are strings.\n\t\tvar repr string\n\t\tif err := json.Unmarshal(data, &repr); err != nil {\n\t\t\treturn -1, err\n\t\t}\n\t\tval, ok := m[repr]\n\t\tif !ok {\n\t\t\treturn 0, fmt.Errorf(\"unrecognized enum %s value %q\", enumName, repr)\n\t\t}\n\t\treturn val, nil\n\t}\n\t// Old style: enums are ints.\n\tvar val int32\n\tif err := json.Unmarshal(data, &val); err != nil {\n\t\treturn 0, fmt.Errorf(\"cannot unmarshal %#q into enum %s\", data, enumName)\n\t}\n\treturn val, nil\n}\n\n// DebugPrint dumps the encoded data in b in a debugging format with a header\n// including the string s. Used in testing but made available for general debugging.\nfunc (p *Buffer) DebugPrint(s string, b []byte) {\n\tvar u uint64\n\n\tobuf := p.buf\n\tindex := p.index\n\tp.buf = b\n\tp.index = 0\n\tdepth := 0\n\n\tfmt.Printf(\"\\n--- %s ---\\n\", s)\n\nout:\n\tfor {\n\t\tfor i := 0; i < depth; i++ {\n\t\t\tfmt.Print(\"  \")\n\t\t}\n\n\t\tindex := p.index\n\t\tif index == len(p.buf) {\n\t\t\tbreak\n\t\t}\n\n\t\top, err := p.DecodeVarint()\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"%3d: fetching op err %v\\n\", index, err)\n\t\t\tbreak out\n\t\t}\n\t\ttag := op >> 3\n\t\twire := op & 7\n\n\t\tswitch wire {\n\t\tdefault:\n\t\t\tfmt.Printf(\"%3d: t=%3d unknown wire=%d\\n\",\n\t\t\t\tindex, tag, wire)\n\t\t\tbreak out\n\n\t\tcase WireBytes:\n\t\t\tvar r []byte\n\n\t\t\tr, err = p.DecodeRawBytes(false)\n\t\t\tif err != nil {\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tfmt.Printf(\"%3d: t=%3d bytes [%d]\", index, tag, len(r))\n\t\t\tif len(r) <= 6 {\n\t\t\t\tfor i := 0; i < len(r); i++ {\n\t\t\t\t\tfmt.Printf(\" %.2x\", r[i])\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor i := 0; i < 3; i++ {\n\t\t\t\t\tfmt.Printf(\" %.2x\", r[i])\n\t\t\t\t}\n\t\t\t\tfmt.Printf(\" ..\")\n\t\t\t\tfor i := len(r) - 3; i < len(r); i++ {\n\t\t\t\t\tfmt.Printf(\" %.2x\", r[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\tfmt.Printf(\"\\n\")\n\n\t\tcase WireFixed32:\n\t\t\tu, err = p.DecodeFixed32()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"%3d: t=%3d fix32 err %v\\n\", index, tag, err)\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tfmt.Printf(\"%3d: t=%3d fix32 %d\\n\", index, tag, u)\n\n\t\tcase WireFixed64:\n\t\t\tu, err = p.DecodeFixed64()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"%3d: t=%3d fix64 err %v\\n\", index, tag, err)\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tfmt.Printf(\"%3d: t=%3d fix64 %d\\n\", index, tag, u)\n\n\t\tcase WireVarint:\n\t\t\tu, err = p.DecodeVarint()\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"%3d: t=%3d varint err %v\\n\", index, tag, err)\n\t\t\t\tbreak out\n\t\t\t}\n\t\t\tfmt.Printf(\"%3d: t=%3d varint %d\\n\", index, tag, u)\n\n\t\tcase WireStartGroup:\n\t\t\tfmt.Printf(\"%3d: t=%3d start\\n\", index, tag)\n\t\t\tdepth++\n\n\t\tcase WireEndGroup:\n\t\t\tdepth--\n\t\t\tfmt.Printf(\"%3d: t=%3d end\\n\", index, tag)\n\t\t}\n\t}\n\n\tif depth != 0 {\n\t\tfmt.Printf(\"%3d: start-end not balanced %d\\n\", p.index, depth)\n\t}\n\tfmt.Printf(\"\\n\")\n\n\tp.buf = obuf\n\tp.index = index\n}\n\n// SetDefaults sets unset protocol buffer fields to their default values.\n// It only modifies fields that are both unset and have defined defaults.\n// It recursively sets default values in any non-nil sub-messages.\nfunc SetDefaults(pb Message) {\n\tsetDefaults(reflect.ValueOf(pb), true, false)\n}\n\n// v is a pointer to a struct.\nfunc setDefaults(v reflect.Value, recur, zeros bool) {\n\tv = v.Elem()\n\n\tdefaultMu.RLock()\n\tdm, ok := defaults[v.Type()]\n\tdefaultMu.RUnlock()\n\tif !ok {\n\t\tdm = buildDefaultMessage(v.Type())\n\t\tdefaultMu.Lock()\n\t\tdefaults[v.Type()] = dm\n\t\tdefaultMu.Unlock()\n\t}\n\n\tfor _, sf := range dm.scalars {\n\t\tf := v.Field(sf.index)\n\t\tif !f.IsNil() {\n\t\t\t// field already set\n\t\t\tcontinue\n\t\t}\n\t\tdv := sf.value\n\t\tif dv == nil && !zeros {\n\t\t\t// no explicit default, and don't want to set zeros\n\t\t\tcontinue\n\t\t}\n\t\tfptr := f.Addr().Interface() // **T\n\t\t// TODO: Consider batching the allocations we do here.\n\t\tswitch sf.kind {\n\t\tcase reflect.Bool:\n\t\t\tb := new(bool)\n\t\t\tif dv != nil {\n\t\t\t\t*b = dv.(bool)\n\t\t\t}\n\t\t\t*(fptr.(**bool)) = b\n\t\tcase reflect.Float32:\n\t\t\tf := new(float32)\n\t\t\tif dv != nil {\n\t\t\t\t*f = dv.(float32)\n\t\t\t}\n\t\t\t*(fptr.(**float32)) = f\n\t\tcase reflect.Float64:\n\t\t\tf := new(float64)\n\t\t\tif dv != nil {\n\t\t\t\t*f = dv.(float64)\n\t\t\t}\n\t\t\t*(fptr.(**float64)) = f\n\t\tcase reflect.Int32:\n\t\t\t// might be an enum\n\t\t\tif ft := f.Type(); ft != int32PtrType {\n\t\t\t\t// enum\n\t\t\t\tf.Set(reflect.New(ft.Elem()))\n\t\t\t\tif dv != nil {\n\t\t\t\t\tf.Elem().SetInt(int64(dv.(int32)))\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// int32 field\n\t\t\t\ti := new(int32)\n\t\t\t\tif dv != nil {\n\t\t\t\t\t*i = dv.(int32)\n\t\t\t\t}\n\t\t\t\t*(fptr.(**int32)) = i\n\t\t\t}\n\t\tcase reflect.Int64:\n\t\t\ti := new(int64)\n\t\t\tif dv != nil {\n\t\t\t\t*i = dv.(int64)\n\t\t\t}\n\t\t\t*(fptr.(**int64)) = i\n\t\tcase reflect.String:\n\t\t\ts := new(string)\n\t\t\tif dv != nil {\n\t\t\t\t*s = dv.(string)\n\t\t\t}\n\t\t\t*(fptr.(**string)) = s\n\t\tcase reflect.Uint8:\n\t\t\t// exceptional case: []byte\n\t\t\tvar b []byte\n\t\t\tif dv != nil {\n\t\t\t\tdb := dv.([]byte)\n\t\t\t\tb = make([]byte, len(db))\n\t\t\t\tcopy(b, db)\n\t\t\t} else {\n\t\t\t\tb = []byte{}\n\t\t\t}\n\t\t\t*(fptr.(*[]byte)) = b\n\t\tcase reflect.Uint32:\n\t\t\tu := new(uint32)\n\t\t\tif dv != nil {\n\t\t\t\t*u = dv.(uint32)\n\t\t\t}\n\t\t\t*(fptr.(**uint32)) = u\n\t\tcase reflect.Uint64:\n\t\t\tu := new(uint64)\n\t\t\tif dv != nil {\n\t\t\t\t*u = dv.(uint64)\n\t\t\t}\n\t\t\t*(fptr.(**uint64)) = u\n\t\tdefault:\n\t\t\tlog.Printf(\"proto: can't set default for field %v (sf.kind=%v)\", f, sf.kind)\n\t\t}\n\t}\n\n\tfor _, ni := range dm.nested {\n\t\tf := v.Field(ni)\n\t\t// f is *T or []*T or map[T]*T\n\t\tswitch f.Kind() {\n\t\tcase reflect.Ptr:\n\t\t\tif f.IsNil() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsetDefaults(f, recur, zeros)\n\n\t\tcase reflect.Slice:\n\t\t\tfor i := 0; i < f.Len(); i++ {\n\t\t\t\te := f.Index(i)\n\t\t\t\tif e.IsNil() {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tsetDefaults(e, recur, zeros)\n\t\t\t}\n\n\t\tcase reflect.Map:\n\t\t\tfor _, k := range f.MapKeys() {\n\t\t\t\te := f.MapIndex(k)\n\t\t\t\tif e.IsNil() {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tsetDefaults(e, recur, zeros)\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar (\n\t// defaults maps a protocol buffer struct type to a slice of the fields,\n\t// with its scalar fields set to their proto-declared non-zero default values.\n\tdefaultMu sync.RWMutex\n\tdefaults  = make(map[reflect.Type]defaultMessage)\n\n\tint32PtrType = reflect.TypeOf((*int32)(nil))\n)\n\n// defaultMessage represents information about the default values of a message.\ntype defaultMessage struct {\n\tscalars []scalarField\n\tnested  []int // struct field index of nested messages\n}\n\ntype scalarField struct {\n\tindex int          // struct field index\n\tkind  reflect.Kind // element type (the T in *T or []T)\n\tvalue interface{}  // the proto-declared default value, or nil\n}\n\n// t is a struct type.\nfunc buildDefaultMessage(t reflect.Type) (dm defaultMessage) {\n\tsprop := GetProperties(t)\n\tfor _, prop := range sprop.Prop {\n\t\tfi, ok := sprop.decoderTags.get(prop.Tag)\n\t\tif !ok {\n\t\t\t// XXX_unrecognized\n\t\t\tcontinue\n\t\t}\n\t\tft := t.Field(fi).Type\n\n\t\tsf, nested, err := fieldDefault(ft, prop)\n\t\tswitch {\n\t\tcase err != nil:\n\t\t\tlog.Print(err)\n\t\tcase nested:\n\t\t\tdm.nested = append(dm.nested, fi)\n\t\tcase sf != nil:\n\t\t\tsf.index = fi\n\t\t\tdm.scalars = append(dm.scalars, *sf)\n\t\t}\n\t}\n\n\treturn dm\n}\n\n// fieldDefault returns the scalarField for field type ft.\n// sf will be nil if the field can not have a default.\n// nestedMessage will be true if this is a nested message.\n// Note that sf.index is not set on return.\nfunc fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) {\n\tvar canHaveDefault bool\n\tswitch ft.Kind() {\n\tcase reflect.Ptr:\n\t\tif ft.Elem().Kind() == reflect.Struct {\n\t\t\tnestedMessage = true\n\t\t} else {\n\t\t\tcanHaveDefault = true // proto2 scalar field\n\t\t}\n\n\tcase reflect.Slice:\n\t\tswitch ft.Elem().Kind() {\n\t\tcase reflect.Ptr:\n\t\t\tnestedMessage = true // repeated message\n\t\tcase reflect.Uint8:\n\t\t\tcanHaveDefault = true // bytes field\n\t\t}\n\n\tcase reflect.Map:\n\t\tif ft.Elem().Kind() == reflect.Ptr {\n\t\t\tnestedMessage = true // map with message values\n\t\t}\n\t}\n\n\tif !canHaveDefault {\n\t\tif nestedMessage {\n\t\t\treturn nil, true, nil\n\t\t}\n\t\treturn nil, false, nil\n\t}\n\n\t// We now know that ft is a pointer or slice.\n\tsf = &scalarField{kind: ft.Elem().Kind()}\n\n\t// scalar fields without defaults\n\tif !prop.HasDefault {\n\t\treturn sf, false, nil\n\t}\n\n\t// a scalar field: either *T or []byte\n\tswitch ft.Elem().Kind() {\n\tcase reflect.Bool:\n\t\tx, err := strconv.ParseBool(prop.Default)\n\t\tif err != nil {\n\t\t\treturn nil, false, fmt.Errorf(\"proto: bad default bool %q: %v\", prop.Default, err)\n\t\t}\n\t\tsf.value = x\n\tcase reflect.Float32:\n\t\tx, err := strconv.ParseFloat(prop.Default, 32)\n\t\tif err != nil {\n\t\t\treturn nil, false, fmt.Errorf(\"proto: bad default float32 %q: %v\", prop.Default, err)\n\t\t}\n\t\tsf.value = float32(x)\n\tcase reflect.Float64:\n\t\tx, err := strconv.ParseFloat(prop.Default, 64)\n\t\tif err != nil {\n\t\t\treturn nil, false, fmt.Errorf(\"proto: bad default float64 %q: %v\", prop.Default, err)\n\t\t}\n\t\tsf.value = x\n\tcase reflect.Int32:\n\t\tx, err := strconv.ParseInt(prop.Default, 10, 32)\n\t\tif err != nil {\n\t\t\treturn nil, false, fmt.Errorf(\"proto: bad default int32 %q: %v\", prop.Default, err)\n\t\t}\n\t\tsf.value = int32(x)\n\tcase reflect.Int64:\n\t\tx, err := strconv.ParseInt(prop.Default, 10, 64)\n\t\tif err != nil {\n\t\t\treturn nil, false, fmt.Errorf(\"proto: bad default int64 %q: %v\", prop.Default, err)\n\t\t}\n\t\tsf.value = x\n\tcase reflect.String:\n\t\tsf.value = prop.Default\n\tcase reflect.Uint8:\n\t\t// []byte (not *uint8)\n\t\tsf.value = []byte(prop.Default)\n\tcase reflect.Uint32:\n\t\tx, err := strconv.ParseUint(prop.Default, 10, 32)\n\t\tif err != nil {\n\t\t\treturn nil, false, fmt.Errorf(\"proto: bad default uint32 %q: %v\", prop.Default, err)\n\t\t}\n\t\tsf.value = uint32(x)\n\tcase reflect.Uint64:\n\t\tx, err := strconv.ParseUint(prop.Default, 10, 64)\n\t\tif err != nil {\n\t\t\treturn nil, false, fmt.Errorf(\"proto: bad default uint64 %q: %v\", prop.Default, err)\n\t\t}\n\t\tsf.value = x\n\tdefault:\n\t\treturn nil, false, fmt.Errorf(\"proto: unhandled def kind %v\", ft.Elem().Kind())\n\t}\n\n\treturn sf, false, nil\n}\n\n// Map fields may have key types of non-float scalars, strings and enums.\n// The easiest way to sort them in some deterministic order is to use fmt.\n// If this turns out to be inefficient we can always consider other options,\n// such as doing a Schwartzian transform.\n\nfunc mapKeys(vs []reflect.Value) sort.Interface {\n\ts := mapKeySorter{\n\t\tvs: vs,\n\t\t// default Less function: textual comparison\n\t\tless: func(a, b reflect.Value) bool {\n\t\t\treturn fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface())\n\t\t},\n\t}\n\n\t// Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps;\n\t// numeric keys are sorted numerically.\n\tif len(vs) == 0 {\n\t\treturn s\n\t}\n\tswitch vs[0].Kind() {\n\tcase reflect.Int32, reflect.Int64:\n\t\ts.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() }\n\tcase reflect.Uint32, reflect.Uint64:\n\t\ts.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() }\n\t}\n\n\treturn s\n}\n\ntype mapKeySorter struct {\n\tvs   []reflect.Value\n\tless func(a, b reflect.Value) bool\n}\n\nfunc (s mapKeySorter) Len() int      { return len(s.vs) }\nfunc (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] }\nfunc (s mapKeySorter) Less(i, j int) bool {\n\treturn s.less(s.vs[i], s.vs[j])\n}\n\n// isProto3Zero reports whether v is a zero proto3 value.\nfunc isProto3Zero(v reflect.Value) bool {\n\tswitch v.Kind() {\n\tcase reflect.Bool:\n\t\treturn !v.Bool()\n\tcase reflect.Int32, reflect.Int64:\n\t\treturn v.Int() == 0\n\tcase reflect.Uint32, reflect.Uint64:\n\t\treturn v.Uint() == 0\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn v.Float() == 0\n\tcase reflect.String:\n\t\treturn v.String() == \"\"\n\t}\n\treturn false\n}\n\n// ProtoPackageIsVersion2 is referenced from generated protocol buffer files\n// to assert that that code is compatible with this version of the proto package.\nconst ProtoPackageIsVersion2 = true\n\n// ProtoPackageIsVersion1 is referenced from generated protocol buffer files\n// to assert that that code is compatible with this version of the proto package.\nconst ProtoPackageIsVersion1 = true\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/message_set.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage proto\n\n/*\n * Support for message sets.\n */\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sort\"\n)\n\n// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID.\n// A message type ID is required for storing a protocol buffer in a message set.\nvar errNoMessageTypeID = errors.New(\"proto does not have a message type ID\")\n\n// The first two types (_MessageSet_Item and messageSet)\n// model what the protocol compiler produces for the following protocol message:\n//   message MessageSet {\n//     repeated group Item = 1 {\n//       required int32 type_id = 2;\n//       required string message = 3;\n//     };\n//   }\n// That is the MessageSet wire format. We can't use a proto to generate these\n// because that would introduce a circular dependency between it and this package.\n\ntype _MessageSet_Item struct {\n\tTypeId  *int32 `protobuf:\"varint,2,req,name=type_id\"`\n\tMessage []byte `protobuf:\"bytes,3,req,name=message\"`\n}\n\ntype messageSet struct {\n\tItem             []*_MessageSet_Item `protobuf:\"group,1,rep\"`\n\tXXX_unrecognized []byte\n\t// TODO: caching?\n}\n\n// Make sure messageSet is a Message.\nvar _ Message = (*messageSet)(nil)\n\n// messageTypeIder is an interface satisfied by a protocol buffer type\n// that may be stored in a MessageSet.\ntype messageTypeIder interface {\n\tMessageTypeId() int32\n}\n\nfunc (ms *messageSet) find(pb Message) *_MessageSet_Item {\n\tmti, ok := pb.(messageTypeIder)\n\tif !ok {\n\t\treturn nil\n\t}\n\tid := mti.MessageTypeId()\n\tfor _, item := range ms.Item {\n\t\tif *item.TypeId == id {\n\t\t\treturn item\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (ms *messageSet) Has(pb Message) bool {\n\tif ms.find(pb) != nil {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (ms *messageSet) Unmarshal(pb Message) error {\n\tif item := ms.find(pb); item != nil {\n\t\treturn Unmarshal(item.Message, pb)\n\t}\n\tif _, ok := pb.(messageTypeIder); !ok {\n\t\treturn errNoMessageTypeID\n\t}\n\treturn nil // TODO: return error instead?\n}\n\nfunc (ms *messageSet) Marshal(pb Message) error {\n\tmsg, err := Marshal(pb)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif item := ms.find(pb); item != nil {\n\t\t// reuse existing item\n\t\titem.Message = msg\n\t\treturn nil\n\t}\n\n\tmti, ok := pb.(messageTypeIder)\n\tif !ok {\n\t\treturn errNoMessageTypeID\n\t}\n\n\tmtid := mti.MessageTypeId()\n\tms.Item = append(ms.Item, &_MessageSet_Item{\n\t\tTypeId:  &mtid,\n\t\tMessage: msg,\n\t})\n\treturn nil\n}\n\nfunc (ms *messageSet) Reset()         { *ms = messageSet{} }\nfunc (ms *messageSet) String() string { return CompactTextString(ms) }\nfunc (*messageSet) ProtoMessage()     {}\n\n// Support for the message_set_wire_format message option.\n\nfunc skipVarint(buf []byte) []byte {\n\ti := 0\n\tfor ; buf[i]&0x80 != 0; i++ {\n\t}\n\treturn buf[i+1:]\n}\n\n// MarshalMessageSet encodes the extension map represented by m in the message set wire format.\n// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option.\nfunc MarshalMessageSet(exts interface{}) ([]byte, error) {\n\tvar m map[int32]Extension\n\tswitch exts := exts.(type) {\n\tcase *XXX_InternalExtensions:\n\t\tif err := encodeExtensions(exts); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tm, _ = exts.extensionsRead()\n\tcase map[int32]Extension:\n\t\tif err := encodeExtensionsMap(exts); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tm = exts\n\tdefault:\n\t\treturn nil, errors.New(\"proto: not an extension map\")\n\t}\n\n\t// Sort extension IDs to provide a deterministic encoding.\n\t// See also enc_map in encode.go.\n\tids := make([]int, 0, len(m))\n\tfor id := range m {\n\t\tids = append(ids, int(id))\n\t}\n\tsort.Ints(ids)\n\n\tms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))}\n\tfor _, id := range ids {\n\t\te := m[int32(id)]\n\t\t// Remove the wire type and field number varint, as well as the length varint.\n\t\tmsg := skipVarint(skipVarint(e.enc))\n\n\t\tms.Item = append(ms.Item, &_MessageSet_Item{\n\t\t\tTypeId:  Int32(int32(id)),\n\t\t\tMessage: msg,\n\t\t})\n\t}\n\treturn Marshal(ms)\n}\n\n// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format.\n// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option.\nfunc UnmarshalMessageSet(buf []byte, exts interface{}) error {\n\tvar m map[int32]Extension\n\tswitch exts := exts.(type) {\n\tcase *XXX_InternalExtensions:\n\t\tm = exts.extensionsWrite()\n\tcase map[int32]Extension:\n\t\tm = exts\n\tdefault:\n\t\treturn errors.New(\"proto: not an extension map\")\n\t}\n\n\tms := new(messageSet)\n\tif err := Unmarshal(buf, ms); err != nil {\n\t\treturn err\n\t}\n\tfor _, item := range ms.Item {\n\t\tid := *item.TypeId\n\t\tmsg := item.Message\n\n\t\t// Restore wire type and field number varint, plus length varint.\n\t\t// Be careful to preserve duplicate items.\n\t\tb := EncodeVarint(uint64(id)<<3 | WireBytes)\n\t\tif ext, ok := m[id]; ok {\n\t\t\t// Existing data; rip off the tag and length varint\n\t\t\t// so we join the new data correctly.\n\t\t\t// We can assume that ext.enc is set because we are unmarshaling.\n\t\t\to := ext.enc[len(b):]   // skip wire type and field number\n\t\t\t_, n := DecodeVarint(o) // calculate length of length varint\n\t\t\to = o[n:]               // skip length varint\n\t\t\tmsg = append(o, msg...) // join old data and new data\n\t\t}\n\t\tb = append(b, EncodeVarint(uint64(len(msg)))...)\n\t\tb = append(b, msg...)\n\n\t\tm[id] = Extension{enc: b}\n\t}\n\treturn nil\n}\n\n// MarshalMessageSetJSON encodes the extension map represented by m in JSON format.\n// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option.\nfunc MarshalMessageSetJSON(exts interface{}) ([]byte, error) {\n\tvar m map[int32]Extension\n\tswitch exts := exts.(type) {\n\tcase *XXX_InternalExtensions:\n\t\tm, _ = exts.extensionsRead()\n\tcase map[int32]Extension:\n\t\tm = exts\n\tdefault:\n\t\treturn nil, errors.New(\"proto: not an extension map\")\n\t}\n\tvar b bytes.Buffer\n\tb.WriteByte('{')\n\n\t// Process the map in key order for deterministic output.\n\tids := make([]int32, 0, len(m))\n\tfor id := range m {\n\t\tids = append(ids, id)\n\t}\n\tsort.Sort(int32Slice(ids)) // int32Slice defined in text.go\n\n\tfor i, id := range ids {\n\t\text := m[id]\n\t\tif i > 0 {\n\t\t\tb.WriteByte(',')\n\t\t}\n\n\t\tmsd, ok := messageSetMap[id]\n\t\tif !ok {\n\t\t\t// Unknown type; we can't render it, so skip it.\n\t\t\tcontinue\n\t\t}\n\t\tfmt.Fprintf(&b, `\"[%s]\":`, msd.name)\n\n\t\tx := ext.value\n\t\tif x == nil {\n\t\t\tx = reflect.New(msd.t.Elem()).Interface()\n\t\t\tif err := Unmarshal(ext.enc, x.(Message)); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\td, err := json.Marshal(x)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tb.Write(d)\n\t}\n\tb.WriteByte('}')\n\treturn b.Bytes(), nil\n}\n\n// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format.\n// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option.\nfunc UnmarshalMessageSetJSON(buf []byte, exts interface{}) error {\n\t// Common-case fast path.\n\tif len(buf) == 0 || bytes.Equal(buf, []byte(\"{}\")) {\n\t\treturn nil\n\t}\n\n\t// This is fairly tricky, and it's not clear that it is needed.\n\treturn errors.New(\"TODO: UnmarshalMessageSetJSON not yet implemented\")\n}\n\n// A global registry of types that can be used in a MessageSet.\n\nvar messageSetMap = make(map[int32]messageSetDesc)\n\ntype messageSetDesc struct {\n\tt    reflect.Type // pointer to struct\n\tname string\n}\n\n// RegisterMessageSetType is called from the generated code.\nfunc RegisterMessageSetType(m Message, fieldNum int32, name string) {\n\tmessageSetMap[fieldNum] = messageSetDesc{\n\t\tt:    reflect.TypeOf(m),\n\t\tname: name,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/pointer_reflect.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2012 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// +build appengine js\n\n// This file contains an implementation of proto field accesses using package reflect.\n// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can\n// be used on App Engine.\n\npackage proto\n\nimport (\n\t\"math\"\n\t\"reflect\"\n)\n\n// A structPointer is a pointer to a struct.\ntype structPointer struct {\n\tv reflect.Value\n}\n\n// toStructPointer returns a structPointer equivalent to the given reflect value.\n// The reflect value must itself be a pointer to a struct.\nfunc toStructPointer(v reflect.Value) structPointer {\n\treturn structPointer{v}\n}\n\n// IsNil reports whether p is nil.\nfunc structPointer_IsNil(p structPointer) bool {\n\treturn p.v.IsNil()\n}\n\n// Interface returns the struct pointer as an interface value.\nfunc structPointer_Interface(p structPointer, _ reflect.Type) interface{} {\n\treturn p.v.Interface()\n}\n\n// A field identifies a field in a struct, accessible from a structPointer.\n// In this implementation, a field is identified by the sequence of field indices\n// passed to reflect's FieldByIndex.\ntype field []int\n\n// toField returns a field equivalent to the given reflect field.\nfunc toField(f *reflect.StructField) field {\n\treturn f.Index\n}\n\n// invalidField is an invalid field identifier.\nvar invalidField = field(nil)\n\n// IsValid reports whether the field identifier is valid.\nfunc (f field) IsValid() bool { return f != nil }\n\n// field returns the given field in the struct as a reflect value.\nfunc structPointer_field(p structPointer, f field) reflect.Value {\n\t// Special case: an extension map entry with a value of type T\n\t// passes a *T to the struct-handling code with a zero field,\n\t// expecting that it will be treated as equivalent to *struct{ X T },\n\t// which has the same memory layout. We have to handle that case\n\t// specially, because reflect will panic if we call FieldByIndex on a\n\t// non-struct.\n\tif f == nil {\n\t\treturn p.v.Elem()\n\t}\n\n\treturn p.v.Elem().FieldByIndex(f)\n}\n\n// ifield returns the given field in the struct as an interface value.\nfunc structPointer_ifield(p structPointer, f field) interface{} {\n\treturn structPointer_field(p, f).Addr().Interface()\n}\n\n// Bytes returns the address of a []byte field in the struct.\nfunc structPointer_Bytes(p structPointer, f field) *[]byte {\n\treturn structPointer_ifield(p, f).(*[]byte)\n}\n\n// BytesSlice returns the address of a [][]byte field in the struct.\nfunc structPointer_BytesSlice(p structPointer, f field) *[][]byte {\n\treturn structPointer_ifield(p, f).(*[][]byte)\n}\n\n// Bool returns the address of a *bool field in the struct.\nfunc structPointer_Bool(p structPointer, f field) **bool {\n\treturn structPointer_ifield(p, f).(**bool)\n}\n\n// BoolVal returns the address of a bool field in the struct.\nfunc structPointer_BoolVal(p structPointer, f field) *bool {\n\treturn structPointer_ifield(p, f).(*bool)\n}\n\n// BoolSlice returns the address of a []bool field in the struct.\nfunc structPointer_BoolSlice(p structPointer, f field) *[]bool {\n\treturn structPointer_ifield(p, f).(*[]bool)\n}\n\n// String returns the address of a *string field in the struct.\nfunc structPointer_String(p structPointer, f field) **string {\n\treturn structPointer_ifield(p, f).(**string)\n}\n\n// StringVal returns the address of a string field in the struct.\nfunc structPointer_StringVal(p structPointer, f field) *string {\n\treturn structPointer_ifield(p, f).(*string)\n}\n\n// StringSlice returns the address of a []string field in the struct.\nfunc structPointer_StringSlice(p structPointer, f field) *[]string {\n\treturn structPointer_ifield(p, f).(*[]string)\n}\n\n// Extensions returns the address of an extension map field in the struct.\nfunc structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions {\n\treturn structPointer_ifield(p, f).(*XXX_InternalExtensions)\n}\n\n// ExtMap returns the address of an extension map field in the struct.\nfunc structPointer_ExtMap(p structPointer, f field) *map[int32]Extension {\n\treturn structPointer_ifield(p, f).(*map[int32]Extension)\n}\n\n// NewAt returns the reflect.Value for a pointer to a field in the struct.\nfunc structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value {\n\treturn structPointer_field(p, f).Addr()\n}\n\n// SetStructPointer writes a *struct field in the struct.\nfunc structPointer_SetStructPointer(p structPointer, f field, q structPointer) {\n\tstructPointer_field(p, f).Set(q.v)\n}\n\n// GetStructPointer reads a *struct field in the struct.\nfunc structPointer_GetStructPointer(p structPointer, f field) structPointer {\n\treturn structPointer{structPointer_field(p, f)}\n}\n\n// StructPointerSlice the address of a []*struct field in the struct.\nfunc structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice {\n\treturn structPointerSlice{structPointer_field(p, f)}\n}\n\n// A structPointerSlice represents the address of a slice of pointers to structs\n// (themselves messages or groups). That is, v.Type() is *[]*struct{...}.\ntype structPointerSlice struct {\n\tv reflect.Value\n}\n\nfunc (p structPointerSlice) Len() int                  { return p.v.Len() }\nfunc (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} }\nfunc (p structPointerSlice) Append(q structPointer) {\n\tp.v.Set(reflect.Append(p.v, q.v))\n}\n\nvar (\n\tint32Type   = reflect.TypeOf(int32(0))\n\tuint32Type  = reflect.TypeOf(uint32(0))\n\tfloat32Type = reflect.TypeOf(float32(0))\n\tint64Type   = reflect.TypeOf(int64(0))\n\tuint64Type  = reflect.TypeOf(uint64(0))\n\tfloat64Type = reflect.TypeOf(float64(0))\n)\n\n// A word32 represents a field of type *int32, *uint32, *float32, or *enum.\n// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable.\ntype word32 struct {\n\tv reflect.Value\n}\n\n// IsNil reports whether p is nil.\nfunc word32_IsNil(p word32) bool {\n\treturn p.v.IsNil()\n}\n\n// Set sets p to point at a newly allocated word with bits set to x.\nfunc word32_Set(p word32, o *Buffer, x uint32) {\n\tt := p.v.Type().Elem()\n\tswitch t {\n\tcase int32Type:\n\t\tif len(o.int32s) == 0 {\n\t\t\to.int32s = make([]int32, uint32PoolSize)\n\t\t}\n\t\to.int32s[0] = int32(x)\n\t\tp.v.Set(reflect.ValueOf(&o.int32s[0]))\n\t\to.int32s = o.int32s[1:]\n\t\treturn\n\tcase uint32Type:\n\t\tif len(o.uint32s) == 0 {\n\t\t\to.uint32s = make([]uint32, uint32PoolSize)\n\t\t}\n\t\to.uint32s[0] = x\n\t\tp.v.Set(reflect.ValueOf(&o.uint32s[0]))\n\t\to.uint32s = o.uint32s[1:]\n\t\treturn\n\tcase float32Type:\n\t\tif len(o.float32s) == 0 {\n\t\t\to.float32s = make([]float32, uint32PoolSize)\n\t\t}\n\t\to.float32s[0] = math.Float32frombits(x)\n\t\tp.v.Set(reflect.ValueOf(&o.float32s[0]))\n\t\to.float32s = o.float32s[1:]\n\t\treturn\n\t}\n\n\t// must be enum\n\tp.v.Set(reflect.New(t))\n\tp.v.Elem().SetInt(int64(int32(x)))\n}\n\n// Get gets the bits pointed at by p, as a uint32.\nfunc word32_Get(p word32) uint32 {\n\telem := p.v.Elem()\n\tswitch elem.Kind() {\n\tcase reflect.Int32:\n\t\treturn uint32(elem.Int())\n\tcase reflect.Uint32:\n\t\treturn uint32(elem.Uint())\n\tcase reflect.Float32:\n\t\treturn math.Float32bits(float32(elem.Float()))\n\t}\n\tpanic(\"unreachable\")\n}\n\n// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct.\nfunc structPointer_Word32(p structPointer, f field) word32 {\n\treturn word32{structPointer_field(p, f)}\n}\n\n// A word32Val represents a field of type int32, uint32, float32, or enum.\n// That is, v.Type() is int32, uint32, float32, or enum and v is assignable.\ntype word32Val struct {\n\tv reflect.Value\n}\n\n// Set sets *p to x.\nfunc word32Val_Set(p word32Val, x uint32) {\n\tswitch p.v.Type() {\n\tcase int32Type:\n\t\tp.v.SetInt(int64(x))\n\t\treturn\n\tcase uint32Type:\n\t\tp.v.SetUint(uint64(x))\n\t\treturn\n\tcase float32Type:\n\t\tp.v.SetFloat(float64(math.Float32frombits(x)))\n\t\treturn\n\t}\n\n\t// must be enum\n\tp.v.SetInt(int64(int32(x)))\n}\n\n// Get gets the bits pointed at by p, as a uint32.\nfunc word32Val_Get(p word32Val) uint32 {\n\telem := p.v\n\tswitch elem.Kind() {\n\tcase reflect.Int32:\n\t\treturn uint32(elem.Int())\n\tcase reflect.Uint32:\n\t\treturn uint32(elem.Uint())\n\tcase reflect.Float32:\n\t\treturn math.Float32bits(float32(elem.Float()))\n\t}\n\tpanic(\"unreachable\")\n}\n\n// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct.\nfunc structPointer_Word32Val(p structPointer, f field) word32Val {\n\treturn word32Val{structPointer_field(p, f)}\n}\n\n// A word32Slice is a slice of 32-bit values.\n// That is, v.Type() is []int32, []uint32, []float32, or []enum.\ntype word32Slice struct {\n\tv reflect.Value\n}\n\nfunc (p word32Slice) Append(x uint32) {\n\tn, m := p.v.Len(), p.v.Cap()\n\tif n < m {\n\t\tp.v.SetLen(n + 1)\n\t} else {\n\t\tt := p.v.Type().Elem()\n\t\tp.v.Set(reflect.Append(p.v, reflect.Zero(t)))\n\t}\n\telem := p.v.Index(n)\n\tswitch elem.Kind() {\n\tcase reflect.Int32:\n\t\telem.SetInt(int64(int32(x)))\n\tcase reflect.Uint32:\n\t\telem.SetUint(uint64(x))\n\tcase reflect.Float32:\n\t\telem.SetFloat(float64(math.Float32frombits(x)))\n\t}\n}\n\nfunc (p word32Slice) Len() int {\n\treturn p.v.Len()\n}\n\nfunc (p word32Slice) Index(i int) uint32 {\n\telem := p.v.Index(i)\n\tswitch elem.Kind() {\n\tcase reflect.Int32:\n\t\treturn uint32(elem.Int())\n\tcase reflect.Uint32:\n\t\treturn uint32(elem.Uint())\n\tcase reflect.Float32:\n\t\treturn math.Float32bits(float32(elem.Float()))\n\t}\n\tpanic(\"unreachable\")\n}\n\n// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct.\nfunc structPointer_Word32Slice(p structPointer, f field) word32Slice {\n\treturn word32Slice{structPointer_field(p, f)}\n}\n\n// word64 is like word32 but for 64-bit values.\ntype word64 struct {\n\tv reflect.Value\n}\n\nfunc word64_Set(p word64, o *Buffer, x uint64) {\n\tt := p.v.Type().Elem()\n\tswitch t {\n\tcase int64Type:\n\t\tif len(o.int64s) == 0 {\n\t\t\to.int64s = make([]int64, uint64PoolSize)\n\t\t}\n\t\to.int64s[0] = int64(x)\n\t\tp.v.Set(reflect.ValueOf(&o.int64s[0]))\n\t\to.int64s = o.int64s[1:]\n\t\treturn\n\tcase uint64Type:\n\t\tif len(o.uint64s) == 0 {\n\t\t\to.uint64s = make([]uint64, uint64PoolSize)\n\t\t}\n\t\to.uint64s[0] = x\n\t\tp.v.Set(reflect.ValueOf(&o.uint64s[0]))\n\t\to.uint64s = o.uint64s[1:]\n\t\treturn\n\tcase float64Type:\n\t\tif len(o.float64s) == 0 {\n\t\t\to.float64s = make([]float64, uint64PoolSize)\n\t\t}\n\t\to.float64s[0] = math.Float64frombits(x)\n\t\tp.v.Set(reflect.ValueOf(&o.float64s[0]))\n\t\to.float64s = o.float64s[1:]\n\t\treturn\n\t}\n\tpanic(\"unreachable\")\n}\n\nfunc word64_IsNil(p word64) bool {\n\treturn p.v.IsNil()\n}\n\nfunc word64_Get(p word64) uint64 {\n\telem := p.v.Elem()\n\tswitch elem.Kind() {\n\tcase reflect.Int64:\n\t\treturn uint64(elem.Int())\n\tcase reflect.Uint64:\n\t\treturn elem.Uint()\n\tcase reflect.Float64:\n\t\treturn math.Float64bits(elem.Float())\n\t}\n\tpanic(\"unreachable\")\n}\n\nfunc structPointer_Word64(p structPointer, f field) word64 {\n\treturn word64{structPointer_field(p, f)}\n}\n\n// word64Val is like word32Val but for 64-bit values.\ntype word64Val struct {\n\tv reflect.Value\n}\n\nfunc word64Val_Set(p word64Val, o *Buffer, x uint64) {\n\tswitch p.v.Type() {\n\tcase int64Type:\n\t\tp.v.SetInt(int64(x))\n\t\treturn\n\tcase uint64Type:\n\t\tp.v.SetUint(x)\n\t\treturn\n\tcase float64Type:\n\t\tp.v.SetFloat(math.Float64frombits(x))\n\t\treturn\n\t}\n\tpanic(\"unreachable\")\n}\n\nfunc word64Val_Get(p word64Val) uint64 {\n\telem := p.v\n\tswitch elem.Kind() {\n\tcase reflect.Int64:\n\t\treturn uint64(elem.Int())\n\tcase reflect.Uint64:\n\t\treturn elem.Uint()\n\tcase reflect.Float64:\n\t\treturn math.Float64bits(elem.Float())\n\t}\n\tpanic(\"unreachable\")\n}\n\nfunc structPointer_Word64Val(p structPointer, f field) word64Val {\n\treturn word64Val{structPointer_field(p, f)}\n}\n\ntype word64Slice struct {\n\tv reflect.Value\n}\n\nfunc (p word64Slice) Append(x uint64) {\n\tn, m := p.v.Len(), p.v.Cap()\n\tif n < m {\n\t\tp.v.SetLen(n + 1)\n\t} else {\n\t\tt := p.v.Type().Elem()\n\t\tp.v.Set(reflect.Append(p.v, reflect.Zero(t)))\n\t}\n\telem := p.v.Index(n)\n\tswitch elem.Kind() {\n\tcase reflect.Int64:\n\t\telem.SetInt(int64(int64(x)))\n\tcase reflect.Uint64:\n\t\telem.SetUint(uint64(x))\n\tcase reflect.Float64:\n\t\telem.SetFloat(float64(math.Float64frombits(x)))\n\t}\n}\n\nfunc (p word64Slice) Len() int {\n\treturn p.v.Len()\n}\n\nfunc (p word64Slice) Index(i int) uint64 {\n\telem := p.v.Index(i)\n\tswitch elem.Kind() {\n\tcase reflect.Int64:\n\t\treturn uint64(elem.Int())\n\tcase reflect.Uint64:\n\t\treturn uint64(elem.Uint())\n\tcase reflect.Float64:\n\t\treturn math.Float64bits(float64(elem.Float()))\n\t}\n\tpanic(\"unreachable\")\n}\n\nfunc structPointer_Word64Slice(p structPointer, f field) word64Slice {\n\treturn word64Slice{structPointer_field(p, f)}\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/pointer_unsafe.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2012 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// +build !appengine,!js\n\n// This file contains the implementation of the proto field accesses using package unsafe.\n\npackage proto\n\nimport (\n\t\"reflect\"\n\t\"unsafe\"\n)\n\n// NOTE: These type_Foo functions would more idiomatically be methods,\n// but Go does not allow methods on pointer types, and we must preserve\n// some pointer type for the garbage collector. We use these\n// funcs with clunky names as our poor approximation to methods.\n//\n// An alternative would be\n//\ttype structPointer struct { p unsafe.Pointer }\n// but that does not registerize as well.\n\n// A structPointer is a pointer to a struct.\ntype structPointer unsafe.Pointer\n\n// toStructPointer returns a structPointer equivalent to the given reflect value.\nfunc toStructPointer(v reflect.Value) structPointer {\n\treturn structPointer(unsafe.Pointer(v.Pointer()))\n}\n\n// IsNil reports whether p is nil.\nfunc structPointer_IsNil(p structPointer) bool {\n\treturn p == nil\n}\n\n// Interface returns the struct pointer, assumed to have element type t,\n// as an interface value.\nfunc structPointer_Interface(p structPointer, t reflect.Type) interface{} {\n\treturn reflect.NewAt(t, unsafe.Pointer(p)).Interface()\n}\n\n// A field identifies a field in a struct, accessible from a structPointer.\n// In this implementation, a field is identified by its byte offset from the start of the struct.\ntype field uintptr\n\n// toField returns a field equivalent to the given reflect field.\nfunc toField(f *reflect.StructField) field {\n\treturn field(f.Offset)\n}\n\n// invalidField is an invalid field identifier.\nconst invalidField = ^field(0)\n\n// IsValid reports whether the field identifier is valid.\nfunc (f field) IsValid() bool {\n\treturn f != ^field(0)\n}\n\n// Bytes returns the address of a []byte field in the struct.\nfunc structPointer_Bytes(p structPointer, f field) *[]byte {\n\treturn (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// BytesSlice returns the address of a [][]byte field in the struct.\nfunc structPointer_BytesSlice(p structPointer, f field) *[][]byte {\n\treturn (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// Bool returns the address of a *bool field in the struct.\nfunc structPointer_Bool(p structPointer, f field) **bool {\n\treturn (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// BoolVal returns the address of a bool field in the struct.\nfunc structPointer_BoolVal(p structPointer, f field) *bool {\n\treturn (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// BoolSlice returns the address of a []bool field in the struct.\nfunc structPointer_BoolSlice(p structPointer, f field) *[]bool {\n\treturn (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// String returns the address of a *string field in the struct.\nfunc structPointer_String(p structPointer, f field) **string {\n\treturn (**string)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// StringVal returns the address of a string field in the struct.\nfunc structPointer_StringVal(p structPointer, f field) *string {\n\treturn (*string)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// StringSlice returns the address of a []string field in the struct.\nfunc structPointer_StringSlice(p structPointer, f field) *[]string {\n\treturn (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// ExtMap returns the address of an extension map field in the struct.\nfunc structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions {\n\treturn (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\nfunc structPointer_ExtMap(p structPointer, f field) *map[int32]Extension {\n\treturn (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// NewAt returns the reflect.Value for a pointer to a field in the struct.\nfunc structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value {\n\treturn reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f)))\n}\n\n// SetStructPointer writes a *struct field in the struct.\nfunc structPointer_SetStructPointer(p structPointer, f field, q structPointer) {\n\t*(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q\n}\n\n// GetStructPointer reads a *struct field in the struct.\nfunc structPointer_GetStructPointer(p structPointer, f field) structPointer {\n\treturn *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// StructPointerSlice the address of a []*struct field in the struct.\nfunc structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice {\n\treturn (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups).\ntype structPointerSlice []structPointer\n\nfunc (v *structPointerSlice) Len() int                  { return len(*v) }\nfunc (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] }\nfunc (v *structPointerSlice) Append(p structPointer)    { *v = append(*v, p) }\n\n// A word32 is the address of a \"pointer to 32-bit value\" field.\ntype word32 **uint32\n\n// IsNil reports whether *v is nil.\nfunc word32_IsNil(p word32) bool {\n\treturn *p == nil\n}\n\n// Set sets *v to point at a newly allocated word set to x.\nfunc word32_Set(p word32, o *Buffer, x uint32) {\n\tif len(o.uint32s) == 0 {\n\t\to.uint32s = make([]uint32, uint32PoolSize)\n\t}\n\to.uint32s[0] = x\n\t*p = &o.uint32s[0]\n\to.uint32s = o.uint32s[1:]\n}\n\n// Get gets the value pointed at by *v.\nfunc word32_Get(p word32) uint32 {\n\treturn **p\n}\n\n// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct.\nfunc structPointer_Word32(p structPointer, f field) word32 {\n\treturn word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f))))\n}\n\n// A word32Val is the address of a 32-bit value field.\ntype word32Val *uint32\n\n// Set sets *p to x.\nfunc word32Val_Set(p word32Val, x uint32) {\n\t*p = x\n}\n\n// Get gets the value pointed at by p.\nfunc word32Val_Get(p word32Val) uint32 {\n\treturn *p\n}\n\n// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct.\nfunc structPointer_Word32Val(p structPointer, f field) word32Val {\n\treturn word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f))))\n}\n\n// A word32Slice is a slice of 32-bit values.\ntype word32Slice []uint32\n\nfunc (v *word32Slice) Append(x uint32)    { *v = append(*v, x) }\nfunc (v *word32Slice) Len() int           { return len(*v) }\nfunc (v *word32Slice) Index(i int) uint32 { return (*v)[i] }\n\n// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct.\nfunc structPointer_Word32Slice(p structPointer, f field) *word32Slice {\n\treturn (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n\n// word64 is like word32 but for 64-bit values.\ntype word64 **uint64\n\nfunc word64_Set(p word64, o *Buffer, x uint64) {\n\tif len(o.uint64s) == 0 {\n\t\to.uint64s = make([]uint64, uint64PoolSize)\n\t}\n\to.uint64s[0] = x\n\t*p = &o.uint64s[0]\n\to.uint64s = o.uint64s[1:]\n}\n\nfunc word64_IsNil(p word64) bool {\n\treturn *p == nil\n}\n\nfunc word64_Get(p word64) uint64 {\n\treturn **p\n}\n\nfunc structPointer_Word64(p structPointer, f field) word64 {\n\treturn word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f))))\n}\n\n// word64Val is like word32Val but for 64-bit values.\ntype word64Val *uint64\n\nfunc word64Val_Set(p word64Val, o *Buffer, x uint64) {\n\t*p = x\n}\n\nfunc word64Val_Get(p word64Val) uint64 {\n\treturn *p\n}\n\nfunc structPointer_Word64Val(p structPointer, f field) word64Val {\n\treturn word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f))))\n}\n\n// word64Slice is like word32Slice but for 64-bit values.\ntype word64Slice []uint64\n\nfunc (v *word64Slice) Append(x uint64)    { *v = append(*v, x) }\nfunc (v *word64Slice) Len() int           { return len(*v) }\nfunc (v *word64Slice) Index(i int) uint64 { return (*v)[i] }\n\nfunc structPointer_Word64Slice(p structPointer, f field) *word64Slice {\n\treturn (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f)))\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/properties.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage proto\n\n/*\n * Routines for encoding data into the wire format for protocol buffers.\n */\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n)\n\nconst debug bool = false\n\n// Constants that identify the encoding of a value on the wire.\nconst (\n\tWireVarint     = 0\n\tWireFixed64    = 1\n\tWireBytes      = 2\n\tWireStartGroup = 3\n\tWireEndGroup   = 4\n\tWireFixed32    = 5\n)\n\nconst startSize = 10 // initial slice/string sizes\n\n// Encoders are defined in encode.go\n// An encoder outputs the full representation of a field, including its\n// tag and encoder type.\ntype encoder func(p *Buffer, prop *Properties, base structPointer) error\n\n// A valueEncoder encodes a single integer in a particular encoding.\ntype valueEncoder func(o *Buffer, x uint64) error\n\n// Sizers are defined in encode.go\n// A sizer returns the encoded size of a field, including its tag and encoder\n// type.\ntype sizer func(prop *Properties, base structPointer) int\n\n// A valueSizer returns the encoded size of a single integer in a particular\n// encoding.\ntype valueSizer func(x uint64) int\n\n// Decoders are defined in decode.go\n// A decoder creates a value from its wire representation.\n// Unrecognized subelements are saved in unrec.\ntype decoder func(p *Buffer, prop *Properties, base structPointer) error\n\n// A valueDecoder decodes a single integer in a particular encoding.\ntype valueDecoder func(o *Buffer) (x uint64, err error)\n\n// A oneofMarshaler does the marshaling for all oneof fields in a message.\ntype oneofMarshaler func(Message, *Buffer) error\n\n// A oneofUnmarshaler does the unmarshaling for a oneof field in a message.\ntype oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error)\n\n// A oneofSizer does the sizing for all oneof fields in a message.\ntype oneofSizer func(Message) int\n\n// tagMap is an optimization over map[int]int for typical protocol buffer\n// use-cases. Encoded protocol buffers are often in tag order with small tag\n// numbers.\ntype tagMap struct {\n\tfastTags []int\n\tslowTags map[int]int\n}\n\n// tagMapFastLimit is the upper bound on the tag number that will be stored in\n// the tagMap slice rather than its map.\nconst tagMapFastLimit = 1024\n\nfunc (p *tagMap) get(t int) (int, bool) {\n\tif t > 0 && t < tagMapFastLimit {\n\t\tif t >= len(p.fastTags) {\n\t\t\treturn 0, false\n\t\t}\n\t\tfi := p.fastTags[t]\n\t\treturn fi, fi >= 0\n\t}\n\tfi, ok := p.slowTags[t]\n\treturn fi, ok\n}\n\nfunc (p *tagMap) put(t int, fi int) {\n\tif t > 0 && t < tagMapFastLimit {\n\t\tfor len(p.fastTags) < t+1 {\n\t\t\tp.fastTags = append(p.fastTags, -1)\n\t\t}\n\t\tp.fastTags[t] = fi\n\t\treturn\n\t}\n\tif p.slowTags == nil {\n\t\tp.slowTags = make(map[int]int)\n\t}\n\tp.slowTags[t] = fi\n}\n\n// StructProperties represents properties for all the fields of a struct.\n// decoderTags and decoderOrigNames should only be used by the decoder.\ntype StructProperties struct {\n\tProp             []*Properties  // properties for each field\n\treqCount         int            // required count\n\tdecoderTags      tagMap         // map from proto tag to struct field number\n\tdecoderOrigNames map[string]int // map from original name to struct field number\n\torder            []int          // list of struct field numbers in tag order\n\tunrecField       field          // field id of the XXX_unrecognized []byte field\n\textendable       bool           // is this an extendable proto\n\n\toneofMarshaler   oneofMarshaler\n\toneofUnmarshaler oneofUnmarshaler\n\toneofSizer       oneofSizer\n\tstype            reflect.Type\n\n\t// OneofTypes contains information about the oneof fields in this message.\n\t// It is keyed by the original name of a field.\n\tOneofTypes map[string]*OneofProperties\n}\n\n// OneofProperties represents information about a specific field in a oneof.\ntype OneofProperties struct {\n\tType  reflect.Type // pointer to generated struct type for this oneof field\n\tField int          // struct field number of the containing oneof in the message\n\tProp  *Properties\n}\n\n// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec.\n// See encode.go, (*Buffer).enc_struct.\n\nfunc (sp *StructProperties) Len() int { return len(sp.order) }\nfunc (sp *StructProperties) Less(i, j int) bool {\n\treturn sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag\n}\nfunc (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] }\n\n// Properties represents the protocol-specific behavior of a single struct field.\ntype Properties struct {\n\tName     string // name of the field, for error messages\n\tOrigName string // original name before protocol compiler (always set)\n\tJSONName string // name to use for JSON; determined by protoc\n\tWire     string\n\tWireType int\n\tTag      int\n\tRequired bool\n\tOptional bool\n\tRepeated bool\n\tPacked   bool   // relevant for repeated primitives only\n\tEnum     string // set for enum types only\n\tproto3   bool   // whether this is known to be a proto3 field; set for []byte only\n\toneof    bool   // whether this is a oneof field\n\n\tDefault    string // default value\n\tHasDefault bool   // whether an explicit default was provided\n\tdef_uint64 uint64\n\n\tenc           encoder\n\tvalEnc        valueEncoder // set for bool and numeric types only\n\tfield         field\n\ttagcode       []byte // encoding of EncodeVarint((Tag<<3)|WireType)\n\ttagbuf        [8]byte\n\tstype         reflect.Type      // set for struct types only\n\tsprop         *StructProperties // set for struct types only\n\tisMarshaler   bool\n\tisUnmarshaler bool\n\n\tmtype    reflect.Type // set for map types only\n\tmkeyprop *Properties  // set for map types only\n\tmvalprop *Properties  // set for map types only\n\n\tsize    sizer\n\tvalSize valueSizer // set for bool and numeric types only\n\n\tdec    decoder\n\tvalDec valueDecoder // set for bool and numeric types only\n\n\t// If this is a packable field, this will be the decoder for the packed version of the field.\n\tpackedDec decoder\n}\n\n// String formats the properties in the protobuf struct field tag style.\nfunc (p *Properties) String() string {\n\ts := p.Wire\n\ts = \",\"\n\ts += strconv.Itoa(p.Tag)\n\tif p.Required {\n\t\ts += \",req\"\n\t}\n\tif p.Optional {\n\t\ts += \",opt\"\n\t}\n\tif p.Repeated {\n\t\ts += \",rep\"\n\t}\n\tif p.Packed {\n\t\ts += \",packed\"\n\t}\n\ts += \",name=\" + p.OrigName\n\tif p.JSONName != p.OrigName {\n\t\ts += \",json=\" + p.JSONName\n\t}\n\tif p.proto3 {\n\t\ts += \",proto3\"\n\t}\n\tif p.oneof {\n\t\ts += \",oneof\"\n\t}\n\tif len(p.Enum) > 0 {\n\t\ts += \",enum=\" + p.Enum\n\t}\n\tif p.HasDefault {\n\t\ts += \",def=\" + p.Default\n\t}\n\treturn s\n}\n\n// Parse populates p by parsing a string in the protobuf struct field tag style.\nfunc (p *Properties) Parse(s string) {\n\t// \"bytes,49,opt,name=foo,def=hello!\"\n\tfields := strings.Split(s, \",\") // breaks def=, but handled below.\n\tif len(fields) < 2 {\n\t\tfmt.Fprintf(os.Stderr, \"proto: tag has too few fields: %q\\n\", s)\n\t\treturn\n\t}\n\n\tp.Wire = fields[0]\n\tswitch p.Wire {\n\tcase \"varint\":\n\t\tp.WireType = WireVarint\n\t\tp.valEnc = (*Buffer).EncodeVarint\n\t\tp.valDec = (*Buffer).DecodeVarint\n\t\tp.valSize = sizeVarint\n\tcase \"fixed32\":\n\t\tp.WireType = WireFixed32\n\t\tp.valEnc = (*Buffer).EncodeFixed32\n\t\tp.valDec = (*Buffer).DecodeFixed32\n\t\tp.valSize = sizeFixed32\n\tcase \"fixed64\":\n\t\tp.WireType = WireFixed64\n\t\tp.valEnc = (*Buffer).EncodeFixed64\n\t\tp.valDec = (*Buffer).DecodeFixed64\n\t\tp.valSize = sizeFixed64\n\tcase \"zigzag32\":\n\t\tp.WireType = WireVarint\n\t\tp.valEnc = (*Buffer).EncodeZigzag32\n\t\tp.valDec = (*Buffer).DecodeZigzag32\n\t\tp.valSize = sizeZigzag32\n\tcase \"zigzag64\":\n\t\tp.WireType = WireVarint\n\t\tp.valEnc = (*Buffer).EncodeZigzag64\n\t\tp.valDec = (*Buffer).DecodeZigzag64\n\t\tp.valSize = sizeZigzag64\n\tcase \"bytes\", \"group\":\n\t\tp.WireType = WireBytes\n\t\t// no numeric converter for non-numeric types\n\tdefault:\n\t\tfmt.Fprintf(os.Stderr, \"proto: tag has unknown wire type: %q\\n\", s)\n\t\treturn\n\t}\n\n\tvar err error\n\tp.Tag, err = strconv.Atoi(fields[1])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tfor i := 2; i < len(fields); i++ {\n\t\tf := fields[i]\n\t\tswitch {\n\t\tcase f == \"req\":\n\t\t\tp.Required = true\n\t\tcase f == \"opt\":\n\t\t\tp.Optional = true\n\t\tcase f == \"rep\":\n\t\t\tp.Repeated = true\n\t\tcase f == \"packed\":\n\t\t\tp.Packed = true\n\t\tcase strings.HasPrefix(f, \"name=\"):\n\t\t\tp.OrigName = f[5:]\n\t\tcase strings.HasPrefix(f, \"json=\"):\n\t\t\tp.JSONName = f[5:]\n\t\tcase strings.HasPrefix(f, \"enum=\"):\n\t\t\tp.Enum = f[5:]\n\t\tcase f == \"proto3\":\n\t\t\tp.proto3 = true\n\t\tcase f == \"oneof\":\n\t\t\tp.oneof = true\n\t\tcase strings.HasPrefix(f, \"def=\"):\n\t\t\tp.HasDefault = true\n\t\t\tp.Default = f[4:] // rest of string\n\t\t\tif i+1 < len(fields) {\n\t\t\t\t// Commas aren't escaped, and def is always last.\n\t\t\t\tp.Default += \",\" + strings.Join(fields[i+1:], \",\")\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc logNoSliceEnc(t1, t2 reflect.Type) {\n\tfmt.Fprintf(os.Stderr, \"proto: no slice oenc for %T = []%T\\n\", t1, t2)\n}\n\nvar protoMessageType = reflect.TypeOf((*Message)(nil)).Elem()\n\n// Initialize the fields for encoding and decoding.\nfunc (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) {\n\tp.enc = nil\n\tp.dec = nil\n\tp.size = nil\n\n\tswitch t1 := typ; t1.Kind() {\n\tdefault:\n\t\tfmt.Fprintf(os.Stderr, \"proto: no coders for %v\\n\", t1)\n\n\t// proto3 scalar types\n\n\tcase reflect.Bool:\n\t\tp.enc = (*Buffer).enc_proto3_bool\n\t\tp.dec = (*Buffer).dec_proto3_bool\n\t\tp.size = size_proto3_bool\n\tcase reflect.Int32:\n\t\tp.enc = (*Buffer).enc_proto3_int32\n\t\tp.dec = (*Buffer).dec_proto3_int32\n\t\tp.size = size_proto3_int32\n\tcase reflect.Uint32:\n\t\tp.enc = (*Buffer).enc_proto3_uint32\n\t\tp.dec = (*Buffer).dec_proto3_int32 // can reuse\n\t\tp.size = size_proto3_uint32\n\tcase reflect.Int64, reflect.Uint64:\n\t\tp.enc = (*Buffer).enc_proto3_int64\n\t\tp.dec = (*Buffer).dec_proto3_int64\n\t\tp.size = size_proto3_int64\n\tcase reflect.Float32:\n\t\tp.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits\n\t\tp.dec = (*Buffer).dec_proto3_int32\n\t\tp.size = size_proto3_uint32\n\tcase reflect.Float64:\n\t\tp.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits\n\t\tp.dec = (*Buffer).dec_proto3_int64\n\t\tp.size = size_proto3_int64\n\tcase reflect.String:\n\t\tp.enc = (*Buffer).enc_proto3_string\n\t\tp.dec = (*Buffer).dec_proto3_string\n\t\tp.size = size_proto3_string\n\n\tcase reflect.Ptr:\n\t\tswitch t2 := t1.Elem(); t2.Kind() {\n\t\tdefault:\n\t\t\tfmt.Fprintf(os.Stderr, \"proto: no encoder function for %v -> %v\\n\", t1, t2)\n\t\t\tbreak\n\t\tcase reflect.Bool:\n\t\t\tp.enc = (*Buffer).enc_bool\n\t\t\tp.dec = (*Buffer).dec_bool\n\t\t\tp.size = size_bool\n\t\tcase reflect.Int32:\n\t\t\tp.enc = (*Buffer).enc_int32\n\t\t\tp.dec = (*Buffer).dec_int32\n\t\t\tp.size = size_int32\n\t\tcase reflect.Uint32:\n\t\t\tp.enc = (*Buffer).enc_uint32\n\t\t\tp.dec = (*Buffer).dec_int32 // can reuse\n\t\t\tp.size = size_uint32\n\t\tcase reflect.Int64, reflect.Uint64:\n\t\t\tp.enc = (*Buffer).enc_int64\n\t\t\tp.dec = (*Buffer).dec_int64\n\t\t\tp.size = size_int64\n\t\tcase reflect.Float32:\n\t\t\tp.enc = (*Buffer).enc_uint32 // can just treat them as bits\n\t\t\tp.dec = (*Buffer).dec_int32\n\t\t\tp.size = size_uint32\n\t\tcase reflect.Float64:\n\t\t\tp.enc = (*Buffer).enc_int64 // can just treat them as bits\n\t\t\tp.dec = (*Buffer).dec_int64\n\t\t\tp.size = size_int64\n\t\tcase reflect.String:\n\t\t\tp.enc = (*Buffer).enc_string\n\t\t\tp.dec = (*Buffer).dec_string\n\t\t\tp.size = size_string\n\t\tcase reflect.Struct:\n\t\t\tp.stype = t1.Elem()\n\t\t\tp.isMarshaler = isMarshaler(t1)\n\t\t\tp.isUnmarshaler = isUnmarshaler(t1)\n\t\t\tif p.Wire == \"bytes\" {\n\t\t\t\tp.enc = (*Buffer).enc_struct_message\n\t\t\t\tp.dec = (*Buffer).dec_struct_message\n\t\t\t\tp.size = size_struct_message\n\t\t\t} else {\n\t\t\t\tp.enc = (*Buffer).enc_struct_group\n\t\t\t\tp.dec = (*Buffer).dec_struct_group\n\t\t\t\tp.size = size_struct_group\n\t\t\t}\n\t\t}\n\n\tcase reflect.Slice:\n\t\tswitch t2 := t1.Elem(); t2.Kind() {\n\t\tdefault:\n\t\t\tlogNoSliceEnc(t1, t2)\n\t\t\tbreak\n\t\tcase reflect.Bool:\n\t\t\tif p.Packed {\n\t\t\t\tp.enc = (*Buffer).enc_slice_packed_bool\n\t\t\t\tp.size = size_slice_packed_bool\n\t\t\t} else {\n\t\t\t\tp.enc = (*Buffer).enc_slice_bool\n\t\t\t\tp.size = size_slice_bool\n\t\t\t}\n\t\t\tp.dec = (*Buffer).dec_slice_bool\n\t\t\tp.packedDec = (*Buffer).dec_slice_packed_bool\n\t\tcase reflect.Int32:\n\t\t\tif p.Packed {\n\t\t\t\tp.enc = (*Buffer).enc_slice_packed_int32\n\t\t\t\tp.size = size_slice_packed_int32\n\t\t\t} else {\n\t\t\t\tp.enc = (*Buffer).enc_slice_int32\n\t\t\t\tp.size = size_slice_int32\n\t\t\t}\n\t\t\tp.dec = (*Buffer).dec_slice_int32\n\t\t\tp.packedDec = (*Buffer).dec_slice_packed_int32\n\t\tcase reflect.Uint32:\n\t\t\tif p.Packed {\n\t\t\t\tp.enc = (*Buffer).enc_slice_packed_uint32\n\t\t\t\tp.size = size_slice_packed_uint32\n\t\t\t} else {\n\t\t\t\tp.enc = (*Buffer).enc_slice_uint32\n\t\t\t\tp.size = size_slice_uint32\n\t\t\t}\n\t\t\tp.dec = (*Buffer).dec_slice_int32\n\t\t\tp.packedDec = (*Buffer).dec_slice_packed_int32\n\t\tcase reflect.Int64, reflect.Uint64:\n\t\t\tif p.Packed {\n\t\t\t\tp.enc = (*Buffer).enc_slice_packed_int64\n\t\t\t\tp.size = size_slice_packed_int64\n\t\t\t} else {\n\t\t\t\tp.enc = (*Buffer).enc_slice_int64\n\t\t\t\tp.size = size_slice_int64\n\t\t\t}\n\t\t\tp.dec = (*Buffer).dec_slice_int64\n\t\t\tp.packedDec = (*Buffer).dec_slice_packed_int64\n\t\tcase reflect.Uint8:\n\t\t\tp.dec = (*Buffer).dec_slice_byte\n\t\t\tif p.proto3 {\n\t\t\t\tp.enc = (*Buffer).enc_proto3_slice_byte\n\t\t\t\tp.size = size_proto3_slice_byte\n\t\t\t} else {\n\t\t\t\tp.enc = (*Buffer).enc_slice_byte\n\t\t\t\tp.size = size_slice_byte\n\t\t\t}\n\t\tcase reflect.Float32, reflect.Float64:\n\t\t\tswitch t2.Bits() {\n\t\t\tcase 32:\n\t\t\t\t// can just treat them as bits\n\t\t\t\tif p.Packed {\n\t\t\t\t\tp.enc = (*Buffer).enc_slice_packed_uint32\n\t\t\t\t\tp.size = size_slice_packed_uint32\n\t\t\t\t} else {\n\t\t\t\t\tp.enc = (*Buffer).enc_slice_uint32\n\t\t\t\t\tp.size = size_slice_uint32\n\t\t\t\t}\n\t\t\t\tp.dec = (*Buffer).dec_slice_int32\n\t\t\t\tp.packedDec = (*Buffer).dec_slice_packed_int32\n\t\t\tcase 64:\n\t\t\t\t// can just treat them as bits\n\t\t\t\tif p.Packed {\n\t\t\t\t\tp.enc = (*Buffer).enc_slice_packed_int64\n\t\t\t\t\tp.size = size_slice_packed_int64\n\t\t\t\t} else {\n\t\t\t\t\tp.enc = (*Buffer).enc_slice_int64\n\t\t\t\t\tp.size = size_slice_int64\n\t\t\t\t}\n\t\t\t\tp.dec = (*Buffer).dec_slice_int64\n\t\t\t\tp.packedDec = (*Buffer).dec_slice_packed_int64\n\t\t\tdefault:\n\t\t\t\tlogNoSliceEnc(t1, t2)\n\t\t\t\tbreak\n\t\t\t}\n\t\tcase reflect.String:\n\t\t\tp.enc = (*Buffer).enc_slice_string\n\t\t\tp.dec = (*Buffer).dec_slice_string\n\t\t\tp.size = size_slice_string\n\t\tcase reflect.Ptr:\n\t\t\tswitch t3 := t2.Elem(); t3.Kind() {\n\t\t\tdefault:\n\t\t\t\tfmt.Fprintf(os.Stderr, \"proto: no ptr oenc for %T -> %T -> %T\\n\", t1, t2, t3)\n\t\t\t\tbreak\n\t\t\tcase reflect.Struct:\n\t\t\t\tp.stype = t2.Elem()\n\t\t\t\tp.isMarshaler = isMarshaler(t2)\n\t\t\t\tp.isUnmarshaler = isUnmarshaler(t2)\n\t\t\t\tif p.Wire == \"bytes\" {\n\t\t\t\t\tp.enc = (*Buffer).enc_slice_struct_message\n\t\t\t\t\tp.dec = (*Buffer).dec_slice_struct_message\n\t\t\t\t\tp.size = size_slice_struct_message\n\t\t\t\t} else {\n\t\t\t\t\tp.enc = (*Buffer).enc_slice_struct_group\n\t\t\t\t\tp.dec = (*Buffer).dec_slice_struct_group\n\t\t\t\t\tp.size = size_slice_struct_group\n\t\t\t\t}\n\t\t\t}\n\t\tcase reflect.Slice:\n\t\t\tswitch t2.Elem().Kind() {\n\t\t\tdefault:\n\t\t\t\tfmt.Fprintf(os.Stderr, \"proto: no slice elem oenc for %T -> %T -> %T\\n\", t1, t2, t2.Elem())\n\t\t\t\tbreak\n\t\t\tcase reflect.Uint8:\n\t\t\t\tp.enc = (*Buffer).enc_slice_slice_byte\n\t\t\t\tp.dec = (*Buffer).dec_slice_slice_byte\n\t\t\t\tp.size = size_slice_slice_byte\n\t\t\t}\n\t\t}\n\n\tcase reflect.Map:\n\t\tp.enc = (*Buffer).enc_new_map\n\t\tp.dec = (*Buffer).dec_new_map\n\t\tp.size = size_new_map\n\n\t\tp.mtype = t1\n\t\tp.mkeyprop = &Properties{}\n\t\tp.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), \"Key\", f.Tag.Get(\"protobuf_key\"), nil, lockGetProp)\n\t\tp.mvalprop = &Properties{}\n\t\tvtype := p.mtype.Elem()\n\t\tif vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice {\n\t\t\t// The value type is not a message (*T) or bytes ([]byte),\n\t\t\t// so we need encoders for the pointer to this type.\n\t\t\tvtype = reflect.PtrTo(vtype)\n\t\t}\n\t\tp.mvalprop.init(vtype, \"Value\", f.Tag.Get(\"protobuf_val\"), nil, lockGetProp)\n\t}\n\n\t// precalculate tag code\n\twire := p.WireType\n\tif p.Packed {\n\t\twire = WireBytes\n\t}\n\tx := uint32(p.Tag)<<3 | uint32(wire)\n\ti := 0\n\tfor i = 0; x > 127; i++ {\n\t\tp.tagbuf[i] = 0x80 | uint8(x&0x7F)\n\t\tx >>= 7\n\t}\n\tp.tagbuf[i] = uint8(x)\n\tp.tagcode = p.tagbuf[0 : i+1]\n\n\tif p.stype != nil {\n\t\tif lockGetProp {\n\t\t\tp.sprop = GetProperties(p.stype)\n\t\t} else {\n\t\t\tp.sprop = getPropertiesLocked(p.stype)\n\t\t}\n\t}\n}\n\nvar (\n\tmarshalerType   = reflect.TypeOf((*Marshaler)(nil)).Elem()\n\tunmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem()\n)\n\n// isMarshaler reports whether type t implements Marshaler.\nfunc isMarshaler(t reflect.Type) bool {\n\t// We're checking for (likely) pointer-receiver methods\n\t// so if t is not a pointer, something is very wrong.\n\t// The calls above only invoke isMarshaler on pointer types.\n\tif t.Kind() != reflect.Ptr {\n\t\tpanic(\"proto: misuse of isMarshaler\")\n\t}\n\treturn t.Implements(marshalerType)\n}\n\n// isUnmarshaler reports whether type t implements Unmarshaler.\nfunc isUnmarshaler(t reflect.Type) bool {\n\t// We're checking for (likely) pointer-receiver methods\n\t// so if t is not a pointer, something is very wrong.\n\t// The calls above only invoke isUnmarshaler on pointer types.\n\tif t.Kind() != reflect.Ptr {\n\t\tpanic(\"proto: misuse of isUnmarshaler\")\n\t}\n\treturn t.Implements(unmarshalerType)\n}\n\n// Init populates the properties from a protocol buffer struct tag.\nfunc (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) {\n\tp.init(typ, name, tag, f, true)\n}\n\nfunc (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) {\n\t// \"bytes,49,opt,def=hello!\"\n\tp.Name = name\n\tp.OrigName = name\n\tif f != nil {\n\t\tp.field = toField(f)\n\t}\n\tif tag == \"\" {\n\t\treturn\n\t}\n\tp.Parse(tag)\n\tp.setEncAndDec(typ, f, lockGetProp)\n}\n\nvar (\n\tpropertiesMu  sync.RWMutex\n\tpropertiesMap = make(map[reflect.Type]*StructProperties)\n)\n\n// GetProperties returns the list of properties for the type represented by t.\n// t must represent a generated struct type of a protocol message.\nfunc GetProperties(t reflect.Type) *StructProperties {\n\tif t.Kind() != reflect.Struct {\n\t\tpanic(\"proto: type must have kind struct\")\n\t}\n\n\t// Most calls to GetProperties in a long-running program will be\n\t// retrieving details for types we have seen before.\n\tpropertiesMu.RLock()\n\tsprop, ok := propertiesMap[t]\n\tpropertiesMu.RUnlock()\n\tif ok {\n\t\tif collectStats {\n\t\t\tstats.Chit++\n\t\t}\n\t\treturn sprop\n\t}\n\n\tpropertiesMu.Lock()\n\tsprop = getPropertiesLocked(t)\n\tpropertiesMu.Unlock()\n\treturn sprop\n}\n\n// getPropertiesLocked requires that propertiesMu is held.\nfunc getPropertiesLocked(t reflect.Type) *StructProperties {\n\tif prop, ok := propertiesMap[t]; ok {\n\t\tif collectStats {\n\t\t\tstats.Chit++\n\t\t}\n\t\treturn prop\n\t}\n\tif collectStats {\n\t\tstats.Cmiss++\n\t}\n\n\tprop := new(StructProperties)\n\t// in case of recursive protos, fill this in now.\n\tpropertiesMap[t] = prop\n\n\t// build properties\n\tprop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) ||\n\t\treflect.PtrTo(t).Implements(extendableProtoV1Type)\n\tprop.unrecField = invalidField\n\tprop.Prop = make([]*Properties, t.NumField())\n\tprop.order = make([]int, t.NumField())\n\n\tfor i := 0; i < t.NumField(); i++ {\n\t\tf := t.Field(i)\n\t\tp := new(Properties)\n\t\tname := f.Name\n\t\tp.init(f.Type, name, f.Tag.Get(\"protobuf\"), &f, false)\n\n\t\tif f.Name == \"XXX_InternalExtensions\" { // special case\n\t\t\tp.enc = (*Buffer).enc_exts\n\t\t\tp.dec = nil // not needed\n\t\t\tp.size = size_exts\n\t\t} else if f.Name == \"XXX_extensions\" { // special case\n\t\t\tp.enc = (*Buffer).enc_map\n\t\t\tp.dec = nil // not needed\n\t\t\tp.size = size_map\n\t\t} else if f.Name == \"XXX_unrecognized\" { // special case\n\t\t\tprop.unrecField = toField(&f)\n\t\t}\n\t\toneof := f.Tag.Get(\"protobuf_oneof\") // special case\n\t\tif oneof != \"\" {\n\t\t\t// Oneof fields don't use the traditional protobuf tag.\n\t\t\tp.OrigName = oneof\n\t\t}\n\t\tprop.Prop[i] = p\n\t\tprop.order[i] = i\n\t\tif debug {\n\t\t\tprint(i, \" \", f.Name, \" \", t.String(), \" \")\n\t\t\tif p.Tag > 0 {\n\t\t\t\tprint(p.String())\n\t\t\t}\n\t\t\tprint(\"\\n\")\n\t\t}\n\t\tif p.enc == nil && !strings.HasPrefix(f.Name, \"XXX_\") && oneof == \"\" {\n\t\t\tfmt.Fprintln(os.Stderr, \"proto: no encoder for\", f.Name, f.Type.String(), \"[GetProperties]\")\n\t\t}\n\t}\n\n\t// Re-order prop.order.\n\tsort.Sort(prop)\n\n\ttype oneofMessage interface {\n\t\tXXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{})\n\t}\n\tif om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok {\n\t\tvar oots []interface{}\n\t\tprop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs()\n\t\tprop.stype = t\n\n\t\t// Interpret oneof metadata.\n\t\tprop.OneofTypes = make(map[string]*OneofProperties)\n\t\tfor _, oot := range oots {\n\t\t\toop := &OneofProperties{\n\t\t\t\tType: reflect.ValueOf(oot).Type(), // *T\n\t\t\t\tProp: new(Properties),\n\t\t\t}\n\t\t\tsft := oop.Type.Elem().Field(0)\n\t\t\toop.Prop.Name = sft.Name\n\t\t\toop.Prop.Parse(sft.Tag.Get(\"protobuf\"))\n\t\t\t// There will be exactly one interface field that\n\t\t\t// this new value is assignable to.\n\t\t\tfor i := 0; i < t.NumField(); i++ {\n\t\t\t\tf := t.Field(i)\n\t\t\t\tif f.Type.Kind() != reflect.Interface {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif !oop.Type.AssignableTo(f.Type) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\toop.Field = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tprop.OneofTypes[oop.Prop.OrigName] = oop\n\t\t}\n\t}\n\n\t// build required counts\n\t// build tags\n\treqCount := 0\n\tprop.decoderOrigNames = make(map[string]int)\n\tfor i, p := range prop.Prop {\n\t\tif strings.HasPrefix(p.Name, \"XXX_\") {\n\t\t\t// Internal fields should not appear in tags/origNames maps.\n\t\t\t// They are handled specially when encoding and decoding.\n\t\t\tcontinue\n\t\t}\n\t\tif p.Required {\n\t\t\treqCount++\n\t\t}\n\t\tprop.decoderTags.put(p.Tag, i)\n\t\tprop.decoderOrigNames[p.OrigName] = i\n\t}\n\tprop.reqCount = reqCount\n\n\treturn prop\n}\n\n// Return the Properties object for the x[0]'th field of the structure.\nfunc propByIndex(t reflect.Type, x []int) *Properties {\n\tif len(x) != 1 {\n\t\tfmt.Fprintf(os.Stderr, \"proto: field index dimension %d (not 1) for type %s\\n\", len(x), t)\n\t\treturn nil\n\t}\n\tprop := GetProperties(t)\n\treturn prop.Prop[x[0]]\n}\n\n// Get the address and type of a pointer to a struct from an interface.\nfunc getbase(pb Message) (t reflect.Type, b structPointer, err error) {\n\tif pb == nil {\n\t\terr = ErrNil\n\t\treturn\n\t}\n\t// get the reflect type of the pointer to the struct.\n\tt = reflect.TypeOf(pb)\n\t// get the address of the struct.\n\tvalue := reflect.ValueOf(pb)\n\tb = toStructPointer(value)\n\treturn\n}\n\n// A global registry of enum types.\n// The generated code will register the generated maps by calling RegisterEnum.\n\nvar enumValueMaps = make(map[string]map[string]int32)\n\n// RegisterEnum is called from the generated code to install the enum descriptor\n// maps into the global table to aid parsing text format protocol buffers.\nfunc RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) {\n\tif _, ok := enumValueMaps[typeName]; ok {\n\t\tpanic(\"proto: duplicate enum registered: \" + typeName)\n\t}\n\tenumValueMaps[typeName] = valueMap\n}\n\n// EnumValueMap returns the mapping from names to integers of the\n// enum type enumType, or a nil if not found.\nfunc EnumValueMap(enumType string) map[string]int32 {\n\treturn enumValueMaps[enumType]\n}\n\n// A registry of all linked message types.\n// The string is a fully-qualified proto name (\"pkg.Message\").\nvar (\n\tprotoTypes    = make(map[string]reflect.Type)\n\trevProtoTypes = make(map[reflect.Type]string)\n)\n\n// RegisterType is called from generated code and maps from the fully qualified\n// proto name to the type (pointer to struct) of the protocol buffer.\nfunc RegisterType(x Message, name string) {\n\tif _, ok := protoTypes[name]; ok {\n\t\t// TODO: Some day, make this a panic.\n\t\tlog.Printf(\"proto: duplicate proto type registered: %s\", name)\n\t\treturn\n\t}\n\tt := reflect.TypeOf(x)\n\tprotoTypes[name] = t\n\trevProtoTypes[t] = name\n}\n\n// MessageName returns the fully-qualified proto name for the given message type.\nfunc MessageName(x Message) string {\n\ttype xname interface {\n\t\tXXX_MessageName() string\n\t}\n\tif m, ok := x.(xname); ok {\n\t\treturn m.XXX_MessageName()\n\t}\n\treturn revProtoTypes[reflect.TypeOf(x)]\n}\n\n// MessageType returns the message type (pointer to struct) for a named message.\nfunc MessageType(name string) reflect.Type { return protoTypes[name] }\n\n// A registry of all linked proto files.\nvar (\n\tprotoFiles = make(map[string][]byte) // file name => fileDescriptor\n)\n\n// RegisterFile is called from generated code and maps from the\n// full file name of a .proto file to its compressed FileDescriptorProto.\nfunc RegisterFile(filename string, fileDescriptor []byte) {\n\tprotoFiles[filename] = fileDescriptor\n}\n\n// FileDescriptor returns the compressed FileDescriptorProto for a .proto file.\nfunc FileDescriptor(filename string) []byte { return protoFiles[filename] }\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/text.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage proto\n\n// Functions for writing the text protocol buffer format.\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"math\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n)\n\nvar (\n\tnewline         = []byte(\"\\n\")\n\tspaces          = []byte(\"                                        \")\n\tgtNewline       = []byte(\">\\n\")\n\tendBraceNewline = []byte(\"}\\n\")\n\tbackslashN      = []byte{'\\\\', 'n'}\n\tbackslashR      = []byte{'\\\\', 'r'}\n\tbackslashT      = []byte{'\\\\', 't'}\n\tbackslashDQ     = []byte{'\\\\', '\"'}\n\tbackslashBS     = []byte{'\\\\', '\\\\'}\n\tposInf          = []byte(\"inf\")\n\tnegInf          = []byte(\"-inf\")\n\tnan             = []byte(\"nan\")\n)\n\ntype writer interface {\n\tio.Writer\n\tWriteByte(byte) error\n}\n\n// textWriter is an io.Writer that tracks its indentation level.\ntype textWriter struct {\n\tind      int\n\tcomplete bool // if the current position is a complete line\n\tcompact  bool // whether to write out as a one-liner\n\tw        writer\n}\n\nfunc (w *textWriter) WriteString(s string) (n int, err error) {\n\tif !strings.Contains(s, \"\\n\") {\n\t\tif !w.compact && w.complete {\n\t\t\tw.writeIndent()\n\t\t}\n\t\tw.complete = false\n\t\treturn io.WriteString(w.w, s)\n\t}\n\t// WriteString is typically called without newlines, so this\n\t// codepath and its copy are rare.  We copy to avoid\n\t// duplicating all of Write's logic here.\n\treturn w.Write([]byte(s))\n}\n\nfunc (w *textWriter) Write(p []byte) (n int, err error) {\n\tnewlines := bytes.Count(p, newline)\n\tif newlines == 0 {\n\t\tif !w.compact && w.complete {\n\t\t\tw.writeIndent()\n\t\t}\n\t\tn, err = w.w.Write(p)\n\t\tw.complete = false\n\t\treturn n, err\n\t}\n\n\tfrags := bytes.SplitN(p, newline, newlines+1)\n\tif w.compact {\n\t\tfor i, frag := range frags {\n\t\t\tif i > 0 {\n\t\t\t\tif err := w.w.WriteByte(' '); err != nil {\n\t\t\t\t\treturn n, err\n\t\t\t\t}\n\t\t\t\tn++\n\t\t\t}\n\t\t\tnn, err := w.w.Write(frag)\n\t\t\tn += nn\n\t\t\tif err != nil {\n\t\t\t\treturn n, err\n\t\t\t}\n\t\t}\n\t\treturn n, nil\n\t}\n\n\tfor i, frag := range frags {\n\t\tif w.complete {\n\t\t\tw.writeIndent()\n\t\t}\n\t\tnn, err := w.w.Write(frag)\n\t\tn += nn\n\t\tif err != nil {\n\t\t\treturn n, err\n\t\t}\n\t\tif i+1 < len(frags) {\n\t\t\tif err := w.w.WriteByte('\\n'); err != nil {\n\t\t\t\treturn n, err\n\t\t\t}\n\t\t\tn++\n\t\t}\n\t}\n\tw.complete = len(frags[len(frags)-1]) == 0\n\treturn n, nil\n}\n\nfunc (w *textWriter) WriteByte(c byte) error {\n\tif w.compact && c == '\\n' {\n\t\tc = ' '\n\t}\n\tif !w.compact && w.complete {\n\t\tw.writeIndent()\n\t}\n\terr := w.w.WriteByte(c)\n\tw.complete = c == '\\n'\n\treturn err\n}\n\nfunc (w *textWriter) indent() { w.ind++ }\n\nfunc (w *textWriter) unindent() {\n\tif w.ind == 0 {\n\t\tlog.Print(\"proto: textWriter unindented too far\")\n\t\treturn\n\t}\n\tw.ind--\n}\n\nfunc writeName(w *textWriter, props *Properties) error {\n\tif _, err := w.WriteString(props.OrigName); err != nil {\n\t\treturn err\n\t}\n\tif props.Wire != \"group\" {\n\t\treturn w.WriteByte(':')\n\t}\n\treturn nil\n}\n\n// raw is the interface satisfied by RawMessage.\ntype raw interface {\n\tBytes() []byte\n}\n\nfunc requiresQuotes(u string) bool {\n\t// When type URL contains any characters except [0-9A-Za-z./\\-]*, it must be quoted.\n\tfor _, ch := range u {\n\t\tswitch {\n\t\tcase ch == '.' || ch == '/' || ch == '_':\n\t\t\tcontinue\n\t\tcase '0' <= ch && ch <= '9':\n\t\t\tcontinue\n\t\tcase 'A' <= ch && ch <= 'Z':\n\t\t\tcontinue\n\t\tcase 'a' <= ch && ch <= 'z':\n\t\t\tcontinue\n\t\tdefault:\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// isAny reports whether sv is a google.protobuf.Any message\nfunc isAny(sv reflect.Value) bool {\n\ttype wkt interface {\n\t\tXXX_WellKnownType() string\n\t}\n\tt, ok := sv.Addr().Interface().(wkt)\n\treturn ok && t.XXX_WellKnownType() == \"Any\"\n}\n\n// writeProto3Any writes an expanded google.protobuf.Any message.\n//\n// It returns (false, nil) if sv value can't be unmarshaled (e.g. because\n// required messages are not linked in).\n//\n// It returns (true, error) when sv was written in expanded format or an error\n// was encountered.\nfunc (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) {\n\tturl := sv.FieldByName(\"TypeUrl\")\n\tval := sv.FieldByName(\"Value\")\n\tif !turl.IsValid() || !val.IsValid() {\n\t\treturn true, errors.New(\"proto: invalid google.protobuf.Any message\")\n\t}\n\n\tb, ok := val.Interface().([]byte)\n\tif !ok {\n\t\treturn true, errors.New(\"proto: invalid google.protobuf.Any message\")\n\t}\n\n\tparts := strings.Split(turl.String(), \"/\")\n\tmt := MessageType(parts[len(parts)-1])\n\tif mt == nil {\n\t\treturn false, nil\n\t}\n\tm := reflect.New(mt.Elem())\n\tif err := Unmarshal(b, m.Interface().(Message)); err != nil {\n\t\treturn false, nil\n\t}\n\tw.Write([]byte(\"[\"))\n\tu := turl.String()\n\tif requiresQuotes(u) {\n\t\twriteString(w, u)\n\t} else {\n\t\tw.Write([]byte(u))\n\t}\n\tif w.compact {\n\t\tw.Write([]byte(\"]:<\"))\n\t} else {\n\t\tw.Write([]byte(\"]: <\\n\"))\n\t\tw.ind++\n\t}\n\tif err := tm.writeStruct(w, m.Elem()); err != nil {\n\t\treturn true, err\n\t}\n\tif w.compact {\n\t\tw.Write([]byte(\"> \"))\n\t} else {\n\t\tw.ind--\n\t\tw.Write([]byte(\">\\n\"))\n\t}\n\treturn true, nil\n}\n\nfunc (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error {\n\tif tm.ExpandAny && isAny(sv) {\n\t\tif canExpand, err := tm.writeProto3Any(w, sv); canExpand {\n\t\t\treturn err\n\t\t}\n\t}\n\tst := sv.Type()\n\tsprops := GetProperties(st)\n\tfor i := 0; i < sv.NumField(); i++ {\n\t\tfv := sv.Field(i)\n\t\tprops := sprops.Prop[i]\n\t\tname := st.Field(i).Name\n\n\t\tif strings.HasPrefix(name, \"XXX_\") {\n\t\t\t// There are two XXX_ fields:\n\t\t\t//   XXX_unrecognized []byte\n\t\t\t//   XXX_extensions   map[int32]proto.Extension\n\t\t\t// The first is handled here;\n\t\t\t// the second is handled at the bottom of this function.\n\t\t\tif name == \"XXX_unrecognized\" && !fv.IsNil() {\n\t\t\t\tif err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif fv.Kind() == reflect.Ptr && fv.IsNil() {\n\t\t\t// Field not filled in. This could be an optional field or\n\t\t\t// a required field that wasn't filled in. Either way, there\n\t\t\t// isn't anything we can show for it.\n\t\t\tcontinue\n\t\t}\n\t\tif fv.Kind() == reflect.Slice && fv.IsNil() {\n\t\t\t// Repeated field that is empty, or a bytes field that is unused.\n\t\t\tcontinue\n\t\t}\n\n\t\tif props.Repeated && fv.Kind() == reflect.Slice {\n\t\t\t// Repeated field.\n\t\t\tfor j := 0; j < fv.Len(); j++ {\n\t\t\t\tif err := writeName(w, props); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !w.compact {\n\t\t\t\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tv := fv.Index(j)\n\t\t\t\tif v.Kind() == reflect.Ptr && v.IsNil() {\n\t\t\t\t\t// A nil message in a repeated field is not valid,\n\t\t\t\t\t// but we can handle that more gracefully than panicking.\n\t\t\t\t\tif _, err := w.Write([]byte(\"<nil>\\n\")); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif err := tm.writeAny(w, v, props); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif fv.Kind() == reflect.Map {\n\t\t\t// Map fields are rendered as a repeated struct with key/value fields.\n\t\t\tkeys := fv.MapKeys()\n\t\t\tsort.Sort(mapKeys(keys))\n\t\t\tfor _, key := range keys {\n\t\t\t\tval := fv.MapIndex(key)\n\t\t\t\tif err := writeName(w, props); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !w.compact {\n\t\t\t\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// open struct\n\t\t\t\tif err := w.WriteByte('<'); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !w.compact {\n\t\t\t\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tw.indent()\n\t\t\t\t// key\n\t\t\t\tif _, err := w.WriteString(\"key:\"); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif !w.compact {\n\t\t\t\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif err := tm.writeAny(w, key, props.mkeyprop); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\t// nil values aren't legal, but we can avoid panicking because of them.\n\t\t\t\tif val.Kind() != reflect.Ptr || !val.IsNil() {\n\t\t\t\t\t// value\n\t\t\t\t\tif _, err := w.WriteString(\"value:\"); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif !w.compact {\n\t\t\t\t\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif err := tm.writeAny(w, val, props.mvalprop); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// close struct\n\t\t\t\tw.unindent()\n\t\t\t\tif err := w.WriteByte('>'); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 {\n\t\t\t// empty bytes field\n\t\t\tcontinue\n\t\t}\n\t\tif fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice {\n\t\t\t// proto3 non-repeated scalar field; skip if zero value\n\t\t\tif isProto3Zero(fv) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tif fv.Kind() == reflect.Interface {\n\t\t\t// Check if it is a oneof.\n\t\t\tif st.Field(i).Tag.Get(\"protobuf_oneof\") != \"\" {\n\t\t\t\t// fv is nil, or holds a pointer to generated struct.\n\t\t\t\t// That generated struct has exactly one field,\n\t\t\t\t// which has a protobuf struct tag.\n\t\t\t\tif fv.IsNil() {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tinner := fv.Elem().Elem() // interface -> *T -> T\n\t\t\t\ttag := inner.Type().Field(0).Tag.Get(\"protobuf\")\n\t\t\t\tprops = new(Properties) // Overwrite the outer props var, but not its pointee.\n\t\t\t\tprops.Parse(tag)\n\t\t\t\t// Write the value in the oneof, not the oneof itself.\n\t\t\t\tfv = inner.Field(0)\n\n\t\t\t\t// Special case to cope with malformed messages gracefully:\n\t\t\t\t// If the value in the oneof is a nil pointer, don't panic\n\t\t\t\t// in writeAny.\n\t\t\t\tif fv.Kind() == reflect.Ptr && fv.IsNil() {\n\t\t\t\t\t// Use errors.New so writeAny won't render quotes.\n\t\t\t\t\tmsg := errors.New(\"/* nil */\")\n\t\t\t\t\tfv = reflect.ValueOf(&msg).Elem()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif err := writeName(w, props); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !w.compact {\n\t\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif b, ok := fv.Interface().(raw); ok {\n\t\t\tif err := writeRaw(w, b.Bytes()); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Enums have a String method, so writeAny will work fine.\n\t\tif err := tm.writeAny(w, fv, props); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Extensions (the XXX_extensions field).\n\tpv := sv.Addr()\n\tif _, ok := extendable(pv.Interface()); ok {\n\t\tif err := tm.writeExtensions(w, pv); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// writeRaw writes an uninterpreted raw message.\nfunc writeRaw(w *textWriter, b []byte) error {\n\tif err := w.WriteByte('<'); err != nil {\n\t\treturn err\n\t}\n\tif !w.compact {\n\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tw.indent()\n\tif err := writeUnknownStruct(w, b); err != nil {\n\t\treturn err\n\t}\n\tw.unindent()\n\tif err := w.WriteByte('>'); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// writeAny writes an arbitrary field.\nfunc (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error {\n\tv = reflect.Indirect(v)\n\n\t// Floats have special cases.\n\tif v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 {\n\t\tx := v.Float()\n\t\tvar b []byte\n\t\tswitch {\n\t\tcase math.IsInf(x, 1):\n\t\t\tb = posInf\n\t\tcase math.IsInf(x, -1):\n\t\t\tb = negInf\n\t\tcase math.IsNaN(x):\n\t\t\tb = nan\n\t\t}\n\t\tif b != nil {\n\t\t\t_, err := w.Write(b)\n\t\t\treturn err\n\t\t}\n\t\t// Other values are handled below.\n\t}\n\n\t// We don't attempt to serialise every possible value type; only those\n\t// that can occur in protocol buffers.\n\tswitch v.Kind() {\n\tcase reflect.Slice:\n\t\t// Should only be a []byte; repeated fields are handled in writeStruct.\n\t\tif err := writeString(w, string(v.Bytes())); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase reflect.String:\n\t\tif err := writeString(w, v.String()); err != nil {\n\t\t\treturn err\n\t\t}\n\tcase reflect.Struct:\n\t\t// Required/optional group/message.\n\t\tvar bra, ket byte = '<', '>'\n\t\tif props != nil && props.Wire == \"group\" {\n\t\t\tbra, ket = '{', '}'\n\t\t}\n\t\tif err := w.WriteByte(bra); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif !w.compact {\n\t\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tw.indent()\n\t\tif etm, ok := v.Interface().(encoding.TextMarshaler); ok {\n\t\t\ttext, err := etm.MarshalText()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif _, err = w.Write(text); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else if err := tm.writeStruct(w, v); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tw.unindent()\n\t\tif err := w.WriteByte(ket); err != nil {\n\t\t\treturn err\n\t\t}\n\tdefault:\n\t\t_, err := fmt.Fprint(w, v.Interface())\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// equivalent to C's isprint.\nfunc isprint(c byte) bool {\n\treturn c >= 0x20 && c < 0x7f\n}\n\n// writeString writes a string in the protocol buffer text format.\n// It is similar to strconv.Quote except we don't use Go escape sequences,\n// we treat the string as a byte sequence, and we use octal escapes.\n// These differences are to maintain interoperability with the other\n// languages' implementations of the text format.\nfunc writeString(w *textWriter, s string) error {\n\t// use WriteByte here to get any needed indent\n\tif err := w.WriteByte('\"'); err != nil {\n\t\treturn err\n\t}\n\t// Loop over the bytes, not the runes.\n\tfor i := 0; i < len(s); i++ {\n\t\tvar err error\n\t\t// Divergence from C++: we don't escape apostrophes.\n\t\t// There's no need to escape them, and the C++ parser\n\t\t// copes with a naked apostrophe.\n\t\tswitch c := s[i]; c {\n\t\tcase '\\n':\n\t\t\t_, err = w.w.Write(backslashN)\n\t\tcase '\\r':\n\t\t\t_, err = w.w.Write(backslashR)\n\t\tcase '\\t':\n\t\t\t_, err = w.w.Write(backslashT)\n\t\tcase '\"':\n\t\t\t_, err = w.w.Write(backslashDQ)\n\t\tcase '\\\\':\n\t\t\t_, err = w.w.Write(backslashBS)\n\t\tdefault:\n\t\t\tif isprint(c) {\n\t\t\t\terr = w.w.WriteByte(c)\n\t\t\t} else {\n\t\t\t\t_, err = fmt.Fprintf(w.w, \"\\\\%03o\", c)\n\t\t\t}\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn w.WriteByte('\"')\n}\n\nfunc writeUnknownStruct(w *textWriter, data []byte) (err error) {\n\tif !w.compact {\n\t\tif _, err := fmt.Fprintf(w, \"/* %d unknown bytes */\\n\", len(data)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tb := NewBuffer(data)\n\tfor b.index < len(b.buf) {\n\t\tx, err := b.DecodeVarint()\n\t\tif err != nil {\n\t\t\t_, err := fmt.Fprintf(w, \"/* %v */\\n\", err)\n\t\t\treturn err\n\t\t}\n\t\twire, tag := x&7, x>>3\n\t\tif wire == WireEndGroup {\n\t\t\tw.unindent()\n\t\t\tif _, err := w.Write(endBraceNewline); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif _, err := fmt.Fprint(w, tag); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif wire != WireStartGroup {\n\t\t\tif err := w.WriteByte(':'); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif !w.compact || wire == WireStartGroup {\n\t\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tswitch wire {\n\t\tcase WireBytes:\n\t\t\tbuf, e := b.DecodeRawBytes(false)\n\t\t\tif e == nil {\n\t\t\t\t_, err = fmt.Fprintf(w, \"%q\", buf)\n\t\t\t} else {\n\t\t\t\t_, err = fmt.Fprintf(w, \"/* %v */\", e)\n\t\t\t}\n\t\tcase WireFixed32:\n\t\t\tx, err = b.DecodeFixed32()\n\t\t\terr = writeUnknownInt(w, x, err)\n\t\tcase WireFixed64:\n\t\t\tx, err = b.DecodeFixed64()\n\t\t\terr = writeUnknownInt(w, x, err)\n\t\tcase WireStartGroup:\n\t\t\terr = w.WriteByte('{')\n\t\t\tw.indent()\n\t\tcase WireVarint:\n\t\t\tx, err = b.DecodeVarint()\n\t\t\terr = writeUnknownInt(w, x, err)\n\t\tdefault:\n\t\t\t_, err = fmt.Fprintf(w, \"/* unknown wire type %d */\", wire)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err = w.WriteByte('\\n'); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc writeUnknownInt(w *textWriter, x uint64, err error) error {\n\tif err == nil {\n\t\t_, err = fmt.Fprint(w, x)\n\t} else {\n\t\t_, err = fmt.Fprintf(w, \"/* %v */\", err)\n\t}\n\treturn err\n}\n\ntype int32Slice []int32\n\nfunc (s int32Slice) Len() int           { return len(s) }\nfunc (s int32Slice) Less(i, j int) bool { return s[i] < s[j] }\nfunc (s int32Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }\n\n// writeExtensions writes all the extensions in pv.\n// pv is assumed to be a pointer to a protocol message struct that is extendable.\nfunc (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error {\n\temap := extensionMaps[pv.Type().Elem()]\n\tep, _ := extendable(pv.Interface())\n\n\t// Order the extensions by ID.\n\t// This isn't strictly necessary, but it will give us\n\t// canonical output, which will also make testing easier.\n\tm, mu := ep.extensionsRead()\n\tif m == nil {\n\t\treturn nil\n\t}\n\tmu.Lock()\n\tids := make([]int32, 0, len(m))\n\tfor id := range m {\n\t\tids = append(ids, id)\n\t}\n\tsort.Sort(int32Slice(ids))\n\tmu.Unlock()\n\n\tfor _, extNum := range ids {\n\t\text := m[extNum]\n\t\tvar desc *ExtensionDesc\n\t\tif emap != nil {\n\t\t\tdesc = emap[extNum]\n\t\t}\n\t\tif desc == nil {\n\t\t\t// Unknown extension.\n\t\t\tif err := writeUnknownStruct(w, ext.enc); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tpb, err := GetExtension(ep, desc)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed getting extension: %v\", err)\n\t\t}\n\n\t\t// Repeated extensions will appear as a slice.\n\t\tif !desc.repeated() {\n\t\t\tif err := tm.writeExtension(w, desc.Name, pb); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tv := reflect.ValueOf(pb)\n\t\t\tfor i := 0; i < v.Len(); i++ {\n\t\t\t\tif err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error {\n\tif _, err := fmt.Fprintf(w, \"[%s]:\", name); err != nil {\n\t\treturn err\n\t}\n\tif !w.compact {\n\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil {\n\t\treturn err\n\t}\n\tif err := w.WriteByte('\\n'); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (w *textWriter) writeIndent() {\n\tif !w.complete {\n\t\treturn\n\t}\n\tremain := w.ind * 2\n\tfor remain > 0 {\n\t\tn := remain\n\t\tif n > len(spaces) {\n\t\t\tn = len(spaces)\n\t\t}\n\t\tw.w.Write(spaces[:n])\n\t\tremain -= n\n\t}\n\tw.complete = false\n}\n\n// TextMarshaler is a configurable text format marshaler.\ntype TextMarshaler struct {\n\tCompact   bool // use compact text format (one line).\n\tExpandAny bool // expand google.protobuf.Any messages of known types\n}\n\n// Marshal writes a given protocol buffer in text format.\n// The only errors returned are from w.\nfunc (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error {\n\tval := reflect.ValueOf(pb)\n\tif pb == nil || val.IsNil() {\n\t\tw.Write([]byte(\"<nil>\"))\n\t\treturn nil\n\t}\n\tvar bw *bufio.Writer\n\tww, ok := w.(writer)\n\tif !ok {\n\t\tbw = bufio.NewWriter(w)\n\t\tww = bw\n\t}\n\taw := &textWriter{\n\t\tw:        ww,\n\t\tcomplete: true,\n\t\tcompact:  tm.Compact,\n\t}\n\n\tif etm, ok := pb.(encoding.TextMarshaler); ok {\n\t\ttext, err := etm.MarshalText()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err = aw.Write(text); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif bw != nil {\n\t\t\treturn bw.Flush()\n\t\t}\n\t\treturn nil\n\t}\n\t// Dereference the received pointer so we don't have outer < and >.\n\tv := reflect.Indirect(val)\n\tif err := tm.writeStruct(aw, v); err != nil {\n\t\treturn err\n\t}\n\tif bw != nil {\n\t\treturn bw.Flush()\n\t}\n\treturn nil\n}\n\n// Text is the same as Marshal, but returns the string directly.\nfunc (tm *TextMarshaler) Text(pb Message) string {\n\tvar buf bytes.Buffer\n\ttm.Marshal(&buf, pb)\n\treturn buf.String()\n}\n\nvar (\n\tdefaultTextMarshaler = TextMarshaler{}\n\tcompactTextMarshaler = TextMarshaler{Compact: true}\n)\n\n// TODO: consider removing some of the Marshal functions below.\n\n// MarshalText writes a given protocol buffer in text format.\n// The only errors returned are from w.\nfunc MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) }\n\n// MarshalTextString is the same as MarshalText, but returns the string directly.\nfunc MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) }\n\n// CompactText writes a given protocol buffer in compact text format (one line).\nfunc CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) }\n\n// CompactTextString is the same as CompactText, but returns the string directly.\nfunc CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) }\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/text_parser.go",
    "content": "// Go support for Protocol Buffers - Google's data interchange format\n//\n// Copyright 2010 The Go Authors.  All rights reserved.\n// https://github.com/golang/protobuf\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage proto\n\n// Functions for parsing the Text protocol buffer format.\n// TODO: message sets.\n\nimport (\n\t\"encoding\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\n// Error string emitted when deserializing Any and fields are already set\nconst anyRepeatedlyUnpacked = \"Any message unpacked multiple times, or %q already set\"\n\ntype ParseError struct {\n\tMessage string\n\tLine    int // 1-based line number\n\tOffset  int // 0-based byte offset from start of input\n}\n\nfunc (p *ParseError) Error() string {\n\tif p.Line == 1 {\n\t\t// show offset only for first line\n\t\treturn fmt.Sprintf(\"line 1.%d: %v\", p.Offset, p.Message)\n\t}\n\treturn fmt.Sprintf(\"line %d: %v\", p.Line, p.Message)\n}\n\ntype token struct {\n\tvalue    string\n\terr      *ParseError\n\tline     int    // line number\n\toffset   int    // byte number from start of input, not start of line\n\tunquoted string // the unquoted version of value, if it was a quoted string\n}\n\nfunc (t *token) String() string {\n\tif t.err == nil {\n\t\treturn fmt.Sprintf(\"%q (line=%d, offset=%d)\", t.value, t.line, t.offset)\n\t}\n\treturn fmt.Sprintf(\"parse error: %v\", t.err)\n}\n\ntype textParser struct {\n\ts            string // remaining input\n\tdone         bool   // whether the parsing is finished (success or error)\n\tbacked       bool   // whether back() was called\n\toffset, line int\n\tcur          token\n}\n\nfunc newTextParser(s string) *textParser {\n\tp := new(textParser)\n\tp.s = s\n\tp.line = 1\n\tp.cur.line = 1\n\treturn p\n}\n\nfunc (p *textParser) errorf(format string, a ...interface{}) *ParseError {\n\tpe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset}\n\tp.cur.err = pe\n\tp.done = true\n\treturn pe\n}\n\n// Numbers and identifiers are matched by [-+._A-Za-z0-9]\nfunc isIdentOrNumberChar(c byte) bool {\n\tswitch {\n\tcase 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z':\n\t\treturn true\n\tcase '0' <= c && c <= '9':\n\t\treturn true\n\t}\n\tswitch c {\n\tcase '-', '+', '.', '_':\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc isWhitespace(c byte) bool {\n\tswitch c {\n\tcase ' ', '\\t', '\\n', '\\r':\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc isQuote(c byte) bool {\n\tswitch c {\n\tcase '\"', '\\'':\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (p *textParser) skipWhitespace() {\n\ti := 0\n\tfor i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') {\n\t\tif p.s[i] == '#' {\n\t\t\t// comment; skip to end of line or input\n\t\t\tfor i < len(p.s) && p.s[i] != '\\n' {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif i == len(p.s) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif p.s[i] == '\\n' {\n\t\t\tp.line++\n\t\t}\n\t\ti++\n\t}\n\tp.offset += i\n\tp.s = p.s[i:len(p.s)]\n\tif len(p.s) == 0 {\n\t\tp.done = true\n\t}\n}\n\nfunc (p *textParser) advance() {\n\t// Skip whitespace\n\tp.skipWhitespace()\n\tif p.done {\n\t\treturn\n\t}\n\n\t// Start of non-whitespace\n\tp.cur.err = nil\n\tp.cur.offset, p.cur.line = p.offset, p.line\n\tp.cur.unquoted = \"\"\n\tswitch p.s[0] {\n\tcase '<', '>', '{', '}', ':', '[', ']', ';', ',', '/':\n\t\t// Single symbol\n\t\tp.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)]\n\tcase '\"', '\\'':\n\t\t// Quoted string\n\t\ti := 1\n\t\tfor i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\\n' {\n\t\t\tif p.s[i] == '\\\\' && i+1 < len(p.s) {\n\t\t\t\t// skip escaped char\n\t\t\t\ti++\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tif i >= len(p.s) || p.s[i] != p.s[0] {\n\t\t\tp.errorf(\"unmatched quote\")\n\t\t\treturn\n\t\t}\n\t\tunq, err := unquoteC(p.s[1:i], rune(p.s[0]))\n\t\tif err != nil {\n\t\t\tp.errorf(\"invalid quoted string %s: %v\", p.s[0:i+1], err)\n\t\t\treturn\n\t\t}\n\t\tp.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)]\n\t\tp.cur.unquoted = unq\n\tdefault:\n\t\ti := 0\n\t\tfor i < len(p.s) && isIdentOrNumberChar(p.s[i]) {\n\t\t\ti++\n\t\t}\n\t\tif i == 0 {\n\t\t\tp.errorf(\"unexpected byte %#x\", p.s[0])\n\t\t\treturn\n\t\t}\n\t\tp.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)]\n\t}\n\tp.offset += len(p.cur.value)\n}\n\nvar (\n\terrBadUTF8 = errors.New(\"proto: bad UTF-8\")\n\terrBadHex  = errors.New(\"proto: bad hexadecimal\")\n)\n\nfunc unquoteC(s string, quote rune) (string, error) {\n\t// This is based on C++'s tokenizer.cc.\n\t// Despite its name, this is *not* parsing C syntax.\n\t// For instance, \"\\0\" is an invalid quoted string.\n\n\t// Avoid allocation in trivial cases.\n\tsimple := true\n\tfor _, r := range s {\n\t\tif r == '\\\\' || r == quote {\n\t\t\tsimple = false\n\t\t\tbreak\n\t\t}\n\t}\n\tif simple {\n\t\treturn s, nil\n\t}\n\n\tbuf := make([]byte, 0, 3*len(s)/2)\n\tfor len(s) > 0 {\n\t\tr, n := utf8.DecodeRuneInString(s)\n\t\tif r == utf8.RuneError && n == 1 {\n\t\t\treturn \"\", errBadUTF8\n\t\t}\n\t\ts = s[n:]\n\t\tif r != '\\\\' {\n\t\t\tif r < utf8.RuneSelf {\n\t\t\t\tbuf = append(buf, byte(r))\n\t\t\t} else {\n\t\t\t\tbuf = append(buf, string(r)...)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tch, tail, err := unescape(s)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tbuf = append(buf, ch...)\n\t\ts = tail\n\t}\n\treturn string(buf), nil\n}\n\nfunc unescape(s string) (ch string, tail string, err error) {\n\tr, n := utf8.DecodeRuneInString(s)\n\tif r == utf8.RuneError && n == 1 {\n\t\treturn \"\", \"\", errBadUTF8\n\t}\n\ts = s[n:]\n\tswitch r {\n\tcase 'a':\n\t\treturn \"\\a\", s, nil\n\tcase 'b':\n\t\treturn \"\\b\", s, nil\n\tcase 'f':\n\t\treturn \"\\f\", s, nil\n\tcase 'n':\n\t\treturn \"\\n\", s, nil\n\tcase 'r':\n\t\treturn \"\\r\", s, nil\n\tcase 't':\n\t\treturn \"\\t\", s, nil\n\tcase 'v':\n\t\treturn \"\\v\", s, nil\n\tcase '?':\n\t\treturn \"?\", s, nil // trigraph workaround\n\tcase '\\'', '\"', '\\\\':\n\t\treturn string(r), s, nil\n\tcase '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X':\n\t\tif len(s) < 2 {\n\t\t\treturn \"\", \"\", fmt.Errorf(`\\%c requires 2 following digits`, r)\n\t\t}\n\t\tbase := 8\n\t\tss := s[:2]\n\t\ts = s[2:]\n\t\tif r == 'x' || r == 'X' {\n\t\t\tbase = 16\n\t\t} else {\n\t\t\tss = string(r) + ss\n\t\t}\n\t\ti, err := strconv.ParseUint(ss, base, 8)\n\t\tif err != nil {\n\t\t\treturn \"\", \"\", err\n\t\t}\n\t\treturn string([]byte{byte(i)}), s, nil\n\tcase 'u', 'U':\n\t\tn := 4\n\t\tif r == 'U' {\n\t\t\tn = 8\n\t\t}\n\t\tif len(s) < n {\n\t\t\treturn \"\", \"\", fmt.Errorf(`\\%c requires %d digits`, r, n)\n\t\t}\n\n\t\tbs := make([]byte, n/2)\n\t\tfor i := 0; i < n; i += 2 {\n\t\t\ta, ok1 := unhex(s[i])\n\t\t\tb, ok2 := unhex(s[i+1])\n\t\t\tif !ok1 || !ok2 {\n\t\t\t\treturn \"\", \"\", errBadHex\n\t\t\t}\n\t\t\tbs[i/2] = a<<4 | b\n\t\t}\n\t\ts = s[n:]\n\t\treturn string(bs), s, nil\n\t}\n\treturn \"\", \"\", fmt.Errorf(`unknown escape \\%c`, r)\n}\n\n// Adapted from src/pkg/strconv/quote.go.\nfunc unhex(b byte) (v byte, ok bool) {\n\tswitch {\n\tcase '0' <= b && b <= '9':\n\t\treturn b - '0', true\n\tcase 'a' <= b && b <= 'f':\n\t\treturn b - 'a' + 10, true\n\tcase 'A' <= b && b <= 'F':\n\t\treturn b - 'A' + 10, true\n\t}\n\treturn 0, false\n}\n\n// Back off the parser by one token. Can only be done between calls to next().\n// It makes the next advance() a no-op.\nfunc (p *textParser) back() { p.backed = true }\n\n// Advances the parser and returns the new current token.\nfunc (p *textParser) next() *token {\n\tif p.backed || p.done {\n\t\tp.backed = false\n\t\treturn &p.cur\n\t}\n\tp.advance()\n\tif p.done {\n\t\tp.cur.value = \"\"\n\t} else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) {\n\t\t// Look for multiple quoted strings separated by whitespace,\n\t\t// and concatenate them.\n\t\tcat := p.cur\n\t\tfor {\n\t\t\tp.skipWhitespace()\n\t\t\tif p.done || !isQuote(p.s[0]) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tp.advance()\n\t\t\tif p.cur.err != nil {\n\t\t\t\treturn &p.cur\n\t\t\t}\n\t\t\tcat.value += \" \" + p.cur.value\n\t\t\tcat.unquoted += p.cur.unquoted\n\t\t}\n\t\tp.done = false // parser may have seen EOF, but we want to return cat\n\t\tp.cur = cat\n\t}\n\treturn &p.cur\n}\n\nfunc (p *textParser) consumeToken(s string) error {\n\ttok := p.next()\n\tif tok.err != nil {\n\t\treturn tok.err\n\t}\n\tif tok.value != s {\n\t\tp.back()\n\t\treturn p.errorf(\"expected %q, found %q\", s, tok.value)\n\t}\n\treturn nil\n}\n\n// Return a RequiredNotSetError indicating which required field was not set.\nfunc (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError {\n\tst := sv.Type()\n\tsprops := GetProperties(st)\n\tfor i := 0; i < st.NumField(); i++ {\n\t\tif !isNil(sv.Field(i)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tprops := sprops.Prop[i]\n\t\tif props.Required {\n\t\t\treturn &RequiredNotSetError{fmt.Sprintf(\"%v.%v\", st, props.OrigName)}\n\t\t}\n\t}\n\treturn &RequiredNotSetError{fmt.Sprintf(\"%v.<unknown field name>\", st)} // should not happen\n}\n\n// Returns the index in the struct for the named field, as well as the parsed tag properties.\nfunc structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) {\n\ti, ok := sprops.decoderOrigNames[name]\n\tif ok {\n\t\treturn i, sprops.Prop[i], true\n\t}\n\treturn -1, nil, false\n}\n\n// Consume a ':' from the input stream (if the next token is a colon),\n// returning an error if a colon is needed but not present.\nfunc (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError {\n\ttok := p.next()\n\tif tok.err != nil {\n\t\treturn tok.err\n\t}\n\tif tok.value != \":\" {\n\t\t// Colon is optional when the field is a group or message.\n\t\tneedColon := true\n\t\tswitch props.Wire {\n\t\tcase \"group\":\n\t\t\tneedColon = false\n\t\tcase \"bytes\":\n\t\t\t// A \"bytes\" field is either a message, a string, or a repeated field;\n\t\t\t// those three become *T, *string and []T respectively, so we can check for\n\t\t\t// this field being a pointer to a non-string.\n\t\t\tif typ.Kind() == reflect.Ptr {\n\t\t\t\t// *T or *string\n\t\t\t\tif typ.Elem().Kind() == reflect.String {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else if typ.Kind() == reflect.Slice {\n\t\t\t\t// []T or []*T\n\t\t\t\tif typ.Elem().Kind() != reflect.Ptr {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else if typ.Kind() == reflect.String {\n\t\t\t\t// The proto3 exception is for a string field,\n\t\t\t\t// which requires a colon.\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tneedColon = false\n\t\t}\n\t\tif needColon {\n\t\t\treturn p.errorf(\"expected ':', found %q\", tok.value)\n\t\t}\n\t\tp.back()\n\t}\n\treturn nil\n}\n\nfunc (p *textParser) readStruct(sv reflect.Value, terminator string) error {\n\tst := sv.Type()\n\tsprops := GetProperties(st)\n\treqCount := sprops.reqCount\n\tvar reqFieldErr error\n\tfieldSet := make(map[string]bool)\n\t// A struct is a sequence of \"name: value\", terminated by one of\n\t// '>' or '}', or the end of the input.  A name may also be\n\t// \"[extension]\" or \"[type/url]\".\n\t//\n\t// The whole struct can also be an expanded Any message, like:\n\t// [type/url] < ... struct contents ... >\n\tfor {\n\t\ttok := p.next()\n\t\tif tok.err != nil {\n\t\t\treturn tok.err\n\t\t}\n\t\tif tok.value == terminator {\n\t\t\tbreak\n\t\t}\n\t\tif tok.value == \"[\" {\n\t\t\t// Looks like an extension or an Any.\n\t\t\t//\n\t\t\t// TODO: Check whether we need to handle\n\t\t\t// namespace rooted names (e.g. \".something.Foo\").\n\t\t\textName, err := p.consumeExtName()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif s := strings.LastIndex(extName, \"/\"); s >= 0 {\n\t\t\t\t// If it contains a slash, it's an Any type URL.\n\t\t\t\tmessageName := extName[s+1:]\n\t\t\t\tmt := MessageType(messageName)\n\t\t\t\tif mt == nil {\n\t\t\t\t\treturn p.errorf(\"unrecognized message %q in google.protobuf.Any\", messageName)\n\t\t\t\t}\n\t\t\t\ttok = p.next()\n\t\t\t\tif tok.err != nil {\n\t\t\t\t\treturn tok.err\n\t\t\t\t}\n\t\t\t\t// consume an optional colon\n\t\t\t\tif tok.value == \":\" {\n\t\t\t\t\ttok = p.next()\n\t\t\t\t\tif tok.err != nil {\n\t\t\t\t\t\treturn tok.err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar terminator string\n\t\t\t\tswitch tok.value {\n\t\t\t\tcase \"<\":\n\t\t\t\t\tterminator = \">\"\n\t\t\t\tcase \"{\":\n\t\t\t\t\tterminator = \"}\"\n\t\t\t\tdefault:\n\t\t\t\t\treturn p.errorf(\"expected '{' or '<', found %q\", tok.value)\n\t\t\t\t}\n\t\t\t\tv := reflect.New(mt.Elem())\n\t\t\t\tif pe := p.readStruct(v.Elem(), terminator); pe != nil {\n\t\t\t\t\treturn pe\n\t\t\t\t}\n\t\t\t\tb, err := Marshal(v.Interface().(Message))\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn p.errorf(\"failed to marshal message of type %q: %v\", messageName, err)\n\t\t\t\t}\n\t\t\t\tif fieldSet[\"type_url\"] {\n\t\t\t\t\treturn p.errorf(anyRepeatedlyUnpacked, \"type_url\")\n\t\t\t\t}\n\t\t\t\tif fieldSet[\"value\"] {\n\t\t\t\t\treturn p.errorf(anyRepeatedlyUnpacked, \"value\")\n\t\t\t\t}\n\t\t\t\tsv.FieldByName(\"TypeUrl\").SetString(extName)\n\t\t\t\tsv.FieldByName(\"Value\").SetBytes(b)\n\t\t\t\tfieldSet[\"type_url\"] = true\n\t\t\t\tfieldSet[\"value\"] = true\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tvar desc *ExtensionDesc\n\t\t\t// This could be faster, but it's functional.\n\t\t\t// TODO: Do something smarter than a linear scan.\n\t\t\tfor _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) {\n\t\t\t\tif d.Name == extName {\n\t\t\t\t\tdesc = d\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif desc == nil {\n\t\t\t\treturn p.errorf(\"unrecognized extension %q\", extName)\n\t\t\t}\n\n\t\t\tprops := &Properties{}\n\t\t\tprops.Parse(desc.Tag)\n\n\t\t\ttyp := reflect.TypeOf(desc.ExtensionType)\n\t\t\tif err := p.checkForColon(props, typ); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\trep := desc.repeated()\n\n\t\t\t// Read the extension structure, and set it in\n\t\t\t// the value we're constructing.\n\t\t\tvar ext reflect.Value\n\t\t\tif !rep {\n\t\t\t\text = reflect.New(typ).Elem()\n\t\t\t} else {\n\t\t\t\text = reflect.New(typ.Elem()).Elem()\n\t\t\t}\n\t\t\tif err := p.readAny(ext, props); err != nil {\n\t\t\t\tif _, ok := err.(*RequiredNotSetError); !ok {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\treqFieldErr = err\n\t\t\t}\n\t\t\tep := sv.Addr().Interface().(Message)\n\t\t\tif !rep {\n\t\t\t\tSetExtension(ep, desc, ext.Interface())\n\t\t\t} else {\n\t\t\t\told, err := GetExtension(ep, desc)\n\t\t\t\tvar sl reflect.Value\n\t\t\t\tif err == nil {\n\t\t\t\t\tsl = reflect.ValueOf(old) // existing slice\n\t\t\t\t} else {\n\t\t\t\t\tsl = reflect.MakeSlice(typ, 0, 1)\n\t\t\t\t}\n\t\t\t\tsl = reflect.Append(sl, ext)\n\t\t\t\tSetExtension(ep, desc, sl.Interface())\n\t\t\t}\n\t\t\tif err := p.consumeOptionalSeparator(); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// This is a normal, non-extension field.\n\t\tname := tok.value\n\t\tvar dst reflect.Value\n\t\tfi, props, ok := structFieldByName(sprops, name)\n\t\tif ok {\n\t\t\tdst = sv.Field(fi)\n\t\t} else if oop, ok := sprops.OneofTypes[name]; ok {\n\t\t\t// It is a oneof.\n\t\t\tprops = oop.Prop\n\t\t\tnv := reflect.New(oop.Type.Elem())\n\t\t\tdst = nv.Elem().Field(0)\n\t\t\tfield := sv.Field(oop.Field)\n\t\t\tif !field.IsNil() {\n\t\t\t\treturn p.errorf(\"field '%s' would overwrite already parsed oneof '%s'\", name, sv.Type().Field(oop.Field).Name)\n\t\t\t}\n\t\t\tfield.Set(nv)\n\t\t}\n\t\tif !dst.IsValid() {\n\t\t\treturn p.errorf(\"unknown field name %q in %v\", name, st)\n\t\t}\n\n\t\tif dst.Kind() == reflect.Map {\n\t\t\t// Consume any colon.\n\t\t\tif err := p.checkForColon(props, dst.Type()); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Construct the map if it doesn't already exist.\n\t\t\tif dst.IsNil() {\n\t\t\t\tdst.Set(reflect.MakeMap(dst.Type()))\n\t\t\t}\n\t\t\tkey := reflect.New(dst.Type().Key()).Elem()\n\t\t\tval := reflect.New(dst.Type().Elem()).Elem()\n\n\t\t\t// The map entry should be this sequence of tokens:\n\t\t\t//\t< key : KEY value : VALUE >\n\t\t\t// However, implementations may omit key or value, and technically\n\t\t\t// we should support them in any order.  See b/28924776 for a time\n\t\t\t// this went wrong.\n\n\t\t\ttok := p.next()\n\t\t\tvar terminator string\n\t\t\tswitch tok.value {\n\t\t\tcase \"<\":\n\t\t\t\tterminator = \">\"\n\t\t\tcase \"{\":\n\t\t\t\tterminator = \"}\"\n\t\t\tdefault:\n\t\t\t\treturn p.errorf(\"expected '{' or '<', found %q\", tok.value)\n\t\t\t}\n\t\t\tfor {\n\t\t\t\ttok := p.next()\n\t\t\t\tif tok.err != nil {\n\t\t\t\t\treturn tok.err\n\t\t\t\t}\n\t\t\t\tif tok.value == terminator {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tswitch tok.value {\n\t\t\t\tcase \"key\":\n\t\t\t\t\tif err := p.consumeToken(\":\"); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif err := p.readAny(key, props.mkeyprop); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif err := p.consumeOptionalSeparator(); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\tcase \"value\":\n\t\t\t\t\tif err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif err := p.readAny(val, props.mvalprop); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif err := p.consumeOptionalSeparator(); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tp.back()\n\t\t\t\t\treturn p.errorf(`expected \"key\", \"value\", or %q, found %q`, terminator, tok.value)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdst.SetMapIndex(key, val)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Check that it's not already set if it's not a repeated field.\n\t\tif !props.Repeated && fieldSet[name] {\n\t\t\treturn p.errorf(\"non-repeated field %q was repeated\", name)\n\t\t}\n\n\t\tif err := p.checkForColon(props, dst.Type()); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t// Parse into the field.\n\t\tfieldSet[name] = true\n\t\tif err := p.readAny(dst, props); err != nil {\n\t\t\tif _, ok := err.(*RequiredNotSetError); !ok {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treqFieldErr = err\n\t\t}\n\t\tif props.Required {\n\t\t\treqCount--\n\t\t}\n\n\t\tif err := p.consumeOptionalSeparator(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t}\n\n\tif reqCount > 0 {\n\t\treturn p.missingRequiredFieldError(sv)\n\t}\n\treturn reqFieldErr\n}\n\n// consumeExtName consumes extension name or expanded Any type URL and the\n// following ']'. It returns the name or URL consumed.\nfunc (p *textParser) consumeExtName() (string, error) {\n\ttok := p.next()\n\tif tok.err != nil {\n\t\treturn \"\", tok.err\n\t}\n\n\t// If extension name or type url is quoted, it's a single token.\n\tif len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] {\n\t\tname, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0]))\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\treturn name, p.consumeToken(\"]\")\n\t}\n\n\t// Consume everything up to \"]\"\n\tvar parts []string\n\tfor tok.value != \"]\" {\n\t\tparts = append(parts, tok.value)\n\t\ttok = p.next()\n\t\tif tok.err != nil {\n\t\t\treturn \"\", p.errorf(\"unrecognized type_url or extension name: %s\", tok.err)\n\t\t}\n\t}\n\treturn strings.Join(parts, \"\"), nil\n}\n\n// consumeOptionalSeparator consumes an optional semicolon or comma.\n// It is used in readStruct to provide backward compatibility.\nfunc (p *textParser) consumeOptionalSeparator() error {\n\ttok := p.next()\n\tif tok.err != nil {\n\t\treturn tok.err\n\t}\n\tif tok.value != \";\" && tok.value != \",\" {\n\t\tp.back()\n\t}\n\treturn nil\n}\n\nfunc (p *textParser) readAny(v reflect.Value, props *Properties) error {\n\ttok := p.next()\n\tif tok.err != nil {\n\t\treturn tok.err\n\t}\n\tif tok.value == \"\" {\n\t\treturn p.errorf(\"unexpected EOF\")\n\t}\n\n\tswitch fv := v; fv.Kind() {\n\tcase reflect.Slice:\n\t\tat := v.Type()\n\t\tif at.Elem().Kind() == reflect.Uint8 {\n\t\t\t// Special case for []byte\n\t\t\tif tok.value[0] != '\"' && tok.value[0] != '\\'' {\n\t\t\t\t// Deliberately written out here, as the error after\n\t\t\t\t// this switch statement would write \"invalid []byte: ...\",\n\t\t\t\t// which is not as user-friendly.\n\t\t\t\treturn p.errorf(\"invalid string: %v\", tok.value)\n\t\t\t}\n\t\t\tbytes := []byte(tok.unquoted)\n\t\t\tfv.Set(reflect.ValueOf(bytes))\n\t\t\treturn nil\n\t\t}\n\t\t// Repeated field.\n\t\tif tok.value == \"[\" {\n\t\t\t// Repeated field with list notation, like [1,2,3].\n\t\t\tfor {\n\t\t\t\tfv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem()))\n\t\t\t\terr := p.readAny(fv.Index(fv.Len()-1), props)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\ttok := p.next()\n\t\t\t\tif tok.err != nil {\n\t\t\t\t\treturn tok.err\n\t\t\t\t}\n\t\t\t\tif tok.value == \"]\" {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif tok.value != \",\" {\n\t\t\t\t\treturn p.errorf(\"Expected ']' or ',' found %q\", tok.value)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\t// One value of the repeated field.\n\t\tp.back()\n\t\tfv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem()))\n\t\treturn p.readAny(fv.Index(fv.Len()-1), props)\n\tcase reflect.Bool:\n\t\t// true/1/t/True or false/f/0/False.\n\t\tswitch tok.value {\n\t\tcase \"true\", \"1\", \"t\", \"True\":\n\t\t\tfv.SetBool(true)\n\t\t\treturn nil\n\t\tcase \"false\", \"0\", \"f\", \"False\":\n\t\t\tfv.SetBool(false)\n\t\t\treturn nil\n\t\t}\n\tcase reflect.Float32, reflect.Float64:\n\t\tv := tok.value\n\t\t// Ignore 'f' for compatibility with output generated by C++, but don't\n\t\t// remove 'f' when the value is \"-inf\" or \"inf\".\n\t\tif strings.HasSuffix(v, \"f\") && tok.value != \"-inf\" && tok.value != \"inf\" {\n\t\t\tv = v[:len(v)-1]\n\t\t}\n\t\tif f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil {\n\t\t\tfv.SetFloat(f)\n\t\t\treturn nil\n\t\t}\n\tcase reflect.Int32:\n\t\tif x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {\n\t\t\tfv.SetInt(x)\n\t\t\treturn nil\n\t\t}\n\n\t\tif len(props.Enum) == 0 {\n\t\t\tbreak\n\t\t}\n\t\tm, ok := enumValueMaps[props.Enum]\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t\tx, ok := m[tok.value]\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t\tfv.SetInt(int64(x))\n\t\treturn nil\n\tcase reflect.Int64:\n\t\tif x, err := strconv.ParseInt(tok.value, 0, 64); err == nil {\n\t\t\tfv.SetInt(x)\n\t\t\treturn nil\n\t\t}\n\n\tcase reflect.Ptr:\n\t\t// A basic field (indirected through pointer), or a repeated message/group\n\t\tp.back()\n\t\tfv.Set(reflect.New(fv.Type().Elem()))\n\t\treturn p.readAny(fv.Elem(), props)\n\tcase reflect.String:\n\t\tif tok.value[0] == '\"' || tok.value[0] == '\\'' {\n\t\t\tfv.SetString(tok.unquoted)\n\t\t\treturn nil\n\t\t}\n\tcase reflect.Struct:\n\t\tvar terminator string\n\t\tswitch tok.value {\n\t\tcase \"{\":\n\t\t\tterminator = \"}\"\n\t\tcase \"<\":\n\t\t\tterminator = \">\"\n\t\tdefault:\n\t\t\treturn p.errorf(\"expected '{' or '<', found %q\", tok.value)\n\t\t}\n\t\t// TODO: Handle nested messages which implement encoding.TextUnmarshaler.\n\t\treturn p.readStruct(fv, terminator)\n\tcase reflect.Uint32:\n\t\tif x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {\n\t\t\tfv.SetUint(x)\n\t\t\treturn nil\n\t\t}\n\tcase reflect.Uint64:\n\t\tif x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {\n\t\t\tfv.SetUint(x)\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn p.errorf(\"invalid %v: %v\", v.Type(), tok.value)\n}\n\n// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb\n// before starting to unmarshal, so any existing data in pb is always removed.\n// If a required field is not set and no other error occurs,\n// UnmarshalText returns *RequiredNotSetError.\nfunc UnmarshalText(s string, pb Message) error {\n\tif um, ok := pb.(encoding.TextUnmarshaler); ok {\n\t\terr := um.UnmarshalText([]byte(s))\n\t\treturn err\n\t}\n\tpb.Reset()\n\tv := reflect.ValueOf(pb)\n\tif pe := newTextParser(s).readStruct(v.Elem(), \"\"); pe != nil {\n\t\treturn pe\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile",
    "content": "# Go support for Protocol Buffers - Google's data interchange format\n#\n# Copyright 2010 The Go Authors.  All rights reserved.\n# https://github.com/golang/protobuf\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# 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\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Not stored here, but descriptor.proto is in https://github.com/google/protobuf/\n# at src/google/protobuf/descriptor.proto\nregenerate:\n\t@echo WARNING! THIS RULE IS PROBABLY NOT RIGHT FOR YOUR INSTALLATION\n\tprotoc --go_out=../../../../.. -I$(HOME)/src/protobuf/include $(HOME)/src/protobuf/include/google/protobuf/descriptor.proto\n"
  },
  {
    "path": "vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go",
    "content": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// source: google/protobuf/descriptor.proto\n\n/*\nPackage descriptor is a generated protocol buffer package.\n\nIt is generated from these files:\n\tgoogle/protobuf/descriptor.proto\n\nIt has these top-level messages:\n\tFileDescriptorSet\n\tFileDescriptorProto\n\tDescriptorProto\n\tFieldDescriptorProto\n\tOneofDescriptorProto\n\tEnumDescriptorProto\n\tEnumValueDescriptorProto\n\tServiceDescriptorProto\n\tMethodDescriptorProto\n\tFileOptions\n\tMessageOptions\n\tFieldOptions\n\tOneofOptions\n\tEnumOptions\n\tEnumValueOptions\n\tServiceOptions\n\tMethodOptions\n\tUninterpretedOption\n\tSourceCodeInfo\n\tGeneratedCodeInfo\n*/\npackage descriptor\n\nimport proto \"github.com/golang/protobuf/proto\"\nimport fmt \"fmt\"\nimport math \"math\"\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ = proto.Marshal\nvar _ = fmt.Errorf\nvar _ = math.Inf\n\n// This is a compile-time assertion to ensure that this generated file\n// is compatible with the proto package it is being compiled against.\n// A compilation error at this line likely means your copy of the\n// proto package needs to be updated.\nconst _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package\n\ntype FieldDescriptorProto_Type int32\n\nconst (\n\t// 0 is reserved for errors.\n\t// Order is weird for historical reasons.\n\tFieldDescriptorProto_TYPE_DOUBLE FieldDescriptorProto_Type = 1\n\tFieldDescriptorProto_TYPE_FLOAT  FieldDescriptorProto_Type = 2\n\t// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n\t// negative values are likely.\n\tFieldDescriptorProto_TYPE_INT64  FieldDescriptorProto_Type = 3\n\tFieldDescriptorProto_TYPE_UINT64 FieldDescriptorProto_Type = 4\n\t// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n\t// negative values are likely.\n\tFieldDescriptorProto_TYPE_INT32   FieldDescriptorProto_Type = 5\n\tFieldDescriptorProto_TYPE_FIXED64 FieldDescriptorProto_Type = 6\n\tFieldDescriptorProto_TYPE_FIXED32 FieldDescriptorProto_Type = 7\n\tFieldDescriptorProto_TYPE_BOOL    FieldDescriptorProto_Type = 8\n\tFieldDescriptorProto_TYPE_STRING  FieldDescriptorProto_Type = 9\n\t// Tag-delimited aggregate.\n\t// Group type is deprecated and not supported in proto3. However, Proto3\n\t// implementations should still be able to parse the group wire format and\n\t// treat group fields as unknown fields.\n\tFieldDescriptorProto_TYPE_GROUP   FieldDescriptorProto_Type = 10\n\tFieldDescriptorProto_TYPE_MESSAGE FieldDescriptorProto_Type = 11\n\t// New in version 2.\n\tFieldDescriptorProto_TYPE_BYTES    FieldDescriptorProto_Type = 12\n\tFieldDescriptorProto_TYPE_UINT32   FieldDescriptorProto_Type = 13\n\tFieldDescriptorProto_TYPE_ENUM     FieldDescriptorProto_Type = 14\n\tFieldDescriptorProto_TYPE_SFIXED32 FieldDescriptorProto_Type = 15\n\tFieldDescriptorProto_TYPE_SFIXED64 FieldDescriptorProto_Type = 16\n\tFieldDescriptorProto_TYPE_SINT32   FieldDescriptorProto_Type = 17\n\tFieldDescriptorProto_TYPE_SINT64   FieldDescriptorProto_Type = 18\n)\n\nvar FieldDescriptorProto_Type_name = map[int32]string{\n\t1:  \"TYPE_DOUBLE\",\n\t2:  \"TYPE_FLOAT\",\n\t3:  \"TYPE_INT64\",\n\t4:  \"TYPE_UINT64\",\n\t5:  \"TYPE_INT32\",\n\t6:  \"TYPE_FIXED64\",\n\t7:  \"TYPE_FIXED32\",\n\t8:  \"TYPE_BOOL\",\n\t9:  \"TYPE_STRING\",\n\t10: \"TYPE_GROUP\",\n\t11: \"TYPE_MESSAGE\",\n\t12: \"TYPE_BYTES\",\n\t13: \"TYPE_UINT32\",\n\t14: \"TYPE_ENUM\",\n\t15: \"TYPE_SFIXED32\",\n\t16: \"TYPE_SFIXED64\",\n\t17: \"TYPE_SINT32\",\n\t18: \"TYPE_SINT64\",\n}\nvar FieldDescriptorProto_Type_value = map[string]int32{\n\t\"TYPE_DOUBLE\":   1,\n\t\"TYPE_FLOAT\":    2,\n\t\"TYPE_INT64\":    3,\n\t\"TYPE_UINT64\":   4,\n\t\"TYPE_INT32\":    5,\n\t\"TYPE_FIXED64\":  6,\n\t\"TYPE_FIXED32\":  7,\n\t\"TYPE_BOOL\":     8,\n\t\"TYPE_STRING\":   9,\n\t\"TYPE_GROUP\":    10,\n\t\"TYPE_MESSAGE\":  11,\n\t\"TYPE_BYTES\":    12,\n\t\"TYPE_UINT32\":   13,\n\t\"TYPE_ENUM\":     14,\n\t\"TYPE_SFIXED32\": 15,\n\t\"TYPE_SFIXED64\": 16,\n\t\"TYPE_SINT32\":   17,\n\t\"TYPE_SINT64\":   18,\n}\n\nfunc (x FieldDescriptorProto_Type) Enum() *FieldDescriptorProto_Type {\n\tp := new(FieldDescriptorProto_Type)\n\t*p = x\n\treturn p\n}\nfunc (x FieldDescriptorProto_Type) String() string {\n\treturn proto.EnumName(FieldDescriptorProto_Type_name, int32(x))\n}\nfunc (x *FieldDescriptorProto_Type) UnmarshalJSON(data []byte) error {\n\tvalue, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Type_value, data, \"FieldDescriptorProto_Type\")\n\tif err != nil {\n\t\treturn err\n\t}\n\t*x = FieldDescriptorProto_Type(value)\n\treturn nil\n}\nfunc (FieldDescriptorProto_Type) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} }\n\ntype FieldDescriptorProto_Label int32\n\nconst (\n\t// 0 is reserved for errors\n\tFieldDescriptorProto_LABEL_OPTIONAL FieldDescriptorProto_Label = 1\n\tFieldDescriptorProto_LABEL_REQUIRED FieldDescriptorProto_Label = 2\n\tFieldDescriptorProto_LABEL_REPEATED FieldDescriptorProto_Label = 3\n)\n\nvar FieldDescriptorProto_Label_name = map[int32]string{\n\t1: \"LABEL_OPTIONAL\",\n\t2: \"LABEL_REQUIRED\",\n\t3: \"LABEL_REPEATED\",\n}\nvar FieldDescriptorProto_Label_value = map[string]int32{\n\t\"LABEL_OPTIONAL\": 1,\n\t\"LABEL_REQUIRED\": 2,\n\t\"LABEL_REPEATED\": 3,\n}\n\nfunc (x FieldDescriptorProto_Label) Enum() *FieldDescriptorProto_Label {\n\tp := new(FieldDescriptorProto_Label)\n\t*p = x\n\treturn p\n}\nfunc (x FieldDescriptorProto_Label) String() string {\n\treturn proto.EnumName(FieldDescriptorProto_Label_name, int32(x))\n}\nfunc (x *FieldDescriptorProto_Label) UnmarshalJSON(data []byte) error {\n\tvalue, err := proto.UnmarshalJSONEnum(FieldDescriptorProto_Label_value, data, \"FieldDescriptorProto_Label\")\n\tif err != nil {\n\t\treturn err\n\t}\n\t*x = FieldDescriptorProto_Label(value)\n\treturn nil\n}\nfunc (FieldDescriptorProto_Label) EnumDescriptor() ([]byte, []int) {\n\treturn fileDescriptor0, []int{3, 1}\n}\n\n// Generated classes can be optimized for speed or code size.\ntype FileOptions_OptimizeMode int32\n\nconst (\n\tFileOptions_SPEED FileOptions_OptimizeMode = 1\n\t// etc.\n\tFileOptions_CODE_SIZE    FileOptions_OptimizeMode = 2\n\tFileOptions_LITE_RUNTIME FileOptions_OptimizeMode = 3\n)\n\nvar FileOptions_OptimizeMode_name = map[int32]string{\n\t1: \"SPEED\",\n\t2: \"CODE_SIZE\",\n\t3: \"LITE_RUNTIME\",\n}\nvar FileOptions_OptimizeMode_value = map[string]int32{\n\t\"SPEED\":        1,\n\t\"CODE_SIZE\":    2,\n\t\"LITE_RUNTIME\": 3,\n}\n\nfunc (x FileOptions_OptimizeMode) Enum() *FileOptions_OptimizeMode {\n\tp := new(FileOptions_OptimizeMode)\n\t*p = x\n\treturn p\n}\nfunc (x FileOptions_OptimizeMode) String() string {\n\treturn proto.EnumName(FileOptions_OptimizeMode_name, int32(x))\n}\nfunc (x *FileOptions_OptimizeMode) UnmarshalJSON(data []byte) error {\n\tvalue, err := proto.UnmarshalJSONEnum(FileOptions_OptimizeMode_value, data, \"FileOptions_OptimizeMode\")\n\tif err != nil {\n\t\treturn err\n\t}\n\t*x = FileOptions_OptimizeMode(value)\n\treturn nil\n}\nfunc (FileOptions_OptimizeMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{9, 0} }\n\ntype FieldOptions_CType int32\n\nconst (\n\t// Default mode.\n\tFieldOptions_STRING       FieldOptions_CType = 0\n\tFieldOptions_CORD         FieldOptions_CType = 1\n\tFieldOptions_STRING_PIECE FieldOptions_CType = 2\n)\n\nvar FieldOptions_CType_name = map[int32]string{\n\t0: \"STRING\",\n\t1: \"CORD\",\n\t2: \"STRING_PIECE\",\n}\nvar FieldOptions_CType_value = map[string]int32{\n\t\"STRING\":       0,\n\t\"CORD\":         1,\n\t\"STRING_PIECE\": 2,\n}\n\nfunc (x FieldOptions_CType) Enum() *FieldOptions_CType {\n\tp := new(FieldOptions_CType)\n\t*p = x\n\treturn p\n}\nfunc (x FieldOptions_CType) String() string {\n\treturn proto.EnumName(FieldOptions_CType_name, int32(x))\n}\nfunc (x *FieldOptions_CType) UnmarshalJSON(data []byte) error {\n\tvalue, err := proto.UnmarshalJSONEnum(FieldOptions_CType_value, data, \"FieldOptions_CType\")\n\tif err != nil {\n\t\treturn err\n\t}\n\t*x = FieldOptions_CType(value)\n\treturn nil\n}\nfunc (FieldOptions_CType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 0} }\n\ntype FieldOptions_JSType int32\n\nconst (\n\t// Use the default type.\n\tFieldOptions_JS_NORMAL FieldOptions_JSType = 0\n\t// Use JavaScript strings.\n\tFieldOptions_JS_STRING FieldOptions_JSType = 1\n\t// Use JavaScript numbers.\n\tFieldOptions_JS_NUMBER FieldOptions_JSType = 2\n)\n\nvar FieldOptions_JSType_name = map[int32]string{\n\t0: \"JS_NORMAL\",\n\t1: \"JS_STRING\",\n\t2: \"JS_NUMBER\",\n}\nvar FieldOptions_JSType_value = map[string]int32{\n\t\"JS_NORMAL\": 0,\n\t\"JS_STRING\": 1,\n\t\"JS_NUMBER\": 2,\n}\n\nfunc (x FieldOptions_JSType) Enum() *FieldOptions_JSType {\n\tp := new(FieldOptions_JSType)\n\t*p = x\n\treturn p\n}\nfunc (x FieldOptions_JSType) String() string {\n\treturn proto.EnumName(FieldOptions_JSType_name, int32(x))\n}\nfunc (x *FieldOptions_JSType) UnmarshalJSON(data []byte) error {\n\tvalue, err := proto.UnmarshalJSONEnum(FieldOptions_JSType_value, data, \"FieldOptions_JSType\")\n\tif err != nil {\n\t\treturn err\n\t}\n\t*x = FieldOptions_JSType(value)\n\treturn nil\n}\nfunc (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 1} }\n\n// Is this method side-effect-free (or safe in HTTP parlance), or idempotent,\n// or neither? HTTP based RPC implementation may choose GET verb for safe\n// methods, and PUT verb for idempotent methods instead of the default POST.\ntype MethodOptions_IdempotencyLevel int32\n\nconst (\n\tMethodOptions_IDEMPOTENCY_UNKNOWN MethodOptions_IdempotencyLevel = 0\n\tMethodOptions_NO_SIDE_EFFECTS     MethodOptions_IdempotencyLevel = 1\n\tMethodOptions_IDEMPOTENT          MethodOptions_IdempotencyLevel = 2\n)\n\nvar MethodOptions_IdempotencyLevel_name = map[int32]string{\n\t0: \"IDEMPOTENCY_UNKNOWN\",\n\t1: \"NO_SIDE_EFFECTS\",\n\t2: \"IDEMPOTENT\",\n}\nvar MethodOptions_IdempotencyLevel_value = map[string]int32{\n\t\"IDEMPOTENCY_UNKNOWN\": 0,\n\t\"NO_SIDE_EFFECTS\":     1,\n\t\"IDEMPOTENT\":          2,\n}\n\nfunc (x MethodOptions_IdempotencyLevel) Enum() *MethodOptions_IdempotencyLevel {\n\tp := new(MethodOptions_IdempotencyLevel)\n\t*p = x\n\treturn p\n}\nfunc (x MethodOptions_IdempotencyLevel) String() string {\n\treturn proto.EnumName(MethodOptions_IdempotencyLevel_name, int32(x))\n}\nfunc (x *MethodOptions_IdempotencyLevel) UnmarshalJSON(data []byte) error {\n\tvalue, err := proto.UnmarshalJSONEnum(MethodOptions_IdempotencyLevel_value, data, \"MethodOptions_IdempotencyLevel\")\n\tif err != nil {\n\t\treturn err\n\t}\n\t*x = MethodOptions_IdempotencyLevel(value)\n\treturn nil\n}\nfunc (MethodOptions_IdempotencyLevel) EnumDescriptor() ([]byte, []int) {\n\treturn fileDescriptor0, []int{16, 0}\n}\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\ntype FileDescriptorSet struct {\n\tFile             []*FileDescriptorProto `protobuf:\"bytes,1,rep,name=file\" json:\"file,omitempty\"`\n\tXXX_unrecognized []byte                 `json:\"-\"`\n}\n\nfunc (m *FileDescriptorSet) Reset()                    { *m = FileDescriptorSet{} }\nfunc (m *FileDescriptorSet) String() string            { return proto.CompactTextString(m) }\nfunc (*FileDescriptorSet) ProtoMessage()               {}\nfunc (*FileDescriptorSet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }\n\nfunc (m *FileDescriptorSet) GetFile() []*FileDescriptorProto {\n\tif m != nil {\n\t\treturn m.File\n\t}\n\treturn nil\n}\n\n// Describes a complete .proto file.\ntype FileDescriptorProto struct {\n\tName    *string `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\tPackage *string `protobuf:\"bytes,2,opt,name=package\" json:\"package,omitempty\"`\n\t// Names of files imported by this file.\n\tDependency []string `protobuf:\"bytes,3,rep,name=dependency\" json:\"dependency,omitempty\"`\n\t// Indexes of the public imported files in the dependency list above.\n\tPublicDependency []int32 `protobuf:\"varint,10,rep,name=public_dependency,json=publicDependency\" json:\"public_dependency,omitempty\"`\n\t// Indexes of the weak imported files in the dependency list.\n\t// For Google-internal migration only. Do not use.\n\tWeakDependency []int32 `protobuf:\"varint,11,rep,name=weak_dependency,json=weakDependency\" json:\"weak_dependency,omitempty\"`\n\t// All top-level definitions in this file.\n\tMessageType []*DescriptorProto        `protobuf:\"bytes,4,rep,name=message_type,json=messageType\" json:\"message_type,omitempty\"`\n\tEnumType    []*EnumDescriptorProto    `protobuf:\"bytes,5,rep,name=enum_type,json=enumType\" json:\"enum_type,omitempty\"`\n\tService     []*ServiceDescriptorProto `protobuf:\"bytes,6,rep,name=service\" json:\"service,omitempty\"`\n\tExtension   []*FieldDescriptorProto   `protobuf:\"bytes,7,rep,name=extension\" json:\"extension,omitempty\"`\n\tOptions     *FileOptions              `protobuf:\"bytes,8,opt,name=options\" json:\"options,omitempty\"`\n\t// This field contains optional information about the original source code.\n\t// You may safely remove this entire field without harming runtime\n\t// functionality of the descriptors -- the information is needed only by\n\t// development tools.\n\tSourceCodeInfo *SourceCodeInfo `protobuf:\"bytes,9,opt,name=source_code_info,json=sourceCodeInfo\" json:\"source_code_info,omitempty\"`\n\t// The syntax of the proto file.\n\t// The supported values are \"proto2\" and \"proto3\".\n\tSyntax           *string `protobuf:\"bytes,12,opt,name=syntax\" json:\"syntax,omitempty\"`\n\tXXX_unrecognized []byte  `json:\"-\"`\n}\n\nfunc (m *FileDescriptorProto) Reset()                    { *m = FileDescriptorProto{} }\nfunc (m *FileDescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*FileDescriptorProto) ProtoMessage()               {}\nfunc (*FileDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }\n\nfunc (m *FileDescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileDescriptorProto) GetPackage() string {\n\tif m != nil && m.Package != nil {\n\t\treturn *m.Package\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileDescriptorProto) GetDependency() []string {\n\tif m != nil {\n\t\treturn m.Dependency\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetPublicDependency() []int32 {\n\tif m != nil {\n\t\treturn m.PublicDependency\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetWeakDependency() []int32 {\n\tif m != nil {\n\t\treturn m.WeakDependency\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetMessageType() []*DescriptorProto {\n\tif m != nil {\n\t\treturn m.MessageType\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetEnumType() []*EnumDescriptorProto {\n\tif m != nil {\n\t\treturn m.EnumType\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetService() []*ServiceDescriptorProto {\n\tif m != nil {\n\t\treturn m.Service\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetExtension() []*FieldDescriptorProto {\n\tif m != nil {\n\t\treturn m.Extension\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetOptions() *FileOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetSourceCodeInfo() *SourceCodeInfo {\n\tif m != nil {\n\t\treturn m.SourceCodeInfo\n\t}\n\treturn nil\n}\n\nfunc (m *FileDescriptorProto) GetSyntax() string {\n\tif m != nil && m.Syntax != nil {\n\t\treturn *m.Syntax\n\t}\n\treturn \"\"\n}\n\n// Describes a message type.\ntype DescriptorProto struct {\n\tName           *string                           `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\tField          []*FieldDescriptorProto           `protobuf:\"bytes,2,rep,name=field\" json:\"field,omitempty\"`\n\tExtension      []*FieldDescriptorProto           `protobuf:\"bytes,6,rep,name=extension\" json:\"extension,omitempty\"`\n\tNestedType     []*DescriptorProto                `protobuf:\"bytes,3,rep,name=nested_type,json=nestedType\" json:\"nested_type,omitempty\"`\n\tEnumType       []*EnumDescriptorProto            `protobuf:\"bytes,4,rep,name=enum_type,json=enumType\" json:\"enum_type,omitempty\"`\n\tExtensionRange []*DescriptorProto_ExtensionRange `protobuf:\"bytes,5,rep,name=extension_range,json=extensionRange\" json:\"extension_range,omitempty\"`\n\tOneofDecl      []*OneofDescriptorProto           `protobuf:\"bytes,8,rep,name=oneof_decl,json=oneofDecl\" json:\"oneof_decl,omitempty\"`\n\tOptions        *MessageOptions                   `protobuf:\"bytes,7,opt,name=options\" json:\"options,omitempty\"`\n\tReservedRange  []*DescriptorProto_ReservedRange  `protobuf:\"bytes,9,rep,name=reserved_range,json=reservedRange\" json:\"reserved_range,omitempty\"`\n\t// Reserved field names, which may not be used by fields in the same message.\n\t// A given name may only be reserved once.\n\tReservedName     []string `protobuf:\"bytes,10,rep,name=reserved_name,json=reservedName\" json:\"reserved_name,omitempty\"`\n\tXXX_unrecognized []byte   `json:\"-\"`\n}\n\nfunc (m *DescriptorProto) Reset()                    { *m = DescriptorProto{} }\nfunc (m *DescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*DescriptorProto) ProtoMessage()               {}\nfunc (*DescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }\n\nfunc (m *DescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *DescriptorProto) GetField() []*FieldDescriptorProto {\n\tif m != nil {\n\t\treturn m.Field\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetExtension() []*FieldDescriptorProto {\n\tif m != nil {\n\t\treturn m.Extension\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetNestedType() []*DescriptorProto {\n\tif m != nil {\n\t\treturn m.NestedType\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetEnumType() []*EnumDescriptorProto {\n\tif m != nil {\n\t\treturn m.EnumType\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetExtensionRange() []*DescriptorProto_ExtensionRange {\n\tif m != nil {\n\t\treturn m.ExtensionRange\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetOneofDecl() []*OneofDescriptorProto {\n\tif m != nil {\n\t\treturn m.OneofDecl\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetOptions() *MessageOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetReservedRange() []*DescriptorProto_ReservedRange {\n\tif m != nil {\n\t\treturn m.ReservedRange\n\t}\n\treturn nil\n}\n\nfunc (m *DescriptorProto) GetReservedName() []string {\n\tif m != nil {\n\t\treturn m.ReservedName\n\t}\n\treturn nil\n}\n\ntype DescriptorProto_ExtensionRange struct {\n\tStart            *int32 `protobuf:\"varint,1,opt,name=start\" json:\"start,omitempty\"`\n\tEnd              *int32 `protobuf:\"varint,2,opt,name=end\" json:\"end,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DescriptorProto_ExtensionRange) Reset()         { *m = DescriptorProto_ExtensionRange{} }\nfunc (m *DescriptorProto_ExtensionRange) String() string { return proto.CompactTextString(m) }\nfunc (*DescriptorProto_ExtensionRange) ProtoMessage()    {}\nfunc (*DescriptorProto_ExtensionRange) Descriptor() ([]byte, []int) {\n\treturn fileDescriptor0, []int{2, 0}\n}\n\nfunc (m *DescriptorProto_ExtensionRange) GetStart() int32 {\n\tif m != nil && m.Start != nil {\n\t\treturn *m.Start\n\t}\n\treturn 0\n}\n\nfunc (m *DescriptorProto_ExtensionRange) GetEnd() int32 {\n\tif m != nil && m.End != nil {\n\t\treturn *m.End\n\t}\n\treturn 0\n}\n\n// Range of reserved tag numbers. Reserved tag numbers may not be used by\n// fields or extension ranges in the same message. Reserved ranges may\n// not overlap.\ntype DescriptorProto_ReservedRange struct {\n\tStart            *int32 `protobuf:\"varint,1,opt,name=start\" json:\"start,omitempty\"`\n\tEnd              *int32 `protobuf:\"varint,2,opt,name=end\" json:\"end,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DescriptorProto_ReservedRange) Reset()         { *m = DescriptorProto_ReservedRange{} }\nfunc (m *DescriptorProto_ReservedRange) String() string { return proto.CompactTextString(m) }\nfunc (*DescriptorProto_ReservedRange) ProtoMessage()    {}\nfunc (*DescriptorProto_ReservedRange) Descriptor() ([]byte, []int) {\n\treturn fileDescriptor0, []int{2, 1}\n}\n\nfunc (m *DescriptorProto_ReservedRange) GetStart() int32 {\n\tif m != nil && m.Start != nil {\n\t\treturn *m.Start\n\t}\n\treturn 0\n}\n\nfunc (m *DescriptorProto_ReservedRange) GetEnd() int32 {\n\tif m != nil && m.End != nil {\n\t\treturn *m.End\n\t}\n\treturn 0\n}\n\n// Describes a field within a message.\ntype FieldDescriptorProto struct {\n\tName   *string                     `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\tNumber *int32                      `protobuf:\"varint,3,opt,name=number\" json:\"number,omitempty\"`\n\tLabel  *FieldDescriptorProto_Label `protobuf:\"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label\" json:\"label,omitempty\"`\n\t// If type_name is set, this need not be set.  If both this and type_name\n\t// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.\n\tType *FieldDescriptorProto_Type `protobuf:\"varint,5,opt,name=type,enum=google.protobuf.FieldDescriptorProto_Type\" json:\"type,omitempty\"`\n\t// For message and enum types, this is the name of the type.  If the name\n\t// starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n\t// rules are used to find the type (i.e. first the nested types within this\n\t// message are searched, then within the parent, on up to the root\n\t// namespace).\n\tTypeName *string `protobuf:\"bytes,6,opt,name=type_name,json=typeName\" json:\"type_name,omitempty\"`\n\t// For extensions, this is the name of the type being extended.  It is\n\t// resolved in the same manner as type_name.\n\tExtendee *string `protobuf:\"bytes,2,opt,name=extendee\" json:\"extendee,omitempty\"`\n\t// For numeric types, contains the original text representation of the value.\n\t// For booleans, \"true\" or \"false\".\n\t// For strings, contains the default text contents (not escaped in any way).\n\t// For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n\t// TODO(kenton):  Base-64 encode?\n\tDefaultValue *string `protobuf:\"bytes,7,opt,name=default_value,json=defaultValue\" json:\"default_value,omitempty\"`\n\t// If set, gives the index of a oneof in the containing type's oneof_decl\n\t// list.  This field is a member of that oneof.\n\tOneofIndex *int32 `protobuf:\"varint,9,opt,name=oneof_index,json=oneofIndex\" json:\"oneof_index,omitempty\"`\n\t// JSON name of this field. The value is set by protocol compiler. If the\n\t// user has set a \"json_name\" option on this field, that option's value\n\t// will be used. Otherwise, it's deduced from the field's name by converting\n\t// it to camelCase.\n\tJsonName         *string       `protobuf:\"bytes,10,opt,name=json_name,json=jsonName\" json:\"json_name,omitempty\"`\n\tOptions          *FieldOptions `protobuf:\"bytes,8,opt,name=options\" json:\"options,omitempty\"`\n\tXXX_unrecognized []byte        `json:\"-\"`\n}\n\nfunc (m *FieldDescriptorProto) Reset()                    { *m = FieldDescriptorProto{} }\nfunc (m *FieldDescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*FieldDescriptorProto) ProtoMessage()               {}\nfunc (*FieldDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }\n\nfunc (m *FieldDescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *FieldDescriptorProto) GetNumber() int32 {\n\tif m != nil && m.Number != nil {\n\t\treturn *m.Number\n\t}\n\treturn 0\n}\n\nfunc (m *FieldDescriptorProto) GetLabel() FieldDescriptorProto_Label {\n\tif m != nil && m.Label != nil {\n\t\treturn *m.Label\n\t}\n\treturn FieldDescriptorProto_LABEL_OPTIONAL\n}\n\nfunc (m *FieldDescriptorProto) GetType() FieldDescriptorProto_Type {\n\tif m != nil && m.Type != nil {\n\t\treturn *m.Type\n\t}\n\treturn FieldDescriptorProto_TYPE_DOUBLE\n}\n\nfunc (m *FieldDescriptorProto) GetTypeName() string {\n\tif m != nil && m.TypeName != nil {\n\t\treturn *m.TypeName\n\t}\n\treturn \"\"\n}\n\nfunc (m *FieldDescriptorProto) GetExtendee() string {\n\tif m != nil && m.Extendee != nil {\n\t\treturn *m.Extendee\n\t}\n\treturn \"\"\n}\n\nfunc (m *FieldDescriptorProto) GetDefaultValue() string {\n\tif m != nil && m.DefaultValue != nil {\n\t\treturn *m.DefaultValue\n\t}\n\treturn \"\"\n}\n\nfunc (m *FieldDescriptorProto) GetOneofIndex() int32 {\n\tif m != nil && m.OneofIndex != nil {\n\t\treturn *m.OneofIndex\n\t}\n\treturn 0\n}\n\nfunc (m *FieldDescriptorProto) GetJsonName() string {\n\tif m != nil && m.JsonName != nil {\n\t\treturn *m.JsonName\n\t}\n\treturn \"\"\n}\n\nfunc (m *FieldDescriptorProto) GetOptions() *FieldOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\n// Describes a oneof.\ntype OneofDescriptorProto struct {\n\tName             *string       `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\tOptions          *OneofOptions `protobuf:\"bytes,2,opt,name=options\" json:\"options,omitempty\"`\n\tXXX_unrecognized []byte        `json:\"-\"`\n}\n\nfunc (m *OneofDescriptorProto) Reset()                    { *m = OneofDescriptorProto{} }\nfunc (m *OneofDescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*OneofDescriptorProto) ProtoMessage()               {}\nfunc (*OneofDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }\n\nfunc (m *OneofDescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *OneofDescriptorProto) GetOptions() *OneofOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\n// Describes an enum type.\ntype EnumDescriptorProto struct {\n\tName             *string                     `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\tValue            []*EnumValueDescriptorProto `protobuf:\"bytes,2,rep,name=value\" json:\"value,omitempty\"`\n\tOptions          *EnumOptions                `protobuf:\"bytes,3,opt,name=options\" json:\"options,omitempty\"`\n\tXXX_unrecognized []byte                      `json:\"-\"`\n}\n\nfunc (m *EnumDescriptorProto) Reset()                    { *m = EnumDescriptorProto{} }\nfunc (m *EnumDescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*EnumDescriptorProto) ProtoMessage()               {}\nfunc (*EnumDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }\n\nfunc (m *EnumDescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *EnumDescriptorProto) GetValue() []*EnumValueDescriptorProto {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\nfunc (m *EnumDescriptorProto) GetOptions() *EnumOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\n// Describes a value within an enum.\ntype EnumValueDescriptorProto struct {\n\tName             *string           `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\tNumber           *int32            `protobuf:\"varint,2,opt,name=number\" json:\"number,omitempty\"`\n\tOptions          *EnumValueOptions `protobuf:\"bytes,3,opt,name=options\" json:\"options,omitempty\"`\n\tXXX_unrecognized []byte            `json:\"-\"`\n}\n\nfunc (m *EnumValueDescriptorProto) Reset()                    { *m = EnumValueDescriptorProto{} }\nfunc (m *EnumValueDescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*EnumValueDescriptorProto) ProtoMessage()               {}\nfunc (*EnumValueDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }\n\nfunc (m *EnumValueDescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *EnumValueDescriptorProto) GetNumber() int32 {\n\tif m != nil && m.Number != nil {\n\t\treturn *m.Number\n\t}\n\treturn 0\n}\n\nfunc (m *EnumValueDescriptorProto) GetOptions() *EnumValueOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\n// Describes a service.\ntype ServiceDescriptorProto struct {\n\tName             *string                  `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\tMethod           []*MethodDescriptorProto `protobuf:\"bytes,2,rep,name=method\" json:\"method,omitempty\"`\n\tOptions          *ServiceOptions          `protobuf:\"bytes,3,opt,name=options\" json:\"options,omitempty\"`\n\tXXX_unrecognized []byte                   `json:\"-\"`\n}\n\nfunc (m *ServiceDescriptorProto) Reset()                    { *m = ServiceDescriptorProto{} }\nfunc (m *ServiceDescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*ServiceDescriptorProto) ProtoMessage()               {}\nfunc (*ServiceDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }\n\nfunc (m *ServiceDescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *ServiceDescriptorProto) GetMethod() []*MethodDescriptorProto {\n\tif m != nil {\n\t\treturn m.Method\n\t}\n\treturn nil\n}\n\nfunc (m *ServiceDescriptorProto) GetOptions() *ServiceOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\n// Describes a method of a service.\ntype MethodDescriptorProto struct {\n\tName *string `protobuf:\"bytes,1,opt,name=name\" json:\"name,omitempty\"`\n\t// Input and output type names.  These are resolved in the same way as\n\t// FieldDescriptorProto.type_name, but must refer to a message type.\n\tInputType  *string        `protobuf:\"bytes,2,opt,name=input_type,json=inputType\" json:\"input_type,omitempty\"`\n\tOutputType *string        `protobuf:\"bytes,3,opt,name=output_type,json=outputType\" json:\"output_type,omitempty\"`\n\tOptions    *MethodOptions `protobuf:\"bytes,4,opt,name=options\" json:\"options,omitempty\"`\n\t// Identifies if client streams multiple client messages\n\tClientStreaming *bool `protobuf:\"varint,5,opt,name=client_streaming,json=clientStreaming,def=0\" json:\"client_streaming,omitempty\"`\n\t// Identifies if server streams multiple server messages\n\tServerStreaming  *bool  `protobuf:\"varint,6,opt,name=server_streaming,json=serverStreaming,def=0\" json:\"server_streaming,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *MethodDescriptorProto) Reset()                    { *m = MethodDescriptorProto{} }\nfunc (m *MethodDescriptorProto) String() string            { return proto.CompactTextString(m) }\nfunc (*MethodDescriptorProto) ProtoMessage()               {}\nfunc (*MethodDescriptorProto) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }\n\nconst Default_MethodDescriptorProto_ClientStreaming bool = false\nconst Default_MethodDescriptorProto_ServerStreaming bool = false\n\nfunc (m *MethodDescriptorProto) GetName() string {\n\tif m != nil && m.Name != nil {\n\t\treturn *m.Name\n\t}\n\treturn \"\"\n}\n\nfunc (m *MethodDescriptorProto) GetInputType() string {\n\tif m != nil && m.InputType != nil {\n\t\treturn *m.InputType\n\t}\n\treturn \"\"\n}\n\nfunc (m *MethodDescriptorProto) GetOutputType() string {\n\tif m != nil && m.OutputType != nil {\n\t\treturn *m.OutputType\n\t}\n\treturn \"\"\n}\n\nfunc (m *MethodDescriptorProto) GetOptions() *MethodOptions {\n\tif m != nil {\n\t\treturn m.Options\n\t}\n\treturn nil\n}\n\nfunc (m *MethodDescriptorProto) GetClientStreaming() bool {\n\tif m != nil && m.ClientStreaming != nil {\n\t\treturn *m.ClientStreaming\n\t}\n\treturn Default_MethodDescriptorProto_ClientStreaming\n}\n\nfunc (m *MethodDescriptorProto) GetServerStreaming() bool {\n\tif m != nil && m.ServerStreaming != nil {\n\t\treturn *m.ServerStreaming\n\t}\n\treturn Default_MethodDescriptorProto_ServerStreaming\n}\n\ntype FileOptions struct {\n\t// Sets the Java package where classes generated from this .proto will be\n\t// placed.  By default, the proto package is used, but this is often\n\t// inappropriate because proto packages do not normally start with backwards\n\t// domain names.\n\tJavaPackage *string `protobuf:\"bytes,1,opt,name=java_package,json=javaPackage\" json:\"java_package,omitempty\"`\n\t// If set, all the classes from the .proto file are wrapped in a single\n\t// outer class with the given name.  This applies to both Proto1\n\t// (equivalent to the old \"--one_java_file\" option) and Proto2 (where\n\t// a .proto always translates to a single class, but you may want to\n\t// explicitly choose the class name).\n\tJavaOuterClassname *string `protobuf:\"bytes,8,opt,name=java_outer_classname,json=javaOuterClassname\" json:\"java_outer_classname,omitempty\"`\n\t// If set true, then the Java code generator will generate a separate .java\n\t// file for each top-level message, enum, and service defined in the .proto\n\t// file.  Thus, these types will *not* be nested inside the outer class\n\t// named by java_outer_classname.  However, the outer class will still be\n\t// generated to contain the file's getDescriptor() method as well as any\n\t// top-level extensions defined in the file.\n\tJavaMultipleFiles *bool `protobuf:\"varint,10,opt,name=java_multiple_files,json=javaMultipleFiles,def=0\" json:\"java_multiple_files,omitempty\"`\n\t// This option does nothing.\n\tJavaGenerateEqualsAndHash *bool `protobuf:\"varint,20,opt,name=java_generate_equals_and_hash,json=javaGenerateEqualsAndHash\" json:\"java_generate_equals_and_hash,omitempty\"`\n\t// If set true, then the Java2 code generator will generate code that\n\t// throws an exception whenever an attempt is made to assign a non-UTF-8\n\t// byte sequence to a string field.\n\t// Message reflection will do the same.\n\t// However, an extension field still accepts non-UTF-8 byte sequences.\n\t// This option has no effect on when used with the lite runtime.\n\tJavaStringCheckUtf8 *bool                     `protobuf:\"varint,27,opt,name=java_string_check_utf8,json=javaStringCheckUtf8,def=0\" json:\"java_string_check_utf8,omitempty\"`\n\tOptimizeFor         *FileOptions_OptimizeMode `protobuf:\"varint,9,opt,name=optimize_for,json=optimizeFor,enum=google.protobuf.FileOptions_OptimizeMode,def=1\" json:\"optimize_for,omitempty\"`\n\t// Sets the Go package where structs generated from this .proto will be\n\t// placed. If omitted, the Go package will be derived from the following:\n\t//   - The basename of the package import path, if provided.\n\t//   - Otherwise, the package statement in the .proto file, if present.\n\t//   - Otherwise, the basename of the .proto file, without extension.\n\tGoPackage *string `protobuf:\"bytes,11,opt,name=go_package,json=goPackage\" json:\"go_package,omitempty\"`\n\t// Should generic services be generated in each language?  \"Generic\" services\n\t// are not specific to any particular RPC system.  They are generated by the\n\t// main code generators in each language (without additional plugins).\n\t// Generic services were the only kind of service generation supported by\n\t// early versions of google.protobuf.\n\t//\n\t// Generic services are now considered deprecated in favor of using plugins\n\t// that generate code specific to your particular RPC system.  Therefore,\n\t// these default to false.  Old code which depends on generic services should\n\t// explicitly set them to true.\n\tCcGenericServices   *bool `protobuf:\"varint,16,opt,name=cc_generic_services,json=ccGenericServices,def=0\" json:\"cc_generic_services,omitempty\"`\n\tJavaGenericServices *bool `protobuf:\"varint,17,opt,name=java_generic_services,json=javaGenericServices,def=0\" json:\"java_generic_services,omitempty\"`\n\tPyGenericServices   *bool `protobuf:\"varint,18,opt,name=py_generic_services,json=pyGenericServices,def=0\" json:\"py_generic_services,omitempty\"`\n\t// Is this file deprecated?\n\t// Depending on the target platform, this can emit Deprecated annotations\n\t// for everything in the file, or it will be completely ignored; in the very\n\t// least, this is a formalization for deprecating files.\n\tDeprecated *bool `protobuf:\"varint,23,opt,name=deprecated,def=0\" json:\"deprecated,omitempty\"`\n\t// Enables the use of arenas for the proto messages in this file. This applies\n\t// only to generated classes for C++.\n\tCcEnableArenas *bool `protobuf:\"varint,31,opt,name=cc_enable_arenas,json=ccEnableArenas,def=0\" json:\"cc_enable_arenas,omitempty\"`\n\t// Sets the objective c class prefix which is prepended to all objective c\n\t// generated classes from this .proto. There is no default.\n\tObjcClassPrefix *string `protobuf:\"bytes,36,opt,name=objc_class_prefix,json=objcClassPrefix\" json:\"objc_class_prefix,omitempty\"`\n\t// Namespace for generated classes; defaults to the package.\n\tCsharpNamespace *string `protobuf:\"bytes,37,opt,name=csharp_namespace,json=csharpNamespace\" json:\"csharp_namespace,omitempty\"`\n\t// By default Swift generators will take the proto package and CamelCase it\n\t// replacing '.' with underscore and use that to prefix the types/symbols\n\t// defined. When this options is provided, they will use this value instead\n\t// to prefix the types/symbols defined.\n\tSwiftPrefix *string `protobuf:\"bytes,39,opt,name=swift_prefix,json=swiftPrefix\" json:\"swift_prefix,omitempty\"`\n\t// Sets the php class prefix which is prepended to all php generated classes\n\t// from this .proto. Default is empty.\n\tPhpClassPrefix *string `protobuf:\"bytes,40,opt,name=php_class_prefix,json=phpClassPrefix\" json:\"php_class_prefix,omitempty\"`\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *FileOptions) Reset()                    { *m = FileOptions{} }\nfunc (m *FileOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*FileOptions) ProtoMessage()               {}\nfunc (*FileOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }\n\nvar extRange_FileOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*FileOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_FileOptions\n}\n\nconst Default_FileOptions_JavaMultipleFiles bool = false\nconst Default_FileOptions_JavaStringCheckUtf8 bool = false\nconst Default_FileOptions_OptimizeFor FileOptions_OptimizeMode = FileOptions_SPEED\nconst Default_FileOptions_CcGenericServices bool = false\nconst Default_FileOptions_JavaGenericServices bool = false\nconst Default_FileOptions_PyGenericServices bool = false\nconst Default_FileOptions_Deprecated bool = false\nconst Default_FileOptions_CcEnableArenas bool = false\n\nfunc (m *FileOptions) GetJavaPackage() string {\n\tif m != nil && m.JavaPackage != nil {\n\t\treturn *m.JavaPackage\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileOptions) GetJavaOuterClassname() string {\n\tif m != nil && m.JavaOuterClassname != nil {\n\t\treturn *m.JavaOuterClassname\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileOptions) GetJavaMultipleFiles() bool {\n\tif m != nil && m.JavaMultipleFiles != nil {\n\t\treturn *m.JavaMultipleFiles\n\t}\n\treturn Default_FileOptions_JavaMultipleFiles\n}\n\nfunc (m *FileOptions) GetJavaGenerateEqualsAndHash() bool {\n\tif m != nil && m.JavaGenerateEqualsAndHash != nil {\n\t\treturn *m.JavaGenerateEqualsAndHash\n\t}\n\treturn false\n}\n\nfunc (m *FileOptions) GetJavaStringCheckUtf8() bool {\n\tif m != nil && m.JavaStringCheckUtf8 != nil {\n\t\treturn *m.JavaStringCheckUtf8\n\t}\n\treturn Default_FileOptions_JavaStringCheckUtf8\n}\n\nfunc (m *FileOptions) GetOptimizeFor() FileOptions_OptimizeMode {\n\tif m != nil && m.OptimizeFor != nil {\n\t\treturn *m.OptimizeFor\n\t}\n\treturn Default_FileOptions_OptimizeFor\n}\n\nfunc (m *FileOptions) GetGoPackage() string {\n\tif m != nil && m.GoPackage != nil {\n\t\treturn *m.GoPackage\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileOptions) GetCcGenericServices() bool {\n\tif m != nil && m.CcGenericServices != nil {\n\t\treturn *m.CcGenericServices\n\t}\n\treturn Default_FileOptions_CcGenericServices\n}\n\nfunc (m *FileOptions) GetJavaGenericServices() bool {\n\tif m != nil && m.JavaGenericServices != nil {\n\t\treturn *m.JavaGenericServices\n\t}\n\treturn Default_FileOptions_JavaGenericServices\n}\n\nfunc (m *FileOptions) GetPyGenericServices() bool {\n\tif m != nil && m.PyGenericServices != nil {\n\t\treturn *m.PyGenericServices\n\t}\n\treturn Default_FileOptions_PyGenericServices\n}\n\nfunc (m *FileOptions) GetDeprecated() bool {\n\tif m != nil && m.Deprecated != nil {\n\t\treturn *m.Deprecated\n\t}\n\treturn Default_FileOptions_Deprecated\n}\n\nfunc (m *FileOptions) GetCcEnableArenas() bool {\n\tif m != nil && m.CcEnableArenas != nil {\n\t\treturn *m.CcEnableArenas\n\t}\n\treturn Default_FileOptions_CcEnableArenas\n}\n\nfunc (m *FileOptions) GetObjcClassPrefix() string {\n\tif m != nil && m.ObjcClassPrefix != nil {\n\t\treturn *m.ObjcClassPrefix\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileOptions) GetCsharpNamespace() string {\n\tif m != nil && m.CsharpNamespace != nil {\n\t\treturn *m.CsharpNamespace\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileOptions) GetSwiftPrefix() string {\n\tif m != nil && m.SwiftPrefix != nil {\n\t\treturn *m.SwiftPrefix\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileOptions) GetPhpClassPrefix() string {\n\tif m != nil && m.PhpClassPrefix != nil {\n\t\treturn *m.PhpClassPrefix\n\t}\n\treturn \"\"\n}\n\nfunc (m *FileOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\ntype MessageOptions struct {\n\t// Set true to use the old proto1 MessageSet wire format for extensions.\n\t// This is provided for backwards-compatibility with the MessageSet wire\n\t// format.  You should not use this for any other reason:  It's less\n\t// efficient, has fewer features, and is more complicated.\n\t//\n\t// The message must be defined exactly as follows:\n\t//   message Foo {\n\t//     option message_set_wire_format = true;\n\t//     extensions 4 to max;\n\t//   }\n\t// Note that the message cannot have any defined fields; MessageSets only\n\t// have extensions.\n\t//\n\t// All extensions of your type must be singular messages; e.g. they cannot\n\t// be int32s, enums, or repeated messages.\n\t//\n\t// Because this is an option, the above two restrictions are not enforced by\n\t// the protocol compiler.\n\tMessageSetWireFormat *bool `protobuf:\"varint,1,opt,name=message_set_wire_format,json=messageSetWireFormat,def=0\" json:\"message_set_wire_format,omitempty\"`\n\t// Disables the generation of the standard \"descriptor()\" accessor, which can\n\t// conflict with a field of the same name.  This is meant to make migration\n\t// from proto1 easier; new code should avoid fields named \"descriptor\".\n\tNoStandardDescriptorAccessor *bool `protobuf:\"varint,2,opt,name=no_standard_descriptor_accessor,json=noStandardDescriptorAccessor,def=0\" json:\"no_standard_descriptor_accessor,omitempty\"`\n\t// Is this message deprecated?\n\t// Depending on the target platform, this can emit Deprecated annotations\n\t// for the message, or it will be completely ignored; in the very least,\n\t// this is a formalization for deprecating messages.\n\tDeprecated *bool `protobuf:\"varint,3,opt,name=deprecated,def=0\" json:\"deprecated,omitempty\"`\n\t// Whether the message is an automatically generated map entry type for the\n\t// maps field.\n\t//\n\t// For maps fields:\n\t//     map<KeyType, ValueType> map_field = 1;\n\t// The parsed descriptor looks like:\n\t//     message MapFieldEntry {\n\t//         option map_entry = true;\n\t//         optional KeyType key = 1;\n\t//         optional ValueType value = 2;\n\t//     }\n\t//     repeated MapFieldEntry map_field = 1;\n\t//\n\t// Implementations may choose not to generate the map_entry=true message, but\n\t// use a native map in the target language to hold the keys and values.\n\t// The reflection APIs in such implementions still need to work as\n\t// if the field is a repeated message field.\n\t//\n\t// NOTE: Do not set the option in .proto files. Always use the maps syntax\n\t// instead. The option should only be implicitly set by the proto compiler\n\t// parser.\n\tMapEntry *bool `protobuf:\"varint,7,opt,name=map_entry,json=mapEntry\" json:\"map_entry,omitempty\"`\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *MessageOptions) Reset()                    { *m = MessageOptions{} }\nfunc (m *MessageOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*MessageOptions) ProtoMessage()               {}\nfunc (*MessageOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }\n\nvar extRange_MessageOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*MessageOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_MessageOptions\n}\n\nconst Default_MessageOptions_MessageSetWireFormat bool = false\nconst Default_MessageOptions_NoStandardDescriptorAccessor bool = false\nconst Default_MessageOptions_Deprecated bool = false\n\nfunc (m *MessageOptions) GetMessageSetWireFormat() bool {\n\tif m != nil && m.MessageSetWireFormat != nil {\n\t\treturn *m.MessageSetWireFormat\n\t}\n\treturn Default_MessageOptions_MessageSetWireFormat\n}\n\nfunc (m *MessageOptions) GetNoStandardDescriptorAccessor() bool {\n\tif m != nil && m.NoStandardDescriptorAccessor != nil {\n\t\treturn *m.NoStandardDescriptorAccessor\n\t}\n\treturn Default_MessageOptions_NoStandardDescriptorAccessor\n}\n\nfunc (m *MessageOptions) GetDeprecated() bool {\n\tif m != nil && m.Deprecated != nil {\n\t\treturn *m.Deprecated\n\t}\n\treturn Default_MessageOptions_Deprecated\n}\n\nfunc (m *MessageOptions) GetMapEntry() bool {\n\tif m != nil && m.MapEntry != nil {\n\t\treturn *m.MapEntry\n\t}\n\treturn false\n}\n\nfunc (m *MessageOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\ntype FieldOptions struct {\n\t// The ctype option instructs the C++ code generator to use a different\n\t// representation of the field than it normally would.  See the specific\n\t// options below.  This option is not yet implemented in the open source\n\t// release -- sorry, we'll try to include it in a future version!\n\tCtype *FieldOptions_CType `protobuf:\"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0\" json:\"ctype,omitempty\"`\n\t// The packed option can be enabled for repeated primitive fields to enable\n\t// a more efficient representation on the wire. Rather than repeatedly\n\t// writing the tag and type for each element, the entire array is encoded as\n\t// a single length-delimited blob. In proto3, only explicit setting it to\n\t// false will avoid using packed encoding.\n\tPacked *bool `protobuf:\"varint,2,opt,name=packed\" json:\"packed,omitempty\"`\n\t// The jstype option determines the JavaScript type used for values of the\n\t// field.  The option is permitted only for 64 bit integral and fixed types\n\t// (int64, uint64, sint64, fixed64, sfixed64).  By default these types are\n\t// represented as JavaScript strings.  This avoids loss of precision that can\n\t// happen when a large value is converted to a floating point JavaScript\n\t// numbers.  Specifying JS_NUMBER for the jstype causes the generated\n\t// JavaScript code to use the JavaScript \"number\" type instead of strings.\n\t// This option is an enum to permit additional types to be added,\n\t// e.g. goog.math.Integer.\n\tJstype *FieldOptions_JSType `protobuf:\"varint,6,opt,name=jstype,enum=google.protobuf.FieldOptions_JSType,def=0\" json:\"jstype,omitempty\"`\n\t// Should this field be parsed lazily?  Lazy applies only to message-type\n\t// fields.  It means that when the outer message is initially parsed, the\n\t// inner message's contents will not be parsed but instead stored in encoded\n\t// form.  The inner message will actually be parsed when it is first accessed.\n\t//\n\t// This is only a hint.  Implementations are free to choose whether to use\n\t// eager or lazy parsing regardless of the value of this option.  However,\n\t// setting this option true suggests that the protocol author believes that\n\t// using lazy parsing on this field is worth the additional bookkeeping\n\t// overhead typically needed to implement it.\n\t//\n\t// This option does not affect the public interface of any generated code;\n\t// all method signatures remain the same.  Furthermore, thread-safety of the\n\t// interface is not affected by this option; const methods remain safe to\n\t// call from multiple threads concurrently, while non-const methods continue\n\t// to require exclusive access.\n\t//\n\t//\n\t// Note that implementations may choose not to check required fields within\n\t// a lazy sub-message.  That is, calling IsInitialized() on the outer message\n\t// may return true even if the inner message has missing required fields.\n\t// This is necessary because otherwise the inner message would have to be\n\t// parsed in order to perform the check, defeating the purpose of lazy\n\t// parsing.  An implementation which chooses not to check required fields\n\t// must be consistent about it.  That is, for any particular sub-message, the\n\t// implementation must either *always* check its required fields, or *never*\n\t// check its required fields, regardless of whether or not the message has\n\t// been parsed.\n\tLazy *bool `protobuf:\"varint,5,opt,name=lazy,def=0\" json:\"lazy,omitempty\"`\n\t// Is this field deprecated?\n\t// Depending on the target platform, this can emit Deprecated annotations\n\t// for accessors, or it will be completely ignored; in the very least, this\n\t// is a formalization for deprecating fields.\n\tDeprecated *bool `protobuf:\"varint,3,opt,name=deprecated,def=0\" json:\"deprecated,omitempty\"`\n\t// For Google-internal migration only. Do not use.\n\tWeak *bool `protobuf:\"varint,10,opt,name=weak,def=0\" json:\"weak,omitempty\"`\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *FieldOptions) Reset()                    { *m = FieldOptions{} }\nfunc (m *FieldOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*FieldOptions) ProtoMessage()               {}\nfunc (*FieldOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }\n\nvar extRange_FieldOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*FieldOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_FieldOptions\n}\n\nconst Default_FieldOptions_Ctype FieldOptions_CType = FieldOptions_STRING\nconst Default_FieldOptions_Jstype FieldOptions_JSType = FieldOptions_JS_NORMAL\nconst Default_FieldOptions_Lazy bool = false\nconst Default_FieldOptions_Deprecated bool = false\nconst Default_FieldOptions_Weak bool = false\n\nfunc (m *FieldOptions) GetCtype() FieldOptions_CType {\n\tif m != nil && m.Ctype != nil {\n\t\treturn *m.Ctype\n\t}\n\treturn Default_FieldOptions_Ctype\n}\n\nfunc (m *FieldOptions) GetPacked() bool {\n\tif m != nil && m.Packed != nil {\n\t\treturn *m.Packed\n\t}\n\treturn false\n}\n\nfunc (m *FieldOptions) GetJstype() FieldOptions_JSType {\n\tif m != nil && m.Jstype != nil {\n\t\treturn *m.Jstype\n\t}\n\treturn Default_FieldOptions_Jstype\n}\n\nfunc (m *FieldOptions) GetLazy() bool {\n\tif m != nil && m.Lazy != nil {\n\t\treturn *m.Lazy\n\t}\n\treturn Default_FieldOptions_Lazy\n}\n\nfunc (m *FieldOptions) GetDeprecated() bool {\n\tif m != nil && m.Deprecated != nil {\n\t\treturn *m.Deprecated\n\t}\n\treturn Default_FieldOptions_Deprecated\n}\n\nfunc (m *FieldOptions) GetWeak() bool {\n\tif m != nil && m.Weak != nil {\n\t\treturn *m.Weak\n\t}\n\treturn Default_FieldOptions_Weak\n}\n\nfunc (m *FieldOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\ntype OneofOptions struct {\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *OneofOptions) Reset()                    { *m = OneofOptions{} }\nfunc (m *OneofOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*OneofOptions) ProtoMessage()               {}\nfunc (*OneofOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }\n\nvar extRange_OneofOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*OneofOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_OneofOptions\n}\n\nfunc (m *OneofOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\ntype EnumOptions struct {\n\t// Set this option to true to allow mapping different tag names to the same\n\t// value.\n\tAllowAlias *bool `protobuf:\"varint,2,opt,name=allow_alias,json=allowAlias\" json:\"allow_alias,omitempty\"`\n\t// Is this enum deprecated?\n\t// Depending on the target platform, this can emit Deprecated annotations\n\t// for the enum, or it will be completely ignored; in the very least, this\n\t// is a formalization for deprecating enums.\n\tDeprecated *bool `protobuf:\"varint,3,opt,name=deprecated,def=0\" json:\"deprecated,omitempty\"`\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *EnumOptions) Reset()                    { *m = EnumOptions{} }\nfunc (m *EnumOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*EnumOptions) ProtoMessage()               {}\nfunc (*EnumOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }\n\nvar extRange_EnumOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*EnumOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_EnumOptions\n}\n\nconst Default_EnumOptions_Deprecated bool = false\n\nfunc (m *EnumOptions) GetAllowAlias() bool {\n\tif m != nil && m.AllowAlias != nil {\n\t\treturn *m.AllowAlias\n\t}\n\treturn false\n}\n\nfunc (m *EnumOptions) GetDeprecated() bool {\n\tif m != nil && m.Deprecated != nil {\n\t\treturn *m.Deprecated\n\t}\n\treturn Default_EnumOptions_Deprecated\n}\n\nfunc (m *EnumOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\ntype EnumValueOptions struct {\n\t// Is this enum value deprecated?\n\t// Depending on the target platform, this can emit Deprecated annotations\n\t// for the enum value, or it will be completely ignored; in the very least,\n\t// this is a formalization for deprecating enum values.\n\tDeprecated *bool `protobuf:\"varint,1,opt,name=deprecated,def=0\" json:\"deprecated,omitempty\"`\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *EnumValueOptions) Reset()                    { *m = EnumValueOptions{} }\nfunc (m *EnumValueOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*EnumValueOptions) ProtoMessage()               {}\nfunc (*EnumValueOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }\n\nvar extRange_EnumValueOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*EnumValueOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_EnumValueOptions\n}\n\nconst Default_EnumValueOptions_Deprecated bool = false\n\nfunc (m *EnumValueOptions) GetDeprecated() bool {\n\tif m != nil && m.Deprecated != nil {\n\t\treturn *m.Deprecated\n\t}\n\treturn Default_EnumValueOptions_Deprecated\n}\n\nfunc (m *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\ntype ServiceOptions struct {\n\t// Is this service deprecated?\n\t// Depending on the target platform, this can emit Deprecated annotations\n\t// for the service, or it will be completely ignored; in the very least,\n\t// this is a formalization for deprecating services.\n\tDeprecated *bool `protobuf:\"varint,33,opt,name=deprecated,def=0\" json:\"deprecated,omitempty\"`\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *ServiceOptions) Reset()                    { *m = ServiceOptions{} }\nfunc (m *ServiceOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*ServiceOptions) ProtoMessage()               {}\nfunc (*ServiceOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }\n\nvar extRange_ServiceOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*ServiceOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_ServiceOptions\n}\n\nconst Default_ServiceOptions_Deprecated bool = false\n\nfunc (m *ServiceOptions) GetDeprecated() bool {\n\tif m != nil && m.Deprecated != nil {\n\t\treturn *m.Deprecated\n\t}\n\treturn Default_ServiceOptions_Deprecated\n}\n\nfunc (m *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\ntype MethodOptions struct {\n\t// Is this method deprecated?\n\t// Depending on the target platform, this can emit Deprecated annotations\n\t// for the method, or it will be completely ignored; in the very least,\n\t// this is a formalization for deprecating methods.\n\tDeprecated       *bool                           `protobuf:\"varint,33,opt,name=deprecated,def=0\" json:\"deprecated,omitempty\"`\n\tIdempotencyLevel *MethodOptions_IdempotencyLevel `protobuf:\"varint,34,opt,name=idempotency_level,json=idempotencyLevel,enum=google.protobuf.MethodOptions_IdempotencyLevel,def=0\" json:\"idempotency_level,omitempty\"`\n\t// The parser stores options it doesn't recognize here. See above.\n\tUninterpretedOption          []*UninterpretedOption `protobuf:\"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption\" json:\"uninterpreted_option,omitempty\"`\n\tproto.XXX_InternalExtensions `json:\"-\"`\n\tXXX_unrecognized             []byte `json:\"-\"`\n}\n\nfunc (m *MethodOptions) Reset()                    { *m = MethodOptions{} }\nfunc (m *MethodOptions) String() string            { return proto.CompactTextString(m) }\nfunc (*MethodOptions) ProtoMessage()               {}\nfunc (*MethodOptions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }\n\nvar extRange_MethodOptions = []proto.ExtensionRange{\n\t{1000, 536870911},\n}\n\nfunc (*MethodOptions) ExtensionRangeArray() []proto.ExtensionRange {\n\treturn extRange_MethodOptions\n}\n\nconst Default_MethodOptions_Deprecated bool = false\nconst Default_MethodOptions_IdempotencyLevel MethodOptions_IdempotencyLevel = MethodOptions_IDEMPOTENCY_UNKNOWN\n\nfunc (m *MethodOptions) GetDeprecated() bool {\n\tif m != nil && m.Deprecated != nil {\n\t\treturn *m.Deprecated\n\t}\n\treturn Default_MethodOptions_Deprecated\n}\n\nfunc (m *MethodOptions) GetIdempotencyLevel() MethodOptions_IdempotencyLevel {\n\tif m != nil && m.IdempotencyLevel != nil {\n\t\treturn *m.IdempotencyLevel\n\t}\n\treturn Default_MethodOptions_IdempotencyLevel\n}\n\nfunc (m *MethodOptions) GetUninterpretedOption() []*UninterpretedOption {\n\tif m != nil {\n\t\treturn m.UninterpretedOption\n\t}\n\treturn nil\n}\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\ntype UninterpretedOption struct {\n\tName []*UninterpretedOption_NamePart `protobuf:\"bytes,2,rep,name=name\" json:\"name,omitempty\"`\n\t// The value of the uninterpreted option, in whatever type the tokenizer\n\t// identified it as during parsing. Exactly one of these should be set.\n\tIdentifierValue  *string  `protobuf:\"bytes,3,opt,name=identifier_value,json=identifierValue\" json:\"identifier_value,omitempty\"`\n\tPositiveIntValue *uint64  `protobuf:\"varint,4,opt,name=positive_int_value,json=positiveIntValue\" json:\"positive_int_value,omitempty\"`\n\tNegativeIntValue *int64   `protobuf:\"varint,5,opt,name=negative_int_value,json=negativeIntValue\" json:\"negative_int_value,omitempty\"`\n\tDoubleValue      *float64 `protobuf:\"fixed64,6,opt,name=double_value,json=doubleValue\" json:\"double_value,omitempty\"`\n\tStringValue      []byte   `protobuf:\"bytes,7,opt,name=string_value,json=stringValue\" json:\"string_value,omitempty\"`\n\tAggregateValue   *string  `protobuf:\"bytes,8,opt,name=aggregate_value,json=aggregateValue\" json:\"aggregate_value,omitempty\"`\n\tXXX_unrecognized []byte   `json:\"-\"`\n}\n\nfunc (m *UninterpretedOption) Reset()                    { *m = UninterpretedOption{} }\nfunc (m *UninterpretedOption) String() string            { return proto.CompactTextString(m) }\nfunc (*UninterpretedOption) ProtoMessage()               {}\nfunc (*UninterpretedOption) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }\n\nfunc (m *UninterpretedOption) GetName() []*UninterpretedOption_NamePart {\n\tif m != nil {\n\t\treturn m.Name\n\t}\n\treturn nil\n}\n\nfunc (m *UninterpretedOption) GetIdentifierValue() string {\n\tif m != nil && m.IdentifierValue != nil {\n\t\treturn *m.IdentifierValue\n\t}\n\treturn \"\"\n}\n\nfunc (m *UninterpretedOption) GetPositiveIntValue() uint64 {\n\tif m != nil && m.PositiveIntValue != nil {\n\t\treturn *m.PositiveIntValue\n\t}\n\treturn 0\n}\n\nfunc (m *UninterpretedOption) GetNegativeIntValue() int64 {\n\tif m != nil && m.NegativeIntValue != nil {\n\t\treturn *m.NegativeIntValue\n\t}\n\treturn 0\n}\n\nfunc (m *UninterpretedOption) GetDoubleValue() float64 {\n\tif m != nil && m.DoubleValue != nil {\n\t\treturn *m.DoubleValue\n\t}\n\treturn 0\n}\n\nfunc (m *UninterpretedOption) GetStringValue() []byte {\n\tif m != nil {\n\t\treturn m.StringValue\n\t}\n\treturn nil\n}\n\nfunc (m *UninterpretedOption) GetAggregateValue() string {\n\tif m != nil && m.AggregateValue != nil {\n\t\treturn *m.AggregateValue\n\t}\n\treturn \"\"\n}\n\n// The name of the uninterpreted option.  Each string represents a segment in\n// a dot-separated name.  is_extension is true iff a segment represents an\n// extension (denoted with parentheses in options specs in .proto files).\n// E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n// \"foo.(bar.baz).qux\".\ntype UninterpretedOption_NamePart struct {\n\tNamePart         *string `protobuf:\"bytes,1,req,name=name_part,json=namePart\" json:\"name_part,omitempty\"`\n\tIsExtension      *bool   `protobuf:\"varint,2,req,name=is_extension,json=isExtension\" json:\"is_extension,omitempty\"`\n\tXXX_unrecognized []byte  `json:\"-\"`\n}\n\nfunc (m *UninterpretedOption_NamePart) Reset()         { *m = UninterpretedOption_NamePart{} }\nfunc (m *UninterpretedOption_NamePart) String() string { return proto.CompactTextString(m) }\nfunc (*UninterpretedOption_NamePart) ProtoMessage()    {}\nfunc (*UninterpretedOption_NamePart) Descriptor() ([]byte, []int) {\n\treturn fileDescriptor0, []int{17, 0}\n}\n\nfunc (m *UninterpretedOption_NamePart) GetNamePart() string {\n\tif m != nil && m.NamePart != nil {\n\t\treturn *m.NamePart\n\t}\n\treturn \"\"\n}\n\nfunc (m *UninterpretedOption_NamePart) GetIsExtension() bool {\n\tif m != nil && m.IsExtension != nil {\n\t\treturn *m.IsExtension\n\t}\n\treturn false\n}\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\ntype SourceCodeInfo struct {\n\t// A Location identifies a piece of source code in a .proto file which\n\t// corresponds to a particular definition.  This information is intended\n\t// to be useful to IDEs, code indexers, documentation generators, and similar\n\t// tools.\n\t//\n\t// For example, say we have a file like:\n\t//   message Foo {\n\t//     optional string foo = 1;\n\t//   }\n\t// Let's look at just the field definition:\n\t//   optional string foo = 1;\n\t//   ^       ^^     ^^  ^  ^^^\n\t//   a       bc     de  f  ghi\n\t// We have the following locations:\n\t//   span   path               represents\n\t//   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n\t//   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n\t//   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n\t//   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n\t//   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n\t//\n\t// Notes:\n\t// - A location may refer to a repeated field itself (i.e. not to any\n\t//   particular index within it).  This is used whenever a set of elements are\n\t//   logically enclosed in a single code segment.  For example, an entire\n\t//   extend block (possibly containing multiple extension definitions) will\n\t//   have an outer location whose path refers to the \"extensions\" repeated\n\t//   field without an index.\n\t// - Multiple locations may have the same path.  This happens when a single\n\t//   logical declaration is spread out across multiple places.  The most\n\t//   obvious example is the \"extend\" block again -- there may be multiple\n\t//   extend blocks in the same scope, each of which will have the same path.\n\t// - A location's span is not always a subset of its parent's span.  For\n\t//   example, the \"extendee\" of an extension declaration appears at the\n\t//   beginning of the \"extend\" block and is shared by all extensions within\n\t//   the block.\n\t// - Just because a location's span is a subset of some other location's span\n\t//   does not mean that it is a descendent.  For example, a \"group\" defines\n\t//   both a type and a field in a single declaration.  Thus, the locations\n\t//   corresponding to the type and field and their components will overlap.\n\t// - Code which tries to interpret locations should probably be designed to\n\t//   ignore those that it doesn't understand, as more types of locations could\n\t//   be recorded in the future.\n\tLocation         []*SourceCodeInfo_Location `protobuf:\"bytes,1,rep,name=location\" json:\"location,omitempty\"`\n\tXXX_unrecognized []byte                     `json:\"-\"`\n}\n\nfunc (m *SourceCodeInfo) Reset()                    { *m = SourceCodeInfo{} }\nfunc (m *SourceCodeInfo) String() string            { return proto.CompactTextString(m) }\nfunc (*SourceCodeInfo) ProtoMessage()               {}\nfunc (*SourceCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }\n\nfunc (m *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location {\n\tif m != nil {\n\t\treturn m.Location\n\t}\n\treturn nil\n}\n\ntype SourceCodeInfo_Location struct {\n\t// Identifies which part of the FileDescriptorProto was defined at this\n\t// location.\n\t//\n\t// Each element is a field number or an index.  They form a path from\n\t// the root FileDescriptorProto to the place where the definition.  For\n\t// example, this path:\n\t//   [ 4, 3, 2, 7, 1 ]\n\t// refers to:\n\t//   file.message_type(3)  // 4, 3\n\t//       .field(7)         // 2, 7\n\t//       .name()           // 1\n\t// This is because FileDescriptorProto.message_type has field number 4:\n\t//   repeated DescriptorProto message_type = 4;\n\t// and DescriptorProto.field has field number 2:\n\t//   repeated FieldDescriptorProto field = 2;\n\t// and FieldDescriptorProto.name has field number 1:\n\t//   optional string name = 1;\n\t//\n\t// Thus, the above path gives the location of a field name.  If we removed\n\t// the last element:\n\t//   [ 4, 3, 2, 7 ]\n\t// this path refers to the whole field declaration (from the beginning\n\t// of the label to the terminating semicolon).\n\tPath []int32 `protobuf:\"varint,1,rep,packed,name=path\" json:\"path,omitempty\"`\n\t// Always has exactly three or four elements: start line, start column,\n\t// end line (optional, otherwise assumed same as start line), end column.\n\t// These are packed into a single field for efficiency.  Note that line\n\t// and column numbers are zero-based -- typically you will want to add\n\t// 1 to each before displaying to a user.\n\tSpan []int32 `protobuf:\"varint,2,rep,packed,name=span\" json:\"span,omitempty\"`\n\t// If this SourceCodeInfo represents a complete declaration, these are any\n\t// comments appearing before and after the declaration which appear to be\n\t// attached to the declaration.\n\t//\n\t// A series of line comments appearing on consecutive lines, with no other\n\t// tokens appearing on those lines, will be treated as a single comment.\n\t//\n\t// leading_detached_comments will keep paragraphs of comments that appear\n\t// before (but not connected to) the current element. Each paragraph,\n\t// separated by empty lines, will be one comment element in the repeated\n\t// field.\n\t//\n\t// Only the comment content is provided; comment markers (e.g. //) are\n\t// stripped out.  For block comments, leading whitespace and an asterisk\n\t// will be stripped from the beginning of each line other than the first.\n\t// Newlines are included in the output.\n\t//\n\t// Examples:\n\t//\n\t//   optional int32 foo = 1;  // Comment attached to foo.\n\t//   // Comment attached to bar.\n\t//   optional int32 bar = 2;\n\t//\n\t//   optional string baz = 3;\n\t//   // Comment attached to baz.\n\t//   // Another line attached to baz.\n\t//\n\t//   // Comment attached to qux.\n\t//   //\n\t//   // Another line attached to qux.\n\t//   optional double qux = 4;\n\t//\n\t//   // Detached comment for corge. This is not leading or trailing comments\n\t//   // to qux or corge because there are blank lines separating it from\n\t//   // both.\n\t//\n\t//   // Detached comment for corge paragraph 2.\n\t//\n\t//   optional string corge = 5;\n\t//   /* Block comment attached\n\t//    * to corge.  Leading asterisks\n\t//    * will be removed. */\n\t//   /* Block comment attached to\n\t//    * grault. */\n\t//   optional int32 grault = 6;\n\t//\n\t//   // ignored detached comments.\n\tLeadingComments         *string  `protobuf:\"bytes,3,opt,name=leading_comments,json=leadingComments\" json:\"leading_comments,omitempty\"`\n\tTrailingComments        *string  `protobuf:\"bytes,4,opt,name=trailing_comments,json=trailingComments\" json:\"trailing_comments,omitempty\"`\n\tLeadingDetachedComments []string `protobuf:\"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments\" json:\"leading_detached_comments,omitempty\"`\n\tXXX_unrecognized        []byte   `json:\"-\"`\n}\n\nfunc (m *SourceCodeInfo_Location) Reset()                    { *m = SourceCodeInfo_Location{} }\nfunc (m *SourceCodeInfo_Location) String() string            { return proto.CompactTextString(m) }\nfunc (*SourceCodeInfo_Location) ProtoMessage()               {}\nfunc (*SourceCodeInfo_Location) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18, 0} }\n\nfunc (m *SourceCodeInfo_Location) GetPath() []int32 {\n\tif m != nil {\n\t\treturn m.Path\n\t}\n\treturn nil\n}\n\nfunc (m *SourceCodeInfo_Location) GetSpan() []int32 {\n\tif m != nil {\n\t\treturn m.Span\n\t}\n\treturn nil\n}\n\nfunc (m *SourceCodeInfo_Location) GetLeadingComments() string {\n\tif m != nil && m.LeadingComments != nil {\n\t\treturn *m.LeadingComments\n\t}\n\treturn \"\"\n}\n\nfunc (m *SourceCodeInfo_Location) GetTrailingComments() string {\n\tif m != nil && m.TrailingComments != nil {\n\t\treturn *m.TrailingComments\n\t}\n\treturn \"\"\n}\n\nfunc (m *SourceCodeInfo_Location) GetLeadingDetachedComments() []string {\n\tif m != nil {\n\t\treturn m.LeadingDetachedComments\n\t}\n\treturn nil\n}\n\n// Describes the relationship between generated code and its original source\n// file. A GeneratedCodeInfo message is associated with only one generated\n// source file, but may contain references to different source .proto files.\ntype GeneratedCodeInfo struct {\n\t// An Annotation connects some span of text in generated code to an element\n\t// of its generating .proto file.\n\tAnnotation       []*GeneratedCodeInfo_Annotation `protobuf:\"bytes,1,rep,name=annotation\" json:\"annotation,omitempty\"`\n\tXXX_unrecognized []byte                          `json:\"-\"`\n}\n\nfunc (m *GeneratedCodeInfo) Reset()                    { *m = GeneratedCodeInfo{} }\nfunc (m *GeneratedCodeInfo) String() string            { return proto.CompactTextString(m) }\nfunc (*GeneratedCodeInfo) ProtoMessage()               {}\nfunc (*GeneratedCodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }\n\nfunc (m *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation {\n\tif m != nil {\n\t\treturn m.Annotation\n\t}\n\treturn nil\n}\n\ntype GeneratedCodeInfo_Annotation struct {\n\t// Identifies the element in the original source .proto file. This field\n\t// is formatted the same as SourceCodeInfo.Location.path.\n\tPath []int32 `protobuf:\"varint,1,rep,packed,name=path\" json:\"path,omitempty\"`\n\t// Identifies the filesystem path to the original source .proto.\n\tSourceFile *string `protobuf:\"bytes,2,opt,name=source_file,json=sourceFile\" json:\"source_file,omitempty\"`\n\t// Identifies the starting offset in bytes in the generated code\n\t// that relates to the identified object.\n\tBegin *int32 `protobuf:\"varint,3,opt,name=begin\" json:\"begin,omitempty\"`\n\t// Identifies the ending offset in bytes in the generated code that\n\t// relates to the identified offset. The end offset should be one past\n\t// the last relevant byte (so the length of the text = end - begin).\n\tEnd              *int32 `protobuf:\"varint,4,opt,name=end\" json:\"end,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *GeneratedCodeInfo_Annotation) Reset()         { *m = GeneratedCodeInfo_Annotation{} }\nfunc (m *GeneratedCodeInfo_Annotation) String() string { return proto.CompactTextString(m) }\nfunc (*GeneratedCodeInfo_Annotation) ProtoMessage()    {}\nfunc (*GeneratedCodeInfo_Annotation) Descriptor() ([]byte, []int) {\n\treturn fileDescriptor0, []int{19, 0}\n}\n\nfunc (m *GeneratedCodeInfo_Annotation) GetPath() []int32 {\n\tif m != nil {\n\t\treturn m.Path\n\t}\n\treturn nil\n}\n\nfunc (m *GeneratedCodeInfo_Annotation) GetSourceFile() string {\n\tif m != nil && m.SourceFile != nil {\n\t\treturn *m.SourceFile\n\t}\n\treturn \"\"\n}\n\nfunc (m *GeneratedCodeInfo_Annotation) GetBegin() int32 {\n\tif m != nil && m.Begin != nil {\n\t\treturn *m.Begin\n\t}\n\treturn 0\n}\n\nfunc (m *GeneratedCodeInfo_Annotation) GetEnd() int32 {\n\tif m != nil && m.End != nil {\n\t\treturn *m.End\n\t}\n\treturn 0\n}\n\nfunc init() {\n\tproto.RegisterType((*FileDescriptorSet)(nil), \"google.protobuf.FileDescriptorSet\")\n\tproto.RegisterType((*FileDescriptorProto)(nil), \"google.protobuf.FileDescriptorProto\")\n\tproto.RegisterType((*DescriptorProto)(nil), \"google.protobuf.DescriptorProto\")\n\tproto.RegisterType((*DescriptorProto_ExtensionRange)(nil), \"google.protobuf.DescriptorProto.ExtensionRange\")\n\tproto.RegisterType((*DescriptorProto_ReservedRange)(nil), \"google.protobuf.DescriptorProto.ReservedRange\")\n\tproto.RegisterType((*FieldDescriptorProto)(nil), \"google.protobuf.FieldDescriptorProto\")\n\tproto.RegisterType((*OneofDescriptorProto)(nil), \"google.protobuf.OneofDescriptorProto\")\n\tproto.RegisterType((*EnumDescriptorProto)(nil), \"google.protobuf.EnumDescriptorProto\")\n\tproto.RegisterType((*EnumValueDescriptorProto)(nil), \"google.protobuf.EnumValueDescriptorProto\")\n\tproto.RegisterType((*ServiceDescriptorProto)(nil), \"google.protobuf.ServiceDescriptorProto\")\n\tproto.RegisterType((*MethodDescriptorProto)(nil), \"google.protobuf.MethodDescriptorProto\")\n\tproto.RegisterType((*FileOptions)(nil), \"google.protobuf.FileOptions\")\n\tproto.RegisterType((*MessageOptions)(nil), \"google.protobuf.MessageOptions\")\n\tproto.RegisterType((*FieldOptions)(nil), \"google.protobuf.FieldOptions\")\n\tproto.RegisterType((*OneofOptions)(nil), \"google.protobuf.OneofOptions\")\n\tproto.RegisterType((*EnumOptions)(nil), \"google.protobuf.EnumOptions\")\n\tproto.RegisterType((*EnumValueOptions)(nil), \"google.protobuf.EnumValueOptions\")\n\tproto.RegisterType((*ServiceOptions)(nil), \"google.protobuf.ServiceOptions\")\n\tproto.RegisterType((*MethodOptions)(nil), \"google.protobuf.MethodOptions\")\n\tproto.RegisterType((*UninterpretedOption)(nil), \"google.protobuf.UninterpretedOption\")\n\tproto.RegisterType((*UninterpretedOption_NamePart)(nil), \"google.protobuf.UninterpretedOption.NamePart\")\n\tproto.RegisterType((*SourceCodeInfo)(nil), \"google.protobuf.SourceCodeInfo\")\n\tproto.RegisterType((*SourceCodeInfo_Location)(nil), \"google.protobuf.SourceCodeInfo.Location\")\n\tproto.RegisterType((*GeneratedCodeInfo)(nil), \"google.protobuf.GeneratedCodeInfo\")\n\tproto.RegisterType((*GeneratedCodeInfo_Annotation)(nil), \"google.protobuf.GeneratedCodeInfo.Annotation\")\n\tproto.RegisterEnum(\"google.protobuf.FieldDescriptorProto_Type\", FieldDescriptorProto_Type_name, FieldDescriptorProto_Type_value)\n\tproto.RegisterEnum(\"google.protobuf.FieldDescriptorProto_Label\", FieldDescriptorProto_Label_name, FieldDescriptorProto_Label_value)\n\tproto.RegisterEnum(\"google.protobuf.FileOptions_OptimizeMode\", FileOptions_OptimizeMode_name, FileOptions_OptimizeMode_value)\n\tproto.RegisterEnum(\"google.protobuf.FieldOptions_CType\", FieldOptions_CType_name, FieldOptions_CType_value)\n\tproto.RegisterEnum(\"google.protobuf.FieldOptions_JSType\", FieldOptions_JSType_name, FieldOptions_JSType_value)\n\tproto.RegisterEnum(\"google.protobuf.MethodOptions_IdempotencyLevel\", MethodOptions_IdempotencyLevel_name, MethodOptions_IdempotencyLevel_value)\n}\n\nfunc init() { proto.RegisterFile(\"google/protobuf/descriptor.proto\", fileDescriptor0) }\n\nvar fileDescriptor0 = []byte{\n\t// 2460 bytes of a gzipped FileDescriptorProto\n\t0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x5b, 0x6f, 0xdb, 0xc8,\n\t0x15, 0x5e, 0x5d, 0x2d, 0x1d, 0xc9, 0xf2, 0x78, 0xec, 0x4d, 0x18, 0xef, 0x25, 0x8e, 0xf6, 0x12,\n\t0x6f, 0xd2, 0xc8, 0x0b, 0xe7, 0xb2, 0x59, 0xa7, 0x48, 0x21, 0x4b, 0x8c, 0x57, 0xa9, 0x2c, 0xa9,\n\t0x94, 0xdc, 0x4d, 0xf6, 0x85, 0x18, 0x93, 0x23, 0x99, 0x09, 0x45, 0x72, 0x49, 0x2a, 0x89, 0xf7,\n\t0x29, 0x40, 0x9f, 0x0a, 0xf4, 0x07, 0x14, 0x45, 0xd1, 0x87, 0x7d, 0x59, 0xa0, 0x3f, 0xa0, 0xcf,\n\t0xfd, 0x05, 0x05, 0xf6, 0xb9, 0x2f, 0x45, 0x51, 0xa0, 0xfd, 0x07, 0x7d, 0x2d, 0x66, 0x86, 0xa4,\n\t0x48, 0x5d, 0x12, 0x77, 0x81, 0xec, 0x3e, 0xd9, 0x73, 0xce, 0x77, 0x0e, 0xcf, 0x9c, 0xf9, 0x66,\n\t0xce, 0x99, 0x11, 0x6c, 0x8f, 0x6c, 0x7b, 0x64, 0xd2, 0x5d, 0xc7, 0xb5, 0x7d, 0xfb, 0x64, 0x32,\n\t0xdc, 0xd5, 0xa9, 0xa7, 0xb9, 0x86, 0xe3, 0xdb, 0x6e, 0x8d, 0xcb, 0xf0, 0x9a, 0x40, 0xd4, 0x42,\n\t0x44, 0xf5, 0x08, 0xd6, 0x1f, 0x18, 0x26, 0x6d, 0x46, 0xc0, 0x3e, 0xf5, 0xf1, 0x5d, 0xc8, 0x0e,\n\t0x0d, 0x93, 0x4a, 0xa9, 0xed, 0xcc, 0x4e, 0x69, 0xef, 0xc3, 0xda, 0x8c, 0x51, 0x2d, 0x69, 0xd1,\n\t0x63, 0x62, 0x85, 0x5b, 0x54, 0xff, 0x95, 0x85, 0x8d, 0x05, 0x5a, 0x8c, 0x21, 0x6b, 0x91, 0x31,\n\t0xf3, 0x98, 0xda, 0x29, 0x2a, 0xfc, 0x7f, 0x2c, 0xc1, 0x8a, 0x43, 0xb4, 0xa7, 0x64, 0x44, 0xa5,\n\t0x34, 0x17, 0x87, 0x43, 0xfc, 0x3e, 0x80, 0x4e, 0x1d, 0x6a, 0xe9, 0xd4, 0xd2, 0xce, 0xa4, 0xcc,\n\t0x76, 0x66, 0xa7, 0xa8, 0xc4, 0x24, 0xf8, 0x3a, 0xac, 0x3b, 0x93, 0x13, 0xd3, 0xd0, 0xd4, 0x18,\n\t0x0c, 0xb6, 0x33, 0x3b, 0x39, 0x05, 0x09, 0x45, 0x73, 0x0a, 0xbe, 0x0a, 0x6b, 0xcf, 0x29, 0x79,\n\t0x1a, 0x87, 0x96, 0x38, 0xb4, 0xc2, 0xc4, 0x31, 0x60, 0x03, 0xca, 0x63, 0xea, 0x79, 0x64, 0x44,\n\t0x55, 0xff, 0xcc, 0xa1, 0x52, 0x96, 0xcf, 0x7e, 0x7b, 0x6e, 0xf6, 0xb3, 0x33, 0x2f, 0x05, 0x56,\n\t0x83, 0x33, 0x87, 0xe2, 0x3a, 0x14, 0xa9, 0x35, 0x19, 0x0b, 0x0f, 0xb9, 0x25, 0xf9, 0x93, 0xad,\n\t0xc9, 0x78, 0xd6, 0x4b, 0x81, 0x99, 0x05, 0x2e, 0x56, 0x3c, 0xea, 0x3e, 0x33, 0x34, 0x2a, 0xe5,\n\t0xb9, 0x83, 0xab, 0x73, 0x0e, 0xfa, 0x42, 0x3f, 0xeb, 0x23, 0xb4, 0xc3, 0x0d, 0x28, 0xd2, 0x17,\n\t0x3e, 0xb5, 0x3c, 0xc3, 0xb6, 0xa4, 0x15, 0xee, 0xe4, 0xa3, 0x05, 0xab, 0x48, 0x4d, 0x7d, 0xd6,\n\t0xc5, 0xd4, 0x0e, 0xdf, 0x81, 0x15, 0xdb, 0xf1, 0x0d, 0xdb, 0xf2, 0xa4, 0xc2, 0x76, 0x6a, 0xa7,\n\t0xb4, 0xf7, 0xee, 0x42, 0x22, 0x74, 0x05, 0x46, 0x09, 0xc1, 0xb8, 0x05, 0xc8, 0xb3, 0x27, 0xae,\n\t0x46, 0x55, 0xcd, 0xd6, 0xa9, 0x6a, 0x58, 0x43, 0x5b, 0x2a, 0x72, 0x07, 0x97, 0xe7, 0x27, 0xc2,\n\t0x81, 0x0d, 0x5b, 0xa7, 0x2d, 0x6b, 0x68, 0x2b, 0x15, 0x2f, 0x31, 0xc6, 0x17, 0x20, 0xef, 0x9d,\n\t0x59, 0x3e, 0x79, 0x21, 0x95, 0x39, 0x43, 0x82, 0x51, 0xf5, 0xbf, 0x39, 0x58, 0x3b, 0x0f, 0xc5,\n\t0xee, 0x41, 0x6e, 0xc8, 0x66, 0x29, 0xa5, 0xff, 0x9f, 0x1c, 0x08, 0x9b, 0x64, 0x12, 0xf3, 0x3f,\n\t0x30, 0x89, 0x75, 0x28, 0x59, 0xd4, 0xf3, 0xa9, 0x2e, 0x18, 0x91, 0x39, 0x27, 0xa7, 0x40, 0x18,\n\t0xcd, 0x53, 0x2a, 0xfb, 0x83, 0x28, 0xf5, 0x08, 0xd6, 0xa2, 0x90, 0x54, 0x97, 0x58, 0xa3, 0x90,\n\t0x9b, 0xbb, 0xaf, 0x8b, 0xa4, 0x26, 0x87, 0x76, 0x0a, 0x33, 0x53, 0x2a, 0x34, 0x31, 0xc6, 0x4d,\n\t0x00, 0xdb, 0xa2, 0xf6, 0x50, 0xd5, 0xa9, 0x66, 0x4a, 0x85, 0x25, 0x59, 0xea, 0x32, 0xc8, 0x5c,\n\t0x96, 0x6c, 0x21, 0xd5, 0x4c, 0xfc, 0xf9, 0x94, 0x6a, 0x2b, 0x4b, 0x98, 0x72, 0x24, 0x36, 0xd9,\n\t0x1c, 0xdb, 0x8e, 0xa1, 0xe2, 0x52, 0xc6, 0x7b, 0xaa, 0x07, 0x33, 0x2b, 0xf2, 0x20, 0x6a, 0xaf,\n\t0x9d, 0x99, 0x12, 0x98, 0x89, 0x89, 0xad, 0xba, 0xf1, 0x21, 0xfe, 0x00, 0x22, 0x81, 0xca, 0x69,\n\t0x05, 0xfc, 0x14, 0x2a, 0x87, 0xc2, 0x0e, 0x19, 0xd3, 0xad, 0xbb, 0x50, 0x49, 0xa6, 0x07, 0x6f,\n\t0x42, 0xce, 0xf3, 0x89, 0xeb, 0x73, 0x16, 0xe6, 0x14, 0x31, 0xc0, 0x08, 0x32, 0xd4, 0xd2, 0xf9,\n\t0x29, 0x97, 0x53, 0xd8, 0xbf, 0x5b, 0x9f, 0xc1, 0x6a, 0xe2, 0xf3, 0xe7, 0x35, 0xac, 0xfe, 0x3e,\n\t0x0f, 0x9b, 0x8b, 0x38, 0xb7, 0x90, 0xfe, 0x17, 0x20, 0x6f, 0x4d, 0xc6, 0x27, 0xd4, 0x95, 0x32,\n\t0xdc, 0x43, 0x30, 0xc2, 0x75, 0xc8, 0x99, 0xe4, 0x84, 0x9a, 0x52, 0x76, 0x3b, 0xb5, 0x53, 0xd9,\n\t0xbb, 0x7e, 0x2e, 0x56, 0xd7, 0xda, 0xcc, 0x44, 0x11, 0x96, 0xf8, 0x3e, 0x64, 0x83, 0x23, 0x8e,\n\t0x79, 0xb8, 0x76, 0x3e, 0x0f, 0x8c, 0x8b, 0x0a, 0xb7, 0xc3, 0xef, 0x40, 0x91, 0xfd, 0x15, 0xb9,\n\t0xcd, 0xf3, 0x98, 0x0b, 0x4c, 0xc0, 0xf2, 0x8a, 0xb7, 0xa0, 0xc0, 0x69, 0xa6, 0xd3, 0xb0, 0x34,\n\t0x44, 0x63, 0xb6, 0x30, 0x3a, 0x1d, 0x92, 0x89, 0xe9, 0xab, 0xcf, 0x88, 0x39, 0xa1, 0x9c, 0x30,\n\t0x45, 0xa5, 0x1c, 0x08, 0x7f, 0xcd, 0x64, 0xf8, 0x32, 0x94, 0x04, 0x2b, 0x0d, 0x4b, 0xa7, 0x2f,\n\t0xf8, 0xe9, 0x93, 0x53, 0x04, 0x51, 0x5b, 0x4c, 0xc2, 0x3e, 0xff, 0xc4, 0xb3, 0xad, 0x70, 0x69,\n\t0xf9, 0x27, 0x98, 0x80, 0x7f, 0xfe, 0xb3, 0xd9, 0x83, 0xef, 0xbd, 0xc5, 0xd3, 0x9b, 0xe5, 0x62,\n\t0xf5, 0x2f, 0x69, 0xc8, 0xf2, 0xfd, 0xb6, 0x06, 0xa5, 0xc1, 0xe3, 0x9e, 0xac, 0x36, 0xbb, 0xc7,\n\t0x07, 0x6d, 0x19, 0xa5, 0x70, 0x05, 0x80, 0x0b, 0x1e, 0xb4, 0xbb, 0xf5, 0x01, 0x4a, 0x47, 0xe3,\n\t0x56, 0x67, 0x70, 0xe7, 0x16, 0xca, 0x44, 0x06, 0xc7, 0x42, 0x90, 0x8d, 0x03, 0x6e, 0xee, 0xa1,\n\t0x1c, 0x46, 0x50, 0x16, 0x0e, 0x5a, 0x8f, 0xe4, 0xe6, 0x9d, 0x5b, 0x28, 0x9f, 0x94, 0xdc, 0xdc,\n\t0x43, 0x2b, 0x78, 0x15, 0x8a, 0x5c, 0x72, 0xd0, 0xed, 0xb6, 0x51, 0x21, 0xf2, 0xd9, 0x1f, 0x28,\n\t0xad, 0xce, 0x21, 0x2a, 0x46, 0x3e, 0x0f, 0x95, 0xee, 0x71, 0x0f, 0x41, 0xe4, 0xe1, 0x48, 0xee,\n\t0xf7, 0xeb, 0x87, 0x32, 0x2a, 0x45, 0x88, 0x83, 0xc7, 0x03, 0xb9, 0x8f, 0xca, 0x89, 0xb0, 0x6e,\n\t0xee, 0xa1, 0xd5, 0xe8, 0x13, 0x72, 0xe7, 0xf8, 0x08, 0x55, 0xf0, 0x3a, 0xac, 0x8a, 0x4f, 0x84,\n\t0x41, 0xac, 0xcd, 0x88, 0xee, 0xdc, 0x42, 0x68, 0x1a, 0x88, 0xf0, 0xb2, 0x9e, 0x10, 0xdc, 0xb9,\n\t0x85, 0x70, 0xb5, 0x01, 0x39, 0xce, 0x2e, 0x8c, 0xa1, 0xd2, 0xae, 0x1f, 0xc8, 0x6d, 0xb5, 0xdb,\n\t0x1b, 0xb4, 0xba, 0x9d, 0x7a, 0x1b, 0xa5, 0xa6, 0x32, 0x45, 0xfe, 0xd5, 0x71, 0x4b, 0x91, 0x9b,\n\t0x28, 0x1d, 0x97, 0xf5, 0xe4, 0xfa, 0x40, 0x6e, 0xa2, 0x4c, 0x55, 0x83, 0xcd, 0x45, 0xe7, 0xcc,\n\t0xc2, 0x9d, 0x11, 0x5b, 0xe2, 0xf4, 0x92, 0x25, 0xe6, 0xbe, 0xe6, 0x96, 0xf8, 0xdb, 0x14, 0x6c,\n\t0x2c, 0x38, 0x6b, 0x17, 0x7e, 0xe4, 0x17, 0x90, 0x13, 0x14, 0x15, 0xd5, 0xe7, 0x93, 0x85, 0x87,\n\t0x36, 0x27, 0xec, 0x5c, 0x05, 0xe2, 0x76, 0xf1, 0x0a, 0x9c, 0x59, 0x52, 0x81, 0x99, 0x8b, 0xb9,\n\t0x20, 0x7f, 0x93, 0x02, 0x69, 0x99, 0xef, 0xd7, 0x1c, 0x14, 0xe9, 0xc4, 0x41, 0x71, 0x6f, 0x36,\n\t0x80, 0x2b, 0xcb, 0xe7, 0x30, 0x17, 0xc5, 0x77, 0x29, 0xb8, 0xb0, 0xb8, 0x51, 0x59, 0x18, 0xc3,\n\t0x7d, 0xc8, 0x8f, 0xa9, 0x7f, 0x6a, 0x87, 0xc5, 0xfa, 0xe3, 0x05, 0x25, 0x80, 0xa9, 0x67, 0x73,\n\t0x15, 0x58, 0xc5, 0x6b, 0x48, 0x66, 0x59, 0xb7, 0x21, 0xa2, 0x99, 0x8b, 0xf4, 0xb7, 0x69, 0x78,\n\t0x7b, 0xa1, 0xf3, 0x85, 0x81, 0xbe, 0x07, 0x60, 0x58, 0xce, 0xc4, 0x17, 0x05, 0x59, 0x9c, 0x4f,\n\t0x45, 0x2e, 0xe1, 0x7b, 0x9f, 0x9d, 0x3d, 0x13, 0x3f, 0xd2, 0x67, 0xb8, 0x1e, 0x84, 0x88, 0x03,\n\t0xee, 0x4e, 0x03, 0xcd, 0xf2, 0x40, 0xdf, 0x5f, 0x32, 0xd3, 0xb9, 0x5a, 0xf7, 0x29, 0x20, 0xcd,\n\t0x34, 0xa8, 0xe5, 0xab, 0x9e, 0xef, 0x52, 0x32, 0x36, 0xac, 0x11, 0x3f, 0x80, 0x0b, 0xfb, 0xb9,\n\t0x21, 0x31, 0x3d, 0xaa, 0xac, 0x09, 0x75, 0x3f, 0xd4, 0x32, 0x0b, 0x5e, 0x65, 0xdc, 0x98, 0x45,\n\t0x3e, 0x61, 0x21, 0xd4, 0x91, 0x45, 0xf5, 0xef, 0x2b, 0x50, 0x8a, 0xb5, 0x75, 0xf8, 0x0a, 0x94,\n\t0x9f, 0x90, 0x67, 0x44, 0x0d, 0x5b, 0x75, 0x91, 0x89, 0x12, 0x93, 0xf5, 0x82, 0x76, 0xfd, 0x53,\n\t0xd8, 0xe4, 0x10, 0x7b, 0xe2, 0x53, 0x57, 0xd5, 0x4c, 0xe2, 0x79, 0x3c, 0x69, 0x05, 0x0e, 0xc5,\n\t0x4c, 0xd7, 0x65, 0xaa, 0x46, 0xa8, 0xc1, 0xb7, 0x61, 0x83, 0x5b, 0x8c, 0x27, 0xa6, 0x6f, 0x38,\n\t0x26, 0x55, 0xd9, 0xe5, 0xc1, 0xe3, 0x07, 0x71, 0x14, 0xd9, 0x3a, 0x43, 0x1c, 0x05, 0x00, 0x16,\n\t0x91, 0x87, 0x9b, 0xf0, 0x1e, 0x37, 0x1b, 0x51, 0x8b, 0xba, 0xc4, 0xa7, 0x2a, 0xfd, 0x7a, 0x42,\n\t0x4c, 0x4f, 0x25, 0x96, 0xae, 0x9e, 0x12, 0xef, 0x54, 0xda, 0x64, 0x0e, 0x0e, 0xd2, 0x52, 0x4a,\n\t0xb9, 0xc4, 0x80, 0x87, 0x01, 0x4e, 0xe6, 0xb0, 0xba, 0xa5, 0x7f, 0x41, 0xbc, 0x53, 0xbc, 0x0f,\n\t0x17, 0xb8, 0x17, 0xcf, 0x77, 0x0d, 0x6b, 0xa4, 0x6a, 0xa7, 0x54, 0x7b, 0xaa, 0x4e, 0xfc, 0xe1,\n\t0x5d, 0xe9, 0x9d, 0xf8, 0xf7, 0x79, 0x84, 0x7d, 0x8e, 0x69, 0x30, 0xc8, 0xb1, 0x3f, 0xbc, 0x8b,\n\t0xfb, 0x50, 0x66, 0x8b, 0x31, 0x36, 0xbe, 0xa1, 0xea, 0xd0, 0x76, 0x79, 0x65, 0xa9, 0x2c, 0xd8,\n\t0xd9, 0xb1, 0x0c, 0xd6, 0xba, 0x81, 0xc1, 0x91, 0xad, 0xd3, 0xfd, 0x5c, 0xbf, 0x27, 0xcb, 0x4d,\n\t0xa5, 0x14, 0x7a, 0x79, 0x60, 0xbb, 0x8c, 0x50, 0x23, 0x3b, 0x4a, 0x70, 0x49, 0x10, 0x6a, 0x64,\n\t0x87, 0xe9, 0xbd, 0x0d, 0x1b, 0x9a, 0x26, 0xe6, 0x6c, 0x68, 0x6a, 0xd0, 0xe2, 0x7b, 0x12, 0x4a,\n\t0x24, 0x4b, 0xd3, 0x0e, 0x05, 0x20, 0xe0, 0xb8, 0x87, 0x3f, 0x87, 0xb7, 0xa7, 0xc9, 0x8a, 0x1b,\n\t0xae, 0xcf, 0xcd, 0x72, 0xd6, 0xf4, 0x36, 0x6c, 0x38, 0x67, 0xf3, 0x86, 0x38, 0xf1, 0x45, 0xe7,\n\t0x6c, 0xd6, 0xec, 0x23, 0x7e, 0x6d, 0x73, 0xa9, 0x46, 0x7c, 0xaa, 0x4b, 0x17, 0xe3, 0xe8, 0x98,\n\t0x02, 0xef, 0x02, 0xd2, 0x34, 0x95, 0x5a, 0xe4, 0xc4, 0xa4, 0x2a, 0x71, 0xa9, 0x45, 0x3c, 0xe9,\n\t0x72, 0x1c, 0x5c, 0xd1, 0x34, 0x99, 0x6b, 0xeb, 0x5c, 0x89, 0xaf, 0xc1, 0xba, 0x7d, 0xf2, 0x44,\n\t0x13, 0xcc, 0x52, 0x1d, 0x97, 0x0e, 0x8d, 0x17, 0xd2, 0x87, 0x3c, 0x4d, 0x6b, 0x4c, 0xc1, 0x79,\n\t0xd5, 0xe3, 0x62, 0xfc, 0x09, 0x20, 0xcd, 0x3b, 0x25, 0xae, 0xc3, 0x4b, 0xbb, 0xe7, 0x10, 0x8d,\n\t0x4a, 0x1f, 0x09, 0xa8, 0x90, 0x77, 0x42, 0x31, 0x63, 0xb6, 0xf7, 0xdc, 0x18, 0xfa, 0xa1, 0xc7,\n\t0xab, 0x82, 0xd9, 0x5c, 0x16, 0x78, 0xdb, 0x01, 0xe4, 0x9c, 0x3a, 0xc9, 0x0f, 0xef, 0x70, 0x58,\n\t0xc5, 0x39, 0x75, 0xe2, 0xdf, 0x7d, 0x04, 0x9b, 0x13, 0xcb, 0xb0, 0x7c, 0xea, 0x3a, 0x2e, 0x65,\n\t0xed, 0xbe, 0xd8, 0xb3, 0xd2, 0xbf, 0x57, 0x96, 0x34, 0xec, 0xc7, 0x71, 0xb4, 0xa0, 0x8a, 0xb2,\n\t0x31, 0x99, 0x17, 0x56, 0xf7, 0xa1, 0x1c, 0x67, 0x10, 0x2e, 0x82, 0xe0, 0x10, 0x4a, 0xb1, 0x6a,\n\t0xdc, 0xe8, 0x36, 0x59, 0x1d, 0xfd, 0x4a, 0x46, 0x69, 0x56, 0xcf, 0xdb, 0xad, 0x81, 0xac, 0x2a,\n\t0xc7, 0x9d, 0x41, 0xeb, 0x48, 0x46, 0x99, 0x6b, 0xc5, 0xc2, 0x7f, 0x56, 0xd0, 0xcb, 0x97, 0x2f,\n\t0x5f, 0xa6, 0x1f, 0x66, 0x0b, 0x1f, 0xa3, 0xab, 0xd5, 0xef, 0xd3, 0x50, 0x49, 0x76, 0xd2, 0xf8,\n\t0xe7, 0x70, 0x31, 0xbc, 0xf6, 0x7a, 0xd4, 0x57, 0x9f, 0x1b, 0x2e, 0xa7, 0xf6, 0x98, 0x88, 0x5e,\n\t0x34, 0x5a, 0x95, 0xcd, 0x00, 0xd5, 0xa7, 0xfe, 0x97, 0x86, 0xcb, 0x88, 0x3b, 0x26, 0x3e, 0x6e,\n\t0xc3, 0x65, 0xcb, 0x56, 0x3d, 0x9f, 0x58, 0x3a, 0x71, 0x75, 0x75, 0xfa, 0xe0, 0xa0, 0x12, 0x4d,\n\t0xa3, 0x9e, 0x67, 0x8b, 0x92, 0x12, 0x79, 0x79, 0xd7, 0xb2, 0xfb, 0x01, 0x78, 0x7a, 0xd6, 0xd6,\n\t0x03, 0xe8, 0x0c, 0x83, 0x32, 0xcb, 0x18, 0xf4, 0x0e, 0x14, 0xc7, 0xc4, 0x51, 0xa9, 0xe5, 0xbb,\n\t0x67, 0xbc, 0xff, 0x2b, 0x28, 0x85, 0x31, 0x71, 0x64, 0x36, 0x7e, 0x73, 0x2b, 0x91, 0xcc, 0x66,\n\t0x01, 0x15, 0x1f, 0x66, 0x0b, 0x45, 0x04, 0xd5, 0x7f, 0x66, 0xa0, 0x1c, 0xef, 0x07, 0x59, 0x7b,\n\t0xad, 0xf1, 0xb3, 0x3f, 0xc5, 0x4f, 0x87, 0x0f, 0x5e, 0xd9, 0x3d, 0xd6, 0x1a, 0xac, 0x28, 0xec,\n\t0xe7, 0x45, 0x97, 0xa6, 0x08, 0x4b, 0x56, 0x90, 0xd9, 0x79, 0x40, 0x45, 0xef, 0x5f, 0x50, 0x82,\n\t0x11, 0x3e, 0x84, 0xfc, 0x13, 0x8f, 0xfb, 0xce, 0x73, 0xdf, 0x1f, 0xbe, 0xda, 0xf7, 0xc3, 0x3e,\n\t0x77, 0x5e, 0x7c, 0xd8, 0x57, 0x3b, 0x5d, 0xe5, 0xa8, 0xde, 0x56, 0x02, 0x73, 0x7c, 0x09, 0xb2,\n\t0x26, 0xf9, 0xe6, 0x2c, 0x59, 0x3e, 0xb8, 0xe8, 0xbc, 0x8b, 0x70, 0x09, 0xb2, 0xcf, 0x29, 0x79,\n\t0x9a, 0x3c, 0xb4, 0xb9, 0xe8, 0x0d, 0x6e, 0x86, 0x5d, 0xc8, 0xf1, 0x7c, 0x61, 0x80, 0x20, 0x63,\n\t0xe8, 0x2d, 0x5c, 0x80, 0x6c, 0xa3, 0xab, 0xb0, 0x0d, 0x81, 0xa0, 0x2c, 0xa4, 0x6a, 0xaf, 0x25,\n\t0x37, 0x64, 0x94, 0xae, 0xde, 0x86, 0xbc, 0x48, 0x02, 0xdb, 0x2c, 0x51, 0x1a, 0xd0, 0x5b, 0xc1,\n\t0x30, 0xf0, 0x91, 0x0a, 0xb5, 0xc7, 0x47, 0x07, 0xb2, 0x82, 0xd2, 0xc9, 0xa5, 0xce, 0xa2, 0x5c,\n\t0xd5, 0x83, 0x72, 0xbc, 0x21, 0xfc, 0x51, 0x58, 0x56, 0xfd, 0x6b, 0x0a, 0x4a, 0xb1, 0x06, 0x8f,\n\t0xb5, 0x16, 0xc4, 0x34, 0xed, 0xe7, 0x2a, 0x31, 0x0d, 0xe2, 0x05, 0xd4, 0x00, 0x2e, 0xaa, 0x33,\n\t0xc9, 0x79, 0x97, 0xee, 0x47, 0xda, 0x22, 0x39, 0x94, 0xaf, 0xfe, 0x29, 0x05, 0x68, 0xb6, 0x45,\n\t0x9c, 0x09, 0x33, 0xf5, 0x53, 0x86, 0x59, 0xfd, 0x63, 0x0a, 0x2a, 0xc9, 0xbe, 0x70, 0x26, 0xbc,\n\t0x2b, 0x3f, 0x69, 0x78, 0xff, 0x48, 0xc3, 0x6a, 0xa2, 0x1b, 0x3c, 0x6f, 0x74, 0x5f, 0xc3, 0xba,\n\t0xa1, 0xd3, 0xb1, 0x63, 0xfb, 0xd4, 0xd2, 0xce, 0x54, 0x93, 0x3e, 0xa3, 0xa6, 0x54, 0xe5, 0x87,\n\t0xc6, 0xee, 0xab, 0xfb, 0xcd, 0x5a, 0x6b, 0x6a, 0xd7, 0x66, 0x66, 0xfb, 0x1b, 0xad, 0xa6, 0x7c,\n\t0xd4, 0xeb, 0x0e, 0xe4, 0x4e, 0xe3, 0xb1, 0x7a, 0xdc, 0xf9, 0x65, 0xa7, 0xfb, 0x65, 0x47, 0x41,\n\t0xc6, 0x0c, 0xec, 0x0d, 0x6e, 0xfb, 0x1e, 0xa0, 0xd9, 0xa0, 0xf0, 0x45, 0x58, 0x14, 0x16, 0x7a,\n\t0x0b, 0x6f, 0xc0, 0x5a, 0xa7, 0xab, 0xf6, 0x5b, 0x4d, 0x59, 0x95, 0x1f, 0x3c, 0x90, 0x1b, 0x83,\n\t0xbe, 0xb8, 0x80, 0x47, 0xe8, 0x41, 0x62, 0x83, 0x57, 0xff, 0x90, 0x81, 0x8d, 0x05, 0x91, 0xe0,\n\t0x7a, 0xd0, 0xfb, 0x8b, 0xeb, 0xc8, 0x8d, 0xf3, 0x44, 0x5f, 0x63, 0xdd, 0x45, 0x8f, 0xb8, 0x7e,\n\t0x70, 0x55, 0xf8, 0x04, 0x58, 0x96, 0x2c, 0xdf, 0x18, 0x1a, 0xd4, 0x0d, 0xde, 0x2b, 0xc4, 0x85,\n\t0x60, 0x6d, 0x2a, 0x17, 0x4f, 0x16, 0x3f, 0x03, 0xec, 0xd8, 0x9e, 0xe1, 0x1b, 0xcf, 0xa8, 0x6a,\n\t0x58, 0xe1, 0xe3, 0x06, 0xbb, 0x20, 0x64, 0x15, 0x14, 0x6a, 0x5a, 0x96, 0x1f, 0xa1, 0x2d, 0x3a,\n\t0x22, 0x33, 0x68, 0x76, 0x98, 0x67, 0x14, 0x14, 0x6a, 0x22, 0xf4, 0x15, 0x28, 0xeb, 0xf6, 0x84,\n\t0xb5, 0x5b, 0x02, 0xc7, 0x6a, 0x47, 0x4a, 0x29, 0x09, 0x59, 0x04, 0x09, 0xfa, 0xe1, 0xe9, 0xab,\n\t0x4a, 0x59, 0x29, 0x09, 0x99, 0x80, 0x5c, 0x85, 0x35, 0x32, 0x1a, 0xb9, 0xcc, 0x79, 0xe8, 0x48,\n\t0x74, 0xf8, 0x95, 0x48, 0xcc, 0x81, 0x5b, 0x0f, 0xa1, 0x10, 0xe6, 0x81, 0x95, 0x6a, 0x96, 0x09,\n\t0xd5, 0x11, 0x6f, 0x5b, 0xe9, 0x9d, 0xa2, 0x52, 0xb0, 0x42, 0xe5, 0x15, 0x28, 0x1b, 0x9e, 0x3a,\n\t0x7d, 0x64, 0x4d, 0x6f, 0xa7, 0x77, 0x0a, 0x4a, 0xc9, 0xf0, 0xa2, 0x57, 0xb5, 0xea, 0x77, 0x69,\n\t0xa8, 0x24, 0x1f, 0x89, 0x71, 0x13, 0x0a, 0xa6, 0xad, 0x11, 0x4e, 0x2d, 0xf1, 0x0b, 0xc5, 0xce,\n\t0x6b, 0xde, 0x95, 0x6b, 0xed, 0x00, 0xaf, 0x44, 0x96, 0x5b, 0x7f, 0x4b, 0x41, 0x21, 0x14, 0xe3,\n\t0x0b, 0x90, 0x75, 0x88, 0x7f, 0xca, 0xdd, 0xe5, 0x0e, 0xd2, 0x28, 0xa5, 0xf0, 0x31, 0x93, 0x7b,\n\t0x0e, 0xb1, 0x38, 0x05, 0x02, 0x39, 0x1b, 0xb3, 0x75, 0x35, 0x29, 0xd1, 0xf9, 0xf5, 0xc1, 0x1e,\n\t0x8f, 0xa9, 0xe5, 0x7b, 0xe1, 0xba, 0x06, 0xf2, 0x46, 0x20, 0xc6, 0xd7, 0x61, 0xdd, 0x77, 0x89,\n\t0x61, 0x26, 0xb0, 0x59, 0x8e, 0x45, 0xa1, 0x22, 0x02, 0xef, 0xc3, 0xa5, 0xd0, 0xaf, 0x4e, 0x7d,\n\t0xa2, 0x9d, 0x52, 0x7d, 0x6a, 0x94, 0xe7, 0x2f, 0x90, 0x17, 0x03, 0x40, 0x33, 0xd0, 0x87, 0xb6,\n\t0xd5, 0xef, 0x53, 0xb0, 0x1e, 0x5e, 0x78, 0xf4, 0x28, 0x59, 0x47, 0x00, 0xc4, 0xb2, 0x6c, 0x3f,\n\t0x9e, 0xae, 0x79, 0x2a, 0xcf, 0xd9, 0xd5, 0xea, 0x91, 0x91, 0x12, 0x73, 0xb0, 0x35, 0x06, 0x98,\n\t0x6a, 0x96, 0xa6, 0xed, 0x32, 0x94, 0x82, 0x5f, 0x00, 0xf8, 0xcf, 0x48, 0xe2, 0x8a, 0x0c, 0x42,\n\t0xc4, 0x6e, 0x46, 0x78, 0x13, 0x72, 0x27, 0x74, 0x64, 0x58, 0xc1, 0xbb, 0xa4, 0x18, 0x84, 0xaf,\n\t0x9d, 0xd9, 0xe8, 0xb5, 0xf3, 0xe0, 0x77, 0x29, 0xd8, 0xd0, 0xec, 0xf1, 0x6c, 0xbc, 0x07, 0x68,\n\t0xe6, 0x9e, 0xee, 0x7d, 0x91, 0xfa, 0xea, 0xfe, 0xc8, 0xf0, 0x4f, 0x27, 0x27, 0x35, 0xcd, 0x1e,\n\t0xef, 0x8e, 0x6c, 0x93, 0x58, 0xa3, 0xe9, 0xef, 0x60, 0xfc, 0x1f, 0xed, 0xc6, 0x88, 0x5a, 0x37,\n\t0x46, 0x76, 0xec, 0x57, 0xb1, 0x7b, 0xd3, 0x7f, 0xbf, 0x4d, 0x67, 0x0e, 0x7b, 0x07, 0x7f, 0x4e,\n\t0x6f, 0x1d, 0x8a, 0x6f, 0xf5, 0xc2, 0xdc, 0x28, 0x74, 0x68, 0x52, 0x8d, 0xcd, 0xf7, 0x7f, 0x01,\n\t0x00, 0x00, 0xff, 0xff, 0x8e, 0x54, 0xe7, 0xef, 0x60, 0x1b, 0x00, 0x00,\n}\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/AUTHORS",
    "content": "# This is the official list of Snappy-Go authors for copyright purposes.\n# This file is distinct from the CONTRIBUTORS files.\n# See the latter for an explanation.\n\n# Names should be added to this file as\n#\tName or Organization <email address>\n# The email address is not required for organizations.\n\n# Please keep the list sorted.\n\nDamian Gryski <dgryski@gmail.com>\nGoogle Inc.\nJan Mercl <0xjnml@gmail.com>\nRodolfo Carvalho <rhcarvalho@gmail.com>\nSebastien Binet <seb.binet@gmail.com>\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/CONTRIBUTORS",
    "content": "# This is the official list of people who can contribute\n# (and typically have contributed) code to the Snappy-Go repository.\n# The AUTHORS file lists the copyright holders; this file\n# lists people.  For example, Google employees are listed here\n# but not in AUTHORS, because Google holds the copyright.\n#\n# The submission process automatically checks to make sure\n# that people submitting code are listed in this file (by email address).\n#\n# Names should be added to this file only after verifying that\n# the individual or the individual's organization has agreed to\n# the appropriate Contributor License Agreement, found here:\n#\n#     http://code.google.com/legal/individual-cla-v1.0.html\n#     http://code.google.com/legal/corporate-cla-v1.0.html\n#\n# The agreement for individuals can be filled out on the web.\n#\n# When adding J Random Contributor's name to this file,\n# either J's name or J's organization's name should be\n# added to the AUTHORS file, depending on whether the\n# individual or corporate CLA was used.\n\n# Names should be added to this file like so:\n#     Name <email address>\n\n# Please keep the list sorted.\n\nDamian Gryski <dgryski@gmail.com>\nJan Mercl <0xjnml@gmail.com>\nKai Backman <kaib@golang.org>\nMarc-Antoine Ruel <maruel@chromium.org>\nNigel Tao <nigeltao@golang.org>\nRob Pike <r@golang.org>\nRodolfo Carvalho <rhcarvalho@gmail.com>\nRuss Cox <rsc@golang.org>\nSebastien Binet <seb.binet@gmail.com>\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/LICENSE",
    "content": "Copyright (c) 2011 The Snappy-Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/README",
    "content": "The Snappy compression format in the Go programming language.\n\nTo download and install from source:\n$ go get github.com/golang/snappy\n\nUnless otherwise noted, the Snappy-Go source files are distributed\nunder the BSD-style license found in the LICENSE file.\n\n\n\nBenchmarks.\n\nThe golang/snappy benchmarks include compressing (Z) and decompressing (U) ten\nor so files, the same set used by the C++ Snappy code (github.com/google/snappy\nand note the \"google\", not \"golang\"). On an \"Intel(R) Core(TM) i7-3770 CPU @\n3.40GHz\", Go's GOARCH=amd64 numbers as of 2016-05-29:\n\n\"go test -test.bench=.\"\n\n_UFlat0-8         2.19GB/s ± 0%  html\n_UFlat1-8         1.41GB/s ± 0%  urls\n_UFlat2-8         23.5GB/s ± 2%  jpg\n_UFlat3-8         1.91GB/s ± 0%  jpg_200\n_UFlat4-8         14.0GB/s ± 1%  pdf\n_UFlat5-8         1.97GB/s ± 0%  html4\n_UFlat6-8          814MB/s ± 0%  txt1\n_UFlat7-8          785MB/s ± 0%  txt2\n_UFlat8-8          857MB/s ± 0%  txt3\n_UFlat9-8          719MB/s ± 1%  txt4\n_UFlat10-8        2.84GB/s ± 0%  pb\n_UFlat11-8        1.05GB/s ± 0%  gaviota\n\n_ZFlat0-8         1.04GB/s ± 0%  html\n_ZFlat1-8          534MB/s ± 0%  urls\n_ZFlat2-8         15.7GB/s ± 1%  jpg\n_ZFlat3-8          740MB/s ± 3%  jpg_200\n_ZFlat4-8         9.20GB/s ± 1%  pdf\n_ZFlat5-8          991MB/s ± 0%  html4\n_ZFlat6-8          379MB/s ± 0%  txt1\n_ZFlat7-8          352MB/s ± 0%  txt2\n_ZFlat8-8          396MB/s ± 1%  txt3\n_ZFlat9-8          327MB/s ± 1%  txt4\n_ZFlat10-8        1.33GB/s ± 1%  pb\n_ZFlat11-8         605MB/s ± 1%  gaviota\n\n\n\n\"go test -test.bench=. -tags=noasm\"\n\n_UFlat0-8          621MB/s ± 2%  html\n_UFlat1-8          494MB/s ± 1%  urls\n_UFlat2-8         23.2GB/s ± 1%  jpg\n_UFlat3-8         1.12GB/s ± 1%  jpg_200\n_UFlat4-8         4.35GB/s ± 1%  pdf\n_UFlat5-8          609MB/s ± 0%  html4\n_UFlat6-8          296MB/s ± 0%  txt1\n_UFlat7-8          288MB/s ± 0%  txt2\n_UFlat8-8          309MB/s ± 1%  txt3\n_UFlat9-8          280MB/s ± 1%  txt4\n_UFlat10-8         753MB/s ± 0%  pb\n_UFlat11-8         400MB/s ± 0%  gaviota\n\n_ZFlat0-8          409MB/s ± 1%  html\n_ZFlat1-8          250MB/s ± 1%  urls\n_ZFlat2-8         12.3GB/s ± 1%  jpg\n_ZFlat3-8          132MB/s ± 0%  jpg_200\n_ZFlat4-8         2.92GB/s ± 0%  pdf\n_ZFlat5-8          405MB/s ± 1%  html4\n_ZFlat6-8          179MB/s ± 1%  txt1\n_ZFlat7-8          170MB/s ± 1%  txt2\n_ZFlat8-8          189MB/s ± 1%  txt3\n_ZFlat9-8          164MB/s ± 1%  txt4\n_ZFlat10-8         479MB/s ± 1%  pb\n_ZFlat11-8         270MB/s ± 1%  gaviota\n\n\n\nFor comparison (Go's encoded output is byte-for-byte identical to C++'s), here\nare the numbers from C++ Snappy's\n\nmake CXXFLAGS=\"-O2 -DNDEBUG -g\" clean snappy_unittest.log && cat snappy_unittest.log\n\nBM_UFlat/0     2.4GB/s  html\nBM_UFlat/1     1.4GB/s  urls\nBM_UFlat/2    21.8GB/s  jpg\nBM_UFlat/3     1.5GB/s  jpg_200\nBM_UFlat/4    13.3GB/s  pdf\nBM_UFlat/5     2.1GB/s  html4\nBM_UFlat/6     1.0GB/s  txt1\nBM_UFlat/7   959.4MB/s  txt2\nBM_UFlat/8     1.0GB/s  txt3\nBM_UFlat/9   864.5MB/s  txt4\nBM_UFlat/10    2.9GB/s  pb\nBM_UFlat/11    1.2GB/s  gaviota\n\nBM_ZFlat/0   944.3MB/s  html (22.31 %)\nBM_ZFlat/1   501.6MB/s  urls (47.78 %)\nBM_ZFlat/2    14.3GB/s  jpg (99.95 %)\nBM_ZFlat/3   538.3MB/s  jpg_200 (73.00 %)\nBM_ZFlat/4     8.3GB/s  pdf (83.30 %)\nBM_ZFlat/5   903.5MB/s  html4 (22.52 %)\nBM_ZFlat/6   336.0MB/s  txt1 (57.88 %)\nBM_ZFlat/7   312.3MB/s  txt2 (61.91 %)\nBM_ZFlat/8   353.1MB/s  txt3 (54.99 %)\nBM_ZFlat/9   289.9MB/s  txt4 (66.26 %)\nBM_ZFlat/10    1.2GB/s  pb (19.68 %)\nBM_ZFlat/11  527.4MB/s  gaviota (37.72 %)\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/decode.go",
    "content": "// Copyright 2011 The Snappy-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage snappy\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n)\n\nvar (\n\t// ErrCorrupt reports that the input is invalid.\n\tErrCorrupt = errors.New(\"snappy: corrupt input\")\n\t// ErrTooLarge reports that the uncompressed length is too large.\n\tErrTooLarge = errors.New(\"snappy: decoded block is too large\")\n\t// ErrUnsupported reports that the input isn't supported.\n\tErrUnsupported = errors.New(\"snappy: unsupported input\")\n\n\terrUnsupportedLiteralLength = errors.New(\"snappy: unsupported literal length\")\n)\n\n// DecodedLen returns the length of the decoded block.\nfunc DecodedLen(src []byte) (int, error) {\n\tv, _, err := decodedLen(src)\n\treturn v, err\n}\n\n// decodedLen returns the length of the decoded block and the number of bytes\n// that the length header occupied.\nfunc decodedLen(src []byte) (blockLen, headerLen int, err error) {\n\tv, n := binary.Uvarint(src)\n\tif n <= 0 || v > 0xffffffff {\n\t\treturn 0, 0, ErrCorrupt\n\t}\n\n\tconst wordSize = 32 << (^uint(0) >> 32 & 1)\n\tif wordSize == 32 && v > 0x7fffffff {\n\t\treturn 0, 0, ErrTooLarge\n\t}\n\treturn int(v), n, nil\n}\n\nconst (\n\tdecodeErrCodeCorrupt                  = 1\n\tdecodeErrCodeUnsupportedLiteralLength = 2\n)\n\n// Decode returns the decoded form of src. The returned slice may be a sub-\n// slice of dst if dst was large enough to hold the entire decoded block.\n// Otherwise, a newly allocated slice will be returned.\n//\n// The dst and src must not overlap. It is valid to pass a nil dst.\nfunc Decode(dst, src []byte) ([]byte, error) {\n\tdLen, s, err := decodedLen(src)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif dLen <= len(dst) {\n\t\tdst = dst[:dLen]\n\t} else {\n\t\tdst = make([]byte, dLen)\n\t}\n\tswitch decode(dst, src[s:]) {\n\tcase 0:\n\t\treturn dst, nil\n\tcase decodeErrCodeUnsupportedLiteralLength:\n\t\treturn nil, errUnsupportedLiteralLength\n\t}\n\treturn nil, ErrCorrupt\n}\n\n// NewReader returns a new Reader that decompresses from r, using the framing\n// format described at\n// https://github.com/google/snappy/blob/master/framing_format.txt\nfunc NewReader(r io.Reader) *Reader {\n\treturn &Reader{\n\t\tr:       r,\n\t\tdecoded: make([]byte, maxBlockSize),\n\t\tbuf:     make([]byte, maxEncodedLenOfMaxBlockSize+checksumSize),\n\t}\n}\n\n// Reader is an io.Reader that can read Snappy-compressed bytes.\ntype Reader struct {\n\tr       io.Reader\n\terr     error\n\tdecoded []byte\n\tbuf     []byte\n\t// decoded[i:j] contains decoded bytes that have not yet been passed on.\n\ti, j       int\n\treadHeader bool\n}\n\n// Reset discards any buffered data, resets all state, and switches the Snappy\n// reader to read from r. This permits reusing a Reader rather than allocating\n// a new one.\nfunc (r *Reader) Reset(reader io.Reader) {\n\tr.r = reader\n\tr.err = nil\n\tr.i = 0\n\tr.j = 0\n\tr.readHeader = false\n}\n\nfunc (r *Reader) readFull(p []byte, allowEOF bool) (ok bool) {\n\tif _, r.err = io.ReadFull(r.r, p); r.err != nil {\n\t\tif r.err == io.ErrUnexpectedEOF || (r.err == io.EOF && !allowEOF) {\n\t\t\tr.err = ErrCorrupt\n\t\t}\n\t\treturn false\n\t}\n\treturn true\n}\n\n// Read satisfies the io.Reader interface.\nfunc (r *Reader) Read(p []byte) (int, error) {\n\tif r.err != nil {\n\t\treturn 0, r.err\n\t}\n\tfor {\n\t\tif r.i < r.j {\n\t\t\tn := copy(p, r.decoded[r.i:r.j])\n\t\t\tr.i += n\n\t\t\treturn n, nil\n\t\t}\n\t\tif !r.readFull(r.buf[:4], true) {\n\t\t\treturn 0, r.err\n\t\t}\n\t\tchunkType := r.buf[0]\n\t\tif !r.readHeader {\n\t\t\tif chunkType != chunkTypeStreamIdentifier {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tr.readHeader = true\n\t\t}\n\t\tchunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16\n\t\tif chunkLen > len(r.buf) {\n\t\t\tr.err = ErrUnsupported\n\t\t\treturn 0, r.err\n\t\t}\n\n\t\t// The chunk types are specified at\n\t\t// https://github.com/google/snappy/blob/master/framing_format.txt\n\t\tswitch chunkType {\n\t\tcase chunkTypeCompressedData:\n\t\t\t// Section 4.2. Compressed data (chunk type 0x00).\n\t\t\tif chunkLen < checksumSize {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tbuf := r.buf[:chunkLen]\n\t\t\tif !r.readFull(buf, false) {\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tchecksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24\n\t\t\tbuf = buf[checksumSize:]\n\n\t\t\tn, err := DecodedLen(buf)\n\t\t\tif err != nil {\n\t\t\t\tr.err = err\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tif n > len(r.decoded) {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tif _, err := Decode(r.decoded, buf); err != nil {\n\t\t\t\tr.err = err\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tif crc(r.decoded[:n]) != checksum {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tr.i, r.j = 0, n\n\t\t\tcontinue\n\n\t\tcase chunkTypeUncompressedData:\n\t\t\t// Section 4.3. Uncompressed data (chunk type 0x01).\n\t\t\tif chunkLen < checksumSize {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tbuf := r.buf[:checksumSize]\n\t\t\tif !r.readFull(buf, false) {\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tchecksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24\n\t\t\t// Read directly into r.decoded instead of via r.buf.\n\t\t\tn := chunkLen - checksumSize\n\t\t\tif n > len(r.decoded) {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tif !r.readFull(r.decoded[:n], false) {\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tif crc(r.decoded[:n]) != checksum {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tr.i, r.j = 0, n\n\t\t\tcontinue\n\n\t\tcase chunkTypeStreamIdentifier:\n\t\t\t// Section 4.1. Stream identifier (chunk type 0xff).\n\t\t\tif chunkLen != len(magicBody) {\n\t\t\t\tr.err = ErrCorrupt\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tif !r.readFull(r.buf[:len(magicBody)], false) {\n\t\t\t\treturn 0, r.err\n\t\t\t}\n\t\t\tfor i := 0; i < len(magicBody); i++ {\n\t\t\t\tif r.buf[i] != magicBody[i] {\n\t\t\t\t\tr.err = ErrCorrupt\n\t\t\t\t\treturn 0, r.err\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif chunkType <= 0x7f {\n\t\t\t// Section 4.5. Reserved unskippable chunks (chunk types 0x02-0x7f).\n\t\t\tr.err = ErrUnsupported\n\t\t\treturn 0, r.err\n\t\t}\n\t\t// Section 4.4 Padding (chunk type 0xfe).\n\t\t// Section 4.6. Reserved skippable chunks (chunk types 0x80-0xfd).\n\t\tif !r.readFull(r.buf[:chunkLen], false) {\n\t\t\treturn 0, r.err\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/decode_amd64.go",
    "content": "// Copyright 2016 The Snappy-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !appengine\n// +build gc\n// +build !noasm\n\npackage snappy\n\n// decode has the same semantics as in decode_other.go.\n//\n//go:noescape\nfunc decode(dst, src []byte) int\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/decode_amd64.s",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !appengine\n// +build gc\n// +build !noasm\n\n#include \"textflag.h\"\n\n// The asm code generally follows the pure Go code in decode_other.go, except\n// where marked with a \"!!!\".\n\n// func decode(dst, src []byte) int\n//\n// All local variables fit into registers. The non-zero stack size is only to\n// spill registers and push args when issuing a CALL. The register allocation:\n//\t- AX\tscratch\n//\t- BX\tscratch\n//\t- CX\tlength or x\n//\t- DX\toffset\n//\t- SI\t&src[s]\n//\t- DI\t&dst[d]\n//\t+ R8\tdst_base\n//\t+ R9\tdst_len\n//\t+ R10\tdst_base + dst_len\n//\t+ R11\tsrc_base\n//\t+ R12\tsrc_len\n//\t+ R13\tsrc_base + src_len\n//\t- R14\tused by doCopy\n//\t- R15\tused by doCopy\n//\n// The registers R8-R13 (marked with a \"+\") are set at the start of the\n// function, and after a CALL returns, and are not otherwise modified.\n//\n// The d variable is implicitly DI - R8,  and len(dst)-d is R10 - DI.\n// The s variable is implicitly SI - R11, and len(src)-s is R13 - SI.\nTEXT ·decode(SB), NOSPLIT, $48-56\n\t// Initialize SI, DI and R8-R13.\n\tMOVQ dst_base+0(FP), R8\n\tMOVQ dst_len+8(FP), R9\n\tMOVQ R8, DI\n\tMOVQ R8, R10\n\tADDQ R9, R10\n\tMOVQ src_base+24(FP), R11\n\tMOVQ src_len+32(FP), R12\n\tMOVQ R11, SI\n\tMOVQ R11, R13\n\tADDQ R12, R13\n\nloop:\n\t// for s < len(src)\n\tCMPQ SI, R13\n\tJEQ  end\n\n\t// CX = uint32(src[s])\n\t//\n\t// switch src[s] & 0x03\n\tMOVBLZX (SI), CX\n\tMOVL    CX, BX\n\tANDL    $3, BX\n\tCMPL    BX, $1\n\tJAE     tagCopy\n\n\t// ----------------------------------------\n\t// The code below handles literal tags.\n\n\t// case tagLiteral:\n\t// x := uint32(src[s] >> 2)\n\t// switch\n\tSHRL $2, CX\n\tCMPL CX, $60\n\tJAE  tagLit60Plus\n\n\t// case x < 60:\n\t// s++\n\tINCQ SI\n\ndoLit:\n\t// This is the end of the inner \"switch\", when we have a literal tag.\n\t//\n\t// We assume that CX == x and x fits in a uint32, where x is the variable\n\t// used in the pure Go decode_other.go code.\n\n\t// length = int(x) + 1\n\t//\n\t// Unlike the pure Go code, we don't need to check if length <= 0 because\n\t// CX can hold 64 bits, so the increment cannot overflow.\n\tINCQ CX\n\n\t// Prepare to check if copying length bytes will run past the end of dst or\n\t// src.\n\t//\n\t// AX = len(dst) - d\n\t// BX = len(src) - s\n\tMOVQ R10, AX\n\tSUBQ DI, AX\n\tMOVQ R13, BX\n\tSUBQ SI, BX\n\n\t// !!! Try a faster technique for short (16 or fewer bytes) copies.\n\t//\n\t// if length > 16 || len(dst)-d < 16 || len(src)-s < 16 {\n\t//   goto callMemmove // Fall back on calling runtime·memmove.\n\t// }\n\t//\n\t// The C++ snappy code calls this TryFastAppend. It also checks len(src)-s\n\t// against 21 instead of 16, because it cannot assume that all of its input\n\t// is contiguous in memory and so it needs to leave enough source bytes to\n\t// read the next tag without refilling buffers, but Go's Decode assumes\n\t// contiguousness (the src argument is a []byte).\n\tCMPQ CX, $16\n\tJGT  callMemmove\n\tCMPQ AX, $16\n\tJLT  callMemmove\n\tCMPQ BX, $16\n\tJLT  callMemmove\n\n\t// !!! Implement the copy from src to dst as a 16-byte load and store.\n\t// (Decode's documentation says that dst and src must not overlap.)\n\t//\n\t// This always copies 16 bytes, instead of only length bytes, but that's\n\t// OK. If the input is a valid Snappy encoding then subsequent iterations\n\t// will fix up the overrun. Otherwise, Decode returns a nil []byte (and a\n\t// non-nil error), so the overrun will be ignored.\n\t//\n\t// Note that on amd64, it is legal and cheap to issue unaligned 8-byte or\n\t// 16-byte loads and stores. This technique probably wouldn't be as\n\t// effective on architectures that are fussier about alignment.\n\tMOVOU 0(SI), X0\n\tMOVOU X0, 0(DI)\n\n\t// d += length\n\t// s += length\n\tADDQ CX, DI\n\tADDQ CX, SI\n\tJMP  loop\n\ncallMemmove:\n\t// if length > len(dst)-d || length > len(src)-s { etc }\n\tCMPQ CX, AX\n\tJGT  errCorrupt\n\tCMPQ CX, BX\n\tJGT  errCorrupt\n\n\t// copy(dst[d:], src[s:s+length])\n\t//\n\t// This means calling runtime·memmove(&dst[d], &src[s], length), so we push\n\t// DI, SI and CX as arguments. Coincidentally, we also need to spill those\n\t// three registers to the stack, to save local variables across the CALL.\n\tMOVQ DI, 0(SP)\n\tMOVQ SI, 8(SP)\n\tMOVQ CX, 16(SP)\n\tMOVQ DI, 24(SP)\n\tMOVQ SI, 32(SP)\n\tMOVQ CX, 40(SP)\n\tCALL runtime·memmove(SB)\n\n\t// Restore local variables: unspill registers from the stack and\n\t// re-calculate R8-R13.\n\tMOVQ 24(SP), DI\n\tMOVQ 32(SP), SI\n\tMOVQ 40(SP), CX\n\tMOVQ dst_base+0(FP), R8\n\tMOVQ dst_len+8(FP), R9\n\tMOVQ R8, R10\n\tADDQ R9, R10\n\tMOVQ src_base+24(FP), R11\n\tMOVQ src_len+32(FP), R12\n\tMOVQ R11, R13\n\tADDQ R12, R13\n\n\t// d += length\n\t// s += length\n\tADDQ CX, DI\n\tADDQ CX, SI\n\tJMP  loop\n\ntagLit60Plus:\n\t// !!! This fragment does the\n\t//\n\t// s += x - 58; if uint(s) > uint(len(src)) { etc }\n\t//\n\t// checks. In the asm version, we code it once instead of once per switch case.\n\tADDQ CX, SI\n\tSUBQ $58, SI\n\tMOVQ SI, BX\n\tSUBQ R11, BX\n\tCMPQ BX, R12\n\tJA   errCorrupt\n\n\t// case x == 60:\n\tCMPL CX, $61\n\tJEQ  tagLit61\n\tJA   tagLit62Plus\n\n\t// x = uint32(src[s-1])\n\tMOVBLZX -1(SI), CX\n\tJMP     doLit\n\ntagLit61:\n\t// case x == 61:\n\t// x = uint32(src[s-2]) | uint32(src[s-1])<<8\n\tMOVWLZX -2(SI), CX\n\tJMP     doLit\n\ntagLit62Plus:\n\tCMPL CX, $62\n\tJA   tagLit63\n\n\t// case x == 62:\n\t// x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16\n\tMOVWLZX -3(SI), CX\n\tMOVBLZX -1(SI), BX\n\tSHLL    $16, BX\n\tORL     BX, CX\n\tJMP     doLit\n\ntagLit63:\n\t// case x == 63:\n\t// x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24\n\tMOVL -4(SI), CX\n\tJMP  doLit\n\n// The code above handles literal tags.\n// ----------------------------------------\n// The code below handles copy tags.\n\ntagCopy4:\n\t// case tagCopy4:\n\t// s += 5\n\tADDQ $5, SI\n\n\t// if uint(s) > uint(len(src)) { etc }\n\tMOVQ SI, BX\n\tSUBQ R11, BX\n\tCMPQ BX, R12\n\tJA   errCorrupt\n\n\t// length = 1 + int(src[s-5])>>2\n\tSHRQ $2, CX\n\tINCQ CX\n\n\t// offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24)\n\tMOVLQZX -4(SI), DX\n\tJMP     doCopy\n\ntagCopy2:\n\t// case tagCopy2:\n\t// s += 3\n\tADDQ $3, SI\n\n\t// if uint(s) > uint(len(src)) { etc }\n\tMOVQ SI, BX\n\tSUBQ R11, BX\n\tCMPQ BX, R12\n\tJA   errCorrupt\n\n\t// length = 1 + int(src[s-3])>>2\n\tSHRQ $2, CX\n\tINCQ CX\n\n\t// offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8)\n\tMOVWQZX -2(SI), DX\n\tJMP     doCopy\n\ntagCopy:\n\t// We have a copy tag. We assume that:\n\t//\t- BX == src[s] & 0x03\n\t//\t- CX == src[s]\n\tCMPQ BX, $2\n\tJEQ  tagCopy2\n\tJA   tagCopy4\n\n\t// case tagCopy1:\n\t// s += 2\n\tADDQ $2, SI\n\n\t// if uint(s) > uint(len(src)) { etc }\n\tMOVQ SI, BX\n\tSUBQ R11, BX\n\tCMPQ BX, R12\n\tJA   errCorrupt\n\n\t// offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1]))\n\tMOVQ    CX, DX\n\tANDQ    $0xe0, DX\n\tSHLQ    $3, DX\n\tMOVBQZX -1(SI), BX\n\tORQ     BX, DX\n\n\t// length = 4 + int(src[s-2])>>2&0x7\n\tSHRQ $2, CX\n\tANDQ $7, CX\n\tADDQ $4, CX\n\ndoCopy:\n\t// This is the end of the outer \"switch\", when we have a copy tag.\n\t//\n\t// We assume that:\n\t//\t- CX == length && CX > 0\n\t//\t- DX == offset\n\n\t// if offset <= 0 { etc }\n\tCMPQ DX, $0\n\tJLE  errCorrupt\n\n\t// if d < offset { etc }\n\tMOVQ DI, BX\n\tSUBQ R8, BX\n\tCMPQ BX, DX\n\tJLT  errCorrupt\n\n\t// if length > len(dst)-d { etc }\n\tMOVQ R10, BX\n\tSUBQ DI, BX\n\tCMPQ CX, BX\n\tJGT  errCorrupt\n\n\t// forwardCopy(dst[d:d+length], dst[d-offset:]); d += length\n\t//\n\t// Set:\n\t//\t- R14 = len(dst)-d\n\t//\t- R15 = &dst[d-offset]\n\tMOVQ R10, R14\n\tSUBQ DI, R14\n\tMOVQ DI, R15\n\tSUBQ DX, R15\n\n\t// !!! Try a faster technique for short (16 or fewer bytes) forward copies.\n\t//\n\t// First, try using two 8-byte load/stores, similar to the doLit technique\n\t// above. Even if dst[d:d+length] and dst[d-offset:] can overlap, this is\n\t// still OK if offset >= 8. Note that this has to be two 8-byte load/stores\n\t// and not one 16-byte load/store, and the first store has to be before the\n\t// second load, due to the overlap if offset is in the range [8, 16).\n\t//\n\t// if length > 16 || offset < 8 || len(dst)-d < 16 {\n\t//   goto slowForwardCopy\n\t// }\n\t// copy 16 bytes\n\t// d += length\n\tCMPQ CX, $16\n\tJGT  slowForwardCopy\n\tCMPQ DX, $8\n\tJLT  slowForwardCopy\n\tCMPQ R14, $16\n\tJLT  slowForwardCopy\n\tMOVQ 0(R15), AX\n\tMOVQ AX, 0(DI)\n\tMOVQ 8(R15), BX\n\tMOVQ BX, 8(DI)\n\tADDQ CX, DI\n\tJMP  loop\n\nslowForwardCopy:\n\t// !!! If the forward copy is longer than 16 bytes, or if offset < 8, we\n\t// can still try 8-byte load stores, provided we can overrun up to 10 extra\n\t// bytes. As above, the overrun will be fixed up by subsequent iterations\n\t// of the outermost loop.\n\t//\n\t// The C++ snappy code calls this technique IncrementalCopyFastPath. Its\n\t// commentary says:\n\t//\n\t// ----\n\t//\n\t// The main part of this loop is a simple copy of eight bytes at a time\n\t// until we've copied (at least) the requested amount of bytes.  However,\n\t// if d and d-offset are less than eight bytes apart (indicating a\n\t// repeating pattern of length < 8), we first need to expand the pattern in\n\t// order to get the correct results. For instance, if the buffer looks like\n\t// this, with the eight-byte <d-offset> and <d> patterns marked as\n\t// intervals:\n\t//\n\t//    abxxxxxxxxxxxx\n\t//    [------]           d-offset\n\t//      [------]         d\n\t//\n\t// a single eight-byte copy from <d-offset> to <d> will repeat the pattern\n\t// once, after which we can move <d> two bytes without moving <d-offset>:\n\t//\n\t//    ababxxxxxxxxxx\n\t//    [------]           d-offset\n\t//        [------]       d\n\t//\n\t// and repeat the exercise until the two no longer overlap.\n\t//\n\t// This allows us to do very well in the special case of one single byte\n\t// repeated many times, without taking a big hit for more general cases.\n\t//\n\t// The worst case of extra writing past the end of the match occurs when\n\t// offset == 1 and length == 1; the last copy will read from byte positions\n\t// [0..7] and write to [4..11], whereas it was only supposed to write to\n\t// position 1. Thus, ten excess bytes.\n\t//\n\t// ----\n\t//\n\t// That \"10 byte overrun\" worst case is confirmed by Go's\n\t// TestSlowForwardCopyOverrun, which also tests the fixUpSlowForwardCopy\n\t// and finishSlowForwardCopy algorithm.\n\t//\n\t// if length > len(dst)-d-10 {\n\t//   goto verySlowForwardCopy\n\t// }\n\tSUBQ $10, R14\n\tCMPQ CX, R14\n\tJGT  verySlowForwardCopy\n\nmakeOffsetAtLeast8:\n\t// !!! As above, expand the pattern so that offset >= 8 and we can use\n\t// 8-byte load/stores.\n\t//\n\t// for offset < 8 {\n\t//   copy 8 bytes from dst[d-offset:] to dst[d:]\n\t//   length -= offset\n\t//   d      += offset\n\t//   offset += offset\n\t//   // The two previous lines together means that d-offset, and therefore\n\t//   // R15, is unchanged.\n\t// }\n\tCMPQ DX, $8\n\tJGE  fixUpSlowForwardCopy\n\tMOVQ (R15), BX\n\tMOVQ BX, (DI)\n\tSUBQ DX, CX\n\tADDQ DX, DI\n\tADDQ DX, DX\n\tJMP  makeOffsetAtLeast8\n\nfixUpSlowForwardCopy:\n\t// !!! Add length (which might be negative now) to d (implied by DI being\n\t// &dst[d]) so that d ends up at the right place when we jump back to the\n\t// top of the loop. Before we do that, though, we save DI to AX so that, if\n\t// length is positive, copying the remaining length bytes will write to the\n\t// right place.\n\tMOVQ DI, AX\n\tADDQ CX, DI\n\nfinishSlowForwardCopy:\n\t// !!! Repeat 8-byte load/stores until length <= 0. Ending with a negative\n\t// length means that we overrun, but as above, that will be fixed up by\n\t// subsequent iterations of the outermost loop.\n\tCMPQ CX, $0\n\tJLE  loop\n\tMOVQ (R15), BX\n\tMOVQ BX, (AX)\n\tADDQ $8, R15\n\tADDQ $8, AX\n\tSUBQ $8, CX\n\tJMP  finishSlowForwardCopy\n\nverySlowForwardCopy:\n\t// verySlowForwardCopy is a simple implementation of forward copy. In C\n\t// parlance, this is a do/while loop instead of a while loop, since we know\n\t// that length > 0. In Go syntax:\n\t//\n\t// for {\n\t//   dst[d] = dst[d - offset]\n\t//   d++\n\t//   length--\n\t//   if length == 0 {\n\t//     break\n\t//   }\n\t// }\n\tMOVB (R15), BX\n\tMOVB BX, (DI)\n\tINCQ R15\n\tINCQ DI\n\tDECQ CX\n\tJNZ  verySlowForwardCopy\n\tJMP  loop\n\n// The code above handles copy tags.\n// ----------------------------------------\n\nend:\n\t// This is the end of the \"for s < len(src)\".\n\t//\n\t// if d != len(dst) { etc }\n\tCMPQ DI, R10\n\tJNE  errCorrupt\n\n\t// return 0\n\tMOVQ $0, ret+48(FP)\n\tRET\n\nerrCorrupt:\n\t// return decodeErrCodeCorrupt\n\tMOVQ $1, ret+48(FP)\n\tRET\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/decode_other.go",
    "content": "// Copyright 2016 The Snappy-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !amd64 appengine !gc noasm\n\npackage snappy\n\n// decode writes the decoding of src to dst. It assumes that the varint-encoded\n// length of the decompressed bytes has already been read, and that len(dst)\n// equals that length.\n//\n// It returns 0 on success or a decodeErrCodeXxx error code on failure.\nfunc decode(dst, src []byte) int {\n\tvar d, s, offset, length int\n\tfor s < len(src) {\n\t\tswitch src[s] & 0x03 {\n\t\tcase tagLiteral:\n\t\t\tx := uint32(src[s] >> 2)\n\t\t\tswitch {\n\t\t\tcase x < 60:\n\t\t\t\ts++\n\t\t\tcase x == 60:\n\t\t\t\ts += 2\n\t\t\t\tif uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line.\n\t\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t\t}\n\t\t\t\tx = uint32(src[s-1])\n\t\t\tcase x == 61:\n\t\t\t\ts += 3\n\t\t\t\tif uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line.\n\t\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t\t}\n\t\t\t\tx = uint32(src[s-2]) | uint32(src[s-1])<<8\n\t\t\tcase x == 62:\n\t\t\t\ts += 4\n\t\t\t\tif uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line.\n\t\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t\t}\n\t\t\t\tx = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16\n\t\t\tcase x == 63:\n\t\t\t\ts += 5\n\t\t\t\tif uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line.\n\t\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t\t}\n\t\t\t\tx = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24\n\t\t\t}\n\t\t\tlength = int(x) + 1\n\t\t\tif length <= 0 {\n\t\t\t\treturn decodeErrCodeUnsupportedLiteralLength\n\t\t\t}\n\t\t\tif length > len(dst)-d || length > len(src)-s {\n\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t}\n\t\t\tcopy(dst[d:], src[s:s+length])\n\t\t\td += length\n\t\t\ts += length\n\t\t\tcontinue\n\n\t\tcase tagCopy1:\n\t\t\ts += 2\n\t\t\tif uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line.\n\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t}\n\t\t\tlength = 4 + int(src[s-2])>>2&0x7\n\t\t\toffset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1]))\n\n\t\tcase tagCopy2:\n\t\t\ts += 3\n\t\t\tif uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line.\n\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t}\n\t\t\tlength = 1 + int(src[s-3])>>2\n\t\t\toffset = int(uint32(src[s-2]) | uint32(src[s-1])<<8)\n\n\t\tcase tagCopy4:\n\t\t\ts += 5\n\t\t\tif uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line.\n\t\t\t\treturn decodeErrCodeCorrupt\n\t\t\t}\n\t\t\tlength = 1 + int(src[s-5])>>2\n\t\t\toffset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24)\n\t\t}\n\n\t\tif offset <= 0 || d < offset || length > len(dst)-d {\n\t\t\treturn decodeErrCodeCorrupt\n\t\t}\n\t\t// Copy from an earlier sub-slice of dst to a later sub-slice. Unlike\n\t\t// the built-in copy function, this byte-by-byte copy always runs\n\t\t// forwards, even if the slices overlap. Conceptually, this is:\n\t\t//\n\t\t// d += forwardCopy(dst[d:d+length], dst[d-offset:])\n\t\tfor end := d + length; d != end; d++ {\n\t\t\tdst[d] = dst[d-offset]\n\t\t}\n\t}\n\tif d != len(dst) {\n\t\treturn decodeErrCodeCorrupt\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/encode.go",
    "content": "// Copyright 2011 The Snappy-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage snappy\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"io\"\n)\n\n// Encode returns the encoded form of src. The returned slice may be a sub-\n// slice of dst if dst was large enough to hold the entire encoded block.\n// Otherwise, a newly allocated slice will be returned.\n//\n// The dst and src must not overlap. It is valid to pass a nil dst.\nfunc Encode(dst, src []byte) []byte {\n\tif n := MaxEncodedLen(len(src)); n < 0 {\n\t\tpanic(ErrTooLarge)\n\t} else if len(dst) < n {\n\t\tdst = make([]byte, n)\n\t}\n\n\t// The block starts with the varint-encoded length of the decompressed bytes.\n\td := binary.PutUvarint(dst, uint64(len(src)))\n\n\tfor len(src) > 0 {\n\t\tp := src\n\t\tsrc = nil\n\t\tif len(p) > maxBlockSize {\n\t\t\tp, src = p[:maxBlockSize], p[maxBlockSize:]\n\t\t}\n\t\tif len(p) < minNonLiteralBlockSize {\n\t\t\td += emitLiteral(dst[d:], p)\n\t\t} else {\n\t\t\td += encodeBlock(dst[d:], p)\n\t\t}\n\t}\n\treturn dst[:d]\n}\n\n// inputMargin is the minimum number of extra input bytes to keep, inside\n// encodeBlock's inner loop. On some architectures, this margin lets us\n// implement a fast path for emitLiteral, where the copy of short (<= 16 byte)\n// literals can be implemented as a single load to and store from a 16-byte\n// register. That literal's actual length can be as short as 1 byte, so this\n// can copy up to 15 bytes too much, but that's OK as subsequent iterations of\n// the encoding loop will fix up the copy overrun, and this inputMargin ensures\n// that we don't overrun the dst and src buffers.\nconst inputMargin = 16 - 1\n\n// minNonLiteralBlockSize is the minimum size of the input to encodeBlock that\n// could be encoded with a copy tag. This is the minimum with respect to the\n// algorithm used by encodeBlock, not a minimum enforced by the file format.\n//\n// The encoded output must start with at least a 1 byte literal, as there are\n// no previous bytes to copy. A minimal (1 byte) copy after that, generated\n// from an emitCopy call in encodeBlock's main loop, would require at least\n// another inputMargin bytes, for the reason above: we want any emitLiteral\n// calls inside encodeBlock's main loop to use the fast path if possible, which\n// requires being able to overrun by inputMargin bytes. Thus,\n// minNonLiteralBlockSize equals 1 + 1 + inputMargin.\n//\n// The C++ code doesn't use this exact threshold, but it could, as discussed at\n// https://groups.google.com/d/topic/snappy-compression/oGbhsdIJSJ8/discussion\n// The difference between Go (2+inputMargin) and C++ (inputMargin) is purely an\n// optimization. It should not affect the encoded form. This is tested by\n// TestSameEncodingAsCppShortCopies.\nconst minNonLiteralBlockSize = 1 + 1 + inputMargin\n\n// MaxEncodedLen returns the maximum length of a snappy block, given its\n// uncompressed length.\n//\n// It will return a negative value if srcLen is too large to encode.\nfunc MaxEncodedLen(srcLen int) int {\n\tn := uint64(srcLen)\n\tif n > 0xffffffff {\n\t\treturn -1\n\t}\n\t// Compressed data can be defined as:\n\t//    compressed := item* literal*\n\t//    item       := literal* copy\n\t//\n\t// The trailing literal sequence has a space blowup of at most 62/60\n\t// since a literal of length 60 needs one tag byte + one extra byte\n\t// for length information.\n\t//\n\t// Item blowup is trickier to measure. Suppose the \"copy\" op copies\n\t// 4 bytes of data. Because of a special check in the encoding code,\n\t// we produce a 4-byte copy only if the offset is < 65536. Therefore\n\t// the copy op takes 3 bytes to encode, and this type of item leads\n\t// to at most the 62/60 blowup for representing literals.\n\t//\n\t// Suppose the \"copy\" op copies 5 bytes of data. If the offset is big\n\t// enough, it will take 5 bytes to encode the copy op. Therefore the\n\t// worst case here is a one-byte literal followed by a five-byte copy.\n\t// That is, 6 bytes of input turn into 7 bytes of \"compressed\" data.\n\t//\n\t// This last factor dominates the blowup, so the final estimate is:\n\tn = 32 + n + n/6\n\tif n > 0xffffffff {\n\t\treturn -1\n\t}\n\treturn int(n)\n}\n\nvar errClosed = errors.New(\"snappy: Writer is closed\")\n\n// NewWriter returns a new Writer that compresses to w.\n//\n// The Writer returned does not buffer writes. There is no need to Flush or\n// Close such a Writer.\n//\n// Deprecated: the Writer returned is not suitable for many small writes, only\n// for few large writes. Use NewBufferedWriter instead, which is efficient\n// regardless of the frequency and shape of the writes, and remember to Close\n// that Writer when done.\nfunc NewWriter(w io.Writer) *Writer {\n\treturn &Writer{\n\t\tw:    w,\n\t\tobuf: make([]byte, obufLen),\n\t}\n}\n\n// NewBufferedWriter returns a new Writer that compresses to w, using the\n// framing format described at\n// https://github.com/google/snappy/blob/master/framing_format.txt\n//\n// The Writer returned buffers writes. Users must call Close to guarantee all\n// data has been forwarded to the underlying io.Writer. They may also call\n// Flush zero or more times before calling Close.\nfunc NewBufferedWriter(w io.Writer) *Writer {\n\treturn &Writer{\n\t\tw:    w,\n\t\tibuf: make([]byte, 0, maxBlockSize),\n\t\tobuf: make([]byte, obufLen),\n\t}\n}\n\n// Writer is an io.Writer that can write Snappy-compressed bytes.\ntype Writer struct {\n\tw   io.Writer\n\terr error\n\n\t// ibuf is a buffer for the incoming (uncompressed) bytes.\n\t//\n\t// Its use is optional. For backwards compatibility, Writers created by the\n\t// NewWriter function have ibuf == nil, do not buffer incoming bytes, and\n\t// therefore do not need to be Flush'ed or Close'd.\n\tibuf []byte\n\n\t// obuf is a buffer for the outgoing (compressed) bytes.\n\tobuf []byte\n\n\t// wroteStreamHeader is whether we have written the stream header.\n\twroteStreamHeader bool\n}\n\n// Reset discards the writer's state and switches the Snappy writer to write to\n// w. This permits reusing a Writer rather than allocating a new one.\nfunc (w *Writer) Reset(writer io.Writer) {\n\tw.w = writer\n\tw.err = nil\n\tif w.ibuf != nil {\n\t\tw.ibuf = w.ibuf[:0]\n\t}\n\tw.wroteStreamHeader = false\n}\n\n// Write satisfies the io.Writer interface.\nfunc (w *Writer) Write(p []byte) (nRet int, errRet error) {\n\tif w.ibuf == nil {\n\t\t// Do not buffer incoming bytes. This does not perform or compress well\n\t\t// if the caller of Writer.Write writes many small slices. This\n\t\t// behavior is therefore deprecated, but still supported for backwards\n\t\t// compatibility with code that doesn't explicitly Flush or Close.\n\t\treturn w.write(p)\n\t}\n\n\t// The remainder of this method is based on bufio.Writer.Write from the\n\t// standard library.\n\n\tfor len(p) > (cap(w.ibuf)-len(w.ibuf)) && w.err == nil {\n\t\tvar n int\n\t\tif len(w.ibuf) == 0 {\n\t\t\t// Large write, empty buffer.\n\t\t\t// Write directly from p to avoid copy.\n\t\t\tn, _ = w.write(p)\n\t\t} else {\n\t\t\tn = copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p)\n\t\t\tw.ibuf = w.ibuf[:len(w.ibuf)+n]\n\t\t\tw.Flush()\n\t\t}\n\t\tnRet += n\n\t\tp = p[n:]\n\t}\n\tif w.err != nil {\n\t\treturn nRet, w.err\n\t}\n\tn := copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p)\n\tw.ibuf = w.ibuf[:len(w.ibuf)+n]\n\tnRet += n\n\treturn nRet, nil\n}\n\nfunc (w *Writer) write(p []byte) (nRet int, errRet error) {\n\tif w.err != nil {\n\t\treturn 0, w.err\n\t}\n\tfor len(p) > 0 {\n\t\tobufStart := len(magicChunk)\n\t\tif !w.wroteStreamHeader {\n\t\t\tw.wroteStreamHeader = true\n\t\t\tcopy(w.obuf, magicChunk)\n\t\t\tobufStart = 0\n\t\t}\n\n\t\tvar uncompressed []byte\n\t\tif len(p) > maxBlockSize {\n\t\t\tuncompressed, p = p[:maxBlockSize], p[maxBlockSize:]\n\t\t} else {\n\t\t\tuncompressed, p = p, nil\n\t\t}\n\t\tchecksum := crc(uncompressed)\n\n\t\t// Compress the buffer, discarding the result if the improvement\n\t\t// isn't at least 12.5%.\n\t\tcompressed := Encode(w.obuf[obufHeaderLen:], uncompressed)\n\t\tchunkType := uint8(chunkTypeCompressedData)\n\t\tchunkLen := 4 + len(compressed)\n\t\tobufEnd := obufHeaderLen + len(compressed)\n\t\tif len(compressed) >= len(uncompressed)-len(uncompressed)/8 {\n\t\t\tchunkType = chunkTypeUncompressedData\n\t\t\tchunkLen = 4 + len(uncompressed)\n\t\t\tobufEnd = obufHeaderLen\n\t\t}\n\n\t\t// Fill in the per-chunk header that comes before the body.\n\t\tw.obuf[len(magicChunk)+0] = chunkType\n\t\tw.obuf[len(magicChunk)+1] = uint8(chunkLen >> 0)\n\t\tw.obuf[len(magicChunk)+2] = uint8(chunkLen >> 8)\n\t\tw.obuf[len(magicChunk)+3] = uint8(chunkLen >> 16)\n\t\tw.obuf[len(magicChunk)+4] = uint8(checksum >> 0)\n\t\tw.obuf[len(magicChunk)+5] = uint8(checksum >> 8)\n\t\tw.obuf[len(magicChunk)+6] = uint8(checksum >> 16)\n\t\tw.obuf[len(magicChunk)+7] = uint8(checksum >> 24)\n\n\t\tif _, err := w.w.Write(w.obuf[obufStart:obufEnd]); err != nil {\n\t\t\tw.err = err\n\t\t\treturn nRet, err\n\t\t}\n\t\tif chunkType == chunkTypeUncompressedData {\n\t\t\tif _, err := w.w.Write(uncompressed); err != nil {\n\t\t\t\tw.err = err\n\t\t\t\treturn nRet, err\n\t\t\t}\n\t\t}\n\t\tnRet += len(uncompressed)\n\t}\n\treturn nRet, nil\n}\n\n// Flush flushes the Writer to its underlying io.Writer.\nfunc (w *Writer) Flush() error {\n\tif w.err != nil {\n\t\treturn w.err\n\t}\n\tif len(w.ibuf) == 0 {\n\t\treturn nil\n\t}\n\tw.write(w.ibuf)\n\tw.ibuf = w.ibuf[:0]\n\treturn w.err\n}\n\n// Close calls Flush and then closes the Writer.\nfunc (w *Writer) Close() error {\n\tw.Flush()\n\tret := w.err\n\tif w.err == nil {\n\t\tw.err = errClosed\n\t}\n\treturn ret\n}\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/encode_amd64.go",
    "content": "// Copyright 2016 The Snappy-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !appengine\n// +build gc\n// +build !noasm\n\npackage snappy\n\n// emitLiteral has the same semantics as in encode_other.go.\n//\n//go:noescape\nfunc emitLiteral(dst, lit []byte) int\n\n// emitCopy has the same semantics as in encode_other.go.\n//\n//go:noescape\nfunc emitCopy(dst []byte, offset, length int) int\n\n// extendMatch has the same semantics as in encode_other.go.\n//\n//go:noescape\nfunc extendMatch(src []byte, i, j int) int\n\n// encodeBlock has the same semantics as in encode_other.go.\n//\n//go:noescape\nfunc encodeBlock(dst, src []byte) (d int)\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/encode_amd64.s",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !appengine\n// +build gc\n// +build !noasm\n\n#include \"textflag.h\"\n\n// The XXX lines assemble on Go 1.4, 1.5 and 1.7, but not 1.6, due to a\n// Go toolchain regression. See https://github.com/golang/go/issues/15426 and\n// https://github.com/golang/snappy/issues/29\n//\n// As a workaround, the package was built with a known good assembler, and\n// those instructions were disassembled by \"objdump -d\" to yield the\n//\t4e 0f b7 7c 5c 78       movzwq 0x78(%rsp,%r11,2),%r15\n// style comments, in AT&T asm syntax. Note that rsp here is a physical\n// register, not Go/asm's SP pseudo-register (see https://golang.org/doc/asm).\n// The instructions were then encoded as \"BYTE $0x..\" sequences, which assemble\n// fine on Go 1.6.\n\n// The asm code generally follows the pure Go code in encode_other.go, except\n// where marked with a \"!!!\".\n\n// ----------------------------------------------------------------------------\n\n// func emitLiteral(dst, lit []byte) int\n//\n// All local variables fit into registers. The register allocation:\n//\t- AX\tlen(lit)\n//\t- BX\tn\n//\t- DX\treturn value\n//\t- DI\t&dst[i]\n//\t- R10\t&lit[0]\n//\n// The 24 bytes of stack space is to call runtime·memmove.\n//\n// The unusual register allocation of local variables, such as R10 for the\n// source pointer, matches the allocation used at the call site in encodeBlock,\n// which makes it easier to manually inline this function.\nTEXT ·emitLiteral(SB), NOSPLIT, $24-56\n\tMOVQ dst_base+0(FP), DI\n\tMOVQ lit_base+24(FP), R10\n\tMOVQ lit_len+32(FP), AX\n\tMOVQ AX, DX\n\tMOVL AX, BX\n\tSUBL $1, BX\n\n\tCMPL BX, $60\n\tJLT  oneByte\n\tCMPL BX, $256\n\tJLT  twoBytes\n\nthreeBytes:\n\tMOVB $0xf4, 0(DI)\n\tMOVW BX, 1(DI)\n\tADDQ $3, DI\n\tADDQ $3, DX\n\tJMP  memmove\n\ntwoBytes:\n\tMOVB $0xf0, 0(DI)\n\tMOVB BX, 1(DI)\n\tADDQ $2, DI\n\tADDQ $2, DX\n\tJMP  memmove\n\noneByte:\n\tSHLB $2, BX\n\tMOVB BX, 0(DI)\n\tADDQ $1, DI\n\tADDQ $1, DX\n\nmemmove:\n\tMOVQ DX, ret+48(FP)\n\n\t// copy(dst[i:], lit)\n\t//\n\t// This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push\n\t// DI, R10 and AX as arguments.\n\tMOVQ DI, 0(SP)\n\tMOVQ R10, 8(SP)\n\tMOVQ AX, 16(SP)\n\tCALL runtime·memmove(SB)\n\tRET\n\n// ----------------------------------------------------------------------------\n\n// func emitCopy(dst []byte, offset, length int) int\n//\n// All local variables fit into registers. The register allocation:\n//\t- AX\tlength\n//\t- SI\t&dst[0]\n//\t- DI\t&dst[i]\n//\t- R11\toffset\n//\n// The unusual register allocation of local variables, such as R11 for the\n// offset, matches the allocation used at the call site in encodeBlock, which\n// makes it easier to manually inline this function.\nTEXT ·emitCopy(SB), NOSPLIT, $0-48\n\tMOVQ dst_base+0(FP), DI\n\tMOVQ DI, SI\n\tMOVQ offset+24(FP), R11\n\tMOVQ length+32(FP), AX\n\nloop0:\n\t// for length >= 68 { etc }\n\tCMPL AX, $68\n\tJLT  step1\n\n\t// Emit a length 64 copy, encoded as 3 bytes.\n\tMOVB $0xfe, 0(DI)\n\tMOVW R11, 1(DI)\n\tADDQ $3, DI\n\tSUBL $64, AX\n\tJMP  loop0\n\nstep1:\n\t// if length > 64 { etc }\n\tCMPL AX, $64\n\tJLE  step2\n\n\t// Emit a length 60 copy, encoded as 3 bytes.\n\tMOVB $0xee, 0(DI)\n\tMOVW R11, 1(DI)\n\tADDQ $3, DI\n\tSUBL $60, AX\n\nstep2:\n\t// if length >= 12 || offset >= 2048 { goto step3 }\n\tCMPL AX, $12\n\tJGE  step3\n\tCMPL R11, $2048\n\tJGE  step3\n\n\t// Emit the remaining copy, encoded as 2 bytes.\n\tMOVB R11, 1(DI)\n\tSHRL $8, R11\n\tSHLB $5, R11\n\tSUBB $4, AX\n\tSHLB $2, AX\n\tORB  AX, R11\n\tORB  $1, R11\n\tMOVB R11, 0(DI)\n\tADDQ $2, DI\n\n\t// Return the number of bytes written.\n\tSUBQ SI, DI\n\tMOVQ DI, ret+40(FP)\n\tRET\n\nstep3:\n\t// Emit the remaining copy, encoded as 3 bytes.\n\tSUBL $1, AX\n\tSHLB $2, AX\n\tORB  $2, AX\n\tMOVB AX, 0(DI)\n\tMOVW R11, 1(DI)\n\tADDQ $3, DI\n\n\t// Return the number of bytes written.\n\tSUBQ SI, DI\n\tMOVQ DI, ret+40(FP)\n\tRET\n\n// ----------------------------------------------------------------------------\n\n// func extendMatch(src []byte, i, j int) int\n//\n// All local variables fit into registers. The register allocation:\n//\t- DX\t&src[0]\n//\t- SI\t&src[j]\n//\t- R13\t&src[len(src) - 8]\n//\t- R14\t&src[len(src)]\n//\t- R15\t&src[i]\n//\n// The unusual register allocation of local variables, such as R15 for a source\n// pointer, matches the allocation used at the call site in encodeBlock, which\n// makes it easier to manually inline this function.\nTEXT ·extendMatch(SB), NOSPLIT, $0-48\n\tMOVQ src_base+0(FP), DX\n\tMOVQ src_len+8(FP), R14\n\tMOVQ i+24(FP), R15\n\tMOVQ j+32(FP), SI\n\tADDQ DX, R14\n\tADDQ DX, R15\n\tADDQ DX, SI\n\tMOVQ R14, R13\n\tSUBQ $8, R13\n\ncmp8:\n\t// As long as we are 8 or more bytes before the end of src, we can load and\n\t// compare 8 bytes at a time. If those 8 bytes are equal, repeat.\n\tCMPQ SI, R13\n\tJA   cmp1\n\tMOVQ (R15), AX\n\tMOVQ (SI), BX\n\tCMPQ AX, BX\n\tJNE  bsf\n\tADDQ $8, R15\n\tADDQ $8, SI\n\tJMP  cmp8\n\nbsf:\n\t// If those 8 bytes were not equal, XOR the two 8 byte values, and return\n\t// the index of the first byte that differs. The BSF instruction finds the\n\t// least significant 1 bit, the amd64 architecture is little-endian, and\n\t// the shift by 3 converts a bit index to a byte index.\n\tXORQ AX, BX\n\tBSFQ BX, BX\n\tSHRQ $3, BX\n\tADDQ BX, SI\n\n\t// Convert from &src[ret] to ret.\n\tSUBQ DX, SI\n\tMOVQ SI, ret+40(FP)\n\tRET\n\ncmp1:\n\t// In src's tail, compare 1 byte at a time.\n\tCMPQ SI, R14\n\tJAE  extendMatchEnd\n\tMOVB (R15), AX\n\tMOVB (SI), BX\n\tCMPB AX, BX\n\tJNE  extendMatchEnd\n\tADDQ $1, R15\n\tADDQ $1, SI\n\tJMP  cmp1\n\nextendMatchEnd:\n\t// Convert from &src[ret] to ret.\n\tSUBQ DX, SI\n\tMOVQ SI, ret+40(FP)\n\tRET\n\n// ----------------------------------------------------------------------------\n\n// func encodeBlock(dst, src []byte) (d int)\n//\n// All local variables fit into registers, other than \"var table\". The register\n// allocation:\n//\t- AX\t.\t.\n//\t- BX\t.\t.\n//\t- CX\t56\tshift (note that amd64 shifts by non-immediates must use CX).\n//\t- DX\t64\t&src[0], tableSize\n//\t- SI\t72\t&src[s]\n//\t- DI\t80\t&dst[d]\n//\t- R9\t88\tsLimit\n//\t- R10\t.\t&src[nextEmit]\n//\t- R11\t96\tprevHash, currHash, nextHash, offset\n//\t- R12\t104\t&src[base], skip\n//\t- R13\t.\t&src[nextS], &src[len(src) - 8]\n//\t- R14\t.\tlen(src), bytesBetweenHashLookups, &src[len(src)], x\n//\t- R15\t112\tcandidate\n//\n// The second column (56, 64, etc) is the stack offset to spill the registers\n// when calling other functions. We could pack this slightly tighter, but it's\n// simpler to have a dedicated spill map independent of the function called.\n//\n// \"var table [maxTableSize]uint16\" takes up 32768 bytes of stack space. An\n// extra 56 bytes, to call other functions, and an extra 64 bytes, to spill\n// local variables (registers) during calls gives 32768 + 56 + 64 = 32888.\nTEXT ·encodeBlock(SB), 0, $32888-56\n\tMOVQ dst_base+0(FP), DI\n\tMOVQ src_base+24(FP), SI\n\tMOVQ src_len+32(FP), R14\n\n\t// shift, tableSize := uint32(32-8), 1<<8\n\tMOVQ $24, CX\n\tMOVQ $256, DX\n\ncalcShift:\n\t// for ; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 {\n\t//\tshift--\n\t// }\n\tCMPQ DX, $16384\n\tJGE  varTable\n\tCMPQ DX, R14\n\tJGE  varTable\n\tSUBQ $1, CX\n\tSHLQ $1, DX\n\tJMP  calcShift\n\nvarTable:\n\t// var table [maxTableSize]uint16\n\t//\n\t// In the asm code, unlike the Go code, we can zero-initialize only the\n\t// first tableSize elements. Each uint16 element is 2 bytes and each MOVOU\n\t// writes 16 bytes, so we can do only tableSize/8 writes instead of the\n\t// 2048 writes that would zero-initialize all of table's 32768 bytes.\n\tSHRQ $3, DX\n\tLEAQ table-32768(SP), BX\n\tPXOR X0, X0\n\nmemclr:\n\tMOVOU X0, 0(BX)\n\tADDQ  $16, BX\n\tSUBQ  $1, DX\n\tJNZ   memclr\n\n\t// !!! DX = &src[0]\n\tMOVQ SI, DX\n\n\t// sLimit := len(src) - inputMargin\n\tMOVQ R14, R9\n\tSUBQ $15, R9\n\n\t// !!! Pre-emptively spill CX, DX and R9 to the stack. Their values don't\n\t// change for the rest of the function.\n\tMOVQ CX, 56(SP)\n\tMOVQ DX, 64(SP)\n\tMOVQ R9, 88(SP)\n\n\t// nextEmit := 0\n\tMOVQ DX, R10\n\n\t// s := 1\n\tADDQ $1, SI\n\n\t// nextHash := hash(load32(src, s), shift)\n\tMOVL  0(SI), R11\n\tIMULL $0x1e35a7bd, R11\n\tSHRL  CX, R11\n\nouter:\n\t// for { etc }\n\n\t// skip := 32\n\tMOVQ $32, R12\n\n\t// nextS := s\n\tMOVQ SI, R13\n\n\t// candidate := 0\n\tMOVQ $0, R15\n\ninner0:\n\t// for { etc }\n\n\t// s := nextS\n\tMOVQ R13, SI\n\n\t// bytesBetweenHashLookups := skip >> 5\n\tMOVQ R12, R14\n\tSHRQ $5, R14\n\n\t// nextS = s + bytesBetweenHashLookups\n\tADDQ R14, R13\n\n\t// skip += bytesBetweenHashLookups\n\tADDQ R14, R12\n\n\t// if nextS > sLimit { goto emitRemainder }\n\tMOVQ R13, AX\n\tSUBQ DX, AX\n\tCMPQ AX, R9\n\tJA   emitRemainder\n\n\t// candidate = int(table[nextHash])\n\t// XXX: MOVWQZX table-32768(SP)(R11*2), R15\n\t// XXX: 4e 0f b7 7c 5c 78       movzwq 0x78(%rsp,%r11,2),%r15\n\tBYTE $0x4e\n\tBYTE $0x0f\n\tBYTE $0xb7\n\tBYTE $0x7c\n\tBYTE $0x5c\n\tBYTE $0x78\n\n\t// table[nextHash] = uint16(s)\n\tMOVQ SI, AX\n\tSUBQ DX, AX\n\n\t// XXX: MOVW AX, table-32768(SP)(R11*2)\n\t// XXX: 66 42 89 44 5c 78       mov    %ax,0x78(%rsp,%r11,2)\n\tBYTE $0x66\n\tBYTE $0x42\n\tBYTE $0x89\n\tBYTE $0x44\n\tBYTE $0x5c\n\tBYTE $0x78\n\n\t// nextHash = hash(load32(src, nextS), shift)\n\tMOVL  0(R13), R11\n\tIMULL $0x1e35a7bd, R11\n\tSHRL  CX, R11\n\n\t// if load32(src, s) != load32(src, candidate) { continue } break\n\tMOVL 0(SI), AX\n\tMOVL (DX)(R15*1), BX\n\tCMPL AX, BX\n\tJNE  inner0\n\nfourByteMatch:\n\t// As per the encode_other.go code:\n\t//\n\t// A 4-byte match has been found. We'll later see etc.\n\n\t// !!! Jump to a fast path for short (<= 16 byte) literals. See the comment\n\t// on inputMargin in encode.go.\n\tMOVQ SI, AX\n\tSUBQ R10, AX\n\tCMPQ AX, $16\n\tJLE  emitLiteralFastPath\n\n\t// ----------------------------------------\n\t// Begin inline of the emitLiteral call.\n\t//\n\t// d += emitLiteral(dst[d:], src[nextEmit:s])\n\n\tMOVL AX, BX\n\tSUBL $1, BX\n\n\tCMPL BX, $60\n\tJLT  inlineEmitLiteralOneByte\n\tCMPL BX, $256\n\tJLT  inlineEmitLiteralTwoBytes\n\ninlineEmitLiteralThreeBytes:\n\tMOVB $0xf4, 0(DI)\n\tMOVW BX, 1(DI)\n\tADDQ $3, DI\n\tJMP  inlineEmitLiteralMemmove\n\ninlineEmitLiteralTwoBytes:\n\tMOVB $0xf0, 0(DI)\n\tMOVB BX, 1(DI)\n\tADDQ $2, DI\n\tJMP  inlineEmitLiteralMemmove\n\ninlineEmitLiteralOneByte:\n\tSHLB $2, BX\n\tMOVB BX, 0(DI)\n\tADDQ $1, DI\n\ninlineEmitLiteralMemmove:\n\t// Spill local variables (registers) onto the stack; call; unspill.\n\t//\n\t// copy(dst[i:], lit)\n\t//\n\t// This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push\n\t// DI, R10 and AX as arguments.\n\tMOVQ DI, 0(SP)\n\tMOVQ R10, 8(SP)\n\tMOVQ AX, 16(SP)\n\tADDQ AX, DI              // Finish the \"d +=\" part of \"d += emitLiteral(etc)\".\n\tMOVQ SI, 72(SP)\n\tMOVQ DI, 80(SP)\n\tMOVQ R15, 112(SP)\n\tCALL runtime·memmove(SB)\n\tMOVQ 56(SP), CX\n\tMOVQ 64(SP), DX\n\tMOVQ 72(SP), SI\n\tMOVQ 80(SP), DI\n\tMOVQ 88(SP), R9\n\tMOVQ 112(SP), R15\n\tJMP  inner1\n\ninlineEmitLiteralEnd:\n\t// End inline of the emitLiteral call.\n\t// ----------------------------------------\n\nemitLiteralFastPath:\n\t// !!! Emit the 1-byte encoding \"uint8(len(lit)-1)<<2\".\n\tMOVB AX, BX\n\tSUBB $1, BX\n\tSHLB $2, BX\n\tMOVB BX, (DI)\n\tADDQ $1, DI\n\n\t// !!! Implement the copy from lit to dst as a 16-byte load and store.\n\t// (Encode's documentation says that dst and src must not overlap.)\n\t//\n\t// This always copies 16 bytes, instead of only len(lit) bytes, but that's\n\t// OK. Subsequent iterations will fix up the overrun.\n\t//\n\t// Note that on amd64, it is legal and cheap to issue unaligned 8-byte or\n\t// 16-byte loads and stores. This technique probably wouldn't be as\n\t// effective on architectures that are fussier about alignment.\n\tMOVOU 0(R10), X0\n\tMOVOU X0, 0(DI)\n\tADDQ  AX, DI\n\ninner1:\n\t// for { etc }\n\n\t// base := s\n\tMOVQ SI, R12\n\n\t// !!! offset := base - candidate\n\tMOVQ R12, R11\n\tSUBQ R15, R11\n\tSUBQ DX, R11\n\n\t// ----------------------------------------\n\t// Begin inline of the extendMatch call.\n\t//\n\t// s = extendMatch(src, candidate+4, s+4)\n\n\t// !!! R14 = &src[len(src)]\n\tMOVQ src_len+32(FP), R14\n\tADDQ DX, R14\n\n\t// !!! R13 = &src[len(src) - 8]\n\tMOVQ R14, R13\n\tSUBQ $8, R13\n\n\t// !!! R15 = &src[candidate + 4]\n\tADDQ $4, R15\n\tADDQ DX, R15\n\n\t// !!! s += 4\n\tADDQ $4, SI\n\ninlineExtendMatchCmp8:\n\t// As long as we are 8 or more bytes before the end of src, we can load and\n\t// compare 8 bytes at a time. If those 8 bytes are equal, repeat.\n\tCMPQ SI, R13\n\tJA   inlineExtendMatchCmp1\n\tMOVQ (R15), AX\n\tMOVQ (SI), BX\n\tCMPQ AX, BX\n\tJNE  inlineExtendMatchBSF\n\tADDQ $8, R15\n\tADDQ $8, SI\n\tJMP  inlineExtendMatchCmp8\n\ninlineExtendMatchBSF:\n\t// If those 8 bytes were not equal, XOR the two 8 byte values, and return\n\t// the index of the first byte that differs. The BSF instruction finds the\n\t// least significant 1 bit, the amd64 architecture is little-endian, and\n\t// the shift by 3 converts a bit index to a byte index.\n\tXORQ AX, BX\n\tBSFQ BX, BX\n\tSHRQ $3, BX\n\tADDQ BX, SI\n\tJMP  inlineExtendMatchEnd\n\ninlineExtendMatchCmp1:\n\t// In src's tail, compare 1 byte at a time.\n\tCMPQ SI, R14\n\tJAE  inlineExtendMatchEnd\n\tMOVB (R15), AX\n\tMOVB (SI), BX\n\tCMPB AX, BX\n\tJNE  inlineExtendMatchEnd\n\tADDQ $1, R15\n\tADDQ $1, SI\n\tJMP  inlineExtendMatchCmp1\n\ninlineExtendMatchEnd:\n\t// End inline of the extendMatch call.\n\t// ----------------------------------------\n\n\t// ----------------------------------------\n\t// Begin inline of the emitCopy call.\n\t//\n\t// d += emitCopy(dst[d:], base-candidate, s-base)\n\n\t// !!! length := s - base\n\tMOVQ SI, AX\n\tSUBQ R12, AX\n\ninlineEmitCopyLoop0:\n\t// for length >= 68 { etc }\n\tCMPL AX, $68\n\tJLT  inlineEmitCopyStep1\n\n\t// Emit a length 64 copy, encoded as 3 bytes.\n\tMOVB $0xfe, 0(DI)\n\tMOVW R11, 1(DI)\n\tADDQ $3, DI\n\tSUBL $64, AX\n\tJMP  inlineEmitCopyLoop0\n\ninlineEmitCopyStep1:\n\t// if length > 64 { etc }\n\tCMPL AX, $64\n\tJLE  inlineEmitCopyStep2\n\n\t// Emit a length 60 copy, encoded as 3 bytes.\n\tMOVB $0xee, 0(DI)\n\tMOVW R11, 1(DI)\n\tADDQ $3, DI\n\tSUBL $60, AX\n\ninlineEmitCopyStep2:\n\t// if length >= 12 || offset >= 2048 { goto inlineEmitCopyStep3 }\n\tCMPL AX, $12\n\tJGE  inlineEmitCopyStep3\n\tCMPL R11, $2048\n\tJGE  inlineEmitCopyStep3\n\n\t// Emit the remaining copy, encoded as 2 bytes.\n\tMOVB R11, 1(DI)\n\tSHRL $8, R11\n\tSHLB $5, R11\n\tSUBB $4, AX\n\tSHLB $2, AX\n\tORB  AX, R11\n\tORB  $1, R11\n\tMOVB R11, 0(DI)\n\tADDQ $2, DI\n\tJMP  inlineEmitCopyEnd\n\ninlineEmitCopyStep3:\n\t// Emit the remaining copy, encoded as 3 bytes.\n\tSUBL $1, AX\n\tSHLB $2, AX\n\tORB  $2, AX\n\tMOVB AX, 0(DI)\n\tMOVW R11, 1(DI)\n\tADDQ $3, DI\n\ninlineEmitCopyEnd:\n\t// End inline of the emitCopy call.\n\t// ----------------------------------------\n\n\t// nextEmit = s\n\tMOVQ SI, R10\n\n\t// if s >= sLimit { goto emitRemainder }\n\tMOVQ SI, AX\n\tSUBQ DX, AX\n\tCMPQ AX, R9\n\tJAE  emitRemainder\n\n\t// As per the encode_other.go code:\n\t//\n\t// We could immediately etc.\n\n\t// x := load64(src, s-1)\n\tMOVQ -1(SI), R14\n\n\t// prevHash := hash(uint32(x>>0), shift)\n\tMOVL  R14, R11\n\tIMULL $0x1e35a7bd, R11\n\tSHRL  CX, R11\n\n\t// table[prevHash] = uint16(s-1)\n\tMOVQ SI, AX\n\tSUBQ DX, AX\n\tSUBQ $1, AX\n\n\t// XXX: MOVW AX, table-32768(SP)(R11*2)\n\t// XXX: 66 42 89 44 5c 78       mov    %ax,0x78(%rsp,%r11,2)\n\tBYTE $0x66\n\tBYTE $0x42\n\tBYTE $0x89\n\tBYTE $0x44\n\tBYTE $0x5c\n\tBYTE $0x78\n\n\t// currHash := hash(uint32(x>>8), shift)\n\tSHRQ  $8, R14\n\tMOVL  R14, R11\n\tIMULL $0x1e35a7bd, R11\n\tSHRL  CX, R11\n\n\t// candidate = int(table[currHash])\n\t// XXX: MOVWQZX table-32768(SP)(R11*2), R15\n\t// XXX: 4e 0f b7 7c 5c 78       movzwq 0x78(%rsp,%r11,2),%r15\n\tBYTE $0x4e\n\tBYTE $0x0f\n\tBYTE $0xb7\n\tBYTE $0x7c\n\tBYTE $0x5c\n\tBYTE $0x78\n\n\t// table[currHash] = uint16(s)\n\tADDQ $1, AX\n\n\t// XXX: MOVW AX, table-32768(SP)(R11*2)\n\t// XXX: 66 42 89 44 5c 78       mov    %ax,0x78(%rsp,%r11,2)\n\tBYTE $0x66\n\tBYTE $0x42\n\tBYTE $0x89\n\tBYTE $0x44\n\tBYTE $0x5c\n\tBYTE $0x78\n\n\t// if uint32(x>>8) == load32(src, candidate) { continue }\n\tMOVL (DX)(R15*1), BX\n\tCMPL R14, BX\n\tJEQ  inner1\n\n\t// nextHash = hash(uint32(x>>16), shift)\n\tSHRQ  $8, R14\n\tMOVL  R14, R11\n\tIMULL $0x1e35a7bd, R11\n\tSHRL  CX, R11\n\n\t// s++\n\tADDQ $1, SI\n\n\t// break out of the inner1 for loop, i.e. continue the outer loop.\n\tJMP outer\n\nemitRemainder:\n\t// if nextEmit < len(src) { etc }\n\tMOVQ src_len+32(FP), AX\n\tADDQ DX, AX\n\tCMPQ R10, AX\n\tJEQ  encodeBlockEnd\n\n\t// d += emitLiteral(dst[d:], src[nextEmit:])\n\t//\n\t// Push args.\n\tMOVQ DI, 0(SP)\n\tMOVQ $0, 8(SP)   // Unnecessary, as the callee ignores it, but conservative.\n\tMOVQ $0, 16(SP)  // Unnecessary, as the callee ignores it, but conservative.\n\tMOVQ R10, 24(SP)\n\tSUBQ R10, AX\n\tMOVQ AX, 32(SP)\n\tMOVQ AX, 40(SP)  // Unnecessary, as the callee ignores it, but conservative.\n\n\t// Spill local variables (registers) onto the stack; call; unspill.\n\tMOVQ DI, 80(SP)\n\tCALL ·emitLiteral(SB)\n\tMOVQ 80(SP), DI\n\n\t// Finish the \"d +=\" part of \"d += emitLiteral(etc)\".\n\tADDQ 48(SP), DI\n\nencodeBlockEnd:\n\tMOVQ dst_base+0(FP), AX\n\tSUBQ AX, DI\n\tMOVQ DI, d+48(FP)\n\tRET\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/encode_other.go",
    "content": "// Copyright 2016 The Snappy-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !amd64 appengine !gc noasm\n\npackage snappy\n\nfunc load32(b []byte, i int) uint32 {\n\tb = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line.\n\treturn uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24\n}\n\nfunc load64(b []byte, i int) uint64 {\n\tb = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line.\n\treturn uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |\n\t\tuint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56\n}\n\n// emitLiteral writes a literal chunk and returns the number of bytes written.\n//\n// It assumes that:\n//\tdst is long enough to hold the encoded bytes\n//\t1 <= len(lit) && len(lit) <= 65536\nfunc emitLiteral(dst, lit []byte) int {\n\ti, n := 0, uint(len(lit)-1)\n\tswitch {\n\tcase n < 60:\n\t\tdst[0] = uint8(n)<<2 | tagLiteral\n\t\ti = 1\n\tcase n < 1<<8:\n\t\tdst[0] = 60<<2 | tagLiteral\n\t\tdst[1] = uint8(n)\n\t\ti = 2\n\tdefault:\n\t\tdst[0] = 61<<2 | tagLiteral\n\t\tdst[1] = uint8(n)\n\t\tdst[2] = uint8(n >> 8)\n\t\ti = 3\n\t}\n\treturn i + copy(dst[i:], lit)\n}\n\n// emitCopy writes a copy chunk and returns the number of bytes written.\n//\n// It assumes that:\n//\tdst is long enough to hold the encoded bytes\n//\t1 <= offset && offset <= 65535\n//\t4 <= length && length <= 65535\nfunc emitCopy(dst []byte, offset, length int) int {\n\ti := 0\n\t// The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The\n\t// threshold for this loop is a little higher (at 68 = 64 + 4), and the\n\t// length emitted down below is is a little lower (at 60 = 64 - 4), because\n\t// it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed\n\t// by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as\n\t// a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as\n\t// 3+3 bytes). The magic 4 in the 64±4 is because the minimum length for a\n\t// tagCopy1 op is 4 bytes, which is why a length 3 copy has to be an\n\t// encodes-as-3-bytes tagCopy2 instead of an encodes-as-2-bytes tagCopy1.\n\tfor length >= 68 {\n\t\t// Emit a length 64 copy, encoded as 3 bytes.\n\t\tdst[i+0] = 63<<2 | tagCopy2\n\t\tdst[i+1] = uint8(offset)\n\t\tdst[i+2] = uint8(offset >> 8)\n\t\ti += 3\n\t\tlength -= 64\n\t}\n\tif length > 64 {\n\t\t// Emit a length 60 copy, encoded as 3 bytes.\n\t\tdst[i+0] = 59<<2 | tagCopy2\n\t\tdst[i+1] = uint8(offset)\n\t\tdst[i+2] = uint8(offset >> 8)\n\t\ti += 3\n\t\tlength -= 60\n\t}\n\tif length >= 12 || offset >= 2048 {\n\t\t// Emit the remaining copy, encoded as 3 bytes.\n\t\tdst[i+0] = uint8(length-1)<<2 | tagCopy2\n\t\tdst[i+1] = uint8(offset)\n\t\tdst[i+2] = uint8(offset >> 8)\n\t\treturn i + 3\n\t}\n\t// Emit the remaining copy, encoded as 2 bytes.\n\tdst[i+0] = uint8(offset>>8)<<5 | uint8(length-4)<<2 | tagCopy1\n\tdst[i+1] = uint8(offset)\n\treturn i + 2\n}\n\n// extendMatch returns the largest k such that k <= len(src) and that\n// src[i:i+k-j] and src[j:k] have the same contents.\n//\n// It assumes that:\n//\t0 <= i && i < j && j <= len(src)\nfunc extendMatch(src []byte, i, j int) int {\n\tfor ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 {\n\t}\n\treturn j\n}\n\nfunc hash(u, shift uint32) uint32 {\n\treturn (u * 0x1e35a7bd) >> shift\n}\n\n// encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It\n// assumes that the varint-encoded length of the decompressed bytes has already\n// been written.\n//\n// It also assumes that:\n//\tlen(dst) >= MaxEncodedLen(len(src)) &&\n// \tminNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize\nfunc encodeBlock(dst, src []byte) (d int) {\n\t// Initialize the hash table. Its size ranges from 1<<8 to 1<<14 inclusive.\n\t// The table element type is uint16, as s < sLimit and sLimit < len(src)\n\t// and len(src) <= maxBlockSize and maxBlockSize == 65536.\n\tconst (\n\t\tmaxTableSize = 1 << 14\n\t\t// tableMask is redundant, but helps the compiler eliminate bounds\n\t\t// checks.\n\t\ttableMask = maxTableSize - 1\n\t)\n\tshift := uint32(32 - 8)\n\tfor tableSize := 1 << 8; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 {\n\t\tshift--\n\t}\n\t// In Go, all array elements are zero-initialized, so there is no advantage\n\t// to a smaller tableSize per se. However, it matches the C++ algorithm,\n\t// and in the asm versions of this code, we can get away with zeroing only\n\t// the first tableSize elements.\n\tvar table [maxTableSize]uint16\n\n\t// sLimit is when to stop looking for offset/length copies. The inputMargin\n\t// lets us use a fast path for emitLiteral in the main loop, while we are\n\t// looking for copies.\n\tsLimit := len(src) - inputMargin\n\n\t// nextEmit is where in src the next emitLiteral should start from.\n\tnextEmit := 0\n\n\t// The encoded form must start with a literal, as there are no previous\n\t// bytes to copy, so we start looking for hash matches at s == 1.\n\ts := 1\n\tnextHash := hash(load32(src, s), shift)\n\n\tfor {\n\t\t// Copied from the C++ snappy implementation:\n\t\t//\n\t\t// Heuristic match skipping: If 32 bytes are scanned with no matches\n\t\t// found, start looking only at every other byte. If 32 more bytes are\n\t\t// scanned (or skipped), look at every third byte, etc.. When a match\n\t\t// is found, immediately go back to looking at every byte. This is a\n\t\t// small loss (~5% performance, ~0.1% density) for compressible data\n\t\t// due to more bookkeeping, but for non-compressible data (such as\n\t\t// JPEG) it's a huge win since the compressor quickly \"realizes\" the\n\t\t// data is incompressible and doesn't bother looking for matches\n\t\t// everywhere.\n\t\t//\n\t\t// The \"skip\" variable keeps track of how many bytes there are since\n\t\t// the last match; dividing it by 32 (ie. right-shifting by five) gives\n\t\t// the number of bytes to move ahead for each iteration.\n\t\tskip := 32\n\n\t\tnextS := s\n\t\tcandidate := 0\n\t\tfor {\n\t\t\ts = nextS\n\t\t\tbytesBetweenHashLookups := skip >> 5\n\t\t\tnextS = s + bytesBetweenHashLookups\n\t\t\tskip += bytesBetweenHashLookups\n\t\t\tif nextS > sLimit {\n\t\t\t\tgoto emitRemainder\n\t\t\t}\n\t\t\tcandidate = int(table[nextHash&tableMask])\n\t\t\ttable[nextHash&tableMask] = uint16(s)\n\t\t\tnextHash = hash(load32(src, nextS), shift)\n\t\t\tif load32(src, s) == load32(src, candidate) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\t// A 4-byte match has been found. We'll later see if more than 4 bytes\n\t\t// match. But, prior to the match, src[nextEmit:s] are unmatched. Emit\n\t\t// them as literal bytes.\n\t\td += emitLiteral(dst[d:], src[nextEmit:s])\n\n\t\t// Call emitCopy, and then see if another emitCopy could be our next\n\t\t// move. Repeat until we find no match for the input immediately after\n\t\t// what was consumed by the last emitCopy call.\n\t\t//\n\t\t// If we exit this loop normally then we need to call emitLiteral next,\n\t\t// though we don't yet know how big the literal will be. We handle that\n\t\t// by proceeding to the next iteration of the main loop. We also can\n\t\t// exit this loop via goto if we get close to exhausting the input.\n\t\tfor {\n\t\t\t// Invariant: we have a 4-byte match at s, and no need to emit any\n\t\t\t// literal bytes prior to s.\n\t\t\tbase := s\n\n\t\t\t// Extend the 4-byte match as long as possible.\n\t\t\t//\n\t\t\t// This is an inlined version of:\n\t\t\t//\ts = extendMatch(src, candidate+4, s+4)\n\t\t\ts += 4\n\t\t\tfor i := candidate + 4; s < len(src) && src[i] == src[s]; i, s = i+1, s+1 {\n\t\t\t}\n\n\t\t\td += emitCopy(dst[d:], base-candidate, s-base)\n\t\t\tnextEmit = s\n\t\t\tif s >= sLimit {\n\t\t\t\tgoto emitRemainder\n\t\t\t}\n\n\t\t\t// We could immediately start working at s now, but to improve\n\t\t\t// compression we first update the hash table at s-1 and at s. If\n\t\t\t// another emitCopy is not our next move, also calculate nextHash\n\t\t\t// at s+1. At least on GOARCH=amd64, these three hash calculations\n\t\t\t// are faster as one load64 call (with some shifts) instead of\n\t\t\t// three load32 calls.\n\t\t\tx := load64(src, s-1)\n\t\t\tprevHash := hash(uint32(x>>0), shift)\n\t\t\ttable[prevHash&tableMask] = uint16(s - 1)\n\t\t\tcurrHash := hash(uint32(x>>8), shift)\n\t\t\tcandidate = int(table[currHash&tableMask])\n\t\t\ttable[currHash&tableMask] = uint16(s)\n\t\t\tif uint32(x>>8) != load32(src, candidate) {\n\t\t\t\tnextHash = hash(uint32(x>>16), shift)\n\t\t\t\ts++\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\nemitRemainder:\n\tif nextEmit < len(src) {\n\t\td += emitLiteral(dst[d:], src[nextEmit:])\n\t}\n\treturn d\n}\n"
  },
  {
    "path": "vendor/github.com/golang/snappy/snappy.go",
    "content": "// Copyright 2011 The Snappy-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package snappy implements the snappy block-based compression format.\n// It aims for very high speeds and reasonable compression.\n//\n// The C++ snappy implementation is at https://github.com/google/snappy\npackage snappy // import \"github.com/golang/snappy\"\n\nimport (\n\t\"hash/crc32\"\n)\n\n/*\nEach encoded block begins with the varint-encoded length of the decoded data,\nfollowed by a sequence of chunks. Chunks begin and end on byte boundaries. The\nfirst byte of each chunk is broken into its 2 least and 6 most significant bits\ncalled l and m: l ranges in [0, 4) and m ranges in [0, 64). l is the chunk tag.\nZero means a literal tag. All other values mean a copy tag.\n\nFor literal tags:\n  - If m < 60, the next 1 + m bytes are literal bytes.\n  - Otherwise, let n be the little-endian unsigned integer denoted by the next\n    m - 59 bytes. The next 1 + n bytes after that are literal bytes.\n\nFor copy tags, length bytes are copied from offset bytes ago, in the style of\nLempel-Ziv compression algorithms. In particular:\n  - For l == 1, the offset ranges in [0, 1<<11) and the length in [4, 12).\n    The length is 4 + the low 3 bits of m. The high 3 bits of m form bits 8-10\n    of the offset. The next byte is bits 0-7 of the offset.\n  - For l == 2, the offset ranges in [0, 1<<16) and the length in [1, 65).\n    The length is 1 + m. The offset is the little-endian unsigned integer\n    denoted by the next 2 bytes.\n  - For l == 3, this tag is a legacy format that is no longer issued by most\n    encoders. Nonetheless, the offset ranges in [0, 1<<32) and the length in\n    [1, 65). The length is 1 + m. The offset is the little-endian unsigned\n    integer denoted by the next 4 bytes.\n*/\nconst (\n\ttagLiteral = 0x00\n\ttagCopy1   = 0x01\n\ttagCopy2   = 0x02\n\ttagCopy4   = 0x03\n)\n\nconst (\n\tchecksumSize    = 4\n\tchunkHeaderSize = 4\n\tmagicChunk      = \"\\xff\\x06\\x00\\x00\" + magicBody\n\tmagicBody       = \"sNaPpY\"\n\n\t// maxBlockSize is the maximum size of the input to encodeBlock. It is not\n\t// part of the wire format per se, but some parts of the encoder assume\n\t// that an offset fits into a uint16.\n\t//\n\t// Also, for the framing format (Writer type instead of Encode function),\n\t// https://github.com/google/snappy/blob/master/framing_format.txt says\n\t// that \"the uncompressed data in a chunk must be no longer than 65536\n\t// bytes\".\n\tmaxBlockSize = 65536\n\n\t// maxEncodedLenOfMaxBlockSize equals MaxEncodedLen(maxBlockSize), but is\n\t// hard coded to be a const instead of a variable, so that obufLen can also\n\t// be a const. Their equivalence is confirmed by\n\t// TestMaxEncodedLenOfMaxBlockSize.\n\tmaxEncodedLenOfMaxBlockSize = 76490\n\n\tobufHeaderLen = len(magicChunk) + checksumSize + chunkHeaderSize\n\tobufLen       = obufHeaderLen + maxEncodedLenOfMaxBlockSize\n)\n\nconst (\n\tchunkTypeCompressedData   = 0x00\n\tchunkTypeUncompressedData = 0x01\n\tchunkTypePadding          = 0xfe\n\tchunkTypeStreamIdentifier = 0xff\n)\n\nvar crcTable = crc32.MakeTable(crc32.Castagnoli)\n\n// crc implements the checksum specified in section 3 of\n// https://github.com/google/snappy/blob/master/framing_format.txt\nfunc crc(b []byte) uint32 {\n\tc := crc32.Update(0, crcTable, b)\n\treturn uint32(c>>15|c<<17) + 0xa282ead8\n}\n"
  },
  {
    "path": "vendor/github.com/gosuri/uilive/LICENSE",
    "content": "MIT License\n===========\n\nCopyright (c) 2015, Greg Osuri\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/gosuri/uilive/README.md",
    "content": "# uilive [![GoDoc](https://godoc.org/github.com/gosuri/uilive?status.svg)](https://godoc.org/github.com/gosuri/uilive) [![Build Status](https://travis-ci.org/gosuri/uilive.svg?branch=master)](https://travis-ci.org/gosuri/uilive)\n\nuilive is a go library for updating terminal output in realtime. It provides a buffered [io.Writer](https://golang.org/pkg/io/#Writer) that is flushed at a timed interval. uilive powers [uiprogress](https://github.com/gosuri/uiprogress).\n\n## Usage Example\n\nCalling `uilive.New()` will create a new writer. To start rendering, simply call `writer.Start()` and update the ui by writing to the `writer`. Full source for the below example is in [example/main.go](example/main.go).\n\n```go\nwriter := uilive.New()\n// start listening for updates and render\nwriter.Start()\n\nfor i := 0; i <= 100; i++ {\n  fmt.Fprintf(writer, \"Downloading.. (%d/%d) GB\\n\", i, 100)\n  time.Sleep(time.Millisecond * 5)\n}\n\nfmt.Fprintln(writer, \"Finished: Downloaded 100GB\")\nwriter.Stop() // flush and stop rendering\n```\n\nThe above will render\n\n![example](doc/example.gif)\n\n## Installation\n\n```sh\n$ go get -v github.com/gosuri/uilive\n```\n"
  },
  {
    "path": "vendor/github.com/gosuri/uilive/doc.go",
    "content": "// Package uilive provides a writer that live updates the terminal. It provides a buffered io.Writer that is flushed at a timed interval.\npackage uilive\n"
  },
  {
    "path": "vendor/github.com/gosuri/uilive/writer.go",
    "content": "package uilive\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n)\n\n// ESC is the ASCII code for escape character\nconst ESC = 27\n\n// RefreshInterval is the default refresh interval to update the ui\nvar RefreshInterval = time.Millisecond\n\n// Out is the default output writer for the Writer\nvar Out = os.Stdout\n\n// ErrClosedPipe is the error returned when trying to writer is not listening\nvar ErrClosedPipe = errors.New(\"uilive: read/write on closed pipe\")\n\n// FdWriter is a writer with a file descriptor.\ntype FdWriter interface {\n\tio.Writer\n\tFd() uintptr\n}\n\n// Writer is a buffered the writer that updates the terminal. The contents of writer will be flushed on a timed interval or when Flush is called.\ntype Writer struct {\n\t// Out is the writer to write to\n\tOut io.Writer\n\n\t// RefreshInterval is the time the UI sould refresh\n\tRefreshInterval time.Duration\n\n\tticker *time.Ticker\n\ttdone  chan bool\n\n\tbuf       bytes.Buffer\n\tmtx       *sync.Mutex\n\tlineCount int\n}\n\ntype bypass struct {\n\twriter *Writer\n}\n\n// New returns a new Writer with defaults\nfunc New() *Writer {\n\treturn &Writer{\n\t\tOut:             Out,\n\t\tRefreshInterval: RefreshInterval,\n\n\t\tmtx: &sync.Mutex{},\n\t}\n}\n\n// Flush writes to the out and resets the buffer. It should be called after the last call to Write to ensure that any data buffered in the Writer is written to output.\n// Any incomplete escape sequence at the end is considered complete for formatting purposes.\n// An error is returned if the contents of the buffer cannot be written to the underlying output stream\nfunc (w *Writer) Flush() error {\n\tw.mtx.Lock()\n\tdefer w.mtx.Unlock()\n\n\t// do nothing is  buffer is empty\n\tif len(w.buf.Bytes()) == 0 {\n\t\treturn nil\n\t}\n\tw.clearLines()\n\n\tlines := 0\n\tfor _, b := range w.buf.Bytes() {\n\t\tif b == '\\n' {\n\t\t\tlines++\n\t\t}\n\t}\n\tw.lineCount = lines\n\t_, err := w.Out.Write(w.buf.Bytes())\n\tw.buf.Reset()\n\treturn err\n}\n\n// Start starts the listener in a non-blocking manner\nfunc (w *Writer) Start() {\n\tif w.ticker == nil {\n\t\tw.ticker = time.NewTicker(w.RefreshInterval)\n\t\tw.tdone = make(chan bool, 1)\n\t}\n\n\tgo w.Listen()\n}\n\n// Stop stops the listener that updates the terminal\nfunc (w *Writer) Stop() {\n\tw.Flush()\n\tclose(w.tdone)\n}\n\n// Listen listens for updates to the writer's buffer and flushes to the out provided. It blocks the runtime.\nfunc (w *Writer) Listen() {\n\tfor {\n\t\tselect {\n\t\tcase <-w.ticker.C:\n\t\t\tif w.ticker != nil {\n\t\t\t\tw.Flush()\n\t\t\t}\n\t\tcase <-w.tdone:\n\t\t\tw.mtx.Lock()\n\t\t\tw.ticker.Stop()\n\t\t\tw.ticker = nil\n\t\t\tw.mtx.Unlock()\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Write save the contents of b to its buffers. The only errors returned are ones encountered while writing to the underlying buffer.\nfunc (w *Writer) Write(b []byte) (n int, err error) {\n\tw.mtx.Lock()\n\tdefer w.mtx.Unlock()\n\treturn w.buf.Write(b)\n}\n\n// Bypass creates an io.Writer which allows non-buffered output to be written to the underlying output\nfunc (w *Writer) Bypass() io.Writer {\n\treturn &bypass{writer: w}\n}\n\nfunc (b *bypass) Write(p []byte) (n int, err error) {\n\tb.writer.mtx.Lock()\n\tdefer b.writer.mtx.Unlock()\n\n\tb.writer.clearLines()\n\tb.writer.lineCount = 0\n\treturn b.writer.Out.Write(p)\n}\n"
  },
  {
    "path": "vendor/github.com/gosuri/uilive/writer_posix.go",
    "content": "// +build !windows\n\npackage uilive\n\nimport (\n\t\"fmt\"\n)\n\nfunc (w *Writer) clearLines() {\n\tfor i := 0; i < w.lineCount; i++ {\n\t\tfmt.Fprintf(w.Out, \"%c[2K\", ESC)     // clear the line\n\t\tfmt.Fprintf(w.Out, \"%c[%dA\", ESC, 1) // move the cursor up\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/gosuri/uilive/writer_windows.go",
    "content": "// +build windows\n\npackage uilive\n\nimport (\n\t\"fmt\"\n\t\"github.com/mattn/go-isatty\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar kernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\n\nvar (\n\tprocGetConsoleScreenBufferInfo = kernel32.NewProc(\"GetConsoleScreenBufferInfo\")\n\tprocSetConsoleCursorPosition   = kernel32.NewProc(\"SetConsoleCursorPosition\")\n\tprocFillConsoleOutputCharacter = kernel32.NewProc(\"FillConsoleOutputCharacterW\")\n\tprocFillConsoleOutputAttribute = kernel32.NewProc(\"FillConsoleOutputAttribute\")\n)\n\ntype short int16\ntype dword uint32\ntype word uint16\n\ntype coord struct {\n\tx short\n\ty short\n}\n\ntype smallRect struct {\n\tleft   short\n\ttop    short\n\tright  short\n\tbottom short\n}\n\ntype consoleScreenBufferInfo struct {\n\tsize              coord\n\tcursorPosition    coord\n\tattributes        word\n\twindow            smallRect\n\tmaximumWindowSize coord\n}\n\nfunc (w *Writer) clearLines() {\n\tf, ok := w.Out.(FdWriter)\n\tif ok && !isatty.IsTerminal(f.Fd()) {\n\t\tok = false\n\t}\n\tif !ok {\n\t\tfor i := 0; i < w.lineCount; i++ {\n\t\t\tfmt.Fprintf(w.Out, \"%c[%dA\", ESC, 0) // move the cursor up\n\t\t\tfmt.Fprintf(w.Out, \"%c[2K\\r\", ESC)   // clear the line\n\t\t}\n\t\treturn\n\t}\n\tfd := f.Fd()\n\tvar csbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(fd, uintptr(unsafe.Pointer(&csbi)))\n\n\tfor i := 0; i < w.lineCount; i++ {\n\t\t// move the cursor up\n\t\tcsbi.cursorPosition.y--\n\t\tprocSetConsoleCursorPosition.Call(fd, uintptr(*(*int32)(unsafe.Pointer(&csbi.cursorPosition))))\n\t\t// clear the line\n\t\tcursor := coord{\n\t\t\tx: csbi.window.left,\n\t\t\ty: csbi.window.top + csbi.cursorPosition.y,\n\t\t}\n\t\tvar count, w dword\n\t\tcount = dword(csbi.size.x)\n\t\tprocFillConsoleOutputCharacter.Call(fd, uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&w)))\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/gosuri/uiprogress/LICENSE",
    "content": "MIT License\n===========\n\nCopyright (c) 2015, Greg Osuri\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/gosuri/uiprogress/Makefile",
    "content": "test:\n\t@go test -race .\n\t@go test -race ./util/strutil\n\nexamples:\n\tgo run -race example/full/full.go\n\tgo run -race example/incr/incr.go\n\tgo run -race example/multi/multi.go\n\tgo run -race example/simple/simple.go\n\n.PHONY: test examples\n"
  },
  {
    "path": "vendor/github.com/gosuri/uiprogress/README.md",
    "content": "# uiprogress [![GoDoc](https://godoc.org/github.com/gosuri/uiprogress?status.svg)](https://godoc.org/github.com/gosuri/uiprogress) [![Build Status](https://travis-ci.org/gosuri/uiprogress.svg?branch=master)](https://travis-ci.org/gosuri/uiprogress)\n\nA Go library to render progress bars in terminal applications. It provides a set of flexible features with a customizable API.\n\n![example](doc/example_full.gif)\n\nProgress bars improve readability for terminal applications with long outputs by providing a concise feedback loop.\n\n## Features\n\n* __Multiple Bars__: uiprogress can render multiple progress bars that can be tracked concurrently\n* __Dynamic Addition__:  Add additional progress bars any time, even after the progress tracking has started\n* __Prepend and Append Functions__: Append or prepend completion percent and time elapsed to the progress bars\n* __Custom Decorator Functions__: Add custom functions around the bar along with helper functions\n\n## Usage\n\nTo start listening for progress bars, call `uiprogress.Start()` and add a progress bar using `uiprogress.AddBar(total int)`. Update the progress using `bar.Incr()` or `bar.Set(n int)`. Full source code for the below example is available at [example/simple/simple.go](example/simple/simple.go) \n\n```go\nuiprogress.Start()            // start rendering\nbar := uiprogress.AddBar(100) // Add a new bar\n\n// optionally, append and prepend completion and elapsed time\nbar.AppendCompleted()\nbar.PrependElapsed()\n\nfor bar.Incr() {\n  time.Sleep(time.Millisecond * 20)\n}\n```\n\nThis will render the below in the terminal\n\n![example](doc/example_simple.gif)\n\n### Using Custom Decorators\n\nYou can also add a custom decorator function in addition to default `bar.AppendCompleted()` and `bar.PrependElapsed()` decorators. The below example tracks the current step for an application deploy progress. Source code for the below example is available at [example/full/full.go](example/full/full.go) \n\n```go\nvar steps = []string{\"downloading source\", \"installing deps\", \"compiling\", \"packaging\", \"seeding database\", \"deploying\", \"staring servers\"}\nbar := uiprogress.AddBar(len(steps))\n\n// prepend the current step to the bar\nbar.PrependFunc(func(b *uiprogress.Bar) string {\n  return \"app: \" + steps[b.Current()-1]\n})\n\nfor bar.Incr() {\n  time.Sleep(time.Millisecond * 10)\n}\n```\n\n### Rendering Multiple bars\n\nYou can add multiple bars using `uiprogress.AddBar(n)`. The below example demonstrates updating multiple bars concurrently and adding a new bar later in the pipeline. Source for this example is available at [example/multi/multi.go](example/multi/multi.go) \n\n```go\nwaitTime := time.Millisecond * 100\nuiprogress.Start()\n\n// start the progress bars in go routines\nvar wg sync.WaitGroup\n\nbar1 := uiprogress.AddBar(20).AppendCompleted().PrependElapsed()\nwg.Add(1)\ngo func() {\n  defer wg.Done()\n  for bar1.Incr() {\n    time.Sleep(waitTime)\n  }\n}()\n\nbar2 := uiprogress.AddBar(40).AppendCompleted().PrependElapsed()\nwg.Add(1)\ngo func() {\n  defer wg.Done()\n  for bar2.Incr() {\n    time.Sleep(waitTime)\n  }\n}()\n\ntime.Sleep(time.Second)\nbar3 := uiprogress.AddBar(20).PrependElapsed().AppendCompleted()\nwg.Add(1)\ngo func() {\n  defer wg.Done()\n  for i := 1; i <= bar3.Total; i++ {\n    bar3.Set(i)\n    time.Sleep(waitTime)\n  }\n}()\n\n// wait for all the go routines to finish\nwg.Wait()\n```\n\nThis will produce\n\n![example](doc/example_multi.gif)\n\n### `Incr` counter\n\n[Bar.Incr()](https://godoc.org/github.com/gosuri/uiprogress#Bar.Incr) is an atomic counter and can be used as a general tracker, making it ideal for tracking progress of work fanned out to a lots of go routines. The source code for the below example is available at [example/incr/incr.go](example/incr/incr.go)\n\n```go\nruntime.GOMAXPROCS(runtime.NumCPU()) // use all available cpu cores\n\n// create a new bar and prepend the task progress to the bar and fanout into 1k go routines\ncount := 1000\nbar := uiprogress.AddBar(count).AppendCompleted().PrependElapsed()\nbar.PrependFunc(func(b *uiprogress.Bar) string {\n  return fmt.Sprintf(\"Task (%d/%d)\", b.Current(), count)\n})\n\nuiprogress.Start()\nvar wg sync.WaitGroup\n\n// fanout into go routines\nfor i := 0; i < count; i++ {\n  wg.Add(1)\n  go func() {\n    defer wg.Done()\n    time.Sleep(time.Millisecond * time.Duration(rand.Intn(500)))\n    bar.Incr()\n  }()\n}\ntime.Sleep(time.Second) // wait for a second for all the go routines to finish\nwg.Wait()\nuiprogress.Stop()\n```\n\n## Installation\n\n```sh\n$ go get -v github.com/gosuri/uiprogress\n```\n## Todos\n\n- [ ] Resize bars and decorators by auto detecting window's dimensions\n- [ ] Handle more progress bars than vertical screen allows\n\n## License\n\nuiprogress is released under the MIT License. See [LICENSE](https://github.com/gosuri/uiprogress/blob/master/LICENSE).\n"
  },
  {
    "path": "vendor/github.com/gosuri/uiprogress/bar.go",
    "content": "package uiprogress\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gosuri/uiprogress/util/strutil\"\n)\n\nvar (\n\t// Fill is the default character representing completed progress\n\tFill byte = '='\n\n\t// Head is the default character that moves when progress is updated\n\tHead byte = '>'\n\n\t// Empty is the default character that represents the empty progress\n\tEmpty byte = '-'\n\n\t// LeftEnd is the default character in the left most part of the progress indicator\n\tLeftEnd byte = '['\n\n\t// RightEnd is the default character in the right most part of the progress indicator\n\tRightEnd byte = ']'\n\n\t// Width is the default width of the progress bar\n\tWidth = 70\n\n\t// ErrMaxCurrentReached is error when trying to set current value that exceeds the total value\n\tErrMaxCurrentReached = errors.New(\"errors: current value is greater total value\")\n)\n\n// Bar represents a progress bar\ntype Bar struct {\n\t// Total of the total  for the progress bar\n\tTotal int\n\n\t// LeftEnd is character in the left most part of the progress indicator. Defaults to '['\n\tLeftEnd byte\n\n\t// RightEnd is character in the right most part of the progress indicator. Defaults to ']'\n\tRightEnd byte\n\n\t// Fill is the character representing completed progress. Defaults to '='\n\tFill byte\n\n\t// Head is the character that moves when progress is updated.  Defaults to '>'\n\tHead byte\n\n\t// Empty is the character that represents the empty progress. Default is '-'\n\tEmpty byte\n\n\t// TimeStated is time progress began\n\tTimeStarted time.Time\n\n\t// Width is the width of the progress bar\n\tWidth int\n\n\t// timeElased is the time elapsed for the progress\n\ttimeElapsed time.Duration\n\tcurrent     int\n\n\tmtx *sync.RWMutex\n\n\tappendFuncs  []DecoratorFunc\n\tprependFuncs []DecoratorFunc\n}\n\n// DecoratorFunc is a function that can be prepended and appended to the progress bar\ntype DecoratorFunc func(b *Bar) string\n\n// NewBar returns a new progress bar\nfunc NewBar(total int) *Bar {\n\treturn &Bar{\n\t\tTotal:    total,\n\t\tWidth:    Width,\n\t\tLeftEnd:  LeftEnd,\n\t\tRightEnd: RightEnd,\n\t\tHead:     Head,\n\t\tFill:     Fill,\n\t\tEmpty:    Empty,\n\n\t\tmtx: &sync.RWMutex{},\n\t}\n}\n\n// Set the current count of the bar. It returns ErrMaxCurrentReached when trying n exceeds the total value. This is atomic operation and concurancy safe.\nfunc (b *Bar) Set(n int) error {\n\tb.mtx.Lock()\n\tdefer b.mtx.Unlock()\n\n\tif n > b.Total {\n\t\treturn ErrMaxCurrentReached\n\t}\n\tb.current = n\n\treturn nil\n}\n\n// Incr increments the current value by 1, time elapsed to current time and returns true. It returns false if the cursor has reached or exceeds total value.\nfunc (b *Bar) Incr() bool {\n\tb.mtx.Lock()\n\tdefer b.mtx.Unlock()\n\n\tn := b.current + 1\n\tif n > b.Total {\n\t\treturn false\n\t}\n\tvar t time.Time\n\tif b.TimeStarted == t {\n\t\tb.TimeStarted = time.Now()\n\t}\n\tb.timeElapsed = time.Since(b.TimeStarted)\n\tb.current = n\n\treturn true\n}\n\n// Current returns the current progress of the bar\nfunc (b *Bar) Current() int {\n\tb.mtx.RLock()\n\tdefer b.mtx.RUnlock()\n\treturn b.current\n}\n\n// AppendFunc runs the decorator function and renders the output on the right of the progress bar\nfunc (b *Bar) AppendFunc(f DecoratorFunc) *Bar {\n\tb.mtx.Lock()\n\tdefer b.mtx.Unlock()\n\tb.appendFuncs = append(b.appendFuncs, f)\n\treturn b\n}\n\n// AppendCompleted appends the completion percent to the progress bar\nfunc (b *Bar) AppendCompleted() *Bar {\n\tb.AppendFunc(func(b *Bar) string {\n\t\treturn b.CompletedPercentString()\n\t})\n\treturn b\n}\n\n// AppendElapsed appends the time elapsed the be progress bar\nfunc (b *Bar) AppendElapsed() *Bar {\n\tb.AppendFunc(func(b *Bar) string {\n\t\treturn strutil.PadLeft(b.TimeElapsedString(), 5, ' ')\n\t})\n\treturn b\n}\n\n// PrependFunc runs decorator function and render the output left the progress bar\nfunc (b *Bar) PrependFunc(f DecoratorFunc) *Bar {\n\tb.mtx.Lock()\n\tdefer b.mtx.Unlock()\n\tb.prependFuncs = append(b.prependFuncs, f)\n\treturn b\n}\n\n// PrependCompleted prepends the precent completed to the progress bar\nfunc (b *Bar) PrependCompleted() *Bar {\n\tb.PrependFunc(func(b *Bar) string {\n\t\treturn b.CompletedPercentString()\n\t})\n\treturn b\n}\n\n// PrependElapsed prepends the time elapsed to the begining of the bar\nfunc (b *Bar) PrependElapsed() *Bar {\n\tb.PrependFunc(func(b *Bar) string {\n\t\treturn strutil.PadLeft(b.TimeElapsedString(), 5, ' ')\n\t})\n\treturn b\n}\n\n// Bytes returns the byte presentation of the progress bar\nfunc (b *Bar) Bytes() []byte {\n\tcompletedWidth := int(float64(b.Width) * (b.CompletedPercent() / 100.00))\n\n\t// add fill and empty bits\n\tvar buf bytes.Buffer\n\tfor i := 0; i < completedWidth; i++ {\n\t\tbuf.WriteByte(b.Fill)\n\t}\n\tfor i := 0; i < b.Width-completedWidth; i++ {\n\t\tbuf.WriteByte(b.Empty)\n\t}\n\n\t// set head bit\n\tpb := buf.Bytes()\n\tif completedWidth > 0 && completedWidth < b.Width {\n\t\tpb[completedWidth-1] = b.Head\n\t}\n\n\t// set left and right ends bits\n\tpb[0], pb[len(pb)-1] = b.LeftEnd, b.RightEnd\n\n\t// render append functions to the right of the bar\n\tfor _, f := range b.appendFuncs {\n\t\tpb = append(pb, ' ')\n\t\tpb = append(pb, []byte(f(b))...)\n\t}\n\n\t// render prepend functions to the left of the bar\n\tfor _, f := range b.prependFuncs {\n\t\targs := []byte(f(b))\n\t\targs = append(args, ' ')\n\t\tpb = append(args, pb...)\n\t}\n\treturn pb\n}\n\n// String returns the string representation of the bar\nfunc (b *Bar) String() string {\n\treturn string(b.Bytes())\n}\n\n// CompletedPercent return the percent completed\nfunc (b *Bar) CompletedPercent() float64 {\n\treturn (float64(b.Current()) / float64(b.Total)) * 100.00\n}\n\n// CompletedPercentString returns the formatted string representation of the completed percent\nfunc (b *Bar) CompletedPercentString() string {\n\treturn fmt.Sprintf(\"%3.f%%\", b.CompletedPercent())\n}\n\n// TimeElapsed returns the time elapsed\nfunc (b *Bar) TimeElapsed() time.Duration {\n\tb.mtx.RLock()\n\tdefer b.mtx.RUnlock()\n\treturn b.timeElapsed\n}\n\n// TimeElapsedString returns the formatted string represenation of the time elapsed\nfunc (b *Bar) TimeElapsedString() string {\n\treturn strutil.PrettyTime(b.TimeElapsed())\n}\n"
  },
  {
    "path": "vendor/github.com/gosuri/uiprogress/doc.go",
    "content": "// Package uiprogress is a library to render progress bars in terminal applications\npackage uiprogress\n"
  },
  {
    "path": "vendor/github.com/gosuri/uiprogress/progress.go",
    "content": "package uiprogress\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gosuri/uilive\"\n)\n\n// Out is the default writer to render progress bars to\nvar Out = os.Stdout\n\n// RefreshInterval in the default time duration to wait for refreshing the output\nvar RefreshInterval = time.Millisecond * 10\n\n// defaultProgress is the default progress\nvar defaultProgress = New()\n\n// Progress represents the container that renders progress bars\ntype Progress struct {\n\t// Out is the writer to render progress bars to\n\tOut io.Writer\n\n\t// Width is the width of the progress bars\n\tWidth int\n\n\t// Bars is the collection of progress bars\n\tBars []*Bar\n\n\t// RefreshInterval in the time duration to wait for refreshing the output\n\tRefreshInterval time.Duration\n\n\tlw     *uilive.Writer\n\tticker *time.Ticker\n\ttdone  chan bool\n\tmtx    *sync.RWMutex\n}\n\n// New returns a new progress bar with defaults\nfunc New() *Progress {\n\tlw := uilive.New()\n\tlw.Out = Out\n\n\treturn &Progress{\n\t\tWidth:           Width,\n\t\tOut:             Out,\n\t\tBars:            make([]*Bar, 0),\n\t\tRefreshInterval: RefreshInterval,\n\n\t\ttdone: make(chan bool),\n\t\tlw:    uilive.New(),\n\t\tmtx:   &sync.RWMutex{},\n\t}\n}\n\n// AddBar creates a new progress bar and adds it to the default progress container\nfunc AddBar(total int) *Bar {\n\treturn defaultProgress.AddBar(total)\n}\n\n// Start starts the rendering the progress of progress bars using the DefaultProgress. It listens for updates using `bar.Set(n)` and new bars when added using `AddBar`\nfunc Start() {\n\tdefaultProgress.Start()\n}\n\n// Stop stops listening\nfunc Stop() {\n\tdefaultProgress.Stop()\n}\n\n// Listen listens for updates and renders the progress bars\nfunc Listen() {\n\tdefaultProgress.Listen()\n}\n\nfunc (p *Progress) SetOut(o io.Writer) {\n\tp.mtx.Lock()\n\tdefer p.mtx.Unlock()\n\n\tp.Out = o\n\tp.lw.Out = o\n}\n\nfunc (p *Progress) SetRefreshInterval(interval time.Duration) {\n\tp.mtx.Lock()\n\tdefer p.mtx.Unlock()\n\tp.RefreshInterval = interval\n}\n\n// AddBar creates a new progress bar and adds to the container\nfunc (p *Progress) AddBar(total int) *Bar {\n\tp.mtx.Lock()\n\tdefer p.mtx.Unlock()\n\n\tbar := NewBar(total)\n\tbar.Width = p.Width\n\tp.Bars = append(p.Bars, bar)\n\treturn bar\n}\n\n// Listen listens for updates and renders the progress bars\nfunc (p *Progress) Listen() {\n\tfor {\n\n\t\tp.mtx.Lock()\n\t\tinterval := p.RefreshInterval\n\t\tp.mtx.Unlock()\n\n\t\tselect {\n\t\tcase <-time.After(interval):\n\t\t\tp.print()\n\t\tcase <-p.tdone:\n\t\t\tp.print()\n\t\t\tclose(p.tdone)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (p *Progress) print() {\n\tp.mtx.Lock()\n\tdefer p.mtx.Unlock()\n\tfor _, bar := range p.Bars {\n\t\tfmt.Fprintln(p.lw, bar.String())\n\t}\n\tp.lw.Flush()\n}\n\n// Start starts the rendering the progress of progress bars. It listens for updates using `bar.Set(n)` and new bars when added using `AddBar`\nfunc (p *Progress) Start() {\n\tgo p.Listen()\n}\n\n// Stop stops listening\nfunc (p *Progress) Stop() {\n\tp.tdone <- true\n\t<-p.tdone\n}\n\n// Bypass returns a writer which allows non-buffered data to be written to the underlying output\nfunc (p *Progress) Bypass() io.Writer {\n\treturn p.lw.Bypass()\n}\n"
  },
  {
    "path": "vendor/github.com/gosuri/uiprogress/util/strutil/strutil.go",
    "content": "// Package strutil provides various utilities for manipulating strings\npackage strutil\n\nimport (\n\t\"bytes\"\n\t\"time\"\n)\n\n// PadRight returns a new string of a specified length in which the end of the current string is padded with spaces or with a specified Unicode character.\nfunc PadRight(str string, length int, pad byte) string {\n\tif len(str) >= length {\n\t\treturn str\n\t}\n\tbuf := bytes.NewBufferString(str)\n\tfor i := 0; i < length-len(str); i++ {\n\t\tbuf.WriteByte(pad)\n\t}\n\treturn buf.String()\n}\n\n// PadLeft returns a new string of a specified length in which the beginning of the current string is padded with spaces or with a specified Unicode character.\nfunc PadLeft(str string, length int, pad byte) string {\n\tif len(str) >= length {\n\t\treturn str\n\t}\n\tvar buf bytes.Buffer\n\tfor i := 0; i < length-len(str); i++ {\n\t\tbuf.WriteByte(pad)\n\t}\n\tbuf.WriteString(str)\n\treturn buf.String()\n}\n\n// Resize resizes the string with the given length. It ellipses with '...' when the string's length exceeds\n// the desired length or pads spaces to the right of the string when length is smaller than desired\nfunc Resize(s string, length uint) string {\n\tn := int(length)\n\tif len(s) == n {\n\t\treturn s\n\t}\n\t// Pads only when length of the string smaller than len needed\n\ts = PadRight(s, n, ' ')\n\tif len(s) > n {\n\t\tb := []byte(s)\n\t\tvar buf bytes.Buffer\n\t\tfor i := 0; i < n-3; i++ {\n\t\t\tbuf.WriteByte(b[i])\n\t\t}\n\t\tbuf.WriteString(\"...\")\n\t\ts = buf.String()\n\t}\n\treturn s\n}\n\n// PrettyTime returns the string representation of the duration. It rounds the time duration to a second and returns a \"---\" when duration is 0\nfunc PrettyTime(t time.Duration) string {\n\tif t == 0 {\n\t\treturn \"---\"\n\t}\n\treturn (t - (t % time.Second)).String()\n}\n"
  },
  {
    "path": "vendor/github.com/hashicorp/golang-lru/2q.go",
    "content": "package lru\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/hashicorp/golang-lru/simplelru\"\n)\n\nconst (\n\t// Default2QRecentRatio is the ratio of the 2Q cache dedicated\n\t// to recently added entries that have only been accessed once.\n\tDefault2QRecentRatio = 0.25\n\n\t// Default2QGhostEntries is the default ratio of ghost\n\t// entries kept to track entries recently evicted\n\tDefault2QGhostEntries = 0.50\n)\n\n// TwoQueueCache is a thread-safe fixed size 2Q cache.\n// 2Q is an enhancement over the standard LRU cache\n// in that it tracks both frequently and recently used\n// entries separately. This avoids a burst in access to new\n// entries from evicting frequently used entries. It adds some\n// additional tracking overhead to the standard LRU cache, and is\n// computationally about 2x the cost, and adds some metadata over\n// head. The ARCCache is similar, but does not require setting any\n// parameters.\ntype TwoQueueCache struct {\n\tsize       int\n\trecentSize int\n\n\trecent      *simplelru.LRU\n\tfrequent    *simplelru.LRU\n\trecentEvict *simplelru.LRU\n\tlock        sync.RWMutex\n}\n\n// New2Q creates a new TwoQueueCache using the default\n// values for the parameters.\nfunc New2Q(size int) (*TwoQueueCache, error) {\n\treturn New2QParams(size, Default2QRecentRatio, Default2QGhostEntries)\n}\n\n// New2QParams creates a new TwoQueueCache using the provided\n// parameter values.\nfunc New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) {\n\tif size <= 0 {\n\t\treturn nil, fmt.Errorf(\"invalid size\")\n\t}\n\tif recentRatio < 0.0 || recentRatio > 1.0 {\n\t\treturn nil, fmt.Errorf(\"invalid recent ratio\")\n\t}\n\tif ghostRatio < 0.0 || ghostRatio > 1.0 {\n\t\treturn nil, fmt.Errorf(\"invalid ghost ratio\")\n\t}\n\n\t// Determine the sub-sizes\n\trecentSize := int(float64(size) * recentRatio)\n\tevictSize := int(float64(size) * ghostRatio)\n\n\t// Allocate the LRUs\n\trecent, err := simplelru.NewLRU(size, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfrequent, err := simplelru.NewLRU(size, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trecentEvict, err := simplelru.NewLRU(evictSize, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Initialize the cache\n\tc := &TwoQueueCache{\n\t\tsize:        size,\n\t\trecentSize:  recentSize,\n\t\trecent:      recent,\n\t\tfrequent:    frequent,\n\t\trecentEvict: recentEvict,\n\t}\n\treturn c, nil\n}\n\nfunc (c *TwoQueueCache) Get(key interface{}) (interface{}, bool) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\t// Check if this is a frequent value\n\tif val, ok := c.frequent.Get(key); ok {\n\t\treturn val, ok\n\t}\n\n\t// If the value is contained in recent, then we\n\t// promote it to frequent\n\tif val, ok := c.recent.Peek(key); ok {\n\t\tc.recent.Remove(key)\n\t\tc.frequent.Add(key, val)\n\t\treturn val, ok\n\t}\n\n\t// No hit\n\treturn nil, false\n}\n\nfunc (c *TwoQueueCache) Add(key, value interface{}) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\t// Check if the value is frequently used already,\n\t// and just update the value\n\tif c.frequent.Contains(key) {\n\t\tc.frequent.Add(key, value)\n\t\treturn\n\t}\n\n\t// Check if the value is recently used, and promote\n\t// the value into the frequent list\n\tif c.recent.Contains(key) {\n\t\tc.recent.Remove(key)\n\t\tc.frequent.Add(key, value)\n\t\treturn\n\t}\n\n\t// If the value was recently evicted, add it to the\n\t// frequently used list\n\tif c.recentEvict.Contains(key) {\n\t\tc.ensureSpace(true)\n\t\tc.recentEvict.Remove(key)\n\t\tc.frequent.Add(key, value)\n\t\treturn\n\t}\n\n\t// Add to the recently seen list\n\tc.ensureSpace(false)\n\tc.recent.Add(key, value)\n\treturn\n}\n\n// ensureSpace is used to ensure we have space in the cache\nfunc (c *TwoQueueCache) ensureSpace(recentEvict bool) {\n\t// If we have space, nothing to do\n\trecentLen := c.recent.Len()\n\tfreqLen := c.frequent.Len()\n\tif recentLen+freqLen < c.size {\n\t\treturn\n\t}\n\n\t// If the recent buffer is larger than\n\t// the target, evict from there\n\tif recentLen > 0 && (recentLen > c.recentSize || (recentLen == c.recentSize && !recentEvict)) {\n\t\tk, _, _ := c.recent.RemoveOldest()\n\t\tc.recentEvict.Add(k, nil)\n\t\treturn\n\t}\n\n\t// Remove from the frequent list otherwise\n\tc.frequent.RemoveOldest()\n}\n\nfunc (c *TwoQueueCache) Len() int {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.recent.Len() + c.frequent.Len()\n}\n\nfunc (c *TwoQueueCache) Keys() []interface{} {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\tk1 := c.frequent.Keys()\n\tk2 := c.recent.Keys()\n\treturn append(k1, k2...)\n}\n\nfunc (c *TwoQueueCache) Remove(key interface{}) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\tif c.frequent.Remove(key) {\n\t\treturn\n\t}\n\tif c.recent.Remove(key) {\n\t\treturn\n\t}\n\tif c.recentEvict.Remove(key) {\n\t\treturn\n\t}\n}\n\nfunc (c *TwoQueueCache) Purge() {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\tc.recent.Purge()\n\tc.frequent.Purge()\n\tc.recentEvict.Purge()\n}\n\nfunc (c *TwoQueueCache) Contains(key interface{}) bool {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.frequent.Contains(key) || c.recent.Contains(key)\n}\n\nfunc (c *TwoQueueCache) Peek(key interface{}) (interface{}, bool) {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\tif val, ok := c.frequent.Peek(key); ok {\n\t\treturn val, ok\n\t}\n\treturn c.recent.Peek(key)\n}\n"
  },
  {
    "path": "vendor/github.com/hashicorp/golang-lru/LICENSE",
    "content": "Mozilla Public License, version 2.0\n\n1. Definitions\n\n1.1. \"Contributor\"\n\n     means each individual or legal entity that creates, contributes to the\n     creation of, or owns Covered Software.\n\n1.2. \"Contributor Version\"\n\n     means the combination of the Contributions of others (if any) used by a\n     Contributor and that particular Contributor's Contribution.\n\n1.3. \"Contribution\"\n\n     means Covered Software of a particular Contributor.\n\n1.4. \"Covered Software\"\n\n     means Source Code Form to which the initial Contributor has attached the\n     notice in Exhibit A, the Executable Form of such Source Code Form, and\n     Modifications of such Source Code Form, in each case including portions\n     thereof.\n\n1.5. \"Incompatible With Secondary Licenses\"\n     means\n\n     a. that the initial Contributor has attached the notice described in\n        Exhibit B to the Covered Software; or\n\n     b. that the Covered Software was made available under the terms of\n        version 1.1 or earlier of the License, but not also under the terms of\n        a Secondary License.\n\n1.6. \"Executable Form\"\n\n     means any form of the work other than Source Code Form.\n\n1.7. \"Larger Work\"\n\n     means a work that combines Covered Software with other material, in a\n     separate file or files, that is not Covered Software.\n\n1.8. \"License\"\n\n     means this document.\n\n1.9. \"Licensable\"\n\n     means having the right to grant, to the maximum extent possible, whether\n     at the time of the initial grant or subsequently, any and all of the\n     rights conveyed by this License.\n\n1.10. \"Modifications\"\n\n     means any of the following:\n\n     a. any file in Source Code Form that results from an addition to,\n        deletion from, or modification of the contents of Covered Software; or\n\n     b. any new file in Source Code Form that contains any Covered Software.\n\n1.11. \"Patent Claims\" of a Contributor\n\n      means any patent claim(s), including without limitation, method,\n      process, and apparatus claims, in any patent Licensable by such\n      Contributor that would be infringed, but for the grant of the License,\n      by the making, using, selling, offering for sale, having made, import,\n      or transfer of either its Contributions or its Contributor Version.\n\n1.12. \"Secondary License\"\n\n      means either the GNU General Public License, Version 2.0, the GNU Lesser\n      General Public License, Version 2.1, the GNU Affero General Public\n      License, Version 3.0, or any later versions of those licenses.\n\n1.13. \"Source Code Form\"\n\n      means the form of the work preferred for making modifications.\n\n1.14. \"You\" (or \"Your\")\n\n      means an individual or a legal entity exercising rights under this\n      License. For legal entities, \"You\" includes any entity that controls, is\n      controlled by, or is under common control with You. For purposes of this\n      definition, \"control\" means (a) the power, direct or indirect, to cause\n      the direction or management of such entity, whether by contract or\n      otherwise, or (b) ownership of more than fifty percent (50%) of the\n      outstanding shares or beneficial ownership of such entity.\n\n\n2. License Grants and Conditions\n\n2.1. Grants\n\n     Each Contributor hereby grants You a world-wide, royalty-free,\n     non-exclusive license:\n\n     a. under intellectual property rights (other than patent or trademark)\n        Licensable by such Contributor to use, reproduce, make available,\n        modify, display, perform, distribute, and otherwise exploit its\n        Contributions, either on an unmodified basis, with Modifications, or\n        as part of a Larger Work; and\n\n     b. under Patent Claims of such Contributor to make, use, sell, offer for\n        sale, have made, import, and otherwise transfer either its\n        Contributions or its Contributor Version.\n\n2.2. Effective Date\n\n     The licenses granted in Section 2.1 with respect to any Contribution\n     become effective for each Contribution on the date the Contributor first\n     distributes such Contribution.\n\n2.3. Limitations on Grant Scope\n\n     The licenses granted in this Section 2 are the only rights granted under\n     this License. No additional rights or licenses will be implied from the\n     distribution or licensing of Covered Software under this License.\n     Notwithstanding Section 2.1(b) above, no patent license is granted by a\n     Contributor:\n\n     a. for any code that a Contributor has removed from Covered Software; or\n\n     b. for infringements caused by: (i) Your and any other third party's\n        modifications of Covered Software, or (ii) the combination of its\n        Contributions with other software (except as part of its Contributor\n        Version); or\n\n     c. under Patent Claims infringed by Covered Software in the absence of\n        its Contributions.\n\n     This License does not grant any rights in the trademarks, service marks,\n     or logos of any Contributor (except as may be necessary to comply with\n     the notice requirements in Section 3.4).\n\n2.4. Subsequent Licenses\n\n     No Contributor makes additional grants as a result of Your choice to\n     distribute the Covered Software under a subsequent version of this\n     License (see Section 10.2) or under the terms of a Secondary License (if\n     permitted under the terms of Section 3.3).\n\n2.5. Representation\n\n     Each Contributor represents that the Contributor believes its\n     Contributions are its original creation(s) or it has sufficient rights to\n     grant the rights to its Contributions conveyed by this License.\n\n2.6. Fair Use\n\n     This License is not intended to limit any rights You have under\n     applicable copyright doctrines of fair use, fair dealing, or other\n     equivalents.\n\n2.7. Conditions\n\n     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in\n     Section 2.1.\n\n\n3. Responsibilities\n\n3.1. Distribution of Source Form\n\n     All distribution of Covered Software in Source Code Form, including any\n     Modifications that You create or to which You contribute, must be under\n     the terms of this License. You must inform recipients that the Source\n     Code Form of the Covered Software is governed by the terms of this\n     License, and how they can obtain a copy of this License. You may not\n     attempt to alter or restrict the recipients' rights in the Source Code\n     Form.\n\n3.2. Distribution of Executable Form\n\n     If You distribute Covered Software in Executable Form then:\n\n     a. such Covered Software must also be made available in Source Code Form,\n        as described in Section 3.1, and You must inform recipients of the\n        Executable Form how they can obtain a copy of such Source Code Form by\n        reasonable means in a timely manner, at a charge no more than the cost\n        of distribution to the recipient; and\n\n     b. You may distribute such Executable Form under the terms of this\n        License, or sublicense it under different terms, provided that the\n        license for the Executable Form does not attempt to limit or alter the\n        recipients' rights in the Source Code Form under this License.\n\n3.3. Distribution of a Larger Work\n\n     You may create and distribute a Larger Work under terms of Your choice,\n     provided that You also comply with the requirements of this License for\n     the Covered Software. If the Larger Work is a combination of Covered\n     Software with a work governed by one or more Secondary Licenses, and the\n     Covered Software is not Incompatible With Secondary Licenses, this\n     License permits You to additionally distribute such Covered Software\n     under the terms of such Secondary License(s), so that the recipient of\n     the Larger Work may, at their option, further distribute the Covered\n     Software under the terms of either this License or such Secondary\n     License(s).\n\n3.4. Notices\n\n     You may not remove or alter the substance of any license notices\n     (including copyright notices, patent notices, disclaimers of warranty, or\n     limitations of liability) contained within the Source Code Form of the\n     Covered Software, except that You may alter any license notices to the\n     extent required to remedy known factual inaccuracies.\n\n3.5. Application of Additional Terms\n\n     You may choose to offer, and to charge a fee for, warranty, support,\n     indemnity or liability obligations to one or more recipients of Covered\n     Software. However, You may do so only on Your own behalf, and not on\n     behalf of any Contributor. You must make it absolutely clear that any\n     such warranty, support, indemnity, or liability obligation is offered by\n     You alone, and You hereby agree to indemnify every Contributor for any\n     liability incurred by such Contributor as a result of warranty, support,\n     indemnity or liability terms You offer. You may include additional\n     disclaimers of warranty and limitations of liability specific to any\n     jurisdiction.\n\n4. Inability to Comply Due to Statute or Regulation\n\n   If it is impossible for You to comply with any of the terms of this License\n   with respect to some or all of the Covered Software due to statute,\n   judicial order, or regulation then You must: (a) comply with the terms of\n   this License to the maximum extent possible; and (b) describe the\n   limitations and the code they affect. Such description must be placed in a\n   text file included with all distributions of the Covered Software under\n   this License. Except to the extent prohibited by statute or regulation,\n   such description must be sufficiently detailed for a recipient of ordinary\n   skill to be able to understand it.\n\n5. Termination\n\n5.1. The rights granted under this License will terminate automatically if You\n     fail to comply with any of its terms. However, if You become compliant,\n     then the rights granted under this License from a particular Contributor\n     are reinstated (a) provisionally, unless and until such Contributor\n     explicitly and finally terminates Your grants, and (b) on an ongoing\n     basis, if such Contributor fails to notify You of the non-compliance by\n     some reasonable means prior to 60 days after You have come back into\n     compliance. Moreover, Your grants from a particular Contributor are\n     reinstated on an ongoing basis if such Contributor notifies You of the\n     non-compliance by some reasonable means, this is the first time You have\n     received notice of non-compliance with this License from such\n     Contributor, and You become compliant prior to 30 days after Your receipt\n     of the notice.\n\n5.2. If You initiate litigation against any entity by asserting a patent\n     infringement claim (excluding declaratory judgment actions,\n     counter-claims, and cross-claims) alleging that a Contributor Version\n     directly or indirectly infringes any patent, then the rights granted to\n     You by any and all Contributors for the Covered Software under Section\n     2.1 of this License shall terminate.\n\n5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user\n     license agreements (excluding distributors and resellers) which have been\n     validly granted by You or Your distributors under this License prior to\n     termination shall survive termination.\n\n6. Disclaimer of Warranty\n\n   Covered Software is provided under this License on an \"as is\" basis,\n   without warranty of any kind, either expressed, implied, or statutory,\n   including, without limitation, warranties that the Covered Software is free\n   of defects, merchantable, fit for a particular purpose or non-infringing.\n   The entire risk as to the quality and performance of the Covered Software\n   is with You. Should any Covered Software prove defective in any respect,\n   You (not any Contributor) assume the cost of any necessary servicing,\n   repair, or correction. This disclaimer of warranty constitutes an essential\n   part of this License. No use of  any Covered Software is authorized under\n   this License except under this disclaimer.\n\n7. Limitation of Liability\n\n   Under no circumstances and under no legal theory, whether tort (including\n   negligence), contract, or otherwise, shall any Contributor, or anyone who\n   distributes Covered Software as permitted above, be liable to You for any\n   direct, indirect, special, incidental, or consequential damages of any\n   character including, without limitation, damages for lost profits, loss of\n   goodwill, work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses, even if such party shall have been\n   informed of the possibility of such damages. This limitation of liability\n   shall not apply to liability for death or personal injury resulting from\n   such party's negligence to the extent applicable law prohibits such\n   limitation. Some jurisdictions do not allow the exclusion or limitation of\n   incidental or consequential damages, so this exclusion and limitation may\n   not apply to You.\n\n8. Litigation\n\n   Any litigation relating to this License may be brought only in the courts\n   of a jurisdiction where the defendant maintains its principal place of\n   business and such litigation shall be governed by laws of that\n   jurisdiction, without reference to its conflict-of-law provisions. Nothing\n   in this Section shall prevent a party's ability to bring cross-claims or\n   counter-claims.\n\n9. Miscellaneous\n\n   This License represents the complete agreement concerning the subject\n   matter hereof. If any provision of this License is held to be\n   unenforceable, such provision shall be reformed only to the extent\n   necessary to make it enforceable. Any law or regulation which provides that\n   the language of a contract shall be construed against the drafter shall not\n   be used to construe this License against a Contributor.\n\n\n10. Versions of the License\n\n10.1. New Versions\n\n      Mozilla Foundation is the license steward. Except as provided in Section\n      10.3, no one other than the license steward has the right to modify or\n      publish new versions of this License. Each version will be given a\n      distinguishing version number.\n\n10.2. Effect of New Versions\n\n      You may distribute the Covered Software under the terms of the version\n      of the License under which You originally received the Covered Software,\n      or under the terms of any subsequent version published by the license\n      steward.\n\n10.3. Modified Versions\n\n      If you create software not governed by this License, and you want to\n      create a new license for such software, you may create and use a\n      modified version of this License if you rename the license and remove\n      any references to the name of the license steward (except to note that\n      such modified license differs from this License).\n\n10.4. Distributing Source Code Form that is Incompatible With Secondary\n      Licenses If You choose to distribute Source Code Form that is\n      Incompatible With Secondary Licenses under the terms of this version of\n      the License, the notice described in Exhibit B of this License must be\n      attached.\n\nExhibit A - Source Code Form License Notice\n\n      This Source Code Form is subject to the\n      terms of the Mozilla Public License, v.\n      2.0. If a copy of the MPL was not\n      distributed with this file, You can\n      obtain one at\n      http://mozilla.org/MPL/2.0/.\n\nIf it is not possible or desirable to put the notice in a particular file,\nthen You may include the notice in a location (such as a LICENSE file in a\nrelevant directory) where a recipient would be likely to look for such a\nnotice.\n\nYou may add additional accurate notices of copyright ownership.\n\nExhibit B - \"Incompatible With Secondary Licenses\" Notice\n\n      This Source Code Form is \"Incompatible\n      With Secondary Licenses\", as defined by\n      the Mozilla Public License, v. 2.0.\n"
  },
  {
    "path": "vendor/github.com/hashicorp/golang-lru/README.md",
    "content": "golang-lru\n==========\n\nThis provides the `lru` package which implements a fixed-size\nthread safe LRU cache. It is based on the cache in Groupcache.\n\nDocumentation\n=============\n\nFull docs are available on [Godoc](http://godoc.org/github.com/hashicorp/golang-lru)\n\nExample\n=======\n\nUsing the LRU is very simple:\n\n```go\nl, _ := New(128)\nfor i := 0; i < 256; i++ {\n    l.Add(i, nil)\n}\nif l.Len() != 128 {\n    panic(fmt.Sprintf(\"bad len: %v\", l.Len()))\n}\n```\n"
  },
  {
    "path": "vendor/github.com/hashicorp/golang-lru/arc.go",
    "content": "package lru\n\nimport (\n\t\"sync\"\n\n\t\"github.com/hashicorp/golang-lru/simplelru\"\n)\n\n// ARCCache is a thread-safe fixed size Adaptive Replacement Cache (ARC).\n// ARC is an enhancement over the standard LRU cache in that tracks both\n// frequency and recency of use. This avoids a burst in access to new\n// entries from evicting the frequently used older entries. It adds some\n// additional tracking overhead to a standard LRU cache, computationally\n// it is roughly 2x the cost, and the extra memory overhead is linear\n// with the size of the cache. ARC has been patented by IBM, but is\n// similar to the TwoQueueCache (2Q) which requires setting parameters.\ntype ARCCache struct {\n\tsize int // Size is the total capacity of the cache\n\tp    int // P is the dynamic preference towards T1 or T2\n\n\tt1 *simplelru.LRU // T1 is the LRU for recently accessed items\n\tb1 *simplelru.LRU // B1 is the LRU for evictions from t1\n\n\tt2 *simplelru.LRU // T2 is the LRU for frequently accessed items\n\tb2 *simplelru.LRU // B2 is the LRU for evictions from t2\n\n\tlock sync.RWMutex\n}\n\n// NewARC creates an ARC of the given size\nfunc NewARC(size int) (*ARCCache, error) {\n\t// Create the sub LRUs\n\tb1, err := simplelru.NewLRU(size, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tb2, err := simplelru.NewLRU(size, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tt1, err := simplelru.NewLRU(size, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tt2, err := simplelru.NewLRU(size, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Initialize the ARC\n\tc := &ARCCache{\n\t\tsize: size,\n\t\tp:    0,\n\t\tt1:   t1,\n\t\tb1:   b1,\n\t\tt2:   t2,\n\t\tb2:   b2,\n\t}\n\treturn c, nil\n}\n\n// Get looks up a key's value from the cache.\nfunc (c *ARCCache) Get(key interface{}) (interface{}, bool) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\t// Ff the value is contained in T1 (recent), then\n\t// promote it to T2 (frequent)\n\tif val, ok := c.t1.Peek(key); ok {\n\t\tc.t1.Remove(key)\n\t\tc.t2.Add(key, val)\n\t\treturn val, ok\n\t}\n\n\t// Check if the value is contained in T2 (frequent)\n\tif val, ok := c.t2.Get(key); ok {\n\t\treturn val, ok\n\t}\n\n\t// No hit\n\treturn nil, false\n}\n\n// Add adds a value to the cache.\nfunc (c *ARCCache) Add(key, value interface{}) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\t// Check if the value is contained in T1 (recent), and potentially\n\t// promote it to frequent T2\n\tif c.t1.Contains(key) {\n\t\tc.t1.Remove(key)\n\t\tc.t2.Add(key, value)\n\t\treturn\n\t}\n\n\t// Check if the value is already in T2 (frequent) and update it\n\tif c.t2.Contains(key) {\n\t\tc.t2.Add(key, value)\n\t\treturn\n\t}\n\n\t// Check if this value was recently evicted as part of the\n\t// recently used list\n\tif c.b1.Contains(key) {\n\t\t// T1 set is too small, increase P appropriately\n\t\tdelta := 1\n\t\tb1Len := c.b1.Len()\n\t\tb2Len := c.b2.Len()\n\t\tif b2Len > b1Len {\n\t\t\tdelta = b2Len / b1Len\n\t\t}\n\t\tif c.p+delta >= c.size {\n\t\t\tc.p = c.size\n\t\t} else {\n\t\t\tc.p += delta\n\t\t}\n\n\t\t// Potentially need to make room in the cache\n\t\tif c.t1.Len()+c.t2.Len() >= c.size {\n\t\t\tc.replace(false)\n\t\t}\n\n\t\t// Remove from B1\n\t\tc.b1.Remove(key)\n\n\t\t// Add the key to the frequently used list\n\t\tc.t2.Add(key, value)\n\t\treturn\n\t}\n\n\t// Check if this value was recently evicted as part of the\n\t// frequently used list\n\tif c.b2.Contains(key) {\n\t\t// T2 set is too small, decrease P appropriately\n\t\tdelta := 1\n\t\tb1Len := c.b1.Len()\n\t\tb2Len := c.b2.Len()\n\t\tif b1Len > b2Len {\n\t\t\tdelta = b1Len / b2Len\n\t\t}\n\t\tif delta >= c.p {\n\t\t\tc.p = 0\n\t\t} else {\n\t\t\tc.p -= delta\n\t\t}\n\n\t\t// Potentially need to make room in the cache\n\t\tif c.t1.Len()+c.t2.Len() >= c.size {\n\t\t\tc.replace(true)\n\t\t}\n\n\t\t// Remove from B2\n\t\tc.b2.Remove(key)\n\n\t\t// Add the key to the frequntly used list\n\t\tc.t2.Add(key, value)\n\t\treturn\n\t}\n\n\t// Potentially need to make room in the cache\n\tif c.t1.Len()+c.t2.Len() >= c.size {\n\t\tc.replace(false)\n\t}\n\n\t// Keep the size of the ghost buffers trim\n\tif c.b1.Len() > c.size-c.p {\n\t\tc.b1.RemoveOldest()\n\t}\n\tif c.b2.Len() > c.p {\n\t\tc.b2.RemoveOldest()\n\t}\n\n\t// Add to the recently seen list\n\tc.t1.Add(key, value)\n\treturn\n}\n\n// replace is used to adaptively evict from either T1 or T2\n// based on the current learned value of P\nfunc (c *ARCCache) replace(b2ContainsKey bool) {\n\tt1Len := c.t1.Len()\n\tif t1Len > 0 && (t1Len > c.p || (t1Len == c.p && b2ContainsKey)) {\n\t\tk, _, ok := c.t1.RemoveOldest()\n\t\tif ok {\n\t\t\tc.b1.Add(k, nil)\n\t\t}\n\t} else {\n\t\tk, _, ok := c.t2.RemoveOldest()\n\t\tif ok {\n\t\t\tc.b2.Add(k, nil)\n\t\t}\n\t}\n}\n\n// Len returns the number of cached entries\nfunc (c *ARCCache) Len() int {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.t1.Len() + c.t2.Len()\n}\n\n// Keys returns all the cached keys\nfunc (c *ARCCache) Keys() []interface{} {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\tk1 := c.t1.Keys()\n\tk2 := c.t2.Keys()\n\treturn append(k1, k2...)\n}\n\n// Remove is used to purge a key from the cache\nfunc (c *ARCCache) Remove(key interface{}) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\tif c.t1.Remove(key) {\n\t\treturn\n\t}\n\tif c.t2.Remove(key) {\n\t\treturn\n\t}\n\tif c.b1.Remove(key) {\n\t\treturn\n\t}\n\tif c.b2.Remove(key) {\n\t\treturn\n\t}\n}\n\n// Purge is used to clear the cache\nfunc (c *ARCCache) Purge() {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\tc.t1.Purge()\n\tc.t2.Purge()\n\tc.b1.Purge()\n\tc.b2.Purge()\n}\n\n// Contains is used to check if the cache contains a key\n// without updating recency or frequency.\nfunc (c *ARCCache) Contains(key interface{}) bool {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.t1.Contains(key) || c.t2.Contains(key)\n}\n\n// Peek is used to inspect the cache value of a key\n// without updating recency or frequency.\nfunc (c *ARCCache) Peek(key interface{}) (interface{}, bool) {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\tif val, ok := c.t1.Peek(key); ok {\n\t\treturn val, ok\n\t}\n\treturn c.t2.Peek(key)\n}\n"
  },
  {
    "path": "vendor/github.com/hashicorp/golang-lru/lru.go",
    "content": "// This package provides a simple LRU cache. It is based on the\n// LRU implementation in groupcache:\n// https://github.com/golang/groupcache/tree/master/lru\npackage lru\n\nimport (\n\t\"sync\"\n\n\t\"github.com/hashicorp/golang-lru/simplelru\"\n)\n\n// Cache is a thread-safe fixed size LRU cache.\ntype Cache struct {\n\tlru  *simplelru.LRU\n\tlock sync.RWMutex\n}\n\n// New creates an LRU of the given size\nfunc New(size int) (*Cache, error) {\n\treturn NewWithEvict(size, nil)\n}\n\n// NewWithEvict constructs a fixed size cache with the given eviction\n// callback.\nfunc NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) {\n\tlru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc := &Cache{\n\t\tlru: lru,\n\t}\n\treturn c, nil\n}\n\n// Purge is used to completely clear the cache\nfunc (c *Cache) Purge() {\n\tc.lock.Lock()\n\tc.lru.Purge()\n\tc.lock.Unlock()\n}\n\n// Add adds a value to the cache.  Returns true if an eviction occurred.\nfunc (c *Cache) Add(key, value interface{}) bool {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\treturn c.lru.Add(key, value)\n}\n\n// Get looks up a key's value from the cache.\nfunc (c *Cache) Get(key interface{}) (interface{}, bool) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\treturn c.lru.Get(key)\n}\n\n// Check if a key is in the cache, without updating the recent-ness\n// or deleting it for being stale.\nfunc (c *Cache) Contains(key interface{}) bool {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.lru.Contains(key)\n}\n\n// Returns the key value (or undefined if not found) without updating\n// the \"recently used\"-ness of the key.\nfunc (c *Cache) Peek(key interface{}) (interface{}, bool) {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.lru.Peek(key)\n}\n\n// ContainsOrAdd checks if a key is in the cache  without updating the\n// recent-ness or deleting it for being stale,  and if not, adds the value.\n// Returns whether found and whether an eviction occurred.\nfunc (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evict bool) {\n\tc.lock.Lock()\n\tdefer c.lock.Unlock()\n\n\tif c.lru.Contains(key) {\n\t\treturn true, false\n\t} else {\n\t\tevict := c.lru.Add(key, value)\n\t\treturn false, evict\n\t}\n}\n\n// Remove removes the provided key from the cache.\nfunc (c *Cache) Remove(key interface{}) {\n\tc.lock.Lock()\n\tc.lru.Remove(key)\n\tc.lock.Unlock()\n}\n\n// RemoveOldest removes the oldest item from the cache.\nfunc (c *Cache) RemoveOldest() {\n\tc.lock.Lock()\n\tc.lru.RemoveOldest()\n\tc.lock.Unlock()\n}\n\n// Keys returns a slice of the keys in the cache, from oldest to newest.\nfunc (c *Cache) Keys() []interface{} {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.lru.Keys()\n}\n\n// Len returns the number of items in the cache.\nfunc (c *Cache) Len() int {\n\tc.lock.RLock()\n\tdefer c.lock.RUnlock()\n\treturn c.lru.Len()\n}\n"
  },
  {
    "path": "vendor/github.com/hashicorp/golang-lru/simplelru/lru.go",
    "content": "package simplelru\n\nimport (\n\t\"container/list\"\n\t\"errors\"\n)\n\n// EvictCallback is used to get a callback when a cache entry is evicted\ntype EvictCallback func(key interface{}, value interface{})\n\n// LRU implements a non-thread safe fixed size LRU cache\ntype LRU struct {\n\tsize      int\n\tevictList *list.List\n\titems     map[interface{}]*list.Element\n\tonEvict   EvictCallback\n}\n\n// entry is used to hold a value in the evictList\ntype entry struct {\n\tkey   interface{}\n\tvalue interface{}\n}\n\n// NewLRU constructs an LRU of the given size\nfunc NewLRU(size int, onEvict EvictCallback) (*LRU, error) {\n\tif size <= 0 {\n\t\treturn nil, errors.New(\"Must provide a positive size\")\n\t}\n\tc := &LRU{\n\t\tsize:      size,\n\t\tevictList: list.New(),\n\t\titems:     make(map[interface{}]*list.Element),\n\t\tonEvict:   onEvict,\n\t}\n\treturn c, nil\n}\n\n// Purge is used to completely clear the cache\nfunc (c *LRU) Purge() {\n\tfor k, v := range c.items {\n\t\tif c.onEvict != nil {\n\t\t\tc.onEvict(k, v.Value.(*entry).value)\n\t\t}\n\t\tdelete(c.items, k)\n\t}\n\tc.evictList.Init()\n}\n\n// Add adds a value to the cache.  Returns true if an eviction occurred.\nfunc (c *LRU) Add(key, value interface{}) bool {\n\t// Check for existing item\n\tif ent, ok := c.items[key]; ok {\n\t\tc.evictList.MoveToFront(ent)\n\t\tent.Value.(*entry).value = value\n\t\treturn false\n\t}\n\n\t// Add new item\n\tent := &entry{key, value}\n\tentry := c.evictList.PushFront(ent)\n\tc.items[key] = entry\n\n\tevict := c.evictList.Len() > c.size\n\t// Verify size not exceeded\n\tif evict {\n\t\tc.removeOldest()\n\t}\n\treturn evict\n}\n\n// Get looks up a key's value from the cache.\nfunc (c *LRU) Get(key interface{}) (value interface{}, ok bool) {\n\tif ent, ok := c.items[key]; ok {\n\t\tc.evictList.MoveToFront(ent)\n\t\treturn ent.Value.(*entry).value, true\n\t}\n\treturn\n}\n\n// Check if a key is in the cache, without updating the recent-ness\n// or deleting it for being stale.\nfunc (c *LRU) Contains(key interface{}) (ok bool) {\n\t_, ok = c.items[key]\n\treturn ok\n}\n\n// Returns the key value (or undefined if not found) without updating\n// the \"recently used\"-ness of the key.\nfunc (c *LRU) Peek(key interface{}) (value interface{}, ok bool) {\n\tif ent, ok := c.items[key]; ok {\n\t\treturn ent.Value.(*entry).value, true\n\t}\n\treturn nil, ok\n}\n\n// Remove removes the provided key from the cache, returning if the\n// key was contained.\nfunc (c *LRU) Remove(key interface{}) bool {\n\tif ent, ok := c.items[key]; ok {\n\t\tc.removeElement(ent)\n\t\treturn true\n\t}\n\treturn false\n}\n\n// RemoveOldest removes the oldest item from the cache.\nfunc (c *LRU) RemoveOldest() (interface{}, interface{}, bool) {\n\tent := c.evictList.Back()\n\tif ent != nil {\n\t\tc.removeElement(ent)\n\t\tkv := ent.Value.(*entry)\n\t\treturn kv.key, kv.value, true\n\t}\n\treturn nil, nil, false\n}\n\n// GetOldest returns the oldest entry\nfunc (c *LRU) GetOldest() (interface{}, interface{}, bool) {\n\tent := c.evictList.Back()\n\tif ent != nil {\n\t\tkv := ent.Value.(*entry)\n\t\treturn kv.key, kv.value, true\n\t}\n\treturn nil, nil, false\n}\n\n// Keys returns a slice of the keys in the cache, from oldest to newest.\nfunc (c *LRU) Keys() []interface{} {\n\tkeys := make([]interface{}, len(c.items))\n\ti := 0\n\tfor ent := c.evictList.Back(); ent != nil; ent = ent.Prev() {\n\t\tkeys[i] = ent.Value.(*entry).key\n\t\ti++\n\t}\n\treturn keys\n}\n\n// Len returns the number of items in the cache.\nfunc (c *LRU) Len() int {\n\treturn c.evictList.Len()\n}\n\n// removeOldest removes the oldest item from the cache.\nfunc (c *LRU) removeOldest() {\n\tent := c.evictList.Back()\n\tif ent != nil {\n\t\tc.removeElement(ent)\n\t}\n}\n\n// removeElement is used to remove a given list element from the cache\nfunc (c *LRU) removeElement(e *list.Element) {\n\tc.evictList.Remove(e)\n\tkv := e.Value.(*entry)\n\tdelete(c.items, kv.key)\n\tif c.onEvict != nil {\n\t\tc.onEvict(kv.key, kv.value)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/LICENSE",
    "content": "Copyright (c) 2013, John Beisley <greatred@gmail.com>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice, this\n  list of conditions and the following disclaimer in the documentation and/or\n  other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/README.md",
    "content": "goupnp is a UPnP client library for Go\n\nInstallation\n------------\n\nRun `go get -u github.com/huin/goupnp`.\n\nDocumentation\n-------------\n\nSupported DCPs (you probably want to start with one of these):\n\n* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) av1](https://godoc.org/github.com/huin/goupnp/dcps/av1) - Client for UPnP Device Control Protocol MediaServer v1 and MediaRenderer v1.\n* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) internetgateway1](https://godoc.org/github.com/huin/goupnp/dcps/internetgateway1) - Client for UPnP Device Control Protocol Internet Gateway Device v1.\n* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) internetgateway2](https://godoc.org/github.com/huin/goupnp/dcps/internetgateway2) - Client for UPnP Device Control Protocol Internet Gateway Device v2.\n\nCore components:\n\n* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) (goupnp)](https://godoc.org/github.com/huin/goupnp) core library - contains datastructures and utilities typically used by the implemented DCPs.\n* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) httpu](https://godoc.org/github.com/huin/goupnp/httpu) HTTPU implementation, underlies SSDP.\n* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) ssdp](https://godoc.org/github.com/huin/goupnp/ssdp) SSDP client implementation (simple service discovery protocol) - used to discover UPnP services on a network.\n* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) soap](https://godoc.org/github.com/huin/goupnp/soap) SOAP client implementation (simple object access protocol) - used to communicate with discovered services.\n\n\nRegenerating dcps generated source code:\n----------------------------------------\n\n1. Install gotasks: `go get -u github.com/jingweno/gotask`\n2. Change to the gotasks directory: `cd gotasks`\n3. Run specgen task: `gotask specgen`\n\nSupporting additional UPnP devices and services:\n------------------------------------------------\n\nSupporting additional services is, in the trivial case, simply a matter of\nadding the service to the `dcpMetadata` whitelist in `gotasks/specgen_task.go`,\nregenerating the source code (see above), and committing that source code.\n\nHowever, it would be helpful if anyone needing such a service could test the\nservice against the service they have, and then reporting any trouble\nencountered as an [issue on this\nproject](https://github.com/huin/goupnp/issues/new). If it just works, then\nplease report at least minimal working functionality as an issue, and\noptionally contribute the metadata upstream.\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/dcps/internetgateway1/internetgateway1.go",
    "content": "// Client for UPnP Device Control Protocol Internet Gateway Device v1.\n//\n// This DCP is documented in detail at: http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf\n//\n// Typically, use one of the New* functions to create clients for services.\npackage internetgateway1\n\n// Generated file - do not edit by hand. See README.md\n\nimport (\n\t\"net/url\"\n\t\"time\"\n\n\t\"github.com/huin/goupnp\"\n\t\"github.com/huin/goupnp/soap\"\n)\n\n// Hack to avoid Go complaining if time isn't used.\nvar _ time.Time\n\n// Device URNs:\nconst (\n\tURN_LANDevice_1           = \"urn:schemas-upnp-org:device:LANDevice:1\"\n\tURN_WANConnectionDevice_1 = \"urn:schemas-upnp-org:device:WANConnectionDevice:1\"\n\tURN_WANDevice_1           = \"urn:schemas-upnp-org:device:WANDevice:1\"\n)\n\n// Service URNs:\nconst (\n\tURN_LANHostConfigManagement_1  = \"urn:schemas-upnp-org:service:LANHostConfigManagement:1\"\n\tURN_Layer3Forwarding_1         = \"urn:schemas-upnp-org:service:Layer3Forwarding:1\"\n\tURN_WANCableLinkConfig_1       = \"urn:schemas-upnp-org:service:WANCableLinkConfig:1\"\n\tURN_WANCommonInterfaceConfig_1 = \"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1\"\n\tURN_WANDSLLinkConfig_1         = \"urn:schemas-upnp-org:service:WANDSLLinkConfig:1\"\n\tURN_WANEthernetLinkConfig_1    = \"urn:schemas-upnp-org:service:WANEthernetLinkConfig:1\"\n\tURN_WANIPConnection_1          = \"urn:schemas-upnp-org:service:WANIPConnection:1\"\n\tURN_WANPOTSLinkConfig_1        = \"urn:schemas-upnp-org:service:WANPOTSLinkConfig:1\"\n\tURN_WANPPPConnection_1         = \"urn:schemas-upnp-org:service:WANPPPConnection:1\"\n)\n\n// LANHostConfigManagement1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:LANHostConfigManagement:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype LANHostConfigManagement1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewLANHostConfigManagement1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewLANHostConfigManagement1Clients() (clients []*LANHostConfigManagement1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_LANHostConfigManagement_1); err != nil {\n\t\treturn\n\t}\n\tclients = newLANHostConfigManagement1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewLANHostConfigManagement1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewLANHostConfigManagement1ClientsByURL(loc *url.URL) ([]*LANHostConfigManagement1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_LANHostConfigManagement_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewLANHostConfigManagement1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewLANHostConfigManagement1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*LANHostConfigManagement1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_LANHostConfigManagement_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newLANHostConfigManagement1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*LANHostConfigManagement1 {\n\tclients := make([]*LANHostConfigManagement1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &LANHostConfigManagement1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *LANHostConfigManagement1) SetDHCPServerConfigurable(NewDHCPServerConfigurable bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDHCPServerConfigurable string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDHCPServerConfigurable, err = soap.MarshalBoolean(NewDHCPServerConfigurable); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDHCPServerConfigurable\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDHCPServerConfigurable() (NewDHCPServerConfigurable bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDHCPServerConfigurable string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDHCPServerConfigurable\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDHCPServerConfigurable, err = soap.UnmarshalBoolean(response.NewDHCPServerConfigurable); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetDHCPRelay(NewDHCPRelay bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDHCPRelay string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDHCPRelay, err = soap.MarshalBoolean(NewDHCPRelay); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDHCPRelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDHCPRelay() (NewDHCPRelay bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDHCPRelay string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDHCPRelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDHCPRelay, err = soap.UnmarshalBoolean(response.NewDHCPRelay); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetSubnetMask(NewSubnetMask string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewSubnetMask string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewSubnetMask, err = soap.MarshalString(NewSubnetMask); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetSubnetMask\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetSubnetMask() (NewSubnetMask string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewSubnetMask string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetSubnetMask\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewSubnetMask, err = soap.UnmarshalString(response.NewSubnetMask); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetIPRouter(NewIPRouters string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIPRouters string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetIPRouter\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) DeleteIPRouter(NewIPRouters string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIPRouters string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"DeleteIPRouter\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetIPRoutersList() (NewIPRouters string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewIPRouters string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetIPRoutersList\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewIPRouters, err = soap.UnmarshalString(response.NewIPRouters); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetDomainName(NewDomainName string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDomainName string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDomainName, err = soap.MarshalString(NewDomainName); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDomainName\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDomainName() (NewDomainName string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDomainName string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDomainName\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDomainName, err = soap.UnmarshalString(response.NewDomainName); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetAddressRange(NewMinAddress string, NewMaxAddress string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewMinAddress string\n\n\t\tNewMaxAddress string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewMinAddress, err = soap.MarshalString(NewMinAddress); err != nil {\n\t\treturn\n\t}\n\tif request.NewMaxAddress, err = soap.MarshalString(NewMaxAddress); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetAddressRange\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetAddressRange() (NewMinAddress string, NewMaxAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewMinAddress string\n\n\t\tNewMaxAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetAddressRange\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewMinAddress, err = soap.UnmarshalString(response.NewMinAddress); err != nil {\n\t\treturn\n\t}\n\tif NewMaxAddress, err = soap.UnmarshalString(response.NewMaxAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetReservedAddress(NewReservedAddresses string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewReservedAddresses string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetReservedAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) DeleteReservedAddress(NewReservedAddresses string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewReservedAddresses string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"DeleteReservedAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetReservedAddresses() (NewReservedAddresses string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewReservedAddresses string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetReservedAddresses\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewReservedAddresses, err = soap.UnmarshalString(response.NewReservedAddresses); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetDNSServer(NewDNSServers string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDNSServers string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDNSServer\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) DeleteDNSServer(NewDNSServers string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDNSServers string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"DeleteDNSServer\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDNSServers() (NewDNSServers string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDNSServers string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDNSServers\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDNSServers, err = soap.UnmarshalString(response.NewDNSServers); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// Layer3Forwarding1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:Layer3Forwarding:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype Layer3Forwarding1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewLayer3Forwarding1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewLayer3Forwarding1Clients() (clients []*Layer3Forwarding1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_Layer3Forwarding_1); err != nil {\n\t\treturn\n\t}\n\tclients = newLayer3Forwarding1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewLayer3Forwarding1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewLayer3Forwarding1ClientsByURL(loc *url.URL) ([]*Layer3Forwarding1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_Layer3Forwarding_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewLayer3Forwarding1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewLayer3Forwarding1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*Layer3Forwarding1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_Layer3Forwarding_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newLayer3Forwarding1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*Layer3Forwarding1 {\n\tclients := make([]*Layer3Forwarding1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &Layer3Forwarding1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *Layer3Forwarding1) SetDefaultConnectionService(NewDefaultConnectionService string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDefaultConnectionService string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDefaultConnectionService, err = soap.MarshalString(NewDefaultConnectionService); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, \"SetDefaultConnectionService\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *Layer3Forwarding1) GetDefaultConnectionService() (NewDefaultConnectionService string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDefaultConnectionService string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, \"GetDefaultConnectionService\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDefaultConnectionService, err = soap.UnmarshalString(response.NewDefaultConnectionService); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANCableLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANCableLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANCableLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANCableLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANCableLinkConfig1Clients() (clients []*WANCableLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANCableLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANCableLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANCableLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANCableLinkConfig1ClientsByURL(loc *url.URL) ([]*WANCableLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCableLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANCableLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANCableLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCableLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCableLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANCableLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCableLinkConfig1 {\n\tclients := make([]*WANCableLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANCableLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\n//\n// Return values:\n//\n// * NewCableLinkConfigState: allowed values: notReady, dsSyncComplete, usParamAcquired, rangingComplete, ipComplete, todEstablished, paramTransferComplete, registrationComplete, operational, accessDenied\n//\n// * NewLinkType: allowed values: Ethernet\nfunc (client *WANCableLinkConfig1) GetCableLinkConfigInfo() (NewCableLinkConfigState string, NewLinkType string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewCableLinkConfigState string\n\n\t\tNewLinkType string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetCableLinkConfigInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewCableLinkConfigState, err = soap.UnmarshalString(response.NewCableLinkConfigState); err != nil {\n\t\treturn\n\t}\n\tif NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetDownstreamFrequency() (NewDownstreamFrequency uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDownstreamFrequency string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetDownstreamFrequency\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDownstreamFrequency, err = soap.UnmarshalUi4(response.NewDownstreamFrequency); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewDownstreamModulation: allowed values: 64QAM, 256QAM\nfunc (client *WANCableLinkConfig1) GetDownstreamModulation() (NewDownstreamModulation string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDownstreamModulation string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetDownstreamModulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDownstreamModulation, err = soap.UnmarshalString(response.NewDownstreamModulation); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetUpstreamFrequency() (NewUpstreamFrequency uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamFrequency string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamFrequency\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamFrequency, err = soap.UnmarshalUi4(response.NewUpstreamFrequency); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewUpstreamModulation: allowed values: QPSK, 16QAM\nfunc (client *WANCableLinkConfig1) GetUpstreamModulation() (NewUpstreamModulation string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamModulation string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamModulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamModulation, err = soap.UnmarshalString(response.NewUpstreamModulation); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetUpstreamChannelID() (NewUpstreamChannelID uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamChannelID string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamChannelID\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamChannelID, err = soap.UnmarshalUi4(response.NewUpstreamChannelID); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetUpstreamPowerLevel() (NewUpstreamPowerLevel uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamPowerLevel string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamPowerLevel\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamPowerLevel, err = soap.UnmarshalUi4(response.NewUpstreamPowerLevel); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetBPIEncryptionEnabled() (NewBPIEncryptionEnabled bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewBPIEncryptionEnabled string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetBPIEncryptionEnabled\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewBPIEncryptionEnabled, err = soap.UnmarshalBoolean(response.NewBPIEncryptionEnabled); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetConfigFile() (NewConfigFile string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConfigFile string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetConfigFile\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConfigFile, err = soap.UnmarshalString(response.NewConfigFile); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetTFTPServer() (NewTFTPServer string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTFTPServer string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetTFTPServer\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTFTPServer, err = soap.UnmarshalString(response.NewTFTPServer); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANCommonInterfaceConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANCommonInterfaceConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANCommonInterfaceConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANCommonInterfaceConfig1Clients() (clients []*WANCommonInterfaceConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANCommonInterfaceConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANCommonInterfaceConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANCommonInterfaceConfig1ClientsByURL(loc *url.URL) ([]*WANCommonInterfaceConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCommonInterfaceConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANCommonInterfaceConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANCommonInterfaceConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCommonInterfaceConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCommonInterfaceConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCommonInterfaceConfig1 {\n\tclients := make([]*WANCommonInterfaceConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANCommonInterfaceConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANCommonInterfaceConfig1) SetEnabledForInternet(NewEnabledForInternet bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewEnabledForInternet string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewEnabledForInternet, err = soap.MarshalBoolean(NewEnabledForInternet); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"SetEnabledForInternet\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetEnabledForInternet() (NewEnabledForInternet bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewEnabledForInternet string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetEnabledForInternet\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewEnabledForInternet, err = soap.UnmarshalBoolean(response.NewEnabledForInternet); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewWANAccessType: allowed values: DSL, POTS, Cable, Ethernet\n//\n// * NewPhysicalLinkStatus: allowed values: Up, Down\nfunc (client *WANCommonInterfaceConfig1) GetCommonLinkProperties() (NewWANAccessType string, NewLayer1UpstreamMaxBitRate uint32, NewLayer1DownstreamMaxBitRate uint32, NewPhysicalLinkStatus string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWANAccessType string\n\n\t\tNewLayer1UpstreamMaxBitRate string\n\n\t\tNewLayer1DownstreamMaxBitRate string\n\n\t\tNewPhysicalLinkStatus string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetCommonLinkProperties\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWANAccessType, err = soap.UnmarshalString(response.NewWANAccessType); err != nil {\n\t\treturn\n\t}\n\tif NewLayer1UpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1UpstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\tif NewLayer1DownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1DownstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\tif NewPhysicalLinkStatus, err = soap.UnmarshalString(response.NewPhysicalLinkStatus); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetWANAccessProvider() (NewWANAccessProvider string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWANAccessProvider string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetWANAccessProvider\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWANAccessProvider, err = soap.UnmarshalString(response.NewWANAccessProvider); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewMaximumActiveConnections: allowed value range: minimum=1, step=1\nfunc (client *WANCommonInterfaceConfig1) GetMaximumActiveConnections() (NewMaximumActiveConnections uint16, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewMaximumActiveConnections string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetMaximumActiveConnections\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewMaximumActiveConnections, err = soap.UnmarshalUi2(response.NewMaximumActiveConnections); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalBytesSent() (NewTotalBytesSent uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalBytesSent string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalBytesSent\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalBytesSent, err = soap.UnmarshalUi4(response.NewTotalBytesSent); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalBytesReceived() (NewTotalBytesReceived uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalBytesReceived string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalBytesReceived\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalBytesReceived, err = soap.UnmarshalUi4(response.NewTotalBytesReceived); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalPacketsSent() (NewTotalPacketsSent uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalPacketsSent string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalPacketsSent\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalPacketsSent, err = soap.UnmarshalUi4(response.NewTotalPacketsSent); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalPacketsReceived() (NewTotalPacketsReceived uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalPacketsReceived string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalPacketsReceived\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalPacketsReceived, err = soap.UnmarshalUi4(response.NewTotalPacketsReceived); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetActiveConnection(NewActiveConnectionIndex uint16) (NewActiveConnDeviceContainer string, NewActiveConnectionServiceID string, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewActiveConnectionIndex string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewActiveConnectionIndex, err = soap.MarshalUi2(NewActiveConnectionIndex); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewActiveConnDeviceContainer string\n\n\t\tNewActiveConnectionServiceID string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetActiveConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewActiveConnDeviceContainer, err = soap.UnmarshalString(response.NewActiveConnDeviceContainer); err != nil {\n\t\treturn\n\t}\n\tif NewActiveConnectionServiceID, err = soap.UnmarshalString(response.NewActiveConnectionServiceID); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANDSLLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANDSLLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANDSLLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANDSLLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANDSLLinkConfig1Clients() (clients []*WANDSLLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANDSLLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANDSLLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANDSLLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANDSLLinkConfig1ClientsByURL(loc *url.URL) ([]*WANDSLLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANDSLLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANDSLLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANDSLLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANDSLLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANDSLLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANDSLLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANDSLLinkConfig1 {\n\tclients := make([]*WANDSLLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANDSLLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANDSLLinkConfig1) SetDSLLinkType(NewLinkType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewLinkType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetDSLLinkType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewLinkStatus: allowed values: Up, Down\nfunc (client *WANDSLLinkConfig1) GetDSLLinkInfo() (NewLinkType string, NewLinkStatus string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewLinkType string\n\n\t\tNewLinkStatus string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetDSLLinkInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil {\n\t\treturn\n\t}\n\tif NewLinkStatus, err = soap.UnmarshalString(response.NewLinkStatus); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetAutoConfig() (NewAutoConfig bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewAutoConfig string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetAutoConfig\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewAutoConfig, err = soap.UnmarshalBoolean(response.NewAutoConfig); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetModulationType() (NewModulationType string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewModulationType string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetModulationType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewModulationType, err = soap.UnmarshalString(response.NewModulationType); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) SetDestinationAddress(NewDestinationAddress string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDestinationAddress string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDestinationAddress, err = soap.MarshalString(NewDestinationAddress); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetDestinationAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetDestinationAddress() (NewDestinationAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDestinationAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetDestinationAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDestinationAddress, err = soap.UnmarshalString(response.NewDestinationAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) SetATMEncapsulation(NewATMEncapsulation string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewATMEncapsulation string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewATMEncapsulation, err = soap.MarshalString(NewATMEncapsulation); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetATMEncapsulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetATMEncapsulation() (NewATMEncapsulation string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewATMEncapsulation string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetATMEncapsulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewATMEncapsulation, err = soap.UnmarshalString(response.NewATMEncapsulation); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) SetFCSPreserved(NewFCSPreserved bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewFCSPreserved string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewFCSPreserved, err = soap.MarshalBoolean(NewFCSPreserved); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetFCSPreserved\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetFCSPreserved() (NewFCSPreserved bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewFCSPreserved string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetFCSPreserved\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewFCSPreserved, err = soap.UnmarshalBoolean(response.NewFCSPreserved); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANEthernetLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANEthernetLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANEthernetLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANEthernetLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANEthernetLinkConfig1Clients() (clients []*WANEthernetLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANEthernetLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANEthernetLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANEthernetLinkConfig1ClientsByURL(loc *url.URL) ([]*WANEthernetLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANEthernetLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANEthernetLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANEthernetLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANEthernetLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANEthernetLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANEthernetLinkConfig1 {\n\tclients := make([]*WANEthernetLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANEthernetLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\n//\n// Return values:\n//\n// * NewEthernetLinkStatus: allowed values: Up, Down\nfunc (client *WANEthernetLinkConfig1) GetEthernetLinkStatus() (NewEthernetLinkStatus string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewEthernetLinkStatus string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANEthernetLinkConfig_1, \"GetEthernetLinkStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewEthernetLinkStatus, err = soap.UnmarshalString(response.NewEthernetLinkStatus); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANIPConnection1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANIPConnection:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANIPConnection1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANIPConnection1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANIPConnection1Clients() (clients []*WANIPConnection1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPConnection_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANIPConnection1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANIPConnection1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANIPConnection1ClientsByURL(loc *url.URL) ([]*WANIPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANIPConnection1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANIPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANIPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPConnection1 {\n\tclients := make([]*WANIPConnection1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANIPConnection1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANIPConnection1) SetConnectionType(NewConnectionType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewConnectionType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetConnectionType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, IP_Bridged\nfunc (client *WANIPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionType string\n\n\t\tNewPossibleConnectionTypes string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetConnectionTypeInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil {\n\t\treturn\n\t}\n\tif NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) RequestConnection() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"RequestConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) RequestTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"RequestTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) ForceTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"ForceTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected\n//\n// * NewLastConnectionError: allowed values: ERROR_NONE\nfunc (client *WANIPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionStatus string\n\n\t\tNewLastConnectionError string\n\n\t\tNewUptime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetStatusInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil {\n\t\treturn\n\t}\n\tif NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil {\n\t\treturn\n\t}\n\tif NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRSIPAvailable string\n\n\t\tNewNATEnabled string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetNATRSIPStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil {\n\t\treturn\n\t}\n\tif NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewProtocol: allowed values: TCP, UDP\nfunc (client *WANIPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewPortMappingIndex string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetGenericPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetSpecificPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"AddPortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"DeletePortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewExternalIPAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetExternalIPAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANPOTSLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANPOTSLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANPOTSLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANPOTSLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANPOTSLinkConfig1Clients() (clients []*WANPOTSLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANPOTSLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANPOTSLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANPOTSLinkConfig1ClientsByURL(loc *url.URL) ([]*WANPOTSLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPOTSLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANPOTSLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANPOTSLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPOTSLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPOTSLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPOTSLinkConfig1 {\n\tclients := make([]*WANPOTSLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANPOTSLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\n//\n// Arguments:\n//\n// * NewLinkType: allowed values: PPP_Dialup\n\nfunc (client *WANPOTSLinkConfig1) SetISPInfo(NewISPPhoneNumber string, NewISPInfo string, NewLinkType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewISPPhoneNumber string\n\n\t\tNewISPInfo string\n\n\t\tNewLinkType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewISPPhoneNumber, err = soap.MarshalString(NewISPPhoneNumber); err != nil {\n\t\treturn\n\t}\n\tif request.NewISPInfo, err = soap.MarshalString(NewISPInfo); err != nil {\n\t\treturn\n\t}\n\tif request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"SetISPInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) SetCallRetryInfo(NewNumberOfRetries uint32, NewDelayBetweenRetries uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewNumberOfRetries string\n\n\t\tNewDelayBetweenRetries string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewNumberOfRetries, err = soap.MarshalUi4(NewNumberOfRetries); err != nil {\n\t\treturn\n\t}\n\tif request.NewDelayBetweenRetries, err = soap.MarshalUi4(NewDelayBetweenRetries); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"SetCallRetryInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewLinkType: allowed values: PPP_Dialup\nfunc (client *WANPOTSLinkConfig1) GetISPInfo() (NewISPPhoneNumber string, NewISPInfo string, NewLinkType string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewISPPhoneNumber string\n\n\t\tNewISPInfo string\n\n\t\tNewLinkType string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetISPInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewISPPhoneNumber, err = soap.UnmarshalString(response.NewISPPhoneNumber); err != nil {\n\t\treturn\n\t}\n\tif NewISPInfo, err = soap.UnmarshalString(response.NewISPInfo); err != nil {\n\t\treturn\n\t}\n\tif NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetCallRetryInfo() (NewNumberOfRetries uint32, NewDelayBetweenRetries uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewNumberOfRetries string\n\n\t\tNewDelayBetweenRetries string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetCallRetryInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewNumberOfRetries, err = soap.UnmarshalUi4(response.NewNumberOfRetries); err != nil {\n\t\treturn\n\t}\n\tif NewDelayBetweenRetries, err = soap.UnmarshalUi4(response.NewDelayBetweenRetries); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetFclass() (NewFclass string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewFclass string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetFclass\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewFclass, err = soap.UnmarshalString(response.NewFclass); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetDataModulationSupported() (NewDataModulationSupported string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDataModulationSupported string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetDataModulationSupported\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDataModulationSupported, err = soap.UnmarshalString(response.NewDataModulationSupported); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetDataProtocol() (NewDataProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDataProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetDataProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDataProtocol, err = soap.UnmarshalString(response.NewDataProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetDataCompression() (NewDataCompression string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDataCompression string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetDataCompression\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDataCompression, err = soap.UnmarshalString(response.NewDataCompression); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetPlusVTRCommandSupported() (NewPlusVTRCommandSupported bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPlusVTRCommandSupported string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetPlusVTRCommandSupported\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPlusVTRCommandSupported, err = soap.UnmarshalBoolean(response.NewPlusVTRCommandSupported); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANPPPConnection1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANPPPConnection:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANPPPConnection1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANPPPConnection1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANPPPConnection1Clients() (clients []*WANPPPConnection1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANPPPConnection_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANPPPConnection1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANPPPConnection1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANPPPConnection1ClientsByURL(loc *url.URL) ([]*WANPPPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPPPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPPPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANPPPConnection1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANPPPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPPPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPPPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPPPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANPPPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPPPConnection1 {\n\tclients := make([]*WANPPPConnection1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANPPPConnection1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANPPPConnection1) SetConnectionType(NewConnectionType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewConnectionType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetConnectionType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, DHCP_Spoofed, PPPoE_Bridged, PPTP_Relay, L2TP_Relay, PPPoE_Relay\nfunc (client *WANPPPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionType string\n\n\t\tNewPossibleConnectionTypes string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetConnectionTypeInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil {\n\t\treturn\n\t}\n\tif NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) ConfigureConnection(NewUserName string, NewPassword string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewUserName string\n\n\t\tNewPassword string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewUserName, err = soap.MarshalString(NewUserName); err != nil {\n\t\treturn\n\t}\n\tif request.NewPassword, err = soap.MarshalString(NewPassword); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"ConfigureConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) RequestConnection() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"RequestConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) RequestTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"RequestTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) ForceTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"ForceTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected\n//\n// * NewLastConnectionError: allowed values: ERROR_NONE\nfunc (client *WANPPPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionStatus string\n\n\t\tNewLastConnectionError string\n\n\t\tNewUptime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetStatusInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil {\n\t\treturn\n\t}\n\tif NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil {\n\t\treturn\n\t}\n\tif NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetLinkLayerMaxBitRates() (NewUpstreamMaxBitRate uint32, NewDownstreamMaxBitRate uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamMaxBitRate string\n\n\t\tNewDownstreamMaxBitRate string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetLinkLayerMaxBitRates\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewUpstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\tif NewDownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewDownstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPPPEncryptionProtocol() (NewPPPEncryptionProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPPPEncryptionProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPPPEncryptionProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPPPEncryptionProtocol, err = soap.UnmarshalString(response.NewPPPEncryptionProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPPPCompressionProtocol() (NewPPPCompressionProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPPPCompressionProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPPPCompressionProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPPPCompressionProtocol, err = soap.UnmarshalString(response.NewPPPCompressionProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPPPAuthenticationProtocol() (NewPPPAuthenticationProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPPPAuthenticationProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPPPAuthenticationProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPPPAuthenticationProtocol, err = soap.UnmarshalString(response.NewPPPAuthenticationProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetUserName() (NewUserName string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUserName string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetUserName\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUserName, err = soap.UnmarshalString(response.NewUserName); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPassword() (NewPassword string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPassword string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPassword\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPassword, err = soap.UnmarshalString(response.NewPassword); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRSIPAvailable string\n\n\t\tNewNATEnabled string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetNATRSIPStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil {\n\t\treturn\n\t}\n\tif NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewProtocol: allowed values: TCP, UDP\nfunc (client *WANPPPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewPortMappingIndex string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetGenericPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANPPPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetSpecificPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANPPPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"AddPortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANPPPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"DeletePortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewExternalIPAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetExternalIPAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/dcps/internetgateway2/internetgateway2.go",
    "content": "// Client for UPnP Device Control Protocol Internet Gateway Device v2.\n//\n// This DCP is documented in detail at: http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v2-Device.pdf\n//\n// Typically, use one of the New* functions to create clients for services.\npackage internetgateway2\n\n// Generated file - do not edit by hand. See README.md\n\nimport (\n\t\"net/url\"\n\t\"time\"\n\n\t\"github.com/huin/goupnp\"\n\t\"github.com/huin/goupnp/soap\"\n)\n\n// Hack to avoid Go complaining if time isn't used.\nvar _ time.Time\n\n// Device URNs:\nconst (\n\tURN_LANDevice_1           = \"urn:schemas-upnp-org:device:LANDevice:1\"\n\tURN_WANConnectionDevice_1 = \"urn:schemas-upnp-org:device:WANConnectionDevice:1\"\n\tURN_WANConnectionDevice_2 = \"urn:schemas-upnp-org:device:WANConnectionDevice:2\"\n\tURN_WANDevice_1           = \"urn:schemas-upnp-org:device:WANDevice:1\"\n\tURN_WANDevice_2           = \"urn:schemas-upnp-org:device:WANDevice:2\"\n)\n\n// Service URNs:\nconst (\n\tURN_DeviceProtection_1         = \"urn:schemas-upnp-org:service:DeviceProtection:1\"\n\tURN_LANHostConfigManagement_1  = \"urn:schemas-upnp-org:service:LANHostConfigManagement:1\"\n\tURN_Layer3Forwarding_1         = \"urn:schemas-upnp-org:service:Layer3Forwarding:1\"\n\tURN_WANCableLinkConfig_1       = \"urn:schemas-upnp-org:service:WANCableLinkConfig:1\"\n\tURN_WANCommonInterfaceConfig_1 = \"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1\"\n\tURN_WANDSLLinkConfig_1         = \"urn:schemas-upnp-org:service:WANDSLLinkConfig:1\"\n\tURN_WANEthernetLinkConfig_1    = \"urn:schemas-upnp-org:service:WANEthernetLinkConfig:1\"\n\tURN_WANIPConnection_1          = \"urn:schemas-upnp-org:service:WANIPConnection:1\"\n\tURN_WANIPConnection_2          = \"urn:schemas-upnp-org:service:WANIPConnection:2\"\n\tURN_WANIPv6FirewallControl_1   = \"urn:schemas-upnp-org:service:WANIPv6FirewallControl:1\"\n\tURN_WANPOTSLinkConfig_1        = \"urn:schemas-upnp-org:service:WANPOTSLinkConfig:1\"\n\tURN_WANPPPConnection_1         = \"urn:schemas-upnp-org:service:WANPPPConnection:1\"\n)\n\n// DeviceProtection1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:DeviceProtection:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype DeviceProtection1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewDeviceProtection1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewDeviceProtection1Clients() (clients []*DeviceProtection1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_DeviceProtection_1); err != nil {\n\t\treturn\n\t}\n\tclients = newDeviceProtection1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewDeviceProtection1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewDeviceProtection1ClientsByURL(loc *url.URL) ([]*DeviceProtection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_DeviceProtection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newDeviceProtection1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewDeviceProtection1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewDeviceProtection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*DeviceProtection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_DeviceProtection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newDeviceProtection1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newDeviceProtection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*DeviceProtection1 {\n\tclients := make([]*DeviceProtection1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &DeviceProtection1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *DeviceProtection1) SendSetupMessage(ProtocolType string, InMessage []byte) (OutMessage []byte, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tProtocolType string\n\n\t\tInMessage string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil {\n\t\treturn\n\t}\n\tif request.InMessage, err = soap.MarshalBinBase64(InMessage); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tOutMessage string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"SendSetupMessage\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif OutMessage, err = soap.UnmarshalBinBase64(response.OutMessage); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) GetSupportedProtocols() (ProtocolList string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tProtocolList string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"GetSupportedProtocols\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif ProtocolList, err = soap.UnmarshalString(response.ProtocolList); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) GetAssignedRoles() (RoleList string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tRoleList string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"GetAssignedRoles\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif RoleList, err = soap.UnmarshalString(response.RoleList); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) GetRolesForAction(DeviceUDN string, ServiceId string, ActionName string) (RoleList string, RestrictedRoleList string, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tDeviceUDN string\n\n\t\tServiceId string\n\n\t\tActionName string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.DeviceUDN, err = soap.MarshalString(DeviceUDN); err != nil {\n\t\treturn\n\t}\n\tif request.ServiceId, err = soap.MarshalString(ServiceId); err != nil {\n\t\treturn\n\t}\n\tif request.ActionName, err = soap.MarshalString(ActionName); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tRoleList string\n\n\t\tRestrictedRoleList string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"GetRolesForAction\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif RoleList, err = soap.UnmarshalString(response.RoleList); err != nil {\n\t\treturn\n\t}\n\tif RestrictedRoleList, err = soap.UnmarshalString(response.RestrictedRoleList); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) GetUserLoginChallenge(ProtocolType string, Name string) (Salt []byte, Challenge []byte, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tProtocolType string\n\n\t\tName string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil {\n\t\treturn\n\t}\n\tif request.Name, err = soap.MarshalString(Name); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tSalt string\n\n\t\tChallenge string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"GetUserLoginChallenge\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif Salt, err = soap.UnmarshalBinBase64(response.Salt); err != nil {\n\t\treturn\n\t}\n\tif Challenge, err = soap.UnmarshalBinBase64(response.Challenge); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) UserLogin(ProtocolType string, Challenge []byte, Authenticator []byte) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tProtocolType string\n\n\t\tChallenge string\n\n\t\tAuthenticator string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil {\n\t\treturn\n\t}\n\tif request.Challenge, err = soap.MarshalBinBase64(Challenge); err != nil {\n\t\treturn\n\t}\n\tif request.Authenticator, err = soap.MarshalBinBase64(Authenticator); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"UserLogin\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) UserLogout() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"UserLogout\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) GetACLData() (ACL string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tACL string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"GetACLData\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif ACL, err = soap.UnmarshalString(response.ACL); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) AddIdentityList(IdentityList string) (IdentityListResult string, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tIdentityList string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.IdentityList, err = soap.MarshalString(IdentityList); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tIdentityListResult string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"AddIdentityList\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif IdentityListResult, err = soap.UnmarshalString(response.IdentityListResult); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) RemoveIdentity(Identity string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tIdentity string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.Identity, err = soap.MarshalString(Identity); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"RemoveIdentity\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) SetUserLoginPassword(ProtocolType string, Name string, Stored []byte, Salt []byte) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tProtocolType string\n\n\t\tName string\n\n\t\tStored string\n\n\t\tSalt string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil {\n\t\treturn\n\t}\n\tif request.Name, err = soap.MarshalString(Name); err != nil {\n\t\treturn\n\t}\n\tif request.Stored, err = soap.MarshalBinBase64(Stored); err != nil {\n\t\treturn\n\t}\n\tif request.Salt, err = soap.MarshalBinBase64(Salt); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"SetUserLoginPassword\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) AddRolesForIdentity(Identity string, RoleList string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tIdentity string\n\n\t\tRoleList string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.Identity, err = soap.MarshalString(Identity); err != nil {\n\t\treturn\n\t}\n\tif request.RoleList, err = soap.MarshalString(RoleList); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"AddRolesForIdentity\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *DeviceProtection1) RemoveRolesForIdentity(Identity string, RoleList string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tIdentity string\n\n\t\tRoleList string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.Identity, err = soap.MarshalString(Identity); err != nil {\n\t\treturn\n\t}\n\tif request.RoleList, err = soap.MarshalString(RoleList); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, \"RemoveRolesForIdentity\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// LANHostConfigManagement1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:LANHostConfigManagement:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype LANHostConfigManagement1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewLANHostConfigManagement1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewLANHostConfigManagement1Clients() (clients []*LANHostConfigManagement1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_LANHostConfigManagement_1); err != nil {\n\t\treturn\n\t}\n\tclients = newLANHostConfigManagement1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewLANHostConfigManagement1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewLANHostConfigManagement1ClientsByURL(loc *url.URL) ([]*LANHostConfigManagement1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_LANHostConfigManagement_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewLANHostConfigManagement1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewLANHostConfigManagement1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*LANHostConfigManagement1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_LANHostConfigManagement_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newLANHostConfigManagement1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*LANHostConfigManagement1 {\n\tclients := make([]*LANHostConfigManagement1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &LANHostConfigManagement1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *LANHostConfigManagement1) SetDHCPServerConfigurable(NewDHCPServerConfigurable bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDHCPServerConfigurable string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDHCPServerConfigurable, err = soap.MarshalBoolean(NewDHCPServerConfigurable); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDHCPServerConfigurable\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDHCPServerConfigurable() (NewDHCPServerConfigurable bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDHCPServerConfigurable string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDHCPServerConfigurable\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDHCPServerConfigurable, err = soap.UnmarshalBoolean(response.NewDHCPServerConfigurable); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetDHCPRelay(NewDHCPRelay bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDHCPRelay string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDHCPRelay, err = soap.MarshalBoolean(NewDHCPRelay); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDHCPRelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDHCPRelay() (NewDHCPRelay bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDHCPRelay string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDHCPRelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDHCPRelay, err = soap.UnmarshalBoolean(response.NewDHCPRelay); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetSubnetMask(NewSubnetMask string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewSubnetMask string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewSubnetMask, err = soap.MarshalString(NewSubnetMask); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetSubnetMask\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetSubnetMask() (NewSubnetMask string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewSubnetMask string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetSubnetMask\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewSubnetMask, err = soap.UnmarshalString(response.NewSubnetMask); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetIPRouter(NewIPRouters string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIPRouters string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetIPRouter\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) DeleteIPRouter(NewIPRouters string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIPRouters string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"DeleteIPRouter\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetIPRoutersList() (NewIPRouters string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewIPRouters string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetIPRoutersList\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewIPRouters, err = soap.UnmarshalString(response.NewIPRouters); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetDomainName(NewDomainName string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDomainName string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDomainName, err = soap.MarshalString(NewDomainName); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDomainName\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDomainName() (NewDomainName string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDomainName string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDomainName\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDomainName, err = soap.UnmarshalString(response.NewDomainName); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetAddressRange(NewMinAddress string, NewMaxAddress string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewMinAddress string\n\n\t\tNewMaxAddress string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewMinAddress, err = soap.MarshalString(NewMinAddress); err != nil {\n\t\treturn\n\t}\n\tif request.NewMaxAddress, err = soap.MarshalString(NewMaxAddress); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetAddressRange\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetAddressRange() (NewMinAddress string, NewMaxAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewMinAddress string\n\n\t\tNewMaxAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetAddressRange\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewMinAddress, err = soap.UnmarshalString(response.NewMinAddress); err != nil {\n\t\treturn\n\t}\n\tif NewMaxAddress, err = soap.UnmarshalString(response.NewMaxAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetReservedAddress(NewReservedAddresses string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewReservedAddresses string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetReservedAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) DeleteReservedAddress(NewReservedAddresses string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewReservedAddresses string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"DeleteReservedAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetReservedAddresses() (NewReservedAddresses string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewReservedAddresses string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetReservedAddresses\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewReservedAddresses, err = soap.UnmarshalString(response.NewReservedAddresses); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) SetDNSServer(NewDNSServers string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDNSServers string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"SetDNSServer\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) DeleteDNSServer(NewDNSServers string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDNSServers string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"DeleteDNSServer\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *LANHostConfigManagement1) GetDNSServers() (NewDNSServers string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDNSServers string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, \"GetDNSServers\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDNSServers, err = soap.UnmarshalString(response.NewDNSServers); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// Layer3Forwarding1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:Layer3Forwarding:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype Layer3Forwarding1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewLayer3Forwarding1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewLayer3Forwarding1Clients() (clients []*Layer3Forwarding1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_Layer3Forwarding_1); err != nil {\n\t\treturn\n\t}\n\tclients = newLayer3Forwarding1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewLayer3Forwarding1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewLayer3Forwarding1ClientsByURL(loc *url.URL) ([]*Layer3Forwarding1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_Layer3Forwarding_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewLayer3Forwarding1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewLayer3Forwarding1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*Layer3Forwarding1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_Layer3Forwarding_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newLayer3Forwarding1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*Layer3Forwarding1 {\n\tclients := make([]*Layer3Forwarding1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &Layer3Forwarding1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *Layer3Forwarding1) SetDefaultConnectionService(NewDefaultConnectionService string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDefaultConnectionService string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDefaultConnectionService, err = soap.MarshalString(NewDefaultConnectionService); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, \"SetDefaultConnectionService\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *Layer3Forwarding1) GetDefaultConnectionService() (NewDefaultConnectionService string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDefaultConnectionService string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, \"GetDefaultConnectionService\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDefaultConnectionService, err = soap.UnmarshalString(response.NewDefaultConnectionService); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANCableLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANCableLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANCableLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANCableLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANCableLinkConfig1Clients() (clients []*WANCableLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANCableLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANCableLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANCableLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANCableLinkConfig1ClientsByURL(loc *url.URL) ([]*WANCableLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCableLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANCableLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANCableLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCableLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCableLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANCableLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCableLinkConfig1 {\n\tclients := make([]*WANCableLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANCableLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\n//\n// Return values:\n//\n// * NewCableLinkConfigState: allowed values: notReady, dsSyncComplete, usParamAcquired, rangingComplete, ipComplete, todEstablished, paramTransferComplete, registrationComplete, operational, accessDenied\n//\n// * NewLinkType: allowed values: Ethernet\nfunc (client *WANCableLinkConfig1) GetCableLinkConfigInfo() (NewCableLinkConfigState string, NewLinkType string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewCableLinkConfigState string\n\n\t\tNewLinkType string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetCableLinkConfigInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewCableLinkConfigState, err = soap.UnmarshalString(response.NewCableLinkConfigState); err != nil {\n\t\treturn\n\t}\n\tif NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetDownstreamFrequency() (NewDownstreamFrequency uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDownstreamFrequency string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetDownstreamFrequency\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDownstreamFrequency, err = soap.UnmarshalUi4(response.NewDownstreamFrequency); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewDownstreamModulation: allowed values: 64QAM, 256QAM\nfunc (client *WANCableLinkConfig1) GetDownstreamModulation() (NewDownstreamModulation string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDownstreamModulation string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetDownstreamModulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDownstreamModulation, err = soap.UnmarshalString(response.NewDownstreamModulation); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetUpstreamFrequency() (NewUpstreamFrequency uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamFrequency string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamFrequency\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamFrequency, err = soap.UnmarshalUi4(response.NewUpstreamFrequency); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewUpstreamModulation: allowed values: QPSK, 16QAM\nfunc (client *WANCableLinkConfig1) GetUpstreamModulation() (NewUpstreamModulation string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamModulation string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamModulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamModulation, err = soap.UnmarshalString(response.NewUpstreamModulation); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetUpstreamChannelID() (NewUpstreamChannelID uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamChannelID string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamChannelID\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamChannelID, err = soap.UnmarshalUi4(response.NewUpstreamChannelID); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetUpstreamPowerLevel() (NewUpstreamPowerLevel uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamPowerLevel string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetUpstreamPowerLevel\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamPowerLevel, err = soap.UnmarshalUi4(response.NewUpstreamPowerLevel); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetBPIEncryptionEnabled() (NewBPIEncryptionEnabled bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewBPIEncryptionEnabled string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetBPIEncryptionEnabled\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewBPIEncryptionEnabled, err = soap.UnmarshalBoolean(response.NewBPIEncryptionEnabled); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetConfigFile() (NewConfigFile string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConfigFile string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetConfigFile\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConfigFile, err = soap.UnmarshalString(response.NewConfigFile); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCableLinkConfig1) GetTFTPServer() (NewTFTPServer string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTFTPServer string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, \"GetTFTPServer\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTFTPServer, err = soap.UnmarshalString(response.NewTFTPServer); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANCommonInterfaceConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANCommonInterfaceConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANCommonInterfaceConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANCommonInterfaceConfig1Clients() (clients []*WANCommonInterfaceConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANCommonInterfaceConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANCommonInterfaceConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANCommonInterfaceConfig1ClientsByURL(loc *url.URL) ([]*WANCommonInterfaceConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCommonInterfaceConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANCommonInterfaceConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANCommonInterfaceConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCommonInterfaceConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCommonInterfaceConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCommonInterfaceConfig1 {\n\tclients := make([]*WANCommonInterfaceConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANCommonInterfaceConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANCommonInterfaceConfig1) SetEnabledForInternet(NewEnabledForInternet bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewEnabledForInternet string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewEnabledForInternet, err = soap.MarshalBoolean(NewEnabledForInternet); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"SetEnabledForInternet\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetEnabledForInternet() (NewEnabledForInternet bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewEnabledForInternet string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetEnabledForInternet\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewEnabledForInternet, err = soap.UnmarshalBoolean(response.NewEnabledForInternet); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewWANAccessType: allowed values: DSL, POTS, Cable, Ethernet\n//\n// * NewPhysicalLinkStatus: allowed values: Up, Down\nfunc (client *WANCommonInterfaceConfig1) GetCommonLinkProperties() (NewWANAccessType string, NewLayer1UpstreamMaxBitRate uint32, NewLayer1DownstreamMaxBitRate uint32, NewPhysicalLinkStatus string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWANAccessType string\n\n\t\tNewLayer1UpstreamMaxBitRate string\n\n\t\tNewLayer1DownstreamMaxBitRate string\n\n\t\tNewPhysicalLinkStatus string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetCommonLinkProperties\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWANAccessType, err = soap.UnmarshalString(response.NewWANAccessType); err != nil {\n\t\treturn\n\t}\n\tif NewLayer1UpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1UpstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\tif NewLayer1DownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1DownstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\tif NewPhysicalLinkStatus, err = soap.UnmarshalString(response.NewPhysicalLinkStatus); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetWANAccessProvider() (NewWANAccessProvider string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWANAccessProvider string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetWANAccessProvider\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWANAccessProvider, err = soap.UnmarshalString(response.NewWANAccessProvider); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewMaximumActiveConnections: allowed value range: minimum=1, step=1\nfunc (client *WANCommonInterfaceConfig1) GetMaximumActiveConnections() (NewMaximumActiveConnections uint16, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewMaximumActiveConnections string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetMaximumActiveConnections\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewMaximumActiveConnections, err = soap.UnmarshalUi2(response.NewMaximumActiveConnections); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalBytesSent() (NewTotalBytesSent uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalBytesSent string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalBytesSent\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalBytesSent, err = soap.UnmarshalUi4(response.NewTotalBytesSent); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalBytesReceived() (NewTotalBytesReceived uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalBytesReceived string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalBytesReceived\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalBytesReceived, err = soap.UnmarshalUi4(response.NewTotalBytesReceived); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalPacketsSent() (NewTotalPacketsSent uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalPacketsSent string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalPacketsSent\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalPacketsSent, err = soap.UnmarshalUi4(response.NewTotalPacketsSent); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetTotalPacketsReceived() (NewTotalPacketsReceived uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewTotalPacketsReceived string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetTotalPacketsReceived\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewTotalPacketsReceived, err = soap.UnmarshalUi4(response.NewTotalPacketsReceived); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANCommonInterfaceConfig1) GetActiveConnection(NewActiveConnectionIndex uint16) (NewActiveConnDeviceContainer string, NewActiveConnectionServiceID string, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewActiveConnectionIndex string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewActiveConnectionIndex, err = soap.MarshalUi2(NewActiveConnectionIndex); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewActiveConnDeviceContainer string\n\n\t\tNewActiveConnectionServiceID string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, \"GetActiveConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewActiveConnDeviceContainer, err = soap.UnmarshalString(response.NewActiveConnDeviceContainer); err != nil {\n\t\treturn\n\t}\n\tif NewActiveConnectionServiceID, err = soap.UnmarshalString(response.NewActiveConnectionServiceID); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANDSLLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANDSLLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANDSLLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANDSLLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANDSLLinkConfig1Clients() (clients []*WANDSLLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANDSLLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANDSLLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANDSLLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANDSLLinkConfig1ClientsByURL(loc *url.URL) ([]*WANDSLLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANDSLLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANDSLLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANDSLLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANDSLLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANDSLLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANDSLLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANDSLLinkConfig1 {\n\tclients := make([]*WANDSLLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANDSLLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANDSLLinkConfig1) SetDSLLinkType(NewLinkType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewLinkType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetDSLLinkType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewLinkStatus: allowed values: Up, Down\nfunc (client *WANDSLLinkConfig1) GetDSLLinkInfo() (NewLinkType string, NewLinkStatus string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewLinkType string\n\n\t\tNewLinkStatus string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetDSLLinkInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil {\n\t\treturn\n\t}\n\tif NewLinkStatus, err = soap.UnmarshalString(response.NewLinkStatus); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetAutoConfig() (NewAutoConfig bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewAutoConfig string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetAutoConfig\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewAutoConfig, err = soap.UnmarshalBoolean(response.NewAutoConfig); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetModulationType() (NewModulationType string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewModulationType string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetModulationType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewModulationType, err = soap.UnmarshalString(response.NewModulationType); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) SetDestinationAddress(NewDestinationAddress string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewDestinationAddress string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewDestinationAddress, err = soap.MarshalString(NewDestinationAddress); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetDestinationAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetDestinationAddress() (NewDestinationAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDestinationAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetDestinationAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDestinationAddress, err = soap.UnmarshalString(response.NewDestinationAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) SetATMEncapsulation(NewATMEncapsulation string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewATMEncapsulation string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewATMEncapsulation, err = soap.MarshalString(NewATMEncapsulation); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetATMEncapsulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetATMEncapsulation() (NewATMEncapsulation string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewATMEncapsulation string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetATMEncapsulation\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewATMEncapsulation, err = soap.UnmarshalString(response.NewATMEncapsulation); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) SetFCSPreserved(NewFCSPreserved bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewFCSPreserved string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewFCSPreserved, err = soap.MarshalBoolean(NewFCSPreserved); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"SetFCSPreserved\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANDSLLinkConfig1) GetFCSPreserved() (NewFCSPreserved bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewFCSPreserved string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, \"GetFCSPreserved\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewFCSPreserved, err = soap.UnmarshalBoolean(response.NewFCSPreserved); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANEthernetLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANEthernetLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANEthernetLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANEthernetLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANEthernetLinkConfig1Clients() (clients []*WANEthernetLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANEthernetLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANEthernetLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANEthernetLinkConfig1ClientsByURL(loc *url.URL) ([]*WANEthernetLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANEthernetLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANEthernetLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANEthernetLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANEthernetLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANEthernetLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANEthernetLinkConfig1 {\n\tclients := make([]*WANEthernetLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANEthernetLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\n//\n// Return values:\n//\n// * NewEthernetLinkStatus: allowed values: Up, Down\nfunc (client *WANEthernetLinkConfig1) GetEthernetLinkStatus() (NewEthernetLinkStatus string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewEthernetLinkStatus string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANEthernetLinkConfig_1, \"GetEthernetLinkStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewEthernetLinkStatus, err = soap.UnmarshalString(response.NewEthernetLinkStatus); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANIPConnection1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANIPConnection:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANIPConnection1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANIPConnection1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANIPConnection1Clients() (clients []*WANIPConnection1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPConnection_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANIPConnection1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANIPConnection1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANIPConnection1ClientsByURL(loc *url.URL) ([]*WANIPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANIPConnection1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANIPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANIPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPConnection1 {\n\tclients := make([]*WANIPConnection1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANIPConnection1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANIPConnection1) SetConnectionType(NewConnectionType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewConnectionType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetConnectionType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, IP_Bridged\nfunc (client *WANIPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionType string\n\n\t\tNewPossibleConnectionTypes string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetConnectionTypeInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil {\n\t\treturn\n\t}\n\tif NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) RequestConnection() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"RequestConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) RequestTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"RequestTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) ForceTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"ForceTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"SetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected\n//\n// * NewLastConnectionError: allowed values: ERROR_NONE\nfunc (client *WANIPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionStatus string\n\n\t\tNewLastConnectionError string\n\n\t\tNewUptime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetStatusInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil {\n\t\treturn\n\t}\n\tif NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil {\n\t\treturn\n\t}\n\tif NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRSIPAvailable string\n\n\t\tNewNATEnabled string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetNATRSIPStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil {\n\t\treturn\n\t}\n\tif NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewProtocol: allowed values: TCP, UDP\nfunc (client *WANIPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewPortMappingIndex string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetGenericPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetSpecificPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"AddPortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"DeletePortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewExternalIPAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, \"GetExternalIPAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANIPConnection2 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANIPConnection:2\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANIPConnection2 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANIPConnection2Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANIPConnection2Clients() (clients []*WANIPConnection2, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPConnection_2); err != nil {\n\t\treturn\n\t}\n\tclients = newWANIPConnection2ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANIPConnection2ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANIPConnection2ClientsByURL(loc *url.URL) ([]*WANIPConnection2, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPConnection_2)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPConnection2ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANIPConnection2ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANIPConnection2ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPConnection2, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPConnection_2)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPConnection2ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANIPConnection2ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPConnection2 {\n\tclients := make([]*WANIPConnection2, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANIPConnection2{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANIPConnection2) SetConnectionType(NewConnectionType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewConnectionType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"SetConnectionType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionType string\n\n\t\tNewPossibleConnectionTypes string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetConnectionTypeInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil {\n\t\treturn\n\t}\n\tif NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) RequestConnection() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"RequestConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) RequestTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"RequestTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) ForceTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"ForceTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"SetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"SetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"SetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewConnectionStatus: allowed values: Unconfigured, Connecting, Connected, PendingDisconnect, Disconnecting, Disconnected\n//\n// * NewLastConnectionError: allowed values: ERROR_NONE, ERROR_COMMAND_ABORTED, ERROR_NOT_ENABLED_FOR_INTERNET, ERROR_USER_DISCONNECT, ERROR_ISP_DISCONNECT, ERROR_IDLE_DISCONNECT, ERROR_FORCED_DISCONNECT, ERROR_NO_CARRIER, ERROR_IP_CONFIGURATION, ERROR_UNKNOWN\nfunc (client *WANIPConnection2) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionStatus string\n\n\t\tNewLastConnectionError string\n\n\t\tNewUptime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetStatusInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil {\n\t\treturn\n\t}\n\tif NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil {\n\t\treturn\n\t}\n\tif NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRSIPAvailable string\n\n\t\tNewNATEnabled string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetNATRSIPStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil {\n\t\treturn\n\t}\n\tif NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewProtocol: allowed values: TCP, UDP\nfunc (client *WANIPConnection2) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewPortMappingIndex string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetGenericPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection2) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetSpecificPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection2) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"AddPortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection2) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"DeletePortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection2) DeletePortMappingRange(NewStartPort uint16, NewEndPort uint16, NewProtocol string, NewManage bool) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewStartPort string\n\n\t\tNewEndPort string\n\n\t\tNewProtocol string\n\n\t\tNewManage string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewStartPort, err = soap.MarshalUi2(NewStartPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewEndPort, err = soap.MarshalUi2(NewEndPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewManage, err = soap.MarshalBoolean(NewManage); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"DeletePortMappingRange\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPConnection2) GetExternalIPAddress() (NewExternalIPAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewExternalIPAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetExternalIPAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection2) GetListOfPortMappings(NewStartPort uint16, NewEndPort uint16, NewProtocol string, NewManage bool, NewNumberOfPorts uint16) (NewPortListing string, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewStartPort string\n\n\t\tNewEndPort string\n\n\t\tNewProtocol string\n\n\t\tNewManage string\n\n\t\tNewNumberOfPorts string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewStartPort, err = soap.MarshalUi2(NewStartPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewEndPort, err = soap.MarshalUi2(NewEndPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewManage, err = soap.MarshalBoolean(NewManage); err != nil {\n\t\treturn\n\t}\n\tif request.NewNumberOfPorts, err = soap.MarshalUi2(NewNumberOfPorts); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPortListing string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"GetListOfPortMappings\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPortListing, err = soap.UnmarshalString(response.NewPortListing); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANIPConnection2) AddAnyPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (NewReservedPort uint16, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewReservedPort string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, \"AddAnyPortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewReservedPort, err = soap.UnmarshalUi2(response.NewReservedPort); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANIPv6FirewallControl1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANIPv6FirewallControl:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANIPv6FirewallControl1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANIPv6FirewallControl1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANIPv6FirewallControl1Clients() (clients []*WANIPv6FirewallControl1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPv6FirewallControl_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANIPv6FirewallControl1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANIPv6FirewallControl1ClientsByURL(loc *url.URL) ([]*WANIPv6FirewallControl1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPv6FirewallControl_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANIPv6FirewallControl1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANIPv6FirewallControl1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPv6FirewallControl1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPv6FirewallControl_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPv6FirewallControl1 {\n\tclients := make([]*WANIPv6FirewallControl1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANIPv6FirewallControl1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANIPv6FirewallControl1) GetFirewallStatus() (FirewallEnabled bool, InboundPinholeAllowed bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tFirewallEnabled string\n\n\t\tInboundPinholeAllowed string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, \"GetFirewallStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif FirewallEnabled, err = soap.UnmarshalBoolean(response.FirewallEnabled); err != nil {\n\t\treturn\n\t}\n\tif InboundPinholeAllowed, err = soap.UnmarshalBoolean(response.InboundPinholeAllowed); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPv6FirewallControl1) GetOutboundPinholeTimeout(RemoteHost string, RemotePort uint16, InternalClient string, InternalPort uint16, Protocol uint16) (OutboundPinholeTimeout uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tRemoteHost string\n\n\t\tRemotePort string\n\n\t\tInternalClient string\n\n\t\tInternalPort string\n\n\t\tProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.RemoteHost, err = soap.MarshalString(RemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.RemotePort, err = soap.MarshalUi2(RemotePort); err != nil {\n\t\treturn\n\t}\n\tif request.InternalClient, err = soap.MarshalString(InternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.InternalPort, err = soap.MarshalUi2(InternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.Protocol, err = soap.MarshalUi2(Protocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tOutboundPinholeTimeout string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, \"GetOutboundPinholeTimeout\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif OutboundPinholeTimeout, err = soap.UnmarshalUi4(response.OutboundPinholeTimeout); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * LeaseTime: allowed value range: minimum=1, maximum=86400\n\nfunc (client *WANIPv6FirewallControl1) AddPinhole(RemoteHost string, RemotePort uint16, InternalClient string, InternalPort uint16, Protocol uint16, LeaseTime uint32) (UniqueID uint16, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tRemoteHost string\n\n\t\tRemotePort string\n\n\t\tInternalClient string\n\n\t\tInternalPort string\n\n\t\tProtocol string\n\n\t\tLeaseTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.RemoteHost, err = soap.MarshalString(RemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.RemotePort, err = soap.MarshalUi2(RemotePort); err != nil {\n\t\treturn\n\t}\n\tif request.InternalClient, err = soap.MarshalString(InternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.InternalPort, err = soap.MarshalUi2(InternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.Protocol, err = soap.MarshalUi2(Protocol); err != nil {\n\t\treturn\n\t}\n\tif request.LeaseTime, err = soap.MarshalUi4(LeaseTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tUniqueID string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, \"AddPinhole\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif UniqueID, err = soap.UnmarshalUi2(response.UniqueID); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewLeaseTime: allowed value range: minimum=1, maximum=86400\n\nfunc (client *WANIPv6FirewallControl1) UpdatePinhole(UniqueID uint16, NewLeaseTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tUniqueID string\n\n\t\tNewLeaseTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil {\n\t\treturn\n\t}\n\tif request.NewLeaseTime, err = soap.MarshalUi4(NewLeaseTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, \"UpdatePinhole\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPv6FirewallControl1) DeletePinhole(UniqueID uint16) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tUniqueID string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, \"DeletePinhole\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPv6FirewallControl1) GetPinholePackets(UniqueID uint16) (PinholePackets uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tUniqueID string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tPinholePackets string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, \"GetPinholePackets\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif PinholePackets, err = soap.UnmarshalUi4(response.PinholePackets); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANIPv6FirewallControl1) CheckPinholeWorking(UniqueID uint16) (IsWorking bool, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tUniqueID string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tIsWorking string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, \"CheckPinholeWorking\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif IsWorking, err = soap.UnmarshalBoolean(response.IsWorking); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANPOTSLinkConfig1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANPOTSLinkConfig:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANPOTSLinkConfig1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANPOTSLinkConfig1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANPOTSLinkConfig1Clients() (clients []*WANPOTSLinkConfig1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANPOTSLinkConfig_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANPOTSLinkConfig1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANPOTSLinkConfig1ClientsByURL(loc *url.URL) ([]*WANPOTSLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPOTSLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANPOTSLinkConfig1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANPOTSLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPOTSLinkConfig1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPOTSLinkConfig_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPOTSLinkConfig1 {\n\tclients := make([]*WANPOTSLinkConfig1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANPOTSLinkConfig1{genericClients[i]}\n\t}\n\treturn clients\n}\n\n//\n// Arguments:\n//\n// * NewLinkType: allowed values: PPP_Dialup\n\nfunc (client *WANPOTSLinkConfig1) SetISPInfo(NewISPPhoneNumber string, NewISPInfo string, NewLinkType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewISPPhoneNumber string\n\n\t\tNewISPInfo string\n\n\t\tNewLinkType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewISPPhoneNumber, err = soap.MarshalString(NewISPPhoneNumber); err != nil {\n\t\treturn\n\t}\n\tif request.NewISPInfo, err = soap.MarshalString(NewISPInfo); err != nil {\n\t\treturn\n\t}\n\tif request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"SetISPInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) SetCallRetryInfo(NewNumberOfRetries uint32, NewDelayBetweenRetries uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewNumberOfRetries string\n\n\t\tNewDelayBetweenRetries string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewNumberOfRetries, err = soap.MarshalUi4(NewNumberOfRetries); err != nil {\n\t\treturn\n\t}\n\tif request.NewDelayBetweenRetries, err = soap.MarshalUi4(NewDelayBetweenRetries); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"SetCallRetryInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewLinkType: allowed values: PPP_Dialup\nfunc (client *WANPOTSLinkConfig1) GetISPInfo() (NewISPPhoneNumber string, NewISPInfo string, NewLinkType string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewISPPhoneNumber string\n\n\t\tNewISPInfo string\n\n\t\tNewLinkType string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetISPInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewISPPhoneNumber, err = soap.UnmarshalString(response.NewISPPhoneNumber); err != nil {\n\t\treturn\n\t}\n\tif NewISPInfo, err = soap.UnmarshalString(response.NewISPInfo); err != nil {\n\t\treturn\n\t}\n\tif NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetCallRetryInfo() (NewNumberOfRetries uint32, NewDelayBetweenRetries uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewNumberOfRetries string\n\n\t\tNewDelayBetweenRetries string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetCallRetryInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewNumberOfRetries, err = soap.UnmarshalUi4(response.NewNumberOfRetries); err != nil {\n\t\treturn\n\t}\n\tif NewDelayBetweenRetries, err = soap.UnmarshalUi4(response.NewDelayBetweenRetries); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetFclass() (NewFclass string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewFclass string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetFclass\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewFclass, err = soap.UnmarshalString(response.NewFclass); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetDataModulationSupported() (NewDataModulationSupported string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDataModulationSupported string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetDataModulationSupported\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDataModulationSupported, err = soap.UnmarshalString(response.NewDataModulationSupported); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetDataProtocol() (NewDataProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDataProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetDataProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDataProtocol, err = soap.UnmarshalString(response.NewDataProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetDataCompression() (NewDataCompression string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewDataCompression string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetDataCompression\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewDataCompression, err = soap.UnmarshalString(response.NewDataCompression); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPOTSLinkConfig1) GetPlusVTRCommandSupported() (NewPlusVTRCommandSupported bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPlusVTRCommandSupported string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, \"GetPlusVTRCommandSupported\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPlusVTRCommandSupported, err = soap.UnmarshalBoolean(response.NewPlusVTRCommandSupported); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n// WANPPPConnection1 is a client for UPnP SOAP service with URN \"urn:schemas-upnp-org:service:WANPPPConnection:1\". See\n// goupnp.ServiceClient, which contains RootDevice and Service attributes which\n// are provided for informational value.\ntype WANPPPConnection1 struct {\n\tgoupnp.ServiceClient\n}\n\n// NewWANPPPConnection1Clients discovers instances of the service on the network,\n// and returns clients to any that are found. errors will contain an error for\n// any devices that replied but which could not be queried, and err will be set\n// if the discovery process failed outright.\n//\n// This is a typical entry calling point into this package.\nfunc NewWANPPPConnection1Clients() (clients []*WANPPPConnection1, errors []error, err error) {\n\tvar genericClients []goupnp.ServiceClient\n\tif genericClients, errors, err = goupnp.NewServiceClients(URN_WANPPPConnection_1); err != nil {\n\t\treturn\n\t}\n\tclients = newWANPPPConnection1ClientsFromGenericClients(genericClients)\n\treturn\n}\n\n// NewWANPPPConnection1ClientsByURL discovers instances of the service at the given\n// URL, and returns clients to any that are found. An error is returned if\n// there was an error probing the service.\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered service URL.\nfunc NewWANPPPConnection1ClientsByURL(loc *url.URL) ([]*WANPPPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPPPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPPPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\n// NewWANPPPConnection1ClientsFromRootDevice discovers instances of the service in\n// a given root device, and returns clients to any that are found. An error is\n// returned if there was not at least one instance of the service within the\n// device. The location parameter is simply assigned to the Location attribute\n// of the wrapped ServiceClient(s).\n//\n// This is a typical entry calling point into this package when reusing an\n// previously discovered root device.\nfunc NewWANPPPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPPPConnection1, error) {\n\tgenericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPPPConnection_1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newWANPPPConnection1ClientsFromGenericClients(genericClients), nil\n}\n\nfunc newWANPPPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPPPConnection1 {\n\tclients := make([]*WANPPPConnection1, len(genericClients))\n\tfor i := range genericClients {\n\t\tclients[i] = &WANPPPConnection1{genericClients[i]}\n\t}\n\treturn clients\n}\n\nfunc (client *WANPPPConnection1) SetConnectionType(NewConnectionType string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewConnectionType string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetConnectionType\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, DHCP_Spoofed, PPPoE_Bridged, PPTP_Relay, L2TP_Relay, PPPoE_Relay\nfunc (client *WANPPPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionType string\n\n\t\tNewPossibleConnectionTypes string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetConnectionTypeInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil {\n\t\treturn\n\t}\n\tif NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) ConfigureConnection(NewUserName string, NewPassword string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewUserName string\n\n\t\tNewPassword string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewUserName, err = soap.MarshalString(NewUserName); err != nil {\n\t\treturn\n\t}\n\tif request.NewPassword, err = soap.MarshalString(NewPassword); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"ConfigureConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) RequestConnection() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"RequestConnection\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) RequestTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"RequestTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) ForceTermination() (err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"ForceTermination\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"SetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected\n//\n// * NewLastConnectionError: allowed values: ERROR_NONE\nfunc (client *WANPPPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewConnectionStatus string\n\n\t\tNewLastConnectionError string\n\n\t\tNewUptime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetStatusInfo\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil {\n\t\treturn\n\t}\n\tif NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil {\n\t\treturn\n\t}\n\tif NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetLinkLayerMaxBitRates() (NewUpstreamMaxBitRate uint32, NewDownstreamMaxBitRate uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUpstreamMaxBitRate string\n\n\t\tNewDownstreamMaxBitRate string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetLinkLayerMaxBitRates\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewUpstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\tif NewDownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewDownstreamMaxBitRate); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPPPEncryptionProtocol() (NewPPPEncryptionProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPPPEncryptionProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPPPEncryptionProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPPPEncryptionProtocol, err = soap.UnmarshalString(response.NewPPPEncryptionProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPPPCompressionProtocol() (NewPPPCompressionProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPPPCompressionProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPPPCompressionProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPPPCompressionProtocol, err = soap.UnmarshalString(response.NewPPPCompressionProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPPPAuthenticationProtocol() (NewPPPAuthenticationProtocol string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPPPAuthenticationProtocol string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPPPAuthenticationProtocol\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPPPAuthenticationProtocol, err = soap.UnmarshalString(response.NewPPPAuthenticationProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetUserName() (NewUserName string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewUserName string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetUserName\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewUserName, err = soap.UnmarshalString(response.NewUserName); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetPassword() (NewPassword string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewPassword string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetPassword\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewPassword, err = soap.UnmarshalString(response.NewPassword); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewAutoDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetAutoDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewIdleDisconnectTime string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetIdleDisconnectTime\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewWarnDisconnectDelay string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetWarnDisconnectDelay\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRSIPAvailable string\n\n\t\tNewNATEnabled string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetNATRSIPStatus\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil {\n\t\treturn\n\t}\n\tif NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Return values:\n//\n// * NewProtocol: allowed values: TCP, UDP\nfunc (client *WANPPPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewPortMappingIndex string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetGenericPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANPPPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetSpecificPortMappingEntry\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANPPPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\n\t\tNewInternalPort string\n\n\t\tNewInternalClient string\n\n\t\tNewEnabled string\n\n\t\tNewPortMappingDescription string\n\n\t\tNewLeaseDuration string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil {\n\t\treturn\n\t}\n\tif request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil {\n\t\treturn\n\t}\n\tif request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil {\n\t\treturn\n\t}\n\tif request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"AddPortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\n//\n// Arguments:\n//\n// * NewProtocol: allowed values: TCP, UDP\n\nfunc (client *WANPPPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) {\n\t// Request structure.\n\trequest := &struct {\n\t\tNewRemoteHost string\n\n\t\tNewExternalPort string\n\n\t\tNewProtocol string\n\t}{}\n\t// BEGIN Marshal arguments into request.\n\n\tif request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil {\n\t\treturn\n\t}\n\tif request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil {\n\t\treturn\n\t}\n\tif request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil {\n\t\treturn\n\t}\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := interface{}(nil)\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"DeletePortMapping\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\t// END Unmarshal arguments from response.\n\treturn\n}\n\nfunc (client *WANPPPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) {\n\t// Request structure.\n\trequest := interface{}(nil)\n\t// BEGIN Marshal arguments into request.\n\n\t// END Marshal arguments into request.\n\n\t// Response structure.\n\tresponse := &struct {\n\t\tNewExternalIPAddress string\n\t}{}\n\n\t// Perform the SOAP call.\n\tif err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, \"GetExternalIPAddress\", request, response); err != nil {\n\t\treturn\n\t}\n\n\t// BEGIN Unmarshal arguments from response.\n\n\tif NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil {\n\t\treturn\n\t}\n\t// END Unmarshal arguments from response.\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/device.go",
    "content": "// This file contains XML structures for communicating with UPnP devices.\n\npackage goupnp\n\nimport (\n\t\"encoding/xml\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/url\"\n\n\t\"github.com/huin/goupnp/scpd\"\n\t\"github.com/huin/goupnp/soap\"\n)\n\nconst (\n\tDeviceXMLNamespace = \"urn:schemas-upnp-org:device-1-0\"\n)\n\n// RootDevice is the device description as described by section 2.3 \"Device\n// description\" in\n// http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf\ntype RootDevice struct {\n\tXMLName     xml.Name    `xml:\"root\"`\n\tSpecVersion SpecVersion `xml:\"specVersion\"`\n\tURLBase     url.URL     `xml:\"-\"`\n\tURLBaseStr  string      `xml:\"URLBase\"`\n\tDevice      Device      `xml:\"device\"`\n}\n\n// SetURLBase sets the URLBase for the RootDevice and its underlying components.\nfunc (root *RootDevice) SetURLBase(urlBase *url.URL) {\n\troot.URLBase = *urlBase\n\troot.URLBaseStr = urlBase.String()\n\troot.Device.SetURLBase(urlBase)\n}\n\n// SpecVersion is part of a RootDevice, describes the version of the\n// specification that the data adheres to.\ntype SpecVersion struct {\n\tMajor int32 `xml:\"major\"`\n\tMinor int32 `xml:\"minor\"`\n}\n\n// Device is a UPnP device. It can have child devices.\ntype Device struct {\n\tDeviceType       string    `xml:\"deviceType\"`\n\tFriendlyName     string    `xml:\"friendlyName\"`\n\tManufacturer     string    `xml:\"manufacturer\"`\n\tManufacturerURL  URLField  `xml:\"manufacturerURL\"`\n\tModelDescription string    `xml:\"modelDescription\"`\n\tModelName        string    `xml:\"modelName\"`\n\tModelNumber      string    `xml:\"modelNumber\"`\n\tModelURL         URLField  `xml:\"modelURL\"`\n\tSerialNumber     string    `xml:\"serialNumber\"`\n\tUDN              string    `xml:\"UDN\"`\n\tUPC              string    `xml:\"UPC,omitempty\"`\n\tIcons            []Icon    `xml:\"iconList>icon,omitempty\"`\n\tServices         []Service `xml:\"serviceList>service,omitempty\"`\n\tDevices          []Device  `xml:\"deviceList>device,omitempty\"`\n\n\t// Extra observed elements:\n\tPresentationURL URLField `xml:\"presentationURL\"`\n}\n\n// VisitDevices calls visitor for the device, and all its descendent devices.\nfunc (device *Device) VisitDevices(visitor func(*Device)) {\n\tvisitor(device)\n\tfor i := range device.Devices {\n\t\tdevice.Devices[i].VisitDevices(visitor)\n\t}\n}\n\n// VisitServices calls visitor for all Services under the device and all its\n// descendent devices.\nfunc (device *Device) VisitServices(visitor func(*Service)) {\n\tdevice.VisitDevices(func(d *Device) {\n\t\tfor i := range d.Services {\n\t\t\tvisitor(&d.Services[i])\n\t\t}\n\t})\n}\n\n// FindService finds all (if any) Services under the device and its descendents\n// that have the given ServiceType.\nfunc (device *Device) FindService(serviceType string) []*Service {\n\tvar services []*Service\n\tdevice.VisitServices(func(s *Service) {\n\t\tif s.ServiceType == serviceType {\n\t\t\tservices = append(services, s)\n\t\t}\n\t})\n\treturn services\n}\n\n// SetURLBase sets the URLBase for the Device and its underlying components.\nfunc (device *Device) SetURLBase(urlBase *url.URL) {\n\tdevice.ManufacturerURL.SetURLBase(urlBase)\n\tdevice.ModelURL.SetURLBase(urlBase)\n\tdevice.PresentationURL.SetURLBase(urlBase)\n\tfor i := range device.Icons {\n\t\tdevice.Icons[i].SetURLBase(urlBase)\n\t}\n\tfor i := range device.Services {\n\t\tdevice.Services[i].SetURLBase(urlBase)\n\t}\n\tfor i := range device.Devices {\n\t\tdevice.Devices[i].SetURLBase(urlBase)\n\t}\n}\n\nfunc (device *Device) String() string {\n\treturn fmt.Sprintf(\"Device ID %s : %s (%s)\", device.UDN, device.DeviceType, device.FriendlyName)\n}\n\n// Icon is a representative image that a device might include in its\n// description.\ntype Icon struct {\n\tMimetype string   `xml:\"mimetype\"`\n\tWidth    int32    `xml:\"width\"`\n\tHeight   int32    `xml:\"height\"`\n\tDepth    int32    `xml:\"depth\"`\n\tURL      URLField `xml:\"url\"`\n}\n\n// SetURLBase sets the URLBase for the Icon.\nfunc (icon *Icon) SetURLBase(url *url.URL) {\n\ticon.URL.SetURLBase(url)\n}\n\n// Service is a service provided by a UPnP Device.\ntype Service struct {\n\tServiceType string   `xml:\"serviceType\"`\n\tServiceId   string   `xml:\"serviceId\"`\n\tSCPDURL     URLField `xml:\"SCPDURL\"`\n\tControlURL  URLField `xml:\"controlURL\"`\n\tEventSubURL URLField `xml:\"eventSubURL\"`\n}\n\n// SetURLBase sets the URLBase for the Service.\nfunc (srv *Service) SetURLBase(urlBase *url.URL) {\n\tsrv.SCPDURL.SetURLBase(urlBase)\n\tsrv.ControlURL.SetURLBase(urlBase)\n\tsrv.EventSubURL.SetURLBase(urlBase)\n}\n\nfunc (srv *Service) String() string {\n\treturn fmt.Sprintf(\"Service ID %s : %s\", srv.ServiceId, srv.ServiceType)\n}\n\n// RequestSCDP requests the SCPD (soap actions and state variables description)\n// for the service.\nfunc (srv *Service) RequestSCDP() (*scpd.SCPD, error) {\n\tif !srv.SCPDURL.Ok {\n\t\treturn nil, errors.New(\"bad/missing SCPD URL, or no URLBase has been set\")\n\t}\n\ts := new(scpd.SCPD)\n\tif err := requestXml(srv.SCPDURL.URL.String(), scpd.SCPDXMLNamespace, s); err != nil {\n\t\treturn nil, err\n\t}\n\treturn s, nil\n}\n\nfunc (srv *Service) NewSOAPClient() *soap.SOAPClient {\n\treturn soap.NewSOAPClient(srv.ControlURL.URL)\n}\n\n// URLField is a URL that is part of a device description.\ntype URLField struct {\n\tURL url.URL `xml:\"-\"`\n\tOk  bool    `xml:\"-\"`\n\tStr string  `xml:\",chardata\"`\n}\n\nfunc (uf *URLField) SetURLBase(urlBase *url.URL) {\n\trefUrl, err := url.Parse(uf.Str)\n\tif err != nil {\n\t\tuf.URL = url.URL{}\n\t\tuf.Ok = false\n\t\treturn\n\t}\n\n\tuf.URL = *urlBase.ResolveReference(refUrl)\n\tuf.Ok = true\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/goupnp.go",
    "content": "// goupnp is an implementation of a client for various UPnP services.\n//\n// For most uses, it is recommended to use the code-generated packages under\n// github.com/huin/goupnp/dcps. Example use is shown at\n// http://godoc.org/github.com/huin/goupnp/example\n//\n// A commonly used client is internetgateway1.WANPPPConnection1:\n// http://godoc.org/github.com/huin/goupnp/dcps/internetgateway1#WANPPPConnection1\n//\n// Currently only a couple of schemas have code generated for them from the\n// UPnP example XML specifications. Not all methods will work on these clients,\n// because the generated stubs contain the full set of specified methods from\n// the XML specifications, and the discovered services will likely support a\n// subset of those methods.\npackage goupnp\n\nimport (\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"time\"\n\n\t\"golang.org/x/net/html/charset\"\n\n\t\"github.com/huin/goupnp/httpu\"\n\t\"github.com/huin/goupnp/ssdp\"\n)\n\n// ContextError is an error that wraps an error with some context information.\ntype ContextError struct {\n\tContext string\n\tErr     error\n}\n\nfunc (err ContextError) Error() string {\n\treturn fmt.Sprintf(\"%s: %v\", err.Context, err.Err)\n}\n\n// MaybeRootDevice contains either a RootDevice or an error.\ntype MaybeRootDevice struct {\n\t// Set iff Err == nil.\n\tRoot *RootDevice\n\n\t// The location the device was discovered at. This can be used with\n\t// DeviceByURL, assuming the device is still present. A location represents\n\t// the discovery of a device, regardless of if there was an error probing it.\n\tLocation *url.URL\n\n\t// Any error encountered probing a discovered device.\n\tErr error\n}\n\n// DiscoverDevices attempts to find targets of the given type. This is\n// typically the entry-point for this package. searchTarget is typically a URN\n// in the form \"urn:schemas-upnp-org:device:...\" or\n// \"urn:schemas-upnp-org:service:...\". A single error is returned for errors\n// while attempting to send the query. An error or RootDevice is returned for\n// each discovered RootDevice.\nfunc DiscoverDevices(searchTarget string) ([]MaybeRootDevice, error) {\n\thttpu, err := httpu.NewHTTPUClient()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer httpu.Close()\n\tresponses, err := ssdp.SSDPRawSearch(httpu, string(searchTarget), 2, 3)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tresults := make([]MaybeRootDevice, len(responses))\n\tfor i, response := range responses {\n\t\tmaybe := &results[i]\n\t\tloc, err := response.Location()\n\t\tif err != nil {\n\t\t\tmaybe.Err = ContextError{\"unexpected bad location from search\", err}\n\t\t\tcontinue\n\t\t}\n\t\tmaybe.Location = loc\n\t\tif root, err := DeviceByURL(loc); err != nil {\n\t\t\tmaybe.Err = err\n\t\t} else {\n\t\t\tmaybe.Root = root\n\t\t}\n\t}\n\n\treturn results, nil\n}\n\nfunc DeviceByURL(loc *url.URL) (*RootDevice, error) {\n\tlocStr := loc.String()\n\troot := new(RootDevice)\n\tif err := requestXml(locStr, DeviceXMLNamespace, root); err != nil {\n\t\treturn nil, ContextError{fmt.Sprintf(\"error requesting root device details from %q\", locStr), err}\n\t}\n\tvar urlBaseStr string\n\tif root.URLBaseStr != \"\" {\n\t\turlBaseStr = root.URLBaseStr\n\t} else {\n\t\turlBaseStr = locStr\n\t}\n\turlBase, err := url.Parse(urlBaseStr)\n\tif err != nil {\n\t\treturn nil, ContextError{fmt.Sprintf(\"error parsing location URL %q\", locStr), err}\n\t}\n\troot.SetURLBase(urlBase)\n\treturn root, nil\n}\n\nfunc requestXml(url string, defaultSpace string, doc interface{}) error {\n\ttimeout := time.Duration(3 * time.Second)\n\tclient := http.Client{\n\t\tTimeout: timeout,\n\t}\n\tresp, err := client.Get(url)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != 200 {\n\t\treturn fmt.Errorf(\"goupnp: got response status %s from %q\",\n\t\t\tresp.Status, url)\n\t}\n\n\tdecoder := xml.NewDecoder(resp.Body)\n\tdecoder.DefaultSpace = defaultSpace\n\tdecoder.CharsetReader = charset.NewReaderLabel\n\n\treturn decoder.Decode(doc)\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/httpu/httpu.go",
    "content": "package httpu\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"net\"\n\t\"net/http\"\n\t\"sync\"\n\t\"time\"\n)\n\n// HTTPUClient is a client for dealing with HTTPU (HTTP over UDP). Its typical\n// function is for HTTPMU, and particularly SSDP.\ntype HTTPUClient struct {\n\tconnLock sync.Mutex // Protects use of conn.\n\tconn     net.PacketConn\n}\n\n// NewHTTPUClient creates a new HTTPUClient, opening up a new UDP socket for the\n// purpose.\nfunc NewHTTPUClient() (*HTTPUClient, error) {\n\tconn, err := net.ListenPacket(\"udp\", \":0\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &HTTPUClient{conn: conn}, nil\n}\n\n// NewHTTPUClientAddr creates a new HTTPUClient which will broadcast packets\n// from the specified address, opening up a new UDP socket for the purpose\nfunc NewHTTPUClientAddr(addr string) (*HTTPUClient, error) {\n\tip := net.ParseIP(addr)\n\tif ip == nil {\n\t\treturn nil, errors.New(\"Invalid listening address\")\n\t}\n\tconn, err := net.ListenPacket(\"udp\", ip.String()+\":0\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &HTTPUClient{conn: conn}, nil\n}\n\n// Close shuts down the client. The client will no longer be useful following\n// this.\nfunc (httpu *HTTPUClient) Close() error {\n\thttpu.connLock.Lock()\n\tdefer httpu.connLock.Unlock()\n\treturn httpu.conn.Close()\n}\n\n// Do performs a request. The timeout is how long to wait for before returning\n// the responses that were received. An error is only returned for failing to\n// send the request. Failures in receipt simply do not add to the resulting\n// responses.\n//\n// Note that at present only one concurrent connection will happen per\n// HTTPUClient.\nfunc (httpu *HTTPUClient) Do(req *http.Request, timeout time.Duration, numSends int) ([]*http.Response, error) {\n\thttpu.connLock.Lock()\n\tdefer httpu.connLock.Unlock()\n\n\t// Create the request. This is a subset of what http.Request.Write does\n\t// deliberately to avoid creating extra fields which may confuse some\n\t// devices.\n\tvar requestBuf bytes.Buffer\n\tmethod := req.Method\n\tif method == \"\" {\n\t\tmethod = \"GET\"\n\t}\n\tif _, err := fmt.Fprintf(&requestBuf, \"%s %s HTTP/1.1\\r\\n\", method, req.URL.RequestURI()); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := req.Header.Write(&requestBuf); err != nil {\n\t\treturn nil, err\n\t}\n\tif _, err := requestBuf.Write([]byte{'\\r', '\\n'}); err != nil {\n\t\treturn nil, err\n\t}\n\n\tdestAddr, err := net.ResolveUDPAddr(\"udp\", req.Host)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err = httpu.conn.SetDeadline(time.Now().Add(timeout)); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Send request.\n\tfor i := 0; i < numSends; i++ {\n\t\tif n, err := httpu.conn.WriteTo(requestBuf.Bytes(), destAddr); err != nil {\n\t\t\treturn nil, err\n\t\t} else if n < len(requestBuf.Bytes()) {\n\t\t\treturn nil, fmt.Errorf(\"httpu: wrote %d bytes rather than full %d in request\",\n\t\t\t\tn, len(requestBuf.Bytes()))\n\t\t}\n\t\ttime.Sleep(5 * time.Millisecond)\n\t}\n\n\t// Await responses until timeout.\n\tvar responses []*http.Response\n\tresponseBytes := make([]byte, 2048)\n\tfor {\n\t\t// 2048 bytes should be sufficient for most networks.\n\t\tn, _, err := httpu.conn.ReadFrom(responseBytes)\n\t\tif err != nil {\n\t\t\tif err, ok := err.(net.Error); ok {\n\t\t\t\tif err.Timeout() {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif err.Temporary() {\n\t\t\t\t\t// Sleep in case this is a persistent error to avoid pegging CPU until deadline.\n\t\t\t\t\ttime.Sleep(10 * time.Millisecond)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Parse response.\n\t\tresponse, err := http.ReadResponse(bufio.NewReader(bytes.NewBuffer(responseBytes[:n])), req)\n\t\tif err != nil {\n\t\t\tlog.Print(\"httpu: error while parsing response: %v\", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tresponses = append(responses, response)\n\t}\n\treturn responses, err\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/httpu/serve.go",
    "content": "package httpu\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"log\"\n\t\"net\"\n\t\"net/http\"\n\t\"regexp\"\n)\n\nconst (\n\tDefaultMaxMessageBytes = 2048\n)\n\nvar (\n\ttrailingWhitespaceRx = regexp.MustCompile(\" +\\r\\n\")\n\tcrlf                 = []byte(\"\\r\\n\")\n)\n\n// Handler is the interface by which received HTTPU messages are passed to\n// handling code.\ntype Handler interface {\n\t// ServeMessage is called for each HTTPU message received. peerAddr contains\n\t// the address that the message was received from.\n\tServeMessage(r *http.Request)\n}\n\n// HandlerFunc is a function-to-Handler adapter.\ntype HandlerFunc func(r *http.Request)\n\nfunc (f HandlerFunc) ServeMessage(r *http.Request) {\n\tf(r)\n}\n\n// A Server defines parameters for running an HTTPU server.\ntype Server struct {\n\tAddr            string         // UDP address to listen on\n\tMulticast       bool           // Should listen for multicast?\n\tInterface       *net.Interface // Network interface to listen on for multicast, nil for default multicast interface\n\tHandler         Handler        // handler to invoke\n\tMaxMessageBytes int            // maximum number of bytes to read from a packet, DefaultMaxMessageBytes if 0\n}\n\n// ListenAndServe listens on the UDP network address srv.Addr. If srv.Multicast\n// is true, then a multicast UDP listener will be used on srv.Interface (or\n// default interface if nil).\nfunc (srv *Server) ListenAndServe() error {\n\tvar err error\n\n\tvar addr *net.UDPAddr\n\tif addr, err = net.ResolveUDPAddr(\"udp\", srv.Addr); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tvar conn net.PacketConn\n\tif srv.Multicast {\n\t\tif conn, err = net.ListenMulticastUDP(\"udp\", srv.Interface, addr); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tif conn, err = net.ListenUDP(\"udp\", addr); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn srv.Serve(conn)\n}\n\n// Serve messages received on the given packet listener to the srv.Handler.\nfunc (srv *Server) Serve(l net.PacketConn) error {\n\tmaxMessageBytes := DefaultMaxMessageBytes\n\tif srv.MaxMessageBytes != 0 {\n\t\tmaxMessageBytes = srv.MaxMessageBytes\n\t}\n\tfor {\n\t\tbuf := make([]byte, maxMessageBytes)\n\t\tn, peerAddr, err := l.ReadFrom(buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tbuf = buf[:n]\n\n\t\tgo func(buf []byte, peerAddr net.Addr) {\n\t\t\t// At least one router's UPnP implementation has added a trailing space\n\t\t\t// after \"HTTP/1.1\" - trim it.\n\t\t\tbuf = trailingWhitespaceRx.ReplaceAllLiteral(buf, crlf)\n\n\t\t\treq, err := http.ReadRequest(bufio.NewReader(bytes.NewBuffer(buf)))\n\t\t\tif err != nil {\n\t\t\t\tlog.Printf(\"httpu: Failed to parse request: %v\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\treq.RemoteAddr = peerAddr.String()\n\t\t\tsrv.Handler.ServeMessage(req)\n\t\t\t// No need to call req.Body.Close - underlying reader is bytes.Buffer.\n\t\t}(buf, peerAddr)\n\t}\n}\n\n// Serve messages received on the given packet listener to the given handler.\nfunc Serve(l net.PacketConn, handler Handler) error {\n\tsrv := Server{\n\t\tHandler:         handler,\n\t\tMaxMessageBytes: DefaultMaxMessageBytes,\n\t}\n\treturn srv.Serve(l)\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/scpd/scpd.go",
    "content": "package scpd\n\nimport (\n\t\"encoding/xml\"\n\t\"strings\"\n)\n\nconst (\n\tSCPDXMLNamespace = \"urn:schemas-upnp-org:service-1-0\"\n)\n\nfunc cleanWhitespace(s *string) {\n\t*s = strings.TrimSpace(*s)\n}\n\n// SCPD is the service description as described by section 2.5 \"Service\n// description\" in\n// http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf\ntype SCPD struct {\n\tXMLName        xml.Name        `xml:\"scpd\"`\n\tConfigId       string          `xml:\"configId,attr\"`\n\tSpecVersion    SpecVersion     `xml:\"specVersion\"`\n\tActions        []Action        `xml:\"actionList>action\"`\n\tStateVariables []StateVariable `xml:\"serviceStateTable>stateVariable\"`\n}\n\n// Clean attempts to remove stray whitespace etc. in the structure. It seems\n// unfortunately common for stray whitespace to be present in SCPD documents,\n// this method attempts to make it easy to clean them out.\nfunc (scpd *SCPD) Clean() {\n\tcleanWhitespace(&scpd.ConfigId)\n\tfor i := range scpd.Actions {\n\t\tscpd.Actions[i].clean()\n\t}\n\tfor i := range scpd.StateVariables {\n\t\tscpd.StateVariables[i].clean()\n\t}\n}\n\nfunc (scpd *SCPD) GetStateVariable(variable string) *StateVariable {\n\tfor i := range scpd.StateVariables {\n\t\tv := &scpd.StateVariables[i]\n\t\tif v.Name == variable {\n\t\t\treturn v\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (scpd *SCPD) GetAction(action string) *Action {\n\tfor i := range scpd.Actions {\n\t\ta := &scpd.Actions[i]\n\t\tif a.Name == action {\n\t\t\treturn a\n\t\t}\n\t}\n\treturn nil\n}\n\n// SpecVersion is part of a SCPD document, describes the version of the\n// specification that the data adheres to.\ntype SpecVersion struct {\n\tMajor int32 `xml:\"major\"`\n\tMinor int32 `xml:\"minor\"`\n}\n\ntype Action struct {\n\tName      string     `xml:\"name\"`\n\tArguments []Argument `xml:\"argumentList>argument\"`\n}\n\nfunc (action *Action) clean() {\n\tcleanWhitespace(&action.Name)\n\tfor i := range action.Arguments {\n\t\taction.Arguments[i].clean()\n\t}\n}\n\nfunc (action *Action) InputArguments() []*Argument {\n\tvar result []*Argument\n\tfor i := range action.Arguments {\n\t\targ := &action.Arguments[i]\n\t\tif arg.IsInput() {\n\t\t\tresult = append(result, arg)\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (action *Action) OutputArguments() []*Argument {\n\tvar result []*Argument\n\tfor i := range action.Arguments {\n\t\targ := &action.Arguments[i]\n\t\tif arg.IsOutput() {\n\t\t\tresult = append(result, arg)\n\t\t}\n\t}\n\treturn result\n}\n\ntype Argument struct {\n\tName                 string `xml:\"name\"`\n\tDirection            string `xml:\"direction\"`            // in|out\n\tRelatedStateVariable string `xml:\"relatedStateVariable\"` // ?\n\tRetval               string `xml:\"retval\"`               // ?\n}\n\nfunc (arg *Argument) clean() {\n\tcleanWhitespace(&arg.Name)\n\tcleanWhitespace(&arg.Direction)\n\tcleanWhitespace(&arg.RelatedStateVariable)\n\tcleanWhitespace(&arg.Retval)\n}\n\nfunc (arg *Argument) IsInput() bool {\n\treturn arg.Direction == \"in\"\n}\n\nfunc (arg *Argument) IsOutput() bool {\n\treturn arg.Direction == \"out\"\n}\n\ntype StateVariable struct {\n\tName              string             `xml:\"name\"`\n\tSendEvents        string             `xml:\"sendEvents,attr\"` // yes|no\n\tMulticast         string             `xml:\"multicast,attr\"`  // yes|no\n\tDataType          DataType           `xml:\"dataType\"`\n\tDefaultValue      string             `xml:\"defaultValue\"`\n\tAllowedValueRange *AllowedValueRange `xml:\"allowedValueRange\"`\n\tAllowedValues     []string           `xml:\"allowedValueList>allowedValue\"`\n}\n\nfunc (v *StateVariable) clean() {\n\tcleanWhitespace(&v.Name)\n\tcleanWhitespace(&v.SendEvents)\n\tcleanWhitespace(&v.Multicast)\n\tv.DataType.clean()\n\tcleanWhitespace(&v.DefaultValue)\n\tif v.AllowedValueRange != nil {\n\t\tv.AllowedValueRange.clean()\n\t}\n\tfor i := range v.AllowedValues {\n\t\tcleanWhitespace(&v.AllowedValues[i])\n\t}\n}\n\ntype AllowedValueRange struct {\n\tMinimum string `xml:\"minimum\"`\n\tMaximum string `xml:\"maximum\"`\n\tStep    string `xml:\"step\"`\n}\n\nfunc (r *AllowedValueRange) clean() {\n\tcleanWhitespace(&r.Minimum)\n\tcleanWhitespace(&r.Maximum)\n\tcleanWhitespace(&r.Step)\n}\n\ntype DataType struct {\n\tName string `xml:\",chardata\"`\n\tType string `xml:\"type,attr\"`\n}\n\nfunc (dt *DataType) clean() {\n\tcleanWhitespace(&dt.Name)\n\tcleanWhitespace(&dt.Type)\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/service_client.go",
    "content": "package goupnp\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\n\t\"github.com/huin/goupnp/soap\"\n)\n\n// ServiceClient is a SOAP client, root device and the service for the SOAP\n// client rolled into one value. The root device, location, and service are\n// intended to be informational. Location can be used to later recreate a\n// ServiceClient with NewServiceClientByURL if the service is still present;\n// bypassing the discovery process.\ntype ServiceClient struct {\n\tSOAPClient *soap.SOAPClient\n\tRootDevice *RootDevice\n\tLocation   *url.URL\n\tService    *Service\n}\n\n// NewServiceClients discovers services, and returns clients for them. err will\n// report any error with the discovery process (blocking any device/service\n// discovery), errors reports errors on a per-root-device basis.\nfunc NewServiceClients(searchTarget string) (clients []ServiceClient, errors []error, err error) {\n\tvar maybeRootDevices []MaybeRootDevice\n\tif maybeRootDevices, err = DiscoverDevices(searchTarget); err != nil {\n\t\treturn\n\t}\n\n\tclients = make([]ServiceClient, 0, len(maybeRootDevices))\n\n\tfor _, maybeRootDevice := range maybeRootDevices {\n\t\tif maybeRootDevice.Err != nil {\n\t\t\terrors = append(errors, maybeRootDevice.Err)\n\t\t\tcontinue\n\t\t}\n\n\t\tdeviceClients, err := NewServiceClientsFromRootDevice(maybeRootDevice.Root, maybeRootDevice.Location, searchTarget)\n\t\tif err != nil {\n\t\t\terrors = append(errors, err)\n\t\t\tcontinue\n\t\t}\n\t\tclients = append(clients, deviceClients...)\n\t}\n\n\treturn\n}\n\n// NewServiceClientsByURL creates client(s) for the given service URN, for a\n// root device at the given URL.\nfunc NewServiceClientsByURL(loc *url.URL, searchTarget string) ([]ServiceClient, error) {\n\trootDevice, err := DeviceByURL(loc)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewServiceClientsFromRootDevice(rootDevice, loc, searchTarget)\n}\n\n// NewServiceClientsFromDevice creates client(s) for the given service URN, in\n// a given root device. The loc parameter is simply assigned to the\n// Location attribute of the returned ServiceClient(s).\nfunc NewServiceClientsFromRootDevice(rootDevice *RootDevice, loc *url.URL, searchTarget string) ([]ServiceClient, error) {\n\tdevice := &rootDevice.Device\n\tsrvs := device.FindService(searchTarget)\n\tif len(srvs) == 0 {\n\t\treturn nil, fmt.Errorf(\"goupnp: service %q not found within device %q (UDN=%q)\",\n\t\t\tsearchTarget, device.FriendlyName, device.UDN)\n\t}\n\n\tclients := make([]ServiceClient, 0, len(srvs))\n\tfor _, srv := range srvs {\n\t\tclients = append(clients, ServiceClient{\n\t\t\tSOAPClient: srv.NewSOAPClient(),\n\t\t\tRootDevice: rootDevice,\n\t\t\tLocation:   loc,\n\t\t\tService:    srv,\n\t\t})\n\t}\n\treturn clients, nil\n}\n\n// GetServiceClient returns the ServiceClient itself. This is provided so that the\n// service client attributes can be accessed via an interface method on a\n// wrapping type.\nfunc (client *ServiceClient) GetServiceClient() *ServiceClient {\n\treturn client\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/soap/soap.go",
    "content": "// Definition for the SOAP structure required for UPnP's SOAP usage.\n\npackage soap\n\nimport (\n\t\"bytes\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"reflect\"\n)\n\nconst (\n\tsoapEncodingStyle = \"http://schemas.xmlsoap.org/soap/encoding/\"\n\tsoapPrefix        = xml.Header + `<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><s:Body>`\n\tsoapSuffix        = `</s:Body></s:Envelope>`\n)\n\ntype SOAPClient struct {\n\tEndpointURL url.URL\n\tHTTPClient  http.Client\n}\n\nfunc NewSOAPClient(endpointURL url.URL) *SOAPClient {\n\treturn &SOAPClient{\n\t\tEndpointURL: endpointURL,\n\t}\n}\n\n// PerformSOAPAction makes a SOAP request, with the given action.\n// inAction and outAction must both be pointers to structs with string fields\n// only.\nfunc (client *SOAPClient) PerformAction(actionNamespace, actionName string, inAction interface{}, outAction interface{}) error {\n\trequestBytes, err := encodeRequestAction(actionNamespace, actionName, inAction)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tresponse, err := client.HTTPClient.Do(&http.Request{\n\t\tMethod: \"POST\",\n\t\tURL:    &client.EndpointURL,\n\t\tHeader: http.Header{\n\t\t\t\"SOAPACTION\":   []string{`\"` + actionNamespace + \"#\" + actionName + `\"`},\n\t\t\t\"CONTENT-TYPE\": []string{\"text/xml; charset=\\\"utf-8\\\"\"},\n\t\t},\n\t\tBody: ioutil.NopCloser(bytes.NewBuffer(requestBytes)),\n\t\t// Set ContentLength to avoid chunked encoding - some servers might not support it.\n\t\tContentLength: int64(len(requestBytes)),\n\t})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"goupnp: error performing SOAP HTTP request: %v\", err)\n\t}\n\tdefer response.Body.Close()\n\tif response.StatusCode != 200 {\n\t\treturn fmt.Errorf(\"goupnp: SOAP request got HTTP %s\", response.Status)\n\t}\n\n\tresponseEnv := newSOAPEnvelope()\n\tdecoder := xml.NewDecoder(response.Body)\n\tif err := decoder.Decode(responseEnv); err != nil {\n\t\treturn fmt.Errorf(\"goupnp: error decoding response body: %v\", err)\n\t}\n\n\tif responseEnv.Body.Fault != nil {\n\t\treturn responseEnv.Body.Fault\n\t}\n\n\tif outAction != nil {\n\t\tif err := xml.Unmarshal(responseEnv.Body.RawAction, outAction); err != nil {\n\t\t\treturn fmt.Errorf(\"goupnp: error unmarshalling out action: %v, %v\", err, responseEnv.Body.RawAction)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// newSOAPAction creates a soapEnvelope with the given action and arguments.\nfunc newSOAPEnvelope() *soapEnvelope {\n\treturn &soapEnvelope{\n\t\tEncodingStyle: soapEncodingStyle,\n\t}\n}\n\n// encodeRequestAction is a hacky way to create an encoded SOAP envelope\n// containing the given action. Experiments with one router have shown that it\n// 500s for requests where the outer default xmlns is set to the SOAP\n// namespace, and then reassigning the default namespace within that to the\n// service namespace. Hand-coding the outer XML to work-around this.\nfunc encodeRequestAction(actionNamespace, actionName string, inAction interface{}) ([]byte, error) {\n\trequestBuf := new(bytes.Buffer)\n\trequestBuf.WriteString(soapPrefix)\n\trequestBuf.WriteString(`<u:`)\n\txml.EscapeText(requestBuf, []byte(actionName))\n\trequestBuf.WriteString(` xmlns:u=\"`)\n\txml.EscapeText(requestBuf, []byte(actionNamespace))\n\trequestBuf.WriteString(`\">`)\n\tif inAction != nil {\n\t\tif err := encodeRequestArgs(requestBuf, inAction); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\trequestBuf.WriteString(`</u:`)\n\txml.EscapeText(requestBuf, []byte(actionName))\n\trequestBuf.WriteString(`>`)\n\trequestBuf.WriteString(soapSuffix)\n\treturn requestBuf.Bytes(), nil\n}\n\nfunc encodeRequestArgs(w *bytes.Buffer, inAction interface{}) error {\n\tin := reflect.Indirect(reflect.ValueOf(inAction))\n\tif in.Kind() != reflect.Struct {\n\t\treturn fmt.Errorf(\"goupnp: SOAP inAction is not a struct but of type %v\", in.Type())\n\t}\n\tenc := xml.NewEncoder(w)\n\tnFields := in.NumField()\n\tinType := in.Type()\n\tfor i := 0; i < nFields; i++ {\n\t\tfield := inType.Field(i)\n\t\targName := field.Name\n\t\tif nameOverride := field.Tag.Get(\"soap\"); nameOverride != \"\" {\n\t\t\targName = nameOverride\n\t\t}\n\t\tvalue := in.Field(i)\n\t\tif value.Kind() != reflect.String {\n\t\t\treturn fmt.Errorf(\"goupnp: SOAP arg %q is not of type string, but of type %v\", argName, value.Type())\n\t\t}\n\t\tif err := enc.EncodeElement(value.Interface(), xml.StartElement{xml.Name{\"\", argName}, nil}); err != nil {\n\t\t\treturn fmt.Errorf(\"goupnp: error encoding SOAP arg %q: %v\", argName, err)\n\t\t}\n\t}\n\tenc.Flush()\n\treturn nil\n}\n\ntype soapEnvelope struct {\n\tXMLName       xml.Name `xml:\"http://schemas.xmlsoap.org/soap/envelope/ Envelope\"`\n\tEncodingStyle string   `xml:\"http://schemas.xmlsoap.org/soap/envelope/ encodingStyle,attr\"`\n\tBody          soapBody `xml:\"http://schemas.xmlsoap.org/soap/envelope/ Body\"`\n}\n\ntype soapBody struct {\n\tFault     *SOAPFaultError `xml:\"Fault\"`\n\tRawAction []byte          `xml:\",innerxml\"`\n}\n\n// SOAPFaultError implements error, and contains SOAP fault information.\ntype SOAPFaultError struct {\n\tFaultCode   string `xml:\"faultcode\"`\n\tFaultString string `xml:\"faultstring\"`\n\tDetail      string `xml:\"detail\"`\n}\n\nfunc (err *SOAPFaultError) Error() string {\n\treturn fmt.Sprintf(\"SOAP fault: %s\", err.FaultString)\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/soap/types.go",
    "content": "package soap\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode/utf8\"\n)\n\nvar (\n\t// localLoc acts like time.Local for this package, but is faked out by the\n\t// unit tests to ensure that things stay constant (especially when running\n\t// this test in a place where local time is UTC which might mask bugs).\n\tlocalLoc = time.Local\n)\n\nfunc MarshalUi1(v uint8) (string, error) {\n\treturn strconv.FormatUint(uint64(v), 10), nil\n}\n\nfunc UnmarshalUi1(s string) (uint8, error) {\n\tv, err := strconv.ParseUint(s, 10, 8)\n\treturn uint8(v), err\n}\n\nfunc MarshalUi2(v uint16) (string, error) {\n\treturn strconv.FormatUint(uint64(v), 10), nil\n}\n\nfunc UnmarshalUi2(s string) (uint16, error) {\n\tv, err := strconv.ParseUint(s, 10, 16)\n\treturn uint16(v), err\n}\n\nfunc MarshalUi4(v uint32) (string, error) {\n\treturn strconv.FormatUint(uint64(v), 10), nil\n}\n\nfunc UnmarshalUi4(s string) (uint32, error) {\n\tv, err := strconv.ParseUint(s, 10, 32)\n\treturn uint32(v), err\n}\n\nfunc MarshalI1(v int8) (string, error) {\n\treturn strconv.FormatInt(int64(v), 10), nil\n}\n\nfunc UnmarshalI1(s string) (int8, error) {\n\tv, err := strconv.ParseInt(s, 10, 8)\n\treturn int8(v), err\n}\n\nfunc MarshalI2(v int16) (string, error) {\n\treturn strconv.FormatInt(int64(v), 10), nil\n}\n\nfunc UnmarshalI2(s string) (int16, error) {\n\tv, err := strconv.ParseInt(s, 10, 16)\n\treturn int16(v), err\n}\n\nfunc MarshalI4(v int32) (string, error) {\n\treturn strconv.FormatInt(int64(v), 10), nil\n}\n\nfunc UnmarshalI4(s string) (int32, error) {\n\tv, err := strconv.ParseInt(s, 10, 32)\n\treturn int32(v), err\n}\n\nfunc MarshalInt(v int64) (string, error) {\n\treturn strconv.FormatInt(v, 10), nil\n}\n\nfunc UnmarshalInt(s string) (int64, error) {\n\treturn strconv.ParseInt(s, 10, 64)\n}\n\nfunc MarshalR4(v float32) (string, error) {\n\treturn strconv.FormatFloat(float64(v), 'G', -1, 32), nil\n}\n\nfunc UnmarshalR4(s string) (float32, error) {\n\tv, err := strconv.ParseFloat(s, 32)\n\treturn float32(v), err\n}\n\nfunc MarshalR8(v float64) (string, error) {\n\treturn strconv.FormatFloat(v, 'G', -1, 64), nil\n}\n\nfunc UnmarshalR8(s string) (float64, error) {\n\tv, err := strconv.ParseFloat(s, 64)\n\treturn float64(v), err\n}\n\n// MarshalFixed14_4 marshals float64 to SOAP \"fixed.14.4\" type.\nfunc MarshalFixed14_4(v float64) (string, error) {\n\tif v >= 1e14 || v <= -1e14 {\n\t\treturn \"\", fmt.Errorf(\"soap fixed14.4: value %v out of bounds\", v)\n\t}\n\treturn strconv.FormatFloat(v, 'f', 4, 64), nil\n}\n\n// UnmarshalFixed14_4 unmarshals float64 from SOAP \"fixed.14.4\" type.\nfunc UnmarshalFixed14_4(s string) (float64, error) {\n\tv, err := strconv.ParseFloat(s, 64)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif v >= 1e14 || v <= -1e14 {\n\t\treturn 0, fmt.Errorf(\"soap fixed14.4: value %q out of bounds\", s)\n\t}\n\treturn v, nil\n}\n\n// MarshalChar marshals rune to SOAP \"char\" type.\nfunc MarshalChar(v rune) (string, error) {\n\tif v == 0 {\n\t\treturn \"\", errors.New(\"soap char: rune 0 is not allowed\")\n\t}\n\treturn string(v), nil\n}\n\n// UnmarshalChar unmarshals rune from SOAP \"char\" type.\nfunc UnmarshalChar(s string) (rune, error) {\n\tif len(s) == 0 {\n\t\treturn 0, errors.New(\"soap char: got empty string\")\n\t}\n\tr, n := utf8.DecodeRune([]byte(s))\n\tif n != len(s) {\n\t\treturn 0, fmt.Errorf(\"soap char: value %q is not a single rune\", s)\n\t}\n\treturn r, nil\n}\n\nfunc MarshalString(v string) (string, error) {\n\treturn v, nil\n}\n\nfunc UnmarshalString(v string) (string, error) {\n\treturn v, nil\n}\n\nfunc parseInt(s string, err *error) int {\n\tv, parseErr := strconv.ParseInt(s, 10, 64)\n\tif parseErr != nil {\n\t\t*err = parseErr\n\t}\n\treturn int(v)\n}\n\nvar dateRegexps = []*regexp.Regexp{\n\t// yyyy[-mm[-dd]]\n\tregexp.MustCompile(`^(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?$`),\n\t// yyyy[mm[dd]]\n\tregexp.MustCompile(`^(\\d{4})(?:(\\d{2})(?:(\\d{2}))?)?$`),\n}\n\nfunc parseDateParts(s string) (year, month, day int, err error) {\n\tvar parts []string\n\tfor _, re := range dateRegexps {\n\t\tparts = re.FindStringSubmatch(s)\n\t\tif parts != nil {\n\t\t\tbreak\n\t\t}\n\t}\n\tif parts == nil {\n\t\terr = fmt.Errorf(\"soap date: value %q is not in a recognized ISO8601 date format\", s)\n\t\treturn\n\t}\n\n\tyear = parseInt(parts[1], &err)\n\tmonth = 1\n\tday = 1\n\tif len(parts[2]) != 0 {\n\t\tmonth = parseInt(parts[2], &err)\n\t\tif len(parts[3]) != 0 {\n\t\t\tday = parseInt(parts[3], &err)\n\t\t}\n\t}\n\n\tif err != nil {\n\t\terr = fmt.Errorf(\"soap date: %q: %v\", s, err)\n\t}\n\n\treturn\n}\n\nvar timeRegexps = []*regexp.Regexp{\n\t// hh[:mm[:ss]]\n\tregexp.MustCompile(`^(\\d{2})(?::(\\d{2})(?::(\\d{2}))?)?$`),\n\t// hh[mm[ss]]\n\tregexp.MustCompile(`^(\\d{2})(?:(\\d{2})(?:(\\d{2}))?)?$`),\n}\n\nfunc parseTimeParts(s string) (hour, minute, second int, err error) {\n\tvar parts []string\n\tfor _, re := range timeRegexps {\n\t\tparts = re.FindStringSubmatch(s)\n\t\tif parts != nil {\n\t\t\tbreak\n\t\t}\n\t}\n\tif parts == nil {\n\t\terr = fmt.Errorf(\"soap time: value %q is not in ISO8601 time format\", s)\n\t\treturn\n\t}\n\n\thour = parseInt(parts[1], &err)\n\tif len(parts[2]) != 0 {\n\t\tminute = parseInt(parts[2], &err)\n\t\tif len(parts[3]) != 0 {\n\t\t\tsecond = parseInt(parts[3], &err)\n\t\t}\n\t}\n\n\tif err != nil {\n\t\terr = fmt.Errorf(\"soap time: %q: %v\", s, err)\n\t}\n\n\treturn\n}\n\n// (+|-)hh[[:]mm]\nvar timezoneRegexp = regexp.MustCompile(`^([+-])(\\d{2})(?::?(\\d{2}))?$`)\n\nfunc parseTimezone(s string) (offset int, err error) {\n\tif s == \"Z\" {\n\t\treturn 0, nil\n\t}\n\tparts := timezoneRegexp.FindStringSubmatch(s)\n\tif parts == nil {\n\t\terr = fmt.Errorf(\"soap timezone: value %q is not in ISO8601 timezone format\", s)\n\t\treturn\n\t}\n\n\toffset = parseInt(parts[2], &err) * 3600\n\tif len(parts[3]) != 0 {\n\t\toffset += parseInt(parts[3], &err) * 60\n\t}\n\tif parts[1] == \"-\" {\n\t\toffset = -offset\n\t}\n\n\tif err != nil {\n\t\terr = fmt.Errorf(\"soap timezone: %q: %v\", s, err)\n\t}\n\n\treturn\n}\n\nvar completeDateTimeZoneRegexp = regexp.MustCompile(`^([^T]+)(?:T([^-+Z]+)(.+)?)?$`)\n\n// splitCompleteDateTimeZone splits date, time and timezone apart from an\n// ISO8601 string. It does not ensure that the contents of each part are\n// correct, it merely splits on certain delimiters.\n// e.g \"2010-09-08T12:15:10+0700\" => \"2010-09-08\", \"12:15:10\", \"+0700\".\n// Timezone can only be present if time is also present.\nfunc splitCompleteDateTimeZone(s string) (dateStr, timeStr, zoneStr string, err error) {\n\tparts := completeDateTimeZoneRegexp.FindStringSubmatch(s)\n\tif parts == nil {\n\t\terr = fmt.Errorf(\"soap date/time/zone: value %q is not in ISO8601 datetime format\", s)\n\t\treturn\n\t}\n\tdateStr = parts[1]\n\ttimeStr = parts[2]\n\tzoneStr = parts[3]\n\treturn\n}\n\n// MarshalDate marshals time.Time to SOAP \"date\" type. Note that this converts\n// to local time, and discards the time-of-day components.\nfunc MarshalDate(v time.Time) (string, error) {\n\treturn v.In(localLoc).Format(\"2006-01-02\"), nil\n}\n\nvar dateFmts = []string{\"2006-01-02\", \"20060102\"}\n\n// UnmarshalDate unmarshals time.Time from SOAP \"date\" type. This outputs the\n// date as midnight in the local time zone.\nfunc UnmarshalDate(s string) (time.Time, error) {\n\tyear, month, day, err := parseDateParts(s)\n\tif err != nil {\n\t\treturn time.Time{}, err\n\t}\n\treturn time.Date(year, time.Month(month), day, 0, 0, 0, 0, localLoc), nil\n}\n\n// TimeOfDay is used in cases where SOAP \"time\" or \"time.tz\" is used.\ntype TimeOfDay struct {\n\t// Duration of time since midnight.\n\tFromMidnight time.Duration\n\n\t// Set to true if Offset is specified. If false, then the timezone is\n\t// unspecified (and by ISO8601 - implies some \"local\" time).\n\tHasOffset bool\n\n\t// Offset is non-zero only if time.tz is used. It is otherwise ignored. If\n\t// non-zero, then it is regarded as a UTC offset in seconds. Note that the\n\t// sub-minutes is ignored by the marshal function.\n\tOffset int\n}\n\n// MarshalTimeOfDay marshals TimeOfDay to the \"time\" type.\nfunc MarshalTimeOfDay(v TimeOfDay) (string, error) {\n\td := int64(v.FromMidnight / time.Second)\n\thour := d / 3600\n\td = d % 3600\n\tminute := d / 60\n\tsecond := d % 60\n\n\treturn fmt.Sprintf(\"%02d:%02d:%02d\", hour, minute, second), nil\n}\n\n// UnmarshalTimeOfDay unmarshals TimeOfDay from the \"time\" type.\nfunc UnmarshalTimeOfDay(s string) (TimeOfDay, error) {\n\tt, err := UnmarshalTimeOfDayTz(s)\n\tif err != nil {\n\t\treturn TimeOfDay{}, err\n\t} else if t.HasOffset {\n\t\treturn TimeOfDay{}, fmt.Errorf(\"soap time: value %q contains unexpected timezone\")\n\t}\n\treturn t, nil\n}\n\n// MarshalTimeOfDayTz marshals TimeOfDay to the \"time.tz\" type.\nfunc MarshalTimeOfDayTz(v TimeOfDay) (string, error) {\n\td := int64(v.FromMidnight / time.Second)\n\thour := d / 3600\n\td = d % 3600\n\tminute := d / 60\n\tsecond := d % 60\n\n\ttz := \"\"\n\tif v.HasOffset {\n\t\tif v.Offset == 0 {\n\t\t\ttz = \"Z\"\n\t\t} else {\n\t\t\toffsetMins := v.Offset / 60\n\t\t\tsign := '+'\n\t\t\tif offsetMins < 1 {\n\t\t\t\toffsetMins = -offsetMins\n\t\t\t\tsign = '-'\n\t\t\t}\n\t\t\ttz = fmt.Sprintf(\"%c%02d:%02d\", sign, offsetMins/60, offsetMins%60)\n\t\t}\n\t}\n\n\treturn fmt.Sprintf(\"%02d:%02d:%02d%s\", hour, minute, second, tz), nil\n}\n\n// UnmarshalTimeOfDayTz unmarshals TimeOfDay from the \"time.tz\" type.\nfunc UnmarshalTimeOfDayTz(s string) (tod TimeOfDay, err error) {\n\tzoneIndex := strings.IndexAny(s, \"Z+-\")\n\tvar timePart string\n\tvar hasOffset bool\n\tvar offset int\n\tif zoneIndex == -1 {\n\t\thasOffset = false\n\t\ttimePart = s\n\t} else {\n\t\thasOffset = true\n\t\ttimePart = s[:zoneIndex]\n\t\tif offset, err = parseTimezone(s[zoneIndex:]); err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\thour, minute, second, err := parseTimeParts(timePart)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tfromMidnight := time.Duration(hour*3600+minute*60+second) * time.Second\n\n\t// ISO8601 special case - values up to 24:00:00 are allowed, so using\n\t// strictly greater-than for the maximum value.\n\tif fromMidnight > 24*time.Hour || minute >= 60 || second >= 60 {\n\t\treturn TimeOfDay{}, fmt.Errorf(\"soap time.tz: value %q has value(s) out of range\", s)\n\t}\n\n\treturn TimeOfDay{\n\t\tFromMidnight: time.Duration(hour*3600+minute*60+second) * time.Second,\n\t\tHasOffset:    hasOffset,\n\t\tOffset:       offset,\n\t}, nil\n}\n\n// MarshalDateTime marshals time.Time to SOAP \"dateTime\" type. Note that this\n// converts to local time.\nfunc MarshalDateTime(v time.Time) (string, error) {\n\treturn v.In(localLoc).Format(\"2006-01-02T15:04:05\"), nil\n}\n\n// UnmarshalDateTime unmarshals time.Time from the SOAP \"dateTime\" type. This\n// returns a value in the local timezone.\nfunc UnmarshalDateTime(s string) (result time.Time, err error) {\n\tdateStr, timeStr, zoneStr, err := splitCompleteDateTimeZone(s)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif len(zoneStr) != 0 {\n\t\terr = fmt.Errorf(\"soap datetime: unexpected timezone in %q\", s)\n\t\treturn\n\t}\n\n\tyear, month, day, err := parseDateParts(dateStr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tvar hour, minute, second int\n\tif len(timeStr) != 0 {\n\t\thour, minute, second, err = parseTimeParts(timeStr)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tresult = time.Date(year, time.Month(month), day, hour, minute, second, 0, localLoc)\n\treturn\n}\n\n// MarshalDateTimeTz marshals time.Time to SOAP \"dateTime.tz\" type.\nfunc MarshalDateTimeTz(v time.Time) (string, error) {\n\treturn v.Format(\"2006-01-02T15:04:05-07:00\"), nil\n}\n\n// UnmarshalDateTimeTz unmarshals time.Time from the SOAP \"dateTime.tz\" type.\n// This returns a value in the local timezone when the timezone is unspecified.\nfunc UnmarshalDateTimeTz(s string) (result time.Time, err error) {\n\tdateStr, timeStr, zoneStr, err := splitCompleteDateTimeZone(s)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tyear, month, day, err := parseDateParts(dateStr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tvar hour, minute, second int\n\tvar location *time.Location = localLoc\n\tif len(timeStr) != 0 {\n\t\thour, minute, second, err = parseTimeParts(timeStr)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif len(zoneStr) != 0 {\n\t\t\tvar offset int\n\t\t\toffset, err = parseTimezone(zoneStr)\n\t\t\tif offset == 0 {\n\t\t\t\tlocation = time.UTC\n\t\t\t} else {\n\t\t\t\tlocation = time.FixedZone(\"\", offset)\n\t\t\t}\n\t\t}\n\t}\n\n\tresult = time.Date(year, time.Month(month), day, hour, minute, second, 0, location)\n\treturn\n}\n\n// MarshalBoolean marshals bool to SOAP \"boolean\" type.\nfunc MarshalBoolean(v bool) (string, error) {\n\tif v {\n\t\treturn \"1\", nil\n\t}\n\treturn \"0\", nil\n}\n\n// UnmarshalBoolean unmarshals bool from the SOAP \"boolean\" type.\nfunc UnmarshalBoolean(s string) (bool, error) {\n\tswitch s {\n\tcase \"0\", \"false\", \"no\":\n\t\treturn false, nil\n\tcase \"1\", \"true\", \"yes\":\n\t\treturn true, nil\n\t}\n\treturn false, fmt.Errorf(\"soap boolean: %q is not a valid boolean value\", s)\n}\n\n// MarshalBinBase64 marshals []byte to SOAP \"bin.base64\" type.\nfunc MarshalBinBase64(v []byte) (string, error) {\n\treturn base64.StdEncoding.EncodeToString(v), nil\n}\n\n// UnmarshalBinBase64 unmarshals []byte from the SOAP \"bin.base64\" type.\nfunc UnmarshalBinBase64(s string) ([]byte, error) {\n\treturn base64.StdEncoding.DecodeString(s)\n}\n\n// MarshalBinHex marshals []byte to SOAP \"bin.hex\" type.\nfunc MarshalBinHex(v []byte) (string, error) {\n\treturn hex.EncodeToString(v), nil\n}\n\n// UnmarshalBinHex unmarshals []byte from the SOAP \"bin.hex\" type.\nfunc UnmarshalBinHex(s string) ([]byte, error) {\n\treturn hex.DecodeString(s)\n}\n\n// MarshalURI marshals *url.URL to SOAP \"uri\" type.\nfunc MarshalURI(v *url.URL) (string, error) {\n\treturn v.String(), nil\n}\n\n// UnmarshalURI unmarshals *url.URL from the SOAP \"uri\" type.\nfunc UnmarshalURI(s string) (*url.URL, error) {\n\treturn url.Parse(s)\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/ssdp/registry.go",
    "content": "package ssdp\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/huin/goupnp/httpu\"\n)\n\nconst (\n\tmaxExpiryTimeSeconds = 24 * 60 * 60\n)\n\nvar (\n\tmaxAgeRx = regexp.MustCompile(\"max-age= *([0-9]+)\")\n)\n\nconst (\n\tEventAlive = EventType(iota)\n\tEventUpdate\n\tEventByeBye\n)\n\ntype EventType int8\n\nfunc (et EventType) String() string {\n\tswitch et {\n\tcase EventAlive:\n\t\treturn \"EventAlive\"\n\tcase EventUpdate:\n\t\treturn \"EventUpdate\"\n\tcase EventByeBye:\n\t\treturn \"EventByeBye\"\n\tdefault:\n\t\treturn fmt.Sprintf(\"EventUnknown(%d)\", int8(et))\n\t}\n}\n\ntype Update struct {\n\t// The USN of the service.\n\tUSN string\n\t// What happened.\n\tEventType EventType\n\t// The entry, which is nil if the service was not known and\n\t// EventType==EventByeBye. The contents of this must not be modified as it is\n\t// shared with the registry and other listeners. Once created, the Registry\n\t// does not modify the Entry value - any updates are replaced with a new\n\t// Entry value.\n\tEntry *Entry\n}\n\ntype Entry struct {\n\t// The address that the entry data was actually received from.\n\tRemoteAddr string\n\t// Unique Service Name. Identifies a unique instance of a device or service.\n\tUSN string\n\t// Notfication Type. The type of device or service being announced.\n\tNT string\n\t// Server's self-identifying string.\n\tServer string\n\tHost   string\n\t// Location of the UPnP root device description.\n\tLocation url.URL\n\n\t// Despite BOOTID,CONFIGID being required fields, apparently they are not\n\t// always set by devices. Set to -1 if not present.\n\n\tBootID   int32\n\tConfigID int32\n\n\tSearchPort uint16\n\n\t// When the last update was received for this entry identified by this USN.\n\tLastUpdate time.Time\n\t// When the last update's cached values are advised to expire.\n\tCacheExpiry time.Time\n}\n\nfunc newEntryFromRequest(r *http.Request) (*Entry, error) {\n\tnow := time.Now()\n\texpiryDuration, err := parseCacheControlMaxAge(r.Header.Get(\"CACHE-CONTROL\"))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"ssdp: error parsing CACHE-CONTROL max age: %v\", err)\n\t}\n\n\tloc, err := url.Parse(r.Header.Get(\"LOCATION\"))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"ssdp: error parsing entry Location URL: %v\", err)\n\t}\n\n\tbootID, err := parseUpnpIntHeader(r.Header, \"BOOTID.UPNP.ORG\", -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tconfigID, err := parseUpnpIntHeader(r.Header, \"CONFIGID.UPNP.ORG\", -1)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsearchPort, err := parseUpnpIntHeader(r.Header, \"SEARCHPORT.UPNP.ORG\", ssdpSearchPort)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif searchPort < 1 || searchPort > 65535 {\n\t\treturn nil, fmt.Errorf(\"ssdp: search port %d is out of range\", searchPort)\n\t}\n\n\treturn &Entry{\n\t\tRemoteAddr:  r.RemoteAddr,\n\t\tUSN:         r.Header.Get(\"USN\"),\n\t\tNT:          r.Header.Get(\"NT\"),\n\t\tServer:      r.Header.Get(\"SERVER\"),\n\t\tHost:        r.Header.Get(\"HOST\"),\n\t\tLocation:    *loc,\n\t\tBootID:      bootID,\n\t\tConfigID:    configID,\n\t\tSearchPort:  uint16(searchPort),\n\t\tLastUpdate:  now,\n\t\tCacheExpiry: now.Add(expiryDuration),\n\t}, nil\n}\n\nfunc parseCacheControlMaxAge(cc string) (time.Duration, error) {\n\tmatches := maxAgeRx.FindStringSubmatch(cc)\n\tif len(matches) != 2 {\n\t\treturn 0, fmt.Errorf(\"did not find exactly one max-age in cache control header: %q\", cc)\n\t}\n\texpirySeconds, err := strconv.ParseInt(matches[1], 10, 16)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif expirySeconds < 1 || expirySeconds > maxExpiryTimeSeconds {\n\t\treturn 0, fmt.Errorf(\"rejecting bad expiry time of %d seconds\", expirySeconds)\n\t}\n\treturn time.Duration(expirySeconds) * time.Second, nil\n}\n\n// parseUpnpIntHeader is intended to parse the\n// {BOOT,CONFIGID,SEARCHPORT}.UPNP.ORG header fields. It returns the def if\n// the head is empty or missing.\nfunc parseUpnpIntHeader(headers http.Header, headerName string, def int32) (int32, error) {\n\ts := headers.Get(headerName)\n\tif s == \"\" {\n\t\treturn def, nil\n\t}\n\tv, err := strconv.ParseInt(s, 10, 32)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"ssdp: could not parse header %s: %v\", headerName, err)\n\t}\n\treturn int32(v), nil\n}\n\nvar _ httpu.Handler = new(Registry)\n\n// Registry maintains knowledge of discovered devices and services.\n//\n// NOTE: the interface for this is experimental and may change, or go away\n// entirely.\ntype Registry struct {\n\tlock  sync.Mutex\n\tbyUSN map[string]*Entry\n\n\tlistenersLock sync.RWMutex\n\tlisteners     map[chan<- Update]struct{}\n}\n\nfunc NewRegistry() *Registry {\n\treturn &Registry{\n\t\tbyUSN:     make(map[string]*Entry),\n\t\tlisteners: make(map[chan<- Update]struct{}),\n\t}\n}\n\n// NewServerAndRegistry is a convenience function to create a registry, and an\n// httpu server to pass it messages. Call ListenAndServe on the server for\n// messages to be processed.\nfunc NewServerAndRegistry() (*httpu.Server, *Registry) {\n\treg := NewRegistry()\n\tsrv := &httpu.Server{\n\t\tAddr:      ssdpUDP4Addr,\n\t\tMulticast: true,\n\t\tHandler:   reg,\n\t}\n\treturn srv, reg\n}\n\nfunc (reg *Registry) AddListener(c chan<- Update) {\n\treg.listenersLock.Lock()\n\tdefer reg.listenersLock.Unlock()\n\treg.listeners[c] = struct{}{}\n}\n\nfunc (reg *Registry) RemoveListener(c chan<- Update) {\n\treg.listenersLock.Lock()\n\tdefer reg.listenersLock.Unlock()\n\tdelete(reg.listeners, c)\n}\n\nfunc (reg *Registry) sendUpdate(u Update) {\n\treg.listenersLock.RLock()\n\tdefer reg.listenersLock.RUnlock()\n\tfor c := range reg.listeners {\n\t\tc <- u\n\t}\n}\n\n// GetService returns known service (or device) entries for the given service\n// URN.\nfunc (reg *Registry) GetService(serviceURN string) []*Entry {\n\t// Currently assumes that the map is small, so we do a linear search rather\n\t// than indexed to avoid maintaining two maps.\n\tvar results []*Entry\n\treg.lock.Lock()\n\tdefer reg.lock.Unlock()\n\tfor _, entry := range reg.byUSN {\n\t\tif entry.NT == serviceURN {\n\t\t\tresults = append(results, entry)\n\t\t}\n\t}\n\treturn results\n}\n\n// ServeMessage implements httpu.Handler, and uses SSDP NOTIFY requests to\n// maintain the registry of devices and services.\nfunc (reg *Registry) ServeMessage(r *http.Request) {\n\tif r.Method != methodNotify {\n\t\treturn\n\t}\n\n\tnts := r.Header.Get(\"nts\")\n\n\tvar err error\n\tswitch nts {\n\tcase ntsAlive:\n\t\terr = reg.handleNTSAlive(r)\n\tcase ntsUpdate:\n\t\terr = reg.handleNTSUpdate(r)\n\tcase ntsByebye:\n\t\terr = reg.handleNTSByebye(r)\n\tdefault:\n\t\terr = fmt.Errorf(\"unknown NTS value: %q\", nts)\n\t}\n\tif err != nil {\n\t\tlog.Printf(\"goupnp/ssdp: failed to handle %s message from %s: %v\", nts, r.RemoteAddr, err)\n\t}\n}\n\nfunc (reg *Registry) handleNTSAlive(r *http.Request) error {\n\tentry, err := newEntryFromRequest(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treg.lock.Lock()\n\treg.byUSN[entry.USN] = entry\n\treg.lock.Unlock()\n\n\treg.sendUpdate(Update{\n\t\tUSN:       entry.USN,\n\t\tEventType: EventAlive,\n\t\tEntry:     entry,\n\t})\n\n\treturn nil\n}\n\nfunc (reg *Registry) handleNTSUpdate(r *http.Request) error {\n\tentry, err := newEntryFromRequest(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\tnextBootID, err := parseUpnpIntHeader(r.Header, \"NEXTBOOTID.UPNP.ORG\", -1)\n\tif err != nil {\n\t\treturn err\n\t}\n\tentry.BootID = nextBootID\n\n\treg.lock.Lock()\n\treg.byUSN[entry.USN] = entry\n\treg.lock.Unlock()\n\n\treg.sendUpdate(Update{\n\t\tUSN:       entry.USN,\n\t\tEventType: EventUpdate,\n\t\tEntry:     entry,\n\t})\n\n\treturn nil\n}\n\nfunc (reg *Registry) handleNTSByebye(r *http.Request) error {\n\tusn := r.Header.Get(\"USN\")\n\n\treg.lock.Lock()\n\tentry := reg.byUSN[usn]\n\tdelete(reg.byUSN, usn)\n\treg.lock.Unlock()\n\n\treg.sendUpdate(Update{\n\t\tUSN:       usn,\n\t\tEventType: EventByeBye,\n\t\tEntry:     entry,\n\t})\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/huin/goupnp/ssdp/ssdp.go",
    "content": "package ssdp\n\nimport (\n\t\"errors\"\n\t\"log\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/huin/goupnp/httpu\"\n)\n\nconst (\n\tssdpDiscover   = `\"ssdp:discover\"`\n\tntsAlive       = `ssdp:alive`\n\tntsByebye      = `ssdp:byebye`\n\tntsUpdate      = `ssdp:update`\n\tssdpUDP4Addr   = \"239.255.255.250:1900\"\n\tssdpSearchPort = 1900\n\tmethodSearch   = \"M-SEARCH\"\n\tmethodNotify   = \"NOTIFY\"\n)\n\n// SSDPRawSearch performs a fairly raw SSDP search request, and returns the\n// unique response(s) that it receives. Each response has the requested\n// searchTarget, a USN, and a valid location. maxWaitSeconds states how long to\n// wait for responses in seconds, and must be a minimum of 1 (the\n// implementation waits an additional 100ms for responses to arrive), 2 is a\n// reasonable value for this. numSends is the number of requests to send - 3 is\n// a reasonable value for this.\nfunc SSDPRawSearch(httpu *httpu.HTTPUClient, searchTarget string, maxWaitSeconds int, numSends int) ([]*http.Response, error) {\n\tif maxWaitSeconds < 1 {\n\t\treturn nil, errors.New(\"ssdp: maxWaitSeconds must be >= 1\")\n\t}\n\n\tseenUsns := make(map[string]bool)\n\tvar responses []*http.Response\n\treq := http.Request{\n\t\tMethod: methodSearch,\n\t\t// TODO: Support both IPv4 and IPv6.\n\t\tHost: ssdpUDP4Addr,\n\t\tURL:  &url.URL{Opaque: \"*\"},\n\t\tHeader: http.Header{\n\t\t\t// Putting headers in here avoids them being title-cased.\n\t\t\t// (The UPnP discovery protocol uses case-sensitive headers)\n\t\t\t\"HOST\": []string{ssdpUDP4Addr},\n\t\t\t\"MX\":   []string{strconv.FormatInt(int64(maxWaitSeconds), 10)},\n\t\t\t\"MAN\":  []string{ssdpDiscover},\n\t\t\t\"ST\":   []string{searchTarget},\n\t\t},\n\t}\n\tallResponses, err := httpu.Do(&req, time.Duration(maxWaitSeconds)*time.Second+100*time.Millisecond, numSends)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfor _, response := range allResponses {\n\t\tif response.StatusCode != 200 {\n\t\t\tlog.Printf(\"ssdp: got response status code %q in search response\", response.Status)\n\t\t\tcontinue\n\t\t}\n\t\tif st := response.Header.Get(\"ST\"); st != searchTarget {\n\t\t\tlog.Printf(\"ssdp: got unexpected search target result %q\", st)\n\t\t\tcontinue\n\t\t}\n\t\tlocation, err := response.Location()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"ssdp: no usable location in search response (discarding): %v\", err)\n\t\t\tcontinue\n\t\t}\n\t\tusn := response.Header.Get(\"USN\")\n\t\tif usn == \"\" {\n\t\t\tlog.Printf(\"ssdp: empty/missing USN in search response (using location instead): %v\", err)\n\t\t\tusn = location.String()\n\t\t}\n\t\tif _, alreadySeen := seenUsns[usn]; !alreadySeen {\n\t\t\tseenUsns[usn] = true\n\t\t\tresponses = append(responses, response)\n\t\t}\n\t}\n\n\treturn responses, nil\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-2016 Errplane Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/LICENSE_OF_DEPENDENCIES.md",
    "content": "- # List\n- bootstrap 3.3.5 [MIT LICENSE](https://github.com/twbs/bootstrap/blob/master/LICENSE)\n- collectd.org [ISC LICENSE](https://github.com/collectd/go-collectd/blob/master/LICENSE)\n- github.com/BurntSushi/toml [MIT LICENSE](https://github.com/BurntSushi/toml/blob/master/COPYING)\n- github.com/RoaringBitmap/roaring [APACHE LICENSE](https://github.com/RoaringBitmap/roaring/blob/master/LICENSE)\n- github.com/beorn7/perks [MIT LICENSE](https://github.com/beorn7/perks/blob/master/LICENSE)\n- github.com/bmizerany/pat [MIT LICENSE](https://github.com/bmizerany/pat#license)\n- github.com/boltdb/bolt [MIT LICENSE](https://github.com/boltdb/bolt/blob/master/LICENSE)\n- github.com/cespare/xxhash [MIT LICENSE](https://github.com/cespare/xxhash/blob/master/LICENSE.txt)\n- github.com/clarkduvall/hyperloglog [MIT LICENSE](https://github.com/clarkduvall/hyperloglog/blob/master/LICENSE)\n- github.com/davecgh/go-spew/spew [ISC LICENSE](https://github.com/davecgh/go-spew/blob/master/LICENSE)\n- github.com/dgrijalva/jwt-go [MIT LICENSE](https://github.com/dgrijalva/jwt-go/blob/master/LICENSE)\n- github.com/dgryski/go-bits [MIT LICENSE](https://github.com/dgryski/go-bits/blob/master/LICENSE)\n- github.com/dgryski/go-bitstream [MIT LICENSE](https://github.com/dgryski/go-bitstream/blob/master/LICENSE)\n- github.com/glycerine/go-unsnap-stream [MIT LICENSE](https://github.com/glycerine/go-unsnap-stream/blob/master/LICENSE)\n- github.com/gogo/protobuf/proto [BSD LICENSE](https://github.com/gogo/protobuf/blob/master/LICENSE)\n- github.com/golang/protobuf [BSD LICENSE](https://github.com/golang/protobuf/blob/master/LICENSE)\n- github.com/golang/snappy [BSD LICENSE](https://github.com/golang/snappy/blob/master/LICENSE)\n- github.com/google/go-cmp [BSD LICENSE](https://github.com/google/go-cmp/blob/master/LICENSE)\n- github.com/influxdata/influxql [MIT LICENSE](https://github.com/influxdata/influxql/blob/master/LICENSE)\n- github.com/influxdata/usage-client [MIT LICENSE](https://github.com/influxdata/usage-client/blob/master/LICENSE.txt)\n- github.com/influxdata/yamux [MOZILLA PUBLIC LICENSE](https://github.com/influxdata/yamux/blob/master/LICENSE)\n- github.com/influxdata/yarpc [MIT LICENSE](https://github.com/influxdata/yarpc/blob/master/LICENSE)\n- github.com/jsternberg/zap-logfmt [MIT LICENSE](https://github.com/jsternberg/zap-logfmt/blob/master/LICENSE)\n- github.com/jwilder/encoding [MIT LICENSE](https://github.com/jwilder/encoding/blob/master/LICENSE)\n- github.com/mattn/go-isatty [MIT LICENSE](https://github.com/mattn/go-isatty/blob/master/LICENSE)\n- github.com/matttproud/golang_protobuf_extensions [APACHE LICENSE](https://github.com/matttproud/golang_protobuf_extensions/blob/master/LICENSE)\n- github.com/opentracing/opentracing-go [MIT LICENSE](https://github.com/opentracing/opentracing-go/blob/master/LICENSE)\n- github.com/paulbellamy/ratecounter [MIT LICENSE](https://github.com/paulbellamy/ratecounter/blob/master/LICENSE)\n- github.com/peterh/liner [MIT LICENSE](https://github.com/peterh/liner/blob/master/COPYING)\n- github.com/philhofer/fwd [MIT LICENSE](https://github.com/philhofer/fwd/blob/master/LICENSE.md)\n- github.com/prometheus/client_golang [MIT LICENSE](https://github.com/prometheus/client_golang/blob/master/LICENSE)\n- github.com/prometheus/client_model [MIT LICENSE](https://github.com/prometheus/client_model/blob/master/LICENSE)\n- github.com/prometheus/common [APACHE LICENSE](https://github.com/prometheus/common/blob/master/LICENSE)\n- github.com/prometheus/procfs [APACHE LICENSE](https://github.com/prometheus/procfs/blob/master/LICENSE)\n- github.com/rakyll/statik [APACHE LICENSE](https://github.com/rakyll/statik/blob/master/LICENSE)\n- github.com/retailnext/hllpp [BSD LICENSE](https://github.com/retailnext/hllpp/blob/master/LICENSE)\n- github.com/tinylib/msgp [MIT LICENSE](https://github.com/tinylib/msgp/blob/master/LICENSE)\n- go.uber.org/atomic [MIT LICENSE](https://github.com/uber-go/atomic/blob/master/LICENSE.txt)\n- go.uber.org/multierr [MIT LICENSE](https://github.com/uber-go/multierr/blob/master/LICENSE.txt)\n- go.uber.org/zap [MIT LICENSE](https://github.com/uber-go/zap/blob/master/LICENSE.txt)\n- golang.org/x/crypto [BSD LICENSE](https://github.com/golang/crypto/blob/master/LICENSE)\n- golang.org/x/net [BSD LICENSE](https://github.com/golang/net/blob/master/LICENSE)\n- golang.org/x/sys [BSD LICENSE](https://github.com/golang/sys/blob/master/LICENSE)\n- golang.org/x/text [BSD LICENSE](https://github.com/golang/text/blob/master/LICENSE)\n- golang.org/x/time [BSD LICENSE](https://github.com/golang/time/blob/master/LICENSE)\n- jquery 2.1.4 [MIT LICENSE](https://github.com/jquery/jquery/blob/master/LICENSE.txt)\n- github.com/xlab/treeprint [MIT LICENSE](https://github.com/xlab/treeprint/blob/master/LICENSE)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/client/README.md",
    "content": "# InfluxDB Client\n\n[![GoDoc](https://godoc.org/github.com/influxdata/influxdb?status.svg)](http://godoc.org/github.com/influxdata/influxdb/client/v2)\n\n## Description\n\n**NOTE:** The Go client library now has a \"v2\" version, with the old version\nbeing deprecated. The new version can be imported at\n`import \"github.com/influxdata/influxdb/client/v2\"`. It is not backwards-compatible.\n\nA Go client library written and maintained by the **InfluxDB** team.\nThis package provides convenience functions to read and write time series data.\nIt uses the HTTP protocol to communicate with your **InfluxDB** cluster.\n\n\n## Getting Started\n\n### Connecting To Your Database\n\nConnecting to an **InfluxDB** database is straightforward. You will need a host\nname, a port and the cluster user credentials if applicable. The default port is\n8086. You can customize these settings to your specific installation via the\n**InfluxDB** configuration file.\n\nThough not necessary for experimentation, you may want to create a new user\nand authenticate the connection to your database.\n\nFor more information please check out the\n[Admin Docs](https://docs.influxdata.com/influxdb/latest/administration/).\n\nFor the impatient, you can create a new admin user _bubba_ by firing off the\n[InfluxDB CLI](https://github.com/influxdata/influxdb/blob/master/cmd/influx/main.go).\n\n```shell\ninflux\n> create user bubba with password 'bumblebeetuna'\n> grant all privileges to bubba\n```\n\nAnd now for good measure set the credentials in you shell environment.\nIn the example below we will use $INFLUX_USER and $INFLUX_PWD\n\nNow with the administrivia out of the way, let's connect to our database.\n\nNOTE: If you've opted out of creating a user, you can omit Username and Password in\nthe configuration below.\n\n```go\npackage main\n\nimport (\n\t\"log\"\n\t\"time\"\n\n\t\"github.com/influxdata/influxdb/client/v2\"\n)\n\nconst (\n\tMyDB = \"square_holes\"\n\tusername = \"bubba\"\n\tpassword = \"bumblebeetuna\"\n)\n\n\nfunc main() {\n\t// Create a new HTTPClient\n\tc, err := client.NewHTTPClient(client.HTTPConfig{\n\t\tAddr:     \"http://localhost:8086\",\n\t\tUsername: username,\n\t\tPassword: password,\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create a new point batch\n\tbp, err := client.NewBatchPoints(client.BatchPointsConfig{\n\t\tDatabase:  MyDB,\n\t\tPrecision: \"s\",\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create a point and add to batch\n\ttags := map[string]string{\"cpu\": \"cpu-total\"}\n\tfields := map[string]interface{}{\n\t\t\"idle\":   10.1,\n\t\t\"system\": 53.3,\n\t\t\"user\":   46.6,\n\t}\n\n\tpt, err := client.NewPoint(\"cpu_usage\", tags, fields, time.Now())\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tbp.AddPoint(pt)\n\n\t// Write the batch\n\tif err := c.Write(bp); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\n```\n\n### Inserting Data\n\nTime series data aka *points* are written to the database using batch inserts.\nThe mechanism is to create one or more points and then create a batch aka\n*batch points* and write these to a given database and series. A series is a\ncombination of a measurement (time/values) and a set of tags.\n\nIn this sample we will create a batch of a 1,000 points. Each point has a time and\na single value as well as 2 tags indicating a shape and color. We write these points\nto a database called _square_holes_ using a measurement named _shapes_.\n\nNOTE: You can specify a RetentionPolicy as part of the batch points. If not\nprovided InfluxDB will use the database _default_ retention policy.\n\n```go\n\nfunc writePoints(clnt client.Client) {\n\tsampleSize := 1000\n\n\tbp, err := client.NewBatchPoints(client.BatchPointsConfig{\n\t\tDatabase:  \"systemstats\",\n\t\tPrecision: \"us\",\n\t})\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n    rand.Seed(time.Now().UnixNano())\n\tfor i := 0; i < sampleSize; i++ {\n\t\tregions := []string{\"us-west1\", \"us-west2\", \"us-west3\", \"us-east1\"}\n\t\ttags := map[string]string{\n\t\t\t\"cpu\":    \"cpu-total\",\n\t\t\t\"host\":   fmt.Sprintf(\"host%d\", rand.Intn(1000)),\n\t\t\t\"region\": regions[rand.Intn(len(regions))],\n\t\t}\n\n\t\tidle := rand.Float64() * 100.0\n\t\tfields := map[string]interface{}{\n\t\t\t\"idle\": idle,\n\t\t\t\"busy\": 100.0 - idle,\n\t\t}\n\n\t\tpt, err := client.NewPoint(\n\t\t\t\"cpu_usage\",\n\t\t\ttags,\n\t\t\tfields,\n\t\t\ttime.Now(),\n\t\t)\n\t\tif err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t\tbp.AddPoint(pt)\n\t}\n\n\tif err := clnt.Write(bp); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n```\n\n#### Uint64 Support\n\nThe `uint64` data type is supported if your server is version `1.4.0` or\ngreater. To write a data point as an unsigned integer, you must insert\nthe point as `uint64`. You cannot use `uint` or any of the other\nderivatives because previous versions of the client have supported\nwriting those types as an integer.\n\n### Querying Data\n\nOne nice advantage of using **InfluxDB** the ability to query your data using familiar\nSQL constructs. In this example we can create a convenience function to query the database\nas follows:\n\n```go\n// queryDB convenience function to query the database\nfunc queryDB(clnt client.Client, cmd string) (res []client.Result, err error) {\n\tq := client.Query{\n\t\tCommand:  cmd,\n\t\tDatabase: MyDB,\n\t}\n\tif response, err := clnt.Query(q); err == nil {\n\t\tif response.Error() != nil {\n\t\t\treturn res, response.Error()\n\t\t}\n\t\tres = response.Results\n\t} else {\n\t\treturn res, err\n\t}\n\treturn res, nil\n}\n```\n\n#### Creating a Database\n\n```go\n_, err := queryDB(clnt, fmt.Sprintf(\"CREATE DATABASE %s\", MyDB))\nif err != nil {\n\tlog.Fatal(err)\n}\n```\n\n#### Count Records\n\n```go\nq := fmt.Sprintf(\"SELECT count(%s) FROM %s\", \"value\", MyMeasurement)\nres, err := queryDB(clnt, q)\nif err != nil {\n\tlog.Fatal(err)\n}\ncount := res[0].Series[0].Values[0][1]\nlog.Printf(\"Found a total of %v records\\n\", count)\n```\n\n#### Find the last 10 _shapes_ records\n\n```go\nq := fmt.Sprintf(\"SELECT * FROM %s LIMIT %d\", MyMeasurement, 10)\nres, err = queryDB(clnt, q)\nif err != nil {\n\tlog.Fatal(err)\n}\n\nfor i, row := range res[0].Series[0].Values {\n\tt, err := time.Parse(time.RFC3339, row[0].(string))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tval := row[1].(string)\n\tlog.Printf(\"[%2d] %s: %s\\n\", i, t.Format(time.Stamp), val)\n}\n```\n\n### Using the UDP Client\n\nThe **InfluxDB** client also supports writing over UDP.\n\n```go\nfunc WriteUDP() {\n\t// Make client\n\tc, err := client.NewUDPClient(\"localhost:8089\")\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\t\n\t// Create a new point batch\n\tbp, _ := client.NewBatchPoints(client.BatchPointsConfig{\n\t\tPrecision: \"s\",\n\t})\n\n\t// Create a point and add to batch\n\ttags := map[string]string{\"cpu\": \"cpu-total\"}\n\tfields := map[string]interface{}{\n\t\t\"idle\":   10.1,\n\t\t\"system\": 53.3,\n\t\t\"user\":   46.6,\n\t}\n\tpt, err := client.NewPoint(\"cpu_usage\", tags, fields, time.Now())\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\tbp.AddPoint(pt)\n\n\t// Write the batch\n\tc.Write(bp)\n}\n```\n\n### Point Splitting\n\nThe UDP client now supports splitting single points that exceed the configured\npayload size. The logic for processing each point is listed here, starting with\nan empty payload.\n\n1. If adding the point to the current (non-empty) payload would exceed the\n   configured size, send the current payload. Otherwise, add it to the current\n   payload.\n1. If the point is smaller than the configured size, add it to the payload.\n1. If the point has no timestamp, just try to send the entire point as a single\n   UDP payload, and process the next point.\n1. Since the point has a timestamp, re-use the existing measurement name,\n   tagset, and timestamp and create multiple new points by splitting up the\n   fields. The per-point length will be kept close to the configured size,\n   staying under it if possible. This does mean that one large field, maybe a\n   long string, could be sent as a larger-than-configured payload.\n\nThe above logic attempts to respect configured payload sizes, but not sacrifice\nany data integrity. Points without a timestamp can't be split, as that may\ncause fields to have differing timestamps when processed by the server.\n\n## Go Docs\n\nPlease refer to\n[http://godoc.org/github.com/influxdata/influxdb/client/v2](http://godoc.org/github.com/influxdata/influxdb/client/v2)\nfor documentation.\n\n## See Also\n\nYou can also examine how the client library is used by the\n[InfluxDB CLI](https://github.com/influxdata/influxdb/blob/master/cmd/influx/main.go).\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/client/influxdb.go",
    "content": "// Package client implements a now-deprecated client for InfluxDB;\n// use github.com/influxdata/influxdb/client/v2 instead.\npackage client // import \"github.com/influxdata/influxdb/client\"\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/influxdata/influxdb/models\"\n)\n\nconst (\n\t// DefaultHost is the default host used to connect to an InfluxDB instance\n\tDefaultHost = \"localhost\"\n\n\t// DefaultPort is the default port used to connect to an InfluxDB instance\n\tDefaultPort = 8086\n\n\t// DefaultTimeout is the default connection timeout used to connect to an InfluxDB instance\n\tDefaultTimeout = 0\n)\n\n// Query is used to send a command to the server. Both Command and Database are required.\ntype Query struct {\n\tCommand  string\n\tDatabase string\n\n\t// Chunked tells the server to send back chunked responses. This places\n\t// less load on the server by sending back chunks of the response rather\n\t// than waiting for the entire response all at once.\n\tChunked bool\n\n\t// ChunkSize sets the maximum number of rows that will be returned per\n\t// chunk. Chunks are either divided based on their series or if they hit\n\t// the chunk size limit.\n\t//\n\t// Chunked must be set to true for this option to be used.\n\tChunkSize int\n}\n\n// ParseConnectionString will parse a string to create a valid connection URL\nfunc ParseConnectionString(path string, ssl bool) (url.URL, error) {\n\tvar host string\n\tvar port int\n\n\th, p, err := net.SplitHostPort(path)\n\tif err != nil {\n\t\tif path == \"\" {\n\t\t\thost = DefaultHost\n\t\t} else {\n\t\t\thost = path\n\t\t}\n\t\t// If they didn't specify a port, always use the default port\n\t\tport = DefaultPort\n\t} else {\n\t\thost = h\n\t\tport, err = strconv.Atoi(p)\n\t\tif err != nil {\n\t\t\treturn url.URL{}, fmt.Errorf(\"invalid port number %q: %s\\n\", path, err)\n\t\t}\n\t}\n\n\tu := url.URL{\n\t\tScheme: \"http\",\n\t}\n\tif ssl {\n\t\tu.Scheme = \"https\"\n\t}\n\n\tu.Host = net.JoinHostPort(host, strconv.Itoa(port))\n\n\treturn u, nil\n}\n\n// Config is used to specify what server to connect to.\n// URL: The URL of the server connecting to.\n// Username/Password are optional. They will be passed via basic auth if provided.\n// UserAgent: If not provided, will default \"InfluxDBClient\",\n// Timeout: If not provided, will default to 0 (no timeout)\ntype Config struct {\n\tURL              url.URL\n\tUnixSocket       string\n\tUsername         string\n\tPassword         string\n\tUserAgent        string\n\tTimeout          time.Duration\n\tPrecision        string\n\tWriteConsistency string\n\tUnsafeSsl        bool\n}\n\n// NewConfig will create a config to be used in connecting to the client\nfunc NewConfig() Config {\n\treturn Config{\n\t\tTimeout: DefaultTimeout,\n\t}\n}\n\n// Client is used to make calls to the server.\ntype Client struct {\n\turl        url.URL\n\tunixSocket string\n\tusername   string\n\tpassword   string\n\thttpClient *http.Client\n\tuserAgent  string\n\tprecision  string\n}\n\nconst (\n\t// ConsistencyOne requires at least one data node acknowledged a write.\n\tConsistencyOne = \"one\"\n\n\t// ConsistencyAll requires all data nodes to acknowledge a write.\n\tConsistencyAll = \"all\"\n\n\t// ConsistencyQuorum requires a quorum of data nodes to acknowledge a write.\n\tConsistencyQuorum = \"quorum\"\n\n\t// ConsistencyAny allows for hinted hand off, potentially no write happened yet.\n\tConsistencyAny = \"any\"\n)\n\n// NewClient will instantiate and return a connected client to issue commands to the server.\nfunc NewClient(c Config) (*Client, error) {\n\ttlsConfig := &tls.Config{\n\t\tInsecureSkipVerify: c.UnsafeSsl,\n\t}\n\n\ttr := &http.Transport{\n\t\tTLSClientConfig: tlsConfig,\n\t}\n\n\tif c.UnixSocket != \"\" {\n\t\t// No need for compression in local communications.\n\t\ttr.DisableCompression = true\n\n\t\ttr.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) {\n\t\t\treturn net.Dial(\"unix\", c.UnixSocket)\n\t\t}\n\t}\n\n\tclient := Client{\n\t\turl:        c.URL,\n\t\tunixSocket: c.UnixSocket,\n\t\tusername:   c.Username,\n\t\tpassword:   c.Password,\n\t\thttpClient: &http.Client{Timeout: c.Timeout, Transport: tr},\n\t\tuserAgent:  c.UserAgent,\n\t\tprecision:  c.Precision,\n\t}\n\tif client.userAgent == \"\" {\n\t\tclient.userAgent = \"InfluxDBClient\"\n\t}\n\treturn &client, nil\n}\n\n// SetAuth will update the username and passwords\nfunc (c *Client) SetAuth(u, p string) {\n\tc.username = u\n\tc.password = p\n}\n\n// SetPrecision will update the precision\nfunc (c *Client) SetPrecision(precision string) {\n\tc.precision = precision\n}\n\n// Query sends a command to the server and returns the Response\nfunc (c *Client) Query(q Query) (*Response, error) {\n\treturn c.QueryContext(context.Background(), q)\n}\n\n// QueryContext sends a command to the server and returns the Response\n// It uses a context that can be cancelled by the command line client\nfunc (c *Client) QueryContext(ctx context.Context, q Query) (*Response, error) {\n\tu := c.url\n\n\tu.Path = \"query\"\n\tvalues := u.Query()\n\tvalues.Set(\"q\", q.Command)\n\tvalues.Set(\"db\", q.Database)\n\tif q.Chunked {\n\t\tvalues.Set(\"chunked\", \"true\")\n\t\tif q.ChunkSize > 0 {\n\t\t\tvalues.Set(\"chunk_size\", strconv.Itoa(q.ChunkSize))\n\t\t}\n\t}\n\tif c.precision != \"\" {\n\t\tvalues.Set(\"epoch\", c.precision)\n\t}\n\tu.RawQuery = values.Encode()\n\n\treq, err := http.NewRequest(\"POST\", u.String(), nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"User-Agent\", c.userAgent)\n\tif c.username != \"\" {\n\t\treq.SetBasicAuth(c.username, c.password)\n\t}\n\n\treq = req.WithContext(ctx)\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tvar response Response\n\tif q.Chunked {\n\t\tcr := NewChunkedResponse(resp.Body)\n\t\tfor {\n\t\t\tr, err := cr.NextResponse()\n\t\t\tif err != nil {\n\t\t\t\t// If we got an error while decoding the response, send that back.\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif r == nil {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tresponse.Results = append(response.Results, r.Results...)\n\t\t\tif r.Err != nil {\n\t\t\t\tresponse.Err = r.Err\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t} else {\n\t\tdec := json.NewDecoder(resp.Body)\n\t\tdec.UseNumber()\n\t\tif err := dec.Decode(&response); err != nil {\n\t\t\t// Ignore EOF errors if we got an invalid status code.\n\t\t\tif !(err == io.EOF && resp.StatusCode != http.StatusOK) {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t}\n\n\t// If we don't have an error in our json response, and didn't get StatusOK,\n\t// then send back an error.\n\tif resp.StatusCode != http.StatusOK && response.Error() == nil {\n\t\treturn &response, fmt.Errorf(\"received status code %d from server\", resp.StatusCode)\n\t}\n\treturn &response, nil\n}\n\n// Write takes BatchPoints and allows for writing of multiple points with defaults\n// If successful, error is nil and Response is nil\n// If an error occurs, Response may contain additional information if populated.\nfunc (c *Client) Write(bp BatchPoints) (*Response, error) {\n\tu := c.url\n\tu.Path = \"write\"\n\n\tvar b bytes.Buffer\n\tfor _, p := range bp.Points {\n\t\terr := checkPointTypes(p)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif p.Raw != \"\" {\n\t\t\tif _, err := b.WriteString(p.Raw); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t} else {\n\t\t\tfor k, v := range bp.Tags {\n\t\t\t\tif p.Tags == nil {\n\t\t\t\t\tp.Tags = make(map[string]string, len(bp.Tags))\n\t\t\t\t}\n\t\t\t\tp.Tags[k] = v\n\t\t\t}\n\n\t\t\tif _, err := b.WriteString(p.MarshalString()); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\tif err := b.WriteByte('\\n'); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treq, err := http.NewRequest(\"POST\", u.String(), &b)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Type\", \"\")\n\treq.Header.Set(\"User-Agent\", c.userAgent)\n\tif c.username != \"\" {\n\t\treq.SetBasicAuth(c.username, c.password)\n\t}\n\n\tprecision := bp.Precision\n\tif precision == \"\" {\n\t\tprecision = \"ns\"\n\t}\n\n\tparams := req.URL.Query()\n\tparams.Set(\"db\", bp.Database)\n\tparams.Set(\"rp\", bp.RetentionPolicy)\n\tparams.Set(\"precision\", precision)\n\tparams.Set(\"consistency\", bp.WriteConsistency)\n\treq.URL.RawQuery = params.Encode()\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tvar response Response\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK {\n\t\tvar err = fmt.Errorf(string(body))\n\t\tresponse.Err = err\n\t\treturn &response, err\n\t}\n\n\treturn nil, nil\n}\n\n// WriteLineProtocol takes a string with line returns to delimit each write\n// If successful, error is nil and Response is nil\n// If an error occurs, Response may contain additional information if populated.\nfunc (c *Client) WriteLineProtocol(data, database, retentionPolicy, precision, writeConsistency string) (*Response, error) {\n\tu := c.url\n\tu.Path = \"write\"\n\n\tr := strings.NewReader(data)\n\n\treq, err := http.NewRequest(\"POST\", u.String(), r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Type\", \"\")\n\treq.Header.Set(\"User-Agent\", c.userAgent)\n\tif c.username != \"\" {\n\t\treq.SetBasicAuth(c.username, c.password)\n\t}\n\tparams := req.URL.Query()\n\tparams.Set(\"db\", database)\n\tparams.Set(\"rp\", retentionPolicy)\n\tparams.Set(\"precision\", precision)\n\tparams.Set(\"consistency\", writeConsistency)\n\treq.URL.RawQuery = params.Encode()\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tvar response Response\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK {\n\t\terr := fmt.Errorf(string(body))\n\t\tresponse.Err = err\n\t\treturn &response, err\n\t}\n\n\treturn nil, nil\n}\n\n// Ping will check to see if the server is up\n// Ping returns how long the request took, the version of the server it connected to, and an error if one occurred.\nfunc (c *Client) Ping() (time.Duration, string, error) {\n\tnow := time.Now()\n\tu := c.url\n\tu.Path = \"ping\"\n\n\treq, err := http.NewRequest(\"GET\", u.String(), nil)\n\tif err != nil {\n\t\treturn 0, \"\", err\n\t}\n\treq.Header.Set(\"User-Agent\", c.userAgent)\n\tif c.username != \"\" {\n\t\treq.SetBasicAuth(c.username, c.password)\n\t}\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn 0, \"\", err\n\t}\n\tdefer resp.Body.Close()\n\n\tversion := resp.Header.Get(\"X-Influxdb-Version\")\n\treturn time.Since(now), version, nil\n}\n\n// Structs\n\n// Message represents a user message.\ntype Message struct {\n\tLevel string `json:\"level,omitempty\"`\n\tText  string `json:\"text,omitempty\"`\n}\n\n// Result represents a resultset returned from a single statement.\ntype Result struct {\n\tSeries   []models.Row\n\tMessages []*Message\n\tErr      error\n}\n\n// MarshalJSON encodes the result into JSON.\nfunc (r *Result) MarshalJSON() ([]byte, error) {\n\t// Define a struct that outputs \"error\" as a string.\n\tvar o struct {\n\t\tSeries   []models.Row `json:\"series,omitempty\"`\n\t\tMessages []*Message   `json:\"messages,omitempty\"`\n\t\tErr      string       `json:\"error,omitempty\"`\n\t}\n\n\t// Copy fields to output struct.\n\to.Series = r.Series\n\to.Messages = r.Messages\n\tif r.Err != nil {\n\t\to.Err = r.Err.Error()\n\t}\n\n\treturn json.Marshal(&o)\n}\n\n// UnmarshalJSON decodes the data into the Result struct\nfunc (r *Result) UnmarshalJSON(b []byte) error {\n\tvar o struct {\n\t\tSeries   []models.Row `json:\"series,omitempty\"`\n\t\tMessages []*Message   `json:\"messages,omitempty\"`\n\t\tErr      string       `json:\"error,omitempty\"`\n\t}\n\n\tdec := json.NewDecoder(bytes.NewBuffer(b))\n\tdec.UseNumber()\n\terr := dec.Decode(&o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tr.Series = o.Series\n\tr.Messages = o.Messages\n\tif o.Err != \"\" {\n\t\tr.Err = errors.New(o.Err)\n\t}\n\treturn nil\n}\n\n// Response represents a list of statement results.\ntype Response struct {\n\tResults []Result\n\tErr     error\n}\n\n// MarshalJSON encodes the response into JSON.\nfunc (r *Response) MarshalJSON() ([]byte, error) {\n\t// Define a struct that outputs \"error\" as a string.\n\tvar o struct {\n\t\tResults []Result `json:\"results,omitempty\"`\n\t\tErr     string   `json:\"error,omitempty\"`\n\t}\n\n\t// Copy fields to output struct.\n\to.Results = r.Results\n\tif r.Err != nil {\n\t\to.Err = r.Err.Error()\n\t}\n\n\treturn json.Marshal(&o)\n}\n\n// UnmarshalJSON decodes the data into the Response struct\nfunc (r *Response) UnmarshalJSON(b []byte) error {\n\tvar o struct {\n\t\tResults []Result `json:\"results,omitempty\"`\n\t\tErr     string   `json:\"error,omitempty\"`\n\t}\n\n\tdec := json.NewDecoder(bytes.NewBuffer(b))\n\tdec.UseNumber()\n\terr := dec.Decode(&o)\n\tif err != nil {\n\t\treturn err\n\t}\n\tr.Results = o.Results\n\tif o.Err != \"\" {\n\t\tr.Err = errors.New(o.Err)\n\t}\n\treturn nil\n}\n\n// Error returns the first error from any statement.\n// Returns nil if no errors occurred on any statements.\nfunc (r *Response) Error() error {\n\tif r.Err != nil {\n\t\treturn r.Err\n\t}\n\tfor _, result := range r.Results {\n\t\tif result.Err != nil {\n\t\t\treturn result.Err\n\t\t}\n\t}\n\treturn nil\n}\n\n// duplexReader reads responses and writes it to another writer while\n// satisfying the reader interface.\ntype duplexReader struct {\n\tr io.Reader\n\tw io.Writer\n}\n\nfunc (r *duplexReader) Read(p []byte) (n int, err error) {\n\tn, err = r.r.Read(p)\n\tif err == nil {\n\t\tr.w.Write(p[:n])\n\t}\n\treturn n, err\n}\n\n// ChunkedResponse represents a response from the server that\n// uses chunking to stream the output.\ntype ChunkedResponse struct {\n\tdec    *json.Decoder\n\tduplex *duplexReader\n\tbuf    bytes.Buffer\n}\n\n// NewChunkedResponse reads a stream and produces responses from the stream.\nfunc NewChunkedResponse(r io.Reader) *ChunkedResponse {\n\tresp := &ChunkedResponse{}\n\tresp.duplex = &duplexReader{r: r, w: &resp.buf}\n\tresp.dec = json.NewDecoder(resp.duplex)\n\tresp.dec.UseNumber()\n\treturn resp\n}\n\n// NextResponse reads the next line of the stream and returns a response.\nfunc (r *ChunkedResponse) NextResponse() (*Response, error) {\n\tvar response Response\n\tif err := r.dec.Decode(&response); err != nil {\n\t\tif err == io.EOF {\n\t\t\treturn nil, nil\n\t\t}\n\t\t// A decoding error happened. This probably means the server crashed\n\t\t// and sent a last-ditch error message to us. Ensure we have read the\n\t\t// entirety of the connection to get any remaining error text.\n\t\tio.Copy(ioutil.Discard, r.duplex)\n\t\treturn nil, errors.New(strings.TrimSpace(r.buf.String()))\n\t}\n\tr.buf.Reset()\n\treturn &response, nil\n}\n\n// Point defines the fields that will be written to the database\n// Measurement, Time, and Fields are required\n// Precision can be specified if the time is in epoch format (integer).\n// Valid values for Precision are n, u, ms, s, m, and h\ntype Point struct {\n\tMeasurement string\n\tTags        map[string]string\n\tTime        time.Time\n\tFields      map[string]interface{}\n\tPrecision   string\n\tRaw         string\n}\n\n// MarshalJSON will format the time in RFC3339Nano\n// Precision is also ignored as it is only used for writing, not reading\n// Or another way to say it is we always send back in nanosecond precision\nfunc (p *Point) MarshalJSON() ([]byte, error) {\n\tpoint := struct {\n\t\tMeasurement string                 `json:\"measurement,omitempty\"`\n\t\tTags        map[string]string      `json:\"tags,omitempty\"`\n\t\tTime        string                 `json:\"time,omitempty\"`\n\t\tFields      map[string]interface{} `json:\"fields,omitempty\"`\n\t\tPrecision   string                 `json:\"precision,omitempty\"`\n\t}{\n\t\tMeasurement: p.Measurement,\n\t\tTags:        p.Tags,\n\t\tFields:      p.Fields,\n\t\tPrecision:   p.Precision,\n\t}\n\t// Let it omit empty if it's really zero\n\tif !p.Time.IsZero() {\n\t\tpoint.Time = p.Time.UTC().Format(time.RFC3339Nano)\n\t}\n\treturn json.Marshal(&point)\n}\n\n// MarshalString renders string representation of a Point with specified\n// precision. The default precision is nanoseconds.\nfunc (p *Point) MarshalString() string {\n\tpt, err := models.NewPoint(p.Measurement, models.NewTags(p.Tags), p.Fields, p.Time)\n\tif err != nil {\n\t\treturn \"# ERROR: \" + err.Error() + \" \" + p.Measurement\n\t}\n\tif p.Precision == \"\" || p.Precision == \"ns\" || p.Precision == \"n\" {\n\t\treturn pt.String()\n\t}\n\treturn pt.PrecisionString(p.Precision)\n}\n\n// UnmarshalJSON decodes the data into the Point struct\nfunc (p *Point) UnmarshalJSON(b []byte) error {\n\tvar normal struct {\n\t\tMeasurement string                 `json:\"measurement\"`\n\t\tTags        map[string]string      `json:\"tags\"`\n\t\tTime        time.Time              `json:\"time\"`\n\t\tPrecision   string                 `json:\"precision\"`\n\t\tFields      map[string]interface{} `json:\"fields\"`\n\t}\n\tvar epoch struct {\n\t\tMeasurement string                 `json:\"measurement\"`\n\t\tTags        map[string]string      `json:\"tags\"`\n\t\tTime        *int64                 `json:\"time\"`\n\t\tPrecision   string                 `json:\"precision\"`\n\t\tFields      map[string]interface{} `json:\"fields\"`\n\t}\n\n\tif err := func() error {\n\t\tvar err error\n\t\tdec := json.NewDecoder(bytes.NewBuffer(b))\n\t\tdec.UseNumber()\n\t\tif err = dec.Decode(&epoch); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Convert from epoch to time.Time, but only if Time\n\t\t// was actually set.\n\t\tvar ts time.Time\n\t\tif epoch.Time != nil {\n\t\t\tts, err = EpochToTime(*epoch.Time, epoch.Precision)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tp.Measurement = epoch.Measurement\n\t\tp.Tags = epoch.Tags\n\t\tp.Time = ts\n\t\tp.Precision = epoch.Precision\n\t\tp.Fields = normalizeFields(epoch.Fields)\n\t\treturn nil\n\t}(); err == nil {\n\t\treturn nil\n\t}\n\n\tdec := json.NewDecoder(bytes.NewBuffer(b))\n\tdec.UseNumber()\n\tif err := dec.Decode(&normal); err != nil {\n\t\treturn err\n\t}\n\tnormal.Time = SetPrecision(normal.Time, normal.Precision)\n\tp.Measurement = normal.Measurement\n\tp.Tags = normal.Tags\n\tp.Time = normal.Time\n\tp.Precision = normal.Precision\n\tp.Fields = normalizeFields(normal.Fields)\n\n\treturn nil\n}\n\n// Remove any notion of json.Number\nfunc normalizeFields(fields map[string]interface{}) map[string]interface{} {\n\tnewFields := map[string]interface{}{}\n\n\tfor k, v := range fields {\n\t\tswitch v := v.(type) {\n\t\tcase json.Number:\n\t\t\tjv, e := v.Float64()\n\t\t\tif e != nil {\n\t\t\t\tpanic(fmt.Sprintf(\"unable to convert json.Number to float64: %s\", e))\n\t\t\t}\n\t\t\tnewFields[k] = jv\n\t\tdefault:\n\t\t\tnewFields[k] = v\n\t\t}\n\t}\n\treturn newFields\n}\n\n// BatchPoints is used to send batched data in a single write.\n// Database and Points are required\n// If no retention policy is specified, it will use the databases default retention policy.\n// If tags are specified, they will be \"merged\" with all points. If a point already has that tag, it will be ignored.\n// If time is specified, it will be applied to any point with an empty time.\n// Precision can be specified if the time is in epoch format (integer).\n// Valid values for Precision are n, u, ms, s, m, and h\ntype BatchPoints struct {\n\tPoints           []Point           `json:\"points,omitempty\"`\n\tDatabase         string            `json:\"database,omitempty\"`\n\tRetentionPolicy  string            `json:\"retentionPolicy,omitempty\"`\n\tTags             map[string]string `json:\"tags,omitempty\"`\n\tTime             time.Time         `json:\"time,omitempty\"`\n\tPrecision        string            `json:\"precision,omitempty\"`\n\tWriteConsistency string            `json:\"-\"`\n}\n\n// UnmarshalJSON decodes the data into the BatchPoints struct\nfunc (bp *BatchPoints) UnmarshalJSON(b []byte) error {\n\tvar normal struct {\n\t\tPoints          []Point           `json:\"points\"`\n\t\tDatabase        string            `json:\"database\"`\n\t\tRetentionPolicy string            `json:\"retentionPolicy\"`\n\t\tTags            map[string]string `json:\"tags\"`\n\t\tTime            time.Time         `json:\"time\"`\n\t\tPrecision       string            `json:\"precision\"`\n\t}\n\tvar epoch struct {\n\t\tPoints          []Point           `json:\"points\"`\n\t\tDatabase        string            `json:\"database\"`\n\t\tRetentionPolicy string            `json:\"retentionPolicy\"`\n\t\tTags            map[string]string `json:\"tags\"`\n\t\tTime            *int64            `json:\"time\"`\n\t\tPrecision       string            `json:\"precision\"`\n\t}\n\n\tif err := func() error {\n\t\tvar err error\n\t\tif err = json.Unmarshal(b, &epoch); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// Convert from epoch to time.Time\n\t\tvar ts time.Time\n\t\tif epoch.Time != nil {\n\t\t\tts, err = EpochToTime(*epoch.Time, epoch.Precision)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tbp.Points = epoch.Points\n\t\tbp.Database = epoch.Database\n\t\tbp.RetentionPolicy = epoch.RetentionPolicy\n\t\tbp.Tags = epoch.Tags\n\t\tbp.Time = ts\n\t\tbp.Precision = epoch.Precision\n\t\treturn nil\n\t}(); err == nil {\n\t\treturn nil\n\t}\n\n\tif err := json.Unmarshal(b, &normal); err != nil {\n\t\treturn err\n\t}\n\tnormal.Time = SetPrecision(normal.Time, normal.Precision)\n\tbp.Points = normal.Points\n\tbp.Database = normal.Database\n\tbp.RetentionPolicy = normal.RetentionPolicy\n\tbp.Tags = normal.Tags\n\tbp.Time = normal.Time\n\tbp.Precision = normal.Precision\n\n\treturn nil\n}\n\n// utility functions\n\n// Addr provides the current url as a string of the server the client is connected to.\nfunc (c *Client) Addr() string {\n\tif c.unixSocket != \"\" {\n\t\treturn c.unixSocket\n\t}\n\treturn c.url.String()\n}\n\n// checkPointTypes ensures no unsupported types are submitted to influxdb, returning error if they are found.\nfunc checkPointTypes(p Point) error {\n\tfor _, v := range p.Fields {\n\t\tswitch v.(type) {\n\t\tcase int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, bool, string, nil:\n\t\t\treturn nil\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"unsupported point type: %T\", v)\n\t\t}\n\t}\n\treturn nil\n}\n\n// helper functions\n\n// EpochToTime takes a unix epoch time and uses precision to return back a time.Time\nfunc EpochToTime(epoch int64, precision string) (time.Time, error) {\n\tif precision == \"\" {\n\t\tprecision = \"s\"\n\t}\n\tvar t time.Time\n\tswitch precision {\n\tcase \"h\":\n\t\tt = time.Unix(0, epoch*int64(time.Hour))\n\tcase \"m\":\n\t\tt = time.Unix(0, epoch*int64(time.Minute))\n\tcase \"s\":\n\t\tt = time.Unix(0, epoch*int64(time.Second))\n\tcase \"ms\":\n\t\tt = time.Unix(0, epoch*int64(time.Millisecond))\n\tcase \"u\":\n\t\tt = time.Unix(0, epoch*int64(time.Microsecond))\n\tcase \"n\":\n\t\tt = time.Unix(0, epoch)\n\tdefault:\n\t\treturn time.Time{}, fmt.Errorf(\"Unknown precision %q\", precision)\n\t}\n\treturn t, nil\n}\n\n// SetPrecision will round a time to the specified precision\nfunc SetPrecision(t time.Time, precision string) time.Time {\n\tswitch precision {\n\tcase \"n\":\n\tcase \"u\":\n\t\treturn t.Round(time.Microsecond)\n\tcase \"ms\":\n\t\treturn t.Round(time.Millisecond)\n\tcase \"s\":\n\t\treturn t.Round(time.Second)\n\tcase \"m\":\n\t\treturn t.Round(time.Minute)\n\tcase \"h\":\n\t\treturn t.Round(time.Hour)\n\t}\n\treturn t\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/client/v2/client.go",
    "content": "// Package client (v2) is the current official Go client for InfluxDB.\npackage client // import \"github.com/influxdata/influxdb/client/v2\"\n\nimport (\n\t\"bytes\"\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"mime\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/influxdata/influxdb/models\"\n)\n\n// HTTPConfig is the config data needed to create an HTTP Client.\ntype HTTPConfig struct {\n\t// Addr should be of the form \"http://host:port\"\n\t// or \"http://[ipv6-host%zone]:port\".\n\tAddr string\n\n\t// Username is the influxdb username, optional.\n\tUsername string\n\n\t// Password is the influxdb password, optional.\n\tPassword string\n\n\t// UserAgent is the http User Agent, defaults to \"InfluxDBClient\".\n\tUserAgent string\n\n\t// Timeout for influxdb writes, defaults to no timeout.\n\tTimeout time.Duration\n\n\t// InsecureSkipVerify gets passed to the http client, if true, it will\n\t// skip https certificate verification. Defaults to false.\n\tInsecureSkipVerify bool\n\n\t// TLSConfig allows the user to set their own TLS config for the HTTP\n\t// Client. If set, this option overrides InsecureSkipVerify.\n\tTLSConfig *tls.Config\n}\n\n// BatchPointsConfig is the config data needed to create an instance of the BatchPoints struct.\ntype BatchPointsConfig struct {\n\t// Precision is the write precision of the points, defaults to \"ns\".\n\tPrecision string\n\n\t// Database is the database to write points to.\n\tDatabase string\n\n\t// RetentionPolicy is the retention policy of the points.\n\tRetentionPolicy string\n\n\t// Write consistency is the number of servers required to confirm write.\n\tWriteConsistency string\n}\n\n// Client is a client interface for writing & querying the database.\ntype Client interface {\n\t// Ping checks that status of cluster, and will always return 0 time and no\n\t// error for UDP clients.\n\tPing(timeout time.Duration) (time.Duration, string, error)\n\n\t// Write takes a BatchPoints object and writes all Points to InfluxDB.\n\tWrite(bp BatchPoints) error\n\n\t// Query makes an InfluxDB Query on the database. This will fail if using\n\t// the UDP client.\n\tQuery(q Query) (*Response, error)\n\n\t// Close releases any resources a Client may be using.\n\tClose() error\n}\n\n// NewHTTPClient returns a new Client from the provided config.\n// Client is safe for concurrent use by multiple goroutines.\nfunc NewHTTPClient(conf HTTPConfig) (Client, error) {\n\tif conf.UserAgent == \"\" {\n\t\tconf.UserAgent = \"InfluxDBClient\"\n\t}\n\n\tu, err := url.Parse(conf.Addr)\n\tif err != nil {\n\t\treturn nil, err\n\t} else if u.Scheme != \"http\" && u.Scheme != \"https\" {\n\t\tm := fmt.Sprintf(\"Unsupported protocol scheme: %s, your address\"+\n\t\t\t\" must start with http:// or https://\", u.Scheme)\n\t\treturn nil, errors.New(m)\n\t}\n\n\ttr := &http.Transport{\n\t\tTLSClientConfig: &tls.Config{\n\t\t\tInsecureSkipVerify: conf.InsecureSkipVerify,\n\t\t},\n\t}\n\tif conf.TLSConfig != nil {\n\t\ttr.TLSClientConfig = conf.TLSConfig\n\t}\n\treturn &client{\n\t\turl:       *u,\n\t\tusername:  conf.Username,\n\t\tpassword:  conf.Password,\n\t\tuseragent: conf.UserAgent,\n\t\thttpClient: &http.Client{\n\t\t\tTimeout:   conf.Timeout,\n\t\t\tTransport: tr,\n\t\t},\n\t\ttransport: tr,\n\t}, nil\n}\n\n// Ping will check to see if the server is up with an optional timeout on waiting for leader.\n// Ping returns how long the request took, the version of the server it connected to, and an error if one occurred.\nfunc (c *client) Ping(timeout time.Duration) (time.Duration, string, error) {\n\tnow := time.Now()\n\tu := c.url\n\tu.Path = \"ping\"\n\n\treq, err := http.NewRequest(\"GET\", u.String(), nil)\n\tif err != nil {\n\t\treturn 0, \"\", err\n\t}\n\n\treq.Header.Set(\"User-Agent\", c.useragent)\n\n\tif c.username != \"\" {\n\t\treq.SetBasicAuth(c.username, c.password)\n\t}\n\n\tif timeout > 0 {\n\t\tparams := req.URL.Query()\n\t\tparams.Set(\"wait_for_leader\", fmt.Sprintf(\"%.0fs\", timeout.Seconds()))\n\t\treq.URL.RawQuery = params.Encode()\n\t}\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn 0, \"\", err\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn 0, \"\", err\n\t}\n\n\tif resp.StatusCode != http.StatusNoContent {\n\t\tvar err = fmt.Errorf(string(body))\n\t\treturn 0, \"\", err\n\t}\n\n\tversion := resp.Header.Get(\"X-Influxdb-Version\")\n\treturn time.Since(now), version, nil\n}\n\n// Close releases the client's resources.\nfunc (c *client) Close() error {\n\tc.transport.CloseIdleConnections()\n\treturn nil\n}\n\n// client is safe for concurrent use as the fields are all read-only\n// once the client is instantiated.\ntype client struct {\n\t// N.B - if url.UserInfo is accessed in future modifications to the\n\t// methods on client, you will need to syncronise access to url.\n\turl        url.URL\n\tusername   string\n\tpassword   string\n\tuseragent  string\n\thttpClient *http.Client\n\ttransport  *http.Transport\n}\n\n// BatchPoints is an interface into a batched grouping of points to write into\n// InfluxDB together. BatchPoints is NOT thread-safe, you must create a separate\n// batch for each goroutine.\ntype BatchPoints interface {\n\t// AddPoint adds the given point to the Batch of points.\n\tAddPoint(p *Point)\n\t// AddPoints adds the given points to the Batch of points.\n\tAddPoints(ps []*Point)\n\t// Points lists the points in the Batch.\n\tPoints() []*Point\n\n\t// Precision returns the currently set precision of this Batch.\n\tPrecision() string\n\t// SetPrecision sets the precision of this batch.\n\tSetPrecision(s string) error\n\n\t// Database returns the currently set database of this Batch.\n\tDatabase() string\n\t// SetDatabase sets the database of this Batch.\n\tSetDatabase(s string)\n\n\t// WriteConsistency returns the currently set write consistency of this Batch.\n\tWriteConsistency() string\n\t// SetWriteConsistency sets the write consistency of this Batch.\n\tSetWriteConsistency(s string)\n\n\t// RetentionPolicy returns the currently set retention policy of this Batch.\n\tRetentionPolicy() string\n\t// SetRetentionPolicy sets the retention policy of this Batch.\n\tSetRetentionPolicy(s string)\n}\n\n// NewBatchPoints returns a BatchPoints interface based on the given config.\nfunc NewBatchPoints(conf BatchPointsConfig) (BatchPoints, error) {\n\tif conf.Precision == \"\" {\n\t\tconf.Precision = \"ns\"\n\t}\n\tif _, err := time.ParseDuration(\"1\" + conf.Precision); err != nil {\n\t\treturn nil, err\n\t}\n\tbp := &batchpoints{\n\t\tdatabase:         conf.Database,\n\t\tprecision:        conf.Precision,\n\t\tretentionPolicy:  conf.RetentionPolicy,\n\t\twriteConsistency: conf.WriteConsistency,\n\t}\n\treturn bp, nil\n}\n\ntype batchpoints struct {\n\tpoints           []*Point\n\tdatabase         string\n\tprecision        string\n\tretentionPolicy  string\n\twriteConsistency string\n}\n\nfunc (bp *batchpoints) AddPoint(p *Point) {\n\tbp.points = append(bp.points, p)\n}\n\nfunc (bp *batchpoints) AddPoints(ps []*Point) {\n\tbp.points = append(bp.points, ps...)\n}\n\nfunc (bp *batchpoints) Points() []*Point {\n\treturn bp.points\n}\n\nfunc (bp *batchpoints) Precision() string {\n\treturn bp.precision\n}\n\nfunc (bp *batchpoints) Database() string {\n\treturn bp.database\n}\n\nfunc (bp *batchpoints) WriteConsistency() string {\n\treturn bp.writeConsistency\n}\n\nfunc (bp *batchpoints) RetentionPolicy() string {\n\treturn bp.retentionPolicy\n}\n\nfunc (bp *batchpoints) SetPrecision(p string) error {\n\tif _, err := time.ParseDuration(\"1\" + p); err != nil {\n\t\treturn err\n\t}\n\tbp.precision = p\n\treturn nil\n}\n\nfunc (bp *batchpoints) SetDatabase(db string) {\n\tbp.database = db\n}\n\nfunc (bp *batchpoints) SetWriteConsistency(wc string) {\n\tbp.writeConsistency = wc\n}\n\nfunc (bp *batchpoints) SetRetentionPolicy(rp string) {\n\tbp.retentionPolicy = rp\n}\n\n// Point represents a single data point.\ntype Point struct {\n\tpt models.Point\n}\n\n// NewPoint returns a point with the given timestamp. If a timestamp is not\n// given, then data is sent to the database without a timestamp, in which case\n// the server will assign local time upon reception. NOTE: it is recommended to\n// send data with a timestamp.\nfunc NewPoint(\n\tname string,\n\ttags map[string]string,\n\tfields map[string]interface{},\n\tt ...time.Time,\n) (*Point, error) {\n\tvar T time.Time\n\tif len(t) > 0 {\n\t\tT = t[0]\n\t}\n\n\tpt, err := models.NewPoint(name, models.NewTags(tags), fields, T)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &Point{\n\t\tpt: pt,\n\t}, nil\n}\n\n// String returns a line-protocol string of the Point.\nfunc (p *Point) String() string {\n\treturn p.pt.String()\n}\n\n// PrecisionString returns a line-protocol string of the Point,\n// with the timestamp formatted for the given precision.\nfunc (p *Point) PrecisionString(precison string) string {\n\treturn p.pt.PrecisionString(precison)\n}\n\n// Name returns the measurement name of the point.\nfunc (p *Point) Name() string {\n\treturn string(p.pt.Name())\n}\n\n// Tags returns the tags associated with the point.\nfunc (p *Point) Tags() map[string]string {\n\treturn p.pt.Tags().Map()\n}\n\n// Time return the timestamp for the point.\nfunc (p *Point) Time() time.Time {\n\treturn p.pt.Time()\n}\n\n// UnixNano returns timestamp of the point in nanoseconds since Unix epoch.\nfunc (p *Point) UnixNano() int64 {\n\treturn p.pt.UnixNano()\n}\n\n// Fields returns the fields for the point.\nfunc (p *Point) Fields() (map[string]interface{}, error) {\n\treturn p.pt.Fields()\n}\n\n// NewPointFrom returns a point from the provided models.Point.\nfunc NewPointFrom(pt models.Point) *Point {\n\treturn &Point{pt: pt}\n}\n\nfunc (c *client) Write(bp BatchPoints) error {\n\tvar b bytes.Buffer\n\n\tfor _, p := range bp.Points() {\n\t\tif _, err := b.WriteString(p.pt.PrecisionString(bp.Precision())); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := b.WriteByte('\\n'); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tu := c.url\n\tu.Path = \"write\"\n\treq, err := http.NewRequest(\"POST\", u.String(), &b)\n\tif err != nil {\n\t\treturn err\n\t}\n\treq.Header.Set(\"Content-Type\", \"\")\n\treq.Header.Set(\"User-Agent\", c.useragent)\n\tif c.username != \"\" {\n\t\treq.SetBasicAuth(c.username, c.password)\n\t}\n\n\tparams := req.URL.Query()\n\tparams.Set(\"db\", bp.Database())\n\tparams.Set(\"rp\", bp.RetentionPolicy())\n\tparams.Set(\"precision\", bp.Precision())\n\tparams.Set(\"consistency\", bp.WriteConsistency())\n\treq.URL.RawQuery = params.Encode()\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK {\n\t\tvar err = fmt.Errorf(string(body))\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Query defines a query to send to the server.\ntype Query struct {\n\tCommand    string\n\tDatabase   string\n\tPrecision  string\n\tChunked    bool\n\tChunkSize  int\n\tParameters map[string]interface{}\n}\n\n// NewQuery returns a query object.\n// The database and precision arguments can be empty strings if they are not needed for the query.\nfunc NewQuery(command, database, precision string) Query {\n\treturn Query{\n\t\tCommand:    command,\n\t\tDatabase:   database,\n\t\tPrecision:  precision,\n\t\tParameters: make(map[string]interface{}),\n\t}\n}\n\n// NewQueryWithParameters returns a query object.\n// The database and precision arguments can be empty strings if they are not needed for the query.\n// parameters is a map of the parameter names used in the command to their values.\nfunc NewQueryWithParameters(command, database, precision string, parameters map[string]interface{}) Query {\n\treturn Query{\n\t\tCommand:    command,\n\t\tDatabase:   database,\n\t\tPrecision:  precision,\n\t\tParameters: parameters,\n\t}\n}\n\n// Response represents a list of statement results.\ntype Response struct {\n\tResults []Result\n\tErr     string `json:\"error,omitempty\"`\n}\n\n// Error returns the first error from any statement.\n// It returns nil if no errors occurred on any statements.\nfunc (r *Response) Error() error {\n\tif r.Err != \"\" {\n\t\treturn fmt.Errorf(r.Err)\n\t}\n\tfor _, result := range r.Results {\n\t\tif result.Err != \"\" {\n\t\t\treturn fmt.Errorf(result.Err)\n\t\t}\n\t}\n\treturn nil\n}\n\n// Message represents a user message.\ntype Message struct {\n\tLevel string\n\tText  string\n}\n\n// Result represents a resultset returned from a single statement.\ntype Result struct {\n\tSeries   []models.Row\n\tMessages []*Message\n\tErr      string `json:\"error,omitempty\"`\n}\n\n// Query sends a command to the server and returns the Response.\nfunc (c *client) Query(q Query) (*Response, error) {\n\tu := c.url\n\tu.Path = \"query\"\n\n\tjsonParameters, err := json.Marshal(q.Parameters)\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treq, err := http.NewRequest(\"POST\", u.String(), nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treq.Header.Set(\"Content-Type\", \"\")\n\treq.Header.Set(\"User-Agent\", c.useragent)\n\n\tif c.username != \"\" {\n\t\treq.SetBasicAuth(c.username, c.password)\n\t}\n\n\tparams := req.URL.Query()\n\tparams.Set(\"q\", q.Command)\n\tparams.Set(\"db\", q.Database)\n\tparams.Set(\"params\", string(jsonParameters))\n\tif q.Chunked {\n\t\tparams.Set(\"chunked\", \"true\")\n\t\tif q.ChunkSize > 0 {\n\t\t\tparams.Set(\"chunk_size\", strconv.Itoa(q.ChunkSize))\n\t\t}\n\t}\n\n\tif q.Precision != \"\" {\n\t\tparams.Set(\"epoch\", q.Precision)\n\t}\n\treq.URL.RawQuery = params.Encode()\n\n\tresp, err := c.httpClient.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\t// If we lack a X-Influxdb-Version header, then we didn't get a response from influxdb\n\t// but instead some other service. If the error code is also a 500+ code, then some\n\t// downstream loadbalancer/proxy/etc had an issue and we should report that.\n\tif resp.Header.Get(\"X-Influxdb-Version\") == \"\" && resp.StatusCode >= http.StatusInternalServerError {\n\t\tbody, err := ioutil.ReadAll(resp.Body)\n\t\tif err != nil || len(body) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"received status code %d from downstream server\", resp.StatusCode)\n\t\t}\n\n\t\treturn nil, fmt.Errorf(\"received status code %d from downstream server, with response body: %q\", resp.StatusCode, body)\n\t}\n\n\t// If we get an unexpected content type, then it is also not from influx direct and therefore\n\t// we want to know what we received and what status code was returned for debugging purposes.\n\tif cType, _, _ := mime.ParseMediaType(resp.Header.Get(\"Content-Type\")); cType != \"application/json\" {\n\t\t// Read up to 1kb of the body to help identify downstream errors and limit the impact of things\n\t\t// like downstream serving a large file\n\t\tbody, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1024))\n\t\tif err != nil || len(body) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"expected json response, got empty body, with status: %v\", resp.StatusCode)\n\t\t}\n\n\t\treturn nil, fmt.Errorf(\"expected json response, got %q, with status: %v and response body: %q\", cType, resp.StatusCode, body)\n\t}\n\n\tvar response Response\n\tif q.Chunked {\n\t\tcr := NewChunkedResponse(resp.Body)\n\t\tfor {\n\t\t\tr, err := cr.NextResponse()\n\t\t\tif err != nil {\n\t\t\t\t// If we got an error while decoding the response, send that back.\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif r == nil {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tresponse.Results = append(response.Results, r.Results...)\n\t\t\tif r.Err != \"\" {\n\t\t\t\tresponse.Err = r.Err\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t} else {\n\t\tdec := json.NewDecoder(resp.Body)\n\t\tdec.UseNumber()\n\t\tdecErr := dec.Decode(&response)\n\n\t\t// ignore this error if we got an invalid status code\n\t\tif decErr != nil && decErr.Error() == \"EOF\" && resp.StatusCode != http.StatusOK {\n\t\t\tdecErr = nil\n\t\t}\n\t\t// If we got a valid decode error, send that back\n\t\tif decErr != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to decode json: received status code %d err: %s\", resp.StatusCode, decErr)\n\t\t}\n\t}\n\n\t// If we don't have an error in our json response, and didn't get statusOK\n\t// then send back an error\n\tif resp.StatusCode != http.StatusOK && response.Error() == nil {\n\t\treturn &response, fmt.Errorf(\"received status code %d from server\", resp.StatusCode)\n\t}\n\treturn &response, nil\n}\n\n// duplexReader reads responses and writes it to another writer while\n// satisfying the reader interface.\ntype duplexReader struct {\n\tr io.Reader\n\tw io.Writer\n}\n\nfunc (r *duplexReader) Read(p []byte) (n int, err error) {\n\tn, err = r.r.Read(p)\n\tif err == nil {\n\t\tr.w.Write(p[:n])\n\t}\n\treturn n, err\n}\n\n// ChunkedResponse represents a response from the server that\n// uses chunking to stream the output.\ntype ChunkedResponse struct {\n\tdec    *json.Decoder\n\tduplex *duplexReader\n\tbuf    bytes.Buffer\n}\n\n// NewChunkedResponse reads a stream and produces responses from the stream.\nfunc NewChunkedResponse(r io.Reader) *ChunkedResponse {\n\tresp := &ChunkedResponse{}\n\tresp.duplex = &duplexReader{r: r, w: &resp.buf}\n\tresp.dec = json.NewDecoder(resp.duplex)\n\tresp.dec.UseNumber()\n\treturn resp\n}\n\n// NextResponse reads the next line of the stream and returns a response.\nfunc (r *ChunkedResponse) NextResponse() (*Response, error) {\n\tvar response Response\n\n\tif err := r.dec.Decode(&response); err != nil {\n\t\tif err == io.EOF {\n\t\t\treturn nil, nil\n\t\t}\n\t\t// A decoding error happened. This probably means the server crashed\n\t\t// and sent a last-ditch error message to us. Ensure we have read the\n\t\t// entirety of the connection to get any remaining error text.\n\t\tio.Copy(ioutil.Discard, r.duplex)\n\t\treturn nil, errors.New(strings.TrimSpace(r.buf.String()))\n\t}\n\n\tr.buf.Reset()\n\treturn &response, nil\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/client/v2/udp.go",
    "content": "package client\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"time\"\n)\n\nconst (\n\t// UDPPayloadSize is a reasonable default payload size for UDP packets that\n\t// could be travelling over the internet.\n\tUDPPayloadSize = 512\n)\n\n// UDPConfig is the config data needed to create a UDP Client.\ntype UDPConfig struct {\n\t// Addr should be of the form \"host:port\"\n\t// or \"[ipv6-host%zone]:port\".\n\tAddr string\n\n\t// PayloadSize is the maximum size of a UDP client message, optional\n\t// Tune this based on your network. Defaults to UDPPayloadSize.\n\tPayloadSize int\n}\n\n// NewUDPClient returns a client interface for writing to an InfluxDB UDP\n// service from the given config.\nfunc NewUDPClient(conf UDPConfig) (Client, error) {\n\tvar udpAddr *net.UDPAddr\n\tudpAddr, err := net.ResolveUDPAddr(\"udp\", conf.Addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tconn, err := net.DialUDP(\"udp\", nil, udpAddr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpayloadSize := conf.PayloadSize\n\tif payloadSize == 0 {\n\t\tpayloadSize = UDPPayloadSize\n\t}\n\n\treturn &udpclient{\n\t\tconn:        conn,\n\t\tpayloadSize: payloadSize,\n\t}, nil\n}\n\n// Close releases the udpclient's resources.\nfunc (uc *udpclient) Close() error {\n\treturn uc.conn.Close()\n}\n\ntype udpclient struct {\n\tconn        io.WriteCloser\n\tpayloadSize int\n}\n\nfunc (uc *udpclient) Write(bp BatchPoints) error {\n\tvar b = make([]byte, 0, uc.payloadSize) // initial buffer size, it will grow as needed\n\tvar d, _ = time.ParseDuration(\"1\" + bp.Precision())\n\n\tvar delayedError error\n\n\tvar checkBuffer = func(n int) {\n\t\tif len(b) > 0 && len(b)+n > uc.payloadSize {\n\t\t\tif _, err := uc.conn.Write(b); err != nil {\n\t\t\t\tdelayedError = err\n\t\t\t}\n\t\t\tb = b[:0]\n\t\t}\n\t}\n\n\tfor _, p := range bp.Points() {\n\t\tp.pt.Round(d)\n\t\tpointSize := p.pt.StringSize() + 1 // include newline in size\n\t\t//point := p.pt.RoundedString(d) + \"\\n\"\n\n\t\tcheckBuffer(pointSize)\n\n\t\tif p.Time().IsZero() || pointSize <= uc.payloadSize {\n\t\t\tb = p.pt.AppendString(b)\n\t\t\tb = append(b, '\\n')\n\t\t\tcontinue\n\t\t}\n\n\t\tpoints := p.pt.Split(uc.payloadSize - 1) // account for newline character\n\t\tfor _, sp := range points {\n\t\t\tcheckBuffer(sp.StringSize() + 1)\n\t\t\tb = sp.AppendString(b)\n\t\t\tb = append(b, '\\n')\n\t\t}\n\t}\n\n\tif len(b) > 0 {\n\t\tif _, err := uc.conn.Write(b); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn delayedError\n}\n\nfunc (uc *udpclient) Query(q Query) (*Response, error) {\n\treturn nil, fmt.Errorf(\"Querying via UDP is not supported\")\n}\n\nfunc (uc *udpclient) Ping(timeout time.Duration) (time.Duration, string, error) {\n\treturn 0, \"\", nil\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/consistency.go",
    "content": "package models\n\nimport (\n\t\"errors\"\n\t\"strings\"\n)\n\n// ConsistencyLevel represent a required replication criteria before a write can\n// be returned as successful.\n//\n// The consistency level is handled in open-source InfluxDB but only applicable to clusters.\ntype ConsistencyLevel int\n\nconst (\n\t// ConsistencyLevelAny allows for hinted handoff, potentially no write happened yet.\n\tConsistencyLevelAny ConsistencyLevel = iota\n\n\t// ConsistencyLevelOne requires at least one data node acknowledged a write.\n\tConsistencyLevelOne\n\n\t// ConsistencyLevelQuorum requires a quorum of data nodes to acknowledge a write.\n\tConsistencyLevelQuorum\n\n\t// ConsistencyLevelAll requires all data nodes to acknowledge a write.\n\tConsistencyLevelAll\n)\n\nvar (\n\t// ErrInvalidConsistencyLevel is returned when parsing the string version\n\t// of a consistency level.\n\tErrInvalidConsistencyLevel = errors.New(\"invalid consistency level\")\n)\n\n// ParseConsistencyLevel converts a consistency level string to the corresponding ConsistencyLevel const.\nfunc ParseConsistencyLevel(level string) (ConsistencyLevel, error) {\n\tswitch strings.ToLower(level) {\n\tcase \"any\":\n\t\treturn ConsistencyLevelAny, nil\n\tcase \"one\":\n\t\treturn ConsistencyLevelOne, nil\n\tcase \"quorum\":\n\t\treturn ConsistencyLevelQuorum, nil\n\tcase \"all\":\n\t\treturn ConsistencyLevelAll, nil\n\tdefault:\n\t\treturn 0, ErrInvalidConsistencyLevel\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/inline_fnv.go",
    "content": "package models // import \"github.com/influxdata/influxdb/models\"\n\n// from stdlib hash/fnv/fnv.go\nconst (\n\tprime64  = 1099511628211\n\toffset64 = 14695981039346656037\n)\n\n// InlineFNV64a is an alloc-free port of the standard library's fnv64a.\n// See https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function.\ntype InlineFNV64a uint64\n\n// NewInlineFNV64a returns a new instance of InlineFNV64a.\nfunc NewInlineFNV64a() InlineFNV64a {\n\treturn offset64\n}\n\n// Write adds data to the running hash.\nfunc (s *InlineFNV64a) Write(data []byte) (int, error) {\n\thash := uint64(*s)\n\tfor _, c := range data {\n\t\thash ^= uint64(c)\n\t\thash *= prime64\n\t}\n\t*s = InlineFNV64a(hash)\n\treturn len(data), nil\n}\n\n// Sum64 returns the uint64 of the current resulting hash.\nfunc (s *InlineFNV64a) Sum64() uint64 {\n\treturn uint64(*s)\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/inline_strconv_parse.go",
    "content": "package models // import \"github.com/influxdata/influxdb/models\"\n\nimport (\n\t\"reflect\"\n\t\"strconv\"\n\t\"unsafe\"\n)\n\n// parseIntBytes is a zero-alloc wrapper around strconv.ParseInt.\nfunc parseIntBytes(b []byte, base int, bitSize int) (i int64, err error) {\n\ts := unsafeBytesToString(b)\n\treturn strconv.ParseInt(s, base, bitSize)\n}\n\n// parseUintBytes is a zero-alloc wrapper around strconv.ParseUint.\nfunc parseUintBytes(b []byte, base int, bitSize int) (i uint64, err error) {\n\ts := unsafeBytesToString(b)\n\treturn strconv.ParseUint(s, base, bitSize)\n}\n\n// parseFloatBytes is a zero-alloc wrapper around strconv.ParseFloat.\nfunc parseFloatBytes(b []byte, bitSize int) (float64, error) {\n\ts := unsafeBytesToString(b)\n\treturn strconv.ParseFloat(s, bitSize)\n}\n\n// parseBoolBytes is a zero-alloc wrapper around strconv.ParseBool.\nfunc parseBoolBytes(b []byte) (bool, error) {\n\treturn strconv.ParseBool(unsafeBytesToString(b))\n}\n\n// unsafeBytesToString converts a []byte to a string without a heap allocation.\n//\n// It is unsafe, and is intended to prepare input to short-lived functions\n// that require strings.\nfunc unsafeBytesToString(in []byte) string {\n\tsrc := *(*reflect.SliceHeader)(unsafe.Pointer(&in))\n\tdst := reflect.StringHeader{\n\t\tData: src.Data,\n\t\tLen:  src.Len,\n\t}\n\ts := *(*string)(unsafe.Pointer(&dst))\n\treturn s\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/points.go",
    "content": "// Package models implements basic objects used throughout the TICK stack.\npackage models // import \"github.com/influxdata/influxdb/models\"\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/influxdata/influxdb/pkg/escape\"\n)\n\nvar (\n\tmeasurementEscapeCodes = map[byte][]byte{\n\t\t',': []byte(`\\,`),\n\t\t' ': []byte(`\\ `),\n\t}\n\n\ttagEscapeCodes = map[byte][]byte{\n\t\t',': []byte(`\\,`),\n\t\t' ': []byte(`\\ `),\n\t\t'=': []byte(`\\=`),\n\t}\n\n\t// ErrPointMustHaveAField is returned when operating on a point that does not have any fields.\n\tErrPointMustHaveAField = errors.New(\"point without fields is unsupported\")\n\n\t// ErrInvalidNumber is returned when a number is expected but not provided.\n\tErrInvalidNumber = errors.New(\"invalid number\")\n\n\t// ErrInvalidPoint is returned when a point cannot be parsed correctly.\n\tErrInvalidPoint = errors.New(\"point is invalid\")\n)\n\nconst (\n\t// MaxKeyLength is the largest allowed size of the combined measurement and tag keys.\n\tMaxKeyLength = 65535\n)\n\n// enableUint64Support will enable uint64 support if set to true.\nvar enableUint64Support = false\n\n// EnableUintSupport manually enables uint support for the point parser.\n// This function will be removed in the future and only exists for unit tests during the\n// transition.\nfunc EnableUintSupport() {\n\tenableUint64Support = true\n}\n\n// Point defines the values that will be written to the database.\ntype Point interface {\n\t// Name return the measurement name for the point.\n\tName() []byte\n\n\t// SetName updates the measurement name for the point.\n\tSetName(string)\n\n\t// Tags returns the tag set for the point.\n\tTags() Tags\n\n\t// AddTag adds or replaces a tag value for a point.\n\tAddTag(key, value string)\n\n\t// SetTags replaces the tags for the point.\n\tSetTags(tags Tags)\n\n\t// HasTag returns true if the tag exists for the point.\n\tHasTag(tag []byte) bool\n\n\t// Fields returns the fields for the point.\n\tFields() (Fields, error)\n\n\t// Time return the timestamp for the point.\n\tTime() time.Time\n\n\t// SetTime updates the timestamp for the point.\n\tSetTime(t time.Time)\n\n\t// UnixNano returns the timestamp of the point as nanoseconds since Unix epoch.\n\tUnixNano() int64\n\n\t// HashID returns a non-cryptographic checksum of the point's key.\n\tHashID() uint64\n\n\t// Key returns the key (measurement joined with tags) of the point.\n\tKey() []byte\n\n\t// String returns a string representation of the point. If there is a\n\t// timestamp associated with the point then it will be specified with the default\n\t// precision of nanoseconds.\n\tString() string\n\n\t// MarshalBinary returns a binary representation of the point.\n\tMarshalBinary() ([]byte, error)\n\n\t// PrecisionString returns a string representation of the point. If there\n\t// is a timestamp associated with the point then it will be specified in the\n\t// given unit.\n\tPrecisionString(precision string) string\n\n\t// RoundedString returns a string representation of the point. If there\n\t// is a timestamp associated with the point, then it will be rounded to the\n\t// given duration.\n\tRoundedString(d time.Duration) string\n\n\t// Split will attempt to return multiple points with the same timestamp whose\n\t// string representations are no longer than size. Points with a single field or\n\t// a point without a timestamp may exceed the requested size.\n\tSplit(size int) []Point\n\n\t// Round will round the timestamp of the point to the given duration.\n\tRound(d time.Duration)\n\n\t// StringSize returns the length of the string that would be returned by String().\n\tStringSize() int\n\n\t// AppendString appends the result of String() to the provided buffer and returns\n\t// the result, potentially reducing string allocations.\n\tAppendString(buf []byte) []byte\n\n\t// FieldIterator retuns a FieldIterator that can be used to traverse the\n\t// fields of a point without constructing the in-memory map.\n\tFieldIterator() FieldIterator\n}\n\n// FieldType represents the type of a field.\ntype FieldType int\n\nconst (\n\t// Integer indicates the field's type is integer.\n\tInteger FieldType = iota\n\n\t// Float indicates the field's type is float.\n\tFloat\n\n\t// Boolean indicates the field's type is boolean.\n\tBoolean\n\n\t// String indicates the field's type is string.\n\tString\n\n\t// Empty is used to indicate that there is no field.\n\tEmpty\n\n\t// Unsigned indicates the field's type is an unsigned integer.\n\tUnsigned\n)\n\n// FieldIterator provides a low-allocation interface to iterate through a point's fields.\ntype FieldIterator interface {\n\t// Next indicates whether there any fields remaining.\n\tNext() bool\n\n\t// FieldKey returns the key of the current field.\n\tFieldKey() []byte\n\n\t// Type returns the FieldType of the current field.\n\tType() FieldType\n\n\t// StringValue returns the string value of the current field.\n\tStringValue() string\n\n\t// IntegerValue returns the integer value of the current field.\n\tIntegerValue() (int64, error)\n\n\t// UnsignedValue returns the unsigned value of the current field.\n\tUnsignedValue() (uint64, error)\n\n\t// BooleanValue returns the boolean value of the current field.\n\tBooleanValue() (bool, error)\n\n\t// FloatValue returns the float value of the current field.\n\tFloatValue() (float64, error)\n\n\t// Reset resets the iterator to its initial state.\n\tReset()\n}\n\n// Points represents a sortable list of points by timestamp.\ntype Points []Point\n\n// Len implements sort.Interface.\nfunc (a Points) Len() int { return len(a) }\n\n// Less implements sort.Interface.\nfunc (a Points) Less(i, j int) bool { return a[i].Time().Before(a[j].Time()) }\n\n// Swap implements sort.Interface.\nfunc (a Points) Swap(i, j int) { a[i], a[j] = a[j], a[i] }\n\n// point is the default implementation of Point.\ntype point struct {\n\ttime time.Time\n\n\t// text encoding of measurement and tags\n\t// key must always be stored sorted by tags, if the original line was not sorted,\n\t// we need to resort it\n\tkey []byte\n\n\t// text encoding of field data\n\tfields []byte\n\n\t// text encoding of timestamp\n\tts []byte\n\n\t// cached version of parsed fields from data\n\tcachedFields map[string]interface{}\n\n\t// cached version of parsed name from key\n\tcachedName string\n\n\t// cached version of parsed tags\n\tcachedTags Tags\n\n\tit fieldIterator\n}\n\n// type assertions\nvar (\n\t_ Point         = (*point)(nil)\n\t_ FieldIterator = (*point)(nil)\n)\n\nconst (\n\t// the number of characters for the largest possible int64 (9223372036854775807)\n\tmaxInt64Digits = 19\n\n\t// the number of characters for the smallest possible int64 (-9223372036854775808)\n\tminInt64Digits = 20\n\n\t// the number of characters for the largest possible uint64 (18446744073709551615)\n\tmaxUint64Digits = 20\n\n\t// the number of characters required for the largest float64 before a range check\n\t// would occur during parsing\n\tmaxFloat64Digits = 25\n\n\t// the number of characters required for smallest float64 before a range check occur\n\t// would occur during parsing\n\tminFloat64Digits = 27\n)\n\n// ParsePoints returns a slice of Points from a text representation of a point\n// with each point separated by newlines.  If any points fail to parse, a non-nil error\n// will be returned in addition to the points that parsed successfully.\nfunc ParsePoints(buf []byte) ([]Point, error) {\n\treturn ParsePointsWithPrecision(buf, time.Now().UTC(), \"n\")\n}\n\n// ParsePointsString is identical to ParsePoints but accepts a string.\nfunc ParsePointsString(buf string) ([]Point, error) {\n\treturn ParsePoints([]byte(buf))\n}\n\n// ParseKey returns the measurement name and tags from a point.\n//\n// NOTE: to minimize heap allocations, the returned Tags will refer to subslices of buf.\n// This can have the unintended effect preventing buf from being garbage collected.\nfunc ParseKey(buf []byte) (string, Tags) {\n\tmeas, tags := ParseKeyBytes(buf)\n\treturn string(meas), tags\n}\n\nfunc ParseKeyBytes(buf []byte) ([]byte, Tags) {\n\t// Ignore the error because scanMeasurement returns \"missing fields\" which we ignore\n\t// when just parsing a key\n\tstate, i, _ := scanMeasurement(buf, 0)\n\n\tvar tags Tags\n\tif state == tagKeyState {\n\t\ttags = parseTags(buf)\n\t\t// scanMeasurement returns the location of the comma if there are tags, strip that off\n\t\treturn buf[:i-1], tags\n\t}\n\treturn buf[:i], tags\n}\n\nfunc ParseTags(buf []byte) Tags {\n\treturn parseTags(buf)\n}\n\nfunc ParseName(buf []byte) ([]byte, error) {\n\t// Ignore the error because scanMeasurement returns \"missing fields\" which we ignore\n\t// when just parsing a key\n\tstate, i, _ := scanMeasurement(buf, 0)\n\tif state == tagKeyState {\n\t\treturn buf[:i-1], nil\n\t}\n\treturn buf[:i], nil\n}\n\n// ParsePointsWithPrecision is similar to ParsePoints, but allows the\n// caller to provide a precision for time.\n//\n// NOTE: to minimize heap allocations, the returned Points will refer to subslices of buf.\n// This can have the unintended effect preventing buf from being garbage collected.\nfunc ParsePointsWithPrecision(buf []byte, defaultTime time.Time, precision string) ([]Point, error) {\n\tpoints := make([]Point, 0, bytes.Count(buf, []byte{'\\n'})+1)\n\tvar (\n\t\tpos    int\n\t\tblock  []byte\n\t\tfailed []string\n\t)\n\tfor pos < len(buf) {\n\t\tpos, block = scanLine(buf, pos)\n\t\tpos++\n\n\t\tif len(block) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// lines which start with '#' are comments\n\t\tstart := skipWhitespace(block, 0)\n\n\t\t// If line is all whitespace, just skip it\n\t\tif start >= len(block) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif block[start] == '#' {\n\t\t\tcontinue\n\t\t}\n\n\t\t// strip the newline if one is present\n\t\tif block[len(block)-1] == '\\n' {\n\t\t\tblock = block[:len(block)-1]\n\t\t}\n\n\t\tpt, err := parsePoint(block[start:], defaultTime, precision)\n\t\tif err != nil {\n\t\t\tfailed = append(failed, fmt.Sprintf(\"unable to parse '%s': %v\", string(block[start:]), err))\n\t\t} else {\n\t\t\tpoints = append(points, pt)\n\t\t}\n\n\t}\n\tif len(failed) > 0 {\n\t\treturn points, fmt.Errorf(\"%s\", strings.Join(failed, \"\\n\"))\n\t}\n\treturn points, nil\n\n}\n\nfunc parsePoint(buf []byte, defaultTime time.Time, precision string) (Point, error) {\n\t// scan the first block which is measurement[,tag1=value1,tag2=value=2...]\n\tpos, key, err := scanKey(buf, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// measurement name is required\n\tif len(key) == 0 {\n\t\treturn nil, fmt.Errorf(\"missing measurement\")\n\t}\n\n\tif len(key) > MaxKeyLength {\n\t\treturn nil, fmt.Errorf(\"max key length exceeded: %v > %v\", len(key), MaxKeyLength)\n\t}\n\n\t// scan the second block is which is field1=value1[,field2=value2,...]\n\tpos, fields, err := scanFields(buf, pos)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// at least one field is required\n\tif len(fields) == 0 {\n\t\treturn nil, fmt.Errorf(\"missing fields\")\n\t}\n\n\tvar maxKeyErr error\n\twalkFields(fields, func(k, v []byte) bool {\n\t\tif sz := seriesKeySize(key, k); sz > MaxKeyLength {\n\t\t\tmaxKeyErr = fmt.Errorf(\"max key length exceeded: %v > %v\", sz, MaxKeyLength)\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t})\n\n\tif maxKeyErr != nil {\n\t\treturn nil, maxKeyErr\n\t}\n\n\t// scan the last block which is an optional integer timestamp\n\tpos, ts, err := scanTime(buf, pos)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpt := &point{\n\t\tkey:    key,\n\t\tfields: fields,\n\t\tts:     ts,\n\t}\n\n\tif len(ts) == 0 {\n\t\tpt.time = defaultTime\n\t\tpt.SetPrecision(precision)\n\t} else {\n\t\tts, err := parseIntBytes(ts, 10, 64)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tpt.time, err = SafeCalcTime(ts, precision)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Determine if there are illegal non-whitespace characters after the\n\t\t// timestamp block.\n\t\tfor pos < len(buf) {\n\t\t\tif buf[pos] != ' ' {\n\t\t\t\treturn nil, ErrInvalidPoint\n\t\t\t}\n\t\t\tpos++\n\t\t}\n\t}\n\treturn pt, nil\n}\n\n// GetPrecisionMultiplier will return a multiplier for the precision specified.\nfunc GetPrecisionMultiplier(precision string) int64 {\n\td := time.Nanosecond\n\tswitch precision {\n\tcase \"u\":\n\t\td = time.Microsecond\n\tcase \"ms\":\n\t\td = time.Millisecond\n\tcase \"s\":\n\t\td = time.Second\n\tcase \"m\":\n\t\td = time.Minute\n\tcase \"h\":\n\t\td = time.Hour\n\t}\n\treturn int64(d)\n}\n\n// scanKey scans buf starting at i for the measurement and tag portion of the point.\n// It returns the ending position and the byte slice of key within buf.  If there\n// are tags, they will be sorted if they are not already.\nfunc scanKey(buf []byte, i int) (int, []byte, error) {\n\tstart := skipWhitespace(buf, i)\n\n\ti = start\n\n\t// Determines whether the tags are sort, assume they are\n\tsorted := true\n\n\t// indices holds the indexes within buf of the start of each tag.  For example,\n\t// a buf of 'cpu,host=a,region=b,zone=c' would have indices slice of [4,11,20]\n\t// which indicates that the first tag starts at buf[4], seconds at buf[11], and\n\t// last at buf[20]\n\tindices := make([]int, 100)\n\n\t// tracks how many commas we've seen so we know how many values are indices.\n\t// Since indices is an arbitrarily large slice,\n\t// we need to know how many values in the buffer are in use.\n\tcommas := 0\n\n\t// First scan the Point's measurement.\n\tstate, i, err := scanMeasurement(buf, i)\n\tif err != nil {\n\t\treturn i, buf[start:i], err\n\t}\n\n\t// Optionally scan tags if needed.\n\tif state == tagKeyState {\n\t\ti, commas, indices, err = scanTags(buf, i, indices)\n\t\tif err != nil {\n\t\t\treturn i, buf[start:i], err\n\t\t}\n\t}\n\n\t// Now we know where the key region is within buf, and the location of tags, we\n\t// need to determine if duplicate tags exist and if the tags are sorted. This iterates\n\t// over the list comparing each tag in the sequence with each other.\n\tfor j := 0; j < commas-1; j++ {\n\t\t// get the left and right tags\n\t\t_, left := scanTo(buf[indices[j]:indices[j+1]-1], 0, '=')\n\t\t_, right := scanTo(buf[indices[j+1]:indices[j+2]-1], 0, '=')\n\n\t\t// If left is greater than right, the tags are not sorted. We do not have to\n\t\t// continue because the short path no longer works.\n\t\t// If the tags are equal, then there are duplicate tags, and we should abort.\n\t\t// If the tags are not sorted, this pass may not find duplicate tags and we\n\t\t// need to do a more exhaustive search later.\n\t\tif cmp := bytes.Compare(left, right); cmp > 0 {\n\t\t\tsorted = false\n\t\t\tbreak\n\t\t} else if cmp == 0 {\n\t\t\treturn i, buf[start:i], fmt.Errorf(\"duplicate tags\")\n\t\t}\n\t}\n\n\t// If the tags are not sorted, then sort them.  This sort is inline and\n\t// uses the tag indices we created earlier.  The actual buffer is not sorted, the\n\t// indices are using the buffer for value comparison.  After the indices are sorted,\n\t// the buffer is reconstructed from the sorted indices.\n\tif !sorted && commas > 0 {\n\t\t// Get the measurement name for later\n\t\tmeasurement := buf[start : indices[0]-1]\n\n\t\t// Sort the indices\n\t\tindices := indices[:commas]\n\t\tinsertionSort(0, commas, buf, indices)\n\n\t\t// Create a new key using the measurement and sorted indices\n\t\tb := make([]byte, len(buf[start:i]))\n\t\tpos := copy(b, measurement)\n\t\tfor _, i := range indices {\n\t\t\tb[pos] = ','\n\t\t\tpos++\n\t\t\t_, v := scanToSpaceOr(buf, i, ',')\n\t\t\tpos += copy(b[pos:], v)\n\t\t}\n\n\t\t// Check again for duplicate tags now that the tags are sorted.\n\t\tfor j := 0; j < commas-1; j++ {\n\t\t\t// get the left and right tags\n\t\t\t_, left := scanTo(buf[indices[j]:], 0, '=')\n\t\t\t_, right := scanTo(buf[indices[j+1]:], 0, '=')\n\n\t\t\t// If the tags are equal, then there are duplicate tags, and we should abort.\n\t\t\t// If the tags are not sorted, this pass may not find duplicate tags and we\n\t\t\t// need to do a more exhaustive search later.\n\t\t\tif bytes.Equal(left, right) {\n\t\t\t\treturn i, b, fmt.Errorf(\"duplicate tags\")\n\t\t\t}\n\t\t}\n\n\t\treturn i, b, nil\n\t}\n\n\treturn i, buf[start:i], nil\n}\n\n// The following constants allow us to specify which state to move to\n// next, when scanning sections of a Point.\nconst (\n\ttagKeyState = iota\n\ttagValueState\n\tfieldsState\n)\n\n// scanMeasurement examines the measurement part of a Point, returning\n// the next state to move to, and the current location in the buffer.\nfunc scanMeasurement(buf []byte, i int) (int, int, error) {\n\t// Check first byte of measurement, anything except a comma is fine.\n\t// It can't be a space, since whitespace is stripped prior to this\n\t// function call.\n\tif i >= len(buf) || buf[i] == ',' {\n\t\treturn -1, i, fmt.Errorf(\"missing measurement\")\n\t}\n\n\tfor {\n\t\ti++\n\t\tif i >= len(buf) {\n\t\t\t// cpu\n\t\t\treturn -1, i, fmt.Errorf(\"missing fields\")\n\t\t}\n\n\t\tif buf[i-1] == '\\\\' {\n\t\t\t// Skip character (it's escaped).\n\t\t\tcontinue\n\t\t}\n\n\t\t// Unescaped comma; move onto scanning the tags.\n\t\tif buf[i] == ',' {\n\t\t\treturn tagKeyState, i + 1, nil\n\t\t}\n\n\t\t// Unescaped space; move onto scanning the fields.\n\t\tif buf[i] == ' ' {\n\t\t\t// cpu value=1.0\n\t\t\treturn fieldsState, i, nil\n\t\t}\n\t}\n}\n\n// scanTags examines all the tags in a Point, keeping track of and\n// returning the updated indices slice, number of commas and location\n// in buf where to start examining the Point fields.\nfunc scanTags(buf []byte, i int, indices []int) (int, int, []int, error) {\n\tvar (\n\t\terr    error\n\t\tcommas int\n\t\tstate  = tagKeyState\n\t)\n\n\tfor {\n\t\tswitch state {\n\t\tcase tagKeyState:\n\t\t\t// Grow our indices slice if we have too many tags.\n\t\t\tif commas >= len(indices) {\n\t\t\t\tnewIndics := make([]int, cap(indices)*2)\n\t\t\t\tcopy(newIndics, indices)\n\t\t\t\tindices = newIndics\n\t\t\t}\n\t\t\tindices[commas] = i\n\t\t\tcommas++\n\n\t\t\ti, err = scanTagsKey(buf, i)\n\t\t\tstate = tagValueState // tag value always follows a tag key\n\t\tcase tagValueState:\n\t\t\tstate, i, err = scanTagsValue(buf, i)\n\t\tcase fieldsState:\n\t\t\tindices[commas] = i + 1\n\t\t\treturn i, commas, indices, nil\n\t\t}\n\n\t\tif err != nil {\n\t\t\treturn i, commas, indices, err\n\t\t}\n\t}\n}\n\n// scanTagsKey scans each character in a tag key.\nfunc scanTagsKey(buf []byte, i int) (int, error) {\n\t// First character of the key.\n\tif i >= len(buf) || buf[i] == ' ' || buf[i] == ',' || buf[i] == '=' {\n\t\t// cpu,{'', ' ', ',', '='}\n\t\treturn i, fmt.Errorf(\"missing tag key\")\n\t}\n\n\t// Examine each character in the tag key until we hit an unescaped\n\t// equals (the tag value), or we hit an error (i.e., unescaped\n\t// space or comma).\n\tfor {\n\t\ti++\n\n\t\t// Either we reached the end of the buffer or we hit an\n\t\t// unescaped comma or space.\n\t\tif i >= len(buf) ||\n\t\t\t((buf[i] == ' ' || buf[i] == ',') && buf[i-1] != '\\\\') {\n\t\t\t// cpu,tag{'', ' ', ','}\n\t\t\treturn i, fmt.Errorf(\"missing tag value\")\n\t\t}\n\n\t\tif buf[i] == '=' && buf[i-1] != '\\\\' {\n\t\t\t// cpu,tag=\n\t\t\treturn i + 1, nil\n\t\t}\n\t}\n}\n\n// scanTagsValue scans each character in a tag value.\nfunc scanTagsValue(buf []byte, i int) (int, int, error) {\n\t// Tag value cannot be empty.\n\tif i >= len(buf) || buf[i] == ',' || buf[i] == ' ' {\n\t\t// cpu,tag={',', ' '}\n\t\treturn -1, i, fmt.Errorf(\"missing tag value\")\n\t}\n\n\t// Examine each character in the tag value until we hit an unescaped\n\t// comma (move onto next tag key), an unescaped space (move onto\n\t// fields), or we error out.\n\tfor {\n\t\ti++\n\t\tif i >= len(buf) {\n\t\t\t// cpu,tag=value\n\t\t\treturn -1, i, fmt.Errorf(\"missing fields\")\n\t\t}\n\n\t\t// An unescaped equals sign is an invalid tag value.\n\t\tif buf[i] == '=' && buf[i-1] != '\\\\' {\n\t\t\t// cpu,tag={'=', 'fo=o'}\n\t\t\treturn -1, i, fmt.Errorf(\"invalid tag format\")\n\t\t}\n\n\t\tif buf[i] == ',' && buf[i-1] != '\\\\' {\n\t\t\t// cpu,tag=foo,\n\t\t\treturn tagKeyState, i + 1, nil\n\t\t}\n\n\t\t// cpu,tag=foo value=1.0\n\t\t// cpu, tag=foo\\= value=1.0\n\t\tif buf[i] == ' ' && buf[i-1] != '\\\\' {\n\t\t\treturn fieldsState, i, nil\n\t\t}\n\t}\n}\n\nfunc insertionSort(l, r int, buf []byte, indices []int) {\n\tfor i := l + 1; i < r; i++ {\n\t\tfor j := i; j > l && less(buf, indices, j, j-1); j-- {\n\t\t\tindices[j], indices[j-1] = indices[j-1], indices[j]\n\t\t}\n\t}\n}\n\nfunc less(buf []byte, indices []int, i, j int) bool {\n\t// This grabs the tag names for i & j, it ignores the values\n\t_, a := scanTo(buf, indices[i], '=')\n\t_, b := scanTo(buf, indices[j], '=')\n\treturn bytes.Compare(a, b) < 0\n}\n\n// scanFields scans buf, starting at i for the fields section of a point.  It returns\n// the ending position and the byte slice of the fields within buf.\nfunc scanFields(buf []byte, i int) (int, []byte, error) {\n\tstart := skipWhitespace(buf, i)\n\ti = start\n\tquoted := false\n\n\t// tracks how many '=' we've seen\n\tequals := 0\n\n\t// tracks how many commas we've seen\n\tcommas := 0\n\n\tfor {\n\t\t// reached the end of buf?\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\n\t\t// escaped characters?\n\t\tif buf[i] == '\\\\' && i+1 < len(buf) {\n\t\t\ti += 2\n\t\t\tcontinue\n\t\t}\n\n\t\t// If the value is quoted, scan until we get to the end quote\n\t\t// Only quote values in the field value since quotes are not significant\n\t\t// in the field key\n\t\tif buf[i] == '\"' && equals > commas {\n\t\t\tquoted = !quoted\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\n\t\t// If we see an =, ensure that there is at least on char before and after it\n\t\tif buf[i] == '=' && !quoted {\n\t\t\tequals++\n\n\t\t\t// check for \"... =123\" but allow \"a\\ =123\"\n\t\t\tif buf[i-1] == ' ' && buf[i-2] != '\\\\' {\n\t\t\t\treturn i, buf[start:i], fmt.Errorf(\"missing field key\")\n\t\t\t}\n\n\t\t\t// check for \"...a=123,=456\" but allow \"a=123,a\\,=456\"\n\t\t\tif buf[i-1] == ',' && buf[i-2] != '\\\\' {\n\t\t\t\treturn i, buf[start:i], fmt.Errorf(\"missing field key\")\n\t\t\t}\n\n\t\t\t// check for \"... value=\"\n\t\t\tif i+1 >= len(buf) {\n\t\t\t\treturn i, buf[start:i], fmt.Errorf(\"missing field value\")\n\t\t\t}\n\n\t\t\t// check for \"... value=,value2=...\"\n\t\t\tif buf[i+1] == ',' || buf[i+1] == ' ' {\n\t\t\t\treturn i, buf[start:i], fmt.Errorf(\"missing field value\")\n\t\t\t}\n\n\t\t\tif isNumeric(buf[i+1]) || buf[i+1] == '-' || buf[i+1] == 'N' || buf[i+1] == 'n' {\n\t\t\t\tvar err error\n\t\t\t\ti, err = scanNumber(buf, i+1)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn i, buf[start:i], err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// If next byte is not a double-quote, the value must be a boolean\n\t\t\tif buf[i+1] != '\"' {\n\t\t\t\tvar err error\n\t\t\t\ti, _, err = scanBoolean(buf, i+1)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn i, buf[start:i], err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tif buf[i] == ',' && !quoted {\n\t\t\tcommas++\n\t\t}\n\n\t\t// reached end of block?\n\t\tif buf[i] == ' ' && !quoted {\n\t\t\tbreak\n\t\t}\n\t\ti++\n\t}\n\n\tif quoted {\n\t\treturn i, buf[start:i], fmt.Errorf(\"unbalanced quotes\")\n\t}\n\n\t// check that all field sections had key and values (e.g. prevent \"a=1,b\"\n\tif equals == 0 || commas != equals-1 {\n\t\treturn i, buf[start:i], fmt.Errorf(\"invalid field format\")\n\t}\n\n\treturn i, buf[start:i], nil\n}\n\n// scanTime scans buf, starting at i for the time section of a point. It\n// returns the ending position and the byte slice of the timestamp within buf\n// and and error if the timestamp is not in the correct numeric format.\nfunc scanTime(buf []byte, i int) (int, []byte, error) {\n\tstart := skipWhitespace(buf, i)\n\ti = start\n\n\tfor {\n\t\t// reached the end of buf?\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\n\t\t// Reached end of block or trailing whitespace?\n\t\tif buf[i] == '\\n' || buf[i] == ' ' {\n\t\t\tbreak\n\t\t}\n\n\t\t// Handle negative timestamps\n\t\tif i == start && buf[i] == '-' {\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\n\t\t// Timestamps should be integers, make sure they are so we don't need\n\t\t// to actually  parse the timestamp until needed.\n\t\tif buf[i] < '0' || buf[i] > '9' {\n\t\t\treturn i, buf[start:i], fmt.Errorf(\"bad timestamp\")\n\t\t}\n\t\ti++\n\t}\n\treturn i, buf[start:i], nil\n}\n\nfunc isNumeric(b byte) bool {\n\treturn (b >= '0' && b <= '9') || b == '.'\n}\n\n// scanNumber returns the end position within buf, start at i after\n// scanning over buf for an integer, or float.  It returns an\n// error if a invalid number is scanned.\nfunc scanNumber(buf []byte, i int) (int, error) {\n\tstart := i\n\tvar isInt, isUnsigned bool\n\n\t// Is negative number?\n\tif i < len(buf) && buf[i] == '-' {\n\t\ti++\n\t\t// There must be more characters now, as just '-' is illegal.\n\t\tif i == len(buf) {\n\t\t\treturn i, ErrInvalidNumber\n\t\t}\n\t}\n\n\t// how many decimal points we've see\n\tdecimal := false\n\n\t// indicates the number is float in scientific notation\n\tscientific := false\n\n\tfor {\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\n\t\tif buf[i] == ',' || buf[i] == ' ' {\n\t\t\tbreak\n\t\t}\n\n\t\tif buf[i] == 'i' && i > start && !(isInt || isUnsigned) {\n\t\t\tisInt = true\n\t\t\ti++\n\t\t\tcontinue\n\t\t} else if buf[i] == 'u' && i > start && !(isInt || isUnsigned) {\n\t\t\tisUnsigned = true\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\n\t\tif buf[i] == '.' {\n\t\t\t// Can't have more than 1 decimal (e.g. 1.1.1 should fail)\n\t\t\tif decimal {\n\t\t\t\treturn i, ErrInvalidNumber\n\t\t\t}\n\t\t\tdecimal = true\n\t\t}\n\n\t\t// `e` is valid for floats but not as the first char\n\t\tif i > start && (buf[i] == 'e' || buf[i] == 'E') {\n\t\t\tscientific = true\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\n\t\t// + and - are only valid at this point if they follow an e (scientific notation)\n\t\tif (buf[i] == '+' || buf[i] == '-') && (buf[i-1] == 'e' || buf[i-1] == 'E') {\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\n\t\t// NaN is an unsupported value\n\t\tif i+2 < len(buf) && (buf[i] == 'N' || buf[i] == 'n') {\n\t\t\treturn i, ErrInvalidNumber\n\t\t}\n\n\t\tif !isNumeric(buf[i]) {\n\t\t\treturn i, ErrInvalidNumber\n\t\t}\n\t\ti++\n\t}\n\n\tif (isInt || isUnsigned) && (decimal || scientific) {\n\t\treturn i, ErrInvalidNumber\n\t}\n\n\tnumericDigits := i - start\n\tif isInt {\n\t\tnumericDigits--\n\t}\n\tif decimal {\n\t\tnumericDigits--\n\t}\n\tif buf[start] == '-' {\n\t\tnumericDigits--\n\t}\n\n\tif numericDigits == 0 {\n\t\treturn i, ErrInvalidNumber\n\t}\n\n\t// It's more common that numbers will be within min/max range for their type but we need to prevent\n\t// out or range numbers from being parsed successfully.  This uses some simple heuristics to decide\n\t// if we should parse the number to the actual type.  It does not do it all the time because it incurs\n\t// extra allocations and we end up converting the type again when writing points to disk.\n\tif isInt {\n\t\t// Make sure the last char is an 'i' for integers (e.g. 9i10 is not valid)\n\t\tif buf[i-1] != 'i' {\n\t\t\treturn i, ErrInvalidNumber\n\t\t}\n\t\t// Parse the int to check bounds the number of digits could be larger than the max range\n\t\t// We subtract 1 from the index to remove the `i` from our tests\n\t\tif len(buf[start:i-1]) >= maxInt64Digits || len(buf[start:i-1]) >= minInt64Digits {\n\t\t\tif _, err := parseIntBytes(buf[start:i-1], 10, 64); err != nil {\n\t\t\t\treturn i, fmt.Errorf(\"unable to parse integer %s: %s\", buf[start:i-1], err)\n\t\t\t}\n\t\t}\n\t} else if isUnsigned {\n\t\t// Return an error if uint64 support has not been enabled.\n\t\tif !enableUint64Support {\n\t\t\treturn i, ErrInvalidNumber\n\t\t}\n\t\t// Make sure the last char is a 'u' for unsigned\n\t\tif buf[i-1] != 'u' {\n\t\t\treturn i, ErrInvalidNumber\n\t\t}\n\t\t// Make sure the first char is not a '-' for unsigned\n\t\tif buf[start] == '-' {\n\t\t\treturn i, ErrInvalidNumber\n\t\t}\n\t\t// Parse the uint to check bounds the number of digits could be larger than the max range\n\t\t// We subtract 1 from the index to remove the `u` from our tests\n\t\tif len(buf[start:i-1]) >= maxUint64Digits {\n\t\t\tif _, err := parseUintBytes(buf[start:i-1], 10, 64); err != nil {\n\t\t\t\treturn i, fmt.Errorf(\"unable to parse unsigned %s: %s\", buf[start:i-1], err)\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Parse the float to check bounds if it's scientific or the number of digits could be larger than the max range\n\t\tif scientific || len(buf[start:i]) >= maxFloat64Digits || len(buf[start:i]) >= minFloat64Digits {\n\t\t\tif _, err := parseFloatBytes(buf[start:i], 10); err != nil {\n\t\t\t\treturn i, fmt.Errorf(\"invalid float\")\n\t\t\t}\n\t\t}\n\t}\n\n\treturn i, nil\n}\n\n// scanBoolean returns the end position within buf, start at i after\n// scanning over buf for boolean. Valid values for a boolean are\n// t, T, true, TRUE, f, F, false, FALSE.  It returns an error if a invalid boolean\n// is scanned.\nfunc scanBoolean(buf []byte, i int) (int, []byte, error) {\n\tstart := i\n\n\tif i < len(buf) && (buf[i] != 't' && buf[i] != 'f' && buf[i] != 'T' && buf[i] != 'F') {\n\t\treturn i, buf[start:i], fmt.Errorf(\"invalid boolean\")\n\t}\n\n\ti++\n\tfor {\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\n\t\tif buf[i] == ',' || buf[i] == ' ' {\n\t\t\tbreak\n\t\t}\n\t\ti++\n\t}\n\n\t// Single char bool (t, T, f, F) is ok\n\tif i-start == 1 {\n\t\treturn i, buf[start:i], nil\n\t}\n\n\t// length must be 4 for true or TRUE\n\tif (buf[start] == 't' || buf[start] == 'T') && i-start != 4 {\n\t\treturn i, buf[start:i], fmt.Errorf(\"invalid boolean\")\n\t}\n\n\t// length must be 5 for false or FALSE\n\tif (buf[start] == 'f' || buf[start] == 'F') && i-start != 5 {\n\t\treturn i, buf[start:i], fmt.Errorf(\"invalid boolean\")\n\t}\n\n\t// Otherwise\n\tvalid := false\n\tswitch buf[start] {\n\tcase 't':\n\t\tvalid = bytes.Equal(buf[start:i], []byte(\"true\"))\n\tcase 'f':\n\t\tvalid = bytes.Equal(buf[start:i], []byte(\"false\"))\n\tcase 'T':\n\t\tvalid = bytes.Equal(buf[start:i], []byte(\"TRUE\")) || bytes.Equal(buf[start:i], []byte(\"True\"))\n\tcase 'F':\n\t\tvalid = bytes.Equal(buf[start:i], []byte(\"FALSE\")) || bytes.Equal(buf[start:i], []byte(\"False\"))\n\t}\n\n\tif !valid {\n\t\treturn i, buf[start:i], fmt.Errorf(\"invalid boolean\")\n\t}\n\n\treturn i, buf[start:i], nil\n\n}\n\n// skipWhitespace returns the end position within buf, starting at i after\n// scanning over spaces in tags.\nfunc skipWhitespace(buf []byte, i int) int {\n\tfor i < len(buf) {\n\t\tif buf[i] != ' ' && buf[i] != '\\t' && buf[i] != 0 {\n\t\t\tbreak\n\t\t}\n\t\ti++\n\t}\n\treturn i\n}\n\n// scanLine returns the end position in buf and the next line found within\n// buf.\nfunc scanLine(buf []byte, i int) (int, []byte) {\n\tstart := i\n\tquoted := false\n\tfields := false\n\n\t// tracks how many '=' and commas we've seen\n\t// this duplicates some of the functionality in scanFields\n\tequals := 0\n\tcommas := 0\n\tfor {\n\t\t// reached the end of buf?\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\n\t\t// skip past escaped characters\n\t\tif buf[i] == '\\\\' && i+2 < len(buf) {\n\t\t\ti += 2\n\t\t\tcontinue\n\t\t}\n\n\t\tif buf[i] == ' ' {\n\t\t\tfields = true\n\t\t}\n\n\t\t// If we see a double quote, makes sure it is not escaped\n\t\tif fields {\n\t\t\tif !quoted && buf[i] == '=' {\n\t\t\t\ti++\n\t\t\t\tequals++\n\t\t\t\tcontinue\n\t\t\t} else if !quoted && buf[i] == ',' {\n\t\t\t\ti++\n\t\t\t\tcommas++\n\t\t\t\tcontinue\n\t\t\t} else if buf[i] == '\"' && equals > commas {\n\t\t\t\ti++\n\t\t\t\tquoted = !quoted\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tif buf[i] == '\\n' && !quoted {\n\t\t\tbreak\n\t\t}\n\n\t\ti++\n\t}\n\n\treturn i, buf[start:i]\n}\n\n// scanTo returns the end position in buf and the next consecutive block\n// of bytes, starting from i and ending with stop byte, where stop byte\n// has not been escaped.\n//\n// If there are leading spaces, they are skipped.\nfunc scanTo(buf []byte, i int, stop byte) (int, []byte) {\n\tstart := i\n\tfor {\n\t\t// reached the end of buf?\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\n\t\t// Reached unescaped stop value?\n\t\tif buf[i] == stop && (i == 0 || buf[i-1] != '\\\\') {\n\t\t\tbreak\n\t\t}\n\t\ti++\n\t}\n\n\treturn i, buf[start:i]\n}\n\n// scanTo returns the end position in buf and the next consecutive block\n// of bytes, starting from i and ending with stop byte.  If there are leading\n// spaces, they are skipped.\nfunc scanToSpaceOr(buf []byte, i int, stop byte) (int, []byte) {\n\tstart := i\n\tif buf[i] == stop || buf[i] == ' ' {\n\t\treturn i, buf[start:i]\n\t}\n\n\tfor {\n\t\ti++\n\t\tif buf[i-1] == '\\\\' {\n\t\t\tcontinue\n\t\t}\n\n\t\t// reached the end of buf?\n\t\tif i >= len(buf) {\n\t\t\treturn i, buf[start:i]\n\t\t}\n\n\t\t// reached end of block?\n\t\tif buf[i] == stop || buf[i] == ' ' {\n\t\t\treturn i, buf[start:i]\n\t\t}\n\t}\n}\n\nfunc scanTagValue(buf []byte, i int) (int, []byte) {\n\tstart := i\n\tfor {\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\n\t\tif buf[i] == ',' && buf[i-1] != '\\\\' {\n\t\t\tbreak\n\t\t}\n\t\ti++\n\t}\n\tif i > len(buf) {\n\t\treturn i, nil\n\t}\n\treturn i, buf[start:i]\n}\n\nfunc scanFieldValue(buf []byte, i int) (int, []byte) {\n\tstart := i\n\tquoted := false\n\tfor i < len(buf) {\n\t\t// Only escape char for a field value is a double-quote and backslash\n\t\tif buf[i] == '\\\\' && i+1 < len(buf) && (buf[i+1] == '\"' || buf[i+1] == '\\\\') {\n\t\t\ti += 2\n\t\t\tcontinue\n\t\t}\n\n\t\t// Quoted value? (e.g. string)\n\t\tif buf[i] == '\"' {\n\t\t\ti++\n\t\t\tquoted = !quoted\n\t\t\tcontinue\n\t\t}\n\n\t\tif buf[i] == ',' && !quoted {\n\t\t\tbreak\n\t\t}\n\t\ti++\n\t}\n\treturn i, buf[start:i]\n}\n\nfunc EscapeMeasurement(in []byte) []byte {\n\tfor b, esc := range measurementEscapeCodes {\n\t\tin = bytes.Replace(in, []byte{b}, esc, -1)\n\t}\n\treturn in\n}\n\nfunc unescapeMeasurement(in []byte) []byte {\n\tfor b, esc := range measurementEscapeCodes {\n\t\tin = bytes.Replace(in, esc, []byte{b}, -1)\n\t}\n\treturn in\n}\n\nfunc escapeTag(in []byte) []byte {\n\tfor b, esc := range tagEscapeCodes {\n\t\tif bytes.IndexByte(in, b) != -1 {\n\t\t\tin = bytes.Replace(in, []byte{b}, esc, -1)\n\t\t}\n\t}\n\treturn in\n}\n\nfunc unescapeTag(in []byte) []byte {\n\tif bytes.IndexByte(in, '\\\\') == -1 {\n\t\treturn in\n\t}\n\n\tfor b, esc := range tagEscapeCodes {\n\t\tif bytes.IndexByte(in, b) != -1 {\n\t\t\tin = bytes.Replace(in, esc, []byte{b}, -1)\n\t\t}\n\t}\n\treturn in\n}\n\n// escapeStringFieldReplacer replaces double quotes and backslashes\n// with the same character preceded by a backslash.\n// As of Go 1.7 this benchmarked better in allocations and CPU time\n// compared to iterating through a string byte-by-byte and appending to a new byte slice,\n// calling strings.Replace twice, and better than (*Regex).ReplaceAllString.\nvar escapeStringFieldReplacer = strings.NewReplacer(`\"`, `\\\"`, `\\`, `\\\\`)\n\n// EscapeStringField returns a copy of in with any double quotes or\n// backslashes with escaped values.\nfunc EscapeStringField(in string) string {\n\treturn escapeStringFieldReplacer.Replace(in)\n}\n\n// unescapeStringField returns a copy of in with any escaped double-quotes\n// or backslashes unescaped.\nfunc unescapeStringField(in string) string {\n\tif strings.IndexByte(in, '\\\\') == -1 {\n\t\treturn in\n\t}\n\n\tvar out []byte\n\ti := 0\n\tfor {\n\t\tif i >= len(in) {\n\t\t\tbreak\n\t\t}\n\t\t// unescape backslashes\n\t\tif in[i] == '\\\\' && i+1 < len(in) && in[i+1] == '\\\\' {\n\t\t\tout = append(out, '\\\\')\n\t\t\ti += 2\n\t\t\tcontinue\n\t\t}\n\t\t// unescape double-quotes\n\t\tif in[i] == '\\\\' && i+1 < len(in) && in[i+1] == '\"' {\n\t\t\tout = append(out, '\"')\n\t\t\ti += 2\n\t\t\tcontinue\n\t\t}\n\t\tout = append(out, in[i])\n\t\ti++\n\n\t}\n\treturn string(out)\n}\n\n// NewPoint returns a new point with the given measurement name, tags, fields and timestamp.  If\n// an unsupported field value (NaN) or out of range time is passed, this function returns an error.\nfunc NewPoint(name string, tags Tags, fields Fields, t time.Time) (Point, error) {\n\tkey, err := pointKey(name, tags, fields, t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &point{\n\t\tkey:    key,\n\t\ttime:   t,\n\t\tfields: fields.MarshalBinary(),\n\t}, nil\n}\n\n// pointKey checks some basic requirements for valid points, and returns the\n// key, along with an possible error.\nfunc pointKey(measurement string, tags Tags, fields Fields, t time.Time) ([]byte, error) {\n\tif len(fields) == 0 {\n\t\treturn nil, ErrPointMustHaveAField\n\t}\n\n\tif !t.IsZero() {\n\t\tif err := CheckTime(t); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tfor key, value := range fields {\n\t\tswitch value := value.(type) {\n\t\tcase float64:\n\t\t\t// Ensure the caller validates and handles invalid field values\n\t\t\tif math.IsNaN(value) {\n\t\t\t\treturn nil, fmt.Errorf(\"NaN is an unsupported value for field %s\", key)\n\t\t\t}\n\t\tcase float32:\n\t\t\t// Ensure the caller validates and handles invalid field values\n\t\t\tif math.IsNaN(float64(value)) {\n\t\t\t\treturn nil, fmt.Errorf(\"NaN is an unsupported value for field %s\", key)\n\t\t\t}\n\t\t}\n\t\tif len(key) == 0 {\n\t\t\treturn nil, fmt.Errorf(\"all fields must have non-empty names\")\n\t\t}\n\t}\n\n\tkey := MakeKey([]byte(measurement), tags)\n\tfor field := range fields {\n\t\tsz := seriesKeySize(key, []byte(field))\n\t\tif sz > MaxKeyLength {\n\t\t\treturn nil, fmt.Errorf(\"max key length exceeded: %v > %v\", sz, MaxKeyLength)\n\t\t}\n\t}\n\n\treturn key, nil\n}\n\nfunc seriesKeySize(key, field []byte) int {\n\t// 4 is the length of the tsm1.fieldKeySeparator constant.  It's inlined here to avoid a circular\n\t// dependency.\n\treturn len(key) + 4 + len(field)\n}\n\n// NewPointFromBytes returns a new Point from a marshalled Point.\nfunc NewPointFromBytes(b []byte) (Point, error) {\n\tp := &point{}\n\tif err := p.UnmarshalBinary(b); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// This does some basic validation to ensure there are fields and they\n\t// can be unmarshalled as well.\n\titer := p.FieldIterator()\n\tvar hasField bool\n\tfor iter.Next() {\n\t\tif len(iter.FieldKey()) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\thasField = true\n\t\tswitch iter.Type() {\n\t\tcase Float:\n\t\t\t_, err := iter.FloatValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\tcase Integer:\n\t\t\t_, err := iter.IntegerValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\tcase Unsigned:\n\t\t\t_, err := iter.UnsignedValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\tcase String:\n\t\t\t// Skip since this won't return an error\n\t\tcase Boolean:\n\t\t\t_, err := iter.BooleanValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif !hasField {\n\t\treturn nil, ErrPointMustHaveAField\n\t}\n\n\treturn p, nil\n}\n\n// MustNewPoint returns a new point with the given measurement name, tags, fields and timestamp.  If\n// an unsupported field value (NaN) is passed, this function panics.\nfunc MustNewPoint(name string, tags Tags, fields Fields, time time.Time) Point {\n\tpt, err := NewPoint(name, tags, fields, time)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn pt\n}\n\n// Key returns the key (measurement joined with tags) of the point.\nfunc (p *point) Key() []byte {\n\treturn p.key\n}\n\nfunc (p *point) name() []byte {\n\t_, name := scanTo(p.key, 0, ',')\n\treturn name\n}\n\nfunc (p *point) Name() []byte {\n\treturn escape.Unescape(p.name())\n}\n\n// SetName updates the measurement name for the point.\nfunc (p *point) SetName(name string) {\n\tp.cachedName = \"\"\n\tp.key = MakeKey([]byte(name), p.Tags())\n}\n\n// Time return the timestamp for the point.\nfunc (p *point) Time() time.Time {\n\treturn p.time\n}\n\n// SetTime updates the timestamp for the point.\nfunc (p *point) SetTime(t time.Time) {\n\tp.time = t\n}\n\n// Round will round the timestamp of the point to the given duration.\nfunc (p *point) Round(d time.Duration) {\n\tp.time = p.time.Round(d)\n}\n\n// Tags returns the tag set for the point.\nfunc (p *point) Tags() Tags {\n\tif p.cachedTags != nil {\n\t\treturn p.cachedTags\n\t}\n\tp.cachedTags = parseTags(p.key)\n\treturn p.cachedTags\n}\n\nfunc (p *point) HasTag(tag []byte) bool {\n\tif len(p.key) == 0 {\n\t\treturn false\n\t}\n\n\tvar exists bool\n\twalkTags(p.key, func(key, value []byte) bool {\n\t\tif bytes.Equal(tag, key) {\n\t\t\texists = true\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t})\n\n\treturn exists\n}\n\nfunc walkTags(buf []byte, fn func(key, value []byte) bool) {\n\tif len(buf) == 0 {\n\t\treturn\n\t}\n\n\tpos, name := scanTo(buf, 0, ',')\n\n\t// it's an empty key, so there are no tags\n\tif len(name) == 0 {\n\t\treturn\n\t}\n\n\thasEscape := bytes.IndexByte(buf, '\\\\') != -1\n\ti := pos + 1\n\tvar key, value []byte\n\tfor {\n\t\tif i >= len(buf) {\n\t\t\tbreak\n\t\t}\n\t\ti, key = scanTo(buf, i, '=')\n\t\ti, value = scanTagValue(buf, i+1)\n\n\t\tif len(value) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif hasEscape {\n\t\t\tif !fn(unescapeTag(key), unescapeTag(value)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\tif !fn(key, value) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\ti++\n\t}\n}\n\n// walkFields walks each field key and value via fn.  If fn returns false, the iteration\n// is stopped.  The values are the raw byte slices and not the converted types.\nfunc walkFields(buf []byte, fn func(key, value []byte) bool) {\n\tvar i int\n\tvar key, val []byte\n\tfor len(buf) > 0 {\n\t\ti, key = scanTo(buf, 0, '=')\n\t\tbuf = buf[i+1:]\n\t\ti, val = scanFieldValue(buf, 0)\n\t\tbuf = buf[i:]\n\t\tif !fn(key, val) {\n\t\t\tbreak\n\t\t}\n\n\t\t// slice off comma\n\t\tif len(buf) > 0 {\n\t\t\tbuf = buf[1:]\n\t\t}\n\t}\n}\n\nfunc parseTags(buf []byte) Tags {\n\tif len(buf) == 0 {\n\t\treturn nil\n\t}\n\n\ttags := make(Tags, bytes.Count(buf, []byte(\",\")))\n\tp := 0\n\twalkTags(buf, func(key, value []byte) bool {\n\t\ttags[p].Key = key\n\t\ttags[p].Value = value\n\t\tp++\n\t\treturn true\n\t})\n\treturn tags\n}\n\n// MakeKey creates a key for a set of tags.\nfunc MakeKey(name []byte, tags Tags) []byte {\n\t// unescape the name and then re-escape it to avoid double escaping.\n\t// The key should always be stored in escaped form.\n\treturn append(EscapeMeasurement(unescapeMeasurement(name)), tags.HashKey()...)\n}\n\n// SetTags replaces the tags for the point.\nfunc (p *point) SetTags(tags Tags) {\n\tp.key = MakeKey(p.Name(), tags)\n\tp.cachedTags = tags\n}\n\n// AddTag adds or replaces a tag value for a point.\nfunc (p *point) AddTag(key, value string) {\n\ttags := p.Tags()\n\ttags = append(tags, Tag{Key: []byte(key), Value: []byte(value)})\n\tsort.Sort(tags)\n\tp.cachedTags = tags\n\tp.key = MakeKey(p.Name(), tags)\n}\n\n// Fields returns the fields for the point.\nfunc (p *point) Fields() (Fields, error) {\n\tif p.cachedFields != nil {\n\t\treturn p.cachedFields, nil\n\t}\n\tcf, err := p.unmarshalBinary()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.cachedFields = cf\n\treturn p.cachedFields, nil\n}\n\n// SetPrecision will round a time to the specified precision.\nfunc (p *point) SetPrecision(precision string) {\n\tswitch precision {\n\tcase \"n\":\n\tcase \"u\":\n\t\tp.SetTime(p.Time().Truncate(time.Microsecond))\n\tcase \"ms\":\n\t\tp.SetTime(p.Time().Truncate(time.Millisecond))\n\tcase \"s\":\n\t\tp.SetTime(p.Time().Truncate(time.Second))\n\tcase \"m\":\n\t\tp.SetTime(p.Time().Truncate(time.Minute))\n\tcase \"h\":\n\t\tp.SetTime(p.Time().Truncate(time.Hour))\n\t}\n}\n\n// String returns the string representation of the point.\nfunc (p *point) String() string {\n\tif p.Time().IsZero() {\n\t\treturn string(p.Key()) + \" \" + string(p.fields)\n\t}\n\treturn string(p.Key()) + \" \" + string(p.fields) + \" \" + strconv.FormatInt(p.UnixNano(), 10)\n}\n\n// AppendString appends the string representation of the point to buf.\nfunc (p *point) AppendString(buf []byte) []byte {\n\tbuf = append(buf, p.key...)\n\tbuf = append(buf, ' ')\n\tbuf = append(buf, p.fields...)\n\n\tif !p.time.IsZero() {\n\t\tbuf = append(buf, ' ')\n\t\tbuf = strconv.AppendInt(buf, p.UnixNano(), 10)\n\t}\n\n\treturn buf\n}\n\n// StringSize returns the length of the string that would be returned by String().\nfunc (p *point) StringSize() int {\n\tsize := len(p.key) + len(p.fields) + 1\n\n\tif !p.time.IsZero() {\n\t\tdigits := 1 // even \"0\" has one digit\n\t\tt := p.UnixNano()\n\t\tif t < 0 {\n\t\t\t// account for negative sign, then negate\n\t\t\tdigits++\n\t\t\tt = -t\n\t\t}\n\t\tfor t > 9 { // already accounted for one digit\n\t\t\tdigits++\n\t\t\tt /= 10\n\t\t}\n\t\tsize += digits + 1 // digits and a space\n\t}\n\n\treturn size\n}\n\n// MarshalBinary returns a binary representation of the point.\nfunc (p *point) MarshalBinary() ([]byte, error) {\n\tif len(p.fields) == 0 {\n\t\treturn nil, ErrPointMustHaveAField\n\t}\n\n\ttb, err := p.time.MarshalBinary()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tb := make([]byte, 8+len(p.key)+len(p.fields)+len(tb))\n\ti := 0\n\n\tbinary.BigEndian.PutUint32(b[i:], uint32(len(p.key)))\n\ti += 4\n\n\ti += copy(b[i:], p.key)\n\n\tbinary.BigEndian.PutUint32(b[i:i+4], uint32(len(p.fields)))\n\ti += 4\n\n\ti += copy(b[i:], p.fields)\n\n\tcopy(b[i:], tb)\n\treturn b, nil\n}\n\n// UnmarshalBinary decodes a binary representation of the point into a point struct.\nfunc (p *point) UnmarshalBinary(b []byte) error {\n\tvar n int\n\n\t// Read key length.\n\tif len(b) < 4 {\n\t\treturn io.ErrShortBuffer\n\t}\n\tn, b = int(binary.BigEndian.Uint32(b[:4])), b[4:]\n\n\t// Read key.\n\tif len(b) < n {\n\t\treturn io.ErrShortBuffer\n\t}\n\tp.key, b = b[:n], b[n:]\n\n\t// Read fields length.\n\tif len(b) < 4 {\n\t\treturn io.ErrShortBuffer\n\t}\n\tn, b = int(binary.BigEndian.Uint32(b[:4])), b[4:]\n\n\t// Read fields.\n\tif len(b) < n {\n\t\treturn io.ErrShortBuffer\n\t}\n\tp.fields, b = b[:n], b[n:]\n\n\t// Read timestamp.\n\tif err := p.time.UnmarshalBinary(b); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// PrecisionString returns a string representation of the point. If there\n// is a timestamp associated with the point then it will be specified in the\n// given unit.\nfunc (p *point) PrecisionString(precision string) string {\n\tif p.Time().IsZero() {\n\t\treturn fmt.Sprintf(\"%s %s\", p.Key(), string(p.fields))\n\t}\n\treturn fmt.Sprintf(\"%s %s %d\", p.Key(), string(p.fields),\n\t\tp.UnixNano()/GetPrecisionMultiplier(precision))\n}\n\n// RoundedString returns a string representation of the point. If there\n// is a timestamp associated with the point, then it will be rounded to the\n// given duration.\nfunc (p *point) RoundedString(d time.Duration) string {\n\tif p.Time().IsZero() {\n\t\treturn fmt.Sprintf(\"%s %s\", p.Key(), string(p.fields))\n\t}\n\treturn fmt.Sprintf(\"%s %s %d\", p.Key(), string(p.fields),\n\t\tp.time.Round(d).UnixNano())\n}\n\nfunc (p *point) unmarshalBinary() (Fields, error) {\n\titer := p.FieldIterator()\n\tfields := make(Fields, 8)\n\tfor iter.Next() {\n\t\tif len(iter.FieldKey()) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tswitch iter.Type() {\n\t\tcase Float:\n\t\t\tv, err := iter.FloatValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\t\tfields[string(iter.FieldKey())] = v\n\t\tcase Integer:\n\t\t\tv, err := iter.IntegerValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\t\tfields[string(iter.FieldKey())] = v\n\t\tcase Unsigned:\n\t\t\tv, err := iter.UnsignedValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\t\tfields[string(iter.FieldKey())] = v\n\t\tcase String:\n\t\t\tfields[string(iter.FieldKey())] = iter.StringValue()\n\t\tcase Boolean:\n\t\t\tv, err := iter.BooleanValue()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"unable to unmarshal field %s: %s\", string(iter.FieldKey()), err)\n\t\t\t}\n\t\t\tfields[string(iter.FieldKey())] = v\n\t\t}\n\t}\n\treturn fields, nil\n}\n\n// HashID returns a non-cryptographic checksum of the point's key.\nfunc (p *point) HashID() uint64 {\n\th := NewInlineFNV64a()\n\th.Write(p.key)\n\tsum := h.Sum64()\n\treturn sum\n}\n\n// UnixNano returns the timestamp of the point as nanoseconds since Unix epoch.\nfunc (p *point) UnixNano() int64 {\n\treturn p.Time().UnixNano()\n}\n\n// Split will attempt to return multiple points with the same timestamp whose\n// string representations are no longer than size. Points with a single field or\n// a point without a timestamp may exceed the requested size.\nfunc (p *point) Split(size int) []Point {\n\tif p.time.IsZero() || p.StringSize() <= size {\n\t\treturn []Point{p}\n\t}\n\n\t// key string, timestamp string, spaces\n\tsize -= len(p.key) + len(strconv.FormatInt(p.time.UnixNano(), 10)) + 2\n\n\tvar points []Point\n\tvar start, cur int\n\n\tfor cur < len(p.fields) {\n\t\tend, _ := scanTo(p.fields, cur, '=')\n\t\tend, _ = scanFieldValue(p.fields, end+1)\n\n\t\tif cur > start && end-start > size {\n\t\t\tpoints = append(points, &point{\n\t\t\t\tkey:    p.key,\n\t\t\t\ttime:   p.time,\n\t\t\t\tfields: p.fields[start : cur-1],\n\t\t\t})\n\t\t\tstart = cur\n\t\t}\n\n\t\tcur = end + 1\n\t}\n\n\tpoints = append(points, &point{\n\t\tkey:    p.key,\n\t\ttime:   p.time,\n\t\tfields: p.fields[start:],\n\t})\n\n\treturn points\n}\n\n// Tag represents a single key/value tag pair.\ntype Tag struct {\n\tKey   []byte\n\tValue []byte\n}\n\n// NewTag returns a new Tag.\nfunc NewTag(key, value []byte) Tag {\n\treturn Tag{\n\t\tKey:   key,\n\t\tValue: value,\n\t}\n}\n\n// Size returns the size of the key and value.\nfunc (t Tag) Size() int { return len(t.Key) + len(t.Value) }\n\n// Clone returns a shallow copy of Tag.\n//\n// Tags associated with a Point created by ParsePointsWithPrecision will hold references to the byte slice that was parsed.\n// Use Clone to create a Tag with new byte slices that do not refer to the argument to ParsePointsWithPrecision.\nfunc (t Tag) Clone() Tag {\n\tother := Tag{\n\t\tKey:   make([]byte, len(t.Key)),\n\t\tValue: make([]byte, len(t.Value)),\n\t}\n\n\tcopy(other.Key, t.Key)\n\tcopy(other.Value, t.Value)\n\n\treturn other\n}\n\n// String returns the string reprsentation of the tag.\nfunc (t *Tag) String() string {\n\tvar buf bytes.Buffer\n\tbuf.WriteByte('{')\n\tbuf.WriteString(string(t.Key))\n\tbuf.WriteByte(' ')\n\tbuf.WriteString(string(t.Value))\n\tbuf.WriteByte('}')\n\treturn buf.String()\n}\n\n// Tags represents a sorted list of tags.\ntype Tags []Tag\n\n// NewTags returns a new Tags from a map.\nfunc NewTags(m map[string]string) Tags {\n\tif len(m) == 0 {\n\t\treturn nil\n\t}\n\ta := make(Tags, 0, len(m))\n\tfor k, v := range m {\n\t\ta = append(a, NewTag([]byte(k), []byte(v)))\n\t}\n\tsort.Sort(a)\n\treturn a\n}\n\n// Keys returns the list of keys for a tag set.\nfunc (a Tags) Keys() []string {\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\tkeys := make([]string, len(a))\n\tfor i, tag := range a {\n\t\tkeys[i] = string(tag.Key)\n\t}\n\treturn keys\n}\n\n// Values returns the list of values for a tag set.\nfunc (a Tags) Values() []string {\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\tvalues := make([]string, len(a))\n\tfor i, tag := range a {\n\t\tvalues[i] = string(tag.Value)\n\t}\n\treturn values\n}\n\n// String returns the string representation of the tags.\nfunc (a Tags) String() string {\n\tvar buf bytes.Buffer\n\tbuf.WriteByte('[')\n\tfor i := range a {\n\t\tbuf.WriteString(a[i].String())\n\t\tif i < len(a)-1 {\n\t\t\tbuf.WriteByte(' ')\n\t\t}\n\t}\n\tbuf.WriteByte(']')\n\treturn buf.String()\n}\n\n// Size returns the number of bytes needed to store all tags. Note, this is\n// the number of bytes needed to store all keys and values and does not account\n// for data structures or delimiters for example.\nfunc (a Tags) Size() int {\n\tvar total int\n\tfor _, t := range a {\n\t\ttotal += t.Size()\n\t}\n\treturn total\n}\n\n// Clone returns a copy of the slice where the elements are a result of calling `Clone` on the original elements\n//\n// Tags associated with a Point created by ParsePointsWithPrecision will hold references to the byte slice that was parsed.\n// Use Clone to create Tags with new byte slices that do not refer to the argument to ParsePointsWithPrecision.\nfunc (a Tags) Clone() Tags {\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\tothers := make(Tags, len(a))\n\tfor i := range a {\n\t\tothers[i] = a[i].Clone()\n\t}\n\n\treturn others\n}\n\nfunc (a Tags) Len() int           { return len(a) }\nfunc (a Tags) Less(i, j int) bool { return bytes.Compare(a[i].Key, a[j].Key) == -1 }\nfunc (a Tags) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }\n\n// Equal returns true if a equals other.\nfunc (a Tags) Equal(other Tags) bool {\n\tif len(a) != len(other) {\n\t\treturn false\n\t}\n\tfor i := range a {\n\t\tif !bytes.Equal(a[i].Key, other[i].Key) || !bytes.Equal(a[i].Value, other[i].Value) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// CompareTags returns -1 if a < b, 1 if a > b, and 0 if a == b.\nfunc CompareTags(a, b Tags) int {\n\t// Compare each key & value until a mismatch.\n\tfor i := 0; i < len(a) && i < len(b); i++ {\n\t\tif cmp := bytes.Compare(a[i].Key, b[i].Key); cmp != 0 {\n\t\t\treturn cmp\n\t\t}\n\t\tif cmp := bytes.Compare(a[i].Value, b[i].Value); cmp != 0 {\n\t\t\treturn cmp\n\t\t}\n\t}\n\n\t// If all tags are equal up to this point then return shorter tagset.\n\tif len(a) < len(b) {\n\t\treturn -1\n\t} else if len(a) > len(b) {\n\t\treturn 1\n\t}\n\n\t// All tags are equal.\n\treturn 0\n}\n\n// Get returns the value for a key.\nfunc (a Tags) Get(key []byte) []byte {\n\t// OPTIMIZE: Use sort.Search if tagset is large.\n\n\tfor _, t := range a {\n\t\tif bytes.Equal(t.Key, key) {\n\t\t\treturn t.Value\n\t\t}\n\t}\n\treturn nil\n}\n\n// GetString returns the string value for a string key.\nfunc (a Tags) GetString(key string) string {\n\treturn string(a.Get([]byte(key)))\n}\n\n// Set sets the value for a key.\nfunc (a *Tags) Set(key, value []byte) {\n\tfor i, t := range *a {\n\t\tif bytes.Equal(t.Key, key) {\n\t\t\t(*a)[i].Value = value\n\t\t\treturn\n\t\t}\n\t}\n\t*a = append(*a, Tag{Key: key, Value: value})\n\tsort.Sort(*a)\n}\n\n// SetString sets the string value for a string key.\nfunc (a *Tags) SetString(key, value string) {\n\ta.Set([]byte(key), []byte(value))\n}\n\n// Delete removes a tag by key.\nfunc (a *Tags) Delete(key []byte) {\n\tfor i, t := range *a {\n\t\tif bytes.Equal(t.Key, key) {\n\t\t\tcopy((*a)[i:], (*a)[i+1:])\n\t\t\t(*a)[len(*a)-1] = Tag{}\n\t\t\t*a = (*a)[:len(*a)-1]\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Map returns a map representation of the tags.\nfunc (a Tags) Map() map[string]string {\n\tm := make(map[string]string, len(a))\n\tfor _, t := range a {\n\t\tm[string(t.Key)] = string(t.Value)\n\t}\n\treturn m\n}\n\n// Merge merges the tags combining the two. If both define a tag with the\n// same key, the merged value overwrites the old value.\n// A new map is returned.\nfunc (a Tags) Merge(other map[string]string) Tags {\n\tmerged := make(map[string]string, len(a)+len(other))\n\tfor _, t := range a {\n\t\tmerged[string(t.Key)] = string(t.Value)\n\t}\n\tfor k, v := range other {\n\t\tmerged[k] = v\n\t}\n\treturn NewTags(merged)\n}\n\n// HashKey hashes all of a tag's keys.\nfunc (a Tags) HashKey() []byte {\n\t// Empty maps marshal to empty bytes.\n\tif len(a) == 0 {\n\t\treturn nil\n\t}\n\n\t// Type invariant: Tags are sorted\n\n\tescaped := make(Tags, 0, len(a))\n\tsz := 0\n\tfor _, t := range a {\n\t\tek := escapeTag(t.Key)\n\t\tev := escapeTag(t.Value)\n\n\t\tif len(ev) > 0 {\n\t\t\tescaped = append(escaped, Tag{Key: ek, Value: ev})\n\t\t\tsz += len(ek) + len(ev)\n\t\t}\n\t}\n\n\tsz += len(escaped) + (len(escaped) * 2) // separators\n\n\t// Generate marshaled bytes.\n\tb := make([]byte, sz)\n\tbuf := b\n\tidx := 0\n\tfor _, k := range escaped {\n\t\tbuf[idx] = ','\n\t\tidx++\n\t\tcopy(buf[idx:idx+len(k.Key)], k.Key)\n\t\tidx += len(k.Key)\n\t\tbuf[idx] = '='\n\t\tidx++\n\t\tcopy(buf[idx:idx+len(k.Value)], k.Value)\n\t\tidx += len(k.Value)\n\t}\n\treturn b[:idx]\n}\n\n// CopyTags returns a shallow copy of tags.\nfunc CopyTags(a Tags) Tags {\n\tother := make(Tags, len(a))\n\tcopy(other, a)\n\treturn other\n}\n\n// DeepCopyTags returns a deep copy of tags.\nfunc DeepCopyTags(a Tags) Tags {\n\t// Calculate size of keys/values in bytes.\n\tvar n int\n\tfor _, t := range a {\n\t\tn += len(t.Key) + len(t.Value)\n\t}\n\n\t// Build single allocation for all key/values.\n\tbuf := make([]byte, n)\n\n\t// Copy tags to new set.\n\tother := make(Tags, len(a))\n\tfor i, t := range a {\n\t\tcopy(buf, t.Key)\n\t\tother[i].Key, buf = buf[:len(t.Key)], buf[len(t.Key):]\n\n\t\tcopy(buf, t.Value)\n\t\tother[i].Value, buf = buf[:len(t.Value)], buf[len(t.Value):]\n\t}\n\n\treturn other\n}\n\n// Fields represents a mapping between a Point's field names and their\n// values.\ntype Fields map[string]interface{}\n\n// FieldIterator retuns a FieldIterator that can be used to traverse the\n// fields of a point without constructing the in-memory map.\nfunc (p *point) FieldIterator() FieldIterator {\n\tp.Reset()\n\treturn p\n}\n\ntype fieldIterator struct {\n\tstart, end  int\n\tkey, keybuf []byte\n\tvalueBuf    []byte\n\tfieldType   FieldType\n}\n\n// Next indicates whether there any fields remaining.\nfunc (p *point) Next() bool {\n\tp.it.start = p.it.end\n\tif p.it.start >= len(p.fields) {\n\t\treturn false\n\t}\n\n\tp.it.end, p.it.key = scanTo(p.fields, p.it.start, '=')\n\tif escape.IsEscaped(p.it.key) {\n\t\tp.it.keybuf = escape.AppendUnescaped(p.it.keybuf[:0], p.it.key)\n\t\tp.it.key = p.it.keybuf\n\t}\n\n\tp.it.end, p.it.valueBuf = scanFieldValue(p.fields, p.it.end+1)\n\tp.it.end++\n\n\tif len(p.it.valueBuf) == 0 {\n\t\tp.it.fieldType = Empty\n\t\treturn true\n\t}\n\n\tc := p.it.valueBuf[0]\n\n\tif c == '\"' {\n\t\tp.it.fieldType = String\n\t\treturn true\n\t}\n\n\tif strings.IndexByte(`0123456789-.nNiIu`, c) >= 0 {\n\t\tif p.it.valueBuf[len(p.it.valueBuf)-1] == 'i' {\n\t\t\tp.it.fieldType = Integer\n\t\t\tp.it.valueBuf = p.it.valueBuf[:len(p.it.valueBuf)-1]\n\t\t} else if p.it.valueBuf[len(p.it.valueBuf)-1] == 'u' {\n\t\t\tp.it.fieldType = Unsigned\n\t\t\tp.it.valueBuf = p.it.valueBuf[:len(p.it.valueBuf)-1]\n\t\t} else {\n\t\t\tp.it.fieldType = Float\n\t\t}\n\t\treturn true\n\t}\n\n\t// to keep the same behavior that currently exists, default to boolean\n\tp.it.fieldType = Boolean\n\treturn true\n}\n\n// FieldKey returns the key of the current field.\nfunc (p *point) FieldKey() []byte {\n\treturn p.it.key\n}\n\n// Type returns the FieldType of the current field.\nfunc (p *point) Type() FieldType {\n\treturn p.it.fieldType\n}\n\n// StringValue returns the string value of the current field.\nfunc (p *point) StringValue() string {\n\treturn unescapeStringField(string(p.it.valueBuf[1 : len(p.it.valueBuf)-1]))\n}\n\n// IntegerValue returns the integer value of the current field.\nfunc (p *point) IntegerValue() (int64, error) {\n\tn, err := parseIntBytes(p.it.valueBuf, 10, 64)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"unable to parse integer value %q: %v\", p.it.valueBuf, err)\n\t}\n\treturn n, nil\n}\n\n// UnsignedValue returns the unsigned value of the current field.\nfunc (p *point) UnsignedValue() (uint64, error) {\n\tn, err := parseUintBytes(p.it.valueBuf, 10, 64)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"unable to parse unsigned value %q: %v\", p.it.valueBuf, err)\n\t}\n\treturn n, nil\n}\n\n// BooleanValue returns the boolean value of the current field.\nfunc (p *point) BooleanValue() (bool, error) {\n\tb, err := parseBoolBytes(p.it.valueBuf)\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"unable to parse bool value %q: %v\", p.it.valueBuf, err)\n\t}\n\treturn b, nil\n}\n\n// FloatValue returns the float value of the current field.\nfunc (p *point) FloatValue() (float64, error) {\n\tf, err := parseFloatBytes(p.it.valueBuf, 64)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"unable to parse floating point value %q: %v\", p.it.valueBuf, err)\n\t}\n\treturn f, nil\n}\n\n// Reset resets the iterator to its initial state.\nfunc (p *point) Reset() {\n\tp.it.fieldType = Empty\n\tp.it.key = nil\n\tp.it.valueBuf = nil\n\tp.it.start = 0\n\tp.it.end = 0\n}\n\n// MarshalBinary encodes all the fields to their proper type and returns the binary\n// represenation\n// NOTE: uint64 is specifically not supported due to potential overflow when we decode\n// again later to an int64\n// NOTE2: uint is accepted, and may be 64 bits, and is for some reason accepted...\nfunc (p Fields) MarshalBinary() []byte {\n\tvar b []byte\n\tkeys := make([]string, 0, len(p))\n\n\tfor k := range p {\n\t\tkeys = append(keys, k)\n\t}\n\n\t// Not really necessary, can probably be removed.\n\tsort.Strings(keys)\n\n\tfor i, k := range keys {\n\t\tif i > 0 {\n\t\t\tb = append(b, ',')\n\t\t}\n\t\tb = appendField(b, k, p[k])\n\t}\n\n\treturn b\n}\n\nfunc appendField(b []byte, k string, v interface{}) []byte {\n\tb = append(b, []byte(escape.String(k))...)\n\tb = append(b, '=')\n\n\t// check popular types first\n\tswitch v := v.(type) {\n\tcase float64:\n\t\tb = strconv.AppendFloat(b, v, 'f', -1, 64)\n\tcase int64:\n\t\tb = strconv.AppendInt(b, v, 10)\n\t\tb = append(b, 'i')\n\tcase string:\n\t\tb = append(b, '\"')\n\t\tb = append(b, []byte(EscapeStringField(v))...)\n\t\tb = append(b, '\"')\n\tcase bool:\n\t\tb = strconv.AppendBool(b, v)\n\tcase int32:\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase int16:\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase int8:\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase int:\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase uint64:\n\t\tb = strconv.AppendUint(b, v, 10)\n\t\tb = append(b, 'u')\n\tcase uint32:\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase uint16:\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase uint8:\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase uint:\n\t\t// TODO: 'uint' should be converted to writing as an unsigned integer,\n\t\t// but we cannot since that would break backwards compatibility.\n\t\tb = strconv.AppendInt(b, int64(v), 10)\n\t\tb = append(b, 'i')\n\tcase float32:\n\t\tb = strconv.AppendFloat(b, float64(v), 'f', -1, 32)\n\tcase []byte:\n\t\tb = append(b, v...)\n\tcase nil:\n\t\t// skip\n\tdefault:\n\t\t// Can't determine the type, so convert to string\n\t\tb = append(b, '\"')\n\t\tb = append(b, []byte(EscapeStringField(fmt.Sprintf(\"%v\", v)))...)\n\t\tb = append(b, '\"')\n\n\t}\n\n\treturn b\n}\n\ntype byteSlices [][]byte\n\nfunc (a byteSlices) Len() int           { return len(a) }\nfunc (a byteSlices) Less(i, j int) bool { return bytes.Compare(a[i], a[j]) == -1 }\nfunc (a byteSlices) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/rows.go",
    "content": "package models\n\nimport (\n\t\"sort\"\n)\n\n// Row represents a single row returned from the execution of a statement.\ntype Row struct {\n\tName    string            `json:\"name,omitempty\"`\n\tTags    map[string]string `json:\"tags,omitempty\"`\n\tColumns []string          `json:\"columns,omitempty\"`\n\tValues  [][]interface{}   `json:\"values,omitempty\"`\n\tPartial bool              `json:\"partial,omitempty\"`\n}\n\n// SameSeries returns true if r contains values for the same series as o.\nfunc (r *Row) SameSeries(o *Row) bool {\n\treturn r.tagsHash() == o.tagsHash() && r.Name == o.Name\n}\n\n// tagsHash returns a hash of tag key/value pairs.\nfunc (r *Row) tagsHash() uint64 {\n\th := NewInlineFNV64a()\n\tkeys := r.tagsKeys()\n\tfor _, k := range keys {\n\t\th.Write([]byte(k))\n\t\th.Write([]byte(r.Tags[k]))\n\t}\n\treturn h.Sum64()\n}\n\n// tagKeys returns a sorted list of tag keys.\nfunc (r *Row) tagsKeys() []string {\n\ta := make([]string, 0, len(r.Tags))\n\tfor k := range r.Tags {\n\t\ta = append(a, k)\n\t}\n\tsort.Strings(a)\n\treturn a\n}\n\n// Rows represents a collection of rows. Rows implements sort.Interface.\ntype Rows []*Row\n\n// Len implements sort.Interface.\nfunc (p Rows) Len() int { return len(p) }\n\n// Less implements sort.Interface.\nfunc (p Rows) Less(i, j int) bool {\n\t// Sort by name first.\n\tif p[i].Name != p[j].Name {\n\t\treturn p[i].Name < p[j].Name\n\t}\n\n\t// Sort by tag set hash. Tags don't have a meaningful sort order so we\n\t// just compute a hash and sort by that instead. This allows the tests\n\t// to receive rows in a predictable order every time.\n\treturn p[i].tagsHash() < p[j].tagsHash()\n}\n\n// Swap implements sort.Interface.\nfunc (p Rows) Swap(i, j int) { p[i], p[j] = p[j], p[i] }\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/statistic.go",
    "content": "package models\n\n// Statistic is the representation of a statistic used by the monitoring service.\ntype Statistic struct {\n\tName   string                 `json:\"name\"`\n\tTags   map[string]string      `json:\"tags\"`\n\tValues map[string]interface{} `json:\"values\"`\n}\n\n// NewStatistic returns an initialized Statistic.\nfunc NewStatistic(name string) Statistic {\n\treturn Statistic{\n\t\tName:   name,\n\t\tTags:   make(map[string]string),\n\t\tValues: make(map[string]interface{}),\n\t}\n}\n\n// StatisticTags is a map that can be merged with others without causing\n// mutations to either map.\ntype StatisticTags map[string]string\n\n// Merge creates a new map containing the merged contents of tags and t.\n// If both tags and the receiver map contain the same key, the value in tags\n// is used in the resulting map.\n//\n// Merge always returns a usable map.\nfunc (t StatisticTags) Merge(tags map[string]string) map[string]string {\n\t// Add everything in tags to the result.\n\tout := make(map[string]string, len(tags))\n\tfor k, v := range tags {\n\t\tout[k] = v\n\t}\n\n\t// Only add values from t that don't appear in tags.\n\tfor k, v := range t {\n\t\tif _, ok := tags[k]; !ok {\n\t\t\tout[k] = v\n\t\t}\n\t}\n\treturn out\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/time.go",
    "content": "package models\n\n// Helper time methods since parsing time can easily overflow and we only support a\n// specific time range.\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"time\"\n)\n\nconst (\n\t// MinNanoTime is the minumum time that can be represented.\n\t//\n\t// 1677-09-21 00:12:43.145224194 +0000 UTC\n\t//\n\t// The two lowest minimum integers are used as sentinel values.  The\n\t// minimum value needs to be used as a value lower than any other value for\n\t// comparisons and another separate value is needed to act as a sentinel\n\t// default value that is unusable by the user, but usable internally.\n\t// Because these two values need to be used for a special purpose, we do\n\t// not allow users to write points at these two times.\n\tMinNanoTime = int64(math.MinInt64) + 2\n\n\t// MaxNanoTime is the maximum time that can be represented.\n\t//\n\t// 2262-04-11 23:47:16.854775806 +0000 UTC\n\t//\n\t// The highest time represented by a nanosecond needs to be used for an\n\t// exclusive range in the shard group, so the maximum time needs to be one\n\t// less than the possible maximum number of nanoseconds representable by an\n\t// int64 so that we don't lose a point at that one time.\n\tMaxNanoTime = int64(math.MaxInt64) - 1\n)\n\nvar (\n\tminNanoTime = time.Unix(0, MinNanoTime).UTC()\n\tmaxNanoTime = time.Unix(0, MaxNanoTime).UTC()\n\n\t// ErrTimeOutOfRange gets returned when time is out of the representable range using int64 nanoseconds since the epoch.\n\tErrTimeOutOfRange = fmt.Errorf(\"time outside range %d - %d\", MinNanoTime, MaxNanoTime)\n)\n\n// SafeCalcTime safely calculates the time given. Will return error if the time is outside the\n// supported range.\nfunc SafeCalcTime(timestamp int64, precision string) (time.Time, error) {\n\tmult := GetPrecisionMultiplier(precision)\n\tif t, ok := safeSignedMult(timestamp, mult); ok {\n\t\ttme := time.Unix(0, t).UTC()\n\t\treturn tme, CheckTime(tme)\n\t}\n\n\treturn time.Time{}, ErrTimeOutOfRange\n}\n\n// CheckTime checks that a time is within the safe range.\nfunc CheckTime(t time.Time) error {\n\tif t.Before(minNanoTime) || t.After(maxNanoTime) {\n\t\treturn ErrTimeOutOfRange\n\t}\n\treturn nil\n}\n\n// Perform the multiplication and check to make sure it didn't overflow.\nfunc safeSignedMult(a, b int64) (int64, bool) {\n\tif a == 0 || b == 0 || a == 1 || b == 1 {\n\t\treturn a * b, true\n\t}\n\tif a == MinNanoTime || b == MaxNanoTime {\n\t\treturn 0, false\n\t}\n\tc := a * b\n\treturn c, c/b == a\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/models/uint_support.go",
    "content": "// +build uint uint64\n\npackage models\n\nfunc init() {\n\tEnableUintSupport()\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/pkg/escape/bytes.go",
    "content": "// Package escape contains utilities for escaping parts of InfluxQL\n// and InfluxDB line protocol.\npackage escape // import \"github.com/influxdata/influxdb/pkg/escape\"\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n)\n\n// Codes is a map of bytes to be escaped.\nvar Codes = map[byte][]byte{\n\t',': []byte(`\\,`),\n\t'\"': []byte(`\\\"`),\n\t' ': []byte(`\\ `),\n\t'=': []byte(`\\=`),\n}\n\n// Bytes escapes characters on the input slice, as defined by Codes.\nfunc Bytes(in []byte) []byte {\n\tfor b, esc := range Codes {\n\t\tin = bytes.Replace(in, []byte{b}, esc, -1)\n\t}\n\treturn in\n}\n\nconst escapeChars = `,\" =`\n\n// IsEscaped returns whether b has any escaped characters,\n// i.e. whether b seems to have been processed by Bytes.\nfunc IsEscaped(b []byte) bool {\n\tfor len(b) > 0 {\n\t\ti := bytes.IndexByte(b, '\\\\')\n\t\tif i < 0 {\n\t\t\treturn false\n\t\t}\n\n\t\tif i+1 < len(b) && strings.IndexByte(escapeChars, b[i+1]) >= 0 {\n\t\t\treturn true\n\t\t}\n\t\tb = b[i+1:]\n\t}\n\treturn false\n}\n\n// AppendUnescaped appends the unescaped version of src to dst\n// and returns the resulting slice.\nfunc AppendUnescaped(dst, src []byte) []byte {\n\tvar pos int\n\tfor len(src) > 0 {\n\t\tnext := bytes.IndexByte(src[pos:], '\\\\')\n\t\tif next < 0 || pos+next+1 >= len(src) {\n\t\t\treturn append(dst, src...)\n\t\t}\n\n\t\tif pos+next+1 < len(src) && strings.IndexByte(escapeChars, src[pos+next+1]) >= 0 {\n\t\t\tif pos+next > 0 {\n\t\t\t\tdst = append(dst, src[:pos+next]...)\n\t\t\t}\n\t\t\tsrc = src[pos+next+1:]\n\t\t\tpos = 0\n\t\t} else {\n\t\t\tpos += next + 1\n\t\t}\n\t}\n\n\treturn dst\n}\n\n// Unescape returns a new slice containing the unescaped version of in.\nfunc Unescape(in []byte) []byte {\n\tif len(in) == 0 {\n\t\treturn nil\n\t}\n\n\tif bytes.IndexByte(in, '\\\\') == -1 {\n\t\treturn in\n\t}\n\n\ti := 0\n\tinLen := len(in)\n\n\t// The output size will be no more than inLen. Preallocating the\n\t// capacity of the output is faster and uses less memory than\n\t// letting append() do its own (over)allocation.\n\tout := make([]byte, 0, inLen)\n\n\tfor {\n\t\tif i >= inLen {\n\t\t\tbreak\n\t\t}\n\t\tif in[i] == '\\\\' && i+1 < inLen {\n\t\t\tswitch in[i+1] {\n\t\t\tcase ',':\n\t\t\t\tout = append(out, ',')\n\t\t\t\ti += 2\n\t\t\t\tcontinue\n\t\t\tcase '\"':\n\t\t\t\tout = append(out, '\"')\n\t\t\t\ti += 2\n\t\t\t\tcontinue\n\t\t\tcase ' ':\n\t\t\t\tout = append(out, ' ')\n\t\t\t\ti += 2\n\t\t\t\tcontinue\n\t\t\tcase '=':\n\t\t\t\tout = append(out, '=')\n\t\t\t\ti += 2\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tout = append(out, in[i])\n\t\ti += 1\n\t}\n\treturn out\n}\n"
  },
  {
    "path": "vendor/github.com/influxdata/influxdb/pkg/escape/strings.go",
    "content": "package escape\n\nimport \"strings\"\n\nvar (\n\tescaper   = strings.NewReplacer(`,`, `\\,`, `\"`, `\\\"`, ` `, `\\ `, `=`, `\\=`)\n\tunescaper = strings.NewReplacer(`\\,`, `,`, `\\\"`, `\"`, `\\ `, ` `, `\\=`, `=`)\n)\n\n// UnescapeString returns unescaped version of in.\nfunc UnescapeString(in string) string {\n\tif strings.IndexByte(in, '\\\\') == -1 {\n\t\treturn in\n\t}\n\treturn unescaper.Replace(in)\n}\n\n// String returns the escaped version of in.\nfunc String(in string) string {\n\treturn escaper.Replace(in)\n}\n"
  },
  {
    "path": "vendor/github.com/jackpal/go-nat-pmp/LICENSE",
    "content": "   Copyright 2013 John Howard Palevich\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/jackpal/go-nat-pmp/README.md",
    "content": "go-nat-pmp\n==========\n\nA Go language client for the NAT-PMP internet protocol for port mapping and discovering the external\nIP address of a firewall.\n\nNAT-PMP is supported by Apple brand routers and open source routers like Tomato and DD-WRT.\n\nSee http://tools.ietf.org/html/draft-cheshire-nat-pmp-03\n\n\n[![Build Status](https://travis-ci.org/jackpal/go-nat-pmp.svg)](https://travis-ci.org/jackpal/go-nat-pmp)\n\nGet the package\n---------------\n\n    go get -u github.com/jackpal/go-nat-pmp\n\nUsage\n-----\n\n    import (\n        \"github.com/jackpal/gateway\"\n        natpmp \"github.com/jackpal/go-nat-pmp\"\n    )\n\n    gatewayIP, err = gateway.DiscoverGateway()\n    if err != nil {\n        return\n    }\n\n    client := natpmp.NewClient(gatewayIP)\n    response, err := client.GetExternalAddress()\n    if err != nil {\n        return\n    }\n    print(\"External IP address:\", response.ExternalIPAddress)\n\nClients\n-------\n\nThis library is used in the Taipei Torrent BitTorrent client http://github.com/jackpal/Taipei-Torrent\n\nComplete documentation\n----------------------\n\n    http://godoc.org/github.com/jackpal/go-nat-pmp\n\nLicense\n-------\n\nThis project is licensed under the Apache License 2.0.\n"
  },
  {
    "path": "vendor/github.com/jackpal/go-nat-pmp/natpmp.go",
    "content": "package natpmp\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n)\n\n// Implement the NAT-PMP protocol, typically supported by Apple routers and open source\n// routers such as DD-WRT and Tomato.\n//\n// See http://tools.ietf.org/html/draft-cheshire-nat-pmp-03\n//\n// Usage:\n//\n//    client := natpmp.NewClient(gatewayIP)\n//    response, err := client.GetExternalAddress()\n\n// The recommended mapping lifetime for AddPortMapping\nconst RECOMMENDED_MAPPING_LIFETIME_SECONDS = 3600\n\n// Interface used to make remote procedure calls.\ntype caller interface {\n\tcall(msg []byte, timeout time.Duration) (result []byte, err error)\n}\n\n// Client is a NAT-PMP protocol client.\ntype Client struct {\n\tcaller  caller\n\ttimeout time.Duration\n}\n\n// Create a NAT-PMP client for the NAT-PMP server at the gateway.\n// Uses default timeout which is around 128 seconds.\nfunc NewClient(gateway net.IP) (nat *Client) {\n\treturn &Client{&network{gateway}, 0}\n}\n\n// Create a NAT-PMP client for the NAT-PMP server at the gateway, with a timeout.\n// Timeout defines the total amount of time we will keep retrying before giving up.\nfunc NewClientWithTimeout(gateway net.IP, timeout time.Duration) (nat *Client) {\n\treturn &Client{&network{gateway}, timeout}\n}\n\n// Results of the NAT-PMP GetExternalAddress operation.\ntype GetExternalAddressResult struct {\n\tSecondsSinceStartOfEpoc uint32\n\tExternalIPAddress       [4]byte\n}\n\n// Get the external address of the router.\nfunc (n *Client) GetExternalAddress() (result *GetExternalAddressResult, err error) {\n\tmsg := make([]byte, 2)\n\tmsg[0] = 0 // Version 0\n\tmsg[1] = 0 // OP Code 0\n\tresponse, err := n.rpc(msg, 12)\n\tif err != nil {\n\t\treturn\n\t}\n\tresult = &GetExternalAddressResult{}\n\tresult.SecondsSinceStartOfEpoc = readNetworkOrderUint32(response[4:8])\n\tcopy(result.ExternalIPAddress[:], response[8:12])\n\treturn\n}\n\n// Results of the NAT-PMP AddPortMapping operation\ntype AddPortMappingResult struct {\n\tSecondsSinceStartOfEpoc      uint32\n\tInternalPort                 uint16\n\tMappedExternalPort           uint16\n\tPortMappingLifetimeInSeconds uint32\n}\n\n// Add (or delete) a port mapping. To delete a mapping, set the requestedExternalPort and lifetime to 0\nfunc (n *Client) AddPortMapping(protocol string, internalPort, requestedExternalPort int, lifetime int) (result *AddPortMappingResult, err error) {\n\tvar opcode byte\n\tif protocol == \"udp\" {\n\t\topcode = 1\n\t} else if protocol == \"tcp\" {\n\t\topcode = 2\n\t} else {\n\t\terr = fmt.Errorf(\"unknown protocol %v\", protocol)\n\t\treturn\n\t}\n\tmsg := make([]byte, 12)\n\tmsg[0] = 0 // Version 0\n\tmsg[1] = opcode\n\twriteNetworkOrderUint16(msg[4:6], uint16(internalPort))\n\twriteNetworkOrderUint16(msg[6:8], uint16(requestedExternalPort))\n\twriteNetworkOrderUint32(msg[8:12], uint32(lifetime))\n\tresponse, err := n.rpc(msg, 16)\n\tif err != nil {\n\t\treturn\n\t}\n\tresult = &AddPortMappingResult{}\n\tresult.SecondsSinceStartOfEpoc = readNetworkOrderUint32(response[4:8])\n\tresult.InternalPort = readNetworkOrderUint16(response[8:10])\n\tresult.MappedExternalPort = readNetworkOrderUint16(response[10:12])\n\tresult.PortMappingLifetimeInSeconds = readNetworkOrderUint32(response[12:16])\n\treturn\n}\n\nfunc (n *Client) rpc(msg []byte, resultSize int) (result []byte, err error) {\n\tresult, err = n.caller.call(msg, n.timeout)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = protocolChecks(msg, resultSize, result)\n\treturn\n}\n\nfunc protocolChecks(msg []byte, resultSize int, result []byte) (err error) {\n\tif len(result) != resultSize {\n\t\terr = fmt.Errorf(\"unexpected result size %d, expected %d\", len(result), resultSize)\n\t\treturn\n\t}\n\tif result[0] != 0 {\n\t\terr = fmt.Errorf(\"unknown protocol version %d\", result[0])\n\t\treturn\n\t}\n\texpectedOp := msg[1] | 0x80\n\tif result[1] != expectedOp {\n\t\terr = fmt.Errorf(\"Unexpected opcode %d. Expected %d\", result[1], expectedOp)\n\t\treturn\n\t}\n\tresultCode := readNetworkOrderUint16(result[2:4])\n\tif resultCode != 0 {\n\t\terr = fmt.Errorf(\"Non-zero result code %d\", resultCode)\n\t\treturn\n\t}\n\t// If we got here the RPC is good.\n\treturn\n}\n\nfunc writeNetworkOrderUint16(buf []byte, d uint16) {\n\tbuf[0] = byte(d >> 8)\n\tbuf[1] = byte(d)\n}\n\nfunc writeNetworkOrderUint32(buf []byte, d uint32) {\n\tbuf[0] = byte(d >> 24)\n\tbuf[1] = byte(d >> 16)\n\tbuf[2] = byte(d >> 8)\n\tbuf[3] = byte(d)\n}\n\nfunc readNetworkOrderUint16(buf []byte) uint16 {\n\treturn (uint16(buf[0]) << 8) | uint16(buf[1])\n}\n\nfunc readNetworkOrderUint32(buf []byte) uint32 {\n\treturn (uint32(buf[0]) << 24) | (uint32(buf[1]) << 16) | (uint32(buf[2]) << 8) | uint32(buf[3])\n}\n"
  },
  {
    "path": "vendor/github.com/jackpal/go-nat-pmp/network.go",
    "content": "package natpmp\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n)\n\nconst nAT_PMP_PORT = 5351\nconst nAT_TRIES = 9\nconst nAT_INITIAL_MS = 250\n\n// A caller that implements the NAT-PMP RPC protocol.\ntype network struct {\n\tgateway net.IP\n}\n\nfunc (n *network) call(msg []byte, timeout time.Duration) (result []byte, err error) {\n\tvar server net.UDPAddr\n\tserver.IP = n.gateway\n\tserver.Port = nAT_PMP_PORT\n\tconn, err := net.DialUDP(\"udp\", nil, &server)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer conn.Close()\n\n\t// 16 bytes is the maximum result size.\n\tresult = make([]byte, 16)\n\n\tvar finalTimeout time.Time\n\tif timeout != 0 {\n\t\tfinalTimeout = time.Now().Add(timeout)\n\t}\n\n\tneedNewDeadline := true\n\n\tvar tries uint\n\tfor tries = 0; (tries < nAT_TRIES && finalTimeout.IsZero()) || time.Now().Before(finalTimeout); {\n\t\tif needNewDeadline {\n\t\t\tnextDeadline := time.Now().Add((nAT_INITIAL_MS << tries) * time.Millisecond)\n\t\t\terr = conn.SetDeadline(minTime(nextDeadline, finalTimeout))\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tneedNewDeadline = false\n\t\t}\n\t\t_, err = conn.Write(msg)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tvar bytesRead int\n\t\tvar remoteAddr *net.UDPAddr\n\t\tbytesRead, remoteAddr, err = conn.ReadFromUDP(result)\n\t\tif err != nil {\n\t\t\tif err.(net.Error).Timeout() {\n\t\t\t\ttries++\n\t\t\t\tneedNewDeadline = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tif !remoteAddr.IP.Equal(n.gateway) {\n\t\t\t// Ignore this packet.\n\t\t\t// Continue without increasing retransmission timeout or deadline.\n\t\t\tcontinue\n\t\t}\n\t\t// Trim result to actual number of bytes received\n\t\tif bytesRead < len(result) {\n\t\t\tresult = result[:bytesRead]\n\t\t}\n\t\treturn\n\t}\n\terr = fmt.Errorf(\"Timed out trying to contact gateway\")\n\treturn\n}\n\nfunc minTime(a, b time.Time) time.Time {\n\tif a.IsZero() {\n\t\treturn b\n\t}\n\tif b.IsZero() {\n\t\treturn a\n\t}\n\tif a.Before(b) {\n\t\treturn a\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "vendor/github.com/jackpal/go-nat-pmp/recorder.go",
    "content": "package natpmp\n\nimport \"time\"\n\ntype callObserver interface {\n\tobserveCall(msg []byte, result []byte, err error)\n}\n\n// A caller that records the RPC call.\ntype recorder struct {\n\tchild    caller\n\tobserver callObserver\n}\n\nfunc (n *recorder) call(msg []byte, timeout time.Duration) (result []byte, err error) {\n\tresult, err = n.child.call(msg, timeout)\n\tn.observer.observeCall(msg, result, err)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/julienschmidt/httprouter/LICENSE",
    "content": "Copyright (c) 2013 Julien Schmidt. All rights reserved.\n\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * 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    * The names of the contributors may not be used to endorse or promote\n      products derived from this software without specific prior written\n      permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL JULIEN SCHMIDT BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "vendor/github.com/julienschmidt/httprouter/README.md",
    "content": "# HttpRouter [![Build Status](https://travis-ci.org/julienschmidt/httprouter.svg?branch=master)](https://travis-ci.org/julienschmidt/httprouter) [![Coverage Status](https://coveralls.io/repos/github/julienschmidt/httprouter/badge.svg?branch=master)](https://coveralls.io/github/julienschmidt/httprouter?branch=master) [![GoDoc](https://godoc.org/github.com/julienschmidt/httprouter?status.svg)](http://godoc.org/github.com/julienschmidt/httprouter)\n\nHttpRouter is a lightweight high performance HTTP request router (also called *multiplexer* or just *mux* for short) for [Go](https://golang.org/).\n\nIn contrast to the [default mux](https://golang.org/pkg/net/http/#ServeMux) of Go's `net/http` package, this router supports variables in the routing pattern and matches against the request method. It also scales better.\n\nThe router is optimized for high performance and a small memory footprint. It scales well even with very long paths and a large number of routes. A compressing dynamic trie (radix tree) structure is used for efficient matching.\n\n## Features\n\n**Only explicit matches:** With other routers, like [`http.ServeMux`](https://golang.org/pkg/net/http/#ServeMux), a requested URL path could match multiple patterns. Therefore they have some awkward pattern priority rules, like *longest match* or *first registered, first matched*. By design of this router, a request can only match exactly one or no route. As a result, there are also no unintended matches, which makes it great for SEO and improves the user experience.\n\n**Stop caring about trailing slashes:** Choose the URL style you like, the router automatically redirects the client if a trailing slash is missing or if there is one extra. Of course it only does so, if the new path has a handler. If you don't like it, you can [turn off this behavior](https://godoc.org/github.com/julienschmidt/httprouter#Router.RedirectTrailingSlash).\n\n**Path auto-correction:** Besides detecting the missing or additional trailing slash at no extra cost, the router can also fix wrong cases and remove superfluous path elements (like `../` or `//`). Is [CAPTAIN CAPS LOCK](http://www.urbandictionary.com/define.php?term=Captain+Caps+Lock) one of your users? HttpRouter can help him by making a case-insensitive look-up and redirecting him to the correct URL.\n\n**Parameters in your routing pattern:** Stop parsing the requested URL path, just give the path segment a name and the router delivers the dynamic value to you. Because of the design of the router, path parameters are very cheap.\n\n**Zero Garbage:** The matching and dispatching process generates zero bytes of garbage. In fact, the only heap allocations that are made, is by building the slice of the key-value pairs for path parameters. If the request path contains no parameters, not a single heap allocation is necessary.\n\n**Best Performance:** [Benchmarks speak for themselves](https://github.com/julienschmidt/go-http-routing-benchmark). See below for technical details of the implementation.\n\n**No more server crashes:** You can set a [Panic handler](https://godoc.org/github.com/julienschmidt/httprouter#Router.PanicHandler) to deal with panics occurring during handling a HTTP request. The router then recovers and lets the `PanicHandler` log what happened and deliver a nice error page.\n\n**Perfect for APIs:** The router design encourages to build sensible, hierarchical RESTful APIs. Moreover it has builtin native support for [OPTIONS requests](http://zacstewart.com/2012/04/14/http-options-method.html) and `405 Method Not Allowed` replies.\n\nOf course you can also set **custom [`NotFound`](https://godoc.org/github.com/julienschmidt/httprouter#Router.NotFound) and  [`MethodNotAllowed`](https://godoc.org/github.com/julienschmidt/httprouter#Router.MethodNotAllowed) handlers** and [**serve static files**](https://godoc.org/github.com/julienschmidt/httprouter#Router.ServeFiles).\n\n## Usage\n\nThis is just a quick introduction, view the [GoDoc](http://godoc.org/github.com/julienschmidt/httprouter) for details.\n\nLet's start with a trivial example:\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/julienschmidt/httprouter\"\n    \"net/http\"\n    \"log\"\n)\n\nfunc Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {\n    fmt.Fprint(w, \"Welcome!\\n\")\n}\n\nfunc Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {\n    fmt.Fprintf(w, \"hello, %s!\\n\", ps.ByName(\"name\"))\n}\n\nfunc main() {\n    router := httprouter.New()\n    router.GET(\"/\", Index)\n    router.GET(\"/hello/:name\", Hello)\n\n    log.Fatal(http.ListenAndServe(\":8080\", router))\n}\n```\n\n### Named parameters\n\nAs you can see, `:name` is a *named parameter*. The values are accessible via `httprouter.Params`, which is just a slice of `httprouter.Param`s. You can get the value of a parameter either by its index in the slice, or by using the `ByName(name)` method: `:name` can be retrived by `ByName(\"name\")`.\n\nNamed parameters only match a single path segment:\n\n```\nPattern: /user/:user\n\n /user/gordon              match\n /user/you                 match\n /user/gordon/profile      no match\n /user/                    no match\n```\n\n**Note:** Since this router has only explicit matches, you can not register static routes and parameters for the same path segment. For example you can not register the patterns `/user/new` and `/user/:user` for the same request method at the same time. The routing of different request methods is independent from each other.\n\n### Catch-All parameters\n\nThe second type are *catch-all* parameters and have the form `*name`. Like the name suggests, they match everything. Therefore they must always be at the **end** of the pattern:\n\n```\nPattern: /src/*filepath\n\n /src/                     match\n /src/somefile.go          match\n /src/subdir/somefile.go   match\n```\n\n## How does it work?\n\nThe router relies on a tree structure which makes heavy use of *common prefixes*, it is basically a *compact* [*prefix tree*](https://en.wikipedia.org/wiki/Trie) (or just [*Radix tree*](https://en.wikipedia.org/wiki/Radix_tree)). Nodes with a common prefix also share a common parent. Here is a short example what the routing tree for the `GET` request method could look like:\n\n```\nPriority   Path             Handle\n9          \\                *<1>\n3          ├s               nil\n2          |├earch\\         *<2>\n1          |└upport\\        *<3>\n2          ├blog\\           *<4>\n1          |    └:post      nil\n1          |         └\\     *<5>\n2          ├about-us\\       *<6>\n1          |        └team\\  *<7>\n1          └contact\\        *<8>\n```\n\nEvery `*<num>` represents the memory address of a handler function (a pointer). If you follow a path trough the tree from the root to the leaf, you get the complete route path, e.g `\\blog\\:post\\`, where `:post` is just a placeholder ([*parameter*](#named-parameters)) for an actual post name. Unlike hash-maps, a tree structure also allows us to use dynamic parts like the `:post` parameter, since we actually match against the routing patterns instead of just comparing hashes. [As benchmarks show](https://github.com/julienschmidt/go-http-routing-benchmark), this works very well and efficient.\n\nSince URL paths have a hierarchical structure and make use only of a limited set of characters (byte values), it is very likely that there are a lot of common prefixes. This allows us to easily reduce the routing into ever smaller problems. Moreover the router manages a separate tree for every request method. For one thing it is more space efficient than holding a method->handle map in every single node, for another thing is also allows us to greatly reduce the routing problem before even starting the look-up in the prefix-tree.\n\nFor even better scalability, the child nodes on each tree level are ordered by priority, where the priority is just the number of handles registered in sub nodes (children, grandchildren, and so on..). This helps in two ways:\n\n1. Nodes which are part of the most routing paths are evaluated first. This helps to make as much routes as possible to be reachable as fast as possible.\n2. It is some sort of cost compensation. The longest reachable path (highest cost) can always be evaluated first. The following scheme visualizes the tree structure. Nodes are evaluated from top to bottom and from left to right.\n\n```\n├------------\n├---------\n├-----\n├----\n├--\n├--\n└-\n```\n\n## Why doesn't this work with `http.Handler`?\n\n**It does!** The router itself implements the `http.Handler` interface. Moreover the router provides convenient [adapters for `http.Handler`](https://godoc.org/github.com/julienschmidt/httprouter#Router.Handler)s and [`http.HandlerFunc`](https://godoc.org/github.com/julienschmidt/httprouter#Router.HandlerFunc)s which allows them to be used as a [`httprouter.Handle`](https://godoc.org/github.com/julienschmidt/httprouter#Router.Handle) when registering a route. The only disadvantage is, that no parameter values can be retrieved when a `http.Handler` or `http.HandlerFunc` is used, since there is no efficient way to pass the values with the existing function parameters. Therefore [`httprouter.Handle`](https://godoc.org/github.com/julienschmidt/httprouter#Router.Handle) has a third function parameter.\n\nJust try it out for yourself, the usage of HttpRouter is very straightforward. The package is compact and minimalistic, but also probably one of the easiest routers to set up.\n\n## Where can I find Middleware *X*?\n\nThis package just provides a very efficient request router with a few extra features. The router is just a [`http.Handler`](https://golang.org/pkg/net/http/#Handler), you can chain any http.Handler compatible middleware before the router, for example the [Gorilla handlers](http://www.gorillatoolkit.org/pkg/handlers). Or you could [just write your own](https://justinas.org/writing-http-middleware-in-go/), it's very easy!\n\nAlternatively, you could try [a web framework based on HttpRouter](#web-frameworks-based-on-httprouter).\n\n### Multi-domain / Sub-domains\n\nHere is a quick example: Does your server serve multiple domains / hosts?\nYou want to use sub-domains?\nDefine a router per host!\n\n```go\n// We need an object that implements the http.Handler interface.\n// Therefore we need a type for which we implement the ServeHTTP method.\n// We just use a map here, in which we map host names (with port) to http.Handlers\ntype HostSwitch map[string]http.Handler\n\n// Implement the ServerHTTP method on our new type\nfunc (hs HostSwitch) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n\t// Check if a http.Handler is registered for the given host.\n\t// If yes, use it to handle the request.\n\tif handler := hs[r.Host]; handler != nil {\n\t\thandler.ServeHTTP(w, r)\n\t} else {\n\t\t// Handle host names for wich no handler is registered\n\t\thttp.Error(w, \"Forbidden\", 403) // Or Redirect?\n\t}\n}\n\nfunc main() {\n\t// Initialize a router as usual\n\trouter := httprouter.New()\n\trouter.GET(\"/\", Index)\n\trouter.GET(\"/hello/:name\", Hello)\n\n\t// Make a new HostSwitch and insert the router (our http handler)\n\t// for example.com and port 12345\n\ths := make(HostSwitch)\n\ths[\"example.com:12345\"] = router\n\n\t// Use the HostSwitch to listen and serve on port 12345\n\tlog.Fatal(http.ListenAndServe(\":12345\", hs))\n}\n```\n\n### Basic Authentication\n\nAnother quick example: Basic Authentication (RFC 2617) for handles:\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\n\t\"github.com/julienschmidt/httprouter\"\n)\n\nfunc BasicAuth(h httprouter.Handle, requiredUser, requiredPassword string) httprouter.Handle {\n\treturn func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {\n\t\t// Get the Basic Authentication credentials\n\t\tuser, password, hasAuth := r.BasicAuth()\n\n\t\tif hasAuth && user == requiredUser && password == requiredPassword {\n\t\t\t// Delegate request to the given handle\n\t\t\th(w, r, ps)\n\t\t} else {\n\t\t\t// Request Basic Authentication otherwise\n\t\t\tw.Header().Set(\"WWW-Authenticate\", \"Basic realm=Restricted\")\n\t\t\thttp.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)\n\t\t}\n\t}\n}\n\nfunc Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {\n\tfmt.Fprint(w, \"Not protected!\\n\")\n}\n\nfunc Protected(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {\n\tfmt.Fprint(w, \"Protected!\\n\")\n}\n\nfunc main() {\n\tuser := \"gordon\"\n\tpass := \"secret!\"\n\n\trouter := httprouter.New()\n\trouter.GET(\"/\", Index)\n\trouter.GET(\"/protected/\", BasicAuth(Protected, user, pass))\n\n\tlog.Fatal(http.ListenAndServe(\":8080\", router))\n}\n```\n\n## Chaining with the NotFound handler\n\n**NOTE: It might be required to set [`Router.HandleMethodNotAllowed`](https://godoc.org/github.com/julienschmidt/httprouter#Router.HandleMethodNotAllowed) to `false` to avoid problems.**\n\nYou can use another [`http.Handler`](https://golang.org/pkg/net/http/#Handler), for example another router, to handle requests which could not be matched by this router by using the [`Router.NotFound`](https://godoc.org/github.com/julienschmidt/httprouter#Router.NotFound) handler. This allows chaining.\n\n### Static files\n\nThe `NotFound` handler can for example be used to serve static files from the root path `/` (like an `index.html` file along with other assets):\n\n```go\n// Serve static files from the ./public directory\nrouter.NotFound = http.FileServer(http.Dir(\"public\"))\n```\n\nBut this approach sidesteps the strict core rules of this router to avoid routing problems. A cleaner approach is to use a distinct sub-path for serving files, like `/static/*filepath` or `/files/*filepath`.\n\n## Web Frameworks based on HttpRouter\n\nIf the HttpRouter is a bit too minimalistic for you, you might try one of the following more high-level 3rd-party web frameworks building upon the HttpRouter package:\n\n* [Ace](https://github.com/plimble/ace): Blazing fast Go Web Framework\n* [api2go](https://github.com/manyminds/api2go): A JSON API Implementation for Go\n* [Gin](https://github.com/gin-gonic/gin): Features a martini-like API with much better performance\n* [Goat](https://github.com/bahlo/goat): A minimalistic REST API server in Go\n* [goMiddlewareChain](https://github.com/TobiEiss/goMiddlewareChain): An express.js-like-middleware-chain\n* [Hikaru](https://github.com/najeira/hikaru): Supports standalone and Google AppEngine\n* [Hitch](https://github.com/nbio/hitch): Hitch ties httprouter, [httpcontext](https://github.com/nbio/httpcontext), and middleware up in a bow\n* [httpway](https://github.com/corneldamian/httpway): Simple middleware extension with context for httprouter and a server with gracefully shutdown support\n* [kami](https://github.com/guregu/kami): A tiny web framework using x/net/context\n* [Medeina](https://github.com/imdario/medeina): Inspired by Ruby's Roda and Cuba\n* [Neko](https://github.com/rocwong/neko): A lightweight web application framework for Golang\n* [River](https://github.com/abiosoft/river): River is a simple and lightweight REST server\n* [Roxanna](https://github.com/iamthemuffinman/Roxanna): An amalgamation of httprouter, better logging, and hot reload\n* [siesta](https://github.com/VividCortex/siesta): Composable HTTP handlers with contexts\n* [xmux](https://github.com/rs/xmux): xmux is a httprouter fork on top of xhandler (net/context aware)\n"
  },
  {
    "path": "vendor/github.com/julienschmidt/httprouter/path.go",
    "content": "// Copyright 2013 Julien Schmidt. All rights reserved.\n// Based on the path package, Copyright 2009 The Go Authors.\n// Use of this source code is governed by a BSD-style license that can be found\n// in the LICENSE file.\n\npackage httprouter\n\n// CleanPath is the URL version of path.Clean, it returns a canonical URL path\n// for p, eliminating . and .. elements.\n//\n// The following rules are applied iteratively until no further processing can\n// be done:\n//\t1. Replace multiple slashes with a single slash.\n//\t2. Eliminate each . path name element (the current directory).\n//\t3. Eliminate each inner .. path name element (the parent directory)\n//\t   along with the non-.. element that precedes it.\n//\t4. Eliminate .. elements that begin a rooted path:\n//\t   that is, replace \"/..\" by \"/\" at the beginning of a path.\n//\n// If the result of this process is an empty string, \"/\" is returned\nfunc CleanPath(p string) string {\n\t// Turn empty string into \"/\"\n\tif p == \"\" {\n\t\treturn \"/\"\n\t}\n\n\tn := len(p)\n\tvar buf []byte\n\n\t// Invariants:\n\t//      reading from path; r is index of next byte to process.\n\t//      writing to buf; w is index of next byte to write.\n\n\t// path must start with '/'\n\tr := 1\n\tw := 1\n\n\tif p[0] != '/' {\n\t\tr = 0\n\t\tbuf = make([]byte, n+1)\n\t\tbuf[0] = '/'\n\t}\n\n\ttrailing := n > 2 && p[n-1] == '/'\n\n\t// A bit more clunky without a 'lazybuf' like the path package, but the loop\n\t// gets completely inlined (bufApp). So in contrast to the path package this\n\t// loop has no expensive function calls (except 1x make)\n\n\tfor r < n {\n\t\tswitch {\n\t\tcase p[r] == '/':\n\t\t\t// empty path element, trailing slash is added after the end\n\t\t\tr++\n\n\t\tcase p[r] == '.' && r+1 == n:\n\t\t\ttrailing = true\n\t\t\tr++\n\n\t\tcase p[r] == '.' && p[r+1] == '/':\n\t\t\t// . element\n\t\t\tr++\n\n\t\tcase p[r] == '.' && p[r+1] == '.' && (r+2 == n || p[r+2] == '/'):\n\t\t\t// .. element: remove to last /\n\t\t\tr += 2\n\n\t\t\tif w > 1 {\n\t\t\t\t// can backtrack\n\t\t\t\tw--\n\n\t\t\t\tif buf == nil {\n\t\t\t\t\tfor w > 1 && p[w] != '/' {\n\t\t\t\t\t\tw--\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor w > 1 && buf[w] != '/' {\n\t\t\t\t\t\tw--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\t// real path element.\n\t\t\t// add slash if needed\n\t\t\tif w > 1 {\n\t\t\t\tbufApp(&buf, p, w, '/')\n\t\t\t\tw++\n\t\t\t}\n\n\t\t\t// copy element\n\t\t\tfor r < n && p[r] != '/' {\n\t\t\t\tbufApp(&buf, p, w, p[r])\n\t\t\t\tw++\n\t\t\t\tr++\n\t\t\t}\n\t\t}\n\t}\n\n\t// re-append trailing slash\n\tif trailing && w > 1 {\n\t\tbufApp(&buf, p, w, '/')\n\t\tw++\n\t}\n\n\tif buf == nil {\n\t\treturn p[:w]\n\t}\n\treturn string(buf[:w])\n}\n\n// internal helper to lazily create a buffer if necessary\nfunc bufApp(buf *[]byte, s string, w int, c byte) {\n\tif *buf == nil {\n\t\tif s[w] == c {\n\t\t\treturn\n\t\t}\n\n\t\t*buf = make([]byte, len(s))\n\t\tcopy(*buf, s[:w])\n\t}\n\t(*buf)[w] = c\n}\n"
  },
  {
    "path": "vendor/github.com/julienschmidt/httprouter/router.go",
    "content": "// Copyright 2013 Julien Schmidt. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be found\n// in the LICENSE file.\n\n// Package httprouter is a trie based high performance HTTP request router.\n//\n// A trivial example is:\n//\n//  package main\n//\n//  import (\n//      \"fmt\"\n//      \"github.com/julienschmidt/httprouter\"\n//      \"net/http\"\n//      \"log\"\n//  )\n//\n//  func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {\n//      fmt.Fprint(w, \"Welcome!\\n\")\n//  }\n//\n//  func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {\n//      fmt.Fprintf(w, \"hello, %s!\\n\", ps.ByName(\"name\"))\n//  }\n//\n//  func main() {\n//      router := httprouter.New()\n//      router.GET(\"/\", Index)\n//      router.GET(\"/hello/:name\", Hello)\n//\n//      log.Fatal(http.ListenAndServe(\":8080\", router))\n//  }\n//\n// The router matches incoming requests by the request method and the path.\n// If a handle is registered for this path and method, the router delegates the\n// request to that function.\n// For the methods GET, POST, PUT, PATCH and DELETE shortcut functions exist to\n// register handles, for all other methods router.Handle can be used.\n//\n// The registered path, against which the router matches incoming requests, can\n// contain two types of parameters:\n//  Syntax    Type\n//  :name     named parameter\n//  *name     catch-all parameter\n//\n// Named parameters are dynamic path segments. They match anything until the\n// next '/' or the path end:\n//  Path: /blog/:category/:post\n//\n//  Requests:\n//   /blog/go/request-routers            match: category=\"go\", post=\"request-routers\"\n//   /blog/go/request-routers/           no match, but the router would redirect\n//   /blog/go/                           no match\n//   /blog/go/request-routers/comments   no match\n//\n// Catch-all parameters match anything until the path end, including the\n// directory index (the '/' before the catch-all). Since they match anything\n// until the end, catch-all parameters must always be the final path element.\n//  Path: /files/*filepath\n//\n//  Requests:\n//   /files/                             match: filepath=\"/\"\n//   /files/LICENSE                      match: filepath=\"/LICENSE\"\n//   /files/templates/article.html       match: filepath=\"/templates/article.html\"\n//   /files                              no match, but the router would redirect\n//\n// The value of parameters is saved as a slice of the Param struct, consisting\n// each of a key and a value. The slice is passed to the Handle func as a third\n// parameter.\n// There are two ways to retrieve the value of a parameter:\n//  // by the name of the parameter\n//  user := ps.ByName(\"user\") // defined by :user or *user\n//\n//  // by the index of the parameter. This way you can also get the name (key)\n//  thirdKey   := ps[2].Key   // the name of the 3rd parameter\n//  thirdValue := ps[2].Value // the value of the 3rd parameter\npackage httprouter\n\nimport (\n\t\"net/http\"\n)\n\n// Handle is a function that can be registered to a route to handle HTTP\n// requests. Like http.HandlerFunc, but has a third parameter for the values of\n// wildcards (variables).\ntype Handle func(http.ResponseWriter, *http.Request, Params)\n\n// Param is a single URL parameter, consisting of a key and a value.\ntype Param struct {\n\tKey   string\n\tValue string\n}\n\n// Params is a Param-slice, as returned by the router.\n// The slice is ordered, the first URL parameter is also the first slice value.\n// It is therefore safe to read values by the index.\ntype Params []Param\n\n// ByName returns the value of the first Param which key matches the given name.\n// If no matching Param is found, an empty string is returned.\nfunc (ps Params) ByName(name string) string {\n\tfor i := range ps {\n\t\tif ps[i].Key == name {\n\t\t\treturn ps[i].Value\n\t\t}\n\t}\n\treturn \"\"\n}\n\n// Router is a http.Handler which can be used to dispatch requests to different\n// handler functions via configurable routes\ntype Router struct {\n\ttrees map[string]*node\n\n\t// Enables automatic redirection if the current route can't be matched but a\n\t// handler for the path with (without) the trailing slash exists.\n\t// For example if /foo/ is requested but a route only exists for /foo, the\n\t// client is redirected to /foo with http status code 301 for GET requests\n\t// and 307 for all other request methods.\n\tRedirectTrailingSlash bool\n\n\t// If enabled, the router tries to fix the current request path, if no\n\t// handle is registered for it.\n\t// First superfluous path elements like ../ or // are removed.\n\t// Afterwards the router does a case-insensitive lookup of the cleaned path.\n\t// If a handle can be found for this route, the router makes a redirection\n\t// to the corrected path with status code 301 for GET requests and 307 for\n\t// all other request methods.\n\t// For example /FOO and /..//Foo could be redirected to /foo.\n\t// RedirectTrailingSlash is independent of this option.\n\tRedirectFixedPath bool\n\n\t// If enabled, the router checks if another method is allowed for the\n\t// current route, if the current request can not be routed.\n\t// If this is the case, the request is answered with 'Method Not Allowed'\n\t// and HTTP status code 405.\n\t// If no other Method is allowed, the request is delegated to the NotFound\n\t// handler.\n\tHandleMethodNotAllowed bool\n\n\t// If enabled, the router automatically replies to OPTIONS requests.\n\t// Custom OPTIONS handlers take priority over automatic replies.\n\tHandleOPTIONS bool\n\n\t// Configurable http.Handler which is called when no matching route is\n\t// found. If it is not set, http.NotFound is used.\n\tNotFound http.Handler\n\n\t// Configurable http.Handler which is called when a request\n\t// cannot be routed and HandleMethodNotAllowed is true.\n\t// If it is not set, http.Error with http.StatusMethodNotAllowed is used.\n\t// The \"Allow\" header with allowed request methods is set before the handler\n\t// is called.\n\tMethodNotAllowed http.Handler\n\n\t// Function to handle panics recovered from http handlers.\n\t// It should be used to generate a error page and return the http error code\n\t// 500 (Internal Server Error).\n\t// The handler can be used to keep your server from crashing because of\n\t// unrecovered panics.\n\tPanicHandler func(http.ResponseWriter, *http.Request, interface{})\n}\n\n// Make sure the Router conforms with the http.Handler interface\nvar _ http.Handler = New()\n\n// New returns a new initialized Router.\n// Path auto-correction, including trailing slashes, is enabled by default.\nfunc New() *Router {\n\treturn &Router{\n\t\tRedirectTrailingSlash:  true,\n\t\tRedirectFixedPath:      true,\n\t\tHandleMethodNotAllowed: true,\n\t\tHandleOPTIONS:          true,\n\t}\n}\n\n// GET is a shortcut for router.Handle(\"GET\", path, handle)\nfunc (r *Router) GET(path string, handle Handle) {\n\tr.Handle(\"GET\", path, handle)\n}\n\n// HEAD is a shortcut for router.Handle(\"HEAD\", path, handle)\nfunc (r *Router) HEAD(path string, handle Handle) {\n\tr.Handle(\"HEAD\", path, handle)\n}\n\n// OPTIONS is a shortcut for router.Handle(\"OPTIONS\", path, handle)\nfunc (r *Router) OPTIONS(path string, handle Handle) {\n\tr.Handle(\"OPTIONS\", path, handle)\n}\n\n// POST is a shortcut for router.Handle(\"POST\", path, handle)\nfunc (r *Router) POST(path string, handle Handle) {\n\tr.Handle(\"POST\", path, handle)\n}\n\n// PUT is a shortcut for router.Handle(\"PUT\", path, handle)\nfunc (r *Router) PUT(path string, handle Handle) {\n\tr.Handle(\"PUT\", path, handle)\n}\n\n// PATCH is a shortcut for router.Handle(\"PATCH\", path, handle)\nfunc (r *Router) PATCH(path string, handle Handle) {\n\tr.Handle(\"PATCH\", path, handle)\n}\n\n// DELETE is a shortcut for router.Handle(\"DELETE\", path, handle)\nfunc (r *Router) DELETE(path string, handle Handle) {\n\tr.Handle(\"DELETE\", path, handle)\n}\n\n// Handle registers a new request handle with the given path and method.\n//\n// For GET, POST, PUT, PATCH and DELETE requests the respective shortcut\n// functions can be used.\n//\n// This function is intended for bulk loading and to allow the usage of less\n// frequently used, non-standardized or custom methods (e.g. for internal\n// communication with a proxy).\nfunc (r *Router) Handle(method, path string, handle Handle) {\n\tif path[0] != '/' {\n\t\tpanic(\"path must begin with '/' in path '\" + path + \"'\")\n\t}\n\n\tif r.trees == nil {\n\t\tr.trees = make(map[string]*node)\n\t}\n\n\troot := r.trees[method]\n\tif root == nil {\n\t\troot = new(node)\n\t\tr.trees[method] = root\n\t}\n\n\troot.addRoute(path, handle)\n}\n\n// Handler is an adapter which allows the usage of an http.Handler as a\n// request handle.\nfunc (r *Router) Handler(method, path string, handler http.Handler) {\n\tr.Handle(method, path,\n\t\tfunc(w http.ResponseWriter, req *http.Request, _ Params) {\n\t\t\thandler.ServeHTTP(w, req)\n\t\t},\n\t)\n}\n\n// HandlerFunc is an adapter which allows the usage of an http.HandlerFunc as a\n// request handle.\nfunc (r *Router) HandlerFunc(method, path string, handler http.HandlerFunc) {\n\tr.Handler(method, path, handler)\n}\n\n// ServeFiles serves files from the given file system root.\n// The path must end with \"/*filepath\", files are then served from the local\n// path /defined/root/dir/*filepath.\n// For example if root is \"/etc\" and *filepath is \"passwd\", the local file\n// \"/etc/passwd\" would be served.\n// Internally a http.FileServer is used, therefore http.NotFound is used instead\n// of the Router's NotFound handler.\n// To use the operating system's file system implementation,\n// use http.Dir:\n//     router.ServeFiles(\"/src/*filepath\", http.Dir(\"/var/www\"))\nfunc (r *Router) ServeFiles(path string, root http.FileSystem) {\n\tif len(path) < 10 || path[len(path)-10:] != \"/*filepath\" {\n\t\tpanic(\"path must end with /*filepath in path '\" + path + \"'\")\n\t}\n\n\tfileServer := http.FileServer(root)\n\n\tr.GET(path, func(w http.ResponseWriter, req *http.Request, ps Params) {\n\t\treq.URL.Path = ps.ByName(\"filepath\")\n\t\tfileServer.ServeHTTP(w, req)\n\t})\n}\n\nfunc (r *Router) recv(w http.ResponseWriter, req *http.Request) {\n\tif rcv := recover(); rcv != nil {\n\t\tr.PanicHandler(w, req, rcv)\n\t}\n}\n\n// Lookup allows the manual lookup of a method + path combo.\n// This is e.g. useful to build a framework around this router.\n// If the path was found, it returns the handle function and the path parameter\n// values. Otherwise the third return value indicates whether a redirection to\n// the same path with an extra / without the trailing slash should be performed.\nfunc (r *Router) Lookup(method, path string) (Handle, Params, bool) {\n\tif root := r.trees[method]; root != nil {\n\t\treturn root.getValue(path)\n\t}\n\treturn nil, nil, false\n}\n\nfunc (r *Router) allowed(path, reqMethod string) (allow string) {\n\tif path == \"*\" { // server-wide\n\t\tfor method := range r.trees {\n\t\t\tif method == \"OPTIONS\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// add request method to list of allowed methods\n\t\t\tif len(allow) == 0 {\n\t\t\t\tallow = method\n\t\t\t} else {\n\t\t\t\tallow += \", \" + method\n\t\t\t}\n\t\t}\n\t} else { // specific path\n\t\tfor method := range r.trees {\n\t\t\t// Skip the requested method - we already tried this one\n\t\t\tif method == reqMethod || method == \"OPTIONS\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\thandle, _, _ := r.trees[method].getValue(path)\n\t\t\tif handle != nil {\n\t\t\t\t// add request method to list of allowed methods\n\t\t\t\tif len(allow) == 0 {\n\t\t\t\t\tallow = method\n\t\t\t\t} else {\n\t\t\t\t\tallow += \", \" + method\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif len(allow) > 0 {\n\t\tallow += \", OPTIONS\"\n\t}\n\treturn\n}\n\n// ServeHTTP makes the router implement the http.Handler interface.\nfunc (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {\n\tif r.PanicHandler != nil {\n\t\tdefer r.recv(w, req)\n\t}\n\n\tpath := req.URL.Path\n\n\tif root := r.trees[req.Method]; root != nil {\n\t\tif handle, ps, tsr := root.getValue(path); handle != nil {\n\t\t\thandle(w, req, ps)\n\t\t\treturn\n\t\t} else if req.Method != \"CONNECT\" && path != \"/\" {\n\t\t\tcode := 301 // Permanent redirect, request with GET method\n\t\t\tif req.Method != \"GET\" {\n\t\t\t\t// Temporary redirect, request with same method\n\t\t\t\t// As of Go 1.3, Go does not support status code 308.\n\t\t\t\tcode = 307\n\t\t\t}\n\n\t\t\tif tsr && r.RedirectTrailingSlash {\n\t\t\t\tif len(path) > 1 && path[len(path)-1] == '/' {\n\t\t\t\t\treq.URL.Path = path[:len(path)-1]\n\t\t\t\t} else {\n\t\t\t\t\treq.URL.Path = path + \"/\"\n\t\t\t\t}\n\t\t\t\thttp.Redirect(w, req, req.URL.String(), code)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Try to fix the request path\n\t\t\tif r.RedirectFixedPath {\n\t\t\t\tfixedPath, found := root.findCaseInsensitivePath(\n\t\t\t\t\tCleanPath(path),\n\t\t\t\t\tr.RedirectTrailingSlash,\n\t\t\t\t)\n\t\t\t\tif found {\n\t\t\t\t\treq.URL.Path = string(fixedPath)\n\t\t\t\t\thttp.Redirect(w, req, req.URL.String(), code)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif req.Method == \"OPTIONS\" {\n\t\t// Handle OPTIONS requests\n\t\tif r.HandleOPTIONS {\n\t\t\tif allow := r.allowed(path, req.Method); len(allow) > 0 {\n\t\t\t\tw.Header().Set(\"Allow\", allow)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Handle 405\n\t\tif r.HandleMethodNotAllowed {\n\t\t\tif allow := r.allowed(path, req.Method); len(allow) > 0 {\n\t\t\t\tw.Header().Set(\"Allow\", allow)\n\t\t\t\tif r.MethodNotAllowed != nil {\n\t\t\t\t\tr.MethodNotAllowed.ServeHTTP(w, req)\n\t\t\t\t} else {\n\t\t\t\t\thttp.Error(w,\n\t\t\t\t\t\thttp.StatusText(http.StatusMethodNotAllowed),\n\t\t\t\t\t\thttp.StatusMethodNotAllowed,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handle 404\n\tif r.NotFound != nil {\n\t\tr.NotFound.ServeHTTP(w, req)\n\t} else {\n\t\thttp.NotFound(w, req)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/julienschmidt/httprouter/tree.go",
    "content": "// Copyright 2013 Julien Schmidt. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be found\n// in the LICENSE file.\n\npackage httprouter\n\nimport (\n\t\"strings\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\nfunc min(a, b int) int {\n\tif a <= b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc countParams(path string) uint8 {\n\tvar n uint\n\tfor i := 0; i < len(path); i++ {\n\t\tif path[i] != ':' && path[i] != '*' {\n\t\t\tcontinue\n\t\t}\n\t\tn++\n\t}\n\tif n >= 255 {\n\t\treturn 255\n\t}\n\treturn uint8(n)\n}\n\ntype nodeType uint8\n\nconst (\n\tstatic nodeType = iota // default\n\troot\n\tparam\n\tcatchAll\n)\n\ntype node struct {\n\tpath      string\n\twildChild bool\n\tnType     nodeType\n\tmaxParams uint8\n\tindices   string\n\tchildren  []*node\n\thandle    Handle\n\tpriority  uint32\n}\n\n// increments priority of the given child and reorders if necessary\nfunc (n *node) incrementChildPrio(pos int) int {\n\tn.children[pos].priority++\n\tprio := n.children[pos].priority\n\n\t// adjust position (move to front)\n\tnewPos := pos\n\tfor newPos > 0 && n.children[newPos-1].priority < prio {\n\t\t// swap node positions\n\t\tn.children[newPos-1], n.children[newPos] = n.children[newPos], n.children[newPos-1]\n\n\t\tnewPos--\n\t}\n\n\t// build new index char string\n\tif newPos != pos {\n\t\tn.indices = n.indices[:newPos] + // unchanged prefix, might be empty\n\t\t\tn.indices[pos:pos+1] + // the index char we move\n\t\t\tn.indices[newPos:pos] + n.indices[pos+1:] // rest without char at 'pos'\n\t}\n\n\treturn newPos\n}\n\n// addRoute adds a node with the given handle to the path.\n// Not concurrency-safe!\nfunc (n *node) addRoute(path string, handle Handle) {\n\tfullPath := path\n\tn.priority++\n\tnumParams := countParams(path)\n\n\t// non-empty tree\n\tif len(n.path) > 0 || len(n.children) > 0 {\n\twalk:\n\t\tfor {\n\t\t\t// Update maxParams of the current node\n\t\t\tif numParams > n.maxParams {\n\t\t\t\tn.maxParams = numParams\n\t\t\t}\n\n\t\t\t// Find the longest common prefix.\n\t\t\t// This also implies that the common prefix contains no ':' or '*'\n\t\t\t// since the existing key can't contain those chars.\n\t\t\ti := 0\n\t\t\tmax := min(len(path), len(n.path))\n\t\t\tfor i < max && path[i] == n.path[i] {\n\t\t\t\ti++\n\t\t\t}\n\n\t\t\t// Split edge\n\t\t\tif i < len(n.path) {\n\t\t\t\tchild := node{\n\t\t\t\t\tpath:      n.path[i:],\n\t\t\t\t\twildChild: n.wildChild,\n\t\t\t\t\tnType:     static,\n\t\t\t\t\tindices:   n.indices,\n\t\t\t\t\tchildren:  n.children,\n\t\t\t\t\thandle:    n.handle,\n\t\t\t\t\tpriority:  n.priority - 1,\n\t\t\t\t}\n\n\t\t\t\t// Update maxParams (max of all children)\n\t\t\t\tfor i := range child.children {\n\t\t\t\t\tif child.children[i].maxParams > child.maxParams {\n\t\t\t\t\t\tchild.maxParams = child.children[i].maxParams\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tn.children = []*node{&child}\n\t\t\t\t// []byte for proper unicode char conversion, see #65\n\t\t\t\tn.indices = string([]byte{n.path[i]})\n\t\t\t\tn.path = path[:i]\n\t\t\t\tn.handle = nil\n\t\t\t\tn.wildChild = false\n\t\t\t}\n\n\t\t\t// Make new node a child of this node\n\t\t\tif i < len(path) {\n\t\t\t\tpath = path[i:]\n\n\t\t\t\tif n.wildChild {\n\t\t\t\t\tn = n.children[0]\n\t\t\t\t\tn.priority++\n\n\t\t\t\t\t// Update maxParams of the child node\n\t\t\t\t\tif numParams > n.maxParams {\n\t\t\t\t\t\tn.maxParams = numParams\n\t\t\t\t\t}\n\t\t\t\t\tnumParams--\n\n\t\t\t\t\t// Check if the wildcard matches\n\t\t\t\t\tif len(path) >= len(n.path) && n.path == path[:len(n.path)] &&\n\t\t\t\t\t\t// Check for longer wildcard, e.g. :name and :names\n\t\t\t\t\t\t(len(n.path) >= len(path) || path[len(n.path)] == '/') {\n\t\t\t\t\t\tcontinue walk\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Wildcard conflict\n\t\t\t\t\t\tvar pathSeg string\n\t\t\t\t\t\tif n.nType == catchAll {\n\t\t\t\t\t\t\tpathSeg = path\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpathSeg = strings.SplitN(path, \"/\", 2)[0]\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprefix := fullPath[:strings.Index(fullPath, pathSeg)] + n.path\n\t\t\t\t\t\tpanic(\"'\" + pathSeg +\n\t\t\t\t\t\t\t\"' in new path '\" + fullPath +\n\t\t\t\t\t\t\t\"' conflicts with existing wildcard '\" + n.path +\n\t\t\t\t\t\t\t\"' in existing prefix '\" + prefix +\n\t\t\t\t\t\t\t\"'\")\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tc := path[0]\n\n\t\t\t\t// slash after param\n\t\t\t\tif n.nType == param && c == '/' && len(n.children) == 1 {\n\t\t\t\t\tn = n.children[0]\n\t\t\t\t\tn.priority++\n\t\t\t\t\tcontinue walk\n\t\t\t\t}\n\n\t\t\t\t// Check if a child with the next path byte exists\n\t\t\t\tfor i := 0; i < len(n.indices); i++ {\n\t\t\t\t\tif c == n.indices[i] {\n\t\t\t\t\t\ti = n.incrementChildPrio(i)\n\t\t\t\t\t\tn = n.children[i]\n\t\t\t\t\t\tcontinue walk\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Otherwise insert it\n\t\t\t\tif c != ':' && c != '*' {\n\t\t\t\t\t// []byte for proper unicode char conversion, see #65\n\t\t\t\t\tn.indices += string([]byte{c})\n\t\t\t\t\tchild := &node{\n\t\t\t\t\t\tmaxParams: numParams,\n\t\t\t\t\t}\n\t\t\t\t\tn.children = append(n.children, child)\n\t\t\t\t\tn.incrementChildPrio(len(n.indices) - 1)\n\t\t\t\t\tn = child\n\t\t\t\t}\n\t\t\t\tn.insertChild(numParams, path, fullPath, handle)\n\t\t\t\treturn\n\n\t\t\t} else if i == len(path) { // Make node a (in-path) leaf\n\t\t\t\tif n.handle != nil {\n\t\t\t\t\tpanic(\"a handle is already registered for path '\" + fullPath + \"'\")\n\t\t\t\t}\n\t\t\t\tn.handle = handle\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t} else { // Empty tree\n\t\tn.insertChild(numParams, path, fullPath, handle)\n\t\tn.nType = root\n\t}\n}\n\nfunc (n *node) insertChild(numParams uint8, path, fullPath string, handle Handle) {\n\tvar offset int // already handled bytes of the path\n\n\t// find prefix until first wildcard (beginning with ':'' or '*'')\n\tfor i, max := 0, len(path); numParams > 0; i++ {\n\t\tc := path[i]\n\t\tif c != ':' && c != '*' {\n\t\t\tcontinue\n\t\t}\n\n\t\t// find wildcard end (either '/' or path end)\n\t\tend := i + 1\n\t\tfor end < max && path[end] != '/' {\n\t\t\tswitch path[end] {\n\t\t\t// the wildcard name must not contain ':' and '*'\n\t\t\tcase ':', '*':\n\t\t\t\tpanic(\"only one wildcard per path segment is allowed, has: '\" +\n\t\t\t\t\tpath[i:] + \"' in path '\" + fullPath + \"'\")\n\t\t\tdefault:\n\t\t\t\tend++\n\t\t\t}\n\t\t}\n\n\t\t// check if this Node existing children which would be\n\t\t// unreachable if we insert the wildcard here\n\t\tif len(n.children) > 0 {\n\t\t\tpanic(\"wildcard route '\" + path[i:end] +\n\t\t\t\t\"' conflicts with existing children in path '\" + fullPath + \"'\")\n\t\t}\n\n\t\t// check if the wildcard has a name\n\t\tif end-i < 2 {\n\t\t\tpanic(\"wildcards must be named with a non-empty name in path '\" + fullPath + \"'\")\n\t\t}\n\n\t\tif c == ':' { // param\n\t\t\t// split path at the beginning of the wildcard\n\t\t\tif i > 0 {\n\t\t\t\tn.path = path[offset:i]\n\t\t\t\toffset = i\n\t\t\t}\n\n\t\t\tchild := &node{\n\t\t\t\tnType:     param,\n\t\t\t\tmaxParams: numParams,\n\t\t\t}\n\t\t\tn.children = []*node{child}\n\t\t\tn.wildChild = true\n\t\t\tn = child\n\t\t\tn.priority++\n\t\t\tnumParams--\n\n\t\t\t// if the path doesn't end with the wildcard, then there\n\t\t\t// will be another non-wildcard subpath starting with '/'\n\t\t\tif end < max {\n\t\t\t\tn.path = path[offset:end]\n\t\t\t\toffset = end\n\n\t\t\t\tchild := &node{\n\t\t\t\t\tmaxParams: numParams,\n\t\t\t\t\tpriority:  1,\n\t\t\t\t}\n\t\t\t\tn.children = []*node{child}\n\t\t\t\tn = child\n\t\t\t}\n\n\t\t} else { // catchAll\n\t\t\tif end != max || numParams > 1 {\n\t\t\t\tpanic(\"catch-all routes are only allowed at the end of the path in path '\" + fullPath + \"'\")\n\t\t\t}\n\n\t\t\tif len(n.path) > 0 && n.path[len(n.path)-1] == '/' {\n\t\t\t\tpanic(\"catch-all conflicts with existing handle for the path segment root in path '\" + fullPath + \"'\")\n\t\t\t}\n\n\t\t\t// currently fixed width 1 for '/'\n\t\t\ti--\n\t\t\tif path[i] != '/' {\n\t\t\t\tpanic(\"no / before catch-all in path '\" + fullPath + \"'\")\n\t\t\t}\n\n\t\t\tn.path = path[offset:i]\n\n\t\t\t// first node: catchAll node with empty path\n\t\t\tchild := &node{\n\t\t\t\twildChild: true,\n\t\t\t\tnType:     catchAll,\n\t\t\t\tmaxParams: 1,\n\t\t\t}\n\t\t\tn.children = []*node{child}\n\t\t\tn.indices = string(path[i])\n\t\t\tn = child\n\t\t\tn.priority++\n\n\t\t\t// second node: node holding the variable\n\t\t\tchild = &node{\n\t\t\t\tpath:      path[i:],\n\t\t\t\tnType:     catchAll,\n\t\t\t\tmaxParams: 1,\n\t\t\t\thandle:    handle,\n\t\t\t\tpriority:  1,\n\t\t\t}\n\t\t\tn.children = []*node{child}\n\n\t\t\treturn\n\t\t}\n\t}\n\n\t// insert remaining path part and handle to the leaf\n\tn.path = path[offset:]\n\tn.handle = handle\n}\n\n// Returns the handle registered with the given path (key). The values of\n// wildcards are saved to a map.\n// If no handle can be found, a TSR (trailing slash redirect) recommendation is\n// made if a handle exists with an extra (without the) trailing slash for the\n// given path.\nfunc (n *node) getValue(path string) (handle Handle, p Params, tsr bool) {\nwalk: // outer loop for walking the tree\n\tfor {\n\t\tif len(path) > len(n.path) {\n\t\t\tif path[:len(n.path)] == n.path {\n\t\t\t\tpath = path[len(n.path):]\n\t\t\t\t// If this node does not have a wildcard (param or catchAll)\n\t\t\t\t// child,  we can just look up the next child node and continue\n\t\t\t\t// to walk down the tree\n\t\t\t\tif !n.wildChild {\n\t\t\t\t\tc := path[0]\n\t\t\t\t\tfor i := 0; i < len(n.indices); i++ {\n\t\t\t\t\t\tif c == n.indices[i] {\n\t\t\t\t\t\t\tn = n.children[i]\n\t\t\t\t\t\t\tcontinue walk\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Nothing found.\n\t\t\t\t\t// We can recommend to redirect to the same URL without a\n\t\t\t\t\t// trailing slash if a leaf exists for that path.\n\t\t\t\t\ttsr = (path == \"/\" && n.handle != nil)\n\t\t\t\t\treturn\n\n\t\t\t\t}\n\n\t\t\t\t// handle wildcard child\n\t\t\t\tn = n.children[0]\n\t\t\t\tswitch n.nType {\n\t\t\t\tcase param:\n\t\t\t\t\t// find param end (either '/' or path end)\n\t\t\t\t\tend := 0\n\t\t\t\t\tfor end < len(path) && path[end] != '/' {\n\t\t\t\t\t\tend++\n\t\t\t\t\t}\n\n\t\t\t\t\t// save param value\n\t\t\t\t\tif p == nil {\n\t\t\t\t\t\t// lazy allocation\n\t\t\t\t\t\tp = make(Params, 0, n.maxParams)\n\t\t\t\t\t}\n\t\t\t\t\ti := len(p)\n\t\t\t\t\tp = p[:i+1] // expand slice within preallocated capacity\n\t\t\t\t\tp[i].Key = n.path[1:]\n\t\t\t\t\tp[i].Value = path[:end]\n\n\t\t\t\t\t// we need to go deeper!\n\t\t\t\t\tif end < len(path) {\n\t\t\t\t\t\tif len(n.children) > 0 {\n\t\t\t\t\t\t\tpath = path[end:]\n\t\t\t\t\t\t\tn = n.children[0]\n\t\t\t\t\t\t\tcontinue walk\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// ... but we can't\n\t\t\t\t\t\ttsr = (len(path) == end+1)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif handle = n.handle; handle != nil {\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else if len(n.children) == 1 {\n\t\t\t\t\t\t// No handle found. Check if a handle for this path + a\n\t\t\t\t\t\t// trailing slash exists for TSR recommendation\n\t\t\t\t\t\tn = n.children[0]\n\t\t\t\t\t\ttsr = (n.path == \"/\" && n.handle != nil)\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\n\n\t\t\t\tcase catchAll:\n\t\t\t\t\t// save param value\n\t\t\t\t\tif p == nil {\n\t\t\t\t\t\t// lazy allocation\n\t\t\t\t\t\tp = make(Params, 0, n.maxParams)\n\t\t\t\t\t}\n\t\t\t\t\ti := len(p)\n\t\t\t\t\tp = p[:i+1] // expand slice within preallocated capacity\n\t\t\t\t\tp[i].Key = n.path[2:]\n\t\t\t\t\tp[i].Value = path\n\n\t\t\t\t\thandle = n.handle\n\t\t\t\t\treturn\n\n\t\t\t\tdefault:\n\t\t\t\t\tpanic(\"invalid node type\")\n\t\t\t\t}\n\t\t\t}\n\t\t} else if path == n.path {\n\t\t\t// We should have reached the node containing the handle.\n\t\t\t// Check if this node has a handle registered.\n\t\t\tif handle = n.handle; handle != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif path == \"/\" && n.wildChild && n.nType != root {\n\t\t\t\ttsr = true\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// No handle found. Check if a handle for this path + a\n\t\t\t// trailing slash exists for trailing slash recommendation\n\t\t\tfor i := 0; i < len(n.indices); i++ {\n\t\t\t\tif n.indices[i] == '/' {\n\t\t\t\t\tn = n.children[i]\n\t\t\t\t\ttsr = (len(n.path) == 1 && n.handle != nil) ||\n\t\t\t\t\t\t(n.nType == catchAll && n.children[0].handle != nil)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn\n\t\t}\n\n\t\t// Nothing found. We can recommend to redirect to the same URL with an\n\t\t// extra trailing slash if a leaf exists for that path\n\t\ttsr = (path == \"/\") ||\n\t\t\t(len(n.path) == len(path)+1 && n.path[len(path)] == '/' &&\n\t\t\t\tpath == n.path[:len(n.path)-1] && n.handle != nil)\n\t\treturn\n\t}\n}\n\n// Makes a case-insensitive lookup of the given path and tries to find a handler.\n// It can optionally also fix trailing slashes.\n// It returns the case-corrected path and a bool indicating whether the lookup\n// was successful.\nfunc (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) (ciPath []byte, found bool) {\n\treturn n.findCaseInsensitivePathRec(\n\t\tpath,\n\t\tstrings.ToLower(path),\n\t\tmake([]byte, 0, len(path)+1), // preallocate enough memory for new path\n\t\t[4]byte{},                    // empty rune buffer\n\t\tfixTrailingSlash,\n\t)\n}\n\n// shift bytes in array by n bytes left\nfunc shiftNRuneBytes(rb [4]byte, n int) [4]byte {\n\tswitch n {\n\tcase 0:\n\t\treturn rb\n\tcase 1:\n\t\treturn [4]byte{rb[1], rb[2], rb[3], 0}\n\tcase 2:\n\t\treturn [4]byte{rb[2], rb[3]}\n\tcase 3:\n\t\treturn [4]byte{rb[3]}\n\tdefault:\n\t\treturn [4]byte{}\n\t}\n}\n\n// recursive case-insensitive lookup function used by n.findCaseInsensitivePath\nfunc (n *node) findCaseInsensitivePathRec(path, loPath string, ciPath []byte, rb [4]byte, fixTrailingSlash bool) ([]byte, bool) {\n\tloNPath := strings.ToLower(n.path)\n\nwalk: // outer loop for walking the tree\n\tfor len(loPath) >= len(loNPath) && (len(loNPath) == 0 || loPath[1:len(loNPath)] == loNPath[1:]) {\n\t\t// add common path to result\n\t\tciPath = append(ciPath, n.path...)\n\n\t\tif path = path[len(n.path):]; len(path) > 0 {\n\t\t\tloOld := loPath\n\t\t\tloPath = loPath[len(loNPath):]\n\n\t\t\t// If this node does not have a wildcard (param or catchAll) child,\n\t\t\t// we can just look up the next child node and continue to walk down\n\t\t\t// the tree\n\t\t\tif !n.wildChild {\n\t\t\t\t// skip rune bytes already processed\n\t\t\t\trb = shiftNRuneBytes(rb, len(loNPath))\n\n\t\t\t\tif rb[0] != 0 {\n\t\t\t\t\t// old rune not finished\n\t\t\t\t\tfor i := 0; i < len(n.indices); i++ {\n\t\t\t\t\t\tif n.indices[i] == rb[0] {\n\t\t\t\t\t\t\t// continue with child node\n\t\t\t\t\t\t\tn = n.children[i]\n\t\t\t\t\t\t\tloNPath = strings.ToLower(n.path)\n\t\t\t\t\t\t\tcontinue walk\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// process a new rune\n\t\t\t\t\tvar rv rune\n\n\t\t\t\t\t// find rune start\n\t\t\t\t\t// runes are up to 4 byte long,\n\t\t\t\t\t// -4 would definitely be another rune\n\t\t\t\t\tvar off int\n\t\t\t\t\tfor max := min(len(loNPath), 3); off < max; off++ {\n\t\t\t\t\t\tif i := len(loNPath) - off; utf8.RuneStart(loOld[i]) {\n\t\t\t\t\t\t\t// read rune from cached lowercase path\n\t\t\t\t\t\t\trv, _ = utf8.DecodeRuneInString(loOld[i:])\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// calculate lowercase bytes of current rune\n\t\t\t\t\tutf8.EncodeRune(rb[:], rv)\n\t\t\t\t\t// skipp already processed bytes\n\t\t\t\t\trb = shiftNRuneBytes(rb, off)\n\n\t\t\t\t\tfor i := 0; i < len(n.indices); i++ {\n\t\t\t\t\t\t// lowercase matches\n\t\t\t\t\t\tif n.indices[i] == rb[0] {\n\t\t\t\t\t\t\t// must use a recursive approach since both the\n\t\t\t\t\t\t\t// uppercase byte and the lowercase byte might exist\n\t\t\t\t\t\t\t// as an index\n\t\t\t\t\t\t\tif out, found := n.children[i].findCaseInsensitivePathRec(\n\t\t\t\t\t\t\t\tpath, loPath, ciPath, rb, fixTrailingSlash,\n\t\t\t\t\t\t\t); found {\n\t\t\t\t\t\t\t\treturn out, true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// same for uppercase rune, if it differs\n\t\t\t\t\tif up := unicode.ToUpper(rv); up != rv {\n\t\t\t\t\t\tutf8.EncodeRune(rb[:], up)\n\t\t\t\t\t\trb = shiftNRuneBytes(rb, off)\n\n\t\t\t\t\t\tfor i := 0; i < len(n.indices); i++ {\n\t\t\t\t\t\t\t// uppercase matches\n\t\t\t\t\t\t\tif n.indices[i] == rb[0] {\n\t\t\t\t\t\t\t\t// continue with child node\n\t\t\t\t\t\t\t\tn = n.children[i]\n\t\t\t\t\t\t\t\tloNPath = strings.ToLower(n.path)\n\t\t\t\t\t\t\t\tcontinue walk\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\n\t\t\t\t// Nothing found. We can recommend to redirect to the same URL\n\t\t\t\t// without a trailing slash if a leaf exists for that path\n\t\t\t\treturn ciPath, (fixTrailingSlash && path == \"/\" && n.handle != nil)\n\t\t\t}\n\n\t\t\tn = n.children[0]\n\t\t\tswitch n.nType {\n\t\t\tcase param:\n\t\t\t\t// find param end (either '/' or path end)\n\t\t\t\tk := 0\n\t\t\t\tfor k < len(path) && path[k] != '/' {\n\t\t\t\t\tk++\n\t\t\t\t}\n\n\t\t\t\t// add param value to case insensitive path\n\t\t\t\tciPath = append(ciPath, path[:k]...)\n\n\t\t\t\t// we need to go deeper!\n\t\t\t\tif k < len(path) {\n\t\t\t\t\tif len(n.children) > 0 {\n\t\t\t\t\t\t// continue with child node\n\t\t\t\t\t\tn = n.children[0]\n\t\t\t\t\t\tloNPath = strings.ToLower(n.path)\n\t\t\t\t\t\tloPath = loPath[k:]\n\t\t\t\t\t\tpath = path[k:]\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\t// ... but we can't\n\t\t\t\t\tif fixTrailingSlash && len(path) == k+1 {\n\t\t\t\t\t\treturn ciPath, true\n\t\t\t\t\t}\n\t\t\t\t\treturn ciPath, false\n\t\t\t\t}\n\n\t\t\t\tif n.handle != nil {\n\t\t\t\t\treturn ciPath, true\n\t\t\t\t} else if fixTrailingSlash && len(n.children) == 1 {\n\t\t\t\t\t// No handle found. Check if a handle for this path + a\n\t\t\t\t\t// trailing slash exists\n\t\t\t\t\tn = n.children[0]\n\t\t\t\t\tif n.path == \"/\" && n.handle != nil {\n\t\t\t\t\t\treturn append(ciPath, '/'), true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn ciPath, false\n\n\t\t\tcase catchAll:\n\t\t\t\treturn append(ciPath, path...), true\n\n\t\t\tdefault:\n\t\t\t\tpanic(\"invalid node type\")\n\t\t\t}\n\t\t} else {\n\t\t\t// We should have reached the node containing the handle.\n\t\t\t// Check if this node has a handle registered.\n\t\t\tif n.handle != nil {\n\t\t\t\treturn ciPath, true\n\t\t\t}\n\n\t\t\t// No handle found.\n\t\t\t// Try to fix the path by adding a trailing slash\n\t\t\tif fixTrailingSlash {\n\t\t\t\tfor i := 0; i < len(n.indices); i++ {\n\t\t\t\t\tif n.indices[i] == '/' {\n\t\t\t\t\t\tn = n.children[i]\n\t\t\t\t\t\tif (len(n.path) == 1 && n.handle != nil) ||\n\t\t\t\t\t\t\t(n.nType == catchAll && n.children[0].handle != nil) {\n\t\t\t\t\t\t\treturn append(ciPath, '/'), true\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn ciPath, false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ciPath, false\n\t\t}\n\t}\n\n\t// Nothing found.\n\t// Try to fix the path by adding / removing a trailing slash\n\tif fixTrailingSlash {\n\t\tif path == \"/\" {\n\t\t\treturn ciPath, true\n\t\t}\n\t\tif len(loPath)+1 == len(loNPath) && loNPath[len(loPath)] == '/' &&\n\t\t\tloPath[1:] == loNPath[1:len(loPath)] && n.handle != nil {\n\t\t\treturn append(ciPath, n.path...), true\n\t\t}\n\t}\n\treturn ciPath, false\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/LICENSE.md",
    "content": "The components of `hid` are licensed as such:\n\n * `hidapi` is released under the [3-clause BSD](https://github.com/signal11/hidapi/blob/master/LICENSE-bsd.txt) license.\n * `libusb` is released under the [GNU LGPL 2.1](https://github.com/libusb/libusb/blob/master/COPYING)license.\n * `go.hid` is released under the [2-clause BSD](https://github.com/GeertJohan/go.hid/blob/master/LICENSE) license.\n * `gowchar` is released under the [3-clause BSD](https://github.com/orofarne/gowchar/blob/master/LICENSE) license.\n\nGiven the above, `hid` is licensed under GNU LGPL 2.1 or later on Linux and 3-clause BSD on other platforms.\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/README.md",
    "content": "[![Travis][travisimg]][travisurl]\n[![AppVeyor][appveyorimg]][appveyorurl]\n[![GoDoc][docimg]][docurl]\n\n[travisimg]:   https://travis-ci.org/karalabe/hid.svg?branch=master\n[travisurl]:   https://travis-ci.org/karalabe/hid\n[appveyorimg]: https://ci.appveyor.com/api/projects/status/plroy54odykb0ch3/branch/master?svg=true\n[appveyorurl]: https://ci.appveyor.com/project/karalabe/hid\n[docimg]:      https://godoc.org/github.com/karalabe/hid?status.svg\n[docurl]:      https://godoc.org/github.com/karalabe/hid\n\n# Gopher Interface Devices (USB HID)\n\nThe `hid` package is a cross platform library for accessing and communicating with USB Human Interface\nDevices (HID). It is an alternative package to [`gousb`](https://github.com/karalabe/gousb) for use\ncases where devices support this ligher mode of operation (e.g. input devices, hardware crypto wallets).\n\nThe package wraps [`hidapi`](https://github.com/signal11/hidapi) for accessing OS specific USB HID APIs\ndirectly instead of using low level USB constructs, which might have permission issues on some platforms.\nOn Linux the package also wraps [`libusb`](https://github.com/libusb/libusb). Both of these dependencies\nare vendored directly into the repository and wrapped using CGO, making the `hid` package self-contained\nand go-gettable.\n\nSupported platforms at the moment are Linux, macOS and Windows (exclude constraints are also specified\nfor Android and iOS to allow smoother vendoring into cross platform projects).\n\n## Cross-compiling\n\nUsing `go get` the embedded C library is compiled into the binary format of your host OS. Cross compiling to a different platform or architecture entails disabling CGO by default in Go, causing device enumeration `hid.Enumerate()` to yield no results.\n\nTo cross compile a functional version of this library, you'll need to enable CGO during cross compilation via `CGO_ENABLED=1` and you'll need to install and set a cross compilation enabled C toolkit via `CC=your-cross-gcc`.\n\n## Acknowledgements\n\nAlthough the `hid` package is an implementation from scratch, it was heavily inspired by the existing\n[`go.hid`](https://github.com/GeertJohan/go.hid) library, which seems abandoned since 2015; is incompatible\nwith Go 1.6+; and has various external dependencies. Given its inspirational roots, I thought it important\nto give credit to the author of said package too.\n\nWide character support in the `hid` package is done via the [`gowchar`](https://github.com/orofarne/gowchar)\nlibrary, unmaintained since 2013; non buildable with a modern Go release and failing `go vet` checks. As\nsuch, `gowchar` was also vendored in inline (copyright headers and origins preserved).\n\n## License\n\nThe components of `hid` are licensed as such:\n\n * `hidapi` is released under the [3-clause BSD](https://github.com/signal11/hidapi/blob/master/LICENSE-bsd.txt) license.\n * `libusb` is released under the [GNU LGPL 2.1](https://github.com/libusb/libusb/blob/master/COPYING)license.\n * `go.hid` is released under the [2-clause BSD](https://github.com/GeertJohan/go.hid/blob/master/LICENSE) license.\n * `gowchar` is released under the [3-clause BSD](https://github.com/orofarne/gowchar/blob/master/LICENSE) license.\n\nGiven the above, `hid` is licensed under GNU LGPL 2.1 or later on Linux and 3-clause BSD on other platforms.\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/appveyor.yml",
    "content": "os: Visual Studio 2015\n\n# Clone directly into GOPATH.\nclone_folder: C:\\gopath\\src\\github.com\\karalabe\\hid\nclone_depth: 1\nversion: \"{branch}.{build}\"\nenvironment:\n  global:\n    GOPATH: C:\\gopath\n    CC: gcc.exe\n  matrix:\n    - GOARCH: amd64\n      MSYS2_ARCH: x86_64\n      MSYS2_BITS: 64\n      MSYSTEM: MINGW64\n      PATH: C:\\msys64\\mingw64\\bin\\;%PATH%\n    - GOARCH: 386\n      MSYS2_ARCH: i686\n      MSYS2_BITS: 32\n      MSYSTEM: MINGW32\n      PATH: C:\\msys64\\mingw32\\bin\\;%PATH%\n\ninstall:\n  - rmdir C:\\go /s /q\n  - appveyor DownloadFile https://storage.googleapis.com/golang/go1.8.windows-%GOARCH%.zip\n  - 7z x go1.8.windows-%GOARCH%.zip -y -oC:\\ > NUL\n  - go version\n  - gcc --version\n\nbuild_script:\n  - go install ./...\n  - go test -v ./...\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hid.go",
    "content": "// hid - Gopher Interface Devices (USB HID)\n// Copyright (c) 2017 Péter Szilágyi. All rights reserved.\n//\n// This file is released under the 3-clause BSD license. Note however that Linux\n// support depends on libusb, released under GNU LGPL 2.1 or later.\n\n// Package hid provides an interface for USB HID devices.\npackage hid\n\nimport \"errors\"\n\n// ErrDeviceClosed is returned for operations where the device closed before or\n// during the execution.\nvar ErrDeviceClosed = errors.New(\"hid: device closed\")\n\n// ErrUnsupportedPlatform is returned for all operations where the underlying\n// operating system is not supported by the library.\nvar ErrUnsupportedPlatform = errors.New(\"hid: unsupported platform\")\n\n// DeviceInfo is a hidapi info structure.\ntype DeviceInfo struct {\n\tPath         string // Platform-specific device path\n\tVendorID     uint16 // Device Vendor ID\n\tProductID    uint16 // Device Product ID\n\tRelease      uint16 // Device Release Number in binary-coded decimal, also known as Device Version Number\n\tSerial       string // Serial Number\n\tManufacturer string // Manufacturer String\n\tProduct      string // Product string\n\tUsagePage    uint16 // Usage Page for this Device/Interface (Windows/Mac only)\n\tUsage        uint16 // Usage for this Device/Interface (Windows/Mac only)\n\n\t// The USB interface which this logical device\n\t// represents. Valid on both Linux implementations\n\t// in all cases, and valid on the Windows implementation\n\t// only if the device contains more than one interface.\n\tInterface int\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hid_disabled.go",
    "content": "// hid - Gopher Interface Devices (USB HID)\n// Copyright (c) 2017 Péter Szilágyi. All rights reserved.\n//\n// This file is released under the 3-clause BSD license. Note however that Linux\n// support depends on libusb, released under GNU LGPL 2.1 or later.\n\n// +build !linux,!darwin,!windows ios !cgo\n\npackage hid\n\n// Supported returns whether this platform is supported by the HID library or not.\n// The goal of this method is to allow programatically handling platforms that do\n// not support USB HID and not having to fall back to build constraints.\nfunc Supported() bool {\n\treturn false\n}\n\n// Enumerate returns a list of all the HID devices attached to the system which\n// match the vendor and product id. On platforms that this file implements the\n// function is a noop and returns an empty list always.\nfunc Enumerate(vendorID uint16, productID uint16) []DeviceInfo {\n\treturn nil\n}\n\n// Device is a live HID USB connected device handle. On platforms that this file\n// implements the type lacks the actual HID device and all methods are noop.\ntype Device struct {\n\tDeviceInfo // Embed the infos for easier access\n}\n\n// Open connects to an HID device by its path name. On platforms that this file\n// implements the method just returns an error.\nfunc (info DeviceInfo) Open() (*Device, error) {\n\treturn nil, ErrUnsupportedPlatform\n}\n\n// Close releases the HID USB device handle. On platforms that this file implements\n// the method is just a noop.\nfunc (dev *Device) Close() {}\n\n// Write sends an output report to a HID device. On platforms that this file\n// implements the method just returns an error.\nfunc (dev *Device) Write(b []byte) (int, error) {\n\treturn 0, ErrUnsupportedPlatform\n}\n\n// Read retrieves an input report from a HID device. On platforms that this file\n// implements the method just returns an error.\nfunc (dev *Device) Read(b []byte) (int, error) {\n\treturn 0, ErrUnsupportedPlatform\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hid_enabled.go",
    "content": "// hid - Gopher Interface Devices (USB HID)\n// Copyright (c) 2017 Péter Szilágyi. All rights reserved.\n//\n// This file is released under the 3-clause BSD license. Note however that Linux\n// support depends on libusb, released under LGNU GPL 2.1 or later.\n\n// +build linux,cgo darwin,!ios,cgo windows,cgo\n\npackage hid\n\n/*\n#cgo CFLAGS: -I./hidapi/hidapi\n\n#cgo linux CFLAGS: -I./libusb/libusb -DDEFAULT_VISIBILITY=\"\" -DOS_LINUX -D_GNU_SOURCE -DPOLL_NFDS_TYPE=int\n#cgo linux,!android LDFLAGS: -lrt\n#cgo darwin CFLAGS: -DOS_DARWIN\n#cgo darwin LDFLAGS: -framework CoreFoundation -framework IOKit\n#cgo windows CFLAGS: -DOS_WINDOWS\n#cgo windows LDFLAGS: -lsetupapi\n\n#ifdef OS_LINUX\n\t#include <sys/poll.h>\n\t#include \"os/threads_posix.c\"\n\t#include \"os/poll_posix.c\"\n\n\t#include \"os/linux_usbfs.c\"\n\t#include \"os/linux_netlink.c\"\n\n\t#include \"core.c\"\n\t#include \"descriptor.c\"\n\t#include \"hotplug.c\"\n\t#include \"io.c\"\n\t#include \"strerror.c\"\n\t#include \"sync.c\"\n\n\t#include \"hidapi/libusb/hid.c\"\n#elif OS_DARWIN\n\t#include \"hidapi/mac/hid.c\"\n#elif OS_WINDOWS\n\t#include \"hidapi/windows/hid.c\"\n#endif\n*/\nimport \"C\"\nimport (\n\t\"errors\"\n\t\"runtime\"\n\t\"sync\"\n\t\"unsafe\"\n)\n\n// enumerateLock is a mutex serializing access to USB device enumeration needed\n// by the macOS USB HID system calls, which require 2 consecutive method calls\n// for enumeration, causing crashes if called concurrently.\n//\n// For more details, see:\n//   https://developer.apple.com/documentation/iokit/1438371-iohidmanagersetdevicematching\n//   > \"subsequent calls will cause the hid manager to release previously enumerated devices\"\nvar enumerateLock sync.Mutex\n\nfunc init() {\n\t// Initialize the HIDAPI library\n\tC.hid_init()\n}\n\n// Supported returns whether this platform is supported by the HID library or not.\n// The goal of this method is to allow programatically handling platforms that do\n// not support USB HID and not having to fall back to build constraints.\nfunc Supported() bool {\n\treturn true\n}\n\n// Enumerate returns a list of all the HID devices attached to the system which\n// match the vendor and product id:\n//  - If the vendor id is set to 0 then any vendor matches.\n//  - If the product id is set to 0 then any product matches.\n//  - If the vendor and product id are both 0, all HID devices are returned.\nfunc Enumerate(vendorID uint16, productID uint16) []DeviceInfo {\n\tenumerateLock.Lock()\n\tdefer enumerateLock.Unlock()\n\n\t// Gather all device infos and ensure they are freed before returning\n\thead := C.hid_enumerate(C.ushort(vendorID), C.ushort(productID))\n\tif head == nil {\n\t\treturn nil\n\t}\n\tdefer C.hid_free_enumeration(head)\n\n\t// Iterate the list and retrieve the device details\n\tvar infos []DeviceInfo\n\tfor ; head != nil; head = head.next {\n\t\tinfo := DeviceInfo{\n\t\t\tPath:      C.GoString(head.path),\n\t\t\tVendorID:  uint16(head.vendor_id),\n\t\t\tProductID: uint16(head.product_id),\n\t\t\tRelease:   uint16(head.release_number),\n\t\t\tUsagePage: uint16(head.usage_page),\n\t\t\tUsage:     uint16(head.usage),\n\t\t\tInterface: int(head.interface_number),\n\t\t}\n\t\tif head.serial_number != nil {\n\t\t\tinfo.Serial, _ = wcharTToString(head.serial_number)\n\t\t}\n\t\tif head.product_string != nil {\n\t\t\tinfo.Product, _ = wcharTToString(head.product_string)\n\t\t}\n\t\tif head.manufacturer_string != nil {\n\t\t\tinfo.Manufacturer, _ = wcharTToString(head.manufacturer_string)\n\t\t}\n\t\tinfos = append(infos, info)\n\t}\n\treturn infos\n}\n\n// Open connects to an HID device by its path name.\nfunc (info DeviceInfo) Open() (*Device, error) {\n\tpath := C.CString(info.Path)\n\tdefer C.free(unsafe.Pointer(path))\n\n\tdevice := C.hid_open_path(path)\n\tif device == nil {\n\t\treturn nil, errors.New(\"hidapi: failed to open device\")\n\t}\n\treturn &Device{\n\t\tDeviceInfo: info,\n\t\tdevice:     device,\n\t}, nil\n}\n\n// Device is a live HID USB connected device handle.\ntype Device struct {\n\tDeviceInfo // Embed the infos for easier access\n\n\tdevice *C.hid_device // Low level HID device to communicate through\n\tlock   sync.Mutex\n}\n\n// Close releases the HID USB device handle.\nfunc (dev *Device) Close() {\n\tdev.lock.Lock()\n\tdefer dev.lock.Unlock()\n\n\tif dev.device != nil {\n\t\tC.hid_close(dev.device)\n\t\tdev.device = nil\n\t}\n}\n\n// Write sends an output report to a HID device.\n//\n// Write will send the data on the first OUT endpoint, if one exists. If it does\n// not, it will send the data through the Control Endpoint (Endpoint 0).\nfunc (dev *Device) Write(b []byte) (int, error) {\n\t// Abort if nothing to write\n\tif len(b) == 0 {\n\t\treturn 0, nil\n\t}\n\t// Abort if device closed in between\n\tdev.lock.Lock()\n\tdevice := dev.device\n\tdev.lock.Unlock()\n\n\tif device == nil {\n\t\treturn 0, ErrDeviceClosed\n\t}\n\t// Prepend a HID report ID on Windows, other OSes don't need it\n\tvar report []byte\n\tif runtime.GOOS == \"windows\" {\n\t\treport = append([]byte{0x00}, b...)\n\t} else {\n\t\treport = b\n\t}\n\t// Execute the write operation\n\twritten := int(C.hid_write(device, (*C.uchar)(&report[0]), C.size_t(len(report))))\n\tif written == -1 {\n\t\t// If the write failed, verify if closed or other error\n\t\tdev.lock.Lock()\n\t\tdevice = dev.device\n\t\tdev.lock.Unlock()\n\n\t\tif device == nil {\n\t\t\treturn 0, ErrDeviceClosed\n\t\t}\n\t\t// Device not closed, some other error occurred\n\t\tmessage := C.hid_error(device)\n\t\tif message == nil {\n\t\t\treturn 0, errors.New(\"hidapi: unknown failure\")\n\t\t}\n\t\tfailure, _ := wcharTToString(message)\n\t\treturn 0, errors.New(\"hidapi: \" + failure)\n\t}\n\treturn written, nil\n}\n\n// Read retrieves an input report from a HID device.\nfunc (dev *Device) Read(b []byte) (int, error) {\n\t// Aborth if nothing to read\n\tif len(b) == 0 {\n\t\treturn 0, nil\n\t}\n\t// Abort if device closed in between\n\tdev.lock.Lock()\n\tdevice := dev.device\n\tdev.lock.Unlock()\n\n\tif device == nil {\n\t\treturn 0, ErrDeviceClosed\n\t}\n\t// Execute the read operation\n\tread := int(C.hid_read(device, (*C.uchar)(&b[0]), C.size_t(len(b))))\n\tif read == -1 {\n\t\t// If the read failed, verify if closed or other error\n\t\tdev.lock.Lock()\n\t\tdevice = dev.device\n\t\tdev.lock.Unlock()\n\n\t\tif device == nil {\n\t\t\treturn 0, ErrDeviceClosed\n\t\t}\n\t\t// Device not closed, some other error occurred\n\t\tmessage := C.hid_error(device)\n\t\tif message == nil {\n\t\t\treturn 0, errors.New(\"hidapi: unknown failure\")\n\t\t}\n\t\tfailure, _ := wcharTToString(message)\n\t\treturn 0, errors.New(\"hidapi: \" + failure)\n\t}\n\treturn read, nil\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/AUTHORS.txt",
    "content": "\nHIDAPI Authors:\n\nAlan Ott <alan@signal11.us>:\n\tOriginal Author and Maintainer\n\tLinux, Windows, and Mac implementations\n\nLudovic Rousseau <rousseau@debian.org>:\n\tFormatting for Doxygen documentation\n\tBug fixes\n\tCorrectness fixes\n\n\nFor a comprehensive list of contributions, see the commit list at github:\n\thttp://github.com/signal11/hidapi/commits/master\n\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/LICENSE-bsd.txt",
    "content": "Copyright (c) 2010, Alan Ott, Signal 11 Software\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n    * 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    * Neither the name of Signal 11 Software nor the names of its\n      contributors may be used to endorse or promote products derived from\n      this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/LICENSE-gpl3.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/LICENSE-orig.txt",
    "content": " HIDAPI - Multi-Platform library for\n communication with HID devices.\n\n Copyright 2009, Alan Ott, Signal 11 Software.\n All Rights Reserved.\n \n This software may be used by anyone for any reason so\n long as the copyright notice in the source files\n remains intact.\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/LICENSE.txt",
    "content": "HIDAPI can be used under one of three licenses.\n\n1. The GNU General Public License, version 3.0, in LICENSE-gpl3.txt\n2. A BSD-Style License, in LICENSE-bsd.txt.\n3. The more liberal original HIDAPI license. LICENSE-orig.txt\n\nThe license chosen is at the discretion of the user of HIDAPI. For example:\n1. An author of GPL software would likely use HIDAPI under the terms of the\nGPL.\n\n2. An author of commercial closed-source software would likely use HIDAPI\nunder the terms of the BSD-style license or the original HIDAPI license.\n\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/README.txt",
    "content": "         HIDAPI library for Windows, Linux, FreeBSD and Mac OS X\n        =========================================================\n\nAbout\n======\n\nHIDAPI is a multi-platform library which allows an application to interface\nwith USB and Bluetooth HID-Class devices on Windows, Linux, FreeBSD, and Mac\nOS X.  HIDAPI can be either built as a shared library (.so or .dll) or\ncan be embedded directly into a target application by adding a single source\nfile (per platform) and a single header.\n\nHIDAPI has four back-ends:\n\t* Windows (using hid.dll)\n\t* Linux/hidraw (using the Kernel's hidraw driver)\n\t* Linux/libusb (using libusb-1.0)\n\t* FreeBSD (using libusb-1.0)\n\t* Mac (using IOHidManager)\n\nOn Linux, either the hidraw or the libusb back-end can be used. There are\ntradeoffs, and the functionality supported is slightly different.\n\nLinux/hidraw (linux/hid.c):\nThis back-end uses the hidraw interface in the Linux kernel.  While this\nback-end will support both USB and Bluetooth, it has some limitations on\nkernels prior to 2.6.39, including the inability to send or receive feature\nreports.  In addition, it will only communicate with devices which have\nhidraw nodes associated with them.  Keyboards, mice, and some other devices\nwhich are blacklisted from having hidraw nodes will not work. Fortunately,\nfor nearly all the uses of hidraw, this is not a problem.\n\nLinux/FreeBSD/libusb (libusb/hid.c):\nThis back-end uses libusb-1.0 to communicate directly to a USB device. This\nback-end will of course not work with Bluetooth devices.\n\nHIDAPI also comes with a Test GUI. The Test GUI is cross-platform and uses\nFox Toolkit (http://www.fox-toolkit.org).  It will build on every platform\nwhich HIDAPI supports.  Since it relies on a 3rd party library, building it\nis optional but recommended because it is so useful when debugging hardware.\n\nWhat Does the API Look Like?\n=============================\nThe API provides the the most commonly used HID functions including sending\nand receiving of input, output, and feature reports.  The sample program,\nwhich communicates with a heavily hacked up version of the Microchip USB\nGeneric HID sample looks like this (with error checking removed for\nsimplicity):\n\n#ifdef WIN32\n#include <windows.h>\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#include \"hidapi.h\"\n\n#define MAX_STR 255\n\nint main(int argc, char* argv[])\n{\n\tint res;\n\tunsigned char buf[65];\n\twchar_t wstr[MAX_STR];\n\thid_device *handle;\n\tint i;\n\n\t// Initialize the hidapi library\n\tres = hid_init();\n\n\t// Open the device using the VID, PID,\n\t// and optionally the Serial number.\n\thandle = hid_open(0x4d8, 0x3f, NULL);\n\n\t// Read the Manufacturer String\n\tres = hid_get_manufacturer_string(handle, wstr, MAX_STR);\n\twprintf(L\"Manufacturer String: %s\\n\", wstr);\n\n\t// Read the Product String\n\tres = hid_get_product_string(handle, wstr, MAX_STR);\n\twprintf(L\"Product String: %s\\n\", wstr);\n\n\t// Read the Serial Number String\n\tres = hid_get_serial_number_string(handle, wstr, MAX_STR);\n\twprintf(L\"Serial Number String: (%d) %s\\n\", wstr[0], wstr);\n\n\t// Read Indexed String 1\n\tres = hid_get_indexed_string(handle, 1, wstr, MAX_STR);\n\twprintf(L\"Indexed String 1: %s\\n\", wstr);\n\n\t// Toggle LED (cmd 0x80). The first byte is the report number (0x0).\n\tbuf[0] = 0x0;\n\tbuf[1] = 0x80;\n\tres = hid_write(handle, buf, 65);\n\n\t// Request state (cmd 0x81). The first byte is the report number (0x0).\n\tbuf[0] = 0x0;\n\tbuf[1] = 0x81;\n\tres = hid_write(handle, buf, 65);\n\n\t// Read requested state\n\tres = hid_read(handle, buf, 65);\n\n\t// Print out the returned buffer.\n\tfor (i = 0; i < 4; i++)\n\t\tprintf(\"buf[%d]: %d\\n\", i, buf[i]);\n\n\t// Finalize the hidapi library\n\tres = hid_exit();\n\n\treturn 0;\n}\n\nIf you have your own simple test programs which communicate with standard\nhardware development boards (such as those from Microchip, TI, Atmel,\nFreeScale and others), please consider sending me something like the above\nfor inclusion into the HIDAPI source.  This will help others who have the\nsame hardware as you do.\n\nLicense\n========\nHIDAPI may be used by one of three licenses as outlined in LICENSE.txt.\n\nDownload\n=========\nHIDAPI can be downloaded from github\n\tgit clone git://github.com/signal11/hidapi.git\n\nBuild Instructions\n===================\n\nThis section is long. Don't be put off by this. It's not long because it's\ncomplicated to build HIDAPI; it's quite the opposite.  This section is long\nbecause of the flexibility of HIDAPI and the large number of ways in which\nit can be built and used.  You will likely pick a single build method.\n\nHIDAPI can be built in several different ways. If you elect to build a\nshared library, you will need to build it from the HIDAPI source\ndistribution.  If you choose instead to embed HIDAPI directly into your\napplication, you can skip the building and look at the provided platform\nMakefiles for guidance.  These platform Makefiles are located in linux/\nlibusb/ mac/ and windows/ and are called Makefile-manual.  In addition,\nVisual Studio projects are provided.  Even if you're going to embed HIDAPI\ninto your project, it is still beneficial to build the example programs.\n\n\nPrerequisites:\n---------------\n\n\tLinux:\n\t-------\n\tOn Linux, you will need to install development packages for libudev,\n\tlibusb and optionally Fox-toolkit (for the test GUI). On\n\tDebian/Ubuntu systems these can be installed by running:\n\t    sudo apt-get install libudev-dev libusb-1.0-0-dev libfox-1.6-dev\n\n\tIf you downloaded the source directly from the git repository (using\n\tgit clone), you'll need Autotools:\n\t    sudo apt-get install autotools-dev autoconf automake libtool\n\n\tFreeBSD:\n\t---------\n\tOn FreeBSD you will need to install GNU make, libiconv, and\n\toptionally Fox-Toolkit (for the test GUI). This is done by running\n\tthe following:\n\t    pkg_add -r gmake libiconv fox16\n\n\tIf you downloaded the source directly from the git repository (using\n\tgit clone), you'll need Autotools:\n\t    pkg_add -r autotools\n\n\tMac:\n\t-----\n\tOn Mac, you will need to install Fox-Toolkit if you wish to build\n\tthe Test GUI. There are two ways to do this, and each has a slight\n\tcomplication. Which method you use depends on your use case.\n\n\tIf you wish to build the Test GUI just for your own testing on your\n\town computer, then the easiest method is to install Fox-Toolkit\n\tusing ports:\n\t\tsudo port install fox\n\n\tIf you wish to build the TestGUI app bundle to redistribute to\n\tothers, you will need to install Fox-toolkit from source.  This is\n\tbecause the version of fox that gets installed using ports uses the\n\tports X11 libraries which are not compatible with the Apple X11\n\tlibraries.  If you install Fox with ports and then try to distribute\n\tyour built app bundle, it will simply fail to run on other systems.\n\tTo install Fox-Toolkit manually, download the source package from\n\thttp://www.fox-toolkit.org, extract it, and run the following from\n\twithin the extracted source:\n\t\t./configure && make && make install\n\n\tWindows:\n\t---------\n\tOn Windows, if you want to build the test GUI, you will need to get\n\tthe hidapi-externals.zip package from the download site.  This\n\tcontains pre-built binaries for Fox-toolkit.  Extract\n\thidapi-externals.zip just outside of hidapi, so that\n\thidapi-externals and hidapi are on the same level, as shown:\n\n\t     Parent_Folder\n\t       |\n\t       +hidapi\n\t       +hidapi-externals\n\n\tAgain, this step is not required if you do not wish to build the\n\ttest GUI.\n\n\nBuilding HIDAPI into a shared library on Unix Platforms:\n---------------------------------------------------------\n\nOn Unix-like systems such as Linux, FreeBSD, Mac, and even Windows, using\nMingw or Cygwin, the easiest way to build a standard system-installed shared\nlibrary is to use the GNU Autotools build system.  If you checked out the\nsource from the git repository, run the following:\n\n\t./bootstrap\n\t./configure\n\tmake\n\tmake install     <----- as root, or using sudo\n\nIf you downloaded a source package (ie: if you did not run git clone), you\ncan skip the ./bootstrap step.\n\n./configure can take several arguments which control the build. The two most\nlikely to be used are:\n\t--enable-testgui\n\t\tEnable build of the Test GUI. This requires Fox toolkit to\n\t\tbe installed.  Instructions for installing Fox-Toolkit on\n\t\teach platform are in the Prerequisites section above.\n\n\t--prefix=/usr\n\t\tSpecify where you want the output headers and libraries to\n\t\tbe installed. The example above will put the headers in\n\t\t/usr/include and the binaries in /usr/lib. The default is to\n\t\tinstall into /usr/local which is fine on most systems.\n\nBuilding the manual way on Unix platforms:\n-------------------------------------------\n\nManual Makefiles are provided mostly to give the user and idea what it takes\nto build a program which embeds HIDAPI directly inside of it. These should\nreally be used as examples only. If you want to build a system-wide shared\nlibrary, use the Autotools method described above.\n\n\tTo build HIDAPI using the manual makefiles, change to the directory\n\tof your platform and run make. For example, on Linux run:\n\t\tcd linux/\n\t\tmake -f Makefile-manual\n\n\tTo build the Test GUI using the manual makefiles:\n\t\tcd testgui/\n\t\tmake -f Makefile-manual\n\nBuilding on Windows:\n---------------------\n\nTo build the HIDAPI DLL on Windows using Visual Studio, build the .sln file\nin the windows/ directory.\n\nTo build the Test GUI on windows using Visual Studio, build the .sln file in\nthe testgui/ directory.\n\nTo build HIDAPI using MinGW or Cygwin using Autotools, use the instructions\nin the section titled \"Building HIDAPI into a shared library on Unix\nPlatforms\" above.  Note that building the Test GUI with MinGW or Cygwin will\nrequire the Windows procedure in the Prerequisites section above (ie:\nhidapi-externals.zip).\n\nTo build HIDAPI using MinGW using the Manual Makefiles, see the section\n\"Building the manual way on Unix platforms\" above.\n\nHIDAPI can also be built using the Windows DDK (now also called the Windows\nDriver Kit or WDK). This method was originally required for the HIDAPI build\nbut not anymore. However, some users still prefer this method. It is not as\nwell supported anymore but should still work. Patches are welcome if it does\nnot. To build using the DDK:\n\n   1. Install the Windows Driver Kit (WDK) from Microsoft.\n   2. From the Start menu, in the Windows Driver Kits folder, select Build\n      Environments, then your operating system, then the x86 Free Build\n      Environment (or one that is appropriate for your system).\n   3. From the console, change directory to the windows/ddk_build/ directory,\n      which is part of the HIDAPI distribution.\n   4. Type build.\n   5. You can find the output files (DLL and LIB) in a subdirectory created\n      by the build system which is appropriate for your environment. On\n      Windows XP, this directory is objfre_wxp_x86/i386.\n\nCross Compiling\n================\n\nThis section talks about cross compiling HIDAPI for Linux using autotools.\nThis is useful for using HIDAPI on embedded Linux targets.  These\ninstructions assume the most raw kind of embedded Linux build, where all\nprerequisites will need to be built first.  This process will of course vary\nbased on your embedded Linux build system if you are using one, such as\nOpenEmbedded or Buildroot.\n\nFor the purpose of this section, it will be assumed that the following\nenvironment variables are exported.\n\n\t$ export STAGING=$HOME/out\n\t$ export HOST=arm-linux\n\nSTAGING and HOST can be modified to suit your setup.\n\nPrerequisites\n--------------\n\nNote that the build of libudev is the very basic configuration.\n\nBuild Libusb. From the libusb source directory, run:\n\t./configure --host=$HOST --prefix=$STAGING\n\tmake\n\tmake install\n\nBuild libudev. From the libudev source directory, run:\n\t./configure --disable-gudev --disable-introspection --disable-hwdb \\\n\t\t --host=$HOST --prefix=$STAGING\n\tmake\n\tmake install\n\nBuilding HIDAPI\n----------------\n\nBuild HIDAPI:\n\n\tPKG_CONFIG_DIR= \\\n\tPKG_CONFIG_LIBDIR=$STAGING/lib/pkgconfig:$STAGING/share/pkgconfig \\\n\tPKG_CONFIG_SYSROOT_DIR=$STAGING \\\n\t./configure --host=$HOST --prefix=$STAGING\n\n\nSignal 11 Software - 2010-04-11\n                     2010-07-28\n                     2011-09-10\n                     2012-05-01\n                     2012-07-03\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/hidapi/hidapi.h",
    "content": "/*******************************************************\n HIDAPI - Multi-Platform library for\n communication with HID devices.\n\n Alan Ott\n Signal 11 Software\n\n 8/22/2009\n\n Copyright 2009, All Rights Reserved.\n\n At the discretion of the user of this library,\n this software may be licensed under the terms of the\n GNU General Public License v3, a BSD-Style license, or the\n original HIDAPI license as outlined in the LICENSE.txt,\n LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt\n files located at the root of the source distribution.\n These files may also be found in the public source\n code repository located at:\n        http://github.com/signal11/hidapi .\n********************************************************/\n\n/** @file\n * @defgroup API hidapi API\n */\n\n#ifndef HIDAPI_H__\n#define HIDAPI_H__\n\n#include <wchar.h>\n\n#ifdef _WIN32\n      #define HID_API_EXPORT __declspec(dllexport)\n      #define HID_API_CALL\n#else\n      #define HID_API_EXPORT /**< API export macro */\n      #define HID_API_CALL /**< API call macro */\n#endif\n\n#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\t\tstruct hid_device_;\n\t\ttypedef struct hid_device_ hid_device; /**< opaque hidapi structure */\n\n\t\t/** hidapi info structure */\n\t\tstruct hid_device_info {\n\t\t\t/** Platform-specific device path */\n\t\t\tchar *path;\n\t\t\t/** Device Vendor ID */\n\t\t\tunsigned short vendor_id;\n\t\t\t/** Device Product ID */\n\t\t\tunsigned short product_id;\n\t\t\t/** Serial Number */\n\t\t\twchar_t *serial_number;\n\t\t\t/** Device Release Number in binary-coded decimal,\n\t\t\t    also known as Device Version Number */\n\t\t\tunsigned short release_number;\n\t\t\t/** Manufacturer String */\n\t\t\twchar_t *manufacturer_string;\n\t\t\t/** Product string */\n\t\t\twchar_t *product_string;\n\t\t\t/** Usage Page for this Device/Interface\n\t\t\t    (Windows/Mac only). */\n\t\t\tunsigned short usage_page;\n\t\t\t/** Usage for this Device/Interface\n\t\t\t    (Windows/Mac only).*/\n\t\t\tunsigned short usage;\n\t\t\t/** The USB interface which this logical device\n\t\t\t    represents. Valid on both Linux implementations\n\t\t\t    in all cases, and valid on the Windows implementation\n\t\t\t    only if the device contains more than one interface. */\n\t\t\tint interface_number;\n\n\t\t\t/** Pointer to the next device */\n\t\t\tstruct hid_device_info *next;\n\t\t};\n\n\n\t\t/** @brief Initialize the HIDAPI library.\n\n\t\t\tThis function initializes the HIDAPI library. Calling it is not\n\t\t\tstrictly necessary, as it will be called automatically by\n\t\t\thid_enumerate() and any of the hid_open_*() functions if it is\n\t\t\tneeded.  This function should be called at the beginning of\n\t\t\texecution however, if there is a chance of HIDAPI handles\n\t\t\tbeing opened by different threads simultaneously.\n\t\t\t\n\t\t\t@ingroup API\n\n\t\t\t@returns\n\t\t\t\tThis function returns 0 on success and -1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT HID_API_CALL hid_init(void);\n\n\t\t/** @brief Finalize the HIDAPI library.\n\n\t\t\tThis function frees all of the static data associated with\n\t\t\tHIDAPI. It should be called at the end of execution to avoid\n\t\t\tmemory leaks.\n\n\t\t\t@ingroup API\n\n\t\t    @returns\n\t\t\t\tThis function returns 0 on success and -1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT HID_API_CALL hid_exit(void);\n\n\t\t/** @brief Enumerate the HID Devices.\n\n\t\t\tThis function returns a linked list of all the HID devices\n\t\t\tattached to the system which match vendor_id and product_id.\n\t\t\tIf @p vendor_id is set to 0 then any vendor matches.\n\t\t\tIf @p product_id is set to 0 then any product matches.\n\t\t\tIf @p vendor_id and @p product_id are both set to 0, then\n\t\t\tall HID devices will be returned.\n\n\t\t\t@ingroup API\n\t\t\t@param vendor_id The Vendor ID (VID) of the types of device\n\t\t\t\tto open.\n\t\t\t@param product_id The Product ID (PID) of the types of\n\t\t\t\tdevice to open.\n\n\t\t    @returns\n\t\t    \tThis function returns a pointer to a linked list of type\n\t\t    \tstruct #hid_device, containing information about the HID devices\n\t\t    \tattached to the system, or NULL in the case of failure. Free\n\t\t    \tthis linked list by calling hid_free_enumeration().\n\t\t*/\n\t\tstruct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id);\n\n\t\t/** @brief Free an enumeration Linked List\n\n\t\t    This function frees a linked list created by hid_enumerate().\n\n\t\t\t@ingroup API\n\t\t    @param devs Pointer to a list of struct_device returned from\n\t\t    \t      hid_enumerate().\n\t\t*/\n\t\tvoid  HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs);\n\n\t\t/** @brief Open a HID device using a Vendor ID (VID), Product ID\n\t\t\t(PID) and optionally a serial number.\n\n\t\t\tIf @p serial_number is NULL, the first device with the\n\t\t\tspecified VID and PID is opened.\n\n\t\t\t@ingroup API\n\t\t\t@param vendor_id The Vendor ID (VID) of the device to open.\n\t\t\t@param product_id The Product ID (PID) of the device to open.\n\t\t\t@param serial_number The Serial Number of the device to open\n\t\t\t\t               (Optionally NULL).\n\n\t\t\t@returns\n\t\t\t\tThis function returns a pointer to a #hid_device object on\n\t\t\t\tsuccess or NULL on failure.\n\t\t*/\n\t\tHID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number);\n\n\t\t/** @brief Open a HID device by its path name.\n\n\t\t\tThe path name be determined by calling hid_enumerate(), or a\n\t\t\tplatform-specific path name can be used (eg: /dev/hidraw0 on\n\t\t\tLinux).\n\n\t\t\t@ingroup API\n\t\t    @param path The path name of the device to open\n\n\t\t\t@returns\n\t\t\t\tThis function returns a pointer to a #hid_device object on\n\t\t\t\tsuccess or NULL on failure.\n\t\t*/\n\t\tHID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path);\n\n\t\t/** @brief Write an Output report to a HID device.\n\n\t\t\tThe first byte of @p data[] must contain the Report ID. For\n\t\t\tdevices which only support a single report, this must be set\n\t\t\tto 0x0. The remaining bytes contain the report data. Since\n\t\t\tthe Report ID is mandatory, calls to hid_write() will always\n\t\t\tcontain one more byte than the report contains. For example,\n\t\t\tif a hid report is 16 bytes long, 17 bytes must be passed to\n\t\t\thid_write(), the Report ID (or 0x0, for devices with a\n\t\t\tsingle report), followed by the report data (16 bytes). In\n\t\t\tthis example, the length passed in would be 17.\n\n\t\t\thid_write() will send the data on the first OUT endpoint, if\n\t\t\tone exists. If it does not, it will send the data through\n\t\t\tthe Control Endpoint (Endpoint 0).\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param data The data to send, including the report number as\n\t\t\t\tthe first byte.\n\t\t\t@param length The length in bytes of the data to send.\n\n\t\t\t@returns\n\t\t\t\tThis function returns the actual number of bytes written and\n\t\t\t\t-1 on error.\n\t\t*/\n\t\tint  HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length);\n\n\t\t/** @brief Read an Input report from a HID device with timeout.\n\n\t\t\tInput reports are returned\n\t\t\tto the host through the INTERRUPT IN endpoint. The first byte will\n\t\t\tcontain the Report number if the device uses numbered reports.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param data A buffer to put the read data into.\n\t\t\t@param length The number of bytes to read. For devices with\n\t\t\t\tmultiple reports, make sure to read an extra byte for\n\t\t\t\tthe report number.\n\t\t\t@param milliseconds timeout in milliseconds or -1 for blocking wait.\n\n\t\t\t@returns\n\t\t\t\tThis function returns the actual number of bytes read and\n\t\t\t\t-1 on error. If no packet was available to be read within\n\t\t\t\tthe timeout period, this function returns 0.\n\t\t*/\n\t\tint HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds);\n\n\t\t/** @brief Read an Input report from a HID device.\n\n\t\t\tInput reports are returned\n\t\t    to the host through the INTERRUPT IN endpoint. The first byte will\n\t\t\tcontain the Report number if the device uses numbered reports.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param data A buffer to put the read data into.\n\t\t\t@param length The number of bytes to read. For devices with\n\t\t\t\tmultiple reports, make sure to read an extra byte for\n\t\t\t\tthe report number.\n\n\t\t\t@returns\n\t\t\t\tThis function returns the actual number of bytes read and\n\t\t\t\t-1 on error. If no packet was available to be read and\n\t\t\t\tthe handle is in non-blocking mode, this function returns 0.\n\t\t*/\n\t\tint  HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length);\n\n\t\t/** @brief Set the device handle to be non-blocking.\n\n\t\t\tIn non-blocking mode calls to hid_read() will return\n\t\t\timmediately with a value of 0 if there is no data to be\n\t\t\tread. In blocking mode, hid_read() will wait (block) until\n\t\t\tthere is data to read before returning.\n\n\t\t\tNonblocking can be turned on and off at any time.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param nonblock enable or not the nonblocking reads\n\t\t\t - 1 to enable nonblocking\n\t\t\t - 0 to disable nonblocking.\n\n\t\t\t@returns\n\t\t\t\tThis function returns 0 on success and -1 on error.\n\t\t*/\n\t\tint  HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock);\n\n\t\t/** @brief Send a Feature report to the device.\n\n\t\t\tFeature reports are sent over the Control endpoint as a\n\t\t\tSet_Report transfer.  The first byte of @p data[] must\n\t\t\tcontain the Report ID. For devices which only support a\n\t\t\tsingle report, this must be set to 0x0. The remaining bytes\n\t\t\tcontain the report data. Since the Report ID is mandatory,\n\t\t\tcalls to hid_send_feature_report() will always contain one\n\t\t\tmore byte than the report contains. For example, if a hid\n\t\t\treport is 16 bytes long, 17 bytes must be passed to\n\t\t\thid_send_feature_report(): the Report ID (or 0x0, for\n\t\t\tdevices which do not use numbered reports), followed by the\n\t\t\treport data (16 bytes). In this example, the length passed\n\t\t\tin would be 17.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param data The data to send, including the report number as\n\t\t\t\tthe first byte.\n\t\t\t@param length The length in bytes of the data to send, including\n\t\t\t\tthe report number.\n\n\t\t\t@returns\n\t\t\t\tThis function returns the actual number of bytes written and\n\t\t\t\t-1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length);\n\n\t\t/** @brief Get a feature report from a HID device.\n\n\t\t\tSet the first byte of @p data[] to the Report ID of the\n\t\t\treport to be read.  Make sure to allow space for this\n\t\t\textra byte in @p data[]. Upon return, the first byte will\n\t\t\tstill contain the Report ID, and the report data will\n\t\t\tstart in data[1].\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param data A buffer to put the read data into, including\n\t\t\t\tthe Report ID. Set the first byte of @p data[] to the\n\t\t\t\tReport ID of the report to be read, or set it to zero\n\t\t\t\tif your device does not use numbered reports.\n\t\t\t@param length The number of bytes to read, including an\n\t\t\t\textra byte for the report ID. The buffer can be longer\n\t\t\t\tthan the actual report.\n\n\t\t\t@returns\n\t\t\t\tThis function returns the number of bytes read plus\n\t\t\t\tone for the report ID (which is still in the first\n\t\t\t\tbyte), or -1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length);\n\n\t\t/** @brief Close a HID device.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t*/\n\t\tvoid HID_API_EXPORT HID_API_CALL hid_close(hid_device *device);\n\n\t\t/** @brief Get The Manufacturer String from a HID device.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param string A wide string buffer to put the data into.\n\t\t\t@param maxlen The length of the buffer in multiples of wchar_t.\n\n\t\t\t@returns\n\t\t\t\tThis function returns 0 on success and -1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen);\n\n\t\t/** @brief Get The Product String from a HID device.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param string A wide string buffer to put the data into.\n\t\t\t@param maxlen The length of the buffer in multiples of wchar_t.\n\n\t\t\t@returns\n\t\t\t\tThis function returns 0 on success and -1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen);\n\n\t\t/** @brief Get The Serial Number String from a HID device.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param string A wide string buffer to put the data into.\n\t\t\t@param maxlen The length of the buffer in multiples of wchar_t.\n\n\t\t\t@returns\n\t\t\t\tThis function returns 0 on success and -1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen);\n\n\t\t/** @brief Get a string from a HID device, based on its string index.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\t\t\t@param string_index The index of the string to get.\n\t\t\t@param string A wide string buffer to put the data into.\n\t\t\t@param maxlen The length of the buffer in multiples of wchar_t.\n\n\t\t\t@returns\n\t\t\t\tThis function returns 0 on success and -1 on error.\n\t\t*/\n\t\tint HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen);\n\n\t\t/** @brief Get a string describing the last error which occurred.\n\n\t\t\t@ingroup API\n\t\t\t@param device A device handle returned from hid_open().\n\n\t\t\t@returns\n\t\t\t\tThis function returns a string containing the last error\n\t\t\t\twhich occurred or NULL if none has occurred.\n\t\t*/\n\t\tHID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/libusb/hid.c",
    "content": "/*******************************************************\n HIDAPI - Multi-Platform library for\n communication with HID devices.\n\n Alan Ott\n Signal 11 Software\n\n 8/22/2009\n Linux Version - 6/2/2010\n Libusb Version - 8/13/2010\n FreeBSD Version - 11/1/2011\n\n Copyright 2009, All Rights Reserved.\n\n At the discretion of the user of this library,\n this software may be licensed under the terms of the\n GNU General Public License v3, a BSD-Style license, or the\n original HIDAPI license as outlined in the LICENSE.txt,\n LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt\n files located at the root of the source distribution.\n These files may also be found in the public source\n code repository located at:\n        http://github.com/signal11/hidapi .\n********************************************************/\n\n/* C */\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <ctype.h>\n#include <locale.h>\n#include <errno.h>\n\n/* Unix */\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <sys/ioctl.h>\n#include <sys/utsname.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <wchar.h>\n\n/* GNU / LibUSB */\n#include <libusb.h>\n#ifndef __ANDROID__\n#include <iconv.h>\n#endif\n\n#include \"hidapi.h\"\n\n#ifdef __ANDROID__\n\n/* Barrier implementation because Android/Bionic don't have pthread_barrier.\n   This implementation came from Brent Priddy and was posted on\n   StackOverflow. It is used with his permission. */\ntypedef int pthread_barrierattr_t;\ntypedef struct pthread_barrier {\n    pthread_mutex_t mutex;\n    pthread_cond_t cond;\n    int count;\n    int trip_count;\n} pthread_barrier_t;\n\nstatic int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count)\n{\n\tif(count == 0) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\n\tif(pthread_mutex_init(&barrier->mutex, 0) < 0) {\n\t\treturn -1;\n\t}\n\tif(pthread_cond_init(&barrier->cond, 0) < 0) {\n\t\tpthread_mutex_destroy(&barrier->mutex);\n\t\treturn -1;\n\t}\n\tbarrier->trip_count = count;\n\tbarrier->count = 0;\n\n\treturn 0;\n}\n\nstatic int pthread_barrier_destroy(pthread_barrier_t *barrier)\n{\n\tpthread_cond_destroy(&barrier->cond);\n\tpthread_mutex_destroy(&barrier->mutex);\n\treturn 0;\n}\n\nstatic int pthread_barrier_wait(pthread_barrier_t *barrier)\n{\n\tpthread_mutex_lock(&barrier->mutex);\n\t++(barrier->count);\n\tif(barrier->count >= barrier->trip_count)\n\t{\n\t\tbarrier->count = 0;\n\t\tpthread_cond_broadcast(&barrier->cond);\n\t\tpthread_mutex_unlock(&barrier->mutex);\n\t\treturn 1;\n\t}\n\telse\n\t{\n\t\tpthread_cond_wait(&barrier->cond, &(barrier->mutex));\n\t\tpthread_mutex_unlock(&barrier->mutex);\n\t\treturn 0;\n\t}\n}\n\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef DEBUG_PRINTF\n#define LOG(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define LOG(...) do {} while (0)\n#endif\n\n#ifndef __FreeBSD__\n#define DETACH_KERNEL_DRIVER\n#endif\n\n/* Uncomment to enable the retrieval of Usage and Usage Page in\nhid_enumerate(). Warning, on platforms different from FreeBSD\nthis is very invasive as it requires the detach\nand re-attach of the kernel driver. See comments inside hid_enumerate().\nlibusb HIDAPI programs are encouraged to use the interface number\ninstead to differentiate between interfaces on a composite HID device. */\n/*#define INVASIVE_GET_USAGE*/\n\n/* Linked List of input reports received from the device. */\nstruct input_report {\n\tuint8_t *data;\n\tsize_t len;\n\tstruct input_report *next;\n};\n\n\nstruct hid_device_ {\n\t/* Handle to the actual device. */\n\tlibusb_device_handle *device_handle;\n\n\t/* Endpoint information */\n\tint input_endpoint;\n\tint output_endpoint;\n\tint input_ep_max_packet_size;\n\n\t/* The interface number of the HID */\n\tint interface;\n\n\t/* Indexes of Strings */\n\tint manufacturer_index;\n\tint product_index;\n\tint serial_index;\n\n\t/* Whether blocking reads are used */\n\tint blocking; /* boolean */\n\n\t/* Read thread objects */\n\tpthread_t thread;\n\tpthread_mutex_t mutex; /* Protects input_reports */\n\tpthread_cond_t condition;\n\tpthread_barrier_t barrier; /* Ensures correct startup sequence */\n\tint shutdown_thread;\n\tint cancelled;\n\tstruct libusb_transfer *transfer;\n\n\t/* List of received input reports. */\n\tstruct input_report *input_reports;\n};\n\nstatic libusb_context *usb_context = NULL;\n\nuint16_t get_usb_code_for_current_locale(void);\nstatic int return_data(hid_device *dev, unsigned char *data, size_t length);\n\nstatic hid_device *new_hid_device(void)\n{\n\thid_device *dev = calloc(1, sizeof(hid_device));\n\tdev->blocking = 1;\n\n\tpthread_mutex_init(&dev->mutex, NULL);\n\tpthread_cond_init(&dev->condition, NULL);\n\tpthread_barrier_init(&dev->barrier, NULL, 2);\n\n\treturn dev;\n}\n\nstatic void free_hid_device(hid_device *dev)\n{\n\t/* Clean up the thread objects */\n\tpthread_barrier_destroy(&dev->barrier);\n\tpthread_cond_destroy(&dev->condition);\n\tpthread_mutex_destroy(&dev->mutex);\n\n\t/* Free the device itself */\n\tfree(dev);\n}\n\n#if 0\n/*TODO: Implement this funciton on hidapi/libusb.. */\nstatic void register_error(hid_device *device, const char *op)\n{\n\n}\n#endif\n\n#ifdef INVASIVE_GET_USAGE\n/* Get bytes from a HID Report Descriptor.\n   Only call with a num_bytes of 0, 1, 2, or 4. */\nstatic uint32_t get_bytes(uint8_t *rpt, size_t len, size_t num_bytes, size_t cur)\n{\n\t/* Return if there aren't enough bytes. */\n\tif (cur + num_bytes >= len)\n\t\treturn 0;\n\n\tif (num_bytes == 0)\n\t\treturn 0;\n\telse if (num_bytes == 1) {\n\t\treturn rpt[cur+1];\n\t}\n\telse if (num_bytes == 2) {\n\t\treturn (rpt[cur+2] * 256 + rpt[cur+1]);\n\t}\n\telse if (num_bytes == 4) {\n\t\treturn (rpt[cur+4] * 0x01000000 +\n\t\t        rpt[cur+3] * 0x00010000 +\n\t\t        rpt[cur+2] * 0x00000100 +\n\t\t        rpt[cur+1] * 0x00000001);\n\t}\n\telse\n\t\treturn 0;\n}\n\n/* Retrieves the device's Usage Page and Usage from the report\n   descriptor. The algorithm is simple, as it just returns the first\n   Usage and Usage Page that it finds in the descriptor.\n   The return value is 0 on success and -1 on failure. */\nstatic int get_usage(uint8_t *report_descriptor, size_t size,\n                     unsigned short *usage_page, unsigned short *usage)\n{\n\tunsigned int i = 0;\n\tint size_code;\n\tint data_len, key_size;\n\tint usage_found = 0, usage_page_found = 0;\n\n\twhile (i < size) {\n\t\tint key = report_descriptor[i];\n\t\tint key_cmd = key & 0xfc;\n\n\t\t//printf(\"key: %02hhx\\n\", key);\n\n\t\tif ((key & 0xf0) == 0xf0) {\n\t\t\t/* This is a Long Item. The next byte contains the\n\t\t\t   length of the data section (value) for this key.\n\t\t\t   See the HID specification, version 1.11, section\n\t\t\t   6.2.2.3, titled \"Long Items.\" */\n\t\t\tif (i+1 < size)\n\t\t\t\tdata_len = report_descriptor[i+1];\n\t\t\telse\n\t\t\t\tdata_len = 0; /* malformed report */\n\t\t\tkey_size = 3;\n\t\t}\n\t\telse {\n\t\t\t/* This is a Short Item. The bottom two bits of the\n\t\t\t   key contain the size code for the data section\n\t\t\t   (value) for this key.  Refer to the HID\n\t\t\t   specification, version 1.11, section 6.2.2.2,\n\t\t\t   titled \"Short Items.\" */\n\t\t\tsize_code = key & 0x3;\n\t\t\tswitch (size_code) {\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\t\tdata_len = size_code;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tdata_len = 4;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t/* Can't ever happen since size_code is & 0x3 */\n\t\t\t\tdata_len = 0;\n\t\t\t\tbreak;\n\t\t\t};\n\t\t\tkey_size = 1;\n\t\t}\n\n\t\tif (key_cmd == 0x4) {\n\t\t\t*usage_page  = get_bytes(report_descriptor, size, data_len, i);\n\t\t\tusage_page_found = 1;\n\t\t\t//printf(\"Usage Page: %x\\n\", (uint32_t)*usage_page);\n\t\t}\n\t\tif (key_cmd == 0x8) {\n\t\t\t*usage = get_bytes(report_descriptor, size, data_len, i);\n\t\t\tusage_found = 1;\n\t\t\t//printf(\"Usage: %x\\n\", (uint32_t)*usage);\n\t\t}\n\n\t\tif (usage_page_found && usage_found)\n\t\t\treturn 0; /* success */\n\n\t\t/* Skip over this key and it's associated data */\n\t\ti += data_len + key_size;\n\t}\n\n\treturn -1; /* failure */\n}\n#endif /* INVASIVE_GET_USAGE */\n\n#if defined(__FreeBSD__) && __FreeBSD__ < 10\n/* The libusb version included in FreeBSD < 10 doesn't have this function. In\n   mainline libusb, it's inlined in libusb.h. This function will bear a striking\n   resemblance to that one, because there's about one way to code it.\n\n   Note that the data parameter is Unicode in UTF-16LE encoding.\n   Return value is the number of bytes in data, or LIBUSB_ERROR_*.\n */\nstatic inline int libusb_get_string_descriptor(libusb_device_handle *dev,\n\tuint8_t descriptor_index, uint16_t lang_id,\n\tunsigned char *data, int length)\n{\n\treturn libusb_control_transfer(dev,\n\t\tLIBUSB_ENDPOINT_IN | 0x0, /* Endpoint 0 IN */\n\t\tLIBUSB_REQUEST_GET_DESCRIPTOR,\n\t\t(LIBUSB_DT_STRING << 8) | descriptor_index,\n\t\tlang_id, data, (uint16_t) length, 1000);\n}\n\n#endif\n\n\n/* Get the first language the device says it reports. This comes from\n   USB string #0. */\nstatic uint16_t get_first_language(libusb_device_handle *dev)\n{\n\tuint16_t buf[32];\n\tint len;\n\n\t/* Get the string from libusb. */\n\tlen = libusb_get_string_descriptor(dev,\n\t\t\t0x0, /* String ID */\n\t\t\t0x0, /* Language */\n\t\t\t(unsigned char*)buf,\n\t\t\tsizeof(buf));\n\tif (len < 4)\n\t\treturn 0x0;\n\n\treturn buf[1]; /* First two bytes are len and descriptor type. */\n}\n\nstatic int is_language_supported(libusb_device_handle *dev, uint16_t lang)\n{\n\tuint16_t buf[32];\n\tint len;\n\tint i;\n\n\t/* Get the string from libusb. */\n\tlen = libusb_get_string_descriptor(dev,\n\t\t\t0x0, /* String ID */\n\t\t\t0x0, /* Language */\n\t\t\t(unsigned char*)buf,\n\t\t\tsizeof(buf));\n\tif (len < 4)\n\t\treturn 0x0;\n\n\n\tlen /= 2; /* language IDs are two-bytes each. */\n\t/* Start at index 1 because there are two bytes of protocol data. */\n\tfor (i = 1; i < len; i++) {\n\t\tif (buf[i] == lang)\n\t\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n\n/* This function returns a newly allocated wide string containing the USB\n   device string numbered by the index. The returned string must be freed\n   by using free(). */\nstatic wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx)\n{\n\tchar buf[512];\n\tint len;\n\twchar_t *str = NULL;\n\n#ifndef __ANDROID__ /* we don't use iconv on Android */\n\twchar_t wbuf[256];\n\t/* iconv variables */\n\ticonv_t ic;\n\tsize_t inbytes;\n\tsize_t outbytes;\n\tsize_t res;\n#ifdef __FreeBSD__\n\tconst char *inptr;\n#else\n\tchar *inptr;\n#endif\n\tchar *outptr;\n#endif\n\n\t/* Determine which language to use. */\n\tuint16_t lang;\n\tlang = get_usb_code_for_current_locale();\n\tif (!is_language_supported(dev, lang))\n\t\tlang = get_first_language(dev);\n\n\t/* Get the string from libusb. */\n\tlen = libusb_get_string_descriptor(dev,\n\t\t\tidx,\n\t\t\tlang,\n\t\t\t(unsigned char*)buf,\n\t\t\tsizeof(buf));\n\tif (len < 0)\n\t\treturn NULL;\n\n#ifdef __ANDROID__\n\n\t/* Bionic does not have iconv support nor wcsdup() function, so it\n\t   has to be done manually.  The following code will only work for\n\t   code points that can be represented as a single UTF-16 character,\n\t   and will incorrectly convert any code points which require more\n\t   than one UTF-16 character.\n\n\t   Skip over the first character (2-bytes).  */\n\tlen -= 2;\n\tstr = malloc((len / 2 + 1) * sizeof(wchar_t));\n\tint i;\n\tfor (i = 0; i < len / 2; i++) {\n\t\tstr[i] = buf[i * 2 + 2] | (buf[i * 2 + 3] << 8);\n\t}\n\tstr[len / 2] = 0x00000000;\n\n#else\n\n\t/* buf does not need to be explicitly NULL-terminated because\n\t   it is only passed into iconv() which does not need it. */\n\n\t/* Initialize iconv. */\n\tic = iconv_open(\"WCHAR_T\", \"UTF-16LE\");\n\tif (ic == (iconv_t)-1) {\n\t\tLOG(\"iconv_open() failed\\n\");\n\t\treturn NULL;\n\t}\n\n\t/* Convert to native wchar_t (UTF-32 on glibc/BSD systems).\n\t   Skip the first character (2-bytes). */\n\tinptr = buf+2;\n\tinbytes = len-2;\n\toutptr = (char*) wbuf;\n\toutbytes = sizeof(wbuf);\n\tres = iconv(ic, &inptr, &inbytes, &outptr, &outbytes);\n\tif (res == (size_t)-1) {\n\t\tLOG(\"iconv() failed\\n\");\n\t\tgoto err;\n\t}\n\n\t/* Write the terminating NULL. */\n\twbuf[sizeof(wbuf)/sizeof(wbuf[0])-1] = 0x00000000;\n\tif (outbytes >= sizeof(wbuf[0]))\n\t\t*((wchar_t*)outptr) = 0x00000000;\n\n\t/* Allocate and copy the string. */\n\tstr = wcsdup(wbuf);\n\nerr:\n\ticonv_close(ic);\n\n#endif\n\n\treturn str;\n}\n\nstatic char *make_path(libusb_device *dev, int interface_number)\n{\n\tchar str[64];\n\tsnprintf(str, sizeof(str), \"%04x:%04x:%02x\",\n\t\tlibusb_get_bus_number(dev),\n\t\tlibusb_get_device_address(dev),\n\t\tinterface_number);\n\tstr[sizeof(str)-1] = '\\0';\n\n\treturn strdup(str);\n}\n\n\nint HID_API_EXPORT hid_init(void)\n{\n\tif (!usb_context) {\n\t\tconst char *locale;\n\n\t\t/* Init Libusb */\n\t\tif (libusb_init(&usb_context))\n\t\t\treturn -1;\n\n\t\t/* Set the locale if it's not set. */\n\t\tlocale = setlocale(LC_CTYPE, NULL);\n\t\tif (!locale)\n\t\t\tsetlocale(LC_CTYPE, \"\");\n\t}\n\n\treturn 0;\n}\n\nint HID_API_EXPORT hid_exit(void)\n{\n\tif (usb_context) {\n\t\tlibusb_exit(usb_context);\n\t\tusb_context = NULL;\n\t}\n\n\treturn 0;\n}\n\nstruct hid_device_info  HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id)\n{\n\tlibusb_device **devs;\n\tlibusb_device *dev;\n\tlibusb_device_handle *handle;\n\tssize_t num_devs;\n\tint i = 0;\n\n\tstruct hid_device_info *root = NULL; /* return object */\n\tstruct hid_device_info *cur_dev = NULL;\n\n\tif(hid_init() < 0)\n\t\treturn NULL;\n\n\tnum_devs = libusb_get_device_list(usb_context, &devs);\n\tif (num_devs < 0)\n\t\treturn NULL;\n\twhile ((dev = devs[i++]) != NULL) {\n\t\tstruct libusb_device_descriptor desc;\n\t\tstruct libusb_config_descriptor *conf_desc = NULL;\n\t\tint j, k;\n\t\tint interface_num = 0;\n\n\t\tint res = libusb_get_device_descriptor(dev, &desc);\n\t\tunsigned short dev_vid = desc.idVendor;\n\t\tunsigned short dev_pid = desc.idProduct;\n\n\t\tres = libusb_get_active_config_descriptor(dev, &conf_desc);\n\t\tif (res < 0)\n\t\t\tlibusb_get_config_descriptor(dev, 0, &conf_desc);\n\t\tif (conf_desc) {\n\t\t\tfor (j = 0; j < conf_desc->bNumInterfaces; j++) {\n\t\t\t\tconst struct libusb_interface *intf = &conf_desc->interface[j];\n\t\t\t\tfor (k = 0; k < intf->num_altsetting; k++) {\n\t\t\t\t\tconst struct libusb_interface_descriptor *intf_desc;\n\t\t\t\t\tintf_desc = &intf->altsetting[k];\n\t\t\t\t\tif (intf_desc->bInterfaceClass == LIBUSB_CLASS_HID) {\n\t\t\t\t\t\tinterface_num = intf_desc->bInterfaceNumber;\n\n\t\t\t\t\t\t/* Check the VID/PID against the arguments */\n\t\t\t\t\t\tif ((vendor_id == 0x0 || vendor_id == dev_vid) &&\n\t\t\t\t\t\t    (product_id == 0x0 || product_id == dev_pid)) {\n\t\t\t\t\t\t\tstruct hid_device_info *tmp;\n\n\t\t\t\t\t\t\t/* VID/PID match. Create the record. */\n\t\t\t\t\t\t\ttmp = calloc(1, sizeof(struct hid_device_info));\n\t\t\t\t\t\t\tif (cur_dev) {\n\t\t\t\t\t\t\t\tcur_dev->next = tmp;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\troot = tmp;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcur_dev = tmp;\n\n\t\t\t\t\t\t\t/* Fill out the record */\n\t\t\t\t\t\t\tcur_dev->next = NULL;\n\t\t\t\t\t\t\tcur_dev->path = make_path(dev, interface_num);\n\n\t\t\t\t\t\t\tres = libusb_open(dev, &handle);\n\n\t\t\t\t\t\t\tif (res >= 0) {\n\t\t\t\t\t\t\t\t/* Serial Number */\n\t\t\t\t\t\t\t\tif (desc.iSerialNumber > 0)\n\t\t\t\t\t\t\t\t\tcur_dev->serial_number =\n\t\t\t\t\t\t\t\t\t\tget_usb_string(handle, desc.iSerialNumber);\n\n\t\t\t\t\t\t\t\t/* Manufacturer and Product strings */\n\t\t\t\t\t\t\t\tif (desc.iManufacturer > 0)\n\t\t\t\t\t\t\t\t\tcur_dev->manufacturer_string =\n\t\t\t\t\t\t\t\t\t\tget_usb_string(handle, desc.iManufacturer);\n\t\t\t\t\t\t\t\tif (desc.iProduct > 0)\n\t\t\t\t\t\t\t\t\tcur_dev->product_string =\n\t\t\t\t\t\t\t\t\t\tget_usb_string(handle, desc.iProduct);\n\n#ifdef INVASIVE_GET_USAGE\n{\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tThis section is removed because it is too\n\t\t\t\t\t\t\tinvasive on the system. Getting a Usage Page\n\t\t\t\t\t\t\tand Usage requires parsing the HID Report\n\t\t\t\t\t\t\tdescriptor. Getting a HID Report descriptor\n\t\t\t\t\t\t\tinvolves claiming the interface. Claiming the\n\t\t\t\t\t\t\tinterface involves detaching the kernel driver.\n\t\t\t\t\t\t\tDetaching the kernel driver is hard on the system\n\t\t\t\t\t\t\tbecause it will unclaim interfaces (if another\n\t\t\t\t\t\t\tapp has them claimed) and the re-attachment of\n\t\t\t\t\t\t\tthe driver will sometimes change /dev entry names.\n\t\t\t\t\t\t\tIt is for these reasons that this section is\n\t\t\t\t\t\t\t#if 0. For composite devices, use the interface\n\t\t\t\t\t\t\tfield in the hid_device_info struct to distinguish\n\t\t\t\t\t\t\tbetween interfaces. */\n\t\t\t\t\t\t\t\tunsigned char data[256];\n#ifdef DETACH_KERNEL_DRIVER\n\t\t\t\t\t\t\t\tint detached = 0;\n\t\t\t\t\t\t\t\t/* Usage Page and Usage */\n\t\t\t\t\t\t\t\tres = libusb_kernel_driver_active(handle, interface_num);\n\t\t\t\t\t\t\t\tif (res == 1) {\n\t\t\t\t\t\t\t\t\tres = libusb_detach_kernel_driver(handle, interface_num);\n\t\t\t\t\t\t\t\t\tif (res < 0)\n\t\t\t\t\t\t\t\t\t\tLOG(\"Couldn't detach kernel driver, even though a kernel driver was attached.\");\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tdetached = 1;\n\t\t\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\t\t\tres = libusb_claim_interface(handle, interface_num);\n\t\t\t\t\t\t\t\tif (res >= 0) {\n\t\t\t\t\t\t\t\t\t/* Get the HID Report Descriptor. */\n\t\t\t\t\t\t\t\t\tres = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_INTERFACE, LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_REPORT << 8)|interface_num, 0, data, sizeof(data), 5000);\n\t\t\t\t\t\t\t\t\tif (res >= 0) {\n\t\t\t\t\t\t\t\t\t\tunsigned short page=0, usage=0;\n\t\t\t\t\t\t\t\t\t\t/* Parse the usage and usage page\n\t\t\t\t\t\t\t\t\t\t   out of the report descriptor. */\n\t\t\t\t\t\t\t\t\t\tget_usage(data, res,  &page, &usage);\n\t\t\t\t\t\t\t\t\t\tcur_dev->usage_page = page;\n\t\t\t\t\t\t\t\t\t\tcur_dev->usage = usage;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tLOG(\"libusb_control_transfer() for getting the HID report failed with %d\\n\", res);\n\n\t\t\t\t\t\t\t\t\t/* Release the interface */\n\t\t\t\t\t\t\t\t\tres = libusb_release_interface(handle, interface_num);\n\t\t\t\t\t\t\t\t\tif (res < 0)\n\t\t\t\t\t\t\t\t\t\tLOG(\"Can't release the interface.\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tLOG(\"Can't claim interface %d\\n\", res);\n#ifdef DETACH_KERNEL_DRIVER\n\t\t\t\t\t\t\t\t/* Re-attach kernel driver if necessary. */\n\t\t\t\t\t\t\t\tif (detached) {\n\t\t\t\t\t\t\t\t\tres = libusb_attach_kernel_driver(handle, interface_num);\n\t\t\t\t\t\t\t\t\tif (res < 0)\n\t\t\t\t\t\t\t\t\t\tLOG(\"Couldn't re-attach kernel driver.\\n\");\n\t\t\t\t\t\t\t\t}\n#endif\n}\n#endif /* INVASIVE_GET_USAGE */\n\n\t\t\t\t\t\t\t\tlibusb_close(handle);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t/* VID/PID */\n\t\t\t\t\t\t\tcur_dev->vendor_id = dev_vid;\n\t\t\t\t\t\t\tcur_dev->product_id = dev_pid;\n\n\t\t\t\t\t\t\t/* Release Number */\n\t\t\t\t\t\t\tcur_dev->release_number = desc.bcdDevice;\n\n\t\t\t\t\t\t\t/* Interface Number */\n\t\t\t\t\t\t\tcur_dev->interface_number = interface_num;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} /* altsettings */\n\t\t\t} /* interfaces */\n\t\t\tlibusb_free_config_descriptor(conf_desc);\n\t\t}\n\t}\n\n\tlibusb_free_device_list(devs, 1);\n\n\treturn root;\n}\n\nvoid  HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs)\n{\n\tstruct hid_device_info *d = devs;\n\twhile (d) {\n\t\tstruct hid_device_info *next = d->next;\n\t\tfree(d->path);\n\t\tfree(d->serial_number);\n\t\tfree(d->manufacturer_string);\n\t\tfree(d->product_string);\n\t\tfree(d);\n\t\td = next;\n\t}\n}\n\nhid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)\n{\n\tstruct hid_device_info *devs, *cur_dev;\n\tconst char *path_to_open = NULL;\n\thid_device *handle = NULL;\n\n\tdevs = hid_enumerate(vendor_id, product_id);\n\tcur_dev = devs;\n\twhile (cur_dev) {\n\t\tif (cur_dev->vendor_id == vendor_id &&\n\t\t    cur_dev->product_id == product_id) {\n\t\t\tif (serial_number) {\n\t\t\t\tif (cur_dev->serial_number &&\n\t\t\t\t    wcscmp(serial_number, cur_dev->serial_number) == 0) {\n\t\t\t\t\tpath_to_open = cur_dev->path;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpath_to_open = cur_dev->path;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tcur_dev = cur_dev->next;\n\t}\n\n\tif (path_to_open) {\n\t\t/* Open the device */\n\t\thandle = hid_open_path(path_to_open);\n\t}\n\n\thid_free_enumeration(devs);\n\n\treturn handle;\n}\n\nstatic void read_callback(struct libusb_transfer *transfer)\n{\n\thid_device *dev = transfer->user_data;\n\tint res;\n\n\tif (transfer->status == LIBUSB_TRANSFER_COMPLETED) {\n\n\t\tstruct input_report *rpt = malloc(sizeof(*rpt));\n\t\trpt->data = malloc(transfer->actual_length);\n\t\tmemcpy(rpt->data, transfer->buffer, transfer->actual_length);\n\t\trpt->len = transfer->actual_length;\n\t\trpt->next = NULL;\n\n\t\tpthread_mutex_lock(&dev->mutex);\n\n\t\t/* Attach the new report object to the end of the list. */\n\t\tif (dev->input_reports == NULL) {\n\t\t\t/* The list is empty. Put it at the root. */\n\t\t\tdev->input_reports = rpt;\n\t\t\tpthread_cond_signal(&dev->condition);\n\t\t}\n\t\telse {\n\t\t\t/* Find the end of the list and attach. */\n\t\t\tstruct input_report *cur = dev->input_reports;\n\t\t\tint num_queued = 0;\n\t\t\twhile (cur->next != NULL) {\n\t\t\t\tcur = cur->next;\n\t\t\t\tnum_queued++;\n\t\t\t}\n\t\t\tcur->next = rpt;\n\n\t\t\t/* Pop one off if we've reached 30 in the queue. This\n\t\t\t   way we don't grow forever if the user never reads\n\t\t\t   anything from the device. */\n\t\t\tif (num_queued > 30) {\n\t\t\t\treturn_data(dev, NULL, 0);\n\t\t\t}\n\t\t}\n\t\tpthread_mutex_unlock(&dev->mutex);\n\t}\n\telse if (transfer->status == LIBUSB_TRANSFER_CANCELLED) {\n\t\tdev->shutdown_thread = 1;\n\t\tdev->cancelled = 1;\n\t\treturn;\n\t}\n\telse if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) {\n\t\tdev->shutdown_thread = 1;\n\t\tdev->cancelled = 1;\n\t\treturn;\n\t}\n\telse if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) {\n\t\t//LOG(\"Timeout (normal)\\n\");\n\t}\n\telse {\n\t\tLOG(\"Unknown transfer code: %d\\n\", transfer->status);\n\t}\n\n\t/* Re-submit the transfer object. */\n\tres = libusb_submit_transfer(transfer);\n\tif (res != 0) {\n\t\tLOG(\"Unable to submit URB. libusb error code: %d\\n\", res);\n\t\tdev->shutdown_thread = 1;\n\t\tdev->cancelled = 1;\n\t}\n}\n\n\nstatic void *read_thread(void *param)\n{\n\thid_device *dev = param;\n\tunsigned char *buf;\n\tconst size_t length = dev->input_ep_max_packet_size;\n\n\t/* Set up the transfer object. */\n\tbuf = malloc(length);\n\tdev->transfer = libusb_alloc_transfer(0);\n\tlibusb_fill_interrupt_transfer(dev->transfer,\n\t\tdev->device_handle,\n\t\tdev->input_endpoint,\n\t\tbuf,\n\t\tlength,\n\t\tread_callback,\n\t\tdev,\n\t\t5000/*timeout*/);\n\n\t/* Make the first submission. Further submissions are made\n\t   from inside read_callback() */\n\tlibusb_submit_transfer(dev->transfer);\n\n\t/* Notify the main thread that the read thread is up and running. */\n\tpthread_barrier_wait(&dev->barrier);\n\n\t/* Handle all the events. */\n\twhile (!dev->shutdown_thread) {\n\t\tint res;\n\t\tres = libusb_handle_events(usb_context);\n\t\tif (res < 0) {\n\t\t\t/* There was an error. */\n\t\t\tLOG(\"read_thread(): libusb reports error # %d\\n\", res);\n\n\t\t\t/* Break out of this loop only on fatal error.*/\n\t\t\tif (res != LIBUSB_ERROR_BUSY &&\n\t\t\t    res != LIBUSB_ERROR_TIMEOUT &&\n\t\t\t    res != LIBUSB_ERROR_OVERFLOW &&\n\t\t\t    res != LIBUSB_ERROR_INTERRUPTED) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Cancel any transfer that may be pending. This call will fail\n\t   if no transfers are pending, but that's OK. */\n\tlibusb_cancel_transfer(dev->transfer);\n\n\twhile (!dev->cancelled)\n\t\tlibusb_handle_events_completed(usb_context, &dev->cancelled);\n\n\t/* Now that the read thread is stopping, Wake any threads which are\n\t   waiting on data (in hid_read_timeout()). Do this under a mutex to\n\t   make sure that a thread which is about to go to sleep waiting on\n\t   the condition actually will go to sleep before the condition is\n\t   signaled. */\n\tpthread_mutex_lock(&dev->mutex);\n\tpthread_cond_broadcast(&dev->condition);\n\tpthread_mutex_unlock(&dev->mutex);\n\n\t/* The dev->transfer->buffer and dev->transfer objects are cleaned up\n\t   in hid_close(). They are not cleaned up here because this thread\n\t   could end either due to a disconnect or due to a user\n\t   call to hid_close(). In both cases the objects can be safely\n\t   cleaned up after the call to pthread_join() (in hid_close()), but\n\t   since hid_close() calls libusb_cancel_transfer(), on these objects,\n\t   they can not be cleaned up here. */\n\n\treturn NULL;\n}\n\n\nhid_device * HID_API_EXPORT hid_open_path(const char *path)\n{\n\thid_device *dev = NULL;\n\n\tlibusb_device **devs;\n\tlibusb_device *usb_dev;\n\tint res;\n\tint d = 0;\n\tint good_open = 0;\n\n\tif(hid_init() < 0)\n\t\treturn NULL;\n\n\tdev = new_hid_device();\n\n\tlibusb_get_device_list(usb_context, &devs);\n\twhile ((usb_dev = devs[d++]) != NULL) {\n\t\tstruct libusb_device_descriptor desc;\n\t\tstruct libusb_config_descriptor *conf_desc = NULL;\n\t\tint i,j,k;\n\t\tlibusb_get_device_descriptor(usb_dev, &desc);\n\n\t\tif (libusb_get_active_config_descriptor(usb_dev, &conf_desc) < 0)\n\t\t\tcontinue;\n\t\tfor (j = 0; j < conf_desc->bNumInterfaces; j++) {\n\t\t\tconst struct libusb_interface *intf = &conf_desc->interface[j];\n\t\t\tfor (k = 0; k < intf->num_altsetting; k++) {\n\t\t\t\tconst struct libusb_interface_descriptor *intf_desc;\n\t\t\t\tintf_desc = &intf->altsetting[k];\n\t\t\t\tif (intf_desc->bInterfaceClass == LIBUSB_CLASS_HID) {\n\t\t\t\t\tchar *dev_path = make_path(usb_dev, intf_desc->bInterfaceNumber);\n\t\t\t\t\tif (!strcmp(dev_path, path)) {\n\t\t\t\t\t\t/* Matched Paths. Open this device */\n\n\t\t\t\t\t\t/* OPEN HERE */\n\t\t\t\t\t\tres = libusb_open(usb_dev, &dev->device_handle);\n\t\t\t\t\t\tif (res < 0) {\n\t\t\t\t\t\t\tLOG(\"can't open device\\n\");\n\t\t\t\t\t\t\tfree(dev_path);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgood_open = 1;\n#ifdef DETACH_KERNEL_DRIVER\n\t\t\t\t\t\t/* Detach the kernel driver, but only if the\n\t\t\t\t\t\t   device is managed by the kernel */\n\t\t\t\t\t\tif (libusb_kernel_driver_active(dev->device_handle, intf_desc->bInterfaceNumber) == 1) {\n\t\t\t\t\t\t\tres = libusb_detach_kernel_driver(dev->device_handle, intf_desc->bInterfaceNumber);\n\t\t\t\t\t\t\tif (res < 0) {\n\t\t\t\t\t\t\t\tlibusb_close(dev->device_handle);\n\t\t\t\t\t\t\t\tLOG(\"Unable to detach Kernel Driver\\n\");\n\t\t\t\t\t\t\t\tfree(dev_path);\n\t\t\t\t\t\t\t\tgood_open = 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\tres = libusb_claim_interface(dev->device_handle, intf_desc->bInterfaceNumber);\n\t\t\t\t\t\tif (res < 0) {\n\t\t\t\t\t\t\tLOG(\"can't claim interface %d: %d\\n\", intf_desc->bInterfaceNumber, res);\n\t\t\t\t\t\t\tfree(dev_path);\n\t\t\t\t\t\t\tlibusb_close(dev->device_handle);\n\t\t\t\t\t\t\tgood_open = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/* Store off the string descriptor indexes */\n\t\t\t\t\t\tdev->manufacturer_index = desc.iManufacturer;\n\t\t\t\t\t\tdev->product_index      = desc.iProduct;\n\t\t\t\t\t\tdev->serial_index       = desc.iSerialNumber;\n\n\t\t\t\t\t\t/* Store off the interface number */\n\t\t\t\t\t\tdev->interface = intf_desc->bInterfaceNumber;\n\n\t\t\t\t\t\t/* Find the INPUT and OUTPUT endpoints. An\n\t\t\t\t\t\t   OUTPUT endpoint is not required. */\n\t\t\t\t\t\tfor (i = 0; i < intf_desc->bNumEndpoints; i++) {\n\t\t\t\t\t\t\tconst struct libusb_endpoint_descriptor *ep\n\t\t\t\t\t\t\t\t= &intf_desc->endpoint[i];\n\n\t\t\t\t\t\t\t/* Determine the type and direction of this\n\t\t\t\t\t\t\t   endpoint. */\n\t\t\t\t\t\t\tint is_interrupt =\n\t\t\t\t\t\t\t\t(ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK)\n\t\t\t\t\t\t\t      == LIBUSB_TRANSFER_TYPE_INTERRUPT;\n\t\t\t\t\t\t\tint is_output =\n\t\t\t\t\t\t\t\t(ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK)\n\t\t\t\t\t\t\t      == LIBUSB_ENDPOINT_OUT;\n\t\t\t\t\t\t\tint is_input =\n\t\t\t\t\t\t\t\t(ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK)\n\t\t\t\t\t\t\t      == LIBUSB_ENDPOINT_IN;\n\n\t\t\t\t\t\t\t/* Decide whether to use it for input or output. */\n\t\t\t\t\t\t\tif (dev->input_endpoint == 0 &&\n\t\t\t\t\t\t\t    is_interrupt && is_input) {\n\t\t\t\t\t\t\t\t/* Use this endpoint for INPUT */\n\t\t\t\t\t\t\t\tdev->input_endpoint = ep->bEndpointAddress;\n\t\t\t\t\t\t\t\tdev->input_ep_max_packet_size = ep->wMaxPacketSize;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (dev->output_endpoint == 0 &&\n\t\t\t\t\t\t\t    is_interrupt && is_output) {\n\t\t\t\t\t\t\t\t/* Use this endpoint for OUTPUT */\n\t\t\t\t\t\t\t\tdev->output_endpoint = ep->bEndpointAddress;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpthread_create(&dev->thread, NULL, read_thread, dev);\n\n\t\t\t\t\t\t/* Wait here for the read thread to be initialized. */\n\t\t\t\t\t\tpthread_barrier_wait(&dev->barrier);\n\n\t\t\t\t\t}\n\t\t\t\t\tfree(dev_path);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tlibusb_free_config_descriptor(conf_desc);\n\n\t}\n\n\tlibusb_free_device_list(devs, 1);\n\n\t/* If we have a good handle, return it. */\n\tif (good_open) {\n\t\treturn dev;\n\t}\n\telse {\n\t\t/* Unable to open any devices. */\n\t\tfree_hid_device(dev);\n\t\treturn NULL;\n\t}\n}\n\n\nint HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length)\n{\n\tint res;\n\tint report_number = data[0];\n\tint skipped_report_id = 0;\n\n\tif (report_number == 0x0) {\n\t\tdata++;\n\t\tlength--;\n\t\tskipped_report_id = 1;\n\t}\n\n\n\tif (dev->output_endpoint <= 0) {\n\t\t/* No interrupt out endpoint. Use the Control Endpoint */\n\t\tres = libusb_control_transfer(dev->device_handle,\n\t\t\tLIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,\n\t\t\t0x09/*HID Set_Report*/,\n\t\t\t(2/*HID output*/ << 8) | report_number,\n\t\t\tdev->interface,\n\t\t\t(unsigned char *)data, length,\n\t\t\t1000/*timeout millis*/);\n\n\t\tif (res < 0)\n\t\t\treturn -1;\n\n\t\tif (skipped_report_id)\n\t\t\tlength++;\n\n\t\treturn length;\n\t}\n\telse {\n\t\t/* Use the interrupt out endpoint */\n\t\tint actual_length;\n\t\tres = libusb_interrupt_transfer(dev->device_handle,\n\t\t\tdev->output_endpoint,\n\t\t\t(unsigned char*)data,\n\t\t\tlength,\n\t\t\t&actual_length, 1000);\n\n\t\tif (res < 0)\n\t\t\treturn -1;\n\n\t\tif (skipped_report_id)\n\t\t\tactual_length++;\n\n\t\treturn actual_length;\n\t}\n}\n\n/* Helper function, to simplify hid_read().\n   This should be called with dev->mutex locked. */\nstatic int return_data(hid_device *dev, unsigned char *data, size_t length)\n{\n\t/* Copy the data out of the linked list item (rpt) into the\n\t   return buffer (data), and delete the liked list item. */\n\tstruct input_report *rpt = dev->input_reports;\n\tsize_t len = (length < rpt->len)? length: rpt->len;\n\tif (len > 0)\n\t\tmemcpy(data, rpt->data, len);\n\tdev->input_reports = rpt->next;\n\tfree(rpt->data);\n\tfree(rpt);\n\treturn len;\n}\n\nstatic void cleanup_mutex(void *param)\n{\n\thid_device *dev = param;\n\tpthread_mutex_unlock(&dev->mutex);\n}\n\n\nint HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)\n{\n\tint bytes_read = -1;\n\n#if 0\n\tint transferred;\n\tint res = libusb_interrupt_transfer(dev->device_handle, dev->input_endpoint, data, length, &transferred, 5000);\n\tLOG(\"transferred: %d\\n\", transferred);\n\treturn transferred;\n#endif\n\n\tpthread_mutex_lock(&dev->mutex);\n\tpthread_cleanup_push(&cleanup_mutex, dev);\n\n\t/* There's an input report queued up. Return it. */\n\tif (dev->input_reports) {\n\t\t/* Return the first one */\n\t\tbytes_read = return_data(dev, data, length);\n\t\tgoto ret;\n\t}\n\n\tif (dev->shutdown_thread) {\n\t\t/* This means the device has been disconnected.\n\t\t   An error code of -1 should be returned. */\n\t\tbytes_read = -1;\n\t\tgoto ret;\n\t}\n\n\tif (milliseconds == -1) {\n\t\t/* Blocking */\n\t\twhile (!dev->input_reports && !dev->shutdown_thread) {\n\t\t\tpthread_cond_wait(&dev->condition, &dev->mutex);\n\t\t}\n\t\tif (dev->input_reports) {\n\t\t\tbytes_read = return_data(dev, data, length);\n\t\t}\n\t}\n\telse if (milliseconds > 0) {\n\t\t/* Non-blocking, but called with timeout. */\n\t\tint res;\n\t\tstruct timespec ts;\n\t\tclock_gettime(CLOCK_REALTIME, &ts);\n\t\tts.tv_sec += milliseconds / 1000;\n\t\tts.tv_nsec += (milliseconds % 1000) * 1000000;\n\t\tif (ts.tv_nsec >= 1000000000L) {\n\t\t\tts.tv_sec++;\n\t\t\tts.tv_nsec -= 1000000000L;\n\t\t}\n\n\t\twhile (!dev->input_reports && !dev->shutdown_thread) {\n\t\t\tres = pthread_cond_timedwait(&dev->condition, &dev->mutex, &ts);\n\t\t\tif (res == 0) {\n\t\t\t\tif (dev->input_reports) {\n\t\t\t\t\tbytes_read = return_data(dev, data, length);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* If we're here, there was a spurious wake up\n\t\t\t\t   or the read thread was shutdown. Run the\n\t\t\t\t   loop again (ie: don't break). */\n\t\t\t}\n\t\t\telse if (res == ETIMEDOUT) {\n\t\t\t\t/* Timed out. */\n\t\t\t\tbytes_read = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t/* Error. */\n\t\t\t\tbytes_read = -1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t/* Purely non-blocking */\n\t\tbytes_read = 0;\n\t}\n\nret:\n\tpthread_mutex_unlock(&dev->mutex);\n\tpthread_cleanup_pop(0);\n\n\treturn bytes_read;\n}\n\nint HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length)\n{\n\treturn hid_read_timeout(dev, data, length, dev->blocking ? -1 : 0);\n}\n\nint HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock)\n{\n\tdev->blocking = !nonblock;\n\n\treturn 0;\n}\n\n\nint HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length)\n{\n\tint res = -1;\n\tint skipped_report_id = 0;\n\tint report_number = data[0];\n\n\tif (report_number == 0x0) {\n\t\tdata++;\n\t\tlength--;\n\t\tskipped_report_id = 1;\n\t}\n\n\tres = libusb_control_transfer(dev->device_handle,\n\t\tLIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,\n\t\t0x09/*HID set_report*/,\n\t\t(3/*HID feature*/ << 8) | report_number,\n\t\tdev->interface,\n\t\t(unsigned char *)data, length,\n\t\t1000/*timeout millis*/);\n\n\tif (res < 0)\n\t\treturn -1;\n\n\t/* Account for the report ID */\n\tif (skipped_report_id)\n\t\tlength++;\n\n\treturn length;\n}\n\nint HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)\n{\n\tint res = -1;\n\tint skipped_report_id = 0;\n\tint report_number = data[0];\n\n\tif (report_number == 0x0) {\n\t\t/* Offset the return buffer by 1, so that the report ID\n\t\t   will remain in byte 0. */\n\t\tdata++;\n\t\tlength--;\n\t\tskipped_report_id = 1;\n\t}\n\tres = libusb_control_transfer(dev->device_handle,\n\t\tLIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,\n\t\t0x01/*HID get_report*/,\n\t\t(3/*HID feature*/ << 8) | report_number,\n\t\tdev->interface,\n\t\t(unsigned char *)data, length,\n\t\t1000/*timeout millis*/);\n\n\tif (res < 0)\n\t\treturn -1;\n\n\tif (skipped_report_id)\n\t\tres++;\n\n\treturn res;\n}\n\n\nvoid HID_API_EXPORT hid_close(hid_device *dev)\n{\n\tif (!dev)\n\t\treturn;\n\n\t/* Cause read_thread() to stop. */\n\tdev->shutdown_thread = 1;\n\tlibusb_cancel_transfer(dev->transfer);\n\n\t/* Wait for read_thread() to end. */\n\tpthread_join(dev->thread, NULL);\n\n\t/* Clean up the Transfer objects allocated in read_thread(). */\n\tfree(dev->transfer->buffer);\n\tlibusb_free_transfer(dev->transfer);\n\n\t/* release the interface */\n\tlibusb_release_interface(dev->device_handle, dev->interface);\n\n\t/* Close the handle */\n\tlibusb_close(dev->device_handle);\n\n\t/* Clear out the queue of received reports. */\n\tpthread_mutex_lock(&dev->mutex);\n\twhile (dev->input_reports) {\n\t\treturn_data(dev, NULL, 0);\n\t}\n\tpthread_mutex_unlock(&dev->mutex);\n\n\tfree_hid_device(dev);\n}\n\n\nint HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\treturn hid_get_indexed_string(dev, dev->manufacturer_index, string, maxlen);\n}\n\nint HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\treturn hid_get_indexed_string(dev, dev->product_index, string, maxlen);\n}\n\nint HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\treturn hid_get_indexed_string(dev, dev->serial_index, string, maxlen);\n}\n\nint HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen)\n{\n\twchar_t *str;\n\n\tstr = get_usb_string(dev->device_handle, string_index);\n\tif (str) {\n\t\twcsncpy(string, str, maxlen);\n\t\tstring[maxlen-1] = L'\\0';\n\t\tfree(str);\n\t\treturn 0;\n\t}\n\telse\n\t\treturn -1;\n}\n\n\nHID_API_EXPORT const wchar_t * HID_API_CALL  hid_error(hid_device *dev)\n{\n\treturn NULL;\n}\n\n\nstruct lang_map_entry {\n\tconst char *name;\n\tconst char *string_code;\n\tuint16_t usb_code;\n};\n\n#define LANG(name,code,usb_code) { name, code, usb_code }\nstatic struct lang_map_entry lang_map[] = {\n\tLANG(\"Afrikaans\", \"af\", 0x0436),\n\tLANG(\"Albanian\", \"sq\", 0x041C),\n\tLANG(\"Arabic - United Arab Emirates\", \"ar_ae\", 0x3801),\n\tLANG(\"Arabic - Bahrain\", \"ar_bh\", 0x3C01),\n\tLANG(\"Arabic - Algeria\", \"ar_dz\", 0x1401),\n\tLANG(\"Arabic - Egypt\", \"ar_eg\", 0x0C01),\n\tLANG(\"Arabic - Iraq\", \"ar_iq\", 0x0801),\n\tLANG(\"Arabic - Jordan\", \"ar_jo\", 0x2C01),\n\tLANG(\"Arabic - Kuwait\", \"ar_kw\", 0x3401),\n\tLANG(\"Arabic - Lebanon\", \"ar_lb\", 0x3001),\n\tLANG(\"Arabic - Libya\", \"ar_ly\", 0x1001),\n\tLANG(\"Arabic - Morocco\", \"ar_ma\", 0x1801),\n\tLANG(\"Arabic - Oman\", \"ar_om\", 0x2001),\n\tLANG(\"Arabic - Qatar\", \"ar_qa\", 0x4001),\n\tLANG(\"Arabic - Saudi Arabia\", \"ar_sa\", 0x0401),\n\tLANG(\"Arabic - Syria\", \"ar_sy\", 0x2801),\n\tLANG(\"Arabic - Tunisia\", \"ar_tn\", 0x1C01),\n\tLANG(\"Arabic - Yemen\", \"ar_ye\", 0x2401),\n\tLANG(\"Armenian\", \"hy\", 0x042B),\n\tLANG(\"Azeri - Latin\", \"az_az\", 0x042C),\n\tLANG(\"Azeri - Cyrillic\", \"az_az\", 0x082C),\n\tLANG(\"Basque\", \"eu\", 0x042D),\n\tLANG(\"Belarusian\", \"be\", 0x0423),\n\tLANG(\"Bulgarian\", \"bg\", 0x0402),\n\tLANG(\"Catalan\", \"ca\", 0x0403),\n\tLANG(\"Chinese - China\", \"zh_cn\", 0x0804),\n\tLANG(\"Chinese - Hong Kong SAR\", \"zh_hk\", 0x0C04),\n\tLANG(\"Chinese - Macau SAR\", \"zh_mo\", 0x1404),\n\tLANG(\"Chinese - Singapore\", \"zh_sg\", 0x1004),\n\tLANG(\"Chinese - Taiwan\", \"zh_tw\", 0x0404),\n\tLANG(\"Croatian\", \"hr\", 0x041A),\n\tLANG(\"Czech\", \"cs\", 0x0405),\n\tLANG(\"Danish\", \"da\", 0x0406),\n\tLANG(\"Dutch - Netherlands\", \"nl_nl\", 0x0413),\n\tLANG(\"Dutch - Belgium\", \"nl_be\", 0x0813),\n\tLANG(\"English - Australia\", \"en_au\", 0x0C09),\n\tLANG(\"English - Belize\", \"en_bz\", 0x2809),\n\tLANG(\"English - Canada\", \"en_ca\", 0x1009),\n\tLANG(\"English - Caribbean\", \"en_cb\", 0x2409),\n\tLANG(\"English - Ireland\", \"en_ie\", 0x1809),\n\tLANG(\"English - Jamaica\", \"en_jm\", 0x2009),\n\tLANG(\"English - New Zealand\", \"en_nz\", 0x1409),\n\tLANG(\"English - Phillippines\", \"en_ph\", 0x3409),\n\tLANG(\"English - Southern Africa\", \"en_za\", 0x1C09),\n\tLANG(\"English - Trinidad\", \"en_tt\", 0x2C09),\n\tLANG(\"English - Great Britain\", \"en_gb\", 0x0809),\n\tLANG(\"English - United States\", \"en_us\", 0x0409),\n\tLANG(\"Estonian\", \"et\", 0x0425),\n\tLANG(\"Farsi\", \"fa\", 0x0429),\n\tLANG(\"Finnish\", \"fi\", 0x040B),\n\tLANG(\"Faroese\", \"fo\", 0x0438),\n\tLANG(\"French - France\", \"fr_fr\", 0x040C),\n\tLANG(\"French - Belgium\", \"fr_be\", 0x080C),\n\tLANG(\"French - Canada\", \"fr_ca\", 0x0C0C),\n\tLANG(\"French - Luxembourg\", \"fr_lu\", 0x140C),\n\tLANG(\"French - Switzerland\", \"fr_ch\", 0x100C),\n\tLANG(\"Gaelic - Ireland\", \"gd_ie\", 0x083C),\n\tLANG(\"Gaelic - Scotland\", \"gd\", 0x043C),\n\tLANG(\"German - Germany\", \"de_de\", 0x0407),\n\tLANG(\"German - Austria\", \"de_at\", 0x0C07),\n\tLANG(\"German - Liechtenstein\", \"de_li\", 0x1407),\n\tLANG(\"German - Luxembourg\", \"de_lu\", 0x1007),\n\tLANG(\"German - Switzerland\", \"de_ch\", 0x0807),\n\tLANG(\"Greek\", \"el\", 0x0408),\n\tLANG(\"Hebrew\", \"he\", 0x040D),\n\tLANG(\"Hindi\", \"hi\", 0x0439),\n\tLANG(\"Hungarian\", \"hu\", 0x040E),\n\tLANG(\"Icelandic\", \"is\", 0x040F),\n\tLANG(\"Indonesian\", \"id\", 0x0421),\n\tLANG(\"Italian - Italy\", \"it_it\", 0x0410),\n\tLANG(\"Italian - Switzerland\", \"it_ch\", 0x0810),\n\tLANG(\"Japanese\", \"ja\", 0x0411),\n\tLANG(\"Korean\", \"ko\", 0x0412),\n\tLANG(\"Latvian\", \"lv\", 0x0426),\n\tLANG(\"Lithuanian\", \"lt\", 0x0427),\n\tLANG(\"F.Y.R.O. Macedonia\", \"mk\", 0x042F),\n\tLANG(\"Malay - Malaysia\", \"ms_my\", 0x043E),\n\tLANG(\"Malay – Brunei\", \"ms_bn\", 0x083E),\n\tLANG(\"Maltese\", \"mt\", 0x043A),\n\tLANG(\"Marathi\", \"mr\", 0x044E),\n\tLANG(\"Norwegian - Bokml\", \"no_no\", 0x0414),\n\tLANG(\"Norwegian - Nynorsk\", \"no_no\", 0x0814),\n\tLANG(\"Polish\", \"pl\", 0x0415),\n\tLANG(\"Portuguese - Portugal\", \"pt_pt\", 0x0816),\n\tLANG(\"Portuguese - Brazil\", \"pt_br\", 0x0416),\n\tLANG(\"Raeto-Romance\", \"rm\", 0x0417),\n\tLANG(\"Romanian - Romania\", \"ro\", 0x0418),\n\tLANG(\"Romanian - Republic of Moldova\", \"ro_mo\", 0x0818),\n\tLANG(\"Russian\", \"ru\", 0x0419),\n\tLANG(\"Russian - Republic of Moldova\", \"ru_mo\", 0x0819),\n\tLANG(\"Sanskrit\", \"sa\", 0x044F),\n\tLANG(\"Serbian - Cyrillic\", \"sr_sp\", 0x0C1A),\n\tLANG(\"Serbian - Latin\", \"sr_sp\", 0x081A),\n\tLANG(\"Setsuana\", \"tn\", 0x0432),\n\tLANG(\"Slovenian\", \"sl\", 0x0424),\n\tLANG(\"Slovak\", \"sk\", 0x041B),\n\tLANG(\"Sorbian\", \"sb\", 0x042E),\n\tLANG(\"Spanish - Spain (Traditional)\", \"es_es\", 0x040A),\n\tLANG(\"Spanish - Argentina\", \"es_ar\", 0x2C0A),\n\tLANG(\"Spanish - Bolivia\", \"es_bo\", 0x400A),\n\tLANG(\"Spanish - Chile\", \"es_cl\", 0x340A),\n\tLANG(\"Spanish - Colombia\", \"es_co\", 0x240A),\n\tLANG(\"Spanish - Costa Rica\", \"es_cr\", 0x140A),\n\tLANG(\"Spanish - Dominican Republic\", \"es_do\", 0x1C0A),\n\tLANG(\"Spanish - Ecuador\", \"es_ec\", 0x300A),\n\tLANG(\"Spanish - Guatemala\", \"es_gt\", 0x100A),\n\tLANG(\"Spanish - Honduras\", \"es_hn\", 0x480A),\n\tLANG(\"Spanish - Mexico\", \"es_mx\", 0x080A),\n\tLANG(\"Spanish - Nicaragua\", \"es_ni\", 0x4C0A),\n\tLANG(\"Spanish - Panama\", \"es_pa\", 0x180A),\n\tLANG(\"Spanish - Peru\", \"es_pe\", 0x280A),\n\tLANG(\"Spanish - Puerto Rico\", \"es_pr\", 0x500A),\n\tLANG(\"Spanish - Paraguay\", \"es_py\", 0x3C0A),\n\tLANG(\"Spanish - El Salvador\", \"es_sv\", 0x440A),\n\tLANG(\"Spanish - Uruguay\", \"es_uy\", 0x380A),\n\tLANG(\"Spanish - Venezuela\", \"es_ve\", 0x200A),\n\tLANG(\"Southern Sotho\", \"st\", 0x0430),\n\tLANG(\"Swahili\", \"sw\", 0x0441),\n\tLANG(\"Swedish - Sweden\", \"sv_se\", 0x041D),\n\tLANG(\"Swedish - Finland\", \"sv_fi\", 0x081D),\n\tLANG(\"Tamil\", \"ta\", 0x0449),\n\tLANG(\"Tatar\", \"tt\", 0X0444),\n\tLANG(\"Thai\", \"th\", 0x041E),\n\tLANG(\"Turkish\", \"tr\", 0x041F),\n\tLANG(\"Tsonga\", \"ts\", 0x0431),\n\tLANG(\"Ukrainian\", \"uk\", 0x0422),\n\tLANG(\"Urdu\", \"ur\", 0x0420),\n\tLANG(\"Uzbek - Cyrillic\", \"uz_uz\", 0x0843),\n\tLANG(\"Uzbek – Latin\", \"uz_uz\", 0x0443),\n\tLANG(\"Vietnamese\", \"vi\", 0x042A),\n\tLANG(\"Xhosa\", \"xh\", 0x0434),\n\tLANG(\"Yiddish\", \"yi\", 0x043D),\n\tLANG(\"Zulu\", \"zu\", 0x0435),\n\tLANG(NULL, NULL, 0x0),\n};\n\nuint16_t get_usb_code_for_current_locale(void)\n{\n\tchar *locale;\n\tchar search_string[64];\n\tchar *ptr;\n\tstruct lang_map_entry *lang;\n\n\t/* Get the current locale. */\n\tlocale = setlocale(0, NULL);\n\tif (!locale)\n\t\treturn 0x0;\n\n\t/* Make a copy of the current locale string. */\n\tstrncpy(search_string, locale, sizeof(search_string));\n\tsearch_string[sizeof(search_string)-1] = '\\0';\n\n\t/* Chop off the encoding part, and make it lower case. */\n\tptr = search_string;\n\twhile (*ptr) {\n\t\t*ptr = tolower(*ptr);\n\t\tif (*ptr == '.') {\n\t\t\t*ptr = '\\0';\n\t\t\tbreak;\n\t\t}\n\t\tptr++;\n\t}\n\n\t/* Find the entry which matches the string code of our locale. */\n\tlang = lang_map;\n\twhile (lang->string_code) {\n\t\tif (!strcmp(lang->string_code, search_string)) {\n\t\t\treturn lang->usb_code;\n\t\t}\n\t\tlang++;\n\t}\n\n\t/* There was no match. Find with just the language only. */\n\t/* Chop off the variant. Chop it off at the '_'. */\n\tptr = search_string;\n\twhile (*ptr) {\n\t\t*ptr = tolower(*ptr);\n\t\tif (*ptr == '_') {\n\t\t\t*ptr = '\\0';\n\t\t\tbreak;\n\t\t}\n\t\tptr++;\n\t}\n\n#if 0 /* TODO: Do we need this? */\n\t/* Find the entry which matches the string code of our language. */\n\tlang = lang_map;\n\twhile (lang->string_code) {\n\t\tif (!strcmp(lang->string_code, search_string)) {\n\t\t\treturn lang->usb_code;\n\t\t}\n\t\tlang++;\n\t}\n#endif\n\n\t/* Found nothing. */\n\treturn 0x0;\n}\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/mac/hid.c",
    "content": "/*******************************************************\n HIDAPI - Multi-Platform library for\n communication with HID devices.\n\n Alan Ott\n Signal 11 Software\n\n 2010-07-03\n\n Copyright 2010, All Rights Reserved.\n\n At the discretion of the user of this library,\n this software may be licensed under the terms of the\n GNU General Public License v3, a BSD-Style license, or the\n original HIDAPI license as outlined in the LICENSE.txt,\n LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt\n files located at the root of the source distribution.\n These files may also be found in the public source\n code repository located at:\n        http://github.com/signal11/hidapi .\n********************************************************/\n\n/* See Apple Technical Note TN2187 for details on IOHidManager. */\n\n#include <IOKit/hid/IOHIDManager.h>\n#include <IOKit/hid/IOHIDKeys.h>\n#include <IOKit/IOKitLib.h>\n#include <CoreFoundation/CoreFoundation.h>\n#include <wchar.h>\n#include <locale.h>\n#include <pthread.h>\n#include <sys/time.h>\n#include <unistd.h>\n#include <dlfcn.h>\n\n#include \"hidapi.h\"\n\n/* Barrier implementation because Mac OSX doesn't have pthread_barrier.\n   It also doesn't have clock_gettime(). So much for POSIX and SUSv2.\n   This implementation came from Brent Priddy and was posted on\n   StackOverflow. It is used with his permission. */\ntypedef int pthread_barrierattr_t;\ntypedef struct pthread_barrier {\n    pthread_mutex_t mutex;\n    pthread_cond_t cond;\n    int count;\n    int trip_count;\n} pthread_barrier_t;\n\nstatic int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count)\n{\n\tif(count == 0) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\n\tif(pthread_mutex_init(&barrier->mutex, 0) < 0) {\n\t\treturn -1;\n\t}\n\tif(pthread_cond_init(&barrier->cond, 0) < 0) {\n\t\tpthread_mutex_destroy(&barrier->mutex);\n\t\treturn -1;\n\t}\n\tbarrier->trip_count = count;\n\tbarrier->count = 0;\n\n\treturn 0;\n}\n\nstatic int pthread_barrier_destroy(pthread_barrier_t *barrier)\n{\n\tpthread_cond_destroy(&barrier->cond);\n\tpthread_mutex_destroy(&barrier->mutex);\n\treturn 0;\n}\n\nstatic int pthread_barrier_wait(pthread_barrier_t *barrier)\n{\n\tpthread_mutex_lock(&barrier->mutex);\n\t++(barrier->count);\n\tif(barrier->count >= barrier->trip_count)\n\t{\n\t\tbarrier->count = 0;\n\t\tpthread_cond_broadcast(&barrier->cond);\n\t\tpthread_mutex_unlock(&barrier->mutex);\n\t\treturn 1;\n\t}\n\telse\n\t{\n\t\tpthread_cond_wait(&barrier->cond, &(barrier->mutex));\n\t\tpthread_mutex_unlock(&barrier->mutex);\n\t\treturn 0;\n\t}\n}\n\nstatic int return_data(hid_device *dev, unsigned char *data, size_t length);\n\n/* Linked List of input reports received from the device. */\nstruct input_report {\n\tuint8_t *data;\n\tsize_t len;\n\tstruct input_report *next;\n};\n\nstruct hid_device_ {\n\tIOHIDDeviceRef device_handle;\n\tint blocking;\n\tint uses_numbered_reports;\n\tint disconnected;\n\tCFStringRef run_loop_mode;\n\tCFRunLoopRef run_loop;\n\tCFRunLoopSourceRef source;\n\tuint8_t *input_report_buf;\n\tCFIndex max_input_report_len;\n\tstruct input_report *input_reports;\n\n\tpthread_t thread;\n\tpthread_mutex_t mutex; /* Protects input_reports */\n\tpthread_cond_t condition;\n\tpthread_barrier_t barrier; /* Ensures correct startup sequence */\n\tpthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */\n\tint shutdown_thread;\n};\n\nstatic hid_device *new_hid_device(void)\n{\n\thid_device *dev = calloc(1, sizeof(hid_device));\n\tdev->device_handle = NULL;\n\tdev->blocking = 1;\n\tdev->uses_numbered_reports = 0;\n\tdev->disconnected = 0;\n\tdev->run_loop_mode = NULL;\n\tdev->run_loop = NULL;\n\tdev->source = NULL;\n\tdev->input_report_buf = NULL;\n\tdev->input_reports = NULL;\n\tdev->shutdown_thread = 0;\n\n\t/* Thread objects */\n\tpthread_mutex_init(&dev->mutex, NULL);\n\tpthread_cond_init(&dev->condition, NULL);\n\tpthread_barrier_init(&dev->barrier, NULL, 2);\n\tpthread_barrier_init(&dev->shutdown_barrier, NULL, 2);\n\n\treturn dev;\n}\n\nstatic void free_hid_device(hid_device *dev)\n{\n\tif (!dev)\n\t\treturn;\n\n\t/* Delete any input reports still left over. */\n\tstruct input_report *rpt = dev->input_reports;\n\twhile (rpt) {\n\t\tstruct input_report *next = rpt->next;\n\t\tfree(rpt->data);\n\t\tfree(rpt);\n\t\trpt = next;\n\t}\n\n\t/* Free the string and the report buffer. The check for NULL\n\t   is necessary here as CFRelease() doesn't handle NULL like\n\t   free() and others do. */\n\tif (dev->run_loop_mode)\n\t\tCFRelease(dev->run_loop_mode);\n\tif (dev->source)\n\t\tCFRelease(dev->source);\n\tfree(dev->input_report_buf);\n\n\t/* Clean up the thread objects */\n\tpthread_barrier_destroy(&dev->shutdown_barrier);\n\tpthread_barrier_destroy(&dev->barrier);\n\tpthread_cond_destroy(&dev->condition);\n\tpthread_mutex_destroy(&dev->mutex);\n\n\t/* Free the structure itself. */\n\tfree(dev);\n}\n\nstatic\tIOHIDManagerRef hid_mgr = 0x0;\n\n\n#if 0\nstatic void register_error(hid_device *device, const char *op)\n{\n\n}\n#endif\n\n\nstatic int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key)\n{\n\tCFTypeRef ref;\n\tint32_t value;\n\n\tref = IOHIDDeviceGetProperty(device, key);\n\tif (ref) {\n\t\tif (CFGetTypeID(ref) == CFNumberGetTypeID()) {\n\t\t\tCFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value);\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn 0;\n}\n\nstatic unsigned short get_vendor_id(IOHIDDeviceRef device)\n{\n\treturn get_int_property(device, CFSTR(kIOHIDVendorIDKey));\n}\n\nstatic unsigned short get_product_id(IOHIDDeviceRef device)\n{\n\treturn get_int_property(device, CFSTR(kIOHIDProductIDKey));\n}\n\nstatic int32_t get_max_report_length(IOHIDDeviceRef device)\n{\n\treturn get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey));\n}\n\nstatic int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len)\n{\n\tCFStringRef str;\n\n\tif (!len)\n\t\treturn 0;\n\n\tstr = IOHIDDeviceGetProperty(device, prop);\n\n\tbuf[0] = 0;\n\n\tif (str) {\n\t\tCFIndex str_len = CFStringGetLength(str);\n\t\tCFRange range;\n\t\tCFIndex used_buf_len;\n\t\tCFIndex chars_copied;\n\n\t\tlen --;\n\n\t\trange.location = 0;\n\t\trange.length = ((size_t)str_len > len)? len: (size_t)str_len;\n\t\tchars_copied = CFStringGetBytes(str,\n\t\t\trange,\n\t\t\tkCFStringEncodingUTF32LE,\n\t\t\t(char)'?',\n\t\t\tFALSE,\n\t\t\t(UInt8*)buf,\n\t\t\tlen * sizeof(wchar_t),\n\t\t\t&used_buf_len);\n\n\t\tif (chars_copied == len)\n\t\t\tbuf[len] = 0; /* len is decremented above */\n\t\telse\n\t\t\tbuf[chars_copied] = 0;\n\n\t\treturn 0;\n\t}\n\telse\n\t\treturn -1;\n\n}\n\nstatic int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len)\n{\n\treturn get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len);\n}\n\nstatic int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len)\n{\n\treturn get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len);\n}\n\nstatic int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len)\n{\n\treturn get_string_property(device, CFSTR(kIOHIDProductKey), buf, len);\n}\n\n\n/* Implementation of wcsdup() for Mac. */\nstatic wchar_t *dup_wcs(const wchar_t *s)\n{\n\tsize_t len = wcslen(s);\n\twchar_t *ret = malloc((len+1)*sizeof(wchar_t));\n\twcscpy(ret, s);\n\n\treturn ret;\n}\n\n/* hidapi_IOHIDDeviceGetService()\n *\n * Return the io_service_t corresponding to a given IOHIDDeviceRef, either by:\n * - on OS X 10.6 and above, calling IOHIDDeviceGetService()\n * - on OS X 10.5, extract it from the IOHIDDevice struct\n */\nstatic io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device)\n{\n\tstatic void *iokit_framework = NULL;\n\tstatic io_service_t (*dynamic_IOHIDDeviceGetService)(IOHIDDeviceRef device) = NULL;\n\n\t/* Use dlopen()/dlsym() to get a pointer to IOHIDDeviceGetService() if it exists.\n\t * If any of these steps fail, dynamic_IOHIDDeviceGetService will be left NULL\n\t * and the fallback method will be used.\n\t */\n\tif (iokit_framework == NULL) {\n\t\tiokit_framework = dlopen(\"/System/Library/IOKit.framework/IOKit\", RTLD_LAZY);\n\n\t\tif (iokit_framework != NULL)\n\t\t\tdynamic_IOHIDDeviceGetService = dlsym(iokit_framework, \"IOHIDDeviceGetService\");\n\t}\n\n\tif (dynamic_IOHIDDeviceGetService != NULL) {\n\t\t/* Running on OS X 10.6 and above: IOHIDDeviceGetService() exists */\n\t\treturn dynamic_IOHIDDeviceGetService(device);\n\t}\n\telse\n\t{\n\t\t/* Running on OS X 10.5: IOHIDDeviceGetService() doesn't exist.\n\t\t *\n\t\t * Be naughty and pull the service out of the IOHIDDevice.\n\t\t * IOHIDDevice is an opaque struct not exposed to applications, but its\n\t\t * layout is stable through all available versions of OS X.\n\t\t * Tested and working on OS X 10.5.8 i386, x86_64, and ppc.\n\t\t */\n\t\tstruct IOHIDDevice_internal {\n\t\t\t/* The first field of the IOHIDDevice struct is a\n\t\t\t * CFRuntimeBase (which is a private CF struct).\n\t\t\t *\n\t\t\t * a, b, and c are the 3 fields that make up a CFRuntimeBase.\n\t\t\t * See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h\n\t\t\t *\n\t\t\t * The second field of the IOHIDDevice is the io_service_t we're looking for.\n\t\t\t */\n\t\t\tuintptr_t a;\n\t\t\tuint8_t b[4];\n#if __LP64__\n\t\t\tuint32_t c;\n#endif\n\t\t\tio_service_t service;\n\t\t};\n\t\tstruct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device;\n\n\t\treturn tmp->service;\n\t}\n}\n\n/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */\nstatic int init_hid_manager(void)\n{\n\t/* Initialize all the HID Manager Objects */\n\thid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);\n\tif (hid_mgr) {\n\t\tIOHIDManagerSetDeviceMatching(hid_mgr, NULL);\n\t\tIOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);\n\t\treturn 0;\n\t}\n\n\treturn -1;\n}\n\n/* Initialize the IOHIDManager if necessary. This is the public function, and\n   it is safe to call this function repeatedly. Return 0 for success and -1\n   for failure. */\nint HID_API_EXPORT hid_init(void)\n{\n\tif (!hid_mgr) {\n\t\treturn init_hid_manager();\n\t}\n\n\t/* Already initialized. */\n\treturn 0;\n}\n\nint HID_API_EXPORT hid_exit(void)\n{\n\tif (hid_mgr) {\n\t\t/* Close the HID manager. */\n\t\tIOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone);\n\t\tCFRelease(hid_mgr);\n\t\thid_mgr = NULL;\n\t}\n\n\treturn 0;\n}\n\nstatic void process_pending_events(void) {\n\tSInt32 res;\n\tdo {\n\t\tres = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE);\n\t} while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut);\n}\n\nstruct hid_device_info  HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id)\n{\n\tstruct hid_device_info *root = NULL; /* return object */\n\tstruct hid_device_info *cur_dev = NULL;\n\tCFIndex num_devices;\n\tint i;\n\n\t/* Set up the HID Manager if it hasn't been done */\n\tif (hid_init() < 0)\n\t\treturn NULL;\n\n\t/* give the IOHIDManager a chance to update itself */\n\tprocess_pending_events();\n\n\t/* Get a list of the Devices */\n\tIOHIDManagerSetDeviceMatching(hid_mgr, NULL);\n\tCFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr);\n\n\t/* Convert the list into a C array so we can iterate easily. */\n\tnum_devices = CFSetGetCount(device_set);\n\tIOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef));\n\tCFSetGetValues(device_set, (const void **) device_array);\n\n\t/* Iterate over each device, making an entry for it. */\n\tfor (i = 0; i < num_devices; i++) {\n\t\tunsigned short dev_vid;\n\t\tunsigned short dev_pid;\n\t\t#define BUF_LEN 256\n\t\twchar_t buf[BUF_LEN];\n\n\t\tIOHIDDeviceRef dev = device_array[i];\n\n        if (!dev) {\n            continue;\n        }\n\t\tdev_vid = get_vendor_id(dev);\n\t\tdev_pid = get_product_id(dev);\n\n\t\t/* Check the VID/PID against the arguments */\n\t\tif ((vendor_id == 0x0 || vendor_id == dev_vid) &&\n\t\t    (product_id == 0x0 || product_id == dev_pid)) {\n\t\t\tstruct hid_device_info *tmp;\n\t\t\tio_object_t iokit_dev;\n\t\t\tkern_return_t res;\n\t\t\tio_string_t path;\n\n\t\t\t/* VID/PID match. Create the record. */\n\t\t\ttmp = malloc(sizeof(struct hid_device_info));\n\t\t\tif (cur_dev) {\n\t\t\t\tcur_dev->next = tmp;\n\t\t\t}\n\t\t\telse {\n\t\t\t\troot = tmp;\n\t\t\t}\n\t\t\tcur_dev = tmp;\n\n\t\t\t/* Get the Usage Page and Usage for this device. */\n\t\t\tcur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey));\n\t\t\tcur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey));\n\n\t\t\t/* Fill out the record */\n\t\t\tcur_dev->next = NULL;\n\n\t\t\t/* Fill in the path (IOService plane) */\n\t\t\tiokit_dev = hidapi_IOHIDDeviceGetService(dev);\n\t\t\tres = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path);\n\t\t\tif (res == KERN_SUCCESS)\n\t\t\t\tcur_dev->path = strdup(path);\n\t\t\telse\n\t\t\t\tcur_dev->path = strdup(\"\");\n\n\t\t\t/* Serial Number */\n\t\t\tget_serial_number(dev, buf, BUF_LEN);\n\t\t\tcur_dev->serial_number = dup_wcs(buf);\n\n\t\t\t/* Manufacturer and Product strings */\n\t\t\tget_manufacturer_string(dev, buf, BUF_LEN);\n\t\t\tcur_dev->manufacturer_string = dup_wcs(buf);\n\t\t\tget_product_string(dev, buf, BUF_LEN);\n\t\t\tcur_dev->product_string = dup_wcs(buf);\n\n\t\t\t/* VID/PID */\n\t\t\tcur_dev->vendor_id = dev_vid;\n\t\t\tcur_dev->product_id = dev_pid;\n\n\t\t\t/* Release Number */\n\t\t\tcur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey));\n\n\t\t\t/* Interface Number (Unsupported on Mac)*/\n\t\t\tcur_dev->interface_number = -1;\n\t\t}\n\t}\n\n\tfree(device_array);\n\tCFRelease(device_set);\n\n\treturn root;\n}\n\nvoid  HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs)\n{\n\t/* This function is identical to the Linux version. Platform independent. */\n\tstruct hid_device_info *d = devs;\n\twhile (d) {\n\t\tstruct hid_device_info *next = d->next;\n\t\tfree(d->path);\n\t\tfree(d->serial_number);\n\t\tfree(d->manufacturer_string);\n\t\tfree(d->product_string);\n\t\tfree(d);\n\t\td = next;\n\t}\n}\n\nhid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)\n{\n\t/* This function is identical to the Linux version. Platform independent. */\n\tstruct hid_device_info *devs, *cur_dev;\n\tconst char *path_to_open = NULL;\n\thid_device * handle = NULL;\n\n\tdevs = hid_enumerate(vendor_id, product_id);\n\tcur_dev = devs;\n\twhile (cur_dev) {\n\t\tif (cur_dev->vendor_id == vendor_id &&\n\t\t    cur_dev->product_id == product_id) {\n\t\t\tif (serial_number) {\n\t\t\t\tif (wcscmp(serial_number, cur_dev->serial_number) == 0) {\n\t\t\t\t\tpath_to_open = cur_dev->path;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpath_to_open = cur_dev->path;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tcur_dev = cur_dev->next;\n\t}\n\n\tif (path_to_open) {\n\t\t/* Open the device */\n\t\thandle = hid_open_path(path_to_open);\n\t}\n\n\thid_free_enumeration(devs);\n\n\treturn handle;\n}\n\nstatic void hid_device_removal_callback(void *context, IOReturn result,\n                                        void *sender)\n{\n\t/* Stop the Run Loop for this device. */\n\thid_device *d = context;\n\n\td->disconnected = 1;\n\tCFRunLoopStop(d->run_loop);\n}\n\n/* The Run Loop calls this function for each input report received.\n   This function puts the data into a linked list to be picked up by\n   hid_read(). */\nstatic void hid_report_callback(void *context, IOReturn result, void *sender,\n                         IOHIDReportType report_type, uint32_t report_id,\n                         uint8_t *report, CFIndex report_length)\n{\n\tstruct input_report *rpt;\n\thid_device *dev = context;\n\n\t/* Make a new Input Report object */\n\trpt = calloc(1, sizeof(struct input_report));\n\trpt->data = calloc(1, report_length);\n\tmemcpy(rpt->data, report, report_length);\n\trpt->len = report_length;\n\trpt->next = NULL;\n\n\t/* Lock this section */\n\tpthread_mutex_lock(&dev->mutex);\n\n\t/* Attach the new report object to the end of the list. */\n\tif (dev->input_reports == NULL) {\n\t\t/* The list is empty. Put it at the root. */\n\t\tdev->input_reports = rpt;\n\t}\n\telse {\n\t\t/* Find the end of the list and attach. */\n\t\tstruct input_report *cur = dev->input_reports;\n\t\tint num_queued = 0;\n\t\twhile (cur->next != NULL) {\n\t\t\tcur = cur->next;\n\t\t\tnum_queued++;\n\t\t}\n\t\tcur->next = rpt;\n\n\t\t/* Pop one off if we've reached 30 in the queue. This\n\t\t   way we don't grow forever if the user never reads\n\t\t   anything from the device. */\n\t\tif (num_queued > 30) {\n\t\t\treturn_data(dev, NULL, 0);\n\t\t}\n\t}\n\n\t/* Signal a waiting thread that there is data. */\n\tpthread_cond_signal(&dev->condition);\n\n\t/* Unlock */\n\tpthread_mutex_unlock(&dev->mutex);\n\n}\n\n/* This gets called when the read_thread's run loop gets signaled by\n   hid_close(), and serves to stop the read_thread's run loop. */\nstatic void perform_signal_callback(void *context)\n{\n\thid_device *dev = context;\n\tCFRunLoopStop(dev->run_loop); /*TODO: CFRunLoopGetCurrent()*/\n}\n\nstatic void *read_thread(void *param)\n{\n\thid_device *dev = param;\n\tSInt32 code;\n\n\t/* Move the device's run loop to this thread. */\n\tIOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode);\n\n\t/* Create the RunLoopSource which is used to signal the\n\t   event loop to stop when hid_close() is called. */\n\tCFRunLoopSourceContext ctx;\n\tmemset(&ctx, 0, sizeof(ctx));\n\tctx.version = 0;\n\tctx.info = dev;\n\tctx.perform = &perform_signal_callback;\n\tdev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx);\n\tCFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode);\n\n\t/* Store off the Run Loop so it can be stopped from hid_close()\n\t   and on device disconnection. */\n\tdev->run_loop = CFRunLoopGetCurrent();\n\n\t/* Notify the main thread that the read thread is up and running. */\n\tpthread_barrier_wait(&dev->barrier);\n\n\t/* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input\n\t   reports into the hid_report_callback(). */\n\twhile (!dev->shutdown_thread && !dev->disconnected) {\n\t\tcode = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE);\n\t\t/* Return if the device has been disconnected */\n\t\tif (code == kCFRunLoopRunFinished) {\n\t\t\tdev->disconnected = 1;\n\t\t\tbreak;\n\t\t}\n\n\n\t\t/* Break if The Run Loop returns Finished or Stopped. */\n\t\tif (code != kCFRunLoopRunTimedOut &&\n\t\t    code != kCFRunLoopRunHandledSource) {\n\t\t\t/* There was some kind of error. Setting\n\t\t\t   shutdown seems to make sense, but\n\t\t\t   there may be something else more appropriate */\n\t\t\tdev->shutdown_thread = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* Now that the read thread is stopping, Wake any threads which are\n\t   waiting on data (in hid_read_timeout()). Do this under a mutex to\n\t   make sure that a thread which is about to go to sleep waiting on\n\t   the condition actually will go to sleep before the condition is\n\t   signaled. */\n\tpthread_mutex_lock(&dev->mutex);\n\tpthread_cond_broadcast(&dev->condition);\n\tpthread_mutex_unlock(&dev->mutex);\n\n\t/* Wait here until hid_close() is called and makes it past\n\t   the call to CFRunLoopWakeUp(). This thread still needs to\n\t   be valid when that function is called on the other thread. */\n\tpthread_barrier_wait(&dev->shutdown_barrier);\n\n\treturn NULL;\n}\n\n/* hid_open_path()\n *\n * path must be a valid path to an IOHIDDevice in the IOService plane\n * Example: \"IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver\"\n */\nhid_device * HID_API_EXPORT hid_open_path(const char *path)\n{\n\thid_device *dev = NULL;\n\tio_registry_entry_t entry = MACH_PORT_NULL;\n\n\tdev = new_hid_device();\n\n\t/* Set up the HID Manager if it hasn't been done */\n\tif (hid_init() < 0)\n\t\treturn NULL;\n\n\t/* Get the IORegistry entry for the given path */\n\tentry = IORegistryEntryFromPath(kIOMasterPortDefault, path);\n\tif (entry == MACH_PORT_NULL) {\n\t\t/* Path wasn't valid (maybe device was removed?) */\n\t\tgoto return_error;\n\t}\n\n\t/* Create an IOHIDDevice for the entry */\n\tdev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry);\n\tif (dev->device_handle == NULL) {\n\t\t/* Error creating the HID device */\n\t\tgoto return_error;\n\t}\n\n\t/* Open the IOHIDDevice */\n\tIOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice);\n\tif (ret == kIOReturnSuccess) {\n\t\tchar str[32];\n\n\t\t/* Create the buffers for receiving data */\n\t\tdev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle);\n\t\tdev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t));\n\n\t\t/* Create the Run Loop Mode for this device.\n\t\t   printing the reference seems to work. */\n\t\tsprintf(str, \"HIDAPI_%p\", dev->device_handle);\n\t\tdev->run_loop_mode =\n\t\t\tCFStringCreateWithCString(NULL, str, kCFStringEncodingASCII);\n\n\t\t/* Attach the device to a Run Loop */\n\t\tIOHIDDeviceRegisterInputReportCallback(\n\t\t\tdev->device_handle, dev->input_report_buf, dev->max_input_report_len,\n\t\t\t&hid_report_callback, dev);\n\t\tIOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev);\n\n\t\t/* Start the read thread */\n\t\tpthread_create(&dev->thread, NULL, read_thread, dev);\n\n\t\t/* Wait here for the read thread to be initialized. */\n\t\tpthread_barrier_wait(&dev->barrier);\n\n\t\tIOObjectRelease(entry);\n\t\treturn dev;\n\t}\n\telse {\n\t\tgoto return_error;\n\t}\n\nreturn_error:\n\tif (dev->device_handle != NULL)\n\t\tCFRelease(dev->device_handle);\n\n\tif (entry != MACH_PORT_NULL)\n\t\tIOObjectRelease(entry);\n\n\tfree_hid_device(dev);\n\treturn NULL;\n}\n\nstatic int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length)\n{\n\tconst unsigned char *data_to_send;\n\tsize_t length_to_send;\n\tIOReturn res;\n\n\t/* Return if the device has been disconnected. */\n\tif (dev->disconnected)\n\t\treturn -1;\n\n\tif (data[0] == 0x0) {\n\t\t/* Not using numbered Reports.\n\t\t   Don't send the report number. */\n\t\tdata_to_send = data+1;\n\t\tlength_to_send = length-1;\n\t}\n\telse {\n\t\t/* Using numbered Reports.\n\t\t   Send the Report Number */\n\t\tdata_to_send = data;\n\t\tlength_to_send = length;\n\t}\n\n\tif (!dev->disconnected) {\n\t\tres = IOHIDDeviceSetReport(dev->device_handle,\n\t\t\t\t\t   type,\n\t\t\t\t\t   data[0], /* Report ID*/\n\t\t\t\t\t   data_to_send, length_to_send);\n\n\t\tif (res == kIOReturnSuccess) {\n\t\t\treturn length;\n\t\t}\n\t\telse\n\t\t\treturn -1;\n\t}\n\n\treturn -1;\n}\n\nint HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length)\n{\n\treturn set_report(dev, kIOHIDReportTypeOutput, data, length);\n}\n\n/* Helper function, so that this isn't duplicated in hid_read(). */\nstatic int return_data(hid_device *dev, unsigned char *data, size_t length)\n{\n\t/* Copy the data out of the linked list item (rpt) into the\n\t   return buffer (data), and delete the liked list item. */\n\tstruct input_report *rpt = dev->input_reports;\n\tsize_t len = (length < rpt->len)? length: rpt->len;\n\tmemcpy(data, rpt->data, len);\n\tdev->input_reports = rpt->next;\n\tfree(rpt->data);\n\tfree(rpt);\n\treturn len;\n}\n\nstatic int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex)\n{\n\twhile (!dev->input_reports) {\n\t\tint res = pthread_cond_wait(cond, mutex);\n\t\tif (res != 0)\n\t\t\treturn res;\n\n\t\t/* A res of 0 means we may have been signaled or it may\n\t\t   be a spurious wakeup. Check to see that there's acutally\n\t\t   data in the queue before returning, and if not, go back\n\t\t   to sleep. See the pthread_cond_timedwait() man page for\n\t\t   details. */\n\n\t\tif (dev->shutdown_thread || dev->disconnected)\n\t\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\nstatic int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)\n{\n\twhile (!dev->input_reports) {\n\t\tint res = pthread_cond_timedwait(cond, mutex, abstime);\n\t\tif (res != 0)\n\t\t\treturn res;\n\n\t\t/* A res of 0 means we may have been signaled or it may\n\t\t   be a spurious wakeup. Check to see that there's acutally\n\t\t   data in the queue before returning, and if not, go back\n\t\t   to sleep. See the pthread_cond_timedwait() man page for\n\t\t   details. */\n\n\t\tif (dev->shutdown_thread || dev->disconnected)\n\t\t\treturn -1;\n\t}\n\n\treturn 0;\n\n}\n\nint HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)\n{\n\tint bytes_read = -1;\n\n\t/* Lock the access to the report list. */\n\tpthread_mutex_lock(&dev->mutex);\n\n\t/* There's an input report queued up. Return it. */\n\tif (dev->input_reports) {\n\t\t/* Return the first one */\n\t\tbytes_read = return_data(dev, data, length);\n\t\tgoto ret;\n\t}\n\n\t/* Return if the device has been disconnected. */\n\tif (dev->disconnected) {\n\t\tbytes_read = -1;\n\t\tgoto ret;\n\t}\n\n\tif (dev->shutdown_thread) {\n\t\t/* This means the device has been closed (or there\n\t\t   has been an error. An error code of -1 should\n\t\t   be returned. */\n\t\tbytes_read = -1;\n\t\tgoto ret;\n\t}\n\n\t/* There is no data. Go to sleep and wait for data. */\n\n\tif (milliseconds == -1) {\n\t\t/* Blocking */\n\t\tint res;\n\t\tres = cond_wait(dev, &dev->condition, &dev->mutex);\n\t\tif (res == 0)\n\t\t\tbytes_read = return_data(dev, data, length);\n\t\telse {\n\t\t\t/* There was an error, or a device disconnection. */\n\t\t\tbytes_read = -1;\n\t\t}\n\t}\n\telse if (milliseconds > 0) {\n\t\t/* Non-blocking, but called with timeout. */\n\t\tint res;\n\t\tstruct timespec ts;\n\t\tstruct timeval tv;\n\t\tgettimeofday(&tv, NULL);\n\t\tTIMEVAL_TO_TIMESPEC(&tv, &ts);\n\t\tts.tv_sec += milliseconds / 1000;\n\t\tts.tv_nsec += (milliseconds % 1000) * 1000000;\n\t\tif (ts.tv_nsec >= 1000000000L) {\n\t\t\tts.tv_sec++;\n\t\t\tts.tv_nsec -= 1000000000L;\n\t\t}\n\n\t\tres = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts);\n\t\tif (res == 0)\n\t\t\tbytes_read = return_data(dev, data, length);\n\t\telse if (res == ETIMEDOUT)\n\t\t\tbytes_read = 0;\n\t\telse\n\t\t\tbytes_read = -1;\n\t}\n\telse {\n\t\t/* Purely non-blocking */\n\t\tbytes_read = 0;\n\t}\n\nret:\n\t/* Unlock */\n\tpthread_mutex_unlock(&dev->mutex);\n\treturn bytes_read;\n}\n\nint HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length)\n{\n\treturn hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0);\n}\n\nint HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock)\n{\n\t/* All Nonblocking operation is handled by the library. */\n\tdev->blocking = !nonblock;\n\n\treturn 0;\n}\n\nint HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length)\n{\n\treturn set_report(dev, kIOHIDReportTypeFeature, data, length);\n}\n\nint HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)\n{\n\tCFIndex len = length;\n\tIOReturn res;\n\n\t/* Return if the device has been unplugged. */\n\tif (dev->disconnected)\n\t\treturn -1;\n\n\tres = IOHIDDeviceGetReport(dev->device_handle,\n\t                           kIOHIDReportTypeFeature,\n\t                           data[0], /* Report ID */\n\t                           data, &len);\n\tif (res == kIOReturnSuccess)\n\t\treturn len;\n\telse\n\t\treturn -1;\n}\n\n\nvoid HID_API_EXPORT hid_close(hid_device *dev)\n{\n\tif (!dev)\n\t\treturn;\n\n\t/* Disconnect the report callback before close. */\n\tif (!dev->disconnected) {\n\t\tIOHIDDeviceRegisterInputReportCallback(\n\t\t\tdev->device_handle, dev->input_report_buf, dev->max_input_report_len,\n\t\t\tNULL, dev);\n\t\tIOHIDDeviceRegisterRemovalCallback(dev->device_handle, NULL, dev);\n\t\tIOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode);\n\t\tIOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode);\n\t}\n\n\t/* Cause read_thread() to stop. */\n\tdev->shutdown_thread = 1;\n\n\t/* Wake up the run thread's event loop so that the thread can exit. */\n\tCFRunLoopSourceSignal(dev->source);\n\tCFRunLoopWakeUp(dev->run_loop);\n\n\t/* Notify the read thread that it can shut down now. */\n\tpthread_barrier_wait(&dev->shutdown_barrier);\n\n\t/* Wait for read_thread() to end. */\n\tpthread_join(dev->thread, NULL);\n\n\t/* Close the OS handle to the device, but only if it's not\n\t   been unplugged. If it's been unplugged, then calling\n\t   IOHIDDeviceClose() will crash. */\n\tif (!dev->disconnected) {\n\t\tIOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeSeizeDevice);\n\t}\n\n\t/* Clear out the queue of received reports. */\n\tpthread_mutex_lock(&dev->mutex);\n\twhile (dev->input_reports) {\n\t\treturn_data(dev, NULL, 0);\n\t}\n\tpthread_mutex_unlock(&dev->mutex);\n\tCFRelease(dev->device_handle);\n\n\tfree_hid_device(dev);\n}\n\nint HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\treturn get_manufacturer_string(dev->device_handle, string, maxlen);\n}\n\nint HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\treturn get_product_string(dev->device_handle, string, maxlen);\n}\n\nint HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\treturn get_serial_number(dev->device_handle, string, maxlen);\n}\n\nint HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen)\n{\n\t/* TODO: */\n\n\treturn 0;\n}\n\n\nHID_API_EXPORT const wchar_t * HID_API_CALL  hid_error(hid_device *dev)\n{\n\t/* TODO: */\n\n\treturn NULL;\n}\n\n\n\n\n\n\n\n#if 0\nstatic int32_t get_location_id(IOHIDDeviceRef device)\n{\n\treturn get_int_property(device, CFSTR(kIOHIDLocationIDKey));\n}\n\nstatic int32_t get_usage(IOHIDDeviceRef device)\n{\n\tint32_t res;\n\tres = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey));\n\tif (!res)\n\t\tres = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey));\n\treturn res;\n}\n\nstatic int32_t get_usage_page(IOHIDDeviceRef device)\n{\n\tint32_t res;\n\tres = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey));\n\tif (!res)\n\t\tres = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey));\n\treturn res;\n}\n\nstatic int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len)\n{\n\treturn get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len);\n}\n\n\nint main(void)\n{\n\tIOHIDManagerRef mgr;\n\tint i;\n\n\tmgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);\n\tIOHIDManagerSetDeviceMatching(mgr, NULL);\n\tIOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone);\n\n\tCFSetRef device_set = IOHIDManagerCopyDevices(mgr);\n\n\tCFIndex num_devices = CFSetGetCount(device_set);\n\tIOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef));\n\tCFSetGetValues(device_set, (const void **) device_array);\n\n\tfor (i = 0; i < num_devices; i++) {\n\t\tIOHIDDeviceRef dev = device_array[i];\n\t\tprintf(\"Device: %p\\n\", dev);\n\t\tprintf(\"  %04hx %04hx\\n\", get_vendor_id(dev), get_product_id(dev));\n\n\t\twchar_t serial[256], buf[256];\n\t\tchar cbuf[256];\n\t\tget_serial_number(dev, serial, 256);\n\n\n\t\tprintf(\"  Serial: %ls\\n\", serial);\n\t\tprintf(\"  Loc: %ld\\n\", get_location_id(dev));\n\t\tget_transport(dev, buf, 256);\n\t\tprintf(\"  Trans: %ls\\n\", buf);\n\t\tmake_path(dev, cbuf, 256);\n\t\tprintf(\"  Path: %s\\n\", cbuf);\n\n\t}\n\n\treturn 0;\n}\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/hidapi/windows/hid.c",
    "content": "/*******************************************************\n HIDAPI - Multi-Platform library for\n communication with HID devices.\n\n Alan Ott\n Signal 11 Software\n\n 8/22/2009\n\n Copyright 2009, All Rights Reserved.\n \n At the discretion of the user of this library,\n this software may be licensed under the terms of the\n GNU General Public License v3, a BSD-Style license, or the\n original HIDAPI license as outlined in the LICENSE.txt,\n LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt\n files located at the root of the source distribution.\n These files may also be found in the public source\n code repository located at:\n        http://github.com/signal11/hidapi .\n********************************************************/\n\n#include <windows.h>\n\n#ifndef _NTDEF_\ntypedef LONG NTSTATUS;\n#endif\n\n#ifdef __MINGW32__\n#include <ntdef.h>\n#include <winbase.h>\n#endif\n\n#ifdef __CYGWIN__\n#include <ntdef.h>\n#define _wcsdup wcsdup\n#endif\n\n/* The maximum number of characters that can be passed into the\n   HidD_Get*String() functions without it failing.*/\n#define MAX_STRING_WCHARS 0xFFF\n\n/*#define HIDAPI_USE_DDK*/\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\t#include <setupapi.h>\n\t#include <winioctl.h>\n\t#ifdef HIDAPI_USE_DDK\n\t\t#include <hidsdi.h>\n\t#endif\n\n\t/* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */\n\t#define HID_OUT_CTL_CODE(id)  \\\n\t\tCTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)\n\t#define IOCTL_HID_GET_FEATURE                   HID_OUT_CTL_CODE(100)\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n\n\n#include \"hidapi.h\"\n\n#undef MIN\n#define MIN(x,y) ((x) < (y)? (x): (y))\n\n#ifdef _MSC_VER\n\t/* Thanks Microsoft, but I know how to use strncpy(). */\n\t#pragma warning(disable:4996)\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef HIDAPI_USE_DDK\n\t/* Since we're not building with the DDK, and the HID header\n\t   files aren't part of the SDK, we have to define all this\n\t   stuff here. In lookup_functions(), the function pointers\n\t   defined below are set. */\n\ttypedef struct _HIDD_ATTRIBUTES{\n\t\tULONG Size;\n\t\tUSHORT VendorID;\n\t\tUSHORT ProductID;\n\t\tUSHORT VersionNumber;\n\t} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;\n\n\ttypedef USHORT USAGE;\n\ttypedef struct _HIDP_CAPS {\n\t\tUSAGE Usage;\n\t\tUSAGE UsagePage;\n\t\tUSHORT InputReportByteLength;\n\t\tUSHORT OutputReportByteLength;\n\t\tUSHORT FeatureReportByteLength;\n\t\tUSHORT Reserved[17];\n\t\tUSHORT fields_not_used_by_hidapi[10];\n\t} HIDP_CAPS, *PHIDP_CAPS;\n\ttypedef void* PHIDP_PREPARSED_DATA;\n\t#define HIDP_STATUS_SUCCESS 0x110000\n\n\ttypedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib);\n\ttypedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len);\n\ttypedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len);\n\ttypedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len);\n\ttypedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length);\n\ttypedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length);\n\ttypedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len);\n\ttypedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data);\n\ttypedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data);\n\ttypedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps);\n\ttypedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers);\n\n\tstatic HidD_GetAttributes_ HidD_GetAttributes;\n\tstatic HidD_GetSerialNumberString_ HidD_GetSerialNumberString;\n\tstatic HidD_GetManufacturerString_ HidD_GetManufacturerString;\n\tstatic HidD_GetProductString_ HidD_GetProductString;\n\tstatic HidD_SetFeature_ HidD_SetFeature;\n\tstatic HidD_GetFeature_ HidD_GetFeature;\n\tstatic HidD_GetIndexedString_ HidD_GetIndexedString;\n\tstatic HidD_GetPreparsedData_ HidD_GetPreparsedData;\n\tstatic HidD_FreePreparsedData_ HidD_FreePreparsedData;\n\tstatic HidP_GetCaps_ HidP_GetCaps;\n\tstatic HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers;\n\n\tstatic HMODULE lib_handle = NULL;\n\tstatic BOOLEAN initialized = FALSE;\n#endif /* HIDAPI_USE_DDK */\n\nstruct hid_device_ {\n\t\tHANDLE device_handle;\n\t\tBOOL blocking;\n\t\tUSHORT output_report_length;\n\t\tsize_t input_report_length;\n\t\tvoid *last_error_str;\n\t\tDWORD last_error_num;\n\t\tBOOL read_pending;\n\t\tchar *read_buf;\n\t\tOVERLAPPED ol;\n};\n\nstatic hid_device *new_hid_device()\n{\n\thid_device *dev = (hid_device*) calloc(1, sizeof(hid_device));\n\tdev->device_handle = INVALID_HANDLE_VALUE;\n\tdev->blocking = TRUE;\n\tdev->output_report_length = 0;\n\tdev->input_report_length = 0;\n\tdev->last_error_str = NULL;\n\tdev->last_error_num = 0;\n\tdev->read_pending = FALSE;\n\tdev->read_buf = NULL;\n\tmemset(&dev->ol, 0, sizeof(dev->ol));\n\tdev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL);\n\n\treturn dev;\n}\n\nstatic void free_hid_device(hid_device *dev)\n{\n\tCloseHandle(dev->ol.hEvent);\n\tCloseHandle(dev->device_handle);\n\tLocalFree(dev->last_error_str);\n\tfree(dev->read_buf);\n\tfree(dev);\n}\n\nstatic void register_error(hid_device *device, const char *op)\n{\n\tWCHAR *ptr, *msg;\n\n\tFormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |\n\t\tFORMAT_MESSAGE_FROM_SYSTEM |\n\t\tFORMAT_MESSAGE_IGNORE_INSERTS,\n\t\tNULL,\n\t\tGetLastError(),\n\t\tMAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n\t\t(LPVOID)&msg, 0/*sz*/,\n\t\tNULL);\n\t\n\t/* Get rid of the CR and LF that FormatMessage() sticks at the\n\t   end of the message. Thanks Microsoft! */\n\tptr = msg;\n\twhile (*ptr) {\n\t\tif (*ptr == '\\r') {\n\t\t\t*ptr = 0x0000;\n\t\t\tbreak;\n\t\t}\n\t\tptr++;\n\t}\n\n\t/* Store the message off in the Device entry so that\n\t   the hid_error() function can pick it up. */\n\tLocalFree(device->last_error_str);\n\tdevice->last_error_str = msg;\n}\n\n#ifndef HIDAPI_USE_DDK\nstatic int lookup_functions()\n{\n\tlib_handle = LoadLibraryA(\"hid.dll\");\n\tif (lib_handle) {\n#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1;\n\t\tRESOLVE(HidD_GetAttributes);\n\t\tRESOLVE(HidD_GetSerialNumberString);\n\t\tRESOLVE(HidD_GetManufacturerString);\n\t\tRESOLVE(HidD_GetProductString);\n\t\tRESOLVE(HidD_SetFeature);\n\t\tRESOLVE(HidD_GetFeature);\n\t\tRESOLVE(HidD_GetIndexedString);\n\t\tRESOLVE(HidD_GetPreparsedData);\n\t\tRESOLVE(HidD_FreePreparsedData);\n\t\tRESOLVE(HidP_GetCaps);\n\t\tRESOLVE(HidD_SetNumInputBuffers);\n#undef RESOLVE\n\t}\n\telse\n\t\treturn -1;\n\n\treturn 0;\n}\n#endif\n\nstatic HANDLE open_device(const char *path, BOOL enumerate)\n{\n\tHANDLE handle;\n\tDWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ);\n\tDWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;\n\n\thandle = CreateFileA(path,\n\t\tdesired_access,\n\t\tshare_mode,\n\t\tNULL,\n\t\tOPEN_EXISTING,\n\t\tFILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/\n\t\t0);\n\n\treturn handle;\n}\n\nint HID_API_EXPORT hid_init(void)\n{\n#ifndef HIDAPI_USE_DDK\n\tif (!initialized) {\n\t\tif (lookup_functions() < 0) {\n\t\t\thid_exit();\n\t\t\treturn -1;\n\t\t}\n\t\tinitialized = TRUE;\n\t}\n#endif\n\treturn 0;\n}\n\nint HID_API_EXPORT hid_exit(void)\n{\n#ifndef HIDAPI_USE_DDK\n\tif (lib_handle)\n\t\tFreeLibrary(lib_handle);\n\tlib_handle = NULL;\n\tinitialized = FALSE;\n#endif\n\treturn 0;\n}\n\nstruct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id)\n{\n\tBOOL res;\n\tstruct hid_device_info *root = NULL; /* return object */\n\tstruct hid_device_info *cur_dev = NULL;\n\n\t/* Windows objects for interacting with the driver. */\n\tGUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} };\n\tSP_DEVINFO_DATA devinfo_data;\n\tSP_DEVICE_INTERFACE_DATA device_interface_data;\n\tSP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL;\n\tHDEVINFO device_info_set = INVALID_HANDLE_VALUE;\n\tint device_index = 0;\n\tint i;\n\n\tif (hid_init() < 0)\n\t\treturn NULL;\n\n\t/* Initialize the Windows objects. */\n\tmemset(&devinfo_data, 0x0, sizeof(devinfo_data));\n\tdevinfo_data.cbSize = sizeof(SP_DEVINFO_DATA);\n\tdevice_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);\n\n\t/* Get information for all the devices belonging to the HID class. */\n\tdevice_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);\n\t\n\t/* Iterate over each device in the HID class, looking for the right one. */\n\t\n\tfor (;;) {\n\t\tHANDLE write_handle = INVALID_HANDLE_VALUE;\n\t\tDWORD required_size = 0;\n\t\tHIDD_ATTRIBUTES attrib;\n\n\t\tres = SetupDiEnumDeviceInterfaces(device_info_set,\n\t\t\tNULL,\n\t\t\t&InterfaceClassGuid,\n\t\t\tdevice_index,\n\t\t\t&device_interface_data);\n\t\t\n\t\tif (!res) {\n\t\t\t/* A return of FALSE from this function means that\n\t\t\t   there are no more devices. */\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Call with 0-sized detail size, and let the function\n\t\t   tell us how long the detail struct needs to be. The\n\t\t   size is put in &required_size. */\n\t\tres = SetupDiGetDeviceInterfaceDetailA(device_info_set,\n\t\t\t&device_interface_data,\n\t\t\tNULL,\n\t\t\t0,\n\t\t\t&required_size,\n\t\t\tNULL);\n\n\t\t/* Allocate a long enough structure for device_interface_detail_data. */\n\t\tdevice_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size);\n\t\tdevice_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);\n\n\t\t/* Get the detailed data for this device. The detail data gives us\n\t\t   the device path for this device, which is then passed into\n\t\t   CreateFile() to get a handle to the device. */\n\t\tres = SetupDiGetDeviceInterfaceDetailA(device_info_set,\n\t\t\t&device_interface_data,\n\t\t\tdevice_interface_detail_data,\n\t\t\trequired_size,\n\t\t\tNULL,\n\t\t\tNULL);\n\n\t\tif (!res) {\n\t\t\t/* register_error(dev, \"Unable to call SetupDiGetDeviceInterfaceDetail\");\n\t\t\t   Continue to the next device. */\n\t\t\tgoto cont;\n\t\t}\n\n\t\t/* Make sure this device is of Setup Class \"HIDClass\" and has a\n\t\t   driver bound to it. */\n\t\tfor (i = 0; ; i++) {\n\t\t\tchar driver_name[256];\n\n\t\t\t/* Populate devinfo_data. This function will return failure\n\t\t\t   when there are no more interfaces left. */\n\t\t\tres = SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data);\n\t\t\tif (!res)\n\t\t\t\tgoto cont;\n\n\t\t\tres = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data,\n\t\t\t               SPDRP_CLASS, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL);\n\t\t\tif (!res)\n\t\t\t\tgoto cont;\n\n\t\t\tif (strcmp(driver_name, \"HIDClass\") == 0) {\n\t\t\t\t/* See if there's a driver bound. */\n\t\t\t\tres = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data,\n\t\t\t\t           SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL);\n\t\t\t\tif (res)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//wprintf(L\"HandleName: %s\\n\", device_interface_detail_data->DevicePath);\n\n\t\t/* Open a handle to the device */\n\t\twrite_handle = open_device(device_interface_detail_data->DevicePath, TRUE);\n\n\t\t/* Check validity of write_handle. */\n\t\tif (write_handle == INVALID_HANDLE_VALUE) {\n\t\t\t/* Unable to open the device. */\n\t\t\t//register_error(dev, \"CreateFile\");\n\t\t\tgoto cont_close;\n\t\t}\t\t\n\n\n\t\t/* Get the Vendor ID and Product ID for this device. */\n\t\tattrib.Size = sizeof(HIDD_ATTRIBUTES);\n\t\tHidD_GetAttributes(write_handle, &attrib);\n\t\t//wprintf(L\"Product/Vendor: %x %x\\n\", attrib.ProductID, attrib.VendorID);\n\n\t\t/* Check the VID/PID to see if we should add this\n\t\t   device to the enumeration list. */\n\t\tif ((vendor_id == 0x0 || attrib.VendorID == vendor_id) &&\n\t\t    (product_id == 0x0 || attrib.ProductID == product_id)) {\n\n\t\t\t#define WSTR_LEN 512\n\t\t\tconst char *str;\n\t\t\tstruct hid_device_info *tmp;\n\t\t\tPHIDP_PREPARSED_DATA pp_data = NULL;\n\t\t\tHIDP_CAPS caps;\n\t\t\tBOOLEAN res;\n\t\t\tNTSTATUS nt_res;\n\t\t\twchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */\n\t\t\tsize_t len;\n\n\t\t\t/* VID/PID match. Create the record. */\n\t\t\ttmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info));\n\t\t\tif (cur_dev) {\n\t\t\t\tcur_dev->next = tmp;\n\t\t\t}\n\t\t\telse {\n\t\t\t\troot = tmp;\n\t\t\t}\n\t\t\tcur_dev = tmp;\n\n\t\t\t/* Get the Usage Page and Usage for this device. */\n\t\t\tres = HidD_GetPreparsedData(write_handle, &pp_data);\n\t\t\tif (res) {\n\t\t\t\tnt_res = HidP_GetCaps(pp_data, &caps);\n\t\t\t\tif (nt_res == HIDP_STATUS_SUCCESS) {\n\t\t\t\t\tcur_dev->usage_page = caps.UsagePage;\n\t\t\t\t\tcur_dev->usage = caps.Usage;\n\t\t\t\t}\n\n\t\t\t\tHidD_FreePreparsedData(pp_data);\n\t\t\t}\n\t\t\t\n\t\t\t/* Fill out the record */\n\t\t\tcur_dev->next = NULL;\n\t\t\tstr = device_interface_detail_data->DevicePath;\n\t\t\tif (str) {\n\t\t\t\tlen = strlen(str);\n\t\t\t\tcur_dev->path = (char*) calloc(len+1, sizeof(char));\n\t\t\t\tstrncpy(cur_dev->path, str, len+1);\n\t\t\t\tcur_dev->path[len] = '\\0';\n\t\t\t}\n\t\t\telse\n\t\t\t\tcur_dev->path = NULL;\n\n\t\t\t/* Serial Number */\n\t\t\tres = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr));\n\t\t\twstr[WSTR_LEN-1] = 0x0000;\n\t\t\tif (res) {\n\t\t\t\tcur_dev->serial_number = _wcsdup(wstr);\n\t\t\t}\n\n\t\t\t/* Manufacturer String */\n\t\t\tres = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr));\n\t\t\twstr[WSTR_LEN-1] = 0x0000;\n\t\t\tif (res) {\n\t\t\t\tcur_dev->manufacturer_string = _wcsdup(wstr);\n\t\t\t}\n\n\t\t\t/* Product String */\n\t\t\tres = HidD_GetProductString(write_handle, wstr, sizeof(wstr));\n\t\t\twstr[WSTR_LEN-1] = 0x0000;\n\t\t\tif (res) {\n\t\t\t\tcur_dev->product_string = _wcsdup(wstr);\n\t\t\t}\n\n\t\t\t/* VID/PID */\n\t\t\tcur_dev->vendor_id = attrib.VendorID;\n\t\t\tcur_dev->product_id = attrib.ProductID;\n\n\t\t\t/* Release Number */\n\t\t\tcur_dev->release_number = attrib.VersionNumber;\n\n\t\t\t/* Interface Number. It can sometimes be parsed out of the path\n\t\t\t   on Windows if a device has multiple interfaces. See\n\t\t\t   http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or\n\t\t\t   search for \"Hardware IDs for HID Devices\" at MSDN. If it's not\n\t\t\t   in the path, it's set to -1. */\n\t\t\tcur_dev->interface_number = -1;\n\t\t\tif (cur_dev->path) {\n\t\t\t\tchar *interface_component = strstr(cur_dev->path, \"&mi_\");\n\t\t\t\tif (interface_component) {\n\t\t\t\t\tchar *hex_str = interface_component + 4;\n\t\t\t\t\tchar *endptr = NULL;\n\t\t\t\t\tcur_dev->interface_number = strtol(hex_str, &endptr, 16);\n\t\t\t\t\tif (endptr == hex_str) {\n\t\t\t\t\t\t/* The parsing failed. Set interface_number to -1. */\n\t\t\t\t\t\tcur_dev->interface_number = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\ncont_close:\n\t\tCloseHandle(write_handle);\ncont:\n\t\t/* We no longer need the detail data. It can be freed */\n\t\tfree(device_interface_detail_data);\n\n\t\tdevice_index++;\n\n\t}\n\n\t/* Close the device information handle. */\n\tSetupDiDestroyDeviceInfoList(device_info_set);\n\n\treturn root;\n\n}\n\nvoid  HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs)\n{\n\t/* TODO: Merge this with the Linux version. This function is platform-independent. */\n\tstruct hid_device_info *d = devs;\n\twhile (d) {\n\t\tstruct hid_device_info *next = d->next;\n\t\tfree(d->path);\n\t\tfree(d->serial_number);\n\t\tfree(d->manufacturer_string);\n\t\tfree(d->product_string);\n\t\tfree(d);\n\t\td = next;\n\t}\n}\n\n\nHID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)\n{\n\t/* TODO: Merge this functions with the Linux version. This function should be platform independent. */\n\tstruct hid_device_info *devs, *cur_dev;\n\tconst char *path_to_open = NULL;\n\thid_device *handle = NULL;\n\t\n\tdevs = hid_enumerate(vendor_id, product_id);\n\tcur_dev = devs;\n\twhile (cur_dev) {\n\t\tif (cur_dev->vendor_id == vendor_id &&\n\t\t    cur_dev->product_id == product_id) {\n\t\t\tif (serial_number) {\n\t\t\t\tif (wcscmp(serial_number, cur_dev->serial_number) == 0) {\n\t\t\t\t\tpath_to_open = cur_dev->path;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tpath_to_open = cur_dev->path;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tcur_dev = cur_dev->next;\n\t}\n\n\tif (path_to_open) {\n\t\t/* Open the device */\n\t\thandle = hid_open_path(path_to_open);\n\t}\n\n\thid_free_enumeration(devs);\n\t\n\treturn handle;\n}\n\nHID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path)\n{\n\thid_device *dev;\n\tHIDP_CAPS caps;\n\tPHIDP_PREPARSED_DATA pp_data = NULL;\n\tBOOLEAN res;\n\tNTSTATUS nt_res;\n\n\tif (hid_init() < 0) {\n\t\treturn NULL;\n\t}\n\n\tdev = new_hid_device();\n\n\t/* Open a handle to the device */\n\tdev->device_handle = open_device(path, FALSE);\n\n\t/* Check validity of write_handle. */\n\tif (dev->device_handle == INVALID_HANDLE_VALUE) {\n\t\t/* Unable to open the device. */\n\t\tregister_error(dev, \"CreateFile\");\n\t\tgoto err;\n\t}\n\n\t/* Set the Input Report buffer size to 64 reports. */\n\tres = HidD_SetNumInputBuffers(dev->device_handle, 64);\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_SetNumInputBuffers\");\n\t\tgoto err;\n\t}\n\n\t/* Get the Input Report length for the device. */\n\tres = HidD_GetPreparsedData(dev->device_handle, &pp_data);\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_GetPreparsedData\");\n\t\tgoto err;\n\t}\n\tnt_res = HidP_GetCaps(pp_data, &caps);\n\tif (nt_res != HIDP_STATUS_SUCCESS) {\n\t\tregister_error(dev, \"HidP_GetCaps\");\t\n\t\tgoto err_pp_data;\n\t}\n\tdev->output_report_length = caps.OutputReportByteLength;\n\tdev->input_report_length = caps.InputReportByteLength;\n\tHidD_FreePreparsedData(pp_data);\n\n\tdev->read_buf = (char*) malloc(dev->input_report_length);\n\n\treturn dev;\n\nerr_pp_data:\n\t\tHidD_FreePreparsedData(pp_data);\nerr:\t\n\t\tfree_hid_device(dev);\n\t\treturn NULL;\n}\n\nint HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length)\n{\n\tDWORD bytes_written;\n\tBOOL res;\n\n\tOVERLAPPED ol;\n\tunsigned char *buf;\n\tmemset(&ol, 0, sizeof(ol));\n\n\t/* Make sure the right number of bytes are passed to WriteFile. Windows\n\t   expects the number of bytes which are in the _longest_ report (plus\n\t   one for the report number) bytes even if the data is a report\n\t   which is shorter than that. Windows gives us this value in\n\t   caps.OutputReportByteLength. If a user passes in fewer bytes than this,\n\t   create a temporary buffer which is the proper size. */\n\tif (length >= dev->output_report_length) {\n\t\t/* The user passed the right number of bytes. Use the buffer as-is. */\n\t\tbuf = (unsigned char *) data;\n\t} else {\n\t\t/* Create a temporary buffer and copy the user's data\n\t\t   into it, padding the rest with zeros. */\n\t\tbuf = (unsigned char *) malloc(dev->output_report_length);\n\t\tmemcpy(buf, data, length);\n\t\tmemset(buf + length, 0, dev->output_report_length - length);\n\t\tlength = dev->output_report_length;\n\t}\n\n\tres = WriteFile(dev->device_handle, buf, length, NULL, &ol);\n\t\n\tif (!res) {\n\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\t/* WriteFile() failed. Return error. */\n\t\t\tregister_error(dev, \"WriteFile\");\n\t\t\tbytes_written = -1;\n\t\t\tgoto end_of_function;\n\t\t}\n\t}\n\n\t/* Wait here until the write is done. This makes\n\t   hid_write() synchronous. */\n\tres = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/);\n\tif (!res) {\n\t\t/* The Write operation failed. */\n\t\tregister_error(dev, \"WriteFile\");\n\t\tbytes_written = -1;\n\t\tgoto end_of_function;\n\t}\n\nend_of_function:\n\tif (buf != data)\n\t\tfree(buf);\n\n\treturn bytes_written;\n}\n\n\nint HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)\n{\n\tDWORD bytes_read = 0;\n\tsize_t copy_len = 0;\n\tBOOL res;\n\n\t/* Copy the handle for convenience. */\n\tHANDLE ev = dev->ol.hEvent;\n\n\tif (!dev->read_pending) {\n\t\t/* Start an Overlapped I/O read. */\n\t\tdev->read_pending = TRUE;\n\t\tmemset(dev->read_buf, 0, dev->input_report_length);\n\t\tResetEvent(ev);\n\t\tres = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol);\n\t\t\n\t\tif (!res) {\n\t\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\t\t/* ReadFile() has failed.\n\t\t\t\t   Clean up and return error. */\n\t\t\t\tCancelIo(dev->device_handle);\n\t\t\t\tdev->read_pending = FALSE;\n\t\t\t\tgoto end_of_function;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (milliseconds >= 0) {\n\t\t/* See if there is any data yet. */\n\t\tres = WaitForSingleObject(ev, milliseconds);\n\t\tif (res != WAIT_OBJECT_0) {\n\t\t\t/* There was no data this time. Return zero bytes available,\n\t\t\t   but leave the Overlapped I/O running. */\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/* Either WaitForSingleObject() told us that ReadFile has completed, or\n\t   we are in non-blocking mode. Get the number of bytes read. The actual\n\t   data has been copied to the data[] array which was passed to ReadFile(). */\n\tres = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/);\n\t\n\t/* Set pending back to false, even if GetOverlappedResult() returned error. */\n\tdev->read_pending = FALSE;\n\n\tif (res && bytes_read > 0) {\n\t\tif (dev->read_buf[0] == 0x0) {\n\t\t\t/* If report numbers aren't being used, but Windows sticks a report\n\t\t\t   number (0x0) on the beginning of the report anyway. To make this\n\t\t\t   work like the other platforms, and to make it work more like the\n\t\t\t   HID spec, we'll skip over this byte. */\n\t\t\tbytes_read--;\n\t\t\tcopy_len = length > bytes_read ? bytes_read : length;\n\t\t\tmemcpy(data, dev->read_buf+1, copy_len);\n\t\t}\n\t\telse {\n\t\t\t/* Copy the whole buffer, report number and all. */\n\t\t\tcopy_len = length > bytes_read ? bytes_read : length;\n\t\t\tmemcpy(data, dev->read_buf, copy_len);\n\t\t}\n\t}\n\t\nend_of_function:\n\tif (!res) {\n\t\tregister_error(dev, \"GetOverlappedResult\");\n\t\treturn -1;\n\t}\n\t\n\treturn copy_len;\n}\n\nint HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length)\n{\n\treturn hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0);\n}\n\nint HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock)\n{\n\tdev->blocking = !nonblock;\n\treturn 0; /* Success */\n}\n\nint HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length)\n{\n\tBOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, length);\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_SetFeature\");\n\t\treturn -1;\n\t}\n\n\treturn length;\n}\n\n\nint HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length)\n{\n\tBOOL res;\n#if 0\n\tres = HidD_GetFeature(dev->device_handle, data, length);\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_GetFeature\");\n\t\treturn -1;\n\t}\n\treturn 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */\n#else\n\tDWORD bytes_returned;\n\n\tOVERLAPPED ol;\n\tmemset(&ol, 0, sizeof(ol));\n\n\tres = DeviceIoControl(dev->device_handle,\n\t\tIOCTL_HID_GET_FEATURE,\n\t\tdata, length,\n\t\tdata, length,\n\t\t&bytes_returned, &ol);\n\n\tif (!res) {\n\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\t/* DeviceIoControl() failed. Return error. */\n\t\t\tregister_error(dev, \"Send Feature Report DeviceIoControl\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\t/* Wait here until the write is done. This makes\n\t   hid_get_feature_report() synchronous. */\n\tres = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/);\n\tif (!res) {\n\t\t/* The operation failed. */\n\t\tregister_error(dev, \"Send Feature Report GetOverLappedResult\");\n\t\treturn -1;\n\t}\n\n\t/* bytes_returned does not include the first byte which contains the\n\t   report ID. The data buffer actually contains one more byte than\n\t   bytes_returned. */\n\tbytes_returned++;\n\n\treturn bytes_returned;\n#endif\n}\n\nvoid HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev)\n{\n\tif (!dev)\n\t\treturn;\n\tCancelIo(dev->device_handle);\n\tfree_hid_device(dev);\n}\n\nint HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\tBOOL res;\n\n\tres = HidD_GetManufacturerString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS));\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_GetManufacturerString\");\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\nint HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\tBOOL res;\n\n\tres = HidD_GetProductString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS));\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_GetProductString\");\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\nint HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen)\n{\n\tBOOL res;\n\n\tres = HidD_GetSerialNumberString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS));\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_GetSerialNumberString\");\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\nint HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen)\n{\n\tBOOL res;\n\n\tres = HidD_GetIndexedString(dev->device_handle, string_index, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS));\n\tif (!res) {\n\t\tregister_error(dev, \"HidD_GetIndexedString\");\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n\n\nHID_API_EXPORT const wchar_t * HID_API_CALL  hid_error(hid_device *dev)\n{\n\treturn (wchar_t*)dev->last_error_str;\n}\n\n\n/*#define PICPGM*/\n/*#define S11*/\n#define P32\n#ifdef S11 \n  unsigned short VendorID = 0xa0a0;\n\tunsigned short ProductID = 0x0001;\n#endif\n\n#ifdef P32\n  unsigned short VendorID = 0x04d8;\n\tunsigned short ProductID = 0x3f;\n#endif\n\n\n#ifdef PICPGM\n  unsigned short VendorID = 0x04d8;\n  unsigned short ProductID = 0x0033;\n#endif\n\n\n#if 0\nint __cdecl main(int argc, char* argv[])\n{\n\tint res;\n\tunsigned char buf[65];\n\n\tUNREFERENCED_PARAMETER(argc);\n\tUNREFERENCED_PARAMETER(argv);\n\n\t/* Set up the command buffer. */\n\tmemset(buf,0x00,sizeof(buf));\n\tbuf[0] = 0;\n\tbuf[1] = 0x81;\n\t\n\n\t/* Open the device. */\n\tint handle = open(VendorID, ProductID, L\"12345\");\n\tif (handle < 0)\n\t\tprintf(\"unable to open device\\n\");\n\n\n\t/* Toggle LED (cmd 0x80) */\n\tbuf[1] = 0x80;\n\tres = write(handle, buf, 65);\n\tif (res < 0)\n\t\tprintf(\"Unable to write()\\n\");\n\n\t/* Request state (cmd 0x81) */\n\tbuf[1] = 0x81;\n\twrite(handle, buf, 65);\n\tif (res < 0)\n\t\tprintf(\"Unable to write() (2)\\n\");\n\n\t/* Read requested state */\n\tread(handle, buf, 65);\n\tif (res < 0)\n\t\tprintf(\"Unable to read()\\n\");\n\n\t/* Print out the returned buffer. */\n\tfor (int i = 0; i < 4; i++)\n\t\tprintf(\"buf[%d]: %d\\n\", i, buf[i]);\n\n\treturn 0;\n}\n#endif\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/AUTHORS",
    "content": "Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\nCopyright © 2007-2009 Daniel Drake <dsd@gentoo.org>\nCopyright © 2010-2012 Peter Stuge <peter@stuge.se>\nCopyright © 2008-2016 Nathan Hjelm <hjelmn@users.sourceforge.net>\nCopyright © 2009-2013 Pete Batard <pete@akeo.ie>\nCopyright © 2009-2013 Ludovic Rousseau <ludovic.rousseau@gmail.com>\nCopyright © 2010-2012 Michael Plante <michael.plante@gmail.com>\nCopyright © 2011-2013 Hans de Goede <hdegoede@redhat.com>\nCopyright © 2012-2013 Martin Pieuchot <mpi@openbsd.org>\nCopyright © 2012-2013 Toby Gray <toby.gray@realvnc.com>\nCopyright © 2013-2015 Chris Dickens <christopher.a.dickens@gmail.com>\n\nOther contributors:\nAkshay Jaggi\nAlan Ott\nAlan Stern\nAlex Vatchenko\nAndrew Fernandes\nAnthony Clay\nAntonio Ospite\nArtem Egorkine\nAurelien Jarno\nBastien Nocera\nBei Zhang\nBenjamin Dobell\nCarl Karsten\nColin Walters\nDave Camarillo\nDavid Engraf\nDavid Moore\nDavidlohr Bueso\nFederico Manzan\nFelipe Balbi\nFlorian Albrechtskirchinger\nFrancesco Montorsi\nFrancisco Facioni\nGaurav Gupta\nGraeme Gill\nGustavo Zacarias\nHans Ulrich Niedermann\nHector Martin\nHoi-Ho Chan\nIlya Konstantinov\nJames Hanko\nJohn Sheu\nJoshua Blake\nJustin Bischoff\nKarsten Koenig\nKonrad Rzepecki\nKuangye Guo\nLars Kanis\nLars Wirzenius\nLuca Longinotti\nMarcus Meissner\nMarkus Heidelberg\nMartin Ettl\nMartin Koegler\nMatthias Bolte\nMike Frysinger\nMikhail Gusarov\nMoritz Fischer\nЛарионов Даниил\nNicholas Corgan\nOmri Iluz\nOrin Eman\nPaul Fertser\nPekka Nikander\nRob Walker\nSean McBride\nSebastian Pipping\nSimon Haggett\nSimon Newton\nThomas Röfer\nTim Hutt\nTim Roberts\nTobias Klauser\nToby Peterson\nTormod Volden\nTrygve Laugstøl\nUri Lublin\nVasily Khoruzhick\nVegard Storheil Eriksen\nVenkatesh Shukla\nVitali Lovich\nXiaofan Chen\nZoltán Kovács\nРоман Донченко\nparafin\nxantares\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/COPYING",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions 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\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library 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 GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n\n\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/config.h",
    "content": "#ifndef CONFIG_H\n#define CONFIG_H\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/core.c",
    "content": "/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */\n/*\n * Core functions for libusb\n * Copyright © 2012-2013 Nathan Hjelm <hjelmn@cs.unm.edu>\n * Copyright © 2007-2008 Daniel Drake <dsd@gentoo.org>\n * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifdef HAVE_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#ifdef HAVE_SYSLOG_H\n#include <syslog.h>\n#endif\n\n#ifdef __ANDROID__\n#include <android/log.h>\n#endif\n\n#include \"libusbi.h\"\n#include \"hotplug.h\"\n\n#if defined(OS_LINUX)\nconst struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend;\n#elif defined(OS_DARWIN)\nconst struct usbi_os_backend * const usbi_backend = &darwin_backend;\n#elif defined(OS_OPENBSD)\nconst struct usbi_os_backend * const usbi_backend = &openbsd_backend;\n#elif defined(OS_NETBSD)\nconst struct usbi_os_backend * const usbi_backend = &netbsd_backend;\n#elif defined(OS_WINDOWS)\n\n#if defined(USE_USBDK)\nconst struct usbi_os_backend * const usbi_backend = &usbdk_backend;\n#else\nconst struct usbi_os_backend * const usbi_backend = &windows_backend;\n#endif\n\n#elif defined(OS_WINCE)\nconst struct usbi_os_backend * const usbi_backend = &wince_backend;\n#elif defined(OS_HAIKU)\nconst struct usbi_os_backend * const usbi_backend = &haiku_usb_raw_backend;\n#elif defined (OS_SUNOS)\nconst struct usbi_os_backend * const usbi_backend = &sunos_backend;\n#else\n#error \"Unsupported OS\"\n#endif\n\nstruct libusb_context *usbi_default_context = NULL;\nstatic const struct libusb_version libusb_version_internal =\n\t{ LIBUSB_MAJOR, LIBUSB_MINOR, LIBUSB_MICRO, LIBUSB_NANO,\n\t  LIBUSB_RC, \"http://libusb.info\" };\nstatic int default_context_refcnt = 0;\nstatic usbi_mutex_static_t default_context_lock = USBI_MUTEX_INITIALIZER;\nstatic struct timespec timestamp_origin = { 0, 0 };\n\nusbi_mutex_static_t active_contexts_lock = USBI_MUTEX_INITIALIZER;\nstruct list_head active_contexts_list;\n\n/**\n * \\mainpage libusb-1.0 API Reference\n *\n * \\section intro Introduction\n *\n * libusb is an open source library that allows you to communicate with USB\n * devices from userspace. For more info, see the\n * <a href=\"http://libusb.info\">libusb homepage</a>.\n *\n * This documentation is aimed at application developers wishing to\n * communicate with USB peripherals from their own software. After reviewing\n * this documentation, feedback and questions can be sent to the\n * <a href=\"http://mailing-list.libusb.info\">libusb-devel mailing list</a>.\n *\n * This documentation assumes knowledge of how to operate USB devices from\n * a software standpoint (descriptors, configurations, interfaces, endpoints,\n * control/bulk/interrupt/isochronous transfers, etc). Full information\n * can be found in the <a href=\"http://www.usb.org/developers/docs/\">USB 3.0\n * Specification</a> which is available for free download. You can probably\n * find less verbose introductions by searching the web.\n *\n * \\section API Application Programming Interface (API)\n *\n * See the \\ref libusb_api page for a complete list of the libusb functions.\n *\n * \\section features Library features\n *\n * - All transfer types supported (control/bulk/interrupt/isochronous)\n * - 2 transfer interfaces:\n *    -# Synchronous (simple)\n *    -# Asynchronous (more complicated, but more powerful)\n * - Thread safe (although the asynchronous interface means that you\n *   usually won't need to thread)\n * - Lightweight with lean API\n * - Compatible with libusb-0.1 through the libusb-compat-0.1 translation layer\n * - Hotplug support (on some platforms). See \\ref libusb_hotplug.\n *\n * \\section gettingstarted Getting Started\n *\n * To begin reading the API documentation, start with the Modules page which\n * links to the different categories of libusb's functionality.\n *\n * One decision you will have to make is whether to use the synchronous\n * or the asynchronous data transfer interface. The \\ref libusb_io documentation\n * provides some insight into this topic.\n *\n * Some example programs can be found in the libusb source distribution under\n * the \"examples\" subdirectory. The libusb homepage includes a list of\n * real-life project examples which use libusb.\n *\n * \\section errorhandling Error handling\n *\n * libusb functions typically return 0 on success or a negative error code\n * on failure. These negative error codes relate to LIBUSB_ERROR constants\n * which are listed on the \\ref libusb_misc \"miscellaneous\" documentation page.\n *\n * \\section msglog Debug message logging\n *\n * libusb uses stderr for all logging. By default, logging is set to NONE,\n * which means that no output will be produced. However, unless the library\n * has been compiled with logging disabled, then any application calls to\n * libusb_set_debug(), or the setting of the environmental variable\n * LIBUSB_DEBUG outside of the application, can result in logging being\n * produced. Your application should therefore not close stderr, but instead\n * direct it to the null device if its output is undesirable.\n *\n * The libusb_set_debug() function can be used to enable logging of certain\n * messages. Under standard configuration, libusb doesn't really log much\n * so you are advised to use this function to enable all error/warning/\n * informational messages. It will help debug problems with your software.\n *\n * The logged messages are unstructured. There is no one-to-one correspondence\n * between messages being logged and success or failure return codes from\n * libusb functions. There is no format to the messages, so you should not\n * try to capture or parse them. They are not and will not be localized.\n * These messages are not intended to being passed to your application user;\n * instead, you should interpret the error codes returned from libusb functions\n * and provide appropriate notification to the user. The messages are simply\n * there to aid you as a programmer, and if you're confused because you're\n * getting a strange error code from a libusb function, enabling message\n * logging may give you a suitable explanation.\n *\n * The LIBUSB_DEBUG environment variable can be used to enable message logging\n * at run-time. This environment variable should be set to a log level number,\n * which is interpreted the same as the libusb_set_debug() parameter. When this\n * environment variable is set, the message logging verbosity level is fixed\n * and libusb_set_debug() effectively does nothing.\n *\n * libusb can be compiled without any logging functions, useful for embedded\n * systems. In this case, libusb_set_debug() and the LIBUSB_DEBUG environment\n * variable have no effects.\n *\n * libusb can also be compiled with verbose debugging messages always. When\n * the library is compiled in this way, all messages of all verbosities are\n * always logged. libusb_set_debug() and the LIBUSB_DEBUG environment variable\n * have no effects.\n *\n * \\section remarks Other remarks\n *\n * libusb does have imperfections. The \\ref libusb_caveats \"caveats\" page attempts\n * to document these.\n */\n\n/**\n * \\page libusb_caveats Caveats\n *\n * \\section devresets Device resets\n *\n * The libusb_reset_device() function allows you to reset a device. If your\n * program has to call such a function, it should obviously be aware that\n * the reset will cause device state to change (e.g. register values may be\n * reset).\n *\n * The problem is that any other program could reset the device your program\n * is working with, at any time. libusb does not offer a mechanism to inform\n * you when this has happened, so if someone else resets your device it will\n * not be clear to your own program why the device state has changed.\n *\n * Ultimately, this is a limitation of writing drivers in userspace.\n * Separation from the USB stack in the underlying kernel makes it difficult\n * for the operating system to deliver such notifications to your program.\n * The Linux kernel USB stack allows such reset notifications to be delivered\n * to in-kernel USB drivers, but it is not clear how such notifications could\n * be delivered to second-class drivers that live in userspace.\n *\n * \\section blockonly Blocking-only functionality\n *\n * The functionality listed below is only available through synchronous,\n * blocking functions. There are no asynchronous/non-blocking alternatives,\n * and no clear ways of implementing these.\n *\n * - Configuration activation (libusb_set_configuration())\n * - Interface/alternate setting activation (libusb_set_interface_alt_setting())\n * - Releasing of interfaces (libusb_release_interface())\n * - Clearing of halt/stall condition (libusb_clear_halt())\n * - Device resets (libusb_reset_device())\n *\n * \\section configsel Configuration selection and handling\n *\n * When libusb presents a device handle to an application, there is a chance\n * that the corresponding device may be in unconfigured state. For devices\n * with multiple configurations, there is also a chance that the configuration\n * currently selected is not the one that the application wants to use.\n *\n * The obvious solution is to add a call to libusb_set_configuration() early\n * on during your device initialization routines, but there are caveats to\n * be aware of:\n * -# If the device is already in the desired configuration, calling\n *    libusb_set_configuration() using the same configuration value will cause\n *    a lightweight device reset. This may not be desirable behaviour.\n * -# In the case where the desired configuration is already active, libusb\n *    may not even be able to perform a lightweight device reset. For example,\n *    take my USB keyboard with fingerprint reader: I'm interested in driving\n *    the fingerprint reader interface through libusb, but the kernel's\n *    USB-HID driver will almost always have claimed the keyboard interface.\n *    Because the kernel has claimed an interface, it is not even possible to\n *    perform the lightweight device reset, so libusb_set_configuration() will\n *    fail. (Luckily the device in question only has a single configuration.)\n * -# libusb will be unable to set a configuration if other programs or\n *    drivers have claimed interfaces. In particular, this means that kernel\n *    drivers must be detached from all the interfaces before\n *    libusb_set_configuration() may succeed.\n *\n * One solution to some of the above problems is to consider the currently\n * active configuration. If the configuration we want is already active, then\n * we don't have to select any configuration:\n\\code\ncfg = -1;\nlibusb_get_configuration(dev, &cfg);\nif (cfg != desired)\n\tlibusb_set_configuration(dev, desired);\n\\endcode\n *\n * This is probably suitable for most scenarios, but is inherently racy:\n * another application or driver may change the selected configuration\n * <em>after</em> the libusb_get_configuration() call.\n *\n * Even in cases where libusb_set_configuration() succeeds, consider that other\n * applications or drivers may change configuration after your application\n * calls libusb_set_configuration().\n *\n * One possible way to lock your device into a specific configuration is as\n * follows:\n * -# Set the desired configuration (or use the logic above to realise that\n *    it is already in the desired configuration)\n * -# Claim the interface that you wish to use\n * -# Check that the currently active configuration is the one that you want\n *    to use.\n *\n * The above method works because once an interface is claimed, no application\n * or driver is able to select another configuration.\n *\n * \\section earlycomp Early transfer completion\n *\n * NOTE: This section is currently Linux-centric. I am not sure if any of these\n * considerations apply to Darwin or other platforms.\n *\n * When a transfer completes early (i.e. when less data is received/sent in\n * any one packet than the transfer buffer allows for) then libusb is designed\n * to terminate the transfer immediately, not transferring or receiving any\n * more data unless other transfers have been queued by the user.\n *\n * On legacy platforms, libusb is unable to do this in all situations. After\n * the incomplete packet occurs, \"surplus\" data may be transferred. For recent\n * versions of libusb, this information is kept (the data length of the\n * transfer is updated) and, for device-to-host transfers, any surplus data was\n * added to the buffer. Still, this is not a nice solution because it loses the\n * information about the end of the short packet, and the user probably wanted\n * that surplus data to arrive in the next logical transfer.\n *\n *\n * \\section zlp Zero length packets\n *\n * - libusb is able to send a packet of zero length to an endpoint simply by\n * submitting a transfer of zero length.\n * - The \\ref libusb_transfer_flags::LIBUSB_TRANSFER_ADD_ZERO_PACKET\n * \"LIBUSB_TRANSFER_ADD_ZERO_PACKET\" flag is currently only supported on Linux.\n */\n\n/**\n * \\page libusb_contexts Contexts\n *\n * It is possible that libusb may be used simultaneously from two independent\n * libraries linked into the same executable. For example, if your application\n * has a plugin-like system which allows the user to dynamically load a range\n * of modules into your program, it is feasible that two independently\n * developed modules may both use libusb.\n *\n * libusb is written to allow for these multiple user scenarios. The two\n * \"instances\" of libusb will not interfere: libusb_set_debug() calls\n * from one user will not affect the same settings for other users, other\n * users can continue using libusb after one of them calls libusb_exit(), etc.\n *\n * This is made possible through libusb's <em>context</em> concept. When you\n * call libusb_init(), you are (optionally) given a context. You can then pass\n * this context pointer back into future libusb functions.\n *\n * In order to keep things simple for more simplistic applications, it is\n * legal to pass NULL to all functions requiring a context pointer (as long as\n * you're sure no other code will attempt to use libusb from the same process).\n * When you pass NULL, the default context will be used. The default context\n * is created the first time a process calls libusb_init() when no other\n * context is alive. Contexts are destroyed during libusb_exit().\n *\n * The default context is reference-counted and can be shared. That means that\n * if libusb_init(NULL) is called twice within the same process, the two\n * users end up sharing the same context. The deinitialization and freeing of\n * the default context will only happen when the last user calls libusb_exit().\n * In other words, the default context is created and initialized when its\n * reference count goes from 0 to 1, and is deinitialized and destroyed when\n * its reference count goes from 1 to 0.\n *\n * You may be wondering why only a subset of libusb functions require a\n * context pointer in their function definition. Internally, libusb stores\n * context pointers in other objects (e.g. libusb_device instances) and hence\n * can infer the context from those objects.\n */\n\n /**\n  * \\page libusb_api Application Programming Interface\n  *\n  * This is the complete list of libusb functions, structures and\n  * enumerations in alphabetical order.\n  *\n  * \\section Functions\n  * - libusb_alloc_streams()\n  * - libusb_alloc_transfer()\n  * - libusb_attach_kernel_driver()\n  * - libusb_bulk_transfer()\n  * - libusb_cancel_transfer()\n  * - libusb_claim_interface()\n  * - libusb_clear_halt()\n  * - libusb_close()\n  * - libusb_control_transfer()\n  * - libusb_control_transfer_get_data()\n  * - libusb_control_transfer_get_setup()\n  * - libusb_cpu_to_le16()\n  * - libusb_detach_kernel_driver()\n  * - libusb_dev_mem_alloc()\n  * - libusb_dev_mem_free()\n  * - libusb_error_name()\n  * - libusb_event_handler_active()\n  * - libusb_event_handling_ok()\n  * - libusb_exit()\n  * - libusb_fill_bulk_stream_transfer()\n  * - libusb_fill_bulk_transfer()\n  * - libusb_fill_control_setup()\n  * - libusb_fill_control_transfer()\n  * - libusb_fill_interrupt_transfer()\n  * - libusb_fill_iso_transfer()\n  * - libusb_free_bos_descriptor()\n  * - libusb_free_config_descriptor()\n  * - libusb_free_container_id_descriptor()\n  * - libusb_free_device_list()\n  * - libusb_free_pollfds()\n  * - libusb_free_ss_endpoint_companion_descriptor()\n  * - libusb_free_ss_usb_device_capability_descriptor()\n  * - libusb_free_streams()\n  * - libusb_free_transfer()\n  * - libusb_free_usb_2_0_extension_descriptor()\n  * - libusb_get_active_config_descriptor()\n  * - libusb_get_bos_descriptor()\n  * - libusb_get_bus_number()\n  * - libusb_get_config_descriptor()\n  * - libusb_get_config_descriptor_by_value()\n  * - libusb_get_configuration()\n  * - libusb_get_container_id_descriptor()\n  * - libusb_get_descriptor()\n  * - libusb_get_device()\n  * - libusb_get_device_address()\n  * - libusb_get_device_descriptor()\n  * - libusb_get_device_list()\n  * - libusb_get_device_speed()\n  * - libusb_get_iso_packet_buffer()\n  * - libusb_get_iso_packet_buffer_simple()\n  * - libusb_get_max_iso_packet_size()\n  * - libusb_get_max_packet_size()\n  * - libusb_get_next_timeout()\n  * - libusb_get_parent()\n  * - libusb_get_pollfds()\n  * - libusb_get_port_number()\n  * - libusb_get_port_numbers()\n  * - libusb_get_port_path()\n  * - libusb_get_ss_endpoint_companion_descriptor()\n  * - libusb_get_ss_usb_device_capability_descriptor()\n  * - libusb_get_string_descriptor()\n  * - libusb_get_string_descriptor_ascii()\n  * - libusb_get_usb_2_0_extension_descriptor()\n  * - libusb_get_version()\n  * - libusb_handle_events()\n  * - libusb_handle_events_completed()\n  * - libusb_handle_events_locked()\n  * - libusb_handle_events_timeout()\n  * - libusb_handle_events_timeout_completed()\n  * - libusb_has_capability()\n  * - libusb_hotplug_deregister_callback()\n  * - libusb_hotplug_register_callback()\n  * - libusb_init()\n  * - libusb_interrupt_event_handler()\n  * - libusb_interrupt_transfer()\n  * - libusb_kernel_driver_active()\n  * - libusb_lock_events()\n  * - libusb_lock_event_waiters()\n  * - libusb_open()\n  * - libusb_open_device_with_vid_pid()\n  * - libusb_pollfds_handle_timeouts()\n  * - libusb_ref_device()\n  * - libusb_release_interface()\n  * - libusb_reset_device()\n  * - libusb_set_auto_detach_kernel_driver()\n  * - libusb_set_configuration()\n  * - libusb_set_debug()\n  * - libusb_set_interface_alt_setting()\n  * - libusb_set_iso_packet_lengths()\n  * - libusb_setlocale()\n  * - libusb_set_pollfd_notifiers()\n  * - libusb_strerror()\n  * - libusb_submit_transfer()\n  * - libusb_transfer_get_stream_id()\n  * - libusb_transfer_set_stream_id()\n  * - libusb_try_lock_events()\n  * - libusb_unlock_events()\n  * - libusb_unlock_event_waiters()\n  * - libusb_unref_device()\n  * - libusb_wait_for_event()\n  *\n  * \\section Structures\n  * - libusb_bos_descriptor\n  * - libusb_bos_dev_capability_descriptor\n  * - libusb_config_descriptor\n  * - libusb_container_id_descriptor\n  * - \\ref libusb_context\n  * - libusb_control_setup\n  * - \\ref libusb_device\n  * - libusb_device_descriptor\n  * - \\ref libusb_device_handle\n  * - libusb_endpoint_descriptor\n  * - libusb_interface\n  * - libusb_interface_descriptor\n  * - libusb_iso_packet_descriptor\n  * - libusb_pollfd\n  * - libusb_ss_endpoint_companion_descriptor\n  * - libusb_ss_usb_device_capability_descriptor\n  * - libusb_transfer\n  * - libusb_usb_2_0_extension_descriptor\n  * - libusb_version\n  *\n  * \\section Enums\n  * - \\ref libusb_bos_type\n  * - \\ref libusb_capability\n  * - \\ref libusb_class_code\n  * - \\ref libusb_descriptor_type\n  * - \\ref libusb_endpoint_direction\n  * - \\ref libusb_error\n  * - \\ref libusb_iso_sync_type\n  * - \\ref libusb_iso_usage_type\n  * - \\ref libusb_log_level\n  * - \\ref libusb_request_recipient\n  * - \\ref libusb_request_type\n  * - \\ref libusb_speed\n  * - \\ref libusb_ss_usb_device_capability_attributes\n  * - \\ref libusb_standard_request\n  * - \\ref libusb_supported_speed\n  * - \\ref libusb_transfer_flags\n  * - \\ref libusb_transfer_status\n  * - \\ref libusb_transfer_type\n  * - \\ref libusb_usb_2_0_extension_attributes\n  */\n\n/**\n * @defgroup libusb_lib Library initialization/deinitialization\n * This page details how to initialize and deinitialize libusb. Initialization\n * must be performed before using any libusb functionality, and similarly you\n * must not call any libusb functions after deinitialization.\n */\n\n/**\n * @defgroup libusb_dev Device handling and enumeration\n * The functionality documented below is designed to help with the following\n * operations:\n * - Enumerating the USB devices currently attached to the system\n * - Choosing a device to operate from your software\n * - Opening and closing the chosen device\n *\n * \\section nutshell In a nutshell...\n *\n * The description below really makes things sound more complicated than they\n * actually are. The following sequence of function calls will be suitable\n * for almost all scenarios and does not require you to have such a deep\n * understanding of the resource management issues:\n * \\code\n// discover devices\nlibusb_device **list;\nlibusb_device *found = NULL;\nssize_t cnt = libusb_get_device_list(NULL, &list);\nssize_t i = 0;\nint err = 0;\nif (cnt < 0)\n\terror();\n\nfor (i = 0; i < cnt; i++) {\n\tlibusb_device *device = list[i];\n\tif (is_interesting(device)) {\n\t\tfound = device;\n\t\tbreak;\n\t}\n}\n\nif (found) {\n\tlibusb_device_handle *handle;\n\n\terr = libusb_open(found, &handle);\n\tif (err)\n\t\terror();\n\t// etc\n}\n\nlibusb_free_device_list(list, 1);\n\\endcode\n *\n * The two important points:\n * - You asked libusb_free_device_list() to unreference the devices (2nd\n *   parameter)\n * - You opened the device before freeing the list and unreferencing the\n *   devices\n *\n * If you ended up with a handle, you can now proceed to perform I/O on the\n * device.\n *\n * \\section devshandles Devices and device handles\n * libusb has a concept of a USB device, represented by the\n * \\ref libusb_device opaque type. A device represents a USB device that\n * is currently or was previously connected to the system. Using a reference\n * to a device, you can determine certain information about the device (e.g.\n * you can read the descriptor data).\n *\n * The libusb_get_device_list() function can be used to obtain a list of\n * devices currently connected to the system. This is known as device\n * discovery.\n *\n * Just because you have a reference to a device does not mean it is\n * necessarily usable. The device may have been unplugged, you may not have\n * permission to operate such device, or another program or driver may be\n * using the device.\n *\n * When you've found a device that you'd like to operate, you must ask\n * libusb to open the device using the libusb_open() function. Assuming\n * success, libusb then returns you a <em>device handle</em>\n * (a \\ref libusb_device_handle pointer). All \"real\" I/O operations then\n * operate on the handle rather than the original device pointer.\n *\n * \\section devref Device discovery and reference counting\n *\n * Device discovery (i.e. calling libusb_get_device_list()) returns a\n * freshly-allocated list of devices. The list itself must be freed when\n * you are done with it. libusb also needs to know when it is OK to free\n * the contents of the list - the devices themselves.\n *\n * To handle these issues, libusb provides you with two separate items:\n * - A function to free the list itself\n * - A reference counting system for the devices inside\n *\n * New devices presented by the libusb_get_device_list() function all have a\n * reference count of 1. You can increase and decrease reference count using\n * libusb_ref_device() and libusb_unref_device(). A device is destroyed when\n * its reference count reaches 0.\n *\n * With the above information in mind, the process of opening a device can\n * be viewed as follows:\n * -# Discover devices using libusb_get_device_list().\n * -# Choose the device that you want to operate, and call libusb_open().\n * -# Unref all devices in the discovered device list.\n * -# Free the discovered device list.\n *\n * The order is important - you must not unreference the device before\n * attempting to open it, because unreferencing it may destroy the device.\n *\n * For convenience, the libusb_free_device_list() function includes a\n * parameter to optionally unreference all the devices in the list before\n * freeing the list itself. This combines steps 3 and 4 above.\n *\n * As an implementation detail, libusb_open() actually adds a reference to\n * the device in question. This is because the device remains available\n * through the handle via libusb_get_device(). The reference is deleted during\n * libusb_close().\n */\n\n/** @defgroup libusb_misc Miscellaneous */\n\n/* we traverse usbfs without knowing how many devices we are going to find.\n * so we create this discovered_devs model which is similar to a linked-list\n * which grows when required. it can be freed once discovery has completed,\n * eliminating the need for a list node in the libusb_device structure\n * itself. */\n#define DISCOVERED_DEVICES_SIZE_STEP 8\n\nstatic struct discovered_devs *discovered_devs_alloc(void)\n{\n\tstruct discovered_devs *ret =\n\t\tmalloc(sizeof(*ret) + (sizeof(void *) * DISCOVERED_DEVICES_SIZE_STEP));\n\n\tif (ret) {\n\t\tret->len = 0;\n\t\tret->capacity = DISCOVERED_DEVICES_SIZE_STEP;\n\t}\n\treturn ret;\n}\n\nstatic void discovered_devs_free(struct discovered_devs *discdevs)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < discdevs->len; i++)\n\t\tlibusb_unref_device(discdevs->devices[i]);\n\n\tfree(discdevs);\n}\n\n/* append a device to the discovered devices collection. may realloc itself,\n * returning new discdevs. returns NULL on realloc failure. */\nstruct discovered_devs *discovered_devs_append(\n\tstruct discovered_devs *discdevs, struct libusb_device *dev)\n{\n\tsize_t len = discdevs->len;\n\tsize_t capacity;\n\tstruct discovered_devs *new_discdevs;\n\n\t/* if there is space, just append the device */\n\tif (len < discdevs->capacity) {\n\t\tdiscdevs->devices[len] = libusb_ref_device(dev);\n\t\tdiscdevs->len++;\n\t\treturn discdevs;\n\t}\n\n\t/* exceeded capacity, need to grow */\n\tusbi_dbg(\"need to increase capacity\");\n\tcapacity = discdevs->capacity + DISCOVERED_DEVICES_SIZE_STEP;\n\t/* can't use usbi_reallocf here because in failure cases it would\n\t * free the existing discdevs without unreferencing its devices. */\n\tnew_discdevs = realloc(discdevs,\n\t\tsizeof(*discdevs) + (sizeof(void *) * capacity));\n\tif (!new_discdevs) {\n\t\tdiscovered_devs_free(discdevs);\n\t\treturn NULL;\n\t}\n\n\tdiscdevs = new_discdevs;\n\tdiscdevs->capacity = capacity;\n\tdiscdevs->devices[len] = libusb_ref_device(dev);\n\tdiscdevs->len++;\n\n\treturn discdevs;\n}\n\n/* Allocate a new device with a specific session ID. The returned device has\n * a reference count of 1. */\nstruct libusb_device *usbi_alloc_device(struct libusb_context *ctx,\n\tunsigned long session_id)\n{\n\tsize_t priv_size = usbi_backend->device_priv_size;\n\tstruct libusb_device *dev = calloc(1, sizeof(*dev) + priv_size);\n\tint r;\n\n\tif (!dev)\n\t\treturn NULL;\n\n\tr = usbi_mutex_init(&dev->lock);\n\tif (r) {\n\t\tfree(dev);\n\t\treturn NULL;\n\t}\n\n\tdev->ctx = ctx;\n\tdev->refcnt = 1;\n\tdev->session_data = session_id;\n\tdev->speed = LIBUSB_SPEED_UNKNOWN;\n\n\tif (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {\n\t\tusbi_connect_device (dev);\n\t}\n\n\treturn dev;\n}\n\nvoid usbi_connect_device(struct libusb_device *dev)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\n\tdev->attached = 1;\n\n\tusbi_mutex_lock(&dev->ctx->usb_devs_lock);\n\tlist_add(&dev->list, &dev->ctx->usb_devs);\n\tusbi_mutex_unlock(&dev->ctx->usb_devs_lock);\n\n\t/* Signal that an event has occurred for this device if we support hotplug AND\n\t * the hotplug message list is ready. This prevents an event from getting raised\n\t * during initial enumeration. */\n\tif (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) {\n\t\tusbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED);\n\t}\n}\n\nvoid usbi_disconnect_device(struct libusb_device *dev)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\n\tusbi_mutex_lock(&dev->lock);\n\tdev->attached = 0;\n\tusbi_mutex_unlock(&dev->lock);\n\n\tusbi_mutex_lock(&ctx->usb_devs_lock);\n\tlist_del(&dev->list);\n\tusbi_mutex_unlock(&ctx->usb_devs_lock);\n\n\t/* Signal that an event has occurred for this device if we support hotplug AND\n\t * the hotplug message list is ready. This prevents an event from getting raised\n\t * during initial enumeration. libusb_handle_events will take care of dereferencing\n\t * the device. */\n\tif (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) {\n\t\tusbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT);\n\t}\n}\n\n/* Perform some final sanity checks on a newly discovered device. If this\n * function fails (negative return code), the device should not be added\n * to the discovered device list. */\nint usbi_sanitize_device(struct libusb_device *dev)\n{\n\tint r;\n\tuint8_t num_configurations;\n\n\tr = usbi_device_cache_descriptor(dev);\n\tif (r < 0)\n\t\treturn r;\n\n\tnum_configurations = dev->device_descriptor.bNumConfigurations;\n\tif (num_configurations > USB_MAXCONFIG) {\n\t\tusbi_err(DEVICE_CTX(dev), \"too many configurations\");\n\t\treturn LIBUSB_ERROR_IO;\n\t} else if (0 == num_configurations)\n\t\tusbi_dbg(\"zero configurations, maybe an unauthorized device\");\n\n\tdev->num_configurations = num_configurations;\n\treturn 0;\n}\n\n/* Examine libusb's internal list of known devices, looking for one with\n * a specific session ID. Returns the matching device if it was found, and\n * NULL otherwise. */\nstruct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx,\n\tunsigned long session_id)\n{\n\tstruct libusb_device *dev;\n\tstruct libusb_device *ret = NULL;\n\n\tusbi_mutex_lock(&ctx->usb_devs_lock);\n\tlist_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device)\n\t\tif (dev->session_data == session_id) {\n\t\t\tret = libusb_ref_device(dev);\n\t\t\tbreak;\n\t\t}\n\tusbi_mutex_unlock(&ctx->usb_devs_lock);\n\n\treturn ret;\n}\n\n/** @ingroup libusb_dev\n * Returns a list of USB devices currently attached to the system. This is\n * your entry point into finding a USB device to operate.\n *\n * You are expected to unreference all the devices when you are done with\n * them, and then free the list with libusb_free_device_list(). Note that\n * libusb_free_device_list() can unref all the devices for you. Be careful\n * not to unreference a device you are about to open until after you have\n * opened it.\n *\n * This return value of this function indicates the number of devices in\n * the resultant list. The list is actually one element larger, as it is\n * NULL-terminated.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param list output location for a list of devices. Must be later freed with\n * libusb_free_device_list().\n * \\returns the number of devices in the outputted list, or any\n * \\ref libusb_error according to errors encountered by the backend.\n */\nssize_t API_EXPORTED libusb_get_device_list(libusb_context *ctx,\n\tlibusb_device ***list)\n{\n\tstruct discovered_devs *discdevs = discovered_devs_alloc();\n\tstruct libusb_device **ret;\n\tint r = 0;\n\tssize_t i, len;\n\tUSBI_GET_CONTEXT(ctx);\n\tusbi_dbg(\"\");\n\n\tif (!discdevs)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tif (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {\n\t\t/* backend provides hotplug support */\n\t\tstruct libusb_device *dev;\n\n\t\tif (usbi_backend->hotplug_poll)\n\t\t\tusbi_backend->hotplug_poll();\n\n\t\tusbi_mutex_lock(&ctx->usb_devs_lock);\n\t\tlist_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) {\n\t\t\tdiscdevs = discovered_devs_append(discdevs, dev);\n\n\t\t\tif (!discdevs) {\n\t\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tusbi_mutex_unlock(&ctx->usb_devs_lock);\n\t} else {\n\t\t/* backend does not provide hotplug support */\n\t\tr = usbi_backend->get_device_list(ctx, &discdevs);\n\t}\n\n\tif (r < 0) {\n\t\tlen = r;\n\t\tgoto out;\n\t}\n\n\t/* convert discovered_devs into a list */\n\tlen = discdevs->len;\n\tret = calloc(len + 1, sizeof(struct libusb_device *));\n\tif (!ret) {\n\t\tlen = LIBUSB_ERROR_NO_MEM;\n\t\tgoto out;\n\t}\n\n\tret[len] = NULL;\n\tfor (i = 0; i < len; i++) {\n\t\tstruct libusb_device *dev = discdevs->devices[i];\n\t\tret[i] = libusb_ref_device(dev);\n\t}\n\t*list = ret;\n\nout:\n\tif (discdevs)\n\t\tdiscovered_devs_free(discdevs);\n\treturn len;\n}\n\n/** \\ingroup libusb_dev\n * Frees a list of devices previously discovered using\n * libusb_get_device_list(). If the unref_devices parameter is set, the\n * reference count of each device in the list is decremented by 1.\n * \\param list the list to free\n * \\param unref_devices whether to unref the devices in the list\n */\nvoid API_EXPORTED libusb_free_device_list(libusb_device **list,\n\tint unref_devices)\n{\n\tif (!list)\n\t\treturn;\n\n\tif (unref_devices) {\n\t\tint i = 0;\n\t\tstruct libusb_device *dev;\n\n\t\twhile ((dev = list[i++]) != NULL)\n\t\t\tlibusb_unref_device(dev);\n\t}\n\tfree(list);\n}\n\n/** \\ingroup libusb_dev\n * Get the number of the bus that a device is connected to.\n * \\param dev a device\n * \\returns the bus number\n */\nuint8_t API_EXPORTED libusb_get_bus_number(libusb_device *dev)\n{\n\treturn dev->bus_number;\n}\n\n/** \\ingroup libusb_dev\n * Get the number of the port that a device is connected to.\n * Unless the OS does something funky, or you are hot-plugging USB extension cards,\n * the port number returned by this call is usually guaranteed to be uniquely tied\n * to a physical port, meaning that different devices plugged on the same physical\n * port should return the same port number.\n *\n * But outside of this, there is no guarantee that the port number returned by this\n * call will remain the same, or even match the order in which ports have been\n * numbered by the HUB/HCD manufacturer.\n *\n * \\param dev a device\n * \\returns the port number (0 if not available)\n */\nuint8_t API_EXPORTED libusb_get_port_number(libusb_device *dev)\n{\n\treturn dev->port_number;\n}\n\n/** \\ingroup libusb_dev\n * Get the list of all port numbers from root for the specified device\n *\n * Since version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102\n * \\param dev a device\n * \\param port_numbers the array that should contain the port numbers\n * \\param port_numbers_len the maximum length of the array. As per the USB 3.0\n * specs, the current maximum limit for the depth is 7.\n * \\returns the number of elements filled\n * \\returns LIBUSB_ERROR_OVERFLOW if the array is too small\n */\nint API_EXPORTED libusb_get_port_numbers(libusb_device *dev,\n\tuint8_t* port_numbers, int port_numbers_len)\n{\n\tint i = port_numbers_len;\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\n\tif (port_numbers_len <= 0)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\t// HCDs can be listed as devices with port #0\n\twhile((dev) && (dev->port_number != 0)) {\n\t\tif (--i < 0) {\n\t\t\tusbi_warn(ctx, \"port numbers array is too small\");\n\t\t\treturn LIBUSB_ERROR_OVERFLOW;\n\t\t}\n\t\tport_numbers[i] = dev->port_number;\n\t\tdev = dev->parent_dev;\n\t}\n\tif (i < port_numbers_len)\n\t\tmemmove(port_numbers, &port_numbers[i], port_numbers_len - i);\n\treturn port_numbers_len - i;\n}\n\n/** \\ingroup libusb_dev\n * Deprecated please use libusb_get_port_numbers instead.\n */\nint API_EXPORTED libusb_get_port_path(libusb_context *ctx, libusb_device *dev,\n\tuint8_t* port_numbers, uint8_t port_numbers_len)\n{\n\tUNUSED(ctx);\n\n\treturn libusb_get_port_numbers(dev, port_numbers, port_numbers_len);\n}\n\n/** \\ingroup libusb_dev\n * Get the the parent from the specified device.\n * \\param dev a device\n * \\returns the device parent or NULL if not available\n * You should issue a \\ref libusb_get_device_list() before calling this\n * function and make sure that you only access the parent before issuing\n * \\ref libusb_free_device_list(). The reason is that libusb currently does\n * not maintain a permanent list of device instances, and therefore can\n * only guarantee that parents are fully instantiated within a \n * libusb_get_device_list() - libusb_free_device_list() block.\n */\nDEFAULT_VISIBILITY\nlibusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev)\n{\n\treturn dev->parent_dev;\n}\n\n/** \\ingroup libusb_dev\n * Get the address of the device on the bus it is connected to.\n * \\param dev a device\n * \\returns the device address\n */\nuint8_t API_EXPORTED libusb_get_device_address(libusb_device *dev)\n{\n\treturn dev->device_address;\n}\n\n/** \\ingroup libusb_dev\n * Get the negotiated connection speed for a device.\n * \\param dev a device\n * \\returns a \\ref libusb_speed code, where LIBUSB_SPEED_UNKNOWN means that\n * the OS doesn't know or doesn't support returning the negotiated speed.\n */\nint API_EXPORTED libusb_get_device_speed(libusb_device *dev)\n{\n\treturn dev->speed;\n}\n\nstatic const struct libusb_endpoint_descriptor *find_endpoint(\n\tstruct libusb_config_descriptor *config, unsigned char endpoint)\n{\n\tint iface_idx;\n\tfor (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) {\n\t\tconst struct libusb_interface *iface = &config->interface[iface_idx];\n\t\tint altsetting_idx;\n\n\t\tfor (altsetting_idx = 0; altsetting_idx < iface->num_altsetting;\n\t\t\t\taltsetting_idx++) {\n\t\t\tconst struct libusb_interface_descriptor *altsetting\n\t\t\t\t= &iface->altsetting[altsetting_idx];\n\t\t\tint ep_idx;\n\n\t\t\tfor (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; ep_idx++) {\n\t\t\t\tconst struct libusb_endpoint_descriptor *ep =\n\t\t\t\t\t&altsetting->endpoint[ep_idx];\n\t\t\t\tif (ep->bEndpointAddress == endpoint)\n\t\t\t\t\treturn ep;\n\t\t\t}\n\t\t}\n\t}\n\treturn NULL;\n}\n\n/** \\ingroup libusb_dev\n * Convenience function to retrieve the wMaxPacketSize value for a particular\n * endpoint in the active device configuration.\n *\n * This function was originally intended to be of assistance when setting up\n * isochronous transfers, but a design mistake resulted in this function\n * instead. It simply returns the wMaxPacketSize value without considering\n * its contents. If you're dealing with isochronous transfers, you probably\n * want libusb_get_max_iso_packet_size() instead.\n *\n * \\param dev a device\n * \\param endpoint address of the endpoint in question\n * \\returns the wMaxPacketSize value\n * \\returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist\n * \\returns LIBUSB_ERROR_OTHER on other failure\n */\nint API_EXPORTED libusb_get_max_packet_size(libusb_device *dev,\n\tunsigned char endpoint)\n{\n\tstruct libusb_config_descriptor *config;\n\tconst struct libusb_endpoint_descriptor *ep;\n\tint r;\n\n\tr = libusb_get_active_config_descriptor(dev, &config);\n\tif (r < 0) {\n\t\tusbi_err(DEVICE_CTX(dev),\n\t\t\t\"could not retrieve active config descriptor\");\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\tep = find_endpoint(config, endpoint);\n\tif (!ep) {\n\t\tr = LIBUSB_ERROR_NOT_FOUND;\n\t\tgoto out;\n\t}\n\n\tr = ep->wMaxPacketSize;\n\nout:\n\tlibusb_free_config_descriptor(config);\n\treturn r;\n}\n\n/** \\ingroup libusb_dev\n * Calculate the maximum packet size which a specific endpoint is capable is\n * sending or receiving in the duration of 1 microframe\n *\n * Only the active configuration is examined. The calculation is based on the\n * wMaxPacketSize field in the endpoint descriptor as described in section\n * 9.6.6 in the USB 2.0 specifications.\n *\n * If acting on an isochronous or interrupt endpoint, this function will\n * multiply the value found in bits 0:10 by the number of transactions per\n * microframe (determined by bits 11:12). Otherwise, this function just\n * returns the numeric value found in bits 0:10.\n *\n * This function is useful for setting up isochronous transfers, for example\n * you might pass the return value from this function to\n * libusb_set_iso_packet_lengths() in order to set the length field of every\n * isochronous packet in a transfer.\n *\n * Since v1.0.3.\n *\n * \\param dev a device\n * \\param endpoint address of the endpoint in question\n * \\returns the maximum packet size which can be sent/received on this endpoint\n * \\returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist\n * \\returns LIBUSB_ERROR_OTHER on other failure\n */\nint API_EXPORTED libusb_get_max_iso_packet_size(libusb_device *dev,\n\tunsigned char endpoint)\n{\n\tstruct libusb_config_descriptor *config;\n\tconst struct libusb_endpoint_descriptor *ep;\n\tenum libusb_transfer_type ep_type;\n\tuint16_t val;\n\tint r;\n\n\tr = libusb_get_active_config_descriptor(dev, &config);\n\tif (r < 0) {\n\t\tusbi_err(DEVICE_CTX(dev),\n\t\t\t\"could not retrieve active config descriptor\");\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\tep = find_endpoint(config, endpoint);\n\tif (!ep) {\n\t\tr = LIBUSB_ERROR_NOT_FOUND;\n\t\tgoto out;\n\t}\n\n\tval = ep->wMaxPacketSize;\n\tep_type = (enum libusb_transfer_type) (ep->bmAttributes & 0x3);\n\n\tr = val & 0x07ff;\n\tif (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS\n\t\t\t|| ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT)\n\t\tr *= (1 + ((val >> 11) & 3));\n\nout:\n\tlibusb_free_config_descriptor(config);\n\treturn r;\n}\n\n/** \\ingroup libusb_dev\n * Increment the reference count of a device.\n * \\param dev the device to reference\n * \\returns the same device\n */\nDEFAULT_VISIBILITY\nlibusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev)\n{\n\tusbi_mutex_lock(&dev->lock);\n\tdev->refcnt++;\n\tusbi_mutex_unlock(&dev->lock);\n\treturn dev;\n}\n\n/** \\ingroup libusb_dev\n * Decrement the reference count of a device. If the decrement operation\n * causes the reference count to reach zero, the device shall be destroyed.\n * \\param dev the device to unreference\n */\nvoid API_EXPORTED libusb_unref_device(libusb_device *dev)\n{\n\tint refcnt;\n\n\tif (!dev)\n\t\treturn;\n\n\tusbi_mutex_lock(&dev->lock);\n\trefcnt = --dev->refcnt;\n\tusbi_mutex_unlock(&dev->lock);\n\n\tif (refcnt == 0) {\n\t\tusbi_dbg(\"destroy device %d.%d\", dev->bus_number, dev->device_address);\n\n\t\tlibusb_unref_device(dev->parent_dev);\n\n\t\tif (usbi_backend->destroy_device)\n\t\t\tusbi_backend->destroy_device(dev);\n\n\t\tif (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {\n\t\t\t/* backend does not support hotplug */\n\t\t\tusbi_disconnect_device(dev);\n\t\t}\n\n\t\tusbi_mutex_destroy(&dev->lock);\n\t\tfree(dev);\n\t}\n}\n\n/*\n * Signal the event pipe so that the event handling thread will be\n * interrupted to process an internal event.\n */\nint usbi_signal_event(struct libusb_context *ctx)\n{\n\tunsigned char dummy = 1;\n\tssize_t r;\n\n\t/* write some data on event pipe to interrupt event handlers */\n\tr = usbi_write(ctx->event_pipe[1], &dummy, sizeof(dummy));\n\tif (r != sizeof(dummy)) {\n\t\tusbi_warn(ctx, \"internal signalling write failed\");\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\treturn 0;\n}\n\n/*\n * Clear the event pipe so that the event handling will no longer be\n * interrupted.\n */\nint usbi_clear_event(struct libusb_context *ctx)\n{\n\tunsigned char dummy;\n\tssize_t r;\n\n\t/* read some data on event pipe to clear it */\n\tr = usbi_read(ctx->event_pipe[0], &dummy, sizeof(dummy));\n\tif (r != sizeof(dummy)) {\n\t\tusbi_warn(ctx, \"internal signalling read failed\");\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\treturn 0;\n}\n\n/** \\ingroup libusb_dev\n * Open a device and obtain a device handle. A handle allows you to perform\n * I/O on the device in question.\n *\n * Internally, this function adds a reference to the device and makes it\n * available to you through libusb_get_device(). This reference is removed\n * during libusb_close().\n *\n * This is a non-blocking function; no requests are sent over the bus.\n *\n * \\param dev the device to open\n * \\param dev_handle output location for the returned device handle pointer. Only\n * populated when the return code is 0.\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NO_MEM on memory allocation failure\n * \\returns LIBUSB_ERROR_ACCESS if the user has insufficient permissions\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns another LIBUSB_ERROR code on other failure\n */\nint API_EXPORTED libusb_open(libusb_device *dev,\n\tlibusb_device_handle **dev_handle)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\tstruct libusb_device_handle *_dev_handle;\n\tsize_t priv_size = usbi_backend->device_handle_priv_size;\n\tint r;\n\tusbi_dbg(\"open %d.%d\", dev->bus_number, dev->device_address);\n\n\tif (!dev->attached) {\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\t_dev_handle = malloc(sizeof(*_dev_handle) + priv_size);\n\tif (!_dev_handle)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tr = usbi_mutex_init(&_dev_handle->lock);\n\tif (r) {\n\t\tfree(_dev_handle);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\t_dev_handle->dev = libusb_ref_device(dev);\n\t_dev_handle->auto_detach_kernel_driver = 0;\n\t_dev_handle->claimed_interfaces = 0;\n\tmemset(&_dev_handle->os_priv, 0, priv_size);\n\n\tr = usbi_backend->open(_dev_handle);\n\tif (r < 0) {\n\t\tusbi_dbg(\"open %d.%d returns %d\", dev->bus_number, dev->device_address, r);\n\t\tlibusb_unref_device(dev);\n\t\tusbi_mutex_destroy(&_dev_handle->lock);\n\t\tfree(_dev_handle);\n\t\treturn r;\n\t}\n\n\tusbi_mutex_lock(&ctx->open_devs_lock);\n\tlist_add(&_dev_handle->list, &ctx->open_devs);\n\tusbi_mutex_unlock(&ctx->open_devs_lock);\n\t*dev_handle = _dev_handle;\n\n\treturn 0;\n}\n\n/** \\ingroup libusb_dev\n * Convenience function for finding a device with a particular\n * <tt>idVendor</tt>/<tt>idProduct</tt> combination. This function is intended\n * for those scenarios where you are using libusb to knock up a quick test\n * application - it allows you to avoid calling libusb_get_device_list() and\n * worrying about traversing/freeing the list.\n *\n * This function has limitations and is hence not intended for use in real\n * applications: if multiple devices have the same IDs it will only\n * give you the first one, etc.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param vendor_id the idVendor value to search for\n * \\param product_id the idProduct value to search for\n * \\returns a device handle for the first found device, or NULL on error\n * or if the device could not be found. */\nDEFAULT_VISIBILITY\nlibusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(\n\tlibusb_context *ctx, uint16_t vendor_id, uint16_t product_id)\n{\n\tstruct libusb_device **devs;\n\tstruct libusb_device *found = NULL;\n\tstruct libusb_device *dev;\n\tstruct libusb_device_handle *dev_handle = NULL;\n\tsize_t i = 0;\n\tint r;\n\n\tif (libusb_get_device_list(ctx, &devs) < 0)\n\t\treturn NULL;\n\n\twhile ((dev = devs[i++]) != NULL) {\n\t\tstruct libusb_device_descriptor desc;\n\t\tr = libusb_get_device_descriptor(dev, &desc);\n\t\tif (r < 0)\n\t\t\tgoto out;\n\t\tif (desc.idVendor == vendor_id && desc.idProduct == product_id) {\n\t\t\tfound = dev;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (found) {\n\t\tr = libusb_open(found, &dev_handle);\n\t\tif (r < 0)\n\t\t\tdev_handle = NULL;\n\t}\n\nout:\n\tlibusb_free_device_list(devs, 1);\n\treturn dev_handle;\n}\n\nstatic void do_close(struct libusb_context *ctx,\n\tstruct libusb_device_handle *dev_handle)\n{\n\tstruct usbi_transfer *itransfer;\n\tstruct usbi_transfer *tmp;\n\n\t/* remove any transfers in flight that are for this device */\n\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\n\t/* safe iteration because transfers may be being deleted */\n\tlist_for_each_entry_safe(itransfer, tmp, &ctx->flying_transfers, list, struct usbi_transfer) {\n\t\tstruct libusb_transfer *transfer =\n\t\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\t\tif (transfer->dev_handle != dev_handle)\n\t\t\tcontinue;\n\n\t\tusbi_mutex_lock(&itransfer->lock);\n\t\tif (!(itransfer->state_flags & USBI_TRANSFER_DEVICE_DISAPPEARED)) {\n\t\t\tusbi_err(ctx, \"Device handle closed while transfer was still being processed, but the device is still connected as far as we know\");\n\n\t\t\tif (itransfer->state_flags & USBI_TRANSFER_CANCELLING)\n\t\t\t\tusbi_warn(ctx, \"A cancellation for an in-flight transfer hasn't completed but closing the device handle\");\n\t\t\telse\n\t\t\t\tusbi_err(ctx, \"A cancellation hasn't even been scheduled on the transfer for which the device is closing\");\n\t\t}\n\t\tusbi_mutex_unlock(&itransfer->lock);\n\n\t\t/* remove from the list of in-flight transfers and make sure\n\t\t * we don't accidentally use the device handle in the future\n\t\t * (or that such accesses will be easily caught and identified as a crash)\n\t\t */\n\t\tlist_del(&itransfer->list);\n\t\ttransfer->dev_handle = NULL;\n\n\t\t/* it is up to the user to free up the actual transfer struct.  this is\n\t\t * just making sure that we don't attempt to process the transfer after\n\t\t * the device handle is invalid\n\t\t */\n\t\tusbi_dbg(\"Removed transfer %p from the in-flight list because device handle %p closed\",\n\t\t\t transfer, dev_handle);\n\t}\n\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\n\tusbi_mutex_lock(&ctx->open_devs_lock);\n\tlist_del(&dev_handle->list);\n\tusbi_mutex_unlock(&ctx->open_devs_lock);\n\n\tusbi_backend->close(dev_handle);\n\tlibusb_unref_device(dev_handle->dev);\n\tusbi_mutex_destroy(&dev_handle->lock);\n\tfree(dev_handle);\n}\n\n/** \\ingroup libusb_dev\n * Close a device handle. Should be called on all open handles before your\n * application exits.\n *\n * Internally, this function destroys the reference that was added by\n * libusb_open() on the given device.\n *\n * This is a non-blocking function; no requests are sent over the bus.\n *\n * \\param dev_handle the device handle to close\n */\nvoid API_EXPORTED libusb_close(libusb_device_handle *dev_handle)\n{\n\tstruct libusb_context *ctx;\n\tint handling_events;\n\tint pending_events;\n\n\tif (!dev_handle)\n\t\treturn;\n\tusbi_dbg(\"\");\n\n\tctx = HANDLE_CTX(dev_handle);\n\thandling_events = usbi_handling_events(ctx);\n\n\t/* Similarly to libusb_open(), we want to interrupt all event handlers\n\t * at this point. More importantly, we want to perform the actual close of\n\t * the device while holding the event handling lock (preventing any other\n\t * thread from doing event handling) because we will be removing a file\n\t * descriptor from the polling loop. If this is being called by the current\n\t * event handler, we can bypass the interruption code because we already\n\t * hold the event handling lock. */\n\n\tif (!handling_events) {\n\t\t/* Record that we are closing a device.\n\t\t * Only signal an event if there are no prior pending events. */\n\t\tusbi_mutex_lock(&ctx->event_data_lock);\n\t\tpending_events = usbi_pending_events(ctx);\n\t\tctx->device_close++;\n\t\tif (!pending_events)\n\t\t\tusbi_signal_event(ctx);\n\t\tusbi_mutex_unlock(&ctx->event_data_lock);\n\n\t\t/* take event handling lock */\n\t\tlibusb_lock_events(ctx);\n\t}\n\n\t/* Close the device */\n\tdo_close(ctx, dev_handle);\n\n\tif (!handling_events) {\n\t\t/* We're done with closing this device.\n\t\t * Clear the event pipe if there are no further pending events. */\n\t\tusbi_mutex_lock(&ctx->event_data_lock);\n\t\tctx->device_close--;\n\t\tpending_events = usbi_pending_events(ctx);\n\t\tif (!pending_events)\n\t\t\tusbi_clear_event(ctx);\n\t\tusbi_mutex_unlock(&ctx->event_data_lock);\n\n\t\t/* Release event handling lock and wake up event waiters */\n\t\tlibusb_unlock_events(ctx);\n\t}\n}\n\n/** \\ingroup libusb_dev\n * Get the underlying device for a device handle. This function does not modify\n * the reference count of the returned device, so do not feel compelled to\n * unreference it when you are done.\n * \\param dev_handle a device handle\n * \\returns the underlying device\n */\nDEFAULT_VISIBILITY\nlibusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle)\n{\n\treturn dev_handle->dev;\n}\n\n/** \\ingroup libusb_dev\n * Determine the bConfigurationValue of the currently active configuration.\n *\n * You could formulate your own control request to obtain this information,\n * but this function has the advantage that it may be able to retrieve the\n * information from operating system caches (no I/O involved).\n *\n * If the OS does not cache this information, then this function will block\n * while a control transfer is submitted to retrieve the information.\n *\n * This function will return a value of 0 in the <tt>config</tt> output\n * parameter if the device is in unconfigured state.\n *\n * \\param dev_handle a device handle\n * \\param config output location for the bConfigurationValue of the active\n * configuration (only valid for return code 0)\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns another LIBUSB_ERROR code on other failure\n */\nint API_EXPORTED libusb_get_configuration(libusb_device_handle *dev_handle,\n\tint *config)\n{\n\tint r = LIBUSB_ERROR_NOT_SUPPORTED;\n\n\tusbi_dbg(\"\");\n\tif (usbi_backend->get_configuration)\n\t\tr = usbi_backend->get_configuration(dev_handle, config);\n\n\tif (r == LIBUSB_ERROR_NOT_SUPPORTED) {\n\t\tuint8_t tmp = 0;\n\t\tusbi_dbg(\"falling back to control message\");\n\t\tr = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN,\n\t\t\tLIBUSB_REQUEST_GET_CONFIGURATION, 0, 0, &tmp, 1, 1000);\n\t\tif (r == 0) {\n\t\t\tusbi_err(HANDLE_CTX(dev_handle), \"zero bytes returned in ctrl transfer?\");\n\t\t\tr = LIBUSB_ERROR_IO;\n\t\t} else if (r == 1) {\n\t\t\tr = 0;\n\t\t\t*config = tmp;\n\t\t} else {\n\t\t\tusbi_dbg(\"control failed, error %d\", r);\n\t\t}\n\t}\n\n\tif (r == 0)\n\t\tusbi_dbg(\"active config %d\", *config);\n\n\treturn r;\n}\n\n/** \\ingroup libusb_dev\n * Set the active configuration for a device.\n *\n * The operating system may or may not have already set an active\n * configuration on the device. It is up to your application to ensure the\n * correct configuration is selected before you attempt to claim interfaces\n * and perform other operations.\n *\n * If you call this function on a device already configured with the selected\n * configuration, then this function will act as a lightweight device reset:\n * it will issue a SET_CONFIGURATION request using the current configuration,\n * causing most USB-related device state to be reset (altsetting reset to zero,\n * endpoint halts cleared, toggles reset).\n *\n * You cannot change/reset configuration if your application has claimed\n * interfaces. It is advised to set the desired configuration before claiming\n * interfaces.\n *\n * Alternatively you can call libusb_release_interface() first. Note if you\n * do things this way you must ensure that auto_detach_kernel_driver for\n * <tt>dev</tt> is 0, otherwise the kernel driver will be re-attached when you\n * release the interface(s).\n *\n * You cannot change/reset configuration if other applications or drivers have\n * claimed interfaces.\n *\n * A configuration value of -1 will put the device in unconfigured state.\n * The USB specifications state that a configuration value of 0 does this,\n * however buggy devices exist which actually have a configuration 0.\n *\n * You should always use this function rather than formulating your own\n * SET_CONFIGURATION control request. This is because the underlying operating\n * system needs to know when such changes happen.\n *\n * This is a blocking function.\n *\n * \\param dev_handle a device handle\n * \\param configuration the bConfigurationValue of the configuration you\n * wish to activate, or -1 if you wish to put the device in an unconfigured\n * state\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist\n * \\returns LIBUSB_ERROR_BUSY if interfaces are currently claimed\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns another LIBUSB_ERROR code on other failure\n * \\see libusb_set_auto_detach_kernel_driver()\n */\nint API_EXPORTED libusb_set_configuration(libusb_device_handle *dev_handle,\n\tint configuration)\n{\n\tusbi_dbg(\"configuration %d\", configuration);\n\treturn usbi_backend->set_configuration(dev_handle, configuration);\n}\n\n/** \\ingroup libusb_dev\n * Claim an interface on a given device handle. You must claim the interface\n * you wish to use before you can perform I/O on any of its endpoints.\n *\n * It is legal to attempt to claim an already-claimed interface, in which\n * case libusb just returns 0 without doing anything.\n *\n * If auto_detach_kernel_driver is set to 1 for <tt>dev</tt>, the kernel driver\n * will be detached if necessary, on failure the detach error is returned.\n *\n * Claiming of interfaces is a purely logical operation; it does not cause\n * any requests to be sent over the bus. Interface claiming is used to\n * instruct the underlying operating system that your application wishes\n * to take ownership of the interface.\n *\n * This is a non-blocking function.\n *\n * \\param dev_handle a device handle\n * \\param interface_number the <tt>bInterfaceNumber</tt> of the interface you\n * wish to claim\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist\n * \\returns LIBUSB_ERROR_BUSY if another program or driver has claimed the\n * interface\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns a LIBUSB_ERROR code on other failure\n * \\see libusb_set_auto_detach_kernel_driver()\n */\nint API_EXPORTED libusb_claim_interface(libusb_device_handle *dev_handle,\n\tint interface_number)\n{\n\tint r = 0;\n\n\tusbi_dbg(\"interface %d\", interface_number);\n\tif (interface_number >= USB_MAXINTERFACES)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\tusbi_mutex_lock(&dev_handle->lock);\n\tif (dev_handle->claimed_interfaces & (1 << interface_number))\n\t\tgoto out;\n\n\tr = usbi_backend->claim_interface(dev_handle, interface_number);\n\tif (r == 0)\n\t\tdev_handle->claimed_interfaces |= 1 << interface_number;\n\nout:\n\tusbi_mutex_unlock(&dev_handle->lock);\n\treturn r;\n}\n\n/** \\ingroup libusb_dev\n * Release an interface previously claimed with libusb_claim_interface(). You\n * should release all claimed interfaces before closing a device handle.\n *\n * This is a blocking function. A SET_INTERFACE control request will be sent\n * to the device, resetting interface state to the first alternate setting.\n *\n * If auto_detach_kernel_driver is set to 1 for <tt>dev</tt>, the kernel\n * driver will be re-attached after releasing the interface.\n *\n * \\param dev_handle a device handle\n * \\param interface_number the <tt>bInterfaceNumber</tt> of the\n * previously-claimed interface\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns another LIBUSB_ERROR code on other failure\n * \\see libusb_set_auto_detach_kernel_driver()\n */\nint API_EXPORTED libusb_release_interface(libusb_device_handle *dev_handle,\n\tint interface_number)\n{\n\tint r;\n\n\tusbi_dbg(\"interface %d\", interface_number);\n\tif (interface_number >= USB_MAXINTERFACES)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tusbi_mutex_lock(&dev_handle->lock);\n\tif (!(dev_handle->claimed_interfaces & (1 << interface_number))) {\n\t\tr = LIBUSB_ERROR_NOT_FOUND;\n\t\tgoto out;\n\t}\n\n\tr = usbi_backend->release_interface(dev_handle, interface_number);\n\tif (r == 0)\n\t\tdev_handle->claimed_interfaces &= ~(1 << interface_number);\n\nout:\n\tusbi_mutex_unlock(&dev_handle->lock);\n\treturn r;\n}\n\n/** \\ingroup libusb_dev\n * Activate an alternate setting for an interface. The interface must have\n * been previously claimed with libusb_claim_interface().\n *\n * You should always use this function rather than formulating your own\n * SET_INTERFACE control request. This is because the underlying operating\n * system needs to know when such changes happen.\n *\n * This is a blocking function.\n *\n * \\param dev_handle a device handle\n * \\param interface_number the <tt>bInterfaceNumber</tt> of the\n * previously-claimed interface\n * \\param alternate_setting the <tt>bAlternateSetting</tt> of the alternate\n * setting to activate\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed, or the\n * requested alternate setting does not exist\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns another LIBUSB_ERROR code on other failure\n */\nint API_EXPORTED libusb_set_interface_alt_setting(libusb_device_handle *dev_handle,\n\tint interface_number, int alternate_setting)\n{\n\tusbi_dbg(\"interface %d altsetting %d\",\n\t\tinterface_number, alternate_setting);\n\tif (interface_number >= USB_MAXINTERFACES)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tusbi_mutex_lock(&dev_handle->lock);\n\tif (!dev_handle->dev->attached) {\n\t\tusbi_mutex_unlock(&dev_handle->lock);\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\tif (!(dev_handle->claimed_interfaces & (1 << interface_number))) {\n\t\tusbi_mutex_unlock(&dev_handle->lock);\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\tusbi_mutex_unlock(&dev_handle->lock);\n\n\treturn usbi_backend->set_interface_altsetting(dev_handle, interface_number,\n\t\talternate_setting);\n}\n\n/** \\ingroup libusb_dev\n * Clear the halt/stall condition for an endpoint. Endpoints with halt status\n * are unable to receive or transmit data until the halt condition is stalled.\n *\n * You should cancel all pending transfers before attempting to clear the halt\n * condition.\n *\n * This is a blocking function.\n *\n * \\param dev_handle a device handle\n * \\param endpoint the endpoint to clear halt status\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns another LIBUSB_ERROR code on other failure\n */\nint API_EXPORTED libusb_clear_halt(libusb_device_handle *dev_handle,\n\tunsigned char endpoint)\n{\n\tusbi_dbg(\"endpoint %x\", endpoint);\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\treturn usbi_backend->clear_halt(dev_handle, endpoint);\n}\n\n/** \\ingroup libusb_dev\n * Perform a USB port reset to reinitialize a device. The system will attempt\n * to restore the previous configuration and alternate settings after the\n * reset has completed.\n *\n * If the reset fails, the descriptors change, or the previous state cannot be\n * restored, the device will appear to be disconnected and reconnected. This\n * means that the device handle is no longer valid (you should close it) and\n * rediscover the device. A return code of LIBUSB_ERROR_NOT_FOUND indicates\n * when this is the case.\n *\n * This is a blocking function which usually incurs a noticeable delay.\n *\n * \\param dev_handle a handle of the device to reset\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the\n * device has been disconnected\n * \\returns another LIBUSB_ERROR code on other failure\n */\nint API_EXPORTED libusb_reset_device(libusb_device_handle *dev_handle)\n{\n\tusbi_dbg(\"\");\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\treturn usbi_backend->reset_device(dev_handle);\n}\n\n/** \\ingroup libusb_asyncio\n * Allocate up to num_streams usb bulk streams on the specified endpoints. This\n * function takes an array of endpoints rather then a single endpoint because\n * some protocols require that endpoints are setup with similar stream ids.\n * All endpoints passed in must belong to the same interface.\n *\n * Note this function may return less streams then requested. Also note that the\n * same number of streams are allocated for each endpoint in the endpoint array.\n *\n * Stream id 0 is reserved, and should not be used to communicate with devices.\n * If libusb_alloc_streams() returns with a value of N, you may use stream ids\n * 1 to N.\n *\n * Since version 1.0.19, \\ref LIBUSB_API_VERSION >= 0x01000103\n *\n * \\param dev_handle a device handle\n * \\param num_streams number of streams to try to allocate\n * \\param endpoints array of endpoints to allocate streams on\n * \\param num_endpoints length of the endpoints array\n * \\returns number of streams allocated, or a LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_alloc_streams(libusb_device_handle *dev_handle,\n\tuint32_t num_streams, unsigned char *endpoints, int num_endpoints)\n{\n\tusbi_dbg(\"streams %u eps %d\", (unsigned) num_streams, num_endpoints);\n\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\tif (usbi_backend->alloc_streams)\n\t\treturn usbi_backend->alloc_streams(dev_handle, num_streams, endpoints,\n\t\t\t\t\t\t   num_endpoints);\n\telse\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\n/** \\ingroup libusb_asyncio\n * Free usb bulk streams allocated with libusb_alloc_streams().\n *\n * Note streams are automatically free-ed when releasing an interface.\n *\n * Since version 1.0.19, \\ref LIBUSB_API_VERSION >= 0x01000103\n *\n * \\param dev_handle a device handle\n * \\param endpoints array of endpoints to free streams on\n * \\param num_endpoints length of the endpoints array\n * \\returns LIBUSB_SUCCESS, or a LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_free_streams(libusb_device_handle *dev_handle,\n\tunsigned char *endpoints, int num_endpoints)\n{\n\tusbi_dbg(\"eps %d\", num_endpoints);\n\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\tif (usbi_backend->free_streams)\n\t\treturn usbi_backend->free_streams(dev_handle, endpoints,\n\t\t\t\t\t\t  num_endpoints);\n\telse\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\n/** \\ingroup libusb_asyncio\n * Attempts to allocate a block of persistent DMA memory suitable for transfers\n * against the given device. If successful, will return a block of memory\n * that is suitable for use as \"buffer\" in \\ref libusb_transfer against this\n * device. Using this memory instead of regular memory means that the host\n * controller can use DMA directly into the buffer to increase performance, and\n * also that transfers can no longer fail due to kernel memory fragmentation.\n *\n * Note that this means you should not modify this memory (or even data on\n * the same cache lines) when a transfer is in progress, although it is legal\n * to have several transfers going on within the same memory block.\n *\n * Will return NULL on failure. Many systems do not support such zerocopy\n * and will always return NULL. Memory allocated with this function must be\n * freed with \\ref libusb_dev_mem_free. Specifically, this means that the\n * flag \\ref LIBUSB_TRANSFER_FREE_BUFFER cannot be used to free memory allocated\n * with this function.\n *\n * Since version 1.0.21, \\ref LIBUSB_API_VERSION >= 0x01000105\n *\n * \\param dev_handle a device handle\n * \\param length size of desired data buffer\n * \\returns a pointer to the newly allocated memory, or NULL on failure\n */\nDEFAULT_VISIBILITY\nunsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handle,\n        size_t length)\n{\n\tif (!dev_handle->dev->attached)\n\t\treturn NULL;\n\n\tif (usbi_backend->dev_mem_alloc)\n\t\treturn usbi_backend->dev_mem_alloc(dev_handle, length);\n\telse\n\t\treturn NULL;\n}\n\n/** \\ingroup libusb_asyncio\n * Free device memory allocated with libusb_dev_mem_alloc().\n *\n * \\param dev_handle a device handle\n * \\param buffer pointer to the previously allocated memory\n * \\param length size of previously allocated memory\n * \\returns LIBUSB_SUCCESS, or a LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_dev_mem_free(libusb_device_handle *dev_handle,\n\tunsigned char *buffer, size_t length)\n{\n\tif (usbi_backend->dev_mem_free)\n\t\treturn usbi_backend->dev_mem_free(dev_handle, buffer, length);\n\telse\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\n/** \\ingroup libusb_dev\n * Determine if a kernel driver is active on an interface. If a kernel driver\n * is active, you cannot claim the interface, and libusb will be unable to\n * perform I/O.\n *\n * This functionality is not available on Windows.\n *\n * \\param dev_handle a device handle\n * \\param interface_number the interface to check\n * \\returns 0 if no kernel driver is active\n * \\returns 1 if a kernel driver is active\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality\n * is not available\n * \\returns another LIBUSB_ERROR code on other failure\n * \\see libusb_detach_kernel_driver()\n */\nint API_EXPORTED libusb_kernel_driver_active(libusb_device_handle *dev_handle,\n\tint interface_number)\n{\n\tusbi_dbg(\"interface %d\", interface_number);\n\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\tif (usbi_backend->kernel_driver_active)\n\t\treturn usbi_backend->kernel_driver_active(dev_handle, interface_number);\n\telse\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\n/** \\ingroup libusb_dev\n * Detach a kernel driver from an interface. If successful, you will then be\n * able to claim the interface and perform I/O.\n *\n * This functionality is not available on Darwin or Windows.\n *\n * Note that libusb itself also talks to the device through a special kernel\n * driver, if this driver is already attached to the device, this call will\n * not detach it and return LIBUSB_ERROR_NOT_FOUND.\n *\n * \\param dev_handle a device handle\n * \\param interface_number the interface to detach the driver from\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active\n * \\returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality\n * is not available\n * \\returns another LIBUSB_ERROR code on other failure\n * \\see libusb_kernel_driver_active()\n */\nint API_EXPORTED libusb_detach_kernel_driver(libusb_device_handle *dev_handle,\n\tint interface_number)\n{\n\tusbi_dbg(\"interface %d\", interface_number);\n\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\tif (usbi_backend->detach_kernel_driver)\n\t\treturn usbi_backend->detach_kernel_driver(dev_handle, interface_number);\n\telse\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\n/** \\ingroup libusb_dev\n * Re-attach an interface's kernel driver, which was previously detached\n * using libusb_detach_kernel_driver(). This call is only effective on\n * Linux and returns LIBUSB_ERROR_NOT_SUPPORTED on all other platforms.\n *\n * This functionality is not available on Darwin or Windows.\n *\n * \\param dev_handle a device handle\n * \\param interface_number the interface to attach the driver from\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active\n * \\returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality\n * is not available\n * \\returns LIBUSB_ERROR_BUSY if the driver cannot be attached because the\n * interface is claimed by a program or driver\n * \\returns another LIBUSB_ERROR code on other failure\n * \\see libusb_kernel_driver_active()\n */\nint API_EXPORTED libusb_attach_kernel_driver(libusb_device_handle *dev_handle,\n\tint interface_number)\n{\n\tusbi_dbg(\"interface %d\", interface_number);\n\n\tif (!dev_handle->dev->attached)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\tif (usbi_backend->attach_kernel_driver)\n\t\treturn usbi_backend->attach_kernel_driver(dev_handle, interface_number);\n\telse\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\n/** \\ingroup libusb_dev\n * Enable/disable libusb's automatic kernel driver detachment. When this is\n * enabled libusb will automatically detach the kernel driver on an interface\n * when claiming the interface, and attach it when releasing the interface.\n *\n * Automatic kernel driver detachment is disabled on newly opened device\n * handles by default.\n *\n * On platforms which do not have LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER\n * this function will return LIBUSB_ERROR_NOT_SUPPORTED, and libusb will\n * continue as if this function was never called.\n *\n * \\param dev_handle a device handle\n * \\param enable whether to enable or disable auto kernel driver detachment\n *\n * \\returns LIBUSB_SUCCESS on success\n * \\returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality\n * is not available\n * \\see libusb_claim_interface()\n * \\see libusb_release_interface()\n * \\see libusb_set_configuration()\n */\nint API_EXPORTED libusb_set_auto_detach_kernel_driver(\n\tlibusb_device_handle *dev_handle, int enable)\n{\n\tif (!(usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER))\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\n\tdev_handle->auto_detach_kernel_driver = enable;\n\treturn LIBUSB_SUCCESS;\n}\n\n/** \\ingroup libusb_lib\n * Set log message verbosity.\n *\n * The default level is LIBUSB_LOG_LEVEL_NONE, which means no messages are ever\n * printed. If you choose to increase the message verbosity level, ensure\n * that your application does not close the stdout/stderr file descriptors.\n *\n * You are advised to use level LIBUSB_LOG_LEVEL_WARNING. libusb is conservative\n * with its message logging and most of the time, will only log messages that\n * explain error conditions and other oddities. This will help you debug\n * your software.\n *\n * If the LIBUSB_DEBUG environment variable was set when libusb was\n * initialized, this function does nothing: the message verbosity is fixed\n * to the value in the environment variable.\n *\n * If libusb was compiled without any message logging, this function does\n * nothing: you'll never get any messages.\n *\n * If libusb was compiled with verbose debug message logging, this function\n * does nothing: you'll always get messages from all levels.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param level debug level to set\n */\nvoid API_EXPORTED libusb_set_debug(libusb_context *ctx, int level)\n{\n\tUSBI_GET_CONTEXT(ctx);\n\tif (!ctx->debug_fixed)\n\t\tctx->debug = level;\n}\n\n/** \\ingroup libusb_lib\n * Initialize libusb. This function must be called before calling any other\n * libusb function.\n *\n * If you do not provide an output location for a context pointer, a default\n * context will be created. If there was already a default context, it will\n * be reused (and nothing will be initialized/reinitialized).\n *\n * \\param context Optional output location for context pointer.\n * Only valid on return code 0.\n * \\returns 0 on success, or a LIBUSB_ERROR code on failure\n * \\see libusb_contexts\n */\nint API_EXPORTED libusb_init(libusb_context **context)\n{\n\tstruct libusb_device *dev, *next;\n\tchar *dbg = getenv(\"LIBUSB_DEBUG\");\n\tstruct libusb_context *ctx;\n\tstatic int first_init = 1;\n\tint r = 0;\n\n\tusbi_mutex_static_lock(&default_context_lock);\n\n\tif (!timestamp_origin.tv_sec) {\n\t\tusbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timestamp_origin);\n\t}\n\n\tif (!context && usbi_default_context) {\n\t\tusbi_dbg(\"reusing default context\");\n\t\tdefault_context_refcnt++;\n\t\tusbi_mutex_static_unlock(&default_context_lock);\n\t\treturn 0;\n\t}\n\n\tctx = calloc(1, sizeof(*ctx));\n\tif (!ctx) {\n\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\tgoto err_unlock;\n\t}\n\n#ifdef ENABLE_DEBUG_LOGGING\n\tctx->debug = LIBUSB_LOG_LEVEL_DEBUG;\n#endif\n\n\tif (dbg) {\n\t\tctx->debug = atoi(dbg);\n\t\tif (ctx->debug)\n\t\t\tctx->debug_fixed = 1;\n\t}\n\n\t/* default context should be initialized before calling usbi_dbg */\n\tif (!usbi_default_context) {\n\t\tusbi_default_context = ctx;\n\t\tdefault_context_refcnt++;\n\t\tusbi_dbg(\"created default context\");\n\t}\n\n\tusbi_dbg(\"libusb v%u.%u.%u.%u%s\", libusb_version_internal.major, libusb_version_internal.minor,\n\t\tlibusb_version_internal.micro, libusb_version_internal.nano, libusb_version_internal.rc);\n\n\tusbi_mutex_init(&ctx->usb_devs_lock);\n\tusbi_mutex_init(&ctx->open_devs_lock);\n\tusbi_mutex_init(&ctx->hotplug_cbs_lock);\n\tlist_init(&ctx->usb_devs);\n\tlist_init(&ctx->open_devs);\n\tlist_init(&ctx->hotplug_cbs);\n\n\tusbi_mutex_static_lock(&active_contexts_lock);\n\tif (first_init) {\n\t\tfirst_init = 0;\n\t\tlist_init (&active_contexts_list);\n\t}\n\tlist_add (&ctx->list, &active_contexts_list);\n\tusbi_mutex_static_unlock(&active_contexts_lock);\n\n\tif (usbi_backend->init) {\n\t\tr = usbi_backend->init(ctx);\n\t\tif (r)\n\t\t\tgoto err_free_ctx;\n\t}\n\n\tr = usbi_io_init(ctx);\n\tif (r < 0)\n\t\tgoto err_backend_exit;\n\n\tusbi_mutex_static_unlock(&default_context_lock);\n\n\tif (context)\n\t\t*context = ctx;\n\n\treturn 0;\n\nerr_backend_exit:\n\tif (usbi_backend->exit)\n\t\tusbi_backend->exit();\nerr_free_ctx:\n\tif (ctx == usbi_default_context) {\n\t\tusbi_default_context = NULL;\n\t\tdefault_context_refcnt--;\n\t}\n\n\tusbi_mutex_static_lock(&active_contexts_lock);\n\tlist_del (&ctx->list);\n\tusbi_mutex_static_unlock(&active_contexts_lock);\n\n\tusbi_mutex_lock(&ctx->usb_devs_lock);\n\tlist_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) {\n\t\tlist_del(&dev->list);\n\t\tlibusb_unref_device(dev);\n\t}\n\tusbi_mutex_unlock(&ctx->usb_devs_lock);\n\n\tusbi_mutex_destroy(&ctx->open_devs_lock);\n\tusbi_mutex_destroy(&ctx->usb_devs_lock);\n\tusbi_mutex_destroy(&ctx->hotplug_cbs_lock);\n\n\tfree(ctx);\nerr_unlock:\n\tusbi_mutex_static_unlock(&default_context_lock);\n\treturn r;\n}\n\n/** \\ingroup libusb_lib\n * Deinitialize libusb. Should be called after closing all open devices and\n * before your application terminates.\n * \\param ctx the context to deinitialize, or NULL for the default context\n */\nvoid API_EXPORTED libusb_exit(struct libusb_context *ctx)\n{\n\tstruct libusb_device *dev, *next;\n\tstruct timeval tv = { 0, 0 };\n\n\tusbi_dbg(\"\");\n\tUSBI_GET_CONTEXT(ctx);\n\n\t/* if working with default context, only actually do the deinitialization\n\t * if we're the last user */\n\tusbi_mutex_static_lock(&default_context_lock);\n\tif (ctx == usbi_default_context) {\n\t\tif (--default_context_refcnt > 0) {\n\t\t\tusbi_dbg(\"not destroying default context\");\n\t\t\tusbi_mutex_static_unlock(&default_context_lock);\n\t\t\treturn;\n\t\t}\n\t\tusbi_dbg(\"destroying default context\");\n\t\tusbi_default_context = NULL;\n\t}\n\tusbi_mutex_static_unlock(&default_context_lock);\n\n\tusbi_mutex_static_lock(&active_contexts_lock);\n\tlist_del (&ctx->list);\n\tusbi_mutex_static_unlock(&active_contexts_lock);\n\n\tif (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {\n\t\tusbi_hotplug_deregister_all(ctx);\n\n\t\t/*\n\t\t * Ensure any pending unplug events are read from the hotplug\n\t\t * pipe. The usb_device-s hold in the events are no longer part\n\t\t * of usb_devs, but the events still hold a reference!\n\t\t *\n\t\t * Note we don't do this if the application has left devices\n\t\t * open (which implies a buggy app) to avoid packet completion\n\t\t * handlers running when the app does not expect them to run.\n\t\t */\n\t\tif (list_empty(&ctx->open_devs))\n\t\t\tlibusb_handle_events_timeout(ctx, &tv);\n\n\t\tusbi_mutex_lock(&ctx->usb_devs_lock);\n\t\tlist_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) {\n\t\t\tlist_del(&dev->list);\n\t\t\tlibusb_unref_device(dev);\n\t\t}\n\t\tusbi_mutex_unlock(&ctx->usb_devs_lock);\n\t}\n\n\t/* a few sanity checks. don't bother with locking because unless\n\t * there is an application bug, nobody will be accessing these. */\n\tif (!list_empty(&ctx->usb_devs))\n\t\tusbi_warn(ctx, \"some libusb_devices were leaked\");\n\tif (!list_empty(&ctx->open_devs))\n\t\tusbi_warn(ctx, \"application left some devices open\");\n\n\tusbi_io_exit(ctx);\n\tif (usbi_backend->exit)\n\t\tusbi_backend->exit();\n\n\tusbi_mutex_destroy(&ctx->open_devs_lock);\n\tusbi_mutex_destroy(&ctx->usb_devs_lock);\n\tusbi_mutex_destroy(&ctx->hotplug_cbs_lock);\n\tfree(ctx);\n}\n\n/** \\ingroup libusb_misc\n * Check at runtime if the loaded library has a given capability.\n * This call should be performed after \\ref libusb_init(), to ensure the\n * backend has updated its capability set.\n *\n * \\param capability the \\ref libusb_capability to check for\n * \\returns nonzero if the running library has the capability, 0 otherwise\n */\nint API_EXPORTED libusb_has_capability(uint32_t capability)\n{\n\tswitch (capability) {\n\tcase LIBUSB_CAP_HAS_CAPABILITY:\n\t\treturn 1;\n\tcase LIBUSB_CAP_HAS_HOTPLUG:\n\t\treturn !(usbi_backend->get_device_list);\n\tcase LIBUSB_CAP_HAS_HID_ACCESS:\n\t\treturn (usbi_backend->caps & USBI_CAP_HAS_HID_ACCESS);\n\tcase LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER:\n\t\treturn (usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER);\n\t}\n\treturn 0;\n}\n\n/* this is defined in libusbi.h if needed */\n#ifdef LIBUSB_PRINTF_WIN32\n/*\n * Prior to VS2015, Microsoft did not provide the snprintf() function and\n * provided a vsnprintf() that did not guarantee NULL-terminated output.\n * Microsoft did provide a _snprintf() function, but again it did not\n * guarantee NULL-terminated output.\n *\n * The below implementations guarantee NULL-terminated output and are\n * C99 compliant.\n */\n\nint usbi_snprintf(char *str, size_t size, const char *format, ...)\n{\n\tva_list ap;\n\tint ret;\n\n\tva_start(ap, format);\n\tret = usbi_vsnprintf(str, size, format, ap);\n\tva_end(ap);\n\n\treturn ret;\n}\n\nint usbi_vsnprintf(char *str, size_t size, const char *format, va_list ap)\n{\n\tint ret;\n\n\tret = _vsnprintf(str, size, format, ap);\n\tif (ret < 0 || ret == (int)size) {\n\t\t/* Output is truncated, ensure buffer is NULL-terminated and\n\t\t * determine how many characters would have been written. */\n\t\tstr[size - 1] = '\\0';\n\t\tif (ret < 0)\n\t\t\tret = _vsnprintf(NULL, 0, format, ap);\n\t}\n\n\treturn ret;\n}\n#endif\n\nstatic void usbi_log_str(struct libusb_context *ctx,\n\tenum libusb_log_level level, const char * str)\n{\n#if defined(USE_SYSTEM_LOGGING_FACILITY)\n#if defined(OS_WINDOWS)\n\tOutputDebugString(str);\n#elif defined(OS_WINCE)\n\t/* Windows CE only supports the Unicode version of OutputDebugString. */\n\tWCHAR wbuf[USBI_MAX_LOG_LEN];\n\tMultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, sizeof(wbuf));\n\tOutputDebugStringW(wbuf);\n#elif defined(__ANDROID__)\n\tint priority = ANDROID_LOG_UNKNOWN;\n\tswitch (level) {\n\tcase LIBUSB_LOG_LEVEL_INFO: priority = ANDROID_LOG_INFO; break;\n\tcase LIBUSB_LOG_LEVEL_WARNING: priority = ANDROID_LOG_WARN; break;\n\tcase LIBUSB_LOG_LEVEL_ERROR: priority = ANDROID_LOG_ERROR; break;\n\tcase LIBUSB_LOG_LEVEL_DEBUG: priority = ANDROID_LOG_DEBUG; break;\n\t}\n\t__android_log_write(priority, \"libusb\", str);\n#elif defined(HAVE_SYSLOG_FUNC)\n\tint syslog_level = LOG_INFO;\n\tswitch (level) {\n\tcase LIBUSB_LOG_LEVEL_INFO: syslog_level = LOG_INFO; break;\n\tcase LIBUSB_LOG_LEVEL_WARNING: syslog_level = LOG_WARNING; break;\n\tcase LIBUSB_LOG_LEVEL_ERROR: syslog_level = LOG_ERR; break;\n\tcase LIBUSB_LOG_LEVEL_DEBUG: syslog_level = LOG_DEBUG; break;\n\t}\n\tsyslog(syslog_level, \"%s\", str);\n#else /* All of gcc, Clang, XCode seem to use #warning */\n#warning System logging is not supported on this platform. Logging to stderr will be used instead.\n\tfputs(str, stderr);\n#endif\n#else\n\tfputs(str, stderr);\n#endif /* USE_SYSTEM_LOGGING_FACILITY */\n\tUNUSED(ctx);\n\tUNUSED(level);\n}\n\nvoid usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,\n\tconst char *function, const char *format, va_list args)\n{\n\tconst char *prefix = \"\";\n\tchar buf[USBI_MAX_LOG_LEN];\n\tstruct timespec now;\n\tint global_debug, header_len, text_len;\n\tstatic int has_debug_header_been_displayed = 0;\n\n#ifdef ENABLE_DEBUG_LOGGING\n\tglobal_debug = 1;\n\tUNUSED(ctx);\n#else\n\tint ctx_level = 0;\n\n\tUSBI_GET_CONTEXT(ctx);\n\tif (ctx) {\n\t\tctx_level = ctx->debug;\n\t} else {\n\t\tchar *dbg = getenv(\"LIBUSB_DEBUG\");\n\t\tif (dbg)\n\t\t\tctx_level = atoi(dbg);\n\t}\n\tglobal_debug = (ctx_level == LIBUSB_LOG_LEVEL_DEBUG);\n\tif (!ctx_level)\n\t\treturn;\n\tif (level == LIBUSB_LOG_LEVEL_WARNING && ctx_level < LIBUSB_LOG_LEVEL_WARNING)\n\t\treturn;\n\tif (level == LIBUSB_LOG_LEVEL_INFO && ctx_level < LIBUSB_LOG_LEVEL_INFO)\n\t\treturn;\n\tif (level == LIBUSB_LOG_LEVEL_DEBUG && ctx_level < LIBUSB_LOG_LEVEL_DEBUG)\n\t\treturn;\n#endif\n\n\tusbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &now);\n\tif ((global_debug) && (!has_debug_header_been_displayed)) {\n\t\thas_debug_header_been_displayed = 1;\n\t\tusbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, \"[timestamp] [threadID] facility level [function call] <message>\" USBI_LOG_LINE_END);\n\t\tusbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, \"--------------------------------------------------------------------------------\" USBI_LOG_LINE_END);\n\t}\n\tif (now.tv_nsec < timestamp_origin.tv_nsec) {\n\t\tnow.tv_sec--;\n\t\tnow.tv_nsec += 1000000000L;\n\t}\n\tnow.tv_sec -= timestamp_origin.tv_sec;\n\tnow.tv_nsec -= timestamp_origin.tv_nsec;\n\n\tswitch (level) {\n\tcase LIBUSB_LOG_LEVEL_INFO:\n\t\tprefix = \"info\";\n\t\tbreak;\n\tcase LIBUSB_LOG_LEVEL_WARNING:\n\t\tprefix = \"warning\";\n\t\tbreak;\n\tcase LIBUSB_LOG_LEVEL_ERROR:\n\t\tprefix = \"error\";\n\t\tbreak;\n\tcase LIBUSB_LOG_LEVEL_DEBUG:\n\t\tprefix = \"debug\";\n\t\tbreak;\n\tcase LIBUSB_LOG_LEVEL_NONE:\n\t\treturn;\n\tdefault:\n\t\tprefix = \"unknown\";\n\t\tbreak;\n\t}\n\n\tif (global_debug) {\n\t\theader_len = snprintf(buf, sizeof(buf),\n\t\t\t\"[%2d.%06d] [%08x] libusb: %s [%s] \",\n\t\t\t(int)now.tv_sec, (int)(now.tv_nsec / 1000L), usbi_get_tid(), prefix, function);\n\t} else {\n\t\theader_len = snprintf(buf, sizeof(buf),\n\t\t\t\"libusb: %s [%s] \", prefix, function);\n\t}\n\n\tif (header_len < 0 || header_len >= (int)sizeof(buf)) {\n\t\t/* Somehow snprintf failed to write to the buffer,\n\t\t * remove the header so something useful is output. */\n\t\theader_len = 0;\n\t}\n\t/* Make sure buffer is NUL terminated */\n\tbuf[header_len] = '\\0';\n\ttext_len = vsnprintf(buf + header_len, sizeof(buf) - header_len,\n\t\tformat, args);\n\tif (text_len < 0 || text_len + header_len >= (int)sizeof(buf)) {\n\t\t/* Truncated log output. On some platforms a -1 return value means\n\t\t * that the output was truncated. */\n\t\ttext_len = sizeof(buf) - header_len;\n\t}\n\tif (header_len + text_len + sizeof(USBI_LOG_LINE_END) >= sizeof(buf)) {\n\t\t/* Need to truncate the text slightly to fit on the terminator. */\n\t\ttext_len -= (header_len + text_len + sizeof(USBI_LOG_LINE_END)) - sizeof(buf);\n\t}\n\tstrcpy(buf + header_len + text_len, USBI_LOG_LINE_END);\n\n\tusbi_log_str(ctx, level, buf);\n}\n\nvoid usbi_log(struct libusb_context *ctx, enum libusb_log_level level,\n\tconst char *function, const char *format, ...)\n{\n\tva_list args;\n\n\tva_start (args, format);\n\tusbi_log_v(ctx, level, function, format, args);\n\tva_end (args);\n}\n\n/** \\ingroup libusb_misc\n * Returns a constant NULL-terminated string with the ASCII name of a libusb\n * error or transfer status code. The caller must not free() the returned\n * string.\n *\n * \\param error_code The \\ref libusb_error or libusb_transfer_status code to\n * return the name of.\n * \\returns The error name, or the string **UNKNOWN** if the value of\n * error_code is not a known error / status code.\n */\nDEFAULT_VISIBILITY const char * LIBUSB_CALL libusb_error_name(int error_code)\n{\n\tswitch (error_code) {\n\tcase LIBUSB_ERROR_IO:\n\t\treturn \"LIBUSB_ERROR_IO\";\n\tcase LIBUSB_ERROR_INVALID_PARAM:\n\t\treturn \"LIBUSB_ERROR_INVALID_PARAM\";\n\tcase LIBUSB_ERROR_ACCESS:\n\t\treturn \"LIBUSB_ERROR_ACCESS\";\n\tcase LIBUSB_ERROR_NO_DEVICE:\n\t\treturn \"LIBUSB_ERROR_NO_DEVICE\";\n\tcase LIBUSB_ERROR_NOT_FOUND:\n\t\treturn \"LIBUSB_ERROR_NOT_FOUND\";\n\tcase LIBUSB_ERROR_BUSY:\n\t\treturn \"LIBUSB_ERROR_BUSY\";\n\tcase LIBUSB_ERROR_TIMEOUT:\n\t\treturn \"LIBUSB_ERROR_TIMEOUT\";\n\tcase LIBUSB_ERROR_OVERFLOW:\n\t\treturn \"LIBUSB_ERROR_OVERFLOW\";\n\tcase LIBUSB_ERROR_PIPE:\n\t\treturn \"LIBUSB_ERROR_PIPE\";\n\tcase LIBUSB_ERROR_INTERRUPTED:\n\t\treturn \"LIBUSB_ERROR_INTERRUPTED\";\n\tcase LIBUSB_ERROR_NO_MEM:\n\t\treturn \"LIBUSB_ERROR_NO_MEM\";\n\tcase LIBUSB_ERROR_NOT_SUPPORTED:\n\t\treturn \"LIBUSB_ERROR_NOT_SUPPORTED\";\n\tcase LIBUSB_ERROR_OTHER:\n\t\treturn \"LIBUSB_ERROR_OTHER\";\n\n\tcase LIBUSB_TRANSFER_ERROR:\n\t\treturn \"LIBUSB_TRANSFER_ERROR\";\n\tcase LIBUSB_TRANSFER_TIMED_OUT:\n\t\treturn \"LIBUSB_TRANSFER_TIMED_OUT\";\n\tcase LIBUSB_TRANSFER_CANCELLED:\n\t\treturn \"LIBUSB_TRANSFER_CANCELLED\";\n\tcase LIBUSB_TRANSFER_STALL:\n\t\treturn \"LIBUSB_TRANSFER_STALL\";\n\tcase LIBUSB_TRANSFER_NO_DEVICE:\n\t\treturn \"LIBUSB_TRANSFER_NO_DEVICE\";\n\tcase LIBUSB_TRANSFER_OVERFLOW:\n\t\treturn \"LIBUSB_TRANSFER_OVERFLOW\";\n\n\tcase 0:\n\t\treturn \"LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED\";\n\tdefault:\n\t\treturn \"**UNKNOWN**\";\n\t}\n}\n\n/** \\ingroup libusb_misc\n * Returns a pointer to const struct libusb_version with the version\n * (major, minor, micro, nano and rc) of the running library.\n */\nDEFAULT_VISIBILITY\nconst struct libusb_version * LIBUSB_CALL libusb_get_version(void)\n{\n\treturn &libusb_version_internal;\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/descriptor.c",
    "content": "/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */\n/*\n * USB descriptor handling functions for libusb\n * Copyright © 2007 Daniel Drake <dsd@gentoo.org>\n * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <errno.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libusbi.h\"\n\n#define DESC_HEADER_LENGTH\t\t2\n#define DEVICE_DESC_LENGTH\t\t18\n#define CONFIG_DESC_LENGTH\t\t9\n#define INTERFACE_DESC_LENGTH\t\t9\n#define ENDPOINT_DESC_LENGTH\t\t7\n#define ENDPOINT_AUDIO_DESC_LENGTH\t9\n\n/** @defgroup libusb_desc USB descriptors\n * This page details how to examine the various standard USB descriptors\n * for detected devices\n */\n\n/* set host_endian if the w values are already in host endian format,\n * as opposed to bus endian. */\nint usbi_parse_descriptor(const unsigned char *source, const char *descriptor,\n\tvoid *dest, int host_endian)\n{\n\tconst unsigned char *sp = source;\n\tunsigned char *dp = dest;\n\tuint16_t w;\n\tconst char *cp;\n\tuint32_t d;\n\n\tfor (cp = descriptor; *cp; cp++) {\n\t\tswitch (*cp) {\n\t\t\tcase 'b':\t/* 8-bit byte */\n\t\t\t\t*dp++ = *sp++;\n\t\t\t\tbreak;\n\t\t\tcase 'w':\t/* 16-bit word, convert from little endian to CPU */\n\t\t\t\tdp += ((uintptr_t)dp & 1);\t/* Align to word boundary */\n\n\t\t\t\tif (host_endian) {\n\t\t\t\t\tmemcpy(dp, sp, 2);\n\t\t\t\t} else {\n\t\t\t\t\tw = (sp[1] << 8) | sp[0];\n\t\t\t\t\t*((uint16_t *)dp) = w;\n\t\t\t\t}\n\t\t\t\tsp += 2;\n\t\t\t\tdp += 2;\n\t\t\t\tbreak;\n\t\t\tcase 'd':\t/* 32-bit word, convert from little endian to CPU */\n\t\t\t\tdp += ((uintptr_t)dp & 1);\t/* Align to word boundary */\n\n\t\t\t\tif (host_endian) {\n\t\t\t\t\tmemcpy(dp, sp, 4);\n\t\t\t\t} else {\n\t\t\t\t\td = (sp[3] << 24) | (sp[2] << 16) |\n\t\t\t\t\t\t(sp[1] << 8) | sp[0];\n\t\t\t\t\t*((uint32_t *)dp) = d;\n\t\t\t\t}\n\t\t\t\tsp += 4;\n\t\t\t\tdp += 4;\n\t\t\t\tbreak;\n\t\t\tcase 'u':\t/* 16 byte UUID */\n\t\t\t\tmemcpy(dp, sp, 16);\n\t\t\t\tsp += 16;\n\t\t\t\tdp += 16;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn (int) (sp - source);\n}\n\nstatic void clear_endpoint(struct libusb_endpoint_descriptor *endpoint)\n{\n\tfree((void *) endpoint->extra);\n}\n\nstatic int parse_endpoint(struct libusb_context *ctx,\n\tstruct libusb_endpoint_descriptor *endpoint, unsigned char *buffer,\n\tint size, int host_endian)\n{\n\tstruct usb_descriptor_header header;\n\tunsigned char *extra;\n\tunsigned char *begin;\n\tint parsed = 0;\n\tint len;\n\n\tif (size < DESC_HEADER_LENGTH) {\n\t\tusbi_err(ctx, \"short endpoint descriptor read %d/%d\",\n\t\t\t size, DESC_HEADER_LENGTH);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusbi_parse_descriptor(buffer, \"bb\", &header, 0);\n\tif (header.bDescriptorType != LIBUSB_DT_ENDPOINT) {\n\t\tusbi_err(ctx, \"unexpected descriptor %x (expected %x)\",\n\t\t\theader.bDescriptorType, LIBUSB_DT_ENDPOINT);\n\t\treturn parsed;\n\t}\n\tif (header.bLength > size) {\n\t\tusbi_warn(ctx, \"short endpoint descriptor read %d/%d\",\n\t\t\t  size, header.bLength);\n\t\treturn parsed;\n\t}\n\tif (header.bLength >= ENDPOINT_AUDIO_DESC_LENGTH)\n\t\tusbi_parse_descriptor(buffer, \"bbbbwbbb\", endpoint, host_endian);\n\telse if (header.bLength >= ENDPOINT_DESC_LENGTH)\n\t\tusbi_parse_descriptor(buffer, \"bbbbwb\", endpoint, host_endian);\n\telse {\n\t\tusbi_err(ctx, \"invalid endpoint bLength (%d)\", header.bLength);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tbuffer += header.bLength;\n\tsize -= header.bLength;\n\tparsed += header.bLength;\n\n\t/* Skip over the rest of the Class Specific or Vendor Specific */\n\t/*  descriptors */\n\tbegin = buffer;\n\twhile (size >= DESC_HEADER_LENGTH) {\n\t\tusbi_parse_descriptor(buffer, \"bb\", &header, 0);\n\t\tif (header.bLength < DESC_HEADER_LENGTH) {\n\t\t\tusbi_err(ctx, \"invalid extra ep desc len (%d)\",\n\t\t\t\t header.bLength);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t} else if (header.bLength > size) {\n\t\t\tusbi_warn(ctx, \"short extra ep desc read %d/%d\",\n\t\t\t\t  size, header.bLength);\n\t\t\treturn parsed;\n\t\t}\n\n\t\t/* If we find another \"proper\" descriptor then we're done  */\n\t\tif ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) ||\n\t\t\t\t(header.bDescriptorType == LIBUSB_DT_INTERFACE) ||\n\t\t\t\t(header.bDescriptorType == LIBUSB_DT_CONFIG) ||\n\t\t\t\t(header.bDescriptorType == LIBUSB_DT_DEVICE))\n\t\t\tbreak;\n\n\t\tusbi_dbg(\"skipping descriptor %x\", header.bDescriptorType);\n\t\tbuffer += header.bLength;\n\t\tsize -= header.bLength;\n\t\tparsed += header.bLength;\n\t}\n\n\t/* Copy any unknown descriptors into a storage area for drivers */\n\t/*  to later parse */\n\tlen = (int)(buffer - begin);\n\tif (!len) {\n\t\tendpoint->extra = NULL;\n\t\tendpoint->extra_length = 0;\n\t\treturn parsed;\n\t}\n\n\textra = malloc(len);\n\tendpoint->extra = extra;\n\tif (!extra) {\n\t\tendpoint->extra_length = 0;\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\tmemcpy(extra, begin, len);\n\tendpoint->extra_length = len;\n\n\treturn parsed;\n}\n\nstatic void clear_interface(struct libusb_interface *usb_interface)\n{\n\tint i;\n\tint j;\n\n\tif (usb_interface->altsetting) {\n\t\tfor (i = 0; i < usb_interface->num_altsetting; i++) {\n\t\t\tstruct libusb_interface_descriptor *ifp =\n\t\t\t\t(struct libusb_interface_descriptor *)\n\t\t\t\tusb_interface->altsetting + i;\n\t\t\tfree((void *) ifp->extra);\n\t\t\tif (ifp->endpoint) {\n\t\t\t\tfor (j = 0; j < ifp->bNumEndpoints; j++)\n\t\t\t\t\tclear_endpoint((struct libusb_endpoint_descriptor *)\n\t\t\t\t\t\t       ifp->endpoint + j);\n\t\t\t}\n\t\t\tfree((void *) ifp->endpoint);\n\t\t}\n\t}\n\tfree((void *) usb_interface->altsetting);\n\tusb_interface->altsetting = NULL;\n}\n\nstatic int parse_interface(libusb_context *ctx,\n\tstruct libusb_interface *usb_interface, unsigned char *buffer, int size,\n\tint host_endian)\n{\n\tint i;\n\tint len;\n\tint r;\n\tint parsed = 0;\n\tint interface_number = -1;\n\tstruct usb_descriptor_header header;\n\tstruct libusb_interface_descriptor *ifp;\n\tunsigned char *begin;\n\n\tusb_interface->num_altsetting = 0;\n\n\twhile (size >= INTERFACE_DESC_LENGTH) {\n\t\tstruct libusb_interface_descriptor *altsetting =\n\t\t\t(struct libusb_interface_descriptor *) usb_interface->altsetting;\n\t\taltsetting = usbi_reallocf(altsetting,\n\t\t\tsizeof(struct libusb_interface_descriptor) *\n\t\t\t(usb_interface->num_altsetting + 1));\n\t\tif (!altsetting) {\n\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\tgoto err;\n\t\t}\n\t\tusb_interface->altsetting = altsetting;\n\n\t\tifp = altsetting + usb_interface->num_altsetting;\n\t\tusbi_parse_descriptor(buffer, \"bbbbbbbbb\", ifp, 0);\n\t\tif (ifp->bDescriptorType != LIBUSB_DT_INTERFACE) {\n\t\t\tusbi_err(ctx, \"unexpected descriptor %x (expected %x)\",\n\t\t\t\t ifp->bDescriptorType, LIBUSB_DT_INTERFACE);\n\t\t\treturn parsed;\n\t\t}\n\t\tif (ifp->bLength < INTERFACE_DESC_LENGTH) {\n\t\t\tusbi_err(ctx, \"invalid interface bLength (%d)\",\n\t\t\t\t ifp->bLength);\n\t\t\tr = LIBUSB_ERROR_IO;\n\t\t\tgoto err;\n\t\t}\n\t\tif (ifp->bLength > size) {\n\t\t\tusbi_warn(ctx, \"short intf descriptor read %d/%d\",\n\t\t\t\t size, ifp->bLength);\n\t\t\treturn parsed;\n\t\t}\n\t\tif (ifp->bNumEndpoints > USB_MAXENDPOINTS) {\n\t\t\tusbi_err(ctx, \"too many endpoints (%d)\", ifp->bNumEndpoints);\n\t\t\tr = LIBUSB_ERROR_IO;\n\t\t\tgoto err;\n\t\t}\n\n\t\tusb_interface->num_altsetting++;\n\t\tifp->extra = NULL;\n\t\tifp->extra_length = 0;\n\t\tifp->endpoint = NULL;\n\n\t\tif (interface_number == -1)\n\t\t\tinterface_number = ifp->bInterfaceNumber;\n\n\t\t/* Skip over the interface */\n\t\tbuffer += ifp->bLength;\n\t\tparsed += ifp->bLength;\n\t\tsize -= ifp->bLength;\n\n\t\tbegin = buffer;\n\n\t\t/* Skip over any interface, class or vendor descriptors */\n\t\twhile (size >= DESC_HEADER_LENGTH) {\n\t\t\tusbi_parse_descriptor(buffer, \"bb\", &header, 0);\n\t\t\tif (header.bLength < DESC_HEADER_LENGTH) {\n\t\t\t\tusbi_err(ctx,\n\t\t\t\t\t \"invalid extra intf desc len (%d)\",\n\t\t\t\t\t header.bLength);\n\t\t\t\tr = LIBUSB_ERROR_IO;\n\t\t\t\tgoto err;\n\t\t\t} else if (header.bLength > size) {\n\t\t\t\tusbi_warn(ctx,\n\t\t\t\t\t  \"short extra intf desc read %d/%d\",\n\t\t\t\t\t  size, header.bLength);\n\t\t\t\treturn parsed;\n\t\t\t}\n\n\t\t\t/* If we find another \"proper\" descriptor then we're done */\n\t\t\tif ((header.bDescriptorType == LIBUSB_DT_INTERFACE) ||\n\t\t\t\t\t(header.bDescriptorType == LIBUSB_DT_ENDPOINT) ||\n\t\t\t\t\t(header.bDescriptorType == LIBUSB_DT_CONFIG) ||\n\t\t\t\t\t(header.bDescriptorType == LIBUSB_DT_DEVICE))\n\t\t\t\tbreak;\n\n\t\t\tbuffer += header.bLength;\n\t\t\tparsed += header.bLength;\n\t\t\tsize -= header.bLength;\n\t\t}\n\n\t\t/* Copy any unknown descriptors into a storage area for */\n\t\t/*  drivers to later parse */\n\t\tlen = (int)(buffer - begin);\n\t\tif (len) {\n\t\t\tifp->extra = malloc(len);\n\t\t\tif (!ifp->extra) {\n\t\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tmemcpy((unsigned char *) ifp->extra, begin, len);\n\t\t\tifp->extra_length = len;\n\t\t}\n\n\t\tif (ifp->bNumEndpoints > 0) {\n\t\t\tstruct libusb_endpoint_descriptor *endpoint;\n\t\t\tendpoint = calloc(ifp->bNumEndpoints, sizeof(struct libusb_endpoint_descriptor));\n\t\t\tifp->endpoint = endpoint;\n\t\t\tif (!endpoint) {\n\t\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\t\tgoto err;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < ifp->bNumEndpoints; i++) {\n\t\t\t\tr = parse_endpoint(ctx, endpoint + i, buffer, size,\n\t\t\t\t\thost_endian);\n\t\t\t\tif (r < 0)\n\t\t\t\t\tgoto err;\n\t\t\t\tif (r == 0) {\n\t\t\t\t\tifp->bNumEndpoints = (uint8_t)i;\n\t\t\t\t\tbreak;;\n\t\t\t\t}\n\n\t\t\t\tbuffer += r;\n\t\t\t\tparsed += r;\n\t\t\t\tsize -= r;\n\t\t\t}\n\t\t}\n\n\t\t/* We check to see if it's an alternate to this one */\n\t\tifp = (struct libusb_interface_descriptor *) buffer;\n\t\tif (size < LIBUSB_DT_INTERFACE_SIZE ||\n\t\t\t\tifp->bDescriptorType != LIBUSB_DT_INTERFACE ||\n\t\t\t\tifp->bInterfaceNumber != interface_number)\n\t\t\treturn parsed;\n\t}\n\n\treturn parsed;\nerr:\n\tclear_interface(usb_interface);\n\treturn r;\n}\n\nstatic void clear_configuration(struct libusb_config_descriptor *config)\n{\n\tint i;\n\tif (config->interface) {\n\t\tfor (i = 0; i < config->bNumInterfaces; i++)\n\t\t\tclear_interface((struct libusb_interface *)\n\t\t\t\t\tconfig->interface + i);\n\t}\n\tfree((void *) config->interface);\n\tfree((void *) config->extra);\n}\n\nstatic int parse_configuration(struct libusb_context *ctx,\n\tstruct libusb_config_descriptor *config, unsigned char *buffer,\n\tint size, int host_endian)\n{\n\tint i;\n\tint r;\n\tstruct usb_descriptor_header header;\n\tstruct libusb_interface *usb_interface;\n\n\tif (size < LIBUSB_DT_CONFIG_SIZE) {\n\t\tusbi_err(ctx, \"short config descriptor read %d/%d\",\n\t\t\t size, LIBUSB_DT_CONFIG_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusbi_parse_descriptor(buffer, \"bbwbbbbb\", config, host_endian);\n\tif (config->bDescriptorType != LIBUSB_DT_CONFIG) {\n\t\tusbi_err(ctx, \"unexpected descriptor %x (expected %x)\",\n\t\t\t config->bDescriptorType, LIBUSB_DT_CONFIG);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\tif (config->bLength < LIBUSB_DT_CONFIG_SIZE) {\n\t\tusbi_err(ctx, \"invalid config bLength (%d)\", config->bLength);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\tif (config->bLength > size) {\n\t\tusbi_err(ctx, \"short config descriptor read %d/%d\",\n\t\t\t size, config->bLength);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\tif (config->bNumInterfaces > USB_MAXINTERFACES) {\n\t\tusbi_err(ctx, \"too many interfaces (%d)\", config->bNumInterfaces);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusb_interface = calloc(config->bNumInterfaces, sizeof(struct libusb_interface));\n\tconfig->interface = usb_interface;\n\tif (!usb_interface)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tbuffer += config->bLength;\n\tsize -= config->bLength;\n\n\tconfig->extra = NULL;\n\tconfig->extra_length = 0;\n\n\tfor (i = 0; i < config->bNumInterfaces; i++) {\n\t\tint len;\n\t\tunsigned char *begin;\n\n\t\t/* Skip over the rest of the Class Specific or Vendor */\n\t\t/*  Specific descriptors */\n\t\tbegin = buffer;\n\t\twhile (size >= DESC_HEADER_LENGTH) {\n\t\t\tusbi_parse_descriptor(buffer, \"bb\", &header, 0);\n\n\t\t\tif (header.bLength < DESC_HEADER_LENGTH) {\n\t\t\t\tusbi_err(ctx,\n\t\t\t\t\t \"invalid extra config desc len (%d)\",\n\t\t\t\t\t header.bLength);\n\t\t\t\tr = LIBUSB_ERROR_IO;\n\t\t\t\tgoto err;\n\t\t\t} else if (header.bLength > size) {\n\t\t\t\tusbi_warn(ctx,\n\t\t\t\t\t  \"short extra config desc read %d/%d\",\n\t\t\t\t\t  size, header.bLength);\n\t\t\t\tconfig->bNumInterfaces = (uint8_t)i;\n\t\t\t\treturn size;\n\t\t\t}\n\n\t\t\t/* If we find another \"proper\" descriptor then we're done */\n\t\t\tif ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) ||\n\t\t\t\t\t(header.bDescriptorType == LIBUSB_DT_INTERFACE) ||\n\t\t\t\t\t(header.bDescriptorType == LIBUSB_DT_CONFIG) ||\n\t\t\t\t\t(header.bDescriptorType == LIBUSB_DT_DEVICE))\n\t\t\t\tbreak;\n\n\t\t\tusbi_dbg(\"skipping descriptor 0x%x\", header.bDescriptorType);\n\t\t\tbuffer += header.bLength;\n\t\t\tsize -= header.bLength;\n\t\t}\n\n\t\t/* Copy any unknown descriptors into a storage area for */\n\t\t/*  drivers to later parse */\n\t\tlen = (int)(buffer - begin);\n\t\tif (len) {\n\t\t\t/* FIXME: We should realloc and append here */\n\t\t\tif (!config->extra_length) {\n\t\t\t\tconfig->extra = malloc(len);\n\t\t\t\tif (!config->extra) {\n\t\t\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\t\t\tgoto err;\n\t\t\t\t}\n\n\t\t\t\tmemcpy((unsigned char *) config->extra, begin, len);\n\t\t\t\tconfig->extra_length = len;\n\t\t\t}\n\t\t}\n\n\t\tr = parse_interface(ctx, usb_interface + i, buffer, size, host_endian);\n\t\tif (r < 0)\n\t\t\tgoto err;\n\t\tif (r == 0) {\n\t\t\tconfig->bNumInterfaces = (uint8_t)i;\n\t\t\tbreak;\n\t\t}\n\n\t\tbuffer += r;\n\t\tsize -= r;\n\t}\n\n\treturn size;\n\nerr:\n\tclear_configuration(config);\n\treturn r;\n}\n\nstatic int raw_desc_to_config(struct libusb_context *ctx,\n\tunsigned char *buf, int size, int host_endian,\n\tstruct libusb_config_descriptor **config)\n{\n\tstruct libusb_config_descriptor *_config = malloc(sizeof(*_config));\n\tint r;\n\t\n\tif (!_config)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tr = parse_configuration(ctx, _config, buf, size, host_endian);\n\tif (r < 0) {\n\t\tusbi_err(ctx, \"parse_configuration failed with error %d\", r);\n\t\tfree(_config);\n\t\treturn r;\n\t} else if (r > 0) {\n\t\tusbi_warn(ctx, \"still %d bytes of descriptor data left\", r);\n\t}\n\t\n\t*config = _config;\n\treturn LIBUSB_SUCCESS;\n}\n\nint usbi_device_cache_descriptor(libusb_device *dev)\n{\n\tint r, host_endian = 0;\n\n\tr = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor,\n\t\t\t\t\t\t&host_endian);\n\tif (r < 0)\n\t\treturn r;\n\n\tif (!host_endian) {\n\t\tdev->device_descriptor.bcdUSB = libusb_le16_to_cpu(dev->device_descriptor.bcdUSB);\n\t\tdev->device_descriptor.idVendor = libusb_le16_to_cpu(dev->device_descriptor.idVendor);\n\t\tdev->device_descriptor.idProduct = libusb_le16_to_cpu(dev->device_descriptor.idProduct);\n\t\tdev->device_descriptor.bcdDevice = libusb_le16_to_cpu(dev->device_descriptor.bcdDevice);\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/** \\ingroup libusb_desc\n * Get the USB device descriptor for a given device.\n *\n * This is a non-blocking function; the device descriptor is cached in memory.\n *\n * Note since libusb-1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102, this\n * function always succeeds.\n *\n * \\param dev the device\n * \\param desc output location for the descriptor data\n * \\returns 0 on success or a LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_get_device_descriptor(libusb_device *dev,\n\tstruct libusb_device_descriptor *desc)\n{\n\tusbi_dbg(\"\");\n\tmemcpy((unsigned char *) desc, (unsigned char *) &dev->device_descriptor,\n\t       sizeof (dev->device_descriptor));\n\treturn 0;\n}\n\n/** \\ingroup libusb_desc\n * Get the USB configuration descriptor for the currently active configuration.\n * This is a non-blocking function which does not involve any requests being\n * sent to the device.\n *\n * \\param dev a device\n * \\param config output location for the USB configuration descriptor. Only\n * valid if 0 was returned. Must be freed with libusb_free_config_descriptor()\n * after use.\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state\n * \\returns another LIBUSB_ERROR code on error\n * \\see libusb_get_config_descriptor\n */\nint API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev,\n\tstruct libusb_config_descriptor **config)\n{\n\tstruct libusb_config_descriptor _config;\n\tunsigned char tmp[LIBUSB_DT_CONFIG_SIZE];\n\tunsigned char *buf = NULL;\n\tint host_endian = 0;\n\tint r;\n\n\tr = usbi_backend->get_active_config_descriptor(dev, tmp,\n\t\tLIBUSB_DT_CONFIG_SIZE, &host_endian);\n\tif (r < 0)\n\t\treturn r;\n\tif (r < LIBUSB_DT_CONFIG_SIZE) {\n\t\tusbi_err(dev->ctx, \"short config descriptor read %d/%d\",\n\t\t\t r, LIBUSB_DT_CONFIG_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusbi_parse_descriptor(tmp, \"bbw\", &_config, host_endian);\n\tbuf = malloc(_config.wTotalLength);\n\tif (!buf)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tr = usbi_backend->get_active_config_descriptor(dev, buf,\n\t\t_config.wTotalLength, &host_endian);\n\tif (r >= 0)\n\t\tr = raw_desc_to_config(dev->ctx, buf, r, host_endian, config);\n\n\tfree(buf);\n\treturn r;\n}\n\n/** \\ingroup libusb_desc\n * Get a USB configuration descriptor based on its index.\n * This is a non-blocking function which does not involve any requests being\n * sent to the device.\n *\n * \\param dev a device\n * \\param config_index the index of the configuration you wish to retrieve\n * \\param config output location for the USB configuration descriptor. Only\n * valid if 0 was returned. Must be freed with libusb_free_config_descriptor()\n * after use.\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist\n * \\returns another LIBUSB_ERROR code on error\n * \\see libusb_get_active_config_descriptor()\n * \\see libusb_get_config_descriptor_by_value()\n */\nint API_EXPORTED libusb_get_config_descriptor(libusb_device *dev,\n\tuint8_t config_index, struct libusb_config_descriptor **config)\n{\n\tstruct libusb_config_descriptor _config;\n\tunsigned char tmp[LIBUSB_DT_CONFIG_SIZE];\n\tunsigned char *buf = NULL;\n\tint host_endian = 0;\n\tint r;\n\n\tusbi_dbg(\"index %d\", config_index);\n\tif (config_index >= dev->num_configurations)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tr = usbi_backend->get_config_descriptor(dev, config_index, tmp,\n\t\tLIBUSB_DT_CONFIG_SIZE, &host_endian);\n\tif (r < 0)\n\t\treturn r;\n\tif (r < LIBUSB_DT_CONFIG_SIZE) {\n\t\tusbi_err(dev->ctx, \"short config descriptor read %d/%d\",\n\t\t\t r, LIBUSB_DT_CONFIG_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusbi_parse_descriptor(tmp, \"bbw\", &_config, host_endian);\n\tbuf = malloc(_config.wTotalLength);\n\tif (!buf)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tr = usbi_backend->get_config_descriptor(dev, config_index, buf,\n\t\t_config.wTotalLength, &host_endian);\n\tif (r >= 0)\n\t\tr = raw_desc_to_config(dev->ctx, buf, r, host_endian, config);\n\n\tfree(buf);\n\treturn r;\n}\n\n/* iterate through all configurations, returning the index of the configuration\n * matching a specific bConfigurationValue in the idx output parameter, or -1\n * if the config was not found.\n * returns 0 on success or a LIBUSB_ERROR code\n */\nint usbi_get_config_index_by_value(struct libusb_device *dev,\n\tuint8_t bConfigurationValue, int *idx)\n{\n\tuint8_t i;\n\n\tusbi_dbg(\"value %d\", bConfigurationValue);\n\tfor (i = 0; i < dev->num_configurations; i++) {\n\t\tunsigned char tmp[6];\n\t\tint host_endian;\n\t\tint r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp),\n\t\t\t&host_endian);\n\t\tif (r < 0) {\n\t\t\t*idx = -1;\n\t\t\treturn r;\n\t\t}\n\t\tif (tmp[5] == bConfigurationValue) {\n\t\t\t*idx = i;\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t*idx = -1;\n\treturn 0;\n}\n\n/** \\ingroup libusb_desc\n * Get a USB configuration descriptor with a specific bConfigurationValue.\n * This is a non-blocking function which does not involve any requests being\n * sent to the device.\n *\n * \\param dev a device\n * \\param bConfigurationValue the bConfigurationValue of the configuration you\n * wish to retrieve\n * \\param config output location for the USB configuration descriptor. Only\n * valid if 0 was returned. Must be freed with libusb_free_config_descriptor()\n * after use.\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist\n * \\returns another LIBUSB_ERROR code on error\n * \\see libusb_get_active_config_descriptor()\n * \\see libusb_get_config_descriptor()\n */\nint API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev,\n\tuint8_t bConfigurationValue, struct libusb_config_descriptor **config)\n{\n\tint r, idx, host_endian;\n\tunsigned char *buf = NULL;\n\n\tif (usbi_backend->get_config_descriptor_by_value) {\n\t\tr = usbi_backend->get_config_descriptor_by_value(dev,\n\t\t\tbConfigurationValue, &buf, &host_endian);\n\t\tif (r < 0)\n\t\t\treturn r;\n\t\treturn raw_desc_to_config(dev->ctx, buf, r, host_endian, config);\n\t}\n\n\tr = usbi_get_config_index_by_value(dev, bConfigurationValue, &idx);\n\tif (r < 0)\n\t\treturn r;\n\telse if (idx == -1)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\telse\n\t\treturn libusb_get_config_descriptor(dev, (uint8_t) idx, config);\n}\n\n/** \\ingroup libusb_desc\n * Free a configuration descriptor obtained from\n * libusb_get_active_config_descriptor() or libusb_get_config_descriptor().\n * It is safe to call this function with a NULL config parameter, in which\n * case the function simply returns.\n *\n * \\param config the configuration descriptor to free\n */\nvoid API_EXPORTED libusb_free_config_descriptor(\n\tstruct libusb_config_descriptor *config)\n{\n\tif (!config)\n\t\treturn;\n\n\tclear_configuration(config);\n\tfree(config);\n}\n\n/** \\ingroup libusb_desc\n * Get an endpoints superspeed endpoint companion descriptor (if any)\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param endpoint endpoint descriptor from which to get the superspeed\n * endpoint companion descriptor\n * \\param ep_comp output location for the superspeed endpoint companion\n * descriptor. Only valid if 0 was returned. Must be freed with\n * libusb_free_ss_endpoint_companion_descriptor() after use.\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist\n * \\returns another LIBUSB_ERROR code on error\n */\nint API_EXPORTED libusb_get_ss_endpoint_companion_descriptor(\n\tstruct libusb_context *ctx,\n\tconst struct libusb_endpoint_descriptor *endpoint,\n\tstruct libusb_ss_endpoint_companion_descriptor **ep_comp)\n{\n\tstruct usb_descriptor_header header;\n\tint size = endpoint->extra_length;\n\tconst unsigned char *buffer = endpoint->extra;\n\n\t*ep_comp = NULL;\n\n\twhile (size >= DESC_HEADER_LENGTH) {\n\t\tusbi_parse_descriptor(buffer, \"bb\", &header, 0);\n\t\tif (header.bLength < 2 || header.bLength > size) {\n\t\t\tusbi_err(ctx, \"invalid descriptor length %d\",\n\t\t\t\t header.bLength);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t\tif (header.bDescriptorType != LIBUSB_DT_SS_ENDPOINT_COMPANION) {\n\t\t\tbuffer += header.bLength;\n\t\t\tsize -= header.bLength;\n\t\t\tcontinue;\n\t\t}\n\t\tif (header.bLength < LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE) {\n\t\t\tusbi_err(ctx, \"invalid ss-ep-comp-desc length %d\",\n\t\t\t\t header.bLength);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t\t*ep_comp = malloc(sizeof(**ep_comp));\n\t\tif (*ep_comp == NULL)\n\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\t\tusbi_parse_descriptor(buffer, \"bbbbw\", *ep_comp, 0);\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\treturn LIBUSB_ERROR_NOT_FOUND;\n}\n\n/** \\ingroup libusb_desc\n * Free a superspeed endpoint companion descriptor obtained from\n * libusb_get_ss_endpoint_companion_descriptor().\n * It is safe to call this function with a NULL ep_comp parameter, in which\n * case the function simply returns.\n *\n * \\param ep_comp the superspeed endpoint companion descriptor to free\n */\nvoid API_EXPORTED libusb_free_ss_endpoint_companion_descriptor(\n\tstruct libusb_ss_endpoint_companion_descriptor *ep_comp)\n{\n\tfree(ep_comp);\n}\n\nstatic int parse_bos(struct libusb_context *ctx,\n\tstruct libusb_bos_descriptor **bos,\n\tunsigned char *buffer, int size, int host_endian)\n{\n\tstruct libusb_bos_descriptor bos_header, *_bos;\n\tstruct libusb_bos_dev_capability_descriptor dev_cap;\n\tint i;\n\n\tif (size < LIBUSB_DT_BOS_SIZE) {\n\t\tusbi_err(ctx, \"short bos descriptor read %d/%d\",\n\t\t\t size, LIBUSB_DT_BOS_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusbi_parse_descriptor(buffer, \"bbwb\", &bos_header, host_endian);\n\tif (bos_header.bDescriptorType != LIBUSB_DT_BOS) {\n\t\tusbi_err(ctx, \"unexpected descriptor %x (expected %x)\",\n\t\t\t bos_header.bDescriptorType, LIBUSB_DT_BOS);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\tif (bos_header.bLength < LIBUSB_DT_BOS_SIZE) {\n\t\tusbi_err(ctx, \"invalid bos bLength (%d)\", bos_header.bLength);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\tif (bos_header.bLength > size) {\n\t\tusbi_err(ctx, \"short bos descriptor read %d/%d\",\n\t\t\t size, bos_header.bLength);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\t_bos = calloc (1,\n\t\tsizeof(*_bos) + bos_header.bNumDeviceCaps * sizeof(void *));\n\tif (!_bos)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tusbi_parse_descriptor(buffer, \"bbwb\", _bos, host_endian);\n\tbuffer += bos_header.bLength;\n\tsize -= bos_header.bLength;\n\n\t/* Get the device capability descriptors */\n\tfor (i = 0; i < bos_header.bNumDeviceCaps; i++) {\n\t\tif (size < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) {\n\t\t\tusbi_warn(ctx, \"short dev-cap descriptor read %d/%d\",\n\t\t\t\t  size, LIBUSB_DT_DEVICE_CAPABILITY_SIZE);\n\t\t\tbreak;\n\t\t}\n\t\tusbi_parse_descriptor(buffer, \"bbb\", &dev_cap, host_endian);\n\t\tif (dev_cap.bDescriptorType != LIBUSB_DT_DEVICE_CAPABILITY) {\n\t\t\tusbi_warn(ctx, \"unexpected descriptor %x (expected %x)\",\n\t\t\t\t  dev_cap.bDescriptorType, LIBUSB_DT_DEVICE_CAPABILITY);\n\t\t\tbreak;\n\t\t}\n\t\tif (dev_cap.bLength < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) {\n\t\t\tusbi_err(ctx, \"invalid dev-cap bLength (%d)\",\n\t\t\t\t dev_cap.bLength);\n\t\t\tlibusb_free_bos_descriptor(_bos);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t\tif (dev_cap.bLength > size) {\n\t\t\tusbi_warn(ctx, \"short dev-cap descriptor read %d/%d\",\n\t\t\t\t  size, dev_cap.bLength);\n\t\t\tbreak;\n\t\t}\n\n\t\t_bos->dev_capability[i] = malloc(dev_cap.bLength);\n\t\tif (!_bos->dev_capability[i]) {\n\t\t\tlibusb_free_bos_descriptor(_bos);\n\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\t\t}\n\t\tmemcpy(_bos->dev_capability[i], buffer, dev_cap.bLength);\n\t\tbuffer += dev_cap.bLength;\n\t\tsize -= dev_cap.bLength;\n\t}\n\t_bos->bNumDeviceCaps = (uint8_t)i;\n\t*bos = _bos;\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/** \\ingroup libusb_desc\n * Get a Binary Object Store (BOS) descriptor\n * This is a BLOCKING function, which will send requests to the device.\n *\n * \\param dev_handle the handle of an open libusb device\n * \\param bos output location for the BOS descriptor. Only valid if 0 was returned.\n * Must be freed with \\ref libusb_free_bos_descriptor() after use.\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the device doesn't have a BOS descriptor\n * \\returns another LIBUSB_ERROR code on error\n */\nint API_EXPORTED libusb_get_bos_descriptor(libusb_device_handle *dev_handle,\n\tstruct libusb_bos_descriptor **bos)\n{\n\tstruct libusb_bos_descriptor _bos;\n\tuint8_t bos_header[LIBUSB_DT_BOS_SIZE] = {0};\n\tunsigned char *bos_data = NULL;\n\tconst int host_endian = 0;\n\tint r;\n\n\t/* Read the BOS. This generates 2 requests on the bus,\n\t * one for the header, and one for the full BOS */\n\tr = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_header,\n\t\t\t\t  LIBUSB_DT_BOS_SIZE);\n\tif (r < 0) {\n\t\tif (r != LIBUSB_ERROR_PIPE)\n\t\t\tusbi_err(HANDLE_CTX(dev_handle), \"failed to read BOS (%d)\", r);\n\t\treturn r;\n\t}\n\tif (r < LIBUSB_DT_BOS_SIZE) {\n\t\tusbi_err(HANDLE_CTX(dev_handle), \"short BOS read %d/%d\",\n\t\t\t r, LIBUSB_DT_BOS_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusbi_parse_descriptor(bos_header, \"bbwb\", &_bos, host_endian);\n\tusbi_dbg(\"found BOS descriptor: size %d bytes, %d capabilities\",\n\t\t _bos.wTotalLength, _bos.bNumDeviceCaps);\n\tbos_data = calloc(_bos.wTotalLength, 1);\n\tif (bos_data == NULL)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tr = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_data,\n\t\t\t\t  _bos.wTotalLength);\n\tif (r >= 0)\n\t\tr = parse_bos(HANDLE_CTX(dev_handle), bos, bos_data, r, host_endian);\n\telse\n\t\tusbi_err(HANDLE_CTX(dev_handle), \"failed to read BOS (%d)\", r);\n\n\tfree(bos_data);\n\treturn r;\n}\n\n/** \\ingroup libusb_desc\n * Free a BOS descriptor obtained from libusb_get_bos_descriptor().\n * It is safe to call this function with a NULL bos parameter, in which\n * case the function simply returns.\n *\n * \\param bos the BOS descriptor to free\n */\nvoid API_EXPORTED libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos)\n{\n\tint i;\n\n\tif (!bos)\n\t\treturn;\n\n\tfor (i = 0; i < bos->bNumDeviceCaps; i++)\n\t\tfree(bos->dev_capability[i]);\n\tfree(bos);\n}\n\n/** \\ingroup libusb_desc\n * Get an USB 2.0 Extension descriptor\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param dev_cap Device Capability descriptor with a bDevCapabilityType of\n * \\ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION\n * LIBUSB_BT_USB_2_0_EXTENSION\n * \\param usb_2_0_extension output location for the USB 2.0 Extension\n * descriptor. Only valid if 0 was returned. Must be freed with\n * libusb_free_usb_2_0_extension_descriptor() after use.\n * \\returns 0 on success\n * \\returns a LIBUSB_ERROR code on error\n */\nint API_EXPORTED libusb_get_usb_2_0_extension_descriptor(\n\tstruct libusb_context *ctx,\n\tstruct libusb_bos_dev_capability_descriptor *dev_cap,\n\tstruct libusb_usb_2_0_extension_descriptor **usb_2_0_extension)\n{\n\tstruct libusb_usb_2_0_extension_descriptor *_usb_2_0_extension;\n\tconst int host_endian = 0;\n\n\tif (dev_cap->bDevCapabilityType != LIBUSB_BT_USB_2_0_EXTENSION) {\n\t\tusbi_err(ctx, \"unexpected bDevCapabilityType %x (expected %x)\",\n\t\t\t dev_cap->bDevCapabilityType,\n\t\t\t LIBUSB_BT_USB_2_0_EXTENSION);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\tif (dev_cap->bLength < LIBUSB_BT_USB_2_0_EXTENSION_SIZE) {\n\t\tusbi_err(ctx, \"short dev-cap descriptor read %d/%d\",\n\t\t\t dev_cap->bLength, LIBUSB_BT_USB_2_0_EXTENSION_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\t_usb_2_0_extension = malloc(sizeof(*_usb_2_0_extension));\n\tif (!_usb_2_0_extension)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tusbi_parse_descriptor((unsigned char *)dev_cap, \"bbbd\",\n\t\t\t      _usb_2_0_extension, host_endian);\n\n\t*usb_2_0_extension = _usb_2_0_extension;\n\treturn LIBUSB_SUCCESS;\n}\n\n/** \\ingroup libusb_desc\n * Free a USB 2.0 Extension descriptor obtained from\n * libusb_get_usb_2_0_extension_descriptor().\n * It is safe to call this function with a NULL usb_2_0_extension parameter,\n * in which case the function simply returns.\n *\n * \\param usb_2_0_extension the USB 2.0 Extension descriptor to free\n */\nvoid API_EXPORTED libusb_free_usb_2_0_extension_descriptor(\n\tstruct libusb_usb_2_0_extension_descriptor *usb_2_0_extension)\n{\n\tfree(usb_2_0_extension);\n}\n\n/** \\ingroup libusb_desc\n * Get a SuperSpeed USB Device Capability descriptor\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param dev_cap Device Capability descriptor with a bDevCapabilityType of\n * \\ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY\n * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY\n * \\param ss_usb_device_cap output location for the SuperSpeed USB Device\n * Capability descriptor. Only valid if 0 was returned. Must be freed with\n * libusb_free_ss_usb_device_capability_descriptor() after use.\n * \\returns 0 on success\n * \\returns a LIBUSB_ERROR code on error\n */\nint API_EXPORTED libusb_get_ss_usb_device_capability_descriptor(\n\tstruct libusb_context *ctx,\n\tstruct libusb_bos_dev_capability_descriptor *dev_cap,\n\tstruct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap)\n{\n\tstruct libusb_ss_usb_device_capability_descriptor *_ss_usb_device_cap;\n\tconst int host_endian = 0;\n\n\tif (dev_cap->bDevCapabilityType != LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) {\n\t\tusbi_err(ctx, \"unexpected bDevCapabilityType %x (expected %x)\",\n\t\t\t dev_cap->bDevCapabilityType,\n\t\t\t LIBUSB_BT_SS_USB_DEVICE_CAPABILITY);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\tif (dev_cap->bLength < LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) {\n\t\tusbi_err(ctx, \"short dev-cap descriptor read %d/%d\",\n\t\t\t dev_cap->bLength, LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\t_ss_usb_device_cap = malloc(sizeof(*_ss_usb_device_cap));\n\tif (!_ss_usb_device_cap)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tusbi_parse_descriptor((unsigned char *)dev_cap, \"bbbbwbbw\",\n\t\t\t      _ss_usb_device_cap, host_endian);\n\n\t*ss_usb_device_cap = _ss_usb_device_cap;\n\treturn LIBUSB_SUCCESS;\n}\n\n/** \\ingroup libusb_desc\n * Free a SuperSpeed USB Device Capability descriptor obtained from\n * libusb_get_ss_usb_device_capability_descriptor().\n * It is safe to call this function with a NULL ss_usb_device_cap\n * parameter, in which case the function simply returns.\n *\n * \\param ss_usb_device_cap the USB 2.0 Extension descriptor to free\n */\nvoid API_EXPORTED libusb_free_ss_usb_device_capability_descriptor(\n\tstruct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap)\n{\n\tfree(ss_usb_device_cap);\n}\n\n/** \\ingroup libusb_desc\n * Get a Container ID descriptor\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param dev_cap Device Capability descriptor with a bDevCapabilityType of\n * \\ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID\n * LIBUSB_BT_CONTAINER_ID\n * \\param container_id output location for the Container ID descriptor.\n * Only valid if 0 was returned. Must be freed with\n * libusb_free_container_id_descriptor() after use.\n * \\returns 0 on success\n * \\returns a LIBUSB_ERROR code on error\n */\nint API_EXPORTED libusb_get_container_id_descriptor(struct libusb_context *ctx,\n\tstruct libusb_bos_dev_capability_descriptor *dev_cap,\n\tstruct libusb_container_id_descriptor **container_id)\n{\n\tstruct libusb_container_id_descriptor *_container_id;\n\tconst int host_endian = 0;\n\n\tif (dev_cap->bDevCapabilityType != LIBUSB_BT_CONTAINER_ID) {\n\t\tusbi_err(ctx, \"unexpected bDevCapabilityType %x (expected %x)\",\n\t\t\t dev_cap->bDevCapabilityType,\n\t\t\t LIBUSB_BT_CONTAINER_ID);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\tif (dev_cap->bLength < LIBUSB_BT_CONTAINER_ID_SIZE) {\n\t\tusbi_err(ctx, \"short dev-cap descriptor read %d/%d\",\n\t\t\t dev_cap->bLength, LIBUSB_BT_CONTAINER_ID_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\t_container_id = malloc(sizeof(*_container_id));\n\tif (!_container_id)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tusbi_parse_descriptor((unsigned char *)dev_cap, \"bbbbu\",\n\t\t\t      _container_id, host_endian);\n\n\t*container_id = _container_id;\n\treturn LIBUSB_SUCCESS;\n}\n\n/** \\ingroup libusb_desc\n * Free a Container ID descriptor obtained from\n * libusb_get_container_id_descriptor().\n * It is safe to call this function with a NULL container_id parameter,\n * in which case the function simply returns.\n *\n * \\param container_id the USB 2.0 Extension descriptor to free\n */\nvoid API_EXPORTED libusb_free_container_id_descriptor(\n\tstruct libusb_container_id_descriptor *container_id)\n{\n\tfree(container_id);\n}\n\n/** \\ingroup libusb_desc\n * Retrieve a string descriptor in C style ASCII.\n *\n * Wrapper around libusb_get_string_descriptor(). Uses the first language\n * supported by the device.\n *\n * \\param dev_handle a device handle\n * \\param desc_index the index of the descriptor to retrieve\n * \\param data output buffer for ASCII string descriptor\n * \\param length size of data buffer\n * \\returns number of bytes returned in data, or LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle,\n\tuint8_t desc_index, unsigned char *data, int length)\n{\n\tunsigned char tbuf[255]; /* Some devices choke on size > 255 */\n\tint r, si, di;\n\tuint16_t langid;\n\n\t/* Asking for the zero'th index is special - it returns a string\n\t * descriptor that contains all the language IDs supported by the\n\t * device. Typically there aren't many - often only one. Language\n\t * IDs are 16 bit numbers, and they start at the third byte in the\n\t * descriptor. There's also no point in trying to read descriptor 0\n\t * with this function. See USB 2.0 specification section 9.6.7 for\n\t * more information.\n\t */\n\n\tif (desc_index == 0)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tr = libusb_get_string_descriptor(dev_handle, 0, 0, tbuf, sizeof(tbuf));\n\tif (r < 0)\n\t\treturn r;\n\n\tif (r < 4)\n\t\treturn LIBUSB_ERROR_IO;\n\n\tlangid = tbuf[2] | (tbuf[3] << 8);\n\n\tr = libusb_get_string_descriptor(dev_handle, desc_index, langid, tbuf,\n\t\tsizeof(tbuf));\n\tif (r < 0)\n\t\treturn r;\n\n\tif (tbuf[1] != LIBUSB_DT_STRING)\n\t\treturn LIBUSB_ERROR_IO;\n\n\tif (tbuf[0] > r)\n\t\treturn LIBUSB_ERROR_IO;\n\n\tfor (di = 0, si = 2; si < tbuf[0]; si += 2) {\n\t\tif (di >= (length - 1))\n\t\t\tbreak;\n\n\t\tif ((tbuf[si] & 0x80) || (tbuf[si + 1])) /* non-ASCII */\n\t\t\tdata[di++] = '?';\n\t\telse\n\t\t\tdata[di++] = tbuf[si];\n\t}\n\n\tdata[di] = 0;\n\treturn di;\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/hotplug.c",
    "content": "/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */\n/*\n * Hotplug functions for libusb\n * Copyright © 2012-2013 Nathan Hjelm <hjelmn@mac.com>\n * Copyright © 2012-2013 Peter Stuge <peter@stuge.se>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifdef HAVE_SYS_TYPES_H\n#include <sys/types.h>\n#endif\n#include <assert.h>\n\n#include \"libusbi.h\"\n#include \"hotplug.h\"\n\n/**\n * @defgroup libusb_hotplug Device hotplug event notification\n * This page details how to use the libusb hotplug interface, where available.\n *\n * Be mindful that not all platforms currently implement hotplug notification and\n * that you should first call on \\ref libusb_has_capability() with parameter\n * \\ref LIBUSB_CAP_HAS_HOTPLUG to confirm that hotplug support is available.\n *\n * \\page libusb_hotplug Device hotplug event notification\n *\n * \\section hotplug_intro Introduction\n *\n * Version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102, has added support\n * for hotplug events on <b>some</b> platforms (you should test if your platform\n * supports hotplug notification by calling \\ref libusb_has_capability() with\n * parameter \\ref LIBUSB_CAP_HAS_HOTPLUG). \n *\n * This interface allows you to request notification for the arrival and departure\n * of matching USB devices.\n *\n * To receive hotplug notification you register a callback by calling\n * \\ref libusb_hotplug_register_callback(). This function will optionally return\n * a callback handle that can be passed to \\ref libusb_hotplug_deregister_callback().\n *\n * A callback function must return an int (0 or 1) indicating whether the callback is\n * expecting additional events. Returning 0 will rearm the callback and 1 will cause\n * the callback to be deregistered. Note that when callbacks are called from\n * libusb_hotplug_register_callback() because of the \\ref LIBUSB_HOTPLUG_ENUMERATE\n * flag, the callback return value is ignored, iow you cannot cause a callback\n * to be deregistered by returning 1 when it is called from\n * libusb_hotplug_register_callback().\n *\n * Callbacks for a particular context are automatically deregistered by libusb_exit().\n *\n * As of 1.0.16 there are two supported hotplug events:\n *  - LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: A device has arrived and is ready to use\n *  - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: A device has left and is no longer available\n *\n * A hotplug event can listen for either or both of these events.\n *\n * Note: If you receive notification that a device has left and you have any\n * a libusb_device_handles for the device it is up to you to call libusb_close()\n * on each device handle to free up any remaining resources associated with the device.\n * Once a device has left any libusb_device_handle associated with the device\n * are invalid and will remain so even if the device comes back.\n *\n * When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED event it is considered\n * safe to call any libusb function that takes a libusb_device. It also safe to\n * open a device and submit asynchronous transfers. However, most other functions\n * that take a libusb_device_handle are <b>not</b> safe to call. Examples of such\n * functions are any of the \\ref libusb_syncio \"synchronous API\" functions or the blocking\n * functions that retrieve various \\ref libusb_desc \"USB descriptors\". These functions must\n * be used outside of the context of the hotplug callback.\n *\n * When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT event the only safe function\n * is libusb_get_device_descriptor().\n *\n * The following code provides an example of the usage of the hotplug interface:\n\\code\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#include <libusb.h>\n\nstatic int count = 0;\n\nint hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev,\n                     libusb_hotplug_event event, void *user_data) {\n  static libusb_device_handle *dev_handle = NULL;\n  struct libusb_device_descriptor desc;\n  int rc;\n\n  (void)libusb_get_device_descriptor(dev, &desc);\n\n  if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) {\n    rc = libusb_open(dev, &dev_handle);\n    if (LIBUSB_SUCCESS != rc) {\n      printf(\"Could not open USB device\\n\");\n    }\n  } else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) {\n    if (dev_handle) {\n      libusb_close(dev_handle);\n      dev_handle = NULL;\n    }\n  } else {\n    printf(\"Unhandled event %d\\n\", event);\n  }\n  count++;\n\n  return 0;\n}\n\nint main (void) {\n  libusb_hotplug_callback_handle callback_handle;\n  int rc;\n\n  libusb_init(NULL);\n\n  rc = libusb_hotplug_register_callback(NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |\n                                        LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, 0x045a, 0x5005,\n                                        LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL,\n                                        &callback_handle);\n  if (LIBUSB_SUCCESS != rc) {\n    printf(\"Error creating a hotplug callback\\n\");\n    libusb_exit(NULL);\n    return EXIT_FAILURE;\n  }\n\n  while (count < 2) {\n    libusb_handle_events_completed(NULL, NULL);\n    nanosleep(&(struct timespec){0, 10000000UL}, NULL);\n  }\n\n  libusb_hotplug_deregister_callback(NULL, callback_handle);\n  libusb_exit(NULL);\n\n  return 0;\n}\n\\endcode\n */\n\nstatic int usbi_hotplug_match_cb (struct libusb_context *ctx,\n\tstruct libusb_device *dev, libusb_hotplug_event event,\n\tstruct libusb_hotplug_callback *hotplug_cb)\n{\n\t/* Handle lazy deregistration of callback */\n\tif (hotplug_cb->needs_free) {\n\t\t/* Free callback */\n\t\treturn 1;\n\t}\n\n\tif (!(hotplug_cb->events & event)) {\n\t\treturn 0;\n\t}\n\n\tif (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->vendor_id &&\n\t    hotplug_cb->vendor_id != dev->device_descriptor.idVendor) {\n\t\treturn 0;\n\t}\n\n\tif (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->product_id &&\n\t    hotplug_cb->product_id != dev->device_descriptor.idProduct) {\n\t\treturn 0;\n\t}\n\n\tif (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->dev_class &&\n\t    hotplug_cb->dev_class != dev->device_descriptor.bDeviceClass) {\n\t\treturn 0;\n\t}\n\n\treturn hotplug_cb->cb (ctx, dev, event, hotplug_cb->user_data);\n}\n\nvoid usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev,\n\tlibusb_hotplug_event event)\n{\n\tstruct libusb_hotplug_callback *hotplug_cb, *next;\n\tint ret;\n\n\tusbi_mutex_lock(&ctx->hotplug_cbs_lock);\n\n\tlist_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) {\n\t\tusbi_mutex_unlock(&ctx->hotplug_cbs_lock);\n\t\tret = usbi_hotplug_match_cb (ctx, dev, event, hotplug_cb);\n\t\tusbi_mutex_lock(&ctx->hotplug_cbs_lock);\n\n\t\tif (ret) {\n\t\t\tlist_del(&hotplug_cb->list);\n\t\t\tfree(hotplug_cb);\n\t\t}\n\t}\n\n\tusbi_mutex_unlock(&ctx->hotplug_cbs_lock);\n\n\t/* the backend is expected to call the callback for each active transfer */\n}\n\nvoid usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev,\n\tlibusb_hotplug_event event)\n{\n\tint pending_events;\n\tlibusb_hotplug_message *message = calloc(1, sizeof(*message));\n\n\tif (!message) {\n\t\tusbi_err(ctx, \"error allocating hotplug message\");\n\t\treturn;\n\t}\n\n\tmessage->event = event;\n\tmessage->device = dev;\n\n\t/* Take the event data lock and add this message to the list.\n\t * Only signal an event if there are no prior pending events. */\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tpending_events = usbi_pending_events(ctx);\n\tlist_add_tail(&message->list, &ctx->hotplug_msgs);\n\tif (!pending_events)\n\t\tusbi_signal_event(ctx);\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n}\n\nint API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx,\n\tlibusb_hotplug_event events, libusb_hotplug_flag flags,\n\tint vendor_id, int product_id, int dev_class,\n\tlibusb_hotplug_callback_fn cb_fn, void *user_data,\n\tlibusb_hotplug_callback_handle *callback_handle)\n{\n\tlibusb_hotplug_callback *new_callback;\n\tstatic int handle_id = 1;\n\n\t/* check for hotplug support */\n\tif (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\t}\n\n\t/* check for sane values */\n\tif ((LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) ||\n\t    (LIBUSB_HOTPLUG_MATCH_ANY != product_id && (~0xffff & product_id)) ||\n\t    (LIBUSB_HOTPLUG_MATCH_ANY != dev_class && (~0xff & dev_class)) ||\n\t    !cb_fn) {\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\tUSBI_GET_CONTEXT(ctx);\n\n\tnew_callback = (libusb_hotplug_callback *)calloc(1, sizeof (*new_callback));\n\tif (!new_callback) {\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\tnew_callback->ctx = ctx;\n\tnew_callback->vendor_id = vendor_id;\n\tnew_callback->product_id = product_id;\n\tnew_callback->dev_class = dev_class;\n\tnew_callback->flags = flags;\n\tnew_callback->events = events;\n\tnew_callback->cb = cb_fn;\n\tnew_callback->user_data = user_data;\n\tnew_callback->needs_free = 0;\n\n\tusbi_mutex_lock(&ctx->hotplug_cbs_lock);\n\n\t/* protect the handle by the context hotplug lock. it doesn't matter if the same handle\n\t * is used for different contexts only that the handle is unique for this context */\n\tnew_callback->handle = handle_id++;\n\n\tlist_add(&new_callback->list, &ctx->hotplug_cbs);\n\n\tusbi_mutex_unlock(&ctx->hotplug_cbs_lock);\n\n\n\tif (flags & LIBUSB_HOTPLUG_ENUMERATE) {\n\t\tint i, len;\n\t\tstruct libusb_device **devs;\n\n\t\tlen = (int) libusb_get_device_list(ctx, &devs);\n\t\tif (len < 0) {\n\t\t\tlibusb_hotplug_deregister_callback(ctx,\n\t\t\t\t\t\t\tnew_callback->handle);\n\t\t\treturn len;\n\t\t}\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tusbi_hotplug_match_cb(ctx, devs[i],\n\t\t\t\t\tLIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED,\n\t\t\t\t\tnew_callback);\n\t\t}\n\n\t\tlibusb_free_device_list(devs, 1);\n\t}\n\n\n\tif (callback_handle)\n\t\t*callback_handle = new_callback->handle;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nvoid API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx,\n\tlibusb_hotplug_callback_handle callback_handle)\n{\n\tstruct libusb_hotplug_callback *hotplug_cb;\n\n\t/* check for hotplug support */\n\tif (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {\n\t\treturn;\n\t}\n\n\tUSBI_GET_CONTEXT(ctx);\n\n\tusbi_mutex_lock(&ctx->hotplug_cbs_lock);\n\tlist_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list,\n\t\t\t    struct libusb_hotplug_callback) {\n\t\tif (callback_handle == hotplug_cb->handle) {\n\t\t\t/* Mark this callback for deregistration */\n\t\t\thotplug_cb->needs_free = 1;\n\t\t}\n\t}\n\tusbi_mutex_unlock(&ctx->hotplug_cbs_lock);\n\n\tusbi_hotplug_notification(ctx, NULL, 0);\n}\n\nvoid usbi_hotplug_deregister_all(struct libusb_context *ctx) {\n\tstruct libusb_hotplug_callback *hotplug_cb, *next;\n\n\tusbi_mutex_lock(&ctx->hotplug_cbs_lock);\n\tlist_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list,\n\t\t\t\t struct libusb_hotplug_callback) {\n\t\tlist_del(&hotplug_cb->list);\n\t\tfree(hotplug_cb);\n\t}\n\n\tusbi_mutex_unlock(&ctx->hotplug_cbs_lock);\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/hotplug.h",
    "content": "/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */\n/*\n * Hotplug support for libusb\n * Copyright © 2012-2013 Nathan Hjelm <hjelmn@mac.com>\n * Copyright © 2012-2013 Peter Stuge <peter@stuge.se>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#if !defined(USBI_HOTPLUG_H)\n#define USBI_HOTPLUG_H\n\n#ifndef LIBUSBI_H\n#include \"libusbi.h\"\n#endif\n\n/** \\ingroup hotplug\n * The hotplug callback structure. The user populates this structure with\n * libusb_hotplug_prepare_callback() and then calls libusb_hotplug_register_callback()\n * to receive notification of hotplug events.\n */\nstruct libusb_hotplug_callback {\n\t/** Context this callback is associated with */\n\tstruct libusb_context *ctx;\n\n\t/** Vendor ID to match or LIBUSB_HOTPLUG_MATCH_ANY */\n\tint vendor_id;\n\n\t/** Product ID to match or LIBUSB_HOTPLUG_MATCH_ANY */\n\tint product_id;\n\n\t/** Device class to match or LIBUSB_HOTPLUG_MATCH_ANY */\n\tint dev_class;\n\n\t/** Hotplug callback flags */\n\tlibusb_hotplug_flag flags;\n\n\t/** Event(s) that will trigger this callback */\n\tlibusb_hotplug_event events;\n\n\t/** Callback function to invoke for matching event/device */\n\tlibusb_hotplug_callback_fn cb;\n\n\t/** Handle for this callback (used to match on deregister) */\n\tlibusb_hotplug_callback_handle handle;\n\n\t/** User data that will be passed to the callback function */\n\tvoid *user_data;\n\n\t/** Callback is marked for deletion */\n\tint needs_free;\n\n\t/** List this callback is registered in (ctx->hotplug_cbs) */\n\tstruct list_head list;\n};\n\ntypedef struct libusb_hotplug_callback libusb_hotplug_callback;\n\nstruct libusb_hotplug_message {\n\t/** The hotplug event that occurred */\n\tlibusb_hotplug_event event;\n\n\t/** The device for which this hotplug event occurred */\n\tstruct libusb_device *device;\n\n\t/** List this message is contained in (ctx->hotplug_msgs) */\n\tstruct list_head list;\n};\n\ntypedef struct libusb_hotplug_message libusb_hotplug_message;\n\nvoid usbi_hotplug_deregister_all(struct libusb_context *ctx);\nvoid usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev,\n\t\t\tlibusb_hotplug_event event);\nvoid usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev,\n\t\t\tlibusb_hotplug_event event);\n\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/io.c",
    "content": "/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */\n/*\n * I/O functions for libusb\n * Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org>\n * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <assert.h>\n#include <errno.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#ifdef USBI_TIMERFD_AVAILABLE\n#include <sys/timerfd.h>\n#endif\n\n#include \"libusbi.h\"\n#include \"hotplug.h\"\n\n/**\n * \\page libusb_io Synchronous and asynchronous device I/O\n *\n * \\section io_intro Introduction\n *\n * If you're using libusb in your application, you're probably wanting to\n * perform I/O with devices - you want to perform USB data transfers.\n *\n * libusb offers two separate interfaces for device I/O. This page aims to\n * introduce the two in order to help you decide which one is more suitable\n * for your application. You can also choose to use both interfaces in your\n * application by considering each transfer on a case-by-case basis.\n *\n * Once you have read through the following discussion, you should consult the\n * detailed API documentation pages for the details:\n * - \\ref libusb_syncio\n * - \\ref libusb_asyncio\n *\n * \\section theory Transfers at a logical level\n *\n * At a logical level, USB transfers typically happen in two parts. For\n * example, when reading data from a endpoint:\n * -# A request for data is sent to the device\n * -# Some time later, the incoming data is received by the host\n *\n * or when writing data to an endpoint:\n *\n * -# The data is sent to the device\n * -# Some time later, the host receives acknowledgement from the device that\n *    the data has been transferred.\n *\n * There may be an indefinite delay between the two steps. Consider a\n * fictional USB input device with a button that the user can press. In order\n * to determine when the button is pressed, you would likely submit a request\n * to read data on a bulk or interrupt endpoint and wait for data to arrive.\n * Data will arrive when the button is pressed by the user, which is\n * potentially hours later.\n *\n * libusb offers both a synchronous and an asynchronous interface to performing\n * USB transfers. The main difference is that the synchronous interface\n * combines both steps indicated above into a single function call, whereas\n * the asynchronous interface separates them.\n *\n * \\section sync The synchronous interface\n *\n * The synchronous I/O interface allows you to perform a USB transfer with\n * a single function call. When the function call returns, the transfer has\n * completed and you can parse the results.\n *\n * If you have used the libusb-0.1 before, this I/O style will seem familar to\n * you. libusb-0.1 only offered a synchronous interface.\n *\n * In our input device example, to read button presses you might write code\n * in the following style:\n\\code\nunsigned char data[4];\nint actual_length;\nint r = libusb_bulk_transfer(dev_handle, LIBUSB_ENDPOINT_IN, data, sizeof(data), &actual_length, 0);\nif (r == 0 && actual_length == sizeof(data)) {\n\t// results of the transaction can now be found in the data buffer\n\t// parse them here and report button press\n} else {\n\terror();\n}\n\\endcode\n *\n * The main advantage of this model is simplicity: you did everything with\n * a single simple function call.\n *\n * However, this interface has its limitations. Your application will sleep\n * inside libusb_bulk_transfer() until the transaction has completed. If it\n * takes the user 3 hours to press the button, your application will be\n * sleeping for that long. Execution will be tied up inside the library -\n * the entire thread will be useless for that duration.\n *\n * Another issue is that by tieing up the thread with that single transaction\n * there is no possibility of performing I/O with multiple endpoints and/or\n * multiple devices simultaneously, unless you resort to creating one thread\n * per transaction.\n *\n * Additionally, there is no opportunity to cancel the transfer after the\n * request has been submitted.\n *\n * For details on how to use the synchronous API, see the\n * \\ref libusb_syncio \"synchronous I/O API documentation\" pages.\n *\n * \\section async The asynchronous interface\n *\n * Asynchronous I/O is the most significant new feature in libusb-1.0.\n * Although it is a more complex interface, it solves all the issues detailed\n * above.\n *\n * Instead of providing which functions that block until the I/O has complete,\n * libusb's asynchronous interface presents non-blocking functions which\n * begin a transfer and then return immediately. Your application passes a\n * callback function pointer to this non-blocking function, which libusb will\n * call with the results of the transaction when it has completed.\n *\n * Transfers which have been submitted through the non-blocking functions\n * can be cancelled with a separate function call.\n *\n * The non-blocking nature of this interface allows you to be simultaneously\n * performing I/O to multiple endpoints on multiple devices, without having\n * to use threads.\n *\n * This added flexibility does come with some complications though:\n * - In the interest of being a lightweight library, libusb does not create\n * threads and can only operate when your application is calling into it. Your\n * application must call into libusb from it's main loop when events are ready\n * to be handled, or you must use some other scheme to allow libusb to\n * undertake whatever work needs to be done.\n * - libusb also needs to be called into at certain fixed points in time in\n * order to accurately handle transfer timeouts.\n * - Memory handling becomes more complex. You cannot use stack memory unless\n * the function with that stack is guaranteed not to return until the transfer\n * callback has finished executing.\n * - You generally lose some linearity from your code flow because submitting\n * the transfer request is done in a separate function from where the transfer\n * results are handled. This becomes particularly obvious when you want to\n * submit a second transfer based on the results of an earlier transfer.\n *\n * Internally, libusb's synchronous interface is expressed in terms of function\n * calls to the asynchronous interface.\n *\n * For details on how to use the asynchronous API, see the\n * \\ref libusb_asyncio \"asynchronous I/O API\" documentation pages.\n */\n\n\n/**\n * \\page libusb_packetoverflow Packets and overflows\n *\n * \\section packets Packet abstraction\n *\n * The USB specifications describe how data is transmitted in packets, with\n * constraints on packet size defined by endpoint descriptors. The host must\n * not send data payloads larger than the endpoint's maximum packet size.\n *\n * libusb and the underlying OS abstract out the packet concept, allowing you\n * to request transfers of any size. Internally, the request will be divided\n * up into correctly-sized packets. You do not have to be concerned with\n * packet sizes, but there is one exception when considering overflows.\n *\n * \\section overflow Bulk/interrupt transfer overflows\n *\n * When requesting data on a bulk endpoint, libusb requires you to supply a\n * buffer and the maximum number of bytes of data that libusb can put in that\n * buffer. However, the size of the buffer is not communicated to the device -\n * the device is just asked to send any amount of data.\n *\n * There is no problem if the device sends an amount of data that is less than\n * or equal to the buffer size. libusb reports this condition to you through\n * the \\ref libusb_transfer::actual_length \"libusb_transfer.actual_length\"\n * field.\n *\n * Problems may occur if the device attempts to send more data than can fit in\n * the buffer. libusb reports LIBUSB_TRANSFER_OVERFLOW for this condition but\n * other behaviour is largely undefined: actual_length may or may not be\n * accurate, the chunk of data that can fit in the buffer (before overflow)\n * may or may not have been transferred.\n *\n * Overflows are nasty, but can be avoided. Even though you were told to\n * ignore packets above, think about the lower level details: each transfer is\n * split into packets (typically small, with a maximum size of 512 bytes).\n * Overflows can only happen if the final packet in an incoming data transfer\n * is smaller than the actual packet that the device wants to transfer.\n * Therefore, you will never see an overflow if your transfer buffer size is a\n * multiple of the endpoint's packet size: the final packet will either\n * fill up completely or will be only partially filled.\n */\n\n/**\n * @defgroup libusb_asyncio Asynchronous device I/O\n *\n * This page details libusb's asynchronous (non-blocking) API for USB device\n * I/O. This interface is very powerful but is also quite complex - you will\n * need to read this page carefully to understand the necessary considerations\n * and issues surrounding use of this interface. Simplistic applications\n * may wish to consider the \\ref libusb_syncio \"synchronous I/O API\" instead.\n *\n * The asynchronous interface is built around the idea of separating transfer\n * submission and handling of transfer completion (the synchronous model\n * combines both of these into one). There may be a long delay between\n * submission and completion, however the asynchronous submission function\n * is non-blocking so will return control to your application during that\n * potentially long delay.\n *\n * \\section asyncabstraction Transfer abstraction\n *\n * For the asynchronous I/O, libusb implements the concept of a generic\n * transfer entity for all types of I/O (control, bulk, interrupt,\n * isochronous). The generic transfer object must be treated slightly\n * differently depending on which type of I/O you are performing with it.\n *\n * This is represented by the public libusb_transfer structure type.\n *\n * \\section asynctrf Asynchronous transfers\n *\n * We can view asynchronous I/O as a 5 step process:\n * -# <b>Allocation</b>: allocate a libusb_transfer\n * -# <b>Filling</b>: populate the libusb_transfer instance with information\n *    about the transfer you wish to perform\n * -# <b>Submission</b>: ask libusb to submit the transfer\n * -# <b>Completion handling</b>: examine transfer results in the\n *    libusb_transfer structure\n * -# <b>Deallocation</b>: clean up resources\n *\n *\n * \\subsection asyncalloc Allocation\n *\n * This step involves allocating memory for a USB transfer. This is the\n * generic transfer object mentioned above. At this stage, the transfer\n * is \"blank\" with no details about what type of I/O it will be used for.\n *\n * Allocation is done with the libusb_alloc_transfer() function. You must use\n * this function rather than allocating your own transfers.\n *\n * \\subsection asyncfill Filling\n *\n * This step is where you take a previously allocated transfer and fill it\n * with information to determine the message type and direction, data buffer,\n * callback function, etc.\n *\n * You can either fill the required fields yourself or you can use the\n * helper functions: libusb_fill_control_transfer(), libusb_fill_bulk_transfer()\n * and libusb_fill_interrupt_transfer().\n *\n * \\subsection asyncsubmit Submission\n *\n * When you have allocated a transfer and filled it, you can submit it using\n * libusb_submit_transfer(). This function returns immediately but can be\n * regarded as firing off the I/O request in the background.\n *\n * \\subsection asynccomplete Completion handling\n *\n * After a transfer has been submitted, one of four things can happen to it:\n *\n * - The transfer completes (i.e. some data was transferred)\n * - The transfer has a timeout and the timeout expires before all data is\n * transferred\n * - The transfer fails due to an error\n * - The transfer is cancelled\n *\n * Each of these will cause the user-specified transfer callback function to\n * be invoked. It is up to the callback function to determine which of the\n * above actually happened and to act accordingly.\n *\n * The user-specified callback is passed a pointer to the libusb_transfer\n * structure which was used to setup and submit the transfer. At completion\n * time, libusb has populated this structure with results of the transfer:\n * success or failure reason, number of bytes of data transferred, etc. See\n * the libusb_transfer structure documentation for more information.\n *\n * <b>Important Note</b>: The user-specified callback is called from an event\n * handling context. It is therefore important that no calls are made into\n * libusb that will attempt to perform any event handling. Examples of such\n * functions are any listed in the \\ref libusb_syncio \"synchronous API\" and any of\n * the blocking functions that retrieve \\ref libusb_desc \"USB descriptors\".\n *\n * \\subsection Deallocation\n *\n * When a transfer has completed (i.e. the callback function has been invoked),\n * you are advised to free the transfer (unless you wish to resubmit it, see\n * below). Transfers are deallocated with libusb_free_transfer().\n *\n * It is undefined behaviour to free a transfer which has not completed.\n *\n * \\section asyncresubmit Resubmission\n *\n * You may be wondering why allocation, filling, and submission are all\n * separated above where they could reasonably be combined into a single\n * operation.\n *\n * The reason for separation is to allow you to resubmit transfers without\n * having to allocate new ones every time. This is especially useful for\n * common situations dealing with interrupt endpoints - you allocate one\n * transfer, fill and submit it, and when it returns with results you just\n * resubmit it for the next interrupt.\n *\n * \\section asynccancel Cancellation\n *\n * Another advantage of using the asynchronous interface is that you have\n * the ability to cancel transfers which have not yet completed. This is\n * done by calling the libusb_cancel_transfer() function.\n *\n * libusb_cancel_transfer() is asynchronous/non-blocking in itself. When the\n * cancellation actually completes, the transfer's callback function will\n * be invoked, and the callback function should check the transfer status to\n * determine that it was cancelled.\n *\n * Freeing the transfer after it has been cancelled but before cancellation\n * has completed will result in undefined behaviour.\n *\n * When a transfer is cancelled, some of the data may have been transferred.\n * libusb will communicate this to you in the transfer callback. Do not assume\n * that no data was transferred.\n *\n * \\section bulk_overflows Overflows on device-to-host bulk/interrupt endpoints\n *\n * If your device does not have predictable transfer sizes (or it misbehaves),\n * your application may submit a request for data on an IN endpoint which is\n * smaller than the data that the device wishes to send. In some circumstances\n * this will cause an overflow, which is a nasty condition to deal with. See\n * the \\ref libusb_packetoverflow page for discussion.\n *\n * \\section asyncctrl Considerations for control transfers\n *\n * The <tt>libusb_transfer</tt> structure is generic and hence does not\n * include specific fields for the control-specific setup packet structure.\n *\n * In order to perform a control transfer, you must place the 8-byte setup\n * packet at the start of the data buffer. To simplify this, you could\n * cast the buffer pointer to type struct libusb_control_setup, or you can\n * use the helper function libusb_fill_control_setup().\n *\n * The wLength field placed in the setup packet must be the length you would\n * expect to be sent in the setup packet: the length of the payload that\n * follows (or the expected maximum number of bytes to receive). However,\n * the length field of the libusb_transfer object must be the length of\n * the data buffer - i.e. it should be wLength <em>plus</em> the size of\n * the setup packet (LIBUSB_CONTROL_SETUP_SIZE).\n *\n * If you use the helper functions, this is simplified for you:\n * -# Allocate a buffer of size LIBUSB_CONTROL_SETUP_SIZE plus the size of the\n * data you are sending/requesting.\n * -# Call libusb_fill_control_setup() on the data buffer, using the transfer\n * request size as the wLength value (i.e. do not include the extra space you\n * allocated for the control setup).\n * -# If this is a host-to-device transfer, place the data to be transferred\n * in the data buffer, starting at offset LIBUSB_CONTROL_SETUP_SIZE.\n * -# Call libusb_fill_control_transfer() to associate the data buffer with\n * the transfer (and to set the remaining details such as callback and timeout).\n *   - Note that there is no parameter to set the length field of the transfer.\n *     The length is automatically inferred from the wLength field of the setup\n *     packet.\n * -# Submit the transfer.\n *\n * The multi-byte control setup fields (wValue, wIndex and wLength) must\n * be given in little-endian byte order (the endianness of the USB bus).\n * Endianness conversion is transparently handled by\n * libusb_fill_control_setup() which is documented to accept host-endian\n * values.\n *\n * Further considerations are needed when handling transfer completion in\n * your callback function:\n * - As you might expect, the setup packet will still be sitting at the start\n * of the data buffer.\n * - If this was a device-to-host transfer, the received data will be sitting\n * at offset LIBUSB_CONTROL_SETUP_SIZE into the buffer.\n * - The actual_length field of the transfer structure is relative to the\n * wLength of the setup packet, rather than the size of the data buffer. So,\n * if your wLength was 4, your transfer's <tt>length</tt> was 12, then you\n * should expect an <tt>actual_length</tt> of 4 to indicate that the data was\n * transferred in entirity.\n *\n * To simplify parsing of setup packets and obtaining the data from the\n * correct offset, you may wish to use the libusb_control_transfer_get_data()\n * and libusb_control_transfer_get_setup() functions within your transfer\n * callback.\n *\n * Even though control endpoints do not halt, a completed control transfer\n * may have a LIBUSB_TRANSFER_STALL status code. This indicates the control\n * request was not supported.\n *\n * \\section asyncintr Considerations for interrupt transfers\n *\n * All interrupt transfers are performed using the polling interval presented\n * by the bInterval value of the endpoint descriptor.\n *\n * \\section asynciso Considerations for isochronous transfers\n *\n * Isochronous transfers are more complicated than transfers to\n * non-isochronous endpoints.\n *\n * To perform I/O to an isochronous endpoint, allocate the transfer by calling\n * libusb_alloc_transfer() with an appropriate number of isochronous packets.\n *\n * During filling, set \\ref libusb_transfer::type \"type\" to\n * \\ref libusb_transfer_type::LIBUSB_TRANSFER_TYPE_ISOCHRONOUS\n * \"LIBUSB_TRANSFER_TYPE_ISOCHRONOUS\", and set\n * \\ref libusb_transfer::num_iso_packets \"num_iso_packets\" to a value less than\n * or equal to the number of packets you requested during allocation.\n * libusb_alloc_transfer() does not set either of these fields for you, given\n * that you might not even use the transfer on an isochronous endpoint.\n *\n * Next, populate the length field for the first num_iso_packets entries in\n * the \\ref libusb_transfer::iso_packet_desc \"iso_packet_desc\" array. Section\n * 5.6.3 of the USB2 specifications describe how the maximum isochronous\n * packet length is determined by the wMaxPacketSize field in the endpoint\n * descriptor.\n * Two functions can help you here:\n *\n * - libusb_get_max_iso_packet_size() is an easy way to determine the max\n *   packet size for an isochronous endpoint. Note that the maximum packet\n *   size is actually the maximum number of bytes that can be transmitted in\n *   a single microframe, therefore this function multiplies the maximum number\n *   of bytes per transaction by the number of transaction opportunities per\n *   microframe.\n * - libusb_set_iso_packet_lengths() assigns the same length to all packets\n *   within a transfer, which is usually what you want.\n *\n * For outgoing transfers, you'll obviously fill the buffer and populate the\n * packet descriptors in hope that all the data gets transferred. For incoming\n * transfers, you must ensure the buffer has sufficient capacity for\n * the situation where all packets transfer the full amount of requested data.\n *\n * Completion handling requires some extra consideration. The\n * \\ref libusb_transfer::actual_length \"actual_length\" field of the transfer\n * is meaningless and should not be examined; instead you must refer to the\n * \\ref libusb_iso_packet_descriptor::actual_length \"actual_length\" field of\n * each individual packet.\n *\n * The \\ref libusb_transfer::status \"status\" field of the transfer is also a\n * little misleading:\n *  - If the packets were submitted and the isochronous data microframes\n *    completed normally, status will have value\n *    \\ref libusb_transfer_status::LIBUSB_TRANSFER_COMPLETED\n *    \"LIBUSB_TRANSFER_COMPLETED\". Note that bus errors and software-incurred\n *    delays are not counted as transfer errors; the transfer.status field may\n *    indicate COMPLETED even if some or all of the packets failed. Refer to\n *    the \\ref libusb_iso_packet_descriptor::status \"status\" field of each\n *    individual packet to determine packet failures.\n *  - The status field will have value\n *    \\ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR\n *    \"LIBUSB_TRANSFER_ERROR\" only when serious errors were encountered.\n *  - Other transfer status codes occur with normal behaviour.\n *\n * The data for each packet will be found at an offset into the buffer that\n * can be calculated as if each prior packet completed in full. The\n * libusb_get_iso_packet_buffer() and libusb_get_iso_packet_buffer_simple()\n * functions may help you here.\n *\n * <b>Note</b>: Some operating systems (e.g. Linux) may impose limits on the\n * length of individual isochronous packets and/or the total length of the\n * isochronous transfer. Such limits can be difficult for libusb to detect,\n * so the library will simply try and submit the transfer as set up by you.\n * If the transfer fails to submit because it is too large,\n * libusb_submit_transfer() will return\n * \\ref libusb_error::LIBUSB_ERROR_INVALID_PARAM \"LIBUSB_ERROR_INVALID_PARAM\".\n *\n * \\section asyncmem Memory caveats\n *\n * In most circumstances, it is not safe to use stack memory for transfer\n * buffers. This is because the function that fired off the asynchronous\n * transfer may return before libusb has finished using the buffer, and when\n * the function returns it's stack gets destroyed. This is true for both\n * host-to-device and device-to-host transfers.\n *\n * The only case in which it is safe to use stack memory is where you can\n * guarantee that the function owning the stack space for the buffer does not\n * return until after the transfer's callback function has completed. In every\n * other case, you need to use heap memory instead.\n *\n * \\section asyncflags Fine control\n *\n * Through using this asynchronous interface, you may find yourself repeating\n * a few simple operations many times. You can apply a bitwise OR of certain\n * flags to a transfer to simplify certain things:\n * - \\ref libusb_transfer_flags::LIBUSB_TRANSFER_SHORT_NOT_OK\n *   \"LIBUSB_TRANSFER_SHORT_NOT_OK\" results in transfers which transferred\n *   less than the requested amount of data being marked with status\n *   \\ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR \"LIBUSB_TRANSFER_ERROR\"\n *   (they would normally be regarded as COMPLETED)\n * - \\ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER\n *   \"LIBUSB_TRANSFER_FREE_BUFFER\" allows you to ask libusb to free the transfer\n *   buffer when freeing the transfer.\n * - \\ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_TRANSFER\n *   \"LIBUSB_TRANSFER_FREE_TRANSFER\" causes libusb to automatically free the\n *   transfer after the transfer callback returns.\n *\n * \\section asyncevent Event handling\n *\n * An asynchronous model requires that libusb perform work at various\n * points in time - namely processing the results of previously-submitted\n * transfers and invoking the user-supplied callback function.\n *\n * This gives rise to the libusb_handle_events() function which your\n * application must call into when libusb has work do to. This gives libusb\n * the opportunity to reap pending transfers, invoke callbacks, etc.\n *\n * There are 2 different approaches to dealing with libusb_handle_events:\n *\n * -# Repeatedly call libusb_handle_events() in blocking mode from a dedicated\n *    thread.\n * -# Integrate libusb with your application's main event loop. libusb\n *    exposes a set of file descriptors which allow you to do this.\n *\n * The first approach has the big advantage that it will also work on Windows\n * were libusb' poll API for select / poll integration is not available. So\n * if you want to support Windows and use the async API, you must use this\n * approach, see the \\ref eventthread \"Using an event handling thread\" section\n * below for details.\n *\n * If you prefer a single threaded approach with a single central event loop,\n * see the \\ref libusb_poll \"polling and timing\" section for how to integrate libusb\n * into your application's main event loop.\n *\n * \\section eventthread Using an event handling thread\n *\n * Lets begin with stating the obvious: If you're going to use a separate\n * thread for libusb event handling, your callback functions MUST be\n * threadsafe.\n *\n * Other then that doing event handling from a separate thread, is mostly\n * simple. You can use an event thread function as follows:\n\\code\nvoid *event_thread_func(void *ctx)\n{\n    while (event_thread_run)\n        libusb_handle_events(ctx);\n\n    return NULL;\n}\n\\endcode\n *\n * There is one caveat though, stopping this thread requires setting the\n * event_thread_run variable to 0, and after that libusb_handle_events() needs\n * to return control to event_thread_func. But unless some event happens,\n * libusb_handle_events() will not return.\n *\n * There are 2 different ways of dealing with this, depending on if your\n * application uses libusb' \\ref libusb_hotplug \"hotplug\" support or not.\n *\n * Applications which do not use hotplug support, should not start the event\n * thread until after their first call to libusb_open(), and should stop the\n * thread when closing the last open device as follows:\n\\code\nvoid my_close_handle(libusb_device_handle *dev_handle)\n{\n    if (open_devs == 1)\n        event_thread_run = 0;\n\n    libusb_close(dev_handle); // This wakes up libusb_handle_events()\n\n    if (open_devs == 1)\n        pthread_join(event_thread);\n\n    open_devs--;\n}\n\\endcode\n *\n * Applications using hotplug support should start the thread at program init,\n * after having successfully called libusb_hotplug_register_callback(), and\n * should stop the thread at program exit as follows:\n\\code\nvoid my_libusb_exit(void)\n{\n    event_thread_run = 0;\n    libusb_hotplug_deregister_callback(ctx, hotplug_cb_handle); // This wakes up libusb_handle_events()\n    pthread_join(event_thread);\n    libusb_exit(ctx);\n}\n\\endcode\n */\n\n/**\n * @defgroup libusb_poll Polling and timing\n *\n * This page documents libusb's functions for polling events and timing.\n * These functions are only necessary for users of the\n * \\ref libusb_asyncio \"asynchronous API\". If you are only using the simpler\n * \\ref libusb_syncio \"synchronous API\" then you do not need to ever call these\n * functions.\n *\n * The justification for the functionality described here has already been\n * discussed in the \\ref asyncevent \"event handling\" section of the\n * asynchronous API documentation. In summary, libusb does not create internal\n * threads for event processing and hence relies on your application calling\n * into libusb at certain points in time so that pending events can be handled.\n *\n * Your main loop is probably already calling poll() or select() or a\n * variant on a set of file descriptors for other event sources (e.g. keyboard\n * button presses, mouse movements, network sockets, etc). You then add\n * libusb's file descriptors to your poll()/select() calls, and when activity\n * is detected on such descriptors you know it is time to call\n * libusb_handle_events().\n *\n * There is one final event handling complication. libusb supports\n * asynchronous transfers which time out after a specified time period.\n *\n * On some platforms a timerfd is used, so the timeout handling is just another\n * fd, on other platforms this requires that libusb is called into at or after\n * the timeout to handle it. So, in addition to considering libusb's file\n * descriptors in your main event loop, you must also consider that libusb\n * sometimes needs to be called into at fixed points in time even when there\n * is no file descriptor activity, see \\ref polltime details.\n *\n * In order to know precisely when libusb needs to be called into, libusb\n * offers you a set of pollable file descriptors and information about when\n * the next timeout expires.\n *\n * If you are using the asynchronous I/O API, you must take one of the two\n * following options, otherwise your I/O will not complete.\n *\n * \\section pollsimple The simple option\n *\n * If your application revolves solely around libusb and does not need to\n * handle other event sources, you can have a program structure as follows:\n\\code\n// initialize libusb\n// find and open device\n// maybe fire off some initial async I/O\n\nwhile (user_has_not_requested_exit)\n\tlibusb_handle_events(ctx);\n\n// clean up and exit\n\\endcode\n *\n * With such a simple main loop, you do not have to worry about managing\n * sets of file descriptors or handling timeouts. libusb_handle_events() will\n * handle those details internally.\n *\n * \\section libusb_pollmain The more advanced option\n *\n * \\note This functionality is currently only available on Unix-like platforms.\n * On Windows, libusb_get_pollfds() simply returns NULL. Applications which\n * want to support Windows are advised to use an \\ref eventthread\n * \"event handling thread\" instead.\n *\n * In more advanced applications, you will already have a main loop which\n * is monitoring other event sources: network sockets, X11 events, mouse\n * movements, etc. Through exposing a set of file descriptors, libusb is\n * designed to cleanly integrate into such main loops.\n *\n * In addition to polling file descriptors for the other event sources, you\n * take a set of file descriptors from libusb and monitor those too. When you\n * detect activity on libusb's file descriptors, you call\n * libusb_handle_events_timeout() in non-blocking mode.\n *\n * What's more, libusb may also need to handle events at specific moments in\n * time. No file descriptor activity is generated at these times, so your\n * own application needs to be continually aware of when the next one of these\n * moments occurs (through calling libusb_get_next_timeout()), and then it\n * needs to call libusb_handle_events_timeout() in non-blocking mode when\n * these moments occur. This means that you need to adjust your\n * poll()/select() timeout accordingly.\n *\n * libusb provides you with a set of file descriptors to poll and expects you\n * to poll all of them, treating them as a single entity. The meaning of each\n * file descriptor in the set is an internal implementation detail,\n * platform-dependent and may vary from release to release. Don't try and\n * interpret the meaning of the file descriptors, just do as libusb indicates,\n * polling all of them at once.\n *\n * In pseudo-code, you want something that looks like:\n\\code\n// initialise libusb\n\nlibusb_get_pollfds(ctx)\nwhile (user has not requested application exit) {\n\tlibusb_get_next_timeout(ctx);\n\tpoll(on libusb file descriptors plus any other event sources of interest,\n\t\tusing a timeout no larger than the value libusb just suggested)\n\tif (poll() indicated activity on libusb file descriptors)\n\t\tlibusb_handle_events_timeout(ctx, &zero_tv);\n\tif (time has elapsed to or beyond the libusb timeout)\n\t\tlibusb_handle_events_timeout(ctx, &zero_tv);\n\t// handle events from other sources here\n}\n\n// clean up and exit\n\\endcode\n *\n * \\subsection polltime Notes on time-based events\n *\n * The above complication with having to track time and call into libusb at\n * specific moments is a bit of a headache. For maximum compatibility, you do\n * need to write your main loop as above, but you may decide that you can\n * restrict the supported platforms of your application and get away with\n * a more simplistic scheme.\n *\n * These time-based event complications are \\b not required on the following\n * platforms:\n *  - Darwin\n *  - Linux, provided that the following version requirements are satisfied:\n *   - Linux v2.6.27 or newer, compiled with timerfd support\n *   - glibc v2.9 or newer\n *   - libusb v1.0.5 or newer\n *\n * Under these configurations, libusb_get_next_timeout() will \\em always return\n * 0, so your main loop can be simplified to:\n\\code\n// initialise libusb\n\nlibusb_get_pollfds(ctx)\nwhile (user has not requested application exit) {\n\tpoll(on libusb file descriptors plus any other event sources of interest,\n\t\tusing any timeout that you like)\n\tif (poll() indicated activity on libusb file descriptors)\n\t\tlibusb_handle_events_timeout(ctx, &zero_tv);\n\t// handle events from other sources here\n}\n\n// clean up and exit\n\\endcode\n *\n * Do remember that if you simplify your main loop to the above, you will\n * lose compatibility with some platforms (including legacy Linux platforms,\n * and <em>any future platforms supported by libusb which may have time-based\n * event requirements</em>). The resultant problems will likely appear as\n * strange bugs in your application.\n *\n * You can use the libusb_pollfds_handle_timeouts() function to do a runtime\n * check to see if it is safe to ignore the time-based event complications.\n * If your application has taken the shortcut of ignoring libusb's next timeout\n * in your main loop, then you are advised to check the return value of\n * libusb_pollfds_handle_timeouts() during application startup, and to abort\n * if the platform does suffer from these timing complications.\n *\n * \\subsection fdsetchange Changes in the file descriptor set\n *\n * The set of file descriptors that libusb uses as event sources may change\n * during the life of your application. Rather than having to repeatedly\n * call libusb_get_pollfds(), you can set up notification functions for when\n * the file descriptor set changes using libusb_set_pollfd_notifiers().\n *\n * \\subsection mtissues Multi-threaded considerations\n *\n * Unfortunately, the situation is complicated further when multiple threads\n * come into play. If two threads are monitoring the same file descriptors,\n * the fact that only one thread will be woken up when an event occurs causes\n * some headaches.\n *\n * The events lock, event waiters lock, and libusb_handle_events_locked()\n * entities are added to solve these problems. You do not need to be concerned\n * with these entities otherwise.\n *\n * See the extra documentation: \\ref libusb_mtasync\n */\n\n/** \\page libusb_mtasync Multi-threaded applications and asynchronous I/O\n *\n * libusb is a thread-safe library, but extra considerations must be applied\n * to applications which interact with libusb from multiple threads.\n *\n * The underlying issue that must be addressed is that all libusb I/O\n * revolves around monitoring file descriptors through the poll()/select()\n * system calls. This is directly exposed at the\n * \\ref libusb_asyncio \"asynchronous interface\" but it is important to note that the\n * \\ref libusb_syncio \"synchronous interface\" is implemented on top of the\n * asynchonrous interface, therefore the same considerations apply.\n *\n * The issue is that if two or more threads are concurrently calling poll()\n * or select() on libusb's file descriptors then only one of those threads\n * will be woken up when an event arrives. The others will be completely\n * oblivious that anything has happened.\n *\n * Consider the following pseudo-code, which submits an asynchronous transfer\n * then waits for its completion. This style is one way you could implement a\n * synchronous interface on top of the asynchronous interface (and libusb\n * does something similar, albeit more advanced due to the complications\n * explained on this page).\n *\n\\code\nvoid cb(struct libusb_transfer *transfer)\n{\n\tint *completed = transfer->user_data;\n\t*completed = 1;\n}\n\nvoid myfunc() {\n\tstruct libusb_transfer *transfer;\n\tunsigned char buffer[LIBUSB_CONTROL_SETUP_SIZE] __attribute__ ((aligned (2)));\n\tint completed = 0;\n\n\ttransfer = libusb_alloc_transfer(0);\n\tlibusb_fill_control_setup(buffer,\n\t\tLIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0x04, 0x01, 0, 0);\n\tlibusb_fill_control_transfer(transfer, dev, buffer, cb, &completed, 1000);\n\tlibusb_submit_transfer(transfer);\n\n\twhile (!completed) {\n\t\tpoll(libusb file descriptors, 120*1000);\n\t\tif (poll indicates activity)\n\t\t\tlibusb_handle_events_timeout(ctx, &zero_tv);\n\t}\n\tprintf(\"completed!\");\n\t// other code here\n}\n\\endcode\n *\n * Here we are <em>serializing</em> completion of an asynchronous event\n * against a condition - the condition being completion of a specific transfer.\n * The poll() loop has a long timeout to minimize CPU usage during situations\n * when nothing is happening (it could reasonably be unlimited).\n *\n * If this is the only thread that is polling libusb's file descriptors, there\n * is no problem: there is no danger that another thread will swallow up the\n * event that we are interested in. On the other hand, if there is another\n * thread polling the same descriptors, there is a chance that it will receive\n * the event that we were interested in. In this situation, <tt>myfunc()</tt>\n * will only realise that the transfer has completed on the next iteration of\n * the loop, <em>up to 120 seconds later.</em> Clearly a two-minute delay is\n * undesirable, and don't even think about using short timeouts to circumvent\n * this issue!\n *\n * The solution here is to ensure that no two threads are ever polling the\n * file descriptors at the same time. A naive implementation of this would\n * impact the capabilities of the library, so libusb offers the scheme\n * documented below to ensure no loss of functionality.\n *\n * Before we go any further, it is worth mentioning that all libusb-wrapped\n * event handling procedures fully adhere to the scheme documented below.\n * This includes libusb_handle_events() and its variants, and all the\n * synchronous I/O functions - libusb hides this headache from you.\n *\n * \\section Using libusb_handle_events() from multiple threads\n *\n * Even when only using libusb_handle_events() and synchronous I/O functions,\n * you can still have a race condition. You might be tempted to solve the\n * above with libusb_handle_events() like so:\n *\n\\code\n\tlibusb_submit_transfer(transfer);\n\n\twhile (!completed) {\n\t\tlibusb_handle_events(ctx);\n\t}\n\tprintf(\"completed!\");\n\\endcode\n *\n * This however has a race between the checking of completed and\n * libusb_handle_events() acquiring the events lock, so another thread\n * could have completed the transfer, resulting in this thread hanging\n * until either a timeout or another event occurs. See also commit\n * 6696512aade99bb15d6792af90ae329af270eba6 which fixes this in the\n * synchronous API implementation of libusb.\n *\n * Fixing this race requires checking the variable completed only after\n * taking the event lock, which defeats the concept of just calling\n * libusb_handle_events() without worrying about locking. This is why\n * libusb-1.0.9 introduces the new libusb_handle_events_timeout_completed()\n * and libusb_handle_events_completed() functions, which handles doing the\n * completion check for you after they have acquired the lock:\n *\n\\code\n\tlibusb_submit_transfer(transfer);\n\n\twhile (!completed) {\n\t\tlibusb_handle_events_completed(ctx, &completed);\n\t}\n\tprintf(\"completed!\");\n\\endcode\n *\n * This nicely fixes the race in our example. Note that if all you want to\n * do is submit a single transfer and wait for its completion, then using\n * one of the synchronous I/O functions is much easier.\n *\n * \\section eventlock The events lock\n *\n * The problem is when we consider the fact that libusb exposes file\n * descriptors to allow for you to integrate asynchronous USB I/O into\n * existing main loops, effectively allowing you to do some work behind\n * libusb's back. If you do take libusb's file descriptors and pass them to\n * poll()/select() yourself, you need to be aware of the associated issues.\n *\n * The first concept to be introduced is the events lock. The events lock\n * is used to serialize threads that want to handle events, such that only\n * one thread is handling events at any one time.\n *\n * You must take the events lock before polling libusb file descriptors,\n * using libusb_lock_events(). You must release the lock as soon as you have\n * aborted your poll()/select() loop, using libusb_unlock_events().\n *\n * \\section threadwait Letting other threads do the work for you\n *\n * Although the events lock is a critical part of the solution, it is not\n * enough on it's own. You might wonder if the following is sufficient...\n\\code\n\tlibusb_lock_events(ctx);\n\twhile (!completed) {\n\t\tpoll(libusb file descriptors, 120*1000);\n\t\tif (poll indicates activity)\n\t\t\tlibusb_handle_events_timeout(ctx, &zero_tv);\n\t}\n\tlibusb_unlock_events(ctx);\n\\endcode\n * ...and the answer is that it is not. This is because the transfer in the\n * code shown above may take a long time (say 30 seconds) to complete, and\n * the lock is not released until the transfer is completed.\n *\n * Another thread with similar code that wants to do event handling may be\n * working with a transfer that completes after a few milliseconds. Despite\n * having such a quick completion time, the other thread cannot check that\n * status of its transfer until the code above has finished (30 seconds later)\n * due to contention on the lock.\n *\n * To solve this, libusb offers you a mechanism to determine when another\n * thread is handling events. It also offers a mechanism to block your thread\n * until the event handling thread has completed an event (and this mechanism\n * does not involve polling of file descriptors).\n *\n * After determining that another thread is currently handling events, you\n * obtain the <em>event waiters</em> lock using libusb_lock_event_waiters().\n * You then re-check that some other thread is still handling events, and if\n * so, you call libusb_wait_for_event().\n *\n * libusb_wait_for_event() puts your application to sleep until an event\n * occurs, or until a thread releases the events lock. When either of these\n * things happen, your thread is woken up, and should re-check the condition\n * it was waiting on. It should also re-check that another thread is handling\n * events, and if not, it should start handling events itself.\n *\n * This looks like the following, as pseudo-code:\n\\code\nretry:\nif (libusb_try_lock_events(ctx) == 0) {\n\t// we obtained the event lock: do our own event handling\n\twhile (!completed) {\n\t\tif (!libusb_event_handling_ok(ctx)) {\n\t\t\tlibusb_unlock_events(ctx);\n\t\t\tgoto retry;\n\t\t}\n\t\tpoll(libusb file descriptors, 120*1000);\n\t\tif (poll indicates activity)\n\t\t\tlibusb_handle_events_locked(ctx, 0);\n\t}\n\tlibusb_unlock_events(ctx);\n} else {\n\t// another thread is doing event handling. wait for it to signal us that\n\t// an event has completed\n\tlibusb_lock_event_waiters(ctx);\n\n\twhile (!completed) {\n\t\t// now that we have the event waiters lock, double check that another\n\t\t// thread is still handling events for us. (it may have ceased handling\n\t\t// events in the time it took us to reach this point)\n\t\tif (!libusb_event_handler_active(ctx)) {\n\t\t\t// whoever was handling events is no longer doing so, try again\n\t\t\tlibusb_unlock_event_waiters(ctx);\n\t\t\tgoto retry;\n\t\t}\n\n\t\tlibusb_wait_for_event(ctx, NULL);\n\t}\n\tlibusb_unlock_event_waiters(ctx);\n}\nprintf(\"completed!\\n\");\n\\endcode\n *\n * A naive look at the above code may suggest that this can only support\n * one event waiter (hence a total of 2 competing threads, the other doing\n * event handling), because the event waiter seems to have taken the event\n * waiters lock while waiting for an event. However, the system does support\n * multiple event waiters, because libusb_wait_for_event() actually drops\n * the lock while waiting, and reaquires it before continuing.\n *\n * We have now implemented code which can dynamically handle situations where\n * nobody is handling events (so we should do it ourselves), and it can also\n * handle situations where another thread is doing event handling (so we can\n * piggyback onto them). It is also equipped to handle a combination of\n * the two, for example, another thread is doing event handling, but for\n * whatever reason it stops doing so before our condition is met, so we take\n * over the event handling.\n *\n * Four functions were introduced in the above pseudo-code. Their importance\n * should be apparent from the code shown above.\n * -# libusb_try_lock_events() is a non-blocking function which attempts\n *    to acquire the events lock but returns a failure code if it is contended.\n * -# libusb_event_handling_ok() checks that libusb is still happy for your\n *    thread to be performing event handling. Sometimes, libusb needs to\n *    interrupt the event handler, and this is how you can check if you have\n *    been interrupted. If this function returns 0, the correct behaviour is\n *    for you to give up the event handling lock, and then to repeat the cycle.\n *    The following libusb_try_lock_events() will fail, so you will become an\n *    events waiter. For more information on this, read \\ref fullstory below.\n * -# libusb_handle_events_locked() is a variant of\n *    libusb_handle_events_timeout() that you can call while holding the\n *    events lock. libusb_handle_events_timeout() itself implements similar\n *    logic to the above, so be sure not to call it when you are\n *    \"working behind libusb's back\", as is the case here.\n * -# libusb_event_handler_active() determines if someone is currently\n *    holding the events lock\n *\n * You might be wondering why there is no function to wake up all threads\n * blocked on libusb_wait_for_event(). This is because libusb can do this\n * internally: it will wake up all such threads when someone calls\n * libusb_unlock_events() or when a transfer completes (at the point after its\n * callback has returned).\n *\n * \\subsection fullstory The full story\n *\n * The above explanation should be enough to get you going, but if you're\n * really thinking through the issues then you may be left with some more\n * questions regarding libusb's internals. If you're curious, read on, and if\n * not, skip to the next section to avoid confusing yourself!\n *\n * The immediate question that may spring to mind is: what if one thread\n * modifies the set of file descriptors that need to be polled while another\n * thread is doing event handling?\n *\n * There are 2 situations in which this may happen.\n * -# libusb_open() will add another file descriptor to the poll set,\n *    therefore it is desirable to interrupt the event handler so that it\n *    restarts, picking up the new descriptor.\n * -# libusb_close() will remove a file descriptor from the poll set. There\n *    are all kinds of race conditions that could arise here, so it is\n *    important that nobody is doing event handling at this time.\n *\n * libusb handles these issues internally, so application developers do not\n * have to stop their event handlers while opening/closing devices. Here's how\n * it works, focusing on the libusb_close() situation first:\n *\n * -# During initialization, libusb opens an internal pipe, and it adds the read\n *    end of this pipe to the set of file descriptors to be polled.\n * -# During libusb_close(), libusb writes some dummy data on this event pipe.\n *    This immediately interrupts the event handler. libusb also records\n *    internally that it is trying to interrupt event handlers for this\n *    high-priority event.\n * -# At this point, some of the functions described above start behaving\n *    differently:\n *   - libusb_event_handling_ok() starts returning 1, indicating that it is NOT\n *     OK for event handling to continue.\n *   - libusb_try_lock_events() starts returning 1, indicating that another\n *     thread holds the event handling lock, even if the lock is uncontended.\n *   - libusb_event_handler_active() starts returning 1, indicating that\n *     another thread is doing event handling, even if that is not true.\n * -# The above changes in behaviour result in the event handler stopping and\n *    giving up the events lock very quickly, giving the high-priority\n *    libusb_close() operation a \"free ride\" to acquire the events lock. All\n *    threads that are competing to do event handling become event waiters.\n * -# With the events lock held inside libusb_close(), libusb can safely remove\n *    a file descriptor from the poll set, in the safety of knowledge that\n *    nobody is polling those descriptors or trying to access the poll set.\n * -# After obtaining the events lock, the close operation completes very\n *    quickly (usually a matter of milliseconds) and then immediately releases\n *    the events lock.\n * -# At the same time, the behaviour of libusb_event_handling_ok() and friends\n *    reverts to the original, documented behaviour.\n * -# The release of the events lock causes the threads that are waiting for\n *    events to be woken up and to start competing to become event handlers\n *    again. One of them will succeed; it will then re-obtain the list of poll\n *    descriptors, and USB I/O will then continue as normal.\n *\n * libusb_open() is similar, and is actually a more simplistic case. Upon a\n * call to libusb_open():\n *\n * -# The device is opened and a file descriptor is added to the poll set.\n * -# libusb sends some dummy data on the event pipe, and records that it\n *    is trying to modify the poll descriptor set.\n * -# The event handler is interrupted, and the same behaviour change as for\n *    libusb_close() takes effect, causing all event handling threads to become\n *    event waiters.\n * -# The libusb_open() implementation takes its free ride to the events lock.\n * -# Happy that it has successfully paused the events handler, libusb_open()\n *    releases the events lock.\n * -# The event waiter threads are all woken up and compete to become event\n *    handlers again. The one that succeeds will obtain the list of poll\n *    descriptors again, which will include the addition of the new device.\n *\n * \\subsection concl Closing remarks\n *\n * The above may seem a little complicated, but hopefully I have made it clear\n * why such complications are necessary. Also, do not forget that this only\n * applies to applications that take libusb's file descriptors and integrate\n * them into their own polling loops.\n *\n * You may decide that it is OK for your multi-threaded application to ignore\n * some of the rules and locks detailed above, because you don't think that\n * two threads can ever be polling the descriptors at the same time. If that\n * is the case, then that's good news for you because you don't have to worry.\n * But be careful here; remember that the synchronous I/O functions do event\n * handling internally. If you have one thread doing event handling in a loop\n * (without implementing the rules and locking semantics documented above)\n * and another trying to send a synchronous USB transfer, you will end up with\n * two threads monitoring the same descriptors, and the above-described\n * undesirable behaviour occurring. The solution is for your polling thread to\n * play by the rules; the synchronous I/O functions do so, and this will result\n * in them getting along in perfect harmony.\n *\n * If you do have a dedicated thread doing event handling, it is perfectly\n * legal for it to take the event handling lock for long periods of time. Any\n * synchronous I/O functions you call from other threads will transparently\n * fall back to the \"event waiters\" mechanism detailed above. The only\n * consideration that your event handling thread must apply is the one related\n * to libusb_event_handling_ok(): you must call this before every poll(), and\n * give up the events lock if instructed.\n */\n\nint usbi_io_init(struct libusb_context *ctx)\n{\n\tint r;\n\n\tusbi_mutex_init(&ctx->flying_transfers_lock);\n\tusbi_mutex_init(&ctx->events_lock);\n\tusbi_mutex_init(&ctx->event_waiters_lock);\n\tusbi_cond_init(&ctx->event_waiters_cond);\n\tusbi_mutex_init(&ctx->event_data_lock);\n\tusbi_tls_key_create(&ctx->event_handling_key);\n\tlist_init(&ctx->flying_transfers);\n\tlist_init(&ctx->ipollfds);\n\tlist_init(&ctx->hotplug_msgs);\n\tlist_init(&ctx->completed_transfers);\n\n\t/* FIXME should use an eventfd on kernels that support it */\n\tr = usbi_pipe(ctx->event_pipe);\n\tif (r < 0) {\n\t\tr = LIBUSB_ERROR_OTHER;\n\t\tgoto err;\n\t}\n\n\tr = usbi_add_pollfd(ctx, ctx->event_pipe[0], POLLIN);\n\tif (r < 0)\n\t\tgoto err_close_pipe;\n\n#ifdef USBI_TIMERFD_AVAILABLE\n\tctx->timerfd = timerfd_create(usbi_backend->get_timerfd_clockid(),\n\t\tTFD_NONBLOCK);\n\tif (ctx->timerfd >= 0) {\n\t\tusbi_dbg(\"using timerfd for timeouts\");\n\t\tr = usbi_add_pollfd(ctx, ctx->timerfd, POLLIN);\n\t\tif (r < 0)\n\t\t\tgoto err_close_timerfd;\n\t} else {\n\t\tusbi_dbg(\"timerfd not available (code %d error %d)\", ctx->timerfd, errno);\n\t\tctx->timerfd = -1;\n\t}\n#endif\n\n\treturn 0;\n\n#ifdef USBI_TIMERFD_AVAILABLE\nerr_close_timerfd:\n\tclose(ctx->timerfd);\n\tusbi_remove_pollfd(ctx, ctx->event_pipe[0]);\n#endif\nerr_close_pipe:\n\tusbi_close(ctx->event_pipe[0]);\n\tusbi_close(ctx->event_pipe[1]);\nerr:\n\tusbi_mutex_destroy(&ctx->flying_transfers_lock);\n\tusbi_mutex_destroy(&ctx->events_lock);\n\tusbi_mutex_destroy(&ctx->event_waiters_lock);\n\tusbi_cond_destroy(&ctx->event_waiters_cond);\n\tusbi_mutex_destroy(&ctx->event_data_lock);\n\tusbi_tls_key_delete(ctx->event_handling_key);\n\treturn r;\n}\n\nvoid usbi_io_exit(struct libusb_context *ctx)\n{\n\tusbi_remove_pollfd(ctx, ctx->event_pipe[0]);\n\tusbi_close(ctx->event_pipe[0]);\n\tusbi_close(ctx->event_pipe[1]);\n#ifdef USBI_TIMERFD_AVAILABLE\n\tif (usbi_using_timerfd(ctx)) {\n\t\tusbi_remove_pollfd(ctx, ctx->timerfd);\n\t\tclose(ctx->timerfd);\n\t}\n#endif\n\tusbi_mutex_destroy(&ctx->flying_transfers_lock);\n\tusbi_mutex_destroy(&ctx->events_lock);\n\tusbi_mutex_destroy(&ctx->event_waiters_lock);\n\tusbi_cond_destroy(&ctx->event_waiters_cond);\n\tusbi_mutex_destroy(&ctx->event_data_lock);\n\tusbi_tls_key_delete(ctx->event_handling_key);\n\tif (ctx->pollfds)\n\t\tfree(ctx->pollfds);\n}\n\nstatic int calculate_timeout(struct usbi_transfer *transfer)\n{\n\tint r;\n\tstruct timespec current_time;\n\tunsigned int timeout =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout;\n\n\tif (!timeout)\n\t\treturn 0;\n\n\tr = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &current_time);\n\tif (r < 0) {\n\t\tusbi_err(ITRANSFER_CTX(transfer),\n\t\t\t\"failed to read monotonic clock, errno=%d\", errno);\n\t\treturn r;\n\t}\n\n\tcurrent_time.tv_sec += timeout / 1000;\n\tcurrent_time.tv_nsec += (timeout % 1000) * 1000000;\n\n\twhile (current_time.tv_nsec >= 1000000000) {\n\t\tcurrent_time.tv_nsec -= 1000000000;\n\t\tcurrent_time.tv_sec++;\n\t}\n\n\tTIMESPEC_TO_TIMEVAL(&transfer->timeout, &current_time);\n\treturn 0;\n}\n\n/** \\ingroup libusb_asyncio\n * Allocate a libusb transfer with a specified number of isochronous packet\n * descriptors. The returned transfer is pre-initialized for you. When the new\n * transfer is no longer needed, it should be freed with\n * libusb_free_transfer().\n *\n * Transfers intended for non-isochronous endpoints (e.g. control, bulk,\n * interrupt) should specify an iso_packets count of zero.\n *\n * For transfers intended for isochronous endpoints, specify an appropriate\n * number of packet descriptors to be allocated as part of the transfer.\n * The returned transfer is not specially initialized for isochronous I/O;\n * you are still required to set the\n * \\ref libusb_transfer::num_iso_packets \"num_iso_packets\" and\n * \\ref libusb_transfer::type \"type\" fields accordingly.\n *\n * It is safe to allocate a transfer with some isochronous packets and then\n * use it on a non-isochronous endpoint. If you do this, ensure that at time\n * of submission, num_iso_packets is 0 and that type is set appropriately.\n *\n * \\param iso_packets number of isochronous packet descriptors to allocate\n * \\returns a newly allocated transfer, or NULL on error\n */\nDEFAULT_VISIBILITY\nstruct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(\n\tint iso_packets)\n{\n\tstruct libusb_transfer *transfer;\n\tsize_t os_alloc_size = usbi_backend->transfer_priv_size;\n\tsize_t alloc_size = sizeof(struct usbi_transfer)\n\t\t+ sizeof(struct libusb_transfer)\n\t\t+ (sizeof(struct libusb_iso_packet_descriptor) * iso_packets)\n\t\t+ os_alloc_size;\n\tstruct usbi_transfer *itransfer = calloc(1, alloc_size);\n\tif (!itransfer)\n\t\treturn NULL;\n\n\titransfer->num_iso_packets = iso_packets;\n\tusbi_mutex_init(&itransfer->lock);\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tusbi_dbg(\"transfer %p\", transfer);\n\treturn transfer;\n}\n\n/** \\ingroup libusb_asyncio\n * Free a transfer structure. This should be called for all transfers\n * allocated with libusb_alloc_transfer().\n *\n * If the \\ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER\n * \"LIBUSB_TRANSFER_FREE_BUFFER\" flag is set and the transfer buffer is\n * non-NULL, this function will also free the transfer buffer using the\n * standard system memory allocator (e.g. free()).\n *\n * It is legal to call this function with a NULL transfer. In this case,\n * the function will simply return safely.\n *\n * It is not legal to free an active transfer (one which has been submitted\n * and has not yet completed).\n *\n * \\param transfer the transfer to free\n */\nvoid API_EXPORTED libusb_free_transfer(struct libusb_transfer *transfer)\n{\n\tstruct usbi_transfer *itransfer;\n\tif (!transfer)\n\t\treturn;\n\n\tusbi_dbg(\"transfer %p\", transfer);\n\tif (transfer->flags & LIBUSB_TRANSFER_FREE_BUFFER && transfer->buffer)\n\t\tfree(transfer->buffer);\n\n\titransfer = LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);\n\tusbi_mutex_destroy(&itransfer->lock);\n\tfree(itransfer);\n}\n\n#ifdef USBI_TIMERFD_AVAILABLE\nstatic int disarm_timerfd(struct libusb_context *ctx)\n{\n\tconst struct itimerspec disarm_timer = { { 0, 0 }, { 0, 0 } };\n\tint r;\n\n\tusbi_dbg(\"\");\n\tr = timerfd_settime(ctx->timerfd, 0, &disarm_timer, NULL);\n\tif (r < 0)\n\t\treturn LIBUSB_ERROR_OTHER;\n\telse\n\t\treturn 0;\n}\n\n/* iterates through the flying transfers, and rearms the timerfd based on the\n * next upcoming timeout.\n * must be called with flying_list locked.\n * returns 0 on success or a LIBUSB_ERROR code on failure.\n */\nstatic int arm_timerfd_for_next_timeout(struct libusb_context *ctx)\n{\n\tstruct usbi_transfer *transfer;\n\n\tlist_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) {\n\t\tstruct timeval *cur_tv = &transfer->timeout;\n\n\t\t/* if we've reached transfers of infinite timeout, then we have no\n\t\t * arming to do */\n\t\tif (!timerisset(cur_tv))\n\t\t\tgoto disarm;\n\n\t\t/* act on first transfer that has not already been handled */\n\t\tif (!(transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT))) {\n\t\t\tint r;\n\t\t\tconst struct itimerspec it = { {0, 0},\n\t\t\t\t{ cur_tv->tv_sec, cur_tv->tv_usec * 1000 } };\n\t\t\tusbi_dbg(\"next timeout originally %dms\", USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout);\n\t\t\tr = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL);\n\t\t\tif (r < 0)\n\t\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t\treturn 0;\n\t\t}\n\t}\n\ndisarm:\n\treturn disarm_timerfd(ctx);\n}\n#else\nstatic int arm_timerfd_for_next_timeout(struct libusb_context *ctx)\n{\n\tUNUSED(ctx);\n\treturn 0;\n}\n#endif\n\n/* add a transfer to the (timeout-sorted) active transfers list.\n * This function will return non 0 if fails to update the timer,\n * in which case the transfer is *not* on the flying_transfers list. */\nstatic int add_to_flying_list(struct usbi_transfer *transfer)\n{\n\tstruct usbi_transfer *cur;\n\tstruct timeval *timeout = &transfer->timeout;\n\tstruct libusb_context *ctx = ITRANSFER_CTX(transfer);\n\tint r;\n\tint first = 1;\n\n\tr = calculate_timeout(transfer);\n\tif (r)\n\t\treturn r;\n\n\t/* if we have no other flying transfers, start the list with this one */\n\tif (list_empty(&ctx->flying_transfers)) {\n\t\tlist_add(&transfer->list, &ctx->flying_transfers);\n\t\tgoto out;\n\t}\n\n\t/* if we have infinite timeout, append to end of list */\n\tif (!timerisset(timeout)) {\n\t\tlist_add_tail(&transfer->list, &ctx->flying_transfers);\n\t\t/* first is irrelevant in this case */\n\t\tgoto out;\n\t}\n\n\t/* otherwise, find appropriate place in list */\n\tlist_for_each_entry(cur, &ctx->flying_transfers, list, struct usbi_transfer) {\n\t\t/* find first timeout that occurs after the transfer in question */\n\t\tstruct timeval *cur_tv = &cur->timeout;\n\n\t\tif (!timerisset(cur_tv) || (cur_tv->tv_sec > timeout->tv_sec) ||\n\t\t\t\t(cur_tv->tv_sec == timeout->tv_sec &&\n\t\t\t\t\tcur_tv->tv_usec > timeout->tv_usec)) {\n\t\t\tlist_add_tail(&transfer->list, &cur->list);\n\t\t\tgoto out;\n\t\t}\n\t\tfirst = 0;\n\t}\n\t/* first is 0 at this stage (list not empty) */\n\n\t/* otherwise we need to be inserted at the end */\n\tlist_add_tail(&transfer->list, &ctx->flying_transfers);\nout:\n#ifdef USBI_TIMERFD_AVAILABLE\n\tif (first && usbi_using_timerfd(ctx) && timerisset(timeout)) {\n\t\t/* if this transfer has the lowest timeout of all active transfers,\n\t\t * rearm the timerfd with this transfer's timeout */\n\t\tconst struct itimerspec it = { {0, 0},\n\t\t\t{ timeout->tv_sec, timeout->tv_usec * 1000 } };\n\t\tusbi_dbg(\"arm timerfd for timeout in %dms (first in line)\",\n\t\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout);\n\t\tr = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL);\n\t\tif (r < 0) {\n\t\t\tusbi_warn(ctx, \"failed to arm first timerfd (errno %d)\", errno);\n\t\t\tr = LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n#else\n\tUNUSED(first);\n#endif\n\n\tif (r)\n\t\tlist_del(&transfer->list);\n\n\treturn r;\n}\n\n/* remove a transfer from the active transfers list.\n * This function will *always* remove the transfer from the\n * flying_transfers list. It will return a LIBUSB_ERROR code\n * if it fails to update the timer for the next timeout. */\nstatic int remove_from_flying_list(struct usbi_transfer *transfer)\n{\n\tstruct libusb_context *ctx = ITRANSFER_CTX(transfer);\n\tint rearm_timerfd;\n\tint r = 0;\n\n\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\trearm_timerfd = (timerisset(&transfer->timeout) &&\n\t\tlist_first_entry(&ctx->flying_transfers, struct usbi_transfer, list) == transfer);\n\tlist_del(&transfer->list);\n\tif (usbi_using_timerfd(ctx) && rearm_timerfd)\n\t\tr = arm_timerfd_for_next_timeout(ctx);\n\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\n\treturn r;\n}\n\n/** \\ingroup libusb_asyncio\n * Submit a transfer. This function will fire off the USB transfer and then\n * return immediately.\n *\n * \\param transfer the transfer to submit\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns LIBUSB_ERROR_BUSY if the transfer has already been submitted.\n * \\returns LIBUSB_ERROR_NOT_SUPPORTED if the transfer flags are not supported\n * by the operating system.\n * \\returns LIBUSB_ERROR_INVALID_PARAM if the transfer size is larger than\n * the operating system and/or hardware can support\n * \\returns another LIBUSB_ERROR code on other failure\n */\nint API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer)\n{\n\tstruct usbi_transfer *itransfer =\n\t\tLIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);\n\tstruct libusb_context *ctx = TRANSFER_CTX(transfer);\n\tint r;\n\n\tusbi_dbg(\"transfer %p\", transfer);\n\n\t/*\n\t * Important note on locking, this function takes / releases locks\n\t * in the following order:\n\t *  take flying_transfers_lock\n\t *  take itransfer->lock\n\t *  clear transfer\n\t *  add to flying_transfers list\n\t *  release flying_transfers_lock\n\t *  submit transfer\n\t *  release itransfer->lock\n\t *  if submit failed:\n\t *   take flying_transfers_lock\n\t *   remove from flying_transfers list\n\t *   release flying_transfers_lock\n\t *\n\t * Note that it takes locks in the order a-b and then releases them\n\t * in the same order a-b. This is somewhat unusual but not wrong,\n\t * release order is not important as long as *all* locks are released\n\t * before re-acquiring any locks.\n\t *\n\t * This means that the ordering of first releasing itransfer->lock\n\t * and then re-acquiring the flying_transfers_list on error is\n\t * important and must not be changed!\n\t *\n\t * This is done this way because when we take both locks we must always\n\t * take flying_transfers_lock first to avoid ab-ba style deadlocks with\n\t * the timeout handling and usbi_handle_disconnect paths.\n\t *\n\t * And we cannot release itransfer->lock before the submission is\n\t * complete otherwise timeout handling for transfers with short\n\t * timeouts may run before submission.\n\t */\n\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\tusbi_mutex_lock(&itransfer->lock);\n\tif (itransfer->state_flags & USBI_TRANSFER_IN_FLIGHT) {\n\t\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\treturn LIBUSB_ERROR_BUSY;\n\t}\n\titransfer->transferred = 0;\n\titransfer->state_flags = 0;\n\titransfer->timeout_flags = 0;\n\tr = add_to_flying_list(itransfer);\n\tif (r) {\n\t\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\treturn r;\n\t}\n\t/*\n\t * We must release the flying transfers lock here, because with\n\t * some backends the submit_transfer method is synchroneous.\n\t */\n\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\n\tr = usbi_backend->submit_transfer(itransfer);\n\tif (r == LIBUSB_SUCCESS) {\n\t\titransfer->state_flags |= USBI_TRANSFER_IN_FLIGHT;\n\t\t/* keep a reference to this device */\n\t\tlibusb_ref_device(transfer->dev_handle->dev);\n\t}\n\tusbi_mutex_unlock(&itransfer->lock);\n\n\tif (r != LIBUSB_SUCCESS)\n\t\tremove_from_flying_list(itransfer);\n\n\treturn r;\n}\n\n/** \\ingroup libusb_asyncio\n * Asynchronously cancel a previously submitted transfer.\n * This function returns immediately, but this does not indicate cancellation\n * is complete. Your callback function will be invoked at some later time\n * with a transfer status of\n * \\ref libusb_transfer_status::LIBUSB_TRANSFER_CANCELLED\n * \"LIBUSB_TRANSFER_CANCELLED.\"\n *\n * \\param transfer the transfer to cancel\n * \\returns 0 on success\n * \\returns LIBUSB_ERROR_NOT_FOUND if the transfer is not in progress,\n * already complete, or already cancelled.\n * \\returns a LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer)\n{\n\tstruct usbi_transfer *itransfer =\n\t\tLIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);\n\tint r;\n\n\tusbi_dbg(\"transfer %p\", transfer );\n\tusbi_mutex_lock(&itransfer->lock);\n\tif (!(itransfer->state_flags & USBI_TRANSFER_IN_FLIGHT)\n\t\t\t|| (itransfer->state_flags & USBI_TRANSFER_CANCELLING)) {\n\t\tr = LIBUSB_ERROR_NOT_FOUND;\n\t\tgoto out;\n\t}\n\tr = usbi_backend->cancel_transfer(itransfer);\n\tif (r < 0) {\n\t\tif (r != LIBUSB_ERROR_NOT_FOUND &&\n\t\t    r != LIBUSB_ERROR_NO_DEVICE)\n\t\t\tusbi_err(TRANSFER_CTX(transfer),\n\t\t\t\t\"cancel transfer failed error %d\", r);\n\t\telse\n\t\t\tusbi_dbg(\"cancel transfer failed error %d\", r);\n\n\t\tif (r == LIBUSB_ERROR_NO_DEVICE)\n\t\t\titransfer->state_flags |= USBI_TRANSFER_DEVICE_DISAPPEARED;\n\t}\n\n\titransfer->state_flags |= USBI_TRANSFER_CANCELLING;\n\nout:\n\tusbi_mutex_unlock(&itransfer->lock);\n\treturn r;\n}\n\n/** \\ingroup libusb_asyncio\n * Set a transfers bulk stream id. Note users are advised to use\n * libusb_fill_bulk_stream_transfer() instead of calling this function\n * directly.\n *\n * Since version 1.0.19, \\ref LIBUSB_API_VERSION >= 0x01000103\n *\n * \\param transfer the transfer to set the stream id for\n * \\param stream_id the stream id to set\n * \\see libusb_alloc_streams()\n */\nvoid API_EXPORTED libusb_transfer_set_stream_id(\n\tstruct libusb_transfer *transfer, uint32_t stream_id)\n{\n\tstruct usbi_transfer *itransfer =\n\t\tLIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);\n\n\titransfer->stream_id = stream_id;\n}\n\n/** \\ingroup libusb_asyncio\n * Get a transfers bulk stream id.\n *\n * Since version 1.0.19, \\ref LIBUSB_API_VERSION >= 0x01000103\n *\n * \\param transfer the transfer to get the stream id for\n * \\returns the stream id for the transfer\n */\nuint32_t API_EXPORTED libusb_transfer_get_stream_id(\n\tstruct libusb_transfer *transfer)\n{\n\tstruct usbi_transfer *itransfer =\n\t\tLIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer);\n\n\treturn itransfer->stream_id;\n}\n\n/* Handle completion of a transfer (completion might be an error condition).\n * This will invoke the user-supplied callback function, which may end up\n * freeing the transfer. Therefore you cannot use the transfer structure\n * after calling this function, and you should free all backend-specific\n * data before calling it.\n * Do not call this function with the usbi_transfer lock held. User-specified\n * callback functions may attempt to directly resubmit the transfer, which\n * will attempt to take the lock. */\nint usbi_handle_transfer_completion(struct usbi_transfer *itransfer,\n\tenum libusb_transfer_status status)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_device_handle *dev_handle = transfer->dev_handle;\n\tuint8_t flags;\n\tint r;\n\n\tr = remove_from_flying_list(itransfer);\n\tif (r < 0)\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"failed to set timer for next timeout, errno=%d\", errno);\n\n\tusbi_mutex_lock(&itransfer->lock);\n\titransfer->state_flags &= ~USBI_TRANSFER_IN_FLIGHT;\n\tusbi_mutex_unlock(&itransfer->lock);\n\n\tif (status == LIBUSB_TRANSFER_COMPLETED\n\t\t\t&& transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) {\n\t\tint rqlen = transfer->length;\n\t\tif (transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL)\n\t\t\trqlen -= LIBUSB_CONTROL_SETUP_SIZE;\n\t\tif (rqlen != itransfer->transferred) {\n\t\t\tusbi_dbg(\"interpreting short transfer as error\");\n\t\t\tstatus = LIBUSB_TRANSFER_ERROR;\n\t\t}\n\t}\n\n\tflags = transfer->flags;\n\ttransfer->status = status;\n\ttransfer->actual_length = itransfer->transferred;\n\tusbi_dbg(\"transfer %p has callback %p\", transfer, transfer->callback);\n\tif (transfer->callback)\n\t\ttransfer->callback(transfer);\n\t/* transfer might have been freed by the above call, do not use from\n\t * this point. */\n\tif (flags & LIBUSB_TRANSFER_FREE_TRANSFER)\n\t\tlibusb_free_transfer(transfer);\n\tlibusb_unref_device(dev_handle->dev);\n\treturn r;\n}\n\n/* Similar to usbi_handle_transfer_completion() but exclusively for transfers\n * that were asynchronously cancelled. The same concerns w.r.t. freeing of\n * transfers exist here.\n * Do not call this function with the usbi_transfer lock held. User-specified\n * callback functions may attempt to directly resubmit the transfer, which\n * will attempt to take the lock. */\nint usbi_handle_transfer_cancellation(struct usbi_transfer *transfer)\n{\n\tstruct libusb_context *ctx = ITRANSFER_CTX(transfer);\n\tuint8_t timed_out;\n\n\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\ttimed_out = transfer->timeout_flags & USBI_TRANSFER_TIMED_OUT;\n\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\n\t/* if the URB was cancelled due to timeout, report timeout to the user */\n\tif (timed_out) {\n\t\tusbi_dbg(\"detected timeout cancellation\");\n\t\treturn usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_TIMED_OUT);\n\t}\n\n\t/* otherwise its a normal async cancel */\n\treturn usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_CANCELLED);\n}\n\n/* Add a completed transfer to the completed_transfers list of the\n * context and signal the event. The backend's handle_transfer_completion()\n * function will be called the next time an event handler runs. */\nvoid usbi_signal_transfer_completion(struct usbi_transfer *transfer)\n{\n\tstruct libusb_context *ctx = ITRANSFER_CTX(transfer);\n\tint pending_events;\n\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tpending_events = usbi_pending_events(ctx);\n\tlist_add_tail(&transfer->completed_list, &ctx->completed_transfers);\n\tif (!pending_events)\n\t\tusbi_signal_event(ctx);\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n}\n\n/** \\ingroup libusb_poll\n * Attempt to acquire the event handling lock. This lock is used to ensure that\n * only one thread is monitoring libusb event sources at any one time.\n *\n * You only need to use this lock if you are developing an application\n * which calls poll() or select() on libusb's file descriptors directly.\n * If you stick to libusb's event handling loop functions (e.g.\n * libusb_handle_events()) then you do not need to be concerned with this\n * locking.\n *\n * While holding this lock, you are trusted to actually be handling events.\n * If you are no longer handling events, you must call libusb_unlock_events()\n * as soon as possible.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\returns 0 if the lock was obtained successfully\n * \\returns 1 if the lock was not obtained (i.e. another thread holds the lock)\n * \\ref libusb_mtasync\n */\nint API_EXPORTED libusb_try_lock_events(libusb_context *ctx)\n{\n\tint r;\n\tunsigned int ru;\n\tUSBI_GET_CONTEXT(ctx);\n\n\t/* is someone else waiting to close a device? if so, don't let this thread\n\t * start event handling */\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tru = ctx->device_close;\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n\tif (ru) {\n\t\tusbi_dbg(\"someone else is closing a device\");\n\t\treturn 1;\n\t}\n\n\tr = usbi_mutex_trylock(&ctx->events_lock);\n\tif (r)\n\t\treturn 1;\n\n\tctx->event_handler_active = 1;\n\treturn 0;\n}\n\n/** \\ingroup libusb_poll\n * Acquire the event handling lock, blocking until successful acquisition if\n * it is contended. This lock is used to ensure that only one thread is\n * monitoring libusb event sources at any one time.\n *\n * You only need to use this lock if you are developing an application\n * which calls poll() or select() on libusb's file descriptors directly.\n * If you stick to libusb's event handling loop functions (e.g.\n * libusb_handle_events()) then you do not need to be concerned with this\n * locking.\n *\n * While holding this lock, you are trusted to actually be handling events.\n * If you are no longer handling events, you must call libusb_unlock_events()\n * as soon as possible.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\ref libusb_mtasync\n */\nvoid API_EXPORTED libusb_lock_events(libusb_context *ctx)\n{\n\tUSBI_GET_CONTEXT(ctx);\n\tusbi_mutex_lock(&ctx->events_lock);\n\tctx->event_handler_active = 1;\n}\n\n/** \\ingroup libusb_poll\n * Release the lock previously acquired with libusb_try_lock_events() or\n * libusb_lock_events(). Releasing this lock will wake up any threads blocked\n * on libusb_wait_for_event().\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\ref libusb_mtasync\n */\nvoid API_EXPORTED libusb_unlock_events(libusb_context *ctx)\n{\n\tUSBI_GET_CONTEXT(ctx);\n\tctx->event_handler_active = 0;\n\tusbi_mutex_unlock(&ctx->events_lock);\n\n\t/* FIXME: perhaps we should be a bit more efficient by not broadcasting\n\t * the availability of the events lock when we are modifying pollfds\n\t * (check ctx->device_close)? */\n\tusbi_mutex_lock(&ctx->event_waiters_lock);\n\tusbi_cond_broadcast(&ctx->event_waiters_cond);\n\tusbi_mutex_unlock(&ctx->event_waiters_lock);\n}\n\n/** \\ingroup libusb_poll\n * Determine if it is still OK for this thread to be doing event handling.\n *\n * Sometimes, libusb needs to temporarily pause all event handlers, and this\n * is the function you should use before polling file descriptors to see if\n * this is the case.\n *\n * If this function instructs your thread to give up the events lock, you\n * should just continue the usual logic that is documented in \\ref libusb_mtasync.\n * On the next iteration, your thread will fail to obtain the events lock,\n * and will hence become an event waiter.\n *\n * This function should be called while the events lock is held: you don't\n * need to worry about the results of this function if your thread is not\n * the current event handler.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\returns 1 if event handling can start or continue\n * \\returns 0 if this thread must give up the events lock\n * \\ref fullstory \"Multi-threaded I/O: the full story\"\n */\nint API_EXPORTED libusb_event_handling_ok(libusb_context *ctx)\n{\n\tunsigned int r;\n\tUSBI_GET_CONTEXT(ctx);\n\n\t/* is someone else waiting to close a device? if so, don't let this thread\n\t * continue event handling */\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tr = ctx->device_close;\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n\tif (r) {\n\t\tusbi_dbg(\"someone else is closing a device\");\n\t\treturn 0;\n\t}\n\n\treturn 1;\n}\n\n\n/** \\ingroup libusb_poll\n * Determine if an active thread is handling events (i.e. if anyone is holding\n * the event handling lock).\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\returns 1 if a thread is handling events\n * \\returns 0 if there are no threads currently handling events\n * \\ref libusb_mtasync\n */\nint API_EXPORTED libusb_event_handler_active(libusb_context *ctx)\n{\n\tunsigned int r;\n\tUSBI_GET_CONTEXT(ctx);\n\n\t/* is someone else waiting to close a device? if so, don't let this thread\n\t * start event handling -- indicate that event handling is happening */\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tr = ctx->device_close;\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n\tif (r) {\n\t\tusbi_dbg(\"someone else is closing a device\");\n\t\treturn 1;\n\t}\n\n\treturn ctx->event_handler_active;\n}\n\n/** \\ingroup libusb_poll\n * Interrupt any active thread that is handling events. This is mainly useful\n * for interrupting a dedicated event handling thread when an application\n * wishes to call libusb_exit().\n *\n * Since version 1.0.21, \\ref LIBUSB_API_VERSION >= 0x01000105\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\ref libusb_mtasync\n */\nvoid API_EXPORTED libusb_interrupt_event_handler(libusb_context *ctx)\n{\n\tint pending_events;\n\tUSBI_GET_CONTEXT(ctx);\n\n\tusbi_dbg(\"\");\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\n\tpending_events = usbi_pending_events(ctx);\n\tctx->event_flags |= USBI_EVENT_USER_INTERRUPT;\n\tif (!pending_events)\n\t\tusbi_signal_event(ctx);\n\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n}\n\n/** \\ingroup libusb_poll\n * Acquire the event waiters lock. This lock is designed to be obtained under\n * the situation where you want to be aware when events are completed, but\n * some other thread is event handling so calling libusb_handle_events() is not\n * allowed.\n *\n * You then obtain this lock, re-check that another thread is still handling\n * events, then call libusb_wait_for_event().\n *\n * You only need to use this lock if you are developing an application\n * which calls poll() or select() on libusb's file descriptors directly,\n * <b>and</b> may potentially be handling events from 2 threads simultaenously.\n * If you stick to libusb's event handling loop functions (e.g.\n * libusb_handle_events()) then you do not need to be concerned with this\n * locking.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\ref libusb_mtasync\n */\nvoid API_EXPORTED libusb_lock_event_waiters(libusb_context *ctx)\n{\n\tUSBI_GET_CONTEXT(ctx);\n\tusbi_mutex_lock(&ctx->event_waiters_lock);\n}\n\n/** \\ingroup libusb_poll\n * Release the event waiters lock.\n * \\param ctx the context to operate on, or NULL for the default context\n * \\ref libusb_mtasync\n */\nvoid API_EXPORTED libusb_unlock_event_waiters(libusb_context *ctx)\n{\n\tUSBI_GET_CONTEXT(ctx);\n\tusbi_mutex_unlock(&ctx->event_waiters_lock);\n}\n\n/** \\ingroup libusb_poll\n * Wait for another thread to signal completion of an event. Must be called\n * with the event waiters lock held, see libusb_lock_event_waiters().\n *\n * This function will block until any of the following conditions are met:\n * -# The timeout expires\n * -# A transfer completes\n * -# A thread releases the event handling lock through libusb_unlock_events()\n *\n * Condition 1 is obvious. Condition 2 unblocks your thread <em>after</em>\n * the callback for the transfer has completed. Condition 3 is important\n * because it means that the thread that was previously handling events is no\n * longer doing so, so if any events are to complete, another thread needs to\n * step up and start event handling.\n *\n * This function releases the event waiters lock before putting your thread\n * to sleep, and reacquires the lock as it is being woken up.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param tv maximum timeout for this blocking function. A NULL value\n * indicates unlimited timeout.\n * \\returns 0 after a transfer completes or another thread stops event handling\n * \\returns 1 if the timeout expired\n * \\ref libusb_mtasync\n */\nint API_EXPORTED libusb_wait_for_event(libusb_context *ctx, struct timeval *tv)\n{\n\tint r;\n\n\tUSBI_GET_CONTEXT(ctx);\n\tif (tv == NULL) {\n\t\tusbi_cond_wait(&ctx->event_waiters_cond, &ctx->event_waiters_lock);\n\t\treturn 0;\n\t}\n\n\tr = usbi_cond_timedwait(&ctx->event_waiters_cond,\n\t\t&ctx->event_waiters_lock, tv);\n\n\tif (r < 0)\n\t\treturn r;\n\telse\n\t\treturn (r == ETIMEDOUT);\n}\n\nstatic void handle_timeout(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tint r;\n\n\titransfer->timeout_flags |= USBI_TRANSFER_TIMEOUT_HANDLED;\n\tr = libusb_cancel_transfer(transfer);\n\tif (r == LIBUSB_SUCCESS)\n\t\titransfer->timeout_flags |= USBI_TRANSFER_TIMED_OUT;\n\telse\n\t\tusbi_warn(TRANSFER_CTX(transfer),\n\t\t\t\"async cancel failed %d errno=%d\", r, errno);\n}\n\nstatic int handle_timeouts_locked(struct libusb_context *ctx)\n{\n\tint r;\n\tstruct timespec systime_ts;\n\tstruct timeval systime;\n\tstruct usbi_transfer *transfer;\n\n\tif (list_empty(&ctx->flying_transfers))\n\t\treturn 0;\n\n\t/* get current time */\n\tr = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts);\n\tif (r < 0)\n\t\treturn r;\n\n\tTIMESPEC_TO_TIMEVAL(&systime, &systime_ts);\n\n\t/* iterate through flying transfers list, finding all transfers that\n\t * have expired timeouts */\n\tlist_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) {\n\t\tstruct timeval *cur_tv = &transfer->timeout;\n\n\t\t/* if we've reached transfers of infinite timeout, we're all done */\n\t\tif (!timerisset(cur_tv))\n\t\t\treturn 0;\n\n\t\t/* ignore timeouts we've already handled */\n\t\tif (transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT))\n\t\t\tcontinue;\n\n\t\t/* if transfer has non-expired timeout, nothing more to do */\n\t\tif ((cur_tv->tv_sec > systime.tv_sec) ||\n\t\t\t\t(cur_tv->tv_sec == systime.tv_sec &&\n\t\t\t\t\tcur_tv->tv_usec > systime.tv_usec))\n\t\t\treturn 0;\n\n\t\t/* otherwise, we've got an expired timeout to handle */\n\t\thandle_timeout(transfer);\n\t}\n\treturn 0;\n}\n\nstatic int handle_timeouts(struct libusb_context *ctx)\n{\n\tint r;\n\tUSBI_GET_CONTEXT(ctx);\n\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\tr = handle_timeouts_locked(ctx);\n\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\treturn r;\n}\n\n#ifdef USBI_TIMERFD_AVAILABLE\nstatic int handle_timerfd_trigger(struct libusb_context *ctx)\n{\n\tint r;\n\n\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\n\t/* process the timeout that just happened */\n\tr = handle_timeouts_locked(ctx);\n\tif (r < 0)\n\t\tgoto out;\n\n\t/* arm for next timeout*/\n\tr = arm_timerfd_for_next_timeout(ctx);\n\nout:\n\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\treturn r;\n}\n#endif\n\n/* do the actual event handling. assumes that no other thread is concurrently\n * doing the same thing. */\nstatic int handle_events(struct libusb_context *ctx, struct timeval *tv)\n{\n\tint r;\n\tstruct usbi_pollfd *ipollfd;\n\tPOLL_NFDS_TYPE nfds = 0;\n\tPOLL_NFDS_TYPE internal_nfds;\n\tstruct pollfd *fds = NULL;\n\tint i = -1;\n\tint timeout_ms;\n\tint special_event;\n\n\t/* prevent attempts to recursively handle events (e.g. calling into\n\t * libusb_handle_events() from within a hotplug or transfer callback) */\n\tif (usbi_handling_events(ctx))\n\t\treturn LIBUSB_ERROR_BUSY;\n\tusbi_start_event_handling(ctx);\n\n\t/* there are certain fds that libusb uses internally, currently:\n\t *\n\t *   1) event pipe\n\t *   2) timerfd\n\t *\n\t * the backend will never need to attempt to handle events on these fds, so\n\t * we determine how many fds are in use internally for this context and when\n\t * handle_events() is called in the backend, the pollfd list and count will\n\t * be adjusted to skip over these internal fds */\n\tif (usbi_using_timerfd(ctx))\n\t\tinternal_nfds = 2;\n\telse\n\t\tinternal_nfds = 1;\n\n\t/* only reallocate the poll fds when the list of poll fds has been modified\n\t * since the last poll, otherwise reuse them to save the additional overhead */\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tif (ctx->event_flags & USBI_EVENT_POLLFDS_MODIFIED) {\n\t\tusbi_dbg(\"poll fds modified, reallocating\");\n\n\t\tif (ctx->pollfds) {\n\t\t\tfree(ctx->pollfds);\n\t\t\tctx->pollfds = NULL;\n\t\t}\n\n\t\t/* sanity check - it is invalid for a context to have fewer than the\n\t\t * required internal fds (memory corruption?) */\n\t\tassert(ctx->pollfds_cnt >= internal_nfds);\n\n\t\tctx->pollfds = calloc(ctx->pollfds_cnt, sizeof(*ctx->pollfds));\n\t\tif (!ctx->pollfds) {\n\t\t\tusbi_mutex_unlock(&ctx->event_data_lock);\n\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\tgoto done;\n\t\t}\n\n\t\tlist_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd) {\n\t\t\tstruct libusb_pollfd *pollfd = &ipollfd->pollfd;\n\t\t\ti++;\n\t\t\tctx->pollfds[i].fd = pollfd->fd;\n\t\t\tctx->pollfds[i].events = pollfd->events;\n\t\t}\n\n\t\t/* reset the flag now that we have the updated list */\n\t\tctx->event_flags &= ~USBI_EVENT_POLLFDS_MODIFIED;\n\n\t\t/* if no further pending events, clear the event pipe so that we do\n\t\t * not immediately return from poll */\n\t\tif (!usbi_pending_events(ctx))\n\t\t\tusbi_clear_event(ctx);\n\t}\n\tfds = ctx->pollfds;\n\tnfds = ctx->pollfds_cnt;\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n\n\ttimeout_ms = (int)(tv->tv_sec * 1000) + (tv->tv_usec / 1000);\n\n\t/* round up to next millisecond */\n\tif (tv->tv_usec % 1000)\n\t\ttimeout_ms++;\n\nredo_poll:\n\tusbi_dbg(\"poll() %d fds with timeout in %dms\", nfds, timeout_ms);\n\tr = usbi_poll(fds, nfds, timeout_ms);\n\tusbi_dbg(\"poll() returned %d\", r);\n\tif (r == 0) {\n\t\tr = handle_timeouts(ctx);\n\t\tgoto done;\n\t}\n\telse if (r == -1 && errno == EINTR) {\n\t\tr = LIBUSB_ERROR_INTERRUPTED;\n\t\tgoto done;\n\t}\n\telse if (r < 0) {\n\t\tusbi_err(ctx, \"poll failed %d err=%d\", r, errno);\n\t\tr = LIBUSB_ERROR_IO;\n\t\tgoto done;\n\t}\n\n\tspecial_event = 0;\n\n\t/* fds[0] is always the event pipe */\n\tif (fds[0].revents) {\n\t\tlibusb_hotplug_message *message = NULL;\n\t\tstruct usbi_transfer *itransfer;\n\t\tint ret = 0;\n\n\t\tusbi_dbg(\"caught a fish on the event pipe\");\n\n\t\t/* take the the event data lock while processing events */\n\t\tusbi_mutex_lock(&ctx->event_data_lock);\n\n\t\t/* check if someone added a new poll fd */\n\t\tif (ctx->event_flags & USBI_EVENT_POLLFDS_MODIFIED)\n\t\t\tusbi_dbg(\"someone updated the poll fds\");\n\n\t\tif (ctx->event_flags & USBI_EVENT_USER_INTERRUPT) {\n\t\t\tusbi_dbg(\"someone purposely interrupted\");\n\t\t\tctx->event_flags &= ~USBI_EVENT_USER_INTERRUPT;\n\t\t}\n\n\t\t/* check if someone is closing a device */\n\t\tif (ctx->device_close)\n\t\t\tusbi_dbg(\"someone is closing a device\");\n\n\t\t/* check for any pending hotplug messages */\n\t\tif (!list_empty(&ctx->hotplug_msgs)) {\n\t\t\tusbi_dbg(\"hotplug message received\");\n\t\t\tspecial_event = 1;\n\t\t\tmessage = list_first_entry(&ctx->hotplug_msgs, libusb_hotplug_message, list);\n\t\t\tlist_del(&message->list);\n\t\t}\n\n\t\t/* complete any pending transfers */\n\t\twhile (ret == 0 && !list_empty(&ctx->completed_transfers)) {\n\t\t\titransfer = list_first_entry(&ctx->completed_transfers, struct usbi_transfer, completed_list);\n\t\t\tlist_del(&itransfer->completed_list);\n\t\t\tusbi_mutex_unlock(&ctx->event_data_lock);\n\t\t\tret = usbi_backend->handle_transfer_completion(itransfer);\n\t\t\tif (ret)\n\t\t\t\tusbi_err(ctx, \"backend handle_transfer_completion failed with error %d\", ret);\n\t\t\tusbi_mutex_lock(&ctx->event_data_lock);\n\t\t}\n\n\t\t/* if no further pending events, clear the event pipe */\n\t\tif (!usbi_pending_events(ctx))\n\t\t\tusbi_clear_event(ctx);\n\n\t\tusbi_mutex_unlock(&ctx->event_data_lock);\n\n\t\t/* process the hotplug message, if any */\n\t\tif (message) {\n\t\t\tusbi_hotplug_match(ctx, message->device, message->event);\n\n\t\t\t/* the device left, dereference the device */\n\t\t\tif (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == message->event)\n\t\t\t\tlibusb_unref_device(message->device);\n\n\t\t\tfree(message);\n\t\t}\n\n\t\tif (ret) {\n\t\t\t/* return error code */\n\t\t\tr = ret;\n\t\t\tgoto done;\n\t\t}\n\n\t\tif (0 == --r)\n\t\t\tgoto handled;\n\t}\n\n#ifdef USBI_TIMERFD_AVAILABLE\n\t/* on timerfd configurations, fds[1] is the timerfd */\n\tif (usbi_using_timerfd(ctx) && fds[1].revents) {\n\t\t/* timerfd indicates that a timeout has expired */\n\t\tint ret;\n\t\tusbi_dbg(\"timerfd triggered\");\n\t\tspecial_event = 1;\n\n\t\tret = handle_timerfd_trigger(ctx);\n\t\tif (ret < 0) {\n\t\t\t/* return error code */\n\t\t\tr = ret;\n\t\t\tgoto done;\n\t\t}\n\n\t\tif (0 == --r)\n\t\t\tgoto handled;\n\t}\n#endif\n\n\tr = usbi_backend->handle_events(ctx, fds + internal_nfds, nfds - internal_nfds, r);\n\tif (r)\n\t\tusbi_err(ctx, \"backend handle_events failed with error %d\", r);\n\nhandled:\n\tif (r == 0 && special_event) {\n\t\ttimeout_ms = 0;\n\t\tgoto redo_poll;\n\t}\n\ndone:\n\tusbi_end_event_handling(ctx);\n\treturn r;\n}\n\n/* returns the smallest of:\n *  1. timeout of next URB\n *  2. user-supplied timeout\n * returns 1 if there is an already-expired timeout, otherwise returns 0\n * and populates out\n */\nstatic int get_next_timeout(libusb_context *ctx, struct timeval *tv,\n\tstruct timeval *out)\n{\n\tstruct timeval timeout;\n\tint r = libusb_get_next_timeout(ctx, &timeout);\n\tif (r) {\n\t\t/* timeout already expired? */\n\t\tif (!timerisset(&timeout))\n\t\t\treturn 1;\n\n\t\t/* choose the smallest of next URB timeout or user specified timeout */\n\t\tif (timercmp(&timeout, tv, <))\n\t\t\t*out = timeout;\n\t\telse\n\t\t\t*out = *tv;\n\t} else {\n\t\t*out = *tv;\n\t}\n\treturn 0;\n}\n\n/** \\ingroup libusb_poll\n * Handle any pending events.\n *\n * libusb determines \"pending events\" by checking if any timeouts have expired\n * and by checking the set of file descriptors for activity.\n *\n * If a zero timeval is passed, this function will handle any already-pending\n * events and then immediately return in non-blocking style.\n *\n * If a non-zero timeval is passed and no events are currently pending, this\n * function will block waiting for events to handle up until the specified\n * timeout. If an event arrives or a signal is raised, this function will\n * return early.\n *\n * If the parameter completed is not NULL then <em>after obtaining the event\n * handling lock</em> this function will return immediately if the integer\n * pointed to is not 0. This allows for race free waiting for the completion\n * of a specific transfer.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param tv the maximum time to block waiting for events, or an all zero\n * timeval struct for non-blocking mode\n * \\param completed pointer to completion integer to check, or NULL\n * \\returns 0 on success, or a LIBUSB_ERROR code on failure\n * \\ref libusb_mtasync\n */\nint API_EXPORTED libusb_handle_events_timeout_completed(libusb_context *ctx,\n\tstruct timeval *tv, int *completed)\n{\n\tint r;\n\tstruct timeval poll_timeout;\n\n\tUSBI_GET_CONTEXT(ctx);\n\tr = get_next_timeout(ctx, tv, &poll_timeout);\n\tif (r) {\n\t\t/* timeout already expired */\n\t\treturn handle_timeouts(ctx);\n\t}\n\nretry:\n\tif (libusb_try_lock_events(ctx) == 0) {\n\t\tif (completed == NULL || !*completed) {\n\t\t\t/* we obtained the event lock: do our own event handling */\n\t\t\tusbi_dbg(\"doing our own event handling\");\n\t\t\tr = handle_events(ctx, &poll_timeout);\n\t\t}\n\t\tlibusb_unlock_events(ctx);\n\t\treturn r;\n\t}\n\n\t/* another thread is doing event handling. wait for thread events that\n\t * notify event completion. */\n\tlibusb_lock_event_waiters(ctx);\n\n\tif (completed && *completed)\n\t\tgoto already_done;\n\n\tif (!libusb_event_handler_active(ctx)) {\n\t\t/* we hit a race: whoever was event handling earlier finished in the\n\t\t * time it took us to reach this point. try the cycle again. */\n\t\tlibusb_unlock_event_waiters(ctx);\n\t\tusbi_dbg(\"event handler was active but went away, retrying\");\n\t\tgoto retry;\n\t}\n\n\tusbi_dbg(\"another thread is doing event handling\");\n\tr = libusb_wait_for_event(ctx, &poll_timeout);\n\nalready_done:\n\tlibusb_unlock_event_waiters(ctx);\n\n\tif (r < 0)\n\t\treturn r;\n\telse if (r == 1)\n\t\treturn handle_timeouts(ctx);\n\telse\n\t\treturn 0;\n}\n\n/** \\ingroup libusb_poll\n * Handle any pending events\n *\n * Like libusb_handle_events_timeout_completed(), but without the completed\n * parameter, calling this function is equivalent to calling\n * libusb_handle_events_timeout_completed() with a NULL completed parameter.\n *\n * This function is kept primarily for backwards compatibility.\n * All new code should call libusb_handle_events_completed() or\n * libusb_handle_events_timeout_completed() to avoid race conditions.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param tv the maximum time to block waiting for events, or an all zero\n * timeval struct for non-blocking mode\n * \\returns 0 on success, or a LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_handle_events_timeout(libusb_context *ctx,\n\tstruct timeval *tv)\n{\n\treturn libusb_handle_events_timeout_completed(ctx, tv, NULL);\n}\n\n/** \\ingroup libusb_poll\n * Handle any pending events in blocking mode. There is currently a timeout\n * hardcoded at 60 seconds but we plan to make it unlimited in future. For\n * finer control over whether this function is blocking or non-blocking, or\n * for control over the timeout, use libusb_handle_events_timeout_completed()\n * instead.\n *\n * This function is kept primarily for backwards compatibility.\n * All new code should call libusb_handle_events_completed() or\n * libusb_handle_events_timeout_completed() to avoid race conditions.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\returns 0 on success, or a LIBUSB_ERROR code on failure\n */\nint API_EXPORTED libusb_handle_events(libusb_context *ctx)\n{\n\tstruct timeval tv;\n\ttv.tv_sec = 60;\n\ttv.tv_usec = 0;\n\treturn libusb_handle_events_timeout_completed(ctx, &tv, NULL);\n}\n\n/** \\ingroup libusb_poll\n * Handle any pending events in blocking mode.\n *\n * Like libusb_handle_events(), with the addition of a completed parameter\n * to allow for race free waiting for the completion of a specific transfer.\n *\n * See libusb_handle_events_timeout_completed() for details on the completed\n * parameter.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param completed pointer to completion integer to check, or NULL\n * \\returns 0 on success, or a LIBUSB_ERROR code on failure\n * \\ref libusb_mtasync\n */\nint API_EXPORTED libusb_handle_events_completed(libusb_context *ctx,\n\tint *completed)\n{\n\tstruct timeval tv;\n\ttv.tv_sec = 60;\n\ttv.tv_usec = 0;\n\treturn libusb_handle_events_timeout_completed(ctx, &tv, completed);\n}\n\n/** \\ingroup libusb_poll\n * Handle any pending events by polling file descriptors, without checking if\n * any other threads are already doing so. Must be called with the event lock\n * held, see libusb_lock_events().\n *\n * This function is designed to be called under the situation where you have\n * taken the event lock and are calling poll()/select() directly on libusb's\n * file descriptors (as opposed to using libusb_handle_events() or similar).\n * You detect events on libusb's descriptors, so you then call this function\n * with a zero timeout value (while still holding the event lock).\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param tv the maximum time to block waiting for events, or zero for\n * non-blocking mode\n * \\returns 0 on success, or a LIBUSB_ERROR code on failure\n * \\ref libusb_mtasync\n */\nint API_EXPORTED libusb_handle_events_locked(libusb_context *ctx,\n\tstruct timeval *tv)\n{\n\tint r;\n\tstruct timeval poll_timeout;\n\n\tUSBI_GET_CONTEXT(ctx);\n\tr = get_next_timeout(ctx, tv, &poll_timeout);\n\tif (r) {\n\t\t/* timeout already expired */\n\t\treturn handle_timeouts(ctx);\n\t}\n\n\treturn handle_events(ctx, &poll_timeout);\n}\n\n/** \\ingroup libusb_poll\n * Determines whether your application must apply special timing considerations\n * when monitoring libusb's file descriptors.\n *\n * This function is only useful for applications which retrieve and poll\n * libusb's file descriptors in their own main loop (\\ref libusb_pollmain).\n *\n * Ordinarily, libusb's event handler needs to be called into at specific\n * moments in time (in addition to times when there is activity on the file\n * descriptor set). The usual approach is to use libusb_get_next_timeout()\n * to learn about when the next timeout occurs, and to adjust your\n * poll()/select() timeout accordingly so that you can make a call into the\n * library at that time.\n *\n * Some platforms supported by libusb do not come with this baggage - any\n * events relevant to timing will be represented by activity on the file\n * descriptor set, and libusb_get_next_timeout() will always return 0.\n * This function allows you to detect whether you are running on such a\n * platform.\n *\n * Since v1.0.5.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\returns 0 if you must call into libusb at times determined by\n * libusb_get_next_timeout(), or 1 if all timeout events are handled internally\n * or through regular activity on the file descriptors.\n * \\ref libusb_pollmain \"Polling libusb file descriptors for event handling\"\n */\nint API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx)\n{\n#if defined(USBI_TIMERFD_AVAILABLE)\n\tUSBI_GET_CONTEXT(ctx);\n\treturn usbi_using_timerfd(ctx);\n#else\n\tUNUSED(ctx);\n\treturn 0;\n#endif\n}\n\n/** \\ingroup libusb_poll\n * Determine the next internal timeout that libusb needs to handle. You only\n * need to use this function if you are calling poll() or select() or similar\n * on libusb's file descriptors yourself - you do not need to use it if you\n * are calling libusb_handle_events() or a variant directly.\n *\n * You should call this function in your main loop in order to determine how\n * long to wait for select() or poll() to return results. libusb needs to be\n * called into at this timeout, so you should use it as an upper bound on\n * your select() or poll() call.\n *\n * When the timeout has expired, call into libusb_handle_events_timeout()\n * (perhaps in non-blocking mode) so that libusb can handle the timeout.\n *\n * This function may return 1 (success) and an all-zero timeval. If this is\n * the case, it indicates that libusb has a timeout that has already expired\n * so you should call libusb_handle_events_timeout() or similar immediately.\n * A return code of 0 indicates that there are no pending timeouts.\n *\n * On some platforms, this function will always returns 0 (no pending\n * timeouts). See \\ref polltime.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param tv output location for a relative time against the current\n * clock in which libusb must be called into in order to process timeout events\n * \\returns 0 if there are no pending timeouts, 1 if a timeout was returned,\n * or LIBUSB_ERROR_OTHER on failure\n */\nint API_EXPORTED libusb_get_next_timeout(libusb_context *ctx,\n\tstruct timeval *tv)\n{\n\tstruct usbi_transfer *transfer;\n\tstruct timespec cur_ts;\n\tstruct timeval cur_tv;\n\tstruct timeval next_timeout = { 0, 0 };\n\tint r;\n\n\tUSBI_GET_CONTEXT(ctx);\n\tif (usbi_using_timerfd(ctx))\n\t\treturn 0;\n\n\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\tif (list_empty(&ctx->flying_transfers)) {\n\t\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\t\tusbi_dbg(\"no URBs, no timeout!\");\n\t\treturn 0;\n\t}\n\n\t/* find next transfer which hasn't already been processed as timed out */\n\tlist_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) {\n\t\tif (transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT))\n\t\t\tcontinue;\n\n\t\t/* if we've reached transfers of infinte timeout, we're done looking */\n\t\tif (!timerisset(&transfer->timeout))\n\t\t\tbreak;\n\n\t\tnext_timeout = transfer->timeout;\n\t\tbreak;\n\t}\n\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\n\tif (!timerisset(&next_timeout)) {\n\t\tusbi_dbg(\"no URB with timeout or all handled by OS; no timeout!\");\n\t\treturn 0;\n\t}\n\n\tr = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts);\n\tif (r < 0) {\n\t\tusbi_err(ctx, \"failed to read monotonic clock, errno=%d\", errno);\n\t\treturn 0;\n\t}\n\tTIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts);\n\n\tif (!timercmp(&cur_tv, &next_timeout, <)) {\n\t\tusbi_dbg(\"first timeout already expired\");\n\t\ttimerclear(tv);\n\t} else {\n\t\ttimersub(&next_timeout, &cur_tv, tv);\n\t\tusbi_dbg(\"next timeout in %d.%06ds\", tv->tv_sec, tv->tv_usec);\n\t}\n\n\treturn 1;\n}\n\n/** \\ingroup libusb_poll\n * Register notification functions for file descriptor additions/removals.\n * These functions will be invoked for every new or removed file descriptor\n * that libusb uses as an event source.\n *\n * To remove notifiers, pass NULL values for the function pointers.\n *\n * Note that file descriptors may have been added even before you register\n * these notifiers (e.g. at libusb_init() time).\n *\n * Additionally, note that the removal notifier may be called during\n * libusb_exit() (e.g. when it is closing file descriptors that were opened\n * and added to the poll set at libusb_init() time). If you don't want this,\n * remove the notifiers immediately before calling libusb_exit().\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\param added_cb pointer to function for addition notifications\n * \\param removed_cb pointer to function for removal notifications\n * \\param user_data User data to be passed back to callbacks (useful for\n * passing context information)\n */\nvoid API_EXPORTED libusb_set_pollfd_notifiers(libusb_context *ctx,\n\tlibusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,\n\tvoid *user_data)\n{\n\tUSBI_GET_CONTEXT(ctx);\n\tctx->fd_added_cb = added_cb;\n\tctx->fd_removed_cb = removed_cb;\n\tctx->fd_cb_user_data = user_data;\n}\n\n/*\n * Interrupt the iteration of the event handling thread, so that it picks\n * up the fd change. Callers of this function must hold the event_data_lock.\n */\nstatic void usbi_fd_notification(struct libusb_context *ctx)\n{\n\tint pending_events;\n\n\t/* Record that there is a new poll fd.\n\t * Only signal an event if there are no prior pending events. */\n\tpending_events = usbi_pending_events(ctx);\n\tctx->event_flags |= USBI_EVENT_POLLFDS_MODIFIED;\n\tif (!pending_events)\n\t\tusbi_signal_event(ctx);\n}\n\n/* Add a file descriptor to the list of file descriptors to be monitored.\n * events should be specified as a bitmask of events passed to poll(), e.g.\n * POLLIN and/or POLLOUT. */\nint usbi_add_pollfd(struct libusb_context *ctx, int fd, short events)\n{\n\tstruct usbi_pollfd *ipollfd = malloc(sizeof(*ipollfd));\n\tif (!ipollfd)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tusbi_dbg(\"add fd %d events %d\", fd, events);\n\tipollfd->pollfd.fd = fd;\n\tipollfd->pollfd.events = events;\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tlist_add_tail(&ipollfd->list, &ctx->ipollfds);\n\tctx->pollfds_cnt++;\n\tusbi_fd_notification(ctx);\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n\n\tif (ctx->fd_added_cb)\n\t\tctx->fd_added_cb(fd, events, ctx->fd_cb_user_data);\n\treturn 0;\n}\n\n/* Remove a file descriptor from the list of file descriptors to be polled. */\nvoid usbi_remove_pollfd(struct libusb_context *ctx, int fd)\n{\n\tstruct usbi_pollfd *ipollfd;\n\tint found = 0;\n\n\tusbi_dbg(\"remove fd %d\", fd);\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\tlist_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd)\n\t\tif (ipollfd->pollfd.fd == fd) {\n\t\t\tfound = 1;\n\t\t\tbreak;\n\t\t}\n\n\tif (!found) {\n\t\tusbi_dbg(\"couldn't find fd %d to remove\", fd);\n\t\tusbi_mutex_unlock(&ctx->event_data_lock);\n\t\treturn;\n\t}\n\n\tlist_del(&ipollfd->list);\n\tctx->pollfds_cnt--;\n\tusbi_fd_notification(ctx);\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n\tfree(ipollfd);\n\tif (ctx->fd_removed_cb)\n\t\tctx->fd_removed_cb(fd, ctx->fd_cb_user_data);\n}\n\n/** \\ingroup libusb_poll\n * Retrieve a list of file descriptors that should be polled by your main loop\n * as libusb event sources.\n *\n * The returned list is NULL-terminated and should be freed with libusb_free_pollfds()\n * when done. The actual list contents must not be touched.\n *\n * As file descriptors are a Unix-specific concept, this function is not\n * available on Windows and will always return NULL.\n *\n * \\param ctx the context to operate on, or NULL for the default context\n * \\returns a NULL-terminated list of libusb_pollfd structures\n * \\returns NULL on error\n * \\returns NULL on platforms where the functionality is not available\n */\nDEFAULT_VISIBILITY\nconst struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds(\n\tlibusb_context *ctx)\n{\n#ifndef OS_WINDOWS\n\tstruct libusb_pollfd **ret = NULL;\n\tstruct usbi_pollfd *ipollfd;\n\tsize_t i = 0;\n\tUSBI_GET_CONTEXT(ctx);\n\n\tusbi_mutex_lock(&ctx->event_data_lock);\n\n\tret = calloc(ctx->pollfds_cnt + 1, sizeof(struct libusb_pollfd *));\n\tif (!ret)\n\t\tgoto out;\n\n\tlist_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd)\n\t\tret[i++] = (struct libusb_pollfd *) ipollfd;\n\tret[ctx->pollfds_cnt] = NULL;\n\nout:\n\tusbi_mutex_unlock(&ctx->event_data_lock);\n\treturn (const struct libusb_pollfd **) ret;\n#else\n\tusbi_err(ctx, \"external polling of libusb's internal descriptors \"\\\n\t\t\"is not yet supported on Windows platforms\");\n\treturn NULL;\n#endif\n}\n\n/** \\ingroup libusb_poll\n * Free a list of libusb_pollfd structures. This should be called for all\n * pollfd lists allocated with libusb_get_pollfds().\n *\n * Since version 1.0.20, \\ref LIBUSB_API_VERSION >= 0x01000104\n *\n * It is legal to call this function with a NULL pollfd list. In this case,\n * the function will simply return safely.\n *\n * \\param pollfds the list of libusb_pollfd structures to free\n */\nvoid API_EXPORTED libusb_free_pollfds(const struct libusb_pollfd **pollfds)\n{\n\tif (!pollfds)\n\t\treturn;\n\n\tfree((void *)pollfds);\n}\n\n/* Backends may call this from handle_events to report disconnection of a\n * device. This function ensures transfers get cancelled appropriately.\n * Callers of this function must hold the events_lock.\n */\nvoid usbi_handle_disconnect(struct libusb_device_handle *dev_handle)\n{\n\tstruct usbi_transfer *cur;\n\tstruct usbi_transfer *to_cancel;\n\n\tusbi_dbg(\"device %d.%d\",\n\t\tdev_handle->dev->bus_number, dev_handle->dev->device_address);\n\n\t/* terminate all pending transfers with the LIBUSB_TRANSFER_NO_DEVICE\n\t * status code.\n\t *\n\t * when we find a transfer for this device on the list, there are two\n\t * possible scenarios:\n\t * 1. the transfer is currently in-flight, in which case we terminate the\n\t *    transfer here\n\t * 2. the transfer has been added to the flying transfer list by\n\t *    libusb_submit_transfer, has failed to submit and\n\t *    libusb_submit_transfer is waiting for us to release the\n\t *    flying_transfers_lock to remove it, so we ignore it\n\t */\n\n\twhile (1) {\n\t\tto_cancel = NULL;\n\t\tusbi_mutex_lock(&HANDLE_CTX(dev_handle)->flying_transfers_lock);\n\t\tlist_for_each_entry(cur, &HANDLE_CTX(dev_handle)->flying_transfers, list, struct usbi_transfer)\n\t\t\tif (USBI_TRANSFER_TO_LIBUSB_TRANSFER(cur)->dev_handle == dev_handle) {\n\t\t\t\tusbi_mutex_lock(&cur->lock);\n\t\t\t\tif (cur->state_flags & USBI_TRANSFER_IN_FLIGHT)\n\t\t\t\t\tto_cancel = cur;\n\t\t\t\tusbi_mutex_unlock(&cur->lock);\n\n\t\t\t\tif (to_cancel)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\tusbi_mutex_unlock(&HANDLE_CTX(dev_handle)->flying_transfers_lock);\n\n\t\tif (!to_cancel)\n\t\t\tbreak;\n\n\t\tusbi_dbg(\"cancelling transfer %p from disconnect\",\n\t\t\t USBI_TRANSFER_TO_LIBUSB_TRANSFER(to_cancel));\n\n\t\tusbi_mutex_lock(&to_cancel->lock);\n\t\tusbi_backend->clear_transfer_priv(to_cancel);\n\t\tusbi_mutex_unlock(&to_cancel->lock);\n\t\tusbi_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE);\n\t}\n\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/libusb.h",
    "content": "/*\n * Public libusb header file\n * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\n * Copyright © 2007-2008 Daniel Drake <dsd@gentoo.org>\n * Copyright © 2012 Pete Batard <pete@akeo.ie>\n * Copyright © 2012 Nathan Hjelm <hjelmn@cs.unm.edu>\n * For more information, please visit: http://libusb.info\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBUSB_H\n#define LIBUSB_H\n\n#ifdef _MSC_VER\n/* on MS environments, the inline keyword is available in C++ only */\n#if !defined(__cplusplus)\n#define inline __inline\n#endif\n/* ssize_t is also not available (copy/paste from MinGW) */\n#ifndef _SSIZE_T_DEFINED\n#define _SSIZE_T_DEFINED\n#undef ssize_t\n#ifdef _WIN64\n  typedef __int64 ssize_t;\n#else\n  typedef int ssize_t;\n#endif /* _WIN64 */\n#endif /* _SSIZE_T_DEFINED */\n#endif /* _MSC_VER */\n\n/* stdint.h is not available on older MSVC */\n#if defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H))\ntypedef unsigned __int8   uint8_t;\ntypedef unsigned __int16  uint16_t;\ntypedef unsigned __int32  uint32_t;\n#else\n#include <stdint.h>\n#endif\n\n#if !defined(_WIN32_WCE)\n#include <sys/types.h>\n#endif\n\n#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__HAIKU__)\n#include <sys/time.h>\n#endif\n\n#include <time.h>\n#include <limits.h>\n\n/* 'interface' might be defined as a macro on Windows, so we need to\n * undefine it so as not to break the current libusb API, because\n * libusb_config_descriptor has an 'interface' member\n * As this can be problematic if you include windows.h after libusb.h\n * in your sources, we force windows.h to be included first. */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n#include <windows.h>\n#if defined(interface)\n#undef interface\n#endif\n#if !defined(__CYGWIN__)\n#include <winsock.h>\n#endif\n#endif\n\n#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)\n#define LIBUSB_DEPRECATED_FOR(f) \\\n  __attribute__((deprecated(\"Use \" #f \" instead\")))\n#else\n#define LIBUSB_DEPRECATED_FOR(f)\n#endif /* __GNUC__ */\n\n/** \\def LIBUSB_CALL\n * \\ingroup libusb_misc\n * libusb's Windows calling convention.\n *\n * Under Windows, the selection of available compilers and configurations\n * means that, unlike other platforms, there is not <em>one true calling\n * convention</em> (calling convention: the manner in which parameters are\n * passed to functions in the generated assembly code).\n *\n * Matching the Windows API itself, libusb uses the WINAPI convention (which\n * translates to the <tt>stdcall</tt> convention) and guarantees that the\n * library is compiled in this way. The public header file also includes\n * appropriate annotations so that your own software will use the right\n * convention, even if another convention is being used by default within\n * your codebase.\n *\n * The one consideration that you must apply in your software is to mark\n * all functions which you use as libusb callbacks with this LIBUSB_CALL\n * annotation, so that they too get compiled for the correct calling\n * convention.\n *\n * On non-Windows operating systems, this macro is defined as nothing. This\n * means that you can apply it to your code without worrying about\n * cross-platform compatibility.\n */\n/* LIBUSB_CALL must be defined on both definition and declaration of libusb\n * functions. You'd think that declaration would be enough, but cygwin will\n * complain about conflicting types unless both are marked this way.\n * The placement of this macro is important too; it must appear after the\n * return type, before the function name. See internal documentation for\n * API_EXPORTED.\n */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n#define LIBUSB_CALL WINAPI\n#else\n#define LIBUSB_CALL\n#endif\n\n/** \\def LIBUSB_API_VERSION\n * \\ingroup libusb_misc\n * libusb's API version.\n *\n * Since version 1.0.13, to help with feature detection, libusb defines\n * a LIBUSB_API_VERSION macro that gets increased every time there is a\n * significant change to the API, such as the introduction of a new call,\n * the definition of a new macro/enum member, or any other element that\n * libusb applications may want to detect at compilation time.\n *\n * The macro is typically used in an application as follows:\n * \\code\n * #if defined(LIBUSB_API_VERSION) && (LIBUSB_API_VERSION >= 0x01001234)\n * // Use one of the newer features from the libusb API\n * #endif\n * \\endcode\n *\n * Internally, LIBUSB_API_VERSION is defined as follows:\n * (libusb major << 24) | (libusb minor << 16) | (16 bit incremental)\n */\n#define LIBUSB_API_VERSION 0x01000105\n\n/* The following is kept for compatibility, but will be deprecated in the future */\n#define LIBUSBX_API_VERSION LIBUSB_API_VERSION\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\ingroup libusb_misc\n * Convert a 16-bit value from host-endian to little-endian format. On\n * little endian systems, this function does nothing. On big endian systems,\n * the bytes are swapped.\n * \\param x the host-endian value to convert\n * \\returns the value in little-endian byte order\n */\nstatic inline uint16_t libusb_cpu_to_le16(const uint16_t x)\n{\n\tunion {\n\t\tuint8_t  b8[2];\n\t\tuint16_t b16;\n\t} _tmp;\n\t_tmp.b8[1] = (uint8_t) (x >> 8);\n\t_tmp.b8[0] = (uint8_t) (x & 0xff);\n\treturn _tmp.b16;\n}\n\n/** \\def libusb_le16_to_cpu\n * \\ingroup libusb_misc\n * Convert a 16-bit value from little-endian to host-endian format. On\n * little endian systems, this function does nothing. On big endian systems,\n * the bytes are swapped.\n * \\param x the little-endian value to convert\n * \\returns the value in host-endian byte order\n */\n#define libusb_le16_to_cpu libusb_cpu_to_le16\n\n/* standard USB stuff */\n\n/** \\ingroup libusb_desc\n * Device and/or Interface Class codes */\nenum libusb_class_code {\n\t/** In the context of a \\ref libusb_device_descriptor \"device descriptor\",\n\t * this bDeviceClass value indicates that each interface specifies its\n\t * own class information and all interfaces operate independently.\n\t */\n\tLIBUSB_CLASS_PER_INTERFACE = 0,\n\n\t/** Audio class */\n\tLIBUSB_CLASS_AUDIO = 1,\n\n\t/** Communications class */\n\tLIBUSB_CLASS_COMM = 2,\n\n\t/** Human Interface Device class */\n\tLIBUSB_CLASS_HID = 3,\n\n\t/** Physical */\n\tLIBUSB_CLASS_PHYSICAL = 5,\n\n\t/** Printer class */\n\tLIBUSB_CLASS_PRINTER = 7,\n\n\t/** Image class */\n\tLIBUSB_CLASS_PTP = 6, /* legacy name from libusb-0.1 usb.h */\n\tLIBUSB_CLASS_IMAGE = 6,\n\n\t/** Mass storage class */\n\tLIBUSB_CLASS_MASS_STORAGE = 8,\n\n\t/** Hub class */\n\tLIBUSB_CLASS_HUB = 9,\n\n\t/** Data class */\n\tLIBUSB_CLASS_DATA = 10,\n\n\t/** Smart Card */\n\tLIBUSB_CLASS_SMART_CARD = 0x0b,\n\n\t/** Content Security */\n\tLIBUSB_CLASS_CONTENT_SECURITY = 0x0d,\n\n\t/** Video */\n\tLIBUSB_CLASS_VIDEO = 0x0e,\n\n\t/** Personal Healthcare */\n\tLIBUSB_CLASS_PERSONAL_HEALTHCARE = 0x0f,\n\n\t/** Diagnostic Device */\n\tLIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc,\n\n\t/** Wireless class */\n\tLIBUSB_CLASS_WIRELESS = 0xe0,\n\n\t/** Application class */\n\tLIBUSB_CLASS_APPLICATION = 0xfe,\n\n\t/** Class is vendor-specific */\n\tLIBUSB_CLASS_VENDOR_SPEC = 0xff\n};\n\n/** \\ingroup libusb_desc\n * Descriptor types as defined by the USB specification. */\nenum libusb_descriptor_type {\n\t/** Device descriptor. See libusb_device_descriptor. */\n\tLIBUSB_DT_DEVICE = 0x01,\n\n\t/** Configuration descriptor. See libusb_config_descriptor. */\n\tLIBUSB_DT_CONFIG = 0x02,\n\n\t/** String descriptor */\n\tLIBUSB_DT_STRING = 0x03,\n\n\t/** Interface descriptor. See libusb_interface_descriptor. */\n\tLIBUSB_DT_INTERFACE = 0x04,\n\n\t/** Endpoint descriptor. See libusb_endpoint_descriptor. */\n\tLIBUSB_DT_ENDPOINT = 0x05,\n\n\t/** BOS descriptor */\n\tLIBUSB_DT_BOS = 0x0f,\n\n\t/** Device Capability descriptor */\n\tLIBUSB_DT_DEVICE_CAPABILITY = 0x10,\n\n\t/** HID descriptor */\n\tLIBUSB_DT_HID = 0x21,\n\n\t/** HID report descriptor */\n\tLIBUSB_DT_REPORT = 0x22,\n\n\t/** Physical descriptor */\n\tLIBUSB_DT_PHYSICAL = 0x23,\n\n\t/** Hub descriptor */\n\tLIBUSB_DT_HUB = 0x29,\n\n\t/** SuperSpeed Hub descriptor */\n\tLIBUSB_DT_SUPERSPEED_HUB = 0x2a,\n\n\t/** SuperSpeed Endpoint Companion descriptor */\n\tLIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30\n};\n\n/* Descriptor sizes per descriptor type */\n#define LIBUSB_DT_DEVICE_SIZE\t\t\t18\n#define LIBUSB_DT_CONFIG_SIZE\t\t\t9\n#define LIBUSB_DT_INTERFACE_SIZE\t\t9\n#define LIBUSB_DT_ENDPOINT_SIZE\t\t\t7\n#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE\t\t9\t/* Audio extension */\n#define LIBUSB_DT_HUB_NONVAR_SIZE\t\t7\n#define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE\t6\n#define LIBUSB_DT_BOS_SIZE\t\t\t5\n#define LIBUSB_DT_DEVICE_CAPABILITY_SIZE\t3\n\n/* BOS descriptor sizes */\n#define LIBUSB_BT_USB_2_0_EXTENSION_SIZE\t7\n#define LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE\t10\n#define LIBUSB_BT_CONTAINER_ID_SIZE\t\t20\n\n/* We unwrap the BOS => define its max size */\n#define LIBUSB_DT_BOS_MAX_SIZE\t\t((LIBUSB_DT_BOS_SIZE)     +\\\n\t\t\t\t\t(LIBUSB_BT_USB_2_0_EXTENSION_SIZE)       +\\\n\t\t\t\t\t(LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) +\\\n\t\t\t\t\t(LIBUSB_BT_CONTAINER_ID_SIZE))\n\n#define LIBUSB_ENDPOINT_ADDRESS_MASK\t0x0f    /* in bEndpointAddress */\n#define LIBUSB_ENDPOINT_DIR_MASK\t\t0x80\n\n/** \\ingroup libusb_desc\n * Endpoint direction. Values for bit 7 of the\n * \\ref libusb_endpoint_descriptor::bEndpointAddress \"endpoint address\" scheme.\n */\nenum libusb_endpoint_direction {\n\t/** In: device-to-host */\n\tLIBUSB_ENDPOINT_IN = 0x80,\n\n\t/** Out: host-to-device */\n\tLIBUSB_ENDPOINT_OUT = 0x00\n};\n\n#define LIBUSB_TRANSFER_TYPE_MASK\t\t\t0x03    /* in bmAttributes */\n\n/** \\ingroup libusb_desc\n * Endpoint transfer type. Values for bits 0:1 of the\n * \\ref libusb_endpoint_descriptor::bmAttributes \"endpoint attributes\" field.\n */\nenum libusb_transfer_type {\n\t/** Control endpoint */\n\tLIBUSB_TRANSFER_TYPE_CONTROL = 0,\n\n\t/** Isochronous endpoint */\n\tLIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1,\n\n\t/** Bulk endpoint */\n\tLIBUSB_TRANSFER_TYPE_BULK = 2,\n\n\t/** Interrupt endpoint */\n\tLIBUSB_TRANSFER_TYPE_INTERRUPT = 3,\n\n\t/** Stream endpoint */\n\tLIBUSB_TRANSFER_TYPE_BULK_STREAM = 4,\n};\n\n/** \\ingroup libusb_misc\n * Standard requests, as defined in table 9-5 of the USB 3.0 specifications */\nenum libusb_standard_request {\n\t/** Request status of the specific recipient */\n\tLIBUSB_REQUEST_GET_STATUS = 0x00,\n\n\t/** Clear or disable a specific feature */\n\tLIBUSB_REQUEST_CLEAR_FEATURE = 0x01,\n\n\t/* 0x02 is reserved */\n\n\t/** Set or enable a specific feature */\n\tLIBUSB_REQUEST_SET_FEATURE = 0x03,\n\n\t/* 0x04 is reserved */\n\n\t/** Set device address for all future accesses */\n\tLIBUSB_REQUEST_SET_ADDRESS = 0x05,\n\n\t/** Get the specified descriptor */\n\tLIBUSB_REQUEST_GET_DESCRIPTOR = 0x06,\n\n\t/** Used to update existing descriptors or add new descriptors */\n\tLIBUSB_REQUEST_SET_DESCRIPTOR = 0x07,\n\n\t/** Get the current device configuration value */\n\tLIBUSB_REQUEST_GET_CONFIGURATION = 0x08,\n\n\t/** Set device configuration */\n\tLIBUSB_REQUEST_SET_CONFIGURATION = 0x09,\n\n\t/** Return the selected alternate setting for the specified interface */\n\tLIBUSB_REQUEST_GET_INTERFACE = 0x0A,\n\n\t/** Select an alternate interface for the specified interface */\n\tLIBUSB_REQUEST_SET_INTERFACE = 0x0B,\n\n\t/** Set then report an endpoint's synchronization frame */\n\tLIBUSB_REQUEST_SYNCH_FRAME = 0x0C,\n\n\t/** Sets both the U1 and U2 Exit Latency */\n\tLIBUSB_REQUEST_SET_SEL = 0x30,\n\n\t/** Delay from the time a host transmits a packet to the time it is\n\t  * received by the device. */\n\tLIBUSB_SET_ISOCH_DELAY = 0x31,\n};\n\n/** \\ingroup libusb_misc\n * Request type bits of the\n * \\ref libusb_control_setup::bmRequestType \"bmRequestType\" field in control\n * transfers. */\nenum libusb_request_type {\n\t/** Standard */\n\tLIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5),\n\n\t/** Class */\n\tLIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5),\n\n\t/** Vendor */\n\tLIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5),\n\n\t/** Reserved */\n\tLIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5)\n};\n\n/** \\ingroup libusb_misc\n * Recipient bits of the\n * \\ref libusb_control_setup::bmRequestType \"bmRequestType\" field in control\n * transfers. Values 4 through 31 are reserved. */\nenum libusb_request_recipient {\n\t/** Device */\n\tLIBUSB_RECIPIENT_DEVICE = 0x00,\n\n\t/** Interface */\n\tLIBUSB_RECIPIENT_INTERFACE = 0x01,\n\n\t/** Endpoint */\n\tLIBUSB_RECIPIENT_ENDPOINT = 0x02,\n\n\t/** Other */\n\tLIBUSB_RECIPIENT_OTHER = 0x03,\n};\n\n#define LIBUSB_ISO_SYNC_TYPE_MASK\t\t0x0C\n\n/** \\ingroup libusb_desc\n * Synchronization type for isochronous endpoints. Values for bits 2:3 of the\n * \\ref libusb_endpoint_descriptor::bmAttributes \"bmAttributes\" field in\n * libusb_endpoint_descriptor.\n */\nenum libusb_iso_sync_type {\n\t/** No synchronization */\n\tLIBUSB_ISO_SYNC_TYPE_NONE = 0,\n\n\t/** Asynchronous */\n\tLIBUSB_ISO_SYNC_TYPE_ASYNC = 1,\n\n\t/** Adaptive */\n\tLIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2,\n\n\t/** Synchronous */\n\tLIBUSB_ISO_SYNC_TYPE_SYNC = 3\n};\n\n#define LIBUSB_ISO_USAGE_TYPE_MASK 0x30\n\n/** \\ingroup libusb_desc\n * Usage type for isochronous endpoints. Values for bits 4:5 of the\n * \\ref libusb_endpoint_descriptor::bmAttributes \"bmAttributes\" field in\n * libusb_endpoint_descriptor.\n */\nenum libusb_iso_usage_type {\n\t/** Data endpoint */\n\tLIBUSB_ISO_USAGE_TYPE_DATA = 0,\n\n\t/** Feedback endpoint */\n\tLIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1,\n\n\t/** Implicit feedback Data endpoint */\n\tLIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2,\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the standard USB device descriptor. This\n * descriptor is documented in section 9.6.1 of the USB 3.0 specification.\n * All multiple-byte fields are represented in host-endian format.\n */\nstruct libusb_device_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_DEVICE LIBUSB_DT_DEVICE in this\n\t * context. */\n\tuint8_t  bDescriptorType;\n\n\t/** USB specification release number in binary-coded decimal. A value of\n\t * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */\n\tuint16_t bcdUSB;\n\n\t/** USB-IF class code for the device. See \\ref libusb_class_code. */\n\tuint8_t  bDeviceClass;\n\n\t/** USB-IF subclass code for the device, qualified by the bDeviceClass\n\t * value */\n\tuint8_t  bDeviceSubClass;\n\n\t/** USB-IF protocol code for the device, qualified by the bDeviceClass and\n\t * bDeviceSubClass values */\n\tuint8_t  bDeviceProtocol;\n\n\t/** Maximum packet size for endpoint 0 */\n\tuint8_t  bMaxPacketSize0;\n\n\t/** USB-IF vendor ID */\n\tuint16_t idVendor;\n\n\t/** USB-IF product ID */\n\tuint16_t idProduct;\n\n\t/** Device release number in binary-coded decimal */\n\tuint16_t bcdDevice;\n\n\t/** Index of string descriptor describing manufacturer */\n\tuint8_t  iManufacturer;\n\n\t/** Index of string descriptor describing product */\n\tuint8_t  iProduct;\n\n\t/** Index of string descriptor containing device serial number */\n\tuint8_t  iSerialNumber;\n\n\t/** Number of possible configurations */\n\tuint8_t  bNumConfigurations;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the standard USB endpoint descriptor. This\n * descriptor is documented in section 9.6.6 of the USB 3.0 specification.\n * All multiple-byte fields are represented in host-endian format.\n */\nstruct libusb_endpoint_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_ENDPOINT LIBUSB_DT_ENDPOINT in\n\t * this context. */\n\tuint8_t  bDescriptorType;\n\n\t/** The address of the endpoint described by this descriptor. Bits 0:3 are\n\t * the endpoint number. Bits 4:6 are reserved. Bit 7 indicates direction,\n\t * see \\ref libusb_endpoint_direction.\n\t */\n\tuint8_t  bEndpointAddress;\n\n\t/** Attributes which apply to the endpoint when it is configured using\n\t * the bConfigurationValue. Bits 0:1 determine the transfer type and\n\t * correspond to \\ref libusb_transfer_type. Bits 2:3 are only used for\n\t * isochronous endpoints and correspond to \\ref libusb_iso_sync_type.\n\t * Bits 4:5 are also only used for isochronous endpoints and correspond to\n\t * \\ref libusb_iso_usage_type. Bits 6:7 are reserved.\n\t */\n\tuint8_t  bmAttributes;\n\n\t/** Maximum packet size this endpoint is capable of sending/receiving. */\n\tuint16_t wMaxPacketSize;\n\n\t/** Interval for polling endpoint for data transfers. */\n\tuint8_t  bInterval;\n\n\t/** For audio devices only: the rate at which synchronization feedback\n\t * is provided. */\n\tuint8_t  bRefresh;\n\n\t/** For audio devices only: the address if the synch endpoint */\n\tuint8_t  bSynchAddress;\n\n\t/** Extra descriptors. If libusb encounters unknown endpoint descriptors,\n\t * it will store them here, should you wish to parse them. */\n\tconst unsigned char *extra;\n\n\t/** Length of the extra descriptors, in bytes. */\n\tint extra_length;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the standard USB interface descriptor. This\n * descriptor is documented in section 9.6.5 of the USB 3.0 specification.\n * All multiple-byte fields are represented in host-endian format.\n */\nstruct libusb_interface_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_INTERFACE LIBUSB_DT_INTERFACE\n\t * in this context. */\n\tuint8_t  bDescriptorType;\n\n\t/** Number of this interface */\n\tuint8_t  bInterfaceNumber;\n\n\t/** Value used to select this alternate setting for this interface */\n\tuint8_t  bAlternateSetting;\n\n\t/** Number of endpoints used by this interface (excluding the control\n\t * endpoint). */\n\tuint8_t  bNumEndpoints;\n\n\t/** USB-IF class code for this interface. See \\ref libusb_class_code. */\n\tuint8_t  bInterfaceClass;\n\n\t/** USB-IF subclass code for this interface, qualified by the\n\t * bInterfaceClass value */\n\tuint8_t  bInterfaceSubClass;\n\n\t/** USB-IF protocol code for this interface, qualified by the\n\t * bInterfaceClass and bInterfaceSubClass values */\n\tuint8_t  bInterfaceProtocol;\n\n\t/** Index of string descriptor describing this interface */\n\tuint8_t  iInterface;\n\n\t/** Array of endpoint descriptors. This length of this array is determined\n\t * by the bNumEndpoints field. */\n\tconst struct libusb_endpoint_descriptor *endpoint;\n\n\t/** Extra descriptors. If libusb encounters unknown interface descriptors,\n\t * it will store them here, should you wish to parse them. */\n\tconst unsigned char *extra;\n\n\t/** Length of the extra descriptors, in bytes. */\n\tint extra_length;\n};\n\n/** \\ingroup libusb_desc\n * A collection of alternate settings for a particular USB interface.\n */\nstruct libusb_interface {\n\t/** Array of interface descriptors. The length of this array is determined\n\t * by the num_altsetting field. */\n\tconst struct libusb_interface_descriptor *altsetting;\n\n\t/** The number of alternate settings that belong to this interface */\n\tint num_altsetting;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the standard USB configuration descriptor. This\n * descriptor is documented in section 9.6.3 of the USB 3.0 specification.\n * All multiple-byte fields are represented in host-endian format.\n */\nstruct libusb_config_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_CONFIG LIBUSB_DT_CONFIG\n\t * in this context. */\n\tuint8_t  bDescriptorType;\n\n\t/** Total length of data returned for this configuration */\n\tuint16_t wTotalLength;\n\n\t/** Number of interfaces supported by this configuration */\n\tuint8_t  bNumInterfaces;\n\n\t/** Identifier value for this configuration */\n\tuint8_t  bConfigurationValue;\n\n\t/** Index of string descriptor describing this configuration */\n\tuint8_t  iConfiguration;\n\n\t/** Configuration characteristics */\n\tuint8_t  bmAttributes;\n\n\t/** Maximum power consumption of the USB device from this bus in this\n\t * configuration when the device is fully operation. Expressed in units\n\t * of 2 mA when the device is operating in high-speed mode and in units\n\t * of 8 mA when the device is operating in super-speed mode. */\n\tuint8_t  MaxPower;\n\n\t/** Array of interfaces supported by this configuration. The length of\n\t * this array is determined by the bNumInterfaces field. */\n\tconst struct libusb_interface *interface;\n\n\t/** Extra descriptors. If libusb encounters unknown configuration\n\t * descriptors, it will store them here, should you wish to parse them. */\n\tconst unsigned char *extra;\n\n\t/** Length of the extra descriptors, in bytes. */\n\tint extra_length;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the superspeed endpoint companion\n * descriptor. This descriptor is documented in section 9.6.7 of\n * the USB 3.0 specification. All multiple-byte fields are represented in\n * host-endian format.\n */\nstruct libusb_ss_endpoint_companion_descriptor {\n\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_SS_ENDPOINT_COMPANION in\n\t * this context. */\n\tuint8_t  bDescriptorType;\n\n\n\t/** The maximum number of packets the endpoint can send or\n\t *  receive as part of a burst. */\n\tuint8_t  bMaxBurst;\n\n\t/** In bulk EP:\tbits 4:0 represents the\tmaximum\tnumber of\n\t *  streams the\tEP supports. In\tisochronous EP:\tbits 1:0\n\t *  represents the Mult\t- a zero based value that determines\n\t *  the\tmaximum\tnumber of packets within a service interval  */\n\tuint8_t  bmAttributes;\n\n\t/** The\ttotal number of bytes this EP will transfer every\n\t *  service interval. valid only for periodic EPs. */\n\tuint16_t wBytesPerInterval;\n};\n\n/** \\ingroup libusb_desc\n * A generic representation of a BOS Device Capability descriptor. It is\n * advised to check bDevCapabilityType and call the matching\n * libusb_get_*_descriptor function to get a structure fully matching the type.\n */\nstruct libusb_bos_dev_capability_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t bLength;\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY\n\t * LIBUSB_DT_DEVICE_CAPABILITY in this context. */\n\tuint8_t bDescriptorType;\n\t/** Device Capability type */\n\tuint8_t bDevCapabilityType;\n\t/** Device Capability data (bLength - 3 bytes) */\n\tuint8_t dev_capability_data\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n\t[] /* valid C99 code */\n#else\n\t[0] /* non-standard, but usually working code */\n#endif\n\t;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the Binary Device Object Store (BOS) descriptor.\n * This descriptor is documented in section 9.6.2 of the USB 3.0 specification.\n * All multiple-byte fields are represented in host-endian format.\n */\nstruct libusb_bos_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_BOS LIBUSB_DT_BOS\n\t * in this context. */\n\tuint8_t  bDescriptorType;\n\n\t/** Length of this descriptor and all of its sub descriptors */\n\tuint16_t wTotalLength;\n\n\t/** The number of separate device capability descriptors in\n\t * the BOS */\n\tuint8_t  bNumDeviceCaps;\n\n\t/** bNumDeviceCap Device Capability Descriptors */\n\tstruct libusb_bos_dev_capability_descriptor *dev_capability\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n\t[] /* valid C99 code */\n#else\n\t[0] /* non-standard, but usually working code */\n#endif\n\t;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the USB 2.0 Extension descriptor\n * This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification.\n * All multiple-byte fields are represented in host-endian format.\n */\nstruct libusb_usb_2_0_extension_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY\n\t * LIBUSB_DT_DEVICE_CAPABILITY in this context. */\n\tuint8_t  bDescriptorType;\n\n\t/** Capability type. Will have value\n\t * \\ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION\n\t * LIBUSB_BT_USB_2_0_EXTENSION in this context. */\n\tuint8_t  bDevCapabilityType;\n\n\t/** Bitmap encoding of supported device level features.\n\t * A value of one in a bit location indicates a feature is\n\t * supported; a value of zero indicates it is not supported.\n\t * See \\ref libusb_usb_2_0_extension_attributes. */\n\tuint32_t  bmAttributes;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the SuperSpeed USB Device Capability descriptor\n * This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification.\n * All multiple-byte fields are represented in host-endian format.\n */\nstruct libusb_ss_usb_device_capability_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY\n\t * LIBUSB_DT_DEVICE_CAPABILITY in this context. */\n\tuint8_t  bDescriptorType;\n\n\t/** Capability type. Will have value\n\t * \\ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY\n\t * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY in this context. */\n\tuint8_t  bDevCapabilityType;\n\n\t/** Bitmap encoding of supported device level features.\n\t * A value of one in a bit location indicates a feature is\n\t * supported; a value of zero indicates it is not supported.\n\t * See \\ref libusb_ss_usb_device_capability_attributes. */\n\tuint8_t  bmAttributes;\n\n\t/** Bitmap encoding of the speed supported by this device when\n\t * operating in SuperSpeed mode. See \\ref libusb_supported_speed. */\n\tuint16_t wSpeedSupported;\n\n\t/** The lowest speed at which all the functionality supported\n\t * by the device is available to the user. For example if the\n\t * device supports all its functionality when connected at\n\t * full speed and above then it sets this value to 1. */\n\tuint8_t  bFunctionalitySupport;\n\n\t/** U1 Device Exit Latency. */\n\tuint8_t  bU1DevExitLat;\n\n\t/** U2 Device Exit Latency. */\n\tuint16_t bU2DevExitLat;\n};\n\n/** \\ingroup libusb_desc\n * A structure representing the Container ID descriptor.\n * This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification.\n * All multiple-byte fields, except UUIDs, are represented in host-endian format.\n */\nstruct libusb_container_id_descriptor {\n\t/** Size of this descriptor (in bytes) */\n\tuint8_t  bLength;\n\n\t/** Descriptor type. Will have value\n\t * \\ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY\n\t * LIBUSB_DT_DEVICE_CAPABILITY in this context. */\n\tuint8_t  bDescriptorType;\n\n\t/** Capability type. Will have value\n\t * \\ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID\n\t * LIBUSB_BT_CONTAINER_ID in this context. */\n\tuint8_t  bDevCapabilityType;\n\n\t/** Reserved field */\n\tuint8_t bReserved;\n\n\t/** 128 bit UUID */\n\tuint8_t  ContainerID[16];\n};\n\n/** \\ingroup libusb_asyncio\n * Setup packet for control transfers. */\nstruct libusb_control_setup {\n\t/** Request type. Bits 0:4 determine recipient, see\n\t * \\ref libusb_request_recipient. Bits 5:6 determine type, see\n\t * \\ref libusb_request_type. Bit 7 determines data transfer direction, see\n\t * \\ref libusb_endpoint_direction.\n\t */\n\tuint8_t  bmRequestType;\n\n\t/** Request. If the type bits of bmRequestType are equal to\n\t * \\ref libusb_request_type::LIBUSB_REQUEST_TYPE_STANDARD\n\t * \"LIBUSB_REQUEST_TYPE_STANDARD\" then this field refers to\n\t * \\ref libusb_standard_request. For other cases, use of this field is\n\t * application-specific. */\n\tuint8_t  bRequest;\n\n\t/** Value. Varies according to request */\n\tuint16_t wValue;\n\n\t/** Index. Varies according to request, typically used to pass an index\n\t * or offset */\n\tuint16_t wIndex;\n\n\t/** Number of bytes to transfer */\n\tuint16_t wLength;\n};\n\n#define LIBUSB_CONTROL_SETUP_SIZE (sizeof(struct libusb_control_setup))\n\n/* libusb */\n\nstruct libusb_context;\nstruct libusb_device;\nstruct libusb_device_handle;\n\n/** \\ingroup libusb_lib\n * Structure providing the version of the libusb runtime\n */\nstruct libusb_version {\n\t/** Library major version. */\n\tconst uint16_t major;\n\n\t/** Library minor version. */\n\tconst uint16_t minor;\n\n\t/** Library micro version. */\n\tconst uint16_t micro;\n\n\t/** Library nano version. */\n\tconst uint16_t nano;\n\n\t/** Library release candidate suffix string, e.g. \"-rc4\". */\n\tconst char *rc;\n\n\t/** For ABI compatibility only. */\n\tconst char* describe;\n};\n\n/** \\ingroup libusb_lib\n * Structure representing a libusb session. The concept of individual libusb\n * sessions allows for your program to use two libraries (or dynamically\n * load two modules) which both independently use libusb. This will prevent\n * interference between the individual libusb users - for example\n * libusb_set_debug() will not affect the other user of the library, and\n * libusb_exit() will not destroy resources that the other user is still\n * using.\n *\n * Sessions are created by libusb_init() and destroyed through libusb_exit().\n * If your application is guaranteed to only ever include a single libusb\n * user (i.e. you), you do not have to worry about contexts: pass NULL in\n * every function call where a context is required. The default context\n * will be used.\n *\n * For more information, see \\ref libusb_contexts.\n */\ntypedef struct libusb_context libusb_context;\n\n/** \\ingroup libusb_dev\n * Structure representing a USB device detected on the system. This is an\n * opaque type for which you are only ever provided with a pointer, usually\n * originating from libusb_get_device_list().\n *\n * Certain operations can be performed on a device, but in order to do any\n * I/O you will have to first obtain a device handle using libusb_open().\n *\n * Devices are reference counted with libusb_ref_device() and\n * libusb_unref_device(), and are freed when the reference count reaches 0.\n * New devices presented by libusb_get_device_list() have a reference count of\n * 1, and libusb_free_device_list() can optionally decrease the reference count\n * on all devices in the list. libusb_open() adds another reference which is\n * later destroyed by libusb_close().\n */\ntypedef struct libusb_device libusb_device;\n\n\n/** \\ingroup libusb_dev\n * Structure representing a handle on a USB device. This is an opaque type for\n * which you are only ever provided with a pointer, usually originating from\n * libusb_open().\n *\n * A device handle is used to perform I/O and other operations. When finished\n * with a device handle, you should call libusb_close().\n */\ntypedef struct libusb_device_handle libusb_device_handle;\n\n/** \\ingroup libusb_dev\n * Speed codes. Indicates the speed at which the device is operating.\n */\nenum libusb_speed {\n\t/** The OS doesn't report or know the device speed. */\n\tLIBUSB_SPEED_UNKNOWN = 0,\n\n\t/** The device is operating at low speed (1.5MBit/s). */\n\tLIBUSB_SPEED_LOW = 1,\n\n\t/** The device is operating at full speed (12MBit/s). */\n\tLIBUSB_SPEED_FULL = 2,\n\n\t/** The device is operating at high speed (480MBit/s). */\n\tLIBUSB_SPEED_HIGH = 3,\n\n\t/** The device is operating at super speed (5000MBit/s). */\n\tLIBUSB_SPEED_SUPER = 4,\n};\n\n/** \\ingroup libusb_dev\n * Supported speeds (wSpeedSupported) bitfield. Indicates what\n * speeds the device supports.\n */\nenum libusb_supported_speed {\n\t/** Low speed operation supported (1.5MBit/s). */\n\tLIBUSB_LOW_SPEED_OPERATION   = 1,\n\n\t/** Full speed operation supported (12MBit/s). */\n\tLIBUSB_FULL_SPEED_OPERATION  = 2,\n\n\t/** High speed operation supported (480MBit/s). */\n\tLIBUSB_HIGH_SPEED_OPERATION  = 4,\n\n\t/** Superspeed operation supported (5000MBit/s). */\n\tLIBUSB_SUPER_SPEED_OPERATION = 8,\n};\n\n/** \\ingroup libusb_dev\n * Masks for the bits of the\n * \\ref libusb_usb_2_0_extension_descriptor::bmAttributes \"bmAttributes\" field\n * of the USB 2.0 Extension descriptor.\n */\nenum libusb_usb_2_0_extension_attributes {\n\t/** Supports Link Power Management (LPM) */\n\tLIBUSB_BM_LPM_SUPPORT = 2,\n};\n\n/** \\ingroup libusb_dev\n * Masks for the bits of the\n * \\ref libusb_ss_usb_device_capability_descriptor::bmAttributes \"bmAttributes\" field\n * field of the SuperSpeed USB Device Capability descriptor.\n */\nenum libusb_ss_usb_device_capability_attributes {\n\t/** Supports Latency Tolerance Messages (LTM) */\n\tLIBUSB_BM_LTM_SUPPORT = 2,\n};\n\n/** \\ingroup libusb_dev\n * USB capability types\n */\nenum libusb_bos_type {\n\t/** Wireless USB device capability */\n\tLIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY\t= 1,\n\n\t/** USB 2.0 extensions */\n\tLIBUSB_BT_USB_2_0_EXTENSION\t\t\t= 2,\n\n\t/** SuperSpeed USB device capability */\n\tLIBUSB_BT_SS_USB_DEVICE_CAPABILITY\t\t= 3,\n\n\t/** Container ID type */\n\tLIBUSB_BT_CONTAINER_ID\t\t\t\t= 4,\n};\n\n/** \\ingroup libusb_misc\n * Error codes. Most libusb functions return 0 on success or one of these\n * codes on failure.\n * You can call libusb_error_name() to retrieve a string representation of an\n * error code or libusb_strerror() to get an end-user suitable description of\n * an error code.\n */\nenum libusb_error {\n\t/** Success (no error) */\n\tLIBUSB_SUCCESS = 0,\n\n\t/** Input/output error */\n\tLIBUSB_ERROR_IO = -1,\n\n\t/** Invalid parameter */\n\tLIBUSB_ERROR_INVALID_PARAM = -2,\n\n\t/** Access denied (insufficient permissions) */\n\tLIBUSB_ERROR_ACCESS = -3,\n\n\t/** No such device (it may have been disconnected) */\n\tLIBUSB_ERROR_NO_DEVICE = -4,\n\n\t/** Entity not found */\n\tLIBUSB_ERROR_NOT_FOUND = -5,\n\n\t/** Resource busy */\n\tLIBUSB_ERROR_BUSY = -6,\n\n\t/** Operation timed out */\n\tLIBUSB_ERROR_TIMEOUT = -7,\n\n\t/** Overflow */\n\tLIBUSB_ERROR_OVERFLOW = -8,\n\n\t/** Pipe error */\n\tLIBUSB_ERROR_PIPE = -9,\n\n\t/** System call interrupted (perhaps due to signal) */\n\tLIBUSB_ERROR_INTERRUPTED = -10,\n\n\t/** Insufficient memory */\n\tLIBUSB_ERROR_NO_MEM = -11,\n\n\t/** Operation not supported or unimplemented on this platform */\n\tLIBUSB_ERROR_NOT_SUPPORTED = -12,\n\n\t/* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the\n\t   message strings in strerror.c when adding new error codes here. */\n\n\t/** Other error */\n\tLIBUSB_ERROR_OTHER = -99,\n};\n\n/* Total number of error codes in enum libusb_error */\n#define LIBUSB_ERROR_COUNT 14\n\n/** \\ingroup libusb_asyncio\n * Transfer status codes */\nenum libusb_transfer_status {\n\t/** Transfer completed without error. Note that this does not indicate\n\t * that the entire amount of requested data was transferred. */\n\tLIBUSB_TRANSFER_COMPLETED,\n\n\t/** Transfer failed */\n\tLIBUSB_TRANSFER_ERROR,\n\n\t/** Transfer timed out */\n\tLIBUSB_TRANSFER_TIMED_OUT,\n\n\t/** Transfer was cancelled */\n\tLIBUSB_TRANSFER_CANCELLED,\n\n\t/** For bulk/interrupt endpoints: halt condition detected (endpoint\n\t * stalled). For control endpoints: control request not supported. */\n\tLIBUSB_TRANSFER_STALL,\n\n\t/** Device was disconnected */\n\tLIBUSB_TRANSFER_NO_DEVICE,\n\n\t/** Device sent more data than requested */\n\tLIBUSB_TRANSFER_OVERFLOW,\n\n\t/* NB! Remember to update libusb_error_name()\n\t   when adding new status codes here. */\n};\n\n/** \\ingroup libusb_asyncio\n * libusb_transfer.flags values */\nenum libusb_transfer_flags {\n\t/** Report short frames as errors */\n\tLIBUSB_TRANSFER_SHORT_NOT_OK = 1<<0,\n\n\t/** Automatically free() transfer buffer during libusb_free_transfer().\n\t * Note that buffers allocated with libusb_dev_mem_alloc() should not\n\t * be attempted freed in this way, since free() is not an appropriate\n\t * way to release such memory. */\n\tLIBUSB_TRANSFER_FREE_BUFFER = 1<<1,\n\n\t/** Automatically call libusb_free_transfer() after callback returns.\n\t * If this flag is set, it is illegal to call libusb_free_transfer()\n\t * from your transfer callback, as this will result in a double-free\n\t * when this flag is acted upon. */\n\tLIBUSB_TRANSFER_FREE_TRANSFER = 1<<2,\n\n\t/** Terminate transfers that are a multiple of the endpoint's\n\t * wMaxPacketSize with an extra zero length packet. This is useful\n\t * when a device protocol mandates that each logical request is\n\t * terminated by an incomplete packet (i.e. the logical requests are\n\t * not separated by other means).\n\t *\n\t * This flag only affects host-to-device transfers to bulk and interrupt\n\t * endpoints. In other situations, it is ignored.\n\t *\n\t * This flag only affects transfers with a length that is a multiple of\n\t * the endpoint's wMaxPacketSize. On transfers of other lengths, this\n\t * flag has no effect. Therefore, if you are working with a device that\n\t * needs a ZLP whenever the end of the logical request falls on a packet\n\t * boundary, then it is sensible to set this flag on <em>every</em>\n\t * transfer (you do not have to worry about only setting it on transfers\n\t * that end on the boundary).\n\t *\n\t * This flag is currently only supported on Linux.\n\t * On other systems, libusb_submit_transfer() will return\n\t * LIBUSB_ERROR_NOT_SUPPORTED for every transfer where this flag is set.\n\t *\n\t * Available since libusb-1.0.9.\n\t */\n\tLIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 << 3,\n};\n\n/** \\ingroup libusb_asyncio\n * Isochronous packet descriptor. */\nstruct libusb_iso_packet_descriptor {\n\t/** Length of data to request in this packet */\n\tunsigned int length;\n\n\t/** Amount of data that was actually transferred */\n\tunsigned int actual_length;\n\n\t/** Status code for this packet */\n\tenum libusb_transfer_status status;\n};\n\nstruct libusb_transfer;\n\n/** \\ingroup libusb_asyncio\n * Asynchronous transfer callback function type. When submitting asynchronous\n * transfers, you pass a pointer to a callback function of this type via the\n * \\ref libusb_transfer::callback \"callback\" member of the libusb_transfer\n * structure. libusb will call this function later, when the transfer has\n * completed or failed. See \\ref libusb_asyncio for more information.\n * \\param transfer The libusb_transfer struct the callback function is being\n * notified about.\n */\ntypedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer);\n\n/** \\ingroup libusb_asyncio\n * The generic USB transfer structure. The user populates this structure and\n * then submits it in order to request a transfer. After the transfer has\n * completed, the library populates the transfer with the results and passes\n * it back to the user.\n */\nstruct libusb_transfer {\n\t/** Handle of the device that this transfer will be submitted to */\n\tlibusb_device_handle *dev_handle;\n\n\t/** A bitwise OR combination of \\ref libusb_transfer_flags. */\n\tuint8_t flags;\n\n\t/** Address of the endpoint where this transfer will be sent. */\n\tunsigned char endpoint;\n\n\t/** Type of the endpoint from \\ref libusb_transfer_type */\n\tunsigned char type;\n\n\t/** Timeout for this transfer in milliseconds. A value of 0 indicates no\n\t * timeout. */\n\tunsigned int timeout;\n\n\t/** The status of the transfer. Read-only, and only for use within\n\t * transfer callback function.\n\t *\n\t * If this is an isochronous transfer, this field may read COMPLETED even\n\t * if there were errors in the frames. Use the\n\t * \\ref libusb_iso_packet_descriptor::status \"status\" field in each packet\n\t * to determine if errors occurred. */\n\tenum libusb_transfer_status status;\n\n\t/** Length of the data buffer */\n\tint length;\n\n\t/** Actual length of data that was transferred. Read-only, and only for\n\t * use within transfer callback function. Not valid for isochronous\n\t * endpoint transfers. */\n\tint actual_length;\n\n\t/** Callback function. This will be invoked when the transfer completes,\n\t * fails, or is cancelled. */\n\tlibusb_transfer_cb_fn callback;\n\n\t/** User context data to pass to the callback function. */\n\tvoid *user_data;\n\n\t/** Data buffer */\n\tunsigned char *buffer;\n\n\t/** Number of isochronous packets. Only used for I/O with isochronous\n\t * endpoints. */\n\tint num_iso_packets;\n\n\t/** Isochronous packet descriptors, for isochronous transfers only. */\n\tstruct libusb_iso_packet_descriptor iso_packet_desc\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n\t[] /* valid C99 code */\n#else\n\t[0] /* non-standard, but usually working code */\n#endif\n\t;\n};\n\n/** \\ingroup libusb_misc\n * Capabilities supported by an instance of libusb on the current running\n * platform. Test if the loaded library supports a given capability by calling\n * \\ref libusb_has_capability().\n */\nenum libusb_capability {\n\t/** The libusb_has_capability() API is available. */\n\tLIBUSB_CAP_HAS_CAPABILITY = 0x0000,\n\t/** Hotplug support is available on this platform. */\n\tLIBUSB_CAP_HAS_HOTPLUG = 0x0001,\n\t/** The library can access HID devices without requiring user intervention.\n\t * Note that before being able to actually access an HID device, you may\n\t * still have to call additional libusb functions such as\n\t * \\ref libusb_detach_kernel_driver(). */\n\tLIBUSB_CAP_HAS_HID_ACCESS = 0x0100,\n\t/** The library supports detaching of the default USB driver, using \n\t * \\ref libusb_detach_kernel_driver(), if one is set by the OS kernel */\n\tLIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = 0x0101\n};\n\n/** \\ingroup libusb_lib\n *  Log message levels.\n *  - LIBUSB_LOG_LEVEL_NONE (0)    : no messages ever printed by the library (default)\n *  - LIBUSB_LOG_LEVEL_ERROR (1)   : error messages are printed to stderr\n *  - LIBUSB_LOG_LEVEL_WARNING (2) : warning and error messages are printed to stderr\n *  - LIBUSB_LOG_LEVEL_INFO (3)    : informational messages are printed to stdout, warning\n *    and error messages are printed to stderr\n *  - LIBUSB_LOG_LEVEL_DEBUG (4)   : debug and informational messages are printed to stdout,\n *    warnings and errors to stderr\n */\nenum libusb_log_level {\n\tLIBUSB_LOG_LEVEL_NONE = 0,\n\tLIBUSB_LOG_LEVEL_ERROR,\n\tLIBUSB_LOG_LEVEL_WARNING,\n\tLIBUSB_LOG_LEVEL_INFO,\n\tLIBUSB_LOG_LEVEL_DEBUG,\n};\n\nint LIBUSB_CALL libusb_init(libusb_context **ctx);\nvoid LIBUSB_CALL libusb_exit(libusb_context *ctx);\nvoid LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level);\nconst struct libusb_version * LIBUSB_CALL libusb_get_version(void);\nint LIBUSB_CALL libusb_has_capability(uint32_t capability);\nconst char * LIBUSB_CALL libusb_error_name(int errcode);\nint LIBUSB_CALL libusb_setlocale(const char *locale);\nconst char * LIBUSB_CALL libusb_strerror(enum libusb_error errcode);\n\nssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx,\n\tlibusb_device ***list);\nvoid LIBUSB_CALL libusb_free_device_list(libusb_device **list,\n\tint unref_devices);\nlibusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev);\nvoid LIBUSB_CALL libusb_unref_device(libusb_device *dev);\n\nint LIBUSB_CALL libusb_get_configuration(libusb_device_handle *dev,\n\tint *config);\nint LIBUSB_CALL libusb_get_device_descriptor(libusb_device *dev,\n\tstruct libusb_device_descriptor *desc);\nint LIBUSB_CALL libusb_get_active_config_descriptor(libusb_device *dev,\n\tstruct libusb_config_descriptor **config);\nint LIBUSB_CALL libusb_get_config_descriptor(libusb_device *dev,\n\tuint8_t config_index, struct libusb_config_descriptor **config);\nint LIBUSB_CALL libusb_get_config_descriptor_by_value(libusb_device *dev,\n\tuint8_t bConfigurationValue, struct libusb_config_descriptor **config);\nvoid LIBUSB_CALL libusb_free_config_descriptor(\n\tstruct libusb_config_descriptor *config);\nint LIBUSB_CALL libusb_get_ss_endpoint_companion_descriptor(\n\tstruct libusb_context *ctx,\n\tconst struct libusb_endpoint_descriptor *endpoint,\n\tstruct libusb_ss_endpoint_companion_descriptor **ep_comp);\nvoid LIBUSB_CALL libusb_free_ss_endpoint_companion_descriptor(\n\tstruct libusb_ss_endpoint_companion_descriptor *ep_comp);\nint LIBUSB_CALL libusb_get_bos_descriptor(libusb_device_handle *dev_handle,\n\tstruct libusb_bos_descriptor **bos);\nvoid LIBUSB_CALL libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos);\nint LIBUSB_CALL libusb_get_usb_2_0_extension_descriptor(\n\tstruct libusb_context *ctx,\n\tstruct libusb_bos_dev_capability_descriptor *dev_cap,\n\tstruct libusb_usb_2_0_extension_descriptor **usb_2_0_extension);\nvoid LIBUSB_CALL libusb_free_usb_2_0_extension_descriptor(\n\tstruct libusb_usb_2_0_extension_descriptor *usb_2_0_extension);\nint LIBUSB_CALL libusb_get_ss_usb_device_capability_descriptor(\n\tstruct libusb_context *ctx,\n\tstruct libusb_bos_dev_capability_descriptor *dev_cap,\n\tstruct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap);\nvoid LIBUSB_CALL libusb_free_ss_usb_device_capability_descriptor(\n\tstruct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap);\nint LIBUSB_CALL libusb_get_container_id_descriptor(struct libusb_context *ctx,\n\tstruct libusb_bos_dev_capability_descriptor *dev_cap,\n\tstruct libusb_container_id_descriptor **container_id);\nvoid LIBUSB_CALL libusb_free_container_id_descriptor(\n\tstruct libusb_container_id_descriptor *container_id);\nuint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev);\nuint8_t LIBUSB_CALL libusb_get_port_number(libusb_device *dev);\nint LIBUSB_CALL libusb_get_port_numbers(libusb_device *dev, uint8_t* port_numbers, int port_numbers_len);\nLIBUSB_DEPRECATED_FOR(libusb_get_port_numbers)\nint LIBUSB_CALL libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t* path, uint8_t path_length);\nlibusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev);\nuint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev);\nint LIBUSB_CALL libusb_get_device_speed(libusb_device *dev);\nint LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev,\n\tunsigned char endpoint);\nint LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev,\n\tunsigned char endpoint);\n\nint LIBUSB_CALL libusb_open(libusb_device *dev, libusb_device_handle **dev_handle);\nvoid LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle);\nlibusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle);\n\nint LIBUSB_CALL libusb_set_configuration(libusb_device_handle *dev_handle,\n\tint configuration);\nint LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev_handle,\n\tint interface_number);\nint LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev_handle,\n\tint interface_number);\n\nlibusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(\n\tlibusb_context *ctx, uint16_t vendor_id, uint16_t product_id);\n\nint LIBUSB_CALL libusb_set_interface_alt_setting(libusb_device_handle *dev_handle,\n\tint interface_number, int alternate_setting);\nint LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev_handle,\n\tunsigned char endpoint);\nint LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev_handle);\n\nint LIBUSB_CALL libusb_alloc_streams(libusb_device_handle *dev_handle,\n\tuint32_t num_streams, unsigned char *endpoints, int num_endpoints);\nint LIBUSB_CALL libusb_free_streams(libusb_device_handle *dev_handle,\n\tunsigned char *endpoints, int num_endpoints);\n\nunsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handle,\n\tsize_t length);\nint LIBUSB_CALL libusb_dev_mem_free(libusb_device_handle *dev_handle,\n\tunsigned char *buffer, size_t length);\n\nint LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev_handle,\n\tint interface_number);\nint LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev_handle,\n\tint interface_number);\nint LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev_handle,\n\tint interface_number);\nint LIBUSB_CALL libusb_set_auto_detach_kernel_driver(\n\tlibusb_device_handle *dev_handle, int enable);\n\n/* async I/O */\n\n/** \\ingroup libusb_asyncio\n * Get the data section of a control transfer. This convenience function is here\n * to remind you that the data does not start until 8 bytes into the actual\n * buffer, as the setup packet comes first.\n *\n * Calling this function only makes sense from a transfer callback function,\n * or situations where you have already allocated a suitably sized buffer at\n * transfer->buffer.\n *\n * \\param transfer a transfer\n * \\returns pointer to the first byte of the data section\n */\nstatic inline unsigned char *libusb_control_transfer_get_data(\n\tstruct libusb_transfer *transfer)\n{\n\treturn transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;\n}\n\n/** \\ingroup libusb_asyncio\n * Get the control setup packet of a control transfer. This convenience\n * function is here to remind you that the control setup occupies the first\n * 8 bytes of the transfer data buffer.\n *\n * Calling this function only makes sense from a transfer callback function,\n * or situations where you have already allocated a suitably sized buffer at\n * transfer->buffer.\n *\n * \\param transfer a transfer\n * \\returns a casted pointer to the start of the transfer data buffer\n */\nstatic inline struct libusb_control_setup *libusb_control_transfer_get_setup(\n\tstruct libusb_transfer *transfer)\n{\n\treturn (struct libusb_control_setup *)(void *) transfer->buffer;\n}\n\n/** \\ingroup libusb_asyncio\n * Helper function to populate the setup packet (first 8 bytes of the data\n * buffer) for a control transfer. The wIndex, wValue and wLength values should\n * be given in host-endian byte order.\n *\n * \\param buffer buffer to output the setup packet into\n * This pointer must be aligned to at least 2 bytes boundary.\n * \\param bmRequestType see the\n * \\ref libusb_control_setup::bmRequestType \"bmRequestType\" field of\n * \\ref libusb_control_setup\n * \\param bRequest see the\n * \\ref libusb_control_setup::bRequest \"bRequest\" field of\n * \\ref libusb_control_setup\n * \\param wValue see the\n * \\ref libusb_control_setup::wValue \"wValue\" field of\n * \\ref libusb_control_setup\n * \\param wIndex see the\n * \\ref libusb_control_setup::wIndex \"wIndex\" field of\n * \\ref libusb_control_setup\n * \\param wLength see the\n * \\ref libusb_control_setup::wLength \"wLength\" field of\n * \\ref libusb_control_setup\n */\nstatic inline void libusb_fill_control_setup(unsigned char *buffer,\n\tuint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,\n\tuint16_t wLength)\n{\n\tstruct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer;\n\tsetup->bmRequestType = bmRequestType;\n\tsetup->bRequest = bRequest;\n\tsetup->wValue = libusb_cpu_to_le16(wValue);\n\tsetup->wIndex = libusb_cpu_to_le16(wIndex);\n\tsetup->wLength = libusb_cpu_to_le16(wLength);\n}\n\nstruct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets);\nint LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer);\nint LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer);\nvoid LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer);\nvoid LIBUSB_CALL libusb_transfer_set_stream_id(\n\tstruct libusb_transfer *transfer, uint32_t stream_id);\nuint32_t LIBUSB_CALL libusb_transfer_get_stream_id(\n\tstruct libusb_transfer *transfer);\n\n/** \\ingroup libusb_asyncio\n * Helper function to populate the required \\ref libusb_transfer fields\n * for a control transfer.\n *\n * If you pass a transfer buffer to this function, the first 8 bytes will\n * be interpreted as a control setup packet, and the wLength field will be\n * used to automatically populate the \\ref libusb_transfer::length \"length\"\n * field of the transfer. Therefore the recommended approach is:\n * -# Allocate a suitably sized data buffer (including space for control setup)\n * -# Call libusb_fill_control_setup()\n * -# If this is a host-to-device transfer with a data stage, put the data\n *    in place after the setup packet\n * -# Call this function\n * -# Call libusb_submit_transfer()\n *\n * It is also legal to pass a NULL buffer to this function, in which case this\n * function will not attempt to populate the length field. Remember that you\n * must then populate the buffer and length fields later.\n *\n * \\param transfer the transfer to populate\n * \\param dev_handle handle of the device that will handle the transfer\n * \\param buffer data buffer. If provided, this function will interpret the\n * first 8 bytes as a setup packet and infer the transfer length from that.\n * This pointer must be aligned to at least 2 bytes boundary.\n * \\param callback callback function to be invoked on transfer completion\n * \\param user_data user data to pass to callback function\n * \\param timeout timeout for the transfer in milliseconds\n */\nstatic inline void libusb_fill_control_transfer(\n\tstruct libusb_transfer *transfer, libusb_device_handle *dev_handle,\n\tunsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data,\n\tunsigned int timeout)\n{\n\tstruct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer;\n\ttransfer->dev_handle = dev_handle;\n\ttransfer->endpoint = 0;\n\ttransfer->type = LIBUSB_TRANSFER_TYPE_CONTROL;\n\ttransfer->timeout = timeout;\n\ttransfer->buffer = buffer;\n\tif (setup)\n\t\ttransfer->length = (int) (LIBUSB_CONTROL_SETUP_SIZE\n\t\t\t+ libusb_le16_to_cpu(setup->wLength));\n\ttransfer->user_data = user_data;\n\ttransfer->callback = callback;\n}\n\n/** \\ingroup libusb_asyncio\n * Helper function to populate the required \\ref libusb_transfer fields\n * for a bulk transfer.\n *\n * \\param transfer the transfer to populate\n * \\param dev_handle handle of the device that will handle the transfer\n * \\param endpoint address of the endpoint where this transfer will be sent\n * \\param buffer data buffer\n * \\param length length of data buffer\n * \\param callback callback function to be invoked on transfer completion\n * \\param user_data user data to pass to callback function\n * \\param timeout timeout for the transfer in milliseconds\n */\nstatic inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer,\n\tlibusb_device_handle *dev_handle, unsigned char endpoint,\n\tunsigned char *buffer, int length, libusb_transfer_cb_fn callback,\n\tvoid *user_data, unsigned int timeout)\n{\n\ttransfer->dev_handle = dev_handle;\n\ttransfer->endpoint = endpoint;\n\ttransfer->type = LIBUSB_TRANSFER_TYPE_BULK;\n\ttransfer->timeout = timeout;\n\ttransfer->buffer = buffer;\n\ttransfer->length = length;\n\ttransfer->user_data = user_data;\n\ttransfer->callback = callback;\n}\n\n/** \\ingroup libusb_asyncio\n * Helper function to populate the required \\ref libusb_transfer fields\n * for a bulk transfer using bulk streams.\n *\n * Since version 1.0.19, \\ref LIBUSB_API_VERSION >= 0x01000103\n *\n * \\param transfer the transfer to populate\n * \\param dev_handle handle of the device that will handle the transfer\n * \\param endpoint address of the endpoint where this transfer will be sent\n * \\param stream_id bulk stream id for this transfer\n * \\param buffer data buffer\n * \\param length length of data buffer\n * \\param callback callback function to be invoked on transfer completion\n * \\param user_data user data to pass to callback function\n * \\param timeout timeout for the transfer in milliseconds\n */\nstatic inline void libusb_fill_bulk_stream_transfer(\n\tstruct libusb_transfer *transfer, libusb_device_handle *dev_handle,\n\tunsigned char endpoint, uint32_t stream_id,\n\tunsigned char *buffer, int length, libusb_transfer_cb_fn callback,\n\tvoid *user_data, unsigned int timeout)\n{\n\tlibusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer,\n\t\t\t\t  length, callback, user_data, timeout);\n\ttransfer->type = LIBUSB_TRANSFER_TYPE_BULK_STREAM;\n\tlibusb_transfer_set_stream_id(transfer, stream_id);\n}\n\n/** \\ingroup libusb_asyncio\n * Helper function to populate the required \\ref libusb_transfer fields\n * for an interrupt transfer.\n *\n * \\param transfer the transfer to populate\n * \\param dev_handle handle of the device that will handle the transfer\n * \\param endpoint address of the endpoint where this transfer will be sent\n * \\param buffer data buffer\n * \\param length length of data buffer\n * \\param callback callback function to be invoked on transfer completion\n * \\param user_data user data to pass to callback function\n * \\param timeout timeout for the transfer in milliseconds\n */\nstatic inline void libusb_fill_interrupt_transfer(\n\tstruct libusb_transfer *transfer, libusb_device_handle *dev_handle,\n\tunsigned char endpoint, unsigned char *buffer, int length,\n\tlibusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)\n{\n\ttransfer->dev_handle = dev_handle;\n\ttransfer->endpoint = endpoint;\n\ttransfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT;\n\ttransfer->timeout = timeout;\n\ttransfer->buffer = buffer;\n\ttransfer->length = length;\n\ttransfer->user_data = user_data;\n\ttransfer->callback = callback;\n}\n\n/** \\ingroup libusb_asyncio\n * Helper function to populate the required \\ref libusb_transfer fields\n * for an isochronous transfer.\n *\n * \\param transfer the transfer to populate\n * \\param dev_handle handle of the device that will handle the transfer\n * \\param endpoint address of the endpoint where this transfer will be sent\n * \\param buffer data buffer\n * \\param length length of data buffer\n * \\param num_iso_packets the number of isochronous packets\n * \\param callback callback function to be invoked on transfer completion\n * \\param user_data user data to pass to callback function\n * \\param timeout timeout for the transfer in milliseconds\n */\nstatic inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer,\n\tlibusb_device_handle *dev_handle, unsigned char endpoint,\n\tunsigned char *buffer, int length, int num_iso_packets,\n\tlibusb_transfer_cb_fn callback, void *user_data, unsigned int timeout)\n{\n\ttransfer->dev_handle = dev_handle;\n\ttransfer->endpoint = endpoint;\n\ttransfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS;\n\ttransfer->timeout = timeout;\n\ttransfer->buffer = buffer;\n\ttransfer->length = length;\n\ttransfer->num_iso_packets = num_iso_packets;\n\ttransfer->user_data = user_data;\n\ttransfer->callback = callback;\n}\n\n/** \\ingroup libusb_asyncio\n * Convenience function to set the length of all packets in an isochronous\n * transfer, based on the num_iso_packets field in the transfer structure.\n *\n * \\param transfer a transfer\n * \\param length the length to set in each isochronous packet descriptor\n * \\see libusb_get_max_packet_size()\n */\nstatic inline void libusb_set_iso_packet_lengths(\n\tstruct libusb_transfer *transfer, unsigned int length)\n{\n\tint i;\n\tfor (i = 0; i < transfer->num_iso_packets; i++)\n\t\ttransfer->iso_packet_desc[i].length = length;\n}\n\n/** \\ingroup libusb_asyncio\n * Convenience function to locate the position of an isochronous packet\n * within the buffer of an isochronous transfer.\n *\n * This is a thorough function which loops through all preceding packets,\n * accumulating their lengths to find the position of the specified packet.\n * Typically you will assign equal lengths to each packet in the transfer,\n * and hence the above method is sub-optimal. You may wish to use\n * libusb_get_iso_packet_buffer_simple() instead.\n *\n * \\param transfer a transfer\n * \\param packet the packet to return the address of\n * \\returns the base address of the packet buffer inside the transfer buffer,\n * or NULL if the packet does not exist.\n * \\see libusb_get_iso_packet_buffer_simple()\n */\nstatic inline unsigned char *libusb_get_iso_packet_buffer(\n\tstruct libusb_transfer *transfer, unsigned int packet)\n{\n\tint i;\n\tsize_t offset = 0;\n\tint _packet;\n\n\t/* oops..slight bug in the API. packet is an unsigned int, but we use\n\t * signed integers almost everywhere else. range-check and convert to\n\t * signed to avoid compiler warnings. FIXME for libusb-2. */\n\tif (packet > INT_MAX)\n\t\treturn NULL;\n\t_packet = (int) packet;\n\n\tif (_packet >= transfer->num_iso_packets)\n\t\treturn NULL;\n\n\tfor (i = 0; i < _packet; i++)\n\t\toffset += transfer->iso_packet_desc[i].length;\n\n\treturn transfer->buffer + offset;\n}\n\n/** \\ingroup libusb_asyncio\n * Convenience function to locate the position of an isochronous packet\n * within the buffer of an isochronous transfer, for transfers where each\n * packet is of identical size.\n *\n * This function relies on the assumption that every packet within the transfer\n * is of identical size to the first packet. Calculating the location of\n * the packet buffer is then just a simple calculation:\n * <tt>buffer + (packet_size * packet)</tt>\n *\n * Do not use this function on transfers other than those that have identical\n * packet lengths for each packet.\n *\n * \\param transfer a transfer\n * \\param packet the packet to return the address of\n * \\returns the base address of the packet buffer inside the transfer buffer,\n * or NULL if the packet does not exist.\n * \\see libusb_get_iso_packet_buffer()\n */\nstatic inline unsigned char *libusb_get_iso_packet_buffer_simple(\n\tstruct libusb_transfer *transfer, unsigned int packet)\n{\n\tint _packet;\n\n\t/* oops..slight bug in the API. packet is an unsigned int, but we use\n\t * signed integers almost everywhere else. range-check and convert to\n\t * signed to avoid compiler warnings. FIXME for libusb-2. */\n\tif (packet > INT_MAX)\n\t\treturn NULL;\n\t_packet = (int) packet;\n\n\tif (_packet >= transfer->num_iso_packets)\n\t\treturn NULL;\n\n\treturn transfer->buffer + ((int) transfer->iso_packet_desc[0].length * _packet);\n}\n\n/* sync I/O */\n\nint LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle,\n\tuint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,\n\tunsigned char *data, uint16_t wLength, unsigned int timeout);\n\nint LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle,\n\tunsigned char endpoint, unsigned char *data, int length,\n\tint *actual_length, unsigned int timeout);\n\nint LIBUSB_CALL libusb_interrupt_transfer(libusb_device_handle *dev_handle,\n\tunsigned char endpoint, unsigned char *data, int length,\n\tint *actual_length, unsigned int timeout);\n\n/** \\ingroup libusb_desc\n * Retrieve a descriptor from the default control pipe.\n * This is a convenience function which formulates the appropriate control\n * message to retrieve the descriptor.\n *\n * \\param dev_handle a device handle\n * \\param desc_type the descriptor type, see \\ref libusb_descriptor_type\n * \\param desc_index the index of the descriptor to retrieve\n * \\param data output buffer for descriptor\n * \\param length size of data buffer\n * \\returns number of bytes returned in data, or LIBUSB_ERROR code on failure\n */\nstatic inline int libusb_get_descriptor(libusb_device_handle *dev_handle,\n\tuint8_t desc_type, uint8_t desc_index, unsigned char *data, int length)\n{\n\treturn libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN,\n\t\tLIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t) ((desc_type << 8) | desc_index),\n\t\t0, data, (uint16_t) length, 1000);\n}\n\n/** \\ingroup libusb_desc\n * Retrieve a descriptor from a device.\n * This is a convenience function which formulates the appropriate control\n * message to retrieve the descriptor. The string returned is Unicode, as\n * detailed in the USB specifications.\n *\n * \\param dev_handle a device handle\n * \\param desc_index the index of the descriptor to retrieve\n * \\param langid the language ID for the string descriptor\n * \\param data output buffer for descriptor\n * \\param length size of data buffer\n * \\returns number of bytes returned in data, or LIBUSB_ERROR code on failure\n * \\see libusb_get_string_descriptor_ascii()\n */\nstatic inline int libusb_get_string_descriptor(libusb_device_handle *dev_handle,\n\tuint8_t desc_index, uint16_t langid, unsigned char *data, int length)\n{\n\treturn libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN,\n\t\tLIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t)((LIBUSB_DT_STRING << 8) | desc_index),\n\t\tlangid, data, (uint16_t) length, 1000);\n}\n\nint LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle,\n\tuint8_t desc_index, unsigned char *data, int length);\n\n/* polling and timeouts */\n\nint LIBUSB_CALL libusb_try_lock_events(libusb_context *ctx);\nvoid LIBUSB_CALL libusb_lock_events(libusb_context *ctx);\nvoid LIBUSB_CALL libusb_unlock_events(libusb_context *ctx);\nint LIBUSB_CALL libusb_event_handling_ok(libusb_context *ctx);\nint LIBUSB_CALL libusb_event_handler_active(libusb_context *ctx);\nvoid LIBUSB_CALL libusb_interrupt_event_handler(libusb_context *ctx);\nvoid LIBUSB_CALL libusb_lock_event_waiters(libusb_context *ctx);\nvoid LIBUSB_CALL libusb_unlock_event_waiters(libusb_context *ctx);\nint LIBUSB_CALL libusb_wait_for_event(libusb_context *ctx, struct timeval *tv);\n\nint LIBUSB_CALL libusb_handle_events_timeout(libusb_context *ctx,\n\tstruct timeval *tv);\nint LIBUSB_CALL libusb_handle_events_timeout_completed(libusb_context *ctx,\n\tstruct timeval *tv, int *completed);\nint LIBUSB_CALL libusb_handle_events(libusb_context *ctx);\nint LIBUSB_CALL libusb_handle_events_completed(libusb_context *ctx, int *completed);\nint LIBUSB_CALL libusb_handle_events_locked(libusb_context *ctx,\n\tstruct timeval *tv);\nint LIBUSB_CALL libusb_pollfds_handle_timeouts(libusb_context *ctx);\nint LIBUSB_CALL libusb_get_next_timeout(libusb_context *ctx,\n\tstruct timeval *tv);\n\n/** \\ingroup libusb_poll\n * File descriptor for polling\n */\nstruct libusb_pollfd {\n\t/** Numeric file descriptor */\n\tint fd;\n\n\t/** Event flags to poll for from <poll.h>. POLLIN indicates that you\n\t * should monitor this file descriptor for becoming ready to read from,\n\t * and POLLOUT indicates that you should monitor this file descriptor for\n\t * nonblocking write readiness. */\n\tshort events;\n};\n\n/** \\ingroup libusb_poll\n * Callback function, invoked when a new file descriptor should be added\n * to the set of file descriptors monitored for events.\n * \\param fd the new file descriptor\n * \\param events events to monitor for, see \\ref libusb_pollfd for a\n * description\n * \\param user_data User data pointer specified in\n * libusb_set_pollfd_notifiers() call\n * \\see libusb_set_pollfd_notifiers()\n */\ntypedef void (LIBUSB_CALL *libusb_pollfd_added_cb)(int fd, short events,\n\tvoid *user_data);\n\n/** \\ingroup libusb_poll\n * Callback function, invoked when a file descriptor should be removed from\n * the set of file descriptors being monitored for events. After returning\n * from this callback, do not use that file descriptor again.\n * \\param fd the file descriptor to stop monitoring\n * \\param user_data User data pointer specified in\n * libusb_set_pollfd_notifiers() call\n * \\see libusb_set_pollfd_notifiers()\n */\ntypedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data);\n\nconst struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds(\n\tlibusb_context *ctx);\nvoid LIBUSB_CALL libusb_free_pollfds(const struct libusb_pollfd **pollfds);\nvoid LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx,\n\tlibusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb,\n\tvoid *user_data);\n\n/** \\ingroup libusb_hotplug\n * Callback handle.\n *\n * Callbacks handles are generated by libusb_hotplug_register_callback()\n * and can be used to deregister callbacks. Callback handles are unique\n * per libusb_context and it is safe to call libusb_hotplug_deregister_callback()\n * on an already deregisted callback.\n *\n * Since version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102\n *\n * For more information, see \\ref libusb_hotplug.\n */\ntypedef int libusb_hotplug_callback_handle;\n\n/** \\ingroup libusb_hotplug\n *\n * Since version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102\n *\n * Flags for hotplug events */\ntypedef enum {\n\t/** Default value when not using any flags. */\n\tLIBUSB_HOTPLUG_NO_FLAGS = 0,\n\n\t/** Arm the callback and fire it for all matching currently attached devices. */\n\tLIBUSB_HOTPLUG_ENUMERATE = 1<<0,\n} libusb_hotplug_flag;\n\n/** \\ingroup libusb_hotplug\n *\n * Since version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102\n *\n * Hotplug events */\ntypedef enum {\n\t/** A device has been plugged in and is ready to use */\n\tLIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = 0x01,\n\n\t/** A device has left and is no longer available.\n\t * It is the user's responsibility to call libusb_close on any handle associated with a disconnected device.\n\t * It is safe to call libusb_get_device_descriptor on a device that has left */\n\tLIBUSB_HOTPLUG_EVENT_DEVICE_LEFT    = 0x02,\n} libusb_hotplug_event;\n\n/** \\ingroup libusb_hotplug\n * Wildcard matching for hotplug events */\n#define LIBUSB_HOTPLUG_MATCH_ANY -1\n\n/** \\ingroup libusb_hotplug\n * Hotplug callback function type. When requesting hotplug event notifications,\n * you pass a pointer to a callback function of this type.\n *\n * This callback may be called by an internal event thread and as such it is\n * recommended the callback do minimal processing before returning.\n *\n * libusb will call this function later, when a matching event had happened on\n * a matching device. See \\ref libusb_hotplug for more information.\n *\n * It is safe to call either libusb_hotplug_register_callback() or\n * libusb_hotplug_deregister_callback() from within a callback function.\n *\n * Since version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102\n *\n * \\param ctx            context of this notification\n * \\param device         libusb_device this event occurred on\n * \\param event          event that occurred\n * \\param user_data      user data provided when this callback was registered\n * \\returns bool whether this callback is finished processing events.\n *                       returning 1 will cause this callback to be deregistered\n */\ntypedef int (LIBUSB_CALL *libusb_hotplug_callback_fn)(libusb_context *ctx,\n\t\t\t\t\t\tlibusb_device *device,\n\t\t\t\t\t\tlibusb_hotplug_event event,\n\t\t\t\t\t\tvoid *user_data);\n\n/** \\ingroup libusb_hotplug\n * Register a hotplug callback function\n *\n * Register a callback with the libusb_context. The callback will fire\n * when a matching event occurs on a matching device. The callback is\n * armed until either it is deregistered with libusb_hotplug_deregister_callback()\n * or the supplied callback returns 1 to indicate it is finished processing events.\n *\n * If the \\ref LIBUSB_HOTPLUG_ENUMERATE is passed the callback will be\n * called with a \\ref LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED for all devices\n * already plugged into the machine. Note that libusb modifies its internal\n * device list from a separate thread, while calling hotplug callbacks from\n * libusb_handle_events(), so it is possible for a device to already be present\n * on, or removed from, its internal device list, while the hotplug callbacks\n * still need to be dispatched. This means that when using \\ref\n * LIBUSB_HOTPLUG_ENUMERATE, your callback may be called twice for the arrival\n * of the same device, once from libusb_hotplug_register_callback() and once\n * from libusb_handle_events(); and/or your callback may be called for the\n * removal of a device for which an arrived call was never made.\n *\n * Since version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102\n *\n * \\param[in] ctx context to register this callback with\n * \\param[in] events bitwise or of events that will trigger this callback. See \\ref\n *            libusb_hotplug_event\n * \\param[in] flags hotplug callback flags. See \\ref libusb_hotplug_flag\n * \\param[in] vendor_id the vendor id to match or \\ref LIBUSB_HOTPLUG_MATCH_ANY\n * \\param[in] product_id the product id to match or \\ref LIBUSB_HOTPLUG_MATCH_ANY\n * \\param[in] dev_class the device class to match or \\ref LIBUSB_HOTPLUG_MATCH_ANY\n * \\param[in] cb_fn the function to be invoked on a matching event/device\n * \\param[in] user_data user data to pass to the callback function\n * \\param[out] callback_handle pointer to store the handle of the allocated callback (can be NULL)\n * \\returns LIBUSB_SUCCESS on success LIBUSB_ERROR code on failure\n */\nint LIBUSB_CALL libusb_hotplug_register_callback(libusb_context *ctx,\n\t\t\t\t\t\tlibusb_hotplug_event events,\n\t\t\t\t\t\tlibusb_hotplug_flag flags,\n\t\t\t\t\t\tint vendor_id, int product_id,\n\t\t\t\t\t\tint dev_class,\n\t\t\t\t\t\tlibusb_hotplug_callback_fn cb_fn,\n\t\t\t\t\t\tvoid *user_data,\n\t\t\t\t\t\tlibusb_hotplug_callback_handle *callback_handle);\n\n/** \\ingroup libusb_hotplug\n * Deregisters a hotplug callback.\n *\n * Deregister a callback from a libusb_context. This function is safe to call from within\n * a hotplug callback.\n *\n * Since version 1.0.16, \\ref LIBUSB_API_VERSION >= 0x01000102\n *\n * \\param[in] ctx context this callback is registered with\n * \\param[in] callback_handle the handle of the callback to deregister\n */\nvoid LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx,\n\t\t\t\t\t\tlibusb_hotplug_callback_handle callback_handle);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/libusbi.h",
    "content": "/*\n * Internal header for libusb\n * Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org>\n * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBUSBI_H\n#define LIBUSBI_H\n\n#include <config.h>\n\n#include <stdlib.h>\n\n#include <stddef.h>\n#include <stdint.h>\n#include <time.h>\n#include <stdarg.h>\n#ifdef HAVE_POLL_H\n#include <poll.h>\n#endif\n#ifdef HAVE_MISSING_H\n#include <missing.h>\n#endif\n\n#include \"libusb.h\"\n#include \"version.h\"\n\n/* Inside the libusb code, mark all public functions as follows:\n *   return_type API_EXPORTED function_name(params) { ... }\n * But if the function returns a pointer, mark it as follows:\n *   DEFAULT_VISIBILITY return_type * LIBUSB_CALL function_name(params) { ... }\n * In the libusb public header, mark all declarations as:\n *   return_type LIBUSB_CALL function_name(params);\n */\n#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define DEVICE_DESC_LENGTH\t18\n\n#define USB_MAXENDPOINTS\t32\n#define USB_MAXINTERFACES\t32\n#define USB_MAXCONFIG\t\t8\n\n/* Backend specific capabilities */\n#define USBI_CAP_HAS_HID_ACCESS\t\t\t0x00010000\n#define USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER\t0x00020000\n\n/* Maximum number of bytes in a log line */\n#define USBI_MAX_LOG_LEN\t1024\n/* Terminator for log lines */\n#define USBI_LOG_LINE_END\t\"\\n\"\n\n/* The following is used to silence warnings for unused variables */\n#define UNUSED(var)\t\tdo { (void)(var); } while(0)\n\n#if !defined(ARRAYSIZE)\n#define ARRAYSIZE(array) (sizeof(array) / sizeof(array[0]))\n#endif\n\nstruct list_head {\n\tstruct list_head *prev, *next;\n};\n\n/* Get an entry from the list\n *  ptr - the address of this list_head element in \"type\"\n *  type - the data type that contains \"member\"\n *  member - the list_head element in \"type\"\n */\n#define list_entry(ptr, type, member) \\\n\t((type *)((uintptr_t)(ptr) - (uintptr_t)offsetof(type, member)))\n\n#define list_first_entry(ptr, type, member) \\\n\tlist_entry((ptr)->next, type, member)\n\n/* Get each entry from a list\n *  pos - A structure pointer has a \"member\" element\n *  head - list head\n *  member - the list_head element in \"pos\"\n *  type - the type of the first parameter\n */\n#define list_for_each_entry(pos, head, member, type)\t\t\t\\\n\tfor (pos = list_entry((head)->next, type, member);\t\t\\\n\t\t &pos->member != (head);\t\t\t\t\\\n\t\t pos = list_entry(pos->member.next, type, member))\n\n#define list_for_each_entry_safe(pos, n, head, member, type)\t\t\\\n\tfor (pos = list_entry((head)->next, type, member),\t\t\\\n\t\t n = list_entry(pos->member.next, type, member);\t\\\n\t\t &pos->member != (head);\t\t\t\t\\\n\t\t pos = n, n = list_entry(n->member.next, type, member))\n\n#define list_empty(entry) ((entry)->next == (entry))\n\nstatic inline void list_init(struct list_head *entry)\n{\n\tentry->prev = entry->next = entry;\n}\n\nstatic inline void list_add(struct list_head *entry, struct list_head *head)\n{\n\tentry->next = head->next;\n\tentry->prev = head;\n\n\thead->next->prev = entry;\n\thead->next = entry;\n}\n\nstatic inline void list_add_tail(struct list_head *entry,\n\tstruct list_head *head)\n{\n\tentry->next = head;\n\tentry->prev = head->prev;\n\n\thead->prev->next = entry;\n\thead->prev = entry;\n}\n\nstatic inline void list_del(struct list_head *entry)\n{\n\tentry->next->prev = entry->prev;\n\tentry->prev->next = entry->next;\n\tentry->next = entry->prev = NULL;\n}\n\nstatic inline void *usbi_reallocf(void *ptr, size_t size)\n{\n\tvoid *ret = realloc(ptr, size);\n\tif (!ret)\n\t\tfree(ptr);\n\treturn ret;\n}\n\n#define container_of(ptr, type, member) ({\t\t\t\\\n\tconst typeof( ((type *)0)->member ) *mptr = (ptr);\t\\\n\t(type *)( (char *)mptr - offsetof(type,member) );})\n\n#ifndef MIN\n#define MIN(a, b)\t((a) < (b) ? (a) : (b))\n#endif\n#ifndef MAX\n#define MAX(a, b)\t((a) > (b) ? (a) : (b))\n#endif\n\n#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0)\n\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n#define TIMEVAL_TV_SEC_TYPE\tlong\n#else\n#define TIMEVAL_TV_SEC_TYPE\ttime_t\n#endif\n\n/* Some platforms don't have this define */\n#ifndef TIMESPEC_TO_TIMEVAL\n#define TIMESPEC_TO_TIMEVAL(tv, ts)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\t\\\n\t\t(tv)->tv_sec = (TIMEVAL_TV_SEC_TYPE) (ts)->tv_sec;\t\\\n\t\t(tv)->tv_usec = (ts)->tv_nsec / 1000;\t\t\t\\\n\t} while (0)\n#endif\n\nvoid usbi_log(struct libusb_context *ctx, enum libusb_log_level level,\n\tconst char *function, const char *format, ...);\n\nvoid usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,\n\tconst char *function, const char *format, va_list args);\n\n#if !defined(_MSC_VER) || _MSC_VER >= 1400\n\n#ifdef ENABLE_LOGGING\n#define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__)\n#define usbi_dbg(...) _usbi_log(NULL, LIBUSB_LOG_LEVEL_DEBUG, __VA_ARGS__)\n#else\n#define _usbi_log(ctx, level, ...) do { (void)(ctx); } while(0)\n#define usbi_dbg(...) do {} while(0)\n#endif\n\n#define usbi_info(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_INFO, __VA_ARGS__)\n#define usbi_warn(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_WARNING, __VA_ARGS__)\n#define usbi_err(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_ERROR, __VA_ARGS__)\n\n#else /* !defined(_MSC_VER) || _MSC_VER >= 1400 */\n\n#ifdef ENABLE_LOGGING\n#define LOG_BODY(ctxt, level)\t\t\t\t\\\n{\t\t\t\t\t\t\t\\\n\tva_list args;\t\t\t\t\t\\\n\tva_start(args, format);\t\t\t\t\\\n\tusbi_log_v(ctxt, level, \"\", format, args);\t\\\n\tva_end(args);\t\t\t\t\t\\\n}\n#else\n#define LOG_BODY(ctxt, level)\t\t\t\t\\\n{\t\t\t\t\t\t\t\\\n\t(void)(ctxt);\t\t\t\t\t\\\n}\n#endif\n\nstatic inline void usbi_info(struct libusb_context *ctx, const char *format, ...)\n\tLOG_BODY(ctx, LIBUSB_LOG_LEVEL_INFO)\nstatic inline void usbi_warn(struct libusb_context *ctx, const char *format, ...)\n\tLOG_BODY(ctx, LIBUSB_LOG_LEVEL_WARNING)\nstatic inline void usbi_err(struct libusb_context *ctx, const char *format, ...)\n\tLOG_BODY(ctx, LIBUSB_LOG_LEVEL_ERROR)\n\nstatic inline void usbi_dbg(const char *format, ...)\n\tLOG_BODY(NULL, LIBUSB_LOG_LEVEL_DEBUG)\n\n#endif /* !defined(_MSC_VER) || _MSC_VER >= 1400 */\n\n#define USBI_GET_CONTEXT(ctx)\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\\\n\t\tif (!(ctx))\t\t\t\t\\\n\t\t\t(ctx) = usbi_default_context;\t\\\n\t} while(0)\n\n#define DEVICE_CTX(dev)\t\t((dev)->ctx)\n#define HANDLE_CTX(handle)\t(DEVICE_CTX((handle)->dev))\n#define TRANSFER_CTX(transfer)\t(HANDLE_CTX((transfer)->dev_handle))\n#define ITRANSFER_CTX(transfer) \\\n\t(TRANSFER_CTX(USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)))\n\n#define IS_EPIN(ep)\t\t(0 != ((ep) & LIBUSB_ENDPOINT_IN))\n#define IS_EPOUT(ep)\t\t(!IS_EPIN(ep))\n#define IS_XFERIN(xfer)\t\t(0 != ((xfer)->endpoint & LIBUSB_ENDPOINT_IN))\n#define IS_XFEROUT(xfer)\t(!IS_XFERIN(xfer))\n\n/* Internal abstraction for thread synchronization */\n#if defined(THREADS_POSIX)\n#include \"os/threads_posix.h\"\n#elif defined(OS_WINDOWS) || defined(OS_WINCE)\n#include \"os/threads_windows.h\"\n#endif\n\nextern struct libusb_context *usbi_default_context;\n\n/* Forward declaration for use in context (fully defined inside poll abstraction) */\nstruct pollfd;\n\nstruct libusb_context {\n\tint debug;\n\tint debug_fixed;\n\n\t/* internal event pipe, used for signalling occurrence of an internal event. */\n\tint event_pipe[2];\n\n\tstruct list_head usb_devs;\n\tusbi_mutex_t usb_devs_lock;\n\n\t/* A list of open handles. Backends are free to traverse this if required.\n\t */\n\tstruct list_head open_devs;\n\tusbi_mutex_t open_devs_lock;\n\n\t/* A list of registered hotplug callbacks */\n\tstruct list_head hotplug_cbs;\n\tusbi_mutex_t hotplug_cbs_lock;\n\n\t/* this is a list of in-flight transfer handles, sorted by timeout\n\t * expiration. URBs to timeout the soonest are placed at the beginning of\n\t * the list, URBs that will time out later are placed after, and urbs with\n\t * infinite timeout are always placed at the very end. */\n\tstruct list_head flying_transfers;\n\t/* Note paths taking both this and usbi_transfer->lock must always\n\t * take this lock first */\n\tusbi_mutex_t flying_transfers_lock;\n\n\t/* user callbacks for pollfd changes */\n\tlibusb_pollfd_added_cb fd_added_cb;\n\tlibusb_pollfd_removed_cb fd_removed_cb;\n\tvoid *fd_cb_user_data;\n\n\t/* ensures that only one thread is handling events at any one time */\n\tusbi_mutex_t events_lock;\n\n\t/* used to see if there is an active thread doing event handling */\n\tint event_handler_active;\n\n\t/* A thread-local storage key to track which thread is performing event\n\t * handling */\n\tusbi_tls_key_t event_handling_key;\n\n\t/* used to wait for event completion in threads other than the one that is\n\t * event handling */\n\tusbi_mutex_t event_waiters_lock;\n\tusbi_cond_t event_waiters_cond;\n\n\t/* A lock to protect internal context event data. */\n\tusbi_mutex_t event_data_lock;\n\n\t/* A bitmask of flags that are set to indicate specific events that need to\n\t * be handled. Protected by event_data_lock. */\n\tunsigned int event_flags;\n\n\t/* A counter that is set when we want to interrupt and prevent event handling,\n\t * in order to safely close a device. Protected by event_data_lock. */\n\tunsigned int device_close;\n\n\t/* list and count of poll fds and an array of poll fd structures that is\n\t * (re)allocated as necessary prior to polling. Protected by event_data_lock. */\n\tstruct list_head ipollfds;\n\tstruct pollfd *pollfds;\n\tPOLL_NFDS_TYPE pollfds_cnt;\n\n\t/* A list of pending hotplug messages. Protected by event_data_lock. */\n\tstruct list_head hotplug_msgs;\n\n\t/* A list of pending completed transfers. Protected by event_data_lock. */\n\tstruct list_head completed_transfers;\n\n#ifdef USBI_TIMERFD_AVAILABLE\n\t/* used for timeout handling, if supported by OS.\n\t * this timerfd is maintained to trigger on the next pending timeout */\n\tint timerfd;\n#endif\n\n\tstruct list_head list;\n};\n\nenum usbi_event_flags {\n\t/* The list of pollfds has been modified */\n\tUSBI_EVENT_POLLFDS_MODIFIED = 1 << 0,\n\n\t/* The user has interrupted the event handler */\n\tUSBI_EVENT_USER_INTERRUPT = 1 << 1,\n};\n\n/* Macros for managing event handling state */\n#define usbi_handling_events(ctx) \\\n\t(usbi_tls_key_get((ctx)->event_handling_key) != NULL)\n\n#define usbi_start_event_handling(ctx) \\\n\tusbi_tls_key_set((ctx)->event_handling_key, ctx)\n\n#define usbi_end_event_handling(ctx) \\\n\tusbi_tls_key_set((ctx)->event_handling_key, NULL)\n\n/* Update the following macro if new event sources are added */\n#define usbi_pending_events(ctx) \\\n\t((ctx)->event_flags || (ctx)->device_close \\\n\t || !list_empty(&(ctx)->hotplug_msgs) || !list_empty(&(ctx)->completed_transfers))\n\n#ifdef USBI_TIMERFD_AVAILABLE\n#define usbi_using_timerfd(ctx) ((ctx)->timerfd >= 0)\n#else\n#define usbi_using_timerfd(ctx) (0)\n#endif\n\nstruct libusb_device {\n\t/* lock protects refcnt, everything else is finalized at initialization\n\t * time */\n\tusbi_mutex_t lock;\n\tint refcnt;\n\n\tstruct libusb_context *ctx;\n\n\tuint8_t bus_number;\n\tuint8_t port_number;\n\tstruct libusb_device* parent_dev;\n\tuint8_t device_address;\n\tuint8_t num_configurations;\n\tenum libusb_speed speed;\n\n\tstruct list_head list;\n\tunsigned long session_data;\n\n\tstruct libusb_device_descriptor device_descriptor;\n\tint attached;\n\n\tunsigned char os_priv\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n\t[] /* valid C99 code */\n#else\n\t[0] /* non-standard, but usually working code */\n#endif\n#if defined(OS_SUNOS)\n\t__attribute__ ((aligned (8)));\n#else\n\t;\n#endif\n};\n\nstruct libusb_device_handle {\n\t/* lock protects claimed_interfaces */\n\tusbi_mutex_t lock;\n\tunsigned long claimed_interfaces;\n\n\tstruct list_head list;\n\tstruct libusb_device *dev;\n\tint auto_detach_kernel_driver;\n\tunsigned char os_priv\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n\t[] /* valid C99 code */\n#else\n\t[0] /* non-standard, but usually working code */\n#endif\n#if defined(OS_SUNOS)\n\t__attribute__ ((aligned (8)));\n#else\n\t;\n#endif\n};\n\nenum {\n\tUSBI_CLOCK_MONOTONIC,\n\tUSBI_CLOCK_REALTIME\n};\n\n/* in-memory transfer layout:\n *\n * 1. struct usbi_transfer\n * 2. struct libusb_transfer (which includes iso packets) [variable size]\n * 3. os private data [variable size]\n *\n * from a libusb_transfer, you can get the usbi_transfer by rewinding the\n * appropriate number of bytes.\n * the usbi_transfer includes the number of allocated packets, so you can\n * determine the size of the transfer and hence the start and length of the\n * OS-private data.\n */\n\nstruct usbi_transfer {\n\tint num_iso_packets;\n\tstruct list_head list;\n\tstruct list_head completed_list;\n\tstruct timeval timeout;\n\tint transferred;\n\tuint32_t stream_id;\n\tuint8_t state_flags;   /* Protected by usbi_transfer->lock */\n\tuint8_t timeout_flags; /* Protected by the flying_stransfers_lock */\n\n\t/* this lock is held during libusb_submit_transfer() and\n\t * libusb_cancel_transfer() (allowing the OS backend to prevent duplicate\n\t * cancellation, submission-during-cancellation, etc). the OS backend\n\t * should also take this lock in the handle_events path, to prevent the user\n\t * cancelling the transfer from another thread while you are processing\n\t * its completion (presumably there would be races within your OS backend\n\t * if this were possible).\n\t * Note paths taking both this and the flying_transfers_lock must\n\t * always take the flying_transfers_lock first */\n\tusbi_mutex_t lock;\n};\n\nenum usbi_transfer_state_flags {\n\t/* Transfer successfully submitted by backend */\n\tUSBI_TRANSFER_IN_FLIGHT = 1 << 0,\n\n\t/* Cancellation was requested via libusb_cancel_transfer() */\n\tUSBI_TRANSFER_CANCELLING = 1 << 1,\n\n\t/* Operation on the transfer failed because the device disappeared */\n\tUSBI_TRANSFER_DEVICE_DISAPPEARED = 1 << 2,\n};\n\nenum usbi_transfer_timeout_flags {\n\t/* Set by backend submit_transfer() if the OS handles timeout */\n\tUSBI_TRANSFER_OS_HANDLES_TIMEOUT = 1 << 0,\n\n\t/* The transfer timeout has been handled */\n\tUSBI_TRANSFER_TIMEOUT_HANDLED = 1 << 1,\n\n\t/* The transfer timeout was successfully processed */\n\tUSBI_TRANSFER_TIMED_OUT = 1 << 2,\n};\n\n#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)\t\t\t\\\n\t((struct libusb_transfer *)(((unsigned char *)(transfer))\t\\\n\t\t+ sizeof(struct usbi_transfer)))\n#define LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)\t\t\t\\\n\t((struct usbi_transfer *)(((unsigned char *)(transfer))\t\t\\\n\t\t- sizeof(struct usbi_transfer)))\n\nstatic inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer)\n{\n\treturn ((unsigned char *)transfer) + sizeof(struct usbi_transfer)\n\t\t+ sizeof(struct libusb_transfer)\n\t\t+ (transfer->num_iso_packets\n\t\t\t* sizeof(struct libusb_iso_packet_descriptor));\n}\n\n/* bus structures */\n\n/* All standard descriptors have these 2 fields in common */\nstruct usb_descriptor_header {\n\tuint8_t bLength;\n\tuint8_t bDescriptorType;\n};\n\n/* shared data and functions */\n\nint usbi_io_init(struct libusb_context *ctx);\nvoid usbi_io_exit(struct libusb_context *ctx);\n\nstruct libusb_device *usbi_alloc_device(struct libusb_context *ctx,\n\tunsigned long session_id);\nstruct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx,\n\tunsigned long session_id);\nint usbi_sanitize_device(struct libusb_device *dev);\nvoid usbi_handle_disconnect(struct libusb_device_handle *dev_handle);\n\nint usbi_handle_transfer_completion(struct usbi_transfer *itransfer,\n\tenum libusb_transfer_status status);\nint usbi_handle_transfer_cancellation(struct usbi_transfer *transfer);\nvoid usbi_signal_transfer_completion(struct usbi_transfer *transfer);\n\nint usbi_parse_descriptor(const unsigned char *source, const char *descriptor,\n\tvoid *dest, int host_endian);\nint usbi_device_cache_descriptor(libusb_device *dev);\nint usbi_get_config_index_by_value(struct libusb_device *dev,\n\tuint8_t bConfigurationValue, int *idx);\n\nvoid usbi_connect_device (struct libusb_device *dev);\nvoid usbi_disconnect_device (struct libusb_device *dev);\n\nint usbi_signal_event(struct libusb_context *ctx);\nint usbi_clear_event(struct libusb_context *ctx);\n\n/* Internal abstraction for poll (needs struct usbi_transfer on Windows) */\n#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD) ||\\\n\tdefined(OS_HAIKU) || defined(OS_SUNOS)\n#include <unistd.h>\n#include \"os/poll_posix.h\"\n#elif defined(OS_WINDOWS) || defined(OS_WINCE)\n#include \"os/poll_windows.h\"\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER < 1900)\n#define snprintf usbi_snprintf\n#define vsnprintf usbi_vsnprintf\nint usbi_snprintf(char *dst, size_t size, const char *format, ...);\nint usbi_vsnprintf(char *dst, size_t size, const char *format, va_list ap);\n#define LIBUSB_PRINTF_WIN32\n#endif\n\nstruct usbi_pollfd {\n\t/* must come first */\n\tstruct libusb_pollfd pollfd;\n\n\tstruct list_head list;\n};\n\nint usbi_add_pollfd(struct libusb_context *ctx, int fd, short events);\nvoid usbi_remove_pollfd(struct libusb_context *ctx, int fd);\n\n/* device discovery */\n\n/* we traverse usbfs without knowing how many devices we are going to find.\n * so we create this discovered_devs model which is similar to a linked-list\n * which grows when required. it can be freed once discovery has completed,\n * eliminating the need for a list node in the libusb_device structure\n * itself. */\nstruct discovered_devs {\n\tsize_t len;\n\tsize_t capacity;\n\tstruct libusb_device *devices\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n\t[] /* valid C99 code */\n#else\n\t[0] /* non-standard, but usually working code */\n#endif\n\t;\n};\n\nstruct discovered_devs *discovered_devs_append(\n\tstruct discovered_devs *discdevs, struct libusb_device *dev);\n\n/* OS abstraction */\n\n/* This is the interface that OS backends need to implement.\n * All fields are mandatory, except ones explicitly noted as optional. */\nstruct usbi_os_backend {\n\t/* A human-readable name for your backend, e.g. \"Linux usbfs\" */\n\tconst char *name;\n\n\t/* Binary mask for backend specific capabilities */\n\tuint32_t caps;\n\n\t/* Perform initialization of your backend. You might use this function\n\t * to determine specific capabilities of the system, allocate required\n\t * data structures for later, etc.\n\t *\n\t * This function is called when a libusb user initializes the library\n\t * prior to use.\n\t *\n\t * Return 0 on success, or a LIBUSB_ERROR code on failure.\n\t */\n\tint (*init)(struct libusb_context *ctx);\n\n\t/* Deinitialization. Optional. This function should destroy anything\n\t * that was set up by init.\n\t *\n\t * This function is called when the user deinitializes the library.\n\t */\n\tvoid (*exit)(void);\n\n\t/* Enumerate all the USB devices on the system, returning them in a list\n\t * of discovered devices.\n\t *\n\t * Your implementation should enumerate all devices on the system,\n\t * regardless of whether they have been seen before or not.\n\t *\n\t * When you have found a device, compute a session ID for it. The session\n\t * ID should uniquely represent that particular device for that particular\n\t * connection session since boot (i.e. if you disconnect and reconnect a\n\t * device immediately after, it should be assigned a different session ID).\n\t * If your OS cannot provide a unique session ID as described above,\n\t * presenting a session ID of (bus_number << 8 | device_address) should\n\t * be sufficient. Bus numbers and device addresses wrap and get reused,\n\t * but that is an unlikely case.\n\t *\n\t * After computing a session ID for a device, call\n\t * usbi_get_device_by_session_id(). This function checks if libusb already\n\t * knows about the device, and if so, it provides you with a reference\n\t * to a libusb_device structure for it.\n\t *\n\t * If usbi_get_device_by_session_id() returns NULL, it is time to allocate\n\t * a new device structure for the device. Call usbi_alloc_device() to\n\t * obtain a new libusb_device structure with reference count 1. Populate\n\t * the bus_number and device_address attributes of the new device, and\n\t * perform any other internal backend initialization you need to do. At\n\t * this point, you should be ready to provide device descriptors and so\n\t * on through the get_*_descriptor functions. Finally, call\n\t * usbi_sanitize_device() to perform some final sanity checks on the\n\t * device. Assuming all of the above succeeded, we can now continue.\n\t * If any of the above failed, remember to unreference the device that\n\t * was returned by usbi_alloc_device().\n\t *\n\t * At this stage we have a populated libusb_device structure (either one\n\t * that was found earlier, or one that we have just allocated and\n\t * populated). This can now be added to the discovered devices list\n\t * using discovered_devs_append(). Note that discovered_devs_append()\n\t * may reallocate the list, returning a new location for it, and also\n\t * note that reallocation can fail. Your backend should handle these\n\t * error conditions appropriately.\n\t *\n\t * This function should not generate any bus I/O and should not block.\n\t * If I/O is required (e.g. reading the active configuration value), it is\n\t * OK to ignore these suggestions :)\n\t *\n\t * This function is executed when the user wishes to retrieve a list\n\t * of USB devices connected to the system.\n\t *\n\t * If the backend has hotplug support, this function is not used!\n\t *\n\t * Return 0 on success, or a LIBUSB_ERROR code on failure.\n\t */\n\tint (*get_device_list)(struct libusb_context *ctx,\n\t\tstruct discovered_devs **discdevs);\n\n\t/* Apps which were written before hotplug support, may listen for\n\t * hotplug events on their own and call libusb_get_device_list on\n\t * device addition. In this case libusb_get_device_list will likely\n\t * return a list without the new device in there, as the hotplug\n\t * event thread will still be busy enumerating the device, which may\n\t * take a while, or may not even have seen the event yet.\n\t *\n\t * To avoid this libusb_get_device_list will call this optional\n\t * function for backends with hotplug support before copying\n\t * ctx->usb_devs to the user. In this function the backend should\n\t * ensure any pending hotplug events are fully processed before\n\t * returning.\n\t *\n\t * Optional, should be implemented by backends with hotplug support.\n\t */\n\tvoid (*hotplug_poll)(void);\n\n\t/* Open a device for I/O and other USB operations. The device handle\n\t * is preallocated for you, you can retrieve the device in question\n\t * through handle->dev.\n\t *\n\t * Your backend should allocate any internal resources required for I/O\n\t * and other operations so that those operations can happen (hopefully)\n\t * without hiccup. This is also a good place to inform libusb that it\n\t * should monitor certain file descriptors related to this device -\n\t * see the usbi_add_pollfd() function.\n\t *\n\t * This function should not generate any bus I/O and should not block.\n\t *\n\t * This function is called when the user attempts to obtain a device\n\t * handle for a device.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_ACCESS if the user has insufficient permissions\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since\n\t *   discovery\n\t * - another LIBUSB_ERROR code on other failure\n\t *\n\t * Do not worry about freeing the handle on failed open, the upper layers\n\t * do this for you.\n\t */\n\tint (*open)(struct libusb_device_handle *dev_handle);\n\n\t/* Close a device such that the handle cannot be used again. Your backend\n\t * should destroy any resources that were allocated in the open path.\n\t * This may also be a good place to call usbi_remove_pollfd() to inform\n\t * libusb of any file descriptors associated with this device that should\n\t * no longer be monitored.\n\t *\n\t * This function is called when the user closes a device handle.\n\t */\n\tvoid (*close)(struct libusb_device_handle *dev_handle);\n\n\t/* Retrieve the device descriptor from a device.\n\t *\n\t * The descriptor should be retrieved from memory, NOT via bus I/O to the\n\t * device. This means that you may have to cache it in a private structure\n\t * during get_device_list enumeration. Alternatively, you may be able\n\t * to retrieve it from a kernel interface (some Linux setups can do this)\n\t * still without generating bus I/O.\n\t *\n\t * This function is expected to write DEVICE_DESC_LENGTH (18) bytes into\n\t * buffer, which is guaranteed to be big enough.\n\t *\n\t * This function is called when sanity-checking a device before adding\n\t * it to the list of discovered devices, and also when the user requests\n\t * to read the device descriptor.\n\t *\n\t * This function is expected to return the descriptor in bus-endian format\n\t * (LE). If it returns the multi-byte values in host-endian format,\n\t * set the host_endian output parameter to \"1\".\n\t *\n\t * Return 0 on success or a LIBUSB_ERROR code on failure.\n\t */\n\tint (*get_device_descriptor)(struct libusb_device *device,\n\t\tunsigned char *buffer, int *host_endian);\n\n\t/* Get the ACTIVE configuration descriptor for a device.\n\t *\n\t * The descriptor should be retrieved from memory, NOT via bus I/O to the\n\t * device. This means that you may have to cache it in a private structure\n\t * during get_device_list enumeration. You may also have to keep track\n\t * of which configuration is active when the user changes it.\n\t *\n\t * This function is expected to write len bytes of data into buffer, which\n\t * is guaranteed to be big enough. If you can only do a partial write,\n\t * return an error code.\n\t *\n\t * This function is expected to return the descriptor in bus-endian format\n\t * (LE). If it returns the multi-byte values in host-endian format,\n\t * set the host_endian output parameter to \"1\".\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*get_active_config_descriptor)(struct libusb_device *device,\n\t\tunsigned char *buffer, size_t len, int *host_endian);\n\n\t/* Get a specific configuration descriptor for a device.\n\t *\n\t * The descriptor should be retrieved from memory, NOT via bus I/O to the\n\t * device. This means that you may have to cache it in a private structure\n\t * during get_device_list enumeration.\n\t *\n\t * The requested descriptor is expressed as a zero-based index (i.e. 0\n\t * indicates that we are requesting the first descriptor). The index does\n\t * not (necessarily) equal the bConfigurationValue of the configuration\n\t * being requested.\n\t *\n\t * This function is expected to write len bytes of data into buffer, which\n\t * is guaranteed to be big enough. If you can only do a partial write,\n\t * return an error code.\n\t *\n\t * This function is expected to return the descriptor in bus-endian format\n\t * (LE). If it returns the multi-byte values in host-endian format,\n\t * set the host_endian output parameter to \"1\".\n\t *\n\t * Return the length read on success or a LIBUSB_ERROR code on failure.\n\t */\n\tint (*get_config_descriptor)(struct libusb_device *device,\n\t\tuint8_t config_index, unsigned char *buffer, size_t len,\n\t\tint *host_endian);\n\n\t/* Like get_config_descriptor but then by bConfigurationValue instead\n\t * of by index.\n\t *\n\t * Optional, if not present the core will call get_config_descriptor\n\t * for all configs until it finds the desired bConfigurationValue.\n\t *\n\t * Returns a pointer to the raw-descriptor in *buffer, this memory\n\t * is valid as long as device is valid.\n\t *\n\t * Returns the length of the returned raw-descriptor on success,\n\t * or a LIBUSB_ERROR code on failure.\n\t */\n\tint (*get_config_descriptor_by_value)(struct libusb_device *device,\n\t\tuint8_t bConfigurationValue, unsigned char **buffer,\n\t\tint *host_endian);\n\n\t/* Get the bConfigurationValue for the active configuration for a device.\n\t * Optional. This should only be implemented if you can retrieve it from\n\t * cache (don't generate I/O).\n\t *\n\t * If you cannot retrieve this from cache, either do not implement this\n\t * function, or return LIBUSB_ERROR_NOT_SUPPORTED. This will cause\n\t * libusb to retrieve the information through a standard control transfer.\n\t *\n\t * This function must be non-blocking.\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - LIBUSB_ERROR_NOT_SUPPORTED if the value cannot be retrieved without\n\t *   blocking\n\t * - another LIBUSB_ERROR code on other failure.\n\t */\n\tint (*get_configuration)(struct libusb_device_handle *dev_handle, int *config);\n\n\t/* Set the active configuration for a device.\n\t *\n\t * A configuration value of -1 should put the device in unconfigured state.\n\t *\n\t * This function can block.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if the configuration does not exist\n\t * - LIBUSB_ERROR_BUSY if interfaces are currently claimed (and hence\n\t *   configuration cannot be changed)\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - another LIBUSB_ERROR code on other failure.\n\t */\n\tint (*set_configuration)(struct libusb_device_handle *dev_handle, int config);\n\n\t/* Claim an interface. When claimed, the application can then perform\n\t * I/O to an interface's endpoints.\n\t *\n\t * This function should not generate any bus I/O and should not block.\n\t * Interface claiming is a logical operation that simply ensures that\n\t * no other drivers/applications are using the interface, and after\n\t * claiming, no other drivers/applications can use the interface because\n\t * we now \"own\" it.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if the interface does not exist\n\t * - LIBUSB_ERROR_BUSY if the interface is in use by another driver/app\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*claim_interface)(struct libusb_device_handle *dev_handle, int interface_number);\n\n\t/* Release a previously claimed interface.\n\t *\n\t * This function should also generate a SET_INTERFACE control request,\n\t * resetting the alternate setting of that interface to 0. It's OK for\n\t * this function to block as a result.\n\t *\n\t * You will only ever be asked to release an interface which was\n\t * successfully claimed earlier.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*release_interface)(struct libusb_device_handle *dev_handle, int interface_number);\n\n\t/* Set the alternate setting for an interface.\n\t *\n\t * You will only ever be asked to set the alternate setting for an\n\t * interface which was successfully claimed earlier.\n\t *\n\t * It's OK for this function to block.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if the alternate setting does not exist\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*set_interface_altsetting)(struct libusb_device_handle *dev_handle,\n\t\tint interface_number, int altsetting);\n\n\t/* Clear a halt/stall condition on an endpoint.\n\t *\n\t * It's OK for this function to block.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*clear_halt)(struct libusb_device_handle *dev_handle,\n\t\tunsigned char endpoint);\n\n\t/* Perform a USB port reset to reinitialize a device.\n\t *\n\t * If possible, the device handle should still be usable after the reset\n\t * completes, assuming that the device descriptors did not change during\n\t * reset and all previous interface state can be restored.\n\t *\n\t * If something changes, or you cannot easily locate/verify the resetted\n\t * device, return LIBUSB_ERROR_NOT_FOUND. This prompts the application\n\t * to close the old handle and re-enumerate the device.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the device\n\t *   has been disconnected since it was opened\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*reset_device)(struct libusb_device_handle *dev_handle);\n\n\t/* Alloc num_streams usb3 bulk streams on the passed in endpoints */\n\tint (*alloc_streams)(struct libusb_device_handle *dev_handle,\n\t\tuint32_t num_streams, unsigned char *endpoints, int num_endpoints);\n\n\t/* Free usb3 bulk streams allocated with alloc_streams */\n\tint (*free_streams)(struct libusb_device_handle *dev_handle,\n\t\tunsigned char *endpoints, int num_endpoints);\n\n\t/* Allocate persistent DMA memory for the given device, suitable for\n\t * zerocopy. May return NULL on failure. Optional to implement.\n\t */\n\tunsigned char *(*dev_mem_alloc)(struct libusb_device_handle *handle,\n\t\tsize_t len);\n\n\t/* Free memory allocated by dev_mem_alloc. */\n\tint (*dev_mem_free)(struct libusb_device_handle *handle,\n\t\tunsigned char *buffer, size_t len);\n\n\t/* Determine if a kernel driver is active on an interface. Optional.\n\t *\n\t * The presence of a kernel driver on an interface indicates that any\n\t * calls to claim_interface would fail with the LIBUSB_ERROR_BUSY code.\n\t *\n\t * Return:\n\t * - 0 if no driver is active\n\t * - 1 if a driver is active\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*kernel_driver_active)(struct libusb_device_handle *dev_handle,\n\t\tint interface_number);\n\n\t/* Detach a kernel driver from an interface. Optional.\n\t *\n\t * After detaching a kernel driver, the interface should be available\n\t * for claim.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active\n\t * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*detach_kernel_driver)(struct libusb_device_handle *dev_handle,\n\t\tint interface_number);\n\n\t/* Attach a kernel driver to an interface. Optional.\n\t *\n\t * Reattach a kernel driver to the device.\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active\n\t * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it\n\t *   was opened\n\t * - LIBUSB_ERROR_BUSY if a program or driver has claimed the interface,\n\t *   preventing reattachment\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*attach_kernel_driver)(struct libusb_device_handle *dev_handle,\n\t\tint interface_number);\n\n\t/* Destroy a device. Optional.\n\t *\n\t * This function is called when the last reference to a device is\n\t * destroyed. It should free any resources allocated in the get_device_list\n\t * path.\n\t */\n\tvoid (*destroy_device)(struct libusb_device *dev);\n\n\t/* Submit a transfer. Your implementation should take the transfer,\n\t * morph it into whatever form your platform requires, and submit it\n\t * asynchronously.\n\t *\n\t * This function must not block.\n\t *\n\t * This function gets called with the flying_transfers_lock locked!\n\t *\n\t * Return:\n\t * - 0 on success\n\t * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n\t * - another LIBUSB_ERROR code on other failure\n\t */\n\tint (*submit_transfer)(struct usbi_transfer *itransfer);\n\n\t/* Cancel a previously submitted transfer.\n\t *\n\t * This function must not block. The transfer cancellation must complete\n\t * later, resulting in a call to usbi_handle_transfer_cancellation()\n\t * from the context of handle_events.\n\t */\n\tint (*cancel_transfer)(struct usbi_transfer *itransfer);\n\n\t/* Clear a transfer as if it has completed or cancelled, but do not\n\t * report any completion/cancellation to the library. You should free\n\t * all private data from the transfer as if you were just about to report\n\t * completion or cancellation.\n\t *\n\t * This function might seem a bit out of place. It is used when libusb\n\t * detects a disconnected device - it calls this function for all pending\n\t * transfers before reporting completion (with the disconnect code) to\n\t * the user. Maybe we can improve upon this internal interface in future.\n\t */\n\tvoid (*clear_transfer_priv)(struct usbi_transfer *itransfer);\n\n\t/* Handle any pending events on file descriptors. Optional.\n\t *\n\t * Provide this function when file descriptors directly indicate device\n\t * or transfer activity. If your backend does not have such file descriptors,\n\t * implement the handle_transfer_completion function below.\n\t *\n\t * This involves monitoring any active transfers and processing their\n\t * completion or cancellation.\n\t *\n\t * The function is passed an array of pollfd structures (size nfds)\n\t * as a result of the poll() system call. The num_ready parameter\n\t * indicates the number of file descriptors that have reported events\n\t * (i.e. the poll() return value). This should be enough information\n\t * for you to determine which actions need to be taken on the currently\n\t * active transfers.\n\t *\n\t * For any cancelled transfers, call usbi_handle_transfer_cancellation().\n\t * For completed transfers, call usbi_handle_transfer_completion().\n\t * For control/bulk/interrupt transfers, populate the \"transferred\"\n\t * element of the appropriate usbi_transfer structure before calling the\n\t * above functions. For isochronous transfers, populate the status and\n\t * transferred fields of the iso packet descriptors of the transfer.\n\t *\n\t * This function should also be able to detect disconnection of the\n\t * device, reporting that situation with usbi_handle_disconnect().\n\t *\n\t * When processing an event related to a transfer, you probably want to\n\t * take usbi_transfer.lock to prevent races. See the documentation for\n\t * the usbi_transfer structure.\n\t *\n\t * Return 0 on success, or a LIBUSB_ERROR code on failure.\n\t */\n\tint (*handle_events)(struct libusb_context *ctx,\n\t\tstruct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready);\n\n\t/* Handle transfer completion. Optional.\n\t *\n\t * Provide this function when there are no file descriptors available\n\t * that directly indicate device or transfer activity. If your backend does\n\t * have such file descriptors, implement the handle_events function above.\n\t *\n\t * Your backend must tell the library when a transfer has completed by\n\t * calling usbi_signal_transfer_completion(). You should store any private\n\t * information about the transfer and its completion status in the transfer's\n\t * private backend data.\n\t *\n\t * During event handling, this function will be called on each transfer for\n\t * which usbi_signal_transfer_completion() was called.\n\t *\n\t * For any cancelled transfers, call usbi_handle_transfer_cancellation().\n\t * For completed transfers, call usbi_handle_transfer_completion().\n\t * For control/bulk/interrupt transfers, populate the \"transferred\"\n\t * element of the appropriate usbi_transfer structure before calling the\n\t * above functions. For isochronous transfers, populate the status and\n\t * transferred fields of the iso packet descriptors of the transfer.\n\t *\n\t * Return 0 on success, or a LIBUSB_ERROR code on failure.\n\t */\n\tint (*handle_transfer_completion)(struct usbi_transfer *itransfer);\n\n\t/* Get time from specified clock. At least two clocks must be implemented\n\t   by the backend: USBI_CLOCK_REALTIME, and USBI_CLOCK_MONOTONIC.\n\n\t   Description of clocks:\n\t     USBI_CLOCK_REALTIME : clock returns time since system epoch.\n\t     USBI_CLOCK_MONOTONIC: clock returns time since unspecified start\n\t                             time (usually boot).\n\t */\n\tint (*clock_gettime)(int clkid, struct timespec *tp);\n\n#ifdef USBI_TIMERFD_AVAILABLE\n\t/* clock ID of the clock that should be used for timerfd */\n\tclockid_t (*get_timerfd_clockid)(void);\n#endif\n\n\t/* Number of bytes to reserve for per-device private backend data.\n\t * This private data area is accessible through the \"os_priv\" field of\n\t * struct libusb_device. */\n\tsize_t device_priv_size;\n\n\t/* Number of bytes to reserve for per-handle private backend data.\n\t * This private data area is accessible through the \"os_priv\" field of\n\t * struct libusb_device. */\n\tsize_t device_handle_priv_size;\n\n\t/* Number of bytes to reserve for per-transfer private backend data.\n\t * This private data area is accessible by calling\n\t * usbi_transfer_get_os_priv() on the appropriate usbi_transfer instance.\n\t */\n\tsize_t transfer_priv_size;\n};\n\nextern const struct usbi_os_backend * const usbi_backend;\n\nextern const struct usbi_os_backend linux_usbfs_backend;\nextern const struct usbi_os_backend darwin_backend;\nextern const struct usbi_os_backend openbsd_backend;\nextern const struct usbi_os_backend netbsd_backend;\nextern const struct usbi_os_backend windows_backend;\nextern const struct usbi_os_backend usbdk_backend;\nextern const struct usbi_os_backend wince_backend;\nextern const struct usbi_os_backend haiku_usb_raw_backend;\nextern const struct usbi_os_backend sunos_backend;\n\nextern struct list_head active_contexts_list;\nextern usbi_mutex_static_t active_contexts_lock;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.c",
    "content": "/* -*- Mode: C; indent-tabs-mode:nil -*- */\n/*\n * darwin backend for libusb 1.0\n * Copyright © 2008-2016 Nathan Hjelm <hjelmn@users.sourceforge.net>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include \"config.h\"\n#include <time.h>\n#include <ctype.h>\n#include <errno.h>\n#include <pthread.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/sysctl.h>\n\n#include <mach/clock.h>\n#include <mach/clock_types.h>\n#include <mach/mach_host.h>\n#include <mach/mach_port.h>\n\n#include <AvailabilityMacros.h>\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && MAC_OS_X_VERSION_MIN_REQUIRED < 101200\n  #include <objc/objc-auto.h>\n#endif\n\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101200\n/* Apple deprecated the darwin atomics in 10.12 in favor of C11 atomics */\n#include <stdatomic.h>\n#define libusb_darwin_atomic_fetch_add(x, y) atomic_fetch_add(x, y)\n\n_Atomic int32_t initCount = ATOMIC_VAR_INIT(0);\n#else\n/* use darwin atomics if the target is older than 10.12 */\n#include <libkern/OSAtomic.h>\n\n/* OSAtomicAdd32Barrier returns the new value */\n#define libusb_darwin_atomic_fetch_add(x, y) (OSAtomicAdd32Barrier(y, x) - y)\n\nstatic volatile int32_t initCount = 0;\n#endif\n\n#include \"darwin_usb.h\"\n\n/* async event thread */\nstatic pthread_mutex_t libusb_darwin_at_mutex = PTHREAD_MUTEX_INITIALIZER;\nstatic pthread_cond_t  libusb_darwin_at_cond = PTHREAD_COND_INITIALIZER;\n\nstatic pthread_once_t darwin_init_once = PTHREAD_ONCE_INIT;\n\nstatic clock_serv_t clock_realtime;\nstatic clock_serv_t clock_monotonic;\n\nstatic CFRunLoopRef libusb_darwin_acfl = NULL; /* event cf loop */\nstatic CFRunLoopSourceRef libusb_darwin_acfls = NULL; /* shutdown signal for event cf loop */\n\nstatic usbi_mutex_t darwin_cached_devices_lock = PTHREAD_MUTEX_INITIALIZER;\nstatic struct list_head darwin_cached_devices = {&darwin_cached_devices, &darwin_cached_devices};\nstatic char *darwin_device_class = kIOUSBDeviceClassName;\n\n#define DARWIN_CACHED_DEVICE(a) ((struct darwin_cached_device *) (((struct darwin_device_priv *)((a)->os_priv))->dev))\n\n/* async event thread */\nstatic pthread_t libusb_darwin_at;\n\nstatic int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian);\nstatic int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface);\nstatic int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface);\nstatic int darwin_reset_device(struct libusb_device_handle *dev_handle);\nstatic void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0);\n\nstatic int darwin_scan_devices(struct libusb_context *ctx);\nstatic int process_new_device (struct libusb_context *ctx, io_service_t service);\n\n#if defined(ENABLE_LOGGING)\nstatic const char *darwin_error_str (int result) {\n  static char string_buffer[50];\n  switch (result) {\n  case kIOReturnSuccess:\n    return \"no error\";\n  case kIOReturnNotOpen:\n    return \"device not opened for exclusive access\";\n  case kIOReturnNoDevice:\n    return \"no connection to an IOService\";\n  case kIOUSBNoAsyncPortErr:\n    return \"no async port has been opened for interface\";\n  case kIOReturnExclusiveAccess:\n    return \"another process has device opened for exclusive access\";\n  case kIOUSBPipeStalled:\n    return \"pipe is stalled\";\n  case kIOReturnError:\n    return \"could not establish a connection to the Darwin kernel\";\n  case kIOUSBTransactionTimeout:\n    return \"transaction timed out\";\n  case kIOReturnBadArgument:\n    return \"invalid argument\";\n  case kIOReturnAborted:\n    return \"transaction aborted\";\n  case kIOReturnNotResponding:\n    return \"device not responding\";\n  case kIOReturnOverrun:\n    return \"data overrun\";\n  case kIOReturnCannotWire:\n    return \"physical memory can not be wired down\";\n  case kIOReturnNoResources:\n    return \"out of resources\";\n  case kIOUSBHighSpeedSplitError:\n    return \"high speed split error\";\n  default:\n    snprintf(string_buffer, sizeof(string_buffer), \"unknown error (0x%x)\", result);\n    return string_buffer;\n  }\n}\n#endif\n\nstatic int darwin_to_libusb (int result) {\n  switch (result) {\n  case kIOReturnUnderrun:\n  case kIOReturnSuccess:\n    return LIBUSB_SUCCESS;\n  case kIOReturnNotOpen:\n  case kIOReturnNoDevice:\n    return LIBUSB_ERROR_NO_DEVICE;\n  case kIOReturnExclusiveAccess:\n    return LIBUSB_ERROR_ACCESS;\n  case kIOUSBPipeStalled:\n    return LIBUSB_ERROR_PIPE;\n  case kIOReturnBadArgument:\n    return LIBUSB_ERROR_INVALID_PARAM;\n  case kIOUSBTransactionTimeout:\n    return LIBUSB_ERROR_TIMEOUT;\n  case kIOReturnNotResponding:\n  case kIOReturnAborted:\n  case kIOReturnError:\n  case kIOUSBNoAsyncPortErr:\n  default:\n    return LIBUSB_ERROR_OTHER;\n  }\n}\n\n/* this function must be called with the darwin_cached_devices_lock held */\nstatic void darwin_deref_cached_device(struct darwin_cached_device *cached_dev) {\n  cached_dev->refcount--;\n  /* free the device and remove it from the cache */\n  if (0 == cached_dev->refcount) {\n    list_del(&cached_dev->list);\n\n    (*(cached_dev->device))->Release(cached_dev->device);\n    free (cached_dev);\n  }\n}\n\nstatic void darwin_ref_cached_device(struct darwin_cached_device *cached_dev) {\n  cached_dev->refcount++;\n}\n\nstatic int ep_to_pipeRef(struct libusb_device_handle *dev_handle, uint8_t ep, uint8_t *pipep, uint8_t *ifcp, struct darwin_interface **interface_out) {\n  struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;\n\n  /* current interface */\n  struct darwin_interface *cInterface;\n\n  int8_t i, iface;\n\n  usbi_dbg (\"converting ep address 0x%02x to pipeRef and interface\", ep);\n\n  for (iface = 0 ; iface < USB_MAXINTERFACES ; iface++) {\n    cInterface = &priv->interfaces[iface];\n\n    if (dev_handle->claimed_interfaces & (1 << iface)) {\n      for (i = 0 ; i < cInterface->num_endpoints ; i++) {\n        if (cInterface->endpoint_addrs[i] == ep) {\n          *pipep = i + 1;\n\n          if (ifcp)\n            *ifcp = iface;\n\n          if (interface_out)\n            *interface_out = cInterface;\n\n          usbi_dbg (\"pipe %d on interface %d matches\", *pipep, iface);\n          return 0;\n        }\n      }\n    }\n  }\n\n  /* No pipe found with the correct endpoint address */\n  usbi_warn (HANDLE_CTX(dev_handle), \"no pipeRef found with endpoint address 0x%02x.\", ep);\n\n  return LIBUSB_ERROR_NOT_FOUND;\n}\n\nstatic int usb_setup_device_iterator (io_iterator_t *deviceIterator, UInt32 location) {\n  CFMutableDictionaryRef matchingDict = IOServiceMatching(darwin_device_class);\n\n  if (!matchingDict)\n    return kIOReturnError;\n\n  if (location) {\n    CFMutableDictionaryRef propertyMatchDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0,\n                                                                         &kCFTypeDictionaryKeyCallBacks,\n                                                                         &kCFTypeDictionaryValueCallBacks);\n\n    if (propertyMatchDict) {\n      /* there are no unsigned CFNumber types so treat the value as signed. the os seems to do this\n         internally (CFNumberType of locationID is 3) */\n      CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberSInt32Type, &location);\n\n      CFDictionarySetValue (propertyMatchDict, CFSTR(kUSBDevicePropertyLocationID), locationCF);\n      /* release our reference to the CFNumber (CFDictionarySetValue retains it) */\n      CFRelease (locationCF);\n\n      CFDictionarySetValue (matchingDict, CFSTR(kIOPropertyMatchKey), propertyMatchDict);\n      /* release out reference to the CFMutableDictionaryRef (CFDictionarySetValue retains it) */\n      CFRelease (propertyMatchDict);\n    }\n    /* else we can still proceed as long as the caller accounts for the possibility of other devices in the iterator */\n  }\n\n  return IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, deviceIterator);\n}\n\n/* Returns 1 on success, 0 on failure. */\nstatic int get_ioregistry_value_number (io_service_t service, CFStringRef property, CFNumberType type, void *p) {\n  CFTypeRef cfNumber = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0);\n  int ret = 0;\n\n  if (cfNumber) {\n    if (CFGetTypeID(cfNumber) == CFNumberGetTypeID()) {\n      ret = CFNumberGetValue(cfNumber, type, p);\n    }\n\n    CFRelease (cfNumber);\n  }\n\n  return ret;\n}\n\nstatic int get_ioregistry_value_data (io_service_t service, CFStringRef property, ssize_t size, void *p) {\n  CFTypeRef cfData = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0);\n  int ret = 0;\n\n  if (cfData) {\n    if (CFGetTypeID (cfData) == CFDataGetTypeID ()) {\n      CFIndex length = CFDataGetLength (cfData);\n      if (length < size) {\n        size = length;\n      }\n\n      CFDataGetBytes (cfData, CFRangeMake(0, size), p);\n      ret = 1;\n    }\n\n    CFRelease (cfData);\n  }\n\n  return ret;\n}\n\nstatic usb_device_t **darwin_device_from_service (io_service_t service)\n{\n  io_cf_plugin_ref_t *plugInInterface = NULL;\n  usb_device_t **device;\n  kern_return_t result;\n  SInt32 score;\n\n  result = IOCreatePlugInInterfaceForService(service, kIOUSBDeviceUserClientTypeID,\n                                             kIOCFPlugInInterfaceID, &plugInInterface,\n                                             &score);\n\n  if (kIOReturnSuccess != result || !plugInInterface) {\n    usbi_dbg (\"could not set up plugin for service: %s\", darwin_error_str (result));\n    return NULL;\n  }\n\n  (void)(*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(DeviceInterfaceID),\n                                           (LPVOID)&device);\n  /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */\n  (*plugInInterface)->Release (plugInInterface);\n\n  return device;\n}\n\nstatic void darwin_devices_attached (void *ptr, io_iterator_t add_devices) {\n  struct libusb_context *ctx;\n  io_service_t service;\n\n  usbi_mutex_lock(&active_contexts_lock);\n\n  while ((service = IOIteratorNext(add_devices))) {\n    /* add this device to each active context's device list */\n    list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {\n      process_new_device (ctx, service);;\n    }\n\n    IOObjectRelease(service);\n  }\n\n  usbi_mutex_unlock(&active_contexts_lock);\n}\n\nstatic void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) {\n  struct libusb_device *dev = NULL;\n  struct libusb_context *ctx;\n  struct darwin_cached_device *old_device;\n\n  io_service_t device;\n  UInt64 session;\n  int ret;\n\n  usbi_mutex_lock(&active_contexts_lock);\n\n  while ((device = IOIteratorNext (rem_devices)) != 0) {\n    /* get the location from the i/o registry */\n    ret = get_ioregistry_value_number (device, CFSTR(\"sessionID\"), kCFNumberSInt64Type, &session);\n    IOObjectRelease (device);\n    if (!ret)\n      continue;\n\n    /* we need to match darwin_ref_cached_device call made in darwin_get_cached_device function\n       otherwise no cached device will ever get freed */\n    usbi_mutex_lock(&darwin_cached_devices_lock);\n    list_for_each_entry(old_device, &darwin_cached_devices, list, struct darwin_cached_device) {\n      if (old_device->session == session) {\n        darwin_deref_cached_device (old_device);\n        break;\n      }\n    }\n    usbi_mutex_unlock(&darwin_cached_devices_lock);\n\n    list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {\n      usbi_dbg (\"notifying context %p of device disconnect\", ctx);\n\n      dev = usbi_get_device_by_session_id(ctx, (unsigned long) session);\n      if (dev) {\n        /* signal the core that this device has been disconnected. the core will tear down this device\n           when the reference count reaches 0 */\n        usbi_disconnect_device(dev);\n        libusb_unref_device(dev);\n      }\n    }\n  }\n\n  usbi_mutex_unlock(&active_contexts_lock);\n}\n\nstatic void darwin_hotplug_poll (void)\n{\n  /* not sure if 5 seconds will be too long/short but it should work ok */\n  mach_timespec_t timeout = {.tv_sec = 5, .tv_nsec = 0};\n\n  /* since a kernel thread may nodify the IOInterators used for\n   * hotplug notidication we can't just clear the iterators.\n   * instead just wait until all IOService providers are quiet */\n  (void) IOKitWaitQuiet (kIOMasterPortDefault, &timeout);\n}\n\nstatic void darwin_clear_iterator (io_iterator_t iter) {\n  io_service_t device;\n\n  while ((device = IOIteratorNext (iter)) != 0)\n    IOObjectRelease (device);\n}\n\nstatic void *darwin_event_thread_main (void *arg0) {\n  IOReturn kresult;\n  struct libusb_context *ctx = (struct libusb_context *)arg0;\n  CFRunLoopRef runloop;\n\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060\n  /* Set this thread's name, so it can be seen in the debugger\n     and crash reports. */\n  pthread_setname_np (\"org.libusb.device-hotplug\");\n#endif\n\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && MAC_OS_X_VERSION_MIN_REQUIRED < 101200\n  /* Tell the Objective-C garbage collector about this thread.\n     This is required because, unlike NSThreads, pthreads are\n     not automatically registered. Although we don't use\n     Objective-C, we use CoreFoundation, which does.\n     Garbage collection support was entirely removed in 10.12,\n     so don't bother there. */\n  objc_registerThreadWithCollector();\n#endif\n\n  /* hotplug (device arrival/removal) sources */\n  CFRunLoopSourceContext libusb_shutdown_cfsourcectx;\n  CFRunLoopSourceRef     libusb_notification_cfsource;\n  io_notification_port_t libusb_notification_port;\n  io_iterator_t          libusb_rem_device_iterator;\n  io_iterator_t          libusb_add_device_iterator;\n\n  usbi_dbg (\"creating hotplug event source\");\n\n  runloop = CFRunLoopGetCurrent ();\n  CFRetain (runloop);\n\n  /* add the shutdown cfsource to the run loop */\n  memset(&libusb_shutdown_cfsourcectx, 0, sizeof(libusb_shutdown_cfsourcectx));\n  libusb_shutdown_cfsourcectx.info = runloop;\n  libusb_shutdown_cfsourcectx.perform = (void (*)(void *))CFRunLoopStop;\n  libusb_darwin_acfls = CFRunLoopSourceCreate(NULL, 0, &libusb_shutdown_cfsourcectx);\n  CFRunLoopAddSource(runloop, libusb_darwin_acfls, kCFRunLoopDefaultMode);\n\n  /* add the notification port to the run loop */\n  libusb_notification_port     = IONotificationPortCreate (kIOMasterPortDefault);\n  libusb_notification_cfsource = IONotificationPortGetRunLoopSource (libusb_notification_port);\n  CFRunLoopAddSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode);\n\n  /* create notifications for removed devices */\n  kresult = IOServiceAddMatchingNotification (libusb_notification_port, kIOTerminatedNotification,\n                                              IOServiceMatching(darwin_device_class),\n                                              darwin_devices_detached,\n                                              ctx, &libusb_rem_device_iterator);\n\n  if (kresult != kIOReturnSuccess) {\n    usbi_err (ctx, \"could not add hotplug event source: %s\", darwin_error_str (kresult));\n\n    pthread_exit (NULL);\n  }\n\n  /* create notifications for attached devices */\n  kresult = IOServiceAddMatchingNotification(libusb_notification_port, kIOFirstMatchNotification,\n                                              IOServiceMatching(darwin_device_class),\n                                              darwin_devices_attached,\n                                              ctx, &libusb_add_device_iterator);\n\n  if (kresult != kIOReturnSuccess) {\n    usbi_err (ctx, \"could not add hotplug event source: %s\", darwin_error_str (kresult));\n\n    pthread_exit (NULL);\n  }\n\n  /* arm notifiers */\n  darwin_clear_iterator (libusb_rem_device_iterator);\n  darwin_clear_iterator (libusb_add_device_iterator);\n\n  usbi_dbg (\"darwin event thread ready to receive events\");\n\n  /* signal the main thread that the hotplug runloop has been created. */\n  pthread_mutex_lock (&libusb_darwin_at_mutex);\n  libusb_darwin_acfl = runloop;\n  pthread_cond_signal (&libusb_darwin_at_cond);\n  pthread_mutex_unlock (&libusb_darwin_at_mutex);\n\n  /* run the runloop */\n  CFRunLoopRun();\n\n  usbi_dbg (\"darwin event thread exiting\");\n\n  /* remove the notification cfsource */\n  CFRunLoopRemoveSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode);\n\n  /* remove the shutdown cfsource */\n  CFRunLoopRemoveSource(runloop, libusb_darwin_acfls, kCFRunLoopDefaultMode);\n\n  /* delete notification port */\n  IONotificationPortDestroy (libusb_notification_port);\n\n  /* delete iterators */\n  IOObjectRelease (libusb_rem_device_iterator);\n  IOObjectRelease (libusb_add_device_iterator);\n\n  CFRelease (libusb_darwin_acfls);\n  CFRelease (runloop);\n\n  libusb_darwin_acfls = NULL;\n  libusb_darwin_acfl = NULL;\n\n  pthread_exit (NULL);\n}\n\n/* cleanup function to destroy cached devices */\nstatic void __attribute__((destructor)) _darwin_finalize(void) {\n  struct darwin_cached_device *dev, *next;\n\n  usbi_mutex_lock(&darwin_cached_devices_lock);\n  list_for_each_entry_safe(dev, next, &darwin_cached_devices, list, struct darwin_cached_device) {\n    darwin_deref_cached_device(dev);\n  }\n  usbi_mutex_unlock(&darwin_cached_devices_lock);\n}\n\nstatic void darwin_check_version (void) {\n  /* adjust for changes in the USB stack in xnu 15 */\n  int sysctl_args[] = {CTL_KERN, KERN_OSRELEASE};\n  long version;\n  char version_string[256] = {'\\0',};\n  size_t length = 256;\n\n  sysctl(sysctl_args, 2, version_string, &length, NULL, 0);\n\n  errno = 0;\n  version = strtol (version_string, NULL, 10);\n  if (0 == errno && version >= 15) {\n    darwin_device_class = \"IOUSBHostDevice\";\n  }\n}\n\nstatic int darwin_init(struct libusb_context *ctx) {\n  host_name_port_t host_self;\n  int rc;\n\n  rc = pthread_once (&darwin_init_once, darwin_check_version);\n  if (rc) {\n    return LIBUSB_ERROR_OTHER;\n  }\n\n  rc = darwin_scan_devices (ctx);\n  if (LIBUSB_SUCCESS != rc) {\n    return rc;\n  }\n\n  if (libusb_darwin_atomic_fetch_add (&initCount, 1) == 0) {\n    /* create the clocks that will be used */\n\n    host_self = mach_host_self();\n    host_get_clock_service(host_self, CALENDAR_CLOCK, &clock_realtime);\n    host_get_clock_service(host_self, SYSTEM_CLOCK, &clock_monotonic);\n    mach_port_deallocate(mach_task_self(), host_self);\n\n    pthread_create (&libusb_darwin_at, NULL, darwin_event_thread_main, ctx);\n\n    pthread_mutex_lock (&libusb_darwin_at_mutex);\n    while (!libusb_darwin_acfl)\n      pthread_cond_wait (&libusb_darwin_at_cond, &libusb_darwin_at_mutex);\n    pthread_mutex_unlock (&libusb_darwin_at_mutex);\n  }\n\n  return rc;\n}\n\nstatic void darwin_exit (void) {\n  if (libusb_darwin_atomic_fetch_add (&initCount, -1) == 1) {\n    mach_port_deallocate(mach_task_self(), clock_realtime);\n    mach_port_deallocate(mach_task_self(), clock_monotonic);\n\n    /* stop the event runloop and wait for the thread to terminate. */\n    CFRunLoopSourceSignal(libusb_darwin_acfls);\n    CFRunLoopWakeUp (libusb_darwin_acfl);\n    pthread_join (libusb_darwin_at, NULL);\n  }\n}\n\nstatic int darwin_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) {\n  struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);\n\n  /* return cached copy */\n  memmove (buffer, &(priv->dev_descriptor), DEVICE_DESC_LENGTH);\n\n  *host_endian = 0;\n\n  return 0;\n}\n\nstatic int get_configuration_index (struct libusb_device *dev, int config_value) {\n  struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);\n  UInt8 i, numConfig;\n  IOUSBConfigurationDescriptorPtr desc;\n  IOReturn kresult;\n\n  /* is there a simpler way to determine the index? */\n  kresult = (*(priv->device))->GetNumberOfConfigurations (priv->device, &numConfig);\n  if (kresult != kIOReturnSuccess)\n    return darwin_to_libusb (kresult);\n\n  for (i = 0 ; i < numConfig ; i++) {\n    (*(priv->device))->GetConfigurationDescriptorPtr (priv->device, i, &desc);\n\n    if (desc->bConfigurationValue == config_value)\n      return i;\n  }\n\n  /* configuration not found */\n  return LIBUSB_ERROR_NOT_FOUND;\n}\n\nstatic int darwin_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) {\n  struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);\n  int config_index;\n\n  if (0 == priv->active_config)\n    return LIBUSB_ERROR_NOT_FOUND;\n\n  config_index = get_configuration_index (dev, priv->active_config);\n  if (config_index < 0)\n    return config_index;\n\n  return darwin_get_config_descriptor (dev, config_index, buffer, len, host_endian);\n}\n\nstatic int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) {\n  struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev);\n  IOUSBConfigurationDescriptorPtr desc;\n  IOReturn kresult;\n  int ret;\n\n  if (!priv || !priv->device)\n    return LIBUSB_ERROR_OTHER;\n\n  kresult = (*priv->device)->GetConfigurationDescriptorPtr (priv->device, config_index, &desc);\n  if (kresult == kIOReturnSuccess) {\n    /* copy descriptor */\n    if (libusb_le16_to_cpu(desc->wTotalLength) < len)\n      len = libusb_le16_to_cpu(desc->wTotalLength);\n\n    memmove (buffer, desc, len);\n\n    /* GetConfigurationDescriptorPtr returns the descriptor in USB bus order */\n    *host_endian = 0;\n  }\n\n  ret = darwin_to_libusb (kresult);\n  if (ret != LIBUSB_SUCCESS)\n    return ret;\n\n  return (int) len;\n}\n\n/* check whether the os has configured the device */\nstatic int darwin_check_configuration (struct libusb_context *ctx, struct darwin_cached_device *dev) {\n  usb_device_t **darwin_device = dev->device;\n\n  IOUSBConfigurationDescriptorPtr configDesc;\n  IOUSBFindInterfaceRequest request;\n  kern_return_t             kresult;\n  io_iterator_t             interface_iterator;\n  io_service_t              firstInterface;\n\n  if (dev->dev_descriptor.bNumConfigurations < 1) {\n    usbi_err (ctx, \"device has no configurations\");\n    return LIBUSB_ERROR_OTHER; /* no configurations at this speed so we can't use it */\n  }\n\n  /* checking the configuration of a root hub simulation takes ~1 s in 10.11. the device is\n     not usable anyway */\n  if (0x05ac == dev->dev_descriptor.idVendor && 0x8005 == dev->dev_descriptor.idProduct) {\n    usbi_dbg (\"ignoring configuration on root hub simulation\");\n    dev->active_config = 0;\n    return 0;\n  }\n\n  /* find the first configuration */\n  kresult = (*darwin_device)->GetConfigurationDescriptorPtr (darwin_device, 0, &configDesc);\n  dev->first_config = (kIOReturnSuccess == kresult) ? configDesc->bConfigurationValue : 1;\n\n  /* check if the device is already configured. there is probably a better way than iterating over the\n     to accomplish this (the trick is we need to avoid a call to GetConfigurations since buggy devices\n     might lock up on the device request) */\n\n  /* Setup the Interface Request */\n  request.bInterfaceClass    = kIOUSBFindInterfaceDontCare;\n  request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;\n  request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;\n  request.bAlternateSetting  = kIOUSBFindInterfaceDontCare;\n\n  kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator);\n  if (kresult)\n    return darwin_to_libusb (kresult);\n\n  /* iterate once */\n  firstInterface = IOIteratorNext(interface_iterator);\n\n  /* done with the interface iterator */\n  IOObjectRelease(interface_iterator);\n\n  if (firstInterface) {\n    IOObjectRelease (firstInterface);\n\n    /* device is configured */\n    if (dev->dev_descriptor.bNumConfigurations == 1)\n      /* to avoid problems with some devices get the configurations value from the configuration descriptor */\n      dev->active_config = dev->first_config;\n    else\n      /* devices with more than one configuration should work with GetConfiguration */\n      (*darwin_device)->GetConfiguration (darwin_device, &dev->active_config);\n  } else\n    /* not configured */\n    dev->active_config = 0;\n  \n  usbi_dbg (\"active config: %u, first config: %u\", dev->active_config, dev->first_config);\n\n  return 0;\n}\n\nstatic int darwin_request_descriptor (usb_device_t **device, UInt8 desc, UInt8 desc_index, void *buffer, size_t buffer_size) {\n  IOUSBDevRequestTO req;\n\n  memset (buffer, 0, buffer_size);\n\n  /* Set up request for descriptor/ */\n  req.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);\n  req.bRequest      = kUSBRqGetDescriptor;\n  req.wValue        = desc << 8;\n  req.wIndex        = desc_index;\n  req.wLength       = buffer_size;\n  req.pData         = buffer;\n  req.noDataTimeout = 20;\n  req.completionTimeout = 100;\n\n  return (*device)->DeviceRequestTO (device, &req);\n}\n\nstatic int darwin_cache_device_descriptor (struct libusb_context *ctx, struct darwin_cached_device *dev) {\n  usb_device_t **device = dev->device;\n  int retries = 1, delay = 30000;\n  int unsuspended = 0, try_unsuspend = 1, try_reconfigure = 1;\n  int is_open = 0;\n  int ret = 0, ret2;\n  UInt8 bDeviceClass;\n  UInt16 idProduct, idVendor;\n\n  dev->can_enumerate = 0;\n\n  (*device)->GetDeviceClass (device, &bDeviceClass);\n  (*device)->GetDeviceProduct (device, &idProduct);\n  (*device)->GetDeviceVendor (device, &idVendor);\n\n  /* According to Apple's documentation the device must be open for DeviceRequest but we may not be able to open some\n   * devices and Apple's USB Prober doesn't bother to open the device before issuing a descriptor request.  Still,\n   * to follow the spec as closely as possible, try opening the device */\n  is_open = ((*device)->USBDeviceOpenSeize(device) == kIOReturnSuccess);\n\n  do {\n    /**** retrieve device descriptor ****/\n    ret = darwin_request_descriptor (device, kUSBDeviceDesc, 0, &dev->dev_descriptor, sizeof(dev->dev_descriptor));\n\n    if (kIOReturnOverrun == ret && kUSBDeviceDesc == dev->dev_descriptor.bDescriptorType)\n      /* received an overrun error but we still received a device descriptor */\n      ret = kIOReturnSuccess;\n\n    if (kIOUSBVendorIDAppleComputer == idVendor) {\n      /* NTH: don't bother retrying or unsuspending Apple devices */\n      break;\n    }\n\n    if (kIOReturnSuccess == ret && (0 == dev->dev_descriptor.bNumConfigurations ||\n                                    0 == dev->dev_descriptor.bcdUSB)) {\n      /* work around for incorrectly configured devices */\n      if (try_reconfigure && is_open) {\n        usbi_dbg(\"descriptor appears to be invalid. resetting configuration before trying again...\");\n\n        /* set the first configuration */\n        (*device)->SetConfiguration(device, 1);\n\n        /* don't try to reconfigure again */\n        try_reconfigure = 0;\n      }\n\n      ret = kIOUSBPipeStalled;\n    }\n\n    if (kIOReturnSuccess != ret && is_open && try_unsuspend) {\n      /* device may be suspended. unsuspend it and try again */\n#if DeviceVersion >= 320\n      UInt32 info = 0;\n\n      /* IOUSBFamily 320+ provides a way to detect device suspension but earlier versions do not */\n      (void)(*device)->GetUSBDeviceInformation (device, &info);\n\n      /* note that the device was suspended */\n      if (info & (1 << kUSBInformationDeviceIsSuspendedBit) || 0 == info)\n        try_unsuspend = 1;\n#endif\n\n      if (try_unsuspend) {\n        /* try to unsuspend the device */\n        ret2 = (*device)->USBDeviceSuspend (device, 0);\n        if (kIOReturnSuccess != ret2) {\n          /* prevent log spew from poorly behaving devices.  this indicates the\n             os actually had trouble communicating with the device */\n          usbi_dbg(\"could not retrieve device descriptor. failed to unsuspend: %s\",darwin_error_str(ret2));\n        } else\n          unsuspended = 1;\n\n        try_unsuspend = 0;\n      }\n    }\n\n    if (kIOReturnSuccess != ret) {\n      usbi_dbg(\"kernel responded with code: 0x%08x. sleeping for %d ms before trying again\", ret, delay/1000);\n      /* sleep for a little while before trying again */\n      nanosleep(&(struct timespec){delay / 1000000, (delay * 1000) % 1000000000UL}, NULL);\n    }\n  } while (kIOReturnSuccess != ret && retries--);\n\n  if (unsuspended)\n    /* resuspend the device */\n    (void)(*device)->USBDeviceSuspend (device, 1);\n\n  if (is_open)\n    (void) (*device)->USBDeviceClose (device);\n\n  if (ret != kIOReturnSuccess) {\n    /* a debug message was already printed out for this error */\n    if (LIBUSB_CLASS_HUB == bDeviceClass)\n      usbi_dbg (\"could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device\",\n                idVendor, idProduct, darwin_error_str (ret), ret);\n    else\n      usbi_warn (ctx, \"could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device\",\n                 idVendor, idProduct, darwin_error_str (ret), ret);\n    return darwin_to_libusb (ret);\n  }\n\n  /* catch buggy hubs (which appear to be virtual). Apple's own USB prober has problems with these devices. */\n  if (libusb_le16_to_cpu (dev->dev_descriptor.idProduct) != idProduct) {\n    /* not a valid device */\n    usbi_warn (ctx, \"idProduct from iokit (%04x) does not match idProduct in descriptor (%04x). skipping device\",\n               idProduct, libusb_le16_to_cpu (dev->dev_descriptor.idProduct));\n    return LIBUSB_ERROR_NO_DEVICE;\n  }\n\n  usbi_dbg (\"cached device descriptor:\");\n  usbi_dbg (\"  bDescriptorType:    0x%02x\", dev->dev_descriptor.bDescriptorType);\n  usbi_dbg (\"  bcdUSB:             0x%04x\", dev->dev_descriptor.bcdUSB);\n  usbi_dbg (\"  bDeviceClass:       0x%02x\", dev->dev_descriptor.bDeviceClass);\n  usbi_dbg (\"  bDeviceSubClass:    0x%02x\", dev->dev_descriptor.bDeviceSubClass);\n  usbi_dbg (\"  bDeviceProtocol:    0x%02x\", dev->dev_descriptor.bDeviceProtocol);\n  usbi_dbg (\"  bMaxPacketSize0:    0x%02x\", dev->dev_descriptor.bMaxPacketSize0);\n  usbi_dbg (\"  idVendor:           0x%04x\", dev->dev_descriptor.idVendor);\n  usbi_dbg (\"  idProduct:          0x%04x\", dev->dev_descriptor.idProduct);\n  usbi_dbg (\"  bcdDevice:          0x%04x\", dev->dev_descriptor.bcdDevice);\n  usbi_dbg (\"  iManufacturer:      0x%02x\", dev->dev_descriptor.iManufacturer);\n  usbi_dbg (\"  iProduct:           0x%02x\", dev->dev_descriptor.iProduct);\n  usbi_dbg (\"  iSerialNumber:      0x%02x\", dev->dev_descriptor.iSerialNumber);\n  usbi_dbg (\"  bNumConfigurations: 0x%02x\", dev->dev_descriptor.bNumConfigurations);\n\n  dev->can_enumerate = 1;\n\n  return LIBUSB_SUCCESS;\n}\n\nstatic int get_device_port (io_service_t service, UInt8 *port) {\n  kern_return_t result;\n  io_service_t parent;\n  int ret = 0;\n\n  if (get_ioregistry_value_number (service, CFSTR(\"PortNum\"), kCFNumberSInt8Type, port)) {\n    return 1;\n  }\n\n  result = IORegistryEntryGetParentEntry (service, kIOServicePlane, &parent);\n  if (kIOReturnSuccess == result) {\n    ret = get_ioregistry_value_data (parent, CFSTR(\"port\"), 1, port);\n    IOObjectRelease (parent);\n  }\n\n  return ret;\n}\n\nstatic int darwin_get_cached_device(struct libusb_context *ctx, io_service_t service,\n                                    struct darwin_cached_device **cached_out) {\n  struct darwin_cached_device *new_device;\n  UInt64 sessionID = 0, parent_sessionID = 0;\n  int ret = LIBUSB_SUCCESS;\n  usb_device_t **device;\n  io_service_t parent;\n  kern_return_t result;\n  UInt8 port = 0;\n\n  /* get some info from the io registry */\n  (void) get_ioregistry_value_number (service, CFSTR(\"sessionID\"), kCFNumberSInt64Type, &sessionID);\n  if (!get_device_port (service, &port)) {\n    usbi_dbg(\"could not get connected port number\");\n  }\n\n  usbi_dbg(\"finding cached device for sessionID 0x%\" PRIx64, sessionID);\n\n  result = IORegistryEntryGetParentEntry (service, kIOUSBPlane, &parent);\n\n  if (kIOReturnSuccess == result) {\n    (void) get_ioregistry_value_number (parent, CFSTR(\"sessionID\"), kCFNumberSInt64Type, &parent_sessionID);\n    IOObjectRelease(parent);\n  }\n\n  usbi_mutex_lock(&darwin_cached_devices_lock);\n  do {\n    *cached_out = NULL;\n\n    list_for_each_entry(new_device, &darwin_cached_devices, list, struct darwin_cached_device) {\n      usbi_dbg(\"matching sessionID 0x%\" PRIx64 \" against cached device with sessionID 0x%\" PRIx64, sessionID, new_device->session);\n      if (new_device->session == sessionID) {\n        usbi_dbg(\"using cached device for device\");\n        *cached_out = new_device;\n        break;\n      }\n    }\n\n    if (*cached_out)\n      break;\n\n    usbi_dbg(\"caching new device with sessionID 0x%\" PRIx64, sessionID);\n\n    device = darwin_device_from_service (service);\n    if (!device) {\n      ret = LIBUSB_ERROR_NO_DEVICE;\n      break;\n    }\n\n    new_device = calloc (1, sizeof (*new_device));\n    if (!new_device) {\n      ret = LIBUSB_ERROR_NO_MEM;\n      break;\n    }\n\n    /* add this device to the cached device list */\n    list_add(&new_device->list, &darwin_cached_devices);\n\n    (*device)->GetDeviceAddress (device, (USBDeviceAddress *)&new_device->address);\n\n    /* keep a reference to this device */\n    darwin_ref_cached_device(new_device);\n\n    new_device->device = device;\n    new_device->session = sessionID;\n    (*device)->GetLocationID (device, &new_device->location);\n    new_device->port = port;\n    new_device->parent_session = parent_sessionID;\n\n    /* cache the device descriptor */\n    ret = darwin_cache_device_descriptor(ctx, new_device);\n    if (ret)\n      break;\n\n    if (new_device->can_enumerate) {\n      snprintf(new_device->sys_path, 20, \"%03i-%04x-%04x-%02x-%02x\", new_device->address,\n               new_device->dev_descriptor.idVendor, new_device->dev_descriptor.idProduct,\n               new_device->dev_descriptor.bDeviceClass, new_device->dev_descriptor.bDeviceSubClass);\n    }\n  } while (0);\n\n  usbi_mutex_unlock(&darwin_cached_devices_lock);\n\n  /* keep track of devices regardless of if we successfully enumerate them to\n     prevent them from being enumerated multiple times */\n\n  *cached_out = new_device;\n\n  return ret;\n}\n\nstatic int process_new_device (struct libusb_context *ctx, io_service_t service) {\n  struct darwin_device_priv *priv;\n  struct libusb_device *dev = NULL;\n  struct darwin_cached_device *cached_device;\n  UInt8 devSpeed;\n  int ret = 0;\n\n  do {\n    ret = darwin_get_cached_device (ctx, service, &cached_device);\n\n    if (ret < 0 || !cached_device->can_enumerate) {\n      return ret;\n    }\n\n    /* check current active configuration (and cache the first configuration value--\n       which may be used by claim_interface) */\n    ret = darwin_check_configuration (ctx, cached_device);\n    if (ret)\n      break;\n\n    usbi_dbg (\"allocating new device in context %p for with session 0x%\" PRIx64,\n              ctx, cached_device->session);\n\n    dev = usbi_alloc_device(ctx, (unsigned long) cached_device->session);\n    if (!dev) {\n      return LIBUSB_ERROR_NO_MEM;\n    }\n\n    priv = (struct darwin_device_priv *)dev->os_priv;\n\n    priv->dev = cached_device;\n    darwin_ref_cached_device (priv->dev);\n\n    if (cached_device->parent_session > 0) {\n      dev->parent_dev = usbi_get_device_by_session_id (ctx, (unsigned long) cached_device->parent_session);\n    } else {\n      dev->parent_dev = NULL;\n    }\n    dev->port_number    = cached_device->port;\n    dev->bus_number     = cached_device->location >> 24;\n    dev->device_address = cached_device->address;\n\n    (*(priv->dev->device))->GetDeviceSpeed (priv->dev->device, &devSpeed);\n\n    switch (devSpeed) {\n    case kUSBDeviceSpeedLow: dev->speed = LIBUSB_SPEED_LOW; break;\n    case kUSBDeviceSpeedFull: dev->speed = LIBUSB_SPEED_FULL; break;\n    case kUSBDeviceSpeedHigh: dev->speed = LIBUSB_SPEED_HIGH; break;\n#if DeviceVersion >= 500\n    case kUSBDeviceSpeedSuper: dev->speed = LIBUSB_SPEED_SUPER; break;\n#endif\n    default:\n      usbi_warn (ctx, \"Got unknown device speed %d\", devSpeed);\n    }\n\n    ret = usbi_sanitize_device (dev);\n    if (ret < 0)\n      break;\n\n    usbi_dbg (\"found device with address %d port = %d parent = %p at %p\", dev->device_address,\n              dev->port_number, (void *) dev->parent_dev, priv->dev->sys_path);\n  } while (0);\n\n  if (0 == ret) {\n    usbi_connect_device (dev);\n  } else {\n    libusb_unref_device (dev);\n  }\n\n  return ret;\n}\n\nstatic int darwin_scan_devices(struct libusb_context *ctx) {\n  io_iterator_t deviceIterator;\n  io_service_t service;\n  kern_return_t kresult;\n\n  kresult = usb_setup_device_iterator (&deviceIterator, 0);\n  if (kresult != kIOReturnSuccess)\n    return darwin_to_libusb (kresult);\n\n  while ((service = IOIteratorNext (deviceIterator))) {\n    (void) process_new_device (ctx, service);\n\n    IOObjectRelease(service);\n  }\n\n  IOObjectRelease(deviceIterator);\n\n  return 0;\n}\n\nstatic int darwin_open (struct libusb_device_handle *dev_handle) {\n  struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);\n  IOReturn kresult;\n\n  if (0 == dpriv->open_count) {\n    /* try to open the device */\n    kresult = (*(dpriv->device))->USBDeviceOpenSeize (dpriv->device);\n    if (kresult != kIOReturnSuccess) {\n      usbi_warn (HANDLE_CTX (dev_handle), \"USBDeviceOpen: %s\", darwin_error_str(kresult));\n\n      if (kIOReturnExclusiveAccess != kresult) {\n        return darwin_to_libusb (kresult);\n      }\n\n      /* it is possible to perform some actions on a device that is not open so do not return an error */\n      priv->is_open = 0;\n    } else {\n      priv->is_open = 1;\n    }\n\n    /* create async event source */\n    kresult = (*(dpriv->device))->CreateDeviceAsyncEventSource (dpriv->device, &priv->cfSource);\n    if (kresult != kIOReturnSuccess) {\n      usbi_err (HANDLE_CTX (dev_handle), \"CreateDeviceAsyncEventSource: %s\", darwin_error_str(kresult));\n\n      if (priv->is_open) {\n        (*(dpriv->device))->USBDeviceClose (dpriv->device);\n      }\n\n      priv->is_open = 0;\n\n      return darwin_to_libusb (kresult);\n    }\n\n    CFRetain (libusb_darwin_acfl);\n\n    /* add the cfSource to the aync run loop */\n    CFRunLoopAddSource(libusb_darwin_acfl, priv->cfSource, kCFRunLoopCommonModes);\n  }\n\n  /* device opened successfully */\n  dpriv->open_count++;\n\n  usbi_dbg (\"device open for access\");\n\n  return 0;\n}\n\nstatic void darwin_close (struct libusb_device_handle *dev_handle) {\n  struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);\n  IOReturn kresult;\n  int i;\n\n  if (dpriv->open_count == 0) {\n    /* something is probably very wrong if this is the case */\n    usbi_err (HANDLE_CTX (dev_handle), \"Close called on a device that was not open!\");\n    return;\n  }\n\n  dpriv->open_count--;\n\n  /* make sure all interfaces are released */\n  for (i = 0 ; i < USB_MAXINTERFACES ; i++)\n    if (dev_handle->claimed_interfaces & (1 << i))\n      libusb_release_interface (dev_handle, i);\n\n  if (0 == dpriv->open_count) {\n    /* delete the device's async event source */\n    if (priv->cfSource) {\n      CFRunLoopRemoveSource (libusb_darwin_acfl, priv->cfSource, kCFRunLoopDefaultMode);\n      CFRelease (priv->cfSource);\n      priv->cfSource = NULL;\n      CFRelease (libusb_darwin_acfl);\n    }\n\n    if (priv->is_open) {\n      /* close the device */\n      kresult = (*(dpriv->device))->USBDeviceClose(dpriv->device);\n      if (kresult) {\n        /* Log the fact that we had a problem closing the file, however failing a\n         * close isn't really an error, so return success anyway */\n        usbi_warn (HANDLE_CTX (dev_handle), \"USBDeviceClose: %s\", darwin_error_str(kresult));\n      }\n    }\n  }\n}\n\nstatic int darwin_get_configuration(struct libusb_device_handle *dev_handle, int *config) {\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);\n\n  *config = (int) dpriv->active_config;\n\n  return 0;\n}\n\nstatic int darwin_set_configuration(struct libusb_device_handle *dev_handle, int config) {\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);\n  IOReturn kresult;\n  int i;\n\n  /* Setting configuration will invalidate the interface, so we need\n     to reclaim it. First, dispose of existing interfaces, if any. */\n  for (i = 0 ; i < USB_MAXINTERFACES ; i++)\n    if (dev_handle->claimed_interfaces & (1 << i))\n      darwin_release_interface (dev_handle, i);\n\n  kresult = (*(dpriv->device))->SetConfiguration (dpriv->device, config);\n  if (kresult != kIOReturnSuccess)\n    return darwin_to_libusb (kresult);\n\n  /* Reclaim any interfaces. */\n  for (i = 0 ; i < USB_MAXINTERFACES ; i++)\n    if (dev_handle->claimed_interfaces & (1 << i))\n      darwin_claim_interface (dev_handle, i);\n\n  dpriv->active_config = config;\n\n  return 0;\n}\n\nstatic int darwin_get_interface (usb_device_t **darwin_device, uint8_t ifc, io_service_t *usbInterfacep) {\n  IOUSBFindInterfaceRequest request;\n  kern_return_t             kresult;\n  io_iterator_t             interface_iterator;\n  UInt8                     bInterfaceNumber;\n  int                       ret;\n\n  *usbInterfacep = IO_OBJECT_NULL;\n\n  /* Setup the Interface Request */\n  request.bInterfaceClass    = kIOUSBFindInterfaceDontCare;\n  request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare;\n  request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare;\n  request.bAlternateSetting  = kIOUSBFindInterfaceDontCare;\n\n  kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator);\n  if (kresult)\n    return kresult;\n\n  while ((*usbInterfacep = IOIteratorNext(interface_iterator))) {\n    /* find the interface number */\n    ret = get_ioregistry_value_number (*usbInterfacep, CFSTR(\"bInterfaceNumber\"), kCFNumberSInt8Type,\n                                       &bInterfaceNumber);\n\n    if (ret && bInterfaceNumber == ifc) {\n      break;\n    }\n\n    (void) IOObjectRelease (*usbInterfacep);\n  }\n\n  /* done with the interface iterator */\n  IOObjectRelease(interface_iterator);\n\n  return 0;\n}\n\nstatic int get_endpoints (struct libusb_device_handle *dev_handle, int iface) {\n  struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;\n\n  /* current interface */\n  struct darwin_interface *cInterface = &priv->interfaces[iface];\n\n  kern_return_t kresult;\n\n  u_int8_t numep, direction, number;\n  u_int8_t dont_care1, dont_care3;\n  u_int16_t dont_care2;\n  int rc;\n\n  usbi_dbg (\"building table of endpoints.\");\n\n  /* retrieve the total number of endpoints on this interface */\n  kresult = (*(cInterface->interface))->GetNumEndpoints(cInterface->interface, &numep);\n  if (kresult) {\n    usbi_err (HANDLE_CTX (dev_handle), \"can't get number of endpoints for interface: %s\", darwin_error_str(kresult));\n    return darwin_to_libusb (kresult);\n  }\n\n  /* iterate through pipe references */\n  for (int i = 1 ; i <= numep ; i++) {\n    kresult = (*(cInterface->interface))->GetPipeProperties(cInterface->interface, i, &direction, &number, &dont_care1,\n                                                            &dont_care2, &dont_care3);\n\n    if (kresult != kIOReturnSuccess) {\n      /* probably a buggy device. try to get the endpoint address from the descriptors */\n      struct libusb_config_descriptor *config;\n      const struct libusb_endpoint_descriptor *endpoint_desc;\n      UInt8 alt_setting;\n\n      kresult = (*(cInterface->interface))->GetAlternateSetting (cInterface->interface, &alt_setting);\n      if (kresult) {\n        usbi_err (HANDLE_CTX (dev_handle), \"can't get alternate setting for interface\");\n        return darwin_to_libusb (kresult);\n      }\n\n      rc = libusb_get_active_config_descriptor (dev_handle->dev, &config);\n      if (LIBUSB_SUCCESS != rc) {\n        return rc;\n      }\n\n      endpoint_desc = config->interface[iface].altsetting[alt_setting].endpoint + i - 1;\n\n      cInterface->endpoint_addrs[i - 1] = endpoint_desc->bEndpointAddress;\n    } else {\n      cInterface->endpoint_addrs[i - 1] = (((kUSBIn == direction) << kUSBRqDirnShift) | (number & LIBUSB_ENDPOINT_ADDRESS_MASK));\n    }\n\n    usbi_dbg (\"interface: %i pipe %i: dir: %i number: %i\", iface, i, cInterface->endpoint_addrs[i - 1] >> kUSBRqDirnShift,\n              cInterface->endpoint_addrs[i - 1] & LIBUSB_ENDPOINT_ADDRESS_MASK);\n  }\n\n  cInterface->num_endpoints = numep;\n\n  return 0;\n}\n\nstatic int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface) {\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);\n  struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;\n  io_service_t          usbInterface = IO_OBJECT_NULL;\n  IOReturn kresult;\n  IOCFPlugInInterface **plugInInterface = NULL;\n  SInt32                score;\n\n  /* current interface */\n  struct darwin_interface *cInterface = &priv->interfaces[iface];\n\n  kresult = darwin_get_interface (dpriv->device, iface, &usbInterface);\n  if (kresult != kIOReturnSuccess)\n    return darwin_to_libusb (kresult);\n\n  /* make sure we have an interface */\n  if (!usbInterface && dpriv->first_config != 0) {\n    usbi_info (HANDLE_CTX (dev_handle), \"no interface found; setting configuration: %d\", dpriv->first_config);\n\n    /* set the configuration */\n    kresult = darwin_set_configuration (dev_handle, dpriv->first_config);\n    if (kresult != LIBUSB_SUCCESS) {\n      usbi_err (HANDLE_CTX (dev_handle), \"could not set configuration\");\n      return kresult;\n    }\n\n    kresult = darwin_get_interface (dpriv->device, iface, &usbInterface);\n    if (kresult) {\n      usbi_err (HANDLE_CTX (dev_handle), \"darwin_get_interface: %s\", darwin_error_str(kresult));\n      return darwin_to_libusb (kresult);\n    }\n  }\n\n  if (!usbInterface) {\n    usbi_err (HANDLE_CTX (dev_handle), \"interface not found\");\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  /* get an interface to the device's interface */\n  kresult = IOCreatePlugInInterfaceForService (usbInterface, kIOUSBInterfaceUserClientTypeID,\n                                               kIOCFPlugInInterfaceID, &plugInInterface, &score);\n\n  /* ignore release error */\n  (void)IOObjectRelease (usbInterface);\n\n  if (kresult) {\n    usbi_err (HANDLE_CTX (dev_handle), \"IOCreatePlugInInterfaceForService: %s\", darwin_error_str(kresult));\n    return darwin_to_libusb (kresult);\n  }\n\n  if (!plugInInterface) {\n    usbi_err (HANDLE_CTX (dev_handle), \"plugin interface not found\");\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  /* Do the actual claim */\n  kresult = (*plugInInterface)->QueryInterface(plugInInterface,\n                                               CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID),\n                                               (LPVOID)&cInterface->interface);\n  /* We no longer need the intermediate plug-in */\n  /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */\n  (*plugInInterface)->Release (plugInInterface);\n  if (kresult || !cInterface->interface) {\n    usbi_err (HANDLE_CTX (dev_handle), \"QueryInterface: %s\", darwin_error_str(kresult));\n    return darwin_to_libusb (kresult);\n  }\n\n  /* claim the interface */\n  kresult = (*(cInterface->interface))->USBInterfaceOpen(cInterface->interface);\n  if (kresult) {\n    usbi_err (HANDLE_CTX (dev_handle), \"USBInterfaceOpen: %s\", darwin_error_str(kresult));\n    return darwin_to_libusb (kresult);\n  }\n\n  /* update list of endpoints */\n  kresult = get_endpoints (dev_handle, iface);\n  if (kresult) {\n    /* this should not happen */\n    darwin_release_interface (dev_handle, iface);\n    usbi_err (HANDLE_CTX (dev_handle), \"could not build endpoint table\");\n    return kresult;\n  }\n\n  cInterface->cfSource = NULL;\n\n  /* create async event source */\n  kresult = (*(cInterface->interface))->CreateInterfaceAsyncEventSource (cInterface->interface, &cInterface->cfSource);\n  if (kresult != kIOReturnSuccess) {\n    usbi_err (HANDLE_CTX (dev_handle), \"could not create async event source\");\n\n    /* can't continue without an async event source */\n    (void)darwin_release_interface (dev_handle, iface);\n\n    return darwin_to_libusb (kresult);\n  }\n\n  /* add the cfSource to the async thread's run loop */\n  CFRunLoopAddSource(libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode);\n\n  usbi_dbg (\"interface opened\");\n\n  return 0;\n}\n\nstatic int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface) {\n  struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;\n  IOReturn kresult;\n\n  /* current interface */\n  struct darwin_interface *cInterface = &priv->interfaces[iface];\n\n  /* Check to see if an interface is open */\n  if (!cInterface->interface)\n    return LIBUSB_SUCCESS;\n\n  /* clean up endpoint data */\n  cInterface->num_endpoints = 0;\n\n  /* delete the interface's async event source */\n  if (cInterface->cfSource) {\n    CFRunLoopRemoveSource (libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode);\n    CFRelease (cInterface->cfSource);\n  }\n\n  kresult = (*(cInterface->interface))->USBInterfaceClose(cInterface->interface);\n  if (kresult)\n    usbi_warn (HANDLE_CTX (dev_handle), \"USBInterfaceClose: %s\", darwin_error_str(kresult));\n\n  kresult = (*(cInterface->interface))->Release(cInterface->interface);\n  if (kresult != kIOReturnSuccess)\n    usbi_warn (HANDLE_CTX (dev_handle), \"Release: %s\", darwin_error_str(kresult));\n\n  cInterface->interface = (usb_interface_t **) IO_OBJECT_NULL;\n\n  return darwin_to_libusb (kresult);\n}\n\nstatic int darwin_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) {\n  struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv;\n  IOReturn kresult;\n\n  /* current interface */\n  struct darwin_interface *cInterface = &priv->interfaces[iface];\n\n  if (!cInterface->interface)\n    return LIBUSB_ERROR_NO_DEVICE;\n\n  kresult = (*(cInterface->interface))->SetAlternateInterface (cInterface->interface, altsetting);\n  if (kresult != kIOReturnSuccess)\n    darwin_reset_device (dev_handle);\n\n  /* update list of endpoints */\n  kresult = get_endpoints (dev_handle, iface);\n  if (kresult) {\n    /* this should not happen */\n    darwin_release_interface (dev_handle, iface);\n    usbi_err (HANDLE_CTX (dev_handle), \"could not build endpoint table\");\n    return kresult;\n  }\n\n  return darwin_to_libusb (kresult);\n}\n\nstatic int darwin_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) {\n  /* current interface */\n  struct darwin_interface *cInterface;\n  IOReturn kresult;\n  uint8_t pipeRef;\n\n  /* determine the interface/endpoint to use */\n  if (ep_to_pipeRef (dev_handle, endpoint, &pipeRef, NULL, &cInterface) != 0) {\n    usbi_err (HANDLE_CTX (dev_handle), \"endpoint not found on any open interface\");\n\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  /* newer versions of darwin support clearing additional bits on the device's endpoint */\n  kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef);\n  if (kresult)\n    usbi_warn (HANDLE_CTX (dev_handle), \"ClearPipeStall: %s\", darwin_error_str (kresult));\n\n  return darwin_to_libusb (kresult);\n}\n\nstatic int darwin_reset_device(struct libusb_device_handle *dev_handle) {\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);\n  IOUSBDeviceDescriptor descriptor;\n  IOUSBConfigurationDescriptorPtr cached_configuration;\n  IOUSBConfigurationDescriptor configuration;\n  bool reenumerate = false;\n  IOReturn kresult;\n  int i;\n\n  kresult = (*(dpriv->device))->ResetDevice (dpriv->device);\n  if (kresult) {\n    usbi_err (HANDLE_CTX (dev_handle), \"ResetDevice: %s\", darwin_error_str (kresult));\n    return darwin_to_libusb (kresult);\n  }\n\n  do {\n    usbi_dbg (\"darwin/reset_device: checking if device descriptor changed\");\n\n    /* ignore return code. if we can't get a descriptor it might be worthwhile re-enumerating anway */\n    (void) darwin_request_descriptor (dpriv->device, kUSBDeviceDesc, 0, &descriptor, sizeof (descriptor));\n\n    /* check if the device descriptor has changed */\n    if (0 != memcmp (&dpriv->dev_descriptor, &descriptor, sizeof (descriptor))) {\n      reenumerate = true;\n      break;\n    }\n\n    /* check if any configuration descriptor has changed */\n    for (i = 0 ; i < descriptor.bNumConfigurations ; ++i) {\n      usbi_dbg (\"darwin/reset_device: checking if configuration descriptor %d changed\", i);\n\n      (void) darwin_request_descriptor (dpriv->device, kUSBConfDesc, i, &configuration, sizeof (configuration));\n      (*(dpriv->device))->GetConfigurationDescriptorPtr (dpriv->device, i, &cached_configuration);\n\n      if (!cached_configuration || 0 != memcmp (cached_configuration, &configuration, sizeof (configuration))) {\n        reenumerate = true;\n        break;\n      }\n    }\n  } while (0);\n\n  if (reenumerate) {\n    usbi_dbg (\"darwin/reset_device: device requires reenumeration\");\n    (void) (*(dpriv->device))->USBDeviceReEnumerate (dpriv->device, 0);\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  usbi_dbg (\"darwin/reset_device: device reset complete\");\n\n  return LIBUSB_SUCCESS;\n}\n\nstatic int darwin_kernel_driver_active(struct libusb_device_handle *dev_handle, int interface) {\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev);\n  io_service_t usbInterface;\n  CFTypeRef driver;\n  IOReturn kresult;\n\n  kresult = darwin_get_interface (dpriv->device, interface, &usbInterface);\n  if (kresult) {\n    usbi_err (HANDLE_CTX (dev_handle), \"darwin_get_interface: %s\", darwin_error_str(kresult));\n\n    return darwin_to_libusb (kresult);\n  }\n\n  driver = IORegistryEntryCreateCFProperty (usbInterface, kIOBundleIdentifierKey, kCFAllocatorDefault, 0);\n  IOObjectRelease (usbInterface);\n\n  if (driver) {\n    CFRelease (driver);\n\n    return 1;\n  }\n\n  /* no driver */\n  return 0;\n}\n\n/* attaching/detaching kernel drivers is not currently supported (maybe in the future?) */\nstatic int darwin_attach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) {\n  UNUSED(dev_handle);\n  UNUSED(interface);\n  return LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic int darwin_detach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) {\n  UNUSED(dev_handle);\n  UNUSED(interface);\n  return LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic void darwin_destroy_device(struct libusb_device *dev) {\n  struct darwin_device_priv *dpriv = (struct darwin_device_priv *) dev->os_priv;\n\n  if (dpriv->dev) {\n    /* need to hold the lock in case this is the last reference to the device */\n    usbi_mutex_lock(&darwin_cached_devices_lock);\n    darwin_deref_cached_device (dpriv->dev);\n    dpriv->dev = NULL;\n    usbi_mutex_unlock(&darwin_cached_devices_lock);\n  }\n}\n\nstatic int submit_bulk_transfer(struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n  IOReturn               ret;\n  uint8_t                transferType;\n  /* None of the values below are used in libusbx for bulk transfers */\n  uint8_t                direction, number, interval, pipeRef;\n  uint16_t               maxPacketSize;\n\n  struct darwin_interface *cInterface;\n\n  if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {\n    usbi_err (TRANSFER_CTX (transfer), \"endpoint not found on any open interface\");\n\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  ret = (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,\n                                                       &transferType, &maxPacketSize, &interval);\n\n  if (ret) {\n    usbi_err (TRANSFER_CTX (transfer), \"bulk transfer failed (dir = %s): %s (code = 0x%08x)\", IS_XFERIN(transfer) ? \"In\" : \"Out\",\n              darwin_error_str(ret), ret);\n    return darwin_to_libusb (ret);\n  }\n\n  if (0 != (transfer->length % maxPacketSize)) {\n    /* do not need a zero packet */\n    transfer->flags &= ~LIBUSB_TRANSFER_ADD_ZERO_PACKET;\n  }\n\n  /* submit the request */\n  /* timeouts are unavailable on interrupt endpoints */\n  if (transferType == kUSBInterrupt) {\n    if (IS_XFERIN(transfer))\n      ret = (*(cInterface->interface))->ReadPipeAsync(cInterface->interface, pipeRef, transfer->buffer,\n                                                      transfer->length, darwin_async_io_callback, itransfer);\n    else\n      ret = (*(cInterface->interface))->WritePipeAsync(cInterface->interface, pipeRef, transfer->buffer,\n                                                       transfer->length, darwin_async_io_callback, itransfer);\n  } else {\n    itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;\n\n    if (IS_XFERIN(transfer))\n      ret = (*(cInterface->interface))->ReadPipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer,\n                                                        transfer->length, transfer->timeout, transfer->timeout,\n                                                        darwin_async_io_callback, (void *)itransfer);\n    else\n      ret = (*(cInterface->interface))->WritePipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer,\n                                                         transfer->length, transfer->timeout, transfer->timeout,\n                                                         darwin_async_io_callback, (void *)itransfer);\n  }\n\n  if (ret)\n    usbi_err (TRANSFER_CTX (transfer), \"bulk transfer failed (dir = %s): %s (code = 0x%08x)\", IS_XFERIN(transfer) ? \"In\" : \"Out\",\n               darwin_error_str(ret), ret);\n\n  return darwin_to_libusb (ret);\n}\n\n#if InterfaceVersion >= 550\nstatic int submit_stream_transfer(struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct darwin_interface *cInterface;\n  uint8_t pipeRef;\n  IOReturn ret;\n\n  if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {\n    usbi_err (TRANSFER_CTX (transfer), \"endpoint not found on any open interface\");\n\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;\n\n  if (IS_XFERIN(transfer))\n    ret = (*(cInterface->interface))->ReadStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id,\n                                                             transfer->buffer, transfer->length, transfer->timeout,\n                                                             transfer->timeout, darwin_async_io_callback, (void *)itransfer);\n  else\n    ret = (*(cInterface->interface))->WriteStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id,\n                                                              transfer->buffer, transfer->length, transfer->timeout,\n                                                              transfer->timeout, darwin_async_io_callback, (void *)itransfer);\n\n  if (ret)\n    usbi_err (TRANSFER_CTX (transfer), \"bulk stream transfer failed (dir = %s): %s (code = 0x%08x)\", IS_XFERIN(transfer) ? \"In\" : \"Out\",\n               darwin_error_str(ret), ret);\n\n  return darwin_to_libusb (ret);\n}\n#endif\n\nstatic int submit_iso_transfer(struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\n  IOReturn kresult;\n  uint8_t direction, number, interval, pipeRef, transferType;\n  uint16_t maxPacketSize;\n  UInt64 frame;\n  AbsoluteTime atTime;\n  int i;\n\n  struct darwin_interface *cInterface;\n\n  /* construct an array of IOUSBIsocFrames, reuse the old one if possible */\n  if (tpriv->isoc_framelist && tpriv->num_iso_packets != transfer->num_iso_packets) {\n    free(tpriv->isoc_framelist);\n    tpriv->isoc_framelist = NULL;\n  }\n\n  if (!tpriv->isoc_framelist) {\n    tpriv->num_iso_packets = transfer->num_iso_packets;\n    tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame));\n    if (!tpriv->isoc_framelist)\n      return LIBUSB_ERROR_NO_MEM;\n  }\n\n  /* copy the frame list from the libusb descriptor (the structures differ only is member order) */\n  for (i = 0 ; i < transfer->num_iso_packets ; i++)\n    tpriv->isoc_framelist[i].frReqCount = transfer->iso_packet_desc[i].length;\n\n  /* determine the interface/endpoint to use */\n  if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {\n    usbi_err (TRANSFER_CTX (transfer), \"endpoint not found on any open interface\");\n\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  /* determine the properties of this endpoint and the speed of the device */\n  (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,\n                                                 &transferType, &maxPacketSize, &interval);\n\n  /* Last but not least we need the bus frame number */\n  kresult = (*(cInterface->interface))->GetBusFrameNumber(cInterface->interface, &frame, &atTime);\n  if (kresult) {\n    usbi_err (TRANSFER_CTX (transfer), \"failed to get bus frame number: %d\", kresult);\n    free(tpriv->isoc_framelist);\n    tpriv->isoc_framelist = NULL;\n\n    return darwin_to_libusb (kresult);\n  }\n\n  (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number,\n                                                 &transferType, &maxPacketSize, &interval);\n\n  /* schedule for a frame a little in the future */\n  frame += 4;\n\n  if (cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint])\n    frame = cInterface->frames[transfer->endpoint];\n\n  /* submit the request */\n  if (IS_XFERIN(transfer))\n    kresult = (*(cInterface->interface))->ReadIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame,\n                                                             transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback,\n                                                             itransfer);\n  else\n    kresult = (*(cInterface->interface))->WriteIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame,\n                                                              transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback,\n                                                              itransfer);\n\n  if (LIBUSB_SPEED_FULL == transfer->dev_handle->dev->speed)\n    /* Full speed */\n    cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1));\n  else\n    /* High/super speed */\n    cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)) / 8;\n\n  if (kresult != kIOReturnSuccess) {\n    usbi_err (TRANSFER_CTX (transfer), \"isochronous transfer failed (dir: %s): %s\", IS_XFERIN(transfer) ? \"In\" : \"Out\",\n               darwin_error_str(kresult));\n    free (tpriv->isoc_framelist);\n    tpriv->isoc_framelist = NULL;\n  }\n\n  return darwin_to_libusb (kresult);\n}\n\nstatic int submit_control_transfer(struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct libusb_control_setup *setup = (struct libusb_control_setup *) transfer->buffer;\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev);\n  struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\n  IOReturn               kresult;\n\n  memset(&tpriv->req, 0, sizeof(tpriv->req));\n\n  /* IOUSBDeviceInterface expects the request in cpu endianness */\n  tpriv->req.bmRequestType     = setup->bmRequestType;\n  tpriv->req.bRequest          = setup->bRequest;\n  /* these values should be in bus order from libusb_fill_control_setup */\n  tpriv->req.wValue            = OSSwapLittleToHostInt16 (setup->wValue);\n  tpriv->req.wIndex            = OSSwapLittleToHostInt16 (setup->wIndex);\n  tpriv->req.wLength           = OSSwapLittleToHostInt16 (setup->wLength);\n  /* data is stored after the libusb control block */\n  tpriv->req.pData             = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;\n  tpriv->req.completionTimeout = transfer->timeout;\n  tpriv->req.noDataTimeout     = transfer->timeout;\n\n  itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT;\n\n  /* all transfers in libusb-1.0 are async */\n\n  if (transfer->endpoint) {\n    struct darwin_interface *cInterface;\n    uint8_t                 pipeRef;\n\n    if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) {\n      usbi_err (TRANSFER_CTX (transfer), \"endpoint not found on any open interface\");\n\n      return LIBUSB_ERROR_NOT_FOUND;\n    }\n\n    kresult = (*(cInterface->interface))->ControlRequestAsyncTO (cInterface->interface, pipeRef, &(tpriv->req), darwin_async_io_callback, itransfer);\n  } else\n    /* control request on endpoint 0 */\n    kresult = (*(dpriv->device))->DeviceRequestAsyncTO(dpriv->device, &(tpriv->req), darwin_async_io_callback, itransfer);\n\n  if (kresult != kIOReturnSuccess)\n    usbi_err (TRANSFER_CTX (transfer), \"control request failed: %s\", darwin_error_str(kresult));\n\n  return darwin_to_libusb (kresult);\n}\n\nstatic int darwin_submit_transfer(struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n  switch (transfer->type) {\n  case LIBUSB_TRANSFER_TYPE_CONTROL:\n    return submit_control_transfer(itransfer);\n  case LIBUSB_TRANSFER_TYPE_BULK:\n  case LIBUSB_TRANSFER_TYPE_INTERRUPT:\n    return submit_bulk_transfer(itransfer);\n  case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n    return submit_iso_transfer(itransfer);\n  case LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n#if InterfaceVersion >= 550\n    return submit_stream_transfer(itransfer);\n#else\n    usbi_err (TRANSFER_CTX(transfer), \"IOUSBFamily version does not support bulk stream transfers\");\n    return LIBUSB_ERROR_NOT_SUPPORTED;\n#endif\n  default:\n    usbi_err (TRANSFER_CTX(transfer), \"unknown endpoint type %d\", transfer->type);\n    return LIBUSB_ERROR_INVALID_PARAM;\n  }\n}\n\nstatic int cancel_control_transfer(struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev);\n  IOReturn kresult;\n\n  usbi_warn (ITRANSFER_CTX (itransfer), \"aborting all transactions control pipe\");\n\n  if (!dpriv->device)\n    return LIBUSB_ERROR_NO_DEVICE;\n\n  kresult = (*(dpriv->device))->USBDeviceAbortPipeZero (dpriv->device);\n\n  return darwin_to_libusb (kresult);\n}\n\nstatic int darwin_abort_transfers (struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev);\n  struct darwin_interface *cInterface;\n  uint8_t pipeRef, iface;\n  IOReturn kresult;\n\n  if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface, &cInterface) != 0) {\n    usbi_err (TRANSFER_CTX (transfer), \"endpoint not found on any open interface\");\n\n    return LIBUSB_ERROR_NOT_FOUND;\n  }\n\n  if (!dpriv->device)\n    return LIBUSB_ERROR_NO_DEVICE;\n\n  usbi_warn (ITRANSFER_CTX (itransfer), \"aborting all transactions on interface %d pipe %d\", iface, pipeRef);\n\n  /* abort transactions */\n#if InterfaceVersion >= 550\n  if (LIBUSB_TRANSFER_TYPE_BULK_STREAM == transfer->type)\n    (*(cInterface->interface))->AbortStreamsPipe (cInterface->interface, pipeRef, itransfer->stream_id);\n  else\n#endif\n    (*(cInterface->interface))->AbortPipe (cInterface->interface, pipeRef);\n\n  usbi_dbg (\"calling clear pipe stall to clear the data toggle bit\");\n\n  /* newer versions of darwin support clearing additional bits on the device's endpoint */\n  kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef);\n\n  return darwin_to_libusb (kresult);\n}\n\nstatic int darwin_cancel_transfer(struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n  switch (transfer->type) {\n  case LIBUSB_TRANSFER_TYPE_CONTROL:\n    return cancel_control_transfer(itransfer);\n  case LIBUSB_TRANSFER_TYPE_BULK:\n  case LIBUSB_TRANSFER_TYPE_INTERRUPT:\n  case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n    return darwin_abort_transfers (itransfer);\n  default:\n    usbi_err (TRANSFER_CTX(transfer), \"unknown endpoint type %d\", transfer->type);\n    return LIBUSB_ERROR_INVALID_PARAM;\n  }\n}\n\nstatic void darwin_clear_transfer_priv (struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\n  if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS && tpriv->isoc_framelist) {\n    free (tpriv->isoc_framelist);\n    tpriv->isoc_framelist = NULL;\n  }\n}\n\nstatic void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0) {\n  struct usbi_transfer *itransfer = (struct usbi_transfer *)refcon;\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\n  usbi_dbg (\"an async io operation has completed\");\n\n  /* if requested write a zero packet */\n  if (kIOReturnSuccess == result && IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) {\n    struct darwin_interface *cInterface;\n    uint8_t pipeRef;\n\n    (void) ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface);\n\n    (*(cInterface->interface))->WritePipe (cInterface->interface, pipeRef, transfer->buffer, 0);\n  }\n\n  tpriv->result = result;\n  tpriv->size = (UInt32) (uintptr_t) arg0;\n\n  /* signal the core that this transfer is complete */\n  usbi_signal_transfer_completion(itransfer);\n}\n\nstatic int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) {\n  if (itransfer->timeout_flags & USBI_TRANSFER_TIMED_OUT)\n    result = kIOUSBTransactionTimeout;\n\n  switch (result) {\n  case kIOReturnUnderrun:\n  case kIOReturnSuccess:\n    return LIBUSB_TRANSFER_COMPLETED;\n  case kIOReturnAborted:\n    return LIBUSB_TRANSFER_CANCELLED;\n  case kIOUSBPipeStalled:\n    usbi_dbg (\"transfer error: pipe is stalled\");\n    return LIBUSB_TRANSFER_STALL;\n  case kIOReturnOverrun:\n    usbi_warn (ITRANSFER_CTX (itransfer), \"transfer error: data overrun\");\n    return LIBUSB_TRANSFER_OVERFLOW;\n  case kIOUSBTransactionTimeout:\n    usbi_warn (ITRANSFER_CTX (itransfer), \"transfer error: timed out\");\n    itransfer->timeout_flags |= USBI_TRANSFER_TIMED_OUT;\n    return LIBUSB_TRANSFER_TIMED_OUT;\n  default:\n    usbi_warn (ITRANSFER_CTX (itransfer), \"transfer error: %s (value = 0x%08x)\", darwin_error_str (result), result);\n    return LIBUSB_TRANSFER_ERROR;\n  }\n}\n\nstatic int darwin_handle_transfer_completion (struct usbi_transfer *itransfer) {\n  struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n  struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n  int isIsoc      = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type;\n  int isBulk      = LIBUSB_TRANSFER_TYPE_BULK == transfer->type;\n  int isControl   = LIBUSB_TRANSFER_TYPE_CONTROL == transfer->type;\n  int isInterrupt = LIBUSB_TRANSFER_TYPE_INTERRUPT == transfer->type;\n  int i;\n\n  if (!isIsoc && !isBulk && !isControl && !isInterrupt) {\n    usbi_err (TRANSFER_CTX(transfer), \"unknown endpoint type %d\", transfer->type);\n    return LIBUSB_ERROR_INVALID_PARAM;\n  }\n\n  usbi_dbg (\"handling %s completion with kernel status %d\",\n             isControl ? \"control\" : isBulk ? \"bulk\" : isIsoc ? \"isoc\" : \"interrupt\", tpriv->result);\n\n  if (kIOReturnSuccess == tpriv->result || kIOReturnUnderrun == tpriv->result) {\n    if (isIsoc && tpriv->isoc_framelist) {\n      /* copy isochronous results back */\n\n      for (i = 0; i < transfer->num_iso_packets ; i++) {\n        struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i];\n        lib_desc->status = darwin_to_libusb (tpriv->isoc_framelist[i].frStatus);\n        lib_desc->actual_length = tpriv->isoc_framelist[i].frActCount;\n      }\n    } else if (!isIsoc)\n      itransfer->transferred += tpriv->size;\n  }\n\n  /* it is ok to handle cancelled transfers without calling usbi_handle_transfer_cancellation (we catch timeout transfers) */\n  return usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, tpriv->result));\n}\n\nstatic int darwin_clock_gettime(int clk_id, struct timespec *tp) {\n  mach_timespec_t sys_time;\n  clock_serv_t clock_ref;\n\n  switch (clk_id) {\n  case USBI_CLOCK_REALTIME:\n    /* CLOCK_REALTIME represents time since the epoch */\n    clock_ref = clock_realtime;\n    break;\n  case USBI_CLOCK_MONOTONIC:\n    /* use system boot time as reference for the monotonic clock */\n    clock_ref = clock_monotonic;\n    break;\n  default:\n    return LIBUSB_ERROR_INVALID_PARAM;\n  }\n\n  clock_get_time (clock_ref, &sys_time);\n\n  tp->tv_sec  = sys_time.tv_sec;\n  tp->tv_nsec = sys_time.tv_nsec;\n\n  return 0;\n}\n\n#if InterfaceVersion >= 550\nstatic int darwin_alloc_streams (struct libusb_device_handle *dev_handle, uint32_t num_streams, unsigned char *endpoints,\n                                 int num_endpoints) {\n  struct darwin_interface *cInterface;\n  UInt32 supportsStreams;\n  uint8_t pipeRef;\n  int rc, i;\n\n  /* find the mimimum number of supported streams on the endpoint list */\n  for (i = 0 ; i < num_endpoints ; ++i) {\n    if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface))) {\n      return rc;\n    }\n\n    (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams);\n    if (num_streams > supportsStreams)\n      num_streams = supportsStreams;\n  }\n\n  /* it is an error if any endpoint in endpoints does not support streams */\n  if (0 == num_streams)\n    return LIBUSB_ERROR_INVALID_PARAM;\n\n  /* create the streams */\n  for (i = 0 ; i < num_endpoints ; ++i) {\n    (void) ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface);\n\n    rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, num_streams);\n    if (kIOReturnSuccess != rc)\n      return darwin_to_libusb(rc);\n  }\n\n  return num_streams;\n}\n\nstatic int darwin_free_streams (struct libusb_device_handle *dev_handle, unsigned char *endpoints, int num_endpoints) {\n  struct darwin_interface *cInterface;\n  UInt32 supportsStreams;\n  uint8_t pipeRef;\n  int rc;\n\n  for (int i = 0 ; i < num_endpoints ; ++i) {\n    if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface)))\n      return rc;\n\n    (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams);\n    if (0 == supportsStreams)\n      return LIBUSB_ERROR_INVALID_PARAM;\n\n    rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, 0);\n    if (kIOReturnSuccess != rc)\n      return darwin_to_libusb(rc);\n  }\n\n  return LIBUSB_SUCCESS;\n}\n#endif\n\nconst struct usbi_os_backend darwin_backend = {\n        .name = \"Darwin\",\n        .caps = 0,\n        .init = darwin_init,\n        .exit = darwin_exit,\n        .get_device_list = NULL, /* not needed */\n        .get_device_descriptor = darwin_get_device_descriptor,\n        .get_active_config_descriptor = darwin_get_active_config_descriptor,\n        .get_config_descriptor = darwin_get_config_descriptor,\n        .hotplug_poll = darwin_hotplug_poll,\n\n        .open = darwin_open,\n        .close = darwin_close,\n        .get_configuration = darwin_get_configuration,\n        .set_configuration = darwin_set_configuration,\n        .claim_interface = darwin_claim_interface,\n        .release_interface = darwin_release_interface,\n\n        .set_interface_altsetting = darwin_set_interface_altsetting,\n        .clear_halt = darwin_clear_halt,\n        .reset_device = darwin_reset_device,\n\n#if InterfaceVersion >= 550\n        .alloc_streams = darwin_alloc_streams,\n        .free_streams = darwin_free_streams,\n#endif\n\n        .kernel_driver_active = darwin_kernel_driver_active,\n        .detach_kernel_driver = darwin_detach_kernel_driver,\n        .attach_kernel_driver = darwin_attach_kernel_driver,\n\n        .destroy_device = darwin_destroy_device,\n\n        .submit_transfer = darwin_submit_transfer,\n        .cancel_transfer = darwin_cancel_transfer,\n        .clear_transfer_priv = darwin_clear_transfer_priv,\n\n        .handle_transfer_completion = darwin_handle_transfer_completion,\n\n        .clock_gettime = darwin_clock_gettime,\n\n        .device_priv_size = sizeof(struct darwin_device_priv),\n        .device_handle_priv_size = sizeof(struct darwin_device_handle_priv),\n        .transfer_priv_size = sizeof(struct darwin_transfer_priv),\n};\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.h",
    "content": "/*\n * darwin backend for libusb 1.0\n * Copyright © 2008-2015 Nathan Hjelm <hjelmn@users.sourceforge.net>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#if !defined(LIBUSB_DARWIN_H)\n#define LIBUSB_DARWIN_H\n\n#include \"libusbi.h\"\n\n#include <IOKit/IOTypes.h>\n#include <IOKit/IOCFBundle.h>\n#include <IOKit/usb/IOUSBLib.h>\n#include <IOKit/IOCFPlugIn.h>\n\n/* IOUSBInterfaceInferface */\n#if defined (kIOUSBInterfaceInterfaceID700) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9\n\n#define usb_interface_t IOUSBInterfaceInterface700\n#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID700\n#define InterfaceVersion 700\n\n#elif defined (kIOUSBInterfaceInterfaceID550) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9\n\n#define usb_interface_t IOUSBInterfaceInterface550\n#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550\n#define InterfaceVersion 550\n\n#elif defined (kIOUSBInterfaceInterfaceID500)\n\n#define usb_interface_t IOUSBInterfaceInterface500\n#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID500\n#define InterfaceVersion 500\n\n#elif defined (kIOUSBInterfaceInterfaceID300)\n\n#define usb_interface_t IOUSBInterfaceInterface300\n#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300\n#define InterfaceVersion 300\n\n#elif defined (kIOUSBInterfaceInterfaceID245)\n\n#define usb_interface_t IOUSBInterfaceInterface245\n#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245\n#define InterfaceVersion 245\n\n#elif defined (kIOUSBInterfaceInterfaceID220)\n\n#define usb_interface_t IOUSBInterfaceInterface220\n#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220\n#define InterfaceVersion 220\n\n#else\n\n#error \"IOUSBFamily is too old. Please upgrade your OS\"\n\n#endif\n\n/* IOUSBDeviceInterface */\n#if defined (kIOUSBDeviceInterfaceID500) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9\n\n#define usb_device_t    IOUSBDeviceInterface500\n#define DeviceInterfaceID kIOUSBDeviceInterfaceID500\n#define DeviceVersion 500\n\n#elif defined (kIOUSBDeviceInterfaceID320)\n\n#define usb_device_t    IOUSBDeviceInterface320\n#define DeviceInterfaceID kIOUSBDeviceInterfaceID320\n#define DeviceVersion 320\n\n#elif defined (kIOUSBDeviceInterfaceID300)\n\n#define usb_device_t    IOUSBDeviceInterface300\n#define DeviceInterfaceID kIOUSBDeviceInterfaceID300\n#define DeviceVersion 300\n\n#elif defined (kIOUSBDeviceInterfaceID245)\n\n#define usb_device_t    IOUSBDeviceInterface245\n#define DeviceInterfaceID kIOUSBDeviceInterfaceID245\n#define DeviceVersion 245\n\n#elif defined (kIOUSBDeviceInterfaceID220)\n#define usb_device_t    IOUSBDeviceInterface197\n#define DeviceInterfaceID kIOUSBDeviceInterfaceID197\n#define DeviceVersion 197\n\n#else\n\n#error \"IOUSBFamily is too old. Please upgrade your OS\"\n\n#endif\n\n#if !defined(IO_OBJECT_NULL)\n#define IO_OBJECT_NULL ((io_object_t) 0)\n#endif\n\ntypedef IOCFPlugInInterface *io_cf_plugin_ref_t;\ntypedef IONotificationPortRef io_notification_port_t;\n\n/* private structures */\nstruct darwin_cached_device {\n  struct list_head      list;\n  IOUSBDeviceDescriptor dev_descriptor;\n  UInt32                location;\n  UInt64                parent_session;\n  UInt64                session;\n  UInt16                address;\n  char                  sys_path[21];\n  usb_device_t        **device;\n  int                   open_count;\n  UInt8                 first_config, active_config, port;  \n  int                   can_enumerate;\n  int                   refcount;\n};\n\nstruct darwin_device_priv {\n  struct darwin_cached_device *dev;\n};\n\nstruct darwin_device_handle_priv {\n  int                  is_open;\n  CFRunLoopSourceRef   cfSource;\n\n  struct darwin_interface {\n    usb_interface_t    **interface;\n    uint8_t              num_endpoints;\n    CFRunLoopSourceRef   cfSource;\n    uint64_t             frames[256];\n    uint8_t              endpoint_addrs[USB_MAXENDPOINTS];\n  } interfaces[USB_MAXINTERFACES];\n};\n\nstruct darwin_transfer_priv {\n  /* Isoc */\n  IOUSBIsocFrame *isoc_framelist;\n  int num_iso_packets;\n\n  /* Control */\n  IOUSBDevRequestTO req;\n\n  /* Bulk */\n\n  /* Completion status */\n  IOReturn result;\n  UInt32 size;\n};\n\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_pollfs.cpp",
    "content": "/*\n * Copyright 2007-2008, Haiku Inc. All rights reserved.\n * Distributed under the terms of the MIT License.\n *\n * Authors:\n *\t\tMichael Lotz <mmlr@mlotz.ch>\n */\n\n#include \"haiku_usb.h\"\n#include <cstdio>\n#include <Directory.h>\n#include <Entry.h>\n#include <Looper.h>\n#include <Messenger.h>\n#include <Node.h>\n#include <NodeMonitor.h>\n#include <Path.h>\n#include <cstring>\n\nclass WatchedEntry {\npublic:\n\t\t\tWatchedEntry(BMessenger *, entry_ref *);\n\t\t\t~WatchedEntry();\n\tbool\t\tEntryCreated(entry_ref *ref);\n\tbool\t\tEntryRemoved(ino_t node);\n\tbool\t\tInitCheck();\n\nprivate:\n\tBMessenger*\tfMessenger;\n\tnode_ref\tfNode;\n\tbool\t\tfIsDirectory;\n\tUSBDevice*\tfDevice;\n\tWatchedEntry*\tfEntries;\n\tWatchedEntry*\tfLink;\n\tbool\t\tfInitCheck;\n};\n\n\nclass RosterLooper : public BLooper {\npublic:\n\t\t\tRosterLooper(USBRoster *);\n\tvoid\t\tStop();\n\tvirtual void\tMessageReceived(BMessage *);\n\tbool\t\tInitCheck();\n\nprivate:\n\tUSBRoster*\tfRoster;\n\tWatchedEntry*\tfRoot;\n\tBMessenger*\tfMessenger;\n\tbool\t\tfInitCheck;\n};\n\n\nWatchedEntry::WatchedEntry(BMessenger *messenger, entry_ref *ref)\n\t:\tfMessenger(messenger),\n\t\tfIsDirectory(false),\n\t\tfDevice(NULL),\n\t\tfEntries(NULL),\n\t\tfLink(NULL),\n\t\tfInitCheck(false)\n{\n\tBEntry entry(ref);\n\tentry.GetNodeRef(&fNode);\n\n\tBDirectory directory;\n\tif (entry.IsDirectory() && directory.SetTo(ref) >= B_OK) {\n\t\tfIsDirectory = true;\n\n\t\twhile (directory.GetNextEntry(&entry) >= B_OK) {\n\t\t\tif (entry.GetRef(ref) < B_OK)\n\t\t\t\tcontinue;\n\n\t\t\tWatchedEntry *child = new(std::nothrow) WatchedEntry(fMessenger, ref);\n\t\t\tif (child == NULL)\n\t\t\t\tcontinue;\n\t\t\tif (child->InitCheck() == false) {\n\t\t\t\tdelete child;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tchild->fLink = fEntries;\n\t\t\tfEntries = child;\n\t\t}\n\n\t\twatch_node(&fNode, B_WATCH_DIRECTORY, *fMessenger);\n\t}\n\telse {\n\t\tif (strncmp(ref->name, \"raw\", 3) == 0)\n\t\t\treturn;\n\n\t\tBPath path, parent_path;\n\t\tentry.GetPath(&path);\n\t\tfDevice = new(std::nothrow) USBDevice(path.Path());\n\t\tif (fDevice != NULL && fDevice->InitCheck() == true) {\n\t\t\t// Add this new device to each active context's device list\n\t\t\tstruct libusb_context *ctx;\n\t\t\tunsigned long session_id = (unsigned long)&fDevice;\n\n\t\t\tusbi_mutex_lock(&active_contexts_lock);\n\t\t\tlist_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {\n\t\t\t\tstruct libusb_device *dev = usbi_get_device_by_session_id(ctx, session_id);\n\t\t\t\tif (dev) {\n\t\t\t\t\tusbi_dbg(\"using previously allocated device with location %lu\", session_id);\n\t\t\t\t\tlibusb_unref_device(dev);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tusbi_dbg(\"allocating new device with location %lu\", session_id);\n\t\t\t\tdev = usbi_alloc_device(ctx, session_id);\n\t\t\t\tif (!dev) {\n\t\t\t\t\tusbi_dbg(\"device allocation failed\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t*((USBDevice **)dev->os_priv) = fDevice;\n\n\t\t\t\t// Calculate pseudo-device-address\n\t\t\t\tint addr, tmp;\n\t\t\t\tif (strcmp(path.Leaf(), \"hub\") == 0)\n\t\t\t\t\ttmp = 100;\t//Random Number\n\t\t\t\telse\n\t\t\t\t\tsscanf(path.Leaf(), \"%d\", &tmp);\n\t\t\t\taddr = tmp + 1;\n\t\t\t\tpath.GetParent(&parent_path);\n\t\t\t\twhile (strcmp(parent_path.Leaf(), \"usb\") != 0) {\n\t\t\t\t\tsscanf(parent_path.Leaf(), \"%d\", &tmp);\n\t\t\t\t\taddr += tmp + 1;\n\t\t\t\t\tparent_path.GetParent(&parent_path);\n\t\t\t\t}\n\t\t\t\tsscanf(path.Path(), \"/dev/bus/usb/%d\", &dev->bus_number);\n\t\t\t\tdev->device_address = addr - (dev->bus_number + 1);\n\n\t\t\t\tif (usbi_sanitize_device(dev) < 0) {\n\t\t\t\t\tusbi_dbg(\"device sanitization failed\");\n\t\t\t\t\tlibusb_unref_device(dev);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tusbi_connect_device(dev);\n\t\t\t}\n\t\t\tusbi_mutex_unlock(&active_contexts_lock);\n\t\t}\n\t\telse if (fDevice) {\n\t\t\tdelete fDevice;\n\t\t\tfDevice = NULL;\n\t\t\treturn;\n\t\t}\n\t}\n\tfInitCheck = true;\n}\n\n\nWatchedEntry::~WatchedEntry()\n{\n\tif (fIsDirectory) {\n\t\twatch_node(&fNode, B_STOP_WATCHING, *fMessenger);\n\n\t\tWatchedEntry *child = fEntries;\n\t\twhile (child) {\n\t\t\tWatchedEntry *next = child->fLink;\n\t\t\tdelete child;\n\t\t\tchild = next;\n\t\t}\n\t}\n\n\tif (fDevice) {\n\t\t// Remove this device from each active context's device list\n\t\tstruct libusb_context *ctx;\n\t\tstruct libusb_device *dev;\n\t\tunsigned long session_id = (unsigned long)&fDevice;\n\n\t\tusbi_mutex_lock(&active_contexts_lock);\n\t\tlist_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {\n\t\t\tdev = usbi_get_device_by_session_id(ctx, session_id);\n\t\t\tif (dev != NULL) {\n\t\t\t\tusbi_disconnect_device(dev);\n\t\t\t\tlibusb_unref_device(dev);\n\t\t\t} else {\n\t\t\t\tusbi_dbg(\"device with location %lu not found\", session_id);\n\t\t\t}\n\t\t}\n\t\tusbi_mutex_static_unlock(&active_contexts_lock);\n\t\tdelete fDevice;\n\t}\n}\n\n\nbool\nWatchedEntry::EntryCreated(entry_ref *ref)\n{\n\tif (!fIsDirectory)\n\t\treturn false;\n\n\tif (ref->directory != fNode.node) {\n\t\tWatchedEntry *child = fEntries;\n\t\twhile (child) {\n\t\t\tif (child->EntryCreated(ref))\n\t\t\t\treturn true;\n\t\t\tchild = child->fLink;\n\t\t}\n\t\treturn false;\n\t}\n\n\tWatchedEntry *child = new(std::nothrow) WatchedEntry(fMessenger, ref);\n\tif (child == NULL)\n\t\treturn false;\n\tchild->fLink = fEntries;\n\tfEntries = child;\n\treturn true;\n}\n\n\nbool\nWatchedEntry::EntryRemoved(ino_t node)\n{\n\tif (!fIsDirectory)\n\t\treturn false;\n\n\tWatchedEntry *child = fEntries;\n\tWatchedEntry *lastChild = NULL;\n\twhile (child) {\n\t\tif (child->fNode.node == node) {\n\t\t\tif (lastChild)\n\t\t\t\tlastChild->fLink = child->fLink;\n\t\t\telse\n\t\t\t\tfEntries = child->fLink;\n\t\t\tdelete child;\n\t\t\treturn true;\n\t\t}\n\n\t\tif (child->EntryRemoved(node))\n\t\t\treturn true;\n\n\t\tlastChild = child;\n\t\tchild = child->fLink;\n\t}\n\treturn false;\n}\n\n\nbool\nWatchedEntry::InitCheck()\n{\n\treturn fInitCheck;\n}\n\n\nRosterLooper::RosterLooper(USBRoster *roster)\n\t:\tBLooper(\"LibusbRoster Looper\"),\n\t\tfRoster(roster),\n\t\tfRoot(NULL),\n\t\tfMessenger(NULL),\n\t\tfInitCheck(false)\n{\n\tBEntry entry(\"/dev/bus/usb\");\n\tif (!entry.Exists()) {\n\t\tusbi_err(NULL, \"usb_raw not published\");\n\t\treturn;\n\t}\n\n\tRun();\n\tfMessenger = new(std::nothrow) BMessenger(this);\n\tif (fMessenger == NULL) {\n\t\tusbi_err(NULL, \"error creating BMessenger object\");\n\t\treturn;\n\t}\n\n\tif (Lock()) {\n\t\tentry_ref ref;\n\t\tentry.GetRef(&ref);\n\t\tfRoot = new(std::nothrow) WatchedEntry(fMessenger, &ref);\n\t\tUnlock();\n\t\tif (fRoot == NULL)\n\t\t\treturn;\n\t\tif (fRoot->InitCheck() == false) {\n\t\t\tdelete fRoot;\n\t\t\tfRoot = NULL;\n\t\t\treturn;\n\t\t}\n\t}\n\tfInitCheck = true;\n}\n\n\nvoid\nRosterLooper::Stop()\n{\n\tLock();\n\tdelete fRoot;\n\tdelete fMessenger;\n\tQuit();\n}\n\n\nvoid\nRosterLooper::MessageReceived(BMessage *message)\n{\n\tint32 opcode;\n\tif (message->FindInt32(\"opcode\", &opcode) < B_OK)\n\t\treturn;\n\n\tswitch (opcode) {\n\t\tcase B_ENTRY_CREATED:\n\t\t{\n\t\t\tdev_t device;\n\t\t\tino_t directory;\n\t\t\tconst char *name;\n\t\t\tif (message->FindInt32(\"device\", &device) < B_OK ||\n\t\t\t\tmessage->FindInt64(\"directory\", &directory) < B_OK ||\n\t\t\t\tmessage->FindString(\"name\", &name) < B_OK)\n\t\t\t\tbreak;\n\n\t\t\tentry_ref ref(device, directory, name);\n\t\t\tfRoot->EntryCreated(&ref);\n\t\t\tbreak;\n\t\t}\n\t\tcase B_ENTRY_REMOVED:\n\t\t{\n\t\t\tino_t node;\n\t\t\tif (message->FindInt64(\"node\", &node) < B_OK)\n\t\t\t\tbreak;\n\t\t\tfRoot->EntryRemoved(node);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n\nbool\nRosterLooper::InitCheck()\n{\n\treturn fInitCheck;\n}\n\n\nUSBRoster::USBRoster()\n\t:\tfLooper(NULL)\n{\n}\n\n\nUSBRoster::~USBRoster()\n{\n\tStop();\n}\n\n\nint\nUSBRoster::Start()\n{\n\tif (fLooper == NULL) {\n\t\tfLooper = new(std::nothrow) RosterLooper(this);\n\t\tif (fLooper == NULL || ((RosterLooper *)fLooper)->InitCheck() == false) {\n\t\t\tif (fLooper)\n\t\t\t\tfLooper = NULL;\n\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n\treturn LIBUSB_SUCCESS;\n}\n\n\nvoid\nUSBRoster::Stop()\n{\n\tif (fLooper) {\n\t\t((RosterLooper *)fLooper)->Stop();\n\t\tfLooper = NULL;\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb.h",
    "content": "/*\n * Haiku Backend for libusb\n * Copyright © 2014 Akshay Jaggi <akshay1994.leo@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <List.h>\n#include <Locker.h>\n#include <Autolock.h>\n#include <USBKit.h>\n#include <map>\n#include \"libusbi.h\"\n#include \"haiku_usb_raw.h\"\n\nusing namespace std;\n\nclass USBDevice;\nclass USBDeviceHandle;\nclass USBTransfer;\n\nclass USBDevice {\npublic:\n\t\t\t\t\t\tUSBDevice(const char *);\n\tvirtual\t\t\t\t\t~USBDevice();\n\tconst char*\t\t\t\tLocation() const;\n\tuint8\t\t\t\t\tCountConfigurations() const;\n\tconst usb_device_descriptor*\t\tDescriptor() const;\n\tconst usb_configuration_descriptor*\tConfigurationDescriptor(uint32) const;\n\tconst usb_configuration_descriptor*\tActiveConfiguration() const;\n\tuint8\t\t\t\t\tEndpointToIndex(uint8) const;\n\tuint8\t\t\t\t\tEndpointToInterface(uint8) const;\n\tint\t\t\t\t\tClaimInterface(int);\n\tint\t\t\t\t\tReleaseInterface(int);\n\tint\t\t\t\t\tCheckInterfacesFree(int);\n\tint\t\t\t\t\tSetActiveConfiguration(int);\n\tint\t\t\t\t\tActiveConfigurationIndex() const;\n\tbool\t\t\t\t\tInitCheck();\nprivate:\n\tint\t\t\t\t\tInitialise();\n\tunsigned int\t\t\t\tfClaimedInterfaces;\t// Max Interfaces can be 32. Using a bitmask\n\tusb_device_descriptor\t\t\tfDeviceDescriptor;\n\tunsigned char**\t\t\t\tfConfigurationDescriptors;\n\tint\t\t\t\t\tfActiveConfiguration;\n\tchar*\t\t\t\t\tfPath;\n\tmap<uint8,uint8>\t\t\tfConfigToIndex;\n\tmap<uint8,uint8>*\t\t\tfEndpointToIndex;\n\tmap<uint8,uint8>*\t\t\tfEndpointToInterface;\n\tbool\t\t\t\t\tfInitCheck;\n};\n\nclass USBDeviceHandle {\npublic:\n\t\t\t\tUSBDeviceHandle(USBDevice *dev);\n\tvirtual\t\t\t~USBDeviceHandle();\n\tint\t\t\tClaimInterface(int);\n\tint\t\t\tReleaseInterface(int);\n\tint\t\t\tSetConfiguration(int);\n\tint\t\t\tSetAltSetting(int, int);\n\tstatus_t\t\tSubmitTransfer(struct usbi_transfer *);\n\tstatus_t\t\tCancelTransfer(USBTransfer *);\n\tbool\t\t\tInitCheck();\nprivate:\n\tint\t\t\tfRawFD;\n\tstatic status_t\t\tTransfersThread(void *);\n\tvoid\t\t\tTransfersWorker();\n\tUSBDevice*\t\tfUSBDevice;\n\tunsigned int\t\tfClaimedInterfaces;\n\tBList\t\t\tfTransfers;\n\tBLocker\t\t\tfTransfersLock;\n\tsem_id\t\t\tfTransfersSem;\n\tthread_id\t\tfTransfersThread;\n\tbool\t\t\tfInitCheck;\n};\n\nclass USBTransfer {\npublic:\n\t\t\t\t\tUSBTransfer(struct usbi_transfer *, USBDevice *);\n\tvirtual\t\t\t\t~USBTransfer();\n\tvoid\t\t\t\tDo(int);\n\tstruct usbi_transfer*\t\tUsbiTransfer();\n\tvoid\t\t\t\tSetCancelled();\n\tbool\t\t\t\tIsCancelled();\nprivate:\n\tstruct usbi_transfer*\t\tfUsbiTransfer;\n\tstruct libusb_transfer*\t\tfLibusbTransfer;\n\tUSBDevice*\t\t\tfUSBDevice;\n\tBLocker\t\t\t\tfStatusLock;\n\tbool\t\t\t\tfCancelled;\n};\n\nclass USBRoster {\npublic:\n\t\t\tUSBRoster();\n\tvirtual\t\t~USBRoster();\n\tint\t\tStart();\n\tvoid\t\tStop();\nprivate:\n\tvoid*\t\tfLooper;\n};\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_backend.cpp",
    "content": "/*\n * Haiku Backend for libusb\n * Copyright © 2014 Akshay Jaggi <akshay1994.leo@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n\n#include <unistd.h>\n#include <string.h>\n#include <stdlib.h>\n#include <new>\n#include <vector>\n\n#include \"haiku_usb.h\"\n\nint _errno_to_libusb(int status)\n{\n\treturn status;\n}\n\nUSBTransfer::USBTransfer(struct usbi_transfer *itransfer, USBDevice *device)\n{\n\tfUsbiTransfer = itransfer;\n\tfLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tfUSBDevice = device;\n\tfCancelled = false;\n}\n\nUSBTransfer::~USBTransfer()\n{\n}\n\nstruct usbi_transfer *\nUSBTransfer::UsbiTransfer()\n{\n\treturn fUsbiTransfer;\n}\n\nvoid\nUSBTransfer::SetCancelled()\n{\n\tfCancelled = true;\n}\n\nbool\nUSBTransfer::IsCancelled()\n{\n\treturn fCancelled;\n}\n\nvoid\nUSBTransfer::Do(int fRawFD)\n{\n\tswitch (fLibusbTransfer->type) {\n\t\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\t{\n\t\t\tstruct libusb_control_setup *setup = (struct libusb_control_setup *)fLibusbTransfer->buffer;\n\t\t\tusb_raw_command command;\n\t\t\tcommand.control.request_type = setup->bmRequestType;\n\t\t\tcommand.control.request = setup->bRequest;\n\t\t\tcommand.control.value = setup->wValue;\n\t\t\tcommand.control.index = setup->wIndex;\n\t\t\tcommand.control.length = setup->wLength;\n\t\t\tcommand.control.data = fLibusbTransfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;\n\t\t\tif (fCancelled)\n\t\t\t\tbreak;\n\t\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_CONTROL_TRANSFER, &command, sizeof(command)) ||\n\t\t\t\t\tcommand.control.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\t\tfUsbiTransfer->transferred = -1;\n\t\t\t\tusbi_err(TRANSFER_CTX(fLibusbTransfer), \"failed control transfer\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfUsbiTransfer->transferred = command.control.length;\n\t\t}\n\t\tbreak;\n\t\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\t\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\t{\n\t\t\tusb_raw_command command;\n\t\t\tcommand.transfer.interface = fUSBDevice->EndpointToInterface(fLibusbTransfer->endpoint);\n\t\t\tcommand.transfer.endpoint = fUSBDevice->EndpointToIndex(fLibusbTransfer->endpoint);\n\t\t\tcommand.transfer.data = fLibusbTransfer->buffer;\n\t\t\tcommand.transfer.length = fLibusbTransfer->length;\n\t\t\tif (fCancelled)\n\t\t\t\tbreak;\n\t\t\tif (fLibusbTransfer->type == LIBUSB_TRANSFER_TYPE_BULK) {\n\t\t\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_BULK_TRANSFER, &command, sizeof(command)) ||\n\t\t\t\t\t\tcommand.transfer.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\t\t\tfUsbiTransfer->transferred = -1;\n\t\t\t\t\tusbi_err(TRANSFER_CTX(fLibusbTransfer), \"failed bulk transfer\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_INTERRUPT_TRANSFER, &command, sizeof(command)) ||\n\t\t\t\t\t\tcommand.transfer.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\t\t\tfUsbiTransfer->transferred = -1;\n\t\t\t\t\tusbi_err(TRANSFER_CTX(fLibusbTransfer), \"failed interrupt transfer\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfUsbiTransfer->transferred = command.transfer.length;\n\t\t}\n\t\tbreak;\n\t\t// IsochronousTransfers not tested\n\t\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\t{\n\t\t\tusb_raw_command command;\n\t\t\tcommand.isochronous.interface = fUSBDevice->EndpointToInterface(fLibusbTransfer->endpoint);\n\t\t\tcommand.isochronous.endpoint = fUSBDevice->EndpointToIndex(fLibusbTransfer->endpoint);\n\t\t\tcommand.isochronous.data = fLibusbTransfer->buffer;\n\t\t\tcommand.isochronous.length = fLibusbTransfer->length;\n\t\t\tcommand.isochronous.packet_count = fLibusbTransfer->num_iso_packets;\n\t\t\tint i;\n\t\t\tusb_iso_packet_descriptor *packetDescriptors = new usb_iso_packet_descriptor[fLibusbTransfer->num_iso_packets];\n\t\t\tfor (i = 0; i < fLibusbTransfer->num_iso_packets; i++) {\n\t\t\t\tif ((int16)(fLibusbTransfer->iso_packet_desc[i]).length != (fLibusbTransfer->iso_packet_desc[i]).length) {\n\t\t\t\t\tfUsbiTransfer->transferred = -1;\n\t\t\t\t\tusbi_err(TRANSFER_CTX(fLibusbTransfer), \"failed isochronous transfer\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpacketDescriptors[i].request_length = (int16)(fLibusbTransfer->iso_packet_desc[i]).length;\n\t\t\t}\n\t\t\tif (i < fLibusbTransfer->num_iso_packets)\n\t\t\t\tbreak;\t// TODO Handle this error\n\t\t\tcommand.isochronous.packet_descriptors = packetDescriptors;\n\t\t\tif (fCancelled)\n\t\t\t\tbreak;\n\t\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_ISOCHRONOUS_TRANSFER, &command, sizeof(command)) ||\n\t\t\t\t\tcommand.isochronous.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\t\tfUsbiTransfer->transferred = -1;\n\t\t\t\tusbi_err(TRANSFER_CTX(fLibusbTransfer), \"failed isochronous transfer\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfor (i = 0; i < fLibusbTransfer->num_iso_packets; i++) {\n\t\t\t\t(fLibusbTransfer->iso_packet_desc[i]).actual_length = packetDescriptors[i].actual_length;\n\t\t\t\tswitch (packetDescriptors[i].status) {\n\t\t\t\t\tcase B_OK:\n\t\t\t\t\t\t(fLibusbTransfer->iso_packet_desc[i]).status = LIBUSB_TRANSFER_COMPLETED;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t(fLibusbTransfer->iso_packet_desc[i]).status = LIBUSB_TRANSFER_ERROR;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelete[] packetDescriptors;\n\t\t\t// Do we put the length of transfer here, for isochronous transfers?\n\t\t\tfUsbiTransfer->transferred = command.transfer.length;\n\t\t}\n\t\tbreak;\n\t\tdefault:\n\t\t\tusbi_err(TRANSFER_CTX(fLibusbTransfer), \"Unknown type of transfer\");\n\t}\n}\n\nbool\nUSBDeviceHandle::InitCheck()\n{\n\treturn fInitCheck;\n}\n\nstatus_t\nUSBDeviceHandle::TransfersThread(void *self)\n{\n\tUSBDeviceHandle *handle = (USBDeviceHandle *)self;\n\thandle->TransfersWorker();\n\treturn B_OK;\n}\n\nvoid\nUSBDeviceHandle::TransfersWorker()\n{\n\twhile (true) {\n\t\tstatus_t status = acquire_sem(fTransfersSem);\n\t\tif (status == B_BAD_SEM_ID)\n\t\t\tbreak;\n\t\tif (status == B_INTERRUPTED)\n\t\t\tcontinue;\n\t\tfTransfersLock.Lock();\n\t\tUSBTransfer *fPendingTransfer = (USBTransfer *) fTransfers.RemoveItem((int32)0);\n\t\tfTransfersLock.Unlock();\n\t\tfPendingTransfer->Do(fRawFD);\n\t\tusbi_signal_transfer_completion(fPendingTransfer->UsbiTransfer());\n\t}\n}\n\nstatus_t\nUSBDeviceHandle::SubmitTransfer(struct usbi_transfer *itransfer)\n{\n\tUSBTransfer *transfer = new USBTransfer(itransfer, fUSBDevice);\n\t*((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = transfer;\n\tBAutolock locker(fTransfersLock);\n\tfTransfers.AddItem(transfer);\n\trelease_sem(fTransfersSem);\n\treturn LIBUSB_SUCCESS;\n}\n\nstatus_t\nUSBDeviceHandle::CancelTransfer(USBTransfer *transfer)\n{\n\ttransfer->SetCancelled();\n\tfTransfersLock.Lock();\n\tbool removed = fTransfers.RemoveItem(transfer);\n\tfTransfersLock.Unlock();\n\tif(removed)\n\t\tusbi_signal_transfer_completion(transfer->UsbiTransfer());\n\treturn LIBUSB_SUCCESS;\n}\n\nUSBDeviceHandle::USBDeviceHandle(USBDevice *dev)\n\t:\n\tfTransfersThread(-1),\n\tfUSBDevice(dev),\n\tfClaimedInterfaces(0),\n\tfInitCheck(false)\n{\n\tfRawFD = open(dev->Location(), O_RDWR | O_CLOEXEC);\n\tif (fRawFD < 0) {\n\t\tusbi_err(NULL,\"failed to open device\");\n\t\treturn;\n\t}\n\tfTransfersSem = create_sem(0, \"Transfers Queue Sem\");\n\tfTransfersThread = spawn_thread(TransfersThread, \"Transfer Worker\", B_NORMAL_PRIORITY, this);\n\tresume_thread(fTransfersThread);\n\tfInitCheck = true;\n}\n\nUSBDeviceHandle::~USBDeviceHandle()\n{\n\tif (fRawFD > 0)\n\t\tclose(fRawFD);\n\tfor(int i = 0; i < 32; i++) {\n\t\tif (fClaimedInterfaces & (1 << i))\n\t\t\tReleaseInterface(i);\n\t}\n\tdelete_sem(fTransfersSem);\n\tif (fTransfersThread > 0)\n\t\twait_for_thread(fTransfersThread, NULL);\n}\n\nint\nUSBDeviceHandle::ClaimInterface(int inumber)\n{\n\tint status = fUSBDevice->ClaimInterface(inumber);\n\tif (status == LIBUSB_SUCCESS)\n\t\tfClaimedInterfaces |= (1 << inumber);\n\treturn status;\n}\n\nint\nUSBDeviceHandle::ReleaseInterface(int inumber)\n{\n\tfUSBDevice->ReleaseInterface(inumber);\n\tfClaimedInterfaces &= ~(1 << inumber);\n\treturn LIBUSB_SUCCESS;\n}\n\nint\nUSBDeviceHandle::SetConfiguration(int config)\n{\n\tint config_index = fUSBDevice->CheckInterfacesFree(config);\n\tif(config_index == LIBUSB_ERROR_BUSY || config_index == LIBUSB_ERROR_NOT_FOUND)\n\t\treturn config_index;\n\tusb_raw_command command;\n\tcommand.config.config_index = config_index;\n\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_SET_CONFIGURATION, &command, sizeof(command)) ||\n\t\t\tcommand.config.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\treturn _errno_to_libusb(command.config.status);\n\t}\n\tfUSBDevice->SetActiveConfiguration(config_index);\n\treturn LIBUSB_SUCCESS;\n}\n\nint\nUSBDeviceHandle::SetAltSetting(int inumber, int alt)\n{\n\tusb_raw_command command;\n\tcommand.alternate.config_index = fUSBDevice->ActiveConfigurationIndex();\n\tcommand.alternate.interface_index = inumber;\n\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_ACTIVE_ALT_INTERFACE_INDEX, &command, sizeof(command)) ||\n\t\t\tcommand.alternate.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\tusbi_err(NULL, \"Error retrieving active alternate interface\");\n\t\treturn _errno_to_libusb(command.alternate.status);\n\t}\n\tif (command.alternate.alternate_info == alt) {\n\t\tusbi_dbg(\"Setting alternate interface successful\");\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\tcommand.alternate.alternate_info = alt;\n\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_SET_ALT_INTERFACE, &command, sizeof(command)) ||\n\t\t\tcommand.alternate.status != B_USB_RAW_STATUS_SUCCESS) { //IF IOCTL FAILS DEVICE DISONNECTED PROBABLY\n\t\tusbi_err(NULL, \"Error setting alternate interface\");\n\t\treturn _errno_to_libusb(command.alternate.status);\n\t}\n\tusbi_dbg(\"Setting alternate interface successful\");\n\treturn LIBUSB_SUCCESS;\n}\n\n\nUSBDevice::USBDevice(const char *path)\n\t:\n\tfPath(NULL),\n\tfActiveConfiguration(0),\t//0?\n\tfConfigurationDescriptors(NULL),\n\tfClaimedInterfaces(0),\n\tfEndpointToIndex(NULL),\n\tfEndpointToInterface(NULL),\n\tfInitCheck(false)\n{\n\tfPath=strdup(path);\n\tInitialise();\n}\n\nUSBDevice::~USBDevice()\n{\n\tfree(fPath);\n\tif (fConfigurationDescriptors) {\n\t\tfor(int i = 0; i < fDeviceDescriptor.num_configurations; i++) {\n\t\t\tif (fConfigurationDescriptors[i])\n\t\t\t\tdelete fConfigurationDescriptors[i];\n\t\t}\n\t\tdelete[] fConfigurationDescriptors;\n\t}\n\tif (fEndpointToIndex)\n\t\tdelete[] fEndpointToIndex;\n\tif (fEndpointToInterface)\n\t\tdelete[] fEndpointToInterface;\n}\n\nbool\nUSBDevice::InitCheck()\n{\n\treturn fInitCheck;\n}\n\nconst char *\nUSBDevice::Location() const\n{\n\treturn fPath;\n}\n\nuint8\nUSBDevice::CountConfigurations() const\n{\n\treturn fDeviceDescriptor.num_configurations;\n}\n\nconst usb_device_descriptor *\nUSBDevice::Descriptor() const\n{\n\treturn &fDeviceDescriptor;\n}\n\nconst usb_configuration_descriptor *\nUSBDevice::ConfigurationDescriptor(uint32 index) const\n{\n\tif (index > CountConfigurations())\n\t\treturn NULL;\n\treturn (usb_configuration_descriptor *) fConfigurationDescriptors[index];\n}\n\nconst usb_configuration_descriptor *\nUSBDevice::ActiveConfiguration() const\n{\n\treturn (usb_configuration_descriptor *) fConfigurationDescriptors[fActiveConfiguration];\n}\n\nint\nUSBDevice::ActiveConfigurationIndex() const\n{\n\treturn fActiveConfiguration;\n}\n\nint USBDevice::ClaimInterface(int interface)\n{\n\tif (interface > ActiveConfiguration()->number_interfaces)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\tif (fClaimedInterfaces & (1 << interface))\n\t\treturn LIBUSB_ERROR_BUSY;\n\tfClaimedInterfaces |= (1 << interface);\n\treturn LIBUSB_SUCCESS;\n}\n\nint USBDevice::ReleaseInterface(int interface)\n{\n\tfClaimedInterfaces &= ~(1 << interface);\n\treturn LIBUSB_SUCCESS;\n}\n\nint\nUSBDevice::CheckInterfacesFree(int config)\n{\n\tif (fConfigToIndex.count(config) == 0)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\tif (fClaimedInterfaces == 0)\n\t\treturn fConfigToIndex[(uint8)config];\n\treturn LIBUSB_ERROR_BUSY;\n}\n\nint\nUSBDevice::SetActiveConfiguration(int config_index)\n{\n\tfActiveConfiguration = config_index;\n\treturn LIBUSB_SUCCESS;\n}\n\nuint8\nUSBDevice::EndpointToIndex(uint8 address) const\n{\n\treturn fEndpointToIndex[fActiveConfiguration][address];\n}\n\nuint8\nUSBDevice::EndpointToInterface(uint8 address) const\n{\n\treturn fEndpointToInterface[fActiveConfiguration][address];\n}\n\nint\nUSBDevice::Initialise()\t\t//Do we need more error checking, etc? How to report?\n{\n\tint fRawFD = open(fPath, O_RDWR | O_CLOEXEC);\n\tif (fRawFD < 0)\n\t\treturn B_ERROR;\n\tusb_raw_command command;\n\tcommand.device.descriptor = &fDeviceDescriptor;\n\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_DEVICE_DESCRIPTOR, &command, sizeof(command)) ||\n\t\t\tcommand.device.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\tclose(fRawFD);\n\t\treturn B_ERROR;\n\t}\n\n\tfConfigurationDescriptors = new(std::nothrow) unsigned char *[fDeviceDescriptor.num_configurations];\n\tfEndpointToIndex = new(std::nothrow) map<uint8,uint8> [fDeviceDescriptor.num_configurations];\n\tfEndpointToInterface = new(std::nothrow) map<uint8,uint8> [fDeviceDescriptor.num_configurations];\n\tfor (int i = 0; i < fDeviceDescriptor.num_configurations; i++) {\n\t\tusb_configuration_descriptor tmp_config;\n\t\tcommand.config.descriptor = &tmp_config;\n\t\tcommand.config.config_index = i;\n\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR, &command, sizeof(command)) ||\n\t\t\t\tcommand.config.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\tusbi_err(NULL, \"failed retrieving configuration descriptor\");\n\t\t\tclose(fRawFD);\n\t\t\treturn B_ERROR;\n\t\t}\n\t\tfConfigToIndex[tmp_config.configuration_value] = i;\n\t\tfConfigurationDescriptors[i] = new(std::nothrow) unsigned char[tmp_config.total_length];\n\t\tcommand.control.request_type = 128;\n\t\tcommand.control.request = 6;\n\t\tcommand.control.value = (2 << 8) | i;\n\t\tcommand.control.index = 0;\n\t\tcommand.control.length = tmp_config.total_length;\n\t\tcommand.control.data = fConfigurationDescriptors[i];\n\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_CONTROL_TRANSFER, &command, sizeof(command)) ||\n\t\t\t\tcommand.control.status!=B_USB_RAW_STATUS_SUCCESS) {\n\t\t\tusbi_err(NULL, \"failed retrieving full configuration descriptor\");\n\t\t\tclose(fRawFD);\n\t\t\treturn B_ERROR;\n\t\t}\n\t\tfor (int j = 0; j < tmp_config.number_interfaces; j++) {\n\t\t\tcommand.alternate.config_index = i;\n\t\t\tcommand.alternate.interface_index = j;\n\t\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_ALT_INTERFACE_COUNT, &command, sizeof(command)) ||\n\t\t\t\t\tcommand.config.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\t\tusbi_err(NULL, \"failed retrieving number of alternate interfaces\");\n\t\t\t\tclose(fRawFD);\n\t\t\t\treturn B_ERROR;\n\t\t\t}\n\t\t\tint num_alternate = command.alternate.alternate_info;\n\t\t\tfor (int k = 0; k < num_alternate; k++) {\n\t\t\t\tusb_interface_descriptor tmp_interface;\n\t\t\t\tcommand.interface_etc.config_index = i;\n\t\t\t\tcommand.interface_etc.interface_index = j;\n\t\t\t\tcommand.interface_etc.alternate_index = k;\n\t\t\t\tcommand.interface_etc.descriptor = &tmp_interface;\n\t\t\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR_ETC, &command, sizeof(command)) ||\n\t\t\t\t\t\tcommand.config.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\t\t\tusbi_err(NULL, \"failed retrieving interface descriptor\");\n\t\t\t\t\tclose(fRawFD);\n\t\t\t\t\treturn B_ERROR;\n\t\t\t\t}\n\t\t\t\tfor (int l = 0; l < tmp_interface.num_endpoints; l++) {\n\t\t\t\t\tusb_endpoint_descriptor tmp_endpoint;\n\t\t\t\t\tcommand.endpoint_etc.config_index = i;\n\t\t\t\t\tcommand.endpoint_etc.interface_index = j;\n\t\t\t\t\tcommand.endpoint_etc.alternate_index = k;\n\t\t\t\t\tcommand.endpoint_etc.endpoint_index = l;\n\t\t\t\t\tcommand.endpoint_etc.descriptor = &tmp_endpoint;\n\t\t\t\t\tif (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR_ETC, &command, sizeof(command)) ||\n\t\t\t\t\t\t\tcommand.config.status != B_USB_RAW_STATUS_SUCCESS) {\n\t\t\t\t\t\tusbi_err(NULL, \"failed retrieving endpoint descriptor\");\n\t\t\t\t\t\tclose(fRawFD);\n\t\t\t\t\t\treturn B_ERROR;\n\t\t\t\t\t}\n\t\t\t\t\tfEndpointToIndex[i][tmp_endpoint.endpoint_address] = l;\n\t\t\t\t\tfEndpointToInterface[i][tmp_endpoint.endpoint_address] = j;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tclose(fRawFD);\n\tfInitCheck = true;\n\treturn B_OK;\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.cpp",
    "content": "/*\n * Haiku Backend for libusb\n * Copyright © 2014 Akshay Jaggi <akshay1994.leo@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n\n#include <unistd.h>\n#include <string.h>\n#include <stdlib.h>\n#include <new>\n#include <vector>\n\n#include \"haiku_usb.h\"\n\nUSBRoster gUsbRoster;\nint32 gInitCount = 0;\n\nstatic int\nhaiku_init(struct libusb_context *ctx)\n{\n\tif (atomic_add(&gInitCount, 1) == 0)\n\t\treturn gUsbRoster.Start();\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void\nhaiku_exit(void)\n{\n\tif (atomic_add(&gInitCount, -1) == 1)\n\t\tgUsbRoster.Stop();\n}\n\nstatic int\nhaiku_open(struct libusb_device_handle *dev_handle)\n{\n\tUSBDevice *dev = *((USBDevice **)dev_handle->dev->os_priv);\n\tUSBDeviceHandle *handle = new(std::nothrow) USBDeviceHandle(dev);\n\tif (handle == NULL)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\tif (handle->InitCheck() == false) {\n\t\tdelete handle;\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\t*((USBDeviceHandle **)dev_handle->os_priv) = handle;\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void\nhaiku_close(struct libusb_device_handle *dev_handle)\n{\n\tUSBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv);\n\tif (handle == NULL)\n\t\treturn;\n\tdelete handle;\n\t*((USBDeviceHandle **)dev_handle->os_priv) = NULL;\n}\n\nstatic int\nhaiku_get_device_descriptor(struct libusb_device *device, unsigned char *buffer, int *host_endian)\n{\n\tUSBDevice *dev = *((USBDevice **)device->os_priv);\n\tmemcpy(buffer, dev->Descriptor(), DEVICE_DESC_LENGTH);\n\t*host_endian = 0;\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int\nhaiku_get_active_config_descriptor(struct libusb_device *device, unsigned char *buffer, size_t len, int *host_endian)\n{\n\tUSBDevice *dev = *((USBDevice **)device->os_priv);\n\tconst usb_configuration_descriptor *act_config = dev->ActiveConfiguration();\n\tif (len > act_config->total_length)\n\t\treturn LIBUSB_ERROR_OVERFLOW;\n\tmemcpy(buffer, act_config, len);\n\t*host_endian = 0;\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int\nhaiku_get_config_descriptor(struct libusb_device *device, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian)\n{\n\tUSBDevice *dev = *((USBDevice **)device->os_priv);\n\tconst usb_configuration_descriptor *config = dev->ConfigurationDescriptor(config_index);\n\tif (config == NULL) {\n\t\tusbi_err(DEVICE_CTX(device), \"failed getting configuration descriptor\");\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\tif (len > config->total_length)\n\t\tlen = config->total_length;\n\tmemcpy(buffer, config, len);\n\t*host_endian = 0;\n\treturn len;\n}\n\nstatic int\nhaiku_set_configuration(struct libusb_device_handle *dev_handle, int config)\n{\n\tUSBDeviceHandle *handle= *((USBDeviceHandle **)dev_handle->os_priv);\n\treturn handle->SetConfiguration(config);\n}\n\nstatic int\nhaiku_claim_interface(struct libusb_device_handle *dev_handle, int interface_number)\n{\n\tUSBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv);\n\treturn handle->ClaimInterface(interface_number);\n}\n\nstatic int\nhaiku_set_altsetting(struct libusb_device_handle *dev_handle, int interface_number, int altsetting)\n{\n\tUSBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv);\n\treturn handle->SetAltSetting(interface_number, altsetting);\n}\n\nstatic int\nhaiku_release_interface(struct libusb_device_handle *dev_handle, int interface_number)\n{\n\tUSBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv);\n\thaiku_set_altsetting(dev_handle,interface_number, 0);\n\treturn handle->ReleaseInterface(interface_number);\n}\n\nstatic int\nhaiku_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tUSBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)fLibusbTransfer->dev_handle->os_priv);\n\treturn fDeviceHandle->SubmitTransfer(itransfer);\n}\n\nstatic int\nhaiku_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tUSBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)fLibusbTransfer->dev_handle->os_priv);\n\treturn fDeviceHandle->CancelTransfer(*((USBTransfer **)usbi_transfer_get_os_priv(itransfer)));\n}\n\nstatic void\nhaiku_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tUSBTransfer *transfer = *((USBTransfer **)usbi_transfer_get_os_priv(itransfer));\n\tdelete transfer;\n\t*((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL;\n}\n\nstatic int\nhaiku_handle_transfer_completion(struct usbi_transfer *itransfer)\n{\n\tUSBTransfer *transfer = *((USBTransfer **)usbi_transfer_get_os_priv(itransfer));\n\n\tusbi_mutex_lock(&itransfer->lock);\n\tif (transfer->IsCancelled()) {\n\t\tdelete transfer;\n\t\t*((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL;\n\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\tif (itransfer->transferred < 0)\n\t\t\titransfer->transferred = 0;\n\t\treturn usbi_handle_transfer_cancellation(itransfer);\n\t}\n\tlibusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED;\n\tif (itransfer->transferred < 0) {\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"error in transfer\");\n\t\tstatus = LIBUSB_TRANSFER_ERROR;\n\t\titransfer->transferred = 0;\n\t}\n\tdelete transfer;\n\t*((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL;\n\tusbi_mutex_unlock(&itransfer->lock);\n\treturn usbi_handle_transfer_completion(itransfer, status);\n}\n\nstatic int\nhaiku_clock_gettime(int clkid, struct timespec *tp)\n{\n\tif (clkid == USBI_CLOCK_REALTIME)\n\t\treturn clock_gettime(CLOCK_REALTIME, tp);\n\tif (clkid == USBI_CLOCK_MONOTONIC)\n\t\treturn clock_gettime(CLOCK_MONOTONIC, tp);\n\treturn LIBUSB_ERROR_INVALID_PARAM;\n}\n\nconst struct usbi_os_backend haiku_usb_raw_backend = {\n\t/*.name =*/ \"Haiku usbfs\",\n\t/*.caps =*/ 0,\n\t/*.init =*/ haiku_init,\n\t/*.exit =*/ haiku_exit,\n\t/*.get_device_list =*/ NULL,\n\t/*.hotplug_poll =*/ NULL,\n\t/*.open =*/ haiku_open,\n\t/*.close =*/ haiku_close,\n\t/*.get_device_descriptor =*/ haiku_get_device_descriptor,\n\t/*.get_active_config_descriptor =*/ haiku_get_active_config_descriptor,\n\t/*.get_config_descriptor =*/ haiku_get_config_descriptor,\n\t/*.get_config_descriptor_by_value =*/ NULL,\n\n\n\t/*.get_configuration =*/ NULL,\n\t/*.set_configuration =*/ haiku_set_configuration,\n\t/*.claim_interface =*/ haiku_claim_interface,\n\t/*.release_interface =*/ haiku_release_interface,\n\n\t/*.set_interface_altsetting =*/ haiku_set_altsetting,\n\t/*.clear_halt =*/ NULL,\n\t/*.reset_device =*/ NULL,\n\n\t/*.alloc_streams =*/ NULL,\n\t/*.free_streams =*/ NULL,\n\n\t/*.dev_mem_alloc =*/ NULL,\n\t/*.dev_mem_free =*/ NULL,\n\n\t/*.kernel_driver_active =*/ NULL,\n\t/*.detach_kernel_driver =*/ NULL,\n\t/*.attach_kernel_driver =*/ NULL,\n\n\t/*.destroy_device =*/ NULL,\n\n\t/*.submit_transfer =*/ haiku_submit_transfer,\n\t/*.cancel_transfer =*/ haiku_cancel_transfer,\n\t/*.clear_transfer_priv =*/ haiku_clear_transfer_priv,\n\n\t/*.handle_events =*/ NULL,\n\t/*.handle_transfer_completion =*/ haiku_handle_transfer_completion,\n\n\t/*.clock_gettime =*/ haiku_clock_gettime,\n\n#ifdef USBI_TIMERFD_AVAILABLE\n\t/*.get_timerfd_clockid =*/ NULL,\n#endif\n\n\t/*.device_priv_size =*/ sizeof(USBDevice *),\n\t/*.device_handle_priv_size =*/ sizeof(USBDeviceHandle *),\n\t/*.transfer_priv_size =*/ sizeof(USBTransfer *),\n};\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.h",
    "content": "/*\n * Copyright 2006-2008, Haiku Inc. All rights reserved.\n * Distributed under the terms of the MIT License.\n */\n\n#ifndef _USB_RAW_H_\n#define _USB_RAW_H_\n\n#include <USB3.h>\n\n#define B_USB_RAW_PROTOCOL_VERSION\t0x0015\n#define B_USB_RAW_ACTIVE_ALTERNATE\t0xffffffff\n\ntypedef enum {\n\tB_USB_RAW_COMMAND_GET_VERSION = 0x1000,\n\n\tB_USB_RAW_COMMAND_GET_DEVICE_DESCRIPTOR = 0x2000,\n\tB_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR,\n\tB_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR,\n\tB_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR,\n\tB_USB_RAW_COMMAND_GET_STRING_DESCRIPTOR,\n\tB_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR,\n\tB_USB_RAW_COMMAND_GET_ALT_INTERFACE_COUNT,\n\tB_USB_RAW_COMMAND_GET_ACTIVE_ALT_INTERFACE_INDEX,\n\tB_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR_ETC,\n\tB_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR_ETC,\n\tB_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR_ETC,\n\n\tB_USB_RAW_COMMAND_SET_CONFIGURATION = 0x3000,\n\tB_USB_RAW_COMMAND_SET_FEATURE,\n\tB_USB_RAW_COMMAND_CLEAR_FEATURE,\n\tB_USB_RAW_COMMAND_GET_STATUS,\n\tB_USB_RAW_COMMAND_GET_DESCRIPTOR,\n\tB_USB_RAW_COMMAND_SET_ALT_INTERFACE,\n\n\tB_USB_RAW_COMMAND_CONTROL_TRANSFER = 0x4000,\n\tB_USB_RAW_COMMAND_INTERRUPT_TRANSFER,\n\tB_USB_RAW_COMMAND_BULK_TRANSFER,\n\tB_USB_RAW_COMMAND_ISOCHRONOUS_TRANSFER\n} usb_raw_command_id;\n\n\ntypedef enum {\n\tB_USB_RAW_STATUS_SUCCESS = 0,\n\n\tB_USB_RAW_STATUS_FAILED,\n\tB_USB_RAW_STATUS_ABORTED,\n\tB_USB_RAW_STATUS_STALLED,\n\tB_USB_RAW_STATUS_CRC_ERROR,\n\tB_USB_RAW_STATUS_TIMEOUT,\n\n\tB_USB_RAW_STATUS_INVALID_CONFIGURATION,\n\tB_USB_RAW_STATUS_INVALID_INTERFACE,\n\tB_USB_RAW_STATUS_INVALID_ENDPOINT,\n\tB_USB_RAW_STATUS_INVALID_STRING,\n\n\tB_USB_RAW_STATUS_NO_MEMORY\n} usb_raw_command_status;\n\n\ntypedef union {\n\tstruct {\n\t\tstatus_t status;\n\t} version;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_device_descriptor *descriptor;\n\t} device;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_configuration_descriptor *descriptor;\n\t\tuint32 config_index;\n\t} config;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tuint32 alternate_info;\n\t\tuint32 config_index;\n\t\tuint32 interface_index;\n\t} alternate;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_interface_descriptor *descriptor;\n\t\tuint32 config_index;\n\t\tuint32 interface_index;\n\t} interface;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_interface_descriptor *descriptor;\n\t\tuint32 config_index;\n\t\tuint32 interface_index;\n\t\tuint32 alternate_index;\n\t} interface_etc;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_endpoint_descriptor *descriptor;\n\t\tuint32 config_index;\n\t\tuint32 interface_index;\n\t\tuint32 endpoint_index;\n\t} endpoint;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_endpoint_descriptor *descriptor;\n\t\tuint32 config_index;\n\t\tuint32 interface_index;\n\t\tuint32 alternate_index;\n\t\tuint32 endpoint_index;\n\t} endpoint_etc;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_descriptor *descriptor;\n\t\tuint32 config_index;\n\t\tuint32 interface_index;\n\t\tuint32 generic_index;\n\t\tsize_t length;\n\t} generic;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_descriptor *descriptor;\n\t\tuint32 config_index;\n\t\tuint32 interface_index;\n\t\tuint32 alternate_index;\n\t\tuint32 generic_index;\n\t\tsize_t length;\n\t} generic_etc;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tusb_string_descriptor *descriptor;\n\t\tuint32 string_index;\n\t\tsize_t length;\n\t} string;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tuint8 type;\n\t\tuint8 index;\n\t\tuint16 language_id;\n\t\tvoid *data;\n\t\tsize_t length;\n\t} descriptor;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tuint8 request_type;\n\t\tuint8 request;\n\t\tuint16 value;\n\t\tuint16 index;\n\t\tuint16 length;\n\t\tvoid *data;\n\t} control;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tuint32 interface;\n\t\tuint32 endpoint;\n\t\tvoid *data;\n\t\tsize_t length;\n\t} transfer;\n\n\tstruct {\n\t\tstatus_t status;\n\t\tuint32 interface;\n\t\tuint32 endpoint;\n\t\tvoid *data;\n\t\tsize_t length;\n\t\tusb_iso_packet_descriptor *packet_descriptors;\n\t\tuint32 packet_count;\n\t} isochronous;\n} usb_raw_command;\n\n#endif // _USB_RAW_H_\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/linux_netlink.c",
    "content": "/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */\n/*\n * Linux usbfs backend for libusb\n * Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>\n * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com>\n * Copyright (c) 2013 Nathan Hjelm <hjelmn@mac.com>\n * Copyright (c) 2016 Chris Dickens <christopher.a.dickens@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <poll.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <sys/types.h>\n\n#ifdef HAVE_ASM_TYPES_H\n#include <asm/types.h>\n#endif\n\n#include <sys/socket.h>\n#include <linux/netlink.h>\n\n#include \"libusbi.h\"\n#include \"linux_usbfs.h\"\n\n#define NL_GROUP_KERNEL 1\n\nstatic int linux_netlink_socket = -1;\nstatic int netlink_control_pipe[2] = { -1, -1 };\nstatic pthread_t libusb_linux_event_thread;\n\nstatic void *linux_netlink_event_thread_main(void *arg);\n\nstatic int set_fd_cloexec_nb(int fd)\n{\n\tint flags;\n\n#if defined(FD_CLOEXEC)\n\tflags = fcntl(fd, F_GETFD);\n\tif (flags == -1) {\n\t\tusbi_err(NULL, \"failed to get netlink fd flags (%d)\", errno);\n\t\treturn -1;\n\t}\n\n\tif (!(flags & FD_CLOEXEC)) {\n\t\tif (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) {\n\t\t\tusbi_err(NULL, \"failed to set netlink fd flags (%d)\", errno);\n\t\t\treturn -1;\n\t\t}\n\t}\n#endif\n\n\tflags = fcntl(fd, F_GETFL);\n\tif (flags == -1) {\n\t\tusbi_err(NULL, \"failed to get netlink fd status flags (%d)\", errno);\n\t\treturn -1;\n\t}\n\n\tif (!(flags & O_NONBLOCK)) {\n\t\tif (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {\n\t\t\tusbi_err(NULL, \"failed to set netlink fd status flags (%d)\", errno);\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nint linux_netlink_start_event_monitor(void)\n{\n\tstruct sockaddr_nl sa_nl = { .nl_family = AF_NETLINK, .nl_groups = NL_GROUP_KERNEL };\n\tint socktype = SOCK_RAW;\n\tint opt = 1;\n\tint ret;\n\n#if defined(SOCK_CLOEXEC)\n\tsocktype |= SOCK_CLOEXEC;\n#endif\n#if defined(SOCK_NONBLOCK)\n\tsocktype |= SOCK_NONBLOCK;\n#endif\n\n\tlinux_netlink_socket = socket(PF_NETLINK, socktype, NETLINK_KOBJECT_UEVENT);\n\tif (linux_netlink_socket == -1 && errno == EINVAL) {\n\t\tusbi_dbg(\"failed to create netlink socket of type %d, attempting SOCK_RAW\", socktype);\n\t\tlinux_netlink_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);\n\t}\n\n\tif (linux_netlink_socket == -1) {\n\t\tusbi_err(NULL, \"failed to create netlink socket (%d)\", errno);\n\t\tgoto err;\n\t}\n\n\tret = set_fd_cloexec_nb(linux_netlink_socket);\n\tif (ret == -1)\n\t\tgoto err_close_socket;\n\n\tret = bind(linux_netlink_socket, (struct sockaddr *)&sa_nl, sizeof(sa_nl));\n\tif (ret == -1) {\n\t\tusbi_err(NULL, \"failed to bind netlink socket (%d)\", errno);\n\t\tgoto err_close_socket;\n\t}\n\n\tret = setsockopt(linux_netlink_socket, SOL_SOCKET, SO_PASSCRED, &opt, sizeof(opt));\n\tif (ret == -1) {\n\t\tusbi_err(NULL, \"failed to set netlink socket SO_PASSCRED option (%d)\", errno);\n\t\tgoto err_close_socket;\n\t}\n\n\tret = usbi_pipe(netlink_control_pipe);\n\tif (ret) {\n\t\tusbi_err(NULL, \"failed to create netlink control pipe\");\n\t\tgoto err_close_socket;\n\t}\n\n\tret = pthread_create(&libusb_linux_event_thread, NULL, linux_netlink_event_thread_main, NULL);\n\tif (ret != 0) {\n\t\tusbi_err(NULL, \"failed to create netlink event thread (%d)\", ret);\n\t\tgoto err_close_pipe;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n\nerr_close_pipe:\n\tclose(netlink_control_pipe[0]);\n\tclose(netlink_control_pipe[1]);\n\tnetlink_control_pipe[0] = -1;\n\tnetlink_control_pipe[1] = -1;\nerr_close_socket:\n\tclose(linux_netlink_socket);\n\tlinux_netlink_socket = -1;\nerr:\n\treturn LIBUSB_ERROR_OTHER;\n}\n\nint linux_netlink_stop_event_monitor(void)\n{\n\tchar dummy = 1;\n\tssize_t r;\n\n\tassert(linux_netlink_socket != -1);\n\n\t/* Write some dummy data to the control pipe and\n\t * wait for the thread to exit */\n\tr = usbi_write(netlink_control_pipe[1], &dummy, sizeof(dummy));\n\tif (r <= 0)\n\t\tusbi_warn(NULL, \"netlink control pipe signal failed\");\n\n\tpthread_join(libusb_linux_event_thread, NULL);\n\n\tclose(linux_netlink_socket);\n\tlinux_netlink_socket = -1;\n\n\t/* close and reset control pipe */\n\tclose(netlink_control_pipe[0]);\n\tclose(netlink_control_pipe[1]);\n\tnetlink_control_pipe[0] = -1;\n\tnetlink_control_pipe[1] = -1;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic const char *netlink_message_parse(const char *buffer, size_t len, const char *key)\n{\n\tconst char *end = buffer + len;\n\tsize_t keylen = strlen(key);\n\n\twhile (buffer < end && *buffer) {\n\t\tif (strncmp(buffer, key, keylen) == 0 && buffer[keylen] == '=')\n\t\t\treturn buffer + keylen + 1;\n\t\tbuffer += strlen(buffer) + 1;\n\t}\n\n\treturn NULL;\n}\n\n/* parse parts of netlink message common to both libudev and the kernel */\nstatic int linux_netlink_parse(const char *buffer, size_t len, int *detached,\n\tconst char **sys_name, uint8_t *busnum, uint8_t *devaddr)\n{\n\tconst char *tmp, *slash;\n\n\terrno = 0;\n\n\t*sys_name = NULL;\n\t*detached = 0;\n\t*busnum   = 0;\n\t*devaddr  = 0;\n\n\ttmp = netlink_message_parse(buffer, len, \"ACTION\");\n\tif (!tmp) {\n\t\treturn -1;\n\t} else if (strcmp(tmp, \"remove\") == 0) {\n\t\t*detached = 1;\n\t} else if (strcmp(tmp, \"add\") != 0) {\n\t\tusbi_dbg(\"unknown device action %s\", tmp);\n\t\treturn -1;\n\t}\n\n\t/* check that this is a usb message */\n\ttmp = netlink_message_parse(buffer, len, \"SUBSYSTEM\");\n\tif (!tmp || strcmp(tmp, \"usb\") != 0) {\n\t\t/* not usb. ignore */\n\t\treturn -1;\n\t}\n\n\t/* check that this is an actual usb device */\n\ttmp = netlink_message_parse(buffer, len, \"DEVTYPE\");\n\tif (!tmp || strcmp(tmp, \"usb_device\") != 0) {\n\t\t/* not usb. ignore */\n\t\treturn -1;\n\t}\n\n\ttmp = netlink_message_parse(buffer, len, \"BUSNUM\");\n\tif (tmp) {\n\t\t*busnum = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff);\n\t\tif (errno) {\n\t\t\terrno = 0;\n\t\t\treturn -1;\n\t\t}\n\n\t\ttmp = netlink_message_parse(buffer, len, \"DEVNUM\");\n\t\tif (NULL == tmp)\n\t\t\treturn -1;\n\n\t\t*devaddr = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff);\n\t\tif (errno) {\n\t\t\terrno = 0;\n\t\t\treturn -1;\n\t\t}\n\t} else {\n\t\t/* no bus number. try \"DEVICE\" */\n\t\ttmp = netlink_message_parse(buffer, len, \"DEVICE\");\n\t\tif (!tmp) {\n\t\t\t/* not usb. ignore */\n\t\t\treturn -1;\n\t\t}\n\n\t\t/* Parse a device path such as /dev/bus/usb/003/004 */\n\t\tslash = strrchr(tmp, '/');\n\t\tif (!slash)\n\t\t\treturn -1;\n\n\t\t*busnum = (uint8_t)(strtoul(slash - 3, NULL, 10) & 0xff);\n\t\tif (errno) {\n\t\t\terrno = 0;\n\t\t\treturn -1;\n\t\t}\n\n\t\t*devaddr = (uint8_t)(strtoul(slash + 1, NULL, 10) & 0xff);\n\t\tif (errno) {\n\t\t\terrno = 0;\n\t\t\treturn -1;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\ttmp = netlink_message_parse(buffer, len, \"DEVPATH\");\n\tif (!tmp)\n\t\treturn -1;\n\n\tslash = strrchr(tmp, '/');\n\tif (slash)\n\t\t*sys_name = slash + 1;\n\n\t/* found a usb device */\n\treturn 0;\n}\n\nstatic int linux_netlink_read_message(void)\n{\n\tchar cred_buffer[CMSG_SPACE(sizeof(struct ucred))];\n\tchar msg_buffer[2048];\n\tconst char *sys_name = NULL;\n\tuint8_t busnum, devaddr;\n\tint detached, r;\n\tssize_t len;\n\tstruct cmsghdr *cmsg;\n\tstruct ucred *cred;\n\tstruct sockaddr_nl sa_nl;\n\tstruct iovec iov = { .iov_base = msg_buffer, .iov_len = sizeof(msg_buffer) };\n\tstruct msghdr msg = {\n\t\t.msg_iov = &iov, .msg_iovlen = 1,\n\t\t.msg_control = cred_buffer, .msg_controllen = sizeof(cred_buffer),\n\t\t.msg_name = &sa_nl, .msg_namelen = sizeof(sa_nl)\n\t};\n\n\t/* read netlink message */\n\tlen = recvmsg(linux_netlink_socket, &msg, 0);\n\tif (len == -1) {\n\t\tif (errno != EAGAIN && errno != EINTR)\n\t\t\tusbi_err(NULL, \"error receiving message from netlink (%d)\", errno);\n\t\treturn -1;\n\t}\n\n\tif (len < 32 || (msg.msg_flags & MSG_TRUNC)) {\n\t\tusbi_err(NULL, \"invalid netlink message length\");\n\t\treturn -1;\n\t}\n\n\tif (sa_nl.nl_groups != NL_GROUP_KERNEL || sa_nl.nl_pid != 0) {\n\t\tusbi_dbg(\"ignoring netlink message from unknown group/PID (%u/%u)\",\n\t\t\t (unsigned int)sa_nl.nl_groups, (unsigned int)sa_nl.nl_pid);\n\t\treturn -1;\n\t}\n\n\tcmsg = CMSG_FIRSTHDR(&msg);\n\tif (!cmsg || cmsg->cmsg_type != SCM_CREDENTIALS) {\n\t\tusbi_dbg(\"ignoring netlink message with no sender credentials\");\n\t\treturn -1;\n\t}\n\n\tcred = (struct ucred *)CMSG_DATA(cmsg);\n\tif (cred->uid != 0) {\n\t\tusbi_dbg(\"ignoring netlink message with non-zero sender UID %u\", (unsigned int)cred->uid);\n\t\treturn -1;\n\t}\n\n\tr = linux_netlink_parse(msg_buffer, (size_t)len, &detached, &sys_name, &busnum, &devaddr);\n\tif (r)\n\t\treturn r;\n\n\tusbi_dbg(\"netlink hotplug found device busnum: %hhu, devaddr: %hhu, sys_name: %s, removed: %s\",\n\t\t busnum, devaddr, sys_name, detached ? \"yes\" : \"no\");\n\n\t/* signal device is available (or not) to all contexts */\n\tif (detached)\n\t\tlinux_device_disconnected(busnum, devaddr);\n\telse\n\t\tlinux_hotplug_enumerate(busnum, devaddr, sys_name);\n\n\treturn 0;\n}\n\nstatic void *linux_netlink_event_thread_main(void *arg)\n{\n\tchar dummy;\n\tssize_t r;\n\tstruct pollfd fds[] = {\n\t\t{ .fd = netlink_control_pipe[0],\n\t\t  .events = POLLIN },\n\t\t{ .fd = linux_netlink_socket,\n\t\t  .events = POLLIN },\n\t};\n\n\tUNUSED(arg);\n\n\tusbi_dbg(\"netlink event thread entering\");\n\n\twhile (poll(fds, 2, -1) >= 0) {\n\t\tif (fds[0].revents & POLLIN) {\n\t\t\t/* activity on control pipe, read the byte and exit */\n\t\t\tr = usbi_read(netlink_control_pipe[0], &dummy, sizeof(dummy));\n\t\t\tif (r <= 0)\n\t\t\t\tusbi_warn(NULL, \"netlink control pipe read failed\");\n\t\t\tbreak;\n\t\t}\n\t\tif (fds[1].revents & POLLIN) {\n\t\t\tusbi_mutex_static_lock(&linux_hotplug_lock);\n\t\t\tlinux_netlink_read_message();\n\t\t\tusbi_mutex_static_unlock(&linux_hotplug_lock);\n\t\t}\n\t}\n\n\tusbi_dbg(\"netlink event thread exiting\");\n\n\treturn NULL;\n}\n\nvoid linux_netlink_hotplug_poll(void)\n{\n\tint r;\n\n\tusbi_mutex_static_lock(&linux_hotplug_lock);\n\tdo {\n\t\tr = linux_netlink_read_message();\n\t} while (r == 0);\n\tusbi_mutex_static_unlock(&linux_hotplug_lock);\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/linux_udev.c",
    "content": "/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */\n/*\n * Linux usbfs backend for libusb\n * Copyright (C) 2007-2009 Daniel Drake <dsd@gentoo.org>\n * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com>\n * Copyright (c) 2012-2013 Nathan Hjelm <hjelmn@mac.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <assert.h>\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <poll.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/ioctl.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/utsname.h>\n#include <sys/socket.h>\n#include <unistd.h>\n#include <libudev.h>\n\n#include \"libusbi.h\"\n#include \"linux_usbfs.h\"\n\n/* udev context */\nstatic struct udev *udev_ctx = NULL;\nstatic int udev_monitor_fd = -1;\nstatic int udev_control_pipe[2] = {-1, -1};\nstatic struct udev_monitor *udev_monitor = NULL;\nstatic pthread_t linux_event_thread;\n\nstatic void udev_hotplug_event(struct udev_device* udev_dev);\nstatic void *linux_udev_event_thread_main(void *arg);\n\nint linux_udev_start_event_monitor(void)\n{\n\tint r;\n\n\tassert(udev_ctx == NULL);\n\tudev_ctx = udev_new();\n\tif (!udev_ctx) {\n\t\tusbi_err(NULL, \"could not create udev context\");\n\t\tgoto err;\n\t}\n\n\tudev_monitor = udev_monitor_new_from_netlink(udev_ctx, \"udev\");\n\tif (!udev_monitor) {\n\t\tusbi_err(NULL, \"could not initialize udev monitor\");\n\t\tgoto err_free_ctx;\n\t}\n\n\tr = udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, \"usb\", \"usb_device\");\n\tif (r) {\n\t\tusbi_err(NULL, \"could not initialize udev monitor filter for \\\"usb\\\" subsystem\");\n\t\tgoto err_free_monitor;\n\t}\n\n\tif (udev_monitor_enable_receiving(udev_monitor)) {\n\t\tusbi_err(NULL, \"failed to enable the udev monitor\");\n\t\tgoto err_free_monitor;\n\t}\n\n\tudev_monitor_fd = udev_monitor_get_fd(udev_monitor);\n\n\t/* Some older versions of udev are not non-blocking by default,\n\t * so make sure this is set */\n\tr = fcntl(udev_monitor_fd, F_GETFL);\n\tif (r == -1) {\n\t\tusbi_err(NULL, \"getting udev monitor fd flags (%d)\", errno);\n\t\tgoto err_free_monitor;\n\t}\n\tr = fcntl(udev_monitor_fd, F_SETFL, r | O_NONBLOCK);\n\tif (r) {\n\t\tusbi_err(NULL, \"setting udev monitor fd flags (%d)\", errno);\n\t\tgoto err_free_monitor;\n\t}\n\n\tr = usbi_pipe(udev_control_pipe);\n\tif (r) {\n\t\tusbi_err(NULL, \"could not create udev control pipe\");\n\t\tgoto err_free_monitor;\n\t}\n\n\tr = pthread_create(&linux_event_thread, NULL, linux_udev_event_thread_main, NULL);\n\tif (r) {\n\t\tusbi_err(NULL, \"creating hotplug event thread (%d)\", r);\n\t\tgoto err_close_pipe;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n\nerr_close_pipe:\n\tclose(udev_control_pipe[0]);\n\tclose(udev_control_pipe[1]);\nerr_free_monitor:\n\tudev_monitor_unref(udev_monitor);\n\tudev_monitor = NULL;\n\tudev_monitor_fd = -1;\nerr_free_ctx:\n\tudev_unref(udev_ctx);\nerr:\n\tudev_ctx = NULL;\n\treturn LIBUSB_ERROR_OTHER;\n}\n\nint linux_udev_stop_event_monitor(void)\n{\n\tchar dummy = 1;\n\tint r;\n\n\tassert(udev_ctx != NULL);\n\tassert(udev_monitor != NULL);\n\tassert(udev_monitor_fd != -1);\n\n\t/* Write some dummy data to the control pipe and\n\t * wait for the thread to exit */\n\tr = usbi_write(udev_control_pipe[1], &dummy, sizeof(dummy));\n\tif (r <= 0) {\n\t\tusbi_warn(NULL, \"udev control pipe signal failed\");\n\t}\n\tpthread_join(linux_event_thread, NULL);\n\n\t/* Release the udev monitor */\n\tudev_monitor_unref(udev_monitor);\n\tudev_monitor = NULL;\n\tudev_monitor_fd = -1;\n\n\t/* Clean up the udev context */\n\tudev_unref(udev_ctx);\n\tudev_ctx = NULL;\n\n\t/* close and reset control pipe */\n\tclose(udev_control_pipe[0]);\n\tclose(udev_control_pipe[1]);\n\tudev_control_pipe[0] = -1;\n\tudev_control_pipe[1] = -1;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void *linux_udev_event_thread_main(void *arg)\n{\n\tchar dummy;\n\tint r;\n\tstruct udev_device* udev_dev;\n\tstruct pollfd fds[] = {\n\t\t{.fd = udev_control_pipe[0],\n\t\t .events = POLLIN},\n\t\t{.fd = udev_monitor_fd,\n\t\t .events = POLLIN},\n\t};\n\n\tusbi_dbg(\"udev event thread entering.\");\n\n\twhile ((r = poll(fds, 2, -1)) >= 0 || errno == EINTR) {\n\t\tif (r < 0) {\n\t\t\t/* temporary failure */\n\t\t\tcontinue;\n\t\t}\n\t\tif (fds[0].revents & POLLIN) {\n\t\t\t/* activity on control pipe, read the byte and exit */\n\t\t\tr = usbi_read(udev_control_pipe[0], &dummy, sizeof(dummy));\n\t\t\tif (r <= 0) {\n\t\t\t\tusbi_warn(NULL, \"udev control pipe read failed\");\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tif (fds[1].revents & POLLIN) {\n\t\t\tusbi_mutex_static_lock(&linux_hotplug_lock);\n\t\t\tudev_dev = udev_monitor_receive_device(udev_monitor);\n\t\t\tif (udev_dev)\n\t\t\t\tudev_hotplug_event(udev_dev);\n\t\t\tusbi_mutex_static_unlock(&linux_hotplug_lock);\n\t\t}\n\t}\n\n\tusbi_dbg(\"udev event thread exiting\");\n\n\treturn NULL;\n}\n\nstatic int udev_device_info(struct libusb_context *ctx, int detached,\n\t\t\t    struct udev_device *udev_dev, uint8_t *busnum,\n\t\t\t    uint8_t *devaddr, const char **sys_name) {\n\tconst char *dev_node;\n\n\tdev_node = udev_device_get_devnode(udev_dev);\n\tif (!dev_node) {\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\t*sys_name = udev_device_get_sysname(udev_dev);\n\tif (!*sys_name) {\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\treturn linux_get_device_address(ctx, detached, busnum, devaddr,\n\t\t\t\t\tdev_node, *sys_name);\n}\n\nstatic void udev_hotplug_event(struct udev_device* udev_dev)\n{\n\tconst char* udev_action;\n\tconst char* sys_name = NULL;\n\tuint8_t busnum = 0, devaddr = 0;\n\tint detached;\n\tint r;\n\n\tdo {\n\t\tudev_action = udev_device_get_action(udev_dev);\n\t\tif (!udev_action) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdetached = !strncmp(udev_action, \"remove\", 6);\n\n\t\tr = udev_device_info(NULL, detached, udev_dev, &busnum, &devaddr, &sys_name);\n\t\tif (LIBUSB_SUCCESS != r) {\n\t\t\tbreak;\n\t\t}\n\n\t\tusbi_dbg(\"udev hotplug event. action: %s.\", udev_action);\n\n\t\tif (strncmp(udev_action, \"add\", 3) == 0) {\n\t\t\tlinux_hotplug_enumerate(busnum, devaddr, sys_name);\n\t\t} else if (detached) {\n\t\t\tlinux_device_disconnected(busnum, devaddr);\n\t\t} else {\n\t\t\tusbi_err(NULL, \"ignoring udev action %s\", udev_action);\n\t\t}\n\t} while (0);\n\n\tudev_device_unref(udev_dev);\n}\n\nint linux_udev_scan_devices(struct libusb_context *ctx)\n{\n\tstruct udev_enumerate *enumerator;\n\tstruct udev_list_entry *devices, *entry;\n\tstruct udev_device *udev_dev;\n\tconst char *sys_name;\n\tint r;\n\n\tassert(udev_ctx != NULL);\n\n\tenumerator = udev_enumerate_new(udev_ctx);\n\tif (NULL == enumerator) {\n\t\tusbi_err(ctx, \"error creating udev enumerator\");\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\tudev_enumerate_add_match_subsystem(enumerator, \"usb\");\n\tudev_enumerate_add_match_property(enumerator, \"DEVTYPE\", \"usb_device\");\n\tudev_enumerate_scan_devices(enumerator);\n\tdevices = udev_enumerate_get_list_entry(enumerator);\n\n\tudev_list_entry_foreach(entry, devices) {\n\t\tconst char *path = udev_list_entry_get_name(entry);\n\t\tuint8_t busnum = 0, devaddr = 0;\n\n\t\tudev_dev = udev_device_new_from_syspath(udev_ctx, path);\n\n\t\tr = udev_device_info(ctx, 0, udev_dev, &busnum, &devaddr, &sys_name);\n\t\tif (r) {\n\t\t\tudev_device_unref(udev_dev);\n\t\t\tcontinue;\n\t\t}\n\n\t\tlinux_enumerate_device(ctx, busnum, devaddr, sys_name);\n\t\tudev_device_unref(udev_dev);\n\t}\n\n\tudev_enumerate_unref(enumerator);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nvoid linux_udev_hotplug_poll(void)\n{\n\tstruct udev_device* udev_dev;\n\n\tusbi_mutex_static_lock(&linux_hotplug_lock);\n\tdo {\n\t\tudev_dev = udev_monitor_receive_device(udev_monitor);\n\t\tif (udev_dev) {\n\t\t\tusbi_dbg(\"Handling hotplug event from hotplug_poll\");\n\t\t\tudev_hotplug_event(udev_dev);\n\t\t}\n\t} while (udev_dev);\n\tusbi_mutex_static_unlock(&linux_hotplug_lock);\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.c",
    "content": "/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */\n/*\n * Linux usbfs backend for libusb\n * Copyright © 2007-2009 Daniel Drake <dsd@gentoo.org>\n * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\n * Copyright © 2013 Nathan Hjelm <hjelmn@mac.com>\n * Copyright © 2012-2013 Hans de Goede <hdegoede@redhat.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include \"config.h\"\n\n#include <assert.h>\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <poll.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/ioctl.h>\n#include <sys/mman.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/utsname.h>\n#include <time.h>\n\n#include \"libusbi.h\"\n#include \"linux_usbfs.h\"\n\n/* sysfs vs usbfs:\n * opening a usbfs node causes the device to be resumed, so we attempt to\n * avoid this during enumeration.\n *\n * sysfs allows us to read the kernel's in-memory copies of device descriptors\n * and so forth, avoiding the need to open the device:\n *  - The binary \"descriptors\" file contains all config descriptors since\n *    2.6.26, commit 217a9081d8e69026186067711131b77f0ce219ed\n *  - The binary \"descriptors\" file was added in 2.6.23, commit\n *    69d42a78f935d19384d1f6e4f94b65bb162b36df, but it only contains the\n *    active config descriptors\n *  - The \"busnum\" file was added in 2.6.22, commit\n *    83f7d958eab2fbc6b159ee92bf1493924e1d0f72\n *  - The \"devnum\" file has been present since pre-2.6.18\n *  - the \"bConfigurationValue\" file has been present since pre-2.6.18\n *\n * If we have bConfigurationValue, busnum, and devnum, then we can determine\n * the active configuration without having to open the usbfs node in RDWR mode.\n * The busnum file is important as that is the only way we can relate sysfs\n * devices to usbfs nodes.\n *\n * If we also have all descriptors, we can obtain the device descriptor and\n * configuration without touching usbfs at all.\n */\n\n/* endianness for multi-byte fields:\n *\n * Descriptors exposed by usbfs have the multi-byte fields in the device\n * descriptor as host endian. Multi-byte fields in the other descriptors are\n * bus-endian. The kernel documentation says otherwise, but it is wrong.\n *\n * In sysfs all descriptors are bus-endian.\n */\n\nstatic const char *usbfs_path = NULL;\n\n/* use usbdev*.* device names in /dev instead of the usbfs bus directories */\nstatic int usbdev_names = 0;\n\n/* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically\n * allows us to mark URBs as being part of a specific logical transfer when\n * we submit them to the kernel. then, on any error except a cancellation, all\n * URBs within that transfer will be cancelled and no more URBs will be\n * accepted for the transfer, meaning that no more data can creep in.\n *\n * The BULK_CONTINUATION flag must be set on all URBs within a bulk transfer\n * (in either direction) except the first.\n * For IN transfers, we must also set SHORT_NOT_OK on all URBs except the\n * last; it means that the kernel should treat a short reply as an error.\n * For OUT transfers, SHORT_NOT_OK must not be set. it isn't needed (OUT\n * transfers can't be short unless there's already some sort of error), and\n * setting this flag is disallowed (a kernel with USB debugging enabled will\n * reject such URBs).\n */\nstatic int supports_flag_bulk_continuation = -1;\n\n/* Linux 2.6.31 fixes support for the zero length packet URB flag. This\n * allows us to mark URBs that should be followed by a zero length data\n * packet, which can be required by device- or class-specific protocols.\n */\nstatic int supports_flag_zero_packet = -1;\n\n/* clock ID for monotonic clock, as not all clock sources are available on all\n * systems. appropriate choice made at initialization time. */\nstatic clockid_t monotonic_clkid = -1;\n\n/* Linux 2.6.22 (commit 83f7d958eab2fbc6b159ee92bf1493924e1d0f72) adds a busnum\n * to sysfs, so we can relate devices. This also implies that we can read\n * the active configuration through bConfigurationValue */\nstatic int sysfs_can_relate_devices = -1;\n\n/* Linux 2.6.26 (commit 217a9081d8e69026186067711131b77f0ce219ed) adds all\n * config descriptors (rather then just the active config) to the sysfs\n * descriptors file, so from then on we can use them. */\nstatic int sysfs_has_descriptors = -1;\n\n/* how many times have we initted (and not exited) ? */\nstatic int init_count = 0;\n\n/* Serialize hotplug start/stop */\nstatic usbi_mutex_static_t linux_hotplug_startstop_lock = USBI_MUTEX_INITIALIZER;\n/* Serialize scan-devices, event-thread, and poll */\nusbi_mutex_static_t linux_hotplug_lock = USBI_MUTEX_INITIALIZER;\n\nstatic int linux_start_event_monitor(void);\nstatic int linux_stop_event_monitor(void);\nstatic int linux_scan_devices(struct libusb_context *ctx);\nstatic int sysfs_scan_device(struct libusb_context *ctx, const char *devname);\nstatic int detach_kernel_driver_and_claim(struct libusb_device_handle *, int);\n\n#if !defined(USE_UDEV)\nstatic int linux_default_scan_devices (struct libusb_context *ctx);\n#endif\n\nstruct linux_device_priv {\n\tchar *sysfs_dir;\n\tunsigned char *descriptors;\n\tint descriptors_len;\n\tint active_config; /* cache val for !sysfs_can_relate_devices  */\n};\n\nstruct linux_device_handle_priv {\n\tint fd;\n\tint fd_removed;\n\tuint32_t caps;\n};\n\nenum reap_action {\n\tNORMAL = 0,\n\t/* submission failed after the first URB, so await cancellation/completion\n\t * of all the others */\n\tSUBMIT_FAILED,\n\n\t/* cancelled by user or timeout */\n\tCANCELLED,\n\n\t/* completed multi-URB transfer in non-final URB */\n\tCOMPLETED_EARLY,\n\n\t/* one or more urbs encountered a low-level error */\n\tERROR,\n};\n\nstruct linux_transfer_priv {\n\tunion {\n\t\tstruct usbfs_urb *urbs;\n\t\tstruct usbfs_urb **iso_urbs;\n\t};\n\n\tenum reap_action reap_action;\n\tint num_urbs;\n\tint num_retired;\n\tenum libusb_transfer_status reap_status;\n\n\t/* next iso packet in user-supplied transfer to be populated */\n\tint iso_packet_offset;\n};\n\nstatic int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\tchar path[PATH_MAX];\n\tint fd;\n\tint delay = 10000;\n\n\tif (usbdev_names)\n\t\tsnprintf(path, PATH_MAX, \"%s/usbdev%d.%d\",\n\t\t\tusbfs_path, dev->bus_number, dev->device_address);\n\telse\n\t\tsnprintf(path, PATH_MAX, \"%s/%03d/%03d\",\n\t\t\tusbfs_path, dev->bus_number, dev->device_address);\n\n\tfd = open(path, mode);\n\tif (fd != -1)\n\t\treturn fd; /* Success */\n\n\tif (errno == ENOENT) {\n\t\tif (!silent) \n\t\t\tusbi_err(ctx, \"File doesn't exist, wait %d ms and try again\", delay/1000);\n   \n\t\t/* Wait 10ms for USB device path creation.*/\n\t\tnanosleep(&(struct timespec){delay / 1000000, (delay * 1000) % 1000000000UL}, NULL);\n\n\t\tfd = open(path, mode);\n\t\tif (fd != -1)\n\t\t\treturn fd; /* Success */\n\t}\n\t\n\tif (!silent) {\n\t\tusbi_err(ctx, \"libusb couldn't open USB device %s: %s\",\n\t\t\t path, strerror(errno));\n\t\tif (errno == EACCES && mode == O_RDWR)\n\t\t\tusbi_err(ctx, \"libusb requires write access to USB \"\n\t\t\t\t      \"device nodes.\");\n\t}\n\n\tif (errno == EACCES)\n\t\treturn LIBUSB_ERROR_ACCESS;\n\tif (errno == ENOENT)\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\treturn LIBUSB_ERROR_IO;\n}\n\nstatic struct linux_device_priv *_device_priv(struct libusb_device *dev)\n{\n\treturn (struct linux_device_priv *) dev->os_priv;\n}\n\nstatic struct linux_device_handle_priv *_device_handle_priv(\n\tstruct libusb_device_handle *handle)\n{\n\treturn (struct linux_device_handle_priv *) handle->os_priv;\n}\n\n/* check dirent for a /dev/usbdev%d.%d name\n * optionally return bus/device on success */\nstatic int _is_usbdev_entry(struct dirent *entry, int *bus_p, int *dev_p)\n{\n\tint busnum, devnum;\n\n\tif (sscanf(entry->d_name, \"usbdev%d.%d\", &busnum, &devnum) != 2)\n\t\treturn 0;\n\n\tusbi_dbg(\"found: %s\", entry->d_name);\n\tif (bus_p != NULL)\n\t\t*bus_p = busnum;\n\tif (dev_p != NULL)\n\t\t*dev_p = devnum;\n\treturn 1;\n}\n\nstatic int check_usb_vfs(const char *dirname)\n{\n\tDIR *dir;\n\tstruct dirent *entry;\n\tint found = 0;\n\n\tdir = opendir(dirname);\n\tif (!dir)\n\t\treturn 0;\n\n\twhile ((entry = readdir(dir)) != NULL) {\n\t\tif (entry->d_name[0] == '.')\n\t\t\tcontinue;\n\n\t\t/* We assume if we find any files that it must be the right place */\n\t\tfound = 1;\n\t\tbreak;\n\t}\n\n\tclosedir(dir);\n\treturn found;\n}\n\nstatic const char *find_usbfs_path(void)\n{\n\tconst char *path = \"/dev/bus/usb\";\n\tconst char *ret = NULL;\n\n\tif (check_usb_vfs(path)) {\n\t\tret = path;\n\t} else {\n\t\tpath = \"/proc/bus/usb\";\n\t\tif (check_usb_vfs(path))\n\t\t\tret = path;\n\t}\n\n\t/* look for /dev/usbdev*.* if the normal places fail */\n\tif (ret == NULL) {\n\t\tstruct dirent *entry;\n\t\tDIR *dir;\n\n\t\tpath = \"/dev\";\n\t\tdir = opendir(path);\n\t\tif (dir != NULL) {\n\t\t\twhile ((entry = readdir(dir)) != NULL) {\n\t\t\t\tif (_is_usbdev_entry(entry, NULL, NULL)) {\n\t\t\t\t\t/* found one; that's enough */\n\t\t\t\t\tret = path;\n\t\t\t\t\tusbdev_names = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tclosedir(dir);\n\t\t}\n\t}\n\n/* On udev based systems without any usb-devices /dev/bus/usb will not\n * exist. So if we've not found anything and we're using udev for hotplug\n * simply assume /dev/bus/usb rather then making libusb_init fail. */\n#if defined(USE_UDEV)\n\tif (ret == NULL)\n\t\tret = \"/dev/bus/usb\";\n#endif\n\n\tif (ret != NULL)\n\t\tusbi_dbg(\"found usbfs at %s\", ret);\n\n\treturn ret;\n}\n\n/* the monotonic clock is not usable on all systems (e.g. embedded ones often\n * seem to lack it). fall back to REALTIME if we have to. */\nstatic clockid_t find_monotonic_clock(void)\n{\n#ifdef CLOCK_MONOTONIC\n\tstruct timespec ts;\n\tint r;\n\n\t/* Linux 2.6.28 adds CLOCK_MONOTONIC_RAW but we don't use it\n\t * because it's not available through timerfd */\n\tr = clock_gettime(CLOCK_MONOTONIC, &ts);\n\tif (r == 0)\n\t\treturn CLOCK_MONOTONIC;\n\tusbi_dbg(\"monotonic clock doesn't work, errno %d\", errno);\n#endif\n\n\treturn CLOCK_REALTIME;\n}\n\nstatic int kernel_version_ge(int major, int minor, int sublevel)\n{\n\tstruct utsname uts;\n\tint atoms, kmajor, kminor, ksublevel;\n\n\tif (uname(&uts) < 0)\n\t\treturn -1;\n\tatoms = sscanf(uts.release, \"%d.%d.%d\", &kmajor, &kminor, &ksublevel);\n\tif (atoms < 1)\n\t\treturn -1;\n\n\tif (kmajor > major)\n\t\treturn 1;\n\tif (kmajor < major)\n\t\treturn 0;\n\n\t/* kmajor == major */\n\tif (atoms < 2)\n\t\treturn 0 == minor && 0 == sublevel;\n\tif (kminor > minor)\n\t\treturn 1;\n\tif (kminor < minor)\n\t\treturn 0;\n\n\t/* kminor == minor */\n\tif (atoms < 3)\n\t\treturn 0 == sublevel;\n\n\treturn ksublevel >= sublevel;\n}\n\nstatic int op_init(struct libusb_context *ctx)\n{\n\tstruct stat statbuf;\n\tint r;\n\n\tusbfs_path = find_usbfs_path();\n\tif (!usbfs_path) {\n\t\tusbi_err(ctx, \"could not find usbfs\");\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\tif (monotonic_clkid == -1)\n\t\tmonotonic_clkid = find_monotonic_clock();\n\n\tif (supports_flag_bulk_continuation == -1) {\n\t\t/* bulk continuation URB flag available from Linux 2.6.32 */\n\t\tsupports_flag_bulk_continuation = kernel_version_ge(2,6,32);\n\t\tif (supports_flag_bulk_continuation == -1) {\n\t\t\tusbi_err(ctx, \"error checking for bulk continuation support\");\n\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n\n\tif (supports_flag_bulk_continuation)\n\t\tusbi_dbg(\"bulk continuation flag supported\");\n\n\tif (-1 == supports_flag_zero_packet) {\n\t\t/* zero length packet URB flag fixed since Linux 2.6.31 */\n\t\tsupports_flag_zero_packet = kernel_version_ge(2,6,31);\n\t\tif (-1 == supports_flag_zero_packet) {\n\t\t\tusbi_err(ctx, \"error checking for zero length packet support\");\n\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n\n\tif (supports_flag_zero_packet)\n\t\tusbi_dbg(\"zero length packet flag supported\");\n\n\tif (-1 == sysfs_has_descriptors) {\n\t\t/* sysfs descriptors has all descriptors since Linux 2.6.26 */\n\t\tsysfs_has_descriptors = kernel_version_ge(2,6,26);\n\t\tif (-1 == sysfs_has_descriptors) {\n\t\t\tusbi_err(ctx, \"error checking for sysfs descriptors\");\n\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n\n\tif (-1 == sysfs_can_relate_devices) {\n\t\t/* sysfs has busnum since Linux 2.6.22 */\n\t\tsysfs_can_relate_devices = kernel_version_ge(2,6,22);\n\t\tif (-1 == sysfs_can_relate_devices) {\n\t\t\tusbi_err(ctx, \"error checking for sysfs busnum\");\n\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n\n\tif (sysfs_can_relate_devices || sysfs_has_descriptors) {\n\t\tr = stat(SYSFS_DEVICE_PATH, &statbuf);\n\t\tif (r != 0 || !S_ISDIR(statbuf.st_mode)) {\n\t\t\tusbi_warn(ctx, \"sysfs not mounted\");\n\t\t\tsysfs_can_relate_devices = 0;\n\t\t\tsysfs_has_descriptors = 0;\n\t\t}\n\t}\n\n\tif (sysfs_can_relate_devices)\n\t\tusbi_dbg(\"sysfs can relate devices\");\n\n\tif (sysfs_has_descriptors)\n\t\tusbi_dbg(\"sysfs has complete descriptors\");\n\n\tusbi_mutex_static_lock(&linux_hotplug_startstop_lock);\n\tr = LIBUSB_SUCCESS;\n\tif (init_count == 0) {\n\t\t/* start up hotplug event handler */\n\t\tr = linux_start_event_monitor();\n\t}\n\tif (r == LIBUSB_SUCCESS) {\n\t\tr = linux_scan_devices(ctx);\n\t\tif (r == LIBUSB_SUCCESS)\n\t\t\tinit_count++;\n\t\telse if (init_count == 0)\n\t\t\tlinux_stop_event_monitor();\n\t} else\n\t\tusbi_err(ctx, \"error starting hotplug event monitor\");\n\tusbi_mutex_static_unlock(&linux_hotplug_startstop_lock);\n\n\treturn r;\n}\n\nstatic void op_exit(void)\n{\n\tusbi_mutex_static_lock(&linux_hotplug_startstop_lock);\n\tassert(init_count != 0);\n\tif (!--init_count) {\n\t\t/* tear down event handler */\n\t\t(void)linux_stop_event_monitor();\n\t}\n\tusbi_mutex_static_unlock(&linux_hotplug_startstop_lock);\n}\n\nstatic int linux_start_event_monitor(void)\n{\n#if defined(USE_UDEV)\n\treturn linux_udev_start_event_monitor();\n#else\n\treturn linux_netlink_start_event_monitor();\n#endif\n}\n\nstatic int linux_stop_event_monitor(void)\n{\n#if defined(USE_UDEV)\n\treturn linux_udev_stop_event_monitor();\n#else\n\treturn linux_netlink_stop_event_monitor();\n#endif\n}\n\nstatic int linux_scan_devices(struct libusb_context *ctx)\n{\n\tint ret;\n\n\tusbi_mutex_static_lock(&linux_hotplug_lock);\n\n#if defined(USE_UDEV)\n\tret = linux_udev_scan_devices(ctx);\n#else\n\tret = linux_default_scan_devices(ctx);\n#endif\n\n\tusbi_mutex_static_unlock(&linux_hotplug_lock);\n\n\treturn ret;\n}\n\nstatic void op_hotplug_poll(void)\n{\n#if defined(USE_UDEV)\n\tlinux_udev_hotplug_poll();\n#else\n\tlinux_netlink_hotplug_poll();\n#endif\n}\n\nstatic int _open_sysfs_attr(struct libusb_device *dev, const char *attr)\n{\n\tstruct linux_device_priv *priv = _device_priv(dev);\n\tchar filename[PATH_MAX];\n\tint fd;\n\n\tsnprintf(filename, PATH_MAX, \"%s/%s/%s\",\n\t\tSYSFS_DEVICE_PATH, priv->sysfs_dir, attr);\n\tfd = open(filename, O_RDONLY);\n\tif (fd < 0) {\n\t\tusbi_err(DEVICE_CTX(dev),\n\t\t\t\"open %s failed ret=%d errno=%d\", filename, fd, errno);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\treturn fd;\n}\n\n/* Note only suitable for attributes which always read >= 0, < 0 is error */\nstatic int __read_sysfs_attr(struct libusb_context *ctx,\n\tconst char *devname, const char *attr)\n{\n\tchar filename[PATH_MAX];\n\tFILE *f;\n\tint r, value;\n\n\tsnprintf(filename, PATH_MAX, \"%s/%s/%s\", SYSFS_DEVICE_PATH,\n\t\t devname, attr);\n\tf = fopen(filename, \"r\");\n\tif (f == NULL) {\n\t\tif (errno == ENOENT) {\n\t\t\t/* File doesn't exist. Assume the device has been\n\t\t\t   disconnected (see trac ticket #70). */\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t}\n\t\tusbi_err(ctx, \"open %s failed errno=%d\", filename, errno);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tr = fscanf(f, \"%d\", &value);\n\tfclose(f);\n\tif (r != 1) {\n\t\tusbi_err(ctx, \"fscanf %s returned %d, errno=%d\", attr, r, errno);\n\t\treturn LIBUSB_ERROR_NO_DEVICE; /* For unplug race (trac #70) */\n\t}\n\tif (value < 0) {\n\t\tusbi_err(ctx, \"%s contains a negative value\", filename);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\treturn value;\n}\n\nstatic int op_get_device_descriptor(struct libusb_device *dev,\n\tunsigned char *buffer, int *host_endian)\n{\n\tstruct linux_device_priv *priv = _device_priv(dev);\n\n\t*host_endian = sysfs_has_descriptors ? 0 : 1;\n\tmemcpy(buffer, priv->descriptors, DEVICE_DESC_LENGTH);\n\n\treturn 0;\n}\n\n/* read the bConfigurationValue for a device */\nstatic int sysfs_get_active_config(struct libusb_device *dev, int *config)\n{\n\tchar *endptr;\n\tchar tmp[5] = {0, 0, 0, 0, 0};\n\tlong num;\n\tint fd;\n\tssize_t r;\n\n\tfd = _open_sysfs_attr(dev, \"bConfigurationValue\");\n\tif (fd < 0)\n\t\treturn fd;\n\n\tr = read(fd, tmp, sizeof(tmp));\n\tclose(fd);\n\tif (r < 0) {\n\t\tusbi_err(DEVICE_CTX(dev),\n\t\t\t\"read bConfigurationValue failed ret=%d errno=%d\", r, errno);\n\t\treturn LIBUSB_ERROR_IO;\n\t} else if (r == 0) {\n\t\tusbi_dbg(\"device unconfigured\");\n\t\t*config = -1;\n\t\treturn 0;\n\t}\n\n\tif (tmp[sizeof(tmp) - 1] != 0) {\n\t\tusbi_err(DEVICE_CTX(dev), \"not null-terminated?\");\n\t\treturn LIBUSB_ERROR_IO;\n\t} else if (tmp[0] == 0) {\n\t\tusbi_err(DEVICE_CTX(dev), \"no configuration value?\");\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tnum = strtol(tmp, &endptr, 10);\n\tif (endptr == tmp) {\n\t\tusbi_err(DEVICE_CTX(dev), \"error converting '%s' to integer\", tmp);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\t*config = (int) num;\n\treturn 0;\n}\n\nint linux_get_device_address (struct libusb_context *ctx, int detached,\n\tuint8_t *busnum, uint8_t *devaddr,const char *dev_node,\n\tconst char *sys_name)\n{\n\tint sysfs_attr;\n\n\tusbi_dbg(\"getting address for device: %s detached: %d\", sys_name, detached);\n\t/* can't use sysfs to read the bus and device number if the\n\t * device has been detached */\n\tif (!sysfs_can_relate_devices || detached || NULL == sys_name) {\n\t\tif (NULL == dev_node) {\n\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\n\t\t/* will this work with all supported kernel versions? */\n\t\tif (!strncmp(dev_node, \"/dev/bus/usb\", 12)) {\n\t\t\tsscanf (dev_node, \"/dev/bus/usb/%hhu/%hhu\", busnum, devaddr);\n\t\t} else if (!strncmp(dev_node, \"/proc/bus/usb\", 13)) {\n\t\t\tsscanf (dev_node, \"/proc/bus/usb/%hhu/%hhu\", busnum, devaddr);\n\t\t}\n\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\tusbi_dbg(\"scan %s\", sys_name);\n\n\tsysfs_attr = __read_sysfs_attr(ctx, sys_name, \"busnum\");\n\tif (0 > sysfs_attr)\n\t\treturn sysfs_attr;\n\tif (sysfs_attr > 255)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t*busnum = (uint8_t) sysfs_attr;\n\n\tsysfs_attr = __read_sysfs_attr(ctx, sys_name, \"devnum\");\n\tif (0 > sysfs_attr)\n\t\treturn sysfs_attr;\n\tif (sysfs_attr > 255)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\t*devaddr = (uint8_t) sysfs_attr;\n\n\tusbi_dbg(\"bus=%d dev=%d\", *busnum, *devaddr);\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/* Return offset of the next descriptor with the given type */\nstatic int seek_to_next_descriptor(struct libusb_context *ctx,\n\tuint8_t descriptor_type, unsigned char *buffer, int size)\n{\n\tstruct usb_descriptor_header header;\n\tint i;\n\n\tfor (i = 0; size >= 0; i += header.bLength, size -= header.bLength) {\n\t\tif (size == 0)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\t\tif (size < 2) {\n\t\t\tusbi_err(ctx, \"short descriptor read %d/2\", size);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t\tusbi_parse_descriptor(buffer + i, \"bb\", &header, 0);\n\n\t\tif (i && header.bDescriptorType == descriptor_type)\n\t\t\treturn i;\n\t}\n\tusbi_err(ctx, \"bLength overflow by %d bytes\", -size);\n\treturn LIBUSB_ERROR_IO;\n}\n\n/* Return offset to next config */\nstatic int seek_to_next_config(struct libusb_context *ctx,\n\tunsigned char *buffer, int size)\n{\n\tstruct libusb_config_descriptor config;\n\n\tif (size == 0)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tif (size < LIBUSB_DT_CONFIG_SIZE) {\n\t\tusbi_err(ctx, \"short descriptor read %d/%d\",\n\t\t\t size, LIBUSB_DT_CONFIG_SIZE);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tusbi_parse_descriptor(buffer, \"bbwbbbbb\", &config, 0);\n\tif (config.bDescriptorType != LIBUSB_DT_CONFIG) {\n\t\tusbi_err(ctx, \"descriptor is not a config desc (type 0x%02x)\",\n\t\t\t config.bDescriptorType);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\t/*\n\t * In usbfs the config descriptors are config.wTotalLength bytes apart,\n\t * with any short reads from the device appearing as holes in the file.\n\t *\n\t * In sysfs wTotalLength is ignored, instead the kernel returns a\n\t * config descriptor with verified bLength fields, with descriptors\n\t * with an invalid bLength removed.\n\t */\n\tif (sysfs_has_descriptors) {\n\t\tint next = seek_to_next_descriptor(ctx, LIBUSB_DT_CONFIG,\n\t\t\t\t\t\t   buffer, size);\n\t\tif (next == LIBUSB_ERROR_NOT_FOUND)\n\t\t\tnext = size;\n\t\tif (next < 0)\n\t\t\treturn next;\n\n\t\tif (next != config.wTotalLength)\n\t\t\tusbi_warn(ctx, \"config length mismatch wTotalLength \"\n\t\t\t\t  \"%d real %d\", config.wTotalLength, next);\n\t\treturn next;\n\t} else {\n\t\tif (config.wTotalLength < LIBUSB_DT_CONFIG_SIZE) {\n\t\t\tusbi_err(ctx, \"invalid wTotalLength %d\",\n\t\t\t\t config.wTotalLength);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t} else if (config.wTotalLength > size) {\n\t\t\tusbi_warn(ctx, \"short descriptor read %d/%d\",\n\t\t\t\t  size, config.wTotalLength);\n\t\t\treturn size;\n\t\t} else\n\t\t\treturn config.wTotalLength;\n\t}\n}\n\nstatic int op_get_config_descriptor_by_value(struct libusb_device *dev,\n\tuint8_t value, unsigned char **buffer, int *host_endian)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\tstruct linux_device_priv *priv = _device_priv(dev);\n\tunsigned char *descriptors = priv->descriptors;\n\tint size = priv->descriptors_len;\n\tstruct libusb_config_descriptor *config;\n\n\t*buffer = NULL;\n\t/* Unlike the device desc. config descs. are always in raw format */\n\t*host_endian = 0;\n\n\t/* Skip device header */\n\tdescriptors += DEVICE_DESC_LENGTH;\n\tsize -= DEVICE_DESC_LENGTH;\n\n\t/* Seek till the config is found, or till \"EOF\" */\n\twhile (1) {\n\t\tint next = seek_to_next_config(ctx, descriptors, size);\n\t\tif (next < 0)\n\t\t\treturn next;\n\t\tconfig = (struct libusb_config_descriptor *)descriptors;\n\t\tif (config->bConfigurationValue == value) {\n\t\t\t*buffer = descriptors;\n\t\t\treturn next;\n\t\t}\n\t\tsize -= next;\n\t\tdescriptors += next;\n\t}\n}\n\nstatic int op_get_active_config_descriptor(struct libusb_device *dev,\n\tunsigned char *buffer, size_t len, int *host_endian)\n{\n\tint r, config;\n\tunsigned char *config_desc;\n\n\tif (sysfs_can_relate_devices) {\n\t\tr = sysfs_get_active_config(dev, &config);\n\t\tif (r < 0)\n\t\t\treturn r;\n\t} else {\n\t\t/* Use cached bConfigurationValue */\n\t\tstruct linux_device_priv *priv = _device_priv(dev);\n\t\tconfig = priv->active_config;\n\t}\n\tif (config == -1)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tr = op_get_config_descriptor_by_value(dev, config, &config_desc,\n\t\t\t\t\t      host_endian);\n\tif (r < 0)\n\t\treturn r;\n\n\tlen = MIN(len, r);\n\tmemcpy(buffer, config_desc, len);\n\treturn len;\n}\n\nstatic int op_get_config_descriptor(struct libusb_device *dev,\n\tuint8_t config_index, unsigned char *buffer, size_t len, int *host_endian)\n{\n\tstruct linux_device_priv *priv = _device_priv(dev);\n\tunsigned char *descriptors = priv->descriptors;\n\tint i, r, size = priv->descriptors_len;\n\n\t/* Unlike the device desc. config descs. are always in raw format */\n\t*host_endian = 0;\n\n\t/* Skip device header */\n\tdescriptors += DEVICE_DESC_LENGTH;\n\tsize -= DEVICE_DESC_LENGTH;\n\n\t/* Seek till the config is found, or till \"EOF\" */\n\tfor (i = 0; ; i++) {\n\t\tr = seek_to_next_config(DEVICE_CTX(dev), descriptors, size);\n\t\tif (r < 0)\n\t\t\treturn r;\n\t\tif (i == config_index)\n\t\t\tbreak;\n\t\tsize -= r;\n\t\tdescriptors += r;\n\t}\n\n\tlen = MIN(len, r);\n\tmemcpy(buffer, descriptors, len);\n\treturn len;\n}\n\n/* send a control message to retrieve active configuration */\nstatic int usbfs_get_active_config(struct libusb_device *dev, int fd)\n{\n\tstruct linux_device_priv *priv = _device_priv(dev);\n\tunsigned char active_config = 0;\n\tint r;\n\n\tstruct usbfs_ctrltransfer ctrl = {\n\t\t.bmRequestType = LIBUSB_ENDPOINT_IN,\n\t\t.bRequest = LIBUSB_REQUEST_GET_CONFIGURATION,\n\t\t.wValue = 0,\n\t\t.wIndex = 0,\n\t\t.wLength = 1,\n\t\t.timeout = 1000,\n\t\t.data = &active_config\n\t};\n\n\tr = ioctl(fd, IOCTL_USBFS_CONTROL, &ctrl);\n\tif (r < 0) {\n\t\tif (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\t/* we hit this error path frequently with buggy devices :( */\n\t\tusbi_warn(DEVICE_CTX(dev),\n\t\t\t\"get_configuration failed ret=%d errno=%d\", r, errno);\n\t\tpriv->active_config = -1;\n\t} else {\n\t\tif (active_config > 0) {\n\t\t\tpriv->active_config = active_config;\n\t\t} else {\n\t\t\t/* some buggy devices have a configuration 0, but we're\n\t\t\t * reaching into the corner of a corner case here, so let's\n\t\t\t * not support buggy devices in these circumstances.\n\t\t\t * stick to the specs: a configuration value of 0 means\n\t\t\t * unconfigured. */\n\t\t\tusbi_warn(DEVICE_CTX(dev),\n\t\t\t\t\"active cfg 0? assuming unconfigured device\");\n\t\t\tpriv->active_config = -1;\n\t\t}\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int initialize_device(struct libusb_device *dev, uint8_t busnum,\n\tuint8_t devaddr, const char *sysfs_dir)\n{\n\tstruct linux_device_priv *priv = _device_priv(dev);\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\tint descriptors_size = 512; /* Begin with a 1024 byte alloc */\n\tint fd, speed;\n\tssize_t r;\n\n\tdev->bus_number = busnum;\n\tdev->device_address = devaddr;\n\n\tif (sysfs_dir) {\n\t\tpriv->sysfs_dir = strdup(sysfs_dir);\n\t\tif (!priv->sysfs_dir)\n\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\t\t/* Note speed can contain 1.5, in this case __read_sysfs_attr\n\t\t   will stop parsing at the '.' and return 1 */\n\t\tspeed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, \"speed\");\n\t\tif (speed >= 0) {\n\t\t\tswitch (speed) {\n\t\t\tcase     1: dev->speed = LIBUSB_SPEED_LOW; break;\n\t\t\tcase    12: dev->speed = LIBUSB_SPEED_FULL; break;\n\t\t\tcase   480: dev->speed = LIBUSB_SPEED_HIGH; break;\n\t\t\tcase  5000: dev->speed = LIBUSB_SPEED_SUPER; break;\n\t\t\tdefault:\n\t\t\t\tusbi_warn(DEVICE_CTX(dev), \"Unknown device speed: %d Mbps\", speed);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* cache descriptors in memory */\n\tif (sysfs_has_descriptors)\n\t\tfd = _open_sysfs_attr(dev, \"descriptors\");\n\telse\n\t\tfd = _get_usbfs_fd(dev, O_RDONLY, 0);\n\tif (fd < 0)\n\t\treturn fd;\n\n\tdo {\n\t\tdescriptors_size *= 2;\n\t\tpriv->descriptors = usbi_reallocf(priv->descriptors,\n\t\t\t\t\t\t  descriptors_size);\n\t\tif (!priv->descriptors) {\n\t\t\tclose(fd);\n\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\t\t}\n\t\t/* usbfs has holes in the file */\n\t\tif (!sysfs_has_descriptors) {\n\t\t\tmemset(priv->descriptors + priv->descriptors_len,\n\t\t\t       0, descriptors_size - priv->descriptors_len);\n\t\t}\n\t\tr = read(fd, priv->descriptors + priv->descriptors_len,\n\t\t\t descriptors_size - priv->descriptors_len);\n\t\tif (r < 0) {\n\t\t\tusbi_err(ctx, \"read descriptor failed ret=%d errno=%d\",\n\t\t\t\t fd, errno);\n\t\t\tclose(fd);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t\tpriv->descriptors_len += r;\n\t} while (priv->descriptors_len == descriptors_size);\n\n\tclose(fd);\n\n\tif (priv->descriptors_len < DEVICE_DESC_LENGTH) {\n\t\tusbi_err(ctx, \"short descriptor read (%d)\",\n\t\t\t priv->descriptors_len);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tif (sysfs_can_relate_devices)\n\t\treturn LIBUSB_SUCCESS;\n\n\t/* cache active config */\n\tfd = _get_usbfs_fd(dev, O_RDWR, 1);\n\tif (fd < 0) {\n\t\t/* cannot send a control message to determine the active\n\t\t * config. just assume the first one is active. */\n\t\tusbi_warn(ctx, \"Missing rw usbfs access; cannot determine \"\n\t\t\t       \"active configuration descriptor\");\n\t\tif (priv->descriptors_len >=\n\t\t\t\t(DEVICE_DESC_LENGTH + LIBUSB_DT_CONFIG_SIZE)) {\n\t\t\tstruct libusb_config_descriptor config;\n\t\t\tusbi_parse_descriptor(\n\t\t\t\tpriv->descriptors + DEVICE_DESC_LENGTH,\n\t\t\t\t\"bbwbbbbb\", &config, 0);\n\t\t\tpriv->active_config = config.bConfigurationValue;\n\t\t} else\n\t\t\tpriv->active_config = -1; /* No config dt */\n\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\tr = usbfs_get_active_config(dev, fd);\n\tclose(fd);\n\n\treturn r;\n}\n\nstatic int linux_get_parent_info(struct libusb_device *dev, const char *sysfs_dir)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\tstruct libusb_device *it;\n\tchar *parent_sysfs_dir, *tmp;\n\tint ret, add_parent = 1;\n\n\t/* XXX -- can we figure out the topology when using usbfs? */\n\tif (NULL == sysfs_dir || 0 == strncmp(sysfs_dir, \"usb\", 3)) {\n\t\t/* either using usbfs or finding the parent of a root hub */\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\tparent_sysfs_dir = strdup(sysfs_dir);\n\tif (NULL == parent_sysfs_dir) {\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\tif (NULL != (tmp = strrchr(parent_sysfs_dir, '.')) ||\n\t    NULL != (tmp = strrchr(parent_sysfs_dir, '-'))) {\n\t        dev->port_number = atoi(tmp + 1);\n\t\t*tmp = '\\0';\n\t} else {\n\t\tusbi_warn(ctx, \"Can not parse sysfs_dir: %s, no parent info\",\n\t\t\t  parent_sysfs_dir);\n\t\tfree (parent_sysfs_dir);\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\t/* is the parent a root hub? */\n\tif (NULL == strchr(parent_sysfs_dir, '-')) {\n\t\ttmp = parent_sysfs_dir;\n\t\tret = asprintf (&parent_sysfs_dir, \"usb%s\", tmp);\n\t\tfree (tmp);\n\t\tif (0 > ret) {\n\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\t\t}\n\t}\n\nretry:\n\t/* find the parent in the context */\n\tusbi_mutex_lock(&ctx->usb_devs_lock);\n\tlist_for_each_entry(it, &ctx->usb_devs, list, struct libusb_device) {\n\t\tstruct linux_device_priv *priv = _device_priv(it);\n\t\tif (priv->sysfs_dir) {\n\t\t\tif (0 == strcmp (priv->sysfs_dir, parent_sysfs_dir)) {\n\t\t\t\tdev->parent_dev = libusb_ref_device(it);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tusbi_mutex_unlock(&ctx->usb_devs_lock);\n\n\tif (!dev->parent_dev && add_parent) {\n\t\tusbi_dbg(\"parent_dev %s not enumerated yet, enumerating now\",\n\t\t\t parent_sysfs_dir);\n\t\tsysfs_scan_device(ctx, parent_sysfs_dir);\n\t\tadd_parent = 0;\n\t\tgoto retry;\n\t}\n\n\tusbi_dbg(\"Dev %p (%s) has parent %p (%s) port %d\", dev, sysfs_dir,\n\t\t dev->parent_dev, parent_sysfs_dir, dev->port_number);\n\n\tfree (parent_sysfs_dir);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nint linux_enumerate_device(struct libusb_context *ctx,\n\tuint8_t busnum, uint8_t devaddr, const char *sysfs_dir)\n{\n\tunsigned long session_id;\n\tstruct libusb_device *dev;\n\tint r = 0;\n\n\t/* FIXME: session ID is not guaranteed unique as addresses can wrap and\n\t * will be reused. instead we should add a simple sysfs attribute with\n\t * a session ID. */\n\tsession_id = busnum << 8 | devaddr;\n\tusbi_dbg(\"busnum %d devaddr %d session_id %ld\", busnum, devaddr,\n\t\tsession_id);\n\n\tdev = usbi_get_device_by_session_id(ctx, session_id);\n\tif (dev) {\n\t\t/* device already exists in the context */\n\t\tusbi_dbg(\"session_id %ld already exists\", session_id);\n\t\tlibusb_unref_device(dev);\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\tusbi_dbg(\"allocating new device for %d/%d (session %ld)\",\n\t\t busnum, devaddr, session_id);\n\tdev = usbi_alloc_device(ctx, session_id);\n\tif (!dev)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tr = initialize_device(dev, busnum, devaddr, sysfs_dir);\n\tif (r < 0)\n\t\tgoto out;\n\tr = usbi_sanitize_device(dev);\n\tif (r < 0)\n\t\tgoto out;\n\n\tr = linux_get_parent_info(dev, sysfs_dir);\n\tif (r < 0)\n\t\tgoto out;\nout:\n\tif (r < 0)\n\t\tlibusb_unref_device(dev);\n\telse\n\t\tusbi_connect_device(dev);\n\n\treturn r;\n}\n\nvoid linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name)\n{\n\tstruct libusb_context *ctx;\n\n\tusbi_mutex_static_lock(&active_contexts_lock);\n\tlist_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {\n\t\tlinux_enumerate_device(ctx, busnum, devaddr, sys_name);\n\t}\n\tusbi_mutex_static_unlock(&active_contexts_lock);\n}\n\nvoid linux_device_disconnected(uint8_t busnum, uint8_t devaddr)\n{\n\tstruct libusb_context *ctx;\n\tstruct libusb_device *dev;\n\tunsigned long session_id = busnum << 8 | devaddr;\n\n\tusbi_mutex_static_lock(&active_contexts_lock);\n\tlist_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) {\n\t\tdev = usbi_get_device_by_session_id (ctx, session_id);\n\t\tif (NULL != dev) {\n\t\t\tusbi_disconnect_device (dev);\n\t\t\tlibusb_unref_device(dev);\n\t\t} else {\n\t\t\tusbi_dbg(\"device not found for session %x\", session_id);\n\t\t}\n\t}\n\tusbi_mutex_static_unlock(&active_contexts_lock);\n}\n\n#if !defined(USE_UDEV)\n/* open a bus directory and adds all discovered devices to the context */\nstatic int usbfs_scan_busdir(struct libusb_context *ctx, uint8_t busnum)\n{\n\tDIR *dir;\n\tchar dirpath[PATH_MAX];\n\tstruct dirent *entry;\n\tint r = LIBUSB_ERROR_IO;\n\n\tsnprintf(dirpath, PATH_MAX, \"%s/%03d\", usbfs_path, busnum);\n\tusbi_dbg(\"%s\", dirpath);\n\tdir = opendir(dirpath);\n\tif (!dir) {\n\t\tusbi_err(ctx, \"opendir '%s' failed, errno=%d\", dirpath, errno);\n\t\t/* FIXME: should handle valid race conditions like hub unplugged\n\t\t * during directory iteration - this is not an error */\n\t\treturn r;\n\t}\n\n\twhile ((entry = readdir(dir))) {\n\t\tint devaddr;\n\n\t\tif (entry->d_name[0] == '.')\n\t\t\tcontinue;\n\n\t\tdevaddr = atoi(entry->d_name);\n\t\tif (devaddr == 0) {\n\t\t\tusbi_dbg(\"unknown dir entry %s\", entry->d_name);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL)) {\n\t\t\tusbi_dbg(\"failed to enumerate dir entry %s\", entry->d_name);\n\t\t\tcontinue;\n\t\t}\n\n\t\tr = 0;\n\t}\n\n\tclosedir(dir);\n\treturn r;\n}\n\nstatic int usbfs_get_device_list(struct libusb_context *ctx)\n{\n\tstruct dirent *entry;\n\tDIR *buses = opendir(usbfs_path);\n\tint r = 0;\n\n\tif (!buses) {\n\t\tusbi_err(ctx, \"opendir buses failed errno=%d\", errno);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\twhile ((entry = readdir(buses))) {\n\t\tint busnum;\n\n\t\tif (entry->d_name[0] == '.')\n\t\t\tcontinue;\n\n\t\tif (usbdev_names) {\n\t\t\tint devaddr;\n\t\t\tif (!_is_usbdev_entry(entry, &busnum, &devaddr))\n\t\t\t\tcontinue;\n\n\t\t\tr = linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL);\n\t\t\tif (r < 0) {\n\t\t\t\tusbi_dbg(\"failed to enumerate dir entry %s\", entry->d_name);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else {\n\t\t\tbusnum = atoi(entry->d_name);\n\t\t\tif (busnum == 0) {\n\t\t\t\tusbi_dbg(\"unknown dir entry %s\", entry->d_name);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tr = usbfs_scan_busdir(ctx, busnum);\n\t\t\tif (r < 0)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tclosedir(buses);\n\treturn r;\n\n}\n#endif\n\nstatic int sysfs_scan_device(struct libusb_context *ctx, const char *devname)\n{\n\tuint8_t busnum, devaddr;\n\tint ret;\n\n\tret = linux_get_device_address (ctx, 0, &busnum, &devaddr, NULL, devname);\n\tif (LIBUSB_SUCCESS != ret) {\n\t\treturn ret;\n\t}\n\n\treturn linux_enumerate_device(ctx, busnum & 0xff, devaddr & 0xff,\n\t\tdevname);\n}\n\n#if !defined(USE_UDEV)\nstatic int sysfs_get_device_list(struct libusb_context *ctx)\n{\n\tDIR *devices = opendir(SYSFS_DEVICE_PATH);\n\tstruct dirent *entry;\n\tint r = LIBUSB_ERROR_IO;\n\n\tif (!devices) {\n\t\tusbi_err(ctx, \"opendir devices failed errno=%d\", errno);\n\t\treturn r;\n\t}\n\n\twhile ((entry = readdir(devices))) {\n\t\tif ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, \"usb\", 3))\n\t\t\t\t|| strchr(entry->d_name, ':'))\n\t\t\tcontinue;\n\n\t\tif (sysfs_scan_device(ctx, entry->d_name)) {\n\t\t\tusbi_dbg(\"failed to enumerate dir entry %s\", entry->d_name);\n\t\t\tcontinue;\n\t\t}\n\n\t\tr = 0;\n\t}\n\n\tclosedir(devices);\n\treturn r;\n}\n\nstatic int linux_default_scan_devices (struct libusb_context *ctx)\n{\n\t/* we can retrieve device list and descriptors from sysfs or usbfs.\n\t * sysfs is preferable, because if we use usbfs we end up resuming\n\t * any autosuspended USB devices. however, sysfs is not available\n\t * everywhere, so we need a usbfs fallback too.\n\t *\n\t * as described in the \"sysfs vs usbfs\" comment at the top of this\n\t * file, sometimes we have sysfs but not enough information to\n\t * relate sysfs devices to usbfs nodes.  op_init() determines the\n\t * adequacy of sysfs and sets sysfs_can_relate_devices.\n\t */\n\tif (sysfs_can_relate_devices != 0)\n\t\treturn sysfs_get_device_list(ctx);\n\telse\n\t\treturn usbfs_get_device_list(ctx);\n}\n#endif\n\nstatic int op_open(struct libusb_device_handle *handle)\n{\n\tstruct linux_device_handle_priv *hpriv = _device_handle_priv(handle);\n\tint r;\n\n\thpriv->fd = _get_usbfs_fd(handle->dev, O_RDWR, 0);\n\tif (hpriv->fd < 0) {\n\t\tif (hpriv->fd == LIBUSB_ERROR_NO_DEVICE) {\n\t\t\t/* device will still be marked as attached if hotplug monitor thread\n\t\t\t * hasn't processed remove event yet */\n\t\t\tusbi_mutex_static_lock(&linux_hotplug_lock);\n\t\t\tif (handle->dev->attached) {\n\t\t\t\tusbi_dbg(\"open failed with no device, but device still attached\");\n\t\t\t\tlinux_device_disconnected(handle->dev->bus_number,\n\t\t\t\t\t\thandle->dev->device_address);\n\t\t\t}\n\t\t\tusbi_mutex_static_unlock(&linux_hotplug_lock);\n\t\t}\n\t\treturn hpriv->fd;\n\t}\n\n\tr = ioctl(hpriv->fd, IOCTL_USBFS_GET_CAPABILITIES, &hpriv->caps);\n\tif (r < 0) {\n\t\tif (errno == ENOTTY)\n\t\t\tusbi_dbg(\"getcap not available\");\n\t\telse\n\t\t\tusbi_err(HANDLE_CTX(handle), \"getcap failed (%d)\", errno);\n\t\thpriv->caps = 0;\n\t\tif (supports_flag_zero_packet)\n\t\t\thpriv->caps |= USBFS_CAP_ZERO_PACKET;\n\t\tif (supports_flag_bulk_continuation)\n\t\t\thpriv->caps |= USBFS_CAP_BULK_CONTINUATION;\n\t}\n\n\tr = usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT);\n\tif (r < 0)\n\t\tclose(hpriv->fd);\n\n\treturn r;\n}\n\nstatic void op_close(struct libusb_device_handle *dev_handle)\n{\n\tstruct linux_device_handle_priv *hpriv = _device_handle_priv(dev_handle);\n\t/* fd may have already been removed by POLLERR condition in op_handle_events() */\n\tif (!hpriv->fd_removed)\n\t\tusbi_remove_pollfd(HANDLE_CTX(dev_handle), hpriv->fd);\n\tclose(hpriv->fd);\n}\n\nstatic int op_get_configuration(struct libusb_device_handle *handle,\n\tint *config)\n{\n\tint r;\n\n\tif (sysfs_can_relate_devices) {\n\t\tr = sysfs_get_active_config(handle->dev, config);\n\t} else {\n\t\tr = usbfs_get_active_config(handle->dev,\n\t\t\t\t\t    _device_handle_priv(handle)->fd);\n\t\tif (r == LIBUSB_SUCCESS)\n\t\t\t*config = _device_priv(handle->dev)->active_config;\n\t}\n\tif (r < 0)\n\t\treturn r;\n\n\tif (*config == -1) {\n\t\tusbi_err(HANDLE_CTX(handle), \"device unconfigured\");\n\t\t*config = 0;\n\t}\n\n\treturn 0;\n}\n\nstatic int op_set_configuration(struct libusb_device_handle *handle, int config)\n{\n\tstruct linux_device_priv *priv = _device_priv(handle->dev);\n\tint fd = _device_handle_priv(handle)->fd;\n\tint r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config);\n\tif (r) {\n\t\tif (errno == EINVAL)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\telse if (errno == EBUSY)\n\t\t\treturn LIBUSB_ERROR_BUSY;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle), \"failed, error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\t/* update our cached active config descriptor */\n\tpriv->active_config = config;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int claim_interface(struct libusb_device_handle *handle, int iface)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tint r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface);\n\tif (r) {\n\t\tif (errno == ENOENT)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\telse if (errno == EBUSY)\n\t\t\treturn LIBUSB_ERROR_BUSY;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"claim interface failed, error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\treturn 0;\n}\n\nstatic int release_interface(struct libusb_device_handle *handle, int iface)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tint r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface);\n\tif (r) {\n\t\tif (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"release interface failed, error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\treturn 0;\n}\n\nstatic int op_set_interface(struct libusb_device_handle *handle, int iface,\n\tint altsetting)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tstruct usbfs_setinterface setintf;\n\tint r;\n\n\tsetintf.interface = iface;\n\tsetintf.altsetting = altsetting;\n\tr = ioctl(fd, IOCTL_USBFS_SETINTF, &setintf);\n\tif (r) {\n\t\tif (errno == EINVAL)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"setintf failed error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\treturn 0;\n}\n\nstatic int op_clear_halt(struct libusb_device_handle *handle,\n\tunsigned char endpoint)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tunsigned int _endpoint = endpoint;\n\tint r = ioctl(fd, IOCTL_USBFS_CLEAR_HALT, &_endpoint);\n\tif (r) {\n\t\tif (errno == ENOENT)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"clear_halt failed error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\treturn 0;\n}\n\nstatic int op_reset_device(struct libusb_device_handle *handle)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tint i, r, ret = 0;\n\n\t/* Doing a device reset will cause the usbfs driver to get unbound\n\t   from any interfaces it is bound to. By voluntarily unbinding\n\t   the usbfs driver ourself, we stop the kernel from rebinding\n\t   the interface after reset (which would end up with the interface\n\t   getting bound to the in kernel driver if any). */\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif (handle->claimed_interfaces & (1L << i)) {\n\t\t\trelease_interface(handle, i);\n\t\t}\n\t}\n\n\tusbi_mutex_lock(&handle->lock);\n\tr = ioctl(fd, IOCTL_USBFS_RESET, NULL);\n\tif (r) {\n\t\tif (errno == ENODEV) {\n\t\t\tret = LIBUSB_ERROR_NOT_FOUND;\n\t\t\tgoto out;\n\t\t}\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"reset failed error %d errno %d\", r, errno);\n\t\tret = LIBUSB_ERROR_OTHER;\n\t\tgoto out;\n\t}\n\n\t/* And re-claim any interfaces which were claimed before the reset */\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif (handle->claimed_interfaces & (1L << i)) {\n\t\t\t/*\n\t\t\t * A driver may have completed modprobing during\n\t\t\t * IOCTL_USBFS_RESET, and bound itself as soon as\n\t\t\t * IOCTL_USBFS_RESET released the device lock\n\t\t\t */\n\t\t\tr = detach_kernel_driver_and_claim(handle, i);\n\t\t\tif (r) {\n\t\t\t\tusbi_warn(HANDLE_CTX(handle),\n\t\t\t\t\t\"failed to re-claim interface %d after reset: %s\",\n\t\t\t\t\ti, libusb_error_name(r));\n\t\t\t\thandle->claimed_interfaces &= ~(1L << i);\n\t\t\t\tret = LIBUSB_ERROR_NOT_FOUND;\n\t\t\t}\n\t\t}\n\t}\nout:\n\tusbi_mutex_unlock(&handle->lock);\n\treturn ret;\n}\n\nstatic int do_streams_ioctl(struct libusb_device_handle *handle, long req,\n\tuint32_t num_streams, unsigned char *endpoints, int num_endpoints)\n{\n\tint r, fd = _device_handle_priv(handle)->fd;\n\tstruct usbfs_streams *streams;\n\n\tif (num_endpoints > 30) /* Max 15 in + 15 out eps */\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tstreams = malloc(sizeof(struct usbfs_streams) + num_endpoints);\n\tif (!streams)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tstreams->num_streams = num_streams;\n\tstreams->num_eps = num_endpoints;\n\tmemcpy(streams->eps, endpoints, num_endpoints);\n\n\tr = ioctl(fd, req, streams);\n\n\tfree(streams);\n\n\tif (r < 0) {\n\t\tif (errno == ENOTTY)\n\t\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\t\telse if (errno == EINVAL)\n\t\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"streams-ioctl failed error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\treturn r;\n}\n\nstatic int op_alloc_streams(struct libusb_device_handle *handle,\n\tuint32_t num_streams, unsigned char *endpoints, int num_endpoints)\n{\n\treturn do_streams_ioctl(handle, IOCTL_USBFS_ALLOC_STREAMS,\n\t\t\t\tnum_streams, endpoints, num_endpoints);\n}\n\nstatic int op_free_streams(struct libusb_device_handle *handle,\n\t\tunsigned char *endpoints, int num_endpoints)\n{\n\treturn do_streams_ioctl(handle, IOCTL_USBFS_FREE_STREAMS, 0,\n\t\t\t\tendpoints, num_endpoints);\n}\n\nstatic unsigned char *op_dev_mem_alloc(struct libusb_device_handle *handle,\n\tsize_t len)\n{\n\tstruct linux_device_handle_priv *hpriv = _device_handle_priv(handle);\n\tunsigned char *buffer = (unsigned char *)mmap(NULL, len,\n\t\tPROT_READ | PROT_WRITE, MAP_SHARED, hpriv->fd, 0);\n\tif (buffer == MAP_FAILED) {\n\t\tusbi_err(HANDLE_CTX(handle), \"alloc dev mem failed errno %d\",\n\t\t\terrno);\n\t\treturn NULL;\n\t}\n\treturn buffer;\n}\n\nstatic int op_dev_mem_free(struct libusb_device_handle *handle,\n\tunsigned char *buffer, size_t len)\n{\n\tif (munmap(buffer, len) != 0) {\n\t\tusbi_err(HANDLE_CTX(handle), \"free dev mem failed errno %d\",\n\t\t\terrno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t} else {\n\t\treturn LIBUSB_SUCCESS;\n\t}\n}\n\nstatic int op_kernel_driver_active(struct libusb_device_handle *handle,\n\tint interface)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tstruct usbfs_getdriver getdrv;\n\tint r;\n\n\tgetdrv.interface = interface;\n\tr = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv);\n\tif (r) {\n\t\tif (errno == ENODATA)\n\t\t\treturn 0;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"get driver failed error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\treturn (strcmp(getdrv.driver, \"usbfs\") == 0) ? 0 : 1;\n}\n\nstatic int op_detach_kernel_driver(struct libusb_device_handle *handle,\n\tint interface)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tstruct usbfs_ioctl command;\n\tstruct usbfs_getdriver getdrv;\n\tint r;\n\n\tcommand.ifno = interface;\n\tcommand.ioctl_code = IOCTL_USBFS_DISCONNECT;\n\tcommand.data = NULL;\n\n\tgetdrv.interface = interface;\n\tr = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv);\n\tif (r == 0 && strcmp(getdrv.driver, \"usbfs\") == 0)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tr = ioctl(fd, IOCTL_USBFS_IOCTL, &command);\n\tif (r) {\n\t\tif (errno == ENODATA)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\telse if (errno == EINVAL)\n\t\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"detach failed error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\treturn 0;\n}\n\nstatic int op_attach_kernel_driver(struct libusb_device_handle *handle,\n\tint interface)\n{\n\tint fd = _device_handle_priv(handle)->fd;\n\tstruct usbfs_ioctl command;\n\tint r;\n\n\tcommand.ifno = interface;\n\tcommand.ioctl_code = IOCTL_USBFS_CONNECT;\n\tcommand.data = NULL;\n\n\tr = ioctl(fd, IOCTL_USBFS_IOCTL, &command);\n\tif (r < 0) {\n\t\tif (errno == ENODATA)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\telse if (errno == EINVAL)\n\t\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t\telse if (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\telse if (errno == EBUSY)\n\t\t\treturn LIBUSB_ERROR_BUSY;\n\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"attach failed error %d errno %d\", r, errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t} else if (r == 0) {\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\treturn 0;\n}\n\nstatic int detach_kernel_driver_and_claim(struct libusb_device_handle *handle,\n\tint interface)\n{\n\tstruct usbfs_disconnect_claim dc;\n\tint r, fd = _device_handle_priv(handle)->fd;\n\n\tdc.interface = interface;\n\tstrcpy(dc.driver, \"usbfs\");\n\tdc.flags = USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER;\n\tr = ioctl(fd, IOCTL_USBFS_DISCONNECT_CLAIM, &dc);\n\tif (r == 0 || (r != 0 && errno != ENOTTY)) {\n\t\tif (r == 0)\n\t\t\treturn 0;\n\n\t\tswitch (errno) {\n\t\tcase EBUSY:\n\t\t\treturn LIBUSB_ERROR_BUSY;\n\t\tcase EINVAL:\n\t\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t\tcase ENODEV:\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t}\n\t\tusbi_err(HANDLE_CTX(handle),\n\t\t\t\"disconnect-and-claim failed errno %d\", errno);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\t/* Fallback code for kernels which don't support the\n\t   disconnect-and-claim ioctl */\n\tr = op_detach_kernel_driver(handle, interface);\n\tif (r != 0 && r != LIBUSB_ERROR_NOT_FOUND)\n\t\treturn r;\n\n\treturn claim_interface(handle, interface);\n}\n\nstatic int op_claim_interface(struct libusb_device_handle *handle, int iface)\n{\n\tif (handle->auto_detach_kernel_driver)\n\t\treturn detach_kernel_driver_and_claim(handle, iface);\n\telse\n\t\treturn claim_interface(handle, iface);\n}\n\nstatic int op_release_interface(struct libusb_device_handle *handle, int iface)\n{\n\tint r;\n\n\tr = release_interface(handle, iface);\n\tif (r)\n\t\treturn r;\n\n\tif (handle->auto_detach_kernel_driver)\n\t\top_attach_kernel_driver(handle, iface);\n\n\treturn 0;\n}\n\nstatic void op_destroy_device(struct libusb_device *dev)\n{\n\tstruct linux_device_priv *priv = _device_priv(dev);\n\tif (priv->descriptors)\n\t\tfree(priv->descriptors);\n\tif (priv->sysfs_dir)\n\t\tfree(priv->sysfs_dir);\n}\n\n/* URBs are discarded in reverse order of submission to avoid races. */\nstatic int discard_urbs(struct usbi_transfer *itransfer, int first, int last_plus_one)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct linux_transfer_priv *tpriv =\n\t\tusbi_transfer_get_os_priv(itransfer);\n\tstruct linux_device_handle_priv *dpriv =\n\t\t_device_handle_priv(transfer->dev_handle);\n\tint i, ret = 0;\n\tstruct usbfs_urb *urb;\n\n\tfor (i = last_plus_one - 1; i >= first; i--) {\n\t\tif (LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type)\n\t\t\turb = tpriv->iso_urbs[i];\n\t\telse\n\t\t\turb = &tpriv->urbs[i];\n\n\t\tif (0 == ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, urb))\n\t\t\tcontinue;\n\n\t\tif (EINVAL == errno) {\n\t\t\tusbi_dbg(\"URB not found --> assuming ready to be reaped\");\n\t\t\tif (i == (last_plus_one - 1))\n\t\t\t\tret = LIBUSB_ERROR_NOT_FOUND;\n\t\t} else if (ENODEV == errno) {\n\t\t\tusbi_dbg(\"Device not found for URB --> assuming ready to be reaped\");\n\t\t\tret = LIBUSB_ERROR_NO_DEVICE;\n\t\t} else {\n\t\t\tusbi_warn(TRANSFER_CTX(transfer),\n\t\t\t\t\"unrecognised discard errno %d\", errno);\n\t\t\tret = LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n\treturn ret;\n}\n\nstatic void free_iso_urbs(struct linux_transfer_priv *tpriv)\n{\n\tint i;\n\tfor (i = 0; i < tpriv->num_urbs; i++) {\n\t\tstruct usbfs_urb *urb = tpriv->iso_urbs[i];\n\t\tif (!urb)\n\t\t\tbreak;\n\t\tfree(urb);\n\t}\n\n\tfree(tpriv->iso_urbs);\n\ttpriv->iso_urbs = NULL;\n}\n\nstatic int submit_bulk_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\tstruct linux_device_handle_priv *dpriv =\n\t\t_device_handle_priv(transfer->dev_handle);\n\tstruct usbfs_urb *urbs;\n\tint is_out = (transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK)\n\t\t== LIBUSB_ENDPOINT_OUT;\n\tint bulk_buffer_len, use_bulk_continuation;\n\tint r;\n\tint i;\n\n\tif (is_out && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) &&\n\t\t\t!(dpriv->caps & USBFS_CAP_ZERO_PACKET))\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\n\t/*\n\t * Older versions of usbfs place a 16kb limit on bulk URBs. We work\n\t * around this by splitting large transfers into 16k blocks, and then\n\t * submit all urbs at once. it would be simpler to submit one urb at\n\t * a time, but there is a big performance gain doing it this way.\n\t *\n\t * Newer versions lift the 16k limit (USBFS_CAP_NO_PACKET_SIZE_LIM),\n\t * using arbritary large transfers can still be a bad idea though, as\n\t * the kernel needs to allocate physical contiguous memory for this,\n\t * which may fail for large buffers.\n\t *\n\t * The kernel solves this problem by splitting the transfer into\n\t * blocks itself when the host-controller is scatter-gather capable\n\t * (USBFS_CAP_BULK_SCATTER_GATHER), which most controllers are.\n\t *\n\t * Last, there is the issue of short-transfers when splitting, for\n\t * short split-transfers to work reliable USBFS_CAP_BULK_CONTINUATION\n\t * is needed, but this is not always available.\n\t */\n\tif (dpriv->caps & USBFS_CAP_BULK_SCATTER_GATHER) {\n\t\t/* Good! Just submit everything in one go */\n\t\tbulk_buffer_len = transfer->length ? transfer->length : 1;\n\t\tuse_bulk_continuation = 0;\n\t} else if (dpriv->caps & USBFS_CAP_BULK_CONTINUATION) {\n\t\t/* Split the transfers and use bulk-continuation to\n\t\t   avoid issues with short-transfers */\n\t\tbulk_buffer_len = MAX_BULK_BUFFER_LENGTH;\n\t\tuse_bulk_continuation = 1;\n\t} else if (dpriv->caps & USBFS_CAP_NO_PACKET_SIZE_LIM) {\n\t\t/* Don't split, assume the kernel can alloc the buffer\n\t\t   (otherwise the submit will fail with -ENOMEM) */\n\t\tbulk_buffer_len = transfer->length ? transfer->length : 1;\n\t\tuse_bulk_continuation = 0;\n\t} else {\n\t\t/* Bad, splitting without bulk-continuation, short transfers\n\t\t   which end before the last urb will not work reliable! */\n\t\t/* Note we don't warn here as this is \"normal\" on kernels <\n\t\t   2.6.32 and not a problem for most applications */\n\t\tbulk_buffer_len = MAX_BULK_BUFFER_LENGTH;\n\t\tuse_bulk_continuation = 0;\n\t}\n\n\tint num_urbs = transfer->length / bulk_buffer_len;\n\tint last_urb_partial = 0;\n\n\tif (transfer->length == 0) {\n\t\tnum_urbs = 1;\n\t} else if ((transfer->length % bulk_buffer_len) > 0) {\n\t\tlast_urb_partial = 1;\n\t\tnum_urbs++;\n\t}\n\tusbi_dbg(\"need %d urbs for new transfer with length %d\", num_urbs,\n\t\ttransfer->length);\n\turbs = calloc(num_urbs, sizeof(struct usbfs_urb));\n\tif (!urbs)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\ttpriv->urbs = urbs;\n\ttpriv->num_urbs = num_urbs;\n\ttpriv->num_retired = 0;\n\ttpriv->reap_action = NORMAL;\n\ttpriv->reap_status = LIBUSB_TRANSFER_COMPLETED;\n\n\tfor (i = 0; i < num_urbs; i++) {\n\t\tstruct usbfs_urb *urb = &urbs[i];\n\t\turb->usercontext = itransfer;\n\t\tswitch (transfer->type) {\n\t\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\t\t\turb->type = USBFS_URB_TYPE_BULK;\n\t\t\turb->stream_id = 0;\n\t\t\tbreak;\n\t\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\t\turb->type = USBFS_URB_TYPE_BULK;\n\t\t\turb->stream_id = itransfer->stream_id;\n\t\t\tbreak;\n\t\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\t\turb->type = USBFS_URB_TYPE_INTERRUPT;\n\t\t\tbreak;\n\t\t}\n\t\turb->endpoint = transfer->endpoint;\n\t\turb->buffer = transfer->buffer + (i * bulk_buffer_len);\n\t\t/* don't set the short not ok flag for the last URB */\n\t\tif (use_bulk_continuation && !is_out && (i < num_urbs - 1))\n\t\t\turb->flags = USBFS_URB_SHORT_NOT_OK;\n\t\tif (i == num_urbs - 1 && last_urb_partial)\n\t\t\turb->buffer_length = transfer->length % bulk_buffer_len;\n\t\telse if (transfer->length == 0)\n\t\t\turb->buffer_length = 0;\n\t\telse\n\t\t\turb->buffer_length = bulk_buffer_len;\n\n\t\tif (i > 0 && use_bulk_continuation)\n\t\t\turb->flags |= USBFS_URB_BULK_CONTINUATION;\n\n\t\t/* we have already checked that the flag is supported */\n\t\tif (is_out && i == num_urbs - 1 &&\n\t\t    transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)\n\t\t\turb->flags |= USBFS_URB_ZERO_PACKET;\n\n\t\tr = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb);\n\t\tif (r < 0) {\n\t\t\tif (errno == ENODEV) {\n\t\t\t\tr = LIBUSB_ERROR_NO_DEVICE;\n\t\t\t} else {\n\t\t\t\tusbi_err(TRANSFER_CTX(transfer),\n\t\t\t\t\t\"submiturb failed error %d errno=%d\", r, errno);\n\t\t\t\tr = LIBUSB_ERROR_IO;\n\t\t\t}\n\n\t\t\t/* if the first URB submission fails, we can simply free up and\n\t\t\t * return failure immediately. */\n\t\t\tif (i == 0) {\n\t\t\t\tusbi_dbg(\"first URB failed, easy peasy\");\n\t\t\t\tfree(urbs);\n\t\t\t\ttpriv->urbs = NULL;\n\t\t\t\treturn r;\n\t\t\t}\n\n\t\t\t/* if it's not the first URB that failed, the situation is a bit\n\t\t\t * tricky. we may need to discard all previous URBs. there are\n\t\t\t * complications:\n\t\t\t *  - discarding is asynchronous - discarded urbs will be reaped\n\t\t\t *    later. the user must not have freed the transfer when the\n\t\t\t *    discarded URBs are reaped, otherwise libusb will be using\n\t\t\t *    freed memory.\n\t\t\t *  - the earlier URBs may have completed successfully and we do\n\t\t\t *    not want to throw away any data.\n\t\t\t *  - this URB failing may be no error; EREMOTEIO means that\n\t\t\t *    this transfer simply didn't need all the URBs we submitted\n\t\t\t * so, we report that the transfer was submitted successfully and\n\t\t\t * in case of error we discard all previous URBs. later when\n\t\t\t * the final reap completes we can report error to the user,\n\t\t\t * or success if an earlier URB was completed successfully.\n\t\t\t */\n\t\t\ttpriv->reap_action = EREMOTEIO == errno ? COMPLETED_EARLY : SUBMIT_FAILED;\n\n\t\t\t/* The URBs we haven't submitted yet we count as already\n\t\t\t * retired. */\n\t\t\ttpriv->num_retired += num_urbs - i;\n\n\t\t\t/* If we completed short then don't try to discard. */\n\t\t\tif (COMPLETED_EARLY == tpriv->reap_action)\n\t\t\t\treturn 0;\n\n\t\t\tdiscard_urbs(itransfer, 0, i);\n\n\t\t\tusbi_dbg(\"reporting successful submission but waiting for %d \"\n\t\t\t\t\"discards before reporting error\", i);\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nstatic int submit_iso_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\tstruct linux_device_handle_priv *dpriv =\n\t\t_device_handle_priv(transfer->dev_handle);\n\tstruct usbfs_urb **urbs;\n\tsize_t alloc_size;\n\tint num_packets = transfer->num_iso_packets;\n\tint i;\n\tint this_urb_len = 0;\n\tint num_urbs = 1;\n\tint packet_offset = 0;\n\tunsigned int packet_len;\n\tunsigned char *urb_buffer = transfer->buffer;\n\n\t/* usbfs places arbitrary limits on iso URBs. this limit has changed\n\t * at least three times, and it's difficult to accurately detect which\n\t * limit this running kernel might impose. so we attempt to submit\n\t * whatever the user has provided. if the kernel rejects the request\n\t * due to its size, we return an error indicating such to the user.\n\t */\n\n\t/* calculate how many URBs we need */\n\tfor (i = 0; i < num_packets; i++) {\n\t\tunsigned int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len;\n\t\tpacket_len = transfer->iso_packet_desc[i].length;\n\n\t\tif (packet_len > space_remaining) {\n\t\t\tnum_urbs++;\n\t\t\tthis_urb_len = packet_len;\n\t\t\t/* check that we can actually support this packet length */\n\t\t\tif (this_urb_len > MAX_ISO_BUFFER_LENGTH)\n\t\t\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t\t} else {\n\t\t\tthis_urb_len += packet_len;\n\t\t}\n\t}\n\tusbi_dbg(\"need %d %dk URBs for transfer\", num_urbs, MAX_ISO_BUFFER_LENGTH / 1024);\n\n\turbs = calloc(num_urbs, sizeof(*urbs));\n\tif (!urbs)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\ttpriv->iso_urbs = urbs;\n\ttpriv->num_urbs = num_urbs;\n\ttpriv->num_retired = 0;\n\ttpriv->reap_action = NORMAL;\n\ttpriv->iso_packet_offset = 0;\n\n\t/* allocate + initialize each URB with the correct number of packets */\n\tfor (i = 0; i < num_urbs; i++) {\n\t\tstruct usbfs_urb *urb;\n\t\tunsigned int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH;\n\t\tint urb_packet_offset = 0;\n\t\tunsigned char *urb_buffer_orig = urb_buffer;\n\t\tint j;\n\t\tint k;\n\n\t\t/* swallow up all the packets we can fit into this URB */\n\t\twhile (packet_offset < transfer->num_iso_packets) {\n\t\t\tpacket_len = transfer->iso_packet_desc[packet_offset].length;\n\t\t\tif (packet_len <= space_remaining_in_urb) {\n\t\t\t\t/* throw it in */\n\t\t\t\turb_packet_offset++;\n\t\t\t\tpacket_offset++;\n\t\t\t\tspace_remaining_in_urb -= packet_len;\n\t\t\t\turb_buffer += packet_len;\n\t\t\t} else {\n\t\t\t\t/* it can't fit, save it for the next URB */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\talloc_size = sizeof(*urb)\n\t\t\t+ (urb_packet_offset * sizeof(struct usbfs_iso_packet_desc));\n\t\turb = calloc(1, alloc_size);\n\t\tif (!urb) {\n\t\t\tfree_iso_urbs(tpriv);\n\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\t\t}\n\t\turbs[i] = urb;\n\n\t\t/* populate packet lengths */\n\t\tfor (j = 0, k = packet_offset - urb_packet_offset;\n\t\t\t\tk < packet_offset; k++, j++) {\n\t\t\tpacket_len = transfer->iso_packet_desc[k].length;\n\t\t\turb->iso_frame_desc[j].length = packet_len;\n\t\t}\n\n\t\turb->usercontext = itransfer;\n\t\turb->type = USBFS_URB_TYPE_ISO;\n\t\t/* FIXME: interface for non-ASAP data? */\n\t\turb->flags = USBFS_URB_ISO_ASAP;\n\t\turb->endpoint = transfer->endpoint;\n\t\turb->number_of_packets = urb_packet_offset;\n\t\turb->buffer = urb_buffer_orig;\n\t}\n\n\t/* submit URBs */\n\tfor (i = 0; i < num_urbs; i++) {\n\t\tint r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urbs[i]);\n\t\tif (r < 0) {\n\t\t\tif (errno == ENODEV) {\n\t\t\t\tr = LIBUSB_ERROR_NO_DEVICE;\n\t\t\t} else if (errno == EINVAL) {\n\t\t\t\tusbi_warn(TRANSFER_CTX(transfer),\n\t\t\t\t\t\"submiturb failed, transfer too large\");\n\t\t\t\tr = LIBUSB_ERROR_INVALID_PARAM;\n\t\t\t} else {\n\t\t\t\tusbi_err(TRANSFER_CTX(transfer),\n\t\t\t\t\t\"submiturb failed error %d errno=%d\", r, errno);\n\t\t\t\tr = LIBUSB_ERROR_IO;\n\t\t\t}\n\n\t\t\t/* if the first URB submission fails, we can simply free up and\n\t\t\t * return failure immediately. */\n\t\t\tif (i == 0) {\n\t\t\t\tusbi_dbg(\"first URB failed, easy peasy\");\n\t\t\t\tfree_iso_urbs(tpriv);\n\t\t\t\treturn r;\n\t\t\t}\n\n\t\t\t/* if it's not the first URB that failed, the situation is a bit\n\t\t\t * tricky. we must discard all previous URBs. there are\n\t\t\t * complications:\n\t\t\t *  - discarding is asynchronous - discarded urbs will be reaped\n\t\t\t *    later. the user must not have freed the transfer when the\n\t\t\t *    discarded URBs are reaped, otherwise libusb will be using\n\t\t\t *    freed memory.\n\t\t\t *  - the earlier URBs may have completed successfully and we do\n\t\t\t *    not want to throw away any data.\n\t\t\t * so, in this case we discard all the previous URBs BUT we report\n\t\t\t * that the transfer was submitted successfully. then later when\n\t\t\t * the final discard completes we can report error to the user.\n\t\t\t */\n\t\t\ttpriv->reap_action = SUBMIT_FAILED;\n\n\t\t\t/* The URBs we haven't submitted yet we count as already\n\t\t\t * retired. */\n\t\t\ttpriv->num_retired = num_urbs - i;\n\t\t\tdiscard_urbs(itransfer, 0, i);\n\n\t\t\tusbi_dbg(\"reporting successful submission but waiting for %d \"\n\t\t\t\t\"discards before reporting error\", i);\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nstatic int submit_control_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct linux_device_handle_priv *dpriv =\n\t\t_device_handle_priv(transfer->dev_handle);\n\tstruct usbfs_urb *urb;\n\tint r;\n\n\tif (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGTH)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\turb = calloc(1, sizeof(struct usbfs_urb));\n\tif (!urb)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\ttpriv->urbs = urb;\n\ttpriv->num_urbs = 1;\n\ttpriv->reap_action = NORMAL;\n\n\turb->usercontext = itransfer;\n\turb->type = USBFS_URB_TYPE_CONTROL;\n\turb->endpoint = transfer->endpoint;\n\turb->buffer = transfer->buffer;\n\turb->buffer_length = transfer->length;\n\n\tr = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb);\n\tif (r < 0) {\n\t\tfree(urb);\n\t\ttpriv->urbs = NULL;\n\t\tif (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(TRANSFER_CTX(transfer),\n\t\t\t\"submiturb failed error %d errno=%d\", r, errno);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\treturn 0;\n}\n\nstatic int op_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\treturn submit_control_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\treturn submit_bulk_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\treturn submit_bulk_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\treturn submit_iso_transfer(itransfer);\n\tdefault:\n\t\tusbi_err(TRANSFER_CTX(transfer),\n\t\t\t\"unknown endpoint type %d\", transfer->type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nstatic int op_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tint r;\n\n\tif (!tpriv->urbs)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tr = discard_urbs(itransfer, 0, tpriv->num_urbs);\n\tif (r != 0)\n\t\treturn r;\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\tif (tpriv->reap_action == ERROR)\n\t\t\tbreak;\n\t\t/* else, fall through */\n\tdefault:\n\t\ttpriv->reap_action = CANCELLED;\n\t}\n\n\treturn 0;\n}\n\nstatic void op_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\n\t/* urbs can be freed also in submit_transfer so lock mutex first */\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\tif (tpriv->urbs) {\n\t\t\tfree(tpriv->urbs);\n\t\t\ttpriv->urbs = NULL;\n\t\t}\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\tif (tpriv->iso_urbs) {\n\t\t\tfree_iso_urbs(tpriv);\n\t\t\ttpriv->iso_urbs = NULL;\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tusbi_err(TRANSFER_CTX(transfer),\n\t\t\t\"unknown endpoint type %d\", transfer->type);\n\t}\n}\n\nstatic int handle_bulk_completion(struct usbi_transfer *itransfer,\n\tstruct usbfs_urb *urb)\n{\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tint urb_idx = urb - tpriv->urbs;\n\n\tusbi_mutex_lock(&itransfer->lock);\n\tusbi_dbg(\"handling completion status %d of bulk urb %d/%d\", urb->status,\n\t\turb_idx + 1, tpriv->num_urbs);\n\n\ttpriv->num_retired++;\n\n\tif (tpriv->reap_action != NORMAL) {\n\t\t/* cancelled, submit_fail, or completed early */\n\t\tusbi_dbg(\"abnormal reap: urb status %d\", urb->status);\n\n\t\t/* even though we're in the process of cancelling, it's possible that\n\t\t * we may receive some data in these URBs that we don't want to lose.\n\t\t * examples:\n\t\t * 1. while the kernel is cancelling all the packets that make up an\n\t\t *    URB, a few of them might complete. so we get back a successful\n\t\t *    cancellation *and* some data.\n\t\t * 2. we receive a short URB which marks the early completion condition,\n\t\t *    so we start cancelling the remaining URBs. however, we're too\n\t\t *    slow and another URB completes (or at least completes partially).\n\t\t *    (this can't happen since we always use BULK_CONTINUATION.)\n\t\t *\n\t\t * When this happens, our objectives are not to lose any \"surplus\" data,\n\t\t * and also to stick it at the end of the previously-received data\n\t\t * (closing any holes), so that libusb reports the total amount of\n\t\t * transferred data and presents it in a contiguous chunk.\n\t\t */\n\t\tif (urb->actual_length > 0) {\n\t\t\tunsigned char *target = transfer->buffer + itransfer->transferred;\n\t\t\tusbi_dbg(\"received %d bytes of surplus data\", urb->actual_length);\n\t\t\tif (urb->buffer != target) {\n\t\t\t\tusbi_dbg(\"moving surplus data from offset %d to offset %d\",\n\t\t\t\t\t(unsigned char *) urb->buffer - transfer->buffer,\n\t\t\t\t\ttarget - transfer->buffer);\n\t\t\t\tmemmove(target, urb->buffer, urb->actual_length);\n\t\t\t}\n\t\t\titransfer->transferred += urb->actual_length;\n\t\t}\n\n\t\tif (tpriv->num_retired == tpriv->num_urbs) {\n\t\t\tusbi_dbg(\"abnormal reap: last URB handled, reporting\");\n\t\t\tif (tpriv->reap_action != COMPLETED_EARLY &&\n\t\t\t    tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED)\n\t\t\t\ttpriv->reap_status = LIBUSB_TRANSFER_ERROR;\n\t\t\tgoto completed;\n\t\t}\n\t\tgoto out_unlock;\n\t}\n\n\titransfer->transferred += urb->actual_length;\n\n\t/* Many of these errors can occur on *any* urb of a multi-urb\n\t * transfer.  When they do, we tear down the rest of the transfer.\n\t */\n\tswitch (urb->status) {\n\tcase 0:\n\t\tbreak;\n\tcase -EREMOTEIO: /* short transfer */\n\t\tbreak;\n\tcase -ENOENT: /* cancelled */\n\tcase -ECONNRESET:\n\t\tbreak;\n\tcase -ENODEV:\n\tcase -ESHUTDOWN:\n\t\tusbi_dbg(\"device removed\");\n\t\ttpriv->reap_status = LIBUSB_TRANSFER_NO_DEVICE;\n\t\tgoto cancel_remaining;\n\tcase -EPIPE:\n\t\tusbi_dbg(\"detected endpoint stall\");\n\t\tif (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED)\n\t\t\ttpriv->reap_status = LIBUSB_TRANSFER_STALL;\n\t\tgoto cancel_remaining;\n\tcase -EOVERFLOW:\n\t\t/* overflow can only ever occur in the last urb */\n\t\tusbi_dbg(\"overflow, actual_length=%d\", urb->actual_length);\n\t\tif (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED)\n\t\t\ttpriv->reap_status = LIBUSB_TRANSFER_OVERFLOW;\n\t\tgoto completed;\n\tcase -ETIME:\n\tcase -EPROTO:\n\tcase -EILSEQ:\n\tcase -ECOMM:\n\tcase -ENOSR:\n\t\tusbi_dbg(\"low level error %d\", urb->status);\n\t\ttpriv->reap_action = ERROR;\n\t\tgoto cancel_remaining;\n\tdefault:\n\t\tusbi_warn(ITRANSFER_CTX(itransfer),\n\t\t\t\"unrecognised urb status %d\", urb->status);\n\t\ttpriv->reap_action = ERROR;\n\t\tgoto cancel_remaining;\n\t}\n\n\t/* if we're the last urb or we got less data than requested then we're\n\t * done */\n\tif (urb_idx == tpriv->num_urbs - 1) {\n\t\tusbi_dbg(\"last URB in transfer --> complete!\");\n\t\tgoto completed;\n\t} else if (urb->actual_length < urb->buffer_length) {\n\t\tusbi_dbg(\"short transfer %d/%d --> complete!\",\n\t\t\turb->actual_length, urb->buffer_length);\n\t\tif (tpriv->reap_action == NORMAL)\n\t\t\ttpriv->reap_action = COMPLETED_EARLY;\n\t} else\n\t\tgoto out_unlock;\n\ncancel_remaining:\n\tif (ERROR == tpriv->reap_action && LIBUSB_TRANSFER_COMPLETED == tpriv->reap_status)\n\t\ttpriv->reap_status = LIBUSB_TRANSFER_ERROR;\n\n\tif (tpriv->num_retired == tpriv->num_urbs) /* nothing to cancel */\n\t\tgoto completed;\n\n\t/* cancel remaining urbs and wait for their completion before\n\t * reporting results */\n\tdiscard_urbs(itransfer, urb_idx + 1, tpriv->num_urbs);\n\nout_unlock:\n\tusbi_mutex_unlock(&itransfer->lock);\n\treturn 0;\n\ncompleted:\n\tfree(tpriv->urbs);\n\ttpriv->urbs = NULL;\n\tusbi_mutex_unlock(&itransfer->lock);\n\treturn CANCELLED == tpriv->reap_action ?\n\t\tusbi_handle_transfer_cancellation(itransfer) :\n\t\tusbi_handle_transfer_completion(itransfer, tpriv->reap_status);\n}\n\nstatic int handle_iso_completion(struct usbi_transfer *itransfer,\n\tstruct usbfs_urb *urb)\n{\n\tstruct libusb_transfer *transfer =\n\t\tUSBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\tint num_urbs = tpriv->num_urbs;\n\tint urb_idx = 0;\n\tint i;\n\tenum libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED;\n\n\tusbi_mutex_lock(&itransfer->lock);\n\tfor (i = 0; i < num_urbs; i++) {\n\t\tif (urb == tpriv->iso_urbs[i]) {\n\t\t\turb_idx = i + 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (urb_idx == 0) {\n\t\tusbi_err(TRANSFER_CTX(transfer), \"could not locate urb!\");\n\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_dbg(\"handling completion status %d of iso urb %d/%d\", urb->status,\n\t\turb_idx, num_urbs);\n\n\t/* copy isochronous results back in */\n\n\tfor (i = 0; i < urb->number_of_packets; i++) {\n\t\tstruct usbfs_iso_packet_desc *urb_desc = &urb->iso_frame_desc[i];\n\t\tstruct libusb_iso_packet_descriptor *lib_desc =\n\t\t\t&transfer->iso_packet_desc[tpriv->iso_packet_offset++];\n\t\tlib_desc->status = LIBUSB_TRANSFER_COMPLETED;\n\t\tswitch (urb_desc->status) {\n\t\tcase 0:\n\t\t\tbreak;\n\t\tcase -ENOENT: /* cancelled */\n\t\tcase -ECONNRESET:\n\t\t\tbreak;\n\t\tcase -ENODEV:\n\t\tcase -ESHUTDOWN:\n\t\t\tusbi_dbg(\"device removed\");\n\t\t\tlib_desc->status = LIBUSB_TRANSFER_NO_DEVICE;\n\t\t\tbreak;\n\t\tcase -EPIPE:\n\t\t\tusbi_dbg(\"detected endpoint stall\");\n\t\t\tlib_desc->status = LIBUSB_TRANSFER_STALL;\n\t\t\tbreak;\n\t\tcase -EOVERFLOW:\n\t\t\tusbi_dbg(\"overflow error\");\n\t\t\tlib_desc->status = LIBUSB_TRANSFER_OVERFLOW;\n\t\t\tbreak;\n\t\tcase -ETIME:\n\t\tcase -EPROTO:\n\t\tcase -EILSEQ:\n\t\tcase -ECOMM:\n\t\tcase -ENOSR:\n\t\tcase -EXDEV:\n\t\t\tusbi_dbg(\"low-level USB error %d\", urb_desc->status);\n\t\t\tlib_desc->status = LIBUSB_TRANSFER_ERROR;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tusbi_warn(TRANSFER_CTX(transfer),\n\t\t\t\t\"unrecognised urb status %d\", urb_desc->status);\n\t\t\tlib_desc->status = LIBUSB_TRANSFER_ERROR;\n\t\t\tbreak;\n\t\t}\n\t\tlib_desc->actual_length = urb_desc->actual_length;\n\t}\n\n\ttpriv->num_retired++;\n\n\tif (tpriv->reap_action != NORMAL) { /* cancelled or submit_fail */\n\t\tusbi_dbg(\"CANCEL: urb status %d\", urb->status);\n\n\t\tif (tpriv->num_retired == num_urbs) {\n\t\t\tusbi_dbg(\"CANCEL: last URB handled, reporting\");\n\t\t\tfree_iso_urbs(tpriv);\n\t\t\tif (tpriv->reap_action == CANCELLED) {\n\t\t\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\t\t\treturn usbi_handle_transfer_cancellation(itransfer);\n\t\t\t} else {\n\t\t\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\t\t\treturn usbi_handle_transfer_completion(itransfer,\n\t\t\t\t\tLIBUSB_TRANSFER_ERROR);\n\t\t\t}\n\t\t}\n\t\tgoto out;\n\t}\n\n\tswitch (urb->status) {\n\tcase 0:\n\t\tbreak;\n\tcase -ENOENT: /* cancelled */\n\tcase -ECONNRESET:\n\t\tbreak;\n\tcase -ESHUTDOWN:\n\t\tusbi_dbg(\"device removed\");\n\t\tstatus = LIBUSB_TRANSFER_NO_DEVICE;\n\t\tbreak;\n\tdefault:\n\t\tusbi_warn(TRANSFER_CTX(transfer),\n\t\t\t\"unrecognised urb status %d\", urb->status);\n\t\tstatus = LIBUSB_TRANSFER_ERROR;\n\t\tbreak;\n\t}\n\n\t/* if we're the last urb then we're done */\n\tif (urb_idx == num_urbs) {\n\t\tusbi_dbg(\"last URB in transfer --> complete!\");\n\t\tfree_iso_urbs(tpriv);\n\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\treturn usbi_handle_transfer_completion(itransfer, status);\n\t}\n\nout:\n\tusbi_mutex_unlock(&itransfer->lock);\n\treturn 0;\n}\n\nstatic int handle_control_completion(struct usbi_transfer *itransfer,\n\tstruct usbfs_urb *urb)\n{\n\tstruct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);\n\tint status;\n\n\tusbi_mutex_lock(&itransfer->lock);\n\tusbi_dbg(\"handling completion status %d\", urb->status);\n\n\titransfer->transferred += urb->actual_length;\n\n\tif (tpriv->reap_action == CANCELLED) {\n\t\tif (urb->status != 0 && urb->status != -ENOENT)\n\t\t\tusbi_warn(ITRANSFER_CTX(itransfer),\n\t\t\t\t\"cancel: unrecognised urb status %d\", urb->status);\n\t\tfree(tpriv->urbs);\n\t\ttpriv->urbs = NULL;\n\t\tusbi_mutex_unlock(&itransfer->lock);\n\t\treturn usbi_handle_transfer_cancellation(itransfer);\n\t}\n\n\tswitch (urb->status) {\n\tcase 0:\n\t\tstatus = LIBUSB_TRANSFER_COMPLETED;\n\t\tbreak;\n\tcase -ENOENT: /* cancelled */\n\t\tstatus = LIBUSB_TRANSFER_CANCELLED;\n\t\tbreak;\n\tcase -ENODEV:\n\tcase -ESHUTDOWN:\n\t\tusbi_dbg(\"device removed\");\n\t\tstatus = LIBUSB_TRANSFER_NO_DEVICE;\n\t\tbreak;\n\tcase -EPIPE:\n\t\tusbi_dbg(\"unsupported control request\");\n\t\tstatus = LIBUSB_TRANSFER_STALL;\n\t\tbreak;\n\tcase -EOVERFLOW:\n\t\tusbi_dbg(\"control overflow error\");\n\t\tstatus = LIBUSB_TRANSFER_OVERFLOW;\n\t\tbreak;\n\tcase -ETIME:\n\tcase -EPROTO:\n\tcase -EILSEQ:\n\tcase -ECOMM:\n\tcase -ENOSR:\n\t\tusbi_dbg(\"low-level bus error occurred\");\n\t\tstatus = LIBUSB_TRANSFER_ERROR;\n\t\tbreak;\n\tdefault:\n\t\tusbi_warn(ITRANSFER_CTX(itransfer),\n\t\t\t\"unrecognised urb status %d\", urb->status);\n\t\tstatus = LIBUSB_TRANSFER_ERROR;\n\t\tbreak;\n\t}\n\n\tfree(tpriv->urbs);\n\ttpriv->urbs = NULL;\n\tusbi_mutex_unlock(&itransfer->lock);\n\treturn usbi_handle_transfer_completion(itransfer, status);\n}\n\nstatic int reap_for_handle(struct libusb_device_handle *handle)\n{\n\tstruct linux_device_handle_priv *hpriv = _device_handle_priv(handle);\n\tint r;\n\tstruct usbfs_urb *urb;\n\tstruct usbi_transfer *itransfer;\n\tstruct libusb_transfer *transfer;\n\n\tr = ioctl(hpriv->fd, IOCTL_USBFS_REAPURBNDELAY, &urb);\n\tif (r == -1 && errno == EAGAIN)\n\t\treturn 1;\n\tif (r < 0) {\n\t\tif (errno == ENODEV)\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\n\t\tusbi_err(HANDLE_CTX(handle), \"reap failed error %d errno=%d\",\n\t\t\tr, errno);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\titransfer = urb->usercontext;\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tusbi_dbg(\"urb type=%d status=%d transferred=%d\", urb->type, urb->status,\n\t\turb->actual_length);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\treturn handle_iso_completion(itransfer, urb);\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\treturn handle_bulk_completion(itransfer, urb);\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\treturn handle_control_completion(itransfer, urb);\n\tdefault:\n\t\tusbi_err(HANDLE_CTX(handle), \"unrecognised endpoint type %x\",\n\t\t\ttransfer->type);\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n}\n\nstatic int op_handle_events(struct libusb_context *ctx,\n\tstruct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready)\n{\n\tint r;\n\tunsigned int i = 0;\n\n\tusbi_mutex_lock(&ctx->open_devs_lock);\n\tfor (i = 0; i < nfds && num_ready > 0; i++) {\n\t\tstruct pollfd *pollfd = &fds[i];\n\t\tstruct libusb_device_handle *handle;\n\t\tstruct linux_device_handle_priv *hpriv = NULL;\n\n\t\tif (!pollfd->revents)\n\t\t\tcontinue;\n\n\t\tnum_ready--;\n\t\tlist_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) {\n\t\t\thpriv = _device_handle_priv(handle);\n\t\t\tif (hpriv->fd == pollfd->fd)\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (!hpriv || hpriv->fd != pollfd->fd) {\n\t\t\tusbi_err(ctx, \"cannot find handle for fd %d\",\n\t\t\t\t pollfd->fd);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (pollfd->revents & POLLERR) {\n\t\t\t/* remove the fd from the pollfd set so that it doesn't continuously\n\t\t\t * trigger an event, and flag that it has been removed so op_close()\n\t\t\t * doesn't try to remove it a second time */\n\t\t\tusbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd);\n\t\t\thpriv->fd_removed = 1;\n\n\t\t\t/* device will still be marked as attached if hotplug monitor thread\n\t\t\t * hasn't processed remove event yet */\n\t\t\tusbi_mutex_static_lock(&linux_hotplug_lock);\n\t\t\tif (handle->dev->attached)\n\t\t\t\tlinux_device_disconnected(handle->dev->bus_number,\n\t\t\t\t\t\thandle->dev->device_address);\n\t\t\tusbi_mutex_static_unlock(&linux_hotplug_lock);\n\n\t\t\tif (hpriv->caps & USBFS_CAP_REAP_AFTER_DISCONNECT) {\n\t\t\t\tdo {\n\t\t\t\t\tr = reap_for_handle(handle);\n\t\t\t\t} while (r == 0);\n\t\t\t}\n\n\t\t\tusbi_handle_disconnect(handle);\n\t\t\tcontinue;\n\t\t}\n\n\t\tdo {\n\t\t\tr = reap_for_handle(handle);\n\t\t} while (r == 0);\n\t\tif (r == 1 || r == LIBUSB_ERROR_NO_DEVICE)\n\t\t\tcontinue;\n\t\telse if (r < 0)\n\t\t\tgoto out;\n\t}\n\n\tr = 0;\nout:\n\tusbi_mutex_unlock(&ctx->open_devs_lock);\n\treturn r;\n}\n\nstatic int op_clock_gettime(int clk_id, struct timespec *tp)\n{\n\tswitch (clk_id) {\n\tcase USBI_CLOCK_MONOTONIC:\n\t\treturn clock_gettime(monotonic_clkid, tp);\n\tcase USBI_CLOCK_REALTIME:\n\t\treturn clock_gettime(CLOCK_REALTIME, tp);\n\tdefault:\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n  }\n}\n\n#ifdef USBI_TIMERFD_AVAILABLE\nstatic clockid_t op_get_timerfd_clockid(void)\n{\n\treturn monotonic_clkid;\n\n}\n#endif\n\nconst struct usbi_os_backend linux_usbfs_backend = {\n\t.name = \"Linux usbfs\",\n\t.caps = USBI_CAP_HAS_HID_ACCESS|USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER,\n\t.init = op_init,\n\t.exit = op_exit,\n\t.get_device_list = NULL,\n\t.hotplug_poll = op_hotplug_poll,\n\t.get_device_descriptor = op_get_device_descriptor,\n\t.get_active_config_descriptor = op_get_active_config_descriptor,\n\t.get_config_descriptor = op_get_config_descriptor,\n\t.get_config_descriptor_by_value = op_get_config_descriptor_by_value,\n\n\t.open = op_open,\n\t.close = op_close,\n\t.get_configuration = op_get_configuration,\n\t.set_configuration = op_set_configuration,\n\t.claim_interface = op_claim_interface,\n\t.release_interface = op_release_interface,\n\n\t.set_interface_altsetting = op_set_interface,\n\t.clear_halt = op_clear_halt,\n\t.reset_device = op_reset_device,\n\n\t.alloc_streams = op_alloc_streams,\n\t.free_streams = op_free_streams,\n\n\t.dev_mem_alloc = op_dev_mem_alloc,\n\t.dev_mem_free = op_dev_mem_free,\n\n\t.kernel_driver_active = op_kernel_driver_active,\n\t.detach_kernel_driver = op_detach_kernel_driver,\n\t.attach_kernel_driver = op_attach_kernel_driver,\n\n\t.destroy_device = op_destroy_device,\n\n\t.submit_transfer = op_submit_transfer,\n\t.cancel_transfer = op_cancel_transfer,\n\t.clear_transfer_priv = op_clear_transfer_priv,\n\n\t.handle_events = op_handle_events,\n\n\t.clock_gettime = op_clock_gettime,\n\n#ifdef USBI_TIMERFD_AVAILABLE\n\t.get_timerfd_clockid = op_get_timerfd_clockid,\n#endif\n\n\t.device_priv_size = sizeof(struct linux_device_priv),\n\t.device_handle_priv_size = sizeof(struct linux_device_handle_priv),\n\t.transfer_priv_size = sizeof(struct linux_transfer_priv),\n};\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.h",
    "content": "/*\n * usbfs header structures\n * Copyright © 2007 Daniel Drake <dsd@gentoo.org>\n * Copyright © 2001 Johannes Erdfelt <johannes@erdfelt.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBUSB_USBFS_H\n#define LIBUSB_USBFS_H\n\n#include <linux/types.h>\n\n#define SYSFS_DEVICE_PATH \"/sys/bus/usb/devices\"\n\nstruct usbfs_ctrltransfer {\n\t/* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */\n\tuint8_t  bmRequestType;\n\tuint8_t  bRequest;\n\tuint16_t wValue;\n\tuint16_t wIndex;\n\tuint16_t wLength;\n\n\tuint32_t timeout;\t/* in milliseconds */\n\n\t/* pointer to data */\n\tvoid *data;\n};\n\nstruct usbfs_bulktransfer {\n\t/* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */\n\tunsigned int ep;\n\tunsigned int len;\n\tunsigned int timeout;\t/* in milliseconds */\n\n\t/* pointer to data */\n\tvoid *data;\n};\n\nstruct usbfs_setinterface {\n\t/* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */\n\tunsigned int interface;\n\tunsigned int altsetting;\n};\n\n#define USBFS_MAXDRIVERNAME 255\n\nstruct usbfs_getdriver {\n\tunsigned int interface;\n\tchar driver[USBFS_MAXDRIVERNAME + 1];\n};\n\n#define USBFS_URB_SHORT_NOT_OK\t\t0x01\n#define USBFS_URB_ISO_ASAP\t\t\t0x02\n#define USBFS_URB_BULK_CONTINUATION\t0x04\n#define USBFS_URB_QUEUE_BULK\t\t0x10\n#define USBFS_URB_ZERO_PACKET\t\t0x40\n\nenum usbfs_urb_type {\n\tUSBFS_URB_TYPE_ISO = 0,\n\tUSBFS_URB_TYPE_INTERRUPT = 1,\n\tUSBFS_URB_TYPE_CONTROL = 2,\n\tUSBFS_URB_TYPE_BULK = 3,\n};\n\nstruct usbfs_iso_packet_desc {\n\tunsigned int length;\n\tunsigned int actual_length;\n\tunsigned int status;\n};\n\n#define MAX_ISO_BUFFER_LENGTH\t\t49152 * 128\n#define MAX_BULK_BUFFER_LENGTH\t\t16384\n#define MAX_CTRL_BUFFER_LENGTH\t\t4096\n\nstruct usbfs_urb {\n\tunsigned char type;\n\tunsigned char endpoint;\n\tint status;\n\tunsigned int flags;\n\tvoid *buffer;\n\tint buffer_length;\n\tint actual_length;\n\tint start_frame;\n\tunion {\n\t\tint number_of_packets;\t/* Only used for isoc urbs */\n\t\tunsigned int stream_id;\t/* Only used with bulk streams */\n\t};\n\tint error_count;\n\tunsigned int signr;\n\tvoid *usercontext;\n\tstruct usbfs_iso_packet_desc iso_frame_desc[0];\n};\n\nstruct usbfs_connectinfo {\n\tunsigned int devnum;\n\tunsigned char slow;\n};\n\nstruct usbfs_ioctl {\n\tint ifno;\t/* interface 0..N ; negative numbers reserved */\n\tint ioctl_code;\t/* MUST encode size + direction of data so the\n\t\t\t * macros in <asm/ioctl.h> give correct values */\n\tvoid *data;\t/* param buffer (in, or out) */\n};\n\nstruct usbfs_hub_portinfo {\n\tunsigned char numports;\n\tunsigned char port[127];\t/* port to device num mapping */\n};\n\n#define USBFS_CAP_ZERO_PACKET\t\t0x01\n#define USBFS_CAP_BULK_CONTINUATION\t0x02\n#define USBFS_CAP_NO_PACKET_SIZE_LIM\t0x04\n#define USBFS_CAP_BULK_SCATTER_GATHER\t0x08\n#define USBFS_CAP_REAP_AFTER_DISCONNECT\t0x10\n\n#define USBFS_DISCONNECT_CLAIM_IF_DRIVER\t0x01\n#define USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER\t0x02\n\nstruct usbfs_disconnect_claim {\n\tunsigned int interface;\n\tunsigned int flags;\n\tchar driver[USBFS_MAXDRIVERNAME + 1];\n};\n\nstruct usbfs_streams {\n\tunsigned int num_streams; /* Not used by USBDEVFS_FREE_STREAMS */\n\tunsigned int num_eps;\n\tunsigned char eps[0];\n};\n\n#define IOCTL_USBFS_CONTROL\t_IOWR('U', 0, struct usbfs_ctrltransfer)\n#define IOCTL_USBFS_BULK\t\t_IOWR('U', 2, struct usbfs_bulktransfer)\n#define IOCTL_USBFS_RESETEP\t_IOR('U', 3, unsigned int)\n#define IOCTL_USBFS_SETINTF\t_IOR('U', 4, struct usbfs_setinterface)\n#define IOCTL_USBFS_SETCONFIG\t_IOR('U', 5, unsigned int)\n#define IOCTL_USBFS_GETDRIVER\t_IOW('U', 8, struct usbfs_getdriver)\n#define IOCTL_USBFS_SUBMITURB\t_IOR('U', 10, struct usbfs_urb)\n#define IOCTL_USBFS_DISCARDURB\t_IO('U', 11)\n#define IOCTL_USBFS_REAPURB\t_IOW('U', 12, void *)\n#define IOCTL_USBFS_REAPURBNDELAY\t_IOW('U', 13, void *)\n#define IOCTL_USBFS_CLAIMINTF\t_IOR('U', 15, unsigned int)\n#define IOCTL_USBFS_RELEASEINTF\t_IOR('U', 16, unsigned int)\n#define IOCTL_USBFS_CONNECTINFO\t_IOW('U', 17, struct usbfs_connectinfo)\n#define IOCTL_USBFS_IOCTL         _IOWR('U', 18, struct usbfs_ioctl)\n#define IOCTL_USBFS_HUB_PORTINFO\t_IOR('U', 19, struct usbfs_hub_portinfo)\n#define IOCTL_USBFS_RESET\t\t_IO('U', 20)\n#define IOCTL_USBFS_CLEAR_HALT\t_IOR('U', 21, unsigned int)\n#define IOCTL_USBFS_DISCONNECT\t_IO('U', 22)\n#define IOCTL_USBFS_CONNECT\t_IO('U', 23)\n#define IOCTL_USBFS_CLAIM_PORT\t_IOR('U', 24, unsigned int)\n#define IOCTL_USBFS_RELEASE_PORT\t_IOR('U', 25, unsigned int)\n#define IOCTL_USBFS_GET_CAPABILITIES\t_IOR('U', 26, __u32)\n#define IOCTL_USBFS_DISCONNECT_CLAIM\t_IOR('U', 27, struct usbfs_disconnect_claim)\n#define IOCTL_USBFS_ALLOC_STREAMS\t_IOR('U', 28, struct usbfs_streams)\n#define IOCTL_USBFS_FREE_STREAMS\t_IOR('U', 29, struct usbfs_streams)\n\nextern usbi_mutex_static_t linux_hotplug_lock;\n\n#if defined(HAVE_LIBUDEV)\nint linux_udev_start_event_monitor(void);\nint linux_udev_stop_event_monitor(void);\nint linux_udev_scan_devices(struct libusb_context *ctx);\nvoid linux_udev_hotplug_poll(void);\n#else\nint linux_netlink_start_event_monitor(void);\nint linux_netlink_stop_event_monitor(void);\nvoid linux_netlink_hotplug_poll(void);\n#endif\n\nvoid linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name);\nvoid linux_device_disconnected(uint8_t busnum, uint8_t devaddr);\n\nint linux_get_device_address (struct libusb_context *ctx, int detached,\n\tuint8_t *busnum, uint8_t *devaddr, const char *dev_node,\n\tconst char *sys_name);\nint linux_enumerate_device(struct libusb_context *ctx,\n\tuint8_t busnum, uint8_t devaddr, const char *sysfs_dir);\n\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/netbsd_usb.c",
    "content": "/*\n * Copyright © 2011 Martin Pieuchot <mpi@openbsd.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <sys/time.h>\n#include <sys/types.h>\n\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <dev/usb/usb.h>\n\n#include \"libusbi.h\"\n\nstruct device_priv {\n\tchar devnode[16];\n\tint fd;\n\n\tunsigned char *cdesc;\t\t\t/* active config descriptor */\n\tusb_device_descriptor_t ddesc;\t\t/* usb device descriptor */\n};\n\nstruct handle_priv {\n\tint endpoints[USB_MAX_ENDPOINTS];\n};\n\n/*\n * Backend functions\n */\nstatic int netbsd_get_device_list(struct libusb_context *,\n    struct discovered_devs **);\nstatic int netbsd_open(struct libusb_device_handle *);\nstatic void netbsd_close(struct libusb_device_handle *);\n\nstatic int netbsd_get_device_descriptor(struct libusb_device *, unsigned char *,\n    int *);\nstatic int netbsd_get_active_config_descriptor(struct libusb_device *,\n    unsigned char *, size_t, int *);\nstatic int netbsd_get_config_descriptor(struct libusb_device *, uint8_t,\n    unsigned char *, size_t, int *);\n\nstatic int netbsd_get_configuration(struct libusb_device_handle *, int *);\nstatic int netbsd_set_configuration(struct libusb_device_handle *, int);\n\nstatic int netbsd_claim_interface(struct libusb_device_handle *, int);\nstatic int netbsd_release_interface(struct libusb_device_handle *, int);\n\nstatic int netbsd_set_interface_altsetting(struct libusb_device_handle *, int,\n    int);\nstatic int netbsd_clear_halt(struct libusb_device_handle *, unsigned char);\nstatic int netbsd_reset_device(struct libusb_device_handle *);\nstatic void netbsd_destroy_device(struct libusb_device *);\n\nstatic int netbsd_submit_transfer(struct usbi_transfer *);\nstatic int netbsd_cancel_transfer(struct usbi_transfer *);\nstatic void netbsd_clear_transfer_priv(struct usbi_transfer *);\nstatic int netbsd_handle_transfer_completion(struct usbi_transfer *);\nstatic int netbsd_clock_gettime(int, struct timespec *);\n\n/*\n * Private functions\n */\nstatic int _errno_to_libusb(int);\nstatic int _cache_active_config_descriptor(struct libusb_device *, int);\nstatic int _sync_control_transfer(struct usbi_transfer *);\nstatic int _sync_gen_transfer(struct usbi_transfer *);\nstatic int _access_endpoint(struct libusb_transfer *);\n\nconst struct usbi_os_backend netbsd_backend = {\n\t\"Synchronous NetBSD backend\",\n\t0,\n\tNULL,\t\t\t\t/* init() */\n\tNULL,\t\t\t\t/* exit() */\n\tnetbsd_get_device_list,\n\tNULL,\t\t\t\t/* hotplug_poll */\n\tnetbsd_open,\n\tnetbsd_close,\n\n\tnetbsd_get_device_descriptor,\n\tnetbsd_get_active_config_descriptor,\n\tnetbsd_get_config_descriptor,\n\tNULL,\t\t\t\t/* get_config_descriptor_by_value() */\n\n\tnetbsd_get_configuration,\n\tnetbsd_set_configuration,\n\n\tnetbsd_claim_interface,\n\tnetbsd_release_interface,\n\n\tnetbsd_set_interface_altsetting,\n\tnetbsd_clear_halt,\n\tnetbsd_reset_device,\n\n\tNULL,\t\t\t\t/* alloc_streams */\n\tNULL,\t\t\t\t/* free_streams */\n\n\tNULL,\t\t\t\t/* dev_mem_alloc() */\n\tNULL,\t\t\t\t/* dev_mem_free() */\n\n\tNULL,\t\t\t\t/* kernel_driver_active() */\n\tNULL,\t\t\t\t/* detach_kernel_driver() */\n\tNULL,\t\t\t\t/* attach_kernel_driver() */\n\n\tnetbsd_destroy_device,\n\n\tnetbsd_submit_transfer,\n\tnetbsd_cancel_transfer,\n\tnetbsd_clear_transfer_priv,\n\n\tNULL,\t\t\t\t/* handle_events() */\n\tnetbsd_handle_transfer_completion,\n\n\tnetbsd_clock_gettime,\n\tsizeof(struct device_priv),\n\tsizeof(struct handle_priv),\n\t0,\t\t\t\t/* transfer_priv_size */\n};\n\nint\nnetbsd_get_device_list(struct libusb_context * ctx,\n\tstruct discovered_devs **discdevs)\n{\n\tstruct libusb_device *dev;\n\tstruct device_priv *dpriv;\n\tstruct usb_device_info di;\n\tunsigned long session_id;\n\tchar devnode[16];\n\tint fd, err, i;\n\n\tusbi_dbg(\"\");\n\n\t/* Only ugen(4) is supported */\n\tfor (i = 0; i < USB_MAX_DEVICES; i++) {\n\t\t/* Control endpoint is always .00 */\n\t\tsnprintf(devnode, sizeof(devnode), \"/dev/ugen%d.00\", i);\n\n\t\tif ((fd = open(devnode, O_RDONLY)) < 0) {\n\t\t\tif (errno != ENOENT && errno != ENXIO)\n\t\t\t\tusbi_err(ctx, \"could not open %s\", devnode);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0)\n\t\t\tcontinue;\n\n\t\tsession_id = (di.udi_bus << 8 | di.udi_addr);\n\t\tdev = usbi_get_device_by_session_id(ctx, session_id);\n\n\t\tif (dev == NULL) {\n\t\t\tdev = usbi_alloc_device(ctx, session_id);\n\t\t\tif (dev == NULL)\n\t\t\t\treturn (LIBUSB_ERROR_NO_MEM);\n\n\t\t\tdev->bus_number = di.udi_bus;\n\t\t\tdev->device_address = di.udi_addr;\n\t\t\tdev->speed = di.udi_speed;\n\n\t\t\tdpriv = (struct device_priv *)dev->os_priv;\n\t\t\tstrlcpy(dpriv->devnode, devnode, sizeof(devnode));\n\t\t\tdpriv->fd = -1;\n\n\t\t\tif (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) {\n\t\t\t\terr = errno;\n\t\t\t\tgoto error;\n\t\t\t}\n\n\t\t\tdpriv->cdesc = NULL;\n\t\t\tif (_cache_active_config_descriptor(dev, fd)) {\n\t\t\t\terr = errno;\n\t\t\t\tgoto error;\n\t\t\t}\n\n\t\t\tif ((err = usbi_sanitize_device(dev)))\n\t\t\t\tgoto error;\n\t\t}\n\t\tclose(fd);\n\n\t\tif (discovered_devs_append(*discdevs, dev) == NULL)\n\t\t\treturn (LIBUSB_ERROR_NO_MEM);\n\n\t\tlibusb_unref_device(dev);\n\t}\n\n\treturn (LIBUSB_SUCCESS);\n\nerror:\n\tclose(fd);\n\tlibusb_unref_device(dev);\n\treturn _errno_to_libusb(err);\n}\n\nint\nnetbsd_open(struct libusb_device_handle *handle)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\n\tdpriv->fd = open(dpriv->devnode, O_RDWR);\n\tif (dpriv->fd < 0) {\n\t\tdpriv->fd = open(dpriv->devnode, O_RDONLY);\n\t\tif (dpriv->fd < 0)\n\t\t\treturn _errno_to_libusb(errno);\n\t}\n\n\tusbi_dbg(\"open %s: fd %d\", dpriv->devnode, dpriv->fd);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nvoid\nnetbsd_close(struct libusb_device_handle *handle)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\n\tusbi_dbg(\"close: fd %d\", dpriv->fd);\n\n\tclose(dpriv->fd);\n\tdpriv->fd = -1;\n}\n\nint\nnetbsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf,\n    int *host_endian)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\n\tusbi_dbg(\"\");\n\n\tmemcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH);\n\n\t*host_endian = 0;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nnetbsd_get_active_config_descriptor(struct libusb_device *dev,\n    unsigned char *buf, size_t len, int *host_endian)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\tusb_config_descriptor_t *ucd;\n\n\tucd = (usb_config_descriptor_t *) dpriv->cdesc;\n\tlen = MIN(len, UGETW(ucd->wTotalLength));\n\n\tusbi_dbg(\"len %d\", len);\n\n\tmemcpy(buf, dpriv->cdesc, len);\n\n\t*host_endian = 0;\n\n\treturn len;\n}\n\nint\nnetbsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx,\n    unsigned char *buf, size_t len, int *host_endian)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\tstruct usb_full_desc ufd;\n\tint fd, err;\n\n\tusbi_dbg(\"index %d, len %d\", idx, len);\n\n\t/* A config descriptor may be requested before opening the device */\n\tif (dpriv->fd >= 0) {\n\t\tfd = dpriv->fd;\n\t} else {\n\t\tfd = open(dpriv->devnode, O_RDONLY);\n\t\tif (fd < 0)\n\t\t\treturn _errno_to_libusb(errno);\n\t}\n\n\tufd.ufd_config_index = idx;\n\tufd.ufd_size = len;\n\tufd.ufd_data = buf;\n\n\tif ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) {\n\t\terr = errno;\n\t\tif (dpriv->fd < 0)\n\t\t\tclose(fd);\n\t\treturn _errno_to_libusb(err);\n\t}\n\n\tif (dpriv->fd < 0)\n\t\tclose(fd);\n\n\t*host_endian = 0;\n\n\treturn len;\n}\n\nint\nnetbsd_get_configuration(struct libusb_device_handle *handle, int *config)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\n\tusbi_dbg(\"\");\n\n\tif (ioctl(dpriv->fd, USB_GET_CONFIG, config) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tusbi_dbg(\"configuration %d\", *config);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nnetbsd_set_configuration(struct libusb_device_handle *handle, int config)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\n\tusbi_dbg(\"configuration %d\", config);\n\n\tif (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\treturn _cache_active_config_descriptor(handle->dev, dpriv->fd);\n}\n\nint\nnetbsd_claim_interface(struct libusb_device_handle *handle, int iface)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tint i;\n\n\tfor (i = 0; i < USB_MAX_ENDPOINTS; i++)\n\t\thpriv->endpoints[i] = -1;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nnetbsd_release_interface(struct libusb_device_handle *handle, int iface)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tint i;\n\n\tfor (i = 0; i < USB_MAX_ENDPOINTS; i++)\n\t\tif (hpriv->endpoints[i] >= 0)\n\t\t\tclose(hpriv->endpoints[i]);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nnetbsd_set_interface_altsetting(struct libusb_device_handle *handle, int iface,\n    int altsetting)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\tstruct usb_alt_interface intf;\n\n\tusbi_dbg(\"iface %d, setting %d\", iface, altsetting);\n\n\tmemset(&intf, 0, sizeof(intf));\n\n\tintf.uai_interface_index = iface;\n\tintf.uai_alt_no = altsetting;\n\n\tif (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nnetbsd_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\tstruct usb_ctl_request req;\n\n\tusbi_dbg(\"\");\n\n\treq.ucr_request.bmRequestType = UT_WRITE_ENDPOINT;\n\treq.ucr_request.bRequest = UR_CLEAR_FEATURE;\n\tUSETW(req.ucr_request.wValue, UF_ENDPOINT_HALT);\n\tUSETW(req.ucr_request.wIndex, endpoint);\n\tUSETW(req.ucr_request.wLength, 0);\n\n\tif (ioctl(dpriv->fd, USB_DO_REQUEST, &req) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nnetbsd_reset_device(struct libusb_device_handle *handle)\n{\n\tusbi_dbg(\"\");\n\n\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n}\n\nvoid\nnetbsd_destroy_device(struct libusb_device *dev)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\n\tusbi_dbg(\"\");\n\n\tfree(dpriv->cdesc);\n}\n\nint\nnetbsd_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer;\n\tstruct handle_priv *hpriv;\n\tint err = 0;\n\n\tusbi_dbg(\"\");\n\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\thpriv = (struct handle_priv *)transfer->dev_handle->os_priv;\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\terr = _sync_control_transfer(itransfer);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\tif (IS_XFEROUT(transfer)) {\n\t\t\t/* Isochronous write is not supported */\n\t\t\terr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tbreak;\n\t\t}\n\t\terr = _sync_gen_transfer(itransfer);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\tif (IS_XFEROUT(transfer) &&\n\t\t    transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) {\n\t\t\terr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tbreak;\n\t\t}\n\t\terr = _sync_gen_transfer(itransfer);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\terr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\tbreak;\n\t}\n\n\tif (err)\n\t\treturn (err);\n\n\tusbi_signal_transfer_completion(itransfer);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nnetbsd_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tusbi_dbg(\"\");\n\n\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n}\n\nvoid\nnetbsd_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tusbi_dbg(\"\");\n\n\t/* Nothing to do */\n}\n\nint\nnetbsd_handle_transfer_completion(struct usbi_transfer *itransfer)\n{\n\treturn usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED);\n}\n\nint\nnetbsd_clock_gettime(int clkid, struct timespec *tp)\n{\n\tusbi_dbg(\"clock %d\", clkid);\n\n\tif (clkid == USBI_CLOCK_REALTIME)\n\t\treturn clock_gettime(CLOCK_REALTIME, tp);\n\n\tif (clkid == USBI_CLOCK_MONOTONIC)\n\t\treturn clock_gettime(CLOCK_MONOTONIC, tp);\n\n\treturn (LIBUSB_ERROR_INVALID_PARAM);\n}\n\nint\n_errno_to_libusb(int err)\n{\n\tswitch (err) {\n\tcase EIO:\n\t\treturn (LIBUSB_ERROR_IO);\n\tcase EACCES:\n\t\treturn (LIBUSB_ERROR_ACCESS);\n\tcase ENOENT:\n\t\treturn (LIBUSB_ERROR_NO_DEVICE);\n\tcase ENOMEM:\n\t\treturn (LIBUSB_ERROR_NO_MEM);\n\t}\n\n\tusbi_dbg(\"error: %s\", strerror(err));\n\n\treturn (LIBUSB_ERROR_OTHER);\n}\n\nint\n_cache_active_config_descriptor(struct libusb_device *dev, int fd)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\tstruct usb_config_desc ucd;\n\tstruct usb_full_desc ufd;\n\tunsigned char* buf;\n\tint len;\n\n\tusbi_dbg(\"fd %d\", fd);\n\n\tucd.ucd_config_index = USB_CURRENT_CONFIG_INDEX;\n\n\tif ((ioctl(fd, USB_GET_CONFIG_DESC, &ucd)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tusbi_dbg(\"active bLength %d\", ucd.ucd_desc.bLength);\n\n\tlen = UGETW(ucd.ucd_desc.wTotalLength);\n\tbuf = malloc(len);\n\tif (buf == NULL)\n\t\treturn (LIBUSB_ERROR_NO_MEM);\n\n\tufd.ufd_config_index = ucd.ucd_config_index;\n\tufd.ufd_size = len;\n\tufd.ufd_data = buf;\n\n\tusbi_dbg(\"index %d, len %d\", ufd.ufd_config_index, len);\n\n\tif ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) {\n\t\tfree(buf);\n\t\treturn _errno_to_libusb(errno);\n\t}\n\n\tif (dpriv->cdesc)\n\t\tfree(dpriv->cdesc);\n\tdpriv->cdesc = buf;\n\n\treturn (0);\n}\n\nint\n_sync_control_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer;\n\tstruct libusb_control_setup *setup;\n\tstruct device_priv *dpriv;\n\tstruct usb_ctl_request req;\n\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tdpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv;\n\tsetup = (struct libusb_control_setup *)transfer->buffer;\n\n\tusbi_dbg(\"type %d request %d value %d index %d length %d timeout %d\",\n\t    setup->bmRequestType, setup->bRequest,\n\t    libusb_le16_to_cpu(setup->wValue),\n\t    libusb_le16_to_cpu(setup->wIndex),\n\t    libusb_le16_to_cpu(setup->wLength), transfer->timeout);\n\n\treq.ucr_request.bmRequestType = setup->bmRequestType;\n\treq.ucr_request.bRequest = setup->bRequest;\n\t/* Don't use USETW, libusb already deals with the endianness */\n\t(*(uint16_t *)req.ucr_request.wValue) = setup->wValue;\n\t(*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex;\n\t(*(uint16_t *)req.ucr_request.wLength) = setup->wLength;\n\treq.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;\n\n\tif ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0)\n\t\treq.ucr_flags = USBD_SHORT_XFER_OK;\n\n\tif ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tif ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\titransfer->transferred = req.ucr_actlen;\n\n\tusbi_dbg(\"transferred %d\", itransfer->transferred);\n\n\treturn (0);\n}\n\nint\n_access_endpoint(struct libusb_transfer *transfer)\n{\n\tstruct handle_priv *hpriv;\n\tstruct device_priv *dpriv;\n\tchar *s, devnode[16];\n\tint fd, endpt;\n\tmode_t mode;\n\n\thpriv = (struct handle_priv *)transfer->dev_handle->os_priv;\n\tdpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv;\n\n\tendpt = UE_GET_ADDR(transfer->endpoint);\n\tmode = IS_XFERIN(transfer) ? O_RDONLY : O_WRONLY;\n\n\tusbi_dbg(\"endpoint %d mode %d\", endpt, mode);\n\n\tif (hpriv->endpoints[endpt] < 0) {\n\t\t/* Pick the right node given the control one */\n\t\tstrlcpy(devnode, dpriv->devnode, sizeof(devnode));\n\t\ts = strchr(devnode, '.');\n\t\tsnprintf(s, 4, \".%02d\", endpt);\n\n\t\t/* We may need to read/write to the same endpoint later. */\n\t\tif (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO))\n\t\t\tif ((fd = open(devnode, mode)) < 0)\n\t\t\t\treturn (-1);\n\n\t\thpriv->endpoints[endpt] = fd;\n\t}\n\n\treturn (hpriv->endpoints[endpt]);\n}\n\nint\n_sync_gen_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer;\n\tint fd, nr = 1;\n\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\t/*\n\t * Bulk, Interrupt or Isochronous transfer depends on the\n\t * endpoint and thus the node to open.\n\t */\n\tif ((fd = _access_endpoint(transfer)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tif ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tif (IS_XFERIN(transfer)) {\n\t\tif ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0)\n\t\t\tif ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0)\n\t\t\t\treturn _errno_to_libusb(errno);\n\n\t\tnr = read(fd, transfer->buffer, transfer->length);\n\t} else {\n\t\tnr = write(fd, transfer->buffer, transfer->length);\n\t}\n\n\tif (nr < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\titransfer->transferred = nr;\n\n\treturn (0);\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/openbsd_usb.c",
    "content": "/*\n * Copyright © 2011-2013 Martin Pieuchot <mpi@openbsd.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <sys/time.h>\n#include <sys/types.h>\n\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <dev/usb/usb.h>\n\n#include \"libusbi.h\"\n\nstruct device_priv {\n\tchar *devname;\t\t\t\t/* name of the ugen(4) node */\n\tint fd;\t\t\t\t\t/* device file descriptor */\n\n\tunsigned char *cdesc;\t\t\t/* active config descriptor */\n\tusb_device_descriptor_t ddesc;\t\t/* usb device descriptor */\n};\n\nstruct handle_priv {\n\tint endpoints[USB_MAX_ENDPOINTS];\n};\n\n/*\n * Backend functions\n */\nstatic int obsd_get_device_list(struct libusb_context *,\n    struct discovered_devs **);\nstatic int obsd_open(struct libusb_device_handle *);\nstatic void obsd_close(struct libusb_device_handle *);\n\nstatic int obsd_get_device_descriptor(struct libusb_device *, unsigned char *,\n    int *);\nstatic int obsd_get_active_config_descriptor(struct libusb_device *,\n    unsigned char *, size_t, int *);\nstatic int obsd_get_config_descriptor(struct libusb_device *, uint8_t,\n    unsigned char *, size_t, int *);\n\nstatic int obsd_get_configuration(struct libusb_device_handle *, int *);\nstatic int obsd_set_configuration(struct libusb_device_handle *, int);\n\nstatic int obsd_claim_interface(struct libusb_device_handle *, int);\nstatic int obsd_release_interface(struct libusb_device_handle *, int);\n\nstatic int obsd_set_interface_altsetting(struct libusb_device_handle *, int,\n    int);\nstatic int obsd_clear_halt(struct libusb_device_handle *, unsigned char);\nstatic int obsd_reset_device(struct libusb_device_handle *);\nstatic void obsd_destroy_device(struct libusb_device *);\n\nstatic int obsd_submit_transfer(struct usbi_transfer *);\nstatic int obsd_cancel_transfer(struct usbi_transfer *);\nstatic void obsd_clear_transfer_priv(struct usbi_transfer *);\nstatic int obsd_handle_transfer_completion(struct usbi_transfer *);\nstatic int obsd_clock_gettime(int, struct timespec *);\n\n/*\n * Private functions\n */\nstatic int _errno_to_libusb(int);\nstatic int _cache_active_config_descriptor(struct libusb_device *);\nstatic int _sync_control_transfer(struct usbi_transfer *);\nstatic int _sync_gen_transfer(struct usbi_transfer *);\nstatic int _access_endpoint(struct libusb_transfer *);\n\nstatic int _bus_open(int);\n\n\nconst struct usbi_os_backend openbsd_backend = {\n\t\"Synchronous OpenBSD backend\",\n\t0,\n\tNULL,\t\t\t\t/* init() */\n\tNULL,\t\t\t\t/* exit() */\n\tobsd_get_device_list,\n\tNULL,\t\t\t\t/* hotplug_poll */\n\tobsd_open,\n\tobsd_close,\n\n\tobsd_get_device_descriptor,\n\tobsd_get_active_config_descriptor,\n\tobsd_get_config_descriptor,\n\tNULL,\t\t\t\t/* get_config_descriptor_by_value() */\n\n\tobsd_get_configuration,\n\tobsd_set_configuration,\n\n\tobsd_claim_interface,\n\tobsd_release_interface,\n\n\tobsd_set_interface_altsetting,\n\tobsd_clear_halt,\n\tobsd_reset_device,\n\n\tNULL,\t\t\t\t/* alloc_streams */\n\tNULL,\t\t\t\t/* free_streams */\n\n\tNULL,\t\t\t\t/* dev_mem_alloc() */\n\tNULL,\t\t\t\t/* dev_mem_free() */\n\n\tNULL,\t\t\t\t/* kernel_driver_active() */\n\tNULL,\t\t\t\t/* detach_kernel_driver() */\n\tNULL,\t\t\t\t/* attach_kernel_driver() */\n\n\tobsd_destroy_device,\n\n\tobsd_submit_transfer,\n\tobsd_cancel_transfer,\n\tobsd_clear_transfer_priv,\n\n\tNULL,\t\t\t\t/* handle_events() */\n\tobsd_handle_transfer_completion,\n\n\tobsd_clock_gettime,\n\tsizeof(struct device_priv),\n\tsizeof(struct handle_priv),\n\t0,\t\t\t\t/* transfer_priv_size */\n};\n\n#define DEVPATH\t\"/dev/\"\n#define USBDEV\tDEVPATH \"usb\"\n\nint\nobsd_get_device_list(struct libusb_context * ctx,\n\tstruct discovered_devs **discdevs)\n{\n\tstruct discovered_devs *ddd;\n\tstruct libusb_device *dev;\n\tstruct device_priv *dpriv;\n\tstruct usb_device_info di;\n\tstruct usb_device_ddesc dd;\n\tunsigned long session_id;\n\tchar devices[USB_MAX_DEVICES];\n\tchar busnode[16];\n\tchar *udevname;\n\tint fd, addr, i, j;\n\n\tusbi_dbg(\"\");\n\n\tfor (i = 0; i < 8; i++) {\n\t\tsnprintf(busnode, sizeof(busnode), USBDEV \"%d\", i);\n\n\t\tif ((fd = open(busnode, O_RDWR)) < 0) {\n\t\t\tif (errno != ENOENT && errno != ENXIO)\n\t\t\t\tusbi_err(ctx, \"could not open %s\", busnode);\n\t\t\tcontinue;\n\t\t}\n\n\t\tbzero(devices, sizeof(devices));\n\t\tfor (addr = 1; addr < USB_MAX_DEVICES; addr++) {\n\t\t\tif (devices[addr])\n\t\t\t\tcontinue;\n\n\t\t\tdi.udi_addr = addr;\n\t\t\tif (ioctl(fd, USB_DEVICEINFO, &di) < 0)\n\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t * XXX If ugen(4) is attached to the USB device\n\t\t\t * it will be used.\n\t\t\t */\n\t\t\tudevname = NULL;\n\t\t\tfor (j = 0; j < USB_MAX_DEVNAMES; j++)\n\t\t\t\tif (!strncmp(\"ugen\", di.udi_devnames[j], 4)) {\n\t\t\t\t\tudevname = strdup(di.udi_devnames[j]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tsession_id = (di.udi_bus << 8 | di.udi_addr);\n\t\t\tdev = usbi_get_device_by_session_id(ctx, session_id);\n\n\t\t\tif (dev == NULL) {\n\t\t\t\tdev = usbi_alloc_device(ctx, session_id);\n\t\t\t\tif (dev == NULL) {\n\t\t\t\t\tclose(fd);\n\t\t\t\t\treturn (LIBUSB_ERROR_NO_MEM);\n\t\t\t\t}\n\n\t\t\t\tdev->bus_number = di.udi_bus;\n\t\t\t\tdev->device_address = di.udi_addr;\n\t\t\t\tdev->speed = di.udi_speed;\n\n\t\t\t\tdpriv = (struct device_priv *)dev->os_priv;\n\t\t\t\tdpriv->fd = -1;\n\t\t\t\tdpriv->cdesc = NULL;\n\t\t\t\tdpriv->devname = udevname;\n\n\t\t\t\tdd.udd_bus = di.udi_bus;\n\t\t\t\tdd.udd_addr = di.udi_addr;\n\t\t\t\tif (ioctl(fd, USB_DEVICE_GET_DDESC, &dd) < 0) {\n\t\t\t\t\tlibusb_unref_device(dev);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tdpriv->ddesc = dd.udd_desc;\n\n\t\t\t\tif (_cache_active_config_descriptor(dev)) {\n\t\t\t\t\tlibusb_unref_device(dev);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (usbi_sanitize_device(dev)) {\n\t\t\t\t\tlibusb_unref_device(dev);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tddd = discovered_devs_append(*discdevs, dev);\n\t\t\tif (ddd == NULL) {\n\t\t\t\tclose(fd);\n\t\t\t\treturn (LIBUSB_ERROR_NO_MEM);\n\t\t\t}\n\t\t\tlibusb_unref_device(dev);\n\n\t\t\t*discdevs = ddd;\n\t\t\tdevices[addr] = 1;\n\t\t}\n\n\t\tclose(fd);\n\t}\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_open(struct libusb_device_handle *handle)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\tchar devnode[16];\n\n\tif (dpriv->devname) {\n\t\t/*\n\t\t * Only open ugen(4) attached devices read-write, all\n\t\t * read-only operations are done through the bus node.\n\t\t */\n\t\tsnprintf(devnode, sizeof(devnode), DEVPATH \"%s.00\",\n\t\t    dpriv->devname);\n\t\tdpriv->fd = open(devnode, O_RDWR);\n\t\tif (dpriv->fd < 0)\n\t\t\treturn _errno_to_libusb(errno);\n\n\t\tusbi_dbg(\"open %s: fd %d\", devnode, dpriv->fd);\n\t}\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nvoid\nobsd_close(struct libusb_device_handle *handle)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\n\tif (dpriv->devname) {\n\t\tusbi_dbg(\"close: fd %d\", dpriv->fd);\n\n\t\tclose(dpriv->fd);\n\t\tdpriv->fd = -1;\n\t}\n}\n\nint\nobsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf,\n    int *host_endian)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\n\tusbi_dbg(\"\");\n\n\tmemcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH);\n\n\t*host_endian = 0;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_get_active_config_descriptor(struct libusb_device *dev,\n    unsigned char *buf, size_t len, int *host_endian)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\tusb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc;\n\n\tlen = MIN(len, UGETW(ucd->wTotalLength));\n\n\tusbi_dbg(\"len %d\", len);\n\n\tmemcpy(buf, dpriv->cdesc, len);\n\n\t*host_endian = 0;\n\n\treturn (len);\n}\n\nint\nobsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx,\n    unsigned char *buf, size_t len, int *host_endian)\n{\n\tstruct usb_device_fdesc udf;\n\tint fd, err;\n\n\tif ((fd = _bus_open(dev->bus_number)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tudf.udf_bus = dev->bus_number;\n\tudf.udf_addr = dev->device_address;\n\tudf.udf_config_index = idx;\n\tudf.udf_size = len;\n\tudf.udf_data = buf;\n\n\tusbi_dbg(\"index %d, len %d\", udf.udf_config_index, len);\n\n\tif (ioctl(fd, USB_DEVICE_GET_FDESC, &udf) < 0) {\n\t\terr = errno;\n\t\tclose(fd);\n\t\treturn _errno_to_libusb(err);\n\t}\n\tclose(fd);\n\n\t*host_endian = 0;\n\n\treturn (len);\n}\n\nint\nobsd_get_configuration(struct libusb_device_handle *handle, int *config)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\tusb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc;\n\n\t*config = ucd->bConfigurationValue;\n\n\tusbi_dbg(\"bConfigurationValue %d\", *config);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_set_configuration(struct libusb_device_handle *handle, int config)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\n\tif (dpriv->devname == NULL)\n\t\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n\n\tusbi_dbg(\"bConfigurationValue %d\", config);\n\n\tif (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\treturn _cache_active_config_descriptor(handle->dev);\n}\n\nint\nobsd_claim_interface(struct libusb_device_handle *handle, int iface)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tint i;\n\n\tfor (i = 0; i < USB_MAX_ENDPOINTS; i++)\n\t\thpriv->endpoints[i] = -1;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_release_interface(struct libusb_device_handle *handle, int iface)\n{\n\tstruct handle_priv *hpriv = (struct handle_priv *)handle->os_priv;\n\tint i;\n\n\tfor (i = 0; i < USB_MAX_ENDPOINTS; i++)\n\t\tif (hpriv->endpoints[i] >= 0)\n\t\t\tclose(hpriv->endpoints[i]);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_set_interface_altsetting(struct libusb_device_handle *handle, int iface,\n    int altsetting)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv;\n\tstruct usb_alt_interface intf;\n\n\tif (dpriv->devname == NULL)\n\t\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n\n\tusbi_dbg(\"iface %d, setting %d\", iface, altsetting);\n\n\tmemset(&intf, 0, sizeof(intf));\n\n\tintf.uai_interface_index = iface;\n\tintf.uai_alt_no = altsetting;\n\n\tif (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint)\n{\n\tstruct usb_ctl_request req;\n\tint fd, err;\n\n\tif ((fd = _bus_open(handle->dev->bus_number)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tusbi_dbg(\"\");\n\n\treq.ucr_addr = handle->dev->device_address;\n\treq.ucr_request.bmRequestType = UT_WRITE_ENDPOINT;\n\treq.ucr_request.bRequest = UR_CLEAR_FEATURE;\n\tUSETW(req.ucr_request.wValue, UF_ENDPOINT_HALT);\n\tUSETW(req.ucr_request.wIndex, endpoint);\n\tUSETW(req.ucr_request.wLength, 0);\n\n\tif (ioctl(fd, USB_REQUEST, &req) < 0) {\n\t\terr = errno;\n\t\tclose(fd);\n\t\treturn _errno_to_libusb(err);\n\t}\n\tclose(fd);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_reset_device(struct libusb_device_handle *handle)\n{\n\tusbi_dbg(\"\");\n\n\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n}\n\nvoid\nobsd_destroy_device(struct libusb_device *dev)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\n\tusbi_dbg(\"\");\n\n\tfree(dpriv->cdesc);\n\tfree(dpriv->devname);\n}\n\nint\nobsd_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer;\n\tstruct handle_priv *hpriv;\n\tint err = 0;\n\n\tusbi_dbg(\"\");\n\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\thpriv = (struct handle_priv *)transfer->dev_handle->os_priv;\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\terr = _sync_control_transfer(itransfer);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\tif (IS_XFEROUT(transfer)) {\n\t\t\t/* Isochronous write is not supported */\n\t\t\terr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tbreak;\n\t\t}\n\t\terr = _sync_gen_transfer(itransfer);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\tif (IS_XFEROUT(transfer) &&\n\t\t    transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) {\n\t\t\terr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tbreak;\n\t\t}\n\t\terr = _sync_gen_transfer(itransfer);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\terr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\tbreak;\n\t}\n\n\tif (err)\n\t\treturn (err);\n\n\tusbi_signal_transfer_completion(itransfer);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nobsd_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tusbi_dbg(\"\");\n\n\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n}\n\nvoid\nobsd_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tusbi_dbg(\"\");\n\n\t/* Nothing to do */\n}\n\nint\nobsd_handle_transfer_completion(struct usbi_transfer *itransfer)\n{\n\treturn usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED);\n}\n\nint\nobsd_clock_gettime(int clkid, struct timespec *tp)\n{\n\tusbi_dbg(\"clock %d\", clkid);\n\n\tif (clkid == USBI_CLOCK_REALTIME)\n\t\treturn clock_gettime(CLOCK_REALTIME, tp);\n\n\tif (clkid == USBI_CLOCK_MONOTONIC)\n\t\treturn clock_gettime(CLOCK_MONOTONIC, tp);\n\n\treturn (LIBUSB_ERROR_INVALID_PARAM);\n}\n\nint\n_errno_to_libusb(int err)\n{\n\tusbi_dbg(\"error: %s (%d)\", strerror(err), err);\n\n\tswitch (err) {\n\tcase EIO:\n\t\treturn (LIBUSB_ERROR_IO);\n\tcase EACCES:\n\t\treturn (LIBUSB_ERROR_ACCESS);\n\tcase ENOENT:\n\t\treturn (LIBUSB_ERROR_NO_DEVICE);\n\tcase ENOMEM:\n\t\treturn (LIBUSB_ERROR_NO_MEM);\n\tcase ETIMEDOUT:\n\t\treturn (LIBUSB_ERROR_TIMEOUT);\n\t}\n\n\treturn (LIBUSB_ERROR_OTHER);\n}\n\nint\n_cache_active_config_descriptor(struct libusb_device *dev)\n{\n\tstruct device_priv *dpriv = (struct device_priv *)dev->os_priv;\n\tstruct usb_device_cdesc udc;\n\tstruct usb_device_fdesc udf;\n\tunsigned char* buf;\n\tint fd, len, err;\n\n\tif ((fd = _bus_open(dev->bus_number)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tusbi_dbg(\"fd %d, addr %d\", fd, dev->device_address);\n\n\tudc.udc_bus = dev->bus_number;\n\tudc.udc_addr = dev->device_address;\n\tudc.udc_config_index = USB_CURRENT_CONFIG_INDEX;\n\tif (ioctl(fd, USB_DEVICE_GET_CDESC, &udc) < 0) {\n\t\terr = errno;\n\t\tclose(fd);\n\t\treturn _errno_to_libusb(errno);\n\t}\n\n\tusbi_dbg(\"active bLength %d\", udc.udc_desc.bLength);\n\n\tlen = UGETW(udc.udc_desc.wTotalLength);\n\tbuf = malloc(len);\n\tif (buf == NULL)\n\t\treturn (LIBUSB_ERROR_NO_MEM);\n\n\tudf.udf_bus = dev->bus_number;\n\tudf.udf_addr = dev->device_address;\n\tudf.udf_config_index = udc.udc_config_index;\n\tudf.udf_size = len;\n\tudf.udf_data = buf;\n\n\tusbi_dbg(\"index %d, len %d\", udf.udf_config_index, len);\n\n\tif (ioctl(fd, USB_DEVICE_GET_FDESC, &udf) < 0) {\n\t\terr = errno;\n\t\tclose(fd);\n\t\tfree(buf);\n\t\treturn _errno_to_libusb(err);\n\t}\n\tclose(fd);\n\n\tif (dpriv->cdesc)\n\t\tfree(dpriv->cdesc);\n\tdpriv->cdesc = buf;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\n_sync_control_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer;\n\tstruct libusb_control_setup *setup;\n\tstruct device_priv *dpriv;\n\tstruct usb_ctl_request req;\n\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tdpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv;\n\tsetup = (struct libusb_control_setup *)transfer->buffer;\n\n\tusbi_dbg(\"type %x request %x value %x index %d length %d timeout %d\",\n\t    setup->bmRequestType, setup->bRequest,\n\t    libusb_le16_to_cpu(setup->wValue),\n\t    libusb_le16_to_cpu(setup->wIndex),\n\t    libusb_le16_to_cpu(setup->wLength), transfer->timeout);\n\n\treq.ucr_addr = transfer->dev_handle->dev->device_address;\n\treq.ucr_request.bmRequestType = setup->bmRequestType;\n\treq.ucr_request.bRequest = setup->bRequest;\n\t/* Don't use USETW, libusb already deals with the endianness */\n\t(*(uint16_t *)req.ucr_request.wValue) = setup->wValue;\n\t(*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex;\n\t(*(uint16_t *)req.ucr_request.wLength) = setup->wLength;\n\treq.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE;\n\n\tif ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0)\n\t\treq.ucr_flags = USBD_SHORT_XFER_OK;\n\n\tif (dpriv->devname == NULL) {\n\t\t/*\n\t\t * XXX If the device is not attached to ugen(4) it is\n\t\t * XXX still possible to submit a control transfer but\n\t\t * XXX with the default timeout only.\n\t\t */\n\t\tint fd, err;\n\n\t\tif ((fd = _bus_open(transfer->dev_handle->dev->bus_number)) < 0)\n\t\t\treturn _errno_to_libusb(errno);\n\n\t\tif ((ioctl(fd, USB_REQUEST, &req)) < 0) {\n\t\t\terr = errno;\n\t\t\tclose(fd);\n\t\t\treturn _errno_to_libusb(err);\n\t\t}\n\t\tclose(fd);\n\t} else {\n\t\tif ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0)\n\t\t\treturn _errno_to_libusb(errno);\n\n\t\tif ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0)\n\t\t\treturn _errno_to_libusb(errno);\n\t}\n\n\titransfer->transferred = req.ucr_actlen;\n\n\tusbi_dbg(\"transferred %d\", itransfer->transferred);\n\n\treturn (0);\n}\n\nint\n_access_endpoint(struct libusb_transfer *transfer)\n{\n\tstruct handle_priv *hpriv;\n\tstruct device_priv *dpriv;\n\tchar devnode[16];\n\tint fd, endpt;\n\tmode_t mode;\n\n\thpriv = (struct handle_priv *)transfer->dev_handle->os_priv;\n\tdpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv;\n\n\tendpt = UE_GET_ADDR(transfer->endpoint);\n\tmode = IS_XFERIN(transfer) ? O_RDONLY : O_WRONLY;\n\n\tusbi_dbg(\"endpoint %d mode %d\", endpt, mode);\n\n\tif (hpriv->endpoints[endpt] < 0) {\n\t\t/* Pick the right endpoint node */\n\t\tsnprintf(devnode, sizeof(devnode), DEVPATH \"%s.%02d\",\n\t\t    dpriv->devname, endpt);\n\n\t\t/* We may need to read/write to the same endpoint later. */\n\t\tif (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO))\n\t\t\tif ((fd = open(devnode, mode)) < 0)\n\t\t\t\treturn (-1);\n\n\t\thpriv->endpoints[endpt] = fd;\n\t}\n\n\treturn (hpriv->endpoints[endpt]);\n}\n\nint\n_sync_gen_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer;\n\tstruct device_priv *dpriv;\n\tint fd, nr = 1;\n\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tdpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv;\n\n\tif (dpriv->devname == NULL)\n\t\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n\n\t/*\n\t * Bulk, Interrupt or Isochronous transfer depends on the\n\t * endpoint and thus the node to open.\n\t */\n\tif ((fd = _access_endpoint(transfer)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tif ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\tif (IS_XFERIN(transfer)) {\n\t\tif ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0)\n\t\t\tif ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0)\n\t\t\t\treturn _errno_to_libusb(errno);\n\n\t\tnr = read(fd, transfer->buffer, transfer->length);\n\t} else {\n\t\tnr = write(fd, transfer->buffer, transfer->length);\n\t}\n\n\tif (nr < 0)\n\t\treturn _errno_to_libusb(errno);\n\n\titransfer->transferred = nr;\n\n\treturn (0);\n}\n\nint\n_bus_open(int number)\n{\n\tchar busnode[16];\n\n\tsnprintf(busnode, sizeof(busnode), USBDEV \"%d\", number);\n\n\treturn open(busnode, O_RDWR);\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.c",
    "content": "/*\n * poll_posix: poll compatibility wrapper for POSIX systems\n * Copyright © 2013 RealVNC Ltd.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n */\n\n#include <config.h>\n\n#include <unistd.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"libusbi.h\"\n\nint usbi_pipe(int pipefd[2])\n{\n\tint ret = pipe(pipefd);\n\tif (ret != 0) {\n\t\treturn ret;\n\t}\n\tret = fcntl(pipefd[1], F_GETFL);\n\tif (ret == -1) {\n\t\tusbi_dbg(\"Failed to get pipe fd flags: %d\", errno);\n\t\tgoto err_close_pipe;\n\t}\n\tret = fcntl(pipefd[1], F_SETFL, ret | O_NONBLOCK);\n\tif (ret != 0) {\n\t\tusbi_dbg(\"Failed to set non-blocking on new pipe: %d\", errno);\n\t\tgoto err_close_pipe;\n\t}\n\n\treturn 0;\n\nerr_close_pipe:\n\tusbi_close(pipefd[0]);\n\tusbi_close(pipefd[1]);\n\treturn ret;\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.h",
    "content": "#ifndef LIBUSB_POLL_POSIX_H\n#define LIBUSB_POLL_POSIX_H\n\n#define usbi_write write\n#define usbi_read read\n#define usbi_close close\n#define usbi_poll poll\n\nint usbi_pipe(int pipefd[2]);\n\n#endif /* LIBUSB_POLL_POSIX_H */\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.c",
    "content": "/*\n * poll_windows: poll compatibility wrapper for Windows\n * Copyright © 2012-2013 RealVNC Ltd.\n * Copyright © 2009-2010 Pete Batard <pete@akeo.ie>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of poll implementation from libusb-win32, by Stephan Meyer et al.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n */\n\n/*\n * poll() and pipe() Windows compatibility layer for libusb 1.0\n *\n * The way this layer works is by using OVERLAPPED with async I/O transfers, as\n * OVERLAPPED have an associated event which is flagged for I/O completion.\n *\n * For USB pollable async I/O, you would typically:\n * - obtain a Windows HANDLE to a file or device that has been opened in\n *   OVERLAPPED mode\n * - call usbi_create_fd with this handle to obtain a custom fd.\n *   Note that if you need simultaneous R/W access, you need to call create_fd\n *   twice, once in RW_READ and once in RW_WRITE mode to obtain 2 separate\n *   pollable fds\n * - leave the core functions call the poll routine and flag POLLIN/POLLOUT\n *\n * The pipe pollable synchronous I/O works using the overlapped event associated\n * with a fake pipe. The read/write functions are only meant to be used in that\n * context.\n */\n#include <config.h>\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"libusbi.h\"\n\n// Uncomment to debug the polling layer\n//#define DEBUG_POLL_WINDOWS\n#if defined(DEBUG_POLL_WINDOWS)\n#define poll_dbg usbi_dbg\n#else\n// MSVC++ < 2005 cannot use a variadic argument and non MSVC\n// compilers produce warnings if parenthesis are omitted.\n#if defined(_MSC_VER) && (_MSC_VER < 1400)\n#define poll_dbg\n#else\n#define poll_dbg(...)\n#endif\n#endif\n\n#if defined(_PREFAST_)\n#pragma warning(disable:28719)\n#endif\n\n#define CHECK_INIT_POLLING do {if(!is_polling_set) init_polling();} while(0)\n\n// public fd data\nconst struct winfd INVALID_WINFD = {-1, INVALID_HANDLE_VALUE, NULL, NULL, NULL, RW_NONE};\nstruct winfd poll_fd[MAX_FDS];\n// internal fd data\nstruct {\n\tCRITICAL_SECTION mutex; // lock for fds\n\t// Additional variables for XP CancelIoEx partial emulation\n\tHANDLE original_handle;\n\tDWORD thread_id;\n} _poll_fd[MAX_FDS];\n\n// globals\nBOOLEAN is_polling_set = FALSE;\nLONG pipe_number = 0;\nstatic volatile LONG compat_spinlock = 0;\n\n#if !defined(_WIN32_WCE)\n// CancelIoEx, available on Vista and later only, provides the ability to cancel\n// a single transfer (OVERLAPPED) when used. As it may not be part of any of the\n// platform headers, we hook into the Kernel32 system DLL directly to seek it.\nstatic BOOL (__stdcall *pCancelIoEx)(HANDLE, LPOVERLAPPED) = NULL;\n#define Use_Duplicate_Handles (pCancelIoEx == NULL)\n\nstatic inline void setup_cancel_io(void)\n{\n\tHMODULE hKernel32 = GetModuleHandleA(\"KERNEL32\");\n\tif (hKernel32 != NULL) {\n\t\tpCancelIoEx = (BOOL (__stdcall *)(HANDLE,LPOVERLAPPED))\n\t\t\tGetProcAddress(hKernel32, \"CancelIoEx\");\n\t}\n\tusbi_dbg(\"Will use CancelIo%s for I/O cancellation\",\n\t\tUse_Duplicate_Handles?\"\":\"Ex\");\n}\n\nstatic inline BOOL cancel_io(int _index)\n{\n\tif ((_index < 0) || (_index >= MAX_FDS)) {\n\t\treturn FALSE;\n\t}\n\n\tif ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE)\n\t  || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) {\n\t\treturn TRUE;\n\t}\n\tif (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) {\n\t\t// Cancel outstanding transfer via the specific callback\n\t\t(*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer);\n\t\treturn TRUE;\n\t}\n\tif (pCancelIoEx != NULL) {\n\t\treturn (*pCancelIoEx)(poll_fd[_index].handle, poll_fd[_index].overlapped);\n\t}\n\tif (_poll_fd[_index].thread_id == GetCurrentThreadId()) {\n\t\treturn CancelIo(poll_fd[_index].handle);\n\t}\n\tusbi_warn(NULL, \"Unable to cancel I/O that was started from another thread\");\n\treturn FALSE;\n}\n#else\n#define Use_Duplicate_Handles FALSE\n\nstatic __inline void setup_cancel_io()\n{\n\t// No setup needed on WinCE\n}\n\nstatic __inline BOOL cancel_io(int _index)\n{\n\tif ((_index < 0) || (_index >= MAX_FDS)) {\n\t\treturn FALSE;\n\t}\n\tif ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE)\n\t  || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) {\n\t\treturn TRUE;\n\t}\n\tif (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) {\n\t\t// Cancel outstanding transfer via the specific callback\n\t\t(*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer);\n\t}\n\treturn TRUE;\n}\n#endif\n\n// Init\nvoid init_polling(void)\n{\n\tint i;\n\n\twhile (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) {\n\t\tSleepEx(0, TRUE);\n\t}\n\tif (!is_polling_set) {\n\t\tsetup_cancel_io();\n\t\tfor (i=0; i<MAX_FDS; i++) {\n\t\t\tpoll_fd[i] = INVALID_WINFD;\n\t\t\t_poll_fd[i].original_handle = INVALID_HANDLE_VALUE;\n\t\t\t_poll_fd[i].thread_id = 0;\n\t\t\tInitializeCriticalSection(&_poll_fd[i].mutex);\n\t\t}\n\t\tis_polling_set = TRUE;\n\t}\n\tInterlockedExchange((LONG *)&compat_spinlock, 0);\n}\n\n// Internal function to retrieve the table index (and lock the fd mutex)\nstatic int _fd_to_index_and_lock(int fd)\n{\n\tint i;\n\n\tif (fd < 0)\n\t\treturn -1;\n\n\tfor (i=0; i<MAX_FDS; i++) {\n\t\tif (poll_fd[i].fd == fd) {\n\t\t\tEnterCriticalSection(&_poll_fd[i].mutex);\n\t\t\t// fd might have changed before we got to critical\n\t\t\tif (poll_fd[i].fd != fd) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\nstatic OVERLAPPED *create_overlapped(void)\n{\n\tOVERLAPPED *overlapped = (OVERLAPPED*) calloc(1, sizeof(OVERLAPPED));\n\tif (overlapped == NULL) {\n\t\treturn NULL;\n\t}\n\toverlapped->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);\n\tif(overlapped->hEvent == NULL) {\n\t\tfree (overlapped);\n\t\treturn NULL;\n\t}\n\treturn overlapped;\n}\n\nstatic void free_overlapped(OVERLAPPED *overlapped)\n{\n\tif (overlapped == NULL)\n\t\treturn;\n\n\tif ( (overlapped->hEvent != 0)\n\t  && (overlapped->hEvent != INVALID_HANDLE_VALUE) ) {\n\t\tCloseHandle(overlapped->hEvent);\n\t}\n\tfree(overlapped);\n}\n\nvoid exit_polling(void)\n{\n\tint i;\n\n\twhile (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) {\n\t\tSleepEx(0, TRUE);\n\t}\n\tif (is_polling_set) {\n\t\tis_polling_set = FALSE;\n\n\t\tfor (i=0; i<MAX_FDS; i++) {\n\t\t\t// Cancel any async I/O (handle can be invalid)\n\t\t\tcancel_io(i);\n\t\t\t// If anything was pending on that I/O, it should be\n\t\t\t// terminating, and we should be able to access the fd\n\t\t\t// mutex lock before too long\n\t\t\tEnterCriticalSection(&_poll_fd[i].mutex);\n\t\t\tfree_overlapped(poll_fd[i].overlapped);\n\t\t\tif (Use_Duplicate_Handles) {\n\t\t\t\t// Close duplicate handle\n\t\t\t\tif (_poll_fd[i].original_handle != INVALID_HANDLE_VALUE) {\n\t\t\t\t\tCloseHandle(poll_fd[i].handle);\n\t\t\t\t}\n\t\t\t}\n\t\t\tpoll_fd[i] = INVALID_WINFD;\n\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\tDeleteCriticalSection(&_poll_fd[i].mutex);\n\t\t}\n\t}\n\tInterlockedExchange((LONG *)&compat_spinlock, 0);\n}\n\n/*\n * Create a fake pipe.\n * As libusb only uses pipes for signaling, all we need from a pipe is an\n * event. To that extent, we create a single wfd and overlapped as a means\n * to access that event.\n */\nint usbi_pipe(int filedes[2])\n{\n\tint i;\n\tOVERLAPPED* overlapped;\n\n\tCHECK_INIT_POLLING;\n\n\toverlapped = create_overlapped();\n\n\tif (overlapped == NULL) {\n\t\treturn -1;\n\t}\n\t// The overlapped must have status pending for signaling to work in poll\n\toverlapped->Internal = STATUS_PENDING;\n\toverlapped->InternalHigh = 0;\n\n\tfor (i=0; i<MAX_FDS; i++) {\n\t\tif (poll_fd[i].fd < 0) {\n\t\t\tEnterCriticalSection(&_poll_fd[i].mutex);\n\t\t\t// fd might have been allocated before we got to critical\n\t\t\tif (poll_fd[i].fd >= 0) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Use index as the unique fd number\n\t\t\tpoll_fd[i].fd = i;\n\t\t\t// Read end of the \"pipe\"\n\t\t\tfiledes[0] = poll_fd[i].fd;\n\t\t\t// We can use the same handle for both ends\n\t\t\tfiledes[1] = filedes[0];\n\n\t\t\tpoll_fd[i].handle = DUMMY_HANDLE;\n\t\t\tpoll_fd[i].overlapped = overlapped;\n\t\t\t// There's no polling on the write end, so we just use READ for our needs\n\t\t\tpoll_fd[i].rw = RW_READ;\n\t\t\t_poll_fd[i].original_handle = INVALID_HANDLE_VALUE;\n\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\treturn 0;\n\t\t}\n\t}\n\tfree_overlapped(overlapped);\n\treturn -1;\n}\n\n/*\n * Create both an fd and an OVERLAPPED from an open Windows handle, so that\n * it can be used with our polling function\n * The handle MUST support overlapped transfers (usually requires CreateFile\n * with FILE_FLAG_OVERLAPPED)\n * Return a pollable file descriptor struct, or INVALID_WINFD on error\n *\n * Note that the fd returned by this function is a per-transfer fd, rather\n * than a per-session fd and cannot be used for anything else but our\n * custom functions (the fd itself points to the NUL: device)\n * if you plan to do R/W on the same handle, you MUST create 2 fds: one for\n * read and one for write. Using a single R/W fd is unsupported and will\n * produce unexpected results\n */\nstruct winfd usbi_create_fd(HANDLE handle, int access_mode, struct usbi_transfer *itransfer, cancel_transfer *cancel_fn)\n{\n\tint i;\n\tstruct winfd wfd = INVALID_WINFD;\n\tOVERLAPPED* overlapped = NULL;\n\n\tCHECK_INIT_POLLING;\n\n\tif ((handle == 0) || (handle == INVALID_HANDLE_VALUE)) {\n\t\treturn INVALID_WINFD;\n\t}\n\n\twfd.itransfer = itransfer;\n\twfd.cancel_fn = cancel_fn;\n\n\tif ((access_mode != RW_READ) && (access_mode != RW_WRITE)) {\n\t\tusbi_warn(NULL, \"only one of RW_READ or RW_WRITE are supported. \"\n\t\t\t\"If you want to poll for R/W simultaneously, create multiple fds from the same handle.\");\n\t\treturn INVALID_WINFD;\n\t}\n\tif (access_mode == RW_READ) {\n\t\twfd.rw = RW_READ;\n\t} else {\n\t\twfd.rw = RW_WRITE;\n\t}\n\n\toverlapped = create_overlapped();\n\tif(overlapped == NULL) {\n\t\treturn INVALID_WINFD;\n\t}\n\n\tfor (i=0; i<MAX_FDS; i++) {\n\t\tif (poll_fd[i].fd < 0) {\n\t\t\tEnterCriticalSection(&_poll_fd[i].mutex);\n\t\t\t// fd might have been removed before we got to critical\n\t\t\tif (poll_fd[i].fd >= 0) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Use index as the unique fd number\n\t\t\twfd.fd = i;\n\t\t\t// Attempt to emulate some of the CancelIoEx behaviour on platforms\n\t\t\t// that don't have it\n\t\t\tif (Use_Duplicate_Handles) {\n\t\t\t\t_poll_fd[i].thread_id = GetCurrentThreadId();\n\t\t\t\tif (!DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(),\n\t\t\t\t\t&wfd.handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) {\n\t\t\t\t\tusbi_dbg(\"could not duplicate handle for CancelIo - using original one\");\n\t\t\t\t\twfd.handle = handle;\n\t\t\t\t\t// Make sure we won't close the original handle on fd deletion then\n\t\t\t\t\t_poll_fd[i].original_handle = INVALID_HANDLE_VALUE;\n\t\t\t\t} else {\n\t\t\t\t\t_poll_fd[i].original_handle = handle;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twfd.handle = handle;\n\t\t\t}\n\t\t\twfd.overlapped = overlapped;\n\t\t\tmemcpy(&poll_fd[i], &wfd, sizeof(struct winfd));\n\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\treturn wfd;\n\t\t}\n\t}\n\tfree_overlapped(overlapped);\n\treturn INVALID_WINFD;\n}\n\nstatic void _free_index(int _index)\n{\n\t// Cancel any async IO (Don't care about the validity of our handles for this)\n\tcancel_io(_index);\n\t// close the duplicate handle (if we have an actual duplicate)\n\tif (Use_Duplicate_Handles) {\n\t\tif (_poll_fd[_index].original_handle != INVALID_HANDLE_VALUE) {\n\t\t\tCloseHandle(poll_fd[_index].handle);\n\t\t}\n\t\t_poll_fd[_index].original_handle = INVALID_HANDLE_VALUE;\n\t\t_poll_fd[_index].thread_id = 0;\n\t}\n\tfree_overlapped(poll_fd[_index].overlapped);\n\tpoll_fd[_index] = INVALID_WINFD;\n}\n\n/*\n * Release a pollable file descriptor.\n *\n * Note that the associated Windows handle is not closed by this call\n */\nvoid usbi_free_fd(struct winfd *wfd)\n{\n\tint _index;\n\n\tCHECK_INIT_POLLING;\n\n\t_index = _fd_to_index_and_lock(wfd->fd);\n\tif (_index < 0) {\n\t\treturn;\n\t}\n\t_free_index(_index);\n\t*wfd = INVALID_WINFD;\n\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n}\n\n/*\n * The functions below perform various conversions between fd, handle and OVERLAPPED\n */\nstruct winfd fd_to_winfd(int fd)\n{\n\tint i;\n\tstruct winfd wfd;\n\n\tCHECK_INIT_POLLING;\n\n\tif (fd < 0)\n\t\treturn INVALID_WINFD;\n\n\tfor (i=0; i<MAX_FDS; i++) {\n\t\tif (poll_fd[i].fd == fd) {\n\t\t\tEnterCriticalSection(&_poll_fd[i].mutex);\n\t\t\t// fd might have been deleted before we got to critical\n\t\t\tif (poll_fd[i].fd != fd) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmemcpy(&wfd, &poll_fd[i], sizeof(struct winfd));\n\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\treturn wfd;\n\t\t}\n\t}\n\treturn INVALID_WINFD;\n}\n\nstruct winfd handle_to_winfd(HANDLE handle)\n{\n\tint i;\n\tstruct winfd wfd;\n\n\tCHECK_INIT_POLLING;\n\n\tif ((handle == 0) || (handle == INVALID_HANDLE_VALUE))\n\t\treturn INVALID_WINFD;\n\n\tfor (i=0; i<MAX_FDS; i++) {\n\t\tif (poll_fd[i].handle == handle) {\n\t\t\tEnterCriticalSection(&_poll_fd[i].mutex);\n\t\t\t// fd might have been deleted before we got to critical\n\t\t\tif (poll_fd[i].handle != handle) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmemcpy(&wfd, &poll_fd[i], sizeof(struct winfd));\n\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\treturn wfd;\n\t\t}\n\t}\n\treturn INVALID_WINFD;\n}\n\nstruct winfd overlapped_to_winfd(OVERLAPPED* overlapped)\n{\n\tint i;\n\tstruct winfd wfd;\n\n\tCHECK_INIT_POLLING;\n\n\tif (overlapped == NULL)\n\t\treturn INVALID_WINFD;\n\n\tfor (i=0; i<MAX_FDS; i++) {\n\t\tif (poll_fd[i].overlapped == overlapped) {\n\t\t\tEnterCriticalSection(&_poll_fd[i].mutex);\n\t\t\t// fd might have been deleted before we got to critical\n\t\t\tif (poll_fd[i].overlapped != overlapped) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmemcpy(&wfd, &poll_fd[i], sizeof(struct winfd));\n\t\t\tLeaveCriticalSection(&_poll_fd[i].mutex);\n\t\t\treturn wfd;\n\t\t}\n\t}\n\treturn INVALID_WINFD;\n}\n\n/*\n * POSIX poll equivalent, using Windows OVERLAPPED\n * Currently, this function only accepts one of POLLIN or POLLOUT per fd\n * (but you can create multiple fds from the same handle for read and write)\n */\nint usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout)\n{\n\tunsigned i;\n\tint _index, object_index, triggered;\n\tHANDLE *handles_to_wait_on;\n\tint *handle_to_index;\n\tDWORD nb_handles_to_wait_on = 0;\n\tDWORD ret;\n\n\tCHECK_INIT_POLLING;\n\n\ttriggered = 0;\n\thandles_to_wait_on = (HANDLE*) calloc(nfds+1, sizeof(HANDLE));\t// +1 for fd_update\n\thandle_to_index = (int*) calloc(nfds, sizeof(int));\n\tif ((handles_to_wait_on == NULL) || (handle_to_index == NULL)) {\n\t\terrno = ENOMEM;\n\t\ttriggered = -1;\n\t\tgoto poll_exit;\n\t}\n\n\tfor (i = 0; i < nfds; ++i) {\n\t\tfds[i].revents = 0;\n\n\t\t// Only one of POLLIN or POLLOUT can be selected with this version of poll (not both)\n\t\tif ((fds[i].events & ~POLLIN) && (!(fds[i].events & POLLOUT))) {\n\t\t\tfds[i].revents |= POLLERR;\n\t\t\terrno = EACCES;\n\t\t\tusbi_warn(NULL, \"unsupported set of events\");\n\t\t\ttriggered = -1;\n\t\t\tgoto poll_exit;\n\t\t}\n\n\t\t_index = _fd_to_index_and_lock(fds[i].fd);\n\t\tpoll_dbg(\"fd[%d]=%d: (overlapped=%p) got events %04X\", i, poll_fd[_index].fd, poll_fd[_index].overlapped, fds[i].events);\n\n\t\tif ( (_index < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE)\n\t\t  || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL)) {\n\t\t\tfds[i].revents |= POLLNVAL | POLLERR;\n\t\t\terrno = EBADF;\n\t\t\tif (_index >= 0) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\t\t\t}\n\t\t\tusbi_warn(NULL, \"invalid fd\");\n\t\t\ttriggered = -1;\n\t\t\tgoto poll_exit;\n\t\t}\n\n\t\t// IN or OUT must match our fd direction\n\t\tif ((fds[i].events & POLLIN) && (poll_fd[_index].rw != RW_READ)) {\n\t\t\tfds[i].revents |= POLLNVAL | POLLERR;\n\t\t\terrno = EBADF;\n\t\t\tusbi_warn(NULL, \"attempted POLLIN on fd without READ access\");\n\t\t\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\t\t\ttriggered = -1;\n\t\t\tgoto poll_exit;\n\t\t}\n\n\t\tif ((fds[i].events & POLLOUT) && (poll_fd[_index].rw != RW_WRITE)) {\n\t\t\tfds[i].revents |= POLLNVAL | POLLERR;\n\t\t\terrno = EBADF;\n\t\t\tusbi_warn(NULL, \"attempted POLLOUT on fd without WRITE access\");\n\t\t\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\t\t\ttriggered = -1;\n\t\t\tgoto poll_exit;\n\t\t}\n\n\t\t// The following macro only works if overlapped I/O was reported pending\n\t\tif ( (HasOverlappedIoCompleted(poll_fd[_index].overlapped))\n\t\t  || (HasOverlappedIoCompletedSync(poll_fd[_index].overlapped)) ) {\n\t\t\tpoll_dbg(\"  completed\");\n\t\t\t// checks above should ensure this works:\n\t\t\tfds[i].revents = fds[i].events;\n\t\t\ttriggered++;\n\t\t} else {\n\t\t\thandles_to_wait_on[nb_handles_to_wait_on] = poll_fd[_index].overlapped->hEvent;\n\t\t\thandle_to_index[nb_handles_to_wait_on] = i;\n\t\t\tnb_handles_to_wait_on++;\n\t\t}\n\t\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\t}\n\n\t// If nothing was triggered, wait on all fds that require it\n\tif ((timeout != 0) && (triggered == 0) && (nb_handles_to_wait_on != 0)) {\n\t\tif (timeout < 0) {\n\t\t\tpoll_dbg(\"starting infinite wait for %u handles...\", (unsigned int)nb_handles_to_wait_on);\n\t\t} else {\n\t\t\tpoll_dbg(\"starting %d ms wait for %u handles...\", timeout, (unsigned int)nb_handles_to_wait_on);\n\t\t}\n\t\tret = WaitForMultipleObjects(nb_handles_to_wait_on, handles_to_wait_on,\n\t\t\tFALSE, (timeout<0)?INFINITE:(DWORD)timeout);\n\t\tobject_index = ret-WAIT_OBJECT_0;\n\t\tif ((object_index >= 0) && ((DWORD)object_index < nb_handles_to_wait_on)) {\n\t\t\tpoll_dbg(\"  completed after wait\");\n\t\t\ti = handle_to_index[object_index];\n\t\t\t_index = _fd_to_index_and_lock(fds[i].fd);\n\t\t\tfds[i].revents = fds[i].events;\n\t\t\ttriggered++;\n\t\t\tif (_index >= 0) {\n\t\t\t\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\t\t\t}\n\t\t} else if (ret == WAIT_TIMEOUT) {\n\t\t\tpoll_dbg(\"  timed out\");\n\t\t\ttriggered = 0;\t// 0 = timeout\n\t\t} else {\n\t\t\terrno = EIO;\n\t\t\ttriggered = -1;\t// error\n\t\t}\n\t}\n\npoll_exit:\n\tif (handles_to_wait_on != NULL) {\n\t\tfree(handles_to_wait_on);\n\t}\n\tif (handle_to_index != NULL) {\n\t\tfree(handle_to_index);\n\t}\n\treturn triggered;\n}\n\n/*\n * close a fake pipe fd\n */\nint usbi_close(int fd)\n{\n\tint _index;\n\tint r = -1;\n\n\tCHECK_INIT_POLLING;\n\n\t_index = _fd_to_index_and_lock(fd);\n\n\tif (_index < 0) {\n\t\terrno = EBADF;\n\t} else {\n\t\tfree_overlapped(poll_fd[_index].overlapped);\n\t\tpoll_fd[_index] = INVALID_WINFD;\n\t\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\t}\n\treturn r;\n}\n\n/*\n * synchronous write for fake \"pipe\" signaling\n */\nssize_t usbi_write(int fd, const void *buf, size_t count)\n{\n\tint _index;\n\tUNUSED(buf);\n\n\tCHECK_INIT_POLLING;\n\n\tif (count != sizeof(unsigned char)) {\n\t\tusbi_err(NULL, \"this function should only used for signaling\");\n\t\treturn -1;\n\t}\n\n\t_index = _fd_to_index_and_lock(fd);\n\n\tif ( (_index < 0) || (poll_fd[_index].overlapped == NULL) ) {\n\t\terrno = EBADF;\n\t\tif (_index >= 0) {\n\t\t\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\t\t}\n\t\treturn -1;\n\t}\n\n\tpoll_dbg(\"set pipe event (fd = %d, thread = %08X)\", _index, (unsigned int)GetCurrentThreadId());\n\tSetEvent(poll_fd[_index].overlapped->hEvent);\n\tpoll_fd[_index].overlapped->Internal = STATUS_WAIT_0;\n\t// If two threads write on the pipe at the same time, we need to\n\t// process two separate reads => use the overlapped as a counter\n\tpoll_fd[_index].overlapped->InternalHigh++;\n\n\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\treturn sizeof(unsigned char);\n}\n\n/*\n * synchronous read for fake \"pipe\" signaling\n */\nssize_t usbi_read(int fd, void *buf, size_t count)\n{\n\tint _index;\n\tssize_t r = -1;\n\tUNUSED(buf);\n\n\tCHECK_INIT_POLLING;\n\n\tif (count != sizeof(unsigned char)) {\n\t\tusbi_err(NULL, \"this function should only used for signaling\");\n\t\treturn -1;\n\t}\n\n\t_index = _fd_to_index_and_lock(fd);\n\n\tif (_index < 0) {\n\t\terrno = EBADF;\n\t\treturn -1;\n\t}\n\n\tif (WaitForSingleObject(poll_fd[_index].overlapped->hEvent, INFINITE) != WAIT_OBJECT_0) {\n\t\tusbi_warn(NULL, \"waiting for event failed: %u\", (unsigned int)GetLastError());\n\t\terrno = EIO;\n\t\tgoto out;\n\t}\n\n\tpoll_dbg(\"clr pipe event (fd = %d, thread = %08X)\", _index, (unsigned int)GetCurrentThreadId());\n\tpoll_fd[_index].overlapped->InternalHigh--;\n\t// Don't reset unless we don't have any more events to process\n\tif (poll_fd[_index].overlapped->InternalHigh <= 0) {\n\t\tResetEvent(poll_fd[_index].overlapped->hEvent);\n\t\tpoll_fd[_index].overlapped->Internal = STATUS_PENDING;\n\t}\n\n\tr = sizeof(unsigned char);\n\nout:\n\tLeaveCriticalSection(&_poll_fd[_index].mutex);\n\treturn r;\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.h",
    "content": "/*\n * Windows compat: POSIX compatibility wrapper\n * Copyright © 2012-2013 RealVNC Ltd.\n * Copyright © 2009-2010 Pete Batard <pete@akeo.ie>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of poll implementation from libusb-win32, by Stephan Meyer et al.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n *\n */\n#pragma once\n\n#if defined(_MSC_VER)\n// disable /W4 MSVC warnings that are benign\n#pragma warning(disable:4127) // conditional expression is constant\n#endif\n\n// Handle synchronous completion through the overlapped structure\n#if !defined(STATUS_REPARSE)\t// reuse the REPARSE status code\n#define STATUS_REPARSE ((LONG)0x00000104L)\n#endif\n#define STATUS_COMPLETED_SYNCHRONOUSLY\tSTATUS_REPARSE\n#if defined(_WIN32_WCE)\n// WinCE doesn't have a HasOverlappedIoCompleted() macro, so attempt to emulate it\n#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING)\n#endif\n#define HasOverlappedIoCompletedSync(lpOverlapped)\t(((DWORD)(lpOverlapped)->Internal) == STATUS_COMPLETED_SYNCHRONOUSLY)\n\n#define DUMMY_HANDLE ((HANDLE)(LONG_PTR)-2)\n\n/* Windows versions */\nenum windows_version {\n\tWINDOWS_CE = -2,\n\tWINDOWS_UNDEFINED = -1,\n\tWINDOWS_UNSUPPORTED = 0,\n\tWINDOWS_XP = 0x51,\n\tWINDOWS_2003 = 0x52,\t// Also XP x64\n\tWINDOWS_VISTA = 0x60,\n\tWINDOWS_7 = 0x61,\n\tWINDOWS_8 = 0x62,\n\tWINDOWS_8_1_OR_LATER = 0x63,\n\tWINDOWS_MAX\n};\nextern int windows_version;\n\n#define MAX_FDS     256\n\n#define POLLIN      0x0001    /* There is data to read */\n#define POLLPRI     0x0002    /* There is urgent data to read */\n#define POLLOUT     0x0004    /* Writing now will not block */\n#define POLLERR     0x0008    /* Error condition */\n#define POLLHUP     0x0010    /* Hung up */\n#define POLLNVAL    0x0020    /* Invalid request: fd not open */\n\nstruct pollfd {\n    int fd;           /* file descriptor */\n    short events;     /* requested events */\n    short revents;    /* returned events */\n};\n\n// access modes\nenum rw_type {\n\tRW_NONE,\n\tRW_READ,\n\tRW_WRITE,\n};\n\n// fd struct that can be used for polling on Windows\ntypedef int cancel_transfer(struct usbi_transfer *itransfer);\n\nstruct winfd {\n\tint fd;\t\t\t\t\t\t\t// what's exposed to libusb core\n\tHANDLE handle;\t\t\t\t\t// what we need to attach overlapped to the I/O op, so we can poll it\n\tOVERLAPPED* overlapped;\t\t\t// what will report our I/O status\n\tstruct usbi_transfer *itransfer;\t\t// Associated transfer, or NULL if completed\n\tcancel_transfer *cancel_fn;\t\t// Function pointer to cancel transfer API\n\tenum rw_type rw;\t\t\t\t// I/O transfer direction: read *XOR* write (NOT BOTH)\n};\nextern const struct winfd INVALID_WINFD;\n\nint usbi_pipe(int pipefd[2]);\nint usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout);\nssize_t usbi_write(int fd, const void *buf, size_t count);\nssize_t usbi_read(int fd, void *buf, size_t count);\nint usbi_close(int fd);\n\nvoid init_polling(void);\nvoid exit_polling(void);\nstruct winfd usbi_create_fd(HANDLE handle, int access_mode, \n\tstruct usbi_transfer *transfer, cancel_transfer *cancel_fn);\nvoid usbi_free_fd(struct winfd* winfd);\nstruct winfd fd_to_winfd(int fd);\nstruct winfd handle_to_winfd(HANDLE handle);\nstruct winfd overlapped_to_winfd(OVERLAPPED* overlapped);\n\n/*\n * Timeval operations\n */\n#if defined(DDKBUILD)\n#include <winsock.h>\t// defines timeval functions on DDK\n#endif\n\n#if !defined(TIMESPEC_TO_TIMEVAL)\n#define TIMESPEC_TO_TIMEVAL(tv, ts) {                   \\\n\t(tv)->tv_sec = (long)(ts)->tv_sec;                  \\\n\t(tv)->tv_usec = (long)(ts)->tv_nsec / 1000;         \\\n}\n#endif\n#if !defined(timersub)\n#define timersub(a, b, result)                          \\\ndo {                                                    \\\n\t(result)->tv_sec = (a)->tv_sec - (b)->tv_sec;       \\\n\t(result)->tv_usec = (a)->tv_usec - (b)->tv_usec;    \\\n\tif ((result)->tv_usec < 0) {                        \\\n\t\t--(result)->tv_sec;                             \\\n\t\t(result)->tv_usec += 1000000;                   \\\n\t}                                                   \\\n} while (0)\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.c",
    "content": "/*\n *\n * Copyright (c) 2016, Oracle and/or its affiliates.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <sys/time.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <strings.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <aio.h>\n#include <libdevinfo.h>\n#include <sys/usb/clients/ugen/usb_ugen.h>\n#include <sys/usb/usba.h>\n#include <sys/pci.h>\n\n#include \"libusbi.h\"\n#include \"sunos_usb.h\"\n\n/*\n * Backend functions\n */\nstatic int sunos_init(struct libusb_context *);\nstatic void sunos_exit(void);\nstatic int sunos_get_device_list(struct libusb_context *,\n    struct discovered_devs **);\nstatic int sunos_open(struct libusb_device_handle *);\nstatic void sunos_close(struct libusb_device_handle *);\nstatic int sunos_get_device_descriptor(struct libusb_device *,\n    uint8_t*, int *);\nstatic int sunos_get_active_config_descriptor(struct libusb_device *,\n    uint8_t*, size_t, int *);\nstatic int sunos_get_config_descriptor(struct libusb_device *, uint8_t,\n    uint8_t*, size_t, int *);\nstatic int sunos_get_configuration(struct libusb_device_handle *, int *);\nstatic int sunos_set_configuration(struct libusb_device_handle *, int);\nstatic int sunos_claim_interface(struct libusb_device_handle *, int);\nstatic int sunos_release_interface(struct libusb_device_handle *, int);\nstatic int sunos_set_interface_altsetting(struct libusb_device_handle *,\n    int, int);\nstatic int sunos_clear_halt(struct libusb_device_handle *, uint8_t);\nstatic int sunos_reset_device(struct libusb_device_handle *);\nstatic void sunos_destroy_device(struct libusb_device *);\nstatic int sunos_submit_transfer(struct usbi_transfer *);\nstatic int sunos_cancel_transfer(struct usbi_transfer *);\nstatic void sunos_clear_transfer_priv(struct usbi_transfer *);\nstatic int sunos_handle_transfer_completion(struct usbi_transfer *);\nstatic int sunos_clock_gettime(int, struct timespec *);\n\n/*\n * Private functions\n */\nstatic int _errno_to_libusb(int);\nstatic int sunos_usb_get_status(int fd);\n\nstatic int sunos_init(struct libusb_context *ctx)\n{\n\treturn (LIBUSB_SUCCESS);\n}\n\nstatic void sunos_exit(void)\n{\n\tusbi_dbg(\"\");\n}\n\nstatic int\nsunos_fill_in_dev_info(di_node_t node, struct libusb_device *dev)\n{\n\tint\tproplen;\n\tint\tn, *addr, *port_prop;\n\tchar\t*phypath;\n\tuint8_t\t*rdata;\n\tstruct libusb_device_descriptor\t*descr;\n\tsunos_dev_priv_t\t*dpriv = (sunos_dev_priv_t *)dev->os_priv;\n\n\t/* Device descriptors */\n\tproplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node,\n\t    \"usb-dev-descriptor\", &rdata);\n\tif (proplen <= 0) {\n\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\n\tdescr = (struct libusb_device_descriptor *)rdata;\n\tbcopy(descr, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE);\n\tdpriv->dev_descr.bcdUSB = libusb_cpu_to_le16(descr->bcdUSB);\n\tdpriv->dev_descr.idVendor = libusb_cpu_to_le16(descr->idVendor);\n\tdpriv->dev_descr.idProduct = libusb_cpu_to_le16(descr->idProduct);\n\tdpriv->dev_descr.bcdDevice = libusb_cpu_to_le16(descr->bcdDevice);\n\n\t/* Raw configuration descriptors */\n\tproplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node,\n\t    \"usb-raw-cfg-descriptors\", &rdata);\n\tif (proplen <= 0) {\n\t\tusbi_dbg(\"can't find raw config descriptors\");\n\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\tdpriv->raw_cfgdescr = calloc(1, proplen);\n\tif (dpriv->raw_cfgdescr == NULL) {\n\t\treturn (LIBUSB_ERROR_NO_MEM);\n\t} else {\n\t\tbcopy(rdata, dpriv->raw_cfgdescr, proplen);\n\t\tdpriv->cfgvalue = ((struct libusb_config_descriptor *)\n\t\t    rdata)->bConfigurationValue;\n\t}\n\n\tn = di_prop_lookup_ints(DDI_DEV_T_ANY, node, \"reg\", &port_prop);\n\n\tif ((n != 1) || (*port_prop <= 0)) {\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\tdev->port_number = *port_prop;\n\n\t/* device physical path */\n\tphypath = di_devfs_path(node);\n\tif (phypath) {\n\t\tdpriv->phypath = strdup(phypath);\n\t\tdi_devfs_path_free(phypath);\n\t} else {\n\t\tfree(dpriv->raw_cfgdescr);\n\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\n\t/* address */\n\tn = di_prop_lookup_ints(DDI_DEV_T_ANY, node, \"assigned-address\", &addr);\n\tif (n != 1 || *addr == 0) {\n\t\tusbi_dbg(\"can't get address\");\n\t} else {\n\t\tdev->device_address = *addr;\n\t}\n\n\t/* speed */\n\tif (di_prop_exists(DDI_DEV_T_ANY, node, \"low-speed\") == 1) {\n\t\tdev->speed = LIBUSB_SPEED_LOW;\n\t} else if (di_prop_exists(DDI_DEV_T_ANY, node, \"high-speed\") == 1) {\n\t\tdev->speed = LIBUSB_SPEED_HIGH;\n\t} else if (di_prop_exists(DDI_DEV_T_ANY, node, \"full-speed\") == 1) {\n\t\tdev->speed = LIBUSB_SPEED_FULL;\n\t} else if (di_prop_exists(DDI_DEV_T_ANY, node, \"super-speed\") == 1) {\n\t\tdev->speed = LIBUSB_SPEED_SUPER;\n\t}\n\n\tusbi_dbg(\"vid=%x pid=%x, path=%s, bus_nmber=0x%x, port_number=%d, \"\n\t    \"speed=%d\", dpriv->dev_descr.idVendor, dpriv->dev_descr.idProduct,\n\t    dpriv->phypath, dev->bus_number, dev->port_number, dev->speed);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\n\nstatic int\nsunos_add_devices(di_devlink_t link, void *arg)\n{\n\tstruct devlink_cbarg\t*largs = (struct devlink_cbarg *)arg;\n\tstruct node_args\t*nargs;\n\tdi_node_t\t\tmyself, pnode;\n\tuint64_t\t\tsession_id = 0;\n\tuint16_t\t\tbdf = 0;\n\tstruct libusb_device\t*dev;\n\tsunos_dev_priv_t\t*devpriv;\n\tconst char\t\t*path, *newpath;\n\tint\t\t\t n, i;\n\tint\t\t\t*addr_prop;\n\tuint8_t\t\t\tbus_number = 0;\n\n\tnargs = (struct node_args *)largs->nargs;\n\tmyself = largs->myself;\n\tif (nargs->last_ugenpath) {\n\t\t/* the same node's links */\n\t\treturn (DI_WALK_CONTINUE);\n\t}\n\n\t/*\n\t * Construct session ID.\n\t * session ID = ...parent hub addr|hub addr|dev addr.\n\t */\n\tpnode = myself;\n\ti = 0;\n\twhile (pnode != DI_NODE_NIL) {\n\t\tif (di_prop_exists(DDI_DEV_T_ANY, pnode, \"root-hub\") == 1) {\n\t\t\t/* walk to root */\n\t\t\tuint32_t *regbuf = NULL;\n\t\t\tuint32_t reg;\n\n\t\t\tn = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, \"reg\",\n\t\t\t    (int **)&regbuf);\n\t\t\treg = regbuf[0];\n\t\t\tbdf = (PCI_REG_BUS_G(reg) << 8) |\n\t\t\t    (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg);\n\t\t\tsession_id |= (bdf << i * 8);\n\n\t\t\t/* same as 'unit-address' property */\n\t\t\tbus_number =\n\t\t\t    (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg);\n\n\t\t\tusbi_dbg(\"device bus address=%s:%x\",\n\t\t\t    di_bus_addr(pnode), bus_number);\n\n\t\t\tbreak;\n\t\t}\n\n\t\t/* usb_addr */\n\t\tn = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode,\n\t\t    \"assigned-address\", &addr_prop);\n\t\tif ((n != 1) || (addr_prop[0] == 0)) {\n\t\t\tusbi_dbg(\"cannot get valid usb_addr\");\n\n\t\t\treturn (DI_WALK_CONTINUE);\n\t\t}\n\n\t\tsession_id |= ((addr_prop[0] & 0xff) << i * 8);\n\t\tif (++i > 7)\n\t\t\tbreak;\n\n\t\tpnode = di_parent_node(pnode);\n\t}\n\n\tpath = di_devlink_path(link);\n\tdev = usbi_get_device_by_session_id(nargs->ctx, session_id);\n\tif (dev == NULL) {\n\t\tdev = usbi_alloc_device(nargs->ctx, session_id);\n\t\tif (dev == NULL) {\n\t\t\tusbi_dbg(\"can't alloc device\");\n\n\t\t\treturn (DI_WALK_TERMINATE);\n\t\t}\n\t\tdevpriv = (sunos_dev_priv_t *)dev->os_priv;\n\t\tif ((newpath = strrchr(path, '/')) == NULL) {\n\t\t\tlibusb_unref_device(dev);\n\n\t\t\treturn (DI_WALK_TERMINATE);\n\t\t}\n\t\tdevpriv->ugenpath = strndup(path, strlen(path) -\n\t\t    strlen(newpath));\n\t\tdev->bus_number = bus_number;\n\n\t\tif (sunos_fill_in_dev_info(myself, dev) != LIBUSB_SUCCESS) {\n\t\t\tlibusb_unref_device(dev);\n\n\t\t\treturn (DI_WALK_TERMINATE);\n\t\t}\n\t\tif (usbi_sanitize_device(dev) < 0) {\n\t\t\tlibusb_unref_device(dev);\n\t\t\tusbi_dbg(\"sanatize failed: \");\n\t\t\treturn (DI_WALK_TERMINATE);\n\t\t}\n\t} else {\n\t\tusbi_dbg(\"Dev %s exists\", path);\n\t}\n\n\tdevpriv = (sunos_dev_priv_t *)dev->os_priv;\n\tif (nargs->last_ugenpath == NULL) {\n\t\t/* first device */\n\t\tnargs->last_ugenpath = devpriv->ugenpath;\n\n\t\tif (discovered_devs_append(*(nargs->discdevs), dev) == NULL) {\n\t\t\tusbi_dbg(\"cannot append device\");\n\t\t}\n\n\t\t/*\n\t\t * we alloc and hence ref this dev. We don't need to ref it\n\t\t * hereafter. Front end or app should take care of their ref.\n\t\t */\n\t\tlibusb_unref_device(dev);\n\t}\n\n\tusbi_dbg(\"Device %s %s id=0x%llx, devcount:%d, bdf=%x\",\n\t    devpriv->ugenpath, path, (uint64_t)session_id,\n\t    (*nargs->discdevs)->len, bdf);\n\n\treturn (DI_WALK_CONTINUE);\n}\n\nstatic int\nsunos_walk_minor_node_link(di_node_t node, void *args)\n{\n        di_minor_t minor = DI_MINOR_NIL;\n        char *minor_path;\n        struct devlink_cbarg arg;\n\tstruct node_args *nargs = (struct node_args *)args;\n\tdi_devlink_handle_t devlink_hdl = nargs->dlink_hdl;\n\n\t/* walk each minor to find ugen devices */\n        while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) {\n                minor_path = di_devfs_minor_path(minor);\n                arg.nargs = args;\n\t\targ.myself = node;\n                arg.minor = minor;\n                (void) di_devlink_walk(devlink_hdl,\n\t\t    \"^usb/[0-9a-f]+[.][0-9a-f]+\", minor_path,\n\t\t    DI_PRIMARY_LINK, (void *)&arg, sunos_add_devices);\n                di_devfs_path_free(minor_path);\n        }\n\n\t/* switch to a different node */\n\tnargs->last_ugenpath = NULL;\n\n\treturn (DI_WALK_CONTINUE);\n}\n\nint\nsunos_get_device_list(struct libusb_context * ctx,\n\tstruct discovered_devs **discdevs)\n{\n\tdi_node_t root_node;\n\tstruct node_args args;\n\tdi_devlink_handle_t devlink_hdl;\n\n\targs.ctx = ctx;\n\targs.discdevs = discdevs;\n\targs.last_ugenpath = NULL;\n\tif ((root_node = di_init(\"/\", DINFOCPYALL)) == DI_NODE_NIL) {\n\t\tusbi_dbg(\"di_int() failed: %s\", strerror(errno));\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\n\tif ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) {\n\t\tdi_fini(root_node);\n\t\tusbi_dbg(\"di_devlink_init() failed: %s\", strerror(errno));\n\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\targs.dlink_hdl = devlink_hdl;\n\n\t/* walk each node to find USB devices */\n\tif (di_walk_node(root_node, DI_WALK_SIBFIRST, &args,\n\t    sunos_walk_minor_node_link) == -1) {\n\t\tusbi_dbg(\"di_walk_node() failed: %s\", strerror(errno));\n\t\tdi_fini(root_node);\n\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\n\tdi_fini(root_node);\n\tdi_devlink_fini(&devlink_hdl);\n\n\tusbi_dbg(\"%d devices\", (*discdevs)->len);\n\n\treturn ((*discdevs)->len);\n}\n\nstatic int\nsunos_usb_open_ep0(sunos_dev_handle_priv_t *hpriv, sunos_dev_priv_t *dpriv)\n{\n\tchar filename[PATH_MAX + 1];\n\n\tif (hpriv->eps[0].datafd > 0) {\n\n\t\treturn (LIBUSB_SUCCESS);\n\t}\n\tsnprintf(filename, PATH_MAX, \"%s/cntrl0\", dpriv->ugenpath);\n\n\tusbi_dbg(\"opening %s\", filename);\n\thpriv->eps[0].datafd = open(filename, O_RDWR);\n\tif (hpriv->eps[0].datafd < 0) {\n\t\treturn(_errno_to_libusb(errno));\n\t}\n\n\tsnprintf(filename, PATH_MAX, \"%s/cntrl0stat\", dpriv->ugenpath);\n\thpriv->eps[0].statfd = open(filename, O_RDONLY);\n\tif (hpriv->eps[0].statfd < 0) {\n\t\tclose(hpriv->eps[0].datafd);\n\t\thpriv->eps[0].datafd = -1;\n\n\t\treturn(_errno_to_libusb(errno));\n\t}\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nstatic void\nsunos_usb_close_all_eps(sunos_dev_handle_priv_t *hdev)\n{\n\tint i;\n\n\t/* not close ep0 */\n\tfor (i = 1; i < USB_MAXENDPOINTS; i++) {\n\t\tif (hdev->eps[i].datafd != -1) {\n\t\t\t(void) close(hdev->eps[i].datafd);\n\t\t\thdev->eps[i].datafd = -1;\n\t\t}\n\t\tif (hdev->eps[i].statfd != -1) {\n\t\t\t(void) close(hdev->eps[i].statfd);\n\t\t\thdev->eps[i].statfd = -1;\n\t\t}\n\t}\n}\n\nstatic void\nsunos_usb_close_ep0(sunos_dev_handle_priv_t *hdev, sunos_dev_priv_t *dpriv)\n{\n\tif (hdev->eps[0].datafd >= 0) {\n\t\tclose(hdev->eps[0].datafd);\n\t\tclose(hdev->eps[0].statfd);\n\t\thdev->eps[0].datafd = -1;\n\t\thdev->eps[0].statfd = -1;\n\t}\n}\n\nstatic uchar_t\nsunos_usb_ep_index(uint8_t ep_addr)\n{\n\treturn ((ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK) +\n\t    ((ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? 16 : 0));\n}\n\nstatic int\nsunos_find_interface(struct libusb_device_handle *hdev,\n    uint8_t endpoint, uint8_t *interface)\n{\n\tstruct libusb_config_descriptor *config;\n\tint r;\n\tint iface_idx;\n\n\tr = libusb_get_active_config_descriptor(hdev->dev, &config);\n\tif (r < 0) {\n\t\treturn (LIBUSB_ERROR_INVALID_PARAM);\n\t}\n\n\tfor (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) {\n\t\tconst struct libusb_interface *iface =\n\t\t    &config->interface[iface_idx];\n\t\tint altsetting_idx;\n\n\t\tfor (altsetting_idx = 0; altsetting_idx < iface->num_altsetting;\n\t\t    altsetting_idx++) {\n\t\t\tconst struct libusb_interface_descriptor *altsetting =\n\t\t\t    &iface->altsetting[altsetting_idx];\n\t\t\tint ep_idx;\n\n\t\t\tfor (ep_idx = 0; ep_idx < altsetting->bNumEndpoints;\n\t\t\t    ep_idx++) {\n\t\t\t\tconst struct libusb_endpoint_descriptor *ep =\n\t\t\t\t\t&altsetting->endpoint[ep_idx];\n\t\t\t\tif (ep->bEndpointAddress == endpoint) {\n\t\t\t\t\t*interface = iface_idx;\n\t\t\t\t\tlibusb_free_config_descriptor(config);\n\n\t\t\t\t\treturn (LIBUSB_SUCCESS);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tlibusb_free_config_descriptor(config);\n\n\treturn (LIBUSB_ERROR_INVALID_PARAM);\n}\n\nstatic int\nsunos_check_device_and_status_open(struct libusb_device_handle *hdl,\n    uint8_t ep_addr, int ep_type)\n{\n\tchar\tfilename[PATH_MAX + 1], statfilename[PATH_MAX + 1];\n\tchar\tcfg_num[16], alt_num[16];\n\tint\tfd, fdstat, mode;\n\tuint8_t\tifc = 0;\n\tuint8_t\tep_index;\n\tsunos_dev_handle_priv_t *hpriv;\n\n\tusbi_dbg(\"open ep 0x%02x\", ep_addr);\n\thpriv = (sunos_dev_handle_priv_t *)hdl->os_priv;\n\tep_index = sunos_usb_ep_index(ep_addr);\n\t/* ep already opened */\n\tif ((hpriv->eps[ep_index].datafd > 0) &&\n\t    (hpriv->eps[ep_index].statfd > 0)) {\n\t\tusbi_dbg(\"ep 0x%02x already opened, return success\",\n\t\t\tep_addr);\n\n\t\treturn (0);\n\t}\n\n\tif (sunos_find_interface(hdl, ep_addr, &ifc) < 0) {\n\t\tusbi_dbg(\"can't find interface for endpoint 0x%02x\",\n\t\t    ep_addr);\n\n\t\treturn (LIBUSB_ERROR_ACCESS);\n\t}\n\n\t/* create filename */\n\tif (hpriv->config_index > 0) {\n\t\t(void) snprintf(cfg_num, sizeof (cfg_num), \"cfg%d\",\n\t\t    hpriv->config_index + 1);\n\t} else {\n\t\tbzero(cfg_num, sizeof (cfg_num));\n\t}\n\n\tif (hpriv->altsetting[ifc] > 0) {\n\t\t(void) snprintf(alt_num, sizeof (alt_num), \".%d\",\n\t\t    hpriv->altsetting[ifc]);\n\t} else {\n\t\tbzero(alt_num, sizeof (alt_num));\n\t}\n\n\t(void) snprintf(filename, PATH_MAX, \"%s/%sif%d%s%s%d\",\n\t    hpriv->dpriv->ugenpath, cfg_num, ifc, alt_num,\n\t    (ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? \"in\" :\n\t    \"out\", (ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK));\n\t(void) snprintf(statfilename, PATH_MAX, \"%sstat\", filename);\n\n\t/*\n\t * for interrupt IN endpoints, we need to enable one xfer\n\t * mode before opening the endpoint\n\t */\n\tif ((ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) &&\n\t    (ep_addr & LIBUSB_ENDPOINT_IN)) {\n\t\tchar\tcontrol = USB_EP_INTR_ONE_XFER;\n\t\tint\tcount;\n\n\t\t/* open the status device node for the ep first RDWR */\n\t\tif ((fdstat = open(statfilename, O_RDWR)) == -1) {\n\t\t\tusbi_dbg(\"can't open %s RDWR: %d\",\n\t\t\t\tstatfilename, errno);\n\t\t} else {\n\t\t\tcount = write(fdstat, &control, sizeof (control));\n\t\t\tif (count != 1) {\n\t\t\t\t/* this should have worked */\n\t\t\t\tusbi_dbg(\"can't write to %s: %d\",\n\t\t\t\t\tstatfilename, errno);\n\t\t\t\t(void) close(fdstat);\n\n\t\t\t\treturn (errno);\n\t\t\t}\n\t\t\t/* close status node and open xfer node first */\n\t\t\tclose (fdstat);\n\t\t}\n\t}\n\n\t/* open the xfer node first in case alt needs to be changed */\n\tif (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {\n\t\tmode = O_RDWR;\n\t} else if (ep_addr & LIBUSB_ENDPOINT_IN) {\n\t\tmode = O_RDONLY;\n\t} else {\n\t\tmode = O_WRONLY;\n\t}\n\n\t/*\n\t * IMPORTANT: must open data xfer node first and then open stat node\n\t * Otherwise, it will fail on multi-config or multi-altsetting devices\n\t * with \"Device Busy\" error. See ugen_epxs_switch_cfg_alt() and\n\t * ugen_epxs_check_alt_switch() in ugen driver source code.\n\t */\n\tif ((fd = open(filename, mode)) == -1) {\n\t\tusbi_dbg(\"can't open %s: %d(%s)\", filename, errno,\n\t\t    strerror(errno));\n\n\t\treturn (errno);\n\t}\n\t/* open the status node */\n\tif ((fdstat = open(statfilename, O_RDONLY)) == -1) {\n\t\tusbi_dbg(\"can't open %s: %d\", statfilename, errno);\n\n\t\t(void) close(fd);\n\n\t\treturn (errno);\n\t}\n\n\thpriv->eps[ep_index].datafd = fd;\n\thpriv->eps[ep_index].statfd = fdstat;\n\tusbi_dbg(\"ep=0x%02x datafd=%d, statfd=%d\", ep_addr, fd, fdstat);\n\n\treturn (0);\n}\n\nint\nsunos_open(struct libusb_device_handle *handle)\n{\n\tsunos_dev_handle_priv_t\t*hpriv;\n\tsunos_dev_priv_t\t*dpriv;\n\tint\ti;\n\tint\tret;\n\n\thpriv = (sunos_dev_handle_priv_t *)handle->os_priv;\n\tdpriv = (sunos_dev_priv_t *)handle->dev->os_priv;\n\thpriv->dpriv = dpriv;\n\n\t/* set all file descriptors to \"closed\" */\n\tfor (i = 0; i < USB_MAXENDPOINTS; i++) {\n\t\thpriv->eps[i].datafd = -1;\n\t\thpriv->eps[i].statfd = -1;\n\t}\n\n\tif ((ret = sunos_usb_open_ep0(hpriv, dpriv)) != LIBUSB_SUCCESS) {\n\t\tusbi_dbg(\"fail: %d\", ret);\n\t\treturn (ret);\n\t}\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nvoid\nsunos_close(struct libusb_device_handle *handle)\n{\n\tsunos_dev_handle_priv_t *hpriv;\n\tsunos_dev_priv_t *dpriv;\n\n\tusbi_dbg(\"\");\n\tif (!handle) {\n\t\treturn;\n\t}\n\n\thpriv = (sunos_dev_handle_priv_t *)handle->os_priv;\n\tif (!hpriv) {\n\t\treturn;\n\t}\n\tdpriv = (sunos_dev_priv_t *)handle->dev->os_priv;\n\tif (!dpriv) {\n\t\treturn;\n\t}\n\n\tsunos_usb_close_all_eps(hpriv);\n\tsunos_usb_close_ep0(hpriv, dpriv);\n}\n\nint\nsunos_get_device_descriptor(struct libusb_device *dev, uint8_t *buf,\n    int *host_endian)\n{\n\tsunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv;\n\n\tmemcpy(buf, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE);\n\t*host_endian = 0;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nsunos_get_active_config_descriptor(struct libusb_device *dev,\n    uint8_t *buf, size_t len, int *host_endian)\n{\n\tsunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv;\n\tstruct libusb_config_descriptor *cfg;\n\tint proplen;\n\tdi_node_t node;\n\tuint8_t\t*rdata;\n\n\t/*\n\t * Keep raw configuration descriptors updated, in case config\n\t * has ever been changed through setCfg.\n\t */\n\tif ((node = di_init(dpriv->phypath, DINFOCPYALL)) == DI_NODE_NIL) {\n\t\tusbi_dbg(\"di_int() failed: %s\", strerror(errno));\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\tproplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node,\n\t    \"usb-raw-cfg-descriptors\", &rdata);\n\tif (proplen <= 0) {\n\t\tusbi_dbg(\"can't find raw config descriptors\");\n\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\tdpriv->raw_cfgdescr = realloc(dpriv->raw_cfgdescr, proplen);\n\tif (dpriv->raw_cfgdescr == NULL) {\n\t\treturn (LIBUSB_ERROR_NO_MEM);\n\t} else {\n\t\tbcopy(rdata, dpriv->raw_cfgdescr, proplen);\n\t\tdpriv->cfgvalue = ((struct libusb_config_descriptor *)\n\t\t    rdata)->bConfigurationValue;\n\t}\n\tdi_fini(node);\n\n\tcfg = (struct libusb_config_descriptor *)dpriv->raw_cfgdescr;\n\tlen = MIN(len, libusb_le16_to_cpu(cfg->wTotalLength));\n\tmemcpy(buf, dpriv->raw_cfgdescr, len);\n\t*host_endian = 0;\n\tusbi_dbg(\"path:%s len %d\", dpriv->phypath, len);\n\n\treturn (len);\n}\n\nint\nsunos_get_config_descriptor(struct libusb_device *dev, uint8_t idx,\n    uint8_t *buf, size_t len, int *host_endian)\n{\n\t/* XXX */\n\treturn(sunos_get_active_config_descriptor(dev, buf, len, host_endian));\n}\n\nint\nsunos_get_configuration(struct libusb_device_handle *handle, int *config)\n{\n\tsunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;\n\n\t*config = dpriv->cfgvalue;\n\n\tusbi_dbg(\"bConfigurationValue %d\", *config);\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nsunos_set_configuration(struct libusb_device_handle *handle, int config)\n{\n\tsunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;\n\tsunos_dev_handle_priv_t *hpriv;\n\n\tusbi_dbg(\"bConfigurationValue %d\", config);\n\thpriv = (sunos_dev_handle_priv_t *)handle->os_priv;\n\n\tif (dpriv->ugenpath == NULL)\n\t\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n\n\tif (config < 1 || config > dpriv->dev_descr.bNumConfigurations)\n\t\treturn (LIBUSB_ERROR_INVALID_PARAM);\n\n\tdpriv->cfgvalue = config;\n\thpriv->config_index = config - 1;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nsunos_claim_interface(struct libusb_device_handle *handle, int iface)\n{\n\tusbi_dbg(\"iface %d\", iface);\n\tif (iface < 0) {\n\t\treturn (LIBUSB_ERROR_INVALID_PARAM);\n\t}\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nsunos_release_interface(struct libusb_device_handle *handle, int iface)\n{\n\tsunos_dev_handle_priv_t *hpriv =\n\t    (sunos_dev_handle_priv_t *)handle->os_priv;\n\n\tusbi_dbg(\"iface %d\", iface);\n\tif (iface < 0) {\n\t\treturn (LIBUSB_ERROR_INVALID_PARAM);\n\t}\n\n\t/* XXX: can we release it? */\n\thpriv->altsetting[iface] = 0;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nint\nsunos_set_interface_altsetting(struct libusb_device_handle *handle, int iface,\n    int altsetting)\n{\n\tsunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv;\n\tsunos_dev_handle_priv_t *hpriv =\n\t    (sunos_dev_handle_priv_t *)handle->os_priv;\n\n\tusbi_dbg(\"iface %d, setting %d\", iface, altsetting);\n\n\tif (iface < 0 || altsetting < 0) {\n\t\treturn (LIBUSB_ERROR_INVALID_PARAM);\n\t}\n\tif (dpriv->ugenpath == NULL)\n\t\treturn (LIBUSB_ERROR_NOT_FOUND);\n\n\t/* XXX: can we switch altsetting? */\n\thpriv->altsetting[iface] = altsetting;\n\n\treturn (LIBUSB_SUCCESS);\n}\n\nstatic void\nusb_dump_data(unsigned char *data, size_t size)\n{\n\tint i;\n\n\tif (getenv(\"LIBUSB_DEBUG\") == NULL) {\n\t\treturn;\n\t}\n\n\t(void) fprintf(stderr, \"data dump:\");\n\tfor (i = 0; i < size; i++) {\n\t\tif (i % 16 == 0) {\n\t\t\t(void) fprintf(stderr, \"\\n%08x\t\", i);\n\t\t}\n\t\t(void) fprintf(stderr, \"%02x \", (uchar_t)data[i]);\n\t}\n\t(void) fprintf(stderr, \"\\n\");\n}\n\nstatic void\nsunos_async_callback(union sigval arg)\n{\n\tstruct sunos_transfer_priv *tpriv =\n\t    (struct sunos_transfer_priv *)arg.sival_ptr;\n\tstruct libusb_transfer *xfer = tpriv->transfer;\n\tstruct aiocb *aiocb = &tpriv->aiocb;\n\tint ret;\n\tsunos_dev_handle_priv_t *hpriv;\n\tuint8_t ep;\n\n\thpriv = (sunos_dev_handle_priv_t *)xfer->dev_handle->os_priv;\n\tep = sunos_usb_ep_index(xfer->endpoint);\n\n\tret = aio_error(aiocb);\n\tif (ret != 0) {\n\t\txfer->status = sunos_usb_get_status(hpriv->eps[ep].statfd);\n\t} else {\n\t\txfer->actual_length =\n\t\t    LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)->transferred =\n\t\t    aio_return(aiocb);\n\t}\n\n\tusb_dump_data(xfer->buffer, xfer->actual_length);\n\n\tusbi_dbg(\"ret=%d, len=%d, actual_len=%d\", ret, xfer->length,\n\t    xfer->actual_length);\n\n\t/* async notification */\n\tusbi_signal_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer));\n}\n\nstatic int\nsunos_do_async_io(struct libusb_transfer *transfer)\n{\n\tint ret = -1;\n\tstruct aiocb *aiocb;\n\tsunos_dev_handle_priv_t *hpriv;\n\tuint8_t ep;\n\tstruct sunos_transfer_priv *tpriv;\n\n\tusbi_dbg(\"\");\n\n\ttpriv = usbi_transfer_get_os_priv(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer));\n\thpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv;\n\tep = sunos_usb_ep_index(transfer->endpoint);\n\n\ttpriv->transfer = transfer;\n\taiocb = &tpriv->aiocb;\n\tbzero(aiocb, sizeof (*aiocb));\n\taiocb->aio_fildes = hpriv->eps[ep].datafd;\n\taiocb->aio_buf = transfer->buffer;\n\taiocb->aio_nbytes = transfer->length;\n\taiocb->aio_lio_opcode =\n\t    ((transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) ==\n\t    LIBUSB_ENDPOINT_IN) ? LIO_READ:LIO_WRITE;\n\taiocb->aio_sigevent.sigev_notify = SIGEV_THREAD;\n\taiocb->aio_sigevent.sigev_value.sival_ptr = tpriv;\n\taiocb->aio_sigevent.sigev_notify_function = sunos_async_callback;\n\n\tif (aiocb->aio_lio_opcode == LIO_READ) {\n\t\tret = aio_read(aiocb);\n\t} else {\n\t\tret = aio_write(aiocb);\n\t}\n\n\treturn (ret);\n}\n\n/* return the number of bytes read/written */\nstatic int\nusb_do_io(int fd, int stat_fd, char *data, size_t size, int flag, int *status)\n{\n\tint error;\n\tint ret = -1;\n\n\tusbi_dbg(\"usb_do_io(): datafd=%d statfd=%d size=0x%x flag=%s\",\n\t    fd, stat_fd, size, flag? \"WRITE\":\"READ\");\n\n\tswitch (flag) {\n\tcase READ:\n\t\terrno = 0;\n\t\tret = read(fd, data, size);\n\t\tusb_dump_data(data, size);\n\t\tbreak;\n\tcase WRITE:\n\t\tusb_dump_data(data, size);\n\t\terrno = 0;\n\t\tret = write(fd, data, size);\n\t\tbreak;\n\t}\n\n\tusbi_dbg(\"usb_do_io(): amount=%d\", ret);\n\n\tif (ret < 0) {\n\t\tint save_errno = errno;\n\n\t\tusbi_dbg(\"TID=%x io %s errno=%d(%s) ret=%d\", pthread_self(),\n\t\t    flag?\"WRITE\":\"READ\", errno, strerror(errno), ret);\n\n\t\t/* sunos_usb_get_status will do a read and overwrite errno */\n\t\terror = sunos_usb_get_status(stat_fd);\n\t\tusbi_dbg(\"io status=%d errno=%d(%s)\", error,\n\t\t\tsave_errno, strerror(save_errno));\n\n\t\tif (status) {\n\t\t\t*status = save_errno;\n\t\t}\n\n\t\treturn (save_errno);\n\n\t} else if (status) {\n\t\t*status = 0;\n\t}\n\n\treturn (ret);\n}\n\nstatic int\nsolaris_submit_ctrl_on_default(struct libusb_transfer *transfer)\n{\n\tint\t\tret = -1, setup_ret;\n\tint\t\tstatus;\n\tsunos_dev_handle_priv_t *hpriv;\n\tstruct\t\tlibusb_device_handle *hdl = transfer->dev_handle;\n\tuint16_t\twLength;\n\tuint8_t\t\t*data = transfer->buffer;\n\n\thpriv = (sunos_dev_handle_priv_t *)hdl->os_priv;\n\twLength = transfer->length - LIBUSB_CONTROL_SETUP_SIZE;\n\n\tif (hpriv->eps[0].datafd == -1) {\n\t\tusbi_dbg(\"ep0 not opened\");\n\n\t\treturn (LIBUSB_ERROR_NOT_FOUND);\n\t}\n\n\tif ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) {\n\t\tusbi_dbg(\"IN request\");\n\t\tret = usb_do_io(hpriv->eps[0].datafd,\n\t\t    hpriv->eps[0].statfd, (char *)data, LIBUSB_CONTROL_SETUP_SIZE,\n\t\t    WRITE, (int *)&status);\n\t} else {\n\t\tusbi_dbg(\"OUT request\");\n\t\tret = usb_do_io(hpriv->eps[0].datafd, hpriv->eps[0].statfd,\n\t\t    transfer->buffer, transfer->length, WRITE,\n\t\t    (int *)&transfer->status);\n\t}\n\n\tsetup_ret = ret;\n\tif (ret < LIBUSB_CONTROL_SETUP_SIZE) {\n\t\tusbi_dbg(\"error sending control msg: %d\", ret);\n\n\t\treturn (LIBUSB_ERROR_IO);\n\t}\n\n\tret = transfer->length - LIBUSB_CONTROL_SETUP_SIZE;\n\n\t/* Read the remaining bytes for IN request */\n\tif ((wLength) && ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) ==\n\t    LIBUSB_ENDPOINT_IN)) {\n\t\tusbi_dbg(\"DATA: %d\", transfer->length - setup_ret);\n\t\tret = usb_do_io(hpriv->eps[0].datafd,\n\t\t\thpriv->eps[0].statfd,\n\t\t\t(char *)transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE,\n\t\t\twLength, READ, (int *)&transfer->status);\n\t}\n\n\tif (ret >= 0) {\n\t\ttransfer->actual_length = ret;\n\t\tLIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)->transferred = ret;\n\t}\n\tusbi_dbg(\"Done: ctrl data bytes %d\", ret);\n\n\t/* sync transfer handling */\n\tret = usbi_handle_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer),\n\t    transfer->status);\n\n\treturn (ret);\n}\n\nint\nsunos_clear_halt(struct libusb_device_handle *handle, uint8_t endpoint)\n{\n\tint ret;\n\n\tusbi_dbg(\"endpoint=0x%02x\", endpoint);\n\n\tret = libusb_control_transfer(handle, LIBUSB_ENDPOINT_OUT |\n\t    LIBUSB_RECIPIENT_ENDPOINT | LIBUSB_REQUEST_TYPE_STANDARD,\n\t    LIBUSB_REQUEST_CLEAR_FEATURE, 0, endpoint, NULL, 0, 1000);\n\n\tusbi_dbg(\"ret=%d\", ret);\n\n\treturn (ret);\n}\n\nint\nsunos_reset_device(struct libusb_device_handle *handle)\n{\n\tusbi_dbg(\"\");\n\n\treturn (LIBUSB_ERROR_NOT_SUPPORTED);\n}\n\nvoid\nsunos_destroy_device(struct libusb_device *dev)\n{\n\tsunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv;\n\n\tusbi_dbg(\"\");\n\n\tfree(dpriv->raw_cfgdescr);\n\tfree(dpriv->ugenpath);\n\tfree(dpriv->phypath);\n}\n\nint\nsunos_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct\tlibusb_transfer *transfer;\n\tstruct\tlibusb_device_handle *hdl;\n\tint\terr = 0;\n\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\thdl = transfer->dev_handle;\n\n\terr = sunos_check_device_and_status_open(hdl,\n\t    transfer->endpoint, transfer->type);\n\tif (err < 0) {\n\n\t\treturn (_errno_to_libusb(err));\n\t}\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\t/* sync transfer */\n\t\tusbi_dbg(\"CTRL transfer: %d\", transfer->length);\n\t\terr = solaris_submit_ctrl_on_default(transfer);\n\t\tbreak;\n\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\t\t/* fallthru */\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\tif (transfer->type == LIBUSB_TRANSFER_TYPE_BULK)\n\t\t\tusbi_dbg(\"BULK transfer: %d\", transfer->length);\n\t\telse\n\t\t\tusbi_dbg(\"INTR transfer: %d\", transfer->length);\n\t\terr = sunos_do_async_io(transfer);\n\t\tbreak;\n\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\t/* Isochronous/Stream is not supported */\n\n\t\t/* fallthru */\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\tif (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS)\n\t\t\tusbi_dbg(\"ISOC transfer: %d\", transfer->length);\n\t\telse\n\t\t\tusbi_dbg(\"BULK STREAM transfer: %d\", transfer->length);\n\t\terr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\tbreak;\n\t}\n\n\treturn (err);\n}\n\nint\nsunos_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tsunos_xfer_priv_t\t*tpriv;\n\tsunos_dev_handle_priv_t\t*hpriv;\n\tstruct libusb_transfer\t*transfer;\n\tstruct aiocb\t*aiocb;\n\tuint8_t\t\tep;\n\tint\t\tret;\n\n\ttpriv = usbi_transfer_get_os_priv(itransfer);\n\taiocb = &tpriv->aiocb;\n\ttransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\thpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv;\n\tep = sunos_usb_ep_index(transfer->endpoint);\n\n\tret = aio_cancel(hpriv->eps[ep].datafd, aiocb);\n\n\tusbi_dbg(\"aio->fd=%d fd=%d ret = %d, %s\", aiocb->aio_fildes,\n\t    hpriv->eps[ep].datafd, ret, (ret == AIO_CANCELED)?\n\t    strerror(0):strerror(errno));\n\n\tif (ret != AIO_CANCELED) {\n\t\tret = _errno_to_libusb(errno);\n\t} else {\n\t/*\n\t * we don't need to call usbi_handle_transfer_cancellation(),\n\t * because we'll handle everything in sunos_async_callback.\n\t */\n\t\tret = LIBUSB_SUCCESS;\n\t}\n\n\treturn (ret);\n}\n\nvoid\nsunos_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tusbi_dbg(\"\");\n\n\t/* Nothing to do */\n}\n\nint\nsunos_handle_transfer_completion(struct usbi_transfer *itransfer)\n{\n\treturn usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED);\n}\n\nint\nsunos_clock_gettime(int clkid, struct timespec *tp)\n{\n\tusbi_dbg(\"clock %d\", clkid);\n\n\tif (clkid == USBI_CLOCK_REALTIME)\n\t\treturn clock_gettime(CLOCK_REALTIME, tp);\n\n\tif (clkid == USBI_CLOCK_MONOTONIC)\n\t\treturn clock_gettime(CLOCK_MONOTONIC, tp);\n\n\treturn (LIBUSB_ERROR_INVALID_PARAM);\n}\n\nint\n_errno_to_libusb(int err)\n{\n\tusbi_dbg(\"error: %s (%d)\", strerror(err), err);\n\n\tswitch (err) {\n\tcase EIO:\n\t\treturn (LIBUSB_ERROR_IO);\n\tcase EACCES:\n\t\treturn (LIBUSB_ERROR_ACCESS);\n\tcase ENOENT:\n\t\treturn (LIBUSB_ERROR_NO_DEVICE);\n\tcase ENOMEM:\n\t\treturn (LIBUSB_ERROR_NO_MEM);\n\tcase ETIMEDOUT:\n\t\treturn (LIBUSB_ERROR_TIMEOUT);\n\t}\n\n\treturn (LIBUSB_ERROR_OTHER);\n}\n\n/*\n * sunos_usb_get_status:\n *\tgets status of endpoint\n *\n * Returns: ugen's last cmd status\n */\nstatic int\nsunos_usb_get_status(int fd)\n{\n\tint status, ret;\n\n\tusbi_dbg(\"sunos_usb_get_status(): fd=%d\", fd);\n\n\tret = read(fd, &status, sizeof (status));\n\tif (ret == sizeof (status)) {\n\t\tswitch (status) {\n\t\tcase USB_LC_STAT_NOERROR:\n\t\t\tusbi_dbg(\"No Error\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_CRC:\n\t\t\tusbi_dbg(\"CRC Timeout Detected\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_BITSTUFFING:\n\t\t\tusbi_dbg(\"Bit Stuffing Violation\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_DATA_TOGGLE_MM:\n\t\t\tusbi_dbg(\"Data Toggle Mismatch\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_STALL:\n\t\t\tusbi_dbg(\"End Point Stalled\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_DEV_NOT_RESP:\n\t\t\tusbi_dbg(\"Device is Not Responding\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_PID_CHECKFAILURE:\n\t\t\tusbi_dbg(\"PID Check Failure\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_UNEXP_PID:\n\t\t\tusbi_dbg(\"Unexpected PID\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_DATA_OVERRUN:\n\t\t\tusbi_dbg(\"Data Exceeded Size\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_DATA_UNDERRUN:\n\t\t\tusbi_dbg(\"Less data received\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_BUFFER_OVERRUN:\n\t\t\tusbi_dbg(\"Buffer Size Exceeded\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_BUFFER_UNDERRUN:\n\t\t\tusbi_dbg(\"Buffer Underrun\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_TIMEOUT:\n\t\t\tusbi_dbg(\"Command Timed Out\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_NOT_ACCESSED:\n\t\t\tusbi_dbg(\"Not Accessed by h/w\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_UNSPECIFIED_ERR:\n\t\t\tusbi_dbg(\"Unspecified Error\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_NO_BANDWIDTH:\n\t\t\tusbi_dbg(\"No Bandwidth\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_HW_ERR:\n\t\t\tusbi_dbg(\"Host Controller h/w Error\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_SUSPENDED:\n\t\t\tusbi_dbg(\"Device was Suspended\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_DISCONNECTED:\n\t\t\tusbi_dbg(\"Device was Disconnected\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_INTR_BUF_FULL:\n\t\t\tusbi_dbg(\"Interrupt buffer was full\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_INVALID_REQ:\n\t\t\tusbi_dbg(\"Request was Invalid\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_INTERRUPTED:\n\t\t\tusbi_dbg(\"Request was Interrupted\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_NO_RESOURCES:\n\t\t\tusbi_dbg(\"No resources available for \"\n\t\t\t    \"request\\n\");\n\t\t\tbreak;\n\t\tcase USB_LC_STAT_INTR_POLLING_FAILED:\n\t\t\tusbi_dbg(\"Failed to Restart Poll\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tusbi_dbg(\"Error Not Determined %d\\n\",\n\t\t\t    status);\n\t\t\tbreak;\n\t\t}\n\t} else {\n\t\tusbi_dbg(\"read stat error: %s\",strerror(errno));\n\t\tstatus = -1;\n\t}\n\n\treturn (status);\n}\n\nconst struct usbi_os_backend sunos_backend = {\n        .name = \"Solaris\",\n        .caps = 0,\n        .init = sunos_init,\n        .exit = sunos_exit,\n        .get_device_list = sunos_get_device_list,\n        .get_device_descriptor = sunos_get_device_descriptor,\n        .get_active_config_descriptor = sunos_get_active_config_descriptor,\n        .get_config_descriptor = sunos_get_config_descriptor,\n        .hotplug_poll = NULL,\n        .open = sunos_open,\n        .close = sunos_close,\n        .get_configuration = sunos_get_configuration,\n        .set_configuration = sunos_set_configuration,\n\n        .claim_interface = sunos_claim_interface,\n        .release_interface = sunos_release_interface,\n        .set_interface_altsetting = sunos_set_interface_altsetting,\n        .clear_halt = sunos_clear_halt,\n        .reset_device = sunos_reset_device, /* TODO */\n        .alloc_streams = NULL,\n        .free_streams = NULL,\n        .kernel_driver_active = NULL,\n        .detach_kernel_driver = NULL,\n        .attach_kernel_driver = NULL,\n        .destroy_device = sunos_destroy_device,\n        .submit_transfer = sunos_submit_transfer,\n        .cancel_transfer = sunos_cancel_transfer,\n\t.handle_events = NULL,\n        .clear_transfer_priv = sunos_clear_transfer_priv,\n        .handle_transfer_completion = sunos_handle_transfer_completion,\n        .clock_gettime = sunos_clock_gettime,\n        .device_priv_size = sizeof(sunos_dev_priv_t),\n        .device_handle_priv_size = sizeof(sunos_dev_handle_priv_t),\n        .transfer_priv_size = sizeof(sunos_xfer_priv_t),\n};\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.h",
    "content": "/*\n *\n * Copyright (c) 2016, Oracle and/or its affiliates.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef\tLIBUSB_SUNOS_H\n#define\tLIBUSB_SUNOS_H\n\n#include <libdevinfo.h>\n#include <pthread.h>\n#include \"libusbi.h\"\n\n#define\tREAD\t0\n#define\tWRITE\t1\n\ntypedef struct sunos_device_priv {\n\tuint8_t\tcfgvalue;\t\t/* active config value */\n\tuint8_t\t*raw_cfgdescr;\t\t/* active config descriptor */\n\tstruct libusb_device_descriptor\tdev_descr;\t/* usb device descriptor */\n\tchar\t*ugenpath;\t\t/* name of the ugen(4) node */\n\tchar\t*phypath;\t\t/* physical path */\n} sunos_dev_priv_t;\n\ntypedef\tstruct endpoint {\n\tint datafd;\t/* data file */\n\tint statfd;\t/* state file */\n} sunos_ep_priv_t;\n\ntypedef struct sunos_device_handle_priv {\n\tuint8_t\t\t\taltsetting[USB_MAXINTERFACES];\t/* a interface's alt */\n\tuint8_t\t\t\tconfig_index;\n\tsunos_ep_priv_t\t\teps[USB_MAXENDPOINTS];\n\tsunos_dev_priv_t\t*dpriv; /* device private */\n} sunos_dev_handle_priv_t;\n\ntypedef\tstruct sunos_transfer_priv {\n\tstruct aiocb\t\taiocb;\n\tstruct libusb_transfer\t*transfer;\n} sunos_xfer_priv_t;\n\nstruct node_args {\n\tstruct libusb_context\t*ctx;\n\tstruct discovered_devs\t**discdevs;\n\tconst char\t\t*last_ugenpath;\n\tdi_devlink_handle_t\tdlink_hdl;\n};\n\nstruct devlink_cbarg {\n\tstruct node_args\t*nargs;\t/* di node walk arguments */\n\tdi_node_t\t\tmyself;\t/* the di node */\n\tdi_minor_t\t\tminor;\n};\n\n/* AIO callback args */\nstruct aio_callback_args{\n\tstruct libusb_transfer *transfer;\n\tstruct aiocb aiocb;\n};\n\n#endif /* LIBUSB_SUNOS_H */\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.c",
    "content": "/*\n * libusb synchronization using POSIX Threads\n *\n * Copyright © 2011 Vitali Lovich <vlovich@aliph.com>\n * Copyright © 2011 Peter Stuge <peter@stuge.se>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <time.h>\n#if defined(__linux__) || defined(__OpenBSD__)\n# if defined(__OpenBSD__)\n#  define _BSD_SOURCE\n# endif\n# include <unistd.h>\n# include <sys/syscall.h>\n#elif defined(__APPLE__)\n# include <mach/mach.h>\n#elif defined(__CYGWIN__)\n# include <windows.h>\n#endif\n\n#include \"threads_posix.h\"\n#include \"libusbi.h\"\n\nint usbi_cond_timedwait(pthread_cond_t *cond,\n\tpthread_mutex_t *mutex, const struct timeval *tv)\n{\n\tstruct timespec timeout;\n\tint r;\n\n\tr = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout);\n\tif (r < 0)\n\t\treturn r;\n\n\ttimeout.tv_sec += tv->tv_sec;\n\ttimeout.tv_nsec += tv->tv_usec * 1000;\n\twhile (timeout.tv_nsec >= 1000000000L) {\n\t\ttimeout.tv_nsec -= 1000000000L;\n\t\ttimeout.tv_sec++;\n\t}\n\n\treturn pthread_cond_timedwait(cond, mutex, &timeout);\n}\n\nint usbi_get_tid(void)\n{\n\tint ret = -1;\n#if defined(__ANDROID__)\n\tret = gettid();\n#elif defined(__linux__)\n\tret = syscall(SYS_gettid);\n#elif defined(__OpenBSD__)\n\t/* The following only works with OpenBSD > 5.1 as it requires\n\t   real thread support. For 5.1 and earlier, -1 is returned. */\n\tret = syscall(SYS_getthrid);\n#elif defined(__APPLE__)\n\tret = mach_thread_self();\n\tmach_port_deallocate(mach_task_self(), ret);\n#elif defined(__CYGWIN__)\n\tret = GetCurrentThreadId();\n#endif\n/* TODO: NetBSD thread ID support */\n\treturn ret;\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.h",
    "content": "/*\n * libusb synchronization using POSIX Threads\n *\n * Copyright © 2010 Peter Stuge <peter@stuge.se>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBUSB_THREADS_POSIX_H\n#define LIBUSB_THREADS_POSIX_H\n\n#include <pthread.h>\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n\n#define usbi_mutex_static_t\t\tpthread_mutex_t\n#define USBI_MUTEX_INITIALIZER\t\tPTHREAD_MUTEX_INITIALIZER\n#define usbi_mutex_static_lock\t\tpthread_mutex_lock\n#define usbi_mutex_static_unlock\tpthread_mutex_unlock\n\n#define usbi_mutex_t\t\t\tpthread_mutex_t\n#define usbi_mutex_init(mutex)\t\tpthread_mutex_init((mutex), NULL)\n#define usbi_mutex_lock\t\t\tpthread_mutex_lock\n#define usbi_mutex_unlock\t\tpthread_mutex_unlock\n#define usbi_mutex_trylock\t\tpthread_mutex_trylock\n#define usbi_mutex_destroy\t\tpthread_mutex_destroy\n\n#define usbi_cond_t\t\t\tpthread_cond_t\n#define usbi_cond_init(cond)\t\tpthread_cond_init((cond), NULL)\n#define usbi_cond_wait\t\t\tpthread_cond_wait\n#define usbi_cond_broadcast\t\tpthread_cond_broadcast\n#define usbi_cond_destroy\t\tpthread_cond_destroy\n\n#define usbi_tls_key_t\t\t\tpthread_key_t\n#define usbi_tls_key_create(key)\tpthread_key_create((key), NULL)\n#define usbi_tls_key_get\t\tpthread_getspecific\n#define usbi_tls_key_set\t\tpthread_setspecific\n#define usbi_tls_key_delete\t\tpthread_key_delete\n\nint usbi_get_tid(void);\n\n#endif /* LIBUSB_THREADS_POSIX_H */\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.c",
    "content": "/*\n * libusb synchronization on Microsoft Windows\n *\n * Copyright © 2010 Michael Plante <michael.plante@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <objbase.h>\n#include <errno.h>\n\n#include \"libusbi.h\"\n\nstruct usbi_cond_perthread {\n\tstruct list_head list;\n\tDWORD tid;\n\tHANDLE event;\n};\n\nint usbi_mutex_static_lock(usbi_mutex_static_t *mutex)\n{\n\tif (!mutex)\n\t\treturn EINVAL;\n\twhile (InterlockedExchange(mutex, 1) == 1)\n\t\tSleepEx(0, TRUE);\n\treturn 0;\n}\n\nint usbi_mutex_static_unlock(usbi_mutex_static_t *mutex)\n{\n\tif (!mutex)\n\t\treturn EINVAL;\n\tInterlockedExchange(mutex, 0);\n\treturn 0;\n}\n\nint usbi_mutex_init(usbi_mutex_t *mutex)\n{\n\tif (!mutex)\n\t\treturn EINVAL;\n\t*mutex = CreateMutex(NULL, FALSE, NULL);\n\tif (!*mutex)\n\t\treturn ENOMEM;\n\treturn 0;\n}\n\nint usbi_mutex_lock(usbi_mutex_t *mutex)\n{\n\tDWORD result;\n\n\tif (!mutex)\n\t\treturn EINVAL;\n\tresult = WaitForSingleObject(*mutex, INFINITE);\n\tif (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED)\n\t\treturn 0; // acquired (ToDo: check that abandoned is ok)\n\telse\n\t\treturn EINVAL; // don't know how this would happen\n\t\t\t       //   so don't know proper errno\n}\n\nint usbi_mutex_unlock(usbi_mutex_t *mutex)\n{\n\tif (!mutex)\n\t\treturn EINVAL;\n\tif (ReleaseMutex(*mutex))\n\t\treturn 0;\n\telse\n\t\treturn EPERM;\n}\n\nint usbi_mutex_trylock(usbi_mutex_t *mutex)\n{\n\tDWORD result;\n\n\tif (!mutex)\n\t\treturn EINVAL;\n\tresult = WaitForSingleObject(*mutex, 0);\n\tif (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED)\n\t\treturn 0; // acquired (ToDo: check that abandoned is ok)\n\telse if (result == WAIT_TIMEOUT)\n\t\treturn EBUSY;\n\telse\n\t\treturn EINVAL; // don't know how this would happen\n\t\t\t       //   so don't know proper error\n}\n\nint usbi_mutex_destroy(usbi_mutex_t *mutex)\n{\n\t// It is not clear if CloseHandle failure is due to failure to unlock.\n\t//   If so, this should be errno=EBUSY.\n\tif (!mutex || !CloseHandle(*mutex))\n\t\treturn EINVAL;\n\t*mutex = NULL;\n\treturn 0;\n}\n\nint usbi_cond_init(usbi_cond_t *cond)\n{\n\tif (!cond)\n\t\treturn EINVAL;\n\tlist_init(&cond->waiters);\n\tlist_init(&cond->not_waiting);\n\treturn 0;\n}\n\nint usbi_cond_destroy(usbi_cond_t *cond)\n{\n\t// This assumes no one is using this anymore.  The check MAY NOT BE safe.\n\tstruct usbi_cond_perthread *pos, *next_pos;\n\n\tif(!cond)\n\t\treturn EINVAL;\n\tif (!list_empty(&cond->waiters))\n\t\treturn EBUSY; // (!see above!)\n\tlist_for_each_entry_safe(pos, next_pos, &cond->not_waiting, list, struct usbi_cond_perthread) {\n\t\tCloseHandle(pos->event);\n\t\tlist_del(&pos->list);\n\t\tfree(pos);\n\t}\n\treturn 0;\n}\n\nint usbi_cond_broadcast(usbi_cond_t *cond)\n{\n\t// Assumes mutex is locked; this is not in keeping with POSIX spec, but\n\t//   libusb does this anyway, so we simplify by not adding more sync\n\t//   primitives to the CV definition!\n\tint fail = 0;\n\tstruct usbi_cond_perthread *pos;\n\n\tif (!cond)\n\t\treturn EINVAL;\n\tlist_for_each_entry(pos, &cond->waiters, list, struct usbi_cond_perthread) {\n\t\tif (!SetEvent(pos->event))\n\t\t\tfail = 1;\n\t}\n\t// The wait function will remove its respective item from the list.\n\treturn fail ? EINVAL : 0;\n}\n\n__inline static int usbi_cond_intwait(usbi_cond_t *cond,\n\tusbi_mutex_t *mutex, DWORD timeout_ms)\n{\n\tstruct usbi_cond_perthread *pos;\n\tint r, found = 0;\n\tDWORD r2, tid = GetCurrentThreadId();\n\n\tif (!cond || !mutex)\n\t\treturn EINVAL;\n\tlist_for_each_entry(pos, &cond->not_waiting, list, struct usbi_cond_perthread) {\n\t\tif(tid == pos->tid) {\n\t\t\tfound = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!found) {\n\t\tpos = calloc(1, sizeof(struct usbi_cond_perthread));\n\t\tif (!pos)\n\t\t\treturn ENOMEM; // This errno is not POSIX-allowed.\n\t\tpos->tid = tid;\n\t\tpos->event = CreateEvent(NULL, FALSE, FALSE, NULL); // auto-reset.\n\t\tif (!pos->event) {\n\t\t\tfree(pos);\n\t\t\treturn ENOMEM;\n\t\t}\n\t\tlist_add(&pos->list, &cond->not_waiting);\n\t}\n\n\tlist_del(&pos->list); // remove from not_waiting list.\n\tlist_add(&pos->list, &cond->waiters);\n\n\tr  = usbi_mutex_unlock(mutex);\n\tif (r)\n\t\treturn r;\n\n\tr2 = WaitForSingleObject(pos->event, timeout_ms);\n\tr = usbi_mutex_lock(mutex);\n\tif (r)\n\t\treturn r;\n\n\tlist_del(&pos->list);\n\tlist_add(&pos->list, &cond->not_waiting);\n\n\tif (r2 == WAIT_OBJECT_0)\n\t\treturn 0;\n\telse if (r2 == WAIT_TIMEOUT)\n\t\treturn ETIMEDOUT;\n\telse\n\t\treturn EINVAL;\n}\n// N.B.: usbi_cond_*wait() can also return ENOMEM, even though pthread_cond_*wait cannot!\nint usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex)\n{\n\treturn usbi_cond_intwait(cond, mutex, INFINITE);\n}\n\nint usbi_cond_timedwait(usbi_cond_t *cond,\n\tusbi_mutex_t *mutex, const struct timeval *tv)\n{\n\tDWORD millis;\n\n\tmillis = (DWORD)(tv->tv_sec * 1000) + (tv->tv_usec / 1000);\n\t/* round up to next millisecond */\n\tif (tv->tv_usec % 1000)\n\t\tmillis++;\n\treturn usbi_cond_intwait(cond, mutex, millis);\n}\n\nint usbi_tls_key_create(usbi_tls_key_t *key)\n{\n\tif (!key)\n\t\treturn EINVAL;\n\t*key = TlsAlloc();\n\tif (*key == TLS_OUT_OF_INDEXES)\n\t\treturn ENOMEM;\n\telse\n\t\treturn 0;\n}\n\nvoid *usbi_tls_key_get(usbi_tls_key_t key)\n{\n\treturn TlsGetValue(key);\n}\n\nint usbi_tls_key_set(usbi_tls_key_t key, void *value)\n{\n\tif (TlsSetValue(key, value))\n\t\treturn 0;\n\telse\n\t\treturn EINVAL;\n}\n\nint usbi_tls_key_delete(usbi_tls_key_t key)\n{\n\tif (TlsFree(key))\n\t\treturn 0;\n\telse\n\t\treturn EINVAL;\n}\n\nint usbi_get_tid(void)\n{\n\treturn (int)GetCurrentThreadId();\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.h",
    "content": "/*\n * libusb synchronization on Microsoft Windows\n *\n * Copyright © 2010 Michael Plante <michael.plante@gmail.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBUSB_THREADS_WINDOWS_H\n#define LIBUSB_THREADS_WINDOWS_H\n\n#define usbi_mutex_static_t\tvolatile LONG\n#define USBI_MUTEX_INITIALIZER\t0\n\n#define usbi_mutex_t\t\tHANDLE\n\ntypedef struct usbi_cond {\n\t// Every time a thread touches the CV, it winds up in one of these lists.\n\t//   It stays there until the CV is destroyed, even if the thread terminates.\n\tstruct list_head waiters;\n\tstruct list_head not_waiting;\n} usbi_cond_t;\n\n// We *were* getting timespec from pthread.h:\n#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED))\n#define HAVE_STRUCT_TIMESPEC 1\n#define _TIMESPEC_DEFINED 1\nstruct timespec {\n\tlong tv_sec;\n\tlong tv_nsec;\n};\n#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */\n\n// We *were* getting ETIMEDOUT from pthread.h:\n#ifndef ETIMEDOUT\n#  define ETIMEDOUT 10060     /* This is the value in winsock.h. */\n#endif\n\n#define usbi_tls_key_t\t\tDWORD\n\nint usbi_mutex_static_lock(usbi_mutex_static_t *mutex);\nint usbi_mutex_static_unlock(usbi_mutex_static_t *mutex);\n\nint usbi_mutex_init(usbi_mutex_t *mutex);\nint usbi_mutex_lock(usbi_mutex_t *mutex);\nint usbi_mutex_unlock(usbi_mutex_t *mutex);\nint usbi_mutex_trylock(usbi_mutex_t *mutex);\nint usbi_mutex_destroy(usbi_mutex_t *mutex);\n\nint usbi_cond_init(usbi_cond_t *cond);\nint usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex);\nint usbi_cond_timedwait(usbi_cond_t *cond,\n\tusbi_mutex_t *mutex, const struct timeval *tv);\nint usbi_cond_broadcast(usbi_cond_t *cond);\nint usbi_cond_destroy(usbi_cond_t *cond);\n\nint usbi_tls_key_create(usbi_tls_key_t *key);\nvoid *usbi_tls_key_get(usbi_tls_key_t key);\nint usbi_tls_key_set(usbi_tls_key_t key, void *value);\nint usbi_tls_key_delete(usbi_tls_key_t key);\n\nint usbi_get_tid(void);\n\n#endif /* LIBUSB_THREADS_WINDOWS_H */\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.c",
    "content": "/*\n * Windows CE backend for libusb 1.0\n * Copyright © 2011-2013 RealVNC Ltd.\n * Large portions taken from Windows backend, which is\n * Copyright © 2009-2010 Pete Batard <pbatard@gmail.com>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer\n * Major code testing contribution by Xiaofan Chen\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <stdint.h>\n#include <inttypes.h>\n\n#include \"libusbi.h\"\n#include \"wince_usb.h\"\n\n// Global variables\nint windows_version = WINDOWS_CE;\nstatic uint64_t hires_frequency, hires_ticks_to_ps;\nstatic HANDLE driver_handle = INVALID_HANDLE_VALUE;\nstatic int concurrent_usage = -1;\n\n/*\n * Converts a windows error to human readable string\n * uses retval as errorcode, or, if 0, use GetLastError()\n */\n#if defined(ENABLE_LOGGING)\nstatic const char *windows_error_str(DWORD error_code)\n{\n\tstatic TCHAR wErr_string[ERR_BUFFER_SIZE];\n\tstatic char err_string[ERR_BUFFER_SIZE];\n\n\tDWORD size;\n\tint len;\n\n\tif (error_code == 0)\n\t\terror_code = GetLastError();\n\n\tlen = sprintf(err_string, \"[%u] \", (unsigned int)error_code);\n\n\tsize = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,\n\t\tNULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n\t\twErr_string, ERR_BUFFER_SIZE, NULL);\n\tif (size == 0) {\n\t\tDWORD format_error = GetLastError();\n\t\tif (format_error)\n\t\t\tsnprintf(err_string, ERR_BUFFER_SIZE,\n\t\t\t\t\"Windows error code %u (FormatMessage error code %u)\",\n\t\t\t\t(unsigned int)error_code, (unsigned int)format_error);\n\t\telse\n\t\t\tsnprintf(err_string, ERR_BUFFER_SIZE, \"Unknown error code %u\", (unsigned int)error_code);\n\t} else {\n\t\t// Remove CR/LF terminators, if present\n\t\tsize_t pos = size - 2;\n\t\tif (wErr_string[pos] == 0x0D)\n\t\t\twErr_string[pos] = 0;\n\n\t\tif (!WideCharToMultiByte(CP_ACP, 0, wErr_string, -1, &err_string[len], ERR_BUFFER_SIZE - len, NULL, NULL))\n\t\t\tstrcpy(err_string, \"Unable to convert error string\");\n\t}\n\n\treturn err_string;\n}\n#endif\n\nstatic struct wince_device_priv *_device_priv(struct libusb_device *dev)\n{\n\treturn (struct wince_device_priv *)dev->os_priv;\n}\n\n// ceusbkwrapper to libusb error code mapping\nstatic int translate_driver_error(DWORD error)\n{\n\tswitch (error) {\n\tcase ERROR_INVALID_PARAMETER:\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\tcase ERROR_CALL_NOT_IMPLEMENTED:\n\tcase ERROR_NOT_SUPPORTED:\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\tcase ERROR_NOT_ENOUGH_MEMORY:\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\tcase ERROR_INVALID_HANDLE:\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\tcase ERROR_BUSY:\n\t\treturn LIBUSB_ERROR_BUSY;\n\n\t// Error codes that are either unexpected, or have\n\t// no suitable LIBUSB_ERROR equivalent.\n\tcase ERROR_CANCELLED:\n\tcase ERROR_INTERNAL_ERROR:\n\tdefault:\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n}\n\nstatic int init_dllimports(void)\n{\n\tDLL_GET_HANDLE(ceusbkwrapper);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwOpenDriver, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwGetDeviceList, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwReleaseDeviceList, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwGetDeviceAddress, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwGetDeviceDescriptor, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwGetConfigDescriptor, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwCloseDriver, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwCancelTransfer, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwIssueControlTransfer, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwClaimInterface, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwReleaseInterface, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwSetInterfaceAlternateSetting, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwClearHaltHost, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwClearHaltDevice, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwGetConfig, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwSetConfig, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwResetDevice, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwKernelDriverActive, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwAttachKernelDriver, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwDetachKernelDriver, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwIssueBulkTransfer, TRUE);\n\tDLL_LOAD_FUNC(ceusbkwrapper, UkwIsPipeHalted, TRUE);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void exit_dllimports(void)\n{\n\tDLL_FREE_HANDLE(ceusbkwrapper);\n}\n\nstatic int init_device(\n\tstruct libusb_device *dev, UKW_DEVICE drv_dev,\n\tunsigned char bus_addr, unsigned char dev_addr)\n{\n\tstruct wince_device_priv *priv = _device_priv(dev);\n\tint r = LIBUSB_SUCCESS;\n\n\tdev->bus_number = bus_addr;\n\tdev->device_address = dev_addr;\n\tpriv->dev = drv_dev;\n\n\tif (!UkwGetDeviceDescriptor(priv->dev, &(priv->desc)))\n\t\tr = translate_driver_error(GetLastError());\n\n\treturn r;\n}\n\n// Internal API functions\nstatic int wince_init(struct libusb_context *ctx)\n{\n\tint r = LIBUSB_ERROR_OTHER;\n\tHANDLE semaphore;\n\tLARGE_INTEGER li_frequency;\n\tTCHAR sem_name[11 + 8 + 1]; // strlen(\"libusb_init\") + (32-bit hex PID) + '\\0'\n\n\t_stprintf(sem_name, _T(\"libusb_init%08X\"), (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF));\n\tsemaphore = CreateSemaphore(NULL, 1, 1, sem_name);\n\tif (semaphore == NULL) {\n\t\tusbi_err(ctx, \"could not create semaphore: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\t// A successful wait brings our semaphore count to 0 (unsignaled)\n\t// => any concurent wait stalls until the semaphore's release\n\tif (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) {\n\t\tusbi_err(ctx, \"failure to access semaphore: %s\", windows_error_str(0));\n\t\tCloseHandle(semaphore);\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\t// NB: concurrent usage supposes that init calls are equally balanced with\n\t// exit calls. If init is called more than exit, we will not exit properly\n\tif ( ++concurrent_usage == 0 ) {\t// First init?\n\t\t// Initialize pollable file descriptors\n\t\tinit_polling();\n\n\t\t// Load DLL imports\n\t\tif (init_dllimports() != LIBUSB_SUCCESS) {\n\t\t\tusbi_err(ctx, \"could not resolve DLL functions\");\n\t\t\tr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tgoto init_exit;\n\t\t}\n\n\t\t// try to open a handle to the driver\n\t\tdriver_handle = UkwOpenDriver();\n\t\tif (driver_handle == INVALID_HANDLE_VALUE) {\n\t\t\tusbi_err(ctx, \"could not connect to driver\");\n\t\t\tr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tgoto init_exit;\n\t\t}\n\n\t\t// find out if we have access to a monotonic (hires) timer\n\t\tif (QueryPerformanceFrequency(&li_frequency)) {\n\t\t\thires_frequency = li_frequency.QuadPart;\n\t\t\t// The hires frequency can go as high as 4 GHz, so we'll use a conversion\n\t\t\t// to picoseconds to compute the tv_nsecs part in clock_gettime\n\t\t\thires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency;\n\t\t\tusbi_dbg(\"hires timer available (Frequency: %\"PRIu64\" Hz)\", hires_frequency);\n\t\t} else {\n\t\t\tusbi_dbg(\"no hires timer available on this platform\");\n\t\t\thires_frequency = 0;\n\t\t\thires_ticks_to_ps = UINT64_C(0);\n\t\t}\n\t}\n\t// At this stage, either we went through full init successfully, or didn't need to\n\tr = LIBUSB_SUCCESS;\n\ninit_exit: // Holds semaphore here.\n\tif (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed?\n\t\texit_dllimports();\n\t\texit_polling();\n\n\t\tif (driver_handle != INVALID_HANDLE_VALUE) {\n\t\t\tUkwCloseDriver(driver_handle);\n\t\t\tdriver_handle = INVALID_HANDLE_VALUE;\n\t\t}\n\t}\n\n\tif (r != LIBUSB_SUCCESS)\n\t\t--concurrent_usage; // Not expected to call libusb_exit if we failed.\n\n\tReleaseSemaphore(semaphore, 1, NULL);\t// increase count back to 1\n\tCloseHandle(semaphore);\n\treturn r;\n}\n\nstatic void wince_exit(void)\n{\n\tHANDLE semaphore;\n\tTCHAR sem_name[11 + 8 + 1]; // strlen(\"libusb_init\") + (32-bit hex PID) + '\\0'\n\n\t_stprintf(sem_name, _T(\"libusb_init%08X\"), (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF));\n\tsemaphore = CreateSemaphore(NULL, 1, 1, sem_name);\n\tif (semaphore == NULL)\n\t\treturn;\n\n\t// A successful wait brings our semaphore count to 0 (unsignaled)\n\t// => any concurent wait stalls until the semaphore release\n\tif (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) {\n\t\tCloseHandle(semaphore);\n\t\treturn;\n\t}\n\n\t// Only works if exits and inits are balanced exactly\n\tif (--concurrent_usage < 0) {\t// Last exit\n\t\texit_dllimports();\n\t\texit_polling();\n\n\t\tif (driver_handle != INVALID_HANDLE_VALUE) {\n\t\t\tUkwCloseDriver(driver_handle);\n\t\t\tdriver_handle = INVALID_HANDLE_VALUE;\n\t\t}\n\t}\n\n\tReleaseSemaphore(semaphore, 1, NULL);\t// increase count back to 1\n\tCloseHandle(semaphore);\n}\n\nstatic int wince_get_device_list(\n\tstruct libusb_context *ctx,\n\tstruct discovered_devs **discdevs)\n{\n\tUKW_DEVICE devices[MAX_DEVICE_COUNT];\n\tstruct discovered_devs *new_devices = *discdevs;\n\tDWORD count = 0, i;\n\tstruct libusb_device *dev = NULL;\n\tunsigned char bus_addr, dev_addr;\n\tunsigned long session_id;\n\tBOOL success;\n\tDWORD release_list_offset = 0;\n\tint r = LIBUSB_SUCCESS;\n\n\tsuccess = UkwGetDeviceList(driver_handle, devices, MAX_DEVICE_COUNT, &count);\n\tif (!success) {\n\t\tint libusbErr = translate_driver_error(GetLastError());\n\t\tusbi_err(ctx, \"could not get devices: %s\", windows_error_str(0));\n\t\treturn libusbErr;\n\t}\n\n\tfor (i = 0; i < count; ++i) {\n\t\trelease_list_offset = i;\n\t\tsuccess = UkwGetDeviceAddress(devices[i], &bus_addr, &dev_addr, &session_id);\n\t\tif (!success) {\n\t\t\tr = translate_driver_error(GetLastError());\n\t\t\tusbi_err(ctx, \"could not get device address for %u: %s\", (unsigned int)i, windows_error_str(0));\n\t\t\tgoto err_out;\n\t\t}\n\n\t\tdev = usbi_get_device_by_session_id(ctx, session_id);\n\t\tif (dev) {\n\t\t\tusbi_dbg(\"using existing device for %u/%u (session %lu)\",\n\t\t\t\t\tbus_addr, dev_addr, session_id);\n\t\t\t// Release just this element in the device list (as we already hold a\n\t\t\t// reference to it).\n\t\t\tUkwReleaseDeviceList(driver_handle, &devices[i], 1);\n\t\t\trelease_list_offset++;\n\t\t} else {\n\t\t\tusbi_dbg(\"allocating new device for %u/%u (session %lu)\",\n\t\t\t\t\tbus_addr, dev_addr, session_id);\n\t\t\tdev = usbi_alloc_device(ctx, session_id);\n\t\t\tif (!dev) {\n\t\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\t\tgoto err_out;\n\t\t\t}\n\n\t\t\tr = init_device(dev, devices[i], bus_addr, dev_addr);\n\t\t\tif (r < 0)\n\t\t\t\tgoto err_out;\n\n\t\t\tr = usbi_sanitize_device(dev);\n\t\t\tif (r < 0)\n\t\t\t\tgoto err_out;\n\t\t}\n\n\t\tnew_devices = discovered_devs_append(new_devices, dev);\n\t\tif (!discdevs) {\n\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\tgoto err_out;\n\t\t}\n\n\t\tlibusb_unref_device(dev);\n\t}\n\n\t*discdevs = new_devices;\n\treturn r;\nerr_out:\n\t*discdevs = new_devices;\n\tlibusb_unref_device(dev);\n\t// Release the remainder of the unprocessed device list.\n\t// The devices added to new_devices already will still be passed up to libusb,\n\t// which can dispose of them at its leisure.\n\tUkwReleaseDeviceList(driver_handle, &devices[release_list_offset], count - release_list_offset);\n\treturn r;\n}\n\nstatic int wince_open(struct libusb_device_handle *handle)\n{\n\t// Nothing to do to open devices as a handle to it has\n\t// been retrieved by wince_get_device_list\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void wince_close(struct libusb_device_handle *handle)\n{\n\t// Nothing to do as wince_open does nothing.\n}\n\nstatic int wince_get_device_descriptor(\n\tstruct libusb_device *device,\n\tunsigned char *buffer, int *host_endian)\n{\n\tstruct wince_device_priv *priv = _device_priv(device);\n\n\t*host_endian = 1;\n\tmemcpy(buffer, &priv->desc, DEVICE_DESC_LENGTH);\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_get_active_config_descriptor(\n\tstruct libusb_device *device,\n\tunsigned char *buffer, size_t len, int *host_endian)\n{\n\tstruct wince_device_priv *priv = _device_priv(device);\n\tDWORD actualSize = len;\n\n\t*host_endian = 0;\n\tif (!UkwGetConfigDescriptor(priv->dev, UKW_ACTIVE_CONFIGURATION, buffer, len, &actualSize))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn actualSize;\n}\n\nstatic int wince_get_config_descriptor(\n\tstruct libusb_device *device,\n\tuint8_t config_index,\n\tunsigned char *buffer, size_t len, int *host_endian)\n{\n\tstruct wince_device_priv *priv = _device_priv(device);\n\tDWORD actualSize = len;\n\n\t*host_endian = 0;\n\tif (!UkwGetConfigDescriptor(priv->dev, config_index, buffer, len, &actualSize))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn actualSize;\n}\n\nstatic int wince_get_configuration(\n\tstruct libusb_device_handle *handle,\n\tint *config)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\tUCHAR cv = 0;\n\n\tif (!UkwGetConfig(priv->dev, &cv))\n\t\treturn translate_driver_error(GetLastError());\n\n\t(*config) = cv;\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_set_configuration(\n\tstruct libusb_device_handle *handle,\n\tint config)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\t// Setting configuration 0 places the device in Address state.\n\t// This should correspond to the \"unconfigured state\" required by\n\t// libusb when the specified configuration is -1.\n\tUCHAR cv = (config < 0) ? 0 : config;\n\tif (!UkwSetConfig(priv->dev, cv))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_claim_interface(\n\tstruct libusb_device_handle *handle,\n\tint interface_number)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\n\tif (!UkwClaimInterface(priv->dev, interface_number))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_release_interface(\n\tstruct libusb_device_handle *handle,\n\tint interface_number)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\n\tif (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, 0))\n\t\treturn translate_driver_error(GetLastError());\n\n\tif (!UkwReleaseInterface(priv->dev, interface_number))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_set_interface_altsetting(\n\tstruct libusb_device_handle *handle,\n\tint interface_number, int altsetting)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\n\tif (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, altsetting))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_clear_halt(\n\tstruct libusb_device_handle *handle,\n\tunsigned char endpoint)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\n\tif (!UkwClearHaltHost(priv->dev, endpoint))\n\t\treturn translate_driver_error(GetLastError());\n\n\tif (!UkwClearHaltDevice(priv->dev, endpoint))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_reset_device(\n\tstruct libusb_device_handle *handle)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\n\tif (!UkwResetDevice(priv->dev))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_kernel_driver_active(\n\tstruct libusb_device_handle *handle,\n\tint interface_number)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\tBOOL result = FALSE;\n\n\tif (!UkwKernelDriverActive(priv->dev, interface_number, &result))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn result ? 1 : 0;\n}\n\nstatic int wince_detach_kernel_driver(\n\tstruct libusb_device_handle *handle,\n\tint interface_number)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\n\tif (!UkwDetachKernelDriver(priv->dev, interface_number))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_attach_kernel_driver(\n\tstruct libusb_device_handle *handle,\n\tint interface_number)\n{\n\tstruct wince_device_priv *priv = _device_priv(handle->dev);\n\n\tif (!UkwAttachKernelDriver(priv->dev, interface_number))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void wince_destroy_device(struct libusb_device *dev)\n{\n\tstruct wince_device_priv *priv = _device_priv(dev);\n\n\tUkwReleaseDeviceList(driver_handle, &priv->dev, 1);\n}\n\nstatic void wince_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tstruct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct winfd wfd = fd_to_winfd(transfer_priv->pollable_fd.fd);\n\n\t// No need to cancel transfer as it is either complete or abandoned\n\twfd.itransfer = NULL;\n\tCloseHandle(wfd.handle);\n\tusbi_free_fd(&transfer_priv->pollable_fd);\n}\n\nstatic int wince_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tstruct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\n\tif (!UkwCancelTransfer(priv->dev, transfer_priv->pollable_fd.overlapped, UKW_TF_NO_WAIT))\n\t\treturn translate_driver_error(GetLastError());\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tBOOL direction_in, ret;\n\tstruct winfd wfd;\n\tDWORD flags;\n\tHANDLE eventHandle;\n\tPUKW_CONTROL_HEADER setup = NULL;\n\tconst BOOL control_transfer = transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL;\n\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\tif (control_transfer) {\n\t\tsetup = (PUKW_CONTROL_HEADER) transfer->buffer;\n\t\tdirection_in = setup->bmRequestType & LIBUSB_ENDPOINT_IN;\n\t} else {\n\t\tdirection_in = transfer->endpoint & LIBUSB_ENDPOINT_IN;\n\t}\n\tflags = direction_in ? UKW_TF_IN_TRANSFER : UKW_TF_OUT_TRANSFER;\n\tflags |= UKW_TF_SHORT_TRANSFER_OK;\n\n\teventHandle = CreateEvent(NULL, FALSE, FALSE, NULL);\n\tif (eventHandle == NULL) {\n\t\tusbi_err(ctx, \"Failed to create event for async transfer\");\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\twfd = usbi_create_fd(eventHandle, direction_in ? RW_READ : RW_WRITE, itransfer, &wince_cancel_transfer);\n\tif (wfd.fd < 0) {\n\t\tCloseHandle(eventHandle);\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\ttransfer_priv->pollable_fd = wfd;\n\tif (control_transfer) {\n\t\t// Split out control setup header and data buffer\n\t\tDWORD bufLen = transfer->length - sizeof(UKW_CONTROL_HEADER);\n\t\tPVOID buf = (PVOID) &transfer->buffer[sizeof(UKW_CONTROL_HEADER)];\n\n\t\tret = UkwIssueControlTransfer(priv->dev, flags, setup, buf, bufLen, &transfer->actual_length, wfd.overlapped);\n\t} else {\n\t\tret = UkwIssueBulkTransfer(priv->dev, flags, transfer->endpoint, transfer->buffer,\n\t\t\ttransfer->length, &transfer->actual_length, wfd.overlapped);\n\t}\n\n\tif (!ret) {\n\t\tint libusbErr = translate_driver_error(GetLastError());\n\t\tusbi_err(ctx, \"UkwIssue%sTransfer failed: error %u\",\n\t\t\tcontrol_transfer ? \"Control\" : \"Bulk\", (unsigned int)GetLastError());\n\t\twince_clear_transfer_priv(itransfer);\n\t\treturn libusbErr;\n\t}\n\tusbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, direction_in ? POLLIN : POLLOUT);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int wince_submit_iso_transfer(struct usbi_transfer *itransfer)\n{\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic int wince_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\treturn wince_submit_control_or_bulk_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\treturn wince_submit_iso_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\tdefault:\n\t\tusbi_err(TRANSFER_CTX(transfer), \"unknown endpoint type %d\", transfer->type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nstatic void wince_transfer_callback(\n\tstruct usbi_transfer *itransfer,\n\tuint32_t io_result, uint32_t io_size)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer);\n\tstruct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tint status;\n\n\tusbi_dbg(\"handling I/O completion with errcode %u\", io_result);\n\n\tif (io_result == ERROR_NOT_SUPPORTED &&\n\t\ttransfer->type != LIBUSB_TRANSFER_TYPE_CONTROL) {\n\t\t/* For functional stalls, the WinCE USB layer (and therefore the USB Kernel Wrapper\n\t\t * Driver) will report USB_ERROR_STALL/ERROR_NOT_SUPPORTED in situations where the\n\t\t * endpoint isn't actually stalled.\n\t\t *\n\t\t * One example of this is that some devices will occasionally fail to reply to an IN\n\t\t * token. The WinCE USB layer carries on with the transaction until it is completed\n\t\t * (or cancelled) but then completes it with USB_ERROR_STALL.\n\t\t *\n\t\t * This code therefore needs to confirm that there really is a stall error, by both\n\t\t * checking the pipe status and requesting the endpoint status from the device.\n\t\t */\n\t\tBOOL halted = FALSE;\n\t\tusbi_dbg(\"checking I/O completion with errcode ERROR_NOT_SUPPORTED is really a stall\");\n\t\tif (UkwIsPipeHalted(priv->dev, transfer->endpoint, &halted)) {\n\t\t\t/* Pipe status retrieved, so now request endpoint status by sending a GET_STATUS\n\t\t\t * control request to the device. This is done synchronously, which is a bit\n\t\t\t * naughty, but this is a special corner case.\n\t\t\t */\n\t\t\tWORD wStatus = 0;\n\t\t\tDWORD written = 0;\n\t\t\tUKW_CONTROL_HEADER ctrlHeader;\n\t\t\tctrlHeader.bmRequestType = LIBUSB_REQUEST_TYPE_STANDARD |\n\t\t\t\tLIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_ENDPOINT;\n\t\t\tctrlHeader.bRequest = LIBUSB_REQUEST_GET_STATUS;\n\t\t\tctrlHeader.wValue = 0;\n\t\t\tctrlHeader.wIndex = transfer->endpoint;\n\t\t\tctrlHeader.wLength = sizeof(wStatus);\n\t\t\tif (UkwIssueControlTransfer(priv->dev,\n\t\t\t\t\tUKW_TF_IN_TRANSFER | UKW_TF_SEND_TO_ENDPOINT,\n\t\t\t\t\t&ctrlHeader, &wStatus, sizeof(wStatus), &written, NULL)) {\n\t\t\t\tif (written == sizeof(wStatus) &&\n\t\t\t\t\t\t(wStatus & STATUS_HALT_FLAG) == 0) {\n\t\t\t\t\tif (!halted || UkwClearHaltHost(priv->dev, transfer->endpoint)) {\n\t\t\t\t\t\tusbi_dbg(\"Endpoint doesn't appear to be stalled, overriding error with success\");\n\t\t\t\t\t\tio_result = ERROR_SUCCESS;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tusbi_dbg(\"Endpoint doesn't appear to be stalled, but the host is halted, changing error\");\n\t\t\t\t\t\tio_result = ERROR_IO_DEVICE;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch(io_result) {\n\tcase ERROR_SUCCESS:\n\t\titransfer->transferred += io_size;\n\t\tstatus = LIBUSB_TRANSFER_COMPLETED;\n\t\tbreak;\n\tcase ERROR_CANCELLED:\n\t\tusbi_dbg(\"detected transfer cancel\");\n\t\tstatus = LIBUSB_TRANSFER_CANCELLED;\n\t\tbreak;\n\tcase ERROR_NOT_SUPPORTED:\n\tcase ERROR_GEN_FAILURE:\n\t\tusbi_dbg(\"detected endpoint stall\");\n\t\tstatus = LIBUSB_TRANSFER_STALL;\n\t\tbreak;\n\tcase ERROR_SEM_TIMEOUT:\n\t\tusbi_dbg(\"detected semaphore timeout\");\n\t\tstatus = LIBUSB_TRANSFER_TIMED_OUT;\n\t\tbreak;\n\tcase ERROR_OPERATION_ABORTED:\n\t\tusbi_dbg(\"detected operation aborted\");\n\t\tstatus = LIBUSB_TRANSFER_CANCELLED;\n\t\tbreak;\n\tdefault:\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"detected I/O error: %s\", windows_error_str(io_result));\n\t\tstatus = LIBUSB_TRANSFER_ERROR;\n\t\tbreak;\n\t}\n\n\twince_clear_transfer_priv(itransfer);\n\tif (status == LIBUSB_TRANSFER_CANCELLED)\n\t\tusbi_handle_transfer_cancellation(itransfer);\n\telse\n\t\tusbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status);\n}\n\nstatic void wince_handle_callback(\n\tstruct usbi_transfer *itransfer,\n\tuint32_t io_result, uint32_t io_size)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\twince_transfer_callback (itransfer, io_result, io_size);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\tbreak;\n\tdefault:\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"unknown endpoint type %d\", transfer->type);\n\t}\n}\n\nstatic int wince_handle_events(\n\tstruct libusb_context *ctx,\n\tstruct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready)\n{\n\tstruct wince_transfer_priv* transfer_priv = NULL;\n\tPOLL_NFDS_TYPE i = 0;\n\tBOOL found = FALSE;\n\tstruct usbi_transfer *transfer;\n\tDWORD io_size, io_result;\n\tint r = LIBUSB_SUCCESS;\n\n\tusbi_mutex_lock(&ctx->open_devs_lock);\n\tfor (i = 0; i < nfds && num_ready > 0; i++) {\n\n\t\tusbi_dbg(\"checking fd %d with revents = %04x\", fds[i].fd, fds[i].revents);\n\n\t\tif (!fds[i].revents)\n\t\t\tcontinue;\n\n\t\tnum_ready--;\n\n\t\t// Because a Windows OVERLAPPED is used for poll emulation,\n\t\t// a pollable fd is created and stored with each transfer\n\t\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\t\tlist_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) {\n\t\t\ttransfer_priv = usbi_transfer_get_os_priv(transfer);\n\t\t\tif (transfer_priv->pollable_fd.fd == fds[i].fd) {\n\t\t\t\tfound = TRUE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\n\t\tif (found && HasOverlappedIoCompleted(transfer_priv->pollable_fd.overlapped)) {\n\t\t\tio_result = (DWORD)transfer_priv->pollable_fd.overlapped->Internal;\n\t\t\tio_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh;\n\t\t\tusbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd);\n\t\t\t// let handle_callback free the event using the transfer wfd\n\t\t\t// If you don't use the transfer wfd, you run a risk of trying to free a\n\t\t\t// newly allocated wfd that took the place of the one from the transfer.\n\t\t\twince_handle_callback(transfer, io_result, io_size);\n\t\t} else if (found) {\n\t\t\tusbi_err(ctx, \"matching transfer for fd %d has not completed\", fds[i]);\n\t\t\tr = LIBUSB_ERROR_OTHER;\n\t\t\tbreak;\n\t\t} else {\n\t\t\tusbi_err(ctx, \"could not find a matching transfer for fd %d\", fds[i]);\n\t\t\tr = LIBUSB_ERROR_NOT_FOUND;\n\t\t\tbreak;\n\t\t}\n\t}\n\tusbi_mutex_unlock(&ctx->open_devs_lock);\n\n\treturn r;\n}\n\n/*\n * Monotonic and real time functions\n */\nstatic int wince_clock_gettime(int clk_id, struct timespec *tp)\n{\n\tLARGE_INTEGER hires_counter;\n\tULARGE_INTEGER rtime;\n\tFILETIME filetime;\n\tSYSTEMTIME st;\n\n\tswitch(clk_id) {\n\tcase USBI_CLOCK_MONOTONIC:\n\t\tif (hires_frequency != 0 && QueryPerformanceCounter(&hires_counter)) {\n\t\t\ttp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency);\n\t\t\ttp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps);\n\t\t\treturn LIBUSB_SUCCESS;\n\t\t}\n\t\t// Fall through and return real-time if monotonic read failed or was not detected @ init\n\tcase USBI_CLOCK_REALTIME:\n\t\t// We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx\n\t\t// with a predef epoch time to have an epoch that starts at 1970.01.01 00:00\n\t\t// Note however that our resolution is bounded by the Windows system time\n\t\t// functions and is at best of the order of 1 ms (or, usually, worse)\n\t\tGetSystemTime(&st);\n\t\tSystemTimeToFileTime(&st, &filetime);\n\t\trtime.LowPart = filetime.dwLowDateTime;\n\t\trtime.HighPart = filetime.dwHighDateTime;\n\t\trtime.QuadPart -= EPOCH_TIME;\n\t\ttp->tv_sec = (long)(rtime.QuadPart / 10000000);\n\t\ttp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100);\n\t\treturn LIBUSB_SUCCESS;\n\tdefault:\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nconst struct usbi_os_backend wince_backend = {\n\t\"Windows CE\",\n\t0,\n\twince_init,\n\twince_exit,\n\n\twince_get_device_list,\n\tNULL,\t\t\t\t/* hotplug_poll */\n\twince_open,\n\twince_close,\n\n\twince_get_device_descriptor,\n\twince_get_active_config_descriptor,\n\twince_get_config_descriptor,\n\tNULL,\t\t\t\t/* get_config_descriptor_by_value() */\n\n\twince_get_configuration,\n\twince_set_configuration,\n\twince_claim_interface,\n\twince_release_interface,\n\n\twince_set_interface_altsetting,\n\twince_clear_halt,\n\twince_reset_device,\n\n\tNULL,\t\t\t\t/* alloc_streams */\n\tNULL,\t\t\t\t/* free_streams */\n\n\tNULL,\t\t\t\t/* dev_mem_alloc() */\n\tNULL,\t\t\t\t/* dev_mem_free() */\n\n\twince_kernel_driver_active,\n\twince_detach_kernel_driver,\n\twince_attach_kernel_driver,\n\n\twince_destroy_device,\n\n\twince_submit_transfer,\n\twince_cancel_transfer,\n\twince_clear_transfer_priv,\n\n\twince_handle_events,\n\tNULL,\t\t\t\t/* handle_transfer_completion() */\n\n\twince_clock_gettime,\n\tsizeof(struct wince_device_priv),\n\t0,\n\tsizeof(struct wince_transfer_priv),\n};\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.h",
    "content": "/*\n * Windows CE backend for libusb 1.0\n * Copyright © 2011-2013 RealVNC Ltd.\n * Portions taken from Windows backend, which is\n * Copyright © 2009-2010 Pete Batard <pbatard@gmail.com>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer\n * Major code testing contribution by Xiaofan Chen\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n#pragma once\n\n#include \"windows_common.h\"\n\n#include <windows.h>\n#include \"poll_windows.h\"\n\n#define MAX_DEVICE_COUNT            256\n\n// This is a modified dump of the types in the ceusbkwrapper.h library header\n// with functions transformed into extern pointers.\n//\n// This backend dynamically loads ceusbkwrapper.dll and doesn't include\n// ceusbkwrapper.h directly to simplify the build process. The kernel\n// side wrapper driver is built using the platform image build tools,\n// which makes it difficult to reference directly from the libusb build\n// system.\nstruct UKW_DEVICE_PRIV;\ntypedef struct UKW_DEVICE_PRIV *UKW_DEVICE;\ntypedef UKW_DEVICE *PUKW_DEVICE, *LPUKW_DEVICE;\n\ntypedef struct {\n\tUINT8 bLength;\n\tUINT8 bDescriptorType;\n\tUINT16 bcdUSB;\n\tUINT8 bDeviceClass;\n\tUINT8 bDeviceSubClass;\n\tUINT8 bDeviceProtocol;\n\tUINT8 bMaxPacketSize0;\n\tUINT16 idVendor;\n\tUINT16 idProduct;\n\tUINT16 bcdDevice;\n\tUINT8 iManufacturer;\n\tUINT8 iProduct;\n\tUINT8 iSerialNumber;\n\tUINT8 bNumConfigurations;\n} UKW_DEVICE_DESCRIPTOR, *PUKW_DEVICE_DESCRIPTOR, *LPUKW_DEVICE_DESCRIPTOR;\n\ntypedef struct {\n\tUINT8 bmRequestType;\n\tUINT8 bRequest;\n\tUINT16 wValue;\n\tUINT16 wIndex;\n\tUINT16 wLength;\n} UKW_CONTROL_HEADER, *PUKW_CONTROL_HEADER, *LPUKW_CONTROL_HEADER;\n\n// Collection of flags which can be used when issuing transfer requests\n/* Indicates that the transfer direction is 'in' */\n#define UKW_TF_IN_TRANSFER        0x00000001\n/* Indicates that the transfer direction is 'out' */\n#define UKW_TF_OUT_TRANSFER       0x00000000\n/* Specifies that the transfer should complete as soon as possible,\n * even if no OVERLAPPED structure has been provided. */\n#define UKW_TF_NO_WAIT            0x00000100\n/* Indicates that transfers shorter than the buffer are ok */\n#define UKW_TF_SHORT_TRANSFER_OK  0x00000200\n#define UKW_TF_SEND_TO_DEVICE     0x00010000\n#define UKW_TF_SEND_TO_INTERFACE  0x00020000\n#define UKW_TF_SEND_TO_ENDPOINT   0x00040000\n/* Don't block when waiting for memory allocations */\n#define UKW_TF_DONT_BLOCK_FOR_MEM 0x00080000\n\n/* Value to use when dealing with configuration values, such as UkwGetConfigDescriptor, \n * to specify the currently active configuration for the device. */\n#define UKW_ACTIVE_CONFIGURATION -1\n\nDLL_DECLARE_HANDLE(ceusbkwrapper);\nDLL_DECLARE_FUNC(WINAPI, HANDLE, UkwOpenDriver, ());\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceList, (HANDLE, LPUKW_DEVICE, DWORD, LPDWORD));\nDLL_DECLARE_FUNC(WINAPI, void, UkwReleaseDeviceList, (HANDLE, LPUKW_DEVICE, DWORD));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceAddress, (UKW_DEVICE, unsigned char*, unsigned char*, unsigned long*));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceDescriptor, (UKW_DEVICE, LPUKW_DEVICE_DESCRIPTOR));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetConfigDescriptor, (UKW_DEVICE, DWORD, LPVOID, DWORD, LPDWORD));\nDLL_DECLARE_FUNC(WINAPI, void, UkwCloseDriver, (HANDLE));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwCancelTransfer, (UKW_DEVICE, LPOVERLAPPED, DWORD));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwIssueControlTransfer, (UKW_DEVICE, DWORD, LPUKW_CONTROL_HEADER, LPVOID, DWORD, LPDWORD, LPOVERLAPPED));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwClaimInterface, (UKW_DEVICE, DWORD));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwReleaseInterface, (UKW_DEVICE, DWORD));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwSetInterfaceAlternateSetting, (UKW_DEVICE, DWORD, DWORD));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwClearHaltHost, (UKW_DEVICE, UCHAR));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwClearHaltDevice, (UKW_DEVICE, UCHAR));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetConfig, (UKW_DEVICE, PUCHAR));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwSetConfig, (UKW_DEVICE, UCHAR));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwResetDevice, (UKW_DEVICE));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwKernelDriverActive, (UKW_DEVICE, DWORD, PBOOL));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwAttachKernelDriver, (UKW_DEVICE, DWORD));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwDetachKernelDriver, (UKW_DEVICE, DWORD));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwIssueBulkTransfer, (UKW_DEVICE, DWORD, UCHAR, LPVOID, DWORD, LPDWORD, LPOVERLAPPED));\nDLL_DECLARE_FUNC(WINAPI, BOOL, UkwIsPipeHalted, (UKW_DEVICE, UCHAR, LPBOOL));\n\n// Used to determine if an endpoint status really is halted on a failed transfer.\n#define STATUS_HALT_FLAG 0x1\n\nstruct wince_device_priv {\n\tUKW_DEVICE dev;\n\tUKW_DEVICE_DESCRIPTOR desc;\n};\n\nstruct wince_transfer_priv {\n\tstruct winfd pollable_fd;\n\tuint8_t interface_number;\n};\n\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/windows_common.h",
    "content": "/*\n * Windows backend common header for libusb 1.0\n *\n * This file brings together header code common between\n * the desktop Windows and Windows CE backends.\n * Copyright © 2012-2013 RealVNC Ltd.\n * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer\n * Major code testing contribution by Xiaofan Chen\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#pragma once\n\n// Windows API default is uppercase - ugh!\n#if !defined(bool)\n#define bool BOOL\n#endif\n#if !defined(true)\n#define true TRUE\n#endif\n#if !defined(false)\n#define false FALSE\n#endif\n\n#define EPOCH_TIME\tUINT64_C(116444736000000000)\t// 1970.01.01 00:00:000 in MS Filetime\n\n#if defined(__CYGWIN__ )\n#define _stricmp strcasecmp\n#define _strdup strdup\n// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread\n#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, (LPDWORD)f)\n#endif\n\n#define safe_free(p) do {if (p != NULL) {free((void *)p); p = NULL;}} while (0)\n\n#ifndef ARRAYSIZE\n#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))\n#endif\n\n#define ERR_BUFFER_SIZE\t256\n\n/*\n * API macros - leveraged from libusb-win32 1.x\n */\n#ifndef _WIN32_WCE\n#define DLL_STRINGIFY(s) #s\n#define DLL_LOAD_LIBRARY(name) LoadLibraryA(DLL_STRINGIFY(name))\n#else\n#define DLL_STRINGIFY(s) L#s\n#define DLL_LOAD_LIBRARY(name) LoadLibrary(DLL_STRINGIFY(name))\n#endif\n\n/*\n * Macros for handling DLL themselves\n */\n#define DLL_DECLARE_HANDLE(name)\t\t\t\t\\\n\tstatic HMODULE __dll_##name##_handle = NULL\n\n#define DLL_GET_HANDLE(name)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\t__dll_##name##_handle = DLL_LOAD_LIBRARY(name);\t\\\n\t\tif (!__dll_##name##_handle)\t\t\t\\\n\t\t\treturn LIBUSB_ERROR_OTHER;\t\t\\\n\t} while (0)\n\n#define DLL_FREE_HANDLE(name)\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\\\n\t\tif (__dll_##name##_handle) {\t\t\t\\\n\t\t\tFreeLibrary(__dll_##name##_handle);\t\\\n\t\t\t__dll_##name##_handle = NULL;\t\t\\\n\t\t}\t\t\t\t\t\t\\\n\t} while(0)\n\n\n/*\n * Macros for handling functions within a DLL\n */\n#define DLL_DECLARE_FUNC_PREFIXNAME(api, ret, prefixname, name, args)\t\\\n\ttypedef ret (api * __dll_##name##_func_t)args;\t\t\t\\\n\tstatic __dll_##name##_func_t prefixname = NULL\n\n#define DLL_DECLARE_FUNC(api, ret, name, args)\t\t\t\t\\\n\tDLL_DECLARE_FUNC_PREFIXNAME(api, ret, name, name, args)\n#define DLL_DECLARE_FUNC_PREFIXED(api, ret, prefix, name, args)\t\t\\\n\tDLL_DECLARE_FUNC_PREFIXNAME(api, ret, prefix##name, name, args)\n\n#define DLL_LOAD_FUNC_PREFIXNAME(dll, prefixname, name, ret_on_failure)\t\\\n\tdo {\t\t\t\t\t\t\t\t\\\n\t\tHMODULE h = __dll_##dll##_handle;\t\t\t\\\n\t\tprefixname = (__dll_##name##_func_t)GetProcAddress(h,\t\\\n\t\t\t\tDLL_STRINGIFY(name));\t\t\t\\\n\t\tif (prefixname)\t\t\t\t\t\t\\\n\t\t\tbreak;\t\t\t\t\t\t\\\n\t\tprefixname = (__dll_##name##_func_t)GetProcAddress(h,\t\\\n\t\t\t\tDLL_STRINGIFY(name) DLL_STRINGIFY(A));\t\\\n\t\tif (prefixname)\t\t\t\t\t\t\\\n\t\t\tbreak;\t\t\t\t\t\t\\\n\t\tprefixname = (__dll_##name##_func_t)GetProcAddress(h,\t\\\n\t\t\t\tDLL_STRINGIFY(name) DLL_STRINGIFY(W));\t\\\n\t\tif (prefixname)\t\t\t\t\t\t\\\n\t\t\tbreak;\t\t\t\t\t\t\\\n\t\tif (ret_on_failure)\t\t\t\t\t\\\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\t\t\t\\\n\t} while(0)\n\n#define DLL_LOAD_FUNC(dll, name, ret_on_failure)\t\t\t\\\n\tDLL_LOAD_FUNC_PREFIXNAME(dll, name, name, ret_on_failure)\n#define DLL_LOAD_FUNC_PREFIXED(dll, prefix, name, ret_on_failure)\t\\\n\tDLL_LOAD_FUNC_PREFIXNAME(dll, prefix##name, name, ret_on_failure)\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.c",
    "content": "/*\n * windows backend for libusb 1.0\n * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer\n * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software\n * Hash table functions adapted from glibc, by Ulrich Drepper et al.\n * Major code testing contribution by Xiaofan Chen\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <inttypes.h>\n#include <process.h>\n#include <stdio.h>\n\n#include \"libusbi.h\"\n#include \"windows_common.h\"\n#include \"windows_nt_common.h\"\n\n// Global variables for clock_gettime mechanism\nstatic uint64_t hires_ticks_to_ps;\nstatic uint64_t hires_frequency;\n\n#define TIMER_REQUEST_RETRY_MS\t100\n#define WM_TIMER_REQUEST\t(WM_USER + 1)\n#define WM_TIMER_EXIT\t\t(WM_USER + 2)\n\n// used for monotonic clock_gettime()\nstruct timer_request {\n\tstruct timespec *tp;\n\tHANDLE event;\n};\n\n// Timer thread\nstatic HANDLE timer_thread = NULL;\nstatic DWORD timer_thread_id = 0;\n\n/* User32 dependencies */\nDLL_DECLARE_HANDLE(User32);\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM));\n\nstatic unsigned __stdcall windows_clock_gettime_threaded(void *param);\n\n/*\n* Converts a windows error to human readable string\n* uses retval as errorcode, or, if 0, use GetLastError()\n*/\n#if defined(ENABLE_LOGGING)\nconst char *windows_error_str(DWORD error_code)\n{\n\tstatic char err_string[ERR_BUFFER_SIZE];\n\n\tDWORD size;\n\tint len;\n\n\tif (error_code == 0)\n\t\terror_code = GetLastError();\n\n\tlen = sprintf(err_string, \"[%u] \", (unsigned int)error_code);\n\n\t// Translate codes returned by SetupAPI. The ones we are dealing with are either\n\t// in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes.\n\t// See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx\n\tswitch (error_code & 0xE0000000) {\n\tcase 0:\n\t\terror_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified\n\t\tbreak;\n\tcase 0xE0000000:\n\t\terror_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n\n\tsize = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,\n\t\t\tNULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n\t\t\t&err_string[len], ERR_BUFFER_SIZE - len, NULL);\n\tif (size == 0) {\n\t\tDWORD format_error = GetLastError();\n\t\tif (format_error)\n\t\t\tsnprintf(err_string, ERR_BUFFER_SIZE,\n\t\t\t\t\"Windows error code %u (FormatMessage error code %u)\",\n\t\t\t\t(unsigned int)error_code, (unsigned int)format_error);\n\t\telse\n\t\t\tsnprintf(err_string, ERR_BUFFER_SIZE, \"Unknown error code %u\", (unsigned int)error_code);\n\t} else {\n\t\t// Remove CRLF from end of message, if present\n\t\tsize_t pos = len + size - 2;\n\t\tif (err_string[pos] == '\\r')\n\t\t\terr_string[pos] = '\\0';\n\t}\n\n\treturn err_string;\n}\n#endif\n\n/* Hash table functions - modified From glibc 2.3.2:\n   [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986\n   [Knuth]            The Art of Computer Programming, part 3 (6.4)  */\n\n#define HTAB_SIZE 1021UL\t// *MUST* be a prime number!!\n\ntypedef struct htab_entry {\n\tunsigned long used;\n\tchar *str;\n} htab_entry;\n\nstatic htab_entry *htab_table = NULL;\nstatic usbi_mutex_t htab_mutex = NULL;\nstatic unsigned long htab_filled;\n\n/* Before using the hash table we must allocate memory for it.\n   We allocate one element more as the found prime number says.\n   This is done for more effective indexing as explained in the\n   comment for the hash function.  */\nstatic bool htab_create(struct libusb_context *ctx)\n{\n\tif (htab_table != NULL) {\n\t\tusbi_err(ctx, \"hash table already allocated\");\n\t\treturn true;\n\t}\n\n\t// Create a mutex\n\tusbi_mutex_init(&htab_mutex);\n\n\tusbi_dbg(\"using %lu entries hash table\", HTAB_SIZE);\n\thtab_filled = 0;\n\n\t// allocate memory and zero out.\n\thtab_table = calloc(HTAB_SIZE + 1, sizeof(htab_entry));\n\tif (htab_table == NULL) {\n\t\tusbi_err(ctx, \"could not allocate space for hash table\");\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/* After using the hash table it has to be destroyed.  */\nstatic void htab_destroy(void)\n{\n\tunsigned long i;\n\n\tif (htab_table == NULL)\n\t\treturn;\n\n\tfor (i = 0; i < HTAB_SIZE; i++)\n\t\tfree(htab_table[i].str);\n\n\tsafe_free(htab_table);\n\n\tusbi_mutex_destroy(&htab_mutex);\n}\n\n/* This is the search function. It uses double hashing with open addressing.\n   We use a trick to speed up the lookup. The table is created with one\n   more element available. This enables us to use the index zero special.\n   This index will never be used because we store the first hash index in\n   the field used where zero means not used. Every other value means used.\n   The used field can be used as a first fast comparison for equality of\n   the stored and the parameter value. This helps to prevent unnecessary\n   expensive calls of strcmp.  */\nunsigned long htab_hash(const char *str)\n{\n\tunsigned long hval, hval2;\n\tunsigned long idx;\n\tunsigned long r = 5381;\n\tint c;\n\tconst char *sz = str;\n\n\tif (str == NULL)\n\t\treturn 0;\n\n\t// Compute main hash value (algorithm suggested by Nokia)\n\twhile ((c = *sz++) != 0)\n\t\tr = ((r << 5) + r) + c;\n\tif (r == 0)\n\t\t++r;\n\n\t// compute table hash: simply take the modulus\n\thval = r % HTAB_SIZE;\n\tif (hval == 0)\n\t\t++hval;\n\n\t// Try the first index\n\tidx = hval;\n\n\t// Mutually exclusive access (R/W lock would be better)\n\tusbi_mutex_lock(&htab_mutex);\n\n\tif (htab_table[idx].used) {\n\t\tif ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0))\n\t\t\tgoto out_unlock; // existing hash\n\n\t\tusbi_dbg(\"hash collision ('%s' vs '%s')\", str, htab_table[idx].str);\n\n\t\t// Second hash function, as suggested in [Knuth]\n\t\thval2 = 1 + hval % (HTAB_SIZE - 2);\n\n\t\tdo {\n\t\t\t// Because size is prime this guarantees to step through all available indexes\n\t\t\tif (idx <= hval2)\n\t\t\t\tidx = HTAB_SIZE + idx - hval2;\n\t\t\telse\n\t\t\t\tidx -= hval2;\n\n\t\t\t// If we visited all entries leave the loop unsuccessfully\n\t\t\tif (idx == hval)\n\t\t\t\tbreak;\n\n\t\t\t// If entry is found use it.\n\t\t\tif ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0))\n\t\t\t\tgoto out_unlock;\n\t\t} while (htab_table[idx].used);\n\t}\n\n\t// Not found => New entry\n\n\t// If the table is full return an error\n\tif (htab_filled >= HTAB_SIZE) {\n\t\tusbi_err(NULL, \"hash table is full (%lu entries)\", HTAB_SIZE);\n\t\tidx = 0;\n\t\tgoto out_unlock;\n\t}\n\n\thtab_table[idx].str = _strdup(str);\n\tif (htab_table[idx].str == NULL) {\n\t\tusbi_err(NULL, \"could not duplicate string for hash table\");\n\t\tidx = 0;\n\t\tgoto out_unlock;\n\t}\n\n\thtab_table[idx].used = hval;\n\t++htab_filled;\n\nout_unlock:\n\tusbi_mutex_unlock(&htab_mutex);\n\n\treturn idx;\n}\n\nstatic int windows_init_dlls(void)\n{\n\tDLL_GET_HANDLE(User32);\n\tDLL_LOAD_FUNC_PREFIXED(User32, p, GetMessageA, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(User32, p, PeekMessageA, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(User32, p, PostThreadMessageA, TRUE);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void windows_exit_dlls(void)\n{\n\tDLL_FREE_HANDLE(User32);\n}\n\nstatic bool windows_init_clock(struct libusb_context *ctx)\n{\n\tDWORD_PTR affinity, dummy;\n\tHANDLE event = NULL;\n\tLARGE_INTEGER li_frequency;\n\tint i;\n\n\tif (QueryPerformanceFrequency(&li_frequency)) {\n\t\t// Load DLL imports\n\t\tif (windows_init_dlls() != LIBUSB_SUCCESS) {\n\t\t\tusbi_err(ctx, \"could not resolve DLL functions\");\n\t\t\treturn false;\n\t\t}\n\n\t\t// The hires frequency can go as high as 4 GHz, so we'll use a conversion\n\t\t// to picoseconds to compute the tv_nsecs part in clock_gettime\n\t\thires_frequency = li_frequency.QuadPart;\n\t\thires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency;\n\t\tusbi_dbg(\"hires timer available (Frequency: %\"PRIu64\" Hz)\", hires_frequency);\n\n\t\t// Because QueryPerformanceCounter might report different values when\n\t\t// running on different cores, we create a separate thread for the timer\n\t\t// calls, which we glue to the first available core always to prevent timing discrepancies.\n\t\tif (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) {\n\t\t\tusbi_err(ctx, \"could not get process affinity: %s\", windows_error_str(0));\n\t\t\treturn false;\n\t\t}\n\n\t\t// The process affinity mask is a bitmask where each set bit represents a core on\n\t\t// which this process is allowed to run, so we find the first set bit\n\t\tfor (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++);\n\t\taffinity = (DWORD_PTR)(1 << i);\n\n\t\tusbi_dbg(\"timer thread will run on core #%d\", i);\n\n\t\tevent = CreateEvent(NULL, FALSE, FALSE, NULL);\n\t\tif (event == NULL) {\n\t\t\tusbi_err(ctx, \"could not create event: %s\", windows_error_str(0));\n\t\t\treturn false;\n\t\t}\n\n\t\ttimer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event,\n\t\t\t\t0, (unsigned int *)&timer_thread_id);\n\t\tif (timer_thread == NULL) {\n\t\t\tusbi_err(ctx, \"unable to create timer thread - aborting\");\n\t\t\tCloseHandle(event);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!SetThreadAffinityMask(timer_thread, affinity))\n\t\t\tusbi_warn(ctx, \"unable to set timer thread affinity, timer discrepancies may arise\");\n\n\t\t// Wait for timer thread to init before continuing.\n\t\tif (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) {\n\t\t\tusbi_err(ctx, \"failed to wait for timer thread to become ready - aborting\");\n\t\t\tCloseHandle(event);\n\t\t\treturn false;\n\t\t}\n\n\t\tCloseHandle(event);\n\t} else {\n\t\tusbi_dbg(\"no hires timer available on this platform\");\n\t\thires_frequency = 0;\n\t\thires_ticks_to_ps = UINT64_C(0);\n\t}\n\n\treturn true;\n}\n\nvoid windows_destroy_clock(void)\n{\n\tif (timer_thread) {\n\t\t// actually the signal to quit the thread.\n\t\tif (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0)\n\t\t\t\t|| (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) {\n\t\t\tusbi_dbg(\"could not wait for timer thread to quit\");\n\t\t\tTerminateThread(timer_thread, 1);\n\t\t\t// shouldn't happen, but we're destroying\n\t\t\t// all objects it might have held anyway.\n\t\t}\n\t\tCloseHandle(timer_thread);\n\t\ttimer_thread = NULL;\n\t\ttimer_thread_id = 0;\n\t}\n}\n\n/*\n* Monotonic and real time functions\n*/\nstatic unsigned __stdcall windows_clock_gettime_threaded(void *param)\n{\n\tstruct timer_request *request;\n\tLARGE_INTEGER hires_counter;\n\tMSG msg;\n\n\t// The following call will create this thread's message queue\n\t// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx\n\tpPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);\n\n\t// Signal windows_init_clock() that we're ready to service requests\n\tif (!SetEvent((HANDLE)param))\n\t\tusbi_dbg(\"SetEvent failed for timer init event: %s\", windows_error_str(0));\n\tparam = NULL;\n\n\t// Main loop - wait for requests\n\twhile (1) {\n\t\tif (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) {\n\t\t\tusbi_err(NULL, \"GetMessage failed for timer thread: %s\", windows_error_str(0));\n\t\t\treturn 1;\n\t\t}\n\n\t\tswitch (msg.message) {\n\t\tcase WM_TIMER_REQUEST:\n\t\t\t// Requests to this thread are for hires always\n\t\t\t// Microsoft says that this function always succeeds on XP and later\n\t\t\t// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx\n\t\t\trequest = (struct timer_request *)msg.lParam;\n\t\t\tQueryPerformanceCounter(&hires_counter);\n\t\t\trequest->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency);\n\t\t\trequest->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps);\n\t\t\tif (!SetEvent(request->event))\n\t\t\t\tusbi_err(NULL, \"SetEvent failed for timer request: %s\", windows_error_str(0));\n\t\t\tbreak;\n\t\tcase WM_TIMER_EXIT:\n\t\t\tusbi_dbg(\"timer thread quitting\");\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n\nint windows_clock_gettime(int clk_id, struct timespec *tp)\n{\n\tstruct timer_request request;\n#if !defined(_MSC_VER) || (_MSC_VER < 1900)\n\tFILETIME filetime;\n\tULARGE_INTEGER rtime;\n#endif\n\tDWORD r;\n\n\tswitch (clk_id) {\n\tcase USBI_CLOCK_MONOTONIC:\n\t\tif (timer_thread) {\n\t\t\trequest.tp = tp;\n\t\t\trequest.event = CreateEvent(NULL, FALSE, FALSE, NULL);\n\t\t\tif (request.event == NULL)\n\t\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\t\t\tif (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) {\n\t\t\t\tusbi_err(NULL, \"PostThreadMessage failed for timer thread: %s\", windows_error_str(0));\n\t\t\t\tCloseHandle(request.event);\n\t\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t\t}\n\n\t\t\tdo {\n\t\t\t\tr = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS);\n\t\t\t\tif (r == WAIT_TIMEOUT)\n\t\t\t\t\tusbi_dbg(\"could not obtain a timer value within reasonable timeframe - too much load?\");\n\t\t\t\telse if (r == WAIT_FAILED)\n\t\t\t\t\tusbi_err(NULL, \"WaitForSingleObject failed: %s\", windows_error_str(0));\n\t\t\t} while (r == WAIT_TIMEOUT);\n\t\t\tCloseHandle(request.event);\n\n\t\t\tif (r == WAIT_OBJECT_0)\n\t\t\t\treturn LIBUSB_SUCCESS;\n\t\t\telse\n\t\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\t\t// Fall through and return real-time if monotonic was not detected @ timer init\n\tcase USBI_CLOCK_REALTIME:\n#if defined(_MSC_VER) && (_MSC_VER >= 1900)\n\t\ttimespec_get(tp, TIME_UTC);\n#else\n\t\t// We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx\n\t\t// with a predef epoch time to have an epoch that starts at 1970.01.01 00:00\n\t\t// Note however that our resolution is bounded by the Windows system time\n\t\t// functions and is at best of the order of 1 ms (or, usually, worse)\n\t\tGetSystemTimeAsFileTime(&filetime);\n\t\trtime.LowPart = filetime.dwLowDateTime;\n\t\trtime.HighPart = filetime.dwHighDateTime;\n\t\trtime.QuadPart -= EPOCH_TIME;\n\t\ttp->tv_sec = (long)(rtime.QuadPart / 10000000);\n\t\ttp->tv_nsec = (long)((rtime.QuadPart % 10000000) * 100);\n#endif\n\t\treturn LIBUSB_SUCCESS;\n\tdefault:\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nstatic void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size)\n{\n\tint status, istatus;\n\n\tusbi_dbg(\"handling I/O completion with errcode %u, size %u\", io_result, io_size);\n\n\tswitch (io_result) {\n\tcase NO_ERROR:\n\t\tstatus = windows_copy_transfer_data(itransfer, io_size);\n\t\tbreak;\n\tcase ERROR_GEN_FAILURE:\n\t\tusbi_dbg(\"detected endpoint stall\");\n\t\tstatus = LIBUSB_TRANSFER_STALL;\n\t\tbreak;\n\tcase ERROR_SEM_TIMEOUT:\n\t\tusbi_dbg(\"detected semaphore timeout\");\n\t\tstatus = LIBUSB_TRANSFER_TIMED_OUT;\n\t\tbreak;\n\tcase ERROR_OPERATION_ABORTED:\n\t\tistatus = windows_copy_transfer_data(itransfer, io_size);\n\t\tif (istatus != LIBUSB_TRANSFER_COMPLETED)\n\t\t\tusbi_dbg(\"Failed to copy partial data in aborted operation: %d\", istatus);\n\n\t\tusbi_dbg(\"detected operation aborted\");\n\t\tstatus = LIBUSB_TRANSFER_CANCELLED;\n\t\tbreak;\n\tdefault:\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"detected I/O error %u: %s\", io_result, windows_error_str(io_result));\n\t\tstatus = LIBUSB_TRANSFER_ERROR;\n\t\tbreak;\n\t}\n\twindows_clear_transfer_priv(itransfer);\t// Cancel polling\n\tif (status == LIBUSB_TRANSFER_CANCELLED)\n\t\tusbi_handle_transfer_cancellation(itransfer);\n\telse\n\t\tusbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status);\n}\n\nvoid windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\twindows_transfer_callback(itransfer, io_result, io_size);\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\tusbi_warn(ITRANSFER_CTX(itransfer), \"bulk stream transfers are not yet supported on this platform\");\n\t\tbreak;\n\tdefault:\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"unknown endpoint type %d\", transfer->type);\n\t}\n}\n\nint windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready)\n{\n\tPOLL_NFDS_TYPE i;\n\tbool found = false;\n\tstruct usbi_transfer *transfer;\n\tstruct winfd *pollable_fd = NULL;\n\tDWORD io_size, io_result;\n\tint r = LIBUSB_SUCCESS;\n\n\tusbi_mutex_lock(&ctx->open_devs_lock);\n\tfor (i = 0; i < nfds && num_ready > 0; i++) {\n\n\t\tusbi_dbg(\"checking fd %d with revents = %04x\", fds[i].fd, fds[i].revents);\n\n\t\tif (!fds[i].revents)\n\t\t\tcontinue;\n\n\t\tnum_ready--;\n\n\t\t// Because a Windows OVERLAPPED is used for poll emulation,\n\t\t// a pollable fd is created and stored with each transfer\n\t\tusbi_mutex_lock(&ctx->flying_transfers_lock);\n\t\tfound = false;\n\t\tlist_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) {\n\t\t\tpollable_fd = windows_get_fd(transfer);\n\t\t\tif (pollable_fd->fd == fds[i].fd) {\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tusbi_mutex_unlock(&ctx->flying_transfers_lock);\n\n\t\tif (found) {\n\t\t\twindows_get_overlapped_result(transfer, pollable_fd, &io_result, &io_size);\n\n\t\t\tusbi_remove_pollfd(ctx, pollable_fd->fd);\n\t\t\t// let handle_callback free the event using the transfer wfd\n\t\t\t// If you don't use the transfer wfd, you run a risk of trying to free a\n\t\t\t// newly allocated wfd that took the place of the one from the transfer.\n\t\t\twindows_handle_callback(transfer, io_result, io_size);\n\t\t} else {\n\t\t\tusbi_err(ctx, \"could not find a matching transfer for fd %d\", fds[i]);\n\t\t\tr = LIBUSB_ERROR_NOT_FOUND;\n\t\t\tbreak;\n\t\t}\n\t}\n\tusbi_mutex_unlock(&ctx->open_devs_lock);\n\n\treturn r;\n}\n\nint windows_common_init(struct libusb_context *ctx)\n{\n\tif (!windows_init_clock(ctx))\n\t\tgoto error_roll_back;\n\n\tif (!htab_create(ctx))\n\t\tgoto error_roll_back;\n\n\treturn LIBUSB_SUCCESS;\n\nerror_roll_back:\n\twindows_common_exit();\n\treturn LIBUSB_ERROR_NO_MEM;\n}\n\nvoid windows_common_exit(void)\n{\n\thtab_destroy();\n\twindows_destroy_clock();\n\twindows_exit_dlls();\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.h",
    "content": "/*\n * Windows backend common header for libusb 1.0\n *\n * This file brings together header code common between\n * the desktop Windows backends.\n * Copyright © 2012-2013 RealVNC Ltd.\n * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer\n * Major code testing contribution by Xiaofan Chen\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#pragma once\n\n// Missing from MinGW\n#if !defined(FACILITY_SETUPAPI)\n#define FACILITY_SETUPAPI\t15\n#endif\n\ntypedef struct USB_CONFIGURATION_DESCRIPTOR {\n  UCHAR  bLength;\n  UCHAR  bDescriptorType;\n  USHORT wTotalLength;\n  UCHAR  bNumInterfaces;\n  UCHAR  bConfigurationValue;\n  UCHAR  iConfiguration;\n  UCHAR  bmAttributes;\n  UCHAR  MaxPower;\n} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;\n\ntypedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;\n\nint windows_common_init(struct libusb_context *ctx);\nvoid windows_common_exit(void);\n\nunsigned long htab_hash(const char *str);\nint windows_clock_gettime(int clk_id, struct timespec *tp);\n\nvoid windows_clear_transfer_priv(struct usbi_transfer *itransfer);\nint windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size);\nstruct winfd *windows_get_fd(struct usbi_transfer *transfer);\nvoid windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size);\n\nvoid windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size);\nint windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready);\n\n#if defined(ENABLE_LOGGING)\nconst char *windows_error_str(DWORD error_code);\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.c",
    "content": "/*\n * windows UsbDk backend for libusb 1.0\n * Copyright © 2014 Red Hat, Inc.\n\n * Authors:\n * Dmitry Fleytman <dmitry@daynix.com>\n * Pavel Gurvich <pavel@daynix.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#if defined(USE_USBDK)\n\n#include <windows.h>\n#include <cfgmgr32.h>\n#include <stdio.h>\n\n#include \"libusbi.h\"\n#include \"windows_common.h\"\n#include \"windows_nt_common.h\"\n\n#define ULONG64 uint64_t\n#define PVOID64 uint64_t\n\ntypedef CONST WCHAR *PCWCHAR;\n#define wcsncpy_s wcsncpy\n\n#include \"windows_usbdk.h\"\n\n#if !defined(STATUS_SUCCESS)\ntypedef LONG NTSTATUS;\n#define STATUS_SUCCESS\t\t\t((NTSTATUS)0x00000000L)\n#endif\n\n#if !defined(STATUS_CANCELLED)\n#define STATUS_CANCELLED\t\t((NTSTATUS)0xC0000120L)\n#endif\n\n#if !defined(STATUS_REQUEST_CANCELED)\n#define STATUS_REQUEST_CANCELED\t\t((NTSTATUS)0xC0000703L)\n#endif\n\n#if !defined(USBD_SUCCESS)\ntypedef int32_t USBD_STATUS;\n#define USBD_SUCCESS(Status)\t\t((USBD_STATUS) (Status) >= 0)\n#define USBD_PENDING(Status)\t\t((ULONG) (Status) >> 30 == 1)\n#define USBD_ERROR(Status)\t\t((USBD_STATUS) (Status) < 0)\n#define USBD_STATUS_STALL_PID\t\t((USBD_STATUS) 0xc0000004)\n#define USBD_STATUS_ENDPOINT_HALTED\t((USBD_STATUS) 0xc0000030)\n#define USBD_STATUS_BAD_START_FRAME\t((USBD_STATUS) 0xc0000a00)\n#define USBD_STATUS_TIMEOUT\t\t((USBD_STATUS) 0xc0006000)\n#define USBD_STATUS_CANCELED\t\t((USBD_STATUS) 0xc0010000)\n#endif\n\nstatic int concurrent_usage = -1;\n\nstruct usbdk_device_priv {\n\tUSB_DK_DEVICE_INFO info;\n\tPUSB_CONFIGURATION_DESCRIPTOR *config_descriptors;\n\tHANDLE redirector_handle;\n\tuint8_t active_configuration;\n};\n\nstruct usbdk_transfer_priv {\n\tUSB_DK_TRANSFER_REQUEST request;\n\tstruct winfd pollable_fd;\n\tPULONG64 IsochronousPacketsArray;\n\tPUSB_DK_ISO_TRANSFER_RESULT IsochronousResultsArray;\n};\n\nstatic inline struct usbdk_device_priv *_usbdk_device_priv(struct libusb_device *dev)\n{\n\treturn (struct usbdk_device_priv *)dev->os_priv;\n}\n\nstatic inline struct usbdk_transfer_priv *_usbdk_transfer_priv(struct usbi_transfer *itransfer)\n{\n\treturn (struct usbdk_transfer_priv *)usbi_transfer_get_os_priv(itransfer);\n}\n\nstatic struct {\n\tHMODULE module;\n\n\tUSBDK_GET_DEVICES_LIST\t\t\tGetDevicesList;\n\tUSBDK_RELEASE_DEVICES_LIST\t\tReleaseDevicesList;\n\tUSBDK_START_REDIRECT\t\t\tStartRedirect;\n\tUSBDK_STOP_REDIRECT\t\t\tStopRedirect;\n\tUSBDK_GET_CONFIGURATION_DESCRIPTOR\tGetConfigurationDescriptor;\n\tUSBDK_RELEASE_CONFIGURATION_DESCRIPTOR\tReleaseConfigurationDescriptor;\n\tUSBDK_READ_PIPE\t\t\t\tReadPipe;\n\tUSBDK_WRITE_PIPE\t\t\tWritePipe;\n\tUSBDK_ABORT_PIPE\t\t\tAbortPipe;\n\tUSBDK_RESET_PIPE\t\t\tResetPipe;\n\tUSBDK_SET_ALTSETTING\t\t\tSetAltsetting;\n\tUSBDK_RESET_DEVICE\t\t\tResetDevice;\n\tUSBDK_GET_REDIRECTOR_SYSTEM_HANDLE\tGetRedirectorSystemHandle;\n} usbdk_helper;\n\nstatic FARPROC get_usbdk_proc_addr(struct libusb_context *ctx, LPCSTR api_name)\n{\n\tFARPROC api_ptr = GetProcAddress(usbdk_helper.module, api_name);\n\n\tif (api_ptr == NULL)\n\t\tusbi_err(ctx, \"UsbDkHelper API %s not found, error %d\", api_name, GetLastError());\n\n\treturn api_ptr;\n}\n\nstatic void unload_usbdk_helper_dll(void)\n{\n\tif (usbdk_helper.module != NULL) {\n\t\tFreeLibrary(usbdk_helper.module);\n\t\tusbdk_helper.module = NULL;\n\t}\n}\n\nstatic int load_usbdk_helper_dll(struct libusb_context *ctx)\n{\n\tusbdk_helper.module = LoadLibraryA(\"UsbDkHelper\");\n\tif (usbdk_helper.module == NULL) {\n\t\tusbi_err(ctx, \"Failed to load UsbDkHelper.dll, error %d\", GetLastError());\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbdk_helper.GetDevicesList = (USBDK_GET_DEVICES_LIST)get_usbdk_proc_addr(ctx, \"UsbDk_GetDevicesList\");\n\tif (usbdk_helper.GetDevicesList == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.ReleaseDevicesList = (USBDK_RELEASE_DEVICES_LIST)get_usbdk_proc_addr(ctx, \"UsbDk_ReleaseDevicesList\");\n\tif (usbdk_helper.ReleaseDevicesList == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.StartRedirect = (USBDK_START_REDIRECT)get_usbdk_proc_addr(ctx, \"UsbDk_StartRedirect\");\n\tif (usbdk_helper.StartRedirect == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.StopRedirect = (USBDK_STOP_REDIRECT)get_usbdk_proc_addr(ctx, \"UsbDk_StopRedirect\");\n\tif (usbdk_helper.StopRedirect == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.GetConfigurationDescriptor = (USBDK_GET_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, \"UsbDk_GetConfigurationDescriptor\");\n\tif (usbdk_helper.GetConfigurationDescriptor == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.ReleaseConfigurationDescriptor = (USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, \"UsbDk_ReleaseConfigurationDescriptor\");\n\tif (usbdk_helper.ReleaseConfigurationDescriptor == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.ReadPipe = (USBDK_READ_PIPE)get_usbdk_proc_addr(ctx, \"UsbDk_ReadPipe\");\n\tif (usbdk_helper.ReadPipe == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.WritePipe = (USBDK_WRITE_PIPE)get_usbdk_proc_addr(ctx, \"UsbDk_WritePipe\");\n\tif (usbdk_helper.WritePipe == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.AbortPipe = (USBDK_ABORT_PIPE)get_usbdk_proc_addr(ctx, \"UsbDk_AbortPipe\");\n\tif (usbdk_helper.AbortPipe == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.ResetPipe = (USBDK_RESET_PIPE)get_usbdk_proc_addr(ctx, \"UsbDk_ResetPipe\");\n\tif (usbdk_helper.ResetPipe == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.SetAltsetting = (USBDK_SET_ALTSETTING)get_usbdk_proc_addr(ctx, \"UsbDk_SetAltsetting\");\n\tif (usbdk_helper.SetAltsetting == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.ResetDevice = (USBDK_RESET_DEVICE)get_usbdk_proc_addr(ctx, \"UsbDk_ResetDevice\");\n\tif (usbdk_helper.ResetDevice == NULL)\n\t\tgoto error_unload;\n\n\tusbdk_helper.GetRedirectorSystemHandle = (USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)get_usbdk_proc_addr(ctx, \"UsbDk_GetRedirectorSystemHandle\");\n\tif (usbdk_helper.GetRedirectorSystemHandle == NULL)\n\t\tgoto error_unload;\n\n\treturn LIBUSB_SUCCESS;\n\nerror_unload:\n\tFreeLibrary(usbdk_helper.module);\n\tusbdk_helper.module = NULL;\n\treturn LIBUSB_ERROR_NOT_FOUND;\n}\n\nstatic int usbdk_init(struct libusb_context *ctx)\n{\n\tint r;\n\n\tif (++concurrent_usage == 0) { // First init?\n\t\tr = load_usbdk_helper_dll(ctx);\n\t\tif (r)\n\t\t\tgoto init_exit;\n\n\t\tinit_polling();\n\n\t\tr = windows_common_init(ctx);\n\t\tif (r)\n\t\t\tgoto init_exit;\n\t}\n\t// At this stage, either we went through full init successfully, or didn't need to\n\tr = LIBUSB_SUCCESS;\n\ninit_exit:\n\tif (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed?\n\t\texit_polling();\n\t\twindows_common_exit();\n\t\tunload_usbdk_helper_dll();\n\t}\n\n\tif (r != LIBUSB_SUCCESS)\n\t\t--concurrent_usage; // Not expected to call libusb_exit if we failed.\n\n\treturn r;\n}\n\nstatic int usbdk_get_session_id_for_device(struct libusb_context *ctx,\n\tPUSB_DK_DEVICE_ID id, unsigned long *session_id)\n{\n\tchar dev_identity[ARRAYSIZE(id->DeviceID) + ARRAYSIZE(id->InstanceID)];\n\n\tif (sprintf(dev_identity, \"%S%S\", id->DeviceID, id->InstanceID) == -1) {\n\t\tusbi_warn(ctx, \"cannot form device identity\", id->DeviceID);\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\t}\n\n\t*session_id = htab_hash(dev_identity);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void usbdk_release_config_descriptors(struct usbdk_device_priv *p, uint8_t count)\n{\n\tuint8_t i;\n\n\tfor (i = 0; i < count; i++)\n\t\tusbdk_helper.ReleaseConfigurationDescriptor(p->config_descriptors[i]);\n\n\tfree(p->config_descriptors);\n\tp->config_descriptors = NULL;\n}\n\nstatic int usbdk_cache_config_descriptors(struct libusb_context *ctx,\n\tstruct usbdk_device_priv *p, PUSB_DK_DEVICE_INFO info)\n{\n\tuint8_t i;\n\tUSB_DK_CONFIG_DESCRIPTOR_REQUEST Request;\n\tRequest.ID = info->ID;\n\n\tp->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR));\n\tif (p->config_descriptors == NULL) {\n\t\tusbi_err(ctx, \"failed to allocate configuration descriptors holder\");\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\tfor (i = 0; i < info->DeviceDescriptor.bNumConfigurations; i++) {\n\t\tULONG Length;\n\n\t\tRequest.Index = i;\n\t\tif (!usbdk_helper.GetConfigurationDescriptor(&Request, &p->config_descriptors[i], &Length)) {\n\t\t\tusbi_err(ctx, \"failed to retrieve configuration descriptors\");\n\t\t\tusbdk_release_config_descriptors(p, i);\n\t\t\treturn LIBUSB_ERROR_OTHER;\n\t\t}\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic inline int usbdk_device_priv_init(struct libusb_context *ctx, struct libusb_device *dev, PUSB_DK_DEVICE_INFO info)\n{\n\tstruct usbdk_device_priv *p = _usbdk_device_priv(dev);\n\n\tp->info = *info;\n\tp->active_configuration = 0;\n\n\treturn usbdk_cache_config_descriptors(ctx, p, info);\n}\n\nstatic void usbdk_device_init(libusb_device *dev, PUSB_DK_DEVICE_INFO info)\n{\n\tdev->bus_number = (uint8_t)info->FilterID;\n\tdev->port_number = (uint8_t)info->Port;\n\tdev->parent_dev = NULL;\n\n\t//Addresses in libusb are 1-based\n\tdev->device_address = (uint8_t)(info->Port + 1);\n\n\tdev->num_configurations = info->DeviceDescriptor.bNumConfigurations;\n\tdev->device_descriptor = info->DeviceDescriptor;\n\n\tswitch (info->Speed) {\n\tcase LowSpeed:\n\t\tdev->speed = LIBUSB_SPEED_LOW;\n\t\tbreak;\n\tcase FullSpeed:\n\t\tdev->speed = LIBUSB_SPEED_FULL;\n\t\tbreak;\n\tcase HighSpeed:\n\t\tdev->speed = LIBUSB_SPEED_HIGH;\n\t\tbreak;\n\tcase SuperSpeed:\n\t\tdev->speed = LIBUSB_SPEED_SUPER;\n\t\tbreak;\n\tcase NoSpeed:\n\tdefault:\n\t\tdev->speed = LIBUSB_SPEED_UNKNOWN;\n\t\tbreak;\n\t}\n}\n\nstatic int usbdk_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs)\n{\n\tint r = LIBUSB_SUCCESS;\n\tULONG i;\n\tstruct discovered_devs *discdevs = NULL;\n\tULONG dev_number;\n\tPUSB_DK_DEVICE_INFO devices;\n\n\tif(!usbdk_helper.GetDevicesList(&devices, &dev_number))\n\t\treturn LIBUSB_ERROR_OTHER;\n\n\tfor (i = 0; i < dev_number; i++) {\n\t\tunsigned long session_id;\n\t\tstruct libusb_device *dev = NULL;\n\n\t\tif (usbdk_get_session_id_for_device(ctx, &devices[i].ID, &session_id))\n\t\t\tcontinue;\n\n\t\tdev = usbi_get_device_by_session_id(ctx, session_id);\n\t\tif (dev == NULL) {\n\t\t\tdev = usbi_alloc_device(ctx, session_id);\n\t\t\tif (dev == NULL) {\n\t\t\t\tusbi_err(ctx, \"failed to allocate a new device structure\");\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tusbdk_device_init(dev, &devices[i]);\n\t\t\tif (usbdk_device_priv_init(ctx, dev, &devices[i]) != LIBUSB_SUCCESS) {\n\t\t\t\tlibusb_unref_device(dev);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tdiscdevs = discovered_devs_append(*_discdevs, dev);\n\t\tlibusb_unref_device(dev);\n\t\tif (!discdevs) {\n\t\t\tusbi_err(ctx, \"cannot append new device to list\");\n\t\t\tr = LIBUSB_ERROR_NO_MEM;\n\t\t\tgoto func_exit;\n\t\t}\n\n\t\t*_discdevs = discdevs;\n\t}\n\nfunc_exit:\n\tusbdk_helper.ReleaseDevicesList(devices);\n\treturn r;\n}\n\nstatic void usbdk_exit(void)\n{\n\tif (--concurrent_usage < 0) {\n\t\twindows_common_exit();\n\t\texit_polling();\n\t\tunload_usbdk_helper_dll();\n\t}\n}\n\nstatic int usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian)\n{\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(dev);\n\n\tmemcpy(buffer, &priv->info.DeviceDescriptor, DEVICE_DESC_LENGTH);\n\t*host_endian = 0;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian)\n{\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(dev);\n\tPUSB_CONFIGURATION_DESCRIPTOR config_header;\n\tsize_t size;\n\n\tif (config_index >= dev->num_configurations)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tconfig_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptors[config_index];\n\n\tsize = min(config_header->wTotalLength, len);\n\tmemcpy(buffer, config_header, size);\n\t*host_endian = 0;\n\n\treturn (int)size;\n}\n\nstatic inline int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian)\n{\n\treturn usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration,\n\t\t\tbuffer, len, host_endian);\n}\n\nstatic int usbdk_open(struct libusb_device_handle *dev_handle)\n{\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);\n\n\tpriv->redirector_handle = usbdk_helper.StartRedirect(&priv->info.ID);\n\tif (priv->redirector_handle == INVALID_HANDLE_VALUE) {\n\t\tusbi_err(DEVICE_CTX(dev_handle->dev), \"Redirector startup failed\");\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void usbdk_close(struct libusb_device_handle *dev_handle)\n{\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);\n\n\tif (!usbdk_helper.StopRedirect(priv->redirector_handle)) {\n\t\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\t\tusbi_err(ctx, \"Redirector shutdown failed\");\n\t}\n}\n\nstatic int usbdk_get_configuration(struct libusb_device_handle *dev_handle, int *config)\n{\n\t*config = _usbdk_device_priv(dev_handle->dev)->active_configuration;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_set_configuration(struct libusb_device_handle *dev_handle, int config)\n{\n\tUNUSED(dev_handle);\n\tUNUSED(config);\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_claim_interface(struct libusb_device_handle *dev_handle, int iface)\n{\n\tUNUSED(dev_handle);\n\tUNUSED(iface);\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);\n\n\tif (!usbdk_helper.SetAltsetting(priv->redirector_handle, iface, altsetting)) {\n\t\tusbi_err(ctx, \"SetAltsetting failed: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_release_interface(struct libusb_device_handle *dev_handle, int iface)\n{\n\tUNUSED(dev_handle);\n\tUNUSED(iface);\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);\n\n\tif (!usbdk_helper.ResetPipe(priv->redirector_handle, endpoint)) {\n\t\tusbi_err(ctx, \"ResetPipe failed: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_reset_device(struct libusb_device_handle *dev_handle)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev);\n\n\tif (!usbdk_helper.ResetDevice(priv->redirector_handle)) {\n\t\tusbi_err(ctx, \"ResetDevice failed: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface)\n{\n\tUNUSED(dev_handle);\n\tUNUSED(iface);\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic int usbdk_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface)\n{\n\tUNUSED(dev_handle);\n\tUNUSED(iface);\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic int usbdk_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface)\n{\n\tUNUSED(dev_handle);\n\tUNUSED(iface);\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic void usbdk_destroy_device(struct libusb_device *dev)\n{\n\tstruct usbdk_device_priv* p = _usbdk_device_priv(dev);\n\n\tif (p->config_descriptors != NULL)\n\t\tusbdk_release_config_descriptors(p, p->info.DeviceDescriptor.bNumConfigurations);\n}\n\nvoid windows_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tstruct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tusbi_free_fd(&transfer_priv->pollable_fd);\n\n\tif (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {\n\t\tsafe_free(transfer_priv->IsochronousPacketsArray);\n\t\tsafe_free(transfer_priv->IsochronousResultsArray);\n\t}\n}\n\nstatic int usbdk_do_control_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev);\n\tstruct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct winfd wfd;\n\tULONG Length;\n\tTransferResult transResult;\n\tHANDLE sysHandle;\n\n\tsysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle);\n\n\twfd = usbi_create_fd(sysHandle, RW_READ, NULL, NULL);\n\t// Always use the handle returned from usbi_create_fd (wfd.handle)\n\tif (wfd.fd < 0)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\ttransfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer;\n\ttransfer_priv->request.BufferLength = transfer->length;\n\ttransfer_priv->request.TransferType = ControlTransferType;\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\tLength = (ULONG)transfer->length;\n\n\tif (IS_XFERIN(transfer))\n\t\ttransResult = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped);\n\telse\n\t\ttransResult = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped);\n\n\tswitch (transResult) {\n\tcase TransferSuccess:\n\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\twfd.overlapped->InternalHigh = (DWORD)Length;\n\t\tbreak;\n\tcase TransferSuccessAsync:\n\t\tbreak;\n\tcase TransferFailure:\n\t\tusbi_err(ctx, \"ControlTransfer failed: %s\", windows_error_str(0));\n\t\tusbi_free_fd(&wfd);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\t// Use priv_transfer to store data needed for async polling\n\ttransfer_priv->pollable_fd = wfd;\n\tusbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev);\n\tstruct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct winfd wfd;\n\tTransferResult transferRes;\n\tHANDLE sysHandle;\n\n\ttransfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer;\n\ttransfer_priv->request.BufferLength = transfer->length;\n\ttransfer_priv->request.EndpointAddress = transfer->endpoint;\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\t\ttransfer_priv->request.TransferType = BulkTransferType;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\ttransfer_priv->request.TransferType = IntertuptTransferType;\n\t\tbreak;\n\tdefault:\n\t\tusbi_err(ctx, \"Wrong transfer type (%d) in usbdk_do_bulk_transfer. %s\", transfer->type, windows_error_str(0));\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\n\tsysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle);\n\n\twfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL);\n\t// Always use the handle returned from usbi_create_fd (wfd.handle)\n\tif (wfd.fd < 0)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tif (IS_XFERIN(transfer))\n\t\ttransferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped);\n\telse\n\t\ttransferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped);\n\n\tswitch (transferRes) {\n\tcase TransferSuccess:\n\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\tbreak;\n\tcase TransferSuccessAsync:\n\t\tbreak;\n\tcase TransferFailure:\n\t\tusbi_err(ctx, \"ReadPipe/WritePipe failed: %s\", windows_error_str(0));\n\t\tusbi_free_fd(&wfd);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\ttransfer_priv->pollable_fd = wfd;\n\tusbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, IS_XFERIN(transfer) ? POLLIN : POLLOUT);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_do_iso_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev);\n\tstruct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct winfd wfd;\n\tTransferResult transferRes;\n\tint i;\n\tHANDLE sysHandle;\n\n\ttransfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer;\n\ttransfer_priv->request.BufferLength = transfer->length;\n\ttransfer_priv->request.EndpointAddress = transfer->endpoint;\n\ttransfer_priv->request.TransferType = IsochronousTransferType;\n\ttransfer_priv->request.IsochronousPacketsArraySize = transfer->num_iso_packets;\n\ttransfer_priv->IsochronousPacketsArray = malloc(transfer->num_iso_packets * sizeof(ULONG64));\n\ttransfer_priv->request.IsochronousPacketsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousPacketsArray;\n\tif (!transfer_priv->IsochronousPacketsArray) {\n\t\tusbi_err(ctx, \"Allocation of IsochronousPacketsArray is failed, %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\ttransfer_priv->IsochronousResultsArray = malloc(transfer->num_iso_packets * sizeof(USB_DK_ISO_TRANSFER_RESULT));\n\ttransfer_priv->request.Result.IsochronousResultsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousResultsArray;\n\tif (!transfer_priv->IsochronousResultsArray) {\n\t\tusbi_err(ctx, \"Allocation of isochronousResultsArray is failed, %s\", windows_error_str(0));\n\t\tfree(transfer_priv->IsochronousPacketsArray);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\tfor (i = 0; i < transfer->num_iso_packets; i++)\n\t\ttransfer_priv->IsochronousPacketsArray[i] = transfer->iso_packet_desc[i].length;\n\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\n\tsysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle);\n\n\twfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL);\n\t// Always use the handle returned from usbi_create_fd (wfd.handle)\n\tif (wfd.fd < 0) {\n\t\tfree(transfer_priv->IsochronousPacketsArray);\n\t\tfree(transfer_priv->IsochronousResultsArray);\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\tif (IS_XFERIN(transfer))\n\t\ttransferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped);\n\telse\n\t\ttransferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped);\n\n\tswitch (transferRes) {\n\tcase TransferSuccess:\n\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\tbreak;\n\tcase TransferSuccessAsync:\n\t\tbreak;\n\tcase TransferFailure:\n\t\tusbi_err(ctx, \"ReadPipe/WritePipe failed: %s\", windows_error_str(0));\n\t\tusbi_free_fd(&wfd);\n\t\tfree(transfer_priv->IsochronousPacketsArray);\n\t\tfree(transfer_priv->IsochronousResultsArray);\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\ttransfer_priv->pollable_fd = wfd;\n\tusbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, IS_XFERIN(transfer) ? POLLIN : POLLOUT);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\treturn usbdk_do_control_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\tif (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET))\n\t\t\treturn LIBUSB_ERROR_NOT_SUPPORTED; //TODO: Check whether we can support this in UsbDk\n\t\telse\n\t\t\treturn usbdk_do_bulk_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\treturn usbdk_do_iso_transfer(itransfer);\n\tdefault:\n\t\tusbi_err(TRANSFER_CTX(transfer), \"unknown endpoint type %d\", transfer->type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nstatic int usbdk_abort_transfers(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev);\n\n\tif (!usbdk_helper.AbortPipe(priv->redirector_handle, transfer->endpoint)) {\n\t\tusbi_err(ctx, \"AbortPipe failed: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int usbdk_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\t// Control transfers cancelled by IoCancelXXX() API\n\t\t// No special treatment needed\n\t\treturn LIBUSB_SUCCESS;\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\treturn usbdk_abort_transfers(itransfer);\n\tdefault:\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"unknown endpoint type %d\", transfer->type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nint windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size)\n{\n\titransfer->transferred += io_size;\n\treturn LIBUSB_TRANSFER_COMPLETED;\n}\n\nstruct winfd *windows_get_fd(struct usbi_transfer *transfer)\n{\n\tstruct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer);\n\treturn &transfer_priv->pollable_fd;\n}\n\nstatic DWORD usbdk_translate_usbd_status(USBD_STATUS UsbdStatus)\n{\n\tif (USBD_SUCCESS(UsbdStatus))\n\t\treturn NO_ERROR;\n\n\tswitch (UsbdStatus) {\n\tcase USBD_STATUS_STALL_PID:\n\tcase USBD_STATUS_ENDPOINT_HALTED:\n\tcase USBD_STATUS_BAD_START_FRAME:\n\t\treturn ERROR_GEN_FAILURE;\n\tcase USBD_STATUS_TIMEOUT:\n\t\treturn ERROR_SEM_TIMEOUT;\n\tcase USBD_STATUS_CANCELED:\n\t\treturn ERROR_OPERATION_ABORTED;\n\tdefault:\n\t\treturn ERROR_FUNCTION_FAILED;\n\t}\n}\n\nvoid windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size)\n{\n\tif (HasOverlappedIoCompletedSync(pollable_fd->overlapped) // Handle async requests that completed synchronously first\n\t\t\t|| GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { // Regular async overlapped\n\t\tstruct libusb_transfer *ltransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer);\n\t\tstruct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer);\n\n\t\tif (ltransfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) {\n\t\t\tint i;\n\t\t\tfor (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) {\n\t\t\t\tstruct libusb_iso_packet_descriptor *lib_desc = &ltransfer->iso_packet_desc[i];\n\n\t\t\t\tswitch (transfer_priv->IsochronousResultsArray[i].TransferResult) {\n\t\t\t\tcase STATUS_SUCCESS:\n\t\t\t\tcase STATUS_CANCELLED:\n\t\t\t\tcase STATUS_REQUEST_CANCELED:\n\t\t\t\t\tlib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tlib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tlib_desc->actual_length = (unsigned int)transfer_priv->IsochronousResultsArray[i].ActualLength;\n\t\t\t}\n\t\t}\n\n\t\t*io_size = (DWORD) transfer_priv->request.Result.GenResult.BytesTransferred;\n\t\t*io_result = usbdk_translate_usbd_status((USBD_STATUS) transfer_priv->request.Result.GenResult.UsbdStatus);\n\t}\n\telse {\n\t\t*io_result = GetLastError();\n\t}\n}\n\nstatic int usbdk_clock_gettime(int clk_id, struct timespec *tp)\n{\n\treturn windows_clock_gettime(clk_id, tp);\n}\n\nconst struct usbi_os_backend usbdk_backend = {\n\t\"Windows\",\n\tUSBI_CAP_HAS_HID_ACCESS,\n\tusbdk_init,\n\tusbdk_exit,\n\n\tusbdk_get_device_list,\n\tNULL,\n\tusbdk_open,\n\tusbdk_close,\n\n\tusbdk_get_device_descriptor,\n\tusbdk_get_active_config_descriptor,\n\tusbdk_get_config_descriptor,\n\tNULL,\n\n\tusbdk_get_configuration,\n\tusbdk_set_configuration,\n\tusbdk_claim_interface,\n\tusbdk_release_interface,\n\n\tusbdk_set_interface_altsetting,\n\tusbdk_clear_halt,\n\tusbdk_reset_device,\n\n\tNULL,\n\tNULL,\n\n\tNULL,\t// dev_mem_alloc()\n\tNULL,\t// dev_mem_free()\n\n\tusbdk_kernel_driver_active,\n\tusbdk_detach_kernel_driver,\n\tusbdk_attach_kernel_driver,\n\n\tusbdk_destroy_device,\n\n\tusbdk_submit_transfer,\n\tusbdk_cancel_transfer,\n\twindows_clear_transfer_priv,\n\n\twindows_handle_events,\n\tNULL,\n\n\tusbdk_clock_gettime,\n#if defined(USBI_TIMERFD_AVAILABLE)\n\tNULL,\n#endif\n\tsizeof(struct usbdk_device_priv),\n\t0,\n\tsizeof(struct usbdk_transfer_priv),\n};\n\n#endif /* USE_USBDK */\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.h",
    "content": "/*\n* windows UsbDk backend for libusb 1.0\n* Copyright © 2014 Red Hat, Inc.\n\n* Authors:\n* Dmitry Fleytman <dmitry@daynix.com>\n* Pavel Gurvich <pavel@daynix.com>\n*\n* This library is free software; you can redistribute it and/or\n* modify it under the terms of the GNU Lesser General Public\n* License as published by the Free Software Foundation; either\n* version 2.1 of the License, or (at your option) any later version.\n*\n* This library 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 GNU\n* Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public\n* License along with this library; if not, write to the Free Software\n* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n*/\n\n#pragma once\n\ntypedef struct tag_USB_DK_DEVICE_ID {\n\tWCHAR DeviceID[MAX_DEVICE_ID_LEN];\n\tWCHAR InstanceID[MAX_DEVICE_ID_LEN];\n} USB_DK_DEVICE_ID, *PUSB_DK_DEVICE_ID;\n\nstatic inline void UsbDkFillIDStruct(USB_DK_DEVICE_ID *ID, PCWCHAR DeviceID, PCWCHAR InstanceID)\n{\n\twcsncpy_s(ID->DeviceID, DeviceID, MAX_DEVICE_ID_LEN);\n\twcsncpy_s(ID->InstanceID, InstanceID, MAX_DEVICE_ID_LEN);\n}\n\ntypedef struct tag_USB_DK_DEVICE_INFO {\n\tUSB_DK_DEVICE_ID ID;\n\tULONG64 FilterID;\n\tULONG64 Port;\n\tULONG64 Speed;\n\tUSB_DEVICE_DESCRIPTOR DeviceDescriptor;\n} USB_DK_DEVICE_INFO, *PUSB_DK_DEVICE_INFO;\n\ntypedef struct tag_USB_DK_CONFIG_DESCRIPTOR_REQUEST {\n\tUSB_DK_DEVICE_ID ID;\n\tULONG64 Index;\n} USB_DK_CONFIG_DESCRIPTOR_REQUEST, *PUSB_DK_CONFIG_DESCRIPTOR_REQUEST;\n\ntypedef struct tag_USB_DK_ISO_TRANSFER_RESULT {\n\tULONG64 ActualLength;\n\tULONG64 TransferResult;\n} USB_DK_ISO_TRANSFER_RESULT, *PUSB_DK_ISO_TRANSFER_RESULT;\n\ntypedef struct tag_USB_DK_GEN_TRANSFER_RESULT {\n\tULONG64 BytesTransferred;\n\tULONG64 UsbdStatus; // USBD_STATUS code\n} USB_DK_GEN_TRANSFER_RESULT, *PUSB_DK_GEN_TRANSFER_RESULT;\n\ntypedef struct tag_USB_DK_TRANSFER_RESULT {\n\tUSB_DK_GEN_TRANSFER_RESULT GenResult;\n\tPVOID64 IsochronousResultsArray; // array of USB_DK_ISO_TRANSFER_RESULT\n} USB_DK_TRANSFER_RESULT, *PUSB_DK_TRANSFER_RESULT;\n\ntypedef struct tag_USB_DK_TRANSFER_REQUEST {\n\tULONG64 EndpointAddress;\n\tPVOID64 Buffer;\n\tULONG64 BufferLength;\n\tULONG64 TransferType;\n\tULONG64 IsochronousPacketsArraySize;\n\tPVOID64 IsochronousPacketsArray;\n\n\tUSB_DK_TRANSFER_RESULT Result;\n} USB_DK_TRANSFER_REQUEST, *PUSB_DK_TRANSFER_REQUEST;\n\ntypedef enum {\n\tTransferFailure = 0,\n\tTransferSuccess,\n\tTransferSuccessAsync\n} TransferResult;\n\ntypedef enum {\n\tNoSpeed = 0,\n\tLowSpeed,\n\tFullSpeed,\n\tHighSpeed,\n\tSuperSpeed\n} USB_DK_DEVICE_SPEED;\n\ntypedef enum {\n\tControlTransferType,\n\tBulkTransferType,\n\tIntertuptTransferType,\n\tIsochronousTransferType\n} USB_DK_TRANSFER_TYPE;\n\ntypedef BOOL (__cdecl *USBDK_GET_DEVICES_LIST)(\n\tPUSB_DK_DEVICE_INFO *DeviceInfo,\n\tPULONG DeviceNumber\n);\ntypedef void (__cdecl *USBDK_RELEASE_DEVICES_LIST)(\n\tPUSB_DK_DEVICE_INFO DeviceInfo\n);\ntypedef HANDLE (__cdecl *USBDK_START_REDIRECT)(\n\tPUSB_DK_DEVICE_ID DeviceId\n);\ntypedef BOOL (__cdecl *USBDK_STOP_REDIRECT)(\n\tHANDLE DeviceHandle\n);\ntypedef BOOL (__cdecl *USBDK_GET_CONFIGURATION_DESCRIPTOR)(\n\tPUSB_DK_CONFIG_DESCRIPTOR_REQUEST Request,\n\tPUSB_CONFIGURATION_DESCRIPTOR *Descriptor,\n\tPULONG Length\n);\ntypedef void (__cdecl *USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)(\n\tPUSB_CONFIGURATION_DESCRIPTOR Descriptor\n);\ntypedef TransferResult (__cdecl *USBDK_WRITE_PIPE)(\n\tHANDLE DeviceHandle,\n\tPUSB_DK_TRANSFER_REQUEST Request,\n\tLPOVERLAPPED lpOverlapped\n);\ntypedef TransferResult (__cdecl *USBDK_READ_PIPE)(\n\tHANDLE DeviceHandle,\n\tPUSB_DK_TRANSFER_REQUEST Request,\n\tLPOVERLAPPED lpOverlapped\n);\ntypedef BOOL (__cdecl *USBDK_ABORT_PIPE)(\n\tHANDLE DeviceHandle,\n\tULONG64 PipeAddress\n);\ntypedef BOOL (__cdecl *USBDK_RESET_PIPE)(\n\tHANDLE DeviceHandle,\n\tULONG64 PipeAddress\n);\ntypedef BOOL (__cdecl *USBDK_SET_ALTSETTING)(\n\tHANDLE DeviceHandle,\n\tULONG64 InterfaceIdx,\n\tULONG64 AltSettingIdx\n);\ntypedef BOOL (__cdecl *USBDK_RESET_DEVICE)(\n\tHANDLE DeviceHandle\n);\ntypedef HANDLE (__cdecl *USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)(\n\tHANDLE DeviceHandle\n);\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.c",
    "content": "/*\n * windows backend for libusb 1.0\n * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer\n * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software\n * Hash table functions adapted from glibc, by Ulrich Drepper et al.\n * Major code testing contribution by Xiaofan Chen\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#if !defined(USE_USBDK)\n\n#include <windows.h>\n#include <setupapi.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <process.h>\n#include <stdio.h>\n#include <inttypes.h>\n#include <objbase.h>\n#include <winioctl.h>\n\n#include \"libusbi.h\"\n#include \"poll_windows.h\"\n#include \"windows_winusb.h\"\n\n#define HANDLE_VALID(h) (((h) != 0) && ((h) != INVALID_HANDLE_VALUE))\n\n// The 2 macros below are used in conjunction with safe loops.\n#define LOOP_CHECK(fcall)\t\t\t\\\n\t{\t\t\t\t\t\\\n\t\tr = fcall;\t\t\t\\\n\t\tif (r != LIBUSB_SUCCESS)\t\\\n\t\t\tcontinue;\t\t\\\n\t}\n#define LOOP_BREAK(err)\t\t\t\t\\\n\t{\t\t\t\t\t\\\n\t\tr = err;\t\t\t\\\n\t\tcontinue;\t\t\t\\\n\t}\n\n// WinUSB-like API prototypes\nstatic int winusbx_init(int sub_api, struct libusb_context *ctx);\nstatic int winusbx_exit(int sub_api);\nstatic int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle);\nstatic void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle);\nstatic int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface);\nstatic int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);\nstatic int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);\nstatic int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer);\nstatic int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);\nstatic int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer);\nstatic int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);\nstatic int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer);\nstatic int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer);\nstatic int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle);\nstatic int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);\n// HID API prototypes\nstatic int hid_init(int sub_api, struct libusb_context *ctx);\nstatic int hid_exit(int sub_api);\nstatic int hid_open(int sub_api, struct libusb_device_handle *dev_handle);\nstatic void hid_close(int sub_api, struct libusb_device_handle *dev_handle);\nstatic int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);\nstatic int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);\nstatic int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);\nstatic int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer);\nstatic int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer);\nstatic int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);\nstatic int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer);\nstatic int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle);\nstatic int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);\n// Composite API prototypes\nstatic int composite_init(int sub_api, struct libusb_context *ctx);\nstatic int composite_exit(int sub_api);\nstatic int composite_open(int sub_api, struct libusb_device_handle *dev_handle);\nstatic void composite_close(int sub_api, struct libusb_device_handle *dev_handle);\nstatic int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);\nstatic int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);\nstatic int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface);\nstatic int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer);\nstatic int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer);\nstatic int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer);\nstatic int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);\nstatic int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer);\nstatic int composite_abort_control(int sub_api, struct usbi_transfer *itransfer);\nstatic int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle);\nstatic int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);\n\n\n// Global variables\nint windows_version = WINDOWS_UNDEFINED;\nstatic char windows_version_str[128] = \"Undefined\";\n// Concurrency\nstatic int concurrent_usage = -1;\nstatic usbi_mutex_t autoclaim_lock;\n// API globals\n#define CHECK_WINUSBX_AVAILABLE(sub_api)\t\t\\\n\tdo {\t\t\t\t\t\t\\\n\t\tif (sub_api == SUB_API_NOTSET)\t\t\\\n\t\t\tsub_api = priv->sub_api;\t\\\n\t\tif (!WinUSBX[sub_api].initialized) \t\\\n\t\t\treturn LIBUSB_ERROR_ACCESS;\t\\\n\t} while(0)\n\nstatic HMODULE WinUSBX_handle = NULL;\nstatic struct winusb_interface WinUSBX[SUB_API_MAX];\nstatic const char *sub_api_name[SUB_API_MAX] = WINUSBX_DRV_NAMES;\n\nstatic bool api_hid_available = false;\n#define CHECK_HID_AVAILABLE\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\\\n\t\tif (!api_hid_available)\t\t\t\\\n\t\t\treturn LIBUSB_ERROR_ACCESS;\t\\\n\t} while (0)\n\nstatic inline BOOLEAN guid_eq(const GUID *guid1, const GUID *guid2)\n{\n\tif ((guid1 != NULL) && (guid2 != NULL))\n\t\treturn (memcmp(guid1, guid2, sizeof(GUID)) == 0);\n\n\treturn false;\n}\n\n#if defined(ENABLE_LOGGING)\nstatic char *guid_to_string(const GUID *guid)\n{\n\tstatic char guid_string[MAX_GUID_STRING_LENGTH];\n\n\tif (guid == NULL)\n\t\treturn NULL;\n\n\tsprintf(guid_string, \"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\",\n\t\t(unsigned int)guid->Data1, guid->Data2, guid->Data3,\n\t\tguid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],\n\t\tguid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);\n\n\treturn guid_string;\n}\n#endif\n\n/*\n * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes.\n * Return an allocated sanitized string or NULL on error.\n */\nstatic char *sanitize_path(const char *path)\n{\n\tconst char root_prefix[] = { '\\\\', '\\\\', '.', '\\\\' };\n\tsize_t j, size;\n\tchar *ret_path;\n\tsize_t add_root = 0;\n\n\tif (path == NULL)\n\t\treturn NULL;\n\n\tsize = strlen(path) + 1;\n\n\t// Microsoft indiscriminately uses '\\\\?\\', '\\\\.\\', '##?#\" or \"##.#\" for root prefixes.\n\tif (!((size > 3) && (((path[0] == '\\\\') && (path[1] == '\\\\') && (path[3] == '\\\\'))\n\t\t\t|| ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) {\n\t\tadd_root = sizeof(root_prefix);\n\t\tsize += add_root;\n\t}\n\n\tret_path = malloc(size);\n\tif (ret_path == NULL)\n\t\treturn NULL;\n\n\tstrcpy(&ret_path[add_root], path);\n\n\t// Ensure consistency with root prefix\n\tmemcpy(ret_path, root_prefix, sizeof(root_prefix));\n\n\t// Same goes for '\\' and '#' after the root prefix. Ensure '#' is used\n\tfor (j = sizeof(root_prefix); j < size; j++) {\n\t\tret_path[j] = (char)toupper((int)ret_path[j]); // Fix case too\n\t\tif (ret_path[j] == '\\\\')\n\t\t\tret_path[j] = '#';\n\t}\n\n\treturn ret_path;\n}\n\n/*\n * Cfgmgr32, OLE32 and SetupAPI DLL functions\n */\nstatic int init_dlls(void)\n{\n\tDLL_GET_HANDLE(Cfgmgr32);\n\tDLL_LOAD_FUNC(Cfgmgr32, CM_Get_Parent, TRUE);\n\tDLL_LOAD_FUNC(Cfgmgr32, CM_Get_Child, TRUE);\n\tDLL_LOAD_FUNC(Cfgmgr32, CM_Get_Sibling, TRUE);\n\tDLL_LOAD_FUNC(Cfgmgr32, CM_Get_Device_IDA, TRUE);\n\n\t// Prefixed to avoid conflict with header files\n\tDLL_GET_HANDLE(AdvAPI32);\n\tDLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegQueryValueExW, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegCloseKey, TRUE);\n\n\tDLL_GET_HANDLE(Kernel32);\n\tDLL_LOAD_FUNC_PREFIXED(Kernel32, p, IsWow64Process, FALSE);\n\n\tDLL_GET_HANDLE(OLE32);\n\tDLL_LOAD_FUNC_PREFIXED(OLE32, p, CLSIDFromString, TRUE);\n\n\tDLL_GET_HANDLE(SetupAPI);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetClassDevsA, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInfo, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInterfaces, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceInterfaceDetailA, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiDestroyDeviceInfoList, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDevRegKey, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceRegistryPropertyA, TRUE);\n\tDLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDeviceInterfaceRegKey, TRUE);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void exit_dlls(void)\n{\n\tDLL_FREE_HANDLE(Cfgmgr32);\n\tDLL_FREE_HANDLE(AdvAPI32);\n\tDLL_FREE_HANDLE(Kernel32);\n\tDLL_FREE_HANDLE(OLE32);\n\tDLL_FREE_HANDLE(SetupAPI);\n}\n\n/*\n * enumerate interfaces for the whole USB class\n *\n * Parameters:\n * dev_info: a pointer to a dev_info list\n * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed)\n * usb_class: the generic USB class for which to retrieve interface details\n * index: zero based index of the interface in the device info list\n *\n * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA\n * structure returned and call this function repeatedly using the same guid (with an\n * incremented index starting at zero) until all interfaces have been returned.\n */\nstatic bool get_devinfo_data(struct libusb_context *ctx,\n\tHDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const char *usb_class, unsigned _index)\n{\n\tif (_index <= 0) {\n\t\t*dev_info = pSetupDiGetClassDevsA(NULL, usb_class, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES);\n\t\tif (*dev_info == INVALID_HANDLE_VALUE)\n\t\t\treturn false;\n\t}\n\n\tdev_info_data->cbSize = sizeof(SP_DEVINFO_DATA);\n\tif (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) {\n\t\tif (GetLastError() != ERROR_NO_MORE_ITEMS)\n\t\t\tusbi_err(ctx, \"Could not obtain device info data for index %u: %s\",\n\t\t\t\t_index, windows_error_str(0));\n\n\t\tpSetupDiDestroyDeviceInfoList(*dev_info);\n\t\t*dev_info = INVALID_HANDLE_VALUE;\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/*\n * enumerate interfaces for a specific GUID\n *\n * Parameters:\n * dev_info: a pointer to a dev_info list\n * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed)\n * guid: the GUID for which to retrieve interface details\n * index: zero based index of the interface in the device info list\n *\n * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA\n * structure returned and call this function repeatedly using the same guid (with an\n * incremented index starting at zero) until all interfaces have been returned.\n */\nstatic SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details(struct libusb_context *ctx,\n\tHDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index)\n{\n\tSP_DEVICE_INTERFACE_DATA dev_interface_data;\n\tSP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details;\n\tDWORD size;\n\n\tif (_index <= 0)\n\t\t*dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);\n\n\tif (dev_info_data != NULL) {\n\t\tdev_info_data->cbSize = sizeof(SP_DEVINFO_DATA);\n\t\tif (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) {\n\t\t\tif (GetLastError() != ERROR_NO_MORE_ITEMS)\n\t\t\t\tusbi_err(ctx, \"Could not obtain device info data for index %u: %s\",\n\t\t\t\t\t_index, windows_error_str(0));\n\n\t\t\tpSetupDiDestroyDeviceInfoList(*dev_info);\n\t\t\t*dev_info = INVALID_HANDLE_VALUE;\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tdev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);\n\tif (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) {\n\t\tif (GetLastError() != ERROR_NO_MORE_ITEMS)\n\t\t\tusbi_err(ctx, \"Could not obtain interface data for index %u: %s\",\n\t\t\t\t_index, windows_error_str(0));\n\n\t\tpSetupDiDestroyDeviceInfoList(*dev_info);\n\t\t*dev_info = INVALID_HANDLE_VALUE;\n\t\treturn NULL;\n\t}\n\n\t// Read interface data (dummy + actual) to access the device path\n\tif (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) {\n\t\t// The dummy call should fail with ERROR_INSUFFICIENT_BUFFER\n\t\tif (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {\n\t\t\tusbi_err(ctx, \"could not access interface data (dummy) for index %u: %s\",\n\t\t\t\t_index, windows_error_str(0));\n\t\t\tgoto err_exit;\n\t\t}\n\t} else {\n\t\tusbi_err(ctx, \"program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong.\");\n\t\tgoto err_exit;\n\t}\n\n\tdev_interface_details = calloc(1, size);\n\tif (dev_interface_details == NULL) {\n\t\tusbi_err(ctx, \"could not allocate interface data for index %u.\", _index);\n\t\tgoto err_exit;\n\t}\n\n\tdev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);\n\tif (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data,\n\t\tdev_interface_details, size, &size, NULL)) {\n\t\tusbi_err(ctx, \"could not access interface data (actual) for index %u: %s\",\n\t\t\t_index, windows_error_str(0));\n\t}\n\n\treturn dev_interface_details;\n\nerr_exit:\n\tpSetupDiDestroyDeviceInfoList(*dev_info);\n\t*dev_info = INVALID_HANDLE_VALUE;\n\treturn NULL;\n}\n\n/* For libusb0 filter */\nstatic SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details_filter(struct libusb_context *ctx,\n\tHDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index, char *filter_path)\n{\n\tSP_DEVICE_INTERFACE_DATA dev_interface_data;\n\tSP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details;\n\tDWORD size;\n\n\tif (_index <= 0)\n\t\t*dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);\n\n\tif (dev_info_data != NULL) {\n\t\tdev_info_data->cbSize = sizeof(SP_DEVINFO_DATA);\n\t\tif (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) {\n\t\t\tif (GetLastError() != ERROR_NO_MORE_ITEMS)\n\t\t\t\tusbi_err(ctx, \"Could not obtain device info data for index %u: %s\",\n\t\t\t\t\t_index, windows_error_str(0));\n\n\t\t\tpSetupDiDestroyDeviceInfoList(*dev_info);\n\t\t\t*dev_info = INVALID_HANDLE_VALUE;\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tdev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);\n\tif (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) {\n\t\tif (GetLastError() != ERROR_NO_MORE_ITEMS)\n\t\t\tusbi_err(ctx, \"Could not obtain interface data for index %u: %s\",\n\t\t\t\t_index, windows_error_str(0));\n\n\t\tpSetupDiDestroyDeviceInfoList(*dev_info);\n\t\t*dev_info = INVALID_HANDLE_VALUE;\n\t\treturn NULL;\n\t}\n\n\t// Read interface data (dummy + actual) to access the device path\n\tif (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) {\n\t\t// The dummy call should fail with ERROR_INSUFFICIENT_BUFFER\n\t\tif (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {\n\t\t\tusbi_err(ctx, \"could not access interface data (dummy) for index %u: %s\",\n\t\t\t\t_index, windows_error_str(0));\n\t\t\tgoto err_exit;\n\t\t}\n\t} else {\n\t\tusbi_err(ctx, \"program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong.\");\n\t\tgoto err_exit;\n\t}\n\n\tdev_interface_details = calloc(1, size);\n\tif (dev_interface_details == NULL) {\n\t\tusbi_err(ctx, \"could not allocate interface data for index %u.\", _index);\n\t\tgoto err_exit;\n\t}\n\n\tdev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);\n\tif (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, dev_interface_details, size, &size, NULL))\n\t\tusbi_err(ctx, \"could not access interface data (actual) for index %u: %s\",\n\t\t\t_index, windows_error_str(0));\n\n\t// [trobinso] lookup the libusb0 symbolic index.\n\tif (dev_interface_details) {\n\t\tHKEY hkey_device_interface = pSetupDiOpenDeviceInterfaceRegKey(*dev_info, &dev_interface_data, 0, KEY_READ);\n\t\tif (hkey_device_interface != INVALID_HANDLE_VALUE) {\n\t\t\tDWORD libusb0_symboliclink_index = 0;\n\t\t\tDWORD value_length = sizeof(DWORD);\n\t\t\tDWORD value_type = 0;\n\t\t\tLONG status;\n\n\t\t\tstatus = pRegQueryValueExW(hkey_device_interface, L\"LUsb0\", NULL, &value_type,\n\t\t\t\t(LPBYTE)&libusb0_symboliclink_index, &value_length);\n\t\t\tif (status == ERROR_SUCCESS) {\n\t\t\t\tif (libusb0_symboliclink_index < 256) {\n\t\t\t\t\t// libusb0.sys is connected to this device instance.\n\t\t\t\t\t// If the the device interface guid is {F9F3FF14-AE21-48A0-8A25-8011A7A931D9} then it's a filter.\n\t\t\t\t\tsprintf(filter_path, \"\\\\\\\\.\\\\libusb0-%04u\", (unsigned int)libusb0_symboliclink_index);\n\t\t\t\t\tusbi_dbg(\"assigned libusb0 symbolic link %s\", filter_path);\n\t\t\t\t} else {\n\t\t\t\t\t// libusb0.sys was connected to this device instance at one time; but not anymore.\n\t\t\t\t}\n\t\t\t}\n\t\t\tpRegCloseKey(hkey_device_interface);\n\t\t}\n\t}\n\n\treturn dev_interface_details;\n\nerr_exit:\n\tpSetupDiDestroyDeviceInfoList(*dev_info);\n\t*dev_info = INVALID_HANDLE_VALUE;\n\treturn NULL;\n}\n\n/*\n * Returns the session ID of a device's nth level ancestor\n * If there's no device at the nth level, return 0\n */\nstatic unsigned long get_ancestor_session_id(DWORD devinst, unsigned level)\n{\n\tDWORD parent_devinst;\n\tunsigned long session_id;\n\tchar *sanitized_path;\n\tchar path[MAX_PATH_LENGTH];\n\tunsigned i;\n\n\tif (level < 1)\n\t\treturn 0;\n\n\tfor (i = 0; i < level; i++) {\n\t\tif (CM_Get_Parent(&parent_devinst, devinst, 0) != CR_SUCCESS)\n\t\t\treturn 0;\n\t\tdevinst = parent_devinst;\n\t}\n\n\tif (CM_Get_Device_IDA(devinst, path, MAX_PATH_LENGTH, 0) != CR_SUCCESS)\n\t\treturn 0;\n\n\t// TODO: (post hotplug): try without sanitizing\n\tsanitized_path = sanitize_path(path);\n\tif (sanitized_path == NULL)\n\t\treturn 0;\n\n\tsession_id = htab_hash(sanitized_path);\n\tfree(sanitized_path);\n\treturn session_id;\n}\n\n/*\n * Determine which interface the given endpoint address belongs to\n */\nstatic int get_interface_by_endpoint(struct libusb_config_descriptor *conf_desc, uint8_t ep)\n{\n\tconst struct libusb_interface *intf;\n\tconst struct libusb_interface_descriptor *intf_desc;\n\tint i, j, k;\n\n\tfor (i = 0; i < conf_desc->bNumInterfaces; i++) {\n\t\tintf = &conf_desc->interface[i];\n\t\tfor (j = 0; j < intf->num_altsetting; j++) {\n\t\t\tintf_desc = &intf->altsetting[j];\n\t\t\tfor (k = 0; k < intf_desc->bNumEndpoints; k++) {\n\t\t\t\tif (intf_desc->endpoint[k].bEndpointAddress == ep) {\n\t\t\t\t\tusbi_dbg(\"found endpoint %02X on interface %d\", intf_desc->bInterfaceNumber, i);\n\t\t\t\t\treturn intf_desc->bInterfaceNumber;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tusbi_dbg(\"endpoint %02X not found on any interface\", ep);\n\treturn LIBUSB_ERROR_NOT_FOUND;\n}\n\n/*\n * Populate the endpoints addresses of the device_priv interface helper structs\n */\nstatic int windows_assign_endpoints(struct libusb_device_handle *dev_handle, int iface, int altsetting)\n{\n\tint i, r;\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tstruct libusb_config_descriptor *conf_desc;\n\tconst struct libusb_interface_descriptor *if_desc;\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\n\tr = libusb_get_active_config_descriptor(dev_handle->dev, &conf_desc);\n\tif (r != LIBUSB_SUCCESS) {\n\t\tusbi_warn(ctx, \"could not read config descriptor: error %d\", r);\n\t\treturn r;\n\t}\n\n\tif_desc = &conf_desc->interface[iface].altsetting[altsetting];\n\tsafe_free(priv->usb_interface[iface].endpoint);\n\n\tif (if_desc->bNumEndpoints == 0) {\n\t\tusbi_dbg(\"no endpoints found for interface %d\", iface);\n\t\tlibusb_free_config_descriptor(conf_desc);\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\tpriv->usb_interface[iface].endpoint = malloc(if_desc->bNumEndpoints);\n\tif (priv->usb_interface[iface].endpoint == NULL) {\n\t\tlibusb_free_config_descriptor(conf_desc);\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\tpriv->usb_interface[iface].nb_endpoints = if_desc->bNumEndpoints;\n\tfor (i = 0; i < if_desc->bNumEndpoints; i++) {\n\t\tpriv->usb_interface[iface].endpoint[i] = if_desc->endpoint[i].bEndpointAddress;\n\t\tusbi_dbg(\"(re)assigned endpoint %02X to interface %d\", priv->usb_interface[iface].endpoint[i], iface);\n\t}\n\tlibusb_free_config_descriptor(conf_desc);\n\n\t// Extra init may be required to configure endpoints\n\treturn priv->apib->configure_endpoints(SUB_API_NOTSET, dev_handle, iface);\n}\n\n// Lookup for a match in the list of API driver names\n// return -1 if not found, driver match number otherwise\nstatic int get_sub_api(char *driver, int api)\n{\n\tint i;\n\tconst char sep_str[2] = {LIST_SEPARATOR, 0};\n\tchar *tok, *tmp_str;\n\tsize_t len = strlen(driver);\n\n\tif (len == 0)\n\t\treturn SUB_API_NOTSET;\n\n\ttmp_str = _strdup(driver);\n\tif (tmp_str == NULL)\n\t\treturn SUB_API_NOTSET;\n\n\ttok = strtok(tmp_str, sep_str);\n\twhile (tok != NULL) {\n\t\tfor (i = 0; i < usb_api_backend[api].nb_driver_names; i++) {\n\t\t\tif (_stricmp(tok, usb_api_backend[api].driver_name_list[i]) == 0) {\n\t\t\t\tfree(tmp_str);\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\ttok = strtok(NULL, sep_str);\n\t}\n\n\tfree(tmp_str);\n\treturn SUB_API_NOTSET;\n}\n\n/*\n * auto-claiming and auto-release helper functions\n */\nstatic int auto_claim(struct libusb_transfer *transfer, int *interface_number, int api_type)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(\n\t\ttransfer->dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tint current_interface = *interface_number;\n\tint r = LIBUSB_SUCCESS;\n\n\tswitch(api_type) {\n\tcase USB_API_WINUSBX:\n\tcase USB_API_HID:\n\t\tbreak;\n\tdefault:\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\tusbi_mutex_lock(&autoclaim_lock);\n\tif (current_interface < 0) { // No serviceable interface was found\n\t\tfor (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) {\n\t\t\t// Must claim an interface of the same API type\n\t\t\tif ((priv->usb_interface[current_interface].apib->id == api_type)\n\t\t\t\t\t&& (libusb_claim_interface(transfer->dev_handle, current_interface) == LIBUSB_SUCCESS)) {\n\t\t\t\tusbi_dbg(\"auto-claimed interface %d for control request\", current_interface);\n\t\t\t\tif (handle_priv->autoclaim_count[current_interface] != 0)\n\t\t\t\t\tusbi_warn(ctx, \"program assertion failed - autoclaim_count was nonzero\");\n\t\t\t\thandle_priv->autoclaim_count[current_interface]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (current_interface == USB_MAXINTERFACES) {\n\t\t\tusbi_err(ctx, \"could not auto-claim any interface\");\n\t\t\tr = LIBUSB_ERROR_NOT_FOUND;\n\t\t}\n\t} else {\n\t\t// If we have a valid interface that was autoclaimed, we must increment\n\t\t// its autoclaim count so that we can prevent an early release.\n\t\tif (handle_priv->autoclaim_count[current_interface] != 0)\n\t\t\thandle_priv->autoclaim_count[current_interface]++;\n\t}\n\tusbi_mutex_unlock(&autoclaim_lock);\n\n\t*interface_number = current_interface;\n\treturn r;\n}\n\nstatic void auto_release(struct usbi_transfer *itransfer)\n{\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tlibusb_device_handle *dev_handle = transfer->dev_handle;\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tint r;\n\n\tusbi_mutex_lock(&autoclaim_lock);\n\tif (handle_priv->autoclaim_count[transfer_priv->interface_number] > 0) {\n\t\thandle_priv->autoclaim_count[transfer_priv->interface_number]--;\n\t\tif (handle_priv->autoclaim_count[transfer_priv->interface_number] == 0) {\n\t\t\tr = libusb_release_interface(dev_handle, transfer_priv->interface_number);\n\t\t\tif (r == LIBUSB_SUCCESS)\n\t\t\t\tusbi_dbg(\"auto-released interface %d\", transfer_priv->interface_number);\n\t\t\telse\n\t\t\t\tusbi_dbg(\"failed to auto-release interface %d (%s)\",\n\t\t\t\t\ttransfer_priv->interface_number, libusb_error_name((enum libusb_error)r));\n\t\t}\n\t}\n\tusbi_mutex_unlock(&autoclaim_lock);\n}\n\n/* Windows version dtection */\nstatic BOOL is_x64(void)\n{\n\tBOOL ret = FALSE;\n\n\t// Detect if we're running a 32 or 64 bit system\n\tif (sizeof(uintptr_t) < 8) {\n\t\tif (pIsWow64Process != NULL)\n\t\t\tpIsWow64Process(GetCurrentProcess(), &ret);\n\t} else {\n\t\tret = TRUE;\n\t}\n\n\treturn ret;\n}\n\nstatic void get_windows_version(void)\n{\n\tOSVERSIONINFOEXA vi, vi2;\n\tconst char *arch, *w = NULL;\n\tunsigned major, minor;\n\tULONGLONG major_equal, minor_equal;\n\tBOOL ws;\n\n\tmemset(&vi, 0, sizeof(vi));\n\tvi.dwOSVersionInfoSize = sizeof(vi);\n\tif (!GetVersionExA((OSVERSIONINFOA *)&vi)) {\n\t\tmemset(&vi, 0, sizeof(vi));\n\t\tvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);\n\t\tif (!GetVersionExA((OSVERSIONINFOA *)&vi))\n\t\t\treturn;\n\t}\n\n\tif (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) {\n\t\tif (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) {\n\t\t\t// Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version\n\t\t\t// See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx\n\n\t\t\tmajor_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);\n\t\t\tfor (major = vi.dwMajorVersion; major <= 9; major++) {\n\t\t\t\tmemset(&vi2, 0, sizeof(vi2));\n\t\t\t\tvi2.dwOSVersionInfoSize = sizeof(vi2);\n\t\t\t\tvi2.dwMajorVersion = major;\n\t\t\t\tif (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tif (vi.dwMajorVersion < major) {\n\t\t\t\t\tvi.dwMajorVersion = major;\n\t\t\t\t\tvi.dwMinorVersion = 0;\n\t\t\t\t}\n\n\t\t\t\tminor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL);\n\t\t\t\tfor (minor = vi.dwMinorVersion; minor <= 9; minor++) {\n\t\t\t\t\tmemset(&vi2, 0, sizeof(vi2));\n\t\t\t\t\tvi2.dwOSVersionInfoSize = sizeof(vi2);\n\t\t\t\t\tvi2.dwMinorVersion = minor;\n\t\t\t\t\tif (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal))\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tvi.dwMinorVersion = minor;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) {\n\t\t\tws = (vi.wProductType <= VER_NT_WORKSTATION);\n\t\t\twindows_version = vi.dwMajorVersion << 4 | vi.dwMinorVersion;\n\t\t\tswitch (windows_version) {\n\t\t\tcase 0x50: w = \"2000\"; break;\n\t\t\tcase 0x51: w = \"XP\"; break;\n\t\t\tcase 0x52: w = \"2003\"; break;\n\t\t\tcase 0x60: w = (ws ? \"Vista\" : \"2008\"); break;\n\t\t\tcase 0x61: w = (ws ? \"7\" : \"2008_R2\"); break;\n\t\t\tcase 0x62: w = (ws ? \"8\" : \"2012\"); break;\n\t\t\tcase 0x63: w = (ws ? \"8.1\" : \"2012_R2\"); break;\n\t\t\tcase 0x64: w = (ws ? \"10\" : \"2015\"); break;\n\t\t\tdefault:\n\t\t\t\tif (windows_version < 0x50)\n\t\t\t\t\twindows_version = WINDOWS_UNSUPPORTED;\n\t\t\t\telse\n\t\t\t\t\tw = \"11 or later\";\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tarch = is_x64() ? \"64-bit\" : \"32-bit\";\n\n\tif (w == NULL)\n\t\tsnprintf(windows_version_str, sizeof(windows_version_str), \"%s %u.%u %s\",\n\t\t\t(vi.dwPlatformId == VER_PLATFORM_WIN32_NT ? \"NT\" : \"??\"),\n\t\t\t(unsigned int)vi.dwMajorVersion, (unsigned int)vi.dwMinorVersion, arch);\n\telse if (vi.wServicePackMinor)\n\t\tsnprintf(windows_version_str, sizeof(windows_version_str), \"%s SP%u.%u %s\",\n\t\t\tw, vi.wServicePackMajor, vi.wServicePackMinor, arch);\n\telse if (vi.wServicePackMajor)\n\t\tsnprintf(windows_version_str, sizeof(windows_version_str), \"%s SP%u %s\",\n\t\t\tw, vi.wServicePackMajor, arch);\n\telse\n\t\tsnprintf(windows_version_str, sizeof(windows_version_str), \"%s %s\",\n\t\t\tw, arch);\n}\n\n/*\n * init: libusb backend init function\n *\n * This function enumerates the HCDs (Host Controller Drivers) and populates our private HCD list\n * In our implementation, we equate Windows' \"HCD\" to libusb's \"bus\". Note that bus is zero indexed.\n * HCDs are not expected to change after init (might not hold true for hot pluggable USB PCI card?)\n */\nstatic int windows_init(struct libusb_context *ctx)\n{\n\tint i, r = LIBUSB_ERROR_OTHER;\n\tHANDLE semaphore;\n\tchar sem_name[11 + 8 + 1]; // strlen(\"libusb_init\") + (32-bit hex PID) + '\\0'\n\n\tsprintf(sem_name, \"libusb_init%08X\", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF));\n\tsemaphore = CreateSemaphoreA(NULL, 1, 1, sem_name);\n\tif (semaphore == NULL) {\n\t\tusbi_err(ctx, \"could not create semaphore: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\t// A successful wait brings our semaphore count to 0 (unsignaled)\n\t// => any concurent wait stalls until the semaphore's release\n\tif (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) {\n\t\tusbi_err(ctx, \"failure to access semaphore: %s\", windows_error_str(0));\n\t\tCloseHandle(semaphore);\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\t// NB: concurrent usage supposes that init calls are equally balanced with\n\t// exit calls. If init is called more than exit, we will not exit properly\n\tif (++concurrent_usage == 0) { // First init?\n\t\tget_windows_version();\n\t\tusbi_dbg(\"Windows %s\", windows_version_str);\n\n\t\tif (windows_version == WINDOWS_UNSUPPORTED) {\n\t\t\tusbi_err(ctx, \"This version of Windows is NOT supported\");\n\t\t\tr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tgoto init_exit;\n\t\t}\n\n\t\t// We need a lock for proper auto-release\n\t\tusbi_mutex_init(&autoclaim_lock);\n\n\t\t// Initialize pollable file descriptors\n\t\tinit_polling();\n\n\t\t// Load DLL imports\n\t\tif (init_dlls() != LIBUSB_SUCCESS) {\n\t\t\tusbi_err(ctx, \"could not resolve DLL functions\");\n\t\t\tgoto init_exit;\n\t\t}\n\n\t\t// Initialize the low level APIs (we don't care about errors at this stage)\n\t\tfor (i = 0; i < USB_API_MAX; i++)\n\t\t\tusb_api_backend[i].init(SUB_API_NOTSET, ctx);\n\n\t\tr = windows_common_init(ctx);\n\t\tif (r)\n\t\t\tgoto init_exit;\n\t}\n\t// At this stage, either we went through full init successfully, or didn't need to\n\tr = LIBUSB_SUCCESS;\n\ninit_exit: // Holds semaphore here.\n\tif (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed?\n\t\tfor (i = 0; i < USB_API_MAX; i++)\n\t\t\tusb_api_backend[i].exit(SUB_API_NOTSET);\n\t\texit_dlls();\n\t\texit_polling();\n\t\twindows_common_exit();\n\t\tusbi_mutex_destroy(&autoclaim_lock);\n\t}\n\n\tif (r != LIBUSB_SUCCESS)\n\t\t--concurrent_usage; // Not expected to call libusb_exit if we failed.\n\n\tReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1\n\tCloseHandle(semaphore);\n\treturn r;\n}\n\n/*\n * HCD (root) hubs need to have their device descriptor manually populated\n *\n * Note that, like Microsoft does in the device manager, we populate the\n * Vendor and Device ID for HCD hubs with the ones from the PCI HCD device.\n */\nstatic int force_hcd_device_descriptor(struct libusb_device *dev)\n{\n\tstruct windows_device_priv *parent_priv, *priv = _device_priv(dev);\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\tint vid, pid;\n\n\tdev->num_configurations = 1;\n\tpriv->dev_descriptor.bLength = sizeof(USB_DEVICE_DESCRIPTOR);\n\tpriv->dev_descriptor.bDescriptorType = USB_DEVICE_DESCRIPTOR_TYPE;\n\tpriv->dev_descriptor.bNumConfigurations = 1;\n\tpriv->active_config = 1;\n\n\tif (dev->parent_dev == NULL) {\n\t\tusbi_err(ctx, \"program assertion failed - HCD hub has no parent\");\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\tparent_priv = _device_priv(dev->parent_dev);\n\tif (sscanf(parent_priv->path, \"\\\\\\\\.\\\\PCI#VEN_%04x&DEV_%04x%*s\", &vid, &pid) == 2) {\n\t\tpriv->dev_descriptor.idVendor = (uint16_t)vid;\n\t\tpriv->dev_descriptor.idProduct = (uint16_t)pid;\n\t} else {\n\t\tusbi_warn(ctx, \"could not infer VID/PID of HCD hub from '%s'\", parent_priv->path);\n\t\tpriv->dev_descriptor.idVendor = 0x1d6b; // Linux Foundation root hub\n\t\tpriv->dev_descriptor.idProduct = 1;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/*\n * fetch and cache all the config descriptors through I/O\n */\nstatic int cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle, char *device_id)\n{\n\tDWORD size, ret_size;\n\tstruct libusb_context *ctx = DEVICE_CTX(dev);\n\tstruct windows_device_priv *priv = _device_priv(dev);\n\tint r;\n\tuint8_t i;\n\n\tUSB_CONFIGURATION_DESCRIPTOR_SHORT cd_buf_short; // dummy request\n\tPUSB_DESCRIPTOR_REQUEST cd_buf_actual = NULL;    // actual request\n\tPUSB_CONFIGURATION_DESCRIPTOR cd_data = NULL;\n\n\tif (dev->num_configurations == 0)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tpriv->config_descriptor = calloc(dev->num_configurations, sizeof(unsigned char *));\n\tif (priv->config_descriptor == NULL)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tfor (i = 0; i < dev->num_configurations; i++)\n\t\tpriv->config_descriptor[i] = NULL;\n\n\tfor (i = 0, r = LIBUSB_SUCCESS; ; i++) {\n\t\t// safe loop: release all dynamic resources\n\t\tsafe_free(cd_buf_actual);\n\n\t\t// safe loop: end of loop condition\n\t\tif ((i >= dev->num_configurations) || (r != LIBUSB_SUCCESS))\n\t\t\tbreak;\n\n\t\tsize = sizeof(USB_CONFIGURATION_DESCRIPTOR_SHORT);\n\t\tmemset(&cd_buf_short, 0, size);\n\n\t\tcd_buf_short.req.ConnectionIndex = (ULONG)priv->port;\n\t\tcd_buf_short.req.SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN;\n\t\tcd_buf_short.req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;\n\t\tcd_buf_short.req.SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i;\n\t\tcd_buf_short.req.SetupPacket.wIndex = 0;\n\t\tcd_buf_short.req.SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST));\n\n\t\t// Dummy call to get the required data size. Initial failures are reported as info rather\n\t\t// than error as they can occur for non-penalizing situations, such as with some hubs.\n\t\t// coverity[tainted_data_argument]\n\t\tif (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, &cd_buf_short, size,\n\t\t\t&cd_buf_short, size, &ret_size, NULL)) {\n\t\t\tusbi_info(ctx, \"could not access configuration descriptor (dummy) for '%s': %s\", device_id, windows_error_str(0));\n\t\t\tLOOP_BREAK(LIBUSB_ERROR_IO);\n\t\t}\n\n\t\tif ((ret_size != size) || (cd_buf_short.data.wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))) {\n\t\t\tusbi_info(ctx, \"unexpected configuration descriptor size (dummy) for '%s'.\", device_id);\n\t\t\tLOOP_BREAK(LIBUSB_ERROR_IO);\n\t\t}\n\n\t\tsize = sizeof(USB_DESCRIPTOR_REQUEST) + cd_buf_short.data.wTotalLength;\n\t\tcd_buf_actual = calloc(1, size);\n\t\tif (cd_buf_actual == NULL) {\n\t\t\tusbi_err(ctx, \"could not allocate configuration descriptor buffer for '%s'.\", device_id);\n\t\t\tLOOP_BREAK(LIBUSB_ERROR_NO_MEM);\n\t\t}\n\n\t\t// Actual call\n\t\tcd_buf_actual->ConnectionIndex = (ULONG)priv->port;\n\t\tcd_buf_actual->SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN;\n\t\tcd_buf_actual->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR;\n\t\tcd_buf_actual->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i;\n\t\tcd_buf_actual->SetupPacket.wIndex = 0;\n\t\tcd_buf_actual->SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST));\n\n\t\tif (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, cd_buf_actual, size,\n\t\t\tcd_buf_actual, size, &ret_size, NULL)) {\n\t\t\tusbi_err(ctx, \"could not access configuration descriptor (actual) for '%s': %s\", device_id, windows_error_str(0));\n\t\t\tLOOP_BREAK(LIBUSB_ERROR_IO);\n\t\t}\n\n\t\tcd_data = (PUSB_CONFIGURATION_DESCRIPTOR)((UCHAR *)cd_buf_actual + sizeof(USB_DESCRIPTOR_REQUEST));\n\n\t\tif ((size != ret_size) || (cd_data->wTotalLength != cd_buf_short.data.wTotalLength)) {\n\t\t\tusbi_err(ctx, \"unexpected configuration descriptor size (actual) for '%s'.\", device_id);\n\t\t\tLOOP_BREAK(LIBUSB_ERROR_IO);\n\t\t}\n\n\t\tif (cd_data->bDescriptorType != USB_CONFIGURATION_DESCRIPTOR_TYPE) {\n\t\t\tusbi_err(ctx, \"not a configuration descriptor for '%s'\", device_id);\n\t\t\tLOOP_BREAK(LIBUSB_ERROR_IO);\n\t\t}\n\n\t\tusbi_dbg(\"cached config descriptor %d (bConfigurationValue=%u, %u bytes)\",\n\t\t\ti, cd_data->bConfigurationValue, cd_data->wTotalLength);\n\n\t\t// Cache the descriptor\n\t\tpriv->config_descriptor[i] = malloc(cd_data->wTotalLength);\n\t\tif (priv->config_descriptor[i] == NULL)\n\t\t\tLOOP_BREAK(LIBUSB_ERROR_NO_MEM);\n\t\tmemcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength);\n\t}\n\treturn LIBUSB_SUCCESS;\n}\n\n/*\n * Populate a libusb device structure\n */\nstatic int init_device(struct libusb_device *dev, struct libusb_device *parent_dev,\n\tuint8_t port_number, char *device_id, DWORD devinst)\n{\n\tHANDLE handle;\n\tDWORD size;\n\tUSB_NODE_CONNECTION_INFORMATION_EX conn_info;\n\tUSB_NODE_CONNECTION_INFORMATION_EX_V2 conn_info_v2;\n\tstruct windows_device_priv *priv, *parent_priv;\n\tstruct libusb_context *ctx;\n\tstruct libusb_device *tmp_dev;\n\tunsigned long tmp_id;\n\tunsigned i;\n\n\tif ((dev == NULL) || (parent_dev == NULL))\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tctx = DEVICE_CTX(dev);\n\tpriv = _device_priv(dev);\n\tparent_priv = _device_priv(parent_dev);\n\tif (parent_priv->apib->id != USB_API_HUB) {\n\t\tusbi_warn(ctx, \"parent for device '%s' is not a hub\", device_id);\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\t// It is possible for the parent hub not to have been initialized yet\n\t// If that's the case, lookup the ancestors to set the bus number\n\tif (parent_dev->bus_number == 0) {\n\t\tfor (i = 2; ; i++) {\n\t\t\ttmp_id = get_ancestor_session_id(devinst, i);\n\t\t\tif (tmp_id == 0)\n\t\t\t\tbreak;\n\n\t\t\ttmp_dev = usbi_get_device_by_session_id(ctx, tmp_id);\n\t\t\tif (tmp_dev == NULL)\n\t\t\t\tcontinue;\n\n\t\t\tif (tmp_dev->bus_number != 0) {\n\t\t\t\tusbi_dbg(\"got bus number from ancestor #%u\", i);\n\t\t\t\tparent_dev->bus_number = tmp_dev->bus_number;\n\t\t\t\tlibusb_unref_device(tmp_dev);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlibusb_unref_device(tmp_dev);\n\t\t}\n\t}\n\n\tif (parent_dev->bus_number == 0) {\n\t\tusbi_err(ctx, \"program assertion failed: unable to find ancestor bus number for '%s'\", device_id);\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tdev->bus_number = parent_dev->bus_number;\n\tpriv->port = port_number;\n\tdev->port_number = port_number;\n\tpriv->depth = parent_priv->depth + 1;\n\tdev->parent_dev = parent_dev;\n\n\t// If the device address is already set, we can stop here\n\tif (dev->device_address != 0)\n\t\treturn LIBUSB_SUCCESS;\n\n\tmemset(&conn_info, 0, sizeof(conn_info));\n\tif (priv->depth != 0) { // Not a HCD hub\n\t\thandle = CreateFileA(parent_priv->path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING,\n\t\t\tFILE_FLAG_OVERLAPPED, NULL);\n\t\tif (handle == INVALID_HANDLE_VALUE) {\n\t\t\tusbi_warn(ctx, \"could not open hub %s: %s\", parent_priv->path, windows_error_str(0));\n\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t}\n\n\t\tsize = sizeof(conn_info);\n\t\tconn_info.ConnectionIndex = (ULONG)port_number;\n\t\t// coverity[tainted_data_argument]\n\t\tif (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, size,\n\t\t\t&conn_info, size, &size, NULL)) {\n\t\t\tusbi_warn(ctx, \"could not get node connection information for device '%s': %s\",\n\t\t\t\tdevice_id, windows_error_str(0));\n\t\t\tCloseHandle(handle);\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t}\n\n\t\tif (conn_info.ConnectionStatus == NoDeviceConnected) {\n\t\t\tusbi_err(ctx, \"device '%s' is no longer connected!\", device_id);\n\t\t\tCloseHandle(handle);\n\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t}\n\n\t\tmemcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR));\n\t\tdev->num_configurations = priv->dev_descriptor.bNumConfigurations;\n\t\tpriv->active_config = conn_info.CurrentConfigurationValue;\n\t\tusbi_dbg(\"found %u configurations (active conf: %u)\", dev->num_configurations, priv->active_config);\n\n\t\t// If we can't read the config descriptors, just set the number of confs to zero\n\t\tif (cache_config_descriptors(dev, handle, device_id) != LIBUSB_SUCCESS) {\n\t\t\tdev->num_configurations = 0;\n\t\t\tpriv->dev_descriptor.bNumConfigurations = 0;\n\t\t}\n\n\t\t// In their great wisdom, Microsoft decided to BREAK the USB speed report between Windows 7 and Windows 8\n\t\tif (windows_version >= WINDOWS_8) {\n\t\t\tmemset(&conn_info_v2, 0, sizeof(conn_info_v2));\n\t\t\tsize = sizeof(conn_info_v2);\n\t\t\tconn_info_v2.ConnectionIndex = (ULONG)port_number;\n\t\t\tconn_info_v2.Length = size;\n\t\t\tconn_info_v2.SupportedUsbProtocols.Usb300 = 1;\n\t\t\tif (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2,\n\t\t\t\t&conn_info_v2, size, &conn_info_v2, size, &size, NULL)) {\n\t\t\t\tusbi_warn(ctx, \"could not get node connection information (V2) for device '%s': %s\",\n\t\t\t\t\tdevice_id,  windows_error_str(0));\n\t\t\t} else if (conn_info_v2.Flags.DeviceIsOperatingAtSuperSpeedOrHigher) {\n\t\t\t\tconn_info.Speed = 3;\n\t\t\t}\n\t\t}\n\n\t\tCloseHandle(handle);\n\n\t\tif (conn_info.DeviceAddress > UINT8_MAX)\n\t\t\tusbi_err(ctx, \"program assertion failed: device address overflow\");\n\n\t\tdev->device_address = (uint8_t)conn_info.DeviceAddress + 1;\n\t\tif (dev->device_address == 1)\n\t\t\tusbi_err(ctx, \"program assertion failed: device address collision with root hub\");\n\n\t\tswitch (conn_info.Speed) {\n\t\tcase 0: dev->speed = LIBUSB_SPEED_LOW; break;\n\t\tcase 1: dev->speed = LIBUSB_SPEED_FULL; break;\n\t\tcase 2: dev->speed = LIBUSB_SPEED_HIGH; break;\n\t\tcase 3: dev->speed = LIBUSB_SPEED_SUPER; break;\n\t\tdefault:\n\t\t\tusbi_warn(ctx, \"Got unknown device speed %u\", conn_info.Speed);\n\t\t\tbreak;\n\t\t}\n\t} else {\n\t\tdev->device_address = 1; // root hubs are set to use device number 1\n\t\tforce_hcd_device_descriptor(dev);\n\t}\n\n\tusbi_sanitize_device(dev);\n\n\tusbi_dbg(\"(bus: %u, addr: %u, depth: %u, port: %u): '%s'\",\n\t\tdev->bus_number, dev->device_address, priv->depth, priv->port, device_id);\n\n\treturn LIBUSB_SUCCESS;\n}\n\n// Returns the api type, or 0 if not found/unsupported\nstatic void get_api_type(struct libusb_context *ctx, HDEVINFO *dev_info,\n\tSP_DEVINFO_DATA *dev_info_data, int *api, int *sub_api)\n{\n\t// Precedence for filter drivers vs driver is in the order of this array\n\tstruct driver_lookup lookup[3] = {\n\t\t{\"\\0\\0\", SPDRP_SERVICE, \"driver\"},\n\t\t{\"\\0\\0\", SPDRP_UPPERFILTERS, \"upper filter driver\"},\n\t\t{\"\\0\\0\", SPDRP_LOWERFILTERS, \"lower filter driver\"}\n\t};\n\tDWORD size, reg_type;\n\tunsigned k, l;\n\tint i, j;\n\n\t*api = USB_API_UNSUPPORTED;\n\t*sub_api = SUB_API_NOTSET;\n\n\t// Check the service & filter names to know the API we should use\n\tfor (k = 0; k < 3; k++) {\n\t\tif (pSetupDiGetDeviceRegistryPropertyA(*dev_info, dev_info_data, lookup[k].reg_prop,\n\t\t\t&reg_type, (BYTE *)lookup[k].list, MAX_KEY_LENGTH, &size)) {\n\t\t\t// Turn the REG_SZ SPDRP_SERVICE into REG_MULTI_SZ\n\t\t\tif (lookup[k].reg_prop == SPDRP_SERVICE)\n\t\t\t\t// our buffers are MAX_KEY_LENGTH + 1 so we can overflow if needed\n\t\t\t\tlookup[k].list[strlen(lookup[k].list) + 1] = 0;\n\n\t\t\t// MULTI_SZ is a pain to work with. Turn it into something much more manageable\n\t\t\t// NB: none of the driver names we check against contain LIST_SEPARATOR,\n\t\t\t// (currently ';'), so even if an unsuported one does, it's not an issue\n\t\t\tfor (l = 0; (lookup[k].list[l] != 0) || (lookup[k].list[l + 1] != 0); l++) {\n\t\t\t\tif (lookup[k].list[l] == 0)\n\t\t\t\t\tlookup[k].list[l] = LIST_SEPARATOR;\n\t\t\t}\n\t\t\tusbi_dbg(\"%s(s): %s\", lookup[k].designation, lookup[k].list);\n\t\t} else {\n\t\t\tif (GetLastError() != ERROR_INVALID_DATA)\n\t\t\t\tusbi_dbg(\"could not access %s: %s\", lookup[k].designation, windows_error_str(0));\n\t\t\tlookup[k].list[0] = 0;\n\t\t}\n\t}\n\n\tfor (i = 1; i < USB_API_MAX; i++) {\n\t\tfor (k = 0; k < 3; k++) {\n\t\t\tj = get_sub_api(lookup[k].list, i);\n\t\t\tif (j >= 0) {\n\t\t\t\tusbi_dbg(\"matched %s name against %s\", lookup[k].designation,\n\t\t\t\t\t(i != USB_API_WINUSBX) ? usb_api_backend[i].designation : sub_api_name[j]);\n\t\t\t\t*api = i;\n\t\t\t\t*sub_api = j;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n}\n\nstatic int set_composite_interface(struct libusb_context *ctx, struct libusb_device *dev,\n\tchar *dev_interface_path, char *device_id, int api, int sub_api)\n{\n\tunsigned i;\n\tstruct windows_device_priv *priv = _device_priv(dev);\n\tint interface_number;\n\n\tif (priv->apib->id != USB_API_COMPOSITE) {\n\t\tusbi_err(ctx, \"program assertion failed: '%s' is not composite\", device_id);\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\t// Because MI_## are not necessarily in sequential order (some composite\n\t// devices will have only MI_00 & MI_03 for instance), we retrieve the actual\n\t// interface number from the path's MI value\n\tinterface_number = 0;\n\tfor (i = 0; device_id[i] != 0; ) {\n\t\tif ((device_id[i++] == 'M') && (device_id[i++] == 'I')\n\t\t\t\t&& (device_id[i++] == '_')) {\n\t\t\tinterface_number = (device_id[i++] - '0') * 10;\n\t\t\tinterface_number += device_id[i] - '0';\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (device_id[i] == 0)\n\t\tusbi_warn(ctx, \"failure to read interface number for %s. Using default value %d\",\n\t\t\tdevice_id, interface_number);\n\n\tif (priv->usb_interface[interface_number].path != NULL) {\n\t\tif (api == USB_API_HID) {\n\t\t\t// HID devices can have multiple collections (COL##) for each MI_## interface\n\t\t\tusbi_dbg(\"interface[%d] already set - ignoring HID collection: %s\",\n\t\t\t\tinterface_number, device_id);\n\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t}\n\t\t// In other cases, just use the latest data\n\t\tsafe_free(priv->usb_interface[interface_number].path);\n\t}\n\n\tusbi_dbg(\"interface[%d] = %s\", interface_number, dev_interface_path);\n\tpriv->usb_interface[interface_number].path = dev_interface_path;\n\tpriv->usb_interface[interface_number].apib = &usb_api_backend[api];\n\tpriv->usb_interface[interface_number].sub_api = sub_api;\n\tif ((api == USB_API_HID) && (priv->hid == NULL)) {\n\t\tpriv->hid = calloc(1, sizeof(struct hid_device_priv));\n\t\tif (priv->hid == NULL)\n\t\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int set_hid_interface(struct libusb_context *ctx, struct libusb_device *dev,\n\tchar *dev_interface_path)\n{\n\tint i;\n\tstruct windows_device_priv *priv = _device_priv(dev);\n\n\tif (priv->hid == NULL) {\n\t\tusbi_err(ctx, \"program assertion failed: parent is not HID\");\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t} else if (priv->hid->nb_interfaces == USB_MAXINTERFACES) {\n\t\tusbi_err(ctx, \"program assertion failed: max USB interfaces reached for HID device\");\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\tfor (i = 0; i < priv->hid->nb_interfaces; i++) {\n\t\tif ((priv->usb_interface[i].path != NULL) && strcmp(priv->usb_interface[i].path, dev_interface_path) == 0) {\n\t\t\tusbi_dbg(\"interface[%d] already set to %s\", i, dev_interface_path);\n\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t}\n\t}\n\n\tpriv->usb_interface[priv->hid->nb_interfaces].path = dev_interface_path;\n\tpriv->usb_interface[priv->hid->nb_interfaces].apib = &usb_api_backend[USB_API_HID];\n\tusbi_dbg(\"interface[%u] = %s\", priv->hid->nb_interfaces, dev_interface_path);\n\tpriv->hid->nb_interfaces++;\n\treturn LIBUSB_SUCCESS;\n}\n\n/*\n * get_device_list: libusb backend device enumeration function\n */\nstatic int windows_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs)\n{\n\tstruct discovered_devs *discdevs;\n\tHDEVINFO dev_info = { 0 };\n\tconst char *usb_class[] = {\"USB\", \"NUSB3\", \"IUSB3\", \"IARUSB3\"};\n\tSP_DEVINFO_DATA dev_info_data = { 0 };\n\tSP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL;\n\tGUID hid_guid;\n#define MAX_ENUM_GUIDS 64\n\tconst GUID *guid[MAX_ENUM_GUIDS];\n#define HCD_PASS 0\n#define HUB_PASS 1\n#define GEN_PASS 2\n#define DEV_PASS 3\n#define HID_PASS 4\n\tint r = LIBUSB_SUCCESS;\n\tint api, sub_api;\n\tsize_t class_index = 0;\n\tunsigned int nb_guids, pass, i, j, ancestor;\n\tchar path[MAX_PATH_LENGTH];\n\tchar strbuf[MAX_PATH_LENGTH];\n\tstruct libusb_device *dev, *parent_dev;\n\tstruct windows_device_priv *priv, *parent_priv;\n\tchar *dev_interface_path = NULL;\n\tchar *dev_id_path = NULL;\n\tunsigned long session_id;\n\tDWORD size, reg_type, port_nr, install_state;\n\tHKEY key;\n\tWCHAR guid_string_w[MAX_GUID_STRING_LENGTH];\n\tGUID *if_guid;\n\tLONG s;\n\t// Keep a list of newly allocated devs to unref\n\tlibusb_device **unref_list, **new_unref_list;\n\tunsigned int unref_size = 64;\n\tunsigned int unref_cur = 0;\n\n\t// PASS 1 : (re)enumerate HCDs (allows for HCD hotplug)\n\t// PASS 2 : (re)enumerate HUBS\n\t// PASS 3 : (re)enumerate generic USB devices (including driverless)\n\t//           and list additional USB device interface GUIDs to explore\n\t// PASS 4 : (re)enumerate master USB devices that have a device interface\n\t// PASS 5+: (re)enumerate device interfaced GUIDs (including HID) and\n\t//           set the device interfaces.\n\n\t// Init the GUID table\n\tguid[HCD_PASS] = &GUID_DEVINTERFACE_USB_HOST_CONTROLLER;\n\tguid[HUB_PASS] = &GUID_DEVINTERFACE_USB_HUB;\n\tguid[GEN_PASS] = NULL;\n\tguid[DEV_PASS] = &GUID_DEVINTERFACE_USB_DEVICE;\n\tHidD_GetHidGuid(&hid_guid);\n\tguid[HID_PASS] = &hid_guid;\n\tnb_guids = HID_PASS + 1;\n\n\tunref_list = calloc(unref_size, sizeof(libusb_device *));\n\tif (unref_list == NULL)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tfor (pass = 0; ((pass < nb_guids) && (r == LIBUSB_SUCCESS)); pass++) {\n//#define ENUM_DEBUG\n#if defined(ENABLE_LOGGING) && defined(ENUM_DEBUG)\n\t\tconst char *passname[] = { \"HCD\", \"HUB\", \"GEN\", \"DEV\", \"HID\", \"EXT\" };\n\t\tusbi_dbg(\"#### PROCESSING %ss %s\", passname[(pass <= HID_PASS) ? pass : (HID_PASS + 1)],\n\t\t\t(pass != GEN_PASS) ? guid_to_string(guid[pass]) : \"\");\n#endif\n\t\tfor (i = 0; ; i++) {\n\t\t\t// safe loop: free up any (unprotected) dynamic resource\n\t\t\t// NB: this is always executed before breaking the loop\n\t\t\tsafe_free(dev_interface_details);\n\t\t\tsafe_free(dev_interface_path);\n\t\t\tsafe_free(dev_id_path);\n\t\t\tpriv = parent_priv = NULL;\n\t\t\tdev = parent_dev = NULL;\n\n\t\t\t// Safe loop: end of loop conditions\n\t\t\tif (r != LIBUSB_SUCCESS)\n\t\t\t\tbreak;\n\n\t\t\tif ((pass == HCD_PASS) && (i == UINT8_MAX)) {\n\t\t\t\tusbi_warn(ctx, \"program assertion failed - found more than %d buses, skipping the rest.\", UINT8_MAX);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (pass != GEN_PASS) {\n\t\t\t\t// Except for GEN, all passes deal with device interfaces\n\t\t\t\tdev_interface_details = get_interface_details(ctx, &dev_info, &dev_info_data, guid[pass], i);\n\t\t\t\tif (dev_interface_details == NULL)\n\t\t\t\t\tbreak;\n\n\t\t\t\tdev_interface_path = sanitize_path(dev_interface_details->DevicePath);\n\t\t\t\tif (dev_interface_path == NULL) {\n\t\t\t\t\tusbi_warn(ctx, \"could not sanitize device interface path for '%s'\", dev_interface_details->DevicePath);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are\n\t\t\t\t// being listed under the \"NUSB3\" PnP Symbolic Name rather than \"USB\".\n\t\t\t\t// The Intel USB 3.0 driver behaves similar, but uses \"IUSB3\"\n\t\t\t\t// The Intel Alpine Ridge USB 3.1 driver uses \"IARUSB3\"\n\t\t\t\tfor (; class_index < ARRAYSIZE(usb_class); class_index++) {\n\t\t\t\t\tif (get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i))\n\t\t\t\t\t\tbreak;\n\t\t\t\t\ti = 0;\n\t\t\t\t}\n\t\t\t\tif (class_index >= ARRAYSIZE(usb_class))\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Read the Device ID path. This is what we'll use as UID\n\t\t\t// Note that if the device is plugged in a different port or hub, the Device ID changes\n\t\t\tif (CM_Get_Device_IDA(dev_info_data.DevInst, path, sizeof(path), 0) != CR_SUCCESS) {\n\t\t\t\tusbi_warn(ctx, \"could not read the device id path for devinst %X, skipping\",\n\t\t\t\t\t(unsigned int)dev_info_data.DevInst);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdev_id_path = sanitize_path(path);\n\t\t\tif (dev_id_path == NULL) {\n\t\t\t\tusbi_warn(ctx, \"could not sanitize device id path for devinst %X, skipping\",\n\t\t\t\t\t(unsigned int)dev_info_data.DevInst);\n\t\t\t\tcontinue;\n\t\t\t}\n#ifdef ENUM_DEBUG\n\t\t\tusbi_dbg(\"PRO: %s\", dev_id_path);\n#endif\n\n\t\t\t// The SPDRP_ADDRESS for USB devices is the device port number on the hub\n\t\t\tport_nr = 0;\n\t\t\tif ((pass >= HUB_PASS) && (pass <= GEN_PASS)) {\n\t\t\t\tif ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ADDRESS,\n\t\t\t\t\t&reg_type, (BYTE *)&port_nr, 4, &size)) || (size != 4)) {\n\t\t\t\t\tusbi_warn(ctx, \"could not retrieve port number for device '%s', skipping: %s\",\n\t\t\t\t\t\tdev_id_path, windows_error_str(0));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set API to use or get additional data from generic pass\n\t\t\tapi = USB_API_UNSUPPORTED;\n\t\t\tsub_api = SUB_API_NOTSET;\n\t\t\tswitch (pass) {\n\t\t\tcase HCD_PASS:\n\t\t\t\tbreak;\n\t\t\tcase GEN_PASS:\n\t\t\t\t// We use the GEN pass to detect driverless devices...\n\t\t\t\tsize = sizeof(strbuf);\n\t\t\t\tif (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_DRIVER,\n\t\t\t\t\t&reg_type, (BYTE *)strbuf, size, &size)) {\n\t\t\t\t\t\tusbi_info(ctx, \"The following device has no driver: '%s'\", dev_id_path);\n\t\t\t\t\t\tusbi_info(ctx, \"libusb will not be able to access it.\");\n\t\t\t\t}\n\t\t\t\t// ...and to add the additional device interface GUIDs\n\t\t\t\tkey = pSetupDiOpenDevRegKey(dev_info, &dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);\n\t\t\t\tif (key != INVALID_HANDLE_VALUE) {\n\t\t\t\t\tsize = sizeof(guid_string_w);\n\t\t\t\t\ts = pRegQueryValueExW(key, L\"DeviceInterfaceGUIDs\", NULL, &reg_type,\n\t\t\t\t\t\t(BYTE *)guid_string_w, &size);\n\t\t\t\t\tpRegCloseKey(key);\n\t\t\t\t\tif (s == ERROR_SUCCESS) {\n\t\t\t\t\t\tif (nb_guids >= MAX_ENUM_GUIDS) {\n\t\t\t\t\t\t\t// If this assert is ever reported, grow a GUID table dynamically\n\t\t\t\t\t\t\tusbi_err(ctx, \"program assertion failed: too many GUIDs\");\n\t\t\t\t\t\t\tLOOP_BREAK(LIBUSB_ERROR_OVERFLOW);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif_guid = calloc(1, sizeof(GUID));\n\t\t\t\t\t\tif (if_guid == NULL) {\n\t\t\t\t\t\t\tusbi_err(ctx, \"could not calloc for if_guid: not enough memory\");\n\t\t\t\t\t\t\tLOOP_BREAK(LIBUSB_ERROR_NO_MEM);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpCLSIDFromString(guid_string_w, if_guid);\n\t\t\t\t\t\tguid[nb_guids++] = if_guid;\n\t\t\t\t\t\tusbi_dbg(\"extra GUID: %s\", guid_to_string(if_guid));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase HID_PASS:\n\t\t\t\tapi = USB_API_HID;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Get the API type (after checking that the driver installation is OK)\n\t\t\t\tif ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_INSTALL_STATE,\n\t\t\t\t\t&reg_type, (BYTE *)&install_state, 4, &size)) || (size != 4)) {\n\t\t\t\t\tusbi_warn(ctx, \"could not detect installation state of driver for '%s': %s\",\n\t\t\t\t\t\tdev_id_path, windows_error_str(0));\n\t\t\t\t} else if (install_state != 0) {\n\t\t\t\t\tusbi_warn(ctx, \"driver for device '%s' is reporting an issue (code: %u) - skipping\",\n\t\t\t\t\t\tdev_id_path, (unsigned int)install_state);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tget_api_type(ctx, &dev_info, &dev_info_data, &api, &sub_api);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Find parent device (for the passes that need it)\n\t\t\tswitch (pass) {\n\t\t\tcase HCD_PASS:\n\t\t\tcase DEV_PASS:\n\t\t\tcase HUB_PASS:\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Go through the ancestors until we see a face we recognize\n\t\t\t\tparent_dev = NULL;\n\t\t\t\tfor (ancestor = 1; parent_dev == NULL; ancestor++) {\n\t\t\t\t\tsession_id = get_ancestor_session_id(dev_info_data.DevInst, ancestor);\n\t\t\t\t\tif (session_id == 0)\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tparent_dev = usbi_get_device_by_session_id(ctx, session_id);\n\t\t\t\t}\n\n\t\t\t\tif (parent_dev == NULL) {\n\t\t\t\t\tusbi_dbg(\"unlisted ancestor for '%s' (non USB HID, newly connected, etc.) - ignoring\", dev_id_path);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tparent_priv = _device_priv(parent_dev);\n\t\t\t\t// virtual USB devices are also listed during GEN - don't process these yet\n\t\t\t\tif ((pass == GEN_PASS) && (parent_priv->apib->id != USB_API_HUB)) {\n\t\t\t\t\tlibusb_unref_device(parent_dev);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Create new or match existing device, using the (hashed) device_id as session id\n\t\t\tif (pass <= DEV_PASS) {\t// For subsequent passes, we'll lookup the parent\n\t\t\t\t// These are the passes that create \"new\" devices\n\t\t\t\tsession_id = htab_hash(dev_id_path);\n\t\t\t\tdev = usbi_get_device_by_session_id(ctx, session_id);\n\t\t\t\tif (dev == NULL) {\n\t\t\t\t\tif (pass == DEV_PASS) {\n\t\t\t\t\t\t// This can occur if the OS only reports a newly plugged device after we started enum\n\t\t\t\t\t\tusbi_warn(ctx, \"'%s' was only detected in late pass (newly connected device?)\"\n\t\t\t\t\t\t\t\" - ignoring\", dev_id_path);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tusbi_dbg(\"allocating new device for session [%lX]\", session_id);\n\t\t\t\t\tdev = usbi_alloc_device(ctx, session_id);\n\t\t\t\t\tif (dev == NULL)\n\t\t\t\t\t\tLOOP_BREAK(LIBUSB_ERROR_NO_MEM);\n\n\t\t\t\t\tpriv = windows_device_priv_init(dev);\n\t\t\t\t} else {\n\t\t\t\t\tusbi_dbg(\"found existing device for session [%lX] (%u.%u)\",\n\t\t\t\t\t\tsession_id, dev->bus_number, dev->device_address);\n\n\t\t\t\t\tpriv = _device_priv(dev);\n\t\t\t\t\tif ((parent_dev != NULL) && (dev->parent_dev != NULL)) {\n\t\t\t\t\t\tif (dev->parent_dev != parent_dev) {\n\t\t\t\t\t\t\t// It is possible for the actual parent device to not have existed at the\n\t\t\t\t\t\t\t// time of enumeration, so the currently assigned parent may in fact be a\n\t\t\t\t\t\t\t// grandparent.  If the devices differ, we assume the \"new\" parent device\n\t\t\t\t\t\t\t// is in fact closer to the device.\n                                                        usbi_dbg(\"updating parent device [session %lX -> %lX]\",\n                                                                dev->parent_dev->session_data, parent_dev->session_data);\n\t\t\t\t\t\t\tlibusb_unref_device(dev->parent_dev);\n\t\t\t\t\t\t\tdev->parent_dev = parent_dev;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// We hold a reference to parent_dev instance, but this device already\n\t\t\t\t\t\t\t// has a parent_dev reference (only one per child)\n\t\t\t\t\t\t\tlibusb_unref_device(parent_dev);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Keep track of devices that need unref\n\t\t\t\tunref_list[unref_cur++] = dev;\n\t\t\t\tif (unref_cur >= unref_size) {\n\t\t\t\t\tunref_size += 64;\n\t\t\t\t\tnew_unref_list = usbi_reallocf(unref_list, unref_size * sizeof(libusb_device *));\n\t\t\t\t\tif (new_unref_list == NULL) {\n\t\t\t\t\t\tusbi_err(ctx, \"could not realloc list for unref - aborting.\");\n\t\t\t\t\t\tLOOP_BREAK(LIBUSB_ERROR_NO_MEM);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tunref_list = new_unref_list;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Setup device\n\t\t\tswitch (pass) {\n\t\t\tcase HCD_PASS:\n\t\t\t\t// If the hcd has already been setup, don't do it again\n\t\t\t\tif (priv->path != NULL)\n\t\t\t\t\tbreak;\n\t\t\t\tdev->bus_number = (uint8_t)(i + 1); // bus 0 is reserved for disconnected\n\t\t\t\tdev->device_address = 0;\n\t\t\t\tdev->num_configurations = 0;\n\t\t\t\tpriv->apib = &usb_api_backend[USB_API_HUB];\n\t\t\t\tpriv->sub_api = SUB_API_NOTSET;\n\t\t\t\tpriv->depth = UINT8_MAX; // Overflow to 0 for HCD Hubs\n\t\t\t\tpriv->path = dev_interface_path;\n\t\t\t\tdev_interface_path = NULL;\n\t\t\t\tbreak;\n\t\t\tcase HUB_PASS:\n\t\t\tcase DEV_PASS:\n\t\t\t\t// If the device has already been setup, don't do it again\n\t\t\t\tif (priv->path != NULL)\n\t\t\t\t\tbreak;\n\t\t\t\t// Take care of API initialization\n\t\t\t\tpriv->path = dev_interface_path;\n\t\t\t\tdev_interface_path = NULL;\n\t\t\t\tpriv->apib = &usb_api_backend[api];\n\t\t\t\tpriv->sub_api = sub_api;\n\t\t\t\tswitch(api) {\n\t\t\t\tcase USB_API_COMPOSITE:\n\t\t\t\tcase USB_API_HUB:\n\t\t\t\t\tbreak;\n\t\t\t\tcase USB_API_HID:\n\t\t\t\t\tpriv->hid = calloc(1, sizeof(struct hid_device_priv));\n\t\t\t\t\tif (priv->hid == NULL)\n\t\t\t\t\t\tLOOP_BREAK(LIBUSB_ERROR_NO_MEM);\n\n\t\t\t\t\tpriv->hid->nb_interfaces = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// For other devices, the first interface is the same as the device\n\t\t\t\t\tpriv->usb_interface[0].path = _strdup(priv->path);\n\t\t\t\t\tif (priv->usb_interface[0].path == NULL)\n\t\t\t\t\t\tusbi_warn(ctx, \"could not duplicate interface path '%s'\", priv->path);\n\t\t\t\t\t// The following is needed if we want API calls to work for both simple\n\t\t\t\t\t// and composite devices.\n\t\t\t\t\tfor (j = 0; j < USB_MAXINTERFACES; j++)\n\t\t\t\t\t\tpriv->usb_interface[j].apib = &usb_api_backend[api];\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase GEN_PASS:\n\t\t\t\tr = init_device(dev, parent_dev, (uint8_t)port_nr, dev_id_path, dev_info_data.DevInst);\n\t\t\t\tif (r == LIBUSB_SUCCESS) {\n\t\t\t\t\t// Append device to the list of discovered devices\n\t\t\t\t\tdiscdevs = discovered_devs_append(*_discdevs, dev);\n\t\t\t\t\tif (!discdevs)\n\t\t\t\t\t\tLOOP_BREAK(LIBUSB_ERROR_NO_MEM);\n\n\t\t\t\t\t*_discdevs = discdevs;\n\t\t\t\t} else if (r == LIBUSB_ERROR_NO_DEVICE) {\n\t\t\t\t\t// This can occur if the device was disconnected but Windows hasn't\n\t\t\t\t\t// refreshed its enumeration yet - in that case, we ignore the device\n\t\t\t\t\tr = LIBUSB_SUCCESS;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault: // HID_PASS and later\n\t\t\t\tif (parent_priv->apib->id == USB_API_HID || parent_priv->apib->id == USB_API_COMPOSITE) {\n\t\t\t\t\tif (parent_priv->apib->id == USB_API_HID) {\n\t\t\t\t\t\tusbi_dbg(\"setting HID interface for [%lX]:\", parent_dev->session_data);\n\t\t\t\t\t\tr = set_hid_interface(ctx, parent_dev, dev_interface_path);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tusbi_dbg(\"setting composite interface for [%lX]:\", parent_dev->session_data);\n\t\t\t\t\t\tr = set_composite_interface(ctx, parent_dev, dev_interface_path, dev_id_path, api, sub_api);\n\t\t\t\t\t}\n\t\t\t\t\tswitch (r) {\n\t\t\t\t\tcase LIBUSB_SUCCESS:\n\t\t\t\t\t\tdev_interface_path = NULL;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase LIBUSB_ERROR_ACCESS:\n\t\t\t\t\t\t// interface has already been set => make sure dev_interface_path is freed then\n\t\t\t\t\t\tr = LIBUSB_SUCCESS;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tLOOP_BREAK(r);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlibusb_unref_device(parent_dev);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Free any additional GUIDs\n\tfor (pass = HID_PASS + 1; pass < nb_guids; pass++)\n\t\tfree((void *)guid[pass]);\n\n\t// Unref newly allocated devs\n\tfor (i = 0; i < unref_cur; i++)\n\t\tlibusb_unref_device(unref_list[i]);\n\tfree(unref_list);\n\n\treturn r;\n}\n\n/*\n * exit: libusb backend deinitialization function\n */\nstatic void windows_exit(void)\n{\n\tint i;\n\tHANDLE semaphore;\n\tchar sem_name[11 + 8 + 1]; // strlen(\"libusb_init\") + (32-bit hex PID) + '\\0'\n\n\tsprintf(sem_name, \"libusb_init%08X\", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF));\n\tsemaphore = CreateSemaphoreA(NULL, 1, 1, sem_name);\n\tif (semaphore == NULL)\n\t\treturn;\n\n\t// A successful wait brings our semaphore count to 0 (unsignaled)\n\t// => any concurent wait stalls until the semaphore release\n\tif (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) {\n\t\tCloseHandle(semaphore);\n\t\treturn;\n\t}\n\n\t// Only works if exits and inits are balanced exactly\n\tif (--concurrent_usage < 0) { // Last exit\n\t\tfor (i = 0; i < USB_API_MAX; i++)\n\t\t\tusb_api_backend[i].exit(SUB_API_NOTSET);\n\t\texit_dlls();\n\t\texit_polling();\n\t\twindows_common_exit();\n\t\tusbi_mutex_destroy(&autoclaim_lock);\n\t}\n\n\tReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1\n\tCloseHandle(semaphore);\n}\n\nstatic int windows_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev);\n\n\tmemcpy(buffer, &priv->dev_descriptor, DEVICE_DESC_LENGTH);\n\t*host_endian = 0;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int windows_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev);\n\tPUSB_CONFIGURATION_DESCRIPTOR config_header;\n\tsize_t size;\n\n\t// config index is zero based\n\tif (config_index >= dev->num_configurations)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tif ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL))\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tconfig_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[config_index];\n\n\tsize = MIN(config_header->wTotalLength, len);\n\tmemcpy(buffer, priv->config_descriptor[config_index], size);\n\t*host_endian = 0;\n\n\treturn (int)size;\n}\n\nstatic int windows_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue,\n\tunsigned char **buffer, int *host_endian)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev);\n\tPUSB_CONFIGURATION_DESCRIPTOR config_header;\n\tuint8_t index;\n\n\t*buffer = NULL;\n\t*host_endian = 0;\n\n\tif (priv->config_descriptor == NULL)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tfor (index = 0; index < dev->num_configurations; index++) {\n\t\tconfig_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[index];\n\t\tif (config_header->bConfigurationValue == bConfigurationValue) {\n\t\t\t*buffer = priv->config_descriptor[index];\n\t\t\treturn (int)config_header->wTotalLength;\n\t\t}\n\t}\n\n\treturn LIBUSB_ERROR_NOT_FOUND;\n}\n\n/*\n * return the cached copy of the active config descriptor\n */\nstatic int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev);\n\tunsigned char *config_desc;\n\tint r;\n\n\tif (priv->active_config == 0)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tr = windows_get_config_descriptor_by_value(dev, priv->active_config, &config_desc, host_endian);\n\tif (r < 0)\n\t\treturn r;\n\n\tlen = MIN((size_t)r, len);\n\tmemcpy(buffer, config_desc, len);\n\treturn (int)len;\n}\n\nstatic int windows_open(struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\n\tif (priv->apib == NULL) {\n\t\tusbi_err(ctx, \"program assertion failed - device is not initialized\");\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn priv->apib->open(SUB_API_NOTSET, dev_handle);\n}\n\nstatic void windows_close(struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\tpriv->apib->close(SUB_API_NOTSET, dev_handle);\n}\n\nstatic int windows_get_configuration(struct libusb_device_handle *dev_handle, int *config)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\tif (priv->active_config == 0) {\n\t\t*config = 0;\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\t*config = priv->active_config;\n\treturn LIBUSB_SUCCESS;\n}\n\n/*\n * from http://msdn.microsoft.com/en-us/library/ms793522.aspx: \"The port driver\n * does not currently expose a service that allows higher-level drivers to set\n * the configuration.\"\n */\nstatic int windows_set_configuration(struct libusb_device_handle *dev_handle, int config)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tint r = LIBUSB_SUCCESS;\n\n\tif (config >= USB_MAXCONFIG)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tr = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_OUT |\n\t\tLIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE,\n\t\tLIBUSB_REQUEST_SET_CONFIGURATION, (uint16_t)config,\n\t\t0, NULL, 0, 1000);\n\n\tif (r == LIBUSB_SUCCESS)\n\t\tpriv->active_config = (uint8_t)config;\n\n\treturn r;\n}\n\nstatic int windows_claim_interface(struct libusb_device_handle *dev_handle, int iface)\n{\n\tint r = LIBUSB_SUCCESS;\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\tsafe_free(priv->usb_interface[iface].endpoint);\n\tpriv->usb_interface[iface].nb_endpoints = 0;\n\n\tr = priv->apib->claim_interface(SUB_API_NOTSET, dev_handle, iface);\n\n\tif (r == LIBUSB_SUCCESS)\n\t\tr = windows_assign_endpoints(dev_handle, iface, 0);\n\n\treturn r;\n}\n\nstatic int windows_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting)\n{\n\tint r = LIBUSB_SUCCESS;\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\tsafe_free(priv->usb_interface[iface].endpoint);\n\tpriv->usb_interface[iface].nb_endpoints = 0;\n\n\tr = priv->apib->set_interface_altsetting(SUB_API_NOTSET, dev_handle, iface, altsetting);\n\n\tif (r == LIBUSB_SUCCESS)\n\t\tr = windows_assign_endpoints(dev_handle, iface, altsetting);\n\n\treturn r;\n}\n\nstatic int windows_release_interface(struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\treturn priv->apib->release_interface(SUB_API_NOTSET, dev_handle, iface);\n}\n\nstatic int windows_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\treturn priv->apib->clear_halt(SUB_API_NOTSET, dev_handle, endpoint);\n}\n\nstatic int windows_reset_device(struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\treturn priv->apib->reset_device(SUB_API_NOTSET, dev_handle);\n}\n\n// The 3 functions below are unlikely to ever get supported on Windows\nstatic int windows_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface)\n{\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic int windows_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface)\n{\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface)\n{\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic void windows_destroy_device(struct libusb_device *dev)\n{\n\twindows_device_priv_release(dev);\n}\n\nvoid windows_clear_transfer_priv(struct usbi_transfer *itransfer)\n{\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\n\tusbi_free_fd(&transfer_priv->pollable_fd);\n\tsafe_free(transfer_priv->hid_buffer);\n\t// When auto claim is in use, attempt to release the auto-claimed interface\n\tauto_release(itransfer);\n}\n\nstatic int submit_bulk_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tint r;\n\n\tr = priv->apib->submit_bulk_transfer(SUB_API_NOTSET, itransfer);\n\tif (r != LIBUSB_SUCCESS)\n\t\treturn r;\n\n\tusbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd,\n\t\t(short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT));\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int submit_iso_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tint r;\n\n\tr = priv->apib->submit_iso_transfer(SUB_API_NOTSET, itransfer);\n\tif (r != LIBUSB_SUCCESS)\n\t\treturn r;\n\n\tusbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd,\n\t\t(short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT));\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int submit_control_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tint r;\n\n\tr = priv->apib->submit_control_transfer(SUB_API_NOTSET, itransfer);\n\tif (r != LIBUSB_SUCCESS)\n\t\treturn r;\n\n\tusbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int windows_submit_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\treturn submit_control_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\t\tif (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET))\n\t\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\t\treturn submit_bulk_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\treturn submit_iso_transfer(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\tdefault:\n\t\tusbi_err(TRANSFER_CTX(transfer), \"unknown endpoint type %d\", transfer->type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nstatic int windows_abort_control(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\n\treturn priv->apib->abort_control(SUB_API_NOTSET, itransfer);\n}\n\nstatic int windows_abort_transfers(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\n\treturn priv->apib->abort_transfers(SUB_API_NOTSET, itransfer);\n}\n\nstatic int windows_cancel_transfer(struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\n\tswitch (transfer->type) {\n\tcase LIBUSB_TRANSFER_TYPE_CONTROL:\n\t\treturn windows_abort_control(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_BULK:\n\tcase LIBUSB_TRANSFER_TYPE_INTERRUPT:\n\tcase LIBUSB_TRANSFER_TYPE_ISOCHRONOUS:\n\t\treturn windows_abort_transfers(itransfer);\n\tcase LIBUSB_TRANSFER_TYPE_BULK_STREAM:\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\tdefault:\n\t\tusbi_err(ITRANSFER_CTX(itransfer), \"unknown endpoint type %d\", transfer->type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n}\n\nint windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\treturn priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size);\n}\n\nstruct winfd *windows_get_fd(struct usbi_transfer *transfer)\n{\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(transfer);\n\treturn &transfer_priv->pollable_fd;\n}\n\nvoid windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size)\n{\n\tif (HasOverlappedIoCompletedSync(pollable_fd->overlapped)) {\n\t\t*io_result = NO_ERROR;\n\t\t*io_size = (DWORD)pollable_fd->overlapped->InternalHigh;\n\t} else if (GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) {\n\t\t// Regular async overlapped\n\t\t*io_result = NO_ERROR;\n\t} else {\n\t\t*io_result = GetLastError();\n\t}\n}\n\n// NB: MSVC6 does not support named initializers.\nconst struct usbi_os_backend windows_backend = {\n\t\"Windows\",\n\tUSBI_CAP_HAS_HID_ACCESS,\n\twindows_init,\n\twindows_exit,\n\n\twindows_get_device_list,\n\tNULL,\t\t\t\t/* hotplug_poll */\n\twindows_open,\n\twindows_close,\n\n\twindows_get_device_descriptor,\n\twindows_get_active_config_descriptor,\n\twindows_get_config_descriptor,\n\twindows_get_config_descriptor_by_value,\n\n\twindows_get_configuration,\n\twindows_set_configuration,\n\twindows_claim_interface,\n\twindows_release_interface,\n\n\twindows_set_interface_altsetting,\n\twindows_clear_halt,\n\twindows_reset_device,\n\n\tNULL,\t\t\t\t/* alloc_streams */\n\tNULL,\t\t\t\t/* free_streams */\n\n\tNULL,\t\t\t\t/* dev_mem_alloc */\n\tNULL,\t\t\t\t/* dev_mem_free */\n\n\twindows_kernel_driver_active,\n\twindows_detach_kernel_driver,\n\twindows_attach_kernel_driver,\n\n\twindows_destroy_device,\n\n\twindows_submit_transfer,\n\twindows_cancel_transfer,\n\twindows_clear_transfer_priv,\n\n\twindows_handle_events,\n\tNULL,\n\n\twindows_clock_gettime,\n#if defined(USBI_TIMERFD_AVAILABLE)\n\tNULL,\n#endif\n\tsizeof(struct windows_device_priv),\n\tsizeof(struct windows_device_handle_priv),\n\tsizeof(struct windows_transfer_priv),\n};\n\n\n/*\n * USB API backends\n */\nstatic int unsupported_init(int sub_api, struct libusb_context *ctx)\n{\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int unsupported_exit(int sub_api)\n{\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int unsupported_open(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tPRINT_UNSUPPORTED_API(open);\n}\n\nstatic void unsupported_close(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tusbi_dbg(\"unsupported API call for 'close'\");\n}\n\nstatic int unsupported_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tPRINT_UNSUPPORTED_API(configure_endpoints);\n}\n\nstatic int unsupported_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tPRINT_UNSUPPORTED_API(claim_interface);\n}\n\nstatic int unsupported_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting)\n{\n\tPRINT_UNSUPPORTED_API(set_interface_altsetting);\n}\n\nstatic int unsupported_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tPRINT_UNSUPPORTED_API(release_interface);\n}\n\nstatic int unsupported_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint)\n{\n\tPRINT_UNSUPPORTED_API(clear_halt);\n}\n\nstatic int unsupported_reset_device(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tPRINT_UNSUPPORTED_API(reset_device);\n}\n\nstatic int unsupported_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tPRINT_UNSUPPORTED_API(submit_bulk_transfer);\n}\n\nstatic int unsupported_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tPRINT_UNSUPPORTED_API(submit_iso_transfer);\n}\n\nstatic int unsupported_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tPRINT_UNSUPPORTED_API(submit_control_transfer);\n}\n\nstatic int unsupported_abort_control(int sub_api, struct usbi_transfer *itransfer)\n{\n\tPRINT_UNSUPPORTED_API(abort_control);\n}\n\nstatic int unsupported_abort_transfers(int sub_api, struct usbi_transfer *itransfer)\n{\n\tPRINT_UNSUPPORTED_API(abort_transfers);\n}\n\nstatic int unsupported_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size)\n{\n\tPRINT_UNSUPPORTED_API(copy_transfer_data);\n}\n\nstatic int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\treturn LIBUSB_SUCCESS;\n}\n\n// These names must be uppercase\nstatic const char *hub_driver_names[] = {\"USBHUB\", \"USBHUB3\", \"USB3HUB\", \"NUSB3HUB\", \"RUSB3HUB\", \"FLXHCIH\", \"TIHUB3\", \"ETRONHUB3\", \"VIAHUB3\", \"ASMTHUB3\", \"IUSB3HUB\", \"VUSB3HUB\", \"AMDHUB30\", \"VHHUB\", \"AUSB3HUB\"};\nstatic const char *composite_driver_names[] = {\"USBCCGP\"};\nstatic const char *winusbx_driver_names[] = WINUSBX_DRV_NAMES;\nstatic const char *hid_driver_names[] = {\"HIDUSB\", \"MOUHID\", \"KBDHID\"};\nconst struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = {\n\t{\n\t\tUSB_API_UNSUPPORTED,\n\t\t\"Unsupported API\",\n\t\tNULL,\n\t\t0,\n\t\tunsupported_init,\n\t\tunsupported_exit,\n\t\tunsupported_open,\n\t\tunsupported_close,\n\t\tunsupported_configure_endpoints,\n\t\tunsupported_claim_interface,\n\t\tunsupported_set_interface_altsetting,\n\t\tunsupported_release_interface,\n\t\tunsupported_clear_halt,\n\t\tunsupported_reset_device,\n\t\tunsupported_submit_bulk_transfer,\n\t\tunsupported_submit_iso_transfer,\n\t\tunsupported_submit_control_transfer,\n\t\tunsupported_abort_control,\n\t\tunsupported_abort_transfers,\n\t\tunsupported_copy_transfer_data,\n\t},\n\t{\n\t\tUSB_API_HUB,\n\t\t\"HUB API\",\n\t\thub_driver_names,\n\t\tARRAYSIZE(hub_driver_names),\n\t\tunsupported_init,\n\t\tunsupported_exit,\n\t\tunsupported_open,\n\t\tunsupported_close,\n\t\tunsupported_configure_endpoints,\n\t\tunsupported_claim_interface,\n\t\tunsupported_set_interface_altsetting,\n\t\tunsupported_release_interface,\n\t\tunsupported_clear_halt,\n\t\tunsupported_reset_device,\n\t\tunsupported_submit_bulk_transfer,\n\t\tunsupported_submit_iso_transfer,\n\t\tunsupported_submit_control_transfer,\n\t\tunsupported_abort_control,\n\t\tunsupported_abort_transfers,\n\t\tunsupported_copy_transfer_data,\n\t},\n\t{\n\t\tUSB_API_COMPOSITE,\n\t\t\"Composite API\",\n\t\tcomposite_driver_names,\n\t\tARRAYSIZE(composite_driver_names),\n\t\tcomposite_init,\n\t\tcomposite_exit,\n\t\tcomposite_open,\n\t\tcomposite_close,\n\t\tcommon_configure_endpoints,\n\t\tcomposite_claim_interface,\n\t\tcomposite_set_interface_altsetting,\n\t\tcomposite_release_interface,\n\t\tcomposite_clear_halt,\n\t\tcomposite_reset_device,\n\t\tcomposite_submit_bulk_transfer,\n\t\tcomposite_submit_iso_transfer,\n\t\tcomposite_submit_control_transfer,\n\t\tcomposite_abort_control,\n\t\tcomposite_abort_transfers,\n\t\tcomposite_copy_transfer_data,\n\t},\n\t{\n\t\tUSB_API_WINUSBX,\n\t\t\"WinUSB-like APIs\",\n\t\twinusbx_driver_names,\n\t\tARRAYSIZE(winusbx_driver_names),\n\t\twinusbx_init,\n\t\twinusbx_exit,\n\t\twinusbx_open,\n\t\twinusbx_close,\n\t\twinusbx_configure_endpoints,\n\t\twinusbx_claim_interface,\n\t\twinusbx_set_interface_altsetting,\n\t\twinusbx_release_interface,\n\t\twinusbx_clear_halt,\n\t\twinusbx_reset_device,\n\t\twinusbx_submit_bulk_transfer,\n\t\tunsupported_submit_iso_transfer,\n\t\twinusbx_submit_control_transfer,\n\t\twinusbx_abort_control,\n\t\twinusbx_abort_transfers,\n\t\twinusbx_copy_transfer_data,\n\t},\n\t{\n\t\tUSB_API_HID,\n\t\t\"HID API\",\n\t\thid_driver_names,\n\t\tARRAYSIZE(hid_driver_names),\n\t\thid_init,\n\t\thid_exit,\n\t\thid_open,\n\t\thid_close,\n\t\tcommon_configure_endpoints,\n\t\thid_claim_interface,\n\t\thid_set_interface_altsetting,\n\t\thid_release_interface,\n\t\thid_clear_halt,\n\t\thid_reset_device,\n\t\thid_submit_bulk_transfer,\n\t\tunsupported_submit_iso_transfer,\n\t\thid_submit_control_transfer,\n\t\thid_abort_transfers,\n\t\thid_abort_transfers,\n\t\thid_copy_transfer_data,\n\t},\n};\n\n\n/*\n * WinUSB-like (WinUSB, libusb0/libusbK through libusbk DLL) API functions\n */\n#define WinUSBX_Set(fn)\t\t\t\t\t\t\t\t\t\t\\\n\tdo {\t\t\t\t\t\t\t\t\t\t\t\\\n\t\tif (native_winusb)\t\t\t\t\t\t\t\t\\\n\t\t\tWinUSBX[i].fn = (WinUsb_##fn##_t)GetProcAddress(h, \"WinUsb_\" #fn);\t\\\n\t\telse\t\t\t\t\t\t\t\t\t\t\\\n\t\t\tpLibK_GetProcAddress((PVOID *)&WinUSBX[i].fn, i, KUSB_FNID_##fn);\t\\\n\t} while (0)\n\nstatic int winusbx_init(int sub_api, struct libusb_context *ctx)\n{\n\tHMODULE h;\n\tbool native_winusb;\n\tint i;\n\tKLIB_VERSION LibK_Version;\n\tLibK_GetProcAddress_t pLibK_GetProcAddress = NULL;\n\tLibK_GetVersion_t pLibK_GetVersion;\n\n\th = LoadLibraryA(\"libusbK\");\n\n\tif (h == NULL) {\n\t\tusbi_info(ctx, \"libusbK DLL is not available, will use native WinUSB\");\n\t\th = LoadLibraryA(\"WinUSB\");\n\n\t\tif (h == NULL) {\n\t\t\tusbi_warn(ctx, \"WinUSB DLL is not available either, \"\n\t\t\t\t\"you will not be able to access devices outside of enumeration\");\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\t}\n\t} else {\n\t\tusbi_dbg(\"using libusbK DLL for universal access\");\n\t\tpLibK_GetVersion = (LibK_GetVersion_t)GetProcAddress(h, \"LibK_GetVersion\");\n\t\tif (pLibK_GetVersion != NULL) {\n\t\t\tpLibK_GetVersion(&LibK_Version);\n\t\t\tusbi_dbg(\"libusbK version: %d.%d.%d.%d\", LibK_Version.Major, LibK_Version.Minor,\n\t\t\t\tLibK_Version.Micro, LibK_Version.Nano);\n\t\t}\n\t\tpLibK_GetProcAddress = (LibK_GetProcAddress_t)GetProcAddress(h, \"LibK_GetProcAddress\");\n\t\tif (pLibK_GetProcAddress == NULL) {\n\t\t\tusbi_err(ctx, \"LibK_GetProcAddress() not found in libusbK DLL\");\n\t\t\tFreeLibrary(h);\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\t}\n\t}\n\n\tnative_winusb = (pLibK_GetProcAddress == NULL);\n\tfor (i = SUB_API_LIBUSBK; i < SUB_API_MAX; i++) {\n\t\tWinUSBX_Set(AbortPipe);\n\t\tWinUSBX_Set(ControlTransfer);\n\t\tWinUSBX_Set(FlushPipe);\n\t\tWinUSBX_Set(Free);\n\t\tWinUSBX_Set(GetAssociatedInterface);\n\t\tWinUSBX_Set(GetCurrentAlternateSetting);\n\t\tWinUSBX_Set(GetDescriptor);\n\t\tWinUSBX_Set(GetOverlappedResult);\n\t\tWinUSBX_Set(GetPipePolicy);\n\t\tWinUSBX_Set(GetPowerPolicy);\n\t\tWinUSBX_Set(Initialize);\n\t\tWinUSBX_Set(QueryDeviceInformation);\n\t\tWinUSBX_Set(QueryInterfaceSettings);\n\t\tWinUSBX_Set(QueryPipe);\n\t\tWinUSBX_Set(ReadPipe);\n\t\tWinUSBX_Set(ResetPipe);\n\t\tWinUSBX_Set(SetCurrentAlternateSetting);\n\t\tWinUSBX_Set(SetPipePolicy);\n\t\tWinUSBX_Set(SetPowerPolicy);\n\t\tWinUSBX_Set(WritePipe);\n\t\tif (!native_winusb)\n\t\t\tWinUSBX_Set(ResetDevice);\n\n\t\tif (WinUSBX[i].Initialize != NULL) {\n\t\t\tWinUSBX[i].initialized = true;\n\t\t\tusbi_dbg(\"initalized sub API %s\", sub_api_name[i]);\n\t\t} else {\n\t\t\tusbi_warn(ctx, \"Failed to initalize sub API %s\", sub_api_name[i]);\n\t\t\tWinUSBX[i].initialized = false;\n\t\t}\n\t}\n\n\tWinUSBX_handle = h;\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_exit(int sub_api)\n{\n\tif (WinUSBX_handle != NULL) {\n\t\tFreeLibrary(WinUSBX_handle);\n\t\tWinUSBX_handle = NULL;\n\n\t\t/* Reset the WinUSBX API structures */\n\t\tmemset(&WinUSBX, 0, sizeof(WinUSBX));\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\n// NB: open and close must ensure that they only handle interface of\n// the right API type, as these functions can be called wholesale from\n// composite_open(), with interfaces belonging to different APIs\nstatic int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\n\tHANDLE file_handle;\n\tint i;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\t// WinUSB requires a separate handle for each interface\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif ((priv->usb_interface[i].path != NULL)\n\t\t\t\t&& (priv->usb_interface[i].apib->id == USB_API_WINUSBX)) {\n\t\t\tfile_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ,\n\t\t\t\tNULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);\n\t\t\tif (file_handle == INVALID_HANDLE_VALUE) {\n\t\t\t\tusbi_err(ctx, \"could not open device %s (interface %d): %s\", priv->usb_interface[i].path, i, windows_error_str(0));\n\t\t\t\tswitch(GetLastError()) {\n\t\t\t\tcase ERROR_FILE_NOT_FOUND: // The device was disconnected\n\t\t\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t\t\tcase ERROR_ACCESS_DENIED:\n\t\t\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t\t\tdefault:\n\t\t\t\t\treturn LIBUSB_ERROR_IO;\n\t\t\t\t}\n\t\t\t}\n\t\t\thandle_priv->interface_handle[i].dev_handle = file_handle;\n\t\t}\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tHANDLE handle;\n\tint i;\n\n\tif (sub_api == SUB_API_NOTSET)\n\t\tsub_api = priv->sub_api;\n\n\tif (!WinUSBX[sub_api].initialized)\n\t\treturn;\n\n\tif (priv->apib->id == USB_API_COMPOSITE) {\n\t\t// If this is a composite device, just free and close all WinUSB-like\n\t\t// interfaces directly (each is independent and not associated with another)\n\t\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\t\tif (priv->usb_interface[i].apib->id == USB_API_WINUSBX) {\n\t\t\t\thandle = handle_priv->interface_handle[i].api_handle;\n\t\t\t\tif (HANDLE_VALID(handle))\n\t\t\t\t\tWinUSBX[sub_api].Free(handle);\n\n\t\t\t\thandle = handle_priv->interface_handle[i].dev_handle;\n\t\t\t\tif (HANDLE_VALID(handle))\n\t\t\t\t\tCloseHandle(handle);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// If this is a WinUSB device, free all interfaces above interface 0,\n\t\t// then free and close interface 0 last\n\t\tfor (i = 1; i < USB_MAXINTERFACES; i++) {\n\t\t\thandle = handle_priv->interface_handle[i].api_handle;\n\t\t\tif (HANDLE_VALID(handle))\n\t\t\t\tWinUSBX[sub_api].Free(handle);\n\t\t}\n\t\thandle = handle_priv->interface_handle[0].api_handle;\n\t\tif (HANDLE_VALID(handle))\n\t\t\tWinUSBX[sub_api].Free(handle);\n\n\t\thandle = handle_priv->interface_handle[0].dev_handle;\n\t\tif (HANDLE_VALID(handle))\n\t\t\tCloseHandle(handle);\n\t}\n}\n\nstatic int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tHANDLE winusb_handle = handle_priv->interface_handle[iface].api_handle;\n\tUCHAR policy;\n\tULONG timeout = 0;\n\tuint8_t endpoint_address;\n\tint i;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\t// With handle and enpoints set (in parent), we can setup the default pipe properties\n\t// see http://download.microsoft.com/download/D/1/D/D1DD7745-426B-4CC3-A269-ABBBE427C0EF/DVC-T705_DDC08.pptx\n\tfor (i = -1; i < priv->usb_interface[iface].nb_endpoints; i++) {\n\t\tendpoint_address = (i == -1) ? 0 : priv->usb_interface[iface].endpoint[i];\n\t\tif (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address,\n\t\t\tPIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout))\n\t\t\tusbi_dbg(\"failed to set PIPE_TRANSFER_TIMEOUT for control endpoint %02X\", endpoint_address);\n\n\t\tif ((i == -1) || (sub_api == SUB_API_LIBUSB0))\n\t\t\tcontinue; // Other policies don't apply to control endpoint or libusb0\n\n\t\tpolicy = false;\n\t\tif (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address,\n\t\t\tSHORT_PACKET_TERMINATE, sizeof(UCHAR), &policy))\n\t\t\tusbi_dbg(\"failed to disable SHORT_PACKET_TERMINATE for endpoint %02X\", endpoint_address);\n\n\t\tif (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address,\n\t\t\tIGNORE_SHORT_PACKETS, sizeof(UCHAR), &policy))\n\t\t\tusbi_dbg(\"failed to disable IGNORE_SHORT_PACKETS for endpoint %02X\", endpoint_address);\n\n\t\tpolicy = true;\n\t\t/* ALLOW_PARTIAL_READS must be enabled due to likely libusbK bug. See:\n\t\t   https://sourceforge.net/mailarchive/message.php?msg_id=29736015 */\n\t\tif (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address,\n\t\t\tALLOW_PARTIAL_READS, sizeof(UCHAR), &policy))\n\t\t\tusbi_dbg(\"failed to enable ALLOW_PARTIAL_READS for endpoint %02X\", endpoint_address);\n\n\t\tif (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address,\n\t\t\tAUTO_CLEAR_STALL, sizeof(UCHAR), &policy))\n\t\t\tusbi_dbg(\"failed to enable AUTO_CLEAR_STALL for endpoint %02X\", endpoint_address);\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tbool is_using_usbccgp = (priv->apib->id == USB_API_COMPOSITE);\n\tSP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL;\n\tHDEVINFO dev_info = INVALID_HANDLE_VALUE;\n\tSP_DEVINFO_DATA dev_info_data;\n\tchar *dev_path_no_guid = NULL;\n\tchar filter_path[] = \"\\\\\\\\.\\\\libusb0-0000\";\n\tbool found_filter = false;\n\tHANDLE file_handle, winusb_handle;\n\tDWORD err;\n\tint i;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\t// If the device is composite, but using the default Windows composite parent driver (usbccgp)\n\t// or if it's the first WinUSB-like interface, we get a handle through Initialize().\n\tif ((is_using_usbccgp) || (iface == 0)) {\n\t\t// composite device (independent interfaces) or interface 0\n\t\tfile_handle = handle_priv->interface_handle[iface].dev_handle;\n\t\tif (!HANDLE_VALID(file_handle))\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\t\tif (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) {\n\t\t\thandle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE;\n\t\t\terr = GetLastError();\n\t\t\tswitch(err) {\n\t\t\tcase ERROR_BAD_COMMAND:\n\t\t\t\t// The device was disconnected\n\t\t\t\tusbi_err(ctx, \"could not access interface %d: %s\", iface, windows_error_str(0));\n\t\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t\tdefault:\n\t\t\t\t// it may be that we're using the libusb0 filter driver.\n\t\t\t\t// TODO: can we move this whole business into the K/0 DLL?\n\t\t\t\tfor (i = 0; ; i++) {\n\t\t\t\t\tsafe_free(dev_interface_details);\n\t\t\t\t\tsafe_free(dev_path_no_guid);\n\n\t\t\t\t\tdev_interface_details = get_interface_details_filter(ctx, &dev_info, &dev_info_data, &GUID_DEVINTERFACE_LIBUSB0_FILTER, i, filter_path);\n\t\t\t\t\tif ((found_filter) || (dev_interface_details == NULL))\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// ignore GUID part\n\t\t\t\t\tdev_path_no_guid = sanitize_path(strtok(dev_interface_details->DevicePath, \"{\"));\n\t\t\t\t\tif (dev_path_no_guid == NULL)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tif (strncmp(dev_path_no_guid, priv->usb_interface[iface].path, strlen(dev_path_no_guid)) == 0) {\n\t\t\t\t\t\tfile_handle = CreateFileA(filter_path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ,\n\t\t\t\t\t\t\tNULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);\n\t\t\t\t\t\tif (file_handle != INVALID_HANDLE_VALUE) {\n\t\t\t\t\t\t\tif (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) {\n\t\t\t\t\t\t\t\t// Replace the existing file handle with the working one\n\t\t\t\t\t\t\t\tCloseHandle(handle_priv->interface_handle[iface].dev_handle);\n\t\t\t\t\t\t\t\thandle_priv->interface_handle[iface].dev_handle = file_handle;\n\t\t\t\t\t\t\t\tfound_filter = true;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tusbi_err(ctx, \"could not initialize filter driver for %s\", filter_path);\n\t\t\t\t\t\t\t\tCloseHandle(file_handle);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tusbi_err(ctx, \"could not open device %s: %s\", filter_path, windows_error_str(0));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfree(dev_interface_details);\n\t\t\t\tif (!found_filter) {\n\t\t\t\t\tusbi_err(ctx, \"could not access interface %d: %s\", iface, windows_error_str(err));\n\t\t\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\thandle_priv->interface_handle[iface].api_handle = winusb_handle;\n\t} else {\n\t\t// For all other interfaces, use GetAssociatedInterface()\n\t\twinusb_handle = handle_priv->interface_handle[0].api_handle;\n\t\t// It is a requirement for multiple interface devices on Windows that, to you\n\t\t// must first claim the first interface before you claim the others\n\t\tif (!HANDLE_VALID(winusb_handle)) {\n\t\t\tfile_handle = handle_priv->interface_handle[0].dev_handle;\n\t\t\tif (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) {\n\t\t\t\thandle_priv->interface_handle[0].api_handle = winusb_handle;\n\t\t\t\tusbi_warn(ctx, \"auto-claimed interface 0 (required to claim %d with WinUSB)\", iface);\n\t\t\t} else {\n\t\t\t\tusbi_warn(ctx, \"failed to auto-claim interface 0 (required to claim %d with WinUSB): %s\", iface, windows_error_str(0));\n\t\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t\t}\n\t\t}\n\t\tif (!WinUSBX[sub_api].GetAssociatedInterface(winusb_handle, (UCHAR)(iface - 1),\n\t\t\t&handle_priv->interface_handle[iface].api_handle)) {\n\t\t\thandle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE;\n\t\t\tswitch(GetLastError()) {\n\t\t\tcase ERROR_NO_MORE_ITEMS:   // invalid iface\n\t\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t\t\tcase ERROR_BAD_COMMAND:     // The device was disconnected\n\t\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t\tcase ERROR_ALREADY_EXISTS:  // already claimed\n\t\t\t\treturn LIBUSB_ERROR_BUSY;\n\t\t\tdefault:\n\t\t\t\tusbi_err(ctx, \"could not claim interface %d: %s\", iface, windows_error_str(0));\n\t\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t\t}\n\t\t}\n\t}\n\tusbi_dbg(\"claimed interface %d\", iface);\n\thandle_priv->active_interface = iface;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tHANDLE winusb_handle;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\twinusb_handle = handle_priv->interface_handle[iface].api_handle;\n\tif (!HANDLE_VALID(winusb_handle))\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tWinUSBX[sub_api].Free(winusb_handle);\n\thandle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE;\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/*\n * Return the first valid interface (of the same API type), for control transfers\n */\nstatic int get_valid_interface(struct libusb_device_handle *dev_handle, int api_id)\n{\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tint i;\n\n\tif ((api_id < USB_API_WINUSBX) || (api_id > USB_API_HID)) {\n\t\tusbi_dbg(\"unsupported API ID\");\n\t\treturn -1;\n\t}\n\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif (HANDLE_VALID(handle_priv->interface_handle[i].dev_handle)\n\t\t\t\t&& HANDLE_VALID(handle_priv->interface_handle[i].api_handle)\n\t\t\t\t&& (priv->usb_interface[i].apib->id == api_id))\n\t\t\treturn i;\n\t}\n\n\treturn -1;\n}\n\n/*\n * Lookup interface by endpoint address. -1 if not found\n */\nstatic int interface_by_endpoint(struct windows_device_priv *priv,\n\tstruct windows_device_handle_priv *handle_priv, uint8_t endpoint_address)\n{\n\tint i, j;\n\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif (!HANDLE_VALID(handle_priv->interface_handle[i].api_handle))\n\t\t\tcontinue;\n\t\tif (priv->usb_interface[i].endpoint == NULL)\n\t\t\tcontinue;\n\t\tfor (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) {\n\t\t\tif (priv->usb_interface[i].endpoint[j] == endpoint_address)\n\t\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nstatic int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tWINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer;\n\tULONG size;\n\tHANDLE winusb_handle;\n\tint current_interface;\n\tstruct winfd wfd;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\tsize = transfer->length - LIBUSB_CONTROL_SETUP_SIZE;\n\n\t// Windows places upper limits on the control transfer size\n\t// See: https://msdn.microsoft.com/en-us/library/windows/hardware/ff538112.aspx\n\tif (size > MAX_CTRL_BUFFER_LENGTH)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tcurrent_interface = get_valid_interface(transfer->dev_handle, USB_API_WINUSBX);\n\tif (current_interface < 0) {\n\t\tif (auto_claim(transfer, &current_interface, USB_API_WINUSBX) != LIBUSB_SUCCESS)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_dbg(\"will use interface %d\", current_interface);\n\twinusb_handle = handle_priv->interface_handle[current_interface].api_handle;\n\n\twfd = usbi_create_fd(winusb_handle, RW_READ, NULL, NULL);\n\t// Always use the handle returned from usbi_create_fd (wfd.handle)\n\tif (wfd.fd < 0)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\t// Sending of set configuration control requests from WinUSB creates issues\n\tif (((setup->request_type & (0x03 << 5)) == LIBUSB_REQUEST_TYPE_STANDARD)\n\t\t\t&& (setup->request == LIBUSB_REQUEST_SET_CONFIGURATION)) {\n\t\tif (setup->value != priv->active_config) {\n\t\t\tusbi_warn(ctx, \"cannot set configuration other than the default one\");\n\t\t\tusbi_free_fd(&wfd);\n\t\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t\t}\n\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\twfd.overlapped->InternalHigh = 0;\n\t} else {\n\t\tif (!WinUSBX[sub_api].ControlTransfer(wfd.handle, *setup, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, size, NULL, wfd.overlapped)) {\n\t\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\t\tusbi_warn(ctx, \"ControlTransfer failed: %s\", windows_error_str(0));\n\t\t\t\tusbi_free_fd(&wfd);\n\t\t\t\treturn LIBUSB_ERROR_IO;\n\t\t\t}\n\t\t} else {\n\t\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\t\twfd.overlapped->InternalHigh = (DWORD)size;\n\t\t}\n\t}\n\n\t// Use priv_transfer to store data needed for async polling\n\ttransfer_priv->pollable_fd = wfd;\n\ttransfer_priv->interface_number = (uint8_t)current_interface;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tHANDLE winusb_handle;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\tif (altsetting > 255)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\twinusb_handle = handle_priv->interface_handle[iface].api_handle;\n\tif (!HANDLE_VALID(winusb_handle)) {\n\t\tusbi_err(ctx, \"interface must be claimed first\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tif (!WinUSBX[sub_api].SetCurrentAlternateSetting(winusb_handle, (UCHAR)altsetting)) {\n\t\tusbi_err(ctx, \"SetCurrentAlternateSetting failed: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_IO;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tHANDLE winusb_handle;\n\tbool ret;\n\tint current_interface;\n\tstruct winfd wfd;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\n\tcurrent_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint);\n\tif (current_interface < 0) {\n\t\tusbi_err(ctx, \"unable to match endpoint to an open interface - cancelling transfer\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_dbg(\"matched endpoint %02X with interface %d\", transfer->endpoint, current_interface);\n\n\twinusb_handle = handle_priv->interface_handle[current_interface].api_handle;\n\n\twfd = usbi_create_fd(winusb_handle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL);\n\t// Always use the handle returned from usbi_create_fd (wfd.handle)\n\tif (wfd.fd < 0)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tif (IS_XFERIN(transfer)) {\n\t\tusbi_dbg(\"reading %d bytes\", transfer->length);\n\t\tret = WinUSBX[sub_api].ReadPipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped);\n\t} else {\n\t\tusbi_dbg(\"writing %d bytes\", transfer->length);\n\t\tret = WinUSBX[sub_api].WritePipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped);\n\t}\n\n\tif (!ret) {\n\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\tusbi_err(ctx, \"ReadPipe/WritePipe failed: %s\", windows_error_str(0));\n\t\t\tusbi_free_fd(&wfd);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t} else {\n\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\twfd.overlapped->InternalHigh = (DWORD)transfer->length;\n\t}\n\n\ttransfer_priv->pollable_fd = wfd;\n\ttransfer_priv->interface_number = (uint8_t)current_interface;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tHANDLE winusb_handle;\n\tint current_interface;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\tcurrent_interface = interface_by_endpoint(priv, handle_priv, endpoint);\n\tif (current_interface < 0) {\n\t\tusbi_err(ctx, \"unable to match endpoint to an open interface - cannot clear\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_dbg(\"matched endpoint %02X with interface %d\", endpoint, current_interface);\n\twinusb_handle = handle_priv->interface_handle[current_interface].api_handle;\n\n\tif (!WinUSBX[sub_api].ResetPipe(winusb_handle, endpoint)) {\n\t\tusbi_err(ctx, \"ResetPipe failed: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/*\n * from http://www.winvistatips.com/winusb-bugchecks-t335323.html (confirmed\n * through testing as well):\n * \"You can not call WinUsb_AbortPipe on control pipe. You can possibly cancel\n * the control transfer using CancelIo\"\n */\nstatic int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer)\n{\n\t// Cancelling of the I/O is done in the parent\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tHANDLE winusb_handle;\n\tint current_interface;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\tcurrent_interface = transfer_priv->interface_number;\n\tif ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) {\n\t\tusbi_err(ctx, \"program assertion failed: invalid interface_number\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\tusbi_dbg(\"will use interface %d\", current_interface);\n\n\twinusb_handle = handle_priv->interface_handle[current_interface].api_handle;\n\n\tif (!WinUSBX[sub_api].AbortPipe(winusb_handle, transfer->endpoint)) {\n\t\tusbi_err(ctx, \"AbortPipe failed: %s\", windows_error_str(0));\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/*\n * from the \"How to Use WinUSB to Communicate with a USB Device\" Microsoft white paper\n * (http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx):\n * \"WinUSB does not support host-initiated reset port and cycle port operations\" and\n * IOCTL_INTERNAL_USB_CYCLE_PORT is only available in kernel mode and the\n * IOCTL_USB_HUB_CYCLE_PORT ioctl was removed from Vista => the best we can do is\n * cycle the pipes (and even then, the control pipe can not be reset using WinUSB)\n */\n// TODO: (post hotplug): see if we can force eject the device and redetect it (reuse hotplug?)\nstatic int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tstruct winfd wfd;\n\tHANDLE winusb_handle;\n\tint i, j;\n\n\tCHECK_WINUSBX_AVAILABLE(sub_api);\n\n\t// Reset any available pipe (except control)\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\twinusb_handle = handle_priv->interface_handle[i].api_handle;\n\t\tfor (wfd = handle_to_winfd(winusb_handle); wfd.fd > 0; ) {\n\t\t\t// Cancel any pollable I/O\n\t\t\tusbi_remove_pollfd(ctx, wfd.fd);\n\t\t\tusbi_free_fd(&wfd);\n\t\t\twfd = handle_to_winfd(winusb_handle);\n\t\t}\n\n\t\tif (HANDLE_VALID(winusb_handle)) {\n\t\t\tfor (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) {\n\t\t\t\tusbi_dbg(\"resetting ep %02X\", priv->usb_interface[i].endpoint[j]);\n\t\t\t\tif (!WinUSBX[sub_api].AbortPipe(winusb_handle, priv->usb_interface[i].endpoint[j]))\n\t\t\t\t\tusbi_err(ctx, \"AbortPipe (pipe address %02X) failed: %s\",\n\t\t\t\t\t\tpriv->usb_interface[i].endpoint[j], windows_error_str(0));\n\n\t\t\t\t// FlushPipe seems to fail on OUT pipes\n\t\t\t\tif (IS_EPIN(priv->usb_interface[i].endpoint[j])\n\t\t\t\t\t\t&& (!WinUSBX[sub_api].FlushPipe(winusb_handle, priv->usb_interface[i].endpoint[j])))\n\t\t\t\t\tusbi_err(ctx, \"FlushPipe (pipe address %02X) failed: %s\",\n\t\t\t\t\t\tpriv->usb_interface[i].endpoint[j], windows_error_str(0));\n\n\t\t\t\tif (!WinUSBX[sub_api].ResetPipe(winusb_handle, priv->usb_interface[i].endpoint[j]))\n\t\t\t\t\tusbi_err(ctx, \"ResetPipe (pipe address %02X) failed: %s\",\n\t\t\t\t\t\tpriv->usb_interface[i].endpoint[j], windows_error_str(0));\n\t\t\t}\n\t\t}\n\t}\n\n\t// libusbK & libusb0 have the ability to issue an actual device reset\n\tif (WinUSBX[sub_api].ResetDevice != NULL) {\n\t\twinusb_handle = handle_priv->interface_handle[0].api_handle;\n\t\tif (HANDLE_VALID(winusb_handle))\n\t\t\tWinUSBX[sub_api].ResetDevice(winusb_handle);\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size)\n{\n\titransfer->transferred += io_size;\n\treturn LIBUSB_TRANSFER_COMPLETED;\n}\n\n/*\n * Internal HID Support functions (from libusb-win32)\n * Note that functions that complete data transfer synchronously must return\n * LIBUSB_COMPLETED instead of LIBUSB_SUCCESS\n */\nstatic int _hid_get_hid_descriptor(struct hid_device_priv *dev, void *data, size_t *size);\nstatic int _hid_get_report_descriptor(struct hid_device_priv *dev, void *data, size_t *size);\n\nstatic int _hid_wcslen(WCHAR *str)\n{\n\tint i = 0;\n\n\twhile (str[i] && (str[i] != 0x409))\n\t\ti++;\n\n\treturn i;\n}\n\nstatic int _hid_get_device_descriptor(struct hid_device_priv *dev, void *data, size_t *size)\n{\n\tstruct libusb_device_descriptor d;\n\n\td.bLength = LIBUSB_DT_DEVICE_SIZE;\n\td.bDescriptorType = LIBUSB_DT_DEVICE;\n\td.bcdUSB = 0x0200; /* 2.00 */\n\td.bDeviceClass = 0;\n\td.bDeviceSubClass = 0;\n\td.bDeviceProtocol = 0;\n\td.bMaxPacketSize0 = 64; /* fix this! */\n\td.idVendor = (uint16_t)dev->vid;\n\td.idProduct = (uint16_t)dev->pid;\n\td.bcdDevice = 0x0100;\n\td.iManufacturer = dev->string_index[0];\n\td.iProduct = dev->string_index[1];\n\td.iSerialNumber = dev->string_index[2];\n\td.bNumConfigurations = 1;\n\n\tif (*size > LIBUSB_DT_DEVICE_SIZE)\n\t\t*size = LIBUSB_DT_DEVICE_SIZE;\n\tmemcpy(data, &d, *size);\n\n\treturn LIBUSB_COMPLETED;\n}\n\nstatic int _hid_get_config_descriptor(struct hid_device_priv *dev, void *data, size_t *size)\n{\n\tchar num_endpoints = 0;\n\tsize_t config_total_len = 0;\n\tchar tmp[HID_MAX_CONFIG_DESC_SIZE];\n\tstruct libusb_config_descriptor *cd;\n\tstruct libusb_interface_descriptor *id;\n\tstruct libusb_hid_descriptor *hd;\n\tstruct libusb_endpoint_descriptor *ed;\n\tsize_t tmp_size;\n\n\tif (dev->input_report_size)\n\t\tnum_endpoints++;\n\tif (dev->output_report_size)\n\t\tnum_endpoints++;\n\n\tconfig_total_len = LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE\n\t\t+ LIBUSB_DT_HID_SIZE + num_endpoints * LIBUSB_DT_ENDPOINT_SIZE;\n\n\tcd = (struct libusb_config_descriptor *)tmp;\n\tid = (struct libusb_interface_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE);\n\thd = (struct libusb_hid_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE\n\t\t+ LIBUSB_DT_INTERFACE_SIZE);\n\ted = (struct libusb_endpoint_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE\n\t\t+ LIBUSB_DT_INTERFACE_SIZE\n\t\t+ LIBUSB_DT_HID_SIZE);\n\n\tcd->bLength = LIBUSB_DT_CONFIG_SIZE;\n\tcd->bDescriptorType = LIBUSB_DT_CONFIG;\n\tcd->wTotalLength = (uint16_t)config_total_len;\n\tcd->bNumInterfaces = 1;\n\tcd->bConfigurationValue = 1;\n\tcd->iConfiguration = 0;\n\tcd->bmAttributes = 1 << 7; /* bus powered */\n\tcd->MaxPower = 50;\n\n\tid->bLength = LIBUSB_DT_INTERFACE_SIZE;\n\tid->bDescriptorType = LIBUSB_DT_INTERFACE;\n\tid->bInterfaceNumber = 0;\n\tid->bAlternateSetting = 0;\n\tid->bNumEndpoints = num_endpoints;\n\tid->bInterfaceClass = 3;\n\tid->bInterfaceSubClass = 0;\n\tid->bInterfaceProtocol = 0;\n\tid->iInterface = 0;\n\n\ttmp_size = LIBUSB_DT_HID_SIZE;\n\t_hid_get_hid_descriptor(dev, hd, &tmp_size);\n\n\tif (dev->input_report_size) {\n\t\ted->bLength = LIBUSB_DT_ENDPOINT_SIZE;\n\t\ted->bDescriptorType = LIBUSB_DT_ENDPOINT;\n\t\ted->bEndpointAddress = HID_IN_EP;\n\t\ted->bmAttributes = 3;\n\t\ted->wMaxPacketSize = dev->input_report_size - 1;\n\t\ted->bInterval = 10;\n\t\ted = (struct libusb_endpoint_descriptor *)((char *)ed + LIBUSB_DT_ENDPOINT_SIZE);\n\t}\n\n\tif (dev->output_report_size) {\n\t\ted->bLength = LIBUSB_DT_ENDPOINT_SIZE;\n\t\ted->bDescriptorType = LIBUSB_DT_ENDPOINT;\n\t\ted->bEndpointAddress = HID_OUT_EP;\n\t\ted->bmAttributes = 3;\n\t\ted->wMaxPacketSize = dev->output_report_size - 1;\n\t\ted->bInterval = 10;\n\t}\n\n\tif (*size > config_total_len)\n\t\t*size = config_total_len;\n\tmemcpy(data, tmp, *size);\n\n\treturn LIBUSB_COMPLETED;\n}\n\nstatic int _hid_get_string_descriptor(struct hid_device_priv *dev, int _index,\n\tvoid *data, size_t *size)\n{\n\tvoid *tmp = NULL;\n\tsize_t tmp_size = 0;\n\tint i;\n\n\t/* language ID, EN-US */\n\tchar string_langid[] = {0x09, 0x04};\n\n\tif ((*size < 2) || (*size > 255))\n\t\treturn LIBUSB_ERROR_OVERFLOW;\n\n\tif (_index == 0) {\n\t\ttmp = string_langid;\n\t\ttmp_size = sizeof(string_langid) + 2;\n\t} else {\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tif (_index == (dev->string_index[i])) {\n\t\t\t\ttmp = dev->string[i];\n\t\t\t\ttmp_size = (_hid_wcslen(dev->string[i]) + 1) * sizeof(WCHAR);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (i == 3) // not found\n\t\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\tif (!tmp_size)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tif (tmp_size < *size)\n\t\t*size = tmp_size;\n\n\t// 2 byte header\n\t((uint8_t *)data)[0] = (uint8_t)*size;\n\t((uint8_t *)data)[1] = LIBUSB_DT_STRING;\n\tmemcpy((uint8_t *)data + 2, tmp, *size - 2);\n\n\treturn LIBUSB_COMPLETED;\n}\n\nstatic int _hid_get_hid_descriptor(struct hid_device_priv *dev, void *data, size_t *size)\n{\n\tstruct libusb_hid_descriptor d;\n\tuint8_t tmp[MAX_HID_DESCRIPTOR_SIZE];\n\tsize_t report_len = MAX_HID_DESCRIPTOR_SIZE;\n\n\t_hid_get_report_descriptor(dev, tmp, &report_len);\n\n\td.bLength = LIBUSB_DT_HID_SIZE;\n\td.bDescriptorType = LIBUSB_DT_HID;\n\td.bcdHID = 0x0110; /* 1.10 */\n\td.bCountryCode = 0;\n\td.bNumDescriptors = 1;\n\td.bClassDescriptorType = LIBUSB_DT_REPORT;\n\td.wClassDescriptorLength = (uint16_t)report_len;\n\n\tif (*size > LIBUSB_DT_HID_SIZE)\n\t\t*size = LIBUSB_DT_HID_SIZE;\n\tmemcpy(data, &d, *size);\n\n\treturn LIBUSB_COMPLETED;\n}\n\nstatic int _hid_get_report_descriptor(struct hid_device_priv *dev, void *data, size_t *size)\n{\n\tuint8_t d[MAX_HID_DESCRIPTOR_SIZE];\n\tsize_t i = 0;\n\n\t/* usage page (0xFFA0 == vendor defined) */\n\td[i++] = 0x06; d[i++] = 0xA0; d[i++] = 0xFF;\n\t/* usage (vendor defined) */\n\td[i++] = 0x09; d[i++] = 0x01;\n\t/* start collection (application) */\n\td[i++] = 0xA1; d[i++] = 0x01;\n\t/* input report */\n\tif (dev->input_report_size) {\n\t\t/* usage (vendor defined) */\n\t\td[i++] = 0x09; d[i++] = 0x01;\n\t\t/* logical minimum (0) */\n\t\td[i++] = 0x15; d[i++] = 0x00;\n\t\t/* logical maximum (255) */\n\t\td[i++] = 0x25; d[i++] = 0xFF;\n\t\t/* report size (8 bits) */\n\t\td[i++] = 0x75; d[i++] = 0x08;\n\t\t/* report count */\n\t\td[i++] = 0x95; d[i++] = (uint8_t)dev->input_report_size - 1;\n\t\t/* input (data, variable, absolute) */\n\t\td[i++] = 0x81; d[i++] = 0x00;\n\t}\n\t/* output report */\n\tif (dev->output_report_size) {\n\t\t/* usage (vendor defined) */\n\t\td[i++] = 0x09; d[i++] = 0x02;\n\t\t/* logical minimum (0) */\n\t\td[i++] = 0x15; d[i++] = 0x00;\n\t\t/* logical maximum (255) */\n\t\td[i++] = 0x25; d[i++] = 0xFF;\n\t\t/* report size (8 bits) */\n\t\td[i++] = 0x75; d[i++] = 0x08;\n\t\t/* report count */\n\t\td[i++] = 0x95; d[i++] = (uint8_t)dev->output_report_size - 1;\n\t\t/* output (data, variable, absolute) */\n\t\td[i++] = 0x91; d[i++] = 0x00;\n\t}\n\t/* feature report */\n\tif (dev->feature_report_size) {\n\t\t/* usage (vendor defined) */\n\t\td[i++] = 0x09; d[i++] = 0x03;\n\t\t/* logical minimum (0) */\n\t\td[i++] = 0x15; d[i++] = 0x00;\n\t\t/* logical maximum (255) */\n\t\td[i++] = 0x25; d[i++] = 0xFF;\n\t\t/* report size (8 bits) */\n\t\td[i++] = 0x75; d[i++] = 0x08;\n\t\t/* report count */\n\t\td[i++] = 0x95; d[i++] = (uint8_t)dev->feature_report_size - 1;\n\t\t/* feature (data, variable, absolute) */\n\t\td[i++] = 0xb2; d[i++] = 0x02; d[i++] = 0x01;\n\t}\n\n\t/* end collection */\n\td[i++] = 0xC0;\n\n\tif (*size > i)\n\t\t*size = i;\n\tmemcpy(data, d, *size);\n\n\treturn LIBUSB_COMPLETED;\n}\n\nstatic int _hid_get_descriptor(struct hid_device_priv *dev, HANDLE hid_handle, int recipient,\n\tint type, int _index, void *data, size_t *size)\n{\n\tswitch(type) {\n\tcase LIBUSB_DT_DEVICE:\n\t\tusbi_dbg(\"LIBUSB_DT_DEVICE\");\n\t\treturn _hid_get_device_descriptor(dev, data, size);\n\tcase LIBUSB_DT_CONFIG:\n\t\tusbi_dbg(\"LIBUSB_DT_CONFIG\");\n\t\tif (!_index)\n\t\t\treturn _hid_get_config_descriptor(dev, data, size);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\tcase LIBUSB_DT_STRING:\n\t\tusbi_dbg(\"LIBUSB_DT_STRING\");\n\t\treturn _hid_get_string_descriptor(dev, _index, data, size);\n\tcase LIBUSB_DT_HID:\n\t\tusbi_dbg(\"LIBUSB_DT_HID\");\n\t\tif (!_index)\n\t\t\treturn _hid_get_hid_descriptor(dev, data, size);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\tcase LIBUSB_DT_REPORT:\n\t\tusbi_dbg(\"LIBUSB_DT_REPORT\");\n\t\tif (!_index)\n\t\t\treturn _hid_get_report_descriptor(dev, data, size);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\tcase LIBUSB_DT_PHYSICAL:\n\t\tusbi_dbg(\"LIBUSB_DT_PHYSICAL\");\n\t\tif (HidD_GetPhysicalDescriptor(hid_handle, data, (ULONG)*size))\n\t\t\treturn LIBUSB_COMPLETED;\n\t\treturn LIBUSB_ERROR_OTHER;\n\t}\n\n\tusbi_dbg(\"unsupported\");\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n}\n\nstatic int _hid_get_report(struct hid_device_priv *dev, HANDLE hid_handle, int id, void *data,\n\tstruct windows_transfer_priv *tp, size_t *size, OVERLAPPED *overlapped, int report_type)\n{\n\tuint8_t *buf;\n\tDWORD ioctl_code, read_size, expected_size = (DWORD)*size;\n\tint r = LIBUSB_SUCCESS;\n\n\tif (tp->hid_buffer != NULL)\n\t\tusbi_dbg(\"program assertion failed: hid_buffer is not NULL\");\n\n\tif ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) {\n\t\tusbi_dbg(\"invalid size (%u)\", *size);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\tswitch (report_type) {\n\tcase HID_REPORT_TYPE_INPUT:\n\t\tioctl_code = IOCTL_HID_GET_INPUT_REPORT;\n\t\tbreak;\n\tcase HID_REPORT_TYPE_FEATURE:\n\t\tioctl_code = IOCTL_HID_GET_FEATURE;\n\t\tbreak;\n\tdefault:\n\t\tusbi_dbg(\"unknown HID report type %d\", report_type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\t// Add a trailing byte to detect overflows\n\tbuf = calloc(1, expected_size + 1);\n\tif (buf == NULL)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tbuf[0] = (uint8_t)id; // Must be set always\n\tusbi_dbg(\"report ID: 0x%02X\", buf[0]);\n\n\ttp->hid_expected_size = expected_size;\n\tread_size = expected_size;\n\n\t// NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0)\n\tif (!DeviceIoControl(hid_handle, ioctl_code, buf, expected_size + 1,\n\t\tbuf, expected_size + 1, &read_size, overlapped)) {\n\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\tusbi_dbg(\"Failed to Read HID Report: %s\", windows_error_str(0));\n\t\t\tfree(buf);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t\t// Asynchronous wait\n\t\ttp->hid_buffer = buf;\n\t\ttp->hid_dest = data; // copy dest, as not necessarily the start of the transfer buffer\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\t// Transfer completed synchronously => copy and discard extra buffer\n\tif (read_size == 0) {\n\t\tusbi_warn(NULL, \"program assertion failed - read completed synchronously, but no data was read\");\n\t\t*size = 0;\n\t} else {\n\t\tif (buf[0] != id)\n\t\t\tusbi_warn(NULL, \"mismatched report ID (data is %02X, parameter is %02X)\", buf[0], id);\n\n\t\tif ((size_t)read_size > expected_size) {\n\t\t\tr = LIBUSB_ERROR_OVERFLOW;\n\t\t\tusbi_dbg(\"OVERFLOW!\");\n\t\t} else {\n\t\t\tr = LIBUSB_COMPLETED;\n\t\t}\n\n\t\t*size = MIN((size_t)read_size, *size);\n\t\tif (id == 0)\n\t\t\tmemcpy(data, buf + 1, *size); // Discard report ID\n\t\telse\n\t\t\tmemcpy(data, buf, *size);\n\t}\n\n\tfree(buf);\n\treturn r;\n}\n\nstatic int _hid_set_report(struct hid_device_priv *dev, HANDLE hid_handle, int id, void *data,\n\tstruct windows_transfer_priv *tp, size_t *size, OVERLAPPED *overlapped, int report_type)\n{\n\tuint8_t *buf = NULL;\n\tDWORD ioctl_code, write_size = (DWORD)*size;\n\n\tif (tp->hid_buffer != NULL)\n\t\tusbi_dbg(\"program assertion failed: hid_buffer is not NULL\");\n\n\tif ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) {\n\t\tusbi_dbg(\"invalid size (%u)\", *size);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\tswitch (report_type) {\n\tcase HID_REPORT_TYPE_OUTPUT:\n\t\tioctl_code = IOCTL_HID_SET_OUTPUT_REPORT;\n\t\tbreak;\n\tcase HID_REPORT_TYPE_FEATURE:\n\t\tioctl_code = IOCTL_HID_SET_FEATURE;\n\t\tbreak;\n\tdefault:\n\t\tusbi_dbg(\"unknown HID report type %d\", report_type);\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\t}\n\n\tusbi_dbg(\"report ID: 0x%02X\", id);\n\t// When report IDs are not used (i.e. when id == 0), we must add\n\t// a null report ID. Otherwise, we just use original data buffer\n\tif (id == 0)\n\t\twrite_size++;\n\n\tbuf = malloc(write_size);\n\tif (buf == NULL)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tif (id == 0) {\n\t\tbuf[0] = 0;\n\t\tmemcpy(buf + 1, data, *size);\n\t} else {\n\t\t// This seems like a waste, but if we don't duplicate the\n\t\t// data, we'll get issues when freeing hid_buffer\n\t\tmemcpy(buf, data, *size);\n\t\tif (buf[0] != id)\n\t\t\tusbi_warn(NULL, \"mismatched report ID (data is %02X, parameter is %02X)\", buf[0], id);\n\t}\n\n\t// NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0)\n\tif (!DeviceIoControl(hid_handle, ioctl_code, buf, write_size,\n\t\tbuf, write_size, &write_size, overlapped)) {\n\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\tusbi_dbg(\"Failed to Write HID Output Report: %s\", windows_error_str(0));\n\t\t\tfree(buf);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t\ttp->hid_buffer = buf;\n\t\ttp->hid_dest = NULL;\n\t\treturn LIBUSB_SUCCESS;\n\t}\n\n\t// Transfer completed synchronously\n\t*size = write_size;\n\tif (write_size == 0)\n\t\tusbi_dbg(\"program assertion failed - write completed synchronously, but no data was written\");\n\n\tfree(buf);\n\treturn LIBUSB_COMPLETED;\n}\n\nstatic int _hid_class_request(struct hid_device_priv *dev, HANDLE hid_handle, int request_type,\n\tint request, int value, int _index, void *data, struct windows_transfer_priv *tp,\n\tsize_t *size, OVERLAPPED *overlapped)\n{\n\tint report_type = (value >> 8) & 0xFF;\n\tint report_id = value & 0xFF;\n\n\tif ((LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_INTERFACE)\n\t\t\t&& (LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_DEVICE))\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tif (LIBUSB_REQ_OUT(request_type) && request == HID_REQ_SET_REPORT)\n\t\treturn _hid_set_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type);\n\n\tif (LIBUSB_REQ_IN(request_type) && request == HID_REQ_GET_REPORT)\n\t\treturn _hid_get_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type);\n\n\treturn LIBUSB_ERROR_INVALID_PARAM;\n}\n\n\n/*\n * HID API functions\n */\nstatic int hid_init(int sub_api, struct libusb_context *ctx)\n{\n\tDLL_GET_HANDLE(hid);\n\tDLL_LOAD_FUNC(hid, HidD_GetAttributes, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetHidGuid, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetPreparsedData, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_FreePreparsedData, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetManufacturerString, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetProductString, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetSerialNumberString, TRUE);\n\tDLL_LOAD_FUNC(hid, HidP_GetCaps, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_SetNumInputBuffers, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_SetFeature, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetFeature, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetPhysicalDescriptor, TRUE);\n\tDLL_LOAD_FUNC(hid, HidD_GetInputReport, FALSE);\n\tDLL_LOAD_FUNC(hid, HidD_SetOutputReport, FALSE);\n\tDLL_LOAD_FUNC(hid, HidD_FlushQueue, TRUE);\n\tDLL_LOAD_FUNC(hid, HidP_GetValueCaps, TRUE);\n\n\tapi_hid_available = true;\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int hid_exit(int sub_api)\n{\n\tDLL_FREE_HANDLE(hid);\n\n\treturn LIBUSB_SUCCESS;\n}\n\n// NB: open and close must ensure that they only handle interface of\n// the right API type, as these functions can be called wholesale from\n// composite_open(), with interfaces belonging to different APIs\nstatic int hid_open(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tHIDD_ATTRIBUTES hid_attributes;\n\tPHIDP_PREPARSED_DATA preparsed_data = NULL;\n\tHIDP_CAPS capabilities;\n\tHIDP_VALUE_CAPS *value_caps;\n\tHANDLE hid_handle = INVALID_HANDLE_VALUE;\n\tint i, j;\n\t// report IDs handling\n\tULONG size[3];\n\tint nb_ids[2]; // zero and nonzero report IDs\n#if defined(ENABLE_LOGGING)\n\tconst char *type[3] = {\"input\", \"output\", \"feature\"};\n#endif\n\n\tCHECK_HID_AVAILABLE;\n\n\tif (priv->hid == NULL) {\n\t\tusbi_err(ctx, \"program assertion failed - private HID structure is unitialized\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif ((priv->usb_interface[i].path != NULL)\n\t\t\t\t&& (priv->usb_interface[i].apib->id == USB_API_HID)) {\n\t\t\thid_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ,\n\t\t\t\tNULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);\n\t\t\t/*\n\t\t\t * http://www.lvr.com/hidfaq.htm: Why do I receive \"Access denied\" when attempting to access my HID?\n\t\t\t * \"Windows 2000 and later have exclusive read/write access to HIDs that are configured as a system\n\t\t\t * keyboards or mice. An application can obtain a handle to a system keyboard or mouse by not\n\t\t\t * requesting READ or WRITE access with CreateFile. Applications can then use HidD_SetFeature and\n\t\t\t * HidD_GetFeature (if the device supports Feature reports).\"\n\t\t\t */\n\t\t\tif (hid_handle == INVALID_HANDLE_VALUE) {\n\t\t\t\tusbi_warn(ctx, \"could not open HID device in R/W mode (keyboard or mouse?) - trying without\");\n\t\t\t\thid_handle = CreateFileA(priv->usb_interface[i].path, 0, FILE_SHARE_WRITE | FILE_SHARE_READ,\n\t\t\t\t\tNULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);\n\t\t\t\tif (hid_handle == INVALID_HANDLE_VALUE) {\n\t\t\t\t\tusbi_err(ctx, \"could not open device %s (interface %d): %s\", priv->path, i, windows_error_str(0));\n\t\t\t\t\tswitch(GetLastError()) {\n\t\t\t\t\tcase ERROR_FILE_NOT_FOUND: // The device was disconnected\n\t\t\t\t\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t\t\t\t\tcase ERROR_ACCESS_DENIED:\n\t\t\t\t\t\treturn LIBUSB_ERROR_ACCESS;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn LIBUSB_ERROR_IO;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tpriv->usb_interface[i].restricted_functionality = true;\n\t\t\t}\n\t\t\thandle_priv->interface_handle[i].api_handle = hid_handle;\n\t\t}\n\t}\n\n\thid_attributes.Size = sizeof(hid_attributes);\n\tdo {\n\t\tif (!HidD_GetAttributes(hid_handle, &hid_attributes)) {\n\t\t\tusbi_err(ctx, \"could not gain access to HID top collection (HidD_GetAttributes)\");\n\t\t\tbreak;\n\t\t}\n\n\t\tpriv->hid->vid = hid_attributes.VendorID;\n\t\tpriv->hid->pid = hid_attributes.ProductID;\n\n\t\t// Set the maximum available input buffer size\n\t\tfor (i = 32; HidD_SetNumInputBuffers(hid_handle, i); i *= 2);\n\t\tusbi_dbg(\"set maximum input buffer size to %d\", i / 2);\n\n\t\t// Get the maximum input and output report size\n\t\tif (!HidD_GetPreparsedData(hid_handle, &preparsed_data) || !preparsed_data) {\n\t\t\tusbi_err(ctx, \"could not read HID preparsed data (HidD_GetPreparsedData)\");\n\t\t\tbreak;\n\t\t}\n\t\tif (HidP_GetCaps(preparsed_data, &capabilities) != HIDP_STATUS_SUCCESS) {\n\t\t\tusbi_err(ctx, \"could not parse HID capabilities (HidP_GetCaps)\");\n\t\t\tbreak;\n\t\t}\n\n\t\t// Find out if interrupt will need report IDs\n\t\tsize[0] = capabilities.NumberInputValueCaps;\n\t\tsize[1] = capabilities.NumberOutputValueCaps;\n\t\tsize[2] = capabilities.NumberFeatureValueCaps;\n\t\tfor (j = HidP_Input; j <= HidP_Feature; j++) {\n\t\t\tusbi_dbg(\"%u HID %s report value(s) found\", (unsigned int)size[j], type[j]);\n\t\t\tpriv->hid->uses_report_ids[j] = false;\n\t\t\tif (size[j] > 0) {\n\t\t\t\tvalue_caps = calloc(size[j], sizeof(HIDP_VALUE_CAPS));\n\t\t\t\tif ((value_caps != NULL)\n\t\t\t\t\t\t&& (HidP_GetValueCaps((HIDP_REPORT_TYPE)j, value_caps, &size[j], preparsed_data) == HIDP_STATUS_SUCCESS)\n\t\t\t\t\t\t&& (size[j] >= 1)) {\n\t\t\t\t\tnb_ids[0] = 0;\n\t\t\t\t\tnb_ids[1] = 0;\n\t\t\t\t\tfor (i = 0; i < (int)size[j]; i++) {\n\t\t\t\t\t\tusbi_dbg(\"  Report ID: 0x%02X\", value_caps[i].ReportID);\n\t\t\t\t\t\tif (value_caps[i].ReportID != 0)\n\t\t\t\t\t\t\tnb_ids[1]++;\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tnb_ids[0]++;\n\t\t\t\t\t}\n\t\t\t\t\tif (nb_ids[1] != 0) {\n\t\t\t\t\t\tif (nb_ids[0] != 0)\n\t\t\t\t\t\t\tusbi_warn(ctx, \"program assertion failed: zero and nonzero report IDs used for %s\",\n\t\t\t\t\t\t\t\ttype[j]);\n\t\t\t\t\t\tpriv->hid->uses_report_ids[j] = true;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tusbi_warn(ctx, \"  could not process %s report IDs\", type[j]);\n\t\t\t\t}\n\t\t\t\tfree(value_caps);\n\t\t\t}\n\t\t}\n\n\t\t// Set the report sizes\n\t\tpriv->hid->input_report_size = capabilities.InputReportByteLength;\n\t\tpriv->hid->output_report_size = capabilities.OutputReportByteLength;\n\t\tpriv->hid->feature_report_size = capabilities.FeatureReportByteLength;\n\n\t\t// Fetch string descriptors\n\t\tpriv->hid->string_index[0] = priv->dev_descriptor.iManufacturer;\n\t\tif (priv->hid->string_index[0] != 0)\n\t\t\tHidD_GetManufacturerString(hid_handle, priv->hid->string[0], sizeof(priv->hid->string[0]));\n\t\telse\n\t\t\tpriv->hid->string[0][0] = 0;\n\n\t\tpriv->hid->string_index[1] = priv->dev_descriptor.iProduct;\n\t\tif (priv->hid->string_index[1] != 0)\n\t\t\tHidD_GetProductString(hid_handle, priv->hid->string[1], sizeof(priv->hid->string[1]));\n\t\telse\n\t\t\tpriv->hid->string[1][0] = 0;\n\n\t\tpriv->hid->string_index[2] = priv->dev_descriptor.iSerialNumber;\n\t\tif (priv->hid->string_index[2] != 0)\n\t\t\tHidD_GetSerialNumberString(hid_handle, priv->hid->string[2], sizeof(priv->hid->string[2]));\n\t\telse\n\t\t\tpriv->hid->string[2][0] = 0;\n\t} while(0);\n\n\tif (preparsed_data)\n\t\tHidD_FreePreparsedData(preparsed_data);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic void hid_close(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tHANDLE file_handle;\n\tint i;\n\n\tif (!api_hid_available)\n\t\treturn;\n\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif (priv->usb_interface[i].apib->id == USB_API_HID) {\n\t\t\tfile_handle = handle_priv->interface_handle[i].api_handle;\n\t\t\tif (HANDLE_VALID(file_handle))\n\t\t\t\tCloseHandle(file_handle);\n\t\t}\n\t}\n}\n\nstatic int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\tCHECK_HID_AVAILABLE;\n\n\t// NB: Disconnection detection is not possible in this function\n\tif (priv->usb_interface[iface].path == NULL)\n\t\treturn LIBUSB_ERROR_NOT_FOUND; // invalid iface\n\n\t// We use dev_handle as a flag for interface claimed\n\tif (handle_priv->interface_handle[iface].dev_handle == INTERFACE_CLAIMED)\n\t\treturn LIBUSB_ERROR_BUSY; // already claimed\n\n\n\thandle_priv->interface_handle[iface].dev_handle = INTERFACE_CLAIMED;\n\n\tusbi_dbg(\"claimed interface %d\", iface);\n\thandle_priv->active_interface = iface;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\tCHECK_HID_AVAILABLE;\n\n\tif (priv->usb_interface[iface].path == NULL)\n\t\treturn LIBUSB_ERROR_NOT_FOUND; // invalid iface\n\n\tif (handle_priv->interface_handle[iface].dev_handle != INTERFACE_CLAIMED)\n\t\treturn LIBUSB_ERROR_NOT_FOUND; // invalid iface\n\n\thandle_priv->interface_handle[iface].dev_handle = INVALID_HANDLE_VALUE;\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\n\tCHECK_HID_AVAILABLE;\n\n\tif (altsetting > 255)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tif (altsetting != 0) {\n\t\tusbi_err(ctx, \"set interface altsetting not supported for altsetting >0\");\n\t\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tWINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer;\n\tHANDLE hid_handle;\n\tstruct winfd wfd;\n\tint current_interface, config;\n\tsize_t size;\n\tint r = LIBUSB_ERROR_INVALID_PARAM;\n\n\tCHECK_HID_AVAILABLE;\n\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\tsafe_free(transfer_priv->hid_buffer);\n\ttransfer_priv->hid_dest = NULL;\n\tsize = transfer->length - LIBUSB_CONTROL_SETUP_SIZE;\n\n\tif (size > MAX_CTRL_BUFFER_LENGTH)\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tcurrent_interface = get_valid_interface(transfer->dev_handle, USB_API_HID);\n\tif (current_interface < 0) {\n\t\tif (auto_claim(transfer, &current_interface, USB_API_HID) != LIBUSB_SUCCESS)\n\t\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_dbg(\"will use interface %d\", current_interface);\n\thid_handle = handle_priv->interface_handle[current_interface].api_handle;\n\t// Always use the handle returned from usbi_create_fd (wfd.handle)\n\twfd = usbi_create_fd(hid_handle, RW_READ, NULL, NULL);\n\tif (wfd.fd < 0)\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\n\tswitch(LIBUSB_REQ_TYPE(setup->request_type)) {\n\tcase LIBUSB_REQUEST_TYPE_STANDARD:\n\t\tswitch(setup->request) {\n\t\tcase LIBUSB_REQUEST_GET_DESCRIPTOR:\n\t\t\tr = _hid_get_descriptor(priv->hid, wfd.handle, LIBUSB_REQ_RECIPIENT(setup->request_type),\n\t\t\t\t(setup->value >> 8) & 0xFF, setup->value & 0xFF, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, &size);\n\t\t\tbreak;\n\t\tcase LIBUSB_REQUEST_GET_CONFIGURATION:\n\t\t\tr = windows_get_configuration(transfer->dev_handle, &config);\n\t\t\tif (r == LIBUSB_SUCCESS) {\n\t\t\t\tsize = 1;\n\t\t\t\t((uint8_t *)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = (uint8_t)config;\n\t\t\t\tr = LIBUSB_COMPLETED;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase LIBUSB_REQUEST_SET_CONFIGURATION:\n\t\t\tif (setup->value == priv->active_config) {\n\t\t\t\tr = LIBUSB_COMPLETED;\n\t\t\t} else {\n\t\t\t\tusbi_warn(ctx, \"cannot set configuration other than the default one\");\n\t\t\t\tr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase LIBUSB_REQUEST_GET_INTERFACE:\n\t\t\tsize = 1;\n\t\t\t((uint8_t *)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = 0;\n\t\t\tr = LIBUSB_COMPLETED;\n\t\t\tbreak;\n\t\tcase LIBUSB_REQUEST_SET_INTERFACE:\n\t\t\tr = hid_set_interface_altsetting(0, transfer->dev_handle, setup->index, setup->value);\n\t\t\tif (r == LIBUSB_SUCCESS)\n\t\t\t\tr = LIBUSB_COMPLETED;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tusbi_warn(ctx, \"unsupported HID control request\");\n\t\t\tr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\t\tbreak;\n\t\t}\n\t\tbreak;\n\tcase LIBUSB_REQUEST_TYPE_CLASS:\n\t\tr = _hid_class_request(priv->hid, wfd.handle, setup->request_type, setup->request, setup->value,\n\t\t\tsetup->index, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, transfer_priv,\n\t\t\t&size, wfd.overlapped);\n\t\tbreak;\n\tdefault:\n\t\tusbi_warn(ctx, \"unsupported HID control request\");\n\t\tr = LIBUSB_ERROR_NOT_SUPPORTED;\n\t\tbreak;\n\t}\n\n\tif (r == LIBUSB_COMPLETED) {\n\t\t// Force request to be completed synchronously. Transferred size has been set by previous call\n\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\t// http://msdn.microsoft.com/en-us/library/ms684342%28VS.85%29.aspx\n\t\t// set InternalHigh to the number of bytes transferred\n\t\twfd.overlapped->InternalHigh = (DWORD)size;\n\t\tr = LIBUSB_SUCCESS;\n\t}\n\n\tif (r == LIBUSB_SUCCESS) {\n\t\t// Use priv_transfer to store data needed for async polling\n\t\ttransfer_priv->pollable_fd = wfd;\n\t\ttransfer_priv->interface_number = (uint8_t)current_interface;\n\t} else {\n\t\tusbi_free_fd(&wfd);\n\t}\n\n\treturn r;\n}\n\nstatic int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tstruct winfd wfd;\n\tHANDLE hid_handle;\n\tbool direction_in, ret;\n\tint current_interface, length;\n\tDWORD size;\n\tint r = LIBUSB_SUCCESS;\n\n\tCHECK_HID_AVAILABLE;\n\n\ttransfer_priv->pollable_fd = INVALID_WINFD;\n\ttransfer_priv->hid_dest = NULL;\n\tsafe_free(transfer_priv->hid_buffer);\n\n\tcurrent_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint);\n\tif (current_interface < 0) {\n\t\tusbi_err(ctx, \"unable to match endpoint to an open interface - cancelling transfer\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_dbg(\"matched endpoint %02X with interface %d\", transfer->endpoint, current_interface);\n\n\thid_handle = handle_priv->interface_handle[current_interface].api_handle;\n\tdirection_in = transfer->endpoint & LIBUSB_ENDPOINT_IN;\n\n\twfd = usbi_create_fd(hid_handle, direction_in?RW_READ:RW_WRITE, NULL, NULL);\n\t// Always use the handle returned from usbi_create_fd (wfd.handle)\n\tif (wfd.fd < 0)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\t// If report IDs are not in use, an extra prefix byte must be added\n\tif (((direction_in) && (!priv->hid->uses_report_ids[0]))\n\t\t\t|| ((!direction_in) && (!priv->hid->uses_report_ids[1])))\n\t\tlength = transfer->length + 1;\n\telse\n\t\tlength = transfer->length;\n\n\t// Add a trailing byte to detect overflows on input\n\ttransfer_priv->hid_buffer = calloc(1, length + 1);\n\tif (transfer_priv->hid_buffer == NULL)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\ttransfer_priv->hid_expected_size = length;\n\n\tif (direction_in) {\n\t\ttransfer_priv->hid_dest = transfer->buffer;\n\t\tusbi_dbg(\"reading %d bytes (report ID: 0x00)\", length);\n\t\tret = ReadFile(wfd.handle, transfer_priv->hid_buffer, length + 1, &size, wfd.overlapped);\n\t} else {\n\t\tif (!priv->hid->uses_report_ids[1])\n\t\t\tmemcpy(transfer_priv->hid_buffer + 1, transfer->buffer, transfer->length);\n\t\telse\n\t\t\t// We could actually do without the calloc and memcpy in this case\n\t\t\tmemcpy(transfer_priv->hid_buffer, transfer->buffer, transfer->length);\n\n\t\tusbi_dbg(\"writing %d bytes (report ID: 0x%02X)\", length, transfer_priv->hid_buffer[0]);\n\t\tret = WriteFile(wfd.handle, transfer_priv->hid_buffer, length, &size, wfd.overlapped);\n\t}\n\n\tif (!ret) {\n\t\tif (GetLastError() != ERROR_IO_PENDING) {\n\t\t\tusbi_err(ctx, \"HID transfer failed: %s\", windows_error_str(0));\n\t\t\tusbi_free_fd(&wfd);\n\t\t\tsafe_free(transfer_priv->hid_buffer);\n\t\t\treturn LIBUSB_ERROR_IO;\n\t\t}\n\t} else {\n\t\t// Only write operations that completed synchronously need to free up\n\t\t// hid_buffer. For reads, copy_transfer_data() handles that process.\n\t\tif (!direction_in)\n\t\t\tsafe_free(transfer_priv->hid_buffer);\n\n\t\tif (size == 0) {\n\t\t\tusbi_err(ctx, \"program assertion failed - no data was transferred\");\n\t\t\tsize = 1;\n\t\t}\n\t\tif (size > (size_t)length) {\n\t\t\tusbi_err(ctx, \"OVERFLOW!\");\n\t\t\tr = LIBUSB_ERROR_OVERFLOW;\n\t\t}\n\t\twfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY;\n\t\twfd.overlapped->InternalHigh = size;\n\t}\n\n\ttransfer_priv->pollable_fd = wfd;\n\ttransfer_priv->interface_number = (uint8_t)current_interface;\n\n\treturn r;\n}\n\nstatic int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tHANDLE hid_handle;\n\tint current_interface;\n\n\tCHECK_HID_AVAILABLE;\n\n\tcurrent_interface = transfer_priv->interface_number;\n\thid_handle = handle_priv->interface_handle[current_interface].api_handle;\n\tCancelIo(hid_handle);\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tHANDLE hid_handle;\n\tint current_interface;\n\n\tCHECK_HID_AVAILABLE;\n\n\t// Flushing the queues on all interfaces is the best we can achieve\n\tfor (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) {\n\t\thid_handle = handle_priv->interface_handle[current_interface].api_handle;\n\t\tif (HANDLE_VALID(hid_handle))\n\t\t\tHidD_FlushQueue(hid_handle);\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tHANDLE hid_handle;\n\tint current_interface;\n\n\tCHECK_HID_AVAILABLE;\n\n\tcurrent_interface = interface_by_endpoint(priv, handle_priv, endpoint);\n\tif (current_interface < 0) {\n\t\tusbi_err(ctx, \"unable to match endpoint to an open interface - cannot clear\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_dbg(\"matched endpoint %02X with interface %d\", endpoint, current_interface);\n\thid_handle = handle_priv->interface_handle[current_interface].api_handle;\n\n\t// No endpoint selection with Microsoft's implementation, so we try to flush the\n\t// whole interface. Should be OK for most case scenarios\n\tif (!HidD_FlushQueue(hid_handle)) {\n\t\tusbi_err(ctx, \"Flushing of HID queue failed: %s\", windows_error_str(0));\n\t\t// Device was probably disconnected\n\t\treturn LIBUSB_ERROR_NO_DEVICE;\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\n// This extra function is only needed for HID\nstatic int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tint r = LIBUSB_TRANSFER_COMPLETED;\n\tuint32_t corrected_size = io_size;\n\n\tif (transfer_priv->hid_buffer != NULL) {\n\t\t// If we have a valid hid_buffer, it means the transfer was async\n\t\tif (transfer_priv->hid_dest != NULL) { // Data readout\n\t\t\tif (corrected_size > 0) {\n\t\t\t\t// First, check for overflow\n\t\t\t\tif (corrected_size > transfer_priv->hid_expected_size) {\n\t\t\t\t\tusbi_err(ctx, \"OVERFLOW!\");\n\t\t\t\t\tcorrected_size = (uint32_t)transfer_priv->hid_expected_size;\n\t\t\t\t\tr = LIBUSB_TRANSFER_OVERFLOW;\n\t\t\t\t}\n\n\t\t\t\tif (transfer_priv->hid_buffer[0] == 0) {\n\t\t\t\t\t// Discard the 1 byte report ID prefix\n\t\t\t\t\tcorrected_size--;\n\t\t\t\t\tmemcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer + 1, corrected_size);\n\t\t\t\t} else {\n\t\t\t\t\tmemcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer, corrected_size);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttransfer_priv->hid_dest = NULL;\n\t\t}\n\t\t// For write, we just need to free the hid buffer\n\t\tsafe_free(transfer_priv->hid_buffer);\n\t}\n\n\titransfer->transferred += corrected_size;\n\treturn r;\n}\n\n\n/*\n * Composite API functions\n */\nstatic int composite_init(int sub_api, struct libusb_context *ctx)\n{\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int composite_exit(int sub_api)\n{\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int composite_open(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tint r = LIBUSB_ERROR_NOT_FOUND;\n\tuint8_t i;\n\t// SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID\n\tbool available[SUB_API_MAX + 1] = { 0 };\n\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tswitch (priv->usb_interface[i].apib->id) {\n\t\tcase USB_API_WINUSBX:\n\t\t\tif (priv->usb_interface[i].sub_api != SUB_API_NOTSET)\n\t\t\t\tavailable[priv->usb_interface[i].sub_api] = true;\n\t\t\tbreak;\n\t\tcase USB_API_HID:\n\t\t\tavailable[SUB_API_MAX] = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers\n\t\tif (available[i]) {\n\t\t\tr = usb_api_backend[USB_API_WINUSBX].open(i, dev_handle);\n\t\t\tif (r != LIBUSB_SUCCESS)\n\t\t\t\treturn r;\n\t\t}\n\t}\n\n\tif (available[SUB_API_MAX]) // HID driver\n\t\tr = hid_open(SUB_API_NOTSET, dev_handle);\n\n\treturn r;\n}\n\nstatic void composite_close(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tuint8_t i;\n\t// SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID\n\tbool available[SUB_API_MAX + 1] = { 0 };\n\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tswitch (priv->usb_interface[i].apib->id) {\n\t\tcase USB_API_WINUSBX:\n\t\t\tif (priv->usb_interface[i].sub_api != SUB_API_NOTSET)\n\t\t\t\tavailable[priv->usb_interface[i].sub_api] = true;\n\t\t\tbreak;\n\t\tcase USB_API_HID:\n\t\t\tavailable[SUB_API_MAX] = true;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfor (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers\n\t\tif (available[i])\n\t\t\tusb_api_backend[USB_API_WINUSBX].close(i, dev_handle);\n\t}\n\n\tif (available[SUB_API_MAX]) // HID driver\n\t\thid_close(SUB_API_NOTSET, dev_handle);\n}\n\nstatic int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\treturn priv->usb_interface[iface].apib->\n\t\tclaim_interface(priv->usb_interface[iface].sub_api, dev_handle, iface);\n}\n\nstatic int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\treturn priv->usb_interface[iface].apib->\n\t\tset_interface_altsetting(priv->usb_interface[iface].sub_api, dev_handle, iface, altsetting);\n}\n\nstatic int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\n\treturn priv->usb_interface[iface].apib->\n\t\trelease_interface(priv->usb_interface[iface].sub_api, dev_handle, iface);\n}\n\nstatic int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tstruct libusb_config_descriptor *conf_desc;\n\tWINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer;\n\tint iface, pass, r;\n\n\t// Interface shouldn't matter for control, but it does in practice, with Windows'\n\t// restrictions with regards to accessing HID keyboards and mice. Try to target\n\t// a specific interface first, if possible.\n\tswitch (LIBUSB_REQ_RECIPIENT(setup->request_type)) {\n\tcase LIBUSB_RECIPIENT_INTERFACE:\n\t\tiface = setup->index & 0xFF;\n\t\tbreak;\n\tcase LIBUSB_RECIPIENT_ENDPOINT:\n\t\tr = libusb_get_active_config_descriptor(transfer->dev_handle->dev, &conf_desc);\n\t\tif (r == LIBUSB_SUCCESS) {\n\t\t\tiface = get_interface_by_endpoint(conf_desc, (setup->index & 0xFF));\n\t\t\tlibusb_free_config_descriptor(conf_desc);\n\t\t\tbreak;\n\t\t}\n\t\t// Fall through if not able to determine interface\n\tdefault:\n\t\tiface = -1;\n\t\tbreak;\n\t}\n\n\t// Try and target a specific interface if the control setup indicates such\n\tif ((iface >= 0) && (iface < USB_MAXINTERFACES)) {\n\t\tusbi_dbg(\"attempting control transfer targeted to interface %d\", iface);\n\t\tif (priv->usb_interface[iface].path != NULL) {\n\t\t\tr = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer);\n\t\t\tif (r == LIBUSB_SUCCESS)\n\t\t\t\treturn r;\n\t\t}\n\t}\n\n\t// Either not targeted to a specific interface or no luck in doing so.\n\t// Try a 2 pass approach with all interfaces.\n\tfor (pass = 0; pass < 2; pass++) {\n\t\tfor (iface = 0; iface < USB_MAXINTERFACES; iface++) {\n\t\t\tif (priv->usb_interface[iface].path != NULL) {\n\t\t\t\tif ((pass == 0) && (priv->usb_interface[iface].restricted_functionality)) {\n\t\t\t\t\tusbi_dbg(\"trying to skip restricted interface #%d (HID keyboard or mouse?)\", iface);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tusbi_dbg(\"using interface %d\", iface);\n\t\t\t\tr = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer);\n\t\t\t\t// If not supported on this API, it may be supported on another, so don't give up yet!!\n\t\t\t\tif (r == LIBUSB_ERROR_NOT_SUPPORTED)\n\t\t\t\t\tcontinue;\n\t\t\t\treturn r;\n\t\t\t}\n\t\t}\n\t}\n\n\tusbi_err(ctx, \"no libusb supported interfaces to complete request\");\n\treturn LIBUSB_ERROR_NOT_FOUND;\n}\n\nstatic int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) {\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tint current_interface;\n\n\tcurrent_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint);\n\tif (current_interface < 0) {\n\t\tusbi_err(ctx, \"unable to match endpoint to an open interface - cancelling transfer\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\treturn priv->usb_interface[current_interface].apib->\n\t\tsubmit_bulk_transfer(priv->usb_interface[current_interface].sub_api, itransfer);\n}\n\nstatic int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) {\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\tint current_interface;\n\n\tcurrent_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint);\n\tif (current_interface < 0) {\n\t\tusbi_err(ctx, \"unable to match endpoint to an open interface - cancelling transfer\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\treturn priv->usb_interface[current_interface].apib->\n\t\tsubmit_iso_transfer(priv->usb_interface[current_interface].sub_api, itransfer);\n}\n\nstatic int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint)\n{\n\tstruct libusb_context *ctx = DEVICE_CTX(dev_handle->dev);\n\tstruct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle);\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tint current_interface;\n\n\tcurrent_interface = interface_by_endpoint(priv, handle_priv, endpoint);\n\tif (current_interface < 0) {\n\t\tusbi_err(ctx, \"unable to match endpoint to an open interface - cannot clear\");\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\treturn priv->usb_interface[current_interface].apib->\n\t\tclear_halt(priv->usb_interface[current_interface].sub_api, dev_handle, endpoint);\n}\n\nstatic int composite_abort_control(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\n\treturn priv->usb_interface[transfer_priv->interface_number].apib->\n\t\tabort_control(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer);\n}\n\nstatic int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\n\treturn priv->usb_interface[transfer_priv->interface_number].apib->\n\t\tabort_transfers(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer);\n}\n\nstatic int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle)\n{\n\tstruct windows_device_priv *priv = _device_priv(dev_handle->dev);\n\tint r;\n\tuint8_t i;\n\tbool available[SUB_API_MAX];\n\n\tfor (i = 0; i < SUB_API_MAX; i++)\n\t\tavailable[i] = false;\n\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tif ((priv->usb_interface[i].apib->id == USB_API_WINUSBX)\n\t\t\t\t&& (priv->usb_interface[i].sub_api != SUB_API_NOTSET))\n\t\t\tavailable[priv->usb_interface[i].sub_api] = true;\n\t}\n\n\tfor (i = 0; i < SUB_API_MAX; i++) {\n\t\tif (available[i]) {\n\t\t\tr = usb_api_backend[USB_API_WINUSBX].reset_device(i, dev_handle);\n\t\t\tif (r != LIBUSB_SUCCESS)\n\t\t\t\treturn r;\n\t\t}\n\t}\n\n\treturn LIBUSB_SUCCESS;\n}\n\nstatic int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size)\n{\n\tstruct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);\n\tstruct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer);\n\tstruct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev);\n\n\treturn priv->usb_interface[transfer_priv->interface_number].apib->\n\t\tcopy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size);\n}\n\n#endif /* !USE_USBDK */\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.h",
    "content": "/*\n * Windows backend for libusb 1.0\n * Copyright © 2009-2012 Pete Batard <pete@akeo.ie>\n * With contributions from Michael Plante, Orin Eman et al.\n * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer\n * Major code testing contribution by Xiaofan Chen\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#pragma once\n\n#include \"windows_common.h\"\n#include \"windows_nt_common.h\"\n\n#if defined(_MSC_VER)\n// disable /W4 MSVC warnings that are benign\n#pragma warning(disable:4100)  // unreferenced formal parameter\n#pragma warning(disable:4127)  // conditional expression is constant\n#pragma warning(disable:4201)  // nameless struct/union\n#pragma warning(disable:4214)  // bit field types other than int\n#pragma warning(disable:4996)  // deprecated API calls\n#pragma warning(disable:28159) // more deprecated API calls\n#endif\n\n// Missing from MSVC6 setupapi.h\n#if !defined(SPDRP_ADDRESS)\n#define SPDRP_ADDRESS\t\t28\n#endif\n#if !defined(SPDRP_INSTALL_STATE)\n#define SPDRP_INSTALL_STATE\t34\n#endif\n\n#define MAX_CTRL_BUFFER_LENGTH\t4096\n#define MAX_USB_DEVICES\t\t256\n#define MAX_USB_STRING_LENGTH\t128\n#define MAX_HID_REPORT_SIZE\t1024\n#define MAX_HID_DESCRIPTOR_SIZE\t256\n#define MAX_GUID_STRING_LENGTH\t40\n#define MAX_PATH_LENGTH\t\t128\n#define MAX_KEY_LENGTH\t\t256\n#define LIST_SEPARATOR\t\t';'\n\n// Handle code for HID interface that have been claimed (\"dibs\")\n#define INTERFACE_CLAIMED\t((HANDLE)(intptr_t)0xD1B5)\n// Additional return code for HID operations that completed synchronously\n#define LIBUSB_COMPLETED\t(LIBUSB_SUCCESS + 1)\n\n// http://msdn.microsoft.com/en-us/library/ff545978.aspx\n// http://msdn.microsoft.com/en-us/library/ff545972.aspx\n// http://msdn.microsoft.com/en-us/library/ff545982.aspx\n#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER)\nconst GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} };\n#endif\n#if !defined(GUID_DEVINTERFACE_USB_DEVICE)\nconst GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} };\n#endif\n#if !defined(GUID_DEVINTERFACE_USB_HUB)\nconst GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} };\n#endif\n#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER)\nconst GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} };\n#endif\n\n\n/*\n * Multiple USB API backend support\n */\n#define USB_API_UNSUPPORTED\t0\n#define USB_API_HUB\t\t1\n#define USB_API_COMPOSITE\t2\n#define USB_API_WINUSBX\t\t3\n#define USB_API_HID\t\t4\n#define USB_API_MAX\t\t5\n// The following is used to indicate if the HID or composite extra props have already been set.\n#define USB_API_SET\t\t(1 << USB_API_MAX)\n\n// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL)\n// Must have the same values as the KUSB_DRVID enum from libusbk.h\n#define SUB_API_NOTSET\t\t-1\n#define SUB_API_LIBUSBK\t\t0\n#define SUB_API_LIBUSB0\t\t1\n#define SUB_API_WINUSB\t\t2\n#define SUB_API_MAX\t\t3\n\n#define WINUSBX_DRV_NAMES\t{\"libusbK\", \"libusb0\", \"WinUSB\"}\n\nstruct windows_usb_api_backend {\n\tconst uint8_t id;\n\tconst char *designation;\n\tconst char **driver_name_list; // Driver name, without .sys, e.g. \"usbccgp\"\n\tconst uint8_t nb_driver_names;\n\tint (*init)(int sub_api, struct libusb_context *ctx);\n\tint (*exit)(int sub_api);\n\tint (*open)(int sub_api, struct libusb_device_handle *dev_handle);\n\tvoid (*close)(int sub_api, struct libusb_device_handle *dev_handle);\n\tint (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface);\n\tint (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);\n\tint (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting);\n\tint (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface);\n\tint (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint);\n\tint (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle);\n\tint (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer);\n\tint (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer);\n\tint (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer);\n\tint (*abort_control)(int sub_api, struct usbi_transfer *itransfer);\n\tint (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer);\n\tint (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size);\n};\n\nextern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX];\n\n#define PRINT_UNSUPPORTED_API(fname)\t\t\t\t\\\n\tusbi_dbg(\"unsupported API call for '\"\t\t\t\\\n\t\t#fname \"' (unrecognized device driver)\");\t\\\n\treturn LIBUSB_ERROR_NOT_SUPPORTED;\n\n/*\n * private structures definition\n * with inline pseudo constructors/destructors\n */\n\n// TODO (v2+): move hid desc to libusb.h?\nstruct libusb_hid_descriptor {\n\tuint8_t bLength;\n\tuint8_t bDescriptorType;\n\tuint16_t bcdHID;\n\tuint8_t bCountryCode;\n\tuint8_t bNumDescriptors;\n\tuint8_t bClassDescriptorType;\n\tuint16_t wClassDescriptorLength;\n};\n\n#define LIBUSB_DT_HID_SIZE\t\t9\n#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \\\n\t+ LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE)\n#define HID_MAX_REPORT_SIZE\t\t1024\n#define HID_IN_EP\t\t\t0x81\n#define HID_OUT_EP\t\t\t0x02\n#define LIBUSB_REQ_RECIPIENT(request_type)\t((request_type) & 0x1F)\n#define LIBUSB_REQ_TYPE(request_type)\t\t((request_type) & (0x03 << 5))\n#define LIBUSB_REQ_IN(request_type)\t\t((request_type) & LIBUSB_ENDPOINT_IN)\n#define LIBUSB_REQ_OUT(request_type)\t\t(!LIBUSB_REQ_IN(request_type))\n\n// The following are used for HID reports IOCTLs\n#define HID_CTL_CODE(id) \\\n\tCTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS)\n#define HID_BUFFER_CTL_CODE(id) \\\n\tCTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS)\n#define HID_IN_CTL_CODE(id) \\\n\tCTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS)\n#define HID_OUT_CTL_CODE(id) \\\n\tCTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)\n\n#define IOCTL_HID_GET_FEATURE\t\tHID_OUT_CTL_CODE(100)\n#define IOCTL_HID_GET_INPUT_REPORT\tHID_OUT_CTL_CODE(104)\n#define IOCTL_HID_SET_FEATURE\t\tHID_IN_CTL_CODE(100)\n#define IOCTL_HID_SET_OUTPUT_REPORT\tHID_IN_CTL_CODE(101)\n\nenum libusb_hid_request_type {\n\tHID_REQ_GET_REPORT = 0x01,\n\tHID_REQ_GET_IDLE = 0x02,\n\tHID_REQ_GET_PROTOCOL = 0x03,\n\tHID_REQ_SET_REPORT = 0x09,\n\tHID_REQ_SET_IDLE = 0x0A,\n\tHID_REQ_SET_PROTOCOL = 0x0B\n};\n\nenum libusb_hid_report_type {\n\tHID_REPORT_TYPE_INPUT = 0x01,\n\tHID_REPORT_TYPE_OUTPUT = 0x02,\n\tHID_REPORT_TYPE_FEATURE = 0x03\n};\n\nstruct hid_device_priv {\n\tuint16_t vid;\n\tuint16_t pid;\n\tuint8_t config;\n\tuint8_t nb_interfaces;\n\tbool uses_report_ids[3]; // input, ouptput, feature\n\tuint16_t input_report_size;\n\tuint16_t output_report_size;\n\tuint16_t feature_report_size;\n\tWCHAR string[3][MAX_USB_STRING_LENGTH];\n\tuint8_t string_index[3]; // man, prod, ser\n};\n\nstruct windows_device_priv {\n\tuint8_t depth; // distance to HCD\n\tuint8_t port;  // port number on the hub\n\tuint8_t active_config;\n\tstruct windows_usb_api_backend const *apib;\n\tchar *path;  // device interface path\n\tint sub_api; // for WinUSB-like APIs\n\tstruct {\n\t\tchar *path; // each interface needs a device interface path,\n\t\tstruct windows_usb_api_backend const *apib; // an API backend (multiple drivers support),\n\t\tint sub_api;\n\t\tint8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS)\n\t\tuint8_t *endpoint;\n\t\tbool restricted_functionality;  // indicates if the interface functionality is restricted\n                                                // by Windows (eg. HID keyboards or mice cannot do R/W)\n\t} usb_interface[USB_MAXINTERFACES];\n\tstruct hid_device_priv *hid;\n\tUSB_DEVICE_DESCRIPTOR dev_descriptor;\n\tunsigned char **config_descriptor; // list of pointers to the cached config descriptors\n};\n\nstatic inline struct windows_device_priv *_device_priv(struct libusb_device *dev)\n{\n\treturn (struct windows_device_priv *)dev->os_priv;\n}\n\nstatic inline struct windows_device_priv *windows_device_priv_init(struct libusb_device *dev)\n{\n\tstruct windows_device_priv *p = _device_priv(dev);\n\tint i;\n\n\tp->apib = &usb_api_backend[USB_API_UNSUPPORTED];\n\tp->sub_api = SUB_API_NOTSET;\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tp->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED];\n\t\tp->usb_interface[i].sub_api = SUB_API_NOTSET;\n\t}\n\n\treturn p;\n}\n\nstatic inline void windows_device_priv_release(struct libusb_device *dev)\n{\n\tstruct windows_device_priv *p = _device_priv(dev);\n\tint i;\n\n\tfree(p->path);\n\tif ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) {\n\t\tfor (i = 0; i < dev->num_configurations; i++)\n\t\t\tfree(p->config_descriptor[i]);\n\t}\n\tfree(p->config_descriptor);\n\tfree(p->hid);\n\tfor (i = 0; i < USB_MAXINTERFACES; i++) {\n\t\tfree(p->usb_interface[i].path);\n\t\tfree(p->usb_interface[i].endpoint);\n\t}\n}\n\nstruct interface_handle_t {\n\tHANDLE dev_handle; // WinUSB needs an extra handle for the file\n\tHANDLE api_handle; // used by the API to communicate with the device\n};\n\nstruct windows_device_handle_priv {\n\tint active_interface;\n\tstruct interface_handle_t interface_handle[USB_MAXINTERFACES];\n\tint autoclaim_count[USB_MAXINTERFACES]; // For auto-release\n};\n\nstatic inline struct windows_device_handle_priv *_device_handle_priv(\n\tstruct libusb_device_handle *handle)\n{\n\treturn (struct windows_device_handle_priv *)handle->os_priv;\n}\n\n// used for async polling functions\nstruct windows_transfer_priv {\n\tstruct winfd pollable_fd;\n\tuint8_t interface_number;\n\tuint8_t *hid_buffer; // 1 byte extended data buffer, required for HID\n\tuint8_t *hid_dest;   // transfer buffer destination, required for HID\n\tsize_t hid_expected_size;\n};\n\n// used to match a device driver (including filter drivers) against a supported API\nstruct driver_lookup {\n\tchar list[MAX_KEY_LENGTH + 1]; // REG_MULTI_SZ list of services (driver) names\n\tconst DWORD reg_prop;          // SPDRP registry key to use to retrieve list\n\tconst char* designation;       // internal designation (for debug output)\n};\n\n/* OLE32 dependency */\nDLL_DECLARE_HANDLE(OLE32);\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID));\n\n/* Kernel32 dependencies */\nDLL_DECLARE_HANDLE(Kernel32);\n/* This call is only available from XP SP2 */\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, IsWow64Process, (HANDLE, PBOOL));\n\n/* SetupAPI dependencies */\nDLL_DECLARE_HANDLE(SetupAPI);\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA,\n\t\t\tconst GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA,\n\t\t\tPSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO,\n\t\t\tPSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD));\n\n/* AdvAPI32 dependencies */\nDLL_DECLARE_HANDLE(AdvAPI32);\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD));\nDLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY));\n\n/*\n * Windows DDK API definitions. Most of it copied from MinGW's includes\n */\ntypedef DWORD DEVNODE, DEVINST;\ntypedef DEVNODE *PDEVNODE, *PDEVINST;\ntypedef DWORD RETURN_TYPE;\ntypedef RETURN_TYPE CONFIGRET;\n\n#define CR_SUCCESS\t\t\t\t0x00000000\n#define CR_NO_SUCH_DEVNODE\t\t\t0x0000000D\n\n#define USB_DEVICE_DESCRIPTOR_TYPE\t\tLIBUSB_DT_DEVICE\n#define USB_CONFIGURATION_DESCRIPTOR_TYPE\tLIBUSB_DT_CONFIG\n#define USB_STRING_DESCRIPTOR_TYPE\t\tLIBUSB_DT_STRING\n#define USB_INTERFACE_DESCRIPTOR_TYPE\t\tLIBUSB_DT_INTERFACE\n#define USB_ENDPOINT_DESCRIPTOR_TYPE\t\tLIBUSB_DT_ENDPOINT\n\n#define USB_REQUEST_GET_STATUS\t\t\tLIBUSB_REQUEST_GET_STATUS\n#define USB_REQUEST_CLEAR_FEATURE\t\tLIBUSB_REQUEST_CLEAR_FEATURE\n#define USB_REQUEST_SET_FEATURE\t\t\tLIBUSB_REQUEST_SET_FEATURE\n#define USB_REQUEST_SET_ADDRESS\t\t\tLIBUSB_REQUEST_SET_ADDRESS\n#define USB_REQUEST_GET_DESCRIPTOR\t\tLIBUSB_REQUEST_GET_DESCRIPTOR\n#define USB_REQUEST_SET_DESCRIPTOR\t\tLIBUSB_REQUEST_SET_DESCRIPTOR\n#define USB_REQUEST_GET_CONFIGURATION\t\tLIBUSB_REQUEST_GET_CONFIGURATION\n#define USB_REQUEST_SET_CONFIGURATION\t\tLIBUSB_REQUEST_SET_CONFIGURATION\n#define USB_REQUEST_GET_INTERFACE\t\tLIBUSB_REQUEST_GET_INTERFACE\n#define USB_REQUEST_SET_INTERFACE\t\tLIBUSB_REQUEST_SET_INTERFACE\n#define USB_REQUEST_SYNC_FRAME\t\t\tLIBUSB_REQUEST_SYNCH_FRAME\n\n#define USB_GET_NODE_INFORMATION\t\t258\n#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION\t260\n#define USB_GET_NODE_CONNECTION_NAME\t\t261\n#define USB_GET_HUB_CAPABILITIES\t\t271\n#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX)\n#define USB_GET_NODE_CONNECTION_INFORMATION_EX\t274\n#endif\n#if !defined(USB_GET_HUB_CAPABILITIES_EX)\n#define USB_GET_HUB_CAPABILITIES_EX\t\t276\n#endif\n#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2)\n#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2\t279\n#endif\n\n#ifndef METHOD_BUFFERED\n#define METHOD_BUFFERED\t\t\t\t0\n#endif\n#ifndef FILE_ANY_ACCESS\n#define FILE_ANY_ACCESS\t\t\t\t0x00000000\n#endif\n#ifndef FILE_DEVICE_UNKNOWN\n#define FILE_DEVICE_UNKNOWN\t\t\t0x00000022\n#endif\n#ifndef FILE_DEVICE_USB\n#define FILE_DEVICE_USB\t\t\t\tFILE_DEVICE_UNKNOWN\n#endif\n\n#ifndef CTL_CODE\n#define CTL_CODE(DeviceType, Function, Method, Access) \\\n\t(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))\n#endif\n\ntypedef enum USB_CONNECTION_STATUS {\n\tNoDeviceConnected,\n\tDeviceConnected,\n\tDeviceFailedEnumeration,\n\tDeviceGeneralFailure,\n\tDeviceCausedOvercurrent,\n\tDeviceNotEnoughPower,\n\tDeviceNotEnoughBandwidth,\n\tDeviceHubNestedTooDeeply,\n\tDeviceInLegacyHub\n} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;\n\ntypedef enum USB_HUB_NODE {\n\tUsbHub,\n\tUsbMIParent\n} USB_HUB_NODE;\n\n/* Cfgmgr32.dll interface */\nDLL_DECLARE_HANDLE(Cfgmgr32);\nDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG));\nDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG));\nDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG));\nDLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG));\n\n#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \\\n\tCTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_HUB_CAPABILITIES \\\n\tCTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \\\n\tCTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_ROOT_HUB_NAME \\\n\tCTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_NODE_INFORMATION \\\n\tCTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \\\n\tCTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \\\n\tCTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \\\n\tCTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n#define IOCTL_USB_GET_NODE_CONNECTION_NAME \\\n\tCTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS)\n\n// Most of the structures below need to be packed\n#pragma pack(push, 1)\n\ntypedef struct USB_INTERFACE_DESCRIPTOR {\n\tUCHAR bLength;\n\tUCHAR bDescriptorType;\n\tUCHAR bInterfaceNumber;\n\tUCHAR bAlternateSetting;\n\tUCHAR bNumEndpoints;\n\tUCHAR bInterfaceClass;\n\tUCHAR bInterfaceSubClass;\n\tUCHAR bInterfaceProtocol;\n\tUCHAR iInterface;\n} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;\n\ntypedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT {\n\tstruct {\n\t\tULONG ConnectionIndex;\n\t\tstruct {\n\t\t\tUCHAR bmRequest;\n\t\t\tUCHAR bRequest;\n\t\t\tUSHORT wValue;\n\t\t\tUSHORT wIndex;\n\t\t\tUSHORT wLength;\n\t\t} SetupPacket;\n\t} req;\n\tUSB_CONFIGURATION_DESCRIPTOR data;\n} USB_CONFIGURATION_DESCRIPTOR_SHORT;\n\ntypedef struct USB_ENDPOINT_DESCRIPTOR {\n\tUCHAR bLength;\n\tUCHAR bDescriptorType;\n\tUCHAR bEndpointAddress;\n\tUCHAR bmAttributes;\n\tUSHORT wMaxPacketSize;\n\tUCHAR bInterval;\n} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;\n\ntypedef struct USB_DESCRIPTOR_REQUEST {\n\tULONG ConnectionIndex;\n\tstruct {\n\t\tUCHAR bmRequest;\n\t\tUCHAR bRequest;\n\t\tUSHORT wValue;\n\t\tUSHORT wIndex;\n\t\tUSHORT wLength;\n\t} SetupPacket;\n//\tUCHAR Data[0];\n} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST;\n\ntypedef struct USB_HUB_DESCRIPTOR {\n\tUCHAR bDescriptorLength;\n\tUCHAR bDescriptorType;\n\tUCHAR bNumberOfPorts;\n\tUSHORT wHubCharacteristics;\n\tUCHAR bPowerOnToPowerGood;\n\tUCHAR bHubControlCurrent;\n\tUCHAR bRemoveAndPowerMask[64];\n} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;\n\ntypedef struct USB_ROOT_HUB_NAME {\n\tULONG ActualLength;\n\tWCHAR RootHubName[1];\n} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;\n\ntypedef struct USB_ROOT_HUB_NAME_FIXED {\n\tULONG ActualLength;\n\tWCHAR RootHubName[MAX_PATH_LENGTH];\n} USB_ROOT_HUB_NAME_FIXED;\n\ntypedef struct USB_NODE_CONNECTION_NAME {\n\tULONG ConnectionIndex;\n\tULONG ActualLength;\n\tWCHAR NodeName[1];\n} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME;\n\ntypedef struct USB_NODE_CONNECTION_NAME_FIXED {\n\tULONG ConnectionIndex;\n\tULONG ActualLength;\n\tWCHAR NodeName[MAX_PATH_LENGTH];\n} USB_NODE_CONNECTION_NAME_FIXED;\n\ntypedef struct USB_HUB_NAME_FIXED {\n\tunion {\n\t\tUSB_ROOT_HUB_NAME_FIXED root;\n\t\tUSB_NODE_CONNECTION_NAME_FIXED node;\n\t} u;\n} USB_HUB_NAME_FIXED;\n\ntypedef struct USB_HUB_INFORMATION {\n\tUSB_HUB_DESCRIPTOR HubDescriptor;\n\tBOOLEAN HubIsBusPowered;\n} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;\n\ntypedef struct USB_MI_PARENT_INFORMATION {\n\tULONG NumberOfInterfaces;\n} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;\n\ntypedef struct USB_NODE_INFORMATION {\n\tUSB_HUB_NODE NodeType;\n\tunion {\n\t\tUSB_HUB_INFORMATION HubInformation;\n\t\tUSB_MI_PARENT_INFORMATION MiParentInformation;\n\t} u;\n} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;\n\ntypedef struct USB_PIPE_INFO {\n\tUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor;\n\tULONG ScheduleOffset;\n} USB_PIPE_INFO, *PUSB_PIPE_INFO;\n\ntypedef struct USB_NODE_CONNECTION_INFORMATION_EX {\n\tULONG ConnectionIndex;\n\tUSB_DEVICE_DESCRIPTOR DeviceDescriptor;\n\tUCHAR CurrentConfigurationValue;\n\tUCHAR Speed;\n\tBOOLEAN DeviceIsHub;\n\tUSHORT DeviceAddress;\n\tULONG NumberOfOpenPipes;\n\tUSB_CONNECTION_STATUS ConnectionStatus;\n//\tUSB_PIPE_INFO PipeList[0];\n} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX;\n\ntypedef union _USB_PROTOCOLS {\n\tULONG ul;\n\tstruct {\n\t\tULONG Usb110:1;\n\t\tULONG Usb200:1;\n\t\tULONG Usb300:1;\n\t\tULONG ReservedMBZ:29;\n\t};\n} USB_PROTOCOLS, *PUSB_PROTOCOLS;\n\ntypedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS {\n\tULONG ul;\n\tstruct {\n\t\tULONG DeviceIsOperatingAtSuperSpeedOrHigher:1;\n\t\tULONG DeviceIsSuperSpeedCapableOrHigher:1;\n\t\tULONG ReservedMBZ:30;\n\t};\n} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS;\n\ntypedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 {\n\tULONG ConnectionIndex;\n\tULONG Length;\n\tUSB_PROTOCOLS SupportedUsbProtocols;\n\tUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags;\n} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2;\n\ntypedef struct USB_HUB_CAP_FLAGS {\n\tULONG HubIsHighSpeedCapable:1;\n\tULONG HubIsHighSpeed:1;\n\tULONG HubIsMultiTtCapable:1;\n\tULONG HubIsMultiTt:1;\n\tULONG HubIsRoot:1;\n\tULONG HubIsArmedWakeOnConnect:1;\n\tULONG ReservedMBZ:26;\n} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS;\n\ntypedef struct USB_HUB_CAPABILITIES {\n\tULONG HubIs2xCapable:1;\n} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES;\n\ntypedef struct USB_HUB_CAPABILITIES_EX {\n\tUSB_HUB_CAP_FLAGS CapabilityFlags;\n} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX;\n\n#pragma pack(pop)\n\n/* winusb.dll interface */\n\n#define SHORT_PACKET_TERMINATE\t0x01\n#define AUTO_CLEAR_STALL\t0x02\n#define PIPE_TRANSFER_TIMEOUT\t0x03\n#define IGNORE_SHORT_PACKETS\t0x04\n#define ALLOW_PARTIAL_READS\t0x05\n#define AUTO_FLUSH\t\t0x06\n#define RAW_IO\t\t\t0x07\n#define MAXIMUM_TRANSFER_SIZE\t0x08\n#define AUTO_SUSPEND\t\t0x81\n#define SUSPEND_DELAY\t\t0x83\n#define DEVICE_SPEED\t\t0x01\n#define LowSpeed\t\t0x01\n#define FullSpeed\t\t0x02\n#define HighSpeed\t\t0x03\n\ntypedef enum USBD_PIPE_TYPE {\n\tUsbdPipeTypeControl,\n\tUsbdPipeTypeIsochronous,\n\tUsbdPipeTypeBulk,\n\tUsbdPipeTypeInterrupt\n} USBD_PIPE_TYPE;\n\ntypedef struct {\n\tUSBD_PIPE_TYPE PipeType;\n\tUCHAR PipeId;\n\tUSHORT MaximumPacketSize;\n\tUCHAR Interval;\n} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION;\n\n#pragma pack(1)\ntypedef struct {\n\tUCHAR request_type;\n\tUCHAR request;\n\tUSHORT value;\n\tUSHORT index;\n\tUSHORT length;\n} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET;\n#pragma pack()\n\ntypedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE;\n\ntypedef BOOL (WINAPI *WinUsb_AbortPipe_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR PipeID\n);\ntypedef BOOL (WINAPI *WinUsb_ControlTransfer_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tWINUSB_SETUP_PACKET SetupPacket,\n\tPUCHAR Buffer,\n\tULONG BufferLength,\n\tPULONG LengthTransferred,\n\tLPOVERLAPPED Overlapped\n);\ntypedef BOOL (WINAPI *WinUsb_FlushPipe_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR PipeID\n);\ntypedef BOOL (WINAPI *WinUsb_Free_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle\n);\ntypedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR AssociatedInterfaceIndex,\n\tPWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle\n);\ntypedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tPUCHAR AlternateSetting\n);\ntypedef BOOL (WINAPI *WinUsb_GetDescriptor_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR DescriptorType,\n\tUCHAR Index,\n\tUSHORT LanguageID,\n\tPUCHAR Buffer,\n\tULONG BufferLength,\n\tPULONG LengthTransferred\n);\ntypedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tLPOVERLAPPED lpOverlapped,\n\tLPDWORD lpNumberOfBytesTransferred,\n\tBOOL bWait\n);\ntypedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR PipeID,\n\tULONG PolicyType,\n\tPULONG ValueLength,\n\tPVOID Value\n);\ntypedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tULONG PolicyType,\n\tPULONG ValueLength,\n\tPVOID Value\n);\ntypedef BOOL (WINAPI *WinUsb_Initialize_t)(\n\tHANDLE DeviceHandle,\n\tPWINUSB_INTERFACE_HANDLE InterfaceHandle\n);\ntypedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tULONG InformationType,\n\tPULONG BufferLength,\n\tPVOID Buffer\n);\ntypedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR AlternateSettingNumber,\n\tPUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor\n);\ntypedef BOOL (WINAPI *WinUsb_QueryPipe_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR AlternateInterfaceNumber,\n\tUCHAR PipeIndex,\n\tPWINUSB_PIPE_INFORMATION PipeInformation\n);\ntypedef BOOL (WINAPI *WinUsb_ReadPipe_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR PipeID,\n\tPUCHAR Buffer,\n\tULONG BufferLength,\n\tPULONG LengthTransferred,\n\tLPOVERLAPPED Overlapped\n);\ntypedef BOOL (WINAPI *WinUsb_ResetPipe_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR PipeID\n);\ntypedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR AlternateSetting\n);\ntypedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR PipeID,\n\tULONG PolicyType,\n\tULONG ValueLength,\n\tPVOID Value\n);\ntypedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tULONG PolicyType,\n\tULONG ValueLength,\n\tPVOID Value\n);\ntypedef BOOL (WINAPI *WinUsb_WritePipe_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle,\n\tUCHAR PipeID,\n\tPUCHAR Buffer,\n\tULONG BufferLength,\n\tPULONG LengthTransferred,\n\tLPOVERLAPPED Overlapped\n);\ntypedef BOOL (WINAPI *WinUsb_ResetDevice_t)(\n\tWINUSB_INTERFACE_HANDLE InterfaceHandle\n);\n\n/* /!\\ These must match the ones from the official libusbk.h */\ntypedef enum _KUSB_FNID {\n\tKUSB_FNID_Init,\n\tKUSB_FNID_Free,\n\tKUSB_FNID_ClaimInterface,\n\tKUSB_FNID_ReleaseInterface,\n\tKUSB_FNID_SetAltInterface,\n\tKUSB_FNID_GetAltInterface,\n\tKUSB_FNID_GetDescriptor,\n\tKUSB_FNID_ControlTransfer,\n\tKUSB_FNID_SetPowerPolicy,\n\tKUSB_FNID_GetPowerPolicy,\n\tKUSB_FNID_SetConfiguration,\n\tKUSB_FNID_GetConfiguration,\n\tKUSB_FNID_ResetDevice,\n\tKUSB_FNID_Initialize,\n\tKUSB_FNID_SelectInterface,\n\tKUSB_FNID_GetAssociatedInterface,\n\tKUSB_FNID_Clone,\n\tKUSB_FNID_QueryInterfaceSettings,\n\tKUSB_FNID_QueryDeviceInformation,\n\tKUSB_FNID_SetCurrentAlternateSetting,\n\tKUSB_FNID_GetCurrentAlternateSetting,\n\tKUSB_FNID_QueryPipe,\n\tKUSB_FNID_SetPipePolicy,\n\tKUSB_FNID_GetPipePolicy,\n\tKUSB_FNID_ReadPipe,\n\tKUSB_FNID_WritePipe,\n\tKUSB_FNID_ResetPipe,\n\tKUSB_FNID_AbortPipe,\n\tKUSB_FNID_FlushPipe,\n\tKUSB_FNID_IsoReadPipe,\n\tKUSB_FNID_IsoWritePipe,\n\tKUSB_FNID_GetCurrentFrameNumber,\n\tKUSB_FNID_GetOverlappedResult,\n\tKUSB_FNID_GetProperty,\n\tKUSB_FNID_COUNT,\n} KUSB_FNID;\n\ntypedef struct _KLIB_VERSION {\n\tINT Major;\n\tINT Minor;\n\tINT Micro;\n\tINT Nano;\n} KLIB_VERSION;\ntypedef KLIB_VERSION* PKLIB_VERSION;\n\ntypedef BOOL (WINAPI *LibK_GetProcAddress_t)(\n\tPVOID *ProcAddress,\n\tULONG DriverID,\n\tULONG FunctionID\n);\n\ntypedef VOID (WINAPI *LibK_GetVersion_t)(\n\tPKLIB_VERSION Version\n);\n\nstruct winusb_interface {\n\tbool initialized;\n\tWinUsb_AbortPipe_t AbortPipe;\n\tWinUsb_ControlTransfer_t ControlTransfer;\n\tWinUsb_FlushPipe_t FlushPipe;\n\tWinUsb_Free_t Free;\n\tWinUsb_GetAssociatedInterface_t GetAssociatedInterface;\n\tWinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting;\n\tWinUsb_GetDescriptor_t GetDescriptor;\n\tWinUsb_GetOverlappedResult_t GetOverlappedResult;\n\tWinUsb_GetPipePolicy_t GetPipePolicy;\n\tWinUsb_GetPowerPolicy_t GetPowerPolicy;\n\tWinUsb_Initialize_t Initialize;\n\tWinUsb_QueryDeviceInformation_t QueryDeviceInformation;\n\tWinUsb_QueryInterfaceSettings_t QueryInterfaceSettings;\n\tWinUsb_QueryPipe_t QueryPipe;\n\tWinUsb_ReadPipe_t ReadPipe;\n\tWinUsb_ResetPipe_t ResetPipe;\n\tWinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting;\n\tWinUsb_SetPipePolicy_t SetPipePolicy;\n\tWinUsb_SetPowerPolicy_t SetPowerPolicy;\n\tWinUsb_WritePipe_t WritePipe;\n\tWinUsb_ResetDevice_t ResetDevice;\n};\n\n/* hid.dll interface */\n\n#define HIDP_STATUS_SUCCESS\t0x110000\ntypedef void * PHIDP_PREPARSED_DATA;\n\n#pragma pack(1)\ntypedef struct {\n\tULONG Size;\n\tUSHORT VendorID;\n\tUSHORT ProductID;\n\tUSHORT VersionNumber;\n} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES;\n#pragma pack()\n\ntypedef USHORT USAGE;\ntypedef struct {\n\tUSAGE Usage;\n\tUSAGE UsagePage;\n\tUSHORT InputReportByteLength;\n\tUSHORT OutputReportByteLength;\n\tUSHORT FeatureReportByteLength;\n\tUSHORT Reserved[17];\n\tUSHORT NumberLinkCollectionNodes;\n\tUSHORT NumberInputButtonCaps;\n\tUSHORT NumberInputValueCaps;\n\tUSHORT NumberInputDataIndices;\n\tUSHORT NumberOutputButtonCaps;\n\tUSHORT NumberOutputValueCaps;\n\tUSHORT NumberOutputDataIndices;\n\tUSHORT NumberFeatureButtonCaps;\n\tUSHORT NumberFeatureValueCaps;\n\tUSHORT NumberFeatureDataIndices;\n} HIDP_CAPS, *PHIDP_CAPS;\n\ntypedef enum _HIDP_REPORT_TYPE {\n\tHidP_Input,\n\tHidP_Output,\n\tHidP_Feature\n} HIDP_REPORT_TYPE;\n\ntypedef struct _HIDP_VALUE_CAPS {\n\tUSAGE UsagePage;\n\tUCHAR ReportID;\n\tBOOLEAN IsAlias;\n\tUSHORT BitField;\n\tUSHORT LinkCollection;\n\tUSAGE LinkUsage;\n\tUSAGE LinkUsagePage;\n\tBOOLEAN IsRange;\n\tBOOLEAN IsStringRange;\n\tBOOLEAN IsDesignatorRange;\n\tBOOLEAN IsAbsolute;\n\tBOOLEAN HasNull;\n\tUCHAR Reserved;\n\tUSHORT BitSize;\n\tUSHORT ReportCount;\n\tUSHORT Reserved2[5];\n\tULONG UnitsExp;\n\tULONG Units;\n\tLONG LogicalMin, LogicalMax;\n\tLONG PhysicalMin, PhysicalMax;\n\tunion {\n\t\tstruct {\n\t\t\tUSAGE UsageMin, UsageMax;\n\t\t\tUSHORT StringMin, StringMax;\n\t\t\tUSHORT DesignatorMin, DesignatorMax;\n\t\t\tUSHORT DataIndexMin, DataIndexMax;\n\t\t} Range;\n\t\tstruct {\n\t\t\tUSAGE Usage, Reserved1;\n\t\t\tUSHORT StringIndex, Reserved2;\n\t\t\tUSHORT DesignatorIndex, Reserved3;\n\t\t\tUSHORT DataIndex, Reserved4;\n\t\t} NotRange;\n\t} u;\n} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS;\n\nDLL_DECLARE_HANDLE(hid);\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES));\nDLL_DECLARE_FUNC(WINAPI, VOID, HidD_GetHidGuid, (LPGUID));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FlushQueue, (HANDLE));\nDLL_DECLARE_FUNC(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA));"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/strerror.c",
    "content": "/*\n * libusb strerror code\n * Copyright © 2013 Hans de Goede <hdegoede@redhat.com>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <locale.h>\n#include <stdlib.h>\n#include <string.h>\n#if defined(HAVE_STRINGS_H)\n#include <strings.h>\n#endif\n\n#include \"libusbi.h\"\n\n#if defined(_MSC_VER)\n#define strncasecmp _strnicmp\n#endif\n\nstatic size_t usbi_locale = 0;\n\n/** \\ingroup libusb_misc\n * How to add a new \\ref libusb_strerror() translation:\n * <ol>\n * <li> Download the latest \\c strerror.c from:<br>\n *      https://raw.github.com/libusb/libusb/master/libusb/sterror.c </li>\n * <li> Open the file in an UTF-8 capable editor </li>\n * <li> Add the 2 letter <a href=\"http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes\">ISO 639-1</a>\n *      code for your locale at the end of \\c usbi_locale_supported[]<br>\n *    Eg. for Chinese, you would add \"zh\" so that:\n *    \\code... usbi_locale_supported[] = { \"en\", \"nl\", \"fr\" };\\endcode\n *    becomes:\n *    \\code... usbi_locale_supported[] = { \"en\", \"nl\", \"fr\", \"zh\" };\\endcode </li>\n * <li> Copy the <tt>{ / * English (en) * / ... }</tt> section and add it at the end of \\c usbi_localized_errors<br>\n *    Eg. for Chinese, the last section of \\c usbi_localized_errors could look like:\n *    \\code\n *     }, { / * Chinese (zh) * /\n *         \"Success\",\n *         ...\n *         \"Other error\",\n *     }\n * };\\endcode </li>\n * <li> Translate each of the English messages from the section you copied into your language </li>\n * <li> Save the file (in UTF-8 format) and send it to \\c libusb-devel\\@lists.sourceforge.net </li>\n * </ol>\n */\n\nstatic const char* usbi_locale_supported[] = { \"en\", \"nl\", \"fr\", \"ru\" };\nstatic const char* usbi_localized_errors[ARRAYSIZE(usbi_locale_supported)][LIBUSB_ERROR_COUNT] = {\n\t{ /* English (en) */\n\t\t\"Success\",\n\t\t\"Input/Output Error\",\n\t\t\"Invalid parameter\",\n\t\t\"Access denied (insufficient permissions)\",\n\t\t\"No such device (it may have been disconnected)\",\n\t\t\"Entity not found\",\n\t\t\"Resource busy\",\n\t\t\"Operation timed out\",\n\t\t\"Overflow\",\n\t\t\"Pipe error\",\n\t\t\"System call interrupted (perhaps due to signal)\",\n\t\t\"Insufficient memory\",\n\t\t\"Operation not supported or unimplemented on this platform\",\n\t\t\"Other error\",\n\t}, { /* Dutch (nl) */\n\t\t\"Gelukt\",\n\t\t\"Invoer-/uitvoerfout\",\n\t\t\"Ongeldig argument\",\n\t\t\"Toegang geweigerd (onvoldoende toegangsrechten)\",\n\t\t\"Apparaat bestaat niet (verbinding met apparaat verbroken?)\",\n\t\t\"Niet gevonden\",\n\t\t\"Apparaat of hulpbron is bezig\",\n\t\t\"Bewerking verlopen\",\n\t\t\"Waarde is te groot\",\n\t\t\"Gebroken pijp\",\n\t\t\"Onderbroken systeemaanroep\",\n\t\t\"Onvoldoende geheugen beschikbaar\",\n\t\t\"Bewerking wordt niet ondersteund\",\n\t\t\"Andere fout\",\n\t}, { /* French (fr) */\n\t\t\"Succès\",\n\t\t\"Erreur d'entrée/sortie\",\n\t\t\"Paramètre invalide\",\n\t\t\"Accès refusé (permissions insuffisantes)\",\n\t\t\"Périphérique introuvable (peut-être déconnecté)\",\n\t\t\"Elément introuvable\",\n\t\t\"Resource déjà occupée\",\n\t\t\"Operation expirée\",\n\t\t\"Débordement\",\n\t\t\"Erreur de pipe\",\n\t\t\"Appel système abandonné (peut-être à cause d’un signal)\",\n\t\t\"Mémoire insuffisante\",\n\t\t\"Opération non supportée or non implémentée sur cette plateforme\",\n\t\t\"Autre erreur\",\n\t}, { /* Russian (ru) */\n\t\t\"Успех\",\n\t\t\"Ошибка ввода/вывода\",\n\t\t\"Неверный параметр\",\n\t\t\"Доступ запрещён (не хватает прав)\",\n\t\t\"Устройство отсутствует (возможно, оно было отсоединено)\",\n\t\t\"Элемент не найден\",\n\t\t\"Ресурс занят\",\n\t\t\"Истекло время ожидания операции\",\n\t\t\"Переполнение\",\n\t\t\"Ошибка канала\",\n\t\t\"Системный вызов прерван (возможно, сигналом)\",\n\t\t\"Память исчерпана\",\n\t\t\"Операция не поддерживается данной платформой\",\n\t\t\"Неизвестная ошибка\"\n\t}\n};\n\n/** \\ingroup libusb_misc\n * Set the language, and only the language, not the encoding! used for\n * translatable libusb messages.\n *\n * This takes a locale string in the default setlocale format: lang[-region]\n * or lang[_country_region][.codeset]. Only the lang part of the string is\n * used, and only 2 letter ISO 639-1 codes are accepted for it, such as \"de\".\n * The optional region, country_region or codeset parts are ignored. This\n * means that functions which return translatable strings will NOT honor the\n * specified encoding. \n * All strings returned are encoded as UTF-8 strings.\n *\n * If libusb_setlocale() is not called, all messages will be in English.\n *\n * The following functions return translatable strings: libusb_strerror().\n * Note that the libusb log messages controlled through libusb_set_debug()\n * are not translated, they are always in English.\n *\n * For POSIX UTF-8 environments if you want libusb to follow the standard\n * locale settings, call libusb_setlocale(setlocale(LC_MESSAGES, NULL)),\n * after your app has done its locale setup.\n *\n * \\param locale locale-string in the form of lang[_country_region][.codeset]\n * or lang[-region], where lang is a 2 letter ISO 639-1 code\n * \\returns LIBUSB_SUCCESS on success\n * \\returns LIBUSB_ERROR_INVALID_PARAM if the locale doesn't meet the requirements\n * \\returns LIBUSB_ERROR_NOT_FOUND if the requested language is not supported\n * \\returns a LIBUSB_ERROR code on other errors\n */\n\nint API_EXPORTED libusb_setlocale(const char *locale)\n{\n\tsize_t i;\n\n\tif ( (locale == NULL) || (strlen(locale) < 2)\n\t  || ((strlen(locale) > 2) && (locale[2] != '-') && (locale[2] != '_') && (locale[2] != '.')) )\n\t\treturn LIBUSB_ERROR_INVALID_PARAM;\n\n\tfor (i=0; i<ARRAYSIZE(usbi_locale_supported); i++) {\n\t\tif (strncasecmp(usbi_locale_supported[i], locale, 2) == 0)\n\t\t\tbreak;\n\t}\n\tif (i >= ARRAYSIZE(usbi_locale_supported)) {\n\t\treturn LIBUSB_ERROR_NOT_FOUND;\n\t}\n\n\tusbi_locale = i;\n\n\treturn LIBUSB_SUCCESS;\n}\n\n/** \\ingroup libusb_misc\n * Returns a constant string with a short description of the given error code,\n * this description is intended for displaying to the end user and will be in\n * the language set by libusb_setlocale().\n *\n * The returned string is encoded in UTF-8.\n *\n * The messages always start with a capital letter and end without any dot.\n * The caller must not free() the returned string.\n *\n * \\param errcode the error code whose description is desired\n * \\returns a short description of the error code in UTF-8 encoding\n */\nDEFAULT_VISIBILITY const char* LIBUSB_CALL libusb_strerror(enum libusb_error errcode)\n{\n\tint errcode_index = -errcode;\n\n\tif ((errcode_index < 0) || (errcode_index >= LIBUSB_ERROR_COUNT)) {\n\t\t/* \"Other Error\", which should always be our last message, is returned */\n\t\terrcode_index = LIBUSB_ERROR_COUNT - 1;\n\t}\n\n\treturn usbi_localized_errors[usbi_locale][errcode_index];\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/sync.c",
    "content": "/*\n * Synchronous I/O functions for libusb\n * Copyright © 2007-2008 Daniel Drake <dsd@gentoo.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library 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 GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include <config.h>\n\n#include <errno.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libusbi.h\"\n\n/**\n * @defgroup libusb_syncio Synchronous device I/O\n *\n * This page documents libusb's synchronous (blocking) API for USB device I/O.\n * This interface is easy to use but has some limitations. More advanced users\n * may wish to consider using the \\ref libusb_asyncio \"asynchronous I/O API\" instead.\n */\n\nstatic void LIBUSB_CALL sync_transfer_cb(struct libusb_transfer *transfer)\n{\n\tint *completed = transfer->user_data;\n\t*completed = 1;\n\tusbi_dbg(\"actual_length=%d\", transfer->actual_length);\n\t/* caller interprets result and frees transfer */\n}\n\nstatic void sync_transfer_wait_for_completion(struct libusb_transfer *transfer)\n{\n\tint r, *completed = transfer->user_data;\n\tstruct libusb_context *ctx = HANDLE_CTX(transfer->dev_handle);\n\n\twhile (!*completed) {\n\t\tr = libusb_handle_events_completed(ctx, completed);\n\t\tif (r < 0) {\n\t\t\tif (r == LIBUSB_ERROR_INTERRUPTED)\n\t\t\t\tcontinue;\n\t\t\tusbi_err(ctx, \"libusb_handle_events failed: %s, cancelling transfer and retrying\",\n\t\t\t\t libusb_error_name(r));\n\t\t\tlibusb_cancel_transfer(transfer);\n\t\t\tcontinue;\n\t\t}\n\t}\n}\n\n/** \\ingroup libusb_syncio\n * Perform a USB control transfer.\n *\n * The direction of the transfer is inferred from the bmRequestType field of\n * the setup packet.\n *\n * The wValue, wIndex and wLength fields values should be given in host-endian\n * byte order.\n *\n * \\param dev_handle a handle for the device to communicate with\n * \\param bmRequestType the request type field for the setup packet\n * \\param bRequest the request field for the setup packet\n * \\param wValue the value field for the setup packet\n * \\param wIndex the index field for the setup packet\n * \\param data a suitably-sized data buffer for either input or output\n * (depending on direction bits within bmRequestType)\n * \\param wLength the length field for the setup packet. The data buffer should\n * be at least this size.\n * \\param timeout timeout (in millseconds) that this function should wait\n * before giving up due to no response being received. For an unlimited\n * timeout, use value 0.\n * \\returns on success, the number of bytes actually transferred\n * \\returns LIBUSB_ERROR_TIMEOUT if the transfer timed out\n * \\returns LIBUSB_ERROR_PIPE if the control request was not supported by the\n * device\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns LIBUSB_ERROR_BUSY if called from event handling context\n * \\returns LIBUSB_ERROR_INVALID_PARAM if the transfer size is larger than\n * the operating system and/or hardware can support\n * \\returns another LIBUSB_ERROR code on other failures\n */\nint API_EXPORTED libusb_control_transfer(libusb_device_handle *dev_handle,\n\tuint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,\n\tunsigned char *data, uint16_t wLength, unsigned int timeout)\n{\n\tstruct libusb_transfer *transfer;\n\tunsigned char *buffer;\n\tint completed = 0;\n\tint r;\n\n\tif (usbi_handling_events(HANDLE_CTX(dev_handle)))\n\t\treturn LIBUSB_ERROR_BUSY;\n\n\ttransfer = libusb_alloc_transfer(0);\n\tif (!transfer)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tbuffer = (unsigned char*) malloc(LIBUSB_CONTROL_SETUP_SIZE + wLength);\n\tif (!buffer) {\n\t\tlibusb_free_transfer(transfer);\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\t}\n\n\tlibusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex,\n\t\twLength);\n\tif ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT)\n\t\tmemcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength);\n\n\tlibusb_fill_control_transfer(transfer, dev_handle, buffer,\n\t\tsync_transfer_cb, &completed, timeout);\n\ttransfer->flags = LIBUSB_TRANSFER_FREE_BUFFER;\n\tr = libusb_submit_transfer(transfer);\n\tif (r < 0) {\n\t\tlibusb_free_transfer(transfer);\n\t\treturn r;\n\t}\n\n\tsync_transfer_wait_for_completion(transfer);\n\n\tif ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN)\n\t\tmemcpy(data, libusb_control_transfer_get_data(transfer),\n\t\t\ttransfer->actual_length);\n\n\tswitch (transfer->status) {\n\tcase LIBUSB_TRANSFER_COMPLETED:\n\t\tr = transfer->actual_length;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TIMED_OUT:\n\t\tr = LIBUSB_ERROR_TIMEOUT;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_STALL:\n\t\tr = LIBUSB_ERROR_PIPE;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_NO_DEVICE:\n\t\tr = LIBUSB_ERROR_NO_DEVICE;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_OVERFLOW:\n\t\tr = LIBUSB_ERROR_OVERFLOW;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_ERROR:\n\tcase LIBUSB_TRANSFER_CANCELLED:\n\t\tr = LIBUSB_ERROR_IO;\n\t\tbreak;\n\tdefault:\n\t\tusbi_warn(HANDLE_CTX(dev_handle),\n\t\t\t\"unrecognised status code %d\", transfer->status);\n\t\tr = LIBUSB_ERROR_OTHER;\n\t}\n\n\tlibusb_free_transfer(transfer);\n\treturn r;\n}\n\nstatic int do_sync_bulk_transfer(struct libusb_device_handle *dev_handle,\n\tunsigned char endpoint, unsigned char *buffer, int length,\n\tint *transferred, unsigned int timeout, unsigned char type)\n{\n\tstruct libusb_transfer *transfer;\n\tint completed = 0;\n\tint r;\n\n\tif (usbi_handling_events(HANDLE_CTX(dev_handle)))\n\t\treturn LIBUSB_ERROR_BUSY;\n\n\ttransfer = libusb_alloc_transfer(0);\n\tif (!transfer)\n\t\treturn LIBUSB_ERROR_NO_MEM;\n\n\tlibusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, length,\n\t\tsync_transfer_cb, &completed, timeout);\n\ttransfer->type = type;\n\n\tr = libusb_submit_transfer(transfer);\n\tif (r < 0) {\n\t\tlibusb_free_transfer(transfer);\n\t\treturn r;\n\t}\n\n\tsync_transfer_wait_for_completion(transfer);\n\n\tif (transferred)\n\t\t*transferred = transfer->actual_length;\n\n\tswitch (transfer->status) {\n\tcase LIBUSB_TRANSFER_COMPLETED:\n\t\tr = 0;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_TIMED_OUT:\n\t\tr = LIBUSB_ERROR_TIMEOUT;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_STALL:\n\t\tr = LIBUSB_ERROR_PIPE;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_OVERFLOW:\n\t\tr = LIBUSB_ERROR_OVERFLOW;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_NO_DEVICE:\n\t\tr = LIBUSB_ERROR_NO_DEVICE;\n\t\tbreak;\n\tcase LIBUSB_TRANSFER_ERROR:\n\tcase LIBUSB_TRANSFER_CANCELLED:\n\t\tr = LIBUSB_ERROR_IO;\n\t\tbreak;\n\tdefault:\n\t\tusbi_warn(HANDLE_CTX(dev_handle),\n\t\t\t\"unrecognised status code %d\", transfer->status);\n\t\tr = LIBUSB_ERROR_OTHER;\n\t}\n\n\tlibusb_free_transfer(transfer);\n\treturn r;\n}\n\n/** \\ingroup libusb_syncio\n * Perform a USB bulk transfer. The direction of the transfer is inferred from\n * the direction bits of the endpoint address.\n *\n * For bulk reads, the <tt>length</tt> field indicates the maximum length of\n * data you are expecting to receive. If less data arrives than expected,\n * this function will return that data, so be sure to check the\n * <tt>transferred</tt> output parameter.\n *\n * You should also check the <tt>transferred</tt> parameter for bulk writes.\n * Not all of the data may have been written.\n *\n * Also check <tt>transferred</tt> when dealing with a timeout error code.\n * libusb may have to split your transfer into a number of chunks to satisfy\n * underlying O/S requirements, meaning that the timeout may expire after\n * the first few chunks have completed. libusb is careful not to lose any data\n * that may have been transferred; do not assume that timeout conditions\n * indicate a complete lack of I/O.\n *\n * \\param dev_handle a handle for the device to communicate with\n * \\param endpoint the address of a valid endpoint to communicate with\n * \\param data a suitably-sized data buffer for either input or output\n * (depending on endpoint)\n * \\param length for bulk writes, the number of bytes from data to be sent. for\n * bulk reads, the maximum number of bytes to receive into the data buffer.\n * \\param transferred output location for the number of bytes actually\n * transferred. Since version 1.0.21 (\\ref LIBUSB_API_VERSION >= 0x01000105),\n * it is legal to pass a NULL pointer if you do not wish to receive this\n * information.\n * \\param timeout timeout (in millseconds) that this function should wait\n * before giving up due to no response being received. For an unlimited\n * timeout, use value 0.\n *\n * \\returns 0 on success (and populates <tt>transferred</tt>)\n * \\returns LIBUSB_ERROR_TIMEOUT if the transfer timed out (and populates\n * <tt>transferred</tt>)\n * \\returns LIBUSB_ERROR_PIPE if the endpoint halted\n * \\returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see\n * \\ref libusb_packetoverflow\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns LIBUSB_ERROR_BUSY if called from event handling context\n * \\returns another LIBUSB_ERROR code on other failures\n */\nint API_EXPORTED libusb_bulk_transfer(struct libusb_device_handle *dev_handle,\n\tunsigned char endpoint, unsigned char *data, int length, int *transferred,\n\tunsigned int timeout)\n{\n\treturn do_sync_bulk_transfer(dev_handle, endpoint, data, length,\n\t\ttransferred, timeout, LIBUSB_TRANSFER_TYPE_BULK);\n}\n\n/** \\ingroup libusb_syncio\n * Perform a USB interrupt transfer. The direction of the transfer is inferred\n * from the direction bits of the endpoint address.\n *\n * For interrupt reads, the <tt>length</tt> field indicates the maximum length\n * of data you are expecting to receive. If less data arrives than expected,\n * this function will return that data, so be sure to check the\n * <tt>transferred</tt> output parameter.\n *\n * You should also check the <tt>transferred</tt> parameter for interrupt\n * writes. Not all of the data may have been written.\n *\n * Also check <tt>transferred</tt> when dealing with a timeout error code.\n * libusb may have to split your transfer into a number of chunks to satisfy\n * underlying O/S requirements, meaning that the timeout may expire after\n * the first few chunks have completed. libusb is careful not to lose any data\n * that may have been transferred; do not assume that timeout conditions\n * indicate a complete lack of I/O.\n *\n * The default endpoint bInterval value is used as the polling interval.\n *\n * \\param dev_handle a handle for the device to communicate with\n * \\param endpoint the address of a valid endpoint to communicate with\n * \\param data a suitably-sized data buffer for either input or output\n * (depending on endpoint)\n * \\param length for bulk writes, the number of bytes from data to be sent. for\n * bulk reads, the maximum number of bytes to receive into the data buffer.\n * \\param transferred output location for the number of bytes actually\n * transferred. Since version 1.0.21 (\\ref LIBUSB_API_VERSION >= 0x01000105),\n * it is legal to pass a NULL pointer if you do not wish to receive this\n * information.\n * \\param timeout timeout (in millseconds) that this function should wait\n * before giving up due to no response being received. For an unlimited\n * timeout, use value 0.\n *\n * \\returns 0 on success (and populates <tt>transferred</tt>)\n * \\returns LIBUSB_ERROR_TIMEOUT if the transfer timed out\n * \\returns LIBUSB_ERROR_PIPE if the endpoint halted\n * \\returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see\n * \\ref libusb_packetoverflow\n * \\returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected\n * \\returns LIBUSB_ERROR_BUSY if called from event handling context\n * \\returns another LIBUSB_ERROR code on other error\n */\nint API_EXPORTED libusb_interrupt_transfer(\n\tstruct libusb_device_handle *dev_handle, unsigned char endpoint,\n\tunsigned char *data, int length, int *transferred, unsigned int timeout)\n{\n\treturn do_sync_bulk_transfer(dev_handle, endpoint, data, length,\n\t\ttransferred, timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT);\n}\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/version.h",
    "content": "/* This file is parsed by m4 and windres and RC.EXE so please keep it simple. */\n#include \"version_nano.h\"\n#ifndef LIBUSB_MAJOR\n#define LIBUSB_MAJOR 1\n#endif\n#ifndef LIBUSB_MINOR\n#define LIBUSB_MINOR 0\n#endif\n#ifndef LIBUSB_MICRO\n#define LIBUSB_MICRO 21\n#endif\n#ifndef LIBUSB_NANO\n#define LIBUSB_NANO 0\n#endif\n/* LIBUSB_RC is the release candidate suffix. Should normally be empty. */\n#ifndef LIBUSB_RC\n#define LIBUSB_RC \"\"\n#endif\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/libusb/libusb/version_nano.h",
    "content": "#define LIBUSB_NANO 11182\n"
  },
  {
    "path": "vendor/github.com/karalabe/hid/wchar.go",
    "content": "// This file is https://github.com/orofarne/gowchar/blob/master/gowchar.go\n//\n// It was vendored inline to work around CGO limitations that don't allow C types\n// to directly cross package API boundaries.\n//\n// The vendored file is licensed under the 3-clause BSD license, according to:\n// https://github.com/orofarne/gowchar/blob/master/LICENSE\n\n// +build !ios\n// +build linux darwin windows\n\npackage hid\n\n/*\n#include <wchar.h>\n\nconst size_t SIZEOF_WCHAR_T = sizeof(wchar_t);\n\nvoid gowchar_set (wchar_t *arr, int pos, wchar_t val)\n{\n\tarr[pos] = val;\n}\n\nwchar_t gowchar_get (wchar_t *arr, int pos)\n{\n\treturn arr[pos];\n}\n*/\nimport \"C\"\n\nimport (\n\t\"fmt\"\n\t\"unicode/utf16\"\n\t\"unicode/utf8\"\n)\n\nvar sizeofWcharT C.size_t = C.size_t(C.SIZEOF_WCHAR_T)\n\nfunc stringToWcharT(s string) (*C.wchar_t, C.size_t) {\n\tswitch sizeofWcharT {\n\tcase 2:\n\t\treturn stringToWchar2(s) // Windows\n\tcase 4:\n\t\treturn stringToWchar4(s) // Unix\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Invalid sizeof(wchar_t) = %v\", sizeofWcharT))\n\t}\n}\n\nfunc wcharTToString(s *C.wchar_t) (string, error) {\n\tswitch sizeofWcharT {\n\tcase 2:\n\t\treturn wchar2ToString(s) // Windows\n\tcase 4:\n\t\treturn wchar4ToString(s) // Unix\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Invalid sizeof(wchar_t) = %v\", sizeofWcharT))\n\t}\n}\n\nfunc wcharTNToString(s *C.wchar_t, size C.size_t) (string, error) {\n\tswitch sizeofWcharT {\n\tcase 2:\n\t\treturn wchar2NToString(s, size) // Windows\n\tcase 4:\n\t\treturn wchar4NToString(s, size) // Unix\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"Invalid sizeof(wchar_t) = %v\", sizeofWcharT))\n\t}\n}\n\n// Windows\nfunc stringToWchar2(s string) (*C.wchar_t, C.size_t) {\n\tvar slen int\n\ts1 := s\n\tfor len(s1) > 0 {\n\t\tr, size := utf8.DecodeRuneInString(s1)\n\t\tif er, _ := utf16.EncodeRune(r); er == '\\uFFFD' {\n\t\t\tslen += 1\n\t\t} else {\n\t\t\tslen += 2\n\t\t}\n\t\ts1 = s1[size:]\n\t}\n\tslen++ // \\0\n\tres := C.malloc(C.size_t(slen) * sizeofWcharT)\n\tvar i int\n\tfor len(s) > 0 {\n\t\tr, size := utf8.DecodeRuneInString(s)\n\t\tif r1, r2 := utf16.EncodeRune(r); r1 != '\\uFFFD' {\n\t\t\tC.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r1))\n\t\t\ti++\n\t\t\tC.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r2))\n\t\t\ti++\n\t\t} else {\n\t\t\tC.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r))\n\t\t\ti++\n\t\t}\n\t\ts = s[size:]\n\t}\n\tC.gowchar_set((*C.wchar_t)(res), C.int(slen-1), C.wchar_t(0)) // \\0\n\treturn (*C.wchar_t)(res), C.size_t(slen)\n}\n\n// Unix\nfunc stringToWchar4(s string) (*C.wchar_t, C.size_t) {\n\tslen := utf8.RuneCountInString(s)\n\tslen++ // \\0\n\tres := C.malloc(C.size_t(slen) * sizeofWcharT)\n\tvar i int\n\tfor len(s) > 0 {\n\t\tr, size := utf8.DecodeRuneInString(s)\n\t\tC.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r))\n\t\ts = s[size:]\n\t\ti++\n\t}\n\tC.gowchar_set((*C.wchar_t)(res), C.int(slen-1), C.wchar_t(0)) // \\0\n\treturn (*C.wchar_t)(res), C.size_t(slen)\n}\n\n// Windows\nfunc wchar2ToString(s *C.wchar_t) (string, error) {\n\tvar i int\n\tvar res string\n\tfor {\n\t\tch := C.gowchar_get(s, C.int(i))\n\t\tif ch == 0 {\n\t\t\tbreak\n\t\t}\n\t\tr := rune(ch)\n\t\ti++\n\t\tif !utf16.IsSurrogate(r) {\n\t\t\tif !utf8.ValidRune(r) {\n\t\t\t\terr := fmt.Errorf(\"Invalid rune at position %v\", i)\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tres += string(r)\n\t\t} else {\n\t\t\tch2 := C.gowchar_get(s, C.int(i))\n\t\t\tr2 := rune(ch2)\n\t\t\tr12 := utf16.DecodeRune(r, r2)\n\t\t\tif r12 == '\\uFFFD' {\n\t\t\t\terr := fmt.Errorf(\"Invalid surrogate pair at position %v\", i-1)\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tres += string(r12)\n\t\t\ti++\n\t\t}\n\t}\n\treturn res, nil\n}\n\n// Unix\nfunc wchar4ToString(s *C.wchar_t) (string, error) {\n\tvar i int\n\tvar res string\n\tfor {\n\t\tch := C.gowchar_get(s, C.int(i))\n\t\tif ch == 0 {\n\t\t\tbreak\n\t\t}\n\t\tr := rune(ch)\n\t\tif !utf8.ValidRune(r) {\n\t\t\terr := fmt.Errorf(\"Invalid rune at position %v\", i)\n\t\t\treturn \"\", err\n\t\t}\n\t\tres += string(r)\n\t\ti++\n\t}\n\treturn res, nil\n}\n\n// Windows\nfunc wchar2NToString(s *C.wchar_t, size C.size_t) (string, error) {\n\tvar i int\n\tvar res string\n\tN := int(size)\n\tfor i < N {\n\t\tch := C.gowchar_get(s, C.int(i))\n\t\tif ch == 0 {\n\t\t\tbreak\n\t\t}\n\t\tr := rune(ch)\n\t\ti++\n\t\tif !utf16.IsSurrogate(r) {\n\t\t\tif !utf8.ValidRune(r) {\n\t\t\t\terr := fmt.Errorf(\"Invalid rune at position %v\", i)\n\t\t\t\treturn \"\", err\n\t\t\t}\n\n\t\t\tres += string(r)\n\t\t} else {\n\t\t\tif i >= N {\n\t\t\t\terr := fmt.Errorf(\"Invalid surrogate pair at position %v\", i-1)\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tch2 := C.gowchar_get(s, C.int(i))\n\t\t\tr2 := rune(ch2)\n\t\t\tr12 := utf16.DecodeRune(r, r2)\n\t\t\tif r12 == '\\uFFFD' {\n\t\t\t\terr := fmt.Errorf(\"Invalid surrogate pair at position %v\", i-1)\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tres += string(r12)\n\t\t\ti++\n\t\t}\n\t}\n\treturn res, nil\n}\n\n// Unix\nfunc wchar4NToString(s *C.wchar_t, size C.size_t) (string, error) {\n\tvar i int\n\tvar res string\n\tN := int(size)\n\tfor i < N {\n\t\tch := C.gowchar_get(s, C.int(i))\n\t\tr := rune(ch)\n\t\tif !utf8.ValidRune(r) {\n\t\t\terr := fmt.Errorf(\"Invalid rune at position %v\", i)\n\t\t\treturn \"\", err\n\t\t}\n\t\tres += string(r)\n\t\ti++\n\t}\n\treturn res, nil\n}\n"
  },
  {
    "path": "vendor/github.com/maruel/panicparse/.travis.yml",
    "content": "# Copyright 2014 Marc-Antoine Ruel. All rights reserved.\n# Use of this source code is governed under the Apache License, Version 2.0\n# that can be found in the LICENSE file.\n\nsudo: false\nlanguage: go\n\ngo:\n- tip\n\nbefore_install:\n  - go get github.com/maruel/pre-commit-go/cmd/pcg\n\nscript:\n  - pcg\n"
  },
  {
    "path": "vendor/github.com/maruel/panicparse/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2015 Marc-Antoine Ruel\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/maruel/panicparse/README.md",
    "content": "panicparse\n==========\n\nParses panic stack traces, densifies and deduplicates goroutines with similar\nstack traces. Helps debugging crashes and deadlocks in heavily parallelized\nprocess.\n\n[![Build Status](https://travis-ci.org/maruel/panicparse.svg?branch=master)](https://travis-ci.org/maruel/panicparse)\n\npanicparse helps make sense of Go crash dumps:\n\n![Screencast](https://raw.githubusercontent.com/wiki/maruel/panicparse/parse.gif \"Screencast\")\n\n\nFeatures\n--------\n\n   * >50% more compact output than original stack dump yet more readable.\n   * Exported symbols are bold, private symbols are darker.\n   * Stdlib is green, main is yellow, rest is red.\n   * Deduplicates redundant goroutine stacks. Useful for large server crashes.\n   * Arguments as pointer IDs instead of raw pointer values.\n   * Pushes stdlib-only stacks at the bottom to help focus on important code.\n   * Usable as a library!\n     [![GoDoc](https://godoc.org/github.com/maruel/panicparse/stack?status.svg)](https://godoc.org/github.com/maruel/panicparse/stack)\n     * Warning: please pin the version (e.g. vendor it). Breaking changes are\n       not planned but may happen.\n   * Parses the source files if available to augment the output.\n   * Works on Windows.\n\n\nInstallation\n------------\n\n    go get github.com/maruel/panicparse/cmd/pp\n\n\nUsage\n-----\n\n### Piping a stack trace from another process\n\n#### TL;DR\n\n   * Ubuntu (bash v4 or zsh): `|&`\n   * OSX, [install bash 4+](README.md#updating-bash-on-osx), then: `|&`\n   * Windows _or_ OSX with stock bash v3: `2>&1 |`\n   * [Fish](http://fishshell.com/) shell: `^|`\n\n\n#### Longer version\n\n`pp` streams its stdin to stdout as long as it doesn't detect any panic.\n`panic()` and Go's native deadlock detector [print to\nstderr](https://golang.org/src/runtime/panic1.go) via the native [`print()`\nfunction](https://golang.org/pkg/builtin/#print).\n\n\n**Bash v4** or **zsh**: `|&` tells the shell to redirect stderr to stdout,\nit's an alias for `2>&1 |` ([bash\nv4](https://www.gnu.org/software/bash/manual/bash.html#Pipelines),\n[zsh](http://zsh.sourceforge.net/Doc/Release/Shell-Grammar.html#Simple-Commands-_0026-Pipelines)):\n\n    go test -v |&pp\n\n\n**Windows or OSX native bash** [(which is\n3.2.57)](http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/): They don't\nhave this shortcut, so use the long form:\n\n    go test -v 2>&1 | pp\n\n\n**Fish**: It uses [^ for stderr\nredirection](http://fishshell.com/docs/current/tutorial.html#tut_pipes_and_redirections)\nso the shortcut is `^|`:\n\n    go test -v ^|pp\n\n\n**PowerShell**: [It has broken `2>&1` redirection](https://connect.microsoft.com/PowerShell/feedback/details/765551/in-powershell-v3-you-cant-redirect-stderr-to-stdout-without-generating-error-records). The workaround is to shell out to cmd.exe. :(\n\n\n### Investigate deadlock\n\nOn POSIX, use `Ctrl-\\` to send SIGQUIT to your process, `pp` will ignore\nthe signal and will parse the stack trace.\n\n\n### Parsing from a file\n\nTo dump to a file then parse, pass the file path of a stack trace\n\n    go test 2> stack.txt\n    pp stack.txt\n\n\nTips\n----\n\n### GOTRACEBACK\n\nStarting with Go 1.6, [`GOTRACEBACK`](https://golang.org/pkg/runtime/) defaults\nto `single` instead of `all` / `1` that was used in 1.5 and before. To get all\ngoroutines trace and not just the crashing one, set the environment variable:\n\n    export GOTRACEBACK=all\n\nor `set GOTRACEBACK=all` on Windows. Probably worth to put it in your `.bashrc`.\n\n\n### Updating bash on OSX\n\nInstall bash v4+ on OSX via [homebrew](http://brew.sh) or\n[macports](https://www.macports.org/). Your future self will appreciate having\ndone that.\n\n\n### If you have `/usr/bin/pp` installed\n\nYou may have the Perl PAR Packager installed. Use long name `panicparse` then;\n\n    go get github.com/maruel/panicparse\n"
  },
  {
    "path": "vendor/github.com/maruel/panicparse/stack/source.go",
    "content": "// Copyright 2015 Marc-Antoine Ruel. All rights reserved.\n// Use of this source code is governed under the Apache License, Version 2.0\n// that can be found in the LICENSE file.\n\n// This file contains the code to process sources, to be able to deduct the\n// original types.\n\npackage stack\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"math\"\n\t\"strings\"\n)\n\n// cache is a cache of sources on the file system.\ntype cache struct {\n\tfiles  map[string][]byte\n\tparsed map[string]*parsedFile\n}\n\n// Augment processes source files to improve calls to be more descriptive.\n//\n// It modifies goroutines in place.\nfunc Augment(goroutines []Goroutine) {\n\tc := &cache{}\n\tfor i := range goroutines {\n\t\tc.augmentGoroutine(&goroutines[i])\n\t}\n}\n\n// augmentGoroutine processes source files to improve call to be more\n// descriptive.\n//\n// It modifies the routine.\nfunc (c *cache) augmentGoroutine(goroutine *Goroutine) {\n\tif c.files == nil {\n\t\tc.files = map[string][]byte{}\n\t}\n\tif c.parsed == nil {\n\t\tc.parsed = map[string]*parsedFile{}\n\t}\n\t// For each call site, look at the next call and populate it. Then we can\n\t// walk back and reformat things.\n\tfor i := range goroutine.Stack.Calls {\n\t\tc.load(goroutine.Stack.Calls[i].SourcePath)\n\t}\n\n\t// Once all loaded, we can look at the next call when available.\n\tfor i := 1; i < len(goroutine.Stack.Calls); i++ {\n\t\t// Get the AST from the previous call and process the call line with it.\n\t\tif f := c.getFuncAST(&goroutine.Stack.Calls[i]); f != nil {\n\t\t\tprocessCall(&goroutine.Stack.Calls[i], f)\n\t\t}\n\t}\n}\n\n// Private stuff.\n\n// load loads a source file and parses the AST tree. Failures are ignored.\nfunc (c *cache) load(fileName string) {\n\tif _, ok := c.parsed[fileName]; ok {\n\t\treturn\n\t}\n\tc.parsed[fileName] = nil\n\tif !strings.HasSuffix(fileName, \".go\") {\n\t\t// Ignore C and assembly.\n\t\tc.files[fileName] = nil\n\t\treturn\n\t}\n\tlog.Printf(\"load(%s)\", fileName)\n\tif _, ok := c.files[fileName]; !ok {\n\t\tvar err error\n\t\tif c.files[fileName], err = ioutil.ReadFile(fileName); err != nil {\n\t\t\tlog.Printf(\"Failed to read %s: %s\", fileName, err)\n\t\t\tc.files[fileName] = nil\n\t\t\treturn\n\t\t}\n\t}\n\tfset := token.NewFileSet()\n\tsrc := c.files[fileName]\n\tparsed, err := parser.ParseFile(fset, fileName, src, 0)\n\tif err != nil {\n\t\tlog.Printf(\"Failed to parse %s: %s\", fileName, err)\n\t\treturn\n\t}\n\t// Convert the line number into raw file offset.\n\toffsets := []int{0, 0}\n\tstart := 0\n\tfor l := 1; start < len(src); l++ {\n\t\tstart += bytes.IndexByte(src[start:], '\\n') + 1\n\t\toffsets = append(offsets, start)\n\t}\n\tc.parsed[fileName] = &parsedFile{offsets, parsed}\n}\n\nfunc (c *cache) getFuncAST(call *Call) *ast.FuncDecl {\n\tif p := c.parsed[call.SourcePath]; p != nil {\n\t\treturn p.getFuncAST(call.Func.Name(), call.Line)\n\t}\n\treturn nil\n}\n\ntype parsedFile struct {\n\tlineToByteOffset []int\n\tparsed           *ast.File\n}\n\n// getFuncAST gets the callee site function AST representation for the code\n// inside the function f at line l.\nfunc (p *parsedFile) getFuncAST(f string, l int) (d *ast.FuncDecl) {\n\t// Walk the AST to find the lineToByteOffset that fits the line number.\n\tvar lastFunc *ast.FuncDecl\n\tvar found ast.Node\n\t// Inspect() goes depth first. This means for example that a function like:\n\t// func a() {\n\t//   b := func() {}\n\t//   c()\n\t// }\n\t//\n\t// Were we are looking at the c() call can return confused values. It is\n\t// important to look at the actual ast.Node hierarchy.\n\tast.Inspect(p.parsed, func(n ast.Node) bool {\n\t\tif d != nil {\n\t\t\treturn false\n\t\t}\n\t\tif n == nil {\n\t\t\treturn true\n\t\t}\n\t\tif found != nil {\n\t\t\t// We are walking up.\n\t\t}\n\t\tif int(n.Pos()) >= p.lineToByteOffset[l] {\n\t\t\t// We are expecting a ast.CallExpr node. It can be harder to figure out\n\t\t\t// when there are multiple calls on a single line, as the stack trace\n\t\t\t// doesn't have file byte offset information, only line based.\n\t\t\t// gofmt will always format to one function call per line but there can\n\t\t\t// be edge cases, like:\n\t\t\t//   a = A{Foo(), Bar()}\n\t\t\td = lastFunc\n\t\t\t//p.processNode(call, n)\n\t\t\treturn false\n\t\t} else if f, ok := n.(*ast.FuncDecl); ok {\n\t\t\tlastFunc = f\n\t\t}\n\t\treturn true\n\t})\n\treturn\n}\n\nfunc name(n ast.Node) string {\n\tif _, ok := n.(*ast.InterfaceType); ok {\n\t\treturn \"interface{}\"\n\t}\n\tif i, ok := n.(*ast.Ident); ok {\n\t\treturn i.Name\n\t}\n\tif _, ok := n.(*ast.FuncType); ok {\n\t\treturn \"func\"\n\t}\n\tif s, ok := n.(*ast.SelectorExpr); ok {\n\t\treturn s.Sel.Name\n\t}\n\t// TODO(maruel): Implement anything missing.\n\treturn \"<unknown>\"\n}\n\n// fieldToType returns the type name and whether if it's an ellipsis.\nfunc fieldToType(f *ast.Field) (string, bool) {\n\tswitch arg := f.Type.(type) {\n\tcase *ast.ArrayType:\n\t\treturn \"[]\" + name(arg.Elt), false\n\tcase *ast.Ellipsis:\n\t\treturn name(arg.Elt), true\n\tcase *ast.FuncType:\n\t\t// Do not print the function signature to not overload the trace.\n\t\treturn \"func\", false\n\tcase *ast.Ident:\n\t\treturn arg.Name, false\n\tcase *ast.InterfaceType:\n\t\treturn \"interface{}\", false\n\tcase *ast.SelectorExpr:\n\t\treturn arg.Sel.Name, false\n\tcase *ast.StarExpr:\n\t\treturn \"*\" + name(arg.X), false\n\tdefault:\n\t\t// TODO(maruel): Implement anything missing.\n\t\treturn \"<unknown>\", false\n\t}\n}\n\n// extractArgumentsType returns the name of the type of each input argument.\nfunc extractArgumentsType(f *ast.FuncDecl) ([]string, bool) {\n\tvar fields []*ast.Field\n\tif f.Recv != nil {\n\t\tif len(f.Recv.List) != 1 {\n\t\t\tpanic(\"Expect only one receiver; please fix panicparse's code\")\n\t\t}\n\t\t// If it is an object receiver (vs a pointer receiver), its address is not\n\t\t// printed in the stack trace so it needs to be ignored.\n\t\tif _, ok := f.Recv.List[0].Type.(*ast.StarExpr); ok {\n\t\t\tfields = append(fields, f.Recv.List[0])\n\t\t}\n\t}\n\tvar types []string\n\textra := false\n\tfor _, arg := range append(fields, f.Type.Params.List...) {\n\t\t// Assert that extra is only set on the last item of fields?\n\t\tvar t string\n\t\tt, extra = fieldToType(arg)\n\t\tmult := len(arg.Names)\n\t\tif mult == 0 {\n\t\t\tmult = 1\n\t\t}\n\t\tfor i := 0; i < mult; i++ {\n\t\t\ttypes = append(types, t)\n\t\t}\n\t}\n\treturn types, extra\n}\n\n// processCall walks the function and populate call accordingly.\nfunc processCall(call *Call, f *ast.FuncDecl) {\n\tvalues := make([]uint64, len(call.Args.Values))\n\tfor i := range call.Args.Values {\n\t\tvalues[i] = call.Args.Values[i].Value\n\t}\n\tindex := 0\n\tpop := func() uint64 {\n\t\tif len(values) != 0 {\n\t\t\tx := values[0]\n\t\t\tvalues = values[1:]\n\t\t\tindex++\n\t\t\treturn x\n\t\t}\n\t\treturn 0\n\t}\n\tpopName := func() string {\n\t\tn := call.Args.Values[index].Name\n\t\tv := pop()\n\t\tif len(n) == 0 {\n\t\t\treturn fmt.Sprintf(\"0x%x\", v)\n\t\t}\n\t\treturn n\n\t}\n\n\ttypes, extra := extractArgumentsType(f)\n\tfor i := 0; len(values) != 0; i++ {\n\t\tvar t string\n\t\tif i >= len(types) {\n\t\t\tif !extra {\n\t\t\t\t// These are unexpected value! Print them as hex.\n\t\t\t\tcall.Args.Processed = append(call.Args.Processed, popName())\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tt = types[len(types)-1]\n\t\t} else {\n\t\t\tt = types[i]\n\t\t}\n\t\tswitch t {\n\t\tcase \"float32\":\n\t\t\tcall.Args.Processed = append(call.Args.Processed, fmt.Sprintf(\"%g\", math.Float32frombits(uint32(pop()))))\n\t\tcase \"float64\":\n\t\t\tcall.Args.Processed = append(call.Args.Processed, fmt.Sprintf(\"%g\", math.Float64frombits(pop())))\n\t\tcase \"int\", \"int8\", \"int16\", \"int32\", \"int64\", \"uint\", \"uint8\", \"uint16\", \"uint32\", \"uint64\":\n\t\t\tcall.Args.Processed = append(call.Args.Processed, fmt.Sprintf(\"%d\", pop()))\n\t\tcase \"string\":\n\t\t\tcall.Args.Processed = append(call.Args.Processed, fmt.Sprintf(\"%s(%s, len=%d)\", t, popName(), pop()))\n\t\tdefault:\n\t\t\tif strings.HasPrefix(t, \"*\") {\n\t\t\t\tcall.Args.Processed = append(call.Args.Processed, fmt.Sprintf(\"%s(%s)\", t, popName()))\n\t\t\t} else if strings.HasPrefix(t, \"[]\") {\n\t\t\t\tcall.Args.Processed = append(call.Args.Processed, fmt.Sprintf(\"%s(%s len=%d cap=%d)\", t, popName(), pop(), pop()))\n\t\t\t} else {\n\t\t\t\t// Assumes it's an interface. For now, discard the object value, which\n\t\t\t\t// is probably not a good idea.\n\t\t\t\tcall.Args.Processed = append(call.Args.Processed, fmt.Sprintf(\"%s(%s)\", t, popName()))\n\t\t\t\tpop()\n\t\t\t}\n\t\t}\n\t\tif len(values) == 0 && call.Args.Elided {\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/maruel/panicparse/stack/stack.go",
    "content": "// Copyright 2015 Marc-Antoine Ruel. All rights reserved.\n// Use of this source code is governed under the Apache License, Version 2.0\n// that can be found in the LICENSE file.\n\n// Package stack analyzes stack dump of Go processes and simplifies it.\n//\n// It is mostly useful on servers will large number of identical goroutines,\n// making the crash dump harder to read than strictly necesary.\npackage stack\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\nconst lockedToThread = \"locked to thread\"\n\nvar (\n\t// TODO(maruel): Handle corrupted stack cases:\n\t// - missed stack barrier\n\t// - found next stack barrier at 0x123; expected\n\t// - runtime: unexpected return pc for FUNC_NAME called from 0x123\n\n\treRoutineHeader = regexp.MustCompile(\"^goroutine (\\\\d+) \\\\[([^\\\\]]+)\\\\]\\\\:\\n$\")\n\treMinutes       = regexp.MustCompile(\"^(\\\\d+) minutes$\")\n\treUnavail       = regexp.MustCompile(\"^(?:\\t| +)goroutine running on other thread; stack unavailable\")\n\t// See gentraceback() in src/runtime/traceback.go for more information.\n\t// - Sometimes the source file comes up as \"<autogenerated>\". It is the\n\t//   compiler than generated these, not the runtime.\n\t// - The tab may be replaced with spaces when a user copy-paste it, handle\n\t//   this transparently.\n\t// - \"runtime.gopanic\" is explicitly replaced with \"panic\" by gentraceback().\n\t// - The +0x123 byte offset is printed when frame.pc > _func.entry. _func is\n\t//   generated by the linker.\n\t// - The +0x123 byte offset is not included with generated code, e.g. unnamed\n\t//   functions \"func·006()\" which is generally go func() { ... }()\n\t//   statements. Since the _func is generated at runtime, it's probably why\n\t//   _func.entry is not set.\n\t// - C calls may have fp=0x123 sp=0x123 appended. I think it normally happens\n\t//   when a signal is not correctly handled. It is printed with m.throwing>0.\n\t//   These are discarded.\n\t// - For cgo, the source file may be \"??\".\n\treFile = regexp.MustCompile(\"^(?:\\t| +)(\\\\?\\\\?|\\\\<autogenerated\\\\>|.+\\\\.(?:c|go|s))\\\\:(\\\\d+)(?:| \\\\+0x[0-9a-f]+)(?:| fp=0x[0-9a-f]+ sp=0x[0-9a-f]+)\\n$\")\n\t// Sadly, it doesn't note the goroutine number so we could cascade them per\n\t// parenthood.\n\treCreated = regexp.MustCompile(\"^created by (.+)\\n$\")\n\treFunc    = regexp.MustCompile(\"^(.+)\\\\((.*)\\\\)\\n$\")\n\treElided  = regexp.MustCompile(\"^\\\\.\\\\.\\\\.additional frames elided\\\\.\\\\.\\\\.\\n$\")\n\t// Include frequent GOROOT value on Windows, distro provided and user\n\t// installed path. This simplifies the user's life when processing a trace\n\t// generated on another VM.\n\t// TODO(maruel): Guess the path automatically via traces containing the\n\t// 'runtime' package, which is very frequent. This would be \"less bad\" than\n\t// throwing up random values at the parser.\n\tgoroots = []string{runtime.GOROOT(), \"c:/go\", \"/usr/lib/go\", \"/usr/local/go\"}\n)\n\n// Similarity is the level at which two call lines arguments must match to be\n// considered similar enough to coalesce them.\ntype Similarity int\n\nconst (\n\t// ExactFlags requires same bits (e.g. Locked).\n\tExactFlags Similarity = iota\n\t// ExactLines requests the exact same arguments on the call line.\n\tExactLines\n\t// AnyPointer considers different pointers a similar call line.\n\tAnyPointer\n\t// AnyValue accepts any value as similar call line.\n\tAnyValue\n)\n\n// Function is a function call.\n//\n// Go stack traces print a mangled function call, this wrapper unmangle the\n// string before printing and adds other filtering methods.\ntype Function struct {\n\tRaw string\n}\n\n// String is the fully qualified function name.\n//\n// Sadly Go is a bit confused when the package name doesn't match the directory\n// containing the source file and will use the directory name instead of the\n// real package name.\nfunc (f Function) String() string {\n\ts, _ := url.QueryUnescape(f.Raw)\n\treturn s\n}\n\n// Name is the naked function name.\nfunc (f Function) Name() string {\n\tparts := strings.SplitN(filepath.Base(f.Raw), \".\", 2)\n\tif len(parts) == 1 {\n\t\treturn parts[0]\n\t}\n\treturn parts[1]\n}\n\n// PkgName is the package name for this function reference.\nfunc (f Function) PkgName() string {\n\tparts := strings.SplitN(filepath.Base(f.Raw), \".\", 2)\n\tif len(parts) == 1 {\n\t\treturn \"\"\n\t}\n\ts, _ := url.QueryUnescape(parts[0])\n\treturn s\n}\n\n// PkgDotName returns \"<package>.<func>\" format.\nfunc (f Function) PkgDotName() string {\n\tparts := strings.SplitN(filepath.Base(f.Raw), \".\", 2)\n\ts, _ := url.QueryUnescape(parts[0])\n\tif len(parts) == 1 {\n\t\treturn parts[0]\n\t}\n\tif s != \"\" || parts[1] != \"\" {\n\t\treturn s + \".\" + parts[1]\n\t}\n\treturn \"\"\n}\n\n// IsExported returns true if the function is exported.\nfunc (f Function) IsExported() bool {\n\tname := f.Name()\n\tparts := strings.Split(name, \".\")\n\tr, _ := utf8.DecodeRuneInString(parts[len(parts)-1])\n\tif unicode.ToUpper(r) == r {\n\t\treturn true\n\t}\n\treturn f.PkgName() == \"main\" && name == \"main\"\n}\n\n// Arg is an argument on a Call.\ntype Arg struct {\n\tValue uint64 // Value is the raw value as found in the stack trace\n\tName  string // Name is a pseudo name given to the argument\n}\n\n// IsPtr returns true if we guess it's a pointer. It's only a guess, it can be\n// easily be confused by a bitmask.\nfunc (a *Arg) IsPtr() bool {\n\t// Assumes all pointers are above 16Mb and positive.\n\treturn a.Value > 16*1024*1024 && a.Value < math.MaxInt64\n}\n\nfunc (a Arg) String() string {\n\tif a.Name != \"\" {\n\t\treturn a.Name\n\t}\n\tif a.Value == 0 {\n\t\treturn \"0\"\n\t}\n\treturn fmt.Sprintf(\"0x%x\", a.Value)\n}\n\n// Args is a series of function call arguments.\ntype Args struct {\n\tValues    []Arg    // Values is the arguments as shown on the stack trace. They are mangled via simplification.\n\tProcessed []string // Processed is the arguments generated from processing the source files. It can have a length lower than Values.\n\tElided    bool     // If set, it means there was a trailing \", ...\"\n}\n\nfunc (a Args) String() string {\n\tvar v []string\n\tif len(a.Processed) != 0 {\n\t\tv = make([]string, 0, len(a.Processed))\n\t\tfor _, item := range a.Processed {\n\t\t\tv = append(v, item)\n\t\t}\n\t} else {\n\t\tv = make([]string, 0, len(a.Values))\n\t\tfor _, item := range a.Values {\n\t\t\tv = append(v, item.String())\n\t\t}\n\t}\n\tif a.Elided {\n\t\tv = append(v, \"...\")\n\t}\n\treturn strings.Join(v, \", \")\n}\n\n// Equal returns true only if both arguments are exactly equal.\nfunc (a *Args) Equal(r *Args) bool {\n\tif a.Elided != r.Elided || len(a.Values) != len(r.Values) {\n\t\treturn false\n\t}\n\tfor i, l := range a.Values {\n\t\tif l != r.Values[i] {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// Similar returns true if the two Args are equal or almost but not quite\n// equal.\nfunc (a *Args) Similar(r *Args, similar Similarity) bool {\n\tif a.Elided != r.Elided || len(a.Values) != len(r.Values) {\n\t\treturn false\n\t}\n\tif similar == AnyValue {\n\t\treturn true\n\t}\n\tfor i, l := range a.Values {\n\t\tswitch similar {\n\t\tcase ExactFlags, ExactLines:\n\t\t\tif l != r.Values[i] {\n\t\t\t\treturn false\n\t\t\t}\n\t\tdefault:\n\t\t\tif l.IsPtr() != r.Values[i].IsPtr() || (!l.IsPtr() && l != r.Values[i]) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn true\n}\n\n// Merge merges two similar Args, zapping out differences.\nfunc (a *Args) Merge(r *Args) Args {\n\tout := Args{\n\t\tValues: make([]Arg, len(a.Values)),\n\t\tElided: a.Elided,\n\t}\n\tfor i, l := range a.Values {\n\t\tif l != r.Values[i] {\n\t\t\tout.Values[i].Name = \"*\"\n\t\t\tout.Values[i].Value = l.Value\n\t\t} else {\n\t\t\tout.Values[i] = l\n\t\t}\n\t}\n\treturn out\n}\n\n// Call is an item in the stack trace.\ntype Call struct {\n\tSourcePath string   // Full path name of the source file\n\tLine       int      // Line number\n\tFunc       Function // Fully qualified function name (encoded).\n\tArgs       Args     // Call arguments\n}\n\n// Equal returns true only if both calls are exactly equal.\nfunc (c *Call) Equal(r *Call) bool {\n\treturn c.SourcePath == r.SourcePath && c.Line == r.Line && c.Func == r.Func && c.Args.Equal(&r.Args)\n}\n\n// Similar returns true if the two Call are equal or almost but not quite\n// equal.\nfunc (c *Call) Similar(r *Call, similar Similarity) bool {\n\treturn c.SourcePath == r.SourcePath && c.Line == r.Line && c.Func == r.Func && c.Args.Similar(&r.Args, similar)\n}\n\n// Merge merges two similar Call, zapping out differences.\nfunc (c *Call) Merge(r *Call) Call {\n\treturn Call{\n\t\tSourcePath: c.SourcePath,\n\t\tLine:       c.Line,\n\t\tFunc:       c.Func,\n\t\tArgs:       c.Args.Merge(&r.Args),\n\t}\n}\n\n// SourceName returns the base file name of the source file.\nfunc (c *Call) SourceName() string {\n\treturn filepath.Base(c.SourcePath)\n}\n\n// SourceLine returns \"source.go:line\", including only the base file name.\nfunc (c *Call) SourceLine() string {\n\treturn fmt.Sprintf(\"%s:%d\", c.SourceName(), c.Line)\n}\n\n// FullSourceLine returns \"/path/to/source.go:line\".\nfunc (c *Call) FullSourceLine() string {\n\treturn fmt.Sprintf(\"%s:%d\", c.SourcePath, c.Line)\n}\n\n// PkgSource is one directory plus the file name of the source file.\nfunc (c *Call) PkgSource() string {\n\treturn filepath.Join(filepath.Base(filepath.Dir(c.SourcePath)), c.SourceName())\n}\n\nconst testMainSource = \"_test\" + string(os.PathSeparator) + \"_testmain.go\"\n\n// IsStdlib returns true if it is a Go standard library function. This includes\n// the 'go test' generated main executable.\nfunc (c *Call) IsStdlib() bool {\n\tfor _, goroot := range goroots {\n\t\tif strings.HasPrefix(c.SourcePath, goroot) {\n\t\t\treturn true\n\t\t}\n\t}\n\t// Consider _test/_testmain.go as stdlib since it's injected by \"go test\".\n\treturn c.PkgSource() == testMainSource\n}\n\n// IsPkgMain returns true if it is in the main package.\nfunc (c *Call) IsPkgMain() bool {\n\treturn c.Func.PkgName() == \"main\"\n}\n\n// Stack is a call stack.\ntype Stack struct {\n\tCalls  []Call // Call stack. First is original function, last is leaf function.\n\tElided bool   // Happens when there's >100 items in Stack, currently hardcoded in package runtime.\n}\n\n// Equal returns true on if both call stacks are exactly equal.\nfunc (s *Stack) Equal(r *Stack) bool {\n\tif len(s.Calls) != len(r.Calls) || s.Elided != r.Elided {\n\t\treturn false\n\t}\n\tfor i := range s.Calls {\n\t\tif !s.Calls[i].Equal(&r.Calls[i]) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// Similar returns true if the two Stack are equal or almost but not quite\n// equal.\nfunc (s *Stack) Similar(r *Stack, similar Similarity) bool {\n\tif len(s.Calls) != len(r.Calls) || s.Elided != r.Elided {\n\t\treturn false\n\t}\n\tfor i := range s.Calls {\n\t\tif !s.Calls[i].Similar(&r.Calls[i], similar) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// Merge merges two similar Stack, zapping out differences.\nfunc (s *Stack) Merge(r *Stack) *Stack {\n\t// Assumes similar stacks have the same length.\n\tout := &Stack{\n\t\tCalls:  make([]Call, len(s.Calls)),\n\t\tElided: s.Elided,\n\t}\n\tfor i := range s.Calls {\n\t\tout.Calls[i] = s.Calls[i].Merge(&r.Calls[i])\n\t}\n\treturn out\n}\n\n// Less compares two Stack, where the ones that are less are more\n// important, so they come up front. A Stack with more private functions is\n// 'less' so it is at the top. Inversely, a Stack with only public\n// functions is 'more' so it is at the bottom.\nfunc (s *Stack) Less(r *Stack) bool {\n\tlStdlib := 0\n\tlPrivate := 0\n\tfor _, c := range s.Calls {\n\t\tif c.IsStdlib() {\n\t\t\tlStdlib++\n\t\t} else {\n\t\t\tlPrivate++\n\t\t}\n\t}\n\trStdlib := 0\n\trPrivate := 0\n\tfor _, s := range r.Calls {\n\t\tif s.IsStdlib() {\n\t\t\trStdlib++\n\t\t} else {\n\t\t\trPrivate++\n\t\t}\n\t}\n\tif lPrivate > rPrivate {\n\t\treturn true\n\t}\n\tif lPrivate < rPrivate {\n\t\treturn false\n\t}\n\tif lStdlib > rStdlib {\n\t\treturn false\n\t}\n\tif lStdlib < rStdlib {\n\t\treturn true\n\t}\n\n\t// Stack lengths are the same.\n\tfor x := range s.Calls {\n\t\tif s.Calls[x].Func.Raw < r.Calls[x].Func.Raw {\n\t\t\treturn true\n\t\t}\n\t\tif s.Calls[x].Func.Raw > r.Calls[x].Func.Raw {\n\t\t\treturn true\n\t\t}\n\t\tif s.Calls[x].PkgSource() < r.Calls[x].PkgSource() {\n\t\t\treturn true\n\t\t}\n\t\tif s.Calls[x].PkgSource() > r.Calls[x].PkgSource() {\n\t\t\treturn true\n\t\t}\n\t\tif s.Calls[x].Line < r.Calls[x].Line {\n\t\t\treturn true\n\t\t}\n\t\tif s.Calls[x].Line > r.Calls[x].Line {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Signature represents the signature of one or multiple goroutines.\n//\n// It is effectively the stack trace plus the goroutine internal bits, like\n// it's state, if it is thread locked, which call site created this goroutine,\n// etc.\ntype Signature struct {\n\t// Use git grep 'gopark(|unlock)\\(' to find them all plus everything listed\n\t// in runtime/traceback.go. Valid values includes:\n\t//     - chan send, chan receive, select\n\t//     - finalizer wait, mark wait (idle),\n\t//     - Concurrent GC wait, GC sweep wait, force gc (idle)\n\t//     - IO wait, panicwait\n\t//     - semacquire, semarelease\n\t//     - sleep, timer goroutine (idle)\n\t//     - trace reader (blocked)\n\t// Stuck cases:\n\t//     - chan send (nil chan), chan receive (nil chan), select (no cases)\n\t// Runnable states:\n\t//    - idle, runnable, running, syscall, waiting, dead, enqueue, copystack,\n\t// Scan states:\n\t//    - scan, scanrunnable, scanrunning, scansyscall, scanwaiting, scandead,\n\t//      scanenqueue\n\tState     string\n\tCreatedBy Call // Which other goroutine which created this one.\n\tSleepMin  int  // Wait time in minutes, if applicable.\n\tSleepMax  int  // Wait time in minutes, if applicable.\n\tStack     Stack\n\tLocked    bool // Locked to an OS thread.\n}\n\n// Equal returns true only if both signatures are exactly equal.\nfunc (s *Signature) Equal(r *Signature) bool {\n\tif s.State != r.State || !s.CreatedBy.Equal(&r.CreatedBy) || s.Locked != r.Locked || s.SleepMin != r.SleepMin || s.SleepMax != r.SleepMax {\n\t\treturn false\n\t}\n\treturn s.Stack.Equal(&r.Stack)\n}\n\n// Similar returns true if the two Signature are equal or almost but not quite\n// equal.\nfunc (s *Signature) Similar(r *Signature, similar Similarity) bool {\n\tif s.State != r.State || !s.CreatedBy.Similar(&r.CreatedBy, similar) {\n\t\treturn false\n\t}\n\tif similar == ExactFlags && s.Locked != r.Locked {\n\t\treturn false\n\t}\n\treturn s.Stack.Similar(&r.Stack, similar)\n}\n\n// Merge merges two similar Signature, zapping out differences.\nfunc (s *Signature) Merge(r *Signature) *Signature {\n\tmin := s.SleepMin\n\tif r.SleepMin < min {\n\t\tmin = r.SleepMin\n\t}\n\tmax := s.SleepMax\n\tif r.SleepMax > max {\n\t\tmax = r.SleepMax\n\t}\n\treturn &Signature{\n\t\tState:     s.State,     // Drop right side.\n\t\tCreatedBy: s.CreatedBy, // Drop right side.\n\t\tSleepMin:  min,\n\t\tSleepMax:  max,\n\t\tStack:     *s.Stack.Merge(&r.Stack),\n\t\tLocked:    s.Locked || r.Locked, // TODO(maruel): This is weirdo.\n\t}\n}\n\n// Less compares two Signature, where the ones that are less are more\n// important, so they come up front. A Signature with more private functions is\n// 'less' so it is at the top. Inversely, a Signature with only public\n// functions is 'more' so it is at the bottom.\nfunc (s *Signature) Less(r *Signature) bool {\n\tif s.Stack.Less(&r.Stack) {\n\t\treturn true\n\t}\n\tif r.Stack.Less(&s.Stack) {\n\t\treturn false\n\t}\n\tif s.Locked && !r.Locked {\n\t\treturn true\n\t}\n\tif r.Locked && !s.Locked {\n\t\treturn false\n\t}\n\tif s.State < r.State {\n\t\treturn true\n\t}\n\tif s.State > r.State {\n\t\treturn false\n\t}\n\treturn false\n}\n\n// Goroutine represents the state of one goroutine, including the stack trace.\ntype Goroutine struct {\n\tSignature      // It's stack trace, internal bits, state, which call site created it, etc.\n\tID        int  // Goroutine ID.\n\tFirst     bool // First is the goroutine first printed, normally the one that crashed.\n}\n\n// Bucketize returns the number of similar goroutines.\nfunc Bucketize(goroutines []Goroutine, similar Similarity) map[*Signature][]Goroutine {\n\tout := map[*Signature][]Goroutine{}\n\t// O(n²). Fix eventually.\n\tfor _, routine := range goroutines {\n\t\tfound := false\n\t\tfor key := range out {\n\t\t\t// When a match is found, this effectively drops the other goroutine ID.\n\t\t\tif key.Similar(&routine.Signature, similar) {\n\t\t\t\tfound = true\n\t\t\t\tif !key.Equal(&routine.Signature) {\n\t\t\t\t\t// Almost but not quite equal. There's different pointers passed\n\t\t\t\t\t// around but the same values. Zap out the different values.\n\t\t\t\t\tnewKey := key.Merge(&routine.Signature)\n\t\t\t\t\tout[newKey] = append(out[key], routine)\n\t\t\t\t\tdelete(out, key)\n\t\t\t\t} else {\n\t\t\t\t\tout[key] = append(out[key], routine)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\tkey := &Signature{}\n\t\t\t*key = routine.Signature\n\t\t\tout[key] = []Goroutine{routine}\n\t\t}\n\t}\n\treturn out\n}\n\n// Bucket is a stack trace signature and the list of goroutines that fits this\n// signature.\ntype Bucket struct {\n\tSignature\n\tRoutines []Goroutine\n}\n\n// First returns true if it contains the first goroutine, e.g. the ones that\n// likely generated the panic() call, if any.\nfunc (b *Bucket) First() bool {\n\tfor _, r := range b.Routines {\n\t\tif r.First {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Less does reverse sort.\nfunc (b *Bucket) Less(r *Bucket) bool {\n\tif b.First() {\n\t\treturn true\n\t}\n\tif r.First() {\n\t\treturn false\n\t}\n\treturn b.Signature.Less(&r.Signature)\n}\n\n// Buckets is a list of Bucket sorted by repeation count.\ntype Buckets []Bucket\n\nfunc (b Buckets) Len() int {\n\treturn len(b)\n}\n\nfunc (b Buckets) Less(i, j int) bool {\n\treturn b[i].Less(&b[j])\n}\n\nfunc (b Buckets) Swap(i, j int) {\n\tb[j], b[i] = b[i], b[j]\n}\n\n// SortBuckets creates a list of Bucket from each goroutine stack trace count.\nfunc SortBuckets(buckets map[*Signature][]Goroutine) Buckets {\n\tout := make(Buckets, 0, len(buckets))\n\tfor signature, count := range buckets {\n\t\tout = append(out, Bucket{*signature, count})\n\t}\n\tsort.Sort(out)\n\treturn out\n}\n\n// scanLines is similar to bufio.ScanLines except that it:\n//     - doesn't drop '\\n'\n//     - doesn't strip '\\r'\n//     - returns when the data is bufio.MaxScanTokenSize bytes\nfunc scanLines(data []byte, atEOF bool) (advance int, token []byte, err error) {\n\tif atEOF && len(data) == 0 {\n\t\treturn 0, nil, nil\n\t}\n\tif i := bytes.IndexByte(data, '\\n'); i >= 0 {\n\t\treturn i + 1, data[0 : i+1], nil\n\t}\n\tif atEOF {\n\t\treturn len(data), data, nil\n\t}\n\tif len(data) >= bufio.MaxScanTokenSize {\n\t\t// Returns the line even if it is not at EOF nor has a '\\n', otherwise the\n\t\t// scanner will return bufio.ErrTooLong which is definitely not what we\n\t\t// want.\n\t\treturn len(data), data, nil\n\t}\n\treturn 0, nil, nil\n}\n\n// ParseDump processes the output from runtime.Stack().\n//\n// It supports piping from another command and assumes there is junk before the\n// actual stack trace. The junk is streamed to out.\nfunc ParseDump(r io.Reader, out io.Writer) ([]Goroutine, error) {\n\tgoroutines := make([]Goroutine, 0, 16)\n\tvar goroutine *Goroutine\n\tscanner := bufio.NewScanner(r)\n\tscanner.Split(scanLines)\n\t// TODO(maruel): Use a formal state machine. Patterns follows:\n\t// - reRoutineHeader\n\t//   Either:\n\t//     - reUnavail\n\t//     - reFunc + reFile in a loop\n\t//     - reElided\n\t//   Optionally ends with:\n\t//     - reCreated + reFile\n\t// Between each goroutine stack dump: an empty line\n\tcreated := false\n\t// firstLine is the first line after the reRoutineHeader header line.\n\tfirstLine := false\n\tfor scanner.Scan() {\n\t\tline := scanner.Text()\n\t\tif line == \"\\n\" {\n\t\t\tif goroutine != nil {\n\t\t\t\tgoroutine = nil\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else if line[len(line)-1] == '\\n' {\n\t\t\tif goroutine == nil {\n\t\t\t\tif match := reRoutineHeader.FindStringSubmatch(line); match != nil {\n\t\t\t\t\tif id, err := strconv.Atoi(match[1]); err == nil {\n\t\t\t\t\t\t// See runtime/traceback.go.\n\t\t\t\t\t\t// \"<state>, \\d+ minutes, locked to thread\"\n\t\t\t\t\t\titems := strings.Split(match[2], \", \")\n\t\t\t\t\t\tsleep := 0\n\t\t\t\t\t\tlocked := false\n\t\t\t\t\t\tfor i := 1; i < len(items); i++ {\n\t\t\t\t\t\t\tif items[i] == lockedToThread {\n\t\t\t\t\t\t\t\tlocked = true\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Look for duration, if any.\n\t\t\t\t\t\t\tif match2 := reMinutes.FindStringSubmatch(items[i]); match2 != nil {\n\t\t\t\t\t\t\t\tsleep, _ = strconv.Atoi(match2[1])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoroutines = append(goroutines, Goroutine{\n\t\t\t\t\t\t\tSignature: Signature{\n\t\t\t\t\t\t\t\tState:    items[0],\n\t\t\t\t\t\t\t\tSleepMin: sleep,\n\t\t\t\t\t\t\t\tSleepMax: sleep,\n\t\t\t\t\t\t\t\tLocked:   locked,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tID:    id,\n\t\t\t\t\t\t\tFirst: len(goroutines) == 0,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tgoroutine = &goroutines[len(goroutines)-1]\n\t\t\t\t\t\tfirstLine = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif firstLine {\n\t\t\t\t\tfirstLine = false\n\t\t\t\t\tif match := reUnavail.FindStringSubmatch(line); match != nil {\n\t\t\t\t\t\t// Generate a fake stack entry.\n\t\t\t\t\t\tgoroutine.Stack.Calls = []Call{{SourcePath: \"<unavailable>\"}}\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif match := reFile.FindStringSubmatch(line); match != nil {\n\t\t\t\t\t// Triggers after a reFunc or a reCreated.\n\t\t\t\t\tnum, err := strconv.Atoi(match[2])\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn goroutines, fmt.Errorf(\"failed to parse int on line: \\\"%s\\\"\", line)\n\t\t\t\t\t}\n\t\t\t\t\tif created {\n\t\t\t\t\t\tcreated = false\n\t\t\t\t\t\tgoroutine.CreatedBy.SourcePath = match[1]\n\t\t\t\t\t\tgoroutine.CreatedBy.Line = num\n\t\t\t\t\t} else {\n\t\t\t\t\t\ti := len(goroutine.Stack.Calls) - 1\n\t\t\t\t\t\tif i < 0 {\n\t\t\t\t\t\t\treturn goroutines, errors.New(\"unexpected order\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoroutine.Stack.Calls[i].SourcePath = match[1]\n\t\t\t\t\t\tgoroutine.Stack.Calls[i].Line = num\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif match := reCreated.FindStringSubmatch(line); match != nil {\n\t\t\t\t\tcreated = true\n\t\t\t\t\tgoroutine.CreatedBy.Func.Raw = match[1]\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif match := reFunc.FindStringSubmatch(line); match != nil {\n\t\t\t\t\targs := Args{}\n\t\t\t\t\tfor _, a := range strings.Split(match[2], \", \") {\n\t\t\t\t\t\tif a == \"...\" {\n\t\t\t\t\t\t\targs.Elided = true\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif a == \"\" {\n\t\t\t\t\t\t\t// Remaining values were dropped.\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tv, err := strconv.ParseUint(a, 0, 64)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn goroutines, fmt.Errorf(\"failed to parse int on line: \\\"%s\\\"\", line)\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.Values = append(args.Values, Arg{Value: v})\n\t\t\t\t\t}\n\t\t\t\t\tgoroutine.Stack.Calls = append(goroutine.Stack.Calls, Call{Func: Function{match[1]}, Args: args})\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif match := reElided.FindStringSubmatch(line); match != nil {\n\t\t\t\t\tgoroutine.Stack.Elided = true\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_, _ = io.WriteString(out, line)\n\t\tgoroutine = nil\n\t}\n\tnameArguments(goroutines)\n\treturn goroutines, scanner.Err()\n}\n\n// Private stuff.\n\nfunc nameArguments(goroutines []Goroutine) {\n\t// Set a name for any pointer occuring more than once.\n\ttype object struct {\n\t\targs      []*Arg\n\t\tinPrimary bool\n\t\tid        int\n\t}\n\tobjects := map[uint64]object{}\n\t// Enumerate all the arguments.\n\tfor i := range goroutines {\n\t\tfor j := range goroutines[i].Stack.Calls {\n\t\t\tfor k := range goroutines[i].Stack.Calls[j].Args.Values {\n\t\t\t\targ := goroutines[i].Stack.Calls[j].Args.Values[k]\n\t\t\t\tif arg.IsPtr() {\n\t\t\t\t\tobjects[arg.Value] = object{\n\t\t\t\t\t\targs:      append(objects[arg.Value].args, &goroutines[i].Stack.Calls[j].Args.Values[k]),\n\t\t\t\t\t\tinPrimary: objects[arg.Value].inPrimary || i == 0,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// CreatedBy.Args is never set.\n\t}\n\torder := uint64Slice{}\n\tfor k, obj := range objects {\n\t\tif len(obj.args) > 1 && obj.inPrimary {\n\t\t\torder = append(order, k)\n\t\t}\n\t}\n\tsort.Sort(order)\n\tnextID := 1\n\tfor _, k := range order {\n\t\tfor _, arg := range objects[k].args {\n\t\t\targ.Name = fmt.Sprintf(\"#%d\", nextID)\n\t\t}\n\t\tnextID++\n\t}\n\n\t// Now do the rest. This is done so the output is deterministic.\n\torder = uint64Slice{}\n\tfor k := range objects {\n\t\torder = append(order, k)\n\t}\n\tsort.Sort(order)\n\tfor _, k := range order {\n\t\t// Process the remaining pointers, they were not referenced by primary\n\t\t// thread so will have higher IDs.\n\t\tif objects[k].inPrimary {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, arg := range objects[k].args {\n\t\t\targ.Name = fmt.Sprintf(\"#%d\", nextID)\n\t\t}\n\t\tnextID++\n\t}\n}\n\ntype uint64Slice []uint64\n\nfunc (a uint64Slice) Len() int           { return len(a) }\nfunc (a uint64Slice) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }\nfunc (a uint64Slice) Less(i, j int) bool { return a[i] < a[j] }\n"
  },
  {
    "path": "vendor/github.com/maruel/panicparse/stack/ui.go",
    "content": "// Copyright 2016 Marc-Antoine Ruel. All rights reserved.\n// Use of this source code is governed under the Apache License, Version 2.0\n// that can be found in the LICENSE file.\n\npackage stack\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// Palette defines the color used.\n//\n// An empty object Palette{} can be used to disable coloring.\ntype Palette struct {\n\tEOLReset string\n\n\t// Routine header.\n\tRoutineFirst string // The first routine printed.\n\tRoutine      string // Following routines.\n\tCreatedBy    string\n\n\t// Call line.\n\tPackage                string\n\tSourceFile             string\n\tFunctionStdLib         string\n\tFunctionStdLibExported string\n\tFunctionMain           string\n\tFunctionOther          string\n\tFunctionOtherExported  string\n\tArguments              string\n}\n\n// CalcLengths returns the maximum length of the source lines and package names.\nfunc CalcLengths(buckets Buckets, fullPath bool) (int, int) {\n\tsrcLen := 0\n\tpkgLen := 0\n\tfor _, bucket := range buckets {\n\t\tfor _, line := range bucket.Signature.Stack.Calls {\n\t\t\tl := 0\n\t\t\tif fullPath {\n\t\t\t\tl = len(line.FullSourceLine())\n\t\t\t} else {\n\t\t\t\tl = len(line.SourceLine())\n\t\t\t}\n\t\t\tif l > srcLen {\n\t\t\t\tsrcLen = l\n\t\t\t}\n\t\t\tl = len(line.Func.PkgName())\n\t\t\tif l > pkgLen {\n\t\t\t\tpkgLen = l\n\t\t\t}\n\t\t}\n\t}\n\treturn srcLen, pkgLen\n}\n\n// functionColor returns the color to be used for the function name based on\n// the type of package the function is in.\nfunc (p *Palette) functionColor(line *Call) string {\n\tif line.IsStdlib() {\n\t\tif line.Func.IsExported() {\n\t\t\treturn p.FunctionStdLibExported\n\t\t}\n\t\treturn p.FunctionStdLib\n\t} else if line.IsPkgMain() {\n\t\treturn p.FunctionMain\n\t} else if line.Func.IsExported() {\n\t\treturn p.FunctionOtherExported\n\t}\n\treturn p.FunctionOther\n}\n\n// routineColor returns the color for the header of the goroutines bucket.\nfunc (p *Palette) routineColor(bucket *Bucket, multipleBuckets bool) string {\n\tif bucket.First() && multipleBuckets {\n\t\treturn p.RoutineFirst\n\t}\n\treturn p.Routine\n}\n\n// BucketHeader prints the header of a goroutine signature.\nfunc (p *Palette) BucketHeader(bucket *Bucket, fullPath, multipleBuckets bool) string {\n\textra := \"\"\n\tif bucket.SleepMax != 0 {\n\t\tif bucket.SleepMin != bucket.SleepMax {\n\t\t\textra += fmt.Sprintf(\" [%d~%d minutes]\", bucket.SleepMin, bucket.SleepMax)\n\t\t} else {\n\t\t\textra += fmt.Sprintf(\" [%d minutes]\", bucket.SleepMax)\n\t\t}\n\t}\n\tif bucket.Locked {\n\t\textra += \" [locked]\"\n\t}\n\tcreated := bucket.CreatedBy.Func.PkgDotName()\n\tif created != \"\" {\n\t\tcreated += \" @ \"\n\t\tif fullPath {\n\t\t\tcreated += bucket.CreatedBy.FullSourceLine()\n\t\t} else {\n\t\t\tcreated += bucket.CreatedBy.SourceLine()\n\t\t}\n\t\textra += p.CreatedBy + \" [Created by \" + created + \"]\"\n\t}\n\treturn fmt.Sprintf(\n\t\t\"%s%d: %s%s%s\\n\",\n\t\tp.routineColor(bucket, multipleBuckets), len(bucket.Routines),\n\t\tbucket.State, extra,\n\t\tp.EOLReset)\n}\n\n// callLine prints one stack line.\nfunc (p *Palette) callLine(line *Call, srcLen, pkgLen int, fullPath bool) string {\n\tsrc := \"\"\n\tif fullPath {\n\t\tsrc = line.FullSourceLine()\n\t} else {\n\t\tsrc = line.SourceLine()\n\t}\n\treturn fmt.Sprintf(\n\t\t\"    %s%-*s %s%-*s %s%s%s(%s)%s\",\n\t\tp.Package, pkgLen, line.Func.PkgName(),\n\t\tp.SourceFile, srcLen, src,\n\t\tp.functionColor(line), line.Func.Name(),\n\t\tp.Arguments, line.Args,\n\t\tp.EOLReset)\n}\n\n// StackLines prints one complete stack trace, without the header.\nfunc (p *Palette) StackLines(signature *Signature, srcLen, pkgLen int, fullPath bool) string {\n\tout := make([]string, len(signature.Stack.Calls))\n\tfor i := range signature.Stack.Calls {\n\t\tout[i] = p.callLine(&signature.Stack.Calls[i], srcLen, pkgLen, fullPath)\n\t}\n\tif signature.Stack.Elided {\n\t\tout = append(out, \"    (...)\")\n\t}\n\treturn strings.Join(out, \"\\n\") + \"\\n\"\n}\n"
  },
  {
    "path": "vendor/github.com/maruel/panicparse/vendor.yml",
    "content": "vendors:\n- path: github.com/kr/pretty\n  rev: 737b74a46c4bf788349f72cb256fed10aea4d0ac\n- path: github.com/kr/text\n  rev: 7cafcd837844e784b526369c9bce262804aebc60\n- path: github.com/maruel/ut\n  rev: a9c9f15ccfa6f8b90182a53df32f4745586fbae3\n- path: github.com/mattn/go-colorable\n  rev: 9056b7a9f2d1f2d96498d6d146acd1f9d5ed3d59\n- path: github.com/mattn/go-isatty\n  rev: 56b76bdf51f7708750eac80fa38b952bb9f32639\n- path: github.com/mgutz/ansi\n  rev: c286dcecd19ff979eeb73ea444e479b903f2cfcb\n- path: github.com/pmezard/go-difflib\n  rev: 792786c7400a136282c1664665ae0a8db921c6c2\n- path: golang.org/x/sys\n  rev: a646d33e2ee3172a661fc09bca23bb4889a41bc8\n"
  },
  {
    "path": "vendor/github.com/mattn/go-colorable/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\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": "vendor/github.com/mattn/go-colorable/README.md",
    "content": "# go-colorable\n\nColorable writer for windows.\n\nFor example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.)\nThis package is possible to handle escape sequence for ansi color on windows.\n\n## Too Bad!\n\n![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png)\n\n\n## So Good!\n\n![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png)\n\n## Usage\n\n```go\nlogrus.SetFormatter(&logrus.TextFormatter{ForceColors: true})\nlogrus.SetOutput(colorable.NewColorableStdout())\n\nlogrus.Info(\"succeeded\")\nlogrus.Warn(\"not correct\")\nlogrus.Error(\"something error\")\nlogrus.Fatal(\"panic\")\n```\n\nYou can compile above code on non-windows OSs.\n\n## Installation\n\n```\n$ go get github.com/mattn/go-colorable\n```\n\n# License\n\nMIT\n\n# Author\n\nYasuhiro Matsumoto (a.k.a mattn)\n"
  },
  {
    "path": "vendor/github.com/mattn/go-colorable/colorable_others.go",
    "content": "// +build !windows\n\npackage colorable\n\nimport (\n\t\"io\"\n\t\"os\"\n)\n\n// NewColorable return new instance of Writer which handle escape sequence.\nfunc NewColorable(file *os.File) io.Writer {\n\tif file == nil {\n\t\tpanic(\"nil passed instead of *os.File to NewColorable()\")\n\t}\n\n\treturn file\n}\n\n// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.\nfunc NewColorableStdout() io.Writer {\n\treturn os.Stdout\n}\n\n// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.\nfunc NewColorableStderr() io.Writer {\n\treturn os.Stderr\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-colorable/colorable_windows.go",
    "content": "package colorable\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"math\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"syscall\"\n\t\"unsafe\"\n\n\t\"github.com/mattn/go-isatty\"\n)\n\nconst (\n\tforegroundBlue      = 0x1\n\tforegroundGreen     = 0x2\n\tforegroundRed       = 0x4\n\tforegroundIntensity = 0x8\n\tforegroundMask      = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity)\n\tbackgroundBlue      = 0x10\n\tbackgroundGreen     = 0x20\n\tbackgroundRed       = 0x40\n\tbackgroundIntensity = 0x80\n\tbackgroundMask      = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity)\n)\n\ntype wchar uint16\ntype short int16\ntype dword uint32\ntype word uint16\n\ntype coord struct {\n\tx short\n\ty short\n}\n\ntype smallRect struct {\n\tleft   short\n\ttop    short\n\tright  short\n\tbottom short\n}\n\ntype consoleScreenBufferInfo struct {\n\tsize              coord\n\tcursorPosition    coord\n\tattributes        word\n\twindow            smallRect\n\tmaximumWindowSize coord\n}\n\ntype consoleCursorInfo struct {\n\tsize    dword\n\tvisible int32\n}\n\nvar (\n\tkernel32                       = syscall.NewLazyDLL(\"kernel32.dll\")\n\tprocGetConsoleScreenBufferInfo = kernel32.NewProc(\"GetConsoleScreenBufferInfo\")\n\tprocSetConsoleTextAttribute    = kernel32.NewProc(\"SetConsoleTextAttribute\")\n\tprocSetConsoleCursorPosition   = kernel32.NewProc(\"SetConsoleCursorPosition\")\n\tprocFillConsoleOutputCharacter = kernel32.NewProc(\"FillConsoleOutputCharacterW\")\n\tprocFillConsoleOutputAttribute = kernel32.NewProc(\"FillConsoleOutputAttribute\")\n\tprocGetConsoleCursorInfo       = kernel32.NewProc(\"GetConsoleCursorInfo\")\n\tprocSetConsoleCursorInfo       = kernel32.NewProc(\"SetConsoleCursorInfo\")\n)\n\ntype Writer struct {\n\tout     io.Writer\n\thandle  syscall.Handle\n\tlastbuf bytes.Buffer\n\toldattr word\n\toldpos  coord\n}\n\n// NewColorable return new instance of Writer which handle escape sequence from File.\nfunc NewColorable(file *os.File) io.Writer {\n\tif file == nil {\n\t\tpanic(\"nil passed instead of *os.File to NewColorable()\")\n\t}\n\n\tif isatty.IsTerminal(file.Fd()) {\n\t\tvar csbi consoleScreenBufferInfo\n\t\thandle := syscall.Handle(file.Fd())\n\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi)))\n\t\treturn &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}}\n\t} else {\n\t\treturn file\n\t}\n}\n\n// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.\nfunc NewColorableStdout() io.Writer {\n\treturn NewColorable(os.Stdout)\n}\n\n// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.\nfunc NewColorableStderr() io.Writer {\n\treturn NewColorable(os.Stderr)\n}\n\nvar color256 = map[int]int{\n\t0:   0x000000,\n\t1:   0x800000,\n\t2:   0x008000,\n\t3:   0x808000,\n\t4:   0x000080,\n\t5:   0x800080,\n\t6:   0x008080,\n\t7:   0xc0c0c0,\n\t8:   0x808080,\n\t9:   0xff0000,\n\t10:  0x00ff00,\n\t11:  0xffff00,\n\t12:  0x0000ff,\n\t13:  0xff00ff,\n\t14:  0x00ffff,\n\t15:  0xffffff,\n\t16:  0x000000,\n\t17:  0x00005f,\n\t18:  0x000087,\n\t19:  0x0000af,\n\t20:  0x0000d7,\n\t21:  0x0000ff,\n\t22:  0x005f00,\n\t23:  0x005f5f,\n\t24:  0x005f87,\n\t25:  0x005faf,\n\t26:  0x005fd7,\n\t27:  0x005fff,\n\t28:  0x008700,\n\t29:  0x00875f,\n\t30:  0x008787,\n\t31:  0x0087af,\n\t32:  0x0087d7,\n\t33:  0x0087ff,\n\t34:  0x00af00,\n\t35:  0x00af5f,\n\t36:  0x00af87,\n\t37:  0x00afaf,\n\t38:  0x00afd7,\n\t39:  0x00afff,\n\t40:  0x00d700,\n\t41:  0x00d75f,\n\t42:  0x00d787,\n\t43:  0x00d7af,\n\t44:  0x00d7d7,\n\t45:  0x00d7ff,\n\t46:  0x00ff00,\n\t47:  0x00ff5f,\n\t48:  0x00ff87,\n\t49:  0x00ffaf,\n\t50:  0x00ffd7,\n\t51:  0x00ffff,\n\t52:  0x5f0000,\n\t53:  0x5f005f,\n\t54:  0x5f0087,\n\t55:  0x5f00af,\n\t56:  0x5f00d7,\n\t57:  0x5f00ff,\n\t58:  0x5f5f00,\n\t59:  0x5f5f5f,\n\t60:  0x5f5f87,\n\t61:  0x5f5faf,\n\t62:  0x5f5fd7,\n\t63:  0x5f5fff,\n\t64:  0x5f8700,\n\t65:  0x5f875f,\n\t66:  0x5f8787,\n\t67:  0x5f87af,\n\t68:  0x5f87d7,\n\t69:  0x5f87ff,\n\t70:  0x5faf00,\n\t71:  0x5faf5f,\n\t72:  0x5faf87,\n\t73:  0x5fafaf,\n\t74:  0x5fafd7,\n\t75:  0x5fafff,\n\t76:  0x5fd700,\n\t77:  0x5fd75f,\n\t78:  0x5fd787,\n\t79:  0x5fd7af,\n\t80:  0x5fd7d7,\n\t81:  0x5fd7ff,\n\t82:  0x5fff00,\n\t83:  0x5fff5f,\n\t84:  0x5fff87,\n\t85:  0x5fffaf,\n\t86:  0x5fffd7,\n\t87:  0x5fffff,\n\t88:  0x870000,\n\t89:  0x87005f,\n\t90:  0x870087,\n\t91:  0x8700af,\n\t92:  0x8700d7,\n\t93:  0x8700ff,\n\t94:  0x875f00,\n\t95:  0x875f5f,\n\t96:  0x875f87,\n\t97:  0x875faf,\n\t98:  0x875fd7,\n\t99:  0x875fff,\n\t100: 0x878700,\n\t101: 0x87875f,\n\t102: 0x878787,\n\t103: 0x8787af,\n\t104: 0x8787d7,\n\t105: 0x8787ff,\n\t106: 0x87af00,\n\t107: 0x87af5f,\n\t108: 0x87af87,\n\t109: 0x87afaf,\n\t110: 0x87afd7,\n\t111: 0x87afff,\n\t112: 0x87d700,\n\t113: 0x87d75f,\n\t114: 0x87d787,\n\t115: 0x87d7af,\n\t116: 0x87d7d7,\n\t117: 0x87d7ff,\n\t118: 0x87ff00,\n\t119: 0x87ff5f,\n\t120: 0x87ff87,\n\t121: 0x87ffaf,\n\t122: 0x87ffd7,\n\t123: 0x87ffff,\n\t124: 0xaf0000,\n\t125: 0xaf005f,\n\t126: 0xaf0087,\n\t127: 0xaf00af,\n\t128: 0xaf00d7,\n\t129: 0xaf00ff,\n\t130: 0xaf5f00,\n\t131: 0xaf5f5f,\n\t132: 0xaf5f87,\n\t133: 0xaf5faf,\n\t134: 0xaf5fd7,\n\t135: 0xaf5fff,\n\t136: 0xaf8700,\n\t137: 0xaf875f,\n\t138: 0xaf8787,\n\t139: 0xaf87af,\n\t140: 0xaf87d7,\n\t141: 0xaf87ff,\n\t142: 0xafaf00,\n\t143: 0xafaf5f,\n\t144: 0xafaf87,\n\t145: 0xafafaf,\n\t146: 0xafafd7,\n\t147: 0xafafff,\n\t148: 0xafd700,\n\t149: 0xafd75f,\n\t150: 0xafd787,\n\t151: 0xafd7af,\n\t152: 0xafd7d7,\n\t153: 0xafd7ff,\n\t154: 0xafff00,\n\t155: 0xafff5f,\n\t156: 0xafff87,\n\t157: 0xafffaf,\n\t158: 0xafffd7,\n\t159: 0xafffff,\n\t160: 0xd70000,\n\t161: 0xd7005f,\n\t162: 0xd70087,\n\t163: 0xd700af,\n\t164: 0xd700d7,\n\t165: 0xd700ff,\n\t166: 0xd75f00,\n\t167: 0xd75f5f,\n\t168: 0xd75f87,\n\t169: 0xd75faf,\n\t170: 0xd75fd7,\n\t171: 0xd75fff,\n\t172: 0xd78700,\n\t173: 0xd7875f,\n\t174: 0xd78787,\n\t175: 0xd787af,\n\t176: 0xd787d7,\n\t177: 0xd787ff,\n\t178: 0xd7af00,\n\t179: 0xd7af5f,\n\t180: 0xd7af87,\n\t181: 0xd7afaf,\n\t182: 0xd7afd7,\n\t183: 0xd7afff,\n\t184: 0xd7d700,\n\t185: 0xd7d75f,\n\t186: 0xd7d787,\n\t187: 0xd7d7af,\n\t188: 0xd7d7d7,\n\t189: 0xd7d7ff,\n\t190: 0xd7ff00,\n\t191: 0xd7ff5f,\n\t192: 0xd7ff87,\n\t193: 0xd7ffaf,\n\t194: 0xd7ffd7,\n\t195: 0xd7ffff,\n\t196: 0xff0000,\n\t197: 0xff005f,\n\t198: 0xff0087,\n\t199: 0xff00af,\n\t200: 0xff00d7,\n\t201: 0xff00ff,\n\t202: 0xff5f00,\n\t203: 0xff5f5f,\n\t204: 0xff5f87,\n\t205: 0xff5faf,\n\t206: 0xff5fd7,\n\t207: 0xff5fff,\n\t208: 0xff8700,\n\t209: 0xff875f,\n\t210: 0xff8787,\n\t211: 0xff87af,\n\t212: 0xff87d7,\n\t213: 0xff87ff,\n\t214: 0xffaf00,\n\t215: 0xffaf5f,\n\t216: 0xffaf87,\n\t217: 0xffafaf,\n\t218: 0xffafd7,\n\t219: 0xffafff,\n\t220: 0xffd700,\n\t221: 0xffd75f,\n\t222: 0xffd787,\n\t223: 0xffd7af,\n\t224: 0xffd7d7,\n\t225: 0xffd7ff,\n\t226: 0xffff00,\n\t227: 0xffff5f,\n\t228: 0xffff87,\n\t229: 0xffffaf,\n\t230: 0xffffd7,\n\t231: 0xffffff,\n\t232: 0x080808,\n\t233: 0x121212,\n\t234: 0x1c1c1c,\n\t235: 0x262626,\n\t236: 0x303030,\n\t237: 0x3a3a3a,\n\t238: 0x444444,\n\t239: 0x4e4e4e,\n\t240: 0x585858,\n\t241: 0x626262,\n\t242: 0x6c6c6c,\n\t243: 0x767676,\n\t244: 0x808080,\n\t245: 0x8a8a8a,\n\t246: 0x949494,\n\t247: 0x9e9e9e,\n\t248: 0xa8a8a8,\n\t249: 0xb2b2b2,\n\t250: 0xbcbcbc,\n\t251: 0xc6c6c6,\n\t252: 0xd0d0d0,\n\t253: 0xdadada,\n\t254: 0xe4e4e4,\n\t255: 0xeeeeee,\n}\n\n// Write write data on console\nfunc (w *Writer) Write(data []byte) (n int, err error) {\n\tvar csbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\n\ter := bytes.NewReader(data)\n\tvar bw [1]byte\nloop:\n\tfor {\n\t\tr1, _, err := procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\tif r1 == 0 {\n\t\t\tbreak loop\n\t\t}\n\n\t\tc1, err := er.ReadByte()\n\t\tif err != nil {\n\t\t\tbreak loop\n\t\t}\n\t\tif c1 != 0x1b {\n\t\t\tbw[0] = c1\n\t\t\tw.out.Write(bw[:])\n\t\t\tcontinue\n\t\t}\n\t\tc2, err := er.ReadByte()\n\t\tif err != nil {\n\t\t\tw.lastbuf.WriteByte(c1)\n\t\t\tbreak loop\n\t\t}\n\t\tif c2 != 0x5b {\n\t\t\tw.lastbuf.WriteByte(c1)\n\t\t\tw.lastbuf.WriteByte(c2)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\tvar m byte\n\t\tfor {\n\t\t\tc, err := er.ReadByte()\n\t\t\tif err != nil {\n\t\t\t\tw.lastbuf.WriteByte(c1)\n\t\t\t\tw.lastbuf.WriteByte(c2)\n\t\t\t\tw.lastbuf.Write(buf.Bytes())\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tif ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {\n\t\t\t\tm = c\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbuf.Write([]byte(string(c)))\n\t\t}\n\n\t\tvar csbi consoleScreenBufferInfo\n\t\tswitch m {\n\t\tcase 'A':\n\t\t\tn, err = strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tcsbi.cursorPosition.y -= short(n)\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\tcase 'B':\n\t\t\tn, err = strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tcsbi.cursorPosition.y += short(n)\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\tcase 'C':\n\t\t\tn, err = strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tcsbi.cursorPosition.x -= short(n)\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\tcase 'D':\n\t\t\tn, err = strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif n, err = strconv.Atoi(buf.String()); err == nil {\n\t\t\t\tvar csbi consoleScreenBufferInfo\n\t\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\t\tcsbi.cursorPosition.x += short(n)\n\t\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\t\t}\n\t\tcase 'E':\n\t\t\tn, err = strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tcsbi.cursorPosition.x = 0\n\t\t\tcsbi.cursorPosition.y += short(n)\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\tcase 'F':\n\t\t\tn, err = strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tcsbi.cursorPosition.x = 0\n\t\t\tcsbi.cursorPosition.y -= short(n)\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\tcase 'G':\n\t\t\tn, err = strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tcsbi.cursorPosition.x = short(n - 1)\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\tcase 'H':\n\t\t\ttoken := strings.Split(buf.String(), \";\")\n\t\t\tif len(token) != 2 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tn1, err := strconv.Atoi(token[0])\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tn2, err := strconv.Atoi(token[1])\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tcsbi.cursorPosition.x = short(n2 - 1)\n\t\t\tcsbi.cursorPosition.y = short(n1 - 1)\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))\n\t\tcase 'J':\n\t\t\tn, err := strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tvar cursor coord\n\t\t\tswitch n {\n\t\t\tcase 0:\n\t\t\t\tcursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y}\n\t\t\tcase 1:\n\t\t\t\tcursor = coord{x: csbi.window.left, y: csbi.window.top}\n\t\t\tcase 2:\n\t\t\t\tcursor = coord{x: csbi.window.left, y: csbi.window.top}\n\t\t\t}\n\t\t\tvar count, written dword\n\t\t\tcount = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x)\n\t\t\tprocFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))\n\t\t\tprocFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))\n\t\tcase 'K':\n\t\t\tn, err := strconv.Atoi(buf.String())\n\t\t\tif err != nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tvar cursor coord\n\t\t\tswitch n {\n\t\t\tcase 0:\n\t\t\t\tcursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y}\n\t\t\tcase 1:\n\t\t\t\tcursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y}\n\t\t\tcase 2:\n\t\t\t\tcursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y}\n\t\t\t}\n\t\t\tvar count, written dword\n\t\t\tcount = dword(csbi.size.x - csbi.cursorPosition.x)\n\t\t\tprocFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))\n\t\t\tprocFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))\n\t\tcase 'm':\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tattr := csbi.attributes\n\t\t\tcs := buf.String()\n\t\t\tif cs == \"\" {\n\t\t\t\tprocSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttoken := strings.Split(cs, \";\")\n\t\t\tfor i := 0; i < len(token); i++ {\n\t\t\t\tns := token[i]\n\t\t\t\tif n, err = strconv.Atoi(ns); err == nil {\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase n == 0 || n == 100:\n\t\t\t\t\t\tattr = w.oldattr\n\t\t\t\t\tcase 1 <= n && n <= 5:\n\t\t\t\t\t\tattr |= foregroundIntensity\n\t\t\t\t\tcase n == 7:\n\t\t\t\t\t\tattr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4)\n\t\t\t\t\tcase 22 == n || n == 25 || n == 25:\n\t\t\t\t\t\tattr |= foregroundIntensity\n\t\t\t\t\tcase n == 27:\n\t\t\t\t\t\tattr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4)\n\t\t\t\t\tcase 30 <= n && n <= 37:\n\t\t\t\t\t\tattr &= backgroundMask\n\t\t\t\t\t\tif (n-30)&1 != 0 {\n\t\t\t\t\t\t\tattr |= foregroundRed\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-30)&2 != 0 {\n\t\t\t\t\t\t\tattr |= foregroundGreen\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-30)&4 != 0 {\n\t\t\t\t\t\t\tattr |= foregroundBlue\n\t\t\t\t\t\t}\n\t\t\t\t\tcase n == 38: // set foreground color.\n\t\t\t\t\t\tif i < len(token)-2 && (token[i+1] == \"5\" || token[i+1] == \"05\") {\n\t\t\t\t\t\t\tif n256, err := strconv.Atoi(token[i+2]); err == nil {\n\t\t\t\t\t\t\t\tif n256foreAttr == nil {\n\t\t\t\t\t\t\t\t\tn256setup()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tattr &= backgroundMask\n\t\t\t\t\t\t\t\tattr |= n256foreAttr[n256]\n\t\t\t\t\t\t\t\ti += 2\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tattr = attr & (w.oldattr & backgroundMask)\n\t\t\t\t\t\t}\n\t\t\t\t\tcase n == 39: // reset foreground color.\n\t\t\t\t\t\tattr &= backgroundMask\n\t\t\t\t\t\tattr |= w.oldattr & foregroundMask\n\t\t\t\t\tcase 40 <= n && n <= 47:\n\t\t\t\t\t\tattr &= foregroundMask\n\t\t\t\t\t\tif (n-40)&1 != 0 {\n\t\t\t\t\t\t\tattr |= backgroundRed\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-40)&2 != 0 {\n\t\t\t\t\t\t\tattr |= backgroundGreen\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-40)&4 != 0 {\n\t\t\t\t\t\t\tattr |= backgroundBlue\n\t\t\t\t\t\t}\n\t\t\t\t\tcase n == 48: // set background color.\n\t\t\t\t\t\tif i < len(token)-2 && token[i+1] == \"5\" {\n\t\t\t\t\t\t\tif n256, err := strconv.Atoi(token[i+2]); err == nil {\n\t\t\t\t\t\t\t\tif n256backAttr == nil {\n\t\t\t\t\t\t\t\t\tn256setup()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tattr &= foregroundMask\n\t\t\t\t\t\t\t\tattr |= n256backAttr[n256]\n\t\t\t\t\t\t\t\ti += 2\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tattr = attr & (w.oldattr & foregroundMask)\n\t\t\t\t\t\t}\n\t\t\t\t\tcase n == 49: // reset foreground color.\n\t\t\t\t\t\tattr &= foregroundMask\n\t\t\t\t\t\tattr |= w.oldattr & backgroundMask\n\t\t\t\t\tcase 90 <= n && n <= 97:\n\t\t\t\t\t\tattr = (attr & backgroundMask)\n\t\t\t\t\t\tattr |= foregroundIntensity\n\t\t\t\t\t\tif (n-90)&1 != 0 {\n\t\t\t\t\t\t\tattr |= foregroundRed\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-90)&2 != 0 {\n\t\t\t\t\t\t\tattr |= foregroundGreen\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-90)&4 != 0 {\n\t\t\t\t\t\t\tattr |= foregroundBlue\n\t\t\t\t\t\t}\n\t\t\t\t\tcase 100 <= n && n <= 107:\n\t\t\t\t\t\tattr = (attr & foregroundMask)\n\t\t\t\t\t\tattr |= backgroundIntensity\n\t\t\t\t\t\tif (n-100)&1 != 0 {\n\t\t\t\t\t\t\tattr |= backgroundRed\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-100)&2 != 0 {\n\t\t\t\t\t\t\tattr |= backgroundGreen\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (n-100)&4 != 0 {\n\t\t\t\t\t\t\tattr |= backgroundBlue\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tprocSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr))\n\t\t\t\t}\n\t\t\t}\n\t\tcase 'h':\n\t\t\tcs := buf.String()\n\t\t\tif cs == \"?25\" {\n\t\t\t\tvar ci consoleCursorInfo\n\t\t\t\tprocGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))\n\t\t\t\tci.visible = 1\n\t\t\t\tprocSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))\n\t\t\t}\n\t\tcase 'l':\n\t\t\tcs := buf.String()\n\t\t\tif cs == \"?25\" {\n\t\t\t\tvar ci consoleCursorInfo\n\t\t\t\tprocGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))\n\t\t\t\tci.visible = 0\n\t\t\t\tprocSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))\n\t\t\t}\n\t\tcase 's':\n\t\t\tprocGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))\n\t\t\tw.oldpos = csbi.cursorPosition\n\t\tcase 'u':\n\t\t\tprocSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&w.oldpos)))\n\t\t}\n\t}\n\treturn len(data) - w.lastbuf.Len(), nil\n}\n\ntype consoleColor struct {\n\trgb       int\n\tred       bool\n\tgreen     bool\n\tblue      bool\n\tintensity bool\n}\n\nfunc (c consoleColor) foregroundAttr() (attr word) {\n\tif c.red {\n\t\tattr |= foregroundRed\n\t}\n\tif c.green {\n\t\tattr |= foregroundGreen\n\t}\n\tif c.blue {\n\t\tattr |= foregroundBlue\n\t}\n\tif c.intensity {\n\t\tattr |= foregroundIntensity\n\t}\n\treturn\n}\n\nfunc (c consoleColor) backgroundAttr() (attr word) {\n\tif c.red {\n\t\tattr |= backgroundRed\n\t}\n\tif c.green {\n\t\tattr |= backgroundGreen\n\t}\n\tif c.blue {\n\t\tattr |= backgroundBlue\n\t}\n\tif c.intensity {\n\t\tattr |= backgroundIntensity\n\t}\n\treturn\n}\n\nvar color16 = []consoleColor{\n\tconsoleColor{0x000000, false, false, false, false},\n\tconsoleColor{0x000080, false, false, true, false},\n\tconsoleColor{0x008000, false, true, false, false},\n\tconsoleColor{0x008080, false, true, true, false},\n\tconsoleColor{0x800000, true, false, false, false},\n\tconsoleColor{0x800080, true, false, true, false},\n\tconsoleColor{0x808000, true, true, false, false},\n\tconsoleColor{0xc0c0c0, true, true, true, false},\n\tconsoleColor{0x808080, false, false, false, true},\n\tconsoleColor{0x0000ff, false, false, true, true},\n\tconsoleColor{0x00ff00, false, true, false, true},\n\tconsoleColor{0x00ffff, false, true, true, true},\n\tconsoleColor{0xff0000, true, false, false, true},\n\tconsoleColor{0xff00ff, true, false, true, true},\n\tconsoleColor{0xffff00, true, true, false, true},\n\tconsoleColor{0xffffff, true, true, true, true},\n}\n\ntype hsv struct {\n\th, s, v float32\n}\n\nfunc (a hsv) dist(b hsv) float32 {\n\tdh := a.h - b.h\n\tswitch {\n\tcase dh > 0.5:\n\t\tdh = 1 - dh\n\tcase dh < -0.5:\n\t\tdh = -1 - dh\n\t}\n\tds := a.s - b.s\n\tdv := a.v - b.v\n\treturn float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv)))\n}\n\nfunc toHSV(rgb int) hsv {\n\tr, g, b := float32((rgb&0xFF0000)>>16)/256.0,\n\t\tfloat32((rgb&0x00FF00)>>8)/256.0,\n\t\tfloat32(rgb&0x0000FF)/256.0\n\tmin, max := minmax3f(r, g, b)\n\th := max - min\n\tif h > 0 {\n\t\tif max == r {\n\t\t\th = (g - b) / h\n\t\t\tif h < 0 {\n\t\t\t\th += 6\n\t\t\t}\n\t\t} else if max == g {\n\t\t\th = 2 + (b-r)/h\n\t\t} else {\n\t\t\th = 4 + (r-g)/h\n\t\t}\n\t}\n\th /= 6.0\n\ts := max - min\n\tif max != 0 {\n\t\ts /= max\n\t}\n\tv := max\n\treturn hsv{h: h, s: s, v: v}\n}\n\ntype hsvTable []hsv\n\nfunc toHSVTable(rgbTable []consoleColor) hsvTable {\n\tt := make(hsvTable, len(rgbTable))\n\tfor i, c := range rgbTable {\n\t\tt[i] = toHSV(c.rgb)\n\t}\n\treturn t\n}\n\nfunc (t hsvTable) find(rgb int) consoleColor {\n\thsv := toHSV(rgb)\n\tn := 7\n\tl := float32(5.0)\n\tfor i, p := range t {\n\t\td := hsv.dist(p)\n\t\tif d < l {\n\t\t\tl, n = d, i\n\t\t}\n\t}\n\treturn color16[n]\n}\n\nfunc minmax3f(a, b, c float32) (min, max float32) {\n\tif a < b {\n\t\tif b < c {\n\t\t\treturn a, c\n\t\t} else if a < c {\n\t\t\treturn a, b\n\t\t} else {\n\t\t\treturn c, b\n\t\t}\n\t} else {\n\t\tif a < c {\n\t\t\treturn b, c\n\t\t} else if b < c {\n\t\t\treturn b, a\n\t\t} else {\n\t\t\treturn c, a\n\t\t}\n\t}\n}\n\nvar n256foreAttr []word\nvar n256backAttr []word\n\nfunc n256setup() {\n\tn256foreAttr = make([]word, 256)\n\tn256backAttr = make([]word, 256)\n\tt := toHSVTable(color16)\n\tfor i, rgb := range color256 {\n\t\tc := t.find(rgb)\n\t\tn256foreAttr[i] = c.foregroundAttr()\n\t\tn256backAttr[i] = c.backgroundAttr()\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-colorable/noncolorable.go",
    "content": "package colorable\n\nimport (\n\t\"bytes\"\n\t\"io\"\n)\n\n// NonColorable hold writer but remove escape sequence.\ntype NonColorable struct {\n\tout     io.Writer\n\tlastbuf bytes.Buffer\n}\n\n// NewNonColorable return new instance of Writer which remove escape sequence from Writer.\nfunc NewNonColorable(w io.Writer) io.Writer {\n\treturn &NonColorable{out: w}\n}\n\n// Write write data on console\nfunc (w *NonColorable) Write(data []byte) (n int, err error) {\n\ter := bytes.NewReader(data)\n\tvar bw [1]byte\nloop:\n\tfor {\n\t\tc1, err := er.ReadByte()\n\t\tif err != nil {\n\t\t\tbreak loop\n\t\t}\n\t\tif c1 != 0x1b {\n\t\t\tbw[0] = c1\n\t\t\tw.out.Write(bw[:])\n\t\t\tcontinue\n\t\t}\n\t\tc2, err := er.ReadByte()\n\t\tif err != nil {\n\t\t\tw.lastbuf.WriteByte(c1)\n\t\t\tbreak loop\n\t\t}\n\t\tif c2 != 0x5b {\n\t\t\tw.lastbuf.WriteByte(c1)\n\t\t\tw.lastbuf.WriteByte(c2)\n\t\t\tcontinue\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\tfor {\n\t\t\tc, err := er.ReadByte()\n\t\t\tif err != nil {\n\t\t\t\tw.lastbuf.WriteByte(c1)\n\t\t\t\tw.lastbuf.WriteByte(c2)\n\t\t\t\tw.lastbuf.Write(buf.Bytes())\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tif ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbuf.Write([]byte(string(c)))\n\t\t}\n\t}\n\treturn len(data) - w.lastbuf.Len(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/LICENSE",
    "content": "Copyright (c) Yasuhiro MATSUMOTO <mattn.jp@gmail.com>\n\nMIT License (Expat)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/README.md",
    "content": "# go-isatty\n\n[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) [![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master)\n\nisatty for golang\n\n## Usage\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/mattn/go-isatty\"\n\t\"os\"\n)\n\nfunc main() {\n\tif isatty.IsTerminal(os.Stdout.Fd()) {\n\t\tfmt.Println(\"Is Terminal\")\n\t} else if isatty.IsCygwinTerminal(os.Stdout.Fd()) {\n\t\tfmt.Println(\"Is Cygwin/MSYS2 Terminal\")\n\t} else {\n\t\tfmt.Println(\"Is Not Terminal\")\n\t}\n}\n```\n\n## Installation\n\n```\n$ go get github.com/mattn/go-isatty\n```\n\n## License\n\nMIT\n\n## Author\n\nYasuhiro Matsumoto (a.k.a mattn)\n\n## Thanks\n\n* k-takata: base idea for IsCygwinTerminal\n\n    https://github.com/k-takata/go-iscygpty\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/doc.go",
    "content": "// Package isatty implements interface to isatty\npackage isatty\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/isatty_appengine.go",
    "content": "// +build appengine\n\npackage isatty\n\n// IsTerminal returns true if the file descriptor is terminal which\n// is always false on on appengine classic which is a sandboxed PaaS.\nfunc IsTerminal(fd uintptr) bool {\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/isatty_bsd.go",
    "content": "// +build darwin freebsd openbsd netbsd dragonfly\n// +build !appengine\n\npackage isatty\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nconst ioctlReadTermios = syscall.TIOCGETA\n\n// IsTerminal return true if the file descriptor is terminal.\nfunc IsTerminal(fd uintptr) bool {\n\tvar termios syscall.Termios\n\t_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)\n\treturn err == 0\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/isatty_linux.go",
    "content": "// +build linux\n// +build !appengine\n\npackage isatty\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nconst ioctlReadTermios = syscall.TCGETS\n\n// IsTerminal return true if the file descriptor is terminal.\nfunc IsTerminal(fd uintptr) bool {\n\tvar termios syscall.Termios\n\t_, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0)\n\treturn err == 0\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/isatty_not_windows.go",
    "content": "// +build !windows appengine\n\npackage isatty\n\n// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2\n// terminal. This is also always false on this environment.\nfunc IsCygwinTerminal(fd uintptr) bool {\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/isatty_solaris.go",
    "content": "// +build solaris\n// +build !appengine\n\npackage isatty\n\nimport (\n\t\"golang.org/x/sys/unix\"\n)\n\n// IsTerminal returns true if the given file descriptor is a terminal.\n// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c\nfunc IsTerminal(fd uintptr) bool {\n\tvar termio unix.Termio\n\terr := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio)\n\treturn err == nil\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-isatty/isatty_windows.go",
    "content": "// +build windows\n// +build !appengine\n\npackage isatty\n\nimport (\n\t\"strings\"\n\t\"syscall\"\n\t\"unicode/utf16\"\n\t\"unsafe\"\n)\n\nconst (\n\tfileNameInfo uintptr = 2\n\tfileTypePipe         = 3\n)\n\nvar (\n\tkernel32                         = syscall.NewLazyDLL(\"kernel32.dll\")\n\tprocGetConsoleMode               = kernel32.NewProc(\"GetConsoleMode\")\n\tprocGetFileInformationByHandleEx = kernel32.NewProc(\"GetFileInformationByHandleEx\")\n\tprocGetFileType                  = kernel32.NewProc(\"GetFileType\")\n)\n\nfunc init() {\n\t// Check if GetFileInformationByHandleEx is available.\n\tif procGetFileInformationByHandleEx.Find() != nil {\n\t\tprocGetFileInformationByHandleEx = nil\n\t}\n}\n\n// IsTerminal return true if the file descriptor is terminal.\nfunc IsTerminal(fd uintptr) bool {\n\tvar st uint32\n\tr, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0)\n\treturn r != 0 && e == 0\n}\n\n// Check pipe name is used for cygwin/msys2 pty.\n// Cygwin/MSYS2 PTY has a name like:\n//   \\{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master\nfunc isCygwinPipeName(name string) bool {\n\ttoken := strings.Split(name, \"-\")\n\tif len(token) < 5 {\n\t\treturn false\n\t}\n\n\tif token[0] != `\\msys` && token[0] != `\\cygwin` {\n\t\treturn false\n\t}\n\n\tif token[1] == \"\" {\n\t\treturn false\n\t}\n\n\tif !strings.HasPrefix(token[2], \"pty\") {\n\t\treturn false\n\t}\n\n\tif token[3] != `from` && token[3] != `to` {\n\t\treturn false\n\t}\n\n\tif token[4] != \"master\" {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2\n// terminal.\nfunc IsCygwinTerminal(fd uintptr) bool {\n\tif procGetFileInformationByHandleEx == nil {\n\t\treturn false\n\t}\n\n\t// Cygwin/msys's pty is a pipe.\n\tft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0)\n\tif ft != fileTypePipe || e != 0 {\n\t\treturn false\n\t}\n\n\tvar buf [2 + syscall.MAX_PATH]uint16\n\tr, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(),\n\t\t4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)),\n\t\tuintptr(len(buf)*2), 0, 0)\n\tif r == 0 || e != 0 {\n\t\treturn false\n\t}\n\n\tl := *(*uint32)(unsafe.Pointer(&buf))\n\treturn isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2])))\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-runewidth/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Yasuhiro Matsumoto\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": "vendor/github.com/mattn/go-runewidth/README.mkd",
    "content": "go-runewidth\n============\n\n[![Build Status](https://travis-ci.org/mattn/go-runewidth.png?branch=master)](https://travis-ci.org/mattn/go-runewidth)\n[![Coverage Status](https://coveralls.io/repos/mattn/go-runewidth/badge.png?branch=HEAD)](https://coveralls.io/r/mattn/go-runewidth?branch=HEAD)\n[![GoDoc](https://godoc.org/github.com/mattn/go-runewidth?status.svg)](http://godoc.org/github.com/mattn/go-runewidth)\n[![Go Report Card](https://goreportcard.com/badge/github.com/mattn/go-runewidth)](https://goreportcard.com/report/github.com/mattn/go-runewidth)\n\nProvides functions to get fixed width of the character or string.\n\nUsage\n-----\n\n```go\nrunewidth.StringWidth(\"つのだ☆HIRO\") == 12\n```\n\n\nAuthor\n------\n\nYasuhiro Matsumoto\n\nLicense\n-------\n\nunder the MIT License: http://mattn.mit-license.org/2013\n"
  },
  {
    "path": "vendor/github.com/mattn/go-runewidth/runewidth.go",
    "content": "package runewidth\n\nvar (\n\t// EastAsianWidth will be set true if the current locale is CJK\n\tEastAsianWidth = IsEastAsian()\n\n\t// DefaultCondition is a condition in current locale\n\tDefaultCondition = &Condition{EastAsianWidth}\n)\n\ntype interval struct {\n\tfirst rune\n\tlast  rune\n}\n\ntype table []interval\n\nfunc inTables(r rune, ts ...table) bool {\n\tfor _, t := range ts {\n\t\tif inTable(r, t) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc inTable(r rune, t table) bool {\n\t// func (t table) IncludesRune(r rune) bool {\n\tif r < t[0].first {\n\t\treturn false\n\t}\n\n\tbot := 0\n\ttop := len(t) - 1\n\tfor top >= bot {\n\t\tmid := (bot + top) / 2\n\n\t\tswitch {\n\t\tcase t[mid].last < r:\n\t\t\tbot = mid + 1\n\t\tcase t[mid].first > r:\n\t\t\ttop = mid - 1\n\t\tdefault:\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nvar private = table{\n\t{0x00E000, 0x00F8FF}, {0x0F0000, 0x0FFFFD}, {0x100000, 0x10FFFD},\n}\n\nvar nonprint = table{\n\t{0x0000, 0x001F}, {0x007F, 0x009F}, {0x00AD, 0x00AD},\n\t{0x070F, 0x070F}, {0x180B, 0x180E}, {0x200B, 0x200F},\n\t{0x202A, 0x202E}, {0x206A, 0x206F}, {0xD800, 0xDFFF},\n\t{0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFB}, {0xFFFE, 0xFFFF},\n}\n\nvar combining = table{\n\t{0x0300, 0x036F}, {0x0483, 0x0489}, {0x0591, 0x05BD},\n\t{0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C5},\n\t{0x05C7, 0x05C7}, {0x0610, 0x061A}, {0x064B, 0x065F},\n\t{0x0670, 0x0670}, {0x06D6, 0x06DC}, {0x06DF, 0x06E4},\n\t{0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x0711, 0x0711},\n\t{0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x07EB, 0x07F3},\n\t{0x0816, 0x0819}, {0x081B, 0x0823}, {0x0825, 0x0827},\n\t{0x0829, 0x082D}, {0x0859, 0x085B}, {0x08D4, 0x08E1},\n\t{0x08E3, 0x0903}, {0x093A, 0x093C}, {0x093E, 0x094F},\n\t{0x0951, 0x0957}, {0x0962, 0x0963}, {0x0981, 0x0983},\n\t{0x09BC, 0x09BC}, {0x09BE, 0x09C4}, {0x09C7, 0x09C8},\n\t{0x09CB, 0x09CD}, {0x09D7, 0x09D7}, {0x09E2, 0x09E3},\n\t{0x0A01, 0x0A03}, {0x0A3C, 0x0A3C}, {0x0A3E, 0x0A42},\n\t{0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A51, 0x0A51},\n\t{0x0A70, 0x0A71}, {0x0A75, 0x0A75}, {0x0A81, 0x0A83},\n\t{0x0ABC, 0x0ABC}, {0x0ABE, 0x0AC5}, {0x0AC7, 0x0AC9},\n\t{0x0ACB, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0B01, 0x0B03},\n\t{0x0B3C, 0x0B3C}, {0x0B3E, 0x0B44}, {0x0B47, 0x0B48},\n\t{0x0B4B, 0x0B4D}, {0x0B56, 0x0B57}, {0x0B62, 0x0B63},\n\t{0x0B82, 0x0B82}, {0x0BBE, 0x0BC2}, {0x0BC6, 0x0BC8},\n\t{0x0BCA, 0x0BCD}, {0x0BD7, 0x0BD7}, {0x0C00, 0x0C03},\n\t{0x0C3E, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D},\n\t{0x0C55, 0x0C56}, {0x0C62, 0x0C63}, {0x0C81, 0x0C83},\n\t{0x0CBC, 0x0CBC}, {0x0CBE, 0x0CC4}, {0x0CC6, 0x0CC8},\n\t{0x0CCA, 0x0CCD}, {0x0CD5, 0x0CD6}, {0x0CE2, 0x0CE3},\n\t{0x0D01, 0x0D03}, {0x0D3E, 0x0D44}, {0x0D46, 0x0D48},\n\t{0x0D4A, 0x0D4D}, {0x0D57, 0x0D57}, {0x0D62, 0x0D63},\n\t{0x0D82, 0x0D83}, {0x0DCA, 0x0DCA}, {0x0DCF, 0x0DD4},\n\t{0x0DD6, 0x0DD6}, {0x0DD8, 0x0DDF}, {0x0DF2, 0x0DF3},\n\t{0x0E31, 0x0E31}, {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E},\n\t{0x0EB1, 0x0EB1}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC},\n\t{0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0F35},\n\t{0x0F37, 0x0F37}, {0x0F39, 0x0F39}, {0x0F3E, 0x0F3F},\n\t{0x0F71, 0x0F84}, {0x0F86, 0x0F87}, {0x0F8D, 0x0F97},\n\t{0x0F99, 0x0FBC}, {0x0FC6, 0x0FC6}, {0x102B, 0x103E},\n\t{0x1056, 0x1059}, {0x105E, 0x1060}, {0x1062, 0x1064},\n\t{0x1067, 0x106D}, {0x1071, 0x1074}, {0x1082, 0x108D},\n\t{0x108F, 0x108F}, {0x109A, 0x109D}, {0x135D, 0x135F},\n\t{0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753},\n\t{0x1772, 0x1773}, {0x17B4, 0x17D3}, {0x17DD, 0x17DD},\n\t{0x180B, 0x180D}, {0x1885, 0x1886}, {0x18A9, 0x18A9},\n\t{0x1920, 0x192B}, {0x1930, 0x193B}, {0x1A17, 0x1A1B},\n\t{0x1A55, 0x1A5E}, {0x1A60, 0x1A7C}, {0x1A7F, 0x1A7F},\n\t{0x1AB0, 0x1ABE}, {0x1B00, 0x1B04}, {0x1B34, 0x1B44},\n\t{0x1B6B, 0x1B73}, {0x1B80, 0x1B82}, {0x1BA1, 0x1BAD},\n\t{0x1BE6, 0x1BF3}, {0x1C24, 0x1C37}, {0x1CD0, 0x1CD2},\n\t{0x1CD4, 0x1CE8}, {0x1CED, 0x1CED}, {0x1CF2, 0x1CF4},\n\t{0x1CF8, 0x1CF9}, {0x1DC0, 0x1DF5}, {0x1DFB, 0x1DFF},\n\t{0x20D0, 0x20F0}, {0x2CEF, 0x2CF1}, {0x2D7F, 0x2D7F},\n\t{0x2DE0, 0x2DFF}, {0x302A, 0x302F}, {0x3099, 0x309A},\n\t{0xA66F, 0xA672}, {0xA674, 0xA67D}, {0xA69E, 0xA69F},\n\t{0xA6F0, 0xA6F1}, {0xA802, 0xA802}, {0xA806, 0xA806},\n\t{0xA80B, 0xA80B}, {0xA823, 0xA827}, {0xA880, 0xA881},\n\t{0xA8B4, 0xA8C5}, {0xA8E0, 0xA8F1}, {0xA926, 0xA92D},\n\t{0xA947, 0xA953}, {0xA980, 0xA983}, {0xA9B3, 0xA9C0},\n\t{0xA9E5, 0xA9E5}, {0xAA29, 0xAA36}, {0xAA43, 0xAA43},\n\t{0xAA4C, 0xAA4D}, {0xAA7B, 0xAA7D}, {0xAAB0, 0xAAB0},\n\t{0xAAB2, 0xAAB4}, {0xAAB7, 0xAAB8}, {0xAABE, 0xAABF},\n\t{0xAAC1, 0xAAC1}, {0xAAEB, 0xAAEF}, {0xAAF5, 0xAAF6},\n\t{0xABE3, 0xABEA}, {0xABEC, 0xABED}, {0xFB1E, 0xFB1E},\n\t{0xFE00, 0xFE0F}, {0xFE20, 0xFE2F}, {0x101FD, 0x101FD},\n\t{0x102E0, 0x102E0}, {0x10376, 0x1037A}, {0x10A01, 0x10A03},\n\t{0x10A05, 0x10A06}, {0x10A0C, 0x10A0F}, {0x10A38, 0x10A3A},\n\t{0x10A3F, 0x10A3F}, {0x10AE5, 0x10AE6}, {0x11000, 0x11002},\n\t{0x11038, 0x11046}, {0x1107F, 0x11082}, {0x110B0, 0x110BA},\n\t{0x11100, 0x11102}, {0x11127, 0x11134}, {0x11173, 0x11173},\n\t{0x11180, 0x11182}, {0x111B3, 0x111C0}, {0x111CA, 0x111CC},\n\t{0x1122C, 0x11237}, {0x1123E, 0x1123E}, {0x112DF, 0x112EA},\n\t{0x11300, 0x11303}, {0x1133C, 0x1133C}, {0x1133E, 0x11344},\n\t{0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11357, 0x11357},\n\t{0x11362, 0x11363}, {0x11366, 0x1136C}, {0x11370, 0x11374},\n\t{0x11435, 0x11446}, {0x114B0, 0x114C3}, {0x115AF, 0x115B5},\n\t{0x115B8, 0x115C0}, {0x115DC, 0x115DD}, {0x11630, 0x11640},\n\t{0x116AB, 0x116B7}, {0x1171D, 0x1172B}, {0x11C2F, 0x11C36},\n\t{0x11C38, 0x11C3F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6},\n\t{0x16AF0, 0x16AF4}, {0x16B30, 0x16B36}, {0x16F51, 0x16F7E},\n\t{0x16F8F, 0x16F92}, {0x1BC9D, 0x1BC9E}, {0x1D165, 0x1D169},\n\t{0x1D16D, 0x1D172}, {0x1D17B, 0x1D182}, {0x1D185, 0x1D18B},\n\t{0x1D1AA, 0x1D1AD}, {0x1D242, 0x1D244}, {0x1DA00, 0x1DA36},\n\t{0x1DA3B, 0x1DA6C}, {0x1DA75, 0x1DA75}, {0x1DA84, 0x1DA84},\n\t{0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006},\n\t{0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E023, 0x1E024},\n\t{0x1E026, 0x1E02A}, {0x1E8D0, 0x1E8D6}, {0x1E944, 0x1E94A},\n\t{0xE0100, 0xE01EF},\n}\n\nvar doublewidth = table{\n\t{0x1100, 0x115F}, {0x231A, 0x231B}, {0x2329, 0x232A},\n\t{0x23E9, 0x23EC}, {0x23F0, 0x23F0}, {0x23F3, 0x23F3},\n\t{0x25FD, 0x25FE}, {0x2614, 0x2615}, {0x2648, 0x2653},\n\t{0x267F, 0x267F}, {0x2693, 0x2693}, {0x26A1, 0x26A1},\n\t{0x26AA, 0x26AB}, {0x26BD, 0x26BE}, {0x26C4, 0x26C5},\n\t{0x26CE, 0x26CE}, {0x26D4, 0x26D4}, {0x26EA, 0x26EA},\n\t{0x26F2, 0x26F3}, {0x26F5, 0x26F5}, {0x26FA, 0x26FA},\n\t{0x26FD, 0x26FD}, {0x2705, 0x2705}, {0x270A, 0x270B},\n\t{0x2728, 0x2728}, {0x274C, 0x274C}, {0x274E, 0x274E},\n\t{0x2753, 0x2755}, {0x2757, 0x2757}, {0x2795, 0x2797},\n\t{0x27B0, 0x27B0}, {0x27BF, 0x27BF}, {0x2B1B, 0x2B1C},\n\t{0x2B50, 0x2B50}, {0x2B55, 0x2B55}, {0x2E80, 0x2E99},\n\t{0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB},\n\t{0x3000, 0x303E}, {0x3041, 0x3096}, {0x3099, 0x30FF},\n\t{0x3105, 0x312D}, {0x3131, 0x318E}, {0x3190, 0x31BA},\n\t{0x31C0, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0x3247},\n\t{0x3250, 0x32FE}, {0x3300, 0x4DBF}, {0x4E00, 0xA48C},\n\t{0xA490, 0xA4C6}, {0xA960, 0xA97C}, {0xAC00, 0xD7A3},\n\t{0xF900, 0xFAFF}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52},\n\t{0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, {0xFF01, 0xFF60},\n\t{0xFFE0, 0xFFE6}, {0x16FE0, 0x16FE0}, {0x17000, 0x187EC},\n\t{0x18800, 0x18AF2}, {0x1B000, 0x1B001}, {0x1F004, 0x1F004},\n\t{0x1F0CF, 0x1F0CF}, {0x1F18E, 0x1F18E}, {0x1F191, 0x1F19A},\n\t{0x1F200, 0x1F202}, {0x1F210, 0x1F23B}, {0x1F240, 0x1F248},\n\t{0x1F250, 0x1F251}, {0x1F300, 0x1F320}, {0x1F32D, 0x1F335},\n\t{0x1F337, 0x1F37C}, {0x1F37E, 0x1F393}, {0x1F3A0, 0x1F3CA},\n\t{0x1F3CF, 0x1F3D3}, {0x1F3E0, 0x1F3F0}, {0x1F3F4, 0x1F3F4},\n\t{0x1F3F8, 0x1F43E}, {0x1F440, 0x1F440}, {0x1F442, 0x1F4FC},\n\t{0x1F4FF, 0x1F53D}, {0x1F54B, 0x1F54E}, {0x1F550, 0x1F567},\n\t{0x1F57A, 0x1F57A}, {0x1F595, 0x1F596}, {0x1F5A4, 0x1F5A4},\n\t{0x1F5FB, 0x1F64F}, {0x1F680, 0x1F6C5}, {0x1F6CC, 0x1F6CC},\n\t{0x1F6D0, 0x1F6D2}, {0x1F6EB, 0x1F6EC}, {0x1F6F4, 0x1F6F6},\n\t{0x1F910, 0x1F91E}, {0x1F920, 0x1F927}, {0x1F930, 0x1F930},\n\t{0x1F933, 0x1F93E}, {0x1F940, 0x1F94B}, {0x1F950, 0x1F95E},\n\t{0x1F980, 0x1F991}, {0x1F9C0, 0x1F9C0}, {0x20000, 0x2FFFD},\n\t{0x30000, 0x3FFFD},\n}\n\nvar ambiguous = table{\n\t{0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8},\n\t{0x00AA, 0x00AA}, {0x00AD, 0x00AE}, {0x00B0, 0x00B4},\n\t{0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6},\n\t{0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1},\n\t{0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED},\n\t{0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA},\n\t{0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101},\n\t{0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B},\n\t{0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133},\n\t{0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144},\n\t{0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153},\n\t{0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE},\n\t{0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4},\n\t{0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA},\n\t{0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261},\n\t{0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB},\n\t{0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB},\n\t{0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0300, 0x036F},\n\t{0x0391, 0x03A1}, {0x03A3, 0x03A9}, {0x03B1, 0x03C1},\n\t{0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F},\n\t{0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016},\n\t{0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022},\n\t{0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033},\n\t{0x2035, 0x2035}, {0x203B, 0x203B}, {0x203E, 0x203E},\n\t{0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084},\n\t{0x20AC, 0x20AC}, {0x2103, 0x2103}, {0x2105, 0x2105},\n\t{0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116},\n\t{0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B},\n\t{0x2153, 0x2154}, {0x215B, 0x215E}, {0x2160, 0x216B},\n\t{0x2170, 0x2179}, {0x2189, 0x2189}, {0x2190, 0x2199},\n\t{0x21B8, 0x21B9}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4},\n\t{0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203},\n\t{0x2207, 0x2208}, {0x220B, 0x220B}, {0x220F, 0x220F},\n\t{0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A},\n\t{0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225},\n\t{0x2227, 0x222C}, {0x222E, 0x222E}, {0x2234, 0x2237},\n\t{0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C},\n\t{0x2252, 0x2252}, {0x2260, 0x2261}, {0x2264, 0x2267},\n\t{0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283},\n\t{0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299},\n\t{0x22A5, 0x22A5}, {0x22BF, 0x22BF}, {0x2312, 0x2312},\n\t{0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573},\n\t{0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1},\n\t{0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7},\n\t{0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8},\n\t{0x25CB, 0x25CB}, {0x25CE, 0x25D1}, {0x25E2, 0x25E5},\n\t{0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609},\n\t{0x260E, 0x260F}, {0x261C, 0x261C}, {0x261E, 0x261E},\n\t{0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661},\n\t{0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D},\n\t{0x266F, 0x266F}, {0x269E, 0x269F}, {0x26BF, 0x26BF},\n\t{0x26C6, 0x26CD}, {0x26CF, 0x26D3}, {0x26D5, 0x26E1},\n\t{0x26E3, 0x26E3}, {0x26E8, 0x26E9}, {0x26EB, 0x26F1},\n\t{0x26F4, 0x26F4}, {0x26F6, 0x26F9}, {0x26FB, 0x26FC},\n\t{0x26FE, 0x26FF}, {0x273D, 0x273D}, {0x2776, 0x277F},\n\t{0x2B56, 0x2B59}, {0x3248, 0x324F}, {0xE000, 0xF8FF},\n\t{0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, {0x1F100, 0x1F10A},\n\t{0x1F110, 0x1F12D}, {0x1F130, 0x1F169}, {0x1F170, 0x1F18D},\n\t{0x1F18F, 0x1F190}, {0x1F19B, 0x1F1AC}, {0xE0100, 0xE01EF},\n\t{0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD},\n}\n\nvar emoji = table{\n\t{0x1F1E6, 0x1F1FF}, {0x1F321, 0x1F321}, {0x1F324, 0x1F32C},\n\t{0x1F336, 0x1F336}, {0x1F37D, 0x1F37D}, {0x1F396, 0x1F397},\n\t{0x1F399, 0x1F39B}, {0x1F39E, 0x1F39F}, {0x1F3CB, 0x1F3CE},\n\t{0x1F3D4, 0x1F3DF}, {0x1F3F3, 0x1F3F5}, {0x1F3F7, 0x1F3F7},\n\t{0x1F43F, 0x1F43F}, {0x1F441, 0x1F441}, {0x1F4FD, 0x1F4FD},\n\t{0x1F549, 0x1F54A}, {0x1F56F, 0x1F570}, {0x1F573, 0x1F579},\n\t{0x1F587, 0x1F587}, {0x1F58A, 0x1F58D}, {0x1F590, 0x1F590},\n\t{0x1F5A5, 0x1F5A5}, {0x1F5A8, 0x1F5A8}, {0x1F5B1, 0x1F5B2},\n\t{0x1F5BC, 0x1F5BC}, {0x1F5C2, 0x1F5C4}, {0x1F5D1, 0x1F5D3},\n\t{0x1F5DC, 0x1F5DE}, {0x1F5E1, 0x1F5E1}, {0x1F5E3, 0x1F5E3},\n\t{0x1F5E8, 0x1F5E8}, {0x1F5EF, 0x1F5EF}, {0x1F5F3, 0x1F5F3},\n\t{0x1F5FA, 0x1F5FA}, {0x1F6CB, 0x1F6CF}, {0x1F6E0, 0x1F6E5},\n\t{0x1F6E9, 0x1F6E9}, {0x1F6F0, 0x1F6F0}, {0x1F6F3, 0x1F6F3},\n}\n\nvar notassigned = table{\n\t{0x0378, 0x0379}, {0x0380, 0x0383}, {0x038B, 0x038B},\n\t{0x038D, 0x038D}, {0x03A2, 0x03A2}, {0x0530, 0x0530},\n\t{0x0557, 0x0558}, {0x0560, 0x0560}, {0x0588, 0x0588},\n\t{0x058B, 0x058C}, {0x0590, 0x0590}, {0x05C8, 0x05CF},\n\t{0x05EB, 0x05EF}, {0x05F5, 0x05FF}, {0x061D, 0x061D},\n\t{0x070E, 0x070E}, {0x074B, 0x074C}, {0x07B2, 0x07BF},\n\t{0x07FB, 0x07FF}, {0x082E, 0x082F}, {0x083F, 0x083F},\n\t{0x085C, 0x085D}, {0x085F, 0x089F}, {0x08B5, 0x08B5},\n\t{0x08BE, 0x08D3}, {0x0984, 0x0984}, {0x098D, 0x098E},\n\t{0x0991, 0x0992}, {0x09A9, 0x09A9}, {0x09B1, 0x09B1},\n\t{0x09B3, 0x09B5}, {0x09BA, 0x09BB}, {0x09C5, 0x09C6},\n\t{0x09C9, 0x09CA}, {0x09CF, 0x09D6}, {0x09D8, 0x09DB},\n\t{0x09DE, 0x09DE}, {0x09E4, 0x09E5}, {0x09FC, 0x0A00},\n\t{0x0A04, 0x0A04}, {0x0A0B, 0x0A0E}, {0x0A11, 0x0A12},\n\t{0x0A29, 0x0A29}, {0x0A31, 0x0A31}, {0x0A34, 0x0A34},\n\t{0x0A37, 0x0A37}, {0x0A3A, 0x0A3B}, {0x0A3D, 0x0A3D},\n\t{0x0A43, 0x0A46}, {0x0A49, 0x0A4A}, {0x0A4E, 0x0A50},\n\t{0x0A52, 0x0A58}, {0x0A5D, 0x0A5D}, {0x0A5F, 0x0A65},\n\t{0x0A76, 0x0A80}, {0x0A84, 0x0A84}, {0x0A8E, 0x0A8E},\n\t{0x0A92, 0x0A92}, {0x0AA9, 0x0AA9}, {0x0AB1, 0x0AB1},\n\t{0x0AB4, 0x0AB4}, {0x0ABA, 0x0ABB}, {0x0AC6, 0x0AC6},\n\t{0x0ACA, 0x0ACA}, {0x0ACE, 0x0ACF}, {0x0AD1, 0x0ADF},\n\t{0x0AE4, 0x0AE5}, {0x0AF2, 0x0AF8}, {0x0AFA, 0x0B00},\n\t{0x0B04, 0x0B04}, {0x0B0D, 0x0B0E}, {0x0B11, 0x0B12},\n\t{0x0B29, 0x0B29}, {0x0B31, 0x0B31}, {0x0B34, 0x0B34},\n\t{0x0B3A, 0x0B3B}, {0x0B45, 0x0B46}, {0x0B49, 0x0B4A},\n\t{0x0B4E, 0x0B55}, {0x0B58, 0x0B5B}, {0x0B5E, 0x0B5E},\n\t{0x0B64, 0x0B65}, {0x0B78, 0x0B81}, {0x0B84, 0x0B84},\n\t{0x0B8B, 0x0B8D}, {0x0B91, 0x0B91}, {0x0B96, 0x0B98},\n\t{0x0B9B, 0x0B9B}, {0x0B9D, 0x0B9D}, {0x0BA0, 0x0BA2},\n\t{0x0BA5, 0x0BA7}, {0x0BAB, 0x0BAD}, {0x0BBA, 0x0BBD},\n\t{0x0BC3, 0x0BC5}, {0x0BC9, 0x0BC9}, {0x0BCE, 0x0BCF},\n\t{0x0BD1, 0x0BD6}, {0x0BD8, 0x0BE5}, {0x0BFB, 0x0BFF},\n\t{0x0C04, 0x0C04}, {0x0C0D, 0x0C0D}, {0x0C11, 0x0C11},\n\t{0x0C29, 0x0C29}, {0x0C3A, 0x0C3C}, {0x0C45, 0x0C45},\n\t{0x0C49, 0x0C49}, {0x0C4E, 0x0C54}, {0x0C57, 0x0C57},\n\t{0x0C5B, 0x0C5F}, {0x0C64, 0x0C65}, {0x0C70, 0x0C77},\n\t{0x0C84, 0x0C84}, {0x0C8D, 0x0C8D}, {0x0C91, 0x0C91},\n\t{0x0CA9, 0x0CA9}, {0x0CB4, 0x0CB4}, {0x0CBA, 0x0CBB},\n\t{0x0CC5, 0x0CC5}, {0x0CC9, 0x0CC9}, {0x0CCE, 0x0CD4},\n\t{0x0CD7, 0x0CDD}, {0x0CDF, 0x0CDF}, {0x0CE4, 0x0CE5},\n\t{0x0CF0, 0x0CF0}, {0x0CF3, 0x0D00}, {0x0D04, 0x0D04},\n\t{0x0D0D, 0x0D0D}, {0x0D11, 0x0D11}, {0x0D3B, 0x0D3C},\n\t{0x0D45, 0x0D45}, {0x0D49, 0x0D49}, {0x0D50, 0x0D53},\n\t{0x0D64, 0x0D65}, {0x0D80, 0x0D81}, {0x0D84, 0x0D84},\n\t{0x0D97, 0x0D99}, {0x0DB2, 0x0DB2}, {0x0DBC, 0x0DBC},\n\t{0x0DBE, 0x0DBF}, {0x0DC7, 0x0DC9}, {0x0DCB, 0x0DCE},\n\t{0x0DD5, 0x0DD5}, {0x0DD7, 0x0DD7}, {0x0DE0, 0x0DE5},\n\t{0x0DF0, 0x0DF1}, {0x0DF5, 0x0E00}, {0x0E3B, 0x0E3E},\n\t{0x0E5C, 0x0E80}, {0x0E83, 0x0E83}, {0x0E85, 0x0E86},\n\t{0x0E89, 0x0E89}, {0x0E8B, 0x0E8C}, {0x0E8E, 0x0E93},\n\t{0x0E98, 0x0E98}, {0x0EA0, 0x0EA0}, {0x0EA4, 0x0EA4},\n\t{0x0EA6, 0x0EA6}, {0x0EA8, 0x0EA9}, {0x0EAC, 0x0EAC},\n\t{0x0EBA, 0x0EBA}, {0x0EBE, 0x0EBF}, {0x0EC5, 0x0EC5},\n\t{0x0EC7, 0x0EC7}, {0x0ECE, 0x0ECF}, {0x0EDA, 0x0EDB},\n\t{0x0EE0, 0x0EFF}, {0x0F48, 0x0F48}, {0x0F6D, 0x0F70},\n\t{0x0F98, 0x0F98}, {0x0FBD, 0x0FBD}, {0x0FCD, 0x0FCD},\n\t{0x0FDB, 0x0FFF}, {0x10C6, 0x10C6}, {0x10C8, 0x10CC},\n\t{0x10CE, 0x10CF}, {0x1249, 0x1249}, {0x124E, 0x124F},\n\t{0x1257, 0x1257}, {0x1259, 0x1259}, {0x125E, 0x125F},\n\t{0x1289, 0x1289}, {0x128E, 0x128F}, {0x12B1, 0x12B1},\n\t{0x12B6, 0x12B7}, {0x12BF, 0x12BF}, {0x12C1, 0x12C1},\n\t{0x12C6, 0x12C7}, {0x12D7, 0x12D7}, {0x1311, 0x1311},\n\t{0x1316, 0x1317}, {0x135B, 0x135C}, {0x137D, 0x137F},\n\t{0x139A, 0x139F}, {0x13F6, 0x13F7}, {0x13FE, 0x13FF},\n\t{0x169D, 0x169F}, {0x16F9, 0x16FF}, {0x170D, 0x170D},\n\t{0x1715, 0x171F}, {0x1737, 0x173F}, {0x1754, 0x175F},\n\t{0x176D, 0x176D}, {0x1771, 0x1771}, {0x1774, 0x177F},\n\t{0x17DE, 0x17DF}, {0x17EA, 0x17EF}, {0x17FA, 0x17FF},\n\t{0x180F, 0x180F}, {0x181A, 0x181F}, {0x1878, 0x187F},\n\t{0x18AB, 0x18AF}, {0x18F6, 0x18FF}, {0x191F, 0x191F},\n\t{0x192C, 0x192F}, {0x193C, 0x193F}, {0x1941, 0x1943},\n\t{0x196E, 0x196F}, {0x1975, 0x197F}, {0x19AC, 0x19AF},\n\t{0x19CA, 0x19CF}, {0x19DB, 0x19DD}, {0x1A1C, 0x1A1D},\n\t{0x1A5F, 0x1A5F}, {0x1A7D, 0x1A7E}, {0x1A8A, 0x1A8F},\n\t{0x1A9A, 0x1A9F}, {0x1AAE, 0x1AAF}, {0x1ABF, 0x1AFF},\n\t{0x1B4C, 0x1B4F}, {0x1B7D, 0x1B7F}, {0x1BF4, 0x1BFB},\n\t{0x1C38, 0x1C3A}, {0x1C4A, 0x1C4C}, {0x1C89, 0x1CBF},\n\t{0x1CC8, 0x1CCF}, {0x1CF7, 0x1CF7}, {0x1CFA, 0x1CFF},\n\t{0x1DF6, 0x1DFA}, {0x1F16, 0x1F17}, {0x1F1E, 0x1F1F},\n\t{0x1F46, 0x1F47}, {0x1F4E, 0x1F4F}, {0x1F58, 0x1F58},\n\t{0x1F5A, 0x1F5A}, {0x1F5C, 0x1F5C}, {0x1F5E, 0x1F5E},\n\t{0x1F7E, 0x1F7F}, {0x1FB5, 0x1FB5}, {0x1FC5, 0x1FC5},\n\t{0x1FD4, 0x1FD5}, {0x1FDC, 0x1FDC}, {0x1FF0, 0x1FF1},\n\t{0x1FF5, 0x1FF5}, {0x1FFF, 0x1FFF}, {0x2065, 0x2065},\n\t{0x2072, 0x2073}, {0x208F, 0x208F}, {0x209D, 0x209F},\n\t{0x20BF, 0x20CF}, {0x20F1, 0x20FF}, {0x218C, 0x218F},\n\t{0x23FF, 0x23FF}, {0x2427, 0x243F}, {0x244B, 0x245F},\n\t{0x2B74, 0x2B75}, {0x2B96, 0x2B97}, {0x2BBA, 0x2BBC},\n\t{0x2BC9, 0x2BC9}, {0x2BD2, 0x2BEB}, {0x2BF0, 0x2BFF},\n\t{0x2C2F, 0x2C2F}, {0x2C5F, 0x2C5F}, {0x2CF4, 0x2CF8},\n\t{0x2D26, 0x2D26}, {0x2D28, 0x2D2C}, {0x2D2E, 0x2D2F},\n\t{0x2D68, 0x2D6E}, {0x2D71, 0x2D7E}, {0x2D97, 0x2D9F},\n\t{0x2DA7, 0x2DA7}, {0x2DAF, 0x2DAF}, {0x2DB7, 0x2DB7},\n\t{0x2DBF, 0x2DBF}, {0x2DC7, 0x2DC7}, {0x2DCF, 0x2DCF},\n\t{0x2DD7, 0x2DD7}, {0x2DDF, 0x2DDF}, {0x2E45, 0x2E7F},\n\t{0x2E9A, 0x2E9A}, {0x2EF4, 0x2EFF}, {0x2FD6, 0x2FEF},\n\t{0x2FFC, 0x2FFF}, {0x3040, 0x3040}, {0x3097, 0x3098},\n\t{0x3100, 0x3104}, {0x312E, 0x3130}, {0x318F, 0x318F},\n\t{0x31BB, 0x31BF}, {0x31E4, 0x31EF}, {0x321F, 0x321F},\n\t{0x32FF, 0x32FF}, {0x4DB6, 0x4DBF}, {0x9FD6, 0x9FFF},\n\t{0xA48D, 0xA48F}, {0xA4C7, 0xA4CF}, {0xA62C, 0xA63F},\n\t{0xA6F8, 0xA6FF}, {0xA7AF, 0xA7AF}, {0xA7B8, 0xA7F6},\n\t{0xA82C, 0xA82F}, {0xA83A, 0xA83F}, {0xA878, 0xA87F},\n\t{0xA8C6, 0xA8CD}, {0xA8DA, 0xA8DF}, {0xA8FE, 0xA8FF},\n\t{0xA954, 0xA95E}, {0xA97D, 0xA97F}, {0xA9CE, 0xA9CE},\n\t{0xA9DA, 0xA9DD}, {0xA9FF, 0xA9FF}, {0xAA37, 0xAA3F},\n\t{0xAA4E, 0xAA4F}, {0xAA5A, 0xAA5B}, {0xAAC3, 0xAADA},\n\t{0xAAF7, 0xAB00}, {0xAB07, 0xAB08}, {0xAB0F, 0xAB10},\n\t{0xAB17, 0xAB1F}, {0xAB27, 0xAB27}, {0xAB2F, 0xAB2F},\n\t{0xAB66, 0xAB6F}, {0xABEE, 0xABEF}, {0xABFA, 0xABFF},\n\t{0xD7A4, 0xD7AF}, {0xD7C7, 0xD7CA}, {0xD7FC, 0xD7FF},\n\t{0xFA6E, 0xFA6F}, {0xFADA, 0xFAFF}, {0xFB07, 0xFB12},\n\t{0xFB18, 0xFB1C}, {0xFB37, 0xFB37}, {0xFB3D, 0xFB3D},\n\t{0xFB3F, 0xFB3F}, {0xFB42, 0xFB42}, {0xFB45, 0xFB45},\n\t{0xFBC2, 0xFBD2}, {0xFD40, 0xFD4F}, {0xFD90, 0xFD91},\n\t{0xFDC8, 0xFDEF}, {0xFDFE, 0xFDFF}, {0xFE1A, 0xFE1F},\n\t{0xFE53, 0xFE53}, {0xFE67, 0xFE67}, {0xFE6C, 0xFE6F},\n\t{0xFE75, 0xFE75}, {0xFEFD, 0xFEFE}, {0xFF00, 0xFF00},\n\t{0xFFBF, 0xFFC1}, {0xFFC8, 0xFFC9}, {0xFFD0, 0xFFD1},\n\t{0xFFD8, 0xFFD9}, {0xFFDD, 0xFFDF}, {0xFFE7, 0xFFE7},\n\t{0xFFEF, 0xFFF8}, {0xFFFE, 0xFFFF}, {0x1000C, 0x1000C},\n\t{0x10027, 0x10027}, {0x1003B, 0x1003B}, {0x1003E, 0x1003E},\n\t{0x1004E, 0x1004F}, {0x1005E, 0x1007F}, {0x100FB, 0x100FF},\n\t{0x10103, 0x10106}, {0x10134, 0x10136}, {0x1018F, 0x1018F},\n\t{0x1019C, 0x1019F}, {0x101A1, 0x101CF}, {0x101FE, 0x1027F},\n\t{0x1029D, 0x1029F}, {0x102D1, 0x102DF}, {0x102FC, 0x102FF},\n\t{0x10324, 0x1032F}, {0x1034B, 0x1034F}, {0x1037B, 0x1037F},\n\t{0x1039E, 0x1039E}, {0x103C4, 0x103C7}, {0x103D6, 0x103FF},\n\t{0x1049E, 0x1049F}, {0x104AA, 0x104AF}, {0x104D4, 0x104D7},\n\t{0x104FC, 0x104FF}, {0x10528, 0x1052F}, {0x10564, 0x1056E},\n\t{0x10570, 0x105FF}, {0x10737, 0x1073F}, {0x10756, 0x1075F},\n\t{0x10768, 0x107FF}, {0x10806, 0x10807}, {0x10809, 0x10809},\n\t{0x10836, 0x10836}, {0x10839, 0x1083B}, {0x1083D, 0x1083E},\n\t{0x10856, 0x10856}, {0x1089F, 0x108A6}, {0x108B0, 0x108DF},\n\t{0x108F3, 0x108F3}, {0x108F6, 0x108FA}, {0x1091C, 0x1091E},\n\t{0x1093A, 0x1093E}, {0x10940, 0x1097F}, {0x109B8, 0x109BB},\n\t{0x109D0, 0x109D1}, {0x10A04, 0x10A04}, {0x10A07, 0x10A0B},\n\t{0x10A14, 0x10A14}, {0x10A18, 0x10A18}, {0x10A34, 0x10A37},\n\t{0x10A3B, 0x10A3E}, {0x10A48, 0x10A4F}, {0x10A59, 0x10A5F},\n\t{0x10AA0, 0x10ABF}, {0x10AE7, 0x10AEA}, {0x10AF7, 0x10AFF},\n\t{0x10B36, 0x10B38}, {0x10B56, 0x10B57}, {0x10B73, 0x10B77},\n\t{0x10B92, 0x10B98}, {0x10B9D, 0x10BA8}, {0x10BB0, 0x10BFF},\n\t{0x10C49, 0x10C7F}, {0x10CB3, 0x10CBF}, {0x10CF3, 0x10CF9},\n\t{0x10D00, 0x10E5F}, {0x10E7F, 0x10FFF}, {0x1104E, 0x11051},\n\t{0x11070, 0x1107E}, {0x110C2, 0x110CF}, {0x110E9, 0x110EF},\n\t{0x110FA, 0x110FF}, {0x11135, 0x11135}, {0x11144, 0x1114F},\n\t{0x11177, 0x1117F}, {0x111CE, 0x111CF}, {0x111E0, 0x111E0},\n\t{0x111F5, 0x111FF}, {0x11212, 0x11212}, {0x1123F, 0x1127F},\n\t{0x11287, 0x11287}, {0x11289, 0x11289}, {0x1128E, 0x1128E},\n\t{0x1129E, 0x1129E}, {0x112AA, 0x112AF}, {0x112EB, 0x112EF},\n\t{0x112FA, 0x112FF}, {0x11304, 0x11304}, {0x1130D, 0x1130E},\n\t{0x11311, 0x11312}, {0x11329, 0x11329}, {0x11331, 0x11331},\n\t{0x11334, 0x11334}, {0x1133A, 0x1133B}, {0x11345, 0x11346},\n\t{0x11349, 0x1134A}, {0x1134E, 0x1134F}, {0x11351, 0x11356},\n\t{0x11358, 0x1135C}, {0x11364, 0x11365}, {0x1136D, 0x1136F},\n\t{0x11375, 0x113FF}, {0x1145A, 0x1145A}, {0x1145C, 0x1145C},\n\t{0x1145E, 0x1147F}, {0x114C8, 0x114CF}, {0x114DA, 0x1157F},\n\t{0x115B6, 0x115B7}, {0x115DE, 0x115FF}, {0x11645, 0x1164F},\n\t{0x1165A, 0x1165F}, {0x1166D, 0x1167F}, {0x116B8, 0x116BF},\n\t{0x116CA, 0x116FF}, {0x1171A, 0x1171C}, {0x1172C, 0x1172F},\n\t{0x11740, 0x1189F}, {0x118F3, 0x118FE}, {0x11900, 0x11ABF},\n\t{0x11AF9, 0x11BFF}, {0x11C09, 0x11C09}, {0x11C37, 0x11C37},\n\t{0x11C46, 0x11C4F}, {0x11C6D, 0x11C6F}, {0x11C90, 0x11C91},\n\t{0x11CA8, 0x11CA8}, {0x11CB7, 0x11FFF}, {0x1239A, 0x123FF},\n\t{0x1246F, 0x1246F}, {0x12475, 0x1247F}, {0x12544, 0x12FFF},\n\t{0x1342F, 0x143FF}, {0x14647, 0x167FF}, {0x16A39, 0x16A3F},\n\t{0x16A5F, 0x16A5F}, {0x16A6A, 0x16A6D}, {0x16A70, 0x16ACF},\n\t{0x16AEE, 0x16AEF}, {0x16AF6, 0x16AFF}, {0x16B46, 0x16B4F},\n\t{0x16B5A, 0x16B5A}, {0x16B62, 0x16B62}, {0x16B78, 0x16B7C},\n\t{0x16B90, 0x16EFF}, {0x16F45, 0x16F4F}, {0x16F7F, 0x16F8E},\n\t{0x16FA0, 0x16FDF}, {0x16FE1, 0x16FFF}, {0x187ED, 0x187FF},\n\t{0x18AF3, 0x1AFFF}, {0x1B002, 0x1BBFF}, {0x1BC6B, 0x1BC6F},\n\t{0x1BC7D, 0x1BC7F}, {0x1BC89, 0x1BC8F}, {0x1BC9A, 0x1BC9B},\n\t{0x1BCA4, 0x1CFFF}, {0x1D0F6, 0x1D0FF}, {0x1D127, 0x1D128},\n\t{0x1D1E9, 0x1D1FF}, {0x1D246, 0x1D2FF}, {0x1D357, 0x1D35F},\n\t{0x1D372, 0x1D3FF}, {0x1D455, 0x1D455}, {0x1D49D, 0x1D49D},\n\t{0x1D4A0, 0x1D4A1}, {0x1D4A3, 0x1D4A4}, {0x1D4A7, 0x1D4A8},\n\t{0x1D4AD, 0x1D4AD}, {0x1D4BA, 0x1D4BA}, {0x1D4BC, 0x1D4BC},\n\t{0x1D4C4, 0x1D4C4}, {0x1D506, 0x1D506}, {0x1D50B, 0x1D50C},\n\t{0x1D515, 0x1D515}, {0x1D51D, 0x1D51D}, {0x1D53A, 0x1D53A},\n\t{0x1D53F, 0x1D53F}, {0x1D545, 0x1D545}, {0x1D547, 0x1D549},\n\t{0x1D551, 0x1D551}, {0x1D6A6, 0x1D6A7}, {0x1D7CC, 0x1D7CD},\n\t{0x1DA8C, 0x1DA9A}, {0x1DAA0, 0x1DAA0}, {0x1DAB0, 0x1DFFF},\n\t{0x1E007, 0x1E007}, {0x1E019, 0x1E01A}, {0x1E022, 0x1E022},\n\t{0x1E025, 0x1E025}, {0x1E02B, 0x1E7FF}, {0x1E8C5, 0x1E8C6},\n\t{0x1E8D7, 0x1E8FF}, {0x1E94B, 0x1E94F}, {0x1E95A, 0x1E95D},\n\t{0x1E960, 0x1EDFF}, {0x1EE04, 0x1EE04}, {0x1EE20, 0x1EE20},\n\t{0x1EE23, 0x1EE23}, {0x1EE25, 0x1EE26}, {0x1EE28, 0x1EE28},\n\t{0x1EE33, 0x1EE33}, {0x1EE38, 0x1EE38}, {0x1EE3A, 0x1EE3A},\n\t{0x1EE3C, 0x1EE41}, {0x1EE43, 0x1EE46}, {0x1EE48, 0x1EE48},\n\t{0x1EE4A, 0x1EE4A}, {0x1EE4C, 0x1EE4C}, {0x1EE50, 0x1EE50},\n\t{0x1EE53, 0x1EE53}, {0x1EE55, 0x1EE56}, {0x1EE58, 0x1EE58},\n\t{0x1EE5A, 0x1EE5A}, {0x1EE5C, 0x1EE5C}, {0x1EE5E, 0x1EE5E},\n\t{0x1EE60, 0x1EE60}, {0x1EE63, 0x1EE63}, {0x1EE65, 0x1EE66},\n\t{0x1EE6B, 0x1EE6B}, {0x1EE73, 0x1EE73}, {0x1EE78, 0x1EE78},\n\t{0x1EE7D, 0x1EE7D}, {0x1EE7F, 0x1EE7F}, {0x1EE8A, 0x1EE8A},\n\t{0x1EE9C, 0x1EEA0}, {0x1EEA4, 0x1EEA4}, {0x1EEAA, 0x1EEAA},\n\t{0x1EEBC, 0x1EEEF}, {0x1EEF2, 0x1EFFF}, {0x1F02C, 0x1F02F},\n\t{0x1F094, 0x1F09F}, {0x1F0AF, 0x1F0B0}, {0x1F0C0, 0x1F0C0},\n\t{0x1F0D0, 0x1F0D0}, {0x1F0F6, 0x1F0FF}, {0x1F10D, 0x1F10F},\n\t{0x1F12F, 0x1F12F}, {0x1F16C, 0x1F16F}, {0x1F1AD, 0x1F1E5},\n\t{0x1F203, 0x1F20F}, {0x1F23C, 0x1F23F}, {0x1F249, 0x1F24F},\n\t{0x1F252, 0x1F2FF}, {0x1F6D3, 0x1F6DF}, {0x1F6ED, 0x1F6EF},\n\t{0x1F6F7, 0x1F6FF}, {0x1F774, 0x1F77F}, {0x1F7D5, 0x1F7FF},\n\t{0x1F80C, 0x1F80F}, {0x1F848, 0x1F84F}, {0x1F85A, 0x1F85F},\n\t{0x1F888, 0x1F88F}, {0x1F8AE, 0x1F90F}, {0x1F91F, 0x1F91F},\n\t{0x1F928, 0x1F92F}, {0x1F931, 0x1F932}, {0x1F93F, 0x1F93F},\n\t{0x1F94C, 0x1F94F}, {0x1F95F, 0x1F97F}, {0x1F992, 0x1F9BF},\n\t{0x1F9C1, 0x1FFFF}, {0x2A6D7, 0x2A6FF}, {0x2B735, 0x2B73F},\n\t{0x2B81E, 0x2B81F}, {0x2CEA2, 0x2F7FF}, {0x2FA1E, 0xE0000},\n\t{0xE0002, 0xE001F}, {0xE0080, 0xE00FF}, {0xE01F0, 0xEFFFF},\n\t{0xFFFFE, 0xFFFFF},\n}\n\nvar neutral = table{\n\t{0x0000, 0x001F}, {0x007F, 0x007F}, {0x0080, 0x009F},\n\t{0x00A0, 0x00A0}, {0x00A9, 0x00A9}, {0x00AB, 0x00AB},\n\t{0x00B5, 0x00B5}, {0x00BB, 0x00BB}, {0x00C0, 0x00C5},\n\t{0x00C7, 0x00CF}, {0x00D1, 0x00D6}, {0x00D9, 0x00DD},\n\t{0x00E2, 0x00E5}, {0x00E7, 0x00E7}, {0x00EB, 0x00EB},\n\t{0x00EE, 0x00EF}, {0x00F1, 0x00F1}, {0x00F4, 0x00F6},\n\t{0x00FB, 0x00FB}, {0x00FD, 0x00FD}, {0x00FF, 0x00FF},\n\t{0x0100, 0x0100}, {0x0102, 0x0110}, {0x0112, 0x0112},\n\t{0x0114, 0x011A}, {0x011C, 0x0125}, {0x0128, 0x012A},\n\t{0x012C, 0x0130}, {0x0134, 0x0137}, {0x0139, 0x013E},\n\t{0x0143, 0x0143}, {0x0145, 0x0147}, {0x014C, 0x014C},\n\t{0x014E, 0x0151}, {0x0154, 0x0165}, {0x0168, 0x016A},\n\t{0x016C, 0x017F}, {0x0180, 0x01BA}, {0x01BB, 0x01BB},\n\t{0x01BC, 0x01BF}, {0x01C0, 0x01C3}, {0x01C4, 0x01CD},\n\t{0x01CF, 0x01CF}, {0x01D1, 0x01D1}, {0x01D3, 0x01D3},\n\t{0x01D5, 0x01D5}, {0x01D7, 0x01D7}, {0x01D9, 0x01D9},\n\t{0x01DB, 0x01DB}, {0x01DD, 0x024F}, {0x0250, 0x0250},\n\t{0x0252, 0x0260}, {0x0262, 0x0293}, {0x0294, 0x0294},\n\t{0x0295, 0x02AF}, {0x02B0, 0x02C1}, {0x02C2, 0x02C3},\n\t{0x02C5, 0x02C5}, {0x02C6, 0x02C6}, {0x02C8, 0x02C8},\n\t{0x02CC, 0x02CC}, {0x02CE, 0x02CF}, {0x02D1, 0x02D1},\n\t{0x02D2, 0x02D7}, {0x02DC, 0x02DC}, {0x02DE, 0x02DE},\n\t{0x02E0, 0x02E4}, {0x02E5, 0x02EB}, {0x02EC, 0x02EC},\n\t{0x02ED, 0x02ED}, {0x02EE, 0x02EE}, {0x02EF, 0x02FF},\n\t{0x0370, 0x0373}, {0x0374, 0x0374}, {0x0375, 0x0375},\n\t{0x0376, 0x0377}, {0x037A, 0x037A}, {0x037B, 0x037D},\n\t{0x037E, 0x037E}, {0x037F, 0x037F}, {0x0384, 0x0385},\n\t{0x0386, 0x0386}, {0x0387, 0x0387}, {0x0388, 0x038A},\n\t{0x038C, 0x038C}, {0x038E, 0x0390}, {0x03AA, 0x03B0},\n\t{0x03C2, 0x03C2}, {0x03CA, 0x03F5}, {0x03F6, 0x03F6},\n\t{0x03F7, 0x03FF}, {0x0400, 0x0400}, {0x0402, 0x040F},\n\t{0x0450, 0x0450}, {0x0452, 0x0481}, {0x0482, 0x0482},\n\t{0x0483, 0x0487}, {0x0488, 0x0489}, {0x048A, 0x04FF},\n\t{0x0500, 0x052F}, {0x0531, 0x0556}, {0x0559, 0x0559},\n\t{0x055A, 0x055F}, {0x0561, 0x0587}, {0x0589, 0x0589},\n\t{0x058A, 0x058A}, {0x058D, 0x058E}, {0x058F, 0x058F},\n\t{0x0591, 0x05BD}, {0x05BE, 0x05BE}, {0x05BF, 0x05BF},\n\t{0x05C0, 0x05C0}, {0x05C1, 0x05C2}, {0x05C3, 0x05C3},\n\t{0x05C4, 0x05C5}, {0x05C6, 0x05C6}, {0x05C7, 0x05C7},\n\t{0x05D0, 0x05EA}, {0x05F0, 0x05F2}, {0x05F3, 0x05F4},\n\t{0x0600, 0x0605}, {0x0606, 0x0608}, {0x0609, 0x060A},\n\t{0x060B, 0x060B}, {0x060C, 0x060D}, {0x060E, 0x060F},\n\t{0x0610, 0x061A}, {0x061B, 0x061B}, {0x061C, 0x061C},\n\t{0x061E, 0x061F}, {0x0620, 0x063F}, {0x0640, 0x0640},\n\t{0x0641, 0x064A}, {0x064B, 0x065F}, {0x0660, 0x0669},\n\t{0x066A, 0x066D}, {0x066E, 0x066F}, {0x0670, 0x0670},\n\t{0x0671, 0x06D3}, {0x06D4, 0x06D4}, {0x06D5, 0x06D5},\n\t{0x06D6, 0x06DC}, {0x06DD, 0x06DD}, {0x06DE, 0x06DE},\n\t{0x06DF, 0x06E4}, {0x06E5, 0x06E6}, {0x06E7, 0x06E8},\n\t{0x06E9, 0x06E9}, {0x06EA, 0x06ED}, {0x06EE, 0x06EF},\n\t{0x06F0, 0x06F9}, {0x06FA, 0x06FC}, {0x06FD, 0x06FE},\n\t{0x06FF, 0x06FF}, {0x0700, 0x070D}, {0x070F, 0x070F},\n\t{0x0710, 0x0710}, {0x0711, 0x0711}, {0x0712, 0x072F},\n\t{0x0730, 0x074A}, {0x074D, 0x074F}, {0x0750, 0x077F},\n\t{0x0780, 0x07A5}, {0x07A6, 0x07B0}, {0x07B1, 0x07B1},\n\t{0x07C0, 0x07C9}, {0x07CA, 0x07EA}, {0x07EB, 0x07F3},\n\t{0x07F4, 0x07F5}, {0x07F6, 0x07F6}, {0x07F7, 0x07F9},\n\t{0x07FA, 0x07FA}, {0x0800, 0x0815}, {0x0816, 0x0819},\n\t{0x081A, 0x081A}, {0x081B, 0x0823}, {0x0824, 0x0824},\n\t{0x0825, 0x0827}, {0x0828, 0x0828}, {0x0829, 0x082D},\n\t{0x0830, 0x083E}, {0x0840, 0x0858}, {0x0859, 0x085B},\n\t{0x085E, 0x085E}, {0x08A0, 0x08B4}, {0x08B6, 0x08BD},\n\t{0x08D4, 0x08E1}, {0x08E2, 0x08E2}, {0x08E3, 0x08FF},\n\t{0x0900, 0x0902}, {0x0903, 0x0903}, {0x0904, 0x0939},\n\t{0x093A, 0x093A}, {0x093B, 0x093B}, {0x093C, 0x093C},\n\t{0x093D, 0x093D}, {0x093E, 0x0940}, {0x0941, 0x0948},\n\t{0x0949, 0x094C}, {0x094D, 0x094D}, {0x094E, 0x094F},\n\t{0x0950, 0x0950}, {0x0951, 0x0957}, {0x0958, 0x0961},\n\t{0x0962, 0x0963}, {0x0964, 0x0965}, {0x0966, 0x096F},\n\t{0x0970, 0x0970}, {0x0971, 0x0971}, {0x0972, 0x097F},\n\t{0x0980, 0x0980}, {0x0981, 0x0981}, {0x0982, 0x0983},\n\t{0x0985, 0x098C}, {0x098F, 0x0990}, {0x0993, 0x09A8},\n\t{0x09AA, 0x09B0}, {0x09B2, 0x09B2}, {0x09B6, 0x09B9},\n\t{0x09BC, 0x09BC}, {0x09BD, 0x09BD}, {0x09BE, 0x09C0},\n\t{0x09C1, 0x09C4}, {0x09C7, 0x09C8}, {0x09CB, 0x09CC},\n\t{0x09CD, 0x09CD}, {0x09CE, 0x09CE}, {0x09D7, 0x09D7},\n\t{0x09DC, 0x09DD}, {0x09DF, 0x09E1}, {0x09E2, 0x09E3},\n\t{0x09E6, 0x09EF}, {0x09F0, 0x09F1}, {0x09F2, 0x09F3},\n\t{0x09F4, 0x09F9}, {0x09FA, 0x09FA}, {0x09FB, 0x09FB},\n\t{0x0A01, 0x0A02}, {0x0A03, 0x0A03}, {0x0A05, 0x0A0A},\n\t{0x0A0F, 0x0A10}, {0x0A13, 0x0A28}, {0x0A2A, 0x0A30},\n\t{0x0A32, 0x0A33}, {0x0A35, 0x0A36}, {0x0A38, 0x0A39},\n\t{0x0A3C, 0x0A3C}, {0x0A3E, 0x0A40}, {0x0A41, 0x0A42},\n\t{0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A51, 0x0A51},\n\t{0x0A59, 0x0A5C}, {0x0A5E, 0x0A5E}, {0x0A66, 0x0A6F},\n\t{0x0A70, 0x0A71}, {0x0A72, 0x0A74}, {0x0A75, 0x0A75},\n\t{0x0A81, 0x0A82}, {0x0A83, 0x0A83}, {0x0A85, 0x0A8D},\n\t{0x0A8F, 0x0A91}, {0x0A93, 0x0AA8}, {0x0AAA, 0x0AB0},\n\t{0x0AB2, 0x0AB3}, {0x0AB5, 0x0AB9}, {0x0ABC, 0x0ABC},\n\t{0x0ABD, 0x0ABD}, {0x0ABE, 0x0AC0}, {0x0AC1, 0x0AC5},\n\t{0x0AC7, 0x0AC8}, {0x0AC9, 0x0AC9}, {0x0ACB, 0x0ACC},\n\t{0x0ACD, 0x0ACD}, {0x0AD0, 0x0AD0}, {0x0AE0, 0x0AE1},\n\t{0x0AE2, 0x0AE3}, {0x0AE6, 0x0AEF}, {0x0AF0, 0x0AF0},\n\t{0x0AF1, 0x0AF1}, {0x0AF9, 0x0AF9}, {0x0B01, 0x0B01},\n\t{0x0B02, 0x0B03}, {0x0B05, 0x0B0C}, {0x0B0F, 0x0B10},\n\t{0x0B13, 0x0B28}, {0x0B2A, 0x0B30}, {0x0B32, 0x0B33},\n\t{0x0B35, 0x0B39}, {0x0B3C, 0x0B3C}, {0x0B3D, 0x0B3D},\n\t{0x0B3E, 0x0B3E}, {0x0B3F, 0x0B3F}, {0x0B40, 0x0B40},\n\t{0x0B41, 0x0B44}, {0x0B47, 0x0B48}, {0x0B4B, 0x0B4C},\n\t{0x0B4D, 0x0B4D}, {0x0B56, 0x0B56}, {0x0B57, 0x0B57},\n\t{0x0B5C, 0x0B5D}, {0x0B5F, 0x0B61}, {0x0B62, 0x0B63},\n\t{0x0B66, 0x0B6F}, {0x0B70, 0x0B70}, {0x0B71, 0x0B71},\n\t{0x0B72, 0x0B77}, {0x0B82, 0x0B82}, {0x0B83, 0x0B83},\n\t{0x0B85, 0x0B8A}, {0x0B8E, 0x0B90}, {0x0B92, 0x0B95},\n\t{0x0B99, 0x0B9A}, {0x0B9C, 0x0B9C}, {0x0B9E, 0x0B9F},\n\t{0x0BA3, 0x0BA4}, {0x0BA8, 0x0BAA}, {0x0BAE, 0x0BB9},\n\t{0x0BBE, 0x0BBF}, {0x0BC0, 0x0BC0}, {0x0BC1, 0x0BC2},\n\t{0x0BC6, 0x0BC8}, {0x0BCA, 0x0BCC}, {0x0BCD, 0x0BCD},\n\t{0x0BD0, 0x0BD0}, {0x0BD7, 0x0BD7}, {0x0BE6, 0x0BEF},\n\t{0x0BF0, 0x0BF2}, {0x0BF3, 0x0BF8}, {0x0BF9, 0x0BF9},\n\t{0x0BFA, 0x0BFA}, {0x0C00, 0x0C00}, {0x0C01, 0x0C03},\n\t{0x0C05, 0x0C0C}, {0x0C0E, 0x0C10}, {0x0C12, 0x0C28},\n\t{0x0C2A, 0x0C39}, {0x0C3D, 0x0C3D}, {0x0C3E, 0x0C40},\n\t{0x0C41, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D},\n\t{0x0C55, 0x0C56}, {0x0C58, 0x0C5A}, {0x0C60, 0x0C61},\n\t{0x0C62, 0x0C63}, {0x0C66, 0x0C6F}, {0x0C78, 0x0C7E},\n\t{0x0C7F, 0x0C7F}, {0x0C80, 0x0C80}, {0x0C81, 0x0C81},\n\t{0x0C82, 0x0C83}, {0x0C85, 0x0C8C}, {0x0C8E, 0x0C90},\n\t{0x0C92, 0x0CA8}, {0x0CAA, 0x0CB3}, {0x0CB5, 0x0CB9},\n\t{0x0CBC, 0x0CBC}, {0x0CBD, 0x0CBD}, {0x0CBE, 0x0CBE},\n\t{0x0CBF, 0x0CBF}, {0x0CC0, 0x0CC4}, {0x0CC6, 0x0CC6},\n\t{0x0CC7, 0x0CC8}, {0x0CCA, 0x0CCB}, {0x0CCC, 0x0CCD},\n\t{0x0CD5, 0x0CD6}, {0x0CDE, 0x0CDE}, {0x0CE0, 0x0CE1},\n\t{0x0CE2, 0x0CE3}, {0x0CE6, 0x0CEF}, {0x0CF1, 0x0CF2},\n\t{0x0D01, 0x0D01}, {0x0D02, 0x0D03}, {0x0D05, 0x0D0C},\n\t{0x0D0E, 0x0D10}, {0x0D12, 0x0D3A}, {0x0D3D, 0x0D3D},\n\t{0x0D3E, 0x0D40}, {0x0D41, 0x0D44}, {0x0D46, 0x0D48},\n\t{0x0D4A, 0x0D4C}, {0x0D4D, 0x0D4D}, {0x0D4E, 0x0D4E},\n\t{0x0D4F, 0x0D4F}, {0x0D54, 0x0D56}, {0x0D57, 0x0D57},\n\t{0x0D58, 0x0D5E}, {0x0D5F, 0x0D61}, {0x0D62, 0x0D63},\n\t{0x0D66, 0x0D6F}, {0x0D70, 0x0D78}, {0x0D79, 0x0D79},\n\t{0x0D7A, 0x0D7F}, {0x0D82, 0x0D83}, {0x0D85, 0x0D96},\n\t{0x0D9A, 0x0DB1}, {0x0DB3, 0x0DBB}, {0x0DBD, 0x0DBD},\n\t{0x0DC0, 0x0DC6}, {0x0DCA, 0x0DCA}, {0x0DCF, 0x0DD1},\n\t{0x0DD2, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0DD8, 0x0DDF},\n\t{0x0DE6, 0x0DEF}, {0x0DF2, 0x0DF3}, {0x0DF4, 0x0DF4},\n\t{0x0E01, 0x0E30}, {0x0E31, 0x0E31}, {0x0E32, 0x0E33},\n\t{0x0E34, 0x0E3A}, {0x0E3F, 0x0E3F}, {0x0E40, 0x0E45},\n\t{0x0E46, 0x0E46}, {0x0E47, 0x0E4E}, {0x0E4F, 0x0E4F},\n\t{0x0E50, 0x0E59}, {0x0E5A, 0x0E5B}, {0x0E81, 0x0E82},\n\t{0x0E84, 0x0E84}, {0x0E87, 0x0E88}, {0x0E8A, 0x0E8A},\n\t{0x0E8D, 0x0E8D}, {0x0E94, 0x0E97}, {0x0E99, 0x0E9F},\n\t{0x0EA1, 0x0EA3}, {0x0EA5, 0x0EA5}, {0x0EA7, 0x0EA7},\n\t{0x0EAA, 0x0EAB}, {0x0EAD, 0x0EB0}, {0x0EB1, 0x0EB1},\n\t{0x0EB2, 0x0EB3}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC},\n\t{0x0EBD, 0x0EBD}, {0x0EC0, 0x0EC4}, {0x0EC6, 0x0EC6},\n\t{0x0EC8, 0x0ECD}, {0x0ED0, 0x0ED9}, {0x0EDC, 0x0EDF},\n\t{0x0F00, 0x0F00}, {0x0F01, 0x0F03}, {0x0F04, 0x0F12},\n\t{0x0F13, 0x0F13}, {0x0F14, 0x0F14}, {0x0F15, 0x0F17},\n\t{0x0F18, 0x0F19}, {0x0F1A, 0x0F1F}, {0x0F20, 0x0F29},\n\t{0x0F2A, 0x0F33}, {0x0F34, 0x0F34}, {0x0F35, 0x0F35},\n\t{0x0F36, 0x0F36}, {0x0F37, 0x0F37}, {0x0F38, 0x0F38},\n\t{0x0F39, 0x0F39}, {0x0F3A, 0x0F3A}, {0x0F3B, 0x0F3B},\n\t{0x0F3C, 0x0F3C}, {0x0F3D, 0x0F3D}, {0x0F3E, 0x0F3F},\n\t{0x0F40, 0x0F47}, {0x0F49, 0x0F6C}, {0x0F71, 0x0F7E},\n\t{0x0F7F, 0x0F7F}, {0x0F80, 0x0F84}, {0x0F85, 0x0F85},\n\t{0x0F86, 0x0F87}, {0x0F88, 0x0F8C}, {0x0F8D, 0x0F97},\n\t{0x0F99, 0x0FBC}, {0x0FBE, 0x0FC5}, {0x0FC6, 0x0FC6},\n\t{0x0FC7, 0x0FCC}, {0x0FCE, 0x0FCF}, {0x0FD0, 0x0FD4},\n\t{0x0FD5, 0x0FD8}, {0x0FD9, 0x0FDA}, {0x1000, 0x102A},\n\t{0x102B, 0x102C}, {0x102D, 0x1030}, {0x1031, 0x1031},\n\t{0x1032, 0x1037}, {0x1038, 0x1038}, {0x1039, 0x103A},\n\t{0x103B, 0x103C}, {0x103D, 0x103E}, {0x103F, 0x103F},\n\t{0x1040, 0x1049}, {0x104A, 0x104F}, {0x1050, 0x1055},\n\t{0x1056, 0x1057}, {0x1058, 0x1059}, {0x105A, 0x105D},\n\t{0x105E, 0x1060}, {0x1061, 0x1061}, {0x1062, 0x1064},\n\t{0x1065, 0x1066}, {0x1067, 0x106D}, {0x106E, 0x1070},\n\t{0x1071, 0x1074}, {0x1075, 0x1081}, {0x1082, 0x1082},\n\t{0x1083, 0x1084}, {0x1085, 0x1086}, {0x1087, 0x108C},\n\t{0x108D, 0x108D}, {0x108E, 0x108E}, {0x108F, 0x108F},\n\t{0x1090, 0x1099}, {0x109A, 0x109C}, {0x109D, 0x109D},\n\t{0x109E, 0x109F}, {0x10A0, 0x10C5}, {0x10C7, 0x10C7},\n\t{0x10CD, 0x10CD}, {0x10D0, 0x10FA}, {0x10FB, 0x10FB},\n\t{0x10FC, 0x10FC}, {0x10FD, 0x10FF}, {0x1160, 0x11FF},\n\t{0x1200, 0x1248}, {0x124A, 0x124D}, {0x1250, 0x1256},\n\t{0x1258, 0x1258}, {0x125A, 0x125D}, {0x1260, 0x1288},\n\t{0x128A, 0x128D}, {0x1290, 0x12B0}, {0x12B2, 0x12B5},\n\t{0x12B8, 0x12BE}, {0x12C0, 0x12C0}, {0x12C2, 0x12C5},\n\t{0x12C8, 0x12D6}, {0x12D8, 0x1310}, {0x1312, 0x1315},\n\t{0x1318, 0x135A}, {0x135D, 0x135F}, {0x1360, 0x1368},\n\t{0x1369, 0x137C}, {0x1380, 0x138F}, {0x1390, 0x1399},\n\t{0x13A0, 0x13F5}, {0x13F8, 0x13FD}, {0x1400, 0x1400},\n\t{0x1401, 0x166C}, {0x166D, 0x166E}, {0x166F, 0x167F},\n\t{0x1680, 0x1680}, {0x1681, 0x169A}, {0x169B, 0x169B},\n\t{0x169C, 0x169C}, {0x16A0, 0x16EA}, {0x16EB, 0x16ED},\n\t{0x16EE, 0x16F0}, {0x16F1, 0x16F8}, {0x1700, 0x170C},\n\t{0x170E, 0x1711}, {0x1712, 0x1714}, {0x1720, 0x1731},\n\t{0x1732, 0x1734}, {0x1735, 0x1736}, {0x1740, 0x1751},\n\t{0x1752, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770},\n\t{0x1772, 0x1773}, {0x1780, 0x17B3}, {0x17B4, 0x17B5},\n\t{0x17B6, 0x17B6}, {0x17B7, 0x17BD}, {0x17BE, 0x17C5},\n\t{0x17C6, 0x17C6}, {0x17C7, 0x17C8}, {0x17C9, 0x17D3},\n\t{0x17D4, 0x17D6}, {0x17D7, 0x17D7}, {0x17D8, 0x17DA},\n\t{0x17DB, 0x17DB}, {0x17DC, 0x17DC}, {0x17DD, 0x17DD},\n\t{0x17E0, 0x17E9}, {0x17F0, 0x17F9}, {0x1800, 0x1805},\n\t{0x1806, 0x1806}, {0x1807, 0x180A}, {0x180B, 0x180D},\n\t{0x180E, 0x180E}, {0x1810, 0x1819}, {0x1820, 0x1842},\n\t{0x1843, 0x1843}, {0x1844, 0x1877}, {0x1880, 0x1884},\n\t{0x1885, 0x1886}, {0x1887, 0x18A8}, {0x18A9, 0x18A9},\n\t{0x18AA, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E},\n\t{0x1920, 0x1922}, {0x1923, 0x1926}, {0x1927, 0x1928},\n\t{0x1929, 0x192B}, {0x1930, 0x1931}, {0x1932, 0x1932},\n\t{0x1933, 0x1938}, {0x1939, 0x193B}, {0x1940, 0x1940},\n\t{0x1944, 0x1945}, {0x1946, 0x194F}, {0x1950, 0x196D},\n\t{0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9},\n\t{0x19D0, 0x19D9}, {0x19DA, 0x19DA}, {0x19DE, 0x19DF},\n\t{0x19E0, 0x19FF}, {0x1A00, 0x1A16}, {0x1A17, 0x1A18},\n\t{0x1A19, 0x1A1A}, {0x1A1B, 0x1A1B}, {0x1A1E, 0x1A1F},\n\t{0x1A20, 0x1A54}, {0x1A55, 0x1A55}, {0x1A56, 0x1A56},\n\t{0x1A57, 0x1A57}, {0x1A58, 0x1A5E}, {0x1A60, 0x1A60},\n\t{0x1A61, 0x1A61}, {0x1A62, 0x1A62}, {0x1A63, 0x1A64},\n\t{0x1A65, 0x1A6C}, {0x1A6D, 0x1A72}, {0x1A73, 0x1A7C},\n\t{0x1A7F, 0x1A7F}, {0x1A80, 0x1A89}, {0x1A90, 0x1A99},\n\t{0x1AA0, 0x1AA6}, {0x1AA7, 0x1AA7}, {0x1AA8, 0x1AAD},\n\t{0x1AB0, 0x1ABD}, {0x1ABE, 0x1ABE}, {0x1B00, 0x1B03},\n\t{0x1B04, 0x1B04}, {0x1B05, 0x1B33}, {0x1B34, 0x1B34},\n\t{0x1B35, 0x1B35}, {0x1B36, 0x1B3A}, {0x1B3B, 0x1B3B},\n\t{0x1B3C, 0x1B3C}, {0x1B3D, 0x1B41}, {0x1B42, 0x1B42},\n\t{0x1B43, 0x1B44}, {0x1B45, 0x1B4B}, {0x1B50, 0x1B59},\n\t{0x1B5A, 0x1B60}, {0x1B61, 0x1B6A}, {0x1B6B, 0x1B73},\n\t{0x1B74, 0x1B7C}, {0x1B80, 0x1B81}, {0x1B82, 0x1B82},\n\t{0x1B83, 0x1BA0}, {0x1BA1, 0x1BA1}, {0x1BA2, 0x1BA5},\n\t{0x1BA6, 0x1BA7}, {0x1BA8, 0x1BA9}, {0x1BAA, 0x1BAA},\n\t{0x1BAB, 0x1BAD}, {0x1BAE, 0x1BAF}, {0x1BB0, 0x1BB9},\n\t{0x1BBA, 0x1BBF}, {0x1BC0, 0x1BE5}, {0x1BE6, 0x1BE6},\n\t{0x1BE7, 0x1BE7}, {0x1BE8, 0x1BE9}, {0x1BEA, 0x1BEC},\n\t{0x1BED, 0x1BED}, {0x1BEE, 0x1BEE}, {0x1BEF, 0x1BF1},\n\t{0x1BF2, 0x1BF3}, {0x1BFC, 0x1BFF}, {0x1C00, 0x1C23},\n\t{0x1C24, 0x1C2B}, {0x1C2C, 0x1C33}, {0x1C34, 0x1C35},\n\t{0x1C36, 0x1C37}, {0x1C3B, 0x1C3F}, {0x1C40, 0x1C49},\n\t{0x1C4D, 0x1C4F}, {0x1C50, 0x1C59}, {0x1C5A, 0x1C77},\n\t{0x1C78, 0x1C7D}, {0x1C7E, 0x1C7F}, {0x1C80, 0x1C88},\n\t{0x1CC0, 0x1CC7}, {0x1CD0, 0x1CD2}, {0x1CD3, 0x1CD3},\n\t{0x1CD4, 0x1CE0}, {0x1CE1, 0x1CE1}, {0x1CE2, 0x1CE8},\n\t{0x1CE9, 0x1CEC}, {0x1CED, 0x1CED}, {0x1CEE, 0x1CF1},\n\t{0x1CF2, 0x1CF3}, {0x1CF4, 0x1CF4}, {0x1CF5, 0x1CF6},\n\t{0x1CF8, 0x1CF9}, {0x1D00, 0x1D2B}, {0x1D2C, 0x1D6A},\n\t{0x1D6B, 0x1D77}, {0x1D78, 0x1D78}, {0x1D79, 0x1D7F},\n\t{0x1D80, 0x1D9A}, {0x1D9B, 0x1DBF}, {0x1DC0, 0x1DF5},\n\t{0x1DFB, 0x1DFF}, {0x1E00, 0x1EFF}, {0x1F00, 0x1F15},\n\t{0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D},\n\t{0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B},\n\t{0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4},\n\t{0x1FB6, 0x1FBC}, {0x1FBD, 0x1FBD}, {0x1FBE, 0x1FBE},\n\t{0x1FBF, 0x1FC1}, {0x1FC2, 0x1FC4}, {0x1FC6, 0x1FCC},\n\t{0x1FCD, 0x1FCF}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB},\n\t{0x1FDD, 0x1FDF}, {0x1FE0, 0x1FEC}, {0x1FED, 0x1FEF},\n\t{0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, {0x1FFD, 0x1FFE},\n\t{0x2000, 0x200A}, {0x200B, 0x200F}, {0x2011, 0x2012},\n\t{0x2017, 0x2017}, {0x201A, 0x201A}, {0x201B, 0x201B},\n\t{0x201E, 0x201E}, {0x201F, 0x201F}, {0x2023, 0x2023},\n\t{0x2028, 0x2028}, {0x2029, 0x2029}, {0x202A, 0x202E},\n\t{0x202F, 0x202F}, {0x2031, 0x2031}, {0x2034, 0x2034},\n\t{0x2036, 0x2038}, {0x2039, 0x2039}, {0x203A, 0x203A},\n\t{0x203C, 0x203D}, {0x203F, 0x2040}, {0x2041, 0x2043},\n\t{0x2044, 0x2044}, {0x2045, 0x2045}, {0x2046, 0x2046},\n\t{0x2047, 0x2051}, {0x2052, 0x2052}, {0x2053, 0x2053},\n\t{0x2054, 0x2054}, {0x2055, 0x205E}, {0x205F, 0x205F},\n\t{0x2060, 0x2064}, {0x2066, 0x206F}, {0x2070, 0x2070},\n\t{0x2071, 0x2071}, {0x2075, 0x2079}, {0x207A, 0x207C},\n\t{0x207D, 0x207D}, {0x207E, 0x207E}, {0x2080, 0x2080},\n\t{0x2085, 0x2089}, {0x208A, 0x208C}, {0x208D, 0x208D},\n\t{0x208E, 0x208E}, {0x2090, 0x209C}, {0x20A0, 0x20A8},\n\t{0x20AA, 0x20AB}, {0x20AD, 0x20BE}, {0x20D0, 0x20DC},\n\t{0x20DD, 0x20E0}, {0x20E1, 0x20E1}, {0x20E2, 0x20E4},\n\t{0x20E5, 0x20F0}, {0x2100, 0x2101}, {0x2102, 0x2102},\n\t{0x2104, 0x2104}, {0x2106, 0x2106}, {0x2107, 0x2107},\n\t{0x2108, 0x2108}, {0x210A, 0x2112}, {0x2114, 0x2114},\n\t{0x2115, 0x2115}, {0x2117, 0x2117}, {0x2118, 0x2118},\n\t{0x2119, 0x211D}, {0x211E, 0x2120}, {0x2123, 0x2123},\n\t{0x2124, 0x2124}, {0x2125, 0x2125}, {0x2127, 0x2127},\n\t{0x2128, 0x2128}, {0x2129, 0x2129}, {0x212A, 0x212A},\n\t{0x212C, 0x212D}, {0x212E, 0x212E}, {0x212F, 0x2134},\n\t{0x2135, 0x2138}, {0x2139, 0x2139}, {0x213A, 0x213B},\n\t{0x213C, 0x213F}, {0x2140, 0x2144}, {0x2145, 0x2149},\n\t{0x214A, 0x214A}, {0x214B, 0x214B}, {0x214C, 0x214D},\n\t{0x214E, 0x214E}, {0x214F, 0x214F}, {0x2150, 0x2152},\n\t{0x2155, 0x215A}, {0x215F, 0x215F}, {0x216C, 0x216F},\n\t{0x217A, 0x2182}, {0x2183, 0x2184}, {0x2185, 0x2188},\n\t{0x218A, 0x218B}, {0x219A, 0x219B}, {0x219C, 0x219F},\n\t{0x21A0, 0x21A0}, {0x21A1, 0x21A2}, {0x21A3, 0x21A3},\n\t{0x21A4, 0x21A5}, {0x21A6, 0x21A6}, {0x21A7, 0x21AD},\n\t{0x21AE, 0x21AE}, {0x21AF, 0x21B7}, {0x21BA, 0x21CD},\n\t{0x21CE, 0x21CF}, {0x21D0, 0x21D1}, {0x21D3, 0x21D3},\n\t{0x21D5, 0x21E6}, {0x21E8, 0x21F3}, {0x21F4, 0x21FF},\n\t{0x2201, 0x2201}, {0x2204, 0x2206}, {0x2209, 0x220A},\n\t{0x220C, 0x220E}, {0x2210, 0x2210}, {0x2212, 0x2214},\n\t{0x2216, 0x2219}, {0x221B, 0x221C}, {0x2221, 0x2222},\n\t{0x2224, 0x2224}, {0x2226, 0x2226}, {0x222D, 0x222D},\n\t{0x222F, 0x2233}, {0x2238, 0x223B}, {0x223E, 0x2247},\n\t{0x2249, 0x224B}, {0x224D, 0x2251}, {0x2253, 0x225F},\n\t{0x2262, 0x2263}, {0x2268, 0x2269}, {0x226C, 0x226D},\n\t{0x2270, 0x2281}, {0x2284, 0x2285}, {0x2288, 0x2294},\n\t{0x2296, 0x2298}, {0x229A, 0x22A4}, {0x22A6, 0x22BE},\n\t{0x22C0, 0x22FF}, {0x2300, 0x2307}, {0x2308, 0x2308},\n\t{0x2309, 0x2309}, {0x230A, 0x230A}, {0x230B, 0x230B},\n\t{0x230C, 0x2311}, {0x2313, 0x2319}, {0x231C, 0x231F},\n\t{0x2320, 0x2321}, {0x2322, 0x2328}, {0x232B, 0x237B},\n\t{0x237C, 0x237C}, {0x237D, 0x239A}, {0x239B, 0x23B3},\n\t{0x23B4, 0x23DB}, {0x23DC, 0x23E1}, {0x23E2, 0x23E8},\n\t{0x23ED, 0x23EF}, {0x23F1, 0x23F2}, {0x23F4, 0x23FE},\n\t{0x2400, 0x2426}, {0x2440, 0x244A}, {0x24EA, 0x24EA},\n\t{0x254C, 0x254F}, {0x2574, 0x257F}, {0x2590, 0x2591},\n\t{0x2596, 0x259F}, {0x25A2, 0x25A2}, {0x25AA, 0x25B1},\n\t{0x25B4, 0x25B5}, {0x25B8, 0x25BB}, {0x25BE, 0x25BF},\n\t{0x25C2, 0x25C5}, {0x25C9, 0x25CA}, {0x25CC, 0x25CD},\n\t{0x25D2, 0x25E1}, {0x25E6, 0x25EE}, {0x25F0, 0x25F7},\n\t{0x25F8, 0x25FC}, {0x25FF, 0x25FF}, {0x2600, 0x2604},\n\t{0x2607, 0x2608}, {0x260A, 0x260D}, {0x2610, 0x2613},\n\t{0x2616, 0x261B}, {0x261D, 0x261D}, {0x261F, 0x263F},\n\t{0x2641, 0x2641}, {0x2643, 0x2647}, {0x2654, 0x265F},\n\t{0x2662, 0x2662}, {0x2666, 0x2666}, {0x266B, 0x266B},\n\t{0x266E, 0x266E}, {0x2670, 0x267E}, {0x2680, 0x2692},\n\t{0x2694, 0x269D}, {0x26A0, 0x26A0}, {0x26A2, 0x26A9},\n\t{0x26AC, 0x26BC}, {0x26C0, 0x26C3}, {0x26E2, 0x26E2},\n\t{0x26E4, 0x26E7}, {0x2700, 0x2704}, {0x2706, 0x2709},\n\t{0x270C, 0x2727}, {0x2729, 0x273C}, {0x273E, 0x274B},\n\t{0x274D, 0x274D}, {0x274F, 0x2752}, {0x2756, 0x2756},\n\t{0x2758, 0x2767}, {0x2768, 0x2768}, {0x2769, 0x2769},\n\t{0x276A, 0x276A}, {0x276B, 0x276B}, {0x276C, 0x276C},\n\t{0x276D, 0x276D}, {0x276E, 0x276E}, {0x276F, 0x276F},\n\t{0x2770, 0x2770}, {0x2771, 0x2771}, {0x2772, 0x2772},\n\t{0x2773, 0x2773}, {0x2774, 0x2774}, {0x2775, 0x2775},\n\t{0x2780, 0x2793}, {0x2794, 0x2794}, {0x2798, 0x27AF},\n\t{0x27B1, 0x27BE}, {0x27C0, 0x27C4}, {0x27C5, 0x27C5},\n\t{0x27C6, 0x27C6}, {0x27C7, 0x27E5}, {0x27EE, 0x27EE},\n\t{0x27EF, 0x27EF}, {0x27F0, 0x27FF}, {0x2800, 0x28FF},\n\t{0x2900, 0x297F}, {0x2980, 0x2982}, {0x2983, 0x2983},\n\t{0x2984, 0x2984}, {0x2987, 0x2987}, {0x2988, 0x2988},\n\t{0x2989, 0x2989}, {0x298A, 0x298A}, {0x298B, 0x298B},\n\t{0x298C, 0x298C}, {0x298D, 0x298D}, {0x298E, 0x298E},\n\t{0x298F, 0x298F}, {0x2990, 0x2990}, {0x2991, 0x2991},\n\t{0x2992, 0x2992}, {0x2993, 0x2993}, {0x2994, 0x2994},\n\t{0x2995, 0x2995}, {0x2996, 0x2996}, {0x2997, 0x2997},\n\t{0x2998, 0x2998}, {0x2999, 0x29D7}, {0x29D8, 0x29D8},\n\t{0x29D9, 0x29D9}, {0x29DA, 0x29DA}, {0x29DB, 0x29DB},\n\t{0x29DC, 0x29FB}, {0x29FC, 0x29FC}, {0x29FD, 0x29FD},\n\t{0x29FE, 0x29FF}, {0x2A00, 0x2AFF}, {0x2B00, 0x2B1A},\n\t{0x2B1D, 0x2B2F}, {0x2B30, 0x2B44}, {0x2B45, 0x2B46},\n\t{0x2B47, 0x2B4C}, {0x2B4D, 0x2B4F}, {0x2B51, 0x2B54},\n\t{0x2B5A, 0x2B73}, {0x2B76, 0x2B95}, {0x2B98, 0x2BB9},\n\t{0x2BBD, 0x2BC8}, {0x2BCA, 0x2BD1}, {0x2BEC, 0x2BEF},\n\t{0x2C00, 0x2C2E}, {0x2C30, 0x2C5E}, {0x2C60, 0x2C7B},\n\t{0x2C7C, 0x2C7D}, {0x2C7E, 0x2C7F}, {0x2C80, 0x2CE4},\n\t{0x2CE5, 0x2CEA}, {0x2CEB, 0x2CEE}, {0x2CEF, 0x2CF1},\n\t{0x2CF2, 0x2CF3}, {0x2CF9, 0x2CFC}, {0x2CFD, 0x2CFD},\n\t{0x2CFE, 0x2CFF}, {0x2D00, 0x2D25}, {0x2D27, 0x2D27},\n\t{0x2D2D, 0x2D2D}, {0x2D30, 0x2D67}, {0x2D6F, 0x2D6F},\n\t{0x2D70, 0x2D70}, {0x2D7F, 0x2D7F}, {0x2D80, 0x2D96},\n\t{0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6},\n\t{0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE},\n\t{0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2DE0, 0x2DFF},\n\t{0x2E00, 0x2E01}, {0x2E02, 0x2E02}, {0x2E03, 0x2E03},\n\t{0x2E04, 0x2E04}, {0x2E05, 0x2E05}, {0x2E06, 0x2E08},\n\t{0x2E09, 0x2E09}, {0x2E0A, 0x2E0A}, {0x2E0B, 0x2E0B},\n\t{0x2E0C, 0x2E0C}, {0x2E0D, 0x2E0D}, {0x2E0E, 0x2E16},\n\t{0x2E17, 0x2E17}, {0x2E18, 0x2E19}, {0x2E1A, 0x2E1A},\n\t{0x2E1B, 0x2E1B}, {0x2E1C, 0x2E1C}, {0x2E1D, 0x2E1D},\n\t{0x2E1E, 0x2E1F}, {0x2E20, 0x2E20}, {0x2E21, 0x2E21},\n\t{0x2E22, 0x2E22}, {0x2E23, 0x2E23}, {0x2E24, 0x2E24},\n\t{0x2E25, 0x2E25}, {0x2E26, 0x2E26}, {0x2E27, 0x2E27},\n\t{0x2E28, 0x2E28}, {0x2E29, 0x2E29}, {0x2E2A, 0x2E2E},\n\t{0x2E2F, 0x2E2F}, {0x2E30, 0x2E39}, {0x2E3A, 0x2E3B},\n\t{0x2E3C, 0x2E3F}, {0x2E40, 0x2E40}, {0x2E41, 0x2E41},\n\t{0x2E42, 0x2E42}, {0x2E43, 0x2E44}, {0x303F, 0x303F},\n\t{0x4DC0, 0x4DFF}, {0xA4D0, 0xA4F7}, {0xA4F8, 0xA4FD},\n\t{0xA4FE, 0xA4FF}, {0xA500, 0xA60B}, {0xA60C, 0xA60C},\n\t{0xA60D, 0xA60F}, {0xA610, 0xA61F}, {0xA620, 0xA629},\n\t{0xA62A, 0xA62B}, {0xA640, 0xA66D}, {0xA66E, 0xA66E},\n\t{0xA66F, 0xA66F}, {0xA670, 0xA672}, {0xA673, 0xA673},\n\t{0xA674, 0xA67D}, {0xA67E, 0xA67E}, {0xA67F, 0xA67F},\n\t{0xA680, 0xA69B}, {0xA69C, 0xA69D}, {0xA69E, 0xA69F},\n\t{0xA6A0, 0xA6E5}, {0xA6E6, 0xA6EF}, {0xA6F0, 0xA6F1},\n\t{0xA6F2, 0xA6F7}, {0xA700, 0xA716}, {0xA717, 0xA71F},\n\t{0xA720, 0xA721}, {0xA722, 0xA76F}, {0xA770, 0xA770},\n\t{0xA771, 0xA787}, {0xA788, 0xA788}, {0xA789, 0xA78A},\n\t{0xA78B, 0xA78E}, {0xA78F, 0xA78F}, {0xA790, 0xA7AE},\n\t{0xA7B0, 0xA7B7}, {0xA7F7, 0xA7F7}, {0xA7F8, 0xA7F9},\n\t{0xA7FA, 0xA7FA}, {0xA7FB, 0xA7FF}, {0xA800, 0xA801},\n\t{0xA802, 0xA802}, {0xA803, 0xA805}, {0xA806, 0xA806},\n\t{0xA807, 0xA80A}, {0xA80B, 0xA80B}, {0xA80C, 0xA822},\n\t{0xA823, 0xA824}, {0xA825, 0xA826}, {0xA827, 0xA827},\n\t{0xA828, 0xA82B}, {0xA830, 0xA835}, {0xA836, 0xA837},\n\t{0xA838, 0xA838}, {0xA839, 0xA839}, {0xA840, 0xA873},\n\t{0xA874, 0xA877}, {0xA880, 0xA881}, {0xA882, 0xA8B3},\n\t{0xA8B4, 0xA8C3}, {0xA8C4, 0xA8C5}, {0xA8CE, 0xA8CF},\n\t{0xA8D0, 0xA8D9}, {0xA8E0, 0xA8F1}, {0xA8F2, 0xA8F7},\n\t{0xA8F8, 0xA8FA}, {0xA8FB, 0xA8FB}, {0xA8FC, 0xA8FC},\n\t{0xA8FD, 0xA8FD}, {0xA900, 0xA909}, {0xA90A, 0xA925},\n\t{0xA926, 0xA92D}, {0xA92E, 0xA92F}, {0xA930, 0xA946},\n\t{0xA947, 0xA951}, {0xA952, 0xA953}, {0xA95F, 0xA95F},\n\t{0xA980, 0xA982}, {0xA983, 0xA983}, {0xA984, 0xA9B2},\n\t{0xA9B3, 0xA9B3}, {0xA9B4, 0xA9B5}, {0xA9B6, 0xA9B9},\n\t{0xA9BA, 0xA9BB}, {0xA9BC, 0xA9BC}, {0xA9BD, 0xA9C0},\n\t{0xA9C1, 0xA9CD}, {0xA9CF, 0xA9CF}, {0xA9D0, 0xA9D9},\n\t{0xA9DE, 0xA9DF}, {0xA9E0, 0xA9E4}, {0xA9E5, 0xA9E5},\n\t{0xA9E6, 0xA9E6}, {0xA9E7, 0xA9EF}, {0xA9F0, 0xA9F9},\n\t{0xA9FA, 0xA9FE}, {0xAA00, 0xAA28}, {0xAA29, 0xAA2E},\n\t{0xAA2F, 0xAA30}, {0xAA31, 0xAA32}, {0xAA33, 0xAA34},\n\t{0xAA35, 0xAA36}, {0xAA40, 0xAA42}, {0xAA43, 0xAA43},\n\t{0xAA44, 0xAA4B}, {0xAA4C, 0xAA4C}, {0xAA4D, 0xAA4D},\n\t{0xAA50, 0xAA59}, {0xAA5C, 0xAA5F}, {0xAA60, 0xAA6F},\n\t{0xAA70, 0xAA70}, {0xAA71, 0xAA76}, {0xAA77, 0xAA79},\n\t{0xAA7A, 0xAA7A}, {0xAA7B, 0xAA7B}, {0xAA7C, 0xAA7C},\n\t{0xAA7D, 0xAA7D}, {0xAA7E, 0xAA7F}, {0xAA80, 0xAAAF},\n\t{0xAAB0, 0xAAB0}, {0xAAB1, 0xAAB1}, {0xAAB2, 0xAAB4},\n\t{0xAAB5, 0xAAB6}, {0xAAB7, 0xAAB8}, {0xAAB9, 0xAABD},\n\t{0xAABE, 0xAABF}, {0xAAC0, 0xAAC0}, {0xAAC1, 0xAAC1},\n\t{0xAAC2, 0xAAC2}, {0xAADB, 0xAADC}, {0xAADD, 0xAADD},\n\t{0xAADE, 0xAADF}, {0xAAE0, 0xAAEA}, {0xAAEB, 0xAAEB},\n\t{0xAAEC, 0xAAED}, {0xAAEE, 0xAAEF}, {0xAAF0, 0xAAF1},\n\t{0xAAF2, 0xAAF2}, {0xAAF3, 0xAAF4}, {0xAAF5, 0xAAF5},\n\t{0xAAF6, 0xAAF6}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E},\n\t{0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E},\n\t{0xAB30, 0xAB5A}, {0xAB5B, 0xAB5B}, {0xAB5C, 0xAB5F},\n\t{0xAB60, 0xAB65}, {0xAB70, 0xABBF}, {0xABC0, 0xABE2},\n\t{0xABE3, 0xABE4}, {0xABE5, 0xABE5}, {0xABE6, 0xABE7},\n\t{0xABE8, 0xABE8}, {0xABE9, 0xABEA}, {0xABEB, 0xABEB},\n\t{0xABEC, 0xABEC}, {0xABED, 0xABED}, {0xABF0, 0xABF9},\n\t{0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, {0xD800, 0xDB7F},\n\t{0xDB80, 0xDBFF}, {0xDC00, 0xDFFF}, {0xFB00, 0xFB06},\n\t{0xFB13, 0xFB17}, {0xFB1D, 0xFB1D}, {0xFB1E, 0xFB1E},\n\t{0xFB1F, 0xFB28}, {0xFB29, 0xFB29}, {0xFB2A, 0xFB36},\n\t{0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41},\n\t{0xFB43, 0xFB44}, {0xFB46, 0xFB4F}, {0xFB50, 0xFBB1},\n\t{0xFBB2, 0xFBC1}, {0xFBD3, 0xFD3D}, {0xFD3E, 0xFD3E},\n\t{0xFD3F, 0xFD3F}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7},\n\t{0xFDF0, 0xFDFB}, {0xFDFC, 0xFDFC}, {0xFDFD, 0xFDFD},\n\t{0xFE20, 0xFE2F}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC},\n\t{0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFB}, {0xFFFC, 0xFFFC},\n\t{0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A},\n\t{0x1003C, 0x1003D}, {0x1003F, 0x1004D}, {0x10050, 0x1005D},\n\t{0x10080, 0x100FA}, {0x10100, 0x10102}, {0x10107, 0x10133},\n\t{0x10137, 0x1013F}, {0x10140, 0x10174}, {0x10175, 0x10178},\n\t{0x10179, 0x10189}, {0x1018A, 0x1018B}, {0x1018C, 0x1018E},\n\t{0x10190, 0x1019B}, {0x101A0, 0x101A0}, {0x101D0, 0x101FC},\n\t{0x101FD, 0x101FD}, {0x10280, 0x1029C}, {0x102A0, 0x102D0},\n\t{0x102E0, 0x102E0}, {0x102E1, 0x102FB}, {0x10300, 0x1031F},\n\t{0x10320, 0x10323}, {0x10330, 0x10340}, {0x10341, 0x10341},\n\t{0x10342, 0x10349}, {0x1034A, 0x1034A}, {0x10350, 0x10375},\n\t{0x10376, 0x1037A}, {0x10380, 0x1039D}, {0x1039F, 0x1039F},\n\t{0x103A0, 0x103C3}, {0x103C8, 0x103CF}, {0x103D0, 0x103D0},\n\t{0x103D1, 0x103D5}, {0x10400, 0x1044F}, {0x10450, 0x1047F},\n\t{0x10480, 0x1049D}, {0x104A0, 0x104A9}, {0x104B0, 0x104D3},\n\t{0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563},\n\t{0x1056F, 0x1056F}, {0x10600, 0x10736}, {0x10740, 0x10755},\n\t{0x10760, 0x10767}, {0x10800, 0x10805}, {0x10808, 0x10808},\n\t{0x1080A, 0x10835}, {0x10837, 0x10838}, {0x1083C, 0x1083C},\n\t{0x1083F, 0x1083F}, {0x10840, 0x10855}, {0x10857, 0x10857},\n\t{0x10858, 0x1085F}, {0x10860, 0x10876}, {0x10877, 0x10878},\n\t{0x10879, 0x1087F}, {0x10880, 0x1089E}, {0x108A7, 0x108AF},\n\t{0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x108FB, 0x108FF},\n\t{0x10900, 0x10915}, {0x10916, 0x1091B}, {0x1091F, 0x1091F},\n\t{0x10920, 0x10939}, {0x1093F, 0x1093F}, {0x10980, 0x1099F},\n\t{0x109A0, 0x109B7}, {0x109BC, 0x109BD}, {0x109BE, 0x109BF},\n\t{0x109C0, 0x109CF}, {0x109D2, 0x109FF}, {0x10A00, 0x10A00},\n\t{0x10A01, 0x10A03}, {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F},\n\t{0x10A10, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A33},\n\t{0x10A38, 0x10A3A}, {0x10A3F, 0x10A3F}, {0x10A40, 0x10A47},\n\t{0x10A50, 0x10A58}, {0x10A60, 0x10A7C}, {0x10A7D, 0x10A7E},\n\t{0x10A7F, 0x10A7F}, {0x10A80, 0x10A9C}, {0x10A9D, 0x10A9F},\n\t{0x10AC0, 0x10AC7}, {0x10AC8, 0x10AC8}, {0x10AC9, 0x10AE4},\n\t{0x10AE5, 0x10AE6}, {0x10AEB, 0x10AEF}, {0x10AF0, 0x10AF6},\n\t{0x10B00, 0x10B35}, {0x10B39, 0x10B3F}, {0x10B40, 0x10B55},\n\t{0x10B58, 0x10B5F}, {0x10B60, 0x10B72}, {0x10B78, 0x10B7F},\n\t{0x10B80, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF},\n\t{0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2},\n\t{0x10CFA, 0x10CFF}, {0x10E60, 0x10E7E}, {0x11000, 0x11000},\n\t{0x11001, 0x11001}, {0x11002, 0x11002}, {0x11003, 0x11037},\n\t{0x11038, 0x11046}, {0x11047, 0x1104D}, {0x11052, 0x11065},\n\t{0x11066, 0x1106F}, {0x1107F, 0x1107F}, {0x11080, 0x11081},\n\t{0x11082, 0x11082}, {0x11083, 0x110AF}, {0x110B0, 0x110B2},\n\t{0x110B3, 0x110B6}, {0x110B7, 0x110B8}, {0x110B9, 0x110BA},\n\t{0x110BB, 0x110BC}, {0x110BD, 0x110BD}, {0x110BE, 0x110C1},\n\t{0x110D0, 0x110E8}, {0x110F0, 0x110F9}, {0x11100, 0x11102},\n\t{0x11103, 0x11126}, {0x11127, 0x1112B}, {0x1112C, 0x1112C},\n\t{0x1112D, 0x11134}, {0x11136, 0x1113F}, {0x11140, 0x11143},\n\t{0x11150, 0x11172}, {0x11173, 0x11173}, {0x11174, 0x11175},\n\t{0x11176, 0x11176}, {0x11180, 0x11181}, {0x11182, 0x11182},\n\t{0x11183, 0x111B2}, {0x111B3, 0x111B5}, {0x111B6, 0x111BE},\n\t{0x111BF, 0x111C0}, {0x111C1, 0x111C4}, {0x111C5, 0x111C9},\n\t{0x111CA, 0x111CC}, {0x111CD, 0x111CD}, {0x111D0, 0x111D9},\n\t{0x111DA, 0x111DA}, {0x111DB, 0x111DB}, {0x111DC, 0x111DC},\n\t{0x111DD, 0x111DF}, {0x111E1, 0x111F4}, {0x11200, 0x11211},\n\t{0x11213, 0x1122B}, {0x1122C, 0x1122E}, {0x1122F, 0x11231},\n\t{0x11232, 0x11233}, {0x11234, 0x11234}, {0x11235, 0x11235},\n\t{0x11236, 0x11237}, {0x11238, 0x1123D}, {0x1123E, 0x1123E},\n\t{0x11280, 0x11286}, {0x11288, 0x11288}, {0x1128A, 0x1128D},\n\t{0x1128F, 0x1129D}, {0x1129F, 0x112A8}, {0x112A9, 0x112A9},\n\t{0x112B0, 0x112DE}, {0x112DF, 0x112DF}, {0x112E0, 0x112E2},\n\t{0x112E3, 0x112EA}, {0x112F0, 0x112F9}, {0x11300, 0x11301},\n\t{0x11302, 0x11303}, {0x11305, 0x1130C}, {0x1130F, 0x11310},\n\t{0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11332, 0x11333},\n\t{0x11335, 0x11339}, {0x1133C, 0x1133C}, {0x1133D, 0x1133D},\n\t{0x1133E, 0x1133F}, {0x11340, 0x11340}, {0x11341, 0x11344},\n\t{0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11350, 0x11350},\n\t{0x11357, 0x11357}, {0x1135D, 0x11361}, {0x11362, 0x11363},\n\t{0x11366, 0x1136C}, {0x11370, 0x11374}, {0x11400, 0x11434},\n\t{0x11435, 0x11437}, {0x11438, 0x1143F}, {0x11440, 0x11441},\n\t{0x11442, 0x11444}, {0x11445, 0x11445}, {0x11446, 0x11446},\n\t{0x11447, 0x1144A}, {0x1144B, 0x1144F}, {0x11450, 0x11459},\n\t{0x1145B, 0x1145B}, {0x1145D, 0x1145D}, {0x11480, 0x114AF},\n\t{0x114B0, 0x114B2}, {0x114B3, 0x114B8}, {0x114B9, 0x114B9},\n\t{0x114BA, 0x114BA}, {0x114BB, 0x114BE}, {0x114BF, 0x114C0},\n\t{0x114C1, 0x114C1}, {0x114C2, 0x114C3}, {0x114C4, 0x114C5},\n\t{0x114C6, 0x114C6}, {0x114C7, 0x114C7}, {0x114D0, 0x114D9},\n\t{0x11580, 0x115AE}, {0x115AF, 0x115B1}, {0x115B2, 0x115B5},\n\t{0x115B8, 0x115BB}, {0x115BC, 0x115BD}, {0x115BE, 0x115BE},\n\t{0x115BF, 0x115C0}, {0x115C1, 0x115D7}, {0x115D8, 0x115DB},\n\t{0x115DC, 0x115DD}, {0x11600, 0x1162F}, {0x11630, 0x11632},\n\t{0x11633, 0x1163A}, {0x1163B, 0x1163C}, {0x1163D, 0x1163D},\n\t{0x1163E, 0x1163E}, {0x1163F, 0x11640}, {0x11641, 0x11643},\n\t{0x11644, 0x11644}, {0x11650, 0x11659}, {0x11660, 0x1166C},\n\t{0x11680, 0x116AA}, {0x116AB, 0x116AB}, {0x116AC, 0x116AC},\n\t{0x116AD, 0x116AD}, {0x116AE, 0x116AF}, {0x116B0, 0x116B5},\n\t{0x116B6, 0x116B6}, {0x116B7, 0x116B7}, {0x116C0, 0x116C9},\n\t{0x11700, 0x11719}, {0x1171D, 0x1171F}, {0x11720, 0x11721},\n\t{0x11722, 0x11725}, {0x11726, 0x11726}, {0x11727, 0x1172B},\n\t{0x11730, 0x11739}, {0x1173A, 0x1173B}, {0x1173C, 0x1173E},\n\t{0x1173F, 0x1173F}, {0x118A0, 0x118DF}, {0x118E0, 0x118E9},\n\t{0x118EA, 0x118F2}, {0x118FF, 0x118FF}, {0x11AC0, 0x11AF8},\n\t{0x11C00, 0x11C08}, {0x11C0A, 0x11C2E}, {0x11C2F, 0x11C2F},\n\t{0x11C30, 0x11C36}, {0x11C38, 0x11C3D}, {0x11C3E, 0x11C3E},\n\t{0x11C3F, 0x11C3F}, {0x11C40, 0x11C40}, {0x11C41, 0x11C45},\n\t{0x11C50, 0x11C59}, {0x11C5A, 0x11C6C}, {0x11C70, 0x11C71},\n\t{0x11C72, 0x11C8F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CA9},\n\t{0x11CAA, 0x11CB0}, {0x11CB1, 0x11CB1}, {0x11CB2, 0x11CB3},\n\t{0x11CB4, 0x11CB4}, {0x11CB5, 0x11CB6}, {0x12000, 0x12399},\n\t{0x12400, 0x1246E}, {0x12470, 0x12474}, {0x12480, 0x12543},\n\t{0x13000, 0x1342E}, {0x14400, 0x14646}, {0x16800, 0x16A38},\n\t{0x16A40, 0x16A5E}, {0x16A60, 0x16A69}, {0x16A6E, 0x16A6F},\n\t{0x16AD0, 0x16AED}, {0x16AF0, 0x16AF4}, {0x16AF5, 0x16AF5},\n\t{0x16B00, 0x16B2F}, {0x16B30, 0x16B36}, {0x16B37, 0x16B3B},\n\t{0x16B3C, 0x16B3F}, {0x16B40, 0x16B43}, {0x16B44, 0x16B44},\n\t{0x16B45, 0x16B45}, {0x16B50, 0x16B59}, {0x16B5B, 0x16B61},\n\t{0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16F00, 0x16F44},\n\t{0x16F50, 0x16F50}, {0x16F51, 0x16F7E}, {0x16F8F, 0x16F92},\n\t{0x16F93, 0x16F9F}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C},\n\t{0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1BC9C, 0x1BC9C},\n\t{0x1BC9D, 0x1BC9E}, {0x1BC9F, 0x1BC9F}, {0x1BCA0, 0x1BCA3},\n\t{0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, {0x1D129, 0x1D164},\n\t{0x1D165, 0x1D166}, {0x1D167, 0x1D169}, {0x1D16A, 0x1D16C},\n\t{0x1D16D, 0x1D172}, {0x1D173, 0x1D17A}, {0x1D17B, 0x1D182},\n\t{0x1D183, 0x1D184}, {0x1D185, 0x1D18B}, {0x1D18C, 0x1D1A9},\n\t{0x1D1AA, 0x1D1AD}, {0x1D1AE, 0x1D1E8}, {0x1D200, 0x1D241},\n\t{0x1D242, 0x1D244}, {0x1D245, 0x1D245}, {0x1D300, 0x1D356},\n\t{0x1D360, 0x1D371}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C},\n\t{0x1D49E, 0x1D49F}, {0x1D4A2, 0x1D4A2}, {0x1D4A5, 0x1D4A6},\n\t{0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BB, 0x1D4BB},\n\t{0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A},\n\t{0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539},\n\t{0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D546, 0x1D546},\n\t{0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D6C0},\n\t{0x1D6C1, 0x1D6C1}, {0x1D6C2, 0x1D6DA}, {0x1D6DB, 0x1D6DB},\n\t{0x1D6DC, 0x1D6FA}, {0x1D6FB, 0x1D6FB}, {0x1D6FC, 0x1D714},\n\t{0x1D715, 0x1D715}, {0x1D716, 0x1D734}, {0x1D735, 0x1D735},\n\t{0x1D736, 0x1D74E}, {0x1D74F, 0x1D74F}, {0x1D750, 0x1D76E},\n\t{0x1D76F, 0x1D76F}, {0x1D770, 0x1D788}, {0x1D789, 0x1D789},\n\t{0x1D78A, 0x1D7A8}, {0x1D7A9, 0x1D7A9}, {0x1D7AA, 0x1D7C2},\n\t{0x1D7C3, 0x1D7C3}, {0x1D7C4, 0x1D7CB}, {0x1D7CE, 0x1D7FF},\n\t{0x1D800, 0x1D9FF}, {0x1DA00, 0x1DA36}, {0x1DA37, 0x1DA3A},\n\t{0x1DA3B, 0x1DA6C}, {0x1DA6D, 0x1DA74}, {0x1DA75, 0x1DA75},\n\t{0x1DA76, 0x1DA83}, {0x1DA84, 0x1DA84}, {0x1DA85, 0x1DA86},\n\t{0x1DA87, 0x1DA8B}, {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF},\n\t{0x1E000, 0x1E006}, {0x1E008, 0x1E018}, {0x1E01B, 0x1E021},\n\t{0x1E023, 0x1E024}, {0x1E026, 0x1E02A}, {0x1E800, 0x1E8C4},\n\t{0x1E8C7, 0x1E8CF}, {0x1E8D0, 0x1E8D6}, {0x1E900, 0x1E943},\n\t{0x1E944, 0x1E94A}, {0x1E950, 0x1E959}, {0x1E95E, 0x1E95F},\n\t{0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE21, 0x1EE22},\n\t{0x1EE24, 0x1EE24}, {0x1EE27, 0x1EE27}, {0x1EE29, 0x1EE32},\n\t{0x1EE34, 0x1EE37}, {0x1EE39, 0x1EE39}, {0x1EE3B, 0x1EE3B},\n\t{0x1EE42, 0x1EE42}, {0x1EE47, 0x1EE47}, {0x1EE49, 0x1EE49},\n\t{0x1EE4B, 0x1EE4B}, {0x1EE4D, 0x1EE4F}, {0x1EE51, 0x1EE52},\n\t{0x1EE54, 0x1EE54}, {0x1EE57, 0x1EE57}, {0x1EE59, 0x1EE59},\n\t{0x1EE5B, 0x1EE5B}, {0x1EE5D, 0x1EE5D}, {0x1EE5F, 0x1EE5F},\n\t{0x1EE61, 0x1EE62}, {0x1EE64, 0x1EE64}, {0x1EE67, 0x1EE6A},\n\t{0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C},\n\t{0x1EE7E, 0x1EE7E}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B},\n\t{0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB},\n\t{0x1EEF0, 0x1EEF1}, {0x1F000, 0x1F003}, {0x1F005, 0x1F02B},\n\t{0x1F030, 0x1F093}, {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF},\n\t{0x1F0C1, 0x1F0CE}, {0x1F0D1, 0x1F0F5}, {0x1F10B, 0x1F10C},\n\t{0x1F12E, 0x1F12E}, {0x1F16A, 0x1F16B}, {0x1F1E6, 0x1F1FF},\n\t{0x1F321, 0x1F32C}, {0x1F336, 0x1F336}, {0x1F37D, 0x1F37D},\n\t{0x1F394, 0x1F39F}, {0x1F3CB, 0x1F3CE}, {0x1F3D4, 0x1F3DF},\n\t{0x1F3F1, 0x1F3F3}, {0x1F3F5, 0x1F3F7}, {0x1F43F, 0x1F43F},\n\t{0x1F441, 0x1F441}, {0x1F4FD, 0x1F4FE}, {0x1F53E, 0x1F54A},\n\t{0x1F54F, 0x1F54F}, {0x1F568, 0x1F579}, {0x1F57B, 0x1F594},\n\t{0x1F597, 0x1F5A3}, {0x1F5A5, 0x1F5FA}, {0x1F650, 0x1F67F},\n\t{0x1F6C6, 0x1F6CB}, {0x1F6CD, 0x1F6CF}, {0x1F6E0, 0x1F6EA},\n\t{0x1F6F0, 0x1F6F3}, {0x1F700, 0x1F773}, {0x1F780, 0x1F7D4},\n\t{0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, {0x1F850, 0x1F859},\n\t{0x1F860, 0x1F887}, {0x1F890, 0x1F8AD}, {0xE0001, 0xE0001},\n\t{0xE0020, 0xE007F},\n}\n\n// Condition have flag EastAsianWidth whether the current locale is CJK or not.\ntype Condition struct {\n\tEastAsianWidth bool\n}\n\n// NewCondition return new instance of Condition which is current locale.\nfunc NewCondition() *Condition {\n\treturn &Condition{EastAsianWidth}\n}\n\n// RuneWidth returns the number of cells in r.\n// See http://www.unicode.org/reports/tr11/\nfunc (c *Condition) RuneWidth(r rune) int {\n\tswitch {\n\tcase r < 0 || r > 0x10FFFF ||\n\t\tinTables(r, nonprint, combining, notassigned):\n\t\treturn 0\n\tcase (c.EastAsianWidth && IsAmbiguousWidth(r)) ||\n\t\tinTables(r, doublewidth, emoji):\n\t\treturn 2\n\tdefault:\n\t\treturn 1\n\t}\n}\n\n// StringWidth return width as you can see\nfunc (c *Condition) StringWidth(s string) (width int) {\n\tfor _, r := range []rune(s) {\n\t\twidth += c.RuneWidth(r)\n\t}\n\treturn width\n}\n\n// Truncate return string truncated with w cells\nfunc (c *Condition) Truncate(s string, w int, tail string) string {\n\tif c.StringWidth(s) <= w {\n\t\treturn s\n\t}\n\tr := []rune(s)\n\ttw := c.StringWidth(tail)\n\tw -= tw\n\twidth := 0\n\ti := 0\n\tfor ; i < len(r); i++ {\n\t\tcw := c.RuneWidth(r[i])\n\t\tif width+cw > w {\n\t\t\tbreak\n\t\t}\n\t\twidth += cw\n\t}\n\treturn string(r[0:i]) + tail\n}\n\n// Wrap return string wrapped with w cells\nfunc (c *Condition) Wrap(s string, w int) string {\n\twidth := 0\n\tout := \"\"\n\tfor _, r := range []rune(s) {\n\t\tcw := RuneWidth(r)\n\t\tif r == '\\n' {\n\t\t\tout += string(r)\n\t\t\twidth = 0\n\t\t\tcontinue\n\t\t} else if width+cw > w {\n\t\t\tout += \"\\n\"\n\t\t\twidth = 0\n\t\t\tout += string(r)\n\t\t\twidth += cw\n\t\t\tcontinue\n\t\t}\n\t\tout += string(r)\n\t\twidth += cw\n\t}\n\treturn out\n}\n\n// FillLeft return string filled in left by spaces in w cells\nfunc (c *Condition) FillLeft(s string, w int) string {\n\twidth := c.StringWidth(s)\n\tcount := w - width\n\tif count > 0 {\n\t\tb := make([]byte, count)\n\t\tfor i := range b {\n\t\t\tb[i] = ' '\n\t\t}\n\t\treturn string(b) + s\n\t}\n\treturn s\n}\n\n// FillRight return string filled in left by spaces in w cells\nfunc (c *Condition) FillRight(s string, w int) string {\n\twidth := c.StringWidth(s)\n\tcount := w - width\n\tif count > 0 {\n\t\tb := make([]byte, count)\n\t\tfor i := range b {\n\t\t\tb[i] = ' '\n\t\t}\n\t\treturn s + string(b)\n\t}\n\treturn s\n}\n\n// RuneWidth returns the number of cells in r.\n// See http://www.unicode.org/reports/tr11/\nfunc RuneWidth(r rune) int {\n\treturn DefaultCondition.RuneWidth(r)\n}\n\n// IsAmbiguousWidth returns whether is ambiguous width or not.\nfunc IsAmbiguousWidth(r rune) bool {\n\treturn inTables(r, private, ambiguous)\n}\n\n// IsNeutralWidth returns whether is neutral width or not.\nfunc IsNeutralWidth(r rune) bool {\n\treturn inTable(r, neutral)\n}\n\n// StringWidth return width as you can see\nfunc StringWidth(s string) (width int) {\n\treturn DefaultCondition.StringWidth(s)\n}\n\n// Truncate return string truncated with w cells\nfunc Truncate(s string, w int, tail string) string {\n\treturn DefaultCondition.Truncate(s, w, tail)\n}\n\n// Wrap return string wrapped with w cells\nfunc Wrap(s string, w int) string {\n\treturn DefaultCondition.Wrap(s, w)\n}\n\n// FillLeft return string filled in left by spaces in w cells\nfunc FillLeft(s string, w int) string {\n\treturn DefaultCondition.FillLeft(s, w)\n}\n\n// FillRight return string filled in left by spaces in w cells\nfunc FillRight(s string, w int) string {\n\treturn DefaultCondition.FillRight(s, w)\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-runewidth/runewidth_js.go",
    "content": "// +build js\n\npackage runewidth\n\nfunc IsEastAsian() bool {\n\t// TODO: Implement this for the web. Detect east asian in a compatible way, and return true.\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-runewidth/runewidth_posix.go",
    "content": "// +build !windows,!js\n\npackage runewidth\n\nimport (\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nvar reLoc = regexp.MustCompile(`^[a-z][a-z][a-z]?(?:_[A-Z][A-Z])?\\.(.+)`)\n\nvar mblenTable = map[string]int{\n\t\"utf-8\":   6,\n\t\"utf8\":    6,\n\t\"jis\":     8,\n\t\"eucjp\":   3,\n\t\"euckr\":   2,\n\t\"euccn\":   2,\n\t\"sjis\":    2,\n\t\"cp932\":   2,\n\t\"cp51932\": 2,\n\t\"cp936\":   2,\n\t\"cp949\":   2,\n\t\"cp950\":   2,\n\t\"big5\":    2,\n\t\"gbk\":     2,\n\t\"gb2312\":  2,\n}\n\nfunc isEastAsian(locale string) bool {\n\tcharset := strings.ToLower(locale)\n\tr := reLoc.FindStringSubmatch(locale)\n\tif len(r) == 2 {\n\t\tcharset = strings.ToLower(r[1])\n\t}\n\n\tif strings.HasSuffix(charset, \"@cjk_narrow\") {\n\t\treturn false\n\t}\n\n\tfor pos, b := range []byte(charset) {\n\t\tif b == '@' {\n\t\t\tcharset = charset[:pos]\n\t\t\tbreak\n\t\t}\n\t}\n\tmax := 1\n\tif m, ok := mblenTable[charset]; ok {\n\t\tmax = m\n\t}\n\tif max > 1 && (charset[0] != 'u' ||\n\t\tstrings.HasPrefix(locale, \"ja\") ||\n\t\tstrings.HasPrefix(locale, \"ko\") ||\n\t\tstrings.HasPrefix(locale, \"zh\")) {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// IsEastAsian return true if the current locale is CJK\nfunc IsEastAsian() bool {\n\tlocale := os.Getenv(\"LC_CTYPE\")\n\tif locale == \"\" {\n\t\tlocale = os.Getenv(\"LANG\")\n\t}\n\n\t// ignore C locale\n\tif locale == \"POSIX\" || locale == \"C\" {\n\t\treturn false\n\t}\n\tif len(locale) > 1 && locale[0] == 'C' && (locale[1] == '.' || locale[1] == '-') {\n\t\treturn false\n\t}\n\n\treturn isEastAsian(locale)\n}\n"
  },
  {
    "path": "vendor/github.com/mattn/go-runewidth/runewidth_windows.go",
    "content": "package runewidth\n\nimport (\n\t\"syscall\"\n)\n\nvar (\n\tkernel32               = syscall.NewLazyDLL(\"kernel32\")\n\tprocGetConsoleOutputCP = kernel32.NewProc(\"GetConsoleOutputCP\")\n)\n\n// IsEastAsian return true if the current locale is CJK\nfunc IsEastAsian() bool {\n\tr1, _, _ := procGetConsoleOutputCP.Call()\n\tif r1 == 0 {\n\t\treturn false\n\t}\n\n\tswitch int(r1) {\n\tcase 932, 51932, 936, 949, 950:\n\t\treturn true\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/mitchellh/go-wordwrap/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Mitchell Hashimoto\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/mitchellh/go-wordwrap/README.md",
    "content": "# go-wordwrap\n\n`go-wordwrap` (Golang package: `wordwrap`) is a package for Go that\nautomatically wraps words into multiple lines. The primary use case for this\nis in formatting CLI output, but of course word wrapping is a generally useful\nthing to do.\n\n## Installation and Usage\n\nInstall using `go get github.com/mitchellh/go-wordwrap`.\n\nFull documentation is available at\nhttp://godoc.org/github.com/mitchellh/go-wordwrap\n\nBelow is an example of its usage ignoring errors:\n\n```go\nwrapped := wordwrap.WrapString(\"foo bar baz\", 3)\nfmt.Println(wrapped)\n```\n\nWould output:\n\n```\nfoo\nbar\nbaz\n```\n\n## Word Wrap Algorithm\n\nThis library doesn't use any clever algorithm for word wrapping. The wrapping\nis actually very naive: whenever there is whitespace or an explicit linebreak.\nThe goal of this library is for word wrapping CLI output, so the input is\ntypically pretty well controlled human language. Because of this, the naive\napproach typically works just fine.\n\nIn the future, we'd like to make the algorithm more advanced. We would do\nso without breaking the API.\n"
  },
  {
    "path": "vendor/github.com/mitchellh/go-wordwrap/wordwrap.go",
    "content": "package wordwrap\n\nimport (\n\t\"bytes\"\n\t\"unicode\"\n)\n\n// WrapString wraps the given string within lim width in characters.\n//\n// Wrapping is currently naive and only happens at white-space. A future\n// version of the library will implement smarter wrapping. This means that\n// pathological cases can dramatically reach past the limit, such as a very\n// long word.\nfunc WrapString(s string, lim uint) string {\n\t// Initialize a buffer with a slightly larger size to account for breaks\n\tinit := make([]byte, 0, len(s))\n\tbuf := bytes.NewBuffer(init)\n\n\tvar current uint\n\tvar wordBuf, spaceBuf bytes.Buffer\n\n\tfor _, char := range s {\n\t\tif char == '\\n' {\n\t\t\tif wordBuf.Len() == 0 {\n\t\t\t\tif current+uint(spaceBuf.Len()) > lim {\n\t\t\t\t\tcurrent = 0\n\t\t\t\t} else {\n\t\t\t\t\tcurrent += uint(spaceBuf.Len())\n\t\t\t\t\tspaceBuf.WriteTo(buf)\n\t\t\t\t}\n\t\t\t\tspaceBuf.Reset()\n\t\t\t} else {\n\t\t\t\tcurrent += uint(spaceBuf.Len() + wordBuf.Len())\n\t\t\t\tspaceBuf.WriteTo(buf)\n\t\t\t\tspaceBuf.Reset()\n\t\t\t\twordBuf.WriteTo(buf)\n\t\t\t\twordBuf.Reset()\n\t\t\t}\n\t\t\tbuf.WriteRune(char)\n\t\t\tcurrent = 0\n\t\t} else if unicode.IsSpace(char) {\n\t\t\tif spaceBuf.Len() == 0 || wordBuf.Len() > 0 {\n\t\t\t\tcurrent += uint(spaceBuf.Len() + wordBuf.Len())\n\t\t\t\tspaceBuf.WriteTo(buf)\n\t\t\t\tspaceBuf.Reset()\n\t\t\t\twordBuf.WriteTo(buf)\n\t\t\t\twordBuf.Reset()\n\t\t\t}\n\n\t\t\tspaceBuf.WriteRune(char)\n\t\t} else {\n\n\t\t\twordBuf.WriteRune(char)\n\n\t\t\tif current+uint(spaceBuf.Len()+wordBuf.Len()) > lim && uint(wordBuf.Len()) < lim {\n\t\t\t\tbuf.WriteRune('\\n')\n\t\t\t\tcurrent = 0\n\t\t\t\tspaceBuf.Reset()\n\t\t\t}\n\t\t}\n\t}\n\n\tif wordBuf.Len() == 0 {\n\t\tif current+uint(spaceBuf.Len()) <= lim {\n\t\t\tspaceBuf.WriteTo(buf)\n\t\t}\n\t} else {\n\t\tspaceBuf.WriteTo(buf)\n\t\twordBuf.WriteTo(buf)\n\t}\n\n\treturn buf.String()\n}\n"
  },
  {
    "path": "vendor/github.com/mohae/deepcopy/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Joel\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": "vendor/github.com/mohae/deepcopy/README.md",
    "content": "deepCopy\n========\n[![GoDoc](https://godoc.org/github.com/mohae/deepcopy?status.svg)](https://godoc.org/github.com/mohae/deepcopy)[![Build Status](https://travis-ci.org/mohae/deepcopy.png)](https://travis-ci.org/mohae/deepcopy)\n\nDeepCopy makes deep copies of things: unexported field values are not copied.\n\n## Usage\n    cpy := deepcopy.Copy(orig)\n"
  },
  {
    "path": "vendor/github.com/mohae/deepcopy/deepcopy.go",
    "content": "// deepcopy makes deep copies of things. A standard copy will copy the\n// pointers: deep copy copies the values pointed to.  Unexported field\n// values are not copied.\n//\n// Copyright (c)2014-2016, Joel Scoble (github.com/mohae), all rights reserved.\n// License: MIT, for more details check the included LICENSE file.\npackage deepcopy\n\nimport (\n\t\"reflect\"\n\t\"time\"\n)\n\n// Interface for delegating copy process to type\ntype Interface interface {\n\tDeepCopy() interface{}\n}\n\n// Iface is an alias to Copy; this exists for backwards compatibility reasons.\nfunc Iface(iface interface{}) interface{} {\n\treturn Copy(iface)\n}\n\n// Copy creates a deep copy of whatever is passed to it and returns the copy\n// in an interface{}.  The returned value will need to be asserted to the\n// correct type.\nfunc Copy(src interface{}) interface{} {\n\tif src == nil {\n\t\treturn nil\n\t}\n\n\t// Make the interface a reflect.Value\n\toriginal := reflect.ValueOf(src)\n\n\t// Make a copy of the same type as the original.\n\tcpy := reflect.New(original.Type()).Elem()\n\n\t// Recursively copy the original.\n\tcopyRecursive(original, cpy)\n\n\t// Return the copy as an interface.\n\treturn cpy.Interface()\n}\n\n// copyRecursive does the actual copying of the interface. It currently has\n// limited support for what it can handle. Add as needed.\nfunc copyRecursive(original, cpy reflect.Value) {\n\t// check for implement deepcopy.Interface\n\tif original.CanInterface() {\n\t\tif copier, ok := original.Interface().(Interface); ok {\n\t\t\tcpy.Set(reflect.ValueOf(copier.DeepCopy()))\n\t\t\treturn\n\t\t}\n\t}\n\n\t// handle according to original's Kind\n\tswitch original.Kind() {\n\tcase reflect.Ptr:\n\t\t// Get the actual value being pointed to.\n\t\toriginalValue := original.Elem()\n\n\t\t// if  it isn't valid, return.\n\t\tif !originalValue.IsValid() {\n\t\t\treturn\n\t\t}\n\t\tcpy.Set(reflect.New(originalValue.Type()))\n\t\tcopyRecursive(originalValue, cpy.Elem())\n\n\tcase reflect.Interface:\n\t\t// If this is a nil, don't do anything\n\t\tif original.IsNil() {\n\t\t\treturn\n\t\t}\n\t\t// Get the value for the interface, not the pointer.\n\t\toriginalValue := original.Elem()\n\n\t\t// Get the value by calling Elem().\n\t\tcopyValue := reflect.New(originalValue.Type()).Elem()\n\t\tcopyRecursive(originalValue, copyValue)\n\t\tcpy.Set(copyValue)\n\n\tcase reflect.Struct:\n\t\tt, ok := original.Interface().(time.Time)\n\t\tif ok {\n\t\t\tcpy.Set(reflect.ValueOf(t))\n\t\t\treturn\n\t\t}\n\t\t// Go through each field of the struct and copy it.\n\t\tfor i := 0; i < original.NumField(); i++ {\n\t\t\t// The Type's StructField for a given field is checked to see if StructField.PkgPath\n\t\t\t// is set to determine if the field is exported or not because CanSet() returns false\n\t\t\t// for settable fields.  I'm not sure why.  -mohae\n\t\t\tif original.Type().Field(i).PkgPath != \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tcopyRecursive(original.Field(i), cpy.Field(i))\n\t\t}\n\n\tcase reflect.Slice:\n\t\tif original.IsNil() {\n\t\t\treturn\n\t\t}\n\t\t// Make a new slice and copy each element.\n\t\tcpy.Set(reflect.MakeSlice(original.Type(), original.Len(), original.Cap()))\n\t\tfor i := 0; i < original.Len(); i++ {\n\t\t\tcopyRecursive(original.Index(i), cpy.Index(i))\n\t\t}\n\n\tcase reflect.Map:\n\t\tif original.IsNil() {\n\t\t\treturn\n\t\t}\n\t\tcpy.Set(reflect.MakeMap(original.Type()))\n\t\tfor _, key := range original.MapKeys() {\n\t\t\toriginalValue := original.MapIndex(key)\n\t\t\tcopyValue := reflect.New(originalValue.Type()).Elem()\n\t\t\tcopyRecursive(originalValue, copyValue)\n\t\t\tcopyKey := Copy(key.Interface())\n\t\t\tcpy.SetMapIndex(reflect.ValueOf(copyKey), copyValue)\n\t\t}\n\n\tdefault:\n\t\tcpy.Set(original)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/go-stringutil/LICENSE",
    "content": "Copyright (c) 2015 Naoya Inada <naoina@kuune.org>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/naoina/go-stringutil/README.md",
    "content": "# stringutil [![Build Status](https://travis-ci.org/naoina/go-stringutil.svg?branch=master)](https://travis-ci.org/naoina/go-stringutil)\n\n## Installation\n\n    go get -u github.com/naoina/go-stringutil\n\n## Documentation\n\nSee https://godoc.org/github.com/naoina/go-stringutil\n\n## License\n\nMIT\n"
  },
  {
    "path": "vendor/github.com/naoina/go-stringutil/da.go",
    "content": "package stringutil\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"unicode/utf8\"\n)\n\nconst (\n\tterminationCharacter = '#'\n)\n\nfunc mustDoubleArray(da *doubleArray, err error) *doubleArray {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn da\n}\n\nfunc (da *doubleArray) Build(keys []string) error {\n\trecords := makeRecords(keys)\n\tif err := da.build(records, 1, 0, make(map[int]struct{})); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\ntype doubleArray struct {\n\tbc   []baseCheck\n\tnode []int\n}\n\nfunc newDoubleArray(keys []string) (*doubleArray, error) {\n\tda := &doubleArray{\n\t\tbc:   []baseCheck{0},\n\t\tnode: []int{-1}, // A start index is adjusting to 1 because 0 will be used as a mark of non-existent node.\n\t}\n\tif err := da.Build(keys); err != nil {\n\t\treturn nil, err\n\t}\n\treturn da, nil\n}\n\n// baseCheck contains BASE, CHECK and Extra flags.\n// From the top, 22bits of BASE, 2bits of Extra flags and 8bits of CHECK.\n//\n//  BASE (22bit) | Extra flags (2bit) | CHECK (8bit)\n// |----------------------|--|--------|\n// 32                    10  8         0\ntype baseCheck uint32\n\nfunc (bc baseCheck) Base() int {\n\treturn int(bc >> 10)\n}\n\nfunc (bc *baseCheck) SetBase(base int) {\n\t*bc |= baseCheck(base) << 10\n}\n\nfunc (bc baseCheck) Check() byte {\n\treturn byte(bc)\n}\n\nfunc (bc *baseCheck) SetCheck(check byte) {\n\t*bc |= baseCheck(check)\n}\n\nfunc (bc baseCheck) IsEmpty() bool {\n\treturn bc&0xfffffcff == 0\n}\n\nfunc (da *doubleArray) Lookup(path string) (length int) {\n\tidx := 1\n\ttmpIdx := idx\n\tfor i := 0; i < len(path); i++ {\n\t\tc := path[i]\n\t\ttmpIdx = da.nextIndex(da.bc[tmpIdx].Base(), c)\n\t\tif tmpIdx >= len(da.bc) || da.bc[tmpIdx].Check() != c {\n\t\t\tbreak\n\t\t}\n\t\tidx = tmpIdx\n\t}\n\tif next := da.nextIndex(da.bc[idx].Base(), terminationCharacter); next < len(da.bc) && da.bc[next].Check() == terminationCharacter {\n\t\treturn da.node[da.bc[next].Base()]\n\t}\n\treturn -1\n}\n\nfunc (da *doubleArray) LookupByBytes(path []byte) (length int) {\n\tidx := 1\n\ttmpIdx := idx\n\tfor i := 0; i < len(path); i++ {\n\t\tc := path[i]\n\t\ttmpIdx = da.nextIndex(da.bc[tmpIdx].Base(), c)\n\t\tif tmpIdx >= len(da.bc) || da.bc[tmpIdx].Check() != c {\n\t\t\tbreak\n\t\t}\n\t\tidx = tmpIdx\n\t}\n\tif next := da.nextIndex(da.bc[idx].Base(), terminationCharacter); next < len(da.bc) && da.bc[next].Check() == terminationCharacter {\n\t\treturn da.node[da.bc[next].Base()]\n\t}\n\treturn -1\n}\n\nfunc (da *doubleArray) build(srcs []record, idx, depth int, usedBase map[int]struct{}) error {\n\tsort.Stable(recordSlice(srcs))\n\tbase, siblings, leaf, err := da.arrange(srcs, idx, depth, usedBase)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif leaf != nil {\n\t\tda.bc[idx].SetBase(len(da.node))\n\t\tda.node = append(da.node, leaf.value)\n\t}\n\tfor _, sib := range siblings {\n\t\tda.setCheck(da.nextIndex(base, sib.c), sib.c)\n\t}\n\tfor _, sib := range siblings {\n\t\tif err := da.build(srcs[sib.start:sib.end], da.nextIndex(base, sib.c), depth+1, usedBase); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (da *doubleArray) setBase(i, base int) {\n\tda.bc[i].SetBase(base)\n}\n\nfunc (da *doubleArray) setCheck(i int, check byte) {\n\tda.bc[i].SetCheck(check)\n}\n\nfunc (da *doubleArray) findEmptyIndex(start int) int {\n\ti := start\n\tfor ; i < len(da.bc); i++ {\n\t\tif da.bc[i].IsEmpty() {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn i\n}\n\n// findBase returns good BASE.\nfunc (da *doubleArray) findBase(siblings []sibling, start int, usedBase map[int]struct{}) (base int) {\n\tfor idx, firstChar := start+1, siblings[0].c; ; idx = da.findEmptyIndex(idx + 1) {\n\t\tbase = da.nextIndex(idx, firstChar)\n\t\tif _, used := usedBase[base]; used {\n\t\t\tcontinue\n\t\t}\n\t\ti := 0\n\t\tfor ; i < len(siblings); i++ {\n\t\t\tnext := da.nextIndex(base, siblings[i].c)\n\t\t\tif len(da.bc) <= next {\n\t\t\t\tda.bc = append(da.bc, make([]baseCheck, next-len(da.bc)+1)...)\n\t\t\t}\n\t\t\tif !da.bc[next].IsEmpty() {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif i == len(siblings) {\n\t\t\tbreak\n\t\t}\n\t}\n\tusedBase[base] = struct{}{}\n\treturn base\n}\n\nfunc (da *doubleArray) arrange(records []record, idx, depth int, usedBase map[int]struct{}) (base int, siblings []sibling, leaf *record, err error) {\n\tsiblings, leaf, err = makeSiblings(records, depth)\n\tif err != nil {\n\t\treturn -1, nil, nil, err\n\t}\n\tif len(siblings) < 1 {\n\t\treturn -1, nil, leaf, nil\n\t}\n\tbase = da.findBase(siblings, idx, usedBase)\n\tda.setBase(idx, base)\n\treturn base, siblings, leaf, err\n}\n\ntype sibling struct {\n\tstart int\n\tend   int\n\tc     byte\n}\n\nfunc (da *doubleArray) nextIndex(base int, c byte) int {\n\treturn base ^ int(c)\n}\n\nfunc makeSiblings(records []record, depth int) (sib []sibling, leaf *record, err error) {\n\tvar (\n\t\tpc byte\n\t\tn  int\n\t)\n\tfor i, r := range records {\n\t\tif len(r.key) <= depth {\n\t\t\tleaf = &r\n\t\t\tcontinue\n\t\t}\n\t\tc := r.key[depth]\n\t\tswitch {\n\t\tcase pc < c:\n\t\t\tsib = append(sib, sibling{start: i, c: c})\n\t\tcase pc == c:\n\t\t\tcontinue\n\t\tdefault:\n\t\t\treturn nil, nil, fmt.Errorf(\"stringutil: BUG: records hasn't been sorted\")\n\t\t}\n\t\tif n > 0 {\n\t\t\tsib[n-1].end = i\n\t\t}\n\t\tpc = c\n\t\tn++\n\t}\n\tif n == 0 {\n\t\treturn nil, leaf, nil\n\t}\n\tsib[n-1].end = len(records)\n\treturn sib, leaf, nil\n}\n\ntype record struct {\n\tkey   string\n\tvalue int\n}\n\nfunc makeRecords(srcs []string) (records []record) {\n\ttermChar := string(terminationCharacter)\n\tfor _, s := range srcs {\n\t\trecords = append(records, record{\n\t\t\tkey:   string(s + termChar),\n\t\t\tvalue: utf8.RuneCountInString(s),\n\t\t})\n\t}\n\treturn records\n}\n\ntype recordSlice []record\n\nfunc (rs recordSlice) Len() int {\n\treturn len(rs)\n}\n\nfunc (rs recordSlice) Less(i, j int) bool {\n\treturn rs[i].key < rs[j].key\n}\n\nfunc (rs recordSlice) Swap(i, j int) {\n\trs[i], rs[j] = rs[j], rs[i]\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/go-stringutil/strings.go",
    "content": "package stringutil\n\nimport (\n\t\"sync\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\nvar (\n\tmu sync.Mutex\n\n\t// Based on https://github.com/golang/lint/blob/32a87160691b3c96046c0c678fe57c5bef761456/lint.go#L702\n\tcommonInitialismMap = map[string]struct{}{\n\t\t\"API\":   struct{}{},\n\t\t\"ASCII\": struct{}{},\n\t\t\"CPU\":   struct{}{},\n\t\t\"CSRF\":  struct{}{},\n\t\t\"CSS\":   struct{}{},\n\t\t\"DNS\":   struct{}{},\n\t\t\"EOF\":   struct{}{},\n\t\t\"GUID\":  struct{}{},\n\t\t\"HTML\":  struct{}{},\n\t\t\"HTTP\":  struct{}{},\n\t\t\"HTTPS\": struct{}{},\n\t\t\"ID\":    struct{}{},\n\t\t\"IP\":    struct{}{},\n\t\t\"JSON\":  struct{}{},\n\t\t\"LHS\":   struct{}{},\n\t\t\"QPS\":   struct{}{},\n\t\t\"RAM\":   struct{}{},\n\t\t\"RHS\":   struct{}{},\n\t\t\"RPC\":   struct{}{},\n\t\t\"SLA\":   struct{}{},\n\t\t\"SMTP\":  struct{}{},\n\t\t\"SQL\":   struct{}{},\n\t\t\"SSH\":   struct{}{},\n\t\t\"TCP\":   struct{}{},\n\t\t\"TLS\":   struct{}{},\n\t\t\"TTL\":   struct{}{},\n\t\t\"UDP\":   struct{}{},\n\t\t\"UI\":    struct{}{},\n\t\t\"UID\":   struct{}{},\n\t\t\"UUID\":  struct{}{},\n\t\t\"URI\":   struct{}{},\n\t\t\"URL\":   struct{}{},\n\t\t\"UTF8\":  struct{}{},\n\t\t\"VM\":    struct{}{},\n\t\t\"XML\":   struct{}{},\n\t\t\"XSRF\":  struct{}{},\n\t\t\"XSS\":   struct{}{},\n\t}\n\tcommonInitialisms = keys(commonInitialismMap)\n\tcommonInitialism  = mustDoubleArray(newDoubleArray(commonInitialisms))\n\tlongestLen        = longestLength(commonInitialisms)\n\tshortestLen       = shortestLength(commonInitialisms, longestLen)\n)\n\n// ToUpperCamelCase returns a copy of the string s with all Unicode letters mapped to their camel case.\n// It will convert to upper case previous letter of '_' and first letter, and remove letter of '_'.\nfunc ToUpperCamelCase(s string) string {\n\tif s == \"\" {\n\t\treturn \"\"\n\t}\n\tupper := true\n\tstart := 0\n\tresult := make([]byte, 0, len(s))\n\tvar runeBuf [utf8.UTFMax]byte\n\tvar initialism []byte\n\tfor _, c := range s {\n\t\tif c == '_' {\n\t\t\tupper = true\n\t\t\tcandidate := string(result[start:])\n\t\t\tinitialism = initialism[:0]\n\t\t\tfor _, r := range candidate {\n\t\t\t\tif r < utf8.RuneSelf {\n\t\t\t\t\tinitialism = append(initialism, toUpperASCII(byte(r)))\n\t\t\t\t} else {\n\t\t\t\t\tn := utf8.EncodeRune(runeBuf[:], unicode.ToUpper(r))\n\t\t\t\t\tinitialism = append(initialism, runeBuf[:n]...)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif length := commonInitialism.LookupByBytes(initialism); length > 0 {\n\t\t\t\tresult = append(result[:start], initialism...)\n\t\t\t}\n\t\t\tstart = len(result)\n\t\t\tcontinue\n\t\t}\n\t\tif upper {\n\t\t\tif c < utf8.RuneSelf {\n\t\t\t\tresult = append(result, toUpperASCII(byte(c)))\n\t\t\t} else {\n\t\t\t\tn := utf8.EncodeRune(runeBuf[:], unicode.ToUpper(c))\n\t\t\t\tresult = append(result, runeBuf[:n]...)\n\t\t\t}\n\t\t\tupper = false\n\t\t\tcontinue\n\t\t}\n\t\tif c < utf8.RuneSelf {\n\t\t\tresult = append(result, byte(c))\n\t\t} else {\n\t\t\tn := utf8.EncodeRune(runeBuf[:], c)\n\t\t\tresult = append(result, runeBuf[:n]...)\n\t\t}\n\t}\n\tcandidate := string(result[start:])\n\tinitialism = initialism[:0]\n\tfor _, r := range candidate {\n\t\tif r < utf8.RuneSelf {\n\t\t\tinitialism = append(initialism, toUpperASCII(byte(r)))\n\t\t} else {\n\t\t\tn := utf8.EncodeRune(runeBuf[:], unicode.ToUpper(r))\n\t\t\tinitialism = append(initialism, runeBuf[:n]...)\n\t\t}\n\t}\n\tif length := commonInitialism.LookupByBytes(initialism); length > 0 {\n\t\tresult = append(result[:start], initialism...)\n\t}\n\treturn string(result)\n}\n\n// ToUpperCamelCaseASCII is similar to ToUpperCamelCase, but optimized for\n// only the ASCII characters.\n// ToUpperCamelCaseASCII is faster than ToUpperCamelCase, but doesn't work if\n// contains non-ASCII characters.\nfunc ToUpperCamelCaseASCII(s string) string {\n\tif s == \"\" {\n\t\treturn \"\"\n\t}\n\tupper := true\n\tstart := 0\n\tresult := make([]byte, 0, len(s))\n\tvar initialism []byte\n\tfor i := 0; i < len(s); i++ {\n\t\tc := s[i]\n\t\tif c == '_' {\n\t\t\tupper = true\n\t\t\tcandidate := result[start:]\n\t\t\tinitialism = initialism[:0]\n\t\t\tfor _, b := range candidate {\n\t\t\t\tinitialism = append(initialism, toUpperASCII(b))\n\t\t\t}\n\t\t\tif length := commonInitialism.LookupByBytes(initialism); length > 0 {\n\t\t\t\tresult = append(result[:start], initialism...)\n\t\t\t}\n\t\t\tstart = len(result)\n\t\t\tcontinue\n\t\t}\n\t\tif upper {\n\t\t\tresult = append(result, toUpperASCII(c))\n\t\t\tupper = false\n\t\t\tcontinue\n\t\t}\n\t\tresult = append(result, c)\n\t}\n\tcandidate := result[start:]\n\tinitialism = initialism[:0]\n\tfor _, b := range candidate {\n\t\tinitialism = append(initialism, toUpperASCII(b))\n\t}\n\tif length := commonInitialism.LookupByBytes(initialism); length > 0 {\n\t\tresult = append(result[:start], initialism...)\n\t}\n\treturn string(result)\n}\n\n// ToSnakeCase returns a copy of the string s with all Unicode letters mapped to their snake case.\n// It will insert letter of '_' at position of previous letter of uppercase and all\n// letters convert to lower case.\n// ToSnakeCase does not insert '_' letter into a common initialism word like ID, URL and so on.\nfunc ToSnakeCase(s string) string {\n\tif s == \"\" {\n\t\treturn \"\"\n\t}\n\tresult := make([]byte, 0, len(s))\n\tvar runeBuf [utf8.UTFMax]byte\n\tvar j, skipCount int\n\tfor i, c := range s {\n\t\tif i < skipCount {\n\t\t\tcontinue\n\t\t}\n\t\tif unicode.IsUpper(c) {\n\t\t\tif i != 0 {\n\t\t\t\tresult = append(result, '_')\n\t\t\t}\n\t\t\tnext := nextIndex(j, len(s))\n\t\t\tif length := commonInitialism.Lookup(s[j:next]); length > 0 {\n\t\t\t\tfor _, r := range s[j : j+length] {\n\t\t\t\t\tif r < utf8.RuneSelf {\n\t\t\t\t\t\tresult = append(result, toLowerASCII(byte(r)))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tn := utf8.EncodeRune(runeBuf[:], unicode.ToLower(r))\n\t\t\t\t\t\tresult = append(result, runeBuf[:n]...)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tj += length - 1\n\t\t\t\tskipCount = i + length\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tif c < utf8.RuneSelf {\n\t\t\tresult = append(result, toLowerASCII(byte(c)))\n\t\t} else {\n\t\t\tn := utf8.EncodeRune(runeBuf[:], unicode.ToLower(c))\n\t\t\tresult = append(result, runeBuf[:n]...)\n\t\t}\n\t\tj++\n\t}\n\treturn string(result)\n}\n\n// ToSnakeCaseASCII is similar to ToSnakeCase, but optimized for only the ASCII\n// characters.\n// ToSnakeCaseASCII is faster than ToSnakeCase, but doesn't work correctly if\n// contains non-ASCII characters.\nfunc ToSnakeCaseASCII(s string) string {\n\tif s == \"\" {\n\t\treturn \"\"\n\t}\n\tresult := make([]byte, 0, len(s))\n\tfor i := 0; i < len(s); i++ {\n\t\tc := s[i]\n\t\tif isUpperASCII(c) {\n\t\t\tif i != 0 {\n\t\t\t\tresult = append(result, '_')\n\t\t\t}\n\t\t\tif k := i + shortestLen - 1; k < len(s) && isUpperASCII(s[k]) {\n\t\t\t\tif length := commonInitialism.Lookup(s[i:nextIndex(i, len(s))]); length > 0 {\n\t\t\t\t\tfor j, buf := 0, s[i:i+length]; j < len(buf); j++ {\n\t\t\t\t\t\tresult = append(result, toLowerASCII(buf[j]))\n\t\t\t\t\t}\n\t\t\t\t\ti += length - 1\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tresult = append(result, toLowerASCII(c))\n\t}\n\treturn string(result)\n}\n\n// AddCommonInitialism adds ss to list of common initialisms.\nfunc AddCommonInitialism(ss ...string) {\n\tmu.Lock()\n\tdefer mu.Unlock()\n\tfor _, s := range ss {\n\t\tcommonInitialismMap[s] = struct{}{}\n\t}\n\tcommonInitialisms = keys(commonInitialismMap)\n\tcommonInitialism = mustDoubleArray(newDoubleArray(commonInitialisms))\n\tlongestLen = longestLength(commonInitialisms)\n\tshortestLen = shortestLength(commonInitialisms, longestLen)\n}\n\n// DelCommonInitialism deletes ss from list of common initialisms.\nfunc DelCommonInitialism(ss ...string) {\n\tmu.Lock()\n\tdefer mu.Unlock()\n\tfor _, s := range ss {\n\t\tdelete(commonInitialismMap, s)\n\t}\n\tcommonInitialisms = keys(commonInitialismMap)\n\tcommonInitialism = mustDoubleArray(newDoubleArray(commonInitialisms))\n\tlongestLen = longestLength(commonInitialisms)\n\tshortestLen = shortestLength(commonInitialisms, longestLen)\n}\n\nfunc isUpperASCII(c byte) bool {\n\treturn 'A' <= c && c <= 'Z'\n}\n\nfunc isLowerASCII(c byte) bool {\n\treturn 'a' <= c && c <= 'z'\n}\n\nfunc toUpperASCII(c byte) byte {\n\tif isLowerASCII(c) {\n\t\treturn c - ('a' - 'A')\n\t}\n\treturn c\n}\n\nfunc toLowerASCII(c byte) byte {\n\tif isUpperASCII(c) {\n\t\treturn c + 'a' - 'A'\n\t}\n\treturn c\n}\n\nfunc nextIndex(i, maxlen int) int {\n\tif n := i + longestLen; n < maxlen {\n\t\treturn n\n\t}\n\treturn maxlen\n}\n\nfunc keys(m map[string]struct{}) []string {\n\tresult := make([]string, 0, len(m))\n\tfor k := range m {\n\t\tresult = append(result, k)\n\t}\n\treturn result\n}\n\nfunc shortestLength(strs []string, shortest int) int {\n\tfor _, s := range strs {\n\t\tif candidate := utf8.RuneCountInString(s); candidate < shortest {\n\t\t\tshortest = candidate\n\t\t}\n\t}\n\treturn shortest\n}\n\nfunc longestLength(strs []string) (longest int) {\n\tfor _, s := range strs {\n\t\tif candidate := utf8.RuneCountInString(s); candidate > longest {\n\t\t\tlongest = candidate\n\t\t}\n\t}\n\treturn longest\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/LICENSE",
    "content": "Copyright (c) 2014 Naoya Inada <naoina@kuune.org>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/README.md",
    "content": "# TOML parser and encoder library for Golang [![Build Status](https://travis-ci.org/naoina/toml.png?branch=master)](https://travis-ci.org/naoina/toml)\n\n[TOML](https://github.com/toml-lang/toml) parser and encoder library for [Golang](http://golang.org/).\n\nThis library is compatible with TOML version [v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md).\n\n## Installation\n\n    go get -u github.com/naoina/toml\n\n## Usage\n\nThe following TOML save as `example.toml`.\n\n```toml\n# This is a TOML document. Boom.\n\ntitle = \"TOML Example\"\n\n[owner]\nname = \"Lance Uppercut\"\ndob = 1979-05-27T07:32:00-08:00 # First class dates? Why not?\n\n[database]\nserver = \"192.168.1.1\"\nports = [ 8001, 8001, 8002 ]\nconnection_max = 5000\nenabled = true\n\n[servers]\n\n  # You can indent as you please. Tabs or spaces. TOML don't care.\n  [servers.alpha]\n  ip = \"10.0.0.1\"\n  dc = \"eqdc10\"\n\n  [servers.beta]\n  ip = \"10.0.0.2\"\n  dc = \"eqdc10\"\n\n[clients]\ndata = [ [\"gamma\", \"delta\"], [1, 2] ]\n\n# Line breaks are OK when inside arrays\nhosts = [\n  \"alpha\",\n  \"omega\"\n]\n```\n\nThen above TOML will mapping to `tomlConfig` struct using `toml.Unmarshal`.\n\n```go\npackage main\n\nimport (\n    \"io/ioutil\"\n    \"os\"\n    \"time\"\n\n    \"github.com/naoina/toml\"\n)\n\ntype tomlConfig struct {\n    Title string\n    Owner struct {\n        Name string\n        Dob  time.Time\n    }\n    Database struct {\n        Server        string\n        Ports         []int\n        ConnectionMax uint\n        Enabled       bool\n    }\n    Servers map[string]ServerInfo\n    Clients struct {\n        Data  [][]interface{}\n        Hosts []string\n    }\n}\n\ntype ServerInfo struct {\n    IP net.IP\n    DC string\n}\n\nfunc main() {\n    f, err := os.Open(\"example.toml\")\n    if err != nil {\n        panic(err)\n    }\n    defer f.Close()\n    var config Config\n    if err := toml.NewDecoder(f).Decode(&config); err != nil {\n        panic(err)\n    }\n\n    // then to use the unmarshaled config...\n    fmt.Println(\"IP of server 'alpha':\", config.Servers[\"alpha\"].IP)\n}\n```\n\n## Mappings\n\nA key and value of TOML will map to the corresponding field.\nThe fields of struct for mapping must be exported.\n\nThe rules of the mapping of key are following:\n\n#### Exact matching\n\n```toml\ntimeout_seconds = 256\n```\n\n```go\ntype Config struct {\n\tTimeout_seconds int\n}\n```\n\n#### Camelcase matching\n\n```toml\nserver_name = \"srv1\"\n```\n\n```go\ntype Config struct {\n\tServerName string\n}\n```\n\n#### Uppercase matching\n\n```toml\nip = \"10.0.0.1\"\n```\n\n```go\ntype Config struct {\n\tIP string\n}\n```\n\nSee the following examples for the value mappings.\n\n### String\n\n```toml\nval = \"string\"\n```\n\n```go\ntype Config struct {\n\tVal string\n}\n```\n\n### Integer\n\n```toml\nval = 100\n```\n\n```go\ntype Config struct {\n\tVal int\n}\n```\n\nAll types that can be used are following:\n\n* int8 (from `-128` to `127`)\n* int16 (from `-32768` to `32767`)\n* int32 (from `-2147483648` to `2147483647`)\n* int64 (from `-9223372036854775808` to `9223372036854775807`)\n* int (same as `int32` on 32bit environment, or `int64` on 64bit environment)\n* uint8 (from `0` to `255`)\n* uint16 (from `0` to `65535`)\n* uint32 (from `0` to `4294967295`)\n* uint64 (from `0` to `18446744073709551615`)\n* uint (same as `uint` on 32bit environment, or `uint64` on 64bit environment)\n\n### Float\n\n```toml\nval = 3.1415\n```\n\n```go\ntype Config struct {\n\tVal float32\n}\n```\n\nAll types that can be used are following:\n\n* float32\n* float64\n\n### Boolean\n\n```toml\nval = true\n```\n\n```go\ntype Config struct {\n\tVal bool\n}\n```\n\n### Datetime\n\n```toml\nval = 2014-09-28T21:27:39Z\n```\n\n```go\ntype Config struct {\n\tVal time.Time\n}\n```\n\n### Array\n\n```toml\nval = [\"a\", \"b\", \"c\"]\n```\n\n```go\ntype Config struct {\n\tVal []string\n}\n```\n\nAlso following examples all can be mapped:\n\n```toml\nval1 = [1, 2, 3]\nval2 = [[\"a\", \"b\"], [\"c\", \"d\"]]\nval3 = [[1, 2, 3], [\"a\", \"b\", \"c\"]]\nval4 = [[1, 2, 3], [[\"a\", \"b\"], [true, false]]]\n```\n\n```go\ntype Config struct {\n\tVal1 []int\n\tVal2 [][]string\n\tVal3 [][]interface{}\n\tVal4 [][]interface{}\n}\n```\n\n### Table\n\n```toml\n[server]\ntype = \"app\"\n\n  [server.development]\n  ip = \"10.0.0.1\"\n\n  [server.production]\n  ip = \"10.0.0.2\"\n```\n\n```go\ntype Config struct {\n\tServer map[string]Server\n}\n\ntype Server struct {\n\tIP string\n}\n```\n\nYou can also use the following struct instead of map of struct.\n\n```go\ntype Config struct {\n\tServer struct {\n\t\tDevelopment Server\n\t\tProduction Server\n\t}\n}\n\ntype Server struct {\n\tIP string\n}\n```\n\n### Array of Tables\n\n```toml\n[[fruit]]\n  name = \"apple\"\n\n  [fruit.physical]\n    color = \"red\"\n    shape = \"round\"\n\n  [[fruit.variety]]\n    name = \"red delicious\"\n\n  [[fruit.variety]]\n    name = \"granny smith\"\n\n[[fruit]]\n  name = \"banana\"\n\n  [[fruit.variety]]\n    name = \"plantain\"\n```\n\n```go\ntype Config struct {\n\tFruit []struct {\n\t\tName string\n\t\tPhysical struct {\n\t\t\tColor string\n\t\t\tShape string\n\t\t}\n\t\tVariety []struct {\n\t\t\tName string\n\t\t}\n\t}\n}\n```\n\n### Using the `encoding.TextUnmarshaler` interface\n\nPackage toml supports `encoding.TextUnmarshaler` (and `encoding.TextMarshaler`). You can\nuse it to apply custom marshaling rules for certain types. The `UnmarshalText` method is\ncalled with the value text found in the TOML input. TOML strings are passed unquoted.\n\n```toml\nduration = \"10s\"\n```\n\n```go\nimport time\n\ntype Duration time.Duration\n\n// UnmarshalText implements encoding.TextUnmarshaler\nfunc (d *Duration) UnmarshalText(data []byte) error {\n    duration, err := time.ParseDuration(string(data))\n    if err == nil {\n        *d = Duration(duration)\n    }\n    return err\n}\n\n// MarshalText implements encoding.TextMarshaler\nfunc (d Duration) MarshalText() ([]byte, error) {\n    return []byte(time.Duration(d).String()), nil\n}\n\ntype ConfigWithDuration struct {\n    Duration Duration\n}\n```\n### Using the `toml.UnmarshalerRec` interface\n\nYou can also override marshaling rules specifically for TOML using the `UnmarshalerRec`\nand `MarshalerRec` interfaces. These are useful if you want to control how structs or\narrays are handled. You can apply additional validation or set unexported struct fields.\n\nNote: `encoding.TextUnmarshaler` and `encoding.TextMarshaler` should be preferred for\nsimple (scalar) values because they're also compatible with other formats like JSON or\nYAML.\n\n[See the UnmarshalerRec example](https://godoc.org/github.com/naoina/toml/#example_UnmarshalerRec).\n\n### Using the `toml.Unmarshaler` interface\n\nIf you want to deal with raw TOML syntax, use the `Unmarshaler` and `Marshaler`\ninterfaces. Their input and output is raw TOML syntax. As such, these interfaces are\nuseful if you want to handle TOML at the syntax level.\n\n[See the Unmarshaler example](https://godoc.org/github.com/naoina/toml/#example_Unmarshaler).\n\n## API documentation\n\nSee [Godoc](http://godoc.org/github.com/naoina/toml).\n\n## License\n\nMIT\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/ast/ast.go",
    "content": "package ast\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\ntype Position struct {\n\tBegin int\n\tEnd   int\n}\n\ntype Value interface {\n\tPos() int\n\tEnd() int\n\tSource() string\n}\n\ntype String struct {\n\tPosition Position\n\tValue    string\n\tData     []rune\n}\n\nfunc (s *String) Pos() int {\n\treturn s.Position.Begin\n}\n\nfunc (s *String) End() int {\n\treturn s.Position.End\n}\n\nfunc (s *String) Source() string {\n\treturn string(s.Data)\n}\n\ntype Integer struct {\n\tPosition Position\n\tValue    string\n\tData     []rune\n}\n\nfunc (i *Integer) Pos() int {\n\treturn i.Position.Begin\n}\n\nfunc (i *Integer) End() int {\n\treturn i.Position.End\n}\n\nfunc (i *Integer) Source() string {\n\treturn string(i.Data)\n}\n\nfunc (i *Integer) Int() (int64, error) {\n\treturn strconv.ParseInt(i.Value, 10, 64)\n}\n\ntype Float struct {\n\tPosition Position\n\tValue    string\n\tData     []rune\n}\n\nfunc (f *Float) Pos() int {\n\treturn f.Position.Begin\n}\n\nfunc (f *Float) End() int {\n\treturn f.Position.End\n}\n\nfunc (f *Float) Source() string {\n\treturn string(f.Data)\n}\n\nfunc (f *Float) Float() (float64, error) {\n\treturn strconv.ParseFloat(f.Value, 64)\n}\n\ntype Boolean struct {\n\tPosition Position\n\tValue    string\n\tData     []rune\n}\n\nfunc (b *Boolean) Pos() int {\n\treturn b.Position.Begin\n}\n\nfunc (b *Boolean) End() int {\n\treturn b.Position.End\n}\n\nfunc (b *Boolean) Source() string {\n\treturn string(b.Data)\n}\n\nfunc (b *Boolean) Boolean() (bool, error) {\n\treturn strconv.ParseBool(b.Value)\n}\n\ntype Datetime struct {\n\tPosition Position\n\tValue    string\n\tData     []rune\n}\n\nfunc (d *Datetime) Pos() int {\n\treturn d.Position.Begin\n}\n\nfunc (d *Datetime) End() int {\n\treturn d.Position.End\n}\n\nfunc (d *Datetime) Source() string {\n\treturn string(d.Data)\n}\n\nfunc (d *Datetime) Time() (time.Time, error) {\n\tswitch {\n\tcase !strings.Contains(d.Value, \":\"):\n\t\treturn time.Parse(\"2006-01-02\", d.Value)\n\tcase !strings.Contains(d.Value, \"-\"):\n\t\treturn time.Parse(\"15:04:05.999999999\", d.Value)\n\tdefault:\n\t\treturn time.Parse(time.RFC3339Nano, d.Value)\n\t}\n}\n\ntype Array struct {\n\tPosition Position\n\tValue    []Value\n\tData     []rune\n}\n\nfunc (a *Array) Pos() int {\n\treturn a.Position.Begin\n}\n\nfunc (a *Array) End() int {\n\treturn a.Position.End\n}\n\nfunc (a *Array) Source() string {\n\treturn string(a.Data)\n}\n\ntype TableType uint8\n\nconst (\n\tTableTypeNormal TableType = iota\n\tTableTypeArray\n)\n\nvar tableTypes = [...]string{\n\t\"normal\",\n\t\"array\",\n}\n\nfunc (t TableType) String() string {\n\treturn tableTypes[t]\n}\n\ntype Table struct {\n\tPosition Position\n\tLine     int\n\tName     string\n\tFields   map[string]interface{}\n\tType     TableType\n\tData     []rune\n}\n\nfunc (t *Table) Pos() int {\n\treturn t.Position.Begin\n}\n\nfunc (t *Table) End() int {\n\treturn t.Position.End\n}\n\nfunc (t *Table) Source() string {\n\treturn string(t.Data)\n}\n\ntype KeyValue struct {\n\tKey   string\n\tValue Value\n\tLine  int\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/config.go",
    "content": "package toml\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"strings\"\n\n\tstringutil \"github.com/naoina/go-stringutil\"\n\t\"github.com/naoina/toml/ast\"\n)\n\n// Config contains options for encoding and decoding.\ntype Config struct {\n\t// NormFieldName is used to match TOML keys to struct fields. The function runs for\n\t// both input keys and struct field names and should return a string that makes the\n\t// two match. You must set this field to use the decoder.\n\t//\n\t// Example: The function in the default config removes _ and lowercases all keys. This\n\t// allows a key called 'api_key' to match the struct field 'APIKey' because both are\n\t// normalized to 'apikey'.\n\t//\n\t// Note that NormFieldName is not used for fields which define a TOML\n\t// key through the struct tag.\n\tNormFieldName func(typ reflect.Type, keyOrField string) string\n\n\t// FieldToKey determines the TOML key of a struct field when encoding.\n\t// You must set this field to use the encoder.\n\t//\n\t// Note that FieldToKey is not used for fields which define a TOML\n\t// key through the struct tag.\n\tFieldToKey func(typ reflect.Type, field string) string\n\n\t// MissingField, if non-nil, is called when the decoder encounters a key for which no\n\t// matching struct field exists. The default behavior is to return an error.\n\tMissingField func(typ reflect.Type, key string) error\n}\n\n// DefaultConfig contains the default options for encoding and decoding.\n// Snake case (i.e. 'foo_bar') is used for key names.\nvar DefaultConfig = Config{\n\tNormFieldName: defaultNormFieldName,\n\tFieldToKey:    snakeCase,\n}\n\nfunc defaultNormFieldName(typ reflect.Type, s string) string {\n\treturn strings.Replace(strings.ToLower(s), \"_\", \"\", -1)\n}\n\nfunc snakeCase(typ reflect.Type, s string) string {\n\treturn stringutil.ToSnakeCase(s)\n}\n\nfunc defaultMissingField(typ reflect.Type, key string) error {\n\treturn fmt.Errorf(\"field corresponding to `%s' is not defined in %v\", key, typ)\n}\n\n// NewEncoder returns a new Encoder that writes to w.\n// It is shorthand for DefaultConfig.NewEncoder(w).\nfunc NewEncoder(w io.Writer) *Encoder {\n\treturn DefaultConfig.NewEncoder(w)\n}\n\n// Marshal returns the TOML encoding of v.\n// It is shorthand for DefaultConfig.Marshal(v).\nfunc Marshal(v interface{}) ([]byte, error) {\n\treturn DefaultConfig.Marshal(v)\n}\n\n// Unmarshal parses the TOML data and stores the result in the value pointed to by v.\n// It is shorthand for DefaultConfig.Unmarshal(data, v).\nfunc Unmarshal(data []byte, v interface{}) error {\n\treturn DefaultConfig.Unmarshal(data, v)\n}\n\n// UnmarshalTable applies the contents of an ast.Table to the value pointed at by v.\n// It is shorthand for DefaultConfig.UnmarshalTable(t, v).\nfunc UnmarshalTable(t *ast.Table, v interface{}) error {\n\treturn DefaultConfig.UnmarshalTable(t, v)\n}\n\n// NewDecoder returns a new Decoder that reads from r.\n// It is shorthand for DefaultConfig.NewDecoder(r).\nfunc NewDecoder(r io.Reader) *Decoder {\n\treturn DefaultConfig.NewDecoder(r)\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/decode.go",
    "content": "// Package toml encodes and decodes the TOML configuration format using reflection.\n//\n// This library is compatible with TOML version v0.4.0.\npackage toml\n\nimport (\n\t\"encoding\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/naoina/toml/ast\"\n)\n\nconst (\n\ttableSeparator = '.'\n)\n\nvar (\n\tescapeReplacer = strings.NewReplacer(\n\t\t\"\\b\", \"\\\\n\",\n\t\t\"\\f\", \"\\\\f\",\n\t\t\"\\n\", \"\\\\n\",\n\t\t\"\\r\", \"\\\\r\",\n\t\t\"\\t\", \"\\\\t\",\n\t)\n\tunderscoreReplacer = strings.NewReplacer(\n\t\t\"_\", \"\",\n\t)\n)\n\nvar timeType = reflect.TypeOf(time.Time{})\n\n// Unmarshal parses the TOML data and stores the result in the value pointed to by v.\n//\n// Unmarshal will mapped to v that according to following rules:\n//\n//\tTOML strings to string\n//\tTOML integers to any int type\n//\tTOML floats to float32 or float64\n//\tTOML booleans to bool\n//\tTOML datetimes to time.Time\n//\tTOML arrays to any type of slice\n//\tTOML tables to struct or map\n//\tTOML array tables to slice of struct or map\nfunc (cfg *Config) Unmarshal(data []byte, v interface{}) error {\n\ttable, err := Parse(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := cfg.UnmarshalTable(table, v); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// A Decoder reads and decodes TOML from an input stream.\ntype Decoder struct {\n\tr   io.Reader\n\tcfg *Config\n}\n\n// NewDecoder returns a new Decoder that reads from r.\n// Note that it reads all from r before parsing it.\nfunc (cfg *Config) NewDecoder(r io.Reader) *Decoder {\n\treturn &Decoder{r, cfg}\n}\n\n// Decode parses the TOML data from its input and stores it in the value pointed to by v.\n// See the documentation for Unmarshal for details about the conversion of TOML into a Go value.\nfunc (d *Decoder) Decode(v interface{}) error {\n\tb, err := ioutil.ReadAll(d.r)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn d.cfg.Unmarshal(b, v)\n}\n\n// UnmarshalerRec may be implemented by types to customize their behavior when being\n// unmarshaled from TOML. You can use it to implement custom validation or to set\n// unexported fields.\n//\n// UnmarshalTOML receives a function that can be called to unmarshal the original TOML\n// value into a field or variable. It is safe to call the function more than once if\n// necessary.\ntype UnmarshalerRec interface {\n\tUnmarshalTOML(fn func(interface{}) error) error\n}\n\n// Unmarshaler can be used to capture and process raw TOML source of a table or value.\n// UnmarshalTOML must copy the input if it wishes to retain it after returning.\n//\n// Note: this interface is retained for backwards compatibility. You probably want\n// to implement encoding.TextUnmarshaler or UnmarshalerRec instead.\ntype Unmarshaler interface {\n\tUnmarshalTOML(input []byte) error\n}\n\n// UnmarshalTable applies the contents of an ast.Table to the value pointed at by v.\n//\n// UnmarshalTable will mapped to v that according to following rules:\n//\n//\tTOML strings to string\n//\tTOML integers to any int type\n//\tTOML floats to float32 or float64\n//\tTOML booleans to bool\n//\tTOML datetimes to time.Time\n//\tTOML arrays to any type of slice\n//\tTOML tables to struct or map\n//\tTOML array tables to slice of struct or map\nfunc (cfg *Config) UnmarshalTable(t *ast.Table, v interface{}) error {\n\trv := reflect.ValueOf(v)\n\ttoplevelMap := rv.Kind() == reflect.Map\n\tif (!toplevelMap && rv.Kind() != reflect.Ptr) || rv.IsNil() {\n\t\treturn &invalidUnmarshalError{reflect.TypeOf(v)}\n\t}\n\treturn unmarshalTable(cfg, rv, t, toplevelMap)\n}\n\n// used for UnmarshalerRec.\nfunc unmarshalTableOrValue(cfg *Config, rv reflect.Value, av interface{}) error {\n\tif (rv.Kind() != reflect.Ptr && rv.Kind() != reflect.Map) || rv.IsNil() {\n\t\treturn &invalidUnmarshalError{rv.Type()}\n\t}\n\trv = indirect(rv)\n\n\tswitch av.(type) {\n\tcase *ast.KeyValue, *ast.Table, []*ast.Table:\n\t\tif err := unmarshalField(cfg, rv, av); err != nil {\n\t\t\treturn lineError(fieldLineNumber(av), err)\n\t\t}\n\t\treturn nil\n\tcase ast.Value:\n\t\treturn setValue(cfg, rv, av.(ast.Value))\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"BUG: unhandled AST node type %T\", av))\n\t}\n}\n\n// unmarshalTable unmarshals the fields of a table into a struct or map.\n//\n// toplevelMap is true when rv is an (unadressable) map given to UnmarshalTable. In this\n// (special) case, the map is used as-is instead of creating a new map.\nfunc unmarshalTable(cfg *Config, rv reflect.Value, t *ast.Table, toplevelMap bool) error {\n\trv = indirect(rv)\n\tif err, ok := setUnmarshaler(cfg, rv, t); ok {\n\t\treturn lineError(t.Line, err)\n\t}\n\tswitch {\n\tcase rv.Kind() == reflect.Struct:\n\t\tfc := makeFieldCache(cfg, rv.Type())\n\t\tfor key, fieldAst := range t.Fields {\n\t\t\tfv, fieldName, err := fc.findField(cfg, rv, key)\n\t\t\tif err != nil {\n\t\t\t\treturn lineError(fieldLineNumber(fieldAst), err)\n\t\t\t}\n\t\t\tif fv.IsValid() {\n\t\t\t\tif err := unmarshalField(cfg, fv, fieldAst); err != nil {\n\t\t\t\t\treturn lineErrorField(fieldLineNumber(fieldAst), rv.Type().String()+\".\"+fieldName, err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase rv.Kind() == reflect.Map || isEface(rv):\n\t\tm := rv\n\t\tif !toplevelMap {\n\t\t\tif rv.Kind() == reflect.Interface {\n\t\t\t\tm = reflect.ValueOf(make(map[string]interface{}))\n\t\t\t} else {\n\t\t\t\tm = reflect.MakeMap(rv.Type())\n\t\t\t}\n\t\t}\n\t\telemtyp := m.Type().Elem()\n\t\tfor key, fieldAst := range t.Fields {\n\t\t\tkv, err := unmarshalMapKey(m.Type().Key(), key)\n\t\t\tif err != nil {\n\t\t\t\treturn lineError(fieldLineNumber(fieldAst), err)\n\t\t\t}\n\t\t\tfv := reflect.New(elemtyp).Elem()\n\t\t\tif err := unmarshalField(cfg, fv, fieldAst); err != nil {\n\t\t\t\treturn lineError(fieldLineNumber(fieldAst), err)\n\t\t\t}\n\t\t\tm.SetMapIndex(kv, fv)\n\t\t}\n\t\tif !toplevelMap {\n\t\t\trv.Set(m)\n\t\t}\n\tdefault:\n\t\treturn lineError(t.Line, &unmarshalTypeError{\"table\", \"struct or map\", rv.Type()})\n\t}\n\treturn nil\n}\n\nfunc fieldLineNumber(fieldAst interface{}) int {\n\tswitch av := fieldAst.(type) {\n\tcase *ast.KeyValue:\n\t\treturn av.Line\n\tcase *ast.Table:\n\t\treturn av.Line\n\tcase []*ast.Table:\n\t\treturn av[0].Line\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"BUG: unhandled node type %T\", fieldAst))\n\t}\n}\n\nfunc unmarshalField(cfg *Config, rv reflect.Value, fieldAst interface{}) error {\n\tswitch av := fieldAst.(type) {\n\tcase *ast.KeyValue:\n\t\treturn setValue(cfg, rv, av.Value)\n\tcase *ast.Table:\n\t\treturn unmarshalTable(cfg, rv, av, false)\n\tcase []*ast.Table:\n\t\trv = indirect(rv)\n\t\tif err, ok := setUnmarshaler(cfg, rv, fieldAst); ok {\n\t\t\treturn err\n\t\t}\n\t\tvar slice reflect.Value\n\t\tswitch {\n\t\tcase rv.Kind() == reflect.Slice:\n\t\t\tslice = reflect.MakeSlice(rv.Type(), len(av), len(av))\n\t\tcase isEface(rv):\n\t\t\tslice = reflect.ValueOf(make([]interface{}, len(av)))\n\t\tdefault:\n\t\t\treturn &unmarshalTypeError{\"array table\", \"slice\", rv.Type()}\n\t\t}\n\t\tfor i, tbl := range av {\n\t\t\tvv := reflect.New(slice.Type().Elem()).Elem()\n\t\t\tif err := unmarshalTable(cfg, vv, tbl, false); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tslice.Index(i).Set(vv)\n\t\t}\n\t\trv.Set(slice)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"BUG: unhandled AST node type %T\", av))\n\t}\n\treturn nil\n}\n\nfunc unmarshalMapKey(typ reflect.Type, key string) (reflect.Value, error) {\n\trv := reflect.New(typ).Elem()\n\tif u, ok := rv.Addr().Interface().(encoding.TextUnmarshaler); ok {\n\t\treturn rv, u.UnmarshalText([]byte(key))\n\t}\n\tswitch typ.Kind() {\n\tcase reflect.String:\n\t\trv.SetString(key)\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\ti, err := strconv.ParseInt(key, 10, int(typ.Size()*8))\n\t\tif err != nil {\n\t\t\treturn rv, convertNumError(typ.Kind(), err)\n\t\t}\n\t\trv.SetInt(i)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\ti, err := strconv.ParseUint(key, 10, int(typ.Size()*8))\n\t\tif err != nil {\n\t\t\treturn rv, convertNumError(typ.Kind(), err)\n\t\t}\n\t\trv.SetUint(i)\n\tdefault:\n\t\treturn rv, fmt.Errorf(\"invalid map key type %s\", typ)\n\t}\n\treturn rv, nil\n}\n\nfunc setValue(cfg *Config, lhs reflect.Value, val ast.Value) error {\n\tlhs = indirect(lhs)\n\tif err, ok := setUnmarshaler(cfg, lhs, val); ok {\n\t\treturn err\n\t}\n\tif err, ok := setTextUnmarshaler(lhs, val); ok {\n\t\treturn err\n\t}\n\tswitch v := val.(type) {\n\tcase *ast.Integer:\n\t\treturn setInt(lhs, v)\n\tcase *ast.Float:\n\t\treturn setFloat(lhs, v)\n\tcase *ast.String:\n\t\treturn setString(lhs, v)\n\tcase *ast.Boolean:\n\t\treturn setBoolean(lhs, v)\n\tcase *ast.Datetime:\n\t\treturn setDatetime(lhs, v)\n\tcase *ast.Array:\n\t\treturn setArray(cfg, lhs, v)\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"BUG: unhandled node type %T\", v))\n\t}\n}\n\nfunc indirect(rv reflect.Value) reflect.Value {\n\tfor rv.Kind() == reflect.Ptr {\n\t\tif rv.IsNil() {\n\t\t\trv.Set(reflect.New(rv.Type().Elem()))\n\t\t}\n\t\trv = rv.Elem()\n\t}\n\treturn rv\n}\n\nfunc setUnmarshaler(cfg *Config, lhs reflect.Value, av interface{}) (error, bool) {\n\tif lhs.CanAddr() {\n\t\tif u, ok := lhs.Addr().Interface().(UnmarshalerRec); ok {\n\t\t\terr := u.UnmarshalTOML(func(v interface{}) error {\n\t\t\t\treturn unmarshalTableOrValue(cfg, reflect.ValueOf(v), av)\n\t\t\t})\n\t\t\treturn err, true\n\t\t}\n\t\tif u, ok := lhs.Addr().Interface().(Unmarshaler); ok {\n\t\t\treturn u.UnmarshalTOML(unmarshalerSource(av)), true\n\t\t}\n\t}\n\treturn nil, false\n}\n\nfunc unmarshalerSource(av interface{}) []byte {\n\tvar source []byte\n\tswitch av := av.(type) {\n\tcase []*ast.Table:\n\t\tfor i, tab := range av {\n\t\t\tsource = append(source, tab.Source()...)\n\t\t\tif i != len(av)-1 {\n\t\t\t\tsource = append(source, '\\n')\n\t\t\t}\n\t\t}\n\tcase ast.Value:\n\t\tsource = []byte(av.Source())\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"BUG: unhandled node type %T\", av))\n\t}\n\treturn source\n}\n\nfunc setTextUnmarshaler(lhs reflect.Value, val ast.Value) (error, bool) {\n\tif !lhs.CanAddr() {\n\t\treturn nil, false\n\t}\n\tu, ok := lhs.Addr().Interface().(encoding.TextUnmarshaler)\n\tif !ok || lhs.Type() == timeType {\n\t\treturn nil, false\n\t}\n\tvar data string\n\tswitch val := val.(type) {\n\tcase *ast.Array:\n\t\treturn &unmarshalTypeError{\"array\", \"\", lhs.Type()}, true\n\tcase *ast.String:\n\t\tdata = val.Value\n\tdefault:\n\t\tdata = val.Source()\n\t}\n\treturn u.UnmarshalText([]byte(data)), true\n}\n\nfunc setInt(fv reflect.Value, v *ast.Integer) error {\n\tk := fv.Kind()\n\tswitch {\n\tcase k >= reflect.Int && k <= reflect.Int64:\n\t\ti, err := strconv.ParseInt(v.Value, 10, int(fv.Type().Size()*8))\n\t\tif err != nil {\n\t\t\treturn convertNumError(fv.Kind(), err)\n\t\t}\n\t\tfv.SetInt(i)\n\tcase k >= reflect.Uint && k <= reflect.Uintptr:\n\t\ti, err := strconv.ParseUint(v.Value, 10, int(fv.Type().Size()*8))\n\t\tif err != nil {\n\t\t\treturn convertNumError(fv.Kind(), err)\n\t\t}\n\t\tfv.SetUint(i)\n\tcase isEface(fv):\n\t\ti, err := strconv.ParseInt(v.Value, 10, 64)\n\t\tif err != nil {\n\t\t\treturn convertNumError(reflect.Int64, err)\n\t\t}\n\t\tfv.Set(reflect.ValueOf(i))\n\tdefault:\n\t\treturn &unmarshalTypeError{\"integer\", \"\", fv.Type()}\n\t}\n\treturn nil\n}\n\nfunc setFloat(fv reflect.Value, v *ast.Float) error {\n\tf, err := v.Float()\n\tif err != nil {\n\t\treturn err\n\t}\n\tswitch {\n\tcase fv.Kind() == reflect.Float32 || fv.Kind() == reflect.Float64:\n\t\tif fv.OverflowFloat(f) {\n\t\t\treturn &overflowError{fv.Kind(), v.Value}\n\t\t}\n\t\tfv.SetFloat(f)\n\tcase isEface(fv):\n\t\tfv.Set(reflect.ValueOf(f))\n\tdefault:\n\t\treturn &unmarshalTypeError{\"float\", \"\", fv.Type()}\n\t}\n\treturn nil\n}\n\nfunc setString(fv reflect.Value, v *ast.String) error {\n\tswitch {\n\tcase fv.Kind() == reflect.String:\n\t\tfv.SetString(v.Value)\n\tcase isEface(fv):\n\t\tfv.Set(reflect.ValueOf(v.Value))\n\tdefault:\n\t\treturn &unmarshalTypeError{\"string\", \"\", fv.Type()}\n\t}\n\treturn nil\n}\n\nfunc setBoolean(fv reflect.Value, v *ast.Boolean) error {\n\tb, _ := v.Boolean()\n\tswitch {\n\tcase fv.Kind() == reflect.Bool:\n\t\tfv.SetBool(b)\n\tcase isEface(fv):\n\t\tfv.Set(reflect.ValueOf(b))\n\tdefault:\n\t\treturn &unmarshalTypeError{\"boolean\", \"\", fv.Type()}\n\t}\n\treturn nil\n}\n\nfunc setDatetime(rv reflect.Value, v *ast.Datetime) error {\n\tt, err := v.Time()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif !timeType.AssignableTo(rv.Type()) {\n\t\treturn &unmarshalTypeError{\"datetime\", \"\", rv.Type()}\n\t}\n\trv.Set(reflect.ValueOf(t))\n\treturn nil\n}\n\nfunc setArray(cfg *Config, rv reflect.Value, v *ast.Array) error {\n\tvar slicetyp reflect.Type\n\tswitch {\n\tcase rv.Kind() == reflect.Slice:\n\t\tslicetyp = rv.Type()\n\tcase isEface(rv):\n\t\tslicetyp = reflect.SliceOf(rv.Type())\n\tdefault:\n\t\treturn &unmarshalTypeError{\"array\", \"slice\", rv.Type()}\n\t}\n\n\tif len(v.Value) == 0 {\n\t\t// Ensure defined slices are always set to a non-nil value.\n\t\trv.Set(reflect.MakeSlice(slicetyp, 0, 0))\n\t\treturn nil\n\t}\n\n\ttomltyp := reflect.TypeOf(v.Value[0])\n\tslice := reflect.MakeSlice(slicetyp, len(v.Value), len(v.Value))\n\ttyp := slicetyp.Elem()\n\tfor i, vv := range v.Value {\n\t\tif i > 0 && tomltyp != reflect.TypeOf(vv) {\n\t\t\treturn errArrayMultiType\n\t\t}\n\t\ttmp := reflect.New(typ).Elem()\n\t\tif err := setValue(cfg, tmp, vv); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tslice.Index(i).Set(tmp)\n\t}\n\trv.Set(slice)\n\treturn nil\n}\n\nfunc isEface(rv reflect.Value) bool {\n\treturn rv.Kind() == reflect.Interface && rv.Type().NumMethod() == 0\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/encode.go",
    "content": "package toml\n\nimport (\n\t\"bytes\"\n\t\"encoding\"\n\t\"fmt\"\n\t\"io\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/naoina/toml/ast\"\n)\n\nconst (\n\ttagOmitempty = \"omitempty\"\n\ttagSkip      = \"-\"\n)\n\n// Marshal returns the TOML encoding of v.\n//\n// Struct values encode as TOML. Each exported struct field becomes a field of\n// the TOML structure unless\n//   - the field's tag is \"-\", or\n//   - the field is empty and its tag specifies the \"omitempty\" option.\n//\n// The \"toml\" key in the struct field's tag value is the key name, followed by\n// an optional comma and options. Examples:\n//\n//   // Field is ignored by this package.\n//   Field int `toml:\"-\"`\n//\n//   // Field appears in TOML as key \"myName\".\n//   Field int `toml:\"myName\"`\n//\n//   // Field appears in TOML as key \"myName\" and the field is omitted from the\n//   // result of encoding if its value is empty.\n//   Field int `toml:\"myName,omitempty\"`\n//\n//   // Field appears in TOML as key \"field\", but the field is skipped if\n//   // empty. Note the leading comma.\n//   Field int `toml:\",omitempty\"`\nfunc (cfg *Config) Marshal(v interface{}) ([]byte, error) {\n\tbuf := new(bytes.Buffer)\n\terr := cfg.NewEncoder(buf).Encode(v)\n\treturn buf.Bytes(), err\n}\n\n// A Encoder writes TOML to an output stream.\ntype Encoder struct {\n\tw   io.Writer\n\tcfg *Config\n}\n\n// NewEncoder returns a new Encoder that writes to w.\nfunc (cfg *Config) NewEncoder(w io.Writer) *Encoder {\n\treturn &Encoder{w, cfg}\n}\n\n// Encode writes the TOML of v to the stream.\n// See the documentation for Marshal for details about the conversion of Go values to TOML.\nfunc (e *Encoder) Encode(v interface{}) error {\n\tvar (\n\t\tbuf = &tableBuf{typ: ast.TableTypeNormal}\n\t\trv  = reflect.ValueOf(v)\n\t\terr error\n\t)\n\n\tfor rv.Kind() == reflect.Ptr {\n\t\tif rv.IsNil() {\n\t\t\treturn &marshalNilError{rv.Type()}\n\t\t}\n\t\trv = rv.Elem()\n\t}\n\n\tswitch rv.Kind() {\n\tcase reflect.Struct:\n\t\terr = buf.structFields(e.cfg, rv)\n\tcase reflect.Map:\n\t\terr = buf.mapFields(e.cfg, rv)\n\tcase reflect.Interface:\n\t\treturn e.Encode(rv.Interface())\n\tdefault:\n\t\terr = &marshalTableError{rv.Type()}\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn buf.writeTo(e.w, \"\")\n}\n\n// Marshaler can be implemented to override the encoding of TOML values. The returned text\n// must be a simple TOML value (i.e. not a table) and is inserted into marshaler output.\n//\n// This interface exists for backwards-compatibility reasons. You probably want to\n// implement encoding.TextMarshaler or MarshalerRec instead.\ntype Marshaler interface {\n\tMarshalTOML() ([]byte, error)\n}\n\n// MarshalerRec can be implemented to override the TOML encoding of a type.\n// The returned value is marshaled in place of the receiver.\ntype MarshalerRec interface {\n\tMarshalTOML() (interface{}, error)\n}\n\ntype tableBuf struct {\n\tname       string // already escaped / quoted\n\tbody       []byte\n\tchildren   []*tableBuf\n\ttyp        ast.TableType\n\tarrayDepth int\n}\n\nfunc (b *tableBuf) writeTo(w io.Writer, prefix string) error {\n\tkey := b.name // TODO: escape dots\n\tif prefix != \"\" {\n\t\tkey = prefix + \".\" + key\n\t}\n\n\tif b.name != \"\" {\n\t\thead := \"[\" + key + \"]\"\n\t\tif b.typ == ast.TableTypeArray {\n\t\t\thead = \"[\" + head + \"]\"\n\t\t}\n\t\thead += \"\\n\"\n\t\tif _, err := io.WriteString(w, head); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif _, err := w.Write(b.body); err != nil {\n\t\treturn err\n\t}\n\n\tfor i, child := range b.children {\n\t\tif len(b.body) > 0 || i > 0 {\n\t\t\tif _, err := w.Write([]byte(\"\\n\")); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := child.writeTo(w, key); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (b *tableBuf) newChild(name string) *tableBuf {\n\tchild := &tableBuf{name: quoteName(name), typ: ast.TableTypeNormal}\n\tif b.arrayDepth > 0 {\n\t\tchild.typ = ast.TableTypeArray\n\t}\n\treturn child\n}\n\nfunc (b *tableBuf) addChild(child *tableBuf) {\n\t// Empty table elision: we can avoid writing a table that doesn't have any keys on its\n\t// own. Array tables can't be elided because they define array elements (which would\n\t// be missing if elided).\n\tif len(child.body) == 0 && child.typ == ast.TableTypeNormal {\n\t\tfor _, gchild := range child.children {\n\t\t\tgchild.name = child.name + \".\" + gchild.name\n\t\t\tb.addChild(gchild)\n\t\t}\n\t\treturn\n\t}\n\tb.children = append(b.children, child)\n}\n\nfunc (b *tableBuf) structFields(cfg *Config, rv reflect.Value) error {\n\trt := rv.Type()\n\tfor i := 0; i < rv.NumField(); i++ {\n\t\tft := rt.Field(i)\n\t\tif ft.PkgPath != \"\" && !ft.Anonymous { // not exported\n\t\t\tcontinue\n\t\t}\n\t\tname, rest := extractTag(ft.Tag.Get(fieldTagName))\n\t\tif name == tagSkip {\n\t\t\tcontinue\n\t\t}\n\t\tfv := rv.Field(i)\n\t\tif rest == tagOmitempty && isEmptyValue(fv) {\n\t\t\tcontinue\n\t\t}\n\t\tif name == \"\" {\n\t\t\tname = cfg.FieldToKey(rt, ft.Name)\n\t\t}\n\t\tif err := b.field(cfg, name, fv); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\ntype mapKeyList []struct {\n\tkey   string\n\tvalue reflect.Value\n}\n\nfunc (l mapKeyList) Len() int           { return len(l) }\nfunc (l mapKeyList) Swap(i, j int)      { l[i], l[j] = l[j], l[i] }\nfunc (l mapKeyList) Less(i, j int) bool { return l[i].key < l[j].key }\n\nfunc (b *tableBuf) mapFields(cfg *Config, rv reflect.Value) error {\n\tkeys := rv.MapKeys()\n\tkeylist := make(mapKeyList, len(keys))\n\tfor i, key := range keys {\n\t\tvar err error\n\t\tkeylist[i].key, err = encodeMapKey(key)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tkeylist[i].value = rv.MapIndex(key)\n\t}\n\tsort.Sort(keylist)\n\n\tfor _, kv := range keylist {\n\t\tif err := b.field(cfg, kv.key, kv.value); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (b *tableBuf) field(cfg *Config, name string, rv reflect.Value) error {\n\toff := len(b.body)\n\tb.body = append(b.body, quoteName(name)...)\n\tb.body = append(b.body, \" = \"...)\n\tisTable, err := b.value(cfg, rv, name)\n\tif isTable {\n\t\tb.body = b.body[:off] // rub out \"key =\"\n\t} else {\n\t\tb.body = append(b.body, '\\n')\n\t}\n\treturn err\n}\n\nfunc (b *tableBuf) value(cfg *Config, rv reflect.Value, name string) (bool, error) {\n\tisMarshaler, isTable, err := b.marshaler(cfg, rv, name)\n\tif isMarshaler {\n\t\treturn isTable, err\n\t}\n\tswitch rv.Kind() {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\tb.body = strconv.AppendInt(b.body, rv.Int(), 10)\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tb.body = strconv.AppendUint(b.body, rv.Uint(), 10)\n\tcase reflect.Float32, reflect.Float64:\n\t\tb.body = strconv.AppendFloat(b.body, rv.Float(), 'e', -1, 64)\n\tcase reflect.Bool:\n\t\tb.body = strconv.AppendBool(b.body, rv.Bool())\n\tcase reflect.String:\n\t\tb.body = strconv.AppendQuote(b.body, rv.String())\n\tcase reflect.Ptr, reflect.Interface:\n\t\tif rv.IsNil() {\n\t\t\treturn false, &marshalNilError{rv.Type()}\n\t\t}\n\t\treturn b.value(cfg, rv.Elem(), name)\n\tcase reflect.Slice, reflect.Array:\n\t\trvlen := rv.Len()\n\t\tif rvlen == 0 {\n\t\t\tb.body = append(b.body, '[', ']')\n\t\t\treturn false, nil\n\t\t}\n\n\t\tb.arrayDepth++\n\t\twroteElem := false\n\t\tb.body = append(b.body, '[')\n\t\tfor i := 0; i < rvlen; i++ {\n\t\t\tisTable, err := b.value(cfg, rv.Index(i), name)\n\t\t\tif err != nil {\n\t\t\t\treturn isTable, err\n\t\t\t}\n\t\t\twroteElem = wroteElem || !isTable\n\t\t\tif wroteElem {\n\t\t\t\tif i < rvlen-1 {\n\t\t\t\t\tb.body = append(b.body, ',', ' ')\n\t\t\t\t} else {\n\t\t\t\t\tb.body = append(b.body, ']')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif !wroteElem {\n\t\t\tb.body = b.body[:len(b.body)-1] // rub out '['\n\t\t}\n\t\tb.arrayDepth--\n\t\treturn !wroteElem, nil\n\tcase reflect.Struct:\n\t\tchild := b.newChild(name)\n\t\terr := child.structFields(cfg, rv)\n\t\tb.addChild(child)\n\t\treturn true, err\n\tcase reflect.Map:\n\t\tchild := b.newChild(name)\n\t\terr := child.mapFields(cfg, rv)\n\t\tb.addChild(child)\n\t\treturn true, err\n\tdefault:\n\t\treturn false, fmt.Errorf(\"toml: marshal: unsupported type %v\", rv.Kind())\n\t}\n\treturn false, nil\n}\n\nfunc (b *tableBuf) marshaler(cfg *Config, rv reflect.Value, name string) (handled, isTable bool, err error) {\n\tswitch t := rv.Interface().(type) {\n\tcase encoding.TextMarshaler:\n\t\tenc, err := t.MarshalText()\n\t\tif err != nil {\n\t\t\treturn true, false, err\n\t\t}\n\t\tb.body = encodeTextMarshaler(b.body, string(enc))\n\t\treturn true, false, nil\n\tcase MarshalerRec:\n\t\tnewval, err := t.MarshalTOML()\n\t\tif err != nil {\n\t\t\treturn true, false, err\n\t\t}\n\t\tisTable, err = b.value(cfg, reflect.ValueOf(newval), name)\n\t\treturn true, isTable, err\n\tcase Marshaler:\n\t\tenc, err := t.MarshalTOML()\n\t\tif err != nil {\n\t\t\treturn true, false, err\n\t\t}\n\t\tb.body = append(b.body, enc...)\n\t\treturn true, false, nil\n\t}\n\treturn false, false, nil\n}\n\nfunc encodeTextMarshaler(buf []byte, v string) []byte {\n\t// Emit the value without quotes if possible.\n\tif v == \"true\" || v == \"false\" {\n\t\treturn append(buf, v...)\n\t} else if _, err := time.Parse(time.RFC3339Nano, v); err == nil {\n\t\treturn append(buf, v...)\n\t} else if _, err := strconv.ParseInt(v, 10, 64); err == nil {\n\t\treturn append(buf, v...)\n\t} else if _, err := strconv.ParseUint(v, 10, 64); err == nil {\n\t\treturn append(buf, v...)\n\t} else if _, err := strconv.ParseFloat(v, 64); err == nil {\n\t\treturn append(buf, v...)\n\t}\n\treturn strconv.AppendQuote(buf, v)\n}\n\nfunc encodeMapKey(rv reflect.Value) (string, error) {\n\tif rv.Kind() == reflect.String {\n\t\treturn rv.String(), nil\n\t}\n\tif tm, ok := rv.Interface().(encoding.TextMarshaler); ok {\n\t\tb, err := tm.MarshalText()\n\t\treturn string(b), err\n\t}\n\tswitch rv.Kind() {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn strconv.FormatInt(rv.Int(), 10), nil\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn strconv.FormatUint(rv.Uint(), 10), nil\n\t}\n\treturn \"\", fmt.Errorf(\"toml: invalid map key type %v\", rv.Type())\n}\n\nfunc isEmptyValue(v reflect.Value) bool {\n\tswitch v.Kind() {\n\tcase reflect.Array:\n\t\t// encoding/json treats all arrays with non-zero length as non-empty. We check the\n\t\t// array content here because zero-length arrays are almost never used.\n\t\tlen := v.Len()\n\t\tfor i := 0; i < len; i++ {\n\t\t\tif !isEmptyValue(v.Index(i)) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\tcase reflect.Map, reflect.Slice, reflect.String:\n\t\treturn v.Len() == 0\n\tcase reflect.Bool:\n\t\treturn !v.Bool()\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\treturn v.Int() == 0\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:\n\t\treturn v.Uint() == 0\n\tcase reflect.Float32, reflect.Float64:\n\t\treturn v.Float() == 0\n\tcase reflect.Interface, reflect.Ptr:\n\t\treturn v.IsNil()\n\t}\n\treturn false\n}\n\nfunc quoteName(s string) string {\n\tif len(s) == 0 {\n\t\treturn strconv.Quote(s)\n\t}\n\tfor _, r := range s {\n\t\tif r >= '0' && r <= '9' || r >= 'A' && r <= 'Z' || r >= 'a' && r <= 'z' || r == '-' || r == '_' {\n\t\t\tcontinue\n\t\t}\n\t\treturn strconv.Quote(s)\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/error.go",
    "content": "package toml\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"strconv\"\n)\n\nvar (\n\terrArrayMultiType = errors.New(\"array can't contain multiple types\")\n)\n\n// LineError is returned by Unmarshal, UnmarshalTable and Parse\n// if the error is local to a line.\ntype LineError struct {\n\tLine        int\n\tStructField string\n\tErr         error\n}\n\nfunc (err *LineError) Error() string {\n\tfield := \"\"\n\tif err.StructField != \"\" {\n\t\tfield = \"(\" + err.StructField + \") \"\n\t}\n\treturn fmt.Sprintf(\"line %d: %s%v\", err.Line, field, err.Err)\n}\n\nfunc lineError(line int, err error) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\tif _, ok := err.(*LineError); ok {\n\t\treturn err\n\t}\n\treturn &LineError{Line: line, Err: err}\n}\n\nfunc lineErrorField(line int, field string, err error) error {\n\tif lerr, ok := err.(*LineError); ok {\n\t\treturn lerr\n\t} else if err != nil {\n\t\terr = &LineError{Line: line, StructField: field, Err: err}\n\t}\n\treturn err\n}\n\ntype overflowError struct {\n\tkind reflect.Kind\n\tv    string\n}\n\nfunc (err *overflowError) Error() string {\n\treturn fmt.Sprintf(\"value %s is out of range for %v\", err.v, err.kind)\n}\n\nfunc convertNumError(kind reflect.Kind, err error) error {\n\tif numerr, ok := err.(*strconv.NumError); ok && numerr.Err == strconv.ErrRange {\n\t\treturn &overflowError{kind, numerr.Num}\n\t}\n\treturn err\n}\n\ntype invalidUnmarshalError struct {\n\ttyp reflect.Type\n}\n\nfunc (err *invalidUnmarshalError) Error() string {\n\tif err.typ == nil {\n\t\treturn \"toml: Unmarshal(nil)\"\n\t}\n\tif err.typ.Kind() != reflect.Ptr {\n\t\treturn \"toml: Unmarshal(non-pointer \" + err.typ.String() + \")\"\n\t}\n\treturn \"toml: Unmarshal(nil \" + err.typ.String() + \")\"\n}\n\ntype unmarshalTypeError struct {\n\twhat string\n\twant string\n\ttyp  reflect.Type\n}\n\nfunc (err *unmarshalTypeError) Error() string {\n\tmsg := fmt.Sprintf(\"cannot unmarshal TOML %s into %s\", err.what, err.typ)\n\tif err.want != \"\" {\n\t\tmsg += \" (need \" + err.want + \")\"\n\t}\n\treturn msg\n}\n\ntype marshalNilError struct {\n\ttyp reflect.Type\n}\n\nfunc (err *marshalNilError) Error() string {\n\treturn fmt.Sprintf(\"toml: cannot marshal nil %s\", err.typ)\n}\n\ntype marshalTableError struct {\n\ttyp reflect.Type\n}\n\nfunc (err *marshalTableError) Error() string {\n\treturn fmt.Sprintf(\"toml: cannot marshal %s as table, want struct or map type\", err.typ)\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/parse.go",
    "content": "package toml\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/naoina/toml/ast\"\n)\n\n// The parser is generated by github.com/pointlander/peg. To regenerate it, do:\n//\n//     go get -u github.com/pointlander/peg\n//     go generate .\n\n//go:generate peg -switch -inline parse.peg\n\nvar errParse = errors.New(\"invalid TOML syntax\")\n\n// Parse returns an AST representation of TOML.\n// The toplevel is represented by a table.\nfunc Parse(data []byte) (*ast.Table, error) {\n\td := &parseState{p: &tomlParser{Buffer: string(data)}}\n\td.init()\n\n\tif err := d.parse(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn d.p.toml.table, nil\n}\n\ntype parseState struct {\n\tp *tomlParser\n}\n\nfunc (d *parseState) init() {\n\td.p.Init()\n\td.p.toml.init(d.p.buffer)\n}\n\nfunc (d *parseState) parse() error {\n\tif err := d.p.Parse(); err != nil {\n\t\tif err, ok := err.(*parseError); ok {\n\t\t\treturn lineError(err.Line(), errParse)\n\t\t}\n\t\treturn err\n\t}\n\treturn d.execute()\n}\n\nfunc (d *parseState) execute() (err error) {\n\tdefer func() {\n\t\tif e := recover(); e != nil {\n\t\t\tlerr, ok := e.(*LineError)\n\t\t\tif !ok {\n\t\t\t\tpanic(e)\n\t\t\t}\n\t\t\terr = lerr\n\t\t}\n\t}()\n\td.p.Execute()\n\treturn nil\n}\n\nfunc (e *parseError) Line() int {\n\ttokens := []token32{e.max}\n\tpositions, p := make([]int, 2*len(tokens)), 0\n\tfor _, token := range tokens {\n\t\tpositions[p], p = int(token.begin), p+1\n\t\tpositions[p], p = int(token.end), p+1\n\t}\n\tfor _, t := range translatePositions(e.p.buffer, positions) {\n\t\tif e.p.line < t.line {\n\t\t\te.p.line = t.line\n\t\t}\n\t}\n\treturn e.p.line\n}\n\ntype stack struct {\n\tkey   string\n\ttable *ast.Table\n}\n\ntype array struct {\n\tparent  *array\n\tchild   *array\n\tcurrent *ast.Array\n\tline    int\n}\n\ntype toml struct {\n\ttable        *ast.Table\n\tline         int\n\tcurrentTable *ast.Table\n\ts            string\n\tkey          string\n\ttableKeys    []string\n\tval          ast.Value\n\tarr          *array\n\tstack        []*stack\n\tskip         bool\n}\n\nfunc (p *toml) init(data []rune) {\n\tp.line = 1\n\tp.table = p.newTable(ast.TableTypeNormal, \"\")\n\tp.table.Position.End = len(data) - 1\n\tp.table.Data = data[:len(data)-1] // truncate the end_symbol added by PEG parse generator.\n\tp.currentTable = p.table\n}\n\nfunc (p *toml) Error(err error) {\n\tpanic(lineError(p.line, err))\n}\n\nfunc (p *tomlParser) SetTime(begin, end int) {\n\tp.val = &ast.Datetime{\n\t\tPosition: ast.Position{Begin: begin, End: end},\n\t\tData:     p.buffer[begin:end],\n\t\tValue:    string(p.buffer[begin:end]),\n\t}\n}\n\nfunc (p *tomlParser) SetFloat64(begin, end int) {\n\tp.val = &ast.Float{\n\t\tPosition: ast.Position{Begin: begin, End: end},\n\t\tData:     p.buffer[begin:end],\n\t\tValue:    underscoreReplacer.Replace(string(p.buffer[begin:end])),\n\t}\n}\n\nfunc (p *tomlParser) SetInt64(begin, end int) {\n\tp.val = &ast.Integer{\n\t\tPosition: ast.Position{Begin: begin, End: end},\n\t\tData:     p.buffer[begin:end],\n\t\tValue:    underscoreReplacer.Replace(string(p.buffer[begin:end])),\n\t}\n}\n\nfunc (p *tomlParser) SetString(begin, end int) {\n\tp.val = &ast.String{\n\t\tPosition: ast.Position{Begin: begin, End: end},\n\t\tData:     p.buffer[begin:end],\n\t\tValue:    p.s,\n\t}\n\tp.s = \"\"\n}\n\nfunc (p *tomlParser) SetBool(begin, end int) {\n\tp.val = &ast.Boolean{\n\t\tPosition: ast.Position{Begin: begin, End: end},\n\t\tData:     p.buffer[begin:end],\n\t\tValue:    string(p.buffer[begin:end]),\n\t}\n}\n\nfunc (p *tomlParser) StartArray() {\n\tif p.arr == nil {\n\t\tp.arr = &array{line: p.line, current: &ast.Array{}}\n\t\treturn\n\t}\n\tp.arr.child = &array{parent: p.arr, line: p.line, current: &ast.Array{}}\n\tp.arr = p.arr.child\n}\n\nfunc (p *tomlParser) AddArrayVal() {\n\tif p.arr.current == nil {\n\t\tp.arr.current = &ast.Array{}\n\t}\n\tp.arr.current.Value = append(p.arr.current.Value, p.val)\n}\n\nfunc (p *tomlParser) SetArray(begin, end int) {\n\tp.arr.current.Position = ast.Position{Begin: begin, End: end}\n\tp.arr.current.Data = p.buffer[begin:end]\n\tp.val = p.arr.current\n\tp.arr = p.arr.parent\n}\n\nfunc (p *toml) SetTable(buf []rune, begin, end int) {\n\trawName := string(buf[begin:end])\n\tp.setTable(p.table, rawName, p.tableKeys)\n\tp.tableKeys = nil\n}\n\nfunc (p *toml) setTable(parent *ast.Table, name string, names []string) {\n\tparent, err := p.lookupTable(parent, names[:len(names)-1])\n\tif err != nil {\n\t\tp.Error(err)\n\t}\n\tlast := names[len(names)-1]\n\ttbl := p.newTable(ast.TableTypeNormal, last)\n\tswitch v := parent.Fields[last].(type) {\n\tcase nil:\n\t\tparent.Fields[last] = tbl\n\tcase []*ast.Table:\n\t\tp.Error(fmt.Errorf(\"table `%s' is in conflict with array table in line %d\", name, v[0].Line))\n\tcase *ast.Table:\n\t\tif (v.Position == ast.Position{}) {\n\t\t\t// This table was created as an implicit parent.\n\t\t\t// Replace it with the real defined table.\n\t\t\ttbl.Fields = v.Fields\n\t\t\tparent.Fields[last] = tbl\n\t\t} else {\n\t\t\tp.Error(fmt.Errorf(\"table `%s' is in conflict with table in line %d\", name, v.Line))\n\t\t}\n\tcase *ast.KeyValue:\n\t\tp.Error(fmt.Errorf(\"table `%s' is in conflict with line %d\", name, v.Line))\n\tdefault:\n\t\tp.Error(fmt.Errorf(\"BUG: table `%s' is in conflict but it's unknown type `%T'\", last, v))\n\t}\n\tp.currentTable = tbl\n}\n\nfunc (p *toml) newTable(typ ast.TableType, name string) *ast.Table {\n\treturn &ast.Table{\n\t\tLine:   p.line,\n\t\tName:   name,\n\t\tType:   typ,\n\t\tFields: make(map[string]interface{}),\n\t}\n}\n\nfunc (p *tomlParser) SetTableString(begin, end int) {\n\tp.currentTable.Data = p.buffer[begin:end]\n\tp.currentTable.Position.Begin = begin\n\tp.currentTable.Position.End = end\n}\n\nfunc (p *toml) SetArrayTable(buf []rune, begin, end int) {\n\trawName := string(buf[begin:end])\n\tp.setArrayTable(p.table, rawName, p.tableKeys)\n\tp.tableKeys = nil\n}\n\nfunc (p *toml) setArrayTable(parent *ast.Table, name string, names []string) {\n\tparent, err := p.lookupTable(parent, names[:len(names)-1])\n\tif err != nil {\n\t\tp.Error(err)\n\t}\n\tlast := names[len(names)-1]\n\ttbl := p.newTable(ast.TableTypeArray, last)\n\tswitch v := parent.Fields[last].(type) {\n\tcase nil:\n\t\tparent.Fields[last] = []*ast.Table{tbl}\n\tcase []*ast.Table:\n\t\tparent.Fields[last] = append(v, tbl)\n\tcase *ast.Table:\n\t\tp.Error(fmt.Errorf(\"array table `%s' is in conflict with table in line %d\", name, v.Line))\n\tcase *ast.KeyValue:\n\t\tp.Error(fmt.Errorf(\"array table `%s' is in conflict with line %d\", name, v.Line))\n\tdefault:\n\t\tp.Error(fmt.Errorf(\"BUG: array table `%s' is in conflict but it's unknown type `%T'\", name, v))\n\t}\n\tp.currentTable = tbl\n}\n\nfunc (p *toml) StartInlineTable() {\n\tp.skip = false\n\tp.stack = append(p.stack, &stack{p.key, p.currentTable})\n\tnames := []string{p.key}\n\tif p.arr == nil {\n\t\tp.setTable(p.currentTable, names[0], names)\n\t} else {\n\t\tp.setArrayTable(p.currentTable, names[0], names)\n\t}\n}\n\nfunc (p *toml) EndInlineTable() {\n\tst := p.stack[len(p.stack)-1]\n\tp.key, p.currentTable = st.key, st.table\n\tp.stack[len(p.stack)-1] = nil\n\tp.stack = p.stack[:len(p.stack)-1]\n\tp.skip = true\n}\n\nfunc (p *toml) AddLineCount(i int) {\n\tp.line += i\n}\n\nfunc (p *toml) SetKey(buf []rune, begin, end int) {\n\tp.key = string(buf[begin:end])\n\tif len(p.key) > 0 && p.key[0] == '\"' {\n\t\tp.key = p.unquote(p.key)\n\t}\n}\n\nfunc (p *toml) AddTableKey() {\n\tp.tableKeys = append(p.tableKeys, p.key)\n}\n\nfunc (p *toml) AddKeyValue() {\n\tif p.skip {\n\t\tp.skip = false\n\t\treturn\n\t}\n\tif val, exists := p.currentTable.Fields[p.key]; exists {\n\t\tswitch v := val.(type) {\n\t\tcase *ast.Table:\n\t\t\tp.Error(fmt.Errorf(\"key `%s' is in conflict with table in line %d\", p.key, v.Line))\n\t\tcase *ast.KeyValue:\n\t\t\tp.Error(fmt.Errorf(\"key `%s' is in conflict with line %xd\", p.key, v.Line))\n\t\tdefault:\n\t\t\tp.Error(fmt.Errorf(\"BUG: key `%s' is in conflict but it's unknown type `%T'\", p.key, v))\n\t\t}\n\t}\n\tp.currentTable.Fields[p.key] = &ast.KeyValue{Key: p.key, Value: p.val, Line: p.line}\n}\n\nfunc (p *toml) SetBasicString(buf []rune, begin, end int) {\n\tp.s = p.unquote(string(buf[begin:end]))\n}\n\nfunc (p *toml) SetMultilineString() {\n\tp.s = p.unquote(`\"` + escapeReplacer.Replace(strings.TrimLeft(p.s, \"\\r\\n\")) + `\"`)\n}\n\nfunc (p *toml) AddMultilineBasicBody(buf []rune, begin, end int) {\n\tp.s += string(buf[begin:end])\n}\n\nfunc (p *toml) SetLiteralString(buf []rune, begin, end int) {\n\tp.s = string(buf[begin:end])\n}\n\nfunc (p *toml) SetMultilineLiteralString(buf []rune, begin, end int) {\n\tp.s = strings.TrimLeft(string(buf[begin:end]), \"\\r\\n\")\n}\n\nfunc (p *toml) unquote(s string) string {\n\ts, err := strconv.Unquote(s)\n\tif err != nil {\n\t\tp.Error(err)\n\t}\n\treturn s\n}\n\nfunc (p *toml) lookupTable(t *ast.Table, keys []string) (*ast.Table, error) {\n\tfor _, s := range keys {\n\t\tval, exists := t.Fields[s]\n\t\tif !exists {\n\t\t\ttbl := p.newTable(ast.TableTypeNormal, s)\n\t\t\tt.Fields[s] = tbl\n\t\t\tt = tbl\n\t\t\tcontinue\n\t\t}\n\t\tswitch v := val.(type) {\n\t\tcase *ast.Table:\n\t\t\tt = v\n\t\tcase []*ast.Table:\n\t\t\tt = v[len(v)-1]\n\t\tcase *ast.KeyValue:\n\t\t\treturn nil, fmt.Errorf(\"key `%s' is in conflict with line %d\", s, v.Line)\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"BUG: key `%s' is in conflict but it's unknown type `%T'\", s, v)\n\t\t}\n\t}\n\treturn t, nil\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/parse.peg",
    "content": "package toml\n\ntype tomlParser Peg {\n    toml\n}\n\nTOML <- Expression (newline Expression)* newline? !. { _ = buffer }\n\nExpression <- (\n    <ws table ws comment? (wsnl keyval ws comment?)*> { p.SetTableString(begin, end) }\n  / ws keyval ws comment?\n  / ws comment?\n  / ws\n)\n\nnewline <- <[\\r\\n]+> { p.AddLineCount(end - begin) }\n\nws <- [ \\t]*\nwsnl <- (\n    [ \\t]\n  / <[\\r\\n]> { p.AddLineCount(end - begin) }\n)*\n\ncomment <- '#' <[\\t -\\0x10FFFF]*>\n\nkeyval <- key ws '=' ws val { p.AddKeyValue() }\n\nkey <- bareKey / quotedKey\n\nbareKey <- <[0-9A-Za-z\\-_]+> { p.SetKey(p.buffer, begin, end) }\n\nquotedKey <- < '\"' basicChar* '\"' > { p.SetKey(p.buffer, begin, end) }\n\nval <- (\n    <datetime>    { p.SetTime(begin, end) }\n  / <float>       { p.SetFloat64(begin, end) }\n  / <integer>     { p.SetInt64(begin, end) }\n  / <string>      { p.SetString(begin, end) }\n  / <boolean>     { p.SetBool(begin, end) }\n  / <array>       { p.SetArray(begin, end) }\n  / inlineTable\n)\n\ntable <- stdTable / arrayTable\n\nstdTable <- '[' ws <tableKey> ws ']' { p.SetTable(p.buffer, begin, end) }\n\narrayTable <- '[[' ws <tableKey> ws ']]' { p.SetArrayTable(p.buffer, begin, end) }\n\ninlineTable <- (\n    '{' { p.StartInlineTable() }\n    ws inlineTableKeyValues ws\n    '}' { p.EndInlineTable() }\n)\n\ninlineTableKeyValues <- (keyval inlineTableValSep?)*\n\ntableKey <- tableKeyComp (tableKeySep tableKeyComp)*\n\ntableKeyComp <- key { p.AddTableKey() }\n\ntableKeySep <- ws '.' ws\n\ninlineTableValSep <- ws ',' ws\n\ninteger <- [\\-+]? int\nint <- [1-9] (digit / '_' digit)+ / digit\n\nfloat <- integer (frac exp? / frac? exp)\nfrac <- '.' digit (digit / '_' digit)*\nexp <- [eE] [\\-+]? digit (digit / '_' digit)*\n\nstring <- (\n    mlLiteralString\n  / literalString\n  / mlBasicString\n  / basicString\n)\n\nbasicString <- <'\"' basicChar* '\"'> { p.SetBasicString(p.buffer, begin, end) }\n\nbasicChar <- basicUnescaped / escaped\nescaped <- escape ([btnfr\"/\\\\] / 'u' hexQuad / 'U' hexQuad hexQuad)\n\nbasicUnescaped <- [ -!#-\\[\\]-\\0x10FFFF]\n\nescape <- '\\\\'\n\nmlBasicString <- '\"\"\"' mlBasicBody '\"\"\"' { p.SetMultilineString() }\n\nmlBasicBody <- (\n    <basicChar / newline> { p.AddMultilineBasicBody(p.buffer, begin, end) }\n  / escape newline wsnl\n)*\n\nliteralString <- \"'\" <literalChar*> \"'\" { p.SetLiteralString(p.buffer, begin, end) }\n\nliteralChar <- [\\t -&(-\\0x10FFFF]\n\nmlLiteralString <- \"'''\" <mlLiteralBody> \"'''\" { p.SetMultilineLiteralString(p.buffer, begin, end) }\n\nmlLiteralBody <- (!\"'''\" (mlLiteralChar / newline))*\n\nmlLiteralChar <- [\\t -\\0x10FFFF]\n\nhexdigit <- [0-9A-Fa-f]\nhexQuad <- hexdigit hexdigit hexdigit hexdigit\n\nboolean <- 'true' / 'false'\n\ndateFullYear <- digitQuad\ndateMonth <- digitDual\ndateMDay <- digitDual\ntimeHour <- digitDual\ntimeMinute <- digitDual\ntimeSecond <- digitDual\ntimeSecfrac <- '.' digit+\ntimeNumoffset <- [\\-+] timeHour ':' timeMinute\ntimeOffset <- 'Z' / timeNumoffset\npartialTime <- timeHour ':' timeMinute ':' timeSecond timeSecfrac?\nfullDate <- dateFullYear '-' dateMonth '-' dateMDay\nfullTime <- partialTime timeOffset?\ndatetime <- (fullDate ('T' fullTime)?) / partialTime\n\ndigit <- [0-9]\ndigitDual <- digit digit\ndigitQuad <- digitDual digitDual\n\narray <- (\n    '[' { p.StartArray() }\n    wsnl arrayValues? wsnl\n    ']'\n)\n\narrayValues <- (\n    val { p.AddArrayVal() }\n    (\n        wsnl comment?\n        wsnl arraySep\n        wsnl comment?\n        wsnl val { p.AddArrayVal() }\n    )*\n    wsnl arraySep?\n    wsnl comment?\n)\n\narraySep <- ','\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/parse.peg.go",
    "content": "package toml\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"sort\"\n\t\"strconv\"\n)\n\nconst endSymbol rune = 1114112\n\n/* The rule types inferred from the grammar are below. */\ntype pegRule uint8\n\nconst (\n\truleUnknown pegRule = iota\n\truleTOML\n\truleExpression\n\trulenewline\n\trulews\n\trulewsnl\n\trulecomment\n\trulekeyval\n\trulekey\n\trulebareKey\n\trulequotedKey\n\truleval\n\truletable\n\trulestdTable\n\trulearrayTable\n\truleinlineTable\n\truleinlineTableKeyValues\n\truletableKey\n\truletableKeyComp\n\truletableKeySep\n\truleinlineTableValSep\n\truleinteger\n\truleint\n\trulefloat\n\trulefrac\n\truleexp\n\trulestring\n\trulebasicString\n\trulebasicChar\n\truleescaped\n\trulebasicUnescaped\n\truleescape\n\trulemlBasicString\n\trulemlBasicBody\n\truleliteralString\n\truleliteralChar\n\trulemlLiteralString\n\trulemlLiteralBody\n\trulemlLiteralChar\n\trulehexdigit\n\trulehexQuad\n\truleboolean\n\truledateFullYear\n\truledateMonth\n\truledateMDay\n\truletimeHour\n\truletimeMinute\n\truletimeSecond\n\truletimeSecfrac\n\truletimeNumoffset\n\truletimeOffset\n\trulepartialTime\n\trulefullDate\n\trulefullTime\n\truledatetime\n\truledigit\n\truledigitDual\n\truledigitQuad\n\trulearray\n\trulearrayValues\n\trulearraySep\n\truleAction0\n\trulePegText\n\truleAction1\n\truleAction2\n\truleAction3\n\truleAction4\n\truleAction5\n\truleAction6\n\truleAction7\n\truleAction8\n\truleAction9\n\truleAction10\n\truleAction11\n\truleAction12\n\truleAction13\n\truleAction14\n\truleAction15\n\truleAction16\n\truleAction17\n\truleAction18\n\truleAction19\n\truleAction20\n\truleAction21\n\truleAction22\n\truleAction23\n\truleAction24\n\truleAction25\n)\n\nvar rul3s = [...]string{\n\t\"Unknown\",\n\t\"TOML\",\n\t\"Expression\",\n\t\"newline\",\n\t\"ws\",\n\t\"wsnl\",\n\t\"comment\",\n\t\"keyval\",\n\t\"key\",\n\t\"bareKey\",\n\t\"quotedKey\",\n\t\"val\",\n\t\"table\",\n\t\"stdTable\",\n\t\"arrayTable\",\n\t\"inlineTable\",\n\t\"inlineTableKeyValues\",\n\t\"tableKey\",\n\t\"tableKeyComp\",\n\t\"tableKeySep\",\n\t\"inlineTableValSep\",\n\t\"integer\",\n\t\"int\",\n\t\"float\",\n\t\"frac\",\n\t\"exp\",\n\t\"string\",\n\t\"basicString\",\n\t\"basicChar\",\n\t\"escaped\",\n\t\"basicUnescaped\",\n\t\"escape\",\n\t\"mlBasicString\",\n\t\"mlBasicBody\",\n\t\"literalString\",\n\t\"literalChar\",\n\t\"mlLiteralString\",\n\t\"mlLiteralBody\",\n\t\"mlLiteralChar\",\n\t\"hexdigit\",\n\t\"hexQuad\",\n\t\"boolean\",\n\t\"dateFullYear\",\n\t\"dateMonth\",\n\t\"dateMDay\",\n\t\"timeHour\",\n\t\"timeMinute\",\n\t\"timeSecond\",\n\t\"timeSecfrac\",\n\t\"timeNumoffset\",\n\t\"timeOffset\",\n\t\"partialTime\",\n\t\"fullDate\",\n\t\"fullTime\",\n\t\"datetime\",\n\t\"digit\",\n\t\"digitDual\",\n\t\"digitQuad\",\n\t\"array\",\n\t\"arrayValues\",\n\t\"arraySep\",\n\t\"Action0\",\n\t\"PegText\",\n\t\"Action1\",\n\t\"Action2\",\n\t\"Action3\",\n\t\"Action4\",\n\t\"Action5\",\n\t\"Action6\",\n\t\"Action7\",\n\t\"Action8\",\n\t\"Action9\",\n\t\"Action10\",\n\t\"Action11\",\n\t\"Action12\",\n\t\"Action13\",\n\t\"Action14\",\n\t\"Action15\",\n\t\"Action16\",\n\t\"Action17\",\n\t\"Action18\",\n\t\"Action19\",\n\t\"Action20\",\n\t\"Action21\",\n\t\"Action22\",\n\t\"Action23\",\n\t\"Action24\",\n\t\"Action25\",\n}\n\ntype token32 struct {\n\tpegRule\n\tbegin, end uint32\n}\n\nfunc (t *token32) String() string {\n\treturn fmt.Sprintf(\"\\x1B[34m%v\\x1B[m %v %v\", rul3s[t.pegRule], t.begin, t.end)\n}\n\ntype node32 struct {\n\ttoken32\n\tup, next *node32\n}\n\nfunc (node *node32) print(pretty bool, buffer string) {\n\tvar print func(node *node32, depth int)\n\tprint = func(node *node32, depth int) {\n\t\tfor node != nil {\n\t\t\tfor c := 0; c < depth; c++ {\n\t\t\t\tfmt.Printf(\" \")\n\t\t\t}\n\t\t\trule := rul3s[node.pegRule]\n\t\t\tquote := strconv.Quote(string(([]rune(buffer)[node.begin:node.end])))\n\t\t\tif !pretty {\n\t\t\t\tfmt.Printf(\"%v %v\\n\", rule, quote)\n\t\t\t} else {\n\t\t\t\tfmt.Printf(\"\\x1B[34m%v\\x1B[m %v\\n\", rule, quote)\n\t\t\t}\n\t\t\tif node.up != nil {\n\t\t\t\tprint(node.up, depth+1)\n\t\t\t}\n\t\t\tnode = node.next\n\t\t}\n\t}\n\tprint(node, 0)\n}\n\nfunc (node *node32) Print(buffer string) {\n\tnode.print(false, buffer)\n}\n\nfunc (node *node32) PrettyPrint(buffer string) {\n\tnode.print(true, buffer)\n}\n\ntype tokens32 struct {\n\ttree []token32\n}\n\nfunc (t *tokens32) Trim(length uint32) {\n\tt.tree = t.tree[:length]\n}\n\nfunc (t *tokens32) Print() {\n\tfor _, token := range t.tree {\n\t\tfmt.Println(token.String())\n\t}\n}\n\nfunc (t *tokens32) AST() *node32 {\n\ttype element struct {\n\t\tnode *node32\n\t\tdown *element\n\t}\n\ttokens := t.Tokens()\n\tvar stack *element\n\tfor _, token := range tokens {\n\t\tif token.begin == token.end {\n\t\t\tcontinue\n\t\t}\n\t\tnode := &node32{token32: token}\n\t\tfor stack != nil && stack.node.begin >= token.begin && stack.node.end <= token.end {\n\t\t\tstack.node.next = node.up\n\t\t\tnode.up = stack.node\n\t\t\tstack = stack.down\n\t\t}\n\t\tstack = &element{node: node, down: stack}\n\t}\n\tif stack != nil {\n\t\treturn stack.node\n\t}\n\treturn nil\n}\n\nfunc (t *tokens32) PrintSyntaxTree(buffer string) {\n\tt.AST().Print(buffer)\n}\n\nfunc (t *tokens32) PrettyPrintSyntaxTree(buffer string) {\n\tt.AST().PrettyPrint(buffer)\n}\n\nfunc (t *tokens32) Add(rule pegRule, begin, end, index uint32) {\n\tif tree := t.tree; int(index) >= len(tree) {\n\t\texpanded := make([]token32, 2*len(tree))\n\t\tcopy(expanded, tree)\n\t\tt.tree = expanded\n\t}\n\tt.tree[index] = token32{\n\t\tpegRule: rule,\n\t\tbegin:   begin,\n\t\tend:     end,\n\t}\n}\n\nfunc (t *tokens32) Tokens() []token32 {\n\treturn t.tree\n}\n\ntype tomlParser struct {\n\ttoml\n\n\tBuffer string\n\tbuffer []rune\n\trules  [88]func() bool\n\tparse  func(rule ...int) error\n\treset  func()\n\tPretty bool\n\ttokens32\n}\n\nfunc (p *tomlParser) Parse(rule ...int) error {\n\treturn p.parse(rule...)\n}\n\nfunc (p *tomlParser) Reset() {\n\tp.reset()\n}\n\ntype textPosition struct {\n\tline, symbol int\n}\n\ntype textPositionMap map[int]textPosition\n\nfunc translatePositions(buffer []rune, positions []int) textPositionMap {\n\tlength, translations, j, line, symbol := len(positions), make(textPositionMap, len(positions)), 0, 1, 0\n\tsort.Ints(positions)\n\nsearch:\n\tfor i, c := range buffer {\n\t\tif c == '\\n' {\n\t\t\tline, symbol = line+1, 0\n\t\t} else {\n\t\t\tsymbol++\n\t\t}\n\t\tif i == positions[j] {\n\t\t\ttranslations[positions[j]] = textPosition{line, symbol}\n\t\t\tfor j++; j < length; j++ {\n\t\t\t\tif i != positions[j] {\n\t\t\t\t\tcontinue search\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak search\n\t\t}\n\t}\n\n\treturn translations\n}\n\ntype parseError struct {\n\tp   *tomlParser\n\tmax token32\n}\n\nfunc (e *parseError) Error() string {\n\ttokens, error := []token32{e.max}, \"\\n\"\n\tpositions, p := make([]int, 2*len(tokens)), 0\n\tfor _, token := range tokens {\n\t\tpositions[p], p = int(token.begin), p+1\n\t\tpositions[p], p = int(token.end), p+1\n\t}\n\ttranslations := translatePositions(e.p.buffer, positions)\n\tformat := \"parse error near %v (line %v symbol %v - line %v symbol %v):\\n%v\\n\"\n\tif e.p.Pretty {\n\t\tformat = \"parse error near \\x1B[34m%v\\x1B[m (line %v symbol %v - line %v symbol %v):\\n%v\\n\"\n\t}\n\tfor _, token := range tokens {\n\t\tbegin, end := int(token.begin), int(token.end)\n\t\terror += fmt.Sprintf(format,\n\t\t\trul3s[token.pegRule],\n\t\t\ttranslations[begin].line, translations[begin].symbol,\n\t\t\ttranslations[end].line, translations[end].symbol,\n\t\t\tstrconv.Quote(string(e.p.buffer[begin:end])))\n\t}\n\n\treturn error\n}\n\nfunc (p *tomlParser) PrintSyntaxTree() {\n\tif p.Pretty {\n\t\tp.tokens32.PrettyPrintSyntaxTree(p.Buffer)\n\t} else {\n\t\tp.tokens32.PrintSyntaxTree(p.Buffer)\n\t}\n}\n\nfunc (p *tomlParser) Execute() {\n\tbuffer, _buffer, text, begin, end := p.Buffer, p.buffer, \"\", 0, 0\n\tfor _, token := range p.Tokens() {\n\t\tswitch token.pegRule {\n\n\t\tcase rulePegText:\n\t\t\tbegin, end = int(token.begin), int(token.end)\n\t\t\ttext = string(_buffer[begin:end])\n\n\t\tcase ruleAction0:\n\t\t\t_ = buffer\n\t\tcase ruleAction1:\n\t\t\tp.SetTableString(begin, end)\n\t\tcase ruleAction2:\n\t\t\tp.AddLineCount(end - begin)\n\t\tcase ruleAction3:\n\t\t\tp.AddLineCount(end - begin)\n\t\tcase ruleAction4:\n\t\t\tp.AddKeyValue()\n\t\tcase ruleAction5:\n\t\t\tp.SetKey(p.buffer, begin, end)\n\t\tcase ruleAction6:\n\t\t\tp.SetKey(p.buffer, begin, end)\n\t\tcase ruleAction7:\n\t\t\tp.SetTime(begin, end)\n\t\tcase ruleAction8:\n\t\t\tp.SetFloat64(begin, end)\n\t\tcase ruleAction9:\n\t\t\tp.SetInt64(begin, end)\n\t\tcase ruleAction10:\n\t\t\tp.SetString(begin, end)\n\t\tcase ruleAction11:\n\t\t\tp.SetBool(begin, end)\n\t\tcase ruleAction12:\n\t\t\tp.SetArray(begin, end)\n\t\tcase ruleAction13:\n\t\t\tp.SetTable(p.buffer, begin, end)\n\t\tcase ruleAction14:\n\t\t\tp.SetArrayTable(p.buffer, begin, end)\n\t\tcase ruleAction15:\n\t\t\tp.StartInlineTable()\n\t\tcase ruleAction16:\n\t\t\tp.EndInlineTable()\n\t\tcase ruleAction17:\n\t\t\tp.AddTableKey()\n\t\tcase ruleAction18:\n\t\t\tp.SetBasicString(p.buffer, begin, end)\n\t\tcase ruleAction19:\n\t\t\tp.SetMultilineString()\n\t\tcase ruleAction20:\n\t\t\tp.AddMultilineBasicBody(p.buffer, begin, end)\n\t\tcase ruleAction21:\n\t\t\tp.SetLiteralString(p.buffer, begin, end)\n\t\tcase ruleAction22:\n\t\t\tp.SetMultilineLiteralString(p.buffer, begin, end)\n\t\tcase ruleAction23:\n\t\t\tp.StartArray()\n\t\tcase ruleAction24:\n\t\t\tp.AddArrayVal()\n\t\tcase ruleAction25:\n\t\t\tp.AddArrayVal()\n\n\t\t}\n\t}\n\t_, _, _, _, _ = buffer, _buffer, text, begin, end\n}\n\nfunc (p *tomlParser) Init() {\n\tvar (\n\t\tmax                  token32\n\t\tposition, tokenIndex uint32\n\t\tbuffer               []rune\n\t)\n\tp.reset = func() {\n\t\tmax = token32{}\n\t\tposition, tokenIndex = 0, 0\n\n\t\tp.buffer = []rune(p.Buffer)\n\t\tif len(p.buffer) == 0 || p.buffer[len(p.buffer)-1] != endSymbol {\n\t\t\tp.buffer = append(p.buffer, endSymbol)\n\t\t}\n\t\tbuffer = p.buffer\n\t}\n\tp.reset()\n\n\t_rules := p.rules\n\ttree := tokens32{tree: make([]token32, math.MaxInt16)}\n\tp.parse = func(rule ...int) error {\n\t\tr := 1\n\t\tif len(rule) > 0 {\n\t\t\tr = rule[0]\n\t\t}\n\t\tmatches := p.rules[r]()\n\t\tp.tokens32 = tree\n\t\tif matches {\n\t\t\tp.Trim(tokenIndex)\n\t\t\treturn nil\n\t\t}\n\t\treturn &parseError{p, max}\n\t}\n\n\tadd := func(rule pegRule, begin uint32) {\n\t\ttree.Add(rule, begin, position, tokenIndex)\n\t\ttokenIndex++\n\t\tif begin != position && position > max.end {\n\t\t\tmax = token32{rule, begin, position}\n\t\t}\n\t}\n\n\tmatchDot := func() bool {\n\t\tif buffer[position] != endSymbol {\n\t\t\tposition++\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\t/*matchChar := func(c byte) bool {\n\t\tif buffer[position] == c {\n\t\t\tposition++\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}*/\n\n\t/*matchRange := func(lower byte, upper byte) bool {\n\t\tif c := buffer[position]; c >= lower && c <= upper {\n\t\t\tposition++\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}*/\n\n\t_rules = [...]func() bool{\n\t\tnil,\n\t\t/* 0 TOML <- <(Expression (newline Expression)* newline? !. Action0)> */\n\t\tfunc() bool {\n\t\t\tposition0, tokenIndex0 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition1 := position\n\t\t\t\tif !_rules[ruleExpression]() {\n\t\t\t\t\tgoto l0\n\t\t\t\t}\n\t\t\tl2:\n\t\t\t\t{\n\t\t\t\t\tposition3, tokenIndex3 := position, tokenIndex\n\t\t\t\t\tif !_rules[rulenewline]() {\n\t\t\t\t\t\tgoto l3\n\t\t\t\t\t}\n\t\t\t\t\tif !_rules[ruleExpression]() {\n\t\t\t\t\t\tgoto l3\n\t\t\t\t\t}\n\t\t\t\t\tgoto l2\n\t\t\t\tl3:\n\t\t\t\t\tposition, tokenIndex = position3, tokenIndex3\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tposition4, tokenIndex4 := position, tokenIndex\n\t\t\t\t\tif !_rules[rulenewline]() {\n\t\t\t\t\t\tgoto l4\n\t\t\t\t\t}\n\t\t\t\t\tgoto l5\n\t\t\t\tl4:\n\t\t\t\t\tposition, tokenIndex = position4, tokenIndex4\n\t\t\t\t}\n\t\t\tl5:\n\t\t\t\t{\n\t\t\t\t\tposition6, tokenIndex6 := position, tokenIndex\n\t\t\t\t\tif !matchDot() {\n\t\t\t\t\t\tgoto l6\n\t\t\t\t\t}\n\t\t\t\t\tgoto l0\n\t\t\t\tl6:\n\t\t\t\t\tposition, tokenIndex = position6, tokenIndex6\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tadd(ruleAction0, position)\n\t\t\t\t}\n\t\t\t\tadd(ruleTOML, position1)\n\t\t\t}\n\t\t\treturn true\n\t\tl0:\n\t\t\tposition, tokenIndex = position0, tokenIndex0\n\t\t\treturn false\n\t\t},\n\t\t/* 1 Expression <- <((<(ws table ws comment? (wsnl keyval ws comment?)*)> Action1) / (ws keyval ws comment?) / (ws comment?) / ws)> */\n\t\tfunc() bool {\n\t\t\tposition8, tokenIndex8 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition9 := position\n\t\t\t\t{\n\t\t\t\t\tposition10, tokenIndex10 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition12 := position\n\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition13 := position\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition14, tokenIndex14 := position, tokenIndex\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition16 := position\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('[') {\n\t\t\t\t\t\t\t\t\t\tgoto l15\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\t\tgoto l15\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition17 := position\n\t\t\t\t\t\t\t\t\t\tif !_rules[ruletableKey]() {\n\t\t\t\t\t\t\t\t\t\t\tgoto l15\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tadd(rulePegText, position17)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\t\tgoto l15\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune(']') {\n\t\t\t\t\t\t\t\t\t\tgoto l15\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tadd(ruleAction13, position)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tadd(rulestdTable, position16)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tgoto l14\n\t\t\t\t\t\t\tl15:\n\t\t\t\t\t\t\t\tposition, tokenIndex = position14, tokenIndex14\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition19 := position\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('[') {\n\t\t\t\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('[') {\n\t\t\t\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition20 := position\n\t\t\t\t\t\t\t\t\t\tif !_rules[ruletableKey]() {\n\t\t\t\t\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tadd(rulePegText, position20)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune(']') {\n\t\t\t\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune(']') {\n\t\t\t\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tadd(ruleAction14, position)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tadd(rulearrayTable, position19)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tl14:\n\t\t\t\t\t\t\tadd(ruletable, position13)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\tgoto l11\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition22, tokenIndex22 := position, tokenIndex\n\t\t\t\t\t\t\tif !_rules[rulecomment]() {\n\t\t\t\t\t\t\t\tgoto l22\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgoto l23\n\t\t\t\t\t\tl22:\n\t\t\t\t\t\t\tposition, tokenIndex = position22, tokenIndex22\n\t\t\t\t\t\t}\n\t\t\t\t\tl23:\n\t\t\t\t\tl24:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition25, tokenIndex25 := position, tokenIndex\n\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\tgoto l25\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif !_rules[rulekeyval]() {\n\t\t\t\t\t\t\t\tgoto l25\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\tgoto l25\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition26, tokenIndex26 := position, tokenIndex\n\t\t\t\t\t\t\t\tif !_rules[rulecomment]() {\n\t\t\t\t\t\t\t\t\tgoto l26\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tgoto l27\n\t\t\t\t\t\t\tl26:\n\t\t\t\t\t\t\t\tposition, tokenIndex = position26, tokenIndex26\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tl27:\n\t\t\t\t\t\t\tgoto l24\n\t\t\t\t\t\tl25:\n\t\t\t\t\t\t\tposition, tokenIndex = position25, tokenIndex25\n\t\t\t\t\t\t}\n\t\t\t\t\t\tadd(rulePegText, position12)\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tadd(ruleAction1, position)\n\t\t\t\t\t}\n\t\t\t\t\tgoto l10\n\t\t\t\tl11:\n\t\t\t\t\tposition, tokenIndex = position10, tokenIndex10\n\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\tgoto l29\n\t\t\t\t\t}\n\t\t\t\t\tif !_rules[rulekeyval]() {\n\t\t\t\t\t\tgoto l29\n\t\t\t\t\t}\n\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\tgoto l29\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tposition30, tokenIndex30 := position, tokenIndex\n\t\t\t\t\t\tif !_rules[rulecomment]() {\n\t\t\t\t\t\t\tgoto l30\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoto l31\n\t\t\t\t\tl30:\n\t\t\t\t\t\tposition, tokenIndex = position30, tokenIndex30\n\t\t\t\t\t}\n\t\t\t\tl31:\n\t\t\t\t\tgoto l10\n\t\t\t\tl29:\n\t\t\t\t\tposition, tokenIndex = position10, tokenIndex10\n\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\tgoto l32\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tposition33, tokenIndex33 := position, tokenIndex\n\t\t\t\t\t\tif !_rules[rulecomment]() {\n\t\t\t\t\t\t\tgoto l33\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoto l34\n\t\t\t\t\tl33:\n\t\t\t\t\t\tposition, tokenIndex = position33, tokenIndex33\n\t\t\t\t\t}\n\t\t\t\tl34:\n\t\t\t\t\tgoto l10\n\t\t\t\tl32:\n\t\t\t\t\tposition, tokenIndex = position10, tokenIndex10\n\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\tgoto l8\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tl10:\n\t\t\t\tadd(ruleExpression, position9)\n\t\t\t}\n\t\t\treturn true\n\t\tl8:\n\t\t\tposition, tokenIndex = position8, tokenIndex8\n\t\t\treturn false\n\t\t},\n\t\t/* 2 newline <- <(<('\\r' / '\\n')+> Action2)> */\n\t\tfunc() bool {\n\t\t\tposition35, tokenIndex35 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition36 := position\n\t\t\t\t{\n\t\t\t\t\tposition37 := position\n\t\t\t\t\t{\n\t\t\t\t\t\tposition40, tokenIndex40 := position, tokenIndex\n\t\t\t\t\t\tif buffer[position] != rune('\\r') {\n\t\t\t\t\t\t\tgoto l41\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tgoto l40\n\t\t\t\t\tl41:\n\t\t\t\t\t\tposition, tokenIndex = position40, tokenIndex40\n\t\t\t\t\t\tif buffer[position] != rune('\\n') {\n\t\t\t\t\t\t\tgoto l35\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t}\n\t\t\t\tl40:\n\t\t\t\tl38:\n\t\t\t\t\t{\n\t\t\t\t\t\tposition39, tokenIndex39 := position, tokenIndex\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition42, tokenIndex42 := position, tokenIndex\n\t\t\t\t\t\t\tif buffer[position] != rune('\\r') {\n\t\t\t\t\t\t\t\tgoto l43\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\tgoto l42\n\t\t\t\t\t\tl43:\n\t\t\t\t\t\t\tposition, tokenIndex = position42, tokenIndex42\n\t\t\t\t\t\t\tif buffer[position] != rune('\\n') {\n\t\t\t\t\t\t\t\tgoto l39\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t}\n\t\t\t\t\tl42:\n\t\t\t\t\t\tgoto l38\n\t\t\t\t\tl39:\n\t\t\t\t\t\tposition, tokenIndex = position39, tokenIndex39\n\t\t\t\t\t}\n\t\t\t\t\tadd(rulePegText, position37)\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tadd(ruleAction2, position)\n\t\t\t\t}\n\t\t\t\tadd(rulenewline, position36)\n\t\t\t}\n\t\t\treturn true\n\t\tl35:\n\t\t\tposition, tokenIndex = position35, tokenIndex35\n\t\t\treturn false\n\t\t},\n\t\t/* 3 ws <- <(' ' / '\\t')*> */\n\t\tfunc() bool {\n\t\t\t{\n\t\t\t\tposition46 := position\n\t\t\tl47:\n\t\t\t\t{\n\t\t\t\t\tposition48, tokenIndex48 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition49, tokenIndex49 := position, tokenIndex\n\t\t\t\t\t\tif buffer[position] != rune(' ') {\n\t\t\t\t\t\t\tgoto l50\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tgoto l49\n\t\t\t\t\tl50:\n\t\t\t\t\t\tposition, tokenIndex = position49, tokenIndex49\n\t\t\t\t\t\tif buffer[position] != rune('\\t') {\n\t\t\t\t\t\t\tgoto l48\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t}\n\t\t\t\tl49:\n\t\t\t\t\tgoto l47\n\t\t\t\tl48:\n\t\t\t\t\tposition, tokenIndex = position48, tokenIndex48\n\t\t\t\t}\n\t\t\t\tadd(rulews, position46)\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\t/* 4 wsnl <- <((&('\\t') '\\t') | (&(' ') ' ') | (&('\\n' | '\\r') (<('\\r' / '\\n')> Action3)))*> */\n\t\tfunc() bool {\n\t\t\t{\n\t\t\t\tposition52 := position\n\t\t\tl53:\n\t\t\t\t{\n\t\t\t\t\tposition54, tokenIndex54 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\t\tcase '\\t':\n\t\t\t\t\t\t\tif buffer[position] != rune('\\t') {\n\t\t\t\t\t\t\t\tgoto l54\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase ' ':\n\t\t\t\t\t\t\tif buffer[position] != rune(' ') {\n\t\t\t\t\t\t\t\tgoto l54\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition56 := position\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition57, tokenIndex57 := position, tokenIndex\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\r') {\n\t\t\t\t\t\t\t\t\t\tgoto l58\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tgoto l57\n\t\t\t\t\t\t\t\tl58:\n\t\t\t\t\t\t\t\t\tposition, tokenIndex = position57, tokenIndex57\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\n') {\n\t\t\t\t\t\t\t\t\t\tgoto l54\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tl57:\n\t\t\t\t\t\t\t\tadd(rulePegText, position56)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tadd(ruleAction3, position)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tgoto l53\n\t\t\t\tl54:\n\t\t\t\t\tposition, tokenIndex = position54, tokenIndex54\n\t\t\t\t}\n\t\t\t\tadd(rulewsnl, position52)\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\t\t/* 5 comment <- <('#' <('\\t' / [ -\\U0010ffff])*>)> */\n\t\tfunc() bool {\n\t\t\tposition60, tokenIndex60 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition61 := position\n\t\t\t\tif buffer[position] != rune('#') {\n\t\t\t\t\tgoto l60\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\t{\n\t\t\t\t\tposition62 := position\n\t\t\t\tl63:\n\t\t\t\t\t{\n\t\t\t\t\t\tposition64, tokenIndex64 := position, tokenIndex\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition65, tokenIndex65 := position, tokenIndex\n\t\t\t\t\t\t\tif buffer[position] != rune('\\t') {\n\t\t\t\t\t\t\t\tgoto l66\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\tgoto l65\n\t\t\t\t\t\tl66:\n\t\t\t\t\t\t\tposition, tokenIndex = position65, tokenIndex65\n\t\t\t\t\t\t\tif c := buffer[position]; c < rune(' ') || c > rune('\\U0010ffff') {\n\t\t\t\t\t\t\t\tgoto l64\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t}\n\t\t\t\t\tl65:\n\t\t\t\t\t\tgoto l63\n\t\t\t\t\tl64:\n\t\t\t\t\t\tposition, tokenIndex = position64, tokenIndex64\n\t\t\t\t\t}\n\t\t\t\t\tadd(rulePegText, position62)\n\t\t\t\t}\n\t\t\t\tadd(rulecomment, position61)\n\t\t\t}\n\t\t\treturn true\n\t\tl60:\n\t\t\tposition, tokenIndex = position60, tokenIndex60\n\t\t\treturn false\n\t\t},\n\t\t/* 6 keyval <- <(key ws '=' ws val Action4)> */\n\t\tfunc() bool {\n\t\t\tposition67, tokenIndex67 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition68 := position\n\t\t\t\tif !_rules[rulekey]() {\n\t\t\t\t\tgoto l67\n\t\t\t\t}\n\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\tgoto l67\n\t\t\t\t}\n\t\t\t\tif buffer[position] != rune('=') {\n\t\t\t\t\tgoto l67\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\tgoto l67\n\t\t\t\t}\n\t\t\t\tif !_rules[ruleval]() {\n\t\t\t\t\tgoto l67\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tadd(ruleAction4, position)\n\t\t\t\t}\n\t\t\t\tadd(rulekeyval, position68)\n\t\t\t}\n\t\t\treturn true\n\t\tl67:\n\t\t\tposition, tokenIndex = position67, tokenIndex67\n\t\t\treturn false\n\t\t},\n\t\t/* 7 key <- <(bareKey / quotedKey)> */\n\t\tfunc() bool {\n\t\t\tposition70, tokenIndex70 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition71 := position\n\t\t\t\t{\n\t\t\t\t\tposition72, tokenIndex72 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition74 := position\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition75 := position\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\t\t\t\tcase '_':\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('_') {\n\t\t\t\t\t\t\t\t\t\tgoto l73\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase '-':\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('-') {\n\t\t\t\t\t\t\t\t\t\tgoto l73\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z':\n\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('a') || c > rune('z') {\n\t\t\t\t\t\t\t\t\t\tgoto l73\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('0') || c > rune('9') {\n\t\t\t\t\t\t\t\t\t\tgoto l73\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('A') || c > rune('Z') {\n\t\t\t\t\t\t\t\t\t\tgoto l73\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tl76:\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition77, tokenIndex77 := position, tokenIndex\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\t\t\t\t\tcase '_':\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('_') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l77\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tcase '-':\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('-') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l77\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tcase 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z':\n\t\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('a') || c > rune('z') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l77\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('0') || c > rune('9') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l77\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('A') || c > rune('Z') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l77\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tgoto l76\n\t\t\t\t\t\t\tl77:\n\t\t\t\t\t\t\t\tposition, tokenIndex = position77, tokenIndex77\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tadd(rulePegText, position75)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tadd(ruleAction5, position)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tadd(rulebareKey, position74)\n\t\t\t\t\t}\n\t\t\t\t\tgoto l72\n\t\t\t\tl73:\n\t\t\t\t\tposition, tokenIndex = position72, tokenIndex72\n\t\t\t\t\t{\n\t\t\t\t\t\tposition81 := position\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition82 := position\n\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\tgoto l70\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\tl83:\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition84, tokenIndex84 := position, tokenIndex\n\t\t\t\t\t\t\t\tif !_rules[rulebasicChar]() {\n\t\t\t\t\t\t\t\t\tgoto l84\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tgoto l83\n\t\t\t\t\t\t\tl84:\n\t\t\t\t\t\t\t\tposition, tokenIndex = position84, tokenIndex84\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\tgoto l70\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\tadd(rulePegText, position82)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tadd(ruleAction6, position)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tadd(rulequotedKey, position81)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tl72:\n\t\t\t\tadd(rulekey, position71)\n\t\t\t}\n\t\t\treturn true\n\t\tl70:\n\t\t\tposition, tokenIndex = position70, tokenIndex70\n\t\t\treturn false\n\t\t},\n\t\t/* 8 bareKey <- <(<((&('_') '_') | (&('-') '-') | (&('a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z') [a-z]) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') [0-9]) | (&('A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z') [A-Z]))+> Action5)> */\n\t\tnil,\n\t\t/* 9 quotedKey <- <(<('\"' basicChar* '\"')> Action6)> */\n\t\tnil,\n\t\t/* 10 val <- <((<datetime> Action7) / (<float> Action8) / ((&('{') inlineTable) | (&('[') (<array> Action12)) | (&('f' | 't') (<boolean> Action11)) | (&('\"' | '\\'') (<string> Action10)) | (&('+' | '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') (<integer> Action9))))> */\n\t\tfunc() bool {\n\t\t\tposition88, tokenIndex88 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition89 := position\n\t\t\t\t{\n\t\t\t\t\tposition90, tokenIndex90 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition92 := position\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition93 := position\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition94, tokenIndex94 := position, tokenIndex\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition96 := position\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition97 := position\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition98 := position\n\t\t\t\t\t\t\t\t\t\t\tif !_rules[ruledigitDual]() {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l95\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif !_rules[ruledigitDual]() {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l95\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tadd(ruledigitQuad, position98)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tadd(ruledateFullYear, position97)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('-') {\n\t\t\t\t\t\t\t\t\t\tgoto l95\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition99 := position\n\t\t\t\t\t\t\t\t\t\tif !_rules[ruledigitDual]() {\n\t\t\t\t\t\t\t\t\t\t\tgoto l95\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tadd(ruledateMonth, position99)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('-') {\n\t\t\t\t\t\t\t\t\t\tgoto l95\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition100 := position\n\t\t\t\t\t\t\t\t\t\tif !_rules[ruledigitDual]() {\n\t\t\t\t\t\t\t\t\t\t\tgoto l95\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tadd(ruledateMDay, position100)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tadd(rulefullDate, position96)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition101, tokenIndex101 := position, tokenIndex\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('T') {\n\t\t\t\t\t\t\t\t\t\tgoto l101\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition103 := position\n\t\t\t\t\t\t\t\t\t\tif !_rules[rulepartialTime]() {\n\t\t\t\t\t\t\t\t\t\t\tgoto l101\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition104, tokenIndex104 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition106 := position\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition107, tokenIndex107 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('Z') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l108\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l107\n\t\t\t\t\t\t\t\t\t\t\t\tl108:\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position107, tokenIndex107\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition109 := position\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition110, tokenIndex110 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('-') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l111\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l110\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tl111:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position110, tokenIndex110\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('+') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l104\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tl110:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[ruletimeHour]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l104\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune(':') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l104\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[ruletimeMinute]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l104\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tadd(ruletimeNumoffset, position109)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tl107:\n\t\t\t\t\t\t\t\t\t\t\t\tadd(ruletimeOffset, position106)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tgoto l105\n\t\t\t\t\t\t\t\t\t\tl104:\n\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position104, tokenIndex104\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tl105:\n\t\t\t\t\t\t\t\t\t\tadd(rulefullTime, position103)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tgoto l102\n\t\t\t\t\t\t\t\tl101:\n\t\t\t\t\t\t\t\t\tposition, tokenIndex = position101, tokenIndex101\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tl102:\n\t\t\t\t\t\t\t\tgoto l94\n\t\t\t\t\t\t\tl95:\n\t\t\t\t\t\t\t\tposition, tokenIndex = position94, tokenIndex94\n\t\t\t\t\t\t\t\tif !_rules[rulepartialTime]() {\n\t\t\t\t\t\t\t\t\tgoto l91\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tl94:\n\t\t\t\t\t\t\tadd(ruledatetime, position93)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tadd(rulePegText, position92)\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tadd(ruleAction7, position)\n\t\t\t\t\t}\n\t\t\t\t\tgoto l90\n\t\t\t\tl91:\n\t\t\t\t\tposition, tokenIndex = position90, tokenIndex90\n\t\t\t\t\t{\n\t\t\t\t\t\tposition114 := position\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition115 := position\n\t\t\t\t\t\t\tif !_rules[ruleinteger]() {\n\t\t\t\t\t\t\t\tgoto l113\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition116, tokenIndex116 := position, tokenIndex\n\t\t\t\t\t\t\t\tif !_rules[rulefrac]() {\n\t\t\t\t\t\t\t\t\tgoto l117\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition118, tokenIndex118 := position, tokenIndex\n\t\t\t\t\t\t\t\t\tif !_rules[ruleexp]() {\n\t\t\t\t\t\t\t\t\t\tgoto l118\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tgoto l119\n\t\t\t\t\t\t\t\tl118:\n\t\t\t\t\t\t\t\t\tposition, tokenIndex = position118, tokenIndex118\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tl119:\n\t\t\t\t\t\t\t\tgoto l116\n\t\t\t\t\t\t\tl117:\n\t\t\t\t\t\t\t\tposition, tokenIndex = position116, tokenIndex116\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition120, tokenIndex120 := position, tokenIndex\n\t\t\t\t\t\t\t\t\tif !_rules[rulefrac]() {\n\t\t\t\t\t\t\t\t\t\tgoto l120\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tgoto l121\n\t\t\t\t\t\t\t\tl120:\n\t\t\t\t\t\t\t\t\tposition, tokenIndex = position120, tokenIndex120\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tl121:\n\t\t\t\t\t\t\t\tif !_rules[ruleexp]() {\n\t\t\t\t\t\t\t\t\tgoto l113\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tl116:\n\t\t\t\t\t\t\tadd(rulefloat, position115)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tadd(rulePegText, position114)\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tadd(ruleAction8, position)\n\t\t\t\t\t}\n\t\t\t\t\tgoto l90\n\t\t\t\tl113:\n\t\t\t\t\tposition, tokenIndex = position90, tokenIndex90\n\t\t\t\t\t{\n\t\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\t\tcase '{':\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition124 := position\n\t\t\t\t\t\t\t\tif buffer[position] != rune('{') {\n\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tadd(ruleAction15, position)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition126 := position\n\t\t\t\t\t\t\t\tl127:\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition128, tokenIndex128 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\tif !_rules[rulekeyval]() {\n\t\t\t\t\t\t\t\t\t\t\tgoto l128\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition129, tokenIndex129 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition131 := position\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l129\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune(',') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l129\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l129\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleinlineTableValSep, position131)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tgoto l130\n\t\t\t\t\t\t\t\t\t\tl129:\n\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position129, tokenIndex129\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tl130:\n\t\t\t\t\t\t\t\t\t\tgoto l127\n\t\t\t\t\t\t\t\t\tl128:\n\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position128, tokenIndex128\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tadd(ruleinlineTableKeyValues, position126)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif buffer[position] != rune('}') {\n\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tadd(ruleAction16, position)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tadd(ruleinlineTable, position124)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase '[':\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition133 := position\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition134 := position\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune('[') {\n\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tadd(ruleAction23, position)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition136, tokenIndex136 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition138 := position\n\t\t\t\t\t\t\t\t\t\t\tif !_rules[ruleval]() {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l136\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleAction24, position)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tl140:\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition141, tokenIndex141 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l141\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition142, tokenIndex142 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulecomment]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l142\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l143\n\t\t\t\t\t\t\t\t\t\t\t\tl142:\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position142, tokenIndex142\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tl143:\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l141\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulearraySep]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l141\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l141\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition144, tokenIndex144 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulecomment]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l144\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l145\n\t\t\t\t\t\t\t\t\t\t\t\tl144:\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position144, tokenIndex144\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tl145:\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l141\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[ruleval]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l141\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleAction25, position)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l140\n\t\t\t\t\t\t\t\t\t\t\tl141:\n\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position141, tokenIndex141\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l136\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition147, tokenIndex147 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulearraySep]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l147\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l148\n\t\t\t\t\t\t\t\t\t\t\tl147:\n\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position147, tokenIndex147\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tl148:\n\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l136\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition149, tokenIndex149 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulecomment]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l149\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l150\n\t\t\t\t\t\t\t\t\t\t\tl149:\n\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position149, tokenIndex149\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tl150:\n\t\t\t\t\t\t\t\t\t\t\tadd(rulearrayValues, position138)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgoto l137\n\t\t\t\t\t\t\t\t\tl136:\n\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position136, tokenIndex136\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tl137:\n\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif buffer[position] != rune(']') {\n\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\tadd(rulearray, position134)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tadd(rulePegText, position133)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tadd(ruleAction12, position)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'f', 't':\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition152 := position\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition153 := position\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition154, tokenIndex154 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('t') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l155\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('r') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l155\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('u') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l155\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('e') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l155\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tgoto l154\n\t\t\t\t\t\t\t\t\tl155:\n\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position154, tokenIndex154\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('f') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('a') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('l') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('s') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('e') {\n\t\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tl154:\n\t\t\t\t\t\t\t\t\tadd(ruleboolean, position153)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tadd(rulePegText, position152)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tadd(ruleAction11, position)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase '\"', '\\'':\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition157 := position\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tposition158 := position\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tposition159, tokenIndex159 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition161 := position\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l160\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l160\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l160\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition162 := position\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition163 := position\n\t\t\t\t\t\t\t\t\t\t\t\tl164:\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition165, tokenIndex165 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition166, tokenIndex166 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l166\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l166\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l166\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l165\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tl166:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position166, tokenIndex166\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition167, tokenIndex167 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition169 := position\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition170, tokenIndex170 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\t') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l171\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l170\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl171:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position170, tokenIndex170\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune(' ') || c > rune('\\U0010ffff') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l168\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl170:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tadd(rulemlLiteralChar, position169)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l167\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tl168:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position167, tokenIndex167\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulenewline]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l165\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tl167:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l164\n\t\t\t\t\t\t\t\t\t\t\t\t\tl165:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position165, tokenIndex165\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tadd(rulemlLiteralBody, position163)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tadd(rulePegText, position162)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l160\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l160\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l160\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleAction22, position)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tadd(rulemlLiteralString, position161)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgoto l159\n\t\t\t\t\t\t\t\t\tl160:\n\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position159, tokenIndex159\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition174 := position\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l173\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition175 := position\n\t\t\t\t\t\t\t\t\t\t\tl176:\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition177, tokenIndex177 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition178 := position\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase '\\t':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\t') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l177\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcase ' ', '!', '\"', '#', '$', '%', '&':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune(' ') || c > rune('&') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l177\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('(') || c > rune('\\U0010ffff') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l177\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleliteralChar, position178)\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l176\n\t\t\t\t\t\t\t\t\t\t\t\tl177:\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position177, tokenIndex177\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tadd(rulePegText, position175)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\\'') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l173\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleAction21, position)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tadd(ruleliteralString, position174)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgoto l159\n\t\t\t\t\t\t\t\t\tl173:\n\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position159, tokenIndex159\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition182 := position\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l181\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l181\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l181\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition183 := position\n\t\t\t\t\t\t\t\t\t\t\tl184:\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition185, tokenIndex185 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition186, tokenIndex186 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition188 := position\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition189, tokenIndex189 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulebasicChar]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l190\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l189\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tl190:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position189, tokenIndex189\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulenewline]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l187\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tl189:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tadd(rulePegText, position188)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleAction20, position)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l186\n\t\t\t\t\t\t\t\t\t\t\t\t\tl187:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position186, tokenIndex186\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[ruleescape]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l185\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulenewline]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l185\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulewsnl]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l185\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tl186:\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l184\n\t\t\t\t\t\t\t\t\t\t\t\tl185:\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position185, tokenIndex185\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tadd(rulemlBasicBody, position183)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l181\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l181\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\tgoto l181\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleAction19, position)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tadd(rulemlBasicString, position182)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tgoto l159\n\t\t\t\t\t\t\t\t\tl181:\n\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position159, tokenIndex159\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tposition193 := position\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tposition194 := position\n\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\tl195:\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition196, tokenIndex196 := position, tokenIndex\n\t\t\t\t\t\t\t\t\t\t\t\t\tif !_rules[rulebasicChar]() {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l196\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l195\n\t\t\t\t\t\t\t\t\t\t\t\tl196:\n\t\t\t\t\t\t\t\t\t\t\t\t\tposition, tokenIndex = position196, tokenIndex196\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\t\t\t\t\tadd(rulePegText, position194)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tadd(ruleAction18, position)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tadd(rulebasicString, position193)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tl159:\n\t\t\t\t\t\t\t\t\tadd(rulestring, position158)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tadd(rulePegText, position157)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tadd(ruleAction10, position)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition199 := position\n\t\t\t\t\t\t\t\tif !_rules[ruleinteger]() {\n\t\t\t\t\t\t\t\t\tgoto l88\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tadd(rulePegText, position199)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tadd(ruleAction9, position)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\tl90:\n\t\t\t\tadd(ruleval, position89)\n\t\t\t}\n\t\t\treturn true\n\t\tl88:\n\t\t\tposition, tokenIndex = position88, tokenIndex88\n\t\t\treturn false\n\t\t},\n\t\t/* 11 table <- <(stdTable / arrayTable)> */\n\t\tnil,\n\t\t/* 12 stdTable <- <('[' ws <tableKey> ws ']' Action13)> */\n\t\tnil,\n\t\t/* 13 arrayTable <- <('[' '[' ws <tableKey> ws (']' ']') Action14)> */\n\t\tnil,\n\t\t/* 14 inlineTable <- <('{' Action15 ws inlineTableKeyValues ws '}' Action16)> */\n\t\tnil,\n\t\t/* 15 inlineTableKeyValues <- <(keyval inlineTableValSep?)*> */\n\t\tnil,\n\t\t/* 16 tableKey <- <(tableKeyComp (tableKeySep tableKeyComp)*)> */\n\t\tfunc() bool {\n\t\t\tposition206, tokenIndex206 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition207 := position\n\t\t\t\tif !_rules[ruletableKeyComp]() {\n\t\t\t\t\tgoto l206\n\t\t\t\t}\n\t\t\tl208:\n\t\t\t\t{\n\t\t\t\t\tposition209, tokenIndex209 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition210 := position\n\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\tgoto l209\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif buffer[position] != rune('.') {\n\t\t\t\t\t\t\tgoto l209\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tif !_rules[rulews]() {\n\t\t\t\t\t\t\tgoto l209\n\t\t\t\t\t\t}\n\t\t\t\t\t\tadd(ruletableKeySep, position210)\n\t\t\t\t\t}\n\t\t\t\t\tif !_rules[ruletableKeyComp]() {\n\t\t\t\t\t\tgoto l209\n\t\t\t\t\t}\n\t\t\t\t\tgoto l208\n\t\t\t\tl209:\n\t\t\t\t\tposition, tokenIndex = position209, tokenIndex209\n\t\t\t\t}\n\t\t\t\tadd(ruletableKey, position207)\n\t\t\t}\n\t\t\treturn true\n\t\tl206:\n\t\t\tposition, tokenIndex = position206, tokenIndex206\n\t\t\treturn false\n\t\t},\n\t\t/* 17 tableKeyComp <- <(key Action17)> */\n\t\tfunc() bool {\n\t\t\tposition211, tokenIndex211 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition212 := position\n\t\t\t\tif !_rules[rulekey]() {\n\t\t\t\t\tgoto l211\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tadd(ruleAction17, position)\n\t\t\t\t}\n\t\t\t\tadd(ruletableKeyComp, position212)\n\t\t\t}\n\t\t\treturn true\n\t\tl211:\n\t\t\tposition, tokenIndex = position211, tokenIndex211\n\t\t\treturn false\n\t\t},\n\t\t/* 18 tableKeySep <- <(ws '.' ws)> */\n\t\tnil,\n\t\t/* 19 inlineTableValSep <- <(ws ',' ws)> */\n\t\tnil,\n\t\t/* 20 integer <- <(('-' / '+')? int)> */\n\t\tfunc() bool {\n\t\t\tposition216, tokenIndex216 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition217 := position\n\t\t\t\t{\n\t\t\t\t\tposition218, tokenIndex218 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition220, tokenIndex220 := position, tokenIndex\n\t\t\t\t\t\tif buffer[position] != rune('-') {\n\t\t\t\t\t\t\tgoto l221\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tgoto l220\n\t\t\t\t\tl221:\n\t\t\t\t\t\tposition, tokenIndex = position220, tokenIndex220\n\t\t\t\t\t\tif buffer[position] != rune('+') {\n\t\t\t\t\t\t\tgoto l218\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t}\n\t\t\t\tl220:\n\t\t\t\t\tgoto l219\n\t\t\t\tl218:\n\t\t\t\t\tposition, tokenIndex = position218, tokenIndex218\n\t\t\t\t}\n\t\t\tl219:\n\t\t\t\t{\n\t\t\t\t\tposition222 := position\n\t\t\t\t\t{\n\t\t\t\t\t\tposition223, tokenIndex223 := position, tokenIndex\n\t\t\t\t\t\tif c := buffer[position]; c < rune('1') || c > rune('9') {\n\t\t\t\t\t\t\tgoto l224\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition227, tokenIndex227 := position, tokenIndex\n\t\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\t\tgoto l228\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgoto l227\n\t\t\t\t\t\tl228:\n\t\t\t\t\t\t\tposition, tokenIndex = position227, tokenIndex227\n\t\t\t\t\t\t\tif buffer[position] != rune('_') {\n\t\t\t\t\t\t\t\tgoto l224\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\t\tgoto l224\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tl227:\n\t\t\t\t\tl225:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition226, tokenIndex226 := position, tokenIndex\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tposition229, tokenIndex229 := position, tokenIndex\n\t\t\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\t\t\tgoto l230\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tgoto l229\n\t\t\t\t\t\t\tl230:\n\t\t\t\t\t\t\t\tposition, tokenIndex = position229, tokenIndex229\n\t\t\t\t\t\t\t\tif buffer[position] != rune('_') {\n\t\t\t\t\t\t\t\t\tgoto l226\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\t\t\tgoto l226\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tl229:\n\t\t\t\t\t\t\tgoto l225\n\t\t\t\t\t\tl226:\n\t\t\t\t\t\t\tposition, tokenIndex = position226, tokenIndex226\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoto l223\n\t\t\t\t\tl224:\n\t\t\t\t\t\tposition, tokenIndex = position223, tokenIndex223\n\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\tgoto l216\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tl223:\n\t\t\t\t\tadd(ruleint, position222)\n\t\t\t\t}\n\t\t\t\tadd(ruleinteger, position217)\n\t\t\t}\n\t\t\treturn true\n\t\tl216:\n\t\t\tposition, tokenIndex = position216, tokenIndex216\n\t\t\treturn false\n\t\t},\n\t\t/* 21 int <- <(([1-9] (digit / ('_' digit))+) / digit)> */\n\t\tnil,\n\t\t/* 22 float <- <(integer ((frac exp?) / (frac? exp)))> */\n\t\tnil,\n\t\t/* 23 frac <- <('.' digit (digit / ('_' digit))*)> */\n\t\tfunc() bool {\n\t\t\tposition233, tokenIndex233 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition234 := position\n\t\t\t\tif buffer[position] != rune('.') {\n\t\t\t\t\tgoto l233\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\tgoto l233\n\t\t\t\t}\n\t\t\tl235:\n\t\t\t\t{\n\t\t\t\t\tposition236, tokenIndex236 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition237, tokenIndex237 := position, tokenIndex\n\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\tgoto l238\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoto l237\n\t\t\t\t\tl238:\n\t\t\t\t\t\tposition, tokenIndex = position237, tokenIndex237\n\t\t\t\t\t\tif buffer[position] != rune('_') {\n\t\t\t\t\t\t\tgoto l236\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\tgoto l236\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tl237:\n\t\t\t\t\tgoto l235\n\t\t\t\tl236:\n\t\t\t\t\tposition, tokenIndex = position236, tokenIndex236\n\t\t\t\t}\n\t\t\t\tadd(rulefrac, position234)\n\t\t\t}\n\t\t\treturn true\n\t\tl233:\n\t\t\tposition, tokenIndex = position233, tokenIndex233\n\t\t\treturn false\n\t\t},\n\t\t/* 24 exp <- <(('e' / 'E') ('-' / '+')? digit (digit / ('_' digit))*)> */\n\t\tfunc() bool {\n\t\t\tposition239, tokenIndex239 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition240 := position\n\t\t\t\t{\n\t\t\t\t\tposition241, tokenIndex241 := position, tokenIndex\n\t\t\t\t\tif buffer[position] != rune('e') {\n\t\t\t\t\t\tgoto l242\n\t\t\t\t\t}\n\t\t\t\t\tposition++\n\t\t\t\t\tgoto l241\n\t\t\t\tl242:\n\t\t\t\t\tposition, tokenIndex = position241, tokenIndex241\n\t\t\t\t\tif buffer[position] != rune('E') {\n\t\t\t\t\t\tgoto l239\n\t\t\t\t\t}\n\t\t\t\t\tposition++\n\t\t\t\t}\n\t\t\tl241:\n\t\t\t\t{\n\t\t\t\t\tposition243, tokenIndex243 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition245, tokenIndex245 := position, tokenIndex\n\t\t\t\t\t\tif buffer[position] != rune('-') {\n\t\t\t\t\t\t\tgoto l246\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tgoto l245\n\t\t\t\t\tl246:\n\t\t\t\t\t\tposition, tokenIndex = position245, tokenIndex245\n\t\t\t\t\t\tif buffer[position] != rune('+') {\n\t\t\t\t\t\t\tgoto l243\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t}\n\t\t\t\tl245:\n\t\t\t\t\tgoto l244\n\t\t\t\tl243:\n\t\t\t\t\tposition, tokenIndex = position243, tokenIndex243\n\t\t\t\t}\n\t\t\tl244:\n\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\tgoto l239\n\t\t\t\t}\n\t\t\tl247:\n\t\t\t\t{\n\t\t\t\t\tposition248, tokenIndex248 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition249, tokenIndex249 := position, tokenIndex\n\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\tgoto l250\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoto l249\n\t\t\t\t\tl250:\n\t\t\t\t\t\tposition, tokenIndex = position249, tokenIndex249\n\t\t\t\t\t\tif buffer[position] != rune('_') {\n\t\t\t\t\t\t\tgoto l248\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\tgoto l248\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tl249:\n\t\t\t\t\tgoto l247\n\t\t\t\tl248:\n\t\t\t\t\tposition, tokenIndex = position248, tokenIndex248\n\t\t\t\t}\n\t\t\t\tadd(ruleexp, position240)\n\t\t\t}\n\t\t\treturn true\n\t\tl239:\n\t\t\tposition, tokenIndex = position239, tokenIndex239\n\t\t\treturn false\n\t\t},\n\t\t/* 25 string <- <(mlLiteralString / literalString / mlBasicString / basicString)> */\n\t\tnil,\n\t\t/* 26 basicString <- <(<('\"' basicChar* '\"')> Action18)> */\n\t\tnil,\n\t\t/* 27 basicChar <- <(basicUnescaped / escaped)> */\n\t\tfunc() bool {\n\t\t\tposition253, tokenIndex253 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition254 := position\n\t\t\t\t{\n\t\t\t\t\tposition255, tokenIndex255 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition257 := position\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\t\t\tcase ' ', '!':\n\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune(' ') || c > rune('!') {\n\t\t\t\t\t\t\t\t\tgoto l256\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase '#', '$', '%', '&', '\\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[':\n\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune('#') || c > rune('[') {\n\t\t\t\t\t\t\t\t\tgoto l256\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tif c := buffer[position]; c < rune(']') || c > rune('\\U0010ffff') {\n\t\t\t\t\t\t\t\t\tgoto l256\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tadd(rulebasicUnescaped, position257)\n\t\t\t\t\t}\n\t\t\t\t\tgoto l255\n\t\t\t\tl256:\n\t\t\t\t\tposition, tokenIndex = position255, tokenIndex255\n\t\t\t\t\t{\n\t\t\t\t\t\tposition259 := position\n\t\t\t\t\t\tif !_rules[ruleescape]() {\n\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t}\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\t\t\tcase 'U':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('U') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tif !_rules[rulehexQuad]() {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif !_rules[rulehexQuad]() {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase 'u':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('u') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tif !_rules[rulehexQuad]() {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase '\\\\':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('\\\\') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase '/':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('/') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase '\"':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('\"') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase 'r':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('r') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('f') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('n') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tcase 't':\n\t\t\t\t\t\t\t\tif buffer[position] != rune('t') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tif buffer[position] != rune('b') {\n\t\t\t\t\t\t\t\t\tgoto l253\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tposition++\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tadd(ruleescaped, position259)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tl255:\n\t\t\t\tadd(rulebasicChar, position254)\n\t\t\t}\n\t\t\treturn true\n\t\tl253:\n\t\t\tposition, tokenIndex = position253, tokenIndex253\n\t\t\treturn false\n\t\t},\n\t\t/* 28 escaped <- <(escape ((&('U') ('U' hexQuad hexQuad)) | (&('u') ('u' hexQuad)) | (&('\\\\') '\\\\') | (&('/') '/') | (&('\"') '\"') | (&('r') 'r') | (&('f') 'f') | (&('n') 'n') | (&('t') 't') | (&('b') 'b')))> */\n\t\tnil,\n\t\t/* 29 basicUnescaped <- <((&(' ' | '!') [ -!]) | (&('#' | '$' | '%' | '&' | '\\'' | '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' | '[') [#-[]) | (&(']' | '^' | '_' | '`' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '{' | '|' | '}' | '~' | '\\u007f' | '\\u0080' | '\\u0081' | '\\u0082' | '\\u0083' | '\\u0084' | '\\u0085' | '\\u0086' | '\\u0087' | '\\u0088' | '\\u0089' | '\\u008a' | '\\u008b' | '\\u008c' | '\\u008d' | '\\u008e' | '\\u008f' | '\\u0090' | '\\u0091' | '\\u0092' | '\\u0093' | '\\u0094' | '\\u0095' | '\\u0096' | '\\u0097' | '\\u0098' | '\\u0099' | '\\u009a' | '\\u009b' | '\\u009c' | '\\u009d' | '\\u009e' | '\\u009f' | '\\u00a0' | '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' | '\\u00ad' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' | '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' | 'À' | 'Á' | 'Â' | 'Ã' | 'Ä' | 'Å' | 'Æ' | 'Ç' | 'È' | 'É' | 'Ê' | 'Ë' | 'Ì' | 'Í' | 'Î' | 'Ï' | 'Ð' | 'Ñ' | 'Ò' | 'Ó' | 'Ô' | 'Õ' | 'Ö' | '×' | 'Ø' | 'Ù' | 'Ú' | 'Û' | 'Ü' | 'Ý' | 'Þ' | 'ß' | 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' | 'ç' | 'è' | 'é' | 'ê' | 'ë' | 'ì' | 'í' | 'î' | 'ï' | 'ð' | 'ñ' | 'ò' | 'ó' | 'ô' | 'õ' | 'ö' | '÷' | 'ø' | 'ù' | 'ú' | 'û' | 'ü' | 'ý' | 'þ' | 'ÿ') []-\\U0010ffff]))> */\n\t\tnil,\n\t\t/* 30 escape <- <'\\\\'> */\n\t\tfunc() bool {\n\t\t\tposition263, tokenIndex263 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition264 := position\n\t\t\t\tif buffer[position] != rune('\\\\') {\n\t\t\t\t\tgoto l263\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\tadd(ruleescape, position264)\n\t\t\t}\n\t\t\treturn true\n\t\tl263:\n\t\t\tposition, tokenIndex = position263, tokenIndex263\n\t\t\treturn false\n\t\t},\n\t\t/* 31 mlBasicString <- <('\"' '\"' '\"' mlBasicBody ('\"' '\"' '\"') Action19)> */\n\t\tnil,\n\t\t/* 32 mlBasicBody <- <((<(basicChar / newline)> Action20) / (escape newline wsnl))*> */\n\t\tnil,\n\t\t/* 33 literalString <- <('\\'' <literalChar*> '\\'' Action21)> */\n\t\tnil,\n\t\t/* 34 literalChar <- <((&('\\t') '\\t') | (&(' ' | '!' | '\"' | '#' | '$' | '%' | '&') [ -&]) | (&('(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' | '[' | '\\\\' | ']' | '^' | '_' | '`' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '{' | '|' | '}' | '~' | '\\u007f' | '\\u0080' | '\\u0081' | '\\u0082' | '\\u0083' | '\\u0084' | '\\u0085' | '\\u0086' | '\\u0087' | '\\u0088' | '\\u0089' | '\\u008a' | '\\u008b' | '\\u008c' | '\\u008d' | '\\u008e' | '\\u008f' | '\\u0090' | '\\u0091' | '\\u0092' | '\\u0093' | '\\u0094' | '\\u0095' | '\\u0096' | '\\u0097' | '\\u0098' | '\\u0099' | '\\u009a' | '\\u009b' | '\\u009c' | '\\u009d' | '\\u009e' | '\\u009f' | '\\u00a0' | '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' | '\\u00ad' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' | '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' | 'À' | 'Á' | 'Â' | 'Ã' | 'Ä' | 'Å' | 'Æ' | 'Ç' | 'È' | 'É' | 'Ê' | 'Ë' | 'Ì' | 'Í' | 'Î' | 'Ï' | 'Ð' | 'Ñ' | 'Ò' | 'Ó' | 'Ô' | 'Õ' | 'Ö' | '×' | 'Ø' | 'Ù' | 'Ú' | 'Û' | 'Ü' | 'Ý' | 'Þ' | 'ß' | 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' | 'ç' | 'è' | 'é' | 'ê' | 'ë' | 'ì' | 'í' | 'î' | 'ï' | 'ð' | 'ñ' | 'ò' | 'ó' | 'ô' | 'õ' | 'ö' | '÷' | 'ø' | 'ù' | 'ú' | 'û' | 'ü' | 'ý' | 'þ' | 'ÿ') [(-\\U0010ffff]))> */\n\t\tnil,\n\t\t/* 35 mlLiteralString <- <('\\'' '\\'' '\\'' <mlLiteralBody> ('\\'' '\\'' '\\'') Action22)> */\n\t\tnil,\n\t\t/* 36 mlLiteralBody <- <(!('\\'' '\\'' '\\'') (mlLiteralChar / newline))*> */\n\t\tnil,\n\t\t/* 37 mlLiteralChar <- <('\\t' / [ -\\U0010ffff])> */\n\t\tnil,\n\t\t/* 38 hexdigit <- <((&('a' | 'b' | 'c' | 'd' | 'e' | 'f') [a-f]) | (&('A' | 'B' | 'C' | 'D' | 'E' | 'F') [A-F]) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') [0-9]))> */\n\t\tfunc() bool {\n\t\t\tposition272, tokenIndex272 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition273 := position\n\t\t\t\t{\n\t\t\t\t\tswitch buffer[position] {\n\t\t\t\t\tcase 'a', 'b', 'c', 'd', 'e', 'f':\n\t\t\t\t\t\tif c := buffer[position]; c < rune('a') || c > rune('f') {\n\t\t\t\t\t\t\tgoto l272\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'A', 'B', 'C', 'D', 'E', 'F':\n\t\t\t\t\t\tif c := buffer[position]; c < rune('A') || c > rune('F') {\n\t\t\t\t\t\t\tgoto l272\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif c := buffer[position]; c < rune('0') || c > rune('9') {\n\t\t\t\t\t\t\tgoto l272\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tadd(rulehexdigit, position273)\n\t\t\t}\n\t\t\treturn true\n\t\tl272:\n\t\t\tposition, tokenIndex = position272, tokenIndex272\n\t\t\treturn false\n\t\t},\n\t\t/* 39 hexQuad <- <(hexdigit hexdigit hexdigit hexdigit)> */\n\t\tfunc() bool {\n\t\t\tposition275, tokenIndex275 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition276 := position\n\t\t\t\tif !_rules[rulehexdigit]() {\n\t\t\t\t\tgoto l275\n\t\t\t\t}\n\t\t\t\tif !_rules[rulehexdigit]() {\n\t\t\t\t\tgoto l275\n\t\t\t\t}\n\t\t\t\tif !_rules[rulehexdigit]() {\n\t\t\t\t\tgoto l275\n\t\t\t\t}\n\t\t\t\tif !_rules[rulehexdigit]() {\n\t\t\t\t\tgoto l275\n\t\t\t\t}\n\t\t\t\tadd(rulehexQuad, position276)\n\t\t\t}\n\t\t\treturn true\n\t\tl275:\n\t\t\tposition, tokenIndex = position275, tokenIndex275\n\t\t\treturn false\n\t\t},\n\t\t/* 40 boolean <- <(('t' 'r' 'u' 'e') / ('f' 'a' 'l' 's' 'e'))> */\n\t\tnil,\n\t\t/* 41 dateFullYear <- <digitQuad> */\n\t\tnil,\n\t\t/* 42 dateMonth <- <digitDual> */\n\t\tnil,\n\t\t/* 43 dateMDay <- <digitDual> */\n\t\tnil,\n\t\t/* 44 timeHour <- <digitDual> */\n\t\tfunc() bool {\n\t\t\tposition281, tokenIndex281 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition282 := position\n\t\t\t\tif !_rules[ruledigitDual]() {\n\t\t\t\t\tgoto l281\n\t\t\t\t}\n\t\t\t\tadd(ruletimeHour, position282)\n\t\t\t}\n\t\t\treturn true\n\t\tl281:\n\t\t\tposition, tokenIndex = position281, tokenIndex281\n\t\t\treturn false\n\t\t},\n\t\t/* 45 timeMinute <- <digitDual> */\n\t\tfunc() bool {\n\t\t\tposition283, tokenIndex283 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition284 := position\n\t\t\t\tif !_rules[ruledigitDual]() {\n\t\t\t\t\tgoto l283\n\t\t\t\t}\n\t\t\t\tadd(ruletimeMinute, position284)\n\t\t\t}\n\t\t\treturn true\n\t\tl283:\n\t\t\tposition, tokenIndex = position283, tokenIndex283\n\t\t\treturn false\n\t\t},\n\t\t/* 46 timeSecond <- <digitDual> */\n\t\tnil,\n\t\t/* 47 timeSecfrac <- <('.' digit+)> */\n\t\tnil,\n\t\t/* 48 timeNumoffset <- <(('-' / '+') timeHour ':' timeMinute)> */\n\t\tnil,\n\t\t/* 49 timeOffset <- <('Z' / timeNumoffset)> */\n\t\tnil,\n\t\t/* 50 partialTime <- <(timeHour ':' timeMinute ':' timeSecond timeSecfrac?)> */\n\t\tfunc() bool {\n\t\t\tposition289, tokenIndex289 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition290 := position\n\t\t\t\tif !_rules[ruletimeHour]() {\n\t\t\t\t\tgoto l289\n\t\t\t\t}\n\t\t\t\tif buffer[position] != rune(':') {\n\t\t\t\t\tgoto l289\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\tif !_rules[ruletimeMinute]() {\n\t\t\t\t\tgoto l289\n\t\t\t\t}\n\t\t\t\tif buffer[position] != rune(':') {\n\t\t\t\t\tgoto l289\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\t{\n\t\t\t\t\tposition291 := position\n\t\t\t\t\tif !_rules[ruledigitDual]() {\n\t\t\t\t\t\tgoto l289\n\t\t\t\t\t}\n\t\t\t\t\tadd(ruletimeSecond, position291)\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tposition292, tokenIndex292 := position, tokenIndex\n\t\t\t\t\t{\n\t\t\t\t\t\tposition294 := position\n\t\t\t\t\t\tif buffer[position] != rune('.') {\n\t\t\t\t\t\t\tgoto l292\n\t\t\t\t\t\t}\n\t\t\t\t\t\tposition++\n\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\tgoto l292\n\t\t\t\t\t\t}\n\t\t\t\t\tl295:\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition296, tokenIndex296 := position, tokenIndex\n\t\t\t\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\t\t\t\tgoto l296\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tgoto l295\n\t\t\t\t\t\tl296:\n\t\t\t\t\t\t\tposition, tokenIndex = position296, tokenIndex296\n\t\t\t\t\t\t}\n\t\t\t\t\t\tadd(ruletimeSecfrac, position294)\n\t\t\t\t\t}\n\t\t\t\t\tgoto l293\n\t\t\t\tl292:\n\t\t\t\t\tposition, tokenIndex = position292, tokenIndex292\n\t\t\t\t}\n\t\t\tl293:\n\t\t\t\tadd(rulepartialTime, position290)\n\t\t\t}\n\t\t\treturn true\n\t\tl289:\n\t\t\tposition, tokenIndex = position289, tokenIndex289\n\t\t\treturn false\n\t\t},\n\t\t/* 51 fullDate <- <(dateFullYear '-' dateMonth '-' dateMDay)> */\n\t\tnil,\n\t\t/* 52 fullTime <- <(partialTime timeOffset?)> */\n\t\tnil,\n\t\t/* 53 datetime <- <((fullDate ('T' fullTime)?) / partialTime)> */\n\t\tnil,\n\t\t/* 54 digit <- <[0-9]> */\n\t\tfunc() bool {\n\t\t\tposition300, tokenIndex300 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition301 := position\n\t\t\t\tif c := buffer[position]; c < rune('0') || c > rune('9') {\n\t\t\t\t\tgoto l300\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\tadd(ruledigit, position301)\n\t\t\t}\n\t\t\treturn true\n\t\tl300:\n\t\t\tposition, tokenIndex = position300, tokenIndex300\n\t\t\treturn false\n\t\t},\n\t\t/* 55 digitDual <- <(digit digit)> */\n\t\tfunc() bool {\n\t\t\tposition302, tokenIndex302 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition303 := position\n\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\tgoto l302\n\t\t\t\t}\n\t\t\t\tif !_rules[ruledigit]() {\n\t\t\t\t\tgoto l302\n\t\t\t\t}\n\t\t\t\tadd(ruledigitDual, position303)\n\t\t\t}\n\t\t\treturn true\n\t\tl302:\n\t\t\tposition, tokenIndex = position302, tokenIndex302\n\t\t\treturn false\n\t\t},\n\t\t/* 56 digitQuad <- <(digitDual digitDual)> */\n\t\tnil,\n\t\t/* 57 array <- <('[' Action23 wsnl arrayValues? wsnl ']')> */\n\t\tnil,\n\t\t/* 58 arrayValues <- <(val Action24 (wsnl comment? wsnl arraySep wsnl comment? wsnl val Action25)* wsnl arraySep? wsnl comment?)> */\n\t\tnil,\n\t\t/* 59 arraySep <- <','> */\n\t\tfunc() bool {\n\t\t\tposition307, tokenIndex307 := position, tokenIndex\n\t\t\t{\n\t\t\t\tposition308 := position\n\t\t\t\tif buffer[position] != rune(',') {\n\t\t\t\t\tgoto l307\n\t\t\t\t}\n\t\t\t\tposition++\n\t\t\t\tadd(rulearraySep, position308)\n\t\t\t}\n\t\t\treturn true\n\t\tl307:\n\t\t\tposition, tokenIndex = position307, tokenIndex307\n\t\t\treturn false\n\t\t},\n\t\t/* 61 Action0 <- <{ _ = buffer }> */\n\t\tnil,\n\t\tnil,\n\t\t/* 63 Action1 <- <{ p.SetTableString(begin, end) }> */\n\t\tnil,\n\t\t/* 64 Action2 <- <{ p.AddLineCount(end - begin) }> */\n\t\tnil,\n\t\t/* 65 Action3 <- <{ p.AddLineCount(end - begin) }> */\n\t\tnil,\n\t\t/* 66 Action4 <- <{ p.AddKeyValue() }> */\n\t\tnil,\n\t\t/* 67 Action5 <- <{ p.SetKey(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 68 Action6 <- <{ p.SetKey(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 69 Action7 <- <{ p.SetTime(begin, end) }> */\n\t\tnil,\n\t\t/* 70 Action8 <- <{ p.SetFloat64(begin, end) }> */\n\t\tnil,\n\t\t/* 71 Action9 <- <{ p.SetInt64(begin, end) }> */\n\t\tnil,\n\t\t/* 72 Action10 <- <{ p.SetString(begin, end) }> */\n\t\tnil,\n\t\t/* 73 Action11 <- <{ p.SetBool(begin, end) }> */\n\t\tnil,\n\t\t/* 74 Action12 <- <{ p.SetArray(begin, end) }> */\n\t\tnil,\n\t\t/* 75 Action13 <- <{ p.SetTable(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 76 Action14 <- <{ p.SetArrayTable(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 77 Action15 <- <{ p.StartInlineTable() }> */\n\t\tnil,\n\t\t/* 78 Action16 <- <{ p.EndInlineTable() }> */\n\t\tnil,\n\t\t/* 79 Action17 <- <{ p.AddTableKey() }> */\n\t\tnil,\n\t\t/* 80 Action18 <- <{ p.SetBasicString(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 81 Action19 <- <{ p.SetMultilineString() }> */\n\t\tnil,\n\t\t/* 82 Action20 <- <{ p.AddMultilineBasicBody(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 83 Action21 <- <{ p.SetLiteralString(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 84 Action22 <- <{ p.SetMultilineLiteralString(p.buffer, begin, end) }> */\n\t\tnil,\n\t\t/* 85 Action23 <- <{ p.StartArray() }> */\n\t\tnil,\n\t\t/* 86 Action24 <- <{ p.AddArrayVal() }> */\n\t\tnil,\n\t\t/* 87 Action25 <- <{ p.AddArrayVal() }> */\n\t\tnil,\n\t}\n\tp.rules = _rules\n}\n"
  },
  {
    "path": "vendor/github.com/naoina/toml/util.go",
    "content": "package toml\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\nconst fieldTagName = \"toml\"\n\n// fieldCache maps normalized field names to their position in a struct.\ntype fieldCache struct {\n\tnamed map[string]fieldInfo // fields with an explicit name in tag\n\tauto  map[string]fieldInfo // fields with auto-assigned normalized names\n}\n\ntype fieldInfo struct {\n\tindex   []int\n\tname    string\n\tignored bool\n}\n\nfunc makeFieldCache(cfg *Config, rt reflect.Type) fieldCache {\n\tnamed, auto := make(map[string]fieldInfo), make(map[string]fieldInfo)\n\tfor i := 0; i < rt.NumField(); i++ {\n\t\tft := rt.Field(i)\n\t\t// skip unexported fields\n\t\tif ft.PkgPath != \"\" && !ft.Anonymous {\n\t\t\tcontinue\n\t\t}\n\t\tcol, _ := extractTag(ft.Tag.Get(fieldTagName))\n\t\tinfo := fieldInfo{index: ft.Index, name: ft.Name, ignored: col == \"-\"}\n\t\tif col == \"\" || col == \"-\" {\n\t\t\tauto[cfg.NormFieldName(rt, ft.Name)] = info\n\t\t} else {\n\t\t\tnamed[col] = info\n\t\t}\n\t}\n\treturn fieldCache{named, auto}\n}\n\nfunc (fc fieldCache) findField(cfg *Config, rv reflect.Value, name string) (reflect.Value, string, error) {\n\tinfo, found := fc.named[name]\n\tif !found {\n\t\tinfo, found = fc.auto[cfg.NormFieldName(rv.Type(), name)]\n\t}\n\tif !found {\n\t\tif cfg.MissingField == nil {\n\t\t\treturn reflect.Value{}, \"\", fmt.Errorf(\"field corresponding to `%s' is not defined in %v\", name, rv.Type())\n\t\t} else {\n\t\t\treturn reflect.Value{}, \"\", cfg.MissingField(rv.Type(), name)\n\t\t}\n\t} else if info.ignored {\n\t\treturn reflect.Value{}, \"\", fmt.Errorf(\"field corresponding to `%s' in %v cannot be set through TOML\", name, rv.Type())\n\t}\n\treturn rv.FieldByIndex(info.index), info.name, nil\n}\n\nfunc extractTag(tag string) (col, rest string) {\n\ttags := strings.SplitN(tag, \",\", 2)\n\tif len(tags) == 2 {\n\t\treturn strings.TrimSpace(tags[0]), strings.TrimSpace(tags[1])\n\t}\n\treturn strings.TrimSpace(tags[0]), \"\"\n}\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/AUTHORS",
    "content": "# Please keep this file sorted.\n\nGeorg Reinke <guelfey@googlemail.com>\nnsf <no.smile.face@gmail.com>\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/LICENSE",
    "content": "Copyright (C) 2012 termbox-go authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/README.md",
    "content": "## Termbox\nTermbox is a library that provides a minimalistic API which allows the programmer to write text-based user interfaces. The library is crossplatform and has both terminal-based implementations on *nix operating systems and a winapi console based implementation for windows operating systems. The basic idea is an abstraction of the greatest common subset of features available on all major terminals and other terminal-like APIs in a minimalistic fashion. Small API means it is easy to implement, test, maintain and learn it, that's what makes the termbox a distinct library in its area.\n\n### Installation\nInstall and update this go package with `go get -u github.com/nsf/termbox-go`\n\n### Examples\nFor examples of what can be done take a look at demos in the _demos directory. You can try them with go run: `go run _demos/keyboard.go`\n\nThere are also some interesting projects using termbox-go:\n - [godit](https://github.com/nsf/godit) is an emacsish lightweight text editor written using termbox.\n - [gomatrix](https://github.com/GeertJohan/gomatrix) connects to The Matrix and displays its data streams in your terminal.\n - [gotetris](https://github.com/jjinux/gotetris) is an implementation of Tetris.\n - [sokoban-go](https://github.com/rn2dy/sokoban-go) is an implementation of sokoban game.\n - [hecate](https://github.com/evanmiller/hecate) is a hex editor designed by Satan.\n - [httopd](https://github.com/verdverm/httopd) is top for httpd logs.\n - [mop](https://github.com/michaeldv/mop) is stock market tracker for hackers.\n - [termui](https://github.com/gizak/termui) is a terminal dashboard.\n - [termloop](https://github.com/JoelOtter/termloop) is a terminal game engine.\n - [xterm-color-chart](https://github.com/kutuluk/xterm-color-chart) is a XTerm 256 color chart.\n - [gocui](https://github.com/jroimartin/gocui) is a minimalist Go library aimed at creating console user interfaces.\n - [dry](https://github.com/moncho/dry) is an interactive cli to manage Docker containers.\n - [pxl](https://github.com/ichinaski/pxl) displays images in the terminal.\n - [snake-game](https://github.com/DyegoCosta/snake-game) is an implementation of the Snake game.\n - [gone](https://github.com/guillaumebreton/gone) is a CLI pomodoro® timer.\n - [Spoof.go](https://github.com/sabey/spoofgo) controllable movement spoofing from the cli\n - [lf](https://github.com/gokcehan/lf) is a terminal file manager\n - [rat](https://github.com/ericfreese/rat) lets you compose shell commands to build terminal applications.\n\n### API reference\n[godoc.org/github.com/nsf/termbox-go](http://godoc.org/github.com/nsf/termbox-go)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/api.go",
    "content": "// +build !windows\n\npackage termbox\n\nimport \"github.com/mattn/go-runewidth\"\nimport \"fmt\"\nimport \"os\"\nimport \"os/signal\"\nimport \"syscall\"\nimport \"runtime\"\n\n// public API\n\n// Initializes termbox library. This function should be called before any other functions.\n// After successful initialization, the library must be finalized using 'Close' function.\n//\n// Example usage:\n//      err := termbox.Init()\n//      if err != nil {\n//              panic(err)\n//      }\n//      defer termbox.Close()\nfunc Init() error {\n\tvar err error\n\n\tout, err = os.OpenFile(\"/dev/tty\", syscall.O_WRONLY, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tin, err = syscall.Open(\"/dev/tty\", syscall.O_RDONLY, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = setup_term()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"termbox: error while reading terminfo data: %v\", err)\n\t}\n\n\tsignal.Notify(sigwinch, syscall.SIGWINCH)\n\tsignal.Notify(sigio, syscall.SIGIO)\n\n\t_, err = fcntl(in, syscall.F_SETFL, syscall.O_ASYNC|syscall.O_NONBLOCK)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = fcntl(in, syscall.F_SETOWN, syscall.Getpid())\n\tif runtime.GOOS != \"darwin\" && err != nil {\n\t\treturn err\n\t}\n\terr = tcgetattr(out.Fd(), &orig_tios)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttios := orig_tios\n\ttios.Iflag &^= syscall_IGNBRK | syscall_BRKINT | syscall_PARMRK |\n\t\tsyscall_ISTRIP | syscall_INLCR | syscall_IGNCR |\n\t\tsyscall_ICRNL | syscall_IXON\n\ttios.Lflag &^= syscall_ECHO | syscall_ECHONL | syscall_ICANON |\n\t\tsyscall_ISIG | syscall_IEXTEN\n\ttios.Cflag &^= syscall_CSIZE | syscall_PARENB\n\ttios.Cflag |= syscall_CS8\n\ttios.Cc[syscall_VMIN] = 1\n\ttios.Cc[syscall_VTIME] = 0\n\n\terr = tcsetattr(out.Fd(), &tios)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tout.WriteString(funcs[t_enter_ca])\n\tout.WriteString(funcs[t_enter_keypad])\n\tout.WriteString(funcs[t_hide_cursor])\n\tout.WriteString(funcs[t_clear_screen])\n\n\ttermw, termh = get_term_size(out.Fd())\n\tback_buffer.init(termw, termh)\n\tfront_buffer.init(termw, termh)\n\tback_buffer.clear()\n\tfront_buffer.clear()\n\n\tgo func() {\n\t\tbuf := make([]byte, 128)\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-sigio:\n\t\t\t\tfor {\n\t\t\t\t\tn, err := syscall.Read(in, buf)\n\t\t\t\t\tif err == syscall.EAGAIN || err == syscall.EWOULDBLOCK {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tselect {\n\t\t\t\t\tcase input_comm <- input_event{buf[:n], err}:\n\t\t\t\t\t\tie := <-input_comm\n\t\t\t\t\t\tbuf = ie.data[:128]\n\t\t\t\t\tcase <-quit:\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase <-quit:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\tIsInit = true\n\treturn nil\n}\n\n// Interrupt an in-progress call to PollEvent by causing it to return\n// EventInterrupt.  Note that this function will block until the PollEvent\n// function has successfully been interrupted.\nfunc Interrupt() {\n\tinterrupt_comm <- struct{}{}\n}\n\n// Finalizes termbox library, should be called after successful initialization\n// when termbox's functionality isn't required anymore.\nfunc Close() {\n\tquit <- 1\n\tout.WriteString(funcs[t_show_cursor])\n\tout.WriteString(funcs[t_sgr0])\n\tout.WriteString(funcs[t_clear_screen])\n\tout.WriteString(funcs[t_exit_ca])\n\tout.WriteString(funcs[t_exit_keypad])\n\tout.WriteString(funcs[t_exit_mouse])\n\ttcsetattr(out.Fd(), &orig_tios)\n\n\tout.Close()\n\tsyscall.Close(in)\n\n\t// reset the state, so that on next Init() it will work again\n\ttermw = 0\n\ttermh = 0\n\tinput_mode = InputEsc\n\tout = nil\n\tin = 0\n\tlastfg = attr_invalid\n\tlastbg = attr_invalid\n\tlastx = coord_invalid\n\tlasty = coord_invalid\n\tcursor_x = cursor_hidden\n\tcursor_y = cursor_hidden\n\tforeground = ColorDefault\n\tbackground = ColorDefault\n\tIsInit = false\n}\n\n// Synchronizes the internal back buffer with the terminal.\nfunc Flush() error {\n\t// invalidate cursor position\n\tlastx = coord_invalid\n\tlasty = coord_invalid\n\n\tupdate_size_maybe()\n\n\tfor y := 0; y < front_buffer.height; y++ {\n\t\tline_offset := y * front_buffer.width\n\t\tfor x := 0; x < front_buffer.width; {\n\t\t\tcell_offset := line_offset + x\n\t\t\tback := &back_buffer.cells[cell_offset]\n\t\t\tfront := &front_buffer.cells[cell_offset]\n\t\t\tif back.Ch < ' ' {\n\t\t\t\tback.Ch = ' '\n\t\t\t}\n\t\t\tw := runewidth.RuneWidth(back.Ch)\n\t\t\tif w == 0 || w == 2 && runewidth.IsAmbiguousWidth(back.Ch) {\n\t\t\t\tw = 1\n\t\t\t}\n\t\t\tif *back == *front {\n\t\t\t\tx += w\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t*front = *back\n\t\t\tsend_attr(back.Fg, back.Bg)\n\n\t\t\tif w == 2 && x == front_buffer.width-1 {\n\t\t\t\t// there's not enough space for 2-cells rune,\n\t\t\t\t// let's just put a space in there\n\t\t\t\tsend_char(x, y, ' ')\n\t\t\t} else {\n\t\t\t\tsend_char(x, y, back.Ch)\n\t\t\t\tif w == 2 {\n\t\t\t\t\tnext := cell_offset + 1\n\t\t\t\t\tfront_buffer.cells[next] = Cell{\n\t\t\t\t\t\tCh: 0,\n\t\t\t\t\t\tFg: back.Fg,\n\t\t\t\t\t\tBg: back.Bg,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tx += w\n\t\t}\n\t}\n\tif !is_cursor_hidden(cursor_x, cursor_y) {\n\t\twrite_cursor(cursor_x, cursor_y)\n\t}\n\treturn flush()\n}\n\n// Sets the position of the cursor. See also HideCursor().\nfunc SetCursor(x, y int) {\n\tif is_cursor_hidden(cursor_x, cursor_y) && !is_cursor_hidden(x, y) {\n\t\toutbuf.WriteString(funcs[t_show_cursor])\n\t}\n\n\tif !is_cursor_hidden(cursor_x, cursor_y) && is_cursor_hidden(x, y) {\n\t\toutbuf.WriteString(funcs[t_hide_cursor])\n\t}\n\n\tcursor_x, cursor_y = x, y\n\tif !is_cursor_hidden(cursor_x, cursor_y) {\n\t\twrite_cursor(cursor_x, cursor_y)\n\t}\n}\n\n// The shortcut for SetCursor(-1, -1).\nfunc HideCursor() {\n\tSetCursor(cursor_hidden, cursor_hidden)\n}\n\n// Changes cell's parameters in the internal back buffer at the specified\n// position.\nfunc SetCell(x, y int, ch rune, fg, bg Attribute) {\n\tif x < 0 || x >= back_buffer.width {\n\t\treturn\n\t}\n\tif y < 0 || y >= back_buffer.height {\n\t\treturn\n\t}\n\n\tback_buffer.cells[y*back_buffer.width+x] = Cell{ch, fg, bg}\n}\n\n// Returns a slice into the termbox's back buffer. You can get its dimensions\n// using 'Size' function. The slice remains valid as long as no 'Clear' or\n// 'Flush' function calls were made after call to this function.\nfunc CellBuffer() []Cell {\n\treturn back_buffer.cells\n}\n\n// After getting a raw event from PollRawEvent function call, you can parse it\n// again into an ordinary one using termbox logic. That is parse an event as\n// termbox would do it. Returned event in addition to usual Event struct fields\n// sets N field to the amount of bytes used within 'data' slice. If the length\n// of 'data' slice is zero or event cannot be parsed for some other reason, the\n// function will return a special event type: EventNone.\n//\n// IMPORTANT: EventNone may contain a non-zero N, which means you should skip\n// these bytes, because termbox cannot recognize them.\n//\n// NOTE: This API is experimental and may change in future.\nfunc ParseEvent(data []byte) Event {\n\tevent := Event{Type: EventKey}\n\tok := extract_event(data, &event)\n\tif !ok {\n\t\treturn Event{Type: EventNone, N: event.N}\n\t}\n\treturn event\n}\n\n// Wait for an event and return it. This is a blocking function call. Instead\n// of EventKey and EventMouse it returns EventRaw events. Raw event is written\n// into `data` slice and Event's N field is set to the amount of bytes written.\n// The minimum required length of the 'data' slice is 1. This requirement may\n// vary on different platforms.\n//\n// NOTE: This API is experimental and may change in future.\nfunc PollRawEvent(data []byte) Event {\n\tif len(data) == 0 {\n\t\tpanic(\"len(data) >= 1 is a requirement\")\n\t}\n\n\tvar event Event\n\tif extract_raw_event(data, &event) {\n\t\treturn event\n\t}\n\n\tfor {\n\t\tselect {\n\t\tcase ev := <-input_comm:\n\t\t\tif ev.err != nil {\n\t\t\t\treturn Event{Type: EventError, Err: ev.err}\n\t\t\t}\n\n\t\t\tinbuf = append(inbuf, ev.data...)\n\t\t\tinput_comm <- ev\n\t\t\tif extract_raw_event(data, &event) {\n\t\t\t\treturn event\n\t\t\t}\n\t\tcase <-interrupt_comm:\n\t\t\tevent.Type = EventInterrupt\n\t\t\treturn event\n\n\t\tcase <-sigwinch:\n\t\t\tevent.Type = EventResize\n\t\t\tevent.Width, event.Height = get_term_size(out.Fd())\n\t\t\treturn event\n\t\t}\n\t}\n}\n\n// Wait for an event and return it. This is a blocking function call.\nfunc PollEvent() Event {\n\tvar event Event\n\n\t// try to extract event from input buffer, return on success\n\tevent.Type = EventKey\n\tok := extract_event(inbuf, &event)\n\tif event.N != 0 {\n\t\tcopy(inbuf, inbuf[event.N:])\n\t\tinbuf = inbuf[:len(inbuf)-event.N]\n\t}\n\tif ok {\n\t\treturn event\n\t}\n\n\tfor {\n\t\tselect {\n\t\tcase ev := <-input_comm:\n\t\t\tif ev.err != nil {\n\t\t\t\treturn Event{Type: EventError, Err: ev.err}\n\t\t\t}\n\n\t\t\tinbuf = append(inbuf, ev.data...)\n\t\t\tinput_comm <- ev\n\t\t\tok := extract_event(inbuf, &event)\n\t\t\tif event.N != 0 {\n\t\t\t\tcopy(inbuf, inbuf[event.N:])\n\t\t\t\tinbuf = inbuf[:len(inbuf)-event.N]\n\t\t\t}\n\t\t\tif ok {\n\t\t\t\treturn event\n\t\t\t}\n\t\tcase <-interrupt_comm:\n\t\t\tevent.Type = EventInterrupt\n\t\t\treturn event\n\n\t\tcase <-sigwinch:\n\t\t\tevent.Type = EventResize\n\t\t\tevent.Width, event.Height = get_term_size(out.Fd())\n\t\t\treturn event\n\t\t}\n\t}\n}\n\n// Returns the size of the internal back buffer (which is mostly the same as\n// terminal's window size in characters). But it doesn't always match the size\n// of the terminal window, after the terminal size has changed, the internal\n// back buffer will get in sync only after Clear or Flush function calls.\nfunc Size() (width int, height int) {\n\treturn termw, termh\n}\n\n// Clears the internal back buffer.\nfunc Clear(fg, bg Attribute) error {\n\tforeground, background = fg, bg\n\terr := update_size_maybe()\n\tback_buffer.clear()\n\treturn err\n}\n\n// Sets termbox input mode. Termbox has two input modes:\n//\n// 1. Esc input mode. When ESC sequence is in the buffer and it doesn't match\n// any known sequence. ESC means KeyEsc. This is the default input mode.\n//\n// 2. Alt input mode. When ESC sequence is in the buffer and it doesn't match\n// any known sequence. ESC enables ModAlt modifier for the next keyboard event.\n//\n// Both input modes can be OR'ed with Mouse mode. Setting Mouse mode bit up will\n// enable mouse button press/release and drag events.\n//\n// If 'mode' is InputCurrent, returns the current input mode. See also Input*\n// constants.\nfunc SetInputMode(mode InputMode) InputMode {\n\tif mode == InputCurrent {\n\t\treturn input_mode\n\t}\n\tif mode&(InputEsc|InputAlt) == 0 {\n\t\tmode |= InputEsc\n\t}\n\tif mode&(InputEsc|InputAlt) == InputEsc|InputAlt {\n\t\tmode &^= InputAlt\n\t}\n\tif mode&InputMouse != 0 {\n\t\tout.WriteString(funcs[t_enter_mouse])\n\t} else {\n\t\tout.WriteString(funcs[t_exit_mouse])\n\t}\n\n\tinput_mode = mode\n\treturn input_mode\n}\n\n// Sets the termbox output mode. Termbox has four output options:\n//\n// 1. OutputNormal => [1..8]\n//    This mode provides 8 different colors:\n//        black, red, green, yellow, blue, magenta, cyan, white\n//    Shortcut: ColorBlack, ColorRed, ...\n//    Attributes: AttrBold, AttrUnderline, AttrReverse\n//\n//    Example usage:\n//        SetCell(x, y, '@', ColorBlack | AttrBold, ColorRed);\n//\n// 2. Output256 => [1..256]\n//    In this mode you can leverage the 256 terminal mode:\n//    0x01 - 0x08: the 8 colors as in OutputNormal\n//    0x09 - 0x10: Color* | AttrBold\n//    0x11 - 0xe8: 216 different colors\n//    0xe9 - 0x1ff: 24 different shades of grey\n//\n//    Example usage:\n//        SetCell(x, y, '@', 184, 240);\n//        SetCell(x, y, '@', 0xb8, 0xf0);\n//\n// 3. Output216 => [1..216]\n//    This mode supports the 3rd range of the 256 mode only.\n//    But you dont need to provide an offset.\n//\n// 4. OutputGrayscale => [1..26]\n//    This mode supports the 4th range of the 256 mode\n//    and black and white colors from 3th range of the 256 mode\n//    But you dont need to provide an offset.\n//\n// In all modes, 0x00 represents the default color.\n//\n// `go run _demos/output.go` to see its impact on your terminal.\n//\n// If 'mode' is OutputCurrent, it returns the current output mode.\n//\n// Note that this may return a different OutputMode than the one requested,\n// as the requested mode may not be available on the target platform.\nfunc SetOutputMode(mode OutputMode) OutputMode {\n\tif mode == OutputCurrent {\n\t\treturn output_mode\n\t}\n\n\toutput_mode = mode\n\treturn output_mode\n}\n\n// Sync comes handy when something causes desync between termbox's understanding\n// of a terminal buffer and the reality. Such as a third party process. Sync\n// forces a complete resync between the termbox and a terminal, it may not be\n// visually pretty though.\nfunc Sync() error {\n\tfront_buffer.clear()\n\terr := send_clear()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn Flush()\n}\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/api_common.go",
    "content": "// termbox is a library for creating cross-platform text-based interfaces\npackage termbox\n\n// public API, common OS agnostic part\n\ntype (\n\tInputMode  int\n\tOutputMode int\n\tEventType  uint8\n\tModifier   uint8\n\tKey        uint16\n\tAttribute  uint16\n)\n\n// This type represents a termbox event. The 'Mod', 'Key' and 'Ch' fields are\n// valid if 'Type' is EventKey. The 'Width' and 'Height' fields are valid if\n// 'Type' is EventResize. The 'Err' field is valid if 'Type' is EventError.\ntype Event struct {\n\tType   EventType // one of Event* constants\n\tMod    Modifier  // one of Mod* constants or 0\n\tKey    Key       // one of Key* constants, invalid if 'Ch' is not 0\n\tCh     rune      // a unicode character\n\tWidth  int       // width of the screen\n\tHeight int       // height of the screen\n\tErr    error     // error in case if input failed\n\tMouseX int       // x coord of mouse\n\tMouseY int       // y coord of mouse\n\tN      int       // number of bytes written when getting a raw event\n}\n\n// A cell, single conceptual entity on the screen. The screen is basically a 2d\n// array of cells. 'Ch' is a unicode character, 'Fg' and 'Bg' are foreground\n// and background attributes respectively.\ntype Cell struct {\n\tCh rune\n\tFg Attribute\n\tBg Attribute\n}\n\n// To know if termbox has been initialized or not\nvar (\n\tIsInit bool = false\n)\n\n// Key constants, see Event.Key field.\nconst (\n\tKeyF1 Key = 0xFFFF - iota\n\tKeyF2\n\tKeyF3\n\tKeyF4\n\tKeyF5\n\tKeyF6\n\tKeyF7\n\tKeyF8\n\tKeyF9\n\tKeyF10\n\tKeyF11\n\tKeyF12\n\tKeyInsert\n\tKeyDelete\n\tKeyHome\n\tKeyEnd\n\tKeyPgup\n\tKeyPgdn\n\tKeyArrowUp\n\tKeyArrowDown\n\tKeyArrowLeft\n\tKeyArrowRight\n\tkey_min // see terminfo\n\tMouseLeft\n\tMouseMiddle\n\tMouseRight\n\tMouseRelease\n\tMouseWheelUp\n\tMouseWheelDown\n)\n\nconst (\n\tKeyCtrlTilde      Key = 0x00\n\tKeyCtrl2          Key = 0x00\n\tKeyCtrlSpace      Key = 0x00\n\tKeyCtrlA          Key = 0x01\n\tKeyCtrlB          Key = 0x02\n\tKeyCtrlC          Key = 0x03\n\tKeyCtrlD          Key = 0x04\n\tKeyCtrlE          Key = 0x05\n\tKeyCtrlF          Key = 0x06\n\tKeyCtrlG          Key = 0x07\n\tKeyBackspace      Key = 0x08\n\tKeyCtrlH          Key = 0x08\n\tKeyTab            Key = 0x09\n\tKeyCtrlI          Key = 0x09\n\tKeyCtrlJ          Key = 0x0A\n\tKeyCtrlK          Key = 0x0B\n\tKeyCtrlL          Key = 0x0C\n\tKeyEnter          Key = 0x0D\n\tKeyCtrlM          Key = 0x0D\n\tKeyCtrlN          Key = 0x0E\n\tKeyCtrlO          Key = 0x0F\n\tKeyCtrlP          Key = 0x10\n\tKeyCtrlQ          Key = 0x11\n\tKeyCtrlR          Key = 0x12\n\tKeyCtrlS          Key = 0x13\n\tKeyCtrlT          Key = 0x14\n\tKeyCtrlU          Key = 0x15\n\tKeyCtrlV          Key = 0x16\n\tKeyCtrlW          Key = 0x17\n\tKeyCtrlX          Key = 0x18\n\tKeyCtrlY          Key = 0x19\n\tKeyCtrlZ          Key = 0x1A\n\tKeyEsc            Key = 0x1B\n\tKeyCtrlLsqBracket Key = 0x1B\n\tKeyCtrl3          Key = 0x1B\n\tKeyCtrl4          Key = 0x1C\n\tKeyCtrlBackslash  Key = 0x1C\n\tKeyCtrl5          Key = 0x1D\n\tKeyCtrlRsqBracket Key = 0x1D\n\tKeyCtrl6          Key = 0x1E\n\tKeyCtrl7          Key = 0x1F\n\tKeyCtrlSlash      Key = 0x1F\n\tKeyCtrlUnderscore Key = 0x1F\n\tKeySpace          Key = 0x20\n\tKeyBackspace2     Key = 0x7F\n\tKeyCtrl8          Key = 0x7F\n)\n\n// Alt modifier constant, see Event.Mod field and SetInputMode function.\nconst (\n\tModAlt Modifier = 1 << iota\n\tModMotion\n)\n\n// Cell colors, you can combine a color with multiple attributes using bitwise\n// OR ('|').\nconst (\n\tColorDefault Attribute = iota\n\tColorBlack\n\tColorRed\n\tColorGreen\n\tColorYellow\n\tColorBlue\n\tColorMagenta\n\tColorCyan\n\tColorWhite\n)\n\n// Cell attributes, it is possible to use multiple attributes by combining them\n// using bitwise OR ('|'). Although, colors cannot be combined. But you can\n// combine attributes and a single color.\n//\n// It's worth mentioning that some platforms don't support certain attibutes.\n// For example windows console doesn't support AttrUnderline. And on some\n// terminals applying AttrBold to background may result in blinking text. Use\n// them with caution and test your code on various terminals.\nconst (\n\tAttrBold Attribute = 1 << (iota + 9)\n\tAttrUnderline\n\tAttrReverse\n)\n\n// Input mode. See SetInputMode function.\nconst (\n\tInputEsc InputMode = 1 << iota\n\tInputAlt\n\tInputMouse\n\tInputCurrent InputMode = 0\n)\n\n// Output mode. See SetOutputMode function.\nconst (\n\tOutputCurrent OutputMode = iota\n\tOutputNormal\n\tOutput256\n\tOutput216\n\tOutputGrayscale\n)\n\n// Event type. See Event.Type field.\nconst (\n\tEventKey EventType = iota\n\tEventResize\n\tEventMouse\n\tEventError\n\tEventInterrupt\n\tEventRaw\n\tEventNone\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/api_windows.go",
    "content": "package termbox\n\nimport (\n\t\"syscall\"\n)\n\n// public API\n\n// Initializes termbox library. This function should be called before any other functions.\n// After successful initialization, the library must be finalized using 'Close' function.\n//\n// Example usage:\n//      err := termbox.Init()\n//      if err != nil {\n//              panic(err)\n//      }\n//      defer termbox.Close()\nfunc Init() error {\n\tvar err error\n\n\tinterrupt, err = create_event()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tin, err = syscall.Open(\"CONIN$\", syscall.O_RDWR, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tout, err = syscall.Open(\"CONOUT$\", syscall.O_RDWR, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = get_console_mode(in, &orig_mode)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = set_console_mode(in, enable_window_input)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\torig_size = get_term_size(out)\n\twin_size := get_win_size(out)\n\n\terr = set_console_screen_buffer_size(out, win_size)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = get_console_cursor_info(out, &orig_cursor_info)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tshow_cursor(false)\n\tterm_size = get_term_size(out)\n\tback_buffer.init(int(term_size.x), int(term_size.y))\n\tfront_buffer.init(int(term_size.x), int(term_size.y))\n\tback_buffer.clear()\n\tfront_buffer.clear()\n\tclear()\n\n\tdiffbuf = make([]diff_msg, 0, 32)\n\n\tgo input_event_producer()\n\tIsInit = true\n\treturn nil\n}\n\n// Finalizes termbox library, should be called after successful initialization\n// when termbox's functionality isn't required anymore.\nfunc Close() {\n\t// we ignore errors here, because we can't really do anything about them\n\tClear(0, 0)\n\tFlush()\n\n\t// stop event producer\n\tcancel_comm <- true\n\tset_event(interrupt)\n\tselect {\n\tcase <-input_comm:\n\tdefault:\n\t}\n\t<-cancel_done_comm\n\n\tset_console_cursor_info(out, &orig_cursor_info)\n\tset_console_cursor_position(out, coord{})\n\tset_console_screen_buffer_size(out, orig_size)\n\tset_console_mode(in, orig_mode)\n\tsyscall.Close(in)\n\tsyscall.Close(out)\n\tsyscall.Close(interrupt)\n\tIsInit = false\n}\n\n// Interrupt an in-progress call to PollEvent by causing it to return\n// EventInterrupt.  Note that this function will block until the PollEvent\n// function has successfully been interrupted.\nfunc Interrupt() {\n\tinterrupt_comm <- struct{}{}\n}\n\n// Synchronizes the internal back buffer with the terminal.\nfunc Flush() error {\n\tupdate_size_maybe()\n\tprepare_diff_messages()\n\tfor _, diff := range diffbuf {\n\t\tr := small_rect{\n\t\t\tleft:   0,\n\t\t\ttop:    diff.pos,\n\t\t\tright:  term_size.x - 1,\n\t\t\tbottom: diff.pos + diff.lines - 1,\n\t\t}\n\t\twrite_console_output(out, diff.chars, r)\n\t}\n\tif !is_cursor_hidden(cursor_x, cursor_y) {\n\t\tmove_cursor(cursor_x, cursor_y)\n\t}\n\treturn nil\n}\n\n// Sets the position of the cursor. See also HideCursor().\nfunc SetCursor(x, y int) {\n\tif is_cursor_hidden(cursor_x, cursor_y) && !is_cursor_hidden(x, y) {\n\t\tshow_cursor(true)\n\t}\n\n\tif !is_cursor_hidden(cursor_x, cursor_y) && is_cursor_hidden(x, y) {\n\t\tshow_cursor(false)\n\t}\n\n\tcursor_x, cursor_y = x, y\n\tif !is_cursor_hidden(cursor_x, cursor_y) {\n\t\tmove_cursor(cursor_x, cursor_y)\n\t}\n}\n\n// The shortcut for SetCursor(-1, -1).\nfunc HideCursor() {\n\tSetCursor(cursor_hidden, cursor_hidden)\n}\n\n// Changes cell's parameters in the internal back buffer at the specified\n// position.\nfunc SetCell(x, y int, ch rune, fg, bg Attribute) {\n\tif x < 0 || x >= back_buffer.width {\n\t\treturn\n\t}\n\tif y < 0 || y >= back_buffer.height {\n\t\treturn\n\t}\n\n\tback_buffer.cells[y*back_buffer.width+x] = Cell{ch, fg, bg}\n}\n\n// Returns a slice into the termbox's back buffer. You can get its dimensions\n// using 'Size' function. The slice remains valid as long as no 'Clear' or\n// 'Flush' function calls were made after call to this function.\nfunc CellBuffer() []Cell {\n\treturn back_buffer.cells\n}\n\n// Wait for an event and return it. This is a blocking function call.\nfunc PollEvent() Event {\n\tselect {\n\tcase ev := <-input_comm:\n\t\treturn ev\n\tcase <-interrupt_comm:\n\t\treturn Event{Type: EventInterrupt}\n\t}\n}\n\n// Returns the size of the internal back buffer (which is mostly the same as\n// console's window size in characters). But it doesn't always match the size\n// of the console window, after the console size has changed, the internal back\n// buffer will get in sync only after Clear or Flush function calls.\nfunc Size() (int, int) {\n\treturn int(term_size.x), int(term_size.y)\n}\n\n// Clears the internal back buffer.\nfunc Clear(fg, bg Attribute) error {\n\tforeground, background = fg, bg\n\tupdate_size_maybe()\n\tback_buffer.clear()\n\treturn nil\n}\n\n// Sets termbox input mode. Termbox has two input modes:\n//\n// 1. Esc input mode. When ESC sequence is in the buffer and it doesn't match\n// any known sequence. ESC means KeyEsc. This is the default input mode.\n//\n// 2. Alt input mode. When ESC sequence is in the buffer and it doesn't match\n// any known sequence. ESC enables ModAlt modifier for the next keyboard event.\n//\n// Both input modes can be OR'ed with Mouse mode. Setting Mouse mode bit up will\n// enable mouse button press/release and drag events.\n//\n// If 'mode' is InputCurrent, returns the current input mode. See also Input*\n// constants.\nfunc SetInputMode(mode InputMode) InputMode {\n\tif mode == InputCurrent {\n\t\treturn input_mode\n\t}\n\tif mode&InputMouse != 0 {\n\t\terr := set_console_mode(in, enable_window_input|enable_mouse_input|enable_extended_flags)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t} else {\n\t\terr := set_console_mode(in, enable_window_input)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\tinput_mode = mode\n\treturn input_mode\n}\n\n// Sets the termbox output mode.\n//\n// Windows console does not support extra colour modes,\n// so this will always set and return OutputNormal.\nfunc SetOutputMode(mode OutputMode) OutputMode {\n\treturn OutputNormal\n}\n\n// Sync comes handy when something causes desync between termbox's understanding\n// of a terminal buffer and the reality. Such as a third party process. Sync\n// forces a complete resync between the termbox and a terminal, it may not be\n// visually pretty though. At the moment on Windows it does nothing.\nfunc Sync() error {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/collect_terminfo.py",
    "content": "#!/usr/bin/env python\n\nimport sys, os, subprocess\n\ndef escaped(s):\n\treturn repr(s)[1:-1]\n\ndef tput(term, name):\n\ttry:\n\t\treturn subprocess.check_output(['tput', '-T%s' % term, name]).decode()\n\texcept subprocess.CalledProcessError as e:\n\t\treturn e.output.decode()\n\n\ndef w(s):\n\tif s == None:\n\t\treturn\n\tsys.stdout.write(s)\n\nterminals = {\n\t'xterm' : 'xterm',\n\t'rxvt-256color' : 'rxvt_256color',\n\t'rxvt-unicode' : 'rxvt_unicode',\n\t'linux' : 'linux',\n\t'Eterm' : 'eterm',\n\t'screen' : 'screen'\n}\n\nkeys = [\n\t\"F1\",\t\t\"kf1\",\n\t\"F2\",\t\t\"kf2\",\n\t\"F3\",\t\t\"kf3\",\n\t\"F4\",\t\t\"kf4\",\n\t\"F5\",\t\t\"kf5\",\n\t\"F6\",\t\t\"kf6\",\n\t\"F7\",\t\t\"kf7\",\n\t\"F8\",\t\t\"kf8\",\n\t\"F9\",\t\t\"kf9\",\n\t\"F10\",\t\t\"kf10\",\n\t\"F11\",\t\t\"kf11\",\n\t\"F12\",\t\t\"kf12\",\n\t\"INSERT\",\t\"kich1\",\n\t\"DELETE\",\t\"kdch1\",\n\t\"HOME\",\t\t\"khome\",\n\t\"END\",\t\t\"kend\",\n\t\"PGUP\",\t\t\"kpp\",\n\t\"PGDN\",\t\t\"knp\",\n\t\"KEY_UP\",\t\"kcuu1\",\n\t\"KEY_DOWN\",\t\"kcud1\",\n\t\"KEY_LEFT\",\t\"kcub1\",\n\t\"KEY_RIGHT\",\t\"kcuf1\"\n]\n\nfuncs = [\n\t\"T_ENTER_CA\",\t\t\"smcup\",\n\t\"T_EXIT_CA\",\t\t\"rmcup\",\n\t\"T_SHOW_CURSOR\",\t\"cnorm\",\n\t\"T_HIDE_CURSOR\",\t\"civis\",\n\t\"T_CLEAR_SCREEN\",\t\"clear\",\n\t\"T_SGR0\",\t\t\"sgr0\",\n\t\"T_UNDERLINE\",\t\t\"smul\",\n\t\"T_BOLD\",\t\t\"bold\",\n\t\"T_BLINK\",\t\t\"blink\",\n\t\"T_REVERSE\",            \"rev\",\n\t\"T_ENTER_KEYPAD\",\t\"smkx\",\n\t\"T_EXIT_KEYPAD\",\t\"rmkx\"\n]\n\ndef iter_pairs(iterable):\n\titerable = iter(iterable)\n\twhile True:\n\t\tyield (next(iterable), next(iterable))\n\ndef do_term(term, nick):\n\tw(\"// %s\\n\" % term)\n\tw(\"var %s_keys = []string{\\n\\t\" % nick)\n\tfor k, v in iter_pairs(keys):\n\t\tw('\"')\n\t\tw(escaped(tput(term, v)))\n\t\tw('\",')\n\tw(\"\\n}\\n\")\n\tw(\"var %s_funcs = []string{\\n\\t\" % nick)\n\tfor k,v in iter_pairs(funcs):\n\t\tw('\"')\n\t\tif v == \"sgr\":\n\t\t\tw(\"\\\\033[3%d;4%dm\")\n\t\telif v == \"cup\":\n\t\t\tw(\"\\\\033[%d;%dH\")\n\t\telse:\n\t\t\tw(escaped(tput(term, v)))\n\t\tw('\", ')\n\tw(\"\\n}\\n\\n\")\n\ndef do_terms(d):\n\tw(\"var terms = []struct {\\n\")\n\tw(\"\\tname  string\\n\")\n\tw(\"\\tkeys  []string\\n\")\n\tw(\"\\tfuncs []string\\n\")\n\tw(\"}{\\n\")\n\tfor k, v in d.items():\n\t\tw('\\t{\"%s\", %s_keys, %s_funcs},\\n' % (k, v, v))\n\tw(\"}\\n\\n\")\n\nw(\"// +build !windows\\n\\npackage termbox\\n\\n\")\n\nfor k,v in terminals.items():\n\tdo_term(k, v)\n\ndo_terms(terminals)\n\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls.go",
    "content": "// +build ignore\n\npackage termbox\n\n/*\n#include <termios.h>\n#include <sys/ioctl.h>\n*/\nimport \"C\"\n\ntype syscall_Termios C.struct_termios\n\nconst (\n\tsyscall_IGNBRK = C.IGNBRK\n\tsyscall_BRKINT = C.BRKINT\n\tsyscall_PARMRK = C.PARMRK\n\tsyscall_ISTRIP = C.ISTRIP\n\tsyscall_INLCR  = C.INLCR\n\tsyscall_IGNCR  = C.IGNCR\n\tsyscall_ICRNL  = C.ICRNL\n\tsyscall_IXON   = C.IXON\n\tsyscall_OPOST  = C.OPOST\n\tsyscall_ECHO   = C.ECHO\n\tsyscall_ECHONL = C.ECHONL\n\tsyscall_ICANON = C.ICANON\n\tsyscall_ISIG   = C.ISIG\n\tsyscall_IEXTEN = C.IEXTEN\n\tsyscall_CSIZE  = C.CSIZE\n\tsyscall_PARENB = C.PARENB\n\tsyscall_CS8    = C.CS8\n\tsyscall_VMIN   = C.VMIN\n\tsyscall_VTIME  = C.VTIME\n\n\t// on darwin change these to (on *bsd too?):\n\t// C.TIOCGETA\n\t// C.TIOCSETA\n\tsyscall_TCGETS = C.TCGETS\n\tsyscall_TCSETS = C.TCSETS\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_darwin.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs syscalls.go\n\n// +build !amd64\n\npackage termbox\n\ntype syscall_Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\nconst (\n\tsyscall_IGNBRK = 0x1\n\tsyscall_BRKINT = 0x2\n\tsyscall_PARMRK = 0x8\n\tsyscall_ISTRIP = 0x20\n\tsyscall_INLCR  = 0x40\n\tsyscall_IGNCR  = 0x80\n\tsyscall_ICRNL  = 0x100\n\tsyscall_IXON   = 0x200\n\tsyscall_OPOST  = 0x1\n\tsyscall_ECHO   = 0x8\n\tsyscall_ECHONL = 0x10\n\tsyscall_ICANON = 0x100\n\tsyscall_ISIG   = 0x80\n\tsyscall_IEXTEN = 0x400\n\tsyscall_CSIZE  = 0x300\n\tsyscall_PARENB = 0x1000\n\tsyscall_CS8    = 0x300\n\tsyscall_VMIN   = 0x10\n\tsyscall_VTIME  = 0x11\n\n\tsyscall_TCGETS = 0x402c7413\n\tsyscall_TCSETS = 0x802c7414\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_darwin_amd64.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs syscalls.go\n\npackage termbox\n\ntype syscall_Termios struct {\n\tIflag     uint64\n\tOflag     uint64\n\tCflag     uint64\n\tLflag     uint64\n\tCc        [20]uint8\n\tPad_cgo_0 [4]byte\n\tIspeed    uint64\n\tOspeed    uint64\n}\n\nconst (\n\tsyscall_IGNBRK = 0x1\n\tsyscall_BRKINT = 0x2\n\tsyscall_PARMRK = 0x8\n\tsyscall_ISTRIP = 0x20\n\tsyscall_INLCR  = 0x40\n\tsyscall_IGNCR  = 0x80\n\tsyscall_ICRNL  = 0x100\n\tsyscall_IXON   = 0x200\n\tsyscall_OPOST  = 0x1\n\tsyscall_ECHO   = 0x8\n\tsyscall_ECHONL = 0x10\n\tsyscall_ICANON = 0x100\n\tsyscall_ISIG   = 0x80\n\tsyscall_IEXTEN = 0x400\n\tsyscall_CSIZE  = 0x300\n\tsyscall_PARENB = 0x1000\n\tsyscall_CS8    = 0x300\n\tsyscall_VMIN   = 0x10\n\tsyscall_VTIME  = 0x11\n\n\tsyscall_TCGETS = 0x40487413\n\tsyscall_TCSETS = 0x80487414\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_dragonfly.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs syscalls.go\n\npackage termbox\n\ntype syscall_Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\nconst (\n\tsyscall_IGNBRK = 0x1\n\tsyscall_BRKINT = 0x2\n\tsyscall_PARMRK = 0x8\n\tsyscall_ISTRIP = 0x20\n\tsyscall_INLCR  = 0x40\n\tsyscall_IGNCR  = 0x80\n\tsyscall_ICRNL  = 0x100\n\tsyscall_IXON   = 0x200\n\tsyscall_OPOST  = 0x1\n\tsyscall_ECHO   = 0x8\n\tsyscall_ECHONL = 0x10\n\tsyscall_ICANON = 0x100\n\tsyscall_ISIG   = 0x80\n\tsyscall_IEXTEN = 0x400\n\tsyscall_CSIZE  = 0x300\n\tsyscall_PARENB = 0x1000\n\tsyscall_CS8    = 0x300\n\tsyscall_VMIN   = 0x10\n\tsyscall_VTIME  = 0x11\n\n\tsyscall_TCGETS = 0x402c7413\n\tsyscall_TCSETS = 0x802c7414\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_freebsd.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs syscalls.go\n\npackage termbox\n\ntype syscall_Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\nconst (\n\tsyscall_IGNBRK = 0x1\n\tsyscall_BRKINT = 0x2\n\tsyscall_PARMRK = 0x8\n\tsyscall_ISTRIP = 0x20\n\tsyscall_INLCR  = 0x40\n\tsyscall_IGNCR  = 0x80\n\tsyscall_ICRNL  = 0x100\n\tsyscall_IXON   = 0x200\n\tsyscall_OPOST  = 0x1\n\tsyscall_ECHO   = 0x8\n\tsyscall_ECHONL = 0x10\n\tsyscall_ICANON = 0x100\n\tsyscall_ISIG   = 0x80\n\tsyscall_IEXTEN = 0x400\n\tsyscall_CSIZE  = 0x300\n\tsyscall_PARENB = 0x1000\n\tsyscall_CS8    = 0x300\n\tsyscall_VMIN   = 0x10\n\tsyscall_VTIME  = 0x11\n\n\tsyscall_TCGETS = 0x402c7413\n\tsyscall_TCSETS = 0x802c7414\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_linux.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs syscalls.go\n\npackage termbox\n\nimport \"syscall\"\n\ntype syscall_Termios syscall.Termios\n\nconst (\n\tsyscall_IGNBRK = syscall.IGNBRK\n\tsyscall_BRKINT = syscall.BRKINT\n\tsyscall_PARMRK = syscall.PARMRK\n\tsyscall_ISTRIP = syscall.ISTRIP\n\tsyscall_INLCR  = syscall.INLCR\n\tsyscall_IGNCR  = syscall.IGNCR\n\tsyscall_ICRNL  = syscall.ICRNL\n\tsyscall_IXON   = syscall.IXON\n\tsyscall_OPOST  = syscall.OPOST\n\tsyscall_ECHO   = syscall.ECHO\n\tsyscall_ECHONL = syscall.ECHONL\n\tsyscall_ICANON = syscall.ICANON\n\tsyscall_ISIG   = syscall.ISIG\n\tsyscall_IEXTEN = syscall.IEXTEN\n\tsyscall_CSIZE  = syscall.CSIZE\n\tsyscall_PARENB = syscall.PARENB\n\tsyscall_CS8    = syscall.CS8\n\tsyscall_VMIN   = syscall.VMIN\n\tsyscall_VTIME  = syscall.VTIME\n\n\tsyscall_TCGETS = syscall.TCGETS\n\tsyscall_TCSETS = syscall.TCSETS\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_netbsd.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs syscalls.go\n\npackage termbox\n\ntype syscall_Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\nconst (\n\tsyscall_IGNBRK = 0x1\n\tsyscall_BRKINT = 0x2\n\tsyscall_PARMRK = 0x8\n\tsyscall_ISTRIP = 0x20\n\tsyscall_INLCR  = 0x40\n\tsyscall_IGNCR  = 0x80\n\tsyscall_ICRNL  = 0x100\n\tsyscall_IXON   = 0x200\n\tsyscall_OPOST  = 0x1\n\tsyscall_ECHO   = 0x8\n\tsyscall_ECHONL = 0x10\n\tsyscall_ICANON = 0x100\n\tsyscall_ISIG   = 0x80\n\tsyscall_IEXTEN = 0x400\n\tsyscall_CSIZE  = 0x300\n\tsyscall_PARENB = 0x1000\n\tsyscall_CS8    = 0x300\n\tsyscall_VMIN   = 0x10\n\tsyscall_VTIME  = 0x11\n\n\tsyscall_TCGETS = 0x402c7413\n\tsyscall_TCSETS = 0x802c7414\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_openbsd.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs syscalls.go\n\npackage termbox\n\ntype syscall_Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\nconst (\n\tsyscall_IGNBRK = 0x1\n\tsyscall_BRKINT = 0x2\n\tsyscall_PARMRK = 0x8\n\tsyscall_ISTRIP = 0x20\n\tsyscall_INLCR  = 0x40\n\tsyscall_IGNCR  = 0x80\n\tsyscall_ICRNL  = 0x100\n\tsyscall_IXON   = 0x200\n\tsyscall_OPOST  = 0x1\n\tsyscall_ECHO   = 0x8\n\tsyscall_ECHONL = 0x10\n\tsyscall_ICANON = 0x100\n\tsyscall_ISIG   = 0x80\n\tsyscall_IEXTEN = 0x400\n\tsyscall_CSIZE  = 0x300\n\tsyscall_PARENB = 0x1000\n\tsyscall_CS8    = 0x300\n\tsyscall_VMIN   = 0x10\n\tsyscall_VTIME  = 0x11\n\n\tsyscall_TCGETS = 0x402c7413\n\tsyscall_TCSETS = 0x802c7414\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/syscalls_windows.go",
    "content": "// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -DUNICODE syscalls.go\n\npackage termbox\n\nconst (\n\tforeground_blue          = 0x1\n\tforeground_green         = 0x2\n\tforeground_red           = 0x4\n\tforeground_intensity     = 0x8\n\tbackground_blue          = 0x10\n\tbackground_green         = 0x20\n\tbackground_red           = 0x40\n\tbackground_intensity     = 0x80\n\tstd_input_handle         = -0xa\n\tstd_output_handle        = -0xb\n\tkey_event                = 0x1\n\tmouse_event              = 0x2\n\twindow_buffer_size_event = 0x4\n\tenable_window_input      = 0x8\n\tenable_mouse_input       = 0x10\n\tenable_extended_flags    = 0x80\n\n\tvk_f1          = 0x70\n\tvk_f2          = 0x71\n\tvk_f3          = 0x72\n\tvk_f4          = 0x73\n\tvk_f5          = 0x74\n\tvk_f6          = 0x75\n\tvk_f7          = 0x76\n\tvk_f8          = 0x77\n\tvk_f9          = 0x78\n\tvk_f10         = 0x79\n\tvk_f11         = 0x7a\n\tvk_f12         = 0x7b\n\tvk_insert      = 0x2d\n\tvk_delete      = 0x2e\n\tvk_home        = 0x24\n\tvk_end         = 0x23\n\tvk_pgup        = 0x21\n\tvk_pgdn        = 0x22\n\tvk_arrow_up    = 0x26\n\tvk_arrow_down  = 0x28\n\tvk_arrow_left  = 0x25\n\tvk_arrow_right = 0x27\n\tvk_backspace   = 0x8\n\tvk_tab         = 0x9\n\tvk_enter       = 0xd\n\tvk_esc         = 0x1b\n\tvk_space       = 0x20\n\n\tleft_alt_pressed   = 0x2\n\tleft_ctrl_pressed  = 0x8\n\tright_alt_pressed  = 0x1\n\tright_ctrl_pressed = 0x4\n\tshift_pressed      = 0x10\n\n\tgeneric_read            = 0x80000000\n\tgeneric_write           = 0x40000000\n\tconsole_textmode_buffer = 0x1\n)\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/termbox.go",
    "content": "// +build !windows\n\npackage termbox\n\nimport \"unicode/utf8\"\nimport \"bytes\"\nimport \"syscall\"\nimport \"unsafe\"\nimport \"strings\"\nimport \"strconv\"\nimport \"os\"\nimport \"io\"\n\n// private API\n\nconst (\n\tt_enter_ca = iota\n\tt_exit_ca\n\tt_show_cursor\n\tt_hide_cursor\n\tt_clear_screen\n\tt_sgr0\n\tt_underline\n\tt_bold\n\tt_blink\n\tt_reverse\n\tt_enter_keypad\n\tt_exit_keypad\n\tt_enter_mouse\n\tt_exit_mouse\n\tt_max_funcs\n)\n\nconst (\n\tcoord_invalid = -2\n\tattr_invalid  = Attribute(0xFFFF)\n)\n\ntype input_event struct {\n\tdata []byte\n\terr  error\n}\n\nvar (\n\t// term specific sequences\n\tkeys  []string\n\tfuncs []string\n\n\t// termbox inner state\n\torig_tios      syscall_Termios\n\tback_buffer    cellbuf\n\tfront_buffer   cellbuf\n\ttermw          int\n\ttermh          int\n\tinput_mode     = InputEsc\n\toutput_mode    = OutputNormal\n\tout            *os.File\n\tin             int\n\tlastfg         = attr_invalid\n\tlastbg         = attr_invalid\n\tlastx          = coord_invalid\n\tlasty          = coord_invalid\n\tcursor_x       = cursor_hidden\n\tcursor_y       = cursor_hidden\n\tforeground     = ColorDefault\n\tbackground     = ColorDefault\n\tinbuf          = make([]byte, 0, 64)\n\toutbuf         bytes.Buffer\n\tsigwinch       = make(chan os.Signal, 1)\n\tsigio          = make(chan os.Signal, 1)\n\tquit           = make(chan int)\n\tinput_comm     = make(chan input_event)\n\tinterrupt_comm = make(chan struct{})\n\tintbuf         = make([]byte, 0, 16)\n\n\t// grayscale indexes\n\tgrayscale = []Attribute{\n\t\t0, 17, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,\n\t\t245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 232,\n\t}\n)\n\nfunc write_cursor(x, y int) {\n\toutbuf.WriteString(\"\\033[\")\n\toutbuf.Write(strconv.AppendUint(intbuf, uint64(y+1), 10))\n\toutbuf.WriteString(\";\")\n\toutbuf.Write(strconv.AppendUint(intbuf, uint64(x+1), 10))\n\toutbuf.WriteString(\"H\")\n}\n\nfunc write_sgr_fg(a Attribute) {\n\tswitch output_mode {\n\tcase Output256, Output216, OutputGrayscale:\n\t\toutbuf.WriteString(\"\\033[38;5;\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10))\n\t\toutbuf.WriteString(\"m\")\n\tdefault:\n\t\toutbuf.WriteString(\"\\033[3\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10))\n\t\toutbuf.WriteString(\"m\")\n\t}\n}\n\nfunc write_sgr_bg(a Attribute) {\n\tswitch output_mode {\n\tcase Output256, Output216, OutputGrayscale:\n\t\toutbuf.WriteString(\"\\033[48;5;\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10))\n\t\toutbuf.WriteString(\"m\")\n\tdefault:\n\t\toutbuf.WriteString(\"\\033[4\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10))\n\t\toutbuf.WriteString(\"m\")\n\t}\n}\n\nfunc write_sgr(fg, bg Attribute) {\n\tswitch output_mode {\n\tcase Output256, Output216, OutputGrayscale:\n\t\toutbuf.WriteString(\"\\033[38;5;\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(fg-1), 10))\n\t\toutbuf.WriteString(\"m\")\n\t\toutbuf.WriteString(\"\\033[48;5;\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(bg-1), 10))\n\t\toutbuf.WriteString(\"m\")\n\tdefault:\n\t\toutbuf.WriteString(\"\\033[3\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(fg-1), 10))\n\t\toutbuf.WriteString(\";4\")\n\t\toutbuf.Write(strconv.AppendUint(intbuf, uint64(bg-1), 10))\n\t\toutbuf.WriteString(\"m\")\n\t}\n}\n\ntype winsize struct {\n\trows    uint16\n\tcols    uint16\n\txpixels uint16\n\typixels uint16\n}\n\nfunc get_term_size(fd uintptr) (int, int) {\n\tvar sz winsize\n\t_, _, _ = syscall.Syscall(syscall.SYS_IOCTL,\n\t\tfd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&sz)))\n\treturn int(sz.cols), int(sz.rows)\n}\n\nfunc send_attr(fg, bg Attribute) {\n\tif fg == lastfg && bg == lastbg {\n\t\treturn\n\t}\n\n\toutbuf.WriteString(funcs[t_sgr0])\n\n\tvar fgcol, bgcol Attribute\n\n\tswitch output_mode {\n\tcase Output256:\n\t\tfgcol = fg & 0x1FF\n\t\tbgcol = bg & 0x1FF\n\tcase Output216:\n\t\tfgcol = fg & 0xFF\n\t\tbgcol = bg & 0xFF\n\t\tif fgcol > 216 {\n\t\t\tfgcol = ColorDefault\n\t\t}\n\t\tif bgcol > 216 {\n\t\t\tbgcol = ColorDefault\n\t\t}\n\t\tif fgcol != ColorDefault {\n\t\t\tfgcol += 0x10\n\t\t}\n\t\tif bgcol != ColorDefault {\n\t\t\tbgcol += 0x10\n\t\t}\n\tcase OutputGrayscale:\n\t\tfgcol = fg & 0x1F\n\t\tbgcol = bg & 0x1F\n\t\tif fgcol > 26 {\n\t\t\tfgcol = ColorDefault\n\t\t}\n\t\tif bgcol > 26 {\n\t\t\tbgcol = ColorDefault\n\t\t}\n\t\tif fgcol != ColorDefault {\n\t\t\tfgcol = grayscale[fgcol]\n\t\t}\n\t\tif bgcol != ColorDefault {\n\t\t\tbgcol = grayscale[bgcol]\n\t\t}\n\tdefault:\n\t\tfgcol = fg & 0x0F\n\t\tbgcol = bg & 0x0F\n\t}\n\n\tif fgcol != ColorDefault {\n\t\tif bgcol != ColorDefault {\n\t\t\twrite_sgr(fgcol, bgcol)\n\t\t} else {\n\t\t\twrite_sgr_fg(fgcol)\n\t\t}\n\t} else if bgcol != ColorDefault {\n\t\twrite_sgr_bg(bgcol)\n\t}\n\n\tif fg&AttrBold != 0 {\n\t\toutbuf.WriteString(funcs[t_bold])\n\t}\n\tif bg&AttrBold != 0 {\n\t\toutbuf.WriteString(funcs[t_blink])\n\t}\n\tif fg&AttrUnderline != 0 {\n\t\toutbuf.WriteString(funcs[t_underline])\n\t}\n\tif fg&AttrReverse|bg&AttrReverse != 0 {\n\t\toutbuf.WriteString(funcs[t_reverse])\n\t}\n\n\tlastfg, lastbg = fg, bg\n}\n\nfunc send_char(x, y int, ch rune) {\n\tvar buf [8]byte\n\tn := utf8.EncodeRune(buf[:], ch)\n\tif x-1 != lastx || y != lasty {\n\t\twrite_cursor(x, y)\n\t}\n\tlastx, lasty = x, y\n\toutbuf.Write(buf[:n])\n}\n\nfunc flush() error {\n\t_, err := io.Copy(out, &outbuf)\n\toutbuf.Reset()\n\treturn err\n}\n\nfunc send_clear() error {\n\tsend_attr(foreground, background)\n\toutbuf.WriteString(funcs[t_clear_screen])\n\tif !is_cursor_hidden(cursor_x, cursor_y) {\n\t\twrite_cursor(cursor_x, cursor_y)\n\t}\n\n\t// we need to invalidate cursor position too and these two vars are\n\t// used only for simple cursor positioning optimization, cursor\n\t// actually may be in the correct place, but we simply discard\n\t// optimization once and it gives us simple solution for the case when\n\t// cursor moved\n\tlastx = coord_invalid\n\tlasty = coord_invalid\n\n\treturn flush()\n}\n\nfunc update_size_maybe() error {\n\tw, h := get_term_size(out.Fd())\n\tif w != termw || h != termh {\n\t\ttermw, termh = w, h\n\t\tback_buffer.resize(termw, termh)\n\t\tfront_buffer.resize(termw, termh)\n\t\tfront_buffer.clear()\n\t\treturn send_clear()\n\t}\n\treturn nil\n}\n\nfunc tcsetattr(fd uintptr, termios *syscall_Termios) error {\n\tr, _, e := syscall.Syscall(syscall.SYS_IOCTL,\n\t\tfd, uintptr(syscall_TCSETS), uintptr(unsafe.Pointer(termios)))\n\tif r != 0 {\n\t\treturn os.NewSyscallError(\"SYS_IOCTL\", e)\n\t}\n\treturn nil\n}\n\nfunc tcgetattr(fd uintptr, termios *syscall_Termios) error {\n\tr, _, e := syscall.Syscall(syscall.SYS_IOCTL,\n\t\tfd, uintptr(syscall_TCGETS), uintptr(unsafe.Pointer(termios)))\n\tif r != 0 {\n\t\treturn os.NewSyscallError(\"SYS_IOCTL\", e)\n\t}\n\treturn nil\n}\n\nfunc parse_mouse_event(event *Event, buf string) (int, bool) {\n\tif strings.HasPrefix(buf, \"\\033[M\") && len(buf) >= 6 {\n\t\t// X10 mouse encoding, the simplest one\n\t\t// \\033 [ M Cb Cx Cy\n\t\tb := buf[3] - 32\n\t\tswitch b & 3 {\n\t\tcase 0:\n\t\t\tif b&64 != 0 {\n\t\t\t\tevent.Key = MouseWheelUp\n\t\t\t} else {\n\t\t\t\tevent.Key = MouseLeft\n\t\t\t}\n\t\tcase 1:\n\t\t\tif b&64 != 0 {\n\t\t\t\tevent.Key = MouseWheelDown\n\t\t\t} else {\n\t\t\t\tevent.Key = MouseMiddle\n\t\t\t}\n\t\tcase 2:\n\t\t\tevent.Key = MouseRight\n\t\tcase 3:\n\t\t\tevent.Key = MouseRelease\n\t\tdefault:\n\t\t\treturn 6, false\n\t\t}\n\t\tevent.Type = EventMouse // KeyEvent by default\n\t\tif b&32 != 0 {\n\t\t\tevent.Mod |= ModMotion\n\t\t}\n\n\t\t// the coord is 1,1 for upper left\n\t\tevent.MouseX = int(buf[4]) - 1 - 32\n\t\tevent.MouseY = int(buf[5]) - 1 - 32\n\t\treturn 6, true\n\t} else if strings.HasPrefix(buf, \"\\033[<\") || strings.HasPrefix(buf, \"\\033[\") {\n\t\t// xterm 1006 extended mode or urxvt 1015 extended mode\n\t\t// xterm: \\033 [ < Cb ; Cx ; Cy (M or m)\n\t\t// urxvt: \\033 [ Cb ; Cx ; Cy M\n\n\t\t// find the first M or m, that's where we stop\n\t\tmi := strings.IndexAny(buf, \"Mm\")\n\t\tif mi == -1 {\n\t\t\treturn 0, false\n\t\t}\n\n\t\t// whether it's a capital M or not\n\t\tisM := buf[mi] == 'M'\n\n\t\t// whether it's urxvt or not\n\t\tisU := false\n\n\t\t// buf[2] is safe here, because having M or m found means we have at\n\t\t// least 3 bytes in a string\n\t\tif buf[2] == '<' {\n\t\t\tbuf = buf[3:mi]\n\t\t} else {\n\t\t\tisU = true\n\t\t\tbuf = buf[2:mi]\n\t\t}\n\n\t\ts1 := strings.Index(buf, \";\")\n\t\ts2 := strings.LastIndex(buf, \";\")\n\t\t// not found or only one ';'\n\t\tif s1 == -1 || s2 == -1 || s1 == s2 {\n\t\t\treturn 0, false\n\t\t}\n\n\t\tn1, err := strconv.ParseInt(buf[0:s1], 10, 64)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\t\tn2, err := strconv.ParseInt(buf[s1+1:s2], 10, 64)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\t\tn3, err := strconv.ParseInt(buf[s2+1:], 10, 64)\n\t\tif err != nil {\n\t\t\treturn 0, false\n\t\t}\n\n\t\t// on urxvt, first number is encoded exactly as in X10, but we need to\n\t\t// make it zero-based, on xterm it is zero-based already\n\t\tif isU {\n\t\t\tn1 -= 32\n\t\t}\n\t\tswitch n1 & 3 {\n\t\tcase 0:\n\t\t\tif n1&64 != 0 {\n\t\t\t\tevent.Key = MouseWheelUp\n\t\t\t} else {\n\t\t\t\tevent.Key = MouseLeft\n\t\t\t}\n\t\tcase 1:\n\t\t\tif n1&64 != 0 {\n\t\t\t\tevent.Key = MouseWheelDown\n\t\t\t} else {\n\t\t\t\tevent.Key = MouseMiddle\n\t\t\t}\n\t\tcase 2:\n\t\t\tevent.Key = MouseRight\n\t\tcase 3:\n\t\t\tevent.Key = MouseRelease\n\t\tdefault:\n\t\t\treturn mi + 1, false\n\t\t}\n\t\tif !isM {\n\t\t\t// on xterm mouse release is signaled by lowercase m\n\t\t\tevent.Key = MouseRelease\n\t\t}\n\n\t\tevent.Type = EventMouse // KeyEvent by default\n\t\tif n1&32 != 0 {\n\t\t\tevent.Mod |= ModMotion\n\t\t}\n\n\t\tevent.MouseX = int(n2) - 1\n\t\tevent.MouseY = int(n3) - 1\n\t\treturn mi + 1, true\n\t}\n\n\treturn 0, false\n}\n\nfunc parse_escape_sequence(event *Event, buf []byte) (int, bool) {\n\tbufstr := string(buf)\n\tfor i, key := range keys {\n\t\tif strings.HasPrefix(bufstr, key) {\n\t\t\tevent.Ch = 0\n\t\t\tevent.Key = Key(0xFFFF - i)\n\t\t\treturn len(key), true\n\t\t}\n\t}\n\n\t// if none of the keys match, let's try mouse seqences\n\treturn parse_mouse_event(event, bufstr)\n}\n\nfunc extract_raw_event(data []byte, event *Event) bool {\n\tif len(inbuf) == 0 {\n\t\treturn false\n\t}\n\n\tn := len(data)\n\tif n == 0 {\n\t\treturn false\n\t}\n\n\tn = copy(data, inbuf)\n\tcopy(inbuf, inbuf[n:])\n\tinbuf = inbuf[:len(inbuf)-n]\n\n\tevent.N = n\n\tevent.Type = EventRaw\n\treturn true\n}\n\nfunc extract_event(inbuf []byte, event *Event) bool {\n\tif len(inbuf) == 0 {\n\t\tevent.N = 0\n\t\treturn false\n\t}\n\n\tif inbuf[0] == '\\033' {\n\t\t// possible escape sequence\n\t\tif n, ok := parse_escape_sequence(event, inbuf); n != 0 {\n\t\t\tevent.N = n\n\t\t\treturn ok\n\t\t}\n\n\t\t// it's not escape sequence, then it's Alt or Esc, check input_mode\n\t\tswitch {\n\t\tcase input_mode&InputEsc != 0:\n\t\t\t// if we're in escape mode, fill Esc event, pop buffer, return success\n\t\t\tevent.Ch = 0\n\t\t\tevent.Key = KeyEsc\n\t\t\tevent.Mod = 0\n\t\t\tevent.N = 1\n\t\t\treturn true\n\t\tcase input_mode&InputAlt != 0:\n\t\t\t// if we're in alt mode, set Alt modifier to event and redo parsing\n\t\t\tevent.Mod = ModAlt\n\t\t\tok := extract_event(inbuf[1:], event)\n\t\t\tif ok {\n\t\t\t\tevent.N++\n\t\t\t} else {\n\t\t\t\tevent.N = 0\n\t\t\t}\n\t\t\treturn ok\n\t\tdefault:\n\t\t\tpanic(\"unreachable\")\n\t\t}\n\t}\n\n\t// if we're here, this is not an escape sequence and not an alt sequence\n\t// so, it's a FUNCTIONAL KEY or a UNICODE character\n\n\t// first of all check if it's a functional key\n\tif Key(inbuf[0]) <= KeySpace || Key(inbuf[0]) == KeyBackspace2 {\n\t\t// fill event, pop buffer, return success\n\t\tevent.Ch = 0\n\t\tevent.Key = Key(inbuf[0])\n\t\tevent.N = 1\n\t\treturn true\n\t}\n\n\t// the only possible option is utf8 rune\n\tif r, n := utf8.DecodeRune(inbuf); r != utf8.RuneError {\n\t\tevent.Ch = r\n\t\tevent.Key = 0\n\t\tevent.N = n\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr, _, e := syscall.Syscall(syscall.SYS_FCNTL, uintptr(fd), uintptr(cmd),\n\t\tuintptr(arg))\n\tval = int(r)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/termbox_common.go",
    "content": "package termbox\n\n// private API, common OS agnostic part\n\ntype cellbuf struct {\n\twidth  int\n\theight int\n\tcells  []Cell\n}\n\nfunc (this *cellbuf) init(width, height int) {\n\tthis.width = width\n\tthis.height = height\n\tthis.cells = make([]Cell, width*height)\n}\n\nfunc (this *cellbuf) resize(width, height int) {\n\tif this.width == width && this.height == height {\n\t\treturn\n\t}\n\n\toldw := this.width\n\toldh := this.height\n\toldcells := this.cells\n\n\tthis.init(width, height)\n\tthis.clear()\n\n\tminw, minh := oldw, oldh\n\n\tif width < minw {\n\t\tminw = width\n\t}\n\tif height < minh {\n\t\tminh = height\n\t}\n\n\tfor i := 0; i < minh; i++ {\n\t\tsrco, dsto := i*oldw, i*width\n\t\tsrc := oldcells[srco : srco+minw]\n\t\tdst := this.cells[dsto : dsto+minw]\n\t\tcopy(dst, src)\n\t}\n}\n\nfunc (this *cellbuf) clear() {\n\tfor i := range this.cells {\n\t\tc := &this.cells[i]\n\t\tc.Ch = ' '\n\t\tc.Fg = foreground\n\t\tc.Bg = background\n\t}\n}\n\nconst cursor_hidden = -1\n\nfunc is_cursor_hidden(x, y int) bool {\n\treturn x == cursor_hidden || y == cursor_hidden\n}\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/termbox_windows.go",
    "content": "package termbox\n\nimport \"syscall\"\nimport \"unsafe\"\nimport \"unicode/utf16\"\nimport \"github.com/mattn/go-runewidth\"\n\ntype (\n\twchar     uint16\n\tshort     int16\n\tdword     uint32\n\tword      uint16\n\tchar_info struct {\n\t\tchar wchar\n\t\tattr word\n\t}\n\tcoord struct {\n\t\tx short\n\t\ty short\n\t}\n\tsmall_rect struct {\n\t\tleft   short\n\t\ttop    short\n\t\tright  short\n\t\tbottom short\n\t}\n\tconsole_screen_buffer_info struct {\n\t\tsize                coord\n\t\tcursor_position     coord\n\t\tattributes          word\n\t\twindow              small_rect\n\t\tmaximum_window_size coord\n\t}\n\tconsole_cursor_info struct {\n\t\tsize    dword\n\t\tvisible int32\n\t}\n\tinput_record struct {\n\t\tevent_type word\n\t\t_          [2]byte\n\t\tevent      [16]byte\n\t}\n\tkey_event_record struct {\n\t\tkey_down          int32\n\t\trepeat_count      word\n\t\tvirtual_key_code  word\n\t\tvirtual_scan_code word\n\t\tunicode_char      wchar\n\t\tcontrol_key_state dword\n\t}\n\twindow_buffer_size_record struct {\n\t\tsize coord\n\t}\n\tmouse_event_record struct {\n\t\tmouse_pos         coord\n\t\tbutton_state      dword\n\t\tcontrol_key_state dword\n\t\tevent_flags       dword\n\t}\n)\n\nconst (\n\tmouse_lmb = 0x1\n\tmouse_rmb = 0x2\n\tmouse_mmb = 0x4 | 0x8 | 0x10\n)\n\nfunc (this coord) uintptr() uintptr {\n\treturn uintptr(*(*int32)(unsafe.Pointer(&this)))\n}\n\nvar kernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\nvar is_cjk = runewidth.IsEastAsian()\n\nvar (\n\tproc_set_console_active_screen_buffer = kernel32.NewProc(\"SetConsoleActiveScreenBuffer\")\n\tproc_set_console_screen_buffer_size   = kernel32.NewProc(\"SetConsoleScreenBufferSize\")\n\tproc_create_console_screen_buffer     = kernel32.NewProc(\"CreateConsoleScreenBuffer\")\n\tproc_get_console_screen_buffer_info   = kernel32.NewProc(\"GetConsoleScreenBufferInfo\")\n\tproc_write_console_output             = kernel32.NewProc(\"WriteConsoleOutputW\")\n\tproc_write_console_output_character   = kernel32.NewProc(\"WriteConsoleOutputCharacterW\")\n\tproc_write_console_output_attribute   = kernel32.NewProc(\"WriteConsoleOutputAttribute\")\n\tproc_set_console_cursor_info          = kernel32.NewProc(\"SetConsoleCursorInfo\")\n\tproc_set_console_cursor_position      = kernel32.NewProc(\"SetConsoleCursorPosition\")\n\tproc_get_console_cursor_info          = kernel32.NewProc(\"GetConsoleCursorInfo\")\n\tproc_read_console_input               = kernel32.NewProc(\"ReadConsoleInputW\")\n\tproc_get_console_mode                 = kernel32.NewProc(\"GetConsoleMode\")\n\tproc_set_console_mode                 = kernel32.NewProc(\"SetConsoleMode\")\n\tproc_fill_console_output_character    = kernel32.NewProc(\"FillConsoleOutputCharacterW\")\n\tproc_fill_console_output_attribute    = kernel32.NewProc(\"FillConsoleOutputAttribute\")\n\tproc_create_event                     = kernel32.NewProc(\"CreateEventW\")\n\tproc_wait_for_multiple_objects        = kernel32.NewProc(\"WaitForMultipleObjects\")\n\tproc_set_event                        = kernel32.NewProc(\"SetEvent\")\n)\n\nfunc set_console_active_screen_buffer(h syscall.Handle) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_set_console_active_screen_buffer.Addr(),\n\t\t1, uintptr(h), 0, 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc set_console_screen_buffer_size(h syscall.Handle, size coord) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_set_console_screen_buffer_size.Addr(),\n\t\t2, uintptr(h), size.uintptr(), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc create_console_screen_buffer() (h syscall.Handle, err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_create_console_screen_buffer.Addr(),\n\t\t5, uintptr(generic_read|generic_write), 0, 0, console_textmode_buffer, 0, 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn syscall.Handle(r0), err\n}\n\nfunc get_console_screen_buffer_info(h syscall.Handle, info *console_screen_buffer_info) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_get_console_screen_buffer_info.Addr(),\n\t\t2, uintptr(h), uintptr(unsafe.Pointer(info)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc write_console_output(h syscall.Handle, chars []char_info, dst small_rect) (err error) {\n\ttmp_coord = coord{dst.right - dst.left + 1, dst.bottom - dst.top + 1}\n\ttmp_rect = dst\n\tr0, _, e1 := syscall.Syscall6(proc_write_console_output.Addr(),\n\t\t5, uintptr(h), uintptr(unsafe.Pointer(&chars[0])), tmp_coord.uintptr(),\n\t\ttmp_coord0.uintptr(), uintptr(unsafe.Pointer(&tmp_rect)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc write_console_output_character(h syscall.Handle, chars []wchar, pos coord) (err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_write_console_output_character.Addr(),\n\t\t5, uintptr(h), uintptr(unsafe.Pointer(&chars[0])), uintptr(len(chars)),\n\t\tpos.uintptr(), uintptr(unsafe.Pointer(&tmp_arg)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc write_console_output_attribute(h syscall.Handle, attrs []word, pos coord) (err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_write_console_output_attribute.Addr(),\n\t\t5, uintptr(h), uintptr(unsafe.Pointer(&attrs[0])), uintptr(len(attrs)),\n\t\tpos.uintptr(), uintptr(unsafe.Pointer(&tmp_arg)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc set_console_cursor_info(h syscall.Handle, info *console_cursor_info) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_set_console_cursor_info.Addr(),\n\t\t2, uintptr(h), uintptr(unsafe.Pointer(info)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc get_console_cursor_info(h syscall.Handle, info *console_cursor_info) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_get_console_cursor_info.Addr(),\n\t\t2, uintptr(h), uintptr(unsafe.Pointer(info)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc set_console_cursor_position(h syscall.Handle, pos coord) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_set_console_cursor_position.Addr(),\n\t\t2, uintptr(h), pos.uintptr(), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc read_console_input(h syscall.Handle, record *input_record) (err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_read_console_input.Addr(),\n\t\t4, uintptr(h), uintptr(unsafe.Pointer(record)), 1, uintptr(unsafe.Pointer(&tmp_arg)), 0, 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc get_console_mode(h syscall.Handle, mode *dword) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_get_console_mode.Addr(),\n\t\t2, uintptr(h), uintptr(unsafe.Pointer(mode)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc set_console_mode(h syscall.Handle, mode dword) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_set_console_mode.Addr(),\n\t\t2, uintptr(h), uintptr(mode), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc fill_console_output_character(h syscall.Handle, char wchar, n int) (err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_fill_console_output_character.Addr(),\n\t\t5, uintptr(h), uintptr(char), uintptr(n), tmp_coord.uintptr(),\n\t\tuintptr(unsafe.Pointer(&tmp_arg)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc fill_console_output_attribute(h syscall.Handle, attr word, n int) (err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_fill_console_output_attribute.Addr(),\n\t\t5, uintptr(h), uintptr(attr), uintptr(n), tmp_coord.uintptr(),\n\t\tuintptr(unsafe.Pointer(&tmp_arg)), 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc create_event() (out syscall.Handle, err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_create_event.Addr(),\n\t\t4, 0, 0, 0, 0, 0, 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn syscall.Handle(r0), err\n}\n\nfunc wait_for_multiple_objects(objects []syscall.Handle) (err error) {\n\tr0, _, e1 := syscall.Syscall6(proc_wait_for_multiple_objects.Addr(),\n\t\t4, uintptr(len(objects)), uintptr(unsafe.Pointer(&objects[0])),\n\t\t0, 0xFFFFFFFF, 0, 0)\n\tif uint32(r0) == 0xFFFFFFFF {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc set_event(ev syscall.Handle) (err error) {\n\tr0, _, e1 := syscall.Syscall(proc_set_event.Addr(),\n\t\t1, uintptr(ev), 0, 0)\n\tif int(r0) == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\ntype diff_msg struct {\n\tpos   short\n\tlines short\n\tchars []char_info\n}\n\ntype input_event struct {\n\tevent Event\n\terr   error\n}\n\nvar (\n\torig_cursor_info console_cursor_info\n\torig_size        coord\n\torig_mode        dword\n\torig_screen      syscall.Handle\n\tback_buffer      cellbuf\n\tfront_buffer     cellbuf\n\tterm_size        coord\n\tinput_mode       = InputEsc\n\tcursor_x         = cursor_hidden\n\tcursor_y         = cursor_hidden\n\tforeground       = ColorDefault\n\tbackground       = ColorDefault\n\tin               syscall.Handle\n\tout              syscall.Handle\n\tinterrupt        syscall.Handle\n\tcharbuf          []char_info\n\tdiffbuf          []diff_msg\n\tbeg_x            = -1\n\tbeg_y            = -1\n\tbeg_i            = -1\n\tinput_comm       = make(chan Event)\n\tinterrupt_comm   = make(chan struct{})\n\tcancel_comm      = make(chan bool, 1)\n\tcancel_done_comm = make(chan bool)\n\talt_mode_esc     = false\n\n\t// these ones just to prevent heap allocs at all costs\n\ttmp_info   console_screen_buffer_info\n\ttmp_arg    dword\n\ttmp_coord0 = coord{0, 0}\n\ttmp_coord  = coord{0, 0}\n\ttmp_rect   = small_rect{0, 0, 0, 0}\n)\n\nfunc get_cursor_position(out syscall.Handle) coord {\n\terr := get_console_screen_buffer_info(out, &tmp_info)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn tmp_info.cursor_position\n}\n\nfunc get_term_size(out syscall.Handle) coord {\n\terr := get_console_screen_buffer_info(out, &tmp_info)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn tmp_info.size\n}\n\nfunc get_win_size(out syscall.Handle) coord {\n\terr := get_console_screen_buffer_info(out, &tmp_info)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn coord{\n\t\tx: tmp_info.window.right - tmp_info.window.left + 1,\n\t\ty: tmp_info.window.bottom - tmp_info.window.top + 1,\n\t}\n}\n\nfunc update_size_maybe() {\n\tsize := get_term_size(out)\n\tif size.x != term_size.x || size.y != term_size.y {\n\t\tterm_size = size\n\t\tback_buffer.resize(int(size.x), int(size.y))\n\t\tfront_buffer.resize(int(size.x), int(size.y))\n\t\tfront_buffer.clear()\n\t\tclear()\n\n\t\tarea := int(size.x) * int(size.y)\n\t\tif cap(charbuf) < area {\n\t\t\tcharbuf = make([]char_info, 0, area)\n\t\t}\n\t}\n}\n\nvar color_table_bg = []word{\n\t0, // default (black)\n\t0, // black\n\tbackground_red,\n\tbackground_green,\n\tbackground_red | background_green, // yellow\n\tbackground_blue,\n\tbackground_red | background_blue,                    // magenta\n\tbackground_green | background_blue,                  // cyan\n\tbackground_red | background_blue | background_green, // white\n}\n\nvar color_table_fg = []word{\n\tforeground_red | foreground_blue | foreground_green, // default (white)\n\t0,\n\tforeground_red,\n\tforeground_green,\n\tforeground_red | foreground_green, // yellow\n\tforeground_blue,\n\tforeground_red | foreground_blue,                    // magenta\n\tforeground_green | foreground_blue,                  // cyan\n\tforeground_red | foreground_blue | foreground_green, // white\n}\n\nconst (\n\treplacement_char = '\\uFFFD'\n\tmax_rune         = '\\U0010FFFF'\n\tsurr1            = 0xd800\n\tsurr2            = 0xdc00\n\tsurr3            = 0xe000\n\tsurr_self        = 0x10000\n)\n\nfunc append_diff_line(y int) int {\n\tn := 0\n\tfor x := 0; x < front_buffer.width; {\n\t\tcell_offset := y*front_buffer.width + x\n\t\tback := &back_buffer.cells[cell_offset]\n\t\tfront := &front_buffer.cells[cell_offset]\n\t\tattr, char := cell_to_char_info(*back)\n\t\tcharbuf = append(charbuf, char_info{attr: attr, char: char[0]})\n\t\t*front = *back\n\t\tn++\n\t\tw := runewidth.RuneWidth(back.Ch)\n\t\tif w == 0 || w == 2 && runewidth.IsAmbiguousWidth(back.Ch) {\n\t\t\tw = 1\n\t\t}\n\t\tx += w\n\t\t// If not CJK, fill trailing space with whitespace\n\t\tif !is_cjk && w == 2 {\n\t\t\tcharbuf = append(charbuf, char_info{attr: attr, char: ' '})\n\t\t}\n\t}\n\treturn n\n}\n\n// compares 'back_buffer' with 'front_buffer' and prepares all changes in the form of\n// 'diff_msg's in the 'diff_buf'\nfunc prepare_diff_messages() {\n\t// clear buffers\n\tdiffbuf = diffbuf[:0]\n\tcharbuf = charbuf[:0]\n\n\tvar diff diff_msg\n\tgbeg := 0\n\tfor y := 0; y < front_buffer.height; y++ {\n\t\tsame := true\n\t\tline_offset := y * front_buffer.width\n\t\tfor x := 0; x < front_buffer.width; x++ {\n\t\t\tcell_offset := line_offset + x\n\t\t\tback := &back_buffer.cells[cell_offset]\n\t\t\tfront := &front_buffer.cells[cell_offset]\n\t\t\tif *back != *front {\n\t\t\t\tsame = false\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif same && diff.lines > 0 {\n\t\t\tdiffbuf = append(diffbuf, diff)\n\t\t\tdiff = diff_msg{}\n\t\t}\n\t\tif !same {\n\t\t\tbeg := len(charbuf)\n\t\t\tend := beg + append_diff_line(y)\n\t\t\tif diff.lines == 0 {\n\t\t\t\tdiff.pos = short(y)\n\t\t\t\tgbeg = beg\n\t\t\t}\n\t\t\tdiff.lines++\n\t\t\tdiff.chars = charbuf[gbeg:end]\n\t\t}\n\t}\n\tif diff.lines > 0 {\n\t\tdiffbuf = append(diffbuf, diff)\n\t\tdiff = diff_msg{}\n\t}\n}\n\nfunc get_ct(table []word, idx int) word {\n\tidx = idx & 0x0F\n\tif idx >= len(table) {\n\t\tidx = len(table) - 1\n\t}\n\treturn table[idx]\n}\n\nfunc cell_to_char_info(c Cell) (attr word, wc [2]wchar) {\n\tattr = get_ct(color_table_fg, int(c.Fg)) | get_ct(color_table_bg, int(c.Bg))\n\tif c.Fg&AttrReverse|c.Bg&AttrReverse != 0 {\n\t\tattr = (attr&0xF0)>>4 | (attr&0x0F)<<4\n\t}\n\tif c.Fg&AttrBold != 0 {\n\t\tattr |= foreground_intensity\n\t}\n\tif c.Bg&AttrBold != 0 {\n\t\tattr |= background_intensity\n\t}\n\n\tr0, r1 := utf16.EncodeRune(c.Ch)\n\tif r0 == 0xFFFD {\n\t\twc[0] = wchar(c.Ch)\n\t\twc[1] = ' '\n\t} else {\n\t\twc[0] = wchar(r0)\n\t\twc[1] = wchar(r1)\n\t}\n\treturn\n}\n\nfunc move_cursor(x, y int) {\n\terr := set_console_cursor_position(out, coord{short(x), short(y)})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc show_cursor(visible bool) {\n\tvar v int32\n\tif visible {\n\t\tv = 1\n\t}\n\n\tvar info console_cursor_info\n\tinfo.size = 100\n\tinfo.visible = v\n\terr := set_console_cursor_info(out, &info)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc clear() {\n\tvar err error\n\tattr, char := cell_to_char_info(Cell{\n\t\t' ',\n\t\tforeground,\n\t\tbackground,\n\t})\n\n\tarea := int(term_size.x) * int(term_size.y)\n\terr = fill_console_output_attribute(out, attr, area)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = fill_console_output_character(out, char[0], area)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif !is_cursor_hidden(cursor_x, cursor_y) {\n\t\tmove_cursor(cursor_x, cursor_y)\n\t}\n}\n\nfunc key_event_record_to_event(r *key_event_record) (Event, bool) {\n\tif r.key_down == 0 {\n\t\treturn Event{}, false\n\t}\n\n\te := Event{Type: EventKey}\n\tif input_mode&InputAlt != 0 {\n\t\tif alt_mode_esc {\n\t\t\te.Mod = ModAlt\n\t\t\talt_mode_esc = false\n\t\t}\n\t\tif r.control_key_state&(left_alt_pressed|right_alt_pressed) != 0 {\n\t\t\te.Mod = ModAlt\n\t\t}\n\t}\n\n\tctrlpressed := r.control_key_state&(left_ctrl_pressed|right_ctrl_pressed) != 0\n\n\tif r.virtual_key_code >= vk_f1 && r.virtual_key_code <= vk_f12 {\n\t\tswitch r.virtual_key_code {\n\t\tcase vk_f1:\n\t\t\te.Key = KeyF1\n\t\tcase vk_f2:\n\t\t\te.Key = KeyF2\n\t\tcase vk_f3:\n\t\t\te.Key = KeyF3\n\t\tcase vk_f4:\n\t\t\te.Key = KeyF4\n\t\tcase vk_f5:\n\t\t\te.Key = KeyF5\n\t\tcase vk_f6:\n\t\t\te.Key = KeyF6\n\t\tcase vk_f7:\n\t\t\te.Key = KeyF7\n\t\tcase vk_f8:\n\t\t\te.Key = KeyF8\n\t\tcase vk_f9:\n\t\t\te.Key = KeyF9\n\t\tcase vk_f10:\n\t\t\te.Key = KeyF10\n\t\tcase vk_f11:\n\t\t\te.Key = KeyF11\n\t\tcase vk_f12:\n\t\t\te.Key = KeyF12\n\t\tdefault:\n\t\t\tpanic(\"unreachable\")\n\t\t}\n\n\t\treturn e, true\n\t}\n\n\tif r.virtual_key_code <= vk_delete {\n\t\tswitch r.virtual_key_code {\n\t\tcase vk_insert:\n\t\t\te.Key = KeyInsert\n\t\tcase vk_delete:\n\t\t\te.Key = KeyDelete\n\t\tcase vk_home:\n\t\t\te.Key = KeyHome\n\t\tcase vk_end:\n\t\t\te.Key = KeyEnd\n\t\tcase vk_pgup:\n\t\t\te.Key = KeyPgup\n\t\tcase vk_pgdn:\n\t\t\te.Key = KeyPgdn\n\t\tcase vk_arrow_up:\n\t\t\te.Key = KeyArrowUp\n\t\tcase vk_arrow_down:\n\t\t\te.Key = KeyArrowDown\n\t\tcase vk_arrow_left:\n\t\t\te.Key = KeyArrowLeft\n\t\tcase vk_arrow_right:\n\t\t\te.Key = KeyArrowRight\n\t\tcase vk_backspace:\n\t\t\tif ctrlpressed {\n\t\t\t\te.Key = KeyBackspace2\n\t\t\t} else {\n\t\t\t\te.Key = KeyBackspace\n\t\t\t}\n\t\tcase vk_tab:\n\t\t\te.Key = KeyTab\n\t\tcase vk_enter:\n\t\t\te.Key = KeyEnter\n\t\tcase vk_esc:\n\t\t\tswitch {\n\t\t\tcase input_mode&InputEsc != 0:\n\t\t\t\te.Key = KeyEsc\n\t\t\tcase input_mode&InputAlt != 0:\n\t\t\t\talt_mode_esc = true\n\t\t\t\treturn Event{}, false\n\t\t\t}\n\t\tcase vk_space:\n\t\t\tif ctrlpressed {\n\t\t\t\t// manual return here, because KeyCtrlSpace is zero\n\t\t\t\te.Key = KeyCtrlSpace\n\t\t\t\treturn e, true\n\t\t\t} else {\n\t\t\t\te.Key = KeySpace\n\t\t\t}\n\t\t}\n\n\t\tif e.Key != 0 {\n\t\t\treturn e, true\n\t\t}\n\t}\n\n\tif ctrlpressed {\n\t\tif Key(r.unicode_char) >= KeyCtrlA && Key(r.unicode_char) <= KeyCtrlRsqBracket {\n\t\t\te.Key = Key(r.unicode_char)\n\t\t\tif input_mode&InputAlt != 0 && e.Key == KeyEsc {\n\t\t\t\talt_mode_esc = true\n\t\t\t\treturn Event{}, false\n\t\t\t}\n\t\t\treturn e, true\n\t\t}\n\t\tswitch r.virtual_key_code {\n\t\tcase 192, 50:\n\t\t\t// manual return here, because KeyCtrl2 is zero\n\t\t\te.Key = KeyCtrl2\n\t\t\treturn e, true\n\t\tcase 51:\n\t\t\tif input_mode&InputAlt != 0 {\n\t\t\t\talt_mode_esc = true\n\t\t\t\treturn Event{}, false\n\t\t\t}\n\t\t\te.Key = KeyCtrl3\n\t\tcase 52:\n\t\t\te.Key = KeyCtrl4\n\t\tcase 53:\n\t\t\te.Key = KeyCtrl5\n\t\tcase 54:\n\t\t\te.Key = KeyCtrl6\n\t\tcase 189, 191, 55:\n\t\t\te.Key = KeyCtrl7\n\t\tcase 8, 56:\n\t\t\te.Key = KeyCtrl8\n\t\t}\n\n\t\tif e.Key != 0 {\n\t\t\treturn e, true\n\t\t}\n\t}\n\n\tif r.unicode_char != 0 {\n\t\te.Ch = rune(r.unicode_char)\n\t\treturn e, true\n\t}\n\n\treturn Event{}, false\n}\n\nfunc input_event_producer() {\n\tvar r input_record\n\tvar err error\n\tvar last_button Key\n\tvar last_button_pressed Key\n\tvar last_state = dword(0)\n\tvar last_x, last_y = -1, -1\n\thandles := []syscall.Handle{in, interrupt}\n\tfor {\n\t\terr = wait_for_multiple_objects(handles)\n\t\tif err != nil {\n\t\t\tinput_comm <- Event{Type: EventError, Err: err}\n\t\t}\n\n\t\tselect {\n\t\tcase <-cancel_comm:\n\t\t\tcancel_done_comm <- true\n\t\t\treturn\n\t\tdefault:\n\t\t}\n\n\t\terr = read_console_input(in, &r)\n\t\tif err != nil {\n\t\t\tinput_comm <- Event{Type: EventError, Err: err}\n\t\t}\n\n\t\tswitch r.event_type {\n\t\tcase key_event:\n\t\t\tkr := (*key_event_record)(unsafe.Pointer(&r.event))\n\t\t\tev, ok := key_event_record_to_event(kr)\n\t\t\tif ok {\n\t\t\t\tfor i := 0; i < int(kr.repeat_count); i++ {\n\t\t\t\t\tinput_comm <- ev\n\t\t\t\t}\n\t\t\t}\n\t\tcase window_buffer_size_event:\n\t\t\tsr := *(*window_buffer_size_record)(unsafe.Pointer(&r.event))\n\t\t\tinput_comm <- Event{\n\t\t\t\tType:   EventResize,\n\t\t\t\tWidth:  int(sr.size.x),\n\t\t\t\tHeight: int(sr.size.y),\n\t\t\t}\n\t\tcase mouse_event:\n\t\t\tmr := *(*mouse_event_record)(unsafe.Pointer(&r.event))\n\t\t\tev := Event{Type: EventMouse}\n\t\t\tswitch mr.event_flags {\n\t\t\tcase 0, 2:\n\t\t\t\t// single or double click\n\t\t\t\tcur_state := mr.button_state\n\t\t\t\tswitch {\n\t\t\t\tcase last_state&mouse_lmb == 0 && cur_state&mouse_lmb != 0:\n\t\t\t\t\tlast_button = MouseLeft\n\t\t\t\t\tlast_button_pressed = last_button\n\t\t\t\tcase last_state&mouse_rmb == 0 && cur_state&mouse_rmb != 0:\n\t\t\t\t\tlast_button = MouseRight\n\t\t\t\t\tlast_button_pressed = last_button\n\t\t\t\tcase last_state&mouse_mmb == 0 && cur_state&mouse_mmb != 0:\n\t\t\t\t\tlast_button = MouseMiddle\n\t\t\t\t\tlast_button_pressed = last_button\n\t\t\t\tcase last_state&mouse_lmb != 0 && cur_state&mouse_lmb == 0:\n\t\t\t\t\tlast_button = MouseRelease\n\t\t\t\tcase last_state&mouse_rmb != 0 && cur_state&mouse_rmb == 0:\n\t\t\t\t\tlast_button = MouseRelease\n\t\t\t\tcase last_state&mouse_mmb != 0 && cur_state&mouse_mmb == 0:\n\t\t\t\t\tlast_button = MouseRelease\n\t\t\t\tdefault:\n\t\t\t\t\tlast_state = cur_state\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tlast_state = cur_state\n\t\t\t\tev.Key = last_button\n\t\t\t\tlast_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y)\n\t\t\t\tev.MouseX = last_x\n\t\t\t\tev.MouseY = last_y\n\t\t\tcase 1:\n\t\t\t\t// mouse motion\n\t\t\t\tx, y := int(mr.mouse_pos.x), int(mr.mouse_pos.y)\n\t\t\t\tif last_state != 0 && (last_x != x || last_y != y) {\n\t\t\t\t\tev.Key = last_button_pressed\n\t\t\t\t\tev.Mod = ModMotion\n\t\t\t\t\tev.MouseX = x\n\t\t\t\t\tev.MouseY = y\n\t\t\t\t\tlast_x, last_y = x, y\n\t\t\t\t} else {\n\t\t\t\t\tev.Type = EventNone\n\t\t\t\t}\n\t\t\tcase 4:\n\t\t\t\t// mouse wheel\n\t\t\t\tn := int16(mr.button_state >> 16)\n\t\t\t\tif n > 0 {\n\t\t\t\t\tev.Key = MouseWheelUp\n\t\t\t\t} else {\n\t\t\t\t\tev.Key = MouseWheelDown\n\t\t\t\t}\n\t\t\t\tlast_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y)\n\t\t\t\tev.MouseX = last_x\n\t\t\t\tev.MouseY = last_y\n\t\t\tdefault:\n\t\t\t\tev.Type = EventNone\n\t\t\t}\n\t\t\tif ev.Type != EventNone {\n\t\t\t\tinput_comm <- ev\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/terminfo.go",
    "content": "// +build !windows\n// This file contains a simple and incomplete implementation of the terminfo\n// database. Information was taken from the ncurses manpages term(5) and\n// terminfo(5). Currently, only the string capabilities for special keys and for\n// functions without parameters are actually used. Colors are still done with\n// ANSI escape sequences. Other special features that are not (yet?) supported\n// are reading from ~/.terminfo, the TERMINFO_DIRS variable, Berkeley database\n// format and extended capabilities.\n\npackage termbox\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"strings\"\n)\n\nconst (\n\tti_magic         = 0432\n\tti_header_length = 12\n\tti_mouse_enter   = \"\\x1b[?1000h\\x1b[?1002h\\x1b[?1015h\\x1b[?1006h\"\n\tti_mouse_leave   = \"\\x1b[?1006l\\x1b[?1015l\\x1b[?1002l\\x1b[?1000l\"\n)\n\nfunc load_terminfo() ([]byte, error) {\n\tvar data []byte\n\tvar err error\n\n\tterm := os.Getenv(\"TERM\")\n\tif term == \"\" {\n\t\treturn nil, fmt.Errorf(\"termbox: TERM not set\")\n\t}\n\n\t// The following behaviour follows the one described in terminfo(5) as\n\t// distributed by ncurses.\n\n\tterminfo := os.Getenv(\"TERMINFO\")\n\tif terminfo != \"\" {\n\t\t// if TERMINFO is set, no other directory should be searched\n\t\treturn ti_try_path(terminfo)\n\t}\n\n\t// next, consider ~/.terminfo\n\thome := os.Getenv(\"HOME\")\n\tif home != \"\" {\n\t\tdata, err = ti_try_path(home + \"/.terminfo\")\n\t\tif err == nil {\n\t\t\treturn data, nil\n\t\t}\n\t}\n\n\t// next, TERMINFO_DIRS\n\tdirs := os.Getenv(\"TERMINFO_DIRS\")\n\tif dirs != \"\" {\n\t\tfor _, dir := range strings.Split(dirs, \":\") {\n\t\t\tif dir == \"\" {\n\t\t\t\t// \"\" -> \"/usr/share/terminfo\"\n\t\t\t\tdir = \"/usr/share/terminfo\"\n\t\t\t}\n\t\t\tdata, err = ti_try_path(dir)\n\t\t\tif err == nil {\n\t\t\t\treturn data, nil\n\t\t\t}\n\t\t}\n\t}\n\n\t// fall back to /usr/share/terminfo\n\treturn ti_try_path(\"/usr/share/terminfo\")\n}\n\nfunc ti_try_path(path string) (data []byte, err error) {\n\t// load_terminfo already made sure it is set\n\tterm := os.Getenv(\"TERM\")\n\n\t// first try, the typical *nix path\n\tterminfo := path + \"/\" + term[0:1] + \"/\" + term\n\tdata, err = ioutil.ReadFile(terminfo)\n\tif err == nil {\n\t\treturn\n\t}\n\n\t// fallback to darwin specific dirs structure\n\tterminfo = path + \"/\" + hex.EncodeToString([]byte(term[:1])) + \"/\" + term\n\tdata, err = ioutil.ReadFile(terminfo)\n\treturn\n}\n\nfunc setup_term_builtin() error {\n\tname := os.Getenv(\"TERM\")\n\tif name == \"\" {\n\t\treturn errors.New(\"termbox: TERM environment variable not set\")\n\t}\n\n\tfor _, t := range terms {\n\t\tif t.name == name {\n\t\t\tkeys = t.keys\n\t\t\tfuncs = t.funcs\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tcompat_table := []struct {\n\t\tpartial string\n\t\tkeys    []string\n\t\tfuncs   []string\n\t}{\n\t\t{\"xterm\", xterm_keys, xterm_funcs},\n\t\t{\"rxvt\", rxvt_unicode_keys, rxvt_unicode_funcs},\n\t\t{\"linux\", linux_keys, linux_funcs},\n\t\t{\"Eterm\", eterm_keys, eterm_funcs},\n\t\t{\"screen\", screen_keys, screen_funcs},\n\t\t// let's assume that 'cygwin' is xterm compatible\n\t\t{\"cygwin\", xterm_keys, xterm_funcs},\n\t\t{\"st\", xterm_keys, xterm_funcs},\n\t}\n\n\t// try compatibility variants\n\tfor _, it := range compat_table {\n\t\tif strings.Contains(name, it.partial) {\n\t\t\tkeys = it.keys\n\t\t\tfuncs = it.funcs\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn errors.New(\"termbox: unsupported terminal\")\n}\n\nfunc setup_term() (err error) {\n\tvar data []byte\n\tvar header [6]int16\n\tvar str_offset, table_offset int16\n\n\tdata, err = load_terminfo()\n\tif err != nil {\n\t\treturn setup_term_builtin()\n\t}\n\n\trd := bytes.NewReader(data)\n\t// 0: magic number, 1: size of names section, 2: size of boolean section, 3:\n\t// size of numbers section (in integers), 4: size of the strings section (in\n\t// integers), 5: size of the string table\n\n\terr = binary.Read(rd, binary.LittleEndian, header[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif (header[1]+header[2])%2 != 0 {\n\t\t// old quirk to align everything on word boundaries\n\t\theader[2] += 1\n\t}\n\tstr_offset = ti_header_length + header[1] + header[2] + 2*header[3]\n\ttable_offset = str_offset + 2*header[4]\n\n\tkeys = make([]string, 0xFFFF-key_min)\n\tfor i, _ := range keys {\n\t\tkeys[i], err = ti_read_string(rd, str_offset+2*ti_keys[i], table_offset)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tfuncs = make([]string, t_max_funcs)\n\t// the last two entries are reserved for mouse. because the table offset is\n\t// not there, the two entries have to fill in manually\n\tfor i, _ := range funcs[:len(funcs)-2] {\n\t\tfuncs[i], err = ti_read_string(rd, str_offset+2*ti_funcs[i], table_offset)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tfuncs[t_max_funcs-2] = ti_mouse_enter\n\tfuncs[t_max_funcs-1] = ti_mouse_leave\n\treturn nil\n}\n\nfunc ti_read_string(rd *bytes.Reader, str_off, table int16) (string, error) {\n\tvar off int16\n\n\t_, err := rd.Seek(int64(str_off), 0)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\terr = binary.Read(rd, binary.LittleEndian, &off)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\t_, err = rd.Seek(int64(table+off), 0)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tvar bs []byte\n\tfor {\n\t\tb, err := rd.ReadByte()\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tif b == byte(0x00) {\n\t\t\tbreak\n\t\t}\n\t\tbs = append(bs, b)\n\t}\n\treturn string(bs), nil\n}\n\n// \"Maps\" the function constants from termbox.go to the number of the respective\n// string capability in the terminfo file. Taken from (ncurses) term.h.\nvar ti_funcs = []int16{\n\t28, 40, 16, 13, 5, 39, 36, 27, 26, 34, 89, 88,\n}\n\n// Same as above for the special keys.\nvar ti_keys = []int16{\n\t66, 68 /* apparently not a typo; 67 is F10 for whatever reason */, 69, 70,\n\t71, 72, 73, 74, 75, 67, 216, 217, 77, 59, 76, 164, 82, 81, 87, 61, 79, 83,\n}\n"
  },
  {
    "path": "vendor/github.com/nsf/termbox-go/terminfo_builtin.go",
    "content": "// +build !windows\n\npackage termbox\n\n// Eterm\nvar eterm_keys = []string{\n\t\"\\x1b[11~\", \"\\x1b[12~\", \"\\x1b[13~\", \"\\x1b[14~\", \"\\x1b[15~\", \"\\x1b[17~\", \"\\x1b[18~\", \"\\x1b[19~\", \"\\x1b[20~\", \"\\x1b[21~\", \"\\x1b[23~\", \"\\x1b[24~\", \"\\x1b[2~\", \"\\x1b[3~\", \"\\x1b[7~\", \"\\x1b[8~\", \"\\x1b[5~\", \"\\x1b[6~\", \"\\x1b[A\", \"\\x1b[B\", \"\\x1b[D\", \"\\x1b[C\",\n}\nvar eterm_funcs = []string{\n\t\"\\x1b7\\x1b[?47h\", \"\\x1b[2J\\x1b[?47l\\x1b8\", \"\\x1b[?25h\", \"\\x1b[?25l\", \"\\x1b[H\\x1b[2J\", \"\\x1b[m\\x0f\", \"\\x1b[4m\", \"\\x1b[1m\", \"\\x1b[5m\", \"\\x1b[7m\", \"\", \"\", \"\", \"\",\n}\n\n// screen\nvar screen_keys = []string{\n\t\"\\x1bOP\", \"\\x1bOQ\", \"\\x1bOR\", \"\\x1bOS\", \"\\x1b[15~\", \"\\x1b[17~\", \"\\x1b[18~\", \"\\x1b[19~\", \"\\x1b[20~\", \"\\x1b[21~\", \"\\x1b[23~\", \"\\x1b[24~\", \"\\x1b[2~\", \"\\x1b[3~\", \"\\x1b[1~\", \"\\x1b[4~\", \"\\x1b[5~\", \"\\x1b[6~\", \"\\x1bOA\", \"\\x1bOB\", \"\\x1bOD\", \"\\x1bOC\",\n}\nvar screen_funcs = []string{\n\t\"\\x1b[?1049h\", \"\\x1b[?1049l\", \"\\x1b[34h\\x1b[?25h\", \"\\x1b[?25l\", \"\\x1b[H\\x1b[J\", \"\\x1b[m\\x0f\", \"\\x1b[4m\", \"\\x1b[1m\", \"\\x1b[5m\", \"\\x1b[7m\", \"\\x1b[?1h\\x1b=\", \"\\x1b[?1l\\x1b>\", ti_mouse_enter, ti_mouse_leave,\n}\n\n// xterm\nvar xterm_keys = []string{\n\t\"\\x1bOP\", \"\\x1bOQ\", \"\\x1bOR\", \"\\x1bOS\", \"\\x1b[15~\", \"\\x1b[17~\", \"\\x1b[18~\", \"\\x1b[19~\", \"\\x1b[20~\", \"\\x1b[21~\", \"\\x1b[23~\", \"\\x1b[24~\", \"\\x1b[2~\", \"\\x1b[3~\", \"\\x1bOH\", \"\\x1bOF\", \"\\x1b[5~\", \"\\x1b[6~\", \"\\x1bOA\", \"\\x1bOB\", \"\\x1bOD\", \"\\x1bOC\",\n}\nvar xterm_funcs = []string{\n\t\"\\x1b[?1049h\", \"\\x1b[?1049l\", \"\\x1b[?12l\\x1b[?25h\", \"\\x1b[?25l\", \"\\x1b[H\\x1b[2J\", \"\\x1b(B\\x1b[m\", \"\\x1b[4m\", \"\\x1b[1m\", \"\\x1b[5m\", \"\\x1b[7m\", \"\\x1b[?1h\\x1b=\", \"\\x1b[?1l\\x1b>\", ti_mouse_enter, ti_mouse_leave,\n}\n\n// rxvt-unicode\nvar rxvt_unicode_keys = []string{\n\t\"\\x1b[11~\", \"\\x1b[12~\", \"\\x1b[13~\", \"\\x1b[14~\", \"\\x1b[15~\", \"\\x1b[17~\", \"\\x1b[18~\", \"\\x1b[19~\", \"\\x1b[20~\", \"\\x1b[21~\", \"\\x1b[23~\", \"\\x1b[24~\", \"\\x1b[2~\", \"\\x1b[3~\", \"\\x1b[7~\", \"\\x1b[8~\", \"\\x1b[5~\", \"\\x1b[6~\", \"\\x1b[A\", \"\\x1b[B\", \"\\x1b[D\", \"\\x1b[C\",\n}\nvar rxvt_unicode_funcs = []string{\n\t\"\\x1b[?1049h\", \"\\x1b[r\\x1b[?1049l\", \"\\x1b[?25h\", \"\\x1b[?25l\", \"\\x1b[H\\x1b[2J\", \"\\x1b[m\\x1b(B\", \"\\x1b[4m\", \"\\x1b[1m\", \"\\x1b[5m\", \"\\x1b[7m\", \"\\x1b=\", \"\\x1b>\", ti_mouse_enter, ti_mouse_leave,\n}\n\n// linux\nvar linux_keys = []string{\n\t\"\\x1b[[A\", \"\\x1b[[B\", \"\\x1b[[C\", \"\\x1b[[D\", \"\\x1b[[E\", \"\\x1b[17~\", \"\\x1b[18~\", \"\\x1b[19~\", \"\\x1b[20~\", \"\\x1b[21~\", \"\\x1b[23~\", \"\\x1b[24~\", \"\\x1b[2~\", \"\\x1b[3~\", \"\\x1b[1~\", \"\\x1b[4~\", \"\\x1b[5~\", \"\\x1b[6~\", \"\\x1b[A\", \"\\x1b[B\", \"\\x1b[D\", \"\\x1b[C\",\n}\nvar linux_funcs = []string{\n\t\"\", \"\", \"\\x1b[?25h\\x1b[?0c\", \"\\x1b[?25l\\x1b[?1c\", \"\\x1b[H\\x1b[J\", \"\\x1b[0;10m\", \"\\x1b[4m\", \"\\x1b[1m\", \"\\x1b[5m\", \"\\x1b[7m\", \"\", \"\", \"\", \"\",\n}\n\n// rxvt-256color\nvar rxvt_256color_keys = []string{\n\t\"\\x1b[11~\", \"\\x1b[12~\", \"\\x1b[13~\", \"\\x1b[14~\", \"\\x1b[15~\", \"\\x1b[17~\", \"\\x1b[18~\", \"\\x1b[19~\", \"\\x1b[20~\", \"\\x1b[21~\", \"\\x1b[23~\", \"\\x1b[24~\", \"\\x1b[2~\", \"\\x1b[3~\", \"\\x1b[7~\", \"\\x1b[8~\", \"\\x1b[5~\", \"\\x1b[6~\", \"\\x1b[A\", \"\\x1b[B\", \"\\x1b[D\", \"\\x1b[C\",\n}\nvar rxvt_256color_funcs = []string{\n\t\"\\x1b7\\x1b[?47h\", \"\\x1b[2J\\x1b[?47l\\x1b8\", \"\\x1b[?25h\", \"\\x1b[?25l\", \"\\x1b[H\\x1b[2J\", \"\\x1b[m\\x0f\", \"\\x1b[4m\", \"\\x1b[1m\", \"\\x1b[5m\", \"\\x1b[7m\", \"\\x1b=\", \"\\x1b>\", ti_mouse_enter, ti_mouse_leave,\n}\n\nvar terms = []struct {\n\tname  string\n\tkeys  []string\n\tfuncs []string\n}{\n\t{\"Eterm\", eterm_keys, eterm_funcs},\n\t{\"screen\", screen_keys, screen_funcs},\n\t{\"xterm\", xterm_keys, xterm_funcs},\n\t{\"rxvt-unicode\", rxvt_unicode_keys, rxvt_unicode_funcs},\n\t{\"linux\", linux_keys, linux_funcs},\n\t{\"rxvt-256color\", rxvt_256color_keys, rxvt_256color_funcs},\n}\n"
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/LICENCE.md",
    "content": "Copyright (C) 2014 by Oleku Konko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/README.md",
    "content": "ASCII Table Writer\n=========\n\n[![Build Status](https://travis-ci.org/olekukonko/tablewriter.png?branch=master)](https://travis-ci.org/olekukonko/tablewriter) [![Total views](https://sourcegraph.com/api/repos/github.com/olekukonko/tablewriter/counters/views.png)](https://sourcegraph.com/github.com/olekukonko/tablewriter)\n\nGenerate ASCII table on the fly ...  Installation is simple as\n\n    go get  github.com/olekukonko/tablewriter\n\n\n#### Features\n- Automatic Padding\n- Support Multiple Lines\n- Supports Alignment\n- Support Custom Separators\n- Automatic Alignment of numbers & percentage\n- Write directly to http , file etc via `io.Writer`\n- Read directly from CSV file\n- Optional row line via `SetRowLine`\n- Normalise table header\n- Make CSV Headers optional\n- Enable or disable table border\n- Set custom footer support\n- Optional identical cells merging\n\n\n#### Example   1 - Basic\n```go\ndata := [][]string{\n    []string{\"A\", \"The Good\", \"500\"},\n    []string{\"B\", \"The Very very Bad Man\", \"288\"},\n    []string{\"C\", \"The Ugly\", \"120\"},\n    []string{\"D\", \"The Gopher\", \"800\"},\n}\n\ntable := tablewriter.NewWriter(os.Stdout)\ntable.SetHeader([]string{\"Name\", \"Sign\", \"Rating\"})\n\nfor _, v := range data {\n    table.Append(v)\n}\ntable.Render() // Send output\n```\n\n##### Output  1\n```\n+------+-----------------------+--------+\n| NAME |         SIGN          | RATING |\n+------+-----------------------+--------+\n|  A   |       The Good        |    500 |\n|  B   | The Very very Bad Man |    288 |\n|  C   |       The Ugly        |    120 |\n|  D   |      The Gopher       |    800 |\n+------+-----------------------+--------+\n```\n\n#### Example 2 - Without Border / Footer / Bulk Append\n```go\ndata := [][]string{\n    []string{\"1/1/2014\", \"Domain name\", \"2233\", \"$10.98\"},\n    []string{\"1/1/2014\", \"January Hosting\", \"2233\", \"$54.95\"},\n    []string{\"1/4/2014\", \"February Hosting\", \"2233\", \"$51.00\"},\n    []string{\"1/4/2014\", \"February Extra Bandwidth\", \"2233\", \"$30.00\"},\n}\n\ntable := tablewriter.NewWriter(os.Stdout)\ntable.SetHeader([]string{\"Date\", \"Description\", \"CV2\", \"Amount\"})\ntable.SetFooter([]string{\"\", \"\", \"Total\", \"$146.93\"}) // Add Footer\ntable.SetBorder(false)                                // Set Border to false\ntable.AppendBulk(data)                                // Add Bulk Data\ntable.Render()\n```\n\n##### Output 2\n```\n\n    DATE   |       DESCRIPTION        |  CV2  | AMOUNT\n+----------+--------------------------+-------+---------+\n  1/1/2014 | Domain name              |  2233 | $10.98\n  1/1/2014 | January Hosting          |  2233 | $54.95\n  1/4/2014 | February Hosting         |  2233 | $51.00\n  1/4/2014 | February Extra Bandwidth |  2233 | $30.00\n+----------+--------------------------+-------+---------+\n                                        TOTAL | $146 93\n                                      +-------+---------+\n\n```\n\n\n#### Example 3 - CSV\n```go\ntable, _ := tablewriter.NewCSV(os.Stdout, \"test_info.csv\", true)\ntable.SetAlignment(tablewriter.ALIGN_LEFT)   // Set Alignment\ntable.Render()\n```\n\n##### Output 3\n```\n+----------+--------------+------+-----+---------+----------------+\n|  FIELD   |     TYPE     | NULL | KEY | DEFAULT |     EXTRA      |\n+----------+--------------+------+-----+---------+----------------+\n| user_id  | smallint(5)  | NO   | PRI | NULL    | auto_increment |\n| username | varchar(10)  | NO   |     | NULL    |                |\n| password | varchar(100) | NO   |     | NULL    |                |\n+----------+--------------+------+-----+---------+----------------+\n```\n\n#### Example 4  - Custom Separator\n```go\ntable, _ := tablewriter.NewCSV(os.Stdout, \"test.csv\", true)\ntable.SetRowLine(true)         // Enable row line\n\n// Change table lines\ntable.SetCenterSeparator(\"*\")\ntable.SetColumnSeparator(\"‡\")\ntable.SetRowSeparator(\"-\")\n\ntable.SetAlignment(tablewriter.ALIGN_LEFT)\ntable.Render()\n```\n\n##### Output 4\n```\n*------------*-----------*---------*\n╪ FIRST NAME ╪ LAST NAME ╪   SSN   ╪\n*------------*-----------*---------*\n╪ John       ╪ Barry     ╪ 123456  ╪\n*------------*-----------*---------*\n╪ Kathy      ╪ Smith     ╪ 687987  ╪\n*------------*-----------*---------*\n╪ Bob        ╪ McCornick ╪ 3979870 ╪\n*------------*-----------*---------*\n```\n\n##### Example 5 - Markdown Format\n```go\ndata := [][]string{\n\t[]string{\"1/1/2014\", \"Domain name\", \"2233\", \"$10.98\"},\n\t[]string{\"1/1/2014\", \"January Hosting\", \"2233\", \"$54.95\"},\n\t[]string{\"1/4/2014\", \"February Hosting\", \"2233\", \"$51.00\"},\n\t[]string{\"1/4/2014\", \"February Extra Bandwidth\", \"2233\", \"$30.00\"},\n}\n\ntable := tablewriter.NewWriter(os.Stdout)\ntable.SetHeader([]string{\"Date\", \"Description\", \"CV2\", \"Amount\"})\ntable.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false})\ntable.SetCenterSeparator(\"|\")\ntable.AppendBulk(data) // Add Bulk Data\ntable.Render()\n```\n\n##### Output 5\n```\n|   DATE   |       DESCRIPTION        | CV2  | AMOUNT |\n|----------|--------------------------|------|--------|\n| 1/1/2014 | Domain name              | 2233 | $10.98 |\n| 1/1/2014 | January Hosting          | 2233 | $54.95 |\n| 1/4/2014 | February Hosting         | 2233 | $51.00 |\n| 1/4/2014 | February Extra Bandwidth | 2233 | $30.00 |\n```\n\n#### Example 6  - Identical cells merging\n```go\ndata := [][]string{\n  []string{\"1/1/2014\", \"Domain name\", \"1234\", \"$10.98\"},\n  []string{\"1/1/2014\", \"January Hosting\", \"2345\", \"$54.95\"},\n  []string{\"1/4/2014\", \"February Hosting\", \"3456\", \"$51.00\"},\n  []string{\"1/4/2014\", \"February Extra Bandwidth\", \"4567\", \"$30.00\"},\n}\n\ntable := tablewriter.NewWriter(os.Stdout)\ntable.SetHeader([]string{\"Date\", \"Description\", \"CV2\", \"Amount\"})\ntable.SetFooter([]string{\"\", \"\", \"Total\", \"$146.93\"})\ntable.SetAutoMergeCells(true)\ntable.SetRowLine(true)\ntable.AppendBulk(data)\ntable.Render()\n```\n\n##### Output 6\n```\n+----------+--------------------------+-------+---------+\n|   DATE   |       DESCRIPTION        |  CV2  | AMOUNT  |\n+----------+--------------------------+-------+---------+\n| 1/1/2014 | Domain name              |  1234 | $10.98  |\n+          +--------------------------+-------+---------+\n|          | January Hosting          |  2345 | $54.95  |\n+----------+--------------------------+-------+---------+\n| 1/4/2014 | February Hosting         |  3456 | $51.00  |\n+          +--------------------------+-------+---------+\n|          | February Extra Bandwidth |  4567 | $30.00  |\n+----------+--------------------------+-------+---------+\n|                                       TOTAL | $146 93 |\n+----------+--------------------------+-------+---------+\n```\n\n#### TODO\n- ~~Import Directly from CSV~~  - `done`\n- ~~Support for `SetFooter`~~  - `done`\n- ~~Support for `SetBorder`~~  - `done`\n- ~~Support table with uneven rows~~ - `done`\n- Support custom alignment\n- General Improvement & Optimisation\n- `NewHTML` Parse table from HTML\n"
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/csv.go",
    "content": "// Copyright 2014 Oleku Konko All rights reserved.\n// Use of this source code is governed by a MIT\n// license that can be found in the LICENSE file.\n\n// This module is a Table Writer  API for the Go Programming Language.\n// The protocols were written in pure Go and works on windows and unix systems\n\npackage tablewriter\n\nimport (\n\t\"encoding/csv\"\n\t\"io\"\n\t\"os\"\n)\n\n// Start A new table by importing from a CSV file\n// Takes io.Writer and csv File name\nfunc NewCSV(writer io.Writer, fileName string, hasHeader bool) (*Table, error) {\n\tfile, err := os.Open(fileName)\n\tif err != nil {\n\t\treturn &Table{}, err\n\t}\n\tdefer file.Close()\n\tcsvReader := csv.NewReader(file)\n\tt, err := NewCSVReader(writer, csvReader, hasHeader)\n\treturn t, err\n}\n\n//  Start a New Table Writer with csv.Reader\n// This enables customisation such as reader.Comma = ';'\n// See http://golang.org/src/pkg/encoding/csv/reader.go?s=3213:3671#L94\nfunc NewCSVReader(writer io.Writer, csvReader *csv.Reader, hasHeader bool) (*Table, error) {\n\tt := NewWriter(writer)\n\tif hasHeader {\n\t\t// Read the first row\n\t\theaders, err := csvReader.Read()\n\t\tif err != nil {\n\t\t\treturn &Table{}, err\n\t\t}\n\t\tt.SetHeader(headers)\n\t}\n\tfor {\n\t\trecord, err := csvReader.Read()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn &Table{}, err\n\t\t}\n\t\tt.Append(record)\n\t}\n\treturn t, nil\n}\n"
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/table.go",
    "content": "// Copyright 2014 Oleku Konko All rights reserved.\n// Use of this source code is governed by a MIT\n// license that can be found in the LICENSE file.\n\n// This module is a Table Writer  API for the Go Programming Language.\n// The protocols were written in pure Go and works on windows and unix systems\n\n// Create & Generate text based table\npackage tablewriter\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nconst (\n\tMAX_ROW_WIDTH = 30\n)\n\nconst (\n\tCENTER  = \"+\"\n\tROW     = \"-\"\n\tCOLUMN  = \"|\"\n\tSPACE   = \" \"\n\tNEWLINE = \"\\n\"\n)\n\nconst (\n\tALIGN_DEFAULT = iota\n\tALIGN_CENTER\n\tALIGN_RIGHT\n\tALIGN_LEFT\n)\n\nvar (\n\tdecimal = regexp.MustCompile(`^-*\\d*\\.?\\d*$`)\n\tpercent = regexp.MustCompile(`^-*\\d*\\.?\\d*$%$`)\n)\n\ntype Border struct {\n\tLeft   bool\n\tRight  bool\n\tTop    bool\n\tBottom bool\n}\n\ntype Table struct {\n\tout            io.Writer\n\trows           [][]string\n\tlines          [][][]string\n\tcs             map[int]int\n\trs             map[int]int\n\theaders        []string\n\tfooters        []string\n\tautoFmt        bool\n\tautoWrap       bool\n\tmW             int\n\tpCenter        string\n\tpRow           string\n\tpColumn        string\n\ttColumn        int\n\ttRow           int\n\thAlign         int\n\tfAlign         int\n\talign          int\n\tnewLine        string\n\trowLine        bool\n\tautoMergeCells bool\n\thdrLine        bool\n\tborders        Border\n\tcolSize        int\n}\n\n// Start New Table\n// Take io.Writer Directly\nfunc NewWriter(writer io.Writer) *Table {\n\tt := &Table{\n\t\tout:      writer,\n\t\trows:     [][]string{},\n\t\tlines:    [][][]string{},\n\t\tcs:       make(map[int]int),\n\t\trs:       make(map[int]int),\n\t\theaders:  []string{},\n\t\tfooters:  []string{},\n\t\tautoFmt:  true,\n\t\tautoWrap: true,\n\t\tmW:       MAX_ROW_WIDTH,\n\t\tpCenter:  CENTER,\n\t\tpRow:     ROW,\n\t\tpColumn:  COLUMN,\n\t\ttColumn:  -1,\n\t\ttRow:     -1,\n\t\thAlign:   ALIGN_DEFAULT,\n\t\tfAlign:   ALIGN_DEFAULT,\n\t\talign:    ALIGN_DEFAULT,\n\t\tnewLine:  NEWLINE,\n\t\trowLine:  false,\n\t\thdrLine:  true,\n\t\tborders:  Border{Left: true, Right: true, Bottom: true, Top: true},\n\t\tcolSize:  -1}\n\treturn t\n}\n\n// Render table output\nfunc (t Table) Render() {\n\tif t.borders.Top {\n\t\tt.printLine(true)\n\t}\n\tt.printHeading()\n\tif t.autoMergeCells {\n\t\tt.printRowsMergeCells()\n\t} else {\n\t\tt.printRows()\n\t}\n\n\tif !t.rowLine && t.borders.Bottom {\n\t\tt.printLine(true)\n\t}\n\tt.printFooter()\n\n}\n\n// Set table header\nfunc (t *Table) SetHeader(keys []string) {\n\tt.colSize = len(keys)\n\tfor i, v := range keys {\n\t\tt.parseDimension(v, i, -1)\n\t\tt.headers = append(t.headers, v)\n\t}\n}\n\n// Set table Footer\nfunc (t *Table) SetFooter(keys []string) {\n\t//t.colSize = len(keys)\n\tfor i, v := range keys {\n\t\tt.parseDimension(v, i, -1)\n\t\tt.footers = append(t.footers, v)\n\t}\n}\n\n// Turn header autoformatting on/off. Default is on (true).\nfunc (t *Table) SetAutoFormatHeaders(auto bool) {\n\tt.autoFmt = auto\n}\n\n// Turn automatic multiline text adjustment on/off. Default is on (true).\nfunc (t *Table) SetAutoWrapText(auto bool) {\n\tt.autoWrap = auto\n}\n\n// Set the Default column width\nfunc (t *Table) SetColWidth(width int) {\n\tt.mW = width\n}\n\n// Set the Column Separator\nfunc (t *Table) SetColumnSeparator(sep string) {\n\tt.pColumn = sep\n}\n\n// Set the Row Separator\nfunc (t *Table) SetRowSeparator(sep string) {\n\tt.pRow = sep\n}\n\n// Set the center Separator\nfunc (t *Table) SetCenterSeparator(sep string) {\n\tt.pCenter = sep\n}\n\n// Set Header Alignment\nfunc (t *Table) SetHeaderAlignment(hAlign int) {\n\tt.hAlign = hAlign\n}\n\n// Set Footer Alignment\nfunc (t *Table) SetFooterAlignment(fAlign int) {\n\tt.fAlign = fAlign\n}\n\n// Set Table Alignment\nfunc (t *Table) SetAlignment(align int) {\n\tt.align = align\n}\n\n// Set New Line\nfunc (t *Table) SetNewLine(nl string) {\n\tt.newLine = nl\n}\n\n// Set Header Line\n// This would enable / disable a line after the header\nfunc (t *Table) SetHeaderLine(line bool) {\n\tt.hdrLine = line\n}\n\n// Set Row Line\n// This would enable / disable a line on each row of the table\nfunc (t *Table) SetRowLine(line bool) {\n\tt.rowLine = line\n}\n\n// Set Auto Merge Cells\n// This would enable / disable the merge of cells with identical values\nfunc (t *Table) SetAutoMergeCells(auto bool) {\n\tt.autoMergeCells = auto\n}\n\n// Set Table Border\n// This would enable / disable line around the table\nfunc (t *Table) SetBorder(border bool) {\n\tt.SetBorders(Border{border, border, border, border})\n}\n\nfunc (t *Table) SetBorders(border Border) {\n\tt.borders = border\n}\n\n// Append row to table\nfunc (t *Table) Append(row []string) {\n\trowSize := len(t.headers)\n\tif rowSize > t.colSize {\n\t\tt.colSize = rowSize\n\t}\n\n\tn := len(t.lines)\n\tline := [][]string{}\n\tfor i, v := range row {\n\n\t\t// Detect string  width\n\t\t// Detect String height\n\t\t// Break strings into words\n\t\tout := t.parseDimension(v, i, n)\n\n\t\t// Append broken words\n\t\tline = append(line, out)\n\t}\n\tt.lines = append(t.lines, line)\n}\n\n// Allow Support for Bulk Append\n// Eliminates repeated for loops\nfunc (t *Table) AppendBulk(rows [][]string) {\n\tfor _, row := range rows {\n\t\tt.Append(row)\n\t}\n}\n\n// Print line based on row width\nfunc (t Table) printLine(nl bool) {\n\tfmt.Fprint(t.out, t.pCenter)\n\tfor i := 0; i < len(t.cs); i++ {\n\t\tv := t.cs[i]\n\t\tfmt.Fprintf(t.out, \"%s%s%s%s\",\n\t\t\tt.pRow,\n\t\t\tstrings.Repeat(string(t.pRow), v),\n\t\t\tt.pRow,\n\t\t\tt.pCenter)\n\t}\n\tif nl {\n\t\tfmt.Fprint(t.out, t.newLine)\n\t}\n}\n\n// Print line based on row width with our without cell separator\nfunc (t Table) printLineOptionalCellSeparators(nl bool, displayCellSeparator []bool) {\n\tfmt.Fprint(t.out, t.pCenter)\n\tfor i := 0; i < len(t.cs); i++ {\n\t\tv := t.cs[i]\n\t\tif i > len(displayCellSeparator) || displayCellSeparator[i] {\n\t\t\t// Display the cell separator\n\t\t\tfmt.Fprintf(t.out, \"%s%s%s%s\",\n\t\t\t\tt.pRow,\n\t\t\t\tstrings.Repeat(string(t.pRow), v),\n\t\t\t\tt.pRow,\n\t\t\t\tt.pCenter)\n\t\t} else {\n\t\t\t// Don't display the cell separator for this cell\n\t\t\tfmt.Fprintf(t.out, \"%s%s\",\n\t\t\t\tstrings.Repeat(\" \", v+2),\n\t\t\t\tt.pCenter)\n\t\t}\n\t}\n\tif nl {\n\t\tfmt.Fprint(t.out, t.newLine)\n\t}\n}\n\n// Return the PadRight function if align is left, PadLeft if align is right,\n// and Pad by default\nfunc pad(align int) func(string, string, int) string {\n\tpadFunc := Pad\n\tswitch align {\n\tcase ALIGN_LEFT:\n\t\tpadFunc = PadRight\n\tcase ALIGN_RIGHT:\n\t\tpadFunc = PadLeft\n\t}\n\treturn padFunc\n}\n\n// Print heading information\nfunc (t Table) printHeading() {\n\t// Check if headers is available\n\tif len(t.headers) < 1 {\n\t\treturn\n\t}\n\n\t// Check if border is set\n\t// Replace with space if not set\n\tfmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE))\n\n\t// Identify last column\n\tend := len(t.cs) - 1\n\n\t// Get pad function\n\tpadFunc := pad(t.hAlign)\n\n\t// Print Heading column\n\tfor i := 0; i <= end; i++ {\n\t\tv := t.cs[i]\n\t\th := t.headers[i]\n\t\tif t.autoFmt {\n\t\t\th = Title(h)\n\t\t}\n\t\tpad := ConditionString((i == end && !t.borders.Left), SPACE, t.pColumn)\n\t\tfmt.Fprintf(t.out, \" %s %s\",\n\t\t\tpadFunc(h, SPACE, v),\n\t\t\tpad)\n\t}\n\t// Next line\n\tfmt.Fprint(t.out, t.newLine)\n\tif t.hdrLine {\n\t\tt.printLine(true)\n\t}\n}\n\n// Print heading information\nfunc (t Table) printFooter() {\n\t// Check if headers is available\n\tif len(t.footers) < 1 {\n\t\treturn\n\t}\n\n\t// Only print line if border is not set\n\tif !t.borders.Bottom {\n\t\tt.printLine(true)\n\t}\n\t// Check if border is set\n\t// Replace with space if not set\n\tfmt.Fprint(t.out, ConditionString(t.borders.Bottom, t.pColumn, SPACE))\n\n\t// Identify last column\n\tend := len(t.cs) - 1\n\n\t// Get pad function\n\tpadFunc := pad(t.fAlign)\n\n\t// Print Heading column\n\tfor i := 0; i <= end; i++ {\n\t\tv := t.cs[i]\n\t\tf := t.footers[i]\n\t\tif t.autoFmt {\n\t\t\tf = Title(f)\n\t\t}\n\t\tpad := ConditionString((i == end && !t.borders.Top), SPACE, t.pColumn)\n\n\t\tif len(t.footers[i]) == 0 {\n\t\t\tpad = SPACE\n\t\t}\n\t\tfmt.Fprintf(t.out, \" %s %s\",\n\t\t\tpadFunc(f, SPACE, v),\n\t\t\tpad)\n\t}\n\t// Next line\n\tfmt.Fprint(t.out, t.newLine)\n\t//t.printLine(true)\n\n\thasPrinted := false\n\n\tfor i := 0; i <= end; i++ {\n\t\tv := t.cs[i]\n\t\tpad := t.pRow\n\t\tcenter := t.pCenter\n\t\tlength := len(t.footers[i])\n\n\t\tif length > 0 {\n\t\t\thasPrinted = true\n\t\t}\n\n\t\t// Set center to be space if length is 0\n\t\tif length == 0 && !t.borders.Right {\n\t\t\tcenter = SPACE\n\t\t}\n\n\t\t// Print first junction\n\t\tif i == 0 {\n\t\t\tfmt.Fprint(t.out, center)\n\t\t}\n\n\t\t// Pad With space of length is 0\n\t\tif length == 0 {\n\t\t\tpad = SPACE\n\t\t}\n\t\t// Ignore left space of it has printed before\n\t\tif hasPrinted || t.borders.Left {\n\t\t\tpad = t.pRow\n\t\t\tcenter = t.pCenter\n\t\t}\n\n\t\t// Change Center start position\n\t\tif center == SPACE {\n\t\t\tif i < end && len(t.footers[i+1]) != 0 {\n\t\t\t\tcenter = t.pCenter\n\t\t\t}\n\t\t}\n\n\t\t// Print the footer\n\t\tfmt.Fprintf(t.out, \"%s%s%s%s\",\n\t\t\tpad,\n\t\t\tstrings.Repeat(string(pad), v),\n\t\t\tpad,\n\t\t\tcenter)\n\n\t}\n\n\tfmt.Fprint(t.out, t.newLine)\n\n}\n\nfunc (t Table) printRows() {\n\tfor i, lines := range t.lines {\n\t\tt.printRow(lines, i)\n\t}\n\n}\n\n// Print Row Information\n// Adjust column alignment based on type\n\nfunc (t Table) printRow(columns [][]string, colKey int) {\n\t// Get Maximum Height\n\tmax := t.rs[colKey]\n\ttotal := len(columns)\n\n\t// TODO Fix uneven col size\n\t// if total < t.colSize {\n\t//\tfor n := t.colSize - total; n < t.colSize ; n++ {\n\t//\t\tcolumns = append(columns, []string{SPACE})\n\t//\t\tt.cs[n] = t.mW\n\t//\t}\n\t//}\n\n\t// Pad Each Height\n\t// pads := []int{}\n\tpads := []int{}\n\n\tfor i, line := range columns {\n\t\tlength := len(line)\n\t\tpad := max - length\n\t\tpads = append(pads, pad)\n\t\tfor n := 0; n < pad; n++ {\n\t\t\tcolumns[i] = append(columns[i], \"  \")\n\t\t}\n\t}\n\t//fmt.Println(max, \"\\n\")\n\tfor x := 0; x < max; x++ {\n\t\tfor y := 0; y < total; y++ {\n\n\t\t\t// Check if border is set\n\t\t\tfmt.Fprint(t.out, ConditionString((!t.borders.Left && y == 0), SPACE, t.pColumn))\n\n\t\t\tfmt.Fprintf(t.out, SPACE)\n\t\t\tstr := columns[y][x]\n\n\t\t\t// This would print alignment\n\t\t\t// Default alignment  would use multiple configuration\n\t\t\tswitch t.align {\n\t\t\tcase ALIGN_CENTER: //\n\t\t\t\tfmt.Fprintf(t.out, \"%s\", Pad(str, SPACE, t.cs[y]))\n\t\t\tcase ALIGN_RIGHT:\n\t\t\t\tfmt.Fprintf(t.out, \"%s\", PadLeft(str, SPACE, t.cs[y]))\n\t\t\tcase ALIGN_LEFT:\n\t\t\t\tfmt.Fprintf(t.out, \"%s\", PadRight(str, SPACE, t.cs[y]))\n\t\t\tdefault:\n\t\t\t\tif decimal.MatchString(strings.TrimSpace(str)) || percent.MatchString(strings.TrimSpace(str)) {\n\t\t\t\t\tfmt.Fprintf(t.out, \"%s\", PadLeft(str, SPACE, t.cs[y]))\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Fprintf(t.out, \"%s\", PadRight(str, SPACE, t.cs[y]))\n\n\t\t\t\t\t// TODO Custom alignment per column\n\t\t\t\t\t//if max == 1 || pads[y] > 0 {\n\t\t\t\t\t//\tfmt.Fprintf(t.out, \"%s\", Pad(str, SPACE, t.cs[y]))\n\t\t\t\t\t//} else {\n\t\t\t\t\t//\tfmt.Fprintf(t.out, \"%s\", PadRight(str, SPACE, t.cs[y]))\n\t\t\t\t\t//}\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tfmt.Fprintf(t.out, SPACE)\n\t\t}\n\t\t// Check if border is set\n\t\t// Replace with space if not set\n\t\tfmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE))\n\t\tfmt.Fprint(t.out, t.newLine)\n\t}\n\n\tif t.rowLine {\n\t\tt.printLine(true)\n\t}\n}\n\n// Print the rows of the table and merge the cells that are identical\nfunc (t Table) printRowsMergeCells() {\n\tvar previousLine []string\n\tvar displayCellBorder []bool\n\tvar tmpWriter bytes.Buffer\n\tfor i, lines := range t.lines {\n\t\t// We store the display of the current line in a tmp writer, as we need to know which border needs to be print above\n\t\tpreviousLine, displayCellBorder = t.printRowMergeCells(&tmpWriter, lines, i, previousLine)\n\t\tif i > 0 { //We don't need to print borders above first line\n\t\t\tif t.rowLine {\n\t\t\t\tt.printLineOptionalCellSeparators(true, displayCellBorder)\n\t\t\t}\n\t\t}\n\t\ttmpWriter.WriteTo(t.out)\n\t}\n\t//Print the end of the table\n\tif t.rowLine {\n\t\tt.printLine(true)\n\t}\n}\n\n// Print Row Information to a writer and merge identical cells.\n// Adjust column alignment based on type\n\nfunc (t Table) printRowMergeCells(writer io.Writer, columns [][]string, colKey int, previousLine []string) ([]string, []bool) {\n\t// Get Maximum Height\n\tmax := t.rs[colKey]\n\ttotal := len(columns)\n\n\t// Pad Each Height\n\tpads := []int{}\n\n\tfor i, line := range columns {\n\t\tlength := len(line)\n\t\tpad := max - length\n\t\tpads = append(pads, pad)\n\t\tfor n := 0; n < pad; n++ {\n\t\t\tcolumns[i] = append(columns[i], \"  \")\n\t\t}\n\t}\n\n\tvar displayCellBorder []bool\n\tfor x := 0; x < max; x++ {\n\t\tfor y := 0; y < total; y++ {\n\n\t\t\t// Check if border is set\n\t\t\tfmt.Fprint(writer, ConditionString((!t.borders.Left && y == 0), SPACE, t.pColumn))\n\n\t\t\tfmt.Fprintf(writer, SPACE)\n\n\t\t\tstr := columns[y][x]\n\n\t\t\tif t.autoMergeCells {\n\t\t\t\t//Store the full line to merge mutli-lines cells\n\t\t\t\tfullLine := strings.Join(columns[y], \" \")\n\t\t\t\tif len(previousLine) > y && fullLine == previousLine[y] && fullLine != \"\" {\n\t\t\t\t\t// If this cell is identical to the one above but not empty, we don't display the border and keep the cell empty.\n\t\t\t\t\tdisplayCellBorder = append(displayCellBorder, false)\n\t\t\t\t\tstr = \"\"\n\t\t\t\t} else {\n\t\t\t\t\t// First line or different content, keep the content and print the cell border\n\t\t\t\t\tdisplayCellBorder = append(displayCellBorder, true)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// This would print alignment\n\t\t\t// Default alignment  would use multiple configuration\n\t\t\tswitch t.align {\n\t\t\tcase ALIGN_CENTER: //\n\t\t\t\tfmt.Fprintf(writer, \"%s\", Pad(str, SPACE, t.cs[y]))\n\t\t\tcase ALIGN_RIGHT:\n\t\t\t\tfmt.Fprintf(writer, \"%s\", PadLeft(str, SPACE, t.cs[y]))\n\t\t\tcase ALIGN_LEFT:\n\t\t\t\tfmt.Fprintf(writer, \"%s\", PadRight(str, SPACE, t.cs[y]))\n\t\t\tdefault:\n\t\t\t\tif decimal.MatchString(strings.TrimSpace(str)) || percent.MatchString(strings.TrimSpace(str)) {\n\t\t\t\t\tfmt.Fprintf(writer, \"%s\", PadLeft(str, SPACE, t.cs[y]))\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Fprintf(writer, \"%s\", PadRight(str, SPACE, t.cs[y]))\n\t\t\t\t}\n\t\t\t}\n\t\t\tfmt.Fprintf(writer, SPACE)\n\t\t}\n\t\t// Check if border is set\n\t\t// Replace with space if not set\n\t\tfmt.Fprint(writer, ConditionString(t.borders.Left, t.pColumn, SPACE))\n\t\tfmt.Fprint(writer, t.newLine)\n\t}\n\n\t//The new previous line is the current one\n\tpreviousLine = make([]string, total)\n\tfor y := 0; y < total; y++ {\n\t\tpreviousLine[y] = strings.Join(columns[y], \" \") //Store the full line for multi-lines cells\n\t}\n\t//Returns the newly added line and wether or not a border should be displayed above.\n\treturn previousLine, displayCellBorder\n}\n\nfunc (t *Table) parseDimension(str string, colKey, rowKey int) []string {\n\tvar (\n\t\traw []string\n\t\tmax int\n\t)\n\tw := DisplayWidth(str)\n\t// Calculate Width\n\t// Check if with is grater than maximum width\n\tif w > t.mW {\n\t\tw = t.mW\n\t}\n\n\t// Check if width exists\n\tv, ok := t.cs[colKey]\n\tif !ok || v < w || v == 0 {\n\t\tt.cs[colKey] = w\n\t}\n\n\tif rowKey == -1 {\n\t\treturn raw\n\t}\n\t// Calculate Height\n\tif t.autoWrap {\n\t\traw, _ = WrapString(str, t.cs[colKey])\n\t} else {\n\t\traw = getLines(str)\n\t}\n\n\tfor _, line := range raw {\n\t\tif w := DisplayWidth(line); w > max {\n\t\t\tmax = w\n\t\t}\n\t}\n\n\t// Make sure the with is the same length as maximum word\n\t// Important for cases where the width is smaller than maxu word\n\tif max > t.cs[colKey] {\n\t\tt.cs[colKey] = max\n\t}\n\n\th := len(raw)\n\tv, ok = t.rs[rowKey]\n\n\tif !ok || v < h || v == 0 {\n\t\tt.rs[rowKey] = h\n\t}\n\t//fmt.Printf(\"Raw %+v %d\\n\", raw, len(raw))\n\treturn raw\n}\n"
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/test.csv",
    "content": "first_name,last_name,ssn\nJohn,Barry,123456\nKathy,Smith,687987\nBob,McCornick,3979870"
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/test_info.csv",
    "content": "Field,Type,Null,Key,Default,Extra\nuser_id,smallint(5),NO,PRI,NULL,auto_increment\nusername,varchar(10),NO,,NULL, \npassword,varchar(100),NO,,NULL, "
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/util.go",
    "content": "// Copyright 2014 Oleku Konko All rights reserved.\n// Use of this source code is governed by a MIT\n// license that can be found in the LICENSE file.\n\n// This module is a Table Writer  API for the Go Programming Language.\n// The protocols were written in pure Go and works on windows and unix systems\n\npackage tablewriter\n\nimport (\n\t\"math\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/mattn/go-runewidth\"\n)\n\nvar ansi = regexp.MustCompile(\"\\033\\\\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]\")\n\nfunc DisplayWidth(str string) int {\n\treturn runewidth.StringWidth(ansi.ReplaceAllLiteralString(str, \"\"))\n}\n\n// Simple Condition for string\n// Returns value based on condition\nfunc ConditionString(cond bool, valid, inValid string) string {\n\tif cond {\n\t\treturn valid\n\t}\n\treturn inValid\n}\n\n// Format Table Header\n// Replace _ , . and spaces\nfunc Title(name string) string {\n\tname = strings.Replace(name, \"_\", \" \", -1)\n\tname = strings.Replace(name, \".\", \" \", -1)\n\tname = strings.TrimSpace(name)\n\treturn strings.ToUpper(name)\n}\n\n// Pad String\n// Attempts to play string in the center\nfunc Pad(s, pad string, width int) string {\n\tgap := width - DisplayWidth(s)\n\tif gap > 0 {\n\t\tgapLeft := int(math.Ceil(float64(gap / 2)))\n\t\tgapRight := gap - gapLeft\n\t\treturn strings.Repeat(string(pad), gapLeft) + s + strings.Repeat(string(pad), gapRight)\n\t}\n\treturn s\n}\n\n// Pad String Right position\n// This would pace string at the left side fo the screen\nfunc PadRight(s, pad string, width int) string {\n\tgap := width - DisplayWidth(s)\n\tif gap > 0 {\n\t\treturn s + strings.Repeat(string(pad), gap)\n\t}\n\treturn s\n}\n\n// Pad String Left position\n// This would pace string at the right side fo the screen\nfunc PadLeft(s, pad string, width int) string {\n\tgap := width - DisplayWidth(s)\n\tif gap > 0 {\n\t\treturn strings.Repeat(string(pad), gap) + s\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "vendor/github.com/olekukonko/tablewriter/wrap.go",
    "content": "// Copyright 2014 Oleku Konko All rights reserved.\n// Use of this source code is governed by a MIT\n// license that can be found in the LICENSE file.\n\n// This module is a Table Writer  API for the Go Programming Language.\n// The protocols were written in pure Go and works on windows and unix systems\n\npackage tablewriter\n\nimport (\n\t\"math\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\nvar (\n\tnl = \"\\n\"\n\tsp = \" \"\n)\n\nconst defaultPenalty = 1e5\n\n// Wrap wraps s into a paragraph of lines of length lim, with minimal\n// raggedness.\nfunc WrapString(s string, lim int) ([]string, int) {\n\twords := strings.Split(strings.Replace(s, nl, sp, -1), sp)\n\tvar lines []string\n\tmax := 0\n\tfor _, v := range words {\n\t\tmax = len(v)\n\t\tif max > lim {\n\t\t\tlim = max\n\t\t}\n\t}\n\tfor _, line := range WrapWords(words, 1, lim, defaultPenalty) {\n\t\tlines = append(lines, strings.Join(line, sp))\n\t}\n\treturn lines, lim\n}\n\n// WrapWords is the low-level line-breaking algorithm, useful if you need more\n// control over the details of the text wrapping process. For most uses,\n// WrapString will be sufficient and more convenient.\n//\n// WrapWords splits a list of words into lines with minimal \"raggedness\",\n// treating each rune as one unit, accounting for spc units between adjacent\n// words on each line, and attempting to limit lines to lim units. Raggedness\n// is the total error over all lines, where error is the square of the\n// difference of the length of the line and lim. Too-long lines (which only\n// happen when a single word is longer than lim units) have pen penalty units\n// added to the error.\nfunc WrapWords(words []string, spc, lim, pen int) [][]string {\n\tn := len(words)\n\n\tlength := make([][]int, n)\n\tfor i := 0; i < n; i++ {\n\t\tlength[i] = make([]int, n)\n\t\tlength[i][i] = utf8.RuneCountInString(words[i])\n\t\tfor j := i + 1; j < n; j++ {\n\t\t\tlength[i][j] = length[i][j-1] + spc + utf8.RuneCountInString(words[j])\n\t\t}\n\t}\n\tnbrk := make([]int, n)\n\tcost := make([]int, n)\n\tfor i := range cost {\n\t\tcost[i] = math.MaxInt32\n\t}\n\tfor i := n - 1; i >= 0; i-- {\n\t\tif length[i][n-1] <= lim {\n\t\t\tcost[i] = 0\n\t\t\tnbrk[i] = n\n\t\t} else {\n\t\t\tfor j := i + 1; j < n; j++ {\n\t\t\t\td := lim - length[i][j-1]\n\t\t\t\tc := d*d + cost[j]\n\t\t\t\tif length[i][j-1] > lim {\n\t\t\t\t\tc += pen // too-long lines get a worse penalty\n\t\t\t\t}\n\t\t\t\tif c < cost[i] {\n\t\t\t\t\tcost[i] = c\n\t\t\t\t\tnbrk[i] = j\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar lines [][]string\n\ti := 0\n\tfor i < n {\n\t\tlines = append(lines, words[i:nbrk[i]])\n\t\ti = nbrk[i]\n\t}\n\treturn lines\n}\n\n// getLines decomposes a multiline string into a slice of strings.\nfunc getLines(s string) []string {\n\tvar lines []string\n\n\tfor _, line := range strings.Split(s, nl) {\n\t\tlines = append(lines, line)\n\t}\n\treturn lines\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/CHANGELOG.md",
    "content": "Changes by Version\n==================\n\n1.1.0 (unreleased)\n-------------------\n\n- Deprecate InitGlobalTracer() in favor of SetGlobalTracer()\n\n\n1.0.0 (2016-09-26)\n-------------------\n\n- This release implements OpenTracing Specification 1.0 (http://opentracing.io/spec)\n\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2016 The OpenTracing Authors\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/Makefile",
    "content": "PACKAGES := . ./mocktracer/... ./ext/...\n\n.DEFAULT_GOAL := test-and-lint\n\n.PHONE: test-and-lint\n\ntest-and-lint: test lint\n\n.PHONY: test\ntest:\n\tgo test -v -cover -race ./...\n\ncover:\n\t@rm -rf cover-all.out\n\t$(foreach pkg, $(PACKAGES), $(MAKE) cover-pkg PKG=$(pkg) || true;)\n\t@grep mode: cover.out > coverage.out\n\t@cat cover-all.out >> coverage.out\n\tgo tool cover -html=coverage.out -o cover.html\n\t@rm -rf cover.out cover-all.out coverage.out\n\ncover-pkg:\n\tgo test -coverprofile cover.out $(PKG)\n\t@grep -v mode: cover.out >> cover-all.out\n\n.PHONY: lint\nlint:\n\tgo fmt ./...\n\tgolint ./...\n\t@# Run again with magic to exit non-zero if golint outputs anything.\n\t@! (golint ./... | read dummy)\n\tgo vet ./...\n\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/README.md",
    "content": "[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/opentracing/public) [![Build Status](https://travis-ci.org/opentracing/opentracing-go.svg?branch=master)](https://travis-ci.org/opentracing/opentracing-go) [![GoDoc](https://godoc.org/github.com/opentracing/opentracing-go?status.svg)](http://godoc.org/github.com/opentracing/opentracing-go)\n[![Sourcegraph Badge](https://sourcegraph.com/github.com/opentracing/opentracing-go/-/badge.svg)](https://sourcegraph.com/github.com/opentracing/opentracing-go?badge)\n\n# OpenTracing API for Go\n\nThis package is a Go platform API for OpenTracing.\n\n## Required Reading\n\nIn order to understand the Go platform API, one must first be familiar with the\n[OpenTracing project](http://opentracing.io) and\n[terminology](http://opentracing.io/documentation/pages/spec.html) more specifically.\n\n## API overview for those adding instrumentation\n\nEveryday consumers of this `opentracing` package really only need to worry\nabout a couple of key abstractions: the `StartSpan` function, the `Span`\ninterface, and binding a `Tracer` at `main()`-time. Here are code snippets\ndemonstrating some important use cases.\n\n#### Singleton initialization\n\nThe simplest starting point is `./default_tracer.go`. As early as possible, call\n\n```go\n    import \"github.com/opentracing/opentracing-go\"\n    import \".../some_tracing_impl\"\n\n    func main() {\n        opentracing.SetGlobalTracer(\n            // tracing impl specific:\n            some_tracing_impl.New(...),\n        )\n        ...\n    }\n```\n\n#### Non-Singleton initialization\n\nIf you prefer direct control to singletons, manage ownership of the\n`opentracing.Tracer` implementation explicitly.\n\n#### Creating a Span given an existing Go `context.Context`\n\nIf you use `context.Context` in your application, OpenTracing's Go library will\nhappily rely on it for `Span` propagation. To start a new (blocking child)\n`Span`, you can use `StartSpanFromContext`.\n\n```go\n    func xyz(ctx context.Context, ...) {\n        ...\n        span, ctx := opentracing.StartSpanFromContext(ctx, \"operation_name\")\n        defer span.Finish()\n        span.LogFields(\n            log.String(\"event\", \"soft error\"),\n            log.String(\"type\", \"cache timeout\"),\n            log.Int(\"waited.millis\", 1500))\n        ...\n    }\n```\n\n#### Starting an empty trace by creating a \"root span\"\n\nIt's always possible to create a \"root\" `Span` with no parent or other causal\nreference.\n\n```go\n    func xyz() {\n        ...\n        sp := opentracing.StartSpan(\"operation_name\")\n        defer sp.Finish()\n        ...\n    }\n```\n\n#### Creating a (child) Span given an existing (parent) Span\n\n```go\n    func xyz(parentSpan opentracing.Span, ...) {\n        ...\n        sp := opentracing.StartSpan(\n            \"operation_name\",\n            opentracing.ChildOf(parentSpan.Context()))\n        defer sp.Finish()\n        ...\n    }\n```\n\n#### Serializing to the wire\n\n```go\n    func makeSomeRequest(ctx context.Context) ... {\n        if span := opentracing.SpanFromContext(ctx); span != nil {\n            httpClient := &http.Client{}\n            httpReq, _ := http.NewRequest(\"GET\", \"http://myservice/\", nil)\n\n            // Transmit the span's TraceContext as HTTP headers on our\n            // outbound request.\n            opentracing.GlobalTracer().Inject(\n                span.Context(),\n                opentracing.HTTPHeaders,\n                opentracing.HTTPHeadersCarrier(httpReq.Header))\n\n            resp, err := httpClient.Do(httpReq)\n            ...\n        }\n        ...\n    }\n```\n\n#### Deserializing from the wire\n\n```go\n    http.HandleFunc(\"/\", func(w http.ResponseWriter, req *http.Request) {\n        var serverSpan opentracing.Span\n        appSpecificOperationName := ...\n        wireContext, err := opentracing.GlobalTracer().Extract(\n            opentracing.HTTPHeaders,\n            opentracing.HTTPHeadersCarrier(req.Header))\n        if err != nil {\n            // Optionally record something about err here\n        }\n\n        // Create the span referring to the RPC client if available.\n        // If wireContext == nil, a root span will be created.\n        serverSpan = opentracing.StartSpan(\n            appSpecificOperationName,\n            ext.RPCServerOption(wireContext))\n\n        defer serverSpan.Finish()\n\n        ctx := opentracing.ContextWithSpan(context.Background(), serverSpan)\n        ...\n    }\n```\n\n#### Conditionally capture a field using `log.Noop`\n\nIn some situations, you may want to dynamically decide whether or not\nto log a field.  For example, you may want to capture additional data,\nsuch as a customer ID, in non-production environments:\n\n```go\n    func Customer(order *Order) log.Field {\n        if os.Getenv(\"ENVIRONMENT\") == \"dev\" {\n            return log.String(\"customer\", order.Customer.ID)\n        }\n        return log.Noop()\n    }\n```\n\n#### Goroutine-safety\n\nThe entire public API is goroutine-safe and does not require external\nsynchronization.\n\n## API pointers for those implementing a tracing system\n\nTracing system implementors may be able to reuse or copy-paste-modify the `basictracer` package, found [here](https://github.com/opentracing/basictracer-go). In particular, see `basictracer.New(...)`.\n\n## API compatibility\n\nFor the time being, \"mild\" backwards-incompatible changes may be made without changing the major version number. As OpenTracing and `opentracing-go` mature, backwards compatibility will become more of a priority.\n\n## Tracer test suite\n\nA test suite is available in the [harness](https://godoc.org/github.com/opentracing/opentracing-go/harness) package that can assist Tracer implementors to assert that their Tracer is working correctly.\n\n## Licensing\n\n[Apache 2.0 License](./LICENSE).\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/ext/tags.go",
    "content": "package ext\n\nimport opentracing \"github.com/opentracing/opentracing-go\"\n\n// These constants define common tag names recommended for better portability across\n// tracing systems and languages/platforms.\n//\n// The tag names are defined as typed strings, so that in addition to the usual use\n//\n//     span.setTag(TagName, value)\n//\n// they also support value type validation via this additional syntax:\n//\n//    TagName.Set(span, value)\n//\nvar (\n\t//////////////////////////////////////////////////////////////////////\n\t// SpanKind (client/server or producer/consumer)\n\t//////////////////////////////////////////////////////////////////////\n\n\t// SpanKind hints at relationship between spans, e.g. client/server\n\tSpanKind = spanKindTagName(\"span.kind\")\n\n\t// SpanKindRPCClient marks a span representing the client-side of an RPC\n\t// or other remote call\n\tSpanKindRPCClientEnum = SpanKindEnum(\"client\")\n\tSpanKindRPCClient     = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCClientEnum}\n\n\t// SpanKindRPCServer marks a span representing the server-side of an RPC\n\t// or other remote call\n\tSpanKindRPCServerEnum = SpanKindEnum(\"server\")\n\tSpanKindRPCServer     = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCServerEnum}\n\n\t// SpanKindProducer marks a span representing the producer-side of a\n\t// message bus\n\tSpanKindProducerEnum = SpanKindEnum(\"producer\")\n\tSpanKindProducer     = opentracing.Tag{Key: string(SpanKind), Value: SpanKindProducerEnum}\n\n\t// SpanKindConsumer marks a span representing the consumer-side of a\n\t// message bus\n\tSpanKindConsumerEnum = SpanKindEnum(\"consumer\")\n\tSpanKindConsumer     = opentracing.Tag{Key: string(SpanKind), Value: SpanKindConsumerEnum}\n\n\t//////////////////////////////////////////////////////////////////////\n\t// Component name\n\t//////////////////////////////////////////////////////////////////////\n\n\t// Component is a low-cardinality identifier of the module, library,\n\t// or package that is generating a span.\n\tComponent = stringTagName(\"component\")\n\n\t//////////////////////////////////////////////////////////////////////\n\t// Sampling hint\n\t//////////////////////////////////////////////////////////////////////\n\n\t// SamplingPriority determines the priority of sampling this Span.\n\tSamplingPriority = uint16TagName(\"sampling.priority\")\n\n\t//////////////////////////////////////////////////////////////////////\n\t// Peer tags. These tags can be emitted by either client-side of\n\t// server-side to describe the other side/service in a peer-to-peer\n\t// communications, like an RPC call.\n\t//////////////////////////////////////////////////////////////////////\n\n\t// PeerService records the service name of the peer.\n\tPeerService = stringTagName(\"peer.service\")\n\n\t// PeerAddress records the address name of the peer. This may be a \"ip:port\",\n\t// a bare \"hostname\", a FQDN or even a database DSN substring\n\t// like \"mysql://username@127.0.0.1:3306/dbname\"\n\tPeerAddress = stringTagName(\"peer.address\")\n\n\t// PeerHostname records the host name of the peer\n\tPeerHostname = stringTagName(\"peer.hostname\")\n\n\t// PeerHostIPv4 records IP v4 host address of the peer\n\tPeerHostIPv4 = ipv4Tag(\"peer.ipv4\")\n\n\t// PeerHostIPv6 records IP v6 host address of the peer\n\tPeerHostIPv6 = stringTagName(\"peer.ipv6\")\n\n\t// PeerPort records port number of the peer\n\tPeerPort = uint16TagName(\"peer.port\")\n\n\t//////////////////////////////////////////////////////////////////////\n\t// HTTP Tags\n\t//////////////////////////////////////////////////////////////////////\n\n\t// HTTPUrl should be the URL of the request being handled in this segment\n\t// of the trace, in standard URI format. The protocol is optional.\n\tHTTPUrl = stringTagName(\"http.url\")\n\n\t// HTTPMethod is the HTTP method of the request, and is case-insensitive.\n\tHTTPMethod = stringTagName(\"http.method\")\n\n\t// HTTPStatusCode is the numeric HTTP status code (200, 404, etc) of the\n\t// HTTP response.\n\tHTTPStatusCode = uint16TagName(\"http.status_code\")\n\n\t//////////////////////////////////////////////////////////////////////\n\t// DB Tags\n\t//////////////////////////////////////////////////////////////////////\n\n\t// DBInstance is database instance name.\n\tDBInstance = stringTagName(\"db.instance\")\n\n\t// DBStatement is a database statement for the given database type.\n\t// It can be a query or a prepared statement (i.e., before substitution).\n\tDBStatement = stringTagName(\"db.statement\")\n\n\t// DBType is a database type. For any SQL database, \"sql\".\n\t// For others, the lower-case database category, e.g. \"redis\"\n\tDBType = stringTagName(\"db.type\")\n\n\t// DBUser is a username for accessing database.\n\tDBUser = stringTagName(\"db.user\")\n\n\t//////////////////////////////////////////////////////////////////////\n\t// Message Bus Tag\n\t//////////////////////////////////////////////////////////////////////\n\n\t// MessageBusDestination is an address at which messages can be exchanged\n\tMessageBusDestination = stringTagName(\"message_bus.destination\")\n\n\t//////////////////////////////////////////////////////////////////////\n\t// Error Tag\n\t//////////////////////////////////////////////////////////////////////\n\n\t// Error indicates that operation represented by the span resulted in an error.\n\tError = boolTagName(\"error\")\n)\n\n// ---\n\n// SpanKindEnum represents common span types\ntype SpanKindEnum string\n\ntype spanKindTagName string\n\n// Set adds a string tag to the `span`\nfunc (tag spanKindTagName) Set(span opentracing.Span, value SpanKindEnum) {\n\tspan.SetTag(string(tag), value)\n}\n\ntype rpcServerOption struct {\n\tclientContext opentracing.SpanContext\n}\n\nfunc (r rpcServerOption) Apply(o *opentracing.StartSpanOptions) {\n\tif r.clientContext != nil {\n\t\topentracing.ChildOf(r.clientContext).Apply(o)\n\t}\n\tSpanKindRPCServer.Apply(o)\n}\n\n// RPCServerOption returns a StartSpanOption appropriate for an RPC server span\n// with `client` representing the metadata for the remote peer Span if available.\n// In case client == nil, due to the client not being instrumented, this RPC\n// server span will be a root span.\nfunc RPCServerOption(client opentracing.SpanContext) opentracing.StartSpanOption {\n\treturn rpcServerOption{client}\n}\n\n// ---\n\ntype stringTagName string\n\n// Set adds a string tag to the `span`\nfunc (tag stringTagName) Set(span opentracing.Span, value string) {\n\tspan.SetTag(string(tag), value)\n}\n\n// ---\n\ntype uint32TagName string\n\n// Set adds a uint32 tag to the `span`\nfunc (tag uint32TagName) Set(span opentracing.Span, value uint32) {\n\tspan.SetTag(string(tag), value)\n}\n\n// ---\n\ntype uint16TagName string\n\n// Set adds a uint16 tag to the `span`\nfunc (tag uint16TagName) Set(span opentracing.Span, value uint16) {\n\tspan.SetTag(string(tag), value)\n}\n\n// ---\n\ntype boolTagName string\n\n// Add adds a bool tag to the `span`\nfunc (tag boolTagName) Set(span opentracing.Span, value bool) {\n\tspan.SetTag(string(tag), value)\n}\n\ntype ipv4Tag string\n\n// Set adds IP v4 host address of the peer as an uint32 value to the `span`, keep this for backward and zipkin compatibility\nfunc (tag ipv4Tag) Set(span opentracing.Span, value uint32) {\n\tspan.SetTag(string(tag), value)\n}\n\n// SetString records IP v4 host address of the peer as a .-separated tuple to the `span`. E.g., \"127.0.0.1\"\nfunc (tag ipv4Tag) SetString(span opentracing.Span, value string) {\n\tspan.SetTag(string(tag), value)\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/globaltracer.go",
    "content": "package opentracing\n\nvar (\n\tglobalTracer Tracer = NoopTracer{}\n)\n\n// SetGlobalTracer sets the [singleton] opentracing.Tracer returned by\n// GlobalTracer(). Those who use GlobalTracer (rather than directly manage an\n// opentracing.Tracer instance) should call SetGlobalTracer as early as\n// possible in main(), prior to calling the `StartSpan` global func below.\n// Prior to calling `SetGlobalTracer`, any Spans started via the `StartSpan`\n// (etc) globals are noops.\nfunc SetGlobalTracer(tracer Tracer) {\n\tglobalTracer = tracer\n}\n\n// GlobalTracer returns the global singleton `Tracer` implementation.\n// Before `SetGlobalTracer()` is called, the `GlobalTracer()` is a noop\n// implementation that drops all data handed to it.\nfunc GlobalTracer() Tracer {\n\treturn globalTracer\n}\n\n// StartSpan defers to `Tracer.StartSpan`. See `GlobalTracer()`.\nfunc StartSpan(operationName string, opts ...StartSpanOption) Span {\n\treturn globalTracer.StartSpan(operationName, opts...)\n}\n\n// InitGlobalTracer is deprecated. Please use SetGlobalTracer.\nfunc InitGlobalTracer(tracer Tracer) {\n\tSetGlobalTracer(tracer)\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/gocontext.go",
    "content": "package opentracing\n\nimport \"context\"\n\ntype contextKey struct{}\n\nvar activeSpanKey = contextKey{}\n\n// ContextWithSpan returns a new `context.Context` that holds a reference to\n// `span`'s SpanContext.\nfunc ContextWithSpan(ctx context.Context, span Span) context.Context {\n\treturn context.WithValue(ctx, activeSpanKey, span)\n}\n\n// SpanFromContext returns the `Span` previously associated with `ctx`, or\n// `nil` if no such `Span` could be found.\n//\n// NOTE: context.Context != SpanContext: the former is Go's intra-process\n// context propagation mechanism, and the latter houses OpenTracing's per-Span\n// identity and baggage information.\nfunc SpanFromContext(ctx context.Context) Span {\n\tval := ctx.Value(activeSpanKey)\n\tif sp, ok := val.(Span); ok {\n\t\treturn sp\n\t}\n\treturn nil\n}\n\n// StartSpanFromContext starts and returns a Span with `operationName`, using\n// any Span found within `ctx` as a ChildOfRef. If no such parent could be\n// found, StartSpanFromContext creates a root (parentless) Span.\n//\n// The second return value is a context.Context object built around the\n// returned Span.\n//\n// Example usage:\n//\n//    SomeFunction(ctx context.Context, ...) {\n//        sp, ctx := opentracing.StartSpanFromContext(ctx, \"SomeFunction\")\n//        defer sp.Finish()\n//        ...\n//    }\nfunc StartSpanFromContext(ctx context.Context, operationName string, opts ...StartSpanOption) (Span, context.Context) {\n\treturn startSpanFromContextWithTracer(ctx, GlobalTracer(), operationName, opts...)\n}\n\n// startSpanFromContextWithTracer is factored out for testing purposes.\nfunc startSpanFromContextWithTracer(ctx context.Context, tracer Tracer, operationName string, opts ...StartSpanOption) (Span, context.Context) {\n\tif parentSpan := SpanFromContext(ctx); parentSpan != nil {\n\t\topts = append(opts, ChildOf(parentSpan.Context()))\n\t}\n\tspan := tracer.StartSpan(operationName, opts...)\n\treturn span, ContextWithSpan(ctx, span)\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/log/field.go",
    "content": "package log\n\nimport (\n\t\"fmt\"\n\t\"math\"\n)\n\ntype fieldType int\n\nconst (\n\tstringType fieldType = iota\n\tboolType\n\tintType\n\tint32Type\n\tuint32Type\n\tint64Type\n\tuint64Type\n\tfloat32Type\n\tfloat64Type\n\terrorType\n\tobjectType\n\tlazyLoggerType\n\tnoopType\n)\n\n// Field instances are constructed via LogBool, LogString, and so on.\n// Tracing implementations may then handle them via the Field.Marshal\n// method.\n//\n// \"heavily influenced by\" (i.e., partially stolen from)\n// https://github.com/uber-go/zap\ntype Field struct {\n\tkey          string\n\tfieldType    fieldType\n\tnumericVal   int64\n\tstringVal    string\n\tinterfaceVal interface{}\n}\n\n// String adds a string-valued key:value pair to a Span.LogFields() record\nfunc String(key, val string) Field {\n\treturn Field{\n\t\tkey:       key,\n\t\tfieldType: stringType,\n\t\tstringVal: val,\n\t}\n}\n\n// Bool adds a bool-valued key:value pair to a Span.LogFields() record\nfunc Bool(key string, val bool) Field {\n\tvar numericVal int64\n\tif val {\n\t\tnumericVal = 1\n\t}\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  boolType,\n\t\tnumericVal: numericVal,\n\t}\n}\n\n// Int adds an int-valued key:value pair to a Span.LogFields() record\nfunc Int(key string, val int) Field {\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  intType,\n\t\tnumericVal: int64(val),\n\t}\n}\n\n// Int32 adds an int32-valued key:value pair to a Span.LogFields() record\nfunc Int32(key string, val int32) Field {\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  int32Type,\n\t\tnumericVal: int64(val),\n\t}\n}\n\n// Int64 adds an int64-valued key:value pair to a Span.LogFields() record\nfunc Int64(key string, val int64) Field {\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  int64Type,\n\t\tnumericVal: val,\n\t}\n}\n\n// Uint32 adds a uint32-valued key:value pair to a Span.LogFields() record\nfunc Uint32(key string, val uint32) Field {\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  uint32Type,\n\t\tnumericVal: int64(val),\n\t}\n}\n\n// Uint64 adds a uint64-valued key:value pair to a Span.LogFields() record\nfunc Uint64(key string, val uint64) Field {\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  uint64Type,\n\t\tnumericVal: int64(val),\n\t}\n}\n\n// Float32 adds a float32-valued key:value pair to a Span.LogFields() record\nfunc Float32(key string, val float32) Field {\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  float32Type,\n\t\tnumericVal: int64(math.Float32bits(val)),\n\t}\n}\n\n// Float64 adds a float64-valued key:value pair to a Span.LogFields() record\nfunc Float64(key string, val float64) Field {\n\treturn Field{\n\t\tkey:        key,\n\t\tfieldType:  float64Type,\n\t\tnumericVal: int64(math.Float64bits(val)),\n\t}\n}\n\n// Error adds an error with the key \"error\" to a Span.LogFields() record\nfunc Error(err error) Field {\n\treturn Field{\n\t\tkey:          \"error\",\n\t\tfieldType:    errorType,\n\t\tinterfaceVal: err,\n\t}\n}\n\n// Object adds an object-valued key:value pair to a Span.LogFields() record\nfunc Object(key string, obj interface{}) Field {\n\treturn Field{\n\t\tkey:          key,\n\t\tfieldType:    objectType,\n\t\tinterfaceVal: obj,\n\t}\n}\n\n// LazyLogger allows for user-defined, late-bound logging of arbitrary data\ntype LazyLogger func(fv Encoder)\n\n// Lazy adds a LazyLogger to a Span.LogFields() record; the tracing\n// implementation will call the LazyLogger function at an indefinite time in\n// the future (after Lazy() returns).\nfunc Lazy(ll LazyLogger) Field {\n\treturn Field{\n\t\tfieldType:    lazyLoggerType,\n\t\tinterfaceVal: ll,\n\t}\n}\n\n// Noop creates a no-op log field that should be ignored by the tracer.\n// It can be used to capture optional fields, for example those that should\n// only be logged in non-production environment:\n//\n//     func customerField(order *Order) log.Field {\n//          if os.Getenv(\"ENVIRONMENT\") == \"dev\" {\n//              return log.String(\"customer\", order.Customer.ID)\n//          }\n//          return log.Noop()\n//     }\n//\n//     span.LogFields(log.String(\"event\", \"purchase\"), customerField(order))\n//\nfunc Noop() Field {\n\treturn Field{\n\t\tfieldType: noopType,\n\t}\n}\n\n// Encoder allows access to the contents of a Field (via a call to\n// Field.Marshal).\n//\n// Tracer implementations typically provide an implementation of Encoder;\n// OpenTracing callers typically do not need to concern themselves with it.\ntype Encoder interface {\n\tEmitString(key, value string)\n\tEmitBool(key string, value bool)\n\tEmitInt(key string, value int)\n\tEmitInt32(key string, value int32)\n\tEmitInt64(key string, value int64)\n\tEmitUint32(key string, value uint32)\n\tEmitUint64(key string, value uint64)\n\tEmitFloat32(key string, value float32)\n\tEmitFloat64(key string, value float64)\n\tEmitObject(key string, value interface{})\n\tEmitLazyLogger(value LazyLogger)\n}\n\n// Marshal passes a Field instance through to the appropriate\n// field-type-specific method of an Encoder.\nfunc (lf Field) Marshal(visitor Encoder) {\n\tswitch lf.fieldType {\n\tcase stringType:\n\t\tvisitor.EmitString(lf.key, lf.stringVal)\n\tcase boolType:\n\t\tvisitor.EmitBool(lf.key, lf.numericVal != 0)\n\tcase intType:\n\t\tvisitor.EmitInt(lf.key, int(lf.numericVal))\n\tcase int32Type:\n\t\tvisitor.EmitInt32(lf.key, int32(lf.numericVal))\n\tcase int64Type:\n\t\tvisitor.EmitInt64(lf.key, int64(lf.numericVal))\n\tcase uint32Type:\n\t\tvisitor.EmitUint32(lf.key, uint32(lf.numericVal))\n\tcase uint64Type:\n\t\tvisitor.EmitUint64(lf.key, uint64(lf.numericVal))\n\tcase float32Type:\n\t\tvisitor.EmitFloat32(lf.key, math.Float32frombits(uint32(lf.numericVal)))\n\tcase float64Type:\n\t\tvisitor.EmitFloat64(lf.key, math.Float64frombits(uint64(lf.numericVal)))\n\tcase errorType:\n\t\tif err, ok := lf.interfaceVal.(error); ok {\n\t\t\tvisitor.EmitString(lf.key, err.Error())\n\t\t} else {\n\t\t\tvisitor.EmitString(lf.key, \"<nil>\")\n\t\t}\n\tcase objectType:\n\t\tvisitor.EmitObject(lf.key, lf.interfaceVal)\n\tcase lazyLoggerType:\n\t\tvisitor.EmitLazyLogger(lf.interfaceVal.(LazyLogger))\n\tcase noopType:\n\t\t// intentionally left blank\n\t}\n}\n\n// Key returns the field's key.\nfunc (lf Field) Key() string {\n\treturn lf.key\n}\n\n// Value returns the field's value as interface{}.\nfunc (lf Field) Value() interface{} {\n\tswitch lf.fieldType {\n\tcase stringType:\n\t\treturn lf.stringVal\n\tcase boolType:\n\t\treturn lf.numericVal != 0\n\tcase intType:\n\t\treturn int(lf.numericVal)\n\tcase int32Type:\n\t\treturn int32(lf.numericVal)\n\tcase int64Type:\n\t\treturn int64(lf.numericVal)\n\tcase uint32Type:\n\t\treturn uint32(lf.numericVal)\n\tcase uint64Type:\n\t\treturn uint64(lf.numericVal)\n\tcase float32Type:\n\t\treturn math.Float32frombits(uint32(lf.numericVal))\n\tcase float64Type:\n\t\treturn math.Float64frombits(uint64(lf.numericVal))\n\tcase errorType, objectType, lazyLoggerType:\n\t\treturn lf.interfaceVal\n\tcase noopType:\n\t\treturn nil\n\tdefault:\n\t\treturn nil\n\t}\n}\n\n// String returns a string representation of the key and value.\nfunc (lf Field) String() string {\n\treturn fmt.Sprint(lf.key, \":\", lf.Value())\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/log/util.go",
    "content": "package log\n\nimport \"fmt\"\n\n// InterleavedKVToFields converts keyValues a la Span.LogKV() to a Field slice\n// a la Span.LogFields().\nfunc InterleavedKVToFields(keyValues ...interface{}) ([]Field, error) {\n\tif len(keyValues)%2 != 0 {\n\t\treturn nil, fmt.Errorf(\"non-even keyValues len: %d\", len(keyValues))\n\t}\n\tfields := make([]Field, len(keyValues)/2)\n\tfor i := 0; i*2 < len(keyValues); i++ {\n\t\tkey, ok := keyValues[i*2].(string)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\n\t\t\t\t\"non-string key (pair #%d): %T\",\n\t\t\t\ti, keyValues[i*2])\n\t\t}\n\t\tswitch typedVal := keyValues[i*2+1].(type) {\n\t\tcase bool:\n\t\t\tfields[i] = Bool(key, typedVal)\n\t\tcase string:\n\t\t\tfields[i] = String(key, typedVal)\n\t\tcase int:\n\t\t\tfields[i] = Int(key, typedVal)\n\t\tcase int8:\n\t\t\tfields[i] = Int32(key, int32(typedVal))\n\t\tcase int16:\n\t\t\tfields[i] = Int32(key, int32(typedVal))\n\t\tcase int32:\n\t\t\tfields[i] = Int32(key, typedVal)\n\t\tcase int64:\n\t\t\tfields[i] = Int64(key, typedVal)\n\t\tcase uint:\n\t\t\tfields[i] = Uint64(key, uint64(typedVal))\n\t\tcase uint64:\n\t\t\tfields[i] = Uint64(key, typedVal)\n\t\tcase uint8:\n\t\t\tfields[i] = Uint32(key, uint32(typedVal))\n\t\tcase uint16:\n\t\t\tfields[i] = Uint32(key, uint32(typedVal))\n\t\tcase uint32:\n\t\t\tfields[i] = Uint32(key, typedVal)\n\t\tcase float32:\n\t\t\tfields[i] = Float32(key, typedVal)\n\t\tcase float64:\n\t\t\tfields[i] = Float64(key, typedVal)\n\t\tdefault:\n\t\t\t// When in doubt, coerce to a string\n\t\t\tfields[i] = String(key, fmt.Sprint(typedVal))\n\t\t}\n\t}\n\treturn fields, nil\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/noop.go",
    "content": "package opentracing\n\nimport \"github.com/opentracing/opentracing-go/log\"\n\n// A NoopTracer is a trivial, minimum overhead implementation of Tracer\n// for which all operations are no-ops.\n//\n// The primary use of this implementation is in libraries, such as RPC\n// frameworks, that make tracing an optional feature controlled by the\n// end user. A no-op implementation allows said libraries to use it\n// as the default Tracer and to write instrumentation that does\n// not need to keep checking if the tracer instance is nil.\n//\n// For the same reason, the NoopTracer is the default \"global\" tracer\n// (see GlobalTracer and SetGlobalTracer functions).\n//\n// WARNING: NoopTracer does not support baggage propagation.\ntype NoopTracer struct{}\n\ntype noopSpan struct{}\ntype noopSpanContext struct{}\n\nvar (\n\tdefaultNoopSpanContext = noopSpanContext{}\n\tdefaultNoopSpan        = noopSpan{}\n\tdefaultNoopTracer      = NoopTracer{}\n)\n\nconst (\n\temptyString = \"\"\n)\n\n// noopSpanContext:\nfunc (n noopSpanContext) ForeachBaggageItem(handler func(k, v string) bool) {}\n\n// noopSpan:\nfunc (n noopSpan) Context() SpanContext                                  { return defaultNoopSpanContext }\nfunc (n noopSpan) SetBaggageItem(key, val string) Span                   { return defaultNoopSpan }\nfunc (n noopSpan) BaggageItem(key string) string                         { return emptyString }\nfunc (n noopSpan) SetTag(key string, value interface{}) Span             { return n }\nfunc (n noopSpan) LogFields(fields ...log.Field)                         {}\nfunc (n noopSpan) LogKV(keyVals ...interface{})                          {}\nfunc (n noopSpan) Finish()                                               {}\nfunc (n noopSpan) FinishWithOptions(opts FinishOptions)                  {}\nfunc (n noopSpan) SetOperationName(operationName string) Span            { return n }\nfunc (n noopSpan) Tracer() Tracer                                        { return defaultNoopTracer }\nfunc (n noopSpan) LogEvent(event string)                                 {}\nfunc (n noopSpan) LogEventWithPayload(event string, payload interface{}) {}\nfunc (n noopSpan) Log(data LogData)                                      {}\n\n// StartSpan belongs to the Tracer interface.\nfunc (n NoopTracer) StartSpan(operationName string, opts ...StartSpanOption) Span {\n\treturn defaultNoopSpan\n}\n\n// Inject belongs to the Tracer interface.\nfunc (n NoopTracer) Inject(sp SpanContext, format interface{}, carrier interface{}) error {\n\treturn nil\n}\n\n// Extract belongs to the Tracer interface.\nfunc (n NoopTracer) Extract(format interface{}, carrier interface{}) (SpanContext, error) {\n\treturn nil, ErrSpanContextNotFound\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/propagation.go",
    "content": "package opentracing\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n)\n\n///////////////////////////////////////////////////////////////////////////////\n// CORE PROPAGATION INTERFACES:\n///////////////////////////////////////////////////////////////////////////////\n\nvar (\n\t// ErrUnsupportedFormat occurs when the `format` passed to Tracer.Inject() or\n\t// Tracer.Extract() is not recognized by the Tracer implementation.\n\tErrUnsupportedFormat = errors.New(\"opentracing: Unknown or unsupported Inject/Extract format\")\n\n\t// ErrSpanContextNotFound occurs when the `carrier` passed to\n\t// Tracer.Extract() is valid and uncorrupted but has insufficient\n\t// information to extract a SpanContext.\n\tErrSpanContextNotFound = errors.New(\"opentracing: SpanContext not found in Extract carrier\")\n\n\t// ErrInvalidSpanContext errors occur when Tracer.Inject() is asked to\n\t// operate on a SpanContext which it is not prepared to handle (for\n\t// example, since it was created by a different tracer implementation).\n\tErrInvalidSpanContext = errors.New(\"opentracing: SpanContext type incompatible with tracer\")\n\n\t// ErrInvalidCarrier errors occur when Tracer.Inject() or Tracer.Extract()\n\t// implementations expect a different type of `carrier` than they are\n\t// given.\n\tErrInvalidCarrier = errors.New(\"opentracing: Invalid Inject/Extract carrier\")\n\n\t// ErrSpanContextCorrupted occurs when the `carrier` passed to\n\t// Tracer.Extract() is of the expected type but is corrupted.\n\tErrSpanContextCorrupted = errors.New(\"opentracing: SpanContext data corrupted in Extract carrier\")\n)\n\n///////////////////////////////////////////////////////////////////////////////\n// BUILTIN PROPAGATION FORMATS:\n///////////////////////////////////////////////////////////////////////////////\n\n// BuiltinFormat is used to demarcate the values within package `opentracing`\n// that are intended for use with the Tracer.Inject() and Tracer.Extract()\n// methods.\ntype BuiltinFormat byte\n\nconst (\n\t// Binary represents SpanContexts as opaque binary data.\n\t//\n\t// For Tracer.Inject(): the carrier must be an `io.Writer`.\n\t//\n\t// For Tracer.Extract(): the carrier must be an `io.Reader`.\n\tBinary BuiltinFormat = iota\n\n\t// TextMap represents SpanContexts as key:value string pairs.\n\t//\n\t// Unlike HTTPHeaders, the TextMap format does not restrict the key or\n\t// value character sets in any way.\n\t//\n\t// For Tracer.Inject(): the carrier must be a `TextMapWriter`.\n\t//\n\t// For Tracer.Extract(): the carrier must be a `TextMapReader`.\n\tTextMap\n\n\t// HTTPHeaders represents SpanContexts as HTTP header string pairs.\n\t//\n\t// Unlike TextMap, the HTTPHeaders format requires that the keys and values\n\t// be valid as HTTP headers as-is (i.e., character casing may be unstable\n\t// and special characters are disallowed in keys, values should be\n\t// URL-escaped, etc).\n\t//\n\t// For Tracer.Inject(): the carrier must be a `TextMapWriter`.\n\t//\n\t// For Tracer.Extract(): the carrier must be a `TextMapReader`.\n\t//\n\t// See HTTPHeadersCarrier for an implementation of both TextMapWriter\n\t// and TextMapReader that defers to an http.Header instance for storage.\n\t// For example, Inject():\n\t//\n\t//    carrier := opentracing.HTTPHeadersCarrier(httpReq.Header)\n\t//    err := span.Tracer().Inject(\n\t//        span.Context(), opentracing.HTTPHeaders, carrier)\n\t//\n\t// Or Extract():\n\t//\n\t//    carrier := opentracing.HTTPHeadersCarrier(httpReq.Header)\n\t//    clientContext, err := tracer.Extract(\n\t//        opentracing.HTTPHeaders, carrier)\n\t//\n\tHTTPHeaders\n)\n\n// TextMapWriter is the Inject() carrier for the TextMap builtin format. With\n// it, the caller can encode a SpanContext for propagation as entries in a map\n// of unicode strings.\ntype TextMapWriter interface {\n\t// Set a key:value pair to the carrier. Multiple calls to Set() for the\n\t// same key leads to undefined behavior.\n\t//\n\t// NOTE: The backing store for the TextMapWriter may contain data unrelated\n\t// to SpanContext. As such, Inject() and Extract() implementations that\n\t// call the TextMapWriter and TextMapReader interfaces must agree on a\n\t// prefix or other convention to distinguish their own key:value pairs.\n\tSet(key, val string)\n}\n\n// TextMapReader is the Extract() carrier for the TextMap builtin format. With it,\n// the caller can decode a propagated SpanContext as entries in a map of\n// unicode strings.\ntype TextMapReader interface {\n\t// ForeachKey returns TextMap contents via repeated calls to the `handler`\n\t// function. If any call to `handler` returns a non-nil error, ForeachKey\n\t// terminates and returns that error.\n\t//\n\t// NOTE: The backing store for the TextMapReader may contain data unrelated\n\t// to SpanContext. As such, Inject() and Extract() implementations that\n\t// call the TextMapWriter and TextMapReader interfaces must agree on a\n\t// prefix or other convention to distinguish their own key:value pairs.\n\t//\n\t// The \"foreach\" callback pattern reduces unnecessary copying in some cases\n\t// and also allows implementations to hold locks while the map is read.\n\tForeachKey(handler func(key, val string) error) error\n}\n\n// TextMapCarrier allows the use of regular map[string]string\n// as both TextMapWriter and TextMapReader.\ntype TextMapCarrier map[string]string\n\n// ForeachKey conforms to the TextMapReader interface.\nfunc (c TextMapCarrier) ForeachKey(handler func(key, val string) error) error {\n\tfor k, v := range c {\n\t\tif err := handler(k, v); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Set implements Set() of opentracing.TextMapWriter\nfunc (c TextMapCarrier) Set(key, val string) {\n\tc[key] = val\n}\n\n// HTTPHeadersCarrier satisfies both TextMapWriter and TextMapReader.\n//\n// Example usage for server side:\n//\n//     carrier := opentracing.HTTPHeadersCarrier(httpReq.Header)\n//     clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier)\n//\n// Example usage for client side:\n//\n//     carrier := opentracing.HTTPHeadersCarrier(httpReq.Header)\n//     err := tracer.Inject(\n//         span.Context(),\n//         opentracing.HTTPHeaders,\n//         carrier)\n//\ntype HTTPHeadersCarrier http.Header\n\n// Set conforms to the TextMapWriter interface.\nfunc (c HTTPHeadersCarrier) Set(key, val string) {\n\th := http.Header(c)\n\th.Add(key, val)\n}\n\n// ForeachKey conforms to the TextMapReader interface.\nfunc (c HTTPHeadersCarrier) ForeachKey(handler func(key, val string) error) error {\n\tfor k, vals := range c {\n\t\tfor _, v := range vals {\n\t\t\tif err := handler(k, v); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/span.go",
    "content": "package opentracing\n\nimport (\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go/log\"\n)\n\n// SpanContext represents Span state that must propagate to descendant Spans and across process\n// boundaries (e.g., a <trace_id, span_id, sampled> tuple).\ntype SpanContext interface {\n\t// ForeachBaggageItem grants access to all baggage items stored in the\n\t// SpanContext.\n\t// The handler function will be called for each baggage key/value pair.\n\t// The ordering of items is not guaranteed.\n\t//\n\t// The bool return value indicates if the handler wants to continue iterating\n\t// through the rest of the baggage items; for example if the handler is trying to\n\t// find some baggage item by pattern matching the name, it can return false\n\t// as soon as the item is found to stop further iterations.\n\tForeachBaggageItem(handler func(k, v string) bool)\n}\n\n// Span represents an active, un-finished span in the OpenTracing system.\n//\n// Spans are created by the Tracer interface.\ntype Span interface {\n\t// Sets the end timestamp and finalizes Span state.\n\t//\n\t// With the exception of calls to Context() (which are always allowed),\n\t// Finish() must be the last call made to any span instance, and to do\n\t// otherwise leads to undefined behavior.\n\tFinish()\n\t// FinishWithOptions is like Finish() but with explicit control over\n\t// timestamps and log data.\n\tFinishWithOptions(opts FinishOptions)\n\n\t// Context() yields the SpanContext for this Span. Note that the return\n\t// value of Context() is still valid after a call to Span.Finish(), as is\n\t// a call to Span.Context() after a call to Span.Finish().\n\tContext() SpanContext\n\n\t// Sets or changes the operation name.\n\t//\n\t// Returns a reference to this Span for chaining.\n\tSetOperationName(operationName string) Span\n\n\t// Adds a tag to the span.\n\t//\n\t// If there is a pre-existing tag set for `key`, it is overwritten.\n\t//\n\t// Tag values can be numeric types, strings, or bools. The behavior of\n\t// other tag value types is undefined at the OpenTracing level. If a\n\t// tracing system does not know how to handle a particular value type, it\n\t// may ignore the tag, but shall not panic.\n\t//\n\t// Returns a reference to this Span for chaining.\n\tSetTag(key string, value interface{}) Span\n\n\t// LogFields is an efficient and type-checked way to record key:value\n\t// logging data about a Span, though the programming interface is a little\n\t// more verbose than LogKV(). Here's an example:\n\t//\n\t//    span.LogFields(\n\t//        log.String(\"event\", \"soft error\"),\n\t//        log.String(\"type\", \"cache timeout\"),\n\t//        log.Int(\"waited.millis\", 1500))\n\t//\n\t// Also see Span.FinishWithOptions() and FinishOptions.BulkLogData.\n\tLogFields(fields ...log.Field)\n\n\t// LogKV is a concise, readable way to record key:value logging data about\n\t// a Span, though unfortunately this also makes it less efficient and less\n\t// type-safe than LogFields(). Here's an example:\n\t//\n\t//    span.LogKV(\n\t//        \"event\", \"soft error\",\n\t//        \"type\", \"cache timeout\",\n\t//        \"waited.millis\", 1500)\n\t//\n\t// For LogKV (as opposed to LogFields()), the parameters must appear as\n\t// key-value pairs, like\n\t//\n\t//    span.LogKV(key1, val1, key2, val2, key3, val3, ...)\n\t//\n\t// The keys must all be strings. The values may be strings, numeric types,\n\t// bools, Go error instances, or arbitrary structs.\n\t//\n\t// (Note to implementors: consider the log.InterleavedKVToFields() helper)\n\tLogKV(alternatingKeyValues ...interface{})\n\n\t// SetBaggageItem sets a key:value pair on this Span and its SpanContext\n\t// that also propagates to descendants of this Span.\n\t//\n\t// SetBaggageItem() enables powerful functionality given a full-stack\n\t// opentracing integration (e.g., arbitrary application data from a mobile\n\t// app can make it, transparently, all the way into the depths of a storage\n\t// system), and with it some powerful costs: use this feature with care.\n\t//\n\t// IMPORTANT NOTE #1: SetBaggageItem() will only propagate baggage items to\n\t// *future* causal descendants of the associated Span.\n\t//\n\t// IMPORTANT NOTE #2: Use this thoughtfully and with care. Every key and\n\t// value is copied into every local *and remote* child of the associated\n\t// Span, and that can add up to a lot of network and cpu overhead.\n\t//\n\t// Returns a reference to this Span for chaining.\n\tSetBaggageItem(restrictedKey, value string) Span\n\n\t// Gets the value for a baggage item given its key. Returns the empty string\n\t// if the value isn't found in this Span.\n\tBaggageItem(restrictedKey string) string\n\n\t// Provides access to the Tracer that created this Span.\n\tTracer() Tracer\n\n\t// Deprecated: use LogFields or LogKV\n\tLogEvent(event string)\n\t// Deprecated: use LogFields or LogKV\n\tLogEventWithPayload(event string, payload interface{})\n\t// Deprecated: use LogFields or LogKV\n\tLog(data LogData)\n}\n\n// LogRecord is data associated with a single Span log. Every LogRecord\n// instance must specify at least one Field.\ntype LogRecord struct {\n\tTimestamp time.Time\n\tFields    []log.Field\n}\n\n// FinishOptions allows Span.FinishWithOptions callers to override the finish\n// timestamp and provide log data via a bulk interface.\ntype FinishOptions struct {\n\t// FinishTime overrides the Span's finish time, or implicitly becomes\n\t// time.Now() if FinishTime.IsZero().\n\t//\n\t// FinishTime must resolve to a timestamp that's >= the Span's StartTime\n\t// (per StartSpanOptions).\n\tFinishTime time.Time\n\n\t// LogRecords allows the caller to specify the contents of many LogFields()\n\t// calls with a single slice. May be nil.\n\t//\n\t// None of the LogRecord.Timestamp values may be .IsZero() (i.e., they must\n\t// be set explicitly). Also, they must be >= the Span's start timestamp and\n\t// <= the FinishTime (or time.Now() if FinishTime.IsZero()). Otherwise the\n\t// behavior of FinishWithOptions() is undefined.\n\t//\n\t// If specified, the caller hands off ownership of LogRecords at\n\t// FinishWithOptions() invocation time.\n\t//\n\t// If specified, the (deprecated) BulkLogData must be nil or empty.\n\tLogRecords []LogRecord\n\n\t// BulkLogData is DEPRECATED.\n\tBulkLogData []LogData\n}\n\n// LogData is DEPRECATED\ntype LogData struct {\n\tTimestamp time.Time\n\tEvent     string\n\tPayload   interface{}\n}\n\n// ToLogRecord converts a deprecated LogData to a non-deprecated LogRecord\nfunc (ld *LogData) ToLogRecord() LogRecord {\n\tvar literalTimestamp time.Time\n\tif ld.Timestamp.IsZero() {\n\t\tliteralTimestamp = time.Now()\n\t} else {\n\t\tliteralTimestamp = ld.Timestamp\n\t}\n\trval := LogRecord{\n\t\tTimestamp: literalTimestamp,\n\t}\n\tif ld.Payload == nil {\n\t\trval.Fields = []log.Field{\n\t\t\tlog.String(\"event\", ld.Event),\n\t\t}\n\t} else {\n\t\trval.Fields = []log.Field{\n\t\t\tlog.String(\"event\", ld.Event),\n\t\t\tlog.Object(\"payload\", ld.Payload),\n\t\t}\n\t}\n\treturn rval\n}\n"
  },
  {
    "path": "vendor/github.com/opentracing/opentracing-go/tracer.go",
    "content": "package opentracing\n\nimport \"time\"\n\n// Tracer is a simple, thin interface for Span creation and SpanContext\n// propagation.\ntype Tracer interface {\n\n\t// Create, start, and return a new Span with the given `operationName` and\n\t// incorporate the given StartSpanOption `opts`. (Note that `opts` borrows\n\t// from the \"functional options\" pattern, per\n\t// http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis)\n\t//\n\t// A Span with no SpanReference options (e.g., opentracing.ChildOf() or\n\t// opentracing.FollowsFrom()) becomes the root of its own trace.\n\t//\n\t// Examples:\n\t//\n\t//     var tracer opentracing.Tracer = ...\n\t//\n\t//     // The root-span case:\n\t//     sp := tracer.StartSpan(\"GetFeed\")\n\t//\n\t//     // The vanilla child span case:\n\t//     sp := tracer.StartSpan(\n\t//         \"GetFeed\",\n\t//         opentracing.ChildOf(parentSpan.Context()))\n\t//\n\t//     // All the bells and whistles:\n\t//     sp := tracer.StartSpan(\n\t//         \"GetFeed\",\n\t//         opentracing.ChildOf(parentSpan.Context()),\n\t//         opentracing.Tag{\"user_agent\", loggedReq.UserAgent},\n\t//         opentracing.StartTime(loggedReq.Timestamp),\n\t//     )\n\t//\n\tStartSpan(operationName string, opts ...StartSpanOption) Span\n\n\t// Inject() takes the `sm` SpanContext instance and injects it for\n\t// propagation within `carrier`. The actual type of `carrier` depends on\n\t// the value of `format`.\n\t//\n\t// OpenTracing defines a common set of `format` values (see BuiltinFormat),\n\t// and each has an expected carrier type.\n\t//\n\t// Other packages may declare their own `format` values, much like the keys\n\t// used by `context.Context` (see\n\t// https://godoc.org/golang.org/x/net/context#WithValue).\n\t//\n\t// Example usage (sans error handling):\n\t//\n\t//     carrier := opentracing.HTTPHeadersCarrier(httpReq.Header)\n\t//     err := tracer.Inject(\n\t//         span.Context(),\n\t//         opentracing.HTTPHeaders,\n\t//         carrier)\n\t//\n\t// NOTE: All opentracing.Tracer implementations MUST support all\n\t// BuiltinFormats.\n\t//\n\t// Implementations may return opentracing.ErrUnsupportedFormat if `format`\n\t// is not supported by (or not known by) the implementation.\n\t//\n\t// Implementations may return opentracing.ErrInvalidCarrier or any other\n\t// implementation-specific error if the format is supported but injection\n\t// fails anyway.\n\t//\n\t// See Tracer.Extract().\n\tInject(sm SpanContext, format interface{}, carrier interface{}) error\n\n\t// Extract() returns a SpanContext instance given `format` and `carrier`.\n\t//\n\t// OpenTracing defines a common set of `format` values (see BuiltinFormat),\n\t// and each has an expected carrier type.\n\t//\n\t// Other packages may declare their own `format` values, much like the keys\n\t// used by `context.Context` (see\n\t// https://godoc.org/golang.org/x/net/context#WithValue).\n\t//\n\t// Example usage (with StartSpan):\n\t//\n\t//\n\t//     carrier := opentracing.HTTPHeadersCarrier(httpReq.Header)\n\t//     clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier)\n\t//\n\t//     // ... assuming the ultimate goal here is to resume the trace with a\n\t//     // server-side Span:\n\t//     var serverSpan opentracing.Span\n\t//     if err == nil {\n\t//         span = tracer.StartSpan(\n\t//             rpcMethodName, ext.RPCServerOption(clientContext))\n\t//     } else {\n\t//         span = tracer.StartSpan(rpcMethodName)\n\t//     }\n\t//\n\t//\n\t// NOTE: All opentracing.Tracer implementations MUST support all\n\t// BuiltinFormats.\n\t//\n\t// Return values:\n\t//  - A successful Extract returns a SpanContext instance and a nil error\n\t//  - If there was simply no SpanContext to extract in `carrier`, Extract()\n\t//    returns (nil, opentracing.ErrSpanContextNotFound)\n\t//  - If `format` is unsupported or unrecognized, Extract() returns (nil,\n\t//    opentracing.ErrUnsupportedFormat)\n\t//  - If there are more fundamental problems with the `carrier` object,\n\t//    Extract() may return opentracing.ErrInvalidCarrier,\n\t//    opentracing.ErrSpanContextCorrupted, or implementation-specific\n\t//    errors.\n\t//\n\t// See Tracer.Inject().\n\tExtract(format interface{}, carrier interface{}) (SpanContext, error)\n}\n\n// StartSpanOptions allows Tracer.StartSpan() callers and implementors a\n// mechanism to override the start timestamp, specify Span References, and make\n// a single Tag or multiple Tags available at Span start time.\n//\n// StartSpan() callers should look at the StartSpanOption interface and\n// implementations available in this package.\n//\n// Tracer implementations can convert a slice of `StartSpanOption` instances\n// into a `StartSpanOptions` struct like so:\n//\n//     func StartSpan(opName string, opts ...opentracing.StartSpanOption) {\n//         sso := opentracing.StartSpanOptions{}\n//         for _, o := range opts {\n//             o.Apply(&sso)\n//         }\n//         ...\n//     }\n//\ntype StartSpanOptions struct {\n\t// Zero or more causal references to other Spans (via their SpanContext).\n\t// If empty, start a \"root\" Span (i.e., start a new trace).\n\tReferences []SpanReference\n\n\t// StartTime overrides the Span's start time, or implicitly becomes\n\t// time.Now() if StartTime.IsZero().\n\tStartTime time.Time\n\n\t// Tags may have zero or more entries; the restrictions on map values are\n\t// identical to those for Span.SetTag(). May be nil.\n\t//\n\t// If specified, the caller hands off ownership of Tags at\n\t// StartSpan() invocation time.\n\tTags map[string]interface{}\n}\n\n// StartSpanOption instances (zero or more) may be passed to Tracer.StartSpan.\n//\n// StartSpanOption borrows from the \"functional options\" pattern, per\n// http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis\ntype StartSpanOption interface {\n\tApply(*StartSpanOptions)\n}\n\n// SpanReferenceType is an enum type describing different categories of\n// relationships between two Spans. If Span-2 refers to Span-1, the\n// SpanReferenceType describes Span-1 from Span-2's perspective. For example,\n// ChildOfRef means that Span-1 created Span-2.\n//\n// NOTE: Span-1 and Span-2 do *not* necessarily depend on each other for\n// completion; e.g., Span-2 may be part of a background job enqueued by Span-1,\n// or Span-2 may be sitting in a distributed queue behind Span-1.\ntype SpanReferenceType int\n\nconst (\n\t// ChildOfRef refers to a parent Span that caused *and* somehow depends\n\t// upon the new child Span. Often (but not always), the parent Span cannot\n\t// finish until the child Span does.\n\t//\n\t// An timing diagram for a ChildOfRef that's blocked on the new Span:\n\t//\n\t//     [-Parent Span---------]\n\t//          [-Child Span----]\n\t//\n\t// See http://opentracing.io/spec/\n\t//\n\t// See opentracing.ChildOf()\n\tChildOfRef SpanReferenceType = iota\n\n\t// FollowsFromRef refers to a parent Span that does not depend in any way\n\t// on the result of the new child Span. For instance, one might use\n\t// FollowsFromRefs to describe pipeline stages separated by queues,\n\t// or a fire-and-forget cache insert at the tail end of a web request.\n\t//\n\t// A FollowsFromRef Span is part of the same logical trace as the new Span:\n\t// i.e., the new Span is somehow caused by the work of its FollowsFromRef.\n\t//\n\t// All of the following could be valid timing diagrams for children that\n\t// \"FollowFrom\" a parent.\n\t//\n\t//     [-Parent Span-]  [-Child Span-]\n\t//\n\t//\n\t//     [-Parent Span--]\n\t//      [-Child Span-]\n\t//\n\t//\n\t//     [-Parent Span-]\n\t//                 [-Child Span-]\n\t//\n\t// See http://opentracing.io/spec/\n\t//\n\t// See opentracing.FollowsFrom()\n\tFollowsFromRef\n)\n\n// SpanReference is a StartSpanOption that pairs a SpanReferenceType and a\n// referenced SpanContext. See the SpanReferenceType documentation for\n// supported relationships.  If SpanReference is created with\n// ReferencedContext==nil, it has no effect. Thus it allows for a more concise\n// syntax for starting spans:\n//\n//     sc, _ := tracer.Extract(someFormat, someCarrier)\n//     span := tracer.StartSpan(\"operation\", opentracing.ChildOf(sc))\n//\n// The `ChildOf(sc)` option above will not panic if sc == nil, it will just\n// not add the parent span reference to the options.\ntype SpanReference struct {\n\tType              SpanReferenceType\n\tReferencedContext SpanContext\n}\n\n// Apply satisfies the StartSpanOption interface.\nfunc (r SpanReference) Apply(o *StartSpanOptions) {\n\tif r.ReferencedContext != nil {\n\t\to.References = append(o.References, r)\n\t}\n}\n\n// ChildOf returns a StartSpanOption pointing to a dependent parent span.\n// If sc == nil, the option has no effect.\n//\n// See ChildOfRef, SpanReference\nfunc ChildOf(sc SpanContext) SpanReference {\n\treturn SpanReference{\n\t\tType:              ChildOfRef,\n\t\tReferencedContext: sc,\n\t}\n}\n\n// FollowsFrom returns a StartSpanOption pointing to a parent Span that caused\n// the child Span but does not directly depend on its result in any way.\n// If sc == nil, the option has no effect.\n//\n// See FollowsFromRef, SpanReference\nfunc FollowsFrom(sc SpanContext) SpanReference {\n\treturn SpanReference{\n\t\tType:              FollowsFromRef,\n\t\tReferencedContext: sc,\n\t}\n}\n\n// StartTime is a StartSpanOption that sets an explicit start timestamp for the\n// new Span.\ntype StartTime time.Time\n\n// Apply satisfies the StartSpanOption interface.\nfunc (t StartTime) Apply(o *StartSpanOptions) {\n\to.StartTime = time.Time(t)\n}\n\n// Tags are a generic map from an arbitrary string key to an opaque value type.\n// The underlying tracing system is responsible for interpreting and\n// serializing the values.\ntype Tags map[string]interface{}\n\n// Apply satisfies the StartSpanOption interface.\nfunc (t Tags) Apply(o *StartSpanOptions) {\n\tif o.Tags == nil {\n\t\to.Tags = make(map[string]interface{})\n\t}\n\tfor k, v := range t {\n\t\to.Tags[k] = v\n\t}\n}\n\n// Tag may be passed as a StartSpanOption to add a tag to new spans,\n// or its Set method may be used to apply the tag to an existing Span,\n// for example:\n//\n// tracer.StartSpan(\"opName\", Tag{\"Key\", value})\n//\n//   or\n//\n// Tag{\"key\", value}.Set(span)\ntype Tag struct {\n\tKey   string\n\tValue interface{}\n}\n\n// Apply satisfies the StartSpanOption interface.\nfunc (t Tag) Apply(o *StartSpanOptions) {\n\tif o.Tags == nil {\n\t\to.Tags = make(map[string]interface{})\n\t}\n\to.Tags[t.Key] = t.Value\n}\n\n// Set applies the tag to an existing Span.\nfunc (t Tag) Set(s Span) {\n\ts.SetTag(t.Key, t.Value)\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/CONTRIBUTING.md",
    "content": "# How to contribute\n\nWe definitely welcome patches and contribution to this project!\n\n### Legal requirements\n\nIn order to protect both you and ourselves, you will need to sign the\n[Contributor License Agreement](https://cla.developers.google.com/clas).\n\nYou may have already signed it for other Google projects.\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/CONTRIBUTORS",
    "content": "Paul Borman <borman@google.com>\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/LICENSE",
    "content": "Copyright (c) 2009,2014 Google Inc. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/README.md",
    "content": "This project was automatically exported from code.google.com/p/go-uuid\n\n# uuid ![build status](https://travis-ci.org/pborman/uuid.svg?branch=master)\nThe uuid package generates and inspects UUIDs based on [RFC 4122](http://tools.ietf.org/html/rfc4122) and DCE 1.1: Authentication and Security Services. \n\n###### Install\n`go get github.com/pborman/uuid`\n\n###### Documentation \n[![GoDoc](https://godoc.org/github.com/pborman/uuid?status.svg)](http://godoc.org/github.com/pborman/uuid)\n\nFull `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here: \nhttp://godoc.org/github.com/pborman/uuid\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/dce.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"os\"\n)\n\n// A Domain represents a Version 2 domain\ntype Domain byte\n\n// Domain constants for DCE Security (Version 2) UUIDs.\nconst (\n\tPerson = Domain(0)\n\tGroup  = Domain(1)\n\tOrg    = Domain(2)\n)\n\n// NewDCESecurity returns a DCE Security (Version 2) UUID.\n//\n// The domain should be one of Person, Group or Org.\n// On a POSIX system the id should be the users UID for the Person\n// domain and the users GID for the Group.  The meaning of id for\n// the domain Org or on non-POSIX systems is site defined.\n//\n// For a given domain/id pair the same token may be returned for up to\n// 7 minutes and 10 seconds.\nfunc NewDCESecurity(domain Domain, id uint32) UUID {\n\tuuid := NewUUID()\n\tif uuid != nil {\n\t\tuuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2\n\t\tuuid[9] = byte(domain)\n\t\tbinary.BigEndian.PutUint32(uuid[0:], id)\n\t}\n\treturn uuid\n}\n\n// NewDCEPerson returns a DCE Security (Version 2) UUID in the person\n// domain with the id returned by os.Getuid.\n//\n//  NewDCEPerson(Person, uint32(os.Getuid()))\nfunc NewDCEPerson() UUID {\n\treturn NewDCESecurity(Person, uint32(os.Getuid()))\n}\n\n// NewDCEGroup returns a DCE Security (Version 2) UUID in the group\n// domain with the id returned by os.Getgid.\n//\n//  NewDCEGroup(Group, uint32(os.Getgid()))\nfunc NewDCEGroup() UUID {\n\treturn NewDCESecurity(Group, uint32(os.Getgid()))\n}\n\n// Domain returns the domain for a Version 2 UUID or false.\nfunc (uuid UUID) Domain() (Domain, bool) {\n\tif v, _ := uuid.Version(); v != 2 {\n\t\treturn 0, false\n\t}\n\treturn Domain(uuid[9]), true\n}\n\n// Id returns the id for a Version 2 UUID or false.\nfunc (uuid UUID) Id() (uint32, bool) {\n\tif v, _ := uuid.Version(); v != 2 {\n\t\treturn 0, false\n\t}\n\treturn binary.BigEndian.Uint32(uuid[0:4]), true\n}\n\nfunc (d Domain) String() string {\n\tswitch d {\n\tcase Person:\n\t\treturn \"Person\"\n\tcase Group:\n\t\treturn \"Group\"\n\tcase Org:\n\t\treturn \"Org\"\n\t}\n\treturn fmt.Sprintf(\"Domain%d\", int(d))\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/doc.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// The uuid package generates and inspects UUIDs.\n//\n// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security Services.\npackage uuid\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/hash.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"crypto/md5\"\n\t\"crypto/sha1\"\n\t\"hash\"\n)\n\n// Well known Name Space IDs and UUIDs\nvar (\n\tNameSpace_DNS  = Parse(\"6ba7b810-9dad-11d1-80b4-00c04fd430c8\")\n\tNameSpace_URL  = Parse(\"6ba7b811-9dad-11d1-80b4-00c04fd430c8\")\n\tNameSpace_OID  = Parse(\"6ba7b812-9dad-11d1-80b4-00c04fd430c8\")\n\tNameSpace_X500 = Parse(\"6ba7b814-9dad-11d1-80b4-00c04fd430c8\")\n\tNIL            = Parse(\"00000000-0000-0000-0000-000000000000\")\n)\n\n// NewHash returns a new UUID derived from the hash of space concatenated with\n// data generated by h.  The hash should be at least 16 byte in length.  The\n// first 16 bytes of the hash are used to form the UUID.  The version of the\n// UUID will be the lower 4 bits of version.  NewHash is used to implement\n// NewMD5 and NewSHA1.\nfunc NewHash(h hash.Hash, space UUID, data []byte, version int) UUID {\n\th.Reset()\n\th.Write(space)\n\th.Write([]byte(data))\n\ts := h.Sum(nil)\n\tuuid := make([]byte, 16)\n\tcopy(uuid, s)\n\tuuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4)\n\tuuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant\n\treturn uuid\n}\n\n// NewMD5 returns a new MD5 (Version 3) UUID based on the\n// supplied name space and data.\n//\n//  NewHash(md5.New(), space, data, 3)\nfunc NewMD5(space UUID, data []byte) UUID {\n\treturn NewHash(md5.New(), space, data, 3)\n}\n\n// NewSHA1 returns a new SHA1 (Version 5) UUID based on the\n// supplied name space and data.\n//\n//  NewHash(sha1.New(), space, data, 5)\nfunc NewSHA1(space UUID, data []byte) UUID {\n\treturn NewHash(sha1.New(), space, data, 5)\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/marshal.go",
    "content": "// Copyright 2016 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n)\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (u UUID) MarshalText() ([]byte, error) {\n\tif len(u) != 16 {\n\t\treturn nil, nil\n\t}\n\tvar js [36]byte\n\tencodeHex(js[:], u)\n\treturn js[:], nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (u *UUID) UnmarshalText(data []byte) error {\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\tid := Parse(string(data))\n\tif id == nil {\n\t\treturn errors.New(\"invalid UUID\")\n\t}\n\t*u = id\n\treturn nil\n}\n\n// MarshalBinary implements encoding.BinaryMarshaler.\nfunc (u UUID) MarshalBinary() ([]byte, error) {\n\treturn u[:], nil\n}\n\n// UnmarshalBinary implements encoding.BinaryUnmarshaler.\nfunc (u *UUID) UnmarshalBinary(data []byte) error {\n\tif len(data) == 0 {\n\t\treturn nil\n\t}\n\tif len(data) != 16 {\n\t\treturn fmt.Errorf(\"invalid UUID (got %d bytes)\", len(data))\n\t}\n\tvar id [16]byte\n\tcopy(id[:], data)\n\t*u = id[:]\n\treturn nil\n}\n\n// MarshalText implements encoding.TextMarshaler.\nfunc (u Array) MarshalText() ([]byte, error) {\n\tvar js [36]byte\n\tencodeHex(js[:], u[:])\n\treturn js[:], nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler.\nfunc (u *Array) UnmarshalText(data []byte) error {\n\tid := Parse(string(data))\n\tif id == nil {\n\t\treturn errors.New(\"invalid UUID\")\n\t}\n\t*u = id.Array()\n\treturn nil\n}\n\n// MarshalBinary implements encoding.BinaryMarshaler.\nfunc (u Array) MarshalBinary() ([]byte, error) {\n\treturn u[:], nil\n}\n\n// UnmarshalBinary implements encoding.BinaryUnmarshaler.\nfunc (u *Array) UnmarshalBinary(data []byte) error {\n\tif len(data) != 16 {\n\t\treturn fmt.Errorf(\"invalid UUID (got %d bytes)\", len(data))\n\t}\n\tcopy(u[:], data)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/node.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"net\"\n\t\"sync\"\n)\n\nvar (\n\tnodeMu     sync.Mutex\n\tinterfaces []net.Interface // cached list of interfaces\n\tifname     string          // name of interface being used\n\tnodeID     []byte          // hardware for version 1 UUIDs\n)\n\n// NodeInterface returns the name of the interface from which the NodeID was\n// derived.  The interface \"user\" is returned if the NodeID was set by\n// SetNodeID.\nfunc NodeInterface() string {\n\tdefer nodeMu.Unlock()\n\tnodeMu.Lock()\n\treturn ifname\n}\n\n// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs.\n// If name is \"\" then the first usable interface found will be used or a random\n// Node ID will be generated.  If a named interface cannot be found then false\n// is returned.\n//\n// SetNodeInterface never fails when name is \"\".\nfunc SetNodeInterface(name string) bool {\n\tdefer nodeMu.Unlock()\n\tnodeMu.Lock()\n\treturn setNodeInterface(name)\n}\n\nfunc setNodeInterface(name string) bool {\n\tif interfaces == nil {\n\t\tvar err error\n\t\tinterfaces, err = net.Interfaces()\n\t\tif err != nil && name != \"\" {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tfor _, ifs := range interfaces {\n\t\tif len(ifs.HardwareAddr) >= 6 && (name == \"\" || name == ifs.Name) {\n\t\t\tif setNodeID(ifs.HardwareAddr) {\n\t\t\t\tifname = ifs.Name\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\t// We found no interfaces with a valid hardware address.  If name\n\t// does not specify a specific interface generate a random Node ID\n\t// (section 4.1.6)\n\tif name == \"\" {\n\t\tif nodeID == nil {\n\t\t\tnodeID = make([]byte, 6)\n\t\t}\n\t\trandomBits(nodeID)\n\t\treturn true\n\t}\n\treturn false\n}\n\n// NodeID returns a slice of a copy of the current Node ID, setting the Node ID\n// if not already set.\nfunc NodeID() []byte {\n\tdefer nodeMu.Unlock()\n\tnodeMu.Lock()\n\tif nodeID == nil {\n\t\tsetNodeInterface(\"\")\n\t}\n\tnid := make([]byte, 6)\n\tcopy(nid, nodeID)\n\treturn nid\n}\n\n// SetNodeID sets the Node ID to be used for Version 1 UUIDs.  The first 6 bytes\n// of id are used.  If id is less than 6 bytes then false is returned and the\n// Node ID is not set.\nfunc SetNodeID(id []byte) bool {\n\tdefer nodeMu.Unlock()\n\tnodeMu.Lock()\n\tif setNodeID(id) {\n\t\tifname = \"user\"\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc setNodeID(id []byte) bool {\n\tif len(id) < 6 {\n\t\treturn false\n\t}\n\tif nodeID == nil {\n\t\tnodeID = make([]byte, 6)\n\t}\n\tcopy(nodeID, id)\n\treturn true\n}\n\n// NodeID returns the 6 byte node id encoded in uuid.  It returns nil if uuid is\n// not valid.  The NodeID is only well defined for version 1 and 2 UUIDs.\nfunc (uuid UUID) NodeID() []byte {\n\tif len(uuid) != 16 {\n\t\treturn nil\n\t}\n\tnode := make([]byte, 6)\n\tcopy(node, uuid[10:])\n\treturn node\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/sql.go",
    "content": "// Copyright 2015 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"database/sql/driver\"\n\t\"errors\"\n\t\"fmt\"\n)\n\n// Scan implements sql.Scanner so UUIDs can be read from databases transparently\n// Currently, database types that map to string and []byte are supported. Please\n// consult database-specific driver documentation for matching types.\nfunc (uuid *UUID) Scan(src interface{}) error {\n\tswitch src.(type) {\n\tcase string:\n\t\t// if an empty UUID comes from a table, we return a null UUID\n\t\tif src.(string) == \"\" {\n\t\t\treturn nil\n\t\t}\n\n\t\t// see uuid.Parse for required string format\n\t\tparsed := Parse(src.(string))\n\n\t\tif parsed == nil {\n\t\t\treturn errors.New(\"Scan: invalid UUID format\")\n\t\t}\n\n\t\t*uuid = parsed\n\tcase []byte:\n\t\tb := src.([]byte)\n\n\t\t// if an empty UUID comes from a table, we return a null UUID\n\t\tif len(b) == 0 {\n\t\t\treturn nil\n\t\t}\n\n\t\t// assumes a simple slice of bytes if 16 bytes\n\t\t// otherwise attempts to parse\n\t\tif len(b) == 16 {\n\t\t\t*uuid = UUID(b)\n\t\t} else {\n\t\t\tu := Parse(string(b))\n\n\t\t\tif u == nil {\n\t\t\t\treturn errors.New(\"Scan: invalid UUID format\")\n\t\t\t}\n\n\t\t\t*uuid = u\n\t\t}\n\n\tdefault:\n\t\treturn fmt.Errorf(\"Scan: unable to scan type %T into UUID\", src)\n\t}\n\n\treturn nil\n}\n\n// Value implements sql.Valuer so that UUIDs can be written to databases\n// transparently. Currently, UUIDs map to strings. Please consult\n// database-specific driver documentation for matching types.\nfunc (uuid UUID) Value() (driver.Value, error) {\n\treturn uuid.String(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/time.go",
    "content": "// Copyright 2014 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"encoding/binary\"\n\t\"sync\"\n\t\"time\"\n)\n\n// A Time represents a time as the number of 100's of nanoseconds since 15 Oct\n// 1582.\ntype Time int64\n\nconst (\n\tlillian    = 2299160          // Julian day of 15 Oct 1582\n\tunix       = 2440587          // Julian day of 1 Jan 1970\n\tepoch      = unix - lillian   // Days between epochs\n\tg1582      = epoch * 86400    // seconds between epochs\n\tg1582ns100 = g1582 * 10000000 // 100s of a nanoseconds between epochs\n)\n\nvar (\n\ttimeMu    sync.Mutex\n\tlasttime  uint64 // last time we returned\n\tclock_seq uint16 // clock sequence for this run\n\n\ttimeNow = time.Now // for testing\n)\n\n// UnixTime converts t the number of seconds and nanoseconds using the Unix\n// epoch of 1 Jan 1970.\nfunc (t Time) UnixTime() (sec, nsec int64) {\n\tsec = int64(t - g1582ns100)\n\tnsec = (sec % 10000000) * 100\n\tsec /= 10000000\n\treturn sec, nsec\n}\n\n// GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and\n// clock sequence as well as adjusting the clock sequence as needed.  An error\n// is returned if the current time cannot be determined.\nfunc GetTime() (Time, uint16, error) {\n\tdefer timeMu.Unlock()\n\ttimeMu.Lock()\n\treturn getTime()\n}\n\nfunc getTime() (Time, uint16, error) {\n\tt := timeNow()\n\n\t// If we don't have a clock sequence already, set one.\n\tif clock_seq == 0 {\n\t\tsetClockSequence(-1)\n\t}\n\tnow := uint64(t.UnixNano()/100) + g1582ns100\n\n\t// If time has gone backwards with this clock sequence then we\n\t// increment the clock sequence\n\tif now <= lasttime {\n\t\tclock_seq = ((clock_seq + 1) & 0x3fff) | 0x8000\n\t}\n\tlasttime = now\n\treturn Time(now), clock_seq, nil\n}\n\n// ClockSequence returns the current clock sequence, generating one if not\n// already set.  The clock sequence is only used for Version 1 UUIDs.\n//\n// The uuid package does not use global static storage for the clock sequence or\n// the last time a UUID was generated.  Unless SetClockSequence a new random\n// clock sequence is generated the first time a clock sequence is requested by\n// ClockSequence, GetTime, or NewUUID.  (section 4.2.1.1) sequence is generated\n// for\nfunc ClockSequence() int {\n\tdefer timeMu.Unlock()\n\ttimeMu.Lock()\n\treturn clockSequence()\n}\n\nfunc clockSequence() int {\n\tif clock_seq == 0 {\n\t\tsetClockSequence(-1)\n\t}\n\treturn int(clock_seq & 0x3fff)\n}\n\n// SetClockSeq sets the clock sequence to the lower 14 bits of seq.  Setting to\n// -1 causes a new sequence to be generated.\nfunc SetClockSequence(seq int) {\n\tdefer timeMu.Unlock()\n\ttimeMu.Lock()\n\tsetClockSequence(seq)\n}\n\nfunc setClockSequence(seq int) {\n\tif seq == -1 {\n\t\tvar b [2]byte\n\t\trandomBits(b[:]) // clock sequence\n\t\tseq = int(b[0])<<8 | int(b[1])\n\t}\n\told_seq := clock_seq\n\tclock_seq = uint16(seq&0x3fff) | 0x8000 // Set our variant\n\tif old_seq != clock_seq {\n\t\tlasttime = 0\n\t}\n}\n\n// Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in\n// uuid.  It returns false if uuid is not valid.  The time is only well defined\n// for version 1 and 2 UUIDs.\nfunc (uuid UUID) Time() (Time, bool) {\n\tif len(uuid) != 16 {\n\t\treturn 0, false\n\t}\n\ttime := int64(binary.BigEndian.Uint32(uuid[0:4]))\n\ttime |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32\n\ttime |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48\n\treturn Time(time), true\n}\n\n// ClockSequence returns the clock sequence encoded in uuid.  It returns false\n// if uuid is not valid.  The clock sequence is only well defined for version 1\n// and 2 UUIDs.\nfunc (uuid UUID) ClockSequence() (int, bool) {\n\tif len(uuid) != 16 {\n\t\treturn 0, false\n\t}\n\treturn int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff, true\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/util.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"io\"\n)\n\n// randomBits completely fills slice b with random data.\nfunc randomBits(b []byte) {\n\tif _, err := io.ReadFull(rander, b); err != nil {\n\t\tpanic(err.Error()) // rand should never fail\n\t}\n}\n\n// xvalues returns the value of a byte as a hexadecimal digit or 255.\nvar xvalues = [256]byte{\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255,\n\t255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n\t255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n}\n\n// xtob converts the the first two hex bytes of x into a byte.\nfunc xtob(x string) (byte, bool) {\n\tb1 := xvalues[x[0]]\n\tb2 := xvalues[x[1]]\n\treturn (b1 << 4) | b2, b1 != 255 && b2 != 255\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/uuid.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n)\n\n// Array is a pass-by-value UUID that can be used as an effecient key in a map.\ntype Array [16]byte\n\n// UUID converts uuid into a slice.\nfunc (uuid Array) UUID() UUID {\n\treturn uuid[:]\n}\n\n// String returns the string representation of uuid,\n// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.\nfunc (uuid Array) String() string {\n\treturn uuid.UUID().String()\n}\n\n// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC\n// 4122.\ntype UUID []byte\n\n// A Version represents a UUIDs version.\ntype Version byte\n\n// A Variant represents a UUIDs variant.\ntype Variant byte\n\n// Constants returned by Variant.\nconst (\n\tInvalid   = Variant(iota) // Invalid UUID\n\tRFC4122                   // The variant specified in RFC4122\n\tReserved                  // Reserved, NCS backward compatibility.\n\tMicrosoft                 // Reserved, Microsoft Corporation backward compatibility.\n\tFuture                    // Reserved for future definition.\n)\n\nvar rander = rand.Reader // random function\n\n// New returns a new random (version 4) UUID as a string.  It is a convenience\n// function for NewRandom().String().\nfunc New() string {\n\treturn NewRandom().String()\n}\n\n// Parse decodes s into a UUID or returns nil.  Both the UUID form of\n// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and\n// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded.\nfunc Parse(s string) UUID {\n\tif len(s) == 36+9 {\n\t\tif strings.ToLower(s[:9]) != \"urn:uuid:\" {\n\t\t\treturn nil\n\t\t}\n\t\ts = s[9:]\n\t} else if len(s) != 36 {\n\t\treturn nil\n\t}\n\tif s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {\n\t\treturn nil\n\t}\n\tvar uuid [16]byte\n\tfor i, x := range [16]int{\n\t\t0, 2, 4, 6,\n\t\t9, 11,\n\t\t14, 16,\n\t\t19, 21,\n\t\t24, 26, 28, 30, 32, 34} {\n\t\tif v, ok := xtob(s[x:]); !ok {\n\t\t\treturn nil\n\t\t} else {\n\t\t\tuuid[i] = v\n\t\t}\n\t}\n\treturn uuid[:]\n}\n\n// Equal returns true if uuid1 and uuid2 are equal.\nfunc Equal(uuid1, uuid2 UUID) bool {\n\treturn bytes.Equal(uuid1, uuid2)\n}\n\n// Array returns an array representation of uuid that can be used as a map key.\n// Array panics if uuid is not valid.\nfunc (uuid UUID) Array() Array {\n\tif len(uuid) != 16 {\n\t\tpanic(\"invalid uuid\")\n\t}\n\tvar a Array\n\tcopy(a[:], uuid)\n\treturn a\n}\n\n// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n// , or \"\" if uuid is invalid.\nfunc (uuid UUID) String() string {\n\tif len(uuid) != 16 {\n\t\treturn \"\"\n\t}\n\tvar buf [36]byte\n\tencodeHex(buf[:], uuid)\n\treturn string(buf[:])\n}\n\n// URN returns the RFC 2141 URN form of uuid,\n// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,  or \"\" if uuid is invalid.\nfunc (uuid UUID) URN() string {\n\tif len(uuid) != 16 {\n\t\treturn \"\"\n\t}\n\tvar buf [36 + 9]byte\n\tcopy(buf[:], \"urn:uuid:\")\n\tencodeHex(buf[9:], uuid)\n\treturn string(buf[:])\n}\n\nfunc encodeHex(dst []byte, uuid UUID) {\n\thex.Encode(dst[:], uuid[:4])\n\tdst[8] = '-'\n\thex.Encode(dst[9:13], uuid[4:6])\n\tdst[13] = '-'\n\thex.Encode(dst[14:18], uuid[6:8])\n\tdst[18] = '-'\n\thex.Encode(dst[19:23], uuid[8:10])\n\tdst[23] = '-'\n\thex.Encode(dst[24:], uuid[10:])\n}\n\n// Variant returns the variant encoded in uuid.  It returns Invalid if\n// uuid is invalid.\nfunc (uuid UUID) Variant() Variant {\n\tif len(uuid) != 16 {\n\t\treturn Invalid\n\t}\n\tswitch {\n\tcase (uuid[8] & 0xc0) == 0x80:\n\t\treturn RFC4122\n\tcase (uuid[8] & 0xe0) == 0xc0:\n\t\treturn Microsoft\n\tcase (uuid[8] & 0xe0) == 0xe0:\n\t\treturn Future\n\tdefault:\n\t\treturn Reserved\n\t}\n}\n\n// Version returns the version of uuid.  It returns false if uuid is not\n// valid.\nfunc (uuid UUID) Version() (Version, bool) {\n\tif len(uuid) != 16 {\n\t\treturn 0, false\n\t}\n\treturn Version(uuid[6] >> 4), true\n}\n\nfunc (v Version) String() string {\n\tif v > 15 {\n\t\treturn fmt.Sprintf(\"BAD_VERSION_%d\", v)\n\t}\n\treturn fmt.Sprintf(\"VERSION_%d\", v)\n}\n\nfunc (v Variant) String() string {\n\tswitch v {\n\tcase RFC4122:\n\t\treturn \"RFC4122\"\n\tcase Reserved:\n\t\treturn \"Reserved\"\n\tcase Microsoft:\n\t\treturn \"Microsoft\"\n\tcase Future:\n\t\treturn \"Future\"\n\tcase Invalid:\n\t\treturn \"Invalid\"\n\t}\n\treturn fmt.Sprintf(\"BadVariant%d\", int(v))\n}\n\n// SetRand sets the random number generator to r, which implements io.Reader.\n// If r.Read returns an error when the package requests random data then\n// a panic will be issued.\n//\n// Calling SetRand with nil sets the random number generator to the default\n// generator.\nfunc SetRand(r io.Reader) {\n\tif r == nil {\n\t\trander = rand.Reader\n\t\treturn\n\t}\n\trander = r\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/version1.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\nimport (\n\t\"encoding/binary\"\n)\n\n// NewUUID returns a Version 1 UUID based on the current NodeID and clock\n// sequence, and the current time.  If the NodeID has not been set by SetNodeID\n// or SetNodeInterface then it will be set automatically.  If the NodeID cannot\n// be set NewUUID returns nil.  If clock sequence has not been set by\n// SetClockSequence then it will be set automatically.  If GetTime fails to\n// return the current NewUUID returns nil.\nfunc NewUUID() UUID {\n\tif nodeID == nil {\n\t\tSetNodeInterface(\"\")\n\t}\n\n\tnow, seq, err := GetTime()\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\tuuid := make([]byte, 16)\n\n\ttime_low := uint32(now & 0xffffffff)\n\ttime_mid := uint16((now >> 32) & 0xffff)\n\ttime_hi := uint16((now >> 48) & 0x0fff)\n\ttime_hi |= 0x1000 // Version 1\n\n\tbinary.BigEndian.PutUint32(uuid[0:], time_low)\n\tbinary.BigEndian.PutUint16(uuid[4:], time_mid)\n\tbinary.BigEndian.PutUint16(uuid[6:], time_hi)\n\tbinary.BigEndian.PutUint16(uuid[8:], seq)\n\tcopy(uuid[10:], nodeID)\n\n\treturn uuid\n}\n"
  },
  {
    "path": "vendor/github.com/pborman/uuid/version4.go",
    "content": "// Copyright 2011 Google Inc.  All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage uuid\n\n// Random returns a Random (Version 4) UUID or panics.\n//\n// The strength of the UUIDs is based on the strength of the crypto/rand\n// package.\n//\n// A note about uniqueness derived from from the UUID Wikipedia entry:\n//\n//  Randomly generated UUIDs have 122 random bits.  One's annual risk of being\n//  hit by a meteorite is estimated to be one chance in 17 billion, that\n//  means the probability is about 0.00000000006 (6 × 10−11),\n//  equivalent to the odds of creating a few tens of trillions of UUIDs in a\n//  year and having one duplicate.\nfunc NewRandom() UUID {\n\tuuid := make([]byte, 16)\n\trandomBits([]byte(uuid))\n\tuuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4\n\tuuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10\n\treturn uuid\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/COPYING",
    "content": "Copyright © 2012 Peter Harris\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the \"Software\"),\nto deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice (including the next\nparagraph) shall be included in all copies or substantial portions of the\nSoftware.\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\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/README.md",
    "content": "Liner\n=====\n\nLiner is a command line editor with history. It was inspired by linenoise;\neverything Unix-like is a VT100 (or is trying very hard to be). If your\nterminal is not pretending to be a VT100, change it. Liner also support\nWindows.\n\nLiner is released under the X11 license (which is similar to the new BSD\nlicense).\n\nLine Editing\n------------\n\nThe following line editing commands are supported on platforms and terminals\nthat Liner supports:\n\nKeystroke    | Action\n---------    | ------\nCtrl-A, Home | Move cursor to beginning of line\nCtrl-E, End  | Move cursor to end of line\nCtrl-B, Left | Move cursor one character left\nCtrl-F, Right| Move cursor one character right\nCtrl-Left, Alt-B    | Move cursor to previous word\nCtrl-Right, Alt-F   | Move cursor to next word\nCtrl-D, Del  | (if line is *not* empty) Delete character under cursor\nCtrl-D       | (if line *is* empty) End of File - usually quits application\nCtrl-C       | Reset input (create new empty prompt)\nCtrl-L       | Clear screen (line is unmodified)\nCtrl-T       | Transpose previous character with current character\nCtrl-H, BackSpace | Delete character before cursor\nCtrl-W       | Delete word leading up to cursor\nCtrl-K       | Delete from cursor to end of line\nCtrl-U       | Delete from start of line to cursor\nCtrl-P, Up   | Previous match from history\nCtrl-N, Down | Next match from history\nCtrl-R       | Reverse Search history (Ctrl-S forward, Ctrl-G cancel)\nCtrl-Y       | Paste from Yank buffer (Alt-Y to paste next yank instead)\nTab          | Next completion\nShift-Tab    | (after Tab) Previous completion\n\nGetting started\n-----------------\n\n```go\npackage main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/peterh/liner\"\n)\n\nvar (\n\thistory_fn = filepath.Join(os.TempDir(), \".liner_example_history\")\n\tnames      = []string{\"john\", \"james\", \"mary\", \"nancy\"}\n)\n\nfunc main() {\n\tline := liner.NewLiner()\n\tdefer line.Close()\n\n\tline.SetCtrlCAborts(true)\n\n\tline.SetCompleter(func(line string) (c []string) {\n\t\tfor _, n := range names {\n\t\t\tif strings.HasPrefix(n, strings.ToLower(line)) {\n\t\t\t\tc = append(c, n)\n\t\t\t}\n\t\t}\n\t\treturn\n\t})\n\n\tif f, err := os.Open(history_fn); err == nil {\n\t\tline.ReadHistory(f)\n\t\tf.Close()\n\t}\n\n\tif name, err := line.Prompt(\"What is your name? \"); err == nil {\n\t\tlog.Print(\"Got: \", name)\n\t\tline.AppendHistory(name)\n\t} else if err == liner.ErrPromptAborted {\n\t\tlog.Print(\"Aborted\")\n\t} else {\n\t\tlog.Print(\"Error reading line: \", err)\n\t}\n\n\tif f, err := os.Create(history_fn); err != nil {\n\t\tlog.Print(\"Error writing history file: \", err)\n\t} else {\n\t\tline.WriteHistory(f)\n\t\tf.Close()\n\t}\n}\n```\n\nFor documentation, see http://godoc.org/github.com/peterh/liner\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/bsdinput.go",
    "content": "// +build openbsd freebsd netbsd\n\npackage liner\n\nimport \"syscall\"\n\nconst (\n\tgetTermios = syscall.TIOCGETA\n\tsetTermios = syscall.TIOCSETA\n)\n\nconst (\n\t// Input flags\n\tinpck  = 0x010\n\tistrip = 0x020\n\ticrnl  = 0x100\n\tixon   = 0x200\n\n\t// Output flags\n\topost = 0x1\n\n\t// Control flags\n\tcs8 = 0x300\n\n\t// Local flags\n\tisig   = 0x080\n\ticanon = 0x100\n\tiexten = 0x400\n)\n\ntype termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]byte\n\tIspeed int32\n\tOspeed int32\n}\n\nconst cursorColumn = false\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/common.go",
    "content": "/*\nPackage liner implements a simple command line editor, inspired by linenoise\n(https://github.com/antirez/linenoise/). This package supports WIN32 in\naddition to the xterm codes supported by everything else.\n*/\npackage liner\n\nimport (\n\t\"bufio\"\n\t\"container/ring\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"sync\"\n\t\"unicode/utf8\"\n)\n\ntype commonState struct {\n\tterminalSupported bool\n\toutputRedirected  bool\n\tinputRedirected   bool\n\thistory           []string\n\thistoryMutex      sync.RWMutex\n\tcompleter         WordCompleter\n\tcolumns           int\n\tkillRing          *ring.Ring\n\tctrlCAborts       bool\n\tr                 *bufio.Reader\n\ttabStyle          TabStyle\n\tmultiLineMode     bool\n\tcursorRows        int\n\tmaxRows           int\n\tshouldRestart     ShouldRestart\n\tneedRefresh       bool\n}\n\n// TabStyle is used to select how tab completions are displayed.\ntype TabStyle int\n\n// Two tab styles are currently available:\n//\n// TabCircular cycles through each completion item and displays it directly on\n// the prompt\n//\n// TabPrints prints the list of completion items to the screen after a second\n// tab key is pressed. This behaves similar to GNU readline and BASH (which\n// uses readline)\nconst (\n\tTabCircular TabStyle = iota\n\tTabPrints\n)\n\n// ErrPromptAborted is returned from Prompt or PasswordPrompt when the user presses Ctrl-C\n// if SetCtrlCAborts(true) has been called on the State\nvar ErrPromptAborted = errors.New(\"prompt aborted\")\n\n// ErrNotTerminalOutput is returned from Prompt or PasswordPrompt if the\n// platform is normally supported, but stdout has been redirected\nvar ErrNotTerminalOutput = errors.New(\"standard output is not a terminal\")\n\n// ErrInvalidPrompt is returned from Prompt or PasswordPrompt if the\n// prompt contains any unprintable runes (including substrings that could\n// be colour codes on some platforms).\nvar ErrInvalidPrompt = errors.New(\"invalid prompt\")\n\n// ErrInternal is returned when liner experiences an error that it cannot\n// handle. For example, if the number of colums becomes zero during an\n// active call to Prompt\nvar ErrInternal = errors.New(\"liner: internal error\")\n\n// KillRingMax is the max number of elements to save on the killring.\nconst KillRingMax = 60\n\n// HistoryLimit is the maximum number of entries saved in the scrollback history.\nconst HistoryLimit = 1000\n\n// ReadHistory reads scrollback history from r. Returns the number of lines\n// read, and any read error (except io.EOF).\nfunc (s *State) ReadHistory(r io.Reader) (num int, err error) {\n\ts.historyMutex.Lock()\n\tdefer s.historyMutex.Unlock()\n\n\tin := bufio.NewReader(r)\n\tnum = 0\n\tfor {\n\t\tline, part, err := in.ReadLine()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn num, err\n\t\t}\n\t\tif part {\n\t\t\treturn num, fmt.Errorf(\"line %d is too long\", num+1)\n\t\t}\n\t\tif !utf8.Valid(line) {\n\t\t\treturn num, fmt.Errorf(\"invalid string at line %d\", num+1)\n\t\t}\n\t\tnum++\n\t\ts.history = append(s.history, string(line))\n\t\tif len(s.history) > HistoryLimit {\n\t\t\ts.history = s.history[1:]\n\t\t}\n\t}\n\treturn num, nil\n}\n\n// WriteHistory writes scrollback history to w. Returns the number of lines\n// successfully written, and any write error.\n//\n// Unlike the rest of liner's API, WriteHistory is safe to call\n// from another goroutine while Prompt is in progress.\n// This exception is to facilitate the saving of the history buffer\n// during an unexpected exit (for example, due to Ctrl-C being invoked)\nfunc (s *State) WriteHistory(w io.Writer) (num int, err error) {\n\ts.historyMutex.RLock()\n\tdefer s.historyMutex.RUnlock()\n\n\tfor _, item := range s.history {\n\t\t_, err := fmt.Fprintln(w, item)\n\t\tif err != nil {\n\t\t\treturn num, err\n\t\t}\n\t\tnum++\n\t}\n\treturn num, nil\n}\n\n// AppendHistory appends an entry to the scrollback history. AppendHistory\n// should be called iff Prompt returns a valid command.\nfunc (s *State) AppendHistory(item string) {\n\ts.historyMutex.Lock()\n\tdefer s.historyMutex.Unlock()\n\n\tif len(s.history) > 0 {\n\t\tif item == s.history[len(s.history)-1] {\n\t\t\treturn\n\t\t}\n\t}\n\ts.history = append(s.history, item)\n\tif len(s.history) > HistoryLimit {\n\t\ts.history = s.history[1:]\n\t}\n}\n\n// ClearHistory clears the scroollback history.\nfunc (s *State) ClearHistory() {\n\ts.historyMutex.Lock()\n\tdefer s.historyMutex.Unlock()\n\ts.history = nil\n}\n\n// Returns the history lines starting with prefix\nfunc (s *State) getHistoryByPrefix(prefix string) (ph []string) {\n\tfor _, h := range s.history {\n\t\tif strings.HasPrefix(h, prefix) {\n\t\t\tph = append(ph, h)\n\t\t}\n\t}\n\treturn\n}\n\n// Returns the history lines matching the intelligent search\nfunc (s *State) getHistoryByPattern(pattern string) (ph []string, pos []int) {\n\tif pattern == \"\" {\n\t\treturn\n\t}\n\tfor _, h := range s.history {\n\t\tif i := strings.Index(h, pattern); i >= 0 {\n\t\t\tph = append(ph, h)\n\t\t\tpos = append(pos, i)\n\t\t}\n\t}\n\treturn\n}\n\n// Completer takes the currently edited line content at the left of the cursor\n// and returns a list of completion candidates.\n// If the line is \"Hello, wo!!!\" and the cursor is before the first '!', \"Hello, wo\" is passed\n// to the completer which may return {\"Hello, world\", \"Hello, Word\"} to have \"Hello, world!!!\".\ntype Completer func(line string) []string\n\n// WordCompleter takes the currently edited line with the cursor position and\n// returns the completion candidates for the partial word to be completed.\n// If the line is \"Hello, wo!!!\" and the cursor is before the first '!', (\"Hello, wo!!!\", 9) is passed\n// to the completer which may returns (\"Hello, \", {\"world\", \"Word\"}, \"!!!\") to have \"Hello, world!!!\".\ntype WordCompleter func(line string, pos int) (head string, completions []string, tail string)\n\n// SetCompleter sets the completion function that Liner will call to\n// fetch completion candidates when the user presses tab.\nfunc (s *State) SetCompleter(f Completer) {\n\tif f == nil {\n\t\ts.completer = nil\n\t\treturn\n\t}\n\ts.completer = func(line string, pos int) (string, []string, string) {\n\t\treturn \"\", f(string([]rune(line)[:pos])), string([]rune(line)[pos:])\n\t}\n}\n\n// SetWordCompleter sets the completion function that Liner will call to\n// fetch completion candidates when the user presses tab.\nfunc (s *State) SetWordCompleter(f WordCompleter) {\n\ts.completer = f\n}\n\n// SetTabCompletionStyle sets the behvavior when the Tab key is pressed\n// for auto-completion.  TabCircular is the default behavior and cycles\n// through the list of candidates at the prompt.  TabPrints will print\n// the available completion candidates to the screen similar to BASH\n// and GNU Readline\nfunc (s *State) SetTabCompletionStyle(tabStyle TabStyle) {\n\ts.tabStyle = tabStyle\n}\n\n// ModeApplier is the interface that wraps a representation of the terminal\n// mode. ApplyMode sets the terminal to this mode.\ntype ModeApplier interface {\n\tApplyMode() error\n}\n\n// SetCtrlCAborts sets whether Prompt on a supported terminal will return an\n// ErrPromptAborted when Ctrl-C is pressed. The default is false (will not\n// return when Ctrl-C is pressed). Unsupported terminals typically raise SIGINT\n// (and Prompt does not return) regardless of the value passed to SetCtrlCAborts.\nfunc (s *State) SetCtrlCAborts(aborts bool) {\n\ts.ctrlCAborts = aborts\n}\n\n// SetMultiLineMode sets whether line is auto-wrapped. The default is false (single line).\nfunc (s *State) SetMultiLineMode(mlmode bool) {\n\ts.multiLineMode = mlmode\n}\n\n// ShouldRestart is passed the error generated by readNext and returns true if\n// the the read should be restarted or false if the error should be returned.\ntype ShouldRestart func(err error) bool\n\n// SetShouldRestart sets the restart function that Liner will call to determine\n// whether to retry the call to, or return the error returned by, readNext.\nfunc (s *State) SetShouldRestart(f ShouldRestart) {\n\ts.shouldRestart = f\n}\n\nfunc (s *State) promptUnsupported(p string) (string, error) {\n\tif !s.inputRedirected || !s.terminalSupported {\n\t\tfmt.Print(p)\n\t}\n\tlinebuf, _, err := s.r.ReadLine()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(linebuf), nil\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/fallbackinput.go",
    "content": "// +build !windows,!linux,!darwin,!openbsd,!freebsd,!netbsd\n\npackage liner\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"os\"\n)\n\n// State represents an open terminal\ntype State struct {\n\tcommonState\n}\n\n// Prompt displays p, and then waits for user input. Prompt does not support\n// line editing on this operating system.\nfunc (s *State) Prompt(p string) (string, error) {\n\treturn s.promptUnsupported(p)\n}\n\n// PasswordPrompt is not supported in this OS.\nfunc (s *State) PasswordPrompt(p string) (string, error) {\n\treturn \"\", errors.New(\"liner: function not supported in this terminal\")\n}\n\n// NewLiner initializes a new *State\n//\n// Note that this operating system uses a fallback mode without line\n// editing. Patches welcome.\nfunc NewLiner() *State {\n\tvar s State\n\ts.r = bufio.NewReader(os.Stdin)\n\treturn &s\n}\n\n// Close returns the terminal to its previous mode\nfunc (s *State) Close() error {\n\treturn nil\n}\n\n// TerminalSupported returns false because line editing is not\n// supported on this platform.\nfunc TerminalSupported() bool {\n\treturn false\n}\n\ntype noopMode struct{}\n\nfunc (n noopMode) ApplyMode() error {\n\treturn nil\n}\n\n// TerminalMode returns a noop InputModeSetter on this platform.\nfunc TerminalMode() (ModeApplier, error) {\n\treturn noopMode{}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/input.go",
    "content": "// +build linux darwin openbsd freebsd netbsd\n\npackage liner\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"os\"\n\t\"os/signal\"\n\t\"strconv\"\n\t\"strings\"\n\t\"syscall\"\n\t\"time\"\n)\n\ntype nexter struct {\n\tr   rune\n\terr error\n}\n\n// State represents an open terminal\ntype State struct {\n\tcommonState\n\torigMode    termios\n\tdefaultMode termios\n\tnext        <-chan nexter\n\twinch       chan os.Signal\n\tpending     []rune\n\tuseCHA      bool\n}\n\n// NewLiner initializes a new *State, and sets the terminal into raw mode. To\n// restore the terminal to its previous state, call State.Close().\nfunc NewLiner() *State {\n\tvar s State\n\ts.r = bufio.NewReader(os.Stdin)\n\n\ts.terminalSupported = TerminalSupported()\n\tif m, err := TerminalMode(); err == nil {\n\t\ts.origMode = *m.(*termios)\n\t} else {\n\t\ts.inputRedirected = true\n\t}\n\tif _, err := getMode(syscall.Stdout); err != 0 {\n\t\ts.outputRedirected = true\n\t}\n\tif s.inputRedirected && s.outputRedirected {\n\t\ts.terminalSupported = false\n\t}\n\tif s.terminalSupported && !s.inputRedirected && !s.outputRedirected {\n\t\tmode := s.origMode\n\t\tmode.Iflag &^= icrnl | inpck | istrip | ixon\n\t\tmode.Cflag |= cs8\n\t\tmode.Lflag &^= syscall.ECHO | icanon | iexten\n\t\tmode.ApplyMode()\n\n\t\twinch := make(chan os.Signal, 1)\n\t\tsignal.Notify(winch, syscall.SIGWINCH)\n\t\ts.winch = winch\n\n\t\ts.checkOutput()\n\t}\n\n\tif !s.outputRedirected {\n\t\ts.outputRedirected = !s.getColumns()\n\t}\n\n\treturn &s\n}\n\nvar errTimedOut = errors.New(\"timeout\")\n\nfunc (s *State) startPrompt() {\n\tif s.terminalSupported {\n\t\tif m, err := TerminalMode(); err == nil {\n\t\t\ts.defaultMode = *m.(*termios)\n\t\t\tmode := s.defaultMode\n\t\t\tmode.Lflag &^= isig\n\t\t\tmode.ApplyMode()\n\t\t}\n\t}\n\ts.restartPrompt()\n}\n\nfunc (s *State) inputWaiting() bool {\n\treturn len(s.next) > 0\n}\n\nfunc (s *State) restartPrompt() {\n\tnext := make(chan nexter, 200)\n\tgo func() {\n\t\tfor {\n\t\t\tvar n nexter\n\t\t\tn.r, _, n.err = s.r.ReadRune()\n\t\t\tnext <- n\n\t\t\t// Shut down nexter loop when an end condition has been reached\n\t\t\tif n.err != nil || n.r == '\\n' || n.r == '\\r' || n.r == ctrlC || n.r == ctrlD {\n\t\t\t\tclose(next)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\ts.next = next\n}\n\nfunc (s *State) stopPrompt() {\n\tif s.terminalSupported {\n\t\ts.defaultMode.ApplyMode()\n\t}\n}\n\nfunc (s *State) nextPending(timeout <-chan time.Time) (rune, error) {\n\tselect {\n\tcase thing, ok := <-s.next:\n\t\tif !ok {\n\t\t\treturn 0, ErrInternal\n\t\t}\n\t\tif thing.err != nil {\n\t\t\treturn 0, thing.err\n\t\t}\n\t\ts.pending = append(s.pending, thing.r)\n\t\treturn thing.r, nil\n\tcase <-timeout:\n\t\trv := s.pending[0]\n\t\ts.pending = s.pending[1:]\n\t\treturn rv, errTimedOut\n\t}\n}\n\nfunc (s *State) readNext() (interface{}, error) {\n\tif len(s.pending) > 0 {\n\t\trv := s.pending[0]\n\t\ts.pending = s.pending[1:]\n\t\treturn rv, nil\n\t}\n\tvar r rune\n\tselect {\n\tcase thing, ok := <-s.next:\n\t\tif !ok {\n\t\t\treturn 0, ErrInternal\n\t\t}\n\t\tif thing.err != nil {\n\t\t\treturn nil, thing.err\n\t\t}\n\t\tr = thing.r\n\tcase <-s.winch:\n\t\ts.getColumns()\n\t\treturn winch, nil\n\t}\n\tif r != esc {\n\t\treturn r, nil\n\t}\n\ts.pending = append(s.pending, r)\n\n\t// Wait at most 50 ms for the rest of the escape sequence\n\t// If nothing else arrives, it was an actual press of the esc key\n\ttimeout := time.After(50 * time.Millisecond)\n\tflag, err := s.nextPending(timeout)\n\tif err != nil {\n\t\tif err == errTimedOut {\n\t\t\treturn flag, nil\n\t\t}\n\t\treturn unknown, err\n\t}\n\n\tswitch flag {\n\tcase '[':\n\t\tcode, err := s.nextPending(timeout)\n\t\tif err != nil {\n\t\t\tif err == errTimedOut {\n\t\t\t\treturn code, nil\n\t\t\t}\n\t\t\treturn unknown, err\n\t\t}\n\t\tswitch code {\n\t\tcase 'A':\n\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\treturn up, nil\n\t\tcase 'B':\n\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\treturn down, nil\n\t\tcase 'C':\n\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\treturn right, nil\n\t\tcase 'D':\n\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\treturn left, nil\n\t\tcase 'F':\n\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\treturn end, nil\n\t\tcase 'H':\n\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\treturn home, nil\n\t\tcase 'Z':\n\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\treturn shiftTab, nil\n\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\tnum := []rune{code}\n\t\t\tfor {\n\t\t\t\tcode, err := s.nextPending(timeout)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err == errTimedOut {\n\t\t\t\t\t\treturn code, nil\n\t\t\t\t\t}\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tswitch code {\n\t\t\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\t\t\tnum = append(num, code)\n\t\t\t\tcase ';':\n\t\t\t\t\t// Modifier code to follow\n\t\t\t\t\t// This only supports Ctrl-left and Ctrl-right for now\n\t\t\t\t\tx, _ := strconv.ParseInt(string(num), 10, 32)\n\t\t\t\t\tif x != 1 {\n\t\t\t\t\t\t// Can't be left or right\n\t\t\t\t\t\trv := s.pending[0]\n\t\t\t\t\t\ts.pending = s.pending[1:]\n\t\t\t\t\t\treturn rv, nil\n\t\t\t\t\t}\n\t\t\t\t\tnum = num[:0]\n\t\t\t\t\tfor {\n\t\t\t\t\t\tcode, err = s.nextPending(timeout)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tif err == errTimedOut {\n\t\t\t\t\t\t\t\trv := s.pending[0]\n\t\t\t\t\t\t\t\ts.pending = s.pending[1:]\n\t\t\t\t\t\t\t\treturn rv, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch code {\n\t\t\t\t\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\t\t\t\t\tnum = append(num, code)\n\t\t\t\t\t\tcase 'C', 'D':\n\t\t\t\t\t\t\t// right, left\n\t\t\t\t\t\t\tmod, _ := strconv.ParseInt(string(num), 10, 32)\n\t\t\t\t\t\t\tif mod != 5 {\n\t\t\t\t\t\t\t\t// Not bare Ctrl\n\t\t\t\t\t\t\t\trv := s.pending[0]\n\t\t\t\t\t\t\t\ts.pending = s.pending[1:]\n\t\t\t\t\t\t\t\treturn rv, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\t\t\t\t\tif code == 'C' {\n\t\t\t\t\t\t\t\treturn wordRight, nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn wordLeft, nil\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// Not left or right\n\t\t\t\t\t\t\trv := s.pending[0]\n\t\t\t\t\t\t\ts.pending = s.pending[1:]\n\t\t\t\t\t\t\treturn rv, nil\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tcase '~':\n\t\t\t\t\ts.pending = s.pending[:0] // escape code complete\n\t\t\t\t\tx, _ := strconv.ParseInt(string(num), 10, 32)\n\t\t\t\t\tswitch x {\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\treturn insert, nil\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\treturn del, nil\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\treturn pageUp, nil\n\t\t\t\t\tcase 6:\n\t\t\t\t\t\treturn pageDown, nil\n\t\t\t\t\tcase 7:\n\t\t\t\t\t\treturn home, nil\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\treturn end, nil\n\t\t\t\t\tcase 15:\n\t\t\t\t\t\treturn f5, nil\n\t\t\t\t\tcase 17:\n\t\t\t\t\t\treturn f6, nil\n\t\t\t\t\tcase 18:\n\t\t\t\t\t\treturn f7, nil\n\t\t\t\t\tcase 19:\n\t\t\t\t\t\treturn f8, nil\n\t\t\t\t\tcase 20:\n\t\t\t\t\t\treturn f9, nil\n\t\t\t\t\tcase 21:\n\t\t\t\t\t\treturn f10, nil\n\t\t\t\t\tcase 23:\n\t\t\t\t\t\treturn f11, nil\n\t\t\t\t\tcase 24:\n\t\t\t\t\t\treturn f12, nil\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn unknown, nil\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\t// unrecognized escape code\n\t\t\t\t\trv := s.pending[0]\n\t\t\t\t\ts.pending = s.pending[1:]\n\t\t\t\t\treturn rv, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tcase 'O':\n\t\tcode, err := s.nextPending(timeout)\n\t\tif err != nil {\n\t\t\tif err == errTimedOut {\n\t\t\t\treturn code, nil\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\ts.pending = s.pending[:0] // escape code complete\n\t\tswitch code {\n\t\tcase 'c':\n\t\t\treturn wordRight, nil\n\t\tcase 'd':\n\t\t\treturn wordLeft, nil\n\t\tcase 'H':\n\t\t\treturn home, nil\n\t\tcase 'F':\n\t\t\treturn end, nil\n\t\tcase 'P':\n\t\t\treturn f1, nil\n\t\tcase 'Q':\n\t\t\treturn f2, nil\n\t\tcase 'R':\n\t\t\treturn f3, nil\n\t\tcase 'S':\n\t\t\treturn f4, nil\n\t\tdefault:\n\t\t\treturn unknown, nil\n\t\t}\n\tcase 'b':\n\t\ts.pending = s.pending[:0] // escape code complete\n\t\treturn altB, nil\n\tcase 'f':\n\t\ts.pending = s.pending[:0] // escape code complete\n\t\treturn altF, nil\n\tcase 'y':\n\t\ts.pending = s.pending[:0] // escape code complete\n\t\treturn altY, nil\n\tdefault:\n\t\trv := s.pending[0]\n\t\ts.pending = s.pending[1:]\n\t\treturn rv, nil\n\t}\n\n\t// not reached\n\treturn r, nil\n}\n\n// Close returns the terminal to its previous mode\nfunc (s *State) Close() error {\n\tsignal.Stop(s.winch)\n\tif !s.inputRedirected {\n\t\ts.origMode.ApplyMode()\n\t}\n\treturn nil\n}\n\n// TerminalSupported returns true if the current terminal supports\n// line editing features, and false if liner will use the 'dumb'\n// fallback for input.\n// Note that TerminalSupported does not check all factors that may\n// cause liner to not fully support the terminal (such as stdin redirection)\nfunc TerminalSupported() bool {\n\tbad := map[string]bool{\"\": true, \"dumb\": true, \"cons25\": true}\n\treturn !bad[strings.ToLower(os.Getenv(\"TERM\"))]\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/input_darwin.go",
    "content": "// +build darwin\n\npackage liner\n\nimport \"syscall\"\n\nconst (\n\tgetTermios = syscall.TIOCGETA\n\tsetTermios = syscall.TIOCSETA\n)\n\nconst (\n\t// Input flags\n\tinpck  = 0x010\n\tistrip = 0x020\n\ticrnl  = 0x100\n\tixon   = 0x200\n\n\t// Output flags\n\topost = 0x1\n\n\t// Control flags\n\tcs8 = 0x300\n\n\t// Local flags\n\tisig   = 0x080\n\ticanon = 0x100\n\tiexten = 0x400\n)\n\ntype termios struct {\n\tIflag  uintptr\n\tOflag  uintptr\n\tCflag  uintptr\n\tLflag  uintptr\n\tCc     [20]byte\n\tIspeed uintptr\n\tOspeed uintptr\n}\n\n// Terminal.app needs a column for the cursor when the input line is at the\n// bottom of the window.\nconst cursorColumn = true\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/input_linux.go",
    "content": "// +build linux\n\npackage liner\n\nimport \"syscall\"\n\nconst (\n\tgetTermios = syscall.TCGETS\n\tsetTermios = syscall.TCSETS\n)\n\nconst (\n\ticrnl  = syscall.ICRNL\n\tinpck  = syscall.INPCK\n\tistrip = syscall.ISTRIP\n\tixon   = syscall.IXON\n\topost  = syscall.OPOST\n\tcs8    = syscall.CS8\n\tisig   = syscall.ISIG\n\ticanon = syscall.ICANON\n\tiexten = syscall.IEXTEN\n)\n\ntype termios struct {\n\tsyscall.Termios\n}\n\nconst cursorColumn = false\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/input_windows.go",
    "content": "package liner\n\nimport (\n\t\"bufio\"\n\t\"os\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar (\n\tkernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\n\n\tprocGetStdHandle                  = kernel32.NewProc(\"GetStdHandle\")\n\tprocReadConsoleInput              = kernel32.NewProc(\"ReadConsoleInputW\")\n\tprocGetNumberOfConsoleInputEvents = kernel32.NewProc(\"GetNumberOfConsoleInputEvents\")\n\tprocGetConsoleMode                = kernel32.NewProc(\"GetConsoleMode\")\n\tprocSetConsoleMode                = kernel32.NewProc(\"SetConsoleMode\")\n\tprocSetConsoleCursorPosition      = kernel32.NewProc(\"SetConsoleCursorPosition\")\n\tprocGetConsoleScreenBufferInfo    = kernel32.NewProc(\"GetConsoleScreenBufferInfo\")\n\tprocFillConsoleOutputCharacter    = kernel32.NewProc(\"FillConsoleOutputCharacterW\")\n)\n\n// These names are from the Win32 api, so they use underscores (contrary to\n// what golint suggests)\nconst (\n\tstd_input_handle     = uint32(-10 & 0xFFFFFFFF)\n\tstd_output_handle    = uint32(-11 & 0xFFFFFFFF)\n\tstd_error_handle     = uint32(-12 & 0xFFFFFFFF)\n\tinvalid_handle_value = ^uintptr(0)\n)\n\ntype inputMode uint32\n\n// State represents an open terminal\ntype State struct {\n\tcommonState\n\thandle      syscall.Handle\n\thOut        syscall.Handle\n\torigMode    inputMode\n\tdefaultMode inputMode\n\tkey         interface{}\n\trepeat      uint16\n}\n\nconst (\n\tenableEchoInput      = 0x4\n\tenableInsertMode     = 0x20\n\tenableLineInput      = 0x2\n\tenableMouseInput     = 0x10\n\tenableProcessedInput = 0x1\n\tenableQuickEditMode  = 0x40\n\tenableWindowInput    = 0x8\n)\n\n// NewLiner initializes a new *State, and sets the terminal into raw mode. To\n// restore the terminal to its previous state, call State.Close().\nfunc NewLiner() *State {\n\tvar s State\n\thIn, _, _ := procGetStdHandle.Call(uintptr(std_input_handle))\n\ts.handle = syscall.Handle(hIn)\n\thOut, _, _ := procGetStdHandle.Call(uintptr(std_output_handle))\n\ts.hOut = syscall.Handle(hOut)\n\n\ts.terminalSupported = true\n\tif m, err := TerminalMode(); err == nil {\n\t\ts.origMode = m.(inputMode)\n\t\tmode := s.origMode\n\t\tmode &^= enableEchoInput\n\t\tmode &^= enableInsertMode\n\t\tmode &^= enableLineInput\n\t\tmode &^= enableMouseInput\n\t\tmode |= enableWindowInput\n\t\tmode.ApplyMode()\n\t} else {\n\t\ts.inputRedirected = true\n\t\ts.r = bufio.NewReader(os.Stdin)\n\t}\n\n\ts.getColumns()\n\ts.outputRedirected = s.columns <= 0\n\n\treturn &s\n}\n\n// These names are from the Win32 api, so they use underscores (contrary to\n// what golint suggests)\nconst (\n\tfocus_event              = 0x0010\n\tkey_event                = 0x0001\n\tmenu_event               = 0x0008\n\tmouse_event              = 0x0002\n\twindow_buffer_size_event = 0x0004\n)\n\ntype input_record struct {\n\teventType uint16\n\tpad       uint16\n\tblob      [16]byte\n}\n\ntype key_event_record struct {\n\tKeyDown         int32\n\tRepeatCount     uint16\n\tVirtualKeyCode  uint16\n\tVirtualScanCode uint16\n\tChar            int16\n\tControlKeyState uint32\n}\n\n// These names are from the Win32 api, so they use underscores (contrary to\n// what golint suggests)\nconst (\n\tvk_tab    = 0x09\n\tvk_prior  = 0x21\n\tvk_next   = 0x22\n\tvk_end    = 0x23\n\tvk_home   = 0x24\n\tvk_left   = 0x25\n\tvk_up     = 0x26\n\tvk_right  = 0x27\n\tvk_down   = 0x28\n\tvk_insert = 0x2d\n\tvk_delete = 0x2e\n\tvk_f1     = 0x70\n\tvk_f2     = 0x71\n\tvk_f3     = 0x72\n\tvk_f4     = 0x73\n\tvk_f5     = 0x74\n\tvk_f6     = 0x75\n\tvk_f7     = 0x76\n\tvk_f8     = 0x77\n\tvk_f9     = 0x78\n\tvk_f10    = 0x79\n\tvk_f11    = 0x7a\n\tvk_f12    = 0x7b\n\tbKey      = 0x42\n\tfKey      = 0x46\n\tyKey      = 0x59\n)\n\nconst (\n\tshiftPressed     = 0x0010\n\tleftAltPressed   = 0x0002\n\tleftCtrlPressed  = 0x0008\n\trightAltPressed  = 0x0001\n\trightCtrlPressed = 0x0004\n\n\tmodKeys = shiftPressed | leftAltPressed | rightAltPressed | leftCtrlPressed | rightCtrlPressed\n)\n\n// inputWaiting only returns true if the next call to readNext will return immediately.\nfunc (s *State) inputWaiting() bool {\n\tvar num uint32\n\tok, _, _ := procGetNumberOfConsoleInputEvents.Call(uintptr(s.handle), uintptr(unsafe.Pointer(&num)))\n\tif ok == 0 {\n\t\t// call failed, so we cannot guarantee a non-blocking readNext\n\t\treturn false\n\t}\n\n\t// during a \"paste\" input events are always an odd number, and\n\t// the last one results in a blocking readNext, so return false\n\t// when num is 1 or 0.\n\treturn num > 1\n}\n\nfunc (s *State) readNext() (interface{}, error) {\n\tif s.repeat > 0 {\n\t\ts.repeat--\n\t\treturn s.key, nil\n\t}\n\n\tvar input input_record\n\tpbuf := uintptr(unsafe.Pointer(&input))\n\tvar rv uint32\n\tprv := uintptr(unsafe.Pointer(&rv))\n\n\tfor {\n\t\tok, _, err := procReadConsoleInput.Call(uintptr(s.handle), pbuf, 1, prv)\n\n\t\tif ok == 0 {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif input.eventType == window_buffer_size_event {\n\t\t\txy := (*coord)(unsafe.Pointer(&input.blob[0]))\n\t\t\ts.columns = int(xy.x)\n\t\t\tif s.columns > 1 {\n\t\t\t\ts.columns--\n\t\t\t}\n\t\t\treturn winch, nil\n\t\t}\n\t\tif input.eventType != key_event {\n\t\t\tcontinue\n\t\t}\n\t\tke := (*key_event_record)(unsafe.Pointer(&input.blob[0]))\n\t\tif ke.KeyDown == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif ke.VirtualKeyCode == vk_tab && ke.ControlKeyState&modKeys == shiftPressed {\n\t\t\ts.key = shiftTab\n\t\t} else if ke.VirtualKeyCode == bKey && (ke.ControlKeyState&modKeys == leftAltPressed ||\n\t\t\tke.ControlKeyState&modKeys == rightAltPressed) {\n\t\t\ts.key = altB\n\t\t} else if ke.VirtualKeyCode == fKey && (ke.ControlKeyState&modKeys == leftAltPressed ||\n\t\t\tke.ControlKeyState&modKeys == rightAltPressed) {\n\t\t\ts.key = altF\n\t\t} else if ke.VirtualKeyCode == yKey && (ke.ControlKeyState&modKeys == leftAltPressed ||\n\t\t\tke.ControlKeyState&modKeys == rightAltPressed) {\n\t\t\ts.key = altY\n\t\t} else if ke.Char > 0 {\n\t\t\ts.key = rune(ke.Char)\n\t\t} else {\n\t\t\tswitch ke.VirtualKeyCode {\n\t\t\tcase vk_prior:\n\t\t\t\ts.key = pageUp\n\t\t\tcase vk_next:\n\t\t\t\ts.key = pageDown\n\t\t\tcase vk_end:\n\t\t\t\ts.key = end\n\t\t\tcase vk_home:\n\t\t\t\ts.key = home\n\t\t\tcase vk_left:\n\t\t\t\ts.key = left\n\t\t\t\tif ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) != 0 {\n\t\t\t\t\tif ke.ControlKeyState&modKeys == ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) {\n\t\t\t\t\t\ts.key = wordLeft\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase vk_right:\n\t\t\t\ts.key = right\n\t\t\t\tif ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) != 0 {\n\t\t\t\t\tif ke.ControlKeyState&modKeys == ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) {\n\t\t\t\t\t\ts.key = wordRight\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase vk_up:\n\t\t\t\ts.key = up\n\t\t\tcase vk_down:\n\t\t\t\ts.key = down\n\t\t\tcase vk_insert:\n\t\t\t\ts.key = insert\n\t\t\tcase vk_delete:\n\t\t\t\ts.key = del\n\t\t\tcase vk_f1:\n\t\t\t\ts.key = f1\n\t\t\tcase vk_f2:\n\t\t\t\ts.key = f2\n\t\t\tcase vk_f3:\n\t\t\t\ts.key = f3\n\t\t\tcase vk_f4:\n\t\t\t\ts.key = f4\n\t\t\tcase vk_f5:\n\t\t\t\ts.key = f5\n\t\t\tcase vk_f6:\n\t\t\t\ts.key = f6\n\t\t\tcase vk_f7:\n\t\t\t\ts.key = f7\n\t\t\tcase vk_f8:\n\t\t\t\ts.key = f8\n\t\t\tcase vk_f9:\n\t\t\t\ts.key = f9\n\t\t\tcase vk_f10:\n\t\t\t\ts.key = f10\n\t\t\tcase vk_f11:\n\t\t\t\ts.key = f11\n\t\t\tcase vk_f12:\n\t\t\t\ts.key = f12\n\t\t\tdefault:\n\t\t\t\t// Eat modifier keys\n\t\t\t\t// TODO: return Action(Unknown) if the key isn't a\n\t\t\t\t// modifier.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tif ke.RepeatCount > 1 {\n\t\t\ts.repeat = ke.RepeatCount - 1\n\t\t}\n\t\treturn s.key, nil\n\t}\n}\n\n// Close returns the terminal to its previous mode\nfunc (s *State) Close() error {\n\ts.origMode.ApplyMode()\n\treturn nil\n}\n\nfunc (s *State) startPrompt() {\n\tif m, err := TerminalMode(); err == nil {\n\t\ts.defaultMode = m.(inputMode)\n\t\tmode := s.defaultMode\n\t\tmode &^= enableProcessedInput\n\t\tmode.ApplyMode()\n\t}\n}\n\nfunc (s *State) restartPrompt() {\n}\n\nfunc (s *State) stopPrompt() {\n\ts.defaultMode.ApplyMode()\n}\n\n// TerminalSupported returns true because line editing is always\n// supported on Windows.\nfunc TerminalSupported() bool {\n\treturn true\n}\n\nfunc (mode inputMode) ApplyMode() error {\n\thIn, _, err := procGetStdHandle.Call(uintptr(std_input_handle))\n\tif hIn == invalid_handle_value || hIn == 0 {\n\t\treturn err\n\t}\n\tok, _, err := procSetConsoleMode.Call(hIn, uintptr(mode))\n\tif ok != 0 {\n\t\terr = nil\n\t}\n\treturn err\n}\n\n// TerminalMode returns the current terminal input mode as an InputModeSetter.\n//\n// This function is provided for convenience, and should\n// not be necessary for most users of liner.\nfunc TerminalMode() (ModeApplier, error) {\n\tvar mode inputMode\n\thIn, _, err := procGetStdHandle.Call(uintptr(std_input_handle))\n\tif hIn == invalid_handle_value || hIn == 0 {\n\t\treturn nil, err\n\t}\n\tok, _, err := procGetConsoleMode.Call(hIn, uintptr(unsafe.Pointer(&mode)))\n\tif ok != 0 {\n\t\terr = nil\n\t}\n\treturn mode, err\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/line.go",
    "content": "// +build windows linux darwin openbsd freebsd netbsd\n\npackage liner\n\nimport (\n\t\"bufio\"\n\t\"container/ring\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n)\n\ntype action int\n\nconst (\n\tleft action = iota\n\tright\n\tup\n\tdown\n\thome\n\tend\n\tinsert\n\tdel\n\tpageUp\n\tpageDown\n\tf1\n\tf2\n\tf3\n\tf4\n\tf5\n\tf6\n\tf7\n\tf8\n\tf9\n\tf10\n\tf11\n\tf12\n\taltB\n\taltF\n\taltY\n\tshiftTab\n\twordLeft\n\twordRight\n\twinch\n\tunknown\n)\n\nconst (\n\tctrlA = 1\n\tctrlB = 2\n\tctrlC = 3\n\tctrlD = 4\n\tctrlE = 5\n\tctrlF = 6\n\tctrlG = 7\n\tctrlH = 8\n\ttab   = 9\n\tlf    = 10\n\tctrlK = 11\n\tctrlL = 12\n\tcr    = 13\n\tctrlN = 14\n\tctrlO = 15\n\tctrlP = 16\n\tctrlQ = 17\n\tctrlR = 18\n\tctrlS = 19\n\tctrlT = 20\n\tctrlU = 21\n\tctrlV = 22\n\tctrlW = 23\n\tctrlX = 24\n\tctrlY = 25\n\tctrlZ = 26\n\tesc   = 27\n\tbs    = 127\n)\n\nconst (\n\tbeep = \"\\a\"\n)\n\ntype tabDirection int\n\nconst (\n\ttabForward tabDirection = iota\n\ttabReverse\n)\n\nfunc (s *State) refresh(prompt []rune, buf []rune, pos int) error {\n\tif s.columns == 0 {\n\t\treturn ErrInternal\n\t}\n\n\ts.needRefresh = false\n\tif s.multiLineMode {\n\t\treturn s.refreshMultiLine(prompt, buf, pos)\n\t}\n\treturn s.refreshSingleLine(prompt, buf, pos)\n}\n\nfunc (s *State) refreshSingleLine(prompt []rune, buf []rune, pos int) error {\n\ts.cursorPos(0)\n\t_, err := fmt.Print(string(prompt))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tpLen := countGlyphs(prompt)\n\tbLen := countGlyphs(buf)\n\tpos = countGlyphs(buf[:pos])\n\tif pLen+bLen < s.columns {\n\t\t_, err = fmt.Print(string(buf))\n\t\ts.eraseLine()\n\t\ts.cursorPos(pLen + pos)\n\t} else {\n\t\t// Find space available\n\t\tspace := s.columns - pLen\n\t\tspace-- // space for cursor\n\t\tstart := pos - space/2\n\t\tend := start + space\n\t\tif end > bLen {\n\t\t\tend = bLen\n\t\t\tstart = end - space\n\t\t}\n\t\tif start < 0 {\n\t\t\tstart = 0\n\t\t\tend = space\n\t\t}\n\t\tpos -= start\n\n\t\t// Leave space for markers\n\t\tif start > 0 {\n\t\t\tstart++\n\t\t}\n\t\tif end < bLen {\n\t\t\tend--\n\t\t}\n\t\tstartRune := len(getPrefixGlyphs(buf, start))\n\t\tline := getPrefixGlyphs(buf[startRune:], end-start)\n\n\t\t// Output\n\t\tif start > 0 {\n\t\t\tfmt.Print(\"{\")\n\t\t}\n\t\tfmt.Print(string(line))\n\t\tif end < bLen {\n\t\t\tfmt.Print(\"}\")\n\t\t}\n\n\t\t// Set cursor position\n\t\ts.eraseLine()\n\t\ts.cursorPos(pLen + pos)\n\t}\n\treturn err\n}\n\nfunc (s *State) refreshMultiLine(prompt []rune, buf []rune, pos int) error {\n\tpromptColumns := countMultiLineGlyphs(prompt, s.columns, 0)\n\ttotalColumns := countMultiLineGlyphs(buf, s.columns, promptColumns)\n\ttotalRows := (totalColumns + s.columns - 1) / s.columns\n\tmaxRows := s.maxRows\n\tif totalRows > s.maxRows {\n\t\ts.maxRows = totalRows\n\t}\n\tcursorRows := s.cursorRows\n\tif cursorRows == 0 {\n\t\tcursorRows = 1\n\t}\n\n\t/* First step: clear all the lines used before. To do so start by\n\t* going to the last row. */\n\tif maxRows-cursorRows > 0 {\n\t\ts.moveDown(maxRows - cursorRows)\n\t}\n\n\t/* Now for every row clear it, go up. */\n\tfor i := 0; i < maxRows-1; i++ {\n\t\ts.cursorPos(0)\n\t\ts.eraseLine()\n\t\ts.moveUp(1)\n\t}\n\n\t/* Clean the top line. */\n\ts.cursorPos(0)\n\ts.eraseLine()\n\n\t/* Write the prompt and the current buffer content */\n\tif _, err := fmt.Print(string(prompt)); err != nil {\n\t\treturn err\n\t}\n\tif _, err := fmt.Print(string(buf)); err != nil {\n\t\treturn err\n\t}\n\n\t/* If we are at the very end of the screen with our prompt, we need to\n\t * emit a newline and move the prompt to the first column. */\n\tcursorColumns := countMultiLineGlyphs(buf[:pos], s.columns, promptColumns)\n\tif cursorColumns == totalColumns && totalColumns%s.columns == 0 {\n\t\ts.emitNewLine()\n\t\ts.cursorPos(0)\n\t\ttotalRows++\n\t\tif totalRows > s.maxRows {\n\t\t\ts.maxRows = totalRows\n\t\t}\n\t}\n\n\t/* Move cursor to right position. */\n\tcursorRows = (cursorColumns + s.columns) / s.columns\n\tif s.cursorRows > 0 && totalRows-cursorRows > 0 {\n\t\ts.moveUp(totalRows - cursorRows)\n\t}\n\t/* Set column. */\n\ts.cursorPos(cursorColumns % s.columns)\n\n\ts.cursorRows = cursorRows\n\treturn nil\n}\n\nfunc (s *State) resetMultiLine(prompt []rune, buf []rune, pos int) {\n\tcolumns := countMultiLineGlyphs(prompt, s.columns, 0)\n\tcolumns = countMultiLineGlyphs(buf[:pos], s.columns, columns)\n\tcolumns += 2 // ^C\n\tcursorRows := (columns + s.columns) / s.columns\n\tif s.maxRows-cursorRows > 0 {\n\t\tfor i := 0; i < s.maxRows-cursorRows; i++ {\n\t\t\tfmt.Println() // always moves the cursor down or scrolls the window up as needed\n\t\t}\n\t}\n\ts.maxRows = 1\n\ts.cursorRows = 0\n}\n\nfunc longestCommonPrefix(strs []string) string {\n\tif len(strs) == 0 {\n\t\treturn \"\"\n\t}\n\tlongest := strs[0]\n\n\tfor _, str := range strs[1:] {\n\t\tfor !strings.HasPrefix(str, longest) {\n\t\t\tlongest = longest[:len(longest)-1]\n\t\t}\n\t}\n\t// Remove trailing partial runes\n\tlongest = strings.TrimRight(longest, \"\\uFFFD\")\n\treturn longest\n}\n\nfunc (s *State) circularTabs(items []string) func(tabDirection) (string, error) {\n\titem := -1\n\treturn func(direction tabDirection) (string, error) {\n\t\tif direction == tabForward {\n\t\t\tif item < len(items)-1 {\n\t\t\t\titem++\n\t\t\t} else {\n\t\t\t\titem = 0\n\t\t\t}\n\t\t} else if direction == tabReverse {\n\t\t\tif item > 0 {\n\t\t\t\titem--\n\t\t\t} else {\n\t\t\t\titem = len(items) - 1\n\t\t\t}\n\t\t}\n\t\treturn items[item], nil\n\t}\n}\n\nfunc calculateColumns(screenWidth int, items []string) (numColumns, numRows, maxWidth int) {\n\tfor _, item := range items {\n\t\tif len(item) >= screenWidth {\n\t\t\treturn 1, len(items), screenWidth - 1\n\t\t}\n\t\tif len(item) >= maxWidth {\n\t\t\tmaxWidth = len(item) + 1\n\t\t}\n\t}\n\n\tnumColumns = screenWidth / maxWidth\n\tnumRows = len(items) / numColumns\n\tif len(items)%numColumns > 0 {\n\t\tnumRows++\n\t}\n\n\tif len(items) <= numColumns {\n\t\tmaxWidth = 0\n\t}\n\n\treturn\n}\n\nfunc (s *State) printedTabs(items []string) func(tabDirection) (string, error) {\n\tnumTabs := 1\n\tprefix := longestCommonPrefix(items)\n\treturn func(direction tabDirection) (string, error) {\n\t\tif len(items) == 1 {\n\t\t\treturn items[0], nil\n\t\t}\n\n\t\tif numTabs == 2 {\n\t\t\tif len(items) > 100 {\n\t\t\t\tfmt.Printf(\"\\nDisplay all %d possibilities? (y or n) \", len(items))\n\t\t\tprompt:\n\t\t\t\tfor {\n\t\t\t\t\tnext, err := s.readNext()\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn prefix, err\n\t\t\t\t\t}\n\n\t\t\t\t\tif key, ok := next.(rune); ok {\n\t\t\t\t\t\tswitch key {\n\t\t\t\t\t\tcase 'n', 'N':\n\t\t\t\t\t\t\treturn prefix, nil\n\t\t\t\t\t\tcase 'y', 'Y':\n\t\t\t\t\t\t\tbreak prompt\n\t\t\t\t\t\tcase ctrlC, ctrlD, cr, lf:\n\t\t\t\t\t\t\ts.restartPrompt()\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\tfmt.Println(\"\")\n\n\t\t\tnumColumns, numRows, maxWidth := calculateColumns(s.columns, items)\n\n\t\t\tfor i := 0; i < numRows; i++ {\n\t\t\t\tfor j := 0; j < numColumns*numRows; j += numRows {\n\t\t\t\t\tif i+j < len(items) {\n\t\t\t\t\t\tif maxWidth > 0 {\n\t\t\t\t\t\t\tfmt.Printf(\"%-*.[1]*s\", maxWidth, items[i+j])\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfmt.Printf(\"%v \", items[i+j])\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfmt.Println(\"\")\n\t\t\t}\n\t\t} else {\n\t\t\tnumTabs++\n\t\t}\n\t\treturn prefix, nil\n\t}\n}\n\nfunc (s *State) tabComplete(p []rune, line []rune, pos int) ([]rune, int, interface{}, error) {\n\tif s.completer == nil {\n\t\treturn line, pos, rune(esc), nil\n\t}\n\thead, list, tail := s.completer(string(line), pos)\n\tif len(list) <= 0 {\n\t\treturn line, pos, rune(esc), nil\n\t}\n\thl := utf8.RuneCountInString(head)\n\tif len(list) == 1 {\n\t\terr := s.refresh(p, []rune(head+list[0]+tail), hl+utf8.RuneCountInString(list[0]))\n\t\treturn []rune(head + list[0] + tail), hl + utf8.RuneCountInString(list[0]), rune(esc), err\n\t}\n\n\tdirection := tabForward\n\ttabPrinter := s.circularTabs(list)\n\tif s.tabStyle == TabPrints {\n\t\ttabPrinter = s.printedTabs(list)\n\t}\n\n\tfor {\n\t\tpick, err := tabPrinter(direction)\n\t\tif err != nil {\n\t\t\treturn line, pos, rune(esc), err\n\t\t}\n\t\terr = s.refresh(p, []rune(head+pick+tail), hl+utf8.RuneCountInString(pick))\n\t\tif err != nil {\n\t\t\treturn line, pos, rune(esc), err\n\t\t}\n\n\t\tnext, err := s.readNext()\n\t\tif err != nil {\n\t\t\treturn line, pos, rune(esc), err\n\t\t}\n\t\tif key, ok := next.(rune); ok {\n\t\t\tif key == tab {\n\t\t\t\tdirection = tabForward\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif key == esc {\n\t\t\t\treturn line, pos, rune(esc), nil\n\t\t\t}\n\t\t}\n\t\tif a, ok := next.(action); ok && a == shiftTab {\n\t\t\tdirection = tabReverse\n\t\t\tcontinue\n\t\t}\n\t\treturn []rune(head + pick + tail), hl + utf8.RuneCountInString(pick), next, nil\n\t}\n}\n\n// reverse intelligent search, implements a bash-like history search.\nfunc (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, interface{}, error) {\n\tp := \"(reverse-i-search)`': \"\n\terr := s.refresh([]rune(p), origLine, origPos)\n\tif err != nil {\n\t\treturn origLine, origPos, rune(esc), err\n\t}\n\n\tline := []rune{}\n\tpos := 0\n\tfoundLine := string(origLine)\n\tfoundPos := origPos\n\n\tgetLine := func() ([]rune, []rune, int) {\n\t\tsearch := string(line)\n\t\tprompt := \"(reverse-i-search)`%s': \"\n\t\treturn []rune(fmt.Sprintf(prompt, search)), []rune(foundLine), foundPos\n\t}\n\n\thistory, positions := s.getHistoryByPattern(string(line))\n\thistoryPos := len(history) - 1\n\n\tfor {\n\t\tnext, err := s.readNext()\n\t\tif err != nil {\n\t\t\treturn []rune(foundLine), foundPos, rune(esc), err\n\t\t}\n\n\t\tswitch v := next.(type) {\n\t\tcase rune:\n\t\t\tswitch v {\n\t\t\tcase ctrlR: // Search backwards\n\t\t\t\tif historyPos > 0 && historyPos < len(history) {\n\t\t\t\t\thistoryPos--\n\t\t\t\t\tfoundLine = history[historyPos]\n\t\t\t\t\tfoundPos = positions[historyPos]\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase ctrlS: // Search forward\n\t\t\t\tif historyPos < len(history)-1 && historyPos >= 0 {\n\t\t\t\t\thistoryPos++\n\t\t\t\t\tfoundLine = history[historyPos]\n\t\t\t\t\tfoundPos = positions[historyPos]\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase ctrlH, bs: // Backspace\n\t\t\t\tif pos <= 0 {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t} else {\n\t\t\t\t\tn := len(getSuffixGlyphs(line[:pos], 1))\n\t\t\t\t\tline = append(line[:pos-n], line[pos:]...)\n\t\t\t\t\tpos -= n\n\n\t\t\t\t\t// For each char deleted, display the last matching line of history\n\t\t\t\t\thistory, positions := s.getHistoryByPattern(string(line))\n\t\t\t\t\thistoryPos = len(history) - 1\n\t\t\t\t\tif len(history) > 0 {\n\t\t\t\t\t\tfoundLine = history[historyPos]\n\t\t\t\t\t\tfoundPos = positions[historyPos]\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfoundLine = \"\"\n\t\t\t\t\t\tfoundPos = 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase ctrlG: // Cancel\n\t\t\t\treturn origLine, origPos, rune(esc), err\n\n\t\t\tcase tab, cr, lf, ctrlA, ctrlB, ctrlD, ctrlE, ctrlF, ctrlK,\n\t\t\t\tctrlL, ctrlN, ctrlO, ctrlP, ctrlQ, ctrlT, ctrlU, ctrlV, ctrlW, ctrlX, ctrlY, ctrlZ:\n\t\t\t\tfallthrough\n\t\t\tcase 0, ctrlC, esc, 28, 29, 30, 31:\n\t\t\t\treturn []rune(foundLine), foundPos, next, err\n\t\t\tdefault:\n\t\t\t\tline = append(line[:pos], append([]rune{v}, line[pos:]...)...)\n\t\t\t\tpos++\n\n\t\t\t\t// For each keystroke typed, display the last matching line of history\n\t\t\t\thistory, positions = s.getHistoryByPattern(string(line))\n\t\t\t\thistoryPos = len(history) - 1\n\t\t\t\tif len(history) > 0 {\n\t\t\t\t\tfoundLine = history[historyPos]\n\t\t\t\t\tfoundPos = positions[historyPos]\n\t\t\t\t} else {\n\t\t\t\t\tfoundLine = \"\"\n\t\t\t\t\tfoundPos = 0\n\t\t\t\t}\n\t\t\t}\n\t\tcase action:\n\t\t\treturn []rune(foundLine), foundPos, next, err\n\t\t}\n\t\terr = s.refresh(getLine())\n\t\tif err != nil {\n\t\t\treturn []rune(foundLine), foundPos, rune(esc), err\n\t\t}\n\t}\n}\n\n// addToKillRing adds some text to the kill ring. If mode is 0 it adds it to a\n// new node in the end of the kill ring, and move the current pointer to the new\n// node. If mode is 1 or 2 it appends or prepends the text to the current entry\n// of the killRing.\nfunc (s *State) addToKillRing(text []rune, mode int) {\n\t// Don't use the same underlying array as text\n\tkillLine := make([]rune, len(text))\n\tcopy(killLine, text)\n\n\t// Point killRing to a newNode, procedure depends on the killring state and\n\t// append mode.\n\tif mode == 0 { // Add new node to killRing\n\t\tif s.killRing == nil { // if killring is empty, create a new one\n\t\t\ts.killRing = ring.New(1)\n\t\t} else if s.killRing.Len() >= KillRingMax { // if killring is \"full\"\n\t\t\ts.killRing = s.killRing.Next()\n\t\t} else { // Normal case\n\t\t\ts.killRing.Link(ring.New(1))\n\t\t\ts.killRing = s.killRing.Next()\n\t\t}\n\t} else {\n\t\tif s.killRing == nil { // if killring is empty, create a new one\n\t\t\ts.killRing = ring.New(1)\n\t\t\ts.killRing.Value = []rune{}\n\t\t}\n\t\tif mode == 1 { // Append to last entry\n\t\t\tkillLine = append(s.killRing.Value.([]rune), killLine...)\n\t\t} else if mode == 2 { // Prepend to last entry\n\t\t\tkillLine = append(killLine, s.killRing.Value.([]rune)...)\n\t\t}\n\t}\n\n\t// Save text in the current killring node\n\ts.killRing.Value = killLine\n}\n\nfunc (s *State) yank(p []rune, text []rune, pos int) ([]rune, int, interface{}, error) {\n\tif s.killRing == nil {\n\t\treturn text, pos, rune(esc), nil\n\t}\n\n\tlineStart := text[:pos]\n\tlineEnd := text[pos:]\n\tvar line []rune\n\n\tfor {\n\t\tvalue := s.killRing.Value.([]rune)\n\t\tline = make([]rune, 0)\n\t\tline = append(line, lineStart...)\n\t\tline = append(line, value...)\n\t\tline = append(line, lineEnd...)\n\n\t\tpos = len(lineStart) + len(value)\n\t\terr := s.refresh(p, line, pos)\n\t\tif err != nil {\n\t\t\treturn line, pos, 0, err\n\t\t}\n\n\t\tnext, err := s.readNext()\n\t\tif err != nil {\n\t\t\treturn line, pos, next, err\n\t\t}\n\n\t\tswitch v := next.(type) {\n\t\tcase rune:\n\t\t\treturn line, pos, next, nil\n\t\tcase action:\n\t\t\tswitch v {\n\t\t\tcase altY:\n\t\t\t\ts.killRing = s.killRing.Prev()\n\t\t\tdefault:\n\t\t\t\treturn line, pos, next, nil\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Prompt displays p and returns a line of user input, not including a trailing\n// newline character. An io.EOF error is returned if the user signals end-of-file\n// by pressing Ctrl-D. Prompt allows line editing if the terminal supports it.\nfunc (s *State) Prompt(prompt string) (string, error) {\n\treturn s.PromptWithSuggestion(prompt, \"\", 0)\n}\n\n// PromptWithSuggestion displays prompt and an editable text with cursor at\n// given position. The cursor will be set to the end of the line if given position\n// is negative or greater than length of text. Returns a line of user input, not\n// including a trailing newline character. An io.EOF error is returned if the user\n// signals end-of-file by pressing Ctrl-D.\nfunc (s *State) PromptWithSuggestion(prompt string, text string, pos int) (string, error) {\n\tfor _, r := range prompt {\n\t\tif unicode.Is(unicode.C, r) {\n\t\t\treturn \"\", ErrInvalidPrompt\n\t\t}\n\t}\n\tif s.inputRedirected || !s.terminalSupported {\n\t\treturn s.promptUnsupported(prompt)\n\t}\n\tp := []rune(prompt)\n\tconst minWorkingSpace = 10\n\tif s.columns < countGlyphs(p)+minWorkingSpace {\n\t\treturn s.tooNarrow(prompt)\n\t}\n\tif s.outputRedirected {\n\t\treturn \"\", ErrNotTerminalOutput\n\t}\n\n\ts.historyMutex.RLock()\n\tdefer s.historyMutex.RUnlock()\n\n\tfmt.Print(prompt)\n\tvar line = []rune(text)\n\thistoryEnd := \"\"\n\tvar historyPrefix []string\n\thistoryPos := 0\n\thistoryStale := true\n\thistoryAction := false // used to mark history related actions\n\tkillAction := 0        // used to mark kill related actions\n\n\tdefer s.stopPrompt()\n\n\tif pos < 0 || len(text) < pos {\n\t\tpos = len(text)\n\t}\n\tif len(line) > 0 {\n\t\terr := s.refresh(p, line, pos)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t}\n\nrestart:\n\ts.startPrompt()\n\ts.getColumns()\n\nmainLoop:\n\tfor {\n\t\tnext, err := s.readNext()\n\thaveNext:\n\t\tif err != nil {\n\t\t\tif s.shouldRestart != nil && s.shouldRestart(err) {\n\t\t\t\tgoto restart\n\t\t\t}\n\t\t\treturn \"\", err\n\t\t}\n\n\t\thistoryAction = false\n\t\tswitch v := next.(type) {\n\t\tcase rune:\n\t\t\tswitch v {\n\t\t\tcase cr, lf:\n\t\t\t\tif s.needRefresh {\n\t\t\t\t\terr := s.refresh(p, line, pos)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn \"\", err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif s.multiLineMode {\n\t\t\t\t\ts.resetMultiLine(p, line, pos)\n\t\t\t\t}\n\t\t\t\tfmt.Println()\n\t\t\t\tbreak mainLoop\n\t\t\tcase ctrlA: // Start of line\n\t\t\t\tpos = 0\n\t\t\t\ts.needRefresh = true\n\t\t\tcase ctrlE: // End of line\n\t\t\t\tpos = len(line)\n\t\t\t\ts.needRefresh = true\n\t\t\tcase ctrlB: // left\n\t\t\t\tif pos > 0 {\n\t\t\t\t\tpos -= len(getSuffixGlyphs(line[:pos], 1))\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase ctrlF: // right\n\t\t\t\tif pos < len(line) {\n\t\t\t\t\tpos += len(getPrefixGlyphs(line[pos:], 1))\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase ctrlD: // del\n\t\t\t\tif pos == 0 && len(line) == 0 {\n\t\t\t\t\t// exit\n\t\t\t\t\treturn \"\", io.EOF\n\t\t\t\t}\n\n\t\t\t\t// ctrlD is a potential EOF, so the rune reader shuts down.\n\t\t\t\t// Therefore, if it isn't actually an EOF, we must re-startPrompt.\n\t\t\t\ts.restartPrompt()\n\n\t\t\t\tif pos >= len(line) {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t} else {\n\t\t\t\t\tn := len(getPrefixGlyphs(line[pos:], 1))\n\t\t\t\t\tline = append(line[:pos], line[pos+n:]...)\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t}\n\t\t\tcase ctrlK: // delete remainder of line\n\t\t\t\tif pos >= len(line) {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t} else {\n\t\t\t\t\tif killAction > 0 {\n\t\t\t\t\t\ts.addToKillRing(line[pos:], 1) // Add in apend mode\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts.addToKillRing(line[pos:], 0) // Add in normal mode\n\t\t\t\t\t}\n\n\t\t\t\t\tkillAction = 2 // Mark that there was a kill action\n\t\t\t\t\tline = line[:pos]\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t}\n\t\t\tcase ctrlP: // up\n\t\t\t\thistoryAction = true\n\t\t\t\tif historyStale {\n\t\t\t\t\thistoryPrefix = s.getHistoryByPrefix(string(line))\n\t\t\t\t\thistoryPos = len(historyPrefix)\n\t\t\t\t\thistoryStale = false\n\t\t\t\t}\n\t\t\t\tif historyPos > 0 {\n\t\t\t\t\tif historyPos == len(historyPrefix) {\n\t\t\t\t\t\thistoryEnd = string(line)\n\t\t\t\t\t}\n\t\t\t\t\thistoryPos--\n\t\t\t\t\tline = []rune(historyPrefix[historyPos])\n\t\t\t\t\tpos = len(line)\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase ctrlN: // down\n\t\t\t\thistoryAction = true\n\t\t\t\tif historyStale {\n\t\t\t\t\thistoryPrefix = s.getHistoryByPrefix(string(line))\n\t\t\t\t\thistoryPos = len(historyPrefix)\n\t\t\t\t\thistoryStale = false\n\t\t\t\t}\n\t\t\t\tif historyPos < len(historyPrefix) {\n\t\t\t\t\thistoryPos++\n\t\t\t\t\tif historyPos == len(historyPrefix) {\n\t\t\t\t\t\tline = []rune(historyEnd)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tline = []rune(historyPrefix[historyPos])\n\t\t\t\t\t}\n\t\t\t\t\tpos = len(line)\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase ctrlT: // transpose prev glyph with glyph under cursor\n\t\t\t\tif len(line) < 2 || pos < 1 {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t} else {\n\t\t\t\t\tif pos == len(line) {\n\t\t\t\t\t\tpos -= len(getSuffixGlyphs(line, 1))\n\t\t\t\t\t}\n\t\t\t\t\tprev := getSuffixGlyphs(line[:pos], 1)\n\t\t\t\t\tnext := getPrefixGlyphs(line[pos:], 1)\n\t\t\t\t\tscratch := make([]rune, len(prev))\n\t\t\t\t\tcopy(scratch, prev)\n\t\t\t\t\tcopy(line[pos-len(prev):], next)\n\t\t\t\t\tcopy(line[pos-len(prev)+len(next):], scratch)\n\t\t\t\t\tpos += len(next)\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t}\n\t\t\tcase ctrlL: // clear screen\n\t\t\t\ts.eraseScreen()\n\t\t\t\ts.needRefresh = true\n\t\t\tcase ctrlC: // reset\n\t\t\t\tfmt.Println(\"^C\")\n\t\t\t\tif s.multiLineMode {\n\t\t\t\t\ts.resetMultiLine(p, line, pos)\n\t\t\t\t}\n\t\t\t\tif s.ctrlCAborts {\n\t\t\t\t\treturn \"\", ErrPromptAborted\n\t\t\t\t}\n\t\t\t\tline = line[:0]\n\t\t\t\tpos = 0\n\t\t\t\tfmt.Print(prompt)\n\t\t\t\ts.restartPrompt()\n\t\t\tcase ctrlH, bs: // Backspace\n\t\t\t\tif pos <= 0 {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t} else {\n\t\t\t\t\tn := len(getSuffixGlyphs(line[:pos], 1))\n\t\t\t\t\tline = append(line[:pos-n], line[pos:]...)\n\t\t\t\t\tpos -= n\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t}\n\t\t\tcase ctrlU: // Erase line before cursor\n\t\t\t\tif killAction > 0 {\n\t\t\t\t\ts.addToKillRing(line[:pos], 2) // Add in prepend mode\n\t\t\t\t} else {\n\t\t\t\t\ts.addToKillRing(line[:pos], 0) // Add in normal mode\n\t\t\t\t}\n\n\t\t\t\tkillAction = 2 // Mark that there was some killing\n\t\t\t\tline = line[pos:]\n\t\t\t\tpos = 0\n\t\t\t\ts.needRefresh = true\n\t\t\tcase ctrlW: // Erase word\n\t\t\t\tif pos == 0 {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t// Remove whitespace to the left\n\t\t\t\tvar buf []rune // Store the deleted chars in a buffer\n\t\t\t\tfor {\n\t\t\t\t\tif pos == 0 || !unicode.IsSpace(line[pos-1]) {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tbuf = append(buf, line[pos-1])\n\t\t\t\t\tline = append(line[:pos-1], line[pos:]...)\n\t\t\t\t\tpos--\n\t\t\t\t}\n\t\t\t\t// Remove non-whitespace to the left\n\t\t\t\tfor {\n\t\t\t\t\tif pos == 0 || unicode.IsSpace(line[pos-1]) {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tbuf = append(buf, line[pos-1])\n\t\t\t\t\tline = append(line[:pos-1], line[pos:]...)\n\t\t\t\t\tpos--\n\t\t\t\t}\n\t\t\t\t// Invert the buffer and save the result on the killRing\n\t\t\t\tvar newBuf []rune\n\t\t\t\tfor i := len(buf) - 1; i >= 0; i-- {\n\t\t\t\t\tnewBuf = append(newBuf, buf[i])\n\t\t\t\t}\n\t\t\t\tif killAction > 0 {\n\t\t\t\t\ts.addToKillRing(newBuf, 2) // Add in prepend mode\n\t\t\t\t} else {\n\t\t\t\t\ts.addToKillRing(newBuf, 0) // Add in normal mode\n\t\t\t\t}\n\t\t\t\tkillAction = 2 // Mark that there was some killing\n\n\t\t\t\ts.needRefresh = true\n\t\t\tcase ctrlY: // Paste from Yank buffer\n\t\t\t\tline, pos, next, err = s.yank(p, line, pos)\n\t\t\t\tgoto haveNext\n\t\t\tcase ctrlR: // Reverse Search\n\t\t\t\tline, pos, next, err = s.reverseISearch(line, pos)\n\t\t\t\ts.needRefresh = true\n\t\t\t\tgoto haveNext\n\t\t\tcase tab: // Tab completion\n\t\t\t\tline, pos, next, err = s.tabComplete(p, line, pos)\n\t\t\t\tgoto haveNext\n\t\t\t// Catch keys that do nothing, but you don't want them to beep\n\t\t\tcase esc:\n\t\t\t\t// DO NOTHING\n\t\t\t// Unused keys\n\t\t\tcase ctrlG, ctrlO, ctrlQ, ctrlS, ctrlV, ctrlX, ctrlZ:\n\t\t\t\tfallthrough\n\t\t\t// Catch unhandled control codes (anything <= 31)\n\t\t\tcase 0, 28, 29, 30, 31:\n\t\t\t\tfmt.Print(beep)\n\t\t\tdefault:\n\t\t\t\tif pos == len(line) && !s.multiLineMode &&\n\t\t\t\t\tlen(p)+len(line) < s.columns*4 && // Avoid countGlyphs on large lines\n\t\t\t\t\tcountGlyphs(p)+countGlyphs(line) < s.columns-1 {\n\t\t\t\t\tline = append(line, v)\n\t\t\t\t\tfmt.Printf(\"%c\", v)\n\t\t\t\t\tpos++\n\t\t\t\t} else {\n\t\t\t\t\tline = append(line[:pos], append([]rune{v}, line[pos:]...)...)\n\t\t\t\t\tpos++\n\t\t\t\t\ts.needRefresh = true\n\t\t\t\t}\n\t\t\t}\n\t\tcase action:\n\t\t\tswitch v {\n\t\t\tcase del:\n\t\t\t\tif pos >= len(line) {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t} else {\n\t\t\t\t\tn := len(getPrefixGlyphs(line[pos:], 1))\n\t\t\t\t\tline = append(line[:pos], line[pos+n:]...)\n\t\t\t\t}\n\t\t\tcase left:\n\t\t\t\tif pos > 0 {\n\t\t\t\t\tpos -= len(getSuffixGlyphs(line[:pos], 1))\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase wordLeft, altB:\n\t\t\t\tif pos > 0 {\n\t\t\t\t\tvar spaceHere, spaceLeft, leftKnown bool\n\t\t\t\t\tfor {\n\t\t\t\t\t\tpos--\n\t\t\t\t\t\tif pos == 0 {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif leftKnown {\n\t\t\t\t\t\t\tspaceHere = spaceLeft\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tspaceHere = unicode.IsSpace(line[pos])\n\t\t\t\t\t\t}\n\t\t\t\t\t\tspaceLeft, leftKnown = unicode.IsSpace(line[pos-1]), true\n\t\t\t\t\t\tif !spaceHere && spaceLeft {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase right:\n\t\t\t\tif pos < len(line) {\n\t\t\t\t\tpos += len(getPrefixGlyphs(line[pos:], 1))\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase wordRight, altF:\n\t\t\t\tif pos < len(line) {\n\t\t\t\t\tvar spaceHere, spaceLeft, hereKnown bool\n\t\t\t\t\tfor {\n\t\t\t\t\t\tpos++\n\t\t\t\t\t\tif pos == len(line) {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif hereKnown {\n\t\t\t\t\t\t\tspaceLeft = spaceHere\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tspaceLeft = unicode.IsSpace(line[pos-1])\n\t\t\t\t\t\t}\n\t\t\t\t\t\tspaceHere, hereKnown = unicode.IsSpace(line[pos]), true\n\t\t\t\t\t\tif spaceHere && !spaceLeft {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase up:\n\t\t\t\thistoryAction = true\n\t\t\t\tif historyStale {\n\t\t\t\t\thistoryPrefix = s.getHistoryByPrefix(string(line))\n\t\t\t\t\thistoryPos = len(historyPrefix)\n\t\t\t\t\thistoryStale = false\n\t\t\t\t}\n\t\t\t\tif historyPos > 0 {\n\t\t\t\t\tif historyPos == len(historyPrefix) {\n\t\t\t\t\t\thistoryEnd = string(line)\n\t\t\t\t\t}\n\t\t\t\t\thistoryPos--\n\t\t\t\t\tline = []rune(historyPrefix[historyPos])\n\t\t\t\t\tpos = len(line)\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase down:\n\t\t\t\thistoryAction = true\n\t\t\t\tif historyStale {\n\t\t\t\t\thistoryPrefix = s.getHistoryByPrefix(string(line))\n\t\t\t\t\thistoryPos = len(historyPrefix)\n\t\t\t\t\thistoryStale = false\n\t\t\t\t}\n\t\t\t\tif historyPos < len(historyPrefix) {\n\t\t\t\t\thistoryPos++\n\t\t\t\t\tif historyPos == len(historyPrefix) {\n\t\t\t\t\t\tline = []rune(historyEnd)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tline = []rune(historyPrefix[historyPos])\n\t\t\t\t\t}\n\t\t\t\t\tpos = len(line)\n\t\t\t\t} else {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t}\n\t\t\tcase home: // Start of line\n\t\t\t\tpos = 0\n\t\t\tcase end: // End of line\n\t\t\t\tpos = len(line)\n\t\t\tcase winch: // Window change\n\t\t\t\tif s.multiLineMode {\n\t\t\t\t\tif s.maxRows-s.cursorRows > 0 {\n\t\t\t\t\t\ts.moveDown(s.maxRows - s.cursorRows)\n\t\t\t\t\t}\n\t\t\t\t\tfor i := 0; i < s.maxRows-1; i++ {\n\t\t\t\t\t\ts.cursorPos(0)\n\t\t\t\t\t\ts.eraseLine()\n\t\t\t\t\t\ts.moveUp(1)\n\t\t\t\t\t}\n\t\t\t\t\ts.maxRows = 1\n\t\t\t\t\ts.cursorRows = 1\n\t\t\t\t}\n\t\t\t}\n\t\t\ts.needRefresh = true\n\t\t}\n\t\tif s.needRefresh && !s.inputWaiting() {\n\t\t\terr := s.refresh(p, line, pos)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t}\n\t\tif !historyAction {\n\t\t\thistoryStale = true\n\t\t}\n\t\tif killAction > 0 {\n\t\t\tkillAction--\n\t\t}\n\t}\n\treturn string(line), nil\n}\n\n// PasswordPrompt displays p, and then waits for user input. The input typed by\n// the user is not displayed in the terminal.\nfunc (s *State) PasswordPrompt(prompt string) (string, error) {\n\tfor _, r := range prompt {\n\t\tif unicode.Is(unicode.C, r) {\n\t\t\treturn \"\", ErrInvalidPrompt\n\t\t}\n\t}\n\tif !s.terminalSupported || s.columns == 0 {\n\t\treturn \"\", errors.New(\"liner: function not supported in this terminal\")\n\t}\n\tif s.inputRedirected {\n\t\treturn s.promptUnsupported(prompt)\n\t}\n\tif s.outputRedirected {\n\t\treturn \"\", ErrNotTerminalOutput\n\t}\n\n\tp := []rune(prompt)\n\tconst minWorkingSpace = 1\n\tif s.columns < countGlyphs(p)+minWorkingSpace {\n\t\treturn s.tooNarrow(prompt)\n\t}\n\n\tdefer s.stopPrompt()\n\nrestart:\n\ts.startPrompt()\n\ts.getColumns()\n\n\tfmt.Print(prompt)\n\tvar line []rune\n\tpos := 0\n\nmainLoop:\n\tfor {\n\t\tnext, err := s.readNext()\n\t\tif err != nil {\n\t\t\tif s.shouldRestart != nil && s.shouldRestart(err) {\n\t\t\t\tgoto restart\n\t\t\t}\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tswitch v := next.(type) {\n\t\tcase rune:\n\t\t\tswitch v {\n\t\t\tcase cr, lf:\n\t\t\t\tif s.needRefresh {\n\t\t\t\t\terr := s.refresh(p, line, pos)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn \"\", err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif s.multiLineMode {\n\t\t\t\t\ts.resetMultiLine(p, line, pos)\n\t\t\t\t}\n\t\t\t\tfmt.Println()\n\t\t\t\tbreak mainLoop\n\t\t\tcase ctrlD: // del\n\t\t\t\tif pos == 0 && len(line) == 0 {\n\t\t\t\t\t// exit\n\t\t\t\t\treturn \"\", io.EOF\n\t\t\t\t}\n\n\t\t\t\t// ctrlD is a potential EOF, so the rune reader shuts down.\n\t\t\t\t// Therefore, if it isn't actually an EOF, we must re-startPrompt.\n\t\t\t\ts.restartPrompt()\n\t\t\tcase ctrlL: // clear screen\n\t\t\t\ts.eraseScreen()\n\t\t\t\terr := s.refresh(p, []rune{}, 0)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn \"\", err\n\t\t\t\t}\n\t\t\tcase ctrlH, bs: // Backspace\n\t\t\t\tif pos <= 0 {\n\t\t\t\t\tfmt.Print(beep)\n\t\t\t\t} else {\n\t\t\t\t\tn := len(getSuffixGlyphs(line[:pos], 1))\n\t\t\t\t\tline = append(line[:pos-n], line[pos:]...)\n\t\t\t\t\tpos -= n\n\t\t\t\t}\n\t\t\tcase ctrlC:\n\t\t\t\tfmt.Println(\"^C\")\n\t\t\t\tif s.multiLineMode {\n\t\t\t\t\ts.resetMultiLine(p, line, pos)\n\t\t\t\t}\n\t\t\t\tif s.ctrlCAborts {\n\t\t\t\t\treturn \"\", ErrPromptAborted\n\t\t\t\t}\n\t\t\t\tline = line[:0]\n\t\t\t\tpos = 0\n\t\t\t\tfmt.Print(prompt)\n\t\t\t\ts.restartPrompt()\n\t\t\t// Unused keys\n\t\t\tcase esc, tab, ctrlA, ctrlB, ctrlE, ctrlF, ctrlG, ctrlK, ctrlN, ctrlO, ctrlP, ctrlQ, ctrlR, ctrlS,\n\t\t\t\tctrlT, ctrlU, ctrlV, ctrlW, ctrlX, ctrlY, ctrlZ:\n\t\t\t\tfallthrough\n\t\t\t// Catch unhandled control codes (anything <= 31)\n\t\t\tcase 0, 28, 29, 30, 31:\n\t\t\t\tfmt.Print(beep)\n\t\t\tdefault:\n\t\t\t\tline = append(line[:pos], append([]rune{v}, line[pos:]...)...)\n\t\t\t\tpos++\n\t\t\t}\n\t\t}\n\t}\n\treturn string(line), nil\n}\n\nfunc (s *State) tooNarrow(prompt string) (string, error) {\n\t// Docker and OpenWRT and etc sometimes return 0 column width\n\t// Reset mode temporarily. Restore baked mode in case the terminal\n\t// is wide enough for the next Prompt attempt.\n\tm, merr := TerminalMode()\n\ts.origMode.ApplyMode()\n\tif merr == nil {\n\t\tdefer m.ApplyMode()\n\t}\n\tif s.r == nil {\n\t\t// Windows does not always set s.r\n\t\ts.r = bufio.NewReader(os.Stdin)\n\t\tdefer func() { s.r = nil }()\n\t}\n\treturn s.promptUnsupported(prompt)\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/output.go",
    "content": "// +build linux darwin openbsd freebsd netbsd\n\npackage liner\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc (s *State) cursorPos(x int) {\n\tif s.useCHA {\n\t\t// 'G' is \"Cursor Character Absolute (CHA)\"\n\t\tfmt.Printf(\"\\x1b[%dG\", x+1)\n\t} else {\n\t\t// 'C' is \"Cursor Forward (CUF)\"\n\t\tfmt.Print(\"\\r\")\n\t\tif x > 0 {\n\t\t\tfmt.Printf(\"\\x1b[%dC\", x)\n\t\t}\n\t}\n}\n\nfunc (s *State) eraseLine() {\n\tfmt.Print(\"\\x1b[0K\")\n}\n\nfunc (s *State) eraseScreen() {\n\tfmt.Print(\"\\x1b[H\\x1b[2J\")\n}\n\nfunc (s *State) moveUp(lines int) {\n\tfmt.Printf(\"\\x1b[%dA\", lines)\n}\n\nfunc (s *State) moveDown(lines int) {\n\tfmt.Printf(\"\\x1b[%dB\", lines)\n}\n\nfunc (s *State) emitNewLine() {\n\tfmt.Print(\"\\n\")\n}\n\ntype winSize struct {\n\trow, col       uint16\n\txpixel, ypixel uint16\n}\n\nfunc (s *State) getColumns() bool {\n\tvar ws winSize\n\tok, _, _ := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdout),\n\t\tsyscall.TIOCGWINSZ, uintptr(unsafe.Pointer(&ws)))\n\tif int(ok) < 0 {\n\t\treturn false\n\t}\n\ts.columns = int(ws.col)\n\tif cursorColumn && s.columns > 1 {\n\t\ts.columns--\n\t}\n\treturn true\n}\n\nfunc (s *State) checkOutput() {\n\t// xterm is known to support CHA\n\tif strings.Contains(strings.ToLower(os.Getenv(\"TERM\")), \"xterm\") {\n\t\ts.useCHA = true\n\t\treturn\n\t}\n\n\t// The test for functional ANSI CHA is unreliable (eg the Windows\n\t// telnet command does not support reading the cursor position with\n\t// an ANSI DSR request, despite setting TERM=ansi)\n\n\t// Assume CHA isn't supported (which should be safe, although it\n\t// does result in occasional visible cursor jitter)\n\ts.useCHA = false\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/output_windows.go",
    "content": "package liner\n\nimport (\n\t\"unsafe\"\n)\n\ntype coord struct {\n\tx, y int16\n}\ntype smallRect struct {\n\tleft, top, right, bottom int16\n}\n\ntype consoleScreenBufferInfo struct {\n\tdwSize              coord\n\tdwCursorPosition    coord\n\twAttributes         int16\n\tsrWindow            smallRect\n\tdwMaximumWindowSize coord\n}\n\nfunc (s *State) cursorPos(x int) {\n\tvar sbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))\n\tprocSetConsoleCursorPosition.Call(uintptr(s.hOut),\n\t\tuintptr(int(x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16))\n}\n\nfunc (s *State) eraseLine() {\n\tvar sbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))\n\tvar numWritten uint32\n\tprocFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '),\n\t\tuintptr(sbi.dwSize.x-sbi.dwCursorPosition.x),\n\t\tuintptr(int(sbi.dwCursorPosition.x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16),\n\t\tuintptr(unsafe.Pointer(&numWritten)))\n}\n\nfunc (s *State) eraseScreen() {\n\tvar sbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))\n\tvar numWritten uint32\n\tprocFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '),\n\t\tuintptr(sbi.dwSize.x)*uintptr(sbi.dwSize.y),\n\t\t0,\n\t\tuintptr(unsafe.Pointer(&numWritten)))\n\tprocSetConsoleCursorPosition.Call(uintptr(s.hOut), 0)\n}\n\nfunc (s *State) moveUp(lines int) {\n\tvar sbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))\n\tprocSetConsoleCursorPosition.Call(uintptr(s.hOut),\n\t\tuintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)-lines)<<16))\n}\n\nfunc (s *State) moveDown(lines int) {\n\tvar sbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))\n\tprocSetConsoleCursorPosition.Call(uintptr(s.hOut),\n\t\tuintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)+lines)<<16))\n}\n\nfunc (s *State) emitNewLine() {\n\t// windows doesn't need to omit a new line\n}\n\nfunc (s *State) getColumns() {\n\tvar sbi consoleScreenBufferInfo\n\tprocGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi)))\n\ts.columns = int(sbi.dwSize.x)\n\tif s.columns > 1 {\n\t\t// Windows 10 needs a spare column for the cursor\n\t\ts.columns--\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/unixmode.go",
    "content": "// +build linux darwin freebsd openbsd netbsd\n\npackage liner\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc (mode *termios) ApplyMode() error {\n\t_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdin), setTermios, uintptr(unsafe.Pointer(mode)))\n\n\tif errno != 0 {\n\t\treturn errno\n\t}\n\treturn nil\n}\n\n// TerminalMode returns the current terminal input mode as an InputModeSetter.\n//\n// This function is provided for convenience, and should\n// not be necessary for most users of liner.\nfunc TerminalMode() (ModeApplier, error) {\n\tmode, errno := getMode(syscall.Stdin)\n\n\tif errno != 0 {\n\t\treturn nil, errno\n\t}\n\treturn mode, nil\n}\n\nfunc getMode(handle int) (*termios, syscall.Errno) {\n\tvar mode termios\n\t_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(handle), getTermios, uintptr(unsafe.Pointer(&mode)))\n\n\treturn &mode, errno\n}\n"
  },
  {
    "path": "vendor/github.com/peterh/liner/width.go",
    "content": "package liner\n\nimport \"unicode\"\n\n// These character classes are mostly zero width (when combined).\n// A few might not be, depending on the user's font. Fixing this\n// is non-trivial, given that some terminals don't support\n// ANSI DSR/CPR\nvar zeroWidth = []*unicode.RangeTable{\n\tunicode.Mn,\n\tunicode.Me,\n\tunicode.Cc,\n\tunicode.Cf,\n}\n\nvar doubleWidth = []*unicode.RangeTable{\n\tunicode.Han,\n\tunicode.Hangul,\n\tunicode.Hiragana,\n\tunicode.Katakana,\n}\n\n// countGlyphs considers zero-width characters to be zero glyphs wide,\n// and members of Chinese, Japanese, and Korean scripts to be 2 glyphs wide.\nfunc countGlyphs(s []rune) int {\n\tn := 0\n\tfor _, r := range s {\n\t\t// speed up the common case\n\t\tif r < 127 {\n\t\t\tn++\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch {\n\t\tcase unicode.IsOneOf(zeroWidth, r):\n\t\tcase unicode.IsOneOf(doubleWidth, r):\n\t\t\tn += 2\n\t\tdefault:\n\t\t\tn++\n\t\t}\n\t}\n\treturn n\n}\n\nfunc countMultiLineGlyphs(s []rune, columns int, start int) int {\n\tn := start\n\tfor _, r := range s {\n\t\tif r < 127 {\n\t\t\tn++\n\t\t\tcontinue\n\t\t}\n\t\tswitch {\n\t\tcase unicode.IsOneOf(zeroWidth, r):\n\t\tcase unicode.IsOneOf(doubleWidth, r):\n\t\t\tn += 2\n\t\t\t// no room for a 2-glyphs-wide char in the ending\n\t\t\t// so skip a column and display it at the beginning\n\t\t\tif n%columns == 1 {\n\t\t\t\tn++\n\t\t\t}\n\t\tdefault:\n\t\t\tn++\n\t\t}\n\t}\n\treturn n\n}\n\nfunc getPrefixGlyphs(s []rune, num int) []rune {\n\tp := 0\n\tfor n := 0; n < num && p < len(s); p++ {\n\t\t// speed up the common case\n\t\tif s[p] < 127 {\n\t\t\tn++\n\t\t\tcontinue\n\t\t}\n\t\tif !unicode.IsOneOf(zeroWidth, s[p]) {\n\t\t\tn++\n\t\t}\n\t}\n\tfor p < len(s) && unicode.IsOneOf(zeroWidth, s[p]) {\n\t\tp++\n\t}\n\treturn s[:p]\n}\n\nfunc getSuffixGlyphs(s []rune, num int) []rune {\n\tp := len(s)\n\tfor n := 0; n < num && p > 0; p-- {\n\t\t// speed up the common case\n\t\tif s[p-1] < 127 {\n\t\t\tn++\n\t\t\tcontinue\n\t\t}\n\t\tif !unicode.IsOneOf(zeroWidth, s[p-1]) {\n\t\t\tn++\n\t\t}\n\t}\n\treturn s[p:]\n}\n"
  },
  {
    "path": "vendor/github.com/pkg/errors/LICENSE",
    "content": "Copyright (c) 2015, Dave Cheney <dave@cheney.net>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/pkg/errors/README.md",
    "content": "# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) [![Sourcegraph](https://sourcegraph.com/github.com/pkg/errors/-/badge.svg)](https://sourcegraph.com/github.com/pkg/errors?badge)\n\nPackage errors provides simple error handling primitives.\n\n`go get github.com/pkg/errors`\n\nThe traditional error handling idiom in Go is roughly akin to\n```go\nif err != nil {\n        return err\n}\n```\nwhich applied recursively up the call stack results in error reports without context or debugging information. The errors package allows programmers to add context to the failure path in their code in a way that does not destroy the original value of the error.\n\n## Adding context to an error\n\nThe errors.Wrap function returns a new error that adds context to the original error. For example\n```go\n_, err := ioutil.ReadAll(r)\nif err != nil {\n        return errors.Wrap(err, \"read failed\")\n}\n```\n## Retrieving the cause of an error\n\nUsing `errors.Wrap` constructs a stack of errors, adding context to the preceding error. Depending on the nature of the error it may be necessary to reverse the operation of errors.Wrap to retrieve the original error for inspection. Any error value which implements this interface can be inspected by `errors.Cause`.\n```go\ntype causer interface {\n        Cause() error\n}\n```\n`errors.Cause` will recursively retrieve the topmost error which does not implement `causer`, which is assumed to be the original cause. For example:\n```go\nswitch err := errors.Cause(err).(type) {\ncase *MyError:\n        // handle specifically\ndefault:\n        // unknown error\n}\n```\n\n[Read the package documentation for more information](https://godoc.org/github.com/pkg/errors).\n\n## Contributing\n\nWe welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high.\n\nBefore proposing a change, please discuss your change by raising an issue.\n\n## License\n\nBSD-2-Clause\n"
  },
  {
    "path": "vendor/github.com/pkg/errors/appveyor.yml",
    "content": "version: build-{build}.{branch}\n\nclone_folder: C:\\gopath\\src\\github.com\\pkg\\errors\nshallow_clone: true # for startup speed\n\nenvironment:\n  GOPATH: C:\\gopath\n\nplatform:\n  - x64\n\n# http://www.appveyor.com/docs/installed-software\ninstall:\n  # some helpful output for debugging builds\n  - go version\n  - go env\n  # pre-installed MinGW at C:\\MinGW is 32bit only\n  # but MSYS2 at C:\\msys64 has mingw64\n  - set PATH=C:\\msys64\\mingw64\\bin;%PATH%\n  - gcc --version\n  - g++ --version\n\nbuild_script:\n  - go install -v ./...\n\ntest_script:\n  - set PATH=C:\\gopath\\bin;%PATH%\n  - go test -v ./...\n\n#artifacts:\n#  - path: '%GOPATH%\\bin\\*.exe'\ndeploy: off\n"
  },
  {
    "path": "vendor/github.com/pkg/errors/errors.go",
    "content": "// Package errors provides simple error handling primitives.\n//\n// The traditional error handling idiom in Go is roughly akin to\n//\n//     if err != nil {\n//             return err\n//     }\n//\n// which applied recursively up the call stack results in error reports\n// without context or debugging information. The errors package allows\n// programmers to add context to the failure path in their code in a way\n// that does not destroy the original value of the error.\n//\n// Adding context to an error\n//\n// The errors.Wrap function returns a new error that adds context to the\n// original error by recording a stack trace at the point Wrap is called,\n// and the supplied message. For example\n//\n//     _, err := ioutil.ReadAll(r)\n//     if err != nil {\n//             return errors.Wrap(err, \"read failed\")\n//     }\n//\n// If additional control is required the errors.WithStack and errors.WithMessage\n// functions destructure errors.Wrap into its component operations of annotating\n// an error with a stack trace and an a message, respectively.\n//\n// Retrieving the cause of an error\n//\n// Using errors.Wrap constructs a stack of errors, adding context to the\n// preceding error. Depending on the nature of the error it may be necessary\n// to reverse the operation of errors.Wrap to retrieve the original error\n// for inspection. Any error value which implements this interface\n//\n//     type causer interface {\n//             Cause() error\n//     }\n//\n// can be inspected by errors.Cause. errors.Cause will recursively retrieve\n// the topmost error which does not implement causer, which is assumed to be\n// the original cause. For example:\n//\n//     switch err := errors.Cause(err).(type) {\n//     case *MyError:\n//             // handle specifically\n//     default:\n//             // unknown error\n//     }\n//\n// causer interface is not exported by this package, but is considered a part\n// of stable public API.\n//\n// Formatted printing of errors\n//\n// All error values returned from this package implement fmt.Formatter and can\n// be formatted by the fmt package. The following verbs are supported\n//\n//     %s    print the error. If the error has a Cause it will be\n//           printed recursively\n//     %v    see %s\n//     %+v   extended format. Each Frame of the error's StackTrace will\n//           be printed in detail.\n//\n// Retrieving the stack trace of an error or wrapper\n//\n// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are\n// invoked. This information can be retrieved with the following interface.\n//\n//     type stackTracer interface {\n//             StackTrace() errors.StackTrace\n//     }\n//\n// Where errors.StackTrace is defined as\n//\n//     type StackTrace []Frame\n//\n// The Frame type represents a call site in the stack trace. Frame supports\n// the fmt.Formatter interface that can be used for printing information about\n// the stack trace of this error. For example:\n//\n//     if err, ok := err.(stackTracer); ok {\n//             for _, f := range err.StackTrace() {\n//                     fmt.Printf(\"%+s:%d\", f)\n//             }\n//     }\n//\n// stackTracer interface is not exported by this package, but is considered a part\n// of stable public API.\n//\n// See the documentation for Frame.Format for more details.\npackage errors\n\nimport (\n\t\"fmt\"\n\t\"io\"\n)\n\n// New returns an error with the supplied message.\n// New also records the stack trace at the point it was called.\nfunc New(message string) error {\n\treturn &fundamental{\n\t\tmsg:   message,\n\t\tstack: callers(),\n\t}\n}\n\n// Errorf formats according to a format specifier and returns the string\n// as a value that satisfies error.\n// Errorf also records the stack trace at the point it was called.\nfunc Errorf(format string, args ...interface{}) error {\n\treturn &fundamental{\n\t\tmsg:   fmt.Sprintf(format, args...),\n\t\tstack: callers(),\n\t}\n}\n\n// fundamental is an error that has a message and a stack, but no caller.\ntype fundamental struct {\n\tmsg string\n\t*stack\n}\n\nfunc (f *fundamental) Error() string { return f.msg }\n\nfunc (f *fundamental) Format(s fmt.State, verb rune) {\n\tswitch verb {\n\tcase 'v':\n\t\tif s.Flag('+') {\n\t\t\tio.WriteString(s, f.msg)\n\t\t\tf.stack.Format(s, verb)\n\t\t\treturn\n\t\t}\n\t\tfallthrough\n\tcase 's':\n\t\tio.WriteString(s, f.msg)\n\tcase 'q':\n\t\tfmt.Fprintf(s, \"%q\", f.msg)\n\t}\n}\n\n// WithStack annotates err with a stack trace at the point WithStack was called.\n// If err is nil, WithStack returns nil.\nfunc WithStack(err error) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\treturn &withStack{\n\t\terr,\n\t\tcallers(),\n\t}\n}\n\ntype withStack struct {\n\terror\n\t*stack\n}\n\nfunc (w *withStack) Cause() error { return w.error }\n\nfunc (w *withStack) Format(s fmt.State, verb rune) {\n\tswitch verb {\n\tcase 'v':\n\t\tif s.Flag('+') {\n\t\t\tfmt.Fprintf(s, \"%+v\", w.Cause())\n\t\t\tw.stack.Format(s, verb)\n\t\t\treturn\n\t\t}\n\t\tfallthrough\n\tcase 's':\n\t\tio.WriteString(s, w.Error())\n\tcase 'q':\n\t\tfmt.Fprintf(s, \"%q\", w.Error())\n\t}\n}\n\n// Wrap returns an error annotating err with a stack trace\n// at the point Wrap is called, and the supplied message.\n// If err is nil, Wrap returns nil.\nfunc Wrap(err error, message string) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\terr = &withMessage{\n\t\tcause: err,\n\t\tmsg:   message,\n\t}\n\treturn &withStack{\n\t\terr,\n\t\tcallers(),\n\t}\n}\n\n// Wrapf returns an error annotating err with a stack trace\n// at the point Wrapf is call, and the format specifier.\n// If err is nil, Wrapf returns nil.\nfunc Wrapf(err error, format string, args ...interface{}) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\terr = &withMessage{\n\t\tcause: err,\n\t\tmsg:   fmt.Sprintf(format, args...),\n\t}\n\treturn &withStack{\n\t\terr,\n\t\tcallers(),\n\t}\n}\n\n// WithMessage annotates err with a new message.\n// If err is nil, WithMessage returns nil.\nfunc WithMessage(err error, message string) error {\n\tif err == nil {\n\t\treturn nil\n\t}\n\treturn &withMessage{\n\t\tcause: err,\n\t\tmsg:   message,\n\t}\n}\n\ntype withMessage struct {\n\tcause error\n\tmsg   string\n}\n\nfunc (w *withMessage) Error() string { return w.msg + \": \" + w.cause.Error() }\nfunc (w *withMessage) Cause() error  { return w.cause }\n\nfunc (w *withMessage) Format(s fmt.State, verb rune) {\n\tswitch verb {\n\tcase 'v':\n\t\tif s.Flag('+') {\n\t\t\tfmt.Fprintf(s, \"%+v\\n\", w.Cause())\n\t\t\tio.WriteString(s, w.msg)\n\t\t\treturn\n\t\t}\n\t\tfallthrough\n\tcase 's', 'q':\n\t\tio.WriteString(s, w.Error())\n\t}\n}\n\n// Cause returns the underlying cause of the error, if possible.\n// An error value has a cause if it implements the following\n// interface:\n//\n//     type causer interface {\n//            Cause() error\n//     }\n//\n// If the error does not implement Cause, the original error will\n// be returned. If the error is nil, nil will be returned without further\n// investigation.\nfunc Cause(err error) error {\n\ttype causer interface {\n\t\tCause() error\n\t}\n\n\tfor err != nil {\n\t\tcause, ok := err.(causer)\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t\terr = cause.Cause()\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/pkg/errors/stack.go",
    "content": "package errors\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\t\"runtime\"\n\t\"strings\"\n)\n\n// Frame represents a program counter inside a stack frame.\ntype Frame uintptr\n\n// pc returns the program counter for this frame;\n// multiple frames may have the same PC value.\nfunc (f Frame) pc() uintptr { return uintptr(f) - 1 }\n\n// file returns the full path to the file that contains the\n// function for this Frame's pc.\nfunc (f Frame) file() string {\n\tfn := runtime.FuncForPC(f.pc())\n\tif fn == nil {\n\t\treturn \"unknown\"\n\t}\n\tfile, _ := fn.FileLine(f.pc())\n\treturn file\n}\n\n// line returns the line number of source code of the\n// function for this Frame's pc.\nfunc (f Frame) line() int {\n\tfn := runtime.FuncForPC(f.pc())\n\tif fn == nil {\n\t\treturn 0\n\t}\n\t_, line := fn.FileLine(f.pc())\n\treturn line\n}\n\n// Format formats the frame according to the fmt.Formatter interface.\n//\n//    %s    source file\n//    %d    source line\n//    %n    function name\n//    %v    equivalent to %s:%d\n//\n// Format accepts flags that alter the printing of some verbs, as follows:\n//\n//    %+s   function name and path of source file relative to the compile time\n//          GOPATH separated by \\n\\t (<funcname>\\n\\t<path>)\n//    %+v   equivalent to %+s:%d\nfunc (f Frame) Format(s fmt.State, verb rune) {\n\tswitch verb {\n\tcase 's':\n\t\tswitch {\n\t\tcase s.Flag('+'):\n\t\t\tpc := f.pc()\n\t\t\tfn := runtime.FuncForPC(pc)\n\t\t\tif fn == nil {\n\t\t\t\tio.WriteString(s, \"unknown\")\n\t\t\t} else {\n\t\t\t\tfile, _ := fn.FileLine(pc)\n\t\t\t\tfmt.Fprintf(s, \"%s\\n\\t%s\", fn.Name(), file)\n\t\t\t}\n\t\tdefault:\n\t\t\tio.WriteString(s, path.Base(f.file()))\n\t\t}\n\tcase 'd':\n\t\tfmt.Fprintf(s, \"%d\", f.line())\n\tcase 'n':\n\t\tname := runtime.FuncForPC(f.pc()).Name()\n\t\tio.WriteString(s, funcname(name))\n\tcase 'v':\n\t\tf.Format(s, 's')\n\t\tio.WriteString(s, \":\")\n\t\tf.Format(s, 'd')\n\t}\n}\n\n// StackTrace is stack of Frames from innermost (newest) to outermost (oldest).\ntype StackTrace []Frame\n\n// Format formats the stack of Frames according to the fmt.Formatter interface.\n//\n//    %s\tlists source files for each Frame in the stack\n//    %v\tlists the source file and line number for each Frame in the stack\n//\n// Format accepts flags that alter the printing of some verbs, as follows:\n//\n//    %+v   Prints filename, function, and line number for each Frame in the stack.\nfunc (st StackTrace) Format(s fmt.State, verb rune) {\n\tswitch verb {\n\tcase 'v':\n\t\tswitch {\n\t\tcase s.Flag('+'):\n\t\t\tfor _, f := range st {\n\t\t\t\tfmt.Fprintf(s, \"\\n%+v\", f)\n\t\t\t}\n\t\tcase s.Flag('#'):\n\t\t\tfmt.Fprintf(s, \"%#v\", []Frame(st))\n\t\tdefault:\n\t\t\tfmt.Fprintf(s, \"%v\", []Frame(st))\n\t\t}\n\tcase 's':\n\t\tfmt.Fprintf(s, \"%s\", []Frame(st))\n\t}\n}\n\n// stack represents a stack of program counters.\ntype stack []uintptr\n\nfunc (s *stack) Format(st fmt.State, verb rune) {\n\tswitch verb {\n\tcase 'v':\n\t\tswitch {\n\t\tcase st.Flag('+'):\n\t\t\tfor _, pc := range *s {\n\t\t\t\tf := Frame(pc)\n\t\t\t\tfmt.Fprintf(st, \"\\n%+v\", f)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (s *stack) StackTrace() StackTrace {\n\tf := make([]Frame, len(*s))\n\tfor i := 0; i < len(f); i++ {\n\t\tf[i] = Frame((*s)[i])\n\t}\n\treturn f\n}\n\nfunc callers() *stack {\n\tconst depth = 32\n\tvar pcs [depth]uintptr\n\tn := runtime.Callers(3, pcs[:])\n\tvar st stack = pcs[0:n]\n\treturn &st\n}\n\n// funcname removes the path prefix component of a function's name reported by func.Name().\nfunc funcname(name string) string {\n\ti := strings.LastIndex(name, \"/\")\n\tname = name[i+1:]\n\ti = strings.Index(name, \".\")\n\treturn name[i+1:]\n}\n\nfunc trimGOPATH(name, file string) string {\n\t// Here we want to get the source file path relative to the compile time\n\t// GOPATH. As of Go 1.6.x there is no direct way to know the compiled\n\t// GOPATH at runtime, but we can infer the number of path segments in the\n\t// GOPATH. We note that fn.Name() returns the function name qualified by\n\t// the import path, which does not include the GOPATH. Thus we can trim\n\t// segments from the beginning of the file path until the number of path\n\t// separators remaining is one more than the number of path separators in\n\t// the function name. For example, given:\n\t//\n\t//    GOPATH     /home/user\n\t//    file       /home/user/src/pkg/sub/file.go\n\t//    fn.Name()  pkg/sub.Type.Method\n\t//\n\t// We want to produce:\n\t//\n\t//    pkg/sub/file.go\n\t//\n\t// From this we can easily see that fn.Name() has one less path separator\n\t// than our desired output. We count separators from the end of the file\n\t// path until it finds two more than in the function name and then move\n\t// one character forward to preserve the initial path segment without a\n\t// leading separator.\n\tconst sep = \"/\"\n\tgoal := strings.Count(name, sep) + 2\n\ti := len(file)\n\tfor n := 0; n < goal; n++ {\n\t\ti = strings.LastIndex(file[:i], sep)\n\t\tif i == -1 {\n\t\t\t// not enough separators found, set i so that the slice expression\n\t\t\t// below leaves file unmodified\n\t\t\ti = -len(sep)\n\t\t\tbreak\n\t\t}\n\t}\n\t// get back to 0 or trim the leading separator\n\tfile = file[i+len(sep):]\n\treturn file\n}\n"
  },
  {
    "path": "vendor/github.com/pmezard/go-difflib/LICENSE",
    "content": "Copyright (c) 2013, Patrick Mezard\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n    The names of its contributors may not be used to endorse or promote\nproducts derived from this software without specific prior written\npermission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/pmezard/go-difflib/difflib/difflib.go",
    "content": "// Package difflib is a partial port of Python difflib module.\n//\n// It provides tools to compare sequences of strings and generate textual diffs.\n//\n// The following class and functions have been ported:\n//\n// - SequenceMatcher\n//\n// - unified_diff\n//\n// - context_diff\n//\n// Getting unified diffs was the main goal of the port. Keep in mind this code\n// is mostly suitable to output text differences in a human friendly way, there\n// are no guarantees generated diffs are consumable by patch(1).\npackage difflib\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n)\n\nfunc min(a, b int) int {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc max(a, b int) int {\n\tif a > b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc calculateRatio(matches, length int) float64 {\n\tif length > 0 {\n\t\treturn 2.0 * float64(matches) / float64(length)\n\t}\n\treturn 1.0\n}\n\ntype Match struct {\n\tA    int\n\tB    int\n\tSize int\n}\n\ntype OpCode struct {\n\tTag byte\n\tI1  int\n\tI2  int\n\tJ1  int\n\tJ2  int\n}\n\n// SequenceMatcher compares sequence of strings. The basic\n// algorithm predates, and is a little fancier than, an algorithm\n// published in the late 1980's by Ratcliff and Obershelp under the\n// hyperbolic name \"gestalt pattern matching\".  The basic idea is to find\n// the longest contiguous matching subsequence that contains no \"junk\"\n// elements (R-O doesn't address junk).  The same idea is then applied\n// recursively to the pieces of the sequences to the left and to the right\n// of the matching subsequence.  This does not yield minimal edit\n// sequences, but does tend to yield matches that \"look right\" to people.\n//\n// SequenceMatcher tries to compute a \"human-friendly diff\" between two\n// sequences.  Unlike e.g. UNIX(tm) diff, the fundamental notion is the\n// longest *contiguous* & junk-free matching subsequence.  That's what\n// catches peoples' eyes.  The Windows(tm) windiff has another interesting\n// notion, pairing up elements that appear uniquely in each sequence.\n// That, and the method here, appear to yield more intuitive difference\n// reports than does diff.  This method appears to be the least vulnerable\n// to synching up on blocks of \"junk lines\", though (like blank lines in\n// ordinary text files, or maybe \"<P>\" lines in HTML files).  That may be\n// because this is the only method of the 3 that has a *concept* of\n// \"junk\" <wink>.\n//\n// Timing:  Basic R-O is cubic time worst case and quadratic time expected\n// case.  SequenceMatcher is quadratic time for the worst case and has\n// expected-case behavior dependent in a complicated way on how many\n// elements the sequences have in common; best case time is linear.\ntype SequenceMatcher struct {\n\ta              []string\n\tb              []string\n\tb2j            map[string][]int\n\tIsJunk         func(string) bool\n\tautoJunk       bool\n\tbJunk          map[string]struct{}\n\tmatchingBlocks []Match\n\tfullBCount     map[string]int\n\tbPopular       map[string]struct{}\n\topCodes        []OpCode\n}\n\nfunc NewMatcher(a, b []string) *SequenceMatcher {\n\tm := SequenceMatcher{autoJunk: true}\n\tm.SetSeqs(a, b)\n\treturn &m\n}\n\nfunc NewMatcherWithJunk(a, b []string, autoJunk bool,\n\tisJunk func(string) bool) *SequenceMatcher {\n\n\tm := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk}\n\tm.SetSeqs(a, b)\n\treturn &m\n}\n\n// Set two sequences to be compared.\nfunc (m *SequenceMatcher) SetSeqs(a, b []string) {\n\tm.SetSeq1(a)\n\tm.SetSeq2(b)\n}\n\n// Set the first sequence to be compared. The second sequence to be compared is\n// not changed.\n//\n// SequenceMatcher computes and caches detailed information about the second\n// sequence, so if you want to compare one sequence S against many sequences,\n// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other\n// sequences.\n//\n// See also SetSeqs() and SetSeq2().\nfunc (m *SequenceMatcher) SetSeq1(a []string) {\n\tif &a == &m.a {\n\t\treturn\n\t}\n\tm.a = a\n\tm.matchingBlocks = nil\n\tm.opCodes = nil\n}\n\n// Set the second sequence to be compared. The first sequence to be compared is\n// not changed.\nfunc (m *SequenceMatcher) SetSeq2(b []string) {\n\tif &b == &m.b {\n\t\treturn\n\t}\n\tm.b = b\n\tm.matchingBlocks = nil\n\tm.opCodes = nil\n\tm.fullBCount = nil\n\tm.chainB()\n}\n\nfunc (m *SequenceMatcher) chainB() {\n\t// Populate line -> index mapping\n\tb2j := map[string][]int{}\n\tfor i, s := range m.b {\n\t\tindices := b2j[s]\n\t\tindices = append(indices, i)\n\t\tb2j[s] = indices\n\t}\n\n\t// Purge junk elements\n\tm.bJunk = map[string]struct{}{}\n\tif m.IsJunk != nil {\n\t\tjunk := m.bJunk\n\t\tfor s, _ := range b2j {\n\t\t\tif m.IsJunk(s) {\n\t\t\t\tjunk[s] = struct{}{}\n\t\t\t}\n\t\t}\n\t\tfor s, _ := range junk {\n\t\t\tdelete(b2j, s)\n\t\t}\n\t}\n\n\t// Purge remaining popular elements\n\tpopular := map[string]struct{}{}\n\tn := len(m.b)\n\tif m.autoJunk && n >= 200 {\n\t\tntest := n/100 + 1\n\t\tfor s, indices := range b2j {\n\t\t\tif len(indices) > ntest {\n\t\t\t\tpopular[s] = struct{}{}\n\t\t\t}\n\t\t}\n\t\tfor s, _ := range popular {\n\t\t\tdelete(b2j, s)\n\t\t}\n\t}\n\tm.bPopular = popular\n\tm.b2j = b2j\n}\n\nfunc (m *SequenceMatcher) isBJunk(s string) bool {\n\t_, ok := m.bJunk[s]\n\treturn ok\n}\n\n// Find longest matching block in a[alo:ahi] and b[blo:bhi].\n//\n// If IsJunk is not defined:\n//\n// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where\n//     alo <= i <= i+k <= ahi\n//     blo <= j <= j+k <= bhi\n// and for all (i',j',k') meeting those conditions,\n//     k >= k'\n//     i <= i'\n//     and if i == i', j <= j'\n//\n// In other words, of all maximal matching blocks, return one that\n// starts earliest in a, and of all those maximal matching blocks that\n// start earliest in a, return the one that starts earliest in b.\n//\n// If IsJunk is defined, first the longest matching block is\n// determined as above, but with the additional restriction that no\n// junk element appears in the block.  Then that block is extended as\n// far as possible by matching (only) junk elements on both sides.  So\n// the resulting block never matches on junk except as identical junk\n// happens to be adjacent to an \"interesting\" match.\n//\n// If no blocks match, return (alo, blo, 0).\nfunc (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match {\n\t// CAUTION:  stripping common prefix or suffix would be incorrect.\n\t// E.g.,\n\t//    ab\n\t//    acab\n\t// Longest matching block is \"ab\", but if common prefix is\n\t// stripped, it's \"a\" (tied with \"b\").  UNIX(tm) diff does so\n\t// strip, so ends up claiming that ab is changed to acab by\n\t// inserting \"ca\" in the middle.  That's minimal but unintuitive:\n\t// \"it's obvious\" that someone inserted \"ac\" at the front.\n\t// Windiff ends up at the same place as diff, but by pairing up\n\t// the unique 'b's and then matching the first two 'a's.\n\tbesti, bestj, bestsize := alo, blo, 0\n\n\t// find longest junk-free match\n\t// during an iteration of the loop, j2len[j] = length of longest\n\t// junk-free match ending with a[i-1] and b[j]\n\tj2len := map[int]int{}\n\tfor i := alo; i != ahi; i++ {\n\t\t// look at all instances of a[i] in b; note that because\n\t\t// b2j has no junk keys, the loop is skipped if a[i] is junk\n\t\tnewj2len := map[int]int{}\n\t\tfor _, j := range m.b2j[m.a[i]] {\n\t\t\t// a[i] matches b[j]\n\t\t\tif j < blo {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif j >= bhi {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tk := j2len[j-1] + 1\n\t\t\tnewj2len[j] = k\n\t\t\tif k > bestsize {\n\t\t\t\tbesti, bestj, bestsize = i-k+1, j-k+1, k\n\t\t\t}\n\t\t}\n\t\tj2len = newj2len\n\t}\n\n\t// Extend the best by non-junk elements on each end.  In particular,\n\t// \"popular\" non-junk elements aren't in b2j, which greatly speeds\n\t// the inner loop above, but also means \"the best\" match so far\n\t// doesn't contain any junk *or* popular non-junk elements.\n\tfor besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) &&\n\t\tm.a[besti-1] == m.b[bestj-1] {\n\t\tbesti, bestj, bestsize = besti-1, bestj-1, bestsize+1\n\t}\n\tfor besti+bestsize < ahi && bestj+bestsize < bhi &&\n\t\t!m.isBJunk(m.b[bestj+bestsize]) &&\n\t\tm.a[besti+bestsize] == m.b[bestj+bestsize] {\n\t\tbestsize += 1\n\t}\n\n\t// Now that we have a wholly interesting match (albeit possibly\n\t// empty!), we may as well suck up the matching junk on each\n\t// side of it too.  Can't think of a good reason not to, and it\n\t// saves post-processing the (possibly considerable) expense of\n\t// figuring out what to do with it.  In the case of an empty\n\t// interesting match, this is clearly the right thing to do,\n\t// because no other kind of match is possible in the regions.\n\tfor besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) &&\n\t\tm.a[besti-1] == m.b[bestj-1] {\n\t\tbesti, bestj, bestsize = besti-1, bestj-1, bestsize+1\n\t}\n\tfor besti+bestsize < ahi && bestj+bestsize < bhi &&\n\t\tm.isBJunk(m.b[bestj+bestsize]) &&\n\t\tm.a[besti+bestsize] == m.b[bestj+bestsize] {\n\t\tbestsize += 1\n\t}\n\n\treturn Match{A: besti, B: bestj, Size: bestsize}\n}\n\n// Return list of triples describing matching subsequences.\n//\n// Each triple is of the form (i, j, n), and means that\n// a[i:i+n] == b[j:j+n].  The triples are monotonically increasing in\n// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are\n// adjacent triples in the list, and the second is not the last triple in the\n// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe\n// adjacent equal blocks.\n//\n// The last triple is a dummy, (len(a), len(b), 0), and is the only\n// triple with n==0.\nfunc (m *SequenceMatcher) GetMatchingBlocks() []Match {\n\tif m.matchingBlocks != nil {\n\t\treturn m.matchingBlocks\n\t}\n\n\tvar matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match\n\tmatchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match {\n\t\tmatch := m.findLongestMatch(alo, ahi, blo, bhi)\n\t\ti, j, k := match.A, match.B, match.Size\n\t\tif match.Size > 0 {\n\t\t\tif alo < i && blo < j {\n\t\t\t\tmatched = matchBlocks(alo, i, blo, j, matched)\n\t\t\t}\n\t\t\tmatched = append(matched, match)\n\t\t\tif i+k < ahi && j+k < bhi {\n\t\t\t\tmatched = matchBlocks(i+k, ahi, j+k, bhi, matched)\n\t\t\t}\n\t\t}\n\t\treturn matched\n\t}\n\tmatched := matchBlocks(0, len(m.a), 0, len(m.b), nil)\n\n\t// It's possible that we have adjacent equal blocks in the\n\t// matching_blocks list now.\n\tnonAdjacent := []Match{}\n\ti1, j1, k1 := 0, 0, 0\n\tfor _, b := range matched {\n\t\t// Is this block adjacent to i1, j1, k1?\n\t\ti2, j2, k2 := b.A, b.B, b.Size\n\t\tif i1+k1 == i2 && j1+k1 == j2 {\n\t\t\t// Yes, so collapse them -- this just increases the length of\n\t\t\t// the first block by the length of the second, and the first\n\t\t\t// block so lengthened remains the block to compare against.\n\t\t\tk1 += k2\n\t\t} else {\n\t\t\t// Not adjacent.  Remember the first block (k1==0 means it's\n\t\t\t// the dummy we started with), and make the second block the\n\t\t\t// new block to compare against.\n\t\t\tif k1 > 0 {\n\t\t\t\tnonAdjacent = append(nonAdjacent, Match{i1, j1, k1})\n\t\t\t}\n\t\t\ti1, j1, k1 = i2, j2, k2\n\t\t}\n\t}\n\tif k1 > 0 {\n\t\tnonAdjacent = append(nonAdjacent, Match{i1, j1, k1})\n\t}\n\n\tnonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0})\n\tm.matchingBlocks = nonAdjacent\n\treturn m.matchingBlocks\n}\n\n// Return list of 5-tuples describing how to turn a into b.\n//\n// Each tuple is of the form (tag, i1, i2, j1, j2).  The first tuple\n// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the\n// tuple preceding it, and likewise for j1 == the previous j2.\n//\n// The tags are characters, with these meanings:\n//\n// 'r' (replace):  a[i1:i2] should be replaced by b[j1:j2]\n//\n// 'd' (delete):   a[i1:i2] should be deleted, j1==j2 in this case.\n//\n// 'i' (insert):   b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case.\n//\n// 'e' (equal):    a[i1:i2] == b[j1:j2]\nfunc (m *SequenceMatcher) GetOpCodes() []OpCode {\n\tif m.opCodes != nil {\n\t\treturn m.opCodes\n\t}\n\ti, j := 0, 0\n\tmatching := m.GetMatchingBlocks()\n\topCodes := make([]OpCode, 0, len(matching))\n\tfor _, m := range matching {\n\t\t//  invariant:  we've pumped out correct diffs to change\n\t\t//  a[:i] into b[:j], and the next matching block is\n\t\t//  a[ai:ai+size] == b[bj:bj+size]. So we need to pump\n\t\t//  out a diff to change a[i:ai] into b[j:bj], pump out\n\t\t//  the matching block, and move (i,j) beyond the match\n\t\tai, bj, size := m.A, m.B, m.Size\n\t\ttag := byte(0)\n\t\tif i < ai && j < bj {\n\t\t\ttag = 'r'\n\t\t} else if i < ai {\n\t\t\ttag = 'd'\n\t\t} else if j < bj {\n\t\t\ttag = 'i'\n\t\t}\n\t\tif tag > 0 {\n\t\t\topCodes = append(opCodes, OpCode{tag, i, ai, j, bj})\n\t\t}\n\t\ti, j = ai+size, bj+size\n\t\t// the list of matching blocks is terminated by a\n\t\t// sentinel with size 0\n\t\tif size > 0 {\n\t\t\topCodes = append(opCodes, OpCode{'e', ai, i, bj, j})\n\t\t}\n\t}\n\tm.opCodes = opCodes\n\treturn m.opCodes\n}\n\n// Isolate change clusters by eliminating ranges with no changes.\n//\n// Return a generator of groups with up to n lines of context.\n// Each group is in the same format as returned by GetOpCodes().\nfunc (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode {\n\tif n < 0 {\n\t\tn = 3\n\t}\n\tcodes := m.GetOpCodes()\n\tif len(codes) == 0 {\n\t\tcodes = []OpCode{OpCode{'e', 0, 1, 0, 1}}\n\t}\n\t// Fixup leading and trailing groups if they show no changes.\n\tif codes[0].Tag == 'e' {\n\t\tc := codes[0]\n\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\tcodes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2}\n\t}\n\tif codes[len(codes)-1].Tag == 'e' {\n\t\tc := codes[len(codes)-1]\n\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\tcodes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)}\n\t}\n\tnn := n + n\n\tgroups := [][]OpCode{}\n\tgroup := []OpCode{}\n\tfor _, c := range codes {\n\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\t// End the current group and start a new one whenever\n\t\t// there is a large range with no changes.\n\t\tif c.Tag == 'e' && i2-i1 > nn {\n\t\t\tgroup = append(group, OpCode{c.Tag, i1, min(i2, i1+n),\n\t\t\t\tj1, min(j2, j1+n)})\n\t\t\tgroups = append(groups, group)\n\t\t\tgroup = []OpCode{}\n\t\t\ti1, j1 = max(i1, i2-n), max(j1, j2-n)\n\t\t}\n\t\tgroup = append(group, OpCode{c.Tag, i1, i2, j1, j2})\n\t}\n\tif len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') {\n\t\tgroups = append(groups, group)\n\t}\n\treturn groups\n}\n\n// Return a measure of the sequences' similarity (float in [0,1]).\n//\n// Where T is the total number of elements in both sequences, and\n// M is the number of matches, this is 2.0*M / T.\n// Note that this is 1 if the sequences are identical, and 0 if\n// they have nothing in common.\n//\n// .Ratio() is expensive to compute if you haven't already computed\n// .GetMatchingBlocks() or .GetOpCodes(), in which case you may\n// want to try .QuickRatio() or .RealQuickRation() first to get an\n// upper bound.\nfunc (m *SequenceMatcher) Ratio() float64 {\n\tmatches := 0\n\tfor _, m := range m.GetMatchingBlocks() {\n\t\tmatches += m.Size\n\t}\n\treturn calculateRatio(matches, len(m.a)+len(m.b))\n}\n\n// Return an upper bound on ratio() relatively quickly.\n//\n// This isn't defined beyond that it is an upper bound on .Ratio(), and\n// is faster to compute.\nfunc (m *SequenceMatcher) QuickRatio() float64 {\n\t// viewing a and b as multisets, set matches to the cardinality\n\t// of their intersection; this counts the number of matches\n\t// without regard to order, so is clearly an upper bound\n\tif m.fullBCount == nil {\n\t\tm.fullBCount = map[string]int{}\n\t\tfor _, s := range m.b {\n\t\t\tm.fullBCount[s] = m.fullBCount[s] + 1\n\t\t}\n\t}\n\n\t// avail[x] is the number of times x appears in 'b' less the\n\t// number of times we've seen it in 'a' so far ... kinda\n\tavail := map[string]int{}\n\tmatches := 0\n\tfor _, s := range m.a {\n\t\tn, ok := avail[s]\n\t\tif !ok {\n\t\t\tn = m.fullBCount[s]\n\t\t}\n\t\tavail[s] = n - 1\n\t\tif n > 0 {\n\t\t\tmatches += 1\n\t\t}\n\t}\n\treturn calculateRatio(matches, len(m.a)+len(m.b))\n}\n\n// Return an upper bound on ratio() very quickly.\n//\n// This isn't defined beyond that it is an upper bound on .Ratio(), and\n// is faster to compute than either .Ratio() or .QuickRatio().\nfunc (m *SequenceMatcher) RealQuickRatio() float64 {\n\tla, lb := len(m.a), len(m.b)\n\treturn calculateRatio(min(la, lb), la+lb)\n}\n\n// Convert range to the \"ed\" format\nfunc formatRangeUnified(start, stop int) string {\n\t// Per the diff spec at http://www.unix.org/single_unix_specification/\n\tbeginning := start + 1 // lines start numbering with one\n\tlength := stop - start\n\tif length == 1 {\n\t\treturn fmt.Sprintf(\"%d\", beginning)\n\t}\n\tif length == 0 {\n\t\tbeginning -= 1 // empty ranges begin at line just before the range\n\t}\n\treturn fmt.Sprintf(\"%d,%d\", beginning, length)\n}\n\n// Unified diff parameters\ntype UnifiedDiff struct {\n\tA        []string // First sequence lines\n\tFromFile string   // First file name\n\tFromDate string   // First file time\n\tB        []string // Second sequence lines\n\tToFile   string   // Second file name\n\tToDate   string   // Second file time\n\tEol      string   // Headers end of line, defaults to LF\n\tContext  int      // Number of context lines\n}\n\n// Compare two sequences of lines; generate the delta as a unified diff.\n//\n// Unified diffs are a compact way of showing line changes and a few\n// lines of context.  The number of context lines is set by 'n' which\n// defaults to three.\n//\n// By default, the diff control lines (those with ---, +++, or @@) are\n// created with a trailing newline.  This is helpful so that inputs\n// created from file.readlines() result in diffs that are suitable for\n// file.writelines() since both the inputs and outputs have trailing\n// newlines.\n//\n// For inputs that do not have trailing newlines, set the lineterm\n// argument to \"\" so that the output will be uniformly newline free.\n//\n// The unidiff format normally has a header for filenames and modification\n// times.  Any or all of these may be specified using strings for\n// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.\n// The modification times are normally expressed in the ISO 8601 format.\nfunc WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error {\n\tbuf := bufio.NewWriter(writer)\n\tdefer buf.Flush()\n\twf := func(format string, args ...interface{}) error {\n\t\t_, err := buf.WriteString(fmt.Sprintf(format, args...))\n\t\treturn err\n\t}\n\tws := func(s string) error {\n\t\t_, err := buf.WriteString(s)\n\t\treturn err\n\t}\n\n\tif len(diff.Eol) == 0 {\n\t\tdiff.Eol = \"\\n\"\n\t}\n\n\tstarted := false\n\tm := NewMatcher(diff.A, diff.B)\n\tfor _, g := range m.GetGroupedOpCodes(diff.Context) {\n\t\tif !started {\n\t\t\tstarted = true\n\t\t\tfromDate := \"\"\n\t\t\tif len(diff.FromDate) > 0 {\n\t\t\t\tfromDate = \"\\t\" + diff.FromDate\n\t\t\t}\n\t\t\ttoDate := \"\"\n\t\t\tif len(diff.ToDate) > 0 {\n\t\t\t\ttoDate = \"\\t\" + diff.ToDate\n\t\t\t}\n\t\t\tif diff.FromFile != \"\" || diff.ToFile != \"\" {\n\t\t\t\terr := wf(\"--- %s%s%s\", diff.FromFile, fromDate, diff.Eol)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\terr = wf(\"+++ %s%s%s\", diff.ToFile, toDate, diff.Eol)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfirst, last := g[0], g[len(g)-1]\n\t\trange1 := formatRangeUnified(first.I1, last.I2)\n\t\trange2 := formatRangeUnified(first.J1, last.J2)\n\t\tif err := wf(\"@@ -%s +%s @@%s\", range1, range2, diff.Eol); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, c := range g {\n\t\t\ti1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2\n\t\t\tif c.Tag == 'e' {\n\t\t\t\tfor _, line := range diff.A[i1:i2] {\n\t\t\t\t\tif err := ws(\" \" + line); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif c.Tag == 'r' || c.Tag == 'd' {\n\t\t\t\tfor _, line := range diff.A[i1:i2] {\n\t\t\t\t\tif err := ws(\"-\" + line); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif c.Tag == 'r' || c.Tag == 'i' {\n\t\t\t\tfor _, line := range diff.B[j1:j2] {\n\t\t\t\t\tif err := ws(\"+\" + line); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// Like WriteUnifiedDiff but returns the diff a string.\nfunc GetUnifiedDiffString(diff UnifiedDiff) (string, error) {\n\tw := &bytes.Buffer{}\n\terr := WriteUnifiedDiff(w, diff)\n\treturn string(w.Bytes()), err\n}\n\n// Convert range to the \"ed\" format.\nfunc formatRangeContext(start, stop int) string {\n\t// Per the diff spec at http://www.unix.org/single_unix_specification/\n\tbeginning := start + 1 // lines start numbering with one\n\tlength := stop - start\n\tif length == 0 {\n\t\tbeginning -= 1 // empty ranges begin at line just before the range\n\t}\n\tif length <= 1 {\n\t\treturn fmt.Sprintf(\"%d\", beginning)\n\t}\n\treturn fmt.Sprintf(\"%d,%d\", beginning, beginning+length-1)\n}\n\ntype ContextDiff UnifiedDiff\n\n// Compare two sequences of lines; generate the delta as a context diff.\n//\n// Context diffs are a compact way of showing line changes and a few\n// lines of context. The number of context lines is set by diff.Context\n// which defaults to three.\n//\n// By default, the diff control lines (those with *** or ---) are\n// created with a trailing newline.\n//\n// For inputs that do not have trailing newlines, set the diff.Eol\n// argument to \"\" so that the output will be uniformly newline free.\n//\n// The context diff format normally has a header for filenames and\n// modification times.  Any or all of these may be specified using\n// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate.\n// The modification times are normally expressed in the ISO 8601 format.\n// If not specified, the strings default to blanks.\nfunc WriteContextDiff(writer io.Writer, diff ContextDiff) error {\n\tbuf := bufio.NewWriter(writer)\n\tdefer buf.Flush()\n\tvar diffErr error\n\twf := func(format string, args ...interface{}) {\n\t\t_, err := buf.WriteString(fmt.Sprintf(format, args...))\n\t\tif diffErr == nil && err != nil {\n\t\t\tdiffErr = err\n\t\t}\n\t}\n\tws := func(s string) {\n\t\t_, err := buf.WriteString(s)\n\t\tif diffErr == nil && err != nil {\n\t\t\tdiffErr = err\n\t\t}\n\t}\n\n\tif len(diff.Eol) == 0 {\n\t\tdiff.Eol = \"\\n\"\n\t}\n\n\tprefix := map[byte]string{\n\t\t'i': \"+ \",\n\t\t'd': \"- \",\n\t\t'r': \"! \",\n\t\t'e': \"  \",\n\t}\n\n\tstarted := false\n\tm := NewMatcher(diff.A, diff.B)\n\tfor _, g := range m.GetGroupedOpCodes(diff.Context) {\n\t\tif !started {\n\t\t\tstarted = true\n\t\t\tfromDate := \"\"\n\t\t\tif len(diff.FromDate) > 0 {\n\t\t\t\tfromDate = \"\\t\" + diff.FromDate\n\t\t\t}\n\t\t\ttoDate := \"\"\n\t\t\tif len(diff.ToDate) > 0 {\n\t\t\t\ttoDate = \"\\t\" + diff.ToDate\n\t\t\t}\n\t\t\tif diff.FromFile != \"\" || diff.ToFile != \"\" {\n\t\t\t\twf(\"*** %s%s%s\", diff.FromFile, fromDate, diff.Eol)\n\t\t\t\twf(\"--- %s%s%s\", diff.ToFile, toDate, diff.Eol)\n\t\t\t}\n\t\t}\n\n\t\tfirst, last := g[0], g[len(g)-1]\n\t\tws(\"***************\" + diff.Eol)\n\n\t\trange1 := formatRangeContext(first.I1, last.I2)\n\t\twf(\"*** %s ****%s\", range1, diff.Eol)\n\t\tfor _, c := range g {\n\t\t\tif c.Tag == 'r' || c.Tag == 'd' {\n\t\t\t\tfor _, cc := range g {\n\t\t\t\t\tif cc.Tag == 'i' {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tfor _, line := range diff.A[cc.I1:cc.I2] {\n\t\t\t\t\t\tws(prefix[cc.Tag] + line)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\trange2 := formatRangeContext(first.J1, last.J2)\n\t\twf(\"--- %s ----%s\", range2, diff.Eol)\n\t\tfor _, c := range g {\n\t\t\tif c.Tag == 'r' || c.Tag == 'i' {\n\t\t\t\tfor _, cc := range g {\n\t\t\t\t\tif cc.Tag == 'd' {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tfor _, line := range diff.B[cc.J1:cc.J2] {\n\t\t\t\t\t\tws(prefix[cc.Tag] + line)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn diffErr\n}\n\n// Like WriteContextDiff but returns the diff a string.\nfunc GetContextDiffString(diff ContextDiff) (string, error) {\n\tw := &bytes.Buffer{}\n\terr := WriteContextDiff(w, diff)\n\treturn string(w.Bytes()), err\n}\n\n// Split a string on \"\\n\" while preserving them. The output can be used\n// as input for UnifiedDiff and ContextDiff structures.\nfunc SplitLines(s string) []string {\n\tlines := strings.SplitAfter(s, \"\\n\")\n\tlines[len(lines)-1] += \"\\n\"\n\treturn lines\n}\n"
  },
  {
    "path": "vendor/github.com/prometheus/prometheus/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/prometheus/prometheus/NOTICE",
    "content": "The Prometheus systems and service monitoring server\nCopyright 2012-2015 The Prometheus Authors\n\nThis product includes software developed at\nSoundCloud Ltd. (http://soundcloud.com/).\n\n\nThe following components are included in this product:\n\nBootstrap\nhttp://getbootstrap.com\nCopyright 2011-2014 Twitter, Inc.\nLicensed under the MIT License\n\nbootstrap3-typeahead.js\nhttps://github.com/bassjobsen/Bootstrap-3-Typeahead\nOriginal written by @mdo and @fat\nCopyright 2014 Bass Jobsen @bassjobsen\nLicensed under the Apache License, Version 2.0\n\nfuzzy\nhttps://github.com/mattyork/fuzzy\nOriginal written by @mattyork\nCopyright 2012 Matt York\nLicensed under the MIT License\n\nbootstrap-datetimepicker.js\nhttps://github.com/Eonasdan/bootstrap-datetimepicker\nCopyright 2015 Jonathan Peterson (@Eonasdan)\nLicensed under the MIT License\n\nmoment.js\nhttps://github.com/moment/moment/\nCopyright JS Foundation and other contributors\nLicensed under the MIT License\n\nRickshaw\nhttps://github.com/shutterstock/rickshaw\nCopyright 2011-2014 by Shutterstock Images, LLC\nSee https://github.com/shutterstock/rickshaw/blob/master/LICENSE for license details\n\nmustache.js\nhttps://github.com/janl/mustache.js\nCopyright 2009 Chris Wanstrath (Ruby)\nCopyright 2010-2014 Jan Lehnardt (JavaScript)\nCopyright 2010-2015 The mustache.js community\nLicensed under the MIT License\n\njQuery\nhttps://jquery.org\nCopyright jQuery Foundation and other contributors\nLicensed under the MIT License\n\nGo support for Protocol Buffers - Google's data interchange format\nhttp://github.com/golang/protobuf/\nCopyright 2010 The Go Authors\nSee source code for license details.\n\nGo support for leveled logs, analogous to\nhttps://code.google.com/p/google-glog/\nCopyright 2013 Google Inc.\nLicensed under the Apache License, Version 2.0\n\nSupport for streaming Protocol Buffer messages for the Go language (golang).\nhttps://github.com/matttproud/golang_protobuf_extensions\nCopyright 2013 Matt T. Proud\nLicensed under the Apache License, Version 2.0\n\nDNS library in Go\nhttp://miek.nl/posts/2014/Aug/16/go-dns-package/\nCopyright 2009 The Go Authors, 2011 Miek Gieben\nSee https://github.com/miekg/dns/blob/master/LICENSE for license details.\n\nLevelDB key/value database in Go\nhttps://github.com/syndtr/goleveldb\nCopyright 2012 Suryandaru Triandana\nSee https://github.com/syndtr/goleveldb/blob/master/LICENSE for license details.\n\ngosnappy - a fork of code.google.com/p/snappy-go\nhttps://github.com/syndtr/gosnappy\nCopyright 2011 The Snappy-Go Authors\nSee https://github.com/syndtr/gosnappy/blob/master/LICENSE for license details.\n\ngo-zookeeper - Native ZooKeeper client for Go\nhttps://github.com/samuel/go-zookeeper\nCopyright (c) 2013, Samuel Stauffer <samuel@descolada.com>\nSee https://github.com/samuel/go-zookeeper/blob/master/LICENSE for license details.\n"
  },
  {
    "path": "vendor/github.com/prometheus/prometheus/util/flock/flock.go",
    "content": "// Copyright 2016 The Prometheus Authors\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// Package flock provides portable file locking. It is essentially ripped out\n// from the code of github.com/syndtr/goleveldb. Strange enough that the\n// standard library does not provide this functionality. Once this package has\n// proven to work as expected, we should probably turn it into a separate\n// general purpose package for humanity.\npackage flock\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n)\n\n// Releaser provides the Release method to release a file lock.\ntype Releaser interface {\n\tRelease() error\n}\n\n// New locks the file with the provided name. If the file does not exist, it is\n// created. The returned Releaser is used to release the lock. existed is true\n// if the file to lock already existed. A non-nil error is returned if the\n// locking has failed. Neither this function nor the returned Releaser is\n// goroutine-safe.\nfunc New(fileName string) (r Releaser, existed bool, err error) {\n\tif err = os.MkdirAll(filepath.Dir(fileName), 0755); err != nil {\n\t\treturn\n\t}\n\n\t_, err = os.Stat(fileName)\n\texisted = err == nil\n\n\tr, err = newLock(fileName)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go",
    "content": "// Copyright 2016 The Prometheus Authors\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\npackage flock\n\nimport \"os\"\n\ntype plan9Lock struct {\n\tf *os.File\n}\n\nfunc (l *plan9Lock) Release() error {\n\treturn l.f.Close()\n}\n\nfunc newLock(fileName string) (Releaser, error) {\n\tf, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, os.ModeExclusive|0644)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &plan9Lock{f}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go",
    "content": "// Copyright 2016 The Prometheus Authors\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// +build solaris\n\npackage flock\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\ntype unixLock struct {\n\tf *os.File\n}\n\nfunc (l *unixLock) Release() error {\n\tif err := l.set(false); err != nil {\n\t\treturn err\n\t}\n\treturn l.f.Close()\n}\n\nfunc (l *unixLock) set(lock bool) error {\n\tflock := syscall.Flock_t{\n\t\tType:   syscall.F_UNLCK,\n\t\tStart:  0,\n\t\tLen:    0,\n\t\tWhence: 1,\n\t}\n\tif lock {\n\t\tflock.Type = syscall.F_WRLCK\n\t}\n\treturn syscall.FcntlFlock(l.f.Fd(), syscall.F_SETLK, &flock)\n}\n\nfunc newLock(fileName string) (Releaser, error) {\n\tf, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0644)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tl := &unixLock{f}\n\terr = l.set(true)\n\tif err != nil {\n\t\tf.Close()\n\t\treturn nil, err\n\t}\n\treturn l, nil\n}\n"
  },
  {
    "path": "vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go",
    "content": "// Copyright 2016 The Prometheus Authors\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// +build darwin dragonfly freebsd linux netbsd openbsd\n\npackage flock\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\ntype unixLock struct {\n\tf *os.File\n}\n\nfunc (l *unixLock) Release() error {\n\tif err := l.set(false); err != nil {\n\t\treturn err\n\t}\n\treturn l.f.Close()\n}\n\nfunc (l *unixLock) set(lock bool) error {\n\thow := syscall.LOCK_UN\n\tif lock {\n\t\thow = syscall.LOCK_EX\n\t}\n\treturn syscall.Flock(int(l.f.Fd()), how|syscall.LOCK_NB)\n}\n\nfunc newLock(fileName string) (Releaser, error) {\n\tf, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0644)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tl := &unixLock{f}\n\terr = l.set(true)\n\tif err != nil {\n\t\tf.Close()\n\t\treturn nil, err\n\t}\n\treturn l, nil\n}\n"
  },
  {
    "path": "vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go",
    "content": "// Copyright 2016 The Prometheus Authors\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\npackage flock\n\nimport \"syscall\"\n\ntype windowsLock struct {\n\tfd syscall.Handle\n}\n\nfunc (fl *windowsLock) Release() error {\n\treturn syscall.Close(fl.fd)\n}\n\nfunc newLock(fileName string) (Releaser, error) {\n\tpathp, err := syscall.UTF16PtrFromString(fileName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfd, err := syscall.CreateFile(pathp, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0, nil, syscall.CREATE_ALWAYS, syscall.FILE_ATTRIBUTE_NORMAL, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &windowsLock{fd}, nil\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/AUTHORS",
    "content": "# List of individuals who contributed to the Notify package.\n#\n# The up-to-date list of the authors one may obtain with:\n#\n#   ~ $ git shortlog -es | cut -f2 | rev | uniq -f1 | rev\n#\n\nPawel Blaszczyk <blaszczykpb@gmail.com>\nPawel Knap      <pawelknap88@gmail.com>\nRafal Jeczalik  <rjeczalik@gmail.com>\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014-2015 The Notify Authors\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": "vendor/github.com/rjeczalik/notify/README.md",
    "content": "notify [![GoDoc](https://godoc.org/github.com/rjeczalik/notify?status.svg)](https://godoc.org/github.com/rjeczalik/notify) [![Build Status](https://img.shields.io/travis/rjeczalik/notify/master.svg)](https://travis-ci.org/rjeczalik/notify \"inotify + FSEvents + kqueue\") [![Build status](https://img.shields.io/appveyor/ci/rjeczalik/notify-246.svg)](https://ci.appveyor.com/project/rjeczalik/notify-246 \"ReadDirectoryChangesW\") [![Coverage Status](https://img.shields.io/coveralls/rjeczalik/notify/master.svg)](https://coveralls.io/r/rjeczalik/notify?branch=master)\n======\n\nFilesystem event notification library on steroids. (under active development)\n\n*Documentation*\n\n[godoc.org/github.com/rjeczalik/notify](https://godoc.org/github.com/rjeczalik/notify)\n\n*Installation*\n\n```\n~ $ go get -u github.com/rjeczalik/notify\n```\n\n*Projects using notify*\n\n- [github.com/rjeczalik/cmd/notify](https://godoc.org/github.com/rjeczalik/cmd/notify)\n- [github.com/cortesi/devd](https://github.com/cortesi/devd)\n- [github.com/cortesi/modd](https://github.com/cortesi/modd)\n- [github.com/syncthing/syncthing-inotify](https://github.com/syncthing/syncthing-inotify)\n- [github.com/OrlovEvgeny/TinyJPG](https://github.com/OrlovEvgeny/TinyJPG)\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/appveyor.yml",
    "content": "version: \"{build}\"\n\nos: Windows Server 2012 R2\n\nclone_folder: c:\\projects\\src\\github.com\\rjeczalik\\notify\n\nenvironment:\n PATH: c:\\projects\\bin;%PATH%\n GOPATH: c:\\projects\n NOTIFY_TIMEOUT: 10s\n GOVERSION: 1.10.3\n\ninstall:\n - rmdir c:\\go /s /q\n - appveyor DownloadFile https://storage.googleapis.com/golang/go%GOVERSION%.windows-amd64.zip\n - 7z x go%GOVERSION%.windows-amd64.zip -y -oC:\\ > NUL\n\n - cd %APPVEYOR_BUILD_FOLDER%\n - go version\n\nbuild_script:\n - go build ./...\n - go test -v -timeout 120s -race ./...\n\ntest: off\n\ndeploy: off\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/debug.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n)\n\nvar dbgprint func(...interface{})\n\nvar dbgprintf func(string, ...interface{})\n\nvar dbgcallstack func(max int) []string\n\nfunc init() {\n\tif _, ok := os.LookupEnv(\"NOTIFY_DEBUG\"); ok || debugTag {\n\t\tlog.SetOutput(os.Stdout)\n\t\tlog.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)\n\t\tdbgprint = func(v ...interface{}) {\n\t\t\tv = append([]interface{}{\"[D] \"}, v...)\n\t\t\tlog.Println(v...)\n\t\t}\n\t\tdbgprintf = func(format string, v ...interface{}) {\n\t\t\tformat = \"[D] \" + format\n\t\t\tlog.Printf(format, v...)\n\t\t}\n\t\tdbgcallstack = func(max int) []string {\n\t\t\tpc, stack := make([]uintptr, max), make([]string, 0, max)\n\t\t\truntime.Callers(2, pc)\n\t\t\tfor _, pc := range pc {\n\t\t\t\tif f := runtime.FuncForPC(pc); f != nil {\n\t\t\t\t\tfname := f.Name()\n\t\t\t\t\tidx := strings.LastIndex(fname, string(os.PathSeparator))\n\t\t\t\t\tif idx != -1 {\n\t\t\t\t\t\tstack = append(stack, fname[idx+1:])\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstack = append(stack, fname)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn stack\n\t\t}\n\t\treturn\n\t}\n\tdbgprint = func(v ...interface{}) {}\n\tdbgprintf = func(format string, v ...interface{}) {}\n\tdbgcallstack = func(max int) []string { return nil }\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/debug_debug.go",
    "content": "// Copyright (c) 2014-2018 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build debug\n\npackage notify\n\nvar debugTag = true\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/debug_nodebug.go",
    "content": "// Copyright (c) 2014-2018 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build !debug\n\npackage notify\n\nvar debugTag = false\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/doc.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// Package notify implements access to filesystem events.\n//\n// Notify is a high-level abstraction over filesystem watchers like inotify,\n// kqueue, FSEvents, FEN or ReadDirectoryChangesW. Watcher implementations are\n// split into two groups: ones that natively support recursive notifications\n// (FSEvents and ReadDirectoryChangesW) and ones that do not (inotify, kqueue, FEN).\n// For more details see watcher and recursiveWatcher interfaces in watcher.go\n// source file.\n//\n// On top of filesystem watchers notify maintains a watchpoint tree, which provides\n// a strategy for creating and closing filesystem watches and dispatching filesystem\n// events to user channels.\n//\n// An event set is just an event list joint using bitwise OR operator\n// into a single event value.\n// Both the platform-independent (see Constants) and specific events can be used.\n// Refer to the event_*.go source files for information about the available\n// events.\n//\n// A filesystem watch or just a watch is platform-specific entity which represents\n// a single path registered for notifications for specific event set. Setting a watch\n// means using platform-specific API calls for creating / initializing said watch.\n// For each watcher the API call is:\n//\n//   - FSEvents: FSEventStreamCreate\n//   - inotify:  notify_add_watch\n//   - kqueue:   kevent\n//   - ReadDirectoryChangesW: CreateFile+ReadDirectoryChangesW\n//   - FEN:      port_get\n//\n// To rewatch means to either shrink or expand an event set that was previously\n// registered during watch operation for particular filesystem watch.\n//\n// A watchpoint is a list of user channel and event set pairs for particular\n// path (watchpoint tree's node). A single watchpoint can contain multiple\n// different user channels registered to listen for one or more events. A single\n// user channel can be registered in one or more watchpoints, recursive and\n// non-recursive ones as well.\npackage notify\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\n// Event represents the type of filesystem action.\n//\n// Number of available event values is dependent on the target system or the\n// watcher implmenetation used (e.g. it's possible to use either kqueue or\n// FSEvents on Darwin).\n//\n// Please consult documentation for your target platform to see list of all\n// available events.\ntype Event uint32\n\n// Create, Remove, Write and Rename are the only event values guaranteed to be\n// present on all platforms.\nconst (\n\tCreate = osSpecificCreate\n\tRemove = osSpecificRemove\n\tWrite  = osSpecificWrite\n\tRename = osSpecificRename\n\n\t// All is handful alias for all platform-independent event values.\n\tAll = Create | Remove | Write | Rename\n)\n\nconst internal = recursive | omit\n\n// String implements fmt.Stringer interface.\nfunc (e Event) String() string {\n\tvar s []string\n\tfor _, strmap := range []map[Event]string{estr, osestr} {\n\t\tfor ev, str := range strmap {\n\t\t\tif e&ev == ev {\n\t\t\t\ts = append(s, str)\n\t\t\t}\n\t\t}\n\t}\n\treturn strings.Join(s, \"|\")\n}\n\n// EventInfo describes an event reported by the underlying filesystem notification\n// subsystem.\n//\n// It always describes single event, even if the OS reported a coalesced action.\n// Reported path is absolute and clean.\n//\n// For non-recursive watchpoints its base is always equal to the path passed\n// to corresponding Watch call.\n//\n// The value of Sys if system-dependent and can be nil.\n//\n// Sys\n//\n// Under Darwin (FSEvents) Sys() always returns a non-nil *notify.FSEvent value,\n// which is defined as:\n//\n//   type FSEvent struct {\n//       Path  string // real path of the file or directory\n//       ID    uint64 // ID of the event (FSEventStreamEventId)\n//       Flags uint32 // joint FSEvents* flags (FSEventStreamEventFlags)\n//   }\n//\n// For possible values of Flags see Darwin godoc for notify or FSEvents\n// documentation for FSEventStreamEventFlags constants:\n//\n//    https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/index.html#//apple_ref/doc/constant_group/FSEventStreamEventFlags\n//\n// Under Linux (inotify) Sys() always returns a non-nil *unix.InotifyEvent\n// value, defined as:\n//\n//   type InotifyEvent struct {\n//       Wd     int32    // Watch descriptor\n//       Mask   uint32   // Mask describing event\n//       Cookie uint32   // Unique cookie associating related events (for rename(2))\n//       Len    uint32   // Size of name field\n//       Name   [0]uint8 // Optional null-terminated name\n//   }\n//\n// More information about inotify masks and the usage of inotify_event structure\n// can be found at:\n//\n//    http://man7.org/linux/man-pages/man7/inotify.7.html\n//\n// Under Darwin, DragonFlyBSD, FreeBSD, NetBSD, OpenBSD (kqueue) Sys() always\n// returns a non-nil *notify.Kevent value, which is defined as:\n//\n//   type Kevent struct {\n//       Kevent *syscall.Kevent_t // Kevent is a kqueue specific structure\n//       FI     os.FileInfo       // FI describes file/dir\n//   }\n//\n// More information about syscall.Kevent_t can be found at:\n//\n//    https://www.freebsd.org/cgi/man.cgi?query=kqueue\n//\n// Under Windows (ReadDirectoryChangesW) Sys() always returns nil. The documentation\n// of watcher's WinAPI function can be found at:\n//\n//    https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx\ntype EventInfo interface {\n\tEvent() Event     // event value for the filesystem action\n\tPath() string     // real path of the file or directory\n\tSys() interface{} // underlying data source (can return nil)\n}\n\ntype isDirer interface {\n\tisDir() (bool, error)\n}\n\nvar _ fmt.Stringer = (*event)(nil)\nvar _ isDirer = (*event)(nil)\n\n// String implements fmt.Stringer interface.\nfunc (e *event) String() string {\n\treturn e.Event().String() + `: \"` + e.Path() + `\"`\n}\n\nvar estr = map[Event]string{\n\tCreate: \"notify.Create\",\n\tRemove: \"notify.Remove\",\n\tWrite:  \"notify.Write\",\n\tRename: \"notify.Rename\",\n\t// Display name for recursive event is added only for debugging\n\t// purposes. It's an internal event after all and won't be exposed to the\n\t// user. Having Recursive event printable is helpful, e.g. for reading\n\t// testing failure messages:\n\t//\n\t//    --- FAIL: TestWatchpoint (0.00 seconds)\n\t//    watchpoint_test.go:64: want diff=[notify.Remove notify.Create|notify.Remove];\n\t//    got [notify.Remove notify.Remove|notify.Create] (i=1)\n\t//\n\t// Yup, here the diff have Recursive event inside. Go figure.\n\trecursive: \"recursive\",\n\tomit:      \"omit\",\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event_fen.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build solaris\n\npackage notify\n\nconst (\n\tosSpecificCreate Event = 0x00000100 << iota\n\tosSpecificRemove\n\tosSpecificWrite\n\tosSpecificRename\n\t// internal\n\t// recursive is used to distinguish recursive eventsets from non-recursive ones\n\trecursive\n\t// omit is used for dispatching internal events; only those events are sent\n\t// for which both the event and the watchpoint has omit in theirs event sets.\n\tomit\n)\n\nconst (\n\t// FileAccess is an event reported when monitored file/directory was accessed.\n\tFileAccess = fileAccess\n\t// FileModified is an event reported when monitored file/directory was modified.\n\tFileModified = fileModified\n\t// FileAttrib is an event reported when monitored file/directory's ATTRIB\n\t// was changed.\n\tFileAttrib = fileAttrib\n\t// FileDelete is an event reported when monitored file/directory was deleted.\n\tFileDelete = fileDelete\n\t// FileRenameTo to is an event reported when monitored file/directory was renamed.\n\tFileRenameTo = fileRenameTo\n\t// FileRenameFrom is an event reported when monitored file/directory was renamed.\n\tFileRenameFrom = fileRenameFrom\n\t// FileTrunc is an event reported when monitored file/directory was truncated.\n\tFileTrunc = fileTrunc\n\t// FileNoFollow is an flag to indicate not to follow symbolic links.\n\tFileNoFollow = fileNoFollow\n\t// Unmounted is an event reported when monitored filesystem was unmounted.\n\tUnmounted = unmounted\n\t// MountedOver is an event reported when monitored file/directory was mounted on.\n\tMountedOver = mountedOver\n)\n\nvar osestr = map[Event]string{\n\tFileAccess:     \"notify.FileAccess\",\n\tFileModified:   \"notify.FileModified\",\n\tFileAttrib:     \"notify.FileAttrib\",\n\tFileDelete:     \"notify.FileDelete\",\n\tFileRenameTo:   \"notify.FileRenameTo\",\n\tFileRenameFrom: \"notify.FileRenameFrom\",\n\tFileTrunc:      \"notify.FileTrunc\",\n\tFileNoFollow:   \"notify.FileNoFollow\",\n\tUnmounted:      \"notify.Unmounted\",\n\tMountedOver:    \"notify.MountedOver\",\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event_fsevents.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build darwin,!kqueue\n\npackage notify\n\nconst (\n\tosSpecificCreate = Event(FSEventsCreated)\n\tosSpecificRemove = Event(FSEventsRemoved)\n\tosSpecificWrite  = Event(FSEventsModified)\n\tosSpecificRename = Event(FSEventsRenamed)\n\t// internal = Event(0x100000)\n\t// recursive is used to distinguish recursive eventsets from non-recursive ones\n\trecursive = Event(0x200000)\n\t// omit is used for dispatching internal events; only those events are sent\n\t// for which both the event and the watchpoint has omit in theirs event sets.\n\tomit = Event(0x400000)\n)\n\n// FSEvents specific event values.\nconst (\n\tFSEventsMustScanSubDirs Event = 0x00001\n\tFSEventsUserDropped           = 0x00002\n\tFSEventsKernelDropped         = 0x00004\n\tFSEventsEventIdsWrapped       = 0x00008\n\tFSEventsHistoryDone           = 0x00010\n\tFSEventsRootChanged           = 0x00020\n\tFSEventsMount                 = 0x00040\n\tFSEventsUnmount               = 0x00080\n\tFSEventsCreated               = 0x00100\n\tFSEventsRemoved               = 0x00200\n\tFSEventsInodeMetaMod          = 0x00400\n\tFSEventsRenamed               = 0x00800\n\tFSEventsModified              = 0x01000\n\tFSEventsFinderInfoMod         = 0x02000\n\tFSEventsChangeOwner           = 0x04000\n\tFSEventsXattrMod              = 0x08000\n\tFSEventsIsFile                = 0x10000\n\tFSEventsIsDir                 = 0x20000\n\tFSEventsIsSymlink             = 0x40000\n)\n\nvar osestr = map[Event]string{\n\tFSEventsMustScanSubDirs: \"notify.FSEventsMustScanSubDirs\",\n\tFSEventsUserDropped:     \"notify.FSEventsUserDropped\",\n\tFSEventsKernelDropped:   \"notify.FSEventsKernelDropped\",\n\tFSEventsEventIdsWrapped: \"notify.FSEventsEventIdsWrapped\",\n\tFSEventsHistoryDone:     \"notify.FSEventsHistoryDone\",\n\tFSEventsRootChanged:     \"notify.FSEventsRootChanged\",\n\tFSEventsMount:           \"notify.FSEventsMount\",\n\tFSEventsUnmount:         \"notify.FSEventsUnmount\",\n\tFSEventsInodeMetaMod:    \"notify.FSEventsInodeMetaMod\",\n\tFSEventsFinderInfoMod:   \"notify.FSEventsFinderInfoMod\",\n\tFSEventsChangeOwner:     \"notify.FSEventsChangeOwner\",\n\tFSEventsXattrMod:        \"notify.FSEventsXattrMod\",\n\tFSEventsIsFile:          \"notify.FSEventsIsFile\",\n\tFSEventsIsDir:           \"notify.FSEventsIsDir\",\n\tFSEventsIsSymlink:       \"notify.FSEventsIsSymlink\",\n}\n\ntype event struct {\n\tfse   FSEvent\n\tevent Event\n}\n\nfunc (ei *event) Event() Event         { return ei.event }\nfunc (ei *event) Path() string         { return ei.fse.Path }\nfunc (ei *event) Sys() interface{}     { return &ei.fse }\nfunc (ei *event) isDir() (bool, error) { return ei.fse.Flags&FSEventsIsDir != 0, nil }\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event_inotify.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build linux\n\npackage notify\n\nimport \"golang.org/x/sys/unix\"\n\n// Platform independent event values.\nconst (\n\tosSpecificCreate Event = 0x100000 << iota\n\tosSpecificRemove\n\tosSpecificWrite\n\tosSpecificRename\n\t// internal\n\t// recursive is used to distinguish recursive eventsets from non-recursive ones\n\trecursive\n\t// omit is used for dispatching internal events; only those events are sent\n\t// for which both the event and the watchpoint has omit in theirs event sets.\n\tomit\n)\n\n// Inotify specific masks are legal, implemented events that are guaranteed to\n// work with notify package on linux-based systems.\nconst (\n\tInAccess       = Event(unix.IN_ACCESS)        // File was accessed\n\tInModify       = Event(unix.IN_MODIFY)        // File was modified\n\tInAttrib       = Event(unix.IN_ATTRIB)        // Metadata changed\n\tInCloseWrite   = Event(unix.IN_CLOSE_WRITE)   // Writtable file was closed\n\tInCloseNowrite = Event(unix.IN_CLOSE_NOWRITE) // Unwrittable file closed\n\tInOpen         = Event(unix.IN_OPEN)          // File was opened\n\tInMovedFrom    = Event(unix.IN_MOVED_FROM)    // File was moved from X\n\tInMovedTo      = Event(unix.IN_MOVED_TO)      // File was moved to Y\n\tInCreate       = Event(unix.IN_CREATE)        // Subfile was created\n\tInDelete       = Event(unix.IN_DELETE)        // Subfile was deleted\n\tInDeleteSelf   = Event(unix.IN_DELETE_SELF)   // Self was deleted\n\tInMoveSelf     = Event(unix.IN_MOVE_SELF)     // Self was moved\n)\n\nvar osestr = map[Event]string{\n\tInAccess:       \"notify.InAccess\",\n\tInModify:       \"notify.InModify\",\n\tInAttrib:       \"notify.InAttrib\",\n\tInCloseWrite:   \"notify.InCloseWrite\",\n\tInCloseNowrite: \"notify.InCloseNowrite\",\n\tInOpen:         \"notify.InOpen\",\n\tInMovedFrom:    \"notify.InMovedFrom\",\n\tInMovedTo:      \"notify.InMovedTo\",\n\tInCreate:       \"notify.InCreate\",\n\tInDelete:       \"notify.InDelete\",\n\tInDeleteSelf:   \"notify.InDeleteSelf\",\n\tInMoveSelf:     \"notify.InMoveSelf\",\n}\n\n// Inotify behavior events are not **currently** supported by notify package.\nconst (\n\tinDontFollow = Event(unix.IN_DONT_FOLLOW)\n\tinExclUnlink = Event(unix.IN_EXCL_UNLINK)\n\tinMaskAdd    = Event(unix.IN_MASK_ADD)\n\tinOneshot    = Event(unix.IN_ONESHOT)\n\tinOnlydir    = Event(unix.IN_ONLYDIR)\n)\n\ntype event struct {\n\tsys   unix.InotifyEvent\n\tpath  string\n\tevent Event\n}\n\nfunc (e *event) Event() Event         { return e.event }\nfunc (e *event) Path() string         { return e.path }\nfunc (e *event) Sys() interface{}     { return &e.sys }\nfunc (e *event) isDir() (bool, error) { return e.sys.Mask&unix.IN_ISDIR != 0, nil }\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event_kqueue.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build darwin,kqueue dragonfly freebsd netbsd openbsd\n\npackage notify\n\nimport \"syscall\"\n\n// TODO(pblaszczyk): ensure in runtime notify built-in event values do not\n// overlap with platform-defined ones.\n\n// Platform independent event values.\nconst (\n\tosSpecificCreate Event = 0x0100 << iota\n\tosSpecificRemove\n\tosSpecificWrite\n\tosSpecificRename\n\t// internal\n\t// recursive is used to distinguish recursive eventsets from non-recursive ones\n\trecursive\n\t// omit is used for dispatching internal events; only those events are sent\n\t// for which both the event and the watchpoint has omit in theirs event sets.\n\tomit\n)\n\nconst (\n\t// NoteDelete is an event reported when the unlink() system call was called\n\t// on the file referenced by the descriptor.\n\tNoteDelete = Event(syscall.NOTE_DELETE)\n\t// NoteWrite is an event reported when a write occurred on the file\n\t// referenced by the descriptor.\n\tNoteWrite = Event(syscall.NOTE_WRITE)\n\t// NoteExtend is an event reported when the file referenced by the\n\t// descriptor was extended.\n\tNoteExtend = Event(syscall.NOTE_EXTEND)\n\t// NoteAttrib is an event reported when the file referenced\n\t// by the descriptor had its attributes changed.\n\tNoteAttrib = Event(syscall.NOTE_ATTRIB)\n\t// NoteLink is an event reported when the link count on the file changed.\n\tNoteLink = Event(syscall.NOTE_LINK)\n\t// NoteRename is an event reported when the file referenced\n\t// by the descriptor was renamed.\n\tNoteRename = Event(syscall.NOTE_RENAME)\n\t// NoteRevoke is an event reported when access to the file was revoked via\n\t// revoke(2) or\tthe underlying file system was unmounted.\n\tNoteRevoke = Event(syscall.NOTE_REVOKE)\n)\n\nvar osestr = map[Event]string{\n\tNoteDelete: \"notify.NoteDelete\",\n\tNoteWrite:  \"notify.NoteWrite\",\n\tNoteExtend: \"notify.NoteExtend\",\n\tNoteAttrib: \"notify.NoteAttrib\",\n\tNoteLink:   \"notify.NoteLink\",\n\tNoteRename: \"notify.NoteRename\",\n\tNoteRevoke: \"notify.NoteRevoke\",\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event_readdcw.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build windows\n\npackage notify\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"syscall\"\n)\n\n// Platform independent event values.\nconst (\n\tosSpecificCreate Event = 1 << (20 + iota)\n\tosSpecificRemove\n\tosSpecificWrite\n\tosSpecificRename\n\t// recursive is used to distinguish recursive eventsets from non-recursive ones\n\trecursive\n\t// omit is used for dispatching internal events; only those events are sent\n\t// for which both the event and the watchpoint has omit in theirs event sets.\n\tomit\n\t// dirmarker TODO(pknap)\n\tdirmarker\n)\n\n// ReadDirectoryChangesW filters\n// On Windows the following events can be passed to Watch. A different set of\n// events (see actions below) are received on the channel passed to Watch.\n// For more information refer to\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx\nconst (\n\tFileNotifyChangeFileName   = Event(syscall.FILE_NOTIFY_CHANGE_FILE_NAME)\n\tFileNotifyChangeDirName    = Event(syscall.FILE_NOTIFY_CHANGE_DIR_NAME)\n\tFileNotifyChangeAttributes = Event(syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES)\n\tFileNotifyChangeSize       = Event(syscall.FILE_NOTIFY_CHANGE_SIZE)\n\tFileNotifyChangeLastWrite  = Event(syscall.FILE_NOTIFY_CHANGE_LAST_WRITE)\n\tFileNotifyChangeLastAccess = Event(syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS)\n\tFileNotifyChangeCreation   = Event(syscall.FILE_NOTIFY_CHANGE_CREATION)\n\tFileNotifyChangeSecurity   = Event(syscallFileNotifyChangeSecurity)\n)\n\nconst (\n\tfileNotifyChangeAll      = 0x17f // logical sum of all FileNotifyChange* events.\n\tfileNotifyChangeModified = fileNotifyChangeAll &^ (FileNotifyChangeFileName | FileNotifyChangeDirName)\n)\n\n// according to: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx\n// this flag should be declared in: http://golang.org/src/pkg/syscall/ztypes_windows.go\nconst syscallFileNotifyChangeSecurity = 0x00000100\n\n// ReadDirectoryChangesW actions\n// The following events are returned on the channel passed to Watch, but cannot\n// be passed to Watch itself (see filters above). You can find a table showing\n// the relation between actions and filteres at\n// https://github.com/rjeczalik/notify/issues/10#issuecomment-66179535\n// The msdn documentation on actions is part of\n// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364391(v=vs.85).aspx\nconst (\n\tFileActionAdded          = Event(syscall.FILE_ACTION_ADDED) << 12\n\tFileActionRemoved        = Event(syscall.FILE_ACTION_REMOVED) << 12\n\tFileActionModified       = Event(syscall.FILE_ACTION_MODIFIED) << 14\n\tFileActionRenamedOldName = Event(syscall.FILE_ACTION_RENAMED_OLD_NAME) << 15\n\tFileActionRenamedNewName = Event(syscall.FILE_ACTION_RENAMED_NEW_NAME) << 16\n)\n\nconst fileActionAll = 0x7f000 // logical sum of all FileAction* events.\n\nvar osestr = map[Event]string{\n\tFileNotifyChangeFileName:   \"notify.FileNotifyChangeFileName\",\n\tFileNotifyChangeDirName:    \"notify.FileNotifyChangeDirName\",\n\tFileNotifyChangeAttributes: \"notify.FileNotifyChangeAttributes\",\n\tFileNotifyChangeSize:       \"notify.FileNotifyChangeSize\",\n\tFileNotifyChangeLastWrite:  \"notify.FileNotifyChangeLastWrite\",\n\tFileNotifyChangeLastAccess: \"notify.FileNotifyChangeLastAccess\",\n\tFileNotifyChangeCreation:   \"notify.FileNotifyChangeCreation\",\n\tFileNotifyChangeSecurity:   \"notify.FileNotifyChangeSecurity\",\n\n\tFileActionAdded:          \"notify.FileActionAdded\",\n\tFileActionRemoved:        \"notify.FileActionRemoved\",\n\tFileActionModified:       \"notify.FileActionModified\",\n\tFileActionRenamedOldName: \"notify.FileActionRenamedOldName\",\n\tFileActionRenamedNewName: \"notify.FileActionRenamedNewName\",\n}\n\nconst (\n\tfTypeUnknown uint8 = iota\n\tfTypeFile\n\tfTypeDirectory\n)\n\n// TODO(ppknap) : doc.\ntype event struct {\n\tpathw  []uint16\n\tname   string\n\tftype  uint8\n\taction uint32\n\tfilter uint32\n\te      Event\n}\n\nfunc (e *event) Event() Event     { return e.e }\nfunc (e *event) Path() string     { return filepath.Join(syscall.UTF16ToString(e.pathw), e.name) }\nfunc (e *event) Sys() interface{} { return e.ftype }\n\nfunc (e *event) isDir() (bool, error) {\n\tif e.ftype != fTypeUnknown {\n\t\treturn e.ftype == fTypeDirectory, nil\n\t}\n\tfi, err := os.Stat(e.Path())\n\tif err != nil {\n\t\treturn false, err\n\t}\n\treturn fi.IsDir(), nil\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event_stub.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build !darwin,!linux,!freebsd,!dragonfly,!netbsd,!openbsd,!windows\n// +build !kqueue,!solaris\n\npackage notify\n\n// Platform independent event values.\nconst (\n\tosSpecificCreate Event = 1 << iota\n\tosSpecificRemove\n\tosSpecificWrite\n\tosSpecificRename\n\t// internal\n\t// recursive is used to distinguish recursive eventsets from non-recursive ones\n\trecursive\n\t// omit is used for dispatching internal events; only those events are sent\n\t// for which both the event and the watchpoint has omit in theirs event sets.\n\tomit\n)\n\nvar osestr = map[Event]string{}\n\ntype event struct{}\n\nfunc (e *event) Event() (_ Event)         { return }\nfunc (e *event) Path() (_ string)         { return }\nfunc (e *event) Sys() (_ interface{})     { return }\nfunc (e *event) isDir() (_ bool, _ error) { return }\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/event_trigger.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build darwin,kqueue dragonfly freebsd netbsd openbsd solaris\n\npackage notify\n\ntype event struct {\n\tp  string\n\te  Event\n\td  bool\n\tpe interface{}\n}\n\nfunc (e *event) Event() Event { return e.e }\n\nfunc (e *event) Path() string { return e.p }\n\nfunc (e *event) Sys() interface{} { return e.pe }\n\nfunc (e *event) isDir() (bool, error) { return e.d, nil }\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/node.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nimport (\n\t\"errors\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nvar errSkip = errors.New(\"notify: skip\")\n\ntype walkPathFunc func(nd node, isbase bool) error\n\ntype walkFunc func(node) error\n\nfunc errnotexist(name string) error {\n\treturn &os.PathError{\n\t\tOp:   \"Node\",\n\t\tPath: name,\n\t\tErr:  os.ErrNotExist,\n\t}\n}\n\ntype node struct {\n\tName  string\n\tWatch watchpoint\n\tChild map[string]node\n}\n\nfunc newnode(name string) node {\n\treturn node{\n\t\tName:  name,\n\t\tWatch: make(watchpoint),\n\t\tChild: make(map[string]node),\n\t}\n}\n\nfunc (nd node) addchild(name, base string) node {\n\tchild, ok := nd.Child[base]\n\tif !ok {\n\t\tchild = newnode(name)\n\t\tnd.Child[base] = child\n\t}\n\treturn child\n}\n\nfunc (nd node) Add(name string) node {\n\ti := indexbase(nd.Name, name)\n\tif i == -1 {\n\t\treturn node{}\n\t}\n\tfor j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) {\n\t\tnd = nd.addchild(name[:i+j], name[i:i+j])\n\t\ti += j + 1\n\t}\n\treturn nd.addchild(name, name[i:])\n}\n\nfunc (nd node) AddDir(fn walkFunc) error {\n\tstack := []node{nd}\nTraverse:\n\tfor n := len(stack); n != 0; n = len(stack) {\n\t\tnd, stack = stack[n-1], stack[:n-1]\n\t\tswitch err := fn(nd); err {\n\t\tcase nil:\n\t\tcase errSkip:\n\t\t\tcontinue Traverse\n\t\tdefault:\n\t\t\treturn &os.PathError{\n\t\t\t\tOp:   \"error while traversing\",\n\t\t\t\tPath: nd.Name,\n\t\t\t\tErr:  err,\n\t\t\t}\n\t\t}\n\t\t// TODO(rjeczalik): tolerate open failures - add failed names to\n\t\t// AddDirError and notify users which names are not added to the tree.\n\t\tfi, err := ioutil.ReadDir(nd.Name)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, fi := range fi {\n\t\t\tif fi.Mode()&(os.ModeSymlink|os.ModeDir) == os.ModeDir {\n\t\t\t\tname := filepath.Join(nd.Name, fi.Name())\n\t\t\t\tstack = append(stack, nd.addchild(name, name[len(nd.Name)+1:]))\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (nd node) Get(name string) (node, error) {\n\ti := indexbase(nd.Name, name)\n\tif i == -1 {\n\t\treturn node{}, errnotexist(name)\n\t}\n\tok := false\n\tfor j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) {\n\t\tif nd, ok = nd.Child[name[i:i+j]]; !ok {\n\t\t\treturn node{}, errnotexist(name)\n\t\t}\n\t\ti += j + 1\n\t}\n\tif nd, ok = nd.Child[name[i:]]; !ok {\n\t\treturn node{}, errnotexist(name)\n\t}\n\treturn nd, nil\n}\n\nfunc (nd node) Del(name string) error {\n\ti := indexbase(nd.Name, name)\n\tif i == -1 {\n\t\treturn errnotexist(name)\n\t}\n\tstack := []node{nd}\n\tok := false\n\tfor j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) {\n\t\tif nd, ok = nd.Child[name[i:i+j]]; !ok {\n\t\t\treturn errnotexist(name[:i+j])\n\t\t}\n\t\tstack = append(stack, nd)\n\t}\n\tif nd, ok = nd.Child[name[i:]]; !ok {\n\t\treturn errnotexist(name)\n\t}\n\tnd.Child = nil\n\tnd.Watch = nil\n\tfor name, i = base(nd.Name), len(stack); i != 0; name, i = base(nd.Name), i-1 {\n\t\tnd = stack[i-1]\n\t\tif nd := nd.Child[name]; len(nd.Watch) > 1 || len(nd.Child) != 0 {\n\t\t\tbreak\n\t\t} else {\n\t\t\tnd.Child = nil\n\t\t\tnd.Watch = nil\n\t\t}\n\t\tdelete(nd.Child, name)\n\t}\n\treturn nil\n}\n\nfunc (nd node) Walk(fn walkFunc) error {\n\tstack := []node{nd}\nTraverse:\n\tfor n := len(stack); n != 0; n = len(stack) {\n\t\tnd, stack = stack[n-1], stack[:n-1]\n\t\tswitch err := fn(nd); err {\n\t\tcase nil:\n\t\tcase errSkip:\n\t\t\tcontinue Traverse\n\t\tdefault:\n\t\t\treturn err\n\t\t}\n\t\tfor name, nd := range nd.Child {\n\t\t\tif name == \"\" {\n\t\t\t\t// Node storing inactive watchpoints has empty name, skip it\n\t\t\t\t// form traversing. Root node has also an empty name, but it\n\t\t\t\t// never has a parent node.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tstack = append(stack, nd)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (nd node) WalkPath(name string, fn walkPathFunc) error {\n\ti := indexbase(nd.Name, name)\n\tif i == -1 {\n\t\treturn errnotexist(name)\n\t}\n\tok := false\n\tfor j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) {\n\t\tswitch err := fn(nd, false); err {\n\t\tcase nil:\n\t\tcase errSkip:\n\t\t\treturn nil\n\t\tdefault:\n\t\t\treturn err\n\t\t}\n\t\tif nd, ok = nd.Child[name[i:i+j]]; !ok {\n\t\t\treturn errnotexist(name[:i+j])\n\t\t}\n\t\ti += j + 1\n\t}\n\tswitch err := fn(nd, false); err {\n\tcase nil:\n\tcase errSkip:\n\t\treturn nil\n\tdefault:\n\t\treturn err\n\t}\n\tif nd, ok = nd.Child[name[i:]]; !ok {\n\t\treturn errnotexist(name)\n\t}\n\tswitch err := fn(nd, true); err {\n\tcase nil, errSkip:\n\t\treturn nil\n\tdefault:\n\t\treturn err\n\t}\n}\n\ntype root struct {\n\tnd node\n}\n\nfunc (r root) addroot(name string) node {\n\tif vol := filepath.VolumeName(name); vol != \"\" {\n\t\troot, ok := r.nd.Child[vol]\n\t\tif !ok {\n\t\t\troot = r.nd.addchild(vol, vol)\n\t\t}\n\t\treturn root\n\t}\n\treturn r.nd\n}\n\nfunc (r root) root(name string) (node, error) {\n\tif vol := filepath.VolumeName(name); vol != \"\" {\n\t\tnd, ok := r.nd.Child[vol]\n\t\tif !ok {\n\t\t\treturn node{}, errnotexist(name)\n\t\t}\n\t\treturn nd, nil\n\t}\n\treturn r.nd, nil\n}\n\nfunc (r root) Add(name string) node {\n\treturn r.addroot(name).Add(name)\n}\n\nfunc (r root) AddDir(dir string, fn walkFunc) error {\n\treturn r.Add(dir).AddDir(fn)\n}\n\nfunc (r root) Del(name string) error {\n\tnd, err := r.root(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nd.Del(name)\n}\n\nfunc (r root) Get(name string) (node, error) {\n\tnd, err := r.root(name)\n\tif err != nil {\n\t\treturn node{}, err\n\t}\n\tif nd.Name != name {\n\t\tif nd, err = nd.Get(name); err != nil {\n\t\t\treturn node{}, err\n\t\t}\n\t}\n\treturn nd, nil\n}\n\nfunc (r root) Walk(name string, fn walkFunc) error {\n\tnd, err := r.Get(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nd.Walk(fn)\n}\n\nfunc (r root) WalkPath(name string, fn walkPathFunc) error {\n\tnd, err := r.root(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nd.WalkPath(name, fn)\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/notify.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// BUG(rjeczalik): Notify does not collect watchpoints, when underlying watches\n// were removed by their os-specific watcher implementations. Instead users are\n// advised to listen on persistent paths to have guarantee they receive events\n// for the whole lifetime of their applications (to discuss see #69).\n\n// BUG(ppknap): Linux (inotify) does not support watcher behavior masks like\n// InOneshot, InOnlydir etc. Instead users are advised to perform the filtering\n// themselves (to discuss see #71).\n\n// BUG(ppknap): Notify  was not tested for short path name support under Windows\n// (ReadDirectoryChangesW).\n\n// BUG(ppknap): Windows (ReadDirectoryChangesW) cannot recognize which notification\n// triggers FileActionModified event. (to discuss see #75).\n\npackage notify\n\nvar defaultTree = newTree()\n\n// Watch sets up a watchpoint on path listening for events given by the events\n// argument.\n//\n// File or directory given by the path must exist, otherwise Watch will fail\n// with non-nil error. Notify resolves, for its internal purpose, any symlinks\n// the provided path may contain, so it may fail if the symlinks form a cycle.\n// It does so, since not all watcher implementations treat passed paths as-is.\n// E.g. FSEvents reports a real path for every event, setting a watchpoint\n// on /tmp will report events with paths rooted at /private/tmp etc.\n//\n// The c almost always is a buffered channel. Watch will not block sending to c\n// - the caller must ensure that c has sufficient buffer space to keep up with\n// the expected event rate.\n//\n// It is allowed to pass the same channel multiple times with different event\n// list or different paths. Calling Watch with different event lists for a single\n// watchpoint expands its event set. The only way to shrink it, is to call\n// Stop on its channel.\n//\n// Calling Watch with empty event list does expand nor shrink watchpoint's event\n// set. If c is the first channel to listen for events on the given path, Watch\n// will seamlessly create a watch on the filesystem.\n//\n// Notify dispatches copies of single filesystem event to all channels registered\n// for each path. If a single filesystem event contains multiple coalesced events,\n// each of them is dispatched separately. E.g. the following filesystem change:\n//\n//   ~ $ echo Hello > Notify.txt\n//\n// dispatches two events - notify.Create and notify.Write. However, it may depend\n// on the underlying watcher implementation whether OS reports both of them.\n//\n// Windows and recursive watches\n//\n// If a directory which path was used to create recursive watch under Windows\n// gets deleted, the OS will not report such event. It is advised to keep in\n// mind this limitation while setting recursive watchpoints for your application,\n// e.g. use persistent paths like %userprofile% or watch additionally parent\n// directory of a recursive watchpoint in order to receive delete events for it.\nfunc Watch(path string, c chan<- EventInfo, events ...Event) error {\n\treturn defaultTree.Watch(path, c, events...)\n}\n\n// Stop removes all watchpoints registered for c. All underlying watches are\n// also removed, for which c was the last channel listening for events.\n//\n// Stop does not close c. When Stop returns, it is guaranteed that c will\n// receive no more signals.\nfunc Stop(c chan<- EventInfo) {\n\tdefaultTree.Stop(c)\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/tree.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nconst buffer = 128\n\ntype tree interface {\n\tWatch(string, chan<- EventInfo, ...Event) error\n\tStop(chan<- EventInfo)\n\tClose() error\n}\n\nfunc newTree() tree {\n\tc := make(chan EventInfo, buffer)\n\tw := newWatcher(c)\n\tif rw, ok := w.(recursiveWatcher); ok {\n\t\treturn newRecursiveTree(rw, c)\n\t}\n\treturn newNonrecursiveTree(w, c, make(chan EventInfo, buffer))\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/tree_nonrecursive.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nimport \"sync\"\n\n// nonrecursiveTree TODO(rjeczalik)\ntype nonrecursiveTree struct {\n\trw   sync.RWMutex // protects root\n\troot root\n\tw    watcher\n\tc    chan EventInfo\n\trec  chan EventInfo\n}\n\n// newNonrecursiveTree TODO(rjeczalik)\nfunc newNonrecursiveTree(w watcher, c, rec chan EventInfo) *nonrecursiveTree {\n\tif rec == nil {\n\t\trec = make(chan EventInfo, buffer)\n\t}\n\tt := &nonrecursiveTree{\n\t\troot: root{nd: newnode(\"\")},\n\t\tw:    w,\n\t\tc:    c,\n\t\trec:  rec,\n\t}\n\tgo t.dispatch(c)\n\tgo t.internal(rec)\n\treturn t\n}\n\n// dispatch TODO(rjeczalik)\nfunc (t *nonrecursiveTree) dispatch(c <-chan EventInfo) {\n\tfor ei := range c {\n\t\tdbgprintf(\"dispatching %v on %q\", ei.Event(), ei.Path())\n\t\tgo func(ei EventInfo) {\n\t\t\tvar nd node\n\t\t\tvar isrec bool\n\t\t\tdir, base := split(ei.Path())\n\t\t\tfn := func(it node, isbase bool) error {\n\t\t\t\tisrec = isrec || it.Watch.IsRecursive()\n\t\t\t\tif isbase {\n\t\t\t\t\tnd = it\n\t\t\t\t} else {\n\t\t\t\t\tit.Watch.Dispatch(ei, recursive)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tt.rw.RLock()\n\t\t\t// Notify recursive watchpoints found on the path.\n\t\t\tif err := t.root.WalkPath(dir, fn); err != nil {\n\t\t\t\tdbgprint(\"dispatch did not reach leaf:\", err)\n\t\t\t\tt.rw.RUnlock()\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Notify parent watchpoint.\n\t\t\tnd.Watch.Dispatch(ei, 0)\n\t\t\tisrec = isrec || nd.Watch.IsRecursive()\n\t\t\t// If leaf watchpoint exists, notify it.\n\t\t\tif nd, ok := nd.Child[base]; ok {\n\t\t\t\tisrec = isrec || nd.Watch.IsRecursive()\n\t\t\t\tnd.Watch.Dispatch(ei, 0)\n\t\t\t}\n\t\t\tt.rw.RUnlock()\n\t\t\t// If the event describes newly leaf directory created within\n\t\t\tif !isrec || ei.Event() != Create {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ok, err := ei.(isDirer).isDir(); !ok || err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tt.rec <- ei\n\t\t}(ei)\n\t}\n}\n\n// internal TODO(rjeczalik)\nfunc (t *nonrecursiveTree) internal(rec <-chan EventInfo) {\n\tfor ei := range rec {\n\t\tvar nd node\n\t\tvar eset = internal\n\t\tt.rw.Lock()\n\t\tt.root.WalkPath(ei.Path(), func(it node, _ bool) error {\n\t\t\tif e := it.Watch[t.rec]; e != 0 && e > eset {\n\t\t\t\teset = e\n\t\t\t}\n\t\t\tnd = it\n\t\t\treturn nil\n\t\t})\n\t\tif eset == internal {\n\t\t\tt.rw.Unlock()\n\t\t\tcontinue\n\t\t}\n\t\terr := nd.Add(ei.Path()).AddDir(t.recFunc(eset))\n\t\tt.rw.Unlock()\n\t\tif err != nil {\n\t\t\tdbgprintf(\"internal(%p) error: %v\", rec, err)\n\t\t}\n\t}\n}\n\n// watchAdd TODO(rjeczalik)\nfunc (t *nonrecursiveTree) watchAdd(nd node, c chan<- EventInfo, e Event) eventDiff {\n\tif e&recursive != 0 {\n\t\tdiff := nd.Watch.Add(t.rec, e|Create|omit)\n\t\tnd.Watch.Add(c, e)\n\t\treturn diff\n\t}\n\treturn nd.Watch.Add(c, e)\n}\n\n// watchDelMin TODO(rjeczalik)\nfunc (t *nonrecursiveTree) watchDelMin(min Event, nd node, c chan<- EventInfo, e Event) eventDiff {\n\told, ok := nd.Watch[t.rec]\n\tif ok {\n\t\tnd.Watch[t.rec] = min\n\t}\n\tdiff := nd.Watch.Del(c, e)\n\tif ok {\n\t\tswitch old &^= diff[0] &^ diff[1]; {\n\t\tcase old|internal == internal:\n\t\t\tdelete(nd.Watch, t.rec)\n\t\t\tif set, ok := nd.Watch[nil]; ok && len(nd.Watch) == 1 && set == 0 {\n\t\t\t\tdelete(nd.Watch, nil)\n\t\t\t}\n\t\tdefault:\n\t\t\tnd.Watch.Add(t.rec, old|Create)\n\t\t\tswitch {\n\t\t\tcase diff == none:\n\t\t\tcase diff[1]|Create == diff[0]:\n\t\t\t\tdiff = none\n\t\t\tdefault:\n\t\t\t\tdiff[1] |= Create\n\t\t\t}\n\t\t}\n\t}\n\treturn diff\n}\n\n// watchDel TODO(rjeczalik)\nfunc (t *nonrecursiveTree) watchDel(nd node, c chan<- EventInfo, e Event) eventDiff {\n\treturn t.watchDelMin(0, nd, c, e)\n}\n\n// Watch TODO(rjeczalik)\nfunc (t *nonrecursiveTree) Watch(path string, c chan<- EventInfo, events ...Event) error {\n\tif c == nil {\n\t\tpanic(\"notify: Watch using nil channel\")\n\t}\n\t// Expanding with empty event set is a nop.\n\tif len(events) == 0 {\n\t\treturn nil\n\t}\n\tpath, isrec, err := cleanpath(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\teset := joinevents(events)\n\tt.rw.Lock()\n\tdefer t.rw.Unlock()\n\tnd := t.root.Add(path)\n\tif isrec {\n\t\treturn t.watchrec(nd, c, eset|recursive)\n\t}\n\treturn t.watch(nd, c, eset)\n}\n\nfunc (t *nonrecursiveTree) watch(nd node, c chan<- EventInfo, e Event) (err error) {\n\tdiff := nd.Watch.Add(c, e)\n\tswitch {\n\tcase diff == none:\n\t\treturn nil\n\tcase diff[1] == 0:\n\t\t// TODO(rjeczalik): cleanup this panic after implementation is stable\n\t\tpanic(\"eset is empty: \" + nd.Name)\n\tcase diff[0] == 0:\n\t\terr = t.w.Watch(nd.Name, diff[1])\n\tdefault:\n\t\terr = t.w.Rewatch(nd.Name, diff[0], diff[1])\n\t}\n\tif err != nil {\n\t\tnd.Watch.Del(c, diff.Event())\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (t *nonrecursiveTree) recFunc(e Event) walkFunc {\n\treturn func(nd node) error {\n\t\tswitch diff := nd.Watch.Add(t.rec, e|omit|Create); {\n\t\tcase diff == none:\n\t\tcase diff[1] == 0:\n\t\t\t// TODO(rjeczalik): cleanup this panic after implementation is stable\n\t\t\tpanic(\"eset is empty: \" + nd.Name)\n\t\tcase diff[0] == 0:\n\t\t\tt.w.Watch(nd.Name, diff[1])\n\t\tdefault:\n\t\t\tt.w.Rewatch(nd.Name, diff[0], diff[1])\n\t\t}\n\t\treturn nil\n\t}\n}\n\nfunc (t *nonrecursiveTree) watchrec(nd node, c chan<- EventInfo, e Event) error {\n\tvar traverse func(walkFunc) error\n\t// Non-recursive tree listens on Create event for every recursive\n\t// watchpoint in order to automagically set a watch for every\n\t// created directory.\n\tswitch diff := nd.Watch.dryAdd(t.rec, e|Create); {\n\tcase diff == none:\n\t\tt.watchAdd(nd, c, e)\n\t\tnd.Watch.Add(t.rec, e|omit|Create)\n\t\treturn nil\n\tcase diff[1] == 0:\n\t\t// TODO(rjeczalik): cleanup this panic after implementation is stable\n\t\tpanic(\"eset is empty: \" + nd.Name)\n\tcase diff[0] == 0:\n\t\t// TODO(rjeczalik): BFS into directories and skip subtree as soon as first\n\t\t// recursive watchpoint is encountered.\n\t\ttraverse = nd.AddDir\n\tdefault:\n\t\ttraverse = nd.Walk\n\t}\n\t// TODO(rjeczalik): account every path that failed to be (re)watched\n\t// and retry.\n\tif err := traverse(t.recFunc(e)); err != nil {\n\t\treturn err\n\t}\n\tt.watchAdd(nd, c, e)\n\treturn nil\n}\n\ntype walkWatchpointFunc func(Event, node) error\n\nfunc (t *nonrecursiveTree) walkWatchpoint(nd node, fn walkWatchpointFunc) error {\n\ttype minode struct {\n\t\tmin Event\n\t\tnd  node\n\t}\n\tmnd := minode{nd: nd}\n\tstack := []minode{mnd}\nTraverse:\n\tfor n := len(stack); n != 0; n = len(stack) {\n\t\tmnd, stack = stack[n-1], stack[:n-1]\n\t\t// There must be no recursive watchpoints if the node has no watchpoints\n\t\t// itself (every node in subtree rooted at recursive watchpoints must\n\t\t// have at least nil (total) and t.rec watchpoints).\n\t\tif len(mnd.nd.Watch) != 0 {\n\t\t\tswitch err := fn(mnd.min, mnd.nd); err {\n\t\t\tcase nil:\n\t\t\tcase errSkip:\n\t\t\t\tcontinue Traverse\n\t\t\tdefault:\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tfor _, nd := range mnd.nd.Child {\n\t\t\tstack = append(stack, minode{mnd.nd.Watch[t.rec], nd})\n\t\t}\n\t}\n\treturn nil\n}\n\n// Stop TODO(rjeczalik)\nfunc (t *nonrecursiveTree) Stop(c chan<- EventInfo) {\n\tfn := func(min Event, nd node) error {\n\t\t// TODO(rjeczalik): aggregate watcher errors and retry; in worst case\n\t\t// forward to the user.\n\t\tswitch diff := t.watchDelMin(min, nd, c, all); {\n\t\tcase diff == none:\n\t\t\treturn nil\n\t\tcase diff[1] == 0:\n\t\t\tt.w.Unwatch(nd.Name)\n\t\tdefault:\n\t\t\tt.w.Rewatch(nd.Name, diff[0], diff[1])\n\t\t}\n\t\treturn nil\n\t}\n\tt.rw.Lock()\n\terr := t.walkWatchpoint(t.root.nd, fn) // TODO(rjeczalik): store max root per c\n\tt.rw.Unlock()\n\tdbgprintf(\"Stop(%p) error: %v\\n\", c, err)\n}\n\n// Close TODO(rjeczalik)\nfunc (t *nonrecursiveTree) Close() error {\n\terr := t.w.Close()\n\tclose(t.c)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/tree_recursive.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nimport \"sync\"\n\n// watchAdd TODO(rjeczalik)\nfunc watchAdd(nd node, c chan<- EventInfo, e Event) eventDiff {\n\tdiff := nd.Watch.Add(c, e)\n\tif wp := nd.Child[\"\"].Watch; len(wp) != 0 {\n\t\te = wp.Total()\n\t\tdiff[0] |= e\n\t\tdiff[1] |= e\n\t\tif diff[0] == diff[1] {\n\t\t\treturn none\n\t\t}\n\t}\n\treturn diff\n}\n\n// watchAddInactive TODO(rjeczalik)\nfunc watchAddInactive(nd node, c chan<- EventInfo, e Event) eventDiff {\n\twp := nd.Child[\"\"].Watch\n\tif wp == nil {\n\t\twp = make(watchpoint)\n\t\tnd.Child[\"\"] = node{Watch: wp}\n\t}\n\tdiff := wp.Add(c, e)\n\te = nd.Watch.Total()\n\tdiff[0] |= e\n\tdiff[1] |= e\n\tif diff[0] == diff[1] {\n\t\treturn none\n\t}\n\treturn diff\n}\n\n// watchCopy TODO(rjeczalik)\nfunc watchCopy(src, dst node) {\n\tfor c, e := range src.Watch {\n\t\tif c == nil {\n\t\t\tcontinue\n\t\t}\n\t\twatchAddInactive(dst, c, e)\n\t}\n\tif wpsrc := src.Child[\"\"].Watch; len(wpsrc) != 0 {\n\t\twpdst := dst.Child[\"\"].Watch\n\t\tfor c, e := range wpsrc {\n\t\t\tif c == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\twpdst.Add(c, e)\n\t\t}\n\t}\n}\n\n// watchDel TODO(rjeczalik)\nfunc watchDel(nd node, c chan<- EventInfo, e Event) eventDiff {\n\tdiff := nd.Watch.Del(c, e)\n\tif wp := nd.Child[\"\"].Watch; len(wp) != 0 {\n\t\tdiffInactive := wp.Del(c, e)\n\t\te = wp.Total()\n\t\t// TODO(rjeczalik): add e if e != all?\n\t\tdiff[0] |= diffInactive[0] | e\n\t\tdiff[1] |= diffInactive[1] | e\n\t\tif diff[0] == diff[1] {\n\t\t\treturn none\n\t\t}\n\t}\n\treturn diff\n}\n\n// watchTotal TODO(rjeczalik)\nfunc watchTotal(nd node) Event {\n\te := nd.Watch.Total()\n\tif wp := nd.Child[\"\"].Watch; len(wp) != 0 {\n\t\te |= wp.Total()\n\t}\n\treturn e\n}\n\n// watchIsRecursive TODO(rjeczalik)\nfunc watchIsRecursive(nd node) bool {\n\tok := nd.Watch.IsRecursive()\n\t// TODO(rjeczalik): add a test for len(wp) != 0 change the condition.\n\tif wp := nd.Child[\"\"].Watch; len(wp) != 0 {\n\t\t// If a watchpoint holds inactive watchpoints, it means it's a parent\n\t\t// one, which is recursive by nature even though it may be not recursive\n\t\t// itself.\n\t\tok = true\n\t}\n\treturn ok\n}\n\n// recursiveTree TODO(rjeczalik)\ntype recursiveTree struct {\n\trw   sync.RWMutex // protects root\n\troot root\n\t// TODO(rjeczalik): merge watcher + recursiveWatcher after #5 and #6\n\tw interface {\n\t\twatcher\n\t\trecursiveWatcher\n\t}\n\tc chan EventInfo\n}\n\n// newRecursiveTree TODO(rjeczalik)\nfunc newRecursiveTree(w recursiveWatcher, c chan EventInfo) *recursiveTree {\n\tt := &recursiveTree{\n\t\troot: root{nd: newnode(\"\")},\n\t\tw: struct {\n\t\t\twatcher\n\t\t\trecursiveWatcher\n\t\t}{w.(watcher), w},\n\t\tc: c,\n\t}\n\tgo t.dispatch()\n\treturn t\n}\n\n// dispatch TODO(rjeczalik)\nfunc (t *recursiveTree) dispatch() {\n\tfor ei := range t.c {\n\t\tdbgprintf(\"dispatching %v on %q\", ei.Event(), ei.Path())\n\t\tgo func(ei EventInfo) {\n\t\t\tnd, ok := node{}, false\n\t\t\tdir, base := split(ei.Path())\n\t\t\tfn := func(it node, isbase bool) error {\n\t\t\t\tif isbase {\n\t\t\t\t\tnd = it\n\t\t\t\t} else {\n\t\t\t\t\tit.Watch.Dispatch(ei, recursive)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tt.rw.RLock()\n\t\t\tdefer t.rw.RUnlock()\n\t\t\t// Notify recursive watchpoints found on the path.\n\t\t\tif err := t.root.WalkPath(dir, fn); err != nil {\n\t\t\t\tdbgprint(\"dispatch did not reach leaf:\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Notify parent watchpoint.\n\t\t\tnd.Watch.Dispatch(ei, 0)\n\t\t\t// If leaf watchpoint exists, notify it.\n\t\t\tif nd, ok = nd.Child[base]; ok {\n\t\t\t\tnd.Watch.Dispatch(ei, 0)\n\t\t\t}\n\t\t}(ei)\n\t}\n}\n\n// Watch TODO(rjeczalik)\nfunc (t *recursiveTree) Watch(path string, c chan<- EventInfo, events ...Event) error {\n\tif c == nil {\n\t\tpanic(\"notify: Watch using nil channel\")\n\t}\n\t// Expanding with empty event set is a nop.\n\tif len(events) == 0 {\n\t\treturn nil\n\t}\n\tpath, isrec, err := cleanpath(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\teventset := joinevents(events)\n\tif isrec {\n\t\teventset |= recursive\n\t}\n\tt.rw.Lock()\n\tdefer t.rw.Unlock()\n\t// case 1: cur is a child\n\t//\n\t// Look for parent watch which already covers the given path.\n\tparent := node{}\n\tself := false\n\terr = t.root.WalkPath(path, func(nd node, isbase bool) error {\n\t\tif watchTotal(nd) != 0 {\n\t\t\tparent = nd\n\t\t\tself = isbase\n\t\t\treturn errSkip\n\t\t}\n\t\treturn nil\n\t})\n\tcur := t.root.Add(path) // add after the walk, so it's less to traverse\n\tif err == nil && parent.Watch != nil {\n\t\t// Parent watch found. Register inactive watchpoint, so we have enough\n\t\t// information to shrink the eventset on eventual Stop.\n\t\t// return t.resetwatchpoint(parent, parent, c, eventset|inactive)\n\t\tvar diff eventDiff\n\t\tif self {\n\t\t\tdiff = watchAdd(cur, c, eventset)\n\t\t} else {\n\t\t\tdiff = watchAddInactive(parent, c, eventset)\n\t\t}\n\t\tswitch {\n\t\tcase diff == none:\n\t\t\t// the parent watchpoint already covers requested subtree with its\n\t\t\t// eventset\n\t\tcase diff[0] == 0:\n\t\t\t// TODO(rjeczalik): cleanup this panic after implementation is stable\n\t\t\tpanic(\"dangling watchpoint: \" + parent.Name)\n\t\tdefault:\n\t\t\tif isrec || watchIsRecursive(parent) {\n\t\t\t\terr = t.w.RecursiveRewatch(parent.Name, parent.Name, diff[0], diff[1])\n\t\t\t} else {\n\t\t\t\terr = t.w.Rewatch(parent.Name, diff[0], diff[1])\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\twatchDel(parent, c, diff.Event())\n\t\t\t\treturn err\n\t\t\t}\n\t\t\twatchAdd(cur, c, eventset)\n\t\t\t// TODO(rjeczalik): account top-most path for c\n\t\t\treturn nil\n\t\t}\n\t\tif !self {\n\t\t\twatchAdd(cur, c, eventset)\n\t\t}\n\t\treturn nil\n\t}\n\t// case 2: cur is new parent\n\t//\n\t// Look for children nodes, unwatch n-1 of them and rewatch the last one.\n\tvar children []node\n\tfn := func(nd node) error {\n\t\tif len(nd.Watch) == 0 {\n\t\t\treturn nil\n\t\t}\n\t\tchildren = append(children, nd)\n\t\treturn errSkip\n\t}\n\tswitch must(cur.Walk(fn)); len(children) {\n\tcase 0:\n\t\t// no child watches, cur holds a new watch\n\tcase 1:\n\t\twatchAdd(cur, c, eventset) // TODO(rjeczalik): update cache c subtree root?\n\t\twatchCopy(children[0], cur)\n\t\terr = t.w.RecursiveRewatch(children[0].Name, cur.Name, watchTotal(children[0]),\n\t\t\twatchTotal(cur))\n\t\tif err != nil {\n\t\t\t// Clean inactive watchpoint. The c chan did not exist before.\n\t\t\tcur.Child[\"\"] = node{}\n\t\t\tdelete(cur.Watch, c)\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\tdefault:\n\t\twatchAdd(cur, c, eventset)\n\t\t// Copy children inactive watchpoints to the new parent.\n\t\tfor _, nd := range children {\n\t\t\twatchCopy(nd, cur)\n\t\t}\n\t\t// Watch parent subtree.\n\t\tif err = t.w.RecursiveWatch(cur.Name, watchTotal(cur)); err != nil {\n\t\t\t// Clean inactive watchpoint. The c chan did not exist before.\n\t\t\tcur.Child[\"\"] = node{}\n\t\t\tdelete(cur.Watch, c)\n\t\t\treturn err\n\t\t}\n\t\t// Unwatch children subtrees.\n\t\tvar e error\n\t\tfor _, nd := range children {\n\t\t\tif watchIsRecursive(nd) {\n\t\t\t\te = t.w.RecursiveUnwatch(nd.Name)\n\t\t\t} else {\n\t\t\t\te = t.w.Unwatch(nd.Name)\n\t\t\t}\n\t\t\tif e != nil {\n\t\t\t\terr = nonil(err, e)\n\t\t\t\t// TODO(rjeczalik): child is still watched, warn all its watchpoints\n\t\t\t\t// about possible duplicate events via Error event\n\t\t\t}\n\t\t}\n\t\treturn err\n\t}\n\t// case 3: cur is new, alone node\n\tswitch diff := watchAdd(cur, c, eventset); {\n\tcase diff == none:\n\t\t// TODO(rjeczalik): cleanup this panic after implementation is stable\n\t\tpanic(\"watch requested but no parent watchpoint found: \" + cur.Name)\n\tcase diff[0] == 0:\n\t\tif isrec {\n\t\t\terr = t.w.RecursiveWatch(cur.Name, diff[1])\n\t\t} else {\n\t\t\terr = t.w.Watch(cur.Name, diff[1])\n\t\t}\n\t\tif err != nil {\n\t\t\twatchDel(cur, c, diff.Event())\n\t\t\treturn err\n\t\t}\n\tdefault:\n\t\t// TODO(rjeczalik): cleanup this panic after implementation is stable\n\t\tpanic(\"watch requested but no parent watchpoint found: \" + cur.Name)\n\t}\n\treturn nil\n}\n\n// Stop TODO(rjeczalik)\n//\n// TODO(rjeczalik): Split parent watchpoint - transfer watches to children\n// if parent is no longer needed. This carries a risk that underlying\n// watcher calls could fail - reconsider if it's worth the effort.\nfunc (t *recursiveTree) Stop(c chan<- EventInfo) {\n\tvar err error\n\tfn := func(nd node) (e error) {\n\t\tdiff := watchDel(nd, c, all)\n\t\tswitch {\n\t\tcase diff == none && watchTotal(nd) == 0:\n\t\t\t// TODO(rjeczalik): There's no watchpoints deeper in the tree,\n\t\t\t// probably we should remove the nodes as well.\n\t\t\treturn nil\n\t\tcase diff == none:\n\t\t\t// Removing c from nd does not require shrinking its eventset.\n\t\tcase diff[1] == 0:\n\t\t\tif watchIsRecursive(nd) {\n\t\t\t\te = t.w.RecursiveUnwatch(nd.Name)\n\t\t\t} else {\n\t\t\t\te = t.w.Unwatch(nd.Name)\n\t\t\t}\n\t\tdefault:\n\t\t\tif watchIsRecursive(nd) {\n\t\t\t\te = t.w.RecursiveRewatch(nd.Name, nd.Name, diff[0], diff[1])\n\t\t\t} else {\n\t\t\t\te = t.w.Rewatch(nd.Name, diff[0], diff[1])\n\t\t\t}\n\t\t}\n\t\tfn := func(nd node) error {\n\t\t\twatchDel(nd, c, all)\n\t\t\treturn nil\n\t\t}\n\t\terr = nonil(err, e, nd.Walk(fn))\n\t\t// TODO(rjeczalik): if e != nil store dummy chan in nd.Watch just to\n\t\t// retry un/rewatching next time and/or let the user handle the failure\n\t\t// vie Error event?\n\t\treturn errSkip\n\t}\n\tt.rw.Lock()\n\te := t.root.Walk(\"\", fn) // TODO(rjeczalik): use max root per c\n\tt.rw.Unlock()\n\tif e != nil {\n\t\terr = nonil(err, e)\n\t}\n\tdbgprintf(\"Stop(%p) error: %v\\n\", c, err)\n}\n\n// Close TODO(rjeczalik)\nfunc (t *recursiveTree) Close() error {\n\terr := t.w.Close()\n\tclose(t.c)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/util.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\nconst all = ^Event(0)\nconst sep = string(os.PathSeparator)\n\nvar errDepth = errors.New(\"exceeded allowed iteration count (circular symlink?)\")\n\nfunc min(i, j int) int {\n\tif i > j {\n\t\treturn j\n\t}\n\treturn i\n}\n\nfunc max(i, j int) int {\n\tif i < j {\n\t\treturn j\n\t}\n\treturn i\n}\n\n// must panics if err is non-nil.\nfunc must(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// nonil gives first non-nil error from the given arguments.\nfunc nonil(err ...error) error {\n\tfor _, err := range err {\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc cleanpath(path string) (realpath string, isrec bool, err error) {\n\tif strings.HasSuffix(path, \"...\") {\n\t\tisrec = true\n\t\tpath = path[:len(path)-3]\n\t}\n\tif path, err = filepath.Abs(path); err != nil {\n\t\treturn \"\", false, err\n\t}\n\tif path, err = canonical(path); err != nil {\n\t\treturn \"\", false, err\n\t}\n\treturn path, isrec, nil\n}\n\n// canonical resolves any symlink in the given path and returns it in a clean form.\n// It expects the path to be absolute. It fails to resolve circular symlinks by\n// maintaining a simple iteration limit.\nfunc canonical(p string) (string, error) {\n\tp, err := filepath.Abs(p)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tfor i, j, depth := 1, 0, 1; i < len(p); i, depth = i+1, depth+1 {\n\t\tif depth > 128 {\n\t\t\treturn \"\", &os.PathError{Op: \"canonical\", Path: p, Err: errDepth}\n\t\t}\n\t\tif j = strings.IndexRune(p[i:], '/'); j == -1 {\n\t\t\tj, i = i, len(p)\n\t\t} else {\n\t\t\tj, i = i, i+j\n\t\t}\n\t\tfi, err := os.Lstat(p[:i])\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tif fi.Mode()&os.ModeSymlink == os.ModeSymlink {\n\t\t\ts, err := os.Readlink(p[:i])\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", err\n\t\t\t}\n\t\t\tif filepath.IsAbs(s) {\n\t\t\t\tp = \"/\" + s + p[i:]\n\t\t\t} else {\n\t\t\t\tp = p[:j] + s + p[i:]\n\t\t\t}\n\t\t\ti = 1 // no guarantee s is canonical, start all over\n\t\t}\n\t}\n\treturn filepath.Clean(p), nil\n}\n\nfunc joinevents(events []Event) (e Event) {\n\tif len(events) == 0 {\n\t\te = All\n\t} else {\n\t\tfor _, event := range events {\n\t\t\te |= event\n\t\t}\n\t}\n\treturn\n}\n\nfunc split(s string) (string, string) {\n\tif i := lastIndexSep(s); i != -1 {\n\t\treturn s[:i], s[i+1:]\n\t}\n\treturn \"\", s\n}\n\nfunc base(s string) string {\n\tif i := lastIndexSep(s); i != -1 {\n\t\treturn s[i+1:]\n\t}\n\treturn s\n}\n\nfunc indexbase(root, name string) int {\n\tif n, m := len(root), len(name); m >= n && name[:n] == root &&\n\t\t(n == m || name[n] == os.PathSeparator) {\n\t\treturn min(n+1, m)\n\t}\n\treturn -1\n}\n\nfunc indexSep(s string) int {\n\tfor i := 0; i < len(s); i++ {\n\t\tif s[i] == os.PathSeparator {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\nfunc lastIndexSep(s string) int {\n\tfor i := len(s) - 1; i >= 0; i-- {\n\t\tif s[i] == os.PathSeparator {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\nimport \"errors\"\n\nvar (\n\terrAlreadyWatched  = errors.New(\"path is already watched\")\n\terrNotWatched      = errors.New(\"path is not being watched\")\n\terrInvalidEventSet = errors.New(\"invalid event set provided\")\n)\n\n// Watcher is a intermediate interface for wrapping inotify, ReadDirChangesW,\n// FSEvents, kqueue and poller implementations.\n//\n// The watcher implementation is expected to do its own mapping between paths and\n// create watchers if underlying event notification does not support it. For\n// the ease of implementation it is guaranteed that paths provided via Watch and\n// Unwatch methods are absolute and clean.\ntype watcher interface {\n\t// Watch requests a watcher creation for the given path and given event set.\n\tWatch(path string, event Event) error\n\n\t// Unwatch requests a watcher deletion for the given path and given event set.\n\tUnwatch(path string) error\n\n\t// Rewatch provides a functionality for modifying existing watch-points, like\n\t// expanding its event set.\n\t//\n\t// Rewatch modifies existing watch-point under for the given path. It passes\n\t// the existing event set currently registered for the given path, and the\n\t// new, requested event set.\n\t//\n\t// It is guaranteed that Tree will not pass to Rewatch zero value for any\n\t// of its arguments. If old == new and watcher can be upgraded to\n\t// recursiveWatcher interface, a watch for the corresponding path is expected\n\t// to be changed from recursive to the non-recursive one.\n\tRewatch(path string, old, new Event) error\n\n\t// Close unwatches all paths that are registered. When Close returns, it\n\t// is expected it will report no more events.\n\tClose() error\n}\n\n// RecursiveWatcher is an interface for a Watcher for those OS, which do support\n// recursive watching over directories.\ntype recursiveWatcher interface {\n\tRecursiveWatch(path string, event Event) error\n\n\t// RecursiveUnwatch removes a recursive watch-point given by the path. For\n\t// native recursive implementation there is no difference in functionality\n\t// between Unwatch and RecursiveUnwatch, however for those platforms, that\n\t// requires emulation for recursive watch-points, the implementation differs.\n\tRecursiveUnwatch(path string) error\n\n\t// RecursiveRewatcher provides a functionality for modifying and/or relocating\n\t// existing recursive watch-points.\n\t//\n\t// To relocate a watch-point means to unwatch oldpath and set a watch-point on\n\t// newpath.\n\t//\n\t// To modify a watch-point means either to expand or shrink its event set.\n\t//\n\t// Tree can want to either relocate, modify or relocate and modify a watch-point\n\t// via single RecursiveRewatch call.\n\t//\n\t// If oldpath == newpath, the watch-point is expected to change its event set value\n\t// from oldevent to newevent.\n\t//\n\t// If oldevent == newevent, the watch-point is expected to relocate from oldpath\n\t// to the newpath.\n\t//\n\t// If oldpath != newpath and oldevent != newevent, the watch-point is expected\n\t// to relocate from oldpath to the newpath first and then change its event set\n\t// value from oldevent to the newevent. In other words the end result must be\n\t// a watch-point set on newpath with newevent value of its event set.\n\t//\n\t// It is guaranteed that Tree will not pass to RecurisveRewatcha zero value\n\t// for any of its arguments. If oldpath == newpath and oldevent == newevent,\n\t// a watch for the corresponding path is expected to be changed for\n\t// non-recursive to the recursive one.\n\tRecursiveRewatch(oldpath, newpath string, oldevent, newevent Event) error\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_fen.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build solaris\n\npackage notify\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"syscall\"\n)\n\n// newTrigger returns implementation of trigger.\nfunc newTrigger(pthLkp map[string]*watched) trigger {\n\treturn &fen{\n\t\tpthLkp: pthLkp,\n\t\tcf:     newCfen(),\n\t}\n}\n\n// fen is a structure implementing trigger for FEN.\ntype fen struct {\n\t// p is a FEN port identifier\n\tp int\n\t// pthLkp is a structure mapping monitored files/dir with data about them,\n\t// shared with parent trg structure\n\tpthLkp map[string]*watched\n\t// cf wraps C operations for FEN\n\tcf cfen\n}\n\n// watched is a data structure representing watched file/directory.\ntype watched struct {\n\ttrgWatched\n}\n\n// Stop implements trigger.\nfunc (f *fen) Stop() error {\n\treturn f.cf.portAlert(f.p)\n}\n\n// Close implements trigger.\nfunc (f *fen) Close() (err error) {\n\treturn syscall.Close(f.p)\n}\n\n// NewWatched implements trigger.\nfunc (*fen) NewWatched(p string, fi os.FileInfo) (*watched, error) {\n\treturn &watched{trgWatched{p: p, fi: fi}}, nil\n}\n\n// Record implements trigger.\nfunc (f *fen) Record(w *watched) {\n\tf.pthLkp[w.p] = w\n}\n\n// Del implements trigger.\nfunc (f *fen) Del(w *watched) {\n\tdelete(f.pthLkp, w.p)\n}\n\nfunc inter2pe(n interface{}) PortEvent {\n\tpe, ok := n.(PortEvent)\n\tif !ok {\n\t\tpanic(fmt.Sprintf(\"fen: type should be PortEvent, %T instead\", n))\n\t}\n\treturn pe\n}\n\n// Watched implements trigger.\nfunc (f *fen) Watched(n interface{}) (*watched, int64, error) {\n\tpe := inter2pe(n)\n\tfo, ok := pe.PortevObject.(*FileObj)\n\tif !ok || fo == nil {\n\t\tpanic(fmt.Sprintf(\"fen: type should be *FileObj, %T instead\", fo))\n\t}\n\tw, ok := f.pthLkp[fo.Name]\n\tif !ok {\n\t\treturn nil, 0, errNotWatched\n\t}\n\treturn w, int64(pe.PortevEvents), nil\n}\n\n// init initializes FEN.\nfunc (f *fen) Init() (err error) {\n\tf.p, err = f.cf.portCreate()\n\treturn\n}\n\nfunc fi2fo(fi os.FileInfo, p string) FileObj {\n\tst, ok := fi.Sys().(*syscall.Stat_t)\n\tif !ok {\n\t\tpanic(fmt.Sprintf(\"fen: type should be *syscall.Stat_t, %T instead\", st))\n\t}\n\treturn FileObj{Name: p, Atim: st.Atim, Mtim: st.Mtim, Ctim: st.Ctim}\n}\n\n// Unwatch implements trigger.\nfunc (f *fen) Unwatch(w *watched) error {\n\treturn f.cf.portDissociate(f.p, FileObj{Name: w.p})\n}\n\n// Watch implements trigger.\nfunc (f *fen) Watch(fi os.FileInfo, w *watched, e int64) error {\n\treturn f.cf.portAssociate(f.p, fi2fo(fi, w.p), int(e))\n}\n\n// Wait implements trigger.\nfunc (f *fen) Wait() (interface{}, error) {\n\tvar (\n\t\tpe  PortEvent\n\t\terr error\n\t)\n\terr = f.cf.portGet(f.p, &pe)\n\treturn pe, err\n}\n\n// IsStop implements trigger.\nfunc (f *fen) IsStop(n interface{}, err error) bool {\n\treturn err == syscall.EBADF || inter2pe(n).PortevSource == srcAlert\n}\n\nfunc init() {\n\tencode = func(e Event, dir bool) (o int64) {\n\t\t// Create event is not supported by FEN. Instead FileModified event will\n\t\t// be registered. If this event will be reported on dir which is to be\n\t\t// monitored for Create, dir will be rescanned and Create events will\n\t\t// be generated and returned for new files. In case of files,\n\t\t// if not requested FileModified event is reported, it will be ignored.\n\t\to = int64(e &^ Create)\n\t\tif (e&Create != 0 && dir) || e&Write != 0 {\n\t\t\to = (o &^ int64(Write)) | int64(FileModified)\n\t\t}\n\t\t// Following events are 'exception events' and as such cannot be requested\n\t\t// explicitly for monitoring or filtered out. If the will be reported\n\t\t// by FEN and not subscribed with by user, they will be filtered out by\n\t\t// watcher's logic.\n\t\to &= int64(^Rename & ^Remove &^ FileDelete &^ FileRenameTo &^\n\t\t\tFileRenameFrom &^ Unmounted &^ MountedOver)\n\t\treturn\n\t}\n\tnat2not = map[Event]Event{\n\t\tFileModified:   Write,\n\t\tFileRenameFrom: Rename,\n\t\tFileDelete:     Remove,\n\t\tFileAccess:     Event(0),\n\t\tFileAttrib:     Event(0),\n\t\tFileRenameTo:   Event(0),\n\t\tFileTrunc:      Event(0),\n\t\tFileNoFollow:   Event(0),\n\t\tUnmounted:      Event(0),\n\t\tMountedOver:    Event(0),\n\t}\n\tnot2nat = map[Event]Event{\n\t\tWrite:  FileModified,\n\t\tRename: FileRenameFrom,\n\t\tRemove: FileDelete,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_fen_cgo.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build solaris\n\npackage notify\n\n// #include <port.h>\n// #include <stdio.h>\n// #include <stdlib.h>\n// struct file_obj* newFo() { return (struct file_obj*) malloc(sizeof(struct file_obj)); }\n// port_event_t* newPe() { return (port_event_t*) malloc(sizeof(port_event_t)); }\n// uintptr_t conv(struct file_obj* fo) { return (uintptr_t) fo; }\n// struct file_obj* dconv(uintptr_t fo) { return (struct file_obj*) fo; }\nimport \"C\"\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nconst (\n\tfileAccess     = Event(C.FILE_ACCESS)\n\tfileModified   = Event(C.FILE_MODIFIED)\n\tfileAttrib     = Event(C.FILE_ATTRIB)\n\tfileDelete     = Event(C.FILE_DELETE)\n\tfileRenameTo   = Event(C.FILE_RENAME_TO)\n\tfileRenameFrom = Event(C.FILE_RENAME_FROM)\n\tfileTrunc      = Event(C.FILE_TRUNC)\n\tfileNoFollow   = Event(C.FILE_NOFOLLOW)\n\tunmounted      = Event(C.UNMOUNTED)\n\tmountedOver    = Event(C.MOUNTEDOVER)\n)\n\n// PortEvent is a notify's equivalent of port_event_t.\ntype PortEvent struct {\n\tPortevEvents int         // PortevEvents is an equivalent of portev_events.\n\tPortevSource uint8       // PortevSource is an equivalent of portev_source.\n\tPortevPad    uint8       // Portevpad is an equivalent of portev_pad.\n\tPortevObject interface{} // PortevObject is an equivalent of portev_object.\n\tPortevUser   uintptr     // PortevUser is an equivalent of portev_user.\n}\n\n// FileObj is a notify's equivalent of file_obj.\ntype FileObj struct {\n\tAtim syscall.Timespec // Atim is an equivalent of fo_atime.\n\tMtim syscall.Timespec // Mtim is an equivalent of fo_mtime.\n\tCtim syscall.Timespec // Ctim is an equivalent of fo_ctime.\n\tPad  [3]uintptr       // Pad is an equivalent of fo_pad.\n\tName string           // Name is an equivalent of fo_name.\n}\n\ntype cfen struct {\n\tp2pe map[string]*C.port_event_t\n\tp2fo map[string]*C.struct_file_obj\n}\n\nfunc newCfen() cfen {\n\treturn cfen{\n\t\tp2pe: make(map[string]*C.port_event_t),\n\t\tp2fo: make(map[string]*C.struct_file_obj),\n\t}\n}\n\nfunc unix2C(sec int64, nsec int64) (C.time_t, C.long) {\n\treturn C.time_t(sec), C.long(nsec)\n}\n\nfunc (c *cfen) portAssociate(p int, fo FileObj, e int) (err error) {\n\tcfo := C.newFo()\n\tcfo.fo_atime.tv_sec, cfo.fo_atime.tv_nsec = unix2C(fo.Atim.Unix())\n\tcfo.fo_mtime.tv_sec, cfo.fo_mtime.tv_nsec = unix2C(fo.Mtim.Unix())\n\tcfo.fo_ctime.tv_sec, cfo.fo_ctime.tv_nsec = unix2C(fo.Ctim.Unix())\n\tcfo.fo_name = C.CString(fo.Name)\n\tc.p2fo[fo.Name] = cfo\n\t_, err = C.port_associate(C.int(p), srcFile, C.conv(cfo), C.int(e), nil)\n\treturn\n}\n\nfunc (c *cfen) portDissociate(port int, fo FileObj) (err error) {\n\tcfo, ok := c.p2fo[fo.Name]\n\tif !ok {\n\t\treturn errNotWatched\n\t}\n\t_, err = C.port_dissociate(C.int(port), srcFile, C.conv(cfo))\n\tC.free(unsafe.Pointer(cfo.fo_name))\n\tC.free(unsafe.Pointer(cfo))\n\tdelete(c.p2fo, fo.Name)\n\treturn\n}\n\nconst srcAlert = C.PORT_SOURCE_ALERT\nconst srcFile = C.PORT_SOURCE_FILE\nconst alertSet = C.PORT_ALERT_SET\n\nfunc cfo2fo(cfo *C.struct_file_obj) *FileObj {\n\t// Currently remaining attributes are not used.\n\tif cfo == nil {\n\t\treturn nil\n\t}\n\tvar fo FileObj\n\tfo.Name = C.GoString(cfo.fo_name)\n\treturn &fo\n}\n\nfunc (c *cfen) portGet(port int, pe *PortEvent) (err error) {\n\tcpe := C.newPe()\n\tif _, err = C.port_get(C.int(port), cpe, nil); err != nil {\n\t\tC.free(unsafe.Pointer(cpe))\n\t\treturn\n\t}\n\tpe.PortevEvents, pe.PortevSource, pe.PortevPad =\n\t\tint(cpe.portev_events), uint8(cpe.portev_source), uint8(cpe.portev_pad)\n\tpe.PortevObject = cfo2fo(C.dconv(cpe.portev_object))\n\tpe.PortevUser = uintptr(cpe.portev_user)\n\tC.free(unsafe.Pointer(cpe))\n\treturn\n}\n\nfunc (c *cfen) portCreate() (int, error) {\n\tp, err := C.port_create()\n\treturn int(p), err\n}\n\nfunc (c *cfen) portAlert(p int) (err error) {\n\t_, err = C.port_alert(C.int(p), alertSet, C.int(666), nil)\n\treturn\n}\n\nfunc (c *cfen) free() {\n\tfor i := range c.p2fo {\n\t\tC.free(unsafe.Pointer(c.p2fo[i].fo_name))\n\t\tC.free(unsafe.Pointer(c.p2fo[i]))\n\t}\n\tfor i := range c.p2pe {\n\t\tC.free(unsafe.Pointer(c.p2pe[i]))\n\t}\n\tc.p2fo = make(map[string]*C.struct_file_obj)\n\tc.p2pe = make(map[string]*C.port_event_t)\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_fsevents.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build darwin,!kqueue\n\npackage notify\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"sync/atomic\"\n)\n\nconst (\n\tfailure = uint32(FSEventsMustScanSubDirs | FSEventsUserDropped | FSEventsKernelDropped)\n\tfilter  = uint32(FSEventsCreated | FSEventsRemoved | FSEventsRenamed |\n\t\tFSEventsModified | FSEventsInodeMetaMod)\n)\n\n// FSEvent represents single file event. It is created out of values passed by\n// FSEvents to FSEventStreamCallback function.\ntype FSEvent struct {\n\tPath  string // real path of the file or directory\n\tID    uint64 // ID of the event (FSEventStreamEventId)\n\tFlags uint32 // joint FSEvents* flags (FSEventStreamEventFlags)\n}\n\n// splitflags separates event flags from single set into slice of flags.\nfunc splitflags(set uint32) (e []uint32) {\n\tfor i := uint32(1); set != 0; i, set = i<<1, set>>1 {\n\t\tif (set & 1) != 0 {\n\t\t\te = append(e, i)\n\t\t}\n\t}\n\treturn\n}\n\n// watch represents a filesystem watchpoint. It is a higher level abstraction\n// over FSEvents' stream, which implements filtering of file events based\n// on path and event set. It emulates non-recursive watch-point by filtering out\n// events which paths are more than 1 level deeper than the watched path.\ntype watch struct {\n\t// prev stores last event set  per path in order to filter out old flags\n\t// for new events, which appratenly FSEvents likes to retain. It's a disgusting\n\t// hack, it should be researched how to get rid of it.\n\tprev    map[string]uint32\n\tc       chan<- EventInfo\n\tstream  *stream\n\tpath    string\n\tevents  uint32\n\tisrec   int32\n\tflushed bool\n}\n\n// Example format:\n//\n//   ~ $ (trigger command) # (event set) -> (effective event set)\n//\n// Heuristics:\n//\n// 1. Create event is removed when it was present in previous event set.\n// Example:\n//\n//   ~ $ echo > file # Create|Write -> Create|Write\n//   ~ $ echo > file # Create|Write|InodeMetaMod -> Write|InodeMetaMod\n//\n// 2. Remove event is removed if it was present in previouse event set.\n// Example:\n//\n//   ~ $ touch file # Create -> Create\n//   ~ $ rm file    # Create|Remove -> Remove\n//   ~ $ touch file # Create|Remove -> Create\n//\n// 3. Write event is removed if not followed by InodeMetaMod on existing\n// file. Example:\n//\n//   ~ $ echo > file   # Create|Write -> Create|Write\n//   ~ $ chmod +x file # Create|Write|ChangeOwner -> ChangeOwner\n//\n// 4. Write&InodeMetaMod is removed when effective event set contain Remove event.\n// Example:\n//\n//   ~ $ echo > file # Write|InodeMetaMod -> Write|InodeMetaMod\n//   ~ $ rm file     # Remove|Write|InodeMetaMod -> Remove\n//\nfunc (w *watch) strip(base string, set uint32) uint32 {\n\tconst (\n\t\twrite = FSEventsModified | FSEventsInodeMetaMod\n\t\tboth  = FSEventsCreated | FSEventsRemoved\n\t)\n\tswitch w.prev[base] {\n\tcase FSEventsCreated:\n\t\tset &^= FSEventsCreated\n\t\tif set&FSEventsRemoved != 0 {\n\t\t\tw.prev[base] = FSEventsRemoved\n\t\t\tset &^= write\n\t\t}\n\tcase FSEventsRemoved:\n\t\tset &^= FSEventsRemoved\n\t\tif set&FSEventsCreated != 0 {\n\t\t\tw.prev[base] = FSEventsCreated\n\t\t}\n\tdefault:\n\t\tswitch set & both {\n\t\tcase FSEventsCreated:\n\t\t\tw.prev[base] = FSEventsCreated\n\t\tcase FSEventsRemoved:\n\t\t\tw.prev[base] = FSEventsRemoved\n\t\t\tset &^= write\n\t\t}\n\t}\n\tdbgprintf(\"split()=%v\\n\", Event(set))\n\treturn set\n}\n\n// Dispatch is a stream function which forwards given file events for the watched\n// path to underlying FileInfo channel.\nfunc (w *watch) Dispatch(ev []FSEvent) {\n\tevents := atomic.LoadUint32(&w.events)\n\tisrec := (atomic.LoadInt32(&w.isrec) == 1)\n\tfor i := range ev {\n\t\tif ev[i].Flags&FSEventsHistoryDone != 0 {\n\t\t\tw.flushed = true\n\t\t\tcontinue\n\t\t}\n\t\tif !w.flushed {\n\t\t\tcontinue\n\t\t}\n\t\tdbgprintf(\"%v (0x%x) (%s, i=%d, ID=%d, len=%d)\\n\", Event(ev[i].Flags),\n\t\t\tev[i].Flags, ev[i].Path, i, ev[i].ID, len(ev))\n\t\tif ev[i].Flags&failure != 0 {\n\t\t\t// TODO(rjeczalik): missing error handling\n\t\t\tcontinue\n\t\t}\n\t\tif !strings.HasPrefix(ev[i].Path, w.path) {\n\t\t\tcontinue\n\t\t}\n\t\tn := len(w.path)\n\t\tbase := \"\"\n\t\tif len(ev[i].Path) > n {\n\t\t\tif ev[i].Path[n] != '/' {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tbase = ev[i].Path[n+1:]\n\t\t\tif !isrec && strings.IndexByte(base, '/') != -1 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\t// TODO(rjeczalik): get diff only from filtered events?\n\t\te := w.strip(string(base), ev[i].Flags) & events\n\t\tif e == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, e := range splitflags(e) {\n\t\t\tdbgprintf(\"%d: single event: %v\", ev[i].ID, Event(e))\n\t\t\tw.c <- &event{\n\t\t\t\tfse:   ev[i],\n\t\t\t\tevent: Event(e),\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Stop closes underlying FSEvents stream and stops dispatching events.\nfunc (w *watch) Stop() {\n\tw.stream.Stop()\n\t// TODO(rjeczalik): make (*stream).Stop flush synchronously undelivered events,\n\t// so the following hack can be removed. It should flush all the streams\n\t// concurrently as we care not to block too much here.\n\tatomic.StoreUint32(&w.events, 0)\n\tatomic.StoreInt32(&w.isrec, 0)\n}\n\n// fsevents implements Watcher and RecursiveWatcher interfaces backed by FSEvents\n// framework.\ntype fsevents struct {\n\twatches map[string]*watch\n\tc       chan<- EventInfo\n}\n\nfunc newWatcher(c chan<- EventInfo) watcher {\n\treturn &fsevents{\n\t\twatches: make(map[string]*watch),\n\t\tc:       c,\n\t}\n}\n\nfunc (fse *fsevents) watch(path string, event Event, isrec int32) (err error) {\n\tif _, ok := fse.watches[path]; ok {\n\t\treturn errAlreadyWatched\n\t}\n\tw := &watch{\n\t\tprev:   make(map[string]uint32),\n\t\tc:      fse.c,\n\t\tpath:   path,\n\t\tevents: uint32(event),\n\t\tisrec:  isrec,\n\t}\n\tw.stream = newStream(path, w.Dispatch)\n\tif err = w.stream.Start(); err != nil {\n\t\treturn err\n\t}\n\tfse.watches[path] = w\n\treturn nil\n}\n\nfunc (fse *fsevents) unwatch(path string) (err error) {\n\tw, ok := fse.watches[path]\n\tif !ok {\n\t\treturn errNotWatched\n\t}\n\tw.stream.Stop()\n\tdelete(fse.watches, path)\n\treturn nil\n}\n\n// Watch implements Watcher interface. It fails with non-nil error when setting\n// the watch-point by FSEvents fails or with errAlreadyWatched error when\n// the given path is already watched.\nfunc (fse *fsevents) Watch(path string, event Event) error {\n\treturn fse.watch(path, event, 0)\n}\n\n// Unwatch implements Watcher interface. It fails with errNotWatched when\n// the given path is not being watched.\nfunc (fse *fsevents) Unwatch(path string) error {\n\treturn fse.unwatch(path)\n}\n\n// Rewatch implements Watcher interface. It fails with errNotWatched when\n// the given path is not being watched or with errInvalidEventSet when oldevent\n// does not match event set the watch-point currently holds.\nfunc (fse *fsevents) Rewatch(path string, oldevent, newevent Event) error {\n\tw, ok := fse.watches[path]\n\tif !ok {\n\t\treturn errNotWatched\n\t}\n\tif !atomic.CompareAndSwapUint32(&w.events, uint32(oldevent), uint32(newevent)) {\n\t\treturn errInvalidEventSet\n\t}\n\tatomic.StoreInt32(&w.isrec, 0)\n\treturn nil\n}\n\n// RecursiveWatch implements RecursiveWatcher interface. It fails with non-nil\n// error when setting the watch-point by FSEvents fails or with errAlreadyWatched\n// error when the given path is already watched.\nfunc (fse *fsevents) RecursiveWatch(path string, event Event) error {\n\treturn fse.watch(path, event, 1)\n}\n\n// RecursiveUnwatch implements RecursiveWatcher interface. It fails with\n// errNotWatched when the given path is not being watched.\n//\n// TODO(rjeczalik): fail if w.isrec == 0?\nfunc (fse *fsevents) RecursiveUnwatch(path string) error {\n\treturn fse.unwatch(path)\n}\n\n// RecrusiveRewatch implements RecursiveWatcher interface. It fails:\n//\n//   * with errNotWatched when the given path is not being watched\n//   * with errInvalidEventSet when oldevent does not match the current event set\n//   * with errAlreadyWatched when watch-point given by the oldpath was meant to\n//     be relocated to newpath, but the newpath is already watched\n//   * a non-nil error when setting the watch-point with FSEvents fails\n//\n// TODO(rjeczalik): Improve handling of watch-point relocation? See two TODOs\n// that follows.\nfunc (fse *fsevents) RecursiveRewatch(oldpath, newpath string, oldevent, newevent Event) error {\n\tswitch [2]bool{oldpath == newpath, oldevent == newevent} {\n\tcase [2]bool{true, true}:\n\t\tw, ok := fse.watches[oldpath]\n\t\tif !ok {\n\t\t\treturn errNotWatched\n\t\t}\n\t\tatomic.StoreInt32(&w.isrec, 1)\n\t\treturn nil\n\tcase [2]bool{true, false}:\n\t\tw, ok := fse.watches[oldpath]\n\t\tif !ok {\n\t\t\treturn errNotWatched\n\t\t}\n\t\tif !atomic.CompareAndSwapUint32(&w.events, uint32(oldevent), uint32(newevent)) {\n\t\t\treturn errors.New(\"invalid event state diff\")\n\t\t}\n\t\tatomic.StoreInt32(&w.isrec, 1)\n\t\treturn nil\n\tdefault:\n\t\t// TODO(rjeczalik): rewatch newpath only if exists?\n\t\t// TODO(rjeczalik): migrate w.prev to new watch?\n\t\tif _, ok := fse.watches[newpath]; ok {\n\t\t\treturn errAlreadyWatched\n\t\t}\n\t\tif err := fse.Unwatch(oldpath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// TODO(rjeczalik): revert unwatch if watch fails?\n\t\treturn fse.watch(newpath, newevent, 1)\n\t}\n}\n\n// Close unwatches all watch-points.\nfunc (fse *fsevents) Close() error {\n\tfor _, w := range fse.watches {\n\t\tw.Stop()\n\t}\n\tfse.watches = nil\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build darwin,!kqueue\n\npackage notify\n\n/*\n#include <CoreServices/CoreServices.h>\n\ntypedef void (*CFRunLoopPerformCallBack)(void*);\n\nvoid gosource(void *);\nvoid gostream(uintptr_t, uintptr_t, size_t, uintptr_t, uintptr_t, uintptr_t);\n\nstatic FSEventStreamRef EventStreamCreate(FSEventStreamContext * context, uintptr_t info, CFArrayRef paths, FSEventStreamEventId since, CFTimeInterval latency, FSEventStreamCreateFlags flags) {\n\tcontext->info = (void*) info;\n\treturn FSEventStreamCreate(NULL, (FSEventStreamCallback) gostream, context, paths, since, latency, flags);\n}\n\n#cgo LDFLAGS: -framework CoreServices\n*/\nimport \"C\"\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"unsafe\"\n)\n\nvar nilstream C.FSEventStreamRef\n\n// Default arguments for FSEventStreamCreate function.\nvar (\n\tlatency C.CFTimeInterval\n\tflags   = C.FSEventStreamCreateFlags(C.kFSEventStreamCreateFlagFileEvents | C.kFSEventStreamCreateFlagNoDefer)\n\tsince   = uint64(C.FSEventsGetCurrentEventId())\n)\n\nvar runloop C.CFRunLoopRef // global runloop which all streams are registered with\nvar wg sync.WaitGroup      // used to wait until the runloop starts\n\n// source is used for synchronization purposes - it signals when runloop has\n// started and is ready via the wg. It also serves purpose of a dummy source,\n// thanks to it the runloop does not return as it also has at least one source\n// registered.\nvar source = C.CFRunLoopSourceCreate(C.kCFAllocatorDefault, 0, &C.CFRunLoopSourceContext{\n\tperform: (C.CFRunLoopPerformCallBack)(C.gosource),\n})\n\n// Errors returned when FSEvents functions fail.\nvar (\n\terrCreate = os.NewSyscallError(\"FSEventStreamCreate\", errors.New(\"NULL\"))\n\terrStart  = os.NewSyscallError(\"FSEventStreamStart\", errors.New(\"false\"))\n)\n\n// initializes the global runloop and ensures any created stream awaits its\n// readiness.\nfunc init() {\n\twg.Add(1)\n\tgo func() {\n\t\t// There is exactly one run loop per thread. Lock this goroutine to its\n\t\t// thread to ensure that it's not rescheduled on a different thread while\n\t\t// setting up the run loop.\n\t\truntime.LockOSThread()\n\t\trunloop = C.CFRunLoopGetCurrent()\n\t\tC.CFRunLoopAddSource(runloop, source, C.kCFRunLoopDefaultMode)\n\t\tC.CFRunLoopRun()\n\t\tpanic(\"runloop has just unexpectedly stopped\")\n\t}()\n\tC.CFRunLoopSourceSignal(source)\n}\n\n//export gosource\nfunc gosource(unsafe.Pointer) {\n\twg.Done()\n}\n\n//export gostream\nfunc gostream(_, info uintptr, n C.size_t, paths, flags, ids uintptr) {\n\tconst (\n\t\toffchar = unsafe.Sizeof((*C.char)(nil))\n\t\toffflag = unsafe.Sizeof(C.FSEventStreamEventFlags(0))\n\t\toffid   = unsafe.Sizeof(C.FSEventStreamEventId(0))\n\t)\n\tif n == 0 {\n\t\treturn\n\t}\n\tfn := streamFuncs.get(info)\n\tif fn == nil {\n\t\treturn\n\t}\n\tev := make([]FSEvent, 0, int(n))\n\tfor i := uintptr(0); i < uintptr(n); i++ {\n\t\tswitch flags := *(*uint32)(unsafe.Pointer((flags + i*offflag))); {\n\t\tcase flags&uint32(FSEventsEventIdsWrapped) != 0:\n\t\t\tatomic.StoreUint64(&since, uint64(C.FSEventsGetCurrentEventId()))\n\t\tdefault:\n\t\t\tev = append(ev, FSEvent{\n\t\t\t\tPath:  C.GoString(*(**C.char)(unsafe.Pointer(paths + i*offchar))),\n\t\t\t\tFlags: flags,\n\t\t\t\tID:    *(*uint64)(unsafe.Pointer(ids + i*offid)),\n\t\t\t})\n\t\t}\n\n\t}\n\tfn(ev)\n}\n\n// StreamFunc is a callback called when stream receives file events.\ntype streamFunc func([]FSEvent)\n\nvar streamFuncs = streamFuncRegistry{m: map[uintptr]streamFunc{}}\n\ntype streamFuncRegistry struct {\n\tmu sync.Mutex\n\tm  map[uintptr]streamFunc\n\ti  uintptr\n}\n\nfunc (r *streamFuncRegistry) get(id uintptr) streamFunc {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\treturn r.m[id]\n}\n\nfunc (r *streamFuncRegistry) add(fn streamFunc) uintptr {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tr.i++\n\tr.m[r.i] = fn\n\treturn r.i\n}\n\nfunc (r *streamFuncRegistry) delete(id uintptr) {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\tdelete(r.m, id)\n}\n\n// Stream represents single watch-point which listens for events scheduled by\n// the global runloop.\ntype stream struct {\n\tpath string\n\tref  C.FSEventStreamRef\n\tinfo uintptr\n}\n\n// NewStream creates a stream for given path, listening for file events and\n// calling fn upon receiving any.\nfunc newStream(path string, fn streamFunc) *stream {\n\treturn &stream{\n\t\tpath: path,\n\t\tinfo: streamFuncs.add(fn),\n\t}\n}\n\n// Start creates a FSEventStream for the given path and schedules it with\n// global runloop. It's a nop if the stream was already started.\nfunc (s *stream) Start() error {\n\tif s.ref != nilstream {\n\t\treturn nil\n\t}\n\twg.Wait()\n\tp := C.CFStringCreateWithCStringNoCopy(C.kCFAllocatorDefault, C.CString(s.path), C.kCFStringEncodingUTF8, C.kCFAllocatorDefault)\n\tpath := C.CFArrayCreate(C.kCFAllocatorDefault, (*unsafe.Pointer)(unsafe.Pointer(&p)), 1, nil)\n\tctx := C.FSEventStreamContext{}\n\tref := C.EventStreamCreate(&ctx, C.uintptr_t(s.info), path, C.FSEventStreamEventId(atomic.LoadUint64(&since)), latency, flags)\n\tif ref == nilstream {\n\t\treturn errCreate\n\t}\n\tC.FSEventStreamScheduleWithRunLoop(ref, runloop, C.kCFRunLoopDefaultMode)\n\tif C.FSEventStreamStart(ref) == C.Boolean(0) {\n\t\tC.FSEventStreamInvalidate(ref)\n\t\treturn errStart\n\t}\n\tC.CFRunLoopWakeUp(runloop)\n\ts.ref = ref\n\treturn nil\n}\n\n// Stop stops underlying FSEventStream and unregisters it from global runloop.\nfunc (s *stream) Stop() {\n\tif s.ref == nilstream {\n\t\treturn\n\t}\n\twg.Wait()\n\tC.FSEventStreamStop(s.ref)\n\tC.FSEventStreamInvalidate(s.ref)\n\tC.CFRunLoopWakeUp(runloop)\n\ts.ref = nilstream\n\tstreamFuncs.delete(s.info)\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_inotify.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build linux\n\npackage notify\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"unsafe\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\n// eventBufferSize defines the size of the buffer given to read(2) function. One\n// should not depend on this value, since it was arbitrary chosen and may be\n// changed in the future.\nconst eventBufferSize = 64 * (unix.SizeofInotifyEvent + unix.PathMax + 1)\n\n// consumersCount defines the number of consumers in producer-consumer based\n// implementation. Each consumer is run in a separate goroutine and has read\n// access to watched files map.\nconst consumersCount = 2\n\nconst invalidDescriptor = -1\n\n// watched is a pair of file path and inotify mask used as a value in\n// watched files map.\ntype watched struct {\n\tpath string\n\tmask uint32\n}\n\n// inotify implements Watcher interface.\ntype inotify struct {\n\tsync.RWMutex                       // protects inotify.m map\n\tm            map[int32]*watched    // watch descriptor to watched object\n\tfd           int32                 // inotify file descriptor\n\tpipefd       []int                 // pipe's read and write descriptors\n\tepfd         int                   // epoll descriptor\n\tepes         []unix.EpollEvent     // epoll events\n\tbuffer       [eventBufferSize]byte // inotify event buffer\n\twg           sync.WaitGroup        // wait group used to close main loop\n\tc            chan<- EventInfo      // event dispatcher channel\n}\n\n// NewWatcher creates new non-recursive inotify backed by inotify.\nfunc newWatcher(c chan<- EventInfo) watcher {\n\ti := &inotify{\n\t\tm:      make(map[int32]*watched),\n\t\tfd:     invalidDescriptor,\n\t\tpipefd: []int{invalidDescriptor, invalidDescriptor},\n\t\tepfd:   invalidDescriptor,\n\t\tepes:   make([]unix.EpollEvent, 0),\n\t\tc:      c,\n\t}\n\truntime.SetFinalizer(i, func(i *inotify) {\n\t\ti.epollclose()\n\t\tif i.fd != invalidDescriptor {\n\t\t\tunix.Close(int(i.fd))\n\t\t}\n\t})\n\treturn i\n}\n\n// Watch implements notify.watcher interface.\nfunc (i *inotify) Watch(path string, e Event) error {\n\treturn i.watch(path, e)\n}\n\n// Rewatch implements notify.watcher interface.\nfunc (i *inotify) Rewatch(path string, _, newevent Event) error {\n\treturn i.watch(path, newevent)\n}\n\n// watch adds a new watcher to the set of watched objects or modifies the existing\n// one. If called for the first time, this function initializes inotify filesystem\n// monitor and starts producer-consumers goroutines.\nfunc (i *inotify) watch(path string, e Event) (err error) {\n\tif e&^(All|Event(unix.IN_ALL_EVENTS)) != 0 {\n\t\treturn errors.New(\"notify: unknown event\")\n\t}\n\tif err = i.lazyinit(); err != nil {\n\t\treturn\n\t}\n\tiwd, err := unix.InotifyAddWatch(int(i.fd), path, encode(e))\n\tif err != nil {\n\t\treturn\n\t}\n\ti.RLock()\n\twd := i.m[int32(iwd)]\n\ti.RUnlock()\n\tif wd == nil {\n\t\ti.Lock()\n\t\tif i.m[int32(iwd)] == nil {\n\t\t\ti.m[int32(iwd)] = &watched{path: path, mask: uint32(e)}\n\t\t}\n\t\ti.Unlock()\n\t} else {\n\t\ti.Lock()\n\t\twd.mask = uint32(e)\n\t\ti.Unlock()\n\t}\n\treturn nil\n}\n\n// lazyinit sets up all required file descriptors and starts 1+consumersCount\n// goroutines. The producer goroutine blocks until file-system notifications\n// occur. Then, all events are read from system buffer and sent to consumer\n// goroutines which construct valid notify events. This method uses\n// Double-Checked Locking optimization.\nfunc (i *inotify) lazyinit() error {\n\tif atomic.LoadInt32(&i.fd) == invalidDescriptor {\n\t\ti.Lock()\n\t\tdefer i.Unlock()\n\t\tif atomic.LoadInt32(&i.fd) == invalidDescriptor {\n\t\t\tfd, err := unix.InotifyInit1(unix.IN_CLOEXEC)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\ti.fd = int32(fd)\n\t\t\tif err = i.epollinit(); err != nil {\n\t\t\t\t_, _ = i.epollclose(), unix.Close(int(fd)) // Ignore errors.\n\t\t\t\ti.fd = invalidDescriptor\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tesch := make(chan []*event)\n\t\t\tgo i.loop(esch)\n\t\t\ti.wg.Add(consumersCount)\n\t\t\tfor n := 0; n < consumersCount; n++ {\n\t\t\t\tgo i.send(esch)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\n// epollinit opens an epoll file descriptor and creates a pipe which will be\n// used to wake up the epoll_wait(2) function. Then, file descriptor associated\n// with inotify event queue and the read end of the pipe are added to epoll set.\n// Note that `fd` member must be set before this function is called.\nfunc (i *inotify) epollinit() (err error) {\n\tif i.epfd, err = unix.EpollCreate1(0); err != nil {\n\t\treturn\n\t}\n\tif err = unix.Pipe(i.pipefd); err != nil {\n\t\treturn\n\t}\n\ti.epes = []unix.EpollEvent{\n\t\t{Events: unix.EPOLLIN, Fd: i.fd},\n\t\t{Events: unix.EPOLLIN, Fd: int32(i.pipefd[0])},\n\t}\n\tif err = unix.EpollCtl(i.epfd, unix.EPOLL_CTL_ADD, int(i.fd), &i.epes[0]); err != nil {\n\t\treturn\n\t}\n\treturn unix.EpollCtl(i.epfd, unix.EPOLL_CTL_ADD, i.pipefd[0], &i.epes[1])\n}\n\n// epollclose closes the file descriptor created by the call to epoll_create(2)\n// and two file descriptors opened by pipe(2) function.\nfunc (i *inotify) epollclose() (err error) {\n\tif i.epfd != invalidDescriptor {\n\t\tif err = unix.Close(i.epfd); err == nil {\n\t\t\ti.epfd = invalidDescriptor\n\t\t}\n\t}\n\tfor n, fd := range i.pipefd {\n\t\tif fd != invalidDescriptor {\n\t\t\tswitch e := unix.Close(fd); {\n\t\t\tcase e != nil && err == nil:\n\t\t\t\terr = e\n\t\t\tcase e == nil:\n\t\t\t\ti.pipefd[n] = invalidDescriptor\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// loop blocks until either inotify or pipe file descriptor is ready for I/O.\n// All read operations triggered by filesystem notifications are forwarded to\n// one of the event's consumers. If pipe fd became ready, loop function closes\n// all file descriptors opened by lazyinit method and returns afterwards.\nfunc (i *inotify) loop(esch chan<- []*event) {\n\tepes := make([]unix.EpollEvent, 1)\n\tfd := atomic.LoadInt32(&i.fd)\n\tfor {\n\t\tswitch _, err := unix.EpollWait(i.epfd, epes, -1); err {\n\t\tcase nil:\n\t\t\tswitch epes[0].Fd {\n\t\t\tcase fd:\n\t\t\t\tesch <- i.read()\n\t\t\t\tepes[0].Fd = 0\n\t\t\tcase int32(i.pipefd[0]):\n\t\t\t\ti.Lock()\n\t\t\t\tdefer i.Unlock()\n\t\t\t\tif err = unix.Close(int(fd)); err != nil && err != unix.EINTR {\n\t\t\t\t\tpanic(\"notify: close(2) error \" + err.Error())\n\t\t\t\t}\n\t\t\t\tatomic.StoreInt32(&i.fd, invalidDescriptor)\n\t\t\t\tif err = i.epollclose(); err != nil && err != unix.EINTR {\n\t\t\t\t\tpanic(\"notify: epollclose error \" + err.Error())\n\t\t\t\t}\n\t\t\t\tclose(esch)\n\t\t\t\treturn\n\t\t\t}\n\t\tcase unix.EINTR:\n\t\t\tcontinue\n\t\tdefault: // We should never reach this line.\n\t\t\tpanic(\"notify: epoll_wait(2) error \" + err.Error())\n\t\t}\n\t}\n}\n\n// read reads events from an inotify file descriptor. It does not handle errors\n// returned from read(2) function since they are not critical to watcher logic.\nfunc (i *inotify) read() (es []*event) {\n\tn, err := unix.Read(int(i.fd), i.buffer[:])\n\tif err != nil || n < unix.SizeofInotifyEvent {\n\t\treturn\n\t}\n\tvar sys *unix.InotifyEvent\n\tnmin := n - unix.SizeofInotifyEvent\n\tfor pos, path := 0, \"\"; pos <= nmin; {\n\t\tsys = (*unix.InotifyEvent)(unsafe.Pointer(&i.buffer[pos]))\n\t\tpos += unix.SizeofInotifyEvent\n\t\tif path = \"\"; sys.Len > 0 {\n\t\t\tendpos := pos + int(sys.Len)\n\t\t\tpath = string(bytes.TrimRight(i.buffer[pos:endpos], \"\\x00\"))\n\t\t\tpos = endpos\n\t\t}\n\t\tes = append(es, &event{\n\t\t\tsys: unix.InotifyEvent{\n\t\t\t\tWd:     sys.Wd,\n\t\t\t\tMask:   sys.Mask,\n\t\t\t\tCookie: sys.Cookie,\n\t\t\t},\n\t\t\tpath: path,\n\t\t})\n\t}\n\treturn\n}\n\n// send is a consumer function which sends events to event dispatcher channel.\n// It is run in a separate goroutine in order to not block loop method when\n// possibly expensive write operations are performed on inotify map.\nfunc (i *inotify) send(esch <-chan []*event) {\n\tfor es := range esch {\n\t\tfor _, e := range i.transform(es) {\n\t\t\tif e != nil {\n\t\t\t\ti.c <- e\n\t\t\t}\n\t\t}\n\t}\n\ti.wg.Done()\n}\n\n// transform prepares events read from inotify file descriptor for sending to\n// user. It removes invalid events and these which are no longer present in\n// inotify map. This method may also split one raw event into two different ones\n// when system-dependent result is required.\nfunc (i *inotify) transform(es []*event) []*event {\n\tvar multi []*event\n\ti.RLock()\n\tfor idx, e := range es {\n\t\tif e.sys.Mask&(unix.IN_IGNORED|unix.IN_Q_OVERFLOW) != 0 {\n\t\t\tes[idx] = nil\n\t\t\tcontinue\n\t\t}\n\t\twd, ok := i.m[e.sys.Wd]\n\t\tif !ok || e.sys.Mask&encode(Event(wd.mask)) == 0 {\n\t\t\tes[idx] = nil\n\t\t\tcontinue\n\t\t}\n\t\tif e.path == \"\" {\n\t\t\te.path = wd.path\n\t\t} else {\n\t\t\te.path = filepath.Join(wd.path, e.path)\n\t\t}\n\t\tmulti = append(multi, decode(Event(wd.mask), e))\n\t\tif e.event == 0 {\n\t\t\tes[idx] = nil\n\t\t}\n\t}\n\ti.RUnlock()\n\tes = append(es, multi...)\n\treturn es\n}\n\n// encode converts notify system-independent events to valid inotify mask\n// which can be passed to inotify_add_watch(2) function.\nfunc encode(e Event) uint32 {\n\tif e&Create != 0 {\n\t\te = (e ^ Create) | InCreate | InMovedTo\n\t}\n\tif e&Remove != 0 {\n\t\te = (e ^ Remove) | InDelete | InDeleteSelf\n\t}\n\tif e&Write != 0 {\n\t\te = (e ^ Write) | InModify\n\t}\n\tif e&Rename != 0 {\n\t\te = (e ^ Rename) | InMovedFrom | InMoveSelf\n\t}\n\treturn uint32(e)\n}\n\n// decode uses internally stored mask to distinguish whether system-independent\n// or system-dependent event is requested. The first one is created by modifying\n// `e` argument. decode method sets e.event value to 0 when an event should be\n// skipped. System-dependent event is set as the function's return value which\n// can be nil when the event should not be passed on.\nfunc decode(mask Event, e *event) (syse *event) {\n\tif sysmask := uint32(mask) & e.sys.Mask; sysmask != 0 {\n\t\tsyse = &event{sys: unix.InotifyEvent{\n\t\t\tWd:     e.sys.Wd,\n\t\t\tMask:   e.sys.Mask,\n\t\t\tCookie: e.sys.Cookie,\n\t\t}, event: Event(sysmask), path: e.path}\n\t}\n\timask := encode(mask)\n\tswitch {\n\tcase mask&Create != 0 && imask&uint32(InCreate|InMovedTo)&e.sys.Mask != 0:\n\t\te.event = Create\n\tcase mask&Remove != 0 && imask&uint32(InDelete|InDeleteSelf)&e.sys.Mask != 0:\n\t\te.event = Remove\n\tcase mask&Write != 0 && imask&uint32(InModify)&e.sys.Mask != 0:\n\t\te.event = Write\n\tcase mask&Rename != 0 && imask&uint32(InMovedFrom|InMoveSelf)&e.sys.Mask != 0:\n\t\te.event = Rename\n\tdefault:\n\t\te.event = 0\n\t}\n\treturn\n}\n\n// Unwatch implements notify.watcher interface. It looks for watch descriptor\n// related to registered path and if found, calls inotify_rm_watch(2) function.\n// This method is allowed to return EINVAL error when concurrently requested to\n// delete identical path.\nfunc (i *inotify) Unwatch(path string) (err error) {\n\tiwd := int32(invalidDescriptor)\n\ti.RLock()\n\tfor iwdkey, wd := range i.m {\n\t\tif wd.path == path {\n\t\t\tiwd = iwdkey\n\t\t\tbreak\n\t\t}\n\t}\n\ti.RUnlock()\n\tif iwd == invalidDescriptor {\n\t\treturn errors.New(\"notify: path \" + path + \" is already watched\")\n\t}\n\tfd := atomic.LoadInt32(&i.fd)\n\tif err = removeInotifyWatch(fd, iwd); err != nil {\n\t\treturn\n\t}\n\ti.Lock()\n\tdelete(i.m, iwd)\n\ti.Unlock()\n\treturn nil\n}\n\n// Close implements notify.watcher interface. It removes all existing watch\n// descriptors and wakes up producer goroutine by sending data to the write end\n// of the pipe. The function waits for a signal from producer which means that\n// all operations on current monitoring instance are done.\nfunc (i *inotify) Close() (err error) {\n\ti.Lock()\n\tif fd := atomic.LoadInt32(&i.fd); fd == invalidDescriptor {\n\t\ti.Unlock()\n\t\treturn nil\n\t}\n\tfor iwd := range i.m {\n\t\tif e := removeInotifyWatch(i.fd, iwd); e != nil && err == nil {\n\t\t\terr = e\n\t\t}\n\t\tdelete(i.m, iwd)\n\t}\n\tswitch _, errwrite := unix.Write(i.pipefd[1], []byte{0x00}); {\n\tcase errwrite != nil && err == nil:\n\t\terr = errwrite\n\t\tfallthrough\n\tcase errwrite != nil:\n\t\ti.Unlock()\n\tdefault:\n\t\ti.Unlock()\n\t\ti.wg.Wait()\n\t}\n\treturn\n}\n\n// if path was removed, notify already removed the watch and returns EINVAL error\nfunc removeInotifyWatch(fd int32, iwd int32) (err error) {\n\tif _, err = unix.InotifyRmWatch(int(fd), uint32(iwd)); err != nil && err != unix.EINVAL {\n\t\treturn\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_kqueue.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build darwin,kqueue dragonfly freebsd netbsd openbsd\n\npackage notify\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"syscall\"\n)\n\n// newTrigger returns implementation of trigger.\nfunc newTrigger(pthLkp map[string]*watched) trigger {\n\treturn &kq{\n\t\tpthLkp: pthLkp,\n\t\tidLkp:  make(map[int]*watched),\n\t}\n}\n\n// kq is a structure implementing trigger for kqueue.\ntype kq struct {\n\t// fd is a kqueue file descriptor\n\tfd int\n\t// pipefds are file descriptors used to stop `Kevent` call.\n\tpipefds [2]int\n\t// idLkp is a data structure mapping file descriptors with data about watching\n\t// represented by them files/directories.\n\tidLkp map[int]*watched\n\t// pthLkp is a structure mapping monitored files/dir with data about them,\n\t// shared with parent trg structure\n\tpthLkp map[string]*watched\n}\n\n// watched is a data structure representing watched file/directory.\ntype watched struct {\n\ttrgWatched\n\t// fd is a file descriptor for watched file/directory.\n\tfd int\n}\n\n// Stop implements trigger.\nfunc (k *kq) Stop() (err error) {\n\t// trigger event used to interrupt Kevent call.\n\t_, err = syscall.Write(k.pipefds[1], []byte{0x00})\n\treturn\n}\n\n// Close implements trigger.\nfunc (k *kq) Close() error {\n\treturn syscall.Close(k.fd)\n}\n\n// NewWatched implements trigger.\nfunc (*kq) NewWatched(p string, fi os.FileInfo) (*watched, error) {\n\tfd, err := syscall.Open(p, syscall.O_NONBLOCK|syscall.O_RDONLY, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &watched{\n\t\ttrgWatched: trgWatched{p: p, fi: fi},\n\t\tfd:         fd,\n\t}, nil\n}\n\n// Record implements trigger.\nfunc (k *kq) Record(w *watched) {\n\tk.idLkp[w.fd], k.pthLkp[w.p] = w, w\n}\n\n// Del implements trigger.\nfunc (k *kq) Del(w *watched) {\n\tsyscall.Close(w.fd)\n\tdelete(k.idLkp, w.fd)\n\tdelete(k.pthLkp, w.p)\n}\n\nfunc inter2kq(n interface{}) syscall.Kevent_t {\n\tkq, ok := n.(syscall.Kevent_t)\n\tif !ok {\n\t\tpanic(fmt.Sprintf(\"kqueue: type should be Kevent_t, %T instead\", n))\n\t}\n\treturn kq\n}\n\n// Init implements trigger.\nfunc (k *kq) Init() (err error) {\n\tif k.fd, err = syscall.Kqueue(); err != nil {\n\t\treturn\n\t}\n\t// Creates pipe used to stop `Kevent` call by registering it,\n\t// watching read end and writing to other end of it.\n\tif err = syscall.Pipe(k.pipefds[:]); err != nil {\n\t\treturn nonil(err, k.Close())\n\t}\n\tvar kevn [1]syscall.Kevent_t\n\tsyscall.SetKevent(&kevn[0], k.pipefds[0], syscall.EVFILT_READ, syscall.EV_ADD)\n\tif _, err = syscall.Kevent(k.fd, kevn[:], nil, nil); err != nil {\n\t\treturn nonil(err, k.Close())\n\t}\n\treturn\n}\n\n// Unwatch implements trigger.\nfunc (k *kq) Unwatch(w *watched) (err error) {\n\tvar kevn [1]syscall.Kevent_t\n\tsyscall.SetKevent(&kevn[0], w.fd, syscall.EVFILT_VNODE, syscall.EV_DELETE)\n\n\t_, err = syscall.Kevent(k.fd, kevn[:], nil, nil)\n\treturn\n}\n\n// Watch implements trigger.\nfunc (k *kq) Watch(fi os.FileInfo, w *watched, e int64) (err error) {\n\tvar kevn [1]syscall.Kevent_t\n\tsyscall.SetKevent(&kevn[0], w.fd, syscall.EVFILT_VNODE,\n\t\tsyscall.EV_ADD|syscall.EV_CLEAR)\n\tkevn[0].Fflags = uint32(e)\n\n\t_, err = syscall.Kevent(k.fd, kevn[:], nil, nil)\n\treturn\n}\n\n// Wait implements trigger.\nfunc (k *kq) Wait() (interface{}, error) {\n\tvar (\n\t\tkevn [1]syscall.Kevent_t\n\t\terr  error\n\t)\n\tkevn[0] = syscall.Kevent_t{}\n\t_, err = syscall.Kevent(k.fd, nil, kevn[:], nil)\n\n\treturn kevn[0], err\n}\n\n// Watched implements trigger.\nfunc (k *kq) Watched(n interface{}) (*watched, int64, error) {\n\tkevn, ok := n.(syscall.Kevent_t)\n\tif !ok {\n\t\tpanic(fmt.Sprintf(\"kq: type should be syscall.Kevent_t, %T instead\", kevn))\n\t}\n\tif _, ok = k.idLkp[int(kevn.Ident)]; !ok {\n\t\treturn nil, 0, errNotWatched\n\t}\n\treturn k.idLkp[int(kevn.Ident)], int64(kevn.Fflags), nil\n}\n\n// IsStop implements trigger.\nfunc (k *kq) IsStop(n interface{}, err error) bool {\n\treturn int(inter2kq(n).Ident) == k.pipefds[0]\n}\n\nfunc init() {\n\tencode = func(e Event, dir bool) (o int64) {\n\t\t// Create event is not supported by kqueue. Instead NoteWrite event will\n\t\t// be registered for a directory. If this event will be reported on dir\n\t\t// which is to be monitored for Create, dir will be rescanned\n\t\t// and Create events will be generated and returned for new files.\n\t\t// In case of files, if not requested NoteRename event is reported,\n\t\t// it will be ignored.\n\t\to = int64(e &^ Create)\n\t\tif (e&Create != 0 && dir) || e&Write != 0 {\n\t\t\to = (o &^ int64(Write)) | int64(NoteWrite)\n\t\t}\n\t\tif e&Rename != 0 {\n\t\t\to = (o &^ int64(Rename)) | int64(NoteRename)\n\t\t}\n\t\tif e&Remove != 0 {\n\t\t\to = (o &^ int64(Remove)) | int64(NoteDelete)\n\t\t}\n\t\treturn\n\t}\n\tnat2not = map[Event]Event{\n\t\tNoteWrite:  Write,\n\t\tNoteRename: Rename,\n\t\tNoteDelete: Remove,\n\t\tNoteExtend: Event(0),\n\t\tNoteAttrib: Event(0),\n\t\tNoteRevoke: Event(0),\n\t\tNoteLink:   Event(0),\n\t}\n\tnot2nat = map[Event]Event{\n\t\tWrite:  NoteWrite,\n\t\tRename: NoteRename,\n\t\tRemove: NoteDelete,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_notimplemented.go",
    "content": "// Copyright (c) 2014-2018 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build !darwin,!linux,!freebsd,!dragonfly,!netbsd,!openbsd,!windows\n// +build !kqueue,!solaris\n\npackage notify\n\nimport \"errors\"\n\n// newWatcher stub.\nfunc newWatcher(chan<- EventInfo) watcher {\n\treturn watcherStub{errors.New(\"notify: not implemented\")}\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_readdcw.go",
    "content": "// Copyright (c) 2014-2018 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build windows\n\npackage notify\n\nimport (\n\t\"errors\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n// readBufferSize defines the size of an array in which read statuses are stored.\n// The buffer have to be DWORD-aligned and, if notify is used in monitoring a\n// directory over the network, its size must not be greater than 64KB. Each of\n// watched directories uses its own buffer for storing events.\nconst readBufferSize = 4096\n\n// Since all operations which go through the Windows completion routine are done\n// asynchronously, filter may set one of the constants below. They were defined\n// in order to distinguish whether current folder should be re-registered in\n// ReadDirectoryChangesW function or some control operations need to be executed.\nconst (\n\tstateRewatch uint32 = 1 << (28 + iota)\n\tstateUnwatch\n\tstateCPClose\n)\n\n// Filter used in current implementation was split into four segments:\n//  - bits  0-11 store ReadDirectoryChangesW filters,\n//  - bits 12-19 store File notify actions,\n//  - bits 20-27 store notify specific events and flags,\n//  - bits 28-31 store states which are used in loop's FSM.\n// Constants below are used as masks to retrieve only specific filter parts.\nconst (\n\tonlyNotifyChanges uint32 = 0x00000FFF\n\tonlyNGlobalEvents uint32 = 0x0FF00000\n\tonlyMachineStates uint32 = 0xF0000000\n)\n\n// grip represents a single watched directory. It stores the data required by\n// ReadDirectoryChangesW function. Only the filter, recursive, and handle members\n// may by modified by watcher implementation. Rest of the them have to remain\n// constant since they are used by Windows completion routine. This indicates that\n// grip can be removed only when all operations on the file handle are finished.\ntype grip struct {\n\thandle    syscall.Handle\n\tfilter    uint32\n\trecursive bool\n\tpathw     []uint16\n\tbuffer    [readBufferSize]byte\n\tparent    *watched\n\tovlapped  *overlappedEx\n}\n\n// overlappedEx stores information used in asynchronous input and output.\n// Additionally, overlappedEx contains a pointer to 'grip' item which is used in\n// order to gather the structure in which the overlappedEx object was created.\ntype overlappedEx struct {\n\tsyscall.Overlapped\n\tparent *grip\n}\n\n// newGrip creates a new file handle that can be used in overlapped operations.\n// Then, the handle is associated with I/O completion port 'cph' and its value\n// is stored in newly created 'grip' object.\nfunc newGrip(cph syscall.Handle, parent *watched, filter uint32) (*grip, error) {\n\tg := &grip{\n\t\thandle:    syscall.InvalidHandle,\n\t\tfilter:    filter,\n\t\trecursive: parent.recursive,\n\t\tpathw:     parent.pathw,\n\t\tparent:    parent,\n\t\tovlapped:  &overlappedEx{},\n\t}\n\tif err := g.register(cph); err != nil {\n\t\treturn nil, err\n\t}\n\tg.ovlapped.parent = g\n\treturn g, nil\n}\n\n// NOTE : Thread safe\nfunc (g *grip) register(cph syscall.Handle) (err error) {\n\tif g.handle, err = syscall.CreateFile(\n\t\t&g.pathw[0],\n\t\tsyscall.FILE_LIST_DIRECTORY,\n\t\tsyscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,\n\t\tnil,\n\t\tsyscall.OPEN_EXISTING,\n\t\tsyscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED,\n\t\t0,\n\t); err != nil {\n\t\treturn\n\t}\n\tif _, err = syscall.CreateIoCompletionPort(g.handle, cph, 0, 0); err != nil {\n\t\tsyscall.CloseHandle(g.handle)\n\t\treturn\n\t}\n\treturn g.readDirChanges()\n}\n\n// readDirChanges tells the system to store file change information in grip's\n// buffer. Directory changes that occur between calls to this function are added\n// to the buffer and then, returned with the next call.\nfunc (g *grip) readDirChanges() error {\n\thandle := syscall.Handle(atomic.LoadUintptr((*uintptr)(&g.handle)))\n\tif handle == syscall.InvalidHandle {\n\t\treturn nil // Handle was closed.\n\t}\n\n\treturn syscall.ReadDirectoryChanges(\n\t\thandle,\n\t\t&g.buffer[0],\n\t\tuint32(unsafe.Sizeof(g.buffer)),\n\t\tg.recursive,\n\t\tencode(g.filter),\n\t\tnil,\n\t\t(*syscall.Overlapped)(unsafe.Pointer(g.ovlapped)),\n\t\t0,\n\t)\n}\n\n// encode transforms a generic filter, which contains platform independent and\n// implementation specific bit fields, to value that can be used as NotifyFilter\n// parameter in ReadDirectoryChangesW function.\nfunc encode(filter uint32) uint32 {\n\te := Event(filter & (onlyNGlobalEvents | onlyNotifyChanges))\n\tif e&dirmarker != 0 {\n\t\treturn uint32(FileNotifyChangeDirName)\n\t}\n\tif e&Create != 0 {\n\t\te = (e ^ Create) | FileNotifyChangeFileName\n\t}\n\tif e&Remove != 0 {\n\t\te = (e ^ Remove) | FileNotifyChangeFileName\n\t}\n\tif e&Write != 0 {\n\t\te = (e ^ Write) | FileNotifyChangeAttributes | FileNotifyChangeSize |\n\t\t\tFileNotifyChangeCreation | FileNotifyChangeSecurity\n\t}\n\tif e&Rename != 0 {\n\t\te = (e ^ Rename) | FileNotifyChangeFileName\n\t}\n\treturn uint32(e)\n}\n\n// watched is made in order to check whether an action comes from a directory or\n// file. This approach requires two file handlers per single monitored folder. The\n// second grip handles actions which include creating or deleting a directory. If\n// these processes are not monitored, only the first grip is created.\ntype watched struct {\n\tfilter    uint32\n\trecursive bool\n\tcount     uint8\n\tpathw     []uint16\n\tdigrip    [2]*grip\n}\n\n// newWatched creates a new watched instance. It splits the filter variable into\n// two parts. The first part is responsible for watching all events which can be\n// created for a file in watched directory structure and the second one watches\n// only directory Create/Remove actions. If all operations succeed, the Create\n// message is sent to I/O completion port queue for further processing.\nfunc newWatched(cph syscall.Handle, filter uint32, recursive bool,\n\tpath string) (wd *watched, err error) {\n\twd = &watched{\n\t\tfilter:    filter,\n\t\trecursive: recursive,\n\t}\n\tif wd.pathw, err = syscall.UTF16FromString(path); err != nil {\n\t\treturn\n\t}\n\tif err = wd.recreate(cph); err != nil {\n\t\treturn\n\t}\n\treturn wd, nil\n}\n\n// TODO : doc\nfunc (wd *watched) recreate(cph syscall.Handle) (err error) {\n\tfilefilter := wd.filter &^ uint32(FileNotifyChangeDirName)\n\tif err = wd.updateGrip(0, cph, filefilter == 0, filefilter); err != nil {\n\t\treturn\n\t}\n\tdirfilter := wd.filter & uint32(FileNotifyChangeDirName|Create|Remove)\n\tif err = wd.updateGrip(1, cph, dirfilter == 0, wd.filter|uint32(dirmarker)); err != nil {\n\t\treturn\n\t}\n\twd.filter &^= onlyMachineStates\n\treturn\n}\n\n// TODO : doc\nfunc (wd *watched) updateGrip(idx int, cph syscall.Handle, reset bool,\n\tnewflag uint32) (err error) {\n\tif reset {\n\t\twd.digrip[idx] = nil\n\t} else {\n\t\tif wd.digrip[idx] == nil {\n\t\t\tif wd.digrip[idx], err = newGrip(cph, wd, newflag); err != nil {\n\t\t\t\twd.closeHandle()\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\twd.digrip[idx].filter = newflag\n\t\t\twd.digrip[idx].recursive = wd.recursive\n\t\t\tif err = wd.digrip[idx].register(cph); err != nil {\n\t\t\t\twd.closeHandle()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\twd.count++\n\t}\n\treturn\n}\n\n// closeHandle closes handles that are stored in digrip array. Function always\n// tries to close all of the handlers before it exits, even when there are errors\n// returned from the operating system kernel.\nfunc (wd *watched) closeHandle() (err error) {\n\tfor _, g := range wd.digrip {\n\t\tif g == nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor {\n\t\t\thandle := syscall.Handle(atomic.LoadUintptr((*uintptr)(&g.handle)))\n\t\t\tif handle == syscall.InvalidHandle {\n\t\t\t\tbreak // Already closed.\n\t\t\t}\n\n\t\t\te := syscall.CloseHandle(handle)\n\t\t\tif e != nil && err == nil {\n\t\t\t\terr = e\n\t\t\t}\n\n\t\t\t// Set invalid handle even when CloseHandle fails. This will leak\n\t\t\t// the handle but, since we can't close it anyway, there won't be\n\t\t\t// any difference.\n\t\t\tif atomic.CompareAndSwapUintptr((*uintptr)(&g.handle),\n\t\t\t\t(uintptr)(handle), (uintptr)(syscall.InvalidHandle)) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// watcher implements Watcher interface. It stores a set of watched directories.\n// All operations which remove watched objects from map `m` must be performed in\n// loop goroutine since these structures are used internally by operating system.\ntype readdcw struct {\n\tsync.Mutex\n\tm     map[string]*watched\n\tcph   syscall.Handle\n\tstart bool\n\twg    sync.WaitGroup\n\tc     chan<- EventInfo\n}\n\n// NewWatcher creates new non-recursive watcher backed by ReadDirectoryChangesW.\nfunc newWatcher(c chan<- EventInfo) watcher {\n\tr := &readdcw{\n\t\tm:   make(map[string]*watched),\n\t\tcph: syscall.InvalidHandle,\n\t\tc:   c,\n\t}\n\truntime.SetFinalizer(r, func(r *readdcw) {\n\t\tif r.cph != syscall.InvalidHandle {\n\t\t\tsyscall.CloseHandle(r.cph)\n\t\t}\n\t})\n\treturn r\n}\n\n// Watch implements notify.Watcher interface.\nfunc (r *readdcw) Watch(path string, event Event) error {\n\treturn r.watch(path, event, false)\n}\n\n// RecursiveWatch implements notify.RecursiveWatcher interface.\nfunc (r *readdcw) RecursiveWatch(path string, event Event) error {\n\treturn r.watch(path, event, true)\n}\n\n// watch inserts a directory to the group of watched folders. If watched folder\n// already exists, function tries to rewatch it with new filters(NOT VALID). Moreover,\n// watch starts the main event loop goroutine when called for the first time.\nfunc (r *readdcw) watch(path string, event Event, recursive bool) error {\n\tif event&^(All|fileNotifyChangeAll) != 0 {\n\t\treturn errors.New(\"notify: unknown event\")\n\t}\n\n\tr.Lock()\n\tdefer r.Unlock()\n\n\tif wd, ok := r.m[path]; ok {\n\t\tdbgprint(\"watch: already exists\")\n\t\twd.filter &^= stateUnwatch\n\t\treturn nil\n\t}\n\n\tif err := r.lazyinit(); err != nil {\n\t\treturn err\n\t}\n\n\twd, err := newWatched(r.cph, uint32(event), recursive, path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tr.m[path] = wd\n\tdbgprint(\"watch: new watch added\")\n\n\treturn nil\n}\n\n// lazyinit creates an I/O completion port and starts the main event loop.\nfunc (r *readdcw) lazyinit() (err error) {\n\tinvalid := uintptr(syscall.InvalidHandle)\n\n\tif atomic.LoadUintptr((*uintptr)(&r.cph)) == invalid {\n\t\tcph := syscall.InvalidHandle\n\t\tif cph, err = syscall.CreateIoCompletionPort(cph, 0, 0, 0); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\tr.cph, r.start = cph, true\n\t\tgo r.loop()\n\t}\n\n\treturn\n}\n\n// TODO(pknap) : doc\nfunc (r *readdcw) loop() {\n\tvar n, key uint32\n\tvar overlapped *syscall.Overlapped\n\tfor {\n\t\terr := syscall.GetQueuedCompletionStatus(r.cph, &n, &key, &overlapped, syscall.INFINITE)\n\t\tif key == stateCPClose {\n\t\t\tr.Lock()\n\t\t\thandle := r.cph\n\t\t\tr.cph = syscall.InvalidHandle\n\t\t\tr.Unlock()\n\t\t\tsyscall.CloseHandle(handle)\n\t\t\tr.wg.Done()\n\t\t\treturn\n\t\t}\n\t\tif overlapped == nil {\n\t\t\t// TODO: check key == rewatch delete or 0(panic)\n\t\t\tcontinue\n\t\t}\n\t\toverEx := (*overlappedEx)(unsafe.Pointer(overlapped))\n\t\tif n != 0 {\n\t\t\tr.loopevent(n, overEx)\n\t\t\tif err = overEx.parent.readDirChanges(); err != nil {\n\t\t\t\t// TODO: error handling\n\t\t\t}\n\t\t}\n\t\tr.loopstate(overEx)\n\t}\n}\n\n// TODO(pknap) : doc\nfunc (r *readdcw) loopstate(overEx *overlappedEx) {\n\tr.Lock()\n\tdefer r.Unlock()\n\tfilter := overEx.parent.parent.filter\n\tif filter&onlyMachineStates == 0 {\n\t\treturn\n\t}\n\tif overEx.parent.parent.count--; overEx.parent.parent.count == 0 {\n\t\tswitch filter & onlyMachineStates {\n\t\tcase stateRewatch:\n\t\t\tdbgprint(\"loopstate rewatch\")\n\t\t\toverEx.parent.parent.recreate(r.cph)\n\t\tcase stateUnwatch:\n\t\t\tdbgprint(\"loopstate unwatch\")\n\t\t\toverEx.parent.parent.closeHandle()\n\t\t\tdelete(r.m, syscall.UTF16ToString(overEx.parent.pathw))\n\t\tcase stateCPClose:\n\t\tdefault:\n\t\t\tpanic(`notify: windows loopstate logic error`)\n\t\t}\n\t}\n}\n\n// TODO(pknap) : doc\nfunc (r *readdcw) loopevent(n uint32, overEx *overlappedEx) {\n\tevents := []*event{}\n\tvar currOffset uint32\n\tfor {\n\t\traw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&overEx.parent.buffer[currOffset]))\n\t\tname := syscall.UTF16ToString((*[syscall.MAX_LONG_PATH]uint16)(unsafe.Pointer(&raw.FileName))[:raw.FileNameLength>>1])\n\t\tevents = append(events, &event{\n\t\t\tpathw:  overEx.parent.pathw,\n\t\t\tfilter: overEx.parent.filter,\n\t\t\taction: raw.Action,\n\t\t\tname:   name,\n\t\t})\n\t\tif raw.NextEntryOffset == 0 {\n\t\t\tbreak\n\t\t}\n\t\tif currOffset += raw.NextEntryOffset; currOffset >= n {\n\t\t\tbreak\n\t\t}\n\t}\n\tr.send(events)\n}\n\n// TODO(pknap) : doc\nfunc (r *readdcw) send(es []*event) {\n\tfor _, e := range es {\n\t\tvar syse Event\n\t\tif e.e, syse = decode(e.filter, e.action); e.e == 0 && syse == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tswitch {\n\t\tcase e.action == syscall.FILE_ACTION_MODIFIED:\n\t\t\te.ftype = fTypeUnknown\n\t\tcase e.filter&uint32(dirmarker) != 0:\n\t\t\te.ftype = fTypeDirectory\n\t\tdefault:\n\t\t\te.ftype = fTypeFile\n\t\t}\n\t\tswitch {\n\t\tcase e.e == 0:\n\t\t\te.e = syse\n\t\tcase syse != 0:\n\t\t\tr.c <- &event{\n\t\t\t\tpathw:  e.pathw,\n\t\t\t\tname:   e.name,\n\t\t\t\tftype:  e.ftype,\n\t\t\t\taction: e.action,\n\t\t\t\tfilter: e.filter,\n\t\t\t\te:      syse,\n\t\t\t}\n\t\t}\n\t\tr.c <- e\n\t}\n}\n\n// Rewatch implements notify.Rewatcher interface.\nfunc (r *readdcw) Rewatch(path string, oldevent, newevent Event) error {\n\treturn r.rewatch(path, uint32(oldevent), uint32(newevent), false)\n}\n\n// RecursiveRewatch implements notify.RecursiveRewatcher interface.\nfunc (r *readdcw) RecursiveRewatch(oldpath, newpath string, oldevent,\n\tnewevent Event) error {\n\tif oldpath != newpath {\n\t\tif err := r.unwatch(oldpath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn r.watch(newpath, newevent, true)\n\t}\n\treturn r.rewatch(newpath, uint32(oldevent), uint32(newevent), true)\n}\n\n// TODO : (pknap) doc.\nfunc (r *readdcw) rewatch(path string, oldevent, newevent uint32, recursive bool) (err error) {\n\tif Event(newevent)&^(All|fileNotifyChangeAll) != 0 {\n\t\treturn errors.New(\"notify: unknown event\")\n\t}\n\tvar wd *watched\n\tr.Lock()\n\tdefer r.Unlock()\n\tif wd, err = r.nonStateWatchedLocked(path); err != nil {\n\t\treturn\n\t}\n\tif wd.filter&(onlyNotifyChanges|onlyNGlobalEvents) != oldevent {\n\t\tpanic(`notify: windows re-watcher logic error`)\n\t}\n\twd.filter = stateRewatch | newevent\n\twd.recursive, recursive = recursive, wd.recursive\n\tif err = wd.closeHandle(); err != nil {\n\t\twd.filter = oldevent\n\t\twd.recursive = recursive\n\t\treturn\n\t}\n\treturn\n}\n\n// TODO : pknap\nfunc (r *readdcw) nonStateWatchedLocked(path string) (wd *watched, err error) {\n\twd, ok := r.m[path]\n\tif !ok || wd == nil {\n\t\terr = errors.New(`notify: ` + path + ` path is unwatched`)\n\t\treturn\n\t}\n\tif wd.filter&onlyMachineStates != 0 {\n\t\terr = errors.New(`notify: another re/unwatching operation in progress`)\n\t\treturn\n\t}\n\treturn\n}\n\n// Unwatch implements notify.Watcher interface.\nfunc (r *readdcw) Unwatch(path string) error {\n\treturn r.unwatch(path)\n}\n\n// RecursiveUnwatch implements notify.RecursiveWatcher interface.\nfunc (r *readdcw) RecursiveUnwatch(path string) error {\n\treturn r.unwatch(path)\n}\n\n// TODO : pknap\nfunc (r *readdcw) unwatch(path string) (err error) {\n\tvar wd *watched\n\n\tr.Lock()\n\tdefer r.Unlock()\n\tif wd, err = r.nonStateWatchedLocked(path); err != nil {\n\t\treturn\n\t}\n\n\twd.filter |= stateUnwatch\n\tdbgprint(\"unwatch: set unwatch state\")\n\n\tif _, attrErr := syscall.GetFileAttributes(&wd.pathw[0]); attrErr != nil {\n\t\tfor _, g := range wd.digrip {\n\t\t\tif g == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tdbgprint(\"unwatch: posting\")\n\t\t\tif err = syscall.PostQueuedCompletionStatus(r.cph, 0, 0, (*syscall.Overlapped)(unsafe.Pointer(g.ovlapped))); err != nil {\n\t\t\t\twd.filter &^= stateUnwatch\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\n// Close resets the whole watcher object, closes all existing file descriptors,\n// and sends stateCPClose state as completion key to the main watcher's loop.\nfunc (r *readdcw) Close() (err error) {\n\tr.Lock()\n\tif !r.start {\n\t\tr.Unlock()\n\t\treturn nil\n\t}\n\tfor _, wd := range r.m {\n\t\twd.filter &^= onlyMachineStates\n\t\twd.filter |= stateCPClose\n\t\tif e := wd.closeHandle(); e != nil && err == nil {\n\t\t\terr = e\n\t\t}\n\t}\n\tr.start = false\n\tr.Unlock()\n\tr.wg.Add(1)\n\tif e := syscall.PostQueuedCompletionStatus(r.cph, 0, stateCPClose, nil); e != nil && err == nil {\n\t\treturn e\n\t}\n\tr.wg.Wait()\n\treturn\n}\n\n// decode creates a notify event from both non-raw filter and action which was\n// returned from completion routine. Function may return Event(0) in case when\n// filter was replaced by a new value which does not contain fields that are\n// valid with passed action.\nfunc decode(filter, action uint32) (Event, Event) {\n\tswitch action {\n\tcase syscall.FILE_ACTION_ADDED:\n\t\treturn gensys(filter, Create, FileActionAdded)\n\tcase syscall.FILE_ACTION_REMOVED:\n\t\treturn gensys(filter, Remove, FileActionRemoved)\n\tcase syscall.FILE_ACTION_MODIFIED:\n\t\treturn gensys(filter, Write, FileActionModified)\n\tcase syscall.FILE_ACTION_RENAMED_OLD_NAME:\n\t\treturn gensys(filter, Rename, FileActionRenamedOldName)\n\tcase syscall.FILE_ACTION_RENAMED_NEW_NAME:\n\t\treturn gensys(filter, Rename, FileActionRenamedNewName)\n\t}\n\tpanic(`notify: cannot decode internal mask`)\n}\n\n// gensys decides whether the Windows action, system-independent event or both\n// of them should be returned. Since the grip's filter may be atomically changed\n// during watcher lifetime, it is possible that neither Windows nor notify masks\n// are watched by the user when this function is called.\nfunc gensys(filter uint32, ge, se Event) (gene, syse Event) {\n\tisdir := filter&uint32(dirmarker) != 0\n\tif isdir && filter&uint32(FileNotifyChangeDirName) != 0 ||\n\t\t!isdir && filter&uint32(FileNotifyChangeFileName) != 0 ||\n\t\tfilter&uint32(fileNotifyChangeModified) != 0 {\n\t\tsyse = se\n\t}\n\tif filter&uint32(ge) != 0 {\n\t\tgene = ge\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_stub.go",
    "content": "// Copyright (c) 2014-2018 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\ntype watcherStub struct{ error }\n\n// Following methods implement notify.watcher interface.\nfunc (s watcherStub) Watch(string, Event) error          { return s }\nfunc (s watcherStub) Rewatch(string, Event, Event) error { return s }\nfunc (s watcherStub) Unwatch(string) (err error)         { return s }\nfunc (s watcherStub) Close() error                       { return s }\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watcher_trigger.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build darwin,kqueue dragonfly freebsd netbsd openbsd solaris\n\n// watcher_trigger is used for FEN and kqueue which behave similarly:\n// only files and dirs can be watched directly, but not files inside dirs.\n// As a result Create events have to be generated by implementation when\n// after Write event is returned for watched dir, it is rescanned and Create\n// event is returned for new files and these are automatically added\n// to watchlist. In case of removal of watched directory, native system returns\n// events for all files, but for Rename, they also need to be generated.\n// As a result native system works as something like trigger for rescan,\n// but contains additional data about dir in which changes occurred. For files\n// detailed data is returned.\n// Usage of watcher_trigger requires:\n// - trigger implementation,\n// - encode func,\n// - not2nat, nat2not maps.\n// Required manual operations on filesystem can lead to loss of precision.\n\npackage notify\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"syscall\"\n)\n\n// trigger is to be implemented by platform implementation like FEN or kqueue.\ntype trigger interface {\n\t// Close closes watcher's main native file descriptor.\n\tClose() error\n\t// Stop waiting for new events.\n\tStop() error\n\t// Create new instance of watched.\n\tNewWatched(string, os.FileInfo) (*watched, error)\n\t// Record internally new *watched instance.\n\tRecord(*watched)\n\t// Del removes internal copy of *watched instance.\n\tDel(*watched)\n\t// Watched returns *watched instance and native events for native type.\n\tWatched(interface{}) (*watched, int64, error)\n\t// Init initializes native watcher call.\n\tInit() error\n\t// Watch starts watching provided file/dir.\n\tWatch(os.FileInfo, *watched, int64) error\n\t// Unwatch stops watching provided file/dir.\n\tUnwatch(*watched) error\n\t// Wait for new events.\n\tWait() (interface{}, error)\n\t// IsStop checks if Wait finished because of request watcher's stop.\n\tIsStop(n interface{}, err error) bool\n}\n\n// trgWatched is a the base data structure representing watched file/directory.\n// The platform specific full data structure (watched) must embed this type.\ntype trgWatched struct {\n\t// p is a path to watched file/directory.\n\tp string\n\t// fi provides information about watched file/dir.\n\tfi os.FileInfo\n\t// eDir represents events watched directly.\n\teDir Event\n\t// eNonDir represents events watched indirectly.\n\teNonDir Event\n}\n\n// encode Event to native representation. Implementation is to be provided by\n// platform specific implementation.\nvar encode func(Event, bool) int64\n\nvar (\n\t// nat2not matches native events to notify's ones. To be initialized by\n\t// platform dependent implementation.\n\tnat2not map[Event]Event\n\t// not2nat matches notify's events to native ones. To be initialized by\n\t// platform dependent implementation.\n\tnot2nat map[Event]Event\n)\n\n// trg is a main structure implementing watcher.\ntype trg struct {\n\tsync.Mutex\n\t// s is a channel used to stop monitoring.\n\ts chan struct{}\n\t// c is a channel used to pass events further.\n\tc chan<- EventInfo\n\t// pthLkp is a data structure mapping file names with data about watching\n\t// represented by them files/directories.\n\tpthLkp map[string]*watched\n\t// t is a platform dependent implementation of trigger.\n\tt trigger\n}\n\n// newWatcher returns new watcher's implementation.\nfunc newWatcher(c chan<- EventInfo) watcher {\n\tt := &trg{\n\t\ts:      make(chan struct{}, 1),\n\t\tpthLkp: make(map[string]*watched, 0),\n\t\tc:      c,\n\t}\n\tt.t = newTrigger(t.pthLkp)\n\tif err := t.t.Init(); err != nil {\n\t\tt.Close()\n\t\treturn watcherStub{fmt.Errorf(\"failed setting up watcher: %v\", err)}\n\t}\n\tgo t.monitor()\n\treturn t\n}\n\n// Close implements watcher.\nfunc (t *trg) Close() (err error) {\n\tt.Lock()\n\tif err = t.t.Stop(); err != nil {\n\t\tt.Unlock()\n\t\treturn\n\t}\n\t<-t.s\n\tvar e error\n\tfor _, w := range t.pthLkp {\n\t\tif e = t.unwatch(w.p, w.fi); e != nil {\n\t\t\tdbgprintf(\"trg: unwatch %q failed: %q\\n\", w.p, e)\n\t\t\terr = nonil(err, e)\n\t\t}\n\t}\n\tif e = t.t.Close(); e != nil {\n\t\tdbgprintf(\"trg: closing native watch failed: %q\\n\", e)\n\t\terr = nonil(err, e)\n\t}\n\tif remaining := len(t.pthLkp); remaining != 0 {\n\t\terr = nonil(err, fmt.Errorf(\"Not all watches were removed: len(t.pthLkp) == %v\", len(t.pthLkp)))\n\t}\n\tt.Unlock()\n\treturn\n}\n\n// send reported events one by one through chan.\nfunc (t *trg) send(evn []event) {\n\tfor i := range evn {\n\t\tt.c <- &evn[i]\n\t}\n}\n\n// singlewatch starts to watch given p file/directory.\nfunc (t *trg) singlewatch(p string, e Event, direct mode, fi os.FileInfo) (err error) {\n\tw, ok := t.pthLkp[p]\n\tif !ok {\n\t\tif w, err = t.t.NewWatched(p, fi); err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tswitch direct {\n\tcase dir:\n\t\tw.eDir |= e\n\tcase ndir:\n\t\tw.eNonDir |= e\n\tcase both:\n\t\tw.eDir |= e\n\t\tw.eNonDir |= e\n\t}\n\tif err = t.t.Watch(fi, w, encode(w.eDir|w.eNonDir, fi.IsDir())); err != nil {\n\t\treturn\n\t}\n\tif !ok {\n\t\tt.t.Record(w)\n\t\treturn nil\n\t}\n\treturn errAlreadyWatched\n}\n\n// decode converts event received from native to notify.Event\n// representation taking into account requested events (w).\nfunc decode(o int64, w Event) (e Event) {\n\tfor f, n := range nat2not {\n\t\tif o&int64(f) != 0 {\n\t\t\tif w&f != 0 {\n\t\t\t\te |= f\n\t\t\t}\n\t\t\tif w&n != 0 {\n\t\t\t\te |= n\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc (t *trg) watch(p string, e Event, fi os.FileInfo) error {\n\tif err := t.singlewatch(p, e, dir, fi); err != nil {\n\t\tif err != errAlreadyWatched {\n\t\t\treturn err\n\t\t}\n\t}\n\tif fi.IsDir() {\n\t\terr := t.walk(p, func(fi os.FileInfo) (err error) {\n\t\t\tif err = t.singlewatch(filepath.Join(p, fi.Name()), e, ndir,\n\t\t\t\tfi); err != nil {\n\t\t\t\tif err != errAlreadyWatched {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// walk runs f func on each file/dir from p directory.\nfunc (t *trg) walk(p string, fn func(os.FileInfo) error) error {\n\tfp, err := os.Open(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\tls, err := fp.Readdir(0)\n\tfp.Close()\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor i := range ls {\n\t\tif err := fn(ls[i]); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (t *trg) unwatch(p string, fi os.FileInfo) error {\n\tif fi.IsDir() {\n\t\terr := t.walk(p, func(fi os.FileInfo) error {\n\t\t\terr := t.singleunwatch(filepath.Join(p, fi.Name()), ndir)\n\t\t\tif err != errNotWatched {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn nil\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn t.singleunwatch(p, dir)\n}\n\n// Watch implements Watcher interface.\nfunc (t *trg) Watch(p string, e Event) error {\n\tfi, err := os.Stat(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.Lock()\n\terr = t.watch(p, e, fi)\n\tt.Unlock()\n\treturn err\n}\n\n// Unwatch implements Watcher interface.\nfunc (t *trg) Unwatch(p string) error {\n\tfi, err := os.Stat(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.Lock()\n\terr = t.unwatch(p, fi)\n\tt.Unlock()\n\treturn err\n}\n\n// Rewatch implements Watcher interface.\n//\n// TODO(rjeczalik): This is a naive hack. Rewrite might help.\nfunc (t *trg) Rewatch(p string, _, e Event) error {\n\tfi, err := os.Stat(p)\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.Lock()\n\tif err = t.unwatch(p, fi); err == nil {\n\t\t// TODO(rjeczalik): If watch fails then we leave trigger in inconsistent\n\t\t// state. Handle? Panic? Native version of rewatch?\n\t\terr = t.watch(p, e, fi)\n\t}\n\tt.Unlock()\n\treturn nil\n}\n\nfunc (*trg) file(w *watched, n interface{}, e Event) (evn []event) {\n\tevn = append(evn, event{w.p, e, w.fi.IsDir(), n})\n\treturn\n}\n\nfunc (t *trg) dir(w *watched, n interface{}, e, ge Event) (evn []event) {\n\t// If it's dir and delete we have to send it and continue, because\n\t// other processing relies on opening (in this case not existing) dir.\n\t// Events for contents of this dir are reported by native impl.\n\t// However events for rename must be generated for all monitored files\n\t// inside of moved directory, because native impl does not report it independently\n\t// for each file descriptor being moved in result of move action on\n\t// parent directory.\n\tif (ge & (not2nat[Rename] | not2nat[Remove])) != 0 {\n\t\t// Write is reported also for Remove on directory. Because of that\n\t\t// we have to filter it out explicitly.\n\t\tevn = append(evn, event{w.p, e & ^Write & ^not2nat[Write], true, n})\n\t\tif ge&not2nat[Rename] != 0 {\n\t\t\tfor p := range t.pthLkp {\n\t\t\t\tif strings.HasPrefix(p, w.p+string(os.PathSeparator)) {\n\t\t\t\t\tif err := t.singleunwatch(p, both); err != nil && err != errNotWatched &&\n\t\t\t\t\t\t!os.IsNotExist(err) {\n\t\t\t\t\t\tdbgprintf(\"trg: failed stop watching moved file (%q): %q\\n\",\n\t\t\t\t\t\t\tp, err)\n\t\t\t\t\t}\n\t\t\t\t\tif (w.eDir|w.eNonDir)&(not2nat[Rename]|Rename) != 0 {\n\t\t\t\t\t\tevn = append(evn, event{\n\t\t\t\t\t\t\tp, (w.eDir | w.eNonDir) & e &^ Write &^ not2nat[Write],\n\t\t\t\t\t\t\tw.fi.IsDir(), nil,\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\t\tt.t.Del(w)\n\t\treturn\n\t}\n\tif (ge & not2nat[Write]) != 0 {\n\t\tswitch err := t.walk(w.p, func(fi os.FileInfo) error {\n\t\t\tp := filepath.Join(w.p, fi.Name())\n\t\t\tswitch err := t.singlewatch(p, w.eDir, ndir, fi); {\n\t\t\tcase os.IsNotExist(err) && ((w.eDir & Remove) != 0):\n\t\t\t\tevn = append(evn, event{p, Remove, fi.IsDir(), n})\n\t\t\tcase err == errAlreadyWatched:\n\t\t\tcase err != nil:\n\t\t\t\tdbgprintf(\"trg: watching %q failed: %q\", p, err)\n\t\t\tcase (w.eDir & Create) != 0:\n\t\t\t\tevn = append(evn, event{p, Create, fi.IsDir(), n})\n\t\t\tdefault:\n\t\t\t}\n\t\t\treturn nil\n\t\t}); {\n\t\tcase os.IsNotExist(err):\n\t\t\treturn\n\t\tcase err != nil:\n\t\t\tdbgprintf(\"trg: dir processing failed: %q\", err)\n\t\tdefault:\n\t\t}\n\t}\n\treturn\n}\n\ntype mode uint\n\nconst (\n\tdir mode = iota\n\tndir\n\tboth\n)\n\n// unwatch stops watching p file/directory.\nfunc (t *trg) singleunwatch(p string, direct mode) error {\n\tw, ok := t.pthLkp[p]\n\tif !ok {\n\t\treturn errNotWatched\n\t}\n\tswitch direct {\n\tcase dir:\n\t\tw.eDir = 0\n\tcase ndir:\n\t\tw.eNonDir = 0\n\tcase both:\n\t\tw.eDir, w.eNonDir = 0, 0\n\t}\n\tif err := t.t.Unwatch(w); err != nil {\n\t\treturn err\n\t}\n\tif w.eNonDir|w.eDir != 0 {\n\t\tmod := dir\n\t\tif w.eNonDir != 0 {\n\t\t\tmod = ndir\n\t\t}\n\t\tif err := t.singlewatch(p, w.eNonDir|w.eDir, mod,\n\t\t\tw.fi); err != nil && err != errAlreadyWatched {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tt.t.Del(w)\n\t}\n\treturn nil\n}\n\nfunc (t *trg) monitor() {\n\tvar (\n\t\tn   interface{}\n\t\terr error\n\t)\n\tfor {\n\t\tswitch n, err = t.t.Wait(); {\n\t\tcase err == syscall.EINTR:\n\t\tcase t.t.IsStop(n, err):\n\t\t\tt.s <- struct{}{}\n\t\t\treturn\n\t\tcase err != nil:\n\t\t\tdbgprintf(\"trg: failed to read events: %q\\n\", err)\n\t\tdefault:\n\t\t\tt.send(t.process(n))\n\t\t}\n\t}\n}\n\n// process event returned by native call.\nfunc (t *trg) process(n interface{}) (evn []event) {\n\tt.Lock()\n\tw, ge, err := t.t.Watched(n)\n\tif err != nil {\n\t\tt.Unlock()\n\t\tdbgprintf(\"trg: %v event lookup failed: %q\", Event(ge), err)\n\t\treturn\n\t}\n\n\te := decode(ge, w.eDir|w.eNonDir)\n\tif ge&int64(not2nat[Remove]|not2nat[Rename]) == 0 {\n\t\tswitch fi, err := os.Stat(w.p); {\n\t\tcase err != nil:\n\t\tdefault:\n\t\t\tif err = t.t.Watch(fi, w, encode(w.eDir|w.eNonDir, fi.IsDir())); err != nil {\n\t\t\t\tdbgprintf(\"trg: %q is no longer watched: %q\", w.p, err)\n\t\t\t\tt.t.Del(w)\n\t\t\t}\n\t\t}\n\t}\n\tif e == Event(0) && (!w.fi.IsDir() || (ge&int64(not2nat[Write])) == 0) {\n\t\tt.Unlock()\n\t\treturn\n\t}\n\n\tif w.fi.IsDir() {\n\t\tevn = append(evn, t.dir(w, n, e, Event(ge))...)\n\t} else {\n\t\tevn = append(evn, t.file(w, n, e)...)\n\t}\n\tif Event(ge)&(not2nat[Remove]|not2nat[Rename]) != 0 {\n\t\tt.t.Del(w)\n\t}\n\tt.Unlock()\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watchpoint.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\npackage notify\n\n// EventDiff describes a change to an event set - EventDiff[0] is an old state,\n// while EventDiff[1] is a new state. If event set has not changed (old == new),\n// functions typically return the None value.\ntype eventDiff [2]Event\n\nfunc (diff eventDiff) Event() Event {\n\treturn diff[1] &^ diff[0]\n}\n\n// Watchpoint\n//\n// The nil key holds total event set - logical sum for all registered events.\n// It speeds up computing EventDiff for Add method.\n//\n// The rec key holds an event set for a watchpoints created by RecursiveWatch\n// for a Watcher implementation which is not natively recursive.\ntype watchpoint map[chan<- EventInfo]Event\n\n// None is an empty event diff, think null object.\nvar none eventDiff\n\n// rec is just a placeholder\nvar rec = func() (ch chan<- EventInfo) {\n\tch = make(chan<- EventInfo)\n\tclose(ch)\n\treturn\n}()\n\nfunc (wp watchpoint) dryAdd(ch chan<- EventInfo, e Event) eventDiff {\n\tif e &^= internal; wp[ch]&e == e {\n\t\treturn none\n\t}\n\ttotal := wp[ch] &^ internal\n\treturn eventDiff{total, total | e}\n}\n\n// Add assumes neither c nor e are nil or zero values.\nfunc (wp watchpoint) Add(c chan<- EventInfo, e Event) (diff eventDiff) {\n\twp[c] |= e\n\tdiff[0] = wp[nil]\n\tdiff[1] = diff[0] | e\n\twp[nil] = diff[1] &^ omit\n\t// Strip diff from internal events.\n\tdiff[0] &^= internal\n\tdiff[1] &^= internal\n\tif diff[0] == diff[1] {\n\t\treturn none\n\t}\n\treturn\n}\n\nfunc (wp watchpoint) Del(c chan<- EventInfo, e Event) (diff eventDiff) {\n\twp[c] &^= e\n\tif wp[c] == 0 {\n\t\tdelete(wp, c)\n\t}\n\tdiff[0] = wp[nil]\n\tdelete(wp, nil)\n\tif len(wp) != 0 {\n\t\t// Recalculate total event set.\n\t\tfor _, e := range wp {\n\t\t\tdiff[1] |= e\n\t\t}\n\t\twp[nil] = diff[1] &^ omit\n\t}\n\t// Strip diff from internal events.\n\tdiff[0] &^= internal\n\tdiff[1] &^= internal\n\tif diff[0] == diff[1] {\n\t\treturn none\n\t}\n\treturn\n}\n\nfunc (wp watchpoint) Dispatch(ei EventInfo, extra Event) {\n\te := eventmask(ei, extra)\n\tif !matches(wp[nil], e) {\n\t\treturn\n\t}\n\tfor ch, eset := range wp {\n\t\tif ch != nil && matches(eset, e) {\n\t\t\tselect {\n\t\t\tcase ch <- ei:\n\t\t\tdefault: // Drop event if receiver is too slow\n\t\t\t\tdbgprintf(\"dropped %s on %q: receiver too slow\", ei.Event(), ei.Path())\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (wp watchpoint) Total() Event {\n\treturn wp[nil] &^ internal\n}\n\nfunc (wp watchpoint) IsRecursive() bool {\n\treturn wp[nil]&recursive != 0\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watchpoint_other.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build !windows\n\npackage notify\n\n// eventmask uses ei to create a new event which contains internal flags used by\n// notify package logic.\nfunc eventmask(ei EventInfo, extra Event) Event {\n\treturn ei.Event() | extra\n}\n\n// matches reports a match only when:\n//\n//   - for user events, when event is present in the given set\n//   - for internal events, when additionally both event and set have omit bit set\n//\n// Internal events must not be sent to user channels and vice versa.\nfunc matches(set, event Event) bool {\n\treturn (set&omit)^(event&omit) == 0 && set&event == event\n}\n"
  },
  {
    "path": "vendor/github.com/rjeczalik/notify/watchpoint_readdcw.go",
    "content": "// Copyright (c) 2014-2015 The Notify Authors. All rights reserved.\n// Use of this source code is governed by the MIT license that can be\n// found in the LICENSE file.\n\n// +build windows\n\npackage notify\n\n// eventmask uses ei to create a new event which contains internal flags used by\n// notify package logic. If one of FileAction* masks is detected, this function\n// adds corresponding FileNotifyChange* values. This allows non registered\n// FileAction* events to be passed on.\nfunc eventmask(ei EventInfo, extra Event) (e Event) {\n\tif e = ei.Event() | extra; e&fileActionAll != 0 {\n\t\tif ev, ok := ei.(*event); ok {\n\t\t\tswitch ev.ftype {\n\t\t\tcase fTypeFile:\n\t\t\t\te |= FileNotifyChangeFileName\n\t\t\tcase fTypeDirectory:\n\t\t\t\te |= FileNotifyChangeDirName\n\t\t\tcase fTypeUnknown:\n\t\t\t\te |= fileNotifyChangeModified\n\t\t\t}\n\t\t\treturn e &^ fileActionAll\n\t\t}\n\t}\n\treturn\n}\n\n// matches reports a match only when:\n//\n//   - for user events, when event is present in the given set\n//   - for internal events, when additionally both event and set have omit bit set\n//\n// Internal events must not be sent to user channels and vice versa.\nfunc matches(set, event Event) bool {\n\treturn (set&omit)^(event&omit) == 0 && (set&event == event || set&fileNotifyChangeModified&event != 0)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/DESIGN.markdown",
    "content": "* Designate the filename of \"anonymous\" source code by the hash (md5/sha1, etc.)\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/LICENSE",
    "content": "Copyright (c) 2012 Robert Krimen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/Makefile",
    "content": ".PHONY: test test-race test-release release release-check test-262\n.PHONY: parser\n.PHONY: otto assets underscore\n\nTESTS := \\\n\t~\n\nTEST := -v --run\nTEST := -v\nTEST := -v --run Test\\($(subst $(eval) ,\\|,$(TESTS))\\)\nTEST := .\n\ntest: parser inline.go\n\tgo test -i\n\tgo test $(TEST)\n\t@echo PASS\n\nparser:\n\t$(MAKE) -C parser\n\ninline.go: inline.pl\n\t./$< > $@\n\n#################\n# release, test #\n#################\n\nrelease: test-race test-release\n\tfor package in . parser token ast file underscore registry; do (cd $$package && godocdown --signature > README.markdown); done\n\t@echo \\*\\*\\* make release-check\n\t@echo PASS\n\nrelease-check: .test\n\t$(MAKE) -C test build test\n\t$(MAKE) -C .test/test262 build test\n\t@echo PASS\n\ntest-262: .test\n\t$(MAKE) -C .test/test262 build test\n\t@echo PASS\n\ntest-release:\n\tgo test -i\n\tgo test\n\ntest-race:\n\tgo test -race -i\n\tgo test -race\n\n#################################\n# otto, assets, underscore, ... #\n#################################\n\notto:\n\t$(MAKE) -C otto\n\nassets:\n\tmkdir -p .assets\n\tfor file in underscore/test/*.js; do tr \"\\`\" \"_\" < $$file > .assets/`basename $$file`; done\n\nunderscore:\n\t$(MAKE) -C $@\n\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/README.markdown",
    "content": "# otto\n--\n```go\nimport \"github.com/robertkrimen/otto\"\n```\n\nPackage otto is a JavaScript parser and interpreter written natively in Go.\n\nhttp://godoc.org/github.com/robertkrimen/otto\n\n```go\nimport (\n   \"github.com/robertkrimen/otto\"\n)\n```\n\nRun something in the VM\n\n```go\nvm := otto.New()\nvm.Run(`\n    abc = 2 + 2;\n    console.log(\"The value of abc is \" + abc); // 4\n`)\n```\n\nGet a value out of the VM\n\n```go\nif value, err := vm.Get(\"abc\"); err == nil {\n    if value_int, err := value.ToInteger(); err == nil {\n\tfmt.Printf(\"\", value_int, err)\n    }\n}\n```\n\nSet a number\n\n```go\nvm.Set(\"def\", 11)\nvm.Run(`\n    console.log(\"The value of def is \" + def);\n    // The value of def is 11\n`)\n```\n\nSet a string\n\n```go\nvm.Set(\"xyzzy\", \"Nothing happens.\")\nvm.Run(`\n    console.log(xyzzy.length); // 16\n`)\n```\n\nGet the value of an expression\n\n```go\nvalue, _ = vm.Run(\"xyzzy.length\")\n{\n    // value is an int64 with a value of 16\n    value, _ := value.ToInteger()\n}\n```\n\nAn error happens\n\n```go\nvalue, err = vm.Run(\"abcdefghijlmnopqrstuvwxyz.length\")\nif err != nil {\n    // err = ReferenceError: abcdefghijlmnopqrstuvwxyz is not defined\n    // If there is an error, then value.IsUndefined() is true\n    ...\n}\n```\n\nSet a Go function\n\n```go\nvm.Set(\"sayHello\", func(call otto.FunctionCall) otto.Value {\n    fmt.Printf(\"Hello, %s.\\n\", call.Argument(0).String())\n    return otto.Value{}\n})\n```\n\nSet a Go function that returns something useful\n\n```go\nvm.Set(\"twoPlus\", func(call otto.FunctionCall) otto.Value {\n    right, _ := call.Argument(0).ToInteger()\n    result, _ := vm.ToValue(2 + right)\n    return result\n})\n```\n\nUse the functions in JavaScript\n\n```go\nresult, _ = vm.Run(`\n    sayHello(\"Xyzzy\");      // Hello, Xyzzy.\n    sayHello();             // Hello, undefined\n\n    result = twoPlus(2.0); // 4\n`) \n```\n\n### Parser\n\nA separate parser is available in the parser package if you're just interested\nin building an AST.\n\nhttp://godoc.org/github.com/robertkrimen/otto/parser\n\nParse and return an AST\n\n```go\nfilename := \"\" // A filename is optional\nsrc := `\n    // Sample xyzzy example\n    (function(){\n        if (3.14159 > 0) {\n            console.log(\"Hello, World.\");\n            return;\n        }\n\n        var xyzzy = NaN;\n        console.log(\"Nothing happens.\");\n        return xyzzy;\n    })();\n`\n\n// Parse some JavaScript, yielding a *ast.Program and/or an ErrorList\nprogram, err := parser.ParseFile(nil, filename, src, 0)\n```\n\n### otto\n\nYou can run (Go) JavaScript from the commandline with:\nhttp://github.com/robertkrimen/otto/tree/master/otto\n\n    $ go get -v github.com/robertkrimen/otto/otto\n\nRun JavaScript by entering some source on stdin or by giving otto a filename:\n\n    $ otto example.js\n\n### underscore\n\nOptionally include the JavaScript utility-belt library, underscore, with this\nimport:\n\n```go\nimport (\n    \"github.com/robertkrimen/otto\"\n    _ \"github.com/robertkrimen/otto/underscore\"\n)\n\n// Now every otto runtime will come loaded with underscore\n```\n\nFor more information: http://github.com/robertkrimen/otto/tree/master/underscore\n\n\n### Caveat Emptor\n\nThe following are some limitations with otto:\n\n    * \"use strict\" will parse, but does nothing.\n    * The regular expression engine (re2/regexp) is not fully compatible with the ECMA5 specification.\n    * Otto targets ES5. ES6 features (eg: Typed Arrays) are not supported.\n\n\n### Regular Expression Incompatibility\n\nGo translates JavaScript-style regular expressions into something that is\n\"regexp\" compatible via `parser.TransformRegExp`. Unfortunately, RegExp requires\nbacktracking for some patterns, and backtracking is not supported by the\nstandard Go engine: https://code.google.com/p/re2/wiki/Syntax\n\nTherefore, the following syntax is incompatible:\n\n    (?=)  // Lookahead (positive), currently a parsing error\n    (?!)  // Lookahead (backhead), currently a parsing error\n    \\1    // Backreference (\\1, \\2, \\3, ...), currently a parsing error\n\nA brief discussion of these limitations: \"Regexp (?!re)\"\nhttps://groups.google.com/forum/?fromgroups=#%21topic/golang-nuts/7qgSDWPIh_E\n\nMore information about re2: https://code.google.com/p/re2/\n\nIn addition to the above, re2 (Go) has a different definition for \\s: [\\t\\n\\f\\r\n]. The JavaScript definition, on the other hand, also includes \\v, Unicode\n\"Separator, Space\", etc.\n\n\n### Halting Problem\n\nIf you want to stop long running executions (like third-party code), you can use\nthe interrupt channel to do this:\n\n```go\npackage main\n\nimport (\n    \"errors\"\n    \"fmt\"\n    \"os\"\n    \"time\"\n\n    \"github.com/robertkrimen/otto\"\n)\n\nvar halt = errors.New(\"Stahp\")\n\nfunc main() {\n    runUnsafe(`var abc = [];`)\n    runUnsafe(`\n    while (true) {\n        // Loop forever\n    }`)\n}\n\nfunc runUnsafe(unsafe string) {\n    start := time.Now()\n    defer func() {\n        duration := time.Since(start)\n        if caught := recover(); caught != nil {\n            if caught == halt {\n                fmt.Fprintf(os.Stderr, \"Some code took to long! Stopping after: %v\\n\", duration)\n                return\n            }\n            panic(caught) // Something else happened, repanic!\n        }\n        fmt.Fprintf(os.Stderr, \"Ran code successfully: %v\\n\", duration)\n    }()\n\n    vm := otto.New()\n    vm.Interrupt = make(chan func(), 1) // The buffer prevents blocking\n\n    go func() {\n        time.Sleep(2 * time.Second) // Stop after two seconds\n        vm.Interrupt <- func() {\n            panic(halt)\n        }\n    }()\n\n    vm.Run(unsafe) // Here be dragons (risky code)\n}\n```\n\nWhere is setTimeout/setInterval?\n\nThese timing functions are not actually part of the ECMA-262 specification.\nTypically, they belong to the `window` object (in the browser). It would not be\ndifficult to provide something like these via Go, but you probably want to wrap\notto in an event loop in that case.\n\nFor an example of how this could be done in Go with otto, see natto:\n\nhttp://github.com/robertkrimen/natto\n\nHere is some more discussion of the issue:\n\n* http://book.mixu.net/node/ch2.html\n\n* http://en.wikipedia.org/wiki/Reentrancy_%28computing%29\n\n* http://aaroncrane.co.uk/2009/02/perl_safe_signals/\n\n## Usage\n\n```go\nvar ErrVersion = errors.New(\"version mismatch\")\n```\n\n#### type Error\n\n```go\ntype Error struct {\n}\n```\n\nAn Error represents a runtime error, e.g. a TypeError, a ReferenceError, etc.\n\n#### func (Error) Error\n\n```go\nfunc (err Error) Error() string\n```\nError returns a description of the error\n\n    TypeError: 'def' is not a function\n\n#### func (Error) String\n\n```go\nfunc (err Error) String() string\n```\nString returns a description of the error and a trace of where the error\noccurred.\n\n    TypeError: 'def' is not a function\n        at xyz (<anonymous>:3:9)\n        at <anonymous>:7:1/\n\n#### type FunctionCall\n\n```go\ntype FunctionCall struct {\n\tThis         Value\n\tArgumentList []Value\n\tOtto         *Otto\n}\n```\n\nFunctionCall is an encapsulation of a JavaScript function call.\n\n#### func (FunctionCall) Argument\n\n```go\nfunc (self FunctionCall) Argument(index int) Value\n```\nArgument will return the value of the argument at the given index.\n\nIf no such argument exists, undefined is returned.\n\n#### type Object\n\n```go\ntype Object struct {\n}\n```\n\nObject is the representation of a JavaScript object.\n\n#### func (Object) Call\n\n```go\nfunc (self Object) Call(name string, argumentList ...interface{}) (Value, error)\n```\nCall a method on the object.\n\nIt is essentially equivalent to:\n\n    var method, _ := object.Get(name)\n    method.Call(object, argumentList...)\n\nAn undefined value and an error will result if:\n\n    1. There is an error during conversion of the argument list\n    2. The property is not actually a function\n    3. An (uncaught) exception is thrown\n\n#### func (Object) Class\n\n```go\nfunc (self Object) Class() string\n```\nClass will return the class string of the object.\n\nThe return value will (generally) be one of:\n\n    Object\n    Function\n    Array\n    String\n    Number\n    Boolean\n    Date\n    RegExp\n\n#### func (Object) Get\n\n```go\nfunc (self Object) Get(name string) (Value, error)\n```\nGet the value of the property with the given name.\n\n#### func (Object) Keys\n\n```go\nfunc (self Object) Keys() []string\n```\nGet the keys for the object\n\nEquivalent to calling Object.keys on the object\n\n#### func (Object) Set\n\n```go\nfunc (self Object) Set(name string, value interface{}) error\n```\nSet the property of the given name to the given value.\n\nAn error will result if the setting the property triggers an exception (i.e.\nread-only), or there is an error during conversion of the given value.\n\n#### func (Object) Value\n\n```go\nfunc (self Object) Value() Value\n```\nValue will return self as a value.\n\n#### type Otto\n\n```go\ntype Otto struct {\n\t// Interrupt is a channel for interrupting the runtime. You can use this to halt a long running execution, for example.\n\t// See \"Halting Problem\" for more information.\n\tInterrupt chan func()\n}\n```\n\nOtto is the representation of the JavaScript runtime. Each instance of Otto has\na self-contained namespace.\n\n#### func  New\n\n```go\nfunc New() *Otto\n```\nNew will allocate a new JavaScript runtime\n\n#### func  Run\n\n```go\nfunc Run(src interface{}) (*Otto, Value, error)\n```\nRun will allocate a new JavaScript runtime, run the given source on the\nallocated runtime, and return the runtime, resulting value, and error (if any).\n\nsrc may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST\nalways be in UTF-8.\n\nsrc may also be a Script.\n\nsrc may also be a Program, but if the AST has been modified, then runtime\nbehavior is undefined.\n\n#### func (Otto) Call\n\n```go\nfunc (self Otto) Call(source string, this interface{}, argumentList ...interface{}) (Value, error)\n```\nCall the given JavaScript with a given this and arguments.\n\nIf this is nil, then some special handling takes place to determine the proper\nthis value, falling back to a \"standard\" invocation if necessary (where this is\nundefined).\n\nIf source begins with \"new \" (A lowercase new followed by a space), then Call\nwill invoke the function constructor rather than performing a function call. In\nthis case, the this argument has no effect.\n\n```go\n// value is a String object\nvalue, _ := vm.Call(\"Object\", nil, \"Hello, World.\")\n\n// Likewise...\nvalue, _ := vm.Call(\"new Object\", nil, \"Hello, World.\")\n\n// This will perform a concat on the given array and return the result\n// value is [ 1, 2, 3, undefined, 4, 5, 6, 7, \"abc\" ]\nvalue, _ := vm.Call(`[ 1, 2, 3, undefined, 4 ].concat`, nil, 5, 6, 7, \"abc\")\n```\n\n#### func (*Otto) Compile\n\n```go\nfunc (self *Otto) Compile(filename string, src interface{}) (*Script, error)\n```\nCompile will parse the given source and return a Script value or nil and an\nerror if there was a problem during compilation.\n\n```go\nscript, err := vm.Compile(\"\", `var abc; if (!abc) abc = 0; abc += 2; abc;`)\nvm.Run(script)\n```\n\n#### func (*Otto) Copy\n\n```go\nfunc (in *Otto) Copy() *Otto\n```\nCopy will create a copy/clone of the runtime.\n\nCopy is useful for saving some time when creating many similar runtimes.\n\nThis method works by walking the original runtime and cloning each object,\nscope, stash, etc. into a new runtime.\n\nBe on the lookout for memory leaks or inadvertent sharing of resources.\n\n#### func (Otto) Get\n\n```go\nfunc (self Otto) Get(name string) (Value, error)\n```\nGet the value of the top-level binding of the given name.\n\nIf there is an error (like the binding does not exist), then the value will be\nundefined.\n\n#### func (Otto) Object\n\n```go\nfunc (self Otto) Object(source string) (*Object, error)\n```\nObject will run the given source and return the result as an object.\n\nFor example, accessing an existing object:\n\n```go\nobject, _ := vm.Object(`Number`)\n```\n\nOr, creating a new object:\n\n```go\nobject, _ := vm.Object(`({ xyzzy: \"Nothing happens.\" })`)\n```\n\nOr, creating and assigning an object:\n\n```go\nobject, _ := vm.Object(`xyzzy = {}`)\nobject.Set(\"volume\", 11)\n```\n\nIf there is an error (like the source does not result in an object), then nil\nand an error is returned.\n\n#### func (Otto) Run\n\n```go\nfunc (self Otto) Run(src interface{}) (Value, error)\n```\nRun will run the given source (parsing it first if necessary), returning the\nresulting value and error (if any)\n\nsrc may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST\nalways be in UTF-8.\n\nIf the runtime is unable to parse source, then this function will return\nundefined and the parse error (nothing will be evaluated in this case).\n\nsrc may also be a Script.\n\nsrc may also be a Program, but if the AST has been modified, then runtime\nbehavior is undefined.\n\n#### func (Otto) Set\n\n```go\nfunc (self Otto) Set(name string, value interface{}) error\n```\nSet the top-level binding of the given name to the given value.\n\nSet will automatically apply ToValue to the given value in order to convert it\nto a JavaScript value (type Value).\n\nIf there is an error (like the binding is read-only, or the ToValue conversion\nfails), then an error is returned.\n\nIf the top-level binding does not exist, it will be created.\n\n#### func (Otto) ToValue\n\n```go\nfunc (self Otto) ToValue(value interface{}) (Value, error)\n```\nToValue will convert an interface{} value to a value digestible by\notto/JavaScript.\n\n#### type Script\n\n```go\ntype Script struct {\n}\n```\n\nScript is a handle for some (reusable) JavaScript. Passing a Script value to a\nrun method will evaluate the JavaScript.\n\n#### func (*Script) String\n\n```go\nfunc (self *Script) String() string\n```\n\n#### type Value\n\n```go\ntype Value struct {\n}\n```\n\nValue is the representation of a JavaScript value.\n\n#### func  FalseValue\n\n```go\nfunc FalseValue() Value\n```\nFalseValue will return a value representing false.\n\nIt is equivalent to:\n\n```go\nToValue(false)\n```\n\n#### func  NaNValue\n\n```go\nfunc NaNValue() Value\n```\nNaNValue will return a value representing NaN.\n\nIt is equivalent to:\n\n```go\nToValue(math.NaN())\n```\n\n#### func  NullValue\n\n```go\nfunc NullValue() Value\n```\nNullValue will return a Value representing null.\n\n#### func  ToValue\n\n```go\nfunc ToValue(value interface{}) (Value, error)\n```\nToValue will convert an interface{} value to a value digestible by\notto/JavaScript\n\nThis function will not work for advanced types (struct, map, slice/array, etc.)\nand you should use Otto.ToValue instead.\n\n#### func  TrueValue\n\n```go\nfunc TrueValue() Value\n```\nTrueValue will return a value representing true.\n\nIt is equivalent to:\n\n```go\nToValue(true)\n```\n\n#### func  UndefinedValue\n\n```go\nfunc UndefinedValue() Value\n```\nUndefinedValue will return a Value representing undefined.\n\n#### func (Value) Call\n\n```go\nfunc (value Value) Call(this Value, argumentList ...interface{}) (Value, error)\n```\nCall the value as a function with the given this value and argument list and\nreturn the result of invocation. It is essentially equivalent to:\n\n    value.apply(thisValue, argumentList)\n\nAn undefined value and an error will result if:\n\n    1. There is an error during conversion of the argument list\n    2. The value is not actually a function\n    3. An (uncaught) exception is thrown\n\n#### func (Value) Class\n\n```go\nfunc (value Value) Class() string\n```\nClass will return the class string of the value or the empty string if value is\nnot an object.\n\nThe return value will (generally) be one of:\n\n    Object\n    Function\n    Array\n    String\n    Number\n    Boolean\n    Date\n    RegExp\n\n#### func (Value) Export\n\n```go\nfunc (self Value) Export() (interface{}, error)\n```\nExport will attempt to convert the value to a Go representation and return it\nvia an interface{} kind.\n\nExport returns an error, but it will always be nil. It is present for backwards\ncompatibility.\n\nIf a reasonable conversion is not possible, then the original value is returned.\n\n    undefined   -> nil (FIXME?: Should be Value{})\n    null        -> nil\n    boolean     -> bool\n    number      -> A number type (int, float32, uint64, ...)\n    string      -> string\n    Array       -> []interface{}\n    Object      -> map[string]interface{}\n\n#### func (Value) IsBoolean\n\n```go\nfunc (value Value) IsBoolean() bool\n```\nIsBoolean will return true if value is a boolean (primitive).\n\n#### func (Value) IsDefined\n\n```go\nfunc (value Value) IsDefined() bool\n```\nIsDefined will return false if the value is undefined, and true otherwise.\n\n#### func (Value) IsFunction\n\n```go\nfunc (value Value) IsFunction() bool\n```\nIsFunction will return true if value is a function.\n\n#### func (Value) IsNaN\n\n```go\nfunc (value Value) IsNaN() bool\n```\nIsNaN will return true if value is NaN (or would convert to NaN).\n\n#### func (Value) IsNull\n\n```go\nfunc (value Value) IsNull() bool\n```\nIsNull will return true if the value is null, and false otherwise.\n\n#### func (Value) IsNumber\n\n```go\nfunc (value Value) IsNumber() bool\n```\nIsNumber will return true if value is a number (primitive).\n\n#### func (Value) IsObject\n\n```go\nfunc (value Value) IsObject() bool\n```\nIsObject will return true if value is an object.\n\n#### func (Value) IsPrimitive\n\n```go\nfunc (value Value) IsPrimitive() bool\n```\nIsPrimitive will return true if value is a primitive (any kind of primitive).\n\n#### func (Value) IsString\n\n```go\nfunc (value Value) IsString() bool\n```\nIsString will return true if value is a string (primitive).\n\n#### func (Value) IsUndefined\n\n```go\nfunc (value Value) IsUndefined() bool\n```\nIsUndefined will return true if the value is undefined, and false otherwise.\n\n#### func (Value) Object\n\n```go\nfunc (value Value) Object() *Object\n```\nObject will return the object of the value, or nil if value is not an object.\n\nThis method will not do any implicit conversion. For example, calling this\nmethod on a string primitive value will not return a String object.\n\n#### func (Value) String\n\n```go\nfunc (value Value) String() string\n```\nString will return the value as a string.\n\nThis method will make return the empty string if there is an error.\n\n#### func (Value) ToBoolean\n\n```go\nfunc (value Value) ToBoolean() (bool, error)\n```\nToBoolean will convert the value to a boolean (bool).\n\n    ToValue(0).ToBoolean() => false\n    ToValue(\"\").ToBoolean() => false\n    ToValue(true).ToBoolean() => true\n    ToValue(1).ToBoolean() => true\n    ToValue(\"Nothing happens\").ToBoolean() => true\n\nIf there is an error during the conversion process (like an uncaught exception),\nthen the result will be false and an error.\n\n#### func (Value) ToFloat\n\n```go\nfunc (value Value) ToFloat() (float64, error)\n```\nToFloat will convert the value to a number (float64).\n\n    ToValue(0).ToFloat() => 0.\n    ToValue(1.1).ToFloat() => 1.1\n    ToValue(\"11\").ToFloat() => 11.\n\nIf there is an error during the conversion process (like an uncaught exception),\nthen the result will be 0 and an error.\n\n#### func (Value) ToInteger\n\n```go\nfunc (value Value) ToInteger() (int64, error)\n```\nToInteger will convert the value to a number (int64).\n\n    ToValue(0).ToInteger() => 0\n    ToValue(1.1).ToInteger() => 1\n    ToValue(\"11\").ToInteger() => 11\n\nIf there is an error during the conversion process (like an uncaught exception),\nthen the result will be 0 and an error.\n\n#### func (Value) ToString\n\n```go\nfunc (value Value) ToString() (string, error)\n```\nToString will convert the value to a string (string).\n\n    ToValue(0).ToString() => \"0\"\n    ToValue(false).ToString() => \"false\"\n    ToValue(1.1).ToString() => \"1.1\"\n    ToValue(\"11\").ToString() => \"11\"\n    ToValue('Nothing happens.').ToString() => \"Nothing happens.\"\n\nIf there is an error during the conversion process (like an uncaught exception),\nthen the result will be the empty string (\"\") and an error.\n\n--\n**godocdown** http://github.com/robertkrimen/godocdown\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/ast/README.markdown",
    "content": "# ast\n--\n    import \"github.com/robertkrimen/otto/ast\"\n\nPackage ast declares types representing a JavaScript AST.\n\n\n### Warning\n\nThe parser and AST interfaces are still works-in-progress (particularly where\nnode types are concerned) and may change in the future.\n\n## Usage\n\n#### type ArrayLiteral\n\n```go\ntype ArrayLiteral struct {\n\tLeftBracket  file.Idx\n\tRightBracket file.Idx\n\tValue        []Expression\n}\n```\n\n\n#### func (*ArrayLiteral) Idx0\n\n```go\nfunc (self *ArrayLiteral) Idx0() file.Idx\n```\n\n#### func (*ArrayLiteral) Idx1\n\n```go\nfunc (self *ArrayLiteral) Idx1() file.Idx\n```\n\n#### type AssignExpression\n\n```go\ntype AssignExpression struct {\n\tOperator token.Token\n\tLeft     Expression\n\tRight    Expression\n}\n```\n\n\n#### func (*AssignExpression) Idx0\n\n```go\nfunc (self *AssignExpression) Idx0() file.Idx\n```\n\n#### func (*AssignExpression) Idx1\n\n```go\nfunc (self *AssignExpression) Idx1() file.Idx\n```\n\n#### type BadExpression\n\n```go\ntype BadExpression struct {\n\tFrom file.Idx\n\tTo   file.Idx\n}\n```\n\n\n#### func (*BadExpression) Idx0\n\n```go\nfunc (self *BadExpression) Idx0() file.Idx\n```\n\n#### func (*BadExpression) Idx1\n\n```go\nfunc (self *BadExpression) Idx1() file.Idx\n```\n\n#### type BadStatement\n\n```go\ntype BadStatement struct {\n\tFrom file.Idx\n\tTo   file.Idx\n}\n```\n\n\n#### func (*BadStatement) Idx0\n\n```go\nfunc (self *BadStatement) Idx0() file.Idx\n```\n\n#### func (*BadStatement) Idx1\n\n```go\nfunc (self *BadStatement) Idx1() file.Idx\n```\n\n#### type BinaryExpression\n\n```go\ntype BinaryExpression struct {\n\tOperator   token.Token\n\tLeft       Expression\n\tRight      Expression\n\tComparison bool\n}\n```\n\n\n#### func (*BinaryExpression) Idx0\n\n```go\nfunc (self *BinaryExpression) Idx0() file.Idx\n```\n\n#### func (*BinaryExpression) Idx1\n\n```go\nfunc (self *BinaryExpression) Idx1() file.Idx\n```\n\n#### type BlockStatement\n\n```go\ntype BlockStatement struct {\n\tLeftBrace  file.Idx\n\tList       []Statement\n\tRightBrace file.Idx\n}\n```\n\n\n#### func (*BlockStatement) Idx0\n\n```go\nfunc (self *BlockStatement) Idx0() file.Idx\n```\n\n#### func (*BlockStatement) Idx1\n\n```go\nfunc (self *BlockStatement) Idx1() file.Idx\n```\n\n#### type BooleanLiteral\n\n```go\ntype BooleanLiteral struct {\n\tIdx     file.Idx\n\tLiteral string\n\tValue   bool\n}\n```\n\n\n#### func (*BooleanLiteral) Idx0\n\n```go\nfunc (self *BooleanLiteral) Idx0() file.Idx\n```\n\n#### func (*BooleanLiteral) Idx1\n\n```go\nfunc (self *BooleanLiteral) Idx1() file.Idx\n```\n\n#### type BracketExpression\n\n```go\ntype BracketExpression struct {\n\tLeft         Expression\n\tMember       Expression\n\tLeftBracket  file.Idx\n\tRightBracket file.Idx\n}\n```\n\n\n#### func (*BracketExpression) Idx0\n\n```go\nfunc (self *BracketExpression) Idx0() file.Idx\n```\n\n#### func (*BracketExpression) Idx1\n\n```go\nfunc (self *BracketExpression) Idx1() file.Idx\n```\n\n#### type BranchStatement\n\n```go\ntype BranchStatement struct {\n\tIdx   file.Idx\n\tToken token.Token\n\tLabel *Identifier\n}\n```\n\n\n#### func (*BranchStatement) Idx0\n\n```go\nfunc (self *BranchStatement) Idx0() file.Idx\n```\n\n#### func (*BranchStatement) Idx1\n\n```go\nfunc (self *BranchStatement) Idx1() file.Idx\n```\n\n#### type CallExpression\n\n```go\ntype CallExpression struct {\n\tCallee           Expression\n\tLeftParenthesis  file.Idx\n\tArgumentList     []Expression\n\tRightParenthesis file.Idx\n}\n```\n\n\n#### func (*CallExpression) Idx0\n\n```go\nfunc (self *CallExpression) Idx0() file.Idx\n```\n\n#### func (*CallExpression) Idx1\n\n```go\nfunc (self *CallExpression) Idx1() file.Idx\n```\n\n#### type CaseStatement\n\n```go\ntype CaseStatement struct {\n\tCase       file.Idx\n\tTest       Expression\n\tConsequent []Statement\n}\n```\n\n\n#### func (*CaseStatement) Idx0\n\n```go\nfunc (self *CaseStatement) Idx0() file.Idx\n```\n\n#### func (*CaseStatement) Idx1\n\n```go\nfunc (self *CaseStatement) Idx1() file.Idx\n```\n\n#### type CatchStatement\n\n```go\ntype CatchStatement struct {\n\tCatch     file.Idx\n\tParameter *Identifier\n\tBody      Statement\n}\n```\n\n\n#### func (*CatchStatement) Idx0\n\n```go\nfunc (self *CatchStatement) Idx0() file.Idx\n```\n\n#### func (*CatchStatement) Idx1\n\n```go\nfunc (self *CatchStatement) Idx1() file.Idx\n```\n\n#### type ConditionalExpression\n\n```go\ntype ConditionalExpression struct {\n\tTest       Expression\n\tConsequent Expression\n\tAlternate  Expression\n}\n```\n\n\n#### func (*ConditionalExpression) Idx0\n\n```go\nfunc (self *ConditionalExpression) Idx0() file.Idx\n```\n\n#### func (*ConditionalExpression) Idx1\n\n```go\nfunc (self *ConditionalExpression) Idx1() file.Idx\n```\n\n#### type DebuggerStatement\n\n```go\ntype DebuggerStatement struct {\n\tDebugger file.Idx\n}\n```\n\n\n#### func (*DebuggerStatement) Idx0\n\n```go\nfunc (self *DebuggerStatement) Idx0() file.Idx\n```\n\n#### func (*DebuggerStatement) Idx1\n\n```go\nfunc (self *DebuggerStatement) Idx1() file.Idx\n```\n\n#### type Declaration\n\n```go\ntype Declaration interface {\n\t// contains filtered or unexported methods\n}\n```\n\nAll declaration nodes implement the Declaration interface.\n\n#### type DoWhileStatement\n\n```go\ntype DoWhileStatement struct {\n\tDo   file.Idx\n\tTest Expression\n\tBody Statement\n}\n```\n\n\n#### func (*DoWhileStatement) Idx0\n\n```go\nfunc (self *DoWhileStatement) Idx0() file.Idx\n```\n\n#### func (*DoWhileStatement) Idx1\n\n```go\nfunc (self *DoWhileStatement) Idx1() file.Idx\n```\n\n#### type DotExpression\n\n```go\ntype DotExpression struct {\n\tLeft       Expression\n\tIdentifier Identifier\n}\n```\n\n\n#### func (*DotExpression) Idx0\n\n```go\nfunc (self *DotExpression) Idx0() file.Idx\n```\n\n#### func (*DotExpression) Idx1\n\n```go\nfunc (self *DotExpression) Idx1() file.Idx\n```\n\n#### type EmptyStatement\n\n```go\ntype EmptyStatement struct {\n\tSemicolon file.Idx\n}\n```\n\n\n#### func (*EmptyStatement) Idx0\n\n```go\nfunc (self *EmptyStatement) Idx0() file.Idx\n```\n\n#### func (*EmptyStatement) Idx1\n\n```go\nfunc (self *EmptyStatement) Idx1() file.Idx\n```\n\n#### type Expression\n\n```go\ntype Expression interface {\n\tNode\n\t// contains filtered or unexported methods\n}\n```\n\nAll expression nodes implement the Expression interface.\n\n#### type ExpressionStatement\n\n```go\ntype ExpressionStatement struct {\n\tExpression Expression\n}\n```\n\n\n#### func (*ExpressionStatement) Idx0\n\n```go\nfunc (self *ExpressionStatement) Idx0() file.Idx\n```\n\n#### func (*ExpressionStatement) Idx1\n\n```go\nfunc (self *ExpressionStatement) Idx1() file.Idx\n```\n\n#### type ForInStatement\n\n```go\ntype ForInStatement struct {\n\tFor    file.Idx\n\tInto   Expression\n\tSource Expression\n\tBody   Statement\n}\n```\n\n\n#### func (*ForInStatement) Idx0\n\n```go\nfunc (self *ForInStatement) Idx0() file.Idx\n```\n\n#### func (*ForInStatement) Idx1\n\n```go\nfunc (self *ForInStatement) Idx1() file.Idx\n```\n\n#### type ForStatement\n\n```go\ntype ForStatement struct {\n\tFor         file.Idx\n\tInitializer Expression\n\tUpdate      Expression\n\tTest        Expression\n\tBody        Statement\n}\n```\n\n\n#### func (*ForStatement) Idx0\n\n```go\nfunc (self *ForStatement) Idx0() file.Idx\n```\n\n#### func (*ForStatement) Idx1\n\n```go\nfunc (self *ForStatement) Idx1() file.Idx\n```\n\n#### type FunctionDeclaration\n\n```go\ntype FunctionDeclaration struct {\n\tFunction *FunctionLiteral\n}\n```\n\n\n#### type FunctionLiteral\n\n```go\ntype FunctionLiteral struct {\n\tFunction      file.Idx\n\tName          *Identifier\n\tParameterList *ParameterList\n\tBody          Statement\n\tSource        string\n\n\tDeclarationList []Declaration\n}\n```\n\n\n#### func (*FunctionLiteral) Idx0\n\n```go\nfunc (self *FunctionLiteral) Idx0() file.Idx\n```\n\n#### func (*FunctionLiteral) Idx1\n\n```go\nfunc (self *FunctionLiteral) Idx1() file.Idx\n```\n\n#### type Identifier\n\n```go\ntype Identifier struct {\n\tName string\n\tIdx  file.Idx\n}\n```\n\n\n#### func (*Identifier) Idx0\n\n```go\nfunc (self *Identifier) Idx0() file.Idx\n```\n\n#### func (*Identifier) Idx1\n\n```go\nfunc (self *Identifier) Idx1() file.Idx\n```\n\n#### type IfStatement\n\n```go\ntype IfStatement struct {\n\tIf         file.Idx\n\tTest       Expression\n\tConsequent Statement\n\tAlternate  Statement\n}\n```\n\n\n#### func (*IfStatement) Idx0\n\n```go\nfunc (self *IfStatement) Idx0() file.Idx\n```\n\n#### func (*IfStatement) Idx1\n\n```go\nfunc (self *IfStatement) Idx1() file.Idx\n```\n\n#### type LabelledStatement\n\n```go\ntype LabelledStatement struct {\n\tLabel     *Identifier\n\tColon     file.Idx\n\tStatement Statement\n}\n```\n\n\n#### func (*LabelledStatement) Idx0\n\n```go\nfunc (self *LabelledStatement) Idx0() file.Idx\n```\n\n#### func (*LabelledStatement) Idx1\n\n```go\nfunc (self *LabelledStatement) Idx1() file.Idx\n```\n\n#### type NewExpression\n\n```go\ntype NewExpression struct {\n\tNew              file.Idx\n\tCallee           Expression\n\tLeftParenthesis  file.Idx\n\tArgumentList     []Expression\n\tRightParenthesis file.Idx\n}\n```\n\n\n#### func (*NewExpression) Idx0\n\n```go\nfunc (self *NewExpression) Idx0() file.Idx\n```\n\n#### func (*NewExpression) Idx1\n\n```go\nfunc (self *NewExpression) Idx1() file.Idx\n```\n\n#### type Node\n\n```go\ntype Node interface {\n\tIdx0() file.Idx // The index of the first character belonging to the node\n\tIdx1() file.Idx // The index of the first character immediately after the node\n}\n```\n\nAll nodes implement the Node interface.\n\n#### type NullLiteral\n\n```go\ntype NullLiteral struct {\n\tIdx     file.Idx\n\tLiteral string\n}\n```\n\n\n#### func (*NullLiteral) Idx0\n\n```go\nfunc (self *NullLiteral) Idx0() file.Idx\n```\n\n#### func (*NullLiteral) Idx1\n\n```go\nfunc (self *NullLiteral) Idx1() file.Idx\n```\n\n#### type NumberLiteral\n\n```go\ntype NumberLiteral struct {\n\tIdx     file.Idx\n\tLiteral string\n\tValue   interface{}\n}\n```\n\n\n#### func (*NumberLiteral) Idx0\n\n```go\nfunc (self *NumberLiteral) Idx0() file.Idx\n```\n\n#### func (*NumberLiteral) Idx1\n\n```go\nfunc (self *NumberLiteral) Idx1() file.Idx\n```\n\n#### type ObjectLiteral\n\n```go\ntype ObjectLiteral struct {\n\tLeftBrace  file.Idx\n\tRightBrace file.Idx\n\tValue      []Property\n}\n```\n\n\n#### func (*ObjectLiteral) Idx0\n\n```go\nfunc (self *ObjectLiteral) Idx0() file.Idx\n```\n\n#### func (*ObjectLiteral) Idx1\n\n```go\nfunc (self *ObjectLiteral) Idx1() file.Idx\n```\n\n#### type ParameterList\n\n```go\ntype ParameterList struct {\n\tOpening file.Idx\n\tList    []*Identifier\n\tClosing file.Idx\n}\n```\n\n\n#### type Program\n\n```go\ntype Program struct {\n\tBody []Statement\n\n\tDeclarationList []Declaration\n\n\tFile *file.File\n}\n```\n\n\n#### func (*Program) Idx0\n\n```go\nfunc (self *Program) Idx0() file.Idx\n```\n\n#### func (*Program) Idx1\n\n```go\nfunc (self *Program) Idx1() file.Idx\n```\n\n#### type Property\n\n```go\ntype Property struct {\n\tKey   string\n\tKind  string\n\tValue Expression\n}\n```\n\n\n#### type RegExpLiteral\n\n```go\ntype RegExpLiteral struct {\n\tIdx     file.Idx\n\tLiteral string\n\tPattern string\n\tFlags   string\n\tValue   string\n}\n```\n\n\n#### func (*RegExpLiteral) Idx0\n\n```go\nfunc (self *RegExpLiteral) Idx0() file.Idx\n```\n\n#### func (*RegExpLiteral) Idx1\n\n```go\nfunc (self *RegExpLiteral) Idx1() file.Idx\n```\n\n#### type ReturnStatement\n\n```go\ntype ReturnStatement struct {\n\tReturn   file.Idx\n\tArgument Expression\n}\n```\n\n\n#### func (*ReturnStatement) Idx0\n\n```go\nfunc (self *ReturnStatement) Idx0() file.Idx\n```\n\n#### func (*ReturnStatement) Idx1\n\n```go\nfunc (self *ReturnStatement) Idx1() file.Idx\n```\n\n#### type SequenceExpression\n\n```go\ntype SequenceExpression struct {\n\tSequence []Expression\n}\n```\n\n\n#### func (*SequenceExpression) Idx0\n\n```go\nfunc (self *SequenceExpression) Idx0() file.Idx\n```\n\n#### func (*SequenceExpression) Idx1\n\n```go\nfunc (self *SequenceExpression) Idx1() file.Idx\n```\n\n#### type Statement\n\n```go\ntype Statement interface {\n\tNode\n\t// contains filtered or unexported methods\n}\n```\n\nAll statement nodes implement the Statement interface.\n\n#### type StringLiteral\n\n```go\ntype StringLiteral struct {\n\tIdx     file.Idx\n\tLiteral string\n\tValue   string\n}\n```\n\n\n#### func (*StringLiteral) Idx0\n\n```go\nfunc (self *StringLiteral) Idx0() file.Idx\n```\n\n#### func (*StringLiteral) Idx1\n\n```go\nfunc (self *StringLiteral) Idx1() file.Idx\n```\n\n#### type SwitchStatement\n\n```go\ntype SwitchStatement struct {\n\tSwitch       file.Idx\n\tDiscriminant Expression\n\tDefault      int\n\tBody         []*CaseStatement\n}\n```\n\n\n#### func (*SwitchStatement) Idx0\n\n```go\nfunc (self *SwitchStatement) Idx0() file.Idx\n```\n\n#### func (*SwitchStatement) Idx1\n\n```go\nfunc (self *SwitchStatement) Idx1() file.Idx\n```\n\n#### type ThisExpression\n\n```go\ntype ThisExpression struct {\n\tIdx file.Idx\n}\n```\n\n\n#### func (*ThisExpression) Idx0\n\n```go\nfunc (self *ThisExpression) Idx0() file.Idx\n```\n\n#### func (*ThisExpression) Idx1\n\n```go\nfunc (self *ThisExpression) Idx1() file.Idx\n```\n\n#### type ThrowStatement\n\n```go\ntype ThrowStatement struct {\n\tThrow    file.Idx\n\tArgument Expression\n}\n```\n\n\n#### func (*ThrowStatement) Idx0\n\n```go\nfunc (self *ThrowStatement) Idx0() file.Idx\n```\n\n#### func (*ThrowStatement) Idx1\n\n```go\nfunc (self *ThrowStatement) Idx1() file.Idx\n```\n\n#### type TryStatement\n\n```go\ntype TryStatement struct {\n\tTry     file.Idx\n\tBody    Statement\n\tCatch   *CatchStatement\n\tFinally Statement\n}\n```\n\n\n#### func (*TryStatement) Idx0\n\n```go\nfunc (self *TryStatement) Idx0() file.Idx\n```\n\n#### func (*TryStatement) Idx1\n\n```go\nfunc (self *TryStatement) Idx1() file.Idx\n```\n\n#### type UnaryExpression\n\n```go\ntype UnaryExpression struct {\n\tOperator token.Token\n\tIdx      file.Idx // If a prefix operation\n\tOperand  Expression\n\tPostfix  bool\n}\n```\n\n\n#### func (*UnaryExpression) Idx0\n\n```go\nfunc (self *UnaryExpression) Idx0() file.Idx\n```\n\n#### func (*UnaryExpression) Idx1\n\n```go\nfunc (self *UnaryExpression) Idx1() file.Idx\n```\n\n#### type VariableDeclaration\n\n```go\ntype VariableDeclaration struct {\n\tVar  file.Idx\n\tList []*VariableExpression\n}\n```\n\n\n#### type VariableExpression\n\n```go\ntype VariableExpression struct {\n\tName        string\n\tIdx         file.Idx\n\tInitializer Expression\n}\n```\n\n\n#### func (*VariableExpression) Idx0\n\n```go\nfunc (self *VariableExpression) Idx0() file.Idx\n```\n\n#### func (*VariableExpression) Idx1\n\n```go\nfunc (self *VariableExpression) Idx1() file.Idx\n```\n\n#### type VariableStatement\n\n```go\ntype VariableStatement struct {\n\tVar  file.Idx\n\tList []Expression\n}\n```\n\n\n#### func (*VariableStatement) Idx0\n\n```go\nfunc (self *VariableStatement) Idx0() file.Idx\n```\n\n#### func (*VariableStatement) Idx1\n\n```go\nfunc (self *VariableStatement) Idx1() file.Idx\n```\n\n#### type WhileStatement\n\n```go\ntype WhileStatement struct {\n\tWhile file.Idx\n\tTest  Expression\n\tBody  Statement\n}\n```\n\n\n#### func (*WhileStatement) Idx0\n\n```go\nfunc (self *WhileStatement) Idx0() file.Idx\n```\n\n#### func (*WhileStatement) Idx1\n\n```go\nfunc (self *WhileStatement) Idx1() file.Idx\n```\n\n#### type WithStatement\n\n```go\ntype WithStatement struct {\n\tWith   file.Idx\n\tObject Expression\n\tBody   Statement\n}\n```\n\n\n#### func (*WithStatement) Idx0\n\n```go\nfunc (self *WithStatement) Idx0() file.Idx\n```\n\n#### func (*WithStatement) Idx1\n\n```go\nfunc (self *WithStatement) Idx1() file.Idx\n```\n\n--\n**godocdown** http://github.com/robertkrimen/godocdown\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/ast/comments.go",
    "content": "package ast\n\nimport (\n\t\"fmt\"\n\t\"github.com/robertkrimen/otto/file\"\n)\n\n// CommentPosition determines where the comment is in a given context\ntype CommentPosition int\n\nconst (\n\t_        CommentPosition = iota\n\tLEADING                  // Before the pertinent expression\n\tTRAILING                 // After the pertinent expression\n\tKEY                      // Before a key in an object\n\tCOLON                    // After a colon in a field declaration\n\tFINAL                    // Final comments in a block, not belonging to a specific expression or the comment after a trailing , in an array or object literal\n\tIF                       // After an if keyword\n\tWHILE                    // After a while keyword\n\tDO                       // After do keyword\n\tFOR                      // After a for keyword\n\tWITH                     // After a with keyword\n\tTBD\n)\n\n// Comment contains the data of the comment\ntype Comment struct {\n\tBegin    file.Idx\n\tText     string\n\tPosition CommentPosition\n}\n\n// NewComment creates a new comment\nfunc NewComment(text string, idx file.Idx) *Comment {\n\tcomment := &Comment{\n\t\tBegin:    idx,\n\t\tText:     text,\n\t\tPosition: TBD,\n\t}\n\n\treturn comment\n}\n\n// String returns a stringified version of the position\nfunc (cp CommentPosition) String() string {\n\tswitch cp {\n\tcase LEADING:\n\t\treturn \"Leading\"\n\tcase TRAILING:\n\t\treturn \"Trailing\"\n\tcase KEY:\n\t\treturn \"Key\"\n\tcase COLON:\n\t\treturn \"Colon\"\n\tcase FINAL:\n\t\treturn \"Final\"\n\tcase IF:\n\t\treturn \"If\"\n\tcase WHILE:\n\t\treturn \"While\"\n\tcase DO:\n\t\treturn \"Do\"\n\tcase FOR:\n\t\treturn \"For\"\n\tcase WITH:\n\t\treturn \"With\"\n\tdefault:\n\t\treturn \"???\"\n\t}\n}\n\n// String returns a stringified version of the comment\nfunc (c Comment) String() string {\n\treturn fmt.Sprintf(\"Comment: %v\", c.Text)\n}\n\n// Comments defines the current view of comments from the parser\ntype Comments struct {\n\t// CommentMap is a reference to the parser comment map\n\tCommentMap CommentMap\n\t// Comments lists the comments scanned, not linked to a node yet\n\tComments []*Comment\n\t// future lists the comments after a line break during a sequence of comments\n\tfuture []*Comment\n\t// Current is node for which comments are linked to\n\tCurrent Expression\n\n\t// wasLineBreak determines if a line break occured while scanning for comments\n\twasLineBreak bool\n\t// primary determines whether or not processing a primary expression\n\tprimary bool\n\t// afterBlock determines whether or not being after a block statement\n\tafterBlock bool\n}\n\nfunc NewComments() *Comments {\n\tcomments := &Comments{\n\t\tCommentMap: CommentMap{},\n\t}\n\n\treturn comments\n}\n\nfunc (c *Comments) String() string {\n\treturn fmt.Sprintf(\"NODE: %v, Comments: %v, Future: %v(LINEBREAK:%v)\", c.Current, len(c.Comments), len(c.future), c.wasLineBreak)\n}\n\n// FetchAll returns all the currently scanned comments,\n// including those from the next line\nfunc (c *Comments) FetchAll() []*Comment {\n\tdefer func() {\n\t\tc.Comments = nil\n\t\tc.future = nil\n\t}()\n\n\treturn append(c.Comments, c.future...)\n}\n\n// Fetch returns all the currently scanned comments\nfunc (c *Comments) Fetch() []*Comment {\n\tdefer func() {\n\t\tc.Comments = nil\n\t}()\n\n\treturn c.Comments\n}\n\n// ResetLineBreak marks the beginning of a new statement\nfunc (c *Comments) ResetLineBreak() {\n\tc.wasLineBreak = false\n}\n\n// MarkPrimary will mark the context as processing a primary expression\nfunc (c *Comments) MarkPrimary() {\n\tc.primary = true\n\tc.wasLineBreak = false\n}\n\n// AfterBlock will mark the context as being after a block.\nfunc (c *Comments) AfterBlock() {\n\tc.afterBlock = true\n}\n\n// AddComment adds a comment to the view.\n// Depending on the context, comments are added normally or as post line break.\nfunc (c *Comments) AddComment(comment *Comment) {\n\tif c.primary {\n\t\tif !c.wasLineBreak {\n\t\t\tc.Comments = append(c.Comments, comment)\n\t\t} else {\n\t\t\tc.future = append(c.future, comment)\n\t\t}\n\t} else {\n\t\tif !c.wasLineBreak || (c.Current == nil && !c.afterBlock) {\n\t\t\tc.Comments = append(c.Comments, comment)\n\t\t} else {\n\t\t\tc.future = append(c.future, comment)\n\t\t}\n\t}\n}\n\n// MarkComments will mark the found comments as the given position.\nfunc (c *Comments) MarkComments(position CommentPosition) {\n\tfor _, comment := range c.Comments {\n\t\tif comment.Position == TBD {\n\t\t\tcomment.Position = position\n\t\t}\n\t}\n\tfor _, c := range c.future {\n\t\tif c.Position == TBD {\n\t\t\tc.Position = position\n\t\t}\n\t}\n}\n\n// Unset the current node and apply the comments to the current expression.\n// Resets context variables.\nfunc (c *Comments) Unset() {\n\tif c.Current != nil {\n\t\tc.applyComments(c.Current, c.Current, TRAILING)\n\t\tc.Current = nil\n\t}\n\tc.wasLineBreak = false\n\tc.primary = false\n\tc.afterBlock = false\n}\n\n// SetExpression sets the current expression.\n// It is applied the found comments, unless the previous expression has not been unset.\n// It is skipped if the node is already set or if it is a part of the previous node.\nfunc (c *Comments) SetExpression(node Expression) {\n\t// Skipping same node\n\tif c.Current == node {\n\t\treturn\n\t}\n\tif c.Current != nil && c.Current.Idx1() == node.Idx1() {\n\t\tc.Current = node\n\t\treturn\n\t}\n\tprevious := c.Current\n\tc.Current = node\n\n\t// Apply the found comments and futures to the node and the previous.\n\tc.applyComments(node, previous, TRAILING)\n}\n\n// PostProcessNode applies all found comments to the given node\nfunc (c *Comments) PostProcessNode(node Node) {\n\tc.applyComments(node, nil, TRAILING)\n}\n\n// applyComments applies both the comments and the future comments to the given node and the previous one,\n// based on the context.\nfunc (c *Comments) applyComments(node, previous Node, position CommentPosition) {\n\tif previous != nil {\n\t\tc.CommentMap.AddComments(previous, c.Comments, position)\n\t\tc.Comments = nil\n\t} else {\n\t\tc.CommentMap.AddComments(node, c.Comments, position)\n\t\tc.Comments = nil\n\t}\n\t// Only apply the future comments to the node if the previous is set.\n\t// This is for detecting end of line comments and which node comments on the following lines belongs to\n\tif previous != nil {\n\t\tc.CommentMap.AddComments(node, c.future, position)\n\t\tc.future = nil\n\t}\n}\n\n// AtLineBreak will mark a line break\nfunc (c *Comments) AtLineBreak() {\n\tc.wasLineBreak = true\n}\n\n// CommentMap is the data structure where all found comments are stored\ntype CommentMap map[Node][]*Comment\n\n// AddComment adds a single comment to the map\nfunc (cm CommentMap) AddComment(node Node, comment *Comment) {\n\tlist := cm[node]\n\tlist = append(list, comment)\n\n\tcm[node] = list\n}\n\n// AddComments adds a slice of comments, given a node and an updated position\nfunc (cm CommentMap) AddComments(node Node, comments []*Comment, position CommentPosition) {\n\tfor _, comment := range comments {\n\t\tif comment.Position == TBD {\n\t\t\tcomment.Position = position\n\t\t}\n\t\tcm.AddComment(node, comment)\n\t}\n}\n\n// Size returns the size of the map\nfunc (cm CommentMap) Size() int {\n\tsize := 0\n\tfor _, comments := range cm {\n\t\tsize += len(comments)\n\t}\n\n\treturn size\n}\n\n// MoveComments moves comments with a given position from a node to another\nfunc (cm CommentMap) MoveComments(from, to Node, position CommentPosition) {\n\tfor i, c := range cm[from] {\n\t\tif c.Position == position {\n\t\t\tcm.AddComment(to, c)\n\n\t\t\t// Remove the comment from the \"from\" slice\n\t\t\tcm[from][i] = cm[from][len(cm[from])-1]\n\t\t\tcm[from][len(cm[from])-1] = nil\n\t\t\tcm[from] = cm[from][:len(cm[from])-1]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/ast/node.go",
    "content": "/*\nPackage ast declares types representing a JavaScript AST.\n\nWarning\n\nThe parser and AST interfaces are still works-in-progress (particularly where\nnode types are concerned) and may change in the future.\n\n*/\npackage ast\n\nimport (\n\t\"github.com/robertkrimen/otto/file\"\n\t\"github.com/robertkrimen/otto/token\"\n)\n\n// All nodes implement the Node interface.\ntype Node interface {\n\tIdx0() file.Idx // The index of the first character belonging to the node\n\tIdx1() file.Idx // The index of the first character immediately after the node\n}\n\n// ========== //\n// Expression //\n// ========== //\n\ntype (\n\t// All expression nodes implement the Expression interface.\n\tExpression interface {\n\t\tNode\n\t\t_expressionNode()\n\t}\n\n\tArrayLiteral struct {\n\t\tLeftBracket  file.Idx\n\t\tRightBracket file.Idx\n\t\tValue        []Expression\n\t}\n\n\tAssignExpression struct {\n\t\tOperator token.Token\n\t\tLeft     Expression\n\t\tRight    Expression\n\t}\n\n\tBadExpression struct {\n\t\tFrom file.Idx\n\t\tTo   file.Idx\n\t}\n\n\tBinaryExpression struct {\n\t\tOperator   token.Token\n\t\tLeft       Expression\n\t\tRight      Expression\n\t\tComparison bool\n\t}\n\n\tBooleanLiteral struct {\n\t\tIdx     file.Idx\n\t\tLiteral string\n\t\tValue   bool\n\t}\n\n\tBracketExpression struct {\n\t\tLeft         Expression\n\t\tMember       Expression\n\t\tLeftBracket  file.Idx\n\t\tRightBracket file.Idx\n\t}\n\n\tCallExpression struct {\n\t\tCallee           Expression\n\t\tLeftParenthesis  file.Idx\n\t\tArgumentList     []Expression\n\t\tRightParenthesis file.Idx\n\t}\n\n\tConditionalExpression struct {\n\t\tTest       Expression\n\t\tConsequent Expression\n\t\tAlternate  Expression\n\t}\n\n\tDotExpression struct {\n\t\tLeft       Expression\n\t\tIdentifier *Identifier\n\t}\n\n\tEmptyExpression struct {\n\t\tBegin file.Idx\n\t\tEnd   file.Idx\n\t}\n\n\tFunctionLiteral struct {\n\t\tFunction      file.Idx\n\t\tName          *Identifier\n\t\tParameterList *ParameterList\n\t\tBody          Statement\n\t\tSource        string\n\n\t\tDeclarationList []Declaration\n\t}\n\n\tIdentifier struct {\n\t\tName string\n\t\tIdx  file.Idx\n\t}\n\n\tNewExpression struct {\n\t\tNew              file.Idx\n\t\tCallee           Expression\n\t\tLeftParenthesis  file.Idx\n\t\tArgumentList     []Expression\n\t\tRightParenthesis file.Idx\n\t}\n\n\tNullLiteral struct {\n\t\tIdx     file.Idx\n\t\tLiteral string\n\t}\n\n\tNumberLiteral struct {\n\t\tIdx     file.Idx\n\t\tLiteral string\n\t\tValue   interface{}\n\t}\n\n\tObjectLiteral struct {\n\t\tLeftBrace  file.Idx\n\t\tRightBrace file.Idx\n\t\tValue      []Property\n\t}\n\n\tParameterList struct {\n\t\tOpening file.Idx\n\t\tList    []*Identifier\n\t\tClosing file.Idx\n\t}\n\n\tProperty struct {\n\t\tKey   string\n\t\tKind  string\n\t\tValue Expression\n\t}\n\n\tRegExpLiteral struct {\n\t\tIdx     file.Idx\n\t\tLiteral string\n\t\tPattern string\n\t\tFlags   string\n\t\tValue   string\n\t}\n\n\tSequenceExpression struct {\n\t\tSequence []Expression\n\t}\n\n\tStringLiteral struct {\n\t\tIdx     file.Idx\n\t\tLiteral string\n\t\tValue   string\n\t}\n\n\tThisExpression struct {\n\t\tIdx file.Idx\n\t}\n\n\tUnaryExpression struct {\n\t\tOperator token.Token\n\t\tIdx      file.Idx // If a prefix operation\n\t\tOperand  Expression\n\t\tPostfix  bool\n\t}\n\n\tVariableExpression struct {\n\t\tName        string\n\t\tIdx         file.Idx\n\t\tInitializer Expression\n\t}\n)\n\n// _expressionNode\n\nfunc (*ArrayLiteral) _expressionNode()          {}\nfunc (*AssignExpression) _expressionNode()      {}\nfunc (*BadExpression) _expressionNode()         {}\nfunc (*BinaryExpression) _expressionNode()      {}\nfunc (*BooleanLiteral) _expressionNode()        {}\nfunc (*BracketExpression) _expressionNode()     {}\nfunc (*CallExpression) _expressionNode()        {}\nfunc (*ConditionalExpression) _expressionNode() {}\nfunc (*DotExpression) _expressionNode()         {}\nfunc (*EmptyExpression) _expressionNode()       {}\nfunc (*FunctionLiteral) _expressionNode()       {}\nfunc (*Identifier) _expressionNode()            {}\nfunc (*NewExpression) _expressionNode()         {}\nfunc (*NullLiteral) _expressionNode()           {}\nfunc (*NumberLiteral) _expressionNode()         {}\nfunc (*ObjectLiteral) _expressionNode()         {}\nfunc (*RegExpLiteral) _expressionNode()         {}\nfunc (*SequenceExpression) _expressionNode()    {}\nfunc (*StringLiteral) _expressionNode()         {}\nfunc (*ThisExpression) _expressionNode()        {}\nfunc (*UnaryExpression) _expressionNode()       {}\nfunc (*VariableExpression) _expressionNode()    {}\n\n// ========= //\n// Statement //\n// ========= //\n\ntype (\n\t// All statement nodes implement the Statement interface.\n\tStatement interface {\n\t\tNode\n\t\t_statementNode()\n\t}\n\n\tBadStatement struct {\n\t\tFrom file.Idx\n\t\tTo   file.Idx\n\t}\n\n\tBlockStatement struct {\n\t\tLeftBrace  file.Idx\n\t\tList       []Statement\n\t\tRightBrace file.Idx\n\t}\n\n\tBranchStatement struct {\n\t\tIdx   file.Idx\n\t\tToken token.Token\n\t\tLabel *Identifier\n\t}\n\n\tCaseStatement struct {\n\t\tCase       file.Idx\n\t\tTest       Expression\n\t\tConsequent []Statement\n\t}\n\n\tCatchStatement struct {\n\t\tCatch     file.Idx\n\t\tParameter *Identifier\n\t\tBody      Statement\n\t}\n\n\tDebuggerStatement struct {\n\t\tDebugger file.Idx\n\t}\n\n\tDoWhileStatement struct {\n\t\tDo   file.Idx\n\t\tTest Expression\n\t\tBody Statement\n\t}\n\n\tEmptyStatement struct {\n\t\tSemicolon file.Idx\n\t}\n\n\tExpressionStatement struct {\n\t\tExpression Expression\n\t}\n\n\tForInStatement struct {\n\t\tFor    file.Idx\n\t\tInto   Expression\n\t\tSource Expression\n\t\tBody   Statement\n\t}\n\n\tForStatement struct {\n\t\tFor         file.Idx\n\t\tInitializer Expression\n\t\tUpdate      Expression\n\t\tTest        Expression\n\t\tBody        Statement\n\t}\n\n\tFunctionStatement struct {\n\t\tFunction *FunctionLiteral\n\t}\n\n\tIfStatement struct {\n\t\tIf         file.Idx\n\t\tTest       Expression\n\t\tConsequent Statement\n\t\tAlternate  Statement\n\t}\n\n\tLabelledStatement struct {\n\t\tLabel     *Identifier\n\t\tColon     file.Idx\n\t\tStatement Statement\n\t}\n\n\tReturnStatement struct {\n\t\tReturn   file.Idx\n\t\tArgument Expression\n\t}\n\n\tSwitchStatement struct {\n\t\tSwitch       file.Idx\n\t\tDiscriminant Expression\n\t\tDefault      int\n\t\tBody         []*CaseStatement\n\t}\n\n\tThrowStatement struct {\n\t\tThrow    file.Idx\n\t\tArgument Expression\n\t}\n\n\tTryStatement struct {\n\t\tTry     file.Idx\n\t\tBody    Statement\n\t\tCatch   *CatchStatement\n\t\tFinally Statement\n\t}\n\n\tVariableStatement struct {\n\t\tVar  file.Idx\n\t\tList []Expression\n\t}\n\n\tWhileStatement struct {\n\t\tWhile file.Idx\n\t\tTest  Expression\n\t\tBody  Statement\n\t}\n\n\tWithStatement struct {\n\t\tWith   file.Idx\n\t\tObject Expression\n\t\tBody   Statement\n\t}\n)\n\n// _statementNode\n\nfunc (*BadStatement) _statementNode()        {}\nfunc (*BlockStatement) _statementNode()      {}\nfunc (*BranchStatement) _statementNode()     {}\nfunc (*CaseStatement) _statementNode()       {}\nfunc (*CatchStatement) _statementNode()      {}\nfunc (*DebuggerStatement) _statementNode()   {}\nfunc (*DoWhileStatement) _statementNode()    {}\nfunc (*EmptyStatement) _statementNode()      {}\nfunc (*ExpressionStatement) _statementNode() {}\nfunc (*ForInStatement) _statementNode()      {}\nfunc (*ForStatement) _statementNode()        {}\nfunc (*FunctionStatement) _statementNode()   {}\nfunc (*IfStatement) _statementNode()         {}\nfunc (*LabelledStatement) _statementNode()   {}\nfunc (*ReturnStatement) _statementNode()     {}\nfunc (*SwitchStatement) _statementNode()     {}\nfunc (*ThrowStatement) _statementNode()      {}\nfunc (*TryStatement) _statementNode()        {}\nfunc (*VariableStatement) _statementNode()   {}\nfunc (*WhileStatement) _statementNode()      {}\nfunc (*WithStatement) _statementNode()       {}\n\n// =========== //\n// Declaration //\n// =========== //\n\ntype (\n\t// All declaration nodes implement the Declaration interface.\n\tDeclaration interface {\n\t\t_declarationNode()\n\t}\n\n\tFunctionDeclaration struct {\n\t\tFunction *FunctionLiteral\n\t}\n\n\tVariableDeclaration struct {\n\t\tVar  file.Idx\n\t\tList []*VariableExpression\n\t}\n)\n\n// _declarationNode\n\nfunc (*FunctionDeclaration) _declarationNode() {}\nfunc (*VariableDeclaration) _declarationNode() {}\n\n// ==== //\n// Node //\n// ==== //\n\ntype Program struct {\n\tBody []Statement\n\n\tDeclarationList []Declaration\n\n\tFile *file.File\n\n\tComments CommentMap\n}\n\n// ==== //\n// Idx0 //\n// ==== //\n\nfunc (self *ArrayLiteral) Idx0() file.Idx          { return self.LeftBracket }\nfunc (self *AssignExpression) Idx0() file.Idx      { return self.Left.Idx0() }\nfunc (self *BadExpression) Idx0() file.Idx         { return self.From }\nfunc (self *BinaryExpression) Idx0() file.Idx      { return self.Left.Idx0() }\nfunc (self *BooleanLiteral) Idx0() file.Idx        { return self.Idx }\nfunc (self *BracketExpression) Idx0() file.Idx     { return self.Left.Idx0() }\nfunc (self *CallExpression) Idx0() file.Idx        { return self.Callee.Idx0() }\nfunc (self *ConditionalExpression) Idx0() file.Idx { return self.Test.Idx0() }\nfunc (self *DotExpression) Idx0() file.Idx         { return self.Left.Idx0() }\nfunc (self *EmptyExpression) Idx0() file.Idx       { return self.Begin }\nfunc (self *FunctionLiteral) Idx0() file.Idx       { return self.Function }\nfunc (self *Identifier) Idx0() file.Idx            { return self.Idx }\nfunc (self *NewExpression) Idx0() file.Idx         { return self.New }\nfunc (self *NullLiteral) Idx0() file.Idx           { return self.Idx }\nfunc (self *NumberLiteral) Idx0() file.Idx         { return self.Idx }\nfunc (self *ObjectLiteral) Idx0() file.Idx         { return self.LeftBrace }\nfunc (self *RegExpLiteral) Idx0() file.Idx         { return self.Idx }\nfunc (self *SequenceExpression) Idx0() file.Idx    { return self.Sequence[0].Idx0() }\nfunc (self *StringLiteral) Idx0() file.Idx         { return self.Idx }\nfunc (self *ThisExpression) Idx0() file.Idx        { return self.Idx }\nfunc (self *UnaryExpression) Idx0() file.Idx       { return self.Idx }\nfunc (self *VariableExpression) Idx0() file.Idx    { return self.Idx }\n\nfunc (self *BadStatement) Idx0() file.Idx        { return self.From }\nfunc (self *BlockStatement) Idx0() file.Idx      { return self.LeftBrace }\nfunc (self *BranchStatement) Idx0() file.Idx     { return self.Idx }\nfunc (self *CaseStatement) Idx0() file.Idx       { return self.Case }\nfunc (self *CatchStatement) Idx0() file.Idx      { return self.Catch }\nfunc (self *DebuggerStatement) Idx0() file.Idx   { return self.Debugger }\nfunc (self *DoWhileStatement) Idx0() file.Idx    { return self.Do }\nfunc (self *EmptyStatement) Idx0() file.Idx      { return self.Semicolon }\nfunc (self *ExpressionStatement) Idx0() file.Idx { return self.Expression.Idx0() }\nfunc (self *ForInStatement) Idx0() file.Idx      { return self.For }\nfunc (self *ForStatement) Idx0() file.Idx        { return self.For }\nfunc (self *FunctionStatement) Idx0() file.Idx   { return self.Function.Idx0() }\nfunc (self *IfStatement) Idx0() file.Idx         { return self.If }\nfunc (self *LabelledStatement) Idx0() file.Idx   { return self.Label.Idx0() }\nfunc (self *Program) Idx0() file.Idx             { return self.Body[0].Idx0() }\nfunc (self *ReturnStatement) Idx0() file.Idx     { return self.Return }\nfunc (self *SwitchStatement) Idx0() file.Idx     { return self.Switch }\nfunc (self *ThrowStatement) Idx0() file.Idx      { return self.Throw }\nfunc (self *TryStatement) Idx0() file.Idx        { return self.Try }\nfunc (self *VariableStatement) Idx0() file.Idx   { return self.Var }\nfunc (self *WhileStatement) Idx0() file.Idx      { return self.While }\nfunc (self *WithStatement) Idx0() file.Idx       { return self.With }\n\n// ==== //\n// Idx1 //\n// ==== //\n\nfunc (self *ArrayLiteral) Idx1() file.Idx          { return self.RightBracket }\nfunc (self *AssignExpression) Idx1() file.Idx      { return self.Right.Idx1() }\nfunc (self *BadExpression) Idx1() file.Idx         { return self.To }\nfunc (self *BinaryExpression) Idx1() file.Idx      { return self.Right.Idx1() }\nfunc (self *BooleanLiteral) Idx1() file.Idx        { return file.Idx(int(self.Idx) + len(self.Literal)) }\nfunc (self *BracketExpression) Idx1() file.Idx     { return self.RightBracket + 1 }\nfunc (self *CallExpression) Idx1() file.Idx        { return self.RightParenthesis + 1 }\nfunc (self *ConditionalExpression) Idx1() file.Idx { return self.Test.Idx1() }\nfunc (self *DotExpression) Idx1() file.Idx         { return self.Identifier.Idx1() }\nfunc (self *EmptyExpression) Idx1() file.Idx       { return self.End }\nfunc (self *FunctionLiteral) Idx1() file.Idx       { return self.Body.Idx1() }\nfunc (self *Identifier) Idx1() file.Idx            { return file.Idx(int(self.Idx) + len(self.Name)) }\nfunc (self *NewExpression) Idx1() file.Idx         { return self.RightParenthesis + 1 }\nfunc (self *NullLiteral) Idx1() file.Idx           { return file.Idx(int(self.Idx) + 4) } // \"null\"\nfunc (self *NumberLiteral) Idx1() file.Idx         { return file.Idx(int(self.Idx) + len(self.Literal)) }\nfunc (self *ObjectLiteral) Idx1() file.Idx         { return self.RightBrace }\nfunc (self *RegExpLiteral) Idx1() file.Idx         { return file.Idx(int(self.Idx) + len(self.Literal)) }\nfunc (self *SequenceExpression) Idx1() file.Idx    { return self.Sequence[0].Idx1() }\nfunc (self *StringLiteral) Idx1() file.Idx         { return file.Idx(int(self.Idx) + len(self.Literal)) }\nfunc (self *ThisExpression) Idx1() file.Idx        { return self.Idx }\nfunc (self *UnaryExpression) Idx1() file.Idx {\n\tif self.Postfix {\n\t\treturn self.Operand.Idx1() + 2 // ++ --\n\t}\n\treturn self.Operand.Idx1()\n}\nfunc (self *VariableExpression) Idx1() file.Idx {\n\tif self.Initializer == nil {\n\t\treturn file.Idx(int(self.Idx) + len(self.Name) + 1)\n\t}\n\treturn self.Initializer.Idx1()\n}\n\nfunc (self *BadStatement) Idx1() file.Idx        { return self.To }\nfunc (self *BlockStatement) Idx1() file.Idx      { return self.RightBrace + 1 }\nfunc (self *BranchStatement) Idx1() file.Idx     { return self.Idx }\nfunc (self *CaseStatement) Idx1() file.Idx       { return self.Consequent[len(self.Consequent)-1].Idx1() }\nfunc (self *CatchStatement) Idx1() file.Idx      { return self.Body.Idx1() }\nfunc (self *DebuggerStatement) Idx1() file.Idx   { return self.Debugger + 8 }\nfunc (self *DoWhileStatement) Idx1() file.Idx    { return self.Test.Idx1() }\nfunc (self *EmptyStatement) Idx1() file.Idx      { return self.Semicolon + 1 }\nfunc (self *ExpressionStatement) Idx1() file.Idx { return self.Expression.Idx1() }\nfunc (self *ForInStatement) Idx1() file.Idx      { return self.Body.Idx1() }\nfunc (self *ForStatement) Idx1() file.Idx        { return self.Body.Idx1() }\nfunc (self *FunctionStatement) Idx1() file.Idx   { return self.Function.Idx1() }\nfunc (self *IfStatement) Idx1() file.Idx {\n\tif self.Alternate != nil {\n\t\treturn self.Alternate.Idx1()\n\t}\n\treturn self.Consequent.Idx1()\n}\nfunc (self *LabelledStatement) Idx1() file.Idx { return self.Colon + 1 }\nfunc (self *Program) Idx1() file.Idx           { return self.Body[len(self.Body)-1].Idx1() }\nfunc (self *ReturnStatement) Idx1() file.Idx   { return self.Return }\nfunc (self *SwitchStatement) Idx1() file.Idx   { return self.Body[len(self.Body)-1].Idx1() }\nfunc (self *ThrowStatement) Idx1() file.Idx    { return self.Throw }\nfunc (self *TryStatement) Idx1() file.Idx      { return self.Try }\nfunc (self *VariableStatement) Idx1() file.Idx { return self.List[len(self.List)-1].Idx1() }\nfunc (self *WhileStatement) Idx1() file.Idx    { return self.Body.Idx1() }\nfunc (self *WithStatement) Idx1() file.Idx     { return self.Body.Idx1() }\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin.go",
    "content": "package otto\n\nimport (\n\t\"encoding/hex\"\n\t\"math\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode/utf16\"\n\t\"unicode/utf8\"\n)\n\n// Global\nfunc builtinGlobal_eval(call FunctionCall) Value {\n\tsrc := call.Argument(0)\n\tif !src.IsString() {\n\t\treturn src\n\t}\n\truntime := call.runtime\n\tprogram := runtime.cmpl_parseOrThrow(src.string(), nil)\n\tif !call.eval {\n\t\t// Not a direct call to eval, so we enter the global ExecutionContext\n\t\truntime.enterGlobalScope()\n\t\tdefer runtime.leaveScope()\n\t}\n\treturnValue := runtime.cmpl_evaluate_nodeProgram(program, true)\n\tif returnValue.isEmpty() {\n\t\treturn Value{}\n\t}\n\treturn returnValue\n}\n\nfunc builtinGlobal_isNaN(call FunctionCall) Value {\n\tvalue := call.Argument(0).float64()\n\treturn toValue_bool(math.IsNaN(value))\n}\n\nfunc builtinGlobal_isFinite(call FunctionCall) Value {\n\tvalue := call.Argument(0).float64()\n\treturn toValue_bool(!math.IsNaN(value) && !math.IsInf(value, 0))\n}\n\n// radix 3 => 2 (ASCII 50) +47\n// radix 11 => A/a (ASCII 65/97) +54/+86\nvar parseInt_alphabetTable = func() []string {\n\ttable := []string{\"\", \"\", \"01\"}\n\tfor radix := 3; radix <= 36; radix += 1 {\n\t\talphabet := table[radix-1]\n\t\tif radix <= 10 {\n\t\t\talphabet += string(radix + 47)\n\t\t} else {\n\t\t\talphabet += string(radix+54) + string(radix+86)\n\t\t}\n\t\ttable = append(table, alphabet)\n\t}\n\treturn table\n}()\n\nfunc digitValue(chr rune) int {\n\tswitch {\n\tcase '0' <= chr && chr <= '9':\n\t\treturn int(chr - '0')\n\tcase 'a' <= chr && chr <= 'z':\n\t\treturn int(chr - 'a' + 10)\n\tcase 'A' <= chr && chr <= 'Z':\n\t\treturn int(chr - 'A' + 10)\n\t}\n\treturn 36 // Larger than any legal digit value\n}\n\nfunc builtinGlobal_parseInt(call FunctionCall) Value {\n\tinput := strings.Trim(call.Argument(0).string(), builtinString_trim_whitespace)\n\tif len(input) == 0 {\n\t\treturn NaNValue()\n\t}\n\n\tradix := int(toInt32(call.Argument(1)))\n\n\tnegative := false\n\tswitch input[0] {\n\tcase '+':\n\t\tinput = input[1:]\n\tcase '-':\n\t\tnegative = true\n\t\tinput = input[1:]\n\t}\n\n\tstrip := true\n\tif radix == 0 {\n\t\tradix = 10\n\t} else {\n\t\tif radix < 2 || radix > 36 {\n\t\t\treturn NaNValue()\n\t\t} else if radix != 16 {\n\t\t\tstrip = false\n\t\t}\n\t}\n\n\tswitch len(input) {\n\tcase 0:\n\t\treturn NaNValue()\n\tcase 1:\n\tdefault:\n\t\tif strip {\n\t\t\tif input[0] == '0' && (input[1] == 'x' || input[1] == 'X') {\n\t\t\t\tinput = input[2:]\n\t\t\t\tradix = 16\n\t\t\t}\n\t\t}\n\t}\n\n\tbase := radix\n\tindex := 0\n\tfor ; index < len(input); index++ {\n\t\tdigit := digitValue(rune(input[index])) // If not ASCII, then an error anyway\n\t\tif digit >= base {\n\t\t\tbreak\n\t\t}\n\t}\n\tinput = input[0:index]\n\n\tvalue, err := strconv.ParseInt(input, radix, 64)\n\tif err != nil {\n\t\tif err.(*strconv.NumError).Err == strconv.ErrRange {\n\t\t\tbase := float64(base)\n\t\t\t// Could just be a very large number (e.g. 0x8000000000000000)\n\t\t\tvar value float64\n\t\t\tfor _, chr := range input {\n\t\t\t\tdigit := float64(digitValue(chr))\n\t\t\t\tif digit >= base {\n\t\t\t\t\tgoto error\n\t\t\t\t}\n\t\t\t\tvalue = value*base + digit\n\t\t\t}\n\t\t\tif negative {\n\t\t\t\tvalue *= -1\n\t\t\t}\n\t\t\treturn toValue_float64(value)\n\t\t}\n\terror:\n\t\treturn NaNValue()\n\t}\n\tif negative {\n\t\tvalue *= -1\n\t}\n\n\treturn toValue_int64(value)\n}\n\nvar parseFloat_matchBadSpecial = regexp.MustCompile(`[\\+\\-]?(?:[Ii]nf$|infinity)`)\nvar parseFloat_matchValid = regexp.MustCompile(`[0-9eE\\+\\-\\.]|Infinity`)\n\nfunc builtinGlobal_parseFloat(call FunctionCall) Value {\n\t// Caveat emptor: This implementation does NOT match the specification\n\tinput := strings.Trim(call.Argument(0).string(), builtinString_trim_whitespace)\n\n\tif parseFloat_matchBadSpecial.MatchString(input) {\n\t\treturn NaNValue()\n\t}\n\tvalue, err := strconv.ParseFloat(input, 64)\n\tif err != nil {\n\t\tfor end := len(input); end > 0; end-- {\n\t\t\tinput := input[0:end]\n\t\t\tif !parseFloat_matchValid.MatchString(input) {\n\t\t\t\treturn NaNValue()\n\t\t\t}\n\t\t\tvalue, err = strconv.ParseFloat(input, 64)\n\t\t\tif err == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif err != nil {\n\t\t\treturn NaNValue()\n\t\t}\n\t}\n\treturn toValue_float64(value)\n}\n\n// encodeURI/decodeURI\n\nfunc _builtinGlobal_encodeURI(call FunctionCall, escape *regexp.Regexp) Value {\n\tvalue := call.Argument(0)\n\tvar input []uint16\n\tswitch vl := value.value.(type) {\n\tcase []uint16:\n\t\tinput = vl\n\tdefault:\n\t\tinput = utf16.Encode([]rune(value.string()))\n\t}\n\tif len(input) == 0 {\n\t\treturn toValue_string(\"\")\n\t}\n\toutput := []byte{}\n\tlength := len(input)\n\tencode := make([]byte, 4)\n\tfor index := 0; index < length; {\n\t\tvalue := input[index]\n\t\tdecode := utf16.Decode(input[index : index+1])\n\t\tif value >= 0xDC00 && value <= 0xDFFF {\n\t\t\tpanic(call.runtime.panicURIError(\"URI malformed\"))\n\t\t}\n\t\tif value >= 0xD800 && value <= 0xDBFF {\n\t\t\tindex += 1\n\t\t\tif index >= length {\n\t\t\t\tpanic(call.runtime.panicURIError(\"URI malformed\"))\n\t\t\t}\n\t\t\t// input = ..., value, value1, ...\n\t\t\tvalue1 := input[index]\n\t\t\tif value1 < 0xDC00 || value1 > 0xDFFF {\n\t\t\t\tpanic(call.runtime.panicURIError(\"URI malformed\"))\n\t\t\t}\n\t\t\tdecode = []rune{((rune(value) - 0xD800) * 0x400) + (rune(value1) - 0xDC00) + 0x10000}\n\t\t}\n\t\tindex += 1\n\t\tsize := utf8.EncodeRune(encode, decode[0])\n\t\tencode := encode[0:size]\n\t\toutput = append(output, encode...)\n\t}\n\t{\n\t\tvalue := escape.ReplaceAllFunc(output, func(target []byte) []byte {\n\t\t\t// Probably a better way of doing this\n\t\t\tif target[0] == ' ' {\n\t\t\t\treturn []byte(\"%20\")\n\t\t\t}\n\t\t\treturn []byte(url.QueryEscape(string(target)))\n\t\t})\n\t\treturn toValue_string(string(value))\n\t}\n}\n\nvar encodeURI_Regexp = regexp.MustCompile(`([^~!@#$&*()=:/,;?+'])`)\n\nfunc builtinGlobal_encodeURI(call FunctionCall) Value {\n\treturn _builtinGlobal_encodeURI(call, encodeURI_Regexp)\n}\n\nvar encodeURIComponent_Regexp = regexp.MustCompile(`([^~!*()'])`)\n\nfunc builtinGlobal_encodeURIComponent(call FunctionCall) Value {\n\treturn _builtinGlobal_encodeURI(call, encodeURIComponent_Regexp)\n}\n\n// 3B/2F/3F/3A/40/26/3D/2B/24/2C/23\nvar decodeURI_guard = regexp.MustCompile(`(?i)(?:%)(3B|2F|3F|3A|40|26|3D|2B|24|2C|23)`)\n\nfunc _decodeURI(input string, reserve bool) (string, bool) {\n\tif reserve {\n\t\tinput = decodeURI_guard.ReplaceAllString(input, \"%25$1\")\n\t}\n\tinput = strings.Replace(input, \"+\", \"%2B\", -1) // Ugly hack to make QueryUnescape work with our use case\n\toutput, err := url.QueryUnescape(input)\n\tif err != nil || !utf8.ValidString(output) {\n\t\treturn \"\", true\n\t}\n\treturn output, false\n}\n\nfunc builtinGlobal_decodeURI(call FunctionCall) Value {\n\toutput, err := _decodeURI(call.Argument(0).string(), true)\n\tif err {\n\t\tpanic(call.runtime.panicURIError(\"URI malformed\"))\n\t}\n\treturn toValue_string(output)\n}\n\nfunc builtinGlobal_decodeURIComponent(call FunctionCall) Value {\n\toutput, err := _decodeURI(call.Argument(0).string(), false)\n\tif err {\n\t\tpanic(call.runtime.panicURIError(\"URI malformed\"))\n\t}\n\treturn toValue_string(output)\n}\n\n// escape/unescape\n\nfunc builtin_shouldEscape(chr byte) bool {\n\tif 'A' <= chr && chr <= 'Z' || 'a' <= chr && chr <= 'z' || '0' <= chr && chr <= '9' {\n\t\treturn false\n\t}\n\treturn !strings.ContainsRune(\"*_+-./\", rune(chr))\n}\n\nconst escapeBase16 = \"0123456789ABCDEF\"\n\nfunc builtin_escape(input string) string {\n\toutput := make([]byte, 0, len(input))\n\tlength := len(input)\n\tfor index := 0; index < length; {\n\t\tif builtin_shouldEscape(input[index]) {\n\t\t\tchr, width := utf8.DecodeRuneInString(input[index:])\n\t\t\tchr16 := utf16.Encode([]rune{chr})[0]\n\t\t\tif 256 > chr16 {\n\t\t\t\toutput = append(output, '%',\n\t\t\t\t\tescapeBase16[chr16>>4],\n\t\t\t\t\tescapeBase16[chr16&15],\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\toutput = append(output, '%', 'u',\n\t\t\t\t\tescapeBase16[chr16>>12],\n\t\t\t\t\tescapeBase16[(chr16>>8)&15],\n\t\t\t\t\tescapeBase16[(chr16>>4)&15],\n\t\t\t\t\tescapeBase16[chr16&15],\n\t\t\t\t)\n\t\t\t}\n\t\t\tindex += width\n\n\t\t} else {\n\t\t\toutput = append(output, input[index])\n\t\t\tindex += 1\n\t\t}\n\t}\n\treturn string(output)\n}\n\nfunc builtin_unescape(input string) string {\n\toutput := make([]rune, 0, len(input))\n\tlength := len(input)\n\tfor index := 0; index < length; {\n\t\tif input[index] == '%' {\n\t\t\tif index <= length-6 && input[index+1] == 'u' {\n\t\t\t\tbyte16, err := hex.DecodeString(input[index+2 : index+6])\n\t\t\t\tif err == nil {\n\t\t\t\t\tvalue := uint16(byte16[0])<<8 + uint16(byte16[1])\n\t\t\t\t\tchr := utf16.Decode([]uint16{value})[0]\n\t\t\t\t\toutput = append(output, chr)\n\t\t\t\t\tindex += 6\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tif index <= length-3 {\n\t\t\t\tbyte8, err := hex.DecodeString(input[index+1 : index+3])\n\t\t\t\tif err == nil {\n\t\t\t\t\tvalue := uint16(byte8[0])\n\t\t\t\t\tchr := utf16.Decode([]uint16{value})[0]\n\t\t\t\t\toutput = append(output, chr)\n\t\t\t\t\tindex += 3\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\toutput = append(output, rune(input[index]))\n\t\tindex += 1\n\t}\n\treturn string(output)\n}\n\nfunc builtinGlobal_escape(call FunctionCall) Value {\n\treturn toValue_string(builtin_escape(call.Argument(0).string()))\n}\n\nfunc builtinGlobal_unescape(call FunctionCall) Value {\n\treturn toValue_string(builtin_unescape(call.Argument(0).string()))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_array.go",
    "content": "package otto\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\n// Array\n\nfunc builtinArray(call FunctionCall) Value {\n\treturn toValue_object(builtinNewArrayNative(call.runtime, call.ArgumentList))\n}\n\nfunc builtinNewArray(self *_object, argumentList []Value) Value {\n\treturn toValue_object(builtinNewArrayNative(self.runtime, argumentList))\n}\n\nfunc builtinNewArrayNative(runtime *_runtime, argumentList []Value) *_object {\n\tif len(argumentList) == 1 {\n\t\tfirstArgument := argumentList[0]\n\t\tif firstArgument.IsNumber() {\n\t\t\treturn runtime.newArray(arrayUint32(runtime, firstArgument))\n\t\t}\n\t}\n\treturn runtime.newArrayOf(argumentList)\n}\n\nfunc builtinArray_toString(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tjoin := thisObject.get(\"join\")\n\tif join.isCallable() {\n\t\tjoin := join._object()\n\t\treturn join.call(call.This, call.ArgumentList, false, nativeFrame)\n\t}\n\treturn builtinObject_toString(call)\n}\n\nfunc builtinArray_toLocaleString(call FunctionCall) Value {\n\tseparator := \",\"\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\tif length == 0 {\n\t\treturn toValue_string(\"\")\n\t}\n\tstringList := make([]string, 0, length)\n\tfor index := int64(0); index < length; index += 1 {\n\t\tvalue := thisObject.get(arrayIndexToString(index))\n\t\tstringValue := \"\"\n\t\tswitch value.kind {\n\t\tcase valueEmpty, valueUndefined, valueNull:\n\t\tdefault:\n\t\t\tobject := call.runtime.toObject(value)\n\t\t\ttoLocaleString := object.get(\"toLocaleString\")\n\t\t\tif !toLocaleString.isCallable() {\n\t\t\t\tpanic(call.runtime.panicTypeError())\n\t\t\t}\n\t\t\tstringValue = toLocaleString.call(call.runtime, toValue_object(object)).string()\n\t\t}\n\t\tstringList = append(stringList, stringValue)\n\t}\n\treturn toValue_string(strings.Join(stringList, separator))\n}\n\nfunc builtinArray_concat(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tvalueArray := []Value{}\n\tsource := append([]Value{toValue_object(thisObject)}, call.ArgumentList...)\n\tfor _, item := range source {\n\t\tswitch item.kind {\n\t\tcase valueObject:\n\t\t\tobject := item._object()\n\t\t\tif isArray(object) {\n\t\t\t\tlength := object.get(\"length\").number().int64\n\t\t\t\tfor index := int64(0); index < length; index += 1 {\n\t\t\t\t\tname := strconv.FormatInt(index, 10)\n\t\t\t\t\tif object.hasProperty(name) {\n\t\t\t\t\t\tvalueArray = append(valueArray, object.get(name))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueArray = append(valueArray, Value{})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfallthrough\n\t\tdefault:\n\t\t\tvalueArray = append(valueArray, item)\n\t\t}\n\t}\n\treturn toValue_object(call.runtime.newArrayOf(valueArray))\n}\n\nfunc builtinArray_shift(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\tif 0 == length {\n\t\tthisObject.put(\"length\", toValue_int64(0), true)\n\t\treturn Value{}\n\t}\n\tfirst := thisObject.get(\"0\")\n\tfor index := int64(1); index < length; index++ {\n\t\tfrom := arrayIndexToString(index)\n\t\tto := arrayIndexToString(index - 1)\n\t\tif thisObject.hasProperty(from) {\n\t\t\tthisObject.put(to, thisObject.get(from), true)\n\t\t} else {\n\t\t\tthisObject.delete(to, true)\n\t\t}\n\t}\n\tthisObject.delete(arrayIndexToString(length-1), true)\n\tthisObject.put(\"length\", toValue_int64(length-1), true)\n\treturn first\n}\n\nfunc builtinArray_push(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\titemList := call.ArgumentList\n\tindex := int64(toUint32(thisObject.get(\"length\")))\n\tfor len(itemList) > 0 {\n\t\tthisObject.put(arrayIndexToString(index), itemList[0], true)\n\t\titemList = itemList[1:]\n\t\tindex += 1\n\t}\n\tlength := toValue_int64(index)\n\tthisObject.put(\"length\", length, true)\n\treturn length\n}\n\nfunc builtinArray_pop(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\tif 0 == length {\n\t\tthisObject.put(\"length\", toValue_uint32(0), true)\n\t\treturn Value{}\n\t}\n\tlast := thisObject.get(arrayIndexToString(length - 1))\n\tthisObject.delete(arrayIndexToString(length-1), true)\n\tthisObject.put(\"length\", toValue_int64(length-1), true)\n\treturn last\n}\n\nfunc builtinArray_join(call FunctionCall) Value {\n\tseparator := \",\"\n\t{\n\t\targument := call.Argument(0)\n\t\tif argument.IsDefined() {\n\t\t\tseparator = argument.string()\n\t\t}\n\t}\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\tif length == 0 {\n\t\treturn toValue_string(\"\")\n\t}\n\tstringList := make([]string, 0, length)\n\tfor index := int64(0); index < length; index += 1 {\n\t\tvalue := thisObject.get(arrayIndexToString(index))\n\t\tstringValue := \"\"\n\t\tswitch value.kind {\n\t\tcase valueEmpty, valueUndefined, valueNull:\n\t\tdefault:\n\t\t\tstringValue = value.string()\n\t\t}\n\t\tstringList = append(stringList, stringValue)\n\t}\n\treturn toValue_string(strings.Join(stringList, separator))\n}\n\nfunc builtinArray_splice(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\n\tstart := valueToRangeIndex(call.Argument(0), length, false)\n\tdeleteCount := valueToRangeIndex(call.Argument(1), int64(length)-start, true)\n\tvalueArray := make([]Value, deleteCount)\n\n\tfor index := int64(0); index < deleteCount; index++ {\n\t\tindexString := arrayIndexToString(int64(start + index))\n\t\tif thisObject.hasProperty(indexString) {\n\t\t\tvalueArray[index] = thisObject.get(indexString)\n\t\t}\n\t}\n\n\t// 0, <1, 2, 3, 4>, 5, 6, 7\n\t// a, b\n\t// length 8 - delete 4 @ start 1\n\n\titemList := []Value{}\n\titemCount := int64(len(call.ArgumentList))\n\tif itemCount > 2 {\n\t\titemCount -= 2 // Less the first two arguments\n\t\titemList = call.ArgumentList[2:]\n\t} else {\n\t\titemCount = 0\n\t}\n\tif itemCount < deleteCount {\n\t\t// The Object/Array is shrinking\n\t\tstop := int64(length) - deleteCount\n\t\t// The new length of the Object/Array before\n\t\t// appending the itemList remainder\n\t\t// Stopping at the lower bound of the insertion:\n\t\t// Move an item from the after the deleted portion\n\t\t// to a position after the inserted portion\n\t\tfor index := start; index < stop; index++ {\n\t\t\tfrom := arrayIndexToString(index + deleteCount) // Position just after deletion\n\t\t\tto := arrayIndexToString(index + itemCount)     // Position just after splice (insertion)\n\t\t\tif thisObject.hasProperty(from) {\n\t\t\t\tthisObject.put(to, thisObject.get(from), true)\n\t\t\t} else {\n\t\t\t\tthisObject.delete(to, true)\n\t\t\t}\n\t\t}\n\t\t// Delete off the end\n\t\t// We don't bother to delete below <stop + itemCount> (if any) since those\n\t\t// will be overwritten anyway\n\t\tfor index := int64(length); index > (stop + itemCount); index-- {\n\t\t\tthisObject.delete(arrayIndexToString(index-1), true)\n\t\t}\n\t} else if itemCount > deleteCount {\n\t\t// The Object/Array is growing\n\t\t// The itemCount is greater than the deleteCount, so we do\n\t\t// not have to worry about overwriting what we should be moving\n\t\t// ---\n\t\t// Starting from the upper bound of the deletion:\n\t\t// Move an item from the after the deleted portion\n\t\t// to a position after the inserted portion\n\t\tfor index := int64(length) - deleteCount; index > start; index-- {\n\t\t\tfrom := arrayIndexToString(index + deleteCount - 1)\n\t\t\tto := arrayIndexToString(index + itemCount - 1)\n\t\t\tif thisObject.hasProperty(from) {\n\t\t\t\tthisObject.put(to, thisObject.get(from), true)\n\t\t\t} else {\n\t\t\t\tthisObject.delete(to, true)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor index := int64(0); index < itemCount; index++ {\n\t\tthisObject.put(arrayIndexToString(index+start), itemList[index], true)\n\t}\n\tthisObject.put(\"length\", toValue_int64(int64(length)+itemCount-deleteCount), true)\n\n\treturn toValue_object(call.runtime.newArrayOf(valueArray))\n}\n\nfunc builtinArray_slice(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\tstart, end := rangeStartEnd(call.ArgumentList, length, false)\n\n\tif start >= end {\n\t\t// Always an empty array\n\t\treturn toValue_object(call.runtime.newArray(0))\n\t}\n\tsliceLength := end - start\n\tsliceValueArray := make([]Value, sliceLength)\n\n\tfor index := int64(0); index < sliceLength; index++ {\n\t\tfrom := arrayIndexToString(index + start)\n\t\tif thisObject.hasProperty(from) {\n\t\t\tsliceValueArray[index] = thisObject.get(from)\n\t\t}\n\t}\n\n\treturn toValue_object(call.runtime.newArrayOf(sliceValueArray))\n}\n\nfunc builtinArray_unshift(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\titemList := call.ArgumentList\n\titemCount := int64(len(itemList))\n\n\tfor index := length; index > 0; index-- {\n\t\tfrom := arrayIndexToString(index - 1)\n\t\tto := arrayIndexToString(index + itemCount - 1)\n\t\tif thisObject.hasProperty(from) {\n\t\t\tthisObject.put(to, thisObject.get(from), true)\n\t\t} else {\n\t\t\tthisObject.delete(to, true)\n\t\t}\n\t}\n\n\tfor index := int64(0); index < itemCount; index++ {\n\t\tthisObject.put(arrayIndexToString(index), itemList[index], true)\n\t}\n\n\tnewLength := toValue_int64(length + itemCount)\n\tthisObject.put(\"length\", newLength, true)\n\treturn newLength\n}\n\nfunc builtinArray_reverse(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\n\tlower := struct {\n\t\tname   string\n\t\tindex  int64\n\t\texists bool\n\t}{}\n\tupper := lower\n\n\tlower.index = 0\n\tmiddle := length / 2 // Division will floor\n\n\tfor lower.index != middle {\n\t\tlower.name = arrayIndexToString(lower.index)\n\t\tupper.index = length - lower.index - 1\n\t\tupper.name = arrayIndexToString(upper.index)\n\n\t\tlower.exists = thisObject.hasProperty(lower.name)\n\t\tupper.exists = thisObject.hasProperty(upper.name)\n\n\t\tif lower.exists && upper.exists {\n\t\t\tlowerValue := thisObject.get(lower.name)\n\t\t\tupperValue := thisObject.get(upper.name)\n\t\t\tthisObject.put(lower.name, upperValue, true)\n\t\t\tthisObject.put(upper.name, lowerValue, true)\n\t\t} else if !lower.exists && upper.exists {\n\t\t\tvalue := thisObject.get(upper.name)\n\t\t\tthisObject.delete(upper.name, true)\n\t\t\tthisObject.put(lower.name, value, true)\n\t\t} else if lower.exists && !upper.exists {\n\t\t\tvalue := thisObject.get(lower.name)\n\t\t\tthisObject.delete(lower.name, true)\n\t\t\tthisObject.put(upper.name, value, true)\n\t\t} else {\n\t\t\t// Nothing happens.\n\t\t}\n\n\t\tlower.index += 1\n\t}\n\n\treturn call.This\n}\n\nfunc sortCompare(thisObject *_object, index0, index1 uint, compare *_object) int {\n\tj := struct {\n\t\tname    string\n\t\texists  bool\n\t\tdefined bool\n\t\tvalue   string\n\t}{}\n\tk := j\n\tj.name = arrayIndexToString(int64(index0))\n\tj.exists = thisObject.hasProperty(j.name)\n\tk.name = arrayIndexToString(int64(index1))\n\tk.exists = thisObject.hasProperty(k.name)\n\n\tif !j.exists && !k.exists {\n\t\treturn 0\n\t} else if !j.exists {\n\t\treturn 1\n\t} else if !k.exists {\n\t\treturn -1\n\t}\n\n\tx := thisObject.get(j.name)\n\ty := thisObject.get(k.name)\n\tj.defined = x.IsDefined()\n\tk.defined = y.IsDefined()\n\n\tif !j.defined && !k.defined {\n\t\treturn 0\n\t} else if !j.defined {\n\t\treturn 1\n\t} else if !k.defined {\n\t\treturn -1\n\t}\n\n\tif compare == nil {\n\t\tj.value = x.string()\n\t\tk.value = y.string()\n\n\t\tif j.value == k.value {\n\t\t\treturn 0\n\t\t} else if j.value < k.value {\n\t\t\treturn -1\n\t\t}\n\n\t\treturn 1\n\t}\n\n\treturn int(toInt32(compare.call(Value{}, []Value{x, y}, false, nativeFrame)))\n}\n\nfunc arraySortSwap(thisObject *_object, index0, index1 uint) {\n\n\tj := struct {\n\t\tname   string\n\t\texists bool\n\t}{}\n\tk := j\n\n\tj.name = arrayIndexToString(int64(index0))\n\tj.exists = thisObject.hasProperty(j.name)\n\tk.name = arrayIndexToString(int64(index1))\n\tk.exists = thisObject.hasProperty(k.name)\n\n\tif j.exists && k.exists {\n\t\tjValue := thisObject.get(j.name)\n\t\tkValue := thisObject.get(k.name)\n\t\tthisObject.put(j.name, kValue, true)\n\t\tthisObject.put(k.name, jValue, true)\n\t} else if !j.exists && k.exists {\n\t\tvalue := thisObject.get(k.name)\n\t\tthisObject.delete(k.name, true)\n\t\tthisObject.put(j.name, value, true)\n\t} else if j.exists && !k.exists {\n\t\tvalue := thisObject.get(j.name)\n\t\tthisObject.delete(j.name, true)\n\t\tthisObject.put(k.name, value, true)\n\t} else {\n\t\t// Nothing happens.\n\t}\n}\n\nfunc arraySortQuickPartition(thisObject *_object, left, right, pivot uint, compare *_object) (uint, uint) {\n\tarraySortSwap(thisObject, pivot, right) // Right is now the pivot value\n\tcursor := left\n\tcursor2 := left\n\tfor index := left; index < right; index++ {\n\t\tcomparison := sortCompare(thisObject, index, right, compare) // Compare to the pivot value\n\t\tif comparison < 0 {\n\t\t\tarraySortSwap(thisObject, index, cursor)\n\t\t\tif cursor < cursor2 {\n\t\t\t\tarraySortSwap(thisObject, index, cursor2)\n\t\t\t}\n\t\t\tcursor += 1\n\t\t\tcursor2 += 1\n\t\t} else if comparison == 0 {\n\t\t\tarraySortSwap(thisObject, index, cursor2)\n\t\t\tcursor2 += 1\n\t\t}\n\t}\n\tarraySortSwap(thisObject, cursor2, right)\n\treturn cursor, cursor2\n}\n\nfunc arraySortQuickSort(thisObject *_object, left, right uint, compare *_object) {\n\tif left < right {\n\t\tmiddle := left + (right-left)/2\n\t\tpivot, pivot2 := arraySortQuickPartition(thisObject, left, right, middle, compare)\n\t\tif pivot > 0 {\n\t\t\tarraySortQuickSort(thisObject, left, pivot-1, compare)\n\t\t}\n\t\tarraySortQuickSort(thisObject, pivot2+1, right, compare)\n\t}\n}\n\nfunc builtinArray_sort(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tlength := uint(toUint32(thisObject.get(\"length\")))\n\tcompareValue := call.Argument(0)\n\tcompare := compareValue._object()\n\tif compareValue.IsUndefined() {\n\t} else if !compareValue.isCallable() {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\tif length > 1 {\n\t\tarraySortQuickSort(thisObject, 0, length-1, compare)\n\t}\n\treturn call.This\n}\n\nfunc builtinArray_isArray(call FunctionCall) Value {\n\treturn toValue_bool(isArray(call.Argument(0)._object()))\n}\n\nfunc builtinArray_indexOf(call FunctionCall) Value {\n\tthisObject, matchValue := call.thisObject(), call.Argument(0)\n\tif length := int64(toUint32(thisObject.get(\"length\"))); length > 0 {\n\t\tindex := int64(0)\n\t\tif len(call.ArgumentList) > 1 {\n\t\t\tindex = call.Argument(1).number().int64\n\t\t}\n\t\tif index < 0 {\n\t\t\tif index += length; index < 0 {\n\t\t\t\tindex = 0\n\t\t\t}\n\t\t} else if index >= length {\n\t\t\tindex = -1\n\t\t}\n\t\tfor ; index >= 0 && index < length; index++ {\n\t\t\tname := arrayIndexToString(int64(index))\n\t\t\tif !thisObject.hasProperty(name) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvalue := thisObject.get(name)\n\t\t\tif strictEqualityComparison(matchValue, value) {\n\t\t\t\treturn toValue_uint32(uint32(index))\n\t\t\t}\n\t\t}\n\t}\n\treturn toValue_int(-1)\n}\n\nfunc builtinArray_lastIndexOf(call FunctionCall) Value {\n\tthisObject, matchValue := call.thisObject(), call.Argument(0)\n\tlength := int64(toUint32(thisObject.get(\"length\")))\n\tindex := length - 1\n\tif len(call.ArgumentList) > 1 {\n\t\tindex = call.Argument(1).number().int64\n\t}\n\tif 0 > index {\n\t\tindex += length\n\t}\n\tif index > length {\n\t\tindex = length - 1\n\t} else if 0 > index {\n\t\treturn toValue_int(-1)\n\t}\n\tfor ; index >= 0; index-- {\n\t\tname := arrayIndexToString(int64(index))\n\t\tif !thisObject.hasProperty(name) {\n\t\t\tcontinue\n\t\t}\n\t\tvalue := thisObject.get(name)\n\t\tif strictEqualityComparison(matchValue, value) {\n\t\t\treturn toValue_uint32(uint32(index))\n\t\t}\n\t}\n\treturn toValue_int(-1)\n}\n\nfunc builtinArray_every(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tthis := toValue_object(thisObject)\n\tif iterator := call.Argument(0); iterator.isCallable() {\n\t\tlength := int64(toUint32(thisObject.get(\"length\")))\n\t\tcallThis := call.Argument(1)\n\t\tfor index := int64(0); index < length; index++ {\n\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\tif value := thisObject.get(key); iterator.call(call.runtime, callThis, value, toValue_int64(index), this).bool() {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn falseValue\n\t\t\t}\n\t\t}\n\t\treturn trueValue\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinArray_some(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tthis := toValue_object(thisObject)\n\tif iterator := call.Argument(0); iterator.isCallable() {\n\t\tlength := int64(toUint32(thisObject.get(\"length\")))\n\t\tcallThis := call.Argument(1)\n\t\tfor index := int64(0); index < length; index++ {\n\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\tif value := thisObject.get(key); iterator.call(call.runtime, callThis, value, toValue_int64(index), this).bool() {\n\t\t\t\t\treturn trueValue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn falseValue\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinArray_forEach(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tthis := toValue_object(thisObject)\n\tif iterator := call.Argument(0); iterator.isCallable() {\n\t\tlength := int64(toUint32(thisObject.get(\"length\")))\n\t\tcallThis := call.Argument(1)\n\t\tfor index := int64(0); index < length; index++ {\n\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\titerator.call(call.runtime, callThis, thisObject.get(key), toValue_int64(index), this)\n\t\t\t}\n\t\t}\n\t\treturn Value{}\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinArray_map(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tthis := toValue_object(thisObject)\n\tif iterator := call.Argument(0); iterator.isCallable() {\n\t\tlength := int64(toUint32(thisObject.get(\"length\")))\n\t\tcallThis := call.Argument(1)\n\t\tvalues := make([]Value, length)\n\t\tfor index := int64(0); index < length; index++ {\n\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\tvalues[index] = iterator.call(call.runtime, callThis, thisObject.get(key), index, this)\n\t\t\t} else {\n\t\t\t\tvalues[index] = Value{}\n\t\t\t}\n\t\t}\n\t\treturn toValue_object(call.runtime.newArrayOf(values))\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinArray_filter(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tthis := toValue_object(thisObject)\n\tif iterator := call.Argument(0); iterator.isCallable() {\n\t\tlength := int64(toUint32(thisObject.get(\"length\")))\n\t\tcallThis := call.Argument(1)\n\t\tvalues := make([]Value, 0)\n\t\tfor index := int64(0); index < length; index++ {\n\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\tvalue := thisObject.get(key)\n\t\t\t\tif iterator.call(call.runtime, callThis, value, index, this).bool() {\n\t\t\t\t\tvalues = append(values, value)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn toValue_object(call.runtime.newArrayOf(values))\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinArray_reduce(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tthis := toValue_object(thisObject)\n\tif iterator := call.Argument(0); iterator.isCallable() {\n\t\tinitial := len(call.ArgumentList) > 1\n\t\tstart := call.Argument(1)\n\t\tlength := int64(toUint32(thisObject.get(\"length\")))\n\t\tindex := int64(0)\n\t\tif length > 0 || initial {\n\t\t\tvar accumulator Value\n\t\t\tif !initial {\n\t\t\t\tfor ; index < length; index++ {\n\t\t\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\t\t\taccumulator = thisObject.get(key)\n\t\t\t\t\t\tindex++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taccumulator = start\n\t\t\t}\n\t\t\tfor ; index < length; index++ {\n\t\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\t\taccumulator = iterator.call(call.runtime, Value{}, accumulator, thisObject.get(key), key, this)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn accumulator\n\t\t}\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinArray_reduceRight(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tthis := toValue_object(thisObject)\n\tif iterator := call.Argument(0); iterator.isCallable() {\n\t\tinitial := len(call.ArgumentList) > 1\n\t\tstart := call.Argument(1)\n\t\tlength := int64(toUint32(thisObject.get(\"length\")))\n\t\tif length > 0 || initial {\n\t\t\tindex := length - 1\n\t\t\tvar accumulator Value\n\t\t\tif !initial {\n\t\t\t\tfor ; index >= 0; index-- {\n\t\t\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\t\t\taccumulator = thisObject.get(key)\n\t\t\t\t\t\tindex--\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taccumulator = start\n\t\t\t}\n\t\t\tfor ; index >= 0; index-- {\n\t\t\t\tif key := arrayIndexToString(index); thisObject.hasProperty(key) {\n\t\t\t\t\taccumulator = iterator.call(call.runtime, Value{}, accumulator, thisObject.get(key), key, this)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn accumulator\n\t\t}\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_boolean.go",
    "content": "package otto\n\n// Boolean\n\nfunc builtinBoolean(call FunctionCall) Value {\n\treturn toValue_bool(call.Argument(0).bool())\n}\n\nfunc builtinNewBoolean(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newBoolean(valueOfArrayIndex(argumentList, 0)))\n}\n\nfunc builtinBoolean_toString(call FunctionCall) Value {\n\tvalue := call.This\n\tif !value.IsBoolean() {\n\t\t// Will throw a TypeError if ThisObject is not a Boolean\n\t\tvalue = call.thisClassObject(\"Boolean\").primitiveValue()\n\t}\n\treturn toValue_string(value.string())\n}\n\nfunc builtinBoolean_valueOf(call FunctionCall) Value {\n\tvalue := call.This\n\tif !value.IsBoolean() {\n\t\tvalue = call.thisClassObject(\"Boolean\").primitiveValue()\n\t}\n\treturn value\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_date.go",
    "content": "package otto\n\nimport (\n\t\"math\"\n\tTime \"time\"\n)\n\n// Date\n\nconst (\n\t// TODO Be like V8?\n\t// builtinDate_goDateTimeLayout = \"Mon Jan 2 2006 15:04:05 GMT-0700 (MST)\"\n\tbuiltinDate_goDateTimeLayout = Time.RFC1123 // \"Mon, 02 Jan 2006 15:04:05 MST\"\n\tbuiltinDate_goDateLayout     = \"Mon, 02 Jan 2006\"\n\tbuiltinDate_goTimeLayout     = \"15:04:05 MST\"\n)\n\nfunc builtinDate(call FunctionCall) Value {\n\tdate := &_dateObject{}\n\tdate.Set(newDateTime([]Value{}, Time.Local))\n\treturn toValue_string(date.Time().Format(builtinDate_goDateTimeLayout))\n}\n\nfunc builtinNewDate(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newDate(newDateTime(argumentList, Time.Local)))\n}\n\nfunc builtinDate_toString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Local().Format(builtinDate_goDateTimeLayout))\n}\n\nfunc builtinDate_toDateString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Local().Format(builtinDate_goDateLayout))\n}\n\nfunc builtinDate_toTimeString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Local().Format(builtinDate_goTimeLayout))\n}\n\nfunc builtinDate_toUTCString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Format(builtinDate_goDateTimeLayout))\n}\n\nfunc builtinDate_toISOString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Format(\"2006-01-02T15:04:05.000Z\"))\n}\n\nfunc builtinDate_toJSON(call FunctionCall) Value {\n\tobject := call.thisObject()\n\tvalue := object.DefaultValue(defaultValueHintNumber) // FIXME object.primitiveNumberValue\n\t{                                                    // FIXME value.isFinite\n\t\tvalue := value.float64()\n\t\tif math.IsNaN(value) || math.IsInf(value, 0) {\n\t\t\treturn nullValue\n\t\t}\n\t}\n\ttoISOString := object.get(\"toISOString\")\n\tif !toISOString.isCallable() {\n\t\t// FIXME\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\treturn toISOString.call(call.runtime, toValue_object(object), []Value{})\n}\n\nfunc builtinDate_toGMTString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Format(\"Mon, 02 Jan 2006 15:04:05 GMT\"))\n}\n\nfunc builtinDate_getTime(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\t// We do this (convert away from a float) so the user\n\t// does not get something back in exponential notation\n\treturn toValue_int64(int64(date.Epoch()))\n}\n\nfunc builtinDate_setTime(call FunctionCall) Value {\n\tobject := call.thisObject()\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tdate.Set(call.Argument(0).float64())\n\tobject.value = date\n\treturn date.Value()\n}\n\nfunc _builtinDate_beforeSet(call FunctionCall, argumentLimit int, timeLocal bool) (*_object, *_dateObject, *_ecmaTime, []int) {\n\tobject := call.thisObject()\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn nil, nil, nil, nil\n\t}\n\n\tif argumentLimit > len(call.ArgumentList) {\n\t\targumentLimit = len(call.ArgumentList)\n\t}\n\n\tif argumentLimit == 0 {\n\t\tobject.value = invalidDateObject\n\t\treturn nil, nil, nil, nil\n\t}\n\n\tvalueList := make([]int, argumentLimit)\n\tfor index := 0; index < argumentLimit; index++ {\n\t\tvalue := call.ArgumentList[index]\n\t\tnm := value.number()\n\t\tswitch nm.kind {\n\t\tcase numberInteger, numberFloat:\n\t\tdefault:\n\t\t\tobject.value = invalidDateObject\n\t\t\treturn nil, nil, nil, nil\n\t\t}\n\t\tvalueList[index] = int(nm.int64)\n\t}\n\tbaseTime := date.Time()\n\tif timeLocal {\n\t\tbaseTime = baseTime.Local()\n\t}\n\tecmaTime := ecmaTime(baseTime)\n\treturn object, &date, &ecmaTime, valueList\n}\n\nfunc builtinDate_parse(call FunctionCall) Value {\n\tdate := call.Argument(0).string()\n\treturn toValue_float64(dateParse(date))\n}\n\nfunc builtinDate_UTC(call FunctionCall) Value {\n\treturn toValue_float64(newDateTime(call.ArgumentList, Time.UTC))\n}\n\nfunc builtinDate_now(call FunctionCall) Value {\n\tcall.ArgumentList = []Value(nil)\n\treturn builtinDate_UTC(call)\n}\n\n// This is a placeholder\nfunc builtinDate_toLocaleString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Local().Format(\"2006-01-02 15:04:05\"))\n}\n\n// This is a placeholder\nfunc builtinDate_toLocaleDateString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Local().Format(\"2006-01-02\"))\n}\n\n// This is a placeholder\nfunc builtinDate_toLocaleTimeString(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn toValue_string(\"Invalid Date\")\n\t}\n\treturn toValue_string(date.Time().Local().Format(\"15:04:05\"))\n}\n\nfunc builtinDate_valueOf(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn date.Value()\n}\n\nfunc builtinDate_getYear(call FunctionCall) Value {\n\t// Will throw a TypeError is ThisObject is nil or\n\t// does not have Class of \"Date\"\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Local().Year() - 1900)\n}\n\nfunc builtinDate_getFullYear(call FunctionCall) Value {\n\t// Will throw a TypeError is ThisObject is nil or\n\t// does not have Class of \"Date\"\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Local().Year())\n}\n\nfunc builtinDate_getUTCFullYear(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Year())\n}\n\nfunc builtinDate_getMonth(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(dateFromGoMonth(date.Time().Local().Month()))\n}\n\nfunc builtinDate_getUTCMonth(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(dateFromGoMonth(date.Time().Month()))\n}\n\nfunc builtinDate_getDate(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Local().Day())\n}\n\nfunc builtinDate_getUTCDate(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Day())\n}\n\nfunc builtinDate_getDay(call FunctionCall) Value {\n\t// Actually day of the week\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(dateFromGoDay(date.Time().Local().Weekday()))\n}\n\nfunc builtinDate_getUTCDay(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(dateFromGoDay(date.Time().Weekday()))\n}\n\nfunc builtinDate_getHours(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Local().Hour())\n}\n\nfunc builtinDate_getUTCHours(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Hour())\n}\n\nfunc builtinDate_getMinutes(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Local().Minute())\n}\n\nfunc builtinDate_getUTCMinutes(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Minute())\n}\n\nfunc builtinDate_getSeconds(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Local().Second())\n}\n\nfunc builtinDate_getUTCSeconds(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Second())\n}\n\nfunc builtinDate_getMilliseconds(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Local().Nanosecond() / (100 * 100 * 100))\n}\n\nfunc builtinDate_getUTCMilliseconds(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_int(date.Time().Nanosecond() / (100 * 100 * 100))\n}\n\nfunc builtinDate_getTimezoneOffset(call FunctionCall) Value {\n\tdate := dateObjectOf(call.runtime, call.thisObject())\n\tif date.isNaN {\n\t\treturn NaNValue()\n\t}\n\ttimeLocal := date.Time().Local()\n\t// Is this kosher?\n\ttimeLocalAsUTC := Time.Date(\n\t\ttimeLocal.Year(),\n\t\ttimeLocal.Month(),\n\t\ttimeLocal.Day(),\n\t\ttimeLocal.Hour(),\n\t\ttimeLocal.Minute(),\n\t\ttimeLocal.Second(),\n\t\ttimeLocal.Nanosecond(),\n\t\tTime.UTC,\n\t)\n\treturn toValue_float64(date.Time().Sub(timeLocalAsUTC).Seconds() / 60)\n}\n\nfunc builtinDate_setMilliseconds(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tecmaTime.millisecond = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setUTCMilliseconds(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, false)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tecmaTime.millisecond = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setSeconds(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 1 {\n\t\tecmaTime.millisecond = value[1]\n\t}\n\tecmaTime.second = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setUTCSeconds(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, false)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 1 {\n\t\tecmaTime.millisecond = value[1]\n\t}\n\tecmaTime.second = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setMinutes(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 2 {\n\t\tecmaTime.millisecond = value[2]\n\t\tecmaTime.second = value[1]\n\t} else if len(value) > 1 {\n\t\tecmaTime.second = value[1]\n\t}\n\tecmaTime.minute = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setUTCMinutes(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, false)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 2 {\n\t\tecmaTime.millisecond = value[2]\n\t\tecmaTime.second = value[1]\n\t} else if len(value) > 1 {\n\t\tecmaTime.second = value[1]\n\t}\n\tecmaTime.minute = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setHours(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 4, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 3 {\n\t\tecmaTime.millisecond = value[3]\n\t\tecmaTime.second = value[2]\n\t\tecmaTime.minute = value[1]\n\t} else if len(value) > 2 {\n\t\tecmaTime.second = value[2]\n\t\tecmaTime.minute = value[1]\n\t} else if len(value) > 1 {\n\t\tecmaTime.minute = value[1]\n\t}\n\tecmaTime.hour = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setUTCHours(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 4, false)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 3 {\n\t\tecmaTime.millisecond = value[3]\n\t\tecmaTime.second = value[2]\n\t\tecmaTime.minute = value[1]\n\t} else if len(value) > 2 {\n\t\tecmaTime.second = value[2]\n\t\tecmaTime.minute = value[1]\n\t} else if len(value) > 1 {\n\t\tecmaTime.minute = value[1]\n\t}\n\tecmaTime.hour = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setDate(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tecmaTime.day = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setUTCDate(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, false)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tecmaTime.day = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setMonth(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 1 {\n\t\tecmaTime.day = value[1]\n\t}\n\tecmaTime.month = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setUTCMonth(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, false)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 1 {\n\t\tecmaTime.day = value[1]\n\t}\n\tecmaTime.month = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setYear(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tyear := value[0]\n\tif 0 <= year && year <= 99 {\n\t\tyear += 1900\n\t}\n\tecmaTime.year = year\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setFullYear(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, true)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 2 {\n\t\tecmaTime.day = value[2]\n\t\tecmaTime.month = value[1]\n\t} else if len(value) > 1 {\n\t\tecmaTime.month = value[1]\n\t}\n\tecmaTime.year = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\nfunc builtinDate_setUTCFullYear(call FunctionCall) Value {\n\tobject, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, false)\n\tif ecmaTime == nil {\n\t\treturn NaNValue()\n\t}\n\n\tif len(value) > 2 {\n\t\tecmaTime.day = value[2]\n\t\tecmaTime.month = value[1]\n\t} else if len(value) > 1 {\n\t\tecmaTime.month = value[1]\n\t}\n\tecmaTime.year = value[0]\n\n\tdate.SetTime(ecmaTime.goTime())\n\tobject.value = *date\n\treturn date.Value()\n}\n\n// toUTCString\n// toISOString\n// toJSONString\n// toJSON\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_error.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n)\n\nfunc builtinError(call FunctionCall) Value {\n\treturn toValue_object(call.runtime.newError(\"Error\", call.Argument(0), 1))\n}\n\nfunc builtinNewError(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newError(\"Error\", valueOfArrayIndex(argumentList, 0), 0))\n}\n\nfunc builtinError_toString(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tif thisObject == nil {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\n\tname := \"Error\"\n\tnameValue := thisObject.get(\"name\")\n\tif nameValue.IsDefined() {\n\t\tname = nameValue.string()\n\t}\n\n\tmessage := \"\"\n\tmessageValue := thisObject.get(\"message\")\n\tif messageValue.IsDefined() {\n\t\tmessage = messageValue.string()\n\t}\n\n\tif len(name) == 0 {\n\t\treturn toValue_string(message)\n\t}\n\n\tif len(message) == 0 {\n\t\treturn toValue_string(name)\n\t}\n\n\treturn toValue_string(fmt.Sprintf(\"%s: %s\", name, message))\n}\n\nfunc (runtime *_runtime) newEvalError(message Value) *_object {\n\tself := runtime.newErrorObject(\"EvalError\", message, 0)\n\tself.prototype = runtime.global.EvalErrorPrototype\n\treturn self\n}\n\nfunc builtinEvalError(call FunctionCall) Value {\n\treturn toValue_object(call.runtime.newEvalError(call.Argument(0)))\n}\n\nfunc builtinNewEvalError(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newEvalError(valueOfArrayIndex(argumentList, 0)))\n}\n\nfunc (runtime *_runtime) newTypeError(message Value) *_object {\n\tself := runtime.newErrorObject(\"TypeError\", message, 0)\n\tself.prototype = runtime.global.TypeErrorPrototype\n\treturn self\n}\n\nfunc builtinTypeError(call FunctionCall) Value {\n\treturn toValue_object(call.runtime.newTypeError(call.Argument(0)))\n}\n\nfunc builtinNewTypeError(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newTypeError(valueOfArrayIndex(argumentList, 0)))\n}\n\nfunc (runtime *_runtime) newRangeError(message Value) *_object {\n\tself := runtime.newErrorObject(\"RangeError\", message, 0)\n\tself.prototype = runtime.global.RangeErrorPrototype\n\treturn self\n}\n\nfunc builtinRangeError(call FunctionCall) Value {\n\treturn toValue_object(call.runtime.newRangeError(call.Argument(0)))\n}\n\nfunc builtinNewRangeError(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newRangeError(valueOfArrayIndex(argumentList, 0)))\n}\n\nfunc (runtime *_runtime) newURIError(message Value) *_object {\n\tself := runtime.newErrorObject(\"URIError\", message, 0)\n\tself.prototype = runtime.global.URIErrorPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newReferenceError(message Value) *_object {\n\tself := runtime.newErrorObject(\"ReferenceError\", message, 0)\n\tself.prototype = runtime.global.ReferenceErrorPrototype\n\treturn self\n}\n\nfunc builtinReferenceError(call FunctionCall) Value {\n\treturn toValue_object(call.runtime.newReferenceError(call.Argument(0)))\n}\n\nfunc builtinNewReferenceError(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newReferenceError(valueOfArrayIndex(argumentList, 0)))\n}\n\nfunc (runtime *_runtime) newSyntaxError(message Value) *_object {\n\tself := runtime.newErrorObject(\"SyntaxError\", message, 0)\n\tself.prototype = runtime.global.SyntaxErrorPrototype\n\treturn self\n}\n\nfunc builtinSyntaxError(call FunctionCall) Value {\n\treturn toValue_object(call.runtime.newSyntaxError(call.Argument(0)))\n}\n\nfunc builtinNewSyntaxError(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newSyntaxError(valueOfArrayIndex(argumentList, 0)))\n}\n\nfunc builtinURIError(call FunctionCall) Value {\n\treturn toValue_object(call.runtime.newURIError(call.Argument(0)))\n}\n\nfunc builtinNewURIError(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newURIError(valueOfArrayIndex(argumentList, 0)))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_function.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"strings\"\n\t\"unicode\"\n\n\t\"github.com/robertkrimen/otto/parser\"\n)\n\n// Function\n\nfunc builtinFunction(call FunctionCall) Value {\n\treturn toValue_object(builtinNewFunctionNative(call.runtime, call.ArgumentList))\n}\n\nfunc builtinNewFunction(self *_object, argumentList []Value) Value {\n\treturn toValue_object(builtinNewFunctionNative(self.runtime, argumentList))\n}\n\nfunc argumentList2parameterList(argumentList []Value) []string {\n\tparameterList := make([]string, 0, len(argumentList))\n\tfor _, value := range argumentList {\n\t\ttmp := strings.FieldsFunc(value.string(), func(chr rune) bool {\n\t\t\treturn chr == ',' || unicode.IsSpace(chr)\n\t\t})\n\t\tparameterList = append(parameterList, tmp...)\n\t}\n\treturn parameterList\n}\n\nvar matchIdentifier = regexp.MustCompile(`^[$_\\p{L}][$_\\p{L}\\d}]*$`)\n\nfunc builtinNewFunctionNative(runtime *_runtime, argumentList []Value) *_object {\n\tvar parameterList, body string\n\tcount := len(argumentList)\n\tif count > 0 {\n\t\ttmp := make([]string, 0, count-1)\n\t\tfor _, value := range argumentList[0 : count-1] {\n\t\t\ttmp = append(tmp, value.string())\n\t\t}\n\t\tparameterList = strings.Join(tmp, \",\")\n\t\tbody = argumentList[count-1].string()\n\t}\n\n\t// FIXME\n\tfunction, err := parser.ParseFunction(parameterList, body)\n\truntime.parseThrow(err) // Will panic/throw appropriately\n\tcmpl := _compiler{}\n\tcmpl_function := cmpl.parseExpression(function)\n\n\treturn runtime.newNodeFunction(cmpl_function.(*_nodeFunctionLiteral), runtime.globalStash)\n}\n\nfunc builtinFunction_toString(call FunctionCall) Value {\n\tobject := call.thisClassObject(\"Function\") // Should throw a TypeError unless Function\n\tswitch fn := object.value.(type) {\n\tcase _nativeFunctionObject:\n\t\treturn toValue_string(fmt.Sprintf(\"function %s() { [native code] }\", fn.name))\n\tcase _nodeFunctionObject:\n\t\treturn toValue_string(fn.node.source)\n\tcase _bindFunctionObject:\n\t\treturn toValue_string(\"function () { [native code] }\")\n\t}\n\n\tpanic(call.runtime.panicTypeError(\"Function.toString()\"))\n}\n\nfunc builtinFunction_apply(call FunctionCall) Value {\n\tif !call.This.isCallable() {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\tthis := call.Argument(0)\n\tif this.IsUndefined() {\n\t\t// FIXME Not ECMA5\n\t\tthis = toValue_object(call.runtime.globalObject)\n\t}\n\targumentList := call.Argument(1)\n\tswitch argumentList.kind {\n\tcase valueUndefined, valueNull:\n\t\treturn call.thisObject().call(this, nil, false, nativeFrame)\n\tcase valueObject:\n\tdefault:\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\n\tarrayObject := argumentList._object()\n\tthisObject := call.thisObject()\n\tlength := int64(toUint32(arrayObject.get(\"length\")))\n\tvalueArray := make([]Value, length)\n\tfor index := int64(0); index < length; index++ {\n\t\tvalueArray[index] = arrayObject.get(arrayIndexToString(index))\n\t}\n\treturn thisObject.call(this, valueArray, false, nativeFrame)\n}\n\nfunc builtinFunction_call(call FunctionCall) Value {\n\tif !call.This.isCallable() {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\tthisObject := call.thisObject()\n\tthis := call.Argument(0)\n\tif this.IsUndefined() {\n\t\t// FIXME Not ECMA5\n\t\tthis = toValue_object(call.runtime.globalObject)\n\t}\n\tif len(call.ArgumentList) >= 1 {\n\t\treturn thisObject.call(this, call.ArgumentList[1:], false, nativeFrame)\n\t}\n\treturn thisObject.call(this, nil, false, nativeFrame)\n}\n\nfunc builtinFunction_bind(call FunctionCall) Value {\n\ttarget := call.This\n\tif !target.isCallable() {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\ttargetObject := target._object()\n\n\tthis := call.Argument(0)\n\targumentList := call.slice(1)\n\tif this.IsUndefined() {\n\t\t// FIXME Do this elsewhere?\n\t\tthis = toValue_object(call.runtime.globalObject)\n\t}\n\n\treturn toValue_object(call.runtime.newBoundFunction(targetObject, this, argumentList))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_json.go",
    "content": "package otto\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype _builtinJSON_parseContext struct {\n\tcall    FunctionCall\n\treviver Value\n}\n\nfunc builtinJSON_parse(call FunctionCall) Value {\n\tctx := _builtinJSON_parseContext{\n\t\tcall: call,\n\t}\n\trevive := false\n\tif reviver := call.Argument(1); reviver.isCallable() {\n\t\trevive = true\n\t\tctx.reviver = reviver\n\t}\n\n\tvar root interface{}\n\terr := json.Unmarshal([]byte(call.Argument(0).string()), &root)\n\tif err != nil {\n\t\tpanic(call.runtime.panicSyntaxError(err.Error()))\n\t}\n\tvalue, exists := builtinJSON_parseWalk(ctx, root)\n\tif !exists {\n\t\tvalue = Value{}\n\t}\n\tif revive {\n\t\troot := ctx.call.runtime.newObject()\n\t\troot.put(\"\", value, false)\n\t\treturn builtinJSON_reviveWalk(ctx, root, \"\")\n\t}\n\treturn value\n}\n\nfunc builtinJSON_reviveWalk(ctx _builtinJSON_parseContext, holder *_object, name string) Value {\n\tvalue := holder.get(name)\n\tif object := value._object(); object != nil {\n\t\tif isArray(object) {\n\t\t\tlength := int64(objectLength(object))\n\t\t\tfor index := int64(0); index < length; index += 1 {\n\t\t\t\tname := arrayIndexToString(index)\n\t\t\t\tvalue := builtinJSON_reviveWalk(ctx, object, name)\n\t\t\t\tif value.IsUndefined() {\n\t\t\t\t\tobject.delete(name, false)\n\t\t\t\t} else {\n\t\t\t\t\tobject.defineProperty(name, value, 0111, false)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tobject.enumerate(false, func(name string) bool {\n\t\t\t\tvalue := builtinJSON_reviveWalk(ctx, object, name)\n\t\t\t\tif value.IsUndefined() {\n\t\t\t\t\tobject.delete(name, false)\n\t\t\t\t} else {\n\t\t\t\t\tobject.defineProperty(name, value, 0111, false)\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\t}\n\treturn ctx.reviver.call(ctx.call.runtime, toValue_object(holder), name, value)\n}\n\nfunc builtinJSON_parseWalk(ctx _builtinJSON_parseContext, rawValue interface{}) (Value, bool) {\n\tswitch value := rawValue.(type) {\n\tcase nil:\n\t\treturn nullValue, true\n\tcase bool:\n\t\treturn toValue_bool(value), true\n\tcase string:\n\t\treturn toValue_string(value), true\n\tcase float64:\n\t\treturn toValue_float64(value), true\n\tcase []interface{}:\n\t\tarrayValue := make([]Value, len(value))\n\t\tfor index, rawValue := range value {\n\t\t\tif value, exists := builtinJSON_parseWalk(ctx, rawValue); exists {\n\t\t\t\tarrayValue[index] = value\n\t\t\t}\n\t\t}\n\t\treturn toValue_object(ctx.call.runtime.newArrayOf(arrayValue)), true\n\tcase map[string]interface{}:\n\t\tobject := ctx.call.runtime.newObject()\n\t\tfor name, rawValue := range value {\n\t\t\tif value, exists := builtinJSON_parseWalk(ctx, rawValue); exists {\n\t\t\t\tobject.put(name, value, false)\n\t\t\t}\n\t\t}\n\t\treturn toValue_object(object), true\n\t}\n\treturn Value{}, false\n}\n\ntype _builtinJSON_stringifyContext struct {\n\tcall             FunctionCall\n\tstack            []*_object\n\tpropertyList     []string\n\treplacerFunction *Value\n\tgap              string\n}\n\nfunc builtinJSON_stringify(call FunctionCall) Value {\n\tctx := _builtinJSON_stringifyContext{\n\t\tcall:  call,\n\t\tstack: []*_object{nil},\n\t}\n\treplacer := call.Argument(1)._object()\n\tif replacer != nil {\n\t\tif isArray(replacer) {\n\t\t\tlength := objectLength(replacer)\n\t\t\tseen := map[string]bool{}\n\t\t\tpropertyList := make([]string, length)\n\t\t\tlength = 0\n\t\t\tfor index, _ := range propertyList {\n\t\t\t\tvalue := replacer.get(arrayIndexToString(int64(index)))\n\t\t\t\tswitch value.kind {\n\t\t\t\tcase valueObject:\n\t\t\t\t\tswitch value.value.(*_object).class {\n\t\t\t\t\tcase \"String\":\n\t\t\t\t\tcase \"Number\":\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\tcase valueString:\n\t\t\t\tcase valueNumber:\n\t\t\t\tdefault:\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tname := value.string()\n\t\t\t\tif seen[name] {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tseen[name] = true\n\t\t\t\tlength += 1\n\t\t\t\tpropertyList[index] = name\n\t\t\t}\n\t\t\tctx.propertyList = propertyList[0:length]\n\t\t} else if replacer.class == \"Function\" {\n\t\t\tvalue := toValue_object(replacer)\n\t\t\tctx.replacerFunction = &value\n\t\t}\n\t}\n\tif spaceValue, exists := call.getArgument(2); exists {\n\t\tif spaceValue.kind == valueObject {\n\t\t\tswitch spaceValue.value.(*_object).class {\n\t\t\tcase \"String\":\n\t\t\t\tspaceValue = toValue_string(spaceValue.string())\n\t\t\tcase \"Number\":\n\t\t\t\tspaceValue = spaceValue.numberValue()\n\t\t\t}\n\t\t}\n\t\tswitch spaceValue.kind {\n\t\tcase valueString:\n\t\t\tvalue := spaceValue.string()\n\t\t\tif len(value) > 10 {\n\t\t\t\tctx.gap = value[0:10]\n\t\t\t} else {\n\t\t\t\tctx.gap = value\n\t\t\t}\n\t\tcase valueNumber:\n\t\t\tvalue := spaceValue.number().int64\n\t\t\tif value > 10 {\n\t\t\t\tvalue = 10\n\t\t\t} else if value < 0 {\n\t\t\t\tvalue = 0\n\t\t\t}\n\t\t\tctx.gap = strings.Repeat(\" \", int(value))\n\t\t}\n\t}\n\tholder := call.runtime.newObject()\n\tholder.put(\"\", call.Argument(0), false)\n\tvalue, exists := builtinJSON_stringifyWalk(ctx, \"\", holder)\n\tif !exists {\n\t\treturn Value{}\n\t}\n\tvalueJSON, err := json.Marshal(value)\n\tif err != nil {\n\t\tpanic(call.runtime.panicTypeError(err.Error()))\n\t}\n\tif ctx.gap != \"\" {\n\t\tvalueJSON1 := bytes.Buffer{}\n\t\tjson.Indent(&valueJSON1, valueJSON, \"\", ctx.gap)\n\t\tvalueJSON = valueJSON1.Bytes()\n\t}\n\treturn toValue_string(string(valueJSON))\n}\n\nfunc builtinJSON_stringifyWalk(ctx _builtinJSON_stringifyContext, key string, holder *_object) (interface{}, bool) {\n\tvalue := holder.get(key)\n\n\tif value.IsObject() {\n\t\tobject := value._object()\n\t\tif toJSON := object.get(\"toJSON\"); toJSON.IsFunction() {\n\t\t\tvalue = toJSON.call(ctx.call.runtime, value, key)\n\t\t} else {\n\t\t\t// If the object is a GoStruct or something that implements json.Marshaler\n\t\t\tif object.objectClass.marshalJSON != nil {\n\t\t\t\tmarshaler := object.objectClass.marshalJSON(object)\n\t\t\t\tif marshaler != nil {\n\t\t\t\t\treturn marshaler, true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ctx.replacerFunction != nil {\n\t\tvalue = (*ctx.replacerFunction).call(ctx.call.runtime, toValue_object(holder), key, value)\n\t}\n\n\tif value.kind == valueObject {\n\t\tswitch value.value.(*_object).class {\n\t\tcase \"Boolean\":\n\t\t\tvalue = value._object().value.(Value)\n\t\tcase \"String\":\n\t\t\tvalue = toValue_string(value.string())\n\t\tcase \"Number\":\n\t\t\tvalue = value.numberValue()\n\t\t}\n\t}\n\n\tswitch value.kind {\n\tcase valueBoolean:\n\t\treturn value.bool(), true\n\tcase valueString:\n\t\treturn value.string(), true\n\tcase valueNumber:\n\t\tinteger := value.number()\n\t\tswitch integer.kind {\n\t\tcase numberInteger:\n\t\t\treturn integer.int64, true\n\t\tcase numberFloat:\n\t\t\treturn integer.float64, true\n\t\tdefault:\n\t\t\treturn nil, true\n\t\t}\n\tcase valueNull:\n\t\treturn nil, true\n\tcase valueObject:\n\t\tholder := value._object()\n\t\tif value := value._object(); nil != value {\n\t\t\tfor _, object := range ctx.stack {\n\t\t\t\tif holder == object {\n\t\t\t\t\tpanic(ctx.call.runtime.panicTypeError(\"Converting circular structure to JSON\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.stack = append(ctx.stack, value)\n\t\t\tdefer func() { ctx.stack = ctx.stack[:len(ctx.stack)-1] }()\n\t\t}\n\t\tif isArray(holder) {\n\t\t\tvar length uint32\n\t\t\tswitch value := holder.get(\"length\").value.(type) {\n\t\t\tcase uint32:\n\t\t\t\tlength = value\n\t\t\tcase int:\n\t\t\t\tif value >= 0 {\n\t\t\t\t\tlength = uint32(value)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpanic(ctx.call.runtime.panicTypeError(fmt.Sprintf(\"JSON.stringify: invalid length: %v (%[1]T)\", value)))\n\t\t\t}\n\t\t\tarray := make([]interface{}, length)\n\t\t\tfor index, _ := range array {\n\t\t\t\tname := arrayIndexToString(int64(index))\n\t\t\t\tvalue, _ := builtinJSON_stringifyWalk(ctx, name, holder)\n\t\t\t\tarray[index] = value\n\t\t\t}\n\t\t\treturn array, true\n\t\t} else if holder.class != \"Function\" {\n\t\t\tobject := map[string]interface{}{}\n\t\t\tif ctx.propertyList != nil {\n\t\t\t\tfor _, name := range ctx.propertyList {\n\t\t\t\t\tvalue, exists := builtinJSON_stringifyWalk(ctx, name, holder)\n\t\t\t\t\tif exists {\n\t\t\t\t\t\tobject[name] = value\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Go maps are without order, so this doesn't conform to the ECMA ordering\n\t\t\t\t// standard, but oh well...\n\t\t\t\tholder.enumerate(false, func(name string) bool {\n\t\t\t\t\tvalue, exists := builtinJSON_stringifyWalk(ctx, name, holder)\n\t\t\t\t\tif exists {\n\t\t\t\t\t\tobject[name] = value\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn object, true\n\t\t}\n\t}\n\treturn nil, false\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_math.go",
    "content": "package otto\n\nimport (\n\t\"math\"\n\t\"math/rand\"\n)\n\n// Math\n\nfunc builtinMath_abs(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Abs(number))\n}\n\nfunc builtinMath_acos(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Acos(number))\n}\n\nfunc builtinMath_asin(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Asin(number))\n}\n\nfunc builtinMath_atan(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Atan(number))\n}\n\nfunc builtinMath_atan2(call FunctionCall) Value {\n\ty := call.Argument(0).float64()\n\tif math.IsNaN(y) {\n\t\treturn NaNValue()\n\t}\n\tx := call.Argument(1).float64()\n\tif math.IsNaN(x) {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_float64(math.Atan2(y, x))\n}\n\nfunc builtinMath_cos(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Cos(number))\n}\n\nfunc builtinMath_ceil(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Ceil(number))\n}\n\nfunc builtinMath_exp(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Exp(number))\n}\n\nfunc builtinMath_floor(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Floor(number))\n}\n\nfunc builtinMath_log(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Log(number))\n}\n\nfunc builtinMath_max(call FunctionCall) Value {\n\tswitch len(call.ArgumentList) {\n\tcase 0:\n\t\treturn negativeInfinityValue()\n\tcase 1:\n\t\treturn toValue_float64(call.ArgumentList[0].float64())\n\t}\n\tresult := call.ArgumentList[0].float64()\n\tif math.IsNaN(result) {\n\t\treturn NaNValue()\n\t}\n\tfor _, value := range call.ArgumentList[1:] {\n\t\tvalue := value.float64()\n\t\tif math.IsNaN(value) {\n\t\t\treturn NaNValue()\n\t\t}\n\t\tresult = math.Max(result, value)\n\t}\n\treturn toValue_float64(result)\n}\n\nfunc builtinMath_min(call FunctionCall) Value {\n\tswitch len(call.ArgumentList) {\n\tcase 0:\n\t\treturn positiveInfinityValue()\n\tcase 1:\n\t\treturn toValue_float64(call.ArgumentList[0].float64())\n\t}\n\tresult := call.ArgumentList[0].float64()\n\tif math.IsNaN(result) {\n\t\treturn NaNValue()\n\t}\n\tfor _, value := range call.ArgumentList[1:] {\n\t\tvalue := value.float64()\n\t\tif math.IsNaN(value) {\n\t\t\treturn NaNValue()\n\t\t}\n\t\tresult = math.Min(result, value)\n\t}\n\treturn toValue_float64(result)\n}\n\nfunc builtinMath_pow(call FunctionCall) Value {\n\t// TODO Make sure this works according to the specification (15.8.2.13)\n\tx := call.Argument(0).float64()\n\ty := call.Argument(1).float64()\n\tif math.Abs(x) == 1 && math.IsInf(y, 0) {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_float64(math.Pow(x, y))\n}\n\nfunc builtinMath_random(call FunctionCall) Value {\n\tvar v float64\n\tif call.runtime.random != nil {\n\t\tv = call.runtime.random()\n\t} else {\n\t\tv = rand.Float64()\n\t}\n\treturn toValue_float64(v)\n}\n\nfunc builtinMath_round(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\tvalue := math.Floor(number + 0.5)\n\tif value == 0 {\n\t\tvalue = math.Copysign(0, number)\n\t}\n\treturn toValue_float64(value)\n}\n\nfunc builtinMath_sin(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Sin(number))\n}\n\nfunc builtinMath_sqrt(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Sqrt(number))\n}\n\nfunc builtinMath_tan(call FunctionCall) Value {\n\tnumber := call.Argument(0).float64()\n\treturn toValue_float64(math.Tan(number))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_number.go",
    "content": "package otto\n\nimport (\n\t\"math\"\n\t\"strconv\"\n)\n\n// Number\n\nfunc numberValueFromNumberArgumentList(argumentList []Value) Value {\n\tif len(argumentList) > 0 {\n\t\treturn argumentList[0].numberValue()\n\t}\n\treturn toValue_int(0)\n}\n\nfunc builtinNumber(call FunctionCall) Value {\n\treturn numberValueFromNumberArgumentList(call.ArgumentList)\n}\n\nfunc builtinNewNumber(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newNumber(numberValueFromNumberArgumentList(argumentList)))\n}\n\nfunc builtinNumber_toString(call FunctionCall) Value {\n\t// Will throw a TypeError if ThisObject is not a Number\n\tvalue := call.thisClassObject(\"Number\").primitiveValue()\n\tradix := 10\n\tradixArgument := call.Argument(0)\n\tif radixArgument.IsDefined() {\n\t\tinteger := toIntegerFloat(radixArgument)\n\t\tif integer < 2 || integer > 36 {\n\t\t\tpanic(call.runtime.panicRangeError(\"toString() radix must be between 2 and 36\"))\n\t\t}\n\t\tradix = int(integer)\n\t}\n\tif radix == 10 {\n\t\treturn toValue_string(value.string())\n\t}\n\treturn toValue_string(numberToStringRadix(value, radix))\n}\n\nfunc builtinNumber_valueOf(call FunctionCall) Value {\n\treturn call.thisClassObject(\"Number\").primitiveValue()\n}\n\nfunc builtinNumber_toFixed(call FunctionCall) Value {\n\tprecision := toIntegerFloat(call.Argument(0))\n\tif 20 < precision || 0 > precision {\n\t\tpanic(call.runtime.panicRangeError(\"toFixed() precision must be between 0 and 20\"))\n\t}\n\tif call.This.IsNaN() {\n\t\treturn toValue_string(\"NaN\")\n\t}\n\tvalue := call.This.float64()\n\tif math.Abs(value) >= 1e21 {\n\t\treturn toValue_string(floatToString(value, 64))\n\t}\n\treturn toValue_string(strconv.FormatFloat(call.This.float64(), 'f', int(precision), 64))\n}\n\nfunc builtinNumber_toExponential(call FunctionCall) Value {\n\tif call.This.IsNaN() {\n\t\treturn toValue_string(\"NaN\")\n\t}\n\tprecision := float64(-1)\n\tif value := call.Argument(0); value.IsDefined() {\n\t\tprecision = toIntegerFloat(value)\n\t\tif 0 > precision {\n\t\t\tpanic(call.runtime.panicRangeError(\"toString() radix must be between 2 and 36\"))\n\t\t}\n\t}\n\treturn toValue_string(strconv.FormatFloat(call.This.float64(), 'e', int(precision), 64))\n}\n\nfunc builtinNumber_toPrecision(call FunctionCall) Value {\n\tif call.This.IsNaN() {\n\t\treturn toValue_string(\"NaN\")\n\t}\n\tvalue := call.Argument(0)\n\tif value.IsUndefined() {\n\t\treturn toValue_string(call.This.string())\n\t}\n\tprecision := toIntegerFloat(value)\n\tif 1 > precision {\n\t\tpanic(call.runtime.panicRangeError(\"toPrecision() precision must be greater than 1\"))\n\t}\n\treturn toValue_string(strconv.FormatFloat(call.This.float64(), 'g', int(precision), 64))\n}\n\nfunc builtinNumber_toLocaleString(call FunctionCall) Value {\n\treturn builtinNumber_toString(call)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_object.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n)\n\n// Object\n\nfunc builtinObject(call FunctionCall) Value {\n\tvalue := call.Argument(0)\n\tswitch value.kind {\n\tcase valueUndefined, valueNull:\n\t\treturn toValue_object(call.runtime.newObject())\n\t}\n\n\treturn toValue_object(call.runtime.toObject(value))\n}\n\nfunc builtinNewObject(self *_object, argumentList []Value) Value {\n\tvalue := valueOfArrayIndex(argumentList, 0)\n\tswitch value.kind {\n\tcase valueNull, valueUndefined:\n\tcase valueNumber, valueString, valueBoolean:\n\t\treturn toValue_object(self.runtime.toObject(value))\n\tcase valueObject:\n\t\treturn value\n\tdefault:\n\t}\n\treturn toValue_object(self.runtime.newObject())\n}\n\nfunc builtinObject_valueOf(call FunctionCall) Value {\n\treturn toValue_object(call.thisObject())\n}\n\nfunc builtinObject_hasOwnProperty(call FunctionCall) Value {\n\tpropertyName := call.Argument(0).string()\n\tthisObject := call.thisObject()\n\treturn toValue_bool(thisObject.hasOwnProperty(propertyName))\n}\n\nfunc builtinObject_isPrototypeOf(call FunctionCall) Value {\n\tvalue := call.Argument(0)\n\tif !value.IsObject() {\n\t\treturn falseValue\n\t}\n\tprototype := call.toObject(value).prototype\n\tthisObject := call.thisObject()\n\tfor prototype != nil {\n\t\tif thisObject == prototype {\n\t\t\treturn trueValue\n\t\t}\n\t\tprototype = prototype.prototype\n\t}\n\treturn falseValue\n}\n\nfunc builtinObject_propertyIsEnumerable(call FunctionCall) Value {\n\tpropertyName := call.Argument(0).string()\n\tthisObject := call.thisObject()\n\tproperty := thisObject.getOwnProperty(propertyName)\n\tif property != nil && property.enumerable() {\n\t\treturn trueValue\n\t}\n\treturn falseValue\n}\n\nfunc builtinObject_toString(call FunctionCall) Value {\n\tresult := \"\"\n\tif call.This.IsUndefined() {\n\t\tresult = \"[object Undefined]\"\n\t} else if call.This.IsNull() {\n\t\tresult = \"[object Null]\"\n\t} else {\n\t\tresult = fmt.Sprintf(\"[object %s]\", call.thisObject().class)\n\t}\n\treturn toValue_string(result)\n}\n\nfunc builtinObject_toLocaleString(call FunctionCall) Value {\n\ttoString := call.thisObject().get(\"toString\")\n\tif !toString.isCallable() {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\treturn toString.call(call.runtime, call.This)\n}\n\nfunc builtinObject_getPrototypeOf(call FunctionCall) Value {\n\tobjectValue := call.Argument(0)\n\tobject := objectValue._object()\n\tif object == nil {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\n\tif object.prototype == nil {\n\t\treturn nullValue\n\t}\n\n\treturn toValue_object(object.prototype)\n}\n\nfunc builtinObject_getOwnPropertyDescriptor(call FunctionCall) Value {\n\tobjectValue := call.Argument(0)\n\tobject := objectValue._object()\n\tif object == nil {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\n\tname := call.Argument(1).string()\n\tdescriptor := object.getOwnProperty(name)\n\tif descriptor == nil {\n\t\treturn Value{}\n\t}\n\treturn toValue_object(call.runtime.fromPropertyDescriptor(*descriptor))\n}\n\nfunc builtinObject_defineProperty(call FunctionCall) Value {\n\tobjectValue := call.Argument(0)\n\tobject := objectValue._object()\n\tif object == nil {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\tname := call.Argument(1).string()\n\tdescriptor := toPropertyDescriptor(call.runtime, call.Argument(2))\n\tobject.defineOwnProperty(name, descriptor, true)\n\treturn objectValue\n}\n\nfunc builtinObject_defineProperties(call FunctionCall) Value {\n\tobjectValue := call.Argument(0)\n\tobject := objectValue._object()\n\tif object == nil {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\n\tproperties := call.runtime.toObject(call.Argument(1))\n\tproperties.enumerate(false, func(name string) bool {\n\t\tdescriptor := toPropertyDescriptor(call.runtime, properties.get(name))\n\t\tobject.defineOwnProperty(name, descriptor, true)\n\t\treturn true\n\t})\n\n\treturn objectValue\n}\n\nfunc builtinObject_create(call FunctionCall) Value {\n\tprototypeValue := call.Argument(0)\n\tif !prototypeValue.IsNull() && !prototypeValue.IsObject() {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\n\tobject := call.runtime.newObject()\n\tobject.prototype = prototypeValue._object()\n\n\tpropertiesValue := call.Argument(1)\n\tif propertiesValue.IsDefined() {\n\t\tproperties := call.runtime.toObject(propertiesValue)\n\t\tproperties.enumerate(false, func(name string) bool {\n\t\t\tdescriptor := toPropertyDescriptor(call.runtime, properties.get(name))\n\t\t\tobject.defineOwnProperty(name, descriptor, true)\n\t\t\treturn true\n\t\t})\n\t}\n\n\treturn toValue_object(object)\n}\n\nfunc builtinObject_isExtensible(call FunctionCall) Value {\n\tobject := call.Argument(0)\n\tif object := object._object(); object != nil {\n\t\treturn toValue_bool(object.extensible)\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinObject_preventExtensions(call FunctionCall) Value {\n\tobject := call.Argument(0)\n\tif object := object._object(); object != nil {\n\t\tobject.extensible = false\n\t} else {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\treturn object\n}\n\nfunc builtinObject_isSealed(call FunctionCall) Value {\n\tobject := call.Argument(0)\n\tif object := object._object(); object != nil {\n\t\tif object.extensible {\n\t\t\treturn toValue_bool(false)\n\t\t}\n\t\tresult := true\n\t\tobject.enumerate(true, func(name string) bool {\n\t\t\tproperty := object.getProperty(name)\n\t\t\tif property.configurable() {\n\t\t\t\tresult = false\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\treturn toValue_bool(result)\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinObject_seal(call FunctionCall) Value {\n\tobject := call.Argument(0)\n\tif object := object._object(); object != nil {\n\t\tobject.enumerate(true, func(name string) bool {\n\t\t\tif property := object.getOwnProperty(name); nil != property && property.configurable() {\n\t\t\t\tproperty.configureOff()\n\t\t\t\tobject.defineOwnProperty(name, *property, true)\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\tobject.extensible = false\n\t} else {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\treturn object\n}\n\nfunc builtinObject_isFrozen(call FunctionCall) Value {\n\tobject := call.Argument(0)\n\tif object := object._object(); object != nil {\n\t\tif object.extensible {\n\t\t\treturn toValue_bool(false)\n\t\t}\n\t\tresult := true\n\t\tobject.enumerate(true, func(name string) bool {\n\t\t\tproperty := object.getProperty(name)\n\t\t\tif property.configurable() || property.writable() {\n\t\t\t\tresult = false\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\treturn toValue_bool(result)\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinObject_freeze(call FunctionCall) Value {\n\tobject := call.Argument(0)\n\tif object := object._object(); object != nil {\n\t\tobject.enumerate(true, func(name string) bool {\n\t\t\tif property, update := object.getOwnProperty(name), false; nil != property {\n\t\t\t\tif property.isDataDescriptor() && property.writable() {\n\t\t\t\t\tproperty.writeOff()\n\t\t\t\t\tupdate = true\n\t\t\t\t}\n\t\t\t\tif property.configurable() {\n\t\t\t\t\tproperty.configureOff()\n\t\t\t\t\tupdate = true\n\t\t\t\t}\n\t\t\t\tif update {\n\t\t\t\t\tobject.defineOwnProperty(name, *property, true)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\tobject.extensible = false\n\t} else {\n\t\tpanic(call.runtime.panicTypeError())\n\t}\n\treturn object\n}\n\nfunc builtinObject_keys(call FunctionCall) Value {\n\tif object, keys := call.Argument(0)._object(), []Value(nil); nil != object {\n\t\tobject.enumerate(false, func(name string) bool {\n\t\t\tkeys = append(keys, toValue_string(name))\n\t\t\treturn true\n\t\t})\n\t\treturn toValue_object(call.runtime.newArrayOf(keys))\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n\nfunc builtinObject_getOwnPropertyNames(call FunctionCall) Value {\n\tif object, propertyNames := call.Argument(0)._object(), []Value(nil); nil != object {\n\t\tobject.enumerate(true, func(name string) bool {\n\t\t\tif object.hasOwnProperty(name) {\n\t\t\t\tpropertyNames = append(propertyNames, toValue_string(name))\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\treturn toValue_object(call.runtime.newArrayOf(propertyNames))\n\t}\n\tpanic(call.runtime.panicTypeError())\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_regexp.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n)\n\n// RegExp\n\nfunc builtinRegExp(call FunctionCall) Value {\n\tpattern := call.Argument(0)\n\tflags := call.Argument(1)\n\tif object := pattern._object(); object != nil {\n\t\tif object.class == \"RegExp\" && flags.IsUndefined() {\n\t\t\treturn pattern\n\t\t}\n\t}\n\treturn toValue_object(call.runtime.newRegExp(pattern, flags))\n}\n\nfunc builtinNewRegExp(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newRegExp(\n\t\tvalueOfArrayIndex(argumentList, 0),\n\t\tvalueOfArrayIndex(argumentList, 1),\n\t))\n}\n\nfunc builtinRegExp_toString(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\tsource := thisObject.get(\"source\").string()\n\tflags := []byte{}\n\tif thisObject.get(\"global\").bool() {\n\t\tflags = append(flags, 'g')\n\t}\n\tif thisObject.get(\"ignoreCase\").bool() {\n\t\tflags = append(flags, 'i')\n\t}\n\tif thisObject.get(\"multiline\").bool() {\n\t\tflags = append(flags, 'm')\n\t}\n\treturn toValue_string(fmt.Sprintf(\"/%s/%s\", source, flags))\n}\n\nfunc builtinRegExp_exec(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\ttarget := call.Argument(0).string()\n\tmatch, result := execRegExp(thisObject, target)\n\tif !match {\n\t\treturn nullValue\n\t}\n\treturn toValue_object(execResultToArray(call.runtime, target, result))\n}\n\nfunc builtinRegExp_test(call FunctionCall) Value {\n\tthisObject := call.thisObject()\n\ttarget := call.Argument(0).string()\n\tmatch, _ := execRegExp(thisObject, target)\n\treturn toValue_bool(match)\n}\n\nfunc builtinRegExp_compile(call FunctionCall) Value {\n\t// This (useless) function is deprecated, but is here to provide some\n\t// semblance of compatibility.\n\t// Caveat emptor: it may not be around for long.\n\treturn Value{}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/builtin_string.go",
    "content": "package otto\n\nimport (\n\t\"bytes\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\n// String\n\nfunc stringValueFromStringArgumentList(argumentList []Value) Value {\n\tif len(argumentList) > 0 {\n\t\treturn toValue_string(argumentList[0].string())\n\t}\n\treturn toValue_string(\"\")\n}\n\nfunc builtinString(call FunctionCall) Value {\n\treturn stringValueFromStringArgumentList(call.ArgumentList)\n}\n\nfunc builtinNewString(self *_object, argumentList []Value) Value {\n\treturn toValue_object(self.runtime.newString(stringValueFromStringArgumentList(argumentList)))\n}\n\nfunc builtinString_toString(call FunctionCall) Value {\n\treturn call.thisClassObject(\"String\").primitiveValue()\n}\nfunc builtinString_valueOf(call FunctionCall) Value {\n\treturn call.thisClassObject(\"String\").primitiveValue()\n}\n\nfunc builtinString_fromCharCode(call FunctionCall) Value {\n\tchrList := make([]uint16, len(call.ArgumentList))\n\tfor index, value := range call.ArgumentList {\n\t\tchrList[index] = toUint16(value)\n\t}\n\treturn toValue_string16(chrList)\n}\n\nfunc builtinString_charAt(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\tidx := int(call.Argument(0).number().int64)\n\tchr := stringAt(call.This._object().stringValue(), idx)\n\tif chr == utf8.RuneError {\n\t\treturn toValue_string(\"\")\n\t}\n\treturn toValue_string(string(chr))\n}\n\nfunc builtinString_charCodeAt(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\tidx := int(call.Argument(0).number().int64)\n\tchr := stringAt(call.This._object().stringValue(), idx)\n\tif chr == utf8.RuneError {\n\t\treturn NaNValue()\n\t}\n\treturn toValue_uint16(uint16(chr))\n}\n\nfunc builtinString_concat(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\tvar value bytes.Buffer\n\tvalue.WriteString(call.This.string())\n\tfor _, item := range call.ArgumentList {\n\t\tvalue.WriteString(item.string())\n\t}\n\treturn toValue_string(value.String())\n}\n\nfunc builtinString_indexOf(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\tvalue := call.This.string()\n\ttarget := call.Argument(0).string()\n\tif 2 > len(call.ArgumentList) {\n\t\treturn toValue_int(strings.Index(value, target))\n\t}\n\tstart := toIntegerFloat(call.Argument(1))\n\tif 0 > start {\n\t\tstart = 0\n\t} else if start >= float64(len(value)) {\n\t\tif target == \"\" {\n\t\t\treturn toValue_int(len(value))\n\t\t}\n\t\treturn toValue_int(-1)\n\t}\n\tindex := strings.Index(value[int(start):], target)\n\tif index >= 0 {\n\t\tindex += int(start)\n\t}\n\treturn toValue_int(index)\n}\n\nfunc builtinString_lastIndexOf(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\tvalue := call.This.string()\n\ttarget := call.Argument(0).string()\n\tif 2 > len(call.ArgumentList) || call.ArgumentList[1].IsUndefined() {\n\t\treturn toValue_int(strings.LastIndex(value, target))\n\t}\n\tlength := len(value)\n\tif length == 0 {\n\t\treturn toValue_int(strings.LastIndex(value, target))\n\t}\n\tstart := call.ArgumentList[1].number()\n\tif start.kind == numberInfinity { // FIXME\n\t\t// startNumber is infinity, so start is the end of string (start = length)\n\t\treturn toValue_int(strings.LastIndex(value, target))\n\t}\n\tif 0 > start.int64 {\n\t\tstart.int64 = 0\n\t}\n\tend := int(start.int64) + len(target)\n\tif end > length {\n\t\tend = length\n\t}\n\treturn toValue_int(strings.LastIndex(value[:end], target))\n}\n\nfunc builtinString_match(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\ttarget := call.This.string()\n\tmatcherValue := call.Argument(0)\n\tmatcher := matcherValue._object()\n\tif !matcherValue.IsObject() || matcher.class != \"RegExp\" {\n\t\tmatcher = call.runtime.newRegExp(matcherValue, Value{})\n\t}\n\tglobal := matcher.get(\"global\").bool()\n\tif !global {\n\t\tmatch, result := execRegExp(matcher, target)\n\t\tif !match {\n\t\t\treturn nullValue\n\t\t}\n\t\treturn toValue_object(execResultToArray(call.runtime, target, result))\n\t}\n\n\t{\n\t\tresult := matcher.regExpValue().regularExpression.FindAllStringIndex(target, -1)\n\t\tmatchCount := len(result)\n\t\tif result == nil {\n\t\t\tmatcher.put(\"lastIndex\", toValue_int(0), true)\n\t\t\treturn Value{} // !match\n\t\t}\n\t\tmatchCount = len(result)\n\t\tvalueArray := make([]Value, matchCount)\n\t\tfor index := 0; index < matchCount; index++ {\n\t\t\tvalueArray[index] = toValue_string(target[result[index][0]:result[index][1]])\n\t\t}\n\t\tmatcher.put(\"lastIndex\", toValue_int(result[matchCount-1][1]), true)\n\t\treturn toValue_object(call.runtime.newArrayOf(valueArray))\n\t}\n}\n\nvar builtinString_replace_Regexp = regexp.MustCompile(\"\\\\$(?:[\\\\$\\\\&\\\\'\\\\`1-9]|0[1-9]|[1-9][0-9])\")\n\nfunc builtinString_findAndReplaceString(input []byte, lastIndex int, match []int, target []byte, replaceValue []byte) (output []byte) {\n\tmatchCount := len(match) / 2\n\toutput = input\n\tif match[0] != lastIndex {\n\t\toutput = append(output, target[lastIndex:match[0]]...)\n\t}\n\treplacement := builtinString_replace_Regexp.ReplaceAllFunc(replaceValue, func(part []byte) []byte {\n\t\t// TODO Check if match[0] or match[1] can be -1 in this scenario\n\t\tswitch part[1] {\n\t\tcase '$':\n\t\t\treturn []byte{'$'}\n\t\tcase '&':\n\t\t\treturn target[match[0]:match[1]]\n\t\tcase '`':\n\t\t\treturn target[:match[0]]\n\t\tcase '\\'':\n\t\t\treturn target[match[1]:len(target)]\n\t\t}\n\t\tmatchNumberParse, error := strconv.ParseInt(string(part[1:]), 10, 64)\n\t\tmatchNumber := int(matchNumberParse)\n\t\tif error != nil || matchNumber >= matchCount {\n\t\t\treturn []byte{}\n\t\t}\n\t\toffset := 2 * matchNumber\n\t\tif match[offset] != -1 {\n\t\t\treturn target[match[offset]:match[offset+1]]\n\t\t}\n\t\treturn []byte{} // The empty string\n\t})\n\toutput = append(output, replacement...)\n\treturn output\n}\n\nfunc builtinString_replace(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\ttarget := []byte(call.This.string())\n\tsearchValue := call.Argument(0)\n\tsearchObject := searchValue._object()\n\n\t// TODO If a capture is -1?\n\tvar search *regexp.Regexp\n\tglobal := false\n\tfind := 1\n\tif searchValue.IsObject() && searchObject.class == \"RegExp\" {\n\t\tregExp := searchObject.regExpValue()\n\t\tsearch = regExp.regularExpression\n\t\tif regExp.global {\n\t\t\tfind = -1\n\t\t}\n\t} else {\n\t\tsearch = regexp.MustCompile(regexp.QuoteMeta(searchValue.string()))\n\t}\n\n\tfound := search.FindAllSubmatchIndex(target, find)\n\tif found == nil {\n\t\treturn toValue_string(string(target)) // !match\n\t}\n\n\t{\n\t\tlastIndex := 0\n\t\tresult := []byte{}\n\n\t\treplaceValue := call.Argument(1)\n\t\tif replaceValue.isCallable() {\n\t\t\ttarget := string(target)\n\t\t\treplace := replaceValue._object()\n\t\t\tfor _, match := range found {\n\t\t\t\tif match[0] != lastIndex {\n\t\t\t\t\tresult = append(result, target[lastIndex:match[0]]...)\n\t\t\t\t}\n\t\t\t\tmatchCount := len(match) / 2\n\t\t\t\targumentList := make([]Value, matchCount+2)\n\t\t\t\tfor index := 0; index < matchCount; index++ {\n\t\t\t\t\toffset := 2 * index\n\t\t\t\t\tif match[offset] != -1 {\n\t\t\t\t\t\targumentList[index] = toValue_string(target[match[offset]:match[offset+1]])\n\t\t\t\t\t} else {\n\t\t\t\t\t\targumentList[index] = Value{}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\targumentList[matchCount+0] = toValue_int(match[0])\n\t\t\t\targumentList[matchCount+1] = toValue_string(target)\n\t\t\t\treplacement := replace.call(Value{}, argumentList, false, nativeFrame).string()\n\t\t\t\tresult = append(result, []byte(replacement)...)\n\t\t\t\tlastIndex = match[1]\n\t\t\t}\n\n\t\t} else {\n\t\t\treplace := []byte(replaceValue.string())\n\t\t\tfor _, match := range found {\n\t\t\t\tresult = builtinString_findAndReplaceString(result, lastIndex, match, target, replace)\n\t\t\t\tlastIndex = match[1]\n\t\t\t}\n\t\t}\n\n\t\tif lastIndex != len(target) {\n\t\t\tresult = append(result, target[lastIndex:]...)\n\t\t}\n\n\t\tif global && searchObject != nil {\n\t\t\tsearchObject.put(\"lastIndex\", toValue_int(lastIndex), true)\n\t\t}\n\n\t\treturn toValue_string(string(result))\n\t}\n}\n\nfunc builtinString_search(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\ttarget := call.This.string()\n\tsearchValue := call.Argument(0)\n\tsearch := searchValue._object()\n\tif !searchValue.IsObject() || search.class != \"RegExp\" {\n\t\tsearch = call.runtime.newRegExp(searchValue, Value{})\n\t}\n\tresult := search.regExpValue().regularExpression.FindStringIndex(target)\n\tif result == nil {\n\t\treturn toValue_int(-1)\n\t}\n\treturn toValue_int(result[0])\n}\n\nfunc stringSplitMatch(target string, targetLength int64, index uint, search string, searchLength int64) (bool, uint) {\n\tif int64(index)+searchLength > searchLength {\n\t\treturn false, 0\n\t}\n\tfound := strings.Index(target[index:], search)\n\tif 0 > found {\n\t\treturn false, 0\n\t}\n\treturn true, uint(found)\n}\n\nfunc builtinString_split(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\ttarget := call.This.string()\n\n\tseparatorValue := call.Argument(0)\n\tlimitValue := call.Argument(1)\n\tlimit := -1\n\tif limitValue.IsDefined() {\n\t\tlimit = int(toUint32(limitValue))\n\t}\n\n\tif limit == 0 {\n\t\treturn toValue_object(call.runtime.newArray(0))\n\t}\n\n\tif separatorValue.IsUndefined() {\n\t\treturn toValue_object(call.runtime.newArrayOf([]Value{toValue_string(target)}))\n\t}\n\n\tif separatorValue.isRegExp() {\n\t\ttargetLength := len(target)\n\t\tsearch := separatorValue._object().regExpValue().regularExpression\n\t\tvalueArray := []Value{}\n\t\tresult := search.FindAllStringSubmatchIndex(target, -1)\n\t\tlastIndex := 0\n\t\tfound := 0\n\n\t\tfor _, match := range result {\n\t\t\tif match[0] == match[1] {\n\t\t\t\t// FIXME Ugh, this is a hack\n\t\t\t\tif match[0] == 0 || match[0] == targetLength {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif lastIndex != match[0] {\n\t\t\t\tvalueArray = append(valueArray, toValue_string(target[lastIndex:match[0]]))\n\t\t\t\tfound++\n\t\t\t} else if lastIndex == match[0] {\n\t\t\t\tif lastIndex != -1 {\n\t\t\t\t\tvalueArray = append(valueArray, toValue_string(\"\"))\n\t\t\t\t\tfound++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlastIndex = match[1]\n\t\t\tif found == limit {\n\t\t\t\tgoto RETURN\n\t\t\t}\n\n\t\t\tcaptureCount := len(match) / 2\n\t\t\tfor index := 1; index < captureCount; index++ {\n\t\t\t\toffset := index * 2\n\t\t\t\tvalue := Value{}\n\t\t\t\tif match[offset] != -1 {\n\t\t\t\t\tvalue = toValue_string(target[match[offset]:match[offset+1]])\n\t\t\t\t}\n\t\t\t\tvalueArray = append(valueArray, value)\n\t\t\t\tfound++\n\t\t\t\tif found == limit {\n\t\t\t\t\tgoto RETURN\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif found != limit {\n\t\t\tif lastIndex != targetLength {\n\t\t\t\tvalueArray = append(valueArray, toValue_string(target[lastIndex:targetLength]))\n\t\t\t} else {\n\t\t\t\tvalueArray = append(valueArray, toValue_string(\"\"))\n\t\t\t}\n\t\t}\n\n\tRETURN:\n\t\treturn toValue_object(call.runtime.newArrayOf(valueArray))\n\n\t} else {\n\t\tseparator := separatorValue.string()\n\n\t\tsplitLimit := limit\n\t\texcess := false\n\t\tif limit > 0 {\n\t\t\tsplitLimit = limit + 1\n\t\t\texcess = true\n\t\t}\n\n\t\tsplit := strings.SplitN(target, separator, splitLimit)\n\n\t\tif excess && len(split) > limit {\n\t\t\tsplit = split[:limit]\n\t\t}\n\n\t\tvalueArray := make([]Value, len(split))\n\t\tfor index, value := range split {\n\t\t\tvalueArray[index] = toValue_string(value)\n\t\t}\n\n\t\treturn toValue_object(call.runtime.newArrayOf(valueArray))\n\t}\n}\n\nfunc builtinString_slice(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\ttarget := call.This.string()\n\n\tlength := int64(len(target))\n\tstart, end := rangeStartEnd(call.ArgumentList, length, false)\n\tif end-start <= 0 {\n\t\treturn toValue_string(\"\")\n\t}\n\treturn toValue_string(target[start:end])\n}\n\nfunc builtinString_substring(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\ttarget := call.This.string()\n\n\tlength := int64(len(target))\n\tstart, end := rangeStartEnd(call.ArgumentList, length, true)\n\tif start > end {\n\t\tstart, end = end, start\n\t}\n\treturn toValue_string(target[start:end])\n}\n\nfunc builtinString_substr(call FunctionCall) Value {\n\ttarget := call.This.string()\n\n\tsize := int64(len(target))\n\tstart, length := rangeStartLength(call.ArgumentList, size)\n\n\tif start >= size {\n\t\treturn toValue_string(\"\")\n\t}\n\n\tif length <= 0 {\n\t\treturn toValue_string(\"\")\n\t}\n\n\tif start+length >= size {\n\t\t// Cap length to be to the end of the string\n\t\t// start = 3, length = 5, size = 4 [0, 1, 2, 3]\n\t\t// 4 - 3 = 1\n\t\t// target[3:4]\n\t\tlength = size - start\n\t}\n\n\treturn toValue_string(target[start : start+length])\n}\n\nfunc builtinString_toLowerCase(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\treturn toValue_string(strings.ToLower(call.This.string()))\n}\n\nfunc builtinString_toUpperCase(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\treturn toValue_string(strings.ToUpper(call.This.string()))\n}\n\n// 7.2 Table 2 — Whitespace Characters & 7.3 Table 3 - Line Terminator Characters\nconst builtinString_trim_whitespace = \"\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF\"\n\nfunc builtinString_trim(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\treturn toValue(strings.Trim(call.This.string(),\n\t\tbuiltinString_trim_whitespace))\n}\n\n// Mozilla extension, not ECMAScript 5\nfunc builtinString_trimLeft(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\treturn toValue(strings.TrimLeft(call.This.string(),\n\t\tbuiltinString_trim_whitespace))\n}\n\n// Mozilla extension, not ECMAScript 5\nfunc builtinString_trimRight(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\treturn toValue(strings.TrimRight(call.This.string(),\n\t\tbuiltinString_trim_whitespace))\n}\n\nfunc builtinString_localeCompare(call FunctionCall) Value {\n\tcheckObjectCoercible(call.runtime, call.This)\n\tthis := call.This.string()\n\tthat := call.Argument(0).string()\n\tif this < that {\n\t\treturn toValue_int(-1)\n\t} else if this == that {\n\t\treturn toValue_int(0)\n\t}\n\treturn toValue_int(1)\n}\n\n/*\nAn alternate version of String.trim\nfunc builtinString_trim(call FunctionCall) Value {\n\tcheckObjectCoercible(call.This)\n\treturn toValue_string(strings.TrimFunc(call.string(.This), isWhiteSpaceOrLineTerminator))\n}\n*/\n\nfunc builtinString_toLocaleLowerCase(call FunctionCall) Value {\n\treturn builtinString_toLowerCase(call)\n}\n\nfunc builtinString_toLocaleUpperCase(call FunctionCall) Value {\n\treturn builtinString_toUpperCase(call)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/clone.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n)\n\ntype _clone struct {\n\truntime      *_runtime\n\t_object      map[*_object]*_object\n\t_objectStash map[*_objectStash]*_objectStash\n\t_dclStash    map[*_dclStash]*_dclStash\n\t_fnStash     map[*_fnStash]*_fnStash\n}\n\nfunc (in *_runtime) clone() *_runtime {\n\n\tin.lck.Lock()\n\tdefer in.lck.Unlock()\n\n\tout := &_runtime{\n\t\tdebugger:   in.debugger,\n\t\trandom:     in.random,\n\t\tstackLimit: in.stackLimit,\n\t\ttraceLimit: in.traceLimit,\n\t}\n\n\tclone := _clone{\n\t\truntime:      out,\n\t\t_object:      make(map[*_object]*_object),\n\t\t_objectStash: make(map[*_objectStash]*_objectStash),\n\t\t_dclStash:    make(map[*_dclStash]*_dclStash),\n\t\t_fnStash:     make(map[*_fnStash]*_fnStash),\n\t}\n\n\tglobalObject := clone.object(in.globalObject)\n\tout.globalStash = out.newObjectStash(globalObject, nil)\n\tout.globalObject = globalObject\n\tout.global = _global{\n\t\tclone.object(in.global.Object),\n\t\tclone.object(in.global.Function),\n\t\tclone.object(in.global.Array),\n\t\tclone.object(in.global.String),\n\t\tclone.object(in.global.Boolean),\n\t\tclone.object(in.global.Number),\n\t\tclone.object(in.global.Math),\n\t\tclone.object(in.global.Date),\n\t\tclone.object(in.global.RegExp),\n\t\tclone.object(in.global.Error),\n\t\tclone.object(in.global.EvalError),\n\t\tclone.object(in.global.TypeError),\n\t\tclone.object(in.global.RangeError),\n\t\tclone.object(in.global.ReferenceError),\n\t\tclone.object(in.global.SyntaxError),\n\t\tclone.object(in.global.URIError),\n\t\tclone.object(in.global.JSON),\n\n\t\tclone.object(in.global.ObjectPrototype),\n\t\tclone.object(in.global.FunctionPrototype),\n\t\tclone.object(in.global.ArrayPrototype),\n\t\tclone.object(in.global.StringPrototype),\n\t\tclone.object(in.global.BooleanPrototype),\n\t\tclone.object(in.global.NumberPrototype),\n\t\tclone.object(in.global.DatePrototype),\n\t\tclone.object(in.global.RegExpPrototype),\n\t\tclone.object(in.global.ErrorPrototype),\n\t\tclone.object(in.global.EvalErrorPrototype),\n\t\tclone.object(in.global.TypeErrorPrototype),\n\t\tclone.object(in.global.RangeErrorPrototype),\n\t\tclone.object(in.global.ReferenceErrorPrototype),\n\t\tclone.object(in.global.SyntaxErrorPrototype),\n\t\tclone.object(in.global.URIErrorPrototype),\n\t}\n\n\tout.eval = out.globalObject.property[\"eval\"].value.(Value).value.(*_object)\n\tout.globalObject.prototype = out.global.ObjectPrototype\n\n\t// Not sure if this is necessary, but give some help to the GC\n\tclone.runtime = nil\n\tclone._object = nil\n\tclone._objectStash = nil\n\tclone._dclStash = nil\n\tclone._fnStash = nil\n\n\treturn out\n}\n\nfunc (clone *_clone) object(in *_object) *_object {\n\tif out, exists := clone._object[in]; exists {\n\t\treturn out\n\t}\n\tout := &_object{}\n\tclone._object[in] = out\n\treturn in.objectClass.clone(in, out, clone)\n}\n\nfunc (clone *_clone) dclStash(in *_dclStash) (*_dclStash, bool) {\n\tif out, exists := clone._dclStash[in]; exists {\n\t\treturn out, true\n\t}\n\tout := &_dclStash{}\n\tclone._dclStash[in] = out\n\treturn out, false\n}\n\nfunc (clone *_clone) objectStash(in *_objectStash) (*_objectStash, bool) {\n\tif out, exists := clone._objectStash[in]; exists {\n\t\treturn out, true\n\t}\n\tout := &_objectStash{}\n\tclone._objectStash[in] = out\n\treturn out, false\n}\n\nfunc (clone *_clone) fnStash(in *_fnStash) (*_fnStash, bool) {\n\tif out, exists := clone._fnStash[in]; exists {\n\t\treturn out, true\n\t}\n\tout := &_fnStash{}\n\tclone._fnStash[in] = out\n\treturn out, false\n}\n\nfunc (clone *_clone) value(in Value) Value {\n\tout := in\n\tswitch value := in.value.(type) {\n\tcase *_object:\n\t\tout.value = clone.object(value)\n\t}\n\treturn out\n}\n\nfunc (clone *_clone) valueArray(in []Value) []Value {\n\tout := make([]Value, len(in))\n\tfor index, value := range in {\n\t\tout[index] = clone.value(value)\n\t}\n\treturn out\n}\n\nfunc (clone *_clone) stash(in _stash) _stash {\n\tif in == nil {\n\t\treturn nil\n\t}\n\treturn in.clone(clone)\n}\n\nfunc (clone *_clone) property(in _property) _property {\n\tout := in\n\n\tswitch value := in.value.(type) {\n\tcase Value:\n\t\tout.value = clone.value(value)\n\tcase _propertyGetSet:\n\t\tp := _propertyGetSet{}\n\t\tif value[0] != nil {\n\t\t\tp[0] = clone.object(value[0])\n\t\t}\n\t\tif value[1] != nil {\n\t\t\tp[1] = clone.object(value[1])\n\t\t}\n\t\tout.value = p\n\tdefault:\n\t\tpanic(fmt.Errorf(\"in.value.(Value) != true; in.value is %T\", in.value))\n\t}\n\n\treturn out\n}\n\nfunc (clone *_clone) dclProperty(in _dclProperty) _dclProperty {\n\tout := in\n\tout.value = clone.value(in.value)\n\treturn out\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/cmpl.go",
    "content": "package otto\n\nimport (\n\t\"github.com/robertkrimen/otto/ast\"\n\t\"github.com/robertkrimen/otto/file\"\n)\n\ntype _file struct {\n\tname string\n\tsrc  string\n\tbase int // This will always be 1 or greater\n}\n\ntype _compiler struct {\n\tfile    *file.File\n\tprogram *ast.Program\n}\n\nfunc (cmpl *_compiler) parse() *_nodeProgram {\n\tif cmpl.program != nil {\n\t\tcmpl.file = cmpl.program.File\n\t}\n\treturn cmpl._parse(cmpl.program)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/cmpl_evaluate.go",
    "content": "package otto\n\nimport (\n\t\"strconv\"\n)\n\nfunc (self *_runtime) cmpl_evaluate_nodeProgram(node *_nodeProgram, eval bool) Value {\n\tif !eval {\n\t\tself.enterGlobalScope()\n\t\tdefer func() {\n\t\t\tself.leaveScope()\n\t\t}()\n\t}\n\tself.cmpl_functionDeclaration(node.functionList)\n\tself.cmpl_variableDeclaration(node.varList)\n\tself.scope.frame.file = node.file\n\treturn self.cmpl_evaluate_nodeStatementList(node.body)\n}\n\nfunc (self *_runtime) cmpl_call_nodeFunction(function *_object, stash *_fnStash, node *_nodeFunctionLiteral, this Value, argumentList []Value) Value {\n\n\tindexOfParameterName := make([]string, len(argumentList))\n\t// function(abc, def, ghi)\n\t// indexOfParameterName[0] = \"abc\"\n\t// indexOfParameterName[1] = \"def\"\n\t// indexOfParameterName[2] = \"ghi\"\n\t// ...\n\n\targumentsFound := false\n\tfor index, name := range node.parameterList {\n\t\tif name == \"arguments\" {\n\t\t\targumentsFound = true\n\t\t}\n\t\tvalue := Value{}\n\t\tif index < len(argumentList) {\n\t\t\tvalue = argumentList[index]\n\t\t\tindexOfParameterName[index] = name\n\t\t}\n\t\t// strict = false\n\t\tself.scope.lexical.setValue(name, value, false)\n\t}\n\n\tif !argumentsFound {\n\t\targuments := self.newArgumentsObject(indexOfParameterName, stash, len(argumentList))\n\t\targuments.defineProperty(\"callee\", toValue_object(function), 0101, false)\n\t\tstash.arguments = arguments\n\t\t// strict = false\n\t\tself.scope.lexical.setValue(\"arguments\", toValue_object(arguments), false)\n\t\tfor index, _ := range argumentList {\n\t\t\tif index < len(node.parameterList) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tindexAsString := strconv.FormatInt(int64(index), 10)\n\t\t\targuments.defineProperty(indexAsString, argumentList[index], 0111, false)\n\t\t}\n\t}\n\n\tself.cmpl_functionDeclaration(node.functionList)\n\tself.cmpl_variableDeclaration(node.varList)\n\n\tresult := self.cmpl_evaluate_nodeStatement(node.body)\n\tif result.kind == valueResult {\n\t\treturn result\n\t}\n\n\treturn Value{}\n}\n\nfunc (self *_runtime) cmpl_functionDeclaration(list []*_nodeFunctionLiteral) {\n\texecutionContext := self.scope\n\teval := executionContext.eval\n\tstash := executionContext.variable\n\n\tfor _, function := range list {\n\t\tname := function.name\n\t\tvalue := self.cmpl_evaluate_nodeExpression(function)\n\t\tif !stash.hasBinding(name) {\n\t\t\tstash.createBinding(name, eval == true, value)\n\t\t} else {\n\t\t\t// TODO 10.5.5.e\n\t\t\tstash.setBinding(name, value, false) // TODO strict\n\t\t}\n\t}\n}\n\nfunc (self *_runtime) cmpl_variableDeclaration(list []string) {\n\texecutionContext := self.scope\n\teval := executionContext.eval\n\tstash := executionContext.variable\n\n\tfor _, name := range list {\n\t\tif !stash.hasBinding(name) {\n\t\t\tstash.createBinding(name, eval == true, Value{}) // TODO strict?\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/cmpl_evaluate_expression.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"runtime\"\n\n\t\"github.com/robertkrimen/otto/token\"\n)\n\nfunc (self *_runtime) cmpl_evaluate_nodeExpression(node _nodeExpression) Value {\n\t// Allow interpreter interruption\n\t// If the Interrupt channel is nil, then\n\t// we avoid runtime.Gosched() overhead (if any)\n\t// FIXME: Test this\n\tif self.otto.Interrupt != nil {\n\t\truntime.Gosched()\n\t\tselect {\n\t\tcase value := <-self.otto.Interrupt:\n\t\t\tvalue()\n\t\tdefault:\n\t\t}\n\t}\n\n\tswitch node := node.(type) {\n\n\tcase *_nodeArrayLiteral:\n\t\treturn self.cmpl_evaluate_nodeArrayLiteral(node)\n\n\tcase *_nodeAssignExpression:\n\t\treturn self.cmpl_evaluate_nodeAssignExpression(node)\n\n\tcase *_nodeBinaryExpression:\n\t\tif node.comparison {\n\t\t\treturn self.cmpl_evaluate_nodeBinaryExpression_comparison(node)\n\t\t} else {\n\t\t\treturn self.cmpl_evaluate_nodeBinaryExpression(node)\n\t\t}\n\n\tcase *_nodeBracketExpression:\n\t\treturn self.cmpl_evaluate_nodeBracketExpression(node)\n\n\tcase *_nodeCallExpression:\n\t\treturn self.cmpl_evaluate_nodeCallExpression(node, nil)\n\n\tcase *_nodeConditionalExpression:\n\t\treturn self.cmpl_evaluate_nodeConditionalExpression(node)\n\n\tcase *_nodeDotExpression:\n\t\treturn self.cmpl_evaluate_nodeDotExpression(node)\n\n\tcase *_nodeFunctionLiteral:\n\t\tvar local = self.scope.lexical\n\t\tif node.name != \"\" {\n\t\t\tlocal = self.newDeclarationStash(local)\n\t\t}\n\n\t\tvalue := toValue_object(self.newNodeFunction(node, local))\n\t\tif node.name != \"\" {\n\t\t\tlocal.createBinding(node.name, false, value)\n\t\t}\n\t\treturn value\n\n\tcase *_nodeIdentifier:\n\t\tname := node.name\n\t\t// TODO Should be true or false (strictness) depending on context\n\t\t// getIdentifierReference should not return nil, but we check anyway and panic\n\t\t// so as not to propagate the nil into something else\n\t\treference := getIdentifierReference(self, self.scope.lexical, name, false, _at(node.idx))\n\t\tif reference == nil {\n\t\t\t// Should never get here!\n\t\t\tpanic(hereBeDragons(\"referenceError == nil: \" + name))\n\t\t}\n\t\treturn toValue(reference)\n\n\tcase *_nodeLiteral:\n\t\treturn node.value\n\n\tcase *_nodeNewExpression:\n\t\treturn self.cmpl_evaluate_nodeNewExpression(node)\n\n\tcase *_nodeObjectLiteral:\n\t\treturn self.cmpl_evaluate_nodeObjectLiteral(node)\n\n\tcase *_nodeRegExpLiteral:\n\t\treturn toValue_object(self._newRegExp(node.pattern, node.flags))\n\n\tcase *_nodeSequenceExpression:\n\t\treturn self.cmpl_evaluate_nodeSequenceExpression(node)\n\n\tcase *_nodeThisExpression:\n\t\treturn toValue_object(self.scope.this)\n\n\tcase *_nodeUnaryExpression:\n\t\treturn self.cmpl_evaluate_nodeUnaryExpression(node)\n\n\tcase *_nodeVariableExpression:\n\t\treturn self.cmpl_evaluate_nodeVariableExpression(node)\n\t}\n\n\tpanic(fmt.Errorf(\"Here be dragons: evaluate_nodeExpression(%T)\", node))\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeArrayLiteral(node *_nodeArrayLiteral) Value {\n\n\tvalueArray := []Value{}\n\n\tfor _, node := range node.value {\n\t\tif node == nil {\n\t\t\tvalueArray = append(valueArray, emptyValue)\n\t\t} else {\n\t\t\tvalueArray = append(valueArray, self.cmpl_evaluate_nodeExpression(node).resolve())\n\t\t}\n\t}\n\n\tresult := self.newArrayOf(valueArray)\n\n\treturn toValue_object(result)\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeAssignExpression(node *_nodeAssignExpression) Value {\n\n\tleft := self.cmpl_evaluate_nodeExpression(node.left)\n\tright := self.cmpl_evaluate_nodeExpression(node.right)\n\trightValue := right.resolve()\n\n\tresult := rightValue\n\tif node.operator != token.ASSIGN {\n\t\tresult = self.calculateBinaryExpression(node.operator, left, rightValue)\n\t}\n\n\tself.putValue(left.reference(), result)\n\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeBinaryExpression(node *_nodeBinaryExpression) Value {\n\n\tleft := self.cmpl_evaluate_nodeExpression(node.left)\n\tleftValue := left.resolve()\n\n\tswitch node.operator {\n\t// Logical\n\tcase token.LOGICAL_AND:\n\t\tif !leftValue.bool() {\n\t\t\treturn leftValue\n\t\t}\n\t\tright := self.cmpl_evaluate_nodeExpression(node.right)\n\t\treturn right.resolve()\n\tcase token.LOGICAL_OR:\n\t\tif leftValue.bool() {\n\t\t\treturn leftValue\n\t\t}\n\t\tright := self.cmpl_evaluate_nodeExpression(node.right)\n\t\treturn right.resolve()\n\t}\n\n\treturn self.calculateBinaryExpression(node.operator, leftValue, self.cmpl_evaluate_nodeExpression(node.right))\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeBinaryExpression_comparison(node *_nodeBinaryExpression) Value {\n\n\tleft := self.cmpl_evaluate_nodeExpression(node.left).resolve()\n\tright := self.cmpl_evaluate_nodeExpression(node.right).resolve()\n\n\treturn toValue_bool(self.calculateComparison(node.operator, left, right))\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeBracketExpression(node *_nodeBracketExpression) Value {\n\ttarget := self.cmpl_evaluate_nodeExpression(node.left)\n\ttargetValue := target.resolve()\n\tmember := self.cmpl_evaluate_nodeExpression(node.member)\n\tmemberValue := member.resolve()\n\n\t// TODO Pass in base value as-is, and defer toObject till later?\n\tobject, err := self.objectCoerce(targetValue)\n\tif err != nil {\n\t\tpanic(self.panicTypeError(\"Cannot access member '%s' of %s\", memberValue.string(), err.Error(), _at(node.idx)))\n\t}\n\treturn toValue(newPropertyReference(self, object, memberValue.string(), false, _at(node.idx)))\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeCallExpression(node *_nodeCallExpression, withArgumentList []interface{}) Value {\n\trt := self\n\tthis := Value{}\n\tcallee := self.cmpl_evaluate_nodeExpression(node.callee)\n\n\targumentList := []Value{}\n\tif withArgumentList != nil {\n\t\targumentList = self.toValueArray(withArgumentList...)\n\t} else {\n\t\tfor _, argumentNode := range node.argumentList {\n\t\t\targumentList = append(argumentList, self.cmpl_evaluate_nodeExpression(argumentNode).resolve())\n\t\t}\n\t}\n\n\trf := callee.reference()\n\tvl := callee.resolve()\n\n\teval := false // Whether this call is a (candidate for) direct call to eval\n\tname := \"\"\n\tif rf != nil {\n\t\tswitch rf := rf.(type) {\n\t\tcase *_propertyReference:\n\t\t\tname = rf.name\n\t\t\tobject := rf.base\n\t\t\tthis = toValue_object(object)\n\t\t\teval = rf.name == \"eval\" // Possible direct eval\n\t\tcase *_stashReference:\n\t\t\t// TODO ImplicitThisValue\n\t\t\tname = rf.name\n\t\t\teval = rf.name == \"eval\" // Possible direct eval\n\t\tdefault:\n\t\t\t// FIXME?\n\t\t\tpanic(rt.panicTypeError(\"Here be dragons\"))\n\t\t}\n\t}\n\n\tat := _at(-1)\n\tswitch callee := node.callee.(type) {\n\tcase *_nodeIdentifier:\n\t\tat = _at(callee.idx)\n\tcase *_nodeDotExpression:\n\t\tat = _at(callee.idx)\n\tcase *_nodeBracketExpression:\n\t\tat = _at(callee.idx)\n\t}\n\n\tframe := _frame{\n\t\tcallee: name,\n\t\tfile:   self.scope.frame.file,\n\t}\n\n\tif !vl.IsFunction() {\n\t\tif name == \"\" {\n\t\t\t// FIXME Maybe typeof?\n\t\t\tpanic(rt.panicTypeError(\"%v is not a function\", vl, at))\n\t\t}\n\t\tpanic(rt.panicTypeError(\"'%s' is not a function\", name, at))\n\t}\n\n\tself.scope.frame.offset = int(at)\n\n\treturn vl._object().call(this, argumentList, eval, frame)\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeConditionalExpression(node *_nodeConditionalExpression) Value {\n\ttest := self.cmpl_evaluate_nodeExpression(node.test)\n\ttestValue := test.resolve()\n\tif testValue.bool() {\n\t\treturn self.cmpl_evaluate_nodeExpression(node.consequent)\n\t}\n\treturn self.cmpl_evaluate_nodeExpression(node.alternate)\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeDotExpression(node *_nodeDotExpression) Value {\n\ttarget := self.cmpl_evaluate_nodeExpression(node.left)\n\ttargetValue := target.resolve()\n\t// TODO Pass in base value as-is, and defer toObject till later?\n\tobject, err := self.objectCoerce(targetValue)\n\tif err != nil {\n\t\tpanic(self.panicTypeError(\"Cannot access member '%s' of %s\", node.identifier, err.Error(), _at(node.idx)))\n\t}\n\treturn toValue(newPropertyReference(self, object, node.identifier, false, _at(node.idx)))\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeNewExpression(node *_nodeNewExpression) Value {\n\trt := self\n\tcallee := self.cmpl_evaluate_nodeExpression(node.callee)\n\n\targumentList := []Value{}\n\tfor _, argumentNode := range node.argumentList {\n\t\targumentList = append(argumentList, self.cmpl_evaluate_nodeExpression(argumentNode).resolve())\n\t}\n\n\trf := callee.reference()\n\tvl := callee.resolve()\n\n\tname := \"\"\n\tif rf != nil {\n\t\tswitch rf := rf.(type) {\n\t\tcase *_propertyReference:\n\t\t\tname = rf.name\n\t\tcase *_stashReference:\n\t\t\tname = rf.name\n\t\tdefault:\n\t\t\tpanic(rt.panicTypeError(\"Here be dragons\"))\n\t\t}\n\t}\n\n\tat := _at(-1)\n\tswitch callee := node.callee.(type) {\n\tcase *_nodeIdentifier:\n\t\tat = _at(callee.idx)\n\tcase *_nodeDotExpression:\n\t\tat = _at(callee.idx)\n\tcase *_nodeBracketExpression:\n\t\tat = _at(callee.idx)\n\t}\n\n\tif !vl.IsFunction() {\n\t\tif name == \"\" {\n\t\t\t// FIXME Maybe typeof?\n\t\t\tpanic(rt.panicTypeError(\"%v is not a function\", vl, at))\n\t\t}\n\t\tpanic(rt.panicTypeError(\"'%s' is not a function\", name, at))\n\t}\n\n\tself.scope.frame.offset = int(at)\n\n\treturn vl._object().construct(argumentList)\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeObjectLiteral(node *_nodeObjectLiteral) Value {\n\n\tresult := self.newObject()\n\n\tfor _, property := range node.value {\n\t\tswitch property.kind {\n\t\tcase \"value\":\n\t\t\tresult.defineProperty(property.key, self.cmpl_evaluate_nodeExpression(property.value).resolve(), 0111, false)\n\t\tcase \"get\":\n\t\t\tgetter := self.newNodeFunction(property.value.(*_nodeFunctionLiteral), self.scope.lexical)\n\t\t\tdescriptor := _property{}\n\t\t\tdescriptor.mode = 0211\n\t\t\tdescriptor.value = _propertyGetSet{getter, nil}\n\t\t\tresult.defineOwnProperty(property.key, descriptor, false)\n\t\tcase \"set\":\n\t\t\tsetter := self.newNodeFunction(property.value.(*_nodeFunctionLiteral), self.scope.lexical)\n\t\t\tdescriptor := _property{}\n\t\t\tdescriptor.mode = 0211\n\t\t\tdescriptor.value = _propertyGetSet{nil, setter}\n\t\t\tresult.defineOwnProperty(property.key, descriptor, false)\n\t\tdefault:\n\t\t\tpanic(fmt.Errorf(\"Here be dragons: evaluate_nodeObjectLiteral: invalid property.Kind: %v\", property.kind))\n\t\t}\n\t}\n\n\treturn toValue_object(result)\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeSequenceExpression(node *_nodeSequenceExpression) Value {\n\tvar result Value\n\tfor _, node := range node.sequence {\n\t\tresult = self.cmpl_evaluate_nodeExpression(node)\n\t\tresult = result.resolve()\n\t}\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeUnaryExpression(node *_nodeUnaryExpression) Value {\n\n\ttarget := self.cmpl_evaluate_nodeExpression(node.operand)\n\tswitch node.operator {\n\tcase token.TYPEOF, token.DELETE:\n\t\tif target.kind == valueReference && target.reference().invalid() {\n\t\t\tif node.operator == token.TYPEOF {\n\t\t\t\treturn toValue_string(\"undefined\")\n\t\t\t}\n\t\t\treturn trueValue\n\t\t}\n\t}\n\n\tswitch node.operator {\n\tcase token.NOT:\n\t\ttargetValue := target.resolve()\n\t\tif targetValue.bool() {\n\t\t\treturn falseValue\n\t\t}\n\t\treturn trueValue\n\tcase token.BITWISE_NOT:\n\t\ttargetValue := target.resolve()\n\t\tintegerValue := toInt32(targetValue)\n\t\treturn toValue_int32(^integerValue)\n\tcase token.PLUS:\n\t\ttargetValue := target.resolve()\n\t\treturn toValue_float64(targetValue.float64())\n\tcase token.MINUS:\n\t\ttargetValue := target.resolve()\n\t\tvalue := targetValue.float64()\n\t\t// TODO Test this\n\t\tsign := float64(-1)\n\t\tif math.Signbit(value) {\n\t\t\tsign = 1\n\t\t}\n\t\treturn toValue_float64(math.Copysign(value, sign))\n\tcase token.INCREMENT:\n\t\ttargetValue := target.resolve()\n\t\tif node.postfix {\n\t\t\t// Postfix++\n\t\t\toldValue := targetValue.float64()\n\t\t\tnewValue := toValue_float64(+1 + oldValue)\n\t\t\tself.putValue(target.reference(), newValue)\n\t\t\treturn toValue_float64(oldValue)\n\t\t} else {\n\t\t\t// ++Prefix\n\t\t\tnewValue := toValue_float64(+1 + targetValue.float64())\n\t\t\tself.putValue(target.reference(), newValue)\n\t\t\treturn newValue\n\t\t}\n\tcase token.DECREMENT:\n\t\ttargetValue := target.resolve()\n\t\tif node.postfix {\n\t\t\t// Postfix--\n\t\t\toldValue := targetValue.float64()\n\t\t\tnewValue := toValue_float64(-1 + oldValue)\n\t\t\tself.putValue(target.reference(), newValue)\n\t\t\treturn toValue_float64(oldValue)\n\t\t} else {\n\t\t\t// --Prefix\n\t\t\tnewValue := toValue_float64(-1 + targetValue.float64())\n\t\t\tself.putValue(target.reference(), newValue)\n\t\t\treturn newValue\n\t\t}\n\tcase token.VOID:\n\t\ttarget.resolve() // FIXME Side effect?\n\t\treturn Value{}\n\tcase token.DELETE:\n\t\treference := target.reference()\n\t\tif reference == nil {\n\t\t\treturn trueValue\n\t\t}\n\t\treturn toValue_bool(target.reference().delete())\n\tcase token.TYPEOF:\n\t\ttargetValue := target.resolve()\n\t\tswitch targetValue.kind {\n\t\tcase valueUndefined:\n\t\t\treturn toValue_string(\"undefined\")\n\t\tcase valueNull:\n\t\t\treturn toValue_string(\"object\")\n\t\tcase valueBoolean:\n\t\t\treturn toValue_string(\"boolean\")\n\t\tcase valueNumber:\n\t\t\treturn toValue_string(\"number\")\n\t\tcase valueString:\n\t\t\treturn toValue_string(\"string\")\n\t\tcase valueObject:\n\t\t\tif targetValue._object().isCall() {\n\t\t\t\treturn toValue_string(\"function\")\n\t\t\t}\n\t\t\treturn toValue_string(\"object\")\n\t\tdefault:\n\t\t\t// FIXME ?\n\t\t}\n\t}\n\n\tpanic(hereBeDragons())\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeVariableExpression(node *_nodeVariableExpression) Value {\n\tif node.initializer != nil {\n\t\t// FIXME If reference is nil\n\t\tleft := getIdentifierReference(self, self.scope.lexical, node.name, false, _at(node.idx))\n\t\tright := self.cmpl_evaluate_nodeExpression(node.initializer)\n\t\trightValue := right.resolve()\n\n\t\tself.putValue(left, rightValue)\n\t}\n\treturn toValue_string(node.name)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/cmpl_evaluate_statement.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\n\t\"github.com/robertkrimen/otto/token\"\n)\n\nfunc (self *_runtime) cmpl_evaluate_nodeStatement(node _nodeStatement) Value {\n\t// Allow interpreter interruption\n\t// If the Interrupt channel is nil, then\n\t// we avoid runtime.Gosched() overhead (if any)\n\t// FIXME: Test this\n\tif self.otto.Interrupt != nil {\n\t\truntime.Gosched()\n\t\tselect {\n\t\tcase value := <-self.otto.Interrupt:\n\t\t\tvalue()\n\t\tdefault:\n\t\t}\n\t}\n\n\tswitch node := node.(type) {\n\n\tcase *_nodeBlockStatement:\n\t\tlabels := self.labels\n\t\tself.labels = nil\n\n\t\tvalue := self.cmpl_evaluate_nodeStatementList(node.list)\n\t\tswitch value.kind {\n\t\tcase valueResult:\n\t\t\tswitch value.evaluateBreak(labels) {\n\t\t\tcase resultBreak:\n\t\t\t\treturn emptyValue\n\t\t\t}\n\t\t}\n\t\treturn value\n\n\tcase *_nodeBranchStatement:\n\t\ttarget := node.label\n\t\tswitch node.branch { // FIXME Maybe node.kind? node.operator?\n\t\tcase token.BREAK:\n\t\t\treturn toValue(newBreakResult(target))\n\t\tcase token.CONTINUE:\n\t\t\treturn toValue(newContinueResult(target))\n\t\t}\n\n\tcase *_nodeDebuggerStatement:\n\t\tif self.debugger != nil {\n\t\t\tself.debugger(self.otto)\n\t\t}\n\t\treturn emptyValue // Nothing happens.\n\n\tcase *_nodeDoWhileStatement:\n\t\treturn self.cmpl_evaluate_nodeDoWhileStatement(node)\n\n\tcase *_nodeEmptyStatement:\n\t\treturn emptyValue\n\n\tcase *_nodeExpressionStatement:\n\t\treturn self.cmpl_evaluate_nodeExpression(node.expression)\n\n\tcase *_nodeForInStatement:\n\t\treturn self.cmpl_evaluate_nodeForInStatement(node)\n\n\tcase *_nodeForStatement:\n\t\treturn self.cmpl_evaluate_nodeForStatement(node)\n\n\tcase *_nodeIfStatement:\n\t\treturn self.cmpl_evaluate_nodeIfStatement(node)\n\n\tcase *_nodeLabelledStatement:\n\t\tself.labels = append(self.labels, node.label)\n\t\tdefer func() {\n\t\t\tif len(self.labels) > 0 {\n\t\t\t\tself.labels = self.labels[:len(self.labels)-1] // Pop the label\n\t\t\t} else {\n\t\t\t\tself.labels = nil\n\t\t\t}\n\t\t}()\n\t\treturn self.cmpl_evaluate_nodeStatement(node.statement)\n\n\tcase *_nodeReturnStatement:\n\t\tif node.argument != nil {\n\t\t\treturn toValue(newReturnResult(self.cmpl_evaluate_nodeExpression(node.argument).resolve()))\n\t\t}\n\t\treturn toValue(newReturnResult(Value{}))\n\n\tcase *_nodeSwitchStatement:\n\t\treturn self.cmpl_evaluate_nodeSwitchStatement(node)\n\n\tcase *_nodeThrowStatement:\n\t\tvalue := self.cmpl_evaluate_nodeExpression(node.argument).resolve()\n\t\tpanic(newException(value))\n\n\tcase *_nodeTryStatement:\n\t\treturn self.cmpl_evaluate_nodeTryStatement(node)\n\n\tcase *_nodeVariableStatement:\n\t\t// Variables are already defined, this is initialization only\n\t\tfor _, variable := range node.list {\n\t\t\tself.cmpl_evaluate_nodeVariableExpression(variable.(*_nodeVariableExpression))\n\t\t}\n\t\treturn emptyValue\n\n\tcase *_nodeWhileStatement:\n\t\treturn self.cmpl_evaluate_nodeWhileStatement(node)\n\n\tcase *_nodeWithStatement:\n\t\treturn self.cmpl_evaluate_nodeWithStatement(node)\n\n\t}\n\n\tpanic(fmt.Errorf(\"Here be dragons: evaluate_nodeStatement(%T)\", node))\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeStatementList(list []_nodeStatement) Value {\n\tvar result Value\n\tfor _, node := range list {\n\t\tvalue := self.cmpl_evaluate_nodeStatement(node)\n\t\tswitch value.kind {\n\t\tcase valueResult:\n\t\t\treturn value\n\t\tcase valueEmpty:\n\t\tdefault:\n\t\t\t// We have getValue here to (for example) trigger a\n\t\t\t// ReferenceError (of the not defined variety)\n\t\t\t// Not sure if this is the best way to error out early\n\t\t\t// for such errors or if there is a better way\n\t\t\t// TODO Do we still need this?\n\t\t\tresult = value.resolve()\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeDoWhileStatement(node *_nodeDoWhileStatement) Value {\n\n\tlabels := append(self.labels, \"\")\n\tself.labels = nil\n\n\ttest := node.test\n\n\tresult := emptyValue\nresultBreak:\n\tfor {\n\t\tfor _, node := range node.body {\n\t\t\tvalue := self.cmpl_evaluate_nodeStatement(node)\n\t\t\tswitch value.kind {\n\t\t\tcase valueResult:\n\t\t\t\tswitch value.evaluateBreakContinue(labels) {\n\t\t\t\tcase resultReturn:\n\t\t\t\t\treturn value\n\t\t\t\tcase resultBreak:\n\t\t\t\t\tbreak resultBreak\n\t\t\t\tcase resultContinue:\n\t\t\t\t\tgoto resultContinue\n\t\t\t\t}\n\t\t\tcase valueEmpty:\n\t\t\tdefault:\n\t\t\t\tresult = value\n\t\t\t}\n\t\t}\n\tresultContinue:\n\t\tif !self.cmpl_evaluate_nodeExpression(test).resolve().bool() {\n\t\t\t// Stahp: do ... while (false)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeForInStatement(node *_nodeForInStatement) Value {\n\n\tlabels := append(self.labels, \"\")\n\tself.labels = nil\n\n\tsource := self.cmpl_evaluate_nodeExpression(node.source)\n\tsourceValue := source.resolve()\n\n\tswitch sourceValue.kind {\n\tcase valueUndefined, valueNull:\n\t\treturn emptyValue\n\t}\n\n\tsourceObject := self.toObject(sourceValue)\n\n\tinto := node.into\n\tbody := node.body\n\n\tresult := emptyValue\n\tobject := sourceObject\n\tfor object != nil {\n\t\tenumerateValue := emptyValue\n\t\tobject.enumerate(false, func(name string) bool {\n\t\t\tinto := self.cmpl_evaluate_nodeExpression(into)\n\t\t\t// In the case of: for (var abc in def) ...\n\t\t\tif into.reference() == nil {\n\t\t\t\tidentifier := into.string()\n\t\t\t\t// TODO Should be true or false (strictness) depending on context\n\t\t\t\tinto = toValue(getIdentifierReference(self, self.scope.lexical, identifier, false, -1))\n\t\t\t}\n\t\t\tself.putValue(into.reference(), toValue_string(name))\n\t\t\tfor _, node := range body {\n\t\t\t\tvalue := self.cmpl_evaluate_nodeStatement(node)\n\t\t\t\tswitch value.kind {\n\t\t\t\tcase valueResult:\n\t\t\t\t\tswitch value.evaluateBreakContinue(labels) {\n\t\t\t\t\tcase resultReturn:\n\t\t\t\t\t\tenumerateValue = value\n\t\t\t\t\t\treturn false\n\t\t\t\t\tcase resultBreak:\n\t\t\t\t\t\tobject = nil\n\t\t\t\t\t\treturn false\n\t\t\t\t\tcase resultContinue:\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\tcase valueEmpty:\n\t\t\t\tdefault:\n\t\t\t\t\tenumerateValue = value\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\tif object == nil {\n\t\t\tbreak\n\t\t}\n\t\tobject = object.prototype\n\t\tif !enumerateValue.isEmpty() {\n\t\t\tresult = enumerateValue\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeForStatement(node *_nodeForStatement) Value {\n\n\tlabels := append(self.labels, \"\")\n\tself.labels = nil\n\n\tinitializer := node.initializer\n\ttest := node.test\n\tupdate := node.update\n\tbody := node.body\n\n\tif initializer != nil {\n\t\tinitialResult := self.cmpl_evaluate_nodeExpression(initializer)\n\t\tinitialResult.resolve() // Side-effect trigger\n\t}\n\n\tresult := emptyValue\nresultBreak:\n\tfor {\n\t\tif test != nil {\n\t\t\ttestResult := self.cmpl_evaluate_nodeExpression(test)\n\t\t\ttestResultValue := testResult.resolve()\n\t\t\tif testResultValue.bool() == false {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tfor _, node := range body {\n\t\t\tvalue := self.cmpl_evaluate_nodeStatement(node)\n\t\t\tswitch value.kind {\n\t\t\tcase valueResult:\n\t\t\t\tswitch value.evaluateBreakContinue(labels) {\n\t\t\t\tcase resultReturn:\n\t\t\t\t\treturn value\n\t\t\t\tcase resultBreak:\n\t\t\t\t\tbreak resultBreak\n\t\t\t\tcase resultContinue:\n\t\t\t\t\tgoto resultContinue\n\t\t\t\t}\n\t\t\tcase valueEmpty:\n\t\t\tdefault:\n\t\t\t\tresult = value\n\t\t\t}\n\t\t}\n\tresultContinue:\n\t\tif update != nil {\n\t\t\tupdateResult := self.cmpl_evaluate_nodeExpression(update)\n\t\t\tupdateResult.resolve() // Side-effect trigger\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeIfStatement(node *_nodeIfStatement) Value {\n\ttest := self.cmpl_evaluate_nodeExpression(node.test)\n\ttestValue := test.resolve()\n\tif testValue.bool() {\n\t\treturn self.cmpl_evaluate_nodeStatement(node.consequent)\n\t} else if node.alternate != nil {\n\t\treturn self.cmpl_evaluate_nodeStatement(node.alternate)\n\t}\n\n\treturn emptyValue\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeSwitchStatement(node *_nodeSwitchStatement) Value {\n\n\tlabels := append(self.labels, \"\")\n\tself.labels = nil\n\n\tdiscriminantResult := self.cmpl_evaluate_nodeExpression(node.discriminant)\n\ttarget := node.default_\n\n\tfor index, clause := range node.body {\n\t\ttest := clause.test\n\t\tif test != nil {\n\t\t\tif self.calculateComparison(token.STRICT_EQUAL, discriminantResult, self.cmpl_evaluate_nodeExpression(test)) {\n\t\t\t\ttarget = index\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tresult := emptyValue\n\tif target != -1 {\n\t\tfor _, clause := range node.body[target:] {\n\t\t\tfor _, statement := range clause.consequent {\n\t\t\t\tvalue := self.cmpl_evaluate_nodeStatement(statement)\n\t\t\t\tswitch value.kind {\n\t\t\t\tcase valueResult:\n\t\t\t\t\tswitch value.evaluateBreak(labels) {\n\t\t\t\t\tcase resultReturn:\n\t\t\t\t\t\treturn value\n\t\t\t\t\tcase resultBreak:\n\t\t\t\t\t\treturn emptyValue\n\t\t\t\t\t}\n\t\t\t\tcase valueEmpty:\n\t\t\t\tdefault:\n\t\t\t\t\tresult = value\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeTryStatement(node *_nodeTryStatement) Value {\n\ttryCatchValue, exception := self.tryCatchEvaluate(func() Value {\n\t\treturn self.cmpl_evaluate_nodeStatement(node.body)\n\t})\n\n\tif exception && node.catch != nil {\n\t\touter := self.scope.lexical\n\t\tself.scope.lexical = self.newDeclarationStash(outer)\n\t\tdefer func() {\n\t\t\tself.scope.lexical = outer\n\t\t}()\n\t\t// TODO If necessary, convert TypeError<runtime> => TypeError\n\t\t// That, is, such errors can be thrown despite not being JavaScript \"native\"\n\t\t// strict = false\n\t\tself.scope.lexical.setValue(node.catch.parameter, tryCatchValue, false)\n\n\t\t// FIXME node.CatchParameter\n\t\t// FIXME node.Catch\n\t\ttryCatchValue, exception = self.tryCatchEvaluate(func() Value {\n\t\t\treturn self.cmpl_evaluate_nodeStatement(node.catch.body)\n\t\t})\n\t}\n\n\tif node.finally != nil {\n\t\tfinallyValue := self.cmpl_evaluate_nodeStatement(node.finally)\n\t\tif finallyValue.kind == valueResult {\n\t\t\treturn finallyValue\n\t\t}\n\t}\n\n\tif exception {\n\t\tpanic(newException(tryCatchValue))\n\t}\n\n\treturn tryCatchValue\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeWhileStatement(node *_nodeWhileStatement) Value {\n\n\ttest := node.test\n\tbody := node.body\n\tlabels := append(self.labels, \"\")\n\tself.labels = nil\n\n\tresult := emptyValue\nresultBreakContinue:\n\tfor {\n\t\tif !self.cmpl_evaluate_nodeExpression(test).resolve().bool() {\n\t\t\t// Stahp: while (false) ...\n\t\t\tbreak\n\t\t}\n\t\tfor _, node := range body {\n\t\t\tvalue := self.cmpl_evaluate_nodeStatement(node)\n\t\t\tswitch value.kind {\n\t\t\tcase valueResult:\n\t\t\t\tswitch value.evaluateBreakContinue(labels) {\n\t\t\t\tcase resultReturn:\n\t\t\t\t\treturn value\n\t\t\t\tcase resultBreak:\n\t\t\t\t\tbreak resultBreakContinue\n\t\t\t\tcase resultContinue:\n\t\t\t\t\tcontinue resultBreakContinue\n\t\t\t\t}\n\t\t\tcase valueEmpty:\n\t\t\tdefault:\n\t\t\t\tresult = value\n\t\t\t}\n\t\t}\n\t}\n\treturn result\n}\n\nfunc (self *_runtime) cmpl_evaluate_nodeWithStatement(node *_nodeWithStatement) Value {\n\tobject := self.cmpl_evaluate_nodeExpression(node.object)\n\touter := self.scope.lexical\n\tlexical := self.newObjectStash(self.toObject(object.resolve()), outer)\n\tself.scope.lexical = lexical\n\tdefer func() {\n\t\tself.scope.lexical = outer\n\t}()\n\n\treturn self.cmpl_evaluate_nodeStatement(node.body)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/cmpl_parse.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\n\t\"github.com/robertkrimen/otto/ast\"\n\t\"github.com/robertkrimen/otto/file\"\n\t\"github.com/robertkrimen/otto/token\"\n)\n\nvar trueLiteral = &_nodeLiteral{value: toValue_bool(true)}\nvar falseLiteral = &_nodeLiteral{value: toValue_bool(false)}\nvar nullLiteral = &_nodeLiteral{value: nullValue}\nvar emptyStatement = &_nodeEmptyStatement{}\n\nfunc (cmpl *_compiler) parseExpression(in ast.Expression) _nodeExpression {\n\tif in == nil {\n\t\treturn nil\n\t}\n\n\tswitch in := in.(type) {\n\n\tcase *ast.ArrayLiteral:\n\t\tout := &_nodeArrayLiteral{\n\t\t\tvalue: make([]_nodeExpression, len(in.Value)),\n\t\t}\n\t\tfor i, value := range in.Value {\n\t\t\tout.value[i] = cmpl.parseExpression(value)\n\t\t}\n\t\treturn out\n\n\tcase *ast.AssignExpression:\n\t\treturn &_nodeAssignExpression{\n\t\t\toperator: in.Operator,\n\t\t\tleft:     cmpl.parseExpression(in.Left),\n\t\t\tright:    cmpl.parseExpression(in.Right),\n\t\t}\n\n\tcase *ast.BinaryExpression:\n\t\treturn &_nodeBinaryExpression{\n\t\t\toperator:   in.Operator,\n\t\t\tleft:       cmpl.parseExpression(in.Left),\n\t\t\tright:      cmpl.parseExpression(in.Right),\n\t\t\tcomparison: in.Comparison,\n\t\t}\n\n\tcase *ast.BooleanLiteral:\n\t\tif in.Value {\n\t\t\treturn trueLiteral\n\t\t}\n\t\treturn falseLiteral\n\n\tcase *ast.BracketExpression:\n\t\treturn &_nodeBracketExpression{\n\t\t\tidx:    in.Left.Idx0(),\n\t\t\tleft:   cmpl.parseExpression(in.Left),\n\t\t\tmember: cmpl.parseExpression(in.Member),\n\t\t}\n\n\tcase *ast.CallExpression:\n\t\tout := &_nodeCallExpression{\n\t\t\tcallee:       cmpl.parseExpression(in.Callee),\n\t\t\targumentList: make([]_nodeExpression, len(in.ArgumentList)),\n\t\t}\n\t\tfor i, value := range in.ArgumentList {\n\t\t\tout.argumentList[i] = cmpl.parseExpression(value)\n\t\t}\n\t\treturn out\n\n\tcase *ast.ConditionalExpression:\n\t\treturn &_nodeConditionalExpression{\n\t\t\ttest:       cmpl.parseExpression(in.Test),\n\t\t\tconsequent: cmpl.parseExpression(in.Consequent),\n\t\t\talternate:  cmpl.parseExpression(in.Alternate),\n\t\t}\n\n\tcase *ast.DotExpression:\n\t\treturn &_nodeDotExpression{\n\t\t\tidx:        in.Left.Idx0(),\n\t\t\tleft:       cmpl.parseExpression(in.Left),\n\t\t\tidentifier: in.Identifier.Name,\n\t\t}\n\n\tcase *ast.EmptyExpression:\n\t\treturn nil\n\n\tcase *ast.FunctionLiteral:\n\t\tname := \"\"\n\t\tif in.Name != nil {\n\t\t\tname = in.Name.Name\n\t\t}\n\t\tout := &_nodeFunctionLiteral{\n\t\t\tname:   name,\n\t\t\tbody:   cmpl.parseStatement(in.Body),\n\t\t\tsource: in.Source,\n\t\t\tfile:   cmpl.file,\n\t\t}\n\t\tif in.ParameterList != nil {\n\t\t\tlist := in.ParameterList.List\n\t\t\tout.parameterList = make([]string, len(list))\n\t\t\tfor i, value := range list {\n\t\t\t\tout.parameterList[i] = value.Name\n\t\t\t}\n\t\t}\n\t\tfor _, value := range in.DeclarationList {\n\t\t\tswitch value := value.(type) {\n\t\t\tcase *ast.FunctionDeclaration:\n\t\t\t\tout.functionList = append(out.functionList, cmpl.parseExpression(value.Function).(*_nodeFunctionLiteral))\n\t\t\tcase *ast.VariableDeclaration:\n\t\t\t\tfor _, value := range value.List {\n\t\t\t\t\tout.varList = append(out.varList, value.Name)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpanic(fmt.Errorf(\"Here be dragons: parseProgram.declaration(%T)\", value))\n\t\t\t}\n\t\t}\n\t\treturn out\n\n\tcase *ast.Identifier:\n\t\treturn &_nodeIdentifier{\n\t\t\tidx:  in.Idx,\n\t\t\tname: in.Name,\n\t\t}\n\n\tcase *ast.NewExpression:\n\t\tout := &_nodeNewExpression{\n\t\t\tcallee:       cmpl.parseExpression(in.Callee),\n\t\t\targumentList: make([]_nodeExpression, len(in.ArgumentList)),\n\t\t}\n\t\tfor i, value := range in.ArgumentList {\n\t\t\tout.argumentList[i] = cmpl.parseExpression(value)\n\t\t}\n\t\treturn out\n\n\tcase *ast.NullLiteral:\n\t\treturn nullLiteral\n\n\tcase *ast.NumberLiteral:\n\t\treturn &_nodeLiteral{\n\t\t\tvalue: toValue(in.Value),\n\t\t}\n\n\tcase *ast.ObjectLiteral:\n\t\tout := &_nodeObjectLiteral{\n\t\t\tvalue: make([]_nodeProperty, len(in.Value)),\n\t\t}\n\t\tfor i, value := range in.Value {\n\t\t\tout.value[i] = _nodeProperty{\n\t\t\t\tkey:   value.Key,\n\t\t\t\tkind:  value.Kind,\n\t\t\t\tvalue: cmpl.parseExpression(value.Value),\n\t\t\t}\n\t\t}\n\t\treturn out\n\n\tcase *ast.RegExpLiteral:\n\t\treturn &_nodeRegExpLiteral{\n\t\t\tflags:   in.Flags,\n\t\t\tpattern: in.Pattern,\n\t\t}\n\n\tcase *ast.SequenceExpression:\n\t\tout := &_nodeSequenceExpression{\n\t\t\tsequence: make([]_nodeExpression, len(in.Sequence)),\n\t\t}\n\t\tfor i, value := range in.Sequence {\n\t\t\tout.sequence[i] = cmpl.parseExpression(value)\n\t\t}\n\t\treturn out\n\n\tcase *ast.StringLiteral:\n\t\treturn &_nodeLiteral{\n\t\t\tvalue: toValue_string(in.Value),\n\t\t}\n\n\tcase *ast.ThisExpression:\n\t\treturn &_nodeThisExpression{}\n\n\tcase *ast.UnaryExpression:\n\t\treturn &_nodeUnaryExpression{\n\t\t\toperator: in.Operator,\n\t\t\toperand:  cmpl.parseExpression(in.Operand),\n\t\t\tpostfix:  in.Postfix,\n\t\t}\n\n\tcase *ast.VariableExpression:\n\t\treturn &_nodeVariableExpression{\n\t\t\tidx:         in.Idx0(),\n\t\t\tname:        in.Name,\n\t\t\tinitializer: cmpl.parseExpression(in.Initializer),\n\t\t}\n\n\t}\n\n\tpanic(fmt.Errorf(\"Here be dragons: cmpl.parseExpression(%T)\", in))\n}\n\nfunc (cmpl *_compiler) parseStatement(in ast.Statement) _nodeStatement {\n\tif in == nil {\n\t\treturn nil\n\t}\n\n\tswitch in := in.(type) {\n\n\tcase *ast.BlockStatement:\n\t\tout := &_nodeBlockStatement{\n\t\t\tlist: make([]_nodeStatement, len(in.List)),\n\t\t}\n\t\tfor i, value := range in.List {\n\t\t\tout.list[i] = cmpl.parseStatement(value)\n\t\t}\n\t\treturn out\n\n\tcase *ast.BranchStatement:\n\t\tout := &_nodeBranchStatement{\n\t\t\tbranch: in.Token,\n\t\t}\n\t\tif in.Label != nil {\n\t\t\tout.label = in.Label.Name\n\t\t}\n\t\treturn out\n\n\tcase *ast.DebuggerStatement:\n\t\treturn &_nodeDebuggerStatement{}\n\n\tcase *ast.DoWhileStatement:\n\t\tout := &_nodeDoWhileStatement{\n\t\t\ttest: cmpl.parseExpression(in.Test),\n\t\t}\n\t\tbody := cmpl.parseStatement(in.Body)\n\t\tif block, ok := body.(*_nodeBlockStatement); ok {\n\t\t\tout.body = block.list\n\t\t} else {\n\t\t\tout.body = append(out.body, body)\n\t\t}\n\t\treturn out\n\n\tcase *ast.EmptyStatement:\n\t\treturn emptyStatement\n\n\tcase *ast.ExpressionStatement:\n\t\treturn &_nodeExpressionStatement{\n\t\t\texpression: cmpl.parseExpression(in.Expression),\n\t\t}\n\n\tcase *ast.ForInStatement:\n\t\tout := &_nodeForInStatement{\n\t\t\tinto:   cmpl.parseExpression(in.Into),\n\t\t\tsource: cmpl.parseExpression(in.Source),\n\t\t}\n\t\tbody := cmpl.parseStatement(in.Body)\n\t\tif block, ok := body.(*_nodeBlockStatement); ok {\n\t\t\tout.body = block.list\n\t\t} else {\n\t\t\tout.body = append(out.body, body)\n\t\t}\n\t\treturn out\n\n\tcase *ast.ForStatement:\n\t\tout := &_nodeForStatement{\n\t\t\tinitializer: cmpl.parseExpression(in.Initializer),\n\t\t\tupdate:      cmpl.parseExpression(in.Update),\n\t\t\ttest:        cmpl.parseExpression(in.Test),\n\t\t}\n\t\tbody := cmpl.parseStatement(in.Body)\n\t\tif block, ok := body.(*_nodeBlockStatement); ok {\n\t\t\tout.body = block.list\n\t\t} else {\n\t\t\tout.body = append(out.body, body)\n\t\t}\n\t\treturn out\n\n\tcase *ast.FunctionStatement:\n\t\treturn emptyStatement\n\n\tcase *ast.IfStatement:\n\t\treturn &_nodeIfStatement{\n\t\t\ttest:       cmpl.parseExpression(in.Test),\n\t\t\tconsequent: cmpl.parseStatement(in.Consequent),\n\t\t\talternate:  cmpl.parseStatement(in.Alternate),\n\t\t}\n\n\tcase *ast.LabelledStatement:\n\t\treturn &_nodeLabelledStatement{\n\t\t\tlabel:     in.Label.Name,\n\t\t\tstatement: cmpl.parseStatement(in.Statement),\n\t\t}\n\n\tcase *ast.ReturnStatement:\n\t\treturn &_nodeReturnStatement{\n\t\t\targument: cmpl.parseExpression(in.Argument),\n\t\t}\n\n\tcase *ast.SwitchStatement:\n\t\tout := &_nodeSwitchStatement{\n\t\t\tdiscriminant: cmpl.parseExpression(in.Discriminant),\n\t\t\tdefault_:     in.Default,\n\t\t\tbody:         make([]*_nodeCaseStatement, len(in.Body)),\n\t\t}\n\t\tfor i, clause := range in.Body {\n\t\t\tout.body[i] = &_nodeCaseStatement{\n\t\t\t\ttest:       cmpl.parseExpression(clause.Test),\n\t\t\t\tconsequent: make([]_nodeStatement, len(clause.Consequent)),\n\t\t\t}\n\t\t\tfor j, value := range clause.Consequent {\n\t\t\t\tout.body[i].consequent[j] = cmpl.parseStatement(value)\n\t\t\t}\n\t\t}\n\t\treturn out\n\n\tcase *ast.ThrowStatement:\n\t\treturn &_nodeThrowStatement{\n\t\t\targument: cmpl.parseExpression(in.Argument),\n\t\t}\n\n\tcase *ast.TryStatement:\n\t\tout := &_nodeTryStatement{\n\t\t\tbody:    cmpl.parseStatement(in.Body),\n\t\t\tfinally: cmpl.parseStatement(in.Finally),\n\t\t}\n\t\tif in.Catch != nil {\n\t\t\tout.catch = &_nodeCatchStatement{\n\t\t\t\tparameter: in.Catch.Parameter.Name,\n\t\t\t\tbody:      cmpl.parseStatement(in.Catch.Body),\n\t\t\t}\n\t\t}\n\t\treturn out\n\n\tcase *ast.VariableStatement:\n\t\tout := &_nodeVariableStatement{\n\t\t\tlist: make([]_nodeExpression, len(in.List)),\n\t\t}\n\t\tfor i, value := range in.List {\n\t\t\tout.list[i] = cmpl.parseExpression(value)\n\t\t}\n\t\treturn out\n\n\tcase *ast.WhileStatement:\n\t\tout := &_nodeWhileStatement{\n\t\t\ttest: cmpl.parseExpression(in.Test),\n\t\t}\n\t\tbody := cmpl.parseStatement(in.Body)\n\t\tif block, ok := body.(*_nodeBlockStatement); ok {\n\t\t\tout.body = block.list\n\t\t} else {\n\t\t\tout.body = append(out.body, body)\n\t\t}\n\t\treturn out\n\n\tcase *ast.WithStatement:\n\t\treturn &_nodeWithStatement{\n\t\t\tobject: cmpl.parseExpression(in.Object),\n\t\t\tbody:   cmpl.parseStatement(in.Body),\n\t\t}\n\n\t}\n\n\tpanic(fmt.Errorf(\"Here be dragons: cmpl.parseStatement(%T)\", in))\n}\n\nfunc cmpl_parse(in *ast.Program) *_nodeProgram {\n\tcmpl := _compiler{\n\t\tprogram: in,\n\t}\n\treturn cmpl.parse()\n}\n\nfunc (cmpl *_compiler) _parse(in *ast.Program) *_nodeProgram {\n\tout := &_nodeProgram{\n\t\tbody: make([]_nodeStatement, len(in.Body)),\n\t\tfile: in.File,\n\t}\n\tfor i, value := range in.Body {\n\t\tout.body[i] = cmpl.parseStatement(value)\n\t}\n\tfor _, value := range in.DeclarationList {\n\t\tswitch value := value.(type) {\n\t\tcase *ast.FunctionDeclaration:\n\t\t\tout.functionList = append(out.functionList, cmpl.parseExpression(value.Function).(*_nodeFunctionLiteral))\n\t\tcase *ast.VariableDeclaration:\n\t\t\tfor _, value := range value.List {\n\t\t\t\tout.varList = append(out.varList, value.Name)\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(fmt.Errorf(\"Here be dragons: cmpl.parseProgram.DeclarationList(%T)\", value))\n\t\t}\n\t}\n\treturn out\n}\n\ntype _nodeProgram struct {\n\tbody []_nodeStatement\n\n\tvarList      []string\n\tfunctionList []*_nodeFunctionLiteral\n\n\tvariableList []_nodeDeclaration\n\n\tfile *file.File\n}\n\ntype _nodeDeclaration struct {\n\tname       string\n\tdefinition _node\n}\n\ntype _node interface {\n}\n\ntype (\n\t_nodeExpression interface {\n\t\t_node\n\t\t_expressionNode()\n\t}\n\n\t_nodeArrayLiteral struct {\n\t\tvalue []_nodeExpression\n\t}\n\n\t_nodeAssignExpression struct {\n\t\toperator token.Token\n\t\tleft     _nodeExpression\n\t\tright    _nodeExpression\n\t}\n\n\t_nodeBinaryExpression struct {\n\t\toperator   token.Token\n\t\tleft       _nodeExpression\n\t\tright      _nodeExpression\n\t\tcomparison bool\n\t}\n\n\t_nodeBracketExpression struct {\n\t\tidx    file.Idx\n\t\tleft   _nodeExpression\n\t\tmember _nodeExpression\n\t}\n\n\t_nodeCallExpression struct {\n\t\tcallee       _nodeExpression\n\t\targumentList []_nodeExpression\n\t}\n\n\t_nodeConditionalExpression struct {\n\t\ttest       _nodeExpression\n\t\tconsequent _nodeExpression\n\t\talternate  _nodeExpression\n\t}\n\n\t_nodeDotExpression struct {\n\t\tidx        file.Idx\n\t\tleft       _nodeExpression\n\t\tidentifier string\n\t}\n\n\t_nodeFunctionLiteral struct {\n\t\tname          string\n\t\tbody          _nodeStatement\n\t\tsource        string\n\t\tparameterList []string\n\t\tvarList       []string\n\t\tfunctionList  []*_nodeFunctionLiteral\n\t\tfile          *file.File\n\t}\n\n\t_nodeIdentifier struct {\n\t\tidx  file.Idx\n\t\tname string\n\t}\n\n\t_nodeLiteral struct {\n\t\tvalue Value\n\t}\n\n\t_nodeNewExpression struct {\n\t\tcallee       _nodeExpression\n\t\targumentList []_nodeExpression\n\t}\n\n\t_nodeObjectLiteral struct {\n\t\tvalue []_nodeProperty\n\t}\n\n\t_nodeProperty struct {\n\t\tkey   string\n\t\tkind  string\n\t\tvalue _nodeExpression\n\t}\n\n\t_nodeRegExpLiteral struct {\n\t\tflags   string\n\t\tpattern string // Value?\n\t\tregexp  *regexp.Regexp\n\t}\n\n\t_nodeSequenceExpression struct {\n\t\tsequence []_nodeExpression\n\t}\n\n\t_nodeThisExpression struct {\n\t}\n\n\t_nodeUnaryExpression struct {\n\t\toperator token.Token\n\t\toperand  _nodeExpression\n\t\tpostfix  bool\n\t}\n\n\t_nodeVariableExpression struct {\n\t\tidx         file.Idx\n\t\tname        string\n\t\tinitializer _nodeExpression\n\t}\n)\n\ntype (\n\t_nodeStatement interface {\n\t\t_node\n\t\t_statementNode()\n\t}\n\n\t_nodeBlockStatement struct {\n\t\tlist []_nodeStatement\n\t}\n\n\t_nodeBranchStatement struct {\n\t\tbranch token.Token\n\t\tlabel  string\n\t}\n\n\t_nodeCaseStatement struct {\n\t\ttest       _nodeExpression\n\t\tconsequent []_nodeStatement\n\t}\n\n\t_nodeCatchStatement struct {\n\t\tparameter string\n\t\tbody      _nodeStatement\n\t}\n\n\t_nodeDebuggerStatement struct {\n\t}\n\n\t_nodeDoWhileStatement struct {\n\t\ttest _nodeExpression\n\t\tbody []_nodeStatement\n\t}\n\n\t_nodeEmptyStatement struct {\n\t}\n\n\t_nodeExpressionStatement struct {\n\t\texpression _nodeExpression\n\t}\n\n\t_nodeForInStatement struct {\n\t\tinto   _nodeExpression\n\t\tsource _nodeExpression\n\t\tbody   []_nodeStatement\n\t}\n\n\t_nodeForStatement struct {\n\t\tinitializer _nodeExpression\n\t\tupdate      _nodeExpression\n\t\ttest        _nodeExpression\n\t\tbody        []_nodeStatement\n\t}\n\n\t_nodeIfStatement struct {\n\t\ttest       _nodeExpression\n\t\tconsequent _nodeStatement\n\t\talternate  _nodeStatement\n\t}\n\n\t_nodeLabelledStatement struct {\n\t\tlabel     string\n\t\tstatement _nodeStatement\n\t}\n\n\t_nodeReturnStatement struct {\n\t\targument _nodeExpression\n\t}\n\n\t_nodeSwitchStatement struct {\n\t\tdiscriminant _nodeExpression\n\t\tdefault_     int\n\t\tbody         []*_nodeCaseStatement\n\t}\n\n\t_nodeThrowStatement struct {\n\t\targument _nodeExpression\n\t}\n\n\t_nodeTryStatement struct {\n\t\tbody    _nodeStatement\n\t\tcatch   *_nodeCatchStatement\n\t\tfinally _nodeStatement\n\t}\n\n\t_nodeVariableStatement struct {\n\t\tlist []_nodeExpression\n\t}\n\n\t_nodeWhileStatement struct {\n\t\ttest _nodeExpression\n\t\tbody []_nodeStatement\n\t}\n\n\t_nodeWithStatement struct {\n\t\tobject _nodeExpression\n\t\tbody   _nodeStatement\n\t}\n)\n\n// _expressionNode\n\nfunc (*_nodeArrayLiteral) _expressionNode()          {}\nfunc (*_nodeAssignExpression) _expressionNode()      {}\nfunc (*_nodeBinaryExpression) _expressionNode()      {}\nfunc (*_nodeBracketExpression) _expressionNode()     {}\nfunc (*_nodeCallExpression) _expressionNode()        {}\nfunc (*_nodeConditionalExpression) _expressionNode() {}\nfunc (*_nodeDotExpression) _expressionNode()         {}\nfunc (*_nodeFunctionLiteral) _expressionNode()       {}\nfunc (*_nodeIdentifier) _expressionNode()            {}\nfunc (*_nodeLiteral) _expressionNode()               {}\nfunc (*_nodeNewExpression) _expressionNode()         {}\nfunc (*_nodeObjectLiteral) _expressionNode()         {}\nfunc (*_nodeRegExpLiteral) _expressionNode()         {}\nfunc (*_nodeSequenceExpression) _expressionNode()    {}\nfunc (*_nodeThisExpression) _expressionNode()        {}\nfunc (*_nodeUnaryExpression) _expressionNode()       {}\nfunc (*_nodeVariableExpression) _expressionNode()    {}\n\n// _statementNode\n\nfunc (*_nodeBlockStatement) _statementNode()      {}\nfunc (*_nodeBranchStatement) _statementNode()     {}\nfunc (*_nodeCaseStatement) _statementNode()       {}\nfunc (*_nodeCatchStatement) _statementNode()      {}\nfunc (*_nodeDebuggerStatement) _statementNode()   {}\nfunc (*_nodeDoWhileStatement) _statementNode()    {}\nfunc (*_nodeEmptyStatement) _statementNode()      {}\nfunc (*_nodeExpressionStatement) _statementNode() {}\nfunc (*_nodeForInStatement) _statementNode()      {}\nfunc (*_nodeForStatement) _statementNode()        {}\nfunc (*_nodeIfStatement) _statementNode()         {}\nfunc (*_nodeLabelledStatement) _statementNode()   {}\nfunc (*_nodeReturnStatement) _statementNode()     {}\nfunc (*_nodeSwitchStatement) _statementNode()     {}\nfunc (*_nodeThrowStatement) _statementNode()      {}\nfunc (*_nodeTryStatement) _statementNode()        {}\nfunc (*_nodeVariableStatement) _statementNode()   {}\nfunc (*_nodeWhileStatement) _statementNode()      {}\nfunc (*_nodeWithStatement) _statementNode()       {}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/console.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc formatForConsole(argumentList []Value) string {\n\toutput := []string{}\n\tfor _, argument := range argumentList {\n\t\toutput = append(output, fmt.Sprintf(\"%v\", argument))\n\t}\n\treturn strings.Join(output, \" \")\n}\n\nfunc builtinConsole_log(call FunctionCall) Value {\n\tfmt.Fprintln(os.Stdout, formatForConsole(call.ArgumentList))\n\treturn Value{}\n}\n\nfunc builtinConsole_error(call FunctionCall) Value {\n\tfmt.Fprintln(os.Stdout, formatForConsole(call.ArgumentList))\n\treturn Value{}\n}\n\n// Nothing happens.\nfunc builtinConsole_dir(call FunctionCall) Value {\n\treturn Value{}\n}\n\nfunc builtinConsole_time(call FunctionCall) Value {\n\treturn Value{}\n}\n\nfunc builtinConsole_timeEnd(call FunctionCall) Value {\n\treturn Value{}\n}\n\nfunc builtinConsole_trace(call FunctionCall) Value {\n\treturn Value{}\n}\n\nfunc builtinConsole_assert(call FunctionCall) Value {\n\treturn Value{}\n}\n\nfunc (runtime *_runtime) newConsole() *_object {\n\n\treturn newConsoleObject(runtime)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/dbg/dbg.go",
    "content": "// This file was AUTOMATICALLY GENERATED by dbg-import (smuggol) from github.com/robertkrimen/dbg\n\n/*\nPackage dbg is a println/printf/log-debugging utility library.\n\n    import (\n        Dbg \"github.com/robertkrimen/dbg\"\n    )\n\n    dbg, dbgf := Dbg.New()\n\n    dbg(\"Emit some debug stuff\", []byte{120, 121, 122, 122, 121}, math.Pi)\n    # \"2013/01/28 16:50:03 Emit some debug stuff [120 121 122 122 121] 3.141592653589793\"\n\n    dbgf(\"With a %s formatting %.2f\", \"little\", math.Pi)\n    # \"2013/01/28 16:51:55 With a little formatting (3.14)\"\n\n    dbgf(\"%/fatal//A fatal debug statement: should not be here\")\n    # \"A fatal debug statement: should not be here\"\n    # ...and then, os.Exit(1)\n\n    dbgf(\"%/panic//Can also panic %s\", \"this\")\n    # \"Can also panic this\"\n    # ...as a panic, equivalent to: panic(\"Can also panic this\")\n\n    dbgf(\"Any %s arguments without a corresponding %%\", \"extra\", \"are treated like arguments to dbg()\")\n    # \"2013/01/28 17:14:40 Any extra arguments (without a corresponding %) are treated like arguments to dbg()\"\n\n    dbgf(\"%d %d\", 1, 2, 3, 4, 5)\n    # \"2013/01/28 17:16:32 Another example: 1 2 3 4 5\"\n\n    dbgf(\"%@: Include the function name for a little context (via %s)\", \"%@\")\n    # \"2013... github.com/robertkrimen/dbg.TestSynopsis: Include the function name for a little context (via %@)\"\n\nBy default, dbg uses log (log.Println, log.Printf, log.Panic, etc.) for output.\nHowever, you can also provide your own output destination by invoking dbg.New with\na customization function:\n\n    import (\n        \"bytes\"\n        Dbg \"github.com/robertkrimen/dbg\"\n        \"os\"\n    )\n\n    # dbg to os.Stderr\n    dbg, dbgf := Dbg.New(func(dbgr *Dbgr) {\n        dbgr.SetOutput(os.Stderr)\n    })\n\n    # A slightly contrived example:\n    var buffer bytes.Buffer\n    dbg, dbgf := New(func(dbgr *Dbgr) {\n        dbgr.SetOutput(&buffer)\n    })\n\n*/\npackage dbg\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"unicode\"\n)\n\ntype _frmt struct {\n\tctl          string\n\tformat       string\n\toperandCount int\n\tpanic        bool\n\tfatal        bool\n\tcheck        bool\n}\n\nvar (\n\tctlTest = regexp.MustCompile(`^\\s*%/`)\n\tctlScan = regexp.MustCompile(`%?/(panic|fatal|check)(?:\\s|$)`)\n)\n\nfunc operandCount(format string) int {\n\tcount := 0\n\tend := len(format)\n\tfor at := 0; at < end; {\n\t\tfor at < end && format[at] != '%' {\n\t\t\tat++\n\t\t}\n\t\tat++\n\t\tif at < end {\n\t\t\tif format[at] != '%' && format[at] != '@' {\n\t\t\t\tcount++\n\t\t\t}\n\t\t\tat++\n\t\t}\n\t}\n\treturn count\n}\n\nfunc parseFormat(format string) (frmt _frmt) {\n\tif ctlTest.MatchString(format) {\n\t\tformat = strings.TrimLeftFunc(format, unicode.IsSpace)\n\t\tindex := strings.Index(format, \"//\")\n\t\tif index != -1 {\n\t\t\tfrmt.ctl = format[0:index]\n\t\t\tformat = format[index+2:] // Skip the second slash via +2 (instead of +1)\n\t\t} else {\n\t\t\tfrmt.ctl = format\n\t\t\tformat = \"\"\n\t\t}\n\t\tfor _, tmp := range ctlScan.FindAllStringSubmatch(frmt.ctl, -1) {\n\t\t\tfor _, value := range tmp[1:] {\n\t\t\t\tswitch value {\n\t\t\t\tcase \"panic\":\n\t\t\t\t\tfrmt.panic = true\n\t\t\t\tcase \"fatal\":\n\t\t\t\t\tfrmt.fatal = true\n\t\t\t\tcase \"check\":\n\t\t\t\t\tfrmt.check = true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfrmt.format = format\n\tfrmt.operandCount = operandCount(format)\n\treturn\n}\n\ntype Dbgr struct {\n\temit _emit\n}\n\ntype DbgFunction func(values ...interface{})\n\nfunc NewDbgr() *Dbgr {\n\tself := &Dbgr{}\n\treturn self\n}\n\n/*\nNew will create and return a pair of debugging functions. You can customize where\nthey output to by passing in an (optional) customization function:\n\n    import (\n        Dbg \"github.com/robertkrimen/dbg\"\n        \"os\"\n    )\n\n    # dbg to os.Stderr\n    dbg, dbgf := Dbg.New(func(dbgr *Dbgr) {\n        dbgr.SetOutput(os.Stderr)\n    })\n\n*/\nfunc New(options ...interface{}) (dbg DbgFunction, dbgf DbgFunction) {\n\tdbgr := NewDbgr()\n\tif len(options) > 0 {\n\t\tif fn, ok := options[0].(func(*Dbgr)); ok {\n\t\t\tfn(dbgr)\n\t\t}\n\t}\n\treturn dbgr.DbgDbgf()\n}\n\nfunc (self Dbgr) Dbg(values ...interface{}) {\n\tself.getEmit().emit(_frmt{}, \"\", values...)\n}\n\nfunc (self Dbgr) Dbgf(values ...interface{}) {\n\tself.dbgf(values...)\n}\n\nfunc (self Dbgr) DbgDbgf() (dbg DbgFunction, dbgf DbgFunction) {\n\tdbg = func(vl ...interface{}) {\n\t\tself.Dbg(vl...)\n\t}\n\tdbgf = func(vl ...interface{}) {\n\t\tself.dbgf(vl...)\n\t}\n\treturn dbg, dbgf // Redundant, but...\n}\n\nfunc (self Dbgr) dbgf(values ...interface{}) {\n\n\tvar frmt _frmt\n\tif len(values) > 0 {\n\t\ttmp := fmt.Sprint(values[0])\n\t\tfrmt = parseFormat(tmp)\n\t\tvalues = values[1:]\n\t}\n\n\tbuffer_f := bytes.Buffer{}\n\tformat := frmt.format\n\tend := len(format)\n\tfor at := 0; at < end; {\n\t\tlast := at\n\t\tfor at < end && format[at] != '%' {\n\t\t\tat++\n\t\t}\n\t\tif at > last {\n\t\t\tbuffer_f.WriteString(format[last:at])\n\t\t}\n\t\tif at >= end {\n\t\t\tbreak\n\t\t}\n\t\t// format[at] == '%'\n\t\tat++\n\t\t// format[at] == ?\n\t\tif format[at] == '@' {\n\t\t\tdepth := 2\n\t\t\tpc, _, _, _ := runtime.Caller(depth)\n\t\t\tname := runtime.FuncForPC(pc).Name()\n\t\t\tbuffer_f.WriteString(name)\n\t\t} else {\n\t\t\tbuffer_f.WriteString(format[at-1 : at+1])\n\t\t}\n\t\tat++\n\t}\n\n\t//values_f := append([]interface{}{}, values[0:frmt.operandCount]...)\n\tvalues_f := values[0:frmt.operandCount]\n\tvalues_dbg := values[frmt.operandCount:]\n\tif len(values_dbg) > 0 {\n\t\t// Adjust frmt.format:\n\t\t// (%v instead of %s because: frmt.check)\n\t\t{\n\t\t\ttmp := format\n\t\t\tif len(tmp) > 0 {\n\t\t\t\tif unicode.IsSpace(rune(tmp[len(tmp)-1])) {\n\t\t\t\t\tbuffer_f.WriteString(\"%v\")\n\t\t\t\t} else {\n\t\t\t\t\tbuffer_f.WriteString(\" %v\")\n\t\t\t\t}\n\t\t\t} else if frmt.check {\n\t\t\t\t// Performing a check, so no output\n\t\t\t} else {\n\t\t\t\tbuffer_f.WriteString(\"%v\")\n\t\t\t}\n\t\t}\n\n\t\t// Adjust values_f:\n\t\tif !frmt.check {\n\t\t\ttmp := []string{}\n\t\t\tfor _, value := range values_dbg {\n\t\t\t\ttmp = append(tmp, fmt.Sprintf(\"%v\", value))\n\t\t\t}\n\t\t\t// First, make a copy of values_f, so we avoid overwriting values_dbg when appending\n\t\t\tvalues_f = append([]interface{}{}, values_f...)\n\t\t\tvalues_f = append(values_f, strings.Join(tmp, \" \"))\n\t\t}\n\t}\n\n\tformat = buffer_f.String()\n\tif frmt.check {\n\t\t// We do not actually emit to the log, but panic if\n\t\t// a non-nil value is detected (e.g. a non-nil error)\n\t\tfor _, value := range values_dbg {\n\t\t\tif value != nil {\n\t\t\t\tif format == \"\" {\n\t\t\t\t\tpanic(value)\n\t\t\t\t} else {\n\t\t\t\t\tpanic(fmt.Sprintf(format, append(values_f, value)...))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tself.getEmit().emit(frmt, format, values_f...)\n\t}\n}\n\n// Idiot-proof &Dbgr{}, etc.\nfunc (self *Dbgr) getEmit() _emit {\n\tif self.emit == nil {\n\t\tself.emit = standardEmit()\n\t}\n\treturn self.emit\n}\n\n// SetOutput will accept the following as a destination for output:\n//\n//      *log.Logger         Print*/Panic*/Fatal* of the logger\n//      io.Writer           -\n//      nil                 Reset to the default output (os.Stderr)\n//      \"log\"               Print*/Panic*/Fatal* via the \"log\" package\n//\nfunc (self *Dbgr) SetOutput(output interface{}) {\n\tif output == nil {\n\t\tself.emit = standardEmit()\n\t\treturn\n\t}\n\tswitch output := output.(type) {\n\tcase *log.Logger:\n\t\tself.emit = _emitLogger{\n\t\t\tlogger: output,\n\t\t}\n\t\treturn\n\tcase io.Writer:\n\t\tself.emit = _emitWriter{\n\t\t\twriter: output,\n\t\t}\n\t\treturn\n\tcase string:\n\t\tif output == \"log\" {\n\t\t\tself.emit = _emitLog{}\n\t\t\treturn\n\t\t}\n\t}\n\tpanic(output)\n}\n\n// ======== //\n// = emit = //\n// ======== //\n\nfunc standardEmit() _emit {\n\treturn _emitWriter{\n\t\twriter: os.Stderr,\n\t}\n}\n\nfunc ln(tmp string) string {\n\tlength := len(tmp)\n\tif length > 0 && tmp[length-1] != '\\n' {\n\t\treturn tmp + \"\\n\"\n\t}\n\treturn tmp\n}\n\ntype _emit interface {\n\temit(_frmt, string, ...interface{})\n}\n\ntype _emitWriter struct {\n\twriter io.Writer\n}\n\nfunc (self _emitWriter) emit(frmt _frmt, format string, values ...interface{}) {\n\tif format == \"\" {\n\t\tfmt.Fprintln(self.writer, values...)\n\t} else {\n\t\tif frmt.panic {\n\t\t\tpanic(fmt.Sprintf(format, values...))\n\t\t}\n\t\tfmt.Fprintf(self.writer, ln(format), values...)\n\t\tif frmt.fatal {\n\t\t\tos.Exit(1)\n\t\t}\n\t}\n}\n\ntype _emitLogger struct {\n\tlogger *log.Logger\n}\n\nfunc (self _emitLogger) emit(frmt _frmt, format string, values ...interface{}) {\n\tif format == \"\" {\n\t\tself.logger.Println(values...)\n\t} else {\n\t\tif frmt.panic {\n\t\t\tself.logger.Panicf(format, values...)\n\t\t} else if frmt.fatal {\n\t\t\tself.logger.Fatalf(format, values...)\n\t\t} else {\n\t\t\tself.logger.Printf(format, values...)\n\t\t}\n\t}\n}\n\ntype _emitLog struct {\n}\n\nfunc (self _emitLog) emit(frmt _frmt, format string, values ...interface{}) {\n\tif format == \"\" {\n\t\tlog.Println(values...)\n\t} else {\n\t\tif frmt.panic {\n\t\t\tlog.Panicf(format, values...)\n\t\t} else if frmt.fatal {\n\t\t\tlog.Fatalf(format, values...)\n\t\t} else {\n\t\t\tlog.Printf(format, values...)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/dbg.go",
    "content": "// This file was AUTOMATICALLY GENERATED by dbg-import (smuggol) for github.com/robertkrimen/dbg\n\npackage otto\n\nimport (\n\tDbg \"github.com/robertkrimen/otto/dbg\"\n)\n\nvar dbg, dbgf = Dbg.New()\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/error.go",
    "content": "package otto\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/robertkrimen/otto/file\"\n)\n\ntype _exception struct {\n\tvalue interface{}\n}\n\nfunc newException(value interface{}) *_exception {\n\treturn &_exception{\n\t\tvalue: value,\n\t}\n}\n\nfunc (self *_exception) eject() interface{} {\n\tvalue := self.value\n\tself.value = nil // Prevent Go from holding on to the value, whatever it is\n\treturn value\n}\n\ntype _error struct {\n\tname    string\n\tmessage string\n\ttrace   []_frame\n\n\toffset int\n}\n\nfunc (err _error) format() string {\n\tif len(err.name) == 0 {\n\t\treturn err.message\n\t}\n\tif len(err.message) == 0 {\n\t\treturn err.name\n\t}\n\treturn fmt.Sprintf(\"%s: %s\", err.name, err.message)\n}\n\nfunc (err _error) formatWithStack() string {\n\tstr := err.format() + \"\\n\"\n\tfor _, frame := range err.trace {\n\t\tstr += \"    at \" + frame.location() + \"\\n\"\n\t}\n\treturn str\n}\n\ntype _frame struct {\n\tnative     bool\n\tnativeFile string\n\tnativeLine int\n\tfile       *file.File\n\toffset     int\n\tcallee     string\n}\n\nvar (\n\tnativeFrame = _frame{}\n)\n\ntype _at int\n\nfunc (fr _frame) location() string {\n\tstr := \"<unknown>\"\n\n\tswitch {\n\tcase fr.native:\n\t\tstr = \"<native code>\"\n\t\tif fr.nativeFile != \"\" && fr.nativeLine != 0 {\n\t\t\tstr = fmt.Sprintf(\"%s:%d\", fr.nativeFile, fr.nativeLine)\n\t\t}\n\tcase fr.file != nil:\n\t\tif p := fr.file.Position(file.Idx(fr.offset)); p != nil {\n\t\t\tpath, line, column := p.Filename, p.Line, p.Column\n\n\t\t\tif path == \"\" {\n\t\t\t\tpath = \"<anonymous>\"\n\t\t\t}\n\n\t\t\tstr = fmt.Sprintf(\"%s:%d:%d\", path, line, column)\n\t\t}\n\t}\n\n\tif fr.callee != \"\" {\n\t\tstr = fmt.Sprintf(\"%s (%s)\", fr.callee, str)\n\t}\n\n\treturn str\n}\n\n// An Error represents a runtime error, e.g. a TypeError, a ReferenceError, etc.\ntype Error struct {\n\t_error\n}\n\n// Error returns a description of the error\n//\n//    TypeError: 'def' is not a function\n//\nfunc (err Error) Error() string {\n\treturn err.format()\n}\n\n// String returns a description of the error and a trace of where the\n// error occurred.\n//\n//    TypeError: 'def' is not a function\n//        at xyz (<anonymous>:3:9)\n//        at <anonymous>:7:1/\n//\nfunc (err Error) String() string {\n\treturn err.formatWithStack()\n}\n\nfunc (err _error) describe(format string, in ...interface{}) string {\n\treturn fmt.Sprintf(format, in...)\n}\n\nfunc (self _error) messageValue() Value {\n\tif self.message == \"\" {\n\t\treturn Value{}\n\t}\n\treturn toValue_string(self.message)\n}\n\nfunc (rt *_runtime) typeErrorResult(throw bool) bool {\n\tif throw {\n\t\tpanic(rt.panicTypeError())\n\t}\n\treturn false\n}\n\nfunc newError(rt *_runtime, name string, stackFramesToPop int, in ...interface{}) _error {\n\terr := _error{\n\t\tname:   name,\n\t\toffset: -1,\n\t}\n\tdescription := \"\"\n\tlength := len(in)\n\n\tif rt != nil && rt.scope != nil {\n\t\tscope := rt.scope\n\n\t\tfor i := 0; i < stackFramesToPop; i++ {\n\t\t\tif scope.outer != nil {\n\t\t\t\tscope = scope.outer\n\t\t\t}\n\t\t}\n\n\t\tframe := scope.frame\n\n\t\tif length > 0 {\n\t\t\tif at, ok := in[length-1].(_at); ok {\n\t\t\t\tin = in[0 : length-1]\n\t\t\t\tif scope != nil {\n\t\t\t\t\tframe.offset = int(at)\n\t\t\t\t}\n\t\t\t\tlength--\n\t\t\t}\n\t\t\tif length > 0 {\n\t\t\t\tdescription, in = in[0].(string), in[1:]\n\t\t\t}\n\t\t}\n\n\t\tlimit := rt.traceLimit\n\n\t\terr.trace = append(err.trace, frame)\n\t\tif scope != nil {\n\t\t\tfor scope = scope.outer; scope != nil; scope = scope.outer {\n\t\t\t\tif limit--; limit == 0 {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tif scope.frame.offset >= 0 {\n\t\t\t\t\terr.trace = append(err.trace, scope.frame)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif length > 0 {\n\t\t\tdescription, in = in[0].(string), in[1:]\n\t\t}\n\t}\n\terr.message = err.describe(description, in...)\n\n\treturn err\n}\n\nfunc (rt *_runtime) panicTypeError(argumentList ...interface{}) *_exception {\n\treturn &_exception{\n\t\tvalue: newError(rt, \"TypeError\", 0, argumentList...),\n\t}\n}\n\nfunc (rt *_runtime) panicReferenceError(argumentList ...interface{}) *_exception {\n\treturn &_exception{\n\t\tvalue: newError(rt, \"ReferenceError\", 0, argumentList...),\n\t}\n}\n\nfunc (rt *_runtime) panicURIError(argumentList ...interface{}) *_exception {\n\treturn &_exception{\n\t\tvalue: newError(rt, \"URIError\", 0, argumentList...),\n\t}\n}\n\nfunc (rt *_runtime) panicSyntaxError(argumentList ...interface{}) *_exception {\n\treturn &_exception{\n\t\tvalue: newError(rt, \"SyntaxError\", 0, argumentList...),\n\t}\n}\n\nfunc (rt *_runtime) panicRangeError(argumentList ...interface{}) *_exception {\n\treturn &_exception{\n\t\tvalue: newError(rt, \"RangeError\", 0, argumentList...),\n\t}\n}\n\nfunc catchPanic(function func()) (err error) {\n\tdefer func() {\n\t\tif caught := recover(); caught != nil {\n\t\t\tif exception, ok := caught.(*_exception); ok {\n\t\t\t\tcaught = exception.eject()\n\t\t\t}\n\t\t\tswitch caught := caught.(type) {\n\t\t\tcase *Error:\n\t\t\t\terr = caught\n\t\t\t\treturn\n\t\t\tcase _error:\n\t\t\t\terr = &Error{caught}\n\t\t\t\treturn\n\t\t\tcase Value:\n\t\t\t\tif vl := caught._object(); vl != nil {\n\t\t\t\t\tswitch vl := vl.value.(type) {\n\t\t\t\t\tcase _error:\n\t\t\t\t\t\terr = &Error{vl}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\terr = errors.New(caught.string())\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpanic(caught)\n\t\t}\n\t}()\n\tfunction()\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/evaluate.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"strings\"\n\n\t\"github.com/robertkrimen/otto/token\"\n)\n\nfunc (self *_runtime) evaluateMultiply(left float64, right float64) Value {\n\t// TODO 11.5.1\n\treturn Value{}\n}\n\nfunc (self *_runtime) evaluateDivide(left float64, right float64) Value {\n\tif math.IsNaN(left) || math.IsNaN(right) {\n\t\treturn NaNValue()\n\t}\n\tif math.IsInf(left, 0) && math.IsInf(right, 0) {\n\t\treturn NaNValue()\n\t}\n\tif left == 0 && right == 0 {\n\t\treturn NaNValue()\n\t}\n\tif math.IsInf(left, 0) {\n\t\tif math.Signbit(left) == math.Signbit(right) {\n\t\t\treturn positiveInfinityValue()\n\t\t} else {\n\t\t\treturn negativeInfinityValue()\n\t\t}\n\t}\n\tif math.IsInf(right, 0) {\n\t\tif math.Signbit(left) == math.Signbit(right) {\n\t\t\treturn positiveZeroValue()\n\t\t} else {\n\t\t\treturn negativeZeroValue()\n\t\t}\n\t}\n\tif right == 0 {\n\t\tif math.Signbit(left) == math.Signbit(right) {\n\t\t\treturn positiveInfinityValue()\n\t\t} else {\n\t\t\treturn negativeInfinityValue()\n\t\t}\n\t}\n\treturn toValue_float64(left / right)\n}\n\nfunc (self *_runtime) evaluateModulo(left float64, right float64) Value {\n\t// TODO 11.5.3\n\treturn Value{}\n}\n\nfunc (self *_runtime) calculateBinaryExpression(operator token.Token, left Value, right Value) Value {\n\n\tleftValue := left.resolve()\n\n\tswitch operator {\n\n\t// Additive\n\tcase token.PLUS:\n\t\tleftValue = toPrimitive(leftValue)\n\t\trightValue := right.resolve()\n\t\trightValue = toPrimitive(rightValue)\n\n\t\tif leftValue.IsString() || rightValue.IsString() {\n\t\t\treturn toValue_string(strings.Join([]string{leftValue.string(), rightValue.string()}, \"\"))\n\t\t} else {\n\t\t\treturn toValue_float64(leftValue.float64() + rightValue.float64())\n\t\t}\n\tcase token.MINUS:\n\t\trightValue := right.resolve()\n\t\treturn toValue_float64(leftValue.float64() - rightValue.float64())\n\n\t\t// Multiplicative\n\tcase token.MULTIPLY:\n\t\trightValue := right.resolve()\n\t\treturn toValue_float64(leftValue.float64() * rightValue.float64())\n\tcase token.SLASH:\n\t\trightValue := right.resolve()\n\t\treturn self.evaluateDivide(leftValue.float64(), rightValue.float64())\n\tcase token.REMAINDER:\n\t\trightValue := right.resolve()\n\t\treturn toValue_float64(math.Mod(leftValue.float64(), rightValue.float64()))\n\n\t\t// Logical\n\tcase token.LOGICAL_AND:\n\t\tleft := leftValue.bool()\n\t\tif !left {\n\t\t\treturn falseValue\n\t\t}\n\t\treturn toValue_bool(right.resolve().bool())\n\tcase token.LOGICAL_OR:\n\t\tleft := leftValue.bool()\n\t\tif left {\n\t\t\treturn trueValue\n\t\t}\n\t\treturn toValue_bool(right.resolve().bool())\n\n\t\t// Bitwise\n\tcase token.AND:\n\t\trightValue := right.resolve()\n\t\treturn toValue_int32(toInt32(leftValue) & toInt32(rightValue))\n\tcase token.OR:\n\t\trightValue := right.resolve()\n\t\treturn toValue_int32(toInt32(leftValue) | toInt32(rightValue))\n\tcase token.EXCLUSIVE_OR:\n\t\trightValue := right.resolve()\n\t\treturn toValue_int32(toInt32(leftValue) ^ toInt32(rightValue))\n\n\t\t// Shift\n\t\t// (Masking of 0x1f is to restrict the shift to a maximum of 31 places)\n\tcase token.SHIFT_LEFT:\n\t\trightValue := right.resolve()\n\t\treturn toValue_int32(toInt32(leftValue) << (toUint32(rightValue) & 0x1f))\n\tcase token.SHIFT_RIGHT:\n\t\trightValue := right.resolve()\n\t\treturn toValue_int32(toInt32(leftValue) >> (toUint32(rightValue) & 0x1f))\n\tcase token.UNSIGNED_SHIFT_RIGHT:\n\t\trightValue := right.resolve()\n\t\t// Shifting an unsigned integer is a logical shift\n\t\treturn toValue_uint32(toUint32(leftValue) >> (toUint32(rightValue) & 0x1f))\n\n\tcase token.INSTANCEOF:\n\t\trightValue := right.resolve()\n\t\tif !rightValue.IsObject() {\n\t\t\tpanic(self.panicTypeError(\"Expecting a function in instanceof check, but got: %v\", rightValue))\n\t\t}\n\t\treturn toValue_bool(rightValue._object().hasInstance(leftValue))\n\n\tcase token.IN:\n\t\trightValue := right.resolve()\n\t\tif !rightValue.IsObject() {\n\t\t\tpanic(self.panicTypeError())\n\t\t}\n\t\treturn toValue_bool(rightValue._object().hasProperty(leftValue.string()))\n\t}\n\n\tpanic(hereBeDragons(operator))\n}\n\nfunc valueKindDispatchKey(left _valueKind, right _valueKind) int {\n\treturn (int(left) << 2) + int(right)\n}\n\nvar equalDispatch map[int](func(Value, Value) bool) = makeEqualDispatch()\n\nfunc makeEqualDispatch() map[int](func(Value, Value) bool) {\n\tkey := valueKindDispatchKey\n\treturn map[int](func(Value, Value) bool){\n\n\t\tkey(valueNumber, valueObject): func(x Value, y Value) bool { return x.float64() == y.float64() },\n\t\tkey(valueString, valueObject): func(x Value, y Value) bool { return x.float64() == y.float64() },\n\t\tkey(valueObject, valueNumber): func(x Value, y Value) bool { return x.float64() == y.float64() },\n\t\tkey(valueObject, valueString): func(x Value, y Value) bool { return x.float64() == y.float64() },\n\t}\n}\n\ntype _lessThanResult int\n\nconst (\n\tlessThanFalse _lessThanResult = iota\n\tlessThanTrue\n\tlessThanUndefined\n)\n\nfunc calculateLessThan(left Value, right Value, leftFirst bool) _lessThanResult {\n\n\tx := Value{}\n\ty := x\n\n\tif leftFirst {\n\t\tx = toNumberPrimitive(left)\n\t\ty = toNumberPrimitive(right)\n\t} else {\n\t\ty = toNumberPrimitive(right)\n\t\tx = toNumberPrimitive(left)\n\t}\n\n\tresult := false\n\tif x.kind != valueString || y.kind != valueString {\n\t\tx, y := x.float64(), y.float64()\n\t\tif math.IsNaN(x) || math.IsNaN(y) {\n\t\t\treturn lessThanUndefined\n\t\t}\n\t\tresult = x < y\n\t} else {\n\t\tx, y := x.string(), y.string()\n\t\tresult = x < y\n\t}\n\n\tif result {\n\t\treturn lessThanTrue\n\t}\n\n\treturn lessThanFalse\n}\n\n// FIXME Probably a map is not the most efficient way to do this\nvar lessThanTable [4](map[_lessThanResult]bool) = [4](map[_lessThanResult]bool){\n\t// <\n\tmap[_lessThanResult]bool{\n\t\tlessThanFalse:     false,\n\t\tlessThanTrue:      true,\n\t\tlessThanUndefined: false,\n\t},\n\n\t// >\n\tmap[_lessThanResult]bool{\n\t\tlessThanFalse:     false,\n\t\tlessThanTrue:      true,\n\t\tlessThanUndefined: false,\n\t},\n\n\t// <=\n\tmap[_lessThanResult]bool{\n\t\tlessThanFalse:     true,\n\t\tlessThanTrue:      false,\n\t\tlessThanUndefined: false,\n\t},\n\n\t// >=\n\tmap[_lessThanResult]bool{\n\t\tlessThanFalse:     true,\n\t\tlessThanTrue:      false,\n\t\tlessThanUndefined: false,\n\t},\n}\n\nfunc (self *_runtime) calculateComparison(comparator token.Token, left Value, right Value) bool {\n\n\t// FIXME Use strictEqualityComparison?\n\t// TODO This might be redundant now (with regards to evaluateComparison)\n\tx := left.resolve()\n\ty := right.resolve()\n\n\tkindEqualKind := false\n\tresult := true\n\tnegate := false\n\n\tswitch comparator {\n\tcase token.LESS:\n\t\tresult = lessThanTable[0][calculateLessThan(x, y, true)]\n\tcase token.GREATER:\n\t\tresult = lessThanTable[1][calculateLessThan(y, x, false)]\n\tcase token.LESS_OR_EQUAL:\n\t\tresult = lessThanTable[2][calculateLessThan(y, x, false)]\n\tcase token.GREATER_OR_EQUAL:\n\t\tresult = lessThanTable[3][calculateLessThan(x, y, true)]\n\tcase token.STRICT_NOT_EQUAL:\n\t\tnegate = true\n\t\tfallthrough\n\tcase token.STRICT_EQUAL:\n\t\tif x.kind != y.kind {\n\t\t\tresult = false\n\t\t} else {\n\t\t\tkindEqualKind = true\n\t\t}\n\tcase token.NOT_EQUAL:\n\t\tnegate = true\n\t\tfallthrough\n\tcase token.EQUAL:\n\t\tif x.kind == y.kind {\n\t\t\tkindEqualKind = true\n\t\t} else if x.kind <= valueNull && y.kind <= valueNull {\n\t\t\tresult = true\n\t\t} else if x.kind <= valueNull || y.kind <= valueNull {\n\t\t\tresult = false\n\t\t} else if x.kind <= valueString && y.kind <= valueString {\n\t\t\tresult = x.float64() == y.float64()\n\t\t} else if x.kind == valueBoolean {\n\t\t\tresult = self.calculateComparison(token.EQUAL, toValue_float64(x.float64()), y)\n\t\t} else if y.kind == valueBoolean {\n\t\t\tresult = self.calculateComparison(token.EQUAL, x, toValue_float64(y.float64()))\n\t\t} else if x.kind == valueObject {\n\t\t\tresult = self.calculateComparison(token.EQUAL, toPrimitive(x), y)\n\t\t} else if y.kind == valueObject {\n\t\t\tresult = self.calculateComparison(token.EQUAL, x, toPrimitive(y))\n\t\t} else {\n\t\t\tpanic(hereBeDragons(\"Unable to test for equality: %v ==? %v\", x, y))\n\t\t}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"Unknown comparator %s\", comparator.String()))\n\t}\n\n\tif kindEqualKind {\n\t\tswitch x.kind {\n\t\tcase valueUndefined, valueNull:\n\t\t\tresult = true\n\t\tcase valueNumber:\n\t\t\tx := x.float64()\n\t\t\ty := y.float64()\n\t\t\tif math.IsNaN(x) || math.IsNaN(y) {\n\t\t\t\tresult = false\n\t\t\t} else {\n\t\t\t\tresult = x == y\n\t\t\t}\n\t\tcase valueString:\n\t\t\tresult = x.string() == y.string()\n\t\tcase valueBoolean:\n\t\t\tresult = x.bool() == y.bool()\n\t\tcase valueObject:\n\t\t\tresult = x._object() == y._object()\n\t\tdefault:\n\t\t\tgoto ERROR\n\t\t}\n\t}\n\n\tif negate {\n\t\tresult = !result\n\t}\n\n\treturn result\n\nERROR:\n\tpanic(hereBeDragons(\"%v (%v) %s %v (%v)\", x, x.kind, comparator, y, y.kind))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/file/README.markdown",
    "content": "# file\n--\n    import \"github.com/robertkrimen/otto/file\"\n\nPackage file encapsulates the file abstractions used by the ast & parser.\n\n## Usage\n\n#### type File\n\n```go\ntype File struct {\n}\n```\n\n\n#### func  NewFile\n\n```go\nfunc NewFile(filename, src string, base int) *File\n```\n\n#### func (*File) Base\n\n```go\nfunc (fl *File) Base() int\n```\n\n#### func (*File) Name\n\n```go\nfunc (fl *File) Name() string\n```\n\n#### func (*File) Source\n\n```go\nfunc (fl *File) Source() string\n```\n\n#### type FileSet\n\n```go\ntype FileSet struct {\n}\n```\n\nA FileSet represents a set of source files.\n\n#### func (*FileSet) AddFile\n\n```go\nfunc (self *FileSet) AddFile(filename, src string) int\n```\nAddFile adds a new file with the given filename and src.\n\nThis an internal method, but exported for cross-package use.\n\n#### func (*FileSet) File\n\n```go\nfunc (self *FileSet) File(idx Idx) *File\n```\n\n#### func (*FileSet) Position\n\n```go\nfunc (self *FileSet) Position(idx Idx) *Position\n```\nPosition converts an Idx in the FileSet into a Position.\n\n#### type Idx\n\n```go\ntype Idx int\n```\n\nIdx is a compact encoding of a source position within a file set. It can be\nconverted into a Position for a more convenient, but much larger,\nrepresentation.\n\n#### type Position\n\n```go\ntype Position struct {\n\tFilename string // The filename where the error occurred, if any\n\tOffset   int    // The src offset\n\tLine     int    // The line number, starting at 1\n\tColumn   int    // The column number, starting at 1 (The character count)\n\n}\n```\n\nPosition describes an arbitrary source position including the filename, line,\nand column location.\n\n#### func (*Position) String\n\n```go\nfunc (self *Position) String() string\n```\nString returns a string in one of several forms:\n\n    file:line:column    A valid position with filename\n    line:column         A valid position without filename\n    file                An invalid position with filename\n    -                   An invalid position without filename\n\n--\n**godocdown** http://github.com/robertkrimen/godocdown\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/file/file.go",
    "content": "// Package file encapsulates the file abstractions used by the ast & parser.\n//\npackage file\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"gopkg.in/sourcemap.v1\"\n)\n\n// Idx is a compact encoding of a source position within a file set.\n// It can be converted into a Position for a more convenient, but much\n// larger, representation.\ntype Idx int\n\n// Position describes an arbitrary source position\n// including the filename, line, and column location.\ntype Position struct {\n\tFilename string // The filename where the error occurred, if any\n\tOffset   int    // The src offset\n\tLine     int    // The line number, starting at 1\n\tColumn   int    // The column number, starting at 1 (The character count)\n\n}\n\n// A Position is valid if the line number is > 0.\n\nfunc (self *Position) isValid() bool {\n\treturn self.Line > 0\n}\n\n// String returns a string in one of several forms:\n//\n//\tfile:line:column    A valid position with filename\n//\tline:column         A valid position without filename\n//\tfile                An invalid position with filename\n//\t-                   An invalid position without filename\n//\nfunc (self *Position) String() string {\n\tstr := self.Filename\n\tif self.isValid() {\n\t\tif str != \"\" {\n\t\t\tstr += \":\"\n\t\t}\n\t\tstr += fmt.Sprintf(\"%d:%d\", self.Line, self.Column)\n\t}\n\tif str == \"\" {\n\t\tstr = \"-\"\n\t}\n\treturn str\n}\n\n// FileSet\n\n// A FileSet represents a set of source files.\ntype FileSet struct {\n\tfiles []*File\n\tlast  *File\n}\n\n// AddFile adds a new file with the given filename and src.\n//\n// This an internal method, but exported for cross-package use.\nfunc (self *FileSet) AddFile(filename, src string) int {\n\tbase := self.nextBase()\n\tfile := &File{\n\t\tname: filename,\n\t\tsrc:  src,\n\t\tbase: base,\n\t}\n\tself.files = append(self.files, file)\n\tself.last = file\n\treturn base\n}\n\nfunc (self *FileSet) nextBase() int {\n\tif self.last == nil {\n\t\treturn 1\n\t}\n\treturn self.last.base + len(self.last.src) + 1\n}\n\nfunc (self *FileSet) File(idx Idx) *File {\n\tfor _, file := range self.files {\n\t\tif idx <= Idx(file.base+len(file.src)) {\n\t\t\treturn file\n\t\t}\n\t}\n\treturn nil\n}\n\n// Position converts an Idx in the FileSet into a Position.\nfunc (self *FileSet) Position(idx Idx) *Position {\n\tfor _, file := range self.files {\n\t\tif idx <= Idx(file.base+len(file.src)) {\n\t\t\treturn file.Position(idx - Idx(file.base))\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype File struct {\n\tname string\n\tsrc  string\n\tbase int // This will always be 1 or greater\n\tsm   *sourcemap.Consumer\n}\n\nfunc NewFile(filename, src string, base int) *File {\n\treturn &File{\n\t\tname: filename,\n\t\tsrc:  src,\n\t\tbase: base,\n\t}\n}\n\nfunc (fl *File) WithSourceMap(sm *sourcemap.Consumer) *File {\n\tfl.sm = sm\n\treturn fl\n}\n\nfunc (fl *File) Name() string {\n\treturn fl.name\n}\n\nfunc (fl *File) Source() string {\n\treturn fl.src\n}\n\nfunc (fl *File) Base() int {\n\treturn fl.base\n}\n\nfunc (fl *File) Position(idx Idx) *Position {\n\tposition := &Position{}\n\n\toffset := int(idx) - fl.base\n\n\tif offset >= len(fl.src) || offset < 0 {\n\t\treturn nil\n\t}\n\n\tsrc := fl.src[:offset]\n\n\tposition.Filename = fl.name\n\tposition.Offset = offset\n\tposition.Line = strings.Count(src, \"\\n\") + 1\n\n\tif index := strings.LastIndex(src, \"\\n\"); index >= 0 {\n\t\tposition.Column = offset - index\n\t} else {\n\t\tposition.Column = len(src) + 1\n\t}\n\n\tif fl.sm != nil {\n\t\tif f, _, l, c, ok := fl.sm.Source(position.Line, position.Column); ok {\n\t\t\tposition.Filename, position.Line, position.Column = f, l, c\n\t\t}\n\t}\n\n\treturn position\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/global.go",
    "content": "package otto\n\nimport (\n\t\"strconv\"\n\t\"time\"\n)\n\nvar (\n\tprototypeValueObject   = interface{}(nil)\n\tprototypeValueFunction = _nativeFunctionObject{\n\t\tcall: func(_ FunctionCall) Value {\n\t\t\treturn Value{}\n\t\t},\n\t}\n\tprototypeValueString = _stringASCII(\"\")\n\t// TODO Make this just false?\n\tprototypeValueBoolean = Value{\n\t\tkind:  valueBoolean,\n\t\tvalue: false,\n\t}\n\tprototypeValueNumber = Value{\n\t\tkind:  valueNumber,\n\t\tvalue: 0,\n\t}\n\tprototypeValueDate = _dateObject{\n\t\tepoch: 0,\n\t\tisNaN: false,\n\t\ttime:  time.Unix(0, 0).UTC(),\n\t\tvalue: Value{\n\t\t\tkind:  valueNumber,\n\t\t\tvalue: 0,\n\t\t},\n\t}\n\tprototypeValueRegExp = _regExpObject{\n\t\tregularExpression: nil,\n\t\tglobal:            false,\n\t\tignoreCase:        false,\n\t\tmultiline:         false,\n\t\tsource:            \"\",\n\t\tflags:             \"\",\n\t}\n)\n\nfunc newContext() *_runtime {\n\n\tself := &_runtime{}\n\n\tself.globalStash = self.newObjectStash(nil, nil)\n\tself.globalObject = self.globalStash.object\n\n\t_newContext(self)\n\n\tself.eval = self.globalObject.property[\"eval\"].value.(Value).value.(*_object)\n\tself.globalObject.prototype = self.global.ObjectPrototype\n\n\treturn self\n}\n\nfunc (runtime *_runtime) newBaseObject() *_object {\n\tself := newObject(runtime, \"\")\n\treturn self\n}\n\nfunc (runtime *_runtime) newClassObject(class string) *_object {\n\treturn newObject(runtime, class)\n}\n\nfunc (runtime *_runtime) newPrimitiveObject(class string, value Value) *_object {\n\tself := runtime.newClassObject(class)\n\tself.value = value\n\treturn self\n}\n\nfunc (self *_object) primitiveValue() Value {\n\tswitch value := self.value.(type) {\n\tcase Value:\n\t\treturn value\n\tcase _stringObject:\n\t\treturn toValue_string(value.String())\n\t}\n\treturn Value{}\n}\n\nfunc (self *_object) hasPrimitive() bool {\n\tswitch self.value.(type) {\n\tcase Value, _stringObject:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (runtime *_runtime) newObject() *_object {\n\tself := runtime.newClassObject(\"Object\")\n\tself.prototype = runtime.global.ObjectPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newArray(length uint32) *_object {\n\tself := runtime.newArrayObject(length)\n\tself.prototype = runtime.global.ArrayPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newArrayOf(valueArray []Value) *_object {\n\tself := runtime.newArray(uint32(len(valueArray)))\n\tfor index, value := range valueArray {\n\t\tif value.isEmpty() {\n\t\t\tcontinue\n\t\t}\n\t\tself.defineProperty(strconv.FormatInt(int64(index), 10), value, 0111, false)\n\t}\n\treturn self\n}\n\nfunc (runtime *_runtime) newString(value Value) *_object {\n\tself := runtime.newStringObject(value)\n\tself.prototype = runtime.global.StringPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newBoolean(value Value) *_object {\n\tself := runtime.newBooleanObject(value)\n\tself.prototype = runtime.global.BooleanPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newNumber(value Value) *_object {\n\tself := runtime.newNumberObject(value)\n\tself.prototype = runtime.global.NumberPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newRegExp(patternValue Value, flagsValue Value) *_object {\n\n\tpattern := \"\"\n\tflags := \"\"\n\tif object := patternValue._object(); object != nil && object.class == \"RegExp\" {\n\t\tif flagsValue.IsDefined() {\n\t\t\tpanic(runtime.panicTypeError(\"Cannot supply flags when constructing one RegExp from another\"))\n\t\t}\n\t\tregExp := object.regExpValue()\n\t\tpattern = regExp.source\n\t\tflags = regExp.flags\n\t} else {\n\t\tif patternValue.IsDefined() {\n\t\t\tpattern = patternValue.string()\n\t\t}\n\t\tif flagsValue.IsDefined() {\n\t\t\tflags = flagsValue.string()\n\t\t}\n\t}\n\n\treturn runtime._newRegExp(pattern, flags)\n}\n\nfunc (runtime *_runtime) _newRegExp(pattern string, flags string) *_object {\n\tself := runtime.newRegExpObject(pattern, flags)\n\tself.prototype = runtime.global.RegExpPrototype\n\treturn self\n}\n\n// TODO Should (probably) be one argument, right? This is redundant\nfunc (runtime *_runtime) newDate(epoch float64) *_object {\n\tself := runtime.newDateObject(epoch)\n\tself.prototype = runtime.global.DatePrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newError(name string, message Value, stackFramesToPop int) *_object {\n\tvar self *_object\n\tswitch name {\n\tcase \"EvalError\":\n\t\treturn runtime.newEvalError(message)\n\tcase \"TypeError\":\n\t\treturn runtime.newTypeError(message)\n\tcase \"RangeError\":\n\t\treturn runtime.newRangeError(message)\n\tcase \"ReferenceError\":\n\t\treturn runtime.newReferenceError(message)\n\tcase \"SyntaxError\":\n\t\treturn runtime.newSyntaxError(message)\n\tcase \"URIError\":\n\t\treturn runtime.newURIError(message)\n\t}\n\n\tself = runtime.newErrorObject(name, message, stackFramesToPop)\n\tself.prototype = runtime.global.ErrorPrototype\n\tif name != \"\" {\n\t\tself.defineProperty(\"name\", toValue_string(name), 0111, false)\n\t}\n\treturn self\n}\n\nfunc (runtime *_runtime) newNativeFunction(name, file string, line int, _nativeFunction _nativeFunction) *_object {\n\tself := runtime.newNativeFunctionObject(name, file, line, _nativeFunction, 0)\n\tself.prototype = runtime.global.FunctionPrototype\n\tprototype := runtime.newObject()\n\tself.defineProperty(\"prototype\", toValue_object(prototype), 0100, false)\n\tprototype.defineProperty(\"constructor\", toValue_object(self), 0100, false)\n\treturn self\n}\n\nfunc (runtime *_runtime) newNodeFunction(node *_nodeFunctionLiteral, scopeEnvironment _stash) *_object {\n\t// TODO Implement 13.2 fully\n\tself := runtime.newNodeFunctionObject(node, scopeEnvironment)\n\tself.prototype = runtime.global.FunctionPrototype\n\tprototype := runtime.newObject()\n\tself.defineProperty(\"prototype\", toValue_object(prototype), 0100, false)\n\tprototype.defineProperty(\"constructor\", toValue_object(self), 0101, false)\n\treturn self\n}\n\n// FIXME Only in one place...\nfunc (runtime *_runtime) newBoundFunction(target *_object, this Value, argumentList []Value) *_object {\n\tself := runtime.newBoundFunctionObject(target, this, argumentList)\n\tself.prototype = runtime.global.FunctionPrototype\n\tprototype := runtime.newObject()\n\tself.defineProperty(\"prototype\", toValue_object(prototype), 0100, false)\n\tprototype.defineProperty(\"constructor\", toValue_object(self), 0100, false)\n\treturn self\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/inline.go",
    "content": "package otto\n\nimport (\n\t\"math\"\n)\n\nfunc _newContext(runtime *_runtime) {\n\t{\n\t\truntime.global.ObjectPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Object\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   nil,\n\t\t\textensible:  true,\n\t\t\tvalue:       prototypeValueObject,\n\t\t}\n\t}\n\t{\n\t\truntime.global.FunctionPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       prototypeValueFunction,\n\t\t}\n\t}\n\t{\n\t\tvalueOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"valueOf\",\n\t\t\t\tcall: builtinObject_valueOf,\n\t\t\t},\n\t\t}\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinObject_toString,\n\t\t\t},\n\t\t}\n\t\ttoLocaleString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleString\",\n\t\t\t\tcall: builtinObject_toLocaleString,\n\t\t\t},\n\t\t}\n\t\thasOwnProperty_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"hasOwnProperty\",\n\t\t\t\tcall: builtinObject_hasOwnProperty,\n\t\t\t},\n\t\t}\n\t\tisPrototypeOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"isPrototypeOf\",\n\t\t\t\tcall: builtinObject_isPrototypeOf,\n\t\t\t},\n\t\t}\n\t\tpropertyIsEnumerable_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"propertyIsEnumerable\",\n\t\t\t\tcall: builtinObject_propertyIsEnumerable,\n\t\t\t},\n\t\t}\n\t\truntime.global.ObjectPrototype.property = map[string]_property{\n\t\t\t\"valueOf\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: valueOf_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"toString\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: toString_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"toLocaleString\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: toLocaleString_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"hasOwnProperty\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: hasOwnProperty_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"isPrototypeOf\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: isPrototypeOf_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"propertyIsEnumerable\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: propertyIsEnumerable_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"constructor\": _property{\n\t\t\t\tmode:  0101,\n\t\t\t\tvalue: Value{},\n\t\t\t},\n\t\t}\n\t\truntime.global.ObjectPrototype.propertyOrder = []string{\n\t\t\t\"valueOf\",\n\t\t\t\"toString\",\n\t\t\t\"toLocaleString\",\n\t\t\t\"hasOwnProperty\",\n\t\t\t\"isPrototypeOf\",\n\t\t\t\"propertyIsEnumerable\",\n\t\t\t\"constructor\",\n\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinFunction_toString,\n\t\t\t},\n\t\t}\n\t\tapply_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"apply\",\n\t\t\t\tcall: builtinFunction_apply,\n\t\t\t},\n\t\t}\n\t\tcall_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"call\",\n\t\t\t\tcall: builtinFunction_call,\n\t\t\t},\n\t\t}\n\t\tbind_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"bind\",\n\t\t\t\tcall: builtinFunction_bind,\n\t\t\t},\n\t\t}\n\t\truntime.global.FunctionPrototype.property = map[string]_property{\n\t\t\t\"toString\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: toString_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"apply\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: apply_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"call\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: call_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"bind\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: bind_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"constructor\": _property{\n\t\t\t\tmode:  0101,\n\t\t\t\tvalue: Value{},\n\t\t\t},\n\t\t\t\"length\": _property{\n\t\t\t\tmode: 0,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\tvalue: 0,\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t\truntime.global.FunctionPrototype.propertyOrder = []string{\n\t\t\t\"toString\",\n\t\t\t\"apply\",\n\t\t\t\"call\",\n\t\t\t\"bind\",\n\t\t\t\"constructor\",\n\t\t\t\"length\",\n\t\t}\n\t}\n\t{\n\t\tgetPrototypeOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getPrototypeOf\",\n\t\t\t\tcall: builtinObject_getPrototypeOf,\n\t\t\t},\n\t\t}\n\t\tgetOwnPropertyDescriptor_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getOwnPropertyDescriptor\",\n\t\t\t\tcall: builtinObject_getOwnPropertyDescriptor,\n\t\t\t},\n\t\t}\n\t\tdefineProperty_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 3,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"defineProperty\",\n\t\t\t\tcall: builtinObject_defineProperty,\n\t\t\t},\n\t\t}\n\t\tdefineProperties_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"defineProperties\",\n\t\t\t\tcall: builtinObject_defineProperties,\n\t\t\t},\n\t\t}\n\t\tcreate_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"create\",\n\t\t\t\tcall: builtinObject_create,\n\t\t\t},\n\t\t}\n\t\tisExtensible_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"isExtensible\",\n\t\t\t\tcall: builtinObject_isExtensible,\n\t\t\t},\n\t\t}\n\t\tpreventExtensions_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"preventExtensions\",\n\t\t\t\tcall: builtinObject_preventExtensions,\n\t\t\t},\n\t\t}\n\t\tisSealed_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"isSealed\",\n\t\t\t\tcall: builtinObject_isSealed,\n\t\t\t},\n\t\t}\n\t\tseal_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"seal\",\n\t\t\t\tcall: builtinObject_seal,\n\t\t\t},\n\t\t}\n\t\tisFrozen_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"isFrozen\",\n\t\t\t\tcall: builtinObject_isFrozen,\n\t\t\t},\n\t\t}\n\t\tfreeze_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"freeze\",\n\t\t\t\tcall: builtinObject_freeze,\n\t\t\t},\n\t\t}\n\t\tkeys_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"keys\",\n\t\t\t\tcall: builtinObject_keys,\n\t\t\t},\n\t\t}\n\t\tgetOwnPropertyNames_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getOwnPropertyNames\",\n\t\t\t\tcall: builtinObject_getOwnPropertyNames,\n\t\t\t},\n\t\t}\n\t\truntime.global.Object = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"Object\",\n\t\t\t\tcall:      builtinObject,\n\t\t\t\tconstruct: builtinNewObject,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.ObjectPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getPrototypeOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getPrototypeOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getOwnPropertyDescriptor\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getOwnPropertyDescriptor_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"defineProperty\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: defineProperty_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"defineProperties\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: defineProperties_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"create\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: create_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"isExtensible\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: isExtensible_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"preventExtensions\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: preventExtensions_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"isSealed\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: isSealed_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"seal\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: seal_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"isFrozen\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: isFrozen_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"freeze\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: freeze_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"keys\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: keys_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getOwnPropertyNames\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getOwnPropertyNames_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t\t\"getPrototypeOf\",\n\t\t\t\t\"getOwnPropertyDescriptor\",\n\t\t\t\t\"defineProperty\",\n\t\t\t\t\"defineProperties\",\n\t\t\t\t\"create\",\n\t\t\t\t\"isExtensible\",\n\t\t\t\t\"preventExtensions\",\n\t\t\t\t\"isSealed\",\n\t\t\t\t\"seal\",\n\t\t\t\t\"isFrozen\",\n\t\t\t\t\"freeze\",\n\t\t\t\t\"keys\",\n\t\t\t\t\"getOwnPropertyNames\",\n\t\t\t},\n\t\t}\n\t\truntime.global.ObjectPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Object,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\tFunction := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"Function\",\n\t\t\t\tcall:      builtinFunction,\n\t\t\t\tconstruct: builtinNewFunction,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.FunctionPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.Function = Function\n\t\truntime.global.FunctionPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Function,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinArray_toString,\n\t\t\t},\n\t\t}\n\t\ttoLocaleString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleString\",\n\t\t\t\tcall: builtinArray_toLocaleString,\n\t\t\t},\n\t\t}\n\t\tconcat_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"concat\",\n\t\t\t\tcall: builtinArray_concat,\n\t\t\t},\n\t\t}\n\t\tjoin_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"join\",\n\t\t\t\tcall: builtinArray_join,\n\t\t\t},\n\t\t}\n\t\tsplice_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"splice\",\n\t\t\t\tcall: builtinArray_splice,\n\t\t\t},\n\t\t}\n\t\tshift_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"shift\",\n\t\t\t\tcall: builtinArray_shift,\n\t\t\t},\n\t\t}\n\t\tpop_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"pop\",\n\t\t\t\tcall: builtinArray_pop,\n\t\t\t},\n\t\t}\n\t\tpush_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"push\",\n\t\t\t\tcall: builtinArray_push,\n\t\t\t},\n\t\t}\n\t\tslice_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"slice\",\n\t\t\t\tcall: builtinArray_slice,\n\t\t\t},\n\t\t}\n\t\tunshift_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"unshift\",\n\t\t\t\tcall: builtinArray_unshift,\n\t\t\t},\n\t\t}\n\t\treverse_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"reverse\",\n\t\t\t\tcall: builtinArray_reverse,\n\t\t\t},\n\t\t}\n\t\tsort_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"sort\",\n\t\t\t\tcall: builtinArray_sort,\n\t\t\t},\n\t\t}\n\t\tindexOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"indexOf\",\n\t\t\t\tcall: builtinArray_indexOf,\n\t\t\t},\n\t\t}\n\t\tlastIndexOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"lastIndexOf\",\n\t\t\t\tcall: builtinArray_lastIndexOf,\n\t\t\t},\n\t\t}\n\t\tevery_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"every\",\n\t\t\t\tcall: builtinArray_every,\n\t\t\t},\n\t\t}\n\t\tsome_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"some\",\n\t\t\t\tcall: builtinArray_some,\n\t\t\t},\n\t\t}\n\t\tforEach_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"forEach\",\n\t\t\t\tcall: builtinArray_forEach,\n\t\t\t},\n\t\t}\n\t\tmap_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"map\",\n\t\t\t\tcall: builtinArray_map,\n\t\t\t},\n\t\t}\n\t\tfilter_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"filter\",\n\t\t\t\tcall: builtinArray_filter,\n\t\t\t},\n\t\t}\n\t\treduce_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"reduce\",\n\t\t\t\tcall: builtinArray_reduce,\n\t\t\t},\n\t\t}\n\t\treduceRight_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"reduceRight\",\n\t\t\t\tcall: builtinArray_reduceRight,\n\t\t\t},\n\t\t}\n\t\tisArray_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"isArray\",\n\t\t\t\tcall: builtinArray_isArray,\n\t\t\t},\n\t\t}\n\t\truntime.global.ArrayPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Array\",\n\t\t\tobjectClass: _classArray,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0100,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: uint32(0),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLocaleString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLocaleString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"concat\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: concat_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"join\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: join_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"splice\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: splice_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"shift\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: shift_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"pop\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: pop_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"push\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: push_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"slice\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: slice_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"unshift\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: unshift_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"reverse\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: reverse_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"sort\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: sort_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"indexOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: indexOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"lastIndexOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: lastIndexOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"every\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: every_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"some\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: some_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"forEach\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: forEach_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"map\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: map_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"filter\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: filter_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"reduce\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: reduce_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"reduceRight\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: reduceRight_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"toString\",\n\t\t\t\t\"toLocaleString\",\n\t\t\t\t\"concat\",\n\t\t\t\t\"join\",\n\t\t\t\t\"splice\",\n\t\t\t\t\"shift\",\n\t\t\t\t\"pop\",\n\t\t\t\t\"push\",\n\t\t\t\t\"slice\",\n\t\t\t\t\"unshift\",\n\t\t\t\t\"reverse\",\n\t\t\t\t\"sort\",\n\t\t\t\t\"indexOf\",\n\t\t\t\t\"lastIndexOf\",\n\t\t\t\t\"every\",\n\t\t\t\t\"some\",\n\t\t\t\t\"forEach\",\n\t\t\t\t\"map\",\n\t\t\t\t\"filter\",\n\t\t\t\t\"reduce\",\n\t\t\t\t\"reduceRight\",\n\t\t\t},\n\t\t}\n\t\truntime.global.Array = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"Array\",\n\t\t\t\tcall:      builtinArray,\n\t\t\t\tconstruct: builtinNewArray,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.ArrayPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"isArray\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: isArray_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t\t\"isArray\",\n\t\t\t},\n\t\t}\n\t\truntime.global.ArrayPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Array,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinString_toString,\n\t\t\t},\n\t\t}\n\t\tvalueOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"valueOf\",\n\t\t\t\tcall: builtinString_valueOf,\n\t\t\t},\n\t\t}\n\t\tcharAt_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"charAt\",\n\t\t\t\tcall: builtinString_charAt,\n\t\t\t},\n\t\t}\n\t\tcharCodeAt_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"charCodeAt\",\n\t\t\t\tcall: builtinString_charCodeAt,\n\t\t\t},\n\t\t}\n\t\tconcat_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"concat\",\n\t\t\t\tcall: builtinString_concat,\n\t\t\t},\n\t\t}\n\t\tindexOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"indexOf\",\n\t\t\t\tcall: builtinString_indexOf,\n\t\t\t},\n\t\t}\n\t\tlastIndexOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"lastIndexOf\",\n\t\t\t\tcall: builtinString_lastIndexOf,\n\t\t\t},\n\t\t}\n\t\tmatch_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"match\",\n\t\t\t\tcall: builtinString_match,\n\t\t\t},\n\t\t}\n\t\treplace_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"replace\",\n\t\t\t\tcall: builtinString_replace,\n\t\t\t},\n\t\t}\n\t\tsearch_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"search\",\n\t\t\t\tcall: builtinString_search,\n\t\t\t},\n\t\t}\n\t\tsplit_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"split\",\n\t\t\t\tcall: builtinString_split,\n\t\t\t},\n\t\t}\n\t\tslice_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"slice\",\n\t\t\t\tcall: builtinString_slice,\n\t\t\t},\n\t\t}\n\t\tsubstring_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"substring\",\n\t\t\t\tcall: builtinString_substring,\n\t\t\t},\n\t\t}\n\t\ttoLowerCase_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLowerCase\",\n\t\t\t\tcall: builtinString_toLowerCase,\n\t\t\t},\n\t\t}\n\t\ttoUpperCase_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toUpperCase\",\n\t\t\t\tcall: builtinString_toUpperCase,\n\t\t\t},\n\t\t}\n\t\tsubstr_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"substr\",\n\t\t\t\tcall: builtinString_substr,\n\t\t\t},\n\t\t}\n\t\ttrim_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"trim\",\n\t\t\t\tcall: builtinString_trim,\n\t\t\t},\n\t\t}\n\t\ttrimLeft_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"trimLeft\",\n\t\t\t\tcall: builtinString_trimLeft,\n\t\t\t},\n\t\t}\n\t\ttrimRight_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"trimRight\",\n\t\t\t\tcall: builtinString_trimRight,\n\t\t\t},\n\t\t}\n\t\tlocaleCompare_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"localeCompare\",\n\t\t\t\tcall: builtinString_localeCompare,\n\t\t\t},\n\t\t}\n\t\ttoLocaleLowerCase_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleLowerCase\",\n\t\t\t\tcall: builtinString_toLocaleLowerCase,\n\t\t\t},\n\t\t}\n\t\ttoLocaleUpperCase_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleUpperCase\",\n\t\t\t\tcall: builtinString_toLocaleUpperCase,\n\t\t\t},\n\t\t}\n\t\tfromCharCode_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"fromCharCode\",\n\t\t\t\tcall: builtinString_fromCharCode,\n\t\t\t},\n\t\t}\n\t\truntime.global.StringPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"String\",\n\t\t\tobjectClass: _classString,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       prototypeValueString,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: int(0),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"valueOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: valueOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"charAt\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: charAt_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"charCodeAt\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: charCodeAt_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"concat\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: concat_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"indexOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: indexOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"lastIndexOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: lastIndexOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"match\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: match_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"replace\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: replace_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"search\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: search_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"split\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: split_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"slice\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: slice_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"substring\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: substring_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLowerCase\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLowerCase_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toUpperCase\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toUpperCase_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"substr\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: substr_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"trim\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: trim_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"trimLeft\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: trimLeft_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"trimRight\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: trimRight_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"localeCompare\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: localeCompare_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLocaleLowerCase\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLocaleLowerCase_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLocaleUpperCase\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLocaleUpperCase_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"toString\",\n\t\t\t\t\"valueOf\",\n\t\t\t\t\"charAt\",\n\t\t\t\t\"charCodeAt\",\n\t\t\t\t\"concat\",\n\t\t\t\t\"indexOf\",\n\t\t\t\t\"lastIndexOf\",\n\t\t\t\t\"match\",\n\t\t\t\t\"replace\",\n\t\t\t\t\"search\",\n\t\t\t\t\"split\",\n\t\t\t\t\"slice\",\n\t\t\t\t\"substring\",\n\t\t\t\t\"toLowerCase\",\n\t\t\t\t\"toUpperCase\",\n\t\t\t\t\"substr\",\n\t\t\t\t\"trim\",\n\t\t\t\t\"trimLeft\",\n\t\t\t\t\"trimRight\",\n\t\t\t\t\"localeCompare\",\n\t\t\t\t\"toLocaleLowerCase\",\n\t\t\t\t\"toLocaleUpperCase\",\n\t\t\t},\n\t\t}\n\t\truntime.global.String = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"String\",\n\t\t\t\tcall:      builtinString,\n\t\t\t\tconstruct: builtinNewString,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.StringPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"fromCharCode\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: fromCharCode_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t\t\"fromCharCode\",\n\t\t\t},\n\t\t}\n\t\truntime.global.StringPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.String,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinBoolean_toString,\n\t\t\t},\n\t\t}\n\t\tvalueOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"valueOf\",\n\t\t\t\tcall: builtinBoolean_valueOf,\n\t\t\t},\n\t\t}\n\t\truntime.global.BooleanPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Boolean\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       prototypeValueBoolean,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"toString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"valueOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: valueOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"toString\",\n\t\t\t\t\"valueOf\",\n\t\t\t},\n\t\t}\n\t\truntime.global.Boolean = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"Boolean\",\n\t\t\t\tcall:      builtinBoolean,\n\t\t\t\tconstruct: builtinNewBoolean,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.BooleanPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.BooleanPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Boolean,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinNumber_toString,\n\t\t\t},\n\t\t}\n\t\tvalueOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"valueOf\",\n\t\t\t\tcall: builtinNumber_valueOf,\n\t\t\t},\n\t\t}\n\t\ttoFixed_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toFixed\",\n\t\t\t\tcall: builtinNumber_toFixed,\n\t\t\t},\n\t\t}\n\t\ttoExponential_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toExponential\",\n\t\t\t\tcall: builtinNumber_toExponential,\n\t\t\t},\n\t\t}\n\t\ttoPrecision_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toPrecision\",\n\t\t\t\tcall: builtinNumber_toPrecision,\n\t\t\t},\n\t\t}\n\t\ttoLocaleString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleString\",\n\t\t\t\tcall: builtinNumber_toLocaleString,\n\t\t\t},\n\t\t}\n\t\truntime.global.NumberPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Number\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       prototypeValueNumber,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"toString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"valueOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: valueOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toFixed\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toFixed_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toExponential\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toExponential_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toPrecision\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toPrecision_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLocaleString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLocaleString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"toString\",\n\t\t\t\t\"valueOf\",\n\t\t\t\t\"toFixed\",\n\t\t\t\t\"toExponential\",\n\t\t\t\t\"toPrecision\",\n\t\t\t\t\"toLocaleString\",\n\t\t\t},\n\t\t}\n\t\truntime.global.Number = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"Number\",\n\t\t\t\tcall:      builtinNumber,\n\t\t\t\tconstruct: builtinNewNumber,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.NumberPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"MAX_VALUE\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.MaxFloat64,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"MIN_VALUE\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.SmallestNonzeroFloat64,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"NaN\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.NaN(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"NEGATIVE_INFINITY\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Inf(-1),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"POSITIVE_INFINITY\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Inf(+1),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t\t\"MAX_VALUE\",\n\t\t\t\t\"MIN_VALUE\",\n\t\t\t\t\"NaN\",\n\t\t\t\t\"NEGATIVE_INFINITY\",\n\t\t\t\t\"POSITIVE_INFINITY\",\n\t\t\t},\n\t\t}\n\t\truntime.global.NumberPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Number,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\tabs_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"abs\",\n\t\t\t\tcall: builtinMath_abs,\n\t\t\t},\n\t\t}\n\t\tacos_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"acos\",\n\t\t\t\tcall: builtinMath_acos,\n\t\t\t},\n\t\t}\n\t\tasin_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"asin\",\n\t\t\t\tcall: builtinMath_asin,\n\t\t\t},\n\t\t}\n\t\tatan_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"atan\",\n\t\t\t\tcall: builtinMath_atan,\n\t\t\t},\n\t\t}\n\t\tatan2_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"atan2\",\n\t\t\t\tcall: builtinMath_atan2,\n\t\t\t},\n\t\t}\n\t\tceil_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"ceil\",\n\t\t\t\tcall: builtinMath_ceil,\n\t\t\t},\n\t\t}\n\t\tcos_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"cos\",\n\t\t\t\tcall: builtinMath_cos,\n\t\t\t},\n\t\t}\n\t\texp_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"exp\",\n\t\t\t\tcall: builtinMath_exp,\n\t\t\t},\n\t\t}\n\t\tfloor_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"floor\",\n\t\t\t\tcall: builtinMath_floor,\n\t\t\t},\n\t\t}\n\t\tlog_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"log\",\n\t\t\t\tcall: builtinMath_log,\n\t\t\t},\n\t\t}\n\t\tmax_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"max\",\n\t\t\t\tcall: builtinMath_max,\n\t\t\t},\n\t\t}\n\t\tmin_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"min\",\n\t\t\t\tcall: builtinMath_min,\n\t\t\t},\n\t\t}\n\t\tpow_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"pow\",\n\t\t\t\tcall: builtinMath_pow,\n\t\t\t},\n\t\t}\n\t\trandom_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"random\",\n\t\t\t\tcall: builtinMath_random,\n\t\t\t},\n\t\t}\n\t\tround_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"round\",\n\t\t\t\tcall: builtinMath_round,\n\t\t\t},\n\t\t}\n\t\tsin_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"sin\",\n\t\t\t\tcall: builtinMath_sin,\n\t\t\t},\n\t\t}\n\t\tsqrt_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"sqrt\",\n\t\t\t\tcall: builtinMath_sqrt,\n\t\t\t},\n\t\t}\n\t\ttan_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"tan\",\n\t\t\t\tcall: builtinMath_tan,\n\t\t\t},\n\t\t}\n\t\truntime.global.Math = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Math\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"abs\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: abs_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"acos\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: acos_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"asin\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: asin_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"atan\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: atan_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"atan2\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: atan2_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"ceil\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: ceil_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"cos\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: cos_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"exp\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: exp_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"floor\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: floor_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"log\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: log_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"max\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: max_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"min\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: min_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"pow\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: pow_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"random\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: random_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"round\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: round_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"sin\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: sin_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"sqrt\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: sqrt_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"tan\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: tan_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"E\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.E,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"LN10\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Ln10,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"LN2\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Ln2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"LOG2E\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Log2E,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"LOG10E\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Log10E,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"PI\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Pi,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"SQRT1_2\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: sqrt1_2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"SQRT2\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: math.Sqrt2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"abs\",\n\t\t\t\t\"acos\",\n\t\t\t\t\"asin\",\n\t\t\t\t\"atan\",\n\t\t\t\t\"atan2\",\n\t\t\t\t\"ceil\",\n\t\t\t\t\"cos\",\n\t\t\t\t\"exp\",\n\t\t\t\t\"floor\",\n\t\t\t\t\"log\",\n\t\t\t\t\"max\",\n\t\t\t\t\"min\",\n\t\t\t\t\"pow\",\n\t\t\t\t\"random\",\n\t\t\t\t\"round\",\n\t\t\t\t\"sin\",\n\t\t\t\t\"sqrt\",\n\t\t\t\t\"tan\",\n\t\t\t\t\"E\",\n\t\t\t\t\"LN10\",\n\t\t\t\t\"LN2\",\n\t\t\t\t\"LOG2E\",\n\t\t\t\t\"LOG10E\",\n\t\t\t\t\"PI\",\n\t\t\t\t\"SQRT1_2\",\n\t\t\t\t\"SQRT2\",\n\t\t\t},\n\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinDate_toString,\n\t\t\t},\n\t\t}\n\t\ttoDateString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toDateString\",\n\t\t\t\tcall: builtinDate_toDateString,\n\t\t\t},\n\t\t}\n\t\ttoTimeString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toTimeString\",\n\t\t\t\tcall: builtinDate_toTimeString,\n\t\t\t},\n\t\t}\n\t\ttoUTCString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toUTCString\",\n\t\t\t\tcall: builtinDate_toUTCString,\n\t\t\t},\n\t\t}\n\t\ttoISOString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toISOString\",\n\t\t\t\tcall: builtinDate_toISOString,\n\t\t\t},\n\t\t}\n\t\ttoJSON_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toJSON\",\n\t\t\t\tcall: builtinDate_toJSON,\n\t\t\t},\n\t\t}\n\t\ttoGMTString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toGMTString\",\n\t\t\t\tcall: builtinDate_toGMTString,\n\t\t\t},\n\t\t}\n\t\ttoLocaleString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleString\",\n\t\t\t\tcall: builtinDate_toLocaleString,\n\t\t\t},\n\t\t}\n\t\ttoLocaleDateString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleDateString\",\n\t\t\t\tcall: builtinDate_toLocaleDateString,\n\t\t\t},\n\t\t}\n\t\ttoLocaleTimeString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toLocaleTimeString\",\n\t\t\t\tcall: builtinDate_toLocaleTimeString,\n\t\t\t},\n\t\t}\n\t\tvalueOf_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"valueOf\",\n\t\t\t\tcall: builtinDate_valueOf,\n\t\t\t},\n\t\t}\n\t\tgetTime_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getTime\",\n\t\t\t\tcall: builtinDate_getTime,\n\t\t\t},\n\t\t}\n\t\tgetYear_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getYear\",\n\t\t\t\tcall: builtinDate_getYear,\n\t\t\t},\n\t\t}\n\t\tgetFullYear_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getFullYear\",\n\t\t\t\tcall: builtinDate_getFullYear,\n\t\t\t},\n\t\t}\n\t\tgetUTCFullYear_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCFullYear\",\n\t\t\t\tcall: builtinDate_getUTCFullYear,\n\t\t\t},\n\t\t}\n\t\tgetMonth_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getMonth\",\n\t\t\t\tcall: builtinDate_getMonth,\n\t\t\t},\n\t\t}\n\t\tgetUTCMonth_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCMonth\",\n\t\t\t\tcall: builtinDate_getUTCMonth,\n\t\t\t},\n\t\t}\n\t\tgetDate_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getDate\",\n\t\t\t\tcall: builtinDate_getDate,\n\t\t\t},\n\t\t}\n\t\tgetUTCDate_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCDate\",\n\t\t\t\tcall: builtinDate_getUTCDate,\n\t\t\t},\n\t\t}\n\t\tgetDay_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getDay\",\n\t\t\t\tcall: builtinDate_getDay,\n\t\t\t},\n\t\t}\n\t\tgetUTCDay_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCDay\",\n\t\t\t\tcall: builtinDate_getUTCDay,\n\t\t\t},\n\t\t}\n\t\tgetHours_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getHours\",\n\t\t\t\tcall: builtinDate_getHours,\n\t\t\t},\n\t\t}\n\t\tgetUTCHours_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCHours\",\n\t\t\t\tcall: builtinDate_getUTCHours,\n\t\t\t},\n\t\t}\n\t\tgetMinutes_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getMinutes\",\n\t\t\t\tcall: builtinDate_getMinutes,\n\t\t\t},\n\t\t}\n\t\tgetUTCMinutes_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCMinutes\",\n\t\t\t\tcall: builtinDate_getUTCMinutes,\n\t\t\t},\n\t\t}\n\t\tgetSeconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getSeconds\",\n\t\t\t\tcall: builtinDate_getSeconds,\n\t\t\t},\n\t\t}\n\t\tgetUTCSeconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCSeconds\",\n\t\t\t\tcall: builtinDate_getUTCSeconds,\n\t\t\t},\n\t\t}\n\t\tgetMilliseconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getMilliseconds\",\n\t\t\t\tcall: builtinDate_getMilliseconds,\n\t\t\t},\n\t\t}\n\t\tgetUTCMilliseconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getUTCMilliseconds\",\n\t\t\t\tcall: builtinDate_getUTCMilliseconds,\n\t\t\t},\n\t\t}\n\t\tgetTimezoneOffset_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"getTimezoneOffset\",\n\t\t\t\tcall: builtinDate_getTimezoneOffset,\n\t\t\t},\n\t\t}\n\t\tsetTime_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setTime\",\n\t\t\t\tcall: builtinDate_setTime,\n\t\t\t},\n\t\t}\n\t\tsetMilliseconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setMilliseconds\",\n\t\t\t\tcall: builtinDate_setMilliseconds,\n\t\t\t},\n\t\t}\n\t\tsetUTCMilliseconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setUTCMilliseconds\",\n\t\t\t\tcall: builtinDate_setUTCMilliseconds,\n\t\t\t},\n\t\t}\n\t\tsetSeconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setSeconds\",\n\t\t\t\tcall: builtinDate_setSeconds,\n\t\t\t},\n\t\t}\n\t\tsetUTCSeconds_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setUTCSeconds\",\n\t\t\t\tcall: builtinDate_setUTCSeconds,\n\t\t\t},\n\t\t}\n\t\tsetMinutes_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 3,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setMinutes\",\n\t\t\t\tcall: builtinDate_setMinutes,\n\t\t\t},\n\t\t}\n\t\tsetUTCMinutes_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 3,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setUTCMinutes\",\n\t\t\t\tcall: builtinDate_setUTCMinutes,\n\t\t\t},\n\t\t}\n\t\tsetHours_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 4,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setHours\",\n\t\t\t\tcall: builtinDate_setHours,\n\t\t\t},\n\t\t}\n\t\tsetUTCHours_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 4,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setUTCHours\",\n\t\t\t\tcall: builtinDate_setUTCHours,\n\t\t\t},\n\t\t}\n\t\tsetDate_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setDate\",\n\t\t\t\tcall: builtinDate_setDate,\n\t\t\t},\n\t\t}\n\t\tsetUTCDate_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setUTCDate\",\n\t\t\t\tcall: builtinDate_setUTCDate,\n\t\t\t},\n\t\t}\n\t\tsetMonth_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setMonth\",\n\t\t\t\tcall: builtinDate_setMonth,\n\t\t\t},\n\t\t}\n\t\tsetUTCMonth_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setUTCMonth\",\n\t\t\t\tcall: builtinDate_setUTCMonth,\n\t\t\t},\n\t\t}\n\t\tsetYear_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setYear\",\n\t\t\t\tcall: builtinDate_setYear,\n\t\t\t},\n\t\t}\n\t\tsetFullYear_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 3,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setFullYear\",\n\t\t\t\tcall: builtinDate_setFullYear,\n\t\t\t},\n\t\t}\n\t\tsetUTCFullYear_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 3,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"setUTCFullYear\",\n\t\t\t\tcall: builtinDate_setUTCFullYear,\n\t\t\t},\n\t\t}\n\t\tparse_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"parse\",\n\t\t\t\tcall: builtinDate_parse,\n\t\t\t},\n\t\t}\n\t\tUTC_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 7,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"UTC\",\n\t\t\t\tcall: builtinDate_UTC,\n\t\t\t},\n\t\t}\n\t\tnow_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"now\",\n\t\t\t\tcall: builtinDate_now,\n\t\t\t},\n\t\t}\n\t\truntime.global.DatePrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Date\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       prototypeValueDate,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"toString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toDateString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toDateString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toTimeString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toTimeString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toUTCString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toUTCString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toISOString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toISOString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toJSON\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toJSON_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toGMTString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toGMTString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLocaleString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLocaleString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLocaleDateString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLocaleDateString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"toLocaleTimeString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toLocaleTimeString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"valueOf\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: valueOf_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getTime\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getTime_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getYear\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getYear_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getFullYear\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getFullYear_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCFullYear\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCFullYear_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getMonth\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getMonth_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCMonth\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCMonth_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getDate\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getDate_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCDate\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCDate_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getDay\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getDay_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCDay\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCDay_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getHours\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getHours_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCHours\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCHours_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getMinutes\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getMinutes_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCMinutes\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCMinutes_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getSeconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getSeconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCSeconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCSeconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getMilliseconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getMilliseconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getUTCMilliseconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getUTCMilliseconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"getTimezoneOffset\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: getTimezoneOffset_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setTime\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setTime_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setMilliseconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setMilliseconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setUTCMilliseconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setUTCMilliseconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setSeconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setSeconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setUTCSeconds\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setUTCSeconds_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setMinutes\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setMinutes_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setUTCMinutes\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setUTCMinutes_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setHours\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setHours_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setUTCHours\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setUTCHours_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setDate\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setDate_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setUTCDate\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setUTCDate_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setMonth\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setMonth_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setUTCMonth\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setUTCMonth_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setYear\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setYear_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setFullYear\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setFullYear_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"setUTCFullYear\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: setUTCFullYear_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"toString\",\n\t\t\t\t\"toDateString\",\n\t\t\t\t\"toTimeString\",\n\t\t\t\t\"toUTCString\",\n\t\t\t\t\"toISOString\",\n\t\t\t\t\"toJSON\",\n\t\t\t\t\"toGMTString\",\n\t\t\t\t\"toLocaleString\",\n\t\t\t\t\"toLocaleDateString\",\n\t\t\t\t\"toLocaleTimeString\",\n\t\t\t\t\"valueOf\",\n\t\t\t\t\"getTime\",\n\t\t\t\t\"getYear\",\n\t\t\t\t\"getFullYear\",\n\t\t\t\t\"getUTCFullYear\",\n\t\t\t\t\"getMonth\",\n\t\t\t\t\"getUTCMonth\",\n\t\t\t\t\"getDate\",\n\t\t\t\t\"getUTCDate\",\n\t\t\t\t\"getDay\",\n\t\t\t\t\"getUTCDay\",\n\t\t\t\t\"getHours\",\n\t\t\t\t\"getUTCHours\",\n\t\t\t\t\"getMinutes\",\n\t\t\t\t\"getUTCMinutes\",\n\t\t\t\t\"getSeconds\",\n\t\t\t\t\"getUTCSeconds\",\n\t\t\t\t\"getMilliseconds\",\n\t\t\t\t\"getUTCMilliseconds\",\n\t\t\t\t\"getTimezoneOffset\",\n\t\t\t\t\"setTime\",\n\t\t\t\t\"setMilliseconds\",\n\t\t\t\t\"setUTCMilliseconds\",\n\t\t\t\t\"setSeconds\",\n\t\t\t\t\"setUTCSeconds\",\n\t\t\t\t\"setMinutes\",\n\t\t\t\t\"setUTCMinutes\",\n\t\t\t\t\"setHours\",\n\t\t\t\t\"setUTCHours\",\n\t\t\t\t\"setDate\",\n\t\t\t\t\"setUTCDate\",\n\t\t\t\t\"setMonth\",\n\t\t\t\t\"setUTCMonth\",\n\t\t\t\t\"setYear\",\n\t\t\t\t\"setFullYear\",\n\t\t\t\t\"setUTCFullYear\",\n\t\t\t},\n\t\t}\n\t\truntime.global.Date = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"Date\",\n\t\t\t\tcall:      builtinDate,\n\t\t\t\tconstruct: builtinNewDate,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 7,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.DatePrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"parse\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: parse_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"UTC\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: UTC_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"now\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: now_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t\t\"parse\",\n\t\t\t\t\"UTC\",\n\t\t\t\t\"now\",\n\t\t\t},\n\t\t}\n\t\truntime.global.DatePrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Date,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinRegExp_toString,\n\t\t\t},\n\t\t}\n\t\texec_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"exec\",\n\t\t\t\tcall: builtinRegExp_exec,\n\t\t\t},\n\t\t}\n\t\ttest_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"test\",\n\t\t\t\tcall: builtinRegExp_test,\n\t\t\t},\n\t\t}\n\t\tcompile_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"compile\",\n\t\t\t\tcall: builtinRegExp_compile,\n\t\t\t},\n\t\t}\n\t\truntime.global.RegExpPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"RegExp\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       prototypeValueRegExp,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"toString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"exec\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: exec_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"test\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: test_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"compile\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: compile_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"toString\",\n\t\t\t\t\"exec\",\n\t\t\t\t\"test\",\n\t\t\t\t\"compile\",\n\t\t\t},\n\t\t}\n\t\truntime.global.RegExp = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"RegExp\",\n\t\t\t\tcall:      builtinRegExp,\n\t\t\t\tconstruct: builtinNewRegExp,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.RegExpPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.RegExpPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.RegExp,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\ttoString_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"toString\",\n\t\t\t\tcall: builtinError_toString,\n\t\t\t},\n\t\t}\n\t\truntime.global.ErrorPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Error\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"toString\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: toString_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"name\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"Error\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"message\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"toString\",\n\t\t\t\t\"name\",\n\t\t\t\t\"message\",\n\t\t\t},\n\t\t}\n\t\truntime.global.Error = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"Error\",\n\t\t\t\tcall:      builtinError,\n\t\t\t\tconstruct: builtinNewError,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.ErrorPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.ErrorPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Error,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\truntime.global.EvalErrorPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"EvalError\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ErrorPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"name\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"EvalError\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"name\",\n\t\t\t},\n\t\t}\n\t\truntime.global.EvalError = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"EvalError\",\n\t\t\t\tcall:      builtinEvalError,\n\t\t\t\tconstruct: builtinNewEvalError,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.EvalErrorPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.EvalErrorPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.EvalError,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\truntime.global.TypeErrorPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"TypeError\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ErrorPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"name\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"TypeError\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"name\",\n\t\t\t},\n\t\t}\n\t\truntime.global.TypeError = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"TypeError\",\n\t\t\t\tcall:      builtinTypeError,\n\t\t\t\tconstruct: builtinNewTypeError,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.TypeErrorPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.TypeErrorPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.TypeError,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\truntime.global.RangeErrorPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"RangeError\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ErrorPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"name\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"RangeError\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"name\",\n\t\t\t},\n\t\t}\n\t\truntime.global.RangeError = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"RangeError\",\n\t\t\t\tcall:      builtinRangeError,\n\t\t\t\tconstruct: builtinNewRangeError,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.RangeErrorPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.RangeErrorPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.RangeError,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\truntime.global.ReferenceErrorPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"ReferenceError\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ErrorPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"name\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"ReferenceError\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"name\",\n\t\t\t},\n\t\t}\n\t\truntime.global.ReferenceError = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"ReferenceError\",\n\t\t\t\tcall:      builtinReferenceError,\n\t\t\t\tconstruct: builtinNewReferenceError,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.ReferenceErrorPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.ReferenceErrorPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.ReferenceError,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\truntime.global.SyntaxErrorPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"SyntaxError\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ErrorPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"name\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"SyntaxError\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"name\",\n\t\t\t},\n\t\t}\n\t\truntime.global.SyntaxError = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"SyntaxError\",\n\t\t\t\tcall:      builtinSyntaxError,\n\t\t\t\tconstruct: builtinNewSyntaxError,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.SyntaxErrorPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.SyntaxErrorPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.SyntaxError,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\truntime.global.URIErrorPrototype = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"URIError\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ErrorPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue:       nil,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"name\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueString,\n\t\t\t\t\t\tvalue: \"URIError\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"name\",\n\t\t\t},\n\t\t}\n\t\truntime.global.URIError = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname:      \"URIError\",\n\t\t\t\tcall:      builtinURIError,\n\t\t\t\tconstruct: builtinNewURIError,\n\t\t\t},\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"prototype\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: runtime.global.URIErrorPrototype,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t\t\"prototype\",\n\t\t\t},\n\t\t}\n\t\truntime.global.URIErrorPrototype.property[\"constructor\"] =\n\t\t\t_property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.URIError,\n\t\t\t\t},\n\t\t\t}\n\t}\n\t{\n\t\tparse_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"parse\",\n\t\t\t\tcall: builtinJSON_parse,\n\t\t\t},\n\t\t}\n\t\tstringify_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 3,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"stringify\",\n\t\t\t\tcall: builtinJSON_stringify,\n\t\t\t},\n\t\t}\n\t\truntime.global.JSON = &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"JSON\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"parse\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: parse_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"stringify\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: stringify_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"parse\",\n\t\t\t\t\"stringify\",\n\t\t\t},\n\t\t}\n\t}\n\t{\n\t\teval_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"eval\",\n\t\t\t\tcall: builtinGlobal_eval,\n\t\t\t},\n\t\t}\n\t\tparseInt_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 2,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"parseInt\",\n\t\t\t\tcall: builtinGlobal_parseInt,\n\t\t\t},\n\t\t}\n\t\tparseFloat_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"parseFloat\",\n\t\t\t\tcall: builtinGlobal_parseFloat,\n\t\t\t},\n\t\t}\n\t\tisNaN_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"isNaN\",\n\t\t\t\tcall: builtinGlobal_isNaN,\n\t\t\t},\n\t\t}\n\t\tisFinite_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"isFinite\",\n\t\t\t\tcall: builtinGlobal_isFinite,\n\t\t\t},\n\t\t}\n\t\tdecodeURI_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"decodeURI\",\n\t\t\t\tcall: builtinGlobal_decodeURI,\n\t\t\t},\n\t\t}\n\t\tdecodeURIComponent_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"decodeURIComponent\",\n\t\t\t\tcall: builtinGlobal_decodeURIComponent,\n\t\t\t},\n\t\t}\n\t\tencodeURI_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"encodeURI\",\n\t\t\t\tcall: builtinGlobal_encodeURI,\n\t\t\t},\n\t\t}\n\t\tencodeURIComponent_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"encodeURIComponent\",\n\t\t\t\tcall: builtinGlobal_encodeURIComponent,\n\t\t\t},\n\t\t}\n\t\tescape_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"escape\",\n\t\t\t\tcall: builtinGlobal_escape,\n\t\t\t},\n\t\t}\n\t\tunescape_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 1,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"unescape\",\n\t\t\t\tcall: builtinGlobal_unescape,\n\t\t\t},\n\t\t}\n\t\truntime.globalObject.property = map[string]_property{\n\t\t\t\"eval\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: eval_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"parseInt\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: parseInt_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"parseFloat\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: parseFloat_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"isNaN\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: isNaN_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"isFinite\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: isFinite_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"decodeURI\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: decodeURI_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"decodeURIComponent\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: decodeURIComponent_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"encodeURI\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: encodeURI_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"encodeURIComponent\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: encodeURIComponent_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"escape\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: escape_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"unescape\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: unescape_function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Object\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Object,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Function\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Function,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Array\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Array,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"String\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.String,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Boolean\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Boolean,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Number\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Number,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Math\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Math,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Date\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Date,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"RegExp\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.RegExp,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Error\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.Error,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"EvalError\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.EvalError,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"TypeError\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.TypeError,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"RangeError\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.RangeError,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"ReferenceError\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.ReferenceError,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"SyntaxError\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.SyntaxError,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"URIError\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.URIError,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"JSON\": _property{\n\t\t\t\tmode: 0101,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\tvalue: runtime.global.JSON,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"undefined\": _property{\n\t\t\t\tmode: 0,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind: valueUndefined,\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"NaN\": _property{\n\t\t\t\tmode: 0,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\tvalue: math.NaN(),\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"Infinity\": _property{\n\t\t\t\tmode: 0,\n\t\t\t\tvalue: Value{\n\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\tvalue: math.Inf(+1),\n\t\t\t\t},\n\t\t\t},\n\t\t}\n\t\truntime.globalObject.propertyOrder = []string{\n\t\t\t\"eval\",\n\t\t\t\"parseInt\",\n\t\t\t\"parseFloat\",\n\t\t\t\"isNaN\",\n\t\t\t\"isFinite\",\n\t\t\t\"decodeURI\",\n\t\t\t\"decodeURIComponent\",\n\t\t\t\"encodeURI\",\n\t\t\t\"encodeURIComponent\",\n\t\t\t\"escape\",\n\t\t\t\"unescape\",\n\t\t\t\"Object\",\n\t\t\t\"Function\",\n\t\t\t\"Array\",\n\t\t\t\"String\",\n\t\t\t\"Boolean\",\n\t\t\t\"Number\",\n\t\t\t\"Math\",\n\t\t\t\"Date\",\n\t\t\t\"RegExp\",\n\t\t\t\"Error\",\n\t\t\t\"EvalError\",\n\t\t\t\"TypeError\",\n\t\t\t\"RangeError\",\n\t\t\t\"ReferenceError\",\n\t\t\t\"SyntaxError\",\n\t\t\t\"URIError\",\n\t\t\t\"JSON\",\n\t\t\t\"undefined\",\n\t\t\t\"NaN\",\n\t\t\t\"Infinity\",\n\t\t}\n\t}\n}\n\nfunc newConsoleObject(runtime *_runtime) *_object {\n\t{\n\t\tlog_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"log\",\n\t\t\t\tcall: builtinConsole_log,\n\t\t\t},\n\t\t}\n\t\tdebug_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"debug\",\n\t\t\t\tcall: builtinConsole_log,\n\t\t\t},\n\t\t}\n\t\tinfo_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"info\",\n\t\t\t\tcall: builtinConsole_log,\n\t\t\t},\n\t\t}\n\t\terror_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"error\",\n\t\t\t\tcall: builtinConsole_error,\n\t\t\t},\n\t\t}\n\t\twarn_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"warn\",\n\t\t\t\tcall: builtinConsole_error,\n\t\t\t},\n\t\t}\n\t\tdir_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"dir\",\n\t\t\t\tcall: builtinConsole_dir,\n\t\t\t},\n\t\t}\n\t\ttime_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"time\",\n\t\t\t\tcall: builtinConsole_time,\n\t\t\t},\n\t\t}\n\t\ttimeEnd_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"timeEnd\",\n\t\t\t\tcall: builtinConsole_timeEnd,\n\t\t\t},\n\t\t}\n\t\ttrace_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"trace\",\n\t\t\t\tcall: builtinConsole_trace,\n\t\t\t},\n\t\t}\n\t\tassert_function := &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Function\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.FunctionPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"length\": _property{\n\t\t\t\t\tmode: 0,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueNumber,\n\t\t\t\t\t\tvalue: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"length\",\n\t\t\t},\n\t\t\tvalue: _nativeFunctionObject{\n\t\t\t\tname: \"assert\",\n\t\t\t\tcall: builtinConsole_assert,\n\t\t\t},\n\t\t}\n\t\treturn &_object{\n\t\t\truntime:     runtime,\n\t\t\tclass:       \"Object\",\n\t\t\tobjectClass: _classObject,\n\t\t\tprototype:   runtime.global.ObjectPrototype,\n\t\t\textensible:  true,\n\t\t\tproperty: map[string]_property{\n\t\t\t\t\"log\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: log_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"debug\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: debug_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"info\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: info_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"error\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: error_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"warn\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: warn_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"dir\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: dir_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"time\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: time_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"timeEnd\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: timeEnd_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"trace\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: trace_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"assert\": _property{\n\t\t\t\t\tmode: 0101,\n\t\t\t\t\tvalue: Value{\n\t\t\t\t\t\tkind:  valueObject,\n\t\t\t\t\t\tvalue: assert_function,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tpropertyOrder: []string{\n\t\t\t\t\"log\",\n\t\t\t\t\"debug\",\n\t\t\t\t\"info\",\n\t\t\t\t\"error\",\n\t\t\t\t\"warn\",\n\t\t\t\t\"dir\",\n\t\t\t\t\"time\",\n\t\t\t\t\"timeEnd\",\n\t\t\t\t\"trace\",\n\t\t\t\t\"assert\",\n\t\t\t},\n\t\t}\n\t}\n}\n\nfunc toValue_int(value int) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_int8(value int8) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_int16(value int16) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_int32(value int32) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_int64(value int64) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_uint(value uint) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_uint8(value uint8) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_uint16(value uint16) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_uint32(value uint32) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_uint64(value uint64) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_float32(value float32) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_float64(value float64) Value {\n\treturn Value{\n\t\tkind:  valueNumber,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_string(value string) Value {\n\treturn Value{\n\t\tkind:  valueString,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_string16(value []uint16) Value {\n\treturn Value{\n\t\tkind:  valueString,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_bool(value bool) Value {\n\treturn Value{\n\t\tkind:  valueBoolean,\n\t\tvalue: value,\n\t}\n}\n\nfunc toValue_object(value *_object) Value {\n\treturn Value{\n\t\tkind:  valueObject,\n\t\tvalue: value,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/inline.pl",
    "content": "#!/usr/bin/env perl\n\nmy $_fmt;\n$_fmt = \"gofmt\";\n$_fmt = \"cat -n\" if \"cat\" eq ($ARGV[0] || \"\");\n\nuse strict;\nuse warnings;\nuse IO::File;\n\nmy $self = __PACKAGE__;\n\nsub functionLabel ($) {\n    return \"$_[0]_function\";\n}\n\nsub trim ($) {\n    local $_ = shift;\n    s/^\\s*//, s/\\s*$// for $_;\n    return $_;\n}\n\nopen my $fmt, \"|-\", \"$_fmt\" or die $!;\n\n$fmt->print(<<_END_);\npackage otto\n\nimport (\n    \"math\"\n)\n\nfunc _newContext(runtime *_runtime) {\n@{[ join \"\\n\", $self->newContext() ]}\n}    \n\nfunc newConsoleObject(runtime *_runtime) *_object {\n@{[ join \"\\n\", $self->newConsoleObject() ]}\n}    \n_END_\n\nfor (qw/int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float32 float64/) {\n    $fmt->print(<<_END_);\n\nfunc toValue_$_(value $_) Value {\n    return Value{\n        kind: valueNumber,\n        value: value,\n    }\n}\n_END_\n}\n\n$fmt->print(<<_END_);\n\nfunc toValue_string(value string) Value {\n    return Value{\n        kind: valueString,\n        value: value,\n    }\n}\n\nfunc toValue_string16(value []uint16) Value {\n    return Value{\n        kind: valueString,\n        value: value,\n    }\n}\n\nfunc toValue_bool(value bool) Value {\n    return Value{\n        kind: valueBoolean,\n        value: value,\n    }\n}\n\nfunc toValue_object(value *_object) Value {\n    return Value{\n        kind: valueObject,\n        value: value,\n    }\n}\n_END_\n\nclose $fmt;\n\nsub newConsoleObject {\n    my $self = shift;\n\n    return\n        $self->block(sub {\n            my $class = \"Console\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"log\", 0,\n                \"debug:log\", 0,\n                \"info:log\", 0,\n                \"error\", 0,\n                \"warn:error\", 0,\n                \"dir\", 0,\n                \"time\", 0,\n                \"timeEnd\", 0,\n                \"trace\", 0,\n                \"assert\", 0,\n            );\n            return\n            \"return @{[ $self->newObject(@got) ]}\"\n        }),\n    ;\n}\n\nsub newContext {\n    my $self = shift;\n    return\n        # ObjectPrototype\n        $self->block(sub {\n            my $class = \"Object\";\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classObject\",\n                undef,\n                \"prototypeValueObject\",\n            ),\n        }),\n\n        # FunctionPrototype\n        $self->block(sub {\n            my $class = \"Function\";\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classObject\",\n                \".ObjectPrototype\",\n                \"prototypeValueFunction\",\n            ),\n        }),\n\n        # ObjectPrototype\n        $self->block(sub {\n            my $class = \"Object\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"valueOf\", 0,\n                \"toString\", 0,\n                \"toLocaleString\", 0,\n                \"hasOwnProperty\", 1,\n                \"isPrototypeOf\", 1,\n                \"propertyIsEnumerable\", 1,\n            );\n            my @propertyMap = $self->propertyMap(\n                @got,\n                $self->property(\"constructor\", undef),\n            );\n            my $propertyOrder = $self->propertyOrder(@propertyMap);\n            $propertyOrder =~ s/^propertyOrder: //;\n            return\n            \".${class}Prototype.property =\", @propertyMap,\n            \".${class}Prototype.propertyOrder =\", $propertyOrder,\n        }),\n\n        # FunctionPrototype\n        $self->block(sub {\n            my $class = \"Function\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n                \"apply\", 2,\n                \"call\", 1,\n                \"bind\", 1,\n            );\n            my @propertyMap = $self->propertyMap(\n                @got,\n                $self->property(\"constructor\", undef),\n                $self->property(\"length\", $self->numberValue(0), \"0\"),\n            );\n            my $propertyOrder = $self->propertyOrder(@propertyMap);\n            $propertyOrder =~ s/^propertyOrder: //;\n            return\n            \".${class}Prototype.property =\", @propertyMap,\n            \".${class}Prototype.propertyOrder =\", $propertyOrder,\n        }),\n\n        # Object\n        $self->block(sub {\n            my $class = \"Object\";\n            return\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                1,\n                $self->functionDeclare(\n                    $class,\n                    \"getPrototypeOf\", 1,\n                    \"getOwnPropertyDescriptor\", 2,\n                    \"defineProperty\", 3,\n                    \"defineProperties\", 2,\n                    \"create\", 2,\n                    \"isExtensible\", 1,\n                    \"preventExtensions\", 1,\n                    \"isSealed\", 1,\n                    \"seal\", 1,\n                    \"isFrozen\", 1,\n                    \"freeze\", 1,\n                    \"keys\", 1,\n                    \"getOwnPropertyNames\", 1,\n                ),\n            ),\n        }),\n\n        # Function\n        $self->block(sub {\n            my $class = \"Function\";\n            return\n            \"Function :=\",\n            $self->globalFunction(\n                $class,\n                1,\n            ),\n            \".$class = Function\",\n        }),\n\n        # Array\n        $self->block(sub {\n            my $class = \"Array\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n                \"toLocaleString\", 0,\n                \"concat\", 1,\n                \"join\", 1,\n                \"splice\", 2,\n                \"shift\", 0,\n                \"pop\", 0,\n                \"push\", 1,\n                \"slice\", 2,\n                \"unshift\", 1,\n                \"reverse\", 0,\n                \"sort\", 1,\n                \"indexOf\", 1,\n                \"lastIndexOf\", 1,\n                \"every\", 1,\n                \"some\", 1,\n                \"forEach\", 1,\n                \"map\", 1,\n                \"filter\", 1,\n                \"reduce\", 1,\n                \"reduceRight\", 1,\n            );\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classArray\",\n                \".ObjectPrototype\",\n                undef,\n                $self->property(\"length\", $self->numberValue(\"uint32(0)\"), \"0100\"),\n                @got,\n            ),\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                1,\n                $self->functionDeclare(\n                    $class,\n                    \"isArray\", 1,\n                ),\n            ),\n        }),\n\n        # String\n        $self->block(sub {\n            my $class = \"String\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n                \"valueOf\", 0,\n                \"charAt\", 1,\n                \"charCodeAt\", 1,\n                \"concat\", 1,\n                \"indexOf\", 1,\n                \"lastIndexOf\", 1,\n                \"match\", 1,\n                \"replace\", 2,\n                \"search\", 1,\n                \"split\", 2,\n                \"slice\", 2,\n                \"substring\", 2,\n                \"toLowerCase\", 0,\n                \"toUpperCase\", 0,\n                \"substr\", 2,\n                \"trim\", 0,\n                \"trimLeft\", 0,\n                \"trimRight\", 0,\n                \"localeCompare\", 1,\n                \"toLocaleLowerCase\", 0,\n                \"toLocaleUpperCase\", 0,\n            );\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classString\",\n                \".ObjectPrototype\",\n                \"prototypeValueString\",\n                $self->property(\"length\", $self->numberValue(\"int(0)\"), \"0\"),\n                @got,\n            ),\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                1,\n                $self->functionDeclare(\n                    $class,\n\t\t            \"fromCharCode\", 1,\n                ),\n            ),\n        }),\n\n        # Boolean\n        $self->block(sub {\n            my $class = \"Boolean\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n                \"valueOf\", 0,\n            );\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classObject\",\n                \".ObjectPrototype\",\n                \"prototypeValueBoolean\",\n                @got,\n            ),\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                1,\n                $self->functionDeclare(\n                    $class,\n                ),\n            ),\n        }),\n\n        # Number\n        $self->block(sub {\n            my $class = \"Number\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n                \"valueOf\", 0,\n                \"toFixed\", 1,\n                \"toExponential\", 1,\n                \"toPrecision\", 1,\n                \"toLocaleString\", 1,\n            );\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classObject\",\n                \".ObjectPrototype\",\n                \"prototypeValueNumber\",\n                @got,\n            ),\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                1,\n                $self->functionDeclare(\n                    $class,\n                ),\n                $self->numberConstantDeclare(\n                    \"MAX_VALUE\", \"math.MaxFloat64\",\n                    \"MIN_VALUE\", \"math.SmallestNonzeroFloat64\",\n                    \"NaN\", \"math.NaN()\",\n                    \"NEGATIVE_INFINITY\", \"math.Inf(-1)\",\n                    \"POSITIVE_INFINITY\", \"math.Inf(+1)\",\n                ),\n            ),\n        }),\n\n        # Math\n        $self->block(sub {\n            my $class = \"Math\";\n            return\n            \".$class =\",\n            $self->globalObject(\n                $class,\n                $self->functionDeclare(\n                    $class,\n                    \"abs\", 1,\n                    \"acos\", 1,\n                    \"asin\", 1,\n                    \"atan\", 1,\n                    \"atan2\", 1,\n                    \"ceil\", 1,\n                    \"cos\", 1,\n                    \"exp\", 1,\n                    \"floor\", 1,\n                    \"log\", 1,\n                    \"max\", 2,\n                    \"min\", 2,\n                    \"pow\", 2,\n                    \"random\", 0,\n                    \"round\", 1,\n                    \"sin\", 1,\n                    \"sqrt\", 1,\n                    \"tan\", 1,\n                ),\n                $self->numberConstantDeclare(\n                    \"E\", \"math.E\",\n                    \"LN10\", \"math.Ln10\",\n                    \"LN2\", \"math.Ln2\",\n                    \"LOG2E\", \"math.Log2E\",\n                    \"LOG10E\", \"math.Log10E\",\n                    \"PI\", \"math.Pi\",\n                    \"SQRT1_2\", \"sqrt1_2\",\n                    \"SQRT2\", \"math.Sqrt2\",\n                )\n            ),\n        }),\n\n        # Date\n        $self->block(sub {\n            my $class = \"Date\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n                \"toDateString\", 0,\n                \"toTimeString\", 0,\n                \"toUTCString\", 0,\n                \"toISOString\", 0,\n                \"toJSON\", 1,\n                \"toGMTString\", 0,\n                \"toLocaleString\", 0,\n                \"toLocaleDateString\", 0,\n                \"toLocaleTimeString\", 0,\n                \"valueOf\", 0,\n                \"getTime\", 0,\n                \"getYear\", 0,\n                \"getFullYear\", 0,\n                \"getUTCFullYear\", 0,\n                \"getMonth\", 0,\n                \"getUTCMonth\", 0,\n                \"getDate\", 0,\n                \"getUTCDate\", 0,\n                \"getDay\", 0,\n                \"getUTCDay\", 0,\n                \"getHours\", 0,\n                \"getUTCHours\", 0,\n                \"getMinutes\", 0,\n                \"getUTCMinutes\", 0,\n                \"getSeconds\", 0,\n                \"getUTCSeconds\", 0,\n                \"getMilliseconds\", 0,\n                \"getUTCMilliseconds\", 0,\n                \"getTimezoneOffset\", 0,\n                \"setTime\", 1,\n                \"setMilliseconds\", 1,\n                \"setUTCMilliseconds\", 1,\n                \"setSeconds\", 2,\n                \"setUTCSeconds\", 2,\n                \"setMinutes\", 3,\n                \"setUTCMinutes\", 3,\n                \"setHours\", 4,\n                \"setUTCHours\", 4,\n                \"setDate\", 1,\n                \"setUTCDate\", 1,\n                \"setMonth\", 2,\n                \"setUTCMonth\", 2,\n                \"setYear\", 1,\n                \"setFullYear\", 3,\n                \"setUTCFullYear\", 3,\n            );\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classObject\",\n                \".ObjectPrototype\",\n                \"prototypeValueDate\",\n                @got,\n            ),\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                7,\n                $self->functionDeclare(\n                    $class,\n                    \"parse\", 1,\n                    \"UTC\", 7,\n                    \"now\", 0,\n                ),\n            ),\n        }),\n\n        # RegExp\n        $self->block(sub {\n            my $class = \"RegExp\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n                \"exec\", 1,\n                \"test\", 1,\n                \"compile\", 1,\n            );\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classObject\",\n                \".ObjectPrototype\",\n                \"prototypeValueRegExp\",\n                @got,\n            ),\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                2,\n                $self->functionDeclare(\n                    $class,\n                ),\n            ),\n        }),\n\n        # Error\n        $self->block(sub {\n            my $class = \"Error\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"toString\", 0,\n            );\n            return\n            \".${class}Prototype =\",\n            $self->globalPrototype(\n                $class,\n                \"_classObject\",\n                \".ObjectPrototype\",\n                undef,\n                @got,\n                $self->property(\"name\", $self->stringValue(\"Error\")),\n                $self->property(\"message\", $self->stringValue(\"\")),\n            ),\n            \".$class =\",\n            $self->globalFunction(\n                $class,\n                1,\n                $self->functionDeclare(\n                    $class,\n                ),\n            ),\n        }),\n\n        (map {\n            my $class = \"${_}Error\";\n            $self->block(sub {\n                my @got = $self->functionDeclare(\n                    $class,\n                );\n                return\n                \".${class}Prototype =\",\n                $self->globalPrototype(\n                    $class,\n                    \"_classObject\",\n                    \".ErrorPrototype\",\n                    undef,\n                    @got,\n                    $self->property(\"name\", $self->stringValue($class)),\n                ),\n                \".$class =\",\n                $self->globalFunction(\n                    $class,\n                    1,\n                    $self->functionDeclare(\n                        $class,\n                    ),\n                ),\n            });\n        } qw/Eval Type Range Reference Syntax URI/),\n\n        # JSON\n        $self->block(sub {\n            my $class = \"JSON\";\n            return\n            \".$class =\",\n            $self->globalObject(\n                $class,\n                $self->functionDeclare(\n                    $class,\n                    \"parse\", 2,\n                    \"stringify\", 3,\n                ),\n            ),\n        }),\n\n        # Global\n        $self->block(sub {\n            my $class = \"Global\";\n            my @got = $self->functionDeclare(\n                $class,\n                \"eval\", 1,\n                \"parseInt\", 2,\n                \"parseFloat\", 1,\n                \"isNaN\", 1,\n                \"isFinite\", 1,\n                \"decodeURI\", 1,\n                \"decodeURIComponent\", 1,\n                \"encodeURI\", 1,\n                \"encodeURIComponent\", 1,\n                \"escape\", 1,\n                \"unescape\", 1,\n            );\n            my @propertyMap = $self->propertyMap(\n                @got,\n                $self->globalDeclare(\n                    \"Object\",\n                    \"Function\",\n                    \"Array\",\n                    \"String\",\n                    \"Boolean\",\n                    \"Number\",\n                    \"Math\",\n                    \"Date\",\n                    \"RegExp\",\n                    \"Error\",\n                    \"EvalError\",\n                    \"TypeError\",\n                    \"RangeError\",\n                    \"ReferenceError\",\n                    \"SyntaxError\",\n                    \"URIError\",\n                    \"JSON\",\n                ),\n                $self->property(\"undefined\", $self->undefinedValue(), \"0\"),\n                $self->property(\"NaN\", $self->numberValue(\"math.NaN()\"), \"0\"),\n                $self->property(\"Infinity\", $self->numberValue(\"math.Inf(+1)\"), \"0\"),\n            );\n            my $propertyOrder = $self->propertyOrder(@propertyMap);\n            $propertyOrder =~ s/^propertyOrder: //;\n            return\n            \"runtime.globalObject.property =\",\n            @propertyMap,\n            \"runtime.globalObject.propertyOrder =\",\n            $propertyOrder,\n            ;\n        }),\n    ;\n}\n\nsub propertyMap {\n    my $self = shift;\n    return \"map[string]_property{\", (join \",\\n\", @_, \"\"), \"}\",\n}\n\nour (@preblock, @postblock);\nsub block {\n    my $self = shift;\n    local @preblock = ();\n    local @postblock = ();\n    my @input = $_[0]->();\n    my @output;\n    while (@input) {\n        local $_ = shift @input;\n        if (m/^\\./) {\n            $_ = \"runtime.global$_\";\n        }\n        if (m/ :?=$/) {\n            $_ .= shift @input;\n        }\n        push @output, $_;\n    }\n    return\n    \"{\",\n        @preblock,\n        @output,\n        @postblock,\n    \"}\",\n    ;\n}\n\nsub numberConstantDeclare {\n    my $self = shift;\n    my @got;\n    while (@_) {\n        my $name = shift;\n        my $value = shift;\n        push @got, $self->property($name, $self->numberValue($value), \"0\"),\n    }\n    return @got;\n}\n\nsub functionDeclare {\n    my $self = shift;\n    my $class = shift;\n    my $builtin = \"builtin${class}\";\n    my @got;\n    while (@_) {\n        my $name = shift;\n        my $length = shift;\n        $name = $self->newFunction($name, \"${builtin}_\", $length);\n        push @got, $self->functionProperty($name),\n    }\n    return @got;\n}\n\nsub globalDeclare {\n    my $self = shift;\n    my @got;\n    while (@_) {\n        my $name = shift;\n        push @got, $self->property($name, $self->objectValue(\"runtime.global.$name\"), \"0101\"),\n    }\n    return @got;\n}\n\nsub propertyOrder {\n    my $self = shift;\n    my $propertyMap = join \"\", @_;\n\n    my (@keys) = $propertyMap =~ m/(\"\\w+\"):/g;\n    my $propertyOrder =\n        join \"\\n\", \"propertyOrder: []string{\", (join \",\\n\", @keys, \"\"), \"}\";\n    return $propertyOrder;\n}\n\nsub globalObject {\n    my $self = shift;\n    my $name = shift;\n    \n    my $propertyMap = \"\";\n    if (@_) {\n        $propertyMap = join \"\\n\", $self->propertyMap(@_);\n        my $propertyOrder = $self->propertyOrder($propertyMap);\n        $propertyMap = \"property: $propertyMap,\\n$propertyOrder,\";\n    }\n\n    return trim <<_END_;\n&_object{\n    runtime: runtime,\n    class: \"$name\",\n    objectClass: _classObject,\n    prototype: runtime.global.ObjectPrototype,\n    extensible: true,\n    $propertyMap\n}\n_END_\n}\n\nsub globalFunction {\n    my $self = shift;\n    my $name = shift;\n    my $length = shift;\n    \n    my $builtin = \"builtin${name}\";\n    my $builtinNew = \"builtinNew${name}\";\n    my $prototype = \"runtime.global.${name}Prototype\";\n    my $propertyMap = \"\";\n    unshift @_,\n        $self->property(\"length\", $self->numberValue($length), \"0\"),\n        $self->property(\"prototype\", $self->objectValue($prototype), \"0\"),\n    ;\n\n    if (@_) {\n        $propertyMap = join \"\\n\", $self->propertyMap(@_);\n        my $propertyOrder = $self->propertyOrder($propertyMap);\n        $propertyMap = \"property: $propertyMap,\\n$propertyOrder,\";\n    }\n\n    push @postblock, $self->statement(\n        \"$prototype.property[\\\"constructor\\\"] =\",\n        $self->property(undef, $self->objectValue(\"runtime.global.${name}\"), \"0101\"),\n    );\n\n    return trim <<_END_;\n&_object{\n    runtime: runtime,\n    class: \"Function\",\n    objectClass: _classObject,\n    prototype: runtime.global.FunctionPrototype,\n    extensible: true,\n    value: @{[ $self->nativeFunctionOf($name, $builtin, $builtinNew) ]},\n    $propertyMap\n}\n_END_\n}\n\nsub nativeCallFunction {\n    my $self = shift;\n    my $name = shift;\n    my $func = shift;\n    return trim <<_END_;\n_nativeCallFunction{ \"$name\", $func }\n_END_\n}\n\nsub globalPrototype {\n    my $self = shift;\n    my $class = shift;\n    my $classObject = shift;\n    my $prototype = shift;\n    my $value = shift;\n\n    if (!defined $prototype) {\n        $prototype = \"nil\";\n    }\n\n    if (!defined $value) {\n        $value = \"nil\";\n    }\n\n    if ($prototype =~ m/^\\./) {\n        $prototype = \"runtime.global$prototype\";\n    }\n\n    my $propertyMap = \"\";\n    if (@_) {\n        $propertyMap = join \"\\n\", $self->propertyMap(@_);\n        my $propertyOrder = $self->propertyOrder($propertyMap);\n        $propertyMap = \"property: $propertyMap,\\n$propertyOrder,\";\n    }\n\n    return trim <<_END_;\n&_object{\n    runtime: runtime,\n    class: \"$class\",\n    objectClass: $classObject,\n    prototype: $prototype,\n    extensible: true,\n    value: $value,\n    $propertyMap\n}\n_END_\n}\n\nsub newFunction {\n    my $self = shift;\n    my $name = shift;\n    my $func = shift;\n    my $length = shift;\n\n    my @name = ($name, $name);\n    if ($name =~ m/^(\\w+):(\\w+)$/) {\n        @name = ($1, $2);\n        $name = $name[0];\n    }\n\n    if ($func =~ m/^builtin\\w+_$/) {\n        $func = \"$func$name[1]\";\n    }\n\n    my $propertyOrder = \"\";\n    my @propertyMap = (\n        $self->property(\"length\", $self->numberValue($length), \"0\"),\n    );\n\n    if (@propertyMap) {\n        $propertyOrder = $self->propertyOrder(@propertyMap);\n        $propertyOrder = \"$propertyOrder,\";\n    }\n\n    my $label = functionLabel($name);\n    push @preblock, $self->statement(\n        \"$label := @{[ trim <<_END_ ]}\",\n&_object{\n    runtime: runtime,\n    class: \"Function\",\n    objectClass: _classObject,\n    prototype: runtime.global.FunctionPrototype,\n    extensible: true,\n    property: @{[ join \"\\n\", $self->propertyMap(@propertyMap) ]},\n    $propertyOrder\n    value: @{[ $self->nativeFunctionOf($name, $func) ]},\n} \n_END_\n    );\n\n    return $name;\n}\n\nsub newObject {\n    my $self = shift;\n\n    my $propertyMap = join \"\\n\", $self->propertyMap(@_);\n    my $propertyOrder = $self->propertyOrder($propertyMap);\n\n    return trim <<_END_;\n&_object{\n    runtime: runtime,\n    class: \"Object\",\n    objectClass: _classObject,\n    prototype: runtime.global.ObjectPrototype,\n    extensible: true,\n    property: $propertyMap,\n    $propertyOrder,\n} \n_END_\n}\n\nsub newPrototypeObject {\n    my $self = shift;\n    my $class = shift;\n    my $objectClass = shift;\n    my $value = shift;\n    if (defined $value) {\n        $value = \"value: $value,\";\n    }\n\n    my $propertyMap = join \"\\n\", $self->propertyMap(@_);\n    my $propertyOrder = $self->propertyOrder($propertyMap);\n\n    return trim <<_END_;\n&_object{\n    runtime: runtime,\n    class: \"$class\",\n    objectClass: $objectClass,\n    prototype: runtime.global.ObjectPrototype,\n    extensible: true,\n    property: $propertyMap,\n    $propertyOrder,\n    $value\n} \n_END_\n}\n\nsub functionProperty {\n    my $self = shift;\n    my $name = shift;\n\n    return $self->property(\n        $name,\n        $self->objectValue(functionLabel($name))\n    );\n}\n\nsub statement {\n    my $self = shift;\n    return join \"\\n\", @_;\n}\n\nsub functionOf {\n    my $self = shift;\n    my $call = shift;\n    my $construct = shift;\n    if ($construct) {\n        $construct = \"construct: $construct,\";\n    } else {\n        $construct = \"\";\n    }\n\n    return trim <<_END_\n_functionObject{\n    call: $call,\n    $construct\n}\n_END_\n}\n\nsub nativeFunctionOf {\n    my $self = shift;\n    my $name = shift;\n    my $call = shift;\n    my $construct = shift;\n    if ($construct) {\n        $construct = \"construct: $construct,\";\n    } else {\n        $construct = \"\";\n    }\n\n    return trim <<_END_\n_nativeFunctionObject{\n    name: \"$name\",\n    call: $call,\n    $construct\n}\n_END_\n}\n\nsub nameProperty {\n    my $self = shift;\n    my $name = shift;\n    my $value = shift;\n\n    return trim <<_END_;\n\"$name\": _property{\n    mode: 0101,\n    value: $value,\n}\n_END_\n}\n\nsub numberValue {\n    my $self = shift;\n    my $value = shift;\n    return trim <<_END_;\nValue{\n    kind: valueNumber,\n    value: $value,\n}\n_END_\n}\n\nsub property {\n    my $self = shift;\n    my $name = shift;\n    my $value = shift;\n    my $mode = shift;\n    $mode = \"0101\" unless defined $mode;\n    if (! defined $value) {\n        $value = \"Value{}\";\n    }\n    if (defined $name) {\n        return trim <<_END_;\n\"$name\": _property{\n    mode: $mode,\n    value: $value,\n}\n_END_\n    } else {\n        return trim <<_END_;\n_property{\n    mode: $mode,\n    value: $value,\n}\n_END_\n    }\n\n}\n\nsub objectProperty {\n    my $self = shift;\n    my $name = shift;\n    my $value = shift;\n\n    return trim <<_END_;\n\"$name\": _property{\n    mode: 0101,\n    value: @{[ $self->objectValue($value)]},\n}\n_END_\n}\n\nsub objectValue {\n    my $self = shift;\n    my $value = shift;\n    return trim <<_END_\nValue{\n    kind: valueObject,\n    value: $value,\n}\n_END_\n}\n\nsub stringValue {\n    my $self = shift;\n    my $value = shift;\n    return trim <<_END_\nValue{\n    kind: valueString,\n    value: \"$value\",\n}\n_END_\n}\n\nsub booleanValue {\n    my $self = shift;\n    my $value = shift;\n    return trim <<_END_\nValue{\n    kind: valueBoolean,\n    value: $value,\n}\n_END_\n}\n\nsub undefinedValue {\n    my $self = shift;\n    return trim <<_END_\nValue{\n    kind: valueUndefined,\n}\n_END_\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/object.go",
    "content": "package otto\n\ntype _object struct {\n\truntime *_runtime\n\n\tclass       string\n\tobjectClass *_objectClass\n\tvalue       interface{}\n\n\tprototype  *_object\n\textensible bool\n\n\tproperty      map[string]_property\n\tpropertyOrder []string\n}\n\nfunc newObject(runtime *_runtime, class string) *_object {\n\tself := &_object{\n\t\truntime:     runtime,\n\t\tclass:       class,\n\t\tobjectClass: _classObject,\n\t\tproperty:    make(map[string]_property),\n\t\textensible:  true,\n\t}\n\treturn self\n}\n\n// 8.12\n\n// 8.12.1\nfunc (self *_object) getOwnProperty(name string) *_property {\n\treturn self.objectClass.getOwnProperty(self, name)\n}\n\n// 8.12.2\nfunc (self *_object) getProperty(name string) *_property {\n\treturn self.objectClass.getProperty(self, name)\n}\n\n// 8.12.3\nfunc (self *_object) get(name string) Value {\n\treturn self.objectClass.get(self, name)\n}\n\n// 8.12.4\nfunc (self *_object) canPut(name string) bool {\n\treturn self.objectClass.canPut(self, name)\n}\n\n// 8.12.5\nfunc (self *_object) put(name string, value Value, throw bool) {\n\tself.objectClass.put(self, name, value, throw)\n}\n\n// 8.12.6\nfunc (self *_object) hasProperty(name string) bool {\n\treturn self.objectClass.hasProperty(self, name)\n}\n\nfunc (self *_object) hasOwnProperty(name string) bool {\n\treturn self.objectClass.hasOwnProperty(self, name)\n}\n\ntype _defaultValueHint int\n\nconst (\n\tdefaultValueNoHint _defaultValueHint = iota\n\tdefaultValueHintString\n\tdefaultValueHintNumber\n)\n\n// 8.12.8\nfunc (self *_object) DefaultValue(hint _defaultValueHint) Value {\n\tif hint == defaultValueNoHint {\n\t\tif self.class == \"Date\" {\n\t\t\t// Date exception\n\t\t\thint = defaultValueHintString\n\t\t} else {\n\t\t\thint = defaultValueHintNumber\n\t\t}\n\t}\n\tmethodSequence := []string{\"valueOf\", \"toString\"}\n\tif hint == defaultValueHintString {\n\t\tmethodSequence = []string{\"toString\", \"valueOf\"}\n\t}\n\tfor _, methodName := range methodSequence {\n\t\tmethod := self.get(methodName)\n\t\t// FIXME This is redundant...\n\t\tif method.isCallable() {\n\t\t\tresult := method._object().call(toValue_object(self), nil, false, nativeFrame)\n\t\t\tif result.IsPrimitive() {\n\t\t\t\treturn result\n\t\t\t}\n\t\t}\n\t}\n\n\tpanic(self.runtime.panicTypeError())\n}\n\nfunc (self *_object) String() string {\n\treturn self.DefaultValue(defaultValueHintString).string()\n}\n\nfunc (self *_object) defineProperty(name string, value Value, mode _propertyMode, throw bool) bool {\n\treturn self.defineOwnProperty(name, _property{value, mode}, throw)\n}\n\n// 8.12.9\nfunc (self *_object) defineOwnProperty(name string, descriptor _property, throw bool) bool {\n\treturn self.objectClass.defineOwnProperty(self, name, descriptor, throw)\n}\n\nfunc (self *_object) delete(name string, throw bool) bool {\n\treturn self.objectClass.delete(self, name, throw)\n}\n\nfunc (self *_object) enumerate(all bool, each func(string) bool) {\n\tself.objectClass.enumerate(self, all, each)\n}\n\nfunc (self *_object) _exists(name string) bool {\n\t_, exists := self.property[name]\n\treturn exists\n}\n\nfunc (self *_object) _read(name string) (_property, bool) {\n\tproperty, exists := self.property[name]\n\treturn property, exists\n}\n\nfunc (self *_object) _write(name string, value interface{}, mode _propertyMode) {\n\tif value == nil {\n\t\tvalue = Value{}\n\t}\n\t_, exists := self.property[name]\n\tself.property[name] = _property{value, mode}\n\tif !exists {\n\t\tself.propertyOrder = append(self.propertyOrder, name)\n\t}\n}\n\nfunc (self *_object) _delete(name string) {\n\t_, exists := self.property[name]\n\tdelete(self.property, name)\n\tif exists {\n\t\tfor index, property := range self.propertyOrder {\n\t\t\tif name == property {\n\t\t\t\tif index == len(self.propertyOrder)-1 {\n\t\t\t\t\tself.propertyOrder = self.propertyOrder[:index]\n\t\t\t\t} else {\n\t\t\t\t\tself.propertyOrder = append(self.propertyOrder[:index], self.propertyOrder[index+1:]...)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/object_class.go",
    "content": "package otto\n\nimport (\n\t\"encoding/json\"\n)\n\ntype _objectClass struct {\n\tgetOwnProperty    func(*_object, string) *_property\n\tgetProperty       func(*_object, string) *_property\n\tget               func(*_object, string) Value\n\tcanPut            func(*_object, string) bool\n\tput               func(*_object, string, Value, bool)\n\thasProperty       func(*_object, string) bool\n\thasOwnProperty    func(*_object, string) bool\n\tdefineOwnProperty func(*_object, string, _property, bool) bool\n\tdelete            func(*_object, string, bool) bool\n\tenumerate         func(*_object, bool, func(string) bool)\n\tclone             func(*_object, *_object, *_clone) *_object\n\tmarshalJSON       func(*_object) json.Marshaler\n}\n\nfunc objectEnumerate(self *_object, all bool, each func(string) bool) {\n\tfor _, name := range self.propertyOrder {\n\t\tif all || self.property[name].enumerable() {\n\t\t\tif !each(name) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nvar (\n\t_classObject,\n\t_classArray,\n\t_classString,\n\t_classArguments,\n\t_classGoStruct,\n\t_classGoMap,\n\t_classGoArray,\n\t_classGoSlice,\n\t_ *_objectClass\n)\n\nfunc init() {\n\t_classObject = &_objectClass{\n\t\tobjectGetOwnProperty,\n\t\tobjectGetProperty,\n\t\tobjectGet,\n\t\tobjectCanPut,\n\t\tobjectPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\tobjectDefineOwnProperty,\n\t\tobjectDelete,\n\t\tobjectEnumerate,\n\t\tobjectClone,\n\t\tnil,\n\t}\n\n\t_classArray = &_objectClass{\n\t\tobjectGetOwnProperty,\n\t\tobjectGetProperty,\n\t\tobjectGet,\n\t\tobjectCanPut,\n\t\tobjectPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\tarrayDefineOwnProperty,\n\t\tobjectDelete,\n\t\tobjectEnumerate,\n\t\tobjectClone,\n\t\tnil,\n\t}\n\n\t_classString = &_objectClass{\n\t\tstringGetOwnProperty,\n\t\tobjectGetProperty,\n\t\tobjectGet,\n\t\tobjectCanPut,\n\t\tobjectPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\tobjectDefineOwnProperty,\n\t\tobjectDelete,\n\t\tstringEnumerate,\n\t\tobjectClone,\n\t\tnil,\n\t}\n\n\t_classArguments = &_objectClass{\n\t\targumentsGetOwnProperty,\n\t\tobjectGetProperty,\n\t\targumentsGet,\n\t\tobjectCanPut,\n\t\tobjectPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\targumentsDefineOwnProperty,\n\t\targumentsDelete,\n\t\tobjectEnumerate,\n\t\tobjectClone,\n\t\tnil,\n\t}\n\n\t_classGoStruct = &_objectClass{\n\t\tgoStructGetOwnProperty,\n\t\tobjectGetProperty,\n\t\tobjectGet,\n\t\tgoStructCanPut,\n\t\tgoStructPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\tobjectDefineOwnProperty,\n\t\tobjectDelete,\n\t\tgoStructEnumerate,\n\t\tobjectClone,\n\t\tgoStructMarshalJSON,\n\t}\n\n\t_classGoMap = &_objectClass{\n\t\tgoMapGetOwnProperty,\n\t\tobjectGetProperty,\n\t\tobjectGet,\n\t\tobjectCanPut,\n\t\tobjectPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\tgoMapDefineOwnProperty,\n\t\tgoMapDelete,\n\t\tgoMapEnumerate,\n\t\tobjectClone,\n\t\tnil,\n\t}\n\n\t_classGoArray = &_objectClass{\n\t\tgoArrayGetOwnProperty,\n\t\tobjectGetProperty,\n\t\tobjectGet,\n\t\tobjectCanPut,\n\t\tobjectPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\tgoArrayDefineOwnProperty,\n\t\tgoArrayDelete,\n\t\tgoArrayEnumerate,\n\t\tobjectClone,\n\t\tnil,\n\t}\n\n\t_classGoSlice = &_objectClass{\n\t\tgoSliceGetOwnProperty,\n\t\tobjectGetProperty,\n\t\tobjectGet,\n\t\tobjectCanPut,\n\t\tobjectPut,\n\t\tobjectHasProperty,\n\t\tobjectHasOwnProperty,\n\t\tgoSliceDefineOwnProperty,\n\t\tgoSliceDelete,\n\t\tgoSliceEnumerate,\n\t\tobjectClone,\n\t\tnil,\n\t}\n}\n\n// Allons-y\n\n// 8.12.1\nfunc objectGetOwnProperty(self *_object, name string) *_property {\n\t// Return a _copy_ of the property\n\tproperty, exists := self._read(name)\n\tif !exists {\n\t\treturn nil\n\t}\n\treturn &property\n}\n\n// 8.12.2\nfunc objectGetProperty(self *_object, name string) *_property {\n\tproperty := self.getOwnProperty(name)\n\tif property != nil {\n\t\treturn property\n\t}\n\tif self.prototype != nil {\n\t\treturn self.prototype.getProperty(name)\n\t}\n\treturn nil\n}\n\n// 8.12.3\nfunc objectGet(self *_object, name string) Value {\n\tproperty := self.getProperty(name)\n\tif property != nil {\n\t\treturn property.get(self)\n\t}\n\treturn Value{}\n}\n\n// 8.12.4\nfunc objectCanPut(self *_object, name string) bool {\n\tcanPut, _, _ := _objectCanPut(self, name)\n\treturn canPut\n}\n\nfunc _objectCanPut(self *_object, name string) (canPut bool, property *_property, setter *_object) {\n\tproperty = self.getOwnProperty(name)\n\tif property != nil {\n\t\tswitch propertyValue := property.value.(type) {\n\t\tcase Value:\n\t\t\tcanPut = property.writable()\n\t\t\treturn\n\t\tcase _propertyGetSet:\n\t\t\tsetter = propertyValue[1]\n\t\t\tcanPut = setter != nil\n\t\t\treturn\n\t\tdefault:\n\t\t\tpanic(self.runtime.panicTypeError())\n\t\t}\n\t}\n\n\tif self.prototype == nil {\n\t\treturn self.extensible, nil, nil\n\t}\n\n\tproperty = self.prototype.getProperty(name)\n\tif property == nil {\n\t\treturn self.extensible, nil, nil\n\t}\n\n\tswitch propertyValue := property.value.(type) {\n\tcase Value:\n\t\tif !self.extensible {\n\t\t\treturn false, nil, nil\n\t\t}\n\t\treturn property.writable(), nil, nil\n\tcase _propertyGetSet:\n\t\tsetter = propertyValue[1]\n\t\tcanPut = setter != nil\n\t\treturn\n\tdefault:\n\t\tpanic(self.runtime.panicTypeError())\n\t}\n}\n\n// 8.12.5\nfunc objectPut(self *_object, name string, value Value, throw bool) {\n\n\tif true {\n\t\t// Shortcut...\n\t\t//\n\t\t// So, right now, every class is using objectCanPut and every class\n\t\t// is using objectPut.\n\t\t//\n\t\t// If that were to no longer be the case, we would have to have\n\t\t// something to detect that here, so that we do not use an\n\t\t// incompatible canPut routine\n\t\tcanPut, property, setter := _objectCanPut(self, name)\n\t\tif !canPut {\n\t\t\tself.runtime.typeErrorResult(throw)\n\t\t} else if setter != nil {\n\t\t\tsetter.call(toValue(self), []Value{value}, false, nativeFrame)\n\t\t} else if property != nil {\n\t\t\tproperty.value = value\n\t\t\tself.defineOwnProperty(name, *property, throw)\n\t\t} else {\n\t\t\tself.defineProperty(name, value, 0111, throw)\n\t\t}\n\t\treturn\n\t}\n\n\t// The long way...\n\t//\n\t// Right now, code should never get here, see above\n\tif !self.canPut(name) {\n\t\tself.runtime.typeErrorResult(throw)\n\t\treturn\n\t}\n\n\tproperty := self.getOwnProperty(name)\n\tif property == nil {\n\t\tproperty = self.getProperty(name)\n\t\tif property != nil {\n\t\t\tif getSet, isAccessor := property.value.(_propertyGetSet); isAccessor {\n\t\t\t\tgetSet[1].call(toValue(self), []Value{value}, false, nativeFrame)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tself.defineProperty(name, value, 0111, throw)\n\t} else {\n\t\tswitch propertyValue := property.value.(type) {\n\t\tcase Value:\n\t\t\tproperty.value = value\n\t\t\tself.defineOwnProperty(name, *property, throw)\n\t\tcase _propertyGetSet:\n\t\t\tif propertyValue[1] != nil {\n\t\t\t\tpropertyValue[1].call(toValue(self), []Value{value}, false, nativeFrame)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif throw {\n\t\t\t\tpanic(self.runtime.panicTypeError())\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(self.runtime.panicTypeError())\n\t\t}\n\t}\n}\n\n// 8.12.6\nfunc objectHasProperty(self *_object, name string) bool {\n\treturn self.getProperty(name) != nil\n}\n\nfunc objectHasOwnProperty(self *_object, name string) bool {\n\treturn self.getOwnProperty(name) != nil\n}\n\n// 8.12.9\nfunc objectDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool {\n\tproperty, exists := self._read(name)\n\t{\n\t\tif !exists {\n\t\t\tif !self.extensible {\n\t\t\t\tgoto Reject\n\t\t\t}\n\t\t\tif newGetSet, isAccessor := descriptor.value.(_propertyGetSet); isAccessor {\n\t\t\t\tif newGetSet[0] == &_nilGetSetObject {\n\t\t\t\t\tnewGetSet[0] = nil\n\t\t\t\t}\n\t\t\t\tif newGetSet[1] == &_nilGetSetObject {\n\t\t\t\t\tnewGetSet[1] = nil\n\t\t\t\t}\n\t\t\t\tdescriptor.value = newGetSet\n\t\t\t}\n\t\t\tself._write(name, descriptor.value, descriptor.mode)\n\t\t\treturn true\n\t\t}\n\t\tif descriptor.isEmpty() {\n\t\t\treturn true\n\t\t}\n\n\t\t// TODO Per 8.12.9.6 - We should shortcut here (returning true) if\n\t\t// the current and new (define) properties are the same\n\n\t\tconfigurable := property.configurable()\n\t\tif !configurable {\n\t\t\tif descriptor.configurable() {\n\t\t\t\tgoto Reject\n\t\t\t}\n\t\t\t// Test that, if enumerable is set on the property descriptor, then it should\n\t\t\t// be the same as the existing property\n\t\t\tif descriptor.enumerateSet() && descriptor.enumerable() != property.enumerable() {\n\t\t\t\tgoto Reject\n\t\t\t}\n\t\t}\n\t\tvalue, isDataDescriptor := property.value.(Value)\n\t\tgetSet, _ := property.value.(_propertyGetSet)\n\t\tif descriptor.isGenericDescriptor() {\n\t\t\t// GenericDescriptor\n\t\t} else if isDataDescriptor != descriptor.isDataDescriptor() {\n\t\t\t// DataDescriptor <=> AccessorDescriptor\n\t\t\tif !configurable {\n\t\t\t\tgoto Reject\n\t\t\t}\n\t\t} else if isDataDescriptor && descriptor.isDataDescriptor() {\n\t\t\t// DataDescriptor <=> DataDescriptor\n\t\t\tif !configurable {\n\t\t\t\tif !property.writable() && descriptor.writable() {\n\t\t\t\t\tgoto Reject\n\t\t\t\t}\n\t\t\t\tif !property.writable() {\n\t\t\t\t\tif descriptor.value != nil && !sameValue(value, descriptor.value.(Value)) {\n\t\t\t\t\t\tgoto Reject\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// AccessorDescriptor <=> AccessorDescriptor\n\t\t\tnewGetSet, _ := descriptor.value.(_propertyGetSet)\n\t\t\tpresentGet, presentSet := true, true\n\t\t\tif newGetSet[0] == &_nilGetSetObject {\n\t\t\t\t// Present, but nil\n\t\t\t\tnewGetSet[0] = nil\n\t\t\t} else if newGetSet[0] == nil {\n\t\t\t\t// Missing, not even nil\n\t\t\t\tnewGetSet[0] = getSet[0]\n\t\t\t\tpresentGet = false\n\t\t\t}\n\t\t\tif newGetSet[1] == &_nilGetSetObject {\n\t\t\t\t// Present, but nil\n\t\t\t\tnewGetSet[1] = nil\n\t\t\t} else if newGetSet[1] == nil {\n\t\t\t\t// Missing, not even nil\n\t\t\t\tnewGetSet[1] = getSet[1]\n\t\t\t\tpresentSet = false\n\t\t\t}\n\t\t\tif !configurable {\n\t\t\t\tif (presentGet && (getSet[0] != newGetSet[0])) || (presentSet && (getSet[1] != newGetSet[1])) {\n\t\t\t\t\tgoto Reject\n\t\t\t\t}\n\t\t\t}\n\t\t\tdescriptor.value = newGetSet\n\t\t}\n\t\t{\n\t\t\t// This section will preserve attributes of\n\t\t\t// the original property, if necessary\n\t\t\tvalue1 := descriptor.value\n\t\t\tif value1 == nil {\n\t\t\t\tvalue1 = property.value\n\t\t\t} else if newGetSet, isAccessor := descriptor.value.(_propertyGetSet); isAccessor {\n\t\t\t\tif newGetSet[0] == &_nilGetSetObject {\n\t\t\t\t\tnewGetSet[0] = nil\n\t\t\t\t}\n\t\t\t\tif newGetSet[1] == &_nilGetSetObject {\n\t\t\t\t\tnewGetSet[1] = nil\n\t\t\t\t}\n\t\t\t\tvalue1 = newGetSet\n\t\t\t}\n\t\t\tmode1 := descriptor.mode\n\t\t\tif mode1&0222 != 0 {\n\t\t\t\t// TODO Factor this out into somewhere testable\n\t\t\t\t// (Maybe put into switch ...)\n\t\t\t\tmode0 := property.mode\n\t\t\t\tif mode1&0200 != 0 {\n\t\t\t\t\tif descriptor.isDataDescriptor() {\n\t\t\t\t\t\tmode1 &= ^0200 // Turn off \"writable\" missing\n\t\t\t\t\t\tmode1 |= (mode0 & 0100)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif mode1&020 != 0 {\n\t\t\t\t\tmode1 |= (mode0 & 010)\n\t\t\t\t}\n\t\t\t\tif mode1&02 != 0 {\n\t\t\t\t\tmode1 |= (mode0 & 01)\n\t\t\t\t}\n\t\t\t\tmode1 &= 0311 // 0311 to preserve the non-setting on \"writable\"\n\t\t\t}\n\t\t\tself._write(name, value1, mode1)\n\t\t}\n\t\treturn true\n\t}\nReject:\n\tif throw {\n\t\tpanic(self.runtime.panicTypeError())\n\t}\n\treturn false\n}\n\nfunc objectDelete(self *_object, name string, throw bool) bool {\n\tproperty_ := self.getOwnProperty(name)\n\tif property_ == nil {\n\t\treturn true\n\t}\n\tif property_.configurable() {\n\t\tself._delete(name)\n\t\treturn true\n\t}\n\treturn self.runtime.typeErrorResult(throw)\n}\n\nfunc objectClone(in *_object, out *_object, clone *_clone) *_object {\n\t*out = *in\n\n\tout.runtime = clone.runtime\n\tif out.prototype != nil {\n\t\tout.prototype = clone.object(in.prototype)\n\t}\n\tout.property = make(map[string]_property, len(in.property))\n\tout.propertyOrder = make([]string, len(in.propertyOrder))\n\tcopy(out.propertyOrder, in.propertyOrder)\n\tfor index, property := range in.property {\n\t\tout.property[index] = clone.property(property)\n\t}\n\n\tswitch value := in.value.(type) {\n\tcase _nativeFunctionObject:\n\t\tout.value = value\n\tcase _bindFunctionObject:\n\t\tout.value = _bindFunctionObject{\n\t\t\ttarget:       clone.object(value.target),\n\t\t\tthis:         clone.value(value.this),\n\t\t\targumentList: clone.valueArray(value.argumentList),\n\t\t}\n\tcase _nodeFunctionObject:\n\t\tout.value = _nodeFunctionObject{\n\t\t\tnode:  value.node,\n\t\t\tstash: clone.stash(value.stash),\n\t\t}\n\tcase _argumentsObject:\n\t\tout.value = value.clone(clone)\n\t}\n\n\treturn out\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/otto.go",
    "content": "/*\nPackage otto is a JavaScript parser and interpreter written natively in Go.\n\nhttp://godoc.org/github.com/robertkrimen/otto\n\n    import (\n        \"github.com/robertkrimen/otto\"\n    )\n\nRun something in the VM\n\n    vm := otto.New()\n    vm.Run(`\n        abc = 2 + 2;\n    \tconsole.log(\"The value of abc is \" + abc); // 4\n    `)\n\nGet a value out of the VM\n\n    value, err := vm.Get(\"abc\")\n    \tvalue, _ := value.ToInteger()\n    }\n\nSet a number\n\n    vm.Set(\"def\", 11)\n    vm.Run(`\n    \tconsole.log(\"The value of def is \" + def);\n    \t// The value of def is 11\n    `)\n\nSet a string\n\n    vm.Set(\"xyzzy\", \"Nothing happens.\")\n    vm.Run(`\n    \tconsole.log(xyzzy.length); // 16\n    `)\n\nGet the value of an expression\n\n    value, _ = vm.Run(\"xyzzy.length\")\n    {\n    \t// value is an int64 with a value of 16\n    \tvalue, _ := value.ToInteger()\n    }\n\nAn error happens\n\n    value, err = vm.Run(\"abcdefghijlmnopqrstuvwxyz.length\")\n    if err != nil {\n    \t// err = ReferenceError: abcdefghijlmnopqrstuvwxyz is not defined\n    \t// If there is an error, then value.IsUndefined() is true\n    \t...\n    }\n\nSet a Go function\n\n    vm.Set(\"sayHello\", func(call otto.FunctionCall) otto.Value {\n        fmt.Printf(\"Hello, %s.\\n\", call.Argument(0).String())\n        return otto.Value{}\n    })\n\nSet a Go function that returns something useful\n\n    vm.Set(\"twoPlus\", func(call otto.FunctionCall) otto.Value {\n        right, _ := call.Argument(0).ToInteger()\n        result, _ := vm.ToValue(2 + right)\n        return result\n    })\n\nUse the functions in JavaScript\n\n    result, _ = vm.Run(`\n        sayHello(\"Xyzzy\");      // Hello, Xyzzy.\n        sayHello();             // Hello, undefined\n\n        result = twoPlus(2.0); // 4\n    `)\n\nParser\n\nA separate parser is available in the parser package if you're just interested in building an AST.\n\nhttp://godoc.org/github.com/robertkrimen/otto/parser\n\nParse and return an AST\n\n    filename := \"\" // A filename is optional\n    src := `\n        // Sample xyzzy example\n        (function(){\n            if (3.14159 > 0) {\n                console.log(\"Hello, World.\");\n                return;\n            }\n\n            var xyzzy = NaN;\n            console.log(\"Nothing happens.\");\n            return xyzzy;\n        })();\n    `\n\n    // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList\n    program, err := parser.ParseFile(nil, filename, src, 0)\n\notto\n\nYou can run (Go) JavaScript from the commandline with: http://github.com/robertkrimen/otto/tree/master/otto\n\n\t$ go get -v github.com/robertkrimen/otto/otto\n\nRun JavaScript by entering some source on stdin or by giving otto a filename:\n\n\t$ otto example.js\n\nunderscore\n\nOptionally include the JavaScript utility-belt library, underscore, with this import:\n\n\timport (\n\t\t\"github.com/robertkrimen/otto\"\n\t\t_ \"github.com/robertkrimen/otto/underscore\"\n\t)\n\n\t// Now every otto runtime will come loaded with underscore\n\nFor more information: http://github.com/robertkrimen/otto/tree/master/underscore\n\nCaveat Emptor\n\nThe following are some limitations with otto:\n\n    * \"use strict\" will parse, but does nothing.\n    * The regular expression engine (re2/regexp) is not fully compatible with the ECMA5 specification.\n    * Otto targets ES5. ES6 features (eg: Typed Arrays) are not supported.\n\nRegular Expression Incompatibility\n\nGo translates JavaScript-style regular expressions into something that is \"regexp\" compatible via `parser.TransformRegExp`.\nUnfortunately, RegExp requires backtracking for some patterns, and backtracking is not supported by the standard Go engine: https://code.google.com/p/re2/wiki/Syntax\n\nTherefore, the following syntax is incompatible:\n\n    (?=)  // Lookahead (positive), currently a parsing error\n    (?!)  // Lookahead (backhead), currently a parsing error\n    \\1    // Backreference (\\1, \\2, \\3, ...), currently a parsing error\n\nA brief discussion of these limitations: \"Regexp (?!re)\" https://groups.google.com/forum/?fromgroups=#%21topic/golang-nuts/7qgSDWPIh_E\n\nMore information about re2: https://code.google.com/p/re2/\n\nIn addition to the above, re2 (Go) has a different definition for \\s: [\\t\\n\\f\\r ].\nThe JavaScript definition, on the other hand, also includes \\v, Unicode \"Separator, Space\", etc.\n\nHalting Problem\n\nIf you want to stop long running executions (like third-party code), you can use the interrupt channel to do this:\n\n    package main\n\n    import (\n        \"errors\"\n        \"fmt\"\n        \"os\"\n        \"time\"\n\n        \"github.com/robertkrimen/otto\"\n    )\n\n    var halt = errors.New(\"Stahp\")\n\n    func main() {\n        runUnsafe(`var abc = [];`)\n        runUnsafe(`\n        while (true) {\n            // Loop forever\n        }`)\n    }\n\n    func runUnsafe(unsafe string) {\n        start := time.Now()\n        defer func() {\n            duration := time.Since(start)\n            if caught := recover(); caught != nil {\n                if caught == halt {\n                    fmt.Fprintf(os.Stderr, \"Some code took to long! Stopping after: %v\\n\", duration)\n                    return\n                }\n                panic(caught) // Something else happened, repanic!\n            }\n            fmt.Fprintf(os.Stderr, \"Ran code successfully: %v\\n\", duration)\n        }()\n\n        vm := otto.New()\n        vm.Interrupt = make(chan func(), 1) // The buffer prevents blocking\n\n        go func() {\n            time.Sleep(2 * time.Second) // Stop after two seconds\n            vm.Interrupt <- func() {\n                panic(halt)\n            }\n        }()\n\n        vm.Run(unsafe) // Here be dragons (risky code)\n    }\n\nWhere is setTimeout/setInterval?\n\nThese timing functions are not actually part of the ECMA-262 specification. Typically, they belong to the `windows` object (in the browser).\nIt would not be difficult to provide something like these via Go, but you probably want to wrap otto in an event loop in that case.\n\nFor an example of how this could be done in Go with otto, see natto:\n\nhttp://github.com/robertkrimen/natto\n\nHere is some more discussion of the issue:\n\n* http://book.mixu.net/node/ch2.html\n\n* http://en.wikipedia.org/wiki/Reentrancy_%28computing%29\n\n* http://aaroncrane.co.uk/2009/02/perl_safe_signals/\n\n*/\npackage otto\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/robertkrimen/otto/file\"\n\t\"github.com/robertkrimen/otto/registry\"\n)\n\n// Otto is the representation of the JavaScript runtime. Each instance of Otto has a self-contained namespace.\ntype Otto struct {\n\t// Interrupt is a channel for interrupting the runtime. You can use this to halt a long running execution, for example.\n\t// See \"Halting Problem\" for more information.\n\tInterrupt chan func()\n\truntime   *_runtime\n}\n\n// New will allocate a new JavaScript runtime\nfunc New() *Otto {\n\tself := &Otto{\n\t\truntime: newContext(),\n\t}\n\tself.runtime.otto = self\n\tself.runtime.traceLimit = 10\n\tself.Set(\"console\", self.runtime.newConsole())\n\n\tregistry.Apply(func(entry registry.Entry) {\n\t\tself.Run(entry.Source())\n\t})\n\n\treturn self\n}\n\nfunc (otto *Otto) clone() *Otto {\n\tself := &Otto{\n\t\truntime: otto.runtime.clone(),\n\t}\n\tself.runtime.otto = self\n\treturn self\n}\n\n// Run will allocate a new JavaScript runtime, run the given source\n// on the allocated runtime, and return the runtime, resulting value, and\n// error (if any).\n//\n// src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST always be in UTF-8.\n//\n// src may also be a Script.\n//\n// src may also be a Program, but if the AST has been modified, then runtime behavior is undefined.\n//\nfunc Run(src interface{}) (*Otto, Value, error) {\n\totto := New()\n\tvalue, err := otto.Run(src) // This already does safety checking\n\treturn otto, value, err\n}\n\n// Run will run the given source (parsing it first if necessary), returning the resulting value and error (if any)\n//\n// src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST always be in UTF-8.\n//\n// If the runtime is unable to parse source, then this function will return undefined and the parse error (nothing\n// will be evaluated in this case).\n//\n// src may also be a Script.\n//\n// src may also be a Program, but if the AST has been modified, then runtime behavior is undefined.\n//\nfunc (self Otto) Run(src interface{}) (Value, error) {\n\tvalue, err := self.runtime.cmpl_run(src, nil)\n\tif !value.safe() {\n\t\tvalue = Value{}\n\t}\n\treturn value, err\n}\n\n// Eval will do the same thing as Run, except without leaving the current scope.\n//\n// By staying in the same scope, the code evaluated has access to everything\n// already defined in the current stack frame. This is most useful in, for\n// example, a debugger call.\nfunc (self Otto) Eval(src interface{}) (Value, error) {\n\tif self.runtime.scope == nil {\n\t\tself.runtime.enterGlobalScope()\n\t\tdefer self.runtime.leaveScope()\n\t}\n\n\tvalue, err := self.runtime.cmpl_eval(src, nil)\n\tif !value.safe() {\n\t\tvalue = Value{}\n\t}\n\treturn value, err\n}\n\n// Get the value of the top-level binding of the given name.\n//\n// If there is an error (like the binding does not exist), then the value\n// will be undefined.\nfunc (self Otto) Get(name string) (Value, error) {\n\tvalue := Value{}\n\terr := catchPanic(func() {\n\t\tvalue = self.getValue(name)\n\t})\n\tif !value.safe() {\n\t\tvalue = Value{}\n\t}\n\treturn value, err\n}\n\nfunc (self Otto) getValue(name string) Value {\n\treturn self.runtime.globalStash.getBinding(name, false)\n}\n\n// Set the top-level binding of the given name to the given value.\n//\n// Set will automatically apply ToValue to the given value in order\n// to convert it to a JavaScript value (type Value).\n//\n// If there is an error (like the binding is read-only, or the ToValue conversion\n// fails), then an error is returned.\n//\n// If the top-level binding does not exist, it will be created.\nfunc (self Otto) Set(name string, value interface{}) error {\n\t{\n\t\tvalue, err := self.ToValue(value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = catchPanic(func() {\n\t\t\tself.setValue(name, value)\n\t\t})\n\t\treturn err\n\t}\n}\n\nfunc (self Otto) setValue(name string, value Value) {\n\tself.runtime.globalStash.setValue(name, value, false)\n}\n\nfunc (self Otto) SetDebuggerHandler(fn func(vm *Otto)) {\n\tself.runtime.debugger = fn\n}\n\nfunc (self Otto) SetRandomSource(fn func() float64) {\n\tself.runtime.random = fn\n}\n\n// SetStackDepthLimit sets an upper limit to the depth of the JavaScript\n// stack. In simpler terms, this limits the number of \"nested\" function calls\n// you can make in a particular interpreter instance.\n//\n// Note that this doesn't take into account the Go stack depth. If your\n// JavaScript makes a call to a Go function, otto won't keep track of what\n// happens outside the interpreter. So if your Go function is infinitely\n// recursive, you're still in trouble.\nfunc (self Otto) SetStackDepthLimit(limit int) {\n\tself.runtime.stackLimit = limit\n}\n\n// SetStackTraceLimit sets an upper limit to the number of stack frames that\n// otto will use when formatting an error's stack trace. By default, the limit\n// is 10. This is consistent with V8 and SpiderMonkey.\n//\n// TODO: expose via `Error.stackTraceLimit`\nfunc (self Otto) SetStackTraceLimit(limit int) {\n\tself.runtime.traceLimit = limit\n}\n\n// MakeCustomError creates a new Error object with the given name and message,\n// returning it as a Value.\nfunc (self Otto) MakeCustomError(name, message string) Value {\n\treturn self.runtime.toValue(self.runtime.newError(name, self.runtime.toValue(message), 0))\n}\n\n// MakeRangeError creates a new RangeError object with the given message,\n// returning it as a Value.\nfunc (self Otto) MakeRangeError(message string) Value {\n\treturn self.runtime.toValue(self.runtime.newRangeError(self.runtime.toValue(message)))\n}\n\n// MakeSyntaxError creates a new SyntaxError object with the given message,\n// returning it as a Value.\nfunc (self Otto) MakeSyntaxError(message string) Value {\n\treturn self.runtime.toValue(self.runtime.newSyntaxError(self.runtime.toValue(message)))\n}\n\n// MakeTypeError creates a new TypeError object with the given message,\n// returning it as a Value.\nfunc (self Otto) MakeTypeError(message string) Value {\n\treturn self.runtime.toValue(self.runtime.newTypeError(self.runtime.toValue(message)))\n}\n\n// Context is a structure that contains information about the current execution\n// context.\ntype Context struct {\n\tFilename   string\n\tLine       int\n\tColumn     int\n\tCallee     string\n\tSymbols    map[string]Value\n\tThis       Value\n\tStacktrace []string\n}\n\n// Context returns the current execution context of the vm, traversing up to\n// ten stack frames, and skipping any innermost native function stack frames.\nfunc (self Otto) Context() Context {\n\treturn self.ContextSkip(10, true)\n}\n\n// ContextLimit returns the current execution context of the vm, with a\n// specific limit on the number of stack frames to traverse, skipping any\n// innermost native function stack frames.\nfunc (self Otto) ContextLimit(limit int) Context {\n\treturn self.ContextSkip(limit, true)\n}\n\n// ContextSkip returns the current execution context of the vm, with a\n// specific limit on the number of stack frames to traverse, optionally\n// skipping any innermost native function stack frames.\nfunc (self Otto) ContextSkip(limit int, skipNative bool) (ctx Context) {\n\t// Ensure we are operating in a scope\n\tif self.runtime.scope == nil {\n\t\tself.runtime.enterGlobalScope()\n\t\tdefer self.runtime.leaveScope()\n\t}\n\n\tscope := self.runtime.scope\n\tframe := scope.frame\n\n\tfor skipNative && frame.native && scope.outer != nil {\n\t\tscope = scope.outer\n\t\tframe = scope.frame\n\t}\n\n\t// Get location information\n\tctx.Filename = \"<unknown>\"\n\tctx.Callee = frame.callee\n\n\tswitch {\n\tcase frame.native:\n\t\tctx.Filename = frame.nativeFile\n\t\tctx.Line = frame.nativeLine\n\t\tctx.Column = 0\n\tcase frame.file != nil:\n\t\tctx.Filename = \"<anonymous>\"\n\n\t\tif p := frame.file.Position(file.Idx(frame.offset)); p != nil {\n\t\t\tctx.Line = p.Line\n\t\t\tctx.Column = p.Column\n\n\t\t\tif p.Filename != \"\" {\n\t\t\t\tctx.Filename = p.Filename\n\t\t\t}\n\t\t}\n\t}\n\n\t// Get the current scope this Value\n\tctx.This = toValue_object(scope.this)\n\n\t// Build stacktrace (up to 10 levels deep)\n\tctx.Symbols = make(map[string]Value)\n\tctx.Stacktrace = append(ctx.Stacktrace, frame.location())\n\tfor limit != 0 {\n\t\t// Get variables\n\t\tstash := scope.lexical\n\t\tfor {\n\t\t\tfor _, name := range getStashProperties(stash) {\n\t\t\t\tif _, ok := ctx.Symbols[name]; !ok {\n\t\t\t\t\tctx.Symbols[name] = stash.getBinding(name, true)\n\t\t\t\t}\n\t\t\t}\n\t\t\tstash = stash.outer()\n\t\t\tif stash == nil || stash.outer() == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tscope = scope.outer\n\t\tif scope == nil {\n\t\t\tbreak\n\t\t}\n\t\tif scope.frame.offset >= 0 {\n\t\t\tctx.Stacktrace = append(ctx.Stacktrace, scope.frame.location())\n\t\t}\n\t\tlimit--\n\t}\n\n\treturn\n}\n\n// Call the given JavaScript with a given this and arguments.\n//\n// If this is nil, then some special handling takes place to determine the proper\n// this value, falling back to a \"standard\" invocation if necessary (where this is\n// undefined).\n//\n// If source begins with \"new \" (A lowercase new followed by a space), then\n// Call will invoke the function constructor rather than performing a function call.\n// In this case, the this argument has no effect.\n//\n//      // value is a String object\n//      value, _ := vm.Call(\"Object\", nil, \"Hello, World.\")\n//\n//      // Likewise...\n//      value, _ := vm.Call(\"new Object\", nil, \"Hello, World.\")\n//\n//      // This will perform a concat on the given array and return the result\n//      // value is [ 1, 2, 3, undefined, 4, 5, 6, 7, \"abc\" ]\n//      value, _ := vm.Call(`[ 1, 2, 3, undefined, 4 ].concat`, nil, 5, 6, 7, \"abc\")\n//\nfunc (self Otto) Call(source string, this interface{}, argumentList ...interface{}) (Value, error) {\n\n\tthisValue := Value{}\n\n\tconstruct := false\n\tif strings.HasPrefix(source, \"new \") {\n\t\tsource = source[4:]\n\t\tconstruct = true\n\t}\n\n\t// FIXME enterGlobalScope\n\tself.runtime.enterGlobalScope()\n\tdefer func() {\n\t\tself.runtime.leaveScope()\n\t}()\n\n\tif !construct && this == nil {\n\t\tprogram, err := self.runtime.cmpl_parse(\"\", source+\"()\", nil)\n\t\tif err == nil {\n\t\t\tif node, ok := program.body[0].(*_nodeExpressionStatement); ok {\n\t\t\t\tif node, ok := node.expression.(*_nodeCallExpression); ok {\n\t\t\t\t\tvar value Value\n\t\t\t\t\terr := catchPanic(func() {\n\t\t\t\t\t\tvalue = self.runtime.cmpl_evaluate_nodeCallExpression(node, argumentList)\n\t\t\t\t\t})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn Value{}, err\n\t\t\t\t\t}\n\t\t\t\t\treturn value, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tvalue, err := self.ToValue(this)\n\t\tif err != nil {\n\t\t\treturn Value{}, err\n\t\t}\n\t\tthisValue = value\n\t}\n\n\t{\n\t\tthis := thisValue\n\n\t\tfn, err := self.Run(source)\n\t\tif err != nil {\n\t\t\treturn Value{}, err\n\t\t}\n\n\t\tif construct {\n\t\t\tresult, err := fn.constructSafe(self.runtime, this, argumentList...)\n\t\t\tif err != nil {\n\t\t\t\treturn Value{}, err\n\t\t\t}\n\t\t\treturn result, nil\n\t\t}\n\n\t\tresult, err := fn.Call(this, argumentList...)\n\t\tif err != nil {\n\t\t\treturn Value{}, err\n\t\t}\n\t\treturn result, nil\n\t}\n}\n\n// Object will run the given source and return the result as an object.\n//\n// For example, accessing an existing object:\n//\n//\t\tobject, _ := vm.Object(`Number`)\n//\n// Or, creating a new object:\n//\n//\t\tobject, _ := vm.Object(`({ xyzzy: \"Nothing happens.\" })`)\n//\n// Or, creating and assigning an object:\n//\n//\t\tobject, _ := vm.Object(`xyzzy = {}`)\n//\t\tobject.Set(\"volume\", 11)\n//\n// If there is an error (like the source does not result in an object), then\n// nil and an error is returned.\nfunc (self Otto) Object(source string) (*Object, error) {\n\tvalue, err := self.runtime.cmpl_run(source, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif value.IsObject() {\n\t\treturn value.Object(), nil\n\t}\n\treturn nil, fmt.Errorf(\"value is not an object\")\n}\n\n// ToValue will convert an interface{} value to a value digestible by otto/JavaScript.\nfunc (self Otto) ToValue(value interface{}) (Value, error) {\n\treturn self.runtime.safeToValue(value)\n}\n\n// Copy will create a copy/clone of the runtime.\n//\n// Copy is useful for saving some time when creating many similar runtimes.\n//\n// This method works by walking the original runtime and cloning each object, scope, stash,\n// etc. into a new runtime.\n//\n// Be on the lookout for memory leaks or inadvertent sharing of resources.\nfunc (in *Otto) Copy() *Otto {\n\tout := &Otto{\n\t\truntime: in.runtime.clone(),\n\t}\n\tout.runtime.otto = out\n\treturn out\n}\n\n// Object{}\n\n// Object is the representation of a JavaScript object.\ntype Object struct {\n\tobject *_object\n\tvalue  Value\n}\n\nfunc _newObject(object *_object, value Value) *Object {\n\t// value MUST contain object!\n\treturn &Object{\n\t\tobject: object,\n\t\tvalue:  value,\n\t}\n}\n\n// Call a method on the object.\n//\n// It is essentially equivalent to:\n//\n//\t\tvar method, _ := object.Get(name)\n//\t\tmethod.Call(object, argumentList...)\n//\n// An undefined value and an error will result if:\n//\n//\t\t1. There is an error during conversion of the argument list\n//\t\t2. The property is not actually a function\n//\t\t3. An (uncaught) exception is thrown\n//\nfunc (self Object) Call(name string, argumentList ...interface{}) (Value, error) {\n\t// TODO: Insert an example using JavaScript below...\n\t// e.g., Object(\"JSON\").Call(\"stringify\", ...)\n\n\tfunction, err := self.Get(name)\n\tif err != nil {\n\t\treturn Value{}, err\n\t}\n\treturn function.Call(self.Value(), argumentList...)\n}\n\n// Value will return self as a value.\nfunc (self Object) Value() Value {\n\treturn self.value\n}\n\n// Get the value of the property with the given name.\nfunc (self Object) Get(name string) (Value, error) {\n\tvalue := Value{}\n\terr := catchPanic(func() {\n\t\tvalue = self.object.get(name)\n\t})\n\tif !value.safe() {\n\t\tvalue = Value{}\n\t}\n\treturn value, err\n}\n\n// Set the property of the given name to the given value.\n//\n// An error will result if the setting the property triggers an exception (i.e. read-only),\n// or there is an error during conversion of the given value.\nfunc (self Object) Set(name string, value interface{}) error {\n\t{\n\t\tvalue, err := self.object.runtime.safeToValue(value)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = catchPanic(func() {\n\t\t\tself.object.put(name, value, true)\n\t\t})\n\t\treturn err\n\t}\n}\n\n// Keys gets the keys for the given object.\n//\n// Equivalent to calling Object.keys on the object.\nfunc (self Object) Keys() []string {\n\tvar keys []string\n\tself.object.enumerate(false, func(name string) bool {\n\t\tkeys = append(keys, name)\n\t\treturn true\n\t})\n\treturn keys\n}\n\n// KeysByParent gets the keys (and those of the parents) for the given object,\n// in order of \"closest\" to \"furthest\".\nfunc (self Object) KeysByParent() [][]string {\n\tvar a [][]string\n\n\tfor o := self.object; o != nil; o = o.prototype {\n\t\tvar l []string\n\n\t\to.enumerate(false, func(name string) bool {\n\t\t\tl = append(l, name)\n\t\t\treturn true\n\t\t})\n\n\t\ta = append(a, l)\n\t}\n\n\treturn a\n}\n\n// Class will return the class string of the object.\n//\n// The return value will (generally) be one of:\n//\n//\t\tObject\n//\t\tFunction\n//\t\tArray\n//\t\tString\n//\t\tNumber\n//\t\tBoolean\n//\t\tDate\n//\t\tRegExp\n//\nfunc (self Object) Class() string {\n\treturn self.object.class\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/otto_.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\truntime_ \"runtime\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nvar isIdentifier_Regexp *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z\\$][a-zA-Z0-9\\$]*$`)\n\nfunc isIdentifier(string_ string) bool {\n\treturn isIdentifier_Regexp.MatchString(string_)\n}\n\nfunc (self *_runtime) toValueArray(arguments ...interface{}) []Value {\n\tlength := len(arguments)\n\tif length == 1 {\n\t\tif valueArray, ok := arguments[0].([]Value); ok {\n\t\t\treturn valueArray\n\t\t}\n\t\treturn []Value{self.toValue(arguments[0])}\n\t}\n\n\tvalueArray := make([]Value, length)\n\tfor index, value := range arguments {\n\t\tvalueArray[index] = self.toValue(value)\n\t}\n\n\treturn valueArray\n}\n\nfunc stringToArrayIndex(name string) int64 {\n\tindex, err := strconv.ParseInt(name, 10, 64)\n\tif err != nil {\n\t\treturn -1\n\t}\n\tif index < 0 {\n\t\treturn -1\n\t}\n\tif index >= maxUint32 {\n\t\t// The value 2^32 (or above) is not a valid index because\n\t\t// you cannot store a uint32 length for an index of uint32\n\t\treturn -1\n\t}\n\treturn index\n}\n\nfunc isUint32(value int64) bool {\n\treturn value >= 0 && value <= maxUint32\n}\n\nfunc arrayIndexToString(index int64) string {\n\treturn strconv.FormatInt(index, 10)\n}\n\nfunc valueOfArrayIndex(array []Value, index int) Value {\n\tvalue, _ := getValueOfArrayIndex(array, index)\n\treturn value\n}\n\nfunc getValueOfArrayIndex(array []Value, index int) (Value, bool) {\n\tif index >= 0 && index < len(array) {\n\t\tvalue := array[index]\n\t\tif !value.isEmpty() {\n\t\t\treturn value, true\n\t\t}\n\t}\n\treturn Value{}, false\n}\n\n// A range index can be anything from 0 up to length. It is NOT safe to use as an index\n// to an array, but is useful for slicing and in some ECMA algorithms.\nfunc valueToRangeIndex(indexValue Value, length int64, negativeIsZero bool) int64 {\n\tindex := indexValue.number().int64\n\tif negativeIsZero {\n\t\tif index < 0 {\n\t\t\tindex = 0\n\t\t}\n\t\t// minimum(index, length)\n\t\tif index >= length {\n\t\t\tindex = length\n\t\t}\n\t\treturn index\n\t}\n\n\tif index < 0 {\n\t\tindex += length\n\t\tif index < 0 {\n\t\t\tindex = 0\n\t\t}\n\t} else {\n\t\tif index > length {\n\t\t\tindex = length\n\t\t}\n\t}\n\treturn index\n}\n\nfunc rangeStartEnd(array []Value, size int64, negativeIsZero bool) (start, end int64) {\n\tstart = valueToRangeIndex(valueOfArrayIndex(array, 0), size, negativeIsZero)\n\tif len(array) == 1 {\n\t\t// If there is only the start argument, then end = size\n\t\tend = size\n\t\treturn\n\t}\n\n\t// Assuming the argument is undefined...\n\tend = size\n\tendValue := valueOfArrayIndex(array, 1)\n\tif !endValue.IsUndefined() {\n\t\t// Which it is not, so get the value as an array index\n\t\tend = valueToRangeIndex(endValue, size, negativeIsZero)\n\t}\n\treturn\n}\n\nfunc rangeStartLength(source []Value, size int64) (start, length int64) {\n\tstart = valueToRangeIndex(valueOfArrayIndex(source, 0), size, false)\n\n\t// Assume the second argument is missing or undefined\n\tlength = int64(size)\n\tif len(source) == 1 {\n\t\t// If there is only the start argument, then length = size\n\t\treturn\n\t}\n\n\tlengthValue := valueOfArrayIndex(source, 1)\n\tif !lengthValue.IsUndefined() {\n\t\t// Which it is not, so get the value as an array index\n\t\tlength = lengthValue.number().int64\n\t}\n\treturn\n}\n\nfunc boolFields(input string) (result map[string]bool) {\n\tresult = map[string]bool{}\n\tfor _, word := range strings.Fields(input) {\n\t\tresult[word] = true\n\t}\n\treturn result\n}\n\nfunc hereBeDragons(arguments ...interface{}) string {\n\tpc, _, _, _ := runtime_.Caller(1)\n\tname := runtime_.FuncForPC(pc).Name()\n\tmessage := fmt.Sprintf(\"Here be dragons -- %s\", name)\n\tif len(arguments) > 0 {\n\t\tmessage += \": \"\n\t\targument0 := fmt.Sprintf(\"%s\", arguments[0])\n\t\tif len(arguments) == 1 {\n\t\t\tmessage += argument0\n\t\t} else {\n\t\t\tmessage += fmt.Sprintf(argument0, arguments[1:]...)\n\t\t}\n\t} else {\n\t\tmessage += \".\"\n\t}\n\treturn message\n}\n\nfunc throwHereBeDragons(arguments ...interface{}) {\n\tpanic(hereBeDragons(arguments...))\n}\n\nfunc eachPair(list []interface{}, fn func(_0, _1 interface{})) {\n\tfor len(list) > 0 {\n\t\tvar _0, _1 interface{}\n\t\t_0 = list[0]\n\t\tlist = list[1:] // Pop off first\n\t\tif len(list) > 0 {\n\t\t\t_1 = list[0]\n\t\t\tlist = list[1:] // Pop off second\n\t\t}\n\t\tfn(_0, _1)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/Makefile",
    "content": ".PHONY: test\n\ntest:\n\tgo test\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/README.markdown",
    "content": "# parser\n--\n    import \"github.com/robertkrimen/otto/parser\"\n\nPackage parser implements a parser for JavaScript.\n\n    import (\n        \"github.com/robertkrimen/otto/parser\"\n    )\n\nParse and return an AST\n\n    filename := \"\" // A filename is optional\n    src := `\n        // Sample xyzzy example\n        (function(){\n            if (3.14159 > 0) {\n                console.log(\"Hello, World.\");\n                return;\n            }\n\n            var xyzzy = NaN;\n            console.log(\"Nothing happens.\");\n            return xyzzy;\n        })();\n    `\n\n    // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList\n    program, err := parser.ParseFile(nil, filename, src, 0)\n\n\n### Warning\n\nThe parser and AST interfaces are still works-in-progress (particularly where\nnode types are concerned) and may change in the future.\n\n## Usage\n\n#### func  ParseFile\n\n```go\nfunc ParseFile(fileSet *file.FileSet, filename string, src interface{}, mode Mode) (*ast.Program, error)\n```\nParseFile parses the source code of a single JavaScript/ECMAScript source file\nand returns the corresponding ast.Program node.\n\nIf fileSet == nil, ParseFile parses source without a FileSet. If fileSet != nil,\nParseFile first adds filename and src to fileSet.\n\nThe filename argument is optional and is used for labelling errors, etc.\n\nsrc may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST\nalways be in UTF-8.\n\n    // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList\n    program, err := parser.ParseFile(nil, \"\", `if (abc > 1) {}`, 0)\n\n#### func  ParseFunction\n\n```go\nfunc ParseFunction(parameterList, body string) (*ast.FunctionLiteral, error)\n```\nParseFunction parses a given parameter list and body as a function and returns\nthe corresponding ast.FunctionLiteral node.\n\nThe parameter list, if any, should be a comma-separated list of identifiers.\n\n#### func  ReadSource\n\n```go\nfunc ReadSource(filename string, src interface{}) ([]byte, error)\n```\n\n#### func  TransformRegExp\n\n```go\nfunc TransformRegExp(pattern string) (string, error)\n```\nTransformRegExp transforms a JavaScript pattern into a Go \"regexp\" pattern.\n\nre2 (Go) cannot do backtracking, so the presence of a lookahead (?=) (?!) or\nbackreference (\\1, \\2, ...) will cause an error.\n\nre2 (Go) has a different definition for \\s: [\\t\\n\\f\\r ]. The JavaScript\ndefinition, on the other hand, also includes \\v, Unicode \"Separator, Space\",\netc.\n\nIf the pattern is invalid (not valid even in JavaScript), then this function\nreturns the empty string and an error.\n\nIf the pattern is valid, but incompatible (contains a lookahead or\nbackreference), then this function returns the transformation (a non-empty\nstring) AND an error.\n\n#### type Error\n\n```go\ntype Error struct {\n\tPosition file.Position\n\tMessage  string\n}\n```\n\nAn Error represents a parsing error. It includes the position where the error\noccurred and a message/description.\n\n#### func (Error) Error\n\n```go\nfunc (self Error) Error() string\n```\n\n#### type ErrorList\n\n```go\ntype ErrorList []*Error\n```\n\nErrorList is a list of *Errors.\n\n#### func (*ErrorList) Add\n\n```go\nfunc (self *ErrorList) Add(position file.Position, msg string)\n```\nAdd adds an Error with given position and message to an ErrorList.\n\n#### func (ErrorList) Err\n\n```go\nfunc (self ErrorList) Err() error\n```\nErr returns an error equivalent to this ErrorList. If the list is empty, Err\nreturns nil.\n\n#### func (ErrorList) Error\n\n```go\nfunc (self ErrorList) Error() string\n```\nError implements the Error interface.\n\n#### func (ErrorList) Len\n\n```go\nfunc (self ErrorList) Len() int\n```\n\n#### func (ErrorList) Less\n\n```go\nfunc (self ErrorList) Less(i, j int) bool\n```\n\n#### func (*ErrorList) Reset\n\n```go\nfunc (self *ErrorList) Reset()\n```\nReset resets an ErrorList to no errors.\n\n#### func (ErrorList) Sort\n\n```go\nfunc (self ErrorList) Sort()\n```\n\n#### func (ErrorList) Swap\n\n```go\nfunc (self ErrorList) Swap(i, j int)\n```\n\n#### type Mode\n\n```go\ntype Mode uint\n```\n\nA Mode value is a set of flags (or 0). They control optional parser\nfunctionality.\n\n```go\nconst (\n\tIgnoreRegExpErrors Mode = 1 << iota // Ignore RegExp compatibility errors (allow backtracking)\n)\n```\n\n--\n**godocdown** http://github.com/robertkrimen/godocdown\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/dbg.go",
    "content": "// This file was AUTOMATICALLY GENERATED by dbg-import (smuggol) for github.com/robertkrimen/dbg\n\npackage parser\n\nimport (\n\tDbg \"github.com/robertkrimen/otto/dbg\"\n)\n\nvar dbg, dbgf = Dbg.New()\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/error.go",
    "content": "package parser\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\n\t\"github.com/robertkrimen/otto/file\"\n\t\"github.com/robertkrimen/otto/token\"\n)\n\nconst (\n\terr_UnexpectedToken      = \"Unexpected token %v\"\n\terr_UnexpectedEndOfInput = \"Unexpected end of input\"\n\terr_UnexpectedEscape     = \"Unexpected escape\"\n)\n\n//    UnexpectedNumber:  'Unexpected number',\n//    UnexpectedString:  'Unexpected string',\n//    UnexpectedIdentifier:  'Unexpected identifier',\n//    UnexpectedReserved:  'Unexpected reserved word',\n//    NewlineAfterThrow:  'Illegal newline after throw',\n//    InvalidRegExp: 'Invalid regular expression',\n//    UnterminatedRegExp:  'Invalid regular expression: missing /',\n//    InvalidLHSInAssignment:  'Invalid left-hand side in assignment',\n//    InvalidLHSInForIn:  'Invalid left-hand side in for-in',\n//    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n//    NoCatchOrFinally:  'Missing catch or finally after try',\n//    UnknownLabel: 'Undefined label \\'%0\\'',\n//    Redeclaration: '%0 \\'%1\\' has already been declared',\n//    IllegalContinue: 'Illegal continue statement',\n//    IllegalBreak: 'Illegal break statement',\n//    IllegalReturn: 'Illegal return statement',\n//    StrictModeWith:  'Strict mode code may not include a with statement',\n//    StrictCatchVariable:  'Catch variable may not be eval or arguments in strict mode',\n//    StrictVarName:  'Variable name may not be eval or arguments in strict mode',\n//    StrictParamName:  'Parameter name eval or arguments is not allowed in strict mode',\n//    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n//    StrictFunctionName:  'Function name may not be eval or arguments in strict mode',\n//    StrictOctalLiteral:  'Octal literals are not allowed in strict mode.',\n//    StrictDelete:  'Delete of an unqualified identifier in strict mode.',\n//    StrictDuplicateProperty:  'Duplicate data property in object literal not allowed in strict mode',\n//    AccessorDataProperty:  'Object literal may not have data and accessor property with the same name',\n//    AccessorGetSet:  'Object literal may not have multiple get/set accessors with the same name',\n//    StrictLHSAssignment:  'Assignment to eval or arguments is not allowed in strict mode',\n//    StrictLHSPostfix:  'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n//    StrictLHSPrefix:  'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n//    StrictReservedWord:  'Use of future reserved word in strict mode'\n\n// A SyntaxError is a description of an ECMAScript syntax error.\n\n// An Error represents a parsing error. It includes the position where the error occurred and a message/description.\ntype Error struct {\n\tPosition file.Position\n\tMessage  string\n}\n\n// FIXME Should this be \"SyntaxError\"?\n\nfunc (self Error) Error() string {\n\tfilename := self.Position.Filename\n\tif filename == \"\" {\n\t\tfilename = \"(anonymous)\"\n\t}\n\treturn fmt.Sprintf(\"%s: Line %d:%d %s\",\n\t\tfilename,\n\t\tself.Position.Line,\n\t\tself.Position.Column,\n\t\tself.Message,\n\t)\n}\n\nfunc (self *_parser) error(place interface{}, msg string, msgValues ...interface{}) *Error {\n\tidx := file.Idx(0)\n\tswitch place := place.(type) {\n\tcase int:\n\t\tidx = self.idxOf(place)\n\tcase file.Idx:\n\t\tif place == 0 {\n\t\t\tidx = self.idxOf(self.chrOffset)\n\t\t} else {\n\t\t\tidx = place\n\t\t}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"error(%T, ...)\", place))\n\t}\n\n\tposition := self.position(idx)\n\tmsg = fmt.Sprintf(msg, msgValues...)\n\tself.errors.Add(position, msg)\n\treturn self.errors[len(self.errors)-1]\n}\n\nfunc (self *_parser) errorUnexpected(idx file.Idx, chr rune) error {\n\tif chr == -1 {\n\t\treturn self.error(idx, err_UnexpectedEndOfInput)\n\t}\n\treturn self.error(idx, err_UnexpectedToken, token.ILLEGAL)\n}\n\nfunc (self *_parser) errorUnexpectedToken(tkn token.Token) error {\n\tswitch tkn {\n\tcase token.EOF:\n\t\treturn self.error(file.Idx(0), err_UnexpectedEndOfInput)\n\t}\n\tvalue := tkn.String()\n\tswitch tkn {\n\tcase token.BOOLEAN, token.NULL:\n\t\tvalue = self.literal\n\tcase token.IDENTIFIER:\n\t\treturn self.error(self.idx, \"Unexpected identifier\")\n\tcase token.KEYWORD:\n\t\t// TODO Might be a future reserved word\n\t\treturn self.error(self.idx, \"Unexpected reserved word\")\n\tcase token.NUMBER:\n\t\treturn self.error(self.idx, \"Unexpected number\")\n\tcase token.STRING:\n\t\treturn self.error(self.idx, \"Unexpected string\")\n\t}\n\treturn self.error(self.idx, err_UnexpectedToken, value)\n}\n\n// ErrorList is a list of *Errors.\n//\ntype ErrorList []*Error\n\n// Add adds an Error with given position and message to an ErrorList.\nfunc (self *ErrorList) Add(position file.Position, msg string) {\n\t*self = append(*self, &Error{position, msg})\n}\n\n// Reset resets an ErrorList to no errors.\nfunc (self *ErrorList) Reset() { *self = (*self)[0:0] }\n\nfunc (self ErrorList) Len() int      { return len(self) }\nfunc (self ErrorList) Swap(i, j int) { self[i], self[j] = self[j], self[i] }\nfunc (self ErrorList) Less(i, j int) bool {\n\tx := &self[i].Position\n\ty := &self[j].Position\n\tif x.Filename < y.Filename {\n\t\treturn true\n\t}\n\tif x.Filename == y.Filename {\n\t\tif x.Line < y.Line {\n\t\t\treturn true\n\t\t}\n\t\tif x.Line == y.Line {\n\t\t\treturn x.Column < y.Column\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (self ErrorList) Sort() {\n\tsort.Sort(self)\n}\n\n// Error implements the Error interface.\nfunc (self ErrorList) Error() string {\n\tswitch len(self) {\n\tcase 0:\n\t\treturn \"no errors\"\n\tcase 1:\n\t\treturn self[0].Error()\n\t}\n\treturn fmt.Sprintf(\"%s (and %d more errors)\", self[0].Error(), len(self)-1)\n}\n\n// Err returns an error equivalent to this ErrorList.\n// If the list is empty, Err returns nil.\nfunc (self ErrorList) Err() error {\n\tif len(self) == 0 {\n\t\treturn nil\n\t}\n\treturn self\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/expression.go",
    "content": "package parser\n\nimport (\n\t\"regexp\"\n\n\t\"github.com/robertkrimen/otto/ast\"\n\t\"github.com/robertkrimen/otto/file\"\n\t\"github.com/robertkrimen/otto/token\"\n)\n\nfunc (self *_parser) parseIdentifier() *ast.Identifier {\n\tliteral := self.literal\n\tidx := self.idx\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.MarkComments(ast.LEADING)\n\t}\n\tself.next()\n\texp := &ast.Identifier{\n\t\tName: literal,\n\t\tIdx:  idx,\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.SetExpression(exp)\n\t}\n\n\treturn exp\n}\n\nfunc (self *_parser) parsePrimaryExpression() ast.Expression {\n\tliteral := self.literal\n\tidx := self.idx\n\tswitch self.token {\n\tcase token.IDENTIFIER:\n\t\tself.next()\n\t\tif len(literal) > 1 {\n\t\t\ttkn, strict := token.IsKeyword(literal)\n\t\t\tif tkn == token.KEYWORD {\n\t\t\t\tif !strict {\n\t\t\t\t\tself.error(idx, \"Unexpected reserved word\")\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn &ast.Identifier{\n\t\t\tName: literal,\n\t\t\tIdx:  idx,\n\t\t}\n\tcase token.NULL:\n\t\tself.next()\n\t\treturn &ast.NullLiteral{\n\t\t\tIdx:     idx,\n\t\t\tLiteral: literal,\n\t\t}\n\tcase token.BOOLEAN:\n\t\tself.next()\n\t\tvalue := false\n\t\tswitch literal {\n\t\tcase \"true\":\n\t\t\tvalue = true\n\t\tcase \"false\":\n\t\t\tvalue = false\n\t\tdefault:\n\t\t\tself.error(idx, \"Illegal boolean literal\")\n\t\t}\n\t\treturn &ast.BooleanLiteral{\n\t\t\tIdx:     idx,\n\t\t\tLiteral: literal,\n\t\t\tValue:   value,\n\t\t}\n\tcase token.STRING:\n\t\tself.next()\n\t\tvalue, err := parseStringLiteral(literal[1 : len(literal)-1])\n\t\tif err != nil {\n\t\t\tself.error(idx, err.Error())\n\t\t}\n\t\treturn &ast.StringLiteral{\n\t\t\tIdx:     idx,\n\t\t\tLiteral: literal,\n\t\t\tValue:   value,\n\t\t}\n\tcase token.NUMBER:\n\t\tself.next()\n\t\tvalue, err := parseNumberLiteral(literal)\n\t\tif err != nil {\n\t\t\tself.error(idx, err.Error())\n\t\t\tvalue = 0\n\t\t}\n\t\treturn &ast.NumberLiteral{\n\t\t\tIdx:     idx,\n\t\t\tLiteral: literal,\n\t\t\tValue:   value,\n\t\t}\n\tcase token.SLASH, token.QUOTIENT_ASSIGN:\n\t\treturn self.parseRegExpLiteral()\n\tcase token.LEFT_BRACE:\n\t\treturn self.parseObjectLiteral()\n\tcase token.LEFT_BRACKET:\n\t\treturn self.parseArrayLiteral()\n\tcase token.LEFT_PARENTHESIS:\n\t\tself.expect(token.LEFT_PARENTHESIS)\n\t\texpression := self.parseExpression()\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.expect(token.RIGHT_PARENTHESIS)\n\t\treturn expression\n\tcase token.THIS:\n\t\tself.next()\n\t\treturn &ast.ThisExpression{\n\t\t\tIdx: idx,\n\t\t}\n\tcase token.FUNCTION:\n\t\treturn self.parseFunction(false)\n\t}\n\n\tself.errorUnexpectedToken(self.token)\n\tself.nextStatement()\n\treturn &ast.BadExpression{From: idx, To: self.idx}\n}\n\nfunc (self *_parser) parseRegExpLiteral() *ast.RegExpLiteral {\n\n\toffset := self.chrOffset - 1 // Opening slash already gotten\n\tif self.token == token.QUOTIENT_ASSIGN {\n\t\toffset -= 1 // =\n\t}\n\tidx := self.idxOf(offset)\n\n\tpattern, err := self.scanString(offset)\n\tendOffset := self.chrOffset\n\n\tself.next()\n\tif err == nil {\n\t\tpattern = pattern[1 : len(pattern)-1]\n\t}\n\n\tflags := \"\"\n\tif self.token == token.IDENTIFIER { // gim\n\n\t\tflags = self.literal\n\t\tself.next()\n\t\tendOffset = self.chrOffset - 1\n\t}\n\n\tvar value string\n\t// TODO 15.10\n\t{\n\t\t// Test during parsing that this is a valid regular expression\n\t\t// Sorry, (?=) and (?!) are invalid (for now)\n\t\tpattern, err := TransformRegExp(pattern)\n\t\tif err != nil {\n\t\t\tif pattern == \"\" || self.mode&IgnoreRegExpErrors == 0 {\n\t\t\t\tself.error(idx, \"Invalid regular expression: %s\", err.Error())\n\t\t\t}\n\t\t} else {\n\t\t\t_, err = regexp.Compile(pattern)\n\t\t\tif err != nil {\n\t\t\t\t// We should not get here, ParseRegExp should catch any errors\n\t\t\t\tself.error(idx, \"Invalid regular expression: %s\", err.Error()[22:]) // Skip redundant \"parse regexp error\"\n\t\t\t} else {\n\t\t\t\tvalue = pattern\n\t\t\t}\n\t\t}\n\t}\n\n\tliteral := self.str[offset:endOffset]\n\n\treturn &ast.RegExpLiteral{\n\t\tIdx:     idx,\n\t\tLiteral: literal,\n\t\tPattern: pattern,\n\t\tFlags:   flags,\n\t\tValue:   value,\n\t}\n}\n\nfunc (self *_parser) parseVariableDeclaration(declarationList *[]*ast.VariableExpression) ast.Expression {\n\n\tif self.token != token.IDENTIFIER {\n\t\tidx := self.expect(token.IDENTIFIER)\n\t\tself.nextStatement()\n\t\treturn &ast.BadExpression{From: idx, To: self.idx}\n\t}\n\n\tliteral := self.literal\n\tidx := self.idx\n\tself.next()\n\tnode := &ast.VariableExpression{\n\t\tName: literal,\n\t\tIdx:  idx,\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.SetExpression(node)\n\t}\n\n\tif declarationList != nil {\n\t\t*declarationList = append(*declarationList, node)\n\t}\n\n\tif self.token == token.ASSIGN {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\t\tnode.Initializer = self.parseAssignmentExpression()\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseVariableDeclarationList(var_ file.Idx) []ast.Expression {\n\n\tvar declarationList []*ast.VariableExpression // Avoid bad expressions\n\tvar list []ast.Expression\n\n\tfor {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.MarkComments(ast.LEADING)\n\t\t}\n\t\tdecl := self.parseVariableDeclaration(&declarationList)\n\t\tlist = append(list, decl)\n\t\tif self.token != token.COMMA {\n\t\t\tbreak\n\t\t}\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\t}\n\n\tself.scope.declare(&ast.VariableDeclaration{\n\t\tVar:  var_,\n\t\tList: declarationList,\n\t})\n\n\treturn list\n}\n\nfunc (self *_parser) parseObjectPropertyKey() (string, string) {\n\tidx, tkn, literal := self.idx, self.token, self.literal\n\tvalue := \"\"\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.MarkComments(ast.KEY)\n\t}\n\tself.next()\n\n\tswitch tkn {\n\tcase token.IDENTIFIER:\n\t\tvalue = literal\n\tcase token.NUMBER:\n\t\tvar err error\n\t\t_, err = parseNumberLiteral(literal)\n\t\tif err != nil {\n\t\t\tself.error(idx, err.Error())\n\t\t} else {\n\t\t\tvalue = literal\n\t\t}\n\tcase token.STRING:\n\t\tvar err error\n\t\tvalue, err = parseStringLiteral(literal[1 : len(literal)-1])\n\t\tif err != nil {\n\t\t\tself.error(idx, err.Error())\n\t\t}\n\tdefault:\n\t\t// null, false, class, etc.\n\t\tif matchIdentifier.MatchString(literal) {\n\t\t\tvalue = literal\n\t\t}\n\t}\n\treturn literal, value\n}\n\nfunc (self *_parser) parseObjectProperty() ast.Property {\n\tliteral, value := self.parseObjectPropertyKey()\n\tif literal == \"get\" && self.token != token.COLON {\n\t\tidx := self.idx\n\t\t_, value := self.parseObjectPropertyKey()\n\t\tparameterList := self.parseFunctionParameterList()\n\n\t\tnode := &ast.FunctionLiteral{\n\t\t\tFunction:      idx,\n\t\t\tParameterList: parameterList,\n\t\t}\n\t\tself.parseFunctionBlock(node)\n\t\treturn ast.Property{\n\t\t\tKey:   value,\n\t\t\tKind:  \"get\",\n\t\t\tValue: node,\n\t\t}\n\t} else if literal == \"set\" && self.token != token.COLON {\n\t\tidx := self.idx\n\t\t_, value := self.parseObjectPropertyKey()\n\t\tparameterList := self.parseFunctionParameterList()\n\n\t\tnode := &ast.FunctionLiteral{\n\t\t\tFunction:      idx,\n\t\t\tParameterList: parameterList,\n\t\t}\n\t\tself.parseFunctionBlock(node)\n\t\treturn ast.Property{\n\t\t\tKey:   value,\n\t\t\tKind:  \"set\",\n\t\t\tValue: node,\n\t\t}\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.MarkComments(ast.COLON)\n\t}\n\tself.expect(token.COLON)\n\n\texp := ast.Property{\n\t\tKey:   value,\n\t\tKind:  \"value\",\n\t\tValue: self.parseAssignmentExpression(),\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.SetExpression(exp.Value)\n\t}\n\treturn exp\n}\n\nfunc (self *_parser) parseObjectLiteral() ast.Expression {\n\tvar value []ast.Property\n\tidx0 := self.expect(token.LEFT_BRACE)\n\tfor self.token != token.RIGHT_BRACE && self.token != token.EOF {\n\t\tvalue = append(value, self.parseObjectProperty())\n\t\tif self.token == token.COMMA {\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.Unset()\n\t\t\t}\n\t\t\tself.next()\n\t\t\tcontinue\n\t\t}\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.MarkComments(ast.FINAL)\n\t}\n\tidx1 := self.expect(token.RIGHT_BRACE)\n\n\treturn &ast.ObjectLiteral{\n\t\tLeftBrace:  idx0,\n\t\tRightBrace: idx1,\n\t\tValue:      value,\n\t}\n}\n\nfunc (self *_parser) parseArrayLiteral() ast.Expression {\n\tidx0 := self.expect(token.LEFT_BRACKET)\n\tvar value []ast.Expression\n\tfor self.token != token.RIGHT_BRACKET && self.token != token.EOF {\n\t\tif self.token == token.COMMA {\n\t\t\t// This kind of comment requires a special empty expression node.\n\t\t\tempty := &ast.EmptyExpression{self.idx, self.idx}\n\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.SetExpression(empty)\n\t\t\t\tself.comments.Unset()\n\t\t\t}\n\t\t\tvalue = append(value, empty)\n\t\t\tself.next()\n\t\t\tcontinue\n\t\t}\n\n\t\texp := self.parseAssignmentExpression()\n\n\t\tvalue = append(value, exp)\n\t\tif self.token != token.RIGHT_BRACKET {\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.Unset()\n\t\t\t}\n\t\t\tself.expect(token.COMMA)\n\t\t}\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.MarkComments(ast.FINAL)\n\t}\n\tidx1 := self.expect(token.RIGHT_BRACKET)\n\n\treturn &ast.ArrayLiteral{\n\t\tLeftBracket:  idx0,\n\t\tRightBracket: idx1,\n\t\tValue:        value,\n\t}\n}\n\nfunc (self *_parser) parseArgumentList() (argumentList []ast.Expression, idx0, idx1 file.Idx) {\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t}\n\tidx0 = self.expect(token.LEFT_PARENTHESIS)\n\tif self.token != token.RIGHT_PARENTHESIS {\n\t\tfor {\n\t\t\texp := self.parseAssignmentExpression()\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.SetExpression(exp)\n\t\t\t}\n\t\t\targumentList = append(argumentList, exp)\n\t\t\tif self.token != token.COMMA {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.Unset()\n\t\t\t}\n\t\t\tself.next()\n\t\t}\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t}\n\tidx1 = self.expect(token.RIGHT_PARENTHESIS)\n\treturn\n}\n\nfunc (self *_parser) parseCallExpression(left ast.Expression) ast.Expression {\n\targumentList, idx0, idx1 := self.parseArgumentList()\n\texp := &ast.CallExpression{\n\t\tCallee:           left,\n\t\tLeftParenthesis:  idx0,\n\t\tArgumentList:     argumentList,\n\t\tRightParenthesis: idx1,\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.SetExpression(exp)\n\t}\n\treturn exp\n}\n\nfunc (self *_parser) parseDotMember(left ast.Expression) ast.Expression {\n\tperiod := self.expect(token.PERIOD)\n\n\tliteral := self.literal\n\tidx := self.idx\n\n\tif !matchIdentifier.MatchString(literal) {\n\t\tself.expect(token.IDENTIFIER)\n\t\tself.nextStatement()\n\t\treturn &ast.BadExpression{From: period, To: self.idx}\n\t}\n\n\tself.next()\n\n\treturn &ast.DotExpression{\n\t\tLeft: left,\n\t\tIdentifier: &ast.Identifier{\n\t\t\tIdx:  idx,\n\t\t\tName: literal,\n\t\t},\n\t}\n}\n\nfunc (self *_parser) parseBracketMember(left ast.Expression) ast.Expression {\n\tidx0 := self.expect(token.LEFT_BRACKET)\n\tmember := self.parseExpression()\n\tidx1 := self.expect(token.RIGHT_BRACKET)\n\treturn &ast.BracketExpression{\n\t\tLeftBracket:  idx0,\n\t\tLeft:         left,\n\t\tMember:       member,\n\t\tRightBracket: idx1,\n\t}\n}\n\nfunc (self *_parser) parseNewExpression() ast.Expression {\n\tidx := self.expect(token.NEW)\n\tcallee := self.parseLeftHandSideExpression()\n\tnode := &ast.NewExpression{\n\t\tNew:    idx,\n\t\tCallee: callee,\n\t}\n\tif self.token == token.LEFT_PARENTHESIS {\n\t\targumentList, idx0, idx1 := self.parseArgumentList()\n\t\tnode.ArgumentList = argumentList\n\t\tnode.LeftParenthesis = idx0\n\t\tnode.RightParenthesis = idx1\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.SetExpression(node)\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseLeftHandSideExpression() ast.Expression {\n\n\tvar left ast.Expression\n\tif self.token == token.NEW {\n\t\tleft = self.parseNewExpression()\n\t} else {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.MarkComments(ast.LEADING)\n\t\t\tself.comments.MarkPrimary()\n\t\t}\n\t\tleft = self.parsePrimaryExpression()\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.SetExpression(left)\n\t}\n\n\tfor {\n\t\tif self.token == token.PERIOD {\n\t\t\tleft = self.parseDotMember(left)\n\t\t} else if self.token == token.LEFT_BRACKET {\n\t\t\tleft = self.parseBracketMember(left)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression {\n\n\tallowIn := self.scope.allowIn\n\tself.scope.allowIn = true\n\tdefer func() {\n\t\tself.scope.allowIn = allowIn\n\t}()\n\n\tvar left ast.Expression\n\tif self.token == token.NEW {\n\t\tvar newComments []*ast.Comment\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tnewComments = self.comments.FetchAll()\n\t\t\tself.comments.MarkComments(ast.LEADING)\n\t\t\tself.comments.MarkPrimary()\n\t\t}\n\t\tleft = self.parseNewExpression()\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.CommentMap.AddComments(left, newComments, ast.LEADING)\n\t\t}\n\t} else {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.MarkComments(ast.LEADING)\n\t\t\tself.comments.MarkPrimary()\n\t\t}\n\t\tleft = self.parsePrimaryExpression()\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.SetExpression(left)\n\t}\n\n\tfor {\n\t\tif self.token == token.PERIOD {\n\t\t\tleft = self.parseDotMember(left)\n\t\t} else if self.token == token.LEFT_BRACKET {\n\t\t\tleft = self.parseBracketMember(left)\n\t\t} else if self.token == token.LEFT_PARENTHESIS {\n\t\t\tleft = self.parseCallExpression(left)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parsePostfixExpression() ast.Expression {\n\toperand := self.parseLeftHandSideExpressionAllowCall()\n\n\tswitch self.token {\n\tcase token.INCREMENT, token.DECREMENT:\n\t\t// Make sure there is no line terminator here\n\t\tif self.implicitSemicolon {\n\t\t\tbreak\n\t\t}\n\t\ttkn := self.token\n\t\tidx := self.idx\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\t\tswitch operand.(type) {\n\t\tcase *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:\n\t\tdefault:\n\t\t\tself.error(idx, \"Invalid left-hand side in assignment\")\n\t\t\tself.nextStatement()\n\t\t\treturn &ast.BadExpression{From: idx, To: self.idx}\n\t\t}\n\t\texp := &ast.UnaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tIdx:      idx,\n\t\t\tOperand:  operand,\n\t\t\tPostfix:  true,\n\t\t}\n\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.SetExpression(exp)\n\t\t}\n\n\t\treturn exp\n\t}\n\n\treturn operand\n}\n\nfunc (self *_parser) parseUnaryExpression() ast.Expression {\n\n\tswitch self.token {\n\tcase token.PLUS, token.MINUS, token.NOT, token.BITWISE_NOT:\n\t\tfallthrough\n\tcase token.DELETE, token.VOID, token.TYPEOF:\n\t\ttkn := self.token\n\t\tidx := self.idx\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\treturn &ast.UnaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tIdx:      idx,\n\t\t\tOperand:  self.parseUnaryExpression(),\n\t\t}\n\tcase token.INCREMENT, token.DECREMENT:\n\t\ttkn := self.token\n\t\tidx := self.idx\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\t\toperand := self.parseUnaryExpression()\n\t\tswitch operand.(type) {\n\t\tcase *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:\n\t\tdefault:\n\t\t\tself.error(idx, \"Invalid left-hand side in assignment\")\n\t\t\tself.nextStatement()\n\t\t\treturn &ast.BadExpression{From: idx, To: self.idx}\n\t\t}\n\t\treturn &ast.UnaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tIdx:      idx,\n\t\t\tOperand:  operand,\n\t\t}\n\t}\n\n\treturn self.parsePostfixExpression()\n}\n\nfunc (self *_parser) parseMultiplicativeExpression() ast.Expression {\n\tnext := self.parseUnaryExpression\n\tleft := next()\n\n\tfor self.token == token.MULTIPLY || self.token == token.SLASH ||\n\t\tself.token == token.REMAINDER {\n\t\ttkn := self.token\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseAdditiveExpression() ast.Expression {\n\tnext := self.parseMultiplicativeExpression\n\tleft := next()\n\n\tfor self.token == token.PLUS || self.token == token.MINUS {\n\t\ttkn := self.token\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseShiftExpression() ast.Expression {\n\tnext := self.parseAdditiveExpression\n\tleft := next()\n\n\tfor self.token == token.SHIFT_LEFT || self.token == token.SHIFT_RIGHT ||\n\t\tself.token == token.UNSIGNED_SHIFT_RIGHT {\n\t\ttkn := self.token\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseRelationalExpression() ast.Expression {\n\tnext := self.parseShiftExpression\n\tleft := next()\n\n\tallowIn := self.scope.allowIn\n\tself.scope.allowIn = true\n\tdefer func() {\n\t\tself.scope.allowIn = allowIn\n\t}()\n\n\tswitch self.token {\n\tcase token.LESS, token.LESS_OR_EQUAL, token.GREATER, token.GREATER_OR_EQUAL:\n\t\ttkn := self.token\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\texp := &ast.BinaryExpression{\n\t\t\tOperator:   tkn,\n\t\t\tLeft:       left,\n\t\t\tRight:      self.parseRelationalExpression(),\n\t\t\tComparison: true,\n\t\t}\n\t\treturn exp\n\tcase token.INSTANCEOF:\n\t\ttkn := self.token\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\texp := &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    self.parseRelationalExpression(),\n\t\t}\n\t\treturn exp\n\tcase token.IN:\n\t\tif !allowIn {\n\t\t\treturn left\n\t\t}\n\t\ttkn := self.token\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\texp := &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    self.parseRelationalExpression(),\n\t\t}\n\t\treturn exp\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseEqualityExpression() ast.Expression {\n\tnext := self.parseRelationalExpression\n\tleft := next()\n\n\tfor self.token == token.EQUAL || self.token == token.NOT_EQUAL ||\n\t\tself.token == token.STRICT_EQUAL || self.token == token.STRICT_NOT_EQUAL {\n\t\ttkn := self.token\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator:   tkn,\n\t\t\tLeft:       left,\n\t\t\tRight:      next(),\n\t\t\tComparison: true,\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseBitwiseAndExpression() ast.Expression {\n\tnext := self.parseEqualityExpression\n\tleft := next()\n\n\tfor self.token == token.AND {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\ttkn := self.token\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseBitwiseExclusiveOrExpression() ast.Expression {\n\tnext := self.parseBitwiseAndExpression\n\tleft := next()\n\n\tfor self.token == token.EXCLUSIVE_OR {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\ttkn := self.token\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseBitwiseOrExpression() ast.Expression {\n\tnext := self.parseBitwiseExclusiveOrExpression\n\tleft := next()\n\n\tfor self.token == token.OR {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\ttkn := self.token\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseLogicalAndExpression() ast.Expression {\n\tnext := self.parseBitwiseOrExpression\n\tleft := next()\n\n\tfor self.token == token.LOGICAL_AND {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\ttkn := self.token\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseLogicalOrExpression() ast.Expression {\n\tnext := self.parseLogicalAndExpression\n\tleft := next()\n\n\tfor self.token == token.LOGICAL_OR {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\ttkn := self.token\n\t\tself.next()\n\n\t\tleft = &ast.BinaryExpression{\n\t\t\tOperator: tkn,\n\t\t\tLeft:     left,\n\t\t\tRight:    next(),\n\t\t}\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseConditionlExpression() ast.Expression {\n\tleft := self.parseLogicalOrExpression()\n\n\tif self.token == token.QUESTION_MARK {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\n\t\tconsequent := self.parseAssignmentExpression()\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.expect(token.COLON)\n\t\texp := &ast.ConditionalExpression{\n\t\t\tTest:       left,\n\t\t\tConsequent: consequent,\n\t\t\tAlternate:  self.parseAssignmentExpression(),\n\t\t}\n\n\t\treturn exp\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseAssignmentExpression() ast.Expression {\n\tleft := self.parseConditionlExpression()\n\tvar operator token.Token\n\tswitch self.token {\n\tcase token.ASSIGN:\n\t\toperator = self.token\n\tcase token.ADD_ASSIGN:\n\t\toperator = token.PLUS\n\tcase token.SUBTRACT_ASSIGN:\n\t\toperator = token.MINUS\n\tcase token.MULTIPLY_ASSIGN:\n\t\toperator = token.MULTIPLY\n\tcase token.QUOTIENT_ASSIGN:\n\t\toperator = token.SLASH\n\tcase token.REMAINDER_ASSIGN:\n\t\toperator = token.REMAINDER\n\tcase token.AND_ASSIGN:\n\t\toperator = token.AND\n\tcase token.AND_NOT_ASSIGN:\n\t\toperator = token.AND_NOT\n\tcase token.OR_ASSIGN:\n\t\toperator = token.OR\n\tcase token.EXCLUSIVE_OR_ASSIGN:\n\t\toperator = token.EXCLUSIVE_OR\n\tcase token.SHIFT_LEFT_ASSIGN:\n\t\toperator = token.SHIFT_LEFT\n\tcase token.SHIFT_RIGHT_ASSIGN:\n\t\toperator = token.SHIFT_RIGHT\n\tcase token.UNSIGNED_SHIFT_RIGHT_ASSIGN:\n\t\toperator = token.UNSIGNED_SHIFT_RIGHT\n\t}\n\n\tif operator != 0 {\n\t\tidx := self.idx\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\t\tswitch left.(type) {\n\t\tcase *ast.Identifier, *ast.DotExpression, *ast.BracketExpression:\n\t\tdefault:\n\t\t\tself.error(left.Idx0(), \"Invalid left-hand side in assignment\")\n\t\t\tself.nextStatement()\n\t\t\treturn &ast.BadExpression{From: idx, To: self.idx}\n\t\t}\n\n\t\texp := &ast.AssignExpression{\n\t\t\tLeft:     left,\n\t\t\tOperator: operator,\n\t\t\tRight:    self.parseAssignmentExpression(),\n\t\t}\n\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.SetExpression(exp)\n\t\t}\n\n\t\treturn exp\n\t}\n\n\treturn left\n}\n\nfunc (self *_parser) parseExpression() ast.Expression {\n\tnext := self.parseAssignmentExpression\n\tleft := next()\n\n\tif self.token == token.COMMA {\n\t\tsequence := []ast.Expression{left}\n\t\tfor {\n\t\t\tif self.token != token.COMMA {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tself.next()\n\t\t\tsequence = append(sequence, next())\n\t\t}\n\t\treturn &ast.SequenceExpression{\n\t\t\tSequence: sequence,\n\t\t}\n\t}\n\n\treturn left\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/lexer.go",
    "content": "package parser\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n\n\t\"github.com/robertkrimen/otto/ast\"\n\t\"github.com/robertkrimen/otto/file\"\n\t\"github.com/robertkrimen/otto/token\"\n)\n\ntype _chr struct {\n\tvalue rune\n\twidth int\n}\n\nvar matchIdentifier = regexp.MustCompile(`^[$_\\p{L}][$_\\p{L}\\d}]*$`)\n\nfunc isDecimalDigit(chr rune) bool {\n\treturn '0' <= chr && chr <= '9'\n}\n\nfunc digitValue(chr rune) int {\n\tswitch {\n\tcase '0' <= chr && chr <= '9':\n\t\treturn int(chr - '0')\n\tcase 'a' <= chr && chr <= 'f':\n\t\treturn int(chr - 'a' + 10)\n\tcase 'A' <= chr && chr <= 'F':\n\t\treturn int(chr - 'A' + 10)\n\t}\n\treturn 16 // Larger than any legal digit value\n}\n\nfunc isDigit(chr rune, base int) bool {\n\treturn digitValue(chr) < base\n}\n\nfunc isIdentifierStart(chr rune) bool {\n\treturn chr == '$' || chr == '_' || chr == '\\\\' ||\n\t\t'a' <= chr && chr <= 'z' || 'A' <= chr && chr <= 'Z' ||\n\t\tchr >= utf8.RuneSelf && unicode.IsLetter(chr)\n}\n\nfunc isIdentifierPart(chr rune) bool {\n\treturn chr == '$' || chr == '_' || chr == '\\\\' ||\n\t\t'a' <= chr && chr <= 'z' || 'A' <= chr && chr <= 'Z' ||\n\t\t'0' <= chr && chr <= '9' ||\n\t\tchr >= utf8.RuneSelf && (unicode.IsLetter(chr) || unicode.IsDigit(chr))\n}\n\nfunc (self *_parser) scanIdentifier() (string, error) {\n\toffset := self.chrOffset\n\tparse := false\n\tfor isIdentifierPart(self.chr) {\n\t\tif self.chr == '\\\\' {\n\t\t\tdistance := self.chrOffset - offset\n\t\t\tself.read()\n\t\t\tif self.chr != 'u' {\n\t\t\t\treturn \"\", fmt.Errorf(\"Invalid identifier escape character: %c (%s)\", self.chr, string(self.chr))\n\t\t\t}\n\t\t\tparse = true\n\t\t\tvar value rune\n\t\t\tfor j := 0; j < 4; j++ {\n\t\t\t\tself.read()\n\t\t\t\tdecimal, ok := hex2decimal(byte(self.chr))\n\t\t\t\tif !ok {\n\t\t\t\t\treturn \"\", fmt.Errorf(\"Invalid identifier escape character: %c (%s)\", self.chr, string(self.chr))\n\t\t\t\t}\n\t\t\t\tvalue = value<<4 | decimal\n\t\t\t}\n\t\t\tif value == '\\\\' {\n\t\t\t\treturn \"\", fmt.Errorf(\"Invalid identifier escape value: %c (%s)\", value, string(value))\n\t\t\t} else if distance == 0 {\n\t\t\t\tif !isIdentifierStart(value) {\n\t\t\t\t\treturn \"\", fmt.Errorf(\"Invalid identifier escape value: %c (%s)\", value, string(value))\n\t\t\t\t}\n\t\t\t} else if distance > 0 {\n\t\t\t\tif !isIdentifierPart(value) {\n\t\t\t\t\treturn \"\", fmt.Errorf(\"Invalid identifier escape value: %c (%s)\", value, string(value))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tself.read()\n\t}\n\tliteral := string(self.str[offset:self.chrOffset])\n\tif parse {\n\t\treturn parseStringLiteral(literal)\n\t}\n\treturn literal, nil\n}\n\n// 7.2\nfunc isLineWhiteSpace(chr rune) bool {\n\tswitch chr {\n\tcase '\\u0009', '\\u000b', '\\u000c', '\\u0020', '\\u00a0', '\\ufeff':\n\t\treturn true\n\tcase '\\u000a', '\\u000d', '\\u2028', '\\u2029':\n\t\treturn false\n\tcase '\\u0085':\n\t\treturn false\n\t}\n\treturn unicode.IsSpace(chr)\n}\n\n// 7.3\nfunc isLineTerminator(chr rune) bool {\n\tswitch chr {\n\tcase '\\u000a', '\\u000d', '\\u2028', '\\u2029':\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (self *_parser) scan() (tkn token.Token, literal string, idx file.Idx) {\n\n\tself.implicitSemicolon = false\n\n\tfor {\n\t\tself.skipWhiteSpace()\n\n\t\tidx = self.idxOf(self.chrOffset)\n\t\tinsertSemicolon := false\n\n\t\tswitch chr := self.chr; {\n\t\tcase isIdentifierStart(chr):\n\t\t\tvar err error\n\t\t\tliteral, err = self.scanIdentifier()\n\t\t\tif err != nil {\n\t\t\t\ttkn = token.ILLEGAL\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif len(literal) > 1 {\n\t\t\t\t// Keywords are longer than 1 character, avoid lookup otherwise\n\t\t\t\tvar strict bool\n\t\t\t\ttkn, strict = token.IsKeyword(literal)\n\n\t\t\t\tswitch tkn {\n\n\t\t\t\tcase 0: // Not a keyword\n\t\t\t\t\tif literal == \"true\" || literal == \"false\" {\n\t\t\t\t\t\tself.insertSemicolon = true\n\t\t\t\t\t\ttkn = token.BOOLEAN\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else if literal == \"null\" {\n\t\t\t\t\t\tself.insertSemicolon = true\n\t\t\t\t\t\ttkn = token.NULL\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\tcase token.KEYWORD:\n\t\t\t\t\ttkn = token.KEYWORD\n\t\t\t\t\tif strict {\n\t\t\t\t\t\t// TODO If strict and in strict mode, then this is not a break\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\n\t\t\t\tcase\n\t\t\t\t\ttoken.THIS,\n\t\t\t\t\ttoken.BREAK,\n\t\t\t\t\ttoken.THROW, // A newline after a throw is not allowed, but we need to detect it\n\t\t\t\t\ttoken.RETURN,\n\t\t\t\t\ttoken.CONTINUE,\n\t\t\t\t\ttoken.DEBUGGER:\n\t\t\t\t\tself.insertSemicolon = true\n\t\t\t\t\treturn\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn\n\n\t\t\t\t}\n\t\t\t}\n\t\t\tself.insertSemicolon = true\n\t\t\ttkn = token.IDENTIFIER\n\t\t\treturn\n\t\tcase '0' <= chr && chr <= '9':\n\t\t\tself.insertSemicolon = true\n\t\t\ttkn, literal = self.scanNumericLiteral(false)\n\t\t\treturn\n\t\tdefault:\n\t\t\tself.read()\n\t\t\tswitch chr {\n\t\t\tcase -1:\n\t\t\t\tif self.insertSemicolon {\n\t\t\t\t\tself.insertSemicolon = false\n\t\t\t\t\tself.implicitSemicolon = true\n\t\t\t\t}\n\t\t\t\ttkn = token.EOF\n\t\t\tcase '\\r', '\\n', '\\u2028', '\\u2029':\n\t\t\t\tself.insertSemicolon = false\n\t\t\t\tself.implicitSemicolon = true\n\t\t\t\tself.comments.AtLineBreak()\n\t\t\t\tcontinue\n\t\t\tcase ':':\n\t\t\t\ttkn = token.COLON\n\t\t\tcase '.':\n\t\t\t\tif digitValue(self.chr) < 10 {\n\t\t\t\t\tinsertSemicolon = true\n\t\t\t\t\ttkn, literal = self.scanNumericLiteral(true)\n\t\t\t\t} else {\n\t\t\t\t\ttkn = token.PERIOD\n\t\t\t\t}\n\t\t\tcase ',':\n\t\t\t\ttkn = token.COMMA\n\t\t\tcase ';':\n\t\t\t\ttkn = token.SEMICOLON\n\t\t\tcase '(':\n\t\t\t\ttkn = token.LEFT_PARENTHESIS\n\t\t\tcase ')':\n\t\t\t\ttkn = token.RIGHT_PARENTHESIS\n\t\t\t\tinsertSemicolon = true\n\t\t\tcase '[':\n\t\t\t\ttkn = token.LEFT_BRACKET\n\t\t\tcase ']':\n\t\t\t\ttkn = token.RIGHT_BRACKET\n\t\t\t\tinsertSemicolon = true\n\t\t\tcase '{':\n\t\t\t\ttkn = token.LEFT_BRACE\n\t\t\tcase '}':\n\t\t\t\ttkn = token.RIGHT_BRACE\n\t\t\t\tinsertSemicolon = true\n\t\t\tcase '+':\n\t\t\t\ttkn = self.switch3(token.PLUS, token.ADD_ASSIGN, '+', token.INCREMENT)\n\t\t\t\tif tkn == token.INCREMENT {\n\t\t\t\t\tinsertSemicolon = true\n\t\t\t\t}\n\t\t\tcase '-':\n\t\t\t\ttkn = self.switch3(token.MINUS, token.SUBTRACT_ASSIGN, '-', token.DECREMENT)\n\t\t\t\tif tkn == token.DECREMENT {\n\t\t\t\t\tinsertSemicolon = true\n\t\t\t\t}\n\t\t\tcase '*':\n\t\t\t\ttkn = self.switch2(token.MULTIPLY, token.MULTIPLY_ASSIGN)\n\t\t\tcase '/':\n\t\t\t\tif self.chr == '/' {\n\t\t\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\t\t\tliteral := string(self.readSingleLineComment())\n\t\t\t\t\t\tself.comments.AddComment(ast.NewComment(literal, self.idx))\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tself.skipSingleLineComment()\n\t\t\t\t\tcontinue\n\t\t\t\t} else if self.chr == '*' {\n\t\t\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\t\t\tliteral = string(self.readMultiLineComment())\n\t\t\t\t\t\tself.comments.AddComment(ast.NewComment(literal, self.idx))\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tself.skipMultiLineComment()\n\t\t\t\t\tcontinue\n\t\t\t\t} else {\n\t\t\t\t\t// Could be division, could be RegExp literal\n\t\t\t\t\ttkn = self.switch2(token.SLASH, token.QUOTIENT_ASSIGN)\n\t\t\t\t\tinsertSemicolon = true\n\t\t\t\t}\n\t\t\tcase '%':\n\t\t\t\ttkn = self.switch2(token.REMAINDER, token.REMAINDER_ASSIGN)\n\t\t\tcase '^':\n\t\t\t\ttkn = self.switch2(token.EXCLUSIVE_OR, token.EXCLUSIVE_OR_ASSIGN)\n\t\t\tcase '<':\n\t\t\t\ttkn = self.switch4(token.LESS, token.LESS_OR_EQUAL, '<', token.SHIFT_LEFT, token.SHIFT_LEFT_ASSIGN)\n\t\t\tcase '>':\n\t\t\t\ttkn = self.switch6(token.GREATER, token.GREATER_OR_EQUAL, '>', token.SHIFT_RIGHT, token.SHIFT_RIGHT_ASSIGN, '>', token.UNSIGNED_SHIFT_RIGHT, token.UNSIGNED_SHIFT_RIGHT_ASSIGN)\n\t\t\tcase '=':\n\t\t\t\ttkn = self.switch2(token.ASSIGN, token.EQUAL)\n\t\t\t\tif tkn == token.EQUAL && self.chr == '=' {\n\t\t\t\t\tself.read()\n\t\t\t\t\ttkn = token.STRICT_EQUAL\n\t\t\t\t}\n\t\t\tcase '!':\n\t\t\t\ttkn = self.switch2(token.NOT, token.NOT_EQUAL)\n\t\t\t\tif tkn == token.NOT_EQUAL && self.chr == '=' {\n\t\t\t\t\tself.read()\n\t\t\t\t\ttkn = token.STRICT_NOT_EQUAL\n\t\t\t\t}\n\t\t\tcase '&':\n\t\t\t\tif self.chr == '^' {\n\t\t\t\t\tself.read()\n\t\t\t\t\ttkn = self.switch2(token.AND_NOT, token.AND_NOT_ASSIGN)\n\t\t\t\t} else {\n\t\t\t\t\ttkn = self.switch3(token.AND, token.AND_ASSIGN, '&', token.LOGICAL_AND)\n\t\t\t\t}\n\t\t\tcase '|':\n\t\t\t\ttkn = self.switch3(token.OR, token.OR_ASSIGN, '|', token.LOGICAL_OR)\n\t\t\tcase '~':\n\t\t\t\ttkn = token.BITWISE_NOT\n\t\t\tcase '?':\n\t\t\t\ttkn = token.QUESTION_MARK\n\t\t\tcase '\"', '\\'':\n\t\t\t\tinsertSemicolon = true\n\t\t\t\ttkn = token.STRING\n\t\t\t\tvar err error\n\t\t\t\tliteral, err = self.scanString(self.chrOffset - 1)\n\t\t\t\tif err != nil {\n\t\t\t\t\ttkn = token.ILLEGAL\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tself.errorUnexpected(idx, chr)\n\t\t\t\ttkn = token.ILLEGAL\n\t\t\t}\n\t\t}\n\t\tself.insertSemicolon = insertSemicolon\n\t\treturn\n\t}\n}\n\nfunc (self *_parser) switch2(tkn0, tkn1 token.Token) token.Token {\n\tif self.chr == '=' {\n\t\tself.read()\n\t\treturn tkn1\n\t}\n\treturn tkn0\n}\n\nfunc (self *_parser) switch3(tkn0, tkn1 token.Token, chr2 rune, tkn2 token.Token) token.Token {\n\tif self.chr == '=' {\n\t\tself.read()\n\t\treturn tkn1\n\t}\n\tif self.chr == chr2 {\n\t\tself.read()\n\t\treturn tkn2\n\t}\n\treturn tkn0\n}\n\nfunc (self *_parser) switch4(tkn0, tkn1 token.Token, chr2 rune, tkn2, tkn3 token.Token) token.Token {\n\tif self.chr == '=' {\n\t\tself.read()\n\t\treturn tkn1\n\t}\n\tif self.chr == chr2 {\n\t\tself.read()\n\t\tif self.chr == '=' {\n\t\t\tself.read()\n\t\t\treturn tkn3\n\t\t}\n\t\treturn tkn2\n\t}\n\treturn tkn0\n}\n\nfunc (self *_parser) switch6(tkn0, tkn1 token.Token, chr2 rune, tkn2, tkn3 token.Token, chr3 rune, tkn4, tkn5 token.Token) token.Token {\n\tif self.chr == '=' {\n\t\tself.read()\n\t\treturn tkn1\n\t}\n\tif self.chr == chr2 {\n\t\tself.read()\n\t\tif self.chr == '=' {\n\t\t\tself.read()\n\t\t\treturn tkn3\n\t\t}\n\t\tif self.chr == chr3 {\n\t\t\tself.read()\n\t\t\tif self.chr == '=' {\n\t\t\t\tself.read()\n\t\t\t\treturn tkn5\n\t\t\t}\n\t\t\treturn tkn4\n\t\t}\n\t\treturn tkn2\n\t}\n\treturn tkn0\n}\n\nfunc (self *_parser) chrAt(index int) _chr {\n\tvalue, width := utf8.DecodeRuneInString(self.str[index:])\n\treturn _chr{\n\t\tvalue: value,\n\t\twidth: width,\n\t}\n}\n\nfunc (self *_parser) _peek() rune {\n\tif self.offset+1 < self.length {\n\t\treturn rune(self.str[self.offset+1])\n\t}\n\treturn -1\n}\n\nfunc (self *_parser) read() {\n\tif self.offset < self.length {\n\t\tself.chrOffset = self.offset\n\t\tchr, width := rune(self.str[self.offset]), 1\n\t\tif chr >= utf8.RuneSelf { // !ASCII\n\t\t\tchr, width = utf8.DecodeRuneInString(self.str[self.offset:])\n\t\t\tif chr == utf8.RuneError && width == 1 {\n\t\t\t\tself.error(self.chrOffset, \"Invalid UTF-8 character\")\n\t\t\t}\n\t\t}\n\t\tself.offset += width\n\t\tself.chr = chr\n\t} else {\n\t\tself.chrOffset = self.length\n\t\tself.chr = -1 // EOF\n\t}\n}\n\n// This is here since the functions are so similar\nfunc (self *_RegExp_parser) read() {\n\tif self.offset < self.length {\n\t\tself.chrOffset = self.offset\n\t\tchr, width := rune(self.str[self.offset]), 1\n\t\tif chr >= utf8.RuneSelf { // !ASCII\n\t\t\tchr, width = utf8.DecodeRuneInString(self.str[self.offset:])\n\t\t\tif chr == utf8.RuneError && width == 1 {\n\t\t\t\tself.error(self.chrOffset, \"Invalid UTF-8 character\")\n\t\t\t}\n\t\t}\n\t\tself.offset += width\n\t\tself.chr = chr\n\t} else {\n\t\tself.chrOffset = self.length\n\t\tself.chr = -1 // EOF\n\t}\n}\n\nfunc (self *_parser) readSingleLineComment() (result []rune) {\n\tfor self.chr != -1 {\n\t\tself.read()\n\t\tif isLineTerminator(self.chr) {\n\t\t\treturn\n\t\t}\n\t\tresult = append(result, self.chr)\n\t}\n\n\t// Get rid of the trailing -1\n\tresult = result[:len(result)-1]\n\n\treturn\n}\n\nfunc (self *_parser) readMultiLineComment() (result []rune) {\n\tself.read()\n\tfor self.chr >= 0 {\n\t\tchr := self.chr\n\t\tself.read()\n\t\tif chr == '*' && self.chr == '/' {\n\t\t\tself.read()\n\t\t\treturn\n\t\t}\n\n\t\tresult = append(result, chr)\n\t}\n\n\tself.errorUnexpected(0, self.chr)\n\n\treturn\n}\n\nfunc (self *_parser) skipSingleLineComment() {\n\tfor self.chr != -1 {\n\t\tself.read()\n\t\tif isLineTerminator(self.chr) {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *_parser) skipMultiLineComment() {\n\tself.read()\n\tfor self.chr >= 0 {\n\t\tchr := self.chr\n\t\tself.read()\n\t\tif chr == '*' && self.chr == '/' {\n\t\t\tself.read()\n\t\t\treturn\n\t\t}\n\t}\n\n\tself.errorUnexpected(0, self.chr)\n}\n\nfunc (self *_parser) skipWhiteSpace() {\n\tfor {\n\t\tswitch self.chr {\n\t\tcase ' ', '\\t', '\\f', '\\v', '\\u00a0', '\\ufeff':\n\t\t\tself.read()\n\t\t\tcontinue\n\t\tcase '\\r':\n\t\t\tif self._peek() == '\\n' {\n\t\t\t\tself.comments.AtLineBreak()\n\t\t\t\tself.read()\n\t\t\t}\n\t\t\tfallthrough\n\t\tcase '\\u2028', '\\u2029', '\\n':\n\t\t\tif self.insertSemicolon {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tself.comments.AtLineBreak()\n\t\t\tself.read()\n\t\t\tcontinue\n\t\t}\n\t\tif self.chr >= utf8.RuneSelf {\n\t\t\tif unicode.IsSpace(self.chr) {\n\t\t\t\tself.read()\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tbreak\n\t}\n}\n\nfunc (self *_parser) skipLineWhiteSpace() {\n\tfor isLineWhiteSpace(self.chr) {\n\t\tself.read()\n\t}\n}\n\nfunc (self *_parser) scanMantissa(base int) {\n\tfor digitValue(self.chr) < base {\n\t\tself.read()\n\t}\n}\n\nfunc (self *_parser) scanEscape(quote rune) {\n\n\tvar length, base uint32\n\tswitch self.chr {\n\t//case '0', '1', '2', '3', '4', '5', '6', '7':\n\t//    Octal:\n\t//    length, base, limit = 3, 8, 255\n\tcase 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\\\', '\"', '\\'', '0':\n\t\tself.read()\n\t\treturn\n\tcase '\\r', '\\n', '\\u2028', '\\u2029':\n\t\tself.scanNewline()\n\t\treturn\n\tcase 'x':\n\t\tself.read()\n\t\tlength, base = 2, 16\n\tcase 'u':\n\t\tself.read()\n\t\tlength, base = 4, 16\n\tdefault:\n\t\tself.read() // Always make progress\n\t\treturn\n\t}\n\n\tvar value uint32\n\tfor ; length > 0 && self.chr != quote && self.chr >= 0; length-- {\n\t\tdigit := uint32(digitValue(self.chr))\n\t\tif digit >= base {\n\t\t\tbreak\n\t\t}\n\t\tvalue = value*base + digit\n\t\tself.read()\n\t}\n}\n\nfunc (self *_parser) scanString(offset int) (string, error) {\n\t// \" ' /\n\tquote := rune(self.str[offset])\n\n\tfor self.chr != quote {\n\t\tchr := self.chr\n\t\tif chr == '\\n' || chr == '\\r' || chr == '\\u2028' || chr == '\\u2029' || chr < 0 {\n\t\t\tgoto newline\n\t\t}\n\t\tself.read()\n\t\tif chr == '\\\\' {\n\t\t\tif quote == '/' {\n\t\t\t\tif self.chr == '\\n' || self.chr == '\\r' || self.chr == '\\u2028' || self.chr == '\\u2029' || self.chr < 0 {\n\t\t\t\t\tgoto newline\n\t\t\t\t}\n\t\t\t\tself.read()\n\t\t\t} else {\n\t\t\t\tself.scanEscape(quote)\n\t\t\t}\n\t\t} else if chr == '[' && quote == '/' {\n\t\t\t// Allow a slash (/) in a bracket character class ([...])\n\t\t\t// TODO Fix this, this is hacky...\n\t\t\tquote = -1\n\t\t} else if chr == ']' && quote == -1 {\n\t\t\tquote = '/'\n\t\t}\n\t}\n\n\t// \" ' /\n\tself.read()\n\n\treturn string(self.str[offset:self.chrOffset]), nil\n\nnewline:\n\tself.scanNewline()\n\terr := \"String not terminated\"\n\tif quote == '/' {\n\t\terr = \"Invalid regular expression: missing /\"\n\t\tself.error(self.idxOf(offset), err)\n\t}\n\treturn \"\", errors.New(err)\n}\n\nfunc (self *_parser) scanNewline() {\n\tif self.chr == '\\r' {\n\t\tself.read()\n\t\tif self.chr != '\\n' {\n\t\t\treturn\n\t\t}\n\t}\n\tself.read()\n}\n\nfunc hex2decimal(chr byte) (value rune, ok bool) {\n\t{\n\t\tchr := rune(chr)\n\t\tswitch {\n\t\tcase '0' <= chr && chr <= '9':\n\t\t\treturn chr - '0', true\n\t\tcase 'a' <= chr && chr <= 'f':\n\t\t\treturn chr - 'a' + 10, true\n\t\tcase 'A' <= chr && chr <= 'F':\n\t\t\treturn chr - 'A' + 10, true\n\t\t}\n\t\treturn\n\t}\n}\n\nfunc parseNumberLiteral(literal string) (value interface{}, err error) {\n\t// TODO Is Uint okay? What about -MAX_UINT\n\tvalue, err = strconv.ParseInt(literal, 0, 64)\n\tif err == nil {\n\t\treturn\n\t}\n\n\tparseIntErr := err // Save this first error, just in case\n\n\tvalue, err = strconv.ParseFloat(literal, 64)\n\tif err == nil {\n\t\treturn\n\t} else if err.(*strconv.NumError).Err == strconv.ErrRange {\n\t\t// Infinity, etc.\n\t\treturn value, nil\n\t}\n\n\terr = parseIntErr\n\n\tif err.(*strconv.NumError).Err == strconv.ErrRange {\n\t\tif len(literal) > 2 && literal[0] == '0' && (literal[1] == 'X' || literal[1] == 'x') {\n\t\t\t// Could just be a very large number (e.g. 0x8000000000000000)\n\t\t\tvar value float64\n\t\t\tliteral = literal[2:]\n\t\t\tfor _, chr := range literal {\n\t\t\t\tdigit := digitValue(chr)\n\t\t\t\tif digit >= 16 {\n\t\t\t\t\tgoto error\n\t\t\t\t}\n\t\t\t\tvalue = value*16 + float64(digit)\n\t\t\t}\n\t\t\treturn value, nil\n\t\t}\n\t}\n\nerror:\n\treturn nil, errors.New(\"Illegal numeric literal\")\n}\n\nfunc parseStringLiteral(literal string) (string, error) {\n\t// Best case scenario...\n\tif literal == \"\" {\n\t\treturn \"\", nil\n\t}\n\n\t// Slightly less-best case scenario...\n\tif !strings.ContainsRune(literal, '\\\\') {\n\t\treturn literal, nil\n\t}\n\n\tstr := literal\n\tbuffer := bytes.NewBuffer(make([]byte, 0, 3*len(literal)/2))\n\n\tfor len(str) > 0 {\n\t\tswitch chr := str[0]; {\n\t\t// We do not explicitly handle the case of the quote\n\t\t// value, which can be: \" ' /\n\t\t// This assumes we're already passed a partially well-formed literal\n\t\tcase chr >= utf8.RuneSelf:\n\t\t\tchr, size := utf8.DecodeRuneInString(str)\n\t\t\tbuffer.WriteRune(chr)\n\t\t\tstr = str[size:]\n\t\t\tcontinue\n\t\tcase chr != '\\\\':\n\t\t\tbuffer.WriteByte(chr)\n\t\t\tstr = str[1:]\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(str) <= 1 {\n\t\t\tpanic(\"len(str) <= 1\")\n\t\t}\n\t\tchr := str[1]\n\t\tvar value rune\n\t\tif chr >= utf8.RuneSelf {\n\t\t\tstr = str[1:]\n\t\t\tvar size int\n\t\t\tvalue, size = utf8.DecodeRuneInString(str)\n\t\t\tstr = str[size:] // \\ + <character>\n\t\t} else {\n\t\t\tstr = str[2:] // \\<character>\n\t\t\tswitch chr {\n\t\t\tcase 'b':\n\t\t\t\tvalue = '\\b'\n\t\t\tcase 'f':\n\t\t\t\tvalue = '\\f'\n\t\t\tcase 'n':\n\t\t\t\tvalue = '\\n'\n\t\t\tcase 'r':\n\t\t\t\tvalue = '\\r'\n\t\t\tcase 't':\n\t\t\t\tvalue = '\\t'\n\t\t\tcase 'v':\n\t\t\t\tvalue = '\\v'\n\t\t\tcase 'x', 'u':\n\t\t\t\tsize := 0\n\t\t\t\tswitch chr {\n\t\t\t\tcase 'x':\n\t\t\t\t\tsize = 2\n\t\t\t\tcase 'u':\n\t\t\t\t\tsize = 4\n\t\t\t\t}\n\t\t\t\tif len(str) < size {\n\t\t\t\t\treturn \"\", fmt.Errorf(\"invalid escape: \\\\%s: len(%q) != %d\", string(chr), str, size)\n\t\t\t\t}\n\t\t\t\tfor j := 0; j < size; j++ {\n\t\t\t\t\tdecimal, ok := hex2decimal(str[j])\n\t\t\t\t\tif !ok {\n\t\t\t\t\t\treturn \"\", fmt.Errorf(\"invalid escape: \\\\%s: %q\", string(chr), str[:size])\n\t\t\t\t\t}\n\t\t\t\t\tvalue = value<<4 | decimal\n\t\t\t\t}\n\t\t\t\tstr = str[size:]\n\t\t\t\tif chr == 'x' {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif value > utf8.MaxRune {\n\t\t\t\t\tpanic(\"value > utf8.MaxRune\")\n\t\t\t\t}\n\t\t\tcase '0':\n\t\t\t\tif len(str) == 0 || '0' > str[0] || str[0] > '7' {\n\t\t\t\t\tvalue = 0\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tfallthrough\n\t\t\tcase '1', '2', '3', '4', '5', '6', '7':\n\t\t\t\t// TODO strict\n\t\t\t\tvalue = rune(chr) - '0'\n\t\t\t\tj := 0\n\t\t\t\tfor ; j < 2; j++ {\n\t\t\t\t\tif len(str) < j+1 {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tchr := str[j]\n\t\t\t\t\tif '0' > chr || chr > '7' {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tdecimal := rune(str[j]) - '0'\n\t\t\t\t\tvalue = (value << 3) | decimal\n\t\t\t\t}\n\t\t\t\tstr = str[j:]\n\t\t\tcase '\\\\':\n\t\t\t\tvalue = '\\\\'\n\t\t\tcase '\\'', '\"':\n\t\t\t\tvalue = rune(chr)\n\t\t\tcase '\\r':\n\t\t\t\tif len(str) > 0 {\n\t\t\t\t\tif str[0] == '\\n' {\n\t\t\t\t\t\tstr = str[1:]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfallthrough\n\t\t\tcase '\\n':\n\t\t\t\tcontinue\n\t\t\tdefault:\n\t\t\t\tvalue = rune(chr)\n\t\t\t}\n\t\t}\n\t\tbuffer.WriteRune(value)\n\t}\n\n\treturn buffer.String(), nil\n}\n\nfunc (self *_parser) scanNumericLiteral(decimalPoint bool) (token.Token, string) {\n\n\toffset := self.chrOffset\n\ttkn := token.NUMBER\n\n\tif decimalPoint {\n\t\toffset--\n\t\tself.scanMantissa(10)\n\t\tgoto exponent\n\t}\n\n\tif self.chr == '0' {\n\t\toffset := self.chrOffset\n\t\tself.read()\n\t\tif self.chr == 'x' || self.chr == 'X' {\n\t\t\t// Hexadecimal\n\t\t\tself.read()\n\t\t\tif isDigit(self.chr, 16) {\n\t\t\t\tself.read()\n\t\t\t} else {\n\t\t\t\treturn token.ILLEGAL, self.str[offset:self.chrOffset]\n\t\t\t}\n\t\t\tself.scanMantissa(16)\n\n\t\t\tif self.chrOffset-offset <= 2 {\n\t\t\t\t// Only \"0x\" or \"0X\"\n\t\t\t\tself.error(0, \"Illegal hexadecimal number\")\n\t\t\t}\n\n\t\t\tgoto hexadecimal\n\t\t} else if self.chr == '.' {\n\t\t\t// Float\n\t\t\tgoto float\n\t\t} else {\n\t\t\t// Octal, Float\n\t\t\tif self.chr == 'e' || self.chr == 'E' {\n\t\t\t\tgoto exponent\n\t\t\t}\n\t\t\tself.scanMantissa(8)\n\t\t\tif self.chr == '8' || self.chr == '9' {\n\t\t\t\treturn token.ILLEGAL, self.str[offset:self.chrOffset]\n\t\t\t}\n\t\t\tgoto octal\n\t\t}\n\t}\n\n\tself.scanMantissa(10)\n\nfloat:\n\tif self.chr == '.' {\n\t\tself.read()\n\t\tself.scanMantissa(10)\n\t}\n\nexponent:\n\tif self.chr == 'e' || self.chr == 'E' {\n\t\tself.read()\n\t\tif self.chr == '-' || self.chr == '+' {\n\t\t\tself.read()\n\t\t}\n\t\tif isDecimalDigit(self.chr) {\n\t\t\tself.read()\n\t\t\tself.scanMantissa(10)\n\t\t} else {\n\t\t\treturn token.ILLEGAL, self.str[offset:self.chrOffset]\n\t\t}\n\t}\n\nhexadecimal:\noctal:\n\tif isIdentifierStart(self.chr) || isDecimalDigit(self.chr) {\n\t\treturn token.ILLEGAL, self.str[offset:self.chrOffset]\n\t}\n\n\treturn tkn, self.str[offset:self.chrOffset]\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/parser.go",
    "content": "/*\nPackage parser implements a parser for JavaScript.\n\n    import (\n        \"github.com/robertkrimen/otto/parser\"\n    )\n\nParse and return an AST\n\n    filename := \"\" // A filename is optional\n    src := `\n        // Sample xyzzy example\n        (function(){\n            if (3.14159 > 0) {\n                console.log(\"Hello, World.\");\n                return;\n            }\n\n            var xyzzy = NaN;\n            console.log(\"Nothing happens.\");\n            return xyzzy;\n        })();\n    `\n\n    // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList\n    program, err := parser.ParseFile(nil, filename, src, 0)\n\nWarning\n\nThe parser and AST interfaces are still works-in-progress (particularly where\nnode types are concerned) and may change in the future.\n\n*/\npackage parser\n\nimport (\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"io\"\n\t\"io/ioutil\"\n\n\t\"github.com/robertkrimen/otto/ast\"\n\t\"github.com/robertkrimen/otto/file\"\n\t\"github.com/robertkrimen/otto/token\"\n\t\"gopkg.in/sourcemap.v1\"\n)\n\n// A Mode value is a set of flags (or 0). They control optional parser functionality.\ntype Mode uint\n\nconst (\n\tIgnoreRegExpErrors Mode = 1 << iota // Ignore RegExp compatibility errors (allow backtracking)\n\tStoreComments                       // Store the comments from source to the comments map\n)\n\ntype _parser struct {\n\tstr    string\n\tlength int\n\tbase   int\n\n\tchr       rune // The current character\n\tchrOffset int  // The offset of current character\n\toffset    int  // The offset after current character (may be greater than 1)\n\n\tidx     file.Idx    // The index of token\n\ttoken   token.Token // The token\n\tliteral string      // The literal of the token, if any\n\n\tscope             *_scope\n\tinsertSemicolon   bool // If we see a newline, then insert an implicit semicolon\n\timplicitSemicolon bool // An implicit semicolon exists\n\n\terrors ErrorList\n\n\trecover struct {\n\t\t// Scratch when trying to seek to the next statement, etc.\n\t\tidx   file.Idx\n\t\tcount int\n\t}\n\n\tmode Mode\n\n\tfile *file.File\n\n\tcomments *ast.Comments\n}\n\ntype Parser interface {\n\tScan() (tkn token.Token, literal string, idx file.Idx)\n}\n\nfunc _newParser(filename, src string, base int, sm *sourcemap.Consumer) *_parser {\n\treturn &_parser{\n\t\tchr:      ' ', // This is set so we can start scanning by skipping whitespace\n\t\tstr:      src,\n\t\tlength:   len(src),\n\t\tbase:     base,\n\t\tfile:     file.NewFile(filename, src, base).WithSourceMap(sm),\n\t\tcomments: ast.NewComments(),\n\t}\n}\n\n// Returns a new Parser.\nfunc NewParser(filename, src string) Parser {\n\treturn _newParser(filename, src, 1, nil)\n}\n\nfunc ReadSource(filename string, src interface{}) ([]byte, error) {\n\tif src != nil {\n\t\tswitch src := src.(type) {\n\t\tcase string:\n\t\t\treturn []byte(src), nil\n\t\tcase []byte:\n\t\t\treturn src, nil\n\t\tcase *bytes.Buffer:\n\t\t\tif src != nil {\n\t\t\t\treturn src.Bytes(), nil\n\t\t\t}\n\t\tcase io.Reader:\n\t\t\tvar bfr bytes.Buffer\n\t\t\tif _, err := io.Copy(&bfr, src); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn bfr.Bytes(), nil\n\t\t}\n\t\treturn nil, errors.New(\"invalid source\")\n\t}\n\treturn ioutil.ReadFile(filename)\n}\n\nfunc ReadSourceMap(filename string, src interface{}) (*sourcemap.Consumer, error) {\n\tif src == nil {\n\t\treturn nil, nil\n\t}\n\n\tswitch src := src.(type) {\n\tcase string:\n\t\treturn sourcemap.Parse(filename, []byte(src))\n\tcase []byte:\n\t\treturn sourcemap.Parse(filename, src)\n\tcase *bytes.Buffer:\n\t\tif src != nil {\n\t\t\treturn sourcemap.Parse(filename, src.Bytes())\n\t\t}\n\tcase io.Reader:\n\t\tvar bfr bytes.Buffer\n\t\tif _, err := io.Copy(&bfr, src); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn sourcemap.Parse(filename, bfr.Bytes())\n\tcase *sourcemap.Consumer:\n\t\treturn src, nil\n\t}\n\n\treturn nil, errors.New(\"invalid sourcemap type\")\n}\n\nfunc ParseFileWithSourceMap(fileSet *file.FileSet, filename string, javascriptSource, sourcemapSource interface{}, mode Mode) (*ast.Program, error) {\n\tsrc, err := ReadSource(filename, javascriptSource)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif sourcemapSource == nil {\n\t\tlines := bytes.Split(src, []byte(\"\\n\"))\n\t\tlastLine := lines[len(lines)-1]\n\t\tif bytes.HasPrefix(lastLine, []byte(\"//# sourceMappingURL=data:application/json\")) {\n\t\t\tbits := bytes.SplitN(lastLine, []byte(\",\"), 2)\n\t\t\tif len(bits) == 2 {\n\t\t\t\tif d, err := base64.StdEncoding.DecodeString(string(bits[1])); err == nil {\n\t\t\t\t\tsourcemapSource = d\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsm, err := ReadSourceMap(filename, sourcemapSource)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbase := 1\n\tif fileSet != nil {\n\t\tbase = fileSet.AddFile(filename, string(src))\n\t}\n\n\tparser := _newParser(filename, string(src), base, sm)\n\tparser.mode = mode\n\tprogram, err := parser.parse()\n\tprogram.Comments = parser.comments.CommentMap\n\n\treturn program, err\n}\n\n// ParseFile parses the source code of a single JavaScript/ECMAScript source file and returns\n// the corresponding ast.Program node.\n//\n// If fileSet == nil, ParseFile parses source without a FileSet.\n// If fileSet != nil, ParseFile first adds filename and src to fileSet.\n//\n// The filename argument is optional and is used for labelling errors, etc.\n//\n// src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST always be in UTF-8.\n//\n//      // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList\n//      program, err := parser.ParseFile(nil, \"\", `if (abc > 1) {}`, 0)\n//\nfunc ParseFile(fileSet *file.FileSet, filename string, src interface{}, mode Mode) (*ast.Program, error) {\n\treturn ParseFileWithSourceMap(fileSet, filename, src, nil, mode)\n}\n\n// ParseFunction parses a given parameter list and body as a function and returns the\n// corresponding ast.FunctionLiteral node.\n//\n// The parameter list, if any, should be a comma-separated list of identifiers.\n//\nfunc ParseFunction(parameterList, body string) (*ast.FunctionLiteral, error) {\n\n\tsrc := \"(function(\" + parameterList + \") {\\n\" + body + \"\\n})\"\n\n\tparser := _newParser(\"\", src, 1, nil)\n\tprogram, err := parser.parse()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn program.Body[0].(*ast.ExpressionStatement).Expression.(*ast.FunctionLiteral), nil\n}\n\n// Scan reads a single token from the source at the current offset, increments the offset and\n// returns the token.Token token, a string literal representing the value of the token (if applicable)\n// and it's current file.Idx index.\nfunc (self *_parser) Scan() (tkn token.Token, literal string, idx file.Idx) {\n\treturn self.scan()\n}\n\nfunc (self *_parser) slice(idx0, idx1 file.Idx) string {\n\tfrom := int(idx0) - self.base\n\tto := int(idx1) - self.base\n\tif from >= 0 && to <= len(self.str) {\n\t\treturn self.str[from:to]\n\t}\n\n\treturn \"\"\n}\n\nfunc (self *_parser) parse() (*ast.Program, error) {\n\tself.next()\n\tprogram := self.parseProgram()\n\tif false {\n\t\tself.errors.Sort()\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(program, self.comments.FetchAll(), ast.TRAILING)\n\t}\n\n\treturn program, self.errors.Err()\n}\n\nfunc (self *_parser) next() {\n\tself.token, self.literal, self.idx = self.scan()\n}\n\nfunc (self *_parser) optionalSemicolon() {\n\tif self.token == token.SEMICOLON {\n\t\tself.next()\n\t\treturn\n\t}\n\n\tif self.implicitSemicolon {\n\t\tself.implicitSemicolon = false\n\t\treturn\n\t}\n\n\tif self.token != token.EOF && self.token != token.RIGHT_BRACE {\n\t\tself.expect(token.SEMICOLON)\n\t}\n}\n\nfunc (self *_parser) semicolon() {\n\tif self.token != token.RIGHT_PARENTHESIS && self.token != token.RIGHT_BRACE {\n\t\tif self.implicitSemicolon {\n\t\t\tself.implicitSemicolon = false\n\t\t\treturn\n\t\t}\n\n\t\tself.expect(token.SEMICOLON)\n\t}\n}\n\nfunc (self *_parser) idxOf(offset int) file.Idx {\n\treturn file.Idx(self.base + offset)\n}\n\nfunc (self *_parser) expect(value token.Token) file.Idx {\n\tidx := self.idx\n\tif self.token != value {\n\t\tself.errorUnexpectedToken(self.token)\n\t}\n\tself.next()\n\treturn idx\n}\n\nfunc lineCount(str string) (int, int) {\n\tline, last := 0, -1\n\tpair := false\n\tfor index, chr := range str {\n\t\tswitch chr {\n\t\tcase '\\r':\n\t\t\tline += 1\n\t\t\tlast = index\n\t\t\tpair = true\n\t\t\tcontinue\n\t\tcase '\\n':\n\t\t\tif !pair {\n\t\t\t\tline += 1\n\t\t\t}\n\t\t\tlast = index\n\t\tcase '\\u2028', '\\u2029':\n\t\t\tline += 1\n\t\t\tlast = index + 2\n\t\t}\n\t\tpair = false\n\t}\n\treturn line, last\n}\n\nfunc (self *_parser) position(idx file.Idx) file.Position {\n\tposition := file.Position{}\n\toffset := int(idx) - self.base\n\tstr := self.str[:offset]\n\tposition.Filename = self.file.Name()\n\tline, last := lineCount(str)\n\tposition.Line = 1 + line\n\tif last >= 0 {\n\t\tposition.Column = offset - last\n\t} else {\n\t\tposition.Column = 1 + len(str)\n\t}\n\n\treturn position\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/regexp.go",
    "content": "package parser\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strconv\"\n)\n\ntype _RegExp_parser struct {\n\tstr    string\n\tlength int\n\n\tchr       rune // The current character\n\tchrOffset int  // The offset of current character\n\toffset    int  // The offset after current character (may be greater than 1)\n\n\terrors  []error\n\tinvalid bool // The input is an invalid JavaScript RegExp\n\n\tgoRegexp *bytes.Buffer\n}\n\n// TransformRegExp transforms a JavaScript pattern into  a Go \"regexp\" pattern.\n//\n// re2 (Go) cannot do backtracking, so the presence of a lookahead (?=) (?!) or\n// backreference (\\1, \\2, ...) will cause an error.\n//\n// re2 (Go) has a different definition for \\s: [\\t\\n\\f\\r ].\n// The JavaScript definition, on the other hand, also includes \\v, Unicode \"Separator, Space\", etc.\n//\n// If the pattern is invalid (not valid even in JavaScript), then this function\n// returns the empty string and an error.\n//\n// If the pattern is valid, but incompatible (contains a lookahead or backreference),\n// then this function returns the transformation (a non-empty string) AND an error.\nfunc TransformRegExp(pattern string) (string, error) {\n\n\tif pattern == \"\" {\n\t\treturn \"\", nil\n\t}\n\n\t// TODO If without \\, if without (?=, (?!, then another shortcut\n\n\tparser := _RegExp_parser{\n\t\tstr:      pattern,\n\t\tlength:   len(pattern),\n\t\tgoRegexp: bytes.NewBuffer(make([]byte, 0, 3*len(pattern)/2)),\n\t}\n\tparser.read() // Pull in the first character\n\tparser.scan()\n\tvar err error\n\tif len(parser.errors) > 0 {\n\t\terr = parser.errors[0]\n\t}\n\tif parser.invalid {\n\t\treturn \"\", err\n\t}\n\n\t// Might not be re2 compatible, but is still a valid JavaScript RegExp\n\treturn parser.goRegexp.String(), err\n}\n\nfunc (self *_RegExp_parser) scan() {\n\tfor self.chr != -1 {\n\t\tswitch self.chr {\n\t\tcase '\\\\':\n\t\t\tself.read()\n\t\t\tself.scanEscape(false)\n\t\tcase '(':\n\t\t\tself.pass()\n\t\t\tself.scanGroup()\n\t\tcase '[':\n\t\t\tself.pass()\n\t\t\tself.scanBracket()\n\t\tcase ')':\n\t\t\tself.error(-1, \"Unmatched ')'\")\n\t\t\tself.invalid = true\n\t\t\tself.pass()\n\t\tdefault:\n\t\t\tself.pass()\n\t\t}\n\t}\n}\n\n// (...)\nfunc (self *_RegExp_parser) scanGroup() {\n\tstr := self.str[self.chrOffset:]\n\tif len(str) > 1 { // A possibility of (?= or (?!\n\t\tif str[0] == '?' {\n\t\t\tif str[1] == '=' || str[1] == '!' {\n\t\t\t\tself.error(-1, \"re2: Invalid (%s) <lookahead>\", self.str[self.chrOffset:self.chrOffset+2])\n\t\t\t}\n\t\t}\n\t}\n\tfor self.chr != -1 && self.chr != ')' {\n\t\tswitch self.chr {\n\t\tcase '\\\\':\n\t\t\tself.read()\n\t\t\tself.scanEscape(false)\n\t\tcase '(':\n\t\t\tself.pass()\n\t\t\tself.scanGroup()\n\t\tcase '[':\n\t\t\tself.pass()\n\t\t\tself.scanBracket()\n\t\tdefault:\n\t\t\tself.pass()\n\t\t\tcontinue\n\t\t}\n\t}\n\tif self.chr != ')' {\n\t\tself.error(-1, \"Unterminated group\")\n\t\tself.invalid = true\n\t\treturn\n\t}\n\tself.pass()\n}\n\n// [...]\nfunc (self *_RegExp_parser) scanBracket() {\n\tfor self.chr != -1 {\n\t\tif self.chr == ']' {\n\t\t\tbreak\n\t\t} else if self.chr == '\\\\' {\n\t\t\tself.read()\n\t\t\tself.scanEscape(true)\n\t\t\tcontinue\n\t\t}\n\t\tself.pass()\n\t}\n\tif self.chr != ']' {\n\t\tself.error(-1, \"Unterminated character class\")\n\t\tself.invalid = true\n\t\treturn\n\t}\n\tself.pass()\n}\n\n// \\...\nfunc (self *_RegExp_parser) scanEscape(inClass bool) {\n\toffset := self.chrOffset\n\n\tvar length, base uint32\n\tswitch self.chr {\n\n\tcase '0', '1', '2', '3', '4', '5', '6', '7':\n\t\tvar value int64\n\t\tsize := 0\n\t\tfor {\n\t\t\tdigit := int64(digitValue(self.chr))\n\t\t\tif digit >= 8 {\n\t\t\t\t// Not a valid digit\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvalue = value*8 + digit\n\t\t\tself.read()\n\t\t\tsize += 1\n\t\t}\n\t\tif size == 1 { // The number of characters read\n\t\t\t_, err := self.goRegexp.Write([]byte{'\\\\', byte(value) + '0'})\n\t\t\tif err != nil {\n\t\t\t\tself.errors = append(self.errors, err)\n\t\t\t}\n\t\t\tif value != 0 {\n\t\t\t\t// An invalid backreference\n\t\t\t\tself.error(-1, \"re2: Invalid \\\\%d <backreference>\", value)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\ttmp := []byte{'\\\\', 'x', '0', 0}\n\t\tif value >= 16 {\n\t\t\ttmp = tmp[0:2]\n\t\t} else {\n\t\t\ttmp = tmp[0:3]\n\t\t}\n\t\ttmp = strconv.AppendInt(tmp, value, 16)\n\t\t_, err := self.goRegexp.Write(tmp)\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t\treturn\n\n\tcase '8', '9':\n\t\tsize := 0\n\t\tfor {\n\t\t\tdigit := digitValue(self.chr)\n\t\t\tif digit >= 10 {\n\t\t\t\t// Not a valid digit\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tself.read()\n\t\t\tsize += 1\n\t\t}\n\t\terr := self.goRegexp.WriteByte('\\\\')\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t\t_, err = self.goRegexp.WriteString(self.str[offset:self.chrOffset])\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t\tself.error(-1, \"re2: Invalid \\\\%s <backreference>\", self.str[offset:self.chrOffset])\n\t\treturn\n\n\tcase 'x':\n\t\tself.read()\n\t\tlength, base = 2, 16\n\n\tcase 'u':\n\t\tself.read()\n\t\tlength, base = 4, 16\n\n\tcase 'b':\n\t\tif inClass {\n\t\t\t_, err := self.goRegexp.Write([]byte{'\\\\', 'x', '0', '8'})\n\t\t\tif err != nil {\n\t\t\t\tself.errors = append(self.errors, err)\n\t\t\t}\n\t\t\tself.read()\n\t\t\treturn\n\t\t}\n\t\tfallthrough\n\n\tcase 'B':\n\t\tfallthrough\n\n\tcase 'd', 'D', 's', 'S', 'w', 'W':\n\t\t// This is slightly broken, because ECMAScript\n\t\t// includes \\v in \\s, \\S, while re2 does not\n\t\tfallthrough\n\n\tcase '\\\\':\n\t\tfallthrough\n\n\tcase 'f', 'n', 'r', 't', 'v':\n\t\terr := self.goRegexp.WriteByte('\\\\')\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t\tself.pass()\n\t\treturn\n\n\tcase 'c':\n\t\tself.read()\n\t\tvar value int64\n\t\tif 'a' <= self.chr && self.chr <= 'z' {\n\t\t\tvalue = int64(self.chr) - 'a' + 1\n\t\t} else if 'A' <= self.chr && self.chr <= 'Z' {\n\t\t\tvalue = int64(self.chr) - 'A' + 1\n\t\t} else {\n\t\t\terr := self.goRegexp.WriteByte('c')\n\t\t\tif err != nil {\n\t\t\t\tself.errors = append(self.errors, err)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\ttmp := []byte{'\\\\', 'x', '0', 0}\n\t\tif value >= 16 {\n\t\t\ttmp = tmp[0:2]\n\t\t} else {\n\t\t\ttmp = tmp[0:3]\n\t\t}\n\t\ttmp = strconv.AppendInt(tmp, value, 16)\n\t\t_, err := self.goRegexp.Write(tmp)\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t\tself.read()\n\t\treturn\n\n\tdefault:\n\t\t// $ is an identifier character, so we have to have\n\t\t// a special case for it here\n\t\tif self.chr == '$' || !isIdentifierPart(self.chr) {\n\t\t\t// A non-identifier character needs escaping\n\t\t\terr := self.goRegexp.WriteByte('\\\\')\n\t\t\tif err != nil {\n\t\t\t\tself.errors = append(self.errors, err)\n\t\t\t}\n\t\t} else {\n\t\t\t// Unescape the character for re2\n\t\t}\n\t\tself.pass()\n\t\treturn\n\t}\n\n\t// Otherwise, we're a \\u.... or \\x...\n\tvalueOffset := self.chrOffset\n\n\tvar value uint32\n\t{\n\t\tlength := length\n\t\tfor ; length > 0; length-- {\n\t\t\tdigit := uint32(digitValue(self.chr))\n\t\t\tif digit >= base {\n\t\t\t\t// Not a valid digit\n\t\t\t\tgoto skip\n\t\t\t}\n\t\t\tvalue = value*base + digit\n\t\t\tself.read()\n\t\t}\n\t}\n\n\tif length == 4 {\n\t\t_, err := self.goRegexp.Write([]byte{\n\t\t\t'\\\\',\n\t\t\t'x',\n\t\t\t'{',\n\t\t\tself.str[valueOffset+0],\n\t\t\tself.str[valueOffset+1],\n\t\t\tself.str[valueOffset+2],\n\t\t\tself.str[valueOffset+3],\n\t\t\t'}',\n\t\t})\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t} else if length == 2 {\n\t\t_, err := self.goRegexp.Write([]byte{\n\t\t\t'\\\\',\n\t\t\t'x',\n\t\t\tself.str[valueOffset+0],\n\t\t\tself.str[valueOffset+1],\n\t\t})\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t} else {\n\t\t// Should never, ever get here...\n\t\tself.error(-1, \"re2: Illegal branch in scanEscape\")\n\t\tgoto skip\n\t}\n\n\treturn\n\nskip:\n\t_, err := self.goRegexp.WriteString(self.str[offset:self.chrOffset])\n\tif err != nil {\n\t\tself.errors = append(self.errors, err)\n\t}\n}\n\nfunc (self *_RegExp_parser) pass() {\n\tif self.chr != -1 {\n\t\t_, err := self.goRegexp.WriteRune(self.chr)\n\t\tif err != nil {\n\t\t\tself.errors = append(self.errors, err)\n\t\t}\n\t}\n\tself.read()\n}\n\n// TODO Better error reporting, use the offset, etc.\nfunc (self *_RegExp_parser) error(offset int, msg string, msgValues ...interface{}) error {\n\terr := fmt.Errorf(msg, msgValues...)\n\tself.errors = append(self.errors, err)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/scope.go",
    "content": "package parser\n\nimport (\n\t\"github.com/robertkrimen/otto/ast\"\n)\n\ntype _scope struct {\n\touter           *_scope\n\tallowIn         bool\n\tinIteration     bool\n\tinSwitch        bool\n\tinFunction      bool\n\tdeclarationList []ast.Declaration\n\n\tlabels []string\n}\n\nfunc (self *_parser) openScope() {\n\tself.scope = &_scope{\n\t\touter:   self.scope,\n\t\tallowIn: true,\n\t}\n}\n\nfunc (self *_parser) closeScope() {\n\tself.scope = self.scope.outer\n}\n\nfunc (self *_scope) declare(declaration ast.Declaration) {\n\tself.declarationList = append(self.declarationList, declaration)\n}\n\nfunc (self *_scope) hasLabel(name string) bool {\n\tfor _, label := range self.labels {\n\t\tif label == name {\n\t\t\treturn true\n\t\t}\n\t}\n\tif self.outer != nil && !self.inFunction {\n\t\t// Crossing a function boundary to look for a label is verboten\n\t\treturn self.outer.hasLabel(name)\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/parser/statement.go",
    "content": "package parser\n\nimport (\n\t\"github.com/robertkrimen/otto/ast\"\n\t\"github.com/robertkrimen/otto/token\"\n)\n\nfunc (self *_parser) parseBlockStatement() *ast.BlockStatement {\n\tnode := &ast.BlockStatement{}\n\n\t// Find comments before the leading brace\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, self.comments.FetchAll(), ast.LEADING)\n\t\tself.comments.Unset()\n\t}\n\n\tnode.LeftBrace = self.expect(token.LEFT_BRACE)\n\tnode.List = self.parseStatementList()\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t\tself.comments.CommentMap.AddComments(node, self.comments.FetchAll(), ast.FINAL)\n\t\tself.comments.AfterBlock()\n\t}\n\n\tnode.RightBrace = self.expect(token.RIGHT_BRACE)\n\n\t// Find comments after the trailing brace\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.ResetLineBreak()\n\t\tself.comments.CommentMap.AddComments(node, self.comments.Fetch(), ast.TRAILING)\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseEmptyStatement() ast.Statement {\n\tidx := self.expect(token.SEMICOLON)\n\treturn &ast.EmptyStatement{Semicolon: idx}\n}\n\nfunc (self *_parser) parseStatementList() (list []ast.Statement) {\n\tfor self.token != token.RIGHT_BRACE && self.token != token.EOF {\n\t\tstatement := self.parseStatement()\n\t\tlist = append(list, statement)\n\t}\n\n\treturn\n}\n\nfunc (self *_parser) parseStatement() ast.Statement {\n\n\tif self.token == token.EOF {\n\t\tself.errorUnexpectedToken(self.token)\n\t\treturn &ast.BadStatement{From: self.idx, To: self.idx + 1}\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.ResetLineBreak()\n\t}\n\n\tswitch self.token {\n\tcase token.SEMICOLON:\n\t\treturn self.parseEmptyStatement()\n\tcase token.LEFT_BRACE:\n\t\treturn self.parseBlockStatement()\n\tcase token.IF:\n\t\treturn self.parseIfStatement()\n\tcase token.DO:\n\t\tstatement := self.parseDoWhileStatement()\n\t\tself.comments.PostProcessNode(statement)\n\t\treturn statement\n\tcase token.WHILE:\n\t\treturn self.parseWhileStatement()\n\tcase token.FOR:\n\t\treturn self.parseForOrForInStatement()\n\tcase token.BREAK:\n\t\treturn self.parseBreakStatement()\n\tcase token.CONTINUE:\n\t\treturn self.parseContinueStatement()\n\tcase token.DEBUGGER:\n\t\treturn self.parseDebuggerStatement()\n\tcase token.WITH:\n\t\treturn self.parseWithStatement()\n\tcase token.VAR:\n\t\treturn self.parseVariableStatement()\n\tcase token.FUNCTION:\n\t\treturn self.parseFunctionStatement()\n\tcase token.SWITCH:\n\t\treturn self.parseSwitchStatement()\n\tcase token.RETURN:\n\t\treturn self.parseReturnStatement()\n\tcase token.THROW:\n\t\treturn self.parseThrowStatement()\n\tcase token.TRY:\n\t\treturn self.parseTryStatement()\n\t}\n\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\n\texpression := self.parseExpression()\n\n\tif identifier, isIdentifier := expression.(*ast.Identifier); isIdentifier && self.token == token.COLON {\n\t\t// LabelledStatement\n\t\tcolon := self.idx\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next() // :\n\n\t\tlabel := identifier.Name\n\t\tfor _, value := range self.scope.labels {\n\t\t\tif label == value {\n\t\t\t\tself.error(identifier.Idx0(), \"Label '%s' already exists\", label)\n\t\t\t}\n\t\t}\n\t\tvar labelComments []*ast.Comment\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tlabelComments = self.comments.FetchAll()\n\t\t}\n\t\tself.scope.labels = append(self.scope.labels, label) // Push the label\n\t\tstatement := self.parseStatement()\n\t\tself.scope.labels = self.scope.labels[:len(self.scope.labels)-1] // Pop the label\n\t\texp := &ast.LabelledStatement{\n\t\t\tLabel:     identifier,\n\t\t\tColon:     colon,\n\t\t\tStatement: statement,\n\t\t}\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.CommentMap.AddComments(exp, labelComments, ast.LEADING)\n\t\t}\n\n\t\treturn exp\n\t}\n\n\tself.optionalSemicolon()\n\n\tstatement := &ast.ExpressionStatement{\n\t\tExpression: expression,\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(statement, comments, ast.LEADING)\n\t}\n\treturn statement\n}\n\nfunc (self *_parser) parseTryStatement() ast.Statement {\n\tvar tryComments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\ttryComments = self.comments.FetchAll()\n\t}\n\tnode := &ast.TryStatement{\n\t\tTry:  self.expect(token.TRY),\n\t\tBody: self.parseBlockStatement(),\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, tryComments, ast.LEADING)\n\t\tself.comments.CommentMap.AddComments(node.Body, self.comments.FetchAll(), ast.TRAILING)\n\t}\n\n\tif self.token == token.CATCH {\n\t\tcatch := self.idx\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\t\tself.expect(token.LEFT_PARENTHESIS)\n\t\tif self.token != token.IDENTIFIER {\n\t\t\tself.expect(token.IDENTIFIER)\n\t\t\tself.nextStatement()\n\t\t\treturn &ast.BadStatement{From: catch, To: self.idx}\n\t\t} else {\n\t\t\tidentifier := self.parseIdentifier()\n\t\t\tself.expect(token.RIGHT_PARENTHESIS)\n\t\t\tnode.Catch = &ast.CatchStatement{\n\t\t\t\tCatch:     catch,\n\t\t\t\tParameter: identifier,\n\t\t\t\tBody:      self.parseBlockStatement(),\n\t\t\t}\n\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.CommentMap.AddComments(node.Catch.Body, self.comments.FetchAll(), ast.TRAILING)\n\t\t\t}\n\t\t}\n\t}\n\n\tif self.token == token.FINALLY {\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.Unset()\n\t\t}\n\t\tself.next()\n\t\tif self.mode&StoreComments != 0 {\n\t\t\ttryComments = self.comments.FetchAll()\n\t\t}\n\n\t\tnode.Finally = self.parseBlockStatement()\n\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.CommentMap.AddComments(node.Finally, tryComments, ast.LEADING)\n\t\t}\n\t}\n\n\tif node.Catch == nil && node.Finally == nil {\n\t\tself.error(node.Try, \"Missing catch or finally after try\")\n\t\treturn &ast.BadStatement{From: node.Try, To: node.Body.Idx1()}\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseFunctionParameterList() *ast.ParameterList {\n\topening := self.expect(token.LEFT_PARENTHESIS)\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t}\n\tvar list []*ast.Identifier\n\tfor self.token != token.RIGHT_PARENTHESIS && self.token != token.EOF {\n\t\tif self.token != token.IDENTIFIER {\n\t\t\tself.expect(token.IDENTIFIER)\n\t\t} else {\n\t\t\tidentifier := self.parseIdentifier()\n\t\t\tlist = append(list, identifier)\n\t\t}\n\t\tif self.token != token.RIGHT_PARENTHESIS {\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.Unset()\n\t\t\t}\n\t\t\tself.expect(token.COMMA)\n\t\t}\n\t}\n\tclosing := self.expect(token.RIGHT_PARENTHESIS)\n\n\treturn &ast.ParameterList{\n\t\tOpening: opening,\n\t\tList:    list,\n\t\tClosing: closing,\n\t}\n}\n\nfunc (self *_parser) parseParameterList() (list []string) {\n\tfor self.token != token.EOF {\n\t\tif self.token != token.IDENTIFIER {\n\t\t\tself.expect(token.IDENTIFIER)\n\t\t}\n\t\tlist = append(list, self.literal)\n\t\tself.next()\n\t\tif self.token != token.EOF {\n\t\t\tself.expect(token.COMMA)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *_parser) parseFunctionStatement() *ast.FunctionStatement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tfunction := &ast.FunctionStatement{\n\t\tFunction: self.parseFunction(true),\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(function, comments, ast.LEADING)\n\t}\n\n\treturn function\n}\n\nfunc (self *_parser) parseFunction(declaration bool) *ast.FunctionLiteral {\n\n\tnode := &ast.FunctionLiteral{\n\t\tFunction: self.expect(token.FUNCTION),\n\t}\n\n\tvar name *ast.Identifier\n\tif self.token == token.IDENTIFIER {\n\t\tname = self.parseIdentifier()\n\t\tif declaration {\n\t\t\tself.scope.declare(&ast.FunctionDeclaration{\n\t\t\t\tFunction: node,\n\t\t\t})\n\t\t}\n\t} else if declaration {\n\t\t// Use expect error handling\n\t\tself.expect(token.IDENTIFIER)\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t}\n\tnode.Name = name\n\tnode.ParameterList = self.parseFunctionParameterList()\n\tself.parseFunctionBlock(node)\n\tnode.Source = self.slice(node.Idx0(), node.Idx1())\n\n\treturn node\n}\n\nfunc (self *_parser) parseFunctionBlock(node *ast.FunctionLiteral) {\n\t{\n\t\tself.openScope()\n\t\tinFunction := self.scope.inFunction\n\t\tself.scope.inFunction = true\n\t\tdefer func() {\n\t\t\tself.scope.inFunction = inFunction\n\t\t\tself.closeScope()\n\t\t}()\n\t\tnode.Body = self.parseBlockStatement()\n\t\tnode.DeclarationList = self.scope.declarationList\n\t}\n}\n\nfunc (self *_parser) parseDebuggerStatement() ast.Statement {\n\tidx := self.expect(token.DEBUGGER)\n\n\tnode := &ast.DebuggerStatement{\n\t\tDebugger: idx,\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, self.comments.FetchAll(), ast.TRAILING)\n\t}\n\n\tself.semicolon()\n\treturn node\n}\n\nfunc (self *_parser) parseReturnStatement() ast.Statement {\n\tidx := self.expect(token.RETURN)\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\n\tif !self.scope.inFunction {\n\t\tself.error(idx, \"Illegal return statement\")\n\t\tself.nextStatement()\n\t\treturn &ast.BadStatement{From: idx, To: self.idx}\n\t}\n\n\tnode := &ast.ReturnStatement{\n\t\tReturn: idx,\n\t}\n\n\tif !self.implicitSemicolon && self.token != token.SEMICOLON && self.token != token.RIGHT_BRACE && self.token != token.EOF {\n\t\tnode.Argument = self.parseExpression()\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t}\n\n\tself.semicolon()\n\n\treturn node\n}\n\nfunc (self *_parser) parseThrowStatement() ast.Statement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tidx := self.expect(token.THROW)\n\n\tif self.implicitSemicolon {\n\t\tif self.chr == -1 { // Hackish\n\t\t\tself.error(idx, \"Unexpected end of input\")\n\t\t} else {\n\t\t\tself.error(idx, \"Illegal newline after throw\")\n\t\t}\n\t\tself.nextStatement()\n\t\treturn &ast.BadStatement{From: idx, To: self.idx}\n\t}\n\n\tnode := &ast.ThrowStatement{\n\t\tArgument: self.parseExpression(),\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t}\n\n\tself.semicolon()\n\n\treturn node\n}\n\nfunc (self *_parser) parseSwitchStatement() ast.Statement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tself.expect(token.SWITCH)\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = append(comments, self.comments.FetchAll()...)\n\t}\n\tself.expect(token.LEFT_PARENTHESIS)\n\tnode := &ast.SwitchStatement{\n\t\tDiscriminant: self.parseExpression(),\n\t\tDefault:      -1,\n\t}\n\tself.expect(token.RIGHT_PARENTHESIS)\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = append(comments, self.comments.FetchAll()...)\n\t}\n\n\tself.expect(token.LEFT_BRACE)\n\n\tinSwitch := self.scope.inSwitch\n\tself.scope.inSwitch = true\n\tdefer func() {\n\t\tself.scope.inSwitch = inSwitch\n\t}()\n\n\tfor index := 0; self.token != token.EOF; index++ {\n\t\tif self.token == token.RIGHT_BRACE {\n\t\t\tself.next()\n\t\t\tbreak\n\t\t}\n\n\t\tclause := self.parseCaseStatement()\n\t\tif clause.Test == nil {\n\t\t\tif node.Default != -1 {\n\t\t\t\tself.error(clause.Case, \"Already saw a default in switch\")\n\t\t\t}\n\t\t\tnode.Default = index\n\t\t}\n\t\tnode.Body = append(node.Body, clause)\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseWithStatement() ast.Statement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tself.expect(token.WITH)\n\tvar withComments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\twithComments = self.comments.FetchAll()\n\t}\n\n\tself.expect(token.LEFT_PARENTHESIS)\n\n\tnode := &ast.WithStatement{\n\t\tObject: self.parseExpression(),\n\t}\n\tself.expect(token.RIGHT_PARENTHESIS)\n\n\tif self.mode&StoreComments != 0 {\n\t\t//comments = append(comments, self.comments.FetchAll()...)\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t\tself.comments.CommentMap.AddComments(node, withComments, ast.WITH)\n\t}\n\n\tnode.Body = self.parseStatement()\n\n\treturn node\n}\n\nfunc (self *_parser) parseCaseStatement() *ast.CaseStatement {\n\tnode := &ast.CaseStatement{\n\t\tCase: self.idx,\n\t}\n\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t\tself.comments.Unset()\n\t}\n\n\tif self.token == token.DEFAULT {\n\t\tself.next()\n\t} else {\n\t\tself.expect(token.CASE)\n\t\tnode.Test = self.parseExpression()\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t}\n\tself.expect(token.COLON)\n\n\tfor {\n\t\tif self.token == token.EOF ||\n\t\t\tself.token == token.RIGHT_BRACE ||\n\t\t\tself.token == token.CASE ||\n\t\t\tself.token == token.DEFAULT {\n\t\t\tbreak\n\t\t}\n\t\tconsequent := self.parseStatement()\n\t\tnode.Consequent = append(node.Consequent, consequent)\n\t}\n\n\t// Link the comments to the case statement\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseIterationStatement() ast.Statement {\n\tinIteration := self.scope.inIteration\n\tself.scope.inIteration = true\n\tdefer func() {\n\t\tself.scope.inIteration = inIteration\n\t}()\n\treturn self.parseStatement()\n}\n\nfunc (self *_parser) parseForIn(into ast.Expression) *ast.ForInStatement {\n\n\t// Already have consumed \"<into> in\"\n\n\tsource := self.parseExpression()\n\tself.expect(token.RIGHT_PARENTHESIS)\n\tbody := self.parseIterationStatement()\n\n\tforin := &ast.ForInStatement{\n\t\tInto:   into,\n\t\tSource: source,\n\t\tBody:   body,\n\t}\n\n\treturn forin\n}\n\nfunc (self *_parser) parseFor(initializer ast.Expression) *ast.ForStatement {\n\n\t// Already have consumed \"<initializer> ;\"\n\n\tvar test, update ast.Expression\n\n\tif self.token != token.SEMICOLON {\n\t\ttest = self.parseExpression()\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t}\n\tself.expect(token.SEMICOLON)\n\n\tif self.token != token.RIGHT_PARENTHESIS {\n\t\tupdate = self.parseExpression()\n\t}\n\tself.expect(token.RIGHT_PARENTHESIS)\n\tbody := self.parseIterationStatement()\n\n\tforstatement := &ast.ForStatement{\n\t\tInitializer: initializer,\n\t\tTest:        test,\n\t\tUpdate:      update,\n\t\tBody:        body,\n\t}\n\n\treturn forstatement\n}\n\nfunc (self *_parser) parseForOrForInStatement() ast.Statement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tidx := self.expect(token.FOR)\n\tvar forComments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tforComments = self.comments.FetchAll()\n\t}\n\tself.expect(token.LEFT_PARENTHESIS)\n\n\tvar left []ast.Expression\n\n\tforIn := false\n\tif self.token != token.SEMICOLON {\n\n\t\tallowIn := self.scope.allowIn\n\t\tself.scope.allowIn = false\n\t\tif self.token == token.VAR {\n\t\t\tvar_ := self.idx\n\t\t\tvar varComments []*ast.Comment\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tvarComments = self.comments.FetchAll()\n\t\t\t\tself.comments.Unset()\n\t\t\t}\n\t\t\tself.next()\n\t\t\tlist := self.parseVariableDeclarationList(var_)\n\t\t\tif len(list) == 1 && self.token == token.IN {\n\t\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\t\tself.comments.Unset()\n\t\t\t\t}\n\t\t\t\tself.next() // in\n\t\t\t\tforIn = true\n\t\t\t\tleft = []ast.Expression{list[0]} // There is only one declaration\n\t\t\t} else {\n\t\t\t\tleft = list\n\t\t\t}\n\t\t\tif self.mode&StoreComments != 0 {\n\t\t\t\tself.comments.CommentMap.AddComments(left[0], varComments, ast.LEADING)\n\t\t\t}\n\t\t} else {\n\t\t\tleft = append(left, self.parseExpression())\n\t\t\tif self.token == token.IN {\n\t\t\t\tself.next()\n\t\t\t\tforIn = true\n\t\t\t}\n\t\t}\n\t\tself.scope.allowIn = allowIn\n\t}\n\n\tif forIn {\n\t\tswitch left[0].(type) {\n\t\tcase *ast.Identifier, *ast.DotExpression, *ast.BracketExpression, *ast.VariableExpression:\n\t\t\t// These are all acceptable\n\t\tdefault:\n\t\t\tself.error(idx, \"Invalid left-hand side in for-in\")\n\t\t\tself.nextStatement()\n\t\t\treturn &ast.BadStatement{From: idx, To: self.idx}\n\t\t}\n\n\t\tforin := self.parseForIn(left[0])\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.CommentMap.AddComments(forin, comments, ast.LEADING)\n\t\t\tself.comments.CommentMap.AddComments(forin, forComments, ast.FOR)\n\t\t}\n\t\treturn forin\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.Unset()\n\t}\n\tself.expect(token.SEMICOLON)\n\tinitializer := &ast.SequenceExpression{Sequence: left}\n\tforstatement := self.parseFor(initializer)\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(forstatement, comments, ast.LEADING)\n\t\tself.comments.CommentMap.AddComments(forstatement, forComments, ast.FOR)\n\t}\n\treturn forstatement\n}\n\nfunc (self *_parser) parseVariableStatement() *ast.VariableStatement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tidx := self.expect(token.VAR)\n\n\tlist := self.parseVariableDeclarationList(idx)\n\n\tstatement := &ast.VariableStatement{\n\t\tVar:  idx,\n\t\tList: list,\n\t}\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(statement, comments, ast.LEADING)\n\t\tself.comments.Unset()\n\t}\n\tself.semicolon()\n\n\treturn statement\n}\n\nfunc (self *_parser) parseDoWhileStatement() ast.Statement {\n\tinIteration := self.scope.inIteration\n\tself.scope.inIteration = true\n\tdefer func() {\n\t\tself.scope.inIteration = inIteration\n\t}()\n\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tself.expect(token.DO)\n\tvar doComments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tdoComments = self.comments.FetchAll()\n\t}\n\n\tnode := &ast.DoWhileStatement{}\n\tif self.token == token.LEFT_BRACE {\n\t\tnode.Body = self.parseBlockStatement()\n\t} else {\n\t\tnode.Body = self.parseStatement()\n\t}\n\n\tself.expect(token.WHILE)\n\tvar whileComments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\twhileComments = self.comments.FetchAll()\n\t}\n\tself.expect(token.LEFT_PARENTHESIS)\n\tnode.Test = self.parseExpression()\n\tself.expect(token.RIGHT_PARENTHESIS)\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t\tself.comments.CommentMap.AddComments(node, doComments, ast.DO)\n\t\tself.comments.CommentMap.AddComments(node, whileComments, ast.WHILE)\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseWhileStatement() ast.Statement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tself.expect(token.WHILE)\n\n\tvar whileComments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\twhileComments = self.comments.FetchAll()\n\t}\n\n\tself.expect(token.LEFT_PARENTHESIS)\n\tnode := &ast.WhileStatement{\n\t\tTest: self.parseExpression(),\n\t}\n\tself.expect(token.RIGHT_PARENTHESIS)\n\tnode.Body = self.parseIterationStatement()\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t\tself.comments.CommentMap.AddComments(node, whileComments, ast.WHILE)\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseIfStatement() ast.Statement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tself.expect(token.IF)\n\tvar ifComments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tifComments = self.comments.FetchAll()\n\t}\n\n\tself.expect(token.LEFT_PARENTHESIS)\n\tnode := &ast.IfStatement{\n\t\tTest: self.parseExpression(),\n\t}\n\tself.expect(token.RIGHT_PARENTHESIS)\n\tif self.token == token.LEFT_BRACE {\n\t\tnode.Consequent = self.parseBlockStatement()\n\t} else {\n\t\tnode.Consequent = self.parseStatement()\n\t}\n\n\tif self.token == token.ELSE {\n\t\tself.next()\n\t\tnode.Alternate = self.parseStatement()\n\t}\n\n\tif self.mode&StoreComments != 0 {\n\t\tself.comments.CommentMap.AddComments(node, comments, ast.LEADING)\n\t\tself.comments.CommentMap.AddComments(node, ifComments, ast.IF)\n\t}\n\n\treturn node\n}\n\nfunc (self *_parser) parseSourceElement() ast.Statement {\n\tstatement := self.parseStatement()\n\t//self.comments.Unset()\n\treturn statement\n}\n\nfunc (self *_parser) parseSourceElements() []ast.Statement {\n\tbody := []ast.Statement(nil)\n\n\tfor {\n\t\tif self.token != token.STRING {\n\t\t\tbreak\n\t\t}\n\t\tbody = append(body, self.parseSourceElement())\n\t}\n\n\tfor self.token != token.EOF {\n\t\tbody = append(body, self.parseSourceElement())\n\t}\n\n\treturn body\n}\n\nfunc (self *_parser) parseProgram() *ast.Program {\n\tself.openScope()\n\tdefer self.closeScope()\n\treturn &ast.Program{\n\t\tBody:            self.parseSourceElements(),\n\t\tDeclarationList: self.scope.declarationList,\n\t\tFile:            self.file,\n\t}\n}\n\nfunc (self *_parser) parseBreakStatement() ast.Statement {\n\tvar comments []*ast.Comment\n\tif self.mode&StoreComments != 0 {\n\t\tcomments = self.comments.FetchAll()\n\t}\n\tidx := self.expect(token.BREAK)\n\tsemicolon := self.implicitSemicolon\n\tif self.token == token.SEMICOLON {\n\t\tsemicolon = true\n\t\tself.next()\n\t}\n\n\tif semicolon || self.token == token.RIGHT_BRACE {\n\t\tself.implicitSemicolon = false\n\t\tif !self.scope.inIteration && !self.scope.inSwitch {\n\t\t\tgoto illegal\n\t\t}\n\t\tbreakStatement := &ast.BranchStatement{\n\t\t\tIdx:   idx,\n\t\t\tToken: token.BREAK,\n\t\t}\n\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.CommentMap.AddComments(breakStatement, comments, ast.LEADING)\n\t\t\tself.comments.CommentMap.AddComments(breakStatement, self.comments.FetchAll(), ast.TRAILING)\n\t\t}\n\n\t\treturn breakStatement\n\t}\n\n\tif self.token == token.IDENTIFIER {\n\t\tidentifier := self.parseIdentifier()\n\t\tif !self.scope.hasLabel(identifier.Name) {\n\t\t\tself.error(idx, \"Undefined label '%s'\", identifier.Name)\n\t\t\treturn &ast.BadStatement{From: idx, To: identifier.Idx1()}\n\t\t}\n\t\tself.semicolon()\n\t\tbreakStatement := &ast.BranchStatement{\n\t\t\tIdx:   idx,\n\t\t\tToken: token.BREAK,\n\t\t\tLabel: identifier,\n\t\t}\n\t\tif self.mode&StoreComments != 0 {\n\t\t\tself.comments.CommentMap.AddComments(breakStatement, comments, ast.LEADING)\n\t\t}\n\n\t\treturn breakStatement\n\t}\n\n\tself.expect(token.IDENTIFIER)\n\nillegal:\n\tself.error(idx, \"Illegal break statement\")\n\tself.nextStatement()\n\treturn &ast.BadStatement{From: idx, To: self.idx}\n}\n\nfunc (self *_parser) parseContinueStatement() ast.Statement {\n\tidx := self.expect(token.CONTINUE)\n\tsemicolon := self.implicitSemicolon\n\tif self.token == token.SEMICOLON {\n\t\tsemicolon = true\n\t\tself.next()\n\t}\n\n\tif semicolon || self.token == token.RIGHT_BRACE {\n\t\tself.implicitSemicolon = false\n\t\tif !self.scope.inIteration {\n\t\t\tgoto illegal\n\t\t}\n\t\treturn &ast.BranchStatement{\n\t\t\tIdx:   idx,\n\t\t\tToken: token.CONTINUE,\n\t\t}\n\t}\n\n\tif self.token == token.IDENTIFIER {\n\t\tidentifier := self.parseIdentifier()\n\t\tif !self.scope.hasLabel(identifier.Name) {\n\t\t\tself.error(idx, \"Undefined label '%s'\", identifier.Name)\n\t\t\treturn &ast.BadStatement{From: idx, To: identifier.Idx1()}\n\t\t}\n\t\tif !self.scope.inIteration {\n\t\t\tgoto illegal\n\t\t}\n\t\tself.semicolon()\n\t\treturn &ast.BranchStatement{\n\t\t\tIdx:   idx,\n\t\t\tToken: token.CONTINUE,\n\t\t\tLabel: identifier,\n\t\t}\n\t}\n\n\tself.expect(token.IDENTIFIER)\n\nillegal:\n\tself.error(idx, \"Illegal continue statement\")\n\tself.nextStatement()\n\treturn &ast.BadStatement{From: idx, To: self.idx}\n}\n\n// Find the next statement after an error (recover)\nfunc (self *_parser) nextStatement() {\n\tfor {\n\t\tswitch self.token {\n\t\tcase token.BREAK, token.CONTINUE,\n\t\t\ttoken.FOR, token.IF, token.RETURN, token.SWITCH,\n\t\t\ttoken.VAR, token.DO, token.TRY, token.WITH,\n\t\t\ttoken.WHILE, token.THROW, token.CATCH, token.FINALLY:\n\t\t\t// Return only if parser made some progress since last\n\t\t\t// sync or if it has not reached 10 next calls without\n\t\t\t// progress. Otherwise consume at least one token to\n\t\t\t// avoid an endless parser loop\n\t\t\tif self.idx == self.recover.idx && self.recover.count < 10 {\n\t\t\t\tself.recover.count++\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif self.idx > self.recover.idx {\n\t\t\t\tself.recover.idx = self.idx\n\t\t\t\tself.recover.count = 0\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Reaching here indicates a parser bug, likely an\n\t\t\t// incorrect token list in this function, but it only\n\t\t\t// leads to skipping of possibly correct code if a\n\t\t\t// previous error is present, and thus is preferred\n\t\t\t// over a non-terminating parse.\n\t\tcase token.EOF:\n\t\t\treturn\n\t\t}\n\t\tself.next()\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/property.go",
    "content": "package otto\n\n// property\n\ntype _propertyMode int\n\nconst (\n\tmodeWriteMask     _propertyMode = 0700\n\tmodeEnumerateMask               = 0070\n\tmodeConfigureMask               = 0007\n\tmodeOnMask                      = 0111\n\tmodeOffMask                     = 0000\n\tmodeSetMask                     = 0222 // If value is 2, then mode is neither \"On\" nor \"Off\"\n)\n\ntype _propertyGetSet [2]*_object\n\nvar _nilGetSetObject _object = _object{}\n\ntype _property struct {\n\tvalue interface{}\n\tmode  _propertyMode\n}\n\nfunc (self _property) writable() bool {\n\treturn self.mode&modeWriteMask == modeWriteMask&modeOnMask\n}\n\nfunc (self *_property) writeOn() {\n\tself.mode = (self.mode & ^modeWriteMask) | (modeWriteMask & modeOnMask)\n}\n\nfunc (self *_property) writeOff() {\n\tself.mode &= ^modeWriteMask\n}\n\nfunc (self *_property) writeClear() {\n\tself.mode = (self.mode & ^modeWriteMask) | (modeWriteMask & modeSetMask)\n}\n\nfunc (self _property) writeSet() bool {\n\treturn 0 == self.mode&modeWriteMask&modeSetMask\n}\n\nfunc (self _property) enumerable() bool {\n\treturn self.mode&modeEnumerateMask == modeEnumerateMask&modeOnMask\n}\n\nfunc (self *_property) enumerateOn() {\n\tself.mode = (self.mode & ^modeEnumerateMask) | (modeEnumerateMask & modeOnMask)\n}\n\nfunc (self *_property) enumerateOff() {\n\tself.mode &= ^modeEnumerateMask\n}\n\nfunc (self _property) enumerateSet() bool {\n\treturn 0 == self.mode&modeEnumerateMask&modeSetMask\n}\n\nfunc (self _property) configurable() bool {\n\treturn self.mode&modeConfigureMask == modeConfigureMask&modeOnMask\n}\n\nfunc (self *_property) configureOn() {\n\tself.mode = (self.mode & ^modeConfigureMask) | (modeConfigureMask & modeOnMask)\n}\n\nfunc (self *_property) configureOff() {\n\tself.mode &= ^modeConfigureMask\n}\n\nfunc (self _property) configureSet() bool {\n\treturn 0 == self.mode&modeConfigureMask&modeSetMask\n}\n\nfunc (self _property) copy() *_property {\n\tproperty := self\n\treturn &property\n}\n\nfunc (self _property) get(this *_object) Value {\n\tswitch value := self.value.(type) {\n\tcase Value:\n\t\treturn value\n\tcase _propertyGetSet:\n\t\tif value[0] != nil {\n\t\t\treturn value[0].call(toValue(this), nil, false, nativeFrame)\n\t\t}\n\t}\n\treturn Value{}\n}\n\nfunc (self _property) isAccessorDescriptor() bool {\n\tsetGet, test := self.value.(_propertyGetSet)\n\treturn test && (setGet[0] != nil || setGet[1] != nil)\n}\n\nfunc (self _property) isDataDescriptor() bool {\n\tif self.writeSet() { // Either \"On\" or \"Off\"\n\t\treturn true\n\t}\n\tvalue, valid := self.value.(Value)\n\treturn valid && !value.isEmpty()\n}\n\nfunc (self _property) isGenericDescriptor() bool {\n\treturn !(self.isDataDescriptor() || self.isAccessorDescriptor())\n}\n\nfunc (self _property) isEmpty() bool {\n\treturn self.mode == 0222 && self.isGenericDescriptor()\n}\n\n// _enumerableValue, _enumerableTrue, _enumerableFalse?\n// .enumerableValue() .enumerableExists()\n\nfunc toPropertyDescriptor(rt *_runtime, value Value) (descriptor _property) {\n\tobjectDescriptor := value._object()\n\tif objectDescriptor == nil {\n\t\tpanic(rt.panicTypeError())\n\t}\n\n\t{\n\t\tdescriptor.mode = modeSetMask // Initially nothing is set\n\t\tif objectDescriptor.hasProperty(\"enumerable\") {\n\t\t\tif objectDescriptor.get(\"enumerable\").bool() {\n\t\t\t\tdescriptor.enumerateOn()\n\t\t\t} else {\n\t\t\t\tdescriptor.enumerateOff()\n\t\t\t}\n\t\t}\n\n\t\tif objectDescriptor.hasProperty(\"configurable\") {\n\t\t\tif objectDescriptor.get(\"configurable\").bool() {\n\t\t\t\tdescriptor.configureOn()\n\t\t\t} else {\n\t\t\t\tdescriptor.configureOff()\n\t\t\t}\n\t\t}\n\n\t\tif objectDescriptor.hasProperty(\"writable\") {\n\t\t\tif objectDescriptor.get(\"writable\").bool() {\n\t\t\t\tdescriptor.writeOn()\n\t\t\t} else {\n\t\t\t\tdescriptor.writeOff()\n\t\t\t}\n\t\t}\n\t}\n\n\tvar getter, setter *_object\n\tgetterSetter := false\n\n\tif objectDescriptor.hasProperty(\"get\") {\n\t\tvalue := objectDescriptor.get(\"get\")\n\t\tif value.IsDefined() {\n\t\t\tif !value.isCallable() {\n\t\t\t\tpanic(rt.panicTypeError())\n\t\t\t}\n\t\t\tgetter = value._object()\n\t\t\tgetterSetter = true\n\t\t} else {\n\t\t\tgetter = &_nilGetSetObject\n\t\t\tgetterSetter = true\n\t\t}\n\t}\n\n\tif objectDescriptor.hasProperty(\"set\") {\n\t\tvalue := objectDescriptor.get(\"set\")\n\t\tif value.IsDefined() {\n\t\t\tif !value.isCallable() {\n\t\t\t\tpanic(rt.panicTypeError())\n\t\t\t}\n\t\t\tsetter = value._object()\n\t\t\tgetterSetter = true\n\t\t} else {\n\t\t\tsetter = &_nilGetSetObject\n\t\t\tgetterSetter = true\n\t\t}\n\t}\n\n\tif getterSetter {\n\t\tif descriptor.writeSet() {\n\t\t\tpanic(rt.panicTypeError())\n\t\t}\n\t\tdescriptor.value = _propertyGetSet{getter, setter}\n\t}\n\n\tif objectDescriptor.hasProperty(\"value\") {\n\t\tif getterSetter {\n\t\t\tpanic(rt.panicTypeError())\n\t\t}\n\t\tdescriptor.value = objectDescriptor.get(\"value\")\n\t}\n\n\treturn\n}\n\nfunc (self *_runtime) fromPropertyDescriptor(descriptor _property) *_object {\n\tobject := self.newObject()\n\tif descriptor.isDataDescriptor() {\n\t\tobject.defineProperty(\"value\", descriptor.value.(Value), 0111, false)\n\t\tobject.defineProperty(\"writable\", toValue_bool(descriptor.writable()), 0111, false)\n\t} else if descriptor.isAccessorDescriptor() {\n\t\tgetSet := descriptor.value.(_propertyGetSet)\n\t\tget := Value{}\n\t\tif getSet[0] != nil {\n\t\t\tget = toValue_object(getSet[0])\n\t\t}\n\t\tset := Value{}\n\t\tif getSet[1] != nil {\n\t\t\tset = toValue_object(getSet[1])\n\t\t}\n\t\tobject.defineProperty(\"get\", get, 0111, false)\n\t\tobject.defineProperty(\"set\", set, 0111, false)\n\t}\n\tobject.defineProperty(\"enumerable\", toValue_bool(descriptor.enumerable()), 0111, false)\n\tobject.defineProperty(\"configurable\", toValue_bool(descriptor.configurable()), 0111, false)\n\treturn object\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/registry/README.markdown",
    "content": "# registry\n--\n    import \"github.com/robertkrimen/otto/registry\"\n\nPackage registry is an expirmental package to facillitate altering the otto\nruntime via import.\n\nThis interface can change at any time.\n\n## Usage\n\n#### func  Apply\n\n```go\nfunc Apply(callback func(Entry))\n```\n\n#### type Entry\n\n```go\ntype Entry struct {\n}\n```\n\n\n#### func  Register\n\n```go\nfunc Register(source func() string) *Entry\n```\n\n#### func (*Entry) Disable\n\n```go\nfunc (self *Entry) Disable()\n```\n\n#### func (*Entry) Enable\n\n```go\nfunc (self *Entry) Enable()\n```\n\n#### func (Entry) Source\n\n```go\nfunc (self Entry) Source() string\n```\n\n--\n**godocdown** http://github.com/robertkrimen/godocdown\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/registry/registry.go",
    "content": "/*\nPackage registry is an expirmental package to facillitate altering the otto runtime via import.\n\nThis interface can change at any time.\n*/\npackage registry\n\nvar registry []*Entry = make([]*Entry, 0)\n\ntype Entry struct {\n\tactive bool\n\tsource func() string\n}\n\nfunc newEntry(source func() string) *Entry {\n\treturn &Entry{\n\t\tactive: true,\n\t\tsource: source,\n\t}\n}\n\nfunc (self *Entry) Enable() {\n\tself.active = true\n}\n\nfunc (self *Entry) Disable() {\n\tself.active = false\n}\n\nfunc (self Entry) Source() string {\n\treturn self.source()\n}\n\nfunc Apply(callback func(Entry)) {\n\tfor _, entry := range registry {\n\t\tif !entry.active {\n\t\t\tcontinue\n\t\t}\n\t\tcallback(*entry)\n\t}\n}\n\nfunc Register(source func() string) *Entry {\n\tentry := newEntry(source)\n\tregistry = append(registry, entry)\n\treturn entry\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/result.go",
    "content": "package otto\n\nimport ()\n\ntype _resultKind int\n\nconst (\n\tresultNormal _resultKind = iota\n\tresultReturn\n\tresultBreak\n\tresultContinue\n)\n\ntype _result struct {\n\tkind   _resultKind\n\tvalue  Value\n\ttarget string\n}\n\nfunc newReturnResult(value Value) _result {\n\treturn _result{resultReturn, value, \"\"}\n}\n\nfunc newContinueResult(target string) _result {\n\treturn _result{resultContinue, emptyValue, target}\n}\n\nfunc newBreakResult(target string) _result {\n\treturn _result{resultBreak, emptyValue, target}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/runtime.go",
    "content": "package otto\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"path\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"sync\"\n\n\t\"github.com/robertkrimen/otto/ast\"\n\t\"github.com/robertkrimen/otto/parser\"\n)\n\ntype _global struct {\n\tObject         *_object // Object( ... ), new Object( ... ) - 1 (length)\n\tFunction       *_object // Function( ... ), new Function( ... ) - 1\n\tArray          *_object // Array( ... ), new Array( ... ) - 1\n\tString         *_object // String( ... ), new String( ... ) - 1\n\tBoolean        *_object // Boolean( ... ), new Boolean( ... ) - 1\n\tNumber         *_object // Number( ... ), new Number( ... ) - 1\n\tMath           *_object\n\tDate           *_object // Date( ... ), new Date( ... ) - 7\n\tRegExp         *_object // RegExp( ... ), new RegExp( ... ) - 2\n\tError          *_object // Error( ... ), new Error( ... ) - 1\n\tEvalError      *_object\n\tTypeError      *_object\n\tRangeError     *_object\n\tReferenceError *_object\n\tSyntaxError    *_object\n\tURIError       *_object\n\tJSON           *_object\n\n\tObjectPrototype         *_object // Object.prototype\n\tFunctionPrototype       *_object // Function.prototype\n\tArrayPrototype          *_object // Array.prototype\n\tStringPrototype         *_object // String.prototype\n\tBooleanPrototype        *_object // Boolean.prototype\n\tNumberPrototype         *_object // Number.prototype\n\tDatePrototype           *_object // Date.prototype\n\tRegExpPrototype         *_object // RegExp.prototype\n\tErrorPrototype          *_object // Error.prototype\n\tEvalErrorPrototype      *_object\n\tTypeErrorPrototype      *_object\n\tRangeErrorPrototype     *_object\n\tReferenceErrorPrototype *_object\n\tSyntaxErrorPrototype    *_object\n\tURIErrorPrototype       *_object\n}\n\ntype _runtime struct {\n\tglobal       _global\n\tglobalObject *_object\n\tglobalStash  *_objectStash\n\tscope        *_scope\n\totto         *Otto\n\teval         *_object // The builtin eval, for determine indirect versus direct invocation\n\tdebugger     func(*Otto)\n\trandom       func() float64\n\tstackLimit   int\n\ttraceLimit   int\n\n\tlabels []string // FIXME\n\tlck    sync.Mutex\n}\n\nfunc (self *_runtime) enterScope(scope *_scope) {\n\tscope.outer = self.scope\n\tif self.scope != nil {\n\t\tif self.stackLimit != 0 && self.scope.depth+1 >= self.stackLimit {\n\t\t\tpanic(self.panicRangeError(\"Maximum call stack size exceeded\"))\n\t\t}\n\n\t\tscope.depth = self.scope.depth + 1\n\t}\n\n\tself.scope = scope\n}\n\nfunc (self *_runtime) leaveScope() {\n\tself.scope = self.scope.outer\n}\n\n// FIXME This is used in two places (cloning)\nfunc (self *_runtime) enterGlobalScope() {\n\tself.enterScope(newScope(self.globalStash, self.globalStash, self.globalObject))\n}\n\nfunc (self *_runtime) enterFunctionScope(outer _stash, this Value) *_fnStash {\n\tif outer == nil {\n\t\touter = self.globalStash\n\t}\n\tstash := self.newFunctionStash(outer)\n\tvar thisObject *_object\n\tswitch this.kind {\n\tcase valueUndefined, valueNull:\n\t\tthisObject = self.globalObject\n\tdefault:\n\t\tthisObject = self.toObject(this)\n\t}\n\tself.enterScope(newScope(stash, stash, thisObject))\n\treturn stash\n}\n\nfunc (self *_runtime) putValue(reference _reference, value Value) {\n\tname := reference.putValue(value)\n\tif name != \"\" {\n\t\t// Why? -- If reference.base == nil\n\t\t// strict = false\n\t\tself.globalObject.defineProperty(name, value, 0111, false)\n\t}\n}\n\nfunc (self *_runtime) tryCatchEvaluate(inner func() Value) (tryValue Value, exception bool) {\n\t// resultValue = The value of the block (e.g. the last statement)\n\t// throw = Something was thrown\n\t// throwValue = The value of what was thrown\n\t// other = Something that changes flow (return, break, continue) that is not a throw\n\t// Otherwise, some sort of unknown panic happened, we'll just propagate it\n\tdefer func() {\n\t\tif caught := recover(); caught != nil {\n\t\t\tif exception, ok := caught.(*_exception); ok {\n\t\t\t\tcaught = exception.eject()\n\t\t\t}\n\t\t\tswitch caught := caught.(type) {\n\t\t\tcase _error:\n\t\t\t\texception = true\n\t\t\t\ttryValue = toValue_object(self.newError(caught.name, caught.messageValue(), 0))\n\t\t\tcase Value:\n\t\t\t\texception = true\n\t\t\t\ttryValue = caught\n\t\t\tdefault:\n\t\t\t\tpanic(caught)\n\t\t\t}\n\t\t}\n\t}()\n\n\ttryValue = inner()\n\treturn\n}\n\n// toObject\n\nfunc (self *_runtime) toObject(value Value) *_object {\n\tswitch value.kind {\n\tcase valueEmpty, valueUndefined, valueNull:\n\t\tpanic(self.panicTypeError())\n\tcase valueBoolean:\n\t\treturn self.newBoolean(value)\n\tcase valueString:\n\t\treturn self.newString(value)\n\tcase valueNumber:\n\t\treturn self.newNumber(value)\n\tcase valueObject:\n\t\treturn value._object()\n\t}\n\tpanic(self.panicTypeError())\n}\n\nfunc (self *_runtime) objectCoerce(value Value) (*_object, error) {\n\tswitch value.kind {\n\tcase valueUndefined:\n\t\treturn nil, errors.New(\"undefined\")\n\tcase valueNull:\n\t\treturn nil, errors.New(\"null\")\n\tcase valueBoolean:\n\t\treturn self.newBoolean(value), nil\n\tcase valueString:\n\t\treturn self.newString(value), nil\n\tcase valueNumber:\n\t\treturn self.newNumber(value), nil\n\tcase valueObject:\n\t\treturn value._object(), nil\n\t}\n\tpanic(self.panicTypeError())\n}\n\nfunc checkObjectCoercible(rt *_runtime, value Value) {\n\tisObject, mustCoerce := testObjectCoercible(value)\n\tif !isObject && !mustCoerce {\n\t\tpanic(rt.panicTypeError())\n\t}\n}\n\n// testObjectCoercible\n\nfunc testObjectCoercible(value Value) (isObject bool, mustCoerce bool) {\n\tswitch value.kind {\n\tcase valueReference, valueEmpty, valueNull, valueUndefined:\n\t\treturn false, false\n\tcase valueNumber, valueString, valueBoolean:\n\t\treturn false, true\n\tcase valueObject:\n\t\treturn true, false\n\tdefault:\n\t\tpanic(\"this should never happen\")\n\t}\n}\n\nfunc (self *_runtime) safeToValue(value interface{}) (Value, error) {\n\tresult := Value{}\n\terr := catchPanic(func() {\n\t\tresult = self.toValue(value)\n\t})\n\treturn result, err\n}\n\n// convertNumeric converts numeric parameter val from js to that of type t if it is safe to do so, otherwise it panics.\n// This allows literals (int64), bitwise values (int32) and the general form (float64) of javascript numerics to be passed as parameters to go functions easily.\nfunc (self *_runtime) convertNumeric(v Value, t reflect.Type) reflect.Value {\n\tval := reflect.ValueOf(v.export())\n\n\tif val.Kind() == t.Kind() {\n\t\treturn val\n\t}\n\n\tif val.Kind() == reflect.Interface {\n\t\tval = reflect.ValueOf(val.Interface())\n\t}\n\n\tswitch val.Kind() {\n\tcase reflect.Float32, reflect.Float64:\n\t\tf64 := val.Float()\n\t\tswitch t.Kind() {\n\t\tcase reflect.Float64:\n\t\t\treturn reflect.ValueOf(f64)\n\t\tcase reflect.Float32:\n\t\t\tif reflect.Zero(t).OverflowFloat(f64) {\n\t\t\t\tpanic(self.panicRangeError(\"converting float64 to float32 would overflow\"))\n\t\t\t}\n\n\t\t\treturn val.Convert(t)\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\ti64 := int64(f64)\n\t\t\tif float64(i64) != f64 {\n\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"converting %v to %v would cause loss of precision\", val.Type(), t)))\n\t\t\t}\n\n\t\t\t// The float represents an integer\n\t\t\tval = reflect.ValueOf(i64)\n\t\tdefault:\n\t\t\tpanic(self.panicTypeError(fmt.Sprintf(\"cannot convert %v to %v\", val.Type(), t)))\n\t\t}\n\t}\n\n\tswitch val.Kind() {\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\ti64 := val.Int()\n\t\tswitch t.Kind() {\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\tif reflect.Zero(t).OverflowInt(i64) {\n\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"converting %v to %v would overflow\", val.Type(), t)))\n\t\t\t}\n\t\t\treturn val.Convert(t)\n\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\tif i64 < 0 {\n\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"converting %v to %v would underflow\", val.Type(), t)))\n\t\t\t}\n\t\t\tif reflect.Zero(t).OverflowUint(uint64(i64)) {\n\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"converting %v to %v would overflow\", val.Type(), t)))\n\t\t\t}\n\t\t\treturn val.Convert(t)\n\t\t}\n\n\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\tu64 := val.Uint()\n\t\tswitch t.Kind() {\n\t\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:\n\t\t\tif u64 > math.MaxInt64 || reflect.Zero(t).OverflowInt(int64(u64)) {\n\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"converting %v to %v would overflow\", val.Type(), t)))\n\t\t\t}\n\t\t\treturn val.Convert(t)\n\t\tcase reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:\n\t\t\tif reflect.Zero(t).OverflowUint(u64) {\n\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"converting %v to %v would overflow\", val.Type(), t)))\n\t\t\t}\n\t\t\treturn val.Convert(t)\n\t\t}\n\t}\n\n\tpanic(self.panicTypeError(fmt.Sprintf(\"unsupported type %v for numeric conversion\", val.Type())))\n}\n\nvar typeOfValue = reflect.TypeOf(Value{})\n\n// convertCallParameter converts request val to type t if possible.\n// If the conversion fails due to overflow or type miss-match then it panics.\n// If no conversion is known then the original value is returned.\nfunc (self *_runtime) convertCallParameter(v Value, t reflect.Type) reflect.Value {\n\tif t == typeOfValue {\n\t\treturn reflect.ValueOf(v)\n\t}\n\n\tif v.kind == valueObject {\n\t\tif gso, ok := v._object().value.(*_goStructObject); ok {\n\t\t\tif gso.value.Type().AssignableTo(t) {\n\t\t\t\treturn gso.value\n\t\t\t}\n\t\t}\n\t}\n\n\tif t.Kind() == reflect.Interface {\n\t\tiv := reflect.ValueOf(v.export())\n\t\tif iv.Type().AssignableTo(t) {\n\t\t\treturn iv\n\t\t}\n\t}\n\n\ttk := t.Kind()\n\n\tif tk == reflect.Ptr {\n\t\tswitch v.kind {\n\t\tcase valueEmpty, valueNull, valueUndefined:\n\t\t\treturn reflect.Zero(t)\n\t\tdefault:\n\t\t\tvar vv reflect.Value\n\t\t\tif err := catchPanic(func() { vv = self.convertCallParameter(v, t.Elem()) }); err == nil {\n\t\t\t\tif vv.CanAddr() {\n\t\t\t\t\treturn vv.Addr()\n\t\t\t\t}\n\n\t\t\t\tpv := reflect.New(vv.Type())\n\t\t\t\tpv.Elem().Set(vv)\n\t\t\t\treturn pv\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch tk {\n\tcase reflect.Bool:\n\t\treturn reflect.ValueOf(v.bool())\n\tcase reflect.String:\n\t\tswitch v.kind {\n\t\tcase valueString:\n\t\t\treturn reflect.ValueOf(v.value)\n\t\tcase valueNumber:\n\t\t\treturn reflect.ValueOf(fmt.Sprintf(\"%v\", v.value))\n\t\t}\n\tcase reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64:\n\t\tswitch v.kind {\n\t\tcase valueNumber:\n\t\t\treturn self.convertNumeric(v, t)\n\t\t}\n\tcase reflect.Slice:\n\t\tif o := v._object(); o != nil {\n\t\t\tif lv := o.get(\"length\"); lv.IsNumber() {\n\t\t\t\tl := lv.number().int64\n\n\t\t\t\ts := reflect.MakeSlice(t, int(l), int(l))\n\n\t\t\t\ttt := t.Elem()\n\n\t\t\t\tif o.class == \"Array\" {\n\t\t\t\t\tfor i := int64(0); i < l; i++ {\n\t\t\t\t\t\tp, ok := o.property[strconv.FormatInt(i, 10)]\n\t\t\t\t\t\tif !ok {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te, ok := p.value.(Value)\n\t\t\t\t\t\tif !ok {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tev := self.convertCallParameter(e, tt)\n\n\t\t\t\t\t\ts.Index(int(i)).Set(ev)\n\t\t\t\t\t}\n\t\t\t\t} else if o.class == \"GoArray\" {\n\n\t\t\t\t\tvar gslice bool\n\t\t\t\t\tswitch o.value.(type) {\n\t\t\t\t\tcase *_goSliceObject:\n\t\t\t\t\t\tgslice = true\n\t\t\t\t\tcase *_goArrayObject:\n\t\t\t\t\t\tgslice = false\n\t\t\t\t\t}\n\n\t\t\t\t\tfor i := int64(0); i < l; i++ {\n\t\t\t\t\t\tvar p *_property\n\t\t\t\t\t\tif gslice {\n\t\t\t\t\t\t\tp = goSliceGetOwnProperty(o, strconv.FormatInt(i, 10))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tp = goArrayGetOwnProperty(o, strconv.FormatInt(i, 10))\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif p == nil {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te, ok := p.value.(Value)\n\t\t\t\t\t\tif !ok {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tev := self.convertCallParameter(e, tt)\n\n\t\t\t\t\t\ts.Index(int(i)).Set(ev)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn s\n\t\t\t}\n\t\t}\n\tcase reflect.Map:\n\t\tif o := v._object(); o != nil && t.Key().Kind() == reflect.String {\n\t\t\tm := reflect.MakeMap(t)\n\n\t\t\to.enumerate(false, func(k string) bool {\n\t\t\t\tm.SetMapIndex(reflect.ValueOf(k), self.convertCallParameter(o.get(k), t.Elem()))\n\t\t\t\treturn true\n\t\t\t})\n\n\t\t\treturn m\n\t\t}\n\tcase reflect.Func:\n\t\tif t.NumOut() > 1 {\n\t\t\tpanic(self.panicTypeError(\"converting JavaScript values to Go functions with more than one return value is currently not supported\"))\n\t\t}\n\n\t\tif o := v._object(); o != nil && o.class == \"Function\" {\n\t\t\treturn reflect.MakeFunc(t, func(args []reflect.Value) []reflect.Value {\n\t\t\t\tl := make([]interface{}, len(args))\n\t\t\t\tfor i, a := range args {\n\t\t\t\t\tif a.CanInterface() {\n\t\t\t\t\t\tl[i] = a.Interface()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trv, err := v.Call(nullValue, l...)\n\t\t\t\tif err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\n\t\t\t\tif t.NumOut() == 0 {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\n\t\t\t\treturn []reflect.Value{self.convertCallParameter(rv, t.Out(0))}\n\t\t\t})\n\t\t}\n\t}\n\n\tif tk == reflect.String {\n\t\tif o := v._object(); o != nil && o.hasProperty(\"toString\") {\n\t\t\tif fn := o.get(\"toString\"); fn.IsFunction() {\n\t\t\t\tsv, err := fn.Call(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\n\t\t\t\tvar r reflect.Value\n\t\t\t\tif err := catchPanic(func() { r = self.convertCallParameter(sv, t) }); err == nil {\n\t\t\t\t\treturn r\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn reflect.ValueOf(v.String())\n\t}\n\n\ts := \"OTTO DOES NOT UNDERSTAND THIS TYPE\"\n\tswitch v.kind {\n\tcase valueBoolean:\n\t\ts = \"boolean\"\n\tcase valueNull:\n\t\ts = \"null\"\n\tcase valueNumber:\n\t\ts = \"number\"\n\tcase valueString:\n\t\ts = \"string\"\n\tcase valueUndefined:\n\t\ts = \"undefined\"\n\tcase valueObject:\n\t\ts = v.Class()\n\t}\n\n\tpanic(self.panicTypeError(\"can't convert from %q to %q\", s, t.String()))\n}\n\nfunc (self *_runtime) toValue(value interface{}) Value {\n\tswitch value := value.(type) {\n\tcase Value:\n\t\treturn value\n\tcase func(FunctionCall) Value:\n\t\tvar name, file string\n\t\tvar line int\n\t\tpc := reflect.ValueOf(value).Pointer()\n\t\tfn := runtime.FuncForPC(pc)\n\t\tif fn != nil {\n\t\t\tname = fn.Name()\n\t\t\tfile, line = fn.FileLine(pc)\n\t\t\tfile = path.Base(file)\n\t\t}\n\t\treturn toValue_object(self.newNativeFunction(name, file, line, value))\n\tcase _nativeFunction:\n\t\tvar name, file string\n\t\tvar line int\n\t\tpc := reflect.ValueOf(value).Pointer()\n\t\tfn := runtime.FuncForPC(pc)\n\t\tif fn != nil {\n\t\t\tname = fn.Name()\n\t\t\tfile, line = fn.FileLine(pc)\n\t\t\tfile = path.Base(file)\n\t\t}\n\t\treturn toValue_object(self.newNativeFunction(name, file, line, value))\n\tcase Object, *Object, _object, *_object:\n\t\t// Nothing happens.\n\t\t// FIXME We should really figure out what can come here.\n\t\t// This catch-all is ugly.\n\tdefault:\n\t\t{\n\t\t\tvalue := reflect.ValueOf(value)\n\n\t\t\tswitch value.Kind() {\n\t\t\tcase reflect.Ptr:\n\t\t\t\tswitch reflect.Indirect(value).Kind() {\n\t\t\t\tcase reflect.Struct:\n\t\t\t\t\treturn toValue_object(self.newGoStructObject(value))\n\t\t\t\tcase reflect.Array:\n\t\t\t\t\treturn toValue_object(self.newGoArray(value))\n\t\t\t\t}\n\t\t\tcase reflect.Struct:\n\t\t\t\treturn toValue_object(self.newGoStructObject(value))\n\t\t\tcase reflect.Map:\n\t\t\t\treturn toValue_object(self.newGoMapObject(value))\n\t\t\tcase reflect.Slice:\n\t\t\t\treturn toValue_object(self.newGoSlice(value))\n\t\t\tcase reflect.Array:\n\t\t\t\treturn toValue_object(self.newGoArray(value))\n\t\t\tcase reflect.Func:\n\t\t\t\tvar name, file string\n\t\t\t\tvar line int\n\t\t\t\tif v := reflect.ValueOf(value); v.Kind() == reflect.Ptr {\n\t\t\t\t\tpc := v.Pointer()\n\t\t\t\t\tfn := runtime.FuncForPC(pc)\n\t\t\t\t\tif fn != nil {\n\t\t\t\t\t\tname = fn.Name()\n\t\t\t\t\t\tfile, line = fn.FileLine(pc)\n\t\t\t\t\t\tfile = path.Base(file)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttyp := value.Type()\n\n\t\t\t\treturn toValue_object(self.newNativeFunction(name, file, line, func(c FunctionCall) Value {\n\t\t\t\t\tnargs := typ.NumIn()\n\n\t\t\t\t\tif len(c.ArgumentList) != nargs {\n\t\t\t\t\t\tif typ.IsVariadic() {\n\t\t\t\t\t\t\tif len(c.ArgumentList) < nargs-1 {\n\t\t\t\t\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"expected at least %d arguments; got %d\", nargs-1, len(c.ArgumentList))))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpanic(self.panicRangeError(fmt.Sprintf(\"expected %d argument(s); got %d\", nargs, len(c.ArgumentList))))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tin := make([]reflect.Value, len(c.ArgumentList))\n\n\t\t\t\t\tcallSlice := false\n\n\t\t\t\t\tfor i, a := range c.ArgumentList {\n\t\t\t\t\t\tvar t reflect.Type\n\n\t\t\t\t\t\tn := i\n\t\t\t\t\t\tif n >= nargs-1 && typ.IsVariadic() {\n\t\t\t\t\t\t\tif n > nargs-1 {\n\t\t\t\t\t\t\t\tn = nargs - 1\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tt = typ.In(n).Elem()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt = typ.In(n)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if this is a variadic Go function, and the caller has supplied\n\t\t\t\t\t\t// exactly the number of JavaScript arguments required, and this\n\t\t\t\t\t\t// is the last JavaScript argument, try treating the it as the\n\t\t\t\t\t\t// actual set of variadic Go arguments. if that succeeds, break\n\t\t\t\t\t\t// out of the loop.\n\t\t\t\t\t\tif typ.IsVariadic() && len(c.ArgumentList) == nargs && i == nargs-1 {\n\t\t\t\t\t\t\tvar v reflect.Value\n\t\t\t\t\t\t\tif err := catchPanic(func() { v = self.convertCallParameter(a, typ.In(n)) }); err == nil {\n\t\t\t\t\t\t\t\tin[i] = v\n\t\t\t\t\t\t\t\tcallSlice = true\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tin[i] = self.convertCallParameter(a, t)\n\t\t\t\t\t}\n\n\t\t\t\t\tvar out []reflect.Value\n\t\t\t\t\tif callSlice {\n\t\t\t\t\t\tout = value.CallSlice(in)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tout = value.Call(in)\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch len(out) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\treturn Value{}\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\treturn self.toValue(out[0].Interface())\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ts := make([]interface{}, len(out))\n\t\t\t\t\t\tfor i, v := range out {\n\t\t\t\t\t\t\ts[i] = self.toValue(v.Interface())\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn self.toValue(s)\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t}\n\t\t}\n\t}\n\n\treturn toValue(value)\n}\n\nfunc (runtime *_runtime) newGoSlice(value reflect.Value) *_object {\n\tself := runtime.newGoSliceObject(value)\n\tself.prototype = runtime.global.ArrayPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) newGoArray(value reflect.Value) *_object {\n\tself := runtime.newGoArrayObject(value)\n\tself.prototype = runtime.global.ArrayPrototype\n\treturn self\n}\n\nfunc (runtime *_runtime) parse(filename string, src, sm interface{}) (*ast.Program, error) {\n\treturn parser.ParseFileWithSourceMap(nil, filename, src, sm, 0)\n}\n\nfunc (runtime *_runtime) cmpl_parse(filename string, src, sm interface{}) (*_nodeProgram, error) {\n\tprogram, err := parser.ParseFileWithSourceMap(nil, filename, src, sm, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn cmpl_parse(program), nil\n}\n\nfunc (self *_runtime) parseSource(src, sm interface{}) (*_nodeProgram, *ast.Program, error) {\n\tswitch src := src.(type) {\n\tcase *ast.Program:\n\t\treturn nil, src, nil\n\tcase *Script:\n\t\treturn src.program, nil, nil\n\t}\n\n\tprogram, err := self.parse(\"\", src, sm)\n\n\treturn nil, program, err\n}\n\nfunc (self *_runtime) cmpl_runOrEval(src, sm interface{}, eval bool) (Value, error) {\n\tresult := Value{}\n\tcmpl_program, program, err := self.parseSource(src, sm)\n\tif err != nil {\n\t\treturn result, err\n\t}\n\tif cmpl_program == nil {\n\t\tcmpl_program = cmpl_parse(program)\n\t}\n\terr = catchPanic(func() {\n\t\tresult = self.cmpl_evaluate_nodeProgram(cmpl_program, eval)\n\t})\n\tswitch result.kind {\n\tcase valueEmpty:\n\t\tresult = Value{}\n\tcase valueReference:\n\t\tresult = result.resolve()\n\t}\n\treturn result, err\n}\n\nfunc (self *_runtime) cmpl_run(src, sm interface{}) (Value, error) {\n\treturn self.cmpl_runOrEval(src, sm, false)\n}\n\nfunc (self *_runtime) cmpl_eval(src, sm interface{}) (Value, error) {\n\treturn self.cmpl_runOrEval(src, sm, true)\n}\n\nfunc (self *_runtime) parseThrow(err error) {\n\tif err == nil {\n\t\treturn\n\t}\n\tswitch err := err.(type) {\n\tcase parser.ErrorList:\n\t\t{\n\t\t\terr := err[0]\n\t\t\tif err.Message == \"Invalid left-hand side in assignment\" {\n\t\t\t\tpanic(self.panicReferenceError(err.Message))\n\t\t\t}\n\t\t\tpanic(self.panicSyntaxError(err.Message))\n\t\t}\n\t}\n\tpanic(self.panicSyntaxError(err.Error()))\n}\n\nfunc (self *_runtime) cmpl_parseOrThrow(src, sm interface{}) *_nodeProgram {\n\tprogram, err := self.cmpl_parse(\"\", src, sm)\n\tself.parseThrow(err) // Will panic/throw appropriately\n\treturn program\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/scope.go",
    "content": "package otto\n\n// _scope:\n// entryFile\n// entryIdx\n// top?\n// outer => nil\n\n// _stash:\n// lexical\n// variable\n//\n// _thisStash (ObjectEnvironment)\n// _fnStash\n// _dclStash\n\n// An ECMA-262 ExecutionContext\ntype _scope struct {\n\tlexical  _stash\n\tvariable _stash\n\tthis     *_object\n\teval     bool // Replace this with kind?\n\touter    *_scope\n\tdepth    int\n\n\tframe _frame\n}\n\nfunc newScope(lexical _stash, variable _stash, this *_object) *_scope {\n\treturn &_scope{\n\t\tlexical:  lexical,\n\t\tvariable: variable,\n\t\tthis:     this,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/script.go",
    "content": "package otto\n\nimport (\n\t\"bytes\"\n\t\"encoding/gob\"\n\t\"errors\"\n)\n\nvar ErrVersion = errors.New(\"version mismatch\")\n\nvar scriptVersion = \"2014-04-13/1\"\n\n// Script is a handle for some (reusable) JavaScript.\n// Passing a Script value to a run method will evaluate the JavaScript.\n//\ntype Script struct {\n\tversion  string\n\tprogram  *_nodeProgram\n\tfilename string\n\tsrc      string\n}\n\n// Compile will parse the given source and return a Script value or nil and\n// an error if there was a problem during compilation.\n//\n//      script, err := vm.Compile(\"\", `var abc; if (!abc) abc = 0; abc += 2; abc;`)\n//      vm.Run(script)\n//\nfunc (self *Otto) Compile(filename string, src interface{}) (*Script, error) {\n\treturn self.CompileWithSourceMap(filename, src, nil)\n}\n\n// CompileWithSourceMap does the same thing as Compile, but with the obvious\n// difference of applying a source map.\nfunc (self *Otto) CompileWithSourceMap(filename string, src, sm interface{}) (*Script, error) {\n\tprogram, err := self.runtime.parse(filename, src, sm)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcmpl_program := cmpl_parse(program)\n\n\tscript := &Script{\n\t\tversion:  scriptVersion,\n\t\tprogram:  cmpl_program,\n\t\tfilename: filename,\n\t\tsrc:      program.File.Source(),\n\t}\n\n\treturn script, nil\n}\n\nfunc (self *Script) String() string {\n\treturn \"// \" + self.filename + \"\\n\" + self.src\n}\n\n// MarshalBinary will marshal a script into a binary form. A marshalled script\n// that is later unmarshalled can be executed on the same version of the otto runtime.\n//\n// The binary format can change at any time and should be considered unspecified and opaque.\n//\nfunc (self *Script) marshalBinary() ([]byte, error) {\n\tvar bfr bytes.Buffer\n\tencoder := gob.NewEncoder(&bfr)\n\terr := encoder.Encode(self.version)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = encoder.Encode(self.program)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = encoder.Encode(self.filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = encoder.Encode(self.src)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn bfr.Bytes(), nil\n}\n\n// UnmarshalBinary will vivify a marshalled script into something usable. If the script was\n// originally marshalled on a different version of the otto runtime, then this method\n// will return an error.\n//\n// The binary format can change at any time and should be considered unspecified and opaque.\n//\nfunc (self *Script) unmarshalBinary(data []byte) error {\n\tdecoder := gob.NewDecoder(bytes.NewReader(data))\n\terr := decoder.Decode(&self.version)\n\tif err != nil {\n\t\tgoto error\n\t}\n\tif self.version != scriptVersion {\n\t\terr = ErrVersion\n\t\tgoto error\n\t}\n\terr = decoder.Decode(&self.program)\n\tif err != nil {\n\t\tgoto error\n\t}\n\terr = decoder.Decode(&self.filename)\n\tif err != nil {\n\t\tgoto error\n\t}\n\terr = decoder.Decode(&self.src)\n\tif err != nil {\n\t\tgoto error\n\t}\n\treturn nil\nerror:\n\tself.version = \"\"\n\tself.program = nil\n\tself.filename = \"\"\n\tself.src = \"\"\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/stash.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n)\n\n// ======\n// _stash\n// ======\n\ntype _stash interface {\n\thasBinding(string) bool            //\n\tcreateBinding(string, bool, Value) // CreateMutableBinding\n\tsetBinding(string, Value, bool)    // SetMutableBinding\n\tgetBinding(string, bool) Value     // GetBindingValue\n\tdeleteBinding(string) bool         //\n\tsetValue(string, Value, bool)      // createBinding + setBinding\n\n\touter() _stash\n\truntime() *_runtime\n\n\tnewReference(string, bool, _at) _reference\n\n\tclone(clone *_clone) _stash\n}\n\n// ==========\n// _objectStash\n// ==========\n\ntype _objectStash struct {\n\t_runtime *_runtime\n\t_outer   _stash\n\tobject   *_object\n}\n\nfunc (self *_objectStash) runtime() *_runtime {\n\treturn self._runtime\n}\n\nfunc (runtime *_runtime) newObjectStash(object *_object, outer _stash) *_objectStash {\n\tif object == nil {\n\t\tobject = runtime.newBaseObject()\n\t\tobject.class = \"environment\"\n\t}\n\treturn &_objectStash{\n\t\t_runtime: runtime,\n\t\t_outer:   outer,\n\t\tobject:   object,\n\t}\n}\n\nfunc (in *_objectStash) clone(clone *_clone) _stash {\n\tout, exists := clone.objectStash(in)\n\tif exists {\n\t\treturn out\n\t}\n\t*out = _objectStash{\n\t\tclone.runtime,\n\t\tclone.stash(in._outer),\n\t\tclone.object(in.object),\n\t}\n\treturn out\n}\n\nfunc (self *_objectStash) hasBinding(name string) bool {\n\treturn self.object.hasProperty(name)\n}\n\nfunc (self *_objectStash) createBinding(name string, deletable bool, value Value) {\n\tif self.object.hasProperty(name) {\n\t\tpanic(hereBeDragons())\n\t}\n\tmode := _propertyMode(0111)\n\tif !deletable {\n\t\tmode = _propertyMode(0110)\n\t}\n\t// TODO False?\n\tself.object.defineProperty(name, value, mode, false)\n}\n\nfunc (self *_objectStash) setBinding(name string, value Value, strict bool) {\n\tself.object.put(name, value, strict)\n}\n\nfunc (self *_objectStash) setValue(name string, value Value, throw bool) {\n\tif !self.hasBinding(name) {\n\t\tself.createBinding(name, true, value) // Configurable by default\n\t} else {\n\t\tself.setBinding(name, value, throw)\n\t}\n}\n\nfunc (self *_objectStash) getBinding(name string, throw bool) Value {\n\tif self.object.hasProperty(name) {\n\t\treturn self.object.get(name)\n\t}\n\tif throw { // strict?\n\t\tpanic(self._runtime.panicReferenceError(\"Not Defined\", name))\n\t}\n\treturn Value{}\n}\n\nfunc (self *_objectStash) deleteBinding(name string) bool {\n\treturn self.object.delete(name, false)\n}\n\nfunc (self *_objectStash) outer() _stash {\n\treturn self._outer\n}\n\nfunc (self *_objectStash) newReference(name string, strict bool, at _at) _reference {\n\treturn newPropertyReference(self._runtime, self.object, name, strict, at)\n}\n\n// =========\n// _dclStash\n// =========\n\ntype _dclStash struct {\n\t_runtime *_runtime\n\t_outer   _stash\n\tproperty map[string]_dclProperty\n}\n\ntype _dclProperty struct {\n\tvalue     Value\n\tmutable   bool\n\tdeletable bool\n\treadable  bool\n}\n\nfunc (runtime *_runtime) newDeclarationStash(outer _stash) *_dclStash {\n\treturn &_dclStash{\n\t\t_runtime: runtime,\n\t\t_outer:   outer,\n\t\tproperty: map[string]_dclProperty{},\n\t}\n}\n\nfunc (in *_dclStash) clone(clone *_clone) _stash {\n\tout, exists := clone.dclStash(in)\n\tif exists {\n\t\treturn out\n\t}\n\tproperty := make(map[string]_dclProperty, len(in.property))\n\tfor index, value := range in.property {\n\t\tproperty[index] = clone.dclProperty(value)\n\t}\n\t*out = _dclStash{\n\t\tclone.runtime,\n\t\tclone.stash(in._outer),\n\t\tproperty,\n\t}\n\treturn out\n}\n\nfunc (self *_dclStash) hasBinding(name string) bool {\n\t_, exists := self.property[name]\n\treturn exists\n}\n\nfunc (self *_dclStash) runtime() *_runtime {\n\treturn self._runtime\n}\n\nfunc (self *_dclStash) createBinding(name string, deletable bool, value Value) {\n\t_, exists := self.property[name]\n\tif exists {\n\t\tpanic(fmt.Errorf(\"createBinding: %s: already exists\", name))\n\t}\n\tself.property[name] = _dclProperty{\n\t\tvalue:     value,\n\t\tmutable:   true,\n\t\tdeletable: deletable,\n\t\treadable:  false,\n\t}\n}\n\nfunc (self *_dclStash) setBinding(name string, value Value, strict bool) {\n\tproperty, exists := self.property[name]\n\tif !exists {\n\t\tpanic(fmt.Errorf(\"setBinding: %s: missing\", name))\n\t}\n\tif property.mutable {\n\t\tproperty.value = value\n\t\tself.property[name] = property\n\t} else {\n\t\tself._runtime.typeErrorResult(strict)\n\t}\n}\n\nfunc (self *_dclStash) setValue(name string, value Value, throw bool) {\n\tif !self.hasBinding(name) {\n\t\tself.createBinding(name, false, value) // NOT deletable by default\n\t} else {\n\t\tself.setBinding(name, value, throw)\n\t}\n}\n\n// FIXME This is called a __lot__\nfunc (self *_dclStash) getBinding(name string, throw bool) Value {\n\tproperty, exists := self.property[name]\n\tif !exists {\n\t\tpanic(fmt.Errorf(\"getBinding: %s: missing\", name))\n\t}\n\tif !property.mutable && !property.readable {\n\t\tif throw { // strict?\n\t\t\tpanic(self._runtime.panicTypeError())\n\t\t}\n\t\treturn Value{}\n\t}\n\treturn property.value\n}\n\nfunc (self *_dclStash) deleteBinding(name string) bool {\n\tproperty, exists := self.property[name]\n\tif !exists {\n\t\treturn true\n\t}\n\tif !property.deletable {\n\t\treturn false\n\t}\n\tdelete(self.property, name)\n\treturn true\n}\n\nfunc (self *_dclStash) outer() _stash {\n\treturn self._outer\n}\n\nfunc (self *_dclStash) newReference(name string, strict bool, _ _at) _reference {\n\treturn &_stashReference{\n\t\tname: name,\n\t\tbase: self,\n\t}\n}\n\n// ========\n// _fnStash\n// ========\n\ntype _fnStash struct {\n\t_dclStash\n\targuments           *_object\n\tindexOfArgumentName map[string]string\n}\n\nfunc (runtime *_runtime) newFunctionStash(outer _stash) *_fnStash {\n\treturn &_fnStash{\n\t\t_dclStash: _dclStash{\n\t\t\t_runtime: runtime,\n\t\t\t_outer:   outer,\n\t\t\tproperty: map[string]_dclProperty{},\n\t\t},\n\t}\n}\n\nfunc (in *_fnStash) clone(clone *_clone) _stash {\n\tout, exists := clone.fnStash(in)\n\tif exists {\n\t\treturn out\n\t}\n\tdclStash := in._dclStash.clone(clone).(*_dclStash)\n\tindex := make(map[string]string, len(in.indexOfArgumentName))\n\tfor name, value := range in.indexOfArgumentName {\n\t\tindex[name] = value\n\t}\n\t*out = _fnStash{\n\t\t_dclStash:           *dclStash,\n\t\targuments:           clone.object(in.arguments),\n\t\tindexOfArgumentName: index,\n\t}\n\treturn out\n}\n\nfunc getStashProperties(stash _stash) (keys []string) {\n\tswitch vars := stash.(type) {\n\tcase *_dclStash:\n\t\tfor k := range vars.property {\n\t\t\tkeys = append(keys, k)\n\t\t}\n\tcase *_fnStash:\n\t\tfor k := range vars.property {\n\t\t\tkeys = append(keys, k)\n\t\t}\n\tcase *_objectStash:\n\t\tfor k := range vars.object.property {\n\t\t\tkeys = append(keys, k)\n\t\t}\n\tdefault:\n\t\tpanic(\"unknown stash type\")\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/token/Makefile",
    "content": "token_const.go: tokenfmt\n\t./$^ | gofmt > $@\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/token/README.markdown",
    "content": "# token\n--\n    import \"github.com/robertkrimen/otto/token\"\n\nPackage token defines constants representing the lexical tokens of JavaScript\n(ECMA5).\n\n## Usage\n\n```go\nconst (\n\tILLEGAL\n\tEOF\n\tCOMMENT\n\tKEYWORD\n\n\tSTRING\n\tBOOLEAN\n\tNULL\n\tNUMBER\n\tIDENTIFIER\n\n\tPLUS      // +\n\tMINUS     // -\n\tMULTIPLY  // *\n\tSLASH     // /\n\tREMAINDER // %\n\n\tAND                  // &\n\tOR                   // |\n\tEXCLUSIVE_OR         // ^\n\tSHIFT_LEFT           // <<\n\tSHIFT_RIGHT          // >>\n\tUNSIGNED_SHIFT_RIGHT // >>>\n\tAND_NOT              // &^\n\n\tADD_ASSIGN       // +=\n\tSUBTRACT_ASSIGN  // -=\n\tMULTIPLY_ASSIGN  // *=\n\tQUOTIENT_ASSIGN  // /=\n\tREMAINDER_ASSIGN // %=\n\n\tAND_ASSIGN                  // &=\n\tOR_ASSIGN                   // |=\n\tEXCLUSIVE_OR_ASSIGN         // ^=\n\tSHIFT_LEFT_ASSIGN           // <<=\n\tSHIFT_RIGHT_ASSIGN          // >>=\n\tUNSIGNED_SHIFT_RIGHT_ASSIGN // >>>=\n\tAND_NOT_ASSIGN              // &^=\n\n\tLOGICAL_AND // &&\n\tLOGICAL_OR  // ||\n\tINCREMENT   // ++\n\tDECREMENT   // --\n\n\tEQUAL        // ==\n\tSTRICT_EQUAL // ===\n\tLESS         // <\n\tGREATER      // >\n\tASSIGN       // =\n\tNOT          // !\n\n\tBITWISE_NOT // ~\n\n\tNOT_EQUAL        // !=\n\tSTRICT_NOT_EQUAL // !==\n\tLESS_OR_EQUAL    // <=\n\tGREATER_OR_EQUAL // >=\n\n\tLEFT_PARENTHESIS // (\n\tLEFT_BRACKET     // [\n\tLEFT_BRACE       // {\n\tCOMMA            // ,\n\tPERIOD           // .\n\n\tRIGHT_PARENTHESIS // )\n\tRIGHT_BRACKET     // ]\n\tRIGHT_BRACE       // }\n\tSEMICOLON         // ;\n\tCOLON             // :\n\tQUESTION_MARK     // ?\n\n\tIF\n\tIN\n\tDO\n\n\tVAR\n\tFOR\n\tNEW\n\tTRY\n\n\tTHIS\n\tELSE\n\tCASE\n\tVOID\n\tWITH\n\n\tWHILE\n\tBREAK\n\tCATCH\n\tTHROW\n\n\tRETURN\n\tTYPEOF\n\tDELETE\n\tSWITCH\n\n\tDEFAULT\n\tFINALLY\n\n\tFUNCTION\n\tCONTINUE\n\tDEBUGGER\n\n\tINSTANCEOF\n)\n```\n\n#### type Token\n\n```go\ntype Token int\n```\n\nToken is the set of lexical tokens in JavaScript (ECMA5).\n\n#### func  IsKeyword\n\n```go\nfunc IsKeyword(literal string) (Token, bool)\n```\nIsKeyword returns the keyword token if literal is a keyword, a KEYWORD token if\nthe literal is a future keyword (const, let, class, super, ...), or 0 if the\nliteral is not a keyword.\n\nIf the literal is a keyword, IsKeyword returns a second value indicating if the\nliteral is considered a future keyword in strict-mode only.\n\n7.6.1.2 Future Reserved Words:\n\n    const\n    class\n    enum\n    export\n    extends\n    import\n    super\n\n7.6.1.2 Future Reserved Words (strict):\n\n    implements\n    interface\n    let\n    package\n    private\n    protected\n    public\n    static\n\n#### func (Token) String\n\n```go\nfunc (tkn Token) String() string\n```\nString returns the string corresponding to the token. For operators, delimiters,\nand keywords the string is the actual token string (e.g., for the token PLUS,\nthe String() is \"+\"). For all other tokens the string corresponds to the token\nname (e.g. for the token IDENTIFIER, the string is \"IDENTIFIER\").\n\n--\n**godocdown** http://github.com/robertkrimen/godocdown\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/token/token.go",
    "content": "// Package token defines constants representing the lexical tokens of JavaScript (ECMA5).\npackage token\n\nimport (\n\t\"strconv\"\n)\n\n// Token is the set of lexical tokens in JavaScript (ECMA5).\ntype Token int\n\n// String returns the string corresponding to the token.\n// For operators, delimiters, and keywords the string is the actual\n// token string (e.g., for the token PLUS, the String() is\n// \"+\"). For all other tokens the string corresponds to the token\n// name (e.g. for the token IDENTIFIER, the string is \"IDENTIFIER\").\n//\nfunc (tkn Token) String() string {\n\tif 0 == tkn {\n\t\treturn \"UNKNOWN\"\n\t}\n\tif tkn < Token(len(token2string)) {\n\t\treturn token2string[tkn]\n\t}\n\treturn \"token(\" + strconv.Itoa(int(tkn)) + \")\"\n}\n\n// This is not used for anything\nfunc (tkn Token) precedence(in bool) int {\n\n\tswitch tkn {\n\tcase LOGICAL_OR:\n\t\treturn 1\n\n\tcase LOGICAL_AND:\n\t\treturn 2\n\n\tcase OR, OR_ASSIGN:\n\t\treturn 3\n\n\tcase EXCLUSIVE_OR:\n\t\treturn 4\n\n\tcase AND, AND_ASSIGN, AND_NOT, AND_NOT_ASSIGN:\n\t\treturn 5\n\n\tcase EQUAL,\n\t\tNOT_EQUAL,\n\t\tSTRICT_EQUAL,\n\t\tSTRICT_NOT_EQUAL:\n\t\treturn 6\n\n\tcase LESS, GREATER, LESS_OR_EQUAL, GREATER_OR_EQUAL, INSTANCEOF:\n\t\treturn 7\n\n\tcase IN:\n\t\tif in {\n\t\t\treturn 7\n\t\t}\n\t\treturn 0\n\n\tcase SHIFT_LEFT, SHIFT_RIGHT, UNSIGNED_SHIFT_RIGHT:\n\t\tfallthrough\n\tcase SHIFT_LEFT_ASSIGN, SHIFT_RIGHT_ASSIGN, UNSIGNED_SHIFT_RIGHT_ASSIGN:\n\t\treturn 8\n\n\tcase PLUS, MINUS, ADD_ASSIGN, SUBTRACT_ASSIGN:\n\t\treturn 9\n\n\tcase MULTIPLY, SLASH, REMAINDER, MULTIPLY_ASSIGN, QUOTIENT_ASSIGN, REMAINDER_ASSIGN:\n\t\treturn 11\n\t}\n\treturn 0\n}\n\ntype _keyword struct {\n\ttoken         Token\n\tfutureKeyword bool\n\tstrict        bool\n}\n\n// IsKeyword returns the keyword token if literal is a keyword, a KEYWORD token\n// if the literal is a future keyword (const, let, class, super, ...), or 0 if the literal is not a keyword.\n//\n// If the literal is a keyword, IsKeyword returns a second value indicating if the literal\n// is considered a future keyword in strict-mode only.\n//\n// 7.6.1.2 Future Reserved Words:\n//\n//       const\n//       class\n//       enum\n//       export\n//       extends\n//       import\n//       super\n//\n// 7.6.1.2 Future Reserved Words (strict):\n//\n//       implements\n//       interface\n//       let\n//       package\n//       private\n//       protected\n//       public\n//       static\n//\nfunc IsKeyword(literal string) (Token, bool) {\n\tif keyword, exists := keywordTable[literal]; exists {\n\t\tif keyword.futureKeyword {\n\t\t\treturn KEYWORD, keyword.strict\n\t\t}\n\t\treturn keyword.token, false\n\t}\n\treturn 0, false\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/token/token_const.go",
    "content": "package token\n\nconst (\n\t_ Token = iota\n\n\tILLEGAL\n\tEOF\n\tCOMMENT\n\tKEYWORD\n\n\tSTRING\n\tBOOLEAN\n\tNULL\n\tNUMBER\n\tIDENTIFIER\n\n\tPLUS      // +\n\tMINUS     // -\n\tMULTIPLY  // *\n\tSLASH     // /\n\tREMAINDER // %\n\n\tAND                  // &\n\tOR                   // |\n\tEXCLUSIVE_OR         // ^\n\tSHIFT_LEFT           // <<\n\tSHIFT_RIGHT          // >>\n\tUNSIGNED_SHIFT_RIGHT // >>>\n\tAND_NOT              // &^\n\n\tADD_ASSIGN       // +=\n\tSUBTRACT_ASSIGN  // -=\n\tMULTIPLY_ASSIGN  // *=\n\tQUOTIENT_ASSIGN  // /=\n\tREMAINDER_ASSIGN // %=\n\n\tAND_ASSIGN                  // &=\n\tOR_ASSIGN                   // |=\n\tEXCLUSIVE_OR_ASSIGN         // ^=\n\tSHIFT_LEFT_ASSIGN           // <<=\n\tSHIFT_RIGHT_ASSIGN          // >>=\n\tUNSIGNED_SHIFT_RIGHT_ASSIGN // >>>=\n\tAND_NOT_ASSIGN              // &^=\n\n\tLOGICAL_AND // &&\n\tLOGICAL_OR  // ||\n\tINCREMENT   // ++\n\tDECREMENT   // --\n\n\tEQUAL        // ==\n\tSTRICT_EQUAL // ===\n\tLESS         // <\n\tGREATER      // >\n\tASSIGN       // =\n\tNOT          // !\n\n\tBITWISE_NOT // ~\n\n\tNOT_EQUAL        // !=\n\tSTRICT_NOT_EQUAL // !==\n\tLESS_OR_EQUAL    // <=\n\tGREATER_OR_EQUAL // >=\n\n\tLEFT_PARENTHESIS // (\n\tLEFT_BRACKET     // [\n\tLEFT_BRACE       // {\n\tCOMMA            // ,\n\tPERIOD           // .\n\n\tRIGHT_PARENTHESIS // )\n\tRIGHT_BRACKET     // ]\n\tRIGHT_BRACE       // }\n\tSEMICOLON         // ;\n\tCOLON             // :\n\tQUESTION_MARK     // ?\n\n\tfirstKeyword\n\tIF\n\tIN\n\tDO\n\n\tVAR\n\tFOR\n\tNEW\n\tTRY\n\n\tTHIS\n\tELSE\n\tCASE\n\tVOID\n\tWITH\n\n\tWHILE\n\tBREAK\n\tCATCH\n\tTHROW\n\n\tRETURN\n\tTYPEOF\n\tDELETE\n\tSWITCH\n\n\tDEFAULT\n\tFINALLY\n\n\tFUNCTION\n\tCONTINUE\n\tDEBUGGER\n\n\tINSTANCEOF\n\tlastKeyword\n)\n\nvar token2string = [...]string{\n\tILLEGAL:                     \"ILLEGAL\",\n\tEOF:                         \"EOF\",\n\tCOMMENT:                     \"COMMENT\",\n\tKEYWORD:                     \"KEYWORD\",\n\tSTRING:                      \"STRING\",\n\tBOOLEAN:                     \"BOOLEAN\",\n\tNULL:                        \"NULL\",\n\tNUMBER:                      \"NUMBER\",\n\tIDENTIFIER:                  \"IDENTIFIER\",\n\tPLUS:                        \"+\",\n\tMINUS:                       \"-\",\n\tMULTIPLY:                    \"*\",\n\tSLASH:                       \"/\",\n\tREMAINDER:                   \"%\",\n\tAND:                         \"&\",\n\tOR:                          \"|\",\n\tEXCLUSIVE_OR:                \"^\",\n\tSHIFT_LEFT:                  \"<<\",\n\tSHIFT_RIGHT:                 \">>\",\n\tUNSIGNED_SHIFT_RIGHT:        \">>>\",\n\tAND_NOT:                     \"&^\",\n\tADD_ASSIGN:                  \"+=\",\n\tSUBTRACT_ASSIGN:             \"-=\",\n\tMULTIPLY_ASSIGN:             \"*=\",\n\tQUOTIENT_ASSIGN:             \"/=\",\n\tREMAINDER_ASSIGN:            \"%=\",\n\tAND_ASSIGN:                  \"&=\",\n\tOR_ASSIGN:                   \"|=\",\n\tEXCLUSIVE_OR_ASSIGN:         \"^=\",\n\tSHIFT_LEFT_ASSIGN:           \"<<=\",\n\tSHIFT_RIGHT_ASSIGN:          \">>=\",\n\tUNSIGNED_SHIFT_RIGHT_ASSIGN: \">>>=\",\n\tAND_NOT_ASSIGN:              \"&^=\",\n\tLOGICAL_AND:                 \"&&\",\n\tLOGICAL_OR:                  \"||\",\n\tINCREMENT:                   \"++\",\n\tDECREMENT:                   \"--\",\n\tEQUAL:                       \"==\",\n\tSTRICT_EQUAL:                \"===\",\n\tLESS:                        \"<\",\n\tGREATER:                     \">\",\n\tASSIGN:                      \"=\",\n\tNOT:                         \"!\",\n\tBITWISE_NOT:                 \"~\",\n\tNOT_EQUAL:                   \"!=\",\n\tSTRICT_NOT_EQUAL:            \"!==\",\n\tLESS_OR_EQUAL:               \"<=\",\n\tGREATER_OR_EQUAL:            \">=\",\n\tLEFT_PARENTHESIS:            \"(\",\n\tLEFT_BRACKET:                \"[\",\n\tLEFT_BRACE:                  \"{\",\n\tCOMMA:                       \",\",\n\tPERIOD:                      \".\",\n\tRIGHT_PARENTHESIS:           \")\",\n\tRIGHT_BRACKET:               \"]\",\n\tRIGHT_BRACE:                 \"}\",\n\tSEMICOLON:                   \";\",\n\tCOLON:                       \":\",\n\tQUESTION_MARK:               \"?\",\n\tIF:                          \"if\",\n\tIN:                          \"in\",\n\tDO:                          \"do\",\n\tVAR:                         \"var\",\n\tFOR:                         \"for\",\n\tNEW:                         \"new\",\n\tTRY:                         \"try\",\n\tTHIS:                        \"this\",\n\tELSE:                        \"else\",\n\tCASE:                        \"case\",\n\tVOID:                        \"void\",\n\tWITH:                        \"with\",\n\tWHILE:                       \"while\",\n\tBREAK:                       \"break\",\n\tCATCH:                       \"catch\",\n\tTHROW:                       \"throw\",\n\tRETURN:                      \"return\",\n\tTYPEOF:                      \"typeof\",\n\tDELETE:                      \"delete\",\n\tSWITCH:                      \"switch\",\n\tDEFAULT:                     \"default\",\n\tFINALLY:                     \"finally\",\n\tFUNCTION:                    \"function\",\n\tCONTINUE:                    \"continue\",\n\tDEBUGGER:                    \"debugger\",\n\tINSTANCEOF:                  \"instanceof\",\n}\n\nvar keywordTable = map[string]_keyword{\n\t\"if\": _keyword{\n\t\ttoken: IF,\n\t},\n\t\"in\": _keyword{\n\t\ttoken: IN,\n\t},\n\t\"do\": _keyword{\n\t\ttoken: DO,\n\t},\n\t\"var\": _keyword{\n\t\ttoken: VAR,\n\t},\n\t\"for\": _keyword{\n\t\ttoken: FOR,\n\t},\n\t\"new\": _keyword{\n\t\ttoken: NEW,\n\t},\n\t\"try\": _keyword{\n\t\ttoken: TRY,\n\t},\n\t\"this\": _keyword{\n\t\ttoken: THIS,\n\t},\n\t\"else\": _keyword{\n\t\ttoken: ELSE,\n\t},\n\t\"case\": _keyword{\n\t\ttoken: CASE,\n\t},\n\t\"void\": _keyword{\n\t\ttoken: VOID,\n\t},\n\t\"with\": _keyword{\n\t\ttoken: WITH,\n\t},\n\t\"while\": _keyword{\n\t\ttoken: WHILE,\n\t},\n\t\"break\": _keyword{\n\t\ttoken: BREAK,\n\t},\n\t\"catch\": _keyword{\n\t\ttoken: CATCH,\n\t},\n\t\"throw\": _keyword{\n\t\ttoken: THROW,\n\t},\n\t\"return\": _keyword{\n\t\ttoken: RETURN,\n\t},\n\t\"typeof\": _keyword{\n\t\ttoken: TYPEOF,\n\t},\n\t\"delete\": _keyword{\n\t\ttoken: DELETE,\n\t},\n\t\"switch\": _keyword{\n\t\ttoken: SWITCH,\n\t},\n\t\"default\": _keyword{\n\t\ttoken: DEFAULT,\n\t},\n\t\"finally\": _keyword{\n\t\ttoken: FINALLY,\n\t},\n\t\"function\": _keyword{\n\t\ttoken: FUNCTION,\n\t},\n\t\"continue\": _keyword{\n\t\ttoken: CONTINUE,\n\t},\n\t\"debugger\": _keyword{\n\t\ttoken: DEBUGGER,\n\t},\n\t\"instanceof\": _keyword{\n\t\ttoken: INSTANCEOF,\n\t},\n\t\"const\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t},\n\t\"class\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t},\n\t\"enum\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t},\n\t\"export\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t},\n\t\"extends\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t},\n\t\"import\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t},\n\t\"super\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t},\n\t\"implements\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n\t\"interface\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n\t\"let\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n\t\"package\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n\t\"private\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n\t\"protected\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n\t\"public\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n\t\"static\": _keyword{\n\t\ttoken:         KEYWORD,\n\t\tfutureKeyword: true,\n\t\tstrict:        true,\n\t},\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/token/tokenfmt",
    "content": "#!/usr/bin/env perl\n\nuse strict;\nuse warnings;\n\nmy (%token, @order, @keywords);\n\n{\n    my $keywords;\n    my @const;\n    push @const, <<_END_;\npackage token\n\nconst(\n    _ Token = iota\n_END_\n\n    for (split m/\\n/, <<_END_) {\nILLEGAL\nEOF\nCOMMENT\nKEYWORD\n\nSTRING\nBOOLEAN\nNULL\nNUMBER\nIDENTIFIER\n\nPLUS                            +\nMINUS                           -\nMULTIPLY                        *\nSLASH                           /\nREMAINDER                       %\n\nAND                             &\nOR                              |\nEXCLUSIVE_OR                    ^\nSHIFT_LEFT                      <<\nSHIFT_RIGHT                     >>\nUNSIGNED_SHIFT_RIGHT            >>>\nAND_NOT                         &^\n\nADD_ASSIGN                     +=\nSUBTRACT_ASSIGN                -=\nMULTIPLY_ASSIGN                *=\nQUOTIENT_ASSIGN                /=\nREMAINDER_ASSIGN               %=\n\nAND_ASSIGN                     &=\nOR_ASSIGN                      |=\nEXCLUSIVE_OR_ASSIGN            ^=\nSHIFT_LEFT_ASSIGN              <<=\nSHIFT_RIGHT_ASSIGN             >>=\nUNSIGNED_SHIFT_RIGHT_ASSIGN    >>>=\nAND_NOT_ASSIGN                 &^=\n\nLOGICAL_AND                    &&\nLOGICAL_OR                     ||\nINCREMENT                      ++\nDECREMENT                      --\n\nEQUAL                          ==\nSTRICT_EQUAL                   ===\nLESS                           <\nGREATER                        >\nASSIGN                         =\nNOT                            !\n\nBITWISE_NOT                    ~\n\nNOT_EQUAL                      !=\nSTRICT_NOT_EQUAL               !==\nLESS_OR_EQUAL                  <=\nGREATER_OR_EQUAL               <=\n\nLEFT_PARENTHESIS               (\nLEFT_BRACKET                   [\nLEFT_BRACE                     {\nCOMMA                          ,\nPERIOD                         .\n\nRIGHT_PARENTHESIS              )\nRIGHT_BRACKET                  ]\nRIGHT_BRACE                    }\nSEMICOLON                      ;\nCOLON                          :\nQUESTION_MARK                  ?\n\nfirstKeyword\nIF\nIN\nDO\n\nVAR\nFOR\nNEW\nTRY\n\nTHIS\nELSE\nCASE\nVOID\nWITH\n\nWHILE\nBREAK\nCATCH\nTHROW\n\nRETURN\nTYPEOF\nDELETE\nSWITCH\n\nDEFAULT\nFINALLY\n\nFUNCTION\nCONTINUE\nDEBUGGER\n\nINSTANCEOF\nlastKeyword\n_END_\n        chomp;\n\n        next if m/^\\s*#/;\n\n        my ($name, $symbol) = m/(\\w+)\\s*(\\S+)?/;\n\n        if (defined $symbol) {\n            push @order, $name;\n            push @const, \"$name // $symbol\";\n            $token{$name} = $symbol;\n        } elsif (defined $name) {\n            $keywords ||= $name eq 'firstKeyword';\n\n            push @const, $name;\n            #$const[-1] .= \" Token = iota\" if 2 == @const;\n            if ($name =~ m/^([A-Z]+)/) {\n                push @keywords, $name if $keywords;\n                push @order, $name;\n                if ($token{SEMICOLON}) {\n                    $token{$name} = lc $1;\n                } else {\n                    $token{$name} = $name;\n                }\n            }\n        } else {\n            push @const, \"\";\n        }\n\n    }\n    push @const, \")\";\n    print join \"\\n\", @const, \"\";\n}\n\n{\n    print <<_END_;\n\nvar token2string = [...]string{\n_END_\n    for my $name (@order) {\n        print \"$name: \\\"$token{$name}\\\",\\n\";\n    }\n    print <<_END_;\n}\n_END_\n\n    print <<_END_;\n\nvar keywordTable = map[string]_keyword{\n_END_\n    for my $name (@keywords) {\n        print <<_END_\n\t\t\t\"@{[ lc $name ]}\": _keyword{\n\t\t\t\ttoken: $name,\n\t\t\t},\n_END_\n    }\n\n    for my $name (qw/\n        const\n        class\n        enum\n        export\n        extends\n        import\n        super\n        /) {\n        print <<_END_\n\t\t\t\"$name\": _keyword{\n\t\t\t\ttoken: KEYWORD,\n                futureKeyword: true,\n\t\t\t},\n_END_\n    }\n\n    for my $name (qw/\n        implements\n        interface\n        let\n        package\n        private\n        protected\n        public\n        static\n        /) {\n        print <<_END_\n\t\t\t\"$name\": _keyword{\n\t\t\t\ttoken: KEYWORD,\n                futureKeyword: true,\n                strict: true,\n\t\t\t},\n_END_\n    }\n\n    print <<_END_;\n}\n_END_\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_arguments.go",
    "content": "package otto\n\nimport (\n\t\"strconv\"\n)\n\nfunc (runtime *_runtime) newArgumentsObject(indexOfParameterName []string, stash _stash, length int) *_object {\n\tself := runtime.newClassObject(\"Arguments\")\n\n\tfor index, _ := range indexOfParameterName {\n\t\tname := strconv.FormatInt(int64(index), 10)\n\t\tobjectDefineOwnProperty(self, name, _property{Value{}, 0111}, false)\n\t}\n\n\tself.objectClass = _classArguments\n\tself.value = _argumentsObject{\n\t\tindexOfParameterName: indexOfParameterName,\n\t\tstash:                stash,\n\t}\n\n\tself.prototype = runtime.global.ObjectPrototype\n\n\tself.defineProperty(\"length\", toValue_int(length), 0101, false)\n\n\treturn self\n}\n\ntype _argumentsObject struct {\n\tindexOfParameterName []string\n\t// function(abc, def, ghi)\n\t// indexOfParameterName[0] = \"abc\"\n\t// indexOfParameterName[1] = \"def\"\n\t// indexOfParameterName[2] = \"ghi\"\n\t// ...\n\tstash _stash\n}\n\nfunc (in _argumentsObject) clone(clone *_clone) _argumentsObject {\n\tindexOfParameterName := make([]string, len(in.indexOfParameterName))\n\tcopy(indexOfParameterName, in.indexOfParameterName)\n\treturn _argumentsObject{\n\t\tindexOfParameterName,\n\t\tclone.stash(in.stash),\n\t}\n}\n\nfunc (self _argumentsObject) get(name string) (Value, bool) {\n\tindex := stringToArrayIndex(name)\n\tif index >= 0 && index < int64(len(self.indexOfParameterName)) {\n\t\tname := self.indexOfParameterName[index]\n\t\tif name == \"\" {\n\t\t\treturn Value{}, false\n\t\t}\n\t\treturn self.stash.getBinding(name, false), true\n\t}\n\treturn Value{}, false\n}\n\nfunc (self _argumentsObject) put(name string, value Value) {\n\tindex := stringToArrayIndex(name)\n\tname = self.indexOfParameterName[index]\n\tself.stash.setBinding(name, value, false)\n}\n\nfunc (self _argumentsObject) delete(name string) {\n\tindex := stringToArrayIndex(name)\n\tself.indexOfParameterName[index] = \"\"\n}\n\nfunc argumentsGet(self *_object, name string) Value {\n\tif value, exists := self.value.(_argumentsObject).get(name); exists {\n\t\treturn value\n\t}\n\treturn objectGet(self, name)\n}\n\nfunc argumentsGetOwnProperty(self *_object, name string) *_property {\n\tproperty := objectGetOwnProperty(self, name)\n\tif value, exists := self.value.(_argumentsObject).get(name); exists {\n\t\tproperty.value = value\n\t}\n\treturn property\n}\n\nfunc argumentsDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool {\n\tif _, exists := self.value.(_argumentsObject).get(name); exists {\n\t\tif !objectDefineOwnProperty(self, name, descriptor, false) {\n\t\t\treturn self.runtime.typeErrorResult(throw)\n\t\t}\n\t\tif value, valid := descriptor.value.(Value); valid {\n\t\t\tself.value.(_argumentsObject).put(name, value)\n\t\t}\n\t\treturn true\n\t}\n\treturn objectDefineOwnProperty(self, name, descriptor, throw)\n}\n\nfunc argumentsDelete(self *_object, name string, throw bool) bool {\n\tif !objectDelete(self, name, throw) {\n\t\treturn false\n\t}\n\tif _, exists := self.value.(_argumentsObject).get(name); exists {\n\t\tself.value.(_argumentsObject).delete(name)\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_array.go",
    "content": "package otto\n\nimport (\n\t\"strconv\"\n)\n\nfunc (runtime *_runtime) newArrayObject(length uint32) *_object {\n\tself := runtime.newObject()\n\tself.class = \"Array\"\n\tself.defineProperty(\"length\", toValue_uint32(length), 0100, false)\n\tself.objectClass = _classArray\n\treturn self\n}\n\nfunc isArray(object *_object) bool {\n\treturn object != nil && (object.class == \"Array\" || object.class == \"GoArray\")\n}\n\nfunc objectLength(object *_object) uint32 {\n\tif object == nil {\n\t\treturn 0\n\t}\n\tswitch object.class {\n\tcase \"Array\":\n\t\treturn object.get(\"length\").value.(uint32)\n\tcase \"String\":\n\t\treturn uint32(object.get(\"length\").value.(int))\n\tcase \"GoArray\":\n\t\treturn uint32(object.get(\"length\").value.(int))\n\t}\n\treturn 0\n}\n\nfunc arrayUint32(rt *_runtime, value Value) uint32 {\n\tnm := value.number()\n\tif nm.kind != numberInteger || !isUint32(nm.int64) {\n\t\t// FIXME\n\t\tpanic(rt.panicRangeError())\n\t}\n\treturn uint32(nm.int64)\n}\n\nfunc arrayDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool {\n\tlengthProperty := self.getOwnProperty(\"length\")\n\tlengthValue, valid := lengthProperty.value.(Value)\n\tif !valid {\n\t\tpanic(\"Array.length != Value{}\")\n\t}\n\tlength := lengthValue.value.(uint32)\n\tif name == \"length\" {\n\t\tif descriptor.value == nil {\n\t\t\treturn objectDefineOwnProperty(self, name, descriptor, throw)\n\t\t}\n\t\tnewLengthValue, isValue := descriptor.value.(Value)\n\t\tif !isValue {\n\t\t\tpanic(self.runtime.panicTypeError())\n\t\t}\n\t\tnewLength := arrayUint32(self.runtime, newLengthValue)\n\t\tdescriptor.value = toValue_uint32(newLength)\n\t\tif newLength > length {\n\t\t\treturn objectDefineOwnProperty(self, name, descriptor, throw)\n\t\t}\n\t\tif !lengthProperty.writable() {\n\t\t\tgoto Reject\n\t\t}\n\t\tnewWritable := true\n\t\tif descriptor.mode&0700 == 0 {\n\t\t\t// If writable is off\n\t\t\tnewWritable = false\n\t\t\tdescriptor.mode |= 0100\n\t\t}\n\t\tif !objectDefineOwnProperty(self, name, descriptor, throw) {\n\t\t\treturn false\n\t\t}\n\t\tfor newLength < length {\n\t\t\tlength--\n\t\t\tif !self.delete(strconv.FormatInt(int64(length), 10), false) {\n\t\t\t\tdescriptor.value = toValue_uint32(length + 1)\n\t\t\t\tif !newWritable {\n\t\t\t\t\tdescriptor.mode &= 0077\n\t\t\t\t}\n\t\t\t\tobjectDefineOwnProperty(self, name, descriptor, false)\n\t\t\t\tgoto Reject\n\t\t\t}\n\t\t}\n\t\tif !newWritable {\n\t\t\tdescriptor.mode &= 0077\n\t\t\tobjectDefineOwnProperty(self, name, descriptor, false)\n\t\t}\n\t} else if index := stringToArrayIndex(name); index >= 0 {\n\t\tif index >= int64(length) && !lengthProperty.writable() {\n\t\t\tgoto Reject\n\t\t}\n\t\tif !objectDefineOwnProperty(self, strconv.FormatInt(index, 10), descriptor, false) {\n\t\t\tgoto Reject\n\t\t}\n\t\tif index >= int64(length) {\n\t\t\tlengthProperty.value = toValue_uint32(uint32(index + 1))\n\t\t\tobjectDefineOwnProperty(self, \"length\", *lengthProperty, false)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn objectDefineOwnProperty(self, name, descriptor, throw)\nReject:\n\tif throw {\n\t\tpanic(self.runtime.panicTypeError())\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_boolean.go",
    "content": "package otto\n\nimport (\n\t\"strconv\"\n)\n\nfunc (runtime *_runtime) newBooleanObject(value Value) *_object {\n\treturn runtime.newPrimitiveObject(\"Boolean\", toValue_bool(value.bool()))\n}\n\nfunc booleanToString(value bool) string {\n\treturn strconv.FormatBool(value)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_date.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"regexp\"\n\tTime \"time\"\n)\n\ntype _dateObject struct {\n\ttime  Time.Time // Time from the \"time\" package, a cached version of time\n\tepoch int64\n\tvalue Value\n\tisNaN bool\n}\n\nvar (\n\tinvalidDateObject = _dateObject{\n\t\ttime:  Time.Time{},\n\t\tepoch: -1,\n\t\tvalue: NaNValue(),\n\t\tisNaN: true,\n\t}\n)\n\ntype _ecmaTime struct {\n\tyear        int\n\tmonth       int\n\tday         int\n\thour        int\n\tminute      int\n\tsecond      int\n\tmillisecond int\n\tlocation    *Time.Location // Basically, either local or UTC\n}\n\nfunc ecmaTime(goTime Time.Time) _ecmaTime {\n\treturn _ecmaTime{\n\t\tgoTime.Year(),\n\t\tdateFromGoMonth(goTime.Month()),\n\t\tgoTime.Day(),\n\t\tgoTime.Hour(),\n\t\tgoTime.Minute(),\n\t\tgoTime.Second(),\n\t\tgoTime.Nanosecond() / (100 * 100 * 100),\n\t\tgoTime.Location(),\n\t}\n}\n\nfunc (self *_ecmaTime) goTime() Time.Time {\n\treturn Time.Date(\n\t\tself.year,\n\t\tdateToGoMonth(self.month),\n\t\tself.day,\n\t\tself.hour,\n\t\tself.minute,\n\t\tself.second,\n\t\tself.millisecond*(100*100*100),\n\t\tself.location,\n\t)\n}\n\nfunc (self *_dateObject) Time() Time.Time {\n\treturn self.time\n}\n\nfunc (self *_dateObject) Epoch() int64 {\n\treturn self.epoch\n}\n\nfunc (self *_dateObject) Value() Value {\n\treturn self.value\n}\n\n// FIXME A date should only be in the range of -100,000,000 to +100,000,000 (1970): 15.9.1.1\nfunc (self *_dateObject) SetNaN() {\n\tself.time = Time.Time{}\n\tself.epoch = -1\n\tself.value = NaNValue()\n\tself.isNaN = true\n}\n\nfunc (self *_dateObject) SetTime(time Time.Time) {\n\tself.Set(timeToEpoch(time))\n}\n\nfunc epoch2dateObject(epoch float64) _dateObject {\n\tdate := _dateObject{}\n\tdate.Set(epoch)\n\treturn date\n}\n\nfunc (self *_dateObject) Set(epoch float64) {\n\t// epoch\n\tself.epoch = epochToInteger(epoch)\n\n\t// time\n\ttime, err := epochToTime(epoch)\n\tself.time = time // Is either a valid time, or the zero-value for time.Time\n\n\t// value & isNaN\n\tif err != nil {\n\t\tself.isNaN = true\n\t\tself.epoch = -1\n\t\tself.value = NaNValue()\n\t} else {\n\t\tself.value = toValue_int64(self.epoch)\n\t}\n}\n\nfunc epochToInteger(value float64) int64 {\n\tif value > 0 {\n\t\treturn int64(math.Floor(value))\n\t}\n\treturn int64(math.Ceil(value))\n}\n\nfunc epochToTime(value float64) (time Time.Time, err error) {\n\tepochWithMilli := value\n\tif math.IsNaN(epochWithMilli) || math.IsInf(epochWithMilli, 0) {\n\t\terr = fmt.Errorf(\"Invalid time %v\", value)\n\t\treturn\n\t}\n\n\tepoch := int64(epochWithMilli / 1000)\n\tmilli := int64(epochWithMilli) % 1000\n\n\ttime = Time.Unix(int64(epoch), milli*1000000).UTC()\n\treturn\n}\n\nfunc timeToEpoch(time Time.Time) float64 {\n\treturn float64(time.UnixNano() / (1000 * 1000))\n}\n\nfunc (runtime *_runtime) newDateObject(epoch float64) *_object {\n\tself := runtime.newObject()\n\tself.class = \"Date\"\n\n\t// FIXME This is ugly...\n\tdate := _dateObject{}\n\tdate.Set(epoch)\n\tself.value = date\n\treturn self\n}\n\nfunc (self *_object) dateValue() _dateObject {\n\tvalue, _ := self.value.(_dateObject)\n\treturn value\n}\n\nfunc dateObjectOf(rt *_runtime, _dateObject *_object) _dateObject {\n\tif _dateObject == nil || _dateObject.class != \"Date\" {\n\t\tpanic(rt.panicTypeError())\n\t}\n\treturn _dateObject.dateValue()\n}\n\n// JavaScript is 0-based, Go is 1-based (15.9.1.4)\nfunc dateToGoMonth(month int) Time.Month {\n\treturn Time.Month(month + 1)\n}\n\nfunc dateFromGoMonth(month Time.Month) int {\n\treturn int(month) - 1\n}\n\n// Both JavaScript & Go are 0-based (Sunday == 0)\nfunc dateToGoDay(day int) Time.Weekday {\n\treturn Time.Weekday(day)\n}\n\nfunc dateFromGoDay(day Time.Weekday) int {\n\treturn int(day)\n}\n\nfunc newDateTime(argumentList []Value, location *Time.Location) (epoch float64) {\n\n\tpick := func(index int, default_ float64) (float64, bool) {\n\t\tif index >= len(argumentList) {\n\t\t\treturn default_, false\n\t\t}\n\t\tvalue := argumentList[index].float64()\n\t\tif math.IsNaN(value) || math.IsInf(value, 0) {\n\t\t\treturn 0, true\n\t\t}\n\t\treturn value, false\n\t}\n\n\tif len(argumentList) >= 2 { // 2-argument, 3-argument, ...\n\t\tvar year, month, day, hour, minute, second, millisecond float64\n\t\tvar invalid bool\n\t\tif year, invalid = pick(0, 1900.0); invalid {\n\t\t\tgoto INVALID\n\t\t}\n\t\tif month, invalid = pick(1, 0.0); invalid {\n\t\t\tgoto INVALID\n\t\t}\n\t\tif day, invalid = pick(2, 1.0); invalid {\n\t\t\tgoto INVALID\n\t\t}\n\t\tif hour, invalid = pick(3, 0.0); invalid {\n\t\t\tgoto INVALID\n\t\t}\n\t\tif minute, invalid = pick(4, 0.0); invalid {\n\t\t\tgoto INVALID\n\t\t}\n\t\tif second, invalid = pick(5, 0.0); invalid {\n\t\t\tgoto INVALID\n\t\t}\n\t\tif millisecond, invalid = pick(6, 0.0); invalid {\n\t\t\tgoto INVALID\n\t\t}\n\n\t\tif year >= 0 && year <= 99 {\n\t\t\tyear += 1900\n\t\t}\n\n\t\ttime := Time.Date(int(year), dateToGoMonth(int(month)), int(day), int(hour), int(minute), int(second), int(millisecond)*1000*1000, location)\n\t\treturn timeToEpoch(time)\n\n\t} else if len(argumentList) == 0 { // 0-argument\n\t\ttime := Time.Now().UTC()\n\t\treturn timeToEpoch(time)\n\t} else { // 1-argument\n\t\tvalue := valueOfArrayIndex(argumentList, 0)\n\t\tvalue = toPrimitive(value)\n\t\tif value.IsString() {\n\t\t\treturn dateParse(value.string())\n\t\t}\n\n\t\treturn value.float64()\n\t}\n\nINVALID:\n\tepoch = math.NaN()\n\treturn\n}\n\nvar (\n\tdateLayoutList = []string{\n\t\t\"2006\",\n\t\t\"2006-01\",\n\t\t\"2006-01-02\",\n\n\t\t\"2006T15:04\",\n\t\t\"2006-01T15:04\",\n\t\t\"2006-01-02T15:04\",\n\n\t\t\"2006T15:04:05\",\n\t\t\"2006-01T15:04:05\",\n\t\t\"2006-01-02T15:04:05\",\n\n\t\t\"2006T15:04:05.000\",\n\t\t\"2006-01T15:04:05.000\",\n\t\t\"2006-01-02T15:04:05.000\",\n\n\t\t\"2006T15:04-0700\",\n\t\t\"2006-01T15:04-0700\",\n\t\t\"2006-01-02T15:04-0700\",\n\n\t\t\"2006T15:04:05-0700\",\n\t\t\"2006-01T15:04:05-0700\",\n\t\t\"2006-01-02T15:04:05-0700\",\n\n\t\t\"2006T15:04:05.000-0700\",\n\t\t\"2006-01T15:04:05.000-0700\",\n\t\t\"2006-01-02T15:04:05.000-0700\",\n\n\t\tTime.RFC1123,\n\t}\n\tmatchDateTimeZone = regexp.MustCompile(`^(.*)(?:(Z)|([\\+\\-]\\d{2}):(\\d{2}))$`)\n)\n\nfunc dateParse(date string) (epoch float64) {\n\t// YYYY-MM-DDTHH:mm:ss.sssZ\n\tvar time Time.Time\n\tvar err error\n\t{\n\t\tdate := date\n\t\tif match := matchDateTimeZone.FindStringSubmatch(date); match != nil {\n\t\t\tif match[2] == \"Z\" {\n\t\t\t\tdate = match[1] + \"+0000\"\n\t\t\t} else {\n\t\t\t\tdate = match[1] + match[3] + match[4]\n\t\t\t}\n\t\t}\n\t\tfor _, layout := range dateLayoutList {\n\t\t\ttime, err = Time.Parse(layout, date)\n\t\t\tif err == nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn math.NaN()\n\t}\n\treturn float64(time.UnixNano()) / (1000 * 1000) // UnixMilli()\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_error.go",
    "content": "package otto\n\nfunc (rt *_runtime) newErrorObject(name string, message Value, stackFramesToPop int) *_object {\n\tself := rt.newClassObject(\"Error\")\n\tif message.IsDefined() {\n\t\tmsg := message.string()\n\t\tself.defineProperty(\"message\", toValue_string(msg), 0111, false)\n\t\tself.value = newError(rt, name, stackFramesToPop, msg)\n\t} else {\n\t\tself.value = newError(rt, name, stackFramesToPop)\n\t}\n\n\tself.defineOwnProperty(\"stack\", _property{\n\t\tvalue: _propertyGetSet{\n\t\t\trt.newNativeFunction(\"get\", \"internal\", 0, func(FunctionCall) Value {\n\t\t\t\treturn toValue_string(self.value.(_error).formatWithStack())\n\t\t\t}),\n\t\t\t&_nilGetSetObject,\n\t\t},\n\t\tmode: modeConfigureMask & modeOnMask,\n\t}, false)\n\n\treturn self\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_function.go",
    "content": "package otto\n\n// _constructFunction\ntype _constructFunction func(*_object, []Value) Value\n\n// 13.2.2 [[Construct]]\nfunc defaultConstruct(fn *_object, argumentList []Value) Value {\n\tobject := fn.runtime.newObject()\n\tobject.class = \"Object\"\n\n\tprototype := fn.get(\"prototype\")\n\tif prototype.kind != valueObject {\n\t\tprototype = toValue_object(fn.runtime.global.ObjectPrototype)\n\t}\n\tobject.prototype = prototype._object()\n\n\tthis := toValue_object(object)\n\tvalue := fn.call(this, argumentList, false, nativeFrame)\n\tif value.kind == valueObject {\n\t\treturn value\n\t}\n\treturn this\n}\n\n// _nativeFunction\ntype _nativeFunction func(FunctionCall) Value\n\n// ===================== //\n// _nativeFunctionObject //\n// ===================== //\n\ntype _nativeFunctionObject struct {\n\tname      string\n\tfile      string\n\tline      int\n\tcall      _nativeFunction    // [[Call]]\n\tconstruct _constructFunction // [[Construct]]\n}\n\nfunc (runtime *_runtime) newNativeFunctionObject(name, file string, line int, native _nativeFunction, length int) *_object {\n\tself := runtime.newClassObject(\"Function\")\n\tself.value = _nativeFunctionObject{\n\t\tname:      name,\n\t\tfile:      file,\n\t\tline:      line,\n\t\tcall:      native,\n\t\tconstruct: defaultConstruct,\n\t}\n\tself.defineProperty(\"length\", toValue_int(length), 0000, false)\n\treturn self\n}\n\n// =================== //\n// _bindFunctionObject //\n// =================== //\n\ntype _bindFunctionObject struct {\n\ttarget       *_object\n\tthis         Value\n\targumentList []Value\n}\n\nfunc (runtime *_runtime) newBoundFunctionObject(target *_object, this Value, argumentList []Value) *_object {\n\tself := runtime.newClassObject(\"Function\")\n\tself.value = _bindFunctionObject{\n\t\ttarget:       target,\n\t\tthis:         this,\n\t\targumentList: argumentList,\n\t}\n\tlength := int(toInt32(target.get(\"length\")))\n\tlength -= len(argumentList)\n\tif length < 0 {\n\t\tlength = 0\n\t}\n\tself.defineProperty(\"length\", toValue_int(length), 0000, false)\n\tself.defineProperty(\"caller\", Value{}, 0000, false)    // TODO Should throw a TypeError\n\tself.defineProperty(\"arguments\", Value{}, 0000, false) // TODO Should throw a TypeError\n\treturn self\n}\n\n// [[Construct]]\nfunc (fn _bindFunctionObject) construct(argumentList []Value) Value {\n\tobject := fn.target\n\tswitch value := object.value.(type) {\n\tcase _nativeFunctionObject:\n\t\treturn value.construct(object, fn.argumentList)\n\tcase _nodeFunctionObject:\n\t\targumentList = append(fn.argumentList, argumentList...)\n\t\treturn object.construct(argumentList)\n\t}\n\tpanic(fn.target.runtime.panicTypeError())\n}\n\n// =================== //\n// _nodeFunctionObject //\n// =================== //\n\ntype _nodeFunctionObject struct {\n\tnode  *_nodeFunctionLiteral\n\tstash _stash\n}\n\nfunc (runtime *_runtime) newNodeFunctionObject(node *_nodeFunctionLiteral, stash _stash) *_object {\n\tself := runtime.newClassObject(\"Function\")\n\tself.value = _nodeFunctionObject{\n\t\tnode:  node,\n\t\tstash: stash,\n\t}\n\tself.defineProperty(\"length\", toValue_int(len(node.parameterList)), 0000, false)\n\treturn self\n}\n\n// ======= //\n// _object //\n// ======= //\n\nfunc (self *_object) isCall() bool {\n\tswitch fn := self.value.(type) {\n\tcase _nativeFunctionObject:\n\t\treturn fn.call != nil\n\tcase _bindFunctionObject:\n\t\treturn true\n\tcase _nodeFunctionObject:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (self *_object) call(this Value, argumentList []Value, eval bool, frame _frame) Value {\n\tswitch fn := self.value.(type) {\n\n\tcase _nativeFunctionObject:\n\t\t// Since eval is a native function, we only have to check for it here\n\t\tif eval {\n\t\t\teval = self == self.runtime.eval // If eval is true, then it IS a direct eval\n\t\t}\n\n\t\t// Enter a scope, name from the native object...\n\t\trt := self.runtime\n\t\tif rt.scope != nil && !eval {\n\t\t\trt.enterFunctionScope(rt.scope.lexical, this)\n\t\t\trt.scope.frame = _frame{\n\t\t\t\tnative:     true,\n\t\t\t\tnativeFile: fn.file,\n\t\t\t\tnativeLine: fn.line,\n\t\t\t\tcallee:     fn.name,\n\t\t\t\tfile:       nil,\n\t\t\t}\n\t\t\tdefer func() {\n\t\t\t\trt.leaveScope()\n\t\t\t}()\n\t\t}\n\n\t\treturn fn.call(FunctionCall{\n\t\t\truntime: self.runtime,\n\t\t\teval:    eval,\n\n\t\t\tThis:         this,\n\t\t\tArgumentList: argumentList,\n\t\t\tOtto:         self.runtime.otto,\n\t\t})\n\n\tcase _bindFunctionObject:\n\t\t// TODO Passthrough site, do not enter a scope\n\t\targumentList = append(fn.argumentList, argumentList...)\n\t\treturn fn.target.call(fn.this, argumentList, false, frame)\n\n\tcase _nodeFunctionObject:\n\t\trt := self.runtime\n\t\tstash := rt.enterFunctionScope(fn.stash, this)\n\t\trt.scope.frame = _frame{\n\t\t\tcallee: fn.node.name,\n\t\t\tfile:   fn.node.file,\n\t\t}\n\t\tdefer func() {\n\t\t\trt.leaveScope()\n\t\t}()\n\t\tcallValue := rt.cmpl_call_nodeFunction(self, stash, fn.node, this, argumentList)\n\t\tif value, valid := callValue.value.(_result); valid {\n\t\t\treturn value.value\n\t\t}\n\t\treturn callValue\n\t}\n\n\tpanic(self.runtime.panicTypeError(\"%v is not a function\", toValue_object(self)))\n}\n\nfunc (self *_object) construct(argumentList []Value) Value {\n\tswitch fn := self.value.(type) {\n\n\tcase _nativeFunctionObject:\n\t\tif fn.call == nil {\n\t\t\tpanic(self.runtime.panicTypeError(\"%v is not a function\", toValue_object(self)))\n\t\t}\n\t\tif fn.construct == nil {\n\t\t\tpanic(self.runtime.panicTypeError(\"%v is not a constructor\", toValue_object(self)))\n\t\t}\n\t\treturn fn.construct(self, argumentList)\n\n\tcase _bindFunctionObject:\n\t\treturn fn.construct(argumentList)\n\n\tcase _nodeFunctionObject:\n\t\treturn defaultConstruct(self, argumentList)\n\t}\n\n\tpanic(self.runtime.panicTypeError(\"%v is not a function\", toValue_object(self)))\n}\n\n// 15.3.5.3\nfunc (self *_object) hasInstance(of Value) bool {\n\tif !self.isCall() {\n\t\t// We should not have a hasInstance method\n\t\tpanic(self.runtime.panicTypeError())\n\t}\n\tif !of.IsObject() {\n\t\treturn false\n\t}\n\tprototype := self.get(\"prototype\")\n\tif !prototype.IsObject() {\n\t\tpanic(self.runtime.panicTypeError())\n\t}\n\tprototypeObject := prototype._object()\n\n\tvalue := of._object().prototype\n\tfor value != nil {\n\t\tif value == prototypeObject {\n\t\t\treturn true\n\t\t}\n\t\tvalue = value.prototype\n\t}\n\treturn false\n}\n\n// ============ //\n// FunctionCall //\n// ============ //\n\n// FunctionCall is an encapsulation of a JavaScript function call.\ntype FunctionCall struct {\n\truntime     *_runtime\n\t_thisObject *_object\n\teval        bool // This call is a direct call to eval\n\n\tThis         Value\n\tArgumentList []Value\n\tOtto         *Otto\n}\n\n// Argument will return the value of the argument at the given index.\n//\n// If no such argument exists, undefined is returned.\nfunc (self FunctionCall) Argument(index int) Value {\n\treturn valueOfArrayIndex(self.ArgumentList, index)\n}\n\nfunc (self FunctionCall) getArgument(index int) (Value, bool) {\n\treturn getValueOfArrayIndex(self.ArgumentList, index)\n}\n\nfunc (self FunctionCall) slice(index int) []Value {\n\tif index < len(self.ArgumentList) {\n\t\treturn self.ArgumentList[index:]\n\t}\n\treturn []Value{}\n}\n\nfunc (self *FunctionCall) thisObject() *_object {\n\tif self._thisObject == nil {\n\t\tthis := self.This.resolve() // FIXME Is this right?\n\t\tself._thisObject = self.runtime.toObject(this)\n\t}\n\treturn self._thisObject\n}\n\nfunc (self *FunctionCall) thisClassObject(class string) *_object {\n\tthisObject := self.thisObject()\n\tif thisObject.class != class {\n\t\tpanic(self.runtime.panicTypeError())\n\t}\n\treturn self._thisObject\n}\n\nfunc (self FunctionCall) toObject(value Value) *_object {\n\treturn self.runtime.toObject(value)\n}\n\n// CallerLocation will return file location information (file:line:pos) where this function is being called.\nfunc (self FunctionCall) CallerLocation() string {\n\t// see error.go for location()\n\treturn self.runtime.scope.outer.frame.location()\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_go_array.go",
    "content": "package otto\n\nimport (\n\t\"reflect\"\n\t\"strconv\"\n)\n\nfunc (runtime *_runtime) newGoArrayObject(value reflect.Value) *_object {\n\tself := runtime.newObject()\n\tself.class = \"GoArray\"\n\tself.objectClass = _classGoArray\n\tself.value = _newGoArrayObject(value)\n\treturn self\n}\n\ntype _goArrayObject struct {\n\tvalue        reflect.Value\n\twritable     bool\n\tpropertyMode _propertyMode\n}\n\nfunc _newGoArrayObject(value reflect.Value) *_goArrayObject {\n\twritable := value.Kind() == reflect.Ptr // The Array is addressable (like a Slice)\n\tmode := _propertyMode(0010)\n\tif writable {\n\t\tmode = 0110\n\t}\n\tself := &_goArrayObject{\n\t\tvalue:        value,\n\t\twritable:     writable,\n\t\tpropertyMode: mode,\n\t}\n\treturn self\n}\n\nfunc (self _goArrayObject) getValue(index int64) (reflect.Value, bool) {\n\tvalue := reflect.Indirect(self.value)\n\tif index < int64(value.Len()) {\n\t\treturn value.Index(int(index)), true\n\t}\n\treturn reflect.Value{}, false\n}\n\nfunc (self _goArrayObject) setValue(index int64, value Value) bool {\n\tindexValue, exists := self.getValue(index)\n\tif !exists {\n\t\treturn false\n\t}\n\treflectValue, err := value.toReflectValue(reflect.Indirect(self.value).Type().Elem().Kind())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tindexValue.Set(reflectValue)\n\treturn true\n}\n\nfunc goArrayGetOwnProperty(self *_object, name string) *_property {\n\t// length\n\tif name == \"length\" {\n\t\treturn &_property{\n\t\t\tvalue: toValue(reflect.Indirect(self.value.(*_goArrayObject).value).Len()),\n\t\t\tmode:  0,\n\t\t}\n\t}\n\n\t// .0, .1, .2, ...\n\tindex := stringToArrayIndex(name)\n\tif index >= 0 {\n\t\tobject := self.value.(*_goArrayObject)\n\t\tvalue := Value{}\n\t\treflectValue, exists := object.getValue(index)\n\t\tif exists {\n\t\t\tvalue = self.runtime.toValue(reflectValue.Interface())\n\t\t}\n\t\treturn &_property{\n\t\t\tvalue: value,\n\t\t\tmode:  object.propertyMode,\n\t\t}\n\t}\n\n\treturn objectGetOwnProperty(self, name)\n}\n\nfunc goArrayEnumerate(self *_object, all bool, each func(string) bool) {\n\tobject := self.value.(*_goArrayObject)\n\t// .0, .1, .2, ...\n\n\tfor index, length := 0, object.value.Len(); index < length; index++ {\n\t\tname := strconv.FormatInt(int64(index), 10)\n\t\tif !each(name) {\n\t\t\treturn\n\t\t}\n\t}\n\n\tobjectEnumerate(self, all, each)\n}\n\nfunc goArrayDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool {\n\tif name == \"length\" {\n\t\treturn self.runtime.typeErrorResult(throw)\n\t} else if index := stringToArrayIndex(name); index >= 0 {\n\t\tobject := self.value.(*_goArrayObject)\n\t\tif object.writable {\n\t\t\tif self.value.(*_goArrayObject).setValue(index, descriptor.value.(Value)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\treturn objectDefineOwnProperty(self, name, descriptor, throw)\n}\n\nfunc goArrayDelete(self *_object, name string, throw bool) bool {\n\t// length\n\tif name == \"length\" {\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\n\t// .0, .1, .2, ...\n\tindex := stringToArrayIndex(name)\n\tif index >= 0 {\n\t\tobject := self.value.(*_goArrayObject)\n\t\tif object.writable {\n\t\t\tindexValue, exists := object.getValue(index)\n\t\t\tif exists {\n\t\t\t\tindexValue.Set(reflect.Zero(reflect.Indirect(object.value).Type().Elem()))\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\n\treturn self.delete(name, throw)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_go_map.go",
    "content": "package otto\n\nimport (\n\t\"reflect\"\n)\n\nfunc (runtime *_runtime) newGoMapObject(value reflect.Value) *_object {\n\tself := runtime.newObject()\n\tself.class = \"Object\" // TODO Should this be something else?\n\tself.objectClass = _classGoMap\n\tself.value = _newGoMapObject(value)\n\treturn self\n}\n\ntype _goMapObject struct {\n\tvalue     reflect.Value\n\tkeyKind   reflect.Kind\n\tvalueKind reflect.Kind\n}\n\nfunc _newGoMapObject(value reflect.Value) *_goMapObject {\n\tif value.Kind() != reflect.Map {\n\t\tdbgf(\"%/panic//%@: %v != reflect.Map\", value.Kind())\n\t}\n\tself := &_goMapObject{\n\t\tvalue:     value,\n\t\tkeyKind:   value.Type().Key().Kind(),\n\t\tvalueKind: value.Type().Elem().Kind(),\n\t}\n\treturn self\n}\n\nfunc (self _goMapObject) toKey(name string) reflect.Value {\n\treflectValue, err := stringToReflectValue(name, self.keyKind)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn reflectValue\n}\n\nfunc (self _goMapObject) toValue(value Value) reflect.Value {\n\treflectValue, err := value.toReflectValue(self.valueKind)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn reflectValue\n}\n\nfunc goMapGetOwnProperty(self *_object, name string) *_property {\n\tobject := self.value.(*_goMapObject)\n\tvalue := object.value.MapIndex(object.toKey(name))\n\tif value.IsValid() {\n\t\treturn &_property{self.runtime.toValue(value.Interface()), 0111}\n\t}\n\n\treturn nil\n}\n\nfunc goMapEnumerate(self *_object, all bool, each func(string) bool) {\n\tobject := self.value.(*_goMapObject)\n\tkeys := object.value.MapKeys()\n\tfor _, key := range keys {\n\t\tif !each(toValue(key).String()) {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc goMapDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool {\n\tobject := self.value.(*_goMapObject)\n\t// TODO ...or 0222\n\tif descriptor.mode != 0111 {\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\tif !descriptor.isDataDescriptor() {\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\tobject.value.SetMapIndex(object.toKey(name), object.toValue(descriptor.value.(Value)))\n\treturn true\n}\n\nfunc goMapDelete(self *_object, name string, throw bool) bool {\n\tobject := self.value.(*_goMapObject)\n\tobject.value.SetMapIndex(object.toKey(name), reflect.Value{})\n\t// FIXME\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_go_slice.go",
    "content": "package otto\n\nimport (\n\t\"reflect\"\n\t\"strconv\"\n)\n\nfunc (runtime *_runtime) newGoSliceObject(value reflect.Value) *_object {\n\tself := runtime.newObject()\n\tself.class = \"GoArray\" // TODO GoSlice?\n\tself.objectClass = _classGoSlice\n\tself.value = _newGoSliceObject(value)\n\treturn self\n}\n\ntype _goSliceObject struct {\n\tvalue reflect.Value\n}\n\nfunc _newGoSliceObject(value reflect.Value) *_goSliceObject {\n\tself := &_goSliceObject{\n\t\tvalue: value,\n\t}\n\treturn self\n}\n\nfunc (self _goSliceObject) getValue(index int64) (reflect.Value, bool) {\n\tif index < int64(self.value.Len()) {\n\t\treturn self.value.Index(int(index)), true\n\t}\n\treturn reflect.Value{}, false\n}\n\nfunc (self _goSliceObject) setValue(index int64, value Value) bool {\n\tindexValue, exists := self.getValue(index)\n\tif !exists {\n\t\treturn false\n\t}\n\treflectValue, err := value.toReflectValue(self.value.Type().Elem().Kind())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tindexValue.Set(reflectValue)\n\treturn true\n}\n\nfunc goSliceGetOwnProperty(self *_object, name string) *_property {\n\t// length\n\tif name == \"length\" {\n\t\treturn &_property{\n\t\t\tvalue: toValue(self.value.(*_goSliceObject).value.Len()),\n\t\t\tmode:  0,\n\t\t}\n\t}\n\n\t// .0, .1, .2, ...\n\tindex := stringToArrayIndex(name)\n\tif index >= 0 {\n\t\tvalue := Value{}\n\t\treflectValue, exists := self.value.(*_goSliceObject).getValue(index)\n\t\tif exists {\n\t\t\tvalue = self.runtime.toValue(reflectValue.Interface())\n\t\t}\n\t\treturn &_property{\n\t\t\tvalue: value,\n\t\t\tmode:  0110,\n\t\t}\n\t}\n\n\t// Other methods\n\tif method := self.value.(*_goSliceObject).value.MethodByName(name); (method != reflect.Value{}) {\n\t\treturn &_property{\n\t\t\tvalue: self.runtime.toValue(method.Interface()),\n\t\t\tmode:  0110,\n\t\t}\n\t}\n\n\treturn objectGetOwnProperty(self, name)\n}\n\nfunc goSliceEnumerate(self *_object, all bool, each func(string) bool) {\n\tobject := self.value.(*_goSliceObject)\n\t// .0, .1, .2, ...\n\n\tfor index, length := 0, object.value.Len(); index < length; index++ {\n\t\tname := strconv.FormatInt(int64(index), 10)\n\t\tif !each(name) {\n\t\t\treturn\n\t\t}\n\t}\n\n\tobjectEnumerate(self, all, each)\n}\n\nfunc goSliceDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool {\n\tif name == \"length\" {\n\t\treturn self.runtime.typeErrorResult(throw)\n\t} else if index := stringToArrayIndex(name); index >= 0 {\n\t\tif self.value.(*_goSliceObject).setValue(index, descriptor.value.(Value)) {\n\t\t\treturn true\n\t\t}\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\treturn objectDefineOwnProperty(self, name, descriptor, throw)\n}\n\nfunc goSliceDelete(self *_object, name string, throw bool) bool {\n\t// length\n\tif name == \"length\" {\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\n\t// .0, .1, .2, ...\n\tindex := stringToArrayIndex(name)\n\tif index >= 0 {\n\t\tobject := self.value.(*_goSliceObject)\n\t\tindexValue, exists := object.getValue(index)\n\t\tif exists {\n\t\t\tindexValue.Set(reflect.Zero(object.value.Type().Elem()))\n\t\t\treturn true\n\t\t}\n\t\treturn self.runtime.typeErrorResult(throw)\n\t}\n\n\treturn self.delete(name, throw)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_go_struct.go",
    "content": "package otto\n\nimport (\n\t\"encoding/json\"\n\t\"reflect\"\n)\n\n// FIXME Make a note about not being able to modify a struct unless it was\n// passed as a pointer-to: &struct{ ... }\n// This seems to be a limitation of the reflect package.\n// This goes for the other Go constructs too.\n// I guess we could get around it by either:\n// 1. Creating a new struct every time\n// 2. Creating an addressable? struct in the constructor\n\nfunc (runtime *_runtime) newGoStructObject(value reflect.Value) *_object {\n\tself := runtime.newObject()\n\tself.class = \"Object\" // TODO Should this be something else?\n\tself.objectClass = _classGoStruct\n\tself.value = _newGoStructObject(value)\n\treturn self\n}\n\ntype _goStructObject struct {\n\tvalue reflect.Value\n}\n\nfunc _newGoStructObject(value reflect.Value) *_goStructObject {\n\tif reflect.Indirect(value).Kind() != reflect.Struct {\n\t\tdbgf(\"%/panic//%@: %v != reflect.Struct\", value.Kind())\n\t}\n\tself := &_goStructObject{\n\t\tvalue: value,\n\t}\n\treturn self\n}\n\nfunc (self _goStructObject) getValue(name string) reflect.Value {\n\tif validGoStructName(name) {\n\t\t// Do not reveal hidden or unexported fields\n\t\tif field := reflect.Indirect(self.value).FieldByName(name); (field != reflect.Value{}) {\n\t\t\treturn field\n\t\t}\n\n\t\tif method := self.value.MethodByName(name); (method != reflect.Value{}) {\n\t\t\treturn method\n\t\t}\n\t}\n\n\treturn reflect.Value{}\n}\n\nfunc (self _goStructObject) field(name string) (reflect.StructField, bool) {\n\treturn reflect.Indirect(self.value).Type().FieldByName(name)\n}\n\nfunc (self _goStructObject) method(name string) (reflect.Method, bool) {\n\treturn reflect.Indirect(self.value).Type().MethodByName(name)\n}\n\nfunc (self _goStructObject) setValue(name string, value Value) bool {\n\tfield, exists := self.field(name)\n\tif !exists {\n\t\treturn false\n\t}\n\tfieldValue := self.getValue(name)\n\treflectValue, err := value.toReflectValue(field.Type.Kind())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfieldValue.Set(reflectValue)\n\n\treturn true\n}\n\nfunc goStructGetOwnProperty(self *_object, name string) *_property {\n\tobject := self.value.(*_goStructObject)\n\tvalue := object.getValue(name)\n\tif value.IsValid() {\n\t\treturn &_property{self.runtime.toValue(value.Interface()), 0110}\n\t}\n\n\treturn objectGetOwnProperty(self, name)\n}\n\nfunc validGoStructName(name string) bool {\n\tif name == \"\" {\n\t\treturn false\n\t}\n\treturn 'A' <= name[0] && name[0] <= 'Z' // TODO What about Unicode?\n}\n\nfunc goStructEnumerate(self *_object, all bool, each func(string) bool) {\n\tobject := self.value.(*_goStructObject)\n\n\t// Enumerate fields\n\tfor index := 0; index < reflect.Indirect(object.value).NumField(); index++ {\n\t\tname := reflect.Indirect(object.value).Type().Field(index).Name\n\t\tif validGoStructName(name) {\n\t\t\tif !each(name) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\t// Enumerate methods\n\tfor index := 0; index < object.value.NumMethod(); index++ {\n\t\tname := object.value.Type().Method(index).Name\n\t\tif validGoStructName(name) {\n\t\t\tif !each(name) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tobjectEnumerate(self, all, each)\n}\n\nfunc goStructCanPut(self *_object, name string) bool {\n\tobject := self.value.(*_goStructObject)\n\tvalue := object.getValue(name)\n\tif value.IsValid() {\n\t\treturn true\n\t}\n\n\treturn objectCanPut(self, name)\n}\n\nfunc goStructPut(self *_object, name string, value Value, throw bool) {\n\tobject := self.value.(*_goStructObject)\n\tif object.setValue(name, value) {\n\t\treturn\n\t}\n\n\tobjectPut(self, name, value, throw)\n}\n\nfunc goStructMarshalJSON(self *_object) json.Marshaler {\n\tobject := self.value.(*_goStructObject)\n\tgoValue := reflect.Indirect(object.value).Interface()\n\tswitch marshaler := goValue.(type) {\n\tcase json.Marshaler:\n\t\treturn marshaler\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_number.go",
    "content": "package otto\n\nfunc (runtime *_runtime) newNumberObject(value Value) *_object {\n\treturn runtime.newPrimitiveObject(\"Number\", value.numberValue())\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_reference.go",
    "content": "package otto\n\ntype _reference interface {\n\tinvalid() bool         // IsUnresolvableReference\n\tgetValue() Value       // getValue\n\tputValue(Value) string // PutValue\n\tdelete() bool\n}\n\n// PropertyReference\n\ntype _propertyReference struct {\n\tname    string\n\tstrict  bool\n\tbase    *_object\n\truntime *_runtime\n\tat      _at\n}\n\nfunc newPropertyReference(rt *_runtime, base *_object, name string, strict bool, at _at) *_propertyReference {\n\treturn &_propertyReference{\n\t\truntime: rt,\n\t\tname:    name,\n\t\tstrict:  strict,\n\t\tbase:    base,\n\t\tat:      at,\n\t}\n}\n\nfunc (self *_propertyReference) invalid() bool {\n\treturn self.base == nil\n}\n\nfunc (self *_propertyReference) getValue() Value {\n\tif self.base == nil {\n\t\tpanic(self.runtime.panicReferenceError(\"'%s' is not defined\", self.name, self.at))\n\t}\n\treturn self.base.get(self.name)\n}\n\nfunc (self *_propertyReference) putValue(value Value) string {\n\tif self.base == nil {\n\t\treturn self.name\n\t}\n\tself.base.put(self.name, value, self.strict)\n\treturn \"\"\n}\n\nfunc (self *_propertyReference) delete() bool {\n\tif self.base == nil {\n\t\t// TODO Throw an error if strict\n\t\treturn true\n\t}\n\treturn self.base.delete(self.name, self.strict)\n}\n\n// ArgumentReference\n\nfunc newArgumentReference(runtime *_runtime, base *_object, name string, strict bool, at _at) *_propertyReference {\n\tif base == nil {\n\t\tpanic(hereBeDragons())\n\t}\n\treturn newPropertyReference(runtime, base, name, strict, at)\n}\n\ntype _stashReference struct {\n\tname   string\n\tstrict bool\n\tbase   _stash\n}\n\nfunc (self *_stashReference) invalid() bool {\n\treturn false // The base (an environment) will never be nil\n}\n\nfunc (self *_stashReference) getValue() Value {\n\treturn self.base.getBinding(self.name, self.strict)\n}\n\nfunc (self *_stashReference) putValue(value Value) string {\n\tself.base.setValue(self.name, value, self.strict)\n\treturn \"\"\n}\n\nfunc (self *_stashReference) delete() bool {\n\tif self.base == nil {\n\t\t// This should never be reached, but just in case\n\t\treturn false\n\t}\n\treturn self.base.deleteBinding(self.name)\n}\n\n// getIdentifierReference\n\nfunc getIdentifierReference(runtime *_runtime, stash _stash, name string, strict bool, at _at) _reference {\n\tif stash == nil {\n\t\treturn newPropertyReference(runtime, nil, name, strict, at)\n\t}\n\tif stash.hasBinding(name) {\n\t\treturn stash.newReference(name, strict, at)\n\t}\n\treturn getIdentifierReference(runtime, stash.outer(), name, strict, at)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_regexp.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"unicode/utf8\"\n\n\t\"github.com/robertkrimen/otto/parser\"\n)\n\ntype _regExpObject struct {\n\tregularExpression *regexp.Regexp\n\tglobal            bool\n\tignoreCase        bool\n\tmultiline         bool\n\tsource            string\n\tflags             string\n}\n\nfunc (runtime *_runtime) newRegExpObject(pattern string, flags string) *_object {\n\tself := runtime.newObject()\n\tself.class = \"RegExp\"\n\n\tglobal := false\n\tignoreCase := false\n\tmultiline := false\n\tre2flags := \"\"\n\n\t// TODO Maybe clean up the panicking here... TypeError, SyntaxError, ?\n\n\tfor _, chr := range flags {\n\t\tswitch chr {\n\t\tcase 'g':\n\t\t\tif global {\n\t\t\t\tpanic(runtime.panicSyntaxError(\"newRegExpObject: %s %s\", pattern, flags))\n\t\t\t}\n\t\t\tglobal = true\n\t\tcase 'm':\n\t\t\tif multiline {\n\t\t\t\tpanic(runtime.panicSyntaxError(\"newRegExpObject: %s %s\", pattern, flags))\n\t\t\t}\n\t\t\tmultiline = true\n\t\t\tre2flags += \"m\"\n\t\tcase 'i':\n\t\t\tif ignoreCase {\n\t\t\t\tpanic(runtime.panicSyntaxError(\"newRegExpObject: %s %s\", pattern, flags))\n\t\t\t}\n\t\t\tignoreCase = true\n\t\t\tre2flags += \"i\"\n\t\t}\n\t}\n\n\tre2pattern, err := parser.TransformRegExp(pattern)\n\tif err != nil {\n\t\tpanic(runtime.panicTypeError(\"Invalid regular expression: %s\", err.Error()))\n\t}\n\tif len(re2flags) > 0 {\n\t\tre2pattern = fmt.Sprintf(\"(?%s:%s)\", re2flags, re2pattern)\n\t}\n\n\tregularExpression, err := regexp.Compile(re2pattern)\n\tif err != nil {\n\t\tpanic(runtime.panicSyntaxError(\"Invalid regular expression: %s\", err.Error()[22:]))\n\t}\n\n\tself.value = _regExpObject{\n\t\tregularExpression: regularExpression,\n\t\tglobal:            global,\n\t\tignoreCase:        ignoreCase,\n\t\tmultiline:         multiline,\n\t\tsource:            pattern,\n\t\tflags:             flags,\n\t}\n\tself.defineProperty(\"global\", toValue_bool(global), 0, false)\n\tself.defineProperty(\"ignoreCase\", toValue_bool(ignoreCase), 0, false)\n\tself.defineProperty(\"multiline\", toValue_bool(multiline), 0, false)\n\tself.defineProperty(\"lastIndex\", toValue_int(0), 0100, false)\n\tself.defineProperty(\"source\", toValue_string(pattern), 0, false)\n\treturn self\n}\n\nfunc (self *_object) regExpValue() _regExpObject {\n\tvalue, _ := self.value.(_regExpObject)\n\treturn value\n}\n\nfunc execRegExp(this *_object, target string) (match bool, result []int) {\n\tif this.class != \"RegExp\" {\n\t\tpanic(this.runtime.panicTypeError(\"Calling RegExp.exec on a non-RegExp object\"))\n\t}\n\tlastIndex := this.get(\"lastIndex\").number().int64\n\tindex := lastIndex\n\tglobal := this.get(\"global\").bool()\n\tif !global {\n\t\tindex = 0\n\t}\n\tif 0 > index || index > int64(len(target)) {\n\t} else {\n\t\tresult = this.regExpValue().regularExpression.FindStringSubmatchIndex(target[index:])\n\t}\n\tif result == nil {\n\t\t//this.defineProperty(\"lastIndex\", toValue_(0), 0111, true)\n\t\tthis.put(\"lastIndex\", toValue_int(0), true)\n\t\treturn // !match\n\t}\n\tmatch = true\n\tstartIndex := index\n\tendIndex := int(lastIndex) + result[1]\n\t// We do this shift here because the .FindStringSubmatchIndex above\n\t// was done on a local subordinate slice of the string, not the whole string\n\tfor index, _ := range result {\n\t\tresult[index] += int(startIndex)\n\t}\n\tif global {\n\t\t//this.defineProperty(\"lastIndex\", toValue_(endIndex), 0111, true)\n\t\tthis.put(\"lastIndex\", toValue_int(endIndex), true)\n\t}\n\treturn // match\n}\n\nfunc execResultToArray(runtime *_runtime, target string, result []int) *_object {\n\tcaptureCount := len(result) / 2\n\tvalueArray := make([]Value, captureCount)\n\tfor index := 0; index < captureCount; index++ {\n\t\toffset := 2 * index\n\t\tif result[offset] != -1 {\n\t\t\tvalueArray[index] = toValue_string(target[result[offset]:result[offset+1]])\n\t\t} else {\n\t\t\tvalueArray[index] = Value{}\n\t\t}\n\t}\n\tmatchIndex := result[0]\n\tif matchIndex != 0 {\n\t\tmatchIndex = 0\n\t\t// Find the rune index in the string, not the byte index\n\t\tfor index := 0; index < result[0]; {\n\t\t\t_, size := utf8.DecodeRuneInString(target[index:])\n\t\t\tmatchIndex += 1\n\t\t\tindex += size\n\t\t}\n\t}\n\tmatch := runtime.newArrayOf(valueArray)\n\tmatch.defineProperty(\"input\", toValue_string(target), 0111, false)\n\tmatch.defineProperty(\"index\", toValue_int(matchIndex), 0111, false)\n\treturn match\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/type_string.go",
    "content": "package otto\n\nimport (\n\t\"strconv\"\n\t\"unicode/utf8\"\n)\n\ntype _stringObject interface {\n\tLength() int\n\tAt(int) rune\n\tString() string\n}\n\ntype _stringASCII string\n\nfunc (str _stringASCII) Length() int {\n\treturn len(str)\n}\n\nfunc (str _stringASCII) At(at int) rune {\n\treturn rune(str[at])\n}\n\nfunc (str _stringASCII) String() string {\n\treturn string(str)\n}\n\ntype _stringWide struct {\n\tstring string\n\tlength int\n\trunes  []rune\n}\n\nfunc (str _stringWide) Length() int {\n\treturn str.length\n}\n\nfunc (str _stringWide) At(at int) rune {\n\tif str.runes == nil {\n\t\tstr.runes = []rune(str.string)\n\t}\n\treturn str.runes[at]\n}\n\nfunc (str _stringWide) String() string {\n\treturn str.string\n}\n\nfunc _newStringObject(str string) _stringObject {\n\tfor i := 0; i < len(str); i++ {\n\t\tif str[i] >= utf8.RuneSelf {\n\t\t\tgoto wide\n\t\t}\n\t}\n\n\treturn _stringASCII(str)\n\nwide:\n\treturn &_stringWide{\n\t\tstring: str,\n\t\tlength: utf8.RuneCountInString(str),\n\t}\n}\n\nfunc stringAt(str _stringObject, index int) rune {\n\tif 0 <= index && index < str.Length() {\n\t\treturn str.At(index)\n\t}\n\treturn utf8.RuneError\n}\n\nfunc (runtime *_runtime) newStringObject(value Value) *_object {\n\tstr := _newStringObject(value.string())\n\n\tself := runtime.newClassObject(\"String\")\n\tself.defineProperty(\"length\", toValue_int(str.Length()), 0, false)\n\tself.objectClass = _classString\n\tself.value = str\n\treturn self\n}\n\nfunc (self *_object) stringValue() _stringObject {\n\tif str, ok := self.value.(_stringObject); ok {\n\t\treturn str\n\t}\n\treturn nil\n}\n\nfunc stringEnumerate(self *_object, all bool, each func(string) bool) {\n\tif str := self.stringValue(); str != nil {\n\t\tlength := str.Length()\n\t\tfor index := 0; index < length; index++ {\n\t\t\tif !each(strconv.FormatInt(int64(index), 10)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\tobjectEnumerate(self, all, each)\n}\n\nfunc stringGetOwnProperty(self *_object, name string) *_property {\n\tif property := objectGetOwnProperty(self, name); property != nil {\n\t\treturn property\n\t}\n\t// TODO Test a string of length >= +int32 + 1?\n\tif index := stringToArrayIndex(name); index >= 0 {\n\t\tif chr := stringAt(self.stringValue(), int(index)); chr != utf8.RuneError {\n\t\t\treturn &_property{toValue_string(string(chr)), 0}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/value.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"unicode/utf16\"\n)\n\ntype _valueKind int\n\nconst (\n\tvalueUndefined _valueKind = iota\n\tvalueNull\n\tvalueNumber\n\tvalueString\n\tvalueBoolean\n\tvalueObject\n\n\t// These are invalid outside of the runtime\n\tvalueEmpty\n\tvalueResult\n\tvalueReference\n)\n\n// Value is the representation of a JavaScript value.\ntype Value struct {\n\tkind  _valueKind\n\tvalue interface{}\n}\n\nfunc (value Value) safe() bool {\n\treturn value.kind < valueEmpty\n}\n\nvar (\n\temptyValue = Value{kind: valueEmpty}\n\tnullValue  = Value{kind: valueNull}\n\tfalseValue = Value{kind: valueBoolean, value: false}\n\ttrueValue  = Value{kind: valueBoolean, value: true}\n)\n\n// ToValue will convert an interface{} value to a value digestible by otto/JavaScript\n//\n// This function will not work for advanced types (struct, map, slice/array, etc.) and\n// you should use Otto.ToValue instead.\nfunc ToValue(value interface{}) (Value, error) {\n\tresult := Value{}\n\terr := catchPanic(func() {\n\t\tresult = toValue(value)\n\t})\n\treturn result, err\n}\n\nfunc (value Value) isEmpty() bool {\n\treturn value.kind == valueEmpty\n}\n\n// Undefined\n\n// UndefinedValue will return a Value representing undefined.\nfunc UndefinedValue() Value {\n\treturn Value{}\n}\n\n// IsDefined will return false if the value is undefined, and true otherwise.\nfunc (value Value) IsDefined() bool {\n\treturn value.kind != valueUndefined\n}\n\n// IsUndefined will return true if the value is undefined, and false otherwise.\nfunc (value Value) IsUndefined() bool {\n\treturn value.kind == valueUndefined\n}\n\n// NullValue will return a Value representing null.\nfunc NullValue() Value {\n\treturn Value{kind: valueNull}\n}\n\n// IsNull will return true if the value is null, and false otherwise.\nfunc (value Value) IsNull() bool {\n\treturn value.kind == valueNull\n}\n\n// ---\n\nfunc (value Value) isCallable() bool {\n\tswitch value := value.value.(type) {\n\tcase *_object:\n\t\treturn value.isCall()\n\t}\n\treturn false\n}\n\n// Call the value as a function with the given this value and argument list and\n// return the result of invocation. It is essentially equivalent to:\n//\n//\t\tvalue.apply(thisValue, argumentList)\n//\n// An undefined value and an error will result if:\n//\n//\t\t1. There is an error during conversion of the argument list\n//\t\t2. The value is not actually a function\n//\t\t3. An (uncaught) exception is thrown\n//\nfunc (value Value) Call(this Value, argumentList ...interface{}) (Value, error) {\n\tresult := Value{}\n\terr := catchPanic(func() {\n\t\t// FIXME\n\t\tresult = value.call(nil, this, argumentList...)\n\t})\n\tif !value.safe() {\n\t\tvalue = Value{}\n\t}\n\treturn result, err\n}\n\nfunc (value Value) call(rt *_runtime, this Value, argumentList ...interface{}) Value {\n\tswitch function := value.value.(type) {\n\tcase *_object:\n\t\treturn function.call(this, function.runtime.toValueArray(argumentList...), false, nativeFrame)\n\t}\n\tif rt == nil {\n\t\tpanic(\"FIXME TypeError\")\n\t}\n\tpanic(rt.panicTypeError())\n}\n\nfunc (value Value) constructSafe(rt *_runtime, this Value, argumentList ...interface{}) (Value, error) {\n\tresult := Value{}\n\terr := catchPanic(func() {\n\t\tresult = value.construct(rt, this, argumentList...)\n\t})\n\treturn result, err\n}\n\nfunc (value Value) construct(rt *_runtime, this Value, argumentList ...interface{}) Value {\n\tswitch fn := value.value.(type) {\n\tcase *_object:\n\t\treturn fn.construct(fn.runtime.toValueArray(argumentList...))\n\t}\n\tif rt == nil {\n\t\tpanic(\"FIXME TypeError\")\n\t}\n\tpanic(rt.panicTypeError())\n}\n\n// IsPrimitive will return true if value is a primitive (any kind of primitive).\nfunc (value Value) IsPrimitive() bool {\n\treturn !value.IsObject()\n}\n\n// IsBoolean will return true if value is a boolean (primitive).\nfunc (value Value) IsBoolean() bool {\n\treturn value.kind == valueBoolean\n}\n\n// IsNumber will return true if value is a number (primitive).\nfunc (value Value) IsNumber() bool {\n\treturn value.kind == valueNumber\n}\n\n// IsNaN will return true if value is NaN (or would convert to NaN).\nfunc (value Value) IsNaN() bool {\n\tswitch value := value.value.(type) {\n\tcase float64:\n\t\treturn math.IsNaN(value)\n\tcase float32:\n\t\treturn math.IsNaN(float64(value))\n\tcase int, int8, int32, int64:\n\t\treturn false\n\tcase uint, uint8, uint32, uint64:\n\t\treturn false\n\t}\n\n\treturn math.IsNaN(value.float64())\n}\n\n// IsString will return true if value is a string (primitive).\nfunc (value Value) IsString() bool {\n\treturn value.kind == valueString\n}\n\n// IsObject will return true if value is an object.\nfunc (value Value) IsObject() bool {\n\treturn value.kind == valueObject\n}\n\n// IsFunction will return true if value is a function.\nfunc (value Value) IsFunction() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn value.value.(*_object).class == \"Function\"\n}\n\n// Class will return the class string of the value or the empty string if value is not an object.\n//\n// The return value will (generally) be one of:\n//\n//\t\tObject\n//\t\tFunction\n//\t\tArray\n//\t\tString\n//\t\tNumber\n//\t\tBoolean\n//\t\tDate\n//\t\tRegExp\n//\nfunc (value Value) Class() string {\n\tif value.kind != valueObject {\n\t\treturn \"\"\n\t}\n\treturn value.value.(*_object).class\n}\n\nfunc (value Value) isArray() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn isArray(value.value.(*_object))\n}\n\nfunc (value Value) isStringObject() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn value.value.(*_object).class == \"String\"\n}\n\nfunc (value Value) isBooleanObject() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn value.value.(*_object).class == \"Boolean\"\n}\n\nfunc (value Value) isNumberObject() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn value.value.(*_object).class == \"Number\"\n}\n\nfunc (value Value) isDate() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn value.value.(*_object).class == \"Date\"\n}\n\nfunc (value Value) isRegExp() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn value.value.(*_object).class == \"RegExp\"\n}\n\nfunc (value Value) isError() bool {\n\tif value.kind != valueObject {\n\t\treturn false\n\t}\n\treturn value.value.(*_object).class == \"Error\"\n}\n\n// ---\n\nfunc toValue_reflectValuePanic(value interface{}, kind reflect.Kind) {\n\t// FIXME?\n\tswitch kind {\n\tcase reflect.Struct:\n\t\tpanic(newError(nil, \"TypeError\", 0, \"invalid value (struct): missing runtime: %v (%T)\", value, value))\n\tcase reflect.Map:\n\t\tpanic(newError(nil, \"TypeError\", 0, \"invalid value (map): missing runtime: %v (%T)\", value, value))\n\tcase reflect.Slice:\n\t\tpanic(newError(nil, \"TypeError\", 0, \"invalid value (slice): missing runtime: %v (%T)\", value, value))\n\t}\n}\n\nfunc toValue(value interface{}) Value {\n\tswitch value := value.(type) {\n\tcase Value:\n\t\treturn value\n\tcase bool:\n\t\treturn Value{valueBoolean, value}\n\tcase int:\n\t\treturn Value{valueNumber, value}\n\tcase int8:\n\t\treturn Value{valueNumber, value}\n\tcase int16:\n\t\treturn Value{valueNumber, value}\n\tcase int32:\n\t\treturn Value{valueNumber, value}\n\tcase int64:\n\t\treturn Value{valueNumber, value}\n\tcase uint:\n\t\treturn Value{valueNumber, value}\n\tcase uint8:\n\t\treturn Value{valueNumber, value}\n\tcase uint16:\n\t\treturn Value{valueNumber, value}\n\tcase uint32:\n\t\treturn Value{valueNumber, value}\n\tcase uint64:\n\t\treturn Value{valueNumber, value}\n\tcase float32:\n\t\treturn Value{valueNumber, float64(value)}\n\tcase float64:\n\t\treturn Value{valueNumber, value}\n\tcase []uint16:\n\t\treturn Value{valueString, value}\n\tcase string:\n\t\treturn Value{valueString, value}\n\t// A rune is actually an int32, which is handled above\n\tcase *_object:\n\t\treturn Value{valueObject, value}\n\tcase *Object:\n\t\treturn Value{valueObject, value.object}\n\tcase Object:\n\t\treturn Value{valueObject, value.object}\n\tcase _reference: // reference is an interface (already a pointer)\n\t\treturn Value{valueReference, value}\n\tcase _result:\n\t\treturn Value{valueResult, value}\n\tcase nil:\n\t\t// TODO Ugh.\n\t\treturn Value{}\n\tcase reflect.Value:\n\t\tfor value.Kind() == reflect.Ptr {\n\t\t\t// We were given a pointer, so we'll drill down until we get a non-pointer\n\t\t\t//\n\t\t\t// These semantics might change if we want to start supporting pointers to values transparently\n\t\t\t// (It would be best not to depend on this behavior)\n\t\t\t// FIXME: UNDEFINED\n\t\t\tif value.IsNil() {\n\t\t\t\treturn Value{}\n\t\t\t}\n\t\t\tvalue = value.Elem()\n\t\t}\n\t\tswitch value.Kind() {\n\t\tcase reflect.Bool:\n\t\t\treturn Value{valueBoolean, bool(value.Bool())}\n\t\tcase reflect.Int:\n\t\t\treturn Value{valueNumber, int(value.Int())}\n\t\tcase reflect.Int8:\n\t\t\treturn Value{valueNumber, int8(value.Int())}\n\t\tcase reflect.Int16:\n\t\t\treturn Value{valueNumber, int16(value.Int())}\n\t\tcase reflect.Int32:\n\t\t\treturn Value{valueNumber, int32(value.Int())}\n\t\tcase reflect.Int64:\n\t\t\treturn Value{valueNumber, int64(value.Int())}\n\t\tcase reflect.Uint:\n\t\t\treturn Value{valueNumber, uint(value.Uint())}\n\t\tcase reflect.Uint8:\n\t\t\treturn Value{valueNumber, uint8(value.Uint())}\n\t\tcase reflect.Uint16:\n\t\t\treturn Value{valueNumber, uint16(value.Uint())}\n\t\tcase reflect.Uint32:\n\t\t\treturn Value{valueNumber, uint32(value.Uint())}\n\t\tcase reflect.Uint64:\n\t\t\treturn Value{valueNumber, uint64(value.Uint())}\n\t\tcase reflect.Float32:\n\t\t\treturn Value{valueNumber, float32(value.Float())}\n\t\tcase reflect.Float64:\n\t\t\treturn Value{valueNumber, float64(value.Float())}\n\t\tcase reflect.String:\n\t\t\treturn Value{valueString, string(value.String())}\n\t\tdefault:\n\t\t\ttoValue_reflectValuePanic(value.Interface(), value.Kind())\n\t\t}\n\tdefault:\n\t\treturn toValue(reflect.ValueOf(value))\n\t}\n\t// FIXME?\n\tpanic(newError(nil, \"TypeError\", 0, \"invalid value: %v (%T)\", value, value))\n}\n\n// String will return the value as a string.\n//\n// This method will make return the empty string if there is an error.\nfunc (value Value) String() string {\n\tresult := \"\"\n\tcatchPanic(func() {\n\t\tresult = value.string()\n\t})\n\treturn result\n}\n\n// ToBoolean will convert the value to a boolean (bool).\n//\n//\t\tToValue(0).ToBoolean() => false\n//\t\tToValue(\"\").ToBoolean() => false\n//\t\tToValue(true).ToBoolean() => true\n//\t\tToValue(1).ToBoolean() => true\n//\t\tToValue(\"Nothing happens\").ToBoolean() => true\n//\n// If there is an error during the conversion process (like an uncaught exception), then the result will be false and an error.\nfunc (value Value) ToBoolean() (bool, error) {\n\tresult := false\n\terr := catchPanic(func() {\n\t\tresult = value.bool()\n\t})\n\treturn result, err\n}\n\nfunc (value Value) numberValue() Value {\n\tif value.kind == valueNumber {\n\t\treturn value\n\t}\n\treturn Value{valueNumber, value.float64()}\n}\n\n// ToFloat will convert the value to a number (float64).\n//\n//\t\tToValue(0).ToFloat() => 0.\n//\t\tToValue(1.1).ToFloat() => 1.1\n//\t\tToValue(\"11\").ToFloat() => 11.\n//\n// If there is an error during the conversion process (like an uncaught exception), then the result will be 0 and an error.\nfunc (value Value) ToFloat() (float64, error) {\n\tresult := float64(0)\n\terr := catchPanic(func() {\n\t\tresult = value.float64()\n\t})\n\treturn result, err\n}\n\n// ToInteger will convert the value to a number (int64).\n//\n//\t\tToValue(0).ToInteger() => 0\n//\t\tToValue(1.1).ToInteger() => 1\n//\t\tToValue(\"11\").ToInteger() => 11\n//\n// If there is an error during the conversion process (like an uncaught exception), then the result will be 0 and an error.\nfunc (value Value) ToInteger() (int64, error) {\n\tresult := int64(0)\n\terr := catchPanic(func() {\n\t\tresult = value.number().int64\n\t})\n\treturn result, err\n}\n\n// ToString will convert the value to a string (string).\n//\n//\t\tToValue(0).ToString() => \"0\"\n//\t\tToValue(false).ToString() => \"false\"\n//\t\tToValue(1.1).ToString() => \"1.1\"\n//\t\tToValue(\"11\").ToString() => \"11\"\n//\t\tToValue('Nothing happens.').ToString() => \"Nothing happens.\"\n//\n// If there is an error during the conversion process (like an uncaught exception), then the result will be the empty string (\"\") and an error.\nfunc (value Value) ToString() (string, error) {\n\tresult := \"\"\n\terr := catchPanic(func() {\n\t\tresult = value.string()\n\t})\n\treturn result, err\n}\n\nfunc (value Value) _object() *_object {\n\tswitch value := value.value.(type) {\n\tcase *_object:\n\t\treturn value\n\t}\n\treturn nil\n}\n\n// Object will return the object of the value, or nil if value is not an object.\n//\n// This method will not do any implicit conversion. For example, calling this method on a string primitive value will not return a String object.\nfunc (value Value) Object() *Object {\n\tswitch object := value.value.(type) {\n\tcase *_object:\n\t\treturn _newObject(object, value)\n\t}\n\treturn nil\n}\n\nfunc (value Value) reference() _reference {\n\tswitch value := value.value.(type) {\n\tcase _reference:\n\t\treturn value\n\t}\n\treturn nil\n}\n\nfunc (value Value) resolve() Value {\n\tswitch value := value.value.(type) {\n\tcase _reference:\n\t\treturn value.getValue()\n\t}\n\treturn value\n}\n\nvar (\n\t__NaN__              float64 = math.NaN()\n\t__PositiveInfinity__ float64 = math.Inf(+1)\n\t__NegativeInfinity__ float64 = math.Inf(-1)\n\t__PositiveZero__     float64 = 0\n\t__NegativeZero__     float64 = math.Float64frombits(0 | (1 << 63))\n)\n\nfunc positiveInfinity() float64 {\n\treturn __PositiveInfinity__\n}\n\nfunc negativeInfinity() float64 {\n\treturn __NegativeInfinity__\n}\n\nfunc positiveZero() float64 {\n\treturn __PositiveZero__\n}\n\nfunc negativeZero() float64 {\n\treturn __NegativeZero__\n}\n\n// NaNValue will return a value representing NaN.\n//\n// It is equivalent to:\n//\n//\t\tToValue(math.NaN())\n//\nfunc NaNValue() Value {\n\treturn Value{valueNumber, __NaN__}\n}\n\nfunc positiveInfinityValue() Value {\n\treturn Value{valueNumber, __PositiveInfinity__}\n}\n\nfunc negativeInfinityValue() Value {\n\treturn Value{valueNumber, __NegativeInfinity__}\n}\n\nfunc positiveZeroValue() Value {\n\treturn Value{valueNumber, __PositiveZero__}\n}\n\nfunc negativeZeroValue() Value {\n\treturn Value{valueNumber, __NegativeZero__}\n}\n\n// TrueValue will return a value representing true.\n//\n// It is equivalent to:\n//\n//\t\tToValue(true)\n//\nfunc TrueValue() Value {\n\treturn Value{valueBoolean, true}\n}\n\n// FalseValue will return a value representing false.\n//\n// It is equivalent to:\n//\n//\t\tToValue(false)\n//\nfunc FalseValue() Value {\n\treturn Value{valueBoolean, false}\n}\n\nfunc sameValue(x Value, y Value) bool {\n\tif x.kind != y.kind {\n\t\treturn false\n\t}\n\tresult := false\n\tswitch x.kind {\n\tcase valueUndefined, valueNull:\n\t\tresult = true\n\tcase valueNumber:\n\t\tx := x.float64()\n\t\ty := y.float64()\n\t\tif math.IsNaN(x) && math.IsNaN(y) {\n\t\t\tresult = true\n\t\t} else {\n\t\t\tresult = x == y\n\t\t\tif result && x == 0 {\n\t\t\t\t// Since +0 != -0\n\t\t\t\tresult = math.Signbit(x) == math.Signbit(y)\n\t\t\t}\n\t\t}\n\tcase valueString:\n\t\tresult = x.string() == y.string()\n\tcase valueBoolean:\n\t\tresult = x.bool() == y.bool()\n\tcase valueObject:\n\t\tresult = x._object() == y._object()\n\tdefault:\n\t\tpanic(hereBeDragons())\n\t}\n\n\treturn result\n}\n\nfunc strictEqualityComparison(x Value, y Value) bool {\n\tif x.kind != y.kind {\n\t\treturn false\n\t}\n\tresult := false\n\tswitch x.kind {\n\tcase valueUndefined, valueNull:\n\t\tresult = true\n\tcase valueNumber:\n\t\tx := x.float64()\n\t\ty := y.float64()\n\t\tif math.IsNaN(x) && math.IsNaN(y) {\n\t\t\tresult = false\n\t\t} else {\n\t\t\tresult = x == y\n\t\t}\n\tcase valueString:\n\t\tresult = x.string() == y.string()\n\tcase valueBoolean:\n\t\tresult = x.bool() == y.bool()\n\tcase valueObject:\n\t\tresult = x._object() == y._object()\n\tdefault:\n\t\tpanic(hereBeDragons())\n\t}\n\n\treturn result\n}\n\n// Export will attempt to convert the value to a Go representation\n// and return it via an interface{} kind.\n//\n// Export returns an error, but it will always be nil. It is present\n// for backwards compatibility.\n//\n// If a reasonable conversion is not possible, then the original\n// value is returned.\n//\n//      undefined   -> nil (FIXME?: Should be Value{})\n//      null        -> nil\n//      boolean     -> bool\n//      number      -> A number type (int, float32, uint64, ...)\n//      string      -> string\n//      Array       -> []interface{}\n//      Object      -> map[string]interface{}\n//\nfunc (self Value) Export() (interface{}, error) {\n\treturn self.export(), nil\n}\n\nfunc (self Value) export() interface{} {\n\n\tswitch self.kind {\n\tcase valueUndefined:\n\t\treturn nil\n\tcase valueNull:\n\t\treturn nil\n\tcase valueNumber, valueBoolean:\n\t\treturn self.value\n\tcase valueString:\n\t\tswitch value := self.value.(type) {\n\t\tcase string:\n\t\t\treturn value\n\t\tcase []uint16:\n\t\t\treturn string(utf16.Decode(value))\n\t\t}\n\tcase valueObject:\n\t\tobject := self._object()\n\t\tswitch value := object.value.(type) {\n\t\tcase *_goStructObject:\n\t\t\treturn value.value.Interface()\n\t\tcase *_goMapObject:\n\t\t\treturn value.value.Interface()\n\t\tcase *_goArrayObject:\n\t\t\treturn value.value.Interface()\n\t\tcase *_goSliceObject:\n\t\t\treturn value.value.Interface()\n\t\t}\n\t\tif object.class == \"Array\" {\n\t\t\tresult := make([]interface{}, 0)\n\t\t\tlengthValue := object.get(\"length\")\n\t\t\tlength := lengthValue.value.(uint32)\n\t\t\tkind := reflect.Invalid\n\t\t\tstate := 0\n\t\t\tvar t reflect.Type\n\t\t\tfor index := uint32(0); index < length; index += 1 {\n\t\t\t\tname := strconv.FormatInt(int64(index), 10)\n\t\t\t\tif !object.hasProperty(name) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tvalue := object.get(name).export()\n\n\t\t\t\tt = reflect.TypeOf(value)\n\n\t\t\t\tvar k reflect.Kind\n\t\t\t\tif t != nil {\n\t\t\t\t\tk = t.Kind()\n\t\t\t\t}\n\n\t\t\t\tif state == 0 {\n\t\t\t\t\tkind = k\n\t\t\t\t\tstate = 1\n\t\t\t\t} else if state == 1 && kind != k {\n\t\t\t\t\tstate = 2\n\t\t\t\t}\n\n\t\t\t\tresult = append(result, value)\n\t\t\t}\n\n\t\t\tif state != 1 || kind == reflect.Interface || t == nil {\n\t\t\t\t// No common type\n\t\t\t\treturn result\n\t\t\t}\n\n\t\t\t// Convert to the common type\n\t\t\tval := reflect.MakeSlice(reflect.SliceOf(t), len(result), len(result))\n\t\t\tfor i, v := range result {\n\t\t\t\tval.Index(i).Set(reflect.ValueOf(v))\n\t\t\t}\n\t\t\treturn val.Interface()\n\t\t} else {\n\t\t\tresult := make(map[string]interface{})\n\t\t\t// TODO Should we export everything? Or just what is enumerable?\n\t\t\tobject.enumerate(false, func(name string) bool {\n\t\t\t\tvalue := object.get(name)\n\t\t\t\tif value.IsDefined() {\n\t\t\t\t\tresult[name] = value.export()\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t\treturn result\n\t\t}\n\t}\n\n\tif self.safe() {\n\t\treturn self\n\t}\n\n\treturn Value{}\n}\n\nfunc (self Value) evaluateBreakContinue(labels []string) _resultKind {\n\tresult := self.value.(_result)\n\tif result.kind == resultBreak || result.kind == resultContinue {\n\t\tfor _, label := range labels {\n\t\t\tif label == result.target {\n\t\t\t\treturn result.kind\n\t\t\t}\n\t\t}\n\t}\n\treturn resultReturn\n}\n\nfunc (self Value) evaluateBreak(labels []string) _resultKind {\n\tresult := self.value.(_result)\n\tif result.kind == resultBreak {\n\t\tfor _, label := range labels {\n\t\t\tif label == result.target {\n\t\t\t\treturn result.kind\n\t\t\t}\n\t\t}\n\t}\n\treturn resultReturn\n}\n\nfunc (self Value) exportNative() interface{} {\n\n\tswitch self.kind {\n\tcase valueUndefined:\n\t\treturn self\n\tcase valueNull:\n\t\treturn nil\n\tcase valueNumber, valueBoolean:\n\t\treturn self.value\n\tcase valueString:\n\t\tswitch value := self.value.(type) {\n\t\tcase string:\n\t\t\treturn value\n\t\tcase []uint16:\n\t\t\treturn string(utf16.Decode(value))\n\t\t}\n\tcase valueObject:\n\t\tobject := self._object()\n\t\tswitch value := object.value.(type) {\n\t\tcase *_goStructObject:\n\t\t\treturn value.value.Interface()\n\t\tcase *_goMapObject:\n\t\t\treturn value.value.Interface()\n\t\tcase *_goArrayObject:\n\t\t\treturn value.value.Interface()\n\t\tcase *_goSliceObject:\n\t\t\treturn value.value.Interface()\n\t\t}\n\t}\n\n\treturn self\n}\n\n// Make a best effort to return a reflect.Value corresponding to reflect.Kind, but\n// fallback to just returning the Go value we have handy.\nfunc (value Value) toReflectValue(kind reflect.Kind) (reflect.Value, error) {\n\tif kind != reflect.Float32 && kind != reflect.Float64 && kind != reflect.Interface {\n\t\tswitch value := value.value.(type) {\n\t\tcase float32:\n\t\t\t_, frac := math.Modf(float64(value))\n\t\t\tif frac > 0 {\n\t\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %v to reflect.Kind: %v\", value, kind)\n\t\t\t}\n\t\tcase float64:\n\t\t\t_, frac := math.Modf(value)\n\t\t\tif frac > 0 {\n\t\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %v to reflect.Kind: %v\", value, kind)\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch kind {\n\tcase reflect.Bool: // Bool\n\t\treturn reflect.ValueOf(value.bool()), nil\n\tcase reflect.Int: // Int\n\t\t// We convert to float64 here because converting to int64 will not tell us\n\t\t// if a value is outside the range of int64\n\t\ttmp := toIntegerFloat(value)\n\t\tif tmp < float_minInt || tmp > float_maxInt {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %f (%v) to int\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(int(tmp)), nil\n\t\t}\n\tcase reflect.Int8: // Int8\n\t\ttmp := value.number().int64\n\t\tif tmp < int64_minInt8 || tmp > int64_maxInt8 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %d (%v) to int8\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(int8(tmp)), nil\n\t\t}\n\tcase reflect.Int16: // Int16\n\t\ttmp := value.number().int64\n\t\tif tmp < int64_minInt16 || tmp > int64_maxInt16 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %d (%v) to int16\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(int16(tmp)), nil\n\t\t}\n\tcase reflect.Int32: // Int32\n\t\ttmp := value.number().int64\n\t\tif tmp < int64_minInt32 || tmp > int64_maxInt32 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %d (%v) to int32\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(int32(tmp)), nil\n\t\t}\n\tcase reflect.Int64: // Int64\n\t\t// We convert to float64 here because converting to int64 will not tell us\n\t\t// if a value is outside the range of int64\n\t\ttmp := toIntegerFloat(value)\n\t\tif tmp < float_minInt64 || tmp > float_maxInt64 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %f (%v) to int\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(int64(tmp)), nil\n\t\t}\n\tcase reflect.Uint: // Uint\n\t\t// We convert to float64 here because converting to int64 will not tell us\n\t\t// if a value is outside the range of uint\n\t\ttmp := toIntegerFloat(value)\n\t\tif tmp < 0 || tmp > float_maxUint {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %f (%v) to uint\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(uint(tmp)), nil\n\t\t}\n\tcase reflect.Uint8: // Uint8\n\t\ttmp := value.number().int64\n\t\tif tmp < 0 || tmp > int64_maxUint8 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %d (%v) to uint8\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(uint8(tmp)), nil\n\t\t}\n\tcase reflect.Uint16: // Uint16\n\t\ttmp := value.number().int64\n\t\tif tmp < 0 || tmp > int64_maxUint16 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %d (%v) to uint16\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(uint16(tmp)), nil\n\t\t}\n\tcase reflect.Uint32: // Uint32\n\t\ttmp := value.number().int64\n\t\tif tmp < 0 || tmp > int64_maxUint32 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %d (%v) to uint32\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(uint32(tmp)), nil\n\t\t}\n\tcase reflect.Uint64: // Uint64\n\t\t// We convert to float64 here because converting to int64 will not tell us\n\t\t// if a value is outside the range of uint64\n\t\ttmp := toIntegerFloat(value)\n\t\tif tmp < 0 || tmp > float_maxUint64 {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %f (%v) to uint64\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(uint64(tmp)), nil\n\t\t}\n\tcase reflect.Float32: // Float32\n\t\ttmp := value.float64()\n\t\ttmp1 := tmp\n\t\tif 0 > tmp1 {\n\t\t\ttmp1 = -tmp1\n\t\t}\n\t\tif tmp1 > 0 && (tmp1 < math.SmallestNonzeroFloat32 || tmp1 > math.MaxFloat32) {\n\t\t\treturn reflect.Value{}, fmt.Errorf(\"RangeError: %f (%v) to float32\", tmp, value)\n\t\t} else {\n\t\t\treturn reflect.ValueOf(float32(tmp)), nil\n\t\t}\n\tcase reflect.Float64: // Float64\n\t\tvalue := value.float64()\n\t\treturn reflect.ValueOf(float64(value)), nil\n\tcase reflect.String: // String\n\t\treturn reflect.ValueOf(value.string()), nil\n\tcase reflect.Invalid: // Invalid\n\tcase reflect.Complex64: // FIXME? Complex64\n\tcase reflect.Complex128: // FIXME? Complex128\n\tcase reflect.Chan: // FIXME? Chan\n\tcase reflect.Func: // FIXME? Func\n\tcase reflect.Ptr: // FIXME? Ptr\n\tcase reflect.UnsafePointer: // FIXME? UnsafePointer\n\tdefault:\n\t\tswitch value.kind {\n\t\tcase valueObject:\n\t\t\tobject := value._object()\n\t\t\tswitch vl := object.value.(type) {\n\t\t\tcase *_goStructObject: // Struct\n\t\t\t\treturn reflect.ValueOf(vl.value.Interface()), nil\n\t\t\tcase *_goMapObject: // Map\n\t\t\t\treturn reflect.ValueOf(vl.value.Interface()), nil\n\t\t\tcase *_goArrayObject: // Array\n\t\t\t\treturn reflect.ValueOf(vl.value.Interface()), nil\n\t\t\tcase *_goSliceObject: // Slice\n\t\t\t\treturn reflect.ValueOf(vl.value.Interface()), nil\n\t\t\t}\n\t\t\treturn reflect.ValueOf(value.exportNative()), nil\n\t\tcase valueEmpty, valueResult, valueReference:\n\t\t\t// These are invalid, and should panic\n\t\tdefault:\n\t\t\treturn reflect.ValueOf(value.value), nil\n\t\t}\n\t}\n\n\t// FIXME Should this end up as a TypeError?\n\tpanic(fmt.Errorf(\"invalid conversion of %v (%v) to reflect.Kind: %v\", value.kind, value, kind))\n}\n\nfunc stringToReflectValue(value string, kind reflect.Kind) (reflect.Value, error) {\n\tswitch kind {\n\tcase reflect.Bool:\n\t\tvalue, err := strconv.ParseBool(value)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(value), nil\n\tcase reflect.Int:\n\t\tvalue, err := strconv.ParseInt(value, 0, 0)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(int(value)), nil\n\tcase reflect.Int8:\n\t\tvalue, err := strconv.ParseInt(value, 0, 8)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(int8(value)), nil\n\tcase reflect.Int16:\n\t\tvalue, err := strconv.ParseInt(value, 0, 16)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(int16(value)), nil\n\tcase reflect.Int32:\n\t\tvalue, err := strconv.ParseInt(value, 0, 32)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(int32(value)), nil\n\tcase reflect.Int64:\n\t\tvalue, err := strconv.ParseInt(value, 0, 64)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(int64(value)), nil\n\tcase reflect.Uint:\n\t\tvalue, err := strconv.ParseUint(value, 0, 0)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(uint(value)), nil\n\tcase reflect.Uint8:\n\t\tvalue, err := strconv.ParseUint(value, 0, 8)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(uint8(value)), nil\n\tcase reflect.Uint16:\n\t\tvalue, err := strconv.ParseUint(value, 0, 16)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(uint16(value)), nil\n\tcase reflect.Uint32:\n\t\tvalue, err := strconv.ParseUint(value, 0, 32)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(uint32(value)), nil\n\tcase reflect.Uint64:\n\t\tvalue, err := strconv.ParseUint(value, 0, 64)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(uint64(value)), nil\n\tcase reflect.Float32:\n\t\tvalue, err := strconv.ParseFloat(value, 32)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(float32(value)), nil\n\tcase reflect.Float64:\n\t\tvalue, err := strconv.ParseFloat(value, 64)\n\t\tif err != nil {\n\t\t\treturn reflect.Value{}, err\n\t\t}\n\t\treturn reflect.ValueOf(float64(value)), nil\n\tcase reflect.String:\n\t\treturn reflect.ValueOf(value), nil\n\t}\n\n\t// FIXME This should end up as a TypeError?\n\tpanic(fmt.Errorf(\"invalid conversion of %q to reflect.Kind: %v\", value, kind))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/value_boolean.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"unicode/utf16\"\n)\n\nfunc (value Value) bool() bool {\n\tif value.kind == valueBoolean {\n\t\treturn value.value.(bool)\n\t}\n\tif value.IsUndefined() {\n\t\treturn false\n\t}\n\tif value.IsNull() {\n\t\treturn false\n\t}\n\tswitch value := value.value.(type) {\n\tcase bool:\n\t\treturn value\n\tcase int, int8, int16, int32, int64:\n\t\treturn 0 != reflect.ValueOf(value).Int()\n\tcase uint, uint8, uint16, uint32, uint64:\n\t\treturn 0 != reflect.ValueOf(value).Uint()\n\tcase float32:\n\t\treturn 0 != value\n\tcase float64:\n\t\tif math.IsNaN(value) || value == 0 {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\tcase string:\n\t\treturn 0 != len(value)\n\tcase []uint16:\n\t\treturn 0 != len(utf16.Decode(value))\n\t}\n\tif value.IsObject() {\n\t\treturn true\n\t}\n\tpanic(fmt.Errorf(\"toBoolean(%T)\", value.value))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/value_number.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nvar stringToNumberParseInteger = regexp.MustCompile(`^(?:0[xX])`)\n\nfunc parseNumber(value string) float64 {\n\tvalue = strings.Trim(value, builtinString_trim_whitespace)\n\n\tif value == \"\" {\n\t\treturn 0\n\t}\n\n\tparseFloat := false\n\tif strings.IndexRune(value, '.') != -1 {\n\t\tparseFloat = true\n\t} else if stringToNumberParseInteger.MatchString(value) {\n\t\tparseFloat = false\n\t} else {\n\t\tparseFloat = true\n\t}\n\n\tif parseFloat {\n\t\tnumber, err := strconv.ParseFloat(value, 64)\n\t\tif err != nil && err.(*strconv.NumError).Err != strconv.ErrRange {\n\t\t\treturn math.NaN()\n\t\t}\n\t\treturn number\n\t}\n\n\tnumber, err := strconv.ParseInt(value, 0, 64)\n\tif err != nil {\n\t\treturn math.NaN()\n\t}\n\treturn float64(number)\n}\n\nfunc (value Value) float64() float64 {\n\tswitch value.kind {\n\tcase valueUndefined:\n\t\treturn math.NaN()\n\tcase valueNull:\n\t\treturn 0\n\t}\n\tswitch value := value.value.(type) {\n\tcase bool:\n\t\tif value {\n\t\t\treturn 1\n\t\t}\n\t\treturn 0\n\tcase int:\n\t\treturn float64(value)\n\tcase int8:\n\t\treturn float64(value)\n\tcase int16:\n\t\treturn float64(value)\n\tcase int32:\n\t\treturn float64(value)\n\tcase int64:\n\t\treturn float64(value)\n\tcase uint:\n\t\treturn float64(value)\n\tcase uint8:\n\t\treturn float64(value)\n\tcase uint16:\n\t\treturn float64(value)\n\tcase uint32:\n\t\treturn float64(value)\n\tcase uint64:\n\t\treturn float64(value)\n\tcase float64:\n\t\treturn value\n\tcase string:\n\t\treturn parseNumber(value)\n\tcase *_object:\n\t\treturn value.DefaultValue(defaultValueHintNumber).float64()\n\t}\n\tpanic(fmt.Errorf(\"toFloat(%T)\", value.value))\n}\n\nconst (\n\tfloat_2_64   float64 = 18446744073709551616.0\n\tfloat_2_63   float64 = 9223372036854775808.0\n\tfloat_2_32   float64 = 4294967296.0\n\tfloat_2_31   float64 = 2147483648.0\n\tfloat_2_16   float64 = 65536.0\n\tinteger_2_32 int64   = 4294967296\n\tinteger_2_31 int64   = 2146483648\n\tsqrt1_2      float64 = math.Sqrt2 / 2\n)\n\nconst (\n\tmaxInt8   = math.MaxInt8\n\tminInt8   = math.MinInt8\n\tmaxInt16  = math.MaxInt16\n\tminInt16  = math.MinInt16\n\tmaxInt32  = math.MaxInt32\n\tminInt32  = math.MinInt32\n\tmaxInt64  = math.MaxInt64\n\tminInt64  = math.MinInt64\n\tmaxUint8  = math.MaxUint8\n\tmaxUint16 = math.MaxUint16\n\tmaxUint32 = math.MaxUint32\n\tmaxUint64 = math.MaxUint64\n\tmaxUint   = ^uint(0)\n\tminUint   = 0\n\tmaxInt    = int(^uint(0) >> 1)\n\tminInt    = -maxInt - 1\n\n\t// int64\n\tint64_maxInt    int64 = int64(maxInt)\n\tint64_minInt    int64 = int64(minInt)\n\tint64_maxInt8   int64 = math.MaxInt8\n\tint64_minInt8   int64 = math.MinInt8\n\tint64_maxInt16  int64 = math.MaxInt16\n\tint64_minInt16  int64 = math.MinInt16\n\tint64_maxInt32  int64 = math.MaxInt32\n\tint64_minInt32  int64 = math.MinInt32\n\tint64_maxUint8  int64 = math.MaxUint8\n\tint64_maxUint16 int64 = math.MaxUint16\n\tint64_maxUint32 int64 = math.MaxUint32\n\n\t// float64\n\tfloat_maxInt    float64 = float64(int(^uint(0) >> 1))\n\tfloat_minInt    float64 = float64(int(-maxInt - 1))\n\tfloat_minUint   float64 = float64(0)\n\tfloat_maxUint   float64 = float64(uint(^uint(0)))\n\tfloat_minUint64 float64 = float64(0)\n\tfloat_maxUint64 float64 = math.MaxUint64\n\tfloat_maxInt64  float64 = math.MaxInt64\n\tfloat_minInt64  float64 = math.MinInt64\n)\n\nfunc toIntegerFloat(value Value) float64 {\n\tfloat := value.float64()\n\tif math.IsInf(float, 0) {\n\t} else if math.IsNaN(float) {\n\t\tfloat = 0\n\t} else if float > 0 {\n\t\tfloat = math.Floor(float)\n\t} else {\n\t\tfloat = math.Ceil(float)\n\t}\n\treturn float\n}\n\ntype _numberKind int\n\nconst (\n\tnumberInteger  _numberKind = iota // 3.0 => 3.0\n\tnumberFloat                       // 3.14159 => 3.0, 1+2**63 > 2**63-1\n\tnumberInfinity                    // Infinity => 2**63-1\n\tnumberNaN                         // NaN => 0\n)\n\ntype _number struct {\n\tkind    _numberKind\n\tint64   int64\n\tfloat64 float64\n}\n\n// FIXME\n// http://www.goinggo.net/2013/08/gustavos-ieee-754-brain-teaser.html\n// http://bazaar.launchpad.net/~niemeyer/strepr/trunk/view/6/strepr.go#L160\nfunc (value Value) number() (number _number) {\n\tswitch value := value.value.(type) {\n\tcase int8:\n\t\tnumber.int64 = int64(value)\n\t\treturn\n\tcase int16:\n\t\tnumber.int64 = int64(value)\n\t\treturn\n\tcase uint8:\n\t\tnumber.int64 = int64(value)\n\t\treturn\n\tcase uint16:\n\t\tnumber.int64 = int64(value)\n\t\treturn\n\tcase uint32:\n\t\tnumber.int64 = int64(value)\n\t\treturn\n\tcase int:\n\t\tnumber.int64 = int64(value)\n\t\treturn\n\tcase int64:\n\t\tnumber.int64 = value\n\t\treturn\n\t}\n\n\tfloat := value.float64()\n\tif float == 0 {\n\t\treturn\n\t}\n\n\tnumber.kind = numberFloat\n\tnumber.float64 = float\n\n\tif math.IsNaN(float) {\n\t\tnumber.kind = numberNaN\n\t\treturn\n\t}\n\n\tif math.IsInf(float, 0) {\n\t\tnumber.kind = numberInfinity\n\t}\n\n\tif float >= float_maxInt64 {\n\t\tnumber.int64 = math.MaxInt64\n\t\treturn\n\t}\n\n\tif float <= float_minInt64 {\n\t\tnumber.int64 = math.MinInt64\n\t\treturn\n\t}\n\n\tinteger := float64(0)\n\tif float > 0 {\n\t\tinteger = math.Floor(float)\n\t} else {\n\t\tinteger = math.Ceil(float)\n\t}\n\n\tif float == integer {\n\t\tnumber.kind = numberInteger\n\t}\n\tnumber.int64 = int64(float)\n\treturn\n}\n\n// ECMA 262: 9.5\nfunc toInt32(value Value) int32 {\n\t{\n\t\tswitch value := value.value.(type) {\n\t\tcase int8:\n\t\t\treturn int32(value)\n\t\tcase int16:\n\t\t\treturn int32(value)\n\t\tcase int32:\n\t\t\treturn value\n\t\t}\n\t}\n\tfloatValue := value.float64()\n\tif math.IsNaN(floatValue) || math.IsInf(floatValue, 0) {\n\t\treturn 0\n\t}\n\tif floatValue == 0 { // This will work for +0 & -0\n\t\treturn 0\n\t}\n\tremainder := math.Mod(floatValue, float_2_32)\n\tif remainder > 0 {\n\t\tremainder = math.Floor(remainder)\n\t} else {\n\t\tremainder = math.Ceil(remainder) + float_2_32\n\t}\n\tif remainder > float_2_31 {\n\t\treturn int32(remainder - float_2_32)\n\t}\n\treturn int32(remainder)\n}\n\nfunc toUint32(value Value) uint32 {\n\t{\n\t\tswitch value := value.value.(type) {\n\t\tcase int8:\n\t\t\treturn uint32(value)\n\t\tcase int16:\n\t\t\treturn uint32(value)\n\t\tcase uint8:\n\t\t\treturn uint32(value)\n\t\tcase uint16:\n\t\t\treturn uint32(value)\n\t\tcase uint32:\n\t\t\treturn value\n\t\t}\n\t}\n\tfloatValue := value.float64()\n\tif math.IsNaN(floatValue) || math.IsInf(floatValue, 0) {\n\t\treturn 0\n\t}\n\tif floatValue == 0 {\n\t\treturn 0\n\t}\n\tremainder := math.Mod(floatValue, float_2_32)\n\tif remainder > 0 {\n\t\tremainder = math.Floor(remainder)\n\t} else {\n\t\tremainder = math.Ceil(remainder) + float_2_32\n\t}\n\treturn uint32(remainder)\n}\n\nfunc toUint16(value Value) uint16 {\n\t{\n\t\tswitch value := value.value.(type) {\n\t\tcase int8:\n\t\t\treturn uint16(value)\n\t\tcase uint8:\n\t\t\treturn uint16(value)\n\t\tcase uint16:\n\t\t\treturn value\n\t\t}\n\t}\n\tfloatValue := value.float64()\n\tif math.IsNaN(floatValue) || math.IsInf(floatValue, 0) {\n\t\treturn 0\n\t}\n\tif floatValue == 0 {\n\t\treturn 0\n\t}\n\tremainder := math.Mod(floatValue, float_2_16)\n\tif remainder > 0 {\n\t\tremainder = math.Floor(remainder)\n\t} else {\n\t\tremainder = math.Ceil(remainder) + float_2_16\n\t}\n\treturn uint16(remainder)\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/value_primitive.go",
    "content": "package otto\n\nfunc toStringPrimitive(value Value) Value {\n\treturn _toPrimitive(value, defaultValueHintString)\n}\n\nfunc toNumberPrimitive(value Value) Value {\n\treturn _toPrimitive(value, defaultValueHintNumber)\n}\n\nfunc toPrimitive(value Value) Value {\n\treturn _toPrimitive(value, defaultValueNoHint)\n}\n\nfunc _toPrimitive(value Value, hint _defaultValueHint) Value {\n\tswitch value.kind {\n\tcase valueNull, valueUndefined, valueNumber, valueString, valueBoolean:\n\t\treturn value\n\tcase valueObject:\n\t\treturn value._object().DefaultValue(hint)\n\t}\n\tpanic(hereBeDragons(value.kind, value))\n}\n"
  },
  {
    "path": "vendor/github.com/robertkrimen/otto/value_string.go",
    "content": "package otto\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"unicode/utf16\"\n)\n\nvar matchLeading0Exponent = regexp.MustCompile(`([eE][\\+\\-])0+([1-9])`) // 1e-07 => 1e-7\n\n// FIXME\n// https://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/conversions.cc?spec=svn18082&r=18082\nfunc floatToString(value float64, bitsize int) string {\n\t// TODO Fit to ECMA-262 9.8.1 specification\n\tif math.IsNaN(value) {\n\t\treturn \"NaN\"\n\t} else if math.IsInf(value, 0) {\n\t\tif math.Signbit(value) {\n\t\t\treturn \"-Infinity\"\n\t\t}\n\t\treturn \"Infinity\"\n\t}\n\texponent := math.Log10(math.Abs(value))\n\tif exponent >= 21 || exponent < -6 {\n\t\treturn matchLeading0Exponent.ReplaceAllString(strconv.FormatFloat(value, 'g', -1, bitsize), \"$1$2\")\n\t}\n\treturn strconv.FormatFloat(value, 'f', -1, bitsize)\n}\n\nfunc numberToStringRadix(value Value, radix int) string {\n\tfloat := value.float64()\n\tif math.IsNaN(float) {\n\t\treturn \"NaN\"\n\t} else if math.IsInf(float, 1) {\n\t\treturn \"Infinity\"\n\t} else if math.IsInf(float, -1) {\n\t\treturn \"-Infinity\"\n\t}\n\t// FIXME This is very broken\n\t// Need to do proper radix conversion for floats, ...\n\t// This truncates large floats (so bad).\n\treturn strconv.FormatInt(int64(float), radix)\n}\n\nfunc (value Value) string() string {\n\tif value.kind == valueString {\n\t\tswitch value := value.value.(type) {\n\t\tcase string:\n\t\t\treturn value\n\t\tcase []uint16:\n\t\t\treturn string(utf16.Decode(value))\n\t\t}\n\t}\n\tif value.IsUndefined() {\n\t\treturn \"undefined\"\n\t}\n\tif value.IsNull() {\n\t\treturn \"null\"\n\t}\n\tswitch value := value.value.(type) {\n\tcase bool:\n\t\treturn strconv.FormatBool(value)\n\tcase int:\n\t\treturn strconv.FormatInt(int64(value), 10)\n\tcase int8:\n\t\treturn strconv.FormatInt(int64(value), 10)\n\tcase int16:\n\t\treturn strconv.FormatInt(int64(value), 10)\n\tcase int32:\n\t\treturn strconv.FormatInt(int64(value), 10)\n\tcase int64:\n\t\treturn strconv.FormatInt(value, 10)\n\tcase uint:\n\t\treturn strconv.FormatUint(uint64(value), 10)\n\tcase uint8:\n\t\treturn strconv.FormatUint(uint64(value), 10)\n\tcase uint16:\n\t\treturn strconv.FormatUint(uint64(value), 10)\n\tcase uint32:\n\t\treturn strconv.FormatUint(uint64(value), 10)\n\tcase uint64:\n\t\treturn strconv.FormatUint(value, 10)\n\tcase float32:\n\t\tif value == 0 {\n\t\t\treturn \"0\" // Take care not to return -0\n\t\t}\n\t\treturn floatToString(float64(value), 32)\n\tcase float64:\n\t\tif value == 0 {\n\t\t\treturn \"0\" // Take care not to return -0\n\t\t}\n\t\treturn floatToString(value, 64)\n\tcase []uint16:\n\t\treturn string(utf16.Decode(value))\n\tcase string:\n\t\treturn value\n\tcase *_object:\n\t\treturn value.DefaultValue(defaultValueHintString).string()\n\t}\n\tpanic(fmt.Errorf(\"%v.string( %T)\", value.value, value.value))\n}\n"
  },
  {
    "path": "vendor/github.com/robfig/cron/LICENSE",
    "content": "Copyright (C) 2012 Rob Figueiredo\nAll Rights Reserved.\n\nMIT LICENSE\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/robfig/cron/README.md",
    "content": "[![GoDoc](http://godoc.org/github.com/robfig/cron?status.png)](http://godoc.org/github.com/robfig/cron) \n[![Build Status](https://travis-ci.org/robfig/cron.svg?branch=master)](https://travis-ci.org/robfig/cron)\n\n# cron\n\nDocumentation here: https://godoc.org/github.com/robfig/cron\n"
  },
  {
    "path": "vendor/github.com/robfig/cron/constantdelay.go",
    "content": "package cron\n\nimport \"time\"\n\n// ConstantDelaySchedule represents a simple recurring duty cycle, e.g. \"Every 5 minutes\".\n// It does not support jobs more frequent than once a second.\ntype ConstantDelaySchedule struct {\n\tDelay time.Duration\n}\n\n// Every returns a crontab Schedule that activates once every duration.\n// Delays of less than a second are not supported (will round up to 1 second).\n// Any fields less than a Second are truncated.\nfunc Every(duration time.Duration) ConstantDelaySchedule {\n\tif duration < time.Second {\n\t\tduration = time.Second\n\t}\n\treturn ConstantDelaySchedule{\n\t\tDelay: duration - time.Duration(duration.Nanoseconds())%time.Second,\n\t}\n}\n\n// Next returns the next time this should be run.\n// This rounds so that the next activation time will be on the second.\nfunc (schedule ConstantDelaySchedule) Next(t time.Time) time.Time {\n\treturn t.Add(schedule.Delay - time.Duration(t.Nanosecond())*time.Nanosecond)\n}\n"
  },
  {
    "path": "vendor/github.com/robfig/cron/cron.go",
    "content": "package cron\n\nimport (\n\t\"log\"\n\t\"runtime\"\n\t\"sort\"\n\t\"time\"\n)\n\n// Cron keeps track of any number of entries, invoking the associated func as\n// specified by the schedule. It may be started, stopped, and the entries may\n// be inspected while running.\ntype Cron struct {\n\tentries  []*Entry\n\tstop     chan struct{}\n\tadd      chan *Entry\n\tsnapshot chan []*Entry\n\trunning  bool\n\tErrorLog *log.Logger\n\tlocation *time.Location\n}\n\n// Job is an interface for submitted cron jobs.\ntype Job interface {\n\tRun()\n}\n\n// The Schedule describes a job's duty cycle.\ntype Schedule interface {\n\t// Return the next activation time, later than the given time.\n\t// Next is invoked initially, and then each time the job is run.\n\tNext(time.Time) time.Time\n}\n\n// Entry consists of a schedule and the func to execute on that schedule.\ntype Entry struct {\n\t// The schedule on which this job should be run.\n\tSchedule Schedule\n\n\t// The next time the job will run. This is the zero time if Cron has not been\n\t// started or this entry's schedule is unsatisfiable\n\tNext time.Time\n\n\t// The last time this job was run. This is the zero time if the job has never\n\t// been run.\n\tPrev time.Time\n\n\t// The Job to run.\n\tJob Job\n}\n\n// byTime is a wrapper for sorting the entry array by time\n// (with zero time at the end).\ntype byTime []*Entry\n\nfunc (s byTime) Len() int      { return len(s) }\nfunc (s byTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] }\nfunc (s byTime) Less(i, j int) bool {\n\t// Two zero times should return false.\n\t// Otherwise, zero is \"greater\" than any other time.\n\t// (To sort it at the end of the list.)\n\tif s[i].Next.IsZero() {\n\t\treturn false\n\t}\n\tif s[j].Next.IsZero() {\n\t\treturn true\n\t}\n\treturn s[i].Next.Before(s[j].Next)\n}\n\n// New returns a new Cron job runner, in the Local time zone.\nfunc New() *Cron {\n\treturn NewWithLocation(time.Now().Location())\n}\n\n// NewWithLocation returns a new Cron job runner.\nfunc NewWithLocation(location *time.Location) *Cron {\n\treturn &Cron{\n\t\tentries:  nil,\n\t\tadd:      make(chan *Entry),\n\t\tstop:     make(chan struct{}),\n\t\tsnapshot: make(chan []*Entry),\n\t\trunning:  false,\n\t\tErrorLog: nil,\n\t\tlocation: location,\n\t}\n}\n\n// A wrapper that turns a func() into a cron.Job\ntype FuncJob func()\n\nfunc (f FuncJob) Run() { f() }\n\n// AddFunc adds a func to the Cron to be run on the given schedule.\nfunc (c *Cron) AddFunc(spec string, cmd func()) error {\n\treturn c.AddJob(spec, FuncJob(cmd))\n}\n\n// AddJob adds a Job to the Cron to be run on the given schedule.\nfunc (c *Cron) AddJob(spec string, cmd Job) error {\n\tschedule, err := Parse(spec)\n\tif err != nil {\n\t\treturn err\n\t}\n\tc.Schedule(schedule, cmd)\n\treturn nil\n}\n\n// Schedule adds a Job to the Cron to be run on the given schedule.\nfunc (c *Cron) Schedule(schedule Schedule, cmd Job) {\n\tentry := &Entry{\n\t\tSchedule: schedule,\n\t\tJob:      cmd,\n\t}\n\tif !c.running {\n\t\tc.entries = append(c.entries, entry)\n\t\treturn\n\t}\n\n\tc.add <- entry\n}\n\n// Entries returns a snapshot of the cron entries.\nfunc (c *Cron) Entries() []*Entry {\n\tif c.running {\n\t\tc.snapshot <- nil\n\t\tx := <-c.snapshot\n\t\treturn x\n\t}\n\treturn c.entrySnapshot()\n}\n\n// Location gets the time zone location\nfunc (c *Cron) Location() *time.Location {\n\treturn c.location\n}\n\n// Start the cron scheduler in its own go-routine, or no-op if already started.\nfunc (c *Cron) Start() {\n\tif c.running {\n\t\treturn\n\t}\n\tc.running = true\n\tgo c.run()\n}\n\n// Run the cron scheduler, or no-op if already running.\nfunc (c *Cron) Run() {\n\tif c.running {\n\t\treturn\n\t}\n\tc.running = true\n\tc.run()\n}\n\nfunc (c *Cron) runWithRecovery(j Job) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tconst size = 64 << 10\n\t\t\tbuf := make([]byte, size)\n\t\t\tbuf = buf[:runtime.Stack(buf, false)]\n\t\t\tc.logf(\"cron: panic running job: %v\\n%s\", r, buf)\n\t\t}\n\t}()\n\tj.Run()\n}\n\n// Run the scheduler. this is private just due to the need to synchronize\n// access to the 'running' state variable.\nfunc (c *Cron) run() {\n\t// Figure out the next activation times for each entry.\n\tnow := c.now()\n\tfor _, entry := range c.entries {\n\t\tentry.Next = entry.Schedule.Next(now)\n\t}\n\n\tfor {\n\t\t// Determine the next entry to run.\n\t\tsort.Sort(byTime(c.entries))\n\n\t\tvar timer *time.Timer\n\t\tif len(c.entries) == 0 || c.entries[0].Next.IsZero() {\n\t\t\t// If there are no entries yet, just sleep - it still handles new entries\n\t\t\t// and stop requests.\n\t\t\ttimer = time.NewTimer(100000 * time.Hour)\n\t\t} else {\n\t\t\ttimer = time.NewTimer(c.entries[0].Next.Sub(now))\n\t\t}\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase now = <-timer.C:\n\t\t\t\tnow = now.In(c.location)\n\t\t\t\t// Run every entry whose next time was less than now\n\t\t\t\tfor _, e := range c.entries {\n\t\t\t\t\tif e.Next.After(now) || e.Next.IsZero() {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tgo c.runWithRecovery(e.Job)\n\t\t\t\t\te.Prev = e.Next\n\t\t\t\t\te.Next = e.Schedule.Next(now)\n\t\t\t\t}\n\n\t\t\tcase newEntry := <-c.add:\n\t\t\t\ttimer.Stop()\n\t\t\t\tnow = c.now()\n\t\t\t\tnewEntry.Next = newEntry.Schedule.Next(now)\n\t\t\t\tc.entries = append(c.entries, newEntry)\n\n\t\t\tcase <-c.snapshot:\n\t\t\t\tc.snapshot <- c.entrySnapshot()\n\t\t\t\tcontinue\n\n\t\t\tcase <-c.stop:\n\t\t\t\ttimer.Stop()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Logs an error to stderr or to the configured error log\nfunc (c *Cron) logf(format string, args ...interface{}) {\n\tif c.ErrorLog != nil {\n\t\tc.ErrorLog.Printf(format, args...)\n\t} else {\n\t\tlog.Printf(format, args...)\n\t}\n}\n\n// Stop stops the cron scheduler if it is running; otherwise it does nothing.\nfunc (c *Cron) Stop() {\n\tif !c.running {\n\t\treturn\n\t}\n\tc.stop <- struct{}{}\n\tc.running = false\n}\n\n// entrySnapshot returns a copy of the current cron entry list.\nfunc (c *Cron) entrySnapshot() []*Entry {\n\tentries := []*Entry{}\n\tfor _, e := range c.entries {\n\t\tentries = append(entries, &Entry{\n\t\t\tSchedule: e.Schedule,\n\t\t\tNext:     e.Next,\n\t\t\tPrev:     e.Prev,\n\t\t\tJob:      e.Job,\n\t\t})\n\t}\n\treturn entries\n}\n\n// now returns current time in c location\nfunc (c *Cron) now() time.Time {\n\treturn time.Now().In(c.location)\n}\n"
  },
  {
    "path": "vendor/github.com/robfig/cron/doc.go",
    "content": "/*\nPackage cron implements a cron spec parser and job runner.\n\nUsage\n\nCallers may register Funcs to be invoked on a given schedule.  Cron will run\nthem in their own goroutines.\n\n\tc := cron.New()\n\tc.AddFunc(\"0 30 * * * *\", func() { fmt.Println(\"Every hour on the half hour\") })\n\tc.AddFunc(\"@hourly\",      func() { fmt.Println(\"Every hour\") })\n\tc.AddFunc(\"@every 1h30m\", func() { fmt.Println(\"Every hour thirty\") })\n\tc.Start()\n\t..\n\t// Funcs are invoked in their own goroutine, asynchronously.\n\t...\n\t// Funcs may also be added to a running Cron\n\tc.AddFunc(\"@daily\", func() { fmt.Println(\"Every day\") })\n\t..\n\t// Inspect the cron job entries' next and previous run times.\n\tinspect(c.Entries())\n\t..\n\tc.Stop()  // Stop the scheduler (does not stop any jobs already running).\n\nCRON Expression Format\n\nA cron expression represents a set of times, using 6 space-separated fields.\n\n\tField name   | Mandatory? | Allowed values  | Allowed special characters\n\t----------   | ---------- | --------------  | --------------------------\n\tSeconds      | Yes        | 0-59            | * / , -\n\tMinutes      | Yes        | 0-59            | * / , -\n\tHours        | Yes        | 0-23            | * / , -\n\tDay of month | Yes        | 1-31            | * / , - ?\n\tMonth        | Yes        | 1-12 or JAN-DEC | * / , -\n\tDay of week  | Yes        | 0-6 or SUN-SAT  | * / , - ?\n\nNote: Month and Day-of-week field values are case insensitive.  \"SUN\", \"Sun\",\nand \"sun\" are equally accepted.\n\nSpecial Characters\n\nAsterisk ( * )\n\nThe asterisk indicates that the cron expression will match for all values of the\nfield; e.g., using an asterisk in the 5th field (month) would indicate every\nmonth.\n\nSlash ( / )\n\nSlashes are used to describe increments of ranges. For example 3-59/15 in the\n1st field (minutes) would indicate the 3rd minute of the hour and every 15\nminutes thereafter. The form \"*\\/...\" is equivalent to the form \"first-last/...\",\nthat is, an increment over the largest possible range of the field.  The form\n\"N/...\" is accepted as meaning \"N-MAX/...\", that is, starting at N, use the\nincrement until the end of that specific range.  It does not wrap around.\n\nComma ( , )\n\nCommas are used to separate items of a list. For example, using \"MON,WED,FRI\" in\nthe 5th field (day of week) would mean Mondays, Wednesdays and Fridays.\n\nHyphen ( - )\n\nHyphens are used to define ranges. For example, 9-17 would indicate every\nhour between 9am and 5pm inclusive.\n\nQuestion mark ( ? )\n\nQuestion mark may be used instead of '*' for leaving either day-of-month or\nday-of-week blank.\n\nPredefined schedules\n\nYou may use one of several pre-defined schedules in place of a cron expression.\n\n\tEntry                  | Description                                | Equivalent To\n\t-----                  | -----------                                | -------------\n\t@yearly (or @annually) | Run once a year, midnight, Jan. 1st        | 0 0 0 1 1 *\n\t@monthly               | Run once a month, midnight, first of month | 0 0 0 1 * *\n\t@weekly                | Run once a week, midnight between Sat/Sun  | 0 0 0 * * 0\n\t@daily (or @midnight)  | Run once a day, midnight                   | 0 0 0 * * *\n\t@hourly                | Run once an hour, beginning of hour        | 0 0 * * * *\n\nIntervals\n\nYou may also schedule a job to execute at fixed intervals, starting at the time it's added \nor cron is run. This is supported by formatting the cron spec like this:\n\n    @every <duration>\n\nwhere \"duration\" is a string accepted by time.ParseDuration\n(http://golang.org/pkg/time/#ParseDuration).\n\nFor example, \"@every 1h30m10s\" would indicate a schedule that activates after\n1 hour, 30 minutes, 10 seconds, and then every interval after that.\n\nNote: The interval does not take the job runtime into account.  For example,\nif a job takes 3 minutes to run, and it is scheduled to run every 5 minutes,\nit will have only 2 minutes of idle time between each run.\n\nTime zones\n\nAll interpretation and scheduling is done in the machine's local time zone (as\nprovided by the Go time package (http://www.golang.org/pkg/time).\n\nBe aware that jobs scheduled during daylight-savings leap-ahead transitions will\nnot be run!\n\nThread safety\n\nSince the Cron service runs concurrently with the calling code, some amount of\ncare must be taken to ensure proper synchronization.\n\nAll cron methods are designed to be correctly synchronized as long as the caller\nensures that invocations have a clear happens-before ordering between them.\n\nImplementation\n\nCron entries are stored in an array, sorted by their next activation time.  Cron\nsleeps until the next job is due to be run.\n\nUpon waking:\n - it runs each entry that is active on that second\n - it calculates the next run times for the jobs that were run\n - it re-sorts the array of entries by next activation time.\n - it goes to sleep until the soonest job.\n*/\npackage cron\n"
  },
  {
    "path": "vendor/github.com/robfig/cron/parser.go",
    "content": "package cron\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Configuration options for creating a parser. Most options specify which\n// fields should be included, while others enable features. If a field is not\n// included the parser will assume a default value. These options do not change\n// the order fields are parse in.\ntype ParseOption int\n\nconst (\n\tSecond      ParseOption = 1 << iota // Seconds field, default 0\n\tMinute                              // Minutes field, default 0\n\tHour                                // Hours field, default 0\n\tDom                                 // Day of month field, default *\n\tMonth                               // Month field, default *\n\tDow                                 // Day of week field, default *\n\tDowOptional                         // Optional day of week field, default *\n\tDescriptor                          // Allow descriptors such as @monthly, @weekly, etc.\n)\n\nvar places = []ParseOption{\n\tSecond,\n\tMinute,\n\tHour,\n\tDom,\n\tMonth,\n\tDow,\n}\n\nvar defaults = []string{\n\t\"0\",\n\t\"0\",\n\t\"0\",\n\t\"*\",\n\t\"*\",\n\t\"*\",\n}\n\n// A custom Parser that can be configured.\ntype Parser struct {\n\toptions   ParseOption\n\toptionals int\n}\n\n// Creates a custom Parser with custom options.\n//\n//  // Standard parser without descriptors\n//  specParser := NewParser(Minute | Hour | Dom | Month | Dow)\n//  sched, err := specParser.Parse(\"0 0 15 */3 *\")\n//\n//  // Same as above, just excludes time fields\n//  subsParser := NewParser(Dom | Month | Dow)\n//  sched, err := specParser.Parse(\"15 */3 *\")\n//\n//  // Same as above, just makes Dow optional\n//  subsParser := NewParser(Dom | Month | DowOptional)\n//  sched, err := specParser.Parse(\"15 */3\")\n//\nfunc NewParser(options ParseOption) Parser {\n\toptionals := 0\n\tif options&DowOptional > 0 {\n\t\toptions |= Dow\n\t\toptionals++\n\t}\n\treturn Parser{options, optionals}\n}\n\n// Parse returns a new crontab schedule representing the given spec.\n// It returns a descriptive error if the spec is not valid.\n// It accepts crontab specs and features configured by NewParser.\nfunc (p Parser) Parse(spec string) (Schedule, error) {\n\tif len(spec) == 0 {\n\t\treturn nil, fmt.Errorf(\"Empty spec string\")\n\t}\n\tif spec[0] == '@' && p.options&Descriptor > 0 {\n\t\treturn parseDescriptor(spec)\n\t}\n\n\t// Figure out how many fields we need\n\tmax := 0\n\tfor _, place := range places {\n\t\tif p.options&place > 0 {\n\t\t\tmax++\n\t\t}\n\t}\n\tmin := max - p.optionals\n\n\t// Split fields on whitespace\n\tfields := strings.Fields(spec)\n\n\t// Validate number of fields\n\tif count := len(fields); count < min || count > max {\n\t\tif min == max {\n\t\t\treturn nil, fmt.Errorf(\"Expected exactly %d fields, found %d: %s\", min, count, spec)\n\t\t}\n\t\treturn nil, fmt.Errorf(\"Expected %d to %d fields, found %d: %s\", min, max, count, spec)\n\t}\n\n\t// Fill in missing fields\n\tfields = expandFields(fields, p.options)\n\n\tvar err error\n\tfield := func(field string, r bounds) uint64 {\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\tvar bits uint64\n\t\tbits, err = getField(field, r)\n\t\treturn bits\n\t}\n\n\tvar (\n\t\tsecond     = field(fields[0], seconds)\n\t\tminute     = field(fields[1], minutes)\n\t\thour       = field(fields[2], hours)\n\t\tdayofmonth = field(fields[3], dom)\n\t\tmonth      = field(fields[4], months)\n\t\tdayofweek  = field(fields[5], dow)\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &SpecSchedule{\n\t\tSecond: second,\n\t\tMinute: minute,\n\t\tHour:   hour,\n\t\tDom:    dayofmonth,\n\t\tMonth:  month,\n\t\tDow:    dayofweek,\n\t}, nil\n}\n\nfunc expandFields(fields []string, options ParseOption) []string {\n\tn := 0\n\tcount := len(fields)\n\texpFields := make([]string, len(places))\n\tcopy(expFields, defaults)\n\tfor i, place := range places {\n\t\tif options&place > 0 {\n\t\t\texpFields[i] = fields[n]\n\t\t\tn++\n\t\t}\n\t\tif n == count {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn expFields\n}\n\nvar standardParser = NewParser(\n\tMinute | Hour | Dom | Month | Dow | Descriptor,\n)\n\n// ParseStandard returns a new crontab schedule representing the given standardSpec\n// (https://en.wikipedia.org/wiki/Cron). It differs from Parse requiring to always\n// pass 5 entries representing: minute, hour, day of month, month and day of week,\n// in that order. It returns a descriptive error if the spec is not valid.\n//\n// It accepts\n//   - Standard crontab specs, e.g. \"* * * * ?\"\n//   - Descriptors, e.g. \"@midnight\", \"@every 1h30m\"\nfunc ParseStandard(standardSpec string) (Schedule, error) {\n\treturn standardParser.Parse(standardSpec)\n}\n\nvar defaultParser = NewParser(\n\tSecond | Minute | Hour | Dom | Month | DowOptional | Descriptor,\n)\n\n// Parse returns a new crontab schedule representing the given spec.\n// It returns a descriptive error if the spec is not valid.\n//\n// It accepts\n//   - Full crontab specs, e.g. \"* * * * * ?\"\n//   - Descriptors, e.g. \"@midnight\", \"@every 1h30m\"\nfunc Parse(spec string) (Schedule, error) {\n\treturn defaultParser.Parse(spec)\n}\n\n// getField returns an Int with the bits set representing all of the times that\n// the field represents or error parsing field value.  A \"field\" is a comma-separated\n// list of \"ranges\".\nfunc getField(field string, r bounds) (uint64, error) {\n\tvar bits uint64\n\tranges := strings.FieldsFunc(field, func(r rune) bool { return r == ',' })\n\tfor _, expr := range ranges {\n\t\tbit, err := getRange(expr, r)\n\t\tif err != nil {\n\t\t\treturn bits, err\n\t\t}\n\t\tbits |= bit\n\t}\n\treturn bits, nil\n}\n\n// getRange returns the bits indicated by the given expression:\n//   number | number \"-\" number [ \"/\" number ]\n// or error parsing range.\nfunc getRange(expr string, r bounds) (uint64, error) {\n\tvar (\n\t\tstart, end, step uint\n\t\trangeAndStep     = strings.Split(expr, \"/\")\n\t\tlowAndHigh       = strings.Split(rangeAndStep[0], \"-\")\n\t\tsingleDigit      = len(lowAndHigh) == 1\n\t\terr              error\n\t)\n\n\tvar extra uint64\n\tif lowAndHigh[0] == \"*\" || lowAndHigh[0] == \"?\" {\n\t\tstart = r.min\n\t\tend = r.max\n\t\textra = starBit\n\t} else {\n\t\tstart, err = parseIntOrName(lowAndHigh[0], r.names)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tswitch len(lowAndHigh) {\n\t\tcase 1:\n\t\t\tend = start\n\t\tcase 2:\n\t\t\tend, err = parseIntOrName(lowAndHigh[1], r.names)\n\t\t\tif err != nil {\n\t\t\t\treturn 0, err\n\t\t\t}\n\t\tdefault:\n\t\t\treturn 0, fmt.Errorf(\"Too many hyphens: %s\", expr)\n\t\t}\n\t}\n\n\tswitch len(rangeAndStep) {\n\tcase 1:\n\t\tstep = 1\n\tcase 2:\n\t\tstep, err = mustParseInt(rangeAndStep[1])\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\t// Special handling: \"N/step\" means \"N-max/step\".\n\t\tif singleDigit {\n\t\t\tend = r.max\n\t\t}\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"Too many slashes: %s\", expr)\n\t}\n\n\tif start < r.min {\n\t\treturn 0, fmt.Errorf(\"Beginning of range (%d) below minimum (%d): %s\", start, r.min, expr)\n\t}\n\tif end > r.max {\n\t\treturn 0, fmt.Errorf(\"End of range (%d) above maximum (%d): %s\", end, r.max, expr)\n\t}\n\tif start > end {\n\t\treturn 0, fmt.Errorf(\"Beginning of range (%d) beyond end of range (%d): %s\", start, end, expr)\n\t}\n\tif step == 0 {\n\t\treturn 0, fmt.Errorf(\"Step of range should be a positive number: %s\", expr)\n\t}\n\n\treturn getBits(start, end, step) | extra, nil\n}\n\n// parseIntOrName returns the (possibly-named) integer contained in expr.\nfunc parseIntOrName(expr string, names map[string]uint) (uint, error) {\n\tif names != nil {\n\t\tif namedInt, ok := names[strings.ToLower(expr)]; ok {\n\t\t\treturn namedInt, nil\n\t\t}\n\t}\n\treturn mustParseInt(expr)\n}\n\n// mustParseInt parses the given expression as an int or returns an error.\nfunc mustParseInt(expr string) (uint, error) {\n\tnum, err := strconv.Atoi(expr)\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"Failed to parse int from %s: %s\", expr, err)\n\t}\n\tif num < 0 {\n\t\treturn 0, fmt.Errorf(\"Negative number (%d) not allowed: %s\", num, expr)\n\t}\n\n\treturn uint(num), nil\n}\n\n// getBits sets all bits in the range [min, max], modulo the given step size.\nfunc getBits(min, max, step uint) uint64 {\n\tvar bits uint64\n\n\t// If step is 1, use shifts.\n\tif step == 1 {\n\t\treturn ^(math.MaxUint64 << (max + 1)) & (math.MaxUint64 << min)\n\t}\n\n\t// Else, use a simple loop.\n\tfor i := min; i <= max; i += step {\n\t\tbits |= 1 << i\n\t}\n\treturn bits\n}\n\n// all returns all bits within the given bounds.  (plus the star bit)\nfunc all(r bounds) uint64 {\n\treturn getBits(r.min, r.max, 1) | starBit\n}\n\n// parseDescriptor returns a predefined schedule for the expression, or error if none matches.\nfunc parseDescriptor(descriptor string) (Schedule, error) {\n\tswitch descriptor {\n\tcase \"@yearly\", \"@annually\":\n\t\treturn &SpecSchedule{\n\t\t\tSecond: 1 << seconds.min,\n\t\t\tMinute: 1 << minutes.min,\n\t\t\tHour:   1 << hours.min,\n\t\t\tDom:    1 << dom.min,\n\t\t\tMonth:  1 << months.min,\n\t\t\tDow:    all(dow),\n\t\t}, nil\n\n\tcase \"@monthly\":\n\t\treturn &SpecSchedule{\n\t\t\tSecond: 1 << seconds.min,\n\t\t\tMinute: 1 << minutes.min,\n\t\t\tHour:   1 << hours.min,\n\t\t\tDom:    1 << dom.min,\n\t\t\tMonth:  all(months),\n\t\t\tDow:    all(dow),\n\t\t}, nil\n\n\tcase \"@weekly\":\n\t\treturn &SpecSchedule{\n\t\t\tSecond: 1 << seconds.min,\n\t\t\tMinute: 1 << minutes.min,\n\t\t\tHour:   1 << hours.min,\n\t\t\tDom:    all(dom),\n\t\t\tMonth:  all(months),\n\t\t\tDow:    1 << dow.min,\n\t\t}, nil\n\n\tcase \"@daily\", \"@midnight\":\n\t\treturn &SpecSchedule{\n\t\t\tSecond: 1 << seconds.min,\n\t\t\tMinute: 1 << minutes.min,\n\t\t\tHour:   1 << hours.min,\n\t\t\tDom:    all(dom),\n\t\t\tMonth:  all(months),\n\t\t\tDow:    all(dow),\n\t\t}, nil\n\n\tcase \"@hourly\":\n\t\treturn &SpecSchedule{\n\t\t\tSecond: 1 << seconds.min,\n\t\t\tMinute: 1 << minutes.min,\n\t\t\tHour:   all(hours),\n\t\t\tDom:    all(dom),\n\t\t\tMonth:  all(months),\n\t\t\tDow:    all(dow),\n\t\t}, nil\n\t}\n\n\tconst every = \"@every \"\n\tif strings.HasPrefix(descriptor, every) {\n\t\tduration, err := time.ParseDuration(descriptor[len(every):])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"Failed to parse duration %s: %s\", descriptor, err)\n\t\t}\n\t\treturn Every(duration), nil\n\t}\n\n\treturn nil, fmt.Errorf(\"Unrecognized descriptor: %s\", descriptor)\n}\n"
  },
  {
    "path": "vendor/github.com/robfig/cron/spec.go",
    "content": "package cron\n\nimport \"time\"\n\n// SpecSchedule specifies a duty cycle (to the second granularity), based on a\n// traditional crontab specification. It is computed initially and stored as bit sets.\ntype SpecSchedule struct {\n\tSecond, Minute, Hour, Dom, Month, Dow uint64\n}\n\n// bounds provides a range of acceptable values (plus a map of name to value).\ntype bounds struct {\n\tmin, max uint\n\tnames    map[string]uint\n}\n\n// The bounds for each field.\nvar (\n\tseconds = bounds{0, 59, nil}\n\tminutes = bounds{0, 59, nil}\n\thours   = bounds{0, 23, nil}\n\tdom     = bounds{1, 31, nil}\n\tmonths  = bounds{1, 12, map[string]uint{\n\t\t\"jan\": 1,\n\t\t\"feb\": 2,\n\t\t\"mar\": 3,\n\t\t\"apr\": 4,\n\t\t\"may\": 5,\n\t\t\"jun\": 6,\n\t\t\"jul\": 7,\n\t\t\"aug\": 8,\n\t\t\"sep\": 9,\n\t\t\"oct\": 10,\n\t\t\"nov\": 11,\n\t\t\"dec\": 12,\n\t}}\n\tdow = bounds{0, 6, map[string]uint{\n\t\t\"sun\": 0,\n\t\t\"mon\": 1,\n\t\t\"tue\": 2,\n\t\t\"wed\": 3,\n\t\t\"thu\": 4,\n\t\t\"fri\": 5,\n\t\t\"sat\": 6,\n\t}}\n)\n\nconst (\n\t// Set the top bit if a star was included in the expression.\n\tstarBit = 1 << 63\n)\n\n// Next returns the next time this schedule is activated, greater than the given\n// time.  If no time can be found to satisfy the schedule, return the zero time.\nfunc (s *SpecSchedule) Next(t time.Time) time.Time {\n\t// General approach:\n\t// For Month, Day, Hour, Minute, Second:\n\t// Check if the time value matches.  If yes, continue to the next field.\n\t// If the field doesn't match the schedule, then increment the field until it matches.\n\t// While incrementing the field, a wrap-around brings it back to the beginning\n\t// of the field list (since it is necessary to re-verify previous field\n\t// values)\n\n\t// Start at the earliest possible time (the upcoming second).\n\tt = t.Add(1*time.Second - time.Duration(t.Nanosecond())*time.Nanosecond)\n\n\t// This flag indicates whether a field has been incremented.\n\tadded := false\n\n\t// If no time is found within five years, return zero.\n\tyearLimit := t.Year() + 5\n\nWRAP:\n\tif t.Year() > yearLimit {\n\t\treturn time.Time{}\n\t}\n\n\t// Find the first applicable month.\n\t// If it's this month, then do nothing.\n\tfor 1<<uint(t.Month())&s.Month == 0 {\n\t\t// If we have to add a month, reset the other parts to 0.\n\t\tif !added {\n\t\t\tadded = true\n\t\t\t// Otherwise, set the date at the beginning (since the current time is irrelevant).\n\t\t\tt = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location())\n\t\t}\n\t\tt = t.AddDate(0, 1, 0)\n\n\t\t// Wrapped around.\n\t\tif t.Month() == time.January {\n\t\t\tgoto WRAP\n\t\t}\n\t}\n\n\t// Now get a day in that month.\n\tfor !dayMatches(s, t) {\n\t\tif !added {\n\t\t\tadded = true\n\t\t\tt = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location())\n\t\t}\n\t\tt = t.AddDate(0, 0, 1)\n\n\t\tif t.Day() == 1 {\n\t\t\tgoto WRAP\n\t\t}\n\t}\n\n\tfor 1<<uint(t.Hour())&s.Hour == 0 {\n\t\tif !added {\n\t\t\tadded = true\n\t\t\tt = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), 0, 0, 0, t.Location())\n\t\t}\n\t\tt = t.Add(1 * time.Hour)\n\n\t\tif t.Hour() == 0 {\n\t\t\tgoto WRAP\n\t\t}\n\t}\n\n\tfor 1<<uint(t.Minute())&s.Minute == 0 {\n\t\tif !added {\n\t\t\tadded = true\n\t\t\tt = t.Truncate(time.Minute)\n\t\t}\n\t\tt = t.Add(1 * time.Minute)\n\n\t\tif t.Minute() == 0 {\n\t\t\tgoto WRAP\n\t\t}\n\t}\n\n\tfor 1<<uint(t.Second())&s.Second == 0 {\n\t\tif !added {\n\t\t\tadded = true\n\t\t\tt = t.Truncate(time.Second)\n\t\t}\n\t\tt = t.Add(1 * time.Second)\n\n\t\tif t.Second() == 0 {\n\t\t\tgoto WRAP\n\t\t}\n\t}\n\n\treturn t\n}\n\n// dayMatches returns true if the schedule's day-of-week and day-of-month\n// restrictions are satisfied by the given time.\nfunc dayMatches(s *SpecSchedule, t time.Time) bool {\n\tvar (\n\t\tdomMatch bool = 1<<uint(t.Day())&s.Dom > 0\n\t\tdowMatch bool = 1<<uint(t.Weekday())&s.Dow > 0\n\t)\n\tif s.Dom&starBit > 0 || s.Dow&starBit > 0 {\n\t\treturn domMatch && dowMatch\n\t}\n\treturn domMatch || dowMatch\n}\n"
  },
  {
    "path": "vendor/github.com/rs/cors/LICENSE",
    "content": "Copyright (c) 2014 Olivier Poitrey <rs@dailymotion.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto 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\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/rs/cors/README.md",
    "content": "# Go CORS handler [![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/cors) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/cors/master/LICENSE) [![build](https://img.shields.io/travis/rs/cors.svg?style=flat)](https://travis-ci.org/rs/cors) [![Coverage](http://gocover.io/_badge/github.com/rs/cors)](http://gocover.io/github.com/rs/cors)\n\nCORS is a `net/http` handler implementing [Cross Origin Resource Sharing W3 specification](http://www.w3.org/TR/cors/) in Golang.\n\n## Getting Started\n\nAfter installing Go and setting up your [GOPATH](http://golang.org/doc/code.html#GOPATH), create your first `.go` file. We'll call it `server.go`.\n\n```go\npackage main\n\nimport (\n    \"net/http\"\n\n    \"github.com/rs/cors\"\n)\n\nfunc main() {\n    mux := http.NewServeMux()\n    mux.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {\n        w.Header().Set(\"Content-Type\", \"application/json\")\n        w.Write([]byte(\"{\\\"hello\\\": \\\"world\\\"}\"))\n    })\n\n    // cors.Default() setup the middleware with default options being\n    // all origins accepted with simple methods (GET, POST). See\n    // documentation below for more options.\n    handler := cors.Default().Handler(mux)\n    http.ListenAndServe(\":8080\", handler)\n}\n```\n\nInstall `cors`:\n\n    go get github.com/rs/cors\n\nThen run your server:\n\n    go run server.go\n\nThe server now runs on `localhost:8080`:\n\n    $ curl -D - -H 'Origin: http://foo.com' http://localhost:8080/\n    HTTP/1.1 200 OK\n    Access-Control-Allow-Origin: foo.com\n    Content-Type: application/json\n    Date: Sat, 25 Oct 2014 03:43:57 GMT\n    Content-Length: 18\n\n    {\"hello\": \"world\"}\n\n### More Examples\n\n* `net/http`: [examples/nethttp/server.go](https://github.com/rs/cors/blob/master/examples/nethttp/server.go)\n* [Goji](https://goji.io): [examples/goji/server.go](https://github.com/rs/cors/blob/master/examples/goji/server.go)\n* [Martini](http://martini.codegangsta.io): [examples/martini/server.go](https://github.com/rs/cors/blob/master/examples/martini/server.go)\n* [Negroni](https://github.com/codegangsta/negroni): [examples/negroni/server.go](https://github.com/rs/cors/blob/master/examples/negroni/server.go)\n* [Alice](https://github.com/justinas/alice): [examples/alice/server.go](https://github.com/rs/cors/blob/master/examples/alice/server.go)\n\n## Parameters\n\nParameters are passed to the middleware thru the `cors.New` method as follow:\n\n```go\nc := cors.New(cors.Options{\n    AllowedOrigins: []string{\"http://foo.com\"},\n    AllowCredentials: true,\n})\n\n// Insert the middleware\nhandler = c.Handler(handler)\n```\n\n* **AllowedOrigins** `[]string`: A list of origins a cross-domain request can be executed from. If the special `*` value is present in the list, all origins will be allowed. An origin may contain a wildcard (`*`) to replace 0 or more characters (i.e.: `http://*.domain.com`). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. The default value is `*`.\n* **AllowOriginFunc** `func (origin string) bool`: A custom function to validate the origin. It take the origin as argument and returns true if allowed or false otherwise. If this option is set, the content of `AllowedOrigins` is ignored\n* **AllowedMethods** `[]string`: A list of methods the client is allowed to use with cross-domain requests. Default value is simple methods (`GET` and `POST`).\n* **AllowedHeaders** `[]string`: A list of non simple headers the client is allowed to use with cross-domain requests.\n* **ExposedHeaders** `[]string`: Indicates which headers are safe to expose to the API of a CORS API specification\n* **AllowCredentials** `bool`: Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. The default is `false`.\n* **MaxAge** `int`: Indicates how long (in seconds) the results of a preflight request can be cached. The default is `0` which stands for no max age.\n* **OptionsPassthrough** `bool`: Instructs preflight to let other potential next handlers to process the `OPTIONS` method. Turn this on if your application handles `OPTIONS`.\n* **Debug** `bool`: Debugging flag adds additional output to debug server side CORS issues.\n\nSee [API documentation](http://godoc.org/github.com/rs/cors) for more info.\n\n## Benchmarks\n\n    BenchmarkWithout          20000000    64.6 ns/op      8 B/op    1 allocs/op\n    BenchmarkDefault          3000000      469 ns/op    114 B/op    2 allocs/op\n    BenchmarkAllowedOrigin    3000000      608 ns/op    114 B/op    2 allocs/op\n    BenchmarkPreflight        20000000    73.2 ns/op      0 B/op    0 allocs/op\n    BenchmarkPreflightHeader  20000000    73.6 ns/op      0 B/op    0 allocs/op\n    BenchmarkParseHeaderList  2000000      847 ns/op    184 B/op    6 allocs/op\n    BenchmarkParse…Single     5000000      290 ns/op     32 B/op    3 allocs/op\n    BenchmarkParse…Normalized 2000000      776 ns/op    160 B/op    6 allocs/op\n\n## Licenses\n\nAll source code is licensed under the [MIT License](https://raw.github.com/rs/cors/master/LICENSE).\n"
  },
  {
    "path": "vendor/github.com/rs/cors/cors.go",
    "content": "/*\nPackage cors is net/http handler to handle CORS related requests\nas defined by http://www.w3.org/TR/cors/\n\nYou can configure it by passing an option struct to cors.New:\n\n    c := cors.New(cors.Options{\n        AllowedOrigins: []string{\"foo.com\"},\n        AllowedMethods: []string{\"GET\", \"POST\", \"DELETE\"},\n        AllowCredentials: true,\n    })\n\nThen insert the handler in the chain:\n\n    handler = c.Handler(handler)\n\nSee Options documentation for more options.\n\nThe resulting handler is a standard net/http handler.\n*/\npackage cors\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/rs/xhandler\"\n\t\"golang.org/x/net/context\"\n)\n\n// Options is a configuration container to setup the CORS middleware.\ntype Options struct {\n\t// AllowedOrigins is a list of origins a cross-domain request can be executed from.\n\t// If the special \"*\" value is present in the list, all origins will be allowed.\n\t// An origin may contain a wildcard (*) to replace 0 or more characters\n\t// (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penality.\n\t// Only one wildcard can be used per origin.\n\t// Default value is [\"*\"]\n\tAllowedOrigins []string\n\t// AllowOriginFunc is a custom function to validate the origin. It take the origin\n\t// as argument and returns true if allowed or false otherwise. If this option is\n\t// set, the content of AllowedOrigins is ignored.\n\tAllowOriginFunc func(origin string) bool\n\t// AllowedMethods is a list of methods the client is allowed to use with\n\t// cross-domain requests. Default value is simple methods (GET and POST)\n\tAllowedMethods []string\n\t// AllowedHeaders is list of non simple headers the client is allowed to use with\n\t// cross-domain requests.\n\t// If the special \"*\" value is present in the list, all headers will be allowed.\n\t// Default value is [] but \"Origin\" is always appended to the list.\n\tAllowedHeaders []string\n\t// ExposedHeaders indicates which headers are safe to expose to the API of a CORS\n\t// API specification\n\tExposedHeaders []string\n\t// AllowCredentials indicates whether the request can include user credentials like\n\t// cookies, HTTP authentication or client side SSL certificates.\n\tAllowCredentials bool\n\t// MaxAge indicates how long (in seconds) the results of a preflight request\n\t// can be cached\n\tMaxAge int\n\t// OptionsPassthrough instructs preflight to let other potential next handlers to\n\t// process the OPTIONS method. Turn this on if your application handles OPTIONS.\n\tOptionsPassthrough bool\n\t// Debugging flag adds additional output to debug server side CORS issues\n\tDebug bool\n}\n\n// Cors http handler\ntype Cors struct {\n\t// Debug logger\n\tLog *log.Logger\n\t// Set to true when allowed origins contains a \"*\"\n\tallowedOriginsAll bool\n\t// Normalized list of plain allowed origins\n\tallowedOrigins []string\n\t// List of allowed origins containing wildcards\n\tallowedWOrigins []wildcard\n\t// Optional origin validator function\n\tallowOriginFunc func(origin string) bool\n\t// Set to true when allowed headers contains a \"*\"\n\tallowedHeadersAll bool\n\t// Normalized list of allowed headers\n\tallowedHeaders []string\n\t// Normalized list of allowed methods\n\tallowedMethods []string\n\t// Normalized list of exposed headers\n\texposedHeaders    []string\n\tallowCredentials  bool\n\tmaxAge            int\n\toptionPassthrough bool\n}\n\n// New creates a new Cors handler with the provided options.\nfunc New(options Options) *Cors {\n\tc := &Cors{\n\t\texposedHeaders:    convert(options.ExposedHeaders, http.CanonicalHeaderKey),\n\t\tallowOriginFunc:   options.AllowOriginFunc,\n\t\tallowCredentials:  options.AllowCredentials,\n\t\tmaxAge:            options.MaxAge,\n\t\toptionPassthrough: options.OptionsPassthrough,\n\t}\n\tif options.Debug {\n\t\tc.Log = log.New(os.Stdout, \"[cors] \", log.LstdFlags)\n\t}\n\n\t// Normalize options\n\t// Note: for origins and methods matching, the spec requires a case-sensitive matching.\n\t// As it may error prone, we chose to ignore the spec here.\n\n\t// Allowed Origins\n\tif len(options.AllowedOrigins) == 0 {\n\t\t// Default is all origins\n\t\tc.allowedOriginsAll = true\n\t} else {\n\t\tc.allowedOrigins = []string{}\n\t\tc.allowedWOrigins = []wildcard{}\n\t\tfor _, origin := range options.AllowedOrigins {\n\t\t\t// Normalize\n\t\t\torigin = strings.ToLower(origin)\n\t\t\tif origin == \"*\" {\n\t\t\t\t// If \"*\" is present in the list, turn the whole list into a match all\n\t\t\t\tc.allowedOriginsAll = true\n\t\t\t\tc.allowedOrigins = nil\n\t\t\t\tc.allowedWOrigins = nil\n\t\t\t\tbreak\n\t\t\t} else if i := strings.IndexByte(origin, '*'); i >= 0 {\n\t\t\t\t// Split the origin in two: start and end string without the *\n\t\t\t\tw := wildcard{origin[0:i], origin[i+1 : len(origin)]}\n\t\t\t\tc.allowedWOrigins = append(c.allowedWOrigins, w)\n\t\t\t} else {\n\t\t\t\tc.allowedOrigins = append(c.allowedOrigins, origin)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Allowed Headers\n\tif len(options.AllowedHeaders) == 0 {\n\t\t// Use sensible defaults\n\t\tc.allowedHeaders = []string{\"Origin\", \"Accept\", \"Content-Type\"}\n\t} else {\n\t\t// Origin is always appended as some browsers will always request for this header at preflight\n\t\tc.allowedHeaders = convert(append(options.AllowedHeaders, \"Origin\"), http.CanonicalHeaderKey)\n\t\tfor _, h := range options.AllowedHeaders {\n\t\t\tif h == \"*\" {\n\t\t\t\tc.allowedHeadersAll = true\n\t\t\t\tc.allowedHeaders = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Allowed Methods\n\tif len(options.AllowedMethods) == 0 {\n\t\t// Default is spec's \"simple\" methods\n\t\tc.allowedMethods = []string{\"GET\", \"POST\"}\n\t} else {\n\t\tc.allowedMethods = convert(options.AllowedMethods, strings.ToUpper)\n\t}\n\n\treturn c\n}\n\n// Default creates a new Cors handler with default options\nfunc Default() *Cors {\n\treturn New(Options{})\n}\n\n// Handler apply the CORS specification on the request, and add relevant CORS headers\n// as necessary.\nfunc (c *Cors) Handler(h http.Handler) http.Handler {\n\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\tif r.Method == \"OPTIONS\" {\n\t\t\tc.logf(\"Handler: Preflight request\")\n\t\t\tc.handlePreflight(w, r)\n\t\t\t// Preflight requests are standalone and should stop the chain as some other\n\t\t\t// middleware may not handle OPTIONS requests correctly. One typical example\n\t\t\t// is authentication middleware ; OPTIONS requests won't carry authentication\n\t\t\t// headers (see #1)\n\t\t\tif c.optionPassthrough {\n\t\t\t\th.ServeHTTP(w, r)\n\t\t\t} else {\n\t\t\t\tw.WriteHeader(http.StatusOK)\n\t\t\t}\n\t\t} else {\n\t\t\tc.logf(\"Handler: Actual request\")\n\t\t\tc.handleActualRequest(w, r)\n\t\t\th.ServeHTTP(w, r)\n\t\t}\n\t})\n}\n\n// HandlerC is net/context aware handler\nfunc (c *Cors) HandlerC(h xhandler.HandlerC) xhandler.HandlerC {\n\treturn xhandler.HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\tif r.Method == \"OPTIONS\" {\n\t\t\tc.logf(\"Handler: Preflight request\")\n\t\t\tc.handlePreflight(w, r)\n\t\t\t// Preflight requests are standalone and should stop the chain as some other\n\t\t\t// middleware may not handle OPTIONS requests correctly. One typical example\n\t\t\t// is authentication middleware ; OPTIONS requests won't carry authentication\n\t\t\t// headers (see #1)\n\t\t\tif c.optionPassthrough {\n\t\t\t\th.ServeHTTPC(ctx, w, r)\n\t\t\t} else {\n\t\t\t\tw.WriteHeader(http.StatusOK)\n\t\t\t}\n\t\t} else {\n\t\t\tc.logf(\"Handler: Actual request\")\n\t\t\tc.handleActualRequest(w, r)\n\t\t\th.ServeHTTPC(ctx, w, r)\n\t\t}\n\t})\n}\n\n// HandlerFunc provides Martini compatible handler\nfunc (c *Cors) HandlerFunc(w http.ResponseWriter, r *http.Request) {\n\tif r.Method == \"OPTIONS\" {\n\t\tc.logf(\"HandlerFunc: Preflight request\")\n\t\tc.handlePreflight(w, r)\n\t} else {\n\t\tc.logf(\"HandlerFunc: Actual request\")\n\t\tc.handleActualRequest(w, r)\n\t}\n}\n\n// Negroni compatible interface\nfunc (c *Cors) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {\n\tif r.Method == \"OPTIONS\" {\n\t\tc.logf(\"ServeHTTP: Preflight request\")\n\t\tc.handlePreflight(w, r)\n\t\t// Preflight requests are standalone and should stop the chain as some other\n\t\t// middleware may not handle OPTIONS requests correctly. One typical example\n\t\t// is authentication middleware ; OPTIONS requests won't carry authentication\n\t\t// headers (see #1)\n\t\tif c.optionPassthrough {\n\t\t\tnext(w, r)\n\t\t} else {\n\t\t\tw.WriteHeader(http.StatusOK)\n\t\t}\n\t} else {\n\t\tc.logf(\"ServeHTTP: Actual request\")\n\t\tc.handleActualRequest(w, r)\n\t\tnext(w, r)\n\t}\n}\n\n// handlePreflight handles pre-flight CORS requests\nfunc (c *Cors) handlePreflight(w http.ResponseWriter, r *http.Request) {\n\theaders := w.Header()\n\torigin := r.Header.Get(\"Origin\")\n\n\tif r.Method != \"OPTIONS\" {\n\t\tc.logf(\"  Preflight aborted: %s!=OPTIONS\", r.Method)\n\t\treturn\n\t}\n\t// Always set Vary headers\n\t// see https://github.com/rs/cors/issues/10,\n\t//     https://github.com/rs/cors/commit/dbdca4d95feaa7511a46e6f1efb3b3aa505bc43f#commitcomment-12352001\n\theaders.Add(\"Vary\", \"Origin\")\n\theaders.Add(\"Vary\", \"Access-Control-Request-Method\")\n\theaders.Add(\"Vary\", \"Access-Control-Request-Headers\")\n\n\tif origin == \"\" {\n\t\tc.logf(\"  Preflight aborted: empty origin\")\n\t\treturn\n\t}\n\tif !c.isOriginAllowed(origin) {\n\t\tc.logf(\"  Preflight aborted: origin '%s' not allowed\", origin)\n\t\treturn\n\t}\n\n\treqMethod := r.Header.Get(\"Access-Control-Request-Method\")\n\tif !c.isMethodAllowed(reqMethod) {\n\t\tc.logf(\"  Preflight aborted: method '%s' not allowed\", reqMethod)\n\t\treturn\n\t}\n\treqHeaders := parseHeaderList(r.Header.Get(\"Access-Control-Request-Headers\"))\n\tif !c.areHeadersAllowed(reqHeaders) {\n\t\tc.logf(\"  Preflight aborted: headers '%v' not allowed\", reqHeaders)\n\t\treturn\n\t}\n\theaders.Set(\"Access-Control-Allow-Origin\", origin)\n\t// Spec says: Since the list of methods can be unbounded, simply returning the method indicated\n\t// by Access-Control-Request-Method (if supported) can be enough\n\theaders.Set(\"Access-Control-Allow-Methods\", strings.ToUpper(reqMethod))\n\tif len(reqHeaders) > 0 {\n\n\t\t// Spec says: Since the list of headers can be unbounded, simply returning supported headers\n\t\t// from Access-Control-Request-Headers can be enough\n\t\theaders.Set(\"Access-Control-Allow-Headers\", strings.Join(reqHeaders, \", \"))\n\t}\n\tif c.allowCredentials {\n\t\theaders.Set(\"Access-Control-Allow-Credentials\", \"true\")\n\t}\n\tif c.maxAge > 0 {\n\t\theaders.Set(\"Access-Control-Max-Age\", strconv.Itoa(c.maxAge))\n\t}\n\tc.logf(\"  Preflight response headers: %v\", headers)\n}\n\n// handleActualRequest handles simple cross-origin requests, actual request or redirects\nfunc (c *Cors) handleActualRequest(w http.ResponseWriter, r *http.Request) {\n\theaders := w.Header()\n\torigin := r.Header.Get(\"Origin\")\n\n\tif r.Method == \"OPTIONS\" {\n\t\tc.logf(\"  Actual request no headers added: method == %s\", r.Method)\n\t\treturn\n\t}\n\t// Always set Vary, see https://github.com/rs/cors/issues/10\n\theaders.Add(\"Vary\", \"Origin\")\n\tif origin == \"\" {\n\t\tc.logf(\"  Actual request no headers added: missing origin\")\n\t\treturn\n\t}\n\tif !c.isOriginAllowed(origin) {\n\t\tc.logf(\"  Actual request no headers added: origin '%s' not allowed\", origin)\n\t\treturn\n\t}\n\n\t// Note that spec does define a way to specifically disallow a simple method like GET or\n\t// POST. Access-Control-Allow-Methods is only used for pre-flight requests and the\n\t// spec doesn't instruct to check the allowed methods for simple cross-origin requests.\n\t// We think it's a nice feature to be able to have control on those methods though.\n\tif !c.isMethodAllowed(r.Method) {\n\t\tc.logf(\"  Actual request no headers added: method '%s' not allowed\", r.Method)\n\n\t\treturn\n\t}\n\theaders.Set(\"Access-Control-Allow-Origin\", origin)\n\tif len(c.exposedHeaders) > 0 {\n\t\theaders.Set(\"Access-Control-Expose-Headers\", strings.Join(c.exposedHeaders, \", \"))\n\t}\n\tif c.allowCredentials {\n\t\theaders.Set(\"Access-Control-Allow-Credentials\", \"true\")\n\t}\n\tc.logf(\"  Actual response added headers: %v\", headers)\n}\n\n// convenience method. checks if debugging is turned on before printing\nfunc (c *Cors) logf(format string, a ...interface{}) {\n\tif c.Log != nil {\n\t\tc.Log.Printf(format, a...)\n\t}\n}\n\n// isOriginAllowed checks if a given origin is allowed to perform cross-domain requests\n// on the endpoint\nfunc (c *Cors) isOriginAllowed(origin string) bool {\n\tif c.allowOriginFunc != nil {\n\t\treturn c.allowOriginFunc(origin)\n\t}\n\tif c.allowedOriginsAll {\n\t\treturn true\n\t}\n\torigin = strings.ToLower(origin)\n\tfor _, o := range c.allowedOrigins {\n\t\tif o == origin {\n\t\t\treturn true\n\t\t}\n\t}\n\tfor _, w := range c.allowedWOrigins {\n\t\tif w.match(origin) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// isMethodAllowed checks if a given method can be used as part of a cross-domain request\n// on the endpoing\nfunc (c *Cors) isMethodAllowed(method string) bool {\n\tif len(c.allowedMethods) == 0 {\n\t\t// If no method allowed, always return false, even for preflight request\n\t\treturn false\n\t}\n\tmethod = strings.ToUpper(method)\n\tif method == \"OPTIONS\" {\n\t\t// Always allow preflight requests\n\t\treturn true\n\t}\n\tfor _, m := range c.allowedMethods {\n\t\tif m == method {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// areHeadersAllowed checks if a given list of headers are allowed to used within\n// a cross-domain request.\nfunc (c *Cors) areHeadersAllowed(requestedHeaders []string) bool {\n\tif c.allowedHeadersAll || len(requestedHeaders) == 0 {\n\t\treturn true\n\t}\n\tfor _, header := range requestedHeaders {\n\t\theader = http.CanonicalHeaderKey(header)\n\t\tfound := false\n\t\tfor _, h := range c.allowedHeaders {\n\t\t\tif h == header {\n\t\t\t\tfound = true\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/rs/cors/utils.go",
    "content": "package cors\n\nimport \"strings\"\n\nconst toLower = 'a' - 'A'\n\ntype converter func(string) string\n\ntype wildcard struct {\n\tprefix string\n\tsuffix string\n}\n\nfunc (w wildcard) match(s string) bool {\n\treturn len(s) >= len(w.prefix+w.suffix) && strings.HasPrefix(s, w.prefix) && strings.HasSuffix(s, w.suffix)\n}\n\n// convert converts a list of string using the passed converter function\nfunc convert(s []string, c converter) []string {\n\tout := []string{}\n\tfor _, i := range s {\n\t\tout = append(out, c(i))\n\t}\n\treturn out\n}\n\n// parseHeaderList tokenize + normalize a string containing a list of headers\nfunc parseHeaderList(headerList string) []string {\n\tl := len(headerList)\n\th := make([]byte, 0, l)\n\tupper := true\n\t// Estimate the number headers in order to allocate the right splice size\n\tt := 0\n\tfor i := 0; i < l; i++ {\n\t\tif headerList[i] == ',' {\n\t\t\tt++\n\t\t}\n\t}\n\theaders := make([]string, 0, t)\n\tfor i := 0; i < l; i++ {\n\t\tb := headerList[i]\n\t\tif b >= 'a' && b <= 'z' {\n\t\t\tif upper {\n\t\t\t\th = append(h, b-toLower)\n\t\t\t} else {\n\t\t\t\th = append(h, b)\n\t\t\t}\n\t\t} else if b >= 'A' && b <= 'Z' {\n\t\t\tif !upper {\n\t\t\t\th = append(h, b+toLower)\n\t\t\t} else {\n\t\t\t\th = append(h, b)\n\t\t\t}\n\t\t} else if b == '-' || b == '_' || (b >= '0' && b <= '9') {\n\t\t\th = append(h, b)\n\t\t}\n\n\t\tif b == ' ' || b == ',' || i == l-1 {\n\t\t\tif len(h) > 0 {\n\t\t\t\t// Flush the found header\n\t\t\t\theaders = append(headers, string(h))\n\t\t\t\th = h[:0]\n\t\t\t\tupper = true\n\t\t\t}\n\t\t} else {\n\t\t\tupper = b == '-' || b == '_'\n\t\t}\n\t}\n\treturn headers\n}\n"
  },
  {
    "path": "vendor/github.com/rs/xhandler/LICENSE",
    "content": "Copyright (c) 2015 Olivier Poitrey <rs@dailymotion.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto 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\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/rs/xhandler/README.md",
    "content": "# XHandler\n\n[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/xhandler) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/xhandler/master/LICENSE) [![Build Status](https://travis-ci.org/rs/xhandler.svg?branch=master)](https://travis-ci.org/rs/xhandler) [![Coverage](http://gocover.io/_badge/github.com/rs/xhandler)](http://gocover.io/github.com/rs/xhandler)\n\nXHandler is a bridge between [net/context](https://godoc.org/golang.org/x/net/context) and `http.Handler`.\n\nIt lets you enforce `net/context` in your handlers without sacrificing compatibility with existing `http.Handlers` nor imposing a specific router.\n\nThanks to `net/context` deadline management, `xhandler` is able to enforce a per request deadline and will cancel the context when the client closes the connection unexpectedly.\n\nYou may create your own `net/context` aware handler pretty much the same way as you would do with http.Handler.\n\nRead more about xhandler on [Dailymotion engineering blog](http://engineering.dailymotion.com/our-way-to-go/).\n\n## Installing\n\n    go get -u github.com/rs/xhandler\n\n## Usage\n\n```go\npackage main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/rs/cors\"\n\t\"github.com/rs/xhandler\"\n\t\"golang.org/x/net/context\"\n)\n\ntype myMiddleware struct {\n\tnext xhandler.HandlerC\n}\n\nfunc (h myMiddleware) ServeHTTPC(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\tctx = context.WithValue(ctx, \"test\", \"World\")\n\th.next.ServeHTTPC(ctx, w, r)\n}\n\nfunc main() {\n\tc := xhandler.Chain{}\n\n\t// Add close notifier handler so context is cancelled when the client closes\n\t// the connection\n\tc.UseC(xhandler.CloseHandler)\n\n\t// Add timeout handler\n\tc.UseC(xhandler.TimeoutHandler(2 * time.Second))\n\n\t// Middleware putting something in the context\n\tc.UseC(func(next xhandler.HandlerC) xhandler.HandlerC {\n\t\treturn myMiddleware{next: next}\n\t})\n\n\t// Mix it with a non-context-aware middleware handler\n\tc.Use(cors.Default().Handler)\n\n\t// Final handler (using handlerFuncC), reading from the context\n\txh := xhandler.HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\tvalue := ctx.Value(\"test\").(string)\n\t\tw.Write([]byte(\"Hello \" + value))\n\t})\n\n\t// Bridge context aware handlers with http.Handler using xhandler.Handle()\n\thttp.Handle(\"/test\", c.Handler(xh))\n\n\tif err := http.ListenAndServe(\":8080\", nil); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n```\n\n### Using xmux\n\nXhandler comes with an optional context aware [muxer](https://github.com/rs/xmux) forked from [httprouter](https://github.com/julienschmidt/httprouter):\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/rs/xhandler\"\n\t\"github.com/rs/xmux\"\n\t\"golang.org/x/net/context\"\n)\n\nfunc main() {\n\tc := xhandler.Chain{}\n\n\t// Append a context-aware middleware handler\n\tc.UseC(xhandler.CloseHandler)\n\n\t// Another context-aware middleware handler\n\tc.UseC(xhandler.TimeoutHandler(2 * time.Second))\n\n\tmux := xmux.New()\n\n\t// Use c.Handler to terminate the chain with your final handler\n\tmux.GET(\"/welcome/:name\", xhandler.HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, req *http.Request) {\n\t\tfmt.Fprintf(w, \"Welcome %s!\", xmux.Params(ctx).Get(\"name\"))\n\t}))\n\n\tif err := http.ListenAndServe(\":8080\", c.Handler(mux)); err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n```\n\nSee [xmux](https://github.com/rs/xmux) for more examples.\n\n## Context Aware Middleware\n\nHere is a list of `net/context` aware middleware handlers implementing `xhandler.HandlerC` interface.\n\nFeel free to put up a PR linking your middleware if you have built one:\n\n| Middleware | Author | Description |\n| ---------- | ------ | ----------- |\n| [xmux](https://github.com/rs/xmux) | [Olivier Poitrey](https://github.com/rs) | HTTP request muxer |\n| [xlog](https://github.com/rs/xlog) | [Olivier Poitrey](https://github.com/rs) | HTTP handler logger |\n| [xstats](https://github.com/rs/xstats) | [Olivier Poitrey](https://github.com/rs) | A generic client for service instrumentation |\n| [xaccess](https://github.com/rs/xaccess) | [Olivier Poitrey](https://github.com/rs) | HTTP handler access logger with [xlog](https://github.com/rs/xlog) and [xstats](https://github.com/rs/xstats) |\n| [cors](https://github.com/rs/cors) | [Olivier Poitrey](https://github.com/rs) | [Cross Origin Resource Sharing](http://www.w3.org/TR/cors/) (CORS) support |\n\n## Licenses\n\nAll source code is licensed under the [MIT License](https://raw.github.com/rs/xhandler/master/LICENSE).\n"
  },
  {
    "path": "vendor/github.com/rs/xhandler/chain.go",
    "content": "package xhandler\n\nimport (\n\t\"net/http\"\n\n\t\"golang.org/x/net/context\"\n)\n\n// Chain is a helper for chaining middleware handlers together for easier\n// management.\ntype Chain []func(next HandlerC) HandlerC\n\n// Add appends a variable number of additional middleware handlers\n// to the middleware chain. Middleware handlers can either be\n// context-aware or non-context aware handlers with the appropriate\n// function signatures.\nfunc (c *Chain) Add(f ...interface{}) {\n\tfor _, h := range f {\n\t\tswitch v := h.(type) {\n\t\tcase func(http.Handler) http.Handler:\n\t\t\tc.Use(v)\n\t\tcase func(HandlerC) HandlerC:\n\t\t\tc.UseC(v)\n\t\tdefault:\n\t\t\tpanic(\"Adding invalid handler to the middleware chain\")\n\t\t}\n\t}\n}\n\n// With creates a new middleware chain from an existing chain,\n// extending it with additional middleware. Middleware handlers\n// can either be context-aware or non-context aware handlers\n// with the appropriate function signatures.\nfunc (c *Chain) With(f ...interface{}) *Chain {\n\tn := make(Chain, len(*c))\n\tcopy(n, *c)\n\tn.Add(f...)\n\treturn &n\n}\n\n// UseC appends a context-aware handler to the middleware chain.\nfunc (c *Chain) UseC(f func(next HandlerC) HandlerC) {\n\t*c = append(*c, f)\n}\n\n// Use appends a standard http.Handler to the middleware chain without\n// losing track of the context when inserted between two context aware handlers.\n//\n// Caveat: the f function will be called on each request so you are better off putting\n// any initialization sequence outside of this function.\nfunc (c *Chain) Use(f func(next http.Handler) http.Handler) {\n\txf := func(next HandlerC) HandlerC {\n\t\treturn HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\t\tn := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\t\t\tnext.ServeHTTPC(ctx, w, r)\n\t\t\t})\n\t\t\tf(n).ServeHTTP(w, r)\n\t\t})\n\t}\n\t*c = append(*c, xf)\n}\n\n// Handler wraps the provided final handler with all the middleware appended to\n// the chain and returns a new standard http.Handler instance.\n// The context.Background() context is injected automatically.\nfunc (c Chain) Handler(xh HandlerC) http.Handler {\n\tctx := context.Background()\n\treturn c.HandlerCtx(ctx, xh)\n}\n\n// HandlerFC is a helper to provide a function (HandlerFuncC) to Handler().\n//\n// HandlerFC is equivalent to:\n//  c.Handler(xhandler.HandlerFuncC(xhc))\nfunc (c Chain) HandlerFC(xhf HandlerFuncC) http.Handler {\n\tctx := context.Background()\n\treturn c.HandlerCtx(ctx, HandlerFuncC(xhf))\n}\n\n// HandlerH is a helper to provide a standard http handler (http.HandlerFunc)\n// to Handler(). Your final handler won't have access to the context though.\nfunc (c Chain) HandlerH(h http.Handler) http.Handler {\n\tctx := context.Background()\n\treturn c.HandlerCtx(ctx, HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\th.ServeHTTP(w, r)\n\t}))\n}\n\n// HandlerF is a helper to provide a standard http handler function\n// (http.HandlerFunc) to Handler(). Your final handler won't have access\n// to the context though.\nfunc (c Chain) HandlerF(hf http.HandlerFunc) http.Handler {\n\tctx := context.Background()\n\treturn c.HandlerCtx(ctx, HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\thf(w, r)\n\t}))\n}\n\n// HandlerCtx wraps the provided final handler with all the middleware appended to\n// the chain and returns a new standard http.Handler instance.\nfunc (c Chain) HandlerCtx(ctx context.Context, xh HandlerC) http.Handler {\n\treturn New(ctx, c.HandlerC(xh))\n}\n\n// HandlerC wraps the provided final handler with all the middleware appended to\n// the chain and returns a HandlerC instance.\nfunc (c Chain) HandlerC(xh HandlerC) HandlerC {\n\tfor i := len(c) - 1; i >= 0; i-- {\n\t\txh = c[i](xh)\n\t}\n\treturn xh\n}\n\n// HandlerCF wraps the provided final handler func with all the middleware appended to\n// the chain and returns a HandlerC instance.\n//\n// HandlerCF is equivalent to:\n//  c.HandlerC(xhandler.HandlerFuncC(xhc))\nfunc (c Chain) HandlerCF(xhc HandlerFuncC) HandlerC {\n\treturn c.HandlerC(HandlerFuncC(xhc))\n}\n"
  },
  {
    "path": "vendor/github.com/rs/xhandler/middleware.go",
    "content": "package xhandler\n\nimport (\n\t\"net/http\"\n\t\"time\"\n\n\t\"golang.org/x/net/context\"\n)\n\n// CloseHandler returns a Handler, cancelling the context when the client\n// connection closes unexpectedly.\nfunc CloseHandler(next HandlerC) HandlerC {\n\treturn HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\t// Cancel the context if the client closes the connection\n\t\tif wcn, ok := w.(http.CloseNotifier); ok {\n\t\t\tvar cancel context.CancelFunc\n\t\t\tctx, cancel = context.WithCancel(ctx)\n\t\t\tdefer cancel()\n\n\t\t\tnotify := wcn.CloseNotify()\n\t\t\tgo func() {\n\t\t\t\tselect {\n\t\t\t\tcase <-notify:\n\t\t\t\t\tcancel()\n\t\t\t\tcase <-ctx.Done():\n\t\t\t\t}\n\t\t\t}()\n\t\t}\n\n\t\tnext.ServeHTTPC(ctx, w, r)\n\t})\n}\n\n// TimeoutHandler returns a Handler which adds a timeout to the context.\n//\n// Child handlers have the responsability of obeying the context deadline and to return\n// an appropriate error (or not) response in case of timeout.\nfunc TimeoutHandler(timeout time.Duration) func(next HandlerC) HandlerC {\n\treturn func(next HandlerC) HandlerC {\n\t\treturn HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\t\tctx, _ = context.WithTimeout(ctx, timeout)\n\t\t\tnext.ServeHTTPC(ctx, w, r)\n\t\t})\n\t}\n}\n\n// If is a special handler that will skip insert the condNext handler only if a condition\n// applies at runtime.\nfunc If(cond func(ctx context.Context, w http.ResponseWriter, r *http.Request) bool, condNext func(next HandlerC) HandlerC) func(next HandlerC) HandlerC {\n\treturn func(next HandlerC) HandlerC {\n\t\treturn HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\t\t\tif cond(ctx, w, r) {\n\t\t\t\tcondNext(next).ServeHTTPC(ctx, w, r)\n\t\t\t} else {\n\t\t\t\tnext.ServeHTTPC(ctx, w, r)\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/rs/xhandler/xhandler.go",
    "content": "// Package xhandler provides a bridge between http.Handler and net/context.\n//\n// xhandler enforces net/context in your handlers without sacrificing\n// compatibility with existing http.Handlers nor imposing a specific router.\n//\n// Thanks to net/context deadline management, xhandler is able to enforce\n// a per request deadline and will cancel the context in when the client close\n// the connection unexpectedly.\n//\n// You may create net/context aware middlewares pretty much the same way as\n// you would with http.Handler.\npackage xhandler // import \"github.com/rs/xhandler\"\n\nimport (\n\t\"net/http\"\n\n\t\"golang.org/x/net/context\"\n)\n\n// HandlerC is a net/context aware http.Handler\ntype HandlerC interface {\n\tServeHTTPC(context.Context, http.ResponseWriter, *http.Request)\n}\n\n// HandlerFuncC type is an adapter to allow the use of ordinary functions\n// as an xhandler.Handler. If f is a function with the appropriate signature,\n// xhandler.HandlerFuncC(f) is a xhandler.Handler object that calls f.\ntype HandlerFuncC func(context.Context, http.ResponseWriter, *http.Request)\n\n// ServeHTTPC calls f(ctx, w, r).\nfunc (f HandlerFuncC) ServeHTTPC(ctx context.Context, w http.ResponseWriter, r *http.Request) {\n\tf(ctx, w, r)\n}\n\n// New creates a conventional http.Handler injecting the provided root\n// context to sub handlers. This handler is used as a bridge between conventional\n// http.Handler and context aware handlers.\nfunc New(ctx context.Context, h HandlerC) http.Handler {\n\treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\t\th.ServeHTTPC(ctx, w, r)\n\t})\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/LICENSE",
    "content": "Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell\n\nPlease consider promoting this project if you find it useful.\n\nPermission is hereby granted, free of charge, to any person \nobtaining a copy of this software and associated documentation \nfiles (the \"Software\"), to deal in the Software without restriction, \nincluding without limitation the rights to use, copy, modify, merge, \npublish, distribute, sublicense, and/or sell copies of the Software, \nand to permit persons to whom the Software is furnished to do so, \nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES \nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, \nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT \nOR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE \nOR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/assertion_format.go",
    "content": "/*\n* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen\n* THIS FILE MUST NOT BE EDITED BY HAND\n */\n\npackage assert\n\nimport (\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n)\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool {\n\treturn Condition(t, comp, append([]interface{}{msg}, args...)...)\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    assert.Containsf(t, \"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//    assert.Containsf(t, [\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//    assert.Containsf(t, {\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\treturn Contains(t, s, contains, append([]interface{}{msg}, args...)...)\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  assert.Emptyf(t, obj, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\treturn Empty(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// Equalf asserts that two objects are equal.\n//\n//    assert.Equalf(t, 123, 123, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn Equal(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   assert.EqualErrorf(t, err,  expectedErrorString, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool {\n\treturn EqualError(t, theError, errString, append([]interface{}{msg}, args...)...)\n}\n\n// EqualValuesf asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    assert.EqualValuesf(t, uint32(123, \"error message %s\", \"formatted\"), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.Errorf(t, err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedErrorf, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Errorf(t TestingT, err error, msg string, args ...interface{}) bool {\n\treturn Error(t, err, append([]interface{}{msg}, args...)...)\n}\n\n// Exactlyf asserts that two objects are equal is value and type.\n//\n//    assert.Exactlyf(t, int32(123, \"error message %s\", \"formatted\"), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn Exactly(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// Failf reports a failure through\nfunc Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {\n\treturn Fail(t, failureMessage, append([]interface{}{msg}, args...)...)\n}\n\n// FailNowf fails test\nfunc FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool {\n\treturn FailNow(t, failureMessage, append([]interface{}{msg}, args...)...)\n}\n\n// Falsef asserts that the specified value is false.\n//\n//    assert.Falsef(t, myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Falsef(t TestingT, value bool, msg string, args ...interface{}) bool {\n\treturn False(t, value, append([]interface{}{msg}, args...)...)\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//  assert.HTTPBodyContainsf(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {\n\treturn HTTPBodyContains(t, handler, method, url, values, str)\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  assert.HTTPBodyNotContainsf(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {\n\treturn HTTPBodyNotContains(t, handler, method, url, values, str)\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//  assert.HTTPErrorf(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPError(t, handler, method, url, values)\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//  assert.HTTPRedirectf(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPRedirect(t, handler, method, url, values)\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//  assert.HTTPSuccessf(t, myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPSuccess(t, handler, method, url, values)\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//    assert.Implementsf(t, (*MyInterface, \"error message %s\", \"formatted\")(nil), new(MyObject))\nfunc Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {\n\treturn Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...)\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n// \t assert.InDeltaf(t, math.Pi, (22 / 7.0, \"error message %s\", \"formatted\"), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\treturn InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...)\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\treturn InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...)\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\treturn InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\treturn InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...)\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {\n\treturn IsType(t, expectedType, object, append([]interface{}{msg}, args...)...)\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//  assert.JSONEqf(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool {\n\treturn JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//    assert.Lenf(t, mySlice, 3, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool {\n\treturn Len(t, object, length, append([]interface{}{msg}, args...)...)\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//    assert.Nilf(t, err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\treturn Nil(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.NoErrorf(t, err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool {\n\treturn NoError(t, err, append([]interface{}{msg}, args...)...)\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    assert.NotContainsf(t, \"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//    assert.NotContainsf(t, [\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//    assert.NotContainsf(t, {\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\treturn NotContains(t, s, contains, append([]interface{}{msg}, args...)...)\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if assert.NotEmptyf(t, obj, \"error message %s\", \"formatted\") {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\treturn NotEmpty(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//    assert.NotEqualf(t, obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...)\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//    assert.NotNilf(t, err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool {\n\treturn NotNil(t, object, append([]interface{}{msg}, args...)...)\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   assert.NotPanicsf(t, func(){ RemainCalm() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {\n\treturn NotPanics(t, f, append([]interface{}{msg}, args...)...)\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//  assert.NotRegexpf(t, regexp.MustCompile(\"starts\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  assert.NotRegexpf(t, \"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\treturn NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...)\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.NotSubsetf(t, [1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\treturn NotSubset(t, list, subset, append([]interface{}{msg}, args...)...)\n}\n\n// NotZerof asserts that i is not the zero value for its type and returns the truth.\nfunc NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {\n\treturn NotZero(t, i, append([]interface{}{msg}, args...)...)\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//   assert.Panicsf(t, func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool {\n\treturn Panics(t, f, append([]interface{}{msg}, args...)...)\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   assert.PanicsWithValuef(t, \"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {\n\treturn PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...)\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//  assert.Regexpf(t, regexp.MustCompile(\"start\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  assert.Regexpf(t, \"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\treturn Regexp(t, rx, str, append([]interface{}{msg}, args...)...)\n}\n\n// Subsetf asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.Subsetf(t, [1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\treturn Subset(t, list, subset, append([]interface{}{msg}, args...)...)\n}\n\n// Truef asserts that the specified value is true.\n//\n//    assert.Truef(t, myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Truef(t TestingT, value bool, msg string, args ...interface{}) bool {\n\treturn True(t, value, append([]interface{}{msg}, args...)...)\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//   assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {\n\treturn WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...)\n}\n\n// Zerof asserts that i is the zero value for its type and returns the truth.\nfunc Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool {\n\treturn Zero(t, i, append([]interface{}{msg}, args...)...)\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl",
    "content": "{{.CommentFormat}}\nfunc {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool {\n\treturn {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}})\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/assertion_forward.go",
    "content": "/*\n* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen\n* THIS FILE MUST NOT BE EDITED BY HAND\n */\n\npackage assert\n\nimport (\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n)\n\n// Condition uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool {\n\treturn Condition(a.t, comp, msgAndArgs...)\n}\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool {\n\treturn Conditionf(a.t, comp, msg, args...)\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    a.Contains(\"Hello World\", \"World\")\n//    a.Contains([\"Hello\", \"World\"], \"World\")\n//    a.Contains({\"Hello\": \"World\"}, \"Hello\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {\n\treturn Contains(a.t, s, contains, msgAndArgs...)\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    a.Containsf(\"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//    a.Containsf([\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//    a.Containsf({\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\treturn Containsf(a.t, s, contains, msg, args...)\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  a.Empty(obj)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool {\n\treturn Empty(a.t, object, msgAndArgs...)\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  a.Emptyf(obj, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool {\n\treturn Emptyf(a.t, object, msg, args...)\n}\n\n// Equal asserts that two objects are equal.\n//\n//    a.Equal(123, 123)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\treturn Equal(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   a.EqualError(err,  expectedErrorString)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool {\n\treturn EqualError(a.t, theError, errString, msgAndArgs...)\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   a.EqualErrorf(err,  expectedErrorString, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool {\n\treturn EqualErrorf(a.t, theError, errString, msg, args...)\n}\n\n// EqualValues asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    a.EqualValues(uint32(123), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\treturn EqualValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualValuesf asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    a.EqualValuesf(uint32(123, \"error message %s\", \"formatted\"), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn EqualValuesf(a.t, expected, actual, msg, args...)\n}\n\n// Equalf asserts that two objects are equal.\n//\n//    a.Equalf(123, 123, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn Equalf(a.t, expected, actual, msg, args...)\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.Error(err) {\n// \t   assert.Equal(t, expectedError, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool {\n\treturn Error(a.t, err, msgAndArgs...)\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.Errorf(err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedErrorf, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool {\n\treturn Errorf(a.t, err, msg, args...)\n}\n\n// Exactly asserts that two objects are equal is value and type.\n//\n//    a.Exactly(int32(123), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\treturn Exactly(a.t, expected, actual, msgAndArgs...)\n}\n\n// Exactlyf asserts that two objects are equal is value and type.\n//\n//    a.Exactlyf(int32(123, \"error message %s\", \"formatted\"), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn Exactlyf(a.t, expected, actual, msg, args...)\n}\n\n// Fail reports a failure through\nfunc (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool {\n\treturn Fail(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNow fails test\nfunc (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool {\n\treturn FailNow(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNowf fails test\nfunc (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool {\n\treturn FailNowf(a.t, failureMessage, msg, args...)\n}\n\n// Failf reports a failure through\nfunc (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool {\n\treturn Failf(a.t, failureMessage, msg, args...)\n}\n\n// False asserts that the specified value is false.\n//\n//    a.False(myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool {\n\treturn False(a.t, value, msgAndArgs...)\n}\n\n// Falsef asserts that the specified value is false.\n//\n//    a.Falsef(myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool {\n\treturn Falsef(a.t, value, msg, args...)\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//  a.HTTPBodyContains(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {\n\treturn HTTPBodyContains(a.t, handler, method, url, values, str)\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//  a.HTTPBodyContainsf(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {\n\treturn HTTPBodyContainsf(a.t, handler, method, url, values, str)\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  a.HTTPBodyNotContains(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {\n\treturn HTTPBodyNotContains(a.t, handler, method, url, values, str)\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  a.HTTPBodyNotContainsf(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool {\n\treturn HTTPBodyNotContainsf(a.t, handler, method, url, values, str)\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//  a.HTTPError(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPError(a.t, handler, method, url, values)\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//  a.HTTPErrorf(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPErrorf(a.t, handler, method, url, values)\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//  a.HTTPRedirect(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPRedirect(a.t, handler, method, url, values)\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//  a.HTTPRedirectf(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPRedirectf(a.t, handler, method, url, values)\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//  a.HTTPSuccess(myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPSuccess(a.t, handler, method, url, values)\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//  a.HTTPSuccessf(myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) bool {\n\treturn HTTPSuccessf(a.t, handler, method, url, values)\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//    a.Implements((*MyInterface)(nil), new(MyObject))\nfunc (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\treturn Implements(a.t, interfaceObject, object, msgAndArgs...)\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//    a.Implementsf((*MyInterface, \"error message %s\", \"formatted\")(nil), new(MyObject))\nfunc (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool {\n\treturn Implementsf(a.t, interfaceObject, object, msg, args...)\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n// \t a.InDelta(math.Pi, (22 / 7.0), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\treturn InDelta(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\treturn InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\treturn InDeltaSlicef(a.t, expected, actual, delta, msg, args...)\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n// \t a.InDeltaf(math.Pi, (22 / 7.0, \"error message %s\", \"formatted\"), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool {\n\treturn InDeltaf(a.t, expected, actual, delta, msg, args...)\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\treturn InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\treturn InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\treturn InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool {\n\treturn InEpsilonf(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\treturn IsType(a.t, expectedType, object, msgAndArgs...)\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool {\n\treturn IsTypef(a.t, expectedType, object, msg, args...)\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//  a.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool {\n\treturn JSONEq(a.t, expected, actual, msgAndArgs...)\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//  a.JSONEqf(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool {\n\treturn JSONEqf(a.t, expected, actual, msg, args...)\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//    a.Len(mySlice, 3)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool {\n\treturn Len(a.t, object, length, msgAndArgs...)\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//    a.Lenf(mySlice, 3, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool {\n\treturn Lenf(a.t, object, length, msg, args...)\n}\n\n// Nil asserts that the specified object is nil.\n//\n//    a.Nil(err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool {\n\treturn Nil(a.t, object, msgAndArgs...)\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//    a.Nilf(err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool {\n\treturn Nilf(a.t, object, msg, args...)\n}\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.NoError(err) {\n// \t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool {\n\treturn NoError(a.t, err, msgAndArgs...)\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.NoErrorf(err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool {\n\treturn NoErrorf(a.t, err, msg, args...)\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    a.NotContains(\"Hello World\", \"Earth\")\n//    a.NotContains([\"Hello\", \"World\"], \"Earth\")\n//    a.NotContains({\"Hello\": \"World\"}, \"Earth\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool {\n\treturn NotContains(a.t, s, contains, msgAndArgs...)\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    a.NotContainsf(\"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//    a.NotContainsf([\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//    a.NotContainsf({\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool {\n\treturn NotContainsf(a.t, s, contains, msg, args...)\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if a.NotEmpty(obj) {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool {\n\treturn NotEmpty(a.t, object, msgAndArgs...)\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if a.NotEmptyf(obj, \"error message %s\", \"formatted\") {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool {\n\treturn NotEmptyf(a.t, object, msg, args...)\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//    a.NotEqual(obj1, obj2)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool {\n\treturn NotEqual(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//    a.NotEqualf(obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool {\n\treturn NotEqualf(a.t, expected, actual, msg, args...)\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//    a.NotNil(err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool {\n\treturn NotNil(a.t, object, msgAndArgs...)\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//    a.NotNilf(err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool {\n\treturn NotNilf(a.t, object, msg, args...)\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   a.NotPanics(func(){ RemainCalm() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\treturn NotPanics(a.t, f, msgAndArgs...)\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   a.NotPanicsf(func(){ RemainCalm() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool {\n\treturn NotPanicsf(a.t, f, msg, args...)\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//  a.NotRegexp(regexp.MustCompile(\"starts\"), \"it's starting\")\n//  a.NotRegexp(\"^start\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\treturn NotRegexp(a.t, rx, str, msgAndArgs...)\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//  a.NotRegexpf(regexp.MustCompile(\"starts\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  a.NotRegexpf(\"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\treturn NotRegexpf(a.t, rx, str, msg, args...)\n}\n\n// NotSubset asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    a.NotSubset([1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {\n\treturn NotSubset(a.t, list, subset, msgAndArgs...)\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    a.NotSubsetf([1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\treturn NotSubsetf(a.t, list, subset, msg, args...)\n}\n\n// NotZero asserts that i is not the zero value for its type and returns the truth.\nfunc (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool {\n\treturn NotZero(a.t, i, msgAndArgs...)\n}\n\n// NotZerof asserts that i is not the zero value for its type and returns the truth.\nfunc (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool {\n\treturn NotZerof(a.t, i, msg, args...)\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//   a.Panics(func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\treturn Panics(a.t, f, msgAndArgs...)\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   a.PanicsWithValue(\"crazy error\", func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\treturn PanicsWithValue(a.t, expected, f, msgAndArgs...)\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   a.PanicsWithValuef(\"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool {\n\treturn PanicsWithValuef(a.t, expected, f, msg, args...)\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//   a.Panicsf(func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool {\n\treturn Panicsf(a.t, f, msg, args...)\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//  a.Regexp(regexp.MustCompile(\"start\"), \"it's starting\")\n//  a.Regexp(\"start...$\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\treturn Regexp(a.t, rx, str, msgAndArgs...)\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//  a.Regexpf(regexp.MustCompile(\"start\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  a.Regexpf(\"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool {\n\treturn Regexpf(a.t, rx, str, msg, args...)\n}\n\n// Subset asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    a.Subset([1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool {\n\treturn Subset(a.t, list, subset, msgAndArgs...)\n}\n\n// Subsetf asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    a.Subsetf([1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool {\n\treturn Subsetf(a.t, list, subset, msg, args...)\n}\n\n// True asserts that the specified value is true.\n//\n//    a.True(myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool {\n\treturn True(a.t, value, msgAndArgs...)\n}\n\n// Truef asserts that the specified value is true.\n//\n//    a.Truef(myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool {\n\treturn Truef(a.t, value, msg, args...)\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//   a.WithinDuration(time.Now(), time.Now(), 10*time.Second)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {\n\treturn WithinDuration(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//   a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool {\n\treturn WithinDurationf(a.t, expected, actual, delta, msg, args...)\n}\n\n// Zero asserts that i is the zero value for its type and returns the truth.\nfunc (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool {\n\treturn Zero(a.t, i, msgAndArgs...)\n}\n\n// Zerof asserts that i is the zero value for its type and returns the truth.\nfunc (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool {\n\treturn Zerof(a.t, i, msg, args...)\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl",
    "content": "{{.CommentWithoutT \"a\"}}\nfunc (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool {\n\treturn {{.DocInfo.Name}}(a.t, {{.ForwardedParams}})\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/assertions.go",
    "content": "package assert\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode\"\n\t\"unicode/utf8\"\n\n\t\"github.com/davecgh/go-spew/spew\"\n\t\"github.com/pmezard/go-difflib/difflib\"\n)\n\n//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl\n\n// TestingT is an interface wrapper around *testing.T\ntype TestingT interface {\n\tErrorf(format string, args ...interface{})\n}\n\n// Comparison a custom function that returns true on success and false on failure\ntype Comparison func() (success bool)\n\n/*\n\tHelper functions\n*/\n\n// ObjectsAreEqual determines if two objects are considered equal.\n//\n// This function does no assertion of any kind.\nfunc ObjectsAreEqual(expected, actual interface{}) bool {\n\n\tif expected == nil || actual == nil {\n\t\treturn expected == actual\n\t}\n\tif exp, ok := expected.([]byte); ok {\n\t\tact, ok := actual.([]byte)\n\t\tif !ok {\n\t\t\treturn false\n\t\t} else if exp == nil || act == nil {\n\t\t\treturn exp == nil && act == nil\n\t\t}\n\t\treturn bytes.Equal(exp, act)\n\t}\n\treturn reflect.DeepEqual(expected, actual)\n\n}\n\n// ObjectsAreEqualValues gets whether two objects are equal, or if their\n// values are equal.\nfunc ObjectsAreEqualValues(expected, actual interface{}) bool {\n\tif ObjectsAreEqual(expected, actual) {\n\t\treturn true\n\t}\n\n\tactualType := reflect.TypeOf(actual)\n\tif actualType == nil {\n\t\treturn false\n\t}\n\texpectedValue := reflect.ValueOf(expected)\n\tif expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) {\n\t\t// Attempt comparison after type conversion\n\t\treturn reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual)\n\t}\n\n\treturn false\n}\n\n/* CallerInfo is necessary because the assert functions use the testing object\ninternally, causing it to print the file:line of the assert method, rather than where\nthe problem actually occurred in calling code.*/\n\n// CallerInfo returns an array of strings containing the file and line number\n// of each stack frame leading from the current test to the assert call that\n// failed.\nfunc CallerInfo() []string {\n\n\tpc := uintptr(0)\n\tfile := \"\"\n\tline := 0\n\tok := false\n\tname := \"\"\n\n\tcallers := []string{}\n\tfor i := 0; ; i++ {\n\t\tpc, file, line, ok = runtime.Caller(i)\n\t\tif !ok {\n\t\t\t// The breaks below failed to terminate the loop, and we ran off the\n\t\t\t// end of the call stack.\n\t\t\tbreak\n\t\t}\n\n\t\t// This is a huge edge case, but it will panic if this is the case, see #180\n\t\tif file == \"<autogenerated>\" {\n\t\t\tbreak\n\t\t}\n\n\t\tf := runtime.FuncForPC(pc)\n\t\tif f == nil {\n\t\t\tbreak\n\t\t}\n\t\tname = f.Name()\n\n\t\t// testing.tRunner is the standard library function that calls\n\t\t// tests. Subtests are called directly by tRunner, without going through\n\t\t// the Test/Benchmark/Example function that contains the t.Run calls, so\n\t\t// with subtests we should break when we hit tRunner, without adding it\n\t\t// to the list of callers.\n\t\tif name == \"testing.tRunner\" {\n\t\t\tbreak\n\t\t}\n\n\t\tparts := strings.Split(file, \"/\")\n\t\tfile = parts[len(parts)-1]\n\t\tif len(parts) > 1 {\n\t\t\tdir := parts[len(parts)-2]\n\t\t\tif (dir != \"assert\" && dir != \"mock\" && dir != \"require\") || file == \"mock_test.go\" {\n\t\t\t\tcallers = append(callers, fmt.Sprintf(\"%s:%d\", file, line))\n\t\t\t}\n\t\t}\n\n\t\t// Drop the package\n\t\tsegments := strings.Split(name, \".\")\n\t\tname = segments[len(segments)-1]\n\t\tif isTest(name, \"Test\") ||\n\t\t\tisTest(name, \"Benchmark\") ||\n\t\t\tisTest(name, \"Example\") {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn callers\n}\n\n// Stolen from the `go test` tool.\n// isTest tells whether name looks like a test (or benchmark, according to prefix).\n// It is a Test (say) if there is a character after Test that is not a lower-case letter.\n// We don't want TesticularCancer.\nfunc isTest(name, prefix string) bool {\n\tif !strings.HasPrefix(name, prefix) {\n\t\treturn false\n\t}\n\tif len(name) == len(prefix) { // \"Test\" is ok\n\t\treturn true\n\t}\n\trune, _ := utf8.DecodeRuneInString(name[len(prefix):])\n\treturn !unicode.IsLower(rune)\n}\n\n// getWhitespaceString returns a string that is long enough to overwrite the default\n// output from the go testing framework.\nfunc getWhitespaceString() string {\n\n\t_, file, line, ok := runtime.Caller(1)\n\tif !ok {\n\t\treturn \"\"\n\t}\n\tparts := strings.Split(file, \"/\")\n\tfile = parts[len(parts)-1]\n\n\treturn strings.Repeat(\" \", len(fmt.Sprintf(\"%s:%d:        \", file, line)))\n\n}\n\nfunc messageFromMsgAndArgs(msgAndArgs ...interface{}) string {\n\tif len(msgAndArgs) == 0 || msgAndArgs == nil {\n\t\treturn \"\"\n\t}\n\tif len(msgAndArgs) == 1 {\n\t\treturn msgAndArgs[0].(string)\n\t}\n\tif len(msgAndArgs) > 1 {\n\t\treturn fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...)\n\t}\n\treturn \"\"\n}\n\n// Aligns the provided message so that all lines after the first line start at the same location as the first line.\n// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab).\n// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the\n// basis on which the alignment occurs).\nfunc indentMessageLines(message string, longestLabelLen int) string {\n\toutBuf := new(bytes.Buffer)\n\n\tfor i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ {\n\t\t// no need to align first line because it starts at the correct location (after the label)\n\t\tif i != 0 {\n\t\t\t// append alignLen+1 spaces to align with \"{{longestLabel}}:\" before adding tab\n\t\t\toutBuf.WriteString(\"\\n\\r\\t\" + strings.Repeat(\" \", longestLabelLen+1) + \"\\t\")\n\t\t}\n\t\toutBuf.WriteString(scanner.Text())\n\t}\n\n\treturn outBuf.String()\n}\n\ntype failNower interface {\n\tFailNow()\n}\n\n// FailNow fails test\nfunc FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {\n\tFail(t, failureMessage, msgAndArgs...)\n\n\t// We cannot extend TestingT with FailNow() and\n\t// maintain backwards compatibility, so we fallback\n\t// to panicking when FailNow is not available in\n\t// TestingT.\n\t// See issue #263\n\n\tif t, ok := t.(failNower); ok {\n\t\tt.FailNow()\n\t} else {\n\t\tpanic(\"test failed and t is missing `FailNow()`\")\n\t}\n\treturn false\n}\n\n// Fail reports a failure through\nfunc Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool {\n\tcontent := []labeledContent{\n\t\t{\"Error Trace\", strings.Join(CallerInfo(), \"\\n\\r\\t\\t\\t\")},\n\t\t{\"Error\", failureMessage},\n\t}\n\n\tmessage := messageFromMsgAndArgs(msgAndArgs...)\n\tif len(message) > 0 {\n\t\tcontent = append(content, labeledContent{\"Messages\", message})\n\t}\n\n\tt.Errorf(\"%s\", \"\\r\"+getWhitespaceString()+labeledOutput(content...))\n\n\treturn false\n}\n\ntype labeledContent struct {\n\tlabel   string\n\tcontent string\n}\n\n// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner:\n//\n//   \\r\\t{{label}}:{{align_spaces}}\\t{{content}}\\n\n//\n// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The \"\\t{{label}}:\" is for the label.\n// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this\n// alignment is achieved, \"\\t{{content}}\\n\" is added for the output.\n//\n// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line.\nfunc labeledOutput(content ...labeledContent) string {\n\tlongestLabel := 0\n\tfor _, v := range content {\n\t\tif len(v.label) > longestLabel {\n\t\t\tlongestLabel = len(v.label)\n\t\t}\n\t}\n\tvar output string\n\tfor _, v := range content {\n\t\toutput += \"\\r\\t\" + v.label + \":\" + strings.Repeat(\" \", longestLabel-len(v.label)) + \"\\t\" + indentMessageLines(v.content, longestLabel) + \"\\n\"\n\t}\n\treturn output\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//    assert.Implements(t, (*MyInterface)(nil), new(MyObject))\nfunc Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\n\tinterfaceType := reflect.TypeOf(interfaceObject).Elem()\n\n\tif !reflect.TypeOf(object).Implements(interfaceType) {\n\t\treturn Fail(t, fmt.Sprintf(\"%T must implement %v\", object, interfaceType), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool {\n\n\tif !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) {\n\t\treturn Fail(t, fmt.Sprintf(\"Object expected to be of type %v, but was %v\", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// Equal asserts that two objects are equal.\n//\n//    assert.Equal(t, 123, 123)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif err := validateEqualArgs(expected, actual); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Invalid operation: %#v == %#v (%s)\",\n\t\t\texpected, actual, err), msgAndArgs...)\n\t}\n\n\tif !ObjectsAreEqual(expected, actual) {\n\t\tdiff := diff(expected, actual)\n\t\texpected, actual = formatUnequalValues(expected, actual)\n\t\treturn Fail(t, fmt.Sprintf(\"Not equal: \\n\"+\n\t\t\t\"expected: %s\\n\"+\n\t\t\t\"actual: %s%s\", expected, actual, diff), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// formatUnequalValues takes two values of arbitrary types and returns string\n// representations appropriate to be presented to the user.\n//\n// If the values are not of like type, the returned strings will be prefixed\n// with the type name, and the value will be enclosed in parenthesis similar\n// to a type conversion in the Go grammar.\nfunc formatUnequalValues(expected, actual interface{}) (e string, a string) {\n\tif reflect.TypeOf(expected) != reflect.TypeOf(actual) {\n\t\treturn fmt.Sprintf(\"%T(%#v)\", expected, expected),\n\t\t\tfmt.Sprintf(\"%T(%#v)\", actual, actual)\n\t}\n\n\treturn fmt.Sprintf(\"%#v\", expected),\n\t\tfmt.Sprintf(\"%#v\", actual)\n}\n\n// EqualValues asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    assert.EqualValues(t, uint32(123), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\n\tif !ObjectsAreEqualValues(expected, actual) {\n\t\tdiff := diff(expected, actual)\n\t\texpected, actual = formatUnequalValues(expected, actual)\n\t\treturn Fail(t, fmt.Sprintf(\"Not equal: \\n\"+\n\t\t\t\"expected: %s\\n\"+\n\t\t\t\"actual: %s%s\", expected, actual, diff), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// Exactly asserts that two objects are equal is value and type.\n//\n//    assert.Exactly(t, int32(123), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\n\taType := reflect.TypeOf(expected)\n\tbType := reflect.TypeOf(actual)\n\n\tif aType != bType {\n\t\treturn Fail(t, fmt.Sprintf(\"Types expected to match exactly\\n\\r\\t%v != %v\", aType, bType), msgAndArgs...)\n\t}\n\n\treturn Equal(t, expected, actual, msgAndArgs...)\n\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//    assert.NotNil(t, err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\tif !isNil(object) {\n\t\treturn true\n\t}\n\treturn Fail(t, \"Expected value not to be nil.\", msgAndArgs...)\n}\n\n// isNil checks if a specified object is nil or not, without Failing.\nfunc isNil(object interface{}) bool {\n\tif object == nil {\n\t\treturn true\n\t}\n\n\tvalue := reflect.ValueOf(object)\n\tkind := value.Kind()\n\tif kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n// Nil asserts that the specified object is nil.\n//\n//    assert.Nil(t, err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\tif isNil(object) {\n\t\treturn true\n\t}\n\treturn Fail(t, fmt.Sprintf(\"Expected nil, but got: %#v\", object), msgAndArgs...)\n}\n\nvar numericZeros = []interface{}{\n\tint(0),\n\tint8(0),\n\tint16(0),\n\tint32(0),\n\tint64(0),\n\tuint(0),\n\tuint8(0),\n\tuint16(0),\n\tuint32(0),\n\tuint64(0),\n\tfloat32(0),\n\tfloat64(0),\n}\n\n// isEmpty gets whether the specified object is considered empty or not.\nfunc isEmpty(object interface{}) bool {\n\n\tif object == nil {\n\t\treturn true\n\t} else if object == \"\" {\n\t\treturn true\n\t} else if object == false {\n\t\treturn true\n\t}\n\n\tfor _, v := range numericZeros {\n\t\tif object == v {\n\t\t\treturn true\n\t\t}\n\t}\n\n\tobjValue := reflect.ValueOf(object)\n\n\tswitch objValue.Kind() {\n\tcase reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String:\n\t\t{\n\t\t\treturn (objValue.Len() == 0)\n\t\t}\n\tcase reflect.Struct:\n\t\tswitch object.(type) {\n\t\tcase time.Time:\n\t\t\treturn object.(time.Time).IsZero()\n\t\t}\n\tcase reflect.Ptr:\n\t\t{\n\t\t\tif objValue.IsNil() {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tswitch object.(type) {\n\t\t\tcase *time.Time:\n\t\t\t\treturn object.(*time.Time).IsZero()\n\t\t\tdefault:\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  assert.Empty(t, obj)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\n\tpass := isEmpty(object)\n\tif !pass {\n\t\tFail(t, fmt.Sprintf(\"Should be empty, but was %v\", object), msgAndArgs...)\n\t}\n\n\treturn pass\n\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if assert.NotEmpty(t, obj) {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool {\n\n\tpass := !isEmpty(object)\n\tif !pass {\n\t\tFail(t, fmt.Sprintf(\"Should NOT be empty, but was %v\", object), msgAndArgs...)\n\t}\n\n\treturn pass\n\n}\n\n// getLen try to get length of object.\n// return (false, 0) if impossible.\nfunc getLen(x interface{}) (ok bool, length int) {\n\tv := reflect.ValueOf(x)\n\tdefer func() {\n\t\tif e := recover(); e != nil {\n\t\t\tok = false\n\t\t}\n\t}()\n\treturn true, v.Len()\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//    assert.Len(t, mySlice, 3)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool {\n\tok, l := getLen(object)\n\tif !ok {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" could not be applied builtin len()\", object), msgAndArgs...)\n\t}\n\n\tif l != length {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" should have %d item(s), but has %d\", object, length, l), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// True asserts that the specified value is true.\n//\n//    assert.True(t, myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc True(t TestingT, value bool, msgAndArgs ...interface{}) bool {\n\n\tif value != true {\n\t\treturn Fail(t, \"Should be true\", msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// False asserts that the specified value is false.\n//\n//    assert.False(t, myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc False(t TestingT, value bool, msgAndArgs ...interface{}) bool {\n\n\tif value != false {\n\t\treturn Fail(t, \"Should be false\", msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//    assert.NotEqual(t, obj1, obj2)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool {\n\tif err := validateEqualArgs(expected, actual); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Invalid operation: %#v != %#v (%s)\",\n\t\t\texpected, actual, err), msgAndArgs...)\n\t}\n\n\tif ObjectsAreEqual(expected, actual) {\n\t\treturn Fail(t, fmt.Sprintf(\"Should not be: %#v\\n\", actual), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// containsElement try loop over the list check if the list includes the element.\n// return (false, false) if impossible.\n// return (true, false) if element was not found.\n// return (true, true) if element was found.\nfunc includeElement(list interface{}, element interface{}) (ok, found bool) {\n\n\tlistValue := reflect.ValueOf(list)\n\telementValue := reflect.ValueOf(element)\n\tdefer func() {\n\t\tif e := recover(); e != nil {\n\t\t\tok = false\n\t\t\tfound = false\n\t\t}\n\t}()\n\n\tif reflect.TypeOf(list).Kind() == reflect.String {\n\t\treturn true, strings.Contains(listValue.String(), elementValue.String())\n\t}\n\n\tif reflect.TypeOf(list).Kind() == reflect.Map {\n\t\tmapKeys := listValue.MapKeys()\n\t\tfor i := 0; i < len(mapKeys); i++ {\n\t\t\tif ObjectsAreEqual(mapKeys[i].Interface(), element) {\n\t\t\t\treturn true, true\n\t\t\t}\n\t\t}\n\t\treturn true, false\n\t}\n\n\tfor i := 0; i < listValue.Len(); i++ {\n\t\tif ObjectsAreEqual(listValue.Index(i).Interface(), element) {\n\t\t\treturn true, true\n\t\t}\n\t}\n\treturn true, false\n\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    assert.Contains(t, \"Hello World\", \"World\")\n//    assert.Contains(t, [\"Hello\", \"World\"], \"World\")\n//    assert.Contains(t, {\"Hello\": \"World\"}, \"Hello\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {\n\n\tok, found := includeElement(s, contains)\n\tif !ok {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" could not be applied builtin len()\", s), msgAndArgs...)\n\t}\n\tif !found {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" does not contain \\\"%s\\\"\", s, contains), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    assert.NotContains(t, \"Hello World\", \"Earth\")\n//    assert.NotContains(t, [\"Hello\", \"World\"], \"Earth\")\n//    assert.NotContains(t, {\"Hello\": \"World\"}, \"Earth\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool {\n\n\tok, found := includeElement(s, contains)\n\tif !ok {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" could not be applied builtin len()\", s), msgAndArgs...)\n\t}\n\tif found {\n\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" should not contain \\\"%s\\\"\", s, contains), msgAndArgs...)\n\t}\n\n\treturn true\n\n}\n\n// Subset asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.Subset(t, [1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {\n\tif subset == nil {\n\t\treturn true // we consider nil to be equal to the nil set\n\t}\n\n\tsubsetValue := reflect.ValueOf(subset)\n\tdefer func() {\n\t\tif e := recover(); e != nil {\n\t\t\tok = false\n\t\t}\n\t}()\n\n\tlistKind := reflect.TypeOf(list).Kind()\n\tsubsetKind := reflect.TypeOf(subset).Kind()\n\n\tif listKind != reflect.Array && listKind != reflect.Slice {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", list, listKind), msgAndArgs...)\n\t}\n\n\tif subsetKind != reflect.Array && subsetKind != reflect.Slice {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", subset, subsetKind), msgAndArgs...)\n\t}\n\n\tfor i := 0; i < subsetValue.Len(); i++ {\n\t\telement := subsetValue.Index(i).Interface()\n\t\tok, found := includeElement(list, element)\n\t\tif !ok {\n\t\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" could not be applied builtin len()\", list), msgAndArgs...)\n\t\t}\n\t\tif !found {\n\t\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" does not contain \\\"%s\\\"\", list, element), msgAndArgs...)\n\t\t}\n\t}\n\n\treturn true\n}\n\n// NotSubset asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.NotSubset(t, [1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) {\n\tif subset == nil {\n\t\treturn false // we consider nil to be equal to the nil set\n\t}\n\n\tsubsetValue := reflect.ValueOf(subset)\n\tdefer func() {\n\t\tif e := recover(); e != nil {\n\t\t\tok = false\n\t\t}\n\t}()\n\n\tlistKind := reflect.TypeOf(list).Kind()\n\tsubsetKind := reflect.TypeOf(subset).Kind()\n\n\tif listKind != reflect.Array && listKind != reflect.Slice {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", list, listKind), msgAndArgs...)\n\t}\n\n\tif subsetKind != reflect.Array && subsetKind != reflect.Slice {\n\t\treturn Fail(t, fmt.Sprintf(\"%q has an unsupported type %s\", subset, subsetKind), msgAndArgs...)\n\t}\n\n\tfor i := 0; i < subsetValue.Len(); i++ {\n\t\telement := subsetValue.Index(i).Interface()\n\t\tok, found := includeElement(list, element)\n\t\tif !ok {\n\t\t\treturn Fail(t, fmt.Sprintf(\"\\\"%s\\\" could not be applied builtin len()\", list), msgAndArgs...)\n\t\t}\n\t\tif !found {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn Fail(t, fmt.Sprintf(\"%q is a subset of %q\", subset, list), msgAndArgs...)\n}\n\n// Condition uses a Comparison to assert a complex condition.\nfunc Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool {\n\tresult := comp()\n\tif !result {\n\t\tFail(t, \"Condition failed!\", msgAndArgs...)\n\t}\n\treturn result\n}\n\n// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics\n// methods, and represents a simple func that takes no arguments, and returns nothing.\ntype PanicTestFunc func()\n\n// didPanic returns true if the function passed to it panics. Otherwise, it returns false.\nfunc didPanic(f PanicTestFunc) (bool, interface{}) {\n\n\tdidPanic := false\n\tvar message interface{}\n\tfunc() {\n\n\t\tdefer func() {\n\t\t\tif message = recover(); message != nil {\n\t\t\t\tdidPanic = true\n\t\t\t}\n\t\t}()\n\n\t\t// call the target function\n\t\tf()\n\n\t}()\n\n\treturn didPanic, message\n\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//   assert.Panics(t, func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\n\tif funcDidPanic, panicValue := didPanic(f); !funcDidPanic {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic\\n\\r\\tPanic value:\\t%v\", f, panicValue), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   assert.PanicsWithValue(t, \"crazy error\", func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\n\tfuncDidPanic, panicValue := didPanic(f)\n\tif !funcDidPanic {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic\\n\\r\\tPanic value:\\t%v\", f, panicValue), msgAndArgs...)\n\t}\n\tif panicValue != expected {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should panic with value:\\t%v\\n\\r\\tPanic value:\\t%v\", f, expected, panicValue), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   assert.NotPanics(t, func(){ RemainCalm() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool {\n\n\tif funcDidPanic, panicValue := didPanic(f); funcDidPanic {\n\t\treturn Fail(t, fmt.Sprintf(\"func %#v should not panic\\n\\r\\tPanic value:\\t%v\", f, panicValue), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//   assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool {\n\n\tdt := expected.Sub(actual)\n\tif dt < -delta || dt > delta {\n\t\treturn Fail(t, fmt.Sprintf(\"Max difference between %v and %v allowed is %v, but difference was %v\", expected, actual, delta, dt), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\nfunc toFloat(x interface{}) (float64, bool) {\n\tvar xf float64\n\txok := true\n\n\tswitch xn := x.(type) {\n\tcase uint8:\n\t\txf = float64(xn)\n\tcase uint16:\n\t\txf = float64(xn)\n\tcase uint32:\n\t\txf = float64(xn)\n\tcase uint64:\n\t\txf = float64(xn)\n\tcase int:\n\t\txf = float64(xn)\n\tcase int8:\n\t\txf = float64(xn)\n\tcase int16:\n\t\txf = float64(xn)\n\tcase int32:\n\t\txf = float64(xn)\n\tcase int64:\n\t\txf = float64(xn)\n\tcase float32:\n\t\txf = float64(xn)\n\tcase float64:\n\t\txf = float64(xn)\n\tcase time.Duration:\n\t\txf = float64(xn)\n\tdefault:\n\t\txok = false\n\t}\n\n\treturn xf, xok\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n// \t assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\n\taf, aok := toFloat(expected)\n\tbf, bok := toFloat(actual)\n\n\tif !aok || !bok {\n\t\treturn Fail(t, fmt.Sprintf(\"Parameters must be numerical\"), msgAndArgs...)\n\t}\n\n\tif math.IsNaN(af) {\n\t\treturn Fail(t, fmt.Sprintf(\"Expected must not be NaN\"), msgAndArgs...)\n\t}\n\n\tif math.IsNaN(bf) {\n\t\treturn Fail(t, fmt.Sprintf(\"Expected %v with delta %v, but was NaN\", expected, delta), msgAndArgs...)\n\t}\n\n\tdt := af - bf\n\tif dt < -delta || dt > delta {\n\t\treturn Fail(t, fmt.Sprintf(\"Max difference between %v and %v allowed is %v, but difference was %v\", expected, actual, delta, dt), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool {\n\tif expected == nil || actual == nil ||\n\t\treflect.TypeOf(actual).Kind() != reflect.Slice ||\n\t\treflect.TypeOf(expected).Kind() != reflect.Slice {\n\t\treturn Fail(t, fmt.Sprintf(\"Parameters must be slice\"), msgAndArgs...)\n\t}\n\n\tactualSlice := reflect.ValueOf(actual)\n\texpectedSlice := reflect.ValueOf(expected)\n\n\tfor i := 0; i < actualSlice.Len(); i++ {\n\t\tresult := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...)\n\t\tif !result {\n\t\t\treturn result\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc calcRelativeError(expected, actual interface{}) (float64, error) {\n\taf, aok := toFloat(expected)\n\tif !aok {\n\t\treturn 0, fmt.Errorf(\"expected value %q cannot be converted to float\", expected)\n\t}\n\tif af == 0 {\n\t\treturn 0, fmt.Errorf(\"expected value must have a value other than zero to calculate the relative error\")\n\t}\n\tbf, bok := toFloat(actual)\n\tif !bok {\n\t\treturn 0, fmt.Errorf(\"actual value %q cannot be converted to float\", actual)\n\t}\n\n\treturn math.Abs(af-bf) / math.Abs(af), nil\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\tactualEpsilon, err := calcRelativeError(expected, actual)\n\tif err != nil {\n\t\treturn Fail(t, err.Error(), msgAndArgs...)\n\t}\n\tif actualEpsilon > epsilon {\n\t\treturn Fail(t, fmt.Sprintf(\"Relative error is too high: %#v (expected)\\n\"+\n\t\t\t\"        < %#v (actual)\", epsilon, actualEpsilon), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool {\n\tif expected == nil || actual == nil ||\n\t\treflect.TypeOf(actual).Kind() != reflect.Slice ||\n\t\treflect.TypeOf(expected).Kind() != reflect.Slice {\n\t\treturn Fail(t, fmt.Sprintf(\"Parameters must be slice\"), msgAndArgs...)\n\t}\n\n\tactualSlice := reflect.ValueOf(actual)\n\texpectedSlice := reflect.ValueOf(expected)\n\n\tfor i := 0; i < actualSlice.Len(); i++ {\n\t\tresult := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), epsilon)\n\t\tif !result {\n\t\t\treturn result\n\t\t}\n\t}\n\n\treturn true\n}\n\n/*\n\tErrors\n*/\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.NoError(t, err) {\n//\t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NoError(t TestingT, err error, msgAndArgs ...interface{}) bool {\n\tif err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Received unexpected error:\\n%+v\", err), msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.Error(t, err) {\n//\t   assert.Equal(t, expectedError, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Error(t TestingT, err error, msgAndArgs ...interface{}) bool {\n\n\tif err == nil {\n\t\treturn Fail(t, \"An error is expected but got nil.\", msgAndArgs...)\n\t}\n\n\treturn true\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   assert.EqualError(t, err,  expectedErrorString)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool {\n\tif !Error(t, theError, msgAndArgs...) {\n\t\treturn false\n\t}\n\texpected := errString\n\tactual := theError.Error()\n\t// don't need to use deep equals here, we know they are both strings\n\tif expected != actual {\n\t\treturn Fail(t, fmt.Sprintf(\"Error message not equal:\\n\"+\n\t\t\t\"expected: %q\\n\"+\n\t\t\t\"actual: %q\", expected, actual), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// matchRegexp return true if a specified regexp matches a string.\nfunc matchRegexp(rx interface{}, str interface{}) bool {\n\n\tvar r *regexp.Regexp\n\tif rr, ok := rx.(*regexp.Regexp); ok {\n\t\tr = rr\n\t} else {\n\t\tr = regexp.MustCompile(fmt.Sprint(rx))\n\t}\n\n\treturn (r.FindStringIndex(fmt.Sprint(str)) != nil)\n\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//  assert.Regexp(t, regexp.MustCompile(\"start\"), \"it's starting\")\n//  assert.Regexp(t, \"start...$\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\n\tmatch := matchRegexp(rx, str)\n\n\tif !match {\n\t\tFail(t, fmt.Sprintf(\"Expect \\\"%v\\\" to match \\\"%v\\\"\", str, rx), msgAndArgs...)\n\t}\n\n\treturn match\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//  assert.NotRegexp(t, regexp.MustCompile(\"starts\"), \"it's starting\")\n//  assert.NotRegexp(t, \"^start\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool {\n\tmatch := matchRegexp(rx, str)\n\n\tif match {\n\t\tFail(t, fmt.Sprintf(\"Expect \\\"%v\\\" to NOT match \\\"%v\\\"\", str, rx), msgAndArgs...)\n\t}\n\n\treturn !match\n\n}\n\n// Zero asserts that i is the zero value for its type and returns the truth.\nfunc Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {\n\tif i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {\n\t\treturn Fail(t, fmt.Sprintf(\"Should be zero, but was %v\", i), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// NotZero asserts that i is not the zero value for its type and returns the truth.\nfunc NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool {\n\tif i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) {\n\t\treturn Fail(t, fmt.Sprintf(\"Should not be zero, but was %v\", i), msgAndArgs...)\n\t}\n\treturn true\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//  assert.JSONEq(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool {\n\tvar expectedJSONAsInterface, actualJSONAsInterface interface{}\n\n\tif err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Expected value ('%s') is not valid json.\\nJSON parsing error: '%s'\", expected, err.Error()), msgAndArgs...)\n\t}\n\n\tif err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil {\n\t\treturn Fail(t, fmt.Sprintf(\"Input ('%s') needs to be valid json.\\nJSON parsing error: '%s'\", actual, err.Error()), msgAndArgs...)\n\t}\n\n\treturn Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...)\n}\n\nfunc typeAndKind(v interface{}) (reflect.Type, reflect.Kind) {\n\tt := reflect.TypeOf(v)\n\tk := t.Kind()\n\n\tif k == reflect.Ptr {\n\t\tt = t.Elem()\n\t\tk = t.Kind()\n\t}\n\treturn t, k\n}\n\n// diff returns a diff of both values as long as both are of the same type and\n// are a struct, map, slice or array. Otherwise it returns an empty string.\nfunc diff(expected interface{}, actual interface{}) string {\n\tif expected == nil || actual == nil {\n\t\treturn \"\"\n\t}\n\n\tet, ek := typeAndKind(expected)\n\tat, _ := typeAndKind(actual)\n\n\tif et != at {\n\t\treturn \"\"\n\t}\n\n\tif ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array {\n\t\treturn \"\"\n\t}\n\n\te := spewConfig.Sdump(expected)\n\ta := spewConfig.Sdump(actual)\n\n\tdiff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{\n\t\tA:        difflib.SplitLines(e),\n\t\tB:        difflib.SplitLines(a),\n\t\tFromFile: \"Expected\",\n\t\tFromDate: \"\",\n\t\tToFile:   \"Actual\",\n\t\tToDate:   \"\",\n\t\tContext:  1,\n\t})\n\n\treturn \"\\n\\nDiff:\\n\" + diff\n}\n\n// validateEqualArgs checks whether provided arguments can be safely used in the\n// Equal/NotEqual functions.\nfunc validateEqualArgs(expected, actual interface{}) error {\n\tif isFunction(expected) || isFunction(actual) {\n\t\treturn errors.New(\"cannot take func type as argument\")\n\t}\n\treturn nil\n}\n\nfunc isFunction(arg interface{}) bool {\n\tif arg == nil {\n\t\treturn false\n\t}\n\treturn reflect.TypeOf(arg).Kind() == reflect.Func\n}\n\nvar spewConfig = spew.ConfigState{\n\tIndent:                  \" \",\n\tDisablePointerAddresses: true,\n\tDisableCapacities:       true,\n\tSortKeys:                true,\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/doc.go",
    "content": "// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system.\n//\n// Example Usage\n//\n// The following is a complete example using assert in a standard test function:\n//    import (\n//      \"testing\"\n//      \"github.com/stretchr/testify/assert\"\n//    )\n//\n//    func TestSomething(t *testing.T) {\n//\n//      var a string = \"Hello\"\n//      var b string = \"Hello\"\n//\n//      assert.Equal(t, a, b, \"The two words should be the same.\")\n//\n//    }\n//\n// if you assert many times, use the format below:\n//\n//    import (\n//      \"testing\"\n//      \"github.com/stretchr/testify/assert\"\n//    )\n//\n//    func TestSomething(t *testing.T) {\n//      assert := assert.New(t)\n//\n//      var a string = \"Hello\"\n//      var b string = \"Hello\"\n//\n//      assert.Equal(a, b, \"The two words should be the same.\")\n//    }\n//\n// Assertions\n//\n// Assertions allow you to easily write test code, and are global funcs in the `assert` package.\n// All assertion functions take, as the first argument, the `*testing.T` object provided by the\n// testing framework. This allows the assertion funcs to write the failings and other details to\n// the correct place.\n//\n// Every assertion function also takes an optional string message as the final argument,\n// allowing custom error messages to be appended to the message the assertion method outputs.\npackage assert\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/errors.go",
    "content": "package assert\n\nimport (\n\t\"errors\"\n)\n\n// AnError is an error instance useful for testing.  If the code does not care\n// about error specifics, and only needs to return the error for example, this\n// error should be used to make the test code more readable.\nvar AnError = errors.New(\"assert.AnError general error for testing\")\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/forward_assertions.go",
    "content": "package assert\n\n// Assertions provides assertion methods around the\n// TestingT interface.\ntype Assertions struct {\n\tt TestingT\n}\n\n// New makes a new Assertions object for the specified TestingT.\nfunc New(t TestingT) *Assertions {\n\treturn &Assertions{\n\t\tt: t,\n\t}\n}\n\n//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/assert/http_assertions.go",
    "content": "package assert\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"net/url\"\n\t\"strings\"\n)\n\n// httpCode is a helper that returns HTTP code of the response. It returns -1 and\n// an error if building a new request fails.\nfunc httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) {\n\tw := httptest.NewRecorder()\n\treq, err := http.NewRequest(method, url+\"?\"+values.Encode(), nil)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\thandler(w, req)\n\treturn w.Code, nil\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//  assert.HTTPSuccess(t, myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool {\n\tcode, err := httpCode(handler, method, url, values)\n\tif err != nil {\n\t\tFail(t, fmt.Sprintf(\"Failed to build test request, got error: %s\", err))\n\t\treturn false\n\t}\n\n\tisSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent\n\tif !isSuccessCode {\n\t\tFail(t, fmt.Sprintf(\"Expected HTTP success status code for %q but received %d\", url+\"?\"+values.Encode(), code))\n\t}\n\n\treturn isSuccessCode\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//  assert.HTTPRedirect(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool {\n\tcode, err := httpCode(handler, method, url, values)\n\tif err != nil {\n\t\tFail(t, fmt.Sprintf(\"Failed to build test request, got error: %s\", err))\n\t\treturn false\n\t}\n\n\tisRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect\n\tif !isRedirectCode {\n\t\tFail(t, fmt.Sprintf(\"Expected HTTP redirect status code for %q but received %d\", url+\"?\"+values.Encode(), code))\n\t}\n\n\treturn isRedirectCode\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//  assert.HTTPError(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool {\n\tcode, err := httpCode(handler, method, url, values)\n\tif err != nil {\n\t\tFail(t, fmt.Sprintf(\"Failed to build test request, got error: %s\", err))\n\t\treturn false\n\t}\n\n\tisErrorCode := code >= http.StatusBadRequest\n\tif !isErrorCode {\n\t\tFail(t, fmt.Sprintf(\"Expected HTTP error status code for %q but received %d\", url+\"?\"+values.Encode(), code))\n\t}\n\n\treturn isErrorCode\n}\n\n// HTTPBody is a helper that returns HTTP body of the response. It returns\n// empty string if building a new request fails.\nfunc HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string {\n\tw := httptest.NewRecorder()\n\treq, err := http.NewRequest(method, url+\"?\"+values.Encode(), nil)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\thandler(w, req)\n\treturn w.Body.String()\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//  assert.HTTPBodyContains(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool {\n\tbody := HTTPBody(handler, method, url, values)\n\n\tcontains := strings.Contains(body, fmt.Sprint(str))\n\tif !contains {\n\t\tFail(t, fmt.Sprintf(\"Expected response body for \\\"%s\\\" to contain \\\"%s\\\" but found \\\"%s\\\"\", url+\"?\"+values.Encode(), str, body))\n\t}\n\n\treturn contains\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  assert.HTTPBodyNotContains(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool {\n\tbody := HTTPBody(handler, method, url, values)\n\n\tcontains := strings.Contains(body, fmt.Sprint(str))\n\tif contains {\n\t\tFail(t, fmt.Sprintf(\"Expected response body for \\\"%s\\\" to NOT contain \\\"%s\\\" but found \\\"%s\\\"\", url+\"?\"+values.Encode(), str, body))\n\t}\n\n\treturn !contains\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/require/doc.go",
    "content": "// Package require implements the same assertions as the `assert` package but\n// stops test execution when a test fails.\n//\n// Example Usage\n//\n// The following is a complete example using require in a standard test function:\n//    import (\n//      \"testing\"\n//      \"github.com/stretchr/testify/require\"\n//    )\n//\n//    func TestSomething(t *testing.T) {\n//\n//      var a string = \"Hello\"\n//      var b string = \"Hello\"\n//\n//      require.Equal(t, a, b, \"The two words should be the same.\")\n//\n//    }\n//\n// Assertions\n//\n// The `require` package have same global functions as in the `assert` package,\n// but instead of returning a boolean result they call `t.FailNow()`.\n//\n// Every assertion function also takes an optional string message as the final argument,\n// allowing custom error messages to be appended to the message the assertion method outputs.\npackage require\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/require/forward_requirements.go",
    "content": "package require\n\n// Assertions provides assertion methods around the\n// TestingT interface.\ntype Assertions struct {\n\tt TestingT\n}\n\n// New makes a new Assertions object for the specified TestingT.\nfunc New(t TestingT) *Assertions {\n\treturn &Assertions{\n\t\tt: t,\n\t}\n}\n\n//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl -include-format-funcs\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/require/require.go",
    "content": "/*\n* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen\n* THIS FILE MUST NOT BE EDITED BY HAND\n */\n\npackage require\n\nimport (\n\tassert \"github.com/stretchr/testify/assert\"\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n)\n\n// Condition uses a Comparison to assert a complex condition.\nfunc Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) {\n\tif !assert.Condition(t, comp, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) {\n\tif !assert.Conditionf(t, comp, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    assert.Contains(t, \"Hello World\", \"World\")\n//    assert.Contains(t, [\"Hello\", \"World\"], \"World\")\n//    assert.Contains(t, {\"Hello\": \"World\"}, \"Hello\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Contains(t, s, contains, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    assert.Containsf(t, \"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//    assert.Containsf(t, [\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//    assert.Containsf(t, {\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tif !assert.Containsf(t, s, contains, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  assert.Empty(t, obj)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Empty(t, object, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  assert.Emptyf(t, obj, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif !assert.Emptyf(t, object, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Equal asserts that two objects are equal.\n//\n//    assert.Equal(t, 123, 123)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Equal(t, expected, actual, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   assert.EqualError(t, err,  expectedErrorString)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) {\n\tif !assert.EqualError(t, theError, errString, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   assert.EqualErrorf(t, err,  expectedErrorString, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) {\n\tif !assert.EqualErrorf(t, theError, errString, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// EqualValues asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    assert.EqualValues(t, uint32(123), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif !assert.EqualValues(t, expected, actual, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// EqualValuesf asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    assert.EqualValuesf(t, uint32(123, \"error message %s\", \"formatted\"), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif !assert.EqualValuesf(t, expected, actual, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Equalf asserts that two objects are equal.\n//\n//    assert.Equalf(t, 123, 123, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif !assert.Equalf(t, expected, actual, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.Error(t, err) {\n// \t   assert.Equal(t, expectedError, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Error(t TestingT, err error, msgAndArgs ...interface{}) {\n\tif !assert.Error(t, err, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.Errorf(t, err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedErrorf, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Errorf(t TestingT, err error, msg string, args ...interface{}) {\n\tif !assert.Errorf(t, err, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Exactly asserts that two objects are equal is value and type.\n//\n//    assert.Exactly(t, int32(123), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Exactly(t, expected, actual, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Exactlyf asserts that two objects are equal is value and type.\n//\n//    assert.Exactlyf(t, int32(123, \"error message %s\", \"formatted\"), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif !assert.Exactlyf(t, expected, actual, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Fail reports a failure through\nfunc Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) {\n\tif !assert.Fail(t, failureMessage, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// FailNow fails test\nfunc FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) {\n\tif !assert.FailNow(t, failureMessage, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// FailNowf fails test\nfunc FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) {\n\tif !assert.FailNowf(t, failureMessage, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Failf reports a failure through\nfunc Failf(t TestingT, failureMessage string, msg string, args ...interface{}) {\n\tif !assert.Failf(t, failureMessage, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// False asserts that the specified value is false.\n//\n//    assert.False(t, myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc False(t TestingT, value bool, msgAndArgs ...interface{}) {\n\tif !assert.False(t, value, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Falsef asserts that the specified value is false.\n//\n//    assert.Falsef(t, myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Falsef(t TestingT, value bool, msg string, args ...interface{}) {\n\tif !assert.Falsef(t, value, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//  assert.HTTPBodyContains(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tif !assert.HTTPBodyContains(t, handler, method, url, values, str) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//  assert.HTTPBodyContainsf(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tif !assert.HTTPBodyContainsf(t, handler, method, url, values, str) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  assert.HTTPBodyNotContains(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tif !assert.HTTPBodyNotContains(t, handler, method, url, values, str) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  assert.HTTPBodyNotContainsf(t, myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tif !assert.HTTPBodyNotContainsf(t, handler, method, url, values, str) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//  assert.HTTPError(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {\n\tif !assert.HTTPError(t, handler, method, url, values) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//  assert.HTTPErrorf(t, myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {\n\tif !assert.HTTPErrorf(t, handler, method, url, values) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//  assert.HTTPRedirect(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {\n\tif !assert.HTTPRedirect(t, handler, method, url, values) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//  assert.HTTPRedirectf(t, myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {\n\tif !assert.HTTPRedirectf(t, handler, method, url, values) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//  assert.HTTPSuccess(t, myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {\n\tif !assert.HTTPSuccess(t, handler, method, url, values) {\n\t\tt.FailNow()\n\t}\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//  assert.HTTPSuccessf(t, myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) {\n\tif !assert.HTTPSuccessf(t, handler, method, url, values) {\n\t\tt.FailNow()\n\t}\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//    assert.Implements(t, (*MyInterface)(nil), new(MyObject))\nfunc Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Implements(t, interfaceObject, object, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//    assert.Implementsf(t, (*MyInterface, \"error message %s\", \"formatted\")(nil), new(MyObject))\nfunc Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {\n\tif !assert.Implementsf(t, interfaceObject, object, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n// \t assert.InDelta(t, math.Pi, (22 / 7.0), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif !assert.InDelta(t, expected, actual, delta, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tif !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif !assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n// \t assert.InDeltaf(t, math.Pi, (22 / 7.0, \"error message %s\", \"formatted\"), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tif !assert.InDeltaf(t, expected, actual, delta, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tif !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tif !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tif !assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tif !assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tif !assert.IsType(t, expectedType, object, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) {\n\tif !assert.IsTypef(t, expectedType, object, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//  assert.JSONEq(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) {\n\tif !assert.JSONEq(t, expected, actual, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//  assert.JSONEqf(t, `{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) {\n\tif !assert.JSONEqf(t, expected, actual, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//    assert.Len(t, mySlice, 3)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) {\n\tif !assert.Len(t, object, length, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//    assert.Lenf(t, mySlice, 3, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) {\n\tif !assert.Lenf(t, object, length, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Nil asserts that the specified object is nil.\n//\n//    assert.Nil(t, err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Nil(t, object, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//    assert.Nilf(t, err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Nilf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif !assert.Nilf(t, object, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.NoError(t, err) {\n// \t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NoError(t TestingT, err error, msgAndArgs ...interface{}) {\n\tif !assert.NoError(t, err, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if assert.NoErrorf(t, err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NoErrorf(t TestingT, err error, msg string, args ...interface{}) {\n\tif !assert.NoErrorf(t, err, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    assert.NotContains(t, \"Hello World\", \"Earth\")\n//    assert.NotContains(t, [\"Hello\", \"World\"], \"Earth\")\n//    assert.NotContains(t, {\"Hello\": \"World\"}, \"Earth\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tif !assert.NotContains(t, s, contains, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    assert.NotContainsf(t, \"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//    assert.NotContainsf(t, [\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//    assert.NotContainsf(t, {\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tif !assert.NotContainsf(t, s, contains, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if assert.NotEmpty(t, obj) {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif !assert.NotEmpty(t, object, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if assert.NotEmptyf(t, obj, \"error message %s\", \"formatted\") {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif !assert.NotEmptyf(t, object, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//    assert.NotEqual(t, obj1, obj2)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tif !assert.NotEqual(t, expected, actual, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//    assert.NotEqualf(t, obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tif !assert.NotEqualf(t, expected, actual, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//    assert.NotNil(t, err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) {\n\tif !assert.NotNil(t, object, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//    assert.NotNilf(t, err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) {\n\tif !assert.NotNilf(t, object, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   assert.NotPanics(t, func(){ RemainCalm() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif !assert.NotPanics(t, f, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   assert.NotPanicsf(t, func(){ RemainCalm() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif !assert.NotPanicsf(t, f, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//  assert.NotRegexp(t, regexp.MustCompile(\"starts\"), \"it's starting\")\n//  assert.NotRegexp(t, \"^start\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tif !assert.NotRegexp(t, rx, str, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//  assert.NotRegexpf(t, regexp.MustCompile(\"starts\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  assert.NotRegexpf(t, \"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tif !assert.NotRegexpf(t, rx, str, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotSubset asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.NotSubset(t, [1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tif !assert.NotSubset(t, list, subset, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.NotSubsetf(t, [1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tif !assert.NotSubsetf(t, list, subset, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotZero asserts that i is not the zero value for its type and returns the truth.\nfunc NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) {\n\tif !assert.NotZero(t, i, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// NotZerof asserts that i is not the zero value for its type and returns the truth.\nfunc NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) {\n\tif !assert.NotZerof(t, i, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//   assert.Panics(t, func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif !assert.Panics(t, f, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   assert.PanicsWithValue(t, \"crazy error\", func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tif !assert.PanicsWithValue(t, expected, f, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   assert.PanicsWithValuef(t, \"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif !assert.PanicsWithValuef(t, expected, f, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//   assert.Panicsf(t, func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tif !assert.Panicsf(t, f, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//  assert.Regexp(t, regexp.MustCompile(\"start\"), \"it's starting\")\n//  assert.Regexp(t, \"start...$\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Regexp(t, rx, str, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//  assert.Regexpf(t, regexp.MustCompile(\"start\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  assert.Regexpf(t, \"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tif !assert.Regexpf(t, rx, str, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Subset asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.Subset(t, [1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Subset(t, list, subset, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Subsetf asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    assert.Subsetf(t, [1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tif !assert.Subsetf(t, list, subset, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// True asserts that the specified value is true.\n//\n//    assert.True(t, myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc True(t TestingT, value bool, msgAndArgs ...interface{}) {\n\tif !assert.True(t, value, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Truef asserts that the specified value is true.\n//\n//    assert.Truef(t, myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc Truef(t TestingT, value bool, msg string, args ...interface{}) {\n\tif !assert.Truef(t, value, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//   assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {\n\tif !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//   assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) {\n\tif !assert.WithinDurationf(t, expected, actual, delta, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Zero asserts that i is the zero value for its type and returns the truth.\nfunc Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) {\n\tif !assert.Zero(t, i, msgAndArgs...) {\n\t\tt.FailNow()\n\t}\n}\n\n// Zerof asserts that i is the zero value for its type and returns the truth.\nfunc Zerof(t TestingT, i interface{}, msg string, args ...interface{}) {\n\tif !assert.Zerof(t, i, msg, args...) {\n\t\tt.FailNow()\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/require/require.go.tmpl",
    "content": "{{.Comment}}\nfunc {{.DocInfo.Name}}(t TestingT, {{.Params}}) {\n\tif !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) {\n\t\tt.FailNow()\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/require/require_forward.go",
    "content": "/*\n* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen\n* THIS FILE MUST NOT BE EDITED BY HAND\n */\n\npackage require\n\nimport (\n\tassert \"github.com/stretchr/testify/assert\"\n\thttp \"net/http\"\n\turl \"net/url\"\n\ttime \"time\"\n)\n\n// Condition uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) {\n\tCondition(a.t, comp, msgAndArgs...)\n}\n\n// Conditionf uses a Comparison to assert a complex condition.\nfunc (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) {\n\tConditionf(a.t, comp, msg, args...)\n}\n\n// Contains asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    a.Contains(\"Hello World\", \"World\")\n//    a.Contains([\"Hello\", \"World\"], \"World\")\n//    a.Contains({\"Hello\": \"World\"}, \"Hello\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tContains(a.t, s, contains, msgAndArgs...)\n}\n\n// Containsf asserts that the specified string, list(array, slice...) or map contains the\n// specified substring or element.\n//\n//    a.Containsf(\"Hello World\", \"World\", \"error message %s\", \"formatted\")\n//    a.Containsf([\"Hello\", \"World\"], \"World\", \"error message %s\", \"formatted\")\n//    a.Containsf({\"Hello\": \"World\"}, \"Hello\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tContainsf(a.t, s, contains, msg, args...)\n}\n\n// Empty asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  a.Empty(obj)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) {\n\tEmpty(a.t, object, msgAndArgs...)\n}\n\n// Emptyf asserts that the specified object is empty.  I.e. nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  a.Emptyf(obj, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) {\n\tEmptyf(a.t, object, msg, args...)\n}\n\n// Equal asserts that two objects are equal.\n//\n//    a.Equal(123, 123)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tEqual(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualError asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   a.EqualError(err,  expectedErrorString)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) {\n\tEqualError(a.t, theError, errString, msgAndArgs...)\n}\n\n// EqualErrorf asserts that a function returned an error (i.e. not `nil`)\n// and that it is equal to the provided error.\n//\n//   actualObj, err := SomeFunction()\n//   a.EqualErrorf(err,  expectedErrorString, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) {\n\tEqualErrorf(a.t, theError, errString, msg, args...)\n}\n\n// EqualValues asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    a.EqualValues(uint32(123), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tEqualValues(a.t, expected, actual, msgAndArgs...)\n}\n\n// EqualValuesf asserts that two objects are equal or convertable to the same types\n// and equal.\n//\n//    a.EqualValuesf(uint32(123, \"error message %s\", \"formatted\"), int32(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tEqualValuesf(a.t, expected, actual, msg, args...)\n}\n\n// Equalf asserts that two objects are equal.\n//\n//    a.Equalf(123, 123, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses). Function equality\n// cannot be determined and will always fail.\nfunc (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tEqualf(a.t, expected, actual, msg, args...)\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.Error(err) {\n// \t   assert.Equal(t, expectedError, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Error(err error, msgAndArgs ...interface{}) {\n\tError(a.t, err, msgAndArgs...)\n}\n\n// Errorf asserts that a function returned an error (i.e. not `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.Errorf(err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedErrorf, err)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Errorf(err error, msg string, args ...interface{}) {\n\tErrorf(a.t, err, msg, args...)\n}\n\n// Exactly asserts that two objects are equal is value and type.\n//\n//    a.Exactly(int32(123), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tExactly(a.t, expected, actual, msgAndArgs...)\n}\n\n// Exactlyf asserts that two objects are equal is value and type.\n//\n//    a.Exactlyf(int32(123, \"error message %s\", \"formatted\"), int64(123))\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tExactlyf(a.t, expected, actual, msg, args...)\n}\n\n// Fail reports a failure through\nfunc (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) {\n\tFail(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNow fails test\nfunc (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) {\n\tFailNow(a.t, failureMessage, msgAndArgs...)\n}\n\n// FailNowf fails test\nfunc (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) {\n\tFailNowf(a.t, failureMessage, msg, args...)\n}\n\n// Failf reports a failure through\nfunc (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) {\n\tFailf(a.t, failureMessage, msg, args...)\n}\n\n// False asserts that the specified value is false.\n//\n//    a.False(myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) False(value bool, msgAndArgs ...interface{}) {\n\tFalse(a.t, value, msgAndArgs...)\n}\n\n// Falsef asserts that the specified value is false.\n//\n//    a.Falsef(myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Falsef(value bool, msg string, args ...interface{}) {\n\tFalsef(a.t, value, msg, args...)\n}\n\n// HTTPBodyContains asserts that a specified handler returns a\n// body that contains a string.\n//\n//  a.HTTPBodyContains(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tHTTPBodyContains(a.t, handler, method, url, values, str)\n}\n\n// HTTPBodyContainsf asserts that a specified handler returns a\n// body that contains a string.\n//\n//  a.HTTPBodyContainsf(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tHTTPBodyContainsf(a.t, handler, method, url, values, str)\n}\n\n// HTTPBodyNotContains asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  a.HTTPBodyNotContains(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tHTTPBodyNotContains(a.t, handler, method, url, values, str)\n}\n\n// HTTPBodyNotContainsf asserts that a specified handler returns a\n// body that does not contain a string.\n//\n//  a.HTTPBodyNotContainsf(myHandler, \"www.google.com\", nil, \"I'm Feeling Lucky\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) {\n\tHTTPBodyNotContainsf(a.t, handler, method, url, values, str)\n}\n\n// HTTPError asserts that a specified handler returns an error status code.\n//\n//  a.HTTPError(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) {\n\tHTTPError(a.t, handler, method, url, values)\n}\n\n// HTTPErrorf asserts that a specified handler returns an error status code.\n//\n//  a.HTTPErrorf(myHandler, \"POST\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) {\n\tHTTPErrorf(a.t, handler, method, url, values)\n}\n\n// HTTPRedirect asserts that a specified handler returns a redirect status code.\n//\n//  a.HTTPRedirect(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) {\n\tHTTPRedirect(a.t, handler, method, url, values)\n}\n\n// HTTPRedirectf asserts that a specified handler returns a redirect status code.\n//\n//  a.HTTPRedirectf(myHandler, \"GET\", \"/a/b/c\", url.Values{\"a\": []string{\"b\", \"c\"}}\n//\n// Returns whether the assertion was successful (true, \"error message %s\", \"formatted\") or not (false).\nfunc (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) {\n\tHTTPRedirectf(a.t, handler, method, url, values)\n}\n\n// HTTPSuccess asserts that a specified handler returns a success status code.\n//\n//  a.HTTPSuccess(myHandler, \"POST\", \"http://www.google.com\", nil)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) {\n\tHTTPSuccess(a.t, handler, method, url, values)\n}\n\n// HTTPSuccessf asserts that a specified handler returns a success status code.\n//\n//  a.HTTPSuccessf(myHandler, \"POST\", \"http://www.google.com\", nil, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) {\n\tHTTPSuccessf(a.t, handler, method, url, values)\n}\n\n// Implements asserts that an object is implemented by the specified interface.\n//\n//    a.Implements((*MyInterface)(nil), new(MyObject))\nfunc (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tImplements(a.t, interfaceObject, object, msgAndArgs...)\n}\n\n// Implementsf asserts that an object is implemented by the specified interface.\n//\n//    a.Implementsf((*MyInterface, \"error message %s\", \"formatted\")(nil), new(MyObject))\nfunc (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) {\n\tImplementsf(a.t, interfaceObject, object, msg, args...)\n}\n\n// InDelta asserts that the two numerals are within delta of each other.\n//\n// \t a.InDelta(math.Pi, (22 / 7.0), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tInDelta(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaSlice is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) {\n\tInDeltaSlice(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// InDeltaSlicef is the same as InDelta, except it compares two slices.\nfunc (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tInDeltaSlicef(a.t, expected, actual, delta, msg, args...)\n}\n\n// InDeltaf asserts that the two numerals are within delta of each other.\n//\n// \t a.InDeltaf(math.Pi, (22 / 7.0, \"error message %s\", \"formatted\"), 0.01)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) {\n\tInDeltaf(a.t, expected, actual, delta, msg, args...)\n}\n\n// InEpsilon asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tInEpsilon(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) {\n\tInEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...)\n}\n\n// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices.\nfunc (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tInEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// InEpsilonf asserts that expected and actual have a relative error less than epsilon\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) {\n\tInEpsilonf(a.t, expected, actual, epsilon, msg, args...)\n}\n\n// IsType asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) {\n\tIsType(a.t, expectedType, object, msgAndArgs...)\n}\n\n// IsTypef asserts that the specified objects are of the same type.\nfunc (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) {\n\tIsTypef(a.t, expectedType, object, msg, args...)\n}\n\n// JSONEq asserts that two JSON strings are equivalent.\n//\n//  a.JSONEq(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) {\n\tJSONEq(a.t, expected, actual, msgAndArgs...)\n}\n\n// JSONEqf asserts that two JSON strings are equivalent.\n//\n//  a.JSONEqf(`{\"hello\": \"world\", \"foo\": \"bar\"}`, `{\"foo\": \"bar\", \"hello\": \"world\"}`, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) {\n\tJSONEqf(a.t, expected, actual, msg, args...)\n}\n\n// Len asserts that the specified object has specific length.\n// Len also fails if the object has a type that len() not accept.\n//\n//    a.Len(mySlice, 3)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) {\n\tLen(a.t, object, length, msgAndArgs...)\n}\n\n// Lenf asserts that the specified object has specific length.\n// Lenf also fails if the object has a type that len() not accept.\n//\n//    a.Lenf(mySlice, 3, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) {\n\tLenf(a.t, object, length, msg, args...)\n}\n\n// Nil asserts that the specified object is nil.\n//\n//    a.Nil(err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) {\n\tNil(a.t, object, msgAndArgs...)\n}\n\n// Nilf asserts that the specified object is nil.\n//\n//    a.Nilf(err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) {\n\tNilf(a.t, object, msg, args...)\n}\n\n// NoError asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.NoError(err) {\n// \t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NoError(err error, msgAndArgs ...interface{}) {\n\tNoError(a.t, err, msgAndArgs...)\n}\n\n// NoErrorf asserts that a function returned no error (i.e. `nil`).\n//\n//   actualObj, err := SomeFunction()\n//   if a.NoErrorf(err, \"error message %s\", \"formatted\") {\n// \t   assert.Equal(t, expectedObj, actualObj)\n//   }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) {\n\tNoErrorf(a.t, err, msg, args...)\n}\n\n// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    a.NotContains(\"Hello World\", \"Earth\")\n//    a.NotContains([\"Hello\", \"World\"], \"Earth\")\n//    a.NotContains({\"Hello\": \"World\"}, \"Earth\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) {\n\tNotContains(a.t, s, contains, msgAndArgs...)\n}\n\n// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the\n// specified substring or element.\n//\n//    a.NotContainsf(\"Hello World\", \"Earth\", \"error message %s\", \"formatted\")\n//    a.NotContainsf([\"Hello\", \"World\"], \"Earth\", \"error message %s\", \"formatted\")\n//    a.NotContainsf({\"Hello\": \"World\"}, \"Earth\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) {\n\tNotContainsf(a.t, s, contains, msg, args...)\n}\n\n// NotEmpty asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if a.NotEmpty(obj) {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) {\n\tNotEmpty(a.t, object, msgAndArgs...)\n}\n\n// NotEmptyf asserts that the specified object is NOT empty.  I.e. not nil, \"\", false, 0 or either\n// a slice or a channel with len == 0.\n//\n//  if a.NotEmptyf(obj, \"error message %s\", \"formatted\") {\n//    assert.Equal(t, \"two\", obj[1])\n//  }\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) {\n\tNotEmptyf(a.t, object, msg, args...)\n}\n\n// NotEqual asserts that the specified values are NOT equal.\n//\n//    a.NotEqual(obj1, obj2)\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) {\n\tNotEqual(a.t, expected, actual, msgAndArgs...)\n}\n\n// NotEqualf asserts that the specified values are NOT equal.\n//\n//    a.NotEqualf(obj1, obj2, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\n//\n// Pointer variable equality is determined based on the equality of the\n// referenced values (as opposed to the memory addresses).\nfunc (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) {\n\tNotEqualf(a.t, expected, actual, msg, args...)\n}\n\n// NotNil asserts that the specified object is not nil.\n//\n//    a.NotNil(err)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) {\n\tNotNil(a.t, object, msgAndArgs...)\n}\n\n// NotNilf asserts that the specified object is not nil.\n//\n//    a.NotNilf(err, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) {\n\tNotNilf(a.t, object, msg, args...)\n}\n\n// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   a.NotPanics(func(){ RemainCalm() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tNotPanics(a.t, f, msgAndArgs...)\n}\n\n// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic.\n//\n//   a.NotPanicsf(func(){ RemainCalm() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tNotPanicsf(a.t, f, msg, args...)\n}\n\n// NotRegexp asserts that a specified regexp does not match a string.\n//\n//  a.NotRegexp(regexp.MustCompile(\"starts\"), \"it's starting\")\n//  a.NotRegexp(\"^start\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tNotRegexp(a.t, rx, str, msgAndArgs...)\n}\n\n// NotRegexpf asserts that a specified regexp does not match a string.\n//\n//  a.NotRegexpf(regexp.MustCompile(\"starts\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  a.NotRegexpf(\"^start\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tNotRegexpf(a.t, rx, str, msg, args...)\n}\n\n// NotSubset asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    a.NotSubset([1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tNotSubset(a.t, list, subset, msgAndArgs...)\n}\n\n// NotSubsetf asserts that the specified list(array, slice...) contains not all\n// elements given in the specified subset(array, slice...).\n//\n//    a.NotSubsetf([1, 3, 4], [1, 2], \"But [1, 3, 4] does not contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tNotSubsetf(a.t, list, subset, msg, args...)\n}\n\n// NotZero asserts that i is not the zero value for its type and returns the truth.\nfunc (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) {\n\tNotZero(a.t, i, msgAndArgs...)\n}\n\n// NotZerof asserts that i is not the zero value for its type and returns the truth.\nfunc (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) {\n\tNotZerof(a.t, i, msg, args...)\n}\n\n// Panics asserts that the code inside the specified PanicTestFunc panics.\n//\n//   a.Panics(func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tPanics(a.t, f, msgAndArgs...)\n}\n\n// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   a.PanicsWithValue(\"crazy error\", func(){ GoCrazy() })\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) {\n\tPanicsWithValue(a.t, expected, f, msgAndArgs...)\n}\n\n// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that\n// the recovered panic value equals the expected panic value.\n//\n//   a.PanicsWithValuef(\"crazy error\", func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tPanicsWithValuef(a.t, expected, f, msg, args...)\n}\n\n// Panicsf asserts that the code inside the specified PanicTestFunc panics.\n//\n//   a.Panicsf(func(){ GoCrazy() }, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) {\n\tPanicsf(a.t, f, msg, args...)\n}\n\n// Regexp asserts that a specified regexp matches a string.\n//\n//  a.Regexp(regexp.MustCompile(\"start\"), \"it's starting\")\n//  a.Regexp(\"start...$\", \"it's not starting\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) {\n\tRegexp(a.t, rx, str, msgAndArgs...)\n}\n\n// Regexpf asserts that a specified regexp matches a string.\n//\n//  a.Regexpf(regexp.MustCompile(\"start\", \"error message %s\", \"formatted\"), \"it's starting\")\n//  a.Regexpf(\"start...$\", \"it's not starting\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) {\n\tRegexpf(a.t, rx, str, msg, args...)\n}\n\n// Subset asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    a.Subset([1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) {\n\tSubset(a.t, list, subset, msgAndArgs...)\n}\n\n// Subsetf asserts that the specified list(array, slice...) contains all\n// elements given in the specified subset(array, slice...).\n//\n//    a.Subsetf([1, 2, 3], [1, 2], \"But [1, 2, 3] does contain [1, 2]\", \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) {\n\tSubsetf(a.t, list, subset, msg, args...)\n}\n\n// True asserts that the specified value is true.\n//\n//    a.True(myBool)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) True(value bool, msgAndArgs ...interface{}) {\n\tTrue(a.t, value, msgAndArgs...)\n}\n\n// Truef asserts that the specified value is true.\n//\n//    a.Truef(myBool, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) Truef(value bool, msg string, args ...interface{}) {\n\tTruef(a.t, value, msg, args...)\n}\n\n// WithinDuration asserts that the two times are within duration delta of each other.\n//\n//   a.WithinDuration(time.Now(), time.Now(), 10*time.Second)\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) {\n\tWithinDuration(a.t, expected, actual, delta, msgAndArgs...)\n}\n\n// WithinDurationf asserts that the two times are within duration delta of each other.\n//\n//   a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, \"error message %s\", \"formatted\")\n//\n// Returns whether the assertion was successful (true) or not (false).\nfunc (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) {\n\tWithinDurationf(a.t, expected, actual, delta, msg, args...)\n}\n\n// Zero asserts that i is the zero value for its type and returns the truth.\nfunc (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) {\n\tZero(a.t, i, msgAndArgs...)\n}\n\n// Zerof asserts that i is the zero value for its type and returns the truth.\nfunc (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) {\n\tZerof(a.t, i, msg, args...)\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/require/require_forward.go.tmpl",
    "content": "{{.CommentWithoutT \"a\"}}\nfunc (a *Assertions) {{.DocInfo.Name}}({{.Params}}) {\n\t{{.DocInfo.Name}}(a.t, {{.ForwardedParams}})\n}\n"
  },
  {
    "path": "vendor/github.com/stretchr/testify/require/requirements.go",
    "content": "package require\n\n// TestingT is an interface wrapper around *testing.T\ntype TestingT interface {\n\tErrorf(format string, args ...interface{})\n\tFailNow()\n}\n\n//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl -include-format-funcs\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/LICENSE",
    "content": "Copyright 2012 Suryandaru Triandana <syndtr@gmail.com>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/README.md",
    "content": "This is an implementation of the [LevelDB key/value database](http:code.google.com/p/leveldb) in the [Go programming language](http:golang.org).\n\n[![Build Status](https://travis-ci.org/syndtr/goleveldb.png?branch=master)](https://travis-ci.org/syndtr/goleveldb)\n\nInstallation\n-----------\n\n\tgo get github.com/syndtr/goleveldb/leveldb\n\nRequirements\n-----------\n\n* Need at least `go1.5` or newer.\n\nUsage\n-----------\n\nCreate or open a database:\n```go\n// The returned DB instance is safe for concurrent use. Which mean that all\n// DB's methods may be called concurrently from multiple goroutine.\ndb, err := leveldb.OpenFile(\"path/to/db\", nil)\n...\ndefer db.Close()\n...\n```\nRead or modify the database content:\n```go\n// Remember that the contents of the returned slice should not be modified.\ndata, err := db.Get([]byte(\"key\"), nil)\n...\nerr = db.Put([]byte(\"key\"), []byte(\"value\"), nil)\n...\nerr = db.Delete([]byte(\"key\"), nil)\n...\n```\n\nIterate over database content:\n```go\niter := db.NewIterator(nil, nil)\nfor iter.Next() {\n\t// Remember that the contents of the returned slice should not be modified, and\n\t// only valid until the next call to Next.\n\tkey := iter.Key()\n\tvalue := iter.Value()\n\t...\n}\niter.Release()\nerr = iter.Error()\n...\n```\nSeek-then-Iterate:\n```go\niter := db.NewIterator(nil, nil)\nfor ok := iter.Seek(key); ok; ok = iter.Next() {\n\t// Use key/value.\n\t...\n}\niter.Release()\nerr = iter.Error()\n...\n```\nIterate over subset of database content:\n```go\niter := db.NewIterator(&util.Range{Start: []byte(\"foo\"), Limit: []byte(\"xoo\")}, nil)\nfor iter.Next() {\n\t// Use key/value.\n\t...\n}\niter.Release()\nerr = iter.Error()\n...\n```\nIterate over subset of database content with a particular prefix:\n```go\niter := db.NewIterator(util.BytesPrefix([]byte(\"foo-\")), nil)\nfor iter.Next() {\n\t// Use key/value.\n\t...\n}\niter.Release()\nerr = iter.Error()\n...\n```\nBatch writes:\n```go\nbatch := new(leveldb.Batch)\nbatch.Put([]byte(\"foo\"), []byte(\"value\"))\nbatch.Put([]byte(\"bar\"), []byte(\"another value\"))\nbatch.Delete([]byte(\"baz\"))\nerr = db.Write(batch, nil)\n...\n```\nUse bloom filter:\n```go\no := &opt.Options{\n\tFilter: filter.NewBloomFilter(10),\n}\ndb, err := leveldb.OpenFile(\"path/to/db\", o)\n...\ndefer db.Close()\n...\n```\nDocumentation\n-----------\n\nYou can read package documentation [here](http:godoc.org/github.com/syndtr/goleveldb).\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/batch.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/memdb\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\n// ErrBatchCorrupted records reason of batch corruption. This error will be\n// wrapped with errors.ErrCorrupted.\ntype ErrBatchCorrupted struct {\n\tReason string\n}\n\nfunc (e *ErrBatchCorrupted) Error() string {\n\treturn fmt.Sprintf(\"leveldb: batch corrupted: %s\", e.Reason)\n}\n\nfunc newErrBatchCorrupted(reason string) error {\n\treturn errors.NewErrCorrupted(storage.FileDesc{}, &ErrBatchCorrupted{reason})\n}\n\nconst (\n\tbatchHeaderLen = 8 + 4\n\tbatchGrowRec   = 3000\n\tbatchBufioSize = 16\n)\n\n// BatchReplay wraps basic batch operations.\ntype BatchReplay interface {\n\tPut(key, value []byte)\n\tDelete(key []byte)\n}\n\ntype batchIndex struct {\n\tkeyType            keyType\n\tkeyPos, keyLen     int\n\tvaluePos, valueLen int\n}\n\nfunc (index batchIndex) k(data []byte) []byte {\n\treturn data[index.keyPos : index.keyPos+index.keyLen]\n}\n\nfunc (index batchIndex) v(data []byte) []byte {\n\tif index.valueLen != 0 {\n\t\treturn data[index.valuePos : index.valuePos+index.valueLen]\n\t}\n\treturn nil\n}\n\nfunc (index batchIndex) kv(data []byte) (key, value []byte) {\n\treturn index.k(data), index.v(data)\n}\n\n// Batch is a write batch.\ntype Batch struct {\n\tdata  []byte\n\tindex []batchIndex\n\n\t// internalLen is sums of key/value pair length plus 8-bytes internal key.\n\tinternalLen int\n}\n\nfunc (b *Batch) grow(n int) {\n\to := len(b.data)\n\tif cap(b.data)-o < n {\n\t\tdiv := 1\n\t\tif len(b.index) > batchGrowRec {\n\t\t\tdiv = len(b.index) / batchGrowRec\n\t\t}\n\t\tndata := make([]byte, o, o+n+o/div)\n\t\tcopy(ndata, b.data)\n\t\tb.data = ndata\n\t}\n}\n\nfunc (b *Batch) appendRec(kt keyType, key, value []byte) {\n\tn := 1 + binary.MaxVarintLen32 + len(key)\n\tif kt == keyTypeVal {\n\t\tn += binary.MaxVarintLen32 + len(value)\n\t}\n\tb.grow(n)\n\tindex := batchIndex{keyType: kt}\n\to := len(b.data)\n\tdata := b.data[:o+n]\n\tdata[o] = byte(kt)\n\to++\n\to += binary.PutUvarint(data[o:], uint64(len(key)))\n\tindex.keyPos = o\n\tindex.keyLen = len(key)\n\to += copy(data[o:], key)\n\tif kt == keyTypeVal {\n\t\to += binary.PutUvarint(data[o:], uint64(len(value)))\n\t\tindex.valuePos = o\n\t\tindex.valueLen = len(value)\n\t\to += copy(data[o:], value)\n\t}\n\tb.data = data[:o]\n\tb.index = append(b.index, index)\n\tb.internalLen += index.keyLen + index.valueLen + 8\n}\n\n// Put appends 'put operation' of the given key/value pair to the batch.\n// It is safe to modify the contents of the argument after Put returns but not\n// before.\nfunc (b *Batch) Put(key, value []byte) {\n\tb.appendRec(keyTypeVal, key, value)\n}\n\n// Delete appends 'delete operation' of the given key to the batch.\n// It is safe to modify the contents of the argument after Delete returns but\n// not before.\nfunc (b *Batch) Delete(key []byte) {\n\tb.appendRec(keyTypeDel, key, nil)\n}\n\n// Dump dumps batch contents. The returned slice can be loaded into the\n// batch using Load method.\n// The returned slice is not its own copy, so the contents should not be\n// modified.\nfunc (b *Batch) Dump() []byte {\n\treturn b.data\n}\n\n// Load loads given slice into the batch. Previous contents of the batch\n// will be discarded.\n// The given slice will not be copied and will be used as batch buffer, so\n// it is not safe to modify the contents of the slice.\nfunc (b *Batch) Load(data []byte) error {\n\treturn b.decode(data, -1)\n}\n\n// Replay replays batch contents.\nfunc (b *Batch) Replay(r BatchReplay) error {\n\tfor _, index := range b.index {\n\t\tswitch index.keyType {\n\t\tcase keyTypeVal:\n\t\t\tr.Put(index.k(b.data), index.v(b.data))\n\t\tcase keyTypeDel:\n\t\t\tr.Delete(index.k(b.data))\n\t\t}\n\t}\n\treturn nil\n}\n\n// Len returns number of records in the batch.\nfunc (b *Batch) Len() int {\n\treturn len(b.index)\n}\n\n// Reset resets the batch.\nfunc (b *Batch) Reset() {\n\tb.data = b.data[:0]\n\tb.index = b.index[:0]\n\tb.internalLen = 0\n}\n\nfunc (b *Batch) replayInternal(fn func(i int, kt keyType, k, v []byte) error) error {\n\tfor i, index := range b.index {\n\t\tif err := fn(i, index.keyType, index.k(b.data), index.v(b.data)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (b *Batch) append(p *Batch) {\n\tob := len(b.data)\n\toi := len(b.index)\n\tb.data = append(b.data, p.data...)\n\tb.index = append(b.index, p.index...)\n\tb.internalLen += p.internalLen\n\n\t// Updating index offset.\n\tif ob != 0 {\n\t\tfor ; oi < len(b.index); oi++ {\n\t\t\tindex := &b.index[oi]\n\t\t\tindex.keyPos += ob\n\t\t\tif index.valueLen != 0 {\n\t\t\t\tindex.valuePos += ob\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (b *Batch) decode(data []byte, expectedLen int) error {\n\tb.data = data\n\tb.index = b.index[:0]\n\tb.internalLen = 0\n\terr := decodeBatch(data, func(i int, index batchIndex) error {\n\t\tb.index = append(b.index, index)\n\t\tb.internalLen += index.keyLen + index.valueLen + 8\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif expectedLen >= 0 && len(b.index) != expectedLen {\n\t\treturn newErrBatchCorrupted(fmt.Sprintf(\"invalid records length: %d vs %d\", expectedLen, len(b.index)))\n\t}\n\treturn nil\n}\n\nfunc (b *Batch) putMem(seq uint64, mdb *memdb.DB) error {\n\tvar ik []byte\n\tfor i, index := range b.index {\n\t\tik = makeInternalKey(ik, index.k(b.data), seq+uint64(i), index.keyType)\n\t\tif err := mdb.Put(ik, index.v(b.data)); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (b *Batch) revertMem(seq uint64, mdb *memdb.DB) error {\n\tvar ik []byte\n\tfor i, index := range b.index {\n\t\tik = makeInternalKey(ik, index.k(b.data), seq+uint64(i), index.keyType)\n\t\tif err := mdb.Delete(ik); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc newBatch() interface{} {\n\treturn &Batch{}\n}\n\nfunc decodeBatch(data []byte, fn func(i int, index batchIndex) error) error {\n\tvar index batchIndex\n\tfor i, o := 0, 0; o < len(data); i++ {\n\t\t// Key type.\n\t\tindex.keyType = keyType(data[o])\n\t\tif index.keyType > keyTypeVal {\n\t\t\treturn newErrBatchCorrupted(fmt.Sprintf(\"bad record: invalid type %#x\", uint(index.keyType)))\n\t\t}\n\t\to++\n\n\t\t// Key.\n\t\tx, n := binary.Uvarint(data[o:])\n\t\to += n\n\t\tif n <= 0 || o+int(x) > len(data) {\n\t\t\treturn newErrBatchCorrupted(\"bad record: invalid key length\")\n\t\t}\n\t\tindex.keyPos = o\n\t\tindex.keyLen = int(x)\n\t\to += index.keyLen\n\n\t\t// Value.\n\t\tif index.keyType == keyTypeVal {\n\t\t\tx, n = binary.Uvarint(data[o:])\n\t\t\to += n\n\t\t\tif n <= 0 || o+int(x) > len(data) {\n\t\t\t\treturn newErrBatchCorrupted(\"bad record: invalid value length\")\n\t\t\t}\n\t\t\tindex.valuePos = o\n\t\t\tindex.valueLen = int(x)\n\t\t\to += index.valueLen\n\t\t} else {\n\t\t\tindex.valuePos = 0\n\t\t\tindex.valueLen = 0\n\t\t}\n\n\t\tif err := fn(i, index); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc decodeBatchToMem(data []byte, expectSeq uint64, mdb *memdb.DB) (seq uint64, batchLen int, err error) {\n\tseq, batchLen, err = decodeBatchHeader(data)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\tif seq < expectSeq {\n\t\treturn 0, 0, newErrBatchCorrupted(\"invalid sequence number\")\n\t}\n\tdata = data[batchHeaderLen:]\n\tvar ik []byte\n\tvar decodedLen int\n\terr = decodeBatch(data, func(i int, index batchIndex) error {\n\t\tif i >= batchLen {\n\t\t\treturn newErrBatchCorrupted(\"invalid records length\")\n\t\t}\n\t\tik = makeInternalKey(ik, index.k(data), seq+uint64(i), index.keyType)\n\t\tif err := mdb.Put(ik, index.v(data)); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdecodedLen++\n\t\treturn nil\n\t})\n\tif err == nil && decodedLen != batchLen {\n\t\terr = newErrBatchCorrupted(fmt.Sprintf(\"invalid records length: %d vs %d\", batchLen, decodedLen))\n\t}\n\treturn\n}\n\nfunc encodeBatchHeader(dst []byte, seq uint64, batchLen int) []byte {\n\tdst = ensureBuffer(dst, batchHeaderLen)\n\tbinary.LittleEndian.PutUint64(dst, seq)\n\tbinary.LittleEndian.PutUint32(dst[8:], uint32(batchLen))\n\treturn dst\n}\n\nfunc decodeBatchHeader(data []byte) (seq uint64, batchLen int, err error) {\n\tif len(data) < batchHeaderLen {\n\t\treturn 0, 0, newErrBatchCorrupted(\"too short\")\n\t}\n\n\tseq = binary.LittleEndian.Uint64(data)\n\tbatchLen = int(binary.LittleEndian.Uint32(data[8:]))\n\tif batchLen < 0 {\n\t\treturn 0, 0, newErrBatchCorrupted(\"invalid records length\")\n\t}\n\treturn\n}\n\nfunc batchesLen(batches []*Batch) int {\n\tbatchLen := 0\n\tfor _, batch := range batches {\n\t\tbatchLen += batch.Len()\n\t}\n\treturn batchLen\n}\n\nfunc writeBatchesWithHeader(wr io.Writer, batches []*Batch, seq uint64) error {\n\tif _, err := wr.Write(encodeBatchHeader(nil, seq, batchesLen(batches))); err != nil {\n\t\treturn err\n\t}\n\tfor _, batch := range batches {\n\t\tif _, err := wr.Write(batch.data); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package cache provides interface and implementation of a cache algorithms.\npackage cache\n\nimport (\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"unsafe\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// Cacher provides interface to implements a caching functionality.\n// An implementation must be safe for concurrent use.\ntype Cacher interface {\n\t// Capacity returns cache capacity.\n\tCapacity() int\n\n\t// SetCapacity sets cache capacity.\n\tSetCapacity(capacity int)\n\n\t// Promote promotes the 'cache node'.\n\tPromote(n *Node)\n\n\t// Ban evicts the 'cache node' and prevent subsequent 'promote'.\n\tBan(n *Node)\n\n\t// Evict evicts the 'cache node'.\n\tEvict(n *Node)\n\n\t// EvictNS evicts 'cache node' with the given namespace.\n\tEvictNS(ns uint64)\n\n\t// EvictAll evicts all 'cache node'.\n\tEvictAll()\n\n\t// Close closes the 'cache tree'\n\tClose() error\n}\n\n// Value is a 'cacheable object'. It may implements util.Releaser, if\n// so the the Release method will be called once object is released.\ntype Value interface{}\n\n// NamespaceGetter provides convenient wrapper for namespace.\ntype NamespaceGetter struct {\n\tCache *Cache\n\tNS    uint64\n}\n\n// Get simply calls Cache.Get() method.\nfunc (g *NamespaceGetter) Get(key uint64, setFunc func() (size int, value Value)) *Handle {\n\treturn g.Cache.Get(g.NS, key, setFunc)\n}\n\n// The hash tables implementation is based on:\n// \"Dynamic-Sized Nonblocking Hash Tables\", by Yujie Liu,\n// Kunlong Zhang, and Michael Spear.\n// ACM Symposium on Principles of Distributed Computing, Jul 2014.\n\nconst (\n\tmInitialSize           = 1 << 4\n\tmOverflowThreshold     = 1 << 5\n\tmOverflowGrowThreshold = 1 << 7\n)\n\ntype mBucket struct {\n\tmu     sync.Mutex\n\tnode   []*Node\n\tfrozen bool\n}\n\nfunc (b *mBucket) freeze() []*Node {\n\tb.mu.Lock()\n\tdefer b.mu.Unlock()\n\tif !b.frozen {\n\t\tb.frozen = true\n\t}\n\treturn b.node\n}\n\nfunc (b *mBucket) get(r *Cache, h *mNode, hash uint32, ns, key uint64, noset bool) (done, added bool, n *Node) {\n\tb.mu.Lock()\n\n\tif b.frozen {\n\t\tb.mu.Unlock()\n\t\treturn\n\t}\n\n\t// Scan the node.\n\tfor _, n := range b.node {\n\t\tif n.hash == hash && n.ns == ns && n.key == key {\n\t\t\tatomic.AddInt32(&n.ref, 1)\n\t\t\tb.mu.Unlock()\n\t\t\treturn true, false, n\n\t\t}\n\t}\n\n\t// Get only.\n\tif noset {\n\t\tb.mu.Unlock()\n\t\treturn true, false, nil\n\t}\n\n\t// Create node.\n\tn = &Node{\n\t\tr:    r,\n\t\thash: hash,\n\t\tns:   ns,\n\t\tkey:  key,\n\t\tref:  1,\n\t}\n\t// Add node to bucket.\n\tb.node = append(b.node, n)\n\tbLen := len(b.node)\n\tb.mu.Unlock()\n\n\t// Update counter.\n\tgrow := atomic.AddInt32(&r.nodes, 1) >= h.growThreshold\n\tif bLen > mOverflowThreshold {\n\t\tgrow = grow || atomic.AddInt32(&h.overflow, 1) >= mOverflowGrowThreshold\n\t}\n\n\t// Grow.\n\tif grow && atomic.CompareAndSwapInt32(&h.resizeInProgess, 0, 1) {\n\t\tnhLen := len(h.buckets) << 1\n\t\tnh := &mNode{\n\t\t\tbuckets:         make([]unsafe.Pointer, nhLen),\n\t\t\tmask:            uint32(nhLen) - 1,\n\t\t\tpred:            unsafe.Pointer(h),\n\t\t\tgrowThreshold:   int32(nhLen * mOverflowThreshold),\n\t\t\tshrinkThreshold: int32(nhLen >> 1),\n\t\t}\n\t\tok := atomic.CompareAndSwapPointer(&r.mHead, unsafe.Pointer(h), unsafe.Pointer(nh))\n\t\tif !ok {\n\t\t\tpanic(\"BUG: failed swapping head\")\n\t\t}\n\t\tgo nh.initBuckets()\n\t}\n\n\treturn true, true, n\n}\n\nfunc (b *mBucket) delete(r *Cache, h *mNode, hash uint32, ns, key uint64) (done, deleted bool) {\n\tb.mu.Lock()\n\n\tif b.frozen {\n\t\tb.mu.Unlock()\n\t\treturn\n\t}\n\n\t// Scan the node.\n\tvar (\n\t\tn    *Node\n\t\tbLen int\n\t)\n\tfor i := range b.node {\n\t\tn = b.node[i]\n\t\tif n.ns == ns && n.key == key {\n\t\t\tif atomic.LoadInt32(&n.ref) == 0 {\n\t\t\t\tdeleted = true\n\n\t\t\t\t// Call releaser.\n\t\t\t\tif n.value != nil {\n\t\t\t\t\tif r, ok := n.value.(util.Releaser); ok {\n\t\t\t\t\t\tr.Release()\n\t\t\t\t\t}\n\t\t\t\t\tn.value = nil\n\t\t\t\t}\n\n\t\t\t\t// Remove node from bucket.\n\t\t\t\tb.node = append(b.node[:i], b.node[i+1:]...)\n\t\t\t\tbLen = len(b.node)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\tb.mu.Unlock()\n\n\tif deleted {\n\t\t// Call OnDel.\n\t\tfor _, f := range n.onDel {\n\t\t\tf()\n\t\t}\n\n\t\t// Update counter.\n\t\tatomic.AddInt32(&r.size, int32(n.size)*-1)\n\t\tshrink := atomic.AddInt32(&r.nodes, -1) < h.shrinkThreshold\n\t\tif bLen >= mOverflowThreshold {\n\t\t\tatomic.AddInt32(&h.overflow, -1)\n\t\t}\n\n\t\t// Shrink.\n\t\tif shrink && len(h.buckets) > mInitialSize && atomic.CompareAndSwapInt32(&h.resizeInProgess, 0, 1) {\n\t\t\tnhLen := len(h.buckets) >> 1\n\t\t\tnh := &mNode{\n\t\t\t\tbuckets:         make([]unsafe.Pointer, nhLen),\n\t\t\t\tmask:            uint32(nhLen) - 1,\n\t\t\t\tpred:            unsafe.Pointer(h),\n\t\t\t\tgrowThreshold:   int32(nhLen * mOverflowThreshold),\n\t\t\t\tshrinkThreshold: int32(nhLen >> 1),\n\t\t\t}\n\t\t\tok := atomic.CompareAndSwapPointer(&r.mHead, unsafe.Pointer(h), unsafe.Pointer(nh))\n\t\t\tif !ok {\n\t\t\t\tpanic(\"BUG: failed swapping head\")\n\t\t\t}\n\t\t\tgo nh.initBuckets()\n\t\t}\n\t}\n\n\treturn true, deleted\n}\n\ntype mNode struct {\n\tbuckets         []unsafe.Pointer // []*mBucket\n\tmask            uint32\n\tpred            unsafe.Pointer // *mNode\n\tresizeInProgess int32\n\n\toverflow        int32\n\tgrowThreshold   int32\n\tshrinkThreshold int32\n}\n\nfunc (n *mNode) initBucket(i uint32) *mBucket {\n\tif b := (*mBucket)(atomic.LoadPointer(&n.buckets[i])); b != nil {\n\t\treturn b\n\t}\n\n\tp := (*mNode)(atomic.LoadPointer(&n.pred))\n\tif p != nil {\n\t\tvar node []*Node\n\t\tif n.mask > p.mask {\n\t\t\t// Grow.\n\t\t\tpb := (*mBucket)(atomic.LoadPointer(&p.buckets[i&p.mask]))\n\t\t\tif pb == nil {\n\t\t\t\tpb = p.initBucket(i & p.mask)\n\t\t\t}\n\t\t\tm := pb.freeze()\n\t\t\t// Split nodes.\n\t\t\tfor _, x := range m {\n\t\t\t\tif x.hash&n.mask == i {\n\t\t\t\t\tnode = append(node, x)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Shrink.\n\t\t\tpb0 := (*mBucket)(atomic.LoadPointer(&p.buckets[i]))\n\t\t\tif pb0 == nil {\n\t\t\t\tpb0 = p.initBucket(i)\n\t\t\t}\n\t\t\tpb1 := (*mBucket)(atomic.LoadPointer(&p.buckets[i+uint32(len(n.buckets))]))\n\t\t\tif pb1 == nil {\n\t\t\t\tpb1 = p.initBucket(i + uint32(len(n.buckets)))\n\t\t\t}\n\t\t\tm0 := pb0.freeze()\n\t\t\tm1 := pb1.freeze()\n\t\t\t// Merge nodes.\n\t\t\tnode = make([]*Node, 0, len(m0)+len(m1))\n\t\t\tnode = append(node, m0...)\n\t\t\tnode = append(node, m1...)\n\t\t}\n\t\tb := &mBucket{node: node}\n\t\tif atomic.CompareAndSwapPointer(&n.buckets[i], nil, unsafe.Pointer(b)) {\n\t\t\tif len(node) > mOverflowThreshold {\n\t\t\t\tatomic.AddInt32(&n.overflow, int32(len(node)-mOverflowThreshold))\n\t\t\t}\n\t\t\treturn b\n\t\t}\n\t}\n\n\treturn (*mBucket)(atomic.LoadPointer(&n.buckets[i]))\n}\n\nfunc (n *mNode) initBuckets() {\n\tfor i := range n.buckets {\n\t\tn.initBucket(uint32(i))\n\t}\n\tatomic.StorePointer(&n.pred, nil)\n}\n\n// Cache is a 'cache map'.\ntype Cache struct {\n\tmu     sync.RWMutex\n\tmHead  unsafe.Pointer // *mNode\n\tnodes  int32\n\tsize   int32\n\tcacher Cacher\n\tclosed bool\n}\n\n// NewCache creates a new 'cache map'. The cacher is optional and\n// may be nil.\nfunc NewCache(cacher Cacher) *Cache {\n\th := &mNode{\n\t\tbuckets:         make([]unsafe.Pointer, mInitialSize),\n\t\tmask:            mInitialSize - 1,\n\t\tgrowThreshold:   int32(mInitialSize * mOverflowThreshold),\n\t\tshrinkThreshold: 0,\n\t}\n\tfor i := range h.buckets {\n\t\th.buckets[i] = unsafe.Pointer(&mBucket{})\n\t}\n\tr := &Cache{\n\t\tmHead:  unsafe.Pointer(h),\n\t\tcacher: cacher,\n\t}\n\treturn r\n}\n\nfunc (r *Cache) getBucket(hash uint32) (*mNode, *mBucket) {\n\th := (*mNode)(atomic.LoadPointer(&r.mHead))\n\ti := hash & h.mask\n\tb := (*mBucket)(atomic.LoadPointer(&h.buckets[i]))\n\tif b == nil {\n\t\tb = h.initBucket(i)\n\t}\n\treturn h, b\n}\n\nfunc (r *Cache) delete(n *Node) bool {\n\tfor {\n\t\th, b := r.getBucket(n.hash)\n\t\tdone, deleted := b.delete(r, h, n.hash, n.ns, n.key)\n\t\tif done {\n\t\t\treturn deleted\n\t\t}\n\t}\n\treturn false\n}\n\n// Nodes returns number of 'cache node' in the map.\nfunc (r *Cache) Nodes() int {\n\treturn int(atomic.LoadInt32(&r.nodes))\n}\n\n// Size returns sums of 'cache node' size in the map.\nfunc (r *Cache) Size() int {\n\treturn int(atomic.LoadInt32(&r.size))\n}\n\n// Capacity returns cache capacity.\nfunc (r *Cache) Capacity() int {\n\tif r.cacher == nil {\n\t\treturn 0\n\t}\n\treturn r.cacher.Capacity()\n}\n\n// SetCapacity sets cache capacity.\nfunc (r *Cache) SetCapacity(capacity int) {\n\tif r.cacher != nil {\n\t\tr.cacher.SetCapacity(capacity)\n\t}\n}\n\n// Get gets 'cache node' with the given namespace and key.\n// If cache node is not found and setFunc is not nil, Get will atomically creates\n// the 'cache node' by calling setFunc. Otherwise Get will returns nil.\n//\n// The returned 'cache handle' should be released after use by calling Release\n// method.\nfunc (r *Cache) Get(ns, key uint64, setFunc func() (size int, value Value)) *Handle {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\tif r.closed {\n\t\treturn nil\n\t}\n\n\thash := murmur32(ns, key, 0xf00)\n\tfor {\n\t\th, b := r.getBucket(hash)\n\t\tdone, _, n := b.get(r, h, hash, ns, key, setFunc == nil)\n\t\tif done {\n\t\t\tif n != nil {\n\t\t\t\tn.mu.Lock()\n\t\t\t\tif n.value == nil {\n\t\t\t\t\tif setFunc == nil {\n\t\t\t\t\t\tn.mu.Unlock()\n\t\t\t\t\t\tn.unref()\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\n\t\t\t\t\tn.size, n.value = setFunc()\n\t\t\t\t\tif n.value == nil {\n\t\t\t\t\t\tn.size = 0\n\t\t\t\t\t\tn.mu.Unlock()\n\t\t\t\t\t\tn.unref()\n\t\t\t\t\t\treturn nil\n\t\t\t\t\t}\n\t\t\t\t\tatomic.AddInt32(&r.size, int32(n.size))\n\t\t\t\t}\n\t\t\t\tn.mu.Unlock()\n\t\t\t\tif r.cacher != nil {\n\t\t\t\t\tr.cacher.Promote(n)\n\t\t\t\t}\n\t\t\t\treturn &Handle{unsafe.Pointer(n)}\n\t\t\t}\n\n\t\t\tbreak\n\t\t}\n\t}\n\treturn nil\n}\n\n// Delete removes and ban 'cache node' with the given namespace and key.\n// A banned 'cache node' will never inserted into the 'cache tree'. Ban\n// only attributed to the particular 'cache node', so when a 'cache node'\n// is recreated it will not be banned.\n//\n// If onDel is not nil, then it will be executed if such 'cache node'\n// doesn't exist or once the 'cache node' is released.\n//\n// Delete return true is such 'cache node' exist.\nfunc (r *Cache) Delete(ns, key uint64, onDel func()) bool {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\tif r.closed {\n\t\treturn false\n\t}\n\n\thash := murmur32(ns, key, 0xf00)\n\tfor {\n\t\th, b := r.getBucket(hash)\n\t\tdone, _, n := b.get(r, h, hash, ns, key, true)\n\t\tif done {\n\t\t\tif n != nil {\n\t\t\t\tif onDel != nil {\n\t\t\t\t\tn.mu.Lock()\n\t\t\t\t\tn.onDel = append(n.onDel, onDel)\n\t\t\t\t\tn.mu.Unlock()\n\t\t\t\t}\n\t\t\t\tif r.cacher != nil {\n\t\t\t\t\tr.cacher.Ban(n)\n\t\t\t\t}\n\t\t\t\tn.unref()\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif onDel != nil {\n\t\tonDel()\n\t}\n\n\treturn false\n}\n\n// Evict evicts 'cache node' with the given namespace and key. This will\n// simply call Cacher.Evict.\n//\n// Evict return true is such 'cache node' exist.\nfunc (r *Cache) Evict(ns, key uint64) bool {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\tif r.closed {\n\t\treturn false\n\t}\n\n\thash := murmur32(ns, key, 0xf00)\n\tfor {\n\t\th, b := r.getBucket(hash)\n\t\tdone, _, n := b.get(r, h, hash, ns, key, true)\n\t\tif done {\n\t\t\tif n != nil {\n\t\t\t\tif r.cacher != nil {\n\t\t\t\t\tr.cacher.Evict(n)\n\t\t\t\t}\n\t\t\t\tn.unref()\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn false\n}\n\n// EvictNS evicts 'cache node' with the given namespace. This will\n// simply call Cacher.EvictNS.\nfunc (r *Cache) EvictNS(ns uint64) {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\tif r.closed {\n\t\treturn\n\t}\n\n\tif r.cacher != nil {\n\t\tr.cacher.EvictNS(ns)\n\t}\n}\n\n// EvictAll evicts all 'cache node'. This will simply call Cacher.EvictAll.\nfunc (r *Cache) EvictAll() {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\tif r.closed {\n\t\treturn\n\t}\n\n\tif r.cacher != nil {\n\t\tr.cacher.EvictAll()\n\t}\n}\n\n// Close closes the 'cache map' and forcefully releases all 'cache node'.\nfunc (r *Cache) Close() error {\n\tr.mu.Lock()\n\tif !r.closed {\n\t\tr.closed = true\n\n\t\th := (*mNode)(r.mHead)\n\t\th.initBuckets()\n\n\t\tfor i := range h.buckets {\n\t\t\tb := (*mBucket)(h.buckets[i])\n\t\t\tfor _, n := range b.node {\n\t\t\t\t// Call releaser.\n\t\t\t\tif n.value != nil {\n\t\t\t\t\tif r, ok := n.value.(util.Releaser); ok {\n\t\t\t\t\t\tr.Release()\n\t\t\t\t\t}\n\t\t\t\t\tn.value = nil\n\t\t\t\t}\n\n\t\t\t\t// Call OnDel.\n\t\t\t\tfor _, f := range n.onDel {\n\t\t\t\t\tf()\n\t\t\t\t}\n\t\t\t\tn.onDel = nil\n\t\t\t}\n\t\t}\n\t}\n\tr.mu.Unlock()\n\n\t// Avoid deadlock.\n\tif r.cacher != nil {\n\t\tif err := r.cacher.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// CloseWeak closes the 'cache map' and evict all 'cache node' from cacher, but\n// unlike Close it doesn't forcefully releases 'cache node'.\nfunc (r *Cache) CloseWeak() error {\n\tr.mu.Lock()\n\tif !r.closed {\n\t\tr.closed = true\n\t}\n\tr.mu.Unlock()\n\n\t// Avoid deadlock.\n\tif r.cacher != nil {\n\t\tr.cacher.EvictAll()\n\t\tif err := r.cacher.Close(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Node is a 'cache node'.\ntype Node struct {\n\tr *Cache\n\n\thash    uint32\n\tns, key uint64\n\n\tmu    sync.Mutex\n\tsize  int\n\tvalue Value\n\n\tref   int32\n\tonDel []func()\n\n\tCacheData unsafe.Pointer\n}\n\n// NS returns this 'cache node' namespace.\nfunc (n *Node) NS() uint64 {\n\treturn n.ns\n}\n\n// Key returns this 'cache node' key.\nfunc (n *Node) Key() uint64 {\n\treturn n.key\n}\n\n// Size returns this 'cache node' size.\nfunc (n *Node) Size() int {\n\treturn n.size\n}\n\n// Value returns this 'cache node' value.\nfunc (n *Node) Value() Value {\n\treturn n.value\n}\n\n// Ref returns this 'cache node' ref counter.\nfunc (n *Node) Ref() int32 {\n\treturn atomic.LoadInt32(&n.ref)\n}\n\n// GetHandle returns an handle for this 'cache node'.\nfunc (n *Node) GetHandle() *Handle {\n\tif atomic.AddInt32(&n.ref, 1) <= 1 {\n\t\tpanic(\"BUG: Node.GetHandle on zero ref\")\n\t}\n\treturn &Handle{unsafe.Pointer(n)}\n}\n\nfunc (n *Node) unref() {\n\tif atomic.AddInt32(&n.ref, -1) == 0 {\n\t\tn.r.delete(n)\n\t}\n}\n\nfunc (n *Node) unrefLocked() {\n\tif atomic.AddInt32(&n.ref, -1) == 0 {\n\t\tn.r.mu.RLock()\n\t\tif !n.r.closed {\n\t\t\tn.r.delete(n)\n\t\t}\n\t\tn.r.mu.RUnlock()\n\t}\n}\n\n// Handle is a 'cache handle' of a 'cache node'.\ntype Handle struct {\n\tn unsafe.Pointer // *Node\n}\n\n// Value returns the value of the 'cache node'.\nfunc (h *Handle) Value() Value {\n\tn := (*Node)(atomic.LoadPointer(&h.n))\n\tif n != nil {\n\t\treturn n.value\n\t}\n\treturn nil\n}\n\n// Release releases this 'cache handle'.\n// It is safe to call release multiple times.\nfunc (h *Handle) Release() {\n\tnPtr := atomic.LoadPointer(&h.n)\n\tif nPtr != nil && atomic.CompareAndSwapPointer(&h.n, nPtr, nil) {\n\t\tn := (*Node)(nPtr)\n\t\tn.unrefLocked()\n\t}\n}\n\nfunc murmur32(ns, key uint64, seed uint32) uint32 {\n\tconst (\n\t\tm = uint32(0x5bd1e995)\n\t\tr = 24\n\t)\n\n\tk1 := uint32(ns >> 32)\n\tk2 := uint32(ns)\n\tk3 := uint32(key >> 32)\n\tk4 := uint32(key)\n\n\tk1 *= m\n\tk1 ^= k1 >> r\n\tk1 *= m\n\n\tk2 *= m\n\tk2 ^= k2 >> r\n\tk2 *= m\n\n\tk3 *= m\n\tk3 ^= k3 >> r\n\tk3 *= m\n\n\tk4 *= m\n\tk4 ^= k4 >> r\n\tk4 *= m\n\n\th := seed\n\n\th *= m\n\th ^= k1\n\th *= m\n\th ^= k2\n\th *= m\n\th ^= k3\n\th *= m\n\th ^= k4\n\n\th ^= h >> 13\n\th *= m\n\th ^= h >> 15\n\n\treturn h\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/cache/lru.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage cache\n\nimport (\n\t\"sync\"\n\t\"unsafe\"\n)\n\ntype lruNode struct {\n\tn   *Node\n\th   *Handle\n\tban bool\n\n\tnext, prev *lruNode\n}\n\nfunc (n *lruNode) insert(at *lruNode) {\n\tx := at.next\n\tat.next = n\n\tn.prev = at\n\tn.next = x\n\tx.prev = n\n}\n\nfunc (n *lruNode) remove() {\n\tif n.prev != nil {\n\t\tn.prev.next = n.next\n\t\tn.next.prev = n.prev\n\t\tn.prev = nil\n\t\tn.next = nil\n\t} else {\n\t\tpanic(\"BUG: removing removed node\")\n\t}\n}\n\ntype lru struct {\n\tmu       sync.Mutex\n\tcapacity int\n\tused     int\n\trecent   lruNode\n}\n\nfunc (r *lru) reset() {\n\tr.recent.next = &r.recent\n\tr.recent.prev = &r.recent\n\tr.used = 0\n}\n\nfunc (r *lru) Capacity() int {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\treturn r.capacity\n}\n\nfunc (r *lru) SetCapacity(capacity int) {\n\tvar evicted []*lruNode\n\n\tr.mu.Lock()\n\tr.capacity = capacity\n\tfor r.used > r.capacity {\n\t\trn := r.recent.prev\n\t\tif rn == nil {\n\t\t\tpanic(\"BUG: invalid LRU used or capacity counter\")\n\t\t}\n\t\trn.remove()\n\t\trn.n.CacheData = nil\n\t\tr.used -= rn.n.Size()\n\t\tevicted = append(evicted, rn)\n\t}\n\tr.mu.Unlock()\n\n\tfor _, rn := range evicted {\n\t\trn.h.Release()\n\t}\n}\n\nfunc (r *lru) Promote(n *Node) {\n\tvar evicted []*lruNode\n\n\tr.mu.Lock()\n\tif n.CacheData == nil {\n\t\tif n.Size() <= r.capacity {\n\t\t\trn := &lruNode{n: n, h: n.GetHandle()}\n\t\t\trn.insert(&r.recent)\n\t\t\tn.CacheData = unsafe.Pointer(rn)\n\t\t\tr.used += n.Size()\n\n\t\t\tfor r.used > r.capacity {\n\t\t\t\trn := r.recent.prev\n\t\t\t\tif rn == nil {\n\t\t\t\t\tpanic(\"BUG: invalid LRU used or capacity counter\")\n\t\t\t\t}\n\t\t\t\trn.remove()\n\t\t\t\trn.n.CacheData = nil\n\t\t\t\tr.used -= rn.n.Size()\n\t\t\t\tevicted = append(evicted, rn)\n\t\t\t}\n\t\t}\n\t} else {\n\t\trn := (*lruNode)(n.CacheData)\n\t\tif !rn.ban {\n\t\t\trn.remove()\n\t\t\trn.insert(&r.recent)\n\t\t}\n\t}\n\tr.mu.Unlock()\n\n\tfor _, rn := range evicted {\n\t\trn.h.Release()\n\t}\n}\n\nfunc (r *lru) Ban(n *Node) {\n\tr.mu.Lock()\n\tif n.CacheData == nil {\n\t\tn.CacheData = unsafe.Pointer(&lruNode{n: n, ban: true})\n\t} else {\n\t\trn := (*lruNode)(n.CacheData)\n\t\tif !rn.ban {\n\t\t\trn.remove()\n\t\t\trn.ban = true\n\t\t\tr.used -= rn.n.Size()\n\t\t\tr.mu.Unlock()\n\n\t\t\trn.h.Release()\n\t\t\trn.h = nil\n\t\t\treturn\n\t\t}\n\t}\n\tr.mu.Unlock()\n}\n\nfunc (r *lru) Evict(n *Node) {\n\tr.mu.Lock()\n\trn := (*lruNode)(n.CacheData)\n\tif rn == nil || rn.ban {\n\t\tr.mu.Unlock()\n\t\treturn\n\t}\n\tn.CacheData = nil\n\tr.mu.Unlock()\n\n\trn.h.Release()\n}\n\nfunc (r *lru) EvictNS(ns uint64) {\n\tvar evicted []*lruNode\n\n\tr.mu.Lock()\n\tfor e := r.recent.prev; e != &r.recent; {\n\t\trn := e\n\t\te = e.prev\n\t\tif rn.n.NS() == ns {\n\t\t\trn.remove()\n\t\t\trn.n.CacheData = nil\n\t\t\tr.used -= rn.n.Size()\n\t\t\tevicted = append(evicted, rn)\n\t\t}\n\t}\n\tr.mu.Unlock()\n\n\tfor _, rn := range evicted {\n\t\trn.h.Release()\n\t}\n}\n\nfunc (r *lru) EvictAll() {\n\tr.mu.Lock()\n\tback := r.recent.prev\n\tfor rn := back; rn != &r.recent; rn = rn.prev {\n\t\trn.n.CacheData = nil\n\t}\n\tr.reset()\n\tr.mu.Unlock()\n\n\tfor rn := back; rn != &r.recent; rn = rn.prev {\n\t\trn.h.Release()\n\t}\n}\n\nfunc (r *lru) Close() error {\n\treturn nil\n}\n\n// NewLRU create a new LRU-cache.\nfunc NewLRU(capacity int) Cacher {\n\tr := &lru{capacity: capacity}\n\tr.reset()\n\treturn r\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage comparer\n\nimport \"bytes\"\n\ntype bytesComparer struct{}\n\nfunc (bytesComparer) Compare(a, b []byte) int {\n\treturn bytes.Compare(a, b)\n}\n\nfunc (bytesComparer) Name() string {\n\treturn \"leveldb.BytewiseComparator\"\n}\n\nfunc (bytesComparer) Separator(dst, a, b []byte) []byte {\n\ti, n := 0, len(a)\n\tif n > len(b) {\n\t\tn = len(b)\n\t}\n\tfor ; i < n && a[i] == b[i]; i++ {\n\t}\n\tif i >= n {\n\t\t// Do not shorten if one string is a prefix of the other\n\t} else if c := a[i]; c < 0xff && c+1 < b[i] {\n\t\tdst = append(dst, a[:i+1]...)\n\t\tdst[i]++\n\t\treturn dst\n\t}\n\treturn nil\n}\n\nfunc (bytesComparer) Successor(dst, b []byte) []byte {\n\tfor i, c := range b {\n\t\tif c != 0xff {\n\t\t\tdst = append(dst, b[:i+1]...)\n\t\t\tdst[i]++\n\t\t\treturn dst\n\t\t}\n\t}\n\treturn nil\n}\n\n// DefaultComparer are default implementation of the Comparer interface.\n// It uses the natural ordering, consistent with bytes.Compare.\nvar DefaultComparer = bytesComparer{}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package comparer provides interface and implementation for ordering\n// sets of data.\npackage comparer\n\n// BasicComparer is the interface that wraps the basic Compare method.\ntype BasicComparer interface {\n\t// Compare returns -1, 0, or +1 depending on whether a is 'less than',\n\t// 'equal to' or 'greater than' b. The two arguments can only be 'equal'\n\t// if their contents are exactly equal. Furthermore, the empty slice\n\t// must be 'less than' any non-empty slice.\n\tCompare(a, b []byte) int\n}\n\n// Comparer defines a total ordering over the space of []byte keys: a 'less\n// than' relationship.\ntype Comparer interface {\n\tBasicComparer\n\n\t// Name returns name of the comparer.\n\t//\n\t// The Level-DB on-disk format stores the comparer name, and opening a\n\t// database with a different comparer from the one it was created with\n\t// will result in an error.\n\t//\n\t// An implementation to a new name whenever the comparer implementation\n\t// changes in a way that will cause the relative ordering of any two keys\n\t// to change.\n\t//\n\t// Names starting with \"leveldb.\" are reserved and should not be used\n\t// by any users of this package.\n\tName() string\n\n\t// Bellow are advanced functions used used to reduce the space requirements\n\t// for internal data structures such as index blocks.\n\n\t// Separator appends a sequence of bytes x to dst such that a <= x && x < b,\n\t// where 'less than' is consistent with Compare. An implementation should\n\t// return nil if x equal to a.\n\t//\n\t// Either contents of a or b should not by any means modified. Doing so\n\t// may cause corruption on the internal state.\n\tSeparator(dst, a, b []byte) []byte\n\n\t// Successor appends a sequence of bytes x to dst such that x >= b, where\n\t// 'less than' is consistent with Compare. An implementation should return\n\t// nil if x equal to b.\n\t//\n\t// Contents of b should not by any means modified. Doing so may cause\n\t// corruption on the internal state.\n\tSuccessor(dst, b []byte) []byte\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/comparer.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/comparer\"\n)\n\ntype iComparer struct {\n\tucmp comparer.Comparer\n}\n\nfunc (icmp *iComparer) uName() string {\n\treturn icmp.ucmp.Name()\n}\n\nfunc (icmp *iComparer) uCompare(a, b []byte) int {\n\treturn icmp.ucmp.Compare(a, b)\n}\n\nfunc (icmp *iComparer) uSeparator(dst, a, b []byte) []byte {\n\treturn icmp.ucmp.Separator(dst, a, b)\n}\n\nfunc (icmp *iComparer) uSuccessor(dst, b []byte) []byte {\n\treturn icmp.ucmp.Successor(dst, b)\n}\n\nfunc (icmp *iComparer) Name() string {\n\treturn icmp.uName()\n}\n\nfunc (icmp *iComparer) Compare(a, b []byte) int {\n\tx := icmp.uCompare(internalKey(a).ukey(), internalKey(b).ukey())\n\tif x == 0 {\n\t\tif m, n := internalKey(a).num(), internalKey(b).num(); m > n {\n\t\t\treturn -1\n\t\t} else if m < n {\n\t\t\treturn 1\n\t\t}\n\t}\n\treturn x\n}\n\nfunc (icmp *iComparer) Separator(dst, a, b []byte) []byte {\n\tua, ub := internalKey(a).ukey(), internalKey(b).ukey()\n\tdst = icmp.uSeparator(dst, ua, ub)\n\tif dst != nil && len(dst) < len(ua) && icmp.uCompare(ua, dst) < 0 {\n\t\t// Append earliest possible number.\n\t\treturn append(dst, keyMaxNumBytes...)\n\t}\n\treturn nil\n}\n\nfunc (icmp *iComparer) Successor(dst, b []byte) []byte {\n\tub := internalKey(b).ukey()\n\tdst = icmp.uSuccessor(dst, ub)\n\tif dst != nil && len(dst) < len(ub) && icmp.uCompare(ub, dst) < 0 {\n\t\t// Append earliest possible number.\n\t\treturn append(dst, keyMaxNumBytes...)\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"container/list\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"runtime\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/journal\"\n\t\"github.com/syndtr/goleveldb/leveldb/memdb\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/table\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// DB is a LevelDB database.\ntype DB struct {\n\t// Need 64-bit alignment.\n\tseq uint64\n\n\t// Stats. Need 64-bit alignment.\n\tcWriteDelay            int64 // The cumulative duration of write delays\n\tcWriteDelayN           int32 // The cumulative number of write delays\n\tinWritePaused          int32 // The indicator whether write operation is paused by compaction\n\taliveSnaps, aliveIters int32\n\n\t// Session.\n\ts *session\n\n\t// MemDB.\n\tmemMu           sync.RWMutex\n\tmemPool         chan *memdb.DB\n\tmem, frozenMem  *memDB\n\tjournal         *journal.Writer\n\tjournalWriter   storage.Writer\n\tjournalFd       storage.FileDesc\n\tfrozenJournalFd storage.FileDesc\n\tfrozenSeq       uint64\n\n\t// Snapshot.\n\tsnapsMu   sync.Mutex\n\tsnapsList *list.List\n\n\t// Write.\n\tbatchPool    sync.Pool\n\twriteMergeC  chan writeMerge\n\twriteMergedC chan bool\n\twriteLockC   chan struct{}\n\twriteAckC    chan error\n\twriteDelay   time.Duration\n\twriteDelayN  int\n\ttr           *Transaction\n\n\t// Compaction.\n\tcompCommitLk     sync.Mutex\n\ttcompCmdC        chan cCmd\n\ttcompPauseC      chan chan<- struct{}\n\tmcompCmdC        chan cCmd\n\tcompErrC         chan error\n\tcompPerErrC      chan error\n\tcompErrSetC      chan error\n\tcompWriteLocking bool\n\tcompStats        cStats\n\tmemdbMaxLevel    int // For testing.\n\n\t// Close.\n\tcloseW sync.WaitGroup\n\tcloseC chan struct{}\n\tclosed uint32\n\tcloser io.Closer\n}\n\nfunc openDB(s *session) (*DB, error) {\n\ts.log(\"db@open opening\")\n\tstart := time.Now()\n\tdb := &DB{\n\t\ts: s,\n\t\t// Initial sequence\n\t\tseq: s.stSeqNum,\n\t\t// MemDB\n\t\tmemPool: make(chan *memdb.DB, 1),\n\t\t// Snapshot\n\t\tsnapsList: list.New(),\n\t\t// Write\n\t\tbatchPool:    sync.Pool{New: newBatch},\n\t\twriteMergeC:  make(chan writeMerge),\n\t\twriteMergedC: make(chan bool),\n\t\twriteLockC:   make(chan struct{}, 1),\n\t\twriteAckC:    make(chan error),\n\t\t// Compaction\n\t\ttcompCmdC:   make(chan cCmd),\n\t\ttcompPauseC: make(chan chan<- struct{}),\n\t\tmcompCmdC:   make(chan cCmd),\n\t\tcompErrC:    make(chan error),\n\t\tcompPerErrC: make(chan error),\n\t\tcompErrSetC: make(chan error),\n\t\t// Close\n\t\tcloseC: make(chan struct{}),\n\t}\n\n\t// Read-only mode.\n\treadOnly := s.o.GetReadOnly()\n\n\tif readOnly {\n\t\t// Recover journals (read-only mode).\n\t\tif err := db.recoverJournalRO(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\t// Recover journals.\n\t\tif err := db.recoverJournal(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Remove any obsolete files.\n\t\tif err := db.checkAndCleanFiles(); err != nil {\n\t\t\t// Close journal.\n\t\t\tif db.journal != nil {\n\t\t\t\tdb.journal.Close()\n\t\t\t\tdb.journalWriter.Close()\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\n\t}\n\n\t// Doesn't need to be included in the wait group.\n\tgo db.compactionError()\n\tgo db.mpoolDrain()\n\n\tif readOnly {\n\t\tdb.SetReadOnly()\n\t} else {\n\t\tdb.closeW.Add(2)\n\t\tgo db.tCompaction()\n\t\tgo db.mCompaction()\n\t\t// go db.jWriter()\n\t}\n\n\ts.logf(\"db@open done T·%v\", time.Since(start))\n\n\truntime.SetFinalizer(db, (*DB).Close)\n\treturn db, nil\n}\n\n// Open opens or creates a DB for the given storage.\n// The DB will be created if not exist, unless ErrorIfMissing is true.\n// Also, if ErrorIfExist is true and the DB exist Open will returns\n// os.ErrExist error.\n//\n// Open will return an error with type of ErrCorrupted if corruption\n// detected in the DB. Use errors.IsCorrupted to test whether an error is\n// due to corruption. Corrupted DB can be recovered with Recover function.\n//\n// The returned DB instance is safe for concurrent use.\n// The DB must be closed after use, by calling Close method.\nfunc Open(stor storage.Storage, o *opt.Options) (db *DB, err error) {\n\ts, err := newSession(stor, o)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ts.close()\n\t\t\ts.release()\n\t\t}\n\t}()\n\n\terr = s.recover()\n\tif err != nil {\n\t\tif !os.IsNotExist(err) || s.o.GetErrorIfMissing() {\n\t\t\treturn\n\t\t}\n\t\terr = s.create()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t} else if s.o.GetErrorIfExist() {\n\t\terr = os.ErrExist\n\t\treturn\n\t}\n\n\treturn openDB(s)\n}\n\n// OpenFile opens or creates a DB for the given path.\n// The DB will be created if not exist, unless ErrorIfMissing is true.\n// Also, if ErrorIfExist is true and the DB exist OpenFile will returns\n// os.ErrExist error.\n//\n// OpenFile uses standard file-system backed storage implementation as\n// described in the leveldb/storage package.\n//\n// OpenFile will return an error with type of ErrCorrupted if corruption\n// detected in the DB. Use errors.IsCorrupted to test whether an error is\n// due to corruption. Corrupted DB can be recovered with Recover function.\n//\n// The returned DB instance is safe for concurrent use.\n// The DB must be closed after use, by calling Close method.\nfunc OpenFile(path string, o *opt.Options) (db *DB, err error) {\n\tstor, err := storage.OpenFile(path, o.GetReadOnly())\n\tif err != nil {\n\t\treturn\n\t}\n\tdb, err = Open(stor, o)\n\tif err != nil {\n\t\tstor.Close()\n\t} else {\n\t\tdb.closer = stor\n\t}\n\treturn\n}\n\n// Recover recovers and opens a DB with missing or corrupted manifest files\n// for the given storage. It will ignore any manifest files, valid or not.\n// The DB must already exist or it will returns an error.\n// Also, Recover will ignore ErrorIfMissing and ErrorIfExist options.\n//\n// The returned DB instance is safe for concurrent use.\n// The DB must be closed after use, by calling Close method.\nfunc Recover(stor storage.Storage, o *opt.Options) (db *DB, err error) {\n\ts, err := newSession(stor, o)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ts.close()\n\t\t\ts.release()\n\t\t}\n\t}()\n\n\terr = recoverTable(s, o)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn openDB(s)\n}\n\n// RecoverFile recovers and opens a DB with missing or corrupted manifest files\n// for the given path. It will ignore any manifest files, valid or not.\n// The DB must already exist or it will returns an error.\n// Also, Recover will ignore ErrorIfMissing and ErrorIfExist options.\n//\n// RecoverFile uses standard file-system backed storage implementation as described\n// in the leveldb/storage package.\n//\n// The returned DB instance is safe for concurrent use.\n// The DB must be closed after use, by calling Close method.\nfunc RecoverFile(path string, o *opt.Options) (db *DB, err error) {\n\tstor, err := storage.OpenFile(path, false)\n\tif err != nil {\n\t\treturn\n\t}\n\tdb, err = Recover(stor, o)\n\tif err != nil {\n\t\tstor.Close()\n\t} else {\n\t\tdb.closer = stor\n\t}\n\treturn\n}\n\nfunc recoverTable(s *session, o *opt.Options) error {\n\to = dupOptions(o)\n\t// Mask StrictReader, lets StrictRecovery doing its job.\n\to.Strict &= ^opt.StrictReader\n\n\t// Get all tables and sort it by file number.\n\tfds, err := s.stor.List(storage.TypeTable)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsortFds(fds)\n\n\tvar (\n\t\tmaxSeq                                                            uint64\n\t\trecoveredKey, goodKey, corruptedKey, corruptedBlock, droppedTable int\n\n\t\t// We will drop corrupted table.\n\t\tstrict = o.GetStrict(opt.StrictRecovery)\n\t\tnoSync = o.GetNoSync()\n\n\t\trec   = &sessionRecord{}\n\t\tbpool = util.NewBufferPool(o.GetBlockSize() + 5)\n\t)\n\tbuildTable := func(iter iterator.Iterator) (tmpFd storage.FileDesc, size int64, err error) {\n\t\ttmpFd = s.newTemp()\n\t\twriter, err := s.stor.Create(tmpFd)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tdefer func() {\n\t\t\twriter.Close()\n\t\t\tif err != nil {\n\t\t\t\ts.stor.Remove(tmpFd)\n\t\t\t\ttmpFd = storage.FileDesc{}\n\t\t\t}\n\t\t}()\n\n\t\t// Copy entries.\n\t\ttw := table.NewWriter(writer, o)\n\t\tfor iter.Next() {\n\t\t\tkey := iter.Key()\n\t\t\tif validInternalKey(key) {\n\t\t\t\terr = tw.Append(key, iter.Value())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\terr = iter.Error()\n\t\tif err != nil && !errors.IsCorrupted(err) {\n\t\t\treturn\n\t\t}\n\t\terr = tw.Close()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif !noSync {\n\t\t\terr = writer.Sync()\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tsize = int64(tw.BytesLen())\n\t\treturn\n\t}\n\trecoverTable := func(fd storage.FileDesc) error {\n\t\ts.logf(\"table@recovery recovering @%d\", fd.Num)\n\t\treader, err := s.stor.Open(fd)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvar closed bool\n\t\tdefer func() {\n\t\t\tif !closed {\n\t\t\t\treader.Close()\n\t\t\t}\n\t\t}()\n\n\t\t// Get file size.\n\t\tsize, err := reader.Seek(0, 2)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tvar (\n\t\t\ttSeq                                     uint64\n\t\t\ttgoodKey, tcorruptedKey, tcorruptedBlock int\n\t\t\timin, imax                               []byte\n\t\t)\n\t\ttr, err := table.NewReader(reader, size, fd, nil, bpool, o)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\titer := tr.NewIterator(nil, nil)\n\t\tif itererr, ok := iter.(iterator.ErrorCallbackSetter); ok {\n\t\t\titererr.SetErrorCallback(func(err error) {\n\t\t\t\tif errors.IsCorrupted(err) {\n\t\t\t\t\ts.logf(\"table@recovery block corruption @%d %q\", fd.Num, err)\n\t\t\t\t\ttcorruptedBlock++\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\t// Scan the table.\n\t\tfor iter.Next() {\n\t\t\tkey := iter.Key()\n\t\t\t_, seq, _, kerr := parseInternalKey(key)\n\t\t\tif kerr != nil {\n\t\t\t\ttcorruptedKey++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ttgoodKey++\n\t\t\tif seq > tSeq {\n\t\t\t\ttSeq = seq\n\t\t\t}\n\t\t\tif imin == nil {\n\t\t\t\timin = append([]byte{}, key...)\n\t\t\t}\n\t\t\timax = append(imax[:0], key...)\n\t\t}\n\t\tif err := iter.Error(); err != nil && !errors.IsCorrupted(err) {\n\t\t\titer.Release()\n\t\t\treturn err\n\t\t}\n\t\titer.Release()\n\n\t\tgoodKey += tgoodKey\n\t\tcorruptedKey += tcorruptedKey\n\t\tcorruptedBlock += tcorruptedBlock\n\n\t\tif strict && (tcorruptedKey > 0 || tcorruptedBlock > 0) {\n\t\t\tdroppedTable++\n\t\t\ts.logf(\"table@recovery dropped @%d Gk·%d Ck·%d Cb·%d S·%d Q·%d\", fd.Num, tgoodKey, tcorruptedKey, tcorruptedBlock, size, tSeq)\n\t\t\treturn nil\n\t\t}\n\n\t\tif tgoodKey > 0 {\n\t\t\tif tcorruptedKey > 0 || tcorruptedBlock > 0 {\n\t\t\t\t// Rebuild the table.\n\t\t\t\ts.logf(\"table@recovery rebuilding @%d\", fd.Num)\n\t\t\t\titer := tr.NewIterator(nil, nil)\n\t\t\t\ttmpFd, newSize, err := buildTable(iter)\n\t\t\t\titer.Release()\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tclosed = true\n\t\t\t\treader.Close()\n\t\t\t\tif err := s.stor.Rename(tmpFd, fd); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tsize = newSize\n\t\t\t}\n\t\t\tif tSeq > maxSeq {\n\t\t\t\tmaxSeq = tSeq\n\t\t\t}\n\t\t\trecoveredKey += tgoodKey\n\t\t\t// Add table to level 0.\n\t\t\trec.addTable(0, fd.Num, size, imin, imax)\n\t\t\ts.logf(\"table@recovery recovered @%d Gk·%d Ck·%d Cb·%d S·%d Q·%d\", fd.Num, tgoodKey, tcorruptedKey, tcorruptedBlock, size, tSeq)\n\t\t} else {\n\t\t\tdroppedTable++\n\t\t\ts.logf(\"table@recovery unrecoverable @%d Ck·%d Cb·%d S·%d\", fd.Num, tcorruptedKey, tcorruptedBlock, size)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t// Recover all tables.\n\tif len(fds) > 0 {\n\t\ts.logf(\"table@recovery F·%d\", len(fds))\n\n\t\t// Mark file number as used.\n\t\ts.markFileNum(fds[len(fds)-1].Num)\n\n\t\tfor _, fd := range fds {\n\t\t\tif err := recoverTable(fd); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\ts.logf(\"table@recovery recovered F·%d N·%d Gk·%d Ck·%d Q·%d\", len(fds), recoveredKey, goodKey, corruptedKey, maxSeq)\n\t}\n\n\t// Set sequence number.\n\trec.setSeqNum(maxSeq)\n\n\t// Create new manifest.\n\tif err := s.create(); err != nil {\n\t\treturn err\n\t}\n\n\t// Commit.\n\treturn s.commit(rec)\n}\n\nfunc (db *DB) recoverJournal() error {\n\t// Get all journals and sort it by file number.\n\trawFds, err := db.s.stor.List(storage.TypeJournal)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsortFds(rawFds)\n\n\t// Journals that will be recovered.\n\tvar fds []storage.FileDesc\n\tfor _, fd := range rawFds {\n\t\tif fd.Num >= db.s.stJournalNum || fd.Num == db.s.stPrevJournalNum {\n\t\t\tfds = append(fds, fd)\n\t\t}\n\t}\n\n\tvar (\n\t\tofd storage.FileDesc // Obsolete file.\n\t\trec = &sessionRecord{}\n\t)\n\n\t// Recover journals.\n\tif len(fds) > 0 {\n\t\tdb.logf(\"journal@recovery F·%d\", len(fds))\n\n\t\t// Mark file number as used.\n\t\tdb.s.markFileNum(fds[len(fds)-1].Num)\n\n\t\tvar (\n\t\t\t// Options.\n\t\t\tstrict      = db.s.o.GetStrict(opt.StrictJournal)\n\t\t\tchecksum    = db.s.o.GetStrict(opt.StrictJournalChecksum)\n\t\t\twriteBuffer = db.s.o.GetWriteBuffer()\n\n\t\t\tjr       *journal.Reader\n\t\t\tmdb      = memdb.New(db.s.icmp, writeBuffer)\n\t\t\tbuf      = &util.Buffer{}\n\t\t\tbatchSeq uint64\n\t\t\tbatchLen int\n\t\t)\n\n\t\tfor _, fd := range fds {\n\t\t\tdb.logf(\"journal@recovery recovering @%d\", fd.Num)\n\n\t\t\tfr, err := db.s.stor.Open(fd)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Create or reset journal reader instance.\n\t\t\tif jr == nil {\n\t\t\t\tjr = journal.NewReader(fr, dropper{db.s, fd}, strict, checksum)\n\t\t\t} else {\n\t\t\t\tjr.Reset(fr, dropper{db.s, fd}, strict, checksum)\n\t\t\t}\n\n\t\t\t// Flush memdb and remove obsolete journal file.\n\t\t\tif !ofd.Zero() {\n\t\t\t\tif mdb.Len() > 0 {\n\t\t\t\t\tif _, err := db.s.flushMemdb(rec, mdb, 0); err != nil {\n\t\t\t\t\t\tfr.Close()\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trec.setJournalNum(fd.Num)\n\t\t\t\trec.setSeqNum(db.seq)\n\t\t\t\tif err := db.s.commit(rec); err != nil {\n\t\t\t\t\tfr.Close()\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\trec.resetAddedTables()\n\n\t\t\t\tdb.s.stor.Remove(ofd)\n\t\t\t\tofd = storage.FileDesc{}\n\t\t\t}\n\n\t\t\t// Replay journal to memdb.\n\t\t\tmdb.Reset()\n\t\t\tfor {\n\t\t\t\tr, err := jr.Next()\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err == io.EOF {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\n\t\t\t\t\tfr.Close()\n\t\t\t\t\treturn errors.SetFd(err, fd)\n\t\t\t\t}\n\n\t\t\t\tbuf.Reset()\n\t\t\t\tif _, err := buf.ReadFrom(r); err != nil {\n\t\t\t\t\tif err == io.ErrUnexpectedEOF {\n\t\t\t\t\t\t// This is error returned due to corruption, with strict == false.\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tfr.Close()\n\t\t\t\t\treturn errors.SetFd(err, fd)\n\t\t\t\t}\n\t\t\t\tbatchSeq, batchLen, err = decodeBatchToMem(buf.Bytes(), db.seq, mdb)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif !strict && errors.IsCorrupted(err) {\n\t\t\t\t\t\tdb.s.logf(\"journal error: %v (skipped)\", err)\n\t\t\t\t\t\t// We won't apply sequence number as it might be corrupted.\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tfr.Close()\n\t\t\t\t\treturn errors.SetFd(err, fd)\n\t\t\t\t}\n\n\t\t\t\t// Save sequence number.\n\t\t\t\tdb.seq = batchSeq + uint64(batchLen)\n\n\t\t\t\t// Flush it if large enough.\n\t\t\t\tif mdb.Size() >= writeBuffer {\n\t\t\t\t\tif _, err := db.s.flushMemdb(rec, mdb, 0); err != nil {\n\t\t\t\t\t\tfr.Close()\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\n\t\t\t\t\tmdb.Reset()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfr.Close()\n\t\t\tofd = fd\n\t\t}\n\n\t\t// Flush the last memdb.\n\t\tif mdb.Len() > 0 {\n\t\t\tif _, err := db.s.flushMemdb(rec, mdb, 0); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create a new journal.\n\tif _, err := db.newMem(0); err != nil {\n\t\treturn err\n\t}\n\n\t// Commit.\n\trec.setJournalNum(db.journalFd.Num)\n\trec.setSeqNum(db.seq)\n\tif err := db.s.commit(rec); err != nil {\n\t\t// Close journal on error.\n\t\tif db.journal != nil {\n\t\t\tdb.journal.Close()\n\t\t\tdb.journalWriter.Close()\n\t\t}\n\t\treturn err\n\t}\n\n\t// Remove the last obsolete journal file.\n\tif !ofd.Zero() {\n\t\tdb.s.stor.Remove(ofd)\n\t}\n\n\treturn nil\n}\n\nfunc (db *DB) recoverJournalRO() error {\n\t// Get all journals and sort it by file number.\n\trawFds, err := db.s.stor.List(storage.TypeJournal)\n\tif err != nil {\n\t\treturn err\n\t}\n\tsortFds(rawFds)\n\n\t// Journals that will be recovered.\n\tvar fds []storage.FileDesc\n\tfor _, fd := range rawFds {\n\t\tif fd.Num >= db.s.stJournalNum || fd.Num == db.s.stPrevJournalNum {\n\t\t\tfds = append(fds, fd)\n\t\t}\n\t}\n\n\tvar (\n\t\t// Options.\n\t\tstrict      = db.s.o.GetStrict(opt.StrictJournal)\n\t\tchecksum    = db.s.o.GetStrict(opt.StrictJournalChecksum)\n\t\twriteBuffer = db.s.o.GetWriteBuffer()\n\n\t\tmdb = memdb.New(db.s.icmp, writeBuffer)\n\t)\n\n\t// Recover journals.\n\tif len(fds) > 0 {\n\t\tdb.logf(\"journal@recovery RO·Mode F·%d\", len(fds))\n\n\t\tvar (\n\t\t\tjr       *journal.Reader\n\t\t\tbuf      = &util.Buffer{}\n\t\t\tbatchSeq uint64\n\t\t\tbatchLen int\n\t\t)\n\n\t\tfor _, fd := range fds {\n\t\t\tdb.logf(\"journal@recovery recovering @%d\", fd.Num)\n\n\t\t\tfr, err := db.s.stor.Open(fd)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Create or reset journal reader instance.\n\t\t\tif jr == nil {\n\t\t\t\tjr = journal.NewReader(fr, dropper{db.s, fd}, strict, checksum)\n\t\t\t} else {\n\t\t\t\tjr.Reset(fr, dropper{db.s, fd}, strict, checksum)\n\t\t\t}\n\n\t\t\t// Replay journal to memdb.\n\t\t\tfor {\n\t\t\t\tr, err := jr.Next()\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err == io.EOF {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\n\t\t\t\t\tfr.Close()\n\t\t\t\t\treturn errors.SetFd(err, fd)\n\t\t\t\t}\n\n\t\t\t\tbuf.Reset()\n\t\t\t\tif _, err := buf.ReadFrom(r); err != nil {\n\t\t\t\t\tif err == io.ErrUnexpectedEOF {\n\t\t\t\t\t\t// This is error returned due to corruption, with strict == false.\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tfr.Close()\n\t\t\t\t\treturn errors.SetFd(err, fd)\n\t\t\t\t}\n\t\t\t\tbatchSeq, batchLen, err = decodeBatchToMem(buf.Bytes(), db.seq, mdb)\n\t\t\t\tif err != nil {\n\t\t\t\t\tif !strict && errors.IsCorrupted(err) {\n\t\t\t\t\t\tdb.s.logf(\"journal error: %v (skipped)\", err)\n\t\t\t\t\t\t// We won't apply sequence number as it might be corrupted.\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\n\t\t\t\t\tfr.Close()\n\t\t\t\t\treturn errors.SetFd(err, fd)\n\t\t\t\t}\n\n\t\t\t\t// Save sequence number.\n\t\t\t\tdb.seq = batchSeq + uint64(batchLen)\n\t\t\t}\n\n\t\t\tfr.Close()\n\t\t}\n\t}\n\n\t// Set memDB.\n\tdb.mem = &memDB{db: db, DB: mdb, ref: 1}\n\n\treturn nil\n}\n\nfunc memGet(mdb *memdb.DB, ikey internalKey, icmp *iComparer) (ok bool, mv []byte, err error) {\n\tmk, mv, err := mdb.Find(ikey)\n\tif err == nil {\n\t\tukey, _, kt, kerr := parseInternalKey(mk)\n\t\tif kerr != nil {\n\t\t\t// Shouldn't have had happen.\n\t\t\tpanic(kerr)\n\t\t}\n\t\tif icmp.uCompare(ukey, ikey.ukey()) == 0 {\n\t\t\tif kt == keyTypeDel {\n\t\t\t\treturn true, nil, ErrNotFound\n\t\t\t}\n\t\t\treturn true, mv, nil\n\n\t\t}\n\t} else if err != ErrNotFound {\n\t\treturn true, nil, err\n\t}\n\treturn\n}\n\nfunc (db *DB) get(auxm *memdb.DB, auxt tFiles, key []byte, seq uint64, ro *opt.ReadOptions) (value []byte, err error) {\n\tikey := makeInternalKey(nil, key, seq, keyTypeSeek)\n\n\tif auxm != nil {\n\t\tif ok, mv, me := memGet(auxm, ikey, db.s.icmp); ok {\n\t\t\treturn append([]byte{}, mv...), me\n\t\t}\n\t}\n\n\tem, fm := db.getMems()\n\tfor _, m := range [...]*memDB{em, fm} {\n\t\tif m == nil {\n\t\t\tcontinue\n\t\t}\n\t\tdefer m.decref()\n\n\t\tif ok, mv, me := memGet(m.DB, ikey, db.s.icmp); ok {\n\t\t\treturn append([]byte{}, mv...), me\n\t\t}\n\t}\n\n\tv := db.s.version()\n\tvalue, cSched, err := v.get(auxt, ikey, ro, false)\n\tv.release()\n\tif cSched {\n\t\t// Trigger table compaction.\n\t\tdb.compTrigger(db.tcompCmdC)\n\t}\n\treturn\n}\n\nfunc nilIfNotFound(err error) error {\n\tif err == ErrNotFound {\n\t\treturn nil\n\t}\n\treturn err\n}\n\nfunc (db *DB) has(auxm *memdb.DB, auxt tFiles, key []byte, seq uint64, ro *opt.ReadOptions) (ret bool, err error) {\n\tikey := makeInternalKey(nil, key, seq, keyTypeSeek)\n\n\tif auxm != nil {\n\t\tif ok, _, me := memGet(auxm, ikey, db.s.icmp); ok {\n\t\t\treturn me == nil, nilIfNotFound(me)\n\t\t}\n\t}\n\n\tem, fm := db.getMems()\n\tfor _, m := range [...]*memDB{em, fm} {\n\t\tif m == nil {\n\t\t\tcontinue\n\t\t}\n\t\tdefer m.decref()\n\n\t\tif ok, _, me := memGet(m.DB, ikey, db.s.icmp); ok {\n\t\t\treturn me == nil, nilIfNotFound(me)\n\t\t}\n\t}\n\n\tv := db.s.version()\n\t_, cSched, err := v.get(auxt, ikey, ro, true)\n\tv.release()\n\tif cSched {\n\t\t// Trigger table compaction.\n\t\tdb.compTrigger(db.tcompCmdC)\n\t}\n\tif err == nil {\n\t\tret = true\n\t} else if err == ErrNotFound {\n\t\terr = nil\n\t}\n\treturn\n}\n\n// Get gets the value for the given key. It returns ErrNotFound if the\n// DB does not contains the key.\n//\n// The returned slice is its own copy, it is safe to modify the contents\n// of the returned slice.\n// It is safe to modify the contents of the argument after Get returns.\nfunc (db *DB) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {\n\terr = db.ok()\n\tif err != nil {\n\t\treturn\n\t}\n\n\tse := db.acquireSnapshot()\n\tdefer db.releaseSnapshot(se)\n\treturn db.get(nil, nil, key, se.seq, ro)\n}\n\n// Has returns true if the DB does contains the given key.\n//\n// It is safe to modify the contents of the argument after Has returns.\nfunc (db *DB) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) {\n\terr = db.ok()\n\tif err != nil {\n\t\treturn\n\t}\n\n\tse := db.acquireSnapshot()\n\tdefer db.releaseSnapshot(se)\n\treturn db.has(nil, nil, key, se.seq, ro)\n}\n\n// NewIterator returns an iterator for the latest snapshot of the\n// underlying DB.\n// The returned iterator is not safe for concurrent use, but it is safe to use\n// multiple iterators concurrently, with each in a dedicated goroutine.\n// It is also safe to use an iterator concurrently with modifying its\n// underlying DB. The resultant key/value pairs are guaranteed to be\n// consistent.\n//\n// Slice allows slicing the iterator to only contains keys in the given\n// range. A nil Range.Start is treated as a key before all keys in the\n// DB. And a nil Range.Limit is treated as a key after all keys in\n// the DB.\n//\n// The iterator must be released after use, by calling Release method.\n//\n// Also read Iterator documentation of the leveldb/iterator package.\nfunc (db *DB) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {\n\tif err := db.ok(); err != nil {\n\t\treturn iterator.NewEmptyIterator(err)\n\t}\n\n\tse := db.acquireSnapshot()\n\tdefer db.releaseSnapshot(se)\n\t// Iterator holds 'version' lock, 'version' is immutable so snapshot\n\t// can be released after iterator created.\n\treturn db.newIterator(nil, nil, se.seq, slice, ro)\n}\n\n// GetSnapshot returns a latest snapshot of the underlying DB. A snapshot\n// is a frozen snapshot of a DB state at a particular point in time. The\n// content of snapshot are guaranteed to be consistent.\n//\n// The snapshot must be released after use, by calling Release method.\nfunc (db *DB) GetSnapshot() (*Snapshot, error) {\n\tif err := db.ok(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn db.newSnapshot(), nil\n}\n\n// GetProperty returns value of the given property name.\n//\n// Property names:\n//\tleveldb.num-files-at-level{n}\n//\t\tReturns the number of files at level 'n'.\n//\tleveldb.stats\n//\t\tReturns statistics of the underlying DB.\n//\tleveldb.iostats\n//\t\tReturns statistics of effective disk read and write.\n//\tleveldb.writedelay\n//\t\tReturns cumulative write delay caused by compaction.\n//\tleveldb.sstables\n//\t\tReturns sstables list for each level.\n//\tleveldb.blockpool\n//\t\tReturns block pool stats.\n//\tleveldb.cachedblock\n//\t\tReturns size of cached block.\n//\tleveldb.openedtables\n//\t\tReturns number of opened tables.\n//\tleveldb.alivesnaps\n//\t\tReturns number of alive snapshots.\n//\tleveldb.aliveiters\n//\t\tReturns number of alive iterators.\nfunc (db *DB) GetProperty(name string) (value string, err error) {\n\terr = db.ok()\n\tif err != nil {\n\t\treturn\n\t}\n\n\tconst prefix = \"leveldb.\"\n\tif !strings.HasPrefix(name, prefix) {\n\t\treturn \"\", ErrNotFound\n\t}\n\tp := name[len(prefix):]\n\n\tv := db.s.version()\n\tdefer v.release()\n\n\tnumFilesPrefix := \"num-files-at-level\"\n\tswitch {\n\tcase strings.HasPrefix(p, numFilesPrefix):\n\t\tvar level uint\n\t\tvar rest string\n\t\tn, _ := fmt.Sscanf(p[len(numFilesPrefix):], \"%d%s\", &level, &rest)\n\t\tif n != 1 {\n\t\t\terr = ErrNotFound\n\t\t} else {\n\t\t\tvalue = fmt.Sprint(v.tLen(int(level)))\n\t\t}\n\tcase p == \"stats\":\n\t\tvalue = \"Compactions\\n\" +\n\t\t\t\" Level |   Tables   |    Size(MB)   |    Time(sec)  |    Read(MB)   |   Write(MB)\\n\" +\n\t\t\t\"-------+------------+---------------+---------------+---------------+---------------\\n\"\n\t\tfor level, tables := range v.levels {\n\t\t\tduration, read, write := db.compStats.getStat(level)\n\t\t\tif len(tables) == 0 && duration == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvalue += fmt.Sprintf(\" %3d   | %10d | %13.5f | %13.5f | %13.5f | %13.5f\\n\",\n\t\t\t\tlevel, len(tables), float64(tables.size())/1048576.0, duration.Seconds(),\n\t\t\t\tfloat64(read)/1048576.0, float64(write)/1048576.0)\n\t\t}\n\tcase p == \"iostats\":\n\t\tvalue = fmt.Sprintf(\"Read(MB):%.5f Write(MB):%.5f\",\n\t\t\tfloat64(db.s.stor.reads())/1048576.0,\n\t\t\tfloat64(db.s.stor.writes())/1048576.0)\n\tcase p == \"writedelay\":\n\t\twriteDelayN, writeDelay := atomic.LoadInt32(&db.cWriteDelayN), time.Duration(atomic.LoadInt64(&db.cWriteDelay))\n\t\tpaused := atomic.LoadInt32(&db.inWritePaused) == 1\n\t\tvalue = fmt.Sprintf(\"DelayN:%d Delay:%s Paused:%t\", writeDelayN, writeDelay, paused)\n\tcase p == \"sstables\":\n\t\tfor level, tables := range v.levels {\n\t\t\tvalue += fmt.Sprintf(\"--- level %d ---\\n\", level)\n\t\t\tfor _, t := range tables {\n\t\t\t\tvalue += fmt.Sprintf(\"%d:%d[%q .. %q]\\n\", t.fd.Num, t.size, t.imin, t.imax)\n\t\t\t}\n\t\t}\n\tcase p == \"blockpool\":\n\t\tvalue = fmt.Sprintf(\"%v\", db.s.tops.bpool)\n\tcase p == \"cachedblock\":\n\t\tif db.s.tops.bcache != nil {\n\t\t\tvalue = fmt.Sprintf(\"%d\", db.s.tops.bcache.Size())\n\t\t} else {\n\t\t\tvalue = \"<nil>\"\n\t\t}\n\tcase p == \"openedtables\":\n\t\tvalue = fmt.Sprintf(\"%d\", db.s.tops.cache.Size())\n\tcase p == \"alivesnaps\":\n\t\tvalue = fmt.Sprintf(\"%d\", atomic.LoadInt32(&db.aliveSnaps))\n\tcase p == \"aliveiters\":\n\t\tvalue = fmt.Sprintf(\"%d\", atomic.LoadInt32(&db.aliveIters))\n\tdefault:\n\t\terr = ErrNotFound\n\t}\n\n\treturn\n}\n\n// DBStats is database statistics.\ntype DBStats struct {\n\tWriteDelayCount    int32\n\tWriteDelayDuration time.Duration\n\tWritePaused        bool\n\n\tAliveSnapshots int32\n\tAliveIterators int32\n\n\tIOWrite uint64\n\tIORead  uint64\n\n\tBlockCacheSize    int\n\tOpenedTablesCount int\n\n\tLevelSizes        []int64\n\tLevelTablesCounts []int\n\tLevelRead         []int64\n\tLevelWrite        []int64\n\tLevelDurations    []time.Duration\n}\n\n// Stats populates s with database statistics.\nfunc (db *DB) Stats(s *DBStats) error {\n\terr := db.ok()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ts.IORead = db.s.stor.reads()\n\ts.IOWrite = db.s.stor.writes()\n\ts.WriteDelayCount = atomic.LoadInt32(&db.cWriteDelayN)\n\ts.WriteDelayDuration = time.Duration(atomic.LoadInt64(&db.cWriteDelay))\n\ts.WritePaused = atomic.LoadInt32(&db.inWritePaused) == 1\n\n\ts.OpenedTablesCount = db.s.tops.cache.Size()\n\tif db.s.tops.bcache != nil {\n\t\ts.BlockCacheSize = db.s.tops.bcache.Size()\n\t} else {\n\t\ts.BlockCacheSize = 0\n\t}\n\n\ts.AliveIterators = atomic.LoadInt32(&db.aliveIters)\n\ts.AliveSnapshots = atomic.LoadInt32(&db.aliveSnaps)\n\n\ts.LevelDurations = s.LevelDurations[:0]\n\ts.LevelRead = s.LevelRead[:0]\n\ts.LevelWrite = s.LevelWrite[:0]\n\ts.LevelSizes = s.LevelSizes[:0]\n\ts.LevelTablesCounts = s.LevelTablesCounts[:0]\n\n\tv := db.s.version()\n\tdefer v.release()\n\n\tfor level, tables := range v.levels {\n\t\tduration, read, write := db.compStats.getStat(level)\n\t\tif len(tables) == 0 && duration == 0 {\n\t\t\tcontinue\n\t\t}\n\t\ts.LevelDurations = append(s.LevelDurations, duration)\n\t\ts.LevelRead = append(s.LevelRead, read)\n\t\ts.LevelWrite = append(s.LevelWrite, write)\n\t\ts.LevelSizes = append(s.LevelSizes, tables.size())\n\t\ts.LevelTablesCounts = append(s.LevelTablesCounts, len(tables))\n\t}\n\n\treturn nil\n}\n\n// SizeOf calculates approximate sizes of the given key ranges.\n// The length of the returned sizes are equal with the length of the given\n// ranges. The returned sizes measure storage space usage, so if the user\n// data compresses by a factor of ten, the returned sizes will be one-tenth\n// the size of the corresponding user data size.\n// The results may not include the sizes of recently written data.\nfunc (db *DB) SizeOf(ranges []util.Range) (Sizes, error) {\n\tif err := db.ok(); err != nil {\n\t\treturn nil, err\n\t}\n\n\tv := db.s.version()\n\tdefer v.release()\n\n\tsizes := make(Sizes, 0, len(ranges))\n\tfor _, r := range ranges {\n\t\timin := makeInternalKey(nil, r.Start, keyMaxSeq, keyTypeSeek)\n\t\timax := makeInternalKey(nil, r.Limit, keyMaxSeq, keyTypeSeek)\n\t\tstart, err := v.offsetOf(imin)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tlimit, err := v.offsetOf(imax)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tvar size int64\n\t\tif limit >= start {\n\t\t\tsize = limit - start\n\t\t}\n\t\tsizes = append(sizes, size)\n\t}\n\n\treturn sizes, nil\n}\n\n// Close closes the DB. This will also releases any outstanding snapshot,\n// abort any in-flight compaction and discard open transaction.\n//\n// It is not safe to close a DB until all outstanding iterators are released.\n// It is valid to call Close multiple times. Other methods should not be\n// called after the DB has been closed.\nfunc (db *DB) Close() error {\n\tif !db.setClosed() {\n\t\treturn ErrClosed\n\t}\n\n\tstart := time.Now()\n\tdb.log(\"db@close closing\")\n\n\t// Clear the finalizer.\n\truntime.SetFinalizer(db, nil)\n\n\t// Get compaction error.\n\tvar err error\n\tselect {\n\tcase err = <-db.compErrC:\n\t\tif err == ErrReadOnly {\n\t\t\terr = nil\n\t\t}\n\tdefault:\n\t}\n\n\t// Signal all goroutines.\n\tclose(db.closeC)\n\n\t// Discard open transaction.\n\tif db.tr != nil {\n\t\tdb.tr.Discard()\n\t}\n\n\t// Acquire writer lock.\n\tdb.writeLockC <- struct{}{}\n\n\t// Wait for all gorotines to exit.\n\tdb.closeW.Wait()\n\n\t// Closes journal.\n\tif db.journal != nil {\n\t\tdb.journal.Close()\n\t\tdb.journalWriter.Close()\n\t\tdb.journal = nil\n\t\tdb.journalWriter = nil\n\t}\n\n\tif db.writeDelayN > 0 {\n\t\tdb.logf(\"db@write was delayed N·%d T·%v\", db.writeDelayN, db.writeDelay)\n\t}\n\n\t// Close session.\n\tdb.s.close()\n\tdb.logf(\"db@close done T·%v\", time.Since(start))\n\tdb.s.release()\n\n\tif db.closer != nil {\n\t\tif err1 := db.closer.Close(); err == nil {\n\t\t\terr = err1\n\t\t}\n\t\tdb.closer = nil\n\t}\n\n\t// Clear memdbs.\n\tdb.clearMems()\n\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\nvar (\n\terrCompactionTransactExiting = errors.New(\"leveldb: compaction transact exiting\")\n)\n\ntype cStat struct {\n\tduration time.Duration\n\tread     int64\n\twrite    int64\n}\n\nfunc (p *cStat) add(n *cStatStaging) {\n\tp.duration += n.duration\n\tp.read += n.read\n\tp.write += n.write\n}\n\nfunc (p *cStat) get() (duration time.Duration, read, write int64) {\n\treturn p.duration, p.read, p.write\n}\n\ntype cStatStaging struct {\n\tstart    time.Time\n\tduration time.Duration\n\ton       bool\n\tread     int64\n\twrite    int64\n}\n\nfunc (p *cStatStaging) startTimer() {\n\tif !p.on {\n\t\tp.start = time.Now()\n\t\tp.on = true\n\t}\n}\n\nfunc (p *cStatStaging) stopTimer() {\n\tif p.on {\n\t\tp.duration += time.Since(p.start)\n\t\tp.on = false\n\t}\n}\n\ntype cStats struct {\n\tlk    sync.Mutex\n\tstats []cStat\n}\n\nfunc (p *cStats) addStat(level int, n *cStatStaging) {\n\tp.lk.Lock()\n\tif level >= len(p.stats) {\n\t\tnewStats := make([]cStat, level+1)\n\t\tcopy(newStats, p.stats)\n\t\tp.stats = newStats\n\t}\n\tp.stats[level].add(n)\n\tp.lk.Unlock()\n}\n\nfunc (p *cStats) getStat(level int) (duration time.Duration, read, write int64) {\n\tp.lk.Lock()\n\tdefer p.lk.Unlock()\n\tif level < len(p.stats) {\n\t\treturn p.stats[level].get()\n\t}\n\treturn\n}\n\nfunc (db *DB) compactionError() {\n\tvar err error\nnoerr:\n\t// No error.\n\tfor {\n\t\tselect {\n\t\tcase err = <-db.compErrSetC:\n\t\t\tswitch {\n\t\t\tcase err == nil:\n\t\t\tcase err == ErrReadOnly, errors.IsCorrupted(err):\n\t\t\t\tgoto hasperr\n\t\t\tdefault:\n\t\t\t\tgoto haserr\n\t\t\t}\n\t\tcase <-db.closeC:\n\t\t\treturn\n\t\t}\n\t}\nhaserr:\n\t// Transient error.\n\tfor {\n\t\tselect {\n\t\tcase db.compErrC <- err:\n\t\tcase err = <-db.compErrSetC:\n\t\t\tswitch {\n\t\t\tcase err == nil:\n\t\t\t\tgoto noerr\n\t\t\tcase err == ErrReadOnly, errors.IsCorrupted(err):\n\t\t\t\tgoto hasperr\n\t\t\tdefault:\n\t\t\t}\n\t\tcase <-db.closeC:\n\t\t\treturn\n\t\t}\n\t}\nhasperr:\n\t// Persistent error.\n\tfor {\n\t\tselect {\n\t\tcase db.compErrC <- err:\n\t\tcase db.compPerErrC <- err:\n\t\tcase db.writeLockC <- struct{}{}:\n\t\t\t// Hold write lock, so that write won't pass-through.\n\t\t\tdb.compWriteLocking = true\n\t\tcase <-db.closeC:\n\t\t\tif db.compWriteLocking {\n\t\t\t\t// We should release the lock or Close will hang.\n\t\t\t\t<-db.writeLockC\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n}\n\ntype compactionTransactCounter int\n\nfunc (cnt *compactionTransactCounter) incr() {\n\t*cnt++\n}\n\ntype compactionTransactInterface interface {\n\trun(cnt *compactionTransactCounter) error\n\trevert() error\n}\n\nfunc (db *DB) compactionTransact(name string, t compactionTransactInterface) {\n\tdefer func() {\n\t\tif x := recover(); x != nil {\n\t\t\tif x == errCompactionTransactExiting {\n\t\t\t\tif err := t.revert(); err != nil {\n\t\t\t\t\tdb.logf(\"%s revert error %q\", name, err)\n\t\t\t\t}\n\t\t\t}\n\t\t\tpanic(x)\n\t\t}\n\t}()\n\n\tconst (\n\t\tbackoffMin = 1 * time.Second\n\t\tbackoffMax = 8 * time.Second\n\t\tbackoffMul = 2 * time.Second\n\t)\n\tvar (\n\t\tbackoff  = backoffMin\n\t\tbackoffT = time.NewTimer(backoff)\n\t\tlastCnt  = compactionTransactCounter(0)\n\n\t\tdisableBackoff = db.s.o.GetDisableCompactionBackoff()\n\t)\n\tfor n := 0; ; n++ {\n\t\t// Check whether the DB is closed.\n\t\tif db.isClosed() {\n\t\t\tdb.logf(\"%s exiting\", name)\n\t\t\tdb.compactionExitTransact()\n\t\t} else if n > 0 {\n\t\t\tdb.logf(\"%s retrying N·%d\", name, n)\n\t\t}\n\n\t\t// Execute.\n\t\tcnt := compactionTransactCounter(0)\n\t\terr := t.run(&cnt)\n\t\tif err != nil {\n\t\t\tdb.logf(\"%s error I·%d %q\", name, cnt, err)\n\t\t}\n\n\t\t// Set compaction error status.\n\t\tselect {\n\t\tcase db.compErrSetC <- err:\n\t\tcase perr := <-db.compPerErrC:\n\t\t\tif err != nil {\n\t\t\t\tdb.logf(\"%s exiting (persistent error %q)\", name, perr)\n\t\t\t\tdb.compactionExitTransact()\n\t\t\t}\n\t\tcase <-db.closeC:\n\t\t\tdb.logf(\"%s exiting\", name)\n\t\t\tdb.compactionExitTransact()\n\t\t}\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\t\tif errors.IsCorrupted(err) {\n\t\t\tdb.logf(\"%s exiting (corruption detected)\", name)\n\t\t\tdb.compactionExitTransact()\n\t\t}\n\n\t\tif !disableBackoff {\n\t\t\t// Reset backoff duration if counter is advancing.\n\t\t\tif cnt > lastCnt {\n\t\t\t\tbackoff = backoffMin\n\t\t\t\tlastCnt = cnt\n\t\t\t}\n\n\t\t\t// Backoff.\n\t\t\tbackoffT.Reset(backoff)\n\t\t\tif backoff < backoffMax {\n\t\t\t\tbackoff *= backoffMul\n\t\t\t\tif backoff > backoffMax {\n\t\t\t\t\tbackoff = backoffMax\n\t\t\t\t}\n\t\t\t}\n\t\t\tselect {\n\t\t\tcase <-backoffT.C:\n\t\t\tcase <-db.closeC:\n\t\t\t\tdb.logf(\"%s exiting\", name)\n\t\t\t\tdb.compactionExitTransact()\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype compactionTransactFunc struct {\n\trunFunc    func(cnt *compactionTransactCounter) error\n\trevertFunc func() error\n}\n\nfunc (t *compactionTransactFunc) run(cnt *compactionTransactCounter) error {\n\treturn t.runFunc(cnt)\n}\n\nfunc (t *compactionTransactFunc) revert() error {\n\tif t.revertFunc != nil {\n\t\treturn t.revertFunc()\n\t}\n\treturn nil\n}\n\nfunc (db *DB) compactionTransactFunc(name string, run func(cnt *compactionTransactCounter) error, revert func() error) {\n\tdb.compactionTransact(name, &compactionTransactFunc{run, revert})\n}\n\nfunc (db *DB) compactionExitTransact() {\n\tpanic(errCompactionTransactExiting)\n}\n\nfunc (db *DB) compactionCommit(name string, rec *sessionRecord) {\n\tdb.compCommitLk.Lock()\n\tdefer db.compCommitLk.Unlock() // Defer is necessary.\n\tdb.compactionTransactFunc(name+\"@commit\", func(cnt *compactionTransactCounter) error {\n\t\treturn db.s.commit(rec)\n\t}, nil)\n}\n\nfunc (db *DB) memCompaction() {\n\tmdb := db.getFrozenMem()\n\tif mdb == nil {\n\t\treturn\n\t}\n\tdefer mdb.decref()\n\n\tdb.logf(\"memdb@flush N·%d S·%s\", mdb.Len(), shortenb(mdb.Size()))\n\n\t// Don't compact empty memdb.\n\tif mdb.Len() == 0 {\n\t\tdb.logf(\"memdb@flush skipping\")\n\t\t// drop frozen memdb\n\t\tdb.dropFrozenMem()\n\t\treturn\n\t}\n\n\t// Pause table compaction.\n\tresumeC := make(chan struct{})\n\tselect {\n\tcase db.tcompPauseC <- (chan<- struct{})(resumeC):\n\tcase <-db.compPerErrC:\n\t\tclose(resumeC)\n\t\tresumeC = nil\n\tcase <-db.closeC:\n\t\tdb.compactionExitTransact()\n\t}\n\n\tvar (\n\t\trec        = &sessionRecord{}\n\t\tstats      = &cStatStaging{}\n\t\tflushLevel int\n\t)\n\n\t// Generate tables.\n\tdb.compactionTransactFunc(\"memdb@flush\", func(cnt *compactionTransactCounter) (err error) {\n\t\tstats.startTimer()\n\t\tflushLevel, err = db.s.flushMemdb(rec, mdb.DB, db.memdbMaxLevel)\n\t\tstats.stopTimer()\n\t\treturn\n\t}, func() error {\n\t\tfor _, r := range rec.addedTables {\n\t\t\tdb.logf(\"memdb@flush revert @%d\", r.num)\n\t\t\tif err := db.s.stor.Remove(storage.FileDesc{Type: storage.TypeTable, Num: r.num}); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t})\n\n\trec.setJournalNum(db.journalFd.Num)\n\trec.setSeqNum(db.frozenSeq)\n\n\t// Commit.\n\tstats.startTimer()\n\tdb.compactionCommit(\"memdb\", rec)\n\tstats.stopTimer()\n\n\tdb.logf(\"memdb@flush committed F·%d T·%v\", len(rec.addedTables), stats.duration)\n\n\tfor _, r := range rec.addedTables {\n\t\tstats.write += r.size\n\t}\n\tdb.compStats.addStat(flushLevel, stats)\n\n\t// Drop frozen memdb.\n\tdb.dropFrozenMem()\n\n\t// Resume table compaction.\n\tif resumeC != nil {\n\t\tselect {\n\t\tcase <-resumeC:\n\t\t\tclose(resumeC)\n\t\tcase <-db.closeC:\n\t\t\tdb.compactionExitTransact()\n\t\t}\n\t}\n\n\t// Trigger table compaction.\n\tdb.compTrigger(db.tcompCmdC)\n}\n\ntype tableCompactionBuilder struct {\n\tdb           *DB\n\ts            *session\n\tc            *compaction\n\trec          *sessionRecord\n\tstat0, stat1 *cStatStaging\n\n\tsnapHasLastUkey bool\n\tsnapLastUkey    []byte\n\tsnapLastSeq     uint64\n\tsnapIter        int\n\tsnapKerrCnt     int\n\tsnapDropCnt     int\n\n\tkerrCnt int\n\tdropCnt int\n\n\tminSeq    uint64\n\tstrict    bool\n\ttableSize int\n\n\ttw *tWriter\n}\n\nfunc (b *tableCompactionBuilder) appendKV(key, value []byte) error {\n\t// Create new table if not already.\n\tif b.tw == nil {\n\t\t// Check for pause event.\n\t\tif b.db != nil {\n\t\t\tselect {\n\t\t\tcase ch := <-b.db.tcompPauseC:\n\t\t\t\tb.db.pauseCompaction(ch)\n\t\t\tcase <-b.db.closeC:\n\t\t\t\tb.db.compactionExitTransact()\n\t\t\tdefault:\n\t\t\t}\n\t\t}\n\n\t\t// Create new table.\n\t\tvar err error\n\t\tb.tw, err = b.s.tops.create()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Write key/value into table.\n\treturn b.tw.append(key, value)\n}\n\nfunc (b *tableCompactionBuilder) needFlush() bool {\n\treturn b.tw.tw.BytesLen() >= b.tableSize\n}\n\nfunc (b *tableCompactionBuilder) flush() error {\n\tt, err := b.tw.finish()\n\tif err != nil {\n\t\treturn err\n\t}\n\tb.rec.addTableFile(b.c.sourceLevel+1, t)\n\tb.stat1.write += t.size\n\tb.s.logf(\"table@build created L%d@%d N·%d S·%s %q:%q\", b.c.sourceLevel+1, t.fd.Num, b.tw.tw.EntriesLen(), shortenb(int(t.size)), t.imin, t.imax)\n\tb.tw = nil\n\treturn nil\n}\n\nfunc (b *tableCompactionBuilder) cleanup() {\n\tif b.tw != nil {\n\t\tb.tw.drop()\n\t\tb.tw = nil\n\t}\n}\n\nfunc (b *tableCompactionBuilder) run(cnt *compactionTransactCounter) error {\n\tsnapResumed := b.snapIter > 0\n\thasLastUkey := b.snapHasLastUkey // The key might has zero length, so this is necessary.\n\tlastUkey := append([]byte{}, b.snapLastUkey...)\n\tlastSeq := b.snapLastSeq\n\tb.kerrCnt = b.snapKerrCnt\n\tb.dropCnt = b.snapDropCnt\n\t// Restore compaction state.\n\tb.c.restore()\n\n\tdefer b.cleanup()\n\n\tb.stat1.startTimer()\n\tdefer b.stat1.stopTimer()\n\n\titer := b.c.newIterator()\n\tdefer iter.Release()\n\tfor i := 0; iter.Next(); i++ {\n\t\t// Incr transact counter.\n\t\tcnt.incr()\n\n\t\t// Skip until last state.\n\t\tif i < b.snapIter {\n\t\t\tcontinue\n\t\t}\n\n\t\tresumed := false\n\t\tif snapResumed {\n\t\t\tresumed = true\n\t\t\tsnapResumed = false\n\t\t}\n\n\t\tikey := iter.Key()\n\t\tukey, seq, kt, kerr := parseInternalKey(ikey)\n\n\t\tif kerr == nil {\n\t\t\tshouldStop := !resumed && b.c.shouldStopBefore(ikey)\n\n\t\t\tif !hasLastUkey || b.s.icmp.uCompare(lastUkey, ukey) != 0 {\n\t\t\t\t// First occurrence of this user key.\n\n\t\t\t\t// Only rotate tables if ukey doesn't hop across.\n\t\t\t\tif b.tw != nil && (shouldStop || b.needFlush()) {\n\t\t\t\t\tif err := b.flush(); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\n\t\t\t\t\t// Creates snapshot of the state.\n\t\t\t\t\tb.c.save()\n\t\t\t\t\tb.snapHasLastUkey = hasLastUkey\n\t\t\t\t\tb.snapLastUkey = append(b.snapLastUkey[:0], lastUkey...)\n\t\t\t\t\tb.snapLastSeq = lastSeq\n\t\t\t\t\tb.snapIter = i\n\t\t\t\t\tb.snapKerrCnt = b.kerrCnt\n\t\t\t\t\tb.snapDropCnt = b.dropCnt\n\t\t\t\t}\n\n\t\t\t\thasLastUkey = true\n\t\t\t\tlastUkey = append(lastUkey[:0], ukey...)\n\t\t\t\tlastSeq = keyMaxSeq\n\t\t\t}\n\n\t\t\tswitch {\n\t\t\tcase lastSeq <= b.minSeq:\n\t\t\t\t// Dropped because newer entry for same user key exist\n\t\t\t\tfallthrough // (A)\n\t\t\tcase kt == keyTypeDel && seq <= b.minSeq && b.c.baseLevelForKey(lastUkey):\n\t\t\t\t// For this user key:\n\t\t\t\t// (1) there is no data in higher levels\n\t\t\t\t// (2) data in lower levels will have larger seq numbers\n\t\t\t\t// (3) data in layers that are being compacted here and have\n\t\t\t\t//     smaller seq numbers will be dropped in the next\n\t\t\t\t//     few iterations of this loop (by rule (A) above).\n\t\t\t\t// Therefore this deletion marker is obsolete and can be dropped.\n\t\t\t\tlastSeq = seq\n\t\t\t\tb.dropCnt++\n\t\t\t\tcontinue\n\t\t\tdefault:\n\t\t\t\tlastSeq = seq\n\t\t\t}\n\t\t} else {\n\t\t\tif b.strict {\n\t\t\t\treturn kerr\n\t\t\t}\n\n\t\t\t// Don't drop corrupted keys.\n\t\t\thasLastUkey = false\n\t\t\tlastUkey = lastUkey[:0]\n\t\t\tlastSeq = keyMaxSeq\n\t\t\tb.kerrCnt++\n\t\t}\n\n\t\tif err := b.appendKV(ikey, iter.Value()); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif err := iter.Error(); err != nil {\n\t\treturn err\n\t}\n\n\t// Finish last table.\n\tif b.tw != nil && !b.tw.empty() {\n\t\treturn b.flush()\n\t}\n\treturn nil\n}\n\nfunc (b *tableCompactionBuilder) revert() error {\n\tfor _, at := range b.rec.addedTables {\n\t\tb.s.logf(\"table@build revert @%d\", at.num)\n\t\tif err := b.s.stor.Remove(storage.FileDesc{Type: storage.TypeTable, Num: at.num}); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (db *DB) tableCompaction(c *compaction, noTrivial bool) {\n\tdefer c.release()\n\n\trec := &sessionRecord{}\n\trec.addCompPtr(c.sourceLevel, c.imax)\n\n\tif !noTrivial && c.trivial() {\n\t\tt := c.levels[0][0]\n\t\tdb.logf(\"table@move L%d@%d -> L%d\", c.sourceLevel, t.fd.Num, c.sourceLevel+1)\n\t\trec.delTable(c.sourceLevel, t.fd.Num)\n\t\trec.addTableFile(c.sourceLevel+1, t)\n\t\tdb.compactionCommit(\"table-move\", rec)\n\t\treturn\n\t}\n\n\tvar stats [2]cStatStaging\n\tfor i, tables := range c.levels {\n\t\tfor _, t := range tables {\n\t\t\tstats[i].read += t.size\n\t\t\t// Insert deleted tables into record\n\t\t\trec.delTable(c.sourceLevel+i, t.fd.Num)\n\t\t}\n\t}\n\tsourceSize := int(stats[0].read + stats[1].read)\n\tminSeq := db.minSeq()\n\tdb.logf(\"table@compaction L%d·%d -> L%d·%d S·%s Q·%d\", c.sourceLevel, len(c.levels[0]), c.sourceLevel+1, len(c.levels[1]), shortenb(sourceSize), minSeq)\n\n\tb := &tableCompactionBuilder{\n\t\tdb:        db,\n\t\ts:         db.s,\n\t\tc:         c,\n\t\trec:       rec,\n\t\tstat1:     &stats[1],\n\t\tminSeq:    minSeq,\n\t\tstrict:    db.s.o.GetStrict(opt.StrictCompaction),\n\t\ttableSize: db.s.o.GetCompactionTableSize(c.sourceLevel + 1),\n\t}\n\tdb.compactionTransact(\"table@build\", b)\n\n\t// Commit.\n\tstats[1].startTimer()\n\tdb.compactionCommit(\"table\", rec)\n\tstats[1].stopTimer()\n\n\tresultSize := int(stats[1].write)\n\tdb.logf(\"table@compaction committed F%s S%s Ke·%d D·%d T·%v\", sint(len(rec.addedTables)-len(rec.deletedTables)), sshortenb(resultSize-sourceSize), b.kerrCnt, b.dropCnt, stats[1].duration)\n\n\t// Save compaction stats\n\tfor i := range stats {\n\t\tdb.compStats.addStat(c.sourceLevel+1, &stats[i])\n\t}\n}\n\nfunc (db *DB) tableRangeCompaction(level int, umin, umax []byte) error {\n\tdb.logf(\"table@compaction range L%d %q:%q\", level, umin, umax)\n\tif level >= 0 {\n\t\tif c := db.s.getCompactionRange(level, umin, umax, true); c != nil {\n\t\t\tdb.tableCompaction(c, true)\n\t\t}\n\t} else {\n\t\t// Retry until nothing to compact.\n\t\tfor {\n\t\t\tcompacted := false\n\n\t\t\t// Scan for maximum level with overlapped tables.\n\t\t\tv := db.s.version()\n\t\t\tm := 1\n\t\t\tfor i := m; i < len(v.levels); i++ {\n\t\t\t\ttables := v.levels[i]\n\t\t\t\tif tables.overlaps(db.s.icmp, umin, umax, false) {\n\t\t\t\t\tm = i\n\t\t\t\t}\n\t\t\t}\n\t\t\tv.release()\n\n\t\t\tfor level := 0; level < m; level++ {\n\t\t\t\tif c := db.s.getCompactionRange(level, umin, umax, false); c != nil {\n\t\t\t\t\tdb.tableCompaction(c, true)\n\t\t\t\t\tcompacted = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif !compacted {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (db *DB) tableAutoCompaction() {\n\tif c := db.s.pickCompaction(); c != nil {\n\t\tdb.tableCompaction(c, false)\n\t}\n}\n\nfunc (db *DB) tableNeedCompaction() bool {\n\tv := db.s.version()\n\tdefer v.release()\n\treturn v.needCompaction()\n}\n\n// resumeWrite returns an indicator whether we should resume write operation if enough level0 files are compacted.\nfunc (db *DB) resumeWrite() bool {\n\tv := db.s.version()\n\tdefer v.release()\n\tif v.tLen(0) < db.s.o.GetWriteL0PauseTrigger() {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (db *DB) pauseCompaction(ch chan<- struct{}) {\n\tselect {\n\tcase ch <- struct{}{}:\n\tcase <-db.closeC:\n\t\tdb.compactionExitTransact()\n\t}\n}\n\ntype cCmd interface {\n\tack(err error)\n}\n\ntype cAuto struct {\n\t// Note for table compaction, an empty ackC represents it's a compaction waiting command.\n\tackC chan<- error\n}\n\nfunc (r cAuto) ack(err error) {\n\tif r.ackC != nil {\n\t\tdefer func() {\n\t\t\trecover()\n\t\t}()\n\t\tr.ackC <- err\n\t}\n}\n\ntype cRange struct {\n\tlevel    int\n\tmin, max []byte\n\tackC     chan<- error\n}\n\nfunc (r cRange) ack(err error) {\n\tif r.ackC != nil {\n\t\tdefer func() {\n\t\t\trecover()\n\t\t}()\n\t\tr.ackC <- err\n\t}\n}\n\n// This will trigger auto compaction but will not wait for it.\nfunc (db *DB) compTrigger(compC chan<- cCmd) {\n\tselect {\n\tcase compC <- cAuto{}:\n\tdefault:\n\t}\n}\n\n// This will trigger auto compaction and/or wait for all compaction to be done.\nfunc (db *DB) compTriggerWait(compC chan<- cCmd) (err error) {\n\tch := make(chan error)\n\tdefer close(ch)\n\t// Send cmd.\n\tselect {\n\tcase compC <- cAuto{ch}:\n\tcase err = <-db.compErrC:\n\t\treturn\n\tcase <-db.closeC:\n\t\treturn ErrClosed\n\t}\n\t// Wait cmd.\n\tselect {\n\tcase err = <-ch:\n\tcase err = <-db.compErrC:\n\tcase <-db.closeC:\n\t\treturn ErrClosed\n\t}\n\treturn err\n}\n\n// Send range compaction request.\nfunc (db *DB) compTriggerRange(compC chan<- cCmd, level int, min, max []byte) (err error) {\n\tch := make(chan error)\n\tdefer close(ch)\n\t// Send cmd.\n\tselect {\n\tcase compC <- cRange{level, min, max, ch}:\n\tcase err := <-db.compErrC:\n\t\treturn err\n\tcase <-db.closeC:\n\t\treturn ErrClosed\n\t}\n\t// Wait cmd.\n\tselect {\n\tcase err = <-ch:\n\tcase err = <-db.compErrC:\n\tcase <-db.closeC:\n\t\treturn ErrClosed\n\t}\n\treturn err\n}\n\nfunc (db *DB) mCompaction() {\n\tvar x cCmd\n\n\tdefer func() {\n\t\tif x := recover(); x != nil {\n\t\t\tif x != errCompactionTransactExiting {\n\t\t\t\tpanic(x)\n\t\t\t}\n\t\t}\n\t\tif x != nil {\n\t\t\tx.ack(ErrClosed)\n\t\t}\n\t\tdb.closeW.Done()\n\t}()\n\n\tfor {\n\t\tselect {\n\t\tcase x = <-db.mcompCmdC:\n\t\t\tswitch x.(type) {\n\t\t\tcase cAuto:\n\t\t\t\tdb.memCompaction()\n\t\t\t\tx.ack(nil)\n\t\t\t\tx = nil\n\t\t\tdefault:\n\t\t\t\tpanic(\"leveldb: unknown command\")\n\t\t\t}\n\t\tcase <-db.closeC:\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (db *DB) tCompaction() {\n\tvar (\n\t\tx           cCmd\n\t\tackQ, waitQ []cCmd\n\t)\n\n\tdefer func() {\n\t\tif x := recover(); x != nil {\n\t\t\tif x != errCompactionTransactExiting {\n\t\t\t\tpanic(x)\n\t\t\t}\n\t\t}\n\t\tfor i := range ackQ {\n\t\t\tackQ[i].ack(ErrClosed)\n\t\t\tackQ[i] = nil\n\t\t}\n\t\tfor i := range waitQ {\n\t\t\twaitQ[i].ack(ErrClosed)\n\t\t\twaitQ[i] = nil\n\t\t}\n\t\tif x != nil {\n\t\t\tx.ack(ErrClosed)\n\t\t}\n\t\tdb.closeW.Done()\n\t}()\n\n\tfor {\n\t\tif db.tableNeedCompaction() {\n\t\t\tselect {\n\t\t\tcase x = <-db.tcompCmdC:\n\t\t\tcase ch := <-db.tcompPauseC:\n\t\t\t\tdb.pauseCompaction(ch)\n\t\t\t\tcontinue\n\t\t\tcase <-db.closeC:\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t}\n\t\t\t// Resume write operation as soon as possible.\n\t\t\tif len(waitQ) > 0 && db.resumeWrite() {\n\t\t\t\tfor i := range waitQ {\n\t\t\t\t\twaitQ[i].ack(nil)\n\t\t\t\t\twaitQ[i] = nil\n\t\t\t\t}\n\t\t\t\twaitQ = waitQ[:0]\n\t\t\t}\n\t\t} else {\n\t\t\tfor i := range ackQ {\n\t\t\t\tackQ[i].ack(nil)\n\t\t\t\tackQ[i] = nil\n\t\t\t}\n\t\t\tackQ = ackQ[:0]\n\t\t\tfor i := range waitQ {\n\t\t\t\twaitQ[i].ack(nil)\n\t\t\t\twaitQ[i] = nil\n\t\t\t}\n\t\t\twaitQ = waitQ[:0]\n\t\t\tselect {\n\t\t\tcase x = <-db.tcompCmdC:\n\t\t\tcase ch := <-db.tcompPauseC:\n\t\t\t\tdb.pauseCompaction(ch)\n\t\t\t\tcontinue\n\t\t\tcase <-db.closeC:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif x != nil {\n\t\t\tswitch cmd := x.(type) {\n\t\t\tcase cAuto:\n\t\t\t\tif cmd.ackC != nil {\n\t\t\t\t\twaitQ = append(waitQ, x)\n\t\t\t\t} else {\n\t\t\t\t\tackQ = append(ackQ, x)\n\t\t\t\t}\n\t\t\tcase cRange:\n\t\t\t\tx.ack(db.tableRangeCompaction(cmd.level, cmd.min, cmd.max))\n\t\t\tdefault:\n\t\t\t\tpanic(\"leveldb: unknown command\")\n\t\t\t}\n\t\t\tx = nil\n\t\t}\n\t\tdb.tableAutoCompaction()\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db_iter.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"errors\"\n\t\"math/rand\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nvar (\n\terrInvalidInternalKey = errors.New(\"leveldb: Iterator: invalid internal key\")\n)\n\ntype memdbReleaser struct {\n\tonce sync.Once\n\tm    *memDB\n}\n\nfunc (mr *memdbReleaser) Release() {\n\tmr.once.Do(func() {\n\t\tmr.m.decref()\n\t})\n}\n\nfunc (db *DB) newRawIterator(auxm *memDB, auxt tFiles, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {\n\tstrict := opt.GetStrict(db.s.o.Options, ro, opt.StrictReader)\n\tem, fm := db.getMems()\n\tv := db.s.version()\n\n\ttableIts := v.getIterators(slice, ro)\n\tn := len(tableIts) + len(auxt) + 3\n\tits := make([]iterator.Iterator, 0, n)\n\n\tif auxm != nil {\n\t\tami := auxm.NewIterator(slice)\n\t\tami.SetReleaser(&memdbReleaser{m: auxm})\n\t\tits = append(its, ami)\n\t}\n\tfor _, t := range auxt {\n\t\tits = append(its, v.s.tops.newIterator(t, slice, ro))\n\t}\n\n\temi := em.NewIterator(slice)\n\temi.SetReleaser(&memdbReleaser{m: em})\n\tits = append(its, emi)\n\tif fm != nil {\n\t\tfmi := fm.NewIterator(slice)\n\t\tfmi.SetReleaser(&memdbReleaser{m: fm})\n\t\tits = append(its, fmi)\n\t}\n\tits = append(its, tableIts...)\n\tmi := iterator.NewMergedIterator(its, db.s.icmp, strict)\n\tmi.SetReleaser(&versionReleaser{v: v})\n\treturn mi\n}\n\nfunc (db *DB) newIterator(auxm *memDB, auxt tFiles, seq uint64, slice *util.Range, ro *opt.ReadOptions) *dbIter {\n\tvar islice *util.Range\n\tif slice != nil {\n\t\tislice = &util.Range{}\n\t\tif slice.Start != nil {\n\t\t\tislice.Start = makeInternalKey(nil, slice.Start, keyMaxSeq, keyTypeSeek)\n\t\t}\n\t\tif slice.Limit != nil {\n\t\t\tislice.Limit = makeInternalKey(nil, slice.Limit, keyMaxSeq, keyTypeSeek)\n\t\t}\n\t}\n\trawIter := db.newRawIterator(auxm, auxt, islice, ro)\n\titer := &dbIter{\n\t\tdb:     db,\n\t\ticmp:   db.s.icmp,\n\t\titer:   rawIter,\n\t\tseq:    seq,\n\t\tstrict: opt.GetStrict(db.s.o.Options, ro, opt.StrictReader),\n\t\tkey:    make([]byte, 0),\n\t\tvalue:  make([]byte, 0),\n\t}\n\tatomic.AddInt32(&db.aliveIters, 1)\n\truntime.SetFinalizer(iter, (*dbIter).Release)\n\treturn iter\n}\n\nfunc (db *DB) iterSamplingRate() int {\n\treturn rand.Intn(2 * db.s.o.GetIteratorSamplingRate())\n}\n\ntype dir int\n\nconst (\n\tdirReleased dir = iota - 1\n\tdirSOI\n\tdirEOI\n\tdirBackward\n\tdirForward\n)\n\n// dbIter represent an interator states over a database session.\ntype dbIter struct {\n\tdb     *DB\n\ticmp   *iComparer\n\titer   iterator.Iterator\n\tseq    uint64\n\tstrict bool\n\n\tsmaplingGap int\n\tdir         dir\n\tkey         []byte\n\tvalue       []byte\n\terr         error\n\treleaser    util.Releaser\n}\n\nfunc (i *dbIter) sampleSeek() {\n\tikey := i.iter.Key()\n\ti.smaplingGap -= len(ikey) + len(i.iter.Value())\n\tfor i.smaplingGap < 0 {\n\t\ti.smaplingGap += i.db.iterSamplingRate()\n\t\ti.db.sampleSeek(ikey)\n\t}\n}\n\nfunc (i *dbIter) setErr(err error) {\n\ti.err = err\n\ti.key = nil\n\ti.value = nil\n}\n\nfunc (i *dbIter) iterErr() {\n\tif err := i.iter.Error(); err != nil {\n\t\ti.setErr(err)\n\t}\n}\n\nfunc (i *dbIter) Valid() bool {\n\treturn i.err == nil && i.dir > dirEOI\n}\n\nfunc (i *dbIter) First() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.iter.First() {\n\t\ti.dir = dirSOI\n\t\treturn i.next()\n\t}\n\ti.dir = dirEOI\n\ti.iterErr()\n\treturn false\n}\n\nfunc (i *dbIter) Last() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.iter.Last() {\n\t\treturn i.prev()\n\t}\n\ti.dir = dirSOI\n\ti.iterErr()\n\treturn false\n}\n\nfunc (i *dbIter) Seek(key []byte) bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tikey := makeInternalKey(nil, key, i.seq, keyTypeSeek)\n\tif i.iter.Seek(ikey) {\n\t\ti.dir = dirSOI\n\t\treturn i.next()\n\t}\n\ti.dir = dirEOI\n\ti.iterErr()\n\treturn false\n}\n\nfunc (i *dbIter) next() bool {\n\tfor {\n\t\tif ukey, seq, kt, kerr := parseInternalKey(i.iter.Key()); kerr == nil {\n\t\t\ti.sampleSeek()\n\t\t\tif seq <= i.seq {\n\t\t\t\tswitch kt {\n\t\t\t\tcase keyTypeDel:\n\t\t\t\t\t// Skip deleted key.\n\t\t\t\t\ti.key = append(i.key[:0], ukey...)\n\t\t\t\t\ti.dir = dirForward\n\t\t\t\tcase keyTypeVal:\n\t\t\t\t\tif i.dir == dirSOI || i.icmp.uCompare(ukey, i.key) > 0 {\n\t\t\t\t\t\ti.key = append(i.key[:0], ukey...)\n\t\t\t\t\t\ti.value = append(i.value[:0], i.iter.Value()...)\n\t\t\t\t\t\ti.dir = dirForward\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if i.strict {\n\t\t\ti.setErr(kerr)\n\t\t\tbreak\n\t\t}\n\t\tif !i.iter.Next() {\n\t\t\ti.dir = dirEOI\n\t\t\ti.iterErr()\n\t\t\tbreak\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (i *dbIter) Next() bool {\n\tif i.dir == dirEOI || i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif !i.iter.Next() || (i.dir == dirBackward && !i.iter.Next()) {\n\t\ti.dir = dirEOI\n\t\ti.iterErr()\n\t\treturn false\n\t}\n\treturn i.next()\n}\n\nfunc (i *dbIter) prev() bool {\n\ti.dir = dirBackward\n\tdel := true\n\tif i.iter.Valid() {\n\t\tfor {\n\t\t\tif ukey, seq, kt, kerr := parseInternalKey(i.iter.Key()); kerr == nil {\n\t\t\t\ti.sampleSeek()\n\t\t\t\tif seq <= i.seq {\n\t\t\t\t\tif !del && i.icmp.uCompare(ukey, i.key) < 0 {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t\tdel = (kt == keyTypeDel)\n\t\t\t\t\tif !del {\n\t\t\t\t\t\ti.key = append(i.key[:0], ukey...)\n\t\t\t\t\t\ti.value = append(i.value[:0], i.iter.Value()...)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if i.strict {\n\t\t\t\ti.setErr(kerr)\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif !i.iter.Prev() {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif del {\n\t\ti.dir = dirSOI\n\t\ti.iterErr()\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (i *dbIter) Prev() bool {\n\tif i.dir == dirSOI || i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tswitch i.dir {\n\tcase dirEOI:\n\t\treturn i.Last()\n\tcase dirForward:\n\t\tfor i.iter.Prev() {\n\t\t\tif ukey, _, _, kerr := parseInternalKey(i.iter.Key()); kerr == nil {\n\t\t\t\ti.sampleSeek()\n\t\t\t\tif i.icmp.uCompare(ukey, i.key) < 0 {\n\t\t\t\t\tgoto cont\n\t\t\t\t}\n\t\t\t} else if i.strict {\n\t\t\t\ti.setErr(kerr)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\ti.dir = dirSOI\n\t\ti.iterErr()\n\t\treturn false\n\t}\n\ncont:\n\treturn i.prev()\n}\n\nfunc (i *dbIter) Key() []byte {\n\tif i.err != nil || i.dir <= dirEOI {\n\t\treturn nil\n\t}\n\treturn i.key\n}\n\nfunc (i *dbIter) Value() []byte {\n\tif i.err != nil || i.dir <= dirEOI {\n\t\treturn nil\n\t}\n\treturn i.value\n}\n\nfunc (i *dbIter) Release() {\n\tif i.dir != dirReleased {\n\t\t// Clear the finalizer.\n\t\truntime.SetFinalizer(i, nil)\n\n\t\tif i.releaser != nil {\n\t\t\ti.releaser.Release()\n\t\t\ti.releaser = nil\n\t\t}\n\n\t\ti.dir = dirReleased\n\t\ti.key = nil\n\t\ti.value = nil\n\t\ti.iter.Release()\n\t\ti.iter = nil\n\t\tatomic.AddInt32(&i.db.aliveIters, -1)\n\t\ti.db = nil\n\t}\n}\n\nfunc (i *dbIter) SetReleaser(releaser util.Releaser) {\n\tif i.dir == dirReleased {\n\t\tpanic(util.ErrReleased)\n\t}\n\tif i.releaser != nil && releaser != nil {\n\t\tpanic(util.ErrHasReleaser)\n\t}\n\ti.releaser = releaser\n}\n\nfunc (i *dbIter) Error() error {\n\treturn i.err\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"container/list\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\ntype snapshotElement struct {\n\tseq uint64\n\tref int\n\te   *list.Element\n}\n\n// Acquires a snapshot, based on latest sequence.\nfunc (db *DB) acquireSnapshot() *snapshotElement {\n\tdb.snapsMu.Lock()\n\tdefer db.snapsMu.Unlock()\n\n\tseq := db.getSeq()\n\n\tif e := db.snapsList.Back(); e != nil {\n\t\tse := e.Value.(*snapshotElement)\n\t\tif se.seq == seq {\n\t\t\tse.ref++\n\t\t\treturn se\n\t\t} else if seq < se.seq {\n\t\t\tpanic(\"leveldb: sequence number is not increasing\")\n\t\t}\n\t}\n\tse := &snapshotElement{seq: seq, ref: 1}\n\tse.e = db.snapsList.PushBack(se)\n\treturn se\n}\n\n// Releases given snapshot element.\nfunc (db *DB) releaseSnapshot(se *snapshotElement) {\n\tdb.snapsMu.Lock()\n\tdefer db.snapsMu.Unlock()\n\n\tse.ref--\n\tif se.ref == 0 {\n\t\tdb.snapsList.Remove(se.e)\n\t\tse.e = nil\n\t} else if se.ref < 0 {\n\t\tpanic(\"leveldb: Snapshot: negative element reference\")\n\t}\n}\n\n// Gets minimum sequence that not being snapshotted.\nfunc (db *DB) minSeq() uint64 {\n\tdb.snapsMu.Lock()\n\tdefer db.snapsMu.Unlock()\n\n\tif e := db.snapsList.Front(); e != nil {\n\t\treturn e.Value.(*snapshotElement).seq\n\t}\n\n\treturn db.getSeq()\n}\n\n// Snapshot is a DB snapshot.\ntype Snapshot struct {\n\tdb       *DB\n\telem     *snapshotElement\n\tmu       sync.RWMutex\n\treleased bool\n}\n\n// Creates new snapshot object.\nfunc (db *DB) newSnapshot() *Snapshot {\n\tsnap := &Snapshot{\n\t\tdb:   db,\n\t\telem: db.acquireSnapshot(),\n\t}\n\tatomic.AddInt32(&db.aliveSnaps, 1)\n\truntime.SetFinalizer(snap, (*Snapshot).Release)\n\treturn snap\n}\n\nfunc (snap *Snapshot) String() string {\n\treturn fmt.Sprintf(\"leveldb.Snapshot{%d}\", snap.elem.seq)\n}\n\n// Get gets the value for the given key. It returns ErrNotFound if\n// the DB does not contains the key.\n//\n// The caller should not modify the contents of the returned slice, but\n// it is safe to modify the contents of the argument after Get returns.\nfunc (snap *Snapshot) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {\n\terr = snap.db.ok()\n\tif err != nil {\n\t\treturn\n\t}\n\tsnap.mu.RLock()\n\tdefer snap.mu.RUnlock()\n\tif snap.released {\n\t\terr = ErrSnapshotReleased\n\t\treturn\n\t}\n\treturn snap.db.get(nil, nil, key, snap.elem.seq, ro)\n}\n\n// Has returns true if the DB does contains the given key.\n//\n// It is safe to modify the contents of the argument after Get returns.\nfunc (snap *Snapshot) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) {\n\terr = snap.db.ok()\n\tif err != nil {\n\t\treturn\n\t}\n\tsnap.mu.RLock()\n\tdefer snap.mu.RUnlock()\n\tif snap.released {\n\t\terr = ErrSnapshotReleased\n\t\treturn\n\t}\n\treturn snap.db.has(nil, nil, key, snap.elem.seq, ro)\n}\n\n// NewIterator returns an iterator for the snapshot of the underlying DB.\n// The returned iterator is not safe for concurrent use, but it is safe to use\n// multiple iterators concurrently, with each in a dedicated goroutine.\n// It is also safe to use an iterator concurrently with modifying its\n// underlying DB. The resultant key/value pairs are guaranteed to be\n// consistent.\n//\n// Slice allows slicing the iterator to only contains keys in the given\n// range. A nil Range.Start is treated as a key before all keys in the\n// DB. And a nil Range.Limit is treated as a key after all keys in\n// the DB.\n//\n// The iterator must be released after use, by calling Release method.\n// Releasing the snapshot doesn't mean releasing the iterator too, the\n// iterator would be still valid until released.\n//\n// Also read Iterator documentation of the leveldb/iterator package.\nfunc (snap *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {\n\tif err := snap.db.ok(); err != nil {\n\t\treturn iterator.NewEmptyIterator(err)\n\t}\n\tsnap.mu.Lock()\n\tdefer snap.mu.Unlock()\n\tif snap.released {\n\t\treturn iterator.NewEmptyIterator(ErrSnapshotReleased)\n\t}\n\t// Since iterator already hold version ref, it doesn't need to\n\t// hold snapshot ref.\n\treturn snap.db.newIterator(nil, nil, snap.elem.seq, slice, ro)\n}\n\n// Release releases the snapshot. This will not release any returned\n// iterators, the iterators would still be valid until released or the\n// underlying DB is closed.\n//\n// Other methods should not be called after the snapshot has been released.\nfunc (snap *Snapshot) Release() {\n\tsnap.mu.Lock()\n\tdefer snap.mu.Unlock()\n\n\tif !snap.released {\n\t\t// Clear the finalizer.\n\t\truntime.SetFinalizer(snap, nil)\n\n\t\tsnap.released = true\n\t\tsnap.db.releaseSnapshot(snap.elem)\n\t\tatomic.AddInt32(&snap.db.aliveSnaps, -1)\n\t\tsnap.db = nil\n\t\tsnap.elem = nil\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db_state.go",
    "content": "// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"errors\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/journal\"\n\t\"github.com/syndtr/goleveldb/leveldb/memdb\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\nvar (\n\terrHasFrozenMem = errors.New(\"has frozen mem\")\n)\n\ntype memDB struct {\n\tdb *DB\n\t*memdb.DB\n\tref int32\n}\n\nfunc (m *memDB) getref() int32 {\n\treturn atomic.LoadInt32(&m.ref)\n}\n\nfunc (m *memDB) incref() {\n\tatomic.AddInt32(&m.ref, 1)\n}\n\nfunc (m *memDB) decref() {\n\tif ref := atomic.AddInt32(&m.ref, -1); ref == 0 {\n\t\t// Only put back memdb with std capacity.\n\t\tif m.Capacity() == m.db.s.o.GetWriteBuffer() {\n\t\t\tm.Reset()\n\t\t\tm.db.mpoolPut(m.DB)\n\t\t}\n\t\tm.db = nil\n\t\tm.DB = nil\n\t} else if ref < 0 {\n\t\tpanic(\"negative memdb ref\")\n\t}\n}\n\n// Get latest sequence number.\nfunc (db *DB) getSeq() uint64 {\n\treturn atomic.LoadUint64(&db.seq)\n}\n\n// Atomically adds delta to seq.\nfunc (db *DB) addSeq(delta uint64) {\n\tatomic.AddUint64(&db.seq, delta)\n}\n\nfunc (db *DB) setSeq(seq uint64) {\n\tatomic.StoreUint64(&db.seq, seq)\n}\n\nfunc (db *DB) sampleSeek(ikey internalKey) {\n\tv := db.s.version()\n\tif v.sampleSeek(ikey) {\n\t\t// Trigger table compaction.\n\t\tdb.compTrigger(db.tcompCmdC)\n\t}\n\tv.release()\n}\n\nfunc (db *DB) mpoolPut(mem *memdb.DB) {\n\tif !db.isClosed() {\n\t\tselect {\n\t\tcase db.memPool <- mem:\n\t\tdefault:\n\t\t}\n\t}\n}\n\nfunc (db *DB) mpoolGet(n int) *memDB {\n\tvar mdb *memdb.DB\n\tselect {\n\tcase mdb = <-db.memPool:\n\tdefault:\n\t}\n\tif mdb == nil || mdb.Capacity() < n {\n\t\tmdb = memdb.New(db.s.icmp, maxInt(db.s.o.GetWriteBuffer(), n))\n\t}\n\treturn &memDB{\n\t\tdb: db,\n\t\tDB: mdb,\n\t}\n}\n\nfunc (db *DB) mpoolDrain() {\n\tticker := time.NewTicker(30 * time.Second)\n\tfor {\n\t\tselect {\n\t\tcase <-ticker.C:\n\t\t\tselect {\n\t\t\tcase <-db.memPool:\n\t\t\tdefault:\n\t\t\t}\n\t\tcase <-db.closeC:\n\t\t\tticker.Stop()\n\t\t\t// Make sure the pool is drained.\n\t\t\tselect {\n\t\t\tcase <-db.memPool:\n\t\t\tcase <-time.After(time.Second):\n\t\t\t}\n\t\t\tclose(db.memPool)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Create new memdb and froze the old one; need external synchronization.\n// newMem only called synchronously by the writer.\nfunc (db *DB) newMem(n int) (mem *memDB, err error) {\n\tfd := storage.FileDesc{Type: storage.TypeJournal, Num: db.s.allocFileNum()}\n\tw, err := db.s.stor.Create(fd)\n\tif err != nil {\n\t\tdb.s.reuseFileNum(fd.Num)\n\t\treturn\n\t}\n\n\tdb.memMu.Lock()\n\tdefer db.memMu.Unlock()\n\n\tif db.frozenMem != nil {\n\t\treturn nil, errHasFrozenMem\n\t}\n\n\tif db.journal == nil {\n\t\tdb.journal = journal.NewWriter(w)\n\t} else {\n\t\tdb.journal.Reset(w)\n\t\tdb.journalWriter.Close()\n\t\tdb.frozenJournalFd = db.journalFd\n\t}\n\tdb.journalWriter = w\n\tdb.journalFd = fd\n\tdb.frozenMem = db.mem\n\tmem = db.mpoolGet(n)\n\tmem.incref() // for self\n\tmem.incref() // for caller\n\tdb.mem = mem\n\t// The seq only incremented by the writer. And whoever called newMem\n\t// should hold write lock, so no need additional synchronization here.\n\tdb.frozenSeq = db.seq\n\treturn\n}\n\n// Get all memdbs.\nfunc (db *DB) getMems() (e, f *memDB) {\n\tdb.memMu.RLock()\n\tdefer db.memMu.RUnlock()\n\tif db.mem != nil {\n\t\tdb.mem.incref()\n\t} else if !db.isClosed() {\n\t\tpanic(\"nil effective mem\")\n\t}\n\tif db.frozenMem != nil {\n\t\tdb.frozenMem.incref()\n\t}\n\treturn db.mem, db.frozenMem\n}\n\n// Get effective memdb.\nfunc (db *DB) getEffectiveMem() *memDB {\n\tdb.memMu.RLock()\n\tdefer db.memMu.RUnlock()\n\tif db.mem != nil {\n\t\tdb.mem.incref()\n\t} else if !db.isClosed() {\n\t\tpanic(\"nil effective mem\")\n\t}\n\treturn db.mem\n}\n\n// Check whether we has frozen memdb.\nfunc (db *DB) hasFrozenMem() bool {\n\tdb.memMu.RLock()\n\tdefer db.memMu.RUnlock()\n\treturn db.frozenMem != nil\n}\n\n// Get frozen memdb.\nfunc (db *DB) getFrozenMem() *memDB {\n\tdb.memMu.RLock()\n\tdefer db.memMu.RUnlock()\n\tif db.frozenMem != nil {\n\t\tdb.frozenMem.incref()\n\t}\n\treturn db.frozenMem\n}\n\n// Drop frozen memdb; assume that frozen memdb isn't nil.\nfunc (db *DB) dropFrozenMem() {\n\tdb.memMu.Lock()\n\tif err := db.s.stor.Remove(db.frozenJournalFd); err != nil {\n\t\tdb.logf(\"journal@remove removing @%d %q\", db.frozenJournalFd.Num, err)\n\t} else {\n\t\tdb.logf(\"journal@remove removed @%d\", db.frozenJournalFd.Num)\n\t}\n\tdb.frozenJournalFd = storage.FileDesc{}\n\tdb.frozenMem.decref()\n\tdb.frozenMem = nil\n\tdb.memMu.Unlock()\n}\n\n// Clear mems ptr; used by DB.Close().\nfunc (db *DB) clearMems() {\n\tdb.memMu.Lock()\n\tdb.mem = nil\n\tdb.frozenMem = nil\n\tdb.memMu.Unlock()\n}\n\n// Set closed flag; return true if not already closed.\nfunc (db *DB) setClosed() bool {\n\treturn atomic.CompareAndSwapUint32(&db.closed, 0, 1)\n}\n\n// Check whether DB was closed.\nfunc (db *DB) isClosed() bool {\n\treturn atomic.LoadUint32(&db.closed) != 0\n}\n\n// Check read ok status.\nfunc (db *DB) ok() error {\n\tif db.isClosed() {\n\t\treturn ErrClosed\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go",
    "content": "// Copyright (c) 2016, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"errors\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nvar errTransactionDone = errors.New(\"leveldb: transaction already closed\")\n\n// Transaction is the transaction handle.\ntype Transaction struct {\n\tdb        *DB\n\tlk        sync.RWMutex\n\tseq       uint64\n\tmem       *memDB\n\ttables    tFiles\n\tikScratch []byte\n\trec       sessionRecord\n\tstats     cStatStaging\n\tclosed    bool\n}\n\n// Get gets the value for the given key. It returns ErrNotFound if the\n// DB does not contains the key.\n//\n// The returned slice is its own copy, it is safe to modify the contents\n// of the returned slice.\n// It is safe to modify the contents of the argument after Get returns.\nfunc (tr *Transaction) Get(key []byte, ro *opt.ReadOptions) ([]byte, error) {\n\ttr.lk.RLock()\n\tdefer tr.lk.RUnlock()\n\tif tr.closed {\n\t\treturn nil, errTransactionDone\n\t}\n\treturn tr.db.get(tr.mem.DB, tr.tables, key, tr.seq, ro)\n}\n\n// Has returns true if the DB does contains the given key.\n//\n// It is safe to modify the contents of the argument after Has returns.\nfunc (tr *Transaction) Has(key []byte, ro *opt.ReadOptions) (bool, error) {\n\ttr.lk.RLock()\n\tdefer tr.lk.RUnlock()\n\tif tr.closed {\n\t\treturn false, errTransactionDone\n\t}\n\treturn tr.db.has(tr.mem.DB, tr.tables, key, tr.seq, ro)\n}\n\n// NewIterator returns an iterator for the latest snapshot of the transaction.\n// The returned iterator is not safe for concurrent use, but it is safe to use\n// multiple iterators concurrently, with each in a dedicated goroutine.\n// It is also safe to use an iterator concurrently while writes to the\n// transaction. The resultant key/value pairs are guaranteed to be consistent.\n//\n// Slice allows slicing the iterator to only contains keys in the given\n// range. A nil Range.Start is treated as a key before all keys in the\n// DB. And a nil Range.Limit is treated as a key after all keys in\n// the DB.\n//\n// The iterator must be released after use, by calling Release method.\n//\n// Also read Iterator documentation of the leveldb/iterator package.\nfunc (tr *Transaction) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {\n\ttr.lk.RLock()\n\tdefer tr.lk.RUnlock()\n\tif tr.closed {\n\t\treturn iterator.NewEmptyIterator(errTransactionDone)\n\t}\n\ttr.mem.incref()\n\treturn tr.db.newIterator(tr.mem, tr.tables, tr.seq, slice, ro)\n}\n\nfunc (tr *Transaction) flush() error {\n\t// Flush memdb.\n\tif tr.mem.Len() != 0 {\n\t\ttr.stats.startTimer()\n\t\titer := tr.mem.NewIterator(nil)\n\t\tt, n, err := tr.db.s.tops.createFrom(iter)\n\t\titer.Release()\n\t\ttr.stats.stopTimer()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif tr.mem.getref() == 1 {\n\t\t\ttr.mem.Reset()\n\t\t} else {\n\t\t\ttr.mem.decref()\n\t\t\ttr.mem = tr.db.mpoolGet(0)\n\t\t\ttr.mem.incref()\n\t\t}\n\t\ttr.tables = append(tr.tables, t)\n\t\ttr.rec.addTableFile(0, t)\n\t\ttr.stats.write += t.size\n\t\ttr.db.logf(\"transaction@flush created L0@%d N·%d S·%s %q:%q\", t.fd.Num, n, shortenb(int(t.size)), t.imin, t.imax)\n\t}\n\treturn nil\n}\n\nfunc (tr *Transaction) put(kt keyType, key, value []byte) error {\n\ttr.ikScratch = makeInternalKey(tr.ikScratch, key, tr.seq+1, kt)\n\tif tr.mem.Free() < len(tr.ikScratch)+len(value) {\n\t\tif err := tr.flush(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := tr.mem.Put(tr.ikScratch, value); err != nil {\n\t\treturn err\n\t}\n\ttr.seq++\n\treturn nil\n}\n\n// Put sets the value for the given key. It overwrites any previous value\n// for that key; a DB is not a multi-map.\n// Please note that the transaction is not compacted until committed, so if you\n// writes 10 same keys, then those 10 same keys are in the transaction.\n//\n// It is safe to modify the contents of the arguments after Put returns.\nfunc (tr *Transaction) Put(key, value []byte, wo *opt.WriteOptions) error {\n\ttr.lk.Lock()\n\tdefer tr.lk.Unlock()\n\tif tr.closed {\n\t\treturn errTransactionDone\n\t}\n\treturn tr.put(keyTypeVal, key, value)\n}\n\n// Delete deletes the value for the given key.\n// Please note that the transaction is not compacted until committed, so if you\n// writes 10 same keys, then those 10 same keys are in the transaction.\n//\n// It is safe to modify the contents of the arguments after Delete returns.\nfunc (tr *Transaction) Delete(key []byte, wo *opt.WriteOptions) error {\n\ttr.lk.Lock()\n\tdefer tr.lk.Unlock()\n\tif tr.closed {\n\t\treturn errTransactionDone\n\t}\n\treturn tr.put(keyTypeDel, key, nil)\n}\n\n// Write apply the given batch to the transaction. The batch will be applied\n// sequentially.\n// Please note that the transaction is not compacted until committed, so if you\n// writes 10 same keys, then those 10 same keys are in the transaction.\n//\n// It is safe to modify the contents of the arguments after Write returns.\nfunc (tr *Transaction) Write(b *Batch, wo *opt.WriteOptions) error {\n\tif b == nil || b.Len() == 0 {\n\t\treturn nil\n\t}\n\n\ttr.lk.Lock()\n\tdefer tr.lk.Unlock()\n\tif tr.closed {\n\t\treturn errTransactionDone\n\t}\n\treturn b.replayInternal(func(i int, kt keyType, k, v []byte) error {\n\t\treturn tr.put(kt, k, v)\n\t})\n}\n\nfunc (tr *Transaction) setDone() {\n\ttr.closed = true\n\ttr.db.tr = nil\n\ttr.mem.decref()\n\t<-tr.db.writeLockC\n}\n\n// Commit commits the transaction. If error is not nil, then the transaction is\n// not committed, it can then either be retried or discarded.\n//\n// Other methods should not be called after transaction has been committed.\nfunc (tr *Transaction) Commit() error {\n\tif err := tr.db.ok(); err != nil {\n\t\treturn err\n\t}\n\n\ttr.lk.Lock()\n\tdefer tr.lk.Unlock()\n\tif tr.closed {\n\t\treturn errTransactionDone\n\t}\n\tif err := tr.flush(); err != nil {\n\t\t// Return error, lets user decide either to retry or discard\n\t\t// transaction.\n\t\treturn err\n\t}\n\tif len(tr.tables) != 0 {\n\t\t// Committing transaction.\n\t\ttr.rec.setSeqNum(tr.seq)\n\t\ttr.db.compCommitLk.Lock()\n\t\ttr.stats.startTimer()\n\t\tvar cerr error\n\t\tfor retry := 0; retry < 3; retry++ {\n\t\t\tcerr = tr.db.s.commit(&tr.rec)\n\t\t\tif cerr != nil {\n\t\t\t\ttr.db.logf(\"transaction@commit error R·%d %q\", retry, cerr)\n\t\t\t\tselect {\n\t\t\t\tcase <-time.After(time.Second):\n\t\t\t\tcase <-tr.db.closeC:\n\t\t\t\t\ttr.db.logf(\"transaction@commit exiting\")\n\t\t\t\t\ttr.db.compCommitLk.Unlock()\n\t\t\t\t\treturn cerr\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Success. Set db.seq.\n\t\t\t\ttr.db.setSeq(tr.seq)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\ttr.stats.stopTimer()\n\t\tif cerr != nil {\n\t\t\t// Return error, lets user decide either to retry or discard\n\t\t\t// transaction.\n\t\t\treturn cerr\n\t\t}\n\n\t\t// Update compaction stats. This is safe as long as we hold compCommitLk.\n\t\ttr.db.compStats.addStat(0, &tr.stats)\n\n\t\t// Trigger table auto-compaction.\n\t\ttr.db.compTrigger(tr.db.tcompCmdC)\n\t\ttr.db.compCommitLk.Unlock()\n\n\t\t// Additionally, wait compaction when certain threshold reached.\n\t\t// Ignore error, returns error only if transaction can't be committed.\n\t\ttr.db.waitCompaction()\n\t}\n\t// Only mark as done if transaction committed successfully.\n\ttr.setDone()\n\treturn nil\n}\n\nfunc (tr *Transaction) discard() {\n\t// Discard transaction.\n\tfor _, t := range tr.tables {\n\t\ttr.db.logf(\"transaction@discard @%d\", t.fd.Num)\n\t\tif err1 := tr.db.s.stor.Remove(t.fd); err1 == nil {\n\t\t\ttr.db.s.reuseFileNum(t.fd.Num)\n\t\t}\n\t}\n}\n\n// Discard discards the transaction.\n//\n// Other methods should not be called after transaction has been discarded.\nfunc (tr *Transaction) Discard() {\n\ttr.lk.Lock()\n\tif !tr.closed {\n\t\ttr.discard()\n\t\ttr.setDone()\n\t}\n\ttr.lk.Unlock()\n}\n\nfunc (db *DB) waitCompaction() error {\n\tif db.s.tLen(0) >= db.s.o.GetWriteL0PauseTrigger() {\n\t\treturn db.compTriggerWait(db.tcompCmdC)\n\t}\n\treturn nil\n}\n\n// OpenTransaction opens an atomic DB transaction. Only one transaction can be\n// opened at a time. Subsequent call to Write and OpenTransaction will be blocked\n// until in-flight transaction is committed or discarded.\n// The returned transaction handle is safe for concurrent use.\n//\n// Transaction is expensive and can overwhelm compaction, especially if\n// transaction size is small. Use with caution.\n//\n// The transaction must be closed once done, either by committing or discarding\n// the transaction.\n// Closing the DB will discard open transaction.\nfunc (db *DB) OpenTransaction() (*Transaction, error) {\n\tif err := db.ok(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// The write happen synchronously.\n\tselect {\n\tcase db.writeLockC <- struct{}{}:\n\tcase err := <-db.compPerErrC:\n\t\treturn nil, err\n\tcase <-db.closeC:\n\t\treturn nil, ErrClosed\n\t}\n\n\tif db.tr != nil {\n\t\tpanic(\"leveldb: has open transaction\")\n\t}\n\n\t// Flush current memdb.\n\tif db.mem != nil && db.mem.Len() != 0 {\n\t\tif _, err := db.rotateMem(0, true); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Wait compaction when certain threshold reached.\n\tif err := db.waitCompaction(); err != nil {\n\t\treturn nil, err\n\t}\n\n\ttr := &Transaction{\n\t\tdb:  db,\n\t\tseq: db.seq,\n\t\tmem: db.mpoolGet(0),\n\t}\n\ttr.mem.incref()\n\tdb.tr = tr\n\treturn tr, nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db_util.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// Reader is the interface that wraps basic Get and NewIterator methods.\n// This interface implemented by both DB and Snapshot.\ntype Reader interface {\n\tGet(key []byte, ro *opt.ReadOptions) (value []byte, err error)\n\tNewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator\n}\n\n// Sizes is list of size.\ntype Sizes []int64\n\n// Sum returns sum of the sizes.\nfunc (sizes Sizes) Sum() int64 {\n\tvar sum int64\n\tfor _, size := range sizes {\n\t\tsum += size\n\t}\n\treturn sum\n}\n\n// Logging.\nfunc (db *DB) log(v ...interface{})                 { db.s.log(v...) }\nfunc (db *DB) logf(format string, v ...interface{}) { db.s.logf(format, v...) }\n\n// Check and clean files.\nfunc (db *DB) checkAndCleanFiles() error {\n\tv := db.s.version()\n\tdefer v.release()\n\n\ttmap := make(map[int64]bool)\n\tfor _, tables := range v.levels {\n\t\tfor _, t := range tables {\n\t\t\ttmap[t.fd.Num] = false\n\t\t}\n\t}\n\n\tfds, err := db.s.stor.List(storage.TypeAll)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar nt int\n\tvar rem []storage.FileDesc\n\tfor _, fd := range fds {\n\t\tkeep := true\n\t\tswitch fd.Type {\n\t\tcase storage.TypeManifest:\n\t\t\tkeep = fd.Num >= db.s.manifestFd.Num\n\t\tcase storage.TypeJournal:\n\t\t\tif !db.frozenJournalFd.Zero() {\n\t\t\t\tkeep = fd.Num >= db.frozenJournalFd.Num\n\t\t\t} else {\n\t\t\t\tkeep = fd.Num >= db.journalFd.Num\n\t\t\t}\n\t\tcase storage.TypeTable:\n\t\t\t_, keep = tmap[fd.Num]\n\t\t\tif keep {\n\t\t\t\ttmap[fd.Num] = true\n\t\t\t\tnt++\n\t\t\t}\n\t\t}\n\n\t\tif !keep {\n\t\t\trem = append(rem, fd)\n\t\t}\n\t}\n\n\tif nt != len(tmap) {\n\t\tvar mfds []storage.FileDesc\n\t\tfor num, present := range tmap {\n\t\t\tif !present {\n\t\t\t\tmfds = append(mfds, storage.FileDesc{storage.TypeTable, num})\n\t\t\t\tdb.logf(\"db@janitor table missing @%d\", num)\n\t\t\t}\n\t\t}\n\t\treturn errors.NewErrCorrupted(storage.FileDesc{}, &errors.ErrMissingFiles{Fds: mfds})\n\t}\n\n\tdb.logf(\"db@janitor F·%d G·%d\", len(fds), len(rem))\n\tfor _, fd := range rem {\n\t\tdb.logf(\"db@janitor removing %s-%d\", fd.Type, fd.Num)\n\t\tif err := db.s.stor.Remove(fd); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/db_write.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/memdb\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nfunc (db *DB) writeJournal(batches []*Batch, seq uint64, sync bool) error {\n\twr, err := db.journal.Next()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err := writeBatchesWithHeader(wr, batches, seq); err != nil {\n\t\treturn err\n\t}\n\tif err := db.journal.Flush(); err != nil {\n\t\treturn err\n\t}\n\tif sync {\n\t\treturn db.journalWriter.Sync()\n\t}\n\treturn nil\n}\n\nfunc (db *DB) rotateMem(n int, wait bool) (mem *memDB, err error) {\n\tretryLimit := 3\nretry:\n\t// Wait for pending memdb compaction.\n\terr = db.compTriggerWait(db.mcompCmdC)\n\tif err != nil {\n\t\treturn\n\t}\n\tretryLimit--\n\n\t// Create new memdb and journal.\n\tmem, err = db.newMem(n)\n\tif err != nil {\n\t\tif err == errHasFrozenMem {\n\t\t\tif retryLimit <= 0 {\n\t\t\t\tpanic(\"BUG: still has frozen memdb\")\n\t\t\t}\n\t\t\tgoto retry\n\t\t}\n\t\treturn\n\t}\n\n\t// Schedule memdb compaction.\n\tif wait {\n\t\terr = db.compTriggerWait(db.mcompCmdC)\n\t} else {\n\t\tdb.compTrigger(db.mcompCmdC)\n\t}\n\treturn\n}\n\nfunc (db *DB) flush(n int) (mdb *memDB, mdbFree int, err error) {\n\tdelayed := false\n\tslowdownTrigger := db.s.o.GetWriteL0SlowdownTrigger()\n\tpauseTrigger := db.s.o.GetWriteL0PauseTrigger()\n\tflush := func() (retry bool) {\n\t\tmdb = db.getEffectiveMem()\n\t\tif mdb == nil {\n\t\t\terr = ErrClosed\n\t\t\treturn false\n\t\t}\n\t\tdefer func() {\n\t\t\tif retry {\n\t\t\t\tmdb.decref()\n\t\t\t\tmdb = nil\n\t\t\t}\n\t\t}()\n\t\ttLen := db.s.tLen(0)\n\t\tmdbFree = mdb.Free()\n\t\tswitch {\n\t\tcase tLen >= slowdownTrigger && !delayed:\n\t\t\tdelayed = true\n\t\t\ttime.Sleep(time.Millisecond)\n\t\tcase mdbFree >= n:\n\t\t\treturn false\n\t\tcase tLen >= pauseTrigger:\n\t\t\tdelayed = true\n\t\t\t// Set the write paused flag explicitly.\n\t\t\tatomic.StoreInt32(&db.inWritePaused, 1)\n\t\t\terr = db.compTriggerWait(db.tcompCmdC)\n\t\t\t// Unset the write paused flag.\n\t\t\tatomic.StoreInt32(&db.inWritePaused, 0)\n\t\t\tif err != nil {\n\t\t\t\treturn false\n\t\t\t}\n\t\tdefault:\n\t\t\t// Allow memdb to grow if it has no entry.\n\t\t\tif mdb.Len() == 0 {\n\t\t\t\tmdbFree = n\n\t\t\t} else {\n\t\t\t\tmdb.decref()\n\t\t\t\tmdb, err = db.rotateMem(n, false)\n\t\t\t\tif err == nil {\n\t\t\t\t\tmdbFree = mdb.Free()\n\t\t\t\t} else {\n\t\t\t\t\tmdbFree = 0\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}\n\tstart := time.Now()\n\tfor flush() {\n\t}\n\tif delayed {\n\t\tdb.writeDelay += time.Since(start)\n\t\tdb.writeDelayN++\n\t} else if db.writeDelayN > 0 {\n\t\tdb.logf(\"db@write was delayed N·%d T·%v\", db.writeDelayN, db.writeDelay)\n\t\tatomic.AddInt32(&db.cWriteDelayN, int32(db.writeDelayN))\n\t\tatomic.AddInt64(&db.cWriteDelay, int64(db.writeDelay))\n\t\tdb.writeDelay = 0\n\t\tdb.writeDelayN = 0\n\t}\n\treturn\n}\n\ntype writeMerge struct {\n\tsync       bool\n\tbatch      *Batch\n\tkeyType    keyType\n\tkey, value []byte\n}\n\nfunc (db *DB) unlockWrite(overflow bool, merged int, err error) {\n\tfor i := 0; i < merged; i++ {\n\t\tdb.writeAckC <- err\n\t}\n\tif overflow {\n\t\t// Pass lock to the next write (that failed to merge).\n\t\tdb.writeMergedC <- false\n\t} else {\n\t\t// Release lock.\n\t\t<-db.writeLockC\n\t}\n}\n\n// ourBatch is batch that we can modify.\nfunc (db *DB) writeLocked(batch, ourBatch *Batch, merge, sync bool) error {\n\t// Try to flush memdb. This method would also trying to throttle writes\n\t// if it is too fast and compaction cannot catch-up.\n\tmdb, mdbFree, err := db.flush(batch.internalLen)\n\tif err != nil {\n\t\tdb.unlockWrite(false, 0, err)\n\t\treturn err\n\t}\n\tdefer mdb.decref()\n\n\tvar (\n\t\toverflow bool\n\t\tmerged   int\n\t\tbatches  = []*Batch{batch}\n\t)\n\n\tif merge {\n\t\t// Merge limit.\n\t\tvar mergeLimit int\n\t\tif batch.internalLen > 128<<10 {\n\t\t\tmergeLimit = (1 << 20) - batch.internalLen\n\t\t} else {\n\t\t\tmergeLimit = 128 << 10\n\t\t}\n\t\tmergeCap := mdbFree - batch.internalLen\n\t\tif mergeLimit > mergeCap {\n\t\t\tmergeLimit = mergeCap\n\t\t}\n\n\tmerge:\n\t\tfor mergeLimit > 0 {\n\t\t\tselect {\n\t\t\tcase incoming := <-db.writeMergeC:\n\t\t\t\tif incoming.batch != nil {\n\t\t\t\t\t// Merge batch.\n\t\t\t\t\tif incoming.batch.internalLen > mergeLimit {\n\t\t\t\t\t\toverflow = true\n\t\t\t\t\t\tbreak merge\n\t\t\t\t\t}\n\t\t\t\t\tbatches = append(batches, incoming.batch)\n\t\t\t\t\tmergeLimit -= incoming.batch.internalLen\n\t\t\t\t} else {\n\t\t\t\t\t// Merge put.\n\t\t\t\t\tinternalLen := len(incoming.key) + len(incoming.value) + 8\n\t\t\t\t\tif internalLen > mergeLimit {\n\t\t\t\t\t\toverflow = true\n\t\t\t\t\t\tbreak merge\n\t\t\t\t\t}\n\t\t\t\t\tif ourBatch == nil {\n\t\t\t\t\t\tourBatch = db.batchPool.Get().(*Batch)\n\t\t\t\t\t\tourBatch.Reset()\n\t\t\t\t\t\tbatches = append(batches, ourBatch)\n\t\t\t\t\t}\n\t\t\t\t\t// We can use same batch since concurrent write doesn't\n\t\t\t\t\t// guarantee write order.\n\t\t\t\t\tourBatch.appendRec(incoming.keyType, incoming.key, incoming.value)\n\t\t\t\t\tmergeLimit -= internalLen\n\t\t\t\t}\n\t\t\t\tsync = sync || incoming.sync\n\t\t\t\tmerged++\n\t\t\t\tdb.writeMergedC <- true\n\n\t\t\tdefault:\n\t\t\t\tbreak merge\n\t\t\t}\n\t\t}\n\t}\n\n\t// Release ourBatch if any.\n\tif ourBatch != nil {\n\t\tdefer db.batchPool.Put(ourBatch)\n\t}\n\n\t// Seq number.\n\tseq := db.seq + 1\n\n\t// Write journal.\n\tif err := db.writeJournal(batches, seq, sync); err != nil {\n\t\tdb.unlockWrite(overflow, merged, err)\n\t\treturn err\n\t}\n\n\t// Put batches.\n\tfor _, batch := range batches {\n\t\tif err := batch.putMem(seq, mdb.DB); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tseq += uint64(batch.Len())\n\t}\n\n\t// Incr seq number.\n\tdb.addSeq(uint64(batchesLen(batches)))\n\n\t// Rotate memdb if it's reach the threshold.\n\tif batch.internalLen >= mdbFree {\n\t\tdb.rotateMem(0, false)\n\t}\n\n\tdb.unlockWrite(overflow, merged, nil)\n\treturn nil\n}\n\n// Write apply the given batch to the DB. The batch records will be applied\n// sequentially. Write might be used concurrently, when used concurrently and\n// batch is small enough, write will try to merge the batches. Set NoWriteMerge\n// option to true to disable write merge.\n//\n// It is safe to modify the contents of the arguments after Write returns but\n// not before. Write will not modify content of the batch.\nfunc (db *DB) Write(batch *Batch, wo *opt.WriteOptions) error {\n\tif err := db.ok(); err != nil || batch == nil || batch.Len() == 0 {\n\t\treturn err\n\t}\n\n\t// If the batch size is larger than write buffer, it may justified to write\n\t// using transaction instead. Using transaction the batch will be written\n\t// into tables directly, skipping the journaling.\n\tif batch.internalLen > db.s.o.GetWriteBuffer() && !db.s.o.GetDisableLargeBatchTransaction() {\n\t\ttr, err := db.OpenTransaction()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := tr.Write(batch, wo); err != nil {\n\t\t\ttr.Discard()\n\t\t\treturn err\n\t\t}\n\t\treturn tr.Commit()\n\t}\n\n\tmerge := !wo.GetNoWriteMerge() && !db.s.o.GetNoWriteMerge()\n\tsync := wo.GetSync() && !db.s.o.GetNoSync()\n\n\t// Acquire write lock.\n\tif merge {\n\t\tselect {\n\t\tcase db.writeMergeC <- writeMerge{sync: sync, batch: batch}:\n\t\t\tif <-db.writeMergedC {\n\t\t\t\t// Write is merged.\n\t\t\t\treturn <-db.writeAckC\n\t\t\t}\n\t\t\t// Write is not merged, the write lock is handed to us. Continue.\n\t\tcase db.writeLockC <- struct{}{}:\n\t\t\t// Write lock acquired.\n\t\tcase err := <-db.compPerErrC:\n\t\t\t// Compaction error.\n\t\t\treturn err\n\t\tcase <-db.closeC:\n\t\t\t// Closed\n\t\t\treturn ErrClosed\n\t\t}\n\t} else {\n\t\tselect {\n\t\tcase db.writeLockC <- struct{}{}:\n\t\t\t// Write lock acquired.\n\t\tcase err := <-db.compPerErrC:\n\t\t\t// Compaction error.\n\t\t\treturn err\n\t\tcase <-db.closeC:\n\t\t\t// Closed\n\t\t\treturn ErrClosed\n\t\t}\n\t}\n\n\treturn db.writeLocked(batch, nil, merge, sync)\n}\n\nfunc (db *DB) putRec(kt keyType, key, value []byte, wo *opt.WriteOptions) error {\n\tif err := db.ok(); err != nil {\n\t\treturn err\n\t}\n\n\tmerge := !wo.GetNoWriteMerge() && !db.s.o.GetNoWriteMerge()\n\tsync := wo.GetSync() && !db.s.o.GetNoSync()\n\n\t// Acquire write lock.\n\tif merge {\n\t\tselect {\n\t\tcase db.writeMergeC <- writeMerge{sync: sync, keyType: kt, key: key, value: value}:\n\t\t\tif <-db.writeMergedC {\n\t\t\t\t// Write is merged.\n\t\t\t\treturn <-db.writeAckC\n\t\t\t}\n\t\t\t// Write is not merged, the write lock is handed to us. Continue.\n\t\tcase db.writeLockC <- struct{}{}:\n\t\t\t// Write lock acquired.\n\t\tcase err := <-db.compPerErrC:\n\t\t\t// Compaction error.\n\t\t\treturn err\n\t\tcase <-db.closeC:\n\t\t\t// Closed\n\t\t\treturn ErrClosed\n\t\t}\n\t} else {\n\t\tselect {\n\t\tcase db.writeLockC <- struct{}{}:\n\t\t\t// Write lock acquired.\n\t\tcase err := <-db.compPerErrC:\n\t\t\t// Compaction error.\n\t\t\treturn err\n\t\tcase <-db.closeC:\n\t\t\t// Closed\n\t\t\treturn ErrClosed\n\t\t}\n\t}\n\n\tbatch := db.batchPool.Get().(*Batch)\n\tbatch.Reset()\n\tbatch.appendRec(kt, key, value)\n\treturn db.writeLocked(batch, batch, merge, sync)\n}\n\n// Put sets the value for the given key. It overwrites any previous value\n// for that key; a DB is not a multi-map. Write merge also applies for Put, see\n// Write.\n//\n// It is safe to modify the contents of the arguments after Put returns but not\n// before.\nfunc (db *DB) Put(key, value []byte, wo *opt.WriteOptions) error {\n\treturn db.putRec(keyTypeVal, key, value, wo)\n}\n\n// Delete deletes the value for the given key. Delete will not returns error if\n// key doesn't exist. Write merge also applies for Delete, see Write.\n//\n// It is safe to modify the contents of the arguments after Delete returns but\n// not before.\nfunc (db *DB) Delete(key []byte, wo *opt.WriteOptions) error {\n\treturn db.putRec(keyTypeDel, key, nil, wo)\n}\n\nfunc isMemOverlaps(icmp *iComparer, mem *memdb.DB, min, max []byte) bool {\n\titer := mem.NewIterator(nil)\n\tdefer iter.Release()\n\treturn (max == nil || (iter.First() && icmp.uCompare(max, internalKey(iter.Key()).ukey()) >= 0)) &&\n\t\t(min == nil || (iter.Last() && icmp.uCompare(min, internalKey(iter.Key()).ukey()) <= 0))\n}\n\n// CompactRange compacts the underlying DB for the given key range.\n// In particular, deleted and overwritten versions are discarded,\n// and the data is rearranged to reduce the cost of operations\n// needed to access the data. This operation should typically only\n// be invoked by users who understand the underlying implementation.\n//\n// A nil Range.Start is treated as a key before all keys in the DB.\n// And a nil Range.Limit is treated as a key after all keys in the DB.\n// Therefore if both is nil then it will compact entire DB.\nfunc (db *DB) CompactRange(r util.Range) error {\n\tif err := db.ok(); err != nil {\n\t\treturn err\n\t}\n\n\t// Lock writer.\n\tselect {\n\tcase db.writeLockC <- struct{}{}:\n\tcase err := <-db.compPerErrC:\n\t\treturn err\n\tcase <-db.closeC:\n\t\treturn ErrClosed\n\t}\n\n\t// Check for overlaps in memdb.\n\tmdb := db.getEffectiveMem()\n\tif mdb == nil {\n\t\treturn ErrClosed\n\t}\n\tdefer mdb.decref()\n\tif isMemOverlaps(db.s.icmp, mdb.DB, r.Start, r.Limit) {\n\t\t// Memdb compaction.\n\t\tif _, err := db.rotateMem(0, false); err != nil {\n\t\t\t<-db.writeLockC\n\t\t\treturn err\n\t\t}\n\t\t<-db.writeLockC\n\t\tif err := db.compTriggerWait(db.mcompCmdC); err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\t<-db.writeLockC\n\t}\n\n\t// Table compaction.\n\treturn db.compTriggerRange(db.tcompCmdC, -1, r.Start, r.Limit)\n}\n\n// SetReadOnly makes DB read-only. It will stay read-only until reopened.\nfunc (db *DB) SetReadOnly() error {\n\tif err := db.ok(); err != nil {\n\t\treturn err\n\t}\n\n\t// Lock writer.\n\tselect {\n\tcase db.writeLockC <- struct{}{}:\n\t\tdb.compWriteLocking = true\n\tcase err := <-db.compPerErrC:\n\t\treturn err\n\tcase <-db.closeC:\n\t\treturn ErrClosed\n\t}\n\n\t// Set compaction read-only.\n\tselect {\n\tcase db.compErrSetC <- ErrReadOnly:\n\tcase perr := <-db.compPerErrC:\n\t\treturn perr\n\tcase <-db.closeC:\n\t\treturn ErrClosed\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/doc.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package leveldb provides implementation of LevelDB key/value database.\n//\n// Create or open a database:\n//\n//\t// The returned DB instance is safe for concurrent use. Which mean that all\n//\t// DB's methods may be called concurrently from multiple goroutine.\n//\tdb, err := leveldb.OpenFile(\"path/to/db\", nil)\n//\t...\n//\tdefer db.Close()\n//\t...\n//\n// Read or modify the database content:\n//\n//\t// Remember that the contents of the returned slice should not be modified.\n//\tdata, err := db.Get([]byte(\"key\"), nil)\n//\t...\n//\terr = db.Put([]byte(\"key\"), []byte(\"value\"), nil)\n//\t...\n//\terr = db.Delete([]byte(\"key\"), nil)\n//\t...\n//\n// Iterate over database content:\n//\n//\titer := db.NewIterator(nil, nil)\n//\tfor iter.Next() {\n//\t\t// Remember that the contents of the returned slice should not be modified, and\n//\t\t// only valid until the next call to Next.\n//\t\tkey := iter.Key()\n//\t\tvalue := iter.Value()\n//\t\t...\n//\t}\n//\titer.Release()\n//\terr = iter.Error()\n//\t...\n//\n// Iterate over subset of database content with a particular prefix:\n//\titer := db.NewIterator(util.BytesPrefix([]byte(\"foo-\")), nil)\n//\tfor iter.Next() {\n//\t\t// Use key/value.\n//\t\t...\n//\t}\n//\titer.Release()\n//\terr = iter.Error()\n//\t...\n//\n// Seek-then-Iterate:\n//\n// \titer := db.NewIterator(nil, nil)\n// \tfor ok := iter.Seek(key); ok; ok = iter.Next() {\n// \t\t// Use key/value.\n// \t\t...\n// \t}\n// \titer.Release()\n// \terr = iter.Error()\n// \t...\n//\n// Iterate over subset of database content:\n//\n// \titer := db.NewIterator(&util.Range{Start: []byte(\"foo\"), Limit: []byte(\"xoo\")}, nil)\n// \tfor iter.Next() {\n// \t\t// Use key/value.\n// \t\t...\n// \t}\n// \titer.Release()\n// \terr = iter.Error()\n// \t...\n//\n// Batch writes:\n//\n//\tbatch := new(leveldb.Batch)\n//\tbatch.Put([]byte(\"foo\"), []byte(\"value\"))\n//\tbatch.Put([]byte(\"bar\"), []byte(\"another value\"))\n//\tbatch.Delete([]byte(\"baz\"))\n//\terr = db.Write(batch, nil)\n//\t...\n//\n// Use bloom filter:\n//\n//\to := &opt.Options{\n//\t\tFilter: filter.NewBloomFilter(10),\n//\t}\n//\tdb, err := leveldb.OpenFile(\"path/to/db\", o)\n//\t...\n//\tdefer db.Close()\n//\t...\npackage leveldb\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/errors/errors.go",
    "content": "// Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package errors provides common error types used throughout leveldb.\npackage errors\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// Common errors.\nvar (\n\tErrNotFound    = New(\"leveldb: not found\")\n\tErrReleased    = util.ErrReleased\n\tErrHasReleaser = util.ErrHasReleaser\n)\n\n// New returns an error that formats as the given text.\nfunc New(text string) error {\n\treturn errors.New(text)\n}\n\n// ErrCorrupted is the type that wraps errors that indicate corruption in\n// the database.\ntype ErrCorrupted struct {\n\tFd  storage.FileDesc\n\tErr error\n}\n\nfunc (e *ErrCorrupted) Error() string {\n\tif !e.Fd.Zero() {\n\t\treturn fmt.Sprintf(\"%v [file=%v]\", e.Err, e.Fd)\n\t}\n\treturn e.Err.Error()\n}\n\n// NewErrCorrupted creates new ErrCorrupted error.\nfunc NewErrCorrupted(fd storage.FileDesc, err error) error {\n\treturn &ErrCorrupted{fd, err}\n}\n\n// IsCorrupted returns a boolean indicating whether the error is indicating\n// a corruption.\nfunc IsCorrupted(err error) bool {\n\tswitch err.(type) {\n\tcase *ErrCorrupted:\n\t\treturn true\n\tcase *storage.ErrCorrupted:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// ErrMissingFiles is the type that indicating a corruption due to missing\n// files. ErrMissingFiles always wrapped with ErrCorrupted.\ntype ErrMissingFiles struct {\n\tFds []storage.FileDesc\n}\n\nfunc (e *ErrMissingFiles) Error() string { return \"file missing\" }\n\n// SetFd sets 'file info' of the given error with the given file.\n// Currently only ErrCorrupted is supported, otherwise will do nothing.\nfunc SetFd(err error, fd storage.FileDesc) error {\n\tswitch x := err.(type) {\n\tcase *ErrCorrupted:\n\t\tx.Fd = fd\n\t\treturn x\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/errors.go",
    "content": "// Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n)\n\n// Common errors.\nvar (\n\tErrNotFound         = errors.ErrNotFound\n\tErrReadOnly         = errors.New(\"leveldb: read-only mode\")\n\tErrSnapshotReleased = errors.New(\"leveldb: snapshot released\")\n\tErrIterReleased     = errors.New(\"leveldb: iterator released\")\n\tErrClosed           = errors.New(\"leveldb: closed\")\n)\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage filter\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nfunc bloomHash(key []byte) uint32 {\n\treturn util.Hash(key, 0xbc9f1d34)\n}\n\ntype bloomFilter int\n\n// The bloom filter serializes its parameters and is backward compatible\n// with respect to them. Therefor, its parameters are not added to its\n// name.\nfunc (bloomFilter) Name() string {\n\treturn \"leveldb.BuiltinBloomFilter\"\n}\n\nfunc (f bloomFilter) Contains(filter, key []byte) bool {\n\tnBytes := len(filter) - 1\n\tif nBytes < 1 {\n\t\treturn false\n\t}\n\tnBits := uint32(nBytes * 8)\n\n\t// Use the encoded k so that we can read filters generated by\n\t// bloom filters created using different parameters.\n\tk := filter[nBytes]\n\tif k > 30 {\n\t\t// Reserved for potentially new encodings for short bloom filters.\n\t\t// Consider it a match.\n\t\treturn true\n\t}\n\n\tkh := bloomHash(key)\n\tdelta := (kh >> 17) | (kh << 15) // Rotate right 17 bits\n\tfor j := uint8(0); j < k; j++ {\n\t\tbitpos := kh % nBits\n\t\tif (uint32(filter[bitpos/8]) & (1 << (bitpos % 8))) == 0 {\n\t\t\treturn false\n\t\t}\n\t\tkh += delta\n\t}\n\treturn true\n}\n\nfunc (f bloomFilter) NewGenerator() FilterGenerator {\n\t// Round down to reduce probing cost a little bit.\n\tk := uint8(f * 69 / 100) // 0.69 =~ ln(2)\n\tif k < 1 {\n\t\tk = 1\n\t} else if k > 30 {\n\t\tk = 30\n\t}\n\treturn &bloomFilterGenerator{\n\t\tn: int(f),\n\t\tk: k,\n\t}\n}\n\ntype bloomFilterGenerator struct {\n\tn int\n\tk uint8\n\n\tkeyHashes []uint32\n}\n\nfunc (g *bloomFilterGenerator) Add(key []byte) {\n\t// Use double-hashing to generate a sequence of hash values.\n\t// See analysis in [Kirsch,Mitzenmacher 2006].\n\tg.keyHashes = append(g.keyHashes, bloomHash(key))\n}\n\nfunc (g *bloomFilterGenerator) Generate(b Buffer) {\n\t// Compute bloom filter size (in both bits and bytes)\n\tnBits := uint32(len(g.keyHashes) * g.n)\n\t// For small n, we can see a very high false positive rate.  Fix it\n\t// by enforcing a minimum bloom filter length.\n\tif nBits < 64 {\n\t\tnBits = 64\n\t}\n\tnBytes := (nBits + 7) / 8\n\tnBits = nBytes * 8\n\n\tdest := b.Alloc(int(nBytes) + 1)\n\tdest[nBytes] = g.k\n\tfor _, kh := range g.keyHashes {\n\t\tdelta := (kh >> 17) | (kh << 15) // Rotate right 17 bits\n\t\tfor j := uint8(0); j < g.k; j++ {\n\t\t\tbitpos := kh % nBits\n\t\t\tdest[bitpos/8] |= (1 << (bitpos % 8))\n\t\t\tkh += delta\n\t\t}\n\t}\n\n\tg.keyHashes = g.keyHashes[:0]\n}\n\n// NewBloomFilter creates a new initialized bloom filter for given\n// bitsPerKey.\n//\n// Since bitsPerKey is persisted individually for each bloom filter\n// serialization, bloom filters are backwards compatible with respect to\n// changing bitsPerKey. This means that no big performance penalty will\n// be experienced when changing the parameter. See documentation for\n// opt.Options.Filter for more information.\nfunc NewBloomFilter(bitsPerKey int) Filter {\n\treturn bloomFilter(bitsPerKey)\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/filter/filter.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package filter provides interface and implementation of probabilistic\n// data structure.\n//\n// The filter is resposible for creating small filter from a set of keys.\n// These filter will then used to test whether a key is a member of the set.\n// In many cases, a filter can cut down the number of disk seeks from a\n// handful to a single disk seek per DB.Get call.\npackage filter\n\n// Buffer is the interface that wraps basic Alloc, Write and WriteByte methods.\ntype Buffer interface {\n\t// Alloc allocs n bytes of slice from the buffer. This also advancing\n\t// write offset.\n\tAlloc(n int) []byte\n\n\t// Write appends the contents of p to the buffer.\n\tWrite(p []byte) (n int, err error)\n\n\t// WriteByte appends the byte c to the buffer.\n\tWriteByte(c byte) error\n}\n\n// Filter is the filter.\ntype Filter interface {\n\t// Name returns the name of this policy.\n\t//\n\t// Note that if the filter encoding changes in an incompatible way,\n\t// the name returned by this method must be changed. Otherwise, old\n\t// incompatible filters may be passed to methods of this type.\n\tName() string\n\n\t// NewGenerator creates a new filter generator.\n\tNewGenerator() FilterGenerator\n\n\t// Contains returns true if the filter contains the given key.\n\t//\n\t// The filter are filters generated by the filter generator.\n\tContains(filter, key []byte) bool\n}\n\n// FilterGenerator is the filter generator.\ntype FilterGenerator interface {\n\t// Add adds a key to the filter generator.\n\t//\n\t// The key may become invalid after call to this method end, therefor\n\t// key must be copied if implementation require keeping key for later\n\t// use. The key should not modified directly, doing so may cause\n\t// undefined results.\n\tAdd(key []byte)\n\n\t// Generate generates filters based on keys passed so far. After call\n\t// to Generate the filter generator maybe resetted, depends on implementation.\n\tGenerate(b Buffer)\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/filter.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/filter\"\n)\n\ntype iFilter struct {\n\tfilter.Filter\n}\n\nfunc (f iFilter) Contains(filter, key []byte) bool {\n\treturn f.Filter.Contains(filter, internalKey(key).ukey())\n}\n\nfunc (f iFilter) NewGenerator() filter.FilterGenerator {\n\treturn iFilterGenerator{f.Filter.NewGenerator()}\n}\n\ntype iFilterGenerator struct {\n\tfilter.FilterGenerator\n}\n\nfunc (g iFilterGenerator) Add(key []byte) {\n\tg.FilterGenerator.Add(internalKey(key).ukey())\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go",
    "content": "// Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage iterator\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// BasicArray is the interface that wraps basic Len and Search method.\ntype BasicArray interface {\n\t// Len returns length of the array.\n\tLen() int\n\n\t// Search finds smallest index that point to a key that is greater\n\t// than or equal to the given key.\n\tSearch(key []byte) int\n}\n\n// Array is the interface that wraps BasicArray and basic Index method.\ntype Array interface {\n\tBasicArray\n\n\t// Index returns key/value pair with index of i.\n\tIndex(i int) (key, value []byte)\n}\n\n// Array is the interface that wraps BasicArray and basic Get method.\ntype ArrayIndexer interface {\n\tBasicArray\n\n\t// Get returns a new data iterator with index of i.\n\tGet(i int) Iterator\n}\n\ntype basicArrayIterator struct {\n\tutil.BasicReleaser\n\tarray BasicArray\n\tpos   int\n\terr   error\n}\n\nfunc (i *basicArrayIterator) Valid() bool {\n\treturn i.pos >= 0 && i.pos < i.array.Len() && !i.Released()\n}\n\nfunc (i *basicArrayIterator) First() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.array.Len() == 0 {\n\t\ti.pos = -1\n\t\treturn false\n\t}\n\ti.pos = 0\n\treturn true\n}\n\nfunc (i *basicArrayIterator) Last() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tn := i.array.Len()\n\tif n == 0 {\n\t\ti.pos = 0\n\t\treturn false\n\t}\n\ti.pos = n - 1\n\treturn true\n}\n\nfunc (i *basicArrayIterator) Seek(key []byte) bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tn := i.array.Len()\n\tif n == 0 {\n\t\ti.pos = 0\n\t\treturn false\n\t}\n\ti.pos = i.array.Search(key)\n\tif i.pos >= n {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (i *basicArrayIterator) Next() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\ti.pos++\n\tif n := i.array.Len(); i.pos >= n {\n\t\ti.pos = n\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (i *basicArrayIterator) Prev() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\ti.pos--\n\tif i.pos < 0 {\n\t\ti.pos = -1\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (i *basicArrayIterator) Error() error { return i.err }\n\ntype arrayIterator struct {\n\tbasicArrayIterator\n\tarray      Array\n\tpos        int\n\tkey, value []byte\n}\n\nfunc (i *arrayIterator) updateKV() {\n\tif i.pos == i.basicArrayIterator.pos {\n\t\treturn\n\t}\n\ti.pos = i.basicArrayIterator.pos\n\tif i.Valid() {\n\t\ti.key, i.value = i.array.Index(i.pos)\n\t} else {\n\t\ti.key = nil\n\t\ti.value = nil\n\t}\n}\n\nfunc (i *arrayIterator) Key() []byte {\n\ti.updateKV()\n\treturn i.key\n}\n\nfunc (i *arrayIterator) Value() []byte {\n\ti.updateKV()\n\treturn i.value\n}\n\ntype arrayIteratorIndexer struct {\n\tbasicArrayIterator\n\tarray ArrayIndexer\n}\n\nfunc (i *arrayIteratorIndexer) Get() Iterator {\n\tif i.Valid() {\n\t\treturn i.array.Get(i.basicArrayIterator.pos)\n\t}\n\treturn nil\n}\n\n// NewArrayIterator returns an iterator from the given array.\nfunc NewArrayIterator(array Array) Iterator {\n\treturn &arrayIterator{\n\t\tbasicArrayIterator: basicArrayIterator{array: array, pos: -1},\n\t\tarray:              array,\n\t\tpos:                -1,\n\t}\n}\n\n// NewArrayIndexer returns an index iterator from the given array.\nfunc NewArrayIndexer(array ArrayIndexer) IteratorIndexer {\n\treturn &arrayIteratorIndexer{\n\t\tbasicArrayIterator: basicArrayIterator{array: array, pos: -1},\n\t\tarray:              array,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage iterator\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// IteratorIndexer is the interface that wraps CommonIterator and basic Get\n// method. IteratorIndexer provides index for indexed iterator.\ntype IteratorIndexer interface {\n\tCommonIterator\n\n\t// Get returns a new data iterator for the current position, or nil if\n\t// done.\n\tGet() Iterator\n}\n\ntype indexedIterator struct {\n\tutil.BasicReleaser\n\tindex  IteratorIndexer\n\tstrict bool\n\n\tdata   Iterator\n\terr    error\n\terrf   func(err error)\n\tclosed bool\n}\n\nfunc (i *indexedIterator) setData() {\n\tif i.data != nil {\n\t\ti.data.Release()\n\t}\n\ti.data = i.index.Get()\n}\n\nfunc (i *indexedIterator) clearData() {\n\tif i.data != nil {\n\t\ti.data.Release()\n\t}\n\ti.data = nil\n}\n\nfunc (i *indexedIterator) indexErr() {\n\tif err := i.index.Error(); err != nil {\n\t\tif i.errf != nil {\n\t\t\ti.errf(err)\n\t\t}\n\t\ti.err = err\n\t}\n}\n\nfunc (i *indexedIterator) dataErr() bool {\n\tif err := i.data.Error(); err != nil {\n\t\tif i.errf != nil {\n\t\t\ti.errf(err)\n\t\t}\n\t\tif i.strict || !errors.IsCorrupted(err) {\n\t\t\ti.err = err\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (i *indexedIterator) Valid() bool {\n\treturn i.data != nil && i.data.Valid()\n}\n\nfunc (i *indexedIterator) First() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif !i.index.First() {\n\t\ti.indexErr()\n\t\ti.clearData()\n\t\treturn false\n\t}\n\ti.setData()\n\treturn i.Next()\n}\n\nfunc (i *indexedIterator) Last() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif !i.index.Last() {\n\t\ti.indexErr()\n\t\ti.clearData()\n\t\treturn false\n\t}\n\ti.setData()\n\tif !i.data.Last() {\n\t\tif i.dataErr() {\n\t\t\treturn false\n\t\t}\n\t\ti.clearData()\n\t\treturn i.Prev()\n\t}\n\treturn true\n}\n\nfunc (i *indexedIterator) Seek(key []byte) bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif !i.index.Seek(key) {\n\t\ti.indexErr()\n\t\ti.clearData()\n\t\treturn false\n\t}\n\ti.setData()\n\tif !i.data.Seek(key) {\n\t\tif i.dataErr() {\n\t\t\treturn false\n\t\t}\n\t\ti.clearData()\n\t\treturn i.Next()\n\t}\n\treturn true\n}\n\nfunc (i *indexedIterator) Next() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tswitch {\n\tcase i.data != nil && !i.data.Next():\n\t\tif i.dataErr() {\n\t\t\treturn false\n\t\t}\n\t\ti.clearData()\n\t\tfallthrough\n\tcase i.data == nil:\n\t\tif !i.index.Next() {\n\t\t\ti.indexErr()\n\t\t\treturn false\n\t\t}\n\t\ti.setData()\n\t\treturn i.Next()\n\t}\n\treturn true\n}\n\nfunc (i *indexedIterator) Prev() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tswitch {\n\tcase i.data != nil && !i.data.Prev():\n\t\tif i.dataErr() {\n\t\t\treturn false\n\t\t}\n\t\ti.clearData()\n\t\tfallthrough\n\tcase i.data == nil:\n\t\tif !i.index.Prev() {\n\t\t\ti.indexErr()\n\t\t\treturn false\n\t\t}\n\t\ti.setData()\n\t\tif !i.data.Last() {\n\t\t\tif i.dataErr() {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\ti.clearData()\n\t\t\treturn i.Prev()\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (i *indexedIterator) Key() []byte {\n\tif i.data == nil {\n\t\treturn nil\n\t}\n\treturn i.data.Key()\n}\n\nfunc (i *indexedIterator) Value() []byte {\n\tif i.data == nil {\n\t\treturn nil\n\t}\n\treturn i.data.Value()\n}\n\nfunc (i *indexedIterator) Release() {\n\ti.clearData()\n\ti.index.Release()\n\ti.BasicReleaser.Release()\n}\n\nfunc (i *indexedIterator) Error() error {\n\tif i.err != nil {\n\t\treturn i.err\n\t}\n\tif err := i.index.Error(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (i *indexedIterator) SetErrorCallback(f func(err error)) {\n\ti.errf = f\n}\n\n// NewIndexedIterator returns an 'indexed iterator'. An index is iterator\n// that returns another iterator, a 'data iterator'. A 'data iterator' is the\n// iterator that contains actual key/value pairs.\n//\n// If strict is true the any 'corruption errors' (i.e errors.IsCorrupted(err) == true)\n// won't be ignored and will halt 'indexed iterator', otherwise the iterator will\n// continue to the next 'data iterator'. Corruption on 'index iterator' will not be\n// ignored and will halt the iterator.\nfunc NewIndexedIterator(index IteratorIndexer, strict bool) Iterator {\n\treturn &indexedIterator{index: index, strict: strict}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package iterator provides interface and implementation to traverse over\n// contents of a database.\npackage iterator\n\nimport (\n\t\"errors\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nvar (\n\tErrIterReleased = errors.New(\"leveldb/iterator: iterator released\")\n)\n\n// IteratorSeeker is the interface that wraps the 'seeks method'.\ntype IteratorSeeker interface {\n\t// First moves the iterator to the first key/value pair. If the iterator\n\t// only contains one key/value pair then First and Last would moves\n\t// to the same key/value pair.\n\t// It returns whether such pair exist.\n\tFirst() bool\n\n\t// Last moves the iterator to the last key/value pair. If the iterator\n\t// only contains one key/value pair then First and Last would moves\n\t// to the same key/value pair.\n\t// It returns whether such pair exist.\n\tLast() bool\n\n\t// Seek moves the iterator to the first key/value pair whose key is greater\n\t// than or equal to the given key.\n\t// It returns whether such pair exist.\n\t//\n\t// It is safe to modify the contents of the argument after Seek returns.\n\tSeek(key []byte) bool\n\n\t// Next moves the iterator to the next key/value pair.\n\t// It returns whether the iterator is exhausted.\n\tNext() bool\n\n\t// Prev moves the iterator to the previous key/value pair.\n\t// It returns whether the iterator is exhausted.\n\tPrev() bool\n}\n\n// CommonIterator is the interface that wraps common iterator methods.\ntype CommonIterator interface {\n\tIteratorSeeker\n\n\t// util.Releaser is the interface that wraps basic Release method.\n\t// When called Release will releases any resources associated with the\n\t// iterator.\n\tutil.Releaser\n\n\t// util.ReleaseSetter is the interface that wraps the basic SetReleaser\n\t// method.\n\tutil.ReleaseSetter\n\n\t// TODO: Remove this when ready.\n\tValid() bool\n\n\t// Error returns any accumulated error. Exhausting all the key/value pairs\n\t// is not considered to be an error.\n\tError() error\n}\n\n// Iterator iterates over a DB's key/value pairs in key order.\n//\n// When encounter an error any 'seeks method' will return false and will\n// yield no key/value pairs. The error can be queried by calling the Error\n// method. Calling Release is still necessary.\n//\n// An iterator must be released after use, but it is not necessary to read\n// an iterator until exhaustion.\n// Also, an iterator is not necessarily safe for concurrent use, but it is\n// safe to use multiple iterators concurrently, with each in a dedicated\n// goroutine.\ntype Iterator interface {\n\tCommonIterator\n\n\t// Key returns the key of the current key/value pair, or nil if done.\n\t// The caller should not modify the contents of the returned slice, and\n\t// its contents may change on the next call to any 'seeks method'.\n\tKey() []byte\n\n\t// Value returns the value of the current key/value pair, or nil if done.\n\t// The caller should not modify the contents of the returned slice, and\n\t// its contents may change on the next call to any 'seeks method'.\n\tValue() []byte\n}\n\n// ErrorCallbackSetter is the interface that wraps basic SetErrorCallback\n// method.\n//\n// ErrorCallbackSetter implemented by indexed and merged iterator.\ntype ErrorCallbackSetter interface {\n\t// SetErrorCallback allows set an error callback of the corresponding\n\t// iterator. Use nil to clear the callback.\n\tSetErrorCallback(f func(err error))\n}\n\ntype emptyIterator struct {\n\tutil.BasicReleaser\n\terr error\n}\n\nfunc (i *emptyIterator) rErr() {\n\tif i.err == nil && i.Released() {\n\t\ti.err = ErrIterReleased\n\t}\n}\n\nfunc (*emptyIterator) Valid() bool            { return false }\nfunc (i *emptyIterator) First() bool          { i.rErr(); return false }\nfunc (i *emptyIterator) Last() bool           { i.rErr(); return false }\nfunc (i *emptyIterator) Seek(key []byte) bool { i.rErr(); return false }\nfunc (i *emptyIterator) Next() bool           { i.rErr(); return false }\nfunc (i *emptyIterator) Prev() bool           { i.rErr(); return false }\nfunc (*emptyIterator) Key() []byte            { return nil }\nfunc (*emptyIterator) Value() []byte          { return nil }\nfunc (i *emptyIterator) Error() error         { return i.err }\n\n// NewEmptyIterator creates an empty iterator. The err parameter can be\n// nil, but if not nil the given err will be returned by Error method.\nfunc NewEmptyIterator(err error) Iterator {\n\treturn &emptyIterator{err: err}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage iterator\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/comparer\"\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\ntype dir int\n\nconst (\n\tdirReleased dir = iota - 1\n\tdirSOI\n\tdirEOI\n\tdirBackward\n\tdirForward\n)\n\ntype mergedIterator struct {\n\tcmp    comparer.Comparer\n\titers  []Iterator\n\tstrict bool\n\n\tkeys     [][]byte\n\tindex    int\n\tdir      dir\n\terr      error\n\terrf     func(err error)\n\treleaser util.Releaser\n}\n\nfunc assertKey(key []byte) []byte {\n\tif key == nil {\n\t\tpanic(\"leveldb/iterator: nil key\")\n\t}\n\treturn key\n}\n\nfunc (i *mergedIterator) iterErr(iter Iterator) bool {\n\tif err := iter.Error(); err != nil {\n\t\tif i.errf != nil {\n\t\t\ti.errf(err)\n\t\t}\n\t\tif i.strict || !errors.IsCorrupted(err) {\n\t\t\ti.err = err\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (i *mergedIterator) Valid() bool {\n\treturn i.err == nil && i.dir > dirEOI\n}\n\nfunc (i *mergedIterator) First() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tfor x, iter := range i.iters {\n\t\tswitch {\n\t\tcase iter.First():\n\t\t\ti.keys[x] = assertKey(iter.Key())\n\t\tcase i.iterErr(iter):\n\t\t\treturn false\n\t\tdefault:\n\t\t\ti.keys[x] = nil\n\t\t}\n\t}\n\ti.dir = dirSOI\n\treturn i.next()\n}\n\nfunc (i *mergedIterator) Last() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tfor x, iter := range i.iters {\n\t\tswitch {\n\t\tcase iter.Last():\n\t\t\ti.keys[x] = assertKey(iter.Key())\n\t\tcase i.iterErr(iter):\n\t\t\treturn false\n\t\tdefault:\n\t\t\ti.keys[x] = nil\n\t\t}\n\t}\n\ti.dir = dirEOI\n\treturn i.prev()\n}\n\nfunc (i *mergedIterator) Seek(key []byte) bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tfor x, iter := range i.iters {\n\t\tswitch {\n\t\tcase iter.Seek(key):\n\t\t\ti.keys[x] = assertKey(iter.Key())\n\t\tcase i.iterErr(iter):\n\t\t\treturn false\n\t\tdefault:\n\t\t\ti.keys[x] = nil\n\t\t}\n\t}\n\ti.dir = dirSOI\n\treturn i.next()\n}\n\nfunc (i *mergedIterator) next() bool {\n\tvar key []byte\n\tif i.dir == dirForward {\n\t\tkey = i.keys[i.index]\n\t}\n\tfor x, tkey := range i.keys {\n\t\tif tkey != nil && (key == nil || i.cmp.Compare(tkey, key) < 0) {\n\t\t\tkey = tkey\n\t\t\ti.index = x\n\t\t}\n\t}\n\tif key == nil {\n\t\ti.dir = dirEOI\n\t\treturn false\n\t}\n\ti.dir = dirForward\n\treturn true\n}\n\nfunc (i *mergedIterator) Next() bool {\n\tif i.dir == dirEOI || i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tswitch i.dir {\n\tcase dirSOI:\n\t\treturn i.First()\n\tcase dirBackward:\n\t\tkey := append([]byte{}, i.keys[i.index]...)\n\t\tif !i.Seek(key) {\n\t\t\treturn false\n\t\t}\n\t\treturn i.Next()\n\t}\n\n\tx := i.index\n\titer := i.iters[x]\n\tswitch {\n\tcase iter.Next():\n\t\ti.keys[x] = assertKey(iter.Key())\n\tcase i.iterErr(iter):\n\t\treturn false\n\tdefault:\n\t\ti.keys[x] = nil\n\t}\n\treturn i.next()\n}\n\nfunc (i *mergedIterator) prev() bool {\n\tvar key []byte\n\tif i.dir == dirBackward {\n\t\tkey = i.keys[i.index]\n\t}\n\tfor x, tkey := range i.keys {\n\t\tif tkey != nil && (key == nil || i.cmp.Compare(tkey, key) > 0) {\n\t\t\tkey = tkey\n\t\t\ti.index = x\n\t\t}\n\t}\n\tif key == nil {\n\t\ti.dir = dirSOI\n\t\treturn false\n\t}\n\ti.dir = dirBackward\n\treturn true\n}\n\nfunc (i *mergedIterator) Prev() bool {\n\tif i.dir == dirSOI || i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tswitch i.dir {\n\tcase dirEOI:\n\t\treturn i.Last()\n\tcase dirForward:\n\t\tkey := append([]byte{}, i.keys[i.index]...)\n\t\tfor x, iter := range i.iters {\n\t\t\tif x == i.index {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tseek := iter.Seek(key)\n\t\t\tswitch {\n\t\t\tcase seek && iter.Prev(), !seek && iter.Last():\n\t\t\t\ti.keys[x] = assertKey(iter.Key())\n\t\t\tcase i.iterErr(iter):\n\t\t\t\treturn false\n\t\t\tdefault:\n\t\t\t\ti.keys[x] = nil\n\t\t\t}\n\t\t}\n\t}\n\n\tx := i.index\n\titer := i.iters[x]\n\tswitch {\n\tcase iter.Prev():\n\t\ti.keys[x] = assertKey(iter.Key())\n\tcase i.iterErr(iter):\n\t\treturn false\n\tdefault:\n\t\ti.keys[x] = nil\n\t}\n\treturn i.prev()\n}\n\nfunc (i *mergedIterator) Key() []byte {\n\tif i.err != nil || i.dir <= dirEOI {\n\t\treturn nil\n\t}\n\treturn i.keys[i.index]\n}\n\nfunc (i *mergedIterator) Value() []byte {\n\tif i.err != nil || i.dir <= dirEOI {\n\t\treturn nil\n\t}\n\treturn i.iters[i.index].Value()\n}\n\nfunc (i *mergedIterator) Release() {\n\tif i.dir != dirReleased {\n\t\ti.dir = dirReleased\n\t\tfor _, iter := range i.iters {\n\t\t\titer.Release()\n\t\t}\n\t\ti.iters = nil\n\t\ti.keys = nil\n\t\tif i.releaser != nil {\n\t\t\ti.releaser.Release()\n\t\t\ti.releaser = nil\n\t\t}\n\t}\n}\n\nfunc (i *mergedIterator) SetReleaser(releaser util.Releaser) {\n\tif i.dir == dirReleased {\n\t\tpanic(util.ErrReleased)\n\t}\n\tif i.releaser != nil && releaser != nil {\n\t\tpanic(util.ErrHasReleaser)\n\t}\n\ti.releaser = releaser\n}\n\nfunc (i *mergedIterator) Error() error {\n\treturn i.err\n}\n\nfunc (i *mergedIterator) SetErrorCallback(f func(err error)) {\n\ti.errf = f\n}\n\n// NewMergedIterator returns an iterator that merges its input. Walking the\n// resultant iterator will return all key/value pairs of all input iterators\n// in strictly increasing key order, as defined by cmp.\n// The input's key ranges may overlap, but there are assumed to be no duplicate\n// keys: if iters[i] contains a key k then iters[j] will not contain that key k.\n// None of the iters may be nil.\n//\n// If strict is true the any 'corruption errors' (i.e errors.IsCorrupted(err) == true)\n// won't be ignored and will halt 'merged iterator', otherwise the iterator will\n// continue to the next 'input iterator'.\nfunc NewMergedIterator(iters []Iterator, cmp comparer.Comparer, strict bool) Iterator {\n\treturn &mergedIterator{\n\t\titers:  iters,\n\t\tcmp:    cmp,\n\t\tstrict: strict,\n\t\tkeys:   make([][]byte, len(iters)),\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/journal/journal.go",
    "content": "// Copyright 2011 The LevelDB-Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Taken from: https://code.google.com/p/leveldb-go/source/browse/leveldb/record/record.go?r=1d5ccbe03246da926391ee12d1c6caae054ff4b0\n// License, authors and contributors informations can be found at bellow URLs respectively:\n// \thttps://code.google.com/p/leveldb-go/source/browse/LICENSE\n//\thttps://code.google.com/p/leveldb-go/source/browse/AUTHORS\n//  https://code.google.com/p/leveldb-go/source/browse/CONTRIBUTORS\n\n// Package journal reads and writes sequences of journals. Each journal is a stream\n// of bytes that completes before the next journal starts.\n//\n// When reading, call Next to obtain an io.Reader for the next journal. Next will\n// return io.EOF when there are no more journals. It is valid to call Next\n// without reading the current journal to exhaustion.\n//\n// When writing, call Next to obtain an io.Writer for the next journal. Calling\n// Next finishes the current journal. Call Close to finish the final journal.\n//\n// Optionally, call Flush to finish the current journal and flush the underlying\n// writer without starting a new journal. To start a new journal after flushing,\n// call Next.\n//\n// Neither Readers or Writers are safe to use concurrently.\n//\n// Example code:\n//\tfunc read(r io.Reader) ([]string, error) {\n//\t\tvar ss []string\n//\t\tjournals := journal.NewReader(r, nil, true, true)\n//\t\tfor {\n//\t\t\tj, err := journals.Next()\n//\t\t\tif err == io.EOF {\n//\t\t\t\tbreak\n//\t\t\t}\n//\t\t\tif err != nil {\n//\t\t\t\treturn nil, err\n//\t\t\t}\n//\t\t\ts, err := ioutil.ReadAll(j)\n//\t\t\tif err != nil {\n//\t\t\t\treturn nil, err\n//\t\t\t}\n//\t\t\tss = append(ss, string(s))\n//\t\t}\n//\t\treturn ss, nil\n//\t}\n//\n//\tfunc write(w io.Writer, ss []string) error {\n//\t\tjournals := journal.NewWriter(w)\n//\t\tfor _, s := range ss {\n//\t\t\tj, err := journals.Next()\n//\t\t\tif err != nil {\n//\t\t\t\treturn err\n//\t\t\t}\n//\t\t\tif _, err := j.Write([]byte(s)), err != nil {\n//\t\t\t\treturn err\n//\t\t\t}\n//\t\t}\n//\t\treturn journals.Close()\n//\t}\n//\n// The wire format is that the stream is divided into 32KiB blocks, and each\n// block contains a number of tightly packed chunks. Chunks cannot cross block\n// boundaries. The last block may be shorter than 32 KiB. Any unused bytes in a\n// block must be zero.\n//\n// A journal maps to one or more chunks. Each chunk has a 7 byte header (a 4\n// byte checksum, a 2 byte little-endian uint16 length, and a 1 byte chunk type)\n// followed by a payload. The checksum is over the chunk type and the payload.\n//\n// There are four chunk types: whether the chunk is the full journal, or the\n// first, middle or last chunk of a multi-chunk journal. A multi-chunk journal\n// has one first chunk, zero or more middle chunks, and one last chunk.\n//\n// The wire format allows for limited recovery in the face of data corruption:\n// on a format error (such as a checksum mismatch), the reader moves to the\n// next block and looks for the next full or first chunk.\npackage journal\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// These constants are part of the wire format and should not be changed.\nconst (\n\tfullChunkType   = 1\n\tfirstChunkType  = 2\n\tmiddleChunkType = 3\n\tlastChunkType   = 4\n)\n\nconst (\n\tblockSize  = 32 * 1024\n\theaderSize = 7\n)\n\ntype flusher interface {\n\tFlush() error\n}\n\n// ErrCorrupted is the error type that generated by corrupted block or chunk.\ntype ErrCorrupted struct {\n\tSize   int\n\tReason string\n}\n\nfunc (e *ErrCorrupted) Error() string {\n\treturn fmt.Sprintf(\"leveldb/journal: block/chunk corrupted: %s (%d bytes)\", e.Reason, e.Size)\n}\n\n// Dropper is the interface that wrap simple Drop method. The Drop\n// method will be called when the journal reader dropping a block or chunk.\ntype Dropper interface {\n\tDrop(err error)\n}\n\n// Reader reads journals from an underlying io.Reader.\ntype Reader struct {\n\t// r is the underlying reader.\n\tr io.Reader\n\t// the dropper.\n\tdropper Dropper\n\t// strict flag.\n\tstrict bool\n\t// checksum flag.\n\tchecksum bool\n\t// seq is the sequence number of the current journal.\n\tseq int\n\t// buf[i:j] is the unread portion of the current chunk's payload.\n\t// The low bound, i, excludes the chunk header.\n\ti, j int\n\t// n is the number of bytes of buf that are valid. Once reading has started,\n\t// only the final block can have n < blockSize.\n\tn int\n\t// last is whether the current chunk is the last chunk of the journal.\n\tlast bool\n\t// err is any accumulated error.\n\terr error\n\t// buf is the buffer.\n\tbuf [blockSize]byte\n}\n\n// NewReader returns a new reader. The dropper may be nil, and if\n// strict is true then corrupted or invalid chunk will halt the journal\n// reader entirely.\nfunc NewReader(r io.Reader, dropper Dropper, strict, checksum bool) *Reader {\n\treturn &Reader{\n\t\tr:        r,\n\t\tdropper:  dropper,\n\t\tstrict:   strict,\n\t\tchecksum: checksum,\n\t\tlast:     true,\n\t}\n}\n\nvar errSkip = errors.New(\"leveldb/journal: skipped\")\n\nfunc (r *Reader) corrupt(n int, reason string, skip bool) error {\n\tif r.dropper != nil {\n\t\tr.dropper.Drop(&ErrCorrupted{n, reason})\n\t}\n\tif r.strict && !skip {\n\t\tr.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrCorrupted{n, reason})\n\t\treturn r.err\n\t}\n\treturn errSkip\n}\n\n// nextChunk sets r.buf[r.i:r.j] to hold the next chunk's payload, reading the\n// next block into the buffer if necessary.\nfunc (r *Reader) nextChunk(first bool) error {\n\tfor {\n\t\tif r.j+headerSize <= r.n {\n\t\t\tchecksum := binary.LittleEndian.Uint32(r.buf[r.j+0 : r.j+4])\n\t\t\tlength := binary.LittleEndian.Uint16(r.buf[r.j+4 : r.j+6])\n\t\t\tchunkType := r.buf[r.j+6]\n\t\t\tunprocBlock := r.n - r.j\n\t\t\tif checksum == 0 && length == 0 && chunkType == 0 {\n\t\t\t\t// Drop entire block.\n\t\t\t\tr.i = r.n\n\t\t\t\tr.j = r.n\n\t\t\t\treturn r.corrupt(unprocBlock, \"zero header\", false)\n\t\t\t}\n\t\t\tif chunkType < fullChunkType || chunkType > lastChunkType {\n\t\t\t\t// Drop entire block.\n\t\t\t\tr.i = r.n\n\t\t\t\tr.j = r.n\n\t\t\t\treturn r.corrupt(unprocBlock, fmt.Sprintf(\"invalid chunk type %#x\", chunkType), false)\n\t\t\t}\n\t\t\tr.i = r.j + headerSize\n\t\t\tr.j = r.j + headerSize + int(length)\n\t\t\tif r.j > r.n {\n\t\t\t\t// Drop entire block.\n\t\t\t\tr.i = r.n\n\t\t\t\tr.j = r.n\n\t\t\t\treturn r.corrupt(unprocBlock, \"chunk length overflows block\", false)\n\t\t\t} else if r.checksum && checksum != util.NewCRC(r.buf[r.i-1:r.j]).Value() {\n\t\t\t\t// Drop entire block.\n\t\t\t\tr.i = r.n\n\t\t\t\tr.j = r.n\n\t\t\t\treturn r.corrupt(unprocBlock, \"checksum mismatch\", false)\n\t\t\t}\n\t\t\tif first && chunkType != fullChunkType && chunkType != firstChunkType {\n\t\t\t\tchunkLength := (r.j - r.i) + headerSize\n\t\t\t\tr.i = r.j\n\t\t\t\t// Report the error, but skip it.\n\t\t\t\treturn r.corrupt(chunkLength, \"orphan chunk\", true)\n\t\t\t}\n\t\t\tr.last = chunkType == fullChunkType || chunkType == lastChunkType\n\t\t\treturn nil\n\t\t}\n\n\t\t// The last block.\n\t\tif r.n < blockSize && r.n > 0 {\n\t\t\tif !first {\n\t\t\t\treturn r.corrupt(0, \"missing chunk part\", false)\n\t\t\t}\n\t\t\tr.err = io.EOF\n\t\t\treturn r.err\n\t\t}\n\n\t\t// Read block.\n\t\tn, err := io.ReadFull(r.r, r.buf[:])\n\t\tif err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {\n\t\t\treturn err\n\t\t}\n\t\tif n == 0 {\n\t\t\tif !first {\n\t\t\t\treturn r.corrupt(0, \"missing chunk part\", false)\n\t\t\t}\n\t\t\tr.err = io.EOF\n\t\t\treturn r.err\n\t\t}\n\t\tr.i, r.j, r.n = 0, 0, n\n\t}\n}\n\n// Next returns a reader for the next journal. It returns io.EOF if there are no\n// more journals. The reader returned becomes stale after the next Next call,\n// and should no longer be used. If strict is false, the reader will returns\n// io.ErrUnexpectedEOF error when found corrupted journal.\nfunc (r *Reader) Next() (io.Reader, error) {\n\tr.seq++\n\tif r.err != nil {\n\t\treturn nil, r.err\n\t}\n\tr.i = r.j\n\tfor {\n\t\tif err := r.nextChunk(true); err == nil {\n\t\t\tbreak\n\t\t} else if err != errSkip {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn &singleReader{r, r.seq, nil}, nil\n}\n\n// Reset resets the journal reader, allows reuse of the journal reader. Reset returns\n// last accumulated error.\nfunc (r *Reader) Reset(reader io.Reader, dropper Dropper, strict, checksum bool) error {\n\tr.seq++\n\terr := r.err\n\tr.r = reader\n\tr.dropper = dropper\n\tr.strict = strict\n\tr.checksum = checksum\n\tr.i = 0\n\tr.j = 0\n\tr.n = 0\n\tr.last = true\n\tr.err = nil\n\treturn err\n}\n\ntype singleReader struct {\n\tr   *Reader\n\tseq int\n\terr error\n}\n\nfunc (x *singleReader) Read(p []byte) (int, error) {\n\tr := x.r\n\tif r.seq != x.seq {\n\t\treturn 0, errors.New(\"leveldb/journal: stale reader\")\n\t}\n\tif x.err != nil {\n\t\treturn 0, x.err\n\t}\n\tif r.err != nil {\n\t\treturn 0, r.err\n\t}\n\tfor r.i == r.j {\n\t\tif r.last {\n\t\t\treturn 0, io.EOF\n\t\t}\n\t\tx.err = r.nextChunk(false)\n\t\tif x.err != nil {\n\t\t\tif x.err == errSkip {\n\t\t\t\tx.err = io.ErrUnexpectedEOF\n\t\t\t}\n\t\t\treturn 0, x.err\n\t\t}\n\t}\n\tn := copy(p, r.buf[r.i:r.j])\n\tr.i += n\n\treturn n, nil\n}\n\nfunc (x *singleReader) ReadByte() (byte, error) {\n\tr := x.r\n\tif r.seq != x.seq {\n\t\treturn 0, errors.New(\"leveldb/journal: stale reader\")\n\t}\n\tif x.err != nil {\n\t\treturn 0, x.err\n\t}\n\tif r.err != nil {\n\t\treturn 0, r.err\n\t}\n\tfor r.i == r.j {\n\t\tif r.last {\n\t\t\treturn 0, io.EOF\n\t\t}\n\t\tx.err = r.nextChunk(false)\n\t\tif x.err != nil {\n\t\t\tif x.err == errSkip {\n\t\t\t\tx.err = io.ErrUnexpectedEOF\n\t\t\t}\n\t\t\treturn 0, x.err\n\t\t}\n\t}\n\tc := r.buf[r.i]\n\tr.i++\n\treturn c, nil\n}\n\n// Writer writes journals to an underlying io.Writer.\ntype Writer struct {\n\t// w is the underlying writer.\n\tw io.Writer\n\t// seq is the sequence number of the current journal.\n\tseq int\n\t// f is w as a flusher.\n\tf flusher\n\t// buf[i:j] is the bytes that will become the current chunk.\n\t// The low bound, i, includes the chunk header.\n\ti, j int\n\t// buf[:written] has already been written to w.\n\t// written is zero unless Flush has been called.\n\twritten int\n\t// first is whether the current chunk is the first chunk of the journal.\n\tfirst bool\n\t// pending is whether a chunk is buffered but not yet written.\n\tpending bool\n\t// err is any accumulated error.\n\terr error\n\t// buf is the buffer.\n\tbuf [blockSize]byte\n}\n\n// NewWriter returns a new Writer.\nfunc NewWriter(w io.Writer) *Writer {\n\tf, _ := w.(flusher)\n\treturn &Writer{\n\t\tw: w,\n\t\tf: f,\n\t}\n}\n\n// fillHeader fills in the header for the pending chunk.\nfunc (w *Writer) fillHeader(last bool) {\n\tif w.i+headerSize > w.j || w.j > blockSize {\n\t\tpanic(\"leveldb/journal: bad writer state\")\n\t}\n\tif last {\n\t\tif w.first {\n\t\t\tw.buf[w.i+6] = fullChunkType\n\t\t} else {\n\t\t\tw.buf[w.i+6] = lastChunkType\n\t\t}\n\t} else {\n\t\tif w.first {\n\t\t\tw.buf[w.i+6] = firstChunkType\n\t\t} else {\n\t\t\tw.buf[w.i+6] = middleChunkType\n\t\t}\n\t}\n\tbinary.LittleEndian.PutUint32(w.buf[w.i+0:w.i+4], util.NewCRC(w.buf[w.i+6:w.j]).Value())\n\tbinary.LittleEndian.PutUint16(w.buf[w.i+4:w.i+6], uint16(w.j-w.i-headerSize))\n}\n\n// writeBlock writes the buffered block to the underlying writer, and reserves\n// space for the next chunk's header.\nfunc (w *Writer) writeBlock() {\n\t_, w.err = w.w.Write(w.buf[w.written:])\n\tw.i = 0\n\tw.j = headerSize\n\tw.written = 0\n}\n\n// writePending finishes the current journal and writes the buffer to the\n// underlying writer.\nfunc (w *Writer) writePending() {\n\tif w.err != nil {\n\t\treturn\n\t}\n\tif w.pending {\n\t\tw.fillHeader(true)\n\t\tw.pending = false\n\t}\n\t_, w.err = w.w.Write(w.buf[w.written:w.j])\n\tw.written = w.j\n}\n\n// Close finishes the current journal and closes the writer.\nfunc (w *Writer) Close() error {\n\tw.seq++\n\tw.writePending()\n\tif w.err != nil {\n\t\treturn w.err\n\t}\n\tw.err = errors.New(\"leveldb/journal: closed Writer\")\n\treturn nil\n}\n\n// Flush finishes the current journal, writes to the underlying writer, and\n// flushes it if that writer implements interface{ Flush() error }.\nfunc (w *Writer) Flush() error {\n\tw.seq++\n\tw.writePending()\n\tif w.err != nil {\n\t\treturn w.err\n\t}\n\tif w.f != nil {\n\t\tw.err = w.f.Flush()\n\t\treturn w.err\n\t}\n\treturn nil\n}\n\n// Reset resets the journal writer, allows reuse of the journal writer. Reset\n// will also closes the journal writer if not already.\nfunc (w *Writer) Reset(writer io.Writer) (err error) {\n\tw.seq++\n\tif w.err == nil {\n\t\tw.writePending()\n\t\terr = w.err\n\t}\n\tw.w = writer\n\tw.f, _ = writer.(flusher)\n\tw.i = 0\n\tw.j = 0\n\tw.written = 0\n\tw.first = false\n\tw.pending = false\n\tw.err = nil\n\treturn\n}\n\n// Next returns a writer for the next journal. The writer returned becomes stale\n// after the next Close, Flush or Next call, and should no longer be used.\nfunc (w *Writer) Next() (io.Writer, error) {\n\tw.seq++\n\tif w.err != nil {\n\t\treturn nil, w.err\n\t}\n\tif w.pending {\n\t\tw.fillHeader(true)\n\t}\n\tw.i = w.j\n\tw.j = w.j + headerSize\n\t// Check if there is room in the block for the header.\n\tif w.j > blockSize {\n\t\t// Fill in the rest of the block with zeroes.\n\t\tfor k := w.i; k < blockSize; k++ {\n\t\t\tw.buf[k] = 0\n\t\t}\n\t\tw.writeBlock()\n\t\tif w.err != nil {\n\t\t\treturn nil, w.err\n\t\t}\n\t}\n\tw.first = true\n\tw.pending = true\n\treturn singleWriter{w, w.seq}, nil\n}\n\ntype singleWriter struct {\n\tw   *Writer\n\tseq int\n}\n\nfunc (x singleWriter) Write(p []byte) (int, error) {\n\tw := x.w\n\tif w.seq != x.seq {\n\t\treturn 0, errors.New(\"leveldb/journal: stale writer\")\n\t}\n\tif w.err != nil {\n\t\treturn 0, w.err\n\t}\n\tn0 := len(p)\n\tfor len(p) > 0 {\n\t\t// Write a block, if it is full.\n\t\tif w.j == blockSize {\n\t\t\tw.fillHeader(false)\n\t\t\tw.writeBlock()\n\t\t\tif w.err != nil {\n\t\t\t\treturn 0, w.err\n\t\t\t}\n\t\t\tw.first = false\n\t\t}\n\t\t// Copy bytes into the buffer.\n\t\tn := copy(w.buf[w.j:], p)\n\t\tw.j += n\n\t\tp = p[n:]\n\t}\n\treturn n0, nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/key.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\n// ErrInternalKeyCorrupted records internal key corruption.\ntype ErrInternalKeyCorrupted struct {\n\tIkey   []byte\n\tReason string\n}\n\nfunc (e *ErrInternalKeyCorrupted) Error() string {\n\treturn fmt.Sprintf(\"leveldb: internal key %q corrupted: %s\", e.Ikey, e.Reason)\n}\n\nfunc newErrInternalKeyCorrupted(ikey []byte, reason string) error {\n\treturn errors.NewErrCorrupted(storage.FileDesc{}, &ErrInternalKeyCorrupted{append([]byte{}, ikey...), reason})\n}\n\ntype keyType uint\n\nfunc (kt keyType) String() string {\n\tswitch kt {\n\tcase keyTypeDel:\n\t\treturn \"d\"\n\tcase keyTypeVal:\n\t\treturn \"v\"\n\t}\n\treturn fmt.Sprintf(\"<invalid:%#x>\", uint(kt))\n}\n\n// Value types encoded as the last component of internal keys.\n// Don't modify; this value are saved to disk.\nconst (\n\tkeyTypeDel = keyType(0)\n\tkeyTypeVal = keyType(1)\n)\n\n// keyTypeSeek defines the keyType that should be passed when constructing an\n// internal key for seeking to a particular sequence number (since we\n// sort sequence numbers in decreasing order and the value type is\n// embedded as the low 8 bits in the sequence number in internal keys,\n// we need to use the highest-numbered ValueType, not the lowest).\nconst keyTypeSeek = keyTypeVal\n\nconst (\n\t// Maximum value possible for sequence number; the 8-bits are\n\t// used by value type, so its can packed together in single\n\t// 64-bit integer.\n\tkeyMaxSeq = (uint64(1) << 56) - 1\n\t// Maximum value possible for packed sequence number and type.\n\tkeyMaxNum = (keyMaxSeq << 8) | uint64(keyTypeSeek)\n)\n\n// Maximum number encoded in bytes.\nvar keyMaxNumBytes = make([]byte, 8)\n\nfunc init() {\n\tbinary.LittleEndian.PutUint64(keyMaxNumBytes, keyMaxNum)\n}\n\ntype internalKey []byte\n\nfunc makeInternalKey(dst, ukey []byte, seq uint64, kt keyType) internalKey {\n\tif seq > keyMaxSeq {\n\t\tpanic(\"leveldb: invalid sequence number\")\n\t} else if kt > keyTypeVal {\n\t\tpanic(\"leveldb: invalid type\")\n\t}\n\n\tdst = ensureBuffer(dst, len(ukey)+8)\n\tcopy(dst, ukey)\n\tbinary.LittleEndian.PutUint64(dst[len(ukey):], (seq<<8)|uint64(kt))\n\treturn internalKey(dst)\n}\n\nfunc parseInternalKey(ik []byte) (ukey []byte, seq uint64, kt keyType, err error) {\n\tif len(ik) < 8 {\n\t\treturn nil, 0, 0, newErrInternalKeyCorrupted(ik, \"invalid length\")\n\t}\n\tnum := binary.LittleEndian.Uint64(ik[len(ik)-8:])\n\tseq, kt = uint64(num>>8), keyType(num&0xff)\n\tif kt > keyTypeVal {\n\t\treturn nil, 0, 0, newErrInternalKeyCorrupted(ik, \"invalid type\")\n\t}\n\tukey = ik[:len(ik)-8]\n\treturn\n}\n\nfunc validInternalKey(ik []byte) bool {\n\t_, _, _, err := parseInternalKey(ik)\n\treturn err == nil\n}\n\nfunc (ik internalKey) assert() {\n\tif ik == nil {\n\t\tpanic(\"leveldb: nil internalKey\")\n\t}\n\tif len(ik) < 8 {\n\t\tpanic(fmt.Sprintf(\"leveldb: internal key %q, len=%d: invalid length\", []byte(ik), len(ik)))\n\t}\n}\n\nfunc (ik internalKey) ukey() []byte {\n\tik.assert()\n\treturn ik[:len(ik)-8]\n}\n\nfunc (ik internalKey) num() uint64 {\n\tik.assert()\n\treturn binary.LittleEndian.Uint64(ik[len(ik)-8:])\n}\n\nfunc (ik internalKey) parseNum() (seq uint64, kt keyType) {\n\tnum := ik.num()\n\tseq, kt = uint64(num>>8), keyType(num&0xff)\n\tif kt > keyTypeVal {\n\t\tpanic(fmt.Sprintf(\"leveldb: internal key %q, len=%d: invalid type %#x\", []byte(ik), len(ik), kt))\n\t}\n\treturn\n}\n\nfunc (ik internalKey) String() string {\n\tif ik == nil {\n\t\treturn \"<nil>\"\n\t}\n\n\tif ukey, seq, kt, err := parseInternalKey(ik); err == nil {\n\t\treturn fmt.Sprintf(\"%s,%s%d\", shorten(string(ukey)), kt, seq)\n\t}\n\treturn fmt.Sprintf(\"<invalid:%#x>\", []byte(ik))\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package memdb provides in-memory key/value database implementation.\npackage memdb\n\nimport (\n\t\"math/rand\"\n\t\"sync\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/comparer\"\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// Common errors.\nvar (\n\tErrNotFound     = errors.ErrNotFound\n\tErrIterReleased = errors.New(\"leveldb/memdb: iterator released\")\n)\n\nconst tMaxHeight = 12\n\ntype dbIter struct {\n\tutil.BasicReleaser\n\tp          *DB\n\tslice      *util.Range\n\tnode       int\n\tforward    bool\n\tkey, value []byte\n\terr        error\n}\n\nfunc (i *dbIter) fill(checkStart, checkLimit bool) bool {\n\tif i.node != 0 {\n\t\tn := i.p.nodeData[i.node]\n\t\tm := n + i.p.nodeData[i.node+nKey]\n\t\ti.key = i.p.kvData[n:m]\n\t\tif i.slice != nil {\n\t\t\tswitch {\n\t\t\tcase checkLimit && i.slice.Limit != nil && i.p.cmp.Compare(i.key, i.slice.Limit) >= 0:\n\t\t\t\tfallthrough\n\t\t\tcase checkStart && i.slice.Start != nil && i.p.cmp.Compare(i.key, i.slice.Start) < 0:\n\t\t\t\ti.node = 0\n\t\t\t\tgoto bail\n\t\t\t}\n\t\t}\n\t\ti.value = i.p.kvData[m : m+i.p.nodeData[i.node+nVal]]\n\t\treturn true\n\t}\nbail:\n\ti.key = nil\n\ti.value = nil\n\treturn false\n}\n\nfunc (i *dbIter) Valid() bool {\n\treturn i.node != 0\n}\n\nfunc (i *dbIter) First() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\ti.forward = true\n\ti.p.mu.RLock()\n\tdefer i.p.mu.RUnlock()\n\tif i.slice != nil && i.slice.Start != nil {\n\t\ti.node, _ = i.p.findGE(i.slice.Start, false)\n\t} else {\n\t\ti.node = i.p.nodeData[nNext]\n\t}\n\treturn i.fill(false, true)\n}\n\nfunc (i *dbIter) Last() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\ti.forward = false\n\ti.p.mu.RLock()\n\tdefer i.p.mu.RUnlock()\n\tif i.slice != nil && i.slice.Limit != nil {\n\t\ti.node = i.p.findLT(i.slice.Limit)\n\t} else {\n\t\ti.node = i.p.findLast()\n\t}\n\treturn i.fill(true, false)\n}\n\nfunc (i *dbIter) Seek(key []byte) bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\ti.forward = true\n\ti.p.mu.RLock()\n\tdefer i.p.mu.RUnlock()\n\tif i.slice != nil && i.slice.Start != nil && i.p.cmp.Compare(key, i.slice.Start) < 0 {\n\t\tkey = i.slice.Start\n\t}\n\ti.node, _ = i.p.findGE(key, false)\n\treturn i.fill(false, true)\n}\n\nfunc (i *dbIter) Next() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.node == 0 {\n\t\tif !i.forward {\n\t\t\treturn i.First()\n\t\t}\n\t\treturn false\n\t}\n\ti.forward = true\n\ti.p.mu.RLock()\n\tdefer i.p.mu.RUnlock()\n\ti.node = i.p.nodeData[i.node+nNext]\n\treturn i.fill(false, true)\n}\n\nfunc (i *dbIter) Prev() bool {\n\tif i.Released() {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.node == 0 {\n\t\tif i.forward {\n\t\t\treturn i.Last()\n\t\t}\n\t\treturn false\n\t}\n\ti.forward = false\n\ti.p.mu.RLock()\n\tdefer i.p.mu.RUnlock()\n\ti.node = i.p.findLT(i.key)\n\treturn i.fill(true, false)\n}\n\nfunc (i *dbIter) Key() []byte {\n\treturn i.key\n}\n\nfunc (i *dbIter) Value() []byte {\n\treturn i.value\n}\n\nfunc (i *dbIter) Error() error { return i.err }\n\nfunc (i *dbIter) Release() {\n\tif !i.Released() {\n\t\ti.p = nil\n\t\ti.node = 0\n\t\ti.key = nil\n\t\ti.value = nil\n\t\ti.BasicReleaser.Release()\n\t}\n}\n\nconst (\n\tnKV = iota\n\tnKey\n\tnVal\n\tnHeight\n\tnNext\n)\n\n// DB is an in-memory key/value database.\ntype DB struct {\n\tcmp comparer.BasicComparer\n\trnd *rand.Rand\n\n\tmu     sync.RWMutex\n\tkvData []byte\n\t// Node data:\n\t// [0]         : KV offset\n\t// [1]         : Key length\n\t// [2]         : Value length\n\t// [3]         : Height\n\t// [3..height] : Next nodes\n\tnodeData  []int\n\tprevNode  [tMaxHeight]int\n\tmaxHeight int\n\tn         int\n\tkvSize    int\n}\n\nfunc (p *DB) randHeight() (h int) {\n\tconst branching = 4\n\th = 1\n\tfor h < tMaxHeight && p.rnd.Int()%branching == 0 {\n\t\th++\n\t}\n\treturn\n}\n\n// Must hold RW-lock if prev == true, as it use shared prevNode slice.\nfunc (p *DB) findGE(key []byte, prev bool) (int, bool) {\n\tnode := 0\n\th := p.maxHeight - 1\n\tfor {\n\t\tnext := p.nodeData[node+nNext+h]\n\t\tcmp := 1\n\t\tif next != 0 {\n\t\t\to := p.nodeData[next]\n\t\t\tcmp = p.cmp.Compare(p.kvData[o:o+p.nodeData[next+nKey]], key)\n\t\t}\n\t\tif cmp < 0 {\n\t\t\t// Keep searching in this list\n\t\t\tnode = next\n\t\t} else {\n\t\t\tif prev {\n\t\t\t\tp.prevNode[h] = node\n\t\t\t} else if cmp == 0 {\n\t\t\t\treturn next, true\n\t\t\t}\n\t\t\tif h == 0 {\n\t\t\t\treturn next, cmp == 0\n\t\t\t}\n\t\t\th--\n\t\t}\n\t}\n}\n\nfunc (p *DB) findLT(key []byte) int {\n\tnode := 0\n\th := p.maxHeight - 1\n\tfor {\n\t\tnext := p.nodeData[node+nNext+h]\n\t\to := p.nodeData[next]\n\t\tif next == 0 || p.cmp.Compare(p.kvData[o:o+p.nodeData[next+nKey]], key) >= 0 {\n\t\t\tif h == 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\th--\n\t\t} else {\n\t\t\tnode = next\n\t\t}\n\t}\n\treturn node\n}\n\nfunc (p *DB) findLast() int {\n\tnode := 0\n\th := p.maxHeight - 1\n\tfor {\n\t\tnext := p.nodeData[node+nNext+h]\n\t\tif next == 0 {\n\t\t\tif h == 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\th--\n\t\t} else {\n\t\t\tnode = next\n\t\t}\n\t}\n\treturn node\n}\n\n// Put sets the value for the given key. It overwrites any previous value\n// for that key; a DB is not a multi-map.\n//\n// It is safe to modify the contents of the arguments after Put returns.\nfunc (p *DB) Put(key []byte, value []byte) error {\n\tp.mu.Lock()\n\tdefer p.mu.Unlock()\n\n\tif node, exact := p.findGE(key, true); exact {\n\t\tkvOffset := len(p.kvData)\n\t\tp.kvData = append(p.kvData, key...)\n\t\tp.kvData = append(p.kvData, value...)\n\t\tp.nodeData[node] = kvOffset\n\t\tm := p.nodeData[node+nVal]\n\t\tp.nodeData[node+nVal] = len(value)\n\t\tp.kvSize += len(value) - m\n\t\treturn nil\n\t}\n\n\th := p.randHeight()\n\tif h > p.maxHeight {\n\t\tfor i := p.maxHeight; i < h; i++ {\n\t\t\tp.prevNode[i] = 0\n\t\t}\n\t\tp.maxHeight = h\n\t}\n\n\tkvOffset := len(p.kvData)\n\tp.kvData = append(p.kvData, key...)\n\tp.kvData = append(p.kvData, value...)\n\t// Node\n\tnode := len(p.nodeData)\n\tp.nodeData = append(p.nodeData, kvOffset, len(key), len(value), h)\n\tfor i, n := range p.prevNode[:h] {\n\t\tm := n + nNext + i\n\t\tp.nodeData = append(p.nodeData, p.nodeData[m])\n\t\tp.nodeData[m] = node\n\t}\n\n\tp.kvSize += len(key) + len(value)\n\tp.n++\n\treturn nil\n}\n\n// Delete deletes the value for the given key. It returns ErrNotFound if\n// the DB does not contain the key.\n//\n// It is safe to modify the contents of the arguments after Delete returns.\nfunc (p *DB) Delete(key []byte) error {\n\tp.mu.Lock()\n\tdefer p.mu.Unlock()\n\n\tnode, exact := p.findGE(key, true)\n\tif !exact {\n\t\treturn ErrNotFound\n\t}\n\n\th := p.nodeData[node+nHeight]\n\tfor i, n := range p.prevNode[:h] {\n\t\tm := n + nNext + i\n\t\tp.nodeData[m] = p.nodeData[p.nodeData[m]+nNext+i]\n\t}\n\n\tp.kvSize -= p.nodeData[node+nKey] + p.nodeData[node+nVal]\n\tp.n--\n\treturn nil\n}\n\n// Contains returns true if the given key are in the DB.\n//\n// It is safe to modify the contents of the arguments after Contains returns.\nfunc (p *DB) Contains(key []byte) bool {\n\tp.mu.RLock()\n\t_, exact := p.findGE(key, false)\n\tp.mu.RUnlock()\n\treturn exact\n}\n\n// Get gets the value for the given key. It returns error.ErrNotFound if the\n// DB does not contain the key.\n//\n// The caller should not modify the contents of the returned slice, but\n// it is safe to modify the contents of the argument after Get returns.\nfunc (p *DB) Get(key []byte) (value []byte, err error) {\n\tp.mu.RLock()\n\tif node, exact := p.findGE(key, false); exact {\n\t\to := p.nodeData[node] + p.nodeData[node+nKey]\n\t\tvalue = p.kvData[o : o+p.nodeData[node+nVal]]\n\t} else {\n\t\terr = ErrNotFound\n\t}\n\tp.mu.RUnlock()\n\treturn\n}\n\n// Find finds key/value pair whose key is greater than or equal to the\n// given key. It returns ErrNotFound if the table doesn't contain\n// such pair.\n//\n// The caller should not modify the contents of the returned slice, but\n// it is safe to modify the contents of the argument after Find returns.\nfunc (p *DB) Find(key []byte) (rkey, value []byte, err error) {\n\tp.mu.RLock()\n\tif node, _ := p.findGE(key, false); node != 0 {\n\t\tn := p.nodeData[node]\n\t\tm := n + p.nodeData[node+nKey]\n\t\trkey = p.kvData[n:m]\n\t\tvalue = p.kvData[m : m+p.nodeData[node+nVal]]\n\t} else {\n\t\terr = ErrNotFound\n\t}\n\tp.mu.RUnlock()\n\treturn\n}\n\n// NewIterator returns an iterator of the DB.\n// The returned iterator is not safe for concurrent use, but it is safe to use\n// multiple iterators concurrently, with each in a dedicated goroutine.\n// It is also safe to use an iterator concurrently with modifying its\n// underlying DB. However, the resultant key/value pairs are not guaranteed\n// to be a consistent snapshot of the DB at a particular point in time.\n//\n// Slice allows slicing the iterator to only contains keys in the given\n// range. A nil Range.Start is treated as a key before all keys in the\n// DB. And a nil Range.Limit is treated as a key after all keys in\n// the DB.\n//\n// The iterator must be released after use, by calling Release method.\n//\n// Also read Iterator documentation of the leveldb/iterator package.\nfunc (p *DB) NewIterator(slice *util.Range) iterator.Iterator {\n\treturn &dbIter{p: p, slice: slice}\n}\n\n// Capacity returns keys/values buffer capacity.\nfunc (p *DB) Capacity() int {\n\tp.mu.RLock()\n\tdefer p.mu.RUnlock()\n\treturn cap(p.kvData)\n}\n\n// Size returns sum of keys and values length. Note that deleted\n// key/value will not be accounted for, but it will still consume\n// the buffer, since the buffer is append only.\nfunc (p *DB) Size() int {\n\tp.mu.RLock()\n\tdefer p.mu.RUnlock()\n\treturn p.kvSize\n}\n\n// Free returns keys/values free buffer before need to grow.\nfunc (p *DB) Free() int {\n\tp.mu.RLock()\n\tdefer p.mu.RUnlock()\n\treturn cap(p.kvData) - len(p.kvData)\n}\n\n// Len returns the number of entries in the DB.\nfunc (p *DB) Len() int {\n\tp.mu.RLock()\n\tdefer p.mu.RUnlock()\n\treturn p.n\n}\n\n// Reset resets the DB to initial empty state. Allows reuse the buffer.\nfunc (p *DB) Reset() {\n\tp.mu.Lock()\n\tp.rnd = rand.New(rand.NewSource(0xdeadbeef))\n\tp.maxHeight = 1\n\tp.n = 0\n\tp.kvSize = 0\n\tp.kvData = p.kvData[:0]\n\tp.nodeData = p.nodeData[:nNext+tMaxHeight]\n\tp.nodeData[nKV] = 0\n\tp.nodeData[nKey] = 0\n\tp.nodeData[nVal] = 0\n\tp.nodeData[nHeight] = tMaxHeight\n\tfor n := 0; n < tMaxHeight; n++ {\n\t\tp.nodeData[nNext+n] = 0\n\t\tp.prevNode[n] = 0\n\t}\n\tp.mu.Unlock()\n}\n\n// New creates a new initialized in-memory key/value DB. The capacity\n// is the initial key/value buffer capacity. The capacity is advisory,\n// not enforced.\n//\n// This DB is append-only, deleting an entry would remove entry node but not\n// reclaim KV buffer.\n//\n// The returned DB instance is safe for concurrent use.\nfunc New(cmp comparer.BasicComparer, capacity int) *DB {\n\tp := &DB{\n\t\tcmp:       cmp,\n\t\trnd:       rand.New(rand.NewSource(0xdeadbeef)),\n\t\tmaxHeight: 1,\n\t\tkvData:    make([]byte, 0, capacity),\n\t\tnodeData:  make([]int, 4+tMaxHeight),\n\t}\n\tp.nodeData[nHeight] = tMaxHeight\n\treturn p\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package opt provides sets of options used by LevelDB.\npackage opt\n\nimport (\n\t\"math\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/cache\"\n\t\"github.com/syndtr/goleveldb/leveldb/comparer\"\n\t\"github.com/syndtr/goleveldb/leveldb/filter\"\n)\n\nconst (\n\tKiB = 1024\n\tMiB = KiB * 1024\n\tGiB = MiB * 1024\n)\n\nvar (\n\tDefaultBlockCacher                   = LRUCacher\n\tDefaultBlockCacheCapacity            = 8 * MiB\n\tDefaultBlockRestartInterval          = 16\n\tDefaultBlockSize                     = 4 * KiB\n\tDefaultCompactionExpandLimitFactor   = 25\n\tDefaultCompactionGPOverlapsFactor    = 10\n\tDefaultCompactionL0Trigger           = 4\n\tDefaultCompactionSourceLimitFactor   = 1\n\tDefaultCompactionTableSize           = 2 * MiB\n\tDefaultCompactionTableSizeMultiplier = 1.0\n\tDefaultCompactionTotalSize           = 10 * MiB\n\tDefaultCompactionTotalSizeMultiplier = 10.0\n\tDefaultCompressionType               = SnappyCompression\n\tDefaultIteratorSamplingRate          = 1 * MiB\n\tDefaultOpenFilesCacher               = LRUCacher\n\tDefaultOpenFilesCacheCapacity        = 500\n\tDefaultWriteBuffer                   = 4 * MiB\n\tDefaultWriteL0PauseTrigger           = 12\n\tDefaultWriteL0SlowdownTrigger        = 8\n)\n\n// Cacher is a caching algorithm.\ntype Cacher interface {\n\tNew(capacity int) cache.Cacher\n}\n\ntype CacherFunc struct {\n\tNewFunc func(capacity int) cache.Cacher\n}\n\nfunc (f *CacherFunc) New(capacity int) cache.Cacher {\n\tif f.NewFunc != nil {\n\t\treturn f.NewFunc(capacity)\n\t}\n\treturn nil\n}\n\nfunc noCacher(int) cache.Cacher { return nil }\n\nvar (\n\t// LRUCacher is the LRU-cache algorithm.\n\tLRUCacher = &CacherFunc{cache.NewLRU}\n\n\t// NoCacher is the value to disable caching algorithm.\n\tNoCacher = &CacherFunc{}\n)\n\n// Compression is the 'sorted table' block compression algorithm to use.\ntype Compression uint\n\nfunc (c Compression) String() string {\n\tswitch c {\n\tcase DefaultCompression:\n\t\treturn \"default\"\n\tcase NoCompression:\n\t\treturn \"none\"\n\tcase SnappyCompression:\n\t\treturn \"snappy\"\n\t}\n\treturn \"invalid\"\n}\n\nconst (\n\tDefaultCompression Compression = iota\n\tNoCompression\n\tSnappyCompression\n\tnCompression\n)\n\n// Strict is the DB 'strict level'.\ntype Strict uint\n\nconst (\n\t// If present then a corrupted or invalid chunk or block in manifest\n\t// journal will cause an error instead of being dropped.\n\t// This will prevent database with corrupted manifest to be opened.\n\tStrictManifest Strict = 1 << iota\n\n\t// If present then journal chunk checksum will be verified.\n\tStrictJournalChecksum\n\n\t// If present then a corrupted or invalid chunk or block in journal\n\t// will cause an error instead of being dropped.\n\t// This will prevent database with corrupted journal to be opened.\n\tStrictJournal\n\n\t// If present then 'sorted table' block checksum will be verified.\n\t// This has effect on both 'read operation' and compaction.\n\tStrictBlockChecksum\n\n\t// If present then a corrupted 'sorted table' will fails compaction.\n\t// The database will enter read-only mode.\n\tStrictCompaction\n\n\t// If present then a corrupted 'sorted table' will halts 'read operation'.\n\tStrictReader\n\n\t// If present then leveldb.Recover will drop corrupted 'sorted table'.\n\tStrictRecovery\n\n\t// This only applicable for ReadOptions, if present then this ReadOptions\n\t// 'strict level' will override global ones.\n\tStrictOverride\n\n\t// StrictAll enables all strict flags.\n\tStrictAll = StrictManifest | StrictJournalChecksum | StrictJournal | StrictBlockChecksum | StrictCompaction | StrictReader | StrictRecovery\n\n\t// DefaultStrict is the default strict flags. Specify any strict flags\n\t// will override default strict flags as whole (i.e. not OR'ed).\n\tDefaultStrict = StrictJournalChecksum | StrictBlockChecksum | StrictCompaction | StrictReader\n\n\t// NoStrict disables all strict flags. Override default strict flags.\n\tNoStrict = ^StrictAll\n)\n\n// Options holds the optional parameters for the DB at large.\ntype Options struct {\n\t// AltFilters defines one or more 'alternative filters'.\n\t// 'alternative filters' will be used during reads if a filter block\n\t// does not match with the 'effective filter'.\n\t//\n\t// The default value is nil\n\tAltFilters []filter.Filter\n\n\t// BlockCacher provides cache algorithm for LevelDB 'sorted table' block caching.\n\t// Specify NoCacher to disable caching algorithm.\n\t//\n\t// The default value is LRUCacher.\n\tBlockCacher Cacher\n\n\t// BlockCacheCapacity defines the capacity of the 'sorted table' block caching.\n\t// Use -1 for zero, this has same effect as specifying NoCacher to BlockCacher.\n\t//\n\t// The default value is 8MiB.\n\tBlockCacheCapacity int\n\n\t// BlockRestartInterval is the number of keys between restart points for\n\t// delta encoding of keys.\n\t//\n\t// The default value is 16.\n\tBlockRestartInterval int\n\n\t// BlockSize is the minimum uncompressed size in bytes of each 'sorted table'\n\t// block.\n\t//\n\t// The default value is 4KiB.\n\tBlockSize int\n\n\t// CompactionExpandLimitFactor limits compaction size after expanded.\n\t// This will be multiplied by table size limit at compaction target level.\n\t//\n\t// The default value is 25.\n\tCompactionExpandLimitFactor int\n\n\t// CompactionGPOverlapsFactor limits overlaps in grandparent (Level + 2) that a\n\t// single 'sorted table' generates.\n\t// This will be multiplied by table size limit at grandparent level.\n\t//\n\t// The default value is 10.\n\tCompactionGPOverlapsFactor int\n\n\t// CompactionL0Trigger defines number of 'sorted table' at level-0 that will\n\t// trigger compaction.\n\t//\n\t// The default value is 4.\n\tCompactionL0Trigger int\n\n\t// CompactionSourceLimitFactor limits compaction source size. This doesn't apply to\n\t// level-0.\n\t// This will be multiplied by table size limit at compaction target level.\n\t//\n\t// The default value is 1.\n\tCompactionSourceLimitFactor int\n\n\t// CompactionTableSize limits size of 'sorted table' that compaction generates.\n\t// The limits for each level will be calculated as:\n\t//   CompactionTableSize * (CompactionTableSizeMultiplier ^ Level)\n\t// The multiplier for each level can also fine-tuned using CompactionTableSizeMultiplierPerLevel.\n\t//\n\t// The default value is 2MiB.\n\tCompactionTableSize int\n\n\t// CompactionTableSizeMultiplier defines multiplier for CompactionTableSize.\n\t//\n\t// The default value is 1.\n\tCompactionTableSizeMultiplier float64\n\n\t// CompactionTableSizeMultiplierPerLevel defines per-level multiplier for\n\t// CompactionTableSize.\n\t// Use zero to skip a level.\n\t//\n\t// The default value is nil.\n\tCompactionTableSizeMultiplierPerLevel []float64\n\n\t// CompactionTotalSize limits total size of 'sorted table' for each level.\n\t// The limits for each level will be calculated as:\n\t//   CompactionTotalSize * (CompactionTotalSizeMultiplier ^ Level)\n\t// The multiplier for each level can also fine-tuned using\n\t// CompactionTotalSizeMultiplierPerLevel.\n\t//\n\t// The default value is 10MiB.\n\tCompactionTotalSize int\n\n\t// CompactionTotalSizeMultiplier defines multiplier for CompactionTotalSize.\n\t//\n\t// The default value is 10.\n\tCompactionTotalSizeMultiplier float64\n\n\t// CompactionTotalSizeMultiplierPerLevel defines per-level multiplier for\n\t// CompactionTotalSize.\n\t// Use zero to skip a level.\n\t//\n\t// The default value is nil.\n\tCompactionTotalSizeMultiplierPerLevel []float64\n\n\t// Comparer defines a total ordering over the space of []byte keys: a 'less\n\t// than' relationship. The same comparison algorithm must be used for reads\n\t// and writes over the lifetime of the DB.\n\t//\n\t// The default value uses the same ordering as bytes.Compare.\n\tComparer comparer.Comparer\n\n\t// Compression defines the 'sorted table' block compression to use.\n\t//\n\t// The default value (DefaultCompression) uses snappy compression.\n\tCompression Compression\n\n\t// DisableBufferPool allows disable use of util.BufferPool functionality.\n\t//\n\t// The default value is false.\n\tDisableBufferPool bool\n\n\t// DisableBlockCache allows disable use of cache.Cache functionality on\n\t// 'sorted table' block.\n\t//\n\t// The default value is false.\n\tDisableBlockCache bool\n\n\t// DisableCompactionBackoff allows disable compaction retry backoff.\n\t//\n\t// The default value is false.\n\tDisableCompactionBackoff bool\n\n\t// DisableLargeBatchTransaction allows disabling switch-to-transaction mode\n\t// on large batch write. If enable batch writes large than WriteBuffer will\n\t// use transaction.\n\t//\n\t// The default is false.\n\tDisableLargeBatchTransaction bool\n\n\t// ErrorIfExist defines whether an error should returned if the DB already\n\t// exist.\n\t//\n\t// The default value is false.\n\tErrorIfExist bool\n\n\t// ErrorIfMissing defines whether an error should returned if the DB is\n\t// missing. If false then the database will be created if missing, otherwise\n\t// an error will be returned.\n\t//\n\t// The default value is false.\n\tErrorIfMissing bool\n\n\t// Filter defines an 'effective filter' to use. An 'effective filter'\n\t// if defined will be used to generate per-table filter block.\n\t// The filter name will be stored on disk.\n\t// During reads LevelDB will try to find matching filter from\n\t// 'effective filter' and 'alternative filters'.\n\t//\n\t// Filter can be changed after a DB has been created. It is recommended\n\t// to put old filter to the 'alternative filters' to mitigate lack of\n\t// filter during transition period.\n\t//\n\t// A filter is used to reduce disk reads when looking for a specific key.\n\t//\n\t// The default value is nil.\n\tFilter filter.Filter\n\n\t// IteratorSamplingRate defines approximate gap (in bytes) between read\n\t// sampling of an iterator. The samples will be used to determine when\n\t// compaction should be triggered.\n\t//\n\t// The default is 1MiB.\n\tIteratorSamplingRate int\n\n\t// NoSync allows completely disable fsync.\n\t//\n\t// The default is false.\n\tNoSync bool\n\n\t// NoWriteMerge allows disabling write merge.\n\t//\n\t// The default is false.\n\tNoWriteMerge bool\n\n\t// OpenFilesCacher provides cache algorithm for open files caching.\n\t// Specify NoCacher to disable caching algorithm.\n\t//\n\t// The default value is LRUCacher.\n\tOpenFilesCacher Cacher\n\n\t// OpenFilesCacheCapacity defines the capacity of the open files caching.\n\t// Use -1 for zero, this has same effect as specifying NoCacher to OpenFilesCacher.\n\t//\n\t// The default value is 500.\n\tOpenFilesCacheCapacity int\n\n\t// If true then opens DB in read-only mode.\n\t//\n\t// The default value is false.\n\tReadOnly bool\n\n\t// Strict defines the DB strict level.\n\tStrict Strict\n\n\t// WriteBuffer defines maximum size of a 'memdb' before flushed to\n\t// 'sorted table'. 'memdb' is an in-memory DB backed by an on-disk\n\t// unsorted journal.\n\t//\n\t// LevelDB may held up to two 'memdb' at the same time.\n\t//\n\t// The default value is 4MiB.\n\tWriteBuffer int\n\n\t// WriteL0StopTrigger defines number of 'sorted table' at level-0 that will\n\t// pause write.\n\t//\n\t// The default value is 12.\n\tWriteL0PauseTrigger int\n\n\t// WriteL0SlowdownTrigger defines number of 'sorted table' at level-0 that\n\t// will trigger write slowdown.\n\t//\n\t// The default value is 8.\n\tWriteL0SlowdownTrigger int\n}\n\nfunc (o *Options) GetAltFilters() []filter.Filter {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn o.AltFilters\n}\n\nfunc (o *Options) GetBlockCacher() Cacher {\n\tif o == nil || o.BlockCacher == nil {\n\t\treturn DefaultBlockCacher\n\t} else if o.BlockCacher == NoCacher {\n\t\treturn nil\n\t}\n\treturn o.BlockCacher\n}\n\nfunc (o *Options) GetBlockCacheCapacity() int {\n\tif o == nil || o.BlockCacheCapacity == 0 {\n\t\treturn DefaultBlockCacheCapacity\n\t} else if o.BlockCacheCapacity < 0 {\n\t\treturn 0\n\t}\n\treturn o.BlockCacheCapacity\n}\n\nfunc (o *Options) GetBlockRestartInterval() int {\n\tif o == nil || o.BlockRestartInterval <= 0 {\n\t\treturn DefaultBlockRestartInterval\n\t}\n\treturn o.BlockRestartInterval\n}\n\nfunc (o *Options) GetBlockSize() int {\n\tif o == nil || o.BlockSize <= 0 {\n\t\treturn DefaultBlockSize\n\t}\n\treturn o.BlockSize\n}\n\nfunc (o *Options) GetCompactionExpandLimit(level int) int {\n\tfactor := DefaultCompactionExpandLimitFactor\n\tif o != nil && o.CompactionExpandLimitFactor > 0 {\n\t\tfactor = o.CompactionExpandLimitFactor\n\t}\n\treturn o.GetCompactionTableSize(level+1) * factor\n}\n\nfunc (o *Options) GetCompactionGPOverlaps(level int) int {\n\tfactor := DefaultCompactionGPOverlapsFactor\n\tif o != nil && o.CompactionGPOverlapsFactor > 0 {\n\t\tfactor = o.CompactionGPOverlapsFactor\n\t}\n\treturn o.GetCompactionTableSize(level+2) * factor\n}\n\nfunc (o *Options) GetCompactionL0Trigger() int {\n\tif o == nil || o.CompactionL0Trigger == 0 {\n\t\treturn DefaultCompactionL0Trigger\n\t}\n\treturn o.CompactionL0Trigger\n}\n\nfunc (o *Options) GetCompactionSourceLimit(level int) int {\n\tfactor := DefaultCompactionSourceLimitFactor\n\tif o != nil && o.CompactionSourceLimitFactor > 0 {\n\t\tfactor = o.CompactionSourceLimitFactor\n\t}\n\treturn o.GetCompactionTableSize(level+1) * factor\n}\n\nfunc (o *Options) GetCompactionTableSize(level int) int {\n\tvar (\n\t\tbase = DefaultCompactionTableSize\n\t\tmult float64\n\t)\n\tif o != nil {\n\t\tif o.CompactionTableSize > 0 {\n\t\t\tbase = o.CompactionTableSize\n\t\t}\n\t\tif level < len(o.CompactionTableSizeMultiplierPerLevel) && o.CompactionTableSizeMultiplierPerLevel[level] > 0 {\n\t\t\tmult = o.CompactionTableSizeMultiplierPerLevel[level]\n\t\t} else if o.CompactionTableSizeMultiplier > 0 {\n\t\t\tmult = math.Pow(o.CompactionTableSizeMultiplier, float64(level))\n\t\t}\n\t}\n\tif mult == 0 {\n\t\tmult = math.Pow(DefaultCompactionTableSizeMultiplier, float64(level))\n\t}\n\treturn int(float64(base) * mult)\n}\n\nfunc (o *Options) GetCompactionTotalSize(level int) int64 {\n\tvar (\n\t\tbase = DefaultCompactionTotalSize\n\t\tmult float64\n\t)\n\tif o != nil {\n\t\tif o.CompactionTotalSize > 0 {\n\t\t\tbase = o.CompactionTotalSize\n\t\t}\n\t\tif level < len(o.CompactionTotalSizeMultiplierPerLevel) && o.CompactionTotalSizeMultiplierPerLevel[level] > 0 {\n\t\t\tmult = o.CompactionTotalSizeMultiplierPerLevel[level]\n\t\t} else if o.CompactionTotalSizeMultiplier > 0 {\n\t\t\tmult = math.Pow(o.CompactionTotalSizeMultiplier, float64(level))\n\t\t}\n\t}\n\tif mult == 0 {\n\t\tmult = math.Pow(DefaultCompactionTotalSizeMultiplier, float64(level))\n\t}\n\treturn int64(float64(base) * mult)\n}\n\nfunc (o *Options) GetComparer() comparer.Comparer {\n\tif o == nil || o.Comparer == nil {\n\t\treturn comparer.DefaultComparer\n\t}\n\treturn o.Comparer\n}\n\nfunc (o *Options) GetCompression() Compression {\n\tif o == nil || o.Compression <= DefaultCompression || o.Compression >= nCompression {\n\t\treturn DefaultCompressionType\n\t}\n\treturn o.Compression\n}\n\nfunc (o *Options) GetDisableBufferPool() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.DisableBufferPool\n}\n\nfunc (o *Options) GetDisableBlockCache() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.DisableBlockCache\n}\n\nfunc (o *Options) GetDisableCompactionBackoff() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.DisableCompactionBackoff\n}\n\nfunc (o *Options) GetDisableLargeBatchTransaction() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.DisableLargeBatchTransaction\n}\n\nfunc (o *Options) GetErrorIfExist() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.ErrorIfExist\n}\n\nfunc (o *Options) GetErrorIfMissing() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.ErrorIfMissing\n}\n\nfunc (o *Options) GetFilter() filter.Filter {\n\tif o == nil {\n\t\treturn nil\n\t}\n\treturn o.Filter\n}\n\nfunc (o *Options) GetIteratorSamplingRate() int {\n\tif o == nil || o.IteratorSamplingRate <= 0 {\n\t\treturn DefaultIteratorSamplingRate\n\t}\n\treturn o.IteratorSamplingRate\n}\n\nfunc (o *Options) GetNoSync() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.NoSync\n}\n\nfunc (o *Options) GetNoWriteMerge() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.NoWriteMerge\n}\n\nfunc (o *Options) GetOpenFilesCacher() Cacher {\n\tif o == nil || o.OpenFilesCacher == nil {\n\t\treturn DefaultOpenFilesCacher\n\t}\n\tif o.OpenFilesCacher == NoCacher {\n\t\treturn nil\n\t}\n\treturn o.OpenFilesCacher\n}\n\nfunc (o *Options) GetOpenFilesCacheCapacity() int {\n\tif o == nil || o.OpenFilesCacheCapacity == 0 {\n\t\treturn DefaultOpenFilesCacheCapacity\n\t} else if o.OpenFilesCacheCapacity < 0 {\n\t\treturn 0\n\t}\n\treturn o.OpenFilesCacheCapacity\n}\n\nfunc (o *Options) GetReadOnly() bool {\n\tif o == nil {\n\t\treturn false\n\t}\n\treturn o.ReadOnly\n}\n\nfunc (o *Options) GetStrict(strict Strict) bool {\n\tif o == nil || o.Strict == 0 {\n\t\treturn DefaultStrict&strict != 0\n\t}\n\treturn o.Strict&strict != 0\n}\n\nfunc (o *Options) GetWriteBuffer() int {\n\tif o == nil || o.WriteBuffer <= 0 {\n\t\treturn DefaultWriteBuffer\n\t}\n\treturn o.WriteBuffer\n}\n\nfunc (o *Options) GetWriteL0PauseTrigger() int {\n\tif o == nil || o.WriteL0PauseTrigger == 0 {\n\t\treturn DefaultWriteL0PauseTrigger\n\t}\n\treturn o.WriteL0PauseTrigger\n}\n\nfunc (o *Options) GetWriteL0SlowdownTrigger() int {\n\tif o == nil || o.WriteL0SlowdownTrigger == 0 {\n\t\treturn DefaultWriteL0SlowdownTrigger\n\t}\n\treturn o.WriteL0SlowdownTrigger\n}\n\n// ReadOptions holds the optional parameters for 'read operation'. The\n// 'read operation' includes Get, Find and NewIterator.\ntype ReadOptions struct {\n\t// DontFillCache defines whether block reads for this 'read operation'\n\t// should be cached. If false then the block will be cached. This does\n\t// not affects already cached block.\n\t//\n\t// The default value is false.\n\tDontFillCache bool\n\n\t// Strict will be OR'ed with global DB 'strict level' unless StrictOverride\n\t// is present. Currently only StrictReader that has effect here.\n\tStrict Strict\n}\n\nfunc (ro *ReadOptions) GetDontFillCache() bool {\n\tif ro == nil {\n\t\treturn false\n\t}\n\treturn ro.DontFillCache\n}\n\nfunc (ro *ReadOptions) GetStrict(strict Strict) bool {\n\tif ro == nil {\n\t\treturn false\n\t}\n\treturn ro.Strict&strict != 0\n}\n\n// WriteOptions holds the optional parameters for 'write operation'. The\n// 'write operation' includes Write, Put and Delete.\ntype WriteOptions struct {\n\t// NoWriteMerge allows disabling write merge.\n\t//\n\t// The default is false.\n\tNoWriteMerge bool\n\n\t// Sync is whether to sync underlying writes from the OS buffer cache\n\t// through to actual disk, if applicable. Setting Sync can result in\n\t// slower writes.\n\t//\n\t// If false, and the machine crashes, then some recent writes may be lost.\n\t// Note that if it is just the process that crashes (and the machine does\n\t// not) then no writes will be lost.\n\t//\n\t// In other words, Sync being false has the same semantics as a write\n\t// system call. Sync being true means write followed by fsync.\n\t//\n\t// The default value is false.\n\tSync bool\n}\n\nfunc (wo *WriteOptions) GetNoWriteMerge() bool {\n\tif wo == nil {\n\t\treturn false\n\t}\n\treturn wo.NoWriteMerge\n}\n\nfunc (wo *WriteOptions) GetSync() bool {\n\tif wo == nil {\n\t\treturn false\n\t}\n\treturn wo.Sync\n}\n\nfunc GetStrict(o *Options, ro *ReadOptions, strict Strict) bool {\n\tif ro.GetStrict(StrictOverride) {\n\t\treturn ro.GetStrict(strict)\n\t} else {\n\t\treturn o.GetStrict(strict) || ro.GetStrict(strict)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/options.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/filter\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n)\n\nfunc dupOptions(o *opt.Options) *opt.Options {\n\tnewo := &opt.Options{}\n\tif o != nil {\n\t\t*newo = *o\n\t}\n\tif newo.Strict == 0 {\n\t\tnewo.Strict = opt.DefaultStrict\n\t}\n\treturn newo\n}\n\nfunc (s *session) setOptions(o *opt.Options) {\n\tno := dupOptions(o)\n\t// Alternative filters.\n\tif filters := o.GetAltFilters(); len(filters) > 0 {\n\t\tno.AltFilters = make([]filter.Filter, len(filters))\n\t\tfor i, filter := range filters {\n\t\t\tno.AltFilters[i] = &iFilter{filter}\n\t\t}\n\t}\n\t// Comparer.\n\ts.icmp = &iComparer{o.GetComparer()}\n\tno.Comparer = s.icmp\n\t// Filter.\n\tif filter := o.GetFilter(); filter != nil {\n\t\tno.Filter = &iFilter{filter}\n\t}\n\n\ts.o = &cachedOptions{Options: no}\n\ts.o.cache()\n}\n\nconst optCachedLevel = 7\n\ntype cachedOptions struct {\n\t*opt.Options\n\n\tcompactionExpandLimit []int\n\tcompactionGPOverlaps  []int\n\tcompactionSourceLimit []int\n\tcompactionTableSize   []int\n\tcompactionTotalSize   []int64\n}\n\nfunc (co *cachedOptions) cache() {\n\tco.compactionExpandLimit = make([]int, optCachedLevel)\n\tco.compactionGPOverlaps = make([]int, optCachedLevel)\n\tco.compactionSourceLimit = make([]int, optCachedLevel)\n\tco.compactionTableSize = make([]int, optCachedLevel)\n\tco.compactionTotalSize = make([]int64, optCachedLevel)\n\n\tfor level := 0; level < optCachedLevel; level++ {\n\t\tco.compactionExpandLimit[level] = co.Options.GetCompactionExpandLimit(level)\n\t\tco.compactionGPOverlaps[level] = co.Options.GetCompactionGPOverlaps(level)\n\t\tco.compactionSourceLimit[level] = co.Options.GetCompactionSourceLimit(level)\n\t\tco.compactionTableSize[level] = co.Options.GetCompactionTableSize(level)\n\t\tco.compactionTotalSize[level] = co.Options.GetCompactionTotalSize(level)\n\t}\n}\n\nfunc (co *cachedOptions) GetCompactionExpandLimit(level int) int {\n\tif level < optCachedLevel {\n\t\treturn co.compactionExpandLimit[level]\n\t}\n\treturn co.Options.GetCompactionExpandLimit(level)\n}\n\nfunc (co *cachedOptions) GetCompactionGPOverlaps(level int) int {\n\tif level < optCachedLevel {\n\t\treturn co.compactionGPOverlaps[level]\n\t}\n\treturn co.Options.GetCompactionGPOverlaps(level)\n}\n\nfunc (co *cachedOptions) GetCompactionSourceLimit(level int) int {\n\tif level < optCachedLevel {\n\t\treturn co.compactionSourceLimit[level]\n\t}\n\treturn co.Options.GetCompactionSourceLimit(level)\n}\n\nfunc (co *cachedOptions) GetCompactionTableSize(level int) int {\n\tif level < optCachedLevel {\n\t\treturn co.compactionTableSize[level]\n\t}\n\treturn co.Options.GetCompactionTableSize(level)\n}\n\nfunc (co *cachedOptions) GetCompactionTotalSize(level int) int64 {\n\tif level < optCachedLevel {\n\t\treturn co.compactionTotalSize[level]\n\t}\n\treturn co.Options.GetCompactionTotalSize(level)\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/session.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/journal\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\n// ErrManifestCorrupted records manifest corruption. This error will be\n// wrapped with errors.ErrCorrupted.\ntype ErrManifestCorrupted struct {\n\tField  string\n\tReason string\n}\n\nfunc (e *ErrManifestCorrupted) Error() string {\n\treturn fmt.Sprintf(\"leveldb: manifest corrupted (field '%s'): %s\", e.Field, e.Reason)\n}\n\nfunc newErrManifestCorrupted(fd storage.FileDesc, field, reason string) error {\n\treturn errors.NewErrCorrupted(fd, &ErrManifestCorrupted{field, reason})\n}\n\n// session represent a persistent database session.\ntype session struct {\n\t// Need 64-bit alignment.\n\tstNextFileNum    int64 // current unused file number\n\tstJournalNum     int64 // current journal file number; need external synchronization\n\tstPrevJournalNum int64 // prev journal file number; no longer used; for compatibility with older version of leveldb\n\tstTempFileNum    int64\n\tstSeqNum         uint64 // last mem compacted seq; need external synchronization\n\n\tstor     *iStorage\n\tstorLock storage.Locker\n\to        *cachedOptions\n\ticmp     *iComparer\n\ttops     *tOps\n\tfileRef  map[int64]int\n\n\tmanifest       *journal.Writer\n\tmanifestWriter storage.Writer\n\tmanifestFd     storage.FileDesc\n\n\tstCompPtrs []internalKey // compaction pointers; need external synchronization\n\tstVersion  *version      // current version\n\tvmu        sync.Mutex\n}\n\n// Creates new initialized session instance.\nfunc newSession(stor storage.Storage, o *opt.Options) (s *session, err error) {\n\tif stor == nil {\n\t\treturn nil, os.ErrInvalid\n\t}\n\tstorLock, err := stor.Lock()\n\tif err != nil {\n\t\treturn\n\t}\n\ts = &session{\n\t\tstor:     newIStorage(stor),\n\t\tstorLock: storLock,\n\t\tfileRef:  make(map[int64]int),\n\t}\n\ts.setOptions(o)\n\ts.tops = newTableOps(s)\n\ts.setVersion(newVersion(s))\n\ts.log(\"log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed\")\n\treturn\n}\n\n// Close session.\nfunc (s *session) close() {\n\ts.tops.close()\n\tif s.manifest != nil {\n\t\ts.manifest.Close()\n\t}\n\tif s.manifestWriter != nil {\n\t\ts.manifestWriter.Close()\n\t}\n\ts.manifest = nil\n\ts.manifestWriter = nil\n\ts.setVersion(&version{s: s, closing: true})\n}\n\n// Release session lock.\nfunc (s *session) release() {\n\ts.storLock.Unlock()\n}\n\n// Create a new database session; need external synchronization.\nfunc (s *session) create() error {\n\t// create manifest\n\treturn s.newManifest(nil, nil)\n}\n\n// Recover a database session; need external synchronization.\nfunc (s *session) recover() (err error) {\n\tdefer func() {\n\t\tif os.IsNotExist(err) {\n\t\t\t// Don't return os.ErrNotExist if the underlying storage contains\n\t\t\t// other files that belong to LevelDB. So the DB won't get trashed.\n\t\t\tif fds, _ := s.stor.List(storage.TypeAll); len(fds) > 0 {\n\t\t\t\terr = &errors.ErrCorrupted{Fd: storage.FileDesc{Type: storage.TypeManifest}, Err: &errors.ErrMissingFiles{}}\n\t\t\t}\n\t\t}\n\t}()\n\n\tfd, err := s.stor.GetMeta()\n\tif err != nil {\n\t\treturn\n\t}\n\n\treader, err := s.stor.Open(fd)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer reader.Close()\n\n\tvar (\n\t\t// Options.\n\t\tstrict = s.o.GetStrict(opt.StrictManifest)\n\n\t\tjr      = journal.NewReader(reader, dropper{s, fd}, strict, true)\n\t\trec     = &sessionRecord{}\n\t\tstaging = s.stVersion.newStaging()\n\t)\n\tfor {\n\t\tvar r io.Reader\n\t\tr, err = jr.Next()\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\terr = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn errors.SetFd(err, fd)\n\t\t}\n\n\t\terr = rec.decode(r)\n\t\tif err == nil {\n\t\t\t// save compact pointers\n\t\t\tfor _, r := range rec.compPtrs {\n\t\t\t\ts.setCompPtr(r.level, internalKey(r.ikey))\n\t\t\t}\n\t\t\t// commit record to version staging\n\t\t\tstaging.commit(rec)\n\t\t} else {\n\t\t\terr = errors.SetFd(err, fd)\n\t\t\tif strict || !errors.IsCorrupted(err) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ts.logf(\"manifest error: %v (skipped)\", errors.SetFd(err, fd))\n\t\t}\n\t\trec.resetCompPtrs()\n\t\trec.resetAddedTables()\n\t\trec.resetDeletedTables()\n\t}\n\n\tswitch {\n\tcase !rec.has(recComparer):\n\t\treturn newErrManifestCorrupted(fd, \"comparer\", \"missing\")\n\tcase rec.comparer != s.icmp.uName():\n\t\treturn newErrManifestCorrupted(fd, \"comparer\", fmt.Sprintf(\"mismatch: want '%s', got '%s'\", s.icmp.uName(), rec.comparer))\n\tcase !rec.has(recNextFileNum):\n\t\treturn newErrManifestCorrupted(fd, \"next-file-num\", \"missing\")\n\tcase !rec.has(recJournalNum):\n\t\treturn newErrManifestCorrupted(fd, \"journal-file-num\", \"missing\")\n\tcase !rec.has(recSeqNum):\n\t\treturn newErrManifestCorrupted(fd, \"seq-num\", \"missing\")\n\t}\n\n\ts.manifestFd = fd\n\ts.setVersion(staging.finish())\n\ts.setNextFileNum(rec.nextFileNum)\n\ts.recordCommited(rec)\n\treturn nil\n}\n\n// Commit session; need external synchronization.\nfunc (s *session) commit(r *sessionRecord) (err error) {\n\tv := s.version()\n\tdefer v.release()\n\n\t// spawn new version based on current version\n\tnv := v.spawn(r)\n\n\tif s.manifest == nil {\n\t\t// manifest journal writer not yet created, create one\n\t\terr = s.newManifest(r, nv)\n\t} else {\n\t\terr = s.flushManifest(r)\n\t}\n\n\t// finally, apply new version if no error rise\n\tif err == nil {\n\t\ts.setVersion(nv)\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"sync/atomic\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/memdb\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n)\n\nfunc (s *session) pickMemdbLevel(umin, umax []byte, maxLevel int) int {\n\tv := s.version()\n\tdefer v.release()\n\treturn v.pickMemdbLevel(umin, umax, maxLevel)\n}\n\nfunc (s *session) flushMemdb(rec *sessionRecord, mdb *memdb.DB, maxLevel int) (int, error) {\n\t// Create sorted table.\n\titer := mdb.NewIterator(nil)\n\tdefer iter.Release()\n\tt, n, err := s.tops.createFrom(iter)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\t// Pick level other than zero can cause compaction issue with large\n\t// bulk insert and delete on strictly incrementing key-space. The\n\t// problem is that the small deletion markers trapped at lower level,\n\t// while key/value entries keep growing at higher level. Since the\n\t// key-space is strictly incrementing it will not overlaps with\n\t// higher level, thus maximum possible level is always picked, while\n\t// overlapping deletion marker pushed into lower level.\n\t// See: https://github.com/syndtr/goleveldb/issues/127.\n\tflushLevel := s.pickMemdbLevel(t.imin.ukey(), t.imax.ukey(), maxLevel)\n\trec.addTableFile(flushLevel, t)\n\n\ts.logf(\"memdb@flush created L%d@%d N·%d S·%s %q:%q\", flushLevel, t.fd.Num, n, shortenb(int(t.size)), t.imin, t.imax)\n\treturn flushLevel, nil\n}\n\n// Pick a compaction based on current state; need external synchronization.\nfunc (s *session) pickCompaction() *compaction {\n\tv := s.version()\n\n\tvar sourceLevel int\n\tvar t0 tFiles\n\tif v.cScore >= 1 {\n\t\tsourceLevel = v.cLevel\n\t\tcptr := s.getCompPtr(sourceLevel)\n\t\ttables := v.levels[sourceLevel]\n\t\tfor _, t := range tables {\n\t\t\tif cptr == nil || s.icmp.Compare(t.imax, cptr) > 0 {\n\t\t\t\tt0 = append(t0, t)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif len(t0) == 0 {\n\t\t\tt0 = append(t0, tables[0])\n\t\t}\n\t} else {\n\t\tif p := atomic.LoadPointer(&v.cSeek); p != nil {\n\t\t\tts := (*tSet)(p)\n\t\t\tsourceLevel = ts.level\n\t\t\tt0 = append(t0, ts.table)\n\t\t} else {\n\t\t\tv.release()\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn newCompaction(s, v, sourceLevel, t0)\n}\n\n// Create compaction from given level and range; need external synchronization.\nfunc (s *session) getCompactionRange(sourceLevel int, umin, umax []byte, noLimit bool) *compaction {\n\tv := s.version()\n\n\tif sourceLevel >= len(v.levels) {\n\t\tv.release()\n\t\treturn nil\n\t}\n\n\tt0 := v.levels[sourceLevel].getOverlaps(nil, s.icmp, umin, umax, sourceLevel == 0)\n\tif len(t0) == 0 {\n\t\tv.release()\n\t\treturn nil\n\t}\n\n\t// Avoid compacting too much in one shot in case the range is large.\n\t// But we cannot do this for level-0 since level-0 files can overlap\n\t// and we must not pick one file and drop another older file if the\n\t// two files overlap.\n\tif !noLimit && sourceLevel > 0 {\n\t\tlimit := int64(v.s.o.GetCompactionSourceLimit(sourceLevel))\n\t\ttotal := int64(0)\n\t\tfor i, t := range t0 {\n\t\t\ttotal += t.size\n\t\t\tif total >= limit {\n\t\t\t\ts.logf(\"table@compaction limiting F·%d -> F·%d\", len(t0), i+1)\n\t\t\t\tt0 = t0[:i+1]\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newCompaction(s, v, sourceLevel, t0)\n}\n\nfunc newCompaction(s *session, v *version, sourceLevel int, t0 tFiles) *compaction {\n\tc := &compaction{\n\t\ts:             s,\n\t\tv:             v,\n\t\tsourceLevel:   sourceLevel,\n\t\tlevels:        [2]tFiles{t0, nil},\n\t\tmaxGPOverlaps: int64(s.o.GetCompactionGPOverlaps(sourceLevel)),\n\t\ttPtrs:         make([]int, len(v.levels)),\n\t}\n\tc.expand()\n\tc.save()\n\treturn c\n}\n\n// compaction represent a compaction state.\ntype compaction struct {\n\ts *session\n\tv *version\n\n\tsourceLevel   int\n\tlevels        [2]tFiles\n\tmaxGPOverlaps int64\n\n\tgp                tFiles\n\tgpi               int\n\tseenKey           bool\n\tgpOverlappedBytes int64\n\timin, imax        internalKey\n\ttPtrs             []int\n\treleased          bool\n\n\tsnapGPI               int\n\tsnapSeenKey           bool\n\tsnapGPOverlappedBytes int64\n\tsnapTPtrs             []int\n}\n\nfunc (c *compaction) save() {\n\tc.snapGPI = c.gpi\n\tc.snapSeenKey = c.seenKey\n\tc.snapGPOverlappedBytes = c.gpOverlappedBytes\n\tc.snapTPtrs = append(c.snapTPtrs[:0], c.tPtrs...)\n}\n\nfunc (c *compaction) restore() {\n\tc.gpi = c.snapGPI\n\tc.seenKey = c.snapSeenKey\n\tc.gpOverlappedBytes = c.snapGPOverlappedBytes\n\tc.tPtrs = append(c.tPtrs[:0], c.snapTPtrs...)\n}\n\nfunc (c *compaction) release() {\n\tif !c.released {\n\t\tc.released = true\n\t\tc.v.release()\n\t}\n}\n\n// Expand compacted tables; need external synchronization.\nfunc (c *compaction) expand() {\n\tlimit := int64(c.s.o.GetCompactionExpandLimit(c.sourceLevel))\n\tvt0 := c.v.levels[c.sourceLevel]\n\tvt1 := tFiles{}\n\tif level := c.sourceLevel + 1; level < len(c.v.levels) {\n\t\tvt1 = c.v.levels[level]\n\t}\n\n\tt0, t1 := c.levels[0], c.levels[1]\n\timin, imax := t0.getRange(c.s.icmp)\n\t// We expand t0 here just incase ukey hop across tables.\n\tt0 = vt0.getOverlaps(t0, c.s.icmp, imin.ukey(), imax.ukey(), c.sourceLevel == 0)\n\tif len(t0) != len(c.levels[0]) {\n\t\timin, imax = t0.getRange(c.s.icmp)\n\t}\n\tt1 = vt1.getOverlaps(t1, c.s.icmp, imin.ukey(), imax.ukey(), false)\n\t// Get entire range covered by compaction.\n\tamin, amax := append(t0, t1...).getRange(c.s.icmp)\n\n\t// See if we can grow the number of inputs in \"sourceLevel\" without\n\t// changing the number of \"sourceLevel+1\" files we pick up.\n\tif len(t1) > 0 {\n\t\texp0 := vt0.getOverlaps(nil, c.s.icmp, amin.ukey(), amax.ukey(), c.sourceLevel == 0)\n\t\tif len(exp0) > len(t0) && t1.size()+exp0.size() < limit {\n\t\t\txmin, xmax := exp0.getRange(c.s.icmp)\n\t\t\texp1 := vt1.getOverlaps(nil, c.s.icmp, xmin.ukey(), xmax.ukey(), false)\n\t\t\tif len(exp1) == len(t1) {\n\t\t\t\tc.s.logf(\"table@compaction expanding L%d+L%d (F·%d S·%s)+(F·%d S·%s) -> (F·%d S·%s)+(F·%d S·%s)\",\n\t\t\t\t\tc.sourceLevel, c.sourceLevel+1, len(t0), shortenb(int(t0.size())), len(t1), shortenb(int(t1.size())),\n\t\t\t\t\tlen(exp0), shortenb(int(exp0.size())), len(exp1), shortenb(int(exp1.size())))\n\t\t\t\timin, imax = xmin, xmax\n\t\t\t\tt0, t1 = exp0, exp1\n\t\t\t\tamin, amax = append(t0, t1...).getRange(c.s.icmp)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compute the set of grandparent files that overlap this compaction\n\t// (parent == sourceLevel+1; grandparent == sourceLevel+2)\n\tif level := c.sourceLevel + 2; level < len(c.v.levels) {\n\t\tc.gp = c.v.levels[level].getOverlaps(c.gp, c.s.icmp, amin.ukey(), amax.ukey(), false)\n\t}\n\n\tc.levels[0], c.levels[1] = t0, t1\n\tc.imin, c.imax = imin, imax\n}\n\n// Check whether compaction is trivial.\nfunc (c *compaction) trivial() bool {\n\treturn len(c.levels[0]) == 1 && len(c.levels[1]) == 0 && c.gp.size() <= c.maxGPOverlaps\n}\n\nfunc (c *compaction) baseLevelForKey(ukey []byte) bool {\n\tfor level := c.sourceLevel + 2; level < len(c.v.levels); level++ {\n\t\ttables := c.v.levels[level]\n\t\tfor c.tPtrs[level] < len(tables) {\n\t\t\tt := tables[c.tPtrs[level]]\n\t\t\tif c.s.icmp.uCompare(ukey, t.imax.ukey()) <= 0 {\n\t\t\t\t// We've advanced far enough.\n\t\t\t\tif c.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 {\n\t\t\t\t\t// Key falls in this file's range, so definitely not base level.\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tc.tPtrs[level]++\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (c *compaction) shouldStopBefore(ikey internalKey) bool {\n\tfor ; c.gpi < len(c.gp); c.gpi++ {\n\t\tgp := c.gp[c.gpi]\n\t\tif c.s.icmp.Compare(ikey, gp.imax) <= 0 {\n\t\t\tbreak\n\t\t}\n\t\tif c.seenKey {\n\t\t\tc.gpOverlappedBytes += gp.size\n\t\t}\n\t}\n\tc.seenKey = true\n\n\tif c.gpOverlappedBytes > c.maxGPOverlaps {\n\t\t// Too much overlap for current output; start new output.\n\t\tc.gpOverlappedBytes = 0\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Creates an iterator.\nfunc (c *compaction) newIterator() iterator.Iterator {\n\t// Creates iterator slice.\n\ticap := len(c.levels)\n\tif c.sourceLevel == 0 {\n\t\t// Special case for level-0.\n\t\ticap = len(c.levels[0]) + 1\n\t}\n\tits := make([]iterator.Iterator, 0, icap)\n\n\t// Options.\n\tro := &opt.ReadOptions{\n\t\tDontFillCache: true,\n\t\tStrict:        opt.StrictOverride,\n\t}\n\tstrict := c.s.o.GetStrict(opt.StrictCompaction)\n\tif strict {\n\t\tro.Strict |= opt.StrictReader\n\t}\n\n\tfor i, tables := range c.levels {\n\t\tif len(tables) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Level-0 is not sorted and may overlaps each other.\n\t\tif c.sourceLevel+i == 0 {\n\t\t\tfor _, t := range tables {\n\t\t\t\tits = append(its, c.s.tops.newIterator(t, nil, ro))\n\t\t\t}\n\t\t} else {\n\t\t\tit := iterator.NewIndexedIterator(tables.newIndexIterator(c.s.tops, c.s.icmp, nil, ro), strict)\n\t\t\tits = append(its, it)\n\t\t}\n\t}\n\n\treturn iterator.NewMergedIterator(its, c.s.icmp, strict)\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/session_record.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"bufio\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\ntype byteReader interface {\n\tio.Reader\n\tio.ByteReader\n}\n\n// These numbers are written to disk and should not be changed.\nconst (\n\trecComparer    = 1\n\trecJournalNum  = 2\n\trecNextFileNum = 3\n\trecSeqNum      = 4\n\trecCompPtr     = 5\n\trecDelTable    = 6\n\trecAddTable    = 7\n\t// 8 was used for large value refs\n\trecPrevJournalNum = 9\n)\n\ntype cpRecord struct {\n\tlevel int\n\tikey  internalKey\n}\n\ntype atRecord struct {\n\tlevel int\n\tnum   int64\n\tsize  int64\n\timin  internalKey\n\timax  internalKey\n}\n\ntype dtRecord struct {\n\tlevel int\n\tnum   int64\n}\n\ntype sessionRecord struct {\n\thasRec         int\n\tcomparer       string\n\tjournalNum     int64\n\tprevJournalNum int64\n\tnextFileNum    int64\n\tseqNum         uint64\n\tcompPtrs       []cpRecord\n\taddedTables    []atRecord\n\tdeletedTables  []dtRecord\n\n\tscratch [binary.MaxVarintLen64]byte\n\terr     error\n}\n\nfunc (p *sessionRecord) has(rec int) bool {\n\treturn p.hasRec&(1<<uint(rec)) != 0\n}\n\nfunc (p *sessionRecord) setComparer(name string) {\n\tp.hasRec |= 1 << recComparer\n\tp.comparer = name\n}\n\nfunc (p *sessionRecord) setJournalNum(num int64) {\n\tp.hasRec |= 1 << recJournalNum\n\tp.journalNum = num\n}\n\nfunc (p *sessionRecord) setPrevJournalNum(num int64) {\n\tp.hasRec |= 1 << recPrevJournalNum\n\tp.prevJournalNum = num\n}\n\nfunc (p *sessionRecord) setNextFileNum(num int64) {\n\tp.hasRec |= 1 << recNextFileNum\n\tp.nextFileNum = num\n}\n\nfunc (p *sessionRecord) setSeqNum(num uint64) {\n\tp.hasRec |= 1 << recSeqNum\n\tp.seqNum = num\n}\n\nfunc (p *sessionRecord) addCompPtr(level int, ikey internalKey) {\n\tp.hasRec |= 1 << recCompPtr\n\tp.compPtrs = append(p.compPtrs, cpRecord{level, ikey})\n}\n\nfunc (p *sessionRecord) resetCompPtrs() {\n\tp.hasRec &= ^(1 << recCompPtr)\n\tp.compPtrs = p.compPtrs[:0]\n}\n\nfunc (p *sessionRecord) addTable(level int, num, size int64, imin, imax internalKey) {\n\tp.hasRec |= 1 << recAddTable\n\tp.addedTables = append(p.addedTables, atRecord{level, num, size, imin, imax})\n}\n\nfunc (p *sessionRecord) addTableFile(level int, t *tFile) {\n\tp.addTable(level, t.fd.Num, t.size, t.imin, t.imax)\n}\n\nfunc (p *sessionRecord) resetAddedTables() {\n\tp.hasRec &= ^(1 << recAddTable)\n\tp.addedTables = p.addedTables[:0]\n}\n\nfunc (p *sessionRecord) delTable(level int, num int64) {\n\tp.hasRec |= 1 << recDelTable\n\tp.deletedTables = append(p.deletedTables, dtRecord{level, num})\n}\n\nfunc (p *sessionRecord) resetDeletedTables() {\n\tp.hasRec &= ^(1 << recDelTable)\n\tp.deletedTables = p.deletedTables[:0]\n}\n\nfunc (p *sessionRecord) putUvarint(w io.Writer, x uint64) {\n\tif p.err != nil {\n\t\treturn\n\t}\n\tn := binary.PutUvarint(p.scratch[:], x)\n\t_, p.err = w.Write(p.scratch[:n])\n}\n\nfunc (p *sessionRecord) putVarint(w io.Writer, x int64) {\n\tif x < 0 {\n\t\tpanic(\"invalid negative value\")\n\t}\n\tp.putUvarint(w, uint64(x))\n}\n\nfunc (p *sessionRecord) putBytes(w io.Writer, x []byte) {\n\tif p.err != nil {\n\t\treturn\n\t}\n\tp.putUvarint(w, uint64(len(x)))\n\tif p.err != nil {\n\t\treturn\n\t}\n\t_, p.err = w.Write(x)\n}\n\nfunc (p *sessionRecord) encode(w io.Writer) error {\n\tp.err = nil\n\tif p.has(recComparer) {\n\t\tp.putUvarint(w, recComparer)\n\t\tp.putBytes(w, []byte(p.comparer))\n\t}\n\tif p.has(recJournalNum) {\n\t\tp.putUvarint(w, recJournalNum)\n\t\tp.putVarint(w, p.journalNum)\n\t}\n\tif p.has(recNextFileNum) {\n\t\tp.putUvarint(w, recNextFileNum)\n\t\tp.putVarint(w, p.nextFileNum)\n\t}\n\tif p.has(recSeqNum) {\n\t\tp.putUvarint(w, recSeqNum)\n\t\tp.putUvarint(w, p.seqNum)\n\t}\n\tfor _, r := range p.compPtrs {\n\t\tp.putUvarint(w, recCompPtr)\n\t\tp.putUvarint(w, uint64(r.level))\n\t\tp.putBytes(w, r.ikey)\n\t}\n\tfor _, r := range p.deletedTables {\n\t\tp.putUvarint(w, recDelTable)\n\t\tp.putUvarint(w, uint64(r.level))\n\t\tp.putVarint(w, r.num)\n\t}\n\tfor _, r := range p.addedTables {\n\t\tp.putUvarint(w, recAddTable)\n\t\tp.putUvarint(w, uint64(r.level))\n\t\tp.putVarint(w, r.num)\n\t\tp.putVarint(w, r.size)\n\t\tp.putBytes(w, r.imin)\n\t\tp.putBytes(w, r.imax)\n\t}\n\treturn p.err\n}\n\nfunc (p *sessionRecord) readUvarintMayEOF(field string, r io.ByteReader, mayEOF bool) uint64 {\n\tif p.err != nil {\n\t\treturn 0\n\t}\n\tx, err := binary.ReadUvarint(r)\n\tif err != nil {\n\t\tif err == io.ErrUnexpectedEOF || (mayEOF == false && err == io.EOF) {\n\t\t\tp.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, \"short read\"})\n\t\t} else if strings.HasPrefix(err.Error(), \"binary:\") {\n\t\t\tp.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, err.Error()})\n\t\t} else {\n\t\t\tp.err = err\n\t\t}\n\t\treturn 0\n\t}\n\treturn x\n}\n\nfunc (p *sessionRecord) readUvarint(field string, r io.ByteReader) uint64 {\n\treturn p.readUvarintMayEOF(field, r, false)\n}\n\nfunc (p *sessionRecord) readVarint(field string, r io.ByteReader) int64 {\n\tx := int64(p.readUvarintMayEOF(field, r, false))\n\tif x < 0 {\n\t\tp.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, \"invalid negative value\"})\n\t}\n\treturn x\n}\n\nfunc (p *sessionRecord) readBytes(field string, r byteReader) []byte {\n\tif p.err != nil {\n\t\treturn nil\n\t}\n\tn := p.readUvarint(field, r)\n\tif p.err != nil {\n\t\treturn nil\n\t}\n\tx := make([]byte, n)\n\t_, p.err = io.ReadFull(r, x)\n\tif p.err != nil {\n\t\tif p.err == io.ErrUnexpectedEOF {\n\t\t\tp.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrManifestCorrupted{field, \"short read\"})\n\t\t}\n\t\treturn nil\n\t}\n\treturn x\n}\n\nfunc (p *sessionRecord) readLevel(field string, r io.ByteReader) int {\n\tif p.err != nil {\n\t\treturn 0\n\t}\n\tx := p.readUvarint(field, r)\n\tif p.err != nil {\n\t\treturn 0\n\t}\n\treturn int(x)\n}\n\nfunc (p *sessionRecord) decode(r io.Reader) error {\n\tbr, ok := r.(byteReader)\n\tif !ok {\n\t\tbr = bufio.NewReader(r)\n\t}\n\tp.err = nil\n\tfor p.err == nil {\n\t\trec := p.readUvarintMayEOF(\"field-header\", br, true)\n\t\tif p.err != nil {\n\t\t\tif p.err == io.EOF {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\treturn p.err\n\t\t}\n\t\tswitch rec {\n\t\tcase recComparer:\n\t\t\tx := p.readBytes(\"comparer\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.setComparer(string(x))\n\t\t\t}\n\t\tcase recJournalNum:\n\t\t\tx := p.readVarint(\"journal-num\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.setJournalNum(x)\n\t\t\t}\n\t\tcase recPrevJournalNum:\n\t\t\tx := p.readVarint(\"prev-journal-num\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.setPrevJournalNum(x)\n\t\t\t}\n\t\tcase recNextFileNum:\n\t\t\tx := p.readVarint(\"next-file-num\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.setNextFileNum(x)\n\t\t\t}\n\t\tcase recSeqNum:\n\t\t\tx := p.readUvarint(\"seq-num\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.setSeqNum(x)\n\t\t\t}\n\t\tcase recCompPtr:\n\t\t\tlevel := p.readLevel(\"comp-ptr.level\", br)\n\t\t\tikey := p.readBytes(\"comp-ptr.ikey\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.addCompPtr(level, internalKey(ikey))\n\t\t\t}\n\t\tcase recAddTable:\n\t\t\tlevel := p.readLevel(\"add-table.level\", br)\n\t\t\tnum := p.readVarint(\"add-table.num\", br)\n\t\t\tsize := p.readVarint(\"add-table.size\", br)\n\t\t\timin := p.readBytes(\"add-table.imin\", br)\n\t\t\timax := p.readBytes(\"add-table.imax\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.addTable(level, num, size, imin, imax)\n\t\t\t}\n\t\tcase recDelTable:\n\t\t\tlevel := p.readLevel(\"del-table.level\", br)\n\t\t\tnum := p.readVarint(\"del-table.num\", br)\n\t\t\tif p.err == nil {\n\t\t\t\tp.delTable(level, num)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn p.err\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/session_util.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"fmt\"\n\t\"sync/atomic\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/journal\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\n// Logging.\n\ntype dropper struct {\n\ts  *session\n\tfd storage.FileDesc\n}\n\nfunc (d dropper) Drop(err error) {\n\tif e, ok := err.(*journal.ErrCorrupted); ok {\n\t\td.s.logf(\"journal@drop %s-%d S·%s %q\", d.fd.Type, d.fd.Num, shortenb(e.Size), e.Reason)\n\t} else {\n\t\td.s.logf(\"journal@drop %s-%d %q\", d.fd.Type, d.fd.Num, err)\n\t}\n}\n\nfunc (s *session) log(v ...interface{})                 { s.stor.Log(fmt.Sprint(v...)) }\nfunc (s *session) logf(format string, v ...interface{}) { s.stor.Log(fmt.Sprintf(format, v...)) }\n\n// File utils.\n\nfunc (s *session) newTemp() storage.FileDesc {\n\tnum := atomic.AddInt64(&s.stTempFileNum, 1) - 1\n\treturn storage.FileDesc{storage.TypeTemp, num}\n}\n\nfunc (s *session) addFileRef(fd storage.FileDesc, ref int) int {\n\tref += s.fileRef[fd.Num]\n\tif ref > 0 {\n\t\ts.fileRef[fd.Num] = ref\n\t} else if ref == 0 {\n\t\tdelete(s.fileRef, fd.Num)\n\t} else {\n\t\tpanic(fmt.Sprintf(\"negative ref: %v\", fd))\n\t}\n\treturn ref\n}\n\n// Session state.\n\n// Get current version. This will incr version ref, must call\n// version.release (exactly once) after use.\nfunc (s *session) version() *version {\n\ts.vmu.Lock()\n\tdefer s.vmu.Unlock()\n\ts.stVersion.incref()\n\treturn s.stVersion\n}\n\nfunc (s *session) tLen(level int) int {\n\ts.vmu.Lock()\n\tdefer s.vmu.Unlock()\n\treturn s.stVersion.tLen(level)\n}\n\n// Set current version to v.\nfunc (s *session) setVersion(v *version) {\n\ts.vmu.Lock()\n\tdefer s.vmu.Unlock()\n\t// Hold by session. It is important to call this first before releasing\n\t// current version, otherwise the still used files might get released.\n\tv.incref()\n\tif s.stVersion != nil {\n\t\t// Release current version.\n\t\ts.stVersion.releaseNB()\n\t}\n\ts.stVersion = v\n}\n\n// Get current unused file number.\nfunc (s *session) nextFileNum() int64 {\n\treturn atomic.LoadInt64(&s.stNextFileNum)\n}\n\n// Set current unused file number to num.\nfunc (s *session) setNextFileNum(num int64) {\n\tatomic.StoreInt64(&s.stNextFileNum, num)\n}\n\n// Mark file number as used.\nfunc (s *session) markFileNum(num int64) {\n\tnextFileNum := num + 1\n\tfor {\n\t\told, x := s.stNextFileNum, nextFileNum\n\t\tif old > x {\n\t\t\tx = old\n\t\t}\n\t\tif atomic.CompareAndSwapInt64(&s.stNextFileNum, old, x) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Allocate a file number.\nfunc (s *session) allocFileNum() int64 {\n\treturn atomic.AddInt64(&s.stNextFileNum, 1) - 1\n}\n\n// Reuse given file number.\nfunc (s *session) reuseFileNum(num int64) {\n\tfor {\n\t\told, x := s.stNextFileNum, num\n\t\tif old != x+1 {\n\t\t\tx = old\n\t\t}\n\t\tif atomic.CompareAndSwapInt64(&s.stNextFileNum, old, x) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Set compaction ptr at given level; need external synchronization.\nfunc (s *session) setCompPtr(level int, ik internalKey) {\n\tif level >= len(s.stCompPtrs) {\n\t\tnewCompPtrs := make([]internalKey, level+1)\n\t\tcopy(newCompPtrs, s.stCompPtrs)\n\t\ts.stCompPtrs = newCompPtrs\n\t}\n\ts.stCompPtrs[level] = append(internalKey{}, ik...)\n}\n\n// Get compaction ptr at given level; need external synchronization.\nfunc (s *session) getCompPtr(level int) internalKey {\n\tif level >= len(s.stCompPtrs) {\n\t\treturn nil\n\t}\n\treturn s.stCompPtrs[level]\n}\n\n// Manifest related utils.\n\n// Fill given session record obj with current states; need external\n// synchronization.\nfunc (s *session) fillRecord(r *sessionRecord, snapshot bool) {\n\tr.setNextFileNum(s.nextFileNum())\n\n\tif snapshot {\n\t\tif !r.has(recJournalNum) {\n\t\t\tr.setJournalNum(s.stJournalNum)\n\t\t}\n\n\t\tif !r.has(recSeqNum) {\n\t\t\tr.setSeqNum(s.stSeqNum)\n\t\t}\n\n\t\tfor level, ik := range s.stCompPtrs {\n\t\t\tif ik != nil {\n\t\t\t\tr.addCompPtr(level, ik)\n\t\t\t}\n\t\t}\n\n\t\tr.setComparer(s.icmp.uName())\n\t}\n}\n\n// Mark if record has been committed, this will update session state;\n// need external synchronization.\nfunc (s *session) recordCommited(rec *sessionRecord) {\n\tif rec.has(recJournalNum) {\n\t\ts.stJournalNum = rec.journalNum\n\t}\n\n\tif rec.has(recPrevJournalNum) {\n\t\ts.stPrevJournalNum = rec.prevJournalNum\n\t}\n\n\tif rec.has(recSeqNum) {\n\t\ts.stSeqNum = rec.seqNum\n\t}\n\n\tfor _, r := range rec.compPtrs {\n\t\ts.setCompPtr(r.level, internalKey(r.ikey))\n\t}\n}\n\n// Create a new manifest file; need external synchronization.\nfunc (s *session) newManifest(rec *sessionRecord, v *version) (err error) {\n\tfd := storage.FileDesc{storage.TypeManifest, s.allocFileNum()}\n\twriter, err := s.stor.Create(fd)\n\tif err != nil {\n\t\treturn\n\t}\n\tjw := journal.NewWriter(writer)\n\n\tif v == nil {\n\t\tv = s.version()\n\t\tdefer v.release()\n\t}\n\tif rec == nil {\n\t\trec = &sessionRecord{}\n\t}\n\ts.fillRecord(rec, true)\n\tv.fillRecord(rec)\n\n\tdefer func() {\n\t\tif err == nil {\n\t\t\ts.recordCommited(rec)\n\t\t\tif s.manifest != nil {\n\t\t\t\ts.manifest.Close()\n\t\t\t}\n\t\t\tif s.manifestWriter != nil {\n\t\t\t\ts.manifestWriter.Close()\n\t\t\t}\n\t\t\tif !s.manifestFd.Zero() {\n\t\t\t\ts.stor.Remove(s.manifestFd)\n\t\t\t}\n\t\t\ts.manifestFd = fd\n\t\t\ts.manifestWriter = writer\n\t\t\ts.manifest = jw\n\t\t} else {\n\t\t\twriter.Close()\n\t\t\ts.stor.Remove(fd)\n\t\t\ts.reuseFileNum(fd.Num)\n\t\t}\n\t}()\n\n\tw, err := jw.Next()\n\tif err != nil {\n\t\treturn\n\t}\n\terr = rec.encode(w)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = jw.Flush()\n\tif err != nil {\n\t\treturn\n\t}\n\terr = s.stor.SetMeta(fd)\n\treturn\n}\n\n// Flush record to disk.\nfunc (s *session) flushManifest(rec *sessionRecord) (err error) {\n\ts.fillRecord(rec, false)\n\tw, err := s.manifest.Next()\n\tif err != nil {\n\t\treturn\n\t}\n\terr = rec.encode(w)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = s.manifest.Flush()\n\tif err != nil {\n\t\treturn\n\t}\n\tif !s.o.GetNoSync() {\n\t\terr = s.manifestWriter.Sync()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\ts.recordCommited(rec)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reservefs.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage storage\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n)\n\nvar (\n\terrFileOpen = errors.New(\"leveldb/storage: file still open\")\n\terrReadOnly = errors.New(\"leveldb/storage: storage is read-only\")\n)\n\ntype fileLock interface {\n\trelease() error\n}\n\ntype fileStorageLock struct {\n\tfs *fileStorage\n}\n\nfunc (lock *fileStorageLock) Unlock() {\n\tif lock.fs != nil {\n\t\tlock.fs.mu.Lock()\n\t\tdefer lock.fs.mu.Unlock()\n\t\tif lock.fs.slock == lock {\n\t\t\tlock.fs.slock = nil\n\t\t}\n\t}\n}\n\ntype int64Slice []int64\n\nfunc (p int64Slice) Len() int           { return len(p) }\nfunc (p int64Slice) Less(i, j int) bool { return p[i] < p[j] }\nfunc (p int64Slice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }\n\nfunc writeFileSynced(filename string, data []byte, perm os.FileMode) error {\n\tf, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)\n\tif err != nil {\n\t\treturn err\n\t}\n\tn, err := f.Write(data)\n\tif err == nil && n < len(data) {\n\t\terr = io.ErrShortWrite\n\t}\n\tif err1 := f.Sync(); err == nil {\n\t\terr = err1\n\t}\n\tif err1 := f.Close(); err == nil {\n\t\terr = err1\n\t}\n\treturn err\n}\n\nconst logSizeThreshold = 1024 * 1024 // 1 MiB\n\n// fileStorage is a file-system backed storage.\ntype fileStorage struct {\n\tpath     string\n\treadOnly bool\n\n\tmu      sync.Mutex\n\tflock   fileLock\n\tslock   *fileStorageLock\n\tlogw    *os.File\n\tlogSize int64\n\tbuf     []byte\n\t// Opened file counter; if open < 0 means closed.\n\topen int\n\tday  int\n}\n\n// OpenFile returns a new filesystem-backed storage implementation with the given\n// path. This also acquire a file lock, so any subsequent attempt to open the\n// same path will fail.\n//\n// The storage must be closed after use, by calling Close method.\nfunc OpenFile(path string, readOnly bool) (Storage, error) {\n\tif fi, err := os.Stat(path); err == nil {\n\t\tif !fi.IsDir() {\n\t\t\treturn nil, fmt.Errorf(\"leveldb/storage: open %s: not a directory\", path)\n\t\t}\n\t} else if os.IsNotExist(err) && !readOnly {\n\t\tif err := os.MkdirAll(path, 0755); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\treturn nil, err\n\t}\n\n\tflock, err := newFileLock(filepath.Join(path, \"LOCK\"), readOnly)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tflock.release()\n\t\t}\n\t}()\n\n\tvar (\n\t\tlogw    *os.File\n\t\tlogSize int64\n\t)\n\tif !readOnly {\n\t\tlogw, err = os.OpenFile(filepath.Join(path, \"LOG\"), os.O_WRONLY|os.O_CREATE, 0644)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tlogSize, err = logw.Seek(0, os.SEEK_END)\n\t\tif err != nil {\n\t\t\tlogw.Close()\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tfs := &fileStorage{\n\t\tpath:     path,\n\t\treadOnly: readOnly,\n\t\tflock:    flock,\n\t\tlogw:     logw,\n\t\tlogSize:  logSize,\n\t}\n\truntime.SetFinalizer(fs, (*fileStorage).Close)\n\treturn fs, nil\n}\n\nfunc (fs *fileStorage) Lock() (Locker, error) {\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn nil, ErrClosed\n\t}\n\tif fs.readOnly {\n\t\treturn &fileStorageLock{}, nil\n\t}\n\tif fs.slock != nil {\n\t\treturn nil, ErrLocked\n\t}\n\tfs.slock = &fileStorageLock{fs: fs}\n\treturn fs.slock, nil\n}\n\nfunc itoa(buf []byte, i int, wid int) []byte {\n\tu := uint(i)\n\tif u == 0 && wid <= 1 {\n\t\treturn append(buf, '0')\n\t}\n\n\t// Assemble decimal in reverse order.\n\tvar b [32]byte\n\tbp := len(b)\n\tfor ; u > 0 || wid > 0; u /= 10 {\n\t\tbp--\n\t\twid--\n\t\tb[bp] = byte(u%10) + '0'\n\t}\n\treturn append(buf, b[bp:]...)\n}\n\nfunc (fs *fileStorage) printDay(t time.Time) {\n\tif fs.day == t.Day() {\n\t\treturn\n\t}\n\tfs.day = t.Day()\n\tfs.logw.Write([]byte(\"=============== \" + t.Format(\"Jan 2, 2006 (MST)\") + \" ===============\\n\"))\n}\n\nfunc (fs *fileStorage) doLog(t time.Time, str string) {\n\tif fs.logSize > logSizeThreshold {\n\t\t// Rotate log file.\n\t\tfs.logw.Close()\n\t\tfs.logw = nil\n\t\tfs.logSize = 0\n\t\trename(filepath.Join(fs.path, \"LOG\"), filepath.Join(fs.path, \"LOG.old\"))\n\t}\n\tif fs.logw == nil {\n\t\tvar err error\n\t\tfs.logw, err = os.OpenFile(filepath.Join(fs.path, \"LOG\"), os.O_WRONLY|os.O_CREATE, 0644)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t// Force printDay on new log file.\n\t\tfs.day = 0\n\t}\n\tfs.printDay(t)\n\thour, min, sec := t.Clock()\n\tmsec := t.Nanosecond() / 1e3\n\t// time\n\tfs.buf = itoa(fs.buf[:0], hour, 2)\n\tfs.buf = append(fs.buf, ':')\n\tfs.buf = itoa(fs.buf, min, 2)\n\tfs.buf = append(fs.buf, ':')\n\tfs.buf = itoa(fs.buf, sec, 2)\n\tfs.buf = append(fs.buf, '.')\n\tfs.buf = itoa(fs.buf, msec, 6)\n\tfs.buf = append(fs.buf, ' ')\n\t// write\n\tfs.buf = append(fs.buf, []byte(str)...)\n\tfs.buf = append(fs.buf, '\\n')\n\tn, _ := fs.logw.Write(fs.buf)\n\tfs.logSize += int64(n)\n}\n\nfunc (fs *fileStorage) Log(str string) {\n\tif !fs.readOnly {\n\t\tt := time.Now()\n\t\tfs.mu.Lock()\n\t\tdefer fs.mu.Unlock()\n\t\tif fs.open < 0 {\n\t\t\treturn\n\t\t}\n\t\tfs.doLog(t, str)\n\t}\n}\n\nfunc (fs *fileStorage) log(str string) {\n\tif !fs.readOnly {\n\t\tfs.doLog(time.Now(), str)\n\t}\n}\n\nfunc (fs *fileStorage) setMeta(fd FileDesc) error {\n\tcontent := fsGenName(fd) + \"\\n\"\n\t// Check and backup old CURRENT file.\n\tcurrentPath := filepath.Join(fs.path, \"CURRENT\")\n\tif _, err := os.Stat(currentPath); err == nil {\n\t\tb, err := ioutil.ReadFile(currentPath)\n\t\tif err != nil {\n\t\t\tfs.log(fmt.Sprintf(\"backup CURRENT: %v\", err))\n\t\t\treturn err\n\t\t}\n\t\tif string(b) == content {\n\t\t\t// Content not changed, do nothing.\n\t\t\treturn nil\n\t\t}\n\t\tif err := writeFileSynced(currentPath+\".bak\", b, 0644); err != nil {\n\t\t\tfs.log(fmt.Sprintf(\"backup CURRENT: %v\", err))\n\t\t\treturn err\n\t\t}\n\t} else if !os.IsNotExist(err) {\n\t\treturn err\n\t}\n\tpath := fmt.Sprintf(\"%s.%d\", filepath.Join(fs.path, \"CURRENT\"), fd.Num)\n\tif err := writeFileSynced(path, []byte(content), 0644); err != nil {\n\t\tfs.log(fmt.Sprintf(\"create CURRENT.%d: %v\", fd.Num, err))\n\t\treturn err\n\t}\n\t// Replace CURRENT file.\n\tif err := rename(path, currentPath); err != nil {\n\t\tfs.log(fmt.Sprintf(\"rename CURRENT.%d: %v\", fd.Num, err))\n\t\treturn err\n\t}\n\t// Sync root directory.\n\tif err := syncDir(fs.path); err != nil {\n\t\tfs.log(fmt.Sprintf(\"syncDir: %v\", err))\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (fs *fileStorage) SetMeta(fd FileDesc) error {\n\tif !FileDescOk(fd) {\n\t\treturn ErrInvalidFile\n\t}\n\tif fs.readOnly {\n\t\treturn errReadOnly\n\t}\n\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn ErrClosed\n\t}\n\treturn fs.setMeta(fd)\n}\n\nfunc (fs *fileStorage) GetMeta() (FileDesc, error) {\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn FileDesc{}, ErrClosed\n\t}\n\tdir, err := os.Open(fs.path)\n\tif err != nil {\n\t\treturn FileDesc{}, err\n\t}\n\tnames, err := dir.Readdirnames(0)\n\t// Close the dir first before checking for Readdirnames error.\n\tif ce := dir.Close(); ce != nil {\n\t\tfs.log(fmt.Sprintf(\"close dir: %v\", ce))\n\t}\n\tif err != nil {\n\t\treturn FileDesc{}, err\n\t}\n\t// Try this in order:\n\t// - CURRENT.[0-9]+ ('pending rename' file, descending order)\n\t// - CURRENT\n\t// - CURRENT.bak\n\t//\n\t// Skip corrupted file or file that point to a missing target file.\n\ttype currentFile struct {\n\t\tname string\n\t\tfd   FileDesc\n\t}\n\ttryCurrent := func(name string) (*currentFile, error) {\n\t\tb, err := ioutil.ReadFile(filepath.Join(fs.path, name))\n\t\tif err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\terr = os.ErrNotExist\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\tvar fd FileDesc\n\t\tif len(b) < 1 || b[len(b)-1] != '\\n' || !fsParseNamePtr(string(b[:len(b)-1]), &fd) {\n\t\t\tfs.log(fmt.Sprintf(\"%s: corrupted content: %q\", name, b))\n\t\t\terr := &ErrCorrupted{\n\t\t\t\tErr: errors.New(\"leveldb/storage: corrupted or incomplete CURRENT file\"),\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\tif _, err := os.Stat(filepath.Join(fs.path, fsGenName(fd))); err != nil {\n\t\t\tif os.IsNotExist(err) {\n\t\t\t\tfs.log(fmt.Sprintf(\"%s: missing target file: %s\", name, fd))\n\t\t\t\terr = os.ErrNotExist\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &currentFile{name: name, fd: fd}, nil\n\t}\n\ttryCurrents := func(names []string) (*currentFile, error) {\n\t\tvar (\n\t\t\tcur *currentFile\n\t\t\t// Last corruption error.\n\t\t\tlastCerr error\n\t\t)\n\t\tfor _, name := range names {\n\t\t\tvar err error\n\t\t\tcur, err = tryCurrent(name)\n\t\t\tif err == nil {\n\t\t\t\tbreak\n\t\t\t} else if err == os.ErrNotExist {\n\t\t\t\t// Fallback to the next file.\n\t\t\t} else if isCorrupted(err) {\n\t\t\t\tlastCerr = err\n\t\t\t\t// Fallback to the next file.\n\t\t\t} else {\n\t\t\t\t// In case the error is due to permission, etc.\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tif cur == nil {\n\t\t\terr := os.ErrNotExist\n\t\t\tif lastCerr != nil {\n\t\t\t\terr = lastCerr\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\treturn cur, nil\n\t}\n\n\t// Try 'pending rename' files.\n\tvar nums []int64\n\tfor _, name := range names {\n\t\tif strings.HasPrefix(name, \"CURRENT.\") && name != \"CURRENT.bak\" {\n\t\t\ti, err := strconv.ParseInt(name[8:], 10, 64)\n\t\t\tif err == nil {\n\t\t\t\tnums = append(nums, i)\n\t\t\t}\n\t\t}\n\t}\n\tvar (\n\t\tpendCur   *currentFile\n\t\tpendErr   = os.ErrNotExist\n\t\tpendNames []string\n\t)\n\tif len(nums) > 0 {\n\t\tsort.Sort(sort.Reverse(int64Slice(nums)))\n\t\tpendNames = make([]string, len(nums))\n\t\tfor i, num := range nums {\n\t\t\tpendNames[i] = fmt.Sprintf(\"CURRENT.%d\", num)\n\t\t}\n\t\tpendCur, pendErr = tryCurrents(pendNames)\n\t\tif pendErr != nil && pendErr != os.ErrNotExist && !isCorrupted(pendErr) {\n\t\t\treturn FileDesc{}, pendErr\n\t\t}\n\t}\n\n\t// Try CURRENT and CURRENT.bak.\n\tcurCur, curErr := tryCurrents([]string{\"CURRENT\", \"CURRENT.bak\"})\n\tif curErr != nil && curErr != os.ErrNotExist && !isCorrupted(curErr) {\n\t\treturn FileDesc{}, curErr\n\t}\n\n\t// pendCur takes precedence, but guards against obsolete pendCur.\n\tif pendCur != nil && (curCur == nil || pendCur.fd.Num > curCur.fd.Num) {\n\t\tcurCur = pendCur\n\t}\n\n\tif curCur != nil {\n\t\t// Restore CURRENT file to proper state.\n\t\tif !fs.readOnly && (curCur.name != \"CURRENT\" || len(pendNames) != 0) {\n\t\t\t// Ignore setMeta errors, however don't delete obsolete files if we\n\t\t\t// catch error.\n\t\t\tif err := fs.setMeta(curCur.fd); err == nil {\n\t\t\t\t// Remove 'pending rename' files.\n\t\t\t\tfor _, name := range pendNames {\n\t\t\t\t\tif err := os.Remove(filepath.Join(fs.path, name)); err != nil {\n\t\t\t\t\t\tfs.log(fmt.Sprintf(\"remove %s: %v\", name, err))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn curCur.fd, nil\n\t}\n\n\t// Nothing found.\n\tif isCorrupted(pendErr) {\n\t\treturn FileDesc{}, pendErr\n\t}\n\treturn FileDesc{}, curErr\n}\n\nfunc (fs *fileStorage) List(ft FileType) (fds []FileDesc, err error) {\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn nil, ErrClosed\n\t}\n\tdir, err := os.Open(fs.path)\n\tif err != nil {\n\t\treturn\n\t}\n\tnames, err := dir.Readdirnames(0)\n\t// Close the dir first before checking for Readdirnames error.\n\tif cerr := dir.Close(); cerr != nil {\n\t\tfs.log(fmt.Sprintf(\"close dir: %v\", cerr))\n\t}\n\tif err == nil {\n\t\tfor _, name := range names {\n\t\t\tif fd, ok := fsParseName(name); ok && fd.Type&ft != 0 {\n\t\t\t\tfds = append(fds, fd)\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (fs *fileStorage) Open(fd FileDesc) (Reader, error) {\n\tif !FileDescOk(fd) {\n\t\treturn nil, ErrInvalidFile\n\t}\n\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn nil, ErrClosed\n\t}\n\tof, err := os.OpenFile(filepath.Join(fs.path, fsGenName(fd)), os.O_RDONLY, 0)\n\tif err != nil {\n\t\tif fsHasOldName(fd) && os.IsNotExist(err) {\n\t\t\tof, err = os.OpenFile(filepath.Join(fs.path, fsGenOldName(fd)), os.O_RDONLY, 0)\n\t\t\tif err == nil {\n\t\t\t\tgoto ok\n\t\t\t}\n\t\t}\n\t\treturn nil, err\n\t}\nok:\n\tfs.open++\n\treturn &fileWrap{File: of, fs: fs, fd: fd}, nil\n}\n\nfunc (fs *fileStorage) Create(fd FileDesc) (Writer, error) {\n\tif !FileDescOk(fd) {\n\t\treturn nil, ErrInvalidFile\n\t}\n\tif fs.readOnly {\n\t\treturn nil, errReadOnly\n\t}\n\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn nil, ErrClosed\n\t}\n\tof, err := os.OpenFile(filepath.Join(fs.path, fsGenName(fd)), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfs.open++\n\treturn &fileWrap{File: of, fs: fs, fd: fd}, nil\n}\n\nfunc (fs *fileStorage) Remove(fd FileDesc) error {\n\tif !FileDescOk(fd) {\n\t\treturn ErrInvalidFile\n\t}\n\tif fs.readOnly {\n\t\treturn errReadOnly\n\t}\n\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn ErrClosed\n\t}\n\terr := os.Remove(filepath.Join(fs.path, fsGenName(fd)))\n\tif err != nil {\n\t\tif fsHasOldName(fd) && os.IsNotExist(err) {\n\t\t\tif e1 := os.Remove(filepath.Join(fs.path, fsGenOldName(fd))); !os.IsNotExist(e1) {\n\t\t\t\tfs.log(fmt.Sprintf(\"remove %s: %v (old name)\", fd, err))\n\t\t\t\terr = e1\n\t\t\t}\n\t\t} else {\n\t\t\tfs.log(fmt.Sprintf(\"remove %s: %v\", fd, err))\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (fs *fileStorage) Rename(oldfd, newfd FileDesc) error {\n\tif !FileDescOk(oldfd) || !FileDescOk(newfd) {\n\t\treturn ErrInvalidFile\n\t}\n\tif oldfd == newfd {\n\t\treturn nil\n\t}\n\tif fs.readOnly {\n\t\treturn errReadOnly\n\t}\n\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn ErrClosed\n\t}\n\treturn rename(filepath.Join(fs.path, fsGenName(oldfd)), filepath.Join(fs.path, fsGenName(newfd)))\n}\n\nfunc (fs *fileStorage) Close() error {\n\tfs.mu.Lock()\n\tdefer fs.mu.Unlock()\n\tif fs.open < 0 {\n\t\treturn ErrClosed\n\t}\n\t// Clear the finalizer.\n\truntime.SetFinalizer(fs, nil)\n\n\tif fs.open > 0 {\n\t\tfs.log(fmt.Sprintf(\"close: warning, %d files still open\", fs.open))\n\t}\n\tfs.open = -1\n\tif fs.logw != nil {\n\t\tfs.logw.Close()\n\t}\n\treturn fs.flock.release()\n}\n\ntype fileWrap struct {\n\t*os.File\n\tfs     *fileStorage\n\tfd     FileDesc\n\tclosed bool\n}\n\nfunc (fw *fileWrap) Sync() error {\n\tif err := fw.File.Sync(); err != nil {\n\t\treturn err\n\t}\n\tif fw.fd.Type == TypeManifest {\n\t\t// Also sync parent directory if file type is manifest.\n\t\t// See: https://code.google.com/p/leveldb/issues/detail?id=190.\n\t\tif err := syncDir(fw.fs.path); err != nil {\n\t\t\tfw.fs.log(fmt.Sprintf(\"syncDir: %v\", err))\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (fw *fileWrap) Close() error {\n\tfw.fs.mu.Lock()\n\tdefer fw.fs.mu.Unlock()\n\tif fw.closed {\n\t\treturn ErrClosed\n\t}\n\tfw.closed = true\n\tfw.fs.open--\n\terr := fw.File.Close()\n\tif err != nil {\n\t\tfw.fs.log(fmt.Sprintf(\"close %s: %v\", fw.fd, err))\n\t}\n\treturn err\n}\n\nfunc fsGenName(fd FileDesc) string {\n\tswitch fd.Type {\n\tcase TypeManifest:\n\t\treturn fmt.Sprintf(\"MANIFEST-%06d\", fd.Num)\n\tcase TypeJournal:\n\t\treturn fmt.Sprintf(\"%06d.log\", fd.Num)\n\tcase TypeTable:\n\t\treturn fmt.Sprintf(\"%06d.ldb\", fd.Num)\n\tcase TypeTemp:\n\t\treturn fmt.Sprintf(\"%06d.tmp\", fd.Num)\n\tdefault:\n\t\tpanic(\"invalid file type\")\n\t}\n}\n\nfunc fsHasOldName(fd FileDesc) bool {\n\treturn fd.Type == TypeTable\n}\n\nfunc fsGenOldName(fd FileDesc) string {\n\tswitch fd.Type {\n\tcase TypeTable:\n\t\treturn fmt.Sprintf(\"%06d.sst\", fd.Num)\n\t}\n\treturn fsGenName(fd)\n}\n\nfunc fsParseName(name string) (fd FileDesc, ok bool) {\n\tvar tail string\n\t_, err := fmt.Sscanf(name, \"%d.%s\", &fd.Num, &tail)\n\tif err == nil {\n\t\tswitch tail {\n\t\tcase \"log\":\n\t\t\tfd.Type = TypeJournal\n\t\tcase \"ldb\", \"sst\":\n\t\t\tfd.Type = TypeTable\n\t\tcase \"tmp\":\n\t\t\tfd.Type = TypeTemp\n\t\tdefault:\n\t\t\treturn\n\t\t}\n\t\treturn fd, true\n\t}\n\tn, _ := fmt.Sscanf(name, \"MANIFEST-%d%s\", &fd.Num, &tail)\n\tif n == 1 {\n\t\tfd.Type = TypeManifest\n\t\treturn fd, true\n\t}\n\treturn\n}\n\nfunc fsParseNamePtr(name string, fd *FileDesc) bool {\n\t_fd, ok := fsParseName(name)\n\tif fd != nil {\n\t\t*fd = _fd\n\t}\n\treturn ok\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_nacl.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// +build nacl\n\npackage storage\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\nfunc newFileLock(path string, readOnly bool) (fl fileLock, err error) {\n\treturn nil, syscall.ENOTSUP\n}\n\nfunc setFileLock(f *os.File, readOnly, lock bool) error {\n\treturn syscall.ENOTSUP\n}\n\nfunc rename(oldpath, newpath string) error {\n\treturn syscall.ENOTSUP\n}\n\nfunc isErrInvalid(err error) bool {\n\treturn false\n}\n\nfunc syncDir(name string) error {\n\treturn syscall.ENOTSUP\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage storage\n\nimport (\n\t\"os\"\n)\n\ntype plan9FileLock struct {\n\tf *os.File\n}\n\nfunc (fl *plan9FileLock) release() error {\n\treturn fl.f.Close()\n}\n\nfunc newFileLock(path string, readOnly bool) (fl fileLock, err error) {\n\tvar (\n\t\tflag int\n\t\tperm os.FileMode\n\t)\n\tif readOnly {\n\t\tflag = os.O_RDONLY\n\t} else {\n\t\tflag = os.O_RDWR\n\t\tperm = os.ModeExclusive\n\t}\n\tf, err := os.OpenFile(path, flag, perm)\n\tif os.IsNotExist(err) {\n\t\tf, err = os.OpenFile(path, flag|os.O_CREATE, perm|0644)\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\tfl = &plan9FileLock{f: f}\n\treturn\n}\n\nfunc rename(oldpath, newpath string) error {\n\tif _, err := os.Stat(newpath); err == nil {\n\t\tif err := os.Remove(newpath); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn os.Rename(oldpath, newpath)\n}\n\nfunc syncDir(name string) error {\n\tf, err := os.Open(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\tif err := f.Sync(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// +build solaris\n\npackage storage\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\ntype unixFileLock struct {\n\tf *os.File\n}\n\nfunc (fl *unixFileLock) release() error {\n\tif err := setFileLock(fl.f, false, false); err != nil {\n\t\treturn err\n\t}\n\treturn fl.f.Close()\n}\n\nfunc newFileLock(path string, readOnly bool) (fl fileLock, err error) {\n\tvar flag int\n\tif readOnly {\n\t\tflag = os.O_RDONLY\n\t} else {\n\t\tflag = os.O_RDWR\n\t}\n\tf, err := os.OpenFile(path, flag, 0)\n\tif os.IsNotExist(err) {\n\t\tf, err = os.OpenFile(path, flag|os.O_CREATE, 0644)\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\terr = setFileLock(f, readOnly, true)\n\tif err != nil {\n\t\tf.Close()\n\t\treturn\n\t}\n\tfl = &unixFileLock{f: f}\n\treturn\n}\n\nfunc setFileLock(f *os.File, readOnly, lock bool) error {\n\tflock := syscall.Flock_t{\n\t\tType:   syscall.F_UNLCK,\n\t\tStart:  0,\n\t\tLen:    0,\n\t\tWhence: 1,\n\t}\n\tif lock {\n\t\tif readOnly {\n\t\t\tflock.Type = syscall.F_RDLCK\n\t\t} else {\n\t\t\tflock.Type = syscall.F_WRLCK\n\t\t}\n\t}\n\treturn syscall.FcntlFlock(f.Fd(), syscall.F_SETLK, &flock)\n}\n\nfunc rename(oldpath, newpath string) error {\n\treturn os.Rename(oldpath, newpath)\n}\n\nfunc syncDir(name string) error {\n\tf, err := os.Open(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\tif err := f.Sync(); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd\n\npackage storage\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\ntype unixFileLock struct {\n\tf *os.File\n}\n\nfunc (fl *unixFileLock) release() error {\n\tif err := setFileLock(fl.f, false, false); err != nil {\n\t\treturn err\n\t}\n\treturn fl.f.Close()\n}\n\nfunc newFileLock(path string, readOnly bool) (fl fileLock, err error) {\n\tvar flag int\n\tif readOnly {\n\t\tflag = os.O_RDONLY\n\t} else {\n\t\tflag = os.O_RDWR\n\t}\n\tf, err := os.OpenFile(path, flag, 0)\n\tif os.IsNotExist(err) {\n\t\tf, err = os.OpenFile(path, flag|os.O_CREATE, 0644)\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\terr = setFileLock(f, readOnly, true)\n\tif err != nil {\n\t\tf.Close()\n\t\treturn\n\t}\n\tfl = &unixFileLock{f: f}\n\treturn\n}\n\nfunc setFileLock(f *os.File, readOnly, lock bool) error {\n\thow := syscall.LOCK_UN\n\tif lock {\n\t\tif readOnly {\n\t\t\thow = syscall.LOCK_SH\n\t\t} else {\n\t\t\thow = syscall.LOCK_EX\n\t\t}\n\t}\n\treturn syscall.Flock(int(f.Fd()), how|syscall.LOCK_NB)\n}\n\nfunc rename(oldpath, newpath string) error {\n\treturn os.Rename(oldpath, newpath)\n}\n\nfunc isErrInvalid(err error) bool {\n\tif err == os.ErrInvalid {\n\t\treturn true\n\t}\n\t// Go < 1.8\n\tif syserr, ok := err.(*os.SyscallError); ok && syserr.Err == syscall.EINVAL {\n\t\treturn true\n\t}\n\t// Go >= 1.8 returns *os.PathError instead\n\tif patherr, ok := err.(*os.PathError); ok && patherr.Err == syscall.EINVAL {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc syncDir(name string) error {\n\t// As per fsync manpage, Linux seems to expect fsync on directory, however\n\t// some system don't support this, so we will ignore syscall.EINVAL.\n\t//\n\t// From fsync(2):\n\t//   Calling fsync() does not necessarily ensure that the entry in the\n\t//   directory containing the file has also reached disk. For that an\n\t//   explicit fsync() on a file descriptor for the directory is also needed.\n\tf, err := os.Open(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer f.Close()\n\tif err := f.Sync(); err != nil && !isErrInvalid(err) {\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go",
    "content": "// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage storage\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar (\n\tmodkernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\n\n\tprocMoveFileExW = modkernel32.NewProc(\"MoveFileExW\")\n)\n\nconst (\n\t_MOVEFILE_REPLACE_EXISTING = 1\n)\n\ntype windowsFileLock struct {\n\tfd syscall.Handle\n}\n\nfunc (fl *windowsFileLock) release() error {\n\treturn syscall.Close(fl.fd)\n}\n\nfunc newFileLock(path string, readOnly bool) (fl fileLock, err error) {\n\tpathp, err := syscall.UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar access, shareMode uint32\n\tif readOnly {\n\t\taccess = syscall.GENERIC_READ\n\t\tshareMode = syscall.FILE_SHARE_READ\n\t} else {\n\t\taccess = syscall.GENERIC_READ | syscall.GENERIC_WRITE\n\t}\n\tfd, err := syscall.CreateFile(pathp, access, shareMode, nil, syscall.OPEN_EXISTING, syscall.FILE_ATTRIBUTE_NORMAL, 0)\n\tif err == syscall.ERROR_FILE_NOT_FOUND {\n\t\tfd, err = syscall.CreateFile(pathp, access, shareMode, nil, syscall.OPEN_ALWAYS, syscall.FILE_ATTRIBUTE_NORMAL, 0)\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\tfl = &windowsFileLock{fd: fd}\n\treturn\n}\n\nfunc moveFileEx(from *uint16, to *uint16, flags uint32) error {\n\tr1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\treturn error(e1)\n\t\t}\n\t\treturn syscall.EINVAL\n\t}\n\treturn nil\n}\n\nfunc rename(oldpath, newpath string) error {\n\tfrom, err := syscall.UTF16PtrFromString(oldpath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tto, err := syscall.UTF16PtrFromString(newpath)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn moveFileEx(from, to, _MOVEFILE_REPLACE_EXISTING)\n}\n\nfunc syncDir(name string) error { return nil }\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/mem_storage.go",
    "content": "// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage storage\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"sync\"\n)\n\nconst typeShift = 4\n\n// Verify at compile-time that typeShift is large enough to cover all FileType\n// values by confirming that 0 == 0.\nvar _ [0]struct{} = [TypeAll >> typeShift]struct{}{}\n\ntype memStorageLock struct {\n\tms *memStorage\n}\n\nfunc (lock *memStorageLock) Unlock() {\n\tms := lock.ms\n\tms.mu.Lock()\n\tdefer ms.mu.Unlock()\n\tif ms.slock == lock {\n\t\tms.slock = nil\n\t}\n\treturn\n}\n\n// memStorage is a memory-backed storage.\ntype memStorage struct {\n\tmu    sync.Mutex\n\tslock *memStorageLock\n\tfiles map[uint64]*memFile\n\tmeta  FileDesc\n}\n\n// NewMemStorage returns a new memory-backed storage implementation.\nfunc NewMemStorage() Storage {\n\treturn &memStorage{\n\t\tfiles: make(map[uint64]*memFile),\n\t}\n}\n\nfunc (ms *memStorage) Lock() (Locker, error) {\n\tms.mu.Lock()\n\tdefer ms.mu.Unlock()\n\tif ms.slock != nil {\n\t\treturn nil, ErrLocked\n\t}\n\tms.slock = &memStorageLock{ms: ms}\n\treturn ms.slock, nil\n}\n\nfunc (*memStorage) Log(str string) {}\n\nfunc (ms *memStorage) SetMeta(fd FileDesc) error {\n\tif !FileDescOk(fd) {\n\t\treturn ErrInvalidFile\n\t}\n\n\tms.mu.Lock()\n\tms.meta = fd\n\tms.mu.Unlock()\n\treturn nil\n}\n\nfunc (ms *memStorage) GetMeta() (FileDesc, error) {\n\tms.mu.Lock()\n\tdefer ms.mu.Unlock()\n\tif ms.meta.Zero() {\n\t\treturn FileDesc{}, os.ErrNotExist\n\t}\n\treturn ms.meta, nil\n}\n\nfunc (ms *memStorage) List(ft FileType) ([]FileDesc, error) {\n\tms.mu.Lock()\n\tvar fds []FileDesc\n\tfor x := range ms.files {\n\t\tfd := unpackFile(x)\n\t\tif fd.Type&ft != 0 {\n\t\t\tfds = append(fds, fd)\n\t\t}\n\t}\n\tms.mu.Unlock()\n\treturn fds, nil\n}\n\nfunc (ms *memStorage) Open(fd FileDesc) (Reader, error) {\n\tif !FileDescOk(fd) {\n\t\treturn nil, ErrInvalidFile\n\t}\n\n\tms.mu.Lock()\n\tdefer ms.mu.Unlock()\n\tif m, exist := ms.files[packFile(fd)]; exist {\n\t\tif m.open {\n\t\t\treturn nil, errFileOpen\n\t\t}\n\t\tm.open = true\n\t\treturn &memReader{Reader: bytes.NewReader(m.Bytes()), ms: ms, m: m}, nil\n\t}\n\treturn nil, os.ErrNotExist\n}\n\nfunc (ms *memStorage) Create(fd FileDesc) (Writer, error) {\n\tif !FileDescOk(fd) {\n\t\treturn nil, ErrInvalidFile\n\t}\n\n\tx := packFile(fd)\n\tms.mu.Lock()\n\tdefer ms.mu.Unlock()\n\tm, exist := ms.files[x]\n\tif exist {\n\t\tif m.open {\n\t\t\treturn nil, errFileOpen\n\t\t}\n\t\tm.Reset()\n\t} else {\n\t\tm = &memFile{}\n\t\tms.files[x] = m\n\t}\n\tm.open = true\n\treturn &memWriter{memFile: m, ms: ms}, nil\n}\n\nfunc (ms *memStorage) Remove(fd FileDesc) error {\n\tif !FileDescOk(fd) {\n\t\treturn ErrInvalidFile\n\t}\n\n\tx := packFile(fd)\n\tms.mu.Lock()\n\tdefer ms.mu.Unlock()\n\tif _, exist := ms.files[x]; exist {\n\t\tdelete(ms.files, x)\n\t\treturn nil\n\t}\n\treturn os.ErrNotExist\n}\n\nfunc (ms *memStorage) Rename(oldfd, newfd FileDesc) error {\n\tif !FileDescOk(oldfd) || !FileDescOk(newfd) {\n\t\treturn ErrInvalidFile\n\t}\n\tif oldfd == newfd {\n\t\treturn nil\n\t}\n\n\toldx := packFile(oldfd)\n\tnewx := packFile(newfd)\n\tms.mu.Lock()\n\tdefer ms.mu.Unlock()\n\toldm, exist := ms.files[oldx]\n\tif !exist {\n\t\treturn os.ErrNotExist\n\t}\n\tnewm, exist := ms.files[newx]\n\tif (exist && newm.open) || oldm.open {\n\t\treturn errFileOpen\n\t}\n\tdelete(ms.files, oldx)\n\tms.files[newx] = oldm\n\treturn nil\n}\n\nfunc (*memStorage) Close() error { return nil }\n\ntype memFile struct {\n\tbytes.Buffer\n\topen bool\n}\n\ntype memReader struct {\n\t*bytes.Reader\n\tms     *memStorage\n\tm      *memFile\n\tclosed bool\n}\n\nfunc (mr *memReader) Close() error {\n\tmr.ms.mu.Lock()\n\tdefer mr.ms.mu.Unlock()\n\tif mr.closed {\n\t\treturn ErrClosed\n\t}\n\tmr.m.open = false\n\treturn nil\n}\n\ntype memWriter struct {\n\t*memFile\n\tms     *memStorage\n\tclosed bool\n}\n\nfunc (*memWriter) Sync() error { return nil }\n\nfunc (mw *memWriter) Close() error {\n\tmw.ms.mu.Lock()\n\tdefer mw.ms.mu.Unlock()\n\tif mw.closed {\n\t\treturn ErrClosed\n\t}\n\tmw.memFile.open = false\n\treturn nil\n}\n\nfunc packFile(fd FileDesc) uint64 {\n\treturn uint64(fd.Num)<<typeShift | uint64(fd.Type)\n}\n\nfunc unpackFile(x uint64) FileDesc {\n\treturn FileDesc{FileType(x) & TypeAll, int64(x >> typeShift)}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage/storage.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package storage provides storage abstraction for LevelDB.\npackage storage\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n)\n\n// FileType represent a file type.\ntype FileType int\n\n// File types.\nconst (\n\tTypeManifest FileType = 1 << iota\n\tTypeJournal\n\tTypeTable\n\tTypeTemp\n\n\tTypeAll = TypeManifest | TypeJournal | TypeTable | TypeTemp\n)\n\nfunc (t FileType) String() string {\n\tswitch t {\n\tcase TypeManifest:\n\t\treturn \"manifest\"\n\tcase TypeJournal:\n\t\treturn \"journal\"\n\tcase TypeTable:\n\t\treturn \"table\"\n\tcase TypeTemp:\n\t\treturn \"temp\"\n\t}\n\treturn fmt.Sprintf(\"<unknown:%d>\", t)\n}\n\n// Common error.\nvar (\n\tErrInvalidFile = errors.New(\"leveldb/storage: invalid file for argument\")\n\tErrLocked      = errors.New(\"leveldb/storage: already locked\")\n\tErrClosed      = errors.New(\"leveldb/storage: closed\")\n)\n\n// ErrCorrupted is the type that wraps errors that indicate corruption of\n// a file. Package storage has its own type instead of using\n// errors.ErrCorrupted to prevent circular import.\ntype ErrCorrupted struct {\n\tFd  FileDesc\n\tErr error\n}\n\nfunc isCorrupted(err error) bool {\n\tswitch err.(type) {\n\tcase *ErrCorrupted:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (e *ErrCorrupted) Error() string {\n\tif !e.Fd.Zero() {\n\t\treturn fmt.Sprintf(\"%v [file=%v]\", e.Err, e.Fd)\n\t}\n\treturn e.Err.Error()\n}\n\n// Syncer is the interface that wraps basic Sync method.\ntype Syncer interface {\n\t// Sync commits the current contents of the file to stable storage.\n\tSync() error\n}\n\n// Reader is the interface that groups the basic Read, Seek, ReadAt and Close\n// methods.\ntype Reader interface {\n\tio.ReadSeeker\n\tio.ReaderAt\n\tio.Closer\n}\n\n// Writer is the interface that groups the basic Write, Sync and Close\n// methods.\ntype Writer interface {\n\tio.WriteCloser\n\tSyncer\n}\n\n// Locker is the interface that wraps Unlock method.\ntype Locker interface {\n\tUnlock()\n}\n\n// FileDesc is a 'file descriptor'.\ntype FileDesc struct {\n\tType FileType\n\tNum  int64\n}\n\nfunc (fd FileDesc) String() string {\n\tswitch fd.Type {\n\tcase TypeManifest:\n\t\treturn fmt.Sprintf(\"MANIFEST-%06d\", fd.Num)\n\tcase TypeJournal:\n\t\treturn fmt.Sprintf(\"%06d.log\", fd.Num)\n\tcase TypeTable:\n\t\treturn fmt.Sprintf(\"%06d.ldb\", fd.Num)\n\tcase TypeTemp:\n\t\treturn fmt.Sprintf(\"%06d.tmp\", fd.Num)\n\tdefault:\n\t\treturn fmt.Sprintf(\"%#x-%d\", fd.Type, fd.Num)\n\t}\n}\n\n// Zero returns true if fd == (FileDesc{}).\nfunc (fd FileDesc) Zero() bool {\n\treturn fd == (FileDesc{})\n}\n\n// FileDescOk returns true if fd is a valid 'file descriptor'.\nfunc FileDescOk(fd FileDesc) bool {\n\tswitch fd.Type {\n\tcase TypeManifest:\n\tcase TypeJournal:\n\tcase TypeTable:\n\tcase TypeTemp:\n\tdefault:\n\t\treturn false\n\t}\n\treturn fd.Num >= 0\n}\n\n// Storage is the storage. A storage instance must be safe for concurrent use.\ntype Storage interface {\n\t// Lock locks the storage. Any subsequent attempt to call Lock will fail\n\t// until the last lock released.\n\t// Caller should call Unlock method after use.\n\tLock() (Locker, error)\n\n\t// Log logs a string. This is used for logging.\n\t// An implementation may write to a file, stdout or simply do nothing.\n\tLog(str string)\n\n\t// SetMeta store 'file descriptor' that can later be acquired using GetMeta\n\t// method. The 'file descriptor' should point to a valid file.\n\t// SetMeta should be implemented in such way that changes should happen\n\t// atomically.\n\tSetMeta(fd FileDesc) error\n\n\t// GetMeta returns 'file descriptor' stored in meta. The 'file descriptor'\n\t// can be updated using SetMeta method.\n\t// Returns os.ErrNotExist if meta doesn't store any 'file descriptor', or\n\t// 'file descriptor' point to nonexistent file.\n\tGetMeta() (FileDesc, error)\n\n\t// List returns file descriptors that match the given file types.\n\t// The file types may be OR'ed together.\n\tList(ft FileType) ([]FileDesc, error)\n\n\t// Open opens file with the given 'file descriptor' read-only.\n\t// Returns os.ErrNotExist error if the file does not exist.\n\t// Returns ErrClosed if the underlying storage is closed.\n\tOpen(fd FileDesc) (Reader, error)\n\n\t// Create creates file with the given 'file descriptor', truncate if already\n\t// exist and opens write-only.\n\t// Returns ErrClosed if the underlying storage is closed.\n\tCreate(fd FileDesc) (Writer, error)\n\n\t// Remove removes file with the given 'file descriptor'.\n\t// Returns ErrClosed if the underlying storage is closed.\n\tRemove(fd FileDesc) error\n\n\t// Rename renames file from oldfd to newfd.\n\t// Returns ErrClosed if the underlying storage is closed.\n\tRename(oldfd, newfd FileDesc) error\n\n\t// Close closes the storage.\n\t// It is valid to call Close multiple times. Other methods should not be\n\t// called after the storage has been closed.\n\tClose() error\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/storage.go",
    "content": "package leveldb\n\nimport (\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"sync/atomic\"\n)\n\ntype iStorage struct {\n\tstorage.Storage\n\tread  uint64\n\twrite uint64\n}\n\nfunc (c *iStorage) Open(fd storage.FileDesc) (storage.Reader, error) {\n\tr, err := c.Storage.Open(fd)\n\treturn &iStorageReader{r, c}, err\n}\n\nfunc (c *iStorage) Create(fd storage.FileDesc) (storage.Writer, error) {\n\tw, err := c.Storage.Create(fd)\n\treturn &iStorageWriter{w, c}, err\n}\n\nfunc (c *iStorage) reads() uint64 {\n\treturn atomic.LoadUint64(&c.read)\n}\n\nfunc (c *iStorage) writes() uint64 {\n\treturn atomic.LoadUint64(&c.write)\n}\n\n// newIStorage returns the given storage wrapped by iStorage.\nfunc newIStorage(s storage.Storage) *iStorage {\n\treturn &iStorage{s, 0, 0}\n}\n\ntype iStorageReader struct {\n\tstorage.Reader\n\tc *iStorage\n}\n\nfunc (r *iStorageReader) Read(p []byte) (n int, err error) {\n\tn, err = r.Reader.Read(p)\n\tatomic.AddUint64(&r.c.read, uint64(n))\n\treturn n, err\n}\n\nfunc (r *iStorageReader) ReadAt(p []byte, off int64) (n int, err error) {\n\tn, err = r.Reader.ReadAt(p, off)\n\tatomic.AddUint64(&r.c.read, uint64(n))\n\treturn n, err\n}\n\ntype iStorageWriter struct {\n\tstorage.Writer\n\tc *iStorage\n}\n\nfunc (w *iStorageWriter) Write(p []byte) (n int, err error) {\n\tn, err = w.Writer.Write(p)\n\tatomic.AddUint64(&w.c.write, uint64(n))\n\treturn n, err\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage table\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/golang/snappy\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/cache\"\n\t\"github.com/syndtr/goleveldb/leveldb/comparer\"\n\t\"github.com/syndtr/goleveldb/leveldb/errors\"\n\t\"github.com/syndtr/goleveldb/leveldb/filter\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// Reader errors.\nvar (\n\tErrNotFound       = errors.ErrNotFound\n\tErrReaderReleased = errors.New(\"leveldb/table: reader released\")\n\tErrIterReleased   = errors.New(\"leveldb/table: iterator released\")\n)\n\n// ErrCorrupted describes error due to corruption. This error will be wrapped\n// with errors.ErrCorrupted.\ntype ErrCorrupted struct {\n\tPos    int64\n\tSize   int64\n\tKind   string\n\tReason string\n}\n\nfunc (e *ErrCorrupted) Error() string {\n\treturn fmt.Sprintf(\"leveldb/table: corruption on %s (pos=%d): %s\", e.Kind, e.Pos, e.Reason)\n}\n\nfunc max(x, y int) int {\n\tif x > y {\n\t\treturn x\n\t}\n\treturn y\n}\n\ntype block struct {\n\tbpool          *util.BufferPool\n\tbh             blockHandle\n\tdata           []byte\n\trestartsLen    int\n\trestartsOffset int\n}\n\nfunc (b *block) seek(cmp comparer.Comparer, rstart, rlimit int, key []byte) (index, offset int, err error) {\n\tindex = sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool {\n\t\toffset := int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):]))\n\t\toffset++                                    // shared always zero, since this is a restart point\n\t\tv1, n1 := binary.Uvarint(b.data[offset:])   // key length\n\t\t_, n2 := binary.Uvarint(b.data[offset+n1:]) // value length\n\t\tm := offset + n1 + n2\n\t\treturn cmp.Compare(b.data[m:m+int(v1)], key) > 0\n\t}) + rstart - 1\n\tif index < rstart {\n\t\t// The smallest key is greater-than key sought.\n\t\tindex = rstart\n\t}\n\toffset = int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*index:]))\n\treturn\n}\n\nfunc (b *block) restartIndex(rstart, rlimit, offset int) int {\n\treturn sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool {\n\t\treturn int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):])) > offset\n\t}) + rstart - 1\n}\n\nfunc (b *block) restartOffset(index int) int {\n\treturn int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*index:]))\n}\n\nfunc (b *block) entry(offset int) (key, value []byte, nShared, n int, err error) {\n\tif offset >= b.restartsOffset {\n\t\tif offset != b.restartsOffset {\n\t\t\terr = &ErrCorrupted{Reason: \"entries offset not aligned\"}\n\t\t}\n\t\treturn\n\t}\n\tv0, n0 := binary.Uvarint(b.data[offset:])       // Shared prefix length\n\tv1, n1 := binary.Uvarint(b.data[offset+n0:])    // Key length\n\tv2, n2 := binary.Uvarint(b.data[offset+n0+n1:]) // Value length\n\tm := n0 + n1 + n2\n\tn = m + int(v1) + int(v2)\n\tif n0 <= 0 || n1 <= 0 || n2 <= 0 || offset+n > b.restartsOffset {\n\t\terr = &ErrCorrupted{Reason: \"entries corrupted\"}\n\t\treturn\n\t}\n\tkey = b.data[offset+m : offset+m+int(v1)]\n\tvalue = b.data[offset+m+int(v1) : offset+n]\n\tnShared = int(v0)\n\treturn\n}\n\nfunc (b *block) Release() {\n\tb.bpool.Put(b.data)\n\tb.bpool = nil\n\tb.data = nil\n}\n\ntype dir int\n\nconst (\n\tdirReleased dir = iota - 1\n\tdirSOI\n\tdirEOI\n\tdirBackward\n\tdirForward\n)\n\ntype blockIter struct {\n\ttr            *Reader\n\tblock         *block\n\tblockReleaser util.Releaser\n\treleaser      util.Releaser\n\tkey, value    []byte\n\toffset        int\n\t// Previous offset, only filled by Next.\n\tprevOffset   int\n\tprevNode     []int\n\tprevKeys     []byte\n\trestartIndex int\n\t// Iterator direction.\n\tdir dir\n\t// Restart index slice range.\n\triStart int\n\triLimit int\n\t// Offset slice range.\n\toffsetStart     int\n\toffsetRealStart int\n\toffsetLimit     int\n\t// Error.\n\terr error\n}\n\nfunc (i *blockIter) sErr(err error) {\n\ti.err = err\n\ti.key = nil\n\ti.value = nil\n\ti.prevNode = nil\n\ti.prevKeys = nil\n}\n\nfunc (i *blockIter) reset() {\n\tif i.dir == dirBackward {\n\t\ti.prevNode = i.prevNode[:0]\n\t\ti.prevKeys = i.prevKeys[:0]\n\t}\n\ti.restartIndex = i.riStart\n\ti.offset = i.offsetStart\n\ti.dir = dirSOI\n\ti.key = i.key[:0]\n\ti.value = nil\n}\n\nfunc (i *blockIter) isFirst() bool {\n\tswitch i.dir {\n\tcase dirForward:\n\t\treturn i.prevOffset == i.offsetRealStart\n\tcase dirBackward:\n\t\treturn len(i.prevNode) == 1 && i.restartIndex == i.riStart\n\t}\n\treturn false\n}\n\nfunc (i *blockIter) isLast() bool {\n\tswitch i.dir {\n\tcase dirForward, dirBackward:\n\t\treturn i.offset == i.offsetLimit\n\t}\n\treturn false\n}\n\nfunc (i *blockIter) First() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.dir == dirBackward {\n\t\ti.prevNode = i.prevNode[:0]\n\t\ti.prevKeys = i.prevKeys[:0]\n\t}\n\ti.dir = dirSOI\n\treturn i.Next()\n}\n\nfunc (i *blockIter) Last() bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.dir == dirBackward {\n\t\ti.prevNode = i.prevNode[:0]\n\t\ti.prevKeys = i.prevKeys[:0]\n\t}\n\ti.dir = dirEOI\n\treturn i.Prev()\n}\n\nfunc (i *blockIter) Seek(key []byte) bool {\n\tif i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tri, offset, err := i.block.seek(i.tr.cmp, i.riStart, i.riLimit, key)\n\tif err != nil {\n\t\ti.sErr(err)\n\t\treturn false\n\t}\n\ti.restartIndex = ri\n\ti.offset = max(i.offsetStart, offset)\n\tif i.dir == dirSOI || i.dir == dirEOI {\n\t\ti.dir = dirForward\n\t}\n\tfor i.Next() {\n\t\tif i.tr.cmp.Compare(i.key, key) >= 0 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (i *blockIter) Next() bool {\n\tif i.dir == dirEOI || i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tif i.dir == dirSOI {\n\t\ti.restartIndex = i.riStart\n\t\ti.offset = i.offsetStart\n\t} else if i.dir == dirBackward {\n\t\ti.prevNode = i.prevNode[:0]\n\t\ti.prevKeys = i.prevKeys[:0]\n\t}\n\tfor i.offset < i.offsetRealStart {\n\t\tkey, value, nShared, n, err := i.block.entry(i.offset)\n\t\tif err != nil {\n\t\t\ti.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err))\n\t\t\treturn false\n\t\t}\n\t\tif n == 0 {\n\t\t\ti.dir = dirEOI\n\t\t\treturn false\n\t\t}\n\t\ti.key = append(i.key[:nShared], key...)\n\t\ti.value = value\n\t\ti.offset += n\n\t}\n\tif i.offset >= i.offsetLimit {\n\t\ti.dir = dirEOI\n\t\tif i.offset != i.offsetLimit {\n\t\t\ti.sErr(i.tr.newErrCorruptedBH(i.block.bh, \"entries offset not aligned\"))\n\t\t}\n\t\treturn false\n\t}\n\tkey, value, nShared, n, err := i.block.entry(i.offset)\n\tif err != nil {\n\t\ti.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err))\n\t\treturn false\n\t}\n\tif n == 0 {\n\t\ti.dir = dirEOI\n\t\treturn false\n\t}\n\ti.key = append(i.key[:nShared], key...)\n\ti.value = value\n\ti.prevOffset = i.offset\n\ti.offset += n\n\ti.dir = dirForward\n\treturn true\n}\n\nfunc (i *blockIter) Prev() bool {\n\tif i.dir == dirSOI || i.err != nil {\n\t\treturn false\n\t} else if i.dir == dirReleased {\n\t\ti.err = ErrIterReleased\n\t\treturn false\n\t}\n\n\tvar ri int\n\tif i.dir == dirForward {\n\t\t// Change direction.\n\t\ti.offset = i.prevOffset\n\t\tif i.offset == i.offsetRealStart {\n\t\t\ti.dir = dirSOI\n\t\t\treturn false\n\t\t}\n\t\tri = i.block.restartIndex(i.restartIndex, i.riLimit, i.offset)\n\t\ti.dir = dirBackward\n\t} else if i.dir == dirEOI {\n\t\t// At the end of iterator.\n\t\ti.restartIndex = i.riLimit\n\t\ti.offset = i.offsetLimit\n\t\tif i.offset == i.offsetRealStart {\n\t\t\ti.dir = dirSOI\n\t\t\treturn false\n\t\t}\n\t\tri = i.riLimit - 1\n\t\ti.dir = dirBackward\n\t} else if len(i.prevNode) == 1 {\n\t\t// This is the end of a restart range.\n\t\ti.offset = i.prevNode[0]\n\t\ti.prevNode = i.prevNode[:0]\n\t\tif i.restartIndex == i.riStart {\n\t\t\ti.dir = dirSOI\n\t\t\treturn false\n\t\t}\n\t\ti.restartIndex--\n\t\tri = i.restartIndex\n\t} else {\n\t\t// In the middle of restart range, get from cache.\n\t\tn := len(i.prevNode) - 3\n\t\tnode := i.prevNode[n:]\n\t\ti.prevNode = i.prevNode[:n]\n\t\t// Get the key.\n\t\tko := node[0]\n\t\ti.key = append(i.key[:0], i.prevKeys[ko:]...)\n\t\ti.prevKeys = i.prevKeys[:ko]\n\t\t// Get the value.\n\t\tvo := node[1]\n\t\tvl := vo + node[2]\n\t\ti.value = i.block.data[vo:vl]\n\t\ti.offset = vl\n\t\treturn true\n\t}\n\t// Build entries cache.\n\ti.key = i.key[:0]\n\ti.value = nil\n\toffset := i.block.restartOffset(ri)\n\tif offset == i.offset {\n\t\tri--\n\t\tif ri < 0 {\n\t\t\ti.dir = dirSOI\n\t\t\treturn false\n\t\t}\n\t\toffset = i.block.restartOffset(ri)\n\t}\n\ti.prevNode = append(i.prevNode, offset)\n\tfor {\n\t\tkey, value, nShared, n, err := i.block.entry(offset)\n\t\tif err != nil {\n\t\t\ti.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err))\n\t\t\treturn false\n\t\t}\n\t\tif offset >= i.offsetRealStart {\n\t\t\tif i.value != nil {\n\t\t\t\t// Appends 3 variables:\n\t\t\t\t// 1. Previous keys offset\n\t\t\t\t// 2. Value offset in the data block\n\t\t\t\t// 3. Value length\n\t\t\t\ti.prevNode = append(i.prevNode, len(i.prevKeys), offset-len(i.value), len(i.value))\n\t\t\t\ti.prevKeys = append(i.prevKeys, i.key...)\n\t\t\t}\n\t\t\ti.value = value\n\t\t}\n\t\ti.key = append(i.key[:nShared], key...)\n\t\toffset += n\n\t\t// Stop if target offset reached.\n\t\tif offset >= i.offset {\n\t\t\tif offset != i.offset {\n\t\t\t\ti.sErr(i.tr.newErrCorruptedBH(i.block.bh, \"entries offset not aligned\"))\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tbreak\n\t\t}\n\t}\n\ti.restartIndex = ri\n\ti.offset = offset\n\treturn true\n}\n\nfunc (i *blockIter) Key() []byte {\n\tif i.err != nil || i.dir <= dirEOI {\n\t\treturn nil\n\t}\n\treturn i.key\n}\n\nfunc (i *blockIter) Value() []byte {\n\tif i.err != nil || i.dir <= dirEOI {\n\t\treturn nil\n\t}\n\treturn i.value\n}\n\nfunc (i *blockIter) Release() {\n\tif i.dir != dirReleased {\n\t\ti.tr = nil\n\t\ti.block = nil\n\t\ti.prevNode = nil\n\t\ti.prevKeys = nil\n\t\ti.key = nil\n\t\ti.value = nil\n\t\ti.dir = dirReleased\n\t\tif i.blockReleaser != nil {\n\t\t\ti.blockReleaser.Release()\n\t\t\ti.blockReleaser = nil\n\t\t}\n\t\tif i.releaser != nil {\n\t\t\ti.releaser.Release()\n\t\t\ti.releaser = nil\n\t\t}\n\t}\n}\n\nfunc (i *blockIter) SetReleaser(releaser util.Releaser) {\n\tif i.dir == dirReleased {\n\t\tpanic(util.ErrReleased)\n\t}\n\tif i.releaser != nil && releaser != nil {\n\t\tpanic(util.ErrHasReleaser)\n\t}\n\ti.releaser = releaser\n}\n\nfunc (i *blockIter) Valid() bool {\n\treturn i.err == nil && (i.dir == dirBackward || i.dir == dirForward)\n}\n\nfunc (i *blockIter) Error() error {\n\treturn i.err\n}\n\ntype filterBlock struct {\n\tbpool      *util.BufferPool\n\tdata       []byte\n\toOffset    int\n\tbaseLg     uint\n\tfiltersNum int\n}\n\nfunc (b *filterBlock) contains(filter filter.Filter, offset uint64, key []byte) bool {\n\ti := int(offset >> b.baseLg)\n\tif i < b.filtersNum {\n\t\to := b.data[b.oOffset+i*4:]\n\t\tn := int(binary.LittleEndian.Uint32(o))\n\t\tm := int(binary.LittleEndian.Uint32(o[4:]))\n\t\tif n < m && m <= b.oOffset {\n\t\t\treturn filter.Contains(b.data[n:m], key)\n\t\t} else if n == m {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc (b *filterBlock) Release() {\n\tb.bpool.Put(b.data)\n\tb.bpool = nil\n\tb.data = nil\n}\n\ntype indexIter struct {\n\t*blockIter\n\ttr    *Reader\n\tslice *util.Range\n\t// Options\n\tfillCache bool\n}\n\nfunc (i *indexIter) Get() iterator.Iterator {\n\tvalue := i.Value()\n\tif value == nil {\n\t\treturn nil\n\t}\n\tdataBH, n := decodeBlockHandle(value)\n\tif n == 0 {\n\t\treturn iterator.NewEmptyIterator(i.tr.newErrCorruptedBH(i.tr.indexBH, \"bad data block handle\"))\n\t}\n\n\tvar slice *util.Range\n\tif i.slice != nil && (i.blockIter.isFirst() || i.blockIter.isLast()) {\n\t\tslice = i.slice\n\t}\n\treturn i.tr.getDataIterErr(dataBH, slice, i.tr.verifyChecksum, i.fillCache)\n}\n\n// Reader is a table reader.\ntype Reader struct {\n\tmu     sync.RWMutex\n\tfd     storage.FileDesc\n\treader io.ReaderAt\n\tcache  *cache.NamespaceGetter\n\terr    error\n\tbpool  *util.BufferPool\n\t// Options\n\to              *opt.Options\n\tcmp            comparer.Comparer\n\tfilter         filter.Filter\n\tverifyChecksum bool\n\n\tdataEnd                   int64\n\tmetaBH, indexBH, filterBH blockHandle\n\tindexBlock                *block\n\tfilterBlock               *filterBlock\n}\n\nfunc (r *Reader) blockKind(bh blockHandle) string {\n\tswitch bh.offset {\n\tcase r.metaBH.offset:\n\t\treturn \"meta-block\"\n\tcase r.indexBH.offset:\n\t\treturn \"index-block\"\n\tcase r.filterBH.offset:\n\t\tif r.filterBH.length > 0 {\n\t\t\treturn \"filter-block\"\n\t\t}\n\t}\n\treturn \"data-block\"\n}\n\nfunc (r *Reader) newErrCorrupted(pos, size int64, kind, reason string) error {\n\treturn &errors.ErrCorrupted{Fd: r.fd, Err: &ErrCorrupted{Pos: pos, Size: size, Kind: kind, Reason: reason}}\n}\n\nfunc (r *Reader) newErrCorruptedBH(bh blockHandle, reason string) error {\n\treturn r.newErrCorrupted(int64(bh.offset), int64(bh.length), r.blockKind(bh), reason)\n}\n\nfunc (r *Reader) fixErrCorruptedBH(bh blockHandle, err error) error {\n\tif cerr, ok := err.(*ErrCorrupted); ok {\n\t\tcerr.Pos = int64(bh.offset)\n\t\tcerr.Size = int64(bh.length)\n\t\tcerr.Kind = r.blockKind(bh)\n\t\treturn &errors.ErrCorrupted{Fd: r.fd, Err: cerr}\n\t}\n\treturn err\n}\n\nfunc (r *Reader) readRawBlock(bh blockHandle, verifyChecksum bool) ([]byte, error) {\n\tdata := r.bpool.Get(int(bh.length + blockTrailerLen))\n\tif _, err := r.reader.ReadAt(data, int64(bh.offset)); err != nil && err != io.EOF {\n\t\treturn nil, err\n\t}\n\n\tif verifyChecksum {\n\t\tn := bh.length + 1\n\t\tchecksum0 := binary.LittleEndian.Uint32(data[n:])\n\t\tchecksum1 := util.NewCRC(data[:n]).Value()\n\t\tif checksum0 != checksum1 {\n\t\t\tr.bpool.Put(data)\n\t\t\treturn nil, r.newErrCorruptedBH(bh, fmt.Sprintf(\"checksum mismatch, want=%#x got=%#x\", checksum0, checksum1))\n\t\t}\n\t}\n\n\tswitch data[bh.length] {\n\tcase blockTypeNoCompression:\n\t\tdata = data[:bh.length]\n\tcase blockTypeSnappyCompression:\n\t\tdecLen, err := snappy.DecodedLen(data[:bh.length])\n\t\tif err != nil {\n\t\t\tr.bpool.Put(data)\n\t\t\treturn nil, r.newErrCorruptedBH(bh, err.Error())\n\t\t}\n\t\tdecData := r.bpool.Get(decLen)\n\t\tdecData, err = snappy.Decode(decData, data[:bh.length])\n\t\tr.bpool.Put(data)\n\t\tif err != nil {\n\t\t\tr.bpool.Put(decData)\n\t\t\treturn nil, r.newErrCorruptedBH(bh, err.Error())\n\t\t}\n\t\tdata = decData\n\tdefault:\n\t\tr.bpool.Put(data)\n\t\treturn nil, r.newErrCorruptedBH(bh, fmt.Sprintf(\"unknown compression type %#x\", data[bh.length]))\n\t}\n\treturn data, nil\n}\n\nfunc (r *Reader) readBlock(bh blockHandle, verifyChecksum bool) (*block, error) {\n\tdata, err := r.readRawBlock(bh, verifyChecksum)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\trestartsLen := int(binary.LittleEndian.Uint32(data[len(data)-4:]))\n\tb := &block{\n\t\tbpool:          r.bpool,\n\t\tbh:             bh,\n\t\tdata:           data,\n\t\trestartsLen:    restartsLen,\n\t\trestartsOffset: len(data) - (restartsLen+1)*4,\n\t}\n\treturn b, nil\n}\n\nfunc (r *Reader) readBlockCached(bh blockHandle, verifyChecksum, fillCache bool) (*block, util.Releaser, error) {\n\tif r.cache != nil {\n\t\tvar (\n\t\t\terr error\n\t\t\tch  *cache.Handle\n\t\t)\n\t\tif fillCache {\n\t\t\tch = r.cache.Get(bh.offset, func() (size int, value cache.Value) {\n\t\t\t\tvar b *block\n\t\t\t\tb, err = r.readBlock(bh, verifyChecksum)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, nil\n\t\t\t\t}\n\t\t\t\treturn cap(b.data), b\n\t\t\t})\n\t\t} else {\n\t\t\tch = r.cache.Get(bh.offset, nil)\n\t\t}\n\t\tif ch != nil {\n\t\t\tb, ok := ch.Value().(*block)\n\t\t\tif !ok {\n\t\t\t\tch.Release()\n\t\t\t\treturn nil, nil, errors.New(\"leveldb/table: inconsistent block type\")\n\t\t\t}\n\t\t\treturn b, ch, err\n\t\t} else if err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\tb, err := r.readBlock(bh, verifyChecksum)\n\treturn b, b, err\n}\n\nfunc (r *Reader) readFilterBlock(bh blockHandle) (*filterBlock, error) {\n\tdata, err := r.readRawBlock(bh, true)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tn := len(data)\n\tif n < 5 {\n\t\treturn nil, r.newErrCorruptedBH(bh, \"too short\")\n\t}\n\tm := n - 5\n\toOffset := int(binary.LittleEndian.Uint32(data[m:]))\n\tif oOffset > m {\n\t\treturn nil, r.newErrCorruptedBH(bh, \"invalid data-offsets offset\")\n\t}\n\tb := &filterBlock{\n\t\tbpool:      r.bpool,\n\t\tdata:       data,\n\t\toOffset:    oOffset,\n\t\tbaseLg:     uint(data[n-1]),\n\t\tfiltersNum: (m - oOffset) / 4,\n\t}\n\treturn b, nil\n}\n\nfunc (r *Reader) readFilterBlockCached(bh blockHandle, fillCache bool) (*filterBlock, util.Releaser, error) {\n\tif r.cache != nil {\n\t\tvar (\n\t\t\terr error\n\t\t\tch  *cache.Handle\n\t\t)\n\t\tif fillCache {\n\t\t\tch = r.cache.Get(bh.offset, func() (size int, value cache.Value) {\n\t\t\t\tvar b *filterBlock\n\t\t\t\tb, err = r.readFilterBlock(bh)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn 0, nil\n\t\t\t\t}\n\t\t\t\treturn cap(b.data), b\n\t\t\t})\n\t\t} else {\n\t\t\tch = r.cache.Get(bh.offset, nil)\n\t\t}\n\t\tif ch != nil {\n\t\t\tb, ok := ch.Value().(*filterBlock)\n\t\t\tif !ok {\n\t\t\t\tch.Release()\n\t\t\t\treturn nil, nil, errors.New(\"leveldb/table: inconsistent block type\")\n\t\t\t}\n\t\t\treturn b, ch, err\n\t\t} else if err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t}\n\n\tb, err := r.readFilterBlock(bh)\n\treturn b, b, err\n}\n\nfunc (r *Reader) getIndexBlock(fillCache bool) (b *block, rel util.Releaser, err error) {\n\tif r.indexBlock == nil {\n\t\treturn r.readBlockCached(r.indexBH, true, fillCache)\n\t}\n\treturn r.indexBlock, util.NoopReleaser{}, nil\n}\n\nfunc (r *Reader) getFilterBlock(fillCache bool) (*filterBlock, util.Releaser, error) {\n\tif r.filterBlock == nil {\n\t\treturn r.readFilterBlockCached(r.filterBH, fillCache)\n\t}\n\treturn r.filterBlock, util.NoopReleaser{}, nil\n}\n\nfunc (r *Reader) newBlockIter(b *block, bReleaser util.Releaser, slice *util.Range, inclLimit bool) *blockIter {\n\tbi := &blockIter{\n\t\ttr:            r,\n\t\tblock:         b,\n\t\tblockReleaser: bReleaser,\n\t\t// Valid key should never be nil.\n\t\tkey:             make([]byte, 0),\n\t\tdir:             dirSOI,\n\t\triStart:         0,\n\t\triLimit:         b.restartsLen,\n\t\toffsetStart:     0,\n\t\toffsetRealStart: 0,\n\t\toffsetLimit:     b.restartsOffset,\n\t}\n\tif slice != nil {\n\t\tif slice.Start != nil {\n\t\t\tif bi.Seek(slice.Start) {\n\t\t\t\tbi.riStart = b.restartIndex(bi.restartIndex, b.restartsLen, bi.prevOffset)\n\t\t\t\tbi.offsetStart = b.restartOffset(bi.riStart)\n\t\t\t\tbi.offsetRealStart = bi.prevOffset\n\t\t\t} else {\n\t\t\t\tbi.riStart = b.restartsLen\n\t\t\t\tbi.offsetStart = b.restartsOffset\n\t\t\t\tbi.offsetRealStart = b.restartsOffset\n\t\t\t}\n\t\t}\n\t\tif slice.Limit != nil {\n\t\t\tif bi.Seek(slice.Limit) && (!inclLimit || bi.Next()) {\n\t\t\t\tbi.offsetLimit = bi.prevOffset\n\t\t\t\tbi.riLimit = bi.restartIndex + 1\n\t\t\t}\n\t\t}\n\t\tbi.reset()\n\t\tif bi.offsetStart > bi.offsetLimit {\n\t\t\tbi.sErr(errors.New(\"leveldb/table: invalid slice range\"))\n\t\t}\n\t}\n\treturn bi\n}\n\nfunc (r *Reader) getDataIter(dataBH blockHandle, slice *util.Range, verifyChecksum, fillCache bool) iterator.Iterator {\n\tb, rel, err := r.readBlockCached(dataBH, verifyChecksum, fillCache)\n\tif err != nil {\n\t\treturn iterator.NewEmptyIterator(err)\n\t}\n\treturn r.newBlockIter(b, rel, slice, false)\n}\n\nfunc (r *Reader) getDataIterErr(dataBH blockHandle, slice *util.Range, verifyChecksum, fillCache bool) iterator.Iterator {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\n\tif r.err != nil {\n\t\treturn iterator.NewEmptyIterator(r.err)\n\t}\n\n\treturn r.getDataIter(dataBH, slice, verifyChecksum, fillCache)\n}\n\n// NewIterator creates an iterator from the table.\n//\n// Slice allows slicing the iterator to only contains keys in the given\n// range. A nil Range.Start is treated as a key before all keys in the\n// table. And a nil Range.Limit is treated as a key after all keys in\n// the table.\n//\n// The returned iterator is not safe for concurrent use and should be released\n// after use.\n//\n// Also read Iterator documentation of the leveldb/iterator package.\nfunc (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\n\tif r.err != nil {\n\t\treturn iterator.NewEmptyIterator(r.err)\n\t}\n\n\tfillCache := !ro.GetDontFillCache()\n\tindexBlock, rel, err := r.getIndexBlock(fillCache)\n\tif err != nil {\n\t\treturn iterator.NewEmptyIterator(err)\n\t}\n\tindex := &indexIter{\n\t\tblockIter: r.newBlockIter(indexBlock, rel, slice, true),\n\t\ttr:        r,\n\t\tslice:     slice,\n\t\tfillCache: !ro.GetDontFillCache(),\n\t}\n\treturn iterator.NewIndexedIterator(index, opt.GetStrict(r.o, ro, opt.StrictReader))\n}\n\nfunc (r *Reader) find(key []byte, filtered bool, ro *opt.ReadOptions, noValue bool) (rkey, value []byte, err error) {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\n\tif r.err != nil {\n\t\terr = r.err\n\t\treturn\n\t}\n\n\tindexBlock, rel, err := r.getIndexBlock(true)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer rel.Release()\n\n\tindex := r.newBlockIter(indexBlock, nil, nil, true)\n\tdefer index.Release()\n\n\tif !index.Seek(key) {\n\t\tif err = index.Error(); err == nil {\n\t\t\terr = ErrNotFound\n\t\t}\n\t\treturn\n\t}\n\n\tdataBH, n := decodeBlockHandle(index.Value())\n\tif n == 0 {\n\t\tr.err = r.newErrCorruptedBH(r.indexBH, \"bad data block handle\")\n\t\treturn nil, nil, r.err\n\t}\n\n\t// The filter should only used for exact match.\n\tif filtered && r.filter != nil {\n\t\tfilterBlock, frel, ferr := r.getFilterBlock(true)\n\t\tif ferr == nil {\n\t\t\tif !filterBlock.contains(r.filter, dataBH.offset, key) {\n\t\t\t\tfrel.Release()\n\t\t\t\treturn nil, nil, ErrNotFound\n\t\t\t}\n\t\t\tfrel.Release()\n\t\t} else if !errors.IsCorrupted(ferr) {\n\t\t\treturn nil, nil, ferr\n\t\t}\n\t}\n\n\tdata := r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache())\n\tif !data.Seek(key) {\n\t\tdata.Release()\n\t\tif err = data.Error(); err != nil {\n\t\t\treturn\n\t\t}\n\n\t\t// The nearest greater-than key is the first key of the next block.\n\t\tif !index.Next() {\n\t\t\tif err = index.Error(); err == nil {\n\t\t\t\terr = ErrNotFound\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tdataBH, n = decodeBlockHandle(index.Value())\n\t\tif n == 0 {\n\t\t\tr.err = r.newErrCorruptedBH(r.indexBH, \"bad data block handle\")\n\t\t\treturn nil, nil, r.err\n\t\t}\n\n\t\tdata = r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache())\n\t\tif !data.Next() {\n\t\t\tdata.Release()\n\t\t\tif err = data.Error(); err == nil {\n\t\t\t\terr = ErrNotFound\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Key doesn't use block buffer, no need to copy the buffer.\n\trkey = data.Key()\n\tif !noValue {\n\t\tif r.bpool == nil {\n\t\t\tvalue = data.Value()\n\t\t} else {\n\t\t\t// Value does use block buffer, and since the buffer will be\n\t\t\t// recycled, it need to be copied.\n\t\t\tvalue = append([]byte{}, data.Value()...)\n\t\t}\n\t}\n\tdata.Release()\n\treturn\n}\n\n// Find finds key/value pair whose key is greater than or equal to the\n// given key. It returns ErrNotFound if the table doesn't contain\n// such pair.\n// If filtered is true then the nearest 'block' will be checked against\n// 'filter data' (if present) and will immediately return ErrNotFound if\n// 'filter data' indicates that such pair doesn't exist.\n//\n// The caller may modify the contents of the returned slice as it is its\n// own copy.\n// It is safe to modify the contents of the argument after Find returns.\nfunc (r *Reader) Find(key []byte, filtered bool, ro *opt.ReadOptions) (rkey, value []byte, err error) {\n\treturn r.find(key, filtered, ro, false)\n}\n\n// FindKey finds key that is greater than or equal to the given key.\n// It returns ErrNotFound if the table doesn't contain such key.\n// If filtered is true then the nearest 'block' will be checked against\n// 'filter data' (if present) and will immediately return ErrNotFound if\n// 'filter data' indicates that such key doesn't exist.\n//\n// The caller may modify the contents of the returned slice as it is its\n// own copy.\n// It is safe to modify the contents of the argument after Find returns.\nfunc (r *Reader) FindKey(key []byte, filtered bool, ro *opt.ReadOptions) (rkey []byte, err error) {\n\trkey, _, err = r.find(key, filtered, ro, true)\n\treturn\n}\n\n// Get gets the value for the given key. It returns errors.ErrNotFound\n// if the table does not contain the key.\n//\n// The caller may modify the contents of the returned slice as it is its\n// own copy.\n// It is safe to modify the contents of the argument after Find returns.\nfunc (r *Reader) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\n\tif r.err != nil {\n\t\terr = r.err\n\t\treturn\n\t}\n\n\trkey, value, err := r.find(key, false, ro, false)\n\tif err == nil && r.cmp.Compare(rkey, key) != 0 {\n\t\tvalue = nil\n\t\terr = ErrNotFound\n\t}\n\treturn\n}\n\n// OffsetOf returns approximate offset for the given key.\n//\n// It is safe to modify the contents of the argument after Get returns.\nfunc (r *Reader) OffsetOf(key []byte) (offset int64, err error) {\n\tr.mu.RLock()\n\tdefer r.mu.RUnlock()\n\n\tif r.err != nil {\n\t\terr = r.err\n\t\treturn\n\t}\n\n\tindexBlock, rel, err := r.readBlockCached(r.indexBH, true, true)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer rel.Release()\n\n\tindex := r.newBlockIter(indexBlock, nil, nil, true)\n\tdefer index.Release()\n\tif index.Seek(key) {\n\t\tdataBH, n := decodeBlockHandle(index.Value())\n\t\tif n == 0 {\n\t\t\tr.err = r.newErrCorruptedBH(r.indexBH, \"bad data block handle\")\n\t\t\treturn\n\t\t}\n\t\toffset = int64(dataBH.offset)\n\t\treturn\n\t}\n\terr = index.Error()\n\tif err == nil {\n\t\toffset = r.dataEnd\n\t}\n\treturn\n}\n\n// Release implements util.Releaser.\n// It also close the file if it is an io.Closer.\nfunc (r *Reader) Release() {\n\tr.mu.Lock()\n\tdefer r.mu.Unlock()\n\n\tif closer, ok := r.reader.(io.Closer); ok {\n\t\tcloser.Close()\n\t}\n\tif r.indexBlock != nil {\n\t\tr.indexBlock.Release()\n\t\tr.indexBlock = nil\n\t}\n\tif r.filterBlock != nil {\n\t\tr.filterBlock.Release()\n\t\tr.filterBlock = nil\n\t}\n\tr.reader = nil\n\tr.cache = nil\n\tr.bpool = nil\n\tr.err = ErrReaderReleased\n}\n\n// NewReader creates a new initialized table reader for the file.\n// The fi, cache and bpool is optional and can be nil.\n//\n// The returned table reader instance is safe for concurrent use.\nfunc NewReader(f io.ReaderAt, size int64, fd storage.FileDesc, cache *cache.NamespaceGetter, bpool *util.BufferPool, o *opt.Options) (*Reader, error) {\n\tif f == nil {\n\t\treturn nil, errors.New(\"leveldb/table: nil file\")\n\t}\n\n\tr := &Reader{\n\t\tfd:             fd,\n\t\treader:         f,\n\t\tcache:          cache,\n\t\tbpool:          bpool,\n\t\to:              o,\n\t\tcmp:            o.GetComparer(),\n\t\tverifyChecksum: o.GetStrict(opt.StrictBlockChecksum),\n\t}\n\n\tif size < footerLen {\n\t\tr.err = r.newErrCorrupted(0, size, \"table\", \"too small\")\n\t\treturn r, nil\n\t}\n\n\tfooterPos := size - footerLen\n\tvar footer [footerLen]byte\n\tif _, err := r.reader.ReadAt(footer[:], footerPos); err != nil && err != io.EOF {\n\t\treturn nil, err\n\t}\n\tif string(footer[footerLen-len(magic):footerLen]) != magic {\n\t\tr.err = r.newErrCorrupted(footerPos, footerLen, \"table-footer\", \"bad magic number\")\n\t\treturn r, nil\n\t}\n\n\tvar n int\n\t// Decode the metaindex block handle.\n\tr.metaBH, n = decodeBlockHandle(footer[:])\n\tif n == 0 {\n\t\tr.err = r.newErrCorrupted(footerPos, footerLen, \"table-footer\", \"bad metaindex block handle\")\n\t\treturn r, nil\n\t}\n\n\t// Decode the index block handle.\n\tr.indexBH, n = decodeBlockHandle(footer[n:])\n\tif n == 0 {\n\t\tr.err = r.newErrCorrupted(footerPos, footerLen, \"table-footer\", \"bad index block handle\")\n\t\treturn r, nil\n\t}\n\n\t// Read metaindex block.\n\tmetaBlock, err := r.readBlock(r.metaBH, true)\n\tif err != nil {\n\t\tif errors.IsCorrupted(err) {\n\t\t\tr.err = err\n\t\t\treturn r, nil\n\t\t}\n\t\treturn nil, err\n\t}\n\n\t// Set data end.\n\tr.dataEnd = int64(r.metaBH.offset)\n\n\t// Read metaindex.\n\tmetaIter := r.newBlockIter(metaBlock, nil, nil, true)\n\tfor metaIter.Next() {\n\t\tkey := string(metaIter.Key())\n\t\tif !strings.HasPrefix(key, \"filter.\") {\n\t\t\tcontinue\n\t\t}\n\t\tfn := key[7:]\n\t\tif f0 := o.GetFilter(); f0 != nil && f0.Name() == fn {\n\t\t\tr.filter = f0\n\t\t} else {\n\t\t\tfor _, f0 := range o.GetAltFilters() {\n\t\t\t\tif f0.Name() == fn {\n\t\t\t\t\tr.filter = f0\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif r.filter != nil {\n\t\t\tfilterBH, n := decodeBlockHandle(metaIter.Value())\n\t\t\tif n == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tr.filterBH = filterBH\n\t\t\t// Update data end.\n\t\t\tr.dataEnd = int64(filterBH.offset)\n\t\t\tbreak\n\t\t}\n\t}\n\tmetaIter.Release()\n\tmetaBlock.Release()\n\n\t// Cache index and filter block locally, since we don't have global cache.\n\tif cache == nil {\n\t\tr.indexBlock, err = r.readBlock(r.indexBH, true)\n\t\tif err != nil {\n\t\t\tif errors.IsCorrupted(err) {\n\t\t\t\tr.err = err\n\t\t\t\treturn r, nil\n\t\t\t}\n\t\t\treturn nil, err\n\t\t}\n\t\tif r.filter != nil {\n\t\t\tr.filterBlock, err = r.readFilterBlock(r.filterBH)\n\t\t\tif err != nil {\n\t\t\t\tif !errors.IsCorrupted(err) {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\t// Don't use filter then.\n\t\t\t\tr.filter = nil\n\t\t\t}\n\t\t}\n\t}\n\n\treturn r, nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/table/table.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package table allows read and write sorted key/value.\npackage table\n\nimport (\n\t\"encoding/binary\"\n)\n\n/*\nTable:\n\nTable is consist of one or more data blocks, an optional filter block\na metaindex block, an index block and a table footer. Metaindex block\nis a special block used to keep parameters of the table, such as filter\nblock name and its block handle. Index block is a special block used to\nkeep record of data blocks offset and length, index block use one as\nrestart interval. The key used by index block are the last key of preceding\nblock, shorter separator of adjacent blocks or shorter successor of the\nlast key of the last block. Filter block is an optional block contains\nsequence of filter data generated by a filter generator.\n\nTable data structure:\n                                                         + optional\n                                                        /\n    +--------------+--------------+--------------+------+-------+-----------------+-------------+--------+\n    | data block 1 |      ...     | data block n | filter block | metaindex block | index block | footer |\n    +--------------+--------------+--------------+--------------+-----------------+-------------+--------+\n\n    Each block followed by a 5-bytes trailer contains compression type and checksum.\n\nTable block trailer:\n\n    +---------------------------+-------------------+\n    | compression type (1-byte) | checksum (4-byte) |\n    +---------------------------+-------------------+\n\n    The checksum is a CRC-32 computed using Castagnoli's polynomial. Compression\n    type also included in the checksum.\n\nTable footer:\n\n      +------------------- 40-bytes -------------------+\n     /                                                  \\\n    +------------------------+--------------------+------+-----------------+\n    | metaindex block handle / index block handle / ---- | magic (8-bytes) |\n    +------------------------+--------------------+------+-----------------+\n\n    The magic are first 64-bit of SHA-1 sum of \"http://code.google.com/p/leveldb/\".\n\nNOTE: All fixed-length integer are little-endian.\n*/\n\n/*\nBlock:\n\nBlock is consist of one or more key/value entries and a block trailer.\nBlock entry shares key prefix with its preceding key until a restart\npoint reached. A block should contains at least one restart point.\nFirst restart point are always zero.\n\nBlock data structure:\n\n      + restart point                 + restart point (depends on restart interval)\n     /                               /\n    +---------------+---------------+---------------+---------------+---------+\n    | block entry 1 | block entry 2 |      ...      | block entry n | trailer |\n    +---------------+---------------+---------------+---------------+---------+\n\nKey/value entry:\n\n              +---- key len ----+\n             /                   \\\n    +-------+---------+-----------+---------+--------------------+--------------+----------------+\n    | shared (varint) | not shared (varint) | value len (varint) | key (varlen) | value (varlen) |\n    +-----------------+---------------------+--------------------+--------------+----------------+\n\n    Block entry shares key prefix with its preceding key:\n    Conditions:\n        restart_interval=2\n        entry one  : key=deck,value=v1\n        entry two  : key=dock,value=v2\n        entry three: key=duck,value=v3\n    The entries will be encoded as follow:\n\n      + restart point (offset=0)                                                 + restart point (offset=16)\n     /                                                                          /\n    +-----+-----+-----+----------+--------+-----+-----+-----+---------+--------+-----+-----+-----+----------+--------+\n    |  0  |  4  |  2  |  \"deck\"  |  \"v1\"  |  1  |  3  |  2  |  \"ock\"  |  \"v2\"  |  0  |  4  |  2  |  \"duck\"  |  \"v3\"  |\n    +-----+-----+-----+----------+--------+-----+-----+-----+---------+--------+-----+-----+-----+----------+--------+\n     \\                                   / \\                                  / \\                                   /\n      +----------- entry one -----------+   +----------- entry two ----------+   +---------- entry three ----------+\n\n    The block trailer will contains two restart points:\n\n    +------------+-----------+--------+\n    |     0      |    16     |   2    |\n    +------------+-----------+---+----+\n     \\                      /     \\\n      +-- restart points --+       + restart points length\n\nBlock trailer:\n\n      +-- 4-bytes --+\n     /               \\\n    +-----------------+-----------------+-----------------+------------------------------+\n    | restart point 1 |       ....      | restart point n | restart points len (4-bytes) |\n    +-----------------+-----------------+-----------------+------------------------------+\n\n\nNOTE: All fixed-length integer are little-endian.\n*/\n\n/*\nFilter block:\n\nFilter block consist of one or more filter data and a filter block trailer.\nThe trailer contains filter data offsets, a trailer offset and a 1-byte base Lg.\n\nFilter block data structure:\n\n      + offset 1      + offset 2      + offset n      + trailer offset\n     /               /               /               /\n    +---------------+---------------+---------------+---------+\n    | filter data 1 |      ...      | filter data n | trailer |\n    +---------------+---------------+---------------+---------+\n\nFilter block trailer:\n\n      +- 4-bytes -+\n     /             \\\n    +---------------+---------------+---------------+-------------------------------+------------------+\n    | data 1 offset |      ....     | data n offset | data-offsets offset (4-bytes) | base Lg (1-byte) |\n    +-------------- +---------------+---------------+-------------------------------+------------------+\n\n\nNOTE: All fixed-length integer are little-endian.\n*/\n\nconst (\n\tblockTrailerLen = 5\n\tfooterLen       = 48\n\n\tmagic = \"\\x57\\xfb\\x80\\x8b\\x24\\x75\\x47\\xdb\"\n\n\t// The block type gives the per-block compression format.\n\t// These constants are part of the file format and should not be changed.\n\tblockTypeNoCompression     = 0\n\tblockTypeSnappyCompression = 1\n\n\t// Generate new filter every 2KB of data\n\tfilterBaseLg = 11\n\tfilterBase   = 1 << filterBaseLg\n)\n\ntype blockHandle struct {\n\toffset, length uint64\n}\n\nfunc decodeBlockHandle(src []byte) (blockHandle, int) {\n\toffset, n := binary.Uvarint(src)\n\tlength, m := binary.Uvarint(src[n:])\n\tif n == 0 || m == 0 {\n\t\treturn blockHandle{}, 0\n\t}\n\treturn blockHandle{offset, length}, n + m\n}\n\nfunc encodeBlockHandle(dst []byte, b blockHandle) int {\n\tn := binary.PutUvarint(dst, b.offset)\n\tm := binary.PutUvarint(dst[n:], b.length)\n\treturn n + m\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage table\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/golang/snappy\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/comparer\"\n\t\"github.com/syndtr/goleveldb/leveldb/filter\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\nfunc sharedPrefixLen(a, b []byte) int {\n\ti, n := 0, len(a)\n\tif n > len(b) {\n\t\tn = len(b)\n\t}\n\tfor i < n && a[i] == b[i] {\n\t\ti++\n\t}\n\treturn i\n}\n\ntype blockWriter struct {\n\trestartInterval int\n\tbuf             util.Buffer\n\tnEntries        int\n\tprevKey         []byte\n\trestarts        []uint32\n\tscratch         []byte\n}\n\nfunc (w *blockWriter) append(key, value []byte) {\n\tnShared := 0\n\tif w.nEntries%w.restartInterval == 0 {\n\t\tw.restarts = append(w.restarts, uint32(w.buf.Len()))\n\t} else {\n\t\tnShared = sharedPrefixLen(w.prevKey, key)\n\t}\n\tn := binary.PutUvarint(w.scratch[0:], uint64(nShared))\n\tn += binary.PutUvarint(w.scratch[n:], uint64(len(key)-nShared))\n\tn += binary.PutUvarint(w.scratch[n:], uint64(len(value)))\n\tw.buf.Write(w.scratch[:n])\n\tw.buf.Write(key[nShared:])\n\tw.buf.Write(value)\n\tw.prevKey = append(w.prevKey[:0], key...)\n\tw.nEntries++\n}\n\nfunc (w *blockWriter) finish() {\n\t// Write restarts entry.\n\tif w.nEntries == 0 {\n\t\t// Must have at least one restart entry.\n\t\tw.restarts = append(w.restarts, 0)\n\t}\n\tw.restarts = append(w.restarts, uint32(len(w.restarts)))\n\tfor _, x := range w.restarts {\n\t\tbuf4 := w.buf.Alloc(4)\n\t\tbinary.LittleEndian.PutUint32(buf4, x)\n\t}\n}\n\nfunc (w *blockWriter) reset() {\n\tw.buf.Reset()\n\tw.nEntries = 0\n\tw.restarts = w.restarts[:0]\n}\n\nfunc (w *blockWriter) bytesLen() int {\n\trestartsLen := len(w.restarts)\n\tif restartsLen == 0 {\n\t\trestartsLen = 1\n\t}\n\treturn w.buf.Len() + 4*restartsLen + 4\n}\n\ntype filterWriter struct {\n\tgenerator filter.FilterGenerator\n\tbuf       util.Buffer\n\tnKeys     int\n\toffsets   []uint32\n}\n\nfunc (w *filterWriter) add(key []byte) {\n\tif w.generator == nil {\n\t\treturn\n\t}\n\tw.generator.Add(key)\n\tw.nKeys++\n}\n\nfunc (w *filterWriter) flush(offset uint64) {\n\tif w.generator == nil {\n\t\treturn\n\t}\n\tfor x := int(offset / filterBase); x > len(w.offsets); {\n\t\tw.generate()\n\t}\n}\n\nfunc (w *filterWriter) finish() {\n\tif w.generator == nil {\n\t\treturn\n\t}\n\t// Generate last keys.\n\n\tif w.nKeys > 0 {\n\t\tw.generate()\n\t}\n\tw.offsets = append(w.offsets, uint32(w.buf.Len()))\n\tfor _, x := range w.offsets {\n\t\tbuf4 := w.buf.Alloc(4)\n\t\tbinary.LittleEndian.PutUint32(buf4, x)\n\t}\n\tw.buf.WriteByte(filterBaseLg)\n}\n\nfunc (w *filterWriter) generate() {\n\t// Record offset.\n\tw.offsets = append(w.offsets, uint32(w.buf.Len()))\n\t// Generate filters.\n\tif w.nKeys > 0 {\n\t\tw.generator.Generate(&w.buf)\n\t\tw.nKeys = 0\n\t}\n}\n\n// Writer is a table writer.\ntype Writer struct {\n\twriter io.Writer\n\terr    error\n\t// Options\n\tcmp         comparer.Comparer\n\tfilter      filter.Filter\n\tcompression opt.Compression\n\tblockSize   int\n\n\tdataBlock   blockWriter\n\tindexBlock  blockWriter\n\tfilterBlock filterWriter\n\tpendingBH   blockHandle\n\toffset      uint64\n\tnEntries    int\n\t// Scratch allocated enough for 5 uvarint. Block writer should not use\n\t// first 20-bytes since it will be used to encode block handle, which\n\t// then passed to the block writer itself.\n\tscratch            [50]byte\n\tcomparerScratch    []byte\n\tcompressionScratch []byte\n}\n\nfunc (w *Writer) writeBlock(buf *util.Buffer, compression opt.Compression) (bh blockHandle, err error) {\n\t// Compress the buffer if necessary.\n\tvar b []byte\n\tif compression == opt.SnappyCompression {\n\t\t// Allocate scratch enough for compression and block trailer.\n\t\tif n := snappy.MaxEncodedLen(buf.Len()) + blockTrailerLen; len(w.compressionScratch) < n {\n\t\t\tw.compressionScratch = make([]byte, n)\n\t\t}\n\t\tcompressed := snappy.Encode(w.compressionScratch, buf.Bytes())\n\t\tn := len(compressed)\n\t\tb = compressed[:n+blockTrailerLen]\n\t\tb[n] = blockTypeSnappyCompression\n\t} else {\n\t\ttmp := buf.Alloc(blockTrailerLen)\n\t\ttmp[0] = blockTypeNoCompression\n\t\tb = buf.Bytes()\n\t}\n\n\t// Calculate the checksum.\n\tn := len(b) - 4\n\tchecksum := util.NewCRC(b[:n]).Value()\n\tbinary.LittleEndian.PutUint32(b[n:], checksum)\n\n\t// Write the buffer to the file.\n\t_, err = w.writer.Write(b)\n\tif err != nil {\n\t\treturn\n\t}\n\tbh = blockHandle{w.offset, uint64(len(b) - blockTrailerLen)}\n\tw.offset += uint64(len(b))\n\treturn\n}\n\nfunc (w *Writer) flushPendingBH(key []byte) {\n\tif w.pendingBH.length == 0 {\n\t\treturn\n\t}\n\tvar separator []byte\n\tif len(key) == 0 {\n\t\tseparator = w.cmp.Successor(w.comparerScratch[:0], w.dataBlock.prevKey)\n\t} else {\n\t\tseparator = w.cmp.Separator(w.comparerScratch[:0], w.dataBlock.prevKey, key)\n\t}\n\tif separator == nil {\n\t\tseparator = w.dataBlock.prevKey\n\t} else {\n\t\tw.comparerScratch = separator\n\t}\n\tn := encodeBlockHandle(w.scratch[:20], w.pendingBH)\n\t// Append the block handle to the index block.\n\tw.indexBlock.append(separator, w.scratch[:n])\n\t// Reset prev key of the data block.\n\tw.dataBlock.prevKey = w.dataBlock.prevKey[:0]\n\t// Clear pending block handle.\n\tw.pendingBH = blockHandle{}\n}\n\nfunc (w *Writer) finishBlock() error {\n\tw.dataBlock.finish()\n\tbh, err := w.writeBlock(&w.dataBlock.buf, w.compression)\n\tif err != nil {\n\t\treturn err\n\t}\n\tw.pendingBH = bh\n\t// Reset the data block.\n\tw.dataBlock.reset()\n\t// Flush the filter block.\n\tw.filterBlock.flush(w.offset)\n\treturn nil\n}\n\n// Append appends key/value pair to the table. The keys passed must\n// be in increasing order.\n//\n// It is safe to modify the contents of the arguments after Append returns.\nfunc (w *Writer) Append(key, value []byte) error {\n\tif w.err != nil {\n\t\treturn w.err\n\t}\n\tif w.nEntries > 0 && w.cmp.Compare(w.dataBlock.prevKey, key) >= 0 {\n\t\tw.err = fmt.Errorf(\"leveldb/table: Writer: keys are not in increasing order: %q, %q\", w.dataBlock.prevKey, key)\n\t\treturn w.err\n\t}\n\n\tw.flushPendingBH(key)\n\t// Append key/value pair to the data block.\n\tw.dataBlock.append(key, value)\n\t// Add key to the filter block.\n\tw.filterBlock.add(key)\n\n\t// Finish the data block if block size target reached.\n\tif w.dataBlock.bytesLen() >= w.blockSize {\n\t\tif err := w.finishBlock(); err != nil {\n\t\t\tw.err = err\n\t\t\treturn w.err\n\t\t}\n\t}\n\tw.nEntries++\n\treturn nil\n}\n\n// BlocksLen returns number of blocks written so far.\nfunc (w *Writer) BlocksLen() int {\n\tn := w.indexBlock.nEntries\n\tif w.pendingBH.length > 0 {\n\t\t// Includes the pending block.\n\t\tn++\n\t}\n\treturn n\n}\n\n// EntriesLen returns number of entries added so far.\nfunc (w *Writer) EntriesLen() int {\n\treturn w.nEntries\n}\n\n// BytesLen returns number of bytes written so far.\nfunc (w *Writer) BytesLen() int {\n\treturn int(w.offset)\n}\n\n// Close will finalize the table. Calling Append is not possible\n// after Close, but calling BlocksLen, EntriesLen and BytesLen\n// is still possible.\nfunc (w *Writer) Close() error {\n\tif w.err != nil {\n\t\treturn w.err\n\t}\n\n\t// Write the last data block. Or empty data block if there\n\t// aren't any data blocks at all.\n\tif w.dataBlock.nEntries > 0 || w.nEntries == 0 {\n\t\tif err := w.finishBlock(); err != nil {\n\t\t\tw.err = err\n\t\t\treturn w.err\n\t\t}\n\t}\n\tw.flushPendingBH(nil)\n\n\t// Write the filter block.\n\tvar filterBH blockHandle\n\tw.filterBlock.finish()\n\tif buf := &w.filterBlock.buf; buf.Len() > 0 {\n\t\tfilterBH, w.err = w.writeBlock(buf, opt.NoCompression)\n\t\tif w.err != nil {\n\t\t\treturn w.err\n\t\t}\n\t}\n\n\t// Write the metaindex block.\n\tif filterBH.length > 0 {\n\t\tkey := []byte(\"filter.\" + w.filter.Name())\n\t\tn := encodeBlockHandle(w.scratch[:20], filterBH)\n\t\tw.dataBlock.append(key, w.scratch[:n])\n\t}\n\tw.dataBlock.finish()\n\tmetaindexBH, err := w.writeBlock(&w.dataBlock.buf, w.compression)\n\tif err != nil {\n\t\tw.err = err\n\t\treturn w.err\n\t}\n\n\t// Write the index block.\n\tw.indexBlock.finish()\n\tindexBH, err := w.writeBlock(&w.indexBlock.buf, w.compression)\n\tif err != nil {\n\t\tw.err = err\n\t\treturn w.err\n\t}\n\n\t// Write the table footer.\n\tfooter := w.scratch[:footerLen]\n\tfor i := range footer {\n\t\tfooter[i] = 0\n\t}\n\tn := encodeBlockHandle(footer, metaindexBH)\n\tencodeBlockHandle(footer[n:], indexBH)\n\tcopy(footer[footerLen-len(magic):], magic)\n\tif _, err := w.writer.Write(footer); err != nil {\n\t\tw.err = err\n\t\treturn w.err\n\t}\n\tw.offset += footerLen\n\n\tw.err = errors.New(\"leveldb/table: writer is closed\")\n\treturn nil\n}\n\n// NewWriter creates a new initialized table writer for the file.\n//\n// Table writer is not safe for concurrent use.\nfunc NewWriter(f io.Writer, o *opt.Options) *Writer {\n\tw := &Writer{\n\t\twriter:          f,\n\t\tcmp:             o.GetComparer(),\n\t\tfilter:          o.GetFilter(),\n\t\tcompression:     o.GetCompression(),\n\t\tblockSize:       o.GetBlockSize(),\n\t\tcomparerScratch: make([]byte, 0),\n\t}\n\t// data block\n\tw.dataBlock.restartInterval = o.GetBlockRestartInterval()\n\t// The first 20-bytes are used for encoding block handle.\n\tw.dataBlock.scratch = w.scratch[20:]\n\t// index block\n\tw.indexBlock.restartInterval = 1\n\tw.indexBlock.scratch = w.scratch[20:]\n\t// filter block\n\tif w.filter != nil {\n\t\tw.filterBlock.generator = w.filter.NewGenerator()\n\t\tw.filterBlock.flush(0)\n\t}\n\treturn w\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/table.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"sync/atomic\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/cache\"\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n\t\"github.com/syndtr/goleveldb/leveldb/table\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\n// tFile holds basic information about a table.\ntype tFile struct {\n\tfd         storage.FileDesc\n\tseekLeft   int32\n\tsize       int64\n\timin, imax internalKey\n}\n\n// Returns true if given key is after largest key of this table.\nfunc (t *tFile) after(icmp *iComparer, ukey []byte) bool {\n\treturn ukey != nil && icmp.uCompare(ukey, t.imax.ukey()) > 0\n}\n\n// Returns true if given key is before smallest key of this table.\nfunc (t *tFile) before(icmp *iComparer, ukey []byte) bool {\n\treturn ukey != nil && icmp.uCompare(ukey, t.imin.ukey()) < 0\n}\n\n// Returns true if given key range overlaps with this table key range.\nfunc (t *tFile) overlaps(icmp *iComparer, umin, umax []byte) bool {\n\treturn !t.after(icmp, umin) && !t.before(icmp, umax)\n}\n\n// Cosumes one seek and return current seeks left.\nfunc (t *tFile) consumeSeek() int32 {\n\treturn atomic.AddInt32(&t.seekLeft, -1)\n}\n\n// Creates new tFile.\nfunc newTableFile(fd storage.FileDesc, size int64, imin, imax internalKey) *tFile {\n\tf := &tFile{\n\t\tfd:   fd,\n\t\tsize: size,\n\t\timin: imin,\n\t\timax: imax,\n\t}\n\n\t// We arrange to automatically compact this file after\n\t// a certain number of seeks.  Let's assume:\n\t//   (1) One seek costs 10ms\n\t//   (2) Writing or reading 1MB costs 10ms (100MB/s)\n\t//   (3) A compaction of 1MB does 25MB of IO:\n\t//         1MB read from this level\n\t//         10-12MB read from next level (boundaries may be misaligned)\n\t//         10-12MB written to next level\n\t// This implies that 25 seeks cost the same as the compaction\n\t// of 1MB of data.  I.e., one seek costs approximately the\n\t// same as the compaction of 40KB of data.  We are a little\n\t// conservative and allow approximately one seek for every 16KB\n\t// of data before triggering a compaction.\n\tf.seekLeft = int32(size / 16384)\n\tif f.seekLeft < 100 {\n\t\tf.seekLeft = 100\n\t}\n\n\treturn f\n}\n\nfunc tableFileFromRecord(r atRecord) *tFile {\n\treturn newTableFile(storage.FileDesc{storage.TypeTable, r.num}, r.size, r.imin, r.imax)\n}\n\n// tFiles hold multiple tFile.\ntype tFiles []*tFile\n\nfunc (tf tFiles) Len() int      { return len(tf) }\nfunc (tf tFiles) Swap(i, j int) { tf[i], tf[j] = tf[j], tf[i] }\n\nfunc (tf tFiles) nums() string {\n\tx := \"[ \"\n\tfor i, f := range tf {\n\t\tif i != 0 {\n\t\t\tx += \", \"\n\t\t}\n\t\tx += fmt.Sprint(f.fd.Num)\n\t}\n\tx += \" ]\"\n\treturn x\n}\n\n// Returns true if i smallest key is less than j.\n// This used for sort by key in ascending order.\nfunc (tf tFiles) lessByKey(icmp *iComparer, i, j int) bool {\n\ta, b := tf[i], tf[j]\n\tn := icmp.Compare(a.imin, b.imin)\n\tif n == 0 {\n\t\treturn a.fd.Num < b.fd.Num\n\t}\n\treturn n < 0\n}\n\n// Returns true if i file number is greater than j.\n// This used for sort by file number in descending order.\nfunc (tf tFiles) lessByNum(i, j int) bool {\n\treturn tf[i].fd.Num > tf[j].fd.Num\n}\n\n// Sorts tables by key in ascending order.\nfunc (tf tFiles) sortByKey(icmp *iComparer) {\n\tsort.Sort(&tFilesSortByKey{tFiles: tf, icmp: icmp})\n}\n\n// Sorts tables by file number in descending order.\nfunc (tf tFiles) sortByNum() {\n\tsort.Sort(&tFilesSortByNum{tFiles: tf})\n}\n\n// Returns sum of all tables size.\nfunc (tf tFiles) size() (sum int64) {\n\tfor _, t := range tf {\n\t\tsum += t.size\n\t}\n\treturn sum\n}\n\n// Searches smallest index of tables whose its smallest\n// key is after or equal with given key.\nfunc (tf tFiles) searchMin(icmp *iComparer, ikey internalKey) int {\n\treturn sort.Search(len(tf), func(i int) bool {\n\t\treturn icmp.Compare(tf[i].imin, ikey) >= 0\n\t})\n}\n\n// Searches smallest index of tables whose its largest\n// key is after or equal with given key.\nfunc (tf tFiles) searchMax(icmp *iComparer, ikey internalKey) int {\n\treturn sort.Search(len(tf), func(i int) bool {\n\t\treturn icmp.Compare(tf[i].imax, ikey) >= 0\n\t})\n}\n\n// Returns true if given key range overlaps with one or more\n// tables key range. If unsorted is true then binary search will not be used.\nfunc (tf tFiles) overlaps(icmp *iComparer, umin, umax []byte, unsorted bool) bool {\n\tif unsorted {\n\t\t// Check against all files.\n\t\tfor _, t := range tf {\n\t\t\tif t.overlaps(icmp, umin, umax) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\ti := 0\n\tif len(umin) > 0 {\n\t\t// Find the earliest possible internal key for min.\n\t\ti = tf.searchMax(icmp, makeInternalKey(nil, umin, keyMaxSeq, keyTypeSeek))\n\t}\n\tif i >= len(tf) {\n\t\t// Beginning of range is after all files, so no overlap.\n\t\treturn false\n\t}\n\treturn !tf[i].before(icmp, umax)\n}\n\n// Returns tables whose its key range overlaps with given key range.\n// Range will be expanded if ukey found hop across tables.\n// If overlapped is true then the search will be restarted if umax\n// expanded.\n// The dst content will be overwritten.\nfunc (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, overlapped bool) tFiles {\n\tdst = dst[:0]\n\tfor i := 0; i < len(tf); {\n\t\tt := tf[i]\n\t\tif t.overlaps(icmp, umin, umax) {\n\t\t\tif umin != nil && icmp.uCompare(t.imin.ukey(), umin) < 0 {\n\t\t\t\tumin = t.imin.ukey()\n\t\t\t\tdst = dst[:0]\n\t\t\t\ti = 0\n\t\t\t\tcontinue\n\t\t\t} else if umax != nil && icmp.uCompare(t.imax.ukey(), umax) > 0 {\n\t\t\t\tumax = t.imax.ukey()\n\t\t\t\t// Restart search if it is overlapped.\n\t\t\t\tif overlapped {\n\t\t\t\t\tdst = dst[:0]\n\t\t\t\t\ti = 0\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdst = append(dst, t)\n\t\t}\n\t\ti++\n\t}\n\n\treturn dst\n}\n\n// Returns tables key range.\nfunc (tf tFiles) getRange(icmp *iComparer) (imin, imax internalKey) {\n\tfor i, t := range tf {\n\t\tif i == 0 {\n\t\t\timin, imax = t.imin, t.imax\n\t\t\tcontinue\n\t\t}\n\t\tif icmp.Compare(t.imin, imin) < 0 {\n\t\t\timin = t.imin\n\t\t}\n\t\tif icmp.Compare(t.imax, imax) > 0 {\n\t\t\timax = t.imax\n\t\t}\n\t}\n\n\treturn\n}\n\n// Creates iterator index from tables.\nfunc (tf tFiles) newIndexIterator(tops *tOps, icmp *iComparer, slice *util.Range, ro *opt.ReadOptions) iterator.IteratorIndexer {\n\tif slice != nil {\n\t\tvar start, limit int\n\t\tif slice.Start != nil {\n\t\t\tstart = tf.searchMax(icmp, internalKey(slice.Start))\n\t\t}\n\t\tif slice.Limit != nil {\n\t\t\tlimit = tf.searchMin(icmp, internalKey(slice.Limit))\n\t\t} else {\n\t\t\tlimit = tf.Len()\n\t\t}\n\t\ttf = tf[start:limit]\n\t}\n\treturn iterator.NewArrayIndexer(&tFilesArrayIndexer{\n\t\ttFiles: tf,\n\t\ttops:   tops,\n\t\ticmp:   icmp,\n\t\tslice:  slice,\n\t\tro:     ro,\n\t})\n}\n\n// Tables iterator index.\ntype tFilesArrayIndexer struct {\n\ttFiles\n\ttops  *tOps\n\ticmp  *iComparer\n\tslice *util.Range\n\tro    *opt.ReadOptions\n}\n\nfunc (a *tFilesArrayIndexer) Search(key []byte) int {\n\treturn a.searchMax(a.icmp, internalKey(key))\n}\n\nfunc (a *tFilesArrayIndexer) Get(i int) iterator.Iterator {\n\tif i == 0 || i == a.Len()-1 {\n\t\treturn a.tops.newIterator(a.tFiles[i], a.slice, a.ro)\n\t}\n\treturn a.tops.newIterator(a.tFiles[i], nil, a.ro)\n}\n\n// Helper type for sortByKey.\ntype tFilesSortByKey struct {\n\ttFiles\n\ticmp *iComparer\n}\n\nfunc (x *tFilesSortByKey) Less(i, j int) bool {\n\treturn x.lessByKey(x.icmp, i, j)\n}\n\n// Helper type for sortByNum.\ntype tFilesSortByNum struct {\n\ttFiles\n}\n\nfunc (x *tFilesSortByNum) Less(i, j int) bool {\n\treturn x.lessByNum(i, j)\n}\n\n// Table operations.\ntype tOps struct {\n\ts      *session\n\tnoSync bool\n\tcache  *cache.Cache\n\tbcache *cache.Cache\n\tbpool  *util.BufferPool\n}\n\n// Creates an empty table and returns table writer.\nfunc (t *tOps) create() (*tWriter, error) {\n\tfd := storage.FileDesc{storage.TypeTable, t.s.allocFileNum()}\n\tfw, err := t.s.stor.Create(fd)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &tWriter{\n\t\tt:  t,\n\t\tfd: fd,\n\t\tw:  fw,\n\t\ttw: table.NewWriter(fw, t.s.o.Options),\n\t}, nil\n}\n\n// Builds table from src iterator.\nfunc (t *tOps) createFrom(src iterator.Iterator) (f *tFile, n int, err error) {\n\tw, err := t.create()\n\tif err != nil {\n\t\treturn\n\t}\n\n\tdefer func() {\n\t\tif err != nil {\n\t\t\tw.drop()\n\t\t}\n\t}()\n\n\tfor src.Next() {\n\t\terr = w.append(src.Key(), src.Value())\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\terr = src.Error()\n\tif err != nil {\n\t\treturn\n\t}\n\n\tn = w.tw.EntriesLen()\n\tf, err = w.finish()\n\treturn\n}\n\n// Opens table. It returns a cache handle, which should\n// be released after use.\nfunc (t *tOps) open(f *tFile) (ch *cache.Handle, err error) {\n\tch = t.cache.Get(0, uint64(f.fd.Num), func() (size int, value cache.Value) {\n\t\tvar r storage.Reader\n\t\tr, err = t.s.stor.Open(f.fd)\n\t\tif err != nil {\n\t\t\treturn 0, nil\n\t\t}\n\n\t\tvar bcache *cache.NamespaceGetter\n\t\tif t.bcache != nil {\n\t\t\tbcache = &cache.NamespaceGetter{Cache: t.bcache, NS: uint64(f.fd.Num)}\n\t\t}\n\n\t\tvar tr *table.Reader\n\t\ttr, err = table.NewReader(r, f.size, f.fd, bcache, t.bpool, t.s.o.Options)\n\t\tif err != nil {\n\t\t\tr.Close()\n\t\t\treturn 0, nil\n\t\t}\n\t\treturn 1, tr\n\n\t})\n\tif ch == nil && err == nil {\n\t\terr = ErrClosed\n\t}\n\treturn\n}\n\n// Finds key/value pair whose key is greater than or equal to the\n// given key.\nfunc (t *tOps) find(f *tFile, key []byte, ro *opt.ReadOptions) (rkey, rvalue []byte, err error) {\n\tch, err := t.open(f)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\tdefer ch.Release()\n\treturn ch.Value().(*table.Reader).Find(key, true, ro)\n}\n\n// Finds key that is greater than or equal to the given key.\nfunc (t *tOps) findKey(f *tFile, key []byte, ro *opt.ReadOptions) (rkey []byte, err error) {\n\tch, err := t.open(f)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer ch.Release()\n\treturn ch.Value().(*table.Reader).FindKey(key, true, ro)\n}\n\n// Returns approximate offset of the given key.\nfunc (t *tOps) offsetOf(f *tFile, key []byte) (offset int64, err error) {\n\tch, err := t.open(f)\n\tif err != nil {\n\t\treturn\n\t}\n\tdefer ch.Release()\n\treturn ch.Value().(*table.Reader).OffsetOf(key)\n}\n\n// Creates an iterator from the given table.\nfunc (t *tOps) newIterator(f *tFile, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator {\n\tch, err := t.open(f)\n\tif err != nil {\n\t\treturn iterator.NewEmptyIterator(err)\n\t}\n\titer := ch.Value().(*table.Reader).NewIterator(slice, ro)\n\titer.SetReleaser(ch)\n\treturn iter\n}\n\n// Removes table from persistent storage. It waits until\n// no one use the the table.\nfunc (t *tOps) remove(f *tFile) {\n\tt.cache.Delete(0, uint64(f.fd.Num), func() {\n\t\tif err := t.s.stor.Remove(f.fd); err != nil {\n\t\t\tt.s.logf(\"table@remove removing @%d %q\", f.fd.Num, err)\n\t\t} else {\n\t\t\tt.s.logf(\"table@remove removed @%d\", f.fd.Num)\n\t\t}\n\t\tif t.bcache != nil {\n\t\t\tt.bcache.EvictNS(uint64(f.fd.Num))\n\t\t}\n\t})\n}\n\n// Closes the table ops instance. It will close all tables,\n// regadless still used or not.\nfunc (t *tOps) close() {\n\tt.bpool.Close()\n\tt.cache.Close()\n\tif t.bcache != nil {\n\t\tt.bcache.CloseWeak()\n\t}\n}\n\n// Creates new initialized table ops instance.\nfunc newTableOps(s *session) *tOps {\n\tvar (\n\t\tcacher cache.Cacher\n\t\tbcache *cache.Cache\n\t\tbpool  *util.BufferPool\n\t)\n\tif s.o.GetOpenFilesCacheCapacity() > 0 {\n\t\tcacher = cache.NewLRU(s.o.GetOpenFilesCacheCapacity())\n\t}\n\tif !s.o.GetDisableBlockCache() {\n\t\tvar bcacher cache.Cacher\n\t\tif s.o.GetBlockCacheCapacity() > 0 {\n\t\t\tbcacher = cache.NewLRU(s.o.GetBlockCacheCapacity())\n\t\t}\n\t\tbcache = cache.NewCache(bcacher)\n\t}\n\tif !s.o.GetDisableBufferPool() {\n\t\tbpool = util.NewBufferPool(s.o.GetBlockSize() + 5)\n\t}\n\treturn &tOps{\n\t\ts:      s,\n\t\tnoSync: s.o.GetNoSync(),\n\t\tcache:  cache.NewCache(cacher),\n\t\tbcache: bcache,\n\t\tbpool:  bpool,\n\t}\n}\n\n// tWriter wraps the table writer. It keep track of file descriptor\n// and added key range.\ntype tWriter struct {\n\tt *tOps\n\n\tfd storage.FileDesc\n\tw  storage.Writer\n\ttw *table.Writer\n\n\tfirst, last []byte\n}\n\n// Append key/value pair to the table.\nfunc (w *tWriter) append(key, value []byte) error {\n\tif w.first == nil {\n\t\tw.first = append([]byte{}, key...)\n\t}\n\tw.last = append(w.last[:0], key...)\n\treturn w.tw.Append(key, value)\n}\n\n// Returns true if the table is empty.\nfunc (w *tWriter) empty() bool {\n\treturn w.first == nil\n}\n\n// Closes the storage.Writer.\nfunc (w *tWriter) close() {\n\tif w.w != nil {\n\t\tw.w.Close()\n\t\tw.w = nil\n\t}\n}\n\n// Finalizes the table and returns table file.\nfunc (w *tWriter) finish() (f *tFile, err error) {\n\tdefer w.close()\n\terr = w.tw.Close()\n\tif err != nil {\n\t\treturn\n\t}\n\tif !w.t.noSync {\n\t\terr = w.w.Sync()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tf = newTableFile(w.fd, int64(w.tw.BytesLen()), internalKey(w.first), internalKey(w.last))\n\treturn\n}\n\n// Drops the table.\nfunc (w *tWriter) drop() {\n\tw.close()\n\tw.t.s.stor.Remove(w.fd)\n\tw.t.s.reuseFileNum(w.fd.Num)\n\tw.tw = nil\n\tw.first = nil\n\tw.last = nil\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/util/buffer.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage util\n\n// This a copy of Go std bytes.Buffer with some modification\n// and some features stripped.\n\nimport (\n\t\"bytes\"\n\t\"io\"\n)\n\n// A Buffer is a variable-sized buffer of bytes with Read and Write methods.\n// The zero value for Buffer is an empty buffer ready to use.\ntype Buffer struct {\n\tbuf       []byte   // contents are the bytes buf[off : len(buf)]\n\toff       int      // read at &buf[off], write at &buf[len(buf)]\n\tbootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation.\n}\n\n// Bytes returns a slice of the contents of the unread portion of the buffer;\n// len(b.Bytes()) == b.Len().  If the caller changes the contents of the\n// returned slice, the contents of the buffer will change provided there\n// are no intervening method calls on the Buffer.\nfunc (b *Buffer) Bytes() []byte { return b.buf[b.off:] }\n\n// String returns the contents of the unread portion of the buffer\n// as a string.  If the Buffer is a nil pointer, it returns \"<nil>\".\nfunc (b *Buffer) String() string {\n\tif b == nil {\n\t\t// Special case, useful in debugging.\n\t\treturn \"<nil>\"\n\t}\n\treturn string(b.buf[b.off:])\n}\n\n// Len returns the number of bytes of the unread portion of the buffer;\n// b.Len() == len(b.Bytes()).\nfunc (b *Buffer) Len() int { return len(b.buf) - b.off }\n\n// Truncate discards all but the first n unread bytes from the buffer.\n// It panics if n is negative or greater than the length of the buffer.\nfunc (b *Buffer) Truncate(n int) {\n\tswitch {\n\tcase n < 0 || n > b.Len():\n\t\tpanic(\"leveldb/util.Buffer: truncation out of range\")\n\tcase n == 0:\n\t\t// Reuse buffer space.\n\t\tb.off = 0\n\t}\n\tb.buf = b.buf[0 : b.off+n]\n}\n\n// Reset resets the buffer so it has no content.\n// b.Reset() is the same as b.Truncate(0).\nfunc (b *Buffer) Reset() { b.Truncate(0) }\n\n// grow grows the buffer to guarantee space for n more bytes.\n// It returns the index where bytes should be written.\n// If the buffer can't grow it will panic with bytes.ErrTooLarge.\nfunc (b *Buffer) grow(n int) int {\n\tm := b.Len()\n\t// If buffer is empty, reset to recover space.\n\tif m == 0 && b.off != 0 {\n\t\tb.Truncate(0)\n\t}\n\tif len(b.buf)+n > cap(b.buf) {\n\t\tvar buf []byte\n\t\tif b.buf == nil && n <= len(b.bootstrap) {\n\t\t\tbuf = b.bootstrap[0:]\n\t\t} else if m+n <= cap(b.buf)/2 {\n\t\t\t// We can slide things down instead of allocating a new\n\t\t\t// slice. We only need m+n <= cap(b.buf) to slide, but\n\t\t\t// we instead let capacity get twice as large so we\n\t\t\t// don't spend all our time copying.\n\t\t\tcopy(b.buf[:], b.buf[b.off:])\n\t\t\tbuf = b.buf[:m]\n\t\t} else {\n\t\t\t// not enough space anywhere\n\t\t\tbuf = makeSlice(2*cap(b.buf) + n)\n\t\t\tcopy(buf, b.buf[b.off:])\n\t\t}\n\t\tb.buf = buf\n\t\tb.off = 0\n\t}\n\tb.buf = b.buf[0 : b.off+m+n]\n\treturn b.off + m\n}\n\n// Alloc allocs n bytes of slice from the buffer, growing the buffer as\n// needed. If n is negative, Alloc will panic.\n// If the buffer can't grow it will panic with bytes.ErrTooLarge.\nfunc (b *Buffer) Alloc(n int) []byte {\n\tif n < 0 {\n\t\tpanic(\"leveldb/util.Buffer.Alloc: negative count\")\n\t}\n\tm := b.grow(n)\n\treturn b.buf[m:]\n}\n\n// Grow grows the buffer's capacity, if necessary, to guarantee space for\n// another n bytes. After Grow(n), at least n bytes can be written to the\n// buffer without another allocation.\n// If n is negative, Grow will panic.\n// If the buffer can't grow it will panic with bytes.ErrTooLarge.\nfunc (b *Buffer) Grow(n int) {\n\tif n < 0 {\n\t\tpanic(\"leveldb/util.Buffer.Grow: negative count\")\n\t}\n\tm := b.grow(n)\n\tb.buf = b.buf[0:m]\n}\n\n// Write appends the contents of p to the buffer, growing the buffer as\n// needed. The return value n is the length of p; err is always nil. If the\n// buffer becomes too large, Write will panic with bytes.ErrTooLarge.\nfunc (b *Buffer) Write(p []byte) (n int, err error) {\n\tm := b.grow(len(p))\n\treturn copy(b.buf[m:], p), nil\n}\n\n// MinRead is the minimum slice size passed to a Read call by\n// Buffer.ReadFrom.  As long as the Buffer has at least MinRead bytes beyond\n// what is required to hold the contents of r, ReadFrom will not grow the\n// underlying buffer.\nconst MinRead = 512\n\n// ReadFrom reads data from r until EOF and appends it to the buffer, growing\n// the buffer as needed. The return value n is the number of bytes read. Any\n// error except io.EOF encountered during the read is also returned. If the\n// buffer becomes too large, ReadFrom will panic with bytes.ErrTooLarge.\nfunc (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {\n\t// If buffer is empty, reset to recover space.\n\tif b.off >= len(b.buf) {\n\t\tb.Truncate(0)\n\t}\n\tfor {\n\t\tif free := cap(b.buf) - len(b.buf); free < MinRead {\n\t\t\t// not enough space at end\n\t\t\tnewBuf := b.buf\n\t\t\tif b.off+free < MinRead {\n\t\t\t\t// not enough space using beginning of buffer;\n\t\t\t\t// double buffer capacity\n\t\t\t\tnewBuf = makeSlice(2*cap(b.buf) + MinRead)\n\t\t\t}\n\t\t\tcopy(newBuf, b.buf[b.off:])\n\t\t\tb.buf = newBuf[:len(b.buf)-b.off]\n\t\t\tb.off = 0\n\t\t}\n\t\tm, e := r.Read(b.buf[len(b.buf):cap(b.buf)])\n\t\tb.buf = b.buf[0 : len(b.buf)+m]\n\t\tn += int64(m)\n\t\tif e == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif e != nil {\n\t\t\treturn n, e\n\t\t}\n\t}\n\treturn n, nil // err is EOF, so return nil explicitly\n}\n\n// makeSlice allocates a slice of size n. If the allocation fails, it panics\n// with bytes.ErrTooLarge.\nfunc makeSlice(n int) []byte {\n\t// If the make fails, give a known error.\n\tdefer func() {\n\t\tif recover() != nil {\n\t\t\tpanic(bytes.ErrTooLarge)\n\t\t}\n\t}()\n\treturn make([]byte, n)\n}\n\n// WriteTo writes data to w until the buffer is drained or an error occurs.\n// The return value n is the number of bytes written; it always fits into an\n// int, but it is int64 to match the io.WriterTo interface. Any error\n// encountered during the write is also returned.\nfunc (b *Buffer) WriteTo(w io.Writer) (n int64, err error) {\n\tif b.off < len(b.buf) {\n\t\tnBytes := b.Len()\n\t\tm, e := w.Write(b.buf[b.off:])\n\t\tif m > nBytes {\n\t\t\tpanic(\"leveldb/util.Buffer.WriteTo: invalid Write count\")\n\t\t}\n\t\tb.off += m\n\t\tn = int64(m)\n\t\tif e != nil {\n\t\t\treturn n, e\n\t\t}\n\t\t// all bytes should have been written, by definition of\n\t\t// Write method in io.Writer\n\t\tif m != nBytes {\n\t\t\treturn n, io.ErrShortWrite\n\t\t}\n\t}\n\t// Buffer is now empty; reset.\n\tb.Truncate(0)\n\treturn\n}\n\n// WriteByte appends the byte c to the buffer, growing the buffer as needed.\n// The returned error is always nil, but is included to match bufio.Writer's\n// WriteByte. If the buffer becomes too large, WriteByte will panic with\n// bytes.ErrTooLarge.\nfunc (b *Buffer) WriteByte(c byte) error {\n\tm := b.grow(1)\n\tb.buf[m] = c\n\treturn nil\n}\n\n// Read reads the next len(p) bytes from the buffer or until the buffer\n// is drained.  The return value n is the number of bytes read.  If the\n// buffer has no data to return, err is io.EOF (unless len(p) is zero);\n// otherwise it is nil.\nfunc (b *Buffer) Read(p []byte) (n int, err error) {\n\tif b.off >= len(b.buf) {\n\t\t// Buffer is empty, reset to recover space.\n\t\tb.Truncate(0)\n\t\tif len(p) == 0 {\n\t\t\treturn\n\t\t}\n\t\treturn 0, io.EOF\n\t}\n\tn = copy(p, b.buf[b.off:])\n\tb.off += n\n\treturn\n}\n\n// Next returns a slice containing the next n bytes from the buffer,\n// advancing the buffer as if the bytes had been returned by Read.\n// If there are fewer than n bytes in the buffer, Next returns the entire buffer.\n// The slice is only valid until the next call to a read or write method.\nfunc (b *Buffer) Next(n int) []byte {\n\tm := b.Len()\n\tif n > m {\n\t\tn = m\n\t}\n\tdata := b.buf[b.off : b.off+n]\n\tb.off += n\n\treturn data\n}\n\n// ReadByte reads and returns the next byte from the buffer.\n// If no byte is available, it returns error io.EOF.\nfunc (b *Buffer) ReadByte() (c byte, err error) {\n\tif b.off >= len(b.buf) {\n\t\t// Buffer is empty, reset to recover space.\n\t\tb.Truncate(0)\n\t\treturn 0, io.EOF\n\t}\n\tc = b.buf[b.off]\n\tb.off++\n\treturn c, nil\n}\n\n// ReadBytes reads until the first occurrence of delim in the input,\n// returning a slice containing the data up to and including the delimiter.\n// If ReadBytes encounters an error before finding a delimiter,\n// it returns the data read before the error and the error itself (often io.EOF).\n// ReadBytes returns err != nil if and only if the returned data does not end in\n// delim.\nfunc (b *Buffer) ReadBytes(delim byte) (line []byte, err error) {\n\tslice, err := b.readSlice(delim)\n\t// return a copy of slice. The buffer's backing array may\n\t// be overwritten by later calls.\n\tline = append(line, slice...)\n\treturn\n}\n\n// readSlice is like ReadBytes but returns a reference to internal buffer data.\nfunc (b *Buffer) readSlice(delim byte) (line []byte, err error) {\n\ti := bytes.IndexByte(b.buf[b.off:], delim)\n\tend := b.off + i + 1\n\tif i < 0 {\n\t\tend = len(b.buf)\n\t\terr = io.EOF\n\t}\n\tline = b.buf[b.off:end]\n\tb.off = end\n\treturn line, err\n}\n\n// NewBuffer creates and initializes a new Buffer using buf as its initial\n// contents.  It is intended to prepare a Buffer to read existing data.  It\n// can also be used to size the internal buffer for writing. To do that,\n// buf should have the desired capacity but a length of zero.\n//\n// In most cases, new(Buffer) (or just declaring a Buffer variable) is\n// sufficient to initialize a Buffer.\nfunc NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go",
    "content": "// Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage util\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\ntype buffer struct {\n\tb    []byte\n\tmiss int\n}\n\n// BufferPool is a 'buffer pool'.\ntype BufferPool struct {\n\tpool      [6]chan []byte\n\tsize      [5]uint32\n\tsizeMiss  [5]uint32\n\tsizeHalf  [5]uint32\n\tbaseline  [4]int\n\tbaseline0 int\n\n\tmu     sync.RWMutex\n\tclosed bool\n\tcloseC chan struct{}\n\n\tget     uint32\n\tput     uint32\n\thalf    uint32\n\tless    uint32\n\tequal   uint32\n\tgreater uint32\n\tmiss    uint32\n}\n\nfunc (p *BufferPool) poolNum(n int) int {\n\tif n <= p.baseline0 && n > p.baseline0/2 {\n\t\treturn 0\n\t}\n\tfor i, x := range p.baseline {\n\t\tif n <= x {\n\t\t\treturn i + 1\n\t\t}\n\t}\n\treturn len(p.baseline) + 1\n}\n\n// Get returns buffer with length of n.\nfunc (p *BufferPool) Get(n int) []byte {\n\tif p == nil {\n\t\treturn make([]byte, n)\n\t}\n\n\tp.mu.RLock()\n\tdefer p.mu.RUnlock()\n\n\tif p.closed {\n\t\treturn make([]byte, n)\n\t}\n\n\tatomic.AddUint32(&p.get, 1)\n\n\tpoolNum := p.poolNum(n)\n\tpool := p.pool[poolNum]\n\tif poolNum == 0 {\n\t\t// Fast path.\n\t\tselect {\n\t\tcase b := <-pool:\n\t\t\tswitch {\n\t\t\tcase cap(b) > n:\n\t\t\t\tif cap(b)-n >= n {\n\t\t\t\t\tatomic.AddUint32(&p.half, 1)\n\t\t\t\t\tselect {\n\t\t\t\t\tcase pool <- b:\n\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t\treturn make([]byte, n)\n\t\t\t\t} else {\n\t\t\t\t\tatomic.AddUint32(&p.less, 1)\n\t\t\t\t\treturn b[:n]\n\t\t\t\t}\n\t\t\tcase cap(b) == n:\n\t\t\t\tatomic.AddUint32(&p.equal, 1)\n\t\t\t\treturn b[:n]\n\t\t\tdefault:\n\t\t\t\tatomic.AddUint32(&p.greater, 1)\n\t\t\t}\n\t\tdefault:\n\t\t\tatomic.AddUint32(&p.miss, 1)\n\t\t}\n\n\t\treturn make([]byte, n, p.baseline0)\n\t} else {\n\t\tsizePtr := &p.size[poolNum-1]\n\n\t\tselect {\n\t\tcase b := <-pool:\n\t\t\tswitch {\n\t\t\tcase cap(b) > n:\n\t\t\t\tif cap(b)-n >= n {\n\t\t\t\t\tatomic.AddUint32(&p.half, 1)\n\t\t\t\t\tsizeHalfPtr := &p.sizeHalf[poolNum-1]\n\t\t\t\t\tif atomic.AddUint32(sizeHalfPtr, 1) == 20 {\n\t\t\t\t\t\tatomic.StoreUint32(sizePtr, uint32(cap(b)/2))\n\t\t\t\t\t\tatomic.StoreUint32(sizeHalfPtr, 0)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselect {\n\t\t\t\t\t\tcase pool <- b:\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn make([]byte, n)\n\t\t\t\t} else {\n\t\t\t\t\tatomic.AddUint32(&p.less, 1)\n\t\t\t\t\treturn b[:n]\n\t\t\t\t}\n\t\t\tcase cap(b) == n:\n\t\t\t\tatomic.AddUint32(&p.equal, 1)\n\t\t\t\treturn b[:n]\n\t\t\tdefault:\n\t\t\t\tatomic.AddUint32(&p.greater, 1)\n\t\t\t\tif uint32(cap(b)) >= atomic.LoadUint32(sizePtr) {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase pool <- b:\n\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tatomic.AddUint32(&p.miss, 1)\n\t\t}\n\n\t\tif size := atomic.LoadUint32(sizePtr); uint32(n) > size {\n\t\t\tif size == 0 {\n\t\t\t\tatomic.CompareAndSwapUint32(sizePtr, 0, uint32(n))\n\t\t\t} else {\n\t\t\t\tsizeMissPtr := &p.sizeMiss[poolNum-1]\n\t\t\t\tif atomic.AddUint32(sizeMissPtr, 1) == 20 {\n\t\t\t\t\tatomic.StoreUint32(sizePtr, uint32(n))\n\t\t\t\t\tatomic.StoreUint32(sizeMissPtr, 0)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn make([]byte, n)\n\t\t} else {\n\t\t\treturn make([]byte, n, size)\n\t\t}\n\t}\n}\n\n// Put adds given buffer to the pool.\nfunc (p *BufferPool) Put(b []byte) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tp.mu.RLock()\n\tdefer p.mu.RUnlock()\n\n\tif p.closed {\n\t\treturn\n\t}\n\n\tatomic.AddUint32(&p.put, 1)\n\n\tpool := p.pool[p.poolNum(cap(b))]\n\tselect {\n\tcase pool <- b:\n\tdefault:\n\t}\n\n}\n\nfunc (p *BufferPool) Close() {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tp.mu.Lock()\n\tif !p.closed {\n\t\tp.closed = true\n\t\tp.closeC <- struct{}{}\n\t}\n\tp.mu.Unlock()\n}\n\nfunc (p *BufferPool) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\n\treturn fmt.Sprintf(\"BufferPool{B·%d Z·%v Zm·%v Zh·%v G·%d P·%d H·%d <·%d =·%d >·%d M·%d}\",\n\t\tp.baseline0, p.size, p.sizeMiss, p.sizeHalf, p.get, p.put, p.half, p.less, p.equal, p.greater, p.miss)\n}\n\nfunc (p *BufferPool) drain() {\n\tticker := time.NewTicker(2 * time.Second)\n\tdefer ticker.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-ticker.C:\n\t\t\tfor _, ch := range p.pool {\n\t\t\t\tselect {\n\t\t\t\tcase <-ch:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t}\n\t\tcase <-p.closeC:\n\t\t\tclose(p.closeC)\n\t\t\tfor _, ch := range p.pool {\n\t\t\t\tclose(ch)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// NewBufferPool creates a new initialized 'buffer pool'.\nfunc NewBufferPool(baseline int) *BufferPool {\n\tif baseline <= 0 {\n\t\tpanic(\"baseline can't be <= 0\")\n\t}\n\tp := &BufferPool{\n\t\tbaseline0: baseline,\n\t\tbaseline:  [...]int{baseline / 4, baseline / 2, baseline * 2, baseline * 4},\n\t\tcloseC:    make(chan struct{}, 1),\n\t}\n\tfor i, cap := range []int{2, 2, 4, 4, 2, 1} {\n\t\tp.pool[i] = make(chan []byte, cap)\n\t}\n\tgo p.drain()\n\treturn p\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/util/crc32.go",
    "content": "// Copyright 2011 The LevelDB-Go Authors. All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage util\n\nimport (\n\t\"hash/crc32\"\n)\n\nvar table = crc32.MakeTable(crc32.Castagnoli)\n\n// CRC is a CRC-32 checksum computed using Castagnoli's polynomial.\ntype CRC uint32\n\n// NewCRC creates a new crc based on the given bytes.\nfunc NewCRC(b []byte) CRC {\n\treturn CRC(0).Update(b)\n}\n\n// Update updates the crc with the given bytes.\nfunc (c CRC) Update(b []byte) CRC {\n\treturn CRC(crc32.Update(uint32(c), table, b))\n}\n\n// Value returns a masked crc.\nfunc (c CRC) Value() uint32 {\n\treturn uint32(c>>15|c<<17) + 0xa282ead8\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/util/hash.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage util\n\nimport (\n\t\"encoding/binary\"\n)\n\n// Hash return hash of the given data.\nfunc Hash(data []byte, seed uint32) uint32 {\n\t// Similar to murmur hash\n\tconst (\n\t\tm = uint32(0xc6a4a793)\n\t\tr = uint32(24)\n\t)\n\tvar (\n\t\th = seed ^ (uint32(len(data)) * m)\n\t\ti int\n\t)\n\n\tfor n := len(data) - len(data)%4; i < n; i += 4 {\n\t\th += binary.LittleEndian.Uint32(data[i:])\n\t\th *= m\n\t\th ^= (h >> 16)\n\t}\n\n\tswitch len(data) - i {\n\tdefault:\n\t\tpanic(\"not reached\")\n\tcase 3:\n\t\th += uint32(data[i+2]) << 16\n\t\tfallthrough\n\tcase 2:\n\t\th += uint32(data[i+1]) << 8\n\t\tfallthrough\n\tcase 1:\n\t\th += uint32(data[i])\n\t\th *= m\n\t\th ^= (h >> r)\n\tcase 0:\n\t}\n\n\treturn h\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/util/range.go",
    "content": "// Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage util\n\n// Range is a key range.\ntype Range struct {\n\t// Start of the key range, include in the range.\n\tStart []byte\n\n\t// Limit of the key range, not include in the range.\n\tLimit []byte\n}\n\n// BytesPrefix returns key range that satisfy the given prefix.\n// This only applicable for the standard 'bytes comparer'.\nfunc BytesPrefix(prefix []byte) *Range {\n\tvar limit []byte\n\tfor i := len(prefix) - 1; i >= 0; i-- {\n\t\tc := prefix[i]\n\t\tif c < 0xff {\n\t\t\tlimit = make([]byte, i+1)\n\t\t\tcopy(limit, prefix)\n\t\t\tlimit[i] = c + 1\n\t\t\tbreak\n\t\t}\n\t}\n\treturn &Range{prefix, limit}\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/util/util.go",
    "content": "// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// Package util provides utilities used throughout leveldb.\npackage util\n\nimport (\n\t\"errors\"\n)\n\nvar (\n\tErrReleased    = errors.New(\"leveldb: resource already relesed\")\n\tErrHasReleaser = errors.New(\"leveldb: releaser already defined\")\n)\n\n// Releaser is the interface that wraps the basic Release method.\ntype Releaser interface {\n\t// Release releases associated resources. Release should always success\n\t// and can be called multiple times without causing error.\n\tRelease()\n}\n\n// ReleaseSetter is the interface that wraps the basic SetReleaser method.\ntype ReleaseSetter interface {\n\t// SetReleaser associates the given releaser to the resources. The\n\t// releaser will be called once coresponding resources released.\n\t// Calling SetReleaser with nil will clear the releaser.\n\t//\n\t// This will panic if a releaser already present or coresponding\n\t// resource is already released. Releaser should be cleared first\n\t// before assigned a new one.\n\tSetReleaser(releaser Releaser)\n}\n\n// BasicReleaser provides basic implementation of Releaser and ReleaseSetter.\ntype BasicReleaser struct {\n\treleaser Releaser\n\treleased bool\n}\n\n// Released returns whether Release method already called.\nfunc (r *BasicReleaser) Released() bool {\n\treturn r.released\n}\n\n// Release implements Releaser.Release.\nfunc (r *BasicReleaser) Release() {\n\tif !r.released {\n\t\tif r.releaser != nil {\n\t\t\tr.releaser.Release()\n\t\t\tr.releaser = nil\n\t\t}\n\t\tr.released = true\n\t}\n}\n\n// SetReleaser implements ReleaseSetter.SetReleaser.\nfunc (r *BasicReleaser) SetReleaser(releaser Releaser) {\n\tif r.released {\n\t\tpanic(ErrReleased)\n\t}\n\tif r.releaser != nil && releaser != nil {\n\t\tpanic(ErrHasReleaser)\n\t}\n\tr.releaser = releaser\n}\n\ntype NoopReleaser struct{}\n\nfunc (NoopReleaser) Release() {}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/util.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/storage\"\n)\n\nfunc shorten(str string) string {\n\tif len(str) <= 8 {\n\t\treturn str\n\t}\n\treturn str[:3] + \"..\" + str[len(str)-3:]\n}\n\nvar bunits = [...]string{\"\", \"Ki\", \"Mi\", \"Gi\", \"Ti\"}\n\nfunc shortenb(bytes int) string {\n\ti := 0\n\tfor ; bytes > 1024 && i < 4; i++ {\n\t\tbytes /= 1024\n\t}\n\treturn fmt.Sprintf(\"%d%sB\", bytes, bunits[i])\n}\n\nfunc sshortenb(bytes int) string {\n\tif bytes == 0 {\n\t\treturn \"~\"\n\t}\n\tsign := \"+\"\n\tif bytes < 0 {\n\t\tsign = \"-\"\n\t\tbytes *= -1\n\t}\n\ti := 0\n\tfor ; bytes > 1024 && i < 4; i++ {\n\t\tbytes /= 1024\n\t}\n\treturn fmt.Sprintf(\"%s%d%sB\", sign, bytes, bunits[i])\n}\n\nfunc sint(x int) string {\n\tif x == 0 {\n\t\treturn \"~\"\n\t}\n\tsign := \"+\"\n\tif x < 0 {\n\t\tsign = \"-\"\n\t\tx *= -1\n\t}\n\treturn fmt.Sprintf(\"%s%d\", sign, x)\n}\n\nfunc minInt(a, b int) int {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc maxInt(a, b int) int {\n\tif a > b {\n\t\treturn a\n\t}\n\treturn b\n}\n\ntype fdSorter []storage.FileDesc\n\nfunc (p fdSorter) Len() int {\n\treturn len(p)\n}\n\nfunc (p fdSorter) Less(i, j int) bool {\n\treturn p[i].Num < p[j].Num\n}\n\nfunc (p fdSorter) Swap(i, j int) {\n\tp[i], p[j] = p[j], p[i]\n}\n\nfunc sortFds(fds []storage.FileDesc) {\n\tsort.Sort(fdSorter(fds))\n}\n\nfunc ensureBuffer(b []byte, n int) []byte {\n\tif cap(b) < n {\n\t\treturn make([]byte, n)\n\t}\n\treturn b[:n]\n}\n"
  },
  {
    "path": "vendor/github.com/syndtr/goleveldb/leveldb/version.go",
    "content": "// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>\n// All rights reserved.\n//\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\npackage leveldb\n\nimport (\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"unsafe\"\n\n\t\"github.com/syndtr/goleveldb/leveldb/iterator\"\n\t\"github.com/syndtr/goleveldb/leveldb/opt\"\n\t\"github.com/syndtr/goleveldb/leveldb/util\"\n)\n\ntype tSet struct {\n\tlevel int\n\ttable *tFile\n}\n\ntype version struct {\n\ts *session\n\n\tlevels []tFiles\n\n\t// Level that should be compacted next and its compaction score.\n\t// Score < 1 means compaction is not strictly needed. These fields\n\t// are initialized by computeCompaction()\n\tcLevel int\n\tcScore float64\n\n\tcSeek unsafe.Pointer\n\n\tclosing  bool\n\tref      int\n\treleased bool\n}\n\nfunc newVersion(s *session) *version {\n\treturn &version{s: s}\n}\n\nfunc (v *version) incref() {\n\tif v.released {\n\t\tpanic(\"already released\")\n\t}\n\n\tv.ref++\n\tif v.ref == 1 {\n\t\t// Incr file ref.\n\t\tfor _, tt := range v.levels {\n\t\t\tfor _, t := range tt {\n\t\t\t\tv.s.addFileRef(t.fd, 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (v *version) releaseNB() {\n\tv.ref--\n\tif v.ref > 0 {\n\t\treturn\n\t} else if v.ref < 0 {\n\t\tpanic(\"negative version ref\")\n\t}\n\n\tfor _, tt := range v.levels {\n\t\tfor _, t := range tt {\n\t\t\tif v.s.addFileRef(t.fd, -1) == 0 {\n\t\t\t\tv.s.tops.remove(t)\n\t\t\t}\n\t\t}\n\t}\n\n\tv.released = true\n}\n\nfunc (v *version) release() {\n\tv.s.vmu.Lock()\n\tv.releaseNB()\n\tv.s.vmu.Unlock()\n}\n\nfunc (v *version) walkOverlapping(aux tFiles, ikey internalKey, f func(level int, t *tFile) bool, lf func(level int) bool) {\n\tukey := ikey.ukey()\n\n\t// Aux level.\n\tif aux != nil {\n\t\tfor _, t := range aux {\n\t\t\tif t.overlaps(v.s.icmp, ukey, ukey) {\n\t\t\t\tif !f(-1, t) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif lf != nil && !lf(-1) {\n\t\t\treturn\n\t\t}\n\t}\n\n\t// Walk tables level-by-level.\n\tfor level, tables := range v.levels {\n\t\tif len(tables) == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif level == 0 {\n\t\t\t// Level-0 files may overlap each other. Find all files that\n\t\t\t// overlap ukey.\n\t\t\tfor _, t := range tables {\n\t\t\t\tif t.overlaps(v.s.icmp, ukey, ukey) {\n\t\t\t\t\tif !f(level, t) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif i := tables.searchMax(v.s.icmp, ikey); i < len(tables) {\n\t\t\t\tt := tables[i]\n\t\t\t\tif v.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 {\n\t\t\t\t\tif !f(level, t) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif lf != nil && !lf(level) {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (v *version) get(aux tFiles, ikey internalKey, ro *opt.ReadOptions, noValue bool) (value []byte, tcomp bool, err error) {\n\tif v.closing {\n\t\treturn nil, false, ErrClosed\n\t}\n\n\tukey := ikey.ukey()\n\n\tvar (\n\t\ttset  *tSet\n\t\ttseek bool\n\n\t\t// Level-0.\n\t\tzfound bool\n\t\tzseq   uint64\n\t\tzkt    keyType\n\t\tzval   []byte\n\t)\n\n\terr = ErrNotFound\n\n\t// Since entries never hop across level, finding key/value\n\t// in smaller level make later levels irrelevant.\n\tv.walkOverlapping(aux, ikey, func(level int, t *tFile) bool {\n\t\tif level >= 0 && !tseek {\n\t\t\tif tset == nil {\n\t\t\t\ttset = &tSet{level, t}\n\t\t\t} else {\n\t\t\t\ttseek = true\n\t\t\t}\n\t\t}\n\n\t\tvar (\n\t\t\tfikey, fval []byte\n\t\t\tferr        error\n\t\t)\n\t\tif noValue {\n\t\t\tfikey, ferr = v.s.tops.findKey(t, ikey, ro)\n\t\t} else {\n\t\t\tfikey, fval, ferr = v.s.tops.find(t, ikey, ro)\n\t\t}\n\n\t\tswitch ferr {\n\t\tcase nil:\n\t\tcase ErrNotFound:\n\t\t\treturn true\n\t\tdefault:\n\t\t\terr = ferr\n\t\t\treturn false\n\t\t}\n\n\t\tif fukey, fseq, fkt, fkerr := parseInternalKey(fikey); fkerr == nil {\n\t\t\tif v.s.icmp.uCompare(ukey, fukey) == 0 {\n\t\t\t\t// Level <= 0 may overlaps each-other.\n\t\t\t\tif level <= 0 {\n\t\t\t\t\tif fseq >= zseq {\n\t\t\t\t\t\tzfound = true\n\t\t\t\t\t\tzseq = fseq\n\t\t\t\t\t\tzkt = fkt\n\t\t\t\t\t\tzval = fval\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch fkt {\n\t\t\t\t\tcase keyTypeVal:\n\t\t\t\t\t\tvalue = fval\n\t\t\t\t\t\terr = nil\n\t\t\t\t\tcase keyTypeDel:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tpanic(\"leveldb: invalid internalKey type\")\n\t\t\t\t\t}\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\terr = fkerr\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t}, func(level int) bool {\n\t\tif zfound {\n\t\t\tswitch zkt {\n\t\t\tcase keyTypeVal:\n\t\t\t\tvalue = zval\n\t\t\t\terr = nil\n\t\t\tcase keyTypeDel:\n\t\t\tdefault:\n\t\t\t\tpanic(\"leveldb: invalid internalKey type\")\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t})\n\n\tif tseek && tset.table.consumeSeek() <= 0 {\n\t\ttcomp = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset))\n\t}\n\n\treturn\n}\n\nfunc (v *version) sampleSeek(ikey internalKey) (tcomp bool) {\n\tvar tset *tSet\n\n\tv.walkOverlapping(nil, ikey, func(level int, t *tFile) bool {\n\t\tif tset == nil {\n\t\t\ttset = &tSet{level, t}\n\t\t\treturn true\n\t\t}\n\t\tif tset.table.consumeSeek() <= 0 {\n\t\t\ttcomp = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset))\n\t\t}\n\t\treturn false\n\t}, nil)\n\n\treturn\n}\n\nfunc (v *version) getIterators(slice *util.Range, ro *opt.ReadOptions) (its []iterator.Iterator) {\n\tstrict := opt.GetStrict(v.s.o.Options, ro, opt.StrictReader)\n\tfor level, tables := range v.levels {\n\t\tif level == 0 {\n\t\t\t// Merge all level zero files together since they may overlap.\n\t\t\tfor _, t := range tables {\n\t\t\t\tits = append(its, v.s.tops.newIterator(t, slice, ro))\n\t\t\t}\n\t\t} else if len(tables) != 0 {\n\t\t\tits = append(its, iterator.NewIndexedIterator(tables.newIndexIterator(v.s.tops, v.s.icmp, slice, ro), strict))\n\t\t}\n\t}\n\treturn\n}\n\nfunc (v *version) newStaging() *versionStaging {\n\treturn &versionStaging{base: v}\n}\n\n// Spawn a new version based on this version.\nfunc (v *version) spawn(r *sessionRecord) *version {\n\tstaging := v.newStaging()\n\tstaging.commit(r)\n\treturn staging.finish()\n}\n\nfunc (v *version) fillRecord(r *sessionRecord) {\n\tfor level, tables := range v.levels {\n\t\tfor _, t := range tables {\n\t\t\tr.addTableFile(level, t)\n\t\t}\n\t}\n}\n\nfunc (v *version) tLen(level int) int {\n\tif level < len(v.levels) {\n\t\treturn len(v.levels[level])\n\t}\n\treturn 0\n}\n\nfunc (v *version) offsetOf(ikey internalKey) (n int64, err error) {\n\tfor level, tables := range v.levels {\n\t\tfor _, t := range tables {\n\t\t\tif v.s.icmp.Compare(t.imax, ikey) <= 0 {\n\t\t\t\t// Entire file is before \"ikey\", so just add the file size\n\t\t\t\tn += t.size\n\t\t\t} else if v.s.icmp.Compare(t.imin, ikey) > 0 {\n\t\t\t\t// Entire file is after \"ikey\", so ignore\n\t\t\t\tif level > 0 {\n\t\t\t\t\t// Files other than level 0 are sorted by meta->min, so\n\t\t\t\t\t// no further files in this level will contain data for\n\t\t\t\t\t// \"ikey\".\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// \"ikey\" falls in the range for this table. Add the\n\t\t\t\t// approximate offset of \"ikey\" within the table.\n\t\t\t\tif m, err := v.s.tops.offsetOf(t, ikey); err == nil {\n\t\t\t\t\tn += m\n\t\t\t\t} else {\n\t\t\t\t\treturn 0, err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc (v *version) pickMemdbLevel(umin, umax []byte, maxLevel int) (level int) {\n\tif maxLevel > 0 {\n\t\tif len(v.levels) == 0 {\n\t\t\treturn maxLevel\n\t\t}\n\t\tif !v.levels[0].overlaps(v.s.icmp, umin, umax, true) {\n\t\t\tvar overlaps tFiles\n\t\t\tfor ; level < maxLevel; level++ {\n\t\t\t\tif pLevel := level + 1; pLevel >= len(v.levels) {\n\t\t\t\t\treturn maxLevel\n\t\t\t\t} else if v.levels[pLevel].overlaps(v.s.icmp, umin, umax, false) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tif gpLevel := level + 2; gpLevel < len(v.levels) {\n\t\t\t\t\toverlaps = v.levels[gpLevel].getOverlaps(overlaps, v.s.icmp, umin, umax, false)\n\t\t\t\t\tif overlaps.size() > int64(v.s.o.GetCompactionGPOverlaps(level)) {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (v *version) computeCompaction() {\n\t// Precomputed best level for next compaction\n\tbestLevel := int(-1)\n\tbestScore := float64(-1)\n\n\tstatFiles := make([]int, len(v.levels))\n\tstatSizes := make([]string, len(v.levels))\n\tstatScore := make([]string, len(v.levels))\n\tstatTotSize := int64(0)\n\n\tfor level, tables := range v.levels {\n\t\tvar score float64\n\t\tsize := tables.size()\n\t\tif level == 0 {\n\t\t\t// We treat level-0 specially by bounding the number of files\n\t\t\t// instead of number of bytes for two reasons:\n\t\t\t//\n\t\t\t// (1) With larger write-buffer sizes, it is nice not to do too\n\t\t\t// many level-0 compaction.\n\t\t\t//\n\t\t\t// (2) The files in level-0 are merged on every read and\n\t\t\t// therefore we wish to avoid too many files when the individual\n\t\t\t// file size is small (perhaps because of a small write-buffer\n\t\t\t// setting, or very high compression ratios, or lots of\n\t\t\t// overwrites/deletions).\n\t\t\tscore = float64(len(tables)) / float64(v.s.o.GetCompactionL0Trigger())\n\t\t} else {\n\t\t\tscore = float64(size) / float64(v.s.o.GetCompactionTotalSize(level))\n\t\t}\n\n\t\tif score > bestScore {\n\t\t\tbestLevel = level\n\t\t\tbestScore = score\n\t\t}\n\n\t\tstatFiles[level] = len(tables)\n\t\tstatSizes[level] = shortenb(int(size))\n\t\tstatScore[level] = fmt.Sprintf(\"%.2f\", score)\n\t\tstatTotSize += size\n\t}\n\n\tv.cLevel = bestLevel\n\tv.cScore = bestScore\n\n\tv.s.logf(\"version@stat F·%v S·%s%v Sc·%v\", statFiles, shortenb(int(statTotSize)), statSizes, statScore)\n}\n\nfunc (v *version) needCompaction() bool {\n\treturn v.cScore >= 1 || atomic.LoadPointer(&v.cSeek) != nil\n}\n\ntype tablesScratch struct {\n\tadded   map[int64]atRecord\n\tdeleted map[int64]struct{}\n}\n\ntype versionStaging struct {\n\tbase   *version\n\tlevels []tablesScratch\n}\n\nfunc (p *versionStaging) getScratch(level int) *tablesScratch {\n\tif level >= len(p.levels) {\n\t\tnewLevels := make([]tablesScratch, level+1)\n\t\tcopy(newLevels, p.levels)\n\t\tp.levels = newLevels\n\t}\n\treturn &(p.levels[level])\n}\n\nfunc (p *versionStaging) commit(r *sessionRecord) {\n\t// Deleted tables.\n\tfor _, r := range r.deletedTables {\n\t\tscratch := p.getScratch(r.level)\n\t\tif r.level < len(p.base.levels) && len(p.base.levels[r.level]) > 0 {\n\t\t\tif scratch.deleted == nil {\n\t\t\t\tscratch.deleted = make(map[int64]struct{})\n\t\t\t}\n\t\t\tscratch.deleted[r.num] = struct{}{}\n\t\t}\n\t\tif scratch.added != nil {\n\t\t\tdelete(scratch.added, r.num)\n\t\t}\n\t}\n\n\t// New tables.\n\tfor _, r := range r.addedTables {\n\t\tscratch := p.getScratch(r.level)\n\t\tif scratch.added == nil {\n\t\t\tscratch.added = make(map[int64]atRecord)\n\t\t}\n\t\tscratch.added[r.num] = r\n\t\tif scratch.deleted != nil {\n\t\t\tdelete(scratch.deleted, r.num)\n\t\t}\n\t}\n}\n\nfunc (p *versionStaging) finish() *version {\n\t// Build new version.\n\tnv := newVersion(p.base.s)\n\tnumLevel := len(p.levels)\n\tif len(p.base.levels) > numLevel {\n\t\tnumLevel = len(p.base.levels)\n\t}\n\tnv.levels = make([]tFiles, numLevel)\n\tfor level := 0; level < numLevel; level++ {\n\t\tvar baseTabels tFiles\n\t\tif level < len(p.base.levels) {\n\t\t\tbaseTabels = p.base.levels[level]\n\t\t}\n\n\t\tif level < len(p.levels) {\n\t\t\tscratch := p.levels[level]\n\n\t\t\tvar nt tFiles\n\t\t\t// Prealloc list if possible.\n\t\t\tif n := len(baseTabels) + len(scratch.added) - len(scratch.deleted); n > 0 {\n\t\t\t\tnt = make(tFiles, 0, n)\n\t\t\t}\n\n\t\t\t// Base tables.\n\t\t\tfor _, t := range baseTabels {\n\t\t\t\tif _, ok := scratch.deleted[t.fd.Num]; ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif _, ok := scratch.added[t.fd.Num]; ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tnt = append(nt, t)\n\t\t\t}\n\n\t\t\t// New tables.\n\t\t\tfor _, r := range scratch.added {\n\t\t\t\tnt = append(nt, tableFileFromRecord(r))\n\t\t\t}\n\n\t\t\tif len(nt) != 0 {\n\t\t\t\t// Sort tables.\n\t\t\t\tif level == 0 {\n\t\t\t\t\tnt.sortByNum()\n\t\t\t\t} else {\n\t\t\t\t\tnt.sortByKey(p.base.s.icmp)\n\t\t\t\t}\n\n\t\t\t\tnv.levels[level] = nt\n\t\t\t}\n\t\t} else {\n\t\t\tnv.levels[level] = baseTabels\n\t\t}\n\t}\n\n\t// Trim levels.\n\tn := len(nv.levels)\n\tfor ; n > 0 && nv.levels[n-1] == nil; n-- {\n\t}\n\tnv.levels = nv.levels[:n]\n\n\t// Compute compaction score for new version.\n\tnv.computeCompaction()\n\n\treturn nv\n}\n\ntype versionReleaser struct {\n\tv    *version\n\tonce bool\n}\n\nfunc (vr *versionReleaser) Release() {\n\tv := vr.v\n\tv.s.vmu.Lock()\n\tif !vr.once {\n\t\tv.releaseNB()\n\t\tvr.once = true\n\t}\n\tv.s.vmu.Unlock()\n}\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/Gopkg.toml",
    "content": "\n# Gopkg.toml example\n#\n# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md\n# for detailed Gopkg.toml documentation.\n#\n# required = [\"github.com/user/thing/cmd/thing\"]\n# ignored = [\"github.com/user/project/pkgX\", \"bitbucket.org/user/project/pkgA/pkgY\"]\n#\n# [[constraint]]\n#   name = \"github.com/user/project\"\n#   version = \"1.0.0\"\n#\n# [[constraint]]\n#   name = \"github.com/user/project2\"\n#   branch = \"dev\"\n#   source = \"github.com/myfork/project2\"\n#\n# [[override]]\n#  name = \"github.com/x/y\"\n#  version = \"2.4.0\"\n\n\n[[constraint]]\n  branch = \"master\"\n  name = \"golang.org/x/crypto\"\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014-2018 Tyler Smith and contributors\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": "vendor/github.com/tyler-smith/go-bip39/Makefile",
    "content": ".DEFAULT_GOAL := help\n\ntests: ## Run tests with coverage\n\tgo test -v -cover ./...\n\nprofile_tests: ## Run tests and output coverage profiling\n\tgo test -v -coverprofile=coverage.out .\n\tgo tool cover -html=coverage.out\n\nhelp:\n\t@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = \":.*?## \"}; {printf \"\\033[36m%-30s\\033[0m %s\\n\", $$1, $$2}'\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/README.md",
    "content": "# go-bip39\n[![Build Status](https://travis-ci.org/tyler-smith/go-bip39.svg?branch=master)](https://travis-ci.org/tyler-smith/go-bip39)\n[![license](https://img.shields.io/github/license/tyler-smith/go-bip39.svg?maxAge=2592000)](https://github.com/tyler-smith/go-bip39/blob/master/LICENSE)\n[![Documentation](https://godoc.org/github.com/tyler-smith/go-bip39?status.svg)](http://godoc.org/github.com/tyler-smith/go-bip39)\n[![Go Report Card](https://goreportcard.com/badge/github.com/tyler-smith/go-bip39)](https://goreportcard.com/report/github.com/tyler-smith/go-bip39)\n[![GitHub issues](https://img.shields.io/github/issues/tyler-smith/go-bip39.svg)](https://github.com/tyler-smith/go-bip39/issues)\n\n\nA golang implementation of the BIP0039 spec for mnemonic seeds\n\n## Example\n\n```go\npackage main\n\nimport (\n  \"github.com/tyler-smith/go-bip39\"\n  \"github.com/tyler-smith/go-bip32\"\n  \"fmt\"\n)\n\nfunc main(){\n  // Generate a mnemonic for memorization or user-friendly seeds\n  entropy, _ := bip39.NewEntropy(256)\n  mnemonic, _ := bip39.NewMnemonic(entropy)\n\n  // Generate a Bip32 HD wallet for the mnemonic and a user supplied password\n  seed := bip39.NewSeed(mnemonic, \"Secret Passphrase\")\n\n  masterKey, _ := bip32.NewMasterKey(seed)\n  publicKey := masterKey.PublicKey()\n\n  // Display mnemonic and keys\n  fmt.Println(\"Mnemonic: \", mnemonic)\n  fmt.Println(\"Master private key: \", masterKey)\n  fmt.Println(\"Master public key: \", publicKey)\n}\n```\n\n## Credits\n\nWordlists are from the [bip39 spec](https://github.com/bitcoin/bips/tree/master/bip-0039).\n\nTest vectors are from the standard Python BIP0039 implementation from the\nTrezor team: [https://github.com/trezor/python-mnemonic](https://github.com/trezor/python-mnemonic)\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/bip39.go",
    "content": "// Package bip39 is the Golang implementation of the BIP39 spec.\n//\n// The official BIP39 spec can be found at\n// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\npackage bip39\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"crypto/sha512\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/tyler-smith/go-bip39/wordlists\"\n\t\"golang.org/x/crypto/pbkdf2\"\n)\n\nvar (\n\t// Some bitwise operands for working with big.Ints\n\tlast11BitsMask  = big.NewInt(2047)\n\tshift11BitsMask = big.NewInt(2048)\n\tbigOne          = big.NewInt(1)\n\tbigTwo          = big.NewInt(2)\n\n\t// used to isolate the checksum bits from the entropy+checksum byte array\n\twordLengthChecksumMasksMapping = map[int]*big.Int{\n\t\t12: big.NewInt(15),\n\t\t15: big.NewInt(31),\n\t\t18: big.NewInt(63),\n\t\t21: big.NewInt(127),\n\t\t24: big.NewInt(255),\n\t}\n\t// used to use only the desired x of 8 available checksum bits.\n\t// 256 bit (word length 24) requires all 8 bits of the checksum,\n\t// and thus no shifting is needed for it (we would get a divByZero crash if we did)\n\twordLengthChecksumShiftMapping = map[int]*big.Int{\n\t\t12: big.NewInt(16),\n\t\t15: big.NewInt(8),\n\t\t18: big.NewInt(4),\n\t\t21: big.NewInt(2),\n\t}\n\n\t// wordList is the set of words to use\n\twordList []string\n\n\t// wordMap is a reverse lookup map for wordList\n\twordMap map[string]int\n)\n\nvar (\n\t// ErrInvalidMnemonic is returned when trying to use a malformed mnemonic.\n\tErrInvalidMnemonic = errors.New(\"Invalid mnenomic\")\n\n\t// ErrEntropyLengthInvalid is returned when trying to use an entropy set with\n\t// an invalid size.\n\tErrEntropyLengthInvalid = errors.New(\"Entropy length must be [128, 256] and a multiple of 32\")\n\n\t// ErrValidatedSeedLengthMismatch is returned when a validated seed is not the\n\t// same size as the given seed. This should never happen is present only as a\n\t// sanity assertion.\n\tErrValidatedSeedLengthMismatch = errors.New(\"Seed length does not match validated seed length\")\n\n\t// ErrChecksumIncorrect is returned when entropy has the incorrect checksum.\n\tErrChecksumIncorrect = errors.New(\"Checksum incorrect\")\n)\n\nfunc init() {\n\tSetWordList(wordlists.English)\n}\n\n// SetWordList sets the list of words to use for mnemonics. Currently the list\n// that is set is used package-wide.\nfunc SetWordList(list []string) {\n\twordList = list\n\twordMap = map[string]int{}\n\tfor i, v := range wordList {\n\t\twordMap[v] = i\n\t}\n}\n\n// GetWordList gets the list of words to use for mnemonics.\nfunc GetWordList() []string {\n\treturn wordList\n}\n\n// GetWordIndex gets word index in wordMap.\nfunc GetWordIndex(word string) (int, bool) {\n\tidx, ok := wordMap[word]\n\treturn idx, ok\n}\n\n// NewEntropy will create random entropy bytes\n// so long as the requested size bitSize is an appropriate size.\n//\n// bitSize has to be a multiple 32 and be within the inclusive range of {128, 256}\nfunc NewEntropy(bitSize int) ([]byte, error) {\n\terr := validateEntropyBitSize(bitSize)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tentropy := make([]byte, bitSize/8)\n\t_, err = rand.Read(entropy)\n\treturn entropy, err\n}\n\n// EntropyFromMnemonic takes a mnemonic generated by this library,\n// and returns the input entropy used to generate the given mnemonic.\n// An error is returned if the given mnemonic is invalid.\nfunc EntropyFromMnemonic(mnemonic string) ([]byte, error) {\n\tmnemonicSlice, isValid := splitMnemonicWords(mnemonic)\n\tif !isValid {\n\t\treturn nil, ErrInvalidMnemonic\n\t}\n\n\t// Decode the words into a big.Int.\n\tb := big.NewInt(0)\n\tfor _, v := range mnemonicSlice {\n\t\tindex, found := wordMap[v]\n\t\tif found == false {\n\t\t\treturn nil, fmt.Errorf(\"word `%v` not found in reverse map\", v)\n\t\t}\n\t\tvar wordBytes [2]byte\n\t\tbinary.BigEndian.PutUint16(wordBytes[:], uint16(index))\n\t\tb = b.Mul(b, shift11BitsMask)\n\t\tb = b.Or(b, big.NewInt(0).SetBytes(wordBytes[:]))\n\t}\n\n\t// Build and add the checksum to the big.Int.\n\tchecksum := big.NewInt(0)\n\tchecksumMask := wordLengthChecksumMasksMapping[len(mnemonicSlice)]\n\tchecksum = checksum.And(b, checksumMask)\n\n\tb.Div(b, big.NewInt(0).Add(checksumMask, bigOne))\n\n\t// The entropy is the underlying bytes of the big.Int. Any upper bytes of\n\t// all 0's are not returned so we pad the beginning of the slice with empty\n\t// bytes if necessary.\n\tentropy := b.Bytes()\n\tentropy = padByteSlice(entropy, len(mnemonicSlice)/3*4)\n\n\t// Generate the checksum and compare with the one we got from the mneomnic.\n\tentropyChecksumBytes := computeChecksum(entropy)\n\tentropyChecksum := big.NewInt(int64(entropyChecksumBytes[0]))\n\tif l := len(mnemonicSlice); l != 24 {\n\t\tchecksumShift := wordLengthChecksumShiftMapping[l]\n\t\tentropyChecksum.Div(entropyChecksum, checksumShift)\n\t}\n\n\tif checksum.Cmp(entropyChecksum) != 0 {\n\t\treturn nil, ErrChecksumIncorrect\n\t}\n\n\treturn entropy, nil\n}\n\n// NewMnemonic will return a string consisting of the mnemonic words for\n// the given entropy.\n// If the provide entropy is invalid, an error will be returned.\nfunc NewMnemonic(entropy []byte) (string, error) {\n\t// Compute some lengths for convenience.\n\tentropyBitLength := len(entropy) * 8\n\tchecksumBitLength := entropyBitLength / 32\n\tsentenceLength := (entropyBitLength + checksumBitLength) / 11\n\n\t// Validate that the requested size is supported.\n\terr := validateEntropyBitSize(entropyBitLength)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// Add checksum to entropy.\n\tentropy = addChecksum(entropy)\n\n\t// Break entropy up into sentenceLength chunks of 11 bits.\n\t// For each word AND mask the rightmost 11 bits and find the word at that index.\n\t// Then bitshift entropy 11 bits right and repeat.\n\t// Add to the last empty slot so we can work with LSBs instead of MSB.\n\n\t// Entropy as an int so we can bitmask without worrying about bytes slices.\n\tentropyInt := new(big.Int).SetBytes(entropy)\n\n\t// Slice to hold words in.\n\twords := make([]string, sentenceLength)\n\n\t// Throw away big.Int for AND masking.\n\tword := big.NewInt(0)\n\n\tfor i := sentenceLength - 1; i >= 0; i-- {\n\t\t// Get 11 right most bits and bitshift 11 to the right for next time.\n\t\tword.And(entropyInt, last11BitsMask)\n\t\tentropyInt.Div(entropyInt, shift11BitsMask)\n\n\t\t// Get the bytes representing the 11 bits as a 2 byte slice.\n\t\twordBytes := padByteSlice(word.Bytes(), 2)\n\n\t\t// Convert bytes to an index and add that word to the list.\n\t\twords[i] = wordList[binary.BigEndian.Uint16(wordBytes)]\n\t}\n\n\treturn strings.Join(words, \" \"), nil\n}\n\n// MnemonicToByteArray takes a mnemonic string and turns it into a byte array\n// suitable for creating another mnemonic.\n// An error is returned if the mnemonic is invalid.\nfunc MnemonicToByteArray(mnemonic string, raw ...bool) ([]byte, error) {\n\tvar (\n\t\tmnemonicSlice    = strings.Split(mnemonic, \" \")\n\t\tentropyBitSize   = len(mnemonicSlice) * 11\n\t\tchecksumBitSize  = entropyBitSize % 32\n\t\tfullByteSize     = (entropyBitSize-checksumBitSize)/8 + 1\n\t\tchecksumByteSize = fullByteSize - (fullByteSize % 4)\n\t)\n\n\t// Pre validate that the mnemonic is well formed and only contains words that\n\t// are present in the word list.\n\tif !IsMnemonicValid(mnemonic) {\n\t\treturn nil, ErrInvalidMnemonic\n\t}\n\n\t// Convert word indices to a big.Int representing the entropy.\n\tchecksummedEntropy := big.NewInt(0)\n\tmodulo := big.NewInt(2048)\n\tfor _, v := range mnemonicSlice {\n\t\tindex := big.NewInt(int64(wordMap[v]))\n\t\tchecksummedEntropy.Mul(checksummedEntropy, modulo)\n\t\tchecksummedEntropy.Add(checksummedEntropy, index)\n\t}\n\n\t// Calculate the unchecksummed entropy so we can validate that the checksum is\n\t// correct.\n\tchecksumModulo := big.NewInt(0).Exp(bigTwo, big.NewInt(int64(checksumBitSize)), nil)\n\trawEntropy := big.NewInt(0).Div(checksummedEntropy, checksumModulo)\n\n\t// Convert big.Ints to byte padded byte slices.\n\trawEntropyBytes := padByteSlice(rawEntropy.Bytes(), checksumByteSize)\n\tchecksummedEntropyBytes := padByteSlice(checksummedEntropy.Bytes(), fullByteSize)\n\n\t// Validate that the checksum is correct.\n\tnewChecksummedEntropyBytes := padByteSlice(addChecksum(rawEntropyBytes), fullByteSize)\n\tif !compareByteSlices(checksummedEntropyBytes, newChecksummedEntropyBytes) {\n\t\treturn nil, ErrChecksumIncorrect\n\t}\n\n\tif len(raw) > 0 && raw[0] {\n\t\treturn rawEntropyBytes, nil\n\t}\n\n\treturn checksummedEntropyBytes, nil\n}\n\n// NewSeedWithErrorChecking creates a hashed seed output given the mnemonic string and a password.\n// An error is returned if the mnemonic is not convertible to a byte array.\nfunc NewSeedWithErrorChecking(mnemonic string, password string) ([]byte, error) {\n\t_, err := MnemonicToByteArray(mnemonic)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewSeed(mnemonic, password), nil\n}\n\n// NewSeed creates a hashed seed output given a provided string and password.\n// No checking is performed to validate that the string provided is a valid mnemonic.\nfunc NewSeed(mnemonic string, password string) []byte {\n\treturn pbkdf2.Key([]byte(mnemonic), []byte(\"mnemonic\"+password), 2048, 64, sha512.New)\n}\n\n// IsMnemonicValid attempts to verify that the provided mnemonic is valid.\n// Validity is determined by both the number of words being appropriate,\n// and that all the words in the mnemonic are present in the word list.\nfunc IsMnemonicValid(mnemonic string) bool {\n\t// Create a list of all the words in the mnemonic sentence\n\twords := strings.Fields(mnemonic)\n\n\t// Get word count\n\twordCount := len(words)\n\n\t// The number of words should be 12, 15, 18, 21 or 24\n\tif wordCount%3 != 0 || wordCount < 12 || wordCount > 24 {\n\t\treturn false\n\t}\n\n\t// Check if all words belong in the wordlist\n\tfor _, word := range words {\n\t\tif _, ok := wordMap[word]; !ok {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\n// Appends to data the first (len(data) / 32)bits of the result of sha256(data)\n// Currently only supports data up to 32 bytes\nfunc addChecksum(data []byte) []byte {\n\t// Get first byte of sha256\n\thash := computeChecksum(data)\n\tfirstChecksumByte := hash[0]\n\n\t// len() is in bytes so we divide by 4\n\tchecksumBitLength := uint(len(data) / 4)\n\n\t// For each bit of check sum we want we shift the data one the left\n\t// and then set the (new) right most bit equal to checksum bit at that index\n\t// staring from the left\n\tdataBigInt := new(big.Int).SetBytes(data)\n\tfor i := uint(0); i < checksumBitLength; i++ {\n\t\t// Bitshift 1 left\n\t\tdataBigInt.Mul(dataBigInt, bigTwo)\n\n\t\t// Set rightmost bit if leftmost checksum bit is set\n\t\tif uint8(firstChecksumByte&(1<<(7-i))) > 0 {\n\t\t\tdataBigInt.Or(dataBigInt, bigOne)\n\t\t}\n\t}\n\n\treturn dataBigInt.Bytes()\n}\n\nfunc computeChecksum(data []byte) []byte {\n\thasher := sha256.New()\n\thasher.Write(data)\n\treturn hasher.Sum(nil)\n}\n\n// validateEntropyBitSize ensures that entropy is the correct size for being a\n// mnemonic.\nfunc validateEntropyBitSize(bitSize int) error {\n\tif (bitSize%32) != 0 || bitSize < 128 || bitSize > 256 {\n\t\treturn ErrEntropyLengthInvalid\n\t}\n\treturn nil\n}\n\n// padByteSlice returns a byte slice of the given size with contents of the\n// given slice left padded and any empty spaces filled with 0's.\nfunc padByteSlice(slice []byte, length int) []byte {\n\toffset := length - len(slice)\n\tif offset <= 0 {\n\t\treturn slice\n\t}\n\tnewSlice := make([]byte, length)\n\tcopy(newSlice[offset:], slice)\n\treturn newSlice\n}\n\n// compareByteSlices returns true of the byte slices have equal contents and\n// returns false otherwise.\nfunc compareByteSlices(a, b []byte) bool {\n\tif len(a) != len(b) {\n\t\treturn false\n\t}\n\tfor i := range a {\n\t\tif a[i] != b[i] {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc splitMnemonicWords(mnemonic string) ([]string, bool) {\n\t// Create a list of all the words in the mnemonic sentence\n\twords := strings.Fields(mnemonic)\n\n\t// Get num of words\n\tnumOfWords := len(words)\n\n\t// The number of words should be 12, 15, 18, 21 or 24\n\tif numOfWords%3 != 0 || numOfWords < 12 || numOfWords > 24 {\n\t\treturn nil, false\n\t}\n\treturn words, true\n}\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_simplified.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt\n\t// $ crc32 chinese_simplified.txt\n\t// e3721bbf\n\tchecksum := crc32.ChecksumIEEE([]byte(chineseSimplified))\n\tif fmt.Sprintf(\"%x\", checksum) != \"e3721bbf\" {\n\t\tpanic(\"chineseSimplified checksum invalid\")\n\t}\n}\n\n// ChineseSimplified is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_simplified.txt\nvar ChineseSimplified = strings.Split(strings.TrimSpace(chineseSimplified), \"\\n\")\nvar chineseSimplified = `的\n一\n是\n在\n不\n了\n有\n和\n人\n这\n中\n大\n为\n上\n个\n国\n我\n以\n要\n他\n时\n来\n用\n们\n生\n到\n作\n地\n于\n出\n就\n分\n对\n成\n会\n可\n主\n发\n年\n动\n同\n工\n也\n能\n下\n过\n子\n说\n产\n种\n面\n而\n方\n后\n多\n定\n行\n学\n法\n所\n民\n得\n经\n十\n三\n之\n进\n着\n等\n部\n度\n家\n电\n力\n里\n如\n水\n化\n高\n自\n二\n理\n起\n小\n物\n现\n实\n加\n量\n都\n两\n体\n制\n机\n当\n使\n点\n从\n业\n本\n去\n把\n性\n好\n应\n开\n它\n合\n还\n因\n由\n其\n些\n然\n前\n外\n天\n政\n四\n日\n那\n社\n义\n事\n平\n形\n相\n全\n表\n间\n样\n与\n关\n各\n重\n新\n线\n内\n数\n正\n心\n反\n你\n明\n看\n原\n又\n么\n利\n比\n或\n但\n质\n气\n第\n向\n道\n命\n此\n变\n条\n只\n没\n结\n解\n问\n意\n建\n月\n公\n无\n系\n军\n很\n情\n者\n最\n立\n代\n想\n已\n通\n并\n提\n直\n题\n党\n程\n展\n五\n果\n料\n象\n员\n革\n位\n入\n常\n文\n总\n次\n品\n式\n活\n设\n及\n管\n特\n件\n长\n求\n老\n头\n基\n资\n边\n流\n路\n级\n少\n图\n山\n统\n接\n知\n较\n将\n组\n见\n计\n别\n她\n手\n角\n期\n根\n论\n运\n农\n指\n几\n九\n区\n强\n放\n决\n西\n被\n干\n做\n必\n战\n先\n回\n则\n任\n取\n据\n处\n队\n南\n给\n色\n光\n门\n即\n保\n治\n北\n造\n百\n规\n热\n领\n七\n海\n口\n东\n导\n器\n压\n志\n世\n金\n增\n争\n济\n阶\n油\n思\n术\n极\n交\n受\n联\n什\n认\n六\n共\n权\n收\n证\n改\n清\n美\n再\n采\n转\n更\n单\n风\n切\n打\n白\n教\n速\n花\n带\n安\n场\n身\n车\n例\n真\n务\n具\n万\n每\n目\n至\n达\n走\n积\n示\n议\n声\n报\n斗\n完\n类\n八\n离\n华\n名\n确\n才\n科\n张\n信\n马\n节\n话\n米\n整\n空\n元\n况\n今\n集\n温\n传\n土\n许\n步\n群\n广\n石\n记\n需\n段\n研\n界\n拉\n林\n律\n叫\n且\n究\n观\n越\n织\n装\n影\n算\n低\n持\n音\n众\n书\n布\n复\n容\n儿\n须\n际\n商\n非\n验\n连\n断\n深\n难\n近\n矿\n千\n周\n委\n素\n技\n备\n半\n办\n青\n省\n列\n习\n响\n约\n支\n般\n史\n感\n劳\n便\n团\n往\n酸\n历\n市\n克\n何\n除\n消\n构\n府\n称\n太\n准\n精\n值\n号\n率\n族\n维\n划\n选\n标\n写\n存\n候\n毛\n亲\n快\n效\n斯\n院\n查\n江\n型\n眼\n王\n按\n格\n养\n易\n置\n派\n层\n片\n始\n却\n专\n状\n育\n厂\n京\n识\n适\n属\n圆\n包\n火\n住\n调\n满\n县\n局\n照\n参\n红\n细\n引\n听\n该\n铁\n价\n严\n首\n底\n液\n官\n德\n随\n病\n苏\n失\n尔\n死\n讲\n配\n女\n黄\n推\n显\n谈\n罪\n神\n艺\n呢\n席\n含\n企\n望\n密\n批\n营\n项\n防\n举\n球\n英\n氧\n势\n告\n李\n台\n落\n木\n帮\n轮\n破\n亚\n师\n围\n注\n远\n字\n材\n排\n供\n河\n态\n封\n另\n施\n减\n树\n溶\n怎\n止\n案\n言\n士\n均\n武\n固\n叶\n鱼\n波\n视\n仅\n费\n紧\n爱\n左\n章\n早\n朝\n害\n续\n轻\n服\n试\n食\n充\n兵\n源\n判\n护\n司\n足\n某\n练\n差\n致\n板\n田\n降\n黑\n犯\n负\n击\n范\n继\n兴\n似\n余\n坚\n曲\n输\n修\n故\n城\n夫\n够\n送\n笔\n船\n占\n右\n财\n吃\n富\n春\n职\n觉\n汉\n画\n功\n巴\n跟\n虽\n杂\n飞\n检\n吸\n助\n升\n阳\n互\n初\n创\n抗\n考\n投\n坏\n策\n古\n径\n换\n未\n跑\n留\n钢\n曾\n端\n责\n站\n简\n述\n钱\n副\n尽\n帝\n射\n草\n冲\n承\n独\n令\n限\n阿\n宣\n环\n双\n请\n超\n微\n让\n控\n州\n良\n轴\n找\n否\n纪\n益\n依\n优\n顶\n础\n载\n倒\n房\n突\n坐\n粉\n敌\n略\n客\n袁\n冷\n胜\n绝\n析\n块\n剂\n测\n丝\n协\n诉\n念\n陈\n仍\n罗\n盐\n友\n洋\n错\n苦\n夜\n刑\n移\n频\n逐\n靠\n混\n母\n短\n皮\n终\n聚\n汽\n村\n云\n哪\n既\n距\n卫\n停\n烈\n央\n察\n烧\n迅\n境\n若\n印\n洲\n刻\n括\n激\n孔\n搞\n甚\n室\n待\n核\n校\n散\n侵\n吧\n甲\n游\n久\n菜\n味\n旧\n模\n湖\n货\n损\n预\n阻\n毫\n普\n稳\n乙\n妈\n植\n息\n扩\n银\n语\n挥\n酒\n守\n拿\n序\n纸\n医\n缺\n雨\n吗\n针\n刘\n啊\n急\n唱\n误\n训\n愿\n审\n附\n获\n茶\n鲜\n粮\n斤\n孩\n脱\n硫\n肥\n善\n龙\n演\n父\n渐\n血\n欢\n械\n掌\n歌\n沙\n刚\n攻\n谓\n盾\n讨\n晚\n粒\n乱\n燃\n矛\n乎\n杀\n药\n宁\n鲁\n贵\n钟\n煤\n读\n班\n伯\n香\n介\n迫\n句\n丰\n培\n握\n兰\n担\n弦\n蛋\n沉\n假\n穿\n执\n答\n乐\n谁\n顺\n烟\n缩\n征\n脸\n喜\n松\n脚\n困\n异\n免\n背\n星\n福\n买\n染\n井\n概\n慢\n怕\n磁\n倍\n祖\n皇\n促\n静\n补\n评\n翻\n肉\n践\n尼\n衣\n宽\n扬\n棉\n希\n伤\n操\n垂\n秋\n宜\n氢\n套\n督\n振\n架\n亮\n末\n宪\n庆\n编\n牛\n触\n映\n雷\n销\n诗\n座\n居\n抓\n裂\n胞\n呼\n娘\n景\n威\n绿\n晶\n厚\n盟\n衡\n鸡\n孙\n延\n危\n胶\n屋\n乡\n临\n陆\n顾\n掉\n呀\n灯\n岁\n措\n束\n耐\n剧\n玉\n赵\n跳\n哥\n季\n课\n凯\n胡\n额\n款\n绍\n卷\n齐\n伟\n蒸\n殖\n永\n宗\n苗\n川\n炉\n岩\n弱\n零\n杨\n奏\n沿\n露\n杆\n探\n滑\n镇\n饭\n浓\n航\n怀\n赶\n库\n夺\n伊\n灵\n税\n途\n灭\n赛\n归\n召\n鼓\n播\n盘\n裁\n险\n康\n唯\n录\n菌\n纯\n借\n糖\n盖\n横\n符\n私\n努\n堂\n域\n枪\n润\n幅\n哈\n竟\n熟\n虫\n泽\n脑\n壤\n碳\n欧\n遍\n侧\n寨\n敢\n彻\n虑\n斜\n薄\n庭\n纳\n弹\n饲\n伸\n折\n麦\n湿\n暗\n荷\n瓦\n塞\n床\n筑\n恶\n户\n访\n塔\n奇\n透\n梁\n刀\n旋\n迹\n卡\n氯\n遇\n份\n毒\n泥\n退\n洗\n摆\n灰\n彩\n卖\n耗\n夏\n择\n忙\n铜\n献\n硬\n予\n繁\n圈\n雪\n函\n亦\n抽\n篇\n阵\n阴\n丁\n尺\n追\n堆\n雄\n迎\n泛\n爸\n楼\n避\n谋\n吨\n野\n猪\n旗\n累\n偏\n典\n馆\n索\n秦\n脂\n潮\n爷\n豆\n忽\n托\n惊\n塑\n遗\n愈\n朱\n替\n纤\n粗\n倾\n尚\n痛\n楚\n谢\n奋\n购\n磨\n君\n池\n旁\n碎\n骨\n监\n捕\n弟\n暴\n割\n贯\n殊\n释\n词\n亡\n壁\n顿\n宝\n午\n尘\n闻\n揭\n炮\n残\n冬\n桥\n妇\n警\n综\n招\n吴\n付\n浮\n遭\n徐\n您\n摇\n谷\n赞\n箱\n隔\n订\n男\n吹\n园\n纷\n唐\n败\n宋\n玻\n巨\n耕\n坦\n荣\n闭\n湾\n键\n凡\n驻\n锅\n救\n恩\n剥\n凝\n碱\n齿\n截\n炼\n麻\n纺\n禁\n废\n盛\n版\n缓\n净\n睛\n昌\n婚\n涉\n筒\n嘴\n插\n岸\n朗\n庄\n街\n藏\n姑\n贸\n腐\n奴\n啦\n惯\n乘\n伙\n恢\n匀\n纱\n扎\n辩\n耳\n彪\n臣\n亿\n璃\n抵\n脉\n秀\n萨\n俄\n网\n舞\n店\n喷\n纵\n寸\n汗\n挂\n洪\n贺\n闪\n柬\n爆\n烯\n津\n稻\n墙\n软\n勇\n像\n滚\n厘\n蒙\n芳\n肯\n坡\n柱\n荡\n腿\n仪\n旅\n尾\n轧\n冰\n贡\n登\n黎\n削\n钻\n勒\n逃\n障\n氨\n郭\n峰\n币\n港\n伏\n轨\n亩\n毕\n擦\n莫\n刺\n浪\n秘\n援\n株\n健\n售\n股\n岛\n甘\n泡\n睡\n童\n铸\n汤\n阀\n休\n汇\n舍\n牧\n绕\n炸\n哲\n磷\n绩\n朋\n淡\n尖\n启\n陷\n柴\n呈\n徒\n颜\n泪\n稍\n忘\n泵\n蓝\n拖\n洞\n授\n镜\n辛\n壮\n锋\n贫\n虚\n弯\n摩\n泰\n幼\n廷\n尊\n窗\n纲\n弄\n隶\n疑\n氏\n宫\n姐\n震\n瑞\n怪\n尤\n琴\n循\n描\n膜\n违\n夹\n腰\n缘\n珠\n穷\n森\n枝\n竹\n沟\n催\n绳\n忆\n邦\n剩\n幸\n浆\n栏\n拥\n牙\n贮\n礼\n滤\n钠\n纹\n罢\n拍\n咱\n喊\n袖\n埃\n勤\n罚\n焦\n潜\n伍\n墨\n欲\n缝\n姓\n刊\n饱\n仿\n奖\n铝\n鬼\n丽\n跨\n默\n挖\n链\n扫\n喝\n袋\n炭\n污\n幕\n诸\n弧\n励\n梅\n奶\n洁\n灾\n舟\n鉴\n苯\n讼\n抱\n毁\n懂\n寒\n智\n埔\n寄\n届\n跃\n渡\n挑\n丹\n艰\n贝\n碰\n拔\n爹\n戴\n码\n梦\n芽\n熔\n赤\n渔\n哭\n敬\n颗\n奔\n铅\n仲\n虎\n稀\n妹\n乏\n珍\n申\n桌\n遵\n允\n隆\n螺\n仓\n魏\n锐\n晓\n氮\n兼\n隐\n碍\n赫\n拨\n忠\n肃\n缸\n牵\n抢\n博\n巧\n壳\n兄\n杜\n讯\n诚\n碧\n祥\n柯\n页\n巡\n矩\n悲\n灌\n龄\n伦\n票\n寻\n桂\n铺\n圣\n恐\n恰\n郑\n趣\n抬\n荒\n腾\n贴\n柔\n滴\n猛\n阔\n辆\n妻\n填\n撤\n储\n签\n闹\n扰\n紫\n砂\n递\n戏\n吊\n陶\n伐\n喂\n疗\n瓶\n婆\n抚\n臂\n摸\n忍\n虾\n蜡\n邻\n胸\n巩\n挤\n偶\n弃\n槽\n劲\n乳\n邓\n吉\n仁\n烂\n砖\n租\n乌\n舰\n伴\n瓜\n浅\n丙\n暂\n燥\n橡\n柳\n迷\n暖\n牌\n秧\n胆\n详\n簧\n踏\n瓷\n谱\n呆\n宾\n糊\n洛\n辉\n愤\n竞\n隙\n怒\n粘\n乃\n绪\n肩\n籍\n敏\n涂\n熙\n皆\n侦\n悬\n掘\n享\n纠\n醒\n狂\n锁\n淀\n恨\n牲\n霸\n爬\n赏\n逆\n玩\n陵\n祝\n秒\n浙\n貌\n役\n彼\n悉\n鸭\n趋\n凤\n晨\n畜\n辈\n秩\n卵\n署\n梯\n炎\n滩\n棋\n驱\n筛\n峡\n冒\n啥\n寿\n译\n浸\n泉\n帽\n迟\n硅\n疆\n贷\n漏\n稿\n冠\n嫩\n胁\n芯\n牢\n叛\n蚀\n奥\n鸣\n岭\n羊\n凭\n串\n塘\n绘\n酵\n融\n盆\n锡\n庙\n筹\n冻\n辅\n摄\n袭\n筋\n拒\n僚\n旱\n钾\n鸟\n漆\n沈\n眉\n疏\n添\n棒\n穗\n硝\n韩\n逼\n扭\n侨\n凉\n挺\n碗\n栽\n炒\n杯\n患\n馏\n劝\n豪\n辽\n勃\n鸿\n旦\n吏\n拜\n狗\n埋\n辊\n掩\n饮\n搬\n骂\n辞\n勾\n扣\n估\n蒋\n绒\n雾\n丈\n朵\n姆\n拟\n宇\n辑\n陕\n雕\n偿\n蓄\n崇\n剪\n倡\n厅\n咬\n驶\n薯\n刷\n斥\n番\n赋\n奉\n佛\n浇\n漫\n曼\n扇\n钙\n桃\n扶\n仔\n返\n俗\n亏\n腔\n鞋\n棱\n覆\n框\n悄\n叔\n撞\n骗\n勘\n旺\n沸\n孤\n吐\n孟\n渠\n屈\n疾\n妙\n惜\n仰\n狠\n胀\n谐\n抛\n霉\n桑\n岗\n嘛\n衰\n盗\n渗\n脏\n赖\n涌\n甜\n曹\n阅\n肌\n哩\n厉\n烃\n纬\n毅\n昨\n伪\n症\n煮\n叹\n钉\n搭\n茎\n笼\n酷\n偷\n弓\n锥\n恒\n杰\n坑\n鼻\n翼\n纶\n叙\n狱\n逮\n罐\n络\n棚\n抑\n膨\n蔬\n寺\n骤\n穆\n冶\n枯\n册\n尸\n凸\n绅\n坯\n牺\n焰\n轰\n欣\n晋\n瘦\n御\n锭\n锦\n丧\n旬\n锻\n垄\n搜\n扑\n邀\n亭\n酯\n迈\n舒\n脆\n酶\n闲\n忧\n酚\n顽\n羽\n涨\n卸\n仗\n陪\n辟\n惩\n杭\n姚\n肚\n捉\n飘\n漂\n昆\n欺\n吾\n郎\n烷\n汁\n呵\n饰\n萧\n雅\n邮\n迁\n燕\n撒\n姻\n赴\n宴\n烦\n债\n帐\n斑\n铃\n旨\n醇\n董\n饼\n雏\n姿\n拌\n傅\n腹\n妥\n揉\n贤\n拆\n歪\n葡\n胺\n丢\n浩\n徽\n昂\n垫\n挡\n览\n贪\n慰\n缴\n汪\n慌\n冯\n诺\n姜\n谊\n凶\n劣\n诬\n耀\n昏\n躺\n盈\n骑\n乔\n溪\n丛\n卢\n抹\n闷\n咨\n刮\n驾\n缆\n悟\n摘\n铒\n掷\n颇\n幻\n柄\n惠\n惨\n佳\n仇\n腊\n窝\n涤\n剑\n瞧\n堡\n泼\n葱\n罩\n霍\n捞\n胎\n苍\n滨\n俩\n捅\n湘\n砍\n霞\n邵\n萄\n疯\n淮\n遂\n熊\n粪\n烘\n宿\n档\n戈\n驳\n嫂\n裕\n徙\n箭\n捐\n肠\n撑\n晒\n辨\n殿\n莲\n摊\n搅\n酱\n屏\n疫\n哀\n蔡\n堵\n沫\n皱\n畅\n叠\n阁\n莱\n敲\n辖\n钩\n痕\n坝\n巷\n饿\n祸\n丘\n玄\n溜\n曰\n逻\n彭\n尝\n卿\n妨\n艇\n吞\n韦\n怨\n矮\n歇\n`\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/chinese_traditional.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt\n\t// $ crc32 chinese_traditional.txt\n\t// 3c20b443\n\tchecksum := crc32.ChecksumIEEE([]byte(chineseTraditional))\n\tif fmt.Sprintf(\"%x\", checksum) != \"3c20b443\" {\n\t\tpanic(\"chineseTraditional checksum invalid\")\n\t}\n}\n\n// ChineseTraditional is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/chinese_traditional.txt\nvar ChineseTraditional = strings.Split(strings.TrimSpace(chineseTraditional), \"\\n\")\nvar chineseTraditional = `的\n一\n是\n在\n不\n了\n有\n和\n人\n這\n中\n大\n為\n上\n個\n國\n我\n以\n要\n他\n時\n來\n用\n們\n生\n到\n作\n地\n於\n出\n就\n分\n對\n成\n會\n可\n主\n發\n年\n動\n同\n工\n也\n能\n下\n過\n子\n說\n產\n種\n面\n而\n方\n後\n多\n定\n行\n學\n法\n所\n民\n得\n經\n十\n三\n之\n進\n著\n等\n部\n度\n家\n電\n力\n裡\n如\n水\n化\n高\n自\n二\n理\n起\n小\n物\n現\n實\n加\n量\n都\n兩\n體\n制\n機\n當\n使\n點\n從\n業\n本\n去\n把\n性\n好\n應\n開\n它\n合\n還\n因\n由\n其\n些\n然\n前\n外\n天\n政\n四\n日\n那\n社\n義\n事\n平\n形\n相\n全\n表\n間\n樣\n與\n關\n各\n重\n新\n線\n內\n數\n正\n心\n反\n你\n明\n看\n原\n又\n麼\n利\n比\n或\n但\n質\n氣\n第\n向\n道\n命\n此\n變\n條\n只\n沒\n結\n解\n問\n意\n建\n月\n公\n無\n系\n軍\n很\n情\n者\n最\n立\n代\n想\n已\n通\n並\n提\n直\n題\n黨\n程\n展\n五\n果\n料\n象\n員\n革\n位\n入\n常\n文\n總\n次\n品\n式\n活\n設\n及\n管\n特\n件\n長\n求\n老\n頭\n基\n資\n邊\n流\n路\n級\n少\n圖\n山\n統\n接\n知\n較\n將\n組\n見\n計\n別\n她\n手\n角\n期\n根\n論\n運\n農\n指\n幾\n九\n區\n強\n放\n決\n西\n被\n幹\n做\n必\n戰\n先\n回\n則\n任\n取\n據\n處\n隊\n南\n給\n色\n光\n門\n即\n保\n治\n北\n造\n百\n規\n熱\n領\n七\n海\n口\n東\n導\n器\n壓\n志\n世\n金\n增\n爭\n濟\n階\n油\n思\n術\n極\n交\n受\n聯\n什\n認\n六\n共\n權\n收\n證\n改\n清\n美\n再\n採\n轉\n更\n單\n風\n切\n打\n白\n教\n速\n花\n帶\n安\n場\n身\n車\n例\n真\n務\n具\n萬\n每\n目\n至\n達\n走\n積\n示\n議\n聲\n報\n鬥\n完\n類\n八\n離\n華\n名\n確\n才\n科\n張\n信\n馬\n節\n話\n米\n整\n空\n元\n況\n今\n集\n溫\n傳\n土\n許\n步\n群\n廣\n石\n記\n需\n段\n研\n界\n拉\n林\n律\n叫\n且\n究\n觀\n越\n織\n裝\n影\n算\n低\n持\n音\n眾\n書\n布\n复\n容\n兒\n須\n際\n商\n非\n驗\n連\n斷\n深\n難\n近\n礦\n千\n週\n委\n素\n技\n備\n半\n辦\n青\n省\n列\n習\n響\n約\n支\n般\n史\n感\n勞\n便\n團\n往\n酸\n歷\n市\n克\n何\n除\n消\n構\n府\n稱\n太\n準\n精\n值\n號\n率\n族\n維\n劃\n選\n標\n寫\n存\n候\n毛\n親\n快\n效\n斯\n院\n查\n江\n型\n眼\n王\n按\n格\n養\n易\n置\n派\n層\n片\n始\n卻\n專\n狀\n育\n廠\n京\n識\n適\n屬\n圓\n包\n火\n住\n調\n滿\n縣\n局\n照\n參\n紅\n細\n引\n聽\n該\n鐵\n價\n嚴\n首\n底\n液\n官\n德\n隨\n病\n蘇\n失\n爾\n死\n講\n配\n女\n黃\n推\n顯\n談\n罪\n神\n藝\n呢\n席\n含\n企\n望\n密\n批\n營\n項\n防\n舉\n球\n英\n氧\n勢\n告\n李\n台\n落\n木\n幫\n輪\n破\n亞\n師\n圍\n注\n遠\n字\n材\n排\n供\n河\n態\n封\n另\n施\n減\n樹\n溶\n怎\n止\n案\n言\n士\n均\n武\n固\n葉\n魚\n波\n視\n僅\n費\n緊\n愛\n左\n章\n早\n朝\n害\n續\n輕\n服\n試\n食\n充\n兵\n源\n判\n護\n司\n足\n某\n練\n差\n致\n板\n田\n降\n黑\n犯\n負\n擊\n范\n繼\n興\n似\n餘\n堅\n曲\n輸\n修\n故\n城\n夫\n夠\n送\n筆\n船\n佔\n右\n財\n吃\n富\n春\n職\n覺\n漢\n畫\n功\n巴\n跟\n雖\n雜\n飛\n檢\n吸\n助\n昇\n陽\n互\n初\n創\n抗\n考\n投\n壞\n策\n古\n徑\n換\n未\n跑\n留\n鋼\n曾\n端\n責\n站\n簡\n述\n錢\n副\n盡\n帝\n射\n草\n衝\n承\n獨\n令\n限\n阿\n宣\n環\n雙\n請\n超\n微\n讓\n控\n州\n良\n軸\n找\n否\n紀\n益\n依\n優\n頂\n礎\n載\n倒\n房\n突\n坐\n粉\n敵\n略\n客\n袁\n冷\n勝\n絕\n析\n塊\n劑\n測\n絲\n協\n訴\n念\n陳\n仍\n羅\n鹽\n友\n洋\n錯\n苦\n夜\n刑\n移\n頻\n逐\n靠\n混\n母\n短\n皮\n終\n聚\n汽\n村\n雲\n哪\n既\n距\n衛\n停\n烈\n央\n察\n燒\n迅\n境\n若\n印\n洲\n刻\n括\n激\n孔\n搞\n甚\n室\n待\n核\n校\n散\n侵\n吧\n甲\n遊\n久\n菜\n味\n舊\n模\n湖\n貨\n損\n預\n阻\n毫\n普\n穩\n乙\n媽\n植\n息\n擴\n銀\n語\n揮\n酒\n守\n拿\n序\n紙\n醫\n缺\n雨\n嗎\n針\n劉\n啊\n急\n唱\n誤\n訓\n願\n審\n附\n獲\n茶\n鮮\n糧\n斤\n孩\n脫\n硫\n肥\n善\n龍\n演\n父\n漸\n血\n歡\n械\n掌\n歌\n沙\n剛\n攻\n謂\n盾\n討\n晚\n粒\n亂\n燃\n矛\n乎\n殺\n藥\n寧\n魯\n貴\n鐘\n煤\n讀\n班\n伯\n香\n介\n迫\n句\n豐\n培\n握\n蘭\n擔\n弦\n蛋\n沉\n假\n穿\n執\n答\n樂\n誰\n順\n煙\n縮\n徵\n臉\n喜\n松\n腳\n困\n異\n免\n背\n星\n福\n買\n染\n井\n概\n慢\n怕\n磁\n倍\n祖\n皇\n促\n靜\n補\n評\n翻\n肉\n踐\n尼\n衣\n寬\n揚\n棉\n希\n傷\n操\n垂\n秋\n宜\n氫\n套\n督\n振\n架\n亮\n末\n憲\n慶\n編\n牛\n觸\n映\n雷\n銷\n詩\n座\n居\n抓\n裂\n胞\n呼\n娘\n景\n威\n綠\n晶\n厚\n盟\n衡\n雞\n孫\n延\n危\n膠\n屋\n鄉\n臨\n陸\n顧\n掉\n呀\n燈\n歲\n措\n束\n耐\n劇\n玉\n趙\n跳\n哥\n季\n課\n凱\n胡\n額\n款\n紹\n卷\n齊\n偉\n蒸\n殖\n永\n宗\n苗\n川\n爐\n岩\n弱\n零\n楊\n奏\n沿\n露\n桿\n探\n滑\n鎮\n飯\n濃\n航\n懷\n趕\n庫\n奪\n伊\n靈\n稅\n途\n滅\n賽\n歸\n召\n鼓\n播\n盤\n裁\n險\n康\n唯\n錄\n菌\n純\n借\n糖\n蓋\n橫\n符\n私\n努\n堂\n域\n槍\n潤\n幅\n哈\n竟\n熟\n蟲\n澤\n腦\n壤\n碳\n歐\n遍\n側\n寨\n敢\n徹\n慮\n斜\n薄\n庭\n納\n彈\n飼\n伸\n折\n麥\n濕\n暗\n荷\n瓦\n塞\n床\n築\n惡\n戶\n訪\n塔\n奇\n透\n梁\n刀\n旋\n跡\n卡\n氯\n遇\n份\n毒\n泥\n退\n洗\n擺\n灰\n彩\n賣\n耗\n夏\n擇\n忙\n銅\n獻\n硬\n予\n繁\n圈\n雪\n函\n亦\n抽\n篇\n陣\n陰\n丁\n尺\n追\n堆\n雄\n迎\n泛\n爸\n樓\n避\n謀\n噸\n野\n豬\n旗\n累\n偏\n典\n館\n索\n秦\n脂\n潮\n爺\n豆\n忽\n托\n驚\n塑\n遺\n愈\n朱\n替\n纖\n粗\n傾\n尚\n痛\n楚\n謝\n奮\n購\n磨\n君\n池\n旁\n碎\n骨\n監\n捕\n弟\n暴\n割\n貫\n殊\n釋\n詞\n亡\n壁\n頓\n寶\n午\n塵\n聞\n揭\n炮\n殘\n冬\n橋\n婦\n警\n綜\n招\n吳\n付\n浮\n遭\n徐\n您\n搖\n谷\n贊\n箱\n隔\n訂\n男\n吹\n園\n紛\n唐\n敗\n宋\n玻\n巨\n耕\n坦\n榮\n閉\n灣\n鍵\n凡\n駐\n鍋\n救\n恩\n剝\n凝\n鹼\n齒\n截\n煉\n麻\n紡\n禁\n廢\n盛\n版\n緩\n淨\n睛\n昌\n婚\n涉\n筒\n嘴\n插\n岸\n朗\n莊\n街\n藏\n姑\n貿\n腐\n奴\n啦\n慣\n乘\n夥\n恢\n勻\n紗\n扎\n辯\n耳\n彪\n臣\n億\n璃\n抵\n脈\n秀\n薩\n俄\n網\n舞\n店\n噴\n縱\n寸\n汗\n掛\n洪\n賀\n閃\n柬\n爆\n烯\n津\n稻\n牆\n軟\n勇\n像\n滾\n厘\n蒙\n芳\n肯\n坡\n柱\n盪\n腿\n儀\n旅\n尾\n軋\n冰\n貢\n登\n黎\n削\n鑽\n勒\n逃\n障\n氨\n郭\n峰\n幣\n港\n伏\n軌\n畝\n畢\n擦\n莫\n刺\n浪\n秘\n援\n株\n健\n售\n股\n島\n甘\n泡\n睡\n童\n鑄\n湯\n閥\n休\n匯\n舍\n牧\n繞\n炸\n哲\n磷\n績\n朋\n淡\n尖\n啟\n陷\n柴\n呈\n徒\n顏\n淚\n稍\n忘\n泵\n藍\n拖\n洞\n授\n鏡\n辛\n壯\n鋒\n貧\n虛\n彎\n摩\n泰\n幼\n廷\n尊\n窗\n綱\n弄\n隸\n疑\n氏\n宮\n姐\n震\n瑞\n怪\n尤\n琴\n循\n描\n膜\n違\n夾\n腰\n緣\n珠\n窮\n森\n枝\n竹\n溝\n催\n繩\n憶\n邦\n剩\n幸\n漿\n欄\n擁\n牙\n貯\n禮\n濾\n鈉\n紋\n罷\n拍\n咱\n喊\n袖\n埃\n勤\n罰\n焦\n潛\n伍\n墨\n欲\n縫\n姓\n刊\n飽\n仿\n獎\n鋁\n鬼\n麗\n跨\n默\n挖\n鏈\n掃\n喝\n袋\n炭\n污\n幕\n諸\n弧\n勵\n梅\n奶\n潔\n災\n舟\n鑑\n苯\n訟\n抱\n毀\n懂\n寒\n智\n埔\n寄\n屆\n躍\n渡\n挑\n丹\n艱\n貝\n碰\n拔\n爹\n戴\n碼\n夢\n芽\n熔\n赤\n漁\n哭\n敬\n顆\n奔\n鉛\n仲\n虎\n稀\n妹\n乏\n珍\n申\n桌\n遵\n允\n隆\n螺\n倉\n魏\n銳\n曉\n氮\n兼\n隱\n礙\n赫\n撥\n忠\n肅\n缸\n牽\n搶\n博\n巧\n殼\n兄\n杜\n訊\n誠\n碧\n祥\n柯\n頁\n巡\n矩\n悲\n灌\n齡\n倫\n票\n尋\n桂\n鋪\n聖\n恐\n恰\n鄭\n趣\n抬\n荒\n騰\n貼\n柔\n滴\n猛\n闊\n輛\n妻\n填\n撤\n儲\n簽\n鬧\n擾\n紫\n砂\n遞\n戲\n吊\n陶\n伐\n餵\n療\n瓶\n婆\n撫\n臂\n摸\n忍\n蝦\n蠟\n鄰\n胸\n鞏\n擠\n偶\n棄\n槽\n勁\n乳\n鄧\n吉\n仁\n爛\n磚\n租\n烏\n艦\n伴\n瓜\n淺\n丙\n暫\n燥\n橡\n柳\n迷\n暖\n牌\n秧\n膽\n詳\n簧\n踏\n瓷\n譜\n呆\n賓\n糊\n洛\n輝\n憤\n競\n隙\n怒\n粘\n乃\n緒\n肩\n籍\n敏\n塗\n熙\n皆\n偵\n懸\n掘\n享\n糾\n醒\n狂\n鎖\n淀\n恨\n牲\n霸\n爬\n賞\n逆\n玩\n陵\n祝\n秒\n浙\n貌\n役\n彼\n悉\n鴨\n趨\n鳳\n晨\n畜\n輩\n秩\n卵\n署\n梯\n炎\n灘\n棋\n驅\n篩\n峽\n冒\n啥\n壽\n譯\n浸\n泉\n帽\n遲\n矽\n疆\n貸\n漏\n稿\n冠\n嫩\n脅\n芯\n牢\n叛\n蝕\n奧\n鳴\n嶺\n羊\n憑\n串\n塘\n繪\n酵\n融\n盆\n錫\n廟\n籌\n凍\n輔\n攝\n襲\n筋\n拒\n僚\n旱\n鉀\n鳥\n漆\n沈\n眉\n疏\n添\n棒\n穗\n硝\n韓\n逼\n扭\n僑\n涼\n挺\n碗\n栽\n炒\n杯\n患\n餾\n勸\n豪\n遼\n勃\n鴻\n旦\n吏\n拜\n狗\n埋\n輥\n掩\n飲\n搬\n罵\n辭\n勾\n扣\n估\n蔣\n絨\n霧\n丈\n朵\n姆\n擬\n宇\n輯\n陝\n雕\n償\n蓄\n崇\n剪\n倡\n廳\n咬\n駛\n薯\n刷\n斥\n番\n賦\n奉\n佛\n澆\n漫\n曼\n扇\n鈣\n桃\n扶\n仔\n返\n俗\n虧\n腔\n鞋\n棱\n覆\n框\n悄\n叔\n撞\n騙\n勘\n旺\n沸\n孤\n吐\n孟\n渠\n屈\n疾\n妙\n惜\n仰\n狠\n脹\n諧\n拋\n黴\n桑\n崗\n嘛\n衰\n盜\n滲\n臟\n賴\n湧\n甜\n曹\n閱\n肌\n哩\n厲\n烴\n緯\n毅\n昨\n偽\n症\n煮\n嘆\n釘\n搭\n莖\n籠\n酷\n偷\n弓\n錐\n恆\n傑\n坑\n鼻\n翼\n綸\n敘\n獄\n逮\n罐\n絡\n棚\n抑\n膨\n蔬\n寺\n驟\n穆\n冶\n枯\n冊\n屍\n凸\n紳\n坯\n犧\n焰\n轟\n欣\n晉\n瘦\n禦\n錠\n錦\n喪\n旬\n鍛\n壟\n搜\n撲\n邀\n亭\n酯\n邁\n舒\n脆\n酶\n閒\n憂\n酚\n頑\n羽\n漲\n卸\n仗\n陪\n闢\n懲\n杭\n姚\n肚\n捉\n飄\n漂\n昆\n欺\n吾\n郎\n烷\n汁\n呵\n飾\n蕭\n雅\n郵\n遷\n燕\n撒\n姻\n赴\n宴\n煩\n債\n帳\n斑\n鈴\n旨\n醇\n董\n餅\n雛\n姿\n拌\n傅\n腹\n妥\n揉\n賢\n拆\n歪\n葡\n胺\n丟\n浩\n徽\n昂\n墊\n擋\n覽\n貪\n慰\n繳\n汪\n慌\n馮\n諾\n姜\n誼\n兇\n劣\n誣\n耀\n昏\n躺\n盈\n騎\n喬\n溪\n叢\n盧\n抹\n悶\n諮\n刮\n駕\n纜\n悟\n摘\n鉺\n擲\n頗\n幻\n柄\n惠\n慘\n佳\n仇\n臘\n窩\n滌\n劍\n瞧\n堡\n潑\n蔥\n罩\n霍\n撈\n胎\n蒼\n濱\n倆\n捅\n湘\n砍\n霞\n邵\n萄\n瘋\n淮\n遂\n熊\n糞\n烘\n宿\n檔\n戈\n駁\n嫂\n裕\n徙\n箭\n捐\n腸\n撐\n曬\n辨\n殿\n蓮\n攤\n攪\n醬\n屏\n疫\n哀\n蔡\n堵\n沫\n皺\n暢\n疊\n閣\n萊\n敲\n轄\n鉤\n痕\n壩\n巷\n餓\n禍\n丘\n玄\n溜\n曰\n邏\n彭\n嘗\n卿\n妨\n艇\n吞\n韋\n怨\n矮\n歇\n`\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/english.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt\n\t// $ crc32 english.txt\n\t// c1dbd296\n\tchecksum := crc32.ChecksumIEEE([]byte(english))\n\tif fmt.Sprintf(\"%x\", checksum) != \"c1dbd296\" {\n\t\tpanic(\"english checksum invalid\")\n\t}\n}\n\n// English is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/english.txt\nvar English = strings.Split(strings.TrimSpace(english), \"\\n\")\nvar english = `abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo\n`\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/french.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt\n\t// $ crc32 french.txt\n\t// 3e56b216\n\tchecksum := crc32.ChecksumIEEE([]byte(french))\n\tif fmt.Sprintf(\"%x\", checksum) != \"3e56b216\" {\n\t\tpanic(\"french checksum invalid\")\n\t}\n}\n\n// French is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/french.txt\nvar French = strings.Split(strings.TrimSpace(french), \"\\n\")\nvar french = `abaisser\nabandon\nabdiquer\nabeille\nabolir\naborder\naboutir\naboyer\nabrasif\nabreuver\nabriter\nabroger\nabrupt\nabsence\nabsolu\nabsurde\nabusif\nabyssal\nacadémie\nacajou\nacarien\naccabler\naccepter\nacclamer\naccolade\naccroche\naccuser\nacerbe\nachat\nacheter\naciduler\nacier\nacompte\nacquérir\nacronyme\nacteur\nactif\nactuel\nadepte\nadéquat\nadhésif\nadjectif\nadjuger\nadmettre\nadmirer\nadopter\nadorer\nadoucir\nadresse\nadroit\nadulte\nadverbe\naérer\naéronef\naffaire\naffecter\naffiche\naffreux\naffubler\nagacer\nagencer\nagile\nagiter\nagrafer\nagréable\nagrume\naider\naiguille\nailier\naimable\naisance\najouter\najuster\nalarmer\nalchimie\nalerte\nalgèbre\nalgue\naliéner\naliment\nalléger\nalliage\nallouer\nallumer\nalourdir\nalpaga\naltesse\nalvéole\namateur\nambigu\nambre\naménager\namertume\namidon\namiral\namorcer\namour\namovible\namphibie\nampleur\namusant\nanalyse\nanaphore\nanarchie\nanatomie\nancien\nanéantir\nangle\nangoisse\nanguleux\nanimal\nannexer\nannonce\nannuel\nanodin\nanomalie\nanonyme\nanormal\nantenne\nantidote\nanxieux\napaiser\napéritif\naplanir\napologie\nappareil\nappeler\napporter\nappuyer\naquarium\naqueduc\narbitre\narbuste\nardeur\nardoise\nargent\narlequin\narmature\narmement\narmoire\narmure\narpenter\narracher\narriver\narroser\narsenic\nartériel\narticle\naspect\nasphalte\naspirer\nassaut\nasservir\nassiette\nassocier\nassurer\nasticot\nastre\nastuce\natelier\natome\natrium\natroce\nattaque\nattentif\nattirer\nattraper\naubaine\nauberge\naudace\naudible\naugurer\naurore\nautomne\nautruche\navaler\navancer\navarice\navenir\naverse\naveugle\naviateur\navide\navion\naviser\navoine\navouer\navril\naxial\naxiome\nbadge\nbafouer\nbagage\nbaguette\nbaignade\nbalancer\nbalcon\nbaleine\nbalisage\nbambin\nbancaire\nbandage\nbanlieue\nbannière\nbanquier\nbarbier\nbaril\nbaron\nbarque\nbarrage\nbassin\nbastion\nbataille\nbateau\nbatterie\nbaudrier\nbavarder\nbelette\nbélier\nbelote\nbénéfice\nberceau\nberger\nberline\nbermuda\nbesace\nbesogne\nbétail\nbeurre\nbiberon\nbicycle\nbidule\nbijou\nbilan\nbilingue\nbillard\nbinaire\nbiologie\nbiopsie\nbiotype\nbiscuit\nbison\nbistouri\nbitume\nbizarre\nblafard\nblague\nblanchir\nblessant\nblinder\nblond\nbloquer\nblouson\nbobard\nbobine\nboire\nboiser\nbolide\nbonbon\nbondir\nbonheur\nbonifier\nbonus\nbordure\nborne\nbotte\nboucle\nboueux\nbougie\nboulon\nbouquin\nbourse\nboussole\nboutique\nboxeur\nbranche\nbrasier\nbrave\nbrebis\nbrèche\nbreuvage\nbricoler\nbrigade\nbrillant\nbrioche\nbrique\nbrochure\nbroder\nbronzer\nbrousse\nbroyeur\nbrume\nbrusque\nbrutal\nbruyant\nbuffle\nbuisson\nbulletin\nbureau\nburin\nbustier\nbutiner\nbutoir\nbuvable\nbuvette\ncabanon\ncabine\ncachette\ncadeau\ncadre\ncaféine\ncaillou\ncaisson\ncalculer\ncalepin\ncalibre\ncalmer\ncalomnie\ncalvaire\ncamarade\ncaméra\ncamion\ncampagne\ncanal\ncaneton\ncanon\ncantine\ncanular\ncapable\ncaporal\ncaprice\ncapsule\ncapter\ncapuche\ncarabine\ncarbone\ncaresser\ncaribou\ncarnage\ncarotte\ncarreau\ncarton\ncascade\ncasier\ncasque\ncassure\ncauser\ncaution\ncavalier\ncaverne\ncaviar\ncédille\nceinture\ncéleste\ncellule\ncendrier\ncensurer\ncentral\ncercle\ncérébral\ncerise\ncerner\ncerveau\ncesser\nchagrin\nchaise\nchaleur\nchambre\nchance\nchapitre\ncharbon\nchasseur\nchaton\nchausson\nchavirer\nchemise\nchenille\nchéquier\nchercher\ncheval\nchien\nchiffre\nchignon\nchimère\nchiot\nchlorure\nchocolat\nchoisir\nchose\nchouette\nchrome\nchute\ncigare\ncigogne\ncimenter\ncinéma\ncintrer\ncirculer\ncirer\ncirque\nciterne\ncitoyen\ncitron\ncivil\nclairon\nclameur\nclaquer\nclasse\nclavier\nclient\ncligner\nclimat\nclivage\ncloche\nclonage\ncloporte\ncobalt\ncobra\ncocasse\ncocotier\ncoder\ncodifier\ncoffre\ncogner\ncohésion\ncoiffer\ncoincer\ncolère\ncolibri\ncolline\ncolmater\ncolonel\ncombat\ncomédie\ncommande\ncompact\nconcert\nconduire\nconfier\ncongeler\nconnoter\nconsonne\ncontact\nconvexe\ncopain\ncopie\ncorail\ncorbeau\ncordage\ncorniche\ncorpus\ncorrect\ncortège\ncosmique\ncostume\ncoton\ncoude\ncoupure\ncourage\ncouteau\ncouvrir\ncoyote\ncrabe\ncrainte\ncravate\ncrayon\ncréature\ncréditer\ncrémeux\ncreuser\ncrevette\ncribler\ncrier\ncristal\ncritère\ncroire\ncroquer\ncrotale\ncrucial\ncruel\ncrypter\ncubique\ncueillir\ncuillère\ncuisine\ncuivre\nculminer\ncultiver\ncumuler\ncupide\ncuratif\ncurseur\ncyanure\ncycle\ncylindre\ncynique\ndaigner\ndamier\ndanger\ndanseur\ndauphin\ndébattre\ndébiter\ndéborder\ndébrider\ndébutant\ndécaler\ndécembre\ndéchirer\ndécider\ndéclarer\ndécorer\ndécrire\ndécupler\ndédale\ndéductif\ndéesse\ndéfensif\ndéfiler\ndéfrayer\ndégager\ndégivrer\ndéglutir\ndégrafer\ndéjeuner\ndélice\ndéloger\ndemander\ndemeurer\ndémolir\ndénicher\ndénouer\ndentelle\ndénuder\ndépart\ndépenser\ndéphaser\ndéplacer\ndéposer\ndéranger\ndérober\ndésastre\ndescente\ndésert\ndésigner\ndésobéir\ndessiner\ndestrier\ndétacher\ndétester\ndétourer\ndétresse\ndevancer\ndevenir\ndeviner\ndevoir\ndiable\ndialogue\ndiamant\ndicter\ndifférer\ndigérer\ndigital\ndigne\ndiluer\ndimanche\ndiminuer\ndioxyde\ndirectif\ndiriger\ndiscuter\ndisposer\ndissiper\ndistance\ndivertir\ndiviser\ndocile\ndocteur\ndogme\ndoigt\ndomaine\ndomicile\ndompter\ndonateur\ndonjon\ndonner\ndopamine\ndortoir\ndorure\ndosage\ndoseur\ndossier\ndotation\ndouanier\ndouble\ndouceur\ndouter\ndoyen\ndragon\ndraper\ndresser\ndribbler\ndroiture\nduperie\nduplexe\ndurable\ndurcir\ndynastie\néblouir\nécarter\nécharpe\néchelle\néclairer\néclipse\néclore\nécluse\nécole\néconomie\nécorce\nécouter\nécraser\nécrémer\nécrivain\nécrou\nécume\nécureuil\nédifier\néduquer\neffacer\neffectif\neffigie\neffort\neffrayer\neffusion\négaliser\négarer\néjecter\nélaborer\nélargir\nélectron\nélégant\néléphant\nélève\néligible\nélitisme\néloge\nélucider\néluder\nemballer\nembellir\nembryon\némeraude\némission\nemmener\némotion\némouvoir\nempereur\nemployer\nemporter\nemprise\némulsion\nencadrer\nenchère\nenclave\nencoche\nendiguer\nendosser\nendroit\nenduire\nénergie\nenfance\nenfermer\nenfouir\nengager\nengin\nenglober\nénigme\nenjamber\nenjeu\nenlever\nennemi\nennuyeux\nenrichir\nenrobage\nenseigne\nentasser\nentendre\nentier\nentourer\nentraver\nénumérer\nenvahir\nenviable\nenvoyer\nenzyme\néolien\népaissir\népargne\népatant\népaule\népicerie\népidémie\népier\népilogue\népine\népisode\népitaphe\népoque\népreuve\néprouver\népuisant\néquerre\néquipe\nériger\nérosion\nerreur\néruption\nescalier\nespadon\nespèce\nespiègle\nespoir\nesprit\nesquiver\nessayer\nessence\nessieu\nessorer\nestime\nestomac\nestrade\nétagère\nétaler\nétanche\nétatique\néteindre\nétendoir\néternel\néthanol\néthique\nethnie\nétirer\nétoffer\nétoile\nétonnant\nétourdir\nétrange\nétroit\nétude\neuphorie\névaluer\névasion\néventail\névidence\néviter\névolutif\névoquer\nexact\nexagérer\nexaucer\nexceller\nexcitant\nexclusif\nexcuse\nexécuter\nexemple\nexercer\nexhaler\nexhorter\nexigence\nexiler\nexister\nexotique\nexpédier\nexplorer\nexposer\nexprimer\nexquis\nextensif\nextraire\nexulter\nfable\nfabuleux\nfacette\nfacile\nfacture\nfaiblir\nfalaise\nfameux\nfamille\nfarceur\nfarfelu\nfarine\nfarouche\nfasciner\nfatal\nfatigue\nfaucon\nfautif\nfaveur\nfavori\nfébrile\nféconder\nfédérer\nfélin\nfemme\nfémur\nfendoir\nféodal\nfermer\nféroce\nferveur\nfestival\nfeuille\nfeutre\nfévrier\nfiasco\nficeler\nfictif\nfidèle\nfigure\nfilature\nfiletage\nfilière\nfilleul\nfilmer\nfilou\nfiltrer\nfinancer\nfinir\nfiole\nfirme\nfissure\nfixer\nflairer\nflamme\nflasque\nflatteur\nfléau\nflèche\nfleur\nflexion\nflocon\nflore\nfluctuer\nfluide\nfluvial\nfolie\nfonderie\nfongible\nfontaine\nforcer\nforgeron\nformuler\nfortune\nfossile\nfoudre\nfougère\nfouiller\nfoulure\nfourmi\nfragile\nfraise\nfranchir\nfrapper\nfrayeur\nfrégate\nfreiner\nfrelon\nfrémir\nfrénésie\nfrère\nfriable\nfriction\nfrisson\nfrivole\nfroid\nfromage\nfrontal\nfrotter\nfruit\nfugitif\nfuite\nfureur\nfurieux\nfurtif\nfusion\nfutur\ngagner\ngalaxie\ngalerie\ngambader\ngarantir\ngardien\ngarnir\ngarrigue\ngazelle\ngazon\ngéant\ngélatine\ngélule\ngendarme\ngénéral\ngénie\ngenou\ngentil\ngéologie\ngéomètre\ngéranium\ngerme\ngestuel\ngeyser\ngibier\ngicler\ngirafe\ngivre\nglace\nglaive\nglisser\nglobe\ngloire\nglorieux\ngolfeur\ngomme\ngonfler\ngorge\ngorille\ngoudron\ngouffre\ngoulot\ngoupille\ngourmand\ngoutte\ngraduel\ngraffiti\ngraine\ngrand\ngrappin\ngratuit\ngravir\ngrenat\ngriffure\ngriller\ngrimper\ngrogner\ngronder\ngrotte\ngroupe\ngruger\ngrutier\ngruyère\nguépard\nguerrier\nguide\nguimauve\nguitare\ngustatif\ngymnaste\ngyrostat\nhabitude\nhachoir\nhalte\nhameau\nhangar\nhanneton\nharicot\nharmonie\nharpon\nhasard\nhélium\nhématome\nherbe\nhérisson\nhermine\nhéron\nhésiter\nheureux\nhiberner\nhibou\nhilarant\nhistoire\nhiver\nhomard\nhommage\nhomogène\nhonneur\nhonorer\nhonteux\nhorde\nhorizon\nhorloge\nhormone\nhorrible\nhouleux\nhousse\nhublot\nhuileux\nhumain\nhumble\nhumide\nhumour\nhurler\nhydromel\nhygiène\nhymne\nhypnose\nidylle\nignorer\niguane\nillicite\nillusion\nimage\nimbiber\nimiter\nimmense\nimmobile\nimmuable\nimpact\nimpérial\nimplorer\nimposer\nimprimer\nimputer\nincarner\nincendie\nincident\nincliner\nincolore\nindexer\nindice\ninductif\ninédit\nineptie\ninexact\ninfini\ninfliger\ninformer\ninfusion\ningérer\ninhaler\ninhiber\ninjecter\ninjure\ninnocent\ninoculer\ninonder\ninscrire\ninsecte\ninsigne\ninsolite\ninspirer\ninstinct\ninsulter\nintact\nintense\nintime\nintrigue\nintuitif\ninutile\ninvasion\ninventer\ninviter\ninvoquer\nironique\nirradier\nirréel\nirriter\nisoler\nivoire\nivresse\njaguar\njaillir\njambe\njanvier\njardin\njauger\njaune\njavelot\njetable\njeton\njeudi\njeunesse\njoindre\njoncher\njongler\njoueur\njouissif\njournal\njovial\njoyau\njoyeux\njubiler\njugement\njunior\njupon\njuriste\njustice\njuteux\njuvénile\nkayak\nkimono\nkiosque\nlabel\nlabial\nlabourer\nlacérer\nlactose\nlagune\nlaine\nlaisser\nlaitier\nlambeau\nlamelle\nlampe\nlanceur\nlangage\nlanterne\nlapin\nlargeur\nlarme\nlaurier\nlavabo\nlavoir\nlecture\nlégal\nléger\nlégume\nlessive\nlettre\nlevier\nlexique\nlézard\nliasse\nlibérer\nlibre\nlicence\nlicorne\nliège\nlièvre\nligature\nligoter\nligue\nlimer\nlimite\nlimonade\nlimpide\nlinéaire\nlingot\nlionceau\nliquide\nlisière\nlister\nlithium\nlitige\nlittoral\nlivreur\nlogique\nlointain\nloisir\nlombric\nloterie\nlouer\nlourd\nloutre\nlouve\nloyal\nlubie\nlucide\nlucratif\nlueur\nlugubre\nluisant\nlumière\nlunaire\nlundi\nluron\nlutter\nluxueux\nmachine\nmagasin\nmagenta\nmagique\nmaigre\nmaillon\nmaintien\nmairie\nmaison\nmajorer\nmalaxer\nmaléfice\nmalheur\nmalice\nmallette\nmammouth\nmandater\nmaniable\nmanquant\nmanteau\nmanuel\nmarathon\nmarbre\nmarchand\nmardi\nmaritime\nmarqueur\nmarron\nmarteler\nmascotte\nmassif\nmatériel\nmatière\nmatraque\nmaudire\nmaussade\nmauve\nmaximal\nméchant\nméconnu\nmédaille\nmédecin\nméditer\nméduse\nmeilleur\nmélange\nmélodie\nmembre\nmémoire\nmenacer\nmener\nmenhir\nmensonge\nmentor\nmercredi\nmérite\nmerle\nmessager\nmesure\nmétal\nmétéore\nméthode\nmétier\nmeuble\nmiauler\nmicrobe\nmiette\nmignon\nmigrer\nmilieu\nmillion\nmimique\nmince\nminéral\nminimal\nminorer\nminute\nmiracle\nmiroiter\nmissile\nmixte\nmobile\nmoderne\nmoelleux\nmondial\nmoniteur\nmonnaie\nmonotone\nmonstre\nmontagne\nmonument\nmoqueur\nmorceau\nmorsure\nmortier\nmoteur\nmotif\nmouche\nmoufle\nmoulin\nmousson\nmouton\nmouvant\nmultiple\nmunition\nmuraille\nmurène\nmurmure\nmuscle\nmuséum\nmusicien\nmutation\nmuter\nmutuel\nmyriade\nmyrtille\nmystère\nmythique\nnageur\nnappe\nnarquois\nnarrer\nnatation\nnation\nnature\nnaufrage\nnautique\nnavire\nnébuleux\nnectar\nnéfaste\nnégation\nnégliger\nnégocier\nneige\nnerveux\nnettoyer\nneurone\nneutron\nneveu\nniche\nnickel\nnitrate\nniveau\nnoble\nnocif\nnocturne\nnoirceur\nnoisette\nnomade\nnombreux\nnommer\nnormatif\nnotable\nnotifier\nnotoire\nnourrir\nnouveau\nnovateur\nnovembre\nnovice\nnuage\nnuancer\nnuire\nnuisible\nnuméro\nnuptial\nnuque\nnutritif\nobéir\nobjectif\nobliger\nobscur\nobserver\nobstacle\nobtenir\nobturer\noccasion\noccuper\nocéan\noctobre\noctroyer\noctupler\noculaire\nodeur\nodorant\noffenser\nofficier\noffrir\nogive\noiseau\noisillon\nolfactif\nolivier\nombrage\nomettre\nonctueux\nonduler\nonéreux\nonirique\nopale\nopaque\nopérer\nopinion\nopportun\nopprimer\nopter\noptique\norageux\norange\norbite\nordonner\noreille\norgane\norgueil\norifice\nornement\norque\nortie\nosciller\nosmose\nossature\notarie\nouragan\nourson\noutil\noutrager\nouvrage\novation\noxyde\noxygène\nozone\npaisible\npalace\npalmarès\npalourde\npalper\npanache\npanda\npangolin\npaniquer\npanneau\npanorama\npantalon\npapaye\npapier\npapoter\npapyrus\nparadoxe\nparcelle\nparesse\nparfumer\nparler\nparole\nparrain\nparsemer\npartager\nparure\nparvenir\npassion\npastèque\npaternel\npatience\npatron\npavillon\npavoiser\npayer\npaysage\npeigne\npeintre\npelage\npélican\npelle\npelouse\npeluche\npendule\npénétrer\npénible\npensif\npénurie\npépite\npéplum\nperdrix\nperforer\npériode\npermuter\nperplexe\npersil\nperte\npeser\npétale\npetit\npétrir\npeuple\npharaon\nphobie\nphoque\nphoton\nphrase\nphysique\npiano\npictural\npièce\npierre\npieuvre\npilote\npinceau\npipette\npiquer\npirogue\npiscine\npiston\npivoter\npixel\npizza\nplacard\nplafond\nplaisir\nplaner\nplaque\nplastron\nplateau\npleurer\nplexus\npliage\nplomb\nplonger\npluie\nplumage\npochette\npoésie\npoète\npointe\npoirier\npoisson\npoivre\npolaire\npolicier\npollen\npolygone\npommade\npompier\nponctuel\npondérer\nponey\nportique\nposition\nposséder\nposture\npotager\npoteau\npotion\npouce\npoulain\npoumon\npourpre\npoussin\npouvoir\nprairie\npratique\nprécieux\nprédire\npréfixe\nprélude\nprénom\nprésence\nprétexte\nprévoir\nprimitif\nprince\nprison\npriver\nproblème\nprocéder\nprodige\nprofond\nprogrès\nproie\nprojeter\nprologue\npromener\npropre\nprospère\nprotéger\nprouesse\nproverbe\nprudence\npruneau\npsychose\npublic\npuceron\npuiser\npulpe\npulsar\npunaise\npunitif\npupitre\npurifier\npuzzle\npyramide\nquasar\nquerelle\nquestion\nquiétude\nquitter\nquotient\nracine\nraconter\nradieux\nragondin\nraideur\nraisin\nralentir\nrallonge\nramasser\nrapide\nrasage\nratisser\nravager\nravin\nrayonner\nréactif\nréagir\nréaliser\nréanimer\nrecevoir\nréciter\nréclamer\nrécolter\nrecruter\nreculer\nrecycler\nrédiger\nredouter\nrefaire\nréflexe\nréformer\nrefrain\nrefuge\nrégalien\nrégion\nréglage\nrégulier\nréitérer\nrejeter\nrejouer\nrelatif\nrelever\nrelief\nremarque\nremède\nremise\nremonter\nremplir\nremuer\nrenard\nrenfort\nrenifler\nrenoncer\nrentrer\nrenvoi\nreplier\nreporter\nreprise\nreptile\nrequin\nréserve\nrésineux\nrésoudre\nrespect\nrester\nrésultat\nrétablir\nretenir\nréticule\nretomber\nretracer\nréunion\nréussir\nrevanche\nrevivre\nrévolte\nrévulsif\nrichesse\nrideau\nrieur\nrigide\nrigoler\nrincer\nriposter\nrisible\nrisque\nrituel\nrival\nrivière\nrocheux\nromance\nrompre\nronce\nrondin\nroseau\nrosier\nrotatif\nrotor\nrotule\nrouge\nrouille\nrouleau\nroutine\nroyaume\nruban\nrubis\nruche\nruelle\nrugueux\nruiner\nruisseau\nruser\nrustique\nrythme\nsabler\nsaboter\nsabre\nsacoche\nsafari\nsagesse\nsaisir\nsalade\nsalive\nsalon\nsaluer\nsamedi\nsanction\nsanglier\nsarcasme\nsardine\nsaturer\nsaugrenu\nsaumon\nsauter\nsauvage\nsavant\nsavonner\nscalpel\nscandale\nscélérat\nscénario\nsceptre\nschéma\nscience\nscinder\nscore\nscrutin\nsculpter\nséance\nsécable\nsécher\nsecouer\nsécréter\nsédatif\nséduire\nseigneur\nséjour\nsélectif\nsemaine\nsembler\nsemence\nséminal\nsénateur\nsensible\nsentence\nséparer\nséquence\nserein\nsergent\nsérieux\nserrure\nsérum\nservice\nsésame\nsévir\nsevrage\nsextuple\nsidéral\nsiècle\nsiéger\nsiffler\nsigle\nsignal\nsilence\nsilicium\nsimple\nsincère\nsinistre\nsiphon\nsirop\nsismique\nsituer\nskier\nsocial\nsocle\nsodium\nsoigneux\nsoldat\nsoleil\nsolitude\nsoluble\nsombre\nsommeil\nsomnoler\nsonde\nsongeur\nsonnette\nsonore\nsorcier\nsortir\nsosie\nsottise\nsoucieux\nsoudure\nsouffle\nsoulever\nsoupape\nsource\nsoutirer\nsouvenir\nspacieux\nspatial\nspécial\nsphère\nspiral\nstable\nstation\nsternum\nstimulus\nstipuler\nstrict\nstudieux\nstupeur\nstyliste\nsublime\nsubstrat\nsubtil\nsubvenir\nsuccès\nsucre\nsuffixe\nsuggérer\nsuiveur\nsulfate\nsuperbe\nsupplier\nsurface\nsuricate\nsurmener\nsurprise\nsursaut\nsurvie\nsuspect\nsyllabe\nsymbole\nsymétrie\nsynapse\nsyntaxe\nsystème\ntabac\ntablier\ntactile\ntailler\ntalent\ntalisman\ntalonner\ntambour\ntamiser\ntangible\ntapis\ntaquiner\ntarder\ntarif\ntartine\ntasse\ntatami\ntatouage\ntaupe\ntaureau\ntaxer\ntémoin\ntemporel\ntenaille\ntendre\nteneur\ntenir\ntension\nterminer\nterne\nterrible\ntétine\ntexte\nthème\nthéorie\nthérapie\nthorax\ntibia\ntiède\ntimide\ntirelire\ntiroir\ntissu\ntitane\ntitre\ntituber\ntoboggan\ntolérant\ntomate\ntonique\ntonneau\ntoponyme\ntorche\ntordre\ntornade\ntorpille\ntorrent\ntorse\ntortue\ntotem\ntoucher\ntournage\ntousser\ntoxine\ntraction\ntrafic\ntragique\ntrahir\ntrain\ntrancher\ntravail\ntrèfle\ntremper\ntrésor\ntreuil\ntriage\ntribunal\ntricoter\ntrilogie\ntriomphe\ntripler\ntriturer\ntrivial\ntrombone\ntronc\ntropical\ntroupeau\ntuile\ntulipe\ntumulte\ntunnel\nturbine\ntuteur\ntutoyer\ntuyau\ntympan\ntyphon\ntypique\ntyran\nubuesque\nultime\nultrason\nunanime\nunifier\nunion\nunique\nunitaire\nunivers\nuranium\nurbain\nurticant\nusage\nusine\nusuel\nusure\nutile\nutopie\nvacarme\nvaccin\nvagabond\nvague\nvaillant\nvaincre\nvaisseau\nvalable\nvalise\nvallon\nvalve\nvampire\nvanille\nvapeur\nvarier\nvaseux\nvassal\nvaste\nvecteur\nvedette\nvégétal\nvéhicule\nveinard\nvéloce\nvendredi\nvénérer\nvenger\nvenimeux\nventouse\nverdure\nvérin\nvernir\nverrou\nverser\nvertu\nveston\nvétéran\nvétuste\nvexant\nvexer\nviaduc\nviande\nvictoire\nvidange\nvidéo\nvignette\nvigueur\nvilain\nvillage\nvinaigre\nviolon\nvipère\nvirement\nvirtuose\nvirus\nvisage\nviseur\nvision\nvisqueux\nvisuel\nvital\nvitesse\nviticole\nvitrine\nvivace\nvivipare\nvocation\nvoguer\nvoile\nvoisin\nvoiture\nvolaille\nvolcan\nvoltiger\nvolume\nvorace\nvortex\nvoter\nvouloir\nvoyage\nvoyelle\nwagon\nxénon\nyacht\nzèbre\nzénith\nzeste\nzoologie\n`\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/italian.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt\n\t// $ crc32 italian.txt\n\t// 2fc7d07e\n\tchecksum := crc32.ChecksumIEEE([]byte(italian))\n\tif fmt.Sprintf(\"%x\", checksum) != \"2fc7d07e\" {\n\t\tpanic(\"italian checksum invalid\")\n\t}\n}\n\n// Italian is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/italian.txt\nvar Italian = strings.Split(strings.TrimSpace(italian), \"\\n\")\nvar italian = `abaco\nabbaglio\nabbinato\nabete\nabisso\nabolire\nabrasivo\nabrogato\naccadere\naccenno\naccusato\nacetone\nachille\nacido\nacqua\nacre\nacrilico\nacrobata\nacuto\nadagio\naddebito\naddome\nadeguato\naderire\nadipe\nadottare\nadulare\naffabile\naffetto\naffisso\naffranto\naforisma\nafoso\nafricano\nagave\nagente\nagevole\naggancio\nagire\nagitare\nagonismo\nagricolo\nagrumeto\naguzzo\nalabarda\nalato\nalbatro\nalberato\nalbo\nalbume\nalce\nalcolico\nalettone\nalfa\nalgebra\naliante\nalibi\nalimento\nallagato\nallegro\nallievo\nallodola\nallusivo\nalmeno\nalogeno\nalpaca\nalpestre\naltalena\nalterno\nalticcio\naltrove\nalunno\nalveolo\nalzare\namalgama\namanita\namarena\nambito\nambrato\nameba\namerica\nametista\namico\nammasso\nammenda\nammirare\nammonito\namore\nampio\nampliare\namuleto\nanacardo\nanagrafe\nanalista\nanarchia\nanatra\nanca\nancella\nancora\nandare\nandrea\nanello\nangelo\nangolare\nangusto\nanima\nannegare\nannidato\nanno\nannuncio\nanonimo\nanticipo\nanzi\napatico\napertura\napode\napparire\nappetito\nappoggio\napprodo\nappunto\naprile\narabica\narachide\naragosta\naraldica\narancio\naratura\narazzo\narbitro\narchivio\nardito\narenile\nargento\nargine\narguto\naria\narmonia\narnese\narredato\narringa\narrosto\narsenico\narso\nartefice\narzillo\nasciutto\nascolto\nasepsi\nasettico\nasfalto\nasino\nasola\naspirato\naspro\nassaggio\nasse\nassoluto\nassurdo\nasta\nastenuto\nastice\nastratto\natavico\nateismo\natomico\natono\nattesa\nattivare\nattorno\nattrito\nattuale\nausilio\naustria\nautista\nautonomo\nautunno\navanzato\navere\navvenire\navviso\navvolgere\nazione\nazoto\nazzimo\nazzurro\nbabele\nbaccano\nbacino\nbaco\nbadessa\nbadilata\nbagnato\nbaita\nbalcone\nbaldo\nbalena\nballata\nbalzano\nbambino\nbandire\nbaraonda\nbarbaro\nbarca\nbaritono\nbarlume\nbarocco\nbasilico\nbasso\nbatosta\nbattuto\nbaule\nbava\nbavosa\nbecco\nbeffa\nbelgio\nbelva\nbenda\nbenevole\nbenigno\nbenzina\nbere\nberlina\nbeta\nbibita\nbici\nbidone\nbifido\nbiga\nbilancia\nbimbo\nbinocolo\nbiologo\nbipede\nbipolare\nbirbante\nbirra\nbiscotto\nbisesto\nbisnonno\nbisonte\nbisturi\nbizzarro\nblando\nblatta\nbollito\nbonifico\nbordo\nbosco\nbotanico\nbottino\nbozzolo\nbraccio\nbradipo\nbrama\nbranca\nbravura\nbretella\nbrevetto\nbrezza\nbriglia\nbrillante\nbrindare\nbroccolo\nbrodo\nbronzina\nbrullo\nbruno\nbubbone\nbuca\nbudino\nbuffone\nbuio\nbulbo\nbuono\nburlone\nburrasca\nbussola\nbusta\ncadetto\ncaduco\ncalamaro\ncalcolo\ncalesse\ncalibro\ncalmo\ncaloria\ncambusa\ncamerata\ncamicia\ncammino\ncamola\ncampale\ncanapa\ncandela\ncane\ncanino\ncanotto\ncantina\ncapace\ncapello\ncapitolo\ncapogiro\ncappero\ncapra\ncapsula\ncarapace\ncarcassa\ncardo\ncarisma\ncarovana\ncarretto\ncartolina\ncasaccio\ncascata\ncaserma\ncaso\ncassone\ncastello\ncasuale\ncatasta\ncatena\ncatrame\ncauto\ncavillo\ncedibile\ncedrata\ncefalo\ncelebre\ncellulare\ncena\ncenone\ncentesimo\nceramica\ncercare\ncerto\ncerume\ncervello\ncesoia\ncespo\nceto\nchela\nchiaro\nchicca\nchiedere\nchimera\nchina\nchirurgo\nchitarra\nciao\nciclismo\ncifrare\ncigno\ncilindro\nciottolo\ncirca\ncirrosi\ncitrico\ncittadino\nciuffo\ncivetta\ncivile\nclassico\nclinica\ncloro\ncocco\ncodardo\ncodice\ncoerente\ncognome\ncollare\ncolmato\ncolore\ncolposo\ncoltivato\ncolza\ncoma\ncometa\ncommando\ncomodo\ncomputer\ncomune\nconciso\ncondurre\nconferma\ncongelare\nconiuge\nconnesso\nconoscere\nconsumo\ncontinuo\nconvegno\ncoperto\ncopione\ncoppia\ncopricapo\ncorazza\ncordata\ncoricato\ncornice\ncorolla\ncorpo\ncorredo\ncorsia\ncortese\ncosmico\ncostante\ncottura\ncovato\ncratere\ncravatta\ncreato\ncredere\ncremoso\ncrescita\ncreta\ncriceto\ncrinale\ncrisi\ncritico\ncroce\ncronaca\ncrostata\ncruciale\ncrusca\ncucire\ncuculo\ncugino\ncullato\ncupola\ncuratore\ncursore\ncurvo\ncuscino\ncustode\ndado\ndaino\ndalmata\ndamerino\ndaniela\ndannoso\ndanzare\ndatato\ndavanti\ndavvero\ndebutto\ndecennio\ndeciso\ndeclino\ndecollo\ndecreto\ndedicato\ndefinito\ndeforme\ndegno\ndelegare\ndelfino\ndelirio\ndelta\ndemenza\ndenotato\ndentro\ndeposito\nderapata\nderivare\nderoga\ndescritto\ndeserto\ndesiderio\ndesumere\ndetersivo\ndevoto\ndiametro\ndicembre\ndiedro\ndifeso\ndiffuso\ndigerire\ndigitale\ndiluvio\ndinamico\ndinnanzi\ndipinto\ndiploma\ndipolo\ndiradare\ndire\ndirotto\ndirupo\ndisagio\ndiscreto\ndisfare\ndisgelo\ndisposto\ndistanza\ndisumano\ndito\ndivano\ndivelto\ndividere\ndivorato\ndoblone\ndocente\ndoganale\ndogma\ndolce\ndomato\ndomenica\ndominare\ndondolo\ndono\ndormire\ndote\ndottore\ndovuto\ndozzina\ndrago\ndruido\ndubbio\ndubitare\nducale\nduna\nduomo\nduplice\nduraturo\nebano\neccesso\necco\neclissi\neconomia\nedera\nedicola\nedile\neditoria\neducare\negemonia\negli\negoismo\negregio\nelaborato\nelargire\nelegante\nelencato\neletto\nelevare\nelfico\nelica\nelmo\nelsa\neluso\nemanato\nemblema\nemesso\nemiro\nemotivo\nemozione\nempirico\nemulo\nendemico\nenduro\nenergia\nenfasi\nenoteca\nentrare\nenzima\nepatite\nepilogo\nepisodio\nepocale\neppure\nequatore\nerario\nerba\nerboso\nerede\neremita\nerigere\nermetico\neroe\nerosivo\nerrante\nesagono\nesame\nesanime\nesaudire\nesca\nesempio\nesercito\nesibito\nesigente\nesistere\nesito\nesofago\nesortato\nesoso\nespanso\nespresso\nessenza\nesso\nesteso\nestimare\nestonia\nestroso\nesultare\netilico\netnico\netrusco\netto\neuclideo\neuropa\nevaso\nevidenza\nevitato\nevoluto\nevviva\nfabbrica\nfaccenda\nfachiro\nfalco\nfamiglia\nfanale\nfanfara\nfango\nfantasma\nfare\nfarfalla\nfarinoso\nfarmaco\nfascia\nfastoso\nfasullo\nfaticare\nfato\nfavoloso\nfebbre\nfecola\nfede\nfegato\nfelpa\nfeltro\nfemmina\nfendere\nfenomeno\nfermento\nferro\nfertile\nfessura\nfestivo\nfetta\nfeudo\nfiaba\nfiducia\nfifa\nfigurato\nfilo\nfinanza\nfinestra\nfinire\nfiore\nfiscale\nfisico\nfiume\nflacone\nflamenco\nflebo\nflemma\nflorido\nfluente\nfluoro\nfobico\nfocaccia\nfocoso\nfoderato\nfoglio\nfolata\nfolclore\nfolgore\nfondente\nfonetico\nfonia\nfontana\nforbito\nforchetta\nforesta\nformica\nfornaio\nforo\nfortezza\nforzare\nfosfato\nfosso\nfracasso\nfrana\nfrassino\nfratello\nfreccetta\nfrenata\nfresco\nfrigo\nfrollino\nfronde\nfrugale\nfrutta\nfucilata\nfucsia\nfuggente\nfulmine\nfulvo\nfumante\nfumetto\nfumoso\nfune\nfunzione\nfuoco\nfurbo\nfurgone\nfurore\nfuso\nfutile\ngabbiano\ngaffe\ngalateo\ngallina\ngaloppo\ngambero\ngamma\ngaranzia\ngarbo\ngarofano\ngarzone\ngasdotto\ngasolio\ngastrico\ngatto\ngaudio\ngazebo\ngazzella\ngeco\ngelatina\ngelso\ngemello\ngemmato\ngene\ngenitore\ngennaio\ngenotipo\ngergo\nghepardo\nghiaccio\nghisa\ngiallo\ngilda\nginepro\ngiocare\ngioiello\ngiorno\ngiove\ngirato\ngirone\ngittata\ngiudizio\ngiurato\ngiusto\nglobulo\nglutine\ngnomo\ngobba\ngolf\ngomito\ngommone\ngonfio\ngonna\ngoverno\ngracile\ngrado\ngrafico\ngrammo\ngrande\ngrattare\ngravoso\ngrazia\ngreca\ngregge\ngrifone\ngrigio\ngrinza\ngrotta\ngruppo\nguadagno\nguaio\nguanto\nguardare\ngufo\nguidare\nibernato\nicona\nidentico\nidillio\nidolo\nidra\nidrico\nidrogeno\nigiene\nignaro\nignorato\nilare\nilleso\nillogico\nilludere\nimballo\nimbevuto\nimbocco\nimbuto\nimmane\nimmerso\nimmolato\nimpacco\nimpeto\nimpiego\nimporto\nimpronta\ninalare\ninarcare\ninattivo\nincanto\nincendio\ninchino\nincisivo\nincluso\nincontro\nincrocio\nincubo\nindagine\nindia\nindole\ninedito\ninfatti\ninfilare\ninflitto\ningaggio\ningegno\ninglese\ningordo\ningrosso\ninnesco\ninodore\ninoltrare\ninondato\ninsano\ninsetto\ninsieme\ninsonnia\ninsulina\nintasato\nintero\nintonaco\nintuito\ninumidire\ninvalido\ninvece\ninvito\niperbole\nipnotico\nipotesi\nippica\niride\nirlanda\nironico\nirrigato\nirrorare\nisolato\nisotopo\nisterico\nistituto\nistrice\nitalia\niterare\nlabbro\nlabirinto\nlacca\nlacerato\nlacrima\nlacuna\nladdove\nlago\nlampo\nlancetta\nlanterna\nlardoso\nlarga\nlaringe\nlastra\nlatenza\nlatino\nlattuga\nlavagna\nlavoro\nlegale\nleggero\nlembo\nlentezza\nlenza\nleone\nlepre\nlesivo\nlessato\nlesto\nletterale\nleva\nlevigato\nlibero\nlido\nlievito\nlilla\nlimatura\nlimitare\nlimpido\nlineare\nlingua\nliquido\nlira\nlirica\nlisca\nlite\nlitigio\nlivrea\nlocanda\nlode\nlogica\nlombare\nlondra\nlongevo\nloquace\nlorenzo\nloto\nlotteria\nluce\nlucidato\nlumaca\nluminoso\nlungo\nlupo\nluppolo\nlusinga\nlusso\nlutto\nmacabro\nmacchina\nmacero\nmacinato\nmadama\nmagico\nmaglia\nmagnete\nmagro\nmaiolica\nmalafede\nmalgrado\nmalinteso\nmalsano\nmalto\nmalumore\nmana\nmancia\nmandorla\nmangiare\nmanifesto\nmannaro\nmanovra\nmansarda\nmantide\nmanubrio\nmappa\nmaratona\nmarcire\nmaretta\nmarmo\nmarsupio\nmaschera\nmassaia\nmastino\nmaterasso\nmatricola\nmattone\nmaturo\nmazurca\nmeandro\nmeccanico\nmecenate\nmedesimo\nmeditare\nmega\nmelassa\nmelis\nmelodia\nmeninge\nmeno\nmensola\nmercurio\nmerenda\nmerlo\nmeschino\nmese\nmessere\nmestolo\nmetallo\nmetodo\nmettere\nmiagolare\nmica\nmicelio\nmichele\nmicrobo\nmidollo\nmiele\nmigliore\nmilano\nmilite\nmimosa\nminerale\nmini\nminore\nmirino\nmirtillo\nmiscela\nmissiva\nmisto\nmisurare\nmitezza\nmitigare\nmitra\nmittente\nmnemonico\nmodello\nmodifica\nmodulo\nmogano\nmogio\nmole\nmolosso\nmonastero\nmonco\nmondina\nmonetario\nmonile\nmonotono\nmonsone\nmontato\nmonviso\nmora\nmordere\nmorsicato\nmostro\nmotivato\nmotosega\nmotto\nmovenza\nmovimento\nmozzo\nmucca\nmucosa\nmuffa\nmughetto\nmugnaio\nmulatto\nmulinello\nmultiplo\nmummia\nmunto\nmuovere\nmurale\nmusa\nmuscolo\nmusica\nmutevole\nmuto\nnababbo\nnafta\nnanometro\nnarciso\nnarice\nnarrato\nnascere\nnastrare\nnaturale\nnautica\nnaviglio\nnebulosa\nnecrosi\nnegativo\nnegozio\nnemmeno\nneofita\nneretto\nnervo\nnessuno\nnettuno\nneutrale\nneve\nnevrotico\nnicchia\nninfa\nnitido\nnobile\nnocivo\nnodo\nnome\nnomina\nnordico\nnormale\nnorvegese\nnostrano\nnotare\nnotizia\nnotturno\nnovella\nnucleo\nnulla\nnumero\nnuovo\nnutrire\nnuvola\nnuziale\noasi\nobbedire\nobbligo\nobelisco\noblio\nobolo\nobsoleto\noccasione\nocchio\noccidente\noccorrere\noccultare\nocra\noculato\nodierno\nodorare\nofferta\noffrire\noffuscato\noggetto\noggi\nognuno\nolandese\nolfatto\noliato\noliva\nologramma\noltre\nomaggio\nombelico\nombra\nomega\nomissione\nondoso\nonere\nonice\nonnivoro\nonorevole\nonta\noperato\nopinione\nopposto\noracolo\norafo\nordine\norecchino\norefice\norfano\norganico\norigine\norizzonte\norma\normeggio\nornativo\norologio\norrendo\norribile\nortensia\nortica\norzata\norzo\nosare\noscurare\nosmosi\nospedale\nospite\nossa\nossidare\nostacolo\noste\notite\notre\nottagono\nottimo\nottobre\novale\novest\novino\noviparo\novocito\novunque\novviare\nozio\npacchetto\npace\npacifico\npadella\npadrone\npaese\npaga\npagina\npalazzina\npalesare\npallido\npalo\npalude\npandoro\npannello\npaolo\npaonazzo\npaprica\nparabola\nparcella\nparere\npargolo\npari\nparlato\nparola\npartire\nparvenza\nparziale\npassivo\npasticca\npatacca\npatologia\npattume\npavone\npeccato\npedalare\npedonale\npeggio\npeloso\npenare\npendice\npenisola\npennuto\npenombra\npensare\npentola\npepe\npepita\nperbene\npercorso\nperdonato\nperforare\npergamena\nperiodo\npermesso\nperno\nperplesso\npersuaso\npertugio\npervaso\npesatore\npesista\npeso\npestifero\npetalo\npettine\npetulante\npezzo\npiacere\npianta\npiattino\npiccino\npicozza\npiega\npietra\npiffero\npigiama\npigolio\npigro\npila\npilifero\npillola\npilota\npimpante\npineta\npinna\npinolo\npioggia\npiombo\npiramide\npiretico\npirite\npirolisi\npitone\npizzico\nplacebo\nplanare\nplasma\nplatano\nplenario\npochezza\npoderoso\npodismo\npoesia\npoggiare\npolenta\npoligono\npollice\npolmonite\npolpetta\npolso\npoltrona\npolvere\npomice\npomodoro\nponte\npopoloso\nporfido\nporoso\nporpora\nporre\nportata\nposa\npositivo\npossesso\npostulato\npotassio\npotere\npranzo\nprassi\npratica\nprecluso\npredica\nprefisso\npregiato\nprelievo\npremere\nprenotare\npreparato\npresenza\npretesto\nprevalso\nprima\nprincipe\nprivato\nproblema\nprocura\nprodurre\nprofumo\nprogetto\nprolunga\npromessa\npronome\nproposta\nproroga\nproteso\nprova\nprudente\nprugna\nprurito\npsiche\npubblico\npudica\npugilato\npugno\npulce\npulito\npulsante\npuntare\npupazzo\npupilla\npuro\nquadro\nqualcosa\nquasi\nquerela\nquota\nraccolto\nraddoppio\nradicale\nradunato\nraffica\nragazzo\nragione\nragno\nramarro\nramingo\nramo\nrandagio\nrantolare\nrapato\nrapina\nrappreso\nrasatura\nraschiato\nrasente\nrassegna\nrastrello\nrata\nravveduto\nreale\nrecepire\nrecinto\nrecluta\nrecondito\nrecupero\nreddito\nredimere\nregalato\nregistro\nregola\nregresso\nrelazione\nremare\nremoto\nrenna\nreplica\nreprimere\nreputare\nresa\nresidente\nresponso\nrestauro\nrete\nretina\nretorica\nrettifica\nrevocato\nriassunto\nribadire\nribelle\nribrezzo\nricarica\nricco\nricevere\nriciclato\nricordo\nricreduto\nridicolo\nridurre\nrifasare\nriflesso\nriforma\nrifugio\nrigare\nrigettato\nrighello\nrilassato\nrilevato\nrimanere\nrimbalzo\nrimedio\nrimorchio\nrinascita\nrincaro\nrinforzo\nrinnovo\nrinomato\nrinsavito\nrintocco\nrinuncia\nrinvenire\nriparato\nripetuto\nripieno\nriportare\nripresa\nripulire\nrisata\nrischio\nriserva\nrisibile\nriso\nrispetto\nristoro\nrisultato\nrisvolto\nritardo\nritegno\nritmico\nritrovo\nriunione\nriva\nriverso\nrivincita\nrivolto\nrizoma\nroba\nrobotico\nrobusto\nroccia\nroco\nrodaggio\nrodere\nroditore\nrogito\nrollio\nromantico\nrompere\nronzio\nrosolare\nrospo\nrotante\nrotondo\nrotula\nrovescio\nrubizzo\nrubrica\nruga\nrullino\nrumine\nrumoroso\nruolo\nrupe\nrussare\nrustico\nsabato\nsabbiare\nsabotato\nsagoma\nsalasso\nsaldatura\nsalgemma\nsalivare\nsalmone\nsalone\nsaltare\nsaluto\nsalvo\nsapere\nsapido\nsaporito\nsaraceno\nsarcasmo\nsarto\nsassoso\nsatellite\nsatira\nsatollo\nsaturno\nsavana\nsavio\nsaziato\nsbadiglio\nsbalzo\nsbancato\nsbarra\nsbattere\nsbavare\nsbendare\nsbirciare\nsbloccato\nsbocciato\nsbrinare\nsbruffone\nsbuffare\nscabroso\nscadenza\nscala\nscambiare\nscandalo\nscapola\nscarso\nscatenare\nscavato\nscelto\nscenico\nscettro\nscheda\nschiena\nsciarpa\nscienza\nscindere\nscippo\nsciroppo\nscivolo\nsclerare\nscodella\nscolpito\nscomparto\nsconforto\nscoprire\nscorta\nscossone\nscozzese\nscriba\nscrollare\nscrutinio\nscuderia\nscultore\nscuola\nscuro\nscusare\nsdebitare\nsdoganare\nseccatura\nsecondo\nsedano\nseggiola\nsegnalato\nsegregato\nseguito\nselciato\nselettivo\nsella\nselvaggio\nsemaforo\nsembrare\nseme\nseminato\nsempre\nsenso\nsentire\nsepolto\nsequenza\nserata\nserbato\nsereno\nserio\nserpente\nserraglio\nservire\nsestina\nsetola\nsettimana\nsfacelo\nsfaldare\nsfamato\nsfarzoso\nsfaticato\nsfera\nsfida\nsfilato\nsfinge\nsfocato\nsfoderare\nsfogo\nsfoltire\nsforzato\nsfratto\nsfruttato\nsfuggito\nsfumare\nsfuso\nsgabello\nsgarbato\nsgonfiare\nsgorbio\nsgrassato\nsguardo\nsibilo\nsiccome\nsierra\nsigla\nsignore\nsilenzio\nsillaba\nsimbolo\nsimpatico\nsimulato\nsinfonia\nsingolo\nsinistro\nsino\nsintesi\nsinusoide\nsipario\nsisma\nsistole\nsituato\nslitta\nslogatura\nsloveno\nsmarrito\nsmemorato\nsmentito\nsmeraldo\nsmilzo\nsmontare\nsmottato\nsmussato\nsnellire\nsnervato\nsnodo\nsobbalzo\nsobrio\nsoccorso\nsociale\nsodale\nsoffitto\nsogno\nsoldato\nsolenne\nsolido\nsollazzo\nsolo\nsolubile\nsolvente\nsomatico\nsomma\nsonda\nsonetto\nsonnifero\nsopire\nsoppeso\nsopra\nsorgere\nsorpasso\nsorriso\nsorso\nsorteggio\nsorvolato\nsospiro\nsosta\nsottile\nspada\nspalla\nspargere\nspatola\nspavento\nspazzola\nspecie\nspedire\nspegnere\nspelatura\nsperanza\nspessore\nspettrale\nspezzato\nspia\nspigoloso\nspillato\nspinoso\nspirale\nsplendido\nsportivo\nsposo\nspranga\nsprecare\nspronato\nspruzzo\nspuntino\nsquillo\nsradicare\nsrotolato\nstabile\nstacco\nstaffa\nstagnare\nstampato\nstantio\nstarnuto\nstasera\nstatuto\nstelo\nsteppa\nsterzo\nstiletto\nstima\nstirpe\nstivale\nstizzoso\nstonato\nstorico\nstrappo\nstregato\nstridulo\nstrozzare\nstrutto\nstuccare\nstufo\nstupendo\nsubentro\nsuccoso\nsudore\nsuggerito\nsugo\nsultano\nsuonare\nsuperbo\nsupporto\nsurgelato\nsurrogato\nsussurro\nsutura\nsvagare\nsvedese\nsveglio\nsvelare\nsvenuto\nsvezia\nsviluppo\nsvista\nsvizzera\nsvolta\nsvuotare\ntabacco\ntabulato\ntacciare\ntaciturno\ntale\ntalismano\ntampone\ntannino\ntara\ntardivo\ntargato\ntariffa\ntarpare\ntartaruga\ntasto\ntattico\ntaverna\ntavolata\ntazza\nteca\ntecnico\ntelefono\ntemerario\ntempo\ntemuto\ntendone\ntenero\ntensione\ntentacolo\nteorema\nterme\nterrazzo\nterzetto\ntesi\ntesserato\ntestato\ntetro\ntettoia\ntifare\ntigella\ntimbro\ntinto\ntipico\ntipografo\ntiraggio\ntiro\ntitanio\ntitolo\ntitubante\ntizio\ntizzone\ntoccare\ntollerare\ntolto\ntombola\ntomo\ntonfo\ntonsilla\ntopazio\ntopologia\ntoppa\ntorba\ntornare\ntorrone\ntortora\ntoscano\ntossire\ntostatura\ntotano\ntrabocco\ntrachea\ntrafila\ntragedia\ntralcio\ntramonto\ntransito\ntrapano\ntrarre\ntrasloco\ntrattato\ntrave\ntreccia\ntremolio\ntrespolo\ntributo\ntricheco\ntrifoglio\ntrillo\ntrincea\ntrio\ntristezza\ntriturato\ntrivella\ntromba\ntrono\ntroppo\ntrottola\ntrovare\ntruccato\ntubatura\ntuffato\ntulipano\ntumulto\ntunisia\nturbare\nturchino\ntuta\ntutela\nubicato\nuccello\nuccisore\nudire\nuditivo\nuffa\nufficio\nuguale\nulisse\nultimato\numano\numile\numorismo\nuncinetto\nungere\nungherese\nunicorno\nunificato\nunisono\nunitario\nunte\nuovo\nupupa\nuragano\nurgenza\nurlo\nusanza\nusato\nuscito\nusignolo\nusuraio\nutensile\nutilizzo\nutopia\nvacante\nvaccinato\nvagabondo\nvagliato\nvalanga\nvalgo\nvalico\nvalletta\nvaloroso\nvalutare\nvalvola\nvampata\nvangare\nvanitoso\nvano\nvantaggio\nvanvera\nvapore\nvarano\nvarcato\nvariante\nvasca\nvedetta\nvedova\nveduto\nvegetale\nveicolo\nvelcro\nvelina\nvelluto\nveloce\nvenato\nvendemmia\nvento\nverace\nverbale\nvergogna\nverifica\nvero\nverruca\nverticale\nvescica\nvessillo\nvestale\nveterano\nvetrina\nvetusto\nviandante\nvibrante\nvicenda\nvichingo\nvicinanza\nvidimare\nvigilia\nvigneto\nvigore\nvile\nvillano\nvimini\nvincitore\nviola\nvipera\nvirgola\nvirologo\nvirulento\nviscoso\nvisione\nvispo\nvissuto\nvisura\nvita\nvitello\nvittima\nvivanda\nvivido\nviziare\nvoce\nvoga\nvolatile\nvolere\nvolpe\nvoragine\nvulcano\nzampogna\nzanna\nzappato\nzattera\nzavorra\nzefiro\nzelante\nzelo\nzenzero\nzerbino\nzibetto\nzinco\nzircone\nzitto\nzolla\nzotico\nzucchero\nzufolo\nzulu\nzuppa\n`\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/japanese.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt\n\t// $ crc32 japanese.txt\n\t// 0acc1419\n\tchecksum := crc32.ChecksumIEEE([]byte(japanese))\n\tif fmt.Sprintf(\"%x\", checksum) != \"acc1419\" {\n\t\tpanic(fmt.Sprintf(\"japanese checksum invalid: %x\", checksum))\n\t}\n}\n\n// Japanese is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/japanese.txt\nvar Japanese = strings.Split(strings.TrimSpace(japanese), \"\\n\")\nvar japanese = `あいこくしん\nあいさつ\nあいだ\nあおぞら\nあかちゃん\nあきる\nあけがた\nあける\nあこがれる\nあさい\nあさひ\nあしあと\nあじわう\nあずかる\nあずき\nあそぶ\nあたえる\nあたためる\nあたりまえ\nあたる\nあつい\nあつかう\nあっしゅく\nあつまり\nあつめる\nあてな\nあてはまる\nあひる\nあぶら\nあぶる\nあふれる\nあまい\nあまど\nあまやかす\nあまり\nあみもの\nあめりか\nあやまる\nあゆむ\nあらいぐま\nあらし\nあらすじ\nあらためる\nあらゆる\nあらわす\nありがとう\nあわせる\nあわてる\nあんい\nあんがい\nあんこ\nあんぜん\nあんてい\nあんない\nあんまり\nいいだす\nいおん\nいがい\nいがく\nいきおい\nいきなり\nいきもの\nいきる\nいくじ\nいくぶん\nいけばな\nいけん\nいこう\nいこく\nいこつ\nいさましい\nいさん\nいしき\nいじゅう\nいじょう\nいじわる\nいずみ\nいずれ\nいせい\nいせえび\nいせかい\nいせき\nいぜん\nいそうろう\nいそがしい\nいだい\nいだく\nいたずら\nいたみ\nいたりあ\nいちおう\nいちじ\nいちど\nいちば\nいちぶ\nいちりゅう\nいつか\nいっしゅん\nいっせい\nいっそう\nいったん\nいっち\nいってい\nいっぽう\nいてざ\nいてん\nいどう\nいとこ\nいない\nいなか\nいねむり\nいのち\nいのる\nいはつ\nいばる\nいはん\nいびき\nいひん\nいふく\nいへん\nいほう\nいみん\nいもうと\nいもたれ\nいもり\nいやがる\nいやす\nいよかん\nいよく\nいらい\nいらすと\nいりぐち\nいりょう\nいれい\nいれもの\nいれる\nいろえんぴつ\nいわい\nいわう\nいわかん\nいわば\nいわゆる\nいんげんまめ\nいんさつ\nいんしょう\nいんよう\nうえき\nうえる\nうおざ\nうがい\nうかぶ\nうかべる\nうきわ\nうくらいな\nうくれれ\nうけたまわる\nうけつけ\nうけとる\nうけもつ\nうける\nうごかす\nうごく\nうこん\nうさぎ\nうしなう\nうしろがみ\nうすい\nうすぎ\nうすぐらい\nうすめる\nうせつ\nうちあわせ\nうちがわ\nうちき\nうちゅう\nうっかり\nうつくしい\nうったえる\nうつる\nうどん\nうなぎ\nうなじ\nうなずく\nうなる\nうねる\nうのう\nうぶげ\nうぶごえ\nうまれる\nうめる\nうもう\nうやまう\nうよく\nうらがえす\nうらぐち\nうらない\nうりあげ\nうりきれ\nうるさい\nうれしい\nうれゆき\nうれる\nうろこ\nうわき\nうわさ\nうんこう\nうんちん\nうんてん\nうんどう\nえいえん\nえいが\nえいきょう\nえいご\nえいせい\nえいぶん\nえいよう\nえいわ\nえおり\nえがお\nえがく\nえきたい\nえくせる\nえしゃく\nえすて\nえつらん\nえのぐ\nえほうまき\nえほん\nえまき\nえもじ\nえもの\nえらい\nえらぶ\nえりあ\nえんえん\nえんかい\nえんぎ\nえんげき\nえんしゅう\nえんぜつ\nえんそく\nえんちょう\nえんとつ\nおいかける\nおいこす\nおいしい\nおいつく\nおうえん\nおうさま\nおうじ\nおうせつ\nおうたい\nおうふく\nおうべい\nおうよう\nおえる\nおおい\nおおう\nおおどおり\nおおや\nおおよそ\nおかえり\nおかず\nおがむ\nおかわり\nおぎなう\nおきる\nおくさま\nおくじょう\nおくりがな\nおくる\nおくれる\nおこす\nおこなう\nおこる\nおさえる\nおさない\nおさめる\nおしいれ\nおしえる\nおじぎ\nおじさん\nおしゃれ\nおそらく\nおそわる\nおたがい\nおたく\nおだやか\nおちつく\nおっと\nおつり\nおでかけ\nおとしもの\nおとなしい\nおどり\nおどろかす\nおばさん\nおまいり\nおめでとう\nおもいで\nおもう\nおもたい\nおもちゃ\nおやつ\nおやゆび\nおよぼす\nおらんだ\nおろす\nおんがく\nおんけい\nおんしゃ\nおんせん\nおんだん\nおんちゅう\nおんどけい\nかあつ\nかいが\nがいき\nがいけん\nがいこう\nかいさつ\nかいしゃ\nかいすいよく\nかいぜん\nかいぞうど\nかいつう\nかいてん\nかいとう\nかいふく\nがいへき\nかいほう\nかいよう\nがいらい\nかいわ\nかえる\nかおり\nかかえる\nかがく\nかがし\nかがみ\nかくご\nかくとく\nかざる\nがぞう\nかたい\nかたち\nがちょう\nがっきゅう\nがっこう\nがっさん\nがっしょう\nかなざわし\nかのう\nがはく\nかぶか\nかほう\nかほご\nかまう\nかまぼこ\nかめれおん\nかゆい\nかようび\nからい\nかるい\nかろう\nかわく\nかわら\nがんか\nかんけい\nかんこう\nかんしゃ\nかんそう\nかんたん\nかんち\nがんばる\nきあい\nきあつ\nきいろ\nぎいん\nきうい\nきうん\nきえる\nきおう\nきおく\nきおち\nきおん\nきかい\nきかく\nきかんしゃ\nききて\nきくばり\nきくらげ\nきけんせい\nきこう\nきこえる\nきこく\nきさい\nきさく\nきさま\nきさらぎ\nぎじかがく\nぎしき\nぎじたいけん\nぎじにってい\nぎじゅつしゃ\nきすう\nきせい\nきせき\nきせつ\nきそう\nきぞく\nきぞん\nきたえる\nきちょう\nきつえん\nぎっちり\nきつつき\nきつね\nきてい\nきどう\nきどく\nきない\nきなが\nきなこ\nきぬごし\nきねん\nきのう\nきのした\nきはく\nきびしい\nきひん\nきふく\nきぶん\nきぼう\nきほん\nきまる\nきみつ\nきむずかしい\nきめる\nきもだめし\nきもち\nきもの\nきゃく\nきやく\nぎゅうにく\nきよう\nきょうりゅう\nきらい\nきらく\nきりん\nきれい\nきれつ\nきろく\nぎろん\nきわめる\nぎんいろ\nきんかくじ\nきんじょ\nきんようび\nぐあい\nくいず\nくうかん\nくうき\nくうぐん\nくうこう\nぐうせい\nくうそう\nぐうたら\nくうふく\nくうぼ\nくかん\nくきょう\nくげん\nぐこう\nくさい\nくさき\nくさばな\nくさる\nくしゃみ\nくしょう\nくすのき\nくすりゆび\nくせげ\nくせん\nぐたいてき\nくださる\nくたびれる\nくちこみ\nくちさき\nくつした\nぐっすり\nくつろぐ\nくとうてん\nくどく\nくなん\nくねくね\nくのう\nくふう\nくみあわせ\nくみたてる\nくめる\nくやくしょ\nくらす\nくらべる\nくるま\nくれる\nくろう\nくわしい\nぐんかん\nぐんしょく\nぐんたい\nぐんて\nけあな\nけいかく\nけいけん\nけいこ\nけいさつ\nげいじゅつ\nけいたい\nげいのうじん\nけいれき\nけいろ\nけおとす\nけおりもの\nげきか\nげきげん\nげきだん\nげきちん\nげきとつ\nげきは\nげきやく\nげこう\nげこくじょう\nげざい\nけさき\nげざん\nけしき\nけしごむ\nけしょう\nげすと\nけたば\nけちゃっぷ\nけちらす\nけつあつ\nけつい\nけつえき\nけっこん\nけつじょ\nけっせき\nけってい\nけつまつ\nげつようび\nげつれい\nけつろん\nげどく\nけとばす\nけとる\nけなげ\nけなす\nけなみ\nけぬき\nげねつ\nけねん\nけはい\nげひん\nけぶかい\nげぼく\nけまり\nけみかる\nけむし\nけむり\nけもの\nけらい\nけろけろ\nけわしい\nけんい\nけんえつ\nけんお\nけんか\nげんき\nけんげん\nけんこう\nけんさく\nけんしゅう\nけんすう\nげんそう\nけんちく\nけんてい\nけんとう\nけんない\nけんにん\nげんぶつ\nけんま\nけんみん\nけんめい\nけんらん\nけんり\nこあくま\nこいぬ\nこいびと\nごうい\nこうえん\nこうおん\nこうかん\nごうきゅう\nごうけい\nこうこう\nこうさい\nこうじ\nこうすい\nごうせい\nこうそく\nこうたい\nこうちゃ\nこうつう\nこうてい\nこうどう\nこうない\nこうはい\nごうほう\nごうまん\nこうもく\nこうりつ\nこえる\nこおり\nごかい\nごがつ\nごかん\nこくご\nこくさい\nこくとう\nこくない\nこくはく\nこぐま\nこけい\nこける\nここのか\nこころ\nこさめ\nこしつ\nこすう\nこせい\nこせき\nこぜん\nこそだて\nこたい\nこたえる\nこたつ\nこちょう\nこっか\nこつこつ\nこつばん\nこつぶ\nこてい\nこてん\nことがら\nことし\nことば\nことり\nこなごな\nこねこね\nこのまま\nこのみ\nこのよ\nごはん\nこひつじ\nこふう\nこふん\nこぼれる\nごまあぶら\nこまかい\nごますり\nこまつな\nこまる\nこむぎこ\nこもじ\nこもち\nこもの\nこもん\nこやく\nこやま\nこゆう\nこゆび\nこよい\nこよう\nこりる\nこれくしょん\nころっけ\nこわもて\nこわれる\nこんいん\nこんかい\nこんき\nこんしゅう\nこんすい\nこんだて\nこんとん\nこんなん\nこんびに\nこんぽん\nこんまけ\nこんや\nこんれい\nこんわく\nざいえき\nさいかい\nさいきん\nざいげん\nざいこ\nさいしょ\nさいせい\nざいたく\nざいちゅう\nさいてき\nざいりょう\nさうな\nさかいし\nさがす\nさかな\nさかみち\nさがる\nさぎょう\nさくし\nさくひん\nさくら\nさこく\nさこつ\nさずかる\nざせき\nさたん\nさつえい\nざつおん\nざっか\nざつがく\nさっきょく\nざっし\nさつじん\nざっそう\nさつたば\nさつまいも\nさてい\nさといも\nさとう\nさとおや\nさとし\nさとる\nさのう\nさばく\nさびしい\nさべつ\nさほう\nさほど\nさます\nさみしい\nさみだれ\nさむけ\nさめる\nさやえんどう\nさゆう\nさよう\nさよく\nさらだ\nざるそば\nさわやか\nさわる\nさんいん\nさんか\nさんきゃく\nさんこう\nさんさい\nざんしょ\nさんすう\nさんせい\nさんそ\nさんち\nさんま\nさんみ\nさんらん\nしあい\nしあげ\nしあさって\nしあわせ\nしいく\nしいん\nしうち\nしえい\nしおけ\nしかい\nしかく\nじかん\nしごと\nしすう\nじだい\nしたうけ\nしたぎ\nしたて\nしたみ\nしちょう\nしちりん\nしっかり\nしつじ\nしつもん\nしてい\nしてき\nしてつ\nじてん\nじどう\nしなぎれ\nしなもの\nしなん\nしねま\nしねん\nしのぐ\nしのぶ\nしはい\nしばかり\nしはつ\nしはらい\nしはん\nしひょう\nしふく\nじぶん\nしへい\nしほう\nしほん\nしまう\nしまる\nしみん\nしむける\nじむしょ\nしめい\nしめる\nしもん\nしゃいん\nしゃうん\nしゃおん\nじゃがいも\nしやくしょ\nしゃくほう\nしゃけん\nしゃこ\nしゃざい\nしゃしん\nしゃせん\nしゃそう\nしゃたい\nしゃちょう\nしゃっきん\nじゃま\nしゃりん\nしゃれい\nじゆう\nじゅうしょ\nしゅくはく\nじゅしん\nしゅっせき\nしゅみ\nしゅらば\nじゅんばん\nしょうかい\nしょくたく\nしょっけん\nしょどう\nしょもつ\nしらせる\nしらべる\nしんか\nしんこう\nじんじゃ\nしんせいじ\nしんちく\nしんりん\nすあげ\nすあし\nすあな\nずあん\nすいえい\nすいか\nすいとう\nずいぶん\nすいようび\nすうがく\nすうじつ\nすうせん\nすおどり\nすきま\nすくう\nすくない\nすける\nすごい\nすこし\nずさん\nすずしい\nすすむ\nすすめる\nすっかり\nずっしり\nずっと\nすてき\nすてる\nすねる\nすのこ\nすはだ\nすばらしい\nずひょう\nずぶぬれ\nすぶり\nすふれ\nすべて\nすべる\nずほう\nすぼん\nすまい\nすめし\nすもう\nすやき\nすらすら\nするめ\nすれちがう\nすろっと\nすわる\nすんぜん\nすんぽう\nせあぶら\nせいかつ\nせいげん\nせいじ\nせいよう\nせおう\nせかいかん\nせきにん\nせきむ\nせきゆ\nせきらんうん\nせけん\nせこう\nせすじ\nせたい\nせたけ\nせっかく\nせっきゃく\nぜっく\nせっけん\nせっこつ\nせっさたくま\nせつぞく\nせつだん\nせつでん\nせっぱん\nせつび\nせつぶん\nせつめい\nせつりつ\nせなか\nせのび\nせはば\nせびろ\nせぼね\nせまい\nせまる\nせめる\nせもたれ\nせりふ\nぜんあく\nせんい\nせんえい\nせんか\nせんきょ\nせんく\nせんげん\nぜんご\nせんさい\nせんしゅ\nせんすい\nせんせい\nせんぞ\nせんたく\nせんちょう\nせんてい\nせんとう\nせんぬき\nせんねん\nせんぱい\nぜんぶ\nぜんぽう\nせんむ\nせんめんじょ\nせんもん\nせんやく\nせんゆう\nせんよう\nぜんら\nぜんりゃく\nせんれい\nせんろ\nそあく\nそいとげる\nそいね\nそうがんきょう\nそうき\nそうご\nそうしん\nそうだん\nそうなん\nそうび\nそうめん\nそうり\nそえもの\nそえん\nそがい\nそげき\nそこう\nそこそこ\nそざい\nそしな\nそせい\nそせん\nそそぐ\nそだてる\nそつう\nそつえん\nそっかん\nそつぎょう\nそっけつ\nそっこう\nそっせん\nそっと\nそとがわ\nそとづら\nそなえる\nそなた\nそふぼ\nそぼく\nそぼろ\nそまつ\nそまる\nそむく\nそむりえ\nそめる\nそもそも\nそよかぜ\nそらまめ\nそろう\nそんかい\nそんけい\nそんざい\nそんしつ\nそんぞく\nそんちょう\nぞんび\nぞんぶん\nそんみん\nたあい\nたいいん\nたいうん\nたいえき\nたいおう\nだいがく\nたいき\nたいぐう\nたいけん\nたいこ\nたいざい\nだいじょうぶ\nだいすき\nたいせつ\nたいそう\nだいたい\nたいちょう\nたいてい\nだいどころ\nたいない\nたいねつ\nたいのう\nたいはん\nだいひょう\nたいふう\nたいへん\nたいほ\nたいまつばな\nたいみんぐ\nたいむ\nたいめん\nたいやき\nたいよう\nたいら\nたいりょく\nたいる\nたいわん\nたうえ\nたえる\nたおす\nたおる\nたおれる\nたかい\nたかね\nたきび\nたくさん\nたこく\nたこやき\nたさい\nたしざん\nだじゃれ\nたすける\nたずさわる\nたそがれ\nたたかう\nたたく\nただしい\nたたみ\nたちばな\nだっかい\nだっきゃく\nだっこ\nだっしゅつ\nだったい\nたてる\nたとえる\nたなばた\nたにん\nたぬき\nたのしみ\nたはつ\nたぶん\nたべる\nたぼう\nたまご\nたまる\nだむる\nためいき\nためす\nためる\nたもつ\nたやすい\nたよる\nたらす\nたりきほんがん\nたりょう\nたりる\nたると\nたれる\nたれんと\nたろっと\nたわむれる\nだんあつ\nたんい\nたんおん\nたんか\nたんき\nたんけん\nたんご\nたんさん\nたんじょうび\nだんせい\nたんそく\nたんたい\nだんち\nたんてい\nたんとう\nだんな\nたんにん\nだんねつ\nたんのう\nたんぴん\nだんぼう\nたんまつ\nたんめい\nだんれつ\nだんろ\nだんわ\nちあい\nちあん\nちいき\nちいさい\nちえん\nちかい\nちから\nちきゅう\nちきん\nちけいず\nちけん\nちこく\nちさい\nちしき\nちしりょう\nちせい\nちそう\nちたい\nちたん\nちちおや\nちつじょ\nちてき\nちてん\nちぬき\nちぬり\nちのう\nちひょう\nちへいせん\nちほう\nちまた\nちみつ\nちみどろ\nちめいど\nちゃんこなべ\nちゅうい\nちゆりょく\nちょうし\nちょさくけん\nちらし\nちらみ\nちりがみ\nちりょう\nちるど\nちわわ\nちんたい\nちんもく\nついか\nついたち\nつうか\nつうじょう\nつうはん\nつうわ\nつかう\nつかれる\nつくね\nつくる\nつけね\nつける\nつごう\nつたえる\nつづく\nつつじ\nつつむ\nつとめる\nつながる\nつなみ\nつねづね\nつのる\nつぶす\nつまらない\nつまる\nつみき\nつめたい\nつもり\nつもる\nつよい\nつるぼ\nつるみく\nつわもの\nつわり\nてあし\nてあて\nてあみ\nていおん\nていか\nていき\nていけい\nていこく\nていさつ\nていし\nていせい\nていたい\nていど\nていねい\nていひょう\nていへん\nていぼう\nてうち\nておくれ\nてきとう\nてくび\nでこぼこ\nてさぎょう\nてさげ\nてすり\nてそう\nてちがい\nてちょう\nてつがく\nてつづき\nでっぱ\nてつぼう\nてつや\nでぬかえ\nてぬき\nてぬぐい\nてのひら\nてはい\nてぶくろ\nてふだ\nてほどき\nてほん\nてまえ\nてまきずし\nてみじか\nてみやげ\nてらす\nてれび\nてわけ\nてわたし\nでんあつ\nてんいん\nてんかい\nてんき\nてんぐ\nてんけん\nてんごく\nてんさい\nてんし\nてんすう\nでんち\nてんてき\nてんとう\nてんない\nてんぷら\nてんぼうだい\nてんめつ\nてんらんかい\nでんりょく\nでんわ\nどあい\nといれ\nどうかん\nとうきゅう\nどうぐ\nとうし\nとうむぎ\nとおい\nとおか\nとおく\nとおす\nとおる\nとかい\nとかす\nときおり\nときどき\nとくい\nとくしゅう\nとくてん\nとくに\nとくべつ\nとけい\nとける\nとこや\nとさか\nとしょかん\nとそう\nとたん\nとちゅう\nとっきゅう\nとっくん\nとつぜん\nとつにゅう\nとどける\nととのえる\nとない\nとなえる\nとなり\nとのさま\nとばす\nどぶがわ\nとほう\nとまる\nとめる\nともだち\nともる\nどようび\nとらえる\nとんかつ\nどんぶり\nないかく\nないこう\nないしょ\nないす\nないせん\nないそう\nなおす\nながい\nなくす\nなげる\nなこうど\nなさけ\nなたでここ\nなっとう\nなつやすみ\nななおし\nなにごと\nなにもの\nなにわ\nなのか\nなふだ\nなまいき\nなまえ\nなまみ\nなみだ\nなめらか\nなめる\nなやむ\nならう\nならび\nならぶ\nなれる\nなわとび\nなわばり\nにあう\nにいがた\nにうけ\nにおい\nにかい\nにがて\nにきび\nにくしみ\nにくまん\nにげる\nにさんかたんそ\nにしき\nにせもの\nにちじょう\nにちようび\nにっか\nにっき\nにっけい\nにっこう\nにっさん\nにっしょく\nにっすう\nにっせき\nにってい\nになう\nにほん\nにまめ\nにもつ\nにやり\nにゅういん\nにりんしゃ\nにわとり\nにんい\nにんか\nにんき\nにんげん\nにんしき\nにんずう\nにんそう\nにんたい\nにんち\nにんてい\nにんにく\nにんぷ\nにんまり\nにんむ\nにんめい\nにんよう\nぬいくぎ\nぬかす\nぬぐいとる\nぬぐう\nぬくもり\nぬすむ\nぬまえび\nぬめり\nぬらす\nぬんちゃく\nねあげ\nねいき\nねいる\nねいろ\nねぐせ\nねくたい\nねくら\nねこぜ\nねこむ\nねさげ\nねすごす\nねそべる\nねだん\nねつい\nねっしん\nねつぞう\nねったいぎょ\nねぶそく\nねふだ\nねぼう\nねほりはほり\nねまき\nねまわし\nねみみ\nねむい\nねむたい\nねもと\nねらう\nねわざ\nねんいり\nねんおし\nねんかん\nねんきん\nねんぐ\nねんざ\nねんし\nねんちゃく\nねんど\nねんぴ\nねんぶつ\nねんまつ\nねんりょう\nねんれい\nのいず\nのおづま\nのがす\nのきなみ\nのこぎり\nのこす\nのこる\nのせる\nのぞく\nのぞむ\nのたまう\nのちほど\nのっく\nのばす\nのはら\nのべる\nのぼる\nのみもの\nのやま\nのらいぬ\nのらねこ\nのりもの\nのりゆき\nのれん\nのんき\nばあい\nはあく\nばあさん\nばいか\nばいく\nはいけん\nはいご\nはいしん\nはいすい\nはいせん\nはいそう\nはいち\nばいばい\nはいれつ\nはえる\nはおる\nはかい\nばかり\nはかる\nはくしゅ\nはけん\nはこぶ\nはさみ\nはさん\nはしご\nばしょ\nはしる\nはせる\nぱそこん\nはそん\nはたん\nはちみつ\nはつおん\nはっかく\nはづき\nはっきり\nはっくつ\nはっけん\nはっこう\nはっさん\nはっしん\nはったつ\nはっちゅう\nはってん\nはっぴょう\nはっぽう\nはなす\nはなび\nはにかむ\nはぶらし\nはみがき\nはむかう\nはめつ\nはやい\nはやし\nはらう\nはろうぃん\nはわい\nはんい\nはんえい\nはんおん\nはんかく\nはんきょう\nばんぐみ\nはんこ\nはんしゃ\nはんすう\nはんだん\nぱんち\nぱんつ\nはんてい\nはんとし\nはんのう\nはんぱ\nはんぶん\nはんぺん\nはんぼうき\nはんめい\nはんらん\nはんろん\nひいき\nひうん\nひえる\nひかく\nひかり\nひかる\nひかん\nひくい\nひけつ\nひこうき\nひこく\nひさい\nひさしぶり\nひさん\nびじゅつかん\nひしょ\nひそか\nひそむ\nひたむき\nひだり\nひたる\nひつぎ\nひっこし\nひっし\nひつじゅひん\nひっす\nひつぜん\nぴったり\nぴっちり\nひつよう\nひてい\nひとごみ\nひなまつり\nひなん\nひねる\nひはん\nひびく\nひひょう\nひほう\nひまわり\nひまん\nひみつ\nひめい\nひめじし\nひやけ\nひやす\nひよう\nびょうき\nひらがな\nひらく\nひりつ\nひりょう\nひるま\nひるやすみ\nひれい\nひろい\nひろう\nひろき\nひろゆき\nひんかく\nひんけつ\nひんこん\nひんしゅ\nひんそう\nぴんち\nひんぱん\nびんぼう\nふあん\nふいうち\nふうけい\nふうせん\nぷうたろう\nふうとう\nふうふ\nふえる\nふおん\nふかい\nふきん\nふくざつ\nふくぶくろ\nふこう\nふさい\nふしぎ\nふじみ\nふすま\nふせい\nふせぐ\nふそく\nぶたにく\nふたん\nふちょう\nふつう\nふつか\nふっかつ\nふっき\nふっこく\nぶどう\nふとる\nふとん\nふのう\nふはい\nふひょう\nふへん\nふまん\nふみん\nふめつ\nふめん\nふよう\nふりこ\nふりる\nふるい\nふんいき\nぶんがく\nぶんぐ\nふんしつ\nぶんせき\nふんそう\nぶんぽう\nへいあん\nへいおん\nへいがい\nへいき\nへいげん\nへいこう\nへいさ\nへいしゃ\nへいせつ\nへいそ\nへいたく\nへいてん\nへいねつ\nへいわ\nへきが\nへこむ\nべにいろ\nべにしょうが\nへらす\nへんかん\nべんきょう\nべんごし\nへんさい\nへんたい\nべんり\nほあん\nほいく\nぼうぎょ\nほうこく\nほうそう\nほうほう\nほうもん\nほうりつ\nほえる\nほおん\nほかん\nほきょう\nぼきん\nほくろ\nほけつ\nほけん\nほこう\nほこる\nほしい\nほしつ\nほしゅ\nほしょう\nほせい\nほそい\nほそく\nほたて\nほたる\nぽちぶくろ\nほっきょく\nほっさ\nほったん\nほとんど\nほめる\nほんい\nほんき\nほんけ\nほんしつ\nほんやく\nまいにち\nまかい\nまかせる\nまがる\nまける\nまこと\nまさつ\nまじめ\nますく\nまぜる\nまつり\nまとめ\nまなぶ\nまぬけ\nまねく\nまほう\nまもる\nまゆげ\nまよう\nまろやか\nまわす\nまわり\nまわる\nまんが\nまんきつ\nまんぞく\nまんなか\nみいら\nみうち\nみえる\nみがく\nみかた\nみかん\nみけん\nみこん\nみじかい\nみすい\nみすえる\nみせる\nみっか\nみつかる\nみつける\nみてい\nみとめる\nみなと\nみなみかさい\nみねらる\nみのう\nみのがす\nみほん\nみもと\nみやげ\nみらい\nみりょく\nみわく\nみんか\nみんぞく\nむいか\nむえき\nむえん\nむかい\nむかう\nむかえ\nむかし\nむぎちゃ\nむける\nむげん\nむさぼる\nむしあつい\nむしば\nむじゅん\nむしろ\nむすう\nむすこ\nむすぶ\nむすめ\nむせる\nむせん\nむちゅう\nむなしい\nむのう\nむやみ\nむよう\nむらさき\nむりょう\nむろん\nめいあん\nめいうん\nめいえん\nめいかく\nめいきょく\nめいさい\nめいし\nめいそう\nめいぶつ\nめいれい\nめいわく\nめぐまれる\nめざす\nめした\nめずらしい\nめだつ\nめまい\nめやす\nめんきょ\nめんせき\nめんどう\nもうしあげる\nもうどうけん\nもえる\nもくし\nもくてき\nもくようび\nもちろん\nもどる\nもらう\nもんく\nもんだい\nやおや\nやける\nやさい\nやさしい\nやすい\nやすたろう\nやすみ\nやせる\nやそう\nやたい\nやちん\nやっと\nやっぱり\nやぶる\nやめる\nややこしい\nやよい\nやわらかい\nゆうき\nゆうびんきょく\nゆうべ\nゆうめい\nゆけつ\nゆしゅつ\nゆせん\nゆそう\nゆたか\nゆちゃく\nゆでる\nゆにゅう\nゆびわ\nゆらい\nゆれる\nようい\nようか\nようきゅう\nようじ\nようす\nようちえん\nよかぜ\nよかん\nよきん\nよくせい\nよくぼう\nよけい\nよごれる\nよさん\nよしゅう\nよそう\nよそく\nよっか\nよてい\nよどがわく\nよねつ\nよやく\nよゆう\nよろこぶ\nよろしい\nらいう\nらくがき\nらくご\nらくさつ\nらくだ\nらしんばん\nらせん\nらぞく\nらたい\nらっか\nられつ\nりえき\nりかい\nりきさく\nりきせつ\nりくぐん\nりくつ\nりけん\nりこう\nりせい\nりそう\nりそく\nりてん\nりねん\nりゆう\nりゅうがく\nりよう\nりょうり\nりょかん\nりょくちゃ\nりょこう\nりりく\nりれき\nりろん\nりんご\nるいけい\nるいさい\nるいじ\nるいせき\nるすばん\nるりがわら\nれいかん\nれいぎ\nれいせい\nれいぞうこ\nれいとう\nれいぼう\nれきし\nれきだい\nれんあい\nれんけい\nれんこん\nれんさい\nれんしゅう\nれんぞく\nれんらく\nろうか\nろうご\nろうじん\nろうそく\nろくが\nろこつ\nろじうら\nろしゅつ\nろせん\nろてん\nろめん\nろれつ\nろんぎ\nろんぱ\nろんぶん\nろんり\nわかす\nわかめ\nわかやま\nわかれる\nわしつ\nわじまし\nわすれもの\nわらう\nわれる\n`\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/korean.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt\n\t// $ crc32 korean.txt\n\t// 4ef461eb\n\tchecksum := crc32.ChecksumIEEE([]byte(korean))\n\tif fmt.Sprintf(\"%x\", checksum) != \"4ef461eb\" {\n\t\tpanic(\"korean checksum invalid\")\n\t}\n}\n\n// Korean is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/korean.txt\nvar Korean = strings.Split(strings.TrimSpace(korean), \"\\n\")\nvar korean = `가격\n가끔\n가난\n가능\n가득\n가르침\n가뭄\n가방\n가상\n가슴\n가운데\n가을\n가이드\n가입\n가장\n가정\n가족\n가죽\n각오\n각자\n간격\n간부\n간섭\n간장\n간접\n간판\n갈등\n갈비\n갈색\n갈증\n감각\n감기\n감소\n감수성\n감자\n감정\n갑자기\n강남\n강당\n강도\n강력히\n강변\n강북\n강사\n강수량\n강아지\n강원도\n강의\n강제\n강조\n같이\n개구리\n개나리\n개방\n개별\n개선\n개성\n개인\n객관적\n거실\n거액\n거울\n거짓\n거품\n걱정\n건강\n건물\n건설\n건조\n건축\n걸음\n검사\n검토\n게시판\n게임\n겨울\n견해\n결과\n결국\n결론\n결석\n결승\n결심\n결정\n결혼\n경계\n경고\n경기\n경력\n경복궁\n경비\n경상도\n경영\n경우\n경쟁\n경제\n경주\n경찰\n경치\n경향\n경험\n계곡\n계단\n계란\n계산\n계속\n계약\n계절\n계층\n계획\n고객\n고구려\n고궁\n고급\n고등학생\n고무신\n고민\n고양이\n고장\n고전\n고집\n고춧가루\n고통\n고향\n곡식\n골목\n골짜기\n골프\n공간\n공개\n공격\n공군\n공급\n공기\n공동\n공무원\n공부\n공사\n공식\n공업\n공연\n공원\n공장\n공짜\n공책\n공통\n공포\n공항\n공휴일\n과목\n과일\n과장\n과정\n과학\n관객\n관계\n관광\n관념\n관람\n관련\n관리\n관습\n관심\n관점\n관찰\n광경\n광고\n광장\n광주\n괴로움\n굉장히\n교과서\n교문\n교복\n교실\n교양\n교육\n교장\n교직\n교통\n교환\n교훈\n구경\n구름\n구멍\n구별\n구분\n구석\n구성\n구속\n구역\n구입\n구청\n구체적\n국가\n국기\n국내\n국립\n국물\n국민\n국수\n국어\n국왕\n국적\n국제\n국회\n군대\n군사\n군인\n궁극적\n권리\n권위\n권투\n귀국\n귀신\n규정\n규칙\n균형\n그날\n그냥\n그늘\n그러나\n그룹\n그릇\n그림\n그제서야\n그토록\n극복\n극히\n근거\n근교\n근래\n근로\n근무\n근본\n근원\n근육\n근처\n글씨\n글자\n금강산\n금고\n금년\n금메달\n금액\n금연\n금요일\n금지\n긍정적\n기간\n기관\n기념\n기능\n기독교\n기둥\n기록\n기름\n기법\n기본\n기분\n기쁨\n기숙사\n기술\n기억\n기업\n기온\n기운\n기원\n기적\n기준\n기침\n기혼\n기획\n긴급\n긴장\n길이\n김밥\n김치\n김포공항\n깍두기\n깜빡\n깨달음\n깨소금\n껍질\n꼭대기\n꽃잎\n나들이\n나란히\n나머지\n나물\n나침반\n나흘\n낙엽\n난방\n날개\n날씨\n날짜\n남녀\n남대문\n남매\n남산\n남자\n남편\n남학생\n낭비\n낱말\n내년\n내용\n내일\n냄비\n냄새\n냇물\n냉동\n냉면\n냉방\n냉장고\n넥타이\n넷째\n노동\n노란색\n노력\n노인\n녹음\n녹차\n녹화\n논리\n논문\n논쟁\n놀이\n농구\n농담\n농민\n농부\n농업\n농장\n농촌\n높이\n눈동자\n눈물\n눈썹\n뉴욕\n느낌\n늑대\n능동적\n능력\n다방\n다양성\n다음\n다이어트\n다행\n단계\n단골\n단독\n단맛\n단순\n단어\n단위\n단점\n단체\n단추\n단편\n단풍\n달걀\n달러\n달력\n달리\n닭고기\n담당\n담배\n담요\n담임\n답변\n답장\n당근\n당분간\n당연히\n당장\n대규모\n대낮\n대단히\n대답\n대도시\n대략\n대량\n대륙\n대문\n대부분\n대신\n대응\n대장\n대전\n대접\n대중\n대책\n대출\n대충\n대통령\n대학\n대한민국\n대합실\n대형\n덩어리\n데이트\n도대체\n도덕\n도둑\n도망\n도서관\n도심\n도움\n도입\n도자기\n도저히\n도전\n도중\n도착\n독감\n독립\n독서\n독일\n독창적\n동화책\n뒷모습\n뒷산\n딸아이\n마누라\n마늘\n마당\n마라톤\n마련\n마무리\n마사지\n마약\n마요네즈\n마을\n마음\n마이크\n마중\n마지막\n마찬가지\n마찰\n마흔\n막걸리\n막내\n막상\n만남\n만두\n만세\n만약\n만일\n만점\n만족\n만화\n많이\n말기\n말씀\n말투\n맘대로\n망원경\n매년\n매달\n매력\n매번\n매스컴\n매일\n매장\n맥주\n먹이\n먼저\n먼지\n멀리\n메일\n며느리\n며칠\n면담\n멸치\n명단\n명령\n명예\n명의\n명절\n명칭\n명함\n모금\n모니터\n모델\n모든\n모범\n모습\n모양\n모임\n모조리\n모집\n모퉁이\n목걸이\n목록\n목사\n목소리\n목숨\n목적\n목표\n몰래\n몸매\n몸무게\n몸살\n몸속\n몸짓\n몸통\n몹시\n무관심\n무궁화\n무더위\n무덤\n무릎\n무슨\n무엇\n무역\n무용\n무조건\n무지개\n무척\n문구\n문득\n문법\n문서\n문제\n문학\n문화\n물가\n물건\n물결\n물고기\n물론\n물리학\n물음\n물질\n물체\n미국\n미디어\n미사일\n미술\n미역\n미용실\n미움\n미인\n미팅\n미혼\n민간\n민족\n민주\n믿음\n밀가루\n밀리미터\n밑바닥\n바가지\n바구니\n바나나\n바늘\n바닥\n바닷가\n바람\n바이러스\n바탕\n박물관\n박사\n박수\n반대\n반드시\n반말\n반발\n반성\n반응\n반장\n반죽\n반지\n반찬\n받침\n발가락\n발걸음\n발견\n발달\n발레\n발목\n발바닥\n발생\n발음\n발자국\n발전\n발톱\n발표\n밤하늘\n밥그릇\n밥맛\n밥상\n밥솥\n방금\n방면\n방문\n방바닥\n방법\n방송\n방식\n방안\n방울\n방지\n방학\n방해\n방향\n배경\n배꼽\n배달\n배드민턴\n백두산\n백색\n백성\n백인\n백제\n백화점\n버릇\n버섯\n버튼\n번개\n번역\n번지\n번호\n벌금\n벌레\n벌써\n범위\n범인\n범죄\n법률\n법원\n법적\n법칙\n베이징\n벨트\n변경\n변동\n변명\n변신\n변호사\n변화\n별도\n별명\n별일\n병실\n병아리\n병원\n보관\n보너스\n보라색\n보람\n보름\n보상\n보안\n보자기\n보장\n보전\n보존\n보통\n보편적\n보험\n복도\n복사\n복숭아\n복습\n볶음\n본격적\n본래\n본부\n본사\n본성\n본인\n본질\n볼펜\n봉사\n봉지\n봉투\n부근\n부끄러움\n부담\n부동산\n부문\n부분\n부산\n부상\n부엌\n부인\n부작용\n부장\n부정\n부족\n부지런히\n부친\n부탁\n부품\n부회장\n북부\n북한\n분노\n분량\n분리\n분명\n분석\n분야\n분위기\n분필\n분홍색\n불고기\n불과\n불교\n불꽃\n불만\n불법\n불빛\n불안\n불이익\n불행\n브랜드\n비극\n비난\n비닐\n비둘기\n비디오\n비로소\n비만\n비명\n비밀\n비바람\n비빔밥\n비상\n비용\n비율\n비중\n비타민\n비판\n빌딩\n빗물\n빗방울\n빗줄기\n빛깔\n빨간색\n빨래\n빨리\n사건\n사계절\n사나이\n사냥\n사람\n사랑\n사립\n사모님\n사물\n사방\n사상\n사생활\n사설\n사슴\n사실\n사업\n사용\n사월\n사장\n사전\n사진\n사촌\n사춘기\n사탕\n사투리\n사흘\n산길\n산부인과\n산업\n산책\n살림\n살인\n살짝\n삼계탕\n삼국\n삼십\n삼월\n삼촌\n상관\n상금\n상대\n상류\n상반기\n상상\n상식\n상업\n상인\n상자\n상점\n상처\n상추\n상태\n상표\n상품\n상황\n새벽\n색깔\n색연필\n생각\n생명\n생물\n생방송\n생산\n생선\n생신\n생일\n생활\n서랍\n서른\n서명\n서민\n서비스\n서양\n서울\n서적\n서점\n서쪽\n서클\n석사\n석유\n선거\n선물\n선배\n선생\n선수\n선원\n선장\n선전\n선택\n선풍기\n설거지\n설날\n설렁탕\n설명\n설문\n설사\n설악산\n설치\n설탕\n섭씨\n성공\n성당\n성명\n성별\n성인\n성장\n성적\n성질\n성함\n세금\n세미나\n세상\n세월\n세종대왕\n세탁\n센터\n센티미터\n셋째\n소규모\n소극적\n소금\n소나기\n소년\n소득\n소망\n소문\n소설\n소속\n소아과\n소용\n소원\n소음\n소중히\n소지품\n소질\n소풍\n소형\n속담\n속도\n속옷\n손가락\n손길\n손녀\n손님\n손등\n손목\n손뼉\n손실\n손질\n손톱\n손해\n솔직히\n솜씨\n송아지\n송이\n송편\n쇠고기\n쇼핑\n수건\n수년\n수단\n수돗물\n수동적\n수면\n수명\n수박\n수상\n수석\n수술\n수시로\n수업\n수염\n수영\n수입\n수준\n수집\n수출\n수컷\n수필\n수학\n수험생\n수화기\n숙녀\n숙소\n숙제\n순간\n순서\n순수\n순식간\n순위\n숟가락\n술병\n술집\n숫자\n스님\n스물\n스스로\n스승\n스웨터\n스위치\n스케이트\n스튜디오\n스트레스\n스포츠\n슬쩍\n슬픔\n습관\n습기\n승객\n승리\n승부\n승용차\n승진\n시각\n시간\n시골\n시금치\n시나리오\n시댁\n시리즈\n시멘트\n시민\n시부모\n시선\n시설\n시스템\n시아버지\n시어머니\n시월\n시인\n시일\n시작\n시장\n시절\n시점\n시중\n시즌\n시집\n시청\n시합\n시험\n식구\n식기\n식당\n식량\n식료품\n식물\n식빵\n식사\n식생활\n식초\n식탁\n식품\n신고\n신규\n신념\n신문\n신발\n신비\n신사\n신세\n신용\n신제품\n신청\n신체\n신화\n실감\n실내\n실력\n실례\n실망\n실수\n실습\n실시\n실장\n실정\n실질적\n실천\n실체\n실컷\n실태\n실패\n실험\n실현\n심리\n심부름\n심사\n심장\n심정\n심판\n쌍둥이\n씨름\n씨앗\n아가씨\n아나운서\n아드님\n아들\n아쉬움\n아스팔트\n아시아\n아울러\n아저씨\n아줌마\n아직\n아침\n아파트\n아프리카\n아픔\n아홉\n아흔\n악기\n악몽\n악수\n안개\n안경\n안과\n안내\n안녕\n안동\n안방\n안부\n안주\n알루미늄\n알코올\n암시\n암컷\n압력\n앞날\n앞문\n애인\n애정\n액수\n앨범\n야간\n야단\n야옹\n약간\n약국\n약속\n약수\n약점\n약품\n약혼녀\n양념\n양력\n양말\n양배추\n양주\n양파\n어둠\n어려움\n어른\n어젯밤\n어쨌든\n어쩌다가\n어쩐지\n언니\n언덕\n언론\n언어\n얼굴\n얼른\n얼음\n얼핏\n엄마\n업무\n업종\n업체\n엉덩이\n엉망\n엉터리\n엊그제\n에너지\n에어컨\n엔진\n여건\n여고생\n여관\n여군\n여권\n여대생\n여덟\n여동생\n여든\n여론\n여름\n여섯\n여성\n여왕\n여인\n여전히\n여직원\n여학생\n여행\n역사\n역시\n역할\n연결\n연구\n연극\n연기\n연락\n연설\n연세\n연속\n연습\n연애\n연예인\n연인\n연장\n연주\n연출\n연필\n연합\n연휴\n열기\n열매\n열쇠\n열심히\n열정\n열차\n열흘\n염려\n엽서\n영국\n영남\n영상\n영양\n영역\n영웅\n영원히\n영하\n영향\n영혼\n영화\n옆구리\n옆방\n옆집\n예감\n예금\n예방\n예산\n예상\n예선\n예술\n예습\n예식장\n예약\n예전\n예절\n예정\n예컨대\n옛날\n오늘\n오락\n오랫동안\n오렌지\n오로지\n오른발\n오븐\n오십\n오염\n오월\n오전\n오직\n오징어\n오페라\n오피스텔\n오히려\n옥상\n옥수수\n온갖\n온라인\n온몸\n온종일\n온통\n올가을\n올림픽\n올해\n옷차림\n와이셔츠\n와인\n완성\n완전\n왕비\n왕자\n왜냐하면\n왠지\n외갓집\n외국\n외로움\n외삼촌\n외출\n외침\n외할머니\n왼발\n왼손\n왼쪽\n요금\n요일\n요즘\n요청\n용기\n용서\n용어\n우산\n우선\n우승\n우연히\n우정\n우체국\n우편\n운동\n운명\n운반\n운전\n운행\n울산\n울음\n움직임\n웃어른\n웃음\n워낙\n원고\n원래\n원서\n원숭이\n원인\n원장\n원피스\n월급\n월드컵\n월세\n월요일\n웨이터\n위반\n위법\n위성\n위원\n위험\n위협\n윗사람\n유난히\n유럽\n유명\n유물\n유산\n유적\n유치원\n유학\n유행\n유형\n육군\n육상\n육십\n육체\n은행\n음력\n음료\n음반\n음성\n음식\n음악\n음주\n의견\n의논\n의문\n의복\n의식\n의심\n의외로\n의욕\n의원\n의학\n이것\n이곳\n이념\n이놈\n이달\n이대로\n이동\n이렇게\n이력서\n이론적\n이름\n이민\n이발소\n이별\n이불\n이빨\n이상\n이성\n이슬\n이야기\n이용\n이웃\n이월\n이윽고\n이익\n이전\n이중\n이튿날\n이틀\n이혼\n인간\n인격\n인공\n인구\n인근\n인기\n인도\n인류\n인물\n인생\n인쇄\n인연\n인원\n인재\n인종\n인천\n인체\n인터넷\n인하\n인형\n일곱\n일기\n일단\n일대\n일등\n일반\n일본\n일부\n일상\n일생\n일손\n일요일\n일월\n일정\n일종\n일주일\n일찍\n일체\n일치\n일행\n일회용\n임금\n임무\n입대\n입력\n입맛\n입사\n입술\n입시\n입원\n입장\n입학\n자가용\n자격\n자극\n자동\n자랑\n자부심\n자식\n자신\n자연\n자원\n자율\n자전거\n자정\n자존심\n자판\n작가\n작년\n작성\n작업\n작용\n작은딸\n작품\n잔디\n잔뜩\n잔치\n잘못\n잠깐\n잠수함\n잠시\n잠옷\n잠자리\n잡지\n장관\n장군\n장기간\n장래\n장례\n장르\n장마\n장면\n장모\n장미\n장비\n장사\n장소\n장식\n장애인\n장인\n장점\n장차\n장학금\n재능\n재빨리\n재산\n재생\n재작년\n재정\n재채기\n재판\n재학\n재활용\n저것\n저고리\n저곳\n저녁\n저런\n저렇게\n저번\n저울\n저절로\n저축\n적극\n적당히\n적성\n적용\n적응\n전개\n전공\n전기\n전달\n전라도\n전망\n전문\n전반\n전부\n전세\n전시\n전용\n전자\n전쟁\n전주\n전철\n전체\n전통\n전혀\n전후\n절대\n절망\n절반\n절약\n절차\n점검\n점수\n점심\n점원\n점점\n점차\n접근\n접시\n접촉\n젓가락\n정거장\n정도\n정류장\n정리\n정말\n정면\n정문\n정반대\n정보\n정부\n정비\n정상\n정성\n정오\n정원\n정장\n정지\n정치\n정확히\n제공\n제과점\n제대로\n제목\n제발\n제법\n제삿날\n제안\n제일\n제작\n제주도\n제출\n제품\n제한\n조각\n조건\n조금\n조깅\n조명\n조미료\n조상\n조선\n조용히\n조절\n조정\n조직\n존댓말\n존재\n졸업\n졸음\n종교\n종로\n종류\n종소리\n종업원\n종종\n종합\n좌석\n죄인\n주관적\n주름\n주말\n주머니\n주먹\n주문\n주민\n주방\n주변\n주식\n주인\n주일\n주장\n주전자\n주택\n준비\n줄거리\n줄기\n줄무늬\n중간\n중계방송\n중국\n중년\n중단\n중독\n중반\n중부\n중세\n중소기업\n중순\n중앙\n중요\n중학교\n즉석\n즉시\n즐거움\n증가\n증거\n증권\n증상\n증세\n지각\n지갑\n지경\n지극히\n지금\n지급\n지능\n지름길\n지리산\n지방\n지붕\n지식\n지역\n지우개\n지원\n지적\n지점\n지진\n지출\n직선\n직업\n직원\n직장\n진급\n진동\n진로\n진료\n진리\n진짜\n진찰\n진출\n진통\n진행\n질문\n질병\n질서\n짐작\n집단\n집안\n집중\n짜증\n찌꺼기\n차남\n차라리\n차량\n차림\n차별\n차선\n차츰\n착각\n찬물\n찬성\n참가\n참기름\n참새\n참석\n참여\n참외\n참조\n찻잔\n창가\n창고\n창구\n창문\n창밖\n창작\n창조\n채널\n채점\n책가방\n책방\n책상\n책임\n챔피언\n처벌\n처음\n천국\n천둥\n천장\n천재\n천천히\n철도\n철저히\n철학\n첫날\n첫째\n청년\n청바지\n청소\n청춘\n체계\n체력\n체온\n체육\n체중\n체험\n초등학생\n초반\n초밥\n초상화\n초순\n초여름\n초원\n초저녁\n초점\n초청\n초콜릿\n촛불\n총각\n총리\n총장\n촬영\n최근\n최상\n최선\n최신\n최악\n최종\n추석\n추억\n추진\n추천\n추측\n축구\n축소\n축제\n축하\n출근\n출발\n출산\n출신\n출연\n출입\n출장\n출판\n충격\n충고\n충돌\n충분히\n충청도\n취업\n취직\n취향\n치약\n친구\n친척\n칠십\n칠월\n칠판\n침대\n침묵\n침실\n칫솔\n칭찬\n카메라\n카운터\n칼국수\n캐릭터\n캠퍼스\n캠페인\n커튼\n컨디션\n컬러\n컴퓨터\n코끼리\n코미디\n콘서트\n콜라\n콤플렉스\n콩나물\n쾌감\n쿠데타\n크림\n큰길\n큰딸\n큰소리\n큰아들\n큰어머니\n큰일\n큰절\n클래식\n클럽\n킬로\n타입\n타자기\n탁구\n탁자\n탄생\n태권도\n태양\n태풍\n택시\n탤런트\n터널\n터미널\n테니스\n테스트\n테이블\n텔레비전\n토론\n토마토\n토요일\n통계\n통과\n통로\n통신\n통역\n통일\n통장\n통제\n통증\n통합\n통화\n퇴근\n퇴원\n퇴직금\n튀김\n트럭\n특급\n특별\n특성\n특수\n특징\n특히\n튼튼히\n티셔츠\n파란색\n파일\n파출소\n판결\n판단\n판매\n판사\n팔십\n팔월\n팝송\n패션\n팩스\n팩시밀리\n팬티\n퍼센트\n페인트\n편견\n편의\n편지\n편히\n평가\n평균\n평생\n평소\n평양\n평일\n평화\n포스터\n포인트\n포장\n포함\n표면\n표정\n표준\n표현\n품목\n품질\n풍경\n풍속\n풍습\n프랑스\n프린터\n플라스틱\n피곤\n피망\n피아노\n필름\n필수\n필요\n필자\n필통\n핑계\n하느님\n하늘\n하드웨어\n하룻밤\n하반기\n하숙집\n하순\n하여튼\n하지만\n하천\n하품\n하필\n학과\n학교\n학급\n학기\n학년\n학력\n학번\n학부모\n학비\n학생\n학술\n학습\n학용품\n학원\n학위\n학자\n학점\n한계\n한글\n한꺼번에\n한낮\n한눈\n한동안\n한때\n한라산\n한마디\n한문\n한번\n한복\n한식\n한여름\n한쪽\n할머니\n할아버지\n할인\n함께\n함부로\n합격\n합리적\n항공\n항구\n항상\n항의\n해결\n해군\n해답\n해당\n해물\n해석\n해설\n해수욕장\n해안\n핵심\n핸드백\n햄버거\n햇볕\n햇살\n행동\n행복\n행사\n행운\n행위\n향기\n향상\n향수\n허락\n허용\n헬기\n현관\n현금\n현대\n현상\n현실\n현장\n현재\n현지\n혈액\n협력\n형부\n형사\n형수\n형식\n형제\n형태\n형편\n혜택\n호기심\n호남\n호랑이\n호박\n호텔\n호흡\n혹시\n홀로\n홈페이지\n홍보\n홍수\n홍차\n화면\n화분\n화살\n화요일\n화장\n화학\n확보\n확인\n확장\n확정\n환갑\n환경\n환영\n환율\n환자\n활기\n활동\n활발히\n활용\n활짝\n회견\n회관\n회복\n회색\n회원\n회장\n회전\n횟수\n횡단보도\n효율적\n후반\n후춧가루\n훈련\n훨씬\n휴식\n휴일\n흉내\n흐름\n흑백\n흑인\n흔적\n흔히\n흥미\n흥분\n희곡\n희망\n희생\n흰색\n힘껏\n`\n"
  },
  {
    "path": "vendor/github.com/tyler-smith/go-bip39/wordlists/spanish.go",
    "content": "package wordlists\n\nimport (\n\t\"fmt\"\n\t\"hash/crc32\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Ensure word list is correct\n\t// $ wget https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt\n\t// $ crc32 spanish.txt\n\t// 266e4f3d\n\tchecksum := crc32.ChecksumIEEE([]byte(spanish))\n\tif fmt.Sprintf(\"%x\", checksum) != \"266e4f3d\" {\n\t\tpanic(\"spanish checksum invalid\")\n\t}\n}\n\n// Spanish is a slice of mnemonic words taken from the bip39 specification\n// https://raw.githubusercontent.com/bitcoin/bips/master/bip-0039/spanish.txt\nvar Spanish = strings.Split(strings.TrimSpace(spanish), \"\\n\")\nvar spanish = `ábaco\nabdomen\nabeja\nabierto\nabogado\nabono\naborto\nabrazo\nabrir\nabuelo\nabuso\nacabar\nacademia\nacceso\nacción\naceite\nacelga\nacento\naceptar\nácido\naclarar\nacné\nacoger\nacoso\nactivo\nacto\nactriz\nactuar\nacudir\nacuerdo\nacusar\nadicto\nadmitir\nadoptar\nadorno\naduana\nadulto\naéreo\nafectar\nafición\nafinar\nafirmar\nágil\nagitar\nagonía\nagosto\nagotar\nagregar\nagrio\nagua\nagudo\náguila\naguja\nahogo\nahorro\naire\naislar\najedrez\najeno\najuste\nalacrán\nalambre\nalarma\nalba\nálbum\nalcalde\naldea\nalegre\nalejar\nalerta\naleta\nalfiler\nalga\nalgodón\naliado\naliento\nalivio\nalma\nalmeja\nalmíbar\naltar\nalteza\naltivo\nalto\naltura\nalumno\nalzar\namable\namante\namapola\namargo\namasar\námbar\námbito\nameno\namigo\namistad\namor\namparo\namplio\nancho\nanciano\nancla\nandar\nandén\nanemia\nángulo\nanillo\nánimo\nanís\nanotar\nantena\nantiguo\nantojo\nanual\nanular\nanuncio\nañadir\nañejo\naño\napagar\naparato\napetito\napio\naplicar\napodo\naporte\napoyo\naprender\naprobar\napuesta\napuro\narado\naraña\narar\nárbitro\nárbol\narbusto\narchivo\narco\narder\nardilla\narduo\nárea\nárido\naries\narmonía\narnés\naroma\narpa\narpón\narreglo\narroz\narruga\narte\nartista\nasa\nasado\nasalto\nascenso\nasegurar\naseo\nasesor\nasiento\nasilo\nasistir\nasno\nasombro\náspero\nastilla\nastro\nastuto\nasumir\nasunto\natajo\nataque\natar\natento\nateo\nático\natleta\nátomo\natraer\natroz\natún\naudaz\naudio\nauge\naula\naumento\nausente\nautor\naval\navance\navaro\nave\navellana\navena\navestruz\navión\naviso\nayer\nayuda\nayuno\nazafrán\nazar\nazote\nazúcar\nazufre\nazul\nbaba\nbabor\nbache\nbahía\nbaile\nbajar\nbalanza\nbalcón\nbalde\nbambú\nbanco\nbanda\nbaño\nbarba\nbarco\nbarniz\nbarro\nbáscula\nbastón\nbasura\nbatalla\nbatería\nbatir\nbatuta\nbaúl\nbazar\nbebé\nbebida\nbello\nbesar\nbeso\nbestia\nbicho\nbien\nbingo\nblanco\nbloque\nblusa\nboa\nbobina\nbobo\nboca\nbocina\nboda\nbodega\nboina\nbola\nbolero\nbolsa\nbomba\nbondad\nbonito\nbono\nbonsái\nborde\nborrar\nbosque\nbote\nbotín\nbóveda\nbozal\nbravo\nbrazo\nbrecha\nbreve\nbrillo\nbrinco\nbrisa\nbroca\nbroma\nbronce\nbrote\nbruja\nbrusco\nbruto\nbuceo\nbucle\nbueno\nbuey\nbufanda\nbufón\nbúho\nbuitre\nbulto\nburbuja\nburla\nburro\nbuscar\nbutaca\nbuzón\ncaballo\ncabeza\ncabina\ncabra\ncacao\ncadáver\ncadena\ncaer\ncafé\ncaída\ncaimán\ncaja\ncajón\ncal\ncalamar\ncalcio\ncaldo\ncalidad\ncalle\ncalma\ncalor\ncalvo\ncama\ncambio\ncamello\ncamino\ncampo\ncáncer\ncandil\ncanela\ncanguro\ncanica\ncanto\ncaña\ncañón\ncaoba\ncaos\ncapaz\ncapitán\ncapote\ncaptar\ncapucha\ncara\ncarbón\ncárcel\ncareta\ncarga\ncariño\ncarne\ncarpeta\ncarro\ncarta\ncasa\ncasco\ncasero\ncaspa\ncastor\ncatorce\ncatre\ncaudal\ncausa\ncazo\ncebolla\nceder\ncedro\ncelda\ncélebre\nceloso\ncélula\ncemento\nceniza\ncentro\ncerca\ncerdo\ncereza\ncero\ncerrar\ncerteza\ncésped\ncetro\nchacal\nchaleco\nchampú\nchancla\nchapa\ncharla\nchico\nchiste\nchivo\nchoque\nchoza\nchuleta\nchupar\nciclón\nciego\ncielo\ncien\ncierto\ncifra\ncigarro\ncima\ncinco\ncine\ncinta\nciprés\ncirco\nciruela\ncisne\ncita\nciudad\nclamor\nclan\nclaro\nclase\nclave\ncliente\nclima\nclínica\ncobre\ncocción\ncochino\ncocina\ncoco\ncódigo\ncodo\ncofre\ncoger\ncohete\ncojín\ncojo\ncola\ncolcha\ncolegio\ncolgar\ncolina\ncollar\ncolmo\ncolumna\ncombate\ncomer\ncomida\ncómodo\ncompra\nconde\nconejo\nconga\nconocer\nconsejo\ncontar\ncopa\ncopia\ncorazón\ncorbata\ncorcho\ncordón\ncorona\ncorrer\ncoser\ncosmos\ncosta\ncráneo\ncráter\ncrear\ncrecer\ncreído\ncrema\ncría\ncrimen\ncripta\ncrisis\ncromo\ncrónica\ncroqueta\ncrudo\ncruz\ncuadro\ncuarto\ncuatro\ncubo\ncubrir\ncuchara\ncuello\ncuento\ncuerda\ncuesta\ncueva\ncuidar\nculebra\nculpa\nculto\ncumbre\ncumplir\ncuna\ncuneta\ncuota\ncupón\ncúpula\ncurar\ncurioso\ncurso\ncurva\ncutis\ndama\ndanza\ndar\ndardo\ndátil\ndeber\ndébil\ndécada\ndecir\ndedo\ndefensa\ndefinir\ndejar\ndelfín\ndelgado\ndelito\ndemora\ndenso\ndental\ndeporte\nderecho\nderrota\ndesayuno\ndeseo\ndesfile\ndesnudo\ndestino\ndesvío\ndetalle\ndetener\ndeuda\ndía\ndiablo\ndiadema\ndiamante\ndiana\ndiario\ndibujo\ndictar\ndiente\ndieta\ndiez\ndifícil\ndigno\ndilema\ndiluir\ndinero\ndirecto\ndirigir\ndisco\ndiseño\ndisfraz\ndiva\ndivino\ndoble\ndoce\ndolor\ndomingo\ndon\ndonar\ndorado\ndormir\ndorso\ndos\ndosis\ndragón\ndroga\nducha\nduda\nduelo\ndueño\ndulce\ndúo\nduque\ndurar\ndureza\nduro\nébano\nebrio\nechar\neco\necuador\nedad\nedición\nedificio\neditor\neducar\nefecto\neficaz\neje\nejemplo\nelefante\nelegir\nelemento\nelevar\nelipse\nélite\nelixir\nelogio\neludir\nembudo\nemitir\nemoción\nempate\nempeño\nempleo\nempresa\nenano\nencargo\nenchufe\nencía\nenemigo\nenero\nenfado\nenfermo\nengaño\nenigma\nenlace\nenorme\nenredo\nensayo\nenseñar\nentero\nentrar\nenvase\nenvío\népoca\nequipo\nerizo\nescala\nescena\nescolar\nescribir\nescudo\nesencia\nesfera\nesfuerzo\nespada\nespejo\nespía\nesposa\nespuma\nesquí\nestar\neste\nestilo\nestufa\netapa\neterno\nética\netnia\nevadir\nevaluar\nevento\nevitar\nexacto\nexamen\nexceso\nexcusa\nexento\nexigir\nexilio\nexistir\néxito\nexperto\nexplicar\nexponer\nextremo\nfábrica\nfábula\nfachada\nfácil\nfactor\nfaena\nfaja\nfalda\nfallo\nfalso\nfaltar\nfama\nfamilia\nfamoso\nfaraón\nfarmacia\nfarol\nfarsa\nfase\nfatiga\nfauna\nfavor\nfax\nfebrero\nfecha\nfeliz\nfeo\nferia\nferoz\nfértil\nfervor\nfestín\nfiable\nfianza\nfiar\nfibra\nficción\nficha\nfideo\nfiebre\nfiel\nfiera\nfiesta\nfigura\nfijar\nfijo\nfila\nfilete\nfilial\nfiltro\nfin\nfinca\nfingir\nfinito\nfirma\nflaco\nflauta\nflecha\nflor\nflota\nfluir\nflujo\nflúor\nfobia\nfoca\nfogata\nfogón\nfolio\nfolleto\nfondo\nforma\nforro\nfortuna\nforzar\nfosa\nfoto\nfracaso\nfrágil\nfranja\nfrase\nfraude\nfreír\nfreno\nfresa\nfrío\nfrito\nfruta\nfuego\nfuente\nfuerza\nfuga\nfumar\nfunción\nfunda\nfurgón\nfuria\nfusil\nfútbol\nfuturo\ngacela\ngafas\ngaita\ngajo\ngala\ngalería\ngallo\ngamba\nganar\ngancho\nganga\nganso\ngaraje\ngarza\ngasolina\ngastar\ngato\ngavilán\ngemelo\ngemir\ngen\ngénero\ngenio\ngente\ngeranio\ngerente\ngermen\ngesto\ngigante\ngimnasio\ngirar\ngiro\nglaciar\nglobo\ngloria\ngol\ngolfo\ngoloso\ngolpe\ngoma\ngordo\ngorila\ngorra\ngota\ngoteo\ngozar\ngrada\ngráfico\ngrano\ngrasa\ngratis\ngrave\ngrieta\ngrillo\ngripe\ngris\ngrito\ngrosor\ngrúa\ngrueso\ngrumo\ngrupo\nguante\nguapo\nguardia\nguerra\nguía\nguiño\nguion\nguiso\nguitarra\ngusano\ngustar\nhaber\nhábil\nhablar\nhacer\nhacha\nhada\nhallar\nhamaca\nharina\nhaz\nhazaña\nhebilla\nhebra\nhecho\nhelado\nhelio\nhembra\nherir\nhermano\nhéroe\nhervir\nhielo\nhierro\nhígado\nhigiene\nhijo\nhimno\nhistoria\nhocico\nhogar\nhoguera\nhoja\nhombre\nhongo\nhonor\nhonra\nhora\nhormiga\nhorno\nhostil\nhoyo\nhueco\nhuelga\nhuerta\nhueso\nhuevo\nhuida\nhuir\nhumano\nhúmedo\nhumilde\nhumo\nhundir\nhuracán\nhurto\nicono\nideal\nidioma\nídolo\niglesia\niglú\nigual\nilegal\nilusión\nimagen\nimán\nimitar\nimpar\nimperio\nimponer\nimpulso\nincapaz\níndice\ninerte\ninfiel\ninforme\ningenio\ninicio\ninmenso\ninmune\ninnato\ninsecto\ninstante\ninterés\níntimo\nintuir\ninútil\ninvierno\nira\niris\nironía\nisla\nislote\njabalí\njabón\njamón\njarabe\njardín\njarra\njaula\njazmín\njefe\njeringa\njinete\njornada\njoroba\njoven\njoya\njuerga\njueves\njuez\njugador\njugo\njuguete\njuicio\njunco\njungla\njunio\njuntar\njúpiter\njurar\njusto\njuvenil\njuzgar\nkilo\nkoala\nlabio\nlacio\nlacra\nlado\nladrón\nlagarto\nlágrima\nlaguna\nlaico\nlamer\nlámina\nlámpara\nlana\nlancha\nlangosta\nlanza\nlápiz\nlargo\nlarva\nlástima\nlata\nlátex\nlatir\nlaurel\nlavar\nlazo\nleal\nlección\nleche\nlector\nleer\nlegión\nlegumbre\nlejano\nlengua\nlento\nleña\nleón\nleopardo\nlesión\nletal\nletra\nleve\nleyenda\nlibertad\nlibro\nlicor\nlíder\nlidiar\nlienzo\nliga\nligero\nlima\nlímite\nlimón\nlimpio\nlince\nlindo\nlínea\nlingote\nlino\nlinterna\nlíquido\nliso\nlista\nlitera\nlitio\nlitro\nllaga\nllama\nllanto\nllave\nllegar\nllenar\nllevar\nllorar\nllover\nlluvia\nlobo\nloción\nloco\nlocura\nlógica\nlogro\nlombriz\nlomo\nlonja\nlote\nlucha\nlucir\nlugar\nlujo\nluna\nlunes\nlupa\nlustro\nluto\nluz\nmaceta\nmacho\nmadera\nmadre\nmaduro\nmaestro\nmafia\nmagia\nmago\nmaíz\nmaldad\nmaleta\nmalla\nmalo\nmamá\nmambo\nmamut\nmanco\nmando\nmanejar\nmanga\nmaniquí\nmanjar\nmano\nmanso\nmanta\nmañana\nmapa\nmáquina\nmar\nmarco\nmarea\nmarfil\nmargen\nmarido\nmármol\nmarrón\nmartes\nmarzo\nmasa\nmáscara\nmasivo\nmatar\nmateria\nmatiz\nmatriz\nmáximo\nmayor\nmazorca\nmecha\nmedalla\nmedio\nmédula\nmejilla\nmejor\nmelena\nmelón\nmemoria\nmenor\nmensaje\nmente\nmenú\nmercado\nmerengue\nmérito\nmes\nmesón\nmeta\nmeter\nmétodo\nmetro\nmezcla\nmiedo\nmiel\nmiembro\nmiga\nmil\nmilagro\nmilitar\nmillón\nmimo\nmina\nminero\nmínimo\nminuto\nmiope\nmirar\nmisa\nmiseria\nmisil\nmismo\nmitad\nmito\nmochila\nmoción\nmoda\nmodelo\nmoho\nmojar\nmolde\nmoler\nmolino\nmomento\nmomia\nmonarca\nmoneda\nmonja\nmonto\nmoño\nmorada\nmorder\nmoreno\nmorir\nmorro\nmorsa\nmortal\nmosca\nmostrar\nmotivo\nmover\nmóvil\nmozo\nmucho\nmudar\nmueble\nmuela\nmuerte\nmuestra\nmugre\nmujer\nmula\nmuleta\nmulta\nmundo\nmuñeca\nmural\nmuro\nmúsculo\nmuseo\nmusgo\nmúsica\nmuslo\nnácar\nnación\nnadar\nnaipe\nnaranja\nnariz\nnarrar\nnasal\nnatal\nnativo\nnatural\nnáusea\nnaval\nnave\nnavidad\nnecio\nnéctar\nnegar\nnegocio\nnegro\nneón\nnervio\nneto\nneutro\nnevar\nnevera\nnicho\nnido\nniebla\nnieto\nniñez\nniño\nnítido\nnivel\nnobleza\nnoche\nnómina\nnoria\nnorma\nnorte\nnota\nnoticia\nnovato\nnovela\nnovio\nnube\nnuca\nnúcleo\nnudillo\nnudo\nnuera\nnueve\nnuez\nnulo\nnúmero\nnutria\noasis\nobeso\nobispo\nobjeto\nobra\nobrero\nobservar\nobtener\nobvio\noca\nocaso\nocéano\nochenta\nocho\nocio\nocre\noctavo\noctubre\noculto\nocupar\nocurrir\nodiar\nodio\nodisea\noeste\nofensa\noferta\noficio\nofrecer\nogro\noído\noír\nojo\nola\noleada\nolfato\nolivo\nolla\nolmo\nolor\nolvido\nombligo\nonda\nonza\nopaco\nopción\nópera\nopinar\noponer\noptar\nóptica\nopuesto\noración\norador\noral\nórbita\norca\norden\noreja\nórgano\norgía\norgullo\noriente\norigen\norilla\noro\norquesta\noruga\nosadía\noscuro\nosezno\noso\nostra\notoño\notro\noveja\nóvulo\nóxido\noxígeno\noyente\nozono\npacto\npadre\npaella\npágina\npago\npaís\npájaro\npalabra\npalco\npaleta\npálido\npalma\npaloma\npalpar\npan\npanal\npánico\npantera\npañuelo\npapá\npapel\npapilla\npaquete\nparar\nparcela\npared\nparir\nparo\npárpado\nparque\npárrafo\nparte\npasar\npaseo\npasión\npaso\npasta\npata\npatio\npatria\npausa\npauta\npavo\npayaso\npeatón\npecado\npecera\npecho\npedal\npedir\npegar\npeine\npelar\npeldaño\npelea\npeligro\npellejo\npelo\npeluca\npena\npensar\npeñón\npeón\npeor\npepino\npequeño\npera\npercha\nperder\npereza\nperfil\nperico\nperla\npermiso\nperro\npersona\npesa\npesca\npésimo\npestaña\npétalo\npetróleo\npez\npezuña\npicar\npichón\npie\npiedra\npierna\npieza\npijama\npilar\npiloto\npimienta\npino\npintor\npinza\npiña\npiojo\npipa\npirata\npisar\npiscina\npiso\npista\npitón\npizca\nplaca\nplan\nplata\nplaya\nplaza\npleito\npleno\nplomo\npluma\nplural\npobre\npoco\npoder\npodio\npoema\npoesía\npoeta\npolen\npolicía\npollo\npolvo\npomada\npomelo\npomo\npompa\nponer\nporción\nportal\nposada\nposeer\nposible\nposte\npotencia\npotro\npozo\nprado\nprecoz\npregunta\npremio\nprensa\npreso\nprevio\nprimo\npríncipe\nprisión\nprivar\nproa\nprobar\nproceso\nproducto\nproeza\nprofesor\nprograma\nprole\npromesa\npronto\npropio\npróximo\nprueba\npúblico\npuchero\npudor\npueblo\npuerta\npuesto\npulga\npulir\npulmón\npulpo\npulso\npuma\npunto\npuñal\npuño\npupa\npupila\npuré\nquedar\nqueja\nquemar\nquerer\nqueso\nquieto\nquímica\nquince\nquitar\nrábano\nrabia\nrabo\nración\nradical\nraíz\nrama\nrampa\nrancho\nrango\nrapaz\nrápido\nrapto\nrasgo\nraspa\nrato\nrayo\nraza\nrazón\nreacción\nrealidad\nrebaño\nrebote\nrecaer\nreceta\nrechazo\nrecoger\nrecreo\nrecto\nrecurso\nred\nredondo\nreducir\nreflejo\nreforma\nrefrán\nrefugio\nregalo\nregir\nregla\nregreso\nrehén\nreino\nreír\nreja\nrelato\nrelevo\nrelieve\nrelleno\nreloj\nremar\nremedio\nremo\nrencor\nrendir\nrenta\nreparto\nrepetir\nreposo\nreptil\nres\nrescate\nresina\nrespeto\nresto\nresumen\nretiro\nretorno\nretrato\nreunir\nrevés\nrevista\nrey\nrezar\nrico\nriego\nrienda\nriesgo\nrifa\nrígido\nrigor\nrincón\nriñón\nrío\nriqueza\nrisa\nritmo\nrito\nrizo\nroble\nroce\nrociar\nrodar\nrodeo\nrodilla\nroer\nrojizo\nrojo\nromero\nromper\nron\nronco\nronda\nropa\nropero\nrosa\nrosca\nrostro\nrotar\nrubí\nrubor\nrudo\nrueda\nrugir\nruido\nruina\nruleta\nrulo\nrumbo\nrumor\nruptura\nruta\nrutina\nsábado\nsaber\nsabio\nsable\nsacar\nsagaz\nsagrado\nsala\nsaldo\nsalero\nsalir\nsalmón\nsalón\nsalsa\nsalto\nsalud\nsalvar\nsamba\nsanción\nsandía\nsanear\nsangre\nsanidad\nsano\nsanto\nsapo\nsaque\nsardina\nsartén\nsastre\nsatán\nsauna\nsaxofón\nsección\nseco\nsecreto\nsecta\nsed\nseguir\nseis\nsello\nselva\nsemana\nsemilla\nsenda\nsensor\nseñal\nseñor\nseparar\nsepia\nsequía\nser\nserie\nsermón\nservir\nsesenta\nsesión\nseta\nsetenta\nsevero\nsexo\nsexto\nsidra\nsiesta\nsiete\nsiglo\nsigno\nsílaba\nsilbar\nsilencio\nsilla\nsímbolo\nsimio\nsirena\nsistema\nsitio\nsituar\nsobre\nsocio\nsodio\nsol\nsolapa\nsoldado\nsoledad\nsólido\nsoltar\nsolución\nsombra\nsondeo\nsonido\nsonoro\nsonrisa\nsopa\nsoplar\nsoporte\nsordo\nsorpresa\nsorteo\nsostén\nsótano\nsuave\nsubir\nsuceso\nsudor\nsuegra\nsuelo\nsueño\nsuerte\nsufrir\nsujeto\nsultán\nsumar\nsuperar\nsuplir\nsuponer\nsupremo\nsur\nsurco\nsureño\nsurgir\nsusto\nsutil\ntabaco\ntabique\ntabla\ntabú\ntaco\ntacto\ntajo\ntalar\ntalco\ntalento\ntalla\ntalón\ntamaño\ntambor\ntango\ntanque\ntapa\ntapete\ntapia\ntapón\ntaquilla\ntarde\ntarea\ntarifa\ntarjeta\ntarot\ntarro\ntarta\ntatuaje\ntauro\ntaza\ntazón\nteatro\ntecho\ntecla\ntécnica\ntejado\ntejer\ntejido\ntela\nteléfono\ntema\ntemor\ntemplo\ntenaz\ntender\ntener\ntenis\ntenso\nteoría\nterapia\nterco\ntérmino\nternura\nterror\ntesis\ntesoro\ntestigo\ntetera\ntexto\ntez\ntibio\ntiburón\ntiempo\ntienda\ntierra\ntieso\ntigre\ntijera\ntilde\ntimbre\ntímido\ntimo\ntinta\ntío\ntípico\ntipo\ntira\ntirón\ntitán\ntítere\ntítulo\ntiza\ntoalla\ntobillo\ntocar\ntocino\ntodo\ntoga\ntoldo\ntomar\ntono\ntonto\ntopar\ntope\ntoque\ntórax\ntorero\ntormenta\ntorneo\ntoro\ntorpedo\ntorre\ntorso\ntortuga\ntos\ntosco\ntoser\ntóxico\ntrabajo\ntractor\ntraer\ntráfico\ntrago\ntraje\ntramo\ntrance\ntrato\ntrauma\ntrazar\ntrébol\ntregua\ntreinta\ntren\ntrepar\ntres\ntribu\ntrigo\ntripa\ntriste\ntriunfo\ntrofeo\ntrompa\ntronco\ntropa\ntrote\ntrozo\ntruco\ntrueno\ntrufa\ntubería\ntubo\ntuerto\ntumba\ntumor\ntúnel\ntúnica\nturbina\nturismo\nturno\ntutor\nubicar\núlcera\numbral\nunidad\nunir\nuniverso\nuno\nuntar\nuña\nurbano\nurbe\nurgente\nurna\nusar\nusuario\nútil\nutopía\nuva\nvaca\nvacío\nvacuna\nvagar\nvago\nvaina\nvajilla\nvale\nválido\nvalle\nvalor\nválvula\nvampiro\nvara\nvariar\nvarón\nvaso\nvecino\nvector\nvehículo\nveinte\nvejez\nvela\nvelero\nveloz\nvena\nvencer\nvenda\nveneno\nvengar\nvenir\nventa\nvenus\nver\nverano\nverbo\nverde\nvereda\nverja\nverso\nverter\nvía\nviaje\nvibrar\nvicio\nvíctima\nvida\nvídeo\nvidrio\nviejo\nviernes\nvigor\nvil\nvilla\nvinagre\nvino\nviñedo\nviolín\nviral\nvirgo\nvirtud\nvisor\nvíspera\nvista\nvitamina\nviudo\nvivaz\nvivero\nvivir\nvivo\nvolcán\nvolumen\nvolver\nvoraz\nvotar\nvoto\nvoz\nvuelo\nvulgar\nyacer\nyate\nyegua\nyema\nyerno\nyeso\nyodo\nyoga\nyogur\nzafiro\nzanja\nzapato\nzarza\nzona\nzorro\nzumo\nzurdo\n`\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/CHANGELOG.md",
    "content": "Changes by Version\n==================\n\n2.15.0 (unreleased)\n-------------------\n\n- nothing yet\n\n\n2.14.0 (2018-04-30)\n-------------------\n\n- Support throttling for debug traces (#274) <Isaac Hier>\n- Remove dependency on Apache Thrift (#303) <Yuri Shkuro>\n- Remove dependency on tchannel  (#295) (#294) <Yuri Shkuro>\n- Test with Go 1.9 (#298) <Yuri Shkuro>\n\n\n2.13.0 (2018-04-15)\n-------------------\n\n- Use value receiver for config.NewTracer() (#283) <Yuri Shkuro>\n- Lock span during jaeger thrift conversion (#273) <Won Jun Jang>\n- Fix the RemotelyControlledSampler so that it terminates go-routine on Close() (#260) <Scott Kidder> <Yuri Shkuro>\n- Added support for client configuration via env vars (#275) <Juraci Paixão Kröhling>\n- Allow overriding sampler in the Config (#270) <Mike Kabischev>\n\n\n2.12.0 (2018-03-14)\n-------------------\n\n- Use lock when retrieving span.Context() (#268)\n- Add Configuration support for custom Injector and Extractor (#263) <Martin Liu>\n\n\n2.11.2 (2018-01-12)\n-------------------\n\n- Add Gopkg.toml to allow using the lib with `dep`\n\n\n2.11.1 (2018-01-03)\n-------------------\n\n- Do not enqueue spans after Reporter is closed (#235, #245)\n- Change default flush interval to 1sec (#243)\n\n\n2.11.0 (2017-11-27)\n-------------------\n\n- Normalize metric names and tags to be compatible with Prometheus (#222)\n\n\n2.10.0 (2017-11-14)\n-------------------\n\n- Support custom tracing headers (#176)\n- Add BaggageRestrictionManager (#178) and RemoteBaggageRestrictionManager (#182)\n- Do not coerce baggage keys to lower case (#196)\n- Log span name when span cannot be reported (#198)\n- Add option to enable gen128Bit for tracer (#193) and allow custom generator for high bits of trace ID (#219)\n\n\n2.9.0 (2017-07-29)\n------------------\n\n- Pin thrift <= 0.10 (#179)\n- Introduce a parallel interface ContribObserver (#159)\n\n\n2.8.0 (2017-07-05)\n------------------\n\n- Drop `jaeger.` prefix from `jaeger.hostname` process-level tag\n- Add options to set tracer tags\n\n\n2.7.0 (2017-06-21)\n------------------\n\n- Fix rate limiter balance [#135](https://github.com/uber/jaeger-client-go/pull/135) [#140](https://github.com/uber/jaeger-client-go/pull/140)\n- Default client to send Jaeger.thrift [#147](https://github.com/uber/jaeger-client-go/pull/147)\n- Save baggage in span [#153](https://github.com/uber/jaeger-client-go/pull/153)\n- Move reporter.queueLength to the top of the struct to guarantee 64bit alignment [#158](https://github.com/uber/jaeger-client-go/pull/158)\n- Support HTTP transport with jaeger.thrift [#161](https://github.com/uber/jaeger-client-go/pull/161)\n\n\n2.6.0 (2017-03-28)\n------------------\n\n- Add config option to initialize RPC Metrics feature\n\n\n2.5.0 (2017-03-23)\n------------------\n\n- Split request latency metric by success/failure [#123](https://github.com/uber/jaeger-client-go/pull/123)\n- Add mutex to adaptive sampler and fix race condition [#124](https://github.com/uber/jaeger-client-go/pull/124)\n- Fix rate limiter panic [#125](https://github.com/uber/jaeger-client-go/pull/125)\n\n\n2.4.0 (2017-03-21)\n------------------\n\n- Remove `_ms` suffix from request latency metric name [#121](https://github.com/uber/jaeger-client-go/pull/121)\n- Rename all metrics to \"request\" and \"http_request\" and use tags for other dimensions [#121](https://github.com/uber/jaeger-client-go/pull/121)\n\n\n2.3.0 (2017-03-20)\n------------------\n\n- Make Span type public to allow access to non-std methods for testing [#117](https://github.com/uber/jaeger-client-go/pull/117)\n- Add a structured way to extract traces for logging with zap [#118](https://github.com/uber/jaeger-client-go/pull/118)\n\n\n2.2.1 (2017-03-14)\n------------------\n\n- Fix panic caused by updating the remote sampler from adaptive sampler to any other sampler type (https://github.com/uber/jaeger-client-go/pull/111)\n\n\n2.2.0 (2017-03-10)\n------------------\n\n- Introduce Observer and SpanObserver (https://github.com/uber/jaeger-client-go/pull/94)\n- Add RPC metrics emitter as Observer/SpanObserver (https://github.com/uber/jaeger-client-go/pull/103)\n\n\n2.1.2 (2017-02-27)\n-------------------\n\n- Fix leaky bucket bug (https://github.com/uber/jaeger-client-go/pull/99)\n- Fix zap logger Infof (https://github.com/uber/jaeger-client-go/pull/100)\n- Add tracer initialization godoc examples\n\n\n2.1.1 (2017-02-21)\n-------------------\n\n- Fix inefficient usage of zap.Logger\n\n\n2.1.0 (2017-02-17)\n-------------------\n\n- Add adapter for zap.Logger (https://github.com/uber-go/zap)\n- Move logging API to ./log/ package\n\n\n2.0.0 (2017-02-08)\n-------------------\n\n- Support Adaptive Sampling\n- Support 128bit Trace IDs\n- Change trace/span IDs from uint64 to strong types TraceID and SpanID\n- Add Zipkin HTTP B3 Propagation format support #72\n- Rip out existing metrics and use github.com/uber/jaeger-lib/metrics\n- Change API for tracer, reporter, sampler initialization\n\n\n1.6.0 (2016-10-14)\n-------------------\n\n- Add Zipkin HTTP transport\n- Support external baggage via jaeger-baggage header\n- Unpin Thrift version, keep to master\n\n\n1.5.1 (2016-09-27)\n-------------------\n\n- Relax dependency on opentracing to ^1\n\n\n1.5.0 (2016-09-27)\n-------------------\n\n- Upgrade to opentracing-go 1.0\n- Support KV logging for Spans\n\n\n1.4.0 (2016-09-14)\n-------------------\n\n- Support debug traces via HTTP header \"jaeger-debug-id\"\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md",
    "content": "# How to Contribute to Jaeger\n\nWe'd love your help!\n\nJaeger is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub\npull requests. This document outlines some of the conventions on development\nworkflow, commit message formatting, contact points and other resources to make\nit easier to get your contribution accepted.\n\nWe gratefully welcome improvements to documentation as well as to code.\n\n# Certificate of Origin\n\nBy contributing to this project you agree to the [Developer Certificate of\nOrigin](https://developercertificate.org/) (DCO). This document was created\nby the Linux Kernel community and is a simple statement that you, as a\ncontributor, have the legal right to make the contribution. See the [DCO](DCO)\nfile for details.\n\n## Getting Started\n\nThis library uses [glide](https://github.com/Masterminds/glide) to manage dependencies.\n\nTo get started, make sure you clone the Git repository into the correct location\n`github.com/uber/jaeger-client-go` relative to `$GOPATH`:\n\n```\nmkdir -p $GOPATH/src/github.com/uber\ncd $GOPATH/src/github.com/uber\ngit clone git@github.com:jaegertracing/jaeger-client-go.git jaeger-client-go\ncd jaeger-client-go\n```\n\nThen install dependencies and run the tests:\n\n```\ngit submodule update --init --recursive\nglide install\nmake test\n```\n\n## Imports grouping\n\nThis projects follows the following pattern for grouping imports in Go files:\n  * imports from standard library\n  * imports from other projects\n  * imports from `jaeger-client-go` project\n  \nFor example:\n\n```go\nimport (\n\t\"fmt\"\n \n\t\"github.com/uber/jaeger-lib/metrics\"\n\t\"go.uber.org/zap\"\n\n\t\"github.com/uber/jaeger-client-go/config\"\n)\n```\n\n## Making A Change\n\n*Before making any significant changes, please [open an\nissue](https://github.com/jaegertracing/jaeger-client-go/issues).* Discussing your proposed\nchanges ahead of time will make the contribution process smooth for everyone.\n\nOnce we've discussed your changes and you've got your code ready, make sure\nthat tests are passing (`make test` or `make cover`) and open your PR. Your\npull request is most likely to be accepted if it:\n\n* Includes tests for new functionality.\n* Follows the guidelines in [Effective\n  Go](https://golang.org/doc/effective_go.html) and the [Go team's common code\n  review comments](https://github.com/golang/go/wiki/CodeReviewComments).\n* Has a [good commit message](https://chris.beams.io/posts/git-commit/):\n   * Separate subject from body with a blank line\n   * Limit the subject line to 50 characters\n   * Capitalize the subject line\n   * Do not end the subject line with a period\n   * Use the imperative mood in the subject line\n   * Wrap the body at 72 characters\n   * Use the body to explain _what_ and _why_ instead of _how_\n* Each commit must be signed by the author ([see below](#sign-your-work)).\n\n## License\n\nBy contributing your code, you agree to license your contribution under the terms\nof the [Apache License](LICENSE).\n\nIf you are adding a new file it should have a header like below.  The easiest\nway to add such header is to run `make fmt`.\n\n```\n// Copyright (c) 2017 The Jaeger Authors.\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## Sign your work\n\nThe sign-off is a simple line at the end of the explanation for the\npatch, which certifies that you wrote it or otherwise have the right to\npass it on as an open-source patch.  The rules are pretty simple: if you\ncan certify the below (from\n[developercertificate.org](http://developercertificate.org/)):\n\n```\nDeveloper Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n660 York Street, Suite 102,\nSan Francisco, CA 94110 USA\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\n\nDeveloper's Certificate of Origin 1.1\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n    have the right to submit it under the open source license\n    indicated in the file; or\n\n(b) The contribution is based upon previous work that, to the best\n    of my knowledge, is covered under an appropriate open source\n    license and I have the right under that license to submit that\n    work with modifications, whether created in whole or in part\n    by me, under the same open source license (unless I am\n    permitted to submit under a different license), as indicated\n    in the file; or\n\n(c) The contribution was provided directly to me by some other\n    person who certified (a), (b) or (c) and I have not modified\n    it.\n\n(d) I understand and agree that this project and the contribution\n    are public and that a record of the contribution (including all\n    personal information I submit with it, including my sign-off) is\n    maintained indefinitely and may be redistributed consistent with\n    this project or the open source license(s) involved.\n```\n\nthen you just add a line to every git commit message:\n\n    Signed-off-by: Joe Smith <joe@gmail.com>\n\nusing your real name (sorry, no pseudonyms or anonymous contributions.)\n\nYou can add the sign off when creating the git commit via `git commit -s`.\n\nIf you want this to be automatic you can set up some aliases:\n\n```\ngit config --add alias.amend \"commit -s --amend\"\ngit config --add alias.c \"commit -s\"\n```\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/DCO",
    "content": "Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n660 York Street, Suite 102,\nSan Francisco, CA 94110 USA\n\nEveryone is permitted to copy and distribute verbatim copies of this\nlicense document, but changing it is not allowed.\n\n\nDeveloper's Certificate of Origin 1.1\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n    have the right to submit it under the open source license\n    indicated in the file; or\n\n(b) The contribution is based upon previous work that, to the best\n    of my knowledge, is covered under an appropriate open source\n    license and I have the right under that license to submit that\n    work with modifications, whether created in whole or in part\n    by me, under the same open source license (unless I am\n    permitted to submit under a different license), as indicated\n    in the file; or\n\n(c) The contribution was provided directly to me by some other\n    person who certified (a), (b) or (c) and I have not modified\n    it.\n\n(d) I understand and agree that this project and the contribution\n    are public and that a record of the contribution (including all\n    personal information I submit with it, including my sign-off) is\n    maintained indefinitely and may be redistributed consistent with\n    this project or the open source license(s) involved.\n\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/Gopkg.toml",
    "content": "[[constraint]]\n  name = \"github.com/crossdock/crossdock-go\"\n  branch = \"master\"\n\n[[constraint]]\n  name = \"github.com/opentracing/opentracing-go\"\n  version = \"^1\"\n\n[[constraint]]\n  name = \"github.com/prometheus/client_golang\"\n  version = \"0.8.0\"\n\n[[constraint]]\n  name = \"github.com/stretchr/testify\"\n  version = \"^1.1.3\"\n\n[[constraint]]\n  name = \"github.com/uber-go/atomic\"\n  version = \"^1\"\n\n[[constraint]]\n  name = \"github.com/uber/jaeger-lib\"\n  version = \"^1.3\"\n\n[[constraint]]\n  name = \"go.uber.org/zap\"\n  version = \"^1\"\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/Makefile",
    "content": "PROJECT_ROOT=github.com/uber/jaeger-client-go\nPACKAGES := $(shell glide novendor | grep -v -e ./thrift-gen/... -e ./thrift/...)\n# all .go files that don't exist in hidden directories\nALL_SRC := $(shell find . -name \"*.go\" | grep -v -e vendor -e thrift-gen -e ./thrift/ \\\n        -e \".*/\\..*\" \\\n        -e \".*/_.*\" \\\n        -e \".*/mocks.*\")\n\n-include crossdock/rules.mk\n\nexport GO15VENDOREXPERIMENT=1\n\nRACE=-race\nGOTEST=go test -v $(RACE)\nGOLINT=golint\nGOVET=go vet\nGOFMT=gofmt\nFMT_LOG=fmt.log\nLINT_LOG=lint.log\n\nTHRIFT_VER=0.9.3\nTHRIFT_IMG=thrift:$(THRIFT_VER)\nTHRIFT=docker run -v \"${PWD}:/data\" $(THRIFT_IMG) thrift\nTHRIFT_GO_ARGS=thrift_import=\"github.com/apache/thrift/lib/go/thrift\"\nTHRIFT_GEN_DIR=thrift-gen\n\nPASS=$(shell printf \"\\033[32mPASS\\033[0m\")\nFAIL=$(shell printf \"\\033[31mFAIL\\033[0m\")\nCOLORIZE=sed ''/PASS/s//$(PASS)/'' | sed ''/FAIL/s//$(FAIL)/''\n\n.DEFAULT_GOAL := test-and-lint\n\n.PHONY: test-and-lint\ntest-and-lint: test fmt lint\n\n.PHONY: test\ntest:\n\tbash -c \"set -e; set -o pipefail; $(GOTEST) $(PACKAGES) | $(COLORIZE)\"\n\n.PHONY: fmt\nfmt:\n\t$(GOFMT) -e -s -l -w $(ALL_SRC)\n\t./scripts/updateLicenses.sh\n\n.PHONY: lint\nlint:\n\t$(GOVET) $(PACKAGES)\n\t@cat /dev/null > $(LINT_LOG)\n\t@$(foreach pkg, $(PACKAGES), $(GOLINT) $(pkg) | grep -v crossdock/thrift >> $(LINT_LOG) || true;)\n\t@[ ! -s \"$(LINT_LOG)\" ] || (echo \"Lint Failures\" | cat - $(LINT_LOG) && false)\n\t@$(GOFMT) -e -s -l $(ALL_SRC) > $(FMT_LOG)\n\t./scripts/updateLicenses.sh >> $(FMT_LOG)\n\t@[ ! -s \"$(FMT_LOG)\" ] || (echo \"go fmt or license check failures, run 'make fmt'\" | cat - $(FMT_LOG) && false)\n\n\n.PHONY: install\ninstall:\n\tglide --version || go get github.com/Masterminds/glide\nifeq ($(USE_DEP),true)\n\tdep ensure\nelse\n\tglide install\nendif\n\n\n.PHONY: cover\ncover:\n\t./scripts/cover.sh $(shell go list $(PACKAGES))\n\tgo tool cover -html=cover.out -o cover.html\n\n\n# This is not part of the regular test target because we don't want to slow it\n# down.\n.PHONY: test-examples\ntest-examples:\n\tmake -C examples\n\n# TODO at the moment we're not generating tchan_*.go files\nthrift: idl-submodule thrift-image\n\t$(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/agent.thrift\n\t$(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/sampling.thrift\n\t$(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/jaeger.thrift\n\t$(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/zipkincore.thrift\n\t$(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/baggage.thrift\n\t$(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/crossdock/thrift/ /data/idl/thrift/crossdock/tracetest.thrift\n\tsed -i '' 's|\"zipkincore\"|\"$(PROJECT_ROOT)/thrift-gen/zipkincore\"|g' $(THRIFT_GEN_DIR)/agent/*.go\n\tsed -i '' 's|\"jaeger\"|\"$(PROJECT_ROOT)/thrift-gen/jaeger\"|g' $(THRIFT_GEN_DIR)/agent/*.go\n\tsed -i '' 's|\"github.com/apache/thrift/lib/go/thrift\"|\"github.com/uber/jaeger-client-go/thrift\"|g' \\\n\t\t$(THRIFT_GEN_DIR)/*/*.go crossdock/thrift/tracetest/*.go\n\trm -rf thrift-gen/*/*-remote\n\trm -rf crossdock/thrift/*/*-remote\n\trm -rf thrift-gen/jaeger/collector.go\n\nidl-submodule:\n\tgit submodule init\n\tgit submodule update\n\nthrift-image:\n\t$(THRIFT) -version\n\n.PHONY: install-dep-ci\ninstall-dep-ci:\n\t- curl -L -s https://github.com/golang/dep/releases/download/v0.3.2/dep-linux-amd64 -o $$GOPATH/bin/dep\n\t- chmod +x $$GOPATH/bin/dep\n\n.PHONY: install-ci\ninstall-ci: install-dep-ci install\n\tgo get github.com/wadey/gocovmerge\n\tgo get github.com/mattn/goveralls\n\tgo get golang.org/x/tools/cmd/cover\n\tgo get github.com/golang/lint/golint\n\n.PHONY: test-ci\ntest-ci:\n\t@./scripts/cover.sh $(shell go list $(PACKAGES))\n\tmake lint\n\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/README.md",
    "content": "[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![OpenTracing 1.0 Enabled][ot-img]][ot-url]\n\n# Jaeger Bindings for Go OpenTracing API\n\nInstrumentation library that implements an\n[OpenTracing](http://opentracing.io) Tracer for Jaeger (https://jaegertracing.io).\n\n**IMPORTANT**: The library's import path is based on its original location under `github.com/uber`. Do not try to import it as `github.com/jaegertracing`, it will not compile. We might revisit this in the next major release.\n  * :white_check_mark: `import \"github.com/uber/jaeger-client-go\"`\n  * :x: `import \"github.com/jaegertracing/jaeger-client-go\"`\n\n## How to Contribute\n\nPlease see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## Installation\n\nWe recommended using a dependency manager like [glide](https://github.com/Masterminds/glide)\nand [semantic versioning](http://semver.org/) when including this library into an application.\nFor example, Jaeger backend imports this library like this:\n\n```yaml\n- package: github.com/uber/jaeger-client-go\n  version: ^2.7.0\n```\n\nIf you instead want to use the latest version in `master`, you can pull it via `go get`.\nNote that during `go get` you may see build errors due to incompatible dependencies, which is why\nwe recommend using semantic versions for dependencies.  The error  may be fixed by running\n`make install` (it will install `glide` if you don't have it):\n\n```shell\ngo get -u github.com/uber/jaeger-client-go/\ncd $GOPATH/src/github.com/uber/jaeger-client-go/\ngit submodule update --init --recursive\nmake install\n```\n\n## Initialization\n\nSee tracer initialization examples in [godoc](https://godoc.org/github.com/uber/jaeger-client-go/config#pkg-examples)\nand [config/example_test.go](./config/example_test.go).\n\n### Environment variables\n\nThe tracer can be initialized with values coming from environment variables. None of the env vars are required\nand all of them can be overriden via direct setting of the property on the configuration object.\n\nProperty| Description\n--- | ---\nJAEGER_SERVICE_NAME | The service name\nJAEGER_AGENT_HOST | The hostname for communicating with agent via UDP\nJAEGER_AGENT_PORT | The port for communicating with agent via UDP\nJAEGER_REPORTER_LOG_SPANS | Whether the reporter should also log the spans\nJAEGER_REPORTER_MAX_QUEUE_SIZE | The reporter's maximum queue size\nJAEGER_REPORTER_FLUSH_INTERVAL | The reporter's flush interval (ms)\nJAEGER_SAMPLER_TYPE | The sampler type\nJAEGER_SAMPLER_PARAM | The sampler parameter (number)\nJAEGER_SAMPLER_MANAGER_HOST_PORT | The host name and port when using the remote controlled sampler\nJAEGER_SAMPLER_MAX_OPERATIONS | The maximum number of operations that the sampler will keep track of\nJAEGER_SAMPLER_REFRESH_INTERVAL | How often the remotely controlled sampler will poll jaeger-agent for the appropriate sampling strategy\nJAEGER_TAGS | A comma separated list of `name = value` tracer level tags, which get added to all reported spans. The value can also refer to an environment variable using the format `${envVarName:default}`, where the `:default` is optional, and identifies a value to be used if the environment variable cannot be found\nJAEGER_DISABLED | Whether the tracer is disabled or not. If true, the default `opentracing.NoopTracer` is used.\nJAEGER_RPC_METRICS | Whether to store RPC metrics\n\n### Closing the tracer via `io.Closer`\n\nThe constructor function for Jaeger Tracer returns the tracer itself and an `io.Closer` instance.\nIt is recommended to structure your `main()` so that it calls the `Close()` function on the closer\nbefore exiting, e.g.\n\n```go\ntracer, closer, err := cfg.NewTracer(...)\ndefer closer.Close()\n```\n\nThis is especially useful for command-line tools that enable tracing, as well as\nfor the long-running apps that support graceful shutdown. For example, if your deployment\nsystem sends SIGTERM instead of killing the process and you trap that signal to do a graceful\nexit, then having `defer closer.Closer()` ensures that all buffered spans are flushed.\n\n### Metrics & Monitoring\n\nThe tracer emits a number of different metrics, defined in\n[metrics.go](metrics.go). The monitoring backend is expected to support\ntag-based metric names, e.g. instead of `statsd`-style string names\nlike `counters.my-service.jaeger.spans.started.sampled`, the metrics\nare defined by a short name and a collection of key/value tags, for\nexample: `name:jaeger.traces, state:started, sampled:y`. See [metrics.go](./metrics.go)\nfile for the full list and descriptions of emitted metrics.\n\nThe monitoring backend is represented by the `metrics.Factory` interface from package\n[`\"github.com/uber/jaeger-lib/metrics\"`](https://github.com/jaegertracing/jaeger-lib/tree/master/metrics).  An implementation\nof that interface can be passed as an option to either the Configuration object or the Tracer\nconstructor, for example:\n\n```go\nimport (\n    \"github.com/uber/jaeger-client-go/config\"\n    \"github.com/uber/jaeger-lib/metrics/prometheus\"\n)\n\n    metricsFactory := prometheus.New()\n    tracer, closer, err := config.Configuration{\n        ServiceName: \"your-service-name\",\n    }.NewTracer(\n        config.Metrics(metricsFactory),\n    )\n```\n\nBy default, a no-op `metrics.NullFactory` is used.\n\n### Logging\n\nThe tracer can be configured with an optional logger, which will be\nused to log communication errors, or log spans if a logging reporter\noption is specified in the configuration. The logging API is abstracted\nby the [Logger](logger.go) interface. A logger instance implementing\nthis interface can be set on the `Config` object before calling the\n`New` method.\n\nBesides the [zap](https://github.com/uber-go/zap) implementation\nbundled with this package there is also a [go-kit](https://github.com/go-kit/kit)\none in the [jaeger-lib](https://github.com/jaegertracing/jaeger-lib) repository.\n\n## Instrumentation for Tracing\n\nSince this tracer is fully compliant with OpenTracing API 1.0,\nall code instrumentation should only use the API itself, as described\nin the [opentracing-go](https://github.com/opentracing/opentracing-go) documentation.\n\n## Features\n\n### Reporters\n\nA \"reporter\" is a component that receives the finished spans and reports\nthem to somewhere. Under normal circumstances, the Tracer\nshould use the default `RemoteReporter`, which sends the spans out of\nprocess via configurable \"transport\". For testing purposes, one can\nuse an `InMemoryReporter` that accumulates spans in a buffer and\nallows to retrieve them for later verification. Also available are\n`NullReporter`, a no-op reporter that does nothing, a `LoggingReporter`\nwhich logs all finished spans using their `String()` method, and a\n`CompositeReporter` that can be used to combine more than one reporter\ninto one, e.g. to attach a logging reporter to the main remote reporter.\n\n### Span Reporting Transports\n\nThe remote reporter uses \"transports\" to actually send the spans out\nof process. Currently the supported transports include:\n  * [Jaeger Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/agent.thrift) over UDP or HTTP,\n  * [Zipkin Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/zipkincore.thrift) over HTTP.\n\n### Sampling\n\nThe tracer does not record all spans, but only those that have the\nsampling bit set in the `flags`. When a new trace is started and a new\nunique ID is generated, a sampling decision is made whether this trace\nshould be sampled. The sampling decision is propagated to all downstream\ncalls via the `flags` field of the trace context. The following samplers\nare available:\n  1. `RemotelyControlledSampler` uses one of the other simpler samplers\n     and periodically updates it by polling an external server. This\n     allows dynamic control of the sampling strategies.\n  1. `ConstSampler` always makes the same sampling decision for all\n     trace IDs. it can be configured to either sample all traces, or\n     to sample none.\n  1. `ProbabilisticSampler` uses a fixed sampling rate as a probability\n     for a given trace to be sampled. The actual decision is made by\n     comparing the trace ID with a random number multiplied by the\n     sampling rate.\n  1. `RateLimitingSampler` can be used to allow only a certain fixed\n     number of traces to be sampled per second.\n\n### Baggage Injection\n\nThe OpenTracing spec allows for [baggage][baggage], which are key value pairs that are added\nto the span context and propagated throughout the trace. An external process can inject baggage\nby setting the special HTTP Header `jaeger-baggage` on a request:\n\n```sh\ncurl -H \"jaeger-baggage: key1=value1, key2=value2\" http://myhost.com\n```\n\nBaggage can also be programatically set inside your service:\n\n```go\nif span := opentracing.SpanFromContext(ctx); span != nil {\n    span.SetBaggageItem(\"key\", \"value\")\n}\n```\n\nAnother service downstream of that can retrieve the baggage in a similar way:\n\n```go\nif span := opentracing.SpanFromContext(ctx); span != nil {\n    val := span.BaggageItem(\"key\")\n    println(val)\n}\n```\n\n### Debug Traces (Forced Sampling)\n\n#### Programmatically\n\nThe OpenTracing API defines a `sampling.priority` standard tag that\ncan be used to affect the sampling of a span and its children:\n\n```go\nimport (\n    \"github.com/opentracing/opentracing-go\"\n    \"github.com/opentracing/opentracing-go/ext\"\n)\n\nspan := opentracing.SpanFromContext(ctx)\next.SamplingPriority.Set(span, 1)    \n```\n\n#### Via HTTP Headers\n\nJaeger Tracer also understands a special HTTP Header `jaeger-debug-id`,\nwhich can be set in the incoming request, e.g.\n\n```sh\ncurl -H \"jaeger-debug-id: some-correlation-id\" http://myhost.com\n```\n\nWhen Jaeger sees this header in the request that otherwise has no\ntracing context, it ensures that the new trace started for this\nrequest will be sampled in the \"debug\" mode (meaning it should survive\nall downsampling that might happen in the collection pipeline), and the\nroot span will have a tag as if this statement was executed:\n\n```go\nspan.SetTag(\"jaeger-debug-id\", \"some-correlation-id\")\n```\n\nThis allows using Jaeger UI to find the trace by this tag.\n\n### Zipkin HTTP B3 compatible header propagation\n\nJaeger Tracer supports Zipkin B3 Propagation HTTP headers, which are used\nby a lot of Zipkin tracers. This means that you can use Jaeger in conjunction with e.g. [these OpenZipkin tracers](https://github.com/openzipkin).\n\nHowever it is not the default propagation format, see [here](zipkin/README.md#NewZipkinB3HTTPHeaderPropagator) how to set it up.\n\n## License\n\n[Apache 2.0 License](LICENSE).\n\n\n[doc-img]: https://godoc.org/github.com/uber/jaeger-client-go?status.svg\n[doc]: https://godoc.org/github.com/uber/jaeger-client-go\n[ci-img]: https://travis-ci.org/jaegertracing/jaeger-client-go.svg?branch=master\n[ci]: https://travis-ci.org/jaegertracing/jaeger-client-go\n[cov-img]: https://codecov.io/gh/jaegertracing/jaeger-client-go/branch/master/graph/badge.svg\n[cov]: https://codecov.io/gh/jaegertracing/jaeger-client-go\n[ot-img]: https://img.shields.io/badge/OpenTracing--1.0-enabled-blue.svg\n[ot-url]: http://opentracing.io\n[baggage]: https://github.com/opentracing/specification/blob/master/specification.md#set-a-baggage-item\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/RELEASE.md",
    "content": "# Release Process\n\n1. Create a PR \"Preparing for release X.Y.Z\" against master branch\n    * Alter CHANGELOG.md from `<placeholder_version> (unreleased)` to `<X.Y.Z> (YYYY-MM-DD)`\n    * Update `JaegerClientVersion` in constants.go to `Go-X.Y.Z`\n2. Create a release \"Release X.Y.Z\" on Github\n    * Create Tag `vX.Y.Z`\n    * Copy CHANGELOG.md into the release notes\n3. Create a PR \"Back to development\" against master branch\n    * Add `<next_version> (unreleased)` to CHANGELOG.md\n    * Update `JaegerClientVersion` in constants.go to `Go-<next_version>dev`\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/baggage_setter.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"github.com/opentracing/opentracing-go/log\"\n\n\t\"github.com/uber/jaeger-client-go/internal/baggage\"\n)\n\n// baggageSetter is an actor that can set a baggage value on a Span given certain\n// restrictions (eg. maxValueLength).\ntype baggageSetter struct {\n\trestrictionManager baggage.RestrictionManager\n\tmetrics            *Metrics\n}\n\nfunc newBaggageSetter(restrictionManager baggage.RestrictionManager, metrics *Metrics) *baggageSetter {\n\treturn &baggageSetter{\n\t\trestrictionManager: restrictionManager,\n\t\tmetrics:            metrics,\n\t}\n}\n\n// (NB) span should hold the lock before making this call\nfunc (s *baggageSetter) setBaggage(span *Span, key, value string) {\n\tvar truncated bool\n\tvar prevItem string\n\trestriction := s.restrictionManager.GetRestriction(span.serviceName(), key)\n\tif !restriction.KeyAllowed() {\n\t\ts.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed())\n\t\ts.metrics.BaggageUpdateFailure.Inc(1)\n\t\treturn\n\t}\n\tif len(value) > restriction.MaxValueLength() {\n\t\ttruncated = true\n\t\tvalue = value[:restriction.MaxValueLength()]\n\t\ts.metrics.BaggageTruncate.Inc(1)\n\t}\n\tprevItem = span.context.baggage[key]\n\ts.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed())\n\tspan.context = span.context.WithBaggageItem(key, value)\n\ts.metrics.BaggageUpdateSuccess.Inc(1)\n}\n\nfunc (s *baggageSetter) logFields(span *Span, key, value, prevItem string, truncated, valid bool) {\n\tif !span.context.IsSampled() {\n\t\treturn\n\t}\n\tfields := []log.Field{\n\t\tlog.String(\"event\", \"baggage\"),\n\t\tlog.String(\"key\", key),\n\t\tlog.String(\"value\", value),\n\t}\n\tif prevItem != \"\" {\n\t\tfields = append(fields, log.String(\"override\", \"true\"))\n\t}\n\tif truncated {\n\t\tfields = append(fields, log.String(\"truncated\", \"true\"))\n\t}\n\tif !valid {\n\t\tfields = append(fields, log.String(\"invalid\", \"true\"))\n\t}\n\tspan.logFieldsNoLocking(fields...)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/config/config.go",
    "content": "// Copyright (c) 2017-2018 Uber Technologies, Inc.\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\npackage config\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go\"\n\n\t\"github.com/uber/jaeger-client-go\"\n\t\"github.com/uber/jaeger-client-go/internal/baggage/remote\"\n\tthrottler \"github.com/uber/jaeger-client-go/internal/throttler/remote\"\n\t\"github.com/uber/jaeger-client-go/rpcmetrics\"\n)\n\nconst defaultSamplingProbability = 0.001\n\n// Configuration configures and creates Jaeger Tracer\ntype Configuration struct {\n\t// ServiceName specifies the service name to use on the tracer.\n\t// Can be provided via environment variable named JAEGER_SERVICE_NAME\n\tServiceName string `yaml:\"serviceName\"`\n\n\t// Disabled can be provided via environment variable named JAEGER_DISABLED\n\tDisabled bool `yaml:\"disabled\"`\n\n\t// RPCMetrics can be provided via environment variable named JAEGER_RPC_METRICS\n\tRPCMetrics bool `yaml:\"rpc_metrics\"`\n\n\t// Tags can be provided via environment variable named JAEGER_TAGS\n\tTags []opentracing.Tag `yaml:\"tags\"`\n\n\tSampler             *SamplerConfig             `yaml:\"sampler\"`\n\tReporter            *ReporterConfig            `yaml:\"reporter\"`\n\tHeaders             *jaeger.HeadersConfig      `yaml:\"headers\"`\n\tBaggageRestrictions *BaggageRestrictionsConfig `yaml:\"baggage_restrictions\"`\n\tThrottler           *ThrottlerConfig           `yaml:\"throttler\"`\n}\n\n// SamplerConfig allows initializing a non-default sampler.  All fields are optional.\ntype SamplerConfig struct {\n\t// Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote\n\t// Can be set by exporting an environment variable named JAEGER_SAMPLER_TYPE\n\tType string `yaml:\"type\"`\n\n\t// Param is a value passed to the sampler.\n\t// Valid values for Param field are:\n\t// - for \"const\" sampler, 0 or 1 for always false/true respectively\n\t// - for \"probabilistic\" sampler, a probability between 0 and 1\n\t// - for \"rateLimiting\" sampler, the number of spans per second\n\t// - for \"remote\" sampler, param is the same as for \"probabilistic\"\n\t//   and indicates the initial sampling rate before the actual one\n\t//   is received from the mothership.\n\t// Can be set by exporting an environment variable named JAEGER_SAMPLER_PARAM\n\tParam float64 `yaml:\"param\"`\n\n\t// SamplingServerURL is the address of jaeger-agent's HTTP sampling server\n\t// Can be set by exporting an environment variable named JAEGER_SAMPLER_MANAGER_HOST_PORT\n\tSamplingServerURL string `yaml:\"samplingServerURL\"`\n\n\t// MaxOperations is the maximum number of operations that the sampler\n\t// will keep track of. If an operation is not tracked, a default probabilistic\n\t// sampler will be used rather than the per operation specific sampler.\n\t// Can be set by exporting an environment variable named JAEGER_SAMPLER_MAX_OPERATIONS\n\tMaxOperations int `yaml:\"maxOperations\"`\n\n\t// SamplingRefreshInterval controls how often the remotely controlled sampler will poll\n\t// jaeger-agent for the appropriate sampling strategy.\n\t// Can be set by exporting an environment variable named JAEGER_SAMPLER_REFRESH_INTERVAL\n\tSamplingRefreshInterval time.Duration `yaml:\"samplingRefreshInterval\"`\n}\n\n// ReporterConfig configures the reporter. All fields are optional.\ntype ReporterConfig struct {\n\t// QueueSize controls how many spans the reporter can keep in memory before it starts dropping\n\t// new spans. The queue is continuously drained by a background go-routine, as fast as spans\n\t// can be sent out of process.\n\t// Can be set by exporting an environment variable named JAEGER_REPORTER_MAX_QUEUE_SIZE\n\tQueueSize int `yaml:\"queueSize\"`\n\n\t// BufferFlushInterval controls how often the buffer is force-flushed, even if it's not full.\n\t// It is generally not useful, as it only matters for very low traffic services.\n\t// Can be set by exporting an environment variable named JAEGER_REPORTER_FLUSH_INTERVAL\n\tBufferFlushInterval time.Duration\n\n\t// LogSpans, when true, enables LoggingReporter that runs in parallel with the main reporter\n\t// and logs all submitted spans. Main Configuration.Logger must be initialized in the code\n\t// for this option to have any effect.\n\t// Can be set by exporting an environment variable named JAEGER_REPORTER_LOG_SPANS\n\tLogSpans bool `yaml:\"logSpans\"`\n\n\t// LocalAgentHostPort instructs reporter to send spans to jaeger-agent at this address\n\t// Can be set by exporting an environment variable named JAEGER_AGENT_HOST / JAEGER_AGENT_PORT\n\tLocalAgentHostPort string `yaml:\"localAgentHostPort\"`\n}\n\n// BaggageRestrictionsConfig configures the baggage restrictions manager which can be used to whitelist\n// certain baggage keys. All fields are optional.\ntype BaggageRestrictionsConfig struct {\n\t// DenyBaggageOnInitializationFailure controls the startup failure mode of the baggage restriction\n\t// manager. If true, the manager will not allow any baggage to be written until baggage restrictions have\n\t// been retrieved from jaeger-agent. If false, the manager wil allow any baggage to be written until baggage\n\t// restrictions have been retrieved from jaeger-agent.\n\tDenyBaggageOnInitializationFailure bool `yaml:\"denyBaggageOnInitializationFailure\"`\n\n\t// HostPort is the hostPort of jaeger-agent's baggage restrictions server\n\tHostPort string `yaml:\"hostPort\"`\n\n\t// RefreshInterval controls how often the baggage restriction manager will poll\n\t// jaeger-agent for the most recent baggage restrictions.\n\tRefreshInterval time.Duration `yaml:\"refreshInterval\"`\n}\n\n// ThrottlerConfig configures the throttler which can be used to throttle the\n// rate at which the client may send debug requests.\ntype ThrottlerConfig struct {\n\t// HostPort of jaeger-agent's credit server.\n\tHostPort string `yaml:\"hostPort\"`\n\n\t// RefreshInterval controls how often the throttler will poll jaeger-agent\n\t// for more throttling credits.\n\tRefreshInterval time.Duration `yaml:\"refreshInterval\"`\n\n\t// SynchronousInitialization determines whether or not the throttler should\n\t// synchronously fetch credits from the agent when an operation is seen for\n\t// the first time. This should be set to true if the client will be used by\n\t// a short lived service that needs to ensure that credits are fetched\n\t// upfront such that sampling or throttling occurs.\n\tSynchronousInitialization bool `yaml:\"synchronousInitialization\"`\n}\n\ntype nullCloser struct{}\n\nfunc (*nullCloser) Close() error { return nil }\n\n// New creates a new Jaeger Tracer, and a closer func that can be used to flush buffers\n// before shutdown.\n//\n// Deprecated: use NewTracer() function\nfunc (c Configuration) New(\n\tserviceName string,\n\toptions ...Option,\n) (opentracing.Tracer, io.Closer, error) {\n\tif serviceName != \"\" {\n\t\tc.ServiceName = serviceName\n\t}\n\n\treturn c.NewTracer(options...)\n}\n\n// NewTracer returns a new tracer based on the current configuration, using the given options,\n// and a closer func that can be used to flush buffers before shutdown.\nfunc (c Configuration) NewTracer(options ...Option) (opentracing.Tracer, io.Closer, error) {\n\tif c.ServiceName == \"\" {\n\t\treturn nil, nil, errors.New(\"no service name provided\")\n\t}\n\n\tif c.Disabled {\n\t\treturn &opentracing.NoopTracer{}, &nullCloser{}, nil\n\t}\n\topts := applyOptions(options...)\n\ttracerMetrics := jaeger.NewMetrics(opts.metrics, nil)\n\tif c.RPCMetrics {\n\t\tObserver(\n\t\t\trpcmetrics.NewObserver(\n\t\t\t\topts.metrics.Namespace(\"jaeger-rpc\", map[string]string{\"component\": \"jaeger\"}),\n\t\t\t\trpcmetrics.DefaultNameNormalizer,\n\t\t\t),\n\t\t)(&opts) // adds to c.observers\n\t}\n\tif c.Sampler == nil {\n\t\tc.Sampler = &SamplerConfig{\n\t\t\tType:  jaeger.SamplerTypeRemote,\n\t\t\tParam: defaultSamplingProbability,\n\t\t}\n\t}\n\tif c.Reporter == nil {\n\t\tc.Reporter = &ReporterConfig{}\n\t}\n\n\tsampler := opts.sampler\n\tif sampler == nil {\n\t\ts, err := c.Sampler.NewSampler(c.ServiceName, tracerMetrics)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\tsampler = s\n\t}\n\n\treporter := opts.reporter\n\tif reporter == nil {\n\t\tr, err := c.Reporter.NewReporter(c.ServiceName, tracerMetrics, opts.logger)\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\treporter = r\n\t}\n\n\ttracerOptions := []jaeger.TracerOption{\n\t\tjaeger.TracerOptions.Metrics(tracerMetrics),\n\t\tjaeger.TracerOptions.Logger(opts.logger),\n\t\tjaeger.TracerOptions.CustomHeaderKeys(c.Headers),\n\t\tjaeger.TracerOptions.Gen128Bit(opts.gen128Bit),\n\t\tjaeger.TracerOptions.ZipkinSharedRPCSpan(opts.zipkinSharedRPCSpan),\n\t\tjaeger.TracerOptions.MaxTagValueLength(opts.maxTagValueLength),\n\t}\n\n\tfor _, tag := range opts.tags {\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value))\n\t}\n\n\tfor _, tag := range c.Tags {\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value))\n\t}\n\n\tfor _, obs := range opts.observers {\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.Observer(obs))\n\t}\n\n\tfor _, cobs := range opts.contribObservers {\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.ContribObserver(cobs))\n\t}\n\n\tfor format, injector := range opts.injectors {\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.Injector(format, injector))\n\t}\n\n\tfor format, extractor := range opts.extractors {\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.Extractor(format, extractor))\n\t}\n\n\tif c.BaggageRestrictions != nil {\n\t\tmgr := remote.NewRestrictionManager(\n\t\t\tc.ServiceName,\n\t\t\tremote.Options.Metrics(tracerMetrics),\n\t\t\tremote.Options.Logger(opts.logger),\n\t\t\tremote.Options.HostPort(c.BaggageRestrictions.HostPort),\n\t\t\tremote.Options.RefreshInterval(c.BaggageRestrictions.RefreshInterval),\n\t\t\tremote.Options.DenyBaggageOnInitializationFailure(\n\t\t\t\tc.BaggageRestrictions.DenyBaggageOnInitializationFailure,\n\t\t\t),\n\t\t)\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.BaggageRestrictionManager(mgr))\n\t}\n\n\tif c.Throttler != nil {\n\t\tdebugThrottler := throttler.NewThrottler(\n\t\t\tc.ServiceName,\n\t\t\tthrottler.Options.Metrics(tracerMetrics),\n\t\t\tthrottler.Options.Logger(opts.logger),\n\t\t\tthrottler.Options.HostPort(c.Throttler.HostPort),\n\t\t\tthrottler.Options.RefreshInterval(c.Throttler.RefreshInterval),\n\t\t\tthrottler.Options.SynchronousInitialization(\n\t\t\t\tc.Throttler.SynchronousInitialization,\n\t\t\t),\n\t\t)\n\n\t\ttracerOptions = append(tracerOptions, jaeger.TracerOptions.DebugThrottler(debugThrottler))\n\t}\n\n\ttracer, closer := jaeger.NewTracer(\n\t\tc.ServiceName,\n\t\tsampler,\n\t\treporter,\n\t\ttracerOptions...,\n\t)\n\n\treturn tracer, closer, nil\n}\n\n// InitGlobalTracer creates a new Jaeger Tracer, and sets it as global OpenTracing Tracer.\n// It returns a closer func that can be used to flush buffers before shutdown.\nfunc (c Configuration) InitGlobalTracer(\n\tserviceName string,\n\toptions ...Option,\n) (io.Closer, error) {\n\tif c.Disabled {\n\t\treturn &nullCloser{}, nil\n\t}\n\ttracer, closer, err := c.New(serviceName, options...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\topentracing.SetGlobalTracer(tracer)\n\treturn closer, nil\n}\n\n// NewSampler creates a new sampler based on the configuration\nfunc (sc *SamplerConfig) NewSampler(\n\tserviceName string,\n\tmetrics *jaeger.Metrics,\n) (jaeger.Sampler, error) {\n\tsamplerType := strings.ToLower(sc.Type)\n\tif samplerType == jaeger.SamplerTypeConst {\n\t\treturn jaeger.NewConstSampler(sc.Param != 0), nil\n\t}\n\tif samplerType == jaeger.SamplerTypeProbabilistic {\n\t\tif sc.Param >= 0 && sc.Param <= 1.0 {\n\t\t\treturn jaeger.NewProbabilisticSampler(sc.Param)\n\t\t}\n\t\treturn nil, fmt.Errorf(\n\t\t\t\"Invalid Param for probabilistic sampler: %v. Expecting value between 0 and 1\",\n\t\t\tsc.Param,\n\t\t)\n\t}\n\tif samplerType == jaeger.SamplerTypeRateLimiting {\n\t\treturn jaeger.NewRateLimitingSampler(sc.Param), nil\n\t}\n\tif samplerType == jaeger.SamplerTypeRemote || sc.Type == \"\" {\n\t\tsc2 := *sc\n\t\tsc2.Type = jaeger.SamplerTypeProbabilistic\n\t\tinitSampler, err := sc2.NewSampler(serviceName, nil)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\toptions := []jaeger.SamplerOption{\n\t\t\tjaeger.SamplerOptions.Metrics(metrics),\n\t\t\tjaeger.SamplerOptions.InitialSampler(initSampler),\n\t\t\tjaeger.SamplerOptions.SamplingServerURL(sc.SamplingServerURL),\n\t\t}\n\t\tif sc.MaxOperations != 0 {\n\t\t\toptions = append(options, jaeger.SamplerOptions.MaxOperations(sc.MaxOperations))\n\t\t}\n\t\tif sc.SamplingRefreshInterval != 0 {\n\t\t\toptions = append(options, jaeger.SamplerOptions.SamplingRefreshInterval(sc.SamplingRefreshInterval))\n\t\t}\n\t\treturn jaeger.NewRemotelyControlledSampler(serviceName, options...), nil\n\t}\n\treturn nil, fmt.Errorf(\"Unknown sampler type %v\", sc.Type)\n}\n\n// NewReporter instantiates a new reporter that submits spans to tcollector\nfunc (rc *ReporterConfig) NewReporter(\n\tserviceName string,\n\tmetrics *jaeger.Metrics,\n\tlogger jaeger.Logger,\n) (jaeger.Reporter, error) {\n\tsender, err := rc.newTransport()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treporter := jaeger.NewRemoteReporter(\n\t\tsender,\n\t\tjaeger.ReporterOptions.QueueSize(rc.QueueSize),\n\t\tjaeger.ReporterOptions.BufferFlushInterval(rc.BufferFlushInterval),\n\t\tjaeger.ReporterOptions.Logger(logger),\n\t\tjaeger.ReporterOptions.Metrics(metrics))\n\tif rc.LogSpans && logger != nil {\n\t\tlogger.Infof(\"Initializing logging reporter\\n\")\n\t\treporter = jaeger.NewCompositeReporter(jaeger.NewLoggingReporter(logger), reporter)\n\t}\n\treturn reporter, err\n}\n\nfunc (rc *ReporterConfig) newTransport() (jaeger.Transport, error) {\n\treturn jaeger.NewUDPTransport(rc.LocalAgentHostPort, 0)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/config/config_env.go",
    "content": "// Copyright (c) 2018 The Jaeger Authors.\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\npackage config\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\topentracing \"github.com/opentracing/opentracing-go\"\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/uber/jaeger-client-go\"\n)\n\nconst (\n\t// environment variable names\n\tenvServiceName            = \"JAEGER_SERVICE_NAME\"\n\tenvDisabled               = \"JAEGER_DISABLED\"\n\tenvRPCMetrics             = \"JAEGER_RPC_METRICS\"\n\tenvTags                   = \"JAEGER_TAGS\"\n\tenvSamplerType            = \"JAEGER_SAMPLER_TYPE\"\n\tenvSamplerParam           = \"JAEGER_SAMPLER_PARAM\"\n\tenvSamplerManagerHostPort = \"JAEGER_SAMPLER_MANAGER_HOST_PORT\"\n\tenvSamplerMaxOperations   = \"JAEGER_SAMPLER_MAX_OPERATIONS\"\n\tenvSamplerRefreshInterval = \"JAEGER_SAMPLER_REFRESH_INTERVAL\"\n\tenvReporterMaxQueueSize   = \"JAEGER_REPORTER_MAX_QUEUE_SIZE\"\n\tenvReporterFlushInterval  = \"JAEGER_REPORTER_FLUSH_INTERVAL\"\n\tenvReporterLogSpans       = \"JAEGER_REPORTER_LOG_SPANS\"\n\tenvAgentHost              = \"JAEGER_AGENT_HOST\"\n\tenvAgentPort              = \"JAEGER_AGENT_PORT\"\n)\n\n// FromEnv uses environment variables to set the tracer's Configuration\nfunc FromEnv() (*Configuration, error) {\n\tc := &Configuration{}\n\n\tif e := os.Getenv(envServiceName); e != \"\" {\n\t\tc.ServiceName = e\n\t}\n\n\tif e := os.Getenv(envRPCMetrics); e != \"\" {\n\t\tif value, err := strconv.ParseBool(e); err == nil {\n\t\t\tc.RPCMetrics = value\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envRPCMetrics, e)\n\t\t}\n\t}\n\n\tif e := os.Getenv(envDisabled); e != \"\" {\n\t\tif value, err := strconv.ParseBool(e); err == nil {\n\t\t\tc.Disabled = value\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envDisabled, e)\n\t\t}\n\t}\n\n\tif e := os.Getenv(envTags); e != \"\" {\n\t\tc.Tags = parseTags(e)\n\t}\n\n\tif s, err := samplerConfigFromEnv(); err == nil {\n\t\tc.Sampler = s\n\t} else {\n\t\treturn nil, errors.Wrap(err, \"cannot obtain sampler config from env\")\n\t}\n\n\tif r, err := reporterConfigFromEnv(); err == nil {\n\t\tc.Reporter = r\n\t} else {\n\t\treturn nil, errors.Wrap(err, \"cannot obtain reporter config from env\")\n\t}\n\n\treturn c, nil\n}\n\n// samplerConfigFromEnv creates a new SamplerConfig based on the environment variables\nfunc samplerConfigFromEnv() (*SamplerConfig, error) {\n\tsc := &SamplerConfig{}\n\n\tif e := os.Getenv(envSamplerType); e != \"\" {\n\t\tsc.Type = e\n\t}\n\n\tif e := os.Getenv(envSamplerParam); e != \"\" {\n\t\tif value, err := strconv.ParseFloat(e, 64); err == nil {\n\t\t\tsc.Param = value\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envSamplerParam, e)\n\t\t}\n\t}\n\n\tif e := os.Getenv(envSamplerManagerHostPort); e != \"\" {\n\t\tsc.SamplingServerURL = e\n\t}\n\n\tif e := os.Getenv(envSamplerMaxOperations); e != \"\" {\n\t\tif value, err := strconv.ParseInt(e, 10, 0); err == nil {\n\t\t\tsc.MaxOperations = int(value)\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envSamplerMaxOperations, e)\n\t\t}\n\t}\n\n\tif e := os.Getenv(envSamplerRefreshInterval); e != \"\" {\n\t\tif value, err := time.ParseDuration(e); err == nil {\n\t\t\tsc.SamplingRefreshInterval = value\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envSamplerRefreshInterval, e)\n\t\t}\n\t}\n\n\treturn sc, nil\n}\n\n// reporterConfigFromEnv creates a new ReporterConfig based on the environment variables\nfunc reporterConfigFromEnv() (*ReporterConfig, error) {\n\trc := &ReporterConfig{}\n\n\tif e := os.Getenv(envReporterMaxQueueSize); e != \"\" {\n\t\tif value, err := strconv.ParseInt(e, 10, 0); err == nil {\n\t\t\trc.QueueSize = int(value)\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envReporterMaxQueueSize, e)\n\t\t}\n\t}\n\n\tif e := os.Getenv(envReporterFlushInterval); e != \"\" {\n\t\tif value, err := time.ParseDuration(e); err == nil {\n\t\t\trc.BufferFlushInterval = value\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envReporterFlushInterval, e)\n\t\t}\n\t}\n\n\tif e := os.Getenv(envReporterLogSpans); e != \"\" {\n\t\tif value, err := strconv.ParseBool(e); err == nil {\n\t\t\trc.LogSpans = value\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envReporterLogSpans, e)\n\t\t}\n\t}\n\n\thost := jaeger.DefaultUDPSpanServerHost\n\tif e := os.Getenv(envAgentHost); e != \"\" {\n\t\thost = e\n\t}\n\n\tport := jaeger.DefaultUDPSpanServerPort\n\tif e := os.Getenv(envAgentPort); e != \"\" {\n\t\tif value, err := strconv.ParseInt(e, 10, 0); err == nil {\n\t\t\tport = int(value)\n\t\t} else {\n\t\t\treturn nil, errors.Wrapf(err, \"cannot parse env var %s=%s\", envAgentPort, e)\n\t\t}\n\t}\n\n\t// the side effect of this is that we are building the default value, even if none of the env vars\n\t// were not explicitly passed\n\trc.LocalAgentHostPort = fmt.Sprintf(\"%s:%d\", host, port)\n\n\treturn rc, nil\n}\n\n// parseTags parses the given string into a collection of Tags.\n// Spec for this value:\n// - comma separated list of key=value\n// - value can be specified using the notation ${envVar:defaultValue}, where `envVar`\n// is an environment variable and `defaultValue` is the value to use in case the env var is not set\nfunc parseTags(sTags string) []opentracing.Tag {\n\tpairs := strings.Split(sTags, \",\")\n\ttags := make([]opentracing.Tag, 0)\n\tfor _, p := range pairs {\n\t\tkv := strings.SplitN(p, \"=\", 2)\n\t\tk, v := strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1])\n\n\t\tif strings.HasPrefix(v, \"${\") && strings.HasSuffix(v, \"}\") {\n\t\t\ted := strings.SplitN(v[2:len(v)-1], \":\", 2)\n\t\t\te, d := ed[0], ed[1]\n\t\t\tv = os.Getenv(e)\n\t\t\tif v == \"\" && d != \"\" {\n\t\t\t\tv = d\n\t\t\t}\n\t\t}\n\n\t\ttag := opentracing.Tag{Key: k, Value: v}\n\t\ttags = append(tags, tag)\n\t}\n\n\treturn tags\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/config/options.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage config\n\nimport (\n\topentracing \"github.com/opentracing/opentracing-go\"\n\t\"github.com/uber/jaeger-lib/metrics\"\n\n\t\"github.com/uber/jaeger-client-go\"\n)\n\n// Option is a function that sets some option on the client.\ntype Option func(c *Options)\n\n// Options control behavior of the client.\ntype Options struct {\n\tmetrics             metrics.Factory\n\tlogger              jaeger.Logger\n\treporter            jaeger.Reporter\n\tsampler             jaeger.Sampler\n\tcontribObservers    []jaeger.ContribObserver\n\tobservers           []jaeger.Observer\n\tgen128Bit           bool\n\tzipkinSharedRPCSpan bool\n\tmaxTagValueLength   int\n\ttags                []opentracing.Tag\n\tinjectors           map[interface{}]jaeger.Injector\n\textractors          map[interface{}]jaeger.Extractor\n}\n\n// Metrics creates an Option that initializes Metrics in the tracer,\n// which is used to emit statistics about spans.\nfunc Metrics(factory metrics.Factory) Option {\n\treturn func(c *Options) {\n\t\tc.metrics = factory\n\t}\n}\n\n// Logger can be provided to log Reporter errors, as well as to log spans\n// if Reporter.LogSpans is set to true.\nfunc Logger(logger jaeger.Logger) Option {\n\treturn func(c *Options) {\n\t\tc.logger = logger\n\t}\n}\n\n// Reporter can be provided explicitly to override the configuration.\n// Useful for testing, e.g. by passing InMemoryReporter.\nfunc Reporter(reporter jaeger.Reporter) Option {\n\treturn func(c *Options) {\n\t\tc.reporter = reporter\n\t}\n}\n\n// Sampler can be provided explicitly to override the configuration.\nfunc Sampler(sampler jaeger.Sampler) Option {\n\treturn func(c *Options) {\n\t\tc.sampler = sampler\n\t}\n}\n\n// Observer can be registered with the Tracer to receive notifications about new Spans.\nfunc Observer(observer jaeger.Observer) Option {\n\treturn func(c *Options) {\n\t\tc.observers = append(c.observers, observer)\n\t}\n}\n\n// ContribObserver can be registered with the Tracer to recieve notifications\n// about new spans.\nfunc ContribObserver(observer jaeger.ContribObserver) Option {\n\treturn func(c *Options) {\n\t\tc.contribObservers = append(c.contribObservers, observer)\n\t}\n}\n\n// Gen128Bit specifies whether to generate 128bit trace IDs.\nfunc Gen128Bit(gen128Bit bool) Option {\n\treturn func(c *Options) {\n\t\tc.gen128Bit = gen128Bit\n\t}\n}\n\n// ZipkinSharedRPCSpan creates an option that enables sharing span ID between client\n// and server spans a la zipkin. If false, client and server spans will be assigned\n// different IDs.\nfunc ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) Option {\n\treturn func(c *Options) {\n\t\tc.zipkinSharedRPCSpan = zipkinSharedRPCSpan\n\t}\n}\n\n// MaxTagValueLength can be provided to override the default max tag value length.\nfunc MaxTagValueLength(maxTagValueLength int) Option {\n\treturn func(c *Options) {\n\t\tc.maxTagValueLength = maxTagValueLength\n\t}\n}\n\n// Tag creates an option that adds a tracer-level tag.\nfunc Tag(key string, value interface{}) Option {\n\treturn func(c *Options) {\n\t\tc.tags = append(c.tags, opentracing.Tag{Key: key, Value: value})\n\t}\n}\n\n// Injector registers an Injector with the given format.\nfunc Injector(format interface{}, injector jaeger.Injector) Option {\n\treturn func(c *Options) {\n\t\tc.injectors[format] = injector\n\t}\n}\n\n// Extractor registers an Extractor with the given format.\nfunc Extractor(format interface{}, extractor jaeger.Extractor) Option {\n\treturn func(c *Options) {\n\t\tc.extractors[format] = extractor\n\t}\n}\n\nfunc applyOptions(options ...Option) Options {\n\topts := Options{\n\t\tinjectors:  make(map[interface{}]jaeger.Injector),\n\t\textractors: make(map[interface{}]jaeger.Extractor),\n\t}\n\tfor _, option := range options {\n\t\toption(&opts)\n\t}\n\tif opts.metrics == nil {\n\t\topts.metrics = metrics.NullFactory\n\t}\n\tif opts.logger == nil {\n\t\topts.logger = jaeger.NullLogger\n\t}\n\treturn opts\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/constants.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nconst (\n\t// JaegerClientVersion is the version of the client library reported as Span tag.\n\tJaegerClientVersion = \"Go-2.15.0-dev\"\n\n\t// JaegerClientVersionTagKey is the name of the tag used to report client version.\n\tJaegerClientVersionTagKey = \"jaeger.version\"\n\n\t// JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which,\n\t// if found in the carrier, forces the trace to be sampled as \"debug\" trace.\n\t// The value of the header is recorded as the tag on the root span, so that the\n\t// trace can be found in the UI using this value as a correlation ID.\n\tJaegerDebugHeader = \"jaeger-debug-id\"\n\n\t// JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage.\n\t// It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where\n\t// a root span does not exist.\n\tJaegerBaggageHeader = \"jaeger-baggage\"\n\n\t// TracerHostnameTagKey used to report host name of the process.\n\tTracerHostnameTagKey = \"hostname\"\n\n\t// TracerIPTagKey used to report ip of the process.\n\tTracerIPTagKey = \"ip\"\n\n\t// TracerUUIDTagKey used to report UUID of the client process.\n\tTracerUUIDTagKey = \"client-uuid\"\n\n\t// SamplerTypeTagKey reports which sampler was used on the root span.\n\tSamplerTypeTagKey = \"sampler.type\"\n\n\t// SamplerParamTagKey reports the parameter of the sampler, like sampling probability.\n\tSamplerParamTagKey = \"sampler.param\"\n\n\t// TraceContextHeaderName is the http header name used to propagate tracing context.\n\t// This must be in lower-case to avoid mismatches when decoding incoming headers.\n\tTraceContextHeaderName = \"uber-trace-id\"\n\n\t// TracerStateHeaderName is deprecated.\n\t// Deprecated: use TraceContextHeaderName\n\tTracerStateHeaderName = TraceContextHeaderName\n\n\t// TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage.\n\t// This must be in lower-case to avoid mismatches when decoding incoming headers.\n\tTraceBaggageHeaderPrefix = \"uberctx-\"\n\n\t// SamplerTypeConst is the type of sampler that always makes the same decision.\n\tSamplerTypeConst = \"const\"\n\n\t// SamplerTypeRemote is the type of sampler that polls Jaeger agent for sampling strategy.\n\tSamplerTypeRemote = \"remote\"\n\n\t// SamplerTypeProbabilistic is the type of sampler that samples traces\n\t// with a certain fixed probability.\n\tSamplerTypeProbabilistic = \"probabilistic\"\n\n\t// SamplerTypeRateLimiting is the type of sampler that samples\n\t// only up to a fixed number of traces per second.\n\tSamplerTypeRateLimiting = \"ratelimiting\"\n\n\t// SamplerTypeLowerBound is the type of sampler that samples\n\t// at least a fixed number of traces per second.\n\tSamplerTypeLowerBound = \"lowerbound\"\n\n\t// DefaultUDPSpanServerHost is the default host to send the spans to, via UDP\n\tDefaultUDPSpanServerHost = \"localhost\"\n\n\t// DefaultUDPSpanServerPort is the default port to send the spans to, via UDP\n\tDefaultUDPSpanServerPort = 6831\n\n\t// DefaultMaxTagValueLength is the default max length of byte array or string allowed in the tag value.\n\tDefaultMaxTagValueLength = 256\n)\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/context.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nconst (\n\tflagSampled = byte(1)\n\tflagDebug   = byte(2)\n)\n\nvar (\n\terrEmptyTracerStateString     = errors.New(\"Cannot convert empty string to tracer state\")\n\terrMalformedTracerStateString = errors.New(\"String does not match tracer state format\")\n\n\temptyContext = SpanContext{}\n)\n\n// TraceID represents unique 128bit identifier of a trace\ntype TraceID struct {\n\tHigh, Low uint64\n}\n\n// SpanID represents unique 64bit identifier of a span\ntype SpanID uint64\n\n// SpanContext represents propagated span identity and state\ntype SpanContext struct {\n\t// traceID represents globally unique ID of the trace.\n\t// Usually generated as a random number.\n\ttraceID TraceID\n\n\t// spanID represents span ID that must be unique within its trace,\n\t// but does not have to be globally unique.\n\tspanID SpanID\n\n\t// parentID refers to the ID of the parent span.\n\t// Should be 0 if the current span is a root span.\n\tparentID SpanID\n\n\t// flags is a bitmap containing such bits as 'sampled' and 'debug'.\n\tflags byte\n\n\t// Distributed Context baggage. The is a snapshot in time.\n\tbaggage map[string]string\n\n\t// debugID can be set to some correlation ID when the context is being\n\t// extracted from a TextMap carrier.\n\t//\n\t// See JaegerDebugHeader in constants.go\n\tdebugID string\n}\n\n// ForeachBaggageItem implements ForeachBaggageItem() of opentracing.SpanContext\nfunc (c SpanContext) ForeachBaggageItem(handler func(k, v string) bool) {\n\tfor k, v := range c.baggage {\n\t\tif !handler(k, v) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// IsSampled returns whether this trace was chosen for permanent storage\n// by the sampling mechanism of the tracer.\nfunc (c SpanContext) IsSampled() bool {\n\treturn (c.flags & flagSampled) == flagSampled\n}\n\n// IsDebug indicates whether sampling was explicitly requested by the service.\nfunc (c SpanContext) IsDebug() bool {\n\treturn (c.flags & flagDebug) == flagDebug\n}\n\n// IsValid indicates whether this context actually represents a valid trace.\nfunc (c SpanContext) IsValid() bool {\n\treturn c.traceID.IsValid() && c.spanID != 0\n}\n\nfunc (c SpanContext) String() string {\n\tif c.traceID.High == 0 {\n\t\treturn fmt.Sprintf(\"%x:%x:%x:%x\", c.traceID.Low, uint64(c.spanID), uint64(c.parentID), c.flags)\n\t}\n\treturn fmt.Sprintf(\"%x%016x:%x:%x:%x\", c.traceID.High, c.traceID.Low, uint64(c.spanID), uint64(c.parentID), c.flags)\n}\n\n// ContextFromString reconstructs the Context encoded in a string\nfunc ContextFromString(value string) (SpanContext, error) {\n\tvar context SpanContext\n\tif value == \"\" {\n\t\treturn emptyContext, errEmptyTracerStateString\n\t}\n\tparts := strings.Split(value, \":\")\n\tif len(parts) != 4 {\n\t\treturn emptyContext, errMalformedTracerStateString\n\t}\n\tvar err error\n\tif context.traceID, err = TraceIDFromString(parts[0]); err != nil {\n\t\treturn emptyContext, err\n\t}\n\tif context.spanID, err = SpanIDFromString(parts[1]); err != nil {\n\t\treturn emptyContext, err\n\t}\n\tif context.parentID, err = SpanIDFromString(parts[2]); err != nil {\n\t\treturn emptyContext, err\n\t}\n\tflags, err := strconv.ParseUint(parts[3], 10, 8)\n\tif err != nil {\n\t\treturn emptyContext, err\n\t}\n\tcontext.flags = byte(flags)\n\treturn context, nil\n}\n\n// TraceID returns the trace ID of this span context\nfunc (c SpanContext) TraceID() TraceID {\n\treturn c.traceID\n}\n\n// SpanID returns the span ID of this span context\nfunc (c SpanContext) SpanID() SpanID {\n\treturn c.spanID\n}\n\n// ParentID returns the parent span ID of this span context\nfunc (c SpanContext) ParentID() SpanID {\n\treturn c.parentID\n}\n\n// NewSpanContext creates a new instance of SpanContext\nfunc NewSpanContext(traceID TraceID, spanID, parentID SpanID, sampled bool, baggage map[string]string) SpanContext {\n\tflags := byte(0)\n\tif sampled {\n\t\tflags = flagSampled\n\t}\n\treturn SpanContext{\n\t\ttraceID:  traceID,\n\t\tspanID:   spanID,\n\t\tparentID: parentID,\n\t\tflags:    flags,\n\t\tbaggage:  baggage}\n}\n\n// CopyFrom copies data from ctx into this context, including span identity and baggage.\n// TODO This is only used by interop.go. Remove once TChannel Go supports OpenTracing.\nfunc (c *SpanContext) CopyFrom(ctx *SpanContext) {\n\tc.traceID = ctx.traceID\n\tc.spanID = ctx.spanID\n\tc.parentID = ctx.parentID\n\tc.flags = ctx.flags\n\tif l := len(ctx.baggage); l > 0 {\n\t\tc.baggage = make(map[string]string, l)\n\t\tfor k, v := range ctx.baggage {\n\t\t\tc.baggage[k] = v\n\t\t}\n\t} else {\n\t\tc.baggage = nil\n\t}\n}\n\n// WithBaggageItem creates a new context with an extra baggage item.\nfunc (c SpanContext) WithBaggageItem(key, value string) SpanContext {\n\tvar newBaggage map[string]string\n\tif c.baggage == nil {\n\t\tnewBaggage = map[string]string{key: value}\n\t} else {\n\t\tnewBaggage = make(map[string]string, len(c.baggage)+1)\n\t\tfor k, v := range c.baggage {\n\t\t\tnewBaggage[k] = v\n\t\t}\n\t\tnewBaggage[key] = value\n\t}\n\t// Use positional parameters so the compiler will help catch new fields.\n\treturn SpanContext{c.traceID, c.spanID, c.parentID, c.flags, newBaggage, \"\"}\n}\n\n// isDebugIDContainerOnly returns true when the instance of the context is only\n// used to return the debug/correlation ID from extract() method. This happens\n// in the situation when \"jaeger-debug-id\" header is passed in the carrier to\n// the extract() method, but the request otherwise has no span context in it.\n// Previously this would've returned opentracing.ErrSpanContextNotFound from the\n// extract method, but now it returns a dummy context with only debugID filled in.\n//\n// See JaegerDebugHeader in constants.go\n// See textMapPropagator#Extract\nfunc (c *SpanContext) isDebugIDContainerOnly() bool {\n\treturn !c.traceID.IsValid() && c.debugID != \"\"\n}\n\n// ------- TraceID -------\n\nfunc (t TraceID) String() string {\n\tif t.High == 0 {\n\t\treturn fmt.Sprintf(\"%x\", t.Low)\n\t}\n\treturn fmt.Sprintf(\"%x%016x\", t.High, t.Low)\n}\n\n// TraceIDFromString creates a TraceID from a hexadecimal string\nfunc TraceIDFromString(s string) (TraceID, error) {\n\tvar hi, lo uint64\n\tvar err error\n\tif len(s) > 32 {\n\t\treturn TraceID{}, fmt.Errorf(\"TraceID cannot be longer than 32 hex characters: %s\", s)\n\t} else if len(s) > 16 {\n\t\thiLen := len(s) - 16\n\t\tif hi, err = strconv.ParseUint(s[0:hiLen], 16, 64); err != nil {\n\t\t\treturn TraceID{}, err\n\t\t}\n\t\tif lo, err = strconv.ParseUint(s[hiLen:], 16, 64); err != nil {\n\t\t\treturn TraceID{}, err\n\t\t}\n\t} else {\n\t\tif lo, err = strconv.ParseUint(s, 16, 64); err != nil {\n\t\t\treturn TraceID{}, err\n\t\t}\n\t}\n\treturn TraceID{High: hi, Low: lo}, nil\n}\n\n// IsValid checks if the trace ID is valid, i.e. not zero.\nfunc (t TraceID) IsValid() bool {\n\treturn t.High != 0 || t.Low != 0\n}\n\n// ------- SpanID -------\n\nfunc (s SpanID) String() string {\n\treturn fmt.Sprintf(\"%x\", uint64(s))\n}\n\n// SpanIDFromString creates a SpanID from a hexadecimal string\nfunc SpanIDFromString(s string) (SpanID, error) {\n\tif len(s) > 16 {\n\t\treturn SpanID(0), fmt.Errorf(\"SpanID cannot be longer than 16 hex characters: %s\", s)\n\t}\n\tid, err := strconv.ParseUint(s, 16, 64)\n\tif err != nil {\n\t\treturn SpanID(0), err\n\t}\n\treturn SpanID(id), nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/contrib_observer.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\topentracing \"github.com/opentracing/opentracing-go\"\n)\n\n// ContribObserver can be registered with the Tracer to receive notifications\n// about new Spans. Modelled after github.com/opentracing-contrib/go-observer.\ntype ContribObserver interface {\n\t// Create and return a span observer. Called when a span starts.\n\t// If the Observer is not interested in the given span, it must return (nil, false).\n\t// E.g :\n\t//     func StartSpan(opName string, opts ...opentracing.StartSpanOption) {\n\t//         var sp opentracing.Span\n\t//         sso := opentracing.StartSpanOptions{}\n\t//         if spanObserver, ok := Observer.OnStartSpan(span, opName, sso); ok {\n\t//             // we have a valid SpanObserver\n\t//         }\n\t//         ...\n\t//     }\n\tOnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool)\n}\n\n// ContribSpanObserver is created by the Observer and receives notifications\n// about other Span events. This interface is meant to match\n// github.com/opentracing-contrib/go-observer, via duck typing, without\n// directly importing the go-observer package.\ntype ContribSpanObserver interface {\n\tOnSetOperationName(operationName string)\n\tOnSetTag(key string, value interface{})\n\tOnFinish(options opentracing.FinishOptions)\n}\n\n// wrapper observer for the old observers (see observer.go)\ntype oldObserver struct {\n\tobs Observer\n}\n\nfunc (o *oldObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool) {\n\tspanObserver := o.obs.OnStartSpan(operationName, options)\n\treturn spanObserver, spanObserver != nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/doc.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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/*\nPackage jaeger implements an OpenTracing (http://opentracing.io) Tracer.\nIt is currently using Zipkin-compatible data model and can be directly\nitegrated with Zipkin backend (http://zipkin.io).\n\nFor integration instructions please refer to the README:\n\nhttps://github.com/uber/jaeger-client-go/blob/master/README.md\n*/\npackage jaeger\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/glide.yaml",
    "content": "package: github.com/uber/jaeger-client-go\nimport:\n- package: github.com/opentracing/opentracing-go\n  version: ^1\n  subpackages:\n  - ext\n  - log\n- package: github.com/crossdock/crossdock-go\n- package: github.com/uber/jaeger-lib\n  version: ^1.2.1\n  subpackages:\n  - metrics\n- package: github.com/pkg/errors\n  version: ~0.8.0\ntestImport:\n- package: github.com/stretchr/testify\n  subpackages:\n  - assert\n  - require\n  - suite\n- package: github.com/prometheus/client_golang\n  version: v0.8.0\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/header.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\n// HeadersConfig contains the values for the header keys that Jaeger will use.\n// These values may be either custom or default depending on whether custom\n// values were provided via a configuration.\ntype HeadersConfig struct {\n\t// JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which,\n\t// if found in the carrier, forces the trace to be sampled as \"debug\" trace.\n\t// The value of the header is recorded as the tag on the root span, so that the\n\t// trace can be found in the UI using this value as a correlation ID.\n\tJaegerDebugHeader string `yaml:\"jaegerDebugHeader\"`\n\n\t// JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage.\n\t// It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where\n\t// a root span does not exist.\n\tJaegerBaggageHeader string `yaml:\"jaegerBaggageHeader\"`\n\n\t// TraceContextHeaderName is the http header name used to propagate tracing context.\n\t// This must be in lower-case to avoid mismatches when decoding incoming headers.\n\tTraceContextHeaderName string `yaml:\"TraceContextHeaderName\"`\n\n\t// TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage.\n\t// This must be in lower-case to avoid mismatches when decoding incoming headers.\n\tTraceBaggageHeaderPrefix string `yaml:\"traceBaggageHeaderPrefix\"`\n}\n\nfunc (c *HeadersConfig) applyDefaults() *HeadersConfig {\n\tif c.JaegerBaggageHeader == \"\" {\n\t\tc.JaegerBaggageHeader = JaegerBaggageHeader\n\t}\n\tif c.JaegerDebugHeader == \"\" {\n\t\tc.JaegerDebugHeader = JaegerDebugHeader\n\t}\n\tif c.TraceBaggageHeaderPrefix == \"\" {\n\t\tc.TraceBaggageHeaderPrefix = TraceBaggageHeaderPrefix\n\t}\n\tif c.TraceContextHeaderName == \"\" {\n\t\tc.TraceContextHeaderName = TraceContextHeaderName\n\t}\n\treturn c\n}\n\nfunc getDefaultHeadersConfig() *HeadersConfig {\n\treturn &HeadersConfig{\n\t\tJaegerDebugHeader:        JaegerDebugHeader,\n\t\tJaegerBaggageHeader:      JaegerBaggageHeader,\n\t\tTraceContextHeaderName:   TraceContextHeaderName,\n\t\tTraceBaggageHeaderPrefix: TraceBaggageHeaderPrefix,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage remote\n\nimport (\n\t\"time\"\n\n\t\"github.com/uber/jaeger-client-go\"\n)\n\nconst (\n\tdefaultMaxValueLength  = 2048\n\tdefaultRefreshInterval = time.Minute\n\tdefaultHostPort        = \"localhost:5778\"\n)\n\n// Option is a function that sets some option on the RestrictionManager\ntype Option func(options *options)\n\n// Options is a factory for all available options\nvar Options options\n\ntype options struct {\n\tdenyBaggageOnInitializationFailure bool\n\tmetrics                            *jaeger.Metrics\n\tlogger                             jaeger.Logger\n\thostPort                           string\n\trefreshInterval                    time.Duration\n}\n\n// DenyBaggageOnInitializationFailure creates an Option that determines the startup failure mode of RestrictionManager.\n// If DenyBaggageOnInitializationFailure is true, RestrictionManager will not allow any baggage to be written until baggage\n// restrictions have been retrieved from agent.\n// If DenyBaggageOnInitializationFailure is false, RestrictionManager will allow any baggage to be written until baggage\n// restrictions have been retrieved from agent.\nfunc (options) DenyBaggageOnInitializationFailure(b bool) Option {\n\treturn func(o *options) {\n\t\to.denyBaggageOnInitializationFailure = b\n\t}\n}\n\n// Metrics creates an Option that initializes Metrics on the RestrictionManager, which is used to emit statistics.\nfunc (options) Metrics(m *jaeger.Metrics) Option {\n\treturn func(o *options) {\n\t\to.metrics = m\n\t}\n}\n\n// Logger creates an Option that sets the logger used by the RestrictionManager.\nfunc (options) Logger(logger jaeger.Logger) Option {\n\treturn func(o *options) {\n\t\to.logger = logger\n\t}\n}\n\n// HostPort creates an Option that sets the hostPort of the local agent that contains the baggage restrictions.\nfunc (options) HostPort(hostPort string) Option {\n\treturn func(o *options) {\n\t\to.hostPort = hostPort\n\t}\n}\n\n// RefreshInterval creates an Option that sets how often the RestrictionManager will poll local agent for\n// the baggage restrictions.\nfunc (options) RefreshInterval(refreshInterval time.Duration) Option {\n\treturn func(o *options) {\n\t\to.refreshInterval = refreshInterval\n\t}\n}\n\nfunc applyOptions(o ...Option) options {\n\topts := options{}\n\tfor _, option := range o {\n\t\toption(&opts)\n\t}\n\tif opts.metrics == nil {\n\t\topts.metrics = jaeger.NewNullMetrics()\n\t}\n\tif opts.logger == nil {\n\t\topts.logger = jaeger.NullLogger\n\t}\n\tif opts.hostPort == \"\" {\n\t\topts.hostPort = defaultHostPort\n\t}\n\tif opts.refreshInterval == 0 {\n\t\topts.refreshInterval = defaultRefreshInterval\n\t}\n\treturn opts\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage remote\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/uber/jaeger-client-go/internal/baggage\"\n\tthrift \"github.com/uber/jaeger-client-go/thrift-gen/baggage\"\n\t\"github.com/uber/jaeger-client-go/utils\"\n)\n\ntype httpBaggageRestrictionManagerProxy struct {\n\turl string\n}\n\nfunc newHTTPBaggageRestrictionManagerProxy(hostPort, serviceName string) *httpBaggageRestrictionManagerProxy {\n\tv := url.Values{}\n\tv.Set(\"service\", serviceName)\n\treturn &httpBaggageRestrictionManagerProxy{\n\t\turl: fmt.Sprintf(\"http://%s/baggageRestrictions?%s\", hostPort, v.Encode()),\n\t}\n}\n\nfunc (s *httpBaggageRestrictionManagerProxy) GetBaggageRestrictions(serviceName string) ([]*thrift.BaggageRestriction, error) {\n\tvar out []*thrift.BaggageRestriction\n\tif err := utils.GetJSON(s.url, &out); err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// RestrictionManager manages baggage restrictions by retrieving baggage restrictions from agent\ntype RestrictionManager struct {\n\toptions\n\n\tmux                sync.RWMutex\n\tserviceName        string\n\trestrictions       map[string]*baggage.Restriction\n\tthriftProxy        thrift.BaggageRestrictionManager\n\tpollStopped        sync.WaitGroup\n\tstopPoll           chan struct{}\n\tinvalidRestriction *baggage.Restriction\n\tvalidRestriction   *baggage.Restriction\n\n\t// Determines if the manager has successfully retrieved baggage restrictions from agent\n\tinitialized bool\n}\n\n// NewRestrictionManager returns a BaggageRestrictionManager that polls the agent for the latest\n// baggage restrictions.\nfunc NewRestrictionManager(serviceName string, options ...Option) *RestrictionManager {\n\t// TODO there is a developing use case where a single tracer can generate traces on behalf of many services.\n\t// restrictionsMap will need to exist per service\n\topts := applyOptions(options...)\n\tm := &RestrictionManager{\n\t\tserviceName:        serviceName,\n\t\toptions:            opts,\n\t\trestrictions:       make(map[string]*baggage.Restriction),\n\t\tthriftProxy:        newHTTPBaggageRestrictionManagerProxy(opts.hostPort, serviceName),\n\t\tstopPoll:           make(chan struct{}),\n\t\tinvalidRestriction: baggage.NewRestriction(false, 0),\n\t\tvalidRestriction:   baggage.NewRestriction(true, defaultMaxValueLength),\n\t}\n\tm.pollStopped.Add(1)\n\tgo m.pollManager()\n\treturn m\n}\n\n// isReady returns true if the manager has retrieved baggage restrictions from the remote source.\nfunc (m *RestrictionManager) isReady() bool {\n\tm.mux.RLock()\n\tdefer m.mux.RUnlock()\n\treturn m.initialized\n}\n\n// GetRestriction implements RestrictionManager#GetRestriction.\nfunc (m *RestrictionManager) GetRestriction(service, key string) *baggage.Restriction {\n\tm.mux.RLock()\n\tdefer m.mux.RUnlock()\n\tif !m.initialized {\n\t\tif m.denyBaggageOnInitializationFailure {\n\t\t\treturn m.invalidRestriction\n\t\t}\n\t\treturn m.validRestriction\n\t}\n\tif restriction, ok := m.restrictions[key]; ok {\n\t\treturn restriction\n\t}\n\treturn m.invalidRestriction\n}\n\n// Close stops remote polling and closes the RemoteRestrictionManager.\nfunc (m *RestrictionManager) Close() error {\n\tclose(m.stopPoll)\n\tm.pollStopped.Wait()\n\treturn nil\n}\n\nfunc (m *RestrictionManager) pollManager() {\n\tdefer m.pollStopped.Done()\n\t// attempt to initialize baggage restrictions\n\tif err := m.updateRestrictions(); err != nil {\n\t\tm.logger.Error(fmt.Sprintf(\"Failed to initialize baggage restrictions: %s\", err.Error()))\n\t}\n\tticker := time.NewTicker(m.refreshInterval)\n\tdefer ticker.Stop()\n\n\tfor {\n\t\tselect {\n\t\tcase <-ticker.C:\n\t\t\tif err := m.updateRestrictions(); err != nil {\n\t\t\t\tm.logger.Error(fmt.Sprintf(\"Failed to update baggage restrictions: %s\", err.Error()))\n\t\t\t}\n\t\tcase <-m.stopPoll:\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (m *RestrictionManager) updateRestrictions() error {\n\trestrictions, err := m.thriftProxy.GetBaggageRestrictions(m.serviceName)\n\tif err != nil {\n\t\tm.metrics.BaggageRestrictionsUpdateFailure.Inc(1)\n\t\treturn err\n\t}\n\tnewRestrictions := m.parseRestrictions(restrictions)\n\tm.metrics.BaggageRestrictionsUpdateSuccess.Inc(1)\n\tm.mux.Lock()\n\tdefer m.mux.Unlock()\n\tm.initialized = true\n\tm.restrictions = newRestrictions\n\treturn nil\n}\n\nfunc (m *RestrictionManager) parseRestrictions(restrictions []*thrift.BaggageRestriction) map[string]*baggage.Restriction {\n\tsetters := make(map[string]*baggage.Restriction, len(restrictions))\n\tfor _, restriction := range restrictions {\n\t\tsetters[restriction.BaggageKey] = baggage.NewRestriction(true, int(restriction.MaxValueLength))\n\t}\n\treturn setters\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage baggage\n\nconst (\n\tdefaultMaxValueLength = 2048\n)\n\n// Restriction determines whether a baggage key is allowed and contains any restrictions on the baggage value.\ntype Restriction struct {\n\tkeyAllowed     bool\n\tmaxValueLength int\n}\n\n// NewRestriction returns a new Restriction.\nfunc NewRestriction(keyAllowed bool, maxValueLength int) *Restriction {\n\treturn &Restriction{\n\t\tkeyAllowed:     keyAllowed,\n\t\tmaxValueLength: maxValueLength,\n\t}\n}\n\n// KeyAllowed returns whether the baggage key for this restriction is allowed.\nfunc (r *Restriction) KeyAllowed() bool {\n\treturn r.keyAllowed\n}\n\n// MaxValueLength returns the max length for the baggage value.\nfunc (r *Restriction) MaxValueLength() int {\n\treturn r.maxValueLength\n}\n\n// RestrictionManager keeps track of valid baggage keys and their restrictions. The manager\n// will return a Restriction for a specific baggage key which will determine whether the baggage\n// key is allowed for the current service and any other applicable restrictions on the baggage\n// value.\ntype RestrictionManager interface {\n\tGetRestriction(service, key string) *Restriction\n}\n\n// DefaultRestrictionManager allows any baggage key.\ntype DefaultRestrictionManager struct {\n\tdefaultRestriction *Restriction\n}\n\n// NewDefaultRestrictionManager returns a DefaultRestrictionManager.\nfunc NewDefaultRestrictionManager(maxValueLength int) *DefaultRestrictionManager {\n\tif maxValueLength == 0 {\n\t\tmaxValueLength = defaultMaxValueLength\n\t}\n\treturn &DefaultRestrictionManager{\n\t\tdefaultRestriction: &Restriction{keyAllowed: true, maxValueLength: maxValueLength},\n\t}\n}\n\n// GetRestriction implements RestrictionManager#GetRestriction.\nfunc (m *DefaultRestrictionManager) GetRestriction(service, key string) *Restriction {\n\treturn m.defaultRestriction\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage spanlog\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/opentracing/opentracing-go/log\"\n)\n\ntype fieldsAsMap map[string]string\n\n// MaterializeWithJSON converts log Fields into JSON string\n// TODO refactor into pluggable materializer\nfunc MaterializeWithJSON(logFields []log.Field) ([]byte, error) {\n\tfields := fieldsAsMap(make(map[string]string, len(logFields)))\n\tfor _, field := range logFields {\n\t\tfield.Marshal(fields)\n\t}\n\tif event, ok := fields[\"event\"]; ok && len(fields) == 1 {\n\t\treturn []byte(event), nil\n\t}\n\treturn json.Marshal(fields)\n}\n\nfunc (ml fieldsAsMap) EmitString(key, value string) {\n\tml[key] = value\n}\n\nfunc (ml fieldsAsMap) EmitBool(key string, value bool) {\n\tml[key] = fmt.Sprintf(\"%t\", value)\n}\n\nfunc (ml fieldsAsMap) EmitInt(key string, value int) {\n\tml[key] = fmt.Sprintf(\"%d\", value)\n}\n\nfunc (ml fieldsAsMap) EmitInt32(key string, value int32) {\n\tml[key] = fmt.Sprintf(\"%d\", value)\n}\n\nfunc (ml fieldsAsMap) EmitInt64(key string, value int64) {\n\tml[key] = fmt.Sprintf(\"%d\", value)\n}\n\nfunc (ml fieldsAsMap) EmitUint32(key string, value uint32) {\n\tml[key] = fmt.Sprintf(\"%d\", value)\n}\n\nfunc (ml fieldsAsMap) EmitUint64(key string, value uint64) {\n\tml[key] = fmt.Sprintf(\"%d\", value)\n}\n\nfunc (ml fieldsAsMap) EmitFloat32(key string, value float32) {\n\tml[key] = fmt.Sprintf(\"%f\", value)\n}\n\nfunc (ml fieldsAsMap) EmitFloat64(key string, value float64) {\n\tml[key] = fmt.Sprintf(\"%f\", value)\n}\n\nfunc (ml fieldsAsMap) EmitObject(key string, value interface{}) {\n\tml[key] = fmt.Sprintf(\"%+v\", value)\n}\n\nfunc (ml fieldsAsMap) EmitLazyLogger(value log.LazyLogger) {\n\tvalue(ml)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go",
    "content": "// Copyright (c) 2018 The Jaeger Authors.\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\npackage remote\n\nimport (\n\t\"time\"\n\n\t\"github.com/uber/jaeger-client-go\"\n)\n\nconst (\n\tdefaultHostPort        = \"localhost:5778\"\n\tdefaultRefreshInterval = time.Second * 5\n)\n\n// Option is a function that sets some option on the Throttler\ntype Option func(options *options)\n\n// Options is a factory for all available options\nvar Options options\n\ntype options struct {\n\tmetrics                   *jaeger.Metrics\n\tlogger                    jaeger.Logger\n\thostPort                  string\n\trefreshInterval           time.Duration\n\tsynchronousInitialization bool\n}\n\n// Metrics creates an Option that initializes Metrics on the Throttler, which is used to emit statistics.\nfunc (options) Metrics(m *jaeger.Metrics) Option {\n\treturn func(o *options) {\n\t\to.metrics = m\n\t}\n}\n\n// Logger creates an Option that sets the logger used by the Throttler.\nfunc (options) Logger(logger jaeger.Logger) Option {\n\treturn func(o *options) {\n\t\to.logger = logger\n\t}\n}\n\n// HostPort creates an Option that sets the hostPort of the local agent that keeps track of credits.\nfunc (options) HostPort(hostPort string) Option {\n\treturn func(o *options) {\n\t\to.hostPort = hostPort\n\t}\n}\n\n// RefreshInterval creates an Option that sets how often the Throttler will poll local agent for\n// credits.\nfunc (options) RefreshInterval(refreshInterval time.Duration) Option {\n\treturn func(o *options) {\n\t\to.refreshInterval = refreshInterval\n\t}\n}\n\n// SynchronousInitialization creates an Option that determines whether the throttler should synchronously\n// fetch credits from the agent when an operation is seen for the first time. This should be set to true\n// if the client will be used by a short lived service that needs to ensure that credits are fetched upfront\n// such that sampling or throttling occurs.\nfunc (options) SynchronousInitialization(b bool) Option {\n\treturn func(o *options) {\n\t\to.synchronousInitialization = b\n\t}\n}\n\nfunc applyOptions(o ...Option) options {\n\topts := options{}\n\tfor _, option := range o {\n\t\toption(&opts)\n\t}\n\tif opts.metrics == nil {\n\t\topts.metrics = jaeger.NewNullMetrics()\n\t}\n\tif opts.logger == nil {\n\t\topts.logger = jaeger.NullLogger\n\t}\n\tif opts.hostPort == \"\" {\n\t\topts.hostPort = defaultHostPort\n\t}\n\tif opts.refreshInterval == 0 {\n\t\topts.refreshInterval = defaultRefreshInterval\n\t}\n\treturn opts\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go",
    "content": "// Copyright (c) 2018 The Jaeger Authors.\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\npackage remote\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/uber/jaeger-client-go\"\n\t\"github.com/uber/jaeger-client-go/utils\"\n)\n\nconst (\n\t// minimumCredits is the minimum amount of credits necessary to not be throttled.\n\t// i.e. if currentCredits > minimumCredits, then the operation will not be throttled.\n\tminimumCredits = 1.0\n)\n\nvar (\n\terrorUUIDNotSet = errors.New(\"Throttler UUID must be set\")\n)\n\ntype operationBalance struct {\n\tOperation string  `json:\"operation\"`\n\tBalance   float64 `json:\"balance\"`\n}\n\ntype creditResponse struct {\n\tBalances []operationBalance `json:\"balances\"`\n}\n\ntype httpCreditManagerProxy struct {\n\thostPort string\n}\n\nfunc newHTTPCreditManagerProxy(hostPort string) *httpCreditManagerProxy {\n\treturn &httpCreditManagerProxy{\n\t\thostPort: hostPort,\n\t}\n}\n\n// N.B. Operations list must not be empty.\nfunc (m *httpCreditManagerProxy) FetchCredits(uuid, serviceName string, operations []string) (*creditResponse, error) {\n\tparams := url.Values{}\n\tparams.Set(\"service\", serviceName)\n\tparams.Set(\"uuid\", uuid)\n\tfor _, op := range operations {\n\t\tparams.Add(\"operations\", op)\n\t}\n\tvar resp creditResponse\n\tif err := utils.GetJSON(fmt.Sprintf(\"http://%s/credits?%s\", m.hostPort, params.Encode()), &resp); err != nil {\n\t\treturn nil, errors.Wrap(err, \"Failed to receive credits from agent\")\n\t}\n\treturn &resp, nil\n}\n\n// Throttler retrieves credits from agent and uses it to throttle operations.\ntype Throttler struct {\n\toptions\n\n\tmux           sync.RWMutex\n\tservice       string\n\tuuid          atomic.Value\n\tcreditManager *httpCreditManagerProxy\n\tcredits       map[string]float64 // map of operation->credits\n\tclose         chan struct{}\n\tstopped       sync.WaitGroup\n}\n\n// NewThrottler returns a Throttler that polls agent for credits and uses them to throttle\n// the service.\nfunc NewThrottler(service string, options ...Option) *Throttler {\n\topts := applyOptions(options...)\n\tcreditManager := newHTTPCreditManagerProxy(opts.hostPort)\n\tt := &Throttler{\n\t\toptions:       opts,\n\t\tcreditManager: creditManager,\n\t\tservice:       service,\n\t\tcredits:       make(map[string]float64),\n\t\tclose:         make(chan struct{}),\n\t}\n\tt.stopped.Add(1)\n\tgo t.pollManager()\n\treturn t\n}\n\n// IsAllowed implements Throttler#IsAllowed.\nfunc (t *Throttler) IsAllowed(operation string) bool {\n\tt.mux.Lock()\n\tdefer t.mux.Unlock()\n\tvalue, ok := t.credits[operation]\n\tif !ok || value == 0 {\n\t\tif !ok {\n\t\t\t// NOTE: This appears to be a no-op at first glance, but it stores\n\t\t\t// the operation key in the map. Necessary for functionality of\n\t\t\t// Throttler#operations method.\n\t\t\tt.credits[operation] = 0\n\t\t}\n\t\tif !t.synchronousInitialization {\n\t\t\tt.metrics.ThrottledDebugSpans.Inc(1)\n\t\t\treturn false\n\t\t}\n\t\t// If it is the first time this operation is being checked, synchronously fetch\n\t\t// the credits.\n\t\tcredits, err := t.fetchCredits([]string{operation})\n\t\tif err != nil {\n\t\t\t// Failed to receive credits from agent, try again next time\n\t\t\tt.logger.Error(\"Failed to fetch credits: \" + err.Error())\n\t\t\treturn false\n\t\t}\n\t\tif len(credits.Balances) == 0 {\n\t\t\t// This shouldn't happen but just in case\n\t\t\treturn false\n\t\t}\n\t\tfor _, opBalance := range credits.Balances {\n\t\t\tt.credits[opBalance.Operation] += opBalance.Balance\n\t\t}\n\t}\n\treturn t.isAllowed(operation)\n}\n\n// Close stops the throttler from fetching credits from remote.\nfunc (t *Throttler) Close() error {\n\tclose(t.close)\n\tt.stopped.Wait()\n\treturn nil\n}\n\n// SetProcess implements ProcessSetter#SetProcess. It's imperative that the UUID is set before any remote\n// requests are made.\nfunc (t *Throttler) SetProcess(process jaeger.Process) {\n\tif process.UUID != \"\" {\n\t\tt.uuid.Store(process.UUID)\n\t}\n}\n\n// N.B. This function must be called with the Write Lock\nfunc (t *Throttler) isAllowed(operation string) bool {\n\tcredits := t.credits[operation]\n\tif credits < minimumCredits {\n\t\tt.metrics.ThrottledDebugSpans.Inc(1)\n\t\treturn false\n\t}\n\tt.credits[operation] = credits - minimumCredits\n\treturn true\n}\n\nfunc (t *Throttler) pollManager() {\n\tdefer t.stopped.Done()\n\tticker := time.NewTicker(t.refreshInterval)\n\tdefer ticker.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-ticker.C:\n\t\t\tt.refreshCredits()\n\t\tcase <-t.close:\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (t *Throttler) operations() []string {\n\tt.mux.RLock()\n\tdefer t.mux.RUnlock()\n\toperations := make([]string, 0, len(t.credits))\n\tfor op := range t.credits {\n\t\toperations = append(operations, op)\n\t}\n\treturn operations\n}\n\nfunc (t *Throttler) refreshCredits() {\n\toperations := t.operations()\n\tif len(operations) == 0 {\n\t\treturn\n\t}\n\tnewCredits, err := t.fetchCredits(operations)\n\tif err != nil {\n\t\tt.metrics.ThrottlerUpdateFailure.Inc(1)\n\t\tt.logger.Error(\"Failed to fetch credits: \" + err.Error())\n\t\treturn\n\t}\n\tt.metrics.ThrottlerUpdateSuccess.Inc(1)\n\n\tt.mux.Lock()\n\tdefer t.mux.Unlock()\n\tfor _, opBalance := range newCredits.Balances {\n\t\tt.credits[opBalance.Operation] += opBalance.Balance\n\t}\n}\n\nfunc (t *Throttler) fetchCredits(operations []string) (*creditResponse, error) {\n\tuuid := t.uuid.Load()\n\tuuidStr, _ := uuid.(string)\n\tif uuid == nil || uuidStr == \"\" {\n\t\treturn nil, errorUUIDNotSet\n\t}\n\treturn t.creditManager.FetchCredits(uuidStr, t.service, operations)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go",
    "content": "// Copyright (c) 2018 The Jaeger Authors.\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\npackage throttler\n\n// Throttler is used to rate limits operations. For example, given how debug spans\n// are always sampled, a throttler can be enabled per client to rate limit the amount\n// of debug spans a client can start.\ntype Throttler interface {\n\t// IsAllowed determines whether the operation should be allowed and not be\n\t// throttled.\n\tIsAllowed(operation string) bool\n}\n\n// DefaultThrottler doesn't throttle at all.\ntype DefaultThrottler struct{}\n\n// IsAllowed implements Throttler#IsAllowed.\nfunc (t DefaultThrottler) IsAllowed(operation string) bool {\n\treturn true\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/interop.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"github.com/opentracing/opentracing-go\"\n)\n\n// TODO this file should not be needed after TChannel PR.\n\ntype formatKey int\n\n// SpanContextFormat is a constant used as OpenTracing Format.\n// Requires *SpanContext as carrier.\n// This format is intended for interop with TChannel or other Zipkin-like tracers.\nconst SpanContextFormat formatKey = iota\n\ntype jaegerTraceContextPropagator struct {\n\ttracer *Tracer\n}\n\nfunc (p *jaegerTraceContextPropagator) Inject(\n\tctx SpanContext,\n\tabstractCarrier interface{},\n) error {\n\tcarrier, ok := abstractCarrier.(*SpanContext)\n\tif !ok {\n\t\treturn opentracing.ErrInvalidCarrier\n\t}\n\n\tcarrier.CopyFrom(&ctx)\n\treturn nil\n}\n\nfunc (p *jaegerTraceContextPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) {\n\tcarrier, ok := abstractCarrier.(*SpanContext)\n\tif !ok {\n\t\treturn emptyContext, opentracing.ErrInvalidCarrier\n\t}\n\tctx := new(SpanContext)\n\tctx.CopyFrom(carrier)\n\treturn *ctx, nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/jaeger_tag.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/opentracing/opentracing-go/log\"\n\n\tj \"github.com/uber/jaeger-client-go/thrift-gen/jaeger\"\n)\n\ntype tags []*j.Tag\n\n// ConvertLogsToJaegerTags converts log Fields into jaeger tags.\nfunc ConvertLogsToJaegerTags(logFields []log.Field) []*j.Tag {\n\tfields := tags(make([]*j.Tag, 0, len(logFields)))\n\tfor _, field := range logFields {\n\t\tfield.Marshal(&fields)\n\t}\n\treturn fields\n}\n\nfunc (t *tags) EmitString(key, value string) {\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &value})\n}\n\nfunc (t *tags) EmitBool(key string, value bool) {\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_BOOL, VBool: &value})\n}\n\nfunc (t *tags) EmitInt(key string, value int) {\n\tvLong := int64(value)\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong})\n}\n\nfunc (t *tags) EmitInt32(key string, value int32) {\n\tvLong := int64(value)\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong})\n}\n\nfunc (t *tags) EmitInt64(key string, value int64) {\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &value})\n}\n\nfunc (t *tags) EmitUint32(key string, value uint32) {\n\tvLong := int64(value)\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong})\n}\n\nfunc (t *tags) EmitUint64(key string, value uint64) {\n\tvLong := int64(value)\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong})\n}\n\nfunc (t *tags) EmitFloat32(key string, value float32) {\n\tvDouble := float64(value)\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &vDouble})\n}\n\nfunc (t *tags) EmitFloat64(key string, value float64) {\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &value})\n}\n\nfunc (t *tags) EmitObject(key string, value interface{}) {\n\tvStr := fmt.Sprintf(\"%+v\", value)\n\t*t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &vStr})\n}\n\nfunc (t *tags) EmitLazyLogger(value log.LazyLogger) {\n\tvalue(t)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go\"\n\n\tj \"github.com/uber/jaeger-client-go/thrift-gen/jaeger\"\n\t\"github.com/uber/jaeger-client-go/utils\"\n)\n\n// BuildJaegerThrift builds jaeger span based on internal span.\nfunc BuildJaegerThrift(span *Span) *j.Span {\n\tspan.Lock()\n\tdefer span.Unlock()\n\tstartTime := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime)\n\tduration := span.duration.Nanoseconds() / int64(time.Microsecond)\n\tjaegerSpan := &j.Span{\n\t\tTraceIdLow:    int64(span.context.traceID.Low),\n\t\tTraceIdHigh:   int64(span.context.traceID.High),\n\t\tSpanId:        int64(span.context.spanID),\n\t\tParentSpanId:  int64(span.context.parentID),\n\t\tOperationName: span.operationName,\n\t\tFlags:         int32(span.context.flags),\n\t\tStartTime:     startTime,\n\t\tDuration:      duration,\n\t\tTags:          buildTags(span.tags, span.tracer.options.maxTagValueLength),\n\t\tLogs:          buildLogs(span.logs),\n\t\tReferences:    buildReferences(span.references),\n\t}\n\treturn jaegerSpan\n}\n\n// BuildJaegerProcessThrift creates a thrift Process type.\nfunc BuildJaegerProcessThrift(span *Span) *j.Process {\n\tspan.Lock()\n\tdefer span.Unlock()\n\treturn buildJaegerProcessThrift(span.tracer)\n}\n\nfunc buildJaegerProcessThrift(tracer *Tracer) *j.Process {\n\tprocess := &j.Process{\n\t\tServiceName: tracer.serviceName,\n\t\tTags:        buildTags(tracer.tags, tracer.options.maxTagValueLength),\n\t}\n\tif tracer.process.UUID != \"\" {\n\t\tprocess.Tags = append(process.Tags, &j.Tag{Key: TracerUUIDTagKey, VStr: &tracer.process.UUID, VType: j.TagType_STRING})\n\t}\n\treturn process\n}\n\nfunc buildTags(tags []Tag, maxTagValueLength int) []*j.Tag {\n\tjTags := make([]*j.Tag, 0, len(tags))\n\tfor _, tag := range tags {\n\t\tjTag := buildTag(&tag, maxTagValueLength)\n\t\tjTags = append(jTags, jTag)\n\t}\n\treturn jTags\n}\n\nfunc buildLogs(logs []opentracing.LogRecord) []*j.Log {\n\tjLogs := make([]*j.Log, 0, len(logs))\n\tfor _, log := range logs {\n\t\tjLog := &j.Log{\n\t\t\tTimestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp),\n\t\t\tFields:    ConvertLogsToJaegerTags(log.Fields),\n\t\t}\n\t\tjLogs = append(jLogs, jLog)\n\t}\n\treturn jLogs\n}\n\nfunc buildTag(tag *Tag, maxTagValueLength int) *j.Tag {\n\tjTag := &j.Tag{Key: tag.key}\n\tswitch value := tag.value.(type) {\n\tcase string:\n\t\tvStr := truncateString(value, maxTagValueLength)\n\t\tjTag.VStr = &vStr\n\t\tjTag.VType = j.TagType_STRING\n\tcase []byte:\n\t\tif len(value) > maxTagValueLength {\n\t\t\tvalue = value[:maxTagValueLength]\n\t\t}\n\t\tjTag.VBinary = value\n\t\tjTag.VType = j.TagType_BINARY\n\tcase int:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase uint:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase int8:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase uint8:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase int16:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase uint16:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase int32:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase uint32:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase int64:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase uint64:\n\t\tvLong := int64(value)\n\t\tjTag.VLong = &vLong\n\t\tjTag.VType = j.TagType_LONG\n\tcase float32:\n\t\tvDouble := float64(value)\n\t\tjTag.VDouble = &vDouble\n\t\tjTag.VType = j.TagType_DOUBLE\n\tcase float64:\n\t\tvDouble := float64(value)\n\t\tjTag.VDouble = &vDouble\n\t\tjTag.VType = j.TagType_DOUBLE\n\tcase bool:\n\t\tvBool := value\n\t\tjTag.VBool = &vBool\n\t\tjTag.VType = j.TagType_BOOL\n\tdefault:\n\t\tvStr := truncateString(stringify(value), maxTagValueLength)\n\t\tjTag.VStr = &vStr\n\t\tjTag.VType = j.TagType_STRING\n\t}\n\treturn jTag\n}\n\nfunc buildReferences(references []Reference) []*j.SpanRef {\n\tretMe := make([]*j.SpanRef, 0, len(references))\n\tfor _, ref := range references {\n\t\tif ref.Type == opentracing.ChildOfRef {\n\t\t\tretMe = append(retMe, spanRef(ref.Context, j.SpanRefType_CHILD_OF))\n\t\t} else if ref.Type == opentracing.FollowsFromRef {\n\t\t\tretMe = append(retMe, spanRef(ref.Context, j.SpanRefType_FOLLOWS_FROM))\n\t\t}\n\t}\n\treturn retMe\n}\n\nfunc spanRef(ctx SpanContext, refType j.SpanRefType) *j.SpanRef {\n\treturn &j.SpanRef{\n\t\tRefType:     refType,\n\t\tTraceIdLow:  int64(ctx.traceID.Low),\n\t\tTraceIdHigh: int64(ctx.traceID.High),\n\t\tSpanId:      int64(ctx.spanID),\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/log/logger.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage log\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"log\"\n\t\"sync\"\n)\n\n// Logger provides an abstract interface for logging from Reporters.\n// Applications can provide their own implementation of this interface to adapt\n// reporters logging to whatever logging library they prefer (stdlib log,\n// logrus, go-logging, etc).\ntype Logger interface {\n\t// Error logs a message at error priority\n\tError(msg string)\n\n\t// Infof logs a message at info priority\n\tInfof(msg string, args ...interface{})\n}\n\n// StdLogger is implementation of the Logger interface that delegates to default `log` package\nvar StdLogger = &stdLogger{}\n\ntype stdLogger struct{}\n\nfunc (l *stdLogger) Error(msg string) {\n\tlog.Printf(\"ERROR: %s\", msg)\n}\n\n// Infof logs a message at info priority\nfunc (l *stdLogger) Infof(msg string, args ...interface{}) {\n\tlog.Printf(msg, args...)\n}\n\n// NullLogger is implementation of the Logger interface that is no-op\nvar NullLogger = &nullLogger{}\n\ntype nullLogger struct{}\n\nfunc (l *nullLogger) Error(msg string)                      {}\nfunc (l *nullLogger) Infof(msg string, args ...interface{}) {}\n\n// BytesBufferLogger implements Logger backed by a bytes.Buffer.\ntype BytesBufferLogger struct {\n\tmux sync.Mutex\n\tbuf bytes.Buffer\n}\n\n// Error implements Logger.\nfunc (l *BytesBufferLogger) Error(msg string) {\n\tl.mux.Lock()\n\tl.buf.WriteString(fmt.Sprintf(\"ERROR: %s\\n\", msg))\n\tl.mux.Unlock()\n}\n\n// Infof implements Logger.\nfunc (l *BytesBufferLogger) Infof(msg string, args ...interface{}) {\n\tl.mux.Lock()\n\tl.buf.WriteString(\"INFO: \" + fmt.Sprintf(msg, args...) + \"\\n\")\n\tl.mux.Unlock()\n}\n\n// String returns string representation of the underlying buffer.\nfunc (l *BytesBufferLogger) String() string {\n\tl.mux.Lock()\n\tdefer l.mux.Unlock()\n\treturn l.buf.String()\n}\n\n// Flush empties the underlying buffer.\nfunc (l *BytesBufferLogger) Flush() {\n\tl.mux.Lock()\n\tdefer l.mux.Unlock()\n\tl.buf.Reset()\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/logger.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport \"log\"\n\n// NB This will be deprecated in 3.0.0, please use jaeger-client-go/log/logger instead.\n\n// Logger provides an abstract interface for logging from Reporters.\n// Applications can provide their own implementation of this interface to adapt\n// reporters logging to whatever logging library they prefer (stdlib log,\n// logrus, go-logging, etc).\ntype Logger interface {\n\t// Error logs a message at error priority\n\tError(msg string)\n\n\t// Infof logs a message at info priority\n\tInfof(msg string, args ...interface{})\n}\n\n// StdLogger is implementation of the Logger interface that delegates to default `log` package\nvar StdLogger = &stdLogger{}\n\ntype stdLogger struct{}\n\nfunc (l *stdLogger) Error(msg string) {\n\tlog.Printf(\"ERROR: %s\", msg)\n}\n\n// Infof logs a message at info priority\nfunc (l *stdLogger) Infof(msg string, args ...interface{}) {\n\tlog.Printf(msg, args...)\n}\n\n// NullLogger is implementation of the Logger interface that delegates to default `log` package\nvar NullLogger = &nullLogger{}\n\ntype nullLogger struct{}\n\nfunc (l *nullLogger) Error(msg string)                      {}\nfunc (l *nullLogger) Infof(msg string, args ...interface{}) {}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/metrics.go",
    "content": "// Copyright (c) 2017-2018 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"github.com/uber/jaeger-lib/metrics\"\n)\n\n// Metrics is a container of all stats emitted by Jaeger tracer.\ntype Metrics struct {\n\t// Number of traces started by this tracer as sampled\n\tTracesStartedSampled metrics.Counter `metric:\"traces\" tags:\"state=started,sampled=y\"`\n\n\t// Number of traces started by this tracer as not sampled\n\tTracesStartedNotSampled metrics.Counter `metric:\"traces\" tags:\"state=started,sampled=n\"`\n\n\t// Number of externally started sampled traces this tracer joined\n\tTracesJoinedSampled metrics.Counter `metric:\"traces\" tags:\"state=joined,sampled=y\"`\n\n\t// Number of externally started not-sampled traces this tracer joined\n\tTracesJoinedNotSampled metrics.Counter `metric:\"traces\" tags:\"state=joined,sampled=n\"`\n\n\t// Number of sampled spans started by this tracer\n\tSpansStartedSampled metrics.Counter `metric:\"started_spans\" tags:\"sampled=y\"`\n\n\t// Number of unsampled spans started by this tracer\n\tSpansStartedNotSampled metrics.Counter `metric:\"started_spans\" tags:\"sampled=n\"`\n\n\t// Number of spans finished by this tracer\n\tSpansFinished metrics.Counter `metric:\"finished_spans\"`\n\n\t// Number of errors decoding tracing context\n\tDecodingErrors metrics.Counter `metric:\"span_context_decoding_errors\"`\n\n\t// Number of spans successfully reported\n\tReporterSuccess metrics.Counter `metric:\"reporter_spans\" tags:\"result=ok\"`\n\n\t// Number of spans not reported due to a Sender failure\n\tReporterFailure metrics.Counter `metric:\"reporter_spans\" tags:\"result=err\"`\n\n\t// Number of spans dropped due to internal queue overflow\n\tReporterDropped metrics.Counter `metric:\"reporter_spans\" tags:\"result=dropped\"`\n\n\t// Current number of spans in the reporter queue\n\tReporterQueueLength metrics.Gauge `metric:\"reporter_queue_length\"`\n\n\t// Number of times the Sampler succeeded to retrieve sampling strategy\n\tSamplerRetrieved metrics.Counter `metric:\"sampler_queries\" tags:\"result=ok\"`\n\n\t// Number of times the Sampler failed to retrieve sampling strategy\n\tSamplerQueryFailure metrics.Counter `metric:\"sampler_queries\" tags:\"result=err\"`\n\n\t// Number of times the Sampler succeeded to retrieve and update sampling strategy\n\tSamplerUpdated metrics.Counter `metric:\"sampler_updates\" tags:\"result=ok\"`\n\n\t// Number of times the Sampler failed to update sampling strategy\n\tSamplerUpdateFailure metrics.Counter `metric:\"sampler_updates\" tags:\"result=err\"`\n\n\t// Number of times baggage was successfully written or updated on spans.\n\tBaggageUpdateSuccess metrics.Counter `metric:\"baggage_updates\" tags:\"result=ok\"`\n\n\t// Number of times baggage failed to write or update on spans.\n\tBaggageUpdateFailure metrics.Counter `metric:\"baggage_updates\" tags:\"result=err\"`\n\n\t// Number of times baggage was truncated as per baggage restrictions.\n\tBaggageTruncate metrics.Counter `metric:\"baggage_truncations\"`\n\n\t// Number of times baggage restrictions were successfully updated.\n\tBaggageRestrictionsUpdateSuccess metrics.Counter `metric:\"baggage_restrictions_updates\" tags:\"result=ok\"`\n\n\t// Number of times baggage restrictions failed to update.\n\tBaggageRestrictionsUpdateFailure metrics.Counter `metric:\"baggage_restrictions_updates\" tags:\"result=err\"`\n\n\t// Number of times debug spans were throttled.\n\tThrottledDebugSpans metrics.Counter `metric:\"throttled_debug_spans\"`\n\n\t// Number of times throttler successfully updated.\n\tThrottlerUpdateSuccess metrics.Counter `metric:\"throttler_updates\" tags:\"result=ok\"`\n\n\t// Number of times throttler failed to update.\n\tThrottlerUpdateFailure metrics.Counter `metric:\"throttler_updates\" tags:\"result=err\"`\n}\n\n// NewMetrics creates a new Metrics struct and initializes it.\nfunc NewMetrics(factory metrics.Factory, globalTags map[string]string) *Metrics {\n\tm := &Metrics{}\n\t// TODO the namespace \"jaeger\" should be configurable (e.g. in all-in-one \"jaeger-client\" would make more sense)\n\tmetrics.Init(m, factory.Namespace(\"jaeger\", nil), globalTags)\n\treturn m\n}\n\n// NewNullMetrics creates a new Metrics struct that won't report any metrics.\nfunc NewNullMetrics() *Metrics {\n\treturn NewMetrics(metrics.NullFactory, nil)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/observer.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport opentracing \"github.com/opentracing/opentracing-go\"\n\n// Observer can be registered with the Tracer to receive notifications about\n// new Spans.\n//\n// Deprecated: use jaeger.ContribObserver instead.\ntype Observer interface {\n\tOnStartSpan(operationName string, options opentracing.StartSpanOptions) SpanObserver\n}\n\n// SpanObserver is created by the Observer and receives notifications about\n// other Span events.\n//\n// Deprecated: use jaeger.ContribSpanObserver instead.\ntype SpanObserver interface {\n\tOnSetOperationName(operationName string)\n\tOnSetTag(key string, value interface{})\n\tOnFinish(options opentracing.FinishOptions)\n}\n\n// compositeObserver is a dispatcher to other observers\ntype compositeObserver struct {\n\tobservers []ContribObserver\n}\n\n// compositeSpanObserver is a dispatcher to other span observers\ntype compositeSpanObserver struct {\n\tobservers []ContribSpanObserver\n}\n\n// noopSpanObserver is used when there are no observers registered\n// on the Tracer or none of them returns span observers from OnStartSpan.\nvar noopSpanObserver = &compositeSpanObserver{}\n\nfunc (o *compositeObserver) append(contribObserver ContribObserver) {\n\to.observers = append(o.observers, contribObserver)\n}\n\nfunc (o *compositeObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) ContribSpanObserver {\n\tvar spanObservers []ContribSpanObserver\n\tfor _, obs := range o.observers {\n\t\tspanObs, ok := obs.OnStartSpan(sp, operationName, options)\n\t\tif ok {\n\t\t\tif spanObservers == nil {\n\t\t\t\tspanObservers = make([]ContribSpanObserver, 0, len(o.observers))\n\t\t\t}\n\t\t\tspanObservers = append(spanObservers, spanObs)\n\t\t}\n\t}\n\tif len(spanObservers) == 0 {\n\t\treturn noopSpanObserver\n\t}\n\treturn &compositeSpanObserver{observers: spanObservers}\n}\n\nfunc (o *compositeSpanObserver) OnSetOperationName(operationName string) {\n\tfor _, obs := range o.observers {\n\t\tobs.OnSetOperationName(operationName)\n\t}\n}\n\nfunc (o *compositeSpanObserver) OnSetTag(key string, value interface{}) {\n\tfor _, obs := range o.observers {\n\t\tobs.OnSetTag(key, value)\n\t}\n}\n\nfunc (o *compositeSpanObserver) OnFinish(options opentracing.FinishOptions) {\n\tfor _, obs := range o.observers {\n\t\tobs.OnFinish(options)\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/process.go",
    "content": "// Copyright (c) 2018 The Jaeger Authors.\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\npackage jaeger\n\n// Process holds process specific metadata that's relevant to this client.\ntype Process struct {\n\tService string\n\tUUID    string\n\tTags    []Tag\n}\n\n// ProcessSetter sets a process. This can be used by any class that requires\n// the process to be set as part of initialization.\n// See internal/throttler/remote/throttler.go for an example.\ntype ProcessSetter interface {\n\tSetProcess(process Process)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/propagation.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"net/url\"\n\t\"strings\"\n\t\"sync\"\n\n\topentracing \"github.com/opentracing/opentracing-go\"\n)\n\n// Injector is responsible for injecting SpanContext instances in a manner suitable\n// for propagation via a format-specific \"carrier\" object. Typically the\n// injection will take place across an RPC boundary, but message queues and\n// other IPC mechanisms are also reasonable places to use an Injector.\ntype Injector interface {\n\t// Inject takes `SpanContext` and injects it into `carrier`. The actual type\n\t// of `carrier` depends on the `format` passed to `Tracer.Inject()`.\n\t//\n\t// Implementations may return opentracing.ErrInvalidCarrier or any other\n\t// implementation-specific error if injection fails.\n\tInject(ctx SpanContext, carrier interface{}) error\n}\n\n// Extractor is responsible for extracting SpanContext instances from a\n// format-specific \"carrier\" object. Typically the extraction will take place\n// on the server side of an RPC boundary, but message queues and other IPC\n// mechanisms are also reasonable places to use an Extractor.\ntype Extractor interface {\n\t// Extract decodes a SpanContext instance from the given `carrier`,\n\t// or (nil, opentracing.ErrSpanContextNotFound) if no context could\n\t// be found in the `carrier`.\n\tExtract(carrier interface{}) (SpanContext, error)\n}\n\ntype textMapPropagator struct {\n\theaderKeys  *HeadersConfig\n\tmetrics     Metrics\n\tencodeValue func(string) string\n\tdecodeValue func(string) string\n}\n\nfunc newTextMapPropagator(headerKeys *HeadersConfig, metrics Metrics) *textMapPropagator {\n\treturn &textMapPropagator{\n\t\theaderKeys: headerKeys,\n\t\tmetrics:    metrics,\n\t\tencodeValue: func(val string) string {\n\t\t\treturn val\n\t\t},\n\t\tdecodeValue: func(val string) string {\n\t\t\treturn val\n\t\t},\n\t}\n}\n\nfunc newHTTPHeaderPropagator(headerKeys *HeadersConfig, metrics Metrics) *textMapPropagator {\n\treturn &textMapPropagator{\n\t\theaderKeys: headerKeys,\n\t\tmetrics:    metrics,\n\t\tencodeValue: func(val string) string {\n\t\t\treturn url.QueryEscape(val)\n\t\t},\n\t\tdecodeValue: func(val string) string {\n\t\t\t// ignore decoding errors, cannot do anything about them\n\t\t\tif v, err := url.QueryUnescape(val); err == nil {\n\t\t\t\treturn v\n\t\t\t}\n\t\t\treturn val\n\t\t},\n\t}\n}\n\ntype binaryPropagator struct {\n\ttracer  *Tracer\n\tbuffers sync.Pool\n}\n\nfunc newBinaryPropagator(tracer *Tracer) *binaryPropagator {\n\treturn &binaryPropagator{\n\t\ttracer:  tracer,\n\t\tbuffers: sync.Pool{New: func() interface{} { return &bytes.Buffer{} }},\n\t}\n}\n\nfunc (p *textMapPropagator) Inject(\n\tsc SpanContext,\n\tabstractCarrier interface{},\n) error {\n\ttextMapWriter, ok := abstractCarrier.(opentracing.TextMapWriter)\n\tif !ok {\n\t\treturn opentracing.ErrInvalidCarrier\n\t}\n\n\t// Do not encode the string with trace context to avoid accidental double-encoding\n\t// if people are using opentracing < 0.10.0. Our colon-separated representation\n\t// of the trace context is already safe for HTTP headers.\n\ttextMapWriter.Set(p.headerKeys.TraceContextHeaderName, sc.String())\n\tfor k, v := range sc.baggage {\n\t\tsafeKey := p.addBaggageKeyPrefix(k)\n\t\tsafeVal := p.encodeValue(v)\n\t\ttextMapWriter.Set(safeKey, safeVal)\n\t}\n\treturn nil\n}\n\nfunc (p *textMapPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) {\n\ttextMapReader, ok := abstractCarrier.(opentracing.TextMapReader)\n\tif !ok {\n\t\treturn emptyContext, opentracing.ErrInvalidCarrier\n\t}\n\tvar ctx SpanContext\n\tvar baggage map[string]string\n\terr := textMapReader.ForeachKey(func(rawKey, value string) error {\n\t\tkey := strings.ToLower(rawKey) // TODO not necessary for plain TextMap\n\t\tif key == p.headerKeys.TraceContextHeaderName {\n\t\t\tvar err error\n\t\t\tsafeVal := p.decodeValue(value)\n\t\t\tif ctx, err = ContextFromString(safeVal); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else if key == p.headerKeys.JaegerDebugHeader {\n\t\t\tctx.debugID = p.decodeValue(value)\n\t\t} else if key == p.headerKeys.JaegerBaggageHeader {\n\t\t\tif baggage == nil {\n\t\t\t\tbaggage = make(map[string]string)\n\t\t\t}\n\t\t\tfor k, v := range p.parseCommaSeparatedMap(value) {\n\t\t\t\tbaggage[k] = v\n\t\t\t}\n\t\t} else if strings.HasPrefix(key, p.headerKeys.TraceBaggageHeaderPrefix) {\n\t\t\tif baggage == nil {\n\t\t\t\tbaggage = make(map[string]string)\n\t\t\t}\n\t\t\tsafeKey := p.removeBaggageKeyPrefix(key)\n\t\t\tsafeVal := p.decodeValue(value)\n\t\t\tbaggage[safeKey] = safeVal\n\t\t}\n\t\treturn nil\n\t})\n\tif err != nil {\n\t\tp.metrics.DecodingErrors.Inc(1)\n\t\treturn emptyContext, err\n\t}\n\tif !ctx.traceID.IsValid() && ctx.debugID == \"\" && len(baggage) == 0 {\n\t\treturn emptyContext, opentracing.ErrSpanContextNotFound\n\t}\n\tctx.baggage = baggage\n\treturn ctx, nil\n}\n\nfunc (p *binaryPropagator) Inject(\n\tsc SpanContext,\n\tabstractCarrier interface{},\n) error {\n\tcarrier, ok := abstractCarrier.(io.Writer)\n\tif !ok {\n\t\treturn opentracing.ErrInvalidCarrier\n\t}\n\n\t// Handle the tracer context\n\tif err := binary.Write(carrier, binary.BigEndian, sc.traceID); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(carrier, binary.BigEndian, sc.spanID); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(carrier, binary.BigEndian, sc.parentID); err != nil {\n\t\treturn err\n\t}\n\tif err := binary.Write(carrier, binary.BigEndian, sc.flags); err != nil {\n\t\treturn err\n\t}\n\n\t// Handle the baggage items\n\tif err := binary.Write(carrier, binary.BigEndian, int32(len(sc.baggage))); err != nil {\n\t\treturn err\n\t}\n\tfor k, v := range sc.baggage {\n\t\tif err := binary.Write(carrier, binary.BigEndian, int32(len(k))); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tio.WriteString(carrier, k)\n\t\tif err := binary.Write(carrier, binary.BigEndian, int32(len(v))); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tio.WriteString(carrier, v)\n\t}\n\n\treturn nil\n}\n\nfunc (p *binaryPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) {\n\tcarrier, ok := abstractCarrier.(io.Reader)\n\tif !ok {\n\t\treturn emptyContext, opentracing.ErrInvalidCarrier\n\t}\n\tvar ctx SpanContext\n\n\tif err := binary.Read(carrier, binary.BigEndian, &ctx.traceID); err != nil {\n\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t}\n\tif err := binary.Read(carrier, binary.BigEndian, &ctx.spanID); err != nil {\n\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t}\n\tif err := binary.Read(carrier, binary.BigEndian, &ctx.parentID); err != nil {\n\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t}\n\tif err := binary.Read(carrier, binary.BigEndian, &ctx.flags); err != nil {\n\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t}\n\n\t// Handle the baggage items\n\tvar numBaggage int32\n\tif err := binary.Read(carrier, binary.BigEndian, &numBaggage); err != nil {\n\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t}\n\tif iNumBaggage := int(numBaggage); iNumBaggage > 0 {\n\t\tctx.baggage = make(map[string]string, iNumBaggage)\n\t\tbuf := p.buffers.Get().(*bytes.Buffer)\n\t\tdefer p.buffers.Put(buf)\n\n\t\tvar keyLen, valLen int32\n\t\tfor i := 0; i < iNumBaggage; i++ {\n\t\t\tif err := binary.Read(carrier, binary.BigEndian, &keyLen); err != nil {\n\t\t\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t\t\t}\n\t\t\tbuf.Reset()\n\t\t\tbuf.Grow(int(keyLen))\n\t\t\tif n, err := io.CopyN(buf, carrier, int64(keyLen)); err != nil || int32(n) != keyLen {\n\t\t\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t\t\t}\n\t\t\tkey := buf.String()\n\n\t\t\tif err := binary.Read(carrier, binary.BigEndian, &valLen); err != nil {\n\t\t\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t\t\t}\n\t\t\tbuf.Reset()\n\t\t\tbuf.Grow(int(valLen))\n\t\t\tif n, err := io.CopyN(buf, carrier, int64(valLen)); err != nil || int32(n) != valLen {\n\t\t\t\treturn emptyContext, opentracing.ErrSpanContextCorrupted\n\t\t\t}\n\t\t\tctx.baggage[key] = buf.String()\n\t\t}\n\t}\n\n\treturn ctx, nil\n}\n\n// Converts a comma separated key value pair list into a map\n// e.g. key1=value1, key2=value2, key3 = value3\n// is converted to map[string]string { \"key1\" : \"value1\",\n//                                     \"key2\" : \"value2\",\n//                                     \"key3\" : \"value3\" }\nfunc (p *textMapPropagator) parseCommaSeparatedMap(value string) map[string]string {\n\tbaggage := make(map[string]string)\n\tvalue, err := url.QueryUnescape(value)\n\tif err != nil {\n\t\tlog.Printf(\"Unable to unescape %s, %v\", value, err)\n\t\treturn baggage\n\t}\n\tfor _, kvpair := range strings.Split(value, \",\") {\n\t\tkv := strings.Split(strings.TrimSpace(kvpair), \"=\")\n\t\tif len(kv) == 2 {\n\t\t\tbaggage[kv[0]] = kv[1]\n\t\t} else {\n\t\t\tlog.Printf(\"Malformed value passed in for %s\", p.headerKeys.JaegerBaggageHeader)\n\t\t}\n\t}\n\treturn baggage\n}\n\n// Converts a baggage item key into an http header format,\n// by prepending TraceBaggageHeaderPrefix and encoding the key string\nfunc (p *textMapPropagator) addBaggageKeyPrefix(key string) string {\n\t// TODO encodeBaggageKeyAsHeader add caching and escaping\n\treturn fmt.Sprintf(\"%v%v\", p.headerKeys.TraceBaggageHeaderPrefix, key)\n}\n\nfunc (p *textMapPropagator) removeBaggageKeyPrefix(key string) string {\n\t// TODO decodeBaggageHeaderKey add caching and escaping\n\treturn key[len(p.headerKeys.TraceBaggageHeaderPrefix):]\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/reference.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport \"github.com/opentracing/opentracing-go\"\n\n// Reference represents a causal reference to other Spans (via their SpanContext).\ntype Reference struct {\n\tType    opentracing.SpanReferenceType\n\tContext SpanContext\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/reporter.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go\"\n\n\t\"github.com/uber/jaeger-client-go/log\"\n)\n\n// Reporter is called by the tracer when a span is completed to report the span to the tracing collector.\ntype Reporter interface {\n\t// Report submits a new span to collectors, possibly asynchronously and/or with buffering.\n\tReport(span *Span)\n\n\t// Close does a clean shutdown of the reporter, flushing any traces that may be buffered in memory.\n\tClose()\n}\n\n// ------------------------------\n\ntype nullReporter struct{}\n\n// NewNullReporter creates a no-op reporter that ignores all reported spans.\nfunc NewNullReporter() Reporter {\n\treturn &nullReporter{}\n}\n\n// Report implements Report() method of Reporter by doing nothing.\nfunc (r *nullReporter) Report(span *Span) {\n\t// no-op\n}\n\n// Close implements Close() method of Reporter by doing nothing.\nfunc (r *nullReporter) Close() {\n\t// no-op\n}\n\n// ------------------------------\n\ntype loggingReporter struct {\n\tlogger Logger\n}\n\n// NewLoggingReporter creates a reporter that logs all reported spans to provided logger.\nfunc NewLoggingReporter(logger Logger) Reporter {\n\treturn &loggingReporter{logger}\n}\n\n// Report implements Report() method of Reporter by logging the span to the logger.\nfunc (r *loggingReporter) Report(span *Span) {\n\tr.logger.Infof(\"Reporting span %+v\", span)\n}\n\n// Close implements Close() method of Reporter by doing nothing.\nfunc (r *loggingReporter) Close() {\n\t// no-op\n}\n\n// ------------------------------\n\n// InMemoryReporter is used for testing, and simply collects spans in memory.\ntype InMemoryReporter struct {\n\tspans []opentracing.Span\n\tlock  sync.Mutex\n}\n\n// NewInMemoryReporter creates a reporter that stores spans in memory.\n// NOTE: the Tracer should be created with options.PoolSpans = false.\nfunc NewInMemoryReporter() *InMemoryReporter {\n\treturn &InMemoryReporter{\n\t\tspans: make([]opentracing.Span, 0, 10),\n\t}\n}\n\n// Report implements Report() method of Reporter by storing the span in the buffer.\nfunc (r *InMemoryReporter) Report(span *Span) {\n\tr.lock.Lock()\n\tr.spans = append(r.spans, span)\n\tr.lock.Unlock()\n}\n\n// Close implements Close() method of Reporter by doing nothing.\nfunc (r *InMemoryReporter) Close() {\n\t// no-op\n}\n\n// SpansSubmitted returns the number of spans accumulated in the buffer.\nfunc (r *InMemoryReporter) SpansSubmitted() int {\n\tr.lock.Lock()\n\tdefer r.lock.Unlock()\n\treturn len(r.spans)\n}\n\n// GetSpans returns accumulated spans as a copy of the buffer.\nfunc (r *InMemoryReporter) GetSpans() []opentracing.Span {\n\tr.lock.Lock()\n\tdefer r.lock.Unlock()\n\tcopied := make([]opentracing.Span, len(r.spans))\n\tcopy(copied, r.spans)\n\treturn copied\n}\n\n// Reset clears all accumulated spans.\nfunc (r *InMemoryReporter) Reset() {\n\tr.lock.Lock()\n\tdefer r.lock.Unlock()\n\tr.spans = nil\n}\n\n// ------------------------------\n\ntype compositeReporter struct {\n\treporters []Reporter\n}\n\n// NewCompositeReporter creates a reporter that ignores all reported spans.\nfunc NewCompositeReporter(reporters ...Reporter) Reporter {\n\treturn &compositeReporter{reporters: reporters}\n}\n\n// Report implements Report() method of Reporter by delegating to each underlying reporter.\nfunc (r *compositeReporter) Report(span *Span) {\n\tfor _, reporter := range r.reporters {\n\t\treporter.Report(span)\n\t}\n}\n\n// Close implements Close() method of Reporter by closing each underlying reporter.\nfunc (r *compositeReporter) Close() {\n\tfor _, reporter := range r.reporters {\n\t\treporter.Close()\n\t}\n}\n\n// ------------- REMOTE REPORTER -----------------\n\ntype reporterQueueItemType int\n\nconst (\n\tdefaultQueueSize           = 100\n\tdefaultBufferFlushInterval = 1 * time.Second\n\n\treporterQueueItemSpan reporterQueueItemType = iota\n\treporterQueueItemClose\n)\n\ntype reporterQueueItem struct {\n\titemType reporterQueueItemType\n\tspan     *Span\n\tclose    *sync.WaitGroup\n}\n\ntype remoteReporter struct {\n\t// These fields must be first in the struct because `sync/atomic` expects 64-bit alignment.\n\t// Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq\n\tqueueLength int64\n\tclosed      int64 // 0 - not closed, 1 - closed\n\n\treporterOptions\n\n\tsender Transport\n\tqueue  chan reporterQueueItem\n}\n\n// NewRemoteReporter creates a new reporter that sends spans out of process by means of Sender.\n// Calls to Report(Span) return immediately (side effect: if internal buffer is full the span is dropped).\n// Periodically the transport buffer is flushed even if it hasn't reached max packet size.\n// Calls to Close() block until all spans reported prior to the call to Close are flushed.\nfunc NewRemoteReporter(sender Transport, opts ...ReporterOption) Reporter {\n\toptions := reporterOptions{}\n\tfor _, option := range opts {\n\t\toption(&options)\n\t}\n\tif options.bufferFlushInterval <= 0 {\n\t\toptions.bufferFlushInterval = defaultBufferFlushInterval\n\t}\n\tif options.logger == nil {\n\t\toptions.logger = log.NullLogger\n\t}\n\tif options.metrics == nil {\n\t\toptions.metrics = NewNullMetrics()\n\t}\n\tif options.queueSize <= 0 {\n\t\toptions.queueSize = defaultQueueSize\n\t}\n\treporter := &remoteReporter{\n\t\treporterOptions: options,\n\t\tsender:          sender,\n\t\tqueue:           make(chan reporterQueueItem, options.queueSize),\n\t}\n\tgo reporter.processQueue()\n\treturn reporter\n}\n\n// Report implements Report() method of Reporter.\n// It passes the span to a background go-routine for submission to Jaeger backend.\n// If the internal queue is full, the span is dropped and metrics.ReporterDropped counter is incremented.\n// If Report() is called after the reporter has been Close()-ed, the additional spans will not be\n// sent to the backend, but the metrics.ReporterDropped counter may not reflect them correctly,\n// because some of them may still be successfully added to the queue.\nfunc (r *remoteReporter) Report(span *Span) {\n\tselect {\n\tcase r.queue <- reporterQueueItem{itemType: reporterQueueItemSpan, span: span}:\n\t\tatomic.AddInt64(&r.queueLength, 1)\n\tdefault:\n\t\tr.metrics.ReporterDropped.Inc(1)\n\t}\n}\n\n// Close implements Close() method of Reporter by waiting for the queue to be drained.\nfunc (r *remoteReporter) Close() {\n\tif swapped := atomic.CompareAndSwapInt64(&r.closed, 0, 1); !swapped {\n\t\tr.logger.Error(\"Repeated attempt to close the reporter is ignored\")\n\t\treturn\n\t}\n\tr.sendCloseEvent()\n\tr.sender.Close()\n}\n\nfunc (r *remoteReporter) sendCloseEvent() {\n\twg := &sync.WaitGroup{}\n\twg.Add(1)\n\titem := reporterQueueItem{itemType: reporterQueueItemClose, close: wg}\n\n\tr.queue <- item // if the queue is full we will block until there is space\n\tatomic.AddInt64(&r.queueLength, 1)\n\twg.Wait()\n}\n\n// processQueue reads spans from the queue, converts them to Thrift, and stores them in an internal buffer.\n// When the buffer length reaches batchSize, it is flushed by submitting the accumulated spans to Jaeger.\n// Buffer also gets flushed automatically every batchFlushInterval seconds, just in case the tracer stopped\n// reporting new spans.\nfunc (r *remoteReporter) processQueue() {\n\t// flush causes the Sender to flush its accumulated spans and clear the buffer\n\tflush := func() {\n\t\tif flushed, err := r.sender.Flush(); err != nil {\n\t\t\tr.metrics.ReporterFailure.Inc(int64(flushed))\n\t\t\tr.logger.Error(fmt.Sprintf(\"error when flushing the buffer: %s\", err.Error()))\n\t\t} else if flushed > 0 {\n\t\t\tr.metrics.ReporterSuccess.Inc(int64(flushed))\n\t\t}\n\t}\n\n\ttimer := time.NewTicker(r.bufferFlushInterval)\n\tfor {\n\t\tselect {\n\t\tcase <-timer.C:\n\t\t\tflush()\n\t\tcase item := <-r.queue:\n\t\t\tatomic.AddInt64(&r.queueLength, -1)\n\t\t\tswitch item.itemType {\n\t\t\tcase reporterQueueItemSpan:\n\t\t\t\tspan := item.span\n\t\t\t\tif flushed, err := r.sender.Append(span); err != nil {\n\t\t\t\t\tr.metrics.ReporterFailure.Inc(int64(flushed))\n\t\t\t\t\tr.logger.Error(fmt.Sprintf(\"error reporting span %q: %s\", span.OperationName(), err.Error()))\n\t\t\t\t} else if flushed > 0 {\n\t\t\t\t\tr.metrics.ReporterSuccess.Inc(int64(flushed))\n\t\t\t\t\t// to reduce the number of gauge stats, we only emit queue length on flush\n\t\t\t\t\tr.metrics.ReporterQueueLength.Update(atomic.LoadInt64(&r.queueLength))\n\t\t\t\t}\n\t\t\tcase reporterQueueItemClose:\n\t\t\t\ttimer.Stop()\n\t\t\t\tflush()\n\t\t\t\titem.close.Done()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/reporter_options.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"time\"\n)\n\n// ReporterOption is a function that sets some option on the reporter.\ntype ReporterOption func(c *reporterOptions)\n\n// ReporterOptions is a factory for all available ReporterOption's\nvar ReporterOptions reporterOptions\n\n// reporterOptions control behavior of the reporter.\ntype reporterOptions struct {\n\t// queueSize is the size of internal queue where reported spans are stored before they are processed in the background\n\tqueueSize int\n\t// bufferFlushInterval is how often the buffer is force-flushed, even if it's not full\n\tbufferFlushInterval time.Duration\n\t// logger is used to log errors of span submissions\n\tlogger Logger\n\t// metrics is used to record runtime stats\n\tmetrics *Metrics\n}\n\n// QueueSize creates a ReporterOption that sets the size of the internal queue where\n// spans are stored before they are processed.\nfunc (reporterOptions) QueueSize(queueSize int) ReporterOption {\n\treturn func(r *reporterOptions) {\n\t\tr.queueSize = queueSize\n\t}\n}\n\n// Metrics creates a ReporterOption that initializes Metrics in the reporter,\n// which is used to record runtime statistics.\nfunc (reporterOptions) Metrics(metrics *Metrics) ReporterOption {\n\treturn func(r *reporterOptions) {\n\t\tr.metrics = metrics\n\t}\n}\n\n// BufferFlushInterval creates a ReporterOption that sets how often the queue\n// is force-flushed.\nfunc (reporterOptions) BufferFlushInterval(bufferFlushInterval time.Duration) ReporterOption {\n\treturn func(r *reporterOptions) {\n\t\tr.bufferFlushInterval = bufferFlushInterval\n\t}\n}\n\n// Logger creates a ReporterOption that initializes the logger used to log\n// errors of span submissions.\nfunc (reporterOptions) Logger(logger Logger) ReporterOption {\n\treturn func(r *reporterOptions) {\n\t\tr.logger = logger\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md",
    "content": "An Observer that can be used to emit RPC metrics\n================================================\n\nIt can be attached to the tracer during tracer construction.\nSee `ExampleObserver` function in [observer_test.go](./observer_test.go).\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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// Package rpcmetrics implements an Observer that can be used to emit RPC metrics.\npackage rpcmetrics\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage rpcmetrics\n\nimport \"sync\"\n\n// normalizedEndpoints is a cache for endpointName -> safeName mappings.\ntype normalizedEndpoints struct {\n\tnames       map[string]string\n\tmaxSize     int\n\tdefaultName string\n\tnormalizer  NameNormalizer\n\tmux         sync.RWMutex\n}\n\nfunc newNormalizedEndpoints(maxSize int, normalizer NameNormalizer) *normalizedEndpoints {\n\treturn &normalizedEndpoints{\n\t\tmaxSize:    maxSize,\n\t\tnormalizer: normalizer,\n\t\tnames:      make(map[string]string, maxSize),\n\t}\n}\n\n// normalize looks up the name in the cache, if not found it uses normalizer\n// to convert the name to a safe name. If called with more than maxSize unique\n// names it returns \"\" for all other names beyond those already cached.\nfunc (n *normalizedEndpoints) normalize(name string) string {\n\tn.mux.RLock()\n\tnorm, ok := n.names[name]\n\tl := len(n.names)\n\tn.mux.RUnlock()\n\tif ok {\n\t\treturn norm\n\t}\n\tif l >= n.maxSize {\n\t\treturn \"\"\n\t}\n\treturn n.normalizeWithLock(name)\n}\n\nfunc (n *normalizedEndpoints) normalizeWithLock(name string) string {\n\tnorm := n.normalizer.Normalize(name)\n\tn.mux.Lock()\n\tdefer n.mux.Unlock()\n\t// cache may have grown while we were not holding the lock\n\tif len(n.names) >= n.maxSize {\n\t\treturn \"\"\n\t}\n\tn.names[name] = norm\n\treturn norm\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage rpcmetrics\n\nimport (\n\t\"sync\"\n\n\t\"github.com/uber/jaeger-lib/metrics\"\n)\n\nconst (\n\totherEndpointsPlaceholder = \"other\"\n\tendpointNameMetricTag     = \"endpoint\"\n)\n\n// Metrics is a collection of metrics for an endpoint describing\n// throughput, success, errors, and performance.\ntype Metrics struct {\n\t// RequestCountSuccess is a counter of the total number of successes.\n\tRequestCountSuccess metrics.Counter `metric:\"requests\" tags:\"error=false\"`\n\n\t// RequestCountFailures is a counter of the number of times any failure has been observed.\n\tRequestCountFailures metrics.Counter `metric:\"requests\" tags:\"error=true\"`\n\n\t// RequestLatencySuccess is a latency histogram of succesful requests.\n\tRequestLatencySuccess metrics.Timer `metric:\"request_latency\" tags:\"error=false\"`\n\n\t// RequestLatencyFailures is a latency histogram of failed requests.\n\tRequestLatencyFailures metrics.Timer `metric:\"request_latency\" tags:\"error=true\"`\n\n\t// HTTPStatusCode2xx is a counter of the total number of requests with HTTP status code 200-299\n\tHTTPStatusCode2xx metrics.Counter `metric:\"http_requests\" tags:\"status_code=2xx\"`\n\n\t// HTTPStatusCode3xx is a counter of the total number of requests with HTTP status code 300-399\n\tHTTPStatusCode3xx metrics.Counter `metric:\"http_requests\" tags:\"status_code=3xx\"`\n\n\t// HTTPStatusCode4xx is a counter of the total number of requests with HTTP status code 400-499\n\tHTTPStatusCode4xx metrics.Counter `metric:\"http_requests\" tags:\"status_code=4xx\"`\n\n\t// HTTPStatusCode5xx is a counter of the total number of requests with HTTP status code 500-599\n\tHTTPStatusCode5xx metrics.Counter `metric:\"http_requests\" tags:\"status_code=5xx\"`\n}\n\nfunc (m *Metrics) recordHTTPStatusCode(statusCode uint16) {\n\tif statusCode >= 200 && statusCode < 300 {\n\t\tm.HTTPStatusCode2xx.Inc(1)\n\t} else if statusCode >= 300 && statusCode < 400 {\n\t\tm.HTTPStatusCode3xx.Inc(1)\n\t} else if statusCode >= 400 && statusCode < 500 {\n\t\tm.HTTPStatusCode4xx.Inc(1)\n\t} else if statusCode >= 500 && statusCode < 600 {\n\t\tm.HTTPStatusCode5xx.Inc(1)\n\t}\n}\n\n// MetricsByEndpoint is a registry/cache of metrics for each unique endpoint name.\n// Only maxNumberOfEndpoints Metrics are stored, all other endpoint names are mapped\n// to a generic endpoint name \"other\".\ntype MetricsByEndpoint struct {\n\tmetricsFactory    metrics.Factory\n\tendpoints         *normalizedEndpoints\n\tmetricsByEndpoint map[string]*Metrics\n\tmux               sync.RWMutex\n}\n\nfunc newMetricsByEndpoint(\n\tmetricsFactory metrics.Factory,\n\tnormalizer NameNormalizer,\n\tmaxNumberOfEndpoints int,\n) *MetricsByEndpoint {\n\treturn &MetricsByEndpoint{\n\t\tmetricsFactory:    metricsFactory,\n\t\tendpoints:         newNormalizedEndpoints(maxNumberOfEndpoints, normalizer),\n\t\tmetricsByEndpoint: make(map[string]*Metrics, maxNumberOfEndpoints+1), // +1 for \"other\"\n\t}\n}\n\nfunc (m *MetricsByEndpoint) get(endpoint string) *Metrics {\n\tsafeName := m.endpoints.normalize(endpoint)\n\tif safeName == \"\" {\n\t\tsafeName = otherEndpointsPlaceholder\n\t}\n\tm.mux.RLock()\n\tmet := m.metricsByEndpoint[safeName]\n\tm.mux.RUnlock()\n\tif met != nil {\n\t\treturn met\n\t}\n\n\treturn m.getWithWriteLock(safeName)\n}\n\n// split to make easier to test\nfunc (m *MetricsByEndpoint) getWithWriteLock(safeName string) *Metrics {\n\tm.mux.Lock()\n\tdefer m.mux.Unlock()\n\n\t// it is possible that the name has been already registered after we released\n\t// the read lock and before we grabbed the write lock, so check for that.\n\tif met, ok := m.metricsByEndpoint[safeName]; ok {\n\t\treturn met\n\t}\n\n\t// it would be nice to create the struct before locking, since Init() is somewhat\n\t// expensive, however some metrics backends (e.g. expvar) may not like duplicate metrics.\n\tmet := &Metrics{}\n\ttags := map[string]string{endpointNameMetricTag: safeName}\n\tmetrics.Init(met, m.metricsFactory, tags)\n\n\tm.metricsByEndpoint[safeName] = met\n\treturn met\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage rpcmetrics\n\n// NameNormalizer is used to convert the endpoint names to strings\n// that can be safely used as tags in the metrics.\ntype NameNormalizer interface {\n\tNormalize(name string) string\n}\n\n// DefaultNameNormalizer converts endpoint names so that they contain only characters\n// from the safe charset [a-zA-Z0-9-./_]. All other characters are replaced with '-'.\nvar DefaultNameNormalizer = &SimpleNameNormalizer{\n\tSafeSets: []SafeCharacterSet{\n\t\t&Range{From: 'a', To: 'z'},\n\t\t&Range{From: 'A', To: 'Z'},\n\t\t&Range{From: '0', To: '9'},\n\t\t&Char{'-'},\n\t\t&Char{'_'},\n\t\t&Char{'/'},\n\t\t&Char{'.'},\n\t},\n\tReplacement: '-',\n}\n\n// SimpleNameNormalizer uses a set of safe character sets.\ntype SimpleNameNormalizer struct {\n\tSafeSets    []SafeCharacterSet\n\tReplacement byte\n}\n\n// SafeCharacterSet determines if the given character is \"safe\"\ntype SafeCharacterSet interface {\n\tIsSafe(c byte) bool\n}\n\n// Range implements SafeCharacterSet\ntype Range struct {\n\tFrom, To byte\n}\n\n// IsSafe implements SafeCharacterSet\nfunc (r *Range) IsSafe(c byte) bool {\n\treturn c >= r.From && c <= r.To\n}\n\n// Char implements SafeCharacterSet\ntype Char struct {\n\tVal byte\n}\n\n// IsSafe implements SafeCharacterSet\nfunc (ch *Char) IsSafe(c byte) bool {\n\treturn c == ch.Val\n}\n\n// Normalize checks each character in the string against SafeSets,\n// and if it's not safe substitutes it with Replacement.\nfunc (n *SimpleNameNormalizer) Normalize(name string) string {\n\tvar retMe []byte\n\tnameBytes := []byte(name)\n\tfor i, b := range nameBytes {\n\t\tif n.safeByte(b) {\n\t\t\tif retMe != nil {\n\t\t\t\tretMe[i] = b\n\t\t\t}\n\t\t} else {\n\t\t\tif retMe == nil {\n\t\t\t\tretMe = make([]byte, len(nameBytes))\n\t\t\t\tcopy(retMe[0:i], nameBytes[0:i])\n\t\t\t}\n\t\t\tretMe[i] = n.Replacement\n\t\t}\n\t}\n\tif retMe == nil {\n\t\treturn name\n\t}\n\treturn string(retMe)\n}\n\n// safeByte checks if b against all safe charsets.\nfunc (n *SimpleNameNormalizer) safeByte(b byte) bool {\n\tfor i := range n.SafeSets {\n\t\tif n.SafeSets[i].IsSafe(b) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage rpcmetrics\n\nimport (\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go\"\n\t\"github.com/opentracing/opentracing-go/ext\"\n\t\"github.com/uber/jaeger-lib/metrics\"\n\n\tjaeger \"github.com/uber/jaeger-client-go\"\n)\n\nconst defaultMaxNumberOfEndpoints = 200\n\n// Observer is an observer that can emit RPC metrics.\ntype Observer struct {\n\tmetricsByEndpoint *MetricsByEndpoint\n}\n\n// NewObserver creates a new observer that can emit RPC metrics.\nfunc NewObserver(metricsFactory metrics.Factory, normalizer NameNormalizer) *Observer {\n\treturn &Observer{\n\t\tmetricsByEndpoint: newMetricsByEndpoint(\n\t\t\tmetricsFactory,\n\t\t\tnormalizer,\n\t\t\tdefaultMaxNumberOfEndpoints,\n\t\t),\n\t}\n}\n\n// OnStartSpan creates a new Observer for the span.\nfunc (o *Observer) OnStartSpan(\n\toperationName string,\n\toptions opentracing.StartSpanOptions,\n) jaeger.SpanObserver {\n\treturn NewSpanObserver(o.metricsByEndpoint, operationName, options)\n}\n\n// SpanKind identifies the span as inboud, outbound, or internal\ntype SpanKind int\n\nconst (\n\t// Local span kind\n\tLocal SpanKind = iota\n\t// Inbound span kind\n\tInbound\n\t// Outbound span kind\n\tOutbound\n)\n\n// SpanObserver collects RPC metrics\ntype SpanObserver struct {\n\tmetricsByEndpoint *MetricsByEndpoint\n\toperationName     string\n\tstartTime         time.Time\n\tmux               sync.Mutex\n\tkind              SpanKind\n\thttpStatusCode    uint16\n\terr               bool\n}\n\n// NewSpanObserver creates a new SpanObserver that can emit RPC metrics.\nfunc NewSpanObserver(\n\tmetricsByEndpoint *MetricsByEndpoint,\n\toperationName string,\n\toptions opentracing.StartSpanOptions,\n) *SpanObserver {\n\tso := &SpanObserver{\n\t\tmetricsByEndpoint: metricsByEndpoint,\n\t\toperationName:     operationName,\n\t\tstartTime:         options.StartTime,\n\t}\n\tfor k, v := range options.Tags {\n\t\tso.handleTagInLock(k, v)\n\t}\n\treturn so\n}\n\n// handleTags watches for special tags\n// - SpanKind\n// - HttpStatusCode\n// - Error\nfunc (so *SpanObserver) handleTagInLock(key string, value interface{}) {\n\tif key == string(ext.SpanKind) {\n\t\tif v, ok := value.(ext.SpanKindEnum); ok {\n\t\t\tvalue = string(v)\n\t\t}\n\t\tif v, ok := value.(string); ok {\n\t\t\tif v == string(ext.SpanKindRPCClientEnum) {\n\t\t\t\tso.kind = Outbound\n\t\t\t} else if v == string(ext.SpanKindRPCServerEnum) {\n\t\t\t\tso.kind = Inbound\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\tif key == string(ext.HTTPStatusCode) {\n\t\tif v, ok := value.(uint16); ok {\n\t\t\tso.httpStatusCode = v\n\t\t} else if v, ok := value.(int); ok {\n\t\t\tso.httpStatusCode = uint16(v)\n\t\t} else if v, ok := value.(string); ok {\n\t\t\tif vv, err := strconv.Atoi(v); err == nil {\n\t\t\t\tso.httpStatusCode = uint16(vv)\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\tif key == string(ext.Error) {\n\t\tif v, ok := value.(bool); ok {\n\t\t\tso.err = v\n\t\t} else if v, ok := value.(string); ok {\n\t\t\tif vv, err := strconv.ParseBool(v); err == nil {\n\t\t\t\tso.err = vv\n\t\t\t}\n\t\t}\n\t\treturn\n\t}\n}\n\n// OnFinish emits the RPC metrics. It only has an effect when operation name\n// is not blank, and the span kind is an RPC server.\nfunc (so *SpanObserver) OnFinish(options opentracing.FinishOptions) {\n\tso.mux.Lock()\n\tdefer so.mux.Unlock()\n\n\tif so.operationName == \"\" || so.kind != Inbound {\n\t\treturn\n\t}\n\n\tmets := so.metricsByEndpoint.get(so.operationName)\n\tlatency := options.FinishTime.Sub(so.startTime)\n\tif so.err {\n\t\tmets.RequestCountFailures.Inc(1)\n\t\tmets.RequestLatencyFailures.Record(latency)\n\t} else {\n\t\tmets.RequestCountSuccess.Inc(1)\n\t\tmets.RequestLatencySuccess.Record(latency)\n\t}\n\tmets.recordHTTPStatusCode(so.httpStatusCode)\n}\n\n// OnSetOperationName records new operation name.\nfunc (so *SpanObserver) OnSetOperationName(operationName string) {\n\tso.mux.Lock()\n\tso.operationName = operationName\n\tso.mux.Unlock()\n}\n\n// OnSetTag implements SpanObserver\nfunc (so *SpanObserver) OnSetTag(key string, value interface{}) {\n\tso.mux.Lock()\n\tso.handleTagInLock(key, value)\n\tso.mux.Unlock()\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/sampler.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"net/url\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/uber/jaeger-client-go/log\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/sampling\"\n\t\"github.com/uber/jaeger-client-go/utils\"\n)\n\nconst (\n\tdefaultSamplingServerURL       = \"http://localhost:5778/sampling\"\n\tdefaultSamplingRefreshInterval = time.Minute\n\tdefaultMaxOperations           = 2000\n)\n\n// Sampler decides whether a new trace should be sampled or not.\ntype Sampler interface {\n\t// IsSampled decides whether a trace with given `id` and `operation`\n\t// should be sampled. This function will also return the tags that\n\t// can be used to identify the type of sampling that was applied to\n\t// the root span. Most simple samplers would return two tags,\n\t// sampler.type and sampler.param, similar to those used in the Configuration\n\tIsSampled(id TraceID, operation string) (sampled bool, tags []Tag)\n\n\t// Close does a clean shutdown of the sampler, stopping any background\n\t// go-routines it may have started.\n\tClose()\n\n\t// Equal checks if the `other` sampler is functionally equivalent\n\t// to this sampler.\n\t// TODO remove this function. This function is used to determine if 2 samplers are equivalent\n\t// which does not bode well with the adaptive sampler which has to create all the composite samplers\n\t// for the comparison to occur. This is expensive to do if only one sampler has changed.\n\tEqual(other Sampler) bool\n}\n\n// -----------------------\n\n// ConstSampler is a sampler that always makes the same decision.\ntype ConstSampler struct {\n\tDecision bool\n\ttags     []Tag\n}\n\n// NewConstSampler creates a ConstSampler.\nfunc NewConstSampler(sample bool) Sampler {\n\ttags := []Tag{\n\t\t{key: SamplerTypeTagKey, value: SamplerTypeConst},\n\t\t{key: SamplerParamTagKey, value: sample},\n\t}\n\treturn &ConstSampler{Decision: sample, tags: tags}\n}\n\n// IsSampled implements IsSampled() of Sampler.\nfunc (s *ConstSampler) IsSampled(id TraceID, operation string) (bool, []Tag) {\n\treturn s.Decision, s.tags\n}\n\n// Close implements Close() of Sampler.\nfunc (s *ConstSampler) Close() {\n\t// nothing to do\n}\n\n// Equal implements Equal() of Sampler.\nfunc (s *ConstSampler) Equal(other Sampler) bool {\n\tif o, ok := other.(*ConstSampler); ok {\n\t\treturn s.Decision == o.Decision\n\t}\n\treturn false\n}\n\n// -----------------------\n\n// ProbabilisticSampler is a sampler that randomly samples a certain percentage\n// of traces.\ntype ProbabilisticSampler struct {\n\tsamplingRate     float64\n\tsamplingBoundary uint64\n\ttags             []Tag\n}\n\nconst maxRandomNumber = ^(uint64(1) << 63) // i.e. 0x7fffffffffffffff\n\n// NewProbabilisticSampler creates a sampler that randomly samples a certain percentage of traces specified by the\n// samplingRate, in the range between 0.0 and 1.0.\n//\n// It relies on the fact that new trace IDs are 63bit random numbers themselves, thus making the sampling decision\n// without generating a new random number, but simply calculating if traceID < (samplingRate * 2^63).\n// TODO remove the error from this function for next major release\nfunc NewProbabilisticSampler(samplingRate float64) (*ProbabilisticSampler, error) {\n\tif samplingRate < 0.0 || samplingRate > 1.0 {\n\t\treturn nil, fmt.Errorf(\"Sampling Rate must be between 0.0 and 1.0, received %f\", samplingRate)\n\t}\n\treturn newProbabilisticSampler(samplingRate), nil\n}\n\nfunc newProbabilisticSampler(samplingRate float64) *ProbabilisticSampler {\n\tsamplingRate = math.Max(0.0, math.Min(samplingRate, 1.0))\n\ttags := []Tag{\n\t\t{key: SamplerTypeTagKey, value: SamplerTypeProbabilistic},\n\t\t{key: SamplerParamTagKey, value: samplingRate},\n\t}\n\treturn &ProbabilisticSampler{\n\t\tsamplingRate:     samplingRate,\n\t\tsamplingBoundary: uint64(float64(maxRandomNumber) * samplingRate),\n\t\ttags:             tags,\n\t}\n}\n\n// SamplingRate returns the sampling probability this sampled was constructed with.\nfunc (s *ProbabilisticSampler) SamplingRate() float64 {\n\treturn s.samplingRate\n}\n\n// IsSampled implements IsSampled() of Sampler.\nfunc (s *ProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) {\n\treturn s.samplingBoundary >= id.Low, s.tags\n}\n\n// Close implements Close() of Sampler.\nfunc (s *ProbabilisticSampler) Close() {\n\t// nothing to do\n}\n\n// Equal implements Equal() of Sampler.\nfunc (s *ProbabilisticSampler) Equal(other Sampler) bool {\n\tif o, ok := other.(*ProbabilisticSampler); ok {\n\t\treturn s.samplingBoundary == o.samplingBoundary\n\t}\n\treturn false\n}\n\n// -----------------------\n\ntype rateLimitingSampler struct {\n\tmaxTracesPerSecond float64\n\trateLimiter        utils.RateLimiter\n\ttags               []Tag\n}\n\n// NewRateLimitingSampler creates a sampler that samples at most maxTracesPerSecond. The distribution of sampled\n// traces follows burstiness of the service, i.e. a service with uniformly distributed requests will have those\n// requests sampled uniformly as well, but if requests are bursty, especially sub-second, then a number of\n// sequential requests can be sampled each second.\nfunc NewRateLimitingSampler(maxTracesPerSecond float64) Sampler {\n\ttags := []Tag{\n\t\t{key: SamplerTypeTagKey, value: SamplerTypeRateLimiting},\n\t\t{key: SamplerParamTagKey, value: maxTracesPerSecond},\n\t}\n\treturn &rateLimitingSampler{\n\t\tmaxTracesPerSecond: maxTracesPerSecond,\n\t\trateLimiter:        utils.NewRateLimiter(maxTracesPerSecond, math.Max(maxTracesPerSecond, 1.0)),\n\t\ttags:               tags,\n\t}\n}\n\n// IsSampled implements IsSampled() of Sampler.\nfunc (s *rateLimitingSampler) IsSampled(id TraceID, operation string) (bool, []Tag) {\n\treturn s.rateLimiter.CheckCredit(1.0), s.tags\n}\n\nfunc (s *rateLimitingSampler) Close() {\n\t// nothing to do\n}\n\nfunc (s *rateLimitingSampler) Equal(other Sampler) bool {\n\tif o, ok := other.(*rateLimitingSampler); ok {\n\t\treturn s.maxTracesPerSecond == o.maxTracesPerSecond\n\t}\n\treturn false\n}\n\n// -----------------------\n\n// GuaranteedThroughputProbabilisticSampler is a sampler that leverages both probabilisticSampler and\n// rateLimitingSampler. The rateLimitingSampler is used as a guaranteed lower bound sampler such that\n// every operation is sampled at least once in a time interval defined by the lowerBound. ie a lowerBound\n// of 1.0 / (60 * 10) will sample an operation at least once every 10 minutes.\n//\n// The probabilisticSampler is given higher priority when tags are emitted, ie. if IsSampled() for both\n// samplers return true, the tags for probabilisticSampler will be used.\ntype GuaranteedThroughputProbabilisticSampler struct {\n\tprobabilisticSampler *ProbabilisticSampler\n\tlowerBoundSampler    Sampler\n\ttags                 []Tag\n\tsamplingRate         float64\n\tlowerBound           float64\n}\n\n// NewGuaranteedThroughputProbabilisticSampler returns a delegating sampler that applies both\n// probabilisticSampler and rateLimitingSampler.\nfunc NewGuaranteedThroughputProbabilisticSampler(\n\tlowerBound, samplingRate float64,\n) (*GuaranteedThroughputProbabilisticSampler, error) {\n\treturn newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate), nil\n}\n\nfunc newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate float64) *GuaranteedThroughputProbabilisticSampler {\n\ts := &GuaranteedThroughputProbabilisticSampler{\n\t\tlowerBoundSampler: NewRateLimitingSampler(lowerBound),\n\t\tlowerBound:        lowerBound,\n\t}\n\ts.setProbabilisticSampler(samplingRate)\n\treturn s\n}\n\nfunc (s *GuaranteedThroughputProbabilisticSampler) setProbabilisticSampler(samplingRate float64) {\n\tif s.probabilisticSampler == nil || s.samplingRate != samplingRate {\n\t\ts.probabilisticSampler = newProbabilisticSampler(samplingRate)\n\t\ts.samplingRate = s.probabilisticSampler.SamplingRate()\n\t\ts.tags = []Tag{\n\t\t\t{key: SamplerTypeTagKey, value: SamplerTypeLowerBound},\n\t\t\t{key: SamplerParamTagKey, value: s.samplingRate},\n\t\t}\n\t}\n}\n\n// IsSampled implements IsSampled() of Sampler.\nfunc (s *GuaranteedThroughputProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) {\n\tif sampled, tags := s.probabilisticSampler.IsSampled(id, operation); sampled {\n\t\ts.lowerBoundSampler.IsSampled(id, operation)\n\t\treturn true, tags\n\t}\n\tsampled, _ := s.lowerBoundSampler.IsSampled(id, operation)\n\treturn sampled, s.tags\n}\n\n// Close implements Close() of Sampler.\nfunc (s *GuaranteedThroughputProbabilisticSampler) Close() {\n\ts.probabilisticSampler.Close()\n\ts.lowerBoundSampler.Close()\n}\n\n// Equal implements Equal() of Sampler.\nfunc (s *GuaranteedThroughputProbabilisticSampler) Equal(other Sampler) bool {\n\t// NB The Equal() function is expensive and will be removed. See adaptiveSampler.Equal() for\n\t// more information.\n\treturn false\n}\n\n// this function should only be called while holding a Write lock\nfunc (s *GuaranteedThroughputProbabilisticSampler) update(lowerBound, samplingRate float64) {\n\ts.setProbabilisticSampler(samplingRate)\n\tif s.lowerBound != lowerBound {\n\t\ts.lowerBoundSampler = NewRateLimitingSampler(lowerBound)\n\t\ts.lowerBound = lowerBound\n\t}\n}\n\n// -----------------------\n\ntype adaptiveSampler struct {\n\tsync.RWMutex\n\n\tsamplers       map[string]*GuaranteedThroughputProbabilisticSampler\n\tdefaultSampler *ProbabilisticSampler\n\tlowerBound     float64\n\tmaxOperations  int\n}\n\n// NewAdaptiveSampler returns a delegating sampler that applies both probabilisticSampler and\n// rateLimitingSampler via the guaranteedThroughputProbabilisticSampler. This sampler keeps track of all\n// operations and delegates calls to the respective guaranteedThroughputProbabilisticSampler.\nfunc NewAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies, maxOperations int) (Sampler, error) {\n\treturn newAdaptiveSampler(strategies, maxOperations), nil\n}\n\nfunc newAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies, maxOperations int) Sampler {\n\tsamplers := make(map[string]*GuaranteedThroughputProbabilisticSampler)\n\tfor _, strategy := range strategies.PerOperationStrategies {\n\t\tsampler := newGuaranteedThroughputProbabilisticSampler(\n\t\t\tstrategies.DefaultLowerBoundTracesPerSecond,\n\t\t\tstrategy.ProbabilisticSampling.SamplingRate,\n\t\t)\n\t\tsamplers[strategy.Operation] = sampler\n\t}\n\treturn &adaptiveSampler{\n\t\tsamplers:       samplers,\n\t\tdefaultSampler: newProbabilisticSampler(strategies.DefaultSamplingProbability),\n\t\tlowerBound:     strategies.DefaultLowerBoundTracesPerSecond,\n\t\tmaxOperations:  maxOperations,\n\t}\n}\n\nfunc (s *adaptiveSampler) IsSampled(id TraceID, operation string) (bool, []Tag) {\n\ts.RLock()\n\tsampler, ok := s.samplers[operation]\n\tif ok {\n\t\tdefer s.RUnlock()\n\t\treturn sampler.IsSampled(id, operation)\n\t}\n\ts.RUnlock()\n\ts.Lock()\n\tdefer s.Unlock()\n\n\t// Check if sampler has already been created\n\tsampler, ok = s.samplers[operation]\n\tif ok {\n\t\treturn sampler.IsSampled(id, operation)\n\t}\n\t// Store only up to maxOperations of unique ops.\n\tif len(s.samplers) >= s.maxOperations {\n\t\treturn s.defaultSampler.IsSampled(id, operation)\n\t}\n\tnewSampler := newGuaranteedThroughputProbabilisticSampler(s.lowerBound, s.defaultSampler.SamplingRate())\n\ts.samplers[operation] = newSampler\n\treturn newSampler.IsSampled(id, operation)\n}\n\nfunc (s *adaptiveSampler) Close() {\n\ts.Lock()\n\tdefer s.Unlock()\n\tfor _, sampler := range s.samplers {\n\t\tsampler.Close()\n\t}\n\ts.defaultSampler.Close()\n}\n\nfunc (s *adaptiveSampler) Equal(other Sampler) bool {\n\t// NB The Equal() function is overly expensive for adaptiveSampler since it's composed of multiple\n\t// samplers which all need to be initialized before this function can be called for a comparison.\n\t// Therefore, adaptiveSampler uses the update() function to only alter the samplers that need\n\t// changing. Hence this function always returns false so that the update function can be called.\n\t// Once the Equal() function is removed from the Sampler API, this will no longer be needed.\n\treturn false\n}\n\nfunc (s *adaptiveSampler) update(strategies *sampling.PerOperationSamplingStrategies) {\n\ts.Lock()\n\tdefer s.Unlock()\n\tfor _, strategy := range strategies.PerOperationStrategies {\n\t\toperation := strategy.Operation\n\t\tsamplingRate := strategy.ProbabilisticSampling.SamplingRate\n\t\tlowerBound := strategies.DefaultLowerBoundTracesPerSecond\n\t\tif sampler, ok := s.samplers[operation]; ok {\n\t\t\tsampler.update(lowerBound, samplingRate)\n\t\t} else {\n\t\t\tsampler := newGuaranteedThroughputProbabilisticSampler(\n\t\t\t\tlowerBound,\n\t\t\t\tsamplingRate,\n\t\t\t)\n\t\t\ts.samplers[operation] = sampler\n\t\t}\n\t}\n\ts.lowerBound = strategies.DefaultLowerBoundTracesPerSecond\n\tif s.defaultSampler.SamplingRate() != strategies.DefaultSamplingProbability {\n\t\ts.defaultSampler = newProbabilisticSampler(strategies.DefaultSamplingProbability)\n\t}\n}\n\n// -----------------------\n\n// RemotelyControlledSampler is a delegating sampler that polls a remote server\n// for the appropriate sampling strategy, constructs a corresponding sampler and\n// delegates to it for sampling decisions.\ntype RemotelyControlledSampler struct {\n\t// These fields must be first in the struct because `sync/atomic` expects 64-bit alignment.\n\t// Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq\n\tclosed int64 // 0 - not closed, 1 - closed\n\n\tsync.RWMutex\n\tsamplerOptions\n\n\tserviceName string\n\tmanager     sampling.SamplingManager\n\tdoneChan    chan *sync.WaitGroup\n}\n\ntype httpSamplingManager struct {\n\tserverURL string\n}\n\nfunc (s *httpSamplingManager) GetSamplingStrategy(serviceName string) (*sampling.SamplingStrategyResponse, error) {\n\tvar out sampling.SamplingStrategyResponse\n\tv := url.Values{}\n\tv.Set(\"service\", serviceName)\n\tif err := utils.GetJSON(s.serverURL+\"?\"+v.Encode(), &out); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &out, nil\n}\n\n// NewRemotelyControlledSampler creates a sampler that periodically pulls\n// the sampling strategy from an HTTP sampling server (e.g. jaeger-agent).\nfunc NewRemotelyControlledSampler(\n\tserviceName string,\n\topts ...SamplerOption,\n) *RemotelyControlledSampler {\n\toptions := applySamplerOptions(opts...)\n\tsampler := &RemotelyControlledSampler{\n\t\tsamplerOptions: options,\n\t\tserviceName:    serviceName,\n\t\tmanager:        &httpSamplingManager{serverURL: options.samplingServerURL},\n\t\tdoneChan:       make(chan *sync.WaitGroup),\n\t}\n\tgo sampler.pollController()\n\treturn sampler\n}\n\nfunc applySamplerOptions(opts ...SamplerOption) samplerOptions {\n\toptions := samplerOptions{}\n\tfor _, option := range opts {\n\t\toption(&options)\n\t}\n\tif options.sampler == nil {\n\t\toptions.sampler = newProbabilisticSampler(0.001)\n\t}\n\tif options.logger == nil {\n\t\toptions.logger = log.NullLogger\n\t}\n\tif options.maxOperations <= 0 {\n\t\toptions.maxOperations = defaultMaxOperations\n\t}\n\tif options.samplingServerURL == \"\" {\n\t\toptions.samplingServerURL = defaultSamplingServerURL\n\t}\n\tif options.metrics == nil {\n\t\toptions.metrics = NewNullMetrics()\n\t}\n\tif options.samplingRefreshInterval <= 0 {\n\t\toptions.samplingRefreshInterval = defaultSamplingRefreshInterval\n\t}\n\treturn options\n}\n\n// IsSampled implements IsSampled() of Sampler.\nfunc (s *RemotelyControlledSampler) IsSampled(id TraceID, operation string) (bool, []Tag) {\n\ts.RLock()\n\tdefer s.RUnlock()\n\treturn s.sampler.IsSampled(id, operation)\n}\n\n// Close implements Close() of Sampler.\nfunc (s *RemotelyControlledSampler) Close() {\n\tif swapped := atomic.CompareAndSwapInt64(&s.closed, 0, 1); !swapped {\n\t\ts.logger.Error(\"Repeated attempt to close the sampler is ignored\")\n\t\treturn\n\t}\n\n\tvar wg sync.WaitGroup\n\twg.Add(1)\n\ts.doneChan <- &wg\n\twg.Wait()\n}\n\n// Equal implements Equal() of Sampler.\nfunc (s *RemotelyControlledSampler) Equal(other Sampler) bool {\n\t// NB The Equal() function is expensive and will be removed. See adaptiveSampler.Equal() for\n\t// more information.\n\tif o, ok := other.(*RemotelyControlledSampler); ok {\n\t\ts.RLock()\n\t\to.RLock()\n\t\tdefer s.RUnlock()\n\t\tdefer o.RUnlock()\n\t\treturn s.sampler.Equal(o.sampler)\n\t}\n\treturn false\n}\n\nfunc (s *RemotelyControlledSampler) pollController() {\n\tticker := time.NewTicker(s.samplingRefreshInterval)\n\tdefer ticker.Stop()\n\ts.pollControllerWithTicker(ticker)\n}\n\nfunc (s *RemotelyControlledSampler) pollControllerWithTicker(ticker *time.Ticker) {\n\tfor {\n\t\tselect {\n\t\tcase <-ticker.C:\n\t\t\ts.updateSampler()\n\t\tcase wg := <-s.doneChan:\n\t\t\twg.Done()\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (s *RemotelyControlledSampler) getSampler() Sampler {\n\ts.Lock()\n\tdefer s.Unlock()\n\treturn s.sampler\n}\n\nfunc (s *RemotelyControlledSampler) setSampler(sampler Sampler) {\n\ts.Lock()\n\tdefer s.Unlock()\n\ts.sampler = sampler\n}\n\nfunc (s *RemotelyControlledSampler) updateSampler() {\n\tres, err := s.manager.GetSamplingStrategy(s.serviceName)\n\tif err != nil {\n\t\ts.metrics.SamplerQueryFailure.Inc(1)\n\t\treturn\n\t}\n\ts.Lock()\n\tdefer s.Unlock()\n\n\ts.metrics.SamplerRetrieved.Inc(1)\n\tif strategies := res.GetOperationSampling(); strategies != nil {\n\t\ts.updateAdaptiveSampler(strategies)\n\t} else {\n\t\terr = s.updateRateLimitingOrProbabilisticSampler(res)\n\t}\n\tif err != nil {\n\t\ts.metrics.SamplerUpdateFailure.Inc(1)\n\t\ts.logger.Infof(\"Unable to handle sampling strategy response %+v. Got error: %v\", res, err)\n\t\treturn\n\t}\n\ts.metrics.SamplerUpdated.Inc(1)\n}\n\n// NB: this function should only be called while holding a Write lock\nfunc (s *RemotelyControlledSampler) updateAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies) {\n\tif adaptiveSampler, ok := s.sampler.(*adaptiveSampler); ok {\n\t\tadaptiveSampler.update(strategies)\n\t} else {\n\t\ts.sampler = newAdaptiveSampler(strategies, s.maxOperations)\n\t}\n}\n\n// NB: this function should only be called while holding a Write lock\nfunc (s *RemotelyControlledSampler) updateRateLimitingOrProbabilisticSampler(res *sampling.SamplingStrategyResponse) error {\n\tvar newSampler Sampler\n\tif probabilistic := res.GetProbabilisticSampling(); probabilistic != nil {\n\t\tnewSampler = newProbabilisticSampler(probabilistic.SamplingRate)\n\t} else if rateLimiting := res.GetRateLimitingSampling(); rateLimiting != nil {\n\t\tnewSampler = NewRateLimitingSampler(float64(rateLimiting.MaxTracesPerSecond))\n\t} else {\n\t\treturn fmt.Errorf(\"Unsupported sampling strategy type %v\", res.GetStrategyType())\n\t}\n\tif !s.sampler.Equal(newSampler) {\n\t\ts.sampler = newSampler\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/sampler_options.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"time\"\n)\n\n// SamplerOption is a function that sets some option on the sampler\ntype SamplerOption func(options *samplerOptions)\n\n// SamplerOptions is a factory for all available SamplerOption's\nvar SamplerOptions samplerOptions\n\ntype samplerOptions struct {\n\tmetrics                 *Metrics\n\tmaxOperations           int\n\tsampler                 Sampler\n\tlogger                  Logger\n\tsamplingServerURL       string\n\tsamplingRefreshInterval time.Duration\n}\n\n// Metrics creates a SamplerOption that initializes Metrics on the sampler,\n// which is used to emit statistics.\nfunc (samplerOptions) Metrics(m *Metrics) SamplerOption {\n\treturn func(o *samplerOptions) {\n\t\to.metrics = m\n\t}\n}\n\n// MaxOperations creates a SamplerOption that sets the maximum number of\n// operations the sampler will keep track of.\nfunc (samplerOptions) MaxOperations(maxOperations int) SamplerOption {\n\treturn func(o *samplerOptions) {\n\t\to.maxOperations = maxOperations\n\t}\n}\n\n// InitialSampler creates a SamplerOption that sets the initial sampler\n// to use before a remote sampler is created and used.\nfunc (samplerOptions) InitialSampler(sampler Sampler) SamplerOption {\n\treturn func(o *samplerOptions) {\n\t\to.sampler = sampler\n\t}\n}\n\n// Logger creates a SamplerOption that sets the logger used by the sampler.\nfunc (samplerOptions) Logger(logger Logger) SamplerOption {\n\treturn func(o *samplerOptions) {\n\t\to.logger = logger\n\t}\n}\n\n// SamplingServerURL creates a SamplerOption that sets the sampling server url\n// of the local agent that contains the sampling strategies.\nfunc (samplerOptions) SamplingServerURL(samplingServerURL string) SamplerOption {\n\treturn func(o *samplerOptions) {\n\t\to.samplingServerURL = samplingServerURL\n\t}\n}\n\n// SamplingRefreshInterval creates a SamplerOption that sets how often the\n// sampler will poll local agent for the appropriate sampling strategy.\nfunc (samplerOptions) SamplingRefreshInterval(samplingRefreshInterval time.Duration) SamplerOption {\n\treturn func(o *samplerOptions) {\n\t\to.samplingRefreshInterval = samplingRefreshInterval\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/span.go",
    "content": "// Copyright (c) 2017-2018 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go\"\n\t\"github.com/opentracing/opentracing-go/ext\"\n\t\"github.com/opentracing/opentracing-go/log\"\n)\n\n// Span implements opentracing.Span\ntype Span struct {\n\tsync.RWMutex\n\n\ttracer *Tracer\n\n\tcontext SpanContext\n\n\t// The name of the \"operation\" this span is an instance of.\n\t// Known as a \"span name\" in some implementations.\n\toperationName string\n\n\t// firstInProcess, if true, indicates that this span is the root of the (sub)tree\n\t// of spans in the current process. In other words it's true for the root spans,\n\t// and the ingress spans when the process joins another trace.\n\tfirstInProcess bool\n\n\t// startTime is the timestamp indicating when the span began, with microseconds precision.\n\tstartTime time.Time\n\n\t// duration returns duration of the span with microseconds precision.\n\t// Zero value means duration is unknown.\n\tduration time.Duration\n\n\t// tags attached to this span\n\ttags []Tag\n\n\t// The span's \"micro-log\"\n\tlogs []opentracing.LogRecord\n\n\t// references for this span\n\treferences []Reference\n\n\tobserver ContribSpanObserver\n}\n\n// Tag is a simple key value wrapper.\n// TODO deprecate in the next major release, use opentracing.Tag instead.\ntype Tag struct {\n\tkey   string\n\tvalue interface{}\n}\n\n// SetOperationName sets or changes the operation name.\nfunc (s *Span) SetOperationName(operationName string) opentracing.Span {\n\ts.Lock()\n\tdefer s.Unlock()\n\tif s.context.IsSampled() {\n\t\ts.operationName = operationName\n\t}\n\ts.observer.OnSetOperationName(operationName)\n\treturn s\n}\n\n// SetTag implements SetTag() of opentracing.Span\nfunc (s *Span) SetTag(key string, value interface{}) opentracing.Span {\n\ts.observer.OnSetTag(key, value)\n\tif key == string(ext.SamplingPriority) && !setSamplingPriority(s, value) {\n\t\treturn s\n\t}\n\ts.Lock()\n\tdefer s.Unlock()\n\tif s.context.IsSampled() {\n\t\ts.setTagNoLocking(key, value)\n\t}\n\treturn s\n}\n\nfunc (s *Span) setTagNoLocking(key string, value interface{}) {\n\ts.tags = append(s.tags, Tag{key: key, value: value})\n}\n\n// LogFields implements opentracing.Span API\nfunc (s *Span) LogFields(fields ...log.Field) {\n\ts.Lock()\n\tdefer s.Unlock()\n\tif !s.context.IsSampled() {\n\t\treturn\n\t}\n\ts.logFieldsNoLocking(fields...)\n}\n\n// this function should only be called while holding a Write lock\nfunc (s *Span) logFieldsNoLocking(fields ...log.Field) {\n\tlr := opentracing.LogRecord{\n\t\tFields:    fields,\n\t\tTimestamp: time.Now(),\n\t}\n\ts.appendLog(lr)\n}\n\n// LogKV implements opentracing.Span API\nfunc (s *Span) LogKV(alternatingKeyValues ...interface{}) {\n\ts.RLock()\n\tsampled := s.context.IsSampled()\n\ts.RUnlock()\n\tif !sampled {\n\t\treturn\n\t}\n\tfields, err := log.InterleavedKVToFields(alternatingKeyValues...)\n\tif err != nil {\n\t\ts.LogFields(log.Error(err), log.String(\"function\", \"LogKV\"))\n\t\treturn\n\t}\n\ts.LogFields(fields...)\n}\n\n// LogEvent implements opentracing.Span API\nfunc (s *Span) LogEvent(event string) {\n\ts.Log(opentracing.LogData{Event: event})\n}\n\n// LogEventWithPayload implements opentracing.Span API\nfunc (s *Span) LogEventWithPayload(event string, payload interface{}) {\n\ts.Log(opentracing.LogData{Event: event, Payload: payload})\n}\n\n// Log implements opentracing.Span API\nfunc (s *Span) Log(ld opentracing.LogData) {\n\ts.Lock()\n\tdefer s.Unlock()\n\tif s.context.IsSampled() {\n\t\tif ld.Timestamp.IsZero() {\n\t\t\tld.Timestamp = s.tracer.timeNow()\n\t\t}\n\t\ts.appendLog(ld.ToLogRecord())\n\t}\n}\n\n// this function should only be called while holding a Write lock\nfunc (s *Span) appendLog(lr opentracing.LogRecord) {\n\t// TODO add logic to limit number of logs per span (issue #46)\n\ts.logs = append(s.logs, lr)\n}\n\n// SetBaggageItem implements SetBaggageItem() of opentracing.SpanContext\nfunc (s *Span) SetBaggageItem(key, value string) opentracing.Span {\n\ts.Lock()\n\tdefer s.Unlock()\n\ts.tracer.setBaggage(s, key, value)\n\treturn s\n}\n\n// BaggageItem implements BaggageItem() of opentracing.SpanContext\nfunc (s *Span) BaggageItem(key string) string {\n\ts.RLock()\n\tdefer s.RUnlock()\n\treturn s.context.baggage[key]\n}\n\n// Finish implements opentracing.Span API\nfunc (s *Span) Finish() {\n\ts.FinishWithOptions(opentracing.FinishOptions{})\n}\n\n// FinishWithOptions implements opentracing.Span API\nfunc (s *Span) FinishWithOptions(options opentracing.FinishOptions) {\n\tif options.FinishTime.IsZero() {\n\t\toptions.FinishTime = s.tracer.timeNow()\n\t}\n\ts.observer.OnFinish(options)\n\ts.Lock()\n\tif s.context.IsSampled() {\n\t\ts.duration = options.FinishTime.Sub(s.startTime)\n\t\t// Note: bulk logs are not subject to maxLogsPerSpan limit\n\t\tif options.LogRecords != nil {\n\t\t\ts.logs = append(s.logs, options.LogRecords...)\n\t\t}\n\t\tfor _, ld := range options.BulkLogData {\n\t\t\ts.logs = append(s.logs, ld.ToLogRecord())\n\t\t}\n\t}\n\ts.Unlock()\n\t// call reportSpan even for non-sampled traces, to return span to the pool\n\ts.tracer.reportSpan(s)\n}\n\n// Context implements opentracing.Span API\nfunc (s *Span) Context() opentracing.SpanContext {\n\ts.Lock()\n\tdefer s.Unlock()\n\treturn s.context\n}\n\n// Tracer implements opentracing.Span API\nfunc (s *Span) Tracer() opentracing.Tracer {\n\treturn s.tracer\n}\n\nfunc (s *Span) String() string {\n\ts.RLock()\n\tdefer s.RUnlock()\n\treturn s.context.String()\n}\n\n// OperationName allows retrieving current operation name.\nfunc (s *Span) OperationName() string {\n\ts.RLock()\n\tdefer s.RUnlock()\n\treturn s.operationName\n}\n\nfunc (s *Span) serviceName() string {\n\treturn s.tracer.serviceName\n}\n\n// setSamplingPriority returns true if the flag was updated successfully, false otherwise.\nfunc setSamplingPriority(s *Span, value interface{}) bool {\n\ts.Lock()\n\tdefer s.Unlock()\n\tval, ok := value.(uint16)\n\tif !ok {\n\t\treturn false\n\t}\n\tif val == 0 {\n\t\ts.context.flags = s.context.flags & (^flagSampled)\n\t\treturn true\n\t}\n\tif s.tracer.isDebugAllowed(s.operationName) {\n\t\ts.context.flags = s.context.flags | flagDebug | flagSampled\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/README.md",
    "content": "# Apache Thrift\n\nThis is a partial copy of Apache Thrift v0.10 (https://github.com/apache/thrift/commit/b2a4d4ae21c789b689dd162deb819665567f481c).\n\nIt is vendored code to avoid compatibility issues introduced in Thrift  v0.11.\n\nSee https://github.com/jaegertracing/jaeger-client-go/pull/303.\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nconst (\n\tUNKNOWN_APPLICATION_EXCEPTION  = 0\n\tUNKNOWN_METHOD                 = 1\n\tINVALID_MESSAGE_TYPE_EXCEPTION = 2\n\tWRONG_METHOD_NAME              = 3\n\tBAD_SEQUENCE_ID                = 4\n\tMISSING_RESULT                 = 5\n\tINTERNAL_ERROR                 = 6\n\tPROTOCOL_ERROR                 = 7\n)\n\n// Application level Thrift exception\ntype TApplicationException interface {\n\tTException\n\tTypeId() int32\n\tRead(iprot TProtocol) (TApplicationException, error)\n\tWrite(oprot TProtocol) error\n}\n\ntype tApplicationException struct {\n\tmessage string\n\ttype_   int32\n}\n\nfunc (e tApplicationException) Error() string {\n\treturn e.message\n}\n\nfunc NewTApplicationException(type_ int32, message string) TApplicationException {\n\treturn &tApplicationException{message, type_}\n}\n\nfunc (p *tApplicationException) TypeId() int32 {\n\treturn p.type_\n}\n\nfunc (p *tApplicationException) Read(iprot TProtocol) (TApplicationException, error) {\n\t_, err := iprot.ReadStructBegin()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmessage := \"\"\n\ttype_ := int32(UNKNOWN_APPLICATION_EXCEPTION)\n\n\tfor {\n\t\t_, ttype, id, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif ttype == STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch id {\n\t\tcase 1:\n\t\t\tif ttype == STRING {\n\t\t\t\tif message, err = iprot.ReadString(); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = SkipDefaultDepth(iprot, ttype); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\tcase 2:\n\t\t\tif ttype == I32 {\n\t\t\t\tif type_, err = iprot.ReadI32(); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err = SkipDefaultDepth(iprot, ttype); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\tdefault:\n\t\t\tif err = SkipDefaultDepth(iprot, ttype); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tif err = iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn NewTApplicationException(type_, message), iprot.ReadStructEnd()\n}\n\nfunc (p *tApplicationException) Write(oprot TProtocol) (err error) {\n\terr = oprot.WriteStructBegin(\"TApplicationException\")\n\tif len(p.Error()) > 0 {\n\t\terr = oprot.WriteFieldBegin(\"message\", STRING, 1)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = oprot.WriteString(p.Error())\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = oprot.WriteFieldEnd()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\terr = oprot.WriteFieldBegin(\"type\", I32, 2)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = oprot.WriteI32(p.type_)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = oprot.WriteFieldEnd()\n\tif err != nil {\n\t\treturn\n\t}\n\terr = oprot.WriteFieldStop()\n\tif err != nil {\n\t\treturn\n\t}\n\terr = oprot.WriteStructEnd()\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n)\n\ntype TBinaryProtocol struct {\n\ttrans         TRichTransport\n\torigTransport TTransport\n\treader        io.Reader\n\twriter        io.Writer\n\tstrictRead    bool\n\tstrictWrite   bool\n\tbuffer        [64]byte\n}\n\ntype TBinaryProtocolFactory struct {\n\tstrictRead  bool\n\tstrictWrite bool\n}\n\nfunc NewTBinaryProtocolTransport(t TTransport) *TBinaryProtocol {\n\treturn NewTBinaryProtocol(t, false, true)\n}\n\nfunc NewTBinaryProtocol(t TTransport, strictRead, strictWrite bool) *TBinaryProtocol {\n\tp := &TBinaryProtocol{origTransport: t, strictRead: strictRead, strictWrite: strictWrite}\n\tif et, ok := t.(TRichTransport); ok {\n\t\tp.trans = et\n\t} else {\n\t\tp.trans = NewTRichTransport(t)\n\t}\n\tp.reader = p.trans\n\tp.writer = p.trans\n\treturn p\n}\n\nfunc NewTBinaryProtocolFactoryDefault() *TBinaryProtocolFactory {\n\treturn NewTBinaryProtocolFactory(false, true)\n}\n\nfunc NewTBinaryProtocolFactory(strictRead, strictWrite bool) *TBinaryProtocolFactory {\n\treturn &TBinaryProtocolFactory{strictRead: strictRead, strictWrite: strictWrite}\n}\n\nfunc (p *TBinaryProtocolFactory) GetProtocol(t TTransport) TProtocol {\n\treturn NewTBinaryProtocol(t, p.strictRead, p.strictWrite)\n}\n\n/**\n * Writing Methods\n */\n\nfunc (p *TBinaryProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error {\n\tif p.strictWrite {\n\t\tversion := uint32(VERSION_1) | uint32(typeId)\n\t\te := p.WriteI32(int32(version))\n\t\tif e != nil {\n\t\t\treturn e\n\t\t}\n\t\te = p.WriteString(name)\n\t\tif e != nil {\n\t\t\treturn e\n\t\t}\n\t\te = p.WriteI32(seqId)\n\t\treturn e\n\t} else {\n\t\te := p.WriteString(name)\n\t\tif e != nil {\n\t\t\treturn e\n\t\t}\n\t\te = p.WriteByte(int8(typeId))\n\t\tif e != nil {\n\t\t\treturn e\n\t\t}\n\t\te = p.WriteI32(seqId)\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteMessageEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteStructBegin(name string) error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteStructEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteFieldBegin(name string, typeId TType, id int16) error {\n\te := p.WriteByte(int8(typeId))\n\tif e != nil {\n\t\treturn e\n\t}\n\te = p.WriteI16(id)\n\treturn e\n}\n\nfunc (p *TBinaryProtocol) WriteFieldEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteFieldStop() error {\n\te := p.WriteByte(STOP)\n\treturn e\n}\n\nfunc (p *TBinaryProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error {\n\te := p.WriteByte(int8(keyType))\n\tif e != nil {\n\t\treturn e\n\t}\n\te = p.WriteByte(int8(valueType))\n\tif e != nil {\n\t\treturn e\n\t}\n\te = p.WriteI32(int32(size))\n\treturn e\n}\n\nfunc (p *TBinaryProtocol) WriteMapEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteListBegin(elemType TType, size int) error {\n\te := p.WriteByte(int8(elemType))\n\tif e != nil {\n\t\treturn e\n\t}\n\te = p.WriteI32(int32(size))\n\treturn e\n}\n\nfunc (p *TBinaryProtocol) WriteListEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteSetBegin(elemType TType, size int) error {\n\te := p.WriteByte(int8(elemType))\n\tif e != nil {\n\t\treturn e\n\t}\n\te = p.WriteI32(int32(size))\n\treturn e\n}\n\nfunc (p *TBinaryProtocol) WriteSetEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) WriteBool(value bool) error {\n\tif value {\n\t\treturn p.WriteByte(1)\n\t}\n\treturn p.WriteByte(0)\n}\n\nfunc (p *TBinaryProtocol) WriteByte(value int8) error {\n\te := p.trans.WriteByte(byte(value))\n\treturn NewTProtocolException(e)\n}\n\nfunc (p *TBinaryProtocol) WriteI16(value int16) error {\n\tv := p.buffer[0:2]\n\tbinary.BigEndian.PutUint16(v, uint16(value))\n\t_, e := p.writer.Write(v)\n\treturn NewTProtocolException(e)\n}\n\nfunc (p *TBinaryProtocol) WriteI32(value int32) error {\n\tv := p.buffer[0:4]\n\tbinary.BigEndian.PutUint32(v, uint32(value))\n\t_, e := p.writer.Write(v)\n\treturn NewTProtocolException(e)\n}\n\nfunc (p *TBinaryProtocol) WriteI64(value int64) error {\n\tv := p.buffer[0:8]\n\tbinary.BigEndian.PutUint64(v, uint64(value))\n\t_, err := p.writer.Write(v)\n\treturn NewTProtocolException(err)\n}\n\nfunc (p *TBinaryProtocol) WriteDouble(value float64) error {\n\treturn p.WriteI64(int64(math.Float64bits(value)))\n}\n\nfunc (p *TBinaryProtocol) WriteString(value string) error {\n\te := p.WriteI32(int32(len(value)))\n\tif e != nil {\n\t\treturn e\n\t}\n\t_, err := p.trans.WriteString(value)\n\treturn NewTProtocolException(err)\n}\n\nfunc (p *TBinaryProtocol) WriteBinary(value []byte) error {\n\te := p.WriteI32(int32(len(value)))\n\tif e != nil {\n\t\treturn e\n\t}\n\t_, err := p.writer.Write(value)\n\treturn NewTProtocolException(err)\n}\n\n/**\n * Reading methods\n */\n\nfunc (p *TBinaryProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) {\n\tsize, e := p.ReadI32()\n\tif e != nil {\n\t\treturn \"\", typeId, 0, NewTProtocolException(e)\n\t}\n\tif size < 0 {\n\t\ttypeId = TMessageType(size & 0x0ff)\n\t\tversion := int64(int64(size) & VERSION_MASK)\n\t\tif version != VERSION_1 {\n\t\t\treturn name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf(\"Bad version in ReadMessageBegin\"))\n\t\t}\n\t\tname, e = p.ReadString()\n\t\tif e != nil {\n\t\t\treturn name, typeId, seqId, NewTProtocolException(e)\n\t\t}\n\t\tseqId, e = p.ReadI32()\n\t\tif e != nil {\n\t\t\treturn name, typeId, seqId, NewTProtocolException(e)\n\t\t}\n\t\treturn name, typeId, seqId, nil\n\t}\n\tif p.strictRead {\n\t\treturn name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf(\"Missing version in ReadMessageBegin\"))\n\t}\n\tname, e2 := p.readStringBody(size)\n\tif e2 != nil {\n\t\treturn name, typeId, seqId, e2\n\t}\n\tb, e3 := p.ReadByte()\n\tif e3 != nil {\n\t\treturn name, typeId, seqId, e3\n\t}\n\ttypeId = TMessageType(b)\n\tseqId, e4 := p.ReadI32()\n\tif e4 != nil {\n\t\treturn name, typeId, seqId, e4\n\t}\n\treturn name, typeId, seqId, nil\n}\n\nfunc (p *TBinaryProtocol) ReadMessageEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) ReadStructBegin() (name string, err error) {\n\treturn\n}\n\nfunc (p *TBinaryProtocol) ReadStructEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) ReadFieldBegin() (name string, typeId TType, seqId int16, err error) {\n\tt, err := p.ReadByte()\n\ttypeId = TType(t)\n\tif err != nil {\n\t\treturn name, typeId, seqId, err\n\t}\n\tif t != STOP {\n\t\tseqId, err = p.ReadI16()\n\t}\n\treturn name, typeId, seqId, err\n}\n\nfunc (p *TBinaryProtocol) ReadFieldEnd() error {\n\treturn nil\n}\n\nvar invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New(\"Invalid data length\"))\n\nfunc (p *TBinaryProtocol) ReadMapBegin() (kType, vType TType, size int, err error) {\n\tk, e := p.ReadByte()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\tkType = TType(k)\n\tv, e := p.ReadByte()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\tvType = TType(v)\n\tsize32, e := p.ReadI32()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\tif size32 < 0 {\n\t\terr = invalidDataLength\n\t\treturn\n\t}\n\tsize = int(size32)\n\treturn kType, vType, size, nil\n}\n\nfunc (p *TBinaryProtocol) ReadMapEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) ReadListBegin() (elemType TType, size int, err error) {\n\tb, e := p.ReadByte()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\telemType = TType(b)\n\tsize32, e := p.ReadI32()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\tif size32 < 0 {\n\t\terr = invalidDataLength\n\t\treturn\n\t}\n\tsize = int(size32)\n\n\treturn\n}\n\nfunc (p *TBinaryProtocol) ReadListEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) ReadSetBegin() (elemType TType, size int, err error) {\n\tb, e := p.ReadByte()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\telemType = TType(b)\n\tsize32, e := p.ReadI32()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\tif size32 < 0 {\n\t\terr = invalidDataLength\n\t\treturn\n\t}\n\tsize = int(size32)\n\treturn elemType, size, nil\n}\n\nfunc (p *TBinaryProtocol) ReadSetEnd() error {\n\treturn nil\n}\n\nfunc (p *TBinaryProtocol) ReadBool() (bool, error) {\n\tb, e := p.ReadByte()\n\tv := true\n\tif b != 1 {\n\t\tv = false\n\t}\n\treturn v, e\n}\n\nfunc (p *TBinaryProtocol) ReadByte() (int8, error) {\n\tv, err := p.trans.ReadByte()\n\treturn int8(v), err\n}\n\nfunc (p *TBinaryProtocol) ReadI16() (value int16, err error) {\n\tbuf := p.buffer[0:2]\n\terr = p.readAll(buf)\n\tvalue = int16(binary.BigEndian.Uint16(buf))\n\treturn value, err\n}\n\nfunc (p *TBinaryProtocol) ReadI32() (value int32, err error) {\n\tbuf := p.buffer[0:4]\n\terr = p.readAll(buf)\n\tvalue = int32(binary.BigEndian.Uint32(buf))\n\treturn value, err\n}\n\nfunc (p *TBinaryProtocol) ReadI64() (value int64, err error) {\n\tbuf := p.buffer[0:8]\n\terr = p.readAll(buf)\n\tvalue = int64(binary.BigEndian.Uint64(buf))\n\treturn value, err\n}\n\nfunc (p *TBinaryProtocol) ReadDouble() (value float64, err error) {\n\tbuf := p.buffer[0:8]\n\terr = p.readAll(buf)\n\tvalue = math.Float64frombits(binary.BigEndian.Uint64(buf))\n\treturn value, err\n}\n\nfunc (p *TBinaryProtocol) ReadString() (value string, err error) {\n\tsize, e := p.ReadI32()\n\tif e != nil {\n\t\treturn \"\", e\n\t}\n\tif size < 0 {\n\t\terr = invalidDataLength\n\t\treturn\n\t}\n\n\treturn p.readStringBody(size)\n}\n\nfunc (p *TBinaryProtocol) ReadBinary() ([]byte, error) {\n\tsize, e := p.ReadI32()\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\tif size < 0 {\n\t\treturn nil, invalidDataLength\n\t}\n\tif uint64(size) > p.trans.RemainingBytes() {\n\t\treturn nil, invalidDataLength\n\t}\n\n\tisize := int(size)\n\tbuf := make([]byte, isize)\n\t_, err := io.ReadFull(p.trans, buf)\n\treturn buf, NewTProtocolException(err)\n}\n\nfunc (p *TBinaryProtocol) Flush() (err error) {\n\treturn NewTProtocolException(p.trans.Flush())\n}\n\nfunc (p *TBinaryProtocol) Skip(fieldType TType) (err error) {\n\treturn SkipDefaultDepth(p, fieldType)\n}\n\nfunc (p *TBinaryProtocol) Transport() TTransport {\n\treturn p.origTransport\n}\n\nfunc (p *TBinaryProtocol) readAll(buf []byte) error {\n\t_, err := io.ReadFull(p.reader, buf)\n\treturn NewTProtocolException(err)\n}\n\nconst readLimit = 32768\n\nfunc (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) {\n\tif size < 0 {\n\t\treturn \"\", nil\n\t}\n\tif uint64(size) > p.trans.RemainingBytes() {\n\t\treturn \"\", invalidDataLength\n\t}\n\n\tvar (\n\t\tbuf bytes.Buffer\n\t\te   error\n\t\tb   []byte\n\t)\n\n\tswitch {\n\tcase int(size) <= len(p.buffer):\n\t\tb = p.buffer[:size] // avoids allocation for small reads\n\tcase int(size) < readLimit:\n\t\tb = make([]byte, size)\n\tdefault:\n\t\tb = make([]byte, readLimit)\n\t}\n\n\tfor size > 0 {\n\t\t_, e = io.ReadFull(p.trans, b)\n\t\tbuf.Write(b)\n\t\tif e != nil {\n\t\t\tbreak\n\t\t}\n\t\tsize -= readLimit\n\t\tif size < readLimit && size > 0 {\n\t\t\tb = b[:size]\n\t\t}\n\t}\n\treturn buf.String(), NewTProtocolException(e)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n)\n\nconst (\n\tCOMPACT_PROTOCOL_ID       = 0x082\n\tCOMPACT_VERSION           = 1\n\tCOMPACT_VERSION_MASK      = 0x1f\n\tCOMPACT_TYPE_MASK         = 0x0E0\n\tCOMPACT_TYPE_BITS         = 0x07\n\tCOMPACT_TYPE_SHIFT_AMOUNT = 5\n)\n\ntype tCompactType byte\n\nconst (\n\tCOMPACT_BOOLEAN_TRUE  = 0x01\n\tCOMPACT_BOOLEAN_FALSE = 0x02\n\tCOMPACT_BYTE          = 0x03\n\tCOMPACT_I16           = 0x04\n\tCOMPACT_I32           = 0x05\n\tCOMPACT_I64           = 0x06\n\tCOMPACT_DOUBLE        = 0x07\n\tCOMPACT_BINARY        = 0x08\n\tCOMPACT_LIST          = 0x09\n\tCOMPACT_SET           = 0x0A\n\tCOMPACT_MAP           = 0x0B\n\tCOMPACT_STRUCT        = 0x0C\n)\n\nvar (\n\tttypeToCompactType map[TType]tCompactType\n)\n\nfunc init() {\n\tttypeToCompactType = map[TType]tCompactType{\n\t\tSTOP:   STOP,\n\t\tBOOL:   COMPACT_BOOLEAN_TRUE,\n\t\tBYTE:   COMPACT_BYTE,\n\t\tI16:    COMPACT_I16,\n\t\tI32:    COMPACT_I32,\n\t\tI64:    COMPACT_I64,\n\t\tDOUBLE: COMPACT_DOUBLE,\n\t\tSTRING: COMPACT_BINARY,\n\t\tLIST:   COMPACT_LIST,\n\t\tSET:    COMPACT_SET,\n\t\tMAP:    COMPACT_MAP,\n\t\tSTRUCT: COMPACT_STRUCT,\n\t}\n}\n\ntype TCompactProtocolFactory struct{}\n\nfunc NewTCompactProtocolFactory() *TCompactProtocolFactory {\n\treturn &TCompactProtocolFactory{}\n}\n\nfunc (p *TCompactProtocolFactory) GetProtocol(trans TTransport) TProtocol {\n\treturn NewTCompactProtocol(trans)\n}\n\ntype TCompactProtocol struct {\n\ttrans         TRichTransport\n\torigTransport TTransport\n\n\t// Used to keep track of the last field for the current and previous structs,\n\t// so we can do the delta stuff.\n\tlastField   []int\n\tlastFieldId int\n\n\t// If we encounter a boolean field begin, save the TField here so it can\n\t// have the value incorporated.\n\tbooleanFieldName    string\n\tbooleanFieldId      int16\n\tbooleanFieldPending bool\n\n\t// If we read a field header, and it's a boolean field, save the boolean\n\t// value here so that readBool can use it.\n\tboolValue          bool\n\tboolValueIsNotNull bool\n\tbuffer             [64]byte\n}\n\n// Create a TCompactProtocol given a TTransport\nfunc NewTCompactProtocol(trans TTransport) *TCompactProtocol {\n\tp := &TCompactProtocol{origTransport: trans, lastField: []int{}}\n\tif et, ok := trans.(TRichTransport); ok {\n\t\tp.trans = et\n\t} else {\n\t\tp.trans = NewTRichTransport(trans)\n\t}\n\n\treturn p\n\n}\n\n//\n// Public Writing methods.\n//\n\n// Write a message header to the wire. Compact Protocol messages contain the\n// protocol version so we can migrate forwards in the future if need be.\nfunc (p *TCompactProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error {\n\terr := p.writeByteDirect(COMPACT_PROTOCOL_ID)\n\tif err != nil {\n\t\treturn NewTProtocolException(err)\n\t}\n\terr = p.writeByteDirect((COMPACT_VERSION & COMPACT_VERSION_MASK) | ((byte(typeId) << COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_MASK))\n\tif err != nil {\n\t\treturn NewTProtocolException(err)\n\t}\n\t_, err = p.writeVarint32(seqid)\n\tif err != nil {\n\t\treturn NewTProtocolException(err)\n\t}\n\te := p.WriteString(name)\n\treturn e\n\n}\n\nfunc (p *TCompactProtocol) WriteMessageEnd() error { return nil }\n\n// Write a struct begin. This doesn't actually put anything on the wire. We\n// use it as an opportunity to put special placeholder markers on the field\n// stack so we can get the field id deltas correct.\nfunc (p *TCompactProtocol) WriteStructBegin(name string) error {\n\tp.lastField = append(p.lastField, p.lastFieldId)\n\tp.lastFieldId = 0\n\treturn nil\n}\n\n// Write a struct end. This doesn't actually put anything on the wire. We use\n// this as an opportunity to pop the last field from the current struct off\n// of the field stack.\nfunc (p *TCompactProtocol) WriteStructEnd() error {\n\tp.lastFieldId = p.lastField[len(p.lastField)-1]\n\tp.lastField = p.lastField[:len(p.lastField)-1]\n\treturn nil\n}\n\nfunc (p *TCompactProtocol) WriteFieldBegin(name string, typeId TType, id int16) error {\n\tif typeId == BOOL {\n\t\t// we want to possibly include the value, so we'll wait.\n\t\tp.booleanFieldName, p.booleanFieldId, p.booleanFieldPending = name, id, true\n\t\treturn nil\n\t}\n\t_, err := p.writeFieldBeginInternal(name, typeId, id, 0xFF)\n\treturn NewTProtocolException(err)\n}\n\n// The workhorse of writeFieldBegin. It has the option of doing a\n// 'type override' of the type header. This is used specifically in the\n// boolean field case.\nfunc (p *TCompactProtocol) writeFieldBeginInternal(name string, typeId TType, id int16, typeOverride byte) (int, error) {\n\t// short lastField = lastField_.pop();\n\n\t// if there's a type override, use that.\n\tvar typeToWrite byte\n\tif typeOverride == 0xFF {\n\t\ttypeToWrite = byte(p.getCompactType(typeId))\n\t} else {\n\t\ttypeToWrite = typeOverride\n\t}\n\t// check if we can use delta encoding for the field id\n\tfieldId := int(id)\n\twritten := 0\n\tif fieldId > p.lastFieldId && fieldId-p.lastFieldId <= 15 {\n\t\t// write them together\n\t\terr := p.writeByteDirect(byte((fieldId-p.lastFieldId)<<4) | typeToWrite)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t} else {\n\t\t// write them separate\n\t\terr := p.writeByteDirect(typeToWrite)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\terr = p.WriteI16(id)\n\t\twritten = 1 + 2\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\tp.lastFieldId = fieldId\n\t// p.lastField.Push(field.id);\n\treturn written, nil\n}\n\nfunc (p *TCompactProtocol) WriteFieldEnd() error { return nil }\n\nfunc (p *TCompactProtocol) WriteFieldStop() error {\n\terr := p.writeByteDirect(STOP)\n\treturn NewTProtocolException(err)\n}\n\nfunc (p *TCompactProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error {\n\tif size == 0 {\n\t\terr := p.writeByteDirect(0)\n\t\treturn NewTProtocolException(err)\n\t}\n\t_, err := p.writeVarint32(int32(size))\n\tif err != nil {\n\t\treturn NewTProtocolException(err)\n\t}\n\terr = p.writeByteDirect(byte(p.getCompactType(keyType))<<4 | byte(p.getCompactType(valueType)))\n\treturn NewTProtocolException(err)\n}\n\nfunc (p *TCompactProtocol) WriteMapEnd() error { return nil }\n\n// Write a list header.\nfunc (p *TCompactProtocol) WriteListBegin(elemType TType, size int) error {\n\t_, err := p.writeCollectionBegin(elemType, size)\n\treturn NewTProtocolException(err)\n}\n\nfunc (p *TCompactProtocol) WriteListEnd() error { return nil }\n\n// Write a set header.\nfunc (p *TCompactProtocol) WriteSetBegin(elemType TType, size int) error {\n\t_, err := p.writeCollectionBegin(elemType, size)\n\treturn NewTProtocolException(err)\n}\n\nfunc (p *TCompactProtocol) WriteSetEnd() error { return nil }\n\nfunc (p *TCompactProtocol) WriteBool(value bool) error {\n\tv := byte(COMPACT_BOOLEAN_FALSE)\n\tif value {\n\t\tv = byte(COMPACT_BOOLEAN_TRUE)\n\t}\n\tif p.booleanFieldPending {\n\t\t// we haven't written the field header yet\n\t\t_, err := p.writeFieldBeginInternal(p.booleanFieldName, BOOL, p.booleanFieldId, v)\n\t\tp.booleanFieldPending = false\n\t\treturn NewTProtocolException(err)\n\t}\n\t// we're not part of a field, so just write the value.\n\terr := p.writeByteDirect(v)\n\treturn NewTProtocolException(err)\n}\n\n// Write a byte. Nothing to see here!\nfunc (p *TCompactProtocol) WriteByte(value int8) error {\n\terr := p.writeByteDirect(byte(value))\n\treturn NewTProtocolException(err)\n}\n\n// Write an I16 as a zigzag varint.\nfunc (p *TCompactProtocol) WriteI16(value int16) error {\n\t_, err := p.writeVarint32(p.int32ToZigzag(int32(value)))\n\treturn NewTProtocolException(err)\n}\n\n// Write an i32 as a zigzag varint.\nfunc (p *TCompactProtocol) WriteI32(value int32) error {\n\t_, err := p.writeVarint32(p.int32ToZigzag(value))\n\treturn NewTProtocolException(err)\n}\n\n// Write an i64 as a zigzag varint.\nfunc (p *TCompactProtocol) WriteI64(value int64) error {\n\t_, err := p.writeVarint64(p.int64ToZigzag(value))\n\treturn NewTProtocolException(err)\n}\n\n// Write a double to the wire as 8 bytes.\nfunc (p *TCompactProtocol) WriteDouble(value float64) error {\n\tbuf := p.buffer[0:8]\n\tbinary.LittleEndian.PutUint64(buf, math.Float64bits(value))\n\t_, err := p.trans.Write(buf)\n\treturn NewTProtocolException(err)\n}\n\n// Write a string to the wire with a varint size preceding.\nfunc (p *TCompactProtocol) WriteString(value string) error {\n\t_, e := p.writeVarint32(int32(len(value)))\n\tif e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tif len(value) > 0 {\n\t}\n\t_, e = p.trans.WriteString(value)\n\treturn e\n}\n\n// Write a byte array, using a varint for the size.\nfunc (p *TCompactProtocol) WriteBinary(bin []byte) error {\n\t_, e := p.writeVarint32(int32(len(bin)))\n\tif e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tif len(bin) > 0 {\n\t\t_, e = p.trans.Write(bin)\n\t\treturn NewTProtocolException(e)\n\t}\n\treturn nil\n}\n\n//\n// Reading methods.\n//\n\n// Read a message header.\nfunc (p *TCompactProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) {\n\n\tprotocolId, err := p.readByteDirect()\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif protocolId != COMPACT_PROTOCOL_ID {\n\t\te := fmt.Errorf(\"Expected protocol id %02x but got %02x\", COMPACT_PROTOCOL_ID, protocolId)\n\t\treturn \"\", typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, e)\n\t}\n\n\tversionAndType, err := p.readByteDirect()\n\tif err != nil {\n\t\treturn\n\t}\n\n\tversion := versionAndType & COMPACT_VERSION_MASK\n\ttypeId = TMessageType((versionAndType >> COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_BITS)\n\tif version != COMPACT_VERSION {\n\t\te := fmt.Errorf(\"Expected version %02x but got %02x\", COMPACT_VERSION, version)\n\t\terr = NewTProtocolExceptionWithType(BAD_VERSION, e)\n\t\treturn\n\t}\n\tseqId, e := p.readVarint32()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\tname, err = p.ReadString()\n\treturn\n}\n\nfunc (p *TCompactProtocol) ReadMessageEnd() error { return nil }\n\n// Read a struct begin. There's nothing on the wire for this, but it is our\n// opportunity to push a new struct begin marker onto the field stack.\nfunc (p *TCompactProtocol) ReadStructBegin() (name string, err error) {\n\tp.lastField = append(p.lastField, p.lastFieldId)\n\tp.lastFieldId = 0\n\treturn\n}\n\n// Doesn't actually consume any wire data, just removes the last field for\n// this struct from the field stack.\nfunc (p *TCompactProtocol) ReadStructEnd() error {\n\t// consume the last field we read off the wire.\n\tp.lastFieldId = p.lastField[len(p.lastField)-1]\n\tp.lastField = p.lastField[:len(p.lastField)-1]\n\treturn nil\n}\n\n// Read a field header off the wire.\nfunc (p *TCompactProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) {\n\tt, err := p.readByteDirect()\n\tif err != nil {\n\t\treturn\n\t}\n\n\t// if it's a stop, then we can return immediately, as the struct is over.\n\tif (t & 0x0f) == STOP {\n\t\treturn \"\", STOP, 0, nil\n\t}\n\n\t// mask off the 4 MSB of the type header. it could contain a field id delta.\n\tmodifier := int16((t & 0xf0) >> 4)\n\tif modifier == 0 {\n\t\t// not a delta. look ahead for the zigzag varint field id.\n\t\tid, err = p.ReadI16()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t} else {\n\t\t// has a delta. add the delta to the last read field id.\n\t\tid = int16(p.lastFieldId) + modifier\n\t}\n\ttypeId, e := p.getTType(tCompactType(t & 0x0f))\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\n\t// if this happens to be a boolean field, the value is encoded in the type\n\tif p.isBoolType(t) {\n\t\t// save the boolean value in a special instance variable.\n\t\tp.boolValue = (byte(t)&0x0f == COMPACT_BOOLEAN_TRUE)\n\t\tp.boolValueIsNotNull = true\n\t}\n\n\t// push the new field onto the field stack so we can keep the deltas going.\n\tp.lastFieldId = int(id)\n\treturn\n}\n\nfunc (p *TCompactProtocol) ReadFieldEnd() error { return nil }\n\n// Read a map header off the wire. If the size is zero, skip reading the key\n// and value type. This means that 0-length maps will yield TMaps without the\n// \"correct\" types.\nfunc (p *TCompactProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) {\n\tsize32, e := p.readVarint32()\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\tif size32 < 0 {\n\t\terr = invalidDataLength\n\t\treturn\n\t}\n\tsize = int(size32)\n\n\tkeyAndValueType := byte(STOP)\n\tif size != 0 {\n\t\tkeyAndValueType, err = p.readByteDirect()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tkeyType, _ = p.getTType(tCompactType(keyAndValueType >> 4))\n\tvalueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf))\n\treturn\n}\n\nfunc (p *TCompactProtocol) ReadMapEnd() error { return nil }\n\n// Read a list header off the wire. If the list size is 0-14, the size will\n// be packed into the element type header. If it's a longer list, the 4 MSB\n// of the element type header will be 0xF, and a varint will follow with the\n// true size.\nfunc (p *TCompactProtocol) ReadListBegin() (elemType TType, size int, err error) {\n\tsize_and_type, err := p.readByteDirect()\n\tif err != nil {\n\t\treturn\n\t}\n\tsize = int((size_and_type >> 4) & 0x0f)\n\tif size == 15 {\n\t\tsize2, e := p.readVarint32()\n\t\tif e != nil {\n\t\t\terr = NewTProtocolException(e)\n\t\t\treturn\n\t\t}\n\t\tif size2 < 0 {\n\t\t\terr = invalidDataLength\n\t\t\treturn\n\t\t}\n\t\tsize = int(size2)\n\t}\n\telemType, e := p.getTType(tCompactType(size_and_type))\n\tif e != nil {\n\t\terr = NewTProtocolException(e)\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (p *TCompactProtocol) ReadListEnd() error { return nil }\n\n// Read a set header off the wire. If the set size is 0-14, the size will\n// be packed into the element type header. If it's a longer set, the 4 MSB\n// of the element type header will be 0xF, and a varint will follow with the\n// true size.\nfunc (p *TCompactProtocol) ReadSetBegin() (elemType TType, size int, err error) {\n\treturn p.ReadListBegin()\n}\n\nfunc (p *TCompactProtocol) ReadSetEnd() error { return nil }\n\n// Read a boolean off the wire. If this is a boolean field, the value should\n// already have been read during readFieldBegin, so we'll just consume the\n// pre-stored value. Otherwise, read a byte.\nfunc (p *TCompactProtocol) ReadBool() (value bool, err error) {\n\tif p.boolValueIsNotNull {\n\t\tp.boolValueIsNotNull = false\n\t\treturn p.boolValue, nil\n\t}\n\tv, err := p.readByteDirect()\n\treturn v == COMPACT_BOOLEAN_TRUE, err\n}\n\n// Read a single byte off the wire. Nothing interesting here.\nfunc (p *TCompactProtocol) ReadByte() (int8, error) {\n\tv, err := p.readByteDirect()\n\tif err != nil {\n\t\treturn 0, NewTProtocolException(err)\n\t}\n\treturn int8(v), err\n}\n\n// Read an i16 from the wire as a zigzag varint.\nfunc (p *TCompactProtocol) ReadI16() (value int16, err error) {\n\tv, err := p.ReadI32()\n\treturn int16(v), err\n}\n\n// Read an i32 from the wire as a zigzag varint.\nfunc (p *TCompactProtocol) ReadI32() (value int32, err error) {\n\tv, e := p.readVarint32()\n\tif e != nil {\n\t\treturn 0, NewTProtocolException(e)\n\t}\n\tvalue = p.zigzagToInt32(v)\n\treturn value, nil\n}\n\n// Read an i64 from the wire as a zigzag varint.\nfunc (p *TCompactProtocol) ReadI64() (value int64, err error) {\n\tv, e := p.readVarint64()\n\tif e != nil {\n\t\treturn 0, NewTProtocolException(e)\n\t}\n\tvalue = p.zigzagToInt64(v)\n\treturn value, nil\n}\n\n// No magic here - just read a double off the wire.\nfunc (p *TCompactProtocol) ReadDouble() (value float64, err error) {\n\tlongBits := p.buffer[0:8]\n\t_, e := io.ReadFull(p.trans, longBits)\n\tif e != nil {\n\t\treturn 0.0, NewTProtocolException(e)\n\t}\n\treturn math.Float64frombits(p.bytesToUint64(longBits)), nil\n}\n\n// Reads a []byte (via readBinary), and then UTF-8 decodes it.\nfunc (p *TCompactProtocol) ReadString() (value string, err error) {\n\tlength, e := p.readVarint32()\n\tif e != nil {\n\t\treturn \"\", NewTProtocolException(e)\n\t}\n\tif length < 0 {\n\t\treturn \"\", invalidDataLength\n\t}\n\tif uint64(length) > p.trans.RemainingBytes() {\n\t\treturn \"\", invalidDataLength\n\t}\n\n\tif length == 0 {\n\t\treturn \"\", nil\n\t}\n\tvar buf []byte\n\tif length <= int32(len(p.buffer)) {\n\t\tbuf = p.buffer[0:length]\n\t} else {\n\t\tbuf = make([]byte, length)\n\t}\n\t_, e = io.ReadFull(p.trans, buf)\n\treturn string(buf), NewTProtocolException(e)\n}\n\n// Read a []byte from the wire.\nfunc (p *TCompactProtocol) ReadBinary() (value []byte, err error) {\n\tlength, e := p.readVarint32()\n\tif e != nil {\n\t\treturn nil, NewTProtocolException(e)\n\t}\n\tif length == 0 {\n\t\treturn []byte{}, nil\n\t}\n\tif length < 0 {\n\t\treturn nil, invalidDataLength\n\t}\n\tif uint64(length) > p.trans.RemainingBytes() {\n\t\treturn nil, invalidDataLength\n\t}\n\n\tbuf := make([]byte, length)\n\t_, e = io.ReadFull(p.trans, buf)\n\treturn buf, NewTProtocolException(e)\n}\n\nfunc (p *TCompactProtocol) Flush() (err error) {\n\treturn NewTProtocolException(p.trans.Flush())\n}\n\nfunc (p *TCompactProtocol) Skip(fieldType TType) (err error) {\n\treturn SkipDefaultDepth(p, fieldType)\n}\n\nfunc (p *TCompactProtocol) Transport() TTransport {\n\treturn p.origTransport\n}\n\n//\n// Internal writing methods\n//\n\n// Abstract method for writing the start of lists and sets. List and sets on\n// the wire differ only by the type indicator.\nfunc (p *TCompactProtocol) writeCollectionBegin(elemType TType, size int) (int, error) {\n\tif size <= 14 {\n\t\treturn 1, p.writeByteDirect(byte(int32(size<<4) | int32(p.getCompactType(elemType))))\n\t}\n\terr := p.writeByteDirect(0xf0 | byte(p.getCompactType(elemType)))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tm, err := p.writeVarint32(int32(size))\n\treturn 1 + m, err\n}\n\n// Write an i32 as a varint. Results in 1-5 bytes on the wire.\n// TODO(pomack): make a permanent buffer like writeVarint64?\nfunc (p *TCompactProtocol) writeVarint32(n int32) (int, error) {\n\ti32buf := p.buffer[0:5]\n\tidx := 0\n\tfor {\n\t\tif (n & ^0x7F) == 0 {\n\t\t\ti32buf[idx] = byte(n)\n\t\t\tidx++\n\t\t\t// p.writeByteDirect(byte(n));\n\t\t\tbreak\n\t\t\t// return;\n\t\t} else {\n\t\t\ti32buf[idx] = byte((n & 0x7F) | 0x80)\n\t\t\tidx++\n\t\t\t// p.writeByteDirect(byte(((n & 0x7F) | 0x80)));\n\t\t\tu := uint32(n)\n\t\t\tn = int32(u >> 7)\n\t\t}\n\t}\n\treturn p.trans.Write(i32buf[0:idx])\n}\n\n// Write an i64 as a varint. Results in 1-10 bytes on the wire.\nfunc (p *TCompactProtocol) writeVarint64(n int64) (int, error) {\n\tvarint64out := p.buffer[0:10]\n\tidx := 0\n\tfor {\n\t\tif (n & ^0x7F) == 0 {\n\t\t\tvarint64out[idx] = byte(n)\n\t\t\tidx++\n\t\t\tbreak\n\t\t} else {\n\t\t\tvarint64out[idx] = byte((n & 0x7F) | 0x80)\n\t\t\tidx++\n\t\t\tu := uint64(n)\n\t\t\tn = int64(u >> 7)\n\t\t}\n\t}\n\treturn p.trans.Write(varint64out[0:idx])\n}\n\n// Convert l into a zigzag long. This allows negative numbers to be\n// represented compactly as a varint.\nfunc (p *TCompactProtocol) int64ToZigzag(l int64) int64 {\n\treturn (l << 1) ^ (l >> 63)\n}\n\n// Convert l into a zigzag long. This allows negative numbers to be\n// represented compactly as a varint.\nfunc (p *TCompactProtocol) int32ToZigzag(n int32) int32 {\n\treturn (n << 1) ^ (n >> 31)\n}\n\nfunc (p *TCompactProtocol) fixedUint64ToBytes(n uint64, buf []byte) {\n\tbinary.LittleEndian.PutUint64(buf, n)\n}\n\nfunc (p *TCompactProtocol) fixedInt64ToBytes(n int64, buf []byte) {\n\tbinary.LittleEndian.PutUint64(buf, uint64(n))\n}\n\n// Writes a byte without any possibility of all that field header nonsense.\n// Used internally by other writing methods that know they need to write a byte.\nfunc (p *TCompactProtocol) writeByteDirect(b byte) error {\n\treturn p.trans.WriteByte(b)\n}\n\n// Writes a byte without any possibility of all that field header nonsense.\nfunc (p *TCompactProtocol) writeIntAsByteDirect(n int) (int, error) {\n\treturn 1, p.writeByteDirect(byte(n))\n}\n\n//\n// Internal reading methods\n//\n\n// Read an i32 from the wire as a varint. The MSB of each byte is set\n// if there is another byte to follow. This can read up to 5 bytes.\nfunc (p *TCompactProtocol) readVarint32() (int32, error) {\n\t// if the wire contains the right stuff, this will just truncate the i64 we\n\t// read and get us the right sign.\n\tv, err := p.readVarint64()\n\treturn int32(v), err\n}\n\n// Read an i64 from the wire as a proper varint. The MSB of each byte is set\n// if there is another byte to follow. This can read up to 10 bytes.\nfunc (p *TCompactProtocol) readVarint64() (int64, error) {\n\tshift := uint(0)\n\tresult := int64(0)\n\tfor {\n\t\tb, err := p.readByteDirect()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tresult |= int64(b&0x7f) << shift\n\t\tif (b & 0x80) != 0x80 {\n\t\t\tbreak\n\t\t}\n\t\tshift += 7\n\t}\n\treturn result, nil\n}\n\n// Read a byte, unlike ReadByte that reads Thrift-byte that is i8.\nfunc (p *TCompactProtocol) readByteDirect() (byte, error) {\n\treturn p.trans.ReadByte()\n}\n\n//\n// encoding helpers\n//\n\n// Convert from zigzag int to int.\nfunc (p *TCompactProtocol) zigzagToInt32(n int32) int32 {\n\tu := uint32(n)\n\treturn int32(u>>1) ^ -(n & 1)\n}\n\n// Convert from zigzag long to long.\nfunc (p *TCompactProtocol) zigzagToInt64(n int64) int64 {\n\tu := uint64(n)\n\treturn int64(u>>1) ^ -(n & 1)\n}\n\n// Note that it's important that the mask bytes are long literals,\n// otherwise they'll default to ints, and when you shift an int left 56 bits,\n// you just get a messed up int.\nfunc (p *TCompactProtocol) bytesToInt64(b []byte) int64 {\n\treturn int64(binary.LittleEndian.Uint64(b))\n}\n\n// Note that it's important that the mask bytes are long literals,\n// otherwise they'll default to ints, and when you shift an int left 56 bits,\n// you just get a messed up int.\nfunc (p *TCompactProtocol) bytesToUint64(b []byte) uint64 {\n\treturn binary.LittleEndian.Uint64(b)\n}\n\n//\n// type testing and converting\n//\n\nfunc (p *TCompactProtocol) isBoolType(b byte) bool {\n\treturn (b&0x0f) == COMPACT_BOOLEAN_TRUE || (b&0x0f) == COMPACT_BOOLEAN_FALSE\n}\n\n// Given a tCompactType constant, convert it to its corresponding\n// TType value.\nfunc (p *TCompactProtocol) getTType(t tCompactType) (TType, error) {\n\tswitch byte(t) & 0x0f {\n\tcase STOP:\n\t\treturn STOP, nil\n\tcase COMPACT_BOOLEAN_FALSE, COMPACT_BOOLEAN_TRUE:\n\t\treturn BOOL, nil\n\tcase COMPACT_BYTE:\n\t\treturn BYTE, nil\n\tcase COMPACT_I16:\n\t\treturn I16, nil\n\tcase COMPACT_I32:\n\t\treturn I32, nil\n\tcase COMPACT_I64:\n\t\treturn I64, nil\n\tcase COMPACT_DOUBLE:\n\t\treturn DOUBLE, nil\n\tcase COMPACT_BINARY:\n\t\treturn STRING, nil\n\tcase COMPACT_LIST:\n\t\treturn LIST, nil\n\tcase COMPACT_SET:\n\t\treturn SET, nil\n\tcase COMPACT_MAP:\n\t\treturn MAP, nil\n\tcase COMPACT_STRUCT:\n\t\treturn STRUCT, nil\n\t}\n\treturn STOP, TException(fmt.Errorf(\"don't know what type: %d\", t&0x0f))\n}\n\n// Given a TType value, find the appropriate TCompactProtocol.Types constant.\nfunc (p *TCompactProtocol) getCompactType(t TType) tCompactType {\n\treturn ttypeToCompactType[t]\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/exception.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"errors\"\n)\n\n// Generic Thrift exception\ntype TException interface {\n\terror\n}\n\n// Prepends additional information to an error without losing the Thrift exception interface\nfunc PrependError(prepend string, err error) error {\n\tif t, ok := err.(TTransportException); ok {\n\t\treturn NewTTransportException(t.TypeId(), prepend+t.Error())\n\t}\n\tif t, ok := err.(TProtocolException); ok {\n\t\treturn NewTProtocolExceptionWithType(t.TypeId(), errors.New(prepend+err.Error()))\n\t}\n\tif t, ok := err.(TApplicationException); ok {\n\t\treturn NewTApplicationException(t.TypeId(), prepend+t.Error())\n\t}\n\n\treturn errors.New(prepend + err.Error())\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"bytes\"\n)\n\n// Memory buffer-based implementation of the TTransport interface.\ntype TMemoryBuffer struct {\n\t*bytes.Buffer\n\tsize int\n}\n\ntype TMemoryBufferTransportFactory struct {\n\tsize int\n}\n\nfunc (p *TMemoryBufferTransportFactory) GetTransport(trans TTransport) TTransport {\n\tif trans != nil {\n\t\tt, ok := trans.(*TMemoryBuffer)\n\t\tif ok && t.size > 0 {\n\t\t\treturn NewTMemoryBufferLen(t.size)\n\t\t}\n\t}\n\treturn NewTMemoryBufferLen(p.size)\n}\n\nfunc NewTMemoryBufferTransportFactory(size int) *TMemoryBufferTransportFactory {\n\treturn &TMemoryBufferTransportFactory{size: size}\n}\n\nfunc NewTMemoryBuffer() *TMemoryBuffer {\n\treturn &TMemoryBuffer{Buffer: &bytes.Buffer{}, size: 0}\n}\n\nfunc NewTMemoryBufferLen(size int) *TMemoryBuffer {\n\tbuf := make([]byte, 0, size)\n\treturn &TMemoryBuffer{Buffer: bytes.NewBuffer(buf), size: size}\n}\n\nfunc (p *TMemoryBuffer) IsOpen() bool {\n\treturn true\n}\n\nfunc (p *TMemoryBuffer) Open() error {\n\treturn nil\n}\n\nfunc (p *TMemoryBuffer) Close() error {\n\tp.Buffer.Reset()\n\treturn nil\n}\n\n// Flushing a memory buffer is a no-op\nfunc (p *TMemoryBuffer) Flush() error {\n\treturn nil\n}\n\nfunc (p *TMemoryBuffer) RemainingBytes() (num_bytes uint64) {\n\treturn uint64(p.Buffer.Len())\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\n// Message type constants in the Thrift protocol.\ntype TMessageType int32\n\nconst (\n\tINVALID_TMESSAGE_TYPE TMessageType = 0\n\tCALL                  TMessageType = 1\n\tREPLY                 TMessageType = 2\n\tEXCEPTION             TMessageType = 3\n\tONEWAY                TMessageType = 4\n)\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/numeric.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"math\"\n\t\"strconv\"\n)\n\ntype Numeric interface {\n\tInt64() int64\n\tInt32() int32\n\tInt16() int16\n\tByte() byte\n\tInt() int\n\tFloat64() float64\n\tFloat32() float32\n\tString() string\n\tisNull() bool\n}\n\ntype numeric struct {\n\tiValue int64\n\tdValue float64\n\tsValue string\n\tisNil  bool\n}\n\nvar (\n\tINFINITY          Numeric\n\tNEGATIVE_INFINITY Numeric\n\tNAN               Numeric\n\tZERO              Numeric\n\tNUMERIC_NULL      Numeric\n)\n\nfunc NewNumericFromDouble(dValue float64) Numeric {\n\tif math.IsInf(dValue, 1) {\n\t\treturn INFINITY\n\t}\n\tif math.IsInf(dValue, -1) {\n\t\treturn NEGATIVE_INFINITY\n\t}\n\tif math.IsNaN(dValue) {\n\t\treturn NAN\n\t}\n\tiValue := int64(dValue)\n\tsValue := strconv.FormatFloat(dValue, 'g', 10, 64)\n\tisNil := false\n\treturn &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil}\n}\n\nfunc NewNumericFromI64(iValue int64) Numeric {\n\tdValue := float64(iValue)\n\tsValue := string(iValue)\n\tisNil := false\n\treturn &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil}\n}\n\nfunc NewNumericFromI32(iValue int32) Numeric {\n\tdValue := float64(iValue)\n\tsValue := string(iValue)\n\tisNil := false\n\treturn &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil}\n}\n\nfunc NewNumericFromString(sValue string) Numeric {\n\tif sValue == INFINITY.String() {\n\t\treturn INFINITY\n\t}\n\tif sValue == NEGATIVE_INFINITY.String() {\n\t\treturn NEGATIVE_INFINITY\n\t}\n\tif sValue == NAN.String() {\n\t\treturn NAN\n\t}\n\tiValue, _ := strconv.ParseInt(sValue, 10, 64)\n\tdValue, _ := strconv.ParseFloat(sValue, 64)\n\tisNil := len(sValue) == 0\n\treturn &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil}\n}\n\nfunc NewNumericFromJSONString(sValue string, isNull bool) Numeric {\n\tif isNull {\n\t\treturn NewNullNumeric()\n\t}\n\tif sValue == JSON_INFINITY {\n\t\treturn INFINITY\n\t}\n\tif sValue == JSON_NEGATIVE_INFINITY {\n\t\treturn NEGATIVE_INFINITY\n\t}\n\tif sValue == JSON_NAN {\n\t\treturn NAN\n\t}\n\tiValue, _ := strconv.ParseInt(sValue, 10, 64)\n\tdValue, _ := strconv.ParseFloat(sValue, 64)\n\treturn &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNull}\n}\n\nfunc NewNullNumeric() Numeric {\n\treturn &numeric{iValue: 0, dValue: 0.0, sValue: \"\", isNil: true}\n}\n\nfunc (p *numeric) Int64() int64 {\n\treturn p.iValue\n}\n\nfunc (p *numeric) Int32() int32 {\n\treturn int32(p.iValue)\n}\n\nfunc (p *numeric) Int16() int16 {\n\treturn int16(p.iValue)\n}\n\nfunc (p *numeric) Byte() byte {\n\treturn byte(p.iValue)\n}\n\nfunc (p *numeric) Int() int {\n\treturn int(p.iValue)\n}\n\nfunc (p *numeric) Float64() float64 {\n\treturn p.dValue\n}\n\nfunc (p *numeric) Float32() float32 {\n\treturn float32(p.dValue)\n}\n\nfunc (p *numeric) String() string {\n\treturn p.sValue\n}\n\nfunc (p *numeric) isNull() bool {\n\treturn p.isNil\n}\n\nfunc init() {\n\tINFINITY = &numeric{iValue: 0, dValue: math.Inf(1), sValue: \"Infinity\", isNil: false}\n\tNEGATIVE_INFINITY = &numeric{iValue: 0, dValue: math.Inf(-1), sValue: \"-Infinity\", isNil: false}\n\tNAN = &numeric{iValue: 0, dValue: math.NaN(), sValue: \"NaN\", isNil: false}\n\tZERO = &numeric{iValue: 0, dValue: 0, sValue: \"0\", isNil: false}\n\tNUMERIC_NULL = &numeric{iValue: 0, dValue: 0, sValue: \"0\", isNil: true}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/processor.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\n// A processor is a generic object which operates upon an input stream and\n// writes to some output stream.\ntype TProcessor interface {\n\tProcess(in, out TProtocol) (bool, TException)\n}\n\ntype TProcessorFunction interface {\n\tProcess(seqId int32, in, out TProtocol) (bool, TException)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/protocol.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"errors\"\n)\n\nconst (\n\tVERSION_MASK = 0xffff0000\n\tVERSION_1    = 0x80010000\n)\n\ntype TProtocol interface {\n\tWriteMessageBegin(name string, typeId TMessageType, seqid int32) error\n\tWriteMessageEnd() error\n\tWriteStructBegin(name string) error\n\tWriteStructEnd() error\n\tWriteFieldBegin(name string, typeId TType, id int16) error\n\tWriteFieldEnd() error\n\tWriteFieldStop() error\n\tWriteMapBegin(keyType TType, valueType TType, size int) error\n\tWriteMapEnd() error\n\tWriteListBegin(elemType TType, size int) error\n\tWriteListEnd() error\n\tWriteSetBegin(elemType TType, size int) error\n\tWriteSetEnd() error\n\tWriteBool(value bool) error\n\tWriteByte(value int8) error\n\tWriteI16(value int16) error\n\tWriteI32(value int32) error\n\tWriteI64(value int64) error\n\tWriteDouble(value float64) error\n\tWriteString(value string) error\n\tWriteBinary(value []byte) error\n\n\tReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error)\n\tReadMessageEnd() error\n\tReadStructBegin() (name string, err error)\n\tReadStructEnd() error\n\tReadFieldBegin() (name string, typeId TType, id int16, err error)\n\tReadFieldEnd() error\n\tReadMapBegin() (keyType TType, valueType TType, size int, err error)\n\tReadMapEnd() error\n\tReadListBegin() (elemType TType, size int, err error)\n\tReadListEnd() error\n\tReadSetBegin() (elemType TType, size int, err error)\n\tReadSetEnd() error\n\tReadBool() (value bool, err error)\n\tReadByte() (value int8, err error)\n\tReadI16() (value int16, err error)\n\tReadI32() (value int32, err error)\n\tReadI64() (value int64, err error)\n\tReadDouble() (value float64, err error)\n\tReadString() (value string, err error)\n\tReadBinary() (value []byte, err error)\n\n\tSkip(fieldType TType) (err error)\n\tFlush() (err error)\n\n\tTransport() TTransport\n}\n\n// The maximum recursive depth the skip() function will traverse\nconst DEFAULT_RECURSION_DEPTH = 64\n\n// Skips over the next data element from the provided input TProtocol object.\nfunc SkipDefaultDepth(prot TProtocol, typeId TType) (err error) {\n\treturn Skip(prot, typeId, DEFAULT_RECURSION_DEPTH)\n}\n\n// Skips over the next data element from the provided input TProtocol object.\nfunc Skip(self TProtocol, fieldType TType, maxDepth int) (err error) {\n\t\n    if maxDepth <= 0 {\n\t\treturn NewTProtocolExceptionWithType( DEPTH_LIMIT, errors.New(\"Depth limit exceeded\"))\n\t}\n\n\tswitch fieldType {\n\tcase STOP:\n\t\treturn\n\tcase BOOL:\n\t\t_, err = self.ReadBool()\n\t\treturn\n\tcase BYTE:\n\t\t_, err = self.ReadByte()\n\t\treturn\n\tcase I16:\n\t\t_, err = self.ReadI16()\n\t\treturn\n\tcase I32:\n\t\t_, err = self.ReadI32()\n\t\treturn\n\tcase I64:\n\t\t_, err = self.ReadI64()\n\t\treturn\n\tcase DOUBLE:\n\t\t_, err = self.ReadDouble()\n\t\treturn\n\tcase STRING:\n\t\t_, err = self.ReadString()\n\t\treturn\n\tcase STRUCT:\n\t\tif _, err = self.ReadStructBegin(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor {\n\t\t\t_, typeId, _, _ := self.ReadFieldBegin()\n\t\t\tif typeId == STOP {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\terr := Skip(self, typeId, maxDepth-1)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tself.ReadFieldEnd()\n\t\t}\n\t\treturn self.ReadStructEnd()\n\tcase MAP:\n\t\tkeyType, valueType, size, err := self.ReadMapBegin()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor i := 0; i < size; i++ {\n\t\t\terr := Skip(self, keyType, maxDepth-1)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tself.Skip(valueType)\n\t\t}\n\t\treturn self.ReadMapEnd()\n\tcase SET:\n\t\telemType, size, err := self.ReadSetBegin()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor i := 0; i < size; i++ {\n\t\t\terr := Skip(self, elemType, maxDepth-1)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn self.ReadSetEnd()\n\tcase LIST:\n\t\telemType, size, err := self.ReadListBegin()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor i := 0; i < size; i++ {\n\t\t\terr := Skip(self, elemType, maxDepth-1)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn self.ReadListEnd()\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"encoding/base64\"\n)\n\n// Thrift Protocol exception\ntype TProtocolException interface {\n\tTException\n\tTypeId() int\n}\n\nconst (\n\tUNKNOWN_PROTOCOL_EXCEPTION = 0\n\tINVALID_DATA               = 1\n\tNEGATIVE_SIZE              = 2\n\tSIZE_LIMIT                 = 3\n\tBAD_VERSION                = 4\n\tNOT_IMPLEMENTED            = 5\n\tDEPTH_LIMIT                = 6\n)\n\ntype tProtocolException struct {\n\ttypeId  int\n\tmessage string\n}\n\nfunc (p *tProtocolException) TypeId() int {\n\treturn p.typeId\n}\n\nfunc (p *tProtocolException) String() string {\n\treturn p.message\n}\n\nfunc (p *tProtocolException) Error() string {\n\treturn p.message\n}\n\nfunc NewTProtocolException(err error) TProtocolException {\n\tif err == nil {\n\t\treturn nil\n\t}\n\tif e,ok := err.(TProtocolException); ok {\n\t\treturn e\n\t}\n\tif _, ok := err.(base64.CorruptInputError); ok {\n\t\treturn &tProtocolException{INVALID_DATA, err.Error()}\n\t}\n\treturn &tProtocolException{UNKNOWN_PROTOCOL_EXCEPTION, err.Error()}\n}\n\nfunc NewTProtocolExceptionWithType(errType int, err error) TProtocolException {\n\tif err == nil {\n\t\treturn nil\n\t}\n\treturn &tProtocolException{errType, err.Error()}\n}\n\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\n// Factory interface for constructing protocol instances.\ntype TProtocolFactory interface {\n\tGetProtocol(trans TTransport) TProtocol\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport \"io\"\n\ntype RichTransport struct {\n\tTTransport\n}\n\n// Wraps Transport to provide TRichTransport interface\nfunc NewTRichTransport(trans TTransport) *RichTransport {\n\treturn &RichTransport{trans}\n}\n\nfunc (r *RichTransport) ReadByte() (c byte, err error) {\n\treturn readByte(r.TTransport)\n}\n\nfunc (r *RichTransport) WriteByte(c byte) error {\n\treturn writeByte(r.TTransport, c)\n}\n\nfunc (r *RichTransport) WriteString(s string) (n int, err error) {\n\treturn r.Write([]byte(s))\n}\n\nfunc (r *RichTransport) RemainingBytes() (num_bytes uint64) {\n\treturn r.TTransport.RemainingBytes()\n}\n\nfunc readByte(r io.Reader) (c byte, err error) {\n\tv := [1]byte{0}\n\tn, err := r.Read(v[0:1])\n\tif n > 0 && (err == nil || err == io.EOF) {\n\t\treturn v[0], nil\n\t}\n\tif n > 0 && err != nil {\n\t\treturn v[0], err\n\t}\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn v[0], nil\n}\n\nfunc writeByte(w io.Writer, c byte) error {\n\tv := [1]byte{c}\n\t_, err := w.Write(v[0:1])\n\treturn err\n}\n\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/serializer.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\ntype TSerializer struct {\n\tTransport *TMemoryBuffer\n\tProtocol  TProtocol\n}\n\ntype TStruct interface {\n\tWrite(p TProtocol) error\n\tRead(p TProtocol) error\n}\n\nfunc NewTSerializer() *TSerializer {\n\ttransport := NewTMemoryBufferLen(1024)\n\tprotocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport)\n\n\treturn &TSerializer{\n\t\ttransport,\n\t\tprotocol}\n}\n\nfunc (t *TSerializer) WriteString(msg TStruct) (s string, err error) {\n\tt.Transport.Reset()\n\n\tif err = msg.Write(t.Protocol); err != nil {\n\t\treturn\n\t}\n\n\tif err = t.Protocol.Flush(); err != nil {\n\t\treturn\n\t}\n\tif err = t.Transport.Flush(); err != nil {\n\t\treturn\n\t}\n\n\treturn t.Transport.String(), nil\n}\n\nfunc (t *TSerializer) Write(msg TStruct) (b []byte, err error) {\n\tt.Transport.Reset()\n\n\tif err = msg.Write(t.Protocol); err != nil {\n\t\treturn\n\t}\n\n\tif err = t.Protocol.Flush(); err != nil {\n\t\treturn\n\t}\n\n\tif err = t.Transport.Flush(); err != nil {\n\t\treturn\n\t}\n\n\tb = append(b, t.Transport.Bytes()...)\n\treturn\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"strconv\"\n)\n\ntype _ParseContext int\n\nconst (\n\t_CONTEXT_IN_TOPLEVEL          _ParseContext = 1\n\t_CONTEXT_IN_LIST_FIRST        _ParseContext = 2\n\t_CONTEXT_IN_LIST              _ParseContext = 3\n\t_CONTEXT_IN_OBJECT_FIRST      _ParseContext = 4\n\t_CONTEXT_IN_OBJECT_NEXT_KEY   _ParseContext = 5\n\t_CONTEXT_IN_OBJECT_NEXT_VALUE _ParseContext = 6\n)\n\nfunc (p _ParseContext) String() string {\n\tswitch p {\n\tcase _CONTEXT_IN_TOPLEVEL:\n\t\treturn \"TOPLEVEL\"\n\tcase _CONTEXT_IN_LIST_FIRST:\n\t\treturn \"LIST-FIRST\"\n\tcase _CONTEXT_IN_LIST:\n\t\treturn \"LIST\"\n\tcase _CONTEXT_IN_OBJECT_FIRST:\n\t\treturn \"OBJECT-FIRST\"\n\tcase _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\treturn \"OBJECT-NEXT-KEY\"\n\tcase _CONTEXT_IN_OBJECT_NEXT_VALUE:\n\t\treturn \"OBJECT-NEXT-VALUE\"\n\t}\n\treturn \"UNKNOWN-PARSE-CONTEXT\"\n}\n\n// JSON protocol implementation for thrift.\n//\n// This protocol produces/consumes a simple output format\n// suitable for parsing by scripting languages.  It should not be\n// confused with the full-featured TJSONProtocol.\n//\ntype TSimpleJSONProtocol struct {\n\ttrans TTransport\n\n\tparseContextStack []int\n\tdumpContext       []int\n\n\twriter *bufio.Writer\n\treader *bufio.Reader\n}\n\n// Constructor\nfunc NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol {\n\tv := &TSimpleJSONProtocol{trans: t,\n\t\twriter: bufio.NewWriter(t),\n\t\treader: bufio.NewReader(t),\n\t}\n\tv.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL))\n\tv.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL))\n\treturn v\n}\n\n// Factory\ntype TSimpleJSONProtocolFactory struct{}\n\nfunc (p *TSimpleJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol {\n\treturn NewTSimpleJSONProtocol(trans)\n}\n\nfunc NewTSimpleJSONProtocolFactory() *TSimpleJSONProtocolFactory {\n\treturn &TSimpleJSONProtocolFactory{}\n}\n\nvar (\n\tJSON_COMMA                   []byte\n\tJSON_COLON                   []byte\n\tJSON_LBRACE                  []byte\n\tJSON_RBRACE                  []byte\n\tJSON_LBRACKET                []byte\n\tJSON_RBRACKET                []byte\n\tJSON_QUOTE                   byte\n\tJSON_QUOTE_BYTES             []byte\n\tJSON_NULL                    []byte\n\tJSON_TRUE                    []byte\n\tJSON_FALSE                   []byte\n\tJSON_INFINITY                string\n\tJSON_NEGATIVE_INFINITY       string\n\tJSON_NAN                     string\n\tJSON_INFINITY_BYTES          []byte\n\tJSON_NEGATIVE_INFINITY_BYTES []byte\n\tJSON_NAN_BYTES               []byte\n\tjson_nonbase_map_elem_bytes  []byte\n)\n\nfunc init() {\n\tJSON_COMMA = []byte{','}\n\tJSON_COLON = []byte{':'}\n\tJSON_LBRACE = []byte{'{'}\n\tJSON_RBRACE = []byte{'}'}\n\tJSON_LBRACKET = []byte{'['}\n\tJSON_RBRACKET = []byte{']'}\n\tJSON_QUOTE = '\"'\n\tJSON_QUOTE_BYTES = []byte{'\"'}\n\tJSON_NULL = []byte{'n', 'u', 'l', 'l'}\n\tJSON_TRUE = []byte{'t', 'r', 'u', 'e'}\n\tJSON_FALSE = []byte{'f', 'a', 'l', 's', 'e'}\n\tJSON_INFINITY = \"Infinity\"\n\tJSON_NEGATIVE_INFINITY = \"-Infinity\"\n\tJSON_NAN = \"NaN\"\n\tJSON_INFINITY_BYTES = []byte{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'}\n\tJSON_NEGATIVE_INFINITY_BYTES = []byte{'-', 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'}\n\tJSON_NAN_BYTES = []byte{'N', 'a', 'N'}\n\tjson_nonbase_map_elem_bytes = []byte{']', ',', '['}\n}\n\nfunc jsonQuote(s string) string {\n\tb, _ := json.Marshal(s)\n\ts1 := string(b)\n\treturn s1\n}\n\nfunc jsonUnquote(s string) (string, bool) {\n\ts1 := new(string)\n\terr := json.Unmarshal([]byte(s), s1)\n\treturn *s1, err == nil\n}\n\nfunc mismatch(expected, actual string) error {\n\treturn fmt.Errorf(\"Expected '%s' but found '%s' while parsing JSON.\", expected, actual)\n}\n\nfunc (p *TSimpleJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error {\n\tp.resetContextStack() // THRIFT-3735\n\tif e := p.OutputListBegin(); e != nil {\n\t\treturn e\n\t}\n\tif e := p.WriteString(name); e != nil {\n\t\treturn e\n\t}\n\tif e := p.WriteByte(int8(typeId)); e != nil {\n\t\treturn e\n\t}\n\tif e := p.WriteI32(seqId); e != nil {\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) WriteMessageEnd() error {\n\treturn p.OutputListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) WriteStructBegin(name string) error {\n\tif e := p.OutputObjectBegin(); e != nil {\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) WriteStructEnd() error {\n\treturn p.OutputObjectEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error {\n\tif e := p.WriteString(name); e != nil {\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) WriteFieldEnd() error {\n\t//return p.OutputListEnd()\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) WriteFieldStop() error { return nil }\n\nfunc (p *TSimpleJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error {\n\tif e := p.OutputListBegin(); e != nil {\n\t\treturn e\n\t}\n\tif e := p.WriteByte(int8(keyType)); e != nil {\n\t\treturn e\n\t}\n\tif e := p.WriteByte(int8(valueType)); e != nil {\n\t\treturn e\n\t}\n\treturn p.WriteI32(int32(size))\n}\n\nfunc (p *TSimpleJSONProtocol) WriteMapEnd() error {\n\treturn p.OutputListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) WriteListBegin(elemType TType, size int) error {\n\treturn p.OutputElemListBegin(elemType, size)\n}\n\nfunc (p *TSimpleJSONProtocol) WriteListEnd() error {\n\treturn p.OutputListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) WriteSetBegin(elemType TType, size int) error {\n\treturn p.OutputElemListBegin(elemType, size)\n}\n\nfunc (p *TSimpleJSONProtocol) WriteSetEnd() error {\n\treturn p.OutputListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) WriteBool(b bool) error {\n\treturn p.OutputBool(b)\n}\n\nfunc (p *TSimpleJSONProtocol) WriteByte(b int8) error {\n\treturn p.WriteI32(int32(b))\n}\n\nfunc (p *TSimpleJSONProtocol) WriteI16(v int16) error {\n\treturn p.WriteI32(int32(v))\n}\n\nfunc (p *TSimpleJSONProtocol) WriteI32(v int32) error {\n\treturn p.OutputI64(int64(v))\n}\n\nfunc (p *TSimpleJSONProtocol) WriteI64(v int64) error {\n\treturn p.OutputI64(int64(v))\n}\n\nfunc (p *TSimpleJSONProtocol) WriteDouble(v float64) error {\n\treturn p.OutputF64(v)\n}\n\nfunc (p *TSimpleJSONProtocol) WriteString(v string) error {\n\treturn p.OutputString(v)\n}\n\nfunc (p *TSimpleJSONProtocol) WriteBinary(v []byte) error {\n\t// JSON library only takes in a string,\n\t// not an arbitrary byte array, to ensure bytes are transmitted\n\t// efficiently we must convert this into a valid JSON string\n\t// therefore we use base64 encoding to avoid excessive escaping/quoting\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tif _, e := p.write(JSON_QUOTE_BYTES); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\twriter := base64.NewEncoder(base64.StdEncoding, p.writer)\n\tif _, e := writer.Write(v); e != nil {\n\t\tp.writer.Reset(p.trans) // THRIFT-3735\n\t\treturn NewTProtocolException(e)\n\t}\n\tif e := writer.Close(); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tif _, e := p.write(JSON_QUOTE_BYTES); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\treturn p.OutputPostValue()\n}\n\n// Reading methods.\nfunc (p *TSimpleJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) {\n\tp.resetContextStack() // THRIFT-3735\n\tif isNull, err := p.ParseListBegin(); isNull || err != nil {\n\t\treturn name, typeId, seqId, err\n\t}\n\tif name, err = p.ReadString(); err != nil {\n\t\treturn name, typeId, seqId, err\n\t}\n\tbTypeId, err := p.ReadByte()\n\ttypeId = TMessageType(bTypeId)\n\tif err != nil {\n\t\treturn name, typeId, seqId, err\n\t}\n\tif seqId, err = p.ReadI32(); err != nil {\n\t\treturn name, typeId, seqId, err\n\t}\n\treturn name, typeId, seqId, nil\n}\n\nfunc (p *TSimpleJSONProtocol) ReadMessageEnd() error {\n\treturn p.ParseListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadStructBegin() (name string, err error) {\n\t_, err = p.ParseObjectStart()\n\treturn \"\", err\n}\n\nfunc (p *TSimpleJSONProtocol) ReadStructEnd() error {\n\treturn p.ParseObjectEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadFieldBegin() (string, TType, int16, error) {\n\tif err := p.ParsePreValue(); err != nil {\n\t\treturn \"\", STOP, 0, err\n\t}\n\tb, _ := p.reader.Peek(1)\n\tif len(b) > 0 {\n\t\tswitch b[0] {\n\t\tcase JSON_RBRACE[0]:\n\t\t\treturn \"\", STOP, 0, nil\n\t\tcase JSON_QUOTE:\n\t\t\tp.reader.ReadByte()\n\t\t\tname, err := p.ParseStringBody()\n\t\t\t// simplejson is not meant to be read back into thrift\n\t\t\t// - see http://wiki.apache.org/thrift/ThriftUsageJava\n\t\t\t// - use JSON instead\n\t\t\tif err != nil {\n\t\t\t\treturn name, STOP, 0, err\n\t\t\t}\n\t\t\treturn name, STOP, -1, p.ParsePostValue()\n\t\t\t/*\n\t\t\t   if err = p.ParsePostValue(); err != nil {\n\t\t\t     return name, STOP, 0, err\n\t\t\t   }\n\t\t\t   if isNull, err := p.ParseListBegin(); isNull || err != nil {\n\t\t\t     return name, STOP, 0, err\n\t\t\t   }\n\t\t\t   bType, err := p.ReadByte()\n\t\t\t   thetype := TType(bType)\n\t\t\t   if err != nil {\n\t\t\t     return name, thetype, 0, err\n\t\t\t   }\n\t\t\t   id, err := p.ReadI16()\n\t\t\t   return name, thetype, id, err\n\t\t\t*/\n\t\t}\n\t\te := fmt.Errorf(\"Expected \\\"}\\\" or '\\\"', but found: '%s'\", string(b))\n\t\treturn \"\", STOP, 0, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t}\n\treturn \"\", STOP, 0, NewTProtocolException(io.EOF)\n}\n\nfunc (p *TSimpleJSONProtocol) ReadFieldEnd() error {\n\treturn nil\n\t//return p.ParseListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) {\n\tif isNull, e := p.ParseListBegin(); isNull || e != nil {\n\t\treturn VOID, VOID, 0, e\n\t}\n\n\t// read keyType\n\tbKeyType, e := p.ReadByte()\n\tkeyType = TType(bKeyType)\n\tif e != nil {\n\t\treturn keyType, valueType, size, e\n\t}\n\n\t// read valueType\n\tbValueType, e := p.ReadByte()\n\tvalueType = TType(bValueType)\n\tif e != nil {\n\t\treturn keyType, valueType, size, e\n\t}\n\n\t// read size\n\tiSize, err := p.ReadI64()\n\tsize = int(iSize)\n\treturn keyType, valueType, size, err\n}\n\nfunc (p *TSimpleJSONProtocol) ReadMapEnd() error {\n\treturn p.ParseListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadListBegin() (elemType TType, size int, e error) {\n\treturn p.ParseElemListBegin()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadListEnd() error {\n\treturn p.ParseListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) {\n\treturn p.ParseElemListBegin()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadSetEnd() error {\n\treturn p.ParseListEnd()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadBool() (bool, error) {\n\tvar value bool\n\n\tif err := p.ParsePreValue(); err != nil {\n\t\treturn value, err\n\t}\n\tf, _ := p.reader.Peek(1)\n\tif len(f) > 0 {\n\t\tswitch f[0] {\n\t\tcase JSON_TRUE[0]:\n\t\t\tb := make([]byte, len(JSON_TRUE))\n\t\t\t_, err := p.reader.Read(b)\n\t\t\tif err != nil {\n\t\t\t\treturn false, NewTProtocolException(err)\n\t\t\t}\n\t\t\tif string(b) == string(JSON_TRUE) {\n\t\t\t\tvalue = true\n\t\t\t} else {\n\t\t\t\te := fmt.Errorf(\"Expected \\\"true\\\" but found: %s\", string(b))\n\t\t\t\treturn value, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\tbreak\n\t\tcase JSON_FALSE[0]:\n\t\t\tb := make([]byte, len(JSON_FALSE))\n\t\t\t_, err := p.reader.Read(b)\n\t\t\tif err != nil {\n\t\t\t\treturn false, NewTProtocolException(err)\n\t\t\t}\n\t\t\tif string(b) == string(JSON_FALSE) {\n\t\t\t\tvalue = false\n\t\t\t} else {\n\t\t\t\te := fmt.Errorf(\"Expected \\\"false\\\" but found: %s\", string(b))\n\t\t\t\treturn value, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\tbreak\n\t\tcase JSON_NULL[0]:\n\t\t\tb := make([]byte, len(JSON_NULL))\n\t\t\t_, err := p.reader.Read(b)\n\t\t\tif err != nil {\n\t\t\t\treturn false, NewTProtocolException(err)\n\t\t\t}\n\t\t\tif string(b) == string(JSON_NULL) {\n\t\t\t\tvalue = false\n\t\t\t} else {\n\t\t\t\te := fmt.Errorf(\"Expected \\\"null\\\" but found: %s\", string(b))\n\t\t\t\treturn value, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\tdefault:\n\t\t\te := fmt.Errorf(\"Expected \\\"true\\\", \\\"false\\\", or \\\"null\\\" but found: %s\", string(f))\n\t\t\treturn value, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t}\n\t}\n\treturn value, p.ParsePostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadByte() (int8, error) {\n\tv, err := p.ReadI64()\n\treturn int8(v), err\n}\n\nfunc (p *TSimpleJSONProtocol) ReadI16() (int16, error) {\n\tv, err := p.ReadI64()\n\treturn int16(v), err\n}\n\nfunc (p *TSimpleJSONProtocol) ReadI32() (int32, error) {\n\tv, err := p.ReadI64()\n\treturn int32(v), err\n}\n\nfunc (p *TSimpleJSONProtocol) ReadI64() (int64, error) {\n\tv, _, err := p.ParseI64()\n\treturn v, err\n}\n\nfunc (p *TSimpleJSONProtocol) ReadDouble() (float64, error) {\n\tv, _, err := p.ParseF64()\n\treturn v, err\n}\n\nfunc (p *TSimpleJSONProtocol) ReadString() (string, error) {\n\tvar v string\n\tif err := p.ParsePreValue(); err != nil {\n\t\treturn v, err\n\t}\n\tf, _ := p.reader.Peek(1)\n\tif len(f) > 0 && f[0] == JSON_QUOTE {\n\t\tp.reader.ReadByte()\n\t\tvalue, err := p.ParseStringBody()\n\t\tv = value\n\t\tif err != nil {\n\t\t\treturn v, err\n\t\t}\n\t} else if len(f) > 0 && f[0] == JSON_NULL[0] {\n\t\tb := make([]byte, len(JSON_NULL))\n\t\t_, err := p.reader.Read(b)\n\t\tif err != nil {\n\t\t\treturn v, NewTProtocolException(err)\n\t\t}\n\t\tif string(b) != string(JSON_NULL) {\n\t\t\te := fmt.Errorf(\"Expected a JSON string, found unquoted data started with %s\", string(b))\n\t\t\treturn v, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t}\n\t} else {\n\t\te := fmt.Errorf(\"Expected a JSON string, found unquoted data started with %s\", string(f))\n\t\treturn v, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t}\n\treturn v, p.ParsePostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) ReadBinary() ([]byte, error) {\n\tvar v []byte\n\tif err := p.ParsePreValue(); err != nil {\n\t\treturn nil, err\n\t}\n\tf, _ := p.reader.Peek(1)\n\tif len(f) > 0 && f[0] == JSON_QUOTE {\n\t\tp.reader.ReadByte()\n\t\tvalue, err := p.ParseBase64EncodedBody()\n\t\tv = value\n\t\tif err != nil {\n\t\t\treturn v, err\n\t\t}\n\t} else if len(f) > 0 && f[0] == JSON_NULL[0] {\n\t\tb := make([]byte, len(JSON_NULL))\n\t\t_, err := p.reader.Read(b)\n\t\tif err != nil {\n\t\t\treturn v, NewTProtocolException(err)\n\t\t}\n\t\tif string(b) != string(JSON_NULL) {\n\t\t\te := fmt.Errorf(\"Expected a JSON string, found unquoted data started with %s\", string(b))\n\t\t\treturn v, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t}\n\t} else {\n\t\te := fmt.Errorf(\"Expected a JSON string, found unquoted data started with %s\", string(f))\n\t\treturn v, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t}\n\n\treturn v, p.ParsePostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) Flush() (err error) {\n\treturn NewTProtocolException(p.writer.Flush())\n}\n\nfunc (p *TSimpleJSONProtocol) Skip(fieldType TType) (err error) {\n\treturn SkipDefaultDepth(p, fieldType)\n}\n\nfunc (p *TSimpleJSONProtocol) Transport() TTransport {\n\treturn p.trans\n}\n\nfunc (p *TSimpleJSONProtocol) OutputPreValue() error {\n\tcxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1])\n\tswitch cxt {\n\tcase _CONTEXT_IN_LIST, _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\tif _, e := p.write(JSON_COMMA); e != nil {\n\t\t\treturn NewTProtocolException(e)\n\t\t}\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_NEXT_VALUE:\n\t\tif _, e := p.write(JSON_COLON); e != nil {\n\t\t\treturn NewTProtocolException(e)\n\t\t}\n\t\tbreak\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) OutputPostValue() error {\n\tcxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1])\n\tswitch cxt {\n\tcase _CONTEXT_IN_LIST_FIRST:\n\t\tp.dumpContext = p.dumpContext[:len(p.dumpContext)-1]\n\t\tp.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST))\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_FIRST:\n\t\tp.dumpContext = p.dumpContext[:len(p.dumpContext)-1]\n\t\tp.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE))\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\tp.dumpContext = p.dumpContext[:len(p.dumpContext)-1]\n\t\tp.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE))\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_NEXT_VALUE:\n\t\tp.dumpContext = p.dumpContext[:len(p.dumpContext)-1]\n\t\tp.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_KEY))\n\t\tbreak\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) OutputBool(value bool) error {\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tvar v string\n\tif value {\n\t\tv = string(JSON_TRUE)\n\t} else {\n\t\tv = string(JSON_FALSE)\n\t}\n\tswitch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) {\n\tcase _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\tv = jsonQuote(v)\n\tdefault:\n\t}\n\tif e := p.OutputStringData(v); e != nil {\n\t\treturn e\n\t}\n\treturn p.OutputPostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) OutputNull() error {\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tif _, e := p.write(JSON_NULL); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\treturn p.OutputPostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) OutputF64(value float64) error {\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tvar v string\n\tif math.IsNaN(value) {\n\t\tv = string(JSON_QUOTE) + JSON_NAN + string(JSON_QUOTE)\n\t} else if math.IsInf(value, 1) {\n\t\tv = string(JSON_QUOTE) + JSON_INFINITY + string(JSON_QUOTE)\n\t} else if math.IsInf(value, -1) {\n\t\tv = string(JSON_QUOTE) + JSON_NEGATIVE_INFINITY + string(JSON_QUOTE)\n\t} else {\n\t\tv = strconv.FormatFloat(value, 'g', -1, 64)\n\t\tswitch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) {\n\t\tcase _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\t\tv = string(JSON_QUOTE) + v + string(JSON_QUOTE)\n\t\tdefault:\n\t\t}\n\t}\n\tif e := p.OutputStringData(v); e != nil {\n\t\treturn e\n\t}\n\treturn p.OutputPostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) OutputI64(value int64) error {\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tv := strconv.FormatInt(value, 10)\n\tswitch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) {\n\tcase _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\tv = jsonQuote(v)\n\tdefault:\n\t}\n\tif e := p.OutputStringData(v); e != nil {\n\t\treturn e\n\t}\n\treturn p.OutputPostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) OutputString(s string) error {\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tif e := p.OutputStringData(jsonQuote(s)); e != nil {\n\t\treturn e\n\t}\n\treturn p.OutputPostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) OutputStringData(s string) error {\n\t_, e := p.write([]byte(s))\n\treturn NewTProtocolException(e)\n}\n\nfunc (p *TSimpleJSONProtocol) OutputObjectBegin() error {\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tif _, e := p.write(JSON_LBRACE); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tp.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_FIRST))\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) OutputObjectEnd() error {\n\tif _, e := p.write(JSON_RBRACE); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tp.dumpContext = p.dumpContext[:len(p.dumpContext)-1]\n\tif e := p.OutputPostValue(); e != nil {\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) OutputListBegin() error {\n\tif e := p.OutputPreValue(); e != nil {\n\t\treturn e\n\t}\n\tif _, e := p.write(JSON_LBRACKET); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tp.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST_FIRST))\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) OutputListEnd() error {\n\tif _, e := p.write(JSON_RBRACKET); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tp.dumpContext = p.dumpContext[:len(p.dumpContext)-1]\n\tif e := p.OutputPostValue(); e != nil {\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) OutputElemListBegin(elemType TType, size int) error {\n\tif e := p.OutputListBegin(); e != nil {\n\t\treturn e\n\t}\n\tif e := p.WriteByte(int8(elemType)); e != nil {\n\t\treturn e\n\t}\n\tif e := p.WriteI64(int64(size)); e != nil {\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) ParsePreValue() error {\n\tif e := p.readNonSignificantWhitespace(); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tcxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1])\n\tb, _ := p.reader.Peek(1)\n\tswitch cxt {\n\tcase _CONTEXT_IN_LIST:\n\t\tif len(b) > 0 {\n\t\t\tswitch b[0] {\n\t\t\tcase JSON_RBRACKET[0]:\n\t\t\t\treturn nil\n\t\t\tcase JSON_COMMA[0]:\n\t\t\t\tp.reader.ReadByte()\n\t\t\t\tif e := p.readNonSignificantWhitespace(); e != nil {\n\t\t\t\t\treturn NewTProtocolException(e)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\tdefault:\n\t\t\t\te := fmt.Errorf(\"Expected \\\"]\\\" or \\\",\\\" in list context, but found \\\"%s\\\"\", string(b))\n\t\t\t\treturn NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t}\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\tif len(b) > 0 {\n\t\t\tswitch b[0] {\n\t\t\tcase JSON_RBRACE[0]:\n\t\t\t\treturn nil\n\t\t\tcase JSON_COMMA[0]:\n\t\t\t\tp.reader.ReadByte()\n\t\t\t\tif e := p.readNonSignificantWhitespace(); e != nil {\n\t\t\t\t\treturn NewTProtocolException(e)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\tdefault:\n\t\t\t\te := fmt.Errorf(\"Expected \\\"}\\\" or \\\",\\\" in object context, but found \\\"%s\\\"\", string(b))\n\t\t\t\treturn NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t}\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_NEXT_VALUE:\n\t\tif len(b) > 0 {\n\t\t\tswitch b[0] {\n\t\t\tcase JSON_COLON[0]:\n\t\t\t\tp.reader.ReadByte()\n\t\t\t\tif e := p.readNonSignificantWhitespace(); e != nil {\n\t\t\t\t\treturn NewTProtocolException(e)\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\tdefault:\n\t\t\t\te := fmt.Errorf(\"Expected \\\":\\\" in object context, but found \\\"%s\\\"\", string(b))\n\t\t\t\treturn NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t}\n\t\tbreak\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) ParsePostValue() error {\n\tif e := p.readNonSignificantWhitespace(); e != nil {\n\t\treturn NewTProtocolException(e)\n\t}\n\tcxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1])\n\tswitch cxt {\n\tcase _CONTEXT_IN_LIST_FIRST:\n\t\tp.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1]\n\t\tp.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST))\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY:\n\t\tp.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1]\n\t\tp.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_VALUE))\n\t\tbreak\n\tcase _CONTEXT_IN_OBJECT_NEXT_VALUE:\n\t\tp.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1]\n\t\tp.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_KEY))\n\t\tbreak\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) readNonSignificantWhitespace() error {\n\tfor {\n\t\tb, _ := p.reader.Peek(1)\n\t\tif len(b) < 1 {\n\t\t\treturn nil\n\t\t}\n\t\tswitch b[0] {\n\t\tcase ' ', '\\r', '\\n', '\\t':\n\t\t\tp.reader.ReadByte()\n\t\t\tcontinue\n\t\tdefault:\n\t\t\tbreak\n\t\t}\n\t\tbreak\n\t}\n\treturn nil\n}\n\nfunc (p *TSimpleJSONProtocol) ParseStringBody() (string, error) {\n\tline, err := p.reader.ReadString(JSON_QUOTE)\n\tif err != nil {\n\t\treturn \"\", NewTProtocolException(err)\n\t}\n\tl := len(line)\n\t// count number of escapes to see if we need to keep going\n\ti := 1\n\tfor ; i < l; i++ {\n\t\tif line[l-i-1] != '\\\\' {\n\t\t\tbreak\n\t\t}\n\t}\n\tif i&0x01 == 1 {\n\t\tv, ok := jsonUnquote(string(JSON_QUOTE) + line)\n\t\tif !ok {\n\t\t\treturn \"\", NewTProtocolException(err)\n\t\t}\n\t\treturn v, nil\n\t}\n\ts, err := p.ParseQuotedStringBody()\n\tif err != nil {\n\t\treturn \"\", NewTProtocolException(err)\n\t}\n\tstr := string(JSON_QUOTE) + line + s\n\tv, ok := jsonUnquote(str)\n\tif !ok {\n\t\te := fmt.Errorf(\"Unable to parse as JSON string %s\", str)\n\t\treturn \"\", NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t}\n\treturn v, nil\n}\n\nfunc (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) {\n\tline, err := p.reader.ReadString(JSON_QUOTE)\n\tif err != nil {\n\t\treturn \"\", NewTProtocolException(err)\n\t}\n\tl := len(line)\n\t// count number of escapes to see if we need to keep going\n\ti := 1\n\tfor ; i < l; i++ {\n\t\tif line[l-i-1] != '\\\\' {\n\t\t\tbreak\n\t\t}\n\t}\n\tif i&0x01 == 1 {\n\t\treturn line, nil\n\t}\n\ts, err := p.ParseQuotedStringBody()\n\tif err != nil {\n\t\treturn \"\", NewTProtocolException(err)\n\t}\n\tv := line + s\n\treturn v, nil\n}\n\nfunc (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) {\n\tline, err := p.reader.ReadBytes(JSON_QUOTE)\n\tif err != nil {\n\t\treturn line, NewTProtocolException(err)\n\t}\n\tline2 := line[0 : len(line)-1]\n\tl := len(line2)\n\tif (l % 4) != 0 {\n\t\tpad := 4 - (l % 4)\n\t\tfill := [...]byte{'=', '=', '='}\n\t\tline2 = append(line2, fill[:pad]...)\n\t\tl = len(line2)\n\t}\n\toutput := make([]byte, base64.StdEncoding.DecodedLen(l))\n\tn, err := base64.StdEncoding.Decode(output, line2)\n\treturn output[0:n], NewTProtocolException(err)\n}\n\nfunc (p *TSimpleJSONProtocol) ParseI64() (int64, bool, error) {\n\tif err := p.ParsePreValue(); err != nil {\n\t\treturn 0, false, err\n\t}\n\tvar value int64\n\tvar isnull bool\n\tif p.safePeekContains(JSON_NULL) {\n\t\tp.reader.Read(make([]byte, len(JSON_NULL)))\n\t\tisnull = true\n\t} else {\n\t\tnum, err := p.readNumeric()\n\t\tisnull = (num == nil)\n\t\tif !isnull {\n\t\t\tvalue = num.Int64()\n\t\t}\n\t\tif err != nil {\n\t\t\treturn value, isnull, err\n\t\t}\n\t}\n\treturn value, isnull, p.ParsePostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) ParseF64() (float64, bool, error) {\n\tif err := p.ParsePreValue(); err != nil {\n\t\treturn 0, false, err\n\t}\n\tvar value float64\n\tvar isnull bool\n\tif p.safePeekContains(JSON_NULL) {\n\t\tp.reader.Read(make([]byte, len(JSON_NULL)))\n\t\tisnull = true\n\t} else {\n\t\tnum, err := p.readNumeric()\n\t\tisnull = (num == nil)\n\t\tif !isnull {\n\t\t\tvalue = num.Float64()\n\t\t}\n\t\tif err != nil {\n\t\t\treturn value, isnull, err\n\t\t}\n\t}\n\treturn value, isnull, p.ParsePostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) ParseObjectStart() (bool, error) {\n\tif err := p.ParsePreValue(); err != nil {\n\t\treturn false, err\n\t}\n\tvar b []byte\n\tb, err := p.reader.Peek(1)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif len(b) > 0 && b[0] == JSON_LBRACE[0] {\n\t\tp.reader.ReadByte()\n\t\tp.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_FIRST))\n\t\treturn false, nil\n\t} else if p.safePeekContains(JSON_NULL) {\n\t\treturn true, nil\n\t}\n\te := fmt.Errorf(\"Expected '{' or null, but found '%s'\", string(b))\n\treturn false, NewTProtocolExceptionWithType(INVALID_DATA, e)\n}\n\nfunc (p *TSimpleJSONProtocol) ParseObjectEnd() error {\n\tif isNull, err := p.readIfNull(); isNull || err != nil {\n\t\treturn err\n\t}\n\tcxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1])\n\tif (cxt != _CONTEXT_IN_OBJECT_FIRST) && (cxt != _CONTEXT_IN_OBJECT_NEXT_KEY) {\n\t\te := fmt.Errorf(\"Expected to be in the Object Context, but not in Object Context (%d)\", cxt)\n\t\treturn NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t}\n\tline, err := p.reader.ReadString(JSON_RBRACE[0])\n\tif err != nil {\n\t\treturn NewTProtocolException(err)\n\t}\n\tfor _, char := range line {\n\t\tswitch char {\n\t\tdefault:\n\t\t\te := fmt.Errorf(\"Expecting end of object \\\"}\\\", but found: \\\"%s\\\"\", line)\n\t\t\treturn NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\tcase ' ', '\\n', '\\r', '\\t', '}':\n\t\t\tbreak\n\t\t}\n\t}\n\tp.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1]\n\treturn p.ParsePostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) ParseListBegin() (isNull bool, err error) {\n\tif e := p.ParsePreValue(); e != nil {\n\t\treturn false, e\n\t}\n\tvar b []byte\n\tb, err = p.reader.Peek(1)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif len(b) >= 1 && b[0] == JSON_LBRACKET[0] {\n\t\tp.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST_FIRST))\n\t\tp.reader.ReadByte()\n\t\tisNull = false\n\t} else if p.safePeekContains(JSON_NULL) {\n\t\tisNull = true\n\t} else {\n\t\terr = fmt.Errorf(\"Expected \\\"null\\\" or \\\"[\\\", received %q\", b)\n\t}\n\treturn isNull, NewTProtocolExceptionWithType(INVALID_DATA, err)\n}\n\nfunc (p *TSimpleJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) {\n\tif isNull, e := p.ParseListBegin(); isNull || e != nil {\n\t\treturn VOID, 0, e\n\t}\n\tbElemType, err := p.ReadByte()\n\telemType = TType(bElemType)\n\tif err != nil {\n\t\treturn elemType, size, err\n\t}\n\tnSize, err2 := p.ReadI64()\n\tsize = int(nSize)\n\treturn elemType, size, err2\n}\n\nfunc (p *TSimpleJSONProtocol) ParseListEnd() error {\n\tif isNull, err := p.readIfNull(); isNull || err != nil {\n\t\treturn err\n\t}\n\tcxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1])\n\tif cxt != _CONTEXT_IN_LIST {\n\t\te := fmt.Errorf(\"Expected to be in the List Context, but not in List Context (%d)\", cxt)\n\t\treturn NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t}\n\tline, err := p.reader.ReadString(JSON_RBRACKET[0])\n\tif err != nil {\n\t\treturn NewTProtocolException(err)\n\t}\n\tfor _, char := range line {\n\t\tswitch char {\n\t\tdefault:\n\t\t\te := fmt.Errorf(\"Expecting end of list \\\"]\\\", but found: \\\"%s\\\"\", line)\n\t\t\treturn NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\tcase ' ', '\\n', '\\r', '\\t', rune(JSON_RBRACKET[0]):\n\t\t\tbreak\n\t\t}\n\t}\n\tp.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1]\n\tif _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) == _CONTEXT_IN_TOPLEVEL {\n\t\treturn nil\n\t}\n\treturn p.ParsePostValue()\n}\n\nfunc (p *TSimpleJSONProtocol) readSingleValue() (interface{}, TType, error) {\n\te := p.readNonSignificantWhitespace()\n\tif e != nil {\n\t\treturn nil, VOID, NewTProtocolException(e)\n\t}\n\tb, e := p.reader.Peek(1)\n\tif len(b) > 0 {\n\t\tc := b[0]\n\t\tswitch c {\n\t\tcase JSON_NULL[0]:\n\t\t\tbuf := make([]byte, len(JSON_NULL))\n\t\t\t_, e := p.reader.Read(buf)\n\t\t\tif e != nil {\n\t\t\t\treturn nil, VOID, NewTProtocolException(e)\n\t\t\t}\n\t\t\tif string(JSON_NULL) != string(buf) {\n\t\t\t\te = mismatch(string(JSON_NULL), string(buf))\n\t\t\t\treturn nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\treturn nil, VOID, nil\n\t\tcase JSON_QUOTE:\n\t\t\tp.reader.ReadByte()\n\t\t\tv, e := p.ParseStringBody()\n\t\t\tif e != nil {\n\t\t\t\treturn v, UTF8, NewTProtocolException(e)\n\t\t\t}\n\t\t\tif v == JSON_INFINITY {\n\t\t\t\treturn INFINITY, DOUBLE, nil\n\t\t\t} else if v == JSON_NEGATIVE_INFINITY {\n\t\t\t\treturn NEGATIVE_INFINITY, DOUBLE, nil\n\t\t\t} else if v == JSON_NAN {\n\t\t\t\treturn NAN, DOUBLE, nil\n\t\t\t}\n\t\t\treturn v, UTF8, nil\n\t\tcase JSON_TRUE[0]:\n\t\t\tbuf := make([]byte, len(JSON_TRUE))\n\t\t\t_, e := p.reader.Read(buf)\n\t\t\tif e != nil {\n\t\t\t\treturn true, BOOL, NewTProtocolException(e)\n\t\t\t}\n\t\t\tif string(JSON_TRUE) != string(buf) {\n\t\t\t\te := mismatch(string(JSON_TRUE), string(buf))\n\t\t\t\treturn true, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\treturn true, BOOL, nil\n\t\tcase JSON_FALSE[0]:\n\t\t\tbuf := make([]byte, len(JSON_FALSE))\n\t\t\t_, e := p.reader.Read(buf)\n\t\t\tif e != nil {\n\t\t\t\treturn false, BOOL, NewTProtocolException(e)\n\t\t\t}\n\t\t\tif string(JSON_FALSE) != string(buf) {\n\t\t\t\te := mismatch(string(JSON_FALSE), string(buf))\n\t\t\t\treturn false, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\treturn false, BOOL, nil\n\t\tcase JSON_LBRACKET[0]:\n\t\t\t_, e := p.reader.ReadByte()\n\t\t\treturn make([]interface{}, 0), LIST, NewTProtocolException(e)\n\t\tcase JSON_LBRACE[0]:\n\t\t\t_, e := p.reader.ReadByte()\n\t\t\treturn make(map[string]interface{}), STRUCT, NewTProtocolException(e)\n\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E', '.', '+', '-', JSON_INFINITY[0], JSON_NAN[0]:\n\t\t\t// assume numeric\n\t\t\tv, e := p.readNumeric()\n\t\t\treturn v, DOUBLE, e\n\t\tdefault:\n\t\t\te := fmt.Errorf(\"Expected element in list but found '%s' while parsing JSON.\", string(c))\n\t\t\treturn nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t}\n\t}\n\te = fmt.Errorf(\"Cannot read a single element while parsing JSON.\")\n\treturn nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\n}\n\nfunc (p *TSimpleJSONProtocol) readIfNull() (bool, error) {\n\tcont := true\n\tfor cont {\n\t\tb, _ := p.reader.Peek(1)\n\t\tif len(b) < 1 {\n\t\t\treturn false, nil\n\t\t}\n\t\tswitch b[0] {\n\t\tdefault:\n\t\t\treturn false, nil\n\t\tcase JSON_NULL[0]:\n\t\t\tcont = false\n\t\t\tbreak\n\t\tcase ' ', '\\n', '\\r', '\\t':\n\t\t\tp.reader.ReadByte()\n\t\t\tbreak\n\t\t}\n\t}\n\tif p.safePeekContains(JSON_NULL) {\n\t\tp.reader.Read(make([]byte, len(JSON_NULL)))\n\t\treturn true, nil\n\t}\n\treturn false, nil\n}\n\nfunc (p *TSimpleJSONProtocol) readQuoteIfNext() {\n\tb, _ := p.reader.Peek(1)\n\tif len(b) > 0 && b[0] == JSON_QUOTE {\n\t\tp.reader.ReadByte()\n\t}\n}\n\nfunc (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) {\n\tisNull, err := p.readIfNull()\n\tif isNull || err != nil {\n\t\treturn NUMERIC_NULL, err\n\t}\n\thasDecimalPoint := false\n\tnextCanBeSign := true\n\thasE := false\n\tMAX_LEN := 40\n\tbuf := bytes.NewBuffer(make([]byte, 0, MAX_LEN))\n\tcontinueFor := true\n\tinQuotes := false\n\tfor continueFor {\n\t\tc, err := p.reader.ReadByte()\n\t\tif err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\treturn NUMERIC_NULL, NewTProtocolException(err)\n\t\t}\n\t\tswitch c {\n\t\tcase '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':\n\t\t\tbuf.WriteByte(c)\n\t\t\tnextCanBeSign = false\n\t\tcase '.':\n\t\t\tif hasDecimalPoint {\n\t\t\t\te := fmt.Errorf(\"Unable to parse number with multiple decimal points '%s.'\", buf.String())\n\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\tif hasE {\n\t\t\t\te := fmt.Errorf(\"Unable to parse number with decimal points in the exponent '%s.'\", buf.String())\n\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\tbuf.WriteByte(c)\n\t\t\thasDecimalPoint, nextCanBeSign = true, false\n\t\tcase 'e', 'E':\n\t\t\tif hasE {\n\t\t\t\te := fmt.Errorf(\"Unable to parse number with multiple exponents '%s%c'\", buf.String(), c)\n\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\tbuf.WriteByte(c)\n\t\t\thasE, nextCanBeSign = true, true\n\t\tcase '-', '+':\n\t\t\tif !nextCanBeSign {\n\t\t\t\te := fmt.Errorf(\"Negative sign within number\")\n\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\t\tbuf.WriteByte(c)\n\t\t\tnextCanBeSign = false\n\t\tcase ' ', 0, '\\t', '\\n', '\\r', JSON_RBRACE[0], JSON_RBRACKET[0], JSON_COMMA[0], JSON_COLON[0]:\n\t\t\tp.reader.UnreadByte()\n\t\t\tcontinueFor = false\n\t\tcase JSON_NAN[0]:\n\t\t\tif buf.Len() == 0 {\n\t\t\t\tbuffer := make([]byte, len(JSON_NAN))\n\t\t\t\tbuffer[0] = c\n\t\t\t\t_, e := p.reader.Read(buffer[1:])\n\t\t\t\tif e != nil {\n\t\t\t\t\treturn NUMERIC_NULL, NewTProtocolException(e)\n\t\t\t\t}\n\t\t\t\tif JSON_NAN != string(buffer) {\n\t\t\t\t\te := mismatch(JSON_NAN, string(buffer))\n\t\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t\t}\n\t\t\t\tif inQuotes {\n\t\t\t\t\tp.readQuoteIfNext()\n\t\t\t\t}\n\t\t\t\treturn NAN, nil\n\t\t\t} else {\n\t\t\t\te := fmt.Errorf(\"Unable to parse number starting with character '%c'\", c)\n\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\tcase JSON_INFINITY[0]:\n\t\t\tif buf.Len() == 0 || (buf.Len() == 1 && buf.Bytes()[0] == '+') {\n\t\t\t\tbuffer := make([]byte, len(JSON_INFINITY))\n\t\t\t\tbuffer[0] = c\n\t\t\t\t_, e := p.reader.Read(buffer[1:])\n\t\t\t\tif e != nil {\n\t\t\t\t\treturn NUMERIC_NULL, NewTProtocolException(e)\n\t\t\t\t}\n\t\t\t\tif JSON_INFINITY != string(buffer) {\n\t\t\t\t\te := mismatch(JSON_INFINITY, string(buffer))\n\t\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t\t}\n\t\t\t\tif inQuotes {\n\t\t\t\t\tp.readQuoteIfNext()\n\t\t\t\t}\n\t\t\t\treturn INFINITY, nil\n\t\t\t} else if buf.Len() == 1 && buf.Bytes()[0] == JSON_NEGATIVE_INFINITY[0] {\n\t\t\t\tbuffer := make([]byte, len(JSON_NEGATIVE_INFINITY))\n\t\t\t\tbuffer[0] = JSON_NEGATIVE_INFINITY[0]\n\t\t\t\tbuffer[1] = c\n\t\t\t\t_, e := p.reader.Read(buffer[2:])\n\t\t\t\tif e != nil {\n\t\t\t\t\treturn NUMERIC_NULL, NewTProtocolException(e)\n\t\t\t\t}\n\t\t\t\tif JSON_NEGATIVE_INFINITY != string(buffer) {\n\t\t\t\t\te := mismatch(JSON_NEGATIVE_INFINITY, string(buffer))\n\t\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t\t}\n\t\t\t\tif inQuotes {\n\t\t\t\t\tp.readQuoteIfNext()\n\t\t\t\t}\n\t\t\t\treturn NEGATIVE_INFINITY, nil\n\t\t\t} else {\n\t\t\t\te := fmt.Errorf(\"Unable to parse number starting with character '%c' due to existing buffer %s\", c, buf.String())\n\t\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t\t}\n\t\tcase JSON_QUOTE:\n\t\t\tif !inQuotes {\n\t\t\t\tinQuotes = true\n\t\t\t} else {\n\t\t\t\tbreak\n\t\t\t}\n\t\tdefault:\n\t\t\te := fmt.Errorf(\"Unable to parse number starting with character '%c'\", c)\n\t\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t\t}\n\t}\n\tif buf.Len() == 0 {\n\t\te := fmt.Errorf(\"Unable to parse number from empty string ''\")\n\t\treturn NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e)\n\t}\n\treturn NewNumericFromJSONString(buf.String(), false), nil\n}\n\n// Safely peeks into the buffer, reading only what is necessary\nfunc (p *TSimpleJSONProtocol) safePeekContains(b []byte) bool {\n\tfor i := 0; i < len(b); i++ {\n\t\ta, _ := p.reader.Peek(i + 1)\n\t\tif len(a) == 0 || a[i] != b[i] {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// Reset the context stack to its initial state.\nfunc (p *TSimpleJSONProtocol) resetContextStack() {\n\tp.parseContextStack = []int{int(_CONTEXT_IN_TOPLEVEL)}\n\tp.dumpContext = []int{int(_CONTEXT_IN_TOPLEVEL)}\n}\n\nfunc (p *TSimpleJSONProtocol) write(b []byte) (int, error) {\n\tn, err := p.writer.Write(b)\n\tif err != nil {\n\t\tp.writer.Reset(p.trans) // THRIFT-3735\n\t}\n\treturn n, err\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/transport.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"errors\"\n\t\"io\"\n)\n\nvar errTransportInterrupted = errors.New(\"Transport Interrupted\")\n\ntype Flusher interface {\n\tFlush() (err error)\n}\n\ntype ReadSizeProvider interface {\n\tRemainingBytes() (num_bytes uint64)\n}\n\n\n// Encapsulates the I/O layer\ntype TTransport interface {\n\tio.ReadWriteCloser\n\tFlusher\n\tReadSizeProvider\n\n\t// Opens the transport for communication\n\tOpen() error\n\n\t// Returns true if the transport is open\n\tIsOpen() bool\n}\n\ntype stringWriter interface {\n\tWriteString(s string) (n int, err error)\n}\n\n\n// This is \"enchanced\" transport with extra capabilities. You need to use one of these\n// to construct protocol.\n// Notably, TSocket does not implement this interface, and it is always a mistake to use\n// TSocket directly in protocol.\ntype TRichTransport interface {\n\tio.ReadWriter\n\tio.ByteReader\n\tio.ByteWriter\n\tstringWriter\n\tFlusher\n\tReadSizeProvider\n}\n\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\nimport (\n\t\"errors\"\n\t\"io\"\n)\n\ntype timeoutable interface {\n\tTimeout() bool\n}\n\n// Thrift Transport exception\ntype TTransportException interface {\n\tTException\n\tTypeId() int\n\tErr() error\n}\n\nconst (\n\tUNKNOWN_TRANSPORT_EXCEPTION = 0\n\tNOT_OPEN                    = 1\n\tALREADY_OPEN                = 2\n\tTIMED_OUT                   = 3\n\tEND_OF_FILE                 = 4\n)\n\ntype tTransportException struct {\n\ttypeId int\n\terr    error\n}\n\nfunc (p *tTransportException) TypeId() int {\n\treturn p.typeId\n}\n\nfunc (p *tTransportException) Error() string {\n\treturn p.err.Error()\n}\n\nfunc (p *tTransportException) Err() error {\n\treturn p.err\n}\n\nfunc NewTTransportException(t int, e string) TTransportException {\n\treturn &tTransportException{typeId: t, err: errors.New(e)}\n}\n\nfunc NewTTransportExceptionFromError(e error) TTransportException {\n\tif e == nil {\n\t\treturn nil\n\t}\n\n\tif t, ok := e.(TTransportException); ok {\n\t\treturn t\n\t}\n\n\tswitch v := e.(type) {\n\tcase TTransportException:\n\t\treturn v\n\tcase timeoutable:\n\t\tif v.Timeout() {\n\t\t\treturn &tTransportException{typeId: TIMED_OUT, err: e}\n\t\t}\n\t}\n\n\tif e == io.EOF {\n\t\treturn &tTransportException{typeId: END_OF_FILE, err: e}\n\t}\n\n\treturn &tTransportException{typeId: UNKNOWN_TRANSPORT_EXCEPTION, err: e}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\n// Factory class used to create wrapped instance of Transports.\n// This is used primarily in servers, which get Transports from\n// a ServerTransport and then may want to mutate them (i.e. create\n// a BufferedTransport from the underlying base transport)\ntype TTransportFactory interface {\n\tGetTransport(trans TTransport) TTransport\n}\n\ntype tTransportFactory struct{}\n\n// Return a wrapped instance of the base Transport.\nfunc (p *tTransportFactory) GetTransport(trans TTransport) TTransport {\n\treturn trans\n}\n\nfunc NewTTransportFactory() TTransportFactory {\n\treturn &tTransportFactory{}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift/type.go",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. 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,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage thrift\n\n// Type constants in the Thrift protocol\ntype TType byte\n\nconst (\n\tSTOP   = 0\n\tVOID   = 1\n\tBOOL   = 2\n\tBYTE   = 3\n\tI08    = 3\n\tDOUBLE = 4\n\tI16    = 6\n\tI32    = 8\n\tI64    = 10\n\tSTRING = 11\n\tUTF7   = 11\n\tSTRUCT = 12\n\tMAP    = 13\n\tSET    = 14\n\tLIST   = 15\n\tUTF8   = 16\n\tUTF16  = 17\n\t//BINARY = 18   wrong and unusued\n)\n\nvar typeNames = map[int]string{\n\tSTOP:   \"STOP\",\n\tVOID:   \"VOID\",\n\tBOOL:   \"BOOL\",\n\tBYTE:   \"BYTE\",\n\tDOUBLE: \"DOUBLE\",\n\tI16:    \"I16\",\n\tI32:    \"I32\",\n\tI64:    \"I64\",\n\tSTRING: \"STRING\",\n\tSTRUCT: \"STRUCT\",\n\tMAP:    \"MAP\",\n\tSET:    \"SET\",\n\tLIST:   \"LIST\",\n\tUTF8:   \"UTF8\",\n\tUTF16:  \"UTF16\",\n}\n\nfunc (p TType) String() string {\n\tif s, ok := typeNames[int(p)]; ok {\n\t\treturn s\n\t}\n\treturn \"Unknown\"\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage agent\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/jaeger\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/zipkincore\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nvar _ = jaeger.GoUnusedProtection__\nvar _ = zipkincore.GoUnusedProtection__\n\ntype Agent interface {\n\t// Parameters:\n\t//  - Spans\n\tEmitZipkinBatch(spans []*zipkincore.Span) (err error)\n\t// Parameters:\n\t//  - Batch\n\tEmitBatch(batch *jaeger.Batch) (err error)\n}\n\ntype AgentClient struct {\n\tTransport       thrift.TTransport\n\tProtocolFactory thrift.TProtocolFactory\n\tInputProtocol   thrift.TProtocol\n\tOutputProtocol  thrift.TProtocol\n\tSeqId           int32\n}\n\nfunc NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient {\n\treturn &AgentClient{Transport: t,\n\t\tProtocolFactory: f,\n\t\tInputProtocol:   f.GetProtocol(t),\n\t\tOutputProtocol:  f.GetProtocol(t),\n\t\tSeqId:           0,\n\t}\n}\n\nfunc NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient {\n\treturn &AgentClient{Transport: t,\n\t\tProtocolFactory: nil,\n\t\tInputProtocol:   iprot,\n\t\tOutputProtocol:  oprot,\n\t\tSeqId:           0,\n\t}\n}\n\n// Parameters:\n//  - Spans\nfunc (p *AgentClient) EmitZipkinBatch(spans []*zipkincore.Span) (err error) {\n\tif err = p.sendEmitZipkinBatch(spans); err != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (p *AgentClient) sendEmitZipkinBatch(spans []*zipkincore.Span) (err error) {\n\toprot := p.OutputProtocol\n\tif oprot == nil {\n\t\toprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.OutputProtocol = oprot\n\t}\n\tp.SeqId++\n\tif err = oprot.WriteMessageBegin(\"emitZipkinBatch\", thrift.ONEWAY, p.SeqId); err != nil {\n\t\treturn\n\t}\n\targs := AgentEmitZipkinBatchArgs{\n\t\tSpans: spans,\n\t}\n\tif err = args.Write(oprot); err != nil {\n\t\treturn\n\t}\n\tif err = oprot.WriteMessageEnd(); err != nil {\n\t\treturn\n\t}\n\treturn oprot.Flush()\n}\n\n// Parameters:\n//  - Batch\nfunc (p *AgentClient) EmitBatch(batch *jaeger.Batch) (err error) {\n\tif err = p.sendEmitBatch(batch); err != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (p *AgentClient) sendEmitBatch(batch *jaeger.Batch) (err error) {\n\toprot := p.OutputProtocol\n\tif oprot == nil {\n\t\toprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.OutputProtocol = oprot\n\t}\n\tp.SeqId++\n\tif err = oprot.WriteMessageBegin(\"emitBatch\", thrift.ONEWAY, p.SeqId); err != nil {\n\t\treturn\n\t}\n\targs := AgentEmitBatchArgs{\n\t\tBatch: batch,\n\t}\n\tif err = args.Write(oprot); err != nil {\n\t\treturn\n\t}\n\tif err = oprot.WriteMessageEnd(); err != nil {\n\t\treturn\n\t}\n\treturn oprot.Flush()\n}\n\ntype AgentProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Agent\n}\n\nfunc (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewAgentProcessor(handler Agent) *AgentProcessor {\n\n\tself0 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself0.processorMap[\"emitZipkinBatch\"] = &agentProcessorEmitZipkinBatch{handler: handler}\n\tself0.processorMap[\"emitBatch\"] = &agentProcessorEmitBatch{handler: handler}\n\treturn self0\n}\n\nfunc (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx1 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx1.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush()\n\treturn false, x1\n\n}\n\ntype agentProcessorEmitZipkinBatch struct {\n\thandler Agent\n}\n\nfunc (p *agentProcessorEmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := AgentEmitZipkinBatchArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tif err2 = p.handler.EmitZipkinBatch(args.Spans); err2 != nil {\n\t\treturn true, err2\n\t}\n\treturn true, nil\n}\n\ntype agentProcessorEmitBatch struct {\n\thandler Agent\n}\n\nfunc (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := AgentEmitBatchArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tif err2 = p.handler.EmitBatch(args.Batch); err2 != nil {\n\t\treturn true, err2\n\t}\n\treturn true, nil\n}\n\n// HELPER FUNCTIONS AND STRUCTURES\n\n// Attributes:\n//  - Spans\ntype AgentEmitZipkinBatchArgs struct {\n\tSpans []*zipkincore.Span `thrift:\"spans,1\" json:\"spans\"`\n}\n\nfunc NewAgentEmitZipkinBatchArgs() *AgentEmitZipkinBatchArgs {\n\treturn &AgentEmitZipkinBatchArgs{}\n}\n\nfunc (p *AgentEmitZipkinBatchArgs) GetSpans() []*zipkincore.Span {\n\treturn p.Spans\n}\nfunc (p *AgentEmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*zipkincore.Span, 0, size)\n\tp.Spans = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem2 := &zipkincore.Span{}\n\t\tif err := _elem2.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem2), err)\n\t\t}\n\t\tp.Spans = append(p.Spans, _elem2)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"emitZipkinBatch_args\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"spans\", thrift.LIST, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:spans: \", p), err)\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil {\n\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t}\n\tfor _, v := range p.Spans {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:spans: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *AgentEmitZipkinBatchArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"AgentEmitZipkinBatchArgs(%+v)\", *p)\n}\n\n// Attributes:\n//  - Batch\ntype AgentEmitBatchArgs struct {\n\tBatch *jaeger.Batch `thrift:\"batch,1\" json:\"batch\"`\n}\n\nfunc NewAgentEmitBatchArgs() *AgentEmitBatchArgs {\n\treturn &AgentEmitBatchArgs{}\n}\n\nvar AgentEmitBatchArgs_Batch_DEFAULT *jaeger.Batch\n\nfunc (p *AgentEmitBatchArgs) GetBatch() *jaeger.Batch {\n\tif !p.IsSetBatch() {\n\t\treturn AgentEmitBatchArgs_Batch_DEFAULT\n\t}\n\treturn p.Batch\n}\nfunc (p *AgentEmitBatchArgs) IsSetBatch() bool {\n\treturn p.Batch != nil\n}\n\nfunc (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error {\n\tp.Batch = &jaeger.Batch{}\n\tif err := p.Batch.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.Batch), err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"emitBatch_args\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"batch\", thrift.STRUCT, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:batch: \", p), err)\n\t}\n\tif err := p.Batch.Write(oprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.Batch), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:batch: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *AgentEmitBatchArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"AgentEmitBatchArgs(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage agent\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/jaeger\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/zipkincore\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nvar _ = jaeger.GoUnusedProtection__\nvar _ = zipkincore.GoUnusedProtection__\n\nfunc init() {\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage agent\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/jaeger\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/zipkincore\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nvar _ = jaeger.GoUnusedProtection__\nvar _ = zipkincore.GoUnusedProtection__\nvar GoUnusedProtection__ int\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage baggage\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\ntype BaggageRestrictionManager interface {\n\t// getBaggageRestrictions retrieves the baggage restrictions for a specific service.\n\t// Usually, baggageRestrictions apply to all services however there may be situations\n\t// where a baggageKey might only be allowed to be set by a specific service.\n\t//\n\t// Parameters:\n\t//  - ServiceName\n\tGetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error)\n}\n\ntype BaggageRestrictionManagerClient struct {\n\tTransport       thrift.TTransport\n\tProtocolFactory thrift.TProtocolFactory\n\tInputProtocol   thrift.TProtocol\n\tOutputProtocol  thrift.TProtocol\n\tSeqId           int32\n}\n\nfunc NewBaggageRestrictionManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *BaggageRestrictionManagerClient {\n\treturn &BaggageRestrictionManagerClient{Transport: t,\n\t\tProtocolFactory: f,\n\t\tInputProtocol:   f.GetProtocol(t),\n\t\tOutputProtocol:  f.GetProtocol(t),\n\t\tSeqId:           0,\n\t}\n}\n\nfunc NewBaggageRestrictionManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *BaggageRestrictionManagerClient {\n\treturn &BaggageRestrictionManagerClient{Transport: t,\n\t\tProtocolFactory: nil,\n\t\tInputProtocol:   iprot,\n\t\tOutputProtocol:  oprot,\n\t\tSeqId:           0,\n\t}\n}\n\n// getBaggageRestrictions retrieves the baggage restrictions for a specific service.\n// Usually, baggageRestrictions apply to all services however there may be situations\n// where a baggageKey might only be allowed to be set by a specific service.\n//\n// Parameters:\n//  - ServiceName\nfunc (p *BaggageRestrictionManagerClient) GetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error) {\n\tif err = p.sendGetBaggageRestrictions(serviceName); err != nil {\n\t\treturn\n\t}\n\treturn p.recvGetBaggageRestrictions()\n}\n\nfunc (p *BaggageRestrictionManagerClient) sendGetBaggageRestrictions(serviceName string) (err error) {\n\toprot := p.OutputProtocol\n\tif oprot == nil {\n\t\toprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.OutputProtocol = oprot\n\t}\n\tp.SeqId++\n\tif err = oprot.WriteMessageBegin(\"getBaggageRestrictions\", thrift.CALL, p.SeqId); err != nil {\n\t\treturn\n\t}\n\targs := BaggageRestrictionManagerGetBaggageRestrictionsArgs{\n\t\tServiceName: serviceName,\n\t}\n\tif err = args.Write(oprot); err != nil {\n\t\treturn\n\t}\n\tif err = oprot.WriteMessageEnd(); err != nil {\n\t\treturn\n\t}\n\treturn oprot.Flush()\n}\n\nfunc (p *BaggageRestrictionManagerClient) recvGetBaggageRestrictions() (value []*BaggageRestriction, err error) {\n\tiprot := p.InputProtocol\n\tif iprot == nil {\n\t\tiprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.InputProtocol = iprot\n\t}\n\tmethod, mTypeId, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn\n\t}\n\tif method != \"getBaggageRestrictions\" {\n\t\terr = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, \"getBaggageRestrictions failed: wrong method name\")\n\t\treturn\n\t}\n\tif p.SeqId != seqId {\n\t\terr = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, \"getBaggageRestrictions failed: out of sequence response\")\n\t\treturn\n\t}\n\tif mTypeId == thrift.EXCEPTION {\n\t\terror0 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, \"Unknown Exception\")\n\t\tvar error1 error\n\t\terror1, err = error0.Read(iprot)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif err = iprot.ReadMessageEnd(); err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = error1\n\t\treturn\n\t}\n\tif mTypeId != thrift.REPLY {\n\t\terr = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, \"getBaggageRestrictions failed: invalid message type\")\n\t\treturn\n\t}\n\tresult := BaggageRestrictionManagerGetBaggageRestrictionsResult{}\n\tif err = result.Read(iprot); err != nil {\n\t\treturn\n\t}\n\tif err = iprot.ReadMessageEnd(); err != nil {\n\t\treturn\n\t}\n\tvalue = result.GetSuccess()\n\treturn\n}\n\ntype BaggageRestrictionManagerProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      BaggageRestrictionManager\n}\n\nfunc (p *BaggageRestrictionManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *BaggageRestrictionManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *BaggageRestrictionManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewBaggageRestrictionManagerProcessor(handler BaggageRestrictionManager) *BaggageRestrictionManagerProcessor {\n\n\tself2 := &BaggageRestrictionManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself2.processorMap[\"getBaggageRestrictions\"] = &baggageRestrictionManagerProcessorGetBaggageRestrictions{handler: handler}\n\treturn self2\n}\n\nfunc (p *BaggageRestrictionManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx3 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx3.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush()\n\treturn false, x3\n\n}\n\ntype baggageRestrictionManagerProcessorGetBaggageRestrictions struct {\n\thandler BaggageRestrictionManager\n}\n\nfunc (p *baggageRestrictionManagerProcessorGetBaggageRestrictions) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := BaggageRestrictionManagerGetBaggageRestrictionsArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"getBaggageRestrictions\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush()\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tresult := BaggageRestrictionManagerGetBaggageRestrictionsResult{}\n\tvar retval []*BaggageRestriction\n\tvar err2 error\n\tif retval, err2 = p.handler.GetBaggageRestrictions(args.ServiceName); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing getBaggageRestrictions: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"getBaggageRestrictions\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush()\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"getBaggageRestrictions\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\n// HELPER FUNCTIONS AND STRUCTURES\n\n// Attributes:\n//  - ServiceName\ntype BaggageRestrictionManagerGetBaggageRestrictionsArgs struct {\n\tServiceName string `thrift:\"serviceName,1\" json:\"serviceName\"`\n}\n\nfunc NewBaggageRestrictionManagerGetBaggageRestrictionsArgs() *BaggageRestrictionManagerGetBaggageRestrictionsArgs {\n\treturn &BaggageRestrictionManagerGetBaggageRestrictionsArgs{}\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) GetServiceName() string {\n\treturn p.ServiceName\n}\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.ServiceName = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"getBaggageRestrictions_args\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"serviceName\", thrift.STRING, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:serviceName: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.ServiceName)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.serviceName (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:serviceName: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaggageRestrictionManagerGetBaggageRestrictionsArgs(%+v)\", *p)\n}\n\n// Attributes:\n//  - Success\ntype BaggageRestrictionManagerGetBaggageRestrictionsResult struct {\n\tSuccess []*BaggageRestriction `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewBaggageRestrictionManagerGetBaggageRestrictionsResult() *BaggageRestrictionManagerGetBaggageRestrictionsResult {\n\treturn &BaggageRestrictionManagerGetBaggageRestrictionsResult{}\n}\n\nvar BaggageRestrictionManagerGetBaggageRestrictionsResult_Success_DEFAULT []*BaggageRestriction\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) GetSuccess() []*BaggageRestriction {\n\treturn p.Success\n}\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif err := p.readField0(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) readField0(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*BaggageRestriction, 0, size)\n\tp.Success = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem4 := &BaggageRestriction{}\n\t\tif err := _elem4.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem4), err)\n\t\t}\n\t\tp.Success = append(p.Success, _elem4)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"getBaggageRestrictions_result\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField0(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err := oprot.WriteFieldBegin(\"success\", thrift.LIST, 0); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 0:success: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t\t}\n\t\tfor _, v := range p.Success {\n\t\t\tif err := v.Write(oprot); err != nil {\n\t\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteListEnd(); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 0:success: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaggageRestrictionManagerGetBaggageRestrictionsResult(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage baggage\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nfunc init() {\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage baggage\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nvar GoUnusedProtection__ int\n\n// Attributes:\n//  - BaggageKey\n//  - MaxValueLength\ntype BaggageRestriction struct {\n\tBaggageKey     string `thrift:\"baggageKey,1,required\" json:\"baggageKey\"`\n\tMaxValueLength int32  `thrift:\"maxValueLength,2,required\" json:\"maxValueLength\"`\n}\n\nfunc NewBaggageRestriction() *BaggageRestriction {\n\treturn &BaggageRestriction{}\n}\n\nfunc (p *BaggageRestriction) GetBaggageKey() string {\n\treturn p.BaggageKey\n}\n\nfunc (p *BaggageRestriction) GetMaxValueLength() int32 {\n\treturn p.MaxValueLength\n}\nfunc (p *BaggageRestriction) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetBaggageKey bool = false\n\tvar issetMaxValueLength bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetBaggageKey = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetMaxValueLength = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetBaggageKey {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field BaggageKey is not set\"))\n\t}\n\tif !issetMaxValueLength {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field MaxValueLength is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestriction) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.BaggageKey = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestriction) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\tp.MaxValueLength = v\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestriction) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"BaggageRestriction\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *BaggageRestriction) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"baggageKey\", thrift.STRING, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:baggageKey: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.BaggageKey)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.baggageKey (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:baggageKey: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *BaggageRestriction) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"maxValueLength\", thrift.I32, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:maxValueLength: \", p), err)\n\t}\n\tif err := oprot.WriteI32(int32(p.MaxValueLength)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.maxValueLength (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:maxValueLength: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *BaggageRestriction) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BaggageRestriction(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage jaeger\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\ntype Agent interface {\n\t// Parameters:\n\t//  - Batch\n\tEmitBatch(batch *Batch) (err error)\n}\n\ntype AgentClient struct {\n\tTransport       thrift.TTransport\n\tProtocolFactory thrift.TProtocolFactory\n\tInputProtocol   thrift.TProtocol\n\tOutputProtocol  thrift.TProtocol\n\tSeqId           int32\n}\n\nfunc NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient {\n\treturn &AgentClient{Transport: t,\n\t\tProtocolFactory: f,\n\t\tInputProtocol:   f.GetProtocol(t),\n\t\tOutputProtocol:  f.GetProtocol(t),\n\t\tSeqId:           0,\n\t}\n}\n\nfunc NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient {\n\treturn &AgentClient{Transport: t,\n\t\tProtocolFactory: nil,\n\t\tInputProtocol:   iprot,\n\t\tOutputProtocol:  oprot,\n\t\tSeqId:           0,\n\t}\n}\n\n// Parameters:\n//  - Batch\nfunc (p *AgentClient) EmitBatch(batch *Batch) (err error) {\n\tif err = p.sendEmitBatch(batch); err != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (p *AgentClient) sendEmitBatch(batch *Batch) (err error) {\n\toprot := p.OutputProtocol\n\tif oprot == nil {\n\t\toprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.OutputProtocol = oprot\n\t}\n\tp.SeqId++\n\tif err = oprot.WriteMessageBegin(\"emitBatch\", thrift.ONEWAY, p.SeqId); err != nil {\n\t\treturn\n\t}\n\targs := AgentEmitBatchArgs{\n\t\tBatch: batch,\n\t}\n\tif err = args.Write(oprot); err != nil {\n\t\treturn\n\t}\n\tif err = oprot.WriteMessageEnd(); err != nil {\n\t\treturn\n\t}\n\treturn oprot.Flush()\n}\n\ntype AgentProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      Agent\n}\n\nfunc (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewAgentProcessor(handler Agent) *AgentProcessor {\n\n\tself6 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself6.processorMap[\"emitBatch\"] = &agentProcessorEmitBatch{handler: handler}\n\treturn self6\n}\n\nfunc (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx7 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx7.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush()\n\treturn false, x7\n\n}\n\ntype agentProcessorEmitBatch struct {\n\thandler Agent\n}\n\nfunc (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := AgentEmitBatchArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tvar err2 error\n\tif err2 = p.handler.EmitBatch(args.Batch); err2 != nil {\n\t\treturn true, err2\n\t}\n\treturn true, nil\n}\n\n// HELPER FUNCTIONS AND STRUCTURES\n\n// Attributes:\n//  - Batch\ntype AgentEmitBatchArgs struct {\n\tBatch *Batch `thrift:\"batch,1\" json:\"batch\"`\n}\n\nfunc NewAgentEmitBatchArgs() *AgentEmitBatchArgs {\n\treturn &AgentEmitBatchArgs{}\n}\n\nvar AgentEmitBatchArgs_Batch_DEFAULT *Batch\n\nfunc (p *AgentEmitBatchArgs) GetBatch() *Batch {\n\tif !p.IsSetBatch() {\n\t\treturn AgentEmitBatchArgs_Batch_DEFAULT\n\t}\n\treturn p.Batch\n}\nfunc (p *AgentEmitBatchArgs) IsSetBatch() bool {\n\treturn p.Batch != nil\n}\n\nfunc (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error {\n\tp.Batch = &Batch{}\n\tif err := p.Batch.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.Batch), err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"emitBatch_args\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"batch\", thrift.STRUCT, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:batch: \", p), err)\n\t}\n\tif err := p.Batch.Write(oprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.Batch), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:batch: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *AgentEmitBatchArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"AgentEmitBatchArgs(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage jaeger\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nfunc init() {\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage jaeger\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nvar GoUnusedProtection__ int\n\ntype TagType int64\n\nconst (\n\tTagType_STRING TagType = 0\n\tTagType_DOUBLE TagType = 1\n\tTagType_BOOL   TagType = 2\n\tTagType_LONG   TagType = 3\n\tTagType_BINARY TagType = 4\n)\n\nfunc (p TagType) String() string {\n\tswitch p {\n\tcase TagType_STRING:\n\t\treturn \"STRING\"\n\tcase TagType_DOUBLE:\n\t\treturn \"DOUBLE\"\n\tcase TagType_BOOL:\n\t\treturn \"BOOL\"\n\tcase TagType_LONG:\n\t\treturn \"LONG\"\n\tcase TagType_BINARY:\n\t\treturn \"BINARY\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc TagTypeFromString(s string) (TagType, error) {\n\tswitch s {\n\tcase \"STRING\":\n\t\treturn TagType_STRING, nil\n\tcase \"DOUBLE\":\n\t\treturn TagType_DOUBLE, nil\n\tcase \"BOOL\":\n\t\treturn TagType_BOOL, nil\n\tcase \"LONG\":\n\t\treturn TagType_LONG, nil\n\tcase \"BINARY\":\n\t\treturn TagType_BINARY, nil\n\t}\n\treturn TagType(0), fmt.Errorf(\"not a valid TagType string\")\n}\n\nfunc TagTypePtr(v TagType) *TagType { return &v }\n\nfunc (p TagType) MarshalText() ([]byte, error) {\n\treturn []byte(p.String()), nil\n}\n\nfunc (p *TagType) UnmarshalText(text []byte) error {\n\tq, err := TagTypeFromString(string(text))\n\tif err != nil {\n\t\treturn err\n\t}\n\t*p = q\n\treturn nil\n}\n\ntype SpanRefType int64\n\nconst (\n\tSpanRefType_CHILD_OF     SpanRefType = 0\n\tSpanRefType_FOLLOWS_FROM SpanRefType = 1\n)\n\nfunc (p SpanRefType) String() string {\n\tswitch p {\n\tcase SpanRefType_CHILD_OF:\n\t\treturn \"CHILD_OF\"\n\tcase SpanRefType_FOLLOWS_FROM:\n\t\treturn \"FOLLOWS_FROM\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc SpanRefTypeFromString(s string) (SpanRefType, error) {\n\tswitch s {\n\tcase \"CHILD_OF\":\n\t\treturn SpanRefType_CHILD_OF, nil\n\tcase \"FOLLOWS_FROM\":\n\t\treturn SpanRefType_FOLLOWS_FROM, nil\n\t}\n\treturn SpanRefType(0), fmt.Errorf(\"not a valid SpanRefType string\")\n}\n\nfunc SpanRefTypePtr(v SpanRefType) *SpanRefType { return &v }\n\nfunc (p SpanRefType) MarshalText() ([]byte, error) {\n\treturn []byte(p.String()), nil\n}\n\nfunc (p *SpanRefType) UnmarshalText(text []byte) error {\n\tq, err := SpanRefTypeFromString(string(text))\n\tif err != nil {\n\t\treturn err\n\t}\n\t*p = q\n\treturn nil\n}\n\n// Attributes:\n//  - Key\n//  - VType\n//  - VStr\n//  - VDouble\n//  - VBool\n//  - VLong\n//  - VBinary\ntype Tag struct {\n\tKey     string   `thrift:\"key,1,required\" json:\"key\"`\n\tVType   TagType  `thrift:\"vType,2,required\" json:\"vType\"`\n\tVStr    *string  `thrift:\"vStr,3\" json:\"vStr,omitempty\"`\n\tVDouble *float64 `thrift:\"vDouble,4\" json:\"vDouble,omitempty\"`\n\tVBool   *bool    `thrift:\"vBool,5\" json:\"vBool,omitempty\"`\n\tVLong   *int64   `thrift:\"vLong,6\" json:\"vLong,omitempty\"`\n\tVBinary []byte   `thrift:\"vBinary,7\" json:\"vBinary,omitempty\"`\n}\n\nfunc NewTag() *Tag {\n\treturn &Tag{}\n}\n\nfunc (p *Tag) GetKey() string {\n\treturn p.Key\n}\n\nfunc (p *Tag) GetVType() TagType {\n\treturn p.VType\n}\n\nvar Tag_VStr_DEFAULT string\n\nfunc (p *Tag) GetVStr() string {\n\tif !p.IsSetVStr() {\n\t\treturn Tag_VStr_DEFAULT\n\t}\n\treturn *p.VStr\n}\n\nvar Tag_VDouble_DEFAULT float64\n\nfunc (p *Tag) GetVDouble() float64 {\n\tif !p.IsSetVDouble() {\n\t\treturn Tag_VDouble_DEFAULT\n\t}\n\treturn *p.VDouble\n}\n\nvar Tag_VBool_DEFAULT bool\n\nfunc (p *Tag) GetVBool() bool {\n\tif !p.IsSetVBool() {\n\t\treturn Tag_VBool_DEFAULT\n\t}\n\treturn *p.VBool\n}\n\nvar Tag_VLong_DEFAULT int64\n\nfunc (p *Tag) GetVLong() int64 {\n\tif !p.IsSetVLong() {\n\t\treturn Tag_VLong_DEFAULT\n\t}\n\treturn *p.VLong\n}\n\nvar Tag_VBinary_DEFAULT []byte\n\nfunc (p *Tag) GetVBinary() []byte {\n\treturn p.VBinary\n}\nfunc (p *Tag) IsSetVStr() bool {\n\treturn p.VStr != nil\n}\n\nfunc (p *Tag) IsSetVDouble() bool {\n\treturn p.VDouble != nil\n}\n\nfunc (p *Tag) IsSetVBool() bool {\n\treturn p.VBool != nil\n}\n\nfunc (p *Tag) IsSetVLong() bool {\n\treturn p.VLong != nil\n}\n\nfunc (p *Tag) IsSetVBinary() bool {\n\treturn p.VBinary != nil\n}\n\nfunc (p *Tag) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetKey bool = false\n\tvar issetVType bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetKey = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetVType = true\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 4:\n\t\t\tif err := p.readField4(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 5:\n\t\t\tif err := p.readField5(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 6:\n\t\t\tif err := p.readField6(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 7:\n\t\t\tif err := p.readField7(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetKey {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Key is not set\"))\n\t}\n\tif !issetVType {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field VType is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Key = v\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\ttemp := TagType(v)\n\t\tp.VType = temp\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) readField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 3: \", err)\n\t} else {\n\t\tp.VStr = &v\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) readField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadDouble(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 4: \", err)\n\t} else {\n\t\tp.VDouble = &v\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) readField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadBool(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 5: \", err)\n\t} else {\n\t\tp.VBool = &v\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) readField6(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 6: \", err)\n\t} else {\n\t\tp.VLong = &v\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) readField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadBinary(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 7: \", err)\n\t} else {\n\t\tp.VBinary = v\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Tag\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField4(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField5(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField6(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField7(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Tag) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"key\", thrift.STRING, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:key: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.Key)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.key (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:key: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Tag) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"vType\", thrift.I32, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:vType: \", p), err)\n\t}\n\tif err := oprot.WriteI32(int32(p.VType)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.vType (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:vType: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Tag) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetVStr() {\n\t\tif err := oprot.WriteFieldBegin(\"vStr\", thrift.STRING, 3); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:vStr: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteString(string(*p.VStr)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.vStr (3) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:vStr: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Tag) writeField4(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetVDouble() {\n\t\tif err := oprot.WriteFieldBegin(\"vDouble\", thrift.DOUBLE, 4); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 4:vDouble: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteDouble(float64(*p.VDouble)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.vDouble (4) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 4:vDouble: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Tag) writeField5(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetVBool() {\n\t\tif err := oprot.WriteFieldBegin(\"vBool\", thrift.BOOL, 5); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 5:vBool: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteBool(bool(*p.VBool)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.vBool (5) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 5:vBool: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Tag) writeField6(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetVLong() {\n\t\tif err := oprot.WriteFieldBegin(\"vLong\", thrift.I64, 6); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 6:vLong: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteI64(int64(*p.VLong)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.vLong (6) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 6:vLong: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Tag) writeField7(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetVBinary() {\n\t\tif err := oprot.WriteFieldBegin(\"vBinary\", thrift.STRING, 7); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 7:vBinary: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteBinary(p.VBinary); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.vBinary (7) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 7:vBinary: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Tag) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Tag(%+v)\", *p)\n}\n\n// Attributes:\n//  - Timestamp\n//  - Fields\ntype Log struct {\n\tTimestamp int64  `thrift:\"timestamp,1,required\" json:\"timestamp\"`\n\tFields    []*Tag `thrift:\"fields,2,required\" json:\"fields\"`\n}\n\nfunc NewLog() *Log {\n\treturn &Log{}\n}\n\nfunc (p *Log) GetTimestamp() int64 {\n\treturn p.Timestamp\n}\n\nfunc (p *Log) GetFields() []*Tag {\n\treturn p.Fields\n}\nfunc (p *Log) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetTimestamp bool = false\n\tvar issetFields bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetTimestamp = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetFields = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetTimestamp {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Timestamp is not set\"))\n\t}\n\tif !issetFields {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Fields is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *Log) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Timestamp = v\n\t}\n\treturn nil\n}\n\nfunc (p *Log) readField2(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Tag, 0, size)\n\tp.Fields = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem0 := &Tag{}\n\t\tif err := _elem0.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem0), err)\n\t\t}\n\t\tp.Fields = append(p.Fields, _elem0)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Log) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Log\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Log) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"timestamp\", thrift.I64, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:timestamp: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.Timestamp)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.timestamp (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:timestamp: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Log) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"fields\", thrift.LIST, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:fields: \", p), err)\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Fields)); err != nil {\n\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t}\n\tfor _, v := range p.Fields {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:fields: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Log) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Log(%+v)\", *p)\n}\n\n// Attributes:\n//  - RefType\n//  - TraceIdLow\n//  - TraceIdHigh\n//  - SpanId\ntype SpanRef struct {\n\tRefType     SpanRefType `thrift:\"refType,1,required\" json:\"refType\"`\n\tTraceIdLow  int64       `thrift:\"traceIdLow,2,required\" json:\"traceIdLow\"`\n\tTraceIdHigh int64       `thrift:\"traceIdHigh,3,required\" json:\"traceIdHigh\"`\n\tSpanId      int64       `thrift:\"spanId,4,required\" json:\"spanId\"`\n}\n\nfunc NewSpanRef() *SpanRef {\n\treturn &SpanRef{}\n}\n\nfunc (p *SpanRef) GetRefType() SpanRefType {\n\treturn p.RefType\n}\n\nfunc (p *SpanRef) GetTraceIdLow() int64 {\n\treturn p.TraceIdLow\n}\n\nfunc (p *SpanRef) GetTraceIdHigh() int64 {\n\treturn p.TraceIdHigh\n}\n\nfunc (p *SpanRef) GetSpanId() int64 {\n\treturn p.SpanId\n}\nfunc (p *SpanRef) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetRefType bool = false\n\tvar issetTraceIdLow bool = false\n\tvar issetTraceIdHigh bool = false\n\tvar issetSpanId bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetRefType = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetTraceIdLow = true\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetTraceIdHigh = true\n\t\tcase 4:\n\t\t\tif err := p.readField4(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetSpanId = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetRefType {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field RefType is not set\"))\n\t}\n\tif !issetTraceIdLow {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field TraceIdLow is not set\"))\n\t}\n\tif !issetTraceIdHigh {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field TraceIdHigh is not set\"))\n\t}\n\tif !issetSpanId {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field SpanId is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *SpanRef) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\ttemp := SpanRefType(v)\n\t\tp.RefType = temp\n\t}\n\treturn nil\n}\n\nfunc (p *SpanRef) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\tp.TraceIdLow = v\n\t}\n\treturn nil\n}\n\nfunc (p *SpanRef) readField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 3: \", err)\n\t} else {\n\t\tp.TraceIdHigh = v\n\t}\n\treturn nil\n}\n\nfunc (p *SpanRef) readField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 4: \", err)\n\t} else {\n\t\tp.SpanId = v\n\t}\n\treturn nil\n}\n\nfunc (p *SpanRef) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"SpanRef\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField4(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *SpanRef) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"refType\", thrift.I32, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:refType: \", p), err)\n\t}\n\tif err := oprot.WriteI32(int32(p.RefType)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.refType (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:refType: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *SpanRef) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"traceIdLow\", thrift.I64, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:traceIdLow: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.traceIdLow (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:traceIdLow: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *SpanRef) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"traceIdHigh\", thrift.I64, 3); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:traceIdHigh: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.traceIdHigh (3) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:traceIdHigh: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *SpanRef) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"spanId\", thrift.I64, 4); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 4:spanId: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.SpanId)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.spanId (4) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 4:spanId: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *SpanRef) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"SpanRef(%+v)\", *p)\n}\n\n// Attributes:\n//  - TraceIdLow\n//  - TraceIdHigh\n//  - SpanId\n//  - ParentSpanId\n//  - OperationName\n//  - References\n//  - Flags\n//  - StartTime\n//  - Duration\n//  - Tags\n//  - Logs\ntype Span struct {\n\tTraceIdLow    int64      `thrift:\"traceIdLow,1,required\" json:\"traceIdLow\"`\n\tTraceIdHigh   int64      `thrift:\"traceIdHigh,2,required\" json:\"traceIdHigh\"`\n\tSpanId        int64      `thrift:\"spanId,3,required\" json:\"spanId\"`\n\tParentSpanId  int64      `thrift:\"parentSpanId,4,required\" json:\"parentSpanId\"`\n\tOperationName string     `thrift:\"operationName,5,required\" json:\"operationName\"`\n\tReferences    []*SpanRef `thrift:\"references,6\" json:\"references,omitempty\"`\n\tFlags         int32      `thrift:\"flags,7,required\" json:\"flags\"`\n\tStartTime     int64      `thrift:\"startTime,8,required\" json:\"startTime\"`\n\tDuration      int64      `thrift:\"duration,9,required\" json:\"duration\"`\n\tTags          []*Tag     `thrift:\"tags,10\" json:\"tags,omitempty\"`\n\tLogs          []*Log     `thrift:\"logs,11\" json:\"logs,omitempty\"`\n}\n\nfunc NewSpan() *Span {\n\treturn &Span{}\n}\n\nfunc (p *Span) GetTraceIdLow() int64 {\n\treturn p.TraceIdLow\n}\n\nfunc (p *Span) GetTraceIdHigh() int64 {\n\treturn p.TraceIdHigh\n}\n\nfunc (p *Span) GetSpanId() int64 {\n\treturn p.SpanId\n}\n\nfunc (p *Span) GetParentSpanId() int64 {\n\treturn p.ParentSpanId\n}\n\nfunc (p *Span) GetOperationName() string {\n\treturn p.OperationName\n}\n\nvar Span_References_DEFAULT []*SpanRef\n\nfunc (p *Span) GetReferences() []*SpanRef {\n\treturn p.References\n}\n\nfunc (p *Span) GetFlags() int32 {\n\treturn p.Flags\n}\n\nfunc (p *Span) GetStartTime() int64 {\n\treturn p.StartTime\n}\n\nfunc (p *Span) GetDuration() int64 {\n\treturn p.Duration\n}\n\nvar Span_Tags_DEFAULT []*Tag\n\nfunc (p *Span) GetTags() []*Tag {\n\treturn p.Tags\n}\n\nvar Span_Logs_DEFAULT []*Log\n\nfunc (p *Span) GetLogs() []*Log {\n\treturn p.Logs\n}\nfunc (p *Span) IsSetReferences() bool {\n\treturn p.References != nil\n}\n\nfunc (p *Span) IsSetTags() bool {\n\treturn p.Tags != nil\n}\n\nfunc (p *Span) IsSetLogs() bool {\n\treturn p.Logs != nil\n}\n\nfunc (p *Span) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetTraceIdLow bool = false\n\tvar issetTraceIdHigh bool = false\n\tvar issetSpanId bool = false\n\tvar issetParentSpanId bool = false\n\tvar issetOperationName bool = false\n\tvar issetFlags bool = false\n\tvar issetStartTime bool = false\n\tvar issetDuration bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetTraceIdLow = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetTraceIdHigh = true\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetSpanId = true\n\t\tcase 4:\n\t\t\tif err := p.readField4(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetParentSpanId = true\n\t\tcase 5:\n\t\t\tif err := p.readField5(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetOperationName = true\n\t\tcase 6:\n\t\t\tif err := p.readField6(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 7:\n\t\t\tif err := p.readField7(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetFlags = true\n\t\tcase 8:\n\t\t\tif err := p.readField8(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetStartTime = true\n\t\tcase 9:\n\t\t\tif err := p.readField9(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetDuration = true\n\t\tcase 10:\n\t\t\tif err := p.readField10(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 11:\n\t\t\tif err := p.readField11(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetTraceIdLow {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field TraceIdLow is not set\"))\n\t}\n\tif !issetTraceIdHigh {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field TraceIdHigh is not set\"))\n\t}\n\tif !issetSpanId {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field SpanId is not set\"))\n\t}\n\tif !issetParentSpanId {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field ParentSpanId is not set\"))\n\t}\n\tif !issetOperationName {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field OperationName is not set\"))\n\t}\n\tif !issetFlags {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Flags is not set\"))\n\t}\n\tif !issetStartTime {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field StartTime is not set\"))\n\t}\n\tif !issetDuration {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Duration is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.TraceIdLow = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\tp.TraceIdHigh = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 3: \", err)\n\t} else {\n\t\tp.SpanId = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 4: \", err)\n\t} else {\n\t\tp.ParentSpanId = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 5: \", err)\n\t} else {\n\t\tp.OperationName = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField6(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*SpanRef, 0, size)\n\tp.References = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem1 := &SpanRef{}\n\t\tif err := _elem1.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem1), err)\n\t\t}\n\t\tp.References = append(p.References, _elem1)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField7(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 7: \", err)\n\t} else {\n\t\tp.Flags = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField8(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 8: \", err)\n\t} else {\n\t\tp.StartTime = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField9(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 9: \", err)\n\t} else {\n\t\tp.Duration = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField10(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Tag, 0, size)\n\tp.Tags = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem2 := &Tag{}\n\t\tif err := _elem2.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem2), err)\n\t\t}\n\t\tp.Tags = append(p.Tags, _elem2)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField11(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Log, 0, size)\n\tp.Logs = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem3 := &Log{}\n\t\tif err := _elem3.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem3), err)\n\t\t}\n\t\tp.Logs = append(p.Logs, _elem3)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Span\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField4(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField5(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField6(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField7(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField8(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField9(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField10(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField11(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"traceIdLow\", thrift.I64, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:traceIdLow: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.traceIdLow (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:traceIdLow: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"traceIdHigh\", thrift.I64, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:traceIdHigh: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.traceIdHigh (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:traceIdHigh: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"spanId\", thrift.I64, 3); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:spanId: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.SpanId)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.spanId (3) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:spanId: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"parentSpanId\", thrift.I64, 4); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 4:parentSpanId: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.ParentSpanId)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.parentSpanId (4) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 4:parentSpanId: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField5(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"operationName\", thrift.STRING, 5); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 5:operationName: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.OperationName)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.operationName (5) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 5:operationName: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField6(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetReferences() {\n\t\tif err := oprot.WriteFieldBegin(\"references\", thrift.LIST, 6); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 6:references: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.References)); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t\t}\n\t\tfor _, v := range p.References {\n\t\t\tif err := v.Write(oprot); err != nil {\n\t\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteListEnd(); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 6:references: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField7(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"flags\", thrift.I32, 7); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 7:flags: \", p), err)\n\t}\n\tif err := oprot.WriteI32(int32(p.Flags)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.flags (7) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 7:flags: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField8(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"startTime\", thrift.I64, 8); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 8:startTime: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.StartTime)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.startTime (8) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 8:startTime: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField9(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"duration\", thrift.I64, 9); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 9:duration: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.Duration)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.duration (9) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 9:duration: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField10(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetTags() {\n\t\tif err := oprot.WriteFieldBegin(\"tags\", thrift.LIST, 10); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 10:tags: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t\t}\n\t\tfor _, v := range p.Tags {\n\t\t\tif err := v.Write(oprot); err != nil {\n\t\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteListEnd(); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 10:tags: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField11(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetLogs() {\n\t\tif err := oprot.WriteFieldBegin(\"logs\", thrift.LIST, 11); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 11:logs: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Logs)); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t\t}\n\t\tfor _, v := range p.Logs {\n\t\t\tif err := v.Write(oprot); err != nil {\n\t\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteListEnd(); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 11:logs: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Span) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Span(%+v)\", *p)\n}\n\n// Attributes:\n//  - ServiceName\n//  - Tags\ntype Process struct {\n\tServiceName string `thrift:\"serviceName,1,required\" json:\"serviceName\"`\n\tTags        []*Tag `thrift:\"tags,2\" json:\"tags,omitempty\"`\n}\n\nfunc NewProcess() *Process {\n\treturn &Process{}\n}\n\nfunc (p *Process) GetServiceName() string {\n\treturn p.ServiceName\n}\n\nvar Process_Tags_DEFAULT []*Tag\n\nfunc (p *Process) GetTags() []*Tag {\n\treturn p.Tags\n}\nfunc (p *Process) IsSetTags() bool {\n\treturn p.Tags != nil\n}\n\nfunc (p *Process) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetServiceName bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetServiceName = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetServiceName {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field ServiceName is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *Process) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.ServiceName = v\n\t}\n\treturn nil\n}\n\nfunc (p *Process) readField2(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Tag, 0, size)\n\tp.Tags = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem4 := &Tag{}\n\t\tif err := _elem4.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem4), err)\n\t\t}\n\t\tp.Tags = append(p.Tags, _elem4)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Process) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Process\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Process) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"serviceName\", thrift.STRING, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:serviceName: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.ServiceName)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.serviceName (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:serviceName: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Process) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetTags() {\n\t\tif err := oprot.WriteFieldBegin(\"tags\", thrift.LIST, 2); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:tags: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t\t}\n\t\tfor _, v := range p.Tags {\n\t\t\tif err := v.Write(oprot); err != nil {\n\t\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteListEnd(); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:tags: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Process) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Process(%+v)\", *p)\n}\n\n// Attributes:\n//  - Process\n//  - Spans\ntype Batch struct {\n\tProcess *Process `thrift:\"process,1,required\" json:\"process\"`\n\tSpans   []*Span  `thrift:\"spans,2,required\" json:\"spans\"`\n}\n\nfunc NewBatch() *Batch {\n\treturn &Batch{}\n}\n\nvar Batch_Process_DEFAULT *Process\n\nfunc (p *Batch) GetProcess() *Process {\n\tif !p.IsSetProcess() {\n\t\treturn Batch_Process_DEFAULT\n\t}\n\treturn p.Process\n}\n\nfunc (p *Batch) GetSpans() []*Span {\n\treturn p.Spans\n}\nfunc (p *Batch) IsSetProcess() bool {\n\treturn p.Process != nil\n}\n\nfunc (p *Batch) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetProcess bool = false\n\tvar issetSpans bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetProcess = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetSpans = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetProcess {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Process is not set\"))\n\t}\n\tif !issetSpans {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Spans is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *Batch) readField1(iprot thrift.TProtocol) error {\n\tp.Process = &Process{}\n\tif err := p.Process.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.Process), err)\n\t}\n\treturn nil\n}\n\nfunc (p *Batch) readField2(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Span, 0, size)\n\tp.Spans = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem5 := &Span{}\n\t\tif err := _elem5.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem5), err)\n\t\t}\n\t\tp.Spans = append(p.Spans, _elem5)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Batch) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Batch\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Batch) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"process\", thrift.STRUCT, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:process: \", p), err)\n\t}\n\tif err := p.Process.Write(oprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.Process), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:process: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Batch) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"spans\", thrift.LIST, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:spans: \", p), err)\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil {\n\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t}\n\tfor _, v := range p.Spans {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:spans: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Batch) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Batch(%+v)\", *p)\n}\n\n// Attributes:\n//  - Ok\ntype BatchSubmitResponse struct {\n\tOk bool `thrift:\"ok,1,required\" json:\"ok\"`\n}\n\nfunc NewBatchSubmitResponse() *BatchSubmitResponse {\n\treturn &BatchSubmitResponse{}\n}\n\nfunc (p *BatchSubmitResponse) GetOk() bool {\n\treturn p.Ok\n}\nfunc (p *BatchSubmitResponse) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetOk bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetOk = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetOk {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Ok is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *BatchSubmitResponse) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadBool(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Ok = v\n\t}\n\treturn nil\n}\n\nfunc (p *BatchSubmitResponse) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"BatchSubmitResponse\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *BatchSubmitResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"ok\", thrift.BOOL, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:ok: \", p), err)\n\t}\n\tif err := oprot.WriteBool(bool(p.Ok)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.ok (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:ok: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *BatchSubmitResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BatchSubmitResponse(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage sampling\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nfunc init() {\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage sampling\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\ntype SamplingManager interface {\n\t// Parameters:\n\t//  - ServiceName\n\tGetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error)\n}\n\ntype SamplingManagerClient struct {\n\tTransport       thrift.TTransport\n\tProtocolFactory thrift.TProtocolFactory\n\tInputProtocol   thrift.TProtocol\n\tOutputProtocol  thrift.TProtocol\n\tSeqId           int32\n}\n\nfunc NewSamplingManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *SamplingManagerClient {\n\treturn &SamplingManagerClient{Transport: t,\n\t\tProtocolFactory: f,\n\t\tInputProtocol:   f.GetProtocol(t),\n\t\tOutputProtocol:  f.GetProtocol(t),\n\t\tSeqId:           0,\n\t}\n}\n\nfunc NewSamplingManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *SamplingManagerClient {\n\treturn &SamplingManagerClient{Transport: t,\n\t\tProtocolFactory: nil,\n\t\tInputProtocol:   iprot,\n\t\tOutputProtocol:  oprot,\n\t\tSeqId:           0,\n\t}\n}\n\n// Parameters:\n//  - ServiceName\nfunc (p *SamplingManagerClient) GetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error) {\n\tif err = p.sendGetSamplingStrategy(serviceName); err != nil {\n\t\treturn\n\t}\n\treturn p.recvGetSamplingStrategy()\n}\n\nfunc (p *SamplingManagerClient) sendGetSamplingStrategy(serviceName string) (err error) {\n\toprot := p.OutputProtocol\n\tif oprot == nil {\n\t\toprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.OutputProtocol = oprot\n\t}\n\tp.SeqId++\n\tif err = oprot.WriteMessageBegin(\"getSamplingStrategy\", thrift.CALL, p.SeqId); err != nil {\n\t\treturn\n\t}\n\targs := SamplingManagerGetSamplingStrategyArgs{\n\t\tServiceName: serviceName,\n\t}\n\tif err = args.Write(oprot); err != nil {\n\t\treturn\n\t}\n\tif err = oprot.WriteMessageEnd(); err != nil {\n\t\treturn\n\t}\n\treturn oprot.Flush()\n}\n\nfunc (p *SamplingManagerClient) recvGetSamplingStrategy() (value *SamplingStrategyResponse, err error) {\n\tiprot := p.InputProtocol\n\tif iprot == nil {\n\t\tiprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.InputProtocol = iprot\n\t}\n\tmethod, mTypeId, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn\n\t}\n\tif method != \"getSamplingStrategy\" {\n\t\terr = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, \"getSamplingStrategy failed: wrong method name\")\n\t\treturn\n\t}\n\tif p.SeqId != seqId {\n\t\terr = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, \"getSamplingStrategy failed: out of sequence response\")\n\t\treturn\n\t}\n\tif mTypeId == thrift.EXCEPTION {\n\t\terror1 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, \"Unknown Exception\")\n\t\tvar error2 error\n\t\terror2, err = error1.Read(iprot)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif err = iprot.ReadMessageEnd(); err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = error2\n\t\treturn\n\t}\n\tif mTypeId != thrift.REPLY {\n\t\terr = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, \"getSamplingStrategy failed: invalid message type\")\n\t\treturn\n\t}\n\tresult := SamplingManagerGetSamplingStrategyResult{}\n\tif err = result.Read(iprot); err != nil {\n\t\treturn\n\t}\n\tif err = iprot.ReadMessageEnd(); err != nil {\n\t\treturn\n\t}\n\tvalue = result.GetSuccess()\n\treturn\n}\n\ntype SamplingManagerProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      SamplingManager\n}\n\nfunc (p *SamplingManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *SamplingManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *SamplingManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewSamplingManagerProcessor(handler SamplingManager) *SamplingManagerProcessor {\n\n\tself3 := &SamplingManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself3.processorMap[\"getSamplingStrategy\"] = &samplingManagerProcessorGetSamplingStrategy{handler: handler}\n\treturn self3\n}\n\nfunc (p *SamplingManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx4 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx4.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush()\n\treturn false, x4\n\n}\n\ntype samplingManagerProcessorGetSamplingStrategy struct {\n\thandler SamplingManager\n}\n\nfunc (p *samplingManagerProcessorGetSamplingStrategy) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := SamplingManagerGetSamplingStrategyArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"getSamplingStrategy\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush()\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tresult := SamplingManagerGetSamplingStrategyResult{}\n\tvar retval *SamplingStrategyResponse\n\tvar err2 error\n\tif retval, err2 = p.handler.GetSamplingStrategy(args.ServiceName); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing getSamplingStrategy: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"getSamplingStrategy\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush()\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"getSamplingStrategy\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\n// HELPER FUNCTIONS AND STRUCTURES\n\n// Attributes:\n//  - ServiceName\ntype SamplingManagerGetSamplingStrategyArgs struct {\n\tServiceName string `thrift:\"serviceName,1\" json:\"serviceName\"`\n}\n\nfunc NewSamplingManagerGetSamplingStrategyArgs() *SamplingManagerGetSamplingStrategyArgs {\n\treturn &SamplingManagerGetSamplingStrategyArgs{}\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyArgs) GetServiceName() string {\n\treturn p.ServiceName\n}\nfunc (p *SamplingManagerGetSamplingStrategyArgs) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyArgs) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.ServiceName = v\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyArgs) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"getSamplingStrategy_args\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"serviceName\", thrift.STRING, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:serviceName: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.ServiceName)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.serviceName (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:serviceName: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"SamplingManagerGetSamplingStrategyArgs(%+v)\", *p)\n}\n\n// Attributes:\n//  - Success\ntype SamplingManagerGetSamplingStrategyResult struct {\n\tSuccess *SamplingStrategyResponse `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewSamplingManagerGetSamplingStrategyResult() *SamplingManagerGetSamplingStrategyResult {\n\treturn &SamplingManagerGetSamplingStrategyResult{}\n}\n\nvar SamplingManagerGetSamplingStrategyResult_Success_DEFAULT *SamplingStrategyResponse\n\nfunc (p *SamplingManagerGetSamplingStrategyResult) GetSuccess() *SamplingStrategyResponse {\n\tif !p.IsSetSuccess() {\n\t\treturn SamplingManagerGetSamplingStrategyResult_Success_DEFAULT\n\t}\n\treturn p.Success\n}\nfunc (p *SamplingManagerGetSamplingStrategyResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyResult) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif err := p.readField0(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyResult) readField0(iprot thrift.TProtocol) error {\n\tp.Success = &SamplingStrategyResponse{}\n\tif err := p.Success.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.Success), err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyResult) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"getSamplingStrategy_result\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField0(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err := oprot.WriteFieldBegin(\"success\", thrift.STRUCT, 0); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 0:success: \", p), err)\n\t\t}\n\t\tif err := p.Success.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.Success), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 0:success: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *SamplingManagerGetSamplingStrategyResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"SamplingManagerGetSamplingStrategyResult(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage sampling\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nvar GoUnusedProtection__ int\n\ntype SamplingStrategyType int64\n\nconst (\n\tSamplingStrategyType_PROBABILISTIC SamplingStrategyType = 0\n\tSamplingStrategyType_RATE_LIMITING SamplingStrategyType = 1\n)\n\nfunc (p SamplingStrategyType) String() string {\n\tswitch p {\n\tcase SamplingStrategyType_PROBABILISTIC:\n\t\treturn \"PROBABILISTIC\"\n\tcase SamplingStrategyType_RATE_LIMITING:\n\t\treturn \"RATE_LIMITING\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc SamplingStrategyTypeFromString(s string) (SamplingStrategyType, error) {\n\tswitch s {\n\tcase \"PROBABILISTIC\":\n\t\treturn SamplingStrategyType_PROBABILISTIC, nil\n\tcase \"RATE_LIMITING\":\n\t\treturn SamplingStrategyType_RATE_LIMITING, nil\n\t}\n\treturn SamplingStrategyType(0), fmt.Errorf(\"not a valid SamplingStrategyType string\")\n}\n\nfunc SamplingStrategyTypePtr(v SamplingStrategyType) *SamplingStrategyType { return &v }\n\nfunc (p SamplingStrategyType) MarshalText() ([]byte, error) {\n\treturn []byte(p.String()), nil\n}\n\nfunc (p *SamplingStrategyType) UnmarshalText(text []byte) error {\n\tq, err := SamplingStrategyTypeFromString(string(text))\n\tif err != nil {\n\t\treturn err\n\t}\n\t*p = q\n\treturn nil\n}\n\n// Attributes:\n//  - SamplingRate\ntype ProbabilisticSamplingStrategy struct {\n\tSamplingRate float64 `thrift:\"samplingRate,1,required\" json:\"samplingRate\"`\n}\n\nfunc NewProbabilisticSamplingStrategy() *ProbabilisticSamplingStrategy {\n\treturn &ProbabilisticSamplingStrategy{}\n}\n\nfunc (p *ProbabilisticSamplingStrategy) GetSamplingRate() float64 {\n\treturn p.SamplingRate\n}\nfunc (p *ProbabilisticSamplingStrategy) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetSamplingRate bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetSamplingRate = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetSamplingRate {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field SamplingRate is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *ProbabilisticSamplingStrategy) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadDouble(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.SamplingRate = v\n\t}\n\treturn nil\n}\n\nfunc (p *ProbabilisticSamplingStrategy) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"ProbabilisticSamplingStrategy\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *ProbabilisticSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"samplingRate\", thrift.DOUBLE, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:samplingRate: \", p), err)\n\t}\n\tif err := oprot.WriteDouble(float64(p.SamplingRate)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.samplingRate (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:samplingRate: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *ProbabilisticSamplingStrategy) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ProbabilisticSamplingStrategy(%+v)\", *p)\n}\n\n// Attributes:\n//  - MaxTracesPerSecond\ntype RateLimitingSamplingStrategy struct {\n\tMaxTracesPerSecond int16 `thrift:\"maxTracesPerSecond,1,required\" json:\"maxTracesPerSecond\"`\n}\n\nfunc NewRateLimitingSamplingStrategy() *RateLimitingSamplingStrategy {\n\treturn &RateLimitingSamplingStrategy{}\n}\n\nfunc (p *RateLimitingSamplingStrategy) GetMaxTracesPerSecond() int16 {\n\treturn p.MaxTracesPerSecond\n}\nfunc (p *RateLimitingSamplingStrategy) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetMaxTracesPerSecond bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetMaxTracesPerSecond = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetMaxTracesPerSecond {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field MaxTracesPerSecond is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *RateLimitingSamplingStrategy) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI16(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.MaxTracesPerSecond = v\n\t}\n\treturn nil\n}\n\nfunc (p *RateLimitingSamplingStrategy) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"RateLimitingSamplingStrategy\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *RateLimitingSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"maxTracesPerSecond\", thrift.I16, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:maxTracesPerSecond: \", p), err)\n\t}\n\tif err := oprot.WriteI16(int16(p.MaxTracesPerSecond)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.maxTracesPerSecond (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:maxTracesPerSecond: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *RateLimitingSamplingStrategy) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"RateLimitingSamplingStrategy(%+v)\", *p)\n}\n\n// Attributes:\n//  - Operation\n//  - ProbabilisticSampling\ntype OperationSamplingStrategy struct {\n\tOperation             string                         `thrift:\"operation,1,required\" json:\"operation\"`\n\tProbabilisticSampling *ProbabilisticSamplingStrategy `thrift:\"probabilisticSampling,2,required\" json:\"probabilisticSampling\"`\n}\n\nfunc NewOperationSamplingStrategy() *OperationSamplingStrategy {\n\treturn &OperationSamplingStrategy{}\n}\n\nfunc (p *OperationSamplingStrategy) GetOperation() string {\n\treturn p.Operation\n}\n\nvar OperationSamplingStrategy_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy\n\nfunc (p *OperationSamplingStrategy) GetProbabilisticSampling() *ProbabilisticSamplingStrategy {\n\tif !p.IsSetProbabilisticSampling() {\n\t\treturn OperationSamplingStrategy_ProbabilisticSampling_DEFAULT\n\t}\n\treturn p.ProbabilisticSampling\n}\nfunc (p *OperationSamplingStrategy) IsSetProbabilisticSampling() bool {\n\treturn p.ProbabilisticSampling != nil\n}\n\nfunc (p *OperationSamplingStrategy) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetOperation bool = false\n\tvar issetProbabilisticSampling bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetOperation = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetProbabilisticSampling = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetOperation {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Operation is not set\"))\n\t}\n\tif !issetProbabilisticSampling {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field ProbabilisticSampling is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *OperationSamplingStrategy) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Operation = v\n\t}\n\treturn nil\n}\n\nfunc (p *OperationSamplingStrategy) readField2(iprot thrift.TProtocol) error {\n\tp.ProbabilisticSampling = &ProbabilisticSamplingStrategy{}\n\tif err := p.ProbabilisticSampling.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.ProbabilisticSampling), err)\n\t}\n\treturn nil\n}\n\nfunc (p *OperationSamplingStrategy) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"OperationSamplingStrategy\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *OperationSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"operation\", thrift.STRING, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:operation: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.Operation)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.operation (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:operation: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *OperationSamplingStrategy) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"probabilisticSampling\", thrift.STRUCT, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:probabilisticSampling: \", p), err)\n\t}\n\tif err := p.ProbabilisticSampling.Write(oprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.ProbabilisticSampling), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:probabilisticSampling: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *OperationSamplingStrategy) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"OperationSamplingStrategy(%+v)\", *p)\n}\n\n// Attributes:\n//  - DefaultSamplingProbability\n//  - DefaultLowerBoundTracesPerSecond\n//  - PerOperationStrategies\n//  - DefaultUpperBoundTracesPerSecond\ntype PerOperationSamplingStrategies struct {\n\tDefaultSamplingProbability       float64                      `thrift:\"defaultSamplingProbability,1,required\" json:\"defaultSamplingProbability\"`\n\tDefaultLowerBoundTracesPerSecond float64                      `thrift:\"defaultLowerBoundTracesPerSecond,2,required\" json:\"defaultLowerBoundTracesPerSecond\"`\n\tPerOperationStrategies           []*OperationSamplingStrategy `thrift:\"perOperationStrategies,3,required\" json:\"perOperationStrategies\"`\n\tDefaultUpperBoundTracesPerSecond *float64                     `thrift:\"defaultUpperBoundTracesPerSecond,4\" json:\"defaultUpperBoundTracesPerSecond,omitempty\"`\n}\n\nfunc NewPerOperationSamplingStrategies() *PerOperationSamplingStrategies {\n\treturn &PerOperationSamplingStrategies{}\n}\n\nfunc (p *PerOperationSamplingStrategies) GetDefaultSamplingProbability() float64 {\n\treturn p.DefaultSamplingProbability\n}\n\nfunc (p *PerOperationSamplingStrategies) GetDefaultLowerBoundTracesPerSecond() float64 {\n\treturn p.DefaultLowerBoundTracesPerSecond\n}\n\nfunc (p *PerOperationSamplingStrategies) GetPerOperationStrategies() []*OperationSamplingStrategy {\n\treturn p.PerOperationStrategies\n}\n\nvar PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT float64\n\nfunc (p *PerOperationSamplingStrategies) GetDefaultUpperBoundTracesPerSecond() float64 {\n\tif !p.IsSetDefaultUpperBoundTracesPerSecond() {\n\t\treturn PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT\n\t}\n\treturn *p.DefaultUpperBoundTracesPerSecond\n}\nfunc (p *PerOperationSamplingStrategies) IsSetDefaultUpperBoundTracesPerSecond() bool {\n\treturn p.DefaultUpperBoundTracesPerSecond != nil\n}\n\nfunc (p *PerOperationSamplingStrategies) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetDefaultSamplingProbability bool = false\n\tvar issetDefaultLowerBoundTracesPerSecond bool = false\n\tvar issetPerOperationStrategies bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetDefaultSamplingProbability = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetDefaultLowerBoundTracesPerSecond = true\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetPerOperationStrategies = true\n\t\tcase 4:\n\t\t\tif err := p.readField4(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetDefaultSamplingProbability {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field DefaultSamplingProbability is not set\"))\n\t}\n\tif !issetDefaultLowerBoundTracesPerSecond {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field DefaultLowerBoundTracesPerSecond is not set\"))\n\t}\n\tif !issetPerOperationStrategies {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field PerOperationStrategies is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *PerOperationSamplingStrategies) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadDouble(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.DefaultSamplingProbability = v\n\t}\n\treturn nil\n}\n\nfunc (p *PerOperationSamplingStrategies) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadDouble(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\tp.DefaultLowerBoundTracesPerSecond = v\n\t}\n\treturn nil\n}\n\nfunc (p *PerOperationSamplingStrategies) readField3(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*OperationSamplingStrategy, 0, size)\n\tp.PerOperationStrategies = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem0 := &OperationSamplingStrategy{}\n\t\tif err := _elem0.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem0), err)\n\t\t}\n\t\tp.PerOperationStrategies = append(p.PerOperationStrategies, _elem0)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *PerOperationSamplingStrategies) readField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadDouble(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 4: \", err)\n\t} else {\n\t\tp.DefaultUpperBoundTracesPerSecond = &v\n\t}\n\treturn nil\n}\n\nfunc (p *PerOperationSamplingStrategies) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"PerOperationSamplingStrategies\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField4(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *PerOperationSamplingStrategies) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"defaultSamplingProbability\", thrift.DOUBLE, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:defaultSamplingProbability: \", p), err)\n\t}\n\tif err := oprot.WriteDouble(float64(p.DefaultSamplingProbability)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.defaultSamplingProbability (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:defaultSamplingProbability: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *PerOperationSamplingStrategies) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"defaultLowerBoundTracesPerSecond\", thrift.DOUBLE, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:defaultLowerBoundTracesPerSecond: \", p), err)\n\t}\n\tif err := oprot.WriteDouble(float64(p.DefaultLowerBoundTracesPerSecond)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.defaultLowerBoundTracesPerSecond (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:defaultLowerBoundTracesPerSecond: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *PerOperationSamplingStrategies) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"perOperationStrategies\", thrift.LIST, 3); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:perOperationStrategies: \", p), err)\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.PerOperationStrategies)); err != nil {\n\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t}\n\tfor _, v := range p.PerOperationStrategies {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:perOperationStrategies: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *PerOperationSamplingStrategies) writeField4(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetDefaultUpperBoundTracesPerSecond() {\n\t\tif err := oprot.WriteFieldBegin(\"defaultUpperBoundTracesPerSecond\", thrift.DOUBLE, 4); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 4:defaultUpperBoundTracesPerSecond: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteDouble(float64(*p.DefaultUpperBoundTracesPerSecond)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.defaultUpperBoundTracesPerSecond (4) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 4:defaultUpperBoundTracesPerSecond: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *PerOperationSamplingStrategies) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"PerOperationSamplingStrategies(%+v)\", *p)\n}\n\n// Attributes:\n//  - StrategyType\n//  - ProbabilisticSampling\n//  - RateLimitingSampling\n//  - OperationSampling\ntype SamplingStrategyResponse struct {\n\tStrategyType          SamplingStrategyType            `thrift:\"strategyType,1,required\" json:\"strategyType\"`\n\tProbabilisticSampling *ProbabilisticSamplingStrategy  `thrift:\"probabilisticSampling,2\" json:\"probabilisticSampling,omitempty\"`\n\tRateLimitingSampling  *RateLimitingSamplingStrategy   `thrift:\"rateLimitingSampling,3\" json:\"rateLimitingSampling,omitempty\"`\n\tOperationSampling     *PerOperationSamplingStrategies `thrift:\"operationSampling,4\" json:\"operationSampling,omitempty\"`\n}\n\nfunc NewSamplingStrategyResponse() *SamplingStrategyResponse {\n\treturn &SamplingStrategyResponse{}\n}\n\nfunc (p *SamplingStrategyResponse) GetStrategyType() SamplingStrategyType {\n\treturn p.StrategyType\n}\n\nvar SamplingStrategyResponse_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy\n\nfunc (p *SamplingStrategyResponse) GetProbabilisticSampling() *ProbabilisticSamplingStrategy {\n\tif !p.IsSetProbabilisticSampling() {\n\t\treturn SamplingStrategyResponse_ProbabilisticSampling_DEFAULT\n\t}\n\treturn p.ProbabilisticSampling\n}\n\nvar SamplingStrategyResponse_RateLimitingSampling_DEFAULT *RateLimitingSamplingStrategy\n\nfunc (p *SamplingStrategyResponse) GetRateLimitingSampling() *RateLimitingSamplingStrategy {\n\tif !p.IsSetRateLimitingSampling() {\n\t\treturn SamplingStrategyResponse_RateLimitingSampling_DEFAULT\n\t}\n\treturn p.RateLimitingSampling\n}\n\nvar SamplingStrategyResponse_OperationSampling_DEFAULT *PerOperationSamplingStrategies\n\nfunc (p *SamplingStrategyResponse) GetOperationSampling() *PerOperationSamplingStrategies {\n\tif !p.IsSetOperationSampling() {\n\t\treturn SamplingStrategyResponse_OperationSampling_DEFAULT\n\t}\n\treturn p.OperationSampling\n}\nfunc (p *SamplingStrategyResponse) IsSetProbabilisticSampling() bool {\n\treturn p.ProbabilisticSampling != nil\n}\n\nfunc (p *SamplingStrategyResponse) IsSetRateLimitingSampling() bool {\n\treturn p.RateLimitingSampling != nil\n}\n\nfunc (p *SamplingStrategyResponse) IsSetOperationSampling() bool {\n\treturn p.OperationSampling != nil\n}\n\nfunc (p *SamplingStrategyResponse) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetStrategyType bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetStrategyType = true\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 4:\n\t\t\tif err := p.readField4(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetStrategyType {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field StrategyType is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingStrategyResponse) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\ttemp := SamplingStrategyType(v)\n\t\tp.StrategyType = temp\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingStrategyResponse) readField2(iprot thrift.TProtocol) error {\n\tp.ProbabilisticSampling = &ProbabilisticSamplingStrategy{}\n\tif err := p.ProbabilisticSampling.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.ProbabilisticSampling), err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingStrategyResponse) readField3(iprot thrift.TProtocol) error {\n\tp.RateLimitingSampling = &RateLimitingSamplingStrategy{}\n\tif err := p.RateLimitingSampling.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.RateLimitingSampling), err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingStrategyResponse) readField4(iprot thrift.TProtocol) error {\n\tp.OperationSampling = &PerOperationSamplingStrategies{}\n\tif err := p.OperationSampling.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.OperationSampling), err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingStrategyResponse) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"SamplingStrategyResponse\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField4(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *SamplingStrategyResponse) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"strategyType\", thrift.I32, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:strategyType: \", p), err)\n\t}\n\tif err := oprot.WriteI32(int32(p.StrategyType)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.strategyType (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:strategyType: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *SamplingStrategyResponse) writeField2(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetProbabilisticSampling() {\n\t\tif err := oprot.WriteFieldBegin(\"probabilisticSampling\", thrift.STRUCT, 2); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:probabilisticSampling: \", p), err)\n\t\t}\n\t\tif err := p.ProbabilisticSampling.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.ProbabilisticSampling), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:probabilisticSampling: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *SamplingStrategyResponse) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetRateLimitingSampling() {\n\t\tif err := oprot.WriteFieldBegin(\"rateLimitingSampling\", thrift.STRUCT, 3); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:rateLimitingSampling: \", p), err)\n\t\t}\n\t\tif err := p.RateLimitingSampling.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.RateLimitingSampling), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:rateLimitingSampling: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *SamplingStrategyResponse) writeField4(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetOperationSampling() {\n\t\tif err := oprot.WriteFieldBegin(\"operationSampling\", thrift.STRUCT, 4); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 4:operationSampling: \", p), err)\n\t\t}\n\t\tif err := p.OperationSampling.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.OperationSampling), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 4:operationSampling: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *SamplingStrategyResponse) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"SamplingStrategyResponse(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage zipkincore\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nconst CLIENT_SEND = \"cs\"\nconst CLIENT_RECV = \"cr\"\nconst SERVER_SEND = \"ss\"\nconst SERVER_RECV = \"sr\"\nconst WIRE_SEND = \"ws\"\nconst WIRE_RECV = \"wr\"\nconst CLIENT_SEND_FRAGMENT = \"csf\"\nconst CLIENT_RECV_FRAGMENT = \"crf\"\nconst SERVER_SEND_FRAGMENT = \"ssf\"\nconst SERVER_RECV_FRAGMENT = \"srf\"\nconst LOCAL_COMPONENT = \"lc\"\nconst CLIENT_ADDR = \"ca\"\nconst SERVER_ADDR = \"sa\"\n\nfunc init() {\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage zipkincore\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nvar GoUnusedProtection__ int\n\ntype AnnotationType int64\n\nconst (\n\tAnnotationType_BOOL   AnnotationType = 0\n\tAnnotationType_BYTES  AnnotationType = 1\n\tAnnotationType_I16    AnnotationType = 2\n\tAnnotationType_I32    AnnotationType = 3\n\tAnnotationType_I64    AnnotationType = 4\n\tAnnotationType_DOUBLE AnnotationType = 5\n\tAnnotationType_STRING AnnotationType = 6\n)\n\nfunc (p AnnotationType) String() string {\n\tswitch p {\n\tcase AnnotationType_BOOL:\n\t\treturn \"BOOL\"\n\tcase AnnotationType_BYTES:\n\t\treturn \"BYTES\"\n\tcase AnnotationType_I16:\n\t\treturn \"I16\"\n\tcase AnnotationType_I32:\n\t\treturn \"I32\"\n\tcase AnnotationType_I64:\n\t\treturn \"I64\"\n\tcase AnnotationType_DOUBLE:\n\t\treturn \"DOUBLE\"\n\tcase AnnotationType_STRING:\n\t\treturn \"STRING\"\n\t}\n\treturn \"<UNSET>\"\n}\n\nfunc AnnotationTypeFromString(s string) (AnnotationType, error) {\n\tswitch s {\n\tcase \"BOOL\":\n\t\treturn AnnotationType_BOOL, nil\n\tcase \"BYTES\":\n\t\treturn AnnotationType_BYTES, nil\n\tcase \"I16\":\n\t\treturn AnnotationType_I16, nil\n\tcase \"I32\":\n\t\treturn AnnotationType_I32, nil\n\tcase \"I64\":\n\t\treturn AnnotationType_I64, nil\n\tcase \"DOUBLE\":\n\t\treturn AnnotationType_DOUBLE, nil\n\tcase \"STRING\":\n\t\treturn AnnotationType_STRING, nil\n\t}\n\treturn AnnotationType(0), fmt.Errorf(\"not a valid AnnotationType string\")\n}\n\nfunc AnnotationTypePtr(v AnnotationType) *AnnotationType { return &v }\n\nfunc (p AnnotationType) MarshalText() ([]byte, error) {\n\treturn []byte(p.String()), nil\n}\n\nfunc (p *AnnotationType) UnmarshalText(text []byte) error {\n\tq, err := AnnotationTypeFromString(string(text))\n\tif err != nil {\n\t\treturn err\n\t}\n\t*p = q\n\treturn nil\n}\n\n// Indicates the network context of a service recording an annotation with two\n// exceptions.\n//\n// When a BinaryAnnotation, and key is CLIENT_ADDR or SERVER_ADDR,\n// the endpoint indicates the source or destination of an RPC. This exception\n// allows zipkin to display network context of uninstrumented services, or\n// clients such as web browsers.\n//\n// Attributes:\n//  - Ipv4: IPv4 host address packed into 4 bytes.\n//\n// Ex for the ip 1.2.3.4, it would be (1 << 24) | (2 << 16) | (3 << 8) | 4\n//  - Port: IPv4 port\n//\n// Note: this is to be treated as an unsigned integer, so watch for negatives.\n//\n// Conventionally, when the port isn't known, port = 0.\n//  - ServiceName: Service name in lowercase, such as \"memcache\" or \"zipkin-web\"\n//\n// Conventionally, when the service name isn't known, service_name = \"unknown\".\ntype Endpoint struct {\n\tIpv4        int32  `thrift:\"ipv4,1\" json:\"ipv4\"`\n\tPort        int16  `thrift:\"port,2\" json:\"port\"`\n\tServiceName string `thrift:\"service_name,3\" json:\"service_name\"`\n}\n\nfunc NewEndpoint() *Endpoint {\n\treturn &Endpoint{}\n}\n\nfunc (p *Endpoint) GetIpv4() int32 {\n\treturn p.Ipv4\n}\n\nfunc (p *Endpoint) GetPort() int16 {\n\treturn p.Port\n}\n\nfunc (p *Endpoint) GetServiceName() string {\n\treturn p.ServiceName\n}\nfunc (p *Endpoint) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *Endpoint) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Ipv4 = v\n\t}\n\treturn nil\n}\n\nfunc (p *Endpoint) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI16(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\tp.Port = v\n\t}\n\treturn nil\n}\n\nfunc (p *Endpoint) readField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 3: \", err)\n\t} else {\n\t\tp.ServiceName = v\n\t}\n\treturn nil\n}\n\nfunc (p *Endpoint) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Endpoint\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Endpoint) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"ipv4\", thrift.I32, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:ipv4: \", p), err)\n\t}\n\tif err := oprot.WriteI32(int32(p.Ipv4)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.ipv4 (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:ipv4: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Endpoint) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"port\", thrift.I16, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:port: \", p), err)\n\t}\n\tif err := oprot.WriteI16(int16(p.Port)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.port (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:port: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Endpoint) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"service_name\", thrift.STRING, 3); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:service_name: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.ServiceName)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.service_name (3) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:service_name: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Endpoint) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Endpoint(%+v)\", *p)\n}\n\n// An annotation is similar to a log statement. It includes a host field which\n// allows these events to be attributed properly, and also aggregatable.\n//\n// Attributes:\n//  - Timestamp: Microseconds from epoch.\n//\n// This value should use the most precise value possible. For example,\n// gettimeofday or syncing nanoTime against a tick of currentTimeMillis.\n//  - Value\n//  - Host: Always the host that recorded the event. By specifying the host you allow\n// rollup of all events (such as client requests to a service) by IP address.\ntype Annotation struct {\n\tTimestamp int64     `thrift:\"timestamp,1\" json:\"timestamp\"`\n\tValue     string    `thrift:\"value,2\" json:\"value\"`\n\tHost      *Endpoint `thrift:\"host,3\" json:\"host,omitempty\"`\n}\n\nfunc NewAnnotation() *Annotation {\n\treturn &Annotation{}\n}\n\nfunc (p *Annotation) GetTimestamp() int64 {\n\treturn p.Timestamp\n}\n\nfunc (p *Annotation) GetValue() string {\n\treturn p.Value\n}\n\nvar Annotation_Host_DEFAULT *Endpoint\n\nfunc (p *Annotation) GetHost() *Endpoint {\n\tif !p.IsSetHost() {\n\t\treturn Annotation_Host_DEFAULT\n\t}\n\treturn p.Host\n}\nfunc (p *Annotation) IsSetHost() bool {\n\treturn p.Host != nil\n}\n\nfunc (p *Annotation) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *Annotation) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Timestamp = v\n\t}\n\treturn nil\n}\n\nfunc (p *Annotation) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\tp.Value = v\n\t}\n\treturn nil\n}\n\nfunc (p *Annotation) readField3(iprot thrift.TProtocol) error {\n\tp.Host = &Endpoint{}\n\tif err := p.Host.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.Host), err)\n\t}\n\treturn nil\n}\n\nfunc (p *Annotation) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Annotation\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Annotation) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"timestamp\", thrift.I64, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:timestamp: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.Timestamp)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.timestamp (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:timestamp: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Annotation) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"value\", thrift.STRING, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:value: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.Value)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.value (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:value: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Annotation) writeField3(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetHost() {\n\t\tif err := oprot.WriteFieldBegin(\"host\", thrift.STRUCT, 3); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:host: \", p), err)\n\t\t}\n\t\tif err := p.Host.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.Host), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:host: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Annotation) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Annotation(%+v)\", *p)\n}\n\n// Binary annotations are tags applied to a Span to give it context. For\n// example, a binary annotation of \"http.uri\" could the path to a resource in a\n// RPC call.\n//\n// Binary annotations of type STRING are always queryable, though more a\n// historical implementation detail than a structural concern.\n//\n// Binary annotations can repeat, and vary on the host. Similar to Annotation,\n// the host indicates who logged the event. This allows you to tell the\n// difference between the client and server side of the same key. For example,\n// the key \"http.uri\" might be different on the client and server side due to\n// rewriting, like \"/api/v1/myresource\" vs \"/myresource. Via the host field,\n// you can see the different points of view, which often help in debugging.\n//\n// Attributes:\n//  - Key\n//  - Value\n//  - AnnotationType\n//  - Host: The host that recorded tag, which allows you to differentiate between\n// multiple tags with the same key. There are two exceptions to this.\n//\n// When the key is CLIENT_ADDR or SERVER_ADDR, host indicates the source or\n// destination of an RPC. This exception allows zipkin to display network\n// context of uninstrumented services, or clients such as web browsers.\ntype BinaryAnnotation struct {\n\tKey            string         `thrift:\"key,1\" json:\"key\"`\n\tValue          []byte         `thrift:\"value,2\" json:\"value\"`\n\tAnnotationType AnnotationType `thrift:\"annotation_type,3\" json:\"annotation_type\"`\n\tHost           *Endpoint      `thrift:\"host,4\" json:\"host,omitempty\"`\n}\n\nfunc NewBinaryAnnotation() *BinaryAnnotation {\n\treturn &BinaryAnnotation{}\n}\n\nfunc (p *BinaryAnnotation) GetKey() string {\n\treturn p.Key\n}\n\nfunc (p *BinaryAnnotation) GetValue() []byte {\n\treturn p.Value\n}\n\nfunc (p *BinaryAnnotation) GetAnnotationType() AnnotationType {\n\treturn p.AnnotationType\n}\n\nvar BinaryAnnotation_Host_DEFAULT *Endpoint\n\nfunc (p *BinaryAnnotation) GetHost() *Endpoint {\n\tif !p.IsSetHost() {\n\t\treturn BinaryAnnotation_Host_DEFAULT\n\t}\n\treturn p.Host\n}\nfunc (p *BinaryAnnotation) IsSetHost() bool {\n\treturn p.Host != nil\n}\n\nfunc (p *BinaryAnnotation) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 2:\n\t\t\tif err := p.readField2(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 4:\n\t\t\tif err := p.readField4(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *BinaryAnnotation) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Key = v\n\t}\n\treturn nil\n}\n\nfunc (p *BinaryAnnotation) readField2(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadBinary(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 2: \", err)\n\t} else {\n\t\tp.Value = v\n\t}\n\treturn nil\n}\n\nfunc (p *BinaryAnnotation) readField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI32(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 3: \", err)\n\t} else {\n\t\ttemp := AnnotationType(v)\n\t\tp.AnnotationType = temp\n\t}\n\treturn nil\n}\n\nfunc (p *BinaryAnnotation) readField4(iprot thrift.TProtocol) error {\n\tp.Host = &Endpoint{}\n\tif err := p.Host.Read(iprot); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", p.Host), err)\n\t}\n\treturn nil\n}\n\nfunc (p *BinaryAnnotation) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"BinaryAnnotation\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField2(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField4(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *BinaryAnnotation) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"key\", thrift.STRING, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:key: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.Key)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.key (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:key: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *BinaryAnnotation) writeField2(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"value\", thrift.STRING, 2); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 2:value: \", p), err)\n\t}\n\tif err := oprot.WriteBinary(p.Value); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.value (2) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 2:value: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *BinaryAnnotation) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"annotation_type\", thrift.I32, 3); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:annotation_type: \", p), err)\n\t}\n\tif err := oprot.WriteI32(int32(p.AnnotationType)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.annotation_type (3) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:annotation_type: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *BinaryAnnotation) writeField4(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetHost() {\n\t\tif err := oprot.WriteFieldBegin(\"host\", thrift.STRUCT, 4); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 4:host: \", p), err)\n\t\t}\n\t\tif err := p.Host.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", p.Host), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 4:host: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *BinaryAnnotation) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"BinaryAnnotation(%+v)\", *p)\n}\n\n// A trace is a series of spans (often RPC calls) which form a latency tree.\n//\n// The root span is where trace_id = id and parent_id = Nil. The root span is\n// usually the longest interval in the trace, starting with a SERVER_RECV\n// annotation and ending with a SERVER_SEND.\n//\n// Attributes:\n//  - TraceID\n//  - Name: Span name in lowercase, rpc method for example\n//\n// Conventionally, when the span name isn't known, name = \"unknown\".\n//  - ID\n//  - ParentID\n//  - Annotations\n//  - BinaryAnnotations\n//  - Debug\n//  - Timestamp: Microseconds from epoch of the creation of this span.\n//\n// This value should be set directly by instrumentation, using the most\n// precise value possible. For example, gettimeofday or syncing nanoTime\n// against a tick of currentTimeMillis.\n//\n// For compatibilty with instrumentation that precede this field, collectors\n// or span stores can derive this via Annotation.timestamp.\n// For example, SERVER_RECV.timestamp or CLIENT_SEND.timestamp.\n//\n// This field is optional for compatibility with old data: first-party span\n// stores are expected to support this at time of introduction.\n//  - Duration: Measurement of duration in microseconds, used to support queries.\n//\n// This value should be set directly, where possible. Doing so encourages\n// precise measurement decoupled from problems of clocks, such as skew or NTP\n// updates causing time to move backwards.\n//\n// For compatibilty with instrumentation that precede this field, collectors\n// or span stores can derive this by subtracting Annotation.timestamp.\n// For example, SERVER_SEND.timestamp - SERVER_RECV.timestamp.\n//\n// If this field is persisted as unset, zipkin will continue to work, except\n// duration query support will be implementation-specific. Similarly, setting\n// this field non-atomically is implementation-specific.\n//\n// This field is i64 vs i32 to support spans longer than 35 minutes.\ntype Span struct {\n\tTraceID int64 `thrift:\"trace_id,1\" json:\"trace_id\"`\n\t// unused field # 2\n\tName        string        `thrift:\"name,3\" json:\"name\"`\n\tID          int64         `thrift:\"id,4\" json:\"id\"`\n\tParentID    *int64        `thrift:\"parent_id,5\" json:\"parent_id,omitempty\"`\n\tAnnotations []*Annotation `thrift:\"annotations,6\" json:\"annotations\"`\n\t// unused field # 7\n\tBinaryAnnotations []*BinaryAnnotation `thrift:\"binary_annotations,8\" json:\"binary_annotations\"`\n\tDebug             bool                `thrift:\"debug,9\" json:\"debug,omitempty\"`\n\tTimestamp         *int64              `thrift:\"timestamp,10\" json:\"timestamp,omitempty\"`\n\tDuration          *int64              `thrift:\"duration,11\" json:\"duration,omitempty\"`\n}\n\nfunc NewSpan() *Span {\n\treturn &Span{}\n}\n\nfunc (p *Span) GetTraceID() int64 {\n\treturn p.TraceID\n}\n\nfunc (p *Span) GetName() string {\n\treturn p.Name\n}\n\nfunc (p *Span) GetID() int64 {\n\treturn p.ID\n}\n\nvar Span_ParentID_DEFAULT int64\n\nfunc (p *Span) GetParentID() int64 {\n\tif !p.IsSetParentID() {\n\t\treturn Span_ParentID_DEFAULT\n\t}\n\treturn *p.ParentID\n}\n\nfunc (p *Span) GetAnnotations() []*Annotation {\n\treturn p.Annotations\n}\n\nfunc (p *Span) GetBinaryAnnotations() []*BinaryAnnotation {\n\treturn p.BinaryAnnotations\n}\n\nvar Span_Debug_DEFAULT bool = false\n\nfunc (p *Span) GetDebug() bool {\n\treturn p.Debug\n}\n\nvar Span_Timestamp_DEFAULT int64\n\nfunc (p *Span) GetTimestamp() int64 {\n\tif !p.IsSetTimestamp() {\n\t\treturn Span_Timestamp_DEFAULT\n\t}\n\treturn *p.Timestamp\n}\n\nvar Span_Duration_DEFAULT int64\n\nfunc (p *Span) GetDuration() int64 {\n\tif !p.IsSetDuration() {\n\t\treturn Span_Duration_DEFAULT\n\t}\n\treturn *p.Duration\n}\nfunc (p *Span) IsSetParentID() bool {\n\treturn p.ParentID != nil\n}\n\nfunc (p *Span) IsSetDebug() bool {\n\treturn p.Debug != Span_Debug_DEFAULT\n}\n\nfunc (p *Span) IsSetTimestamp() bool {\n\treturn p.Timestamp != nil\n}\n\nfunc (p *Span) IsSetDuration() bool {\n\treturn p.Duration != nil\n}\n\nfunc (p *Span) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 3:\n\t\t\tif err := p.readField3(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 4:\n\t\t\tif err := p.readField4(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 5:\n\t\t\tif err := p.readField5(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 6:\n\t\t\tif err := p.readField6(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 8:\n\t\t\tif err := p.readField8(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 9:\n\t\t\tif err := p.readField9(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 10:\n\t\t\tif err := p.readField10(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tcase 11:\n\t\t\tif err := p.readField11(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.TraceID = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField3(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadString(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 3: \", err)\n\t} else {\n\t\tp.Name = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField4(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 4: \", err)\n\t} else {\n\t\tp.ID = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField5(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 5: \", err)\n\t} else {\n\t\tp.ParentID = &v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField6(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Annotation, 0, size)\n\tp.Annotations = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem0 := &Annotation{}\n\t\tif err := _elem0.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem0), err)\n\t\t}\n\t\tp.Annotations = append(p.Annotations, _elem0)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField8(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*BinaryAnnotation, 0, size)\n\tp.BinaryAnnotations = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem1 := &BinaryAnnotation{}\n\t\tif err := _elem1.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem1), err)\n\t\t}\n\t\tp.BinaryAnnotations = append(p.BinaryAnnotations, _elem1)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField9(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadBool(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 9: \", err)\n\t} else {\n\t\tp.Debug = v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField10(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 10: \", err)\n\t} else {\n\t\tp.Timestamp = &v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) readField11(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadI64(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 11: \", err)\n\t} else {\n\t\tp.Duration = &v\n\t}\n\treturn nil\n}\n\nfunc (p *Span) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Span\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField3(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField4(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField5(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField6(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField8(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField9(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField10(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := p.writeField11(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Span) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"trace_id\", thrift.I64, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:trace_id: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.TraceID)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.trace_id (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:trace_id: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField3(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"name\", thrift.STRING, 3); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 3:name: \", p), err)\n\t}\n\tif err := oprot.WriteString(string(p.Name)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.name (3) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 3:name: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField4(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"id\", thrift.I64, 4); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 4:id: \", p), err)\n\t}\n\tif err := oprot.WriteI64(int64(p.ID)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.id (4) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 4:id: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField5(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetParentID() {\n\t\tif err := oprot.WriteFieldBegin(\"parent_id\", thrift.I64, 5); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 5:parent_id: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteI64(int64(*p.ParentID)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.parent_id (5) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 5:parent_id: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField6(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"annotations\", thrift.LIST, 6); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 6:annotations: \", p), err)\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Annotations)); err != nil {\n\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t}\n\tfor _, v := range p.Annotations {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 6:annotations: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField8(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"binary_annotations\", thrift.LIST, 8); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 8:binary_annotations: \", p), err)\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.BinaryAnnotations)); err != nil {\n\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t}\n\tfor _, v := range p.BinaryAnnotations {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 8:binary_annotations: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField9(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetDebug() {\n\t\tif err := oprot.WriteFieldBegin(\"debug\", thrift.BOOL, 9); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 9:debug: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteBool(bool(p.Debug)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.debug (9) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 9:debug: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField10(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetTimestamp() {\n\t\tif err := oprot.WriteFieldBegin(\"timestamp\", thrift.I64, 10); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 10:timestamp: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteI64(int64(*p.Timestamp)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.timestamp (10) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 10:timestamp: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Span) writeField11(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetDuration() {\n\t\tif err := oprot.WriteFieldBegin(\"duration\", thrift.I64, 11); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 11:duration: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteI64(int64(*p.Duration)); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.duration (11) field write error: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 11:duration: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *Span) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Span(%+v)\", *p)\n}\n\n// Attributes:\n//  - Ok\ntype Response struct {\n\tOk bool `thrift:\"ok,1,required\" json:\"ok\"`\n}\n\nfunc NewResponse() *Response {\n\treturn &Response{}\n}\n\nfunc (p *Response) GetOk() bool {\n\treturn p.Ok\n}\nfunc (p *Response) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tvar issetOk bool = false\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tissetOk = true\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\tif !issetOk {\n\t\treturn thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf(\"Required field Ok is not set\"))\n\t}\n\treturn nil\n}\n\nfunc (p *Response) readField1(iprot thrift.TProtocol) error {\n\tif v, err := iprot.ReadBool(); err != nil {\n\t\treturn thrift.PrependError(\"error reading field 1: \", err)\n\t} else {\n\t\tp.Ok = v\n\t}\n\treturn nil\n}\n\nfunc (p *Response) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"Response\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *Response) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"ok\", thrift.BOOL, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:ok: \", p), err)\n\t}\n\tif err := oprot.WriteBool(bool(p.Ok)); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T.ok (1) field write error: \", p), err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:ok: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *Response) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"Response(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go",
    "content": "// Autogenerated by Thrift Compiler (0.9.3)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage zipkincore\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/uber/jaeger-client-go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\ntype ZipkinCollector interface {\n\t// Parameters:\n\t//  - Spans\n\tSubmitZipkinBatch(spans []*Span) (r []*Response, err error)\n}\n\ntype ZipkinCollectorClient struct {\n\tTransport       thrift.TTransport\n\tProtocolFactory thrift.TProtocolFactory\n\tInputProtocol   thrift.TProtocol\n\tOutputProtocol  thrift.TProtocol\n\tSeqId           int32\n}\n\nfunc NewZipkinCollectorClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ZipkinCollectorClient {\n\treturn &ZipkinCollectorClient{Transport: t,\n\t\tProtocolFactory: f,\n\t\tInputProtocol:   f.GetProtocol(t),\n\t\tOutputProtocol:  f.GetProtocol(t),\n\t\tSeqId:           0,\n\t}\n}\n\nfunc NewZipkinCollectorClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ZipkinCollectorClient {\n\treturn &ZipkinCollectorClient{Transport: t,\n\t\tProtocolFactory: nil,\n\t\tInputProtocol:   iprot,\n\t\tOutputProtocol:  oprot,\n\t\tSeqId:           0,\n\t}\n}\n\n// Parameters:\n//  - Spans\nfunc (p *ZipkinCollectorClient) SubmitZipkinBatch(spans []*Span) (r []*Response, err error) {\n\tif err = p.sendSubmitZipkinBatch(spans); err != nil {\n\t\treturn\n\t}\n\treturn p.recvSubmitZipkinBatch()\n}\n\nfunc (p *ZipkinCollectorClient) sendSubmitZipkinBatch(spans []*Span) (err error) {\n\toprot := p.OutputProtocol\n\tif oprot == nil {\n\t\toprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.OutputProtocol = oprot\n\t}\n\tp.SeqId++\n\tif err = oprot.WriteMessageBegin(\"submitZipkinBatch\", thrift.CALL, p.SeqId); err != nil {\n\t\treturn\n\t}\n\targs := ZipkinCollectorSubmitZipkinBatchArgs{\n\t\tSpans: spans,\n\t}\n\tif err = args.Write(oprot); err != nil {\n\t\treturn\n\t}\n\tif err = oprot.WriteMessageEnd(); err != nil {\n\t\treturn\n\t}\n\treturn oprot.Flush()\n}\n\nfunc (p *ZipkinCollectorClient) recvSubmitZipkinBatch() (value []*Response, err error) {\n\tiprot := p.InputProtocol\n\tif iprot == nil {\n\t\tiprot = p.ProtocolFactory.GetProtocol(p.Transport)\n\t\tp.InputProtocol = iprot\n\t}\n\tmethod, mTypeId, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn\n\t}\n\tif method != \"submitZipkinBatch\" {\n\t\terr = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, \"submitZipkinBatch failed: wrong method name\")\n\t\treturn\n\t}\n\tif p.SeqId != seqId {\n\t\terr = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, \"submitZipkinBatch failed: out of sequence response\")\n\t\treturn\n\t}\n\tif mTypeId == thrift.EXCEPTION {\n\t\terror2 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, \"Unknown Exception\")\n\t\tvar error3 error\n\t\terror3, err = error2.Read(iprot)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif err = iprot.ReadMessageEnd(); err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = error3\n\t\treturn\n\t}\n\tif mTypeId != thrift.REPLY {\n\t\terr = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, \"submitZipkinBatch failed: invalid message type\")\n\t\treturn\n\t}\n\tresult := ZipkinCollectorSubmitZipkinBatchResult{}\n\tif err = result.Read(iprot); err != nil {\n\t\treturn\n\t}\n\tif err = iprot.ReadMessageEnd(); err != nil {\n\t\treturn\n\t}\n\tvalue = result.GetSuccess()\n\treturn\n}\n\ntype ZipkinCollectorProcessor struct {\n\tprocessorMap map[string]thrift.TProcessorFunction\n\thandler      ZipkinCollector\n}\n\nfunc (p *ZipkinCollectorProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {\n\tp.processorMap[key] = processor\n}\n\nfunc (p *ZipkinCollectorProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) {\n\tprocessor, ok = p.processorMap[key]\n\treturn processor, ok\n}\n\nfunc (p *ZipkinCollectorProcessor) ProcessorMap() map[string]thrift.TProcessorFunction {\n\treturn p.processorMap\n}\n\nfunc NewZipkinCollectorProcessor(handler ZipkinCollector) *ZipkinCollectorProcessor {\n\n\tself4 := &ZipkinCollectorProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)}\n\tself4.processorMap[\"submitZipkinBatch\"] = &zipkinCollectorProcessorSubmitZipkinBatch{handler: handler}\n\treturn self4\n}\n\nfunc (p *ZipkinCollectorProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\tname, _, seqId, err := iprot.ReadMessageBegin()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tif processor, ok := p.GetProcessorFunction(name); ok {\n\t\treturn processor.Process(seqId, iprot, oprot)\n\t}\n\tiprot.Skip(thrift.STRUCT)\n\tiprot.ReadMessageEnd()\n\tx5 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function \"+name)\n\toprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)\n\tx5.Write(oprot)\n\toprot.WriteMessageEnd()\n\toprot.Flush()\n\treturn false, x5\n\n}\n\ntype zipkinCollectorProcessorSubmitZipkinBatch struct {\n\thandler ZipkinCollector\n}\n\nfunc (p *zipkinCollectorProcessorSubmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) {\n\targs := ZipkinCollectorSubmitZipkinBatchArgs{}\n\tif err = args.Read(iprot); err != nil {\n\t\tiprot.ReadMessageEnd()\n\t\tx := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())\n\t\toprot.WriteMessageBegin(\"submitZipkinBatch\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush()\n\t\treturn false, err\n\t}\n\n\tiprot.ReadMessageEnd()\n\tresult := ZipkinCollectorSubmitZipkinBatchResult{}\n\tvar retval []*Response\n\tvar err2 error\n\tif retval, err2 = p.handler.SubmitZipkinBatch(args.Spans); err2 != nil {\n\t\tx := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, \"Internal error processing submitZipkinBatch: \"+err2.Error())\n\t\toprot.WriteMessageBegin(\"submitZipkinBatch\", thrift.EXCEPTION, seqId)\n\t\tx.Write(oprot)\n\t\toprot.WriteMessageEnd()\n\t\toprot.Flush()\n\t\treturn true, err2\n\t} else {\n\t\tresult.Success = retval\n\t}\n\tif err2 = oprot.WriteMessageBegin(\"submitZipkinBatch\", thrift.REPLY, seqId); err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = result.Write(oprot); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err2 = oprot.Flush(); err == nil && err2 != nil {\n\t\terr = err2\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\treturn true, err\n}\n\n// HELPER FUNCTIONS AND STRUCTURES\n\n// Attributes:\n//  - Spans\ntype ZipkinCollectorSubmitZipkinBatchArgs struct {\n\tSpans []*Span `thrift:\"spans,1\" json:\"spans\"`\n}\n\nfunc NewZipkinCollectorSubmitZipkinBatchArgs() *ZipkinCollectorSubmitZipkinBatchArgs {\n\treturn &ZipkinCollectorSubmitZipkinBatchArgs{}\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchArgs) GetSpans() []*Span {\n\treturn p.Spans\n}\nfunc (p *ZipkinCollectorSubmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 1:\n\t\t\tif err := p.readField1(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Span, 0, size)\n\tp.Spans = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem6 := &Span{}\n\t\tif err := _elem6.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem6), err)\n\t\t}\n\t\tp.Spans = append(p.Spans, _elem6)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"submitZipkinBatch_args\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField1(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) {\n\tif err := oprot.WriteFieldBegin(\"spans\", thrift.LIST, 1); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 1:spans: \", p), err)\n\t}\n\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil {\n\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t}\n\tfor _, v := range p.Spans {\n\t\tif err := v.Write(oprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t}\n\t}\n\tif err := oprot.WriteListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t}\n\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 1:spans: \", p), err)\n\t}\n\treturn err\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchArgs) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ZipkinCollectorSubmitZipkinBatchArgs(%+v)\", *p)\n}\n\n// Attributes:\n//  - Success\ntype ZipkinCollectorSubmitZipkinBatchResult struct {\n\tSuccess []*Response `thrift:\"success,0\" json:\"success,omitempty\"`\n}\n\nfunc NewZipkinCollectorSubmitZipkinBatchResult() *ZipkinCollectorSubmitZipkinBatchResult {\n\treturn &ZipkinCollectorSubmitZipkinBatchResult{}\n}\n\nvar ZipkinCollectorSubmitZipkinBatchResult_Success_DEFAULT []*Response\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchResult) GetSuccess() []*Response {\n\treturn p.Success\n}\nfunc (p *ZipkinCollectorSubmitZipkinBatchResult) IsSetSuccess() bool {\n\treturn p.Success != nil\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchResult) Read(iprot thrift.TProtocol) error {\n\tif _, err := iprot.ReadStructBegin(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)\n\t}\n\n\tfor {\n\t\t_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()\n\t\tif err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)\n\t\t}\n\t\tif fieldTypeId == thrift.STOP {\n\t\t\tbreak\n\t\t}\n\t\tswitch fieldId {\n\t\tcase 0:\n\t\t\tif err := p.readField0(iprot); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\tdefault:\n\t\t\tif err := iprot.Skip(fieldTypeId); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif err := iprot.ReadFieldEnd(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif err := iprot.ReadStructEnd(); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)\n\t}\n\treturn nil\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchResult) readField0(iprot thrift.TProtocol) error {\n\t_, size, err := iprot.ReadListBegin()\n\tif err != nil {\n\t\treturn thrift.PrependError(\"error reading list begin: \", err)\n\t}\n\ttSlice := make([]*Response, 0, size)\n\tp.Success = tSlice\n\tfor i := 0; i < size; i++ {\n\t\t_elem7 := &Response{}\n\t\tif err := _elem7.Read(iprot); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", _elem7), err)\n\t\t}\n\t\tp.Success = append(p.Success, _elem7)\n\t}\n\tif err := iprot.ReadListEnd(); err != nil {\n\t\treturn thrift.PrependError(\"error reading list end: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchResult) Write(oprot thrift.TProtocol) error {\n\tif err := oprot.WriteStructBegin(\"submitZipkinBatch_result\"); err != nil {\n\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err)\n\t}\n\tif err := p.writeField0(oprot); err != nil {\n\t\treturn err\n\t}\n\tif err := oprot.WriteFieldStop(); err != nil {\n\t\treturn thrift.PrependError(\"write field stop error: \", err)\n\t}\n\tif err := oprot.WriteStructEnd(); err != nil {\n\t\treturn thrift.PrependError(\"write struct stop error: \", err)\n\t}\n\treturn nil\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchResult) writeField0(oprot thrift.TProtocol) (err error) {\n\tif p.IsSetSuccess() {\n\t\tif err := oprot.WriteFieldBegin(\"success\", thrift.LIST, 0); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field begin error 0:success: \", p), err)\n\t\t}\n\t\tif err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list begin: \", err)\n\t\t}\n\t\tfor _, v := range p.Success {\n\t\t\tif err := v.Write(oprot); err != nil {\n\t\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", v), err)\n\t\t\t}\n\t\t}\n\t\tif err := oprot.WriteListEnd(); err != nil {\n\t\t\treturn thrift.PrependError(\"error writing list end: \", err)\n\t\t}\n\t\tif err := oprot.WriteFieldEnd(); err != nil {\n\t\t\treturn thrift.PrependError(fmt.Sprintf(\"%T write field end error 0:success: \", p), err)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *ZipkinCollectorSubmitZipkinBatchResult) String() string {\n\tif p == nil {\n\t\treturn \"<nil>\"\n\t}\n\treturn fmt.Sprintf(\"ZipkinCollectorSubmitZipkinBatchResult(%+v)\", *p)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/tracer.go",
    "content": "// Copyright (c) 2017-2018 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go\"\n\t\"github.com/opentracing/opentracing-go/ext\"\n\n\t\"github.com/uber/jaeger-client-go/internal/baggage\"\n\t\"github.com/uber/jaeger-client-go/internal/throttler\"\n\t\"github.com/uber/jaeger-client-go/log\"\n\t\"github.com/uber/jaeger-client-go/utils\"\n)\n\n// Tracer implements opentracing.Tracer.\ntype Tracer struct {\n\tserviceName string\n\thostIPv4    uint32 // this is for zipkin endpoint conversion\n\n\tsampler  Sampler\n\treporter Reporter\n\tmetrics  Metrics\n\tlogger   log.Logger\n\n\ttimeNow      func() time.Time\n\trandomNumber func() uint64\n\n\toptions struct {\n\t\tpoolSpans            bool\n\t\tgen128Bit            bool // whether to generate 128bit trace IDs\n\t\tzipkinSharedRPCSpan  bool\n\t\thighTraceIDGenerator func() uint64 // custom high trace ID generator\n\t\tmaxTagValueLength    int\n\t\t// more options to come\n\t}\n\t// pool for Span objects\n\tspanPool sync.Pool\n\n\tinjectors  map[interface{}]Injector\n\textractors map[interface{}]Extractor\n\n\tobserver compositeObserver\n\n\ttags    []Tag\n\tprocess Process\n\n\tbaggageRestrictionManager baggage.RestrictionManager\n\tbaggageSetter             *baggageSetter\n\n\tdebugThrottler throttler.Throttler\n}\n\n// NewTracer creates Tracer implementation that reports tracing to Jaeger.\n// The returned io.Closer can be used in shutdown hooks to ensure that the internal\n// queue of the Reporter is drained and all buffered spans are submitted to collectors.\nfunc NewTracer(\n\tserviceName string,\n\tsampler Sampler,\n\treporter Reporter,\n\toptions ...TracerOption,\n) (opentracing.Tracer, io.Closer) {\n\tt := &Tracer{\n\t\tserviceName: serviceName,\n\t\tsampler:     sampler,\n\t\treporter:    reporter,\n\t\tinjectors:   make(map[interface{}]Injector),\n\t\textractors:  make(map[interface{}]Extractor),\n\t\tmetrics:     *NewNullMetrics(),\n\t\tspanPool: sync.Pool{New: func() interface{} {\n\t\t\treturn &Span{}\n\t\t}},\n\t}\n\n\tfor _, option := range options {\n\t\toption(t)\n\t}\n\n\t// register default injectors/extractors unless they are already provided via options\n\ttextPropagator := newTextMapPropagator(getDefaultHeadersConfig(), t.metrics)\n\tt.addCodec(opentracing.TextMap, textPropagator, textPropagator)\n\n\thttpHeaderPropagator := newHTTPHeaderPropagator(getDefaultHeadersConfig(), t.metrics)\n\tt.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator)\n\n\tbinaryPropagator := newBinaryPropagator(t)\n\tt.addCodec(opentracing.Binary, binaryPropagator, binaryPropagator)\n\n\t// TODO remove after TChannel supports OpenTracing\n\tinteropPropagator := &jaegerTraceContextPropagator{tracer: t}\n\tt.addCodec(SpanContextFormat, interopPropagator, interopPropagator)\n\n\tzipkinPropagator := &zipkinPropagator{tracer: t}\n\tt.addCodec(ZipkinSpanFormat, zipkinPropagator, zipkinPropagator)\n\n\tif t.baggageRestrictionManager != nil {\n\t\tt.baggageSetter = newBaggageSetter(t.baggageRestrictionManager, &t.metrics)\n\t} else {\n\t\tt.baggageSetter = newBaggageSetter(baggage.NewDefaultRestrictionManager(0), &t.metrics)\n\t}\n\tif t.debugThrottler == nil {\n\t\tt.debugThrottler = throttler.DefaultThrottler{}\n\t}\n\n\tif t.randomNumber == nil {\n\t\trng := utils.NewRand(time.Now().UnixNano())\n\t\tt.randomNumber = func() uint64 {\n\t\t\treturn uint64(rng.Int63())\n\t\t}\n\t}\n\tif t.timeNow == nil {\n\t\tt.timeNow = time.Now\n\t}\n\tif t.logger == nil {\n\t\tt.logger = log.NullLogger\n\t}\n\t// Set tracer-level tags\n\tt.tags = append(t.tags, Tag{key: JaegerClientVersionTagKey, value: JaegerClientVersion})\n\tif hostname, err := os.Hostname(); err == nil {\n\t\tt.tags = append(t.tags, Tag{key: TracerHostnameTagKey, value: hostname})\n\t}\n\tif ip, err := utils.HostIP(); err == nil {\n\t\tt.tags = append(t.tags, Tag{key: TracerIPTagKey, value: ip.String()})\n\t\tt.hostIPv4 = utils.PackIPAsUint32(ip)\n\t} else {\n\t\tt.logger.Error(\"Unable to determine this host's IP address: \" + err.Error())\n\t}\n\n\tif t.options.gen128Bit {\n\t\tif t.options.highTraceIDGenerator == nil {\n\t\t\tt.options.highTraceIDGenerator = t.randomNumber\n\t\t}\n\t} else if t.options.highTraceIDGenerator != nil {\n\t\tt.logger.Error(\"Overriding high trace ID generator but not generating \" +\n\t\t\t\"128 bit trace IDs, consider enabling the \\\"Gen128Bit\\\" option\")\n\t}\n\tif t.options.maxTagValueLength == 0 {\n\t\tt.options.maxTagValueLength = DefaultMaxTagValueLength\n\t}\n\tt.process = Process{\n\t\tService: serviceName,\n\t\tUUID:    strconv.FormatUint(t.randomNumber(), 16),\n\t\tTags:    t.tags,\n\t}\n\tif throttler, ok := t.debugThrottler.(ProcessSetter); ok {\n\t\tthrottler.SetProcess(t.process)\n\t}\n\n\treturn t, t\n}\n\n// addCodec adds registers injector and extractor for given propagation format if not already defined.\nfunc (t *Tracer) addCodec(format interface{}, injector Injector, extractor Extractor) {\n\tif _, ok := t.injectors[format]; !ok {\n\t\tt.injectors[format] = injector\n\t}\n\tif _, ok := t.extractors[format]; !ok {\n\t\tt.extractors[format] = extractor\n\t}\n}\n\n// StartSpan implements StartSpan() method of opentracing.Tracer.\nfunc (t *Tracer) StartSpan(\n\toperationName string,\n\toptions ...opentracing.StartSpanOption,\n) opentracing.Span {\n\tsso := opentracing.StartSpanOptions{}\n\tfor _, o := range options {\n\t\to.Apply(&sso)\n\t}\n\treturn t.startSpanWithOptions(operationName, sso)\n}\n\nfunc (t *Tracer) startSpanWithOptions(\n\toperationName string,\n\toptions opentracing.StartSpanOptions,\n) opentracing.Span {\n\tif options.StartTime.IsZero() {\n\t\toptions.StartTime = t.timeNow()\n\t}\n\n\t// Predicate whether the given span context is a valid reference\n\t// which may be used as parent / debug ID / baggage items source\n\tisValidReference := func(ctx SpanContext) bool {\n\t\treturn ctx.IsValid() || ctx.isDebugIDContainerOnly() || len(ctx.baggage) != 0\n\t}\n\n\tvar references []Reference\n\tvar parent SpanContext\n\tvar hasParent bool // need this because `parent` is a value, not reference\n\tfor _, ref := range options.References {\n\t\tctx, ok := ref.ReferencedContext.(SpanContext)\n\t\tif !ok {\n\t\t\tt.logger.Error(fmt.Sprintf(\n\t\t\t\t\"Reference contains invalid type of SpanReference: %s\",\n\t\t\t\treflect.ValueOf(ref.ReferencedContext)))\n\t\t\tcontinue\n\t\t}\n\t\tif !isValidReference(ctx) {\n\t\t\tcontinue\n\t\t}\n\t\treferences = append(references, Reference{Type: ref.Type, Context: ctx})\n\t\tif !hasParent {\n\t\t\tparent = ctx\n\t\t\thasParent = ref.Type == opentracing.ChildOfRef\n\t\t}\n\t}\n\tif !hasParent && isValidReference(parent) {\n\t\t// If ChildOfRef wasn't found but a FollowFromRef exists, use the context from\n\t\t// the FollowFromRef as the parent\n\t\thasParent = true\n\t}\n\n\trpcServer := false\n\tif v, ok := options.Tags[ext.SpanKindRPCServer.Key]; ok {\n\t\trpcServer = (v == ext.SpanKindRPCServerEnum || v == string(ext.SpanKindRPCServerEnum))\n\t}\n\n\tvar samplerTags []Tag\n\tvar ctx SpanContext\n\tnewTrace := false\n\tif !hasParent || !parent.IsValid() {\n\t\tnewTrace = true\n\t\tctx.traceID.Low = t.randomID()\n\t\tif t.options.gen128Bit {\n\t\t\tctx.traceID.High = t.options.highTraceIDGenerator()\n\t\t}\n\t\tctx.spanID = SpanID(ctx.traceID.Low)\n\t\tctx.parentID = 0\n\t\tctx.flags = byte(0)\n\t\tif hasParent && parent.isDebugIDContainerOnly() && t.isDebugAllowed(operationName) {\n\t\t\tctx.flags |= (flagSampled | flagDebug)\n\t\t\tsamplerTags = []Tag{{key: JaegerDebugHeader, value: parent.debugID}}\n\t\t} else if sampled, tags := t.sampler.IsSampled(ctx.traceID, operationName); sampled {\n\t\t\tctx.flags |= flagSampled\n\t\t\tsamplerTags = tags\n\t\t}\n\t} else {\n\t\tctx.traceID = parent.traceID\n\t\tif rpcServer && t.options.zipkinSharedRPCSpan {\n\t\t\t// Support Zipkin's one-span-per-RPC model\n\t\t\tctx.spanID = parent.spanID\n\t\t\tctx.parentID = parent.parentID\n\t\t} else {\n\t\t\tctx.spanID = SpanID(t.randomID())\n\t\t\tctx.parentID = parent.spanID\n\t\t}\n\t\tctx.flags = parent.flags\n\t}\n\tif hasParent {\n\t\t// copy baggage items\n\t\tif l := len(parent.baggage); l > 0 {\n\t\t\tctx.baggage = make(map[string]string, len(parent.baggage))\n\t\t\tfor k, v := range parent.baggage {\n\t\t\t\tctx.baggage[k] = v\n\t\t\t}\n\t\t}\n\t}\n\n\tsp := t.newSpan()\n\tsp.context = ctx\n\tsp.observer = t.observer.OnStartSpan(sp, operationName, options)\n\treturn t.startSpanInternal(\n\t\tsp,\n\t\toperationName,\n\t\toptions.StartTime,\n\t\tsamplerTags,\n\t\toptions.Tags,\n\t\tnewTrace,\n\t\trpcServer,\n\t\treferences,\n\t)\n}\n\n// Inject implements Inject() method of opentracing.Tracer\nfunc (t *Tracer) Inject(ctx opentracing.SpanContext, format interface{}, carrier interface{}) error {\n\tc, ok := ctx.(SpanContext)\n\tif !ok {\n\t\treturn opentracing.ErrInvalidSpanContext\n\t}\n\tif injector, ok := t.injectors[format]; ok {\n\t\treturn injector.Inject(c, carrier)\n\t}\n\treturn opentracing.ErrUnsupportedFormat\n}\n\n// Extract implements Extract() method of opentracing.Tracer\nfunc (t *Tracer) Extract(\n\tformat interface{},\n\tcarrier interface{},\n) (opentracing.SpanContext, error) {\n\tif extractor, ok := t.extractors[format]; ok {\n\t\treturn extractor.Extract(carrier)\n\t}\n\treturn nil, opentracing.ErrUnsupportedFormat\n}\n\n// Close releases all resources used by the Tracer and flushes any remaining buffered spans.\nfunc (t *Tracer) Close() error {\n\tt.reporter.Close()\n\tt.sampler.Close()\n\tif mgr, ok := t.baggageRestrictionManager.(io.Closer); ok {\n\t\tmgr.Close()\n\t}\n\tif throttler, ok := t.debugThrottler.(io.Closer); ok {\n\t\tthrottler.Close()\n\t}\n\treturn nil\n}\n\n// Tags returns a slice of tracer-level tags.\nfunc (t *Tracer) Tags() []opentracing.Tag {\n\ttags := make([]opentracing.Tag, len(t.tags))\n\tfor i, tag := range t.tags {\n\t\ttags[i] = opentracing.Tag{Key: tag.key, Value: tag.value}\n\t}\n\treturn tags\n}\n\n// newSpan returns an instance of a clean Span object.\n// If options.PoolSpans is true, the spans are retrieved from an object pool.\nfunc (t *Tracer) newSpan() *Span {\n\tif !t.options.poolSpans {\n\t\treturn &Span{}\n\t}\n\tsp := t.spanPool.Get().(*Span)\n\tsp.context = emptyContext\n\tsp.tracer = nil\n\tsp.tags = nil\n\tsp.logs = nil\n\treturn sp\n}\n\nfunc (t *Tracer) startSpanInternal(\n\tsp *Span,\n\toperationName string,\n\tstartTime time.Time,\n\tinternalTags []Tag,\n\ttags opentracing.Tags,\n\tnewTrace bool,\n\trpcServer bool,\n\treferences []Reference,\n) *Span {\n\tsp.tracer = t\n\tsp.operationName = operationName\n\tsp.startTime = startTime\n\tsp.duration = 0\n\tsp.references = references\n\tsp.firstInProcess = rpcServer || sp.context.parentID == 0\n\tif len(tags) > 0 || len(internalTags) > 0 {\n\t\tsp.tags = make([]Tag, len(internalTags), len(tags)+len(internalTags))\n\t\tcopy(sp.tags, internalTags)\n\t\tfor k, v := range tags {\n\t\t\tsp.observer.OnSetTag(k, v)\n\t\t\tif k == string(ext.SamplingPriority) && !setSamplingPriority(sp, v) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsp.setTagNoLocking(k, v)\n\t\t}\n\t}\n\t// emit metrics\n\tif sp.context.IsSampled() {\n\t\tt.metrics.SpansStartedSampled.Inc(1)\n\t\tif newTrace {\n\t\t\t// We cannot simply check for parentID==0 because in Zipkin model the\n\t\t\t// server-side RPC span has the exact same trace/span/parent IDs as the\n\t\t\t// calling client-side span, but obviously the server side span is\n\t\t\t// no longer a root span of the trace.\n\t\t\tt.metrics.TracesStartedSampled.Inc(1)\n\t\t} else if sp.firstInProcess {\n\t\t\tt.metrics.TracesJoinedSampled.Inc(1)\n\t\t}\n\t} else {\n\t\tt.metrics.SpansStartedNotSampled.Inc(1)\n\t\tif newTrace {\n\t\t\tt.metrics.TracesStartedNotSampled.Inc(1)\n\t\t} else if sp.firstInProcess {\n\t\t\tt.metrics.TracesJoinedNotSampled.Inc(1)\n\t\t}\n\t}\n\treturn sp\n}\n\nfunc (t *Tracer) reportSpan(sp *Span) {\n\tt.metrics.SpansFinished.Inc(1)\n\tif sp.context.IsSampled() {\n\t\tt.reporter.Report(sp)\n\t}\n\tif t.options.poolSpans {\n\t\tt.spanPool.Put(sp)\n\t}\n}\n\n// randomID generates a random trace/span ID, using tracer.random() generator.\n// It never returns 0.\nfunc (t *Tracer) randomID() uint64 {\n\tval := t.randomNumber()\n\tfor val == 0 {\n\t\tval = t.randomNumber()\n\t}\n\treturn val\n}\n\n// (NB) span must hold the lock before making this call\nfunc (t *Tracer) setBaggage(sp *Span, key, value string) {\n\tt.baggageSetter.setBaggage(sp, key, value)\n}\n\n// (NB) span must hold the lock before making this call\nfunc (t *Tracer) isDebugAllowed(operation string) bool {\n\treturn t.debugThrottler.IsAllowed(operation)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/tracer_options.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go\"\n\n\t\"github.com/uber/jaeger-client-go/internal/baggage\"\n\t\"github.com/uber/jaeger-client-go/internal/throttler\"\n)\n\n// TracerOption is a function that sets some option on the tracer\ntype TracerOption func(tracer *Tracer)\n\n// TracerOptions is a factory for all available TracerOption's\nvar TracerOptions tracerOptions\n\ntype tracerOptions struct{}\n\n// Metrics creates a TracerOption that initializes Metrics on the tracer,\n// which is used to emit statistics.\nfunc (tracerOptions) Metrics(m *Metrics) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.metrics = *m\n\t}\n}\n\n// Logger creates a TracerOption that gives the tracer a Logger.\nfunc (tracerOptions) Logger(logger Logger) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.logger = logger\n\t}\n}\n\nfunc (tracerOptions) CustomHeaderKeys(headerKeys *HeadersConfig) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\tif headerKeys == nil {\n\t\t\treturn\n\t\t}\n\t\ttextPropagator := newTextMapPropagator(headerKeys.applyDefaults(), tracer.metrics)\n\t\ttracer.addCodec(opentracing.TextMap, textPropagator, textPropagator)\n\n\t\thttpHeaderPropagator := newHTTPHeaderPropagator(headerKeys.applyDefaults(), tracer.metrics)\n\t\ttracer.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator)\n\t}\n}\n\n// TimeNow creates a TracerOption that gives the tracer a function\n// used to generate timestamps for spans.\nfunc (tracerOptions) TimeNow(timeNow func() time.Time) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.timeNow = timeNow\n\t}\n}\n\n// RandomNumber creates a TracerOption that gives the tracer\n// a thread-safe random number generator function for generating trace IDs.\nfunc (tracerOptions) RandomNumber(randomNumber func() uint64) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.randomNumber = randomNumber\n\t}\n}\n\n// PoolSpans creates a TracerOption that tells the tracer whether it should use\n// an object pool to minimize span allocations.\n// This should be used with care, only if the service is not running any async tasks\n// that can access parent spans after those spans have been finished.\nfunc (tracerOptions) PoolSpans(poolSpans bool) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.options.poolSpans = poolSpans\n\t}\n}\n\n// Deprecated: HostIPv4 creates a TracerOption that identifies the current service/process.\n// If not set, the factory method will obtain the current IP address.\n// The TracerOption is deprecated; the tracer will attempt to automatically detect the IP.\nfunc (tracerOptions) HostIPv4(hostIPv4 uint32) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.hostIPv4 = hostIPv4\n\t}\n}\n\nfunc (tracerOptions) Injector(format interface{}, injector Injector) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.injectors[format] = injector\n\t}\n}\n\nfunc (tracerOptions) Extractor(format interface{}, extractor Extractor) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.extractors[format] = extractor\n\t}\n}\n\nfunc (t tracerOptions) Observer(observer Observer) TracerOption {\n\treturn t.ContribObserver(&oldObserver{obs: observer})\n}\n\nfunc (tracerOptions) ContribObserver(observer ContribObserver) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.observer.append(observer)\n\t}\n}\n\nfunc (tracerOptions) Gen128Bit(gen128Bit bool) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.options.gen128Bit = gen128Bit\n\t}\n}\n\nfunc (tracerOptions) HighTraceIDGenerator(highTraceIDGenerator func() uint64) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.options.highTraceIDGenerator = highTraceIDGenerator\n\t}\n}\n\nfunc (tracerOptions) MaxTagValueLength(maxTagValueLength int) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.options.maxTagValueLength = maxTagValueLength\n\t}\n}\n\nfunc (tracerOptions) ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.options.zipkinSharedRPCSpan = zipkinSharedRPCSpan\n\t}\n}\n\nfunc (tracerOptions) Tag(key string, value interface{}) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.tags = append(tracer.tags, Tag{key: key, value: value})\n\t}\n}\n\nfunc (tracerOptions) BaggageRestrictionManager(mgr baggage.RestrictionManager) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.baggageRestrictionManager = mgr\n\t}\n}\n\nfunc (tracerOptions) DebugThrottler(throttler throttler.Throttler) TracerOption {\n\treturn func(tracer *Tracer) {\n\t\ttracer.debugThrottler = throttler\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/transport.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"io\"\n)\n\n// Transport abstracts the method of sending spans out of process.\n// Implementations are NOT required to be thread-safe; the RemoteReporter\n// is expected to only call methods on the Transport from the same go-routine.\ntype Transport interface {\n\t// Append converts the span to the wire representation and adds it\n\t// to sender's internal buffer.  If the buffer exceeds its designated\n\t// size, the transport should call Flush() and return the number of spans\n\t// flushed, otherwise return 0. If error is returned, the returned number\n\t// of spans is treated as failed span, and reported to metrics accordingly.\n\tAppend(span *Span) (int, error)\n\n\t// Flush submits the internal buffer to the remote server. It returns the\n\t// number of spans flushed. If error is returned, the returned number of\n\t// spans is treated as failed span, and reported to metrics accordingly.\n\tFlush() (int, error)\n\n\tio.Closer\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/transport_udp.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/uber/jaeger-client-go/thrift\"\n\n\tj \"github.com/uber/jaeger-client-go/thrift-gen/jaeger\"\n\t\"github.com/uber/jaeger-client-go/utils\"\n)\n\n// Empirically obtained constant for how many bytes in the message are used for envelope.\n// The total datagram size is:\n// sizeof(Span) * numSpans + processByteSize + emitBatchOverhead <= maxPacketSize\n// There is a unit test `TestEmitBatchOverhead` that validates this number.\n// Note that due to the use of Compact Thrift protocol, overhead grows with the number of spans\n// in the batch, because the length of the list is encoded as varint32, as well as SeqId.\nconst emitBatchOverhead = 30\n\nvar errSpanTooLarge = errors.New(\"Span is too large\")\n\ntype udpSender struct {\n\tclient          *utils.AgentClientUDP\n\tmaxPacketSize   int                   // max size of datagram in bytes\n\tmaxSpanBytes    int                   // max number of bytes to record spans (excluding envelope) in the datagram\n\tbyteBufferSize  int                   // current number of span bytes accumulated in the buffer\n\tspanBuffer      []*j.Span             // spans buffered before a flush\n\tthriftBuffer    *thrift.TMemoryBuffer // buffer used to calculate byte size of a span\n\tthriftProtocol  thrift.TProtocol\n\tprocess         *j.Process\n\tprocessByteSize int\n}\n\n// NewUDPTransport creates a reporter that submits spans to jaeger-agent\nfunc NewUDPTransport(hostPort string, maxPacketSize int) (Transport, error) {\n\tif len(hostPort) == 0 {\n\t\thostPort = fmt.Sprintf(\"%s:%d\", DefaultUDPSpanServerHost, DefaultUDPSpanServerPort)\n\t}\n\tif maxPacketSize == 0 {\n\t\tmaxPacketSize = utils.UDPPacketMaxLength\n\t}\n\n\tprotocolFactory := thrift.NewTCompactProtocolFactory()\n\n\t// Each span is first written to thriftBuffer to determine its size in bytes.\n\tthriftBuffer := thrift.NewTMemoryBufferLen(maxPacketSize)\n\tthriftProtocol := protocolFactory.GetProtocol(thriftBuffer)\n\n\tclient, err := utils.NewAgentClientUDP(hostPort, maxPacketSize)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsender := &udpSender{\n\t\tclient:         client,\n\t\tmaxSpanBytes:   maxPacketSize - emitBatchOverhead,\n\t\tthriftBuffer:   thriftBuffer,\n\t\tthriftProtocol: thriftProtocol}\n\treturn sender, nil\n}\n\nfunc (s *udpSender) calcSizeOfSerializedThrift(thriftStruct thrift.TStruct) int {\n\ts.thriftBuffer.Reset()\n\tthriftStruct.Write(s.thriftProtocol)\n\treturn s.thriftBuffer.Len()\n}\n\nfunc (s *udpSender) Append(span *Span) (int, error) {\n\tif s.process == nil {\n\t\ts.process = BuildJaegerProcessThrift(span)\n\t\ts.processByteSize = s.calcSizeOfSerializedThrift(s.process)\n\t\ts.byteBufferSize += s.processByteSize\n\t}\n\tjSpan := BuildJaegerThrift(span)\n\tspanSize := s.calcSizeOfSerializedThrift(jSpan)\n\tif spanSize > s.maxSpanBytes {\n\t\treturn 1, errSpanTooLarge\n\t}\n\n\ts.byteBufferSize += spanSize\n\tif s.byteBufferSize <= s.maxSpanBytes {\n\t\ts.spanBuffer = append(s.spanBuffer, jSpan)\n\t\tif s.byteBufferSize < s.maxSpanBytes {\n\t\t\treturn 0, nil\n\t\t}\n\t\treturn s.Flush()\n\t}\n\t// the latest span did not fit in the buffer\n\tn, err := s.Flush()\n\ts.spanBuffer = append(s.spanBuffer, jSpan)\n\ts.byteBufferSize = spanSize + s.processByteSize\n\treturn n, err\n}\n\nfunc (s *udpSender) Flush() (int, error) {\n\tn := len(s.spanBuffer)\n\tif n == 0 {\n\t\treturn 0, nil\n\t}\n\terr := s.client.EmitBatch(&j.Batch{Process: s.process, Spans: s.spanBuffer})\n\ts.resetBuffers()\n\n\treturn n, err\n}\n\nfunc (s *udpSender) Close() error {\n\treturn s.client.Close()\n}\n\nfunc (s *udpSender) resetBuffers() {\n\tfor i := range s.spanBuffer {\n\t\ts.spanBuffer[i] = nil\n\t}\n\ts.spanBuffer = s.spanBuffer[:0]\n\ts.byteBufferSize = s.processByteSize\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/utils/http_json.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage utils\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\n// GetJSON makes an HTTP call to the specified URL and parses the returned JSON into `out`.\nfunc GetJSON(url string, out interface{}) error {\n\tresp, err := http.Get(url)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ReadJSON(resp, out)\n}\n\n// ReadJSON reads JSON from http.Response and parses it into `out`\nfunc ReadJSON(resp *http.Response, out interface{}) error {\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode >= 400 {\n\t\tbody, err := ioutil.ReadAll(resp.Body)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn fmt.Errorf(\"StatusCode: %d, Body: %s\", resp.StatusCode, body)\n\t}\n\n\tif out == nil {\n\t\tio.Copy(ioutil.Discard, resp.Body)\n\t\treturn nil\n\t}\n\n\tdecoder := json.NewDecoder(resp.Body)\n\treturn decoder.Decode(out)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/utils/localip.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage utils\n\nimport (\n\t\"errors\"\n\t\"net\"\n)\n\n// This code is borrowed from https://github.com/uber/tchannel-go/blob/dev/localip.go\n\n// scoreAddr scores how likely the given addr is to be a remote address and returns the\n// IP to use when listening. Any address which receives a negative score should not be used.\n// Scores are calculated as:\n// -1 for any unknown IP addresses.\n// +300 for IPv4 addresses\n// +100 for non-local addresses, extra +100 for \"up\" interaces.\nfunc scoreAddr(iface net.Interface, addr net.Addr) (int, net.IP) {\n\tvar ip net.IP\n\tif netAddr, ok := addr.(*net.IPNet); ok {\n\t\tip = netAddr.IP\n\t} else if netIP, ok := addr.(*net.IPAddr); ok {\n\t\tip = netIP.IP\n\t} else {\n\t\treturn -1, nil\n\t}\n\n\tvar score int\n\tif ip.To4() != nil {\n\t\tscore += 300\n\t}\n\tif iface.Flags&net.FlagLoopback == 0 && !ip.IsLoopback() {\n\t\tscore += 100\n\t\tif iface.Flags&net.FlagUp != 0 {\n\t\t\tscore += 100\n\t\t}\n\t}\n\treturn score, ip\n}\n\n// HostIP tries to find an IP that can be used by other machines to reach this machine.\nfunc HostIP() (net.IP, error) {\n\tinterfaces, err := net.Interfaces()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tbestScore := -1\n\tvar bestIP net.IP\n\t// Select the highest scoring IP as the best IP.\n\tfor _, iface := range interfaces {\n\t\taddrs, err := iface.Addrs()\n\t\tif err != nil {\n\t\t\t// Skip this interface if there is an error.\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, addr := range addrs {\n\t\t\tscore, ip := scoreAddr(iface, addr)\n\t\t\tif score > bestScore {\n\t\t\t\tbestScore = score\n\t\t\t\tbestIP = ip\n\t\t\t}\n\t\t}\n\t}\n\n\tif bestScore == -1 {\n\t\treturn nil, errors.New(\"no addresses to listen on\")\n\t}\n\n\treturn bestIP, nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/utils/rand.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage utils\n\nimport (\n\t\"math/rand\"\n\t\"sync\"\n)\n\n// lockedSource allows a random number generator to be used by multiple goroutines concurrently.\n// The code is very similar to math/rand.lockedSource, which is unfortunately not exposed.\ntype lockedSource struct {\n\tmut sync.Mutex\n\tsrc rand.Source\n}\n\n// NewRand returns a rand.Rand that is threadsafe.\nfunc NewRand(seed int64) *rand.Rand {\n\treturn rand.New(&lockedSource{src: rand.NewSource(seed)})\n}\n\nfunc (r *lockedSource) Int63() (n int64) {\n\tr.mut.Lock()\n\tn = r.src.Int63()\n\tr.mut.Unlock()\n\treturn\n}\n\n// Seed implements Seed() of Source\nfunc (r *lockedSource) Seed(seed int64) {\n\tr.mut.Lock()\n\tr.src.Seed(seed)\n\tr.mut.Unlock()\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage utils\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\n// RateLimiter is a filter used to check if a message that is worth itemCost units is within the rate limits.\ntype RateLimiter interface {\n\tCheckCredit(itemCost float64) bool\n}\n\ntype rateLimiter struct {\n\tsync.Mutex\n\n\tcreditsPerSecond float64\n\tbalance          float64\n\tmaxBalance       float64\n\tlastTick         time.Time\n\n\ttimeNow func() time.Time\n}\n\n// NewRateLimiter creates a new rate limiter based on leaky bucket algorithm, formulated in terms of a\n// credits balance that is replenished every time CheckCredit() method is called (tick) by the amount proportional\n// to the time elapsed since the last tick, up to max of creditsPerSecond. A call to CheckCredit() takes a cost\n// of an item we want to pay with the balance. If the balance exceeds the cost of the item, the item is \"purchased\"\n// and the balance reduced, indicated by returned value of true. Otherwise the balance is unchanged and return false.\n//\n// This can be used to limit a rate of messages emitted by a service by instantiating the Rate Limiter with the\n// max number of messages a service is allowed to emit per second, and calling CheckCredit(1.0) for each message\n// to determine if the message is within the rate limit.\n//\n// It can also be used to limit the rate of traffic in bytes, by setting creditsPerSecond to desired throughput\n// as bytes/second, and calling CheckCredit() with the actual message size.\nfunc NewRateLimiter(creditsPerSecond, maxBalance float64) RateLimiter {\n\treturn &rateLimiter{\n\t\tcreditsPerSecond: creditsPerSecond,\n\t\tbalance:          maxBalance,\n\t\tmaxBalance:       maxBalance,\n\t\tlastTick:         time.Now(),\n\t\ttimeNow:          time.Now}\n}\n\nfunc (b *rateLimiter) CheckCredit(itemCost float64) bool {\n\tb.Lock()\n\tdefer b.Unlock()\n\t// calculate how much time passed since the last tick, and update current tick\n\tcurrentTime := b.timeNow()\n\telapsedTime := currentTime.Sub(b.lastTick)\n\tb.lastTick = currentTime\n\t// calculate how much credit have we accumulated since the last tick\n\tb.balance += elapsedTime.Seconds() * b.creditsPerSecond\n\tif b.balance > b.maxBalance {\n\t\tb.balance = b.maxBalance\n\t}\n\t// if we have enough credits to pay for current item, then reduce balance and allow\n\tif b.balance >= itemCost {\n\t\tb.balance -= itemCost\n\t\treturn true\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/utils/udp_client.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage utils\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\n\t\"github.com/uber/jaeger-client-go/thrift\"\n\n\t\"github.com/uber/jaeger-client-go/thrift-gen/agent\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/jaeger\"\n\t\"github.com/uber/jaeger-client-go/thrift-gen/zipkincore\"\n)\n\n// UDPPacketMaxLength is the max size of UDP packet we want to send, synced with jaeger-agent\nconst UDPPacketMaxLength = 65000\n\n// AgentClientUDP is a UDP client to Jaeger agent that implements agent.Agent interface.\ntype AgentClientUDP struct {\n\tagent.Agent\n\tio.Closer\n\n\tconnUDP       *net.UDPConn\n\tclient        *agent.AgentClient\n\tmaxPacketSize int                   // max size of datagram in bytes\n\tthriftBuffer  *thrift.TMemoryBuffer // buffer used to calculate byte size of a span\n}\n\n// NewAgentClientUDP creates a client that sends spans to Jaeger Agent over UDP.\nfunc NewAgentClientUDP(hostPort string, maxPacketSize int) (*AgentClientUDP, error) {\n\tif maxPacketSize == 0 {\n\t\tmaxPacketSize = UDPPacketMaxLength\n\t}\n\n\tthriftBuffer := thrift.NewTMemoryBufferLen(maxPacketSize)\n\tprotocolFactory := thrift.NewTCompactProtocolFactory()\n\tclient := agent.NewAgentClientFactory(thriftBuffer, protocolFactory)\n\n\tdestAddr, err := net.ResolveUDPAddr(\"udp\", hostPort)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tconnUDP, err := net.DialUDP(destAddr.Network(), nil, destAddr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif err := connUDP.SetWriteBuffer(maxPacketSize); err != nil {\n\t\treturn nil, err\n\t}\n\n\tclientUDP := &AgentClientUDP{\n\t\tconnUDP:       connUDP,\n\t\tclient:        client,\n\t\tmaxPacketSize: maxPacketSize,\n\t\tthriftBuffer:  thriftBuffer}\n\treturn clientUDP, nil\n}\n\n// EmitZipkinBatch implements EmitZipkinBatch() of Agent interface\nfunc (a *AgentClientUDP) EmitZipkinBatch(spans []*zipkincore.Span) error {\n\treturn errors.New(\"Not implemented\")\n}\n\n// EmitBatch implements EmitBatch() of Agent interface\nfunc (a *AgentClientUDP) EmitBatch(batch *jaeger.Batch) error {\n\ta.thriftBuffer.Reset()\n\ta.client.SeqId = 0 // we have no need for distinct SeqIds for our one-way UDP messages\n\tif err := a.client.EmitBatch(batch); err != nil {\n\t\treturn err\n\t}\n\tif a.thriftBuffer.Len() > a.maxPacketSize {\n\t\treturn fmt.Errorf(\"Data does not fit within one UDP packet; size %d, max %d, spans %d\",\n\t\t\ta.thriftBuffer.Len(), a.maxPacketSize, len(batch.Spans))\n\t}\n\t_, err := a.connUDP.Write(a.thriftBuffer.Bytes())\n\treturn err\n}\n\n// Close implements Close() of io.Closer and closes the underlying UDP connection.\nfunc (a *AgentClientUDP) Close() error {\n\treturn a.connUDP.Close()\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/utils/utils.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage utils\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"net\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n)\n\nvar (\n\t// ErrEmptyIP an error for empty ip strings\n\tErrEmptyIP = errors.New(\"empty string given for ip\")\n\n\t// ErrNotHostColonPort an error for invalid host port string\n\tErrNotHostColonPort = errors.New(\"expecting host:port\")\n\n\t// ErrNotFourOctets an error for the wrong number of octets after splitting a string\n\tErrNotFourOctets = errors.New(\"Wrong number of octets\")\n)\n\n// ParseIPToUint32 converts a string ip (e.g. \"x.y.z.w\") to an uint32\nfunc ParseIPToUint32(ip string) (uint32, error) {\n\tif ip == \"\" {\n\t\treturn 0, ErrEmptyIP\n\t}\n\n\tif ip == \"localhost\" {\n\t\treturn 127<<24 | 1, nil\n\t}\n\n\toctets := strings.Split(ip, \".\")\n\tif len(octets) != 4 {\n\t\treturn 0, ErrNotFourOctets\n\t}\n\n\tvar intIP uint32\n\tfor i := 0; i < 4; i++ {\n\t\toctet, err := strconv.Atoi(octets[i])\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tintIP = (intIP << 8) | uint32(octet)\n\t}\n\n\treturn intIP, nil\n}\n\n// ParsePort converts port number from string to uin16\nfunc ParsePort(portString string) (uint16, error) {\n\tport, err := strconv.ParseUint(portString, 10, 16)\n\treturn uint16(port), err\n}\n\n// PackIPAsUint32 packs an IPv4 as uint32\nfunc PackIPAsUint32(ip net.IP) uint32 {\n\tif ipv4 := ip.To4(); ipv4 != nil {\n\t\treturn binary.BigEndian.Uint32(ipv4)\n\t}\n\treturn 0\n}\n\n// TimeToMicrosecondsSinceEpochInt64 converts Go time.Time to a long\n// representing time since epoch in microseconds, which is used expected\n// in the Jaeger spans encoded as Thrift.\nfunc TimeToMicrosecondsSinceEpochInt64(t time.Time) int64 {\n\t// ^^^ Passing time.Time by value is faster than passing a pointer!\n\t// BenchmarkTimeByValue-8\t2000000000\t         1.37 ns/op\n\t// BenchmarkTimeByPtr-8  \t2000000000\t         1.98 ns/op\n\n\treturn t.UnixNano() / 1000\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/zipkin.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"github.com/opentracing/opentracing-go\"\n)\n\n// ZipkinSpanFormat is an OpenTracing carrier format constant\nconst ZipkinSpanFormat = \"zipkin-span-format\"\n\n// ExtractableZipkinSpan is a type of Carrier used for integration with Zipkin-aware\n// RPC frameworks (like TChannel). It does not support baggage, only trace IDs.\ntype ExtractableZipkinSpan interface {\n\tTraceID() uint64\n\tSpanID() uint64\n\tParentID() uint64\n\tFlags() byte\n}\n\n// InjectableZipkinSpan is a type of Carrier used for integration with Zipkin-aware\n// RPC frameworks (like TChannel). It does not support baggage, only trace IDs.\ntype InjectableZipkinSpan interface {\n\tSetTraceID(traceID uint64)\n\tSetSpanID(spanID uint64)\n\tSetParentID(parentID uint64)\n\tSetFlags(flags byte)\n}\n\ntype zipkinPropagator struct {\n\ttracer *Tracer\n}\n\nfunc (p *zipkinPropagator) Inject(\n\tctx SpanContext,\n\tabstractCarrier interface{},\n) error {\n\tcarrier, ok := abstractCarrier.(InjectableZipkinSpan)\n\tif !ok {\n\t\treturn opentracing.ErrInvalidCarrier\n\t}\n\n\tcarrier.SetTraceID(ctx.TraceID().Low) // TODO this cannot work with 128bit IDs\n\tcarrier.SetSpanID(uint64(ctx.SpanID()))\n\tcarrier.SetParentID(uint64(ctx.ParentID()))\n\tcarrier.SetFlags(ctx.flags)\n\treturn nil\n}\n\nfunc (p *zipkinPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) {\n\tcarrier, ok := abstractCarrier.(ExtractableZipkinSpan)\n\tif !ok {\n\t\treturn emptyContext, opentracing.ErrInvalidCarrier\n\t}\n\tif carrier.TraceID() == 0 {\n\t\treturn emptyContext, opentracing.ErrSpanContextNotFound\n\t}\n\tvar ctx SpanContext\n\tctx.traceID.Low = carrier.TraceID()\n\tctx.spanID = SpanID(carrier.SpanID())\n\tctx.parentID = SpanID(carrier.ParentID())\n\tctx.flags = carrier.Flags()\n\treturn ctx, nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage jaeger\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go/ext\"\n\n\t\"github.com/uber/jaeger-client-go/internal/spanlog\"\n\tz \"github.com/uber/jaeger-client-go/thrift-gen/zipkincore\"\n\t\"github.com/uber/jaeger-client-go/utils\"\n)\n\nconst (\n\t// Zipkin UI does not work well with non-string tag values\n\tallowPackedNumbers = false\n)\n\nvar specialTagHandlers = map[string]func(*zipkinSpan, interface{}){\n\tstring(ext.SpanKind):     setSpanKind,\n\tstring(ext.PeerHostIPv4): setPeerIPv4,\n\tstring(ext.PeerPort):     setPeerPort,\n\tstring(ext.PeerService):  setPeerService,\n\tTracerIPTagKey:           removeTag,\n}\n\n// BuildZipkinThrift builds thrift span based on internal span.\nfunc BuildZipkinThrift(s *Span) *z.Span {\n\tspan := &zipkinSpan{Span: s}\n\tspan.handleSpecialTags()\n\tparentID := int64(span.context.parentID)\n\tvar ptrParentID *int64\n\tif parentID != 0 {\n\t\tptrParentID = &parentID\n\t}\n\ttimestamp := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime)\n\tduration := span.duration.Nanoseconds() / int64(time.Microsecond)\n\tendpoint := &z.Endpoint{\n\t\tServiceName: span.tracer.serviceName,\n\t\tIpv4:        int32(span.tracer.hostIPv4)}\n\tthriftSpan := &z.Span{\n\t\tTraceID:           int64(span.context.traceID.Low), // TODO upgrade zipkin thrift and use TraceIdHigh\n\t\tID:                int64(span.context.spanID),\n\t\tParentID:          ptrParentID,\n\t\tName:              span.operationName,\n\t\tTimestamp:         &timestamp,\n\t\tDuration:          &duration,\n\t\tDebug:             span.context.IsDebug(),\n\t\tAnnotations:       buildAnnotations(span, endpoint),\n\t\tBinaryAnnotations: buildBinaryAnnotations(span, endpoint)}\n\treturn thriftSpan\n}\n\nfunc buildAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.Annotation {\n\t// automatically adding 2 Zipkin CoreAnnotations\n\tannotations := make([]*z.Annotation, 0, 2+len(span.logs))\n\tvar startLabel, endLabel string\n\tif span.spanKind == string(ext.SpanKindRPCClientEnum) {\n\t\tstartLabel, endLabel = z.CLIENT_SEND, z.CLIENT_RECV\n\t} else if span.spanKind == string(ext.SpanKindRPCServerEnum) {\n\t\tstartLabel, endLabel = z.SERVER_RECV, z.SERVER_SEND\n\t}\n\tif !span.startTime.IsZero() && startLabel != \"\" {\n\t\tstart := &z.Annotation{\n\t\t\tTimestamp: utils.TimeToMicrosecondsSinceEpochInt64(span.startTime),\n\t\t\tValue:     startLabel,\n\t\t\tHost:      endpoint}\n\t\tannotations = append(annotations, start)\n\t\tif span.duration != 0 {\n\t\t\tendTs := span.startTime.Add(span.duration)\n\t\t\tend := &z.Annotation{\n\t\t\t\tTimestamp: utils.TimeToMicrosecondsSinceEpochInt64(endTs),\n\t\t\t\tValue:     endLabel,\n\t\t\t\tHost:      endpoint}\n\t\t\tannotations = append(annotations, end)\n\t\t}\n\t}\n\tfor _, log := range span.logs {\n\t\tanno := &z.Annotation{\n\t\t\tTimestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp),\n\t\t\tHost:      endpoint}\n\t\tif content, err := spanlog.MaterializeWithJSON(log.Fields); err == nil {\n\t\t\tanno.Value = truncateString(string(content), span.tracer.options.maxTagValueLength)\n\t\t} else {\n\t\t\tanno.Value = err.Error()\n\t\t}\n\t\tannotations = append(annotations, anno)\n\t}\n\treturn annotations\n}\n\nfunc buildBinaryAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.BinaryAnnotation {\n\t// automatically adding local component or server/client address tag, and client version\n\tannotations := make([]*z.BinaryAnnotation, 0, 2+len(span.tags))\n\n\tif span.peerDefined() && span.isRPC() {\n\t\tpeer := z.Endpoint{\n\t\t\tIpv4:        span.peer.Ipv4,\n\t\t\tPort:        span.peer.Port,\n\t\t\tServiceName: span.peer.ServiceName}\n\t\tlabel := z.CLIENT_ADDR\n\t\tif span.isRPCClient() {\n\t\t\tlabel = z.SERVER_ADDR\n\t\t}\n\t\tanno := &z.BinaryAnnotation{\n\t\t\tKey:            label,\n\t\t\tValue:          []byte{1},\n\t\t\tAnnotationType: z.AnnotationType_BOOL,\n\t\t\tHost:           &peer}\n\t\tannotations = append(annotations, anno)\n\t}\n\tif !span.isRPC() {\n\t\tcomponentName := endpoint.ServiceName\n\t\tfor _, tag := range span.tags {\n\t\t\tif tag.key == string(ext.Component) {\n\t\t\t\tcomponentName = stringify(tag.value)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tlocal := &z.BinaryAnnotation{\n\t\t\tKey:            z.LOCAL_COMPONENT,\n\t\t\tValue:          []byte(componentName),\n\t\t\tAnnotationType: z.AnnotationType_STRING,\n\t\t\tHost:           endpoint}\n\t\tannotations = append(annotations, local)\n\t}\n\tfor _, tag := range span.tags {\n\t\t// \"Special tags\" are already handled by this point, we'd be double reporting the\n\t\t// tags if we don't skip here\n\t\tif _, ok := specialTagHandlers[tag.key]; ok {\n\t\t\tcontinue\n\t\t}\n\t\tif anno := buildBinaryAnnotation(tag.key, tag.value, span.tracer.options.maxTagValueLength, nil); anno != nil {\n\t\t\tannotations = append(annotations, anno)\n\t\t}\n\t}\n\treturn annotations\n}\n\nfunc buildBinaryAnnotation(key string, val interface{}, maxTagValueLength int, endpoint *z.Endpoint) *z.BinaryAnnotation {\n\tbann := &z.BinaryAnnotation{Key: key, Host: endpoint}\n\tif value, ok := val.(string); ok {\n\t\tbann.Value = []byte(truncateString(value, maxTagValueLength))\n\t\tbann.AnnotationType = z.AnnotationType_STRING\n\t} else if value, ok := val.([]byte); ok {\n\t\tif len(value) > maxTagValueLength {\n\t\t\tvalue = value[:maxTagValueLength]\n\t\t}\n\t\tbann.Value = value\n\t\tbann.AnnotationType = z.AnnotationType_BYTES\n\t} else if value, ok := val.(int32); ok && allowPackedNumbers {\n\t\tbann.Value = int32ToBytes(value)\n\t\tbann.AnnotationType = z.AnnotationType_I32\n\t} else if value, ok := val.(int64); ok && allowPackedNumbers {\n\t\tbann.Value = int64ToBytes(value)\n\t\tbann.AnnotationType = z.AnnotationType_I64\n\t} else if value, ok := val.(int); ok && allowPackedNumbers {\n\t\tbann.Value = int64ToBytes(int64(value))\n\t\tbann.AnnotationType = z.AnnotationType_I64\n\t} else if value, ok := val.(bool); ok {\n\t\tbann.Value = []byte{boolToByte(value)}\n\t\tbann.AnnotationType = z.AnnotationType_BOOL\n\t} else {\n\t\tvalue := stringify(val)\n\t\tbann.Value = []byte(truncateString(value, maxTagValueLength))\n\t\tbann.AnnotationType = z.AnnotationType_STRING\n\t}\n\treturn bann\n}\n\nfunc stringify(value interface{}) string {\n\tif s, ok := value.(string); ok {\n\t\treturn s\n\t}\n\treturn fmt.Sprintf(\"%+v\", value)\n}\n\nfunc truncateString(value string, maxLength int) string {\n\t// we ignore the problem of utf8 runes possibly being sliced in the middle,\n\t// as it is rather expensive to iterate through each tag just to find rune\n\t// boundaries.\n\tif len(value) > maxLength {\n\t\treturn value[:maxLength]\n\t}\n\treturn value\n}\n\nfunc boolToByte(b bool) byte {\n\tif b {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\n// int32ToBytes converts int32 to bytes.\nfunc int32ToBytes(i int32) []byte {\n\tbuf := make([]byte, 4)\n\tbinary.BigEndian.PutUint32(buf, uint32(i))\n\treturn buf\n}\n\n// int64ToBytes converts int64 to bytes.\nfunc int64ToBytes(i int64) []byte {\n\tbuf := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(buf, uint64(i))\n\treturn buf\n}\n\ntype zipkinSpan struct {\n\t*Span\n\n\t// peer points to the peer service participating in this span,\n\t// e.g. the Client if this span is a server span,\n\t// or Server if this span is a client span\n\tpeer struct {\n\t\tIpv4        int32\n\t\tPort        int16\n\t\tServiceName string\n\t}\n\n\t// used to distinguish local vs. RPC Server vs. RPC Client spans\n\tspanKind string\n}\n\nfunc (s *zipkinSpan) handleSpecialTags() {\n\ts.Lock()\n\tdefer s.Unlock()\n\tif s.firstInProcess {\n\t\t// append the process tags\n\t\ts.tags = append(s.tags, s.tracer.tags...)\n\t}\n\tfilteredTags := make([]Tag, 0, len(s.tags))\n\tfor _, tag := range s.tags {\n\t\tif handler, ok := specialTagHandlers[tag.key]; ok {\n\t\t\thandler(s, tag.value)\n\t\t} else {\n\t\t\tfilteredTags = append(filteredTags, tag)\n\t\t}\n\t}\n\ts.tags = filteredTags\n}\n\nfunc setSpanKind(s *zipkinSpan, value interface{}) {\n\tif val, ok := value.(string); ok {\n\t\ts.spanKind = val\n\t\treturn\n\t}\n\tif val, ok := value.(ext.SpanKindEnum); ok {\n\t\ts.spanKind = string(val)\n\t}\n}\n\nfunc setPeerIPv4(s *zipkinSpan, value interface{}) {\n\tif val, ok := value.(string); ok {\n\t\tif ip, err := utils.ParseIPToUint32(val); err == nil {\n\t\t\ts.peer.Ipv4 = int32(ip)\n\t\t\treturn\n\t\t}\n\t}\n\tif val, ok := value.(uint32); ok {\n\t\ts.peer.Ipv4 = int32(val)\n\t\treturn\n\t}\n\tif val, ok := value.(int32); ok {\n\t\ts.peer.Ipv4 = val\n\t}\n}\n\nfunc setPeerPort(s *zipkinSpan, value interface{}) {\n\tif val, ok := value.(string); ok {\n\t\tif port, err := utils.ParsePort(val); err == nil {\n\t\t\ts.peer.Port = int16(port)\n\t\t\treturn\n\t\t}\n\t}\n\tif val, ok := value.(uint16); ok {\n\t\ts.peer.Port = int16(val)\n\t\treturn\n\t}\n\tif val, ok := value.(int); ok {\n\t\ts.peer.Port = int16(val)\n\t}\n}\n\nfunc setPeerService(s *zipkinSpan, value interface{}) {\n\tif val, ok := value.(string); ok {\n\t\ts.peer.ServiceName = val\n\t}\n}\n\nfunc removeTag(s *zipkinSpan, value interface{}) {}\n\nfunc (s *zipkinSpan) peerDefined() bool {\n\treturn s.peer.ServiceName != \"\" || s.peer.Ipv4 != 0 || s.peer.Port != 0\n}\n\nfunc (s *zipkinSpan) isRPC() bool {\n\ts.RLock()\n\tdefer s.RUnlock()\n\treturn s.spanKind == string(ext.SpanKindRPCClientEnum) || s.spanKind == string(ext.SpanKindRPCServerEnum)\n}\n\nfunc (s *zipkinSpan) isRPCClient() bool {\n\ts.RLock()\n\tdefer s.RUnlock()\n\treturn s.spanKind == string(ext.SpanKindRPCClientEnum)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/metrics/counter.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage metrics\n\n// Counter tracks the number of times an event has occurred\ntype Counter interface {\n\t// Inc adds the given value to the counter.\n\tInc(int64)\n}\n\n// NullCounter counter that does nothing\nvar NullCounter Counter = nullCounter{}\n\ntype nullCounter struct{}\n\nfunc (nullCounter) Inc(int64) {}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/metrics/factory.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage metrics\n\n// Factory creates new metrics\ntype Factory interface {\n\tCounter(name string, tags map[string]string) Counter\n\tTimer(name string, tags map[string]string) Timer\n\tGauge(name string, tags map[string]string) Gauge\n\n\t// Namespace returns a nested metrics factory.\n\tNamespace(name string, tags map[string]string) Factory\n}\n\n// NullFactory is a metrics factory that returns NullCounter, NullTimer, and NullGauge.\nvar NullFactory Factory = nullFactory{}\n\ntype nullFactory struct{}\n\nfunc (nullFactory) Counter(name string, tags map[string]string) Counter   { return NullCounter }\nfunc (nullFactory) Timer(name string, tags map[string]string) Timer       { return NullTimer }\nfunc (nullFactory) Gauge(name string, tags map[string]string) Gauge       { return NullGauge }\nfunc (nullFactory) Namespace(name string, tags map[string]string) Factory { return NullFactory }\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/metrics/gauge.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage metrics\n\n// Gauge returns instantaneous measurements of something as an int64 value\ntype Gauge interface {\n\t// Update the gauge to the value passed in.\n\tUpdate(int64)\n}\n\n// NullGauge gauge that does nothing\nvar NullGauge Gauge = nullGauge{}\n\ntype nullGauge struct{}\n\nfunc (nullGauge) Update(int64) {}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/metrics/local.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage metrics\n\nimport (\n\t\"sort\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/codahale/hdrhistogram\"\n)\n\n// This is intentionally very similar to github.com/codahale/metrics, the\n// main difference being that counters/gauges are scoped to the provider\n// rather than being global (to facilitate testing).\n\n// A LocalBackend is a metrics provider which aggregates data in-vm, and\n// allows exporting snapshots to shove the data into a remote collector\ntype LocalBackend struct {\n\tcm       sync.Mutex\n\tgm       sync.Mutex\n\ttm       sync.Mutex\n\tcounters map[string]*int64\n\tgauges   map[string]*int64\n\ttimers   map[string]*localBackendTimer\n\tstop     chan struct{}\n\twg       sync.WaitGroup\n\tTagsSep  string\n\tTagKVSep string\n}\n\n// NewLocalBackend returns a new LocalBackend. The collectionInterval is the histogram\n// time window for each timer.\nfunc NewLocalBackend(collectionInterval time.Duration) *LocalBackend {\n\tb := &LocalBackend{\n\t\tcounters: make(map[string]*int64),\n\t\tgauges:   make(map[string]*int64),\n\t\ttimers:   make(map[string]*localBackendTimer),\n\t\tstop:     make(chan struct{}),\n\t\tTagsSep:  \"|\",\n\t\tTagKVSep: \"=\",\n\t}\n\tif collectionInterval == 0 {\n\t\t// Use one histogram time window for all timers\n\t\treturn b\n\t}\n\tb.wg.Add(1)\n\tgo b.runLoop(collectionInterval)\n\treturn b\n}\n\n// Clear discards accumulated stats\nfunc (b *LocalBackend) Clear() {\n\tb.cm.Lock()\n\tdefer b.cm.Unlock()\n\tb.gm.Lock()\n\tdefer b.gm.Unlock()\n\tb.tm.Lock()\n\tdefer b.tm.Unlock()\n\tb.counters = make(map[string]*int64)\n\tb.gauges = make(map[string]*int64)\n\tb.timers = make(map[string]*localBackendTimer)\n}\n\nfunc (b *LocalBackend) runLoop(collectionInterval time.Duration) {\n\tdefer b.wg.Done()\n\tticker := time.NewTicker(collectionInterval)\n\tfor {\n\t\tselect {\n\t\tcase <-ticker.C:\n\t\t\tb.tm.Lock()\n\t\t\ttimers := make(map[string]*localBackendTimer, len(b.timers))\n\t\t\tfor timerName, timer := range b.timers {\n\t\t\t\ttimers[timerName] = timer\n\t\t\t}\n\t\t\tb.tm.Unlock()\n\n\t\t\tfor _, t := range timers {\n\t\t\t\tt.Lock()\n\t\t\t\tt.hist.Rotate()\n\t\t\t\tt.Unlock()\n\t\t\t}\n\t\tcase <-b.stop:\n\t\t\tticker.Stop()\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// IncCounter increments a counter value\nfunc (b *LocalBackend) IncCounter(name string, tags map[string]string, delta int64) {\n\tname = GetKey(name, tags, b.TagsSep, b.TagKVSep)\n\tb.cm.Lock()\n\tdefer b.cm.Unlock()\n\tcounter := b.counters[name]\n\tif counter == nil {\n\t\tb.counters[name] = new(int64)\n\t\t*b.counters[name] = delta\n\t\treturn\n\t}\n\tatomic.AddInt64(counter, delta)\n}\n\n// UpdateGauge updates the value of a gauge\nfunc (b *LocalBackend) UpdateGauge(name string, tags map[string]string, value int64) {\n\tname = GetKey(name, tags, b.TagsSep, b.TagKVSep)\n\tb.gm.Lock()\n\tdefer b.gm.Unlock()\n\tgauge := b.gauges[name]\n\tif gauge == nil {\n\t\tb.gauges[name] = new(int64)\n\t\t*b.gauges[name] = value\n\t\treturn\n\t}\n\tatomic.StoreInt64(gauge, value)\n}\n\n// RecordTimer records a timing duration\nfunc (b *LocalBackend) RecordTimer(name string, tags map[string]string, d time.Duration) {\n\tname = GetKey(name, tags, b.TagsSep, b.TagKVSep)\n\ttimer := b.findOrCreateTimer(name)\n\ttimer.Lock()\n\ttimer.hist.Current.RecordValue(int64(d / time.Millisecond))\n\ttimer.Unlock()\n}\n\nfunc (b *LocalBackend) findOrCreateTimer(name string) *localBackendTimer {\n\tb.tm.Lock()\n\tdefer b.tm.Unlock()\n\tif t, ok := b.timers[name]; ok {\n\t\treturn t\n\t}\n\n\tt := &localBackendTimer{\n\t\thist: hdrhistogram.NewWindowed(5, 0, int64((5*time.Minute)/time.Millisecond), 1),\n\t}\n\tb.timers[name] = t\n\treturn t\n}\n\ntype localBackendTimer struct {\n\tsync.Mutex\n\thist *hdrhistogram.WindowedHistogram\n}\n\nvar (\n\tpercentiles = map[string]float64{\n\t\t\"P50\":  50,\n\t\t\"P75\":  75,\n\t\t\"P90\":  90,\n\t\t\"P95\":  95,\n\t\t\"P99\":  99,\n\t\t\"P999\": 99.9,\n\t}\n)\n\n// Snapshot captures a snapshot of the current counter and gauge values\nfunc (b *LocalBackend) Snapshot() (counters, gauges map[string]int64) {\n\tb.cm.Lock()\n\tdefer b.cm.Unlock()\n\n\tcounters = make(map[string]int64, len(b.counters))\n\tfor name, value := range b.counters {\n\t\tcounters[name] = atomic.LoadInt64(value)\n\t}\n\n\tb.gm.Lock()\n\tdefer b.gm.Unlock()\n\n\tgauges = make(map[string]int64, len(b.gauges))\n\tfor name, value := range b.gauges {\n\t\tgauges[name] = atomic.LoadInt64(value)\n\t}\n\n\tb.tm.Lock()\n\ttimers := make(map[string]*localBackendTimer)\n\tfor timerName, timer := range b.timers {\n\t\ttimers[timerName] = timer\n\t}\n\tb.tm.Unlock()\n\n\tfor timerName, timer := range timers {\n\t\ttimer.Lock()\n\t\thist := timer.hist.Merge()\n\t\ttimer.Unlock()\n\t\tfor name, q := range percentiles {\n\t\t\tgauges[timerName+\".\"+name] = hist.ValueAtQuantile(q)\n\t\t}\n\t}\n\n\treturn\n}\n\n// Stop cleanly closes the background goroutine spawned by NewLocalBackend.\nfunc (b *LocalBackend) Stop() {\n\tclose(b.stop)\n\tb.wg.Wait()\n}\n\n// GetKey converts name+tags into a single string of the form\n// \"name|tag1=value1|...|tagN=valueN\", where tag names are\n// sorted alphabetically.\nfunc GetKey(name string, tags map[string]string, tagsSep string, tagKVSep string) string {\n\tkeys := make([]string, 0, len(tags))\n\tfor k := range tags {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Strings(keys)\n\tkey := name\n\tfor _, k := range keys {\n\t\tkey = key + tagsSep + k + tagKVSep + tags[k]\n\t}\n\treturn key\n}\n\ntype stats struct {\n\tname         string\n\ttags         map[string]string\n\tlocalBackend *LocalBackend\n}\n\ntype localTimer struct {\n\tstats\n}\n\nfunc (l *localTimer) Record(d time.Duration) {\n\tl.localBackend.RecordTimer(l.name, l.tags, d)\n}\n\ntype localCounter struct {\n\tstats\n}\n\nfunc (l *localCounter) Inc(delta int64) {\n\tl.localBackend.IncCounter(l.name, l.tags, delta)\n}\n\ntype localGauge struct {\n\tstats\n}\n\nfunc (l *localGauge) Update(value int64) {\n\tl.localBackend.UpdateGauge(l.name, l.tags, value)\n}\n\n// LocalFactory stats factory that creates metrics that are stored locally\ntype LocalFactory struct {\n\t*LocalBackend\n\tnamespace string\n\ttags      map[string]string\n}\n\n// NewLocalFactory returns a new LocalMetricsFactory\nfunc NewLocalFactory(collectionInterval time.Duration) *LocalFactory {\n\treturn &LocalFactory{\n\t\tLocalBackend: NewLocalBackend(collectionInterval),\n\t}\n}\n\n// appendTags adds the tags to the namespace tags and returns a combined map.\nfunc (l *LocalFactory) appendTags(tags map[string]string) map[string]string {\n\tnewTags := make(map[string]string)\n\tfor k, v := range l.tags {\n\t\tnewTags[k] = v\n\t}\n\tfor k, v := range tags {\n\t\tnewTags[k] = v\n\t}\n\treturn newTags\n}\n\nfunc (l *LocalFactory) newNamespace(name string) string {\n\tif l.namespace == \"\" {\n\t\treturn name\n\t}\n\n\tif name == \"\" {\n\t\treturn l.namespace\n\t}\n\n\treturn l.namespace + \".\" + name\n}\n\n// Counter returns a local stats counter\nfunc (l *LocalFactory) Counter(name string, tags map[string]string) Counter {\n\treturn &localCounter{\n\t\tstats{\n\t\t\tname:         l.newNamespace(name),\n\t\t\ttags:         l.appendTags(tags),\n\t\t\tlocalBackend: l.LocalBackend,\n\t\t},\n\t}\n}\n\n// Timer returns a local stats timer.\nfunc (l *LocalFactory) Timer(name string, tags map[string]string) Timer {\n\treturn &localTimer{\n\t\tstats{\n\t\t\tname:         l.newNamespace(name),\n\t\t\ttags:         l.appendTags(tags),\n\t\t\tlocalBackend: l.LocalBackend,\n\t\t},\n\t}\n}\n\n// Gauge returns a local stats gauge.\nfunc (l *LocalFactory) Gauge(name string, tags map[string]string) Gauge {\n\treturn &localGauge{\n\t\tstats{\n\t\t\tname:         l.newNamespace(name),\n\t\t\ttags:         l.appendTags(tags),\n\t\t\tlocalBackend: l.LocalBackend,\n\t\t},\n\t}\n}\n\n// Namespace returns a new namespace.\nfunc (l *LocalFactory) Namespace(name string, tags map[string]string) Factory {\n\treturn &LocalFactory{\n\t\tnamespace:    l.newNamespace(name),\n\t\ttags:         l.appendTags(tags),\n\t\tLocalBackend: l.LocalBackend,\n\t}\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/metrics/metrics.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage metrics\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\n// Init initializes the passed in metrics and initializes its fields using the passed in factory.\nfunc Init(metrics interface{}, factory Factory, globalTags map[string]string) {\n\tif err := initMetrics(metrics, factory, globalTags); err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// initMetrics uses reflection to initialize a struct containing metrics fields\n// by assigning new Counter/Gauge/Timer values with the metric name retrieved\n// from the `metric` tag and stats tags retrieved from the `tags` tag.\n//\n// Note: all fields of the struct must be exported, have a `metric` tag, and be\n// of type Counter or Gauge or Timer.\nfunc initMetrics(m interface{}, factory Factory, globalTags map[string]string) error {\n\t// Allow user to opt out of reporting metrics by passing in nil.\n\tif factory == nil {\n\t\tfactory = NullFactory\n\t}\n\n\tcounterPtrType := reflect.TypeOf((*Counter)(nil)).Elem()\n\tgaugePtrType := reflect.TypeOf((*Gauge)(nil)).Elem()\n\ttimerPtrType := reflect.TypeOf((*Timer)(nil)).Elem()\n\n\tv := reflect.ValueOf(m).Elem()\n\tt := v.Type()\n\tfor i := 0; i < t.NumField(); i++ {\n\t\ttags := make(map[string]string)\n\t\tfor k, v := range globalTags {\n\t\t\ttags[k] = v\n\t\t}\n\t\tfield := t.Field(i)\n\t\tmetric := field.Tag.Get(\"metric\")\n\t\tif metric == \"\" {\n\t\t\treturn fmt.Errorf(\"Field %s is missing a tag 'metric'\", field.Name)\n\t\t}\n\t\tif tagString := field.Tag.Get(\"tags\"); tagString != \"\" {\n\t\t\ttagPairs := strings.Split(tagString, \",\")\n\t\t\tfor _, tagPair := range tagPairs {\n\t\t\t\ttag := strings.Split(tagPair, \"=\")\n\t\t\t\tif len(tag) != 2 {\n\t\t\t\t\treturn fmt.Errorf(\n\t\t\t\t\t\t\"Field [%s]: Tag [%s] is not of the form key=value in 'tags' string [%s]\",\n\t\t\t\t\t\tfield.Name, tagPair, tagString)\n\t\t\t\t}\n\t\t\t\ttags[tag[0]] = tag[1]\n\t\t\t}\n\t\t}\n\t\tvar obj interface{}\n\t\tif field.Type.AssignableTo(counterPtrType) {\n\t\t\tobj = factory.Counter(metric, tags)\n\t\t} else if field.Type.AssignableTo(gaugePtrType) {\n\t\t\tobj = factory.Gauge(metric, tags)\n\t\t} else if field.Type.AssignableTo(timerPtrType) {\n\t\t\tobj = factory.Timer(metric, tags)\n\t\t} else {\n\t\t\treturn fmt.Errorf(\n\t\t\t\t\"Field %s is not a pointer to timer, gauge, or counter\",\n\t\t\t\tfield.Name)\n\t\t}\n\t\tv.Field(i).Set(reflect.ValueOf(obj))\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage metrics\n\nimport (\n\t\"time\"\n)\n\n// StartStopwatch begins recording the executing time of an event, returning\n// a Stopwatch that should be used to stop the recording the time for\n// that event.  Multiple events can be occurring simultaneously each\n// represented by different active Stopwatches\nfunc StartStopwatch(timer Timer) Stopwatch {\n\treturn Stopwatch{t: timer, start: time.Now()}\n}\n\n// A Stopwatch tracks the execution time of a specific event\ntype Stopwatch struct {\n\tt     Timer\n\tstart time.Time\n}\n\n// Stop stops executing of the stopwatch and records the amount of elapsed time\nfunc (s Stopwatch) Stop() {\n\ts.t.Record(s.ElapsedTime())\n}\n\n// ElapsedTime returns the amount of elapsed time (in time.Duration)\nfunc (s Stopwatch) ElapsedTime() time.Duration {\n\treturn time.Since(s.start)\n}\n"
  },
  {
    "path": "vendor/github.com/uber/jaeger-lib/metrics/timer.go",
    "content": "// Copyright (c) 2017 Uber Technologies, Inc.\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\npackage metrics\n\nimport (\n\t\"time\"\n)\n\n// Timer accumulates observations about how long some operation took,\n// and also maintains a historgam of percentiles.\ntype Timer interface {\n\t// Records the time passed in.\n\tRecord(time.Duration)\n}\n\n// NullTimer timer that does nothing\nvar NullTimer Timer = nullTimer{}\n\ntype nullTimer struct{}\n\nfunc (nullTimer) Record(time.Duration) {}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/.gitattributes",
    "content": "# Treat all files in this repo as binary, with no git magic updating\n# line endings. Windows users contributing to Go will need to use a\n# modern version of git and editors capable of LF line endings.\n#\n# We'll prevent accidental CRLF line endings from entering the repo\n# via the git-review gofmt checks.\n#\n# See golang.org/issue/9281\n\n* -text\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/.gitignore",
    "content": "# Add no patterns to .hgignore except for files generated by the build.\nlast-change\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/AUTHORS",
    "content": "# This source code refers to The Go Authors for copyright purposes.\n# The master list of authors is in the main Go distribution,\n# visible at http://tip.golang.org/AUTHORS.\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/CONTRIBUTING.md",
    "content": "# Contributing to Go\n\nGo is an open source project.\n\nIt is the work of hundreds of contributors. We appreciate your help!\n\n\n## Filing issues\n\nWhen [filing an issue](https://golang.org/issue/new), make sure to answer these five questions:\n\n1. What version of Go are you using (`go version`)?\n2. What operating system and processor architecture are you using?\n3. What did you do?\n4. What did you expect to see?\n5. What did you see instead?\n\nGeneral questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.\nThe gophers there will answer or ask you to file an issue if you've tripped over a bug.\n\n## Contributing code\n\nPlease read the [Contribution Guidelines](https://golang.org/doc/contribute.html)\nbefore sending patches.\n\n**We do not accept GitHub pull requests**\n(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review).\n\nUnless otherwise noted, the Go source files are distributed under\nthe BSD-style license found in the LICENSE file.\n\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/CONTRIBUTORS",
    "content": "# This source code was written by the Go contributors.\n# The master list of contributors is in the main Go distribution,\n# visible at http://tip.golang.org/CONTRIBUTORS.\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/README",
    "content": "This repository holds supplementary Go cryptography libraries.\n\nTo submit changes to this repository, see http://golang.org/doc/contribute.html.\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/cast5/cast5.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package cast5 implements CAST5, as defined in RFC 2144. CAST5 is a common\n// OpenPGP cipher.\npackage cast5 // import \"golang.org/x/crypto/cast5\"\n\nimport \"errors\"\n\nconst BlockSize = 8\nconst KeySize = 16\n\ntype Cipher struct {\n\tmasking [16]uint32\n\trotate  [16]uint8\n}\n\nfunc NewCipher(key []byte) (c *Cipher, err error) {\n\tif len(key) != KeySize {\n\t\treturn nil, errors.New(\"CAST5: keys must be 16 bytes\")\n\t}\n\n\tc = new(Cipher)\n\tc.keySchedule(key)\n\treturn\n}\n\nfunc (c *Cipher) BlockSize() int {\n\treturn BlockSize\n}\n\nfunc (c *Cipher) Encrypt(dst, src []byte) {\n\tl := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])\n\tr := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])\n\n\tl, r = r, l^f1(r, c.masking[0], c.rotate[0])\n\tl, r = r, l^f2(r, c.masking[1], c.rotate[1])\n\tl, r = r, l^f3(r, c.masking[2], c.rotate[2])\n\tl, r = r, l^f1(r, c.masking[3], c.rotate[3])\n\n\tl, r = r, l^f2(r, c.masking[4], c.rotate[4])\n\tl, r = r, l^f3(r, c.masking[5], c.rotate[5])\n\tl, r = r, l^f1(r, c.masking[6], c.rotate[6])\n\tl, r = r, l^f2(r, c.masking[7], c.rotate[7])\n\n\tl, r = r, l^f3(r, c.masking[8], c.rotate[8])\n\tl, r = r, l^f1(r, c.masking[9], c.rotate[9])\n\tl, r = r, l^f2(r, c.masking[10], c.rotate[10])\n\tl, r = r, l^f3(r, c.masking[11], c.rotate[11])\n\n\tl, r = r, l^f1(r, c.masking[12], c.rotate[12])\n\tl, r = r, l^f2(r, c.masking[13], c.rotate[13])\n\tl, r = r, l^f3(r, c.masking[14], c.rotate[14])\n\tl, r = r, l^f1(r, c.masking[15], c.rotate[15])\n\n\tdst[0] = uint8(r >> 24)\n\tdst[1] = uint8(r >> 16)\n\tdst[2] = uint8(r >> 8)\n\tdst[3] = uint8(r)\n\tdst[4] = uint8(l >> 24)\n\tdst[5] = uint8(l >> 16)\n\tdst[6] = uint8(l >> 8)\n\tdst[7] = uint8(l)\n}\n\nfunc (c *Cipher) Decrypt(dst, src []byte) {\n\tl := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])\n\tr := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7])\n\n\tl, r = r, l^f1(r, c.masking[15], c.rotate[15])\n\tl, r = r, l^f3(r, c.masking[14], c.rotate[14])\n\tl, r = r, l^f2(r, c.masking[13], c.rotate[13])\n\tl, r = r, l^f1(r, c.masking[12], c.rotate[12])\n\n\tl, r = r, l^f3(r, c.masking[11], c.rotate[11])\n\tl, r = r, l^f2(r, c.masking[10], c.rotate[10])\n\tl, r = r, l^f1(r, c.masking[9], c.rotate[9])\n\tl, r = r, l^f3(r, c.masking[8], c.rotate[8])\n\n\tl, r = r, l^f2(r, c.masking[7], c.rotate[7])\n\tl, r = r, l^f1(r, c.masking[6], c.rotate[6])\n\tl, r = r, l^f3(r, c.masking[5], c.rotate[5])\n\tl, r = r, l^f2(r, c.masking[4], c.rotate[4])\n\n\tl, r = r, l^f1(r, c.masking[3], c.rotate[3])\n\tl, r = r, l^f3(r, c.masking[2], c.rotate[2])\n\tl, r = r, l^f2(r, c.masking[1], c.rotate[1])\n\tl, r = r, l^f1(r, c.masking[0], c.rotate[0])\n\n\tdst[0] = uint8(r >> 24)\n\tdst[1] = uint8(r >> 16)\n\tdst[2] = uint8(r >> 8)\n\tdst[3] = uint8(r)\n\tdst[4] = uint8(l >> 24)\n\tdst[5] = uint8(l >> 16)\n\tdst[6] = uint8(l >> 8)\n\tdst[7] = uint8(l)\n}\n\ntype keyScheduleA [4][7]uint8\ntype keyScheduleB [4][5]uint8\n\n// keyScheduleRound contains the magic values for a round of the key schedule.\n// The keyScheduleA deals with the lines like:\n//   z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]\n// Conceptually, both x and z are in the same array, x first. The first\n// element describes which word of this array gets written to and the\n// second, which word gets read. So, for the line above, it's \"4, 0\", because\n// it's writing to the first word of z, which, being after x, is word 4, and\n// reading from the first word of x: word 0.\n//\n// Next are the indexes into the S-boxes. Now the array is treated as bytes. So\n// \"xD\" is 0xd. The first byte of z is written as \"16 + 0\", just to be clear\n// that it's z that we're indexing.\n//\n// keyScheduleB deals with lines like:\n//   K1 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]\n// \"K1\" is ignored because key words are always written in order. So the five\n// elements are the S-box indexes. They use the same form as in keyScheduleA,\n// above.\n\ntype keyScheduleRound struct{}\ntype keySchedule []keyScheduleRound\n\nvar schedule = []struct {\n\ta keyScheduleA\n\tb keyScheduleB\n}{\n\t{\n\t\tkeyScheduleA{\n\t\t\t{4, 0, 0xd, 0xf, 0xc, 0xe, 0x8},\n\t\t\t{5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa},\n\t\t\t{6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9},\n\t\t\t{7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb},\n\t\t},\n\t\tkeyScheduleB{\n\t\t\t{16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2},\n\t\t\t{16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6},\n\t\t\t{16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9},\n\t\t\t{16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc},\n\t\t},\n\t},\n\t{\n\t\tkeyScheduleA{\n\t\t\t{0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0},\n\t\t\t{1, 4, 0, 2, 1, 3, 16 + 2},\n\t\t\t{2, 5, 7, 6, 5, 4, 16 + 1},\n\t\t\t{3, 7, 0xa, 9, 0xb, 8, 16 + 3},\n\t\t},\n\t\tkeyScheduleB{\n\t\t\t{3, 2, 0xc, 0xd, 8},\n\t\t\t{1, 0, 0xe, 0xf, 0xd},\n\t\t\t{7, 6, 8, 9, 3},\n\t\t\t{5, 4, 0xa, 0xb, 7},\n\t\t},\n\t},\n\t{\n\t\tkeyScheduleA{\n\t\t\t{4, 0, 0xd, 0xf, 0xc, 0xe, 8},\n\t\t\t{5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa},\n\t\t\t{6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9},\n\t\t\t{7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb},\n\t\t},\n\t\tkeyScheduleB{\n\t\t\t{16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9},\n\t\t\t{16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc},\n\t\t\t{16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2},\n\t\t\t{16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6},\n\t\t},\n\t},\n\t{\n\t\tkeyScheduleA{\n\t\t\t{0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0},\n\t\t\t{1, 4, 0, 2, 1, 3, 16 + 2},\n\t\t\t{2, 5, 7, 6, 5, 4, 16 + 1},\n\t\t\t{3, 7, 0xa, 9, 0xb, 8, 16 + 3},\n\t\t},\n\t\tkeyScheduleB{\n\t\t\t{8, 9, 7, 6, 3},\n\t\t\t{0xa, 0xb, 5, 4, 7},\n\t\t\t{0xc, 0xd, 3, 2, 8},\n\t\t\t{0xe, 0xf, 1, 0, 0xd},\n\t\t},\n\t},\n}\n\nfunc (c *Cipher) keySchedule(in []byte) {\n\tvar t [8]uint32\n\tvar k [32]uint32\n\n\tfor i := 0; i < 4; i++ {\n\t\tj := i * 4\n\t\tt[i] = uint32(in[j])<<24 | uint32(in[j+1])<<16 | uint32(in[j+2])<<8 | uint32(in[j+3])\n\t}\n\n\tx := []byte{6, 7, 4, 5}\n\tki := 0\n\n\tfor half := 0; half < 2; half++ {\n\t\tfor _, round := range schedule {\n\t\t\tfor j := 0; j < 4; j++ {\n\t\t\t\tvar a [7]uint8\n\t\t\t\tcopy(a[:], round.a[j][:])\n\t\t\t\tw := t[a[1]]\n\t\t\t\tw ^= sBox[4][(t[a[2]>>2]>>(24-8*(a[2]&3)))&0xff]\n\t\t\t\tw ^= sBox[5][(t[a[3]>>2]>>(24-8*(a[3]&3)))&0xff]\n\t\t\t\tw ^= sBox[6][(t[a[4]>>2]>>(24-8*(a[4]&3)))&0xff]\n\t\t\t\tw ^= sBox[7][(t[a[5]>>2]>>(24-8*(a[5]&3)))&0xff]\n\t\t\t\tw ^= sBox[x[j]][(t[a[6]>>2]>>(24-8*(a[6]&3)))&0xff]\n\t\t\t\tt[a[0]] = w\n\t\t\t}\n\n\t\t\tfor j := 0; j < 4; j++ {\n\t\t\t\tvar b [5]uint8\n\t\t\t\tcopy(b[:], round.b[j][:])\n\t\t\t\tw := sBox[4][(t[b[0]>>2]>>(24-8*(b[0]&3)))&0xff]\n\t\t\t\tw ^= sBox[5][(t[b[1]>>2]>>(24-8*(b[1]&3)))&0xff]\n\t\t\t\tw ^= sBox[6][(t[b[2]>>2]>>(24-8*(b[2]&3)))&0xff]\n\t\t\t\tw ^= sBox[7][(t[b[3]>>2]>>(24-8*(b[3]&3)))&0xff]\n\t\t\t\tw ^= sBox[4+j][(t[b[4]>>2]>>(24-8*(b[4]&3)))&0xff]\n\t\t\t\tk[ki] = w\n\t\t\t\tki++\n\t\t\t}\n\t\t}\n\t}\n\n\tfor i := 0; i < 16; i++ {\n\t\tc.masking[i] = k[i]\n\t\tc.rotate[i] = uint8(k[16+i] & 0x1f)\n\t}\n}\n\n// These are the three 'f' functions. See RFC 2144, section 2.2.\nfunc f1(d, m uint32, r uint8) uint32 {\n\tt := m + d\n\tI := (t << r) | (t >> (32 - r))\n\treturn ((sBox[0][I>>24] ^ sBox[1][(I>>16)&0xff]) - sBox[2][(I>>8)&0xff]) + sBox[3][I&0xff]\n}\n\nfunc f2(d, m uint32, r uint8) uint32 {\n\tt := m ^ d\n\tI := (t << r) | (t >> (32 - r))\n\treturn ((sBox[0][I>>24] - sBox[1][(I>>16)&0xff]) + sBox[2][(I>>8)&0xff]) ^ sBox[3][I&0xff]\n}\n\nfunc f3(d, m uint32, r uint8) uint32 {\n\tt := m - d\n\tI := (t << r) | (t >> (32 - r))\n\treturn ((sBox[0][I>>24] + sBox[1][(I>>16)&0xff]) ^ sBox[2][(I>>8)&0xff]) - sBox[3][I&0xff]\n}\n\nvar sBox = [8][256]uint32{\n\t{\n\t\t0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949,\n\t\t0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e,\n\t\t0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,\n\t\t0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0,\n\t\t0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7,\n\t\t0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935,\n\t\t0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d,\n\t\t0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,\n\t\t0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe,\n\t\t0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3,\n\t\t0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167,\n\t\t0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291,\n\t\t0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779,\n\t\t0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2,\n\t\t0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511,\n\t\t0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d,\n\t\t0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5,\n\t\t0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324,\n\t\t0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,\n\t\t0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc,\n\t\t0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d,\n\t\t0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96,\n\t\t0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a,\n\t\t0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d,\n\t\t0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,\n\t\t0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6,\n\t\t0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9,\n\t\t0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872,\n\t\t0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c,\n\t\t0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e,\n\t\t0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9,\n\t\t0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf,\n\t},\n\t{\n\t\t0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651,\n\t\t0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,\n\t\t0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb,\n\t\t0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806,\n\t\t0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b,\n\t\t0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359,\n\t\t0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b,\n\t\t0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c,\n\t\t0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34,\n\t\t0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb,\n\t\t0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd,\n\t\t0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860,\n\t\t0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b,\n\t\t0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304,\n\t\t0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b,\n\t\t0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,\n\t\t0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c,\n\t\t0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13,\n\t\t0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f,\n\t\t0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,\n\t\t0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6,\n\t\t0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58,\n\t\t0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,\n\t\t0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d,\n\t\t0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6,\n\t\t0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4,\n\t\t0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6,\n\t\t0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f,\n\t\t0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,\n\t\t0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa,\n\t\t0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9,\n\t\t0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1,\n\t},\n\t{\n\t\t0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90,\n\t\t0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5,\n\t\t0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e,\n\t\t0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240,\n\t\t0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,\n\t\t0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,\n\t\t0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71,\n\t\t0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04,\n\t\t0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82,\n\t\t0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15,\n\t\t0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2,\n\t\t0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176,\n\t\t0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148,\n\t\t0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc,\n\t\t0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341,\n\t\t0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e,\n\t\t0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,\n\t\t0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f,\n\t\t0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a,\n\t\t0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b,\n\t\t0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,\n\t\t0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5,\n\t\t0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,\n\t\t0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536,\n\t\t0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc,\n\t\t0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0,\n\t\t0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69,\n\t\t0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2,\n\t\t0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49,\n\t\t0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d,\n\t\t0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a,\n\t\t0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783,\n\t},\n\t{\n\t\t0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1,\n\t\t0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf,\n\t\t0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15,\n\t\t0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121,\n\t\t0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25,\n\t\t0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,\n\t\t0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb,\n\t\t0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5,\n\t\t0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d,\n\t\t0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6,\n\t\t0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23,\n\t\t0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003,\n\t\t0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,\n\t\t0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119,\n\t\t0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,\n\t\t0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a,\n\t\t0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79,\n\t\t0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df,\n\t\t0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26,\n\t\t0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab,\n\t\t0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7,\n\t\t0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417,\n\t\t0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2,\n\t\t0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2,\n\t\t0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,\n\t\t0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919,\n\t\t0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef,\n\t\t0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,\n\t\t0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab,\n\t\t0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04,\n\t\t0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282,\n\t\t0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2,\n\t},\n\t{\n\t\t0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f,\n\t\t0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a,\n\t\t0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff,\n\t\t0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02,\n\t\t0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a,\n\t\t0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7,\n\t\t0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9,\n\t\t0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981,\n\t\t0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774,\n\t\t0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655,\n\t\t0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2,\n\t\t0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910,\n\t\t0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1,\n\t\t0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da,\n\t\t0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049,\n\t\t0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f,\n\t\t0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba,\n\t\t0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be,\n\t\t0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3,\n\t\t0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840,\n\t\t0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4,\n\t\t0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2,\n\t\t0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7,\n\t\t0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5,\n\t\t0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e,\n\t\t0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e,\n\t\t0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801,\n\t\t0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad,\n\t\t0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,\n\t\t0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20,\n\t\t0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8,\n\t\t0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4,\n\t},\n\t{\n\t\t0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac,\n\t\t0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138,\n\t\t0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367,\n\t\t0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98,\n\t\t0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072,\n\t\t0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3,\n\t\t0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd,\n\t\t0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8,\n\t\t0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9,\n\t\t0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54,\n\t\t0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387,\n\t\t0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc,\n\t\t0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf,\n\t\t0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf,\n\t\t0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f,\n\t\t0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289,\n\t\t0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950,\n\t\t0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f,\n\t\t0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b,\n\t\t0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be,\n\t\t0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13,\n\t\t0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976,\n\t\t0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0,\n\t\t0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891,\n\t\t0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da,\n\t\t0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc,\n\t\t0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084,\n\t\t0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25,\n\t\t0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121,\n\t\t0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,\n\t\t0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd,\n\t\t0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f,\n\t},\n\t{\n\t\t0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f,\n\t\t0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de,\n\t\t0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,\n\t\t0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19,\n\t\t0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2,\n\t\t0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516,\n\t\t0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,\n\t\t0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816,\n\t\t0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756,\n\t\t0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a,\n\t\t0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264,\n\t\t0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688,\n\t\t0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28,\n\t\t0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3,\n\t\t0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7,\n\t\t0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,\n\t\t0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,\n\t\t0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a,\n\t\t0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566,\n\t\t0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,\n\t\t0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962,\n\t\t0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e,\n\t\t0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c,\n\t\t0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c,\n\t\t0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285,\n\t\t0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301,\n\t\t0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be,\n\t\t0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767,\n\t\t0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647,\n\t\t0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914,\n\t\t0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c,\n\t\t0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3,\n\t},\n\t{\n\t\t0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5,\n\t\t0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc,\n\t\t0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd,\n\t\t0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d,\n\t\t0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2,\n\t\t0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862,\n\t\t0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc,\n\t\t0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c,\n\t\t0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e,\n\t\t0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039,\n\t\t0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8,\n\t\t0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42,\n\t\t0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5,\n\t\t0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472,\n\t\t0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225,\n\t\t0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c,\n\t\t0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb,\n\t\t0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054,\n\t\t0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70,\n\t\t0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc,\n\t\t0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c,\n\t\t0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3,\n\t\t0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4,\n\t\t0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101,\n\t\t0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f,\n\t\t0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e,\n\t\t0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a,\n\t\t0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c,\n\t\t0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384,\n\t\t0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c,\n\t\t0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82,\n\t\t0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e,\n\t},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/codereview.cfg",
    "content": "issuerepo: golang/go\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/const_amd64.h",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This code was translated into a form compatible with 6a from the public\n// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html\n\n#define REDMASK51     0x0007FFFFFFFFFFFF\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/const_amd64.s",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This code was translated into a form compatible with 6a from the public\n// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html\n\n// +build amd64,!gccgo,!appengine\n\n// These constants cannot be encoded in non-MOVQ immediates.\n// We access them directly from memory instead.\n\nDATA ·_121666_213(SB)/8, $996687872\nGLOBL ·_121666_213(SB), 8, $8\n\nDATA ·_2P0(SB)/8, $0xFFFFFFFFFFFDA\nGLOBL ·_2P0(SB), 8, $8\n\nDATA ·_2P1234(SB)/8, $0xFFFFFFFFFFFFE\nGLOBL ·_2P1234(SB), 8, $8\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/cswap_amd64.s",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,!gccgo,!appengine\n\n// func cswap(inout *[4][5]uint64, v uint64)\nTEXT ·cswap(SB),7,$0\n\tMOVQ inout+0(FP),DI\n\tMOVQ v+8(FP),SI\n\n\tSUBQ $1, SI\n\tNOTQ SI\n\tMOVQ SI, X15\n\tPSHUFD $0x44, X15, X15\n\n\tMOVOU 0(DI), X0\n\tMOVOU 16(DI), X2\n\tMOVOU 32(DI), X4\n\tMOVOU 48(DI), X6\n\tMOVOU 64(DI), X8\n\tMOVOU 80(DI), X1\n\tMOVOU 96(DI), X3\n\tMOVOU 112(DI), X5\n\tMOVOU 128(DI), X7\n\tMOVOU 144(DI), X9\n\n\tMOVO X1, X10\n\tMOVO X3, X11\n\tMOVO X5, X12\n\tMOVO X7, X13\n\tMOVO X9, X14\n\n\tPXOR X0, X10\n\tPXOR X2, X11\n\tPXOR X4, X12\n\tPXOR X6, X13\n\tPXOR X8, X14\n\tPAND X15, X10\n\tPAND X15, X11\n\tPAND X15, X12\n\tPAND X15, X13\n\tPAND X15, X14\n\tPXOR X10, X0\n\tPXOR X10, X1\n\tPXOR X11, X2\n\tPXOR X11, X3\n\tPXOR X12, X4\n\tPXOR X12, X5\n\tPXOR X13, X6\n\tPXOR X13, X7\n\tPXOR X14, X8\n\tPXOR X14, X9\n\n\tMOVOU X0, 0(DI)\n\tMOVOU X2, 16(DI)\n\tMOVOU X4, 32(DI)\n\tMOVOU X6, 48(DI)\n\tMOVOU X8, 64(DI)\n\tMOVOU X1, 80(DI)\n\tMOVOU X3, 96(DI)\n\tMOVOU X5, 112(DI)\n\tMOVOU X7, 128(DI)\n\tMOVOU X9, 144(DI)\n\tRET\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/curve25519.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// We have an implementation in amd64 assembly so this code is only run on\n// non-amd64 platforms. The amd64 assembly does not support gccgo.\n// +build !amd64 gccgo appengine\n\npackage curve25519\n\nimport (\n\t\"encoding/binary\"\n)\n\n// This code is a port of the public domain, \"ref10\" implementation of\n// curve25519 from SUPERCOP 20130419 by D. J. Bernstein.\n\n// fieldElement represents an element of the field GF(2^255 - 19). An element\n// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77\n// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on\n// context.\ntype fieldElement [10]int32\n\nfunc feZero(fe *fieldElement) {\n\tfor i := range fe {\n\t\tfe[i] = 0\n\t}\n}\n\nfunc feOne(fe *fieldElement) {\n\tfeZero(fe)\n\tfe[0] = 1\n}\n\nfunc feAdd(dst, a, b *fieldElement) {\n\tfor i := range dst {\n\t\tdst[i] = a[i] + b[i]\n\t}\n}\n\nfunc feSub(dst, a, b *fieldElement) {\n\tfor i := range dst {\n\t\tdst[i] = a[i] - b[i]\n\t}\n}\n\nfunc feCopy(dst, src *fieldElement) {\n\tfor i := range dst {\n\t\tdst[i] = src[i]\n\t}\n}\n\n// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0.\n//\n// Preconditions: b in {0,1}.\nfunc feCSwap(f, g *fieldElement, b int32) {\n\tb = -b\n\tfor i := range f {\n\t\tt := b & (f[i] ^ g[i])\n\t\tf[i] ^= t\n\t\tg[i] ^= t\n\t}\n}\n\n// load3 reads a 24-bit, little-endian value from in.\nfunc load3(in []byte) int64 {\n\tvar r int64\n\tr = int64(in[0])\n\tr |= int64(in[1]) << 8\n\tr |= int64(in[2]) << 16\n\treturn r\n}\n\n// load4 reads a 32-bit, little-endian value from in.\nfunc load4(in []byte) int64 {\n\treturn int64(binary.LittleEndian.Uint32(in))\n}\n\nfunc feFromBytes(dst *fieldElement, src *[32]byte) {\n\th0 := load4(src[:])\n\th1 := load3(src[4:]) << 6\n\th2 := load3(src[7:]) << 5\n\th3 := load3(src[10:]) << 3\n\th4 := load3(src[13:]) << 2\n\th5 := load4(src[16:])\n\th6 := load3(src[20:]) << 7\n\th7 := load3(src[23:]) << 5\n\th8 := load3(src[26:]) << 4\n\th9 := load3(src[29:]) << 2\n\n\tvar carry [10]int64\n\tcarry[9] = (h9 + 1<<24) >> 25\n\th0 += carry[9] * 19\n\th9 -= carry[9] << 25\n\tcarry[1] = (h1 + 1<<24) >> 25\n\th2 += carry[1]\n\th1 -= carry[1] << 25\n\tcarry[3] = (h3 + 1<<24) >> 25\n\th4 += carry[3]\n\th3 -= carry[3] << 25\n\tcarry[5] = (h5 + 1<<24) >> 25\n\th6 += carry[5]\n\th5 -= carry[5] << 25\n\tcarry[7] = (h7 + 1<<24) >> 25\n\th8 += carry[7]\n\th7 -= carry[7] << 25\n\n\tcarry[0] = (h0 + 1<<25) >> 26\n\th1 += carry[0]\n\th0 -= carry[0] << 26\n\tcarry[2] = (h2 + 1<<25) >> 26\n\th3 += carry[2]\n\th2 -= carry[2] << 26\n\tcarry[4] = (h4 + 1<<25) >> 26\n\th5 += carry[4]\n\th4 -= carry[4] << 26\n\tcarry[6] = (h6 + 1<<25) >> 26\n\th7 += carry[6]\n\th6 -= carry[6] << 26\n\tcarry[8] = (h8 + 1<<25) >> 26\n\th9 += carry[8]\n\th8 -= carry[8] << 26\n\n\tdst[0] = int32(h0)\n\tdst[1] = int32(h1)\n\tdst[2] = int32(h2)\n\tdst[3] = int32(h3)\n\tdst[4] = int32(h4)\n\tdst[5] = int32(h5)\n\tdst[6] = int32(h6)\n\tdst[7] = int32(h7)\n\tdst[8] = int32(h8)\n\tdst[9] = int32(h9)\n}\n\n// feToBytes marshals h to s.\n// Preconditions:\n//   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n//\n// Write p=2^255-19; q=floor(h/p).\n// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).\n//\n// Proof:\n//   Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.\n//   Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.\n//\n//   Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).\n//   Then 0<y<1.\n//\n//   Write r=h-pq.\n//   Have 0<=r<=p-1=2^255-20.\n//   Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.\n//\n//   Write x=r+19(2^-255)r+y.\n//   Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.\n//\n//   Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))\n//   so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.\nfunc feToBytes(s *[32]byte, h *fieldElement) {\n\tvar carry [10]int32\n\n\tq := (19*h[9] + (1 << 24)) >> 25\n\tq = (h[0] + q) >> 26\n\tq = (h[1] + q) >> 25\n\tq = (h[2] + q) >> 26\n\tq = (h[3] + q) >> 25\n\tq = (h[4] + q) >> 26\n\tq = (h[5] + q) >> 25\n\tq = (h[6] + q) >> 26\n\tq = (h[7] + q) >> 25\n\tq = (h[8] + q) >> 26\n\tq = (h[9] + q) >> 25\n\n\t// Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.\n\th[0] += 19 * q\n\t// Goal: Output h-2^255 q, which is between 0 and 2^255-20.\n\n\tcarry[0] = h[0] >> 26\n\th[1] += carry[0]\n\th[0] -= carry[0] << 26\n\tcarry[1] = h[1] >> 25\n\th[2] += carry[1]\n\th[1] -= carry[1] << 25\n\tcarry[2] = h[2] >> 26\n\th[3] += carry[2]\n\th[2] -= carry[2] << 26\n\tcarry[3] = h[3] >> 25\n\th[4] += carry[3]\n\th[3] -= carry[3] << 25\n\tcarry[4] = h[4] >> 26\n\th[5] += carry[4]\n\th[4] -= carry[4] << 26\n\tcarry[5] = h[5] >> 25\n\th[6] += carry[5]\n\th[5] -= carry[5] << 25\n\tcarry[6] = h[6] >> 26\n\th[7] += carry[6]\n\th[6] -= carry[6] << 26\n\tcarry[7] = h[7] >> 25\n\th[8] += carry[7]\n\th[7] -= carry[7] << 25\n\tcarry[8] = h[8] >> 26\n\th[9] += carry[8]\n\th[8] -= carry[8] << 26\n\tcarry[9] = h[9] >> 25\n\th[9] -= carry[9] << 25\n\t// h10 = carry9\n\n\t// Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.\n\t// Have h[0]+...+2^230 h[9] between 0 and 2^255-1;\n\t// evidently 2^255 h10-2^255 q = 0.\n\t// Goal: Output h[0]+...+2^230 h[9].\n\n\ts[0] = byte(h[0] >> 0)\n\ts[1] = byte(h[0] >> 8)\n\ts[2] = byte(h[0] >> 16)\n\ts[3] = byte((h[0] >> 24) | (h[1] << 2))\n\ts[4] = byte(h[1] >> 6)\n\ts[5] = byte(h[1] >> 14)\n\ts[6] = byte((h[1] >> 22) | (h[2] << 3))\n\ts[7] = byte(h[2] >> 5)\n\ts[8] = byte(h[2] >> 13)\n\ts[9] = byte((h[2] >> 21) | (h[3] << 5))\n\ts[10] = byte(h[3] >> 3)\n\ts[11] = byte(h[3] >> 11)\n\ts[12] = byte((h[3] >> 19) | (h[4] << 6))\n\ts[13] = byte(h[4] >> 2)\n\ts[14] = byte(h[4] >> 10)\n\ts[15] = byte(h[4] >> 18)\n\ts[16] = byte(h[5] >> 0)\n\ts[17] = byte(h[5] >> 8)\n\ts[18] = byte(h[5] >> 16)\n\ts[19] = byte((h[5] >> 24) | (h[6] << 1))\n\ts[20] = byte(h[6] >> 7)\n\ts[21] = byte(h[6] >> 15)\n\ts[22] = byte((h[6] >> 23) | (h[7] << 3))\n\ts[23] = byte(h[7] >> 5)\n\ts[24] = byte(h[7] >> 13)\n\ts[25] = byte((h[7] >> 21) | (h[8] << 4))\n\ts[26] = byte(h[8] >> 4)\n\ts[27] = byte(h[8] >> 12)\n\ts[28] = byte((h[8] >> 20) | (h[9] << 6))\n\ts[29] = byte(h[9] >> 2)\n\ts[30] = byte(h[9] >> 10)\n\ts[31] = byte(h[9] >> 18)\n}\n\n// feMul calculates h = f * g\n// Can overlap h with f or g.\n//\n// Preconditions:\n//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n//    |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n//\n// Postconditions:\n//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n//\n// Notes on implementation strategy:\n//\n// Using schoolbook multiplication.\n// Karatsuba would save a little in some cost models.\n//\n// Most multiplications by 2 and 19 are 32-bit precomputations;\n// cheaper than 64-bit postcomputations.\n//\n// There is one remaining multiplication by 19 in the carry chain;\n// one *19 precomputation can be merged into this,\n// but the resulting data flow is considerably less clean.\n//\n// There are 12 carries below.\n// 10 of them are 2-way parallelizable and vectorizable.\n// Can get away with 11 carries, but then data flow is much deeper.\n//\n// With tighter constraints on inputs can squeeze carries into int32.\nfunc feMul(h, f, g *fieldElement) {\n\tf0 := f[0]\n\tf1 := f[1]\n\tf2 := f[2]\n\tf3 := f[3]\n\tf4 := f[4]\n\tf5 := f[5]\n\tf6 := f[6]\n\tf7 := f[7]\n\tf8 := f[8]\n\tf9 := f[9]\n\tg0 := g[0]\n\tg1 := g[1]\n\tg2 := g[2]\n\tg3 := g[3]\n\tg4 := g[4]\n\tg5 := g[5]\n\tg6 := g[6]\n\tg7 := g[7]\n\tg8 := g[8]\n\tg9 := g[9]\n\tg1_19 := 19 * g1 // 1.4*2^29\n\tg2_19 := 19 * g2 // 1.4*2^30; still ok\n\tg3_19 := 19 * g3\n\tg4_19 := 19 * g4\n\tg5_19 := 19 * g5\n\tg6_19 := 19 * g6\n\tg7_19 := 19 * g7\n\tg8_19 := 19 * g8\n\tg9_19 := 19 * g9\n\tf1_2 := 2 * f1\n\tf3_2 := 2 * f3\n\tf5_2 := 2 * f5\n\tf7_2 := 2 * f7\n\tf9_2 := 2 * f9\n\tf0g0 := int64(f0) * int64(g0)\n\tf0g1 := int64(f0) * int64(g1)\n\tf0g2 := int64(f0) * int64(g2)\n\tf0g3 := int64(f0) * int64(g3)\n\tf0g4 := int64(f0) * int64(g4)\n\tf0g5 := int64(f0) * int64(g5)\n\tf0g6 := int64(f0) * int64(g6)\n\tf0g7 := int64(f0) * int64(g7)\n\tf0g8 := int64(f0) * int64(g8)\n\tf0g9 := int64(f0) * int64(g9)\n\tf1g0 := int64(f1) * int64(g0)\n\tf1g1_2 := int64(f1_2) * int64(g1)\n\tf1g2 := int64(f1) * int64(g2)\n\tf1g3_2 := int64(f1_2) * int64(g3)\n\tf1g4 := int64(f1) * int64(g4)\n\tf1g5_2 := int64(f1_2) * int64(g5)\n\tf1g6 := int64(f1) * int64(g6)\n\tf1g7_2 := int64(f1_2) * int64(g7)\n\tf1g8 := int64(f1) * int64(g8)\n\tf1g9_38 := int64(f1_2) * int64(g9_19)\n\tf2g0 := int64(f2) * int64(g0)\n\tf2g1 := int64(f2) * int64(g1)\n\tf2g2 := int64(f2) * int64(g2)\n\tf2g3 := int64(f2) * int64(g3)\n\tf2g4 := int64(f2) * int64(g4)\n\tf2g5 := int64(f2) * int64(g5)\n\tf2g6 := int64(f2) * int64(g6)\n\tf2g7 := int64(f2) * int64(g7)\n\tf2g8_19 := int64(f2) * int64(g8_19)\n\tf2g9_19 := int64(f2) * int64(g9_19)\n\tf3g0 := int64(f3) * int64(g0)\n\tf3g1_2 := int64(f3_2) * int64(g1)\n\tf3g2 := int64(f3) * int64(g2)\n\tf3g3_2 := int64(f3_2) * int64(g3)\n\tf3g4 := int64(f3) * int64(g4)\n\tf3g5_2 := int64(f3_2) * int64(g5)\n\tf3g6 := int64(f3) * int64(g6)\n\tf3g7_38 := int64(f3_2) * int64(g7_19)\n\tf3g8_19 := int64(f3) * int64(g8_19)\n\tf3g9_38 := int64(f3_2) * int64(g9_19)\n\tf4g0 := int64(f4) * int64(g0)\n\tf4g1 := int64(f4) * int64(g1)\n\tf4g2 := int64(f4) * int64(g2)\n\tf4g3 := int64(f4) * int64(g3)\n\tf4g4 := int64(f4) * int64(g4)\n\tf4g5 := int64(f4) * int64(g5)\n\tf4g6_19 := int64(f4) * int64(g6_19)\n\tf4g7_19 := int64(f4) * int64(g7_19)\n\tf4g8_19 := int64(f4) * int64(g8_19)\n\tf4g9_19 := int64(f4) * int64(g9_19)\n\tf5g0 := int64(f5) * int64(g0)\n\tf5g1_2 := int64(f5_2) * int64(g1)\n\tf5g2 := int64(f5) * int64(g2)\n\tf5g3_2 := int64(f5_2) * int64(g3)\n\tf5g4 := int64(f5) * int64(g4)\n\tf5g5_38 := int64(f5_2) * int64(g5_19)\n\tf5g6_19 := int64(f5) * int64(g6_19)\n\tf5g7_38 := int64(f5_2) * int64(g7_19)\n\tf5g8_19 := int64(f5) * int64(g8_19)\n\tf5g9_38 := int64(f5_2) * int64(g9_19)\n\tf6g0 := int64(f6) * int64(g0)\n\tf6g1 := int64(f6) * int64(g1)\n\tf6g2 := int64(f6) * int64(g2)\n\tf6g3 := int64(f6) * int64(g3)\n\tf6g4_19 := int64(f6) * int64(g4_19)\n\tf6g5_19 := int64(f6) * int64(g5_19)\n\tf6g6_19 := int64(f6) * int64(g6_19)\n\tf6g7_19 := int64(f6) * int64(g7_19)\n\tf6g8_19 := int64(f6) * int64(g8_19)\n\tf6g9_19 := int64(f6) * int64(g9_19)\n\tf7g0 := int64(f7) * int64(g0)\n\tf7g1_2 := int64(f7_2) * int64(g1)\n\tf7g2 := int64(f7) * int64(g2)\n\tf7g3_38 := int64(f7_2) * int64(g3_19)\n\tf7g4_19 := int64(f7) * int64(g4_19)\n\tf7g5_38 := int64(f7_2) * int64(g5_19)\n\tf7g6_19 := int64(f7) * int64(g6_19)\n\tf7g7_38 := int64(f7_2) * int64(g7_19)\n\tf7g8_19 := int64(f7) * int64(g8_19)\n\tf7g9_38 := int64(f7_2) * int64(g9_19)\n\tf8g0 := int64(f8) * int64(g0)\n\tf8g1 := int64(f8) * int64(g1)\n\tf8g2_19 := int64(f8) * int64(g2_19)\n\tf8g3_19 := int64(f8) * int64(g3_19)\n\tf8g4_19 := int64(f8) * int64(g4_19)\n\tf8g5_19 := int64(f8) * int64(g5_19)\n\tf8g6_19 := int64(f8) * int64(g6_19)\n\tf8g7_19 := int64(f8) * int64(g7_19)\n\tf8g8_19 := int64(f8) * int64(g8_19)\n\tf8g9_19 := int64(f8) * int64(g9_19)\n\tf9g0 := int64(f9) * int64(g0)\n\tf9g1_38 := int64(f9_2) * int64(g1_19)\n\tf9g2_19 := int64(f9) * int64(g2_19)\n\tf9g3_38 := int64(f9_2) * int64(g3_19)\n\tf9g4_19 := int64(f9) * int64(g4_19)\n\tf9g5_38 := int64(f9_2) * int64(g5_19)\n\tf9g6_19 := int64(f9) * int64(g6_19)\n\tf9g7_38 := int64(f9_2) * int64(g7_19)\n\tf9g8_19 := int64(f9) * int64(g8_19)\n\tf9g9_38 := int64(f9_2) * int64(g9_19)\n\th0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38\n\th1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19\n\th2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38\n\th3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19\n\th4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38\n\th5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19\n\th6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38\n\th7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19\n\th8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38\n\th9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0\n\tvar carry [10]int64\n\n\t// |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))\n\t//   i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8\n\t// |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))\n\t//   i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9\n\n\tcarry[0] = (h0 + (1 << 25)) >> 26\n\th1 += carry[0]\n\th0 -= carry[0] << 26\n\tcarry[4] = (h4 + (1 << 25)) >> 26\n\th5 += carry[4]\n\th4 -= carry[4] << 26\n\t// |h0| <= 2^25\n\t// |h4| <= 2^25\n\t// |h1| <= 1.51*2^58\n\t// |h5| <= 1.51*2^58\n\n\tcarry[1] = (h1 + (1 << 24)) >> 25\n\th2 += carry[1]\n\th1 -= carry[1] << 25\n\tcarry[5] = (h5 + (1 << 24)) >> 25\n\th6 += carry[5]\n\th5 -= carry[5] << 25\n\t// |h1| <= 2^24; from now on fits into int32\n\t// |h5| <= 2^24; from now on fits into int32\n\t// |h2| <= 1.21*2^59\n\t// |h6| <= 1.21*2^59\n\n\tcarry[2] = (h2 + (1 << 25)) >> 26\n\th3 += carry[2]\n\th2 -= carry[2] << 26\n\tcarry[6] = (h6 + (1 << 25)) >> 26\n\th7 += carry[6]\n\th6 -= carry[6] << 26\n\t// |h2| <= 2^25; from now on fits into int32 unchanged\n\t// |h6| <= 2^25; from now on fits into int32 unchanged\n\t// |h3| <= 1.51*2^58\n\t// |h7| <= 1.51*2^58\n\n\tcarry[3] = (h3 + (1 << 24)) >> 25\n\th4 += carry[3]\n\th3 -= carry[3] << 25\n\tcarry[7] = (h7 + (1 << 24)) >> 25\n\th8 += carry[7]\n\th7 -= carry[7] << 25\n\t// |h3| <= 2^24; from now on fits into int32 unchanged\n\t// |h7| <= 2^24; from now on fits into int32 unchanged\n\t// |h4| <= 1.52*2^33\n\t// |h8| <= 1.52*2^33\n\n\tcarry[4] = (h4 + (1 << 25)) >> 26\n\th5 += carry[4]\n\th4 -= carry[4] << 26\n\tcarry[8] = (h8 + (1 << 25)) >> 26\n\th9 += carry[8]\n\th8 -= carry[8] << 26\n\t// |h4| <= 2^25; from now on fits into int32 unchanged\n\t// |h8| <= 2^25; from now on fits into int32 unchanged\n\t// |h5| <= 1.01*2^24\n\t// |h9| <= 1.51*2^58\n\n\tcarry[9] = (h9 + (1 << 24)) >> 25\n\th0 += carry[9] * 19\n\th9 -= carry[9] << 25\n\t// |h9| <= 2^24; from now on fits into int32 unchanged\n\t// |h0| <= 1.8*2^37\n\n\tcarry[0] = (h0 + (1 << 25)) >> 26\n\th1 += carry[0]\n\th0 -= carry[0] << 26\n\t// |h0| <= 2^25; from now on fits into int32 unchanged\n\t// |h1| <= 1.01*2^24\n\n\th[0] = int32(h0)\n\th[1] = int32(h1)\n\th[2] = int32(h2)\n\th[3] = int32(h3)\n\th[4] = int32(h4)\n\th[5] = int32(h5)\n\th[6] = int32(h6)\n\th[7] = int32(h7)\n\th[8] = int32(h8)\n\th[9] = int32(h9)\n}\n\n// feSquare calculates h = f*f. Can overlap h with f.\n//\n// Preconditions:\n//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n//\n// Postconditions:\n//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\nfunc feSquare(h, f *fieldElement) {\n\tf0 := f[0]\n\tf1 := f[1]\n\tf2 := f[2]\n\tf3 := f[3]\n\tf4 := f[4]\n\tf5 := f[5]\n\tf6 := f[6]\n\tf7 := f[7]\n\tf8 := f[8]\n\tf9 := f[9]\n\tf0_2 := 2 * f0\n\tf1_2 := 2 * f1\n\tf2_2 := 2 * f2\n\tf3_2 := 2 * f3\n\tf4_2 := 2 * f4\n\tf5_2 := 2 * f5\n\tf6_2 := 2 * f6\n\tf7_2 := 2 * f7\n\tf5_38 := 38 * f5 // 1.31*2^30\n\tf6_19 := 19 * f6 // 1.31*2^30\n\tf7_38 := 38 * f7 // 1.31*2^30\n\tf8_19 := 19 * f8 // 1.31*2^30\n\tf9_38 := 38 * f9 // 1.31*2^30\n\tf0f0 := int64(f0) * int64(f0)\n\tf0f1_2 := int64(f0_2) * int64(f1)\n\tf0f2_2 := int64(f0_2) * int64(f2)\n\tf0f3_2 := int64(f0_2) * int64(f3)\n\tf0f4_2 := int64(f0_2) * int64(f4)\n\tf0f5_2 := int64(f0_2) * int64(f5)\n\tf0f6_2 := int64(f0_2) * int64(f6)\n\tf0f7_2 := int64(f0_2) * int64(f7)\n\tf0f8_2 := int64(f0_2) * int64(f8)\n\tf0f9_2 := int64(f0_2) * int64(f9)\n\tf1f1_2 := int64(f1_2) * int64(f1)\n\tf1f2_2 := int64(f1_2) * int64(f2)\n\tf1f3_4 := int64(f1_2) * int64(f3_2)\n\tf1f4_2 := int64(f1_2) * int64(f4)\n\tf1f5_4 := int64(f1_2) * int64(f5_2)\n\tf1f6_2 := int64(f1_2) * int64(f6)\n\tf1f7_4 := int64(f1_2) * int64(f7_2)\n\tf1f8_2 := int64(f1_2) * int64(f8)\n\tf1f9_76 := int64(f1_2) * int64(f9_38)\n\tf2f2 := int64(f2) * int64(f2)\n\tf2f3_2 := int64(f2_2) * int64(f3)\n\tf2f4_2 := int64(f2_2) * int64(f4)\n\tf2f5_2 := int64(f2_2) * int64(f5)\n\tf2f6_2 := int64(f2_2) * int64(f6)\n\tf2f7_2 := int64(f2_2) * int64(f7)\n\tf2f8_38 := int64(f2_2) * int64(f8_19)\n\tf2f9_38 := int64(f2) * int64(f9_38)\n\tf3f3_2 := int64(f3_2) * int64(f3)\n\tf3f4_2 := int64(f3_2) * int64(f4)\n\tf3f5_4 := int64(f3_2) * int64(f5_2)\n\tf3f6_2 := int64(f3_2) * int64(f6)\n\tf3f7_76 := int64(f3_2) * int64(f7_38)\n\tf3f8_38 := int64(f3_2) * int64(f8_19)\n\tf3f9_76 := int64(f3_2) * int64(f9_38)\n\tf4f4 := int64(f4) * int64(f4)\n\tf4f5_2 := int64(f4_2) * int64(f5)\n\tf4f6_38 := int64(f4_2) * int64(f6_19)\n\tf4f7_38 := int64(f4) * int64(f7_38)\n\tf4f8_38 := int64(f4_2) * int64(f8_19)\n\tf4f9_38 := int64(f4) * int64(f9_38)\n\tf5f5_38 := int64(f5) * int64(f5_38)\n\tf5f6_38 := int64(f5_2) * int64(f6_19)\n\tf5f7_76 := int64(f5_2) * int64(f7_38)\n\tf5f8_38 := int64(f5_2) * int64(f8_19)\n\tf5f9_76 := int64(f5_2) * int64(f9_38)\n\tf6f6_19 := int64(f6) * int64(f6_19)\n\tf6f7_38 := int64(f6) * int64(f7_38)\n\tf6f8_38 := int64(f6_2) * int64(f8_19)\n\tf6f9_38 := int64(f6) * int64(f9_38)\n\tf7f7_38 := int64(f7) * int64(f7_38)\n\tf7f8_38 := int64(f7_2) * int64(f8_19)\n\tf7f9_76 := int64(f7_2) * int64(f9_38)\n\tf8f8_19 := int64(f8) * int64(f8_19)\n\tf8f9_38 := int64(f8) * int64(f9_38)\n\tf9f9_38 := int64(f9) * int64(f9_38)\n\th0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38\n\th1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38\n\th2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19\n\th3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38\n\th4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38\n\th5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38\n\th6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19\n\th7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38\n\th8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38\n\th9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2\n\tvar carry [10]int64\n\n\tcarry[0] = (h0 + (1 << 25)) >> 26\n\th1 += carry[0]\n\th0 -= carry[0] << 26\n\tcarry[4] = (h4 + (1 << 25)) >> 26\n\th5 += carry[4]\n\th4 -= carry[4] << 26\n\n\tcarry[1] = (h1 + (1 << 24)) >> 25\n\th2 += carry[1]\n\th1 -= carry[1] << 25\n\tcarry[5] = (h5 + (1 << 24)) >> 25\n\th6 += carry[5]\n\th5 -= carry[5] << 25\n\n\tcarry[2] = (h2 + (1 << 25)) >> 26\n\th3 += carry[2]\n\th2 -= carry[2] << 26\n\tcarry[6] = (h6 + (1 << 25)) >> 26\n\th7 += carry[6]\n\th6 -= carry[6] << 26\n\n\tcarry[3] = (h3 + (1 << 24)) >> 25\n\th4 += carry[3]\n\th3 -= carry[3] << 25\n\tcarry[7] = (h7 + (1 << 24)) >> 25\n\th8 += carry[7]\n\th7 -= carry[7] << 25\n\n\tcarry[4] = (h4 + (1 << 25)) >> 26\n\th5 += carry[4]\n\th4 -= carry[4] << 26\n\tcarry[8] = (h8 + (1 << 25)) >> 26\n\th9 += carry[8]\n\th8 -= carry[8] << 26\n\n\tcarry[9] = (h9 + (1 << 24)) >> 25\n\th0 += carry[9] * 19\n\th9 -= carry[9] << 25\n\n\tcarry[0] = (h0 + (1 << 25)) >> 26\n\th1 += carry[0]\n\th0 -= carry[0] << 26\n\n\th[0] = int32(h0)\n\th[1] = int32(h1)\n\th[2] = int32(h2)\n\th[3] = int32(h3)\n\th[4] = int32(h4)\n\th[5] = int32(h5)\n\th[6] = int32(h6)\n\th[7] = int32(h7)\n\th[8] = int32(h8)\n\th[9] = int32(h9)\n}\n\n// feMul121666 calculates h = f * 121666. Can overlap h with f.\n//\n// Preconditions:\n//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n//\n// Postconditions:\n//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\nfunc feMul121666(h, f *fieldElement) {\n\th0 := int64(f[0]) * 121666\n\th1 := int64(f[1]) * 121666\n\th2 := int64(f[2]) * 121666\n\th3 := int64(f[3]) * 121666\n\th4 := int64(f[4]) * 121666\n\th5 := int64(f[5]) * 121666\n\th6 := int64(f[6]) * 121666\n\th7 := int64(f[7]) * 121666\n\th8 := int64(f[8]) * 121666\n\th9 := int64(f[9]) * 121666\n\tvar carry [10]int64\n\n\tcarry[9] = (h9 + (1 << 24)) >> 25\n\th0 += carry[9] * 19\n\th9 -= carry[9] << 25\n\tcarry[1] = (h1 + (1 << 24)) >> 25\n\th2 += carry[1]\n\th1 -= carry[1] << 25\n\tcarry[3] = (h3 + (1 << 24)) >> 25\n\th4 += carry[3]\n\th3 -= carry[3] << 25\n\tcarry[5] = (h5 + (1 << 24)) >> 25\n\th6 += carry[5]\n\th5 -= carry[5] << 25\n\tcarry[7] = (h7 + (1 << 24)) >> 25\n\th8 += carry[7]\n\th7 -= carry[7] << 25\n\n\tcarry[0] = (h0 + (1 << 25)) >> 26\n\th1 += carry[0]\n\th0 -= carry[0] << 26\n\tcarry[2] = (h2 + (1 << 25)) >> 26\n\th3 += carry[2]\n\th2 -= carry[2] << 26\n\tcarry[4] = (h4 + (1 << 25)) >> 26\n\th5 += carry[4]\n\th4 -= carry[4] << 26\n\tcarry[6] = (h6 + (1 << 25)) >> 26\n\th7 += carry[6]\n\th6 -= carry[6] << 26\n\tcarry[8] = (h8 + (1 << 25)) >> 26\n\th9 += carry[8]\n\th8 -= carry[8] << 26\n\n\th[0] = int32(h0)\n\th[1] = int32(h1)\n\th[2] = int32(h2)\n\th[3] = int32(h3)\n\th[4] = int32(h4)\n\th[5] = int32(h5)\n\th[6] = int32(h6)\n\th[7] = int32(h7)\n\th[8] = int32(h8)\n\th[9] = int32(h9)\n}\n\n// feInvert sets out = z^-1.\nfunc feInvert(out, z *fieldElement) {\n\tvar t0, t1, t2, t3 fieldElement\n\tvar i int\n\n\tfeSquare(&t0, z)\n\tfor i = 1; i < 1; i++ {\n\t\tfeSquare(&t0, &t0)\n\t}\n\tfeSquare(&t1, &t0)\n\tfor i = 1; i < 2; i++ {\n\t\tfeSquare(&t1, &t1)\n\t}\n\tfeMul(&t1, z, &t1)\n\tfeMul(&t0, &t0, &t1)\n\tfeSquare(&t2, &t0)\n\tfor i = 1; i < 1; i++ {\n\t\tfeSquare(&t2, &t2)\n\t}\n\tfeMul(&t1, &t1, &t2)\n\tfeSquare(&t2, &t1)\n\tfor i = 1; i < 5; i++ {\n\t\tfeSquare(&t2, &t2)\n\t}\n\tfeMul(&t1, &t2, &t1)\n\tfeSquare(&t2, &t1)\n\tfor i = 1; i < 10; i++ {\n\t\tfeSquare(&t2, &t2)\n\t}\n\tfeMul(&t2, &t2, &t1)\n\tfeSquare(&t3, &t2)\n\tfor i = 1; i < 20; i++ {\n\t\tfeSquare(&t3, &t3)\n\t}\n\tfeMul(&t2, &t3, &t2)\n\tfeSquare(&t2, &t2)\n\tfor i = 1; i < 10; i++ {\n\t\tfeSquare(&t2, &t2)\n\t}\n\tfeMul(&t1, &t2, &t1)\n\tfeSquare(&t2, &t1)\n\tfor i = 1; i < 50; i++ {\n\t\tfeSquare(&t2, &t2)\n\t}\n\tfeMul(&t2, &t2, &t1)\n\tfeSquare(&t3, &t2)\n\tfor i = 1; i < 100; i++ {\n\t\tfeSquare(&t3, &t3)\n\t}\n\tfeMul(&t2, &t3, &t2)\n\tfeSquare(&t2, &t2)\n\tfor i = 1; i < 50; i++ {\n\t\tfeSquare(&t2, &t2)\n\t}\n\tfeMul(&t1, &t2, &t1)\n\tfeSquare(&t1, &t1)\n\tfor i = 1; i < 5; i++ {\n\t\tfeSquare(&t1, &t1)\n\t}\n\tfeMul(out, &t1, &t0)\n}\n\nfunc scalarMult(out, in, base *[32]byte) {\n\tvar e [32]byte\n\n\tcopy(e[:], in[:])\n\te[0] &= 248\n\te[31] &= 127\n\te[31] |= 64\n\n\tvar x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement\n\tfeFromBytes(&x1, base)\n\tfeOne(&x2)\n\tfeCopy(&x3, &x1)\n\tfeOne(&z3)\n\n\tswap := int32(0)\n\tfor pos := 254; pos >= 0; pos-- {\n\t\tb := e[pos/8] >> uint(pos&7)\n\t\tb &= 1\n\t\tswap ^= int32(b)\n\t\tfeCSwap(&x2, &x3, swap)\n\t\tfeCSwap(&z2, &z3, swap)\n\t\tswap = int32(b)\n\n\t\tfeSub(&tmp0, &x3, &z3)\n\t\tfeSub(&tmp1, &x2, &z2)\n\t\tfeAdd(&x2, &x2, &z2)\n\t\tfeAdd(&z2, &x3, &z3)\n\t\tfeMul(&z3, &tmp0, &x2)\n\t\tfeMul(&z2, &z2, &tmp1)\n\t\tfeSquare(&tmp0, &tmp1)\n\t\tfeSquare(&tmp1, &x2)\n\t\tfeAdd(&x3, &z3, &z2)\n\t\tfeSub(&z2, &z3, &z2)\n\t\tfeMul(&x2, &tmp1, &tmp0)\n\t\tfeSub(&tmp1, &tmp1, &tmp0)\n\t\tfeSquare(&z2, &z2)\n\t\tfeMul121666(&z3, &tmp1)\n\t\tfeSquare(&x3, &x3)\n\t\tfeAdd(&tmp0, &tmp0, &z3)\n\t\tfeMul(&z3, &x1, &z2)\n\t\tfeMul(&z2, &tmp1, &tmp0)\n\t}\n\n\tfeCSwap(&x2, &x3, swap)\n\tfeCSwap(&z2, &z3, swap)\n\n\tfeInvert(&z2, &z2)\n\tfeMul(&x2, &x2, &z2)\n\tfeToBytes(out, &x2)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/doc.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package curve25519 provides an implementation of scalar multiplication on\n// the elliptic curve known as curve25519. See https://cr.yp.to/ecdh.html\npackage curve25519 // import \"golang.org/x/crypto/curve25519\"\n\n// basePoint is the x coordinate of the generator of the curve.\nvar basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}\n\n// ScalarMult sets dst to the product in*base where dst and base are the x\n// coordinates of group points and all values are in little-endian form.\nfunc ScalarMult(dst, in, base *[32]byte) {\n\tscalarMult(dst, in, base)\n}\n\n// ScalarBaseMult sets dst to the product in*base where dst and base are the x\n// coordinates of group points, base is the standard generator and all values\n// are in little-endian form.\nfunc ScalarBaseMult(dst, in *[32]byte) {\n\tScalarMult(dst, in, &basePoint)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/freeze_amd64.s",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This code was translated into a form compatible with 6a from the public\n// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html\n\n// +build amd64,!gccgo,!appengine\n\n#include \"const_amd64.h\"\n\n// func freeze(inout *[5]uint64)\nTEXT ·freeze(SB),7,$0-8\n\tMOVQ inout+0(FP), DI\n\n\tMOVQ 0(DI),SI\n\tMOVQ 8(DI),DX\n\tMOVQ 16(DI),CX\n\tMOVQ 24(DI),R8\n\tMOVQ 32(DI),R9\n\tMOVQ $REDMASK51,AX\n\tMOVQ AX,R10\n\tSUBQ $18,R10\n\tMOVQ $3,R11\nREDUCELOOP:\n\tMOVQ SI,R12\n\tSHRQ $51,R12\n\tANDQ AX,SI\n\tADDQ R12,DX\n\tMOVQ DX,R12\n\tSHRQ $51,R12\n\tANDQ AX,DX\n\tADDQ R12,CX\n\tMOVQ CX,R12\n\tSHRQ $51,R12\n\tANDQ AX,CX\n\tADDQ R12,R8\n\tMOVQ R8,R12\n\tSHRQ $51,R12\n\tANDQ AX,R8\n\tADDQ R12,R9\n\tMOVQ R9,R12\n\tSHRQ $51,R12\n\tANDQ AX,R9\n\tIMUL3Q $19,R12,R12\n\tADDQ R12,SI\n\tSUBQ $1,R11\n\tJA REDUCELOOP\n\tMOVQ $1,R12\n\tCMPQ R10,SI\n\tCMOVQLT R11,R12\n\tCMPQ AX,DX\n\tCMOVQNE R11,R12\n\tCMPQ AX,CX\n\tCMOVQNE R11,R12\n\tCMPQ AX,R8\n\tCMOVQNE R11,R12\n\tCMPQ AX,R9\n\tCMOVQNE R11,R12\n\tNEGQ R12\n\tANDQ R12,AX\n\tANDQ R12,R10\n\tSUBQ R10,SI\n\tSUBQ AX,DX\n\tSUBQ AX,CX\n\tSUBQ AX,R8\n\tSUBQ AX,R9\n\tMOVQ SI,0(DI)\n\tMOVQ DX,8(DI)\n\tMOVQ CX,16(DI)\n\tMOVQ R8,24(DI)\n\tMOVQ R9,32(DI)\n\tRET\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This code was translated into a form compatible with 6a from the public\n// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html\n\n// +build amd64,!gccgo,!appengine\n\n#include \"const_amd64.h\"\n\n// func ladderstep(inout *[5][5]uint64)\nTEXT ·ladderstep(SB),0,$296-8\n\tMOVQ inout+0(FP),DI\n\n\tMOVQ 40(DI),SI\n\tMOVQ 48(DI),DX\n\tMOVQ 56(DI),CX\n\tMOVQ 64(DI),R8\n\tMOVQ 72(DI),R9\n\tMOVQ SI,AX\n\tMOVQ DX,R10\n\tMOVQ CX,R11\n\tMOVQ R8,R12\n\tMOVQ R9,R13\n\tADDQ ·_2P0(SB),AX\n\tADDQ ·_2P1234(SB),R10\n\tADDQ ·_2P1234(SB),R11\n\tADDQ ·_2P1234(SB),R12\n\tADDQ ·_2P1234(SB),R13\n\tADDQ 80(DI),SI\n\tADDQ 88(DI),DX\n\tADDQ 96(DI),CX\n\tADDQ 104(DI),R8\n\tADDQ 112(DI),R9\n\tSUBQ 80(DI),AX\n\tSUBQ 88(DI),R10\n\tSUBQ 96(DI),R11\n\tSUBQ 104(DI),R12\n\tSUBQ 112(DI),R13\n\tMOVQ SI,0(SP)\n\tMOVQ DX,8(SP)\n\tMOVQ CX,16(SP)\n\tMOVQ R8,24(SP)\n\tMOVQ R9,32(SP)\n\tMOVQ AX,40(SP)\n\tMOVQ R10,48(SP)\n\tMOVQ R11,56(SP)\n\tMOVQ R12,64(SP)\n\tMOVQ R13,72(SP)\n\tMOVQ 40(SP),AX\n\tMULQ 40(SP)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 40(SP),AX\n\tSHLQ $1,AX\n\tMULQ 48(SP)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 40(SP),AX\n\tSHLQ $1,AX\n\tMULQ 56(SP)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 40(SP),AX\n\tSHLQ $1,AX\n\tMULQ 64(SP)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 40(SP),AX\n\tSHLQ $1,AX\n\tMULQ 72(SP)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 48(SP),AX\n\tMULQ 48(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 48(SP),AX\n\tSHLQ $1,AX\n\tMULQ 56(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 48(SP),AX\n\tSHLQ $1,AX\n\tMULQ 64(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 48(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 72(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 56(SP),AX\n\tMULQ 56(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 56(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 64(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 56(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 72(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 64(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 64(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 64(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 72(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 72(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 72(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tANDQ DX,SI\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tADDQ R10,CX\n\tANDQ DX,R8\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tADDQ R12,CX\n\tANDQ DX,R9\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tADDQ R14,CX\n\tANDQ DX,AX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,80(SP)\n\tMOVQ R8,88(SP)\n\tMOVQ R9,96(SP)\n\tMOVQ AX,104(SP)\n\tMOVQ R10,112(SP)\n\tMOVQ 0(SP),AX\n\tMULQ 0(SP)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 0(SP),AX\n\tSHLQ $1,AX\n\tMULQ 8(SP)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 0(SP),AX\n\tSHLQ $1,AX\n\tMULQ 16(SP)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 0(SP),AX\n\tSHLQ $1,AX\n\tMULQ 24(SP)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 0(SP),AX\n\tSHLQ $1,AX\n\tMULQ 32(SP)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 8(SP),AX\n\tMULQ 8(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 8(SP),AX\n\tSHLQ $1,AX\n\tMULQ 16(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 8(SP),AX\n\tSHLQ $1,AX\n\tMULQ 24(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 8(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 32(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 16(SP),AX\n\tMULQ 16(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 16(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 24(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 16(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 32(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 24(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 24(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 24(SP),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 32(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 32(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tANDQ DX,SI\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tADDQ R10,CX\n\tANDQ DX,R8\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tADDQ R12,CX\n\tANDQ DX,R9\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tADDQ R14,CX\n\tANDQ DX,AX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,120(SP)\n\tMOVQ R8,128(SP)\n\tMOVQ R9,136(SP)\n\tMOVQ AX,144(SP)\n\tMOVQ R10,152(SP)\n\tMOVQ SI,SI\n\tMOVQ R8,DX\n\tMOVQ R9,CX\n\tMOVQ AX,R8\n\tMOVQ R10,R9\n\tADDQ ·_2P0(SB),SI\n\tADDQ ·_2P1234(SB),DX\n\tADDQ ·_2P1234(SB),CX\n\tADDQ ·_2P1234(SB),R8\n\tADDQ ·_2P1234(SB),R9\n\tSUBQ 80(SP),SI\n\tSUBQ 88(SP),DX\n\tSUBQ 96(SP),CX\n\tSUBQ 104(SP),R8\n\tSUBQ 112(SP),R9\n\tMOVQ SI,160(SP)\n\tMOVQ DX,168(SP)\n\tMOVQ CX,176(SP)\n\tMOVQ R8,184(SP)\n\tMOVQ R9,192(SP)\n\tMOVQ 120(DI),SI\n\tMOVQ 128(DI),DX\n\tMOVQ 136(DI),CX\n\tMOVQ 144(DI),R8\n\tMOVQ 152(DI),R9\n\tMOVQ SI,AX\n\tMOVQ DX,R10\n\tMOVQ CX,R11\n\tMOVQ R8,R12\n\tMOVQ R9,R13\n\tADDQ ·_2P0(SB),AX\n\tADDQ ·_2P1234(SB),R10\n\tADDQ ·_2P1234(SB),R11\n\tADDQ ·_2P1234(SB),R12\n\tADDQ ·_2P1234(SB),R13\n\tADDQ 160(DI),SI\n\tADDQ 168(DI),DX\n\tADDQ 176(DI),CX\n\tADDQ 184(DI),R8\n\tADDQ 192(DI),R9\n\tSUBQ 160(DI),AX\n\tSUBQ 168(DI),R10\n\tSUBQ 176(DI),R11\n\tSUBQ 184(DI),R12\n\tSUBQ 192(DI),R13\n\tMOVQ SI,200(SP)\n\tMOVQ DX,208(SP)\n\tMOVQ CX,216(SP)\n\tMOVQ R8,224(SP)\n\tMOVQ R9,232(SP)\n\tMOVQ AX,240(SP)\n\tMOVQ R10,248(SP)\n\tMOVQ R11,256(SP)\n\tMOVQ R12,264(SP)\n\tMOVQ R13,272(SP)\n\tMOVQ 224(SP),SI\n\tIMUL3Q $19,SI,AX\n\tMOVQ AX,280(SP)\n\tMULQ 56(SP)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 232(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMOVQ AX,288(SP)\n\tMULQ 48(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 200(SP),AX\n\tMULQ 40(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 200(SP),AX\n\tMULQ 48(SP)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 200(SP),AX\n\tMULQ 56(SP)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 200(SP),AX\n\tMULQ 64(SP)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 200(SP),AX\n\tMULQ 72(SP)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 208(SP),AX\n\tMULQ 40(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 208(SP),AX\n\tMULQ 48(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 208(SP),AX\n\tMULQ 56(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 208(SP),AX\n\tMULQ 64(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 208(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 72(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 216(SP),AX\n\tMULQ 40(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 216(SP),AX\n\tMULQ 48(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 216(SP),AX\n\tMULQ 56(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 216(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 64(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 216(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 72(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 224(SP),AX\n\tMULQ 40(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 224(SP),AX\n\tMULQ 48(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 280(SP),AX\n\tMULQ 64(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 280(SP),AX\n\tMULQ 72(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 232(SP),AX\n\tMULQ 40(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 288(SP),AX\n\tMULQ 56(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 288(SP),AX\n\tMULQ 64(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 288(SP),AX\n\tMULQ 72(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tANDQ DX,SI\n\tADDQ R10,CX\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tANDQ DX,R8\n\tADDQ R12,CX\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tANDQ DX,R9\n\tADDQ R14,CX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tANDQ DX,AX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,40(SP)\n\tMOVQ R8,48(SP)\n\tMOVQ R9,56(SP)\n\tMOVQ AX,64(SP)\n\tMOVQ R10,72(SP)\n\tMOVQ 264(SP),SI\n\tIMUL3Q $19,SI,AX\n\tMOVQ AX,200(SP)\n\tMULQ 16(SP)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 272(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMOVQ AX,208(SP)\n\tMULQ 8(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 240(SP),AX\n\tMULQ 0(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 240(SP),AX\n\tMULQ 8(SP)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 240(SP),AX\n\tMULQ 16(SP)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 240(SP),AX\n\tMULQ 24(SP)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 240(SP),AX\n\tMULQ 32(SP)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 248(SP),AX\n\tMULQ 0(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 248(SP),AX\n\tMULQ 8(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 248(SP),AX\n\tMULQ 16(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 248(SP),AX\n\tMULQ 24(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 248(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 256(SP),AX\n\tMULQ 0(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 256(SP),AX\n\tMULQ 8(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 256(SP),AX\n\tMULQ 16(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 256(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 24(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 256(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 264(SP),AX\n\tMULQ 0(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 264(SP),AX\n\tMULQ 8(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 200(SP),AX\n\tMULQ 24(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 200(SP),AX\n\tMULQ 32(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 272(SP),AX\n\tMULQ 0(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 208(SP),AX\n\tMULQ 16(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 208(SP),AX\n\tMULQ 24(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 208(SP),AX\n\tMULQ 32(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tANDQ DX,SI\n\tADDQ R10,CX\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tANDQ DX,R8\n\tADDQ R12,CX\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tANDQ DX,R9\n\tADDQ R14,CX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tANDQ DX,AX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,DX\n\tMOVQ R8,CX\n\tMOVQ R9,R11\n\tMOVQ AX,R12\n\tMOVQ R10,R13\n\tADDQ ·_2P0(SB),DX\n\tADDQ ·_2P1234(SB),CX\n\tADDQ ·_2P1234(SB),R11\n\tADDQ ·_2P1234(SB),R12\n\tADDQ ·_2P1234(SB),R13\n\tADDQ 40(SP),SI\n\tADDQ 48(SP),R8\n\tADDQ 56(SP),R9\n\tADDQ 64(SP),AX\n\tADDQ 72(SP),R10\n\tSUBQ 40(SP),DX\n\tSUBQ 48(SP),CX\n\tSUBQ 56(SP),R11\n\tSUBQ 64(SP),R12\n\tSUBQ 72(SP),R13\n\tMOVQ SI,120(DI)\n\tMOVQ R8,128(DI)\n\tMOVQ R9,136(DI)\n\tMOVQ AX,144(DI)\n\tMOVQ R10,152(DI)\n\tMOVQ DX,160(DI)\n\tMOVQ CX,168(DI)\n\tMOVQ R11,176(DI)\n\tMOVQ R12,184(DI)\n\tMOVQ R13,192(DI)\n\tMOVQ 120(DI),AX\n\tMULQ 120(DI)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 120(DI),AX\n\tSHLQ $1,AX\n\tMULQ 128(DI)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 120(DI),AX\n\tSHLQ $1,AX\n\tMULQ 136(DI)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 120(DI),AX\n\tSHLQ $1,AX\n\tMULQ 144(DI)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 120(DI),AX\n\tSHLQ $1,AX\n\tMULQ 152(DI)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 128(DI),AX\n\tMULQ 128(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 128(DI),AX\n\tSHLQ $1,AX\n\tMULQ 136(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 128(DI),AX\n\tSHLQ $1,AX\n\tMULQ 144(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 128(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 152(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 136(DI),AX\n\tMULQ 136(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 136(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 144(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 136(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 152(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 144(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 144(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 144(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 152(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 152(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 152(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tANDQ DX,SI\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tADDQ R10,CX\n\tANDQ DX,R8\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tADDQ R12,CX\n\tANDQ DX,R9\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tADDQ R14,CX\n\tANDQ DX,AX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,120(DI)\n\tMOVQ R8,128(DI)\n\tMOVQ R9,136(DI)\n\tMOVQ AX,144(DI)\n\tMOVQ R10,152(DI)\n\tMOVQ 160(DI),AX\n\tMULQ 160(DI)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 160(DI),AX\n\tSHLQ $1,AX\n\tMULQ 168(DI)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 160(DI),AX\n\tSHLQ $1,AX\n\tMULQ 176(DI)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 160(DI),AX\n\tSHLQ $1,AX\n\tMULQ 184(DI)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 160(DI),AX\n\tSHLQ $1,AX\n\tMULQ 192(DI)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 168(DI),AX\n\tMULQ 168(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 168(DI),AX\n\tSHLQ $1,AX\n\tMULQ 176(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 168(DI),AX\n\tSHLQ $1,AX\n\tMULQ 184(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 168(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 192(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 176(DI),AX\n\tMULQ 176(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 176(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 184(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 176(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 192(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 184(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 184(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 184(DI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 192(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 192(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 192(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tANDQ DX,SI\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tADDQ R10,CX\n\tANDQ DX,R8\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tADDQ R12,CX\n\tANDQ DX,R9\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tADDQ R14,CX\n\tANDQ DX,AX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,160(DI)\n\tMOVQ R8,168(DI)\n\tMOVQ R9,176(DI)\n\tMOVQ AX,184(DI)\n\tMOVQ R10,192(DI)\n\tMOVQ 184(DI),SI\n\tIMUL3Q $19,SI,AX\n\tMOVQ AX,0(SP)\n\tMULQ 16(DI)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 192(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMOVQ AX,8(SP)\n\tMULQ 8(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 160(DI),AX\n\tMULQ 0(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 160(DI),AX\n\tMULQ 8(DI)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 160(DI),AX\n\tMULQ 16(DI)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 160(DI),AX\n\tMULQ 24(DI)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 160(DI),AX\n\tMULQ 32(DI)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 168(DI),AX\n\tMULQ 0(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 168(DI),AX\n\tMULQ 8(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 168(DI),AX\n\tMULQ 16(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 168(DI),AX\n\tMULQ 24(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 168(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 176(DI),AX\n\tMULQ 0(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 176(DI),AX\n\tMULQ 8(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 176(DI),AX\n\tMULQ 16(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 176(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 24(DI)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 176(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 184(DI),AX\n\tMULQ 0(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 184(DI),AX\n\tMULQ 8(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 0(SP),AX\n\tMULQ 24(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 0(SP),AX\n\tMULQ 32(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 192(DI),AX\n\tMULQ 0(DI)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 8(SP),AX\n\tMULQ 16(DI)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 8(SP),AX\n\tMULQ 24(DI)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 8(SP),AX\n\tMULQ 32(DI)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tANDQ DX,SI\n\tADDQ R10,CX\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tANDQ DX,R8\n\tADDQ R12,CX\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tANDQ DX,R9\n\tADDQ R14,CX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tANDQ DX,AX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,160(DI)\n\tMOVQ R8,168(DI)\n\tMOVQ R9,176(DI)\n\tMOVQ AX,184(DI)\n\tMOVQ R10,192(DI)\n\tMOVQ 144(SP),SI\n\tIMUL3Q $19,SI,AX\n\tMOVQ AX,0(SP)\n\tMULQ 96(SP)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 152(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMOVQ AX,8(SP)\n\tMULQ 88(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 120(SP),AX\n\tMULQ 80(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 120(SP),AX\n\tMULQ 88(SP)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 120(SP),AX\n\tMULQ 96(SP)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 120(SP),AX\n\tMULQ 104(SP)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 120(SP),AX\n\tMULQ 112(SP)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 128(SP),AX\n\tMULQ 80(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 128(SP),AX\n\tMULQ 88(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 128(SP),AX\n\tMULQ 96(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 128(SP),AX\n\tMULQ 104(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 128(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 112(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 136(SP),AX\n\tMULQ 80(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 136(SP),AX\n\tMULQ 88(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 136(SP),AX\n\tMULQ 96(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 136(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 104(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 136(SP),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 112(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 144(SP),AX\n\tMULQ 80(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 144(SP),AX\n\tMULQ 88(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 0(SP),AX\n\tMULQ 104(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 0(SP),AX\n\tMULQ 112(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 152(SP),AX\n\tMULQ 80(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 8(SP),AX\n\tMULQ 96(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 8(SP),AX\n\tMULQ 104(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 8(SP),AX\n\tMULQ 112(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tANDQ DX,SI\n\tADDQ R10,CX\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tANDQ DX,R8\n\tADDQ R12,CX\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tANDQ DX,R9\n\tADDQ R14,CX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tANDQ DX,AX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,40(DI)\n\tMOVQ R8,48(DI)\n\tMOVQ R9,56(DI)\n\tMOVQ AX,64(DI)\n\tMOVQ R10,72(DI)\n\tMOVQ 160(SP),AX\n\tMULQ ·_121666_213(SB)\n\tSHRQ $13,AX\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 168(SP),AX\n\tMULQ ·_121666_213(SB)\n\tSHRQ $13,AX\n\tADDQ AX,CX\n\tMOVQ DX,R8\n\tMOVQ 176(SP),AX\n\tMULQ ·_121666_213(SB)\n\tSHRQ $13,AX\n\tADDQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 184(SP),AX\n\tMULQ ·_121666_213(SB)\n\tSHRQ $13,AX\n\tADDQ AX,R9\n\tMOVQ DX,R10\n\tMOVQ 192(SP),AX\n\tMULQ ·_121666_213(SB)\n\tSHRQ $13,AX\n\tADDQ AX,R10\n\tIMUL3Q $19,DX,DX\n\tADDQ DX,SI\n\tADDQ 80(SP),SI\n\tADDQ 88(SP),CX\n\tADDQ 96(SP),R8\n\tADDQ 104(SP),R9\n\tADDQ 112(SP),R10\n\tMOVQ SI,80(DI)\n\tMOVQ CX,88(DI)\n\tMOVQ R8,96(DI)\n\tMOVQ R9,104(DI)\n\tMOVQ R10,112(DI)\n\tMOVQ 104(DI),SI\n\tIMUL3Q $19,SI,AX\n\tMOVQ AX,0(SP)\n\tMULQ 176(SP)\n\tMOVQ AX,SI\n\tMOVQ DX,CX\n\tMOVQ 112(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMOVQ AX,8(SP)\n\tMULQ 168(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 80(DI),AX\n\tMULQ 160(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 80(DI),AX\n\tMULQ 168(SP)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 80(DI),AX\n\tMULQ 176(SP)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 80(DI),AX\n\tMULQ 184(SP)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 80(DI),AX\n\tMULQ 192(SP)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 88(DI),AX\n\tMULQ 160(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 88(DI),AX\n\tMULQ 168(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 88(DI),AX\n\tMULQ 176(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 88(DI),AX\n\tMULQ 184(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 88(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 192(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 96(DI),AX\n\tMULQ 160(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 96(DI),AX\n\tMULQ 168(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 96(DI),AX\n\tMULQ 176(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 96(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 184(SP)\n\tADDQ AX,SI\n\tADCQ DX,CX\n\tMOVQ 96(DI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 192(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 104(DI),AX\n\tMULQ 160(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 104(DI),AX\n\tMULQ 168(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 0(SP),AX\n\tMULQ 184(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 0(SP),AX\n\tMULQ 192(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 112(DI),AX\n\tMULQ 160(SP)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 8(SP),AX\n\tMULQ 176(SP)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 8(SP),AX\n\tMULQ 184(SP)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 8(SP),AX\n\tMULQ 192(SP)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ $REDMASK51,DX\n\tSHLQ $13,CX:SI\n\tANDQ DX,SI\n\tSHLQ $13,R9:R8\n\tANDQ DX,R8\n\tADDQ CX,R8\n\tSHLQ $13,R11:R10\n\tANDQ DX,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ DX,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ DX,R14\n\tADDQ R13,R14\n\tIMUL3Q $19,R15,CX\n\tADDQ CX,SI\n\tMOVQ SI,CX\n\tSHRQ $51,CX\n\tADDQ R8,CX\n\tMOVQ CX,R8\n\tSHRQ $51,CX\n\tANDQ DX,SI\n\tADDQ R10,CX\n\tMOVQ CX,R9\n\tSHRQ $51,CX\n\tANDQ DX,R8\n\tADDQ R12,CX\n\tMOVQ CX,AX\n\tSHRQ $51,CX\n\tANDQ DX,R9\n\tADDQ R14,CX\n\tMOVQ CX,R10\n\tSHRQ $51,CX\n\tANDQ DX,AX\n\tIMUL3Q $19,CX,CX\n\tADDQ CX,SI\n\tANDQ DX,R10\n\tMOVQ SI,80(DI)\n\tMOVQ R8,88(DI)\n\tMOVQ R9,96(DI)\n\tMOVQ AX,104(DI)\n\tMOVQ R10,112(DI)\n\tRET\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,!gccgo,!appengine\n\npackage curve25519\n\n// These functions are implemented in the .s files. The names of the functions\n// in the rest of the file are also taken from the SUPERCOP sources to help\n// people following along.\n\n//go:noescape\n\nfunc cswap(inout *[5]uint64, v uint64)\n\n//go:noescape\n\nfunc ladderstep(inout *[5][5]uint64)\n\n//go:noescape\n\nfunc freeze(inout *[5]uint64)\n\n//go:noescape\n\nfunc mul(dest, a, b *[5]uint64)\n\n//go:noescape\n\nfunc square(out, in *[5]uint64)\n\n// mladder uses a Montgomery ladder to calculate (xr/zr) *= s.\nfunc mladder(xr, zr *[5]uint64, s *[32]byte) {\n\tvar work [5][5]uint64\n\n\twork[0] = *xr\n\tsetint(&work[1], 1)\n\tsetint(&work[2], 0)\n\twork[3] = *xr\n\tsetint(&work[4], 1)\n\n\tj := uint(6)\n\tvar prevbit byte\n\n\tfor i := 31; i >= 0; i-- {\n\t\tfor j < 8 {\n\t\t\tbit := ((*s)[i] >> j) & 1\n\t\t\tswap := bit ^ prevbit\n\t\t\tprevbit = bit\n\t\t\tcswap(&work[1], uint64(swap))\n\t\t\tladderstep(&work)\n\t\t\tj--\n\t\t}\n\t\tj = 7\n\t}\n\n\t*xr = work[1]\n\t*zr = work[2]\n}\n\nfunc scalarMult(out, in, base *[32]byte) {\n\tvar e [32]byte\n\tcopy(e[:], (*in)[:])\n\te[0] &= 248\n\te[31] &= 127\n\te[31] |= 64\n\n\tvar t, z [5]uint64\n\tunpack(&t, base)\n\tmladder(&t, &z, &e)\n\tinvert(&z, &z)\n\tmul(&t, &t, &z)\n\tpack(out, &t)\n}\n\nfunc setint(r *[5]uint64, v uint64) {\n\tr[0] = v\n\tr[1] = 0\n\tr[2] = 0\n\tr[3] = 0\n\tr[4] = 0\n}\n\n// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian\n// order.\nfunc unpack(r *[5]uint64, x *[32]byte) {\n\tr[0] = uint64(x[0]) |\n\t\tuint64(x[1])<<8 |\n\t\tuint64(x[2])<<16 |\n\t\tuint64(x[3])<<24 |\n\t\tuint64(x[4])<<32 |\n\t\tuint64(x[5])<<40 |\n\t\tuint64(x[6]&7)<<48\n\n\tr[1] = uint64(x[6])>>3 |\n\t\tuint64(x[7])<<5 |\n\t\tuint64(x[8])<<13 |\n\t\tuint64(x[9])<<21 |\n\t\tuint64(x[10])<<29 |\n\t\tuint64(x[11])<<37 |\n\t\tuint64(x[12]&63)<<45\n\n\tr[2] = uint64(x[12])>>6 |\n\t\tuint64(x[13])<<2 |\n\t\tuint64(x[14])<<10 |\n\t\tuint64(x[15])<<18 |\n\t\tuint64(x[16])<<26 |\n\t\tuint64(x[17])<<34 |\n\t\tuint64(x[18])<<42 |\n\t\tuint64(x[19]&1)<<50\n\n\tr[3] = uint64(x[19])>>1 |\n\t\tuint64(x[20])<<7 |\n\t\tuint64(x[21])<<15 |\n\t\tuint64(x[22])<<23 |\n\t\tuint64(x[23])<<31 |\n\t\tuint64(x[24])<<39 |\n\t\tuint64(x[25]&15)<<47\n\n\tr[4] = uint64(x[25])>>4 |\n\t\tuint64(x[26])<<4 |\n\t\tuint64(x[27])<<12 |\n\t\tuint64(x[28])<<20 |\n\t\tuint64(x[29])<<28 |\n\t\tuint64(x[30])<<36 |\n\t\tuint64(x[31]&127)<<44\n}\n\n// pack sets out = x where out is the usual, little-endian form of the 5,\n// 51-bit limbs in x.\nfunc pack(out *[32]byte, x *[5]uint64) {\n\tt := *x\n\tfreeze(&t)\n\n\tout[0] = byte(t[0])\n\tout[1] = byte(t[0] >> 8)\n\tout[2] = byte(t[0] >> 16)\n\tout[3] = byte(t[0] >> 24)\n\tout[4] = byte(t[0] >> 32)\n\tout[5] = byte(t[0] >> 40)\n\tout[6] = byte(t[0] >> 48)\n\n\tout[6] ^= byte(t[1]<<3) & 0xf8\n\tout[7] = byte(t[1] >> 5)\n\tout[8] = byte(t[1] >> 13)\n\tout[9] = byte(t[1] >> 21)\n\tout[10] = byte(t[1] >> 29)\n\tout[11] = byte(t[1] >> 37)\n\tout[12] = byte(t[1] >> 45)\n\n\tout[12] ^= byte(t[2]<<6) & 0xc0\n\tout[13] = byte(t[2] >> 2)\n\tout[14] = byte(t[2] >> 10)\n\tout[15] = byte(t[2] >> 18)\n\tout[16] = byte(t[2] >> 26)\n\tout[17] = byte(t[2] >> 34)\n\tout[18] = byte(t[2] >> 42)\n\tout[19] = byte(t[2] >> 50)\n\n\tout[19] ^= byte(t[3]<<1) & 0xfe\n\tout[20] = byte(t[3] >> 7)\n\tout[21] = byte(t[3] >> 15)\n\tout[22] = byte(t[3] >> 23)\n\tout[23] = byte(t[3] >> 31)\n\tout[24] = byte(t[3] >> 39)\n\tout[25] = byte(t[3] >> 47)\n\n\tout[25] ^= byte(t[4]<<4) & 0xf0\n\tout[26] = byte(t[4] >> 4)\n\tout[27] = byte(t[4] >> 12)\n\tout[28] = byte(t[4] >> 20)\n\tout[29] = byte(t[4] >> 28)\n\tout[30] = byte(t[4] >> 36)\n\tout[31] = byte(t[4] >> 44)\n}\n\n// invert calculates r = x^-1 mod p using Fermat's little theorem.\nfunc invert(r *[5]uint64, x *[5]uint64) {\n\tvar z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64\n\n\tsquare(&z2, x)        /* 2 */\n\tsquare(&t, &z2)       /* 4 */\n\tsquare(&t, &t)        /* 8 */\n\tmul(&z9, &t, x)       /* 9 */\n\tmul(&z11, &z9, &z2)   /* 11 */\n\tsquare(&t, &z11)      /* 22 */\n\tmul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */\n\n\tsquare(&t, &z2_5_0)      /* 2^6 - 2^1 */\n\tfor i := 1; i < 5; i++ { /* 2^20 - 2^10 */\n\t\tsquare(&t, &t)\n\t}\n\tmul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */\n\n\tsquare(&t, &z2_10_0)      /* 2^11 - 2^1 */\n\tfor i := 1; i < 10; i++ { /* 2^20 - 2^10 */\n\t\tsquare(&t, &t)\n\t}\n\tmul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */\n\n\tsquare(&t, &z2_20_0)      /* 2^21 - 2^1 */\n\tfor i := 1; i < 20; i++ { /* 2^40 - 2^20 */\n\t\tsquare(&t, &t)\n\t}\n\tmul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */\n\n\tsquare(&t, &t)            /* 2^41 - 2^1 */\n\tfor i := 1; i < 10; i++ { /* 2^50 - 2^10 */\n\t\tsquare(&t, &t)\n\t}\n\tmul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */\n\n\tsquare(&t, &z2_50_0)      /* 2^51 - 2^1 */\n\tfor i := 1; i < 50; i++ { /* 2^100 - 2^50 */\n\t\tsquare(&t, &t)\n\t}\n\tmul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */\n\n\tsquare(&t, &z2_100_0)      /* 2^101 - 2^1 */\n\tfor i := 1; i < 100; i++ { /* 2^200 - 2^100 */\n\t\tsquare(&t, &t)\n\t}\n\tmul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */\n\n\tsquare(&t, &t)            /* 2^201 - 2^1 */\n\tfor i := 1; i < 50; i++ { /* 2^250 - 2^50 */\n\t\tsquare(&t, &t)\n\t}\n\tmul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */\n\n\tsquare(&t, &t) /* 2^251 - 2^1 */\n\tsquare(&t, &t) /* 2^252 - 2^2 */\n\tsquare(&t, &t) /* 2^253 - 2^3 */\n\n\tsquare(&t, &t) /* 2^254 - 2^4 */\n\n\tsquare(&t, &t)   /* 2^255 - 2^5 */\n\tmul(r, &t, &z11) /* 2^255 - 21 */\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/mul_amd64.s",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This code was translated into a form compatible with 6a from the public\n// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html\n\n// +build amd64,!gccgo,!appengine\n\n#include \"const_amd64.h\"\n\n// func mul(dest, a, b *[5]uint64)\nTEXT ·mul(SB),0,$16-24\n\tMOVQ dest+0(FP), DI\n\tMOVQ a+8(FP), SI\n\tMOVQ b+16(FP), DX\n\n\tMOVQ DX,CX\n\tMOVQ 24(SI),DX\n\tIMUL3Q $19,DX,AX\n\tMOVQ AX,0(SP)\n\tMULQ 16(CX)\n\tMOVQ AX,R8\n\tMOVQ DX,R9\n\tMOVQ 32(SI),DX\n\tIMUL3Q $19,DX,AX\n\tMOVQ AX,8(SP)\n\tMULQ 8(CX)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 0(SI),AX\n\tMULQ 0(CX)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 0(SI),AX\n\tMULQ 8(CX)\n\tMOVQ AX,R10\n\tMOVQ DX,R11\n\tMOVQ 0(SI),AX\n\tMULQ 16(CX)\n\tMOVQ AX,R12\n\tMOVQ DX,R13\n\tMOVQ 0(SI),AX\n\tMULQ 24(CX)\n\tMOVQ AX,R14\n\tMOVQ DX,R15\n\tMOVQ 0(SI),AX\n\tMULQ 32(CX)\n\tMOVQ AX,BX\n\tMOVQ DX,BP\n\tMOVQ 8(SI),AX\n\tMULQ 0(CX)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 8(SI),AX\n\tMULQ 8(CX)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 8(SI),AX\n\tMULQ 16(CX)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 8(SI),AX\n\tMULQ 24(CX)\n\tADDQ AX,BX\n\tADCQ DX,BP\n\tMOVQ 8(SI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(CX)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 16(SI),AX\n\tMULQ 0(CX)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 16(SI),AX\n\tMULQ 8(CX)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 16(SI),AX\n\tMULQ 16(CX)\n\tADDQ AX,BX\n\tADCQ DX,BP\n\tMOVQ 16(SI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 24(CX)\n\tADDQ AX,R8\n\tADCQ DX,R9\n\tMOVQ 16(SI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(CX)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 24(SI),AX\n\tMULQ 0(CX)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ 24(SI),AX\n\tMULQ 8(CX)\n\tADDQ AX,BX\n\tADCQ DX,BP\n\tMOVQ 0(SP),AX\n\tMULQ 24(CX)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 0(SP),AX\n\tMULQ 32(CX)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 32(SI),AX\n\tMULQ 0(CX)\n\tADDQ AX,BX\n\tADCQ DX,BP\n\tMOVQ 8(SP),AX\n\tMULQ 16(CX)\n\tADDQ AX,R10\n\tADCQ DX,R11\n\tMOVQ 8(SP),AX\n\tMULQ 24(CX)\n\tADDQ AX,R12\n\tADCQ DX,R13\n\tMOVQ 8(SP),AX\n\tMULQ 32(CX)\n\tADDQ AX,R14\n\tADCQ DX,R15\n\tMOVQ $REDMASK51,SI\n\tSHLQ $13,R9:R8\n\tANDQ SI,R8\n\tSHLQ $13,R11:R10\n\tANDQ SI,R10\n\tADDQ R9,R10\n\tSHLQ $13,R13:R12\n\tANDQ SI,R12\n\tADDQ R11,R12\n\tSHLQ $13,R15:R14\n\tANDQ SI,R14\n\tADDQ R13,R14\n\tSHLQ $13,BP:BX\n\tANDQ SI,BX\n\tADDQ R15,BX\n\tIMUL3Q $19,BP,DX\n\tADDQ DX,R8\n\tMOVQ R8,DX\n\tSHRQ $51,DX\n\tADDQ R10,DX\n\tMOVQ DX,CX\n\tSHRQ $51,DX\n\tANDQ SI,R8\n\tADDQ R12,DX\n\tMOVQ DX,R9\n\tSHRQ $51,DX\n\tANDQ SI,CX\n\tADDQ R14,DX\n\tMOVQ DX,AX\n\tSHRQ $51,DX\n\tANDQ SI,R9\n\tADDQ BX,DX\n\tMOVQ DX,R10\n\tSHRQ $51,DX\n\tANDQ SI,AX\n\tIMUL3Q $19,DX,DX\n\tADDQ DX,R8\n\tANDQ SI,R10\n\tMOVQ R8,0(DI)\n\tMOVQ CX,8(DI)\n\tMOVQ R9,16(DI)\n\tMOVQ AX,24(DI)\n\tMOVQ R10,32(DI)\n\tRET\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/curve25519/square_amd64.s",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// This code was translated into a form compatible with 6a from the public\n// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html\n\n// +build amd64,!gccgo,!appengine\n\n#include \"const_amd64.h\"\n\n// func square(out, in *[5]uint64)\nTEXT ·square(SB),7,$0-16\n\tMOVQ out+0(FP), DI\n\tMOVQ in+8(FP), SI\n\n\tMOVQ 0(SI),AX\n\tMULQ 0(SI)\n\tMOVQ AX,CX\n\tMOVQ DX,R8\n\tMOVQ 0(SI),AX\n\tSHLQ $1,AX\n\tMULQ 8(SI)\n\tMOVQ AX,R9\n\tMOVQ DX,R10\n\tMOVQ 0(SI),AX\n\tSHLQ $1,AX\n\tMULQ 16(SI)\n\tMOVQ AX,R11\n\tMOVQ DX,R12\n\tMOVQ 0(SI),AX\n\tSHLQ $1,AX\n\tMULQ 24(SI)\n\tMOVQ AX,R13\n\tMOVQ DX,R14\n\tMOVQ 0(SI),AX\n\tSHLQ $1,AX\n\tMULQ 32(SI)\n\tMOVQ AX,R15\n\tMOVQ DX,BX\n\tMOVQ 8(SI),AX\n\tMULQ 8(SI)\n\tADDQ AX,R11\n\tADCQ DX,R12\n\tMOVQ 8(SI),AX\n\tSHLQ $1,AX\n\tMULQ 16(SI)\n\tADDQ AX,R13\n\tADCQ DX,R14\n\tMOVQ 8(SI),AX\n\tSHLQ $1,AX\n\tMULQ 24(SI)\n\tADDQ AX,R15\n\tADCQ DX,BX\n\tMOVQ 8(SI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 32(SI)\n\tADDQ AX,CX\n\tADCQ DX,R8\n\tMOVQ 16(SI),AX\n\tMULQ 16(SI)\n\tADDQ AX,R15\n\tADCQ DX,BX\n\tMOVQ 16(SI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 24(SI)\n\tADDQ AX,CX\n\tADCQ DX,R8\n\tMOVQ 16(SI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 32(SI)\n\tADDQ AX,R9\n\tADCQ DX,R10\n\tMOVQ 24(SI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 24(SI)\n\tADDQ AX,R9\n\tADCQ DX,R10\n\tMOVQ 24(SI),DX\n\tIMUL3Q $38,DX,AX\n\tMULQ 32(SI)\n\tADDQ AX,R11\n\tADCQ DX,R12\n\tMOVQ 32(SI),DX\n\tIMUL3Q $19,DX,AX\n\tMULQ 32(SI)\n\tADDQ AX,R13\n\tADCQ DX,R14\n\tMOVQ $REDMASK51,SI\n\tSHLQ $13,R8:CX\n\tANDQ SI,CX\n\tSHLQ $13,R10:R9\n\tANDQ SI,R9\n\tADDQ R8,R9\n\tSHLQ $13,R12:R11\n\tANDQ SI,R11\n\tADDQ R10,R11\n\tSHLQ $13,R14:R13\n\tANDQ SI,R13\n\tADDQ R12,R13\n\tSHLQ $13,BX:R15\n\tANDQ SI,R15\n\tADDQ R14,R15\n\tIMUL3Q $19,BX,DX\n\tADDQ DX,CX\n\tMOVQ CX,DX\n\tSHRQ $51,DX\n\tADDQ R9,DX\n\tANDQ SI,CX\n\tMOVQ DX,R8\n\tSHRQ $51,DX\n\tADDQ R11,DX\n\tANDQ SI,R8\n\tMOVQ DX,R9\n\tSHRQ $51,DX\n\tADDQ R13,DX\n\tANDQ SI,R9\n\tMOVQ DX,AX\n\tSHRQ $51,DX\n\tADDQ R15,DX\n\tANDQ SI,AX\n\tMOVQ DX,R10\n\tSHRQ $51,DX\n\tIMUL3Q $19,DX,DX\n\tADDQ DX,CX\n\tANDQ SI,R10\n\tMOVQ CX,0(DI)\n\tMOVQ R8,8(DI)\n\tMOVQ R9,16(DI)\n\tMOVQ AX,24(DI)\n\tMOVQ R10,32(DI)\n\tRET\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ed25519/ed25519.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package ed25519 implements the Ed25519 signature algorithm. See\n// https://ed25519.cr.yp.to/.\n//\n// These functions are also compatible with the “Ed25519” function defined in\n// RFC 8032.\npackage ed25519\n\n// This code is a port of the public domain, “ref10” implementation of ed25519\n// from SUPERCOP.\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\tcryptorand \"crypto/rand\"\n\t\"crypto/sha512\"\n\t\"errors\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"golang.org/x/crypto/ed25519/internal/edwards25519\"\n)\n\nconst (\n\t// PublicKeySize is the size, in bytes, of public keys as used in this package.\n\tPublicKeySize = 32\n\t// PrivateKeySize is the size, in bytes, of private keys as used in this package.\n\tPrivateKeySize = 64\n\t// SignatureSize is the size, in bytes, of signatures generated and verified by this package.\n\tSignatureSize = 64\n)\n\n// PublicKey is the type of Ed25519 public keys.\ntype PublicKey []byte\n\n// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer.\ntype PrivateKey []byte\n\n// Public returns the PublicKey corresponding to priv.\nfunc (priv PrivateKey) Public() crypto.PublicKey {\n\tpublicKey := make([]byte, PublicKeySize)\n\tcopy(publicKey, priv[32:])\n\treturn PublicKey(publicKey)\n}\n\n// Sign signs the given message with priv.\n// Ed25519 performs two passes over messages to be signed and therefore cannot\n// handle pre-hashed messages. Thus opts.HashFunc() must return zero to\n// indicate the message hasn't been hashed. This can be achieved by passing\n// crypto.Hash(0) as the value for opts.\nfunc (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error) {\n\tif opts.HashFunc() != crypto.Hash(0) {\n\t\treturn nil, errors.New(\"ed25519: cannot sign hashed message\")\n\t}\n\n\treturn Sign(priv, message), nil\n}\n\n// GenerateKey generates a public/private key pair using entropy from rand.\n// If rand is nil, crypto/rand.Reader will be used.\nfunc GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, err error) {\n\tif rand == nil {\n\t\trand = cryptorand.Reader\n\t}\n\n\tprivateKey = make([]byte, PrivateKeySize)\n\tpublicKey = make([]byte, PublicKeySize)\n\t_, err = io.ReadFull(rand, privateKey[:32])\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tdigest := sha512.Sum512(privateKey[:32])\n\tdigest[0] &= 248\n\tdigest[31] &= 127\n\tdigest[31] |= 64\n\n\tvar A edwards25519.ExtendedGroupElement\n\tvar hBytes [32]byte\n\tcopy(hBytes[:], digest[:])\n\tedwards25519.GeScalarMultBase(&A, &hBytes)\n\tvar publicKeyBytes [32]byte\n\tA.ToBytes(&publicKeyBytes)\n\n\tcopy(privateKey[32:], publicKeyBytes[:])\n\tcopy(publicKey, publicKeyBytes[:])\n\n\treturn publicKey, privateKey, nil\n}\n\n// Sign signs the message with privateKey and returns a signature. It will\n// panic if len(privateKey) is not PrivateKeySize.\nfunc Sign(privateKey PrivateKey, message []byte) []byte {\n\tif l := len(privateKey); l != PrivateKeySize {\n\t\tpanic(\"ed25519: bad private key length: \" + strconv.Itoa(l))\n\t}\n\n\th := sha512.New()\n\th.Write(privateKey[:32])\n\n\tvar digest1, messageDigest, hramDigest [64]byte\n\tvar expandedSecretKey [32]byte\n\th.Sum(digest1[:0])\n\tcopy(expandedSecretKey[:], digest1[:])\n\texpandedSecretKey[0] &= 248\n\texpandedSecretKey[31] &= 63\n\texpandedSecretKey[31] |= 64\n\n\th.Reset()\n\th.Write(digest1[32:])\n\th.Write(message)\n\th.Sum(messageDigest[:0])\n\n\tvar messageDigestReduced [32]byte\n\tedwards25519.ScReduce(&messageDigestReduced, &messageDigest)\n\tvar R edwards25519.ExtendedGroupElement\n\tedwards25519.GeScalarMultBase(&R, &messageDigestReduced)\n\n\tvar encodedR [32]byte\n\tR.ToBytes(&encodedR)\n\n\th.Reset()\n\th.Write(encodedR[:])\n\th.Write(privateKey[32:])\n\th.Write(message)\n\th.Sum(hramDigest[:0])\n\tvar hramDigestReduced [32]byte\n\tedwards25519.ScReduce(&hramDigestReduced, &hramDigest)\n\n\tvar s [32]byte\n\tedwards25519.ScMulAdd(&s, &hramDigestReduced, &expandedSecretKey, &messageDigestReduced)\n\n\tsignature := make([]byte, SignatureSize)\n\tcopy(signature[:], encodedR[:])\n\tcopy(signature[32:], s[:])\n\n\treturn signature\n}\n\n// Verify reports whether sig is a valid signature of message by publicKey. It\n// will panic if len(publicKey) is not PublicKeySize.\nfunc Verify(publicKey PublicKey, message, sig []byte) bool {\n\tif l := len(publicKey); l != PublicKeySize {\n\t\tpanic(\"ed25519: bad public key length: \" + strconv.Itoa(l))\n\t}\n\n\tif len(sig) != SignatureSize || sig[63]&224 != 0 {\n\t\treturn false\n\t}\n\n\tvar A edwards25519.ExtendedGroupElement\n\tvar publicKeyBytes [32]byte\n\tcopy(publicKeyBytes[:], publicKey)\n\tif !A.FromBytes(&publicKeyBytes) {\n\t\treturn false\n\t}\n\tedwards25519.FeNeg(&A.X, &A.X)\n\tedwards25519.FeNeg(&A.T, &A.T)\n\n\th := sha512.New()\n\th.Write(sig[:32])\n\th.Write(publicKey[:])\n\th.Write(message)\n\tvar digest [64]byte\n\th.Sum(digest[:0])\n\n\tvar hReduced [32]byte\n\tedwards25519.ScReduce(&hReduced, &digest)\n\n\tvar R edwards25519.ProjectiveGroupElement\n\tvar b [32]byte\n\tcopy(b[:], sig[32:])\n\tedwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &b)\n\n\tvar checkR [32]byte\n\tR.ToBytes(&checkR)\n\treturn bytes.Equal(sig[:32], checkR[:])\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage edwards25519\n\n// These values are from the public domain, “ref10” implementation of ed25519\n// from SUPERCOP.\n\n// d is a constant in the Edwards curve equation.\nvar d = FieldElement{\n\t-10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116,\n}\n\n// d2 is 2*d.\nvar d2 = FieldElement{\n\t-21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199,\n}\n\n// SqrtM1 is the square-root of -1 in the field.\nvar SqrtM1 = FieldElement{\n\t-32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482,\n}\n\n// A is a constant in the Montgomery-form of curve25519.\nvar A = FieldElement{\n\t486662, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n}\n\n// bi contains precomputed multiples of the base-point. See the Ed25519 paper\n// for a discussion about how these values are used.\nvar bi = [8]PreComputedGroupElement{\n\t{\n\t\tFieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605},\n\t\tFieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378},\n\t\tFieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546},\n\t},\n\t{\n\t\tFieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024},\n\t\tFieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574},\n\t\tFieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357},\n\t},\n\t{\n\t\tFieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380},\n\t\tFieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306},\n\t\tFieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942},\n\t},\n\t{\n\t\tFieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766},\n\t\tFieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701},\n\t\tFieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300},\n\t},\n\t{\n\t\tFieldElement{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877},\n\t\tFieldElement{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951},\n\t\tFieldElement{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784},\n\t},\n\t{\n\t\tFieldElement{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436},\n\t\tFieldElement{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918},\n\t\tFieldElement{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877},\n\t},\n\t{\n\t\tFieldElement{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800},\n\t\tFieldElement{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305},\n\t\tFieldElement{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300},\n\t},\n\t{\n\t\tFieldElement{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876},\n\t\tFieldElement{-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619},\n\t\tFieldElement{-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683},\n\t},\n}\n\n// base contains precomputed multiples of the base-point. See the Ed25519 paper\n// for a discussion about how these values are used.\nvar base = [32][8]PreComputedGroupElement{\n\t{\n\t\t{\n\t\t\tFieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605},\n\t\t\tFieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378},\n\t\t\tFieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303},\n\t\t\tFieldElement{-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081},\n\t\t\tFieldElement{26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024},\n\t\t\tFieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574},\n\t\t\tFieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540},\n\t\t\tFieldElement{23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397},\n\t\t\tFieldElement{7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325},\n\t\t},\n\t\t{\n\t\t\tFieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380},\n\t\t\tFieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306},\n\t\t\tFieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777},\n\t\t\tFieldElement{-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737},\n\t\t\tFieldElement{-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652},\n\t\t},\n\t\t{\n\t\t\tFieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766},\n\t\t\tFieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701},\n\t\t\tFieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300},\n\t\t},\n\t\t{\n\t\t\tFieldElement{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726},\n\t\t\tFieldElement{-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955},\n\t\t\tFieldElement{27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171},\n\t\t\tFieldElement{27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510},\n\t\t\tFieldElement{17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639},\n\t\t\tFieldElement{29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963},\n\t\t\tFieldElement{5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568},\n\t\t\tFieldElement{12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335},\n\t\t\tFieldElement{25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007},\n\t\t\tFieldElement{-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772},\n\t\t\tFieldElement{-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653},\n\t\t},\n\t\t{\n\t\t\tFieldElement{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567},\n\t\t\tFieldElement{13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686},\n\t\t\tFieldElement{21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887},\n\t\t\tFieldElement{-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954},\n\t\t\tFieldElement{-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953},\n\t\t},\n\t\t{\n\t\t\tFieldElement{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833},\n\t\t\tFieldElement{-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532},\n\t\t\tFieldElement{-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876},\n\t\t},\n\t\t{\n\t\t\tFieldElement{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268},\n\t\t\tFieldElement{33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214},\n\t\t\tFieldElement{1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800},\n\t\t\tFieldElement{4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645},\n\t\t\tFieldElement{-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664},\n\t\t},\n\t\t{\n\t\t\tFieldElement{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933},\n\t\t\tFieldElement{-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182},\n\t\t\tFieldElement{-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991},\n\t\t\tFieldElement{20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880},\n\t\t\tFieldElement{9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295},\n\t\t\tFieldElement{19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788},\n\t\t\tFieldElement{8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026},\n\t\t\tFieldElement{11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347},\n\t\t\tFieldElement{-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395},\n\t\t\tFieldElement{-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278},\n\t\t\tFieldElement{1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890},\n\t\t},\n\t\t{\n\t\t\tFieldElement{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995},\n\t\t\tFieldElement{-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596},\n\t\t\tFieldElement{-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891},\n\t\t},\n\t\t{\n\t\t\tFieldElement{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060},\n\t\t\tFieldElement{11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608},\n\t\t\tFieldElement{-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389},\n\t\t\tFieldElement{-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016},\n\t\t\tFieldElement{-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505},\n\t\t\tFieldElement{14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553},\n\t\t\tFieldElement{-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220},\n\t\t\tFieldElement{12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631},\n\t\t\tFieldElement{-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099},\n\t\t},\n\t\t{\n\t\t\tFieldElement{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556},\n\t\t\tFieldElement{14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749},\n\t\t\tFieldElement{236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930},\n\t\t},\n\t\t{\n\t\t\tFieldElement{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391},\n\t\t\tFieldElement{5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253},\n\t\t\tFieldElement{20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066},\n\t\t},\n\t\t{\n\t\t\tFieldElement{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958},\n\t\t\tFieldElement{-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082},\n\t\t\tFieldElement{-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521},\n\t\t\tFieldElement{-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807},\n\t\t\tFieldElement{23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948},\n\t\t},\n\t\t{\n\t\t\tFieldElement{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134},\n\t\t\tFieldElement{-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455},\n\t\t\tFieldElement{27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069},\n\t\t\tFieldElement{-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746},\n\t\t\tFieldElement{24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919},\n\t\t},\n\t\t{\n\t\t\tFieldElement{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837},\n\t\t\tFieldElement{8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906},\n\t\t\tFieldElement{-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817},\n\t\t\tFieldElement{10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098},\n\t\t\tFieldElement{10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504},\n\t\t\tFieldElement{-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727},\n\t\t\tFieldElement{28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003},\n\t\t\tFieldElement{-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605},\n\t\t\tFieldElement{-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701},\n\t\t\tFieldElement{-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683},\n\t\t\tFieldElement{29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563},\n\t\t\tFieldElement{-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260},\n\t\t\tFieldElement{-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672},\n\t\t\tFieldElement{23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686},\n\t\t\tFieldElement{-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182},\n\t\t\tFieldElement{-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277},\n\t\t\tFieldElement{14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474},\n\t\t\tFieldElement{-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539},\n\t\t\tFieldElement{-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970},\n\t\t\tFieldElement{19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756},\n\t\t\tFieldElement{-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683},\n\t\t\tFieldElement{-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655},\n\t\t\tFieldElement{-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125},\n\t\t\tFieldElement{-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839},\n\t\t\tFieldElement{-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664},\n\t\t},\n\t\t{\n\t\t\tFieldElement{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294},\n\t\t\tFieldElement{-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899},\n\t\t\tFieldElement{-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070},\n\t\t},\n\t\t{\n\t\t\tFieldElement{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294},\n\t\t\tFieldElement{-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949},\n\t\t\tFieldElement{-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083},\n\t\t},\n\t\t{\n\t\t\tFieldElement{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420},\n\t\t\tFieldElement{-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940},\n\t\t\tFieldElement{29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567},\n\t\t\tFieldElement{20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127},\n\t\t\tFieldElement{-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887},\n\t\t\tFieldElement{22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964},\n\t\t\tFieldElement{16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195},\n\t\t},\n\t\t{\n\t\t\tFieldElement{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244},\n\t\t\tFieldElement{24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999},\n\t\t\tFieldElement{-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274},\n\t\t\tFieldElement{-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236},\n\t\t\tFieldElement{-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761},\n\t\t\tFieldElement{-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884},\n\t\t\tFieldElement{-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638},\n\t\t\tFieldElement{-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490},\n\t\t\tFieldElement{-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170},\n\t\t},\n\t\t{\n\t\t\tFieldElement{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736},\n\t\t\tFieldElement{10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124},\n\t\t\tFieldElement{-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392},\n\t\t},\n\t\t{\n\t\t\tFieldElement{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029},\n\t\t\tFieldElement{6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048},\n\t\t\tFieldElement{28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593},\n\t\t\tFieldElement{26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071},\n\t\t\tFieldElement{-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692},\n\t\t},\n\t\t{\n\t\t\tFieldElement{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687},\n\t\t\tFieldElement{-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441},\n\t\t\tFieldElement{-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460},\n\t\t\tFieldElement{-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007},\n\t\t\tFieldElement{-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005},\n\t\t\tFieldElement{-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674},\n\t\t\tFieldElement{4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035},\n\t\t},\n\t\t{\n\t\t\tFieldElement{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590},\n\t\t\tFieldElement{-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957},\n\t\t\tFieldElement{-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812},\n\t\t},\n\t\t{\n\t\t\tFieldElement{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740},\n\t\t\tFieldElement{-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122},\n\t\t\tFieldElement{-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158},\n\t\t},\n\t\t{\n\t\t\tFieldElement{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885},\n\t\t\tFieldElement{26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140},\n\t\t\tFieldElement{19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857},\n\t\t},\n\t\t{\n\t\t\tFieldElement{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155},\n\t\t\tFieldElement{19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260},\n\t\t\tFieldElement{19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677},\n\t\t\tFieldElement{32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815},\n\t\t\tFieldElement{22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203},\n\t\t\tFieldElement{-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208},\n\t\t\tFieldElement{1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230},\n\t\t},\n\t\t{\n\t\t\tFieldElement{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850},\n\t\t\tFieldElement{-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389},\n\t\t\tFieldElement{-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689},\n\t\t\tFieldElement{14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880},\n\t\t\tFieldElement{5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632},\n\t\t\tFieldElement{-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412},\n\t\t\tFieldElement{20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038},\n\t\t\tFieldElement{-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232},\n\t\t\tFieldElement{-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943},\n\t\t},\n\t\t{\n\t\t\tFieldElement{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856},\n\t\t\tFieldElement{23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738},\n\t\t\tFieldElement{15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718},\n\t\t\tFieldElement{-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697},\n\t\t\tFieldElement{-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912},\n\t\t\tFieldElement{-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358},\n\t\t\tFieldElement{3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849},\n\t\t},\n\t\t{\n\t\t\tFieldElement{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307},\n\t\t\tFieldElement{-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977},\n\t\t\tFieldElement{-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644},\n\t\t\tFieldElement{-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616},\n\t\t\tFieldElement{-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099},\n\t\t\tFieldElement{29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341},\n\t\t\tFieldElement{-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646},\n\t\t\tFieldElement{31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425},\n\t\t\tFieldElement{-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743},\n\t\t\tFieldElement{-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822},\n\t\t\tFieldElement{-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462},\n\t\t},\n\t\t{\n\t\t\tFieldElement{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985},\n\t\t\tFieldElement{9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702},\n\t\t\tFieldElement{-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797},\n\t\t},\n\t\t{\n\t\t\tFieldElement{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293},\n\t\t\tFieldElement{27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100},\n\t\t\tFieldElement{19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186},\n\t\t\tFieldElement{2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610},\n\t\t\tFieldElement{-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707},\n\t\t},\n\t\t{\n\t\t\tFieldElement{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220},\n\t\t\tFieldElement{915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025},\n\t\t\tFieldElement{32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044},\n\t\t},\n\t\t{\n\t\t\tFieldElement{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992},\n\t\t\tFieldElement{-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027},\n\t\t\tFieldElement{21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197},\n\t\t},\n\t\t{\n\t\t\tFieldElement{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901},\n\t\t\tFieldElement{31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952},\n\t\t\tFieldElement{19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390},\n\t\t\tFieldElement{32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730},\n\t\t\tFieldElement{2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180},\n\t\t\tFieldElement{-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272},\n\t\t\tFieldElement{-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970},\n\t\t\tFieldElement{-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772},\n\t\t\tFieldElement{-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750},\n\t\t\tFieldElement{20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373},\n\t\t\tFieldElement{32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144},\n\t\t\tFieldElement{-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195},\n\t\t\tFieldElement{5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684},\n\t\t\tFieldElement{-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518},\n\t\t\tFieldElement{-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793},\n\t\t\tFieldElement{-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794},\n\t\t\tFieldElement{580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435},\n\t\t},\n\t\t{\n\t\t\tFieldElement{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921},\n\t\t\tFieldElement{13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518},\n\t\t\tFieldElement{2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563},\n\t\t},\n\t\t{\n\t\t\tFieldElement{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278},\n\t\t\tFieldElement{-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024},\n\t\t\tFieldElement{4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030},\n\t\t},\n\t\t{\n\t\t\tFieldElement{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783},\n\t\t\tFieldElement{27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717},\n\t\t\tFieldElement{6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844},\n\t\t},\n\t\t{\n\t\t\tFieldElement{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333},\n\t\t\tFieldElement{16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048},\n\t\t\tFieldElement{22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760},\n\t\t\tFieldElement{-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757},\n\t\t\tFieldElement{-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468},\n\t\t\tFieldElement{3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184},\n\t\t\tFieldElement{10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066},\n\t\t\tFieldElement{24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882},\n\t\t\tFieldElement{13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226},\n\t\t},\n\t\t{\n\t\t\tFieldElement{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101},\n\t\t\tFieldElement{29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279},\n\t\t\tFieldElement{-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811},\n\t\t},\n\t\t{\n\t\t\tFieldElement{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709},\n\t\t\tFieldElement{20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714},\n\t\t\tFieldElement{-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121},\n\t\t},\n\t\t{\n\t\t\tFieldElement{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464},\n\t\t\tFieldElement{12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847},\n\t\t\tFieldElement{13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400},\n\t\t},\n\t\t{\n\t\t\tFieldElement{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414},\n\t\t\tFieldElement{-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158},\n\t\t\tFieldElement{17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415},\n\t\t\tFieldElement{-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459},\n\t\t\tFieldElement{-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079},\n\t\t},\n\t\t{\n\t\t\tFieldElement{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412},\n\t\t\tFieldElement{-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743},\n\t\t\tFieldElement{-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022},\n\t\t\tFieldElement{18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429},\n\t\t\tFieldElement{-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861},\n\t\t\tFieldElement{10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000},\n\t\t\tFieldElement{-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101},\n\t\t},\n\t\t{\n\t\t\tFieldElement{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815},\n\t\t\tFieldElement{29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642},\n\t\t\tFieldElement{10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966},\n\t\t},\n\t\t{\n\t\t\tFieldElement{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574},\n\t\t\tFieldElement{-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742},\n\t\t\tFieldElement{-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689},\n\t\t},\n\t\t{\n\t\t\tFieldElement{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020},\n\t\t\tFieldElement{-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772},\n\t\t\tFieldElement{3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953},\n\t\t\tFieldElement{-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218},\n\t\t\tFieldElement{-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265},\n\t\t},\n\t\t{\n\t\t\tFieldElement{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073},\n\t\t\tFieldElement{-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325},\n\t\t\tFieldElement{-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870},\n\t\t\tFieldElement{-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863},\n\t\t\tFieldElement{-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267},\n\t\t\tFieldElement{-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663},\n\t\t\tFieldElement{22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673},\n\t\t\tFieldElement{15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943},\n\t\t\tFieldElement{15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238},\n\t\t\tFieldElement{11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064},\n\t\t\tFieldElement{14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052},\n\t\t\tFieldElement{-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904},\n\t\t\tFieldElement{29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979},\n\t\t\tFieldElement{-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841},\n\t\t\tFieldElement{10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431},\n\t\t},\n\t\t{\n\t\t\tFieldElement{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324},\n\t\t\tFieldElement{-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940},\n\t\t\tFieldElement{10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184},\n\t\t\tFieldElement{14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114},\n\t\t\tFieldElement{30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878},\n\t\t},\n\t\t{\n\t\t\tFieldElement{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784},\n\t\t\tFieldElement{-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091},\n\t\t\tFieldElement{-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208},\n\t\t\tFieldElement{10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864},\n\t\t\tFieldElement{17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661},\n\t\t},\n\t\t{\n\t\t\tFieldElement{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233},\n\t\t\tFieldElement{26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212},\n\t\t\tFieldElement{-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068},\n\t\t\tFieldElement{9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397},\n\t\t\tFieldElement{-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988},\n\t\t},\n\t\t{\n\t\t\tFieldElement{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889},\n\t\t\tFieldElement{32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038},\n\t\t\tFieldElement{14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697},\n\t\t},\n\t\t{\n\t\t\tFieldElement{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875},\n\t\t\tFieldElement{-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905},\n\t\t\tFieldElement{-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656},\n\t\t},\n\t\t{\n\t\t\tFieldElement{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818},\n\t\t\tFieldElement{27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714},\n\t\t\tFieldElement{10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203},\n\t\t},\n\t\t{\n\t\t\tFieldElement{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931},\n\t\t\tFieldElement{-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024},\n\t\t\tFieldElement{-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204},\n\t\t\tFieldElement{20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817},\n\t\t\tFieldElement{27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504},\n\t\t\tFieldElement{-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768},\n\t\t\tFieldElement{-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255},\n\t\t},\n\t\t{\n\t\t\tFieldElement{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790},\n\t\t\tFieldElement{1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438},\n\t\t\tFieldElement{-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333},\n\t\t},\n\t\t{\n\t\t\tFieldElement{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971},\n\t\t\tFieldElement{31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905},\n\t\t\tFieldElement{29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409},\n\t\t},\n\t\t{\n\t\t\tFieldElement{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409},\n\t\t\tFieldElement{6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499},\n\t\t\tFieldElement{-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363},\n\t\t},\n\t\t{\n\t\t\tFieldElement{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664},\n\t\t\tFieldElement{-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324},\n\t\t\tFieldElement{-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940},\n\t\t},\n\t\t{\n\t\t\tFieldElement{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990},\n\t\t\tFieldElement{-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914},\n\t\t\tFieldElement{-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290},\n\t\t},\n\t\t{\n\t\t\tFieldElement{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257},\n\t\t\tFieldElement{-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433},\n\t\t\tFieldElement{-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045},\n\t\t\tFieldElement{11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093},\n\t\t\tFieldElement{-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191},\n\t\t\tFieldElement{-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507},\n\t\t\tFieldElement{-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906},\n\t\t},\n\t\t{\n\t\t\tFieldElement{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018},\n\t\t\tFieldElement{-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109},\n\t\t\tFieldElement{-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528},\n\t\t\tFieldElement{8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625},\n\t\t\tFieldElement{-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286},\n\t\t},\n\t\t{\n\t\t\tFieldElement{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033},\n\t\t\tFieldElement{27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866},\n\t\t\tFieldElement{21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075},\n\t\t\tFieldElement{26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347},\n\t\t\tFieldElement{-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165},\n\t\t\tFieldElement{-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588},\n\t\t\tFieldElement{-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017},\n\t\t\tFieldElement{-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883},\n\t\t\tFieldElement{21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961},\n\t\t},\n\t\t{\n\t\t\tFieldElement{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043},\n\t\t\tFieldElement{29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663},\n\t\t\tFieldElement{-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860},\n\t\t\tFieldElement{2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466},\n\t\t\tFieldElement{-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997},\n\t\t\tFieldElement{-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295},\n\t\t\tFieldElement{-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369},\n\t\t},\n\t\t{\n\t\t\tFieldElement{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385},\n\t\t\tFieldElement{18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109},\n\t\t\tFieldElement{2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906},\n\t\t},\n\t\t{\n\t\t\tFieldElement{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424},\n\t\t\tFieldElement{-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185},\n\t\t\tFieldElement{7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325},\n\t\t\tFieldElement{10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593},\n\t\t\tFieldElement{696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644},\n\t\t\tFieldElement{17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801},\n\t\t\tFieldElement{26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884},\n\t\t\tFieldElement{-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577},\n\t\t\tFieldElement{-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849},\n\t\t},\n\t\t{\n\t\t\tFieldElement{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473},\n\t\t\tFieldElement{-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644},\n\t\t\tFieldElement{-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599},\n\t\t\tFieldElement{-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768},\n\t\t\tFieldElement{-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328},\n\t\t\tFieldElement{-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369},\n\t\t\tFieldElement{20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920},\n\t\t},\n\t\t{\n\t\t\tFieldElement{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815},\n\t\t\tFieldElement{-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025},\n\t\t\tFieldElement{-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448},\n\t\t\tFieldElement{6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981},\n\t\t\tFieldElement{30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165},\n\t\t},\n\t\t{\n\t\t\tFieldElement{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501},\n\t\t\tFieldElement{17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073},\n\t\t\tFieldElement{-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861},\n\t\t},\n\t\t{\n\t\t\tFieldElement{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845},\n\t\t\tFieldElement{-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211},\n\t\t\tFieldElement{18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870},\n\t\t},\n\t\t{\n\t\t\tFieldElement{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096},\n\t\t\tFieldElement{33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803},\n\t\t\tFieldElement{-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965},\n\t\t\tFieldElement{-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505},\n\t\t\tFieldElement{18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782},\n\t\t\tFieldElement{5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900},\n\t\t\tFieldElement{-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208},\n\t\t\tFieldElement{8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232},\n\t\t\tFieldElement{17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719},\n\t\t},\n\t\t{\n\t\t\tFieldElement{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271},\n\t\t\tFieldElement{-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326},\n\t\t\tFieldElement{-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132},\n\t\t},\n\t\t{\n\t\t\tFieldElement{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300},\n\t\t\tFieldElement{8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570},\n\t\t\tFieldElement{15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994},\n\t\t\tFieldElement{-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913},\n\t\t\tFieldElement{31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730},\n\t\t\tFieldElement{842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096},\n\t\t\tFieldElement{-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411},\n\t\t\tFieldElement{-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905},\n\t\t\tFieldElement{-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870},\n\t\t\tFieldElement{-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498},\n\t\t\tFieldElement{12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677},\n\t\t\tFieldElement{10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647},\n\t\t\tFieldElement{-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468},\n\t\t\tFieldElement{21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375},\n\t\t\tFieldElement{-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155},\n\t\t},\n\t\t{\n\t\t\tFieldElement{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725},\n\t\t\tFieldElement{-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612},\n\t\t\tFieldElement{-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944},\n\t\t\tFieldElement{30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928},\n\t\t\tFieldElement{9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406},\n\t\t},\n\t\t{\n\t\t\tFieldElement{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139},\n\t\t\tFieldElement{-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963},\n\t\t\tFieldElement{-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693},\n\t\t},\n\t\t{\n\t\t\tFieldElement{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734},\n\t\t\tFieldElement{-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680},\n\t\t\tFieldElement{-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931},\n\t\t\tFieldElement{-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654},\n\t\t\tFieldElement{22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710},\n\t\t},\n\t\t{\n\t\t\tFieldElement{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180},\n\t\t\tFieldElement{-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684},\n\t\t\tFieldElement{-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501},\n\t\t\tFieldElement{-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413},\n\t\t\tFieldElement{6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874},\n\t\t\tFieldElement{22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962},\n\t\t\tFieldElement{-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899},\n\t\t},\n\t\t{\n\t\t\tFieldElement{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152},\n\t\t\tFieldElement{9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063},\n\t\t\tFieldElement{7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146},\n\t\t\tFieldElement{-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183},\n\t\t\tFieldElement{-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421},\n\t\t\tFieldElement{-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622},\n\t\t\tFieldElement{-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197},\n\t\t},\n\t\t{\n\t\t\tFieldElement{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663},\n\t\t\tFieldElement{31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753},\n\t\t\tFieldElement{4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862},\n\t\t\tFieldElement{-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118},\n\t\t\tFieldElement{26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380},\n\t\t\tFieldElement{16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824},\n\t\t\tFieldElement{28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438},\n\t\t\tFieldElement{-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584},\n\t\t\tFieldElement{-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471},\n\t\t\tFieldElement{18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610},\n\t\t\tFieldElement{19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650},\n\t\t\tFieldElement{14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369},\n\t\t\tFieldElement{19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462},\n\t\t\tFieldElement{-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793},\n\t\t\tFieldElement{-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226},\n\t\t\tFieldElement{18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019},\n\t\t\tFieldElement{-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037},\n\t\t},\n\t\t{\n\t\t\tFieldElement{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171},\n\t\t\tFieldElement{-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132},\n\t\t\tFieldElement{-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841},\n\t\t},\n\t\t{\n\t\t\tFieldElement{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181},\n\t\t\tFieldElement{-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210},\n\t\t\tFieldElement{-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040},\n\t\t},\n\t\t{\n\t\t\tFieldElement{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935},\n\t\t\tFieldElement{24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105},\n\t\t\tFieldElement{-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852},\n\t\t\tFieldElement{5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581},\n\t\t\tFieldElement{-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646},\n\t\t},\n\t\t{\n\t\t\tFieldElement{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844},\n\t\t\tFieldElement{10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025},\n\t\t\tFieldElement{27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068},\n\t\t\tFieldElement{4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192},\n\t\t\tFieldElement{-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259},\n\t\t\tFieldElement{-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426},\n\t\t\tFieldElement{-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305},\n\t\t\tFieldElement{13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832},\n\t\t\tFieldElement{28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011},\n\t\t\tFieldElement{24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447},\n\t\t\tFieldElement{17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245},\n\t\t\tFieldElement{-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859},\n\t\t\tFieldElement{28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915},\n\t\t},\n\t\t{\n\t\t\tFieldElement{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707},\n\t\t\tFieldElement{10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848},\n\t\t\tFieldElement{-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391},\n\t\t\tFieldElement{15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215},\n\t\t\tFieldElement{-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101},\n\t\t},\n\t\t{\n\t\t\tFieldElement{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713},\n\t\t\tFieldElement{21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849},\n\t\t\tFieldElement{-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940},\n\t\t\tFieldElement{-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031},\n\t\t\tFieldElement{-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243},\n\t\t\tFieldElement{-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116},\n\t\t\tFieldElement{-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509},\n\t\t\tFieldElement{-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883},\n\t\t\tFieldElement{15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660},\n\t\t\tFieldElement{4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273},\n\t\t\tFieldElement{-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560},\n\t\t\tFieldElement{-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135},\n\t\t\tFieldElement{2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739},\n\t\t\tFieldElement{18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756},\n\t\t\tFieldElement{-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347},\n\t\t\tFieldElement{-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028},\n\t\t\tFieldElement{21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075},\n\t\t},\n\t\t{\n\t\t\tFieldElement{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799},\n\t\t\tFieldElement{-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609},\n\t\t\tFieldElement{-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989},\n\t\t\tFieldElement{-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523},\n\t\t\tFieldElement{4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278},\n\t\t},\n\t\t{\n\t\t\tFieldElement{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045},\n\t\t\tFieldElement{19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377},\n\t\t\tFieldElement{24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480},\n\t\t},\n\t\t{\n\t\t\tFieldElement{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016},\n\t\t\tFieldElement{510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426},\n\t\t\tFieldElement{18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525},\n\t\t},\n\t\t{\n\t\t\tFieldElement{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396},\n\t\t\tFieldElement{9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080},\n\t\t\tFieldElement{12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892},\n\t\t},\n\t\t{\n\t\t\tFieldElement{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275},\n\t\t\tFieldElement{11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074},\n\t\t\tFieldElement{20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717},\n\t\t\tFieldElement{-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101},\n\t\t\tFieldElement{24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632},\n\t\t\tFieldElement{-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415},\n\t\t\tFieldElement{-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160},\n\t\t},\n\t\t{\n\t\t\tFieldElement{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876},\n\t\t\tFieldElement{22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625},\n\t\t\tFieldElement{-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478},\n\t\t},\n\t\t{\n\t\t\tFieldElement{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164},\n\t\t\tFieldElement{26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595},\n\t\t\tFieldElement{-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858},\n\t\t\tFieldElement{15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193},\n\t\t\tFieldElement{8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942},\n\t\t\tFieldElement{-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635},\n\t\t\tFieldElement{21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948},\n\t\t},\n\t\t{\n\t\t\tFieldElement{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935},\n\t\t\tFieldElement{-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415},\n\t\t\tFieldElement{-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018},\n\t\t\tFieldElement{4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778},\n\t\t\tFieldElement{366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385},\n\t\t\tFieldElement{18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503},\n\t\t\tFieldElement{476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056},\n\t\t\tFieldElement{-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838},\n\t\t\tFieldElement{24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691},\n\t\t\tFieldElement{-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118},\n\t\t\tFieldElement{-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269},\n\t\t\tFieldElement{-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904},\n\t\t\tFieldElement{-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193},\n\t\t\tFieldElement{-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910},\n\t\t\tFieldElement{-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667},\n\t\t\tFieldElement{25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481},\n\t\t\tFieldElement{-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876},\n\t\t},\n\t\t{\n\t\t\tFieldElement{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640},\n\t\t\tFieldElement{-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278},\n\t\t\tFieldElement{-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112},\n\t\t},\n\t\t{\n\t\t\tFieldElement{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272},\n\t\t\tFieldElement{17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012},\n\t\t\tFieldElement{-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046},\n\t\t\tFieldElement{13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345},\n\t\t\tFieldElement{-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937},\n\t\t\tFieldElement{31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636},\n\t\t\tFieldElement{-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429},\n\t\t\tFieldElement{-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576},\n\t\t\tFieldElement{31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490},\n\t\t\tFieldElement{-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104},\n\t\t\tFieldElement{33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053},\n\t\t},\n\t\t{\n\t\t\tFieldElement{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275},\n\t\t\tFieldElement{-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511},\n\t\t\tFieldElement{22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439},\n\t\t\tFieldElement{23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939},\n\t\t\tFieldElement{-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424},\n\t\t},\n\t\t{\n\t\t\tFieldElement{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310},\n\t\t\tFieldElement{3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608},\n\t\t\tFieldElement{-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101},\n\t\t\tFieldElement{21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418},\n\t\t\tFieldElement{18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356},\n\t\t\tFieldElement{9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996},\n\t\t\tFieldElement{-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728},\n\t\t\tFieldElement{-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658},\n\t\t\tFieldElement{-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001},\n\t\t\tFieldElement{-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766},\n\t\t\tFieldElement{18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373},\n\t\t},\n\t\t{\n\t\t\tFieldElement{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458},\n\t\t\tFieldElement{-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628},\n\t\t\tFieldElement{-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062},\n\t\t\tFieldElement{25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616},\n\t\t\tFieldElement{31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014},\n\t\t},\n\t\t{\n\t\t\tFieldElement{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383},\n\t\t\tFieldElement{-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814},\n\t\t\tFieldElement{-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718},\n\t\t},\n\t\t{\n\t\t\tFieldElement{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417},\n\t\t\tFieldElement{2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222},\n\t\t\tFieldElement{33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597},\n\t\t\tFieldElement{23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970},\n\t\t\tFieldElement{1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647},\n\t\t\tFieldElement{13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511},\n\t\t\tFieldElement{-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032},\n\t\t},\n\t},\n\t{\n\t\t{\n\t\t\tFieldElement{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834},\n\t\t\tFieldElement{-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461},\n\t\t\tFieldElement{29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516},\n\t\t\tFieldElement{-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547},\n\t\t\tFieldElement{-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038},\n\t\t\tFieldElement{-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741},\n\t\t\tFieldElement{16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747},\n\t\t\tFieldElement{-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323},\n\t\t\tFieldElement{31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373},\n\t\t\tFieldElement{15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228},\n\t\t\tFieldElement{-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141},\n\t\t},\n\t\t{\n\t\t\tFieldElement{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399},\n\t\t\tFieldElement{11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831},\n\t\t\tFieldElement{-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313},\n\t\t\tFieldElement{-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958},\n\t\t\tFieldElement{-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577},\n\t\t},\n\t\t{\n\t\t\tFieldElement{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743},\n\t\t\tFieldElement{29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684},\n\t\t\tFieldElement{-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476},\n\t\t},\n\t},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage edwards25519\n\n// This code is a port of the public domain, “ref10” implementation of ed25519\n// from SUPERCOP.\n\n// FieldElement represents an element of the field GF(2^255 - 19).  An element\n// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77\n// t[3]+2^102 t[4]+...+2^230 t[9].  Bounds on each t[i] vary depending on\n// context.\ntype FieldElement [10]int32\n\nvar zero FieldElement\n\nfunc FeZero(fe *FieldElement) {\n\tcopy(fe[:], zero[:])\n}\n\nfunc FeOne(fe *FieldElement) {\n\tFeZero(fe)\n\tfe[0] = 1\n}\n\nfunc FeAdd(dst, a, b *FieldElement) {\n\tdst[0] = a[0] + b[0]\n\tdst[1] = a[1] + b[1]\n\tdst[2] = a[2] + b[2]\n\tdst[3] = a[3] + b[3]\n\tdst[4] = a[4] + b[4]\n\tdst[5] = a[5] + b[5]\n\tdst[6] = a[6] + b[6]\n\tdst[7] = a[7] + b[7]\n\tdst[8] = a[8] + b[8]\n\tdst[9] = a[9] + b[9]\n}\n\nfunc FeSub(dst, a, b *FieldElement) {\n\tdst[0] = a[0] - b[0]\n\tdst[1] = a[1] - b[1]\n\tdst[2] = a[2] - b[2]\n\tdst[3] = a[3] - b[3]\n\tdst[4] = a[4] - b[4]\n\tdst[5] = a[5] - b[5]\n\tdst[6] = a[6] - b[6]\n\tdst[7] = a[7] - b[7]\n\tdst[8] = a[8] - b[8]\n\tdst[9] = a[9] - b[9]\n}\n\nfunc FeCopy(dst, src *FieldElement) {\n\tcopy(dst[:], src[:])\n}\n\n// Replace (f,g) with (g,g) if b == 1;\n// replace (f,g) with (f,g) if b == 0.\n//\n// Preconditions: b in {0,1}.\nfunc FeCMove(f, g *FieldElement, b int32) {\n\tb = -b\n\tf[0] ^= b & (f[0] ^ g[0])\n\tf[1] ^= b & (f[1] ^ g[1])\n\tf[2] ^= b & (f[2] ^ g[2])\n\tf[3] ^= b & (f[3] ^ g[3])\n\tf[4] ^= b & (f[4] ^ g[4])\n\tf[5] ^= b & (f[5] ^ g[5])\n\tf[6] ^= b & (f[6] ^ g[6])\n\tf[7] ^= b & (f[7] ^ g[7])\n\tf[8] ^= b & (f[8] ^ g[8])\n\tf[9] ^= b & (f[9] ^ g[9])\n}\n\nfunc load3(in []byte) int64 {\n\tvar r int64\n\tr = int64(in[0])\n\tr |= int64(in[1]) << 8\n\tr |= int64(in[2]) << 16\n\treturn r\n}\n\nfunc load4(in []byte) int64 {\n\tvar r int64\n\tr = int64(in[0])\n\tr |= int64(in[1]) << 8\n\tr |= int64(in[2]) << 16\n\tr |= int64(in[3]) << 24\n\treturn r\n}\n\nfunc FeFromBytes(dst *FieldElement, src *[32]byte) {\n\th0 := load4(src[:])\n\th1 := load3(src[4:]) << 6\n\th2 := load3(src[7:]) << 5\n\th3 := load3(src[10:]) << 3\n\th4 := load3(src[13:]) << 2\n\th5 := load4(src[16:])\n\th6 := load3(src[20:]) << 7\n\th7 := load3(src[23:]) << 5\n\th8 := load3(src[26:]) << 4\n\th9 := (load3(src[29:]) & 8388607) << 2\n\n\tFeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)\n}\n\n// FeToBytes marshals h to s.\n// Preconditions:\n//   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n//\n// Write p=2^255-19; q=floor(h/p).\n// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).\n//\n// Proof:\n//   Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.\n//   Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.\n//\n//   Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).\n//   Then 0<y<1.\n//\n//   Write r=h-pq.\n//   Have 0<=r<=p-1=2^255-20.\n//   Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.\n//\n//   Write x=r+19(2^-255)r+y.\n//   Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.\n//\n//   Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))\n//   so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.\nfunc FeToBytes(s *[32]byte, h *FieldElement) {\n\tvar carry [10]int32\n\n\tq := (19*h[9] + (1 << 24)) >> 25\n\tq = (h[0] + q) >> 26\n\tq = (h[1] + q) >> 25\n\tq = (h[2] + q) >> 26\n\tq = (h[3] + q) >> 25\n\tq = (h[4] + q) >> 26\n\tq = (h[5] + q) >> 25\n\tq = (h[6] + q) >> 26\n\tq = (h[7] + q) >> 25\n\tq = (h[8] + q) >> 26\n\tq = (h[9] + q) >> 25\n\n\t// Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.\n\th[0] += 19 * q\n\t// Goal: Output h-2^255 q, which is between 0 and 2^255-20.\n\n\tcarry[0] = h[0] >> 26\n\th[1] += carry[0]\n\th[0] -= carry[0] << 26\n\tcarry[1] = h[1] >> 25\n\th[2] += carry[1]\n\th[1] -= carry[1] << 25\n\tcarry[2] = h[2] >> 26\n\th[3] += carry[2]\n\th[2] -= carry[2] << 26\n\tcarry[3] = h[3] >> 25\n\th[4] += carry[3]\n\th[3] -= carry[3] << 25\n\tcarry[4] = h[4] >> 26\n\th[5] += carry[4]\n\th[4] -= carry[4] << 26\n\tcarry[5] = h[5] >> 25\n\th[6] += carry[5]\n\th[5] -= carry[5] << 25\n\tcarry[6] = h[6] >> 26\n\th[7] += carry[6]\n\th[6] -= carry[6] << 26\n\tcarry[7] = h[7] >> 25\n\th[8] += carry[7]\n\th[7] -= carry[7] << 25\n\tcarry[8] = h[8] >> 26\n\th[9] += carry[8]\n\th[8] -= carry[8] << 26\n\tcarry[9] = h[9] >> 25\n\th[9] -= carry[9] << 25\n\t// h10 = carry9\n\n\t// Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.\n\t// Have h[0]+...+2^230 h[9] between 0 and 2^255-1;\n\t// evidently 2^255 h10-2^255 q = 0.\n\t// Goal: Output h[0]+...+2^230 h[9].\n\n\ts[0] = byte(h[0] >> 0)\n\ts[1] = byte(h[0] >> 8)\n\ts[2] = byte(h[0] >> 16)\n\ts[3] = byte((h[0] >> 24) | (h[1] << 2))\n\ts[4] = byte(h[1] >> 6)\n\ts[5] = byte(h[1] >> 14)\n\ts[6] = byte((h[1] >> 22) | (h[2] << 3))\n\ts[7] = byte(h[2] >> 5)\n\ts[8] = byte(h[2] >> 13)\n\ts[9] = byte((h[2] >> 21) | (h[3] << 5))\n\ts[10] = byte(h[3] >> 3)\n\ts[11] = byte(h[3] >> 11)\n\ts[12] = byte((h[3] >> 19) | (h[4] << 6))\n\ts[13] = byte(h[4] >> 2)\n\ts[14] = byte(h[4] >> 10)\n\ts[15] = byte(h[4] >> 18)\n\ts[16] = byte(h[5] >> 0)\n\ts[17] = byte(h[5] >> 8)\n\ts[18] = byte(h[5] >> 16)\n\ts[19] = byte((h[5] >> 24) | (h[6] << 1))\n\ts[20] = byte(h[6] >> 7)\n\ts[21] = byte(h[6] >> 15)\n\ts[22] = byte((h[6] >> 23) | (h[7] << 3))\n\ts[23] = byte(h[7] >> 5)\n\ts[24] = byte(h[7] >> 13)\n\ts[25] = byte((h[7] >> 21) | (h[8] << 4))\n\ts[26] = byte(h[8] >> 4)\n\ts[27] = byte(h[8] >> 12)\n\ts[28] = byte((h[8] >> 20) | (h[9] << 6))\n\ts[29] = byte(h[9] >> 2)\n\ts[30] = byte(h[9] >> 10)\n\ts[31] = byte(h[9] >> 18)\n}\n\nfunc FeIsNegative(f *FieldElement) byte {\n\tvar s [32]byte\n\tFeToBytes(&s, f)\n\treturn s[0] & 1\n}\n\nfunc FeIsNonZero(f *FieldElement) int32 {\n\tvar s [32]byte\n\tFeToBytes(&s, f)\n\tvar x uint8\n\tfor _, b := range s {\n\t\tx |= b\n\t}\n\tx |= x >> 4\n\tx |= x >> 2\n\tx |= x >> 1\n\treturn int32(x & 1)\n}\n\n// FeNeg sets h = -f\n//\n// Preconditions:\n//    |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n//\n// Postconditions:\n//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\nfunc FeNeg(h, f *FieldElement) {\n\th[0] = -f[0]\n\th[1] = -f[1]\n\th[2] = -f[2]\n\th[3] = -f[3]\n\th[4] = -f[4]\n\th[5] = -f[5]\n\th[6] = -f[6]\n\th[7] = -f[7]\n\th[8] = -f[8]\n\th[9] = -f[9]\n}\n\nfunc FeCombine(h *FieldElement, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) {\n\tvar c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 int64\n\n\t/*\n\t  |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))\n\t    i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8\n\t  |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))\n\t    i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9\n\t*/\n\n\tc0 = (h0 + (1 << 25)) >> 26\n\th1 += c0\n\th0 -= c0 << 26\n\tc4 = (h4 + (1 << 25)) >> 26\n\th5 += c4\n\th4 -= c4 << 26\n\t/* |h0| <= 2^25 */\n\t/* |h4| <= 2^25 */\n\t/* |h1| <= 1.51*2^58 */\n\t/* |h5| <= 1.51*2^58 */\n\n\tc1 = (h1 + (1 << 24)) >> 25\n\th2 += c1\n\th1 -= c1 << 25\n\tc5 = (h5 + (1 << 24)) >> 25\n\th6 += c5\n\th5 -= c5 << 25\n\t/* |h1| <= 2^24; from now on fits into int32 */\n\t/* |h5| <= 2^24; from now on fits into int32 */\n\t/* |h2| <= 1.21*2^59 */\n\t/* |h6| <= 1.21*2^59 */\n\n\tc2 = (h2 + (1 << 25)) >> 26\n\th3 += c2\n\th2 -= c2 << 26\n\tc6 = (h6 + (1 << 25)) >> 26\n\th7 += c6\n\th6 -= c6 << 26\n\t/* |h2| <= 2^25; from now on fits into int32 unchanged */\n\t/* |h6| <= 2^25; from now on fits into int32 unchanged */\n\t/* |h3| <= 1.51*2^58 */\n\t/* |h7| <= 1.51*2^58 */\n\n\tc3 = (h3 + (1 << 24)) >> 25\n\th4 += c3\n\th3 -= c3 << 25\n\tc7 = (h7 + (1 << 24)) >> 25\n\th8 += c7\n\th7 -= c7 << 25\n\t/* |h3| <= 2^24; from now on fits into int32 unchanged */\n\t/* |h7| <= 2^24; from now on fits into int32 unchanged */\n\t/* |h4| <= 1.52*2^33 */\n\t/* |h8| <= 1.52*2^33 */\n\n\tc4 = (h4 + (1 << 25)) >> 26\n\th5 += c4\n\th4 -= c4 << 26\n\tc8 = (h8 + (1 << 25)) >> 26\n\th9 += c8\n\th8 -= c8 << 26\n\t/* |h4| <= 2^25; from now on fits into int32 unchanged */\n\t/* |h8| <= 2^25; from now on fits into int32 unchanged */\n\t/* |h5| <= 1.01*2^24 */\n\t/* |h9| <= 1.51*2^58 */\n\n\tc9 = (h9 + (1 << 24)) >> 25\n\th0 += c9 * 19\n\th9 -= c9 << 25\n\t/* |h9| <= 2^24; from now on fits into int32 unchanged */\n\t/* |h0| <= 1.8*2^37 */\n\n\tc0 = (h0 + (1 << 25)) >> 26\n\th1 += c0\n\th0 -= c0 << 26\n\t/* |h0| <= 2^25; from now on fits into int32 unchanged */\n\t/* |h1| <= 1.01*2^24 */\n\n\th[0] = int32(h0)\n\th[1] = int32(h1)\n\th[2] = int32(h2)\n\th[3] = int32(h3)\n\th[4] = int32(h4)\n\th[5] = int32(h5)\n\th[6] = int32(h6)\n\th[7] = int32(h7)\n\th[8] = int32(h8)\n\th[9] = int32(h9)\n}\n\n// FeMul calculates h = f * g\n// Can overlap h with f or g.\n//\n// Preconditions:\n//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n//    |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n//\n// Postconditions:\n//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n//\n// Notes on implementation strategy:\n//\n// Using schoolbook multiplication.\n// Karatsuba would save a little in some cost models.\n//\n// Most multiplications by 2 and 19 are 32-bit precomputations;\n// cheaper than 64-bit postcomputations.\n//\n// There is one remaining multiplication by 19 in the carry chain;\n// one *19 precomputation can be merged into this,\n// but the resulting data flow is considerably less clean.\n//\n// There are 12 carries below.\n// 10 of them are 2-way parallelizable and vectorizable.\n// Can get away with 11 carries, but then data flow is much deeper.\n//\n// With tighter constraints on inputs, can squeeze carries into int32.\nfunc FeMul(h, f, g *FieldElement) {\n\tf0 := int64(f[0])\n\tf1 := int64(f[1])\n\tf2 := int64(f[2])\n\tf3 := int64(f[3])\n\tf4 := int64(f[4])\n\tf5 := int64(f[5])\n\tf6 := int64(f[6])\n\tf7 := int64(f[7])\n\tf8 := int64(f[8])\n\tf9 := int64(f[9])\n\n\tf1_2 := int64(2 * f[1])\n\tf3_2 := int64(2 * f[3])\n\tf5_2 := int64(2 * f[5])\n\tf7_2 := int64(2 * f[7])\n\tf9_2 := int64(2 * f[9])\n\n\tg0 := int64(g[0])\n\tg1 := int64(g[1])\n\tg2 := int64(g[2])\n\tg3 := int64(g[3])\n\tg4 := int64(g[4])\n\tg5 := int64(g[5])\n\tg6 := int64(g[6])\n\tg7 := int64(g[7])\n\tg8 := int64(g[8])\n\tg9 := int64(g[9])\n\n\tg1_19 := int64(19 * g[1]) /* 1.4*2^29 */\n\tg2_19 := int64(19 * g[2]) /* 1.4*2^30; still ok */\n\tg3_19 := int64(19 * g[3])\n\tg4_19 := int64(19 * g[4])\n\tg5_19 := int64(19 * g[5])\n\tg6_19 := int64(19 * g[6])\n\tg7_19 := int64(19 * g[7])\n\tg8_19 := int64(19 * g[8])\n\tg9_19 := int64(19 * g[9])\n\n\th0 := f0*g0 + f1_2*g9_19 + f2*g8_19 + f3_2*g7_19 + f4*g6_19 + f5_2*g5_19 + f6*g4_19 + f7_2*g3_19 + f8*g2_19 + f9_2*g1_19\n\th1 := f0*g1 + f1*g0 + f2*g9_19 + f3*g8_19 + f4*g7_19 + f5*g6_19 + f6*g5_19 + f7*g4_19 + f8*g3_19 + f9*g2_19\n\th2 := f0*g2 + f1_2*g1 + f2*g0 + f3_2*g9_19 + f4*g8_19 + f5_2*g7_19 + f6*g6_19 + f7_2*g5_19 + f8*g4_19 + f9_2*g3_19\n\th3 := f0*g3 + f1*g2 + f2*g1 + f3*g0 + f4*g9_19 + f5*g8_19 + f6*g7_19 + f7*g6_19 + f8*g5_19 + f9*g4_19\n\th4 := f0*g4 + f1_2*g3 + f2*g2 + f3_2*g1 + f4*g0 + f5_2*g9_19 + f6*g8_19 + f7_2*g7_19 + f8*g6_19 + f9_2*g5_19\n\th5 := f0*g5 + f1*g4 + f2*g3 + f3*g2 + f4*g1 + f5*g0 + f6*g9_19 + f7*g8_19 + f8*g7_19 + f9*g6_19\n\th6 := f0*g6 + f1_2*g5 + f2*g4 + f3_2*g3 + f4*g2 + f5_2*g1 + f6*g0 + f7_2*g9_19 + f8*g8_19 + f9_2*g7_19\n\th7 := f0*g7 + f1*g6 + f2*g5 + f3*g4 + f4*g3 + f5*g2 + f6*g1 + f7*g0 + f8*g9_19 + f9*g8_19\n\th8 := f0*g8 + f1_2*g7 + f2*g6 + f3_2*g5 + f4*g4 + f5_2*g3 + f6*g2 + f7_2*g1 + f8*g0 + f9_2*g9_19\n\th9 := f0*g9 + f1*g8 + f2*g7 + f3*g6 + f4*g5 + f5*g4 + f6*g3 + f7*g2 + f8*g1 + f9*g0\n\n\tFeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)\n}\n\nfunc feSquare(f *FieldElement) (h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) {\n\tf0 := int64(f[0])\n\tf1 := int64(f[1])\n\tf2 := int64(f[2])\n\tf3 := int64(f[3])\n\tf4 := int64(f[4])\n\tf5 := int64(f[5])\n\tf6 := int64(f[6])\n\tf7 := int64(f[7])\n\tf8 := int64(f[8])\n\tf9 := int64(f[9])\n\tf0_2 := int64(2 * f[0])\n\tf1_2 := int64(2 * f[1])\n\tf2_2 := int64(2 * f[2])\n\tf3_2 := int64(2 * f[3])\n\tf4_2 := int64(2 * f[4])\n\tf5_2 := int64(2 * f[5])\n\tf6_2 := int64(2 * f[6])\n\tf7_2 := int64(2 * f[7])\n\tf5_38 := 38 * f5 // 1.31*2^30\n\tf6_19 := 19 * f6 // 1.31*2^30\n\tf7_38 := 38 * f7 // 1.31*2^30\n\tf8_19 := 19 * f8 // 1.31*2^30\n\tf9_38 := 38 * f9 // 1.31*2^30\n\n\th0 = f0*f0 + f1_2*f9_38 + f2_2*f8_19 + f3_2*f7_38 + f4_2*f6_19 + f5*f5_38\n\th1 = f0_2*f1 + f2*f9_38 + f3_2*f8_19 + f4*f7_38 + f5_2*f6_19\n\th2 = f0_2*f2 + f1_2*f1 + f3_2*f9_38 + f4_2*f8_19 + f5_2*f7_38 + f6*f6_19\n\th3 = f0_2*f3 + f1_2*f2 + f4*f9_38 + f5_2*f8_19 + f6*f7_38\n\th4 = f0_2*f4 + f1_2*f3_2 + f2*f2 + f5_2*f9_38 + f6_2*f8_19 + f7*f7_38\n\th5 = f0_2*f5 + f1_2*f4 + f2_2*f3 + f6*f9_38 + f7_2*f8_19\n\th6 = f0_2*f6 + f1_2*f5_2 + f2_2*f4 + f3_2*f3 + f7_2*f9_38 + f8*f8_19\n\th7 = f0_2*f7 + f1_2*f6 + f2_2*f5 + f3_2*f4 + f8*f9_38\n\th8 = f0_2*f8 + f1_2*f7_2 + f2_2*f6 + f3_2*f5_2 + f4*f4 + f9*f9_38\n\th9 = f0_2*f9 + f1_2*f8 + f2_2*f7 + f3_2*f6 + f4_2*f5\n\n\treturn\n}\n\n// FeSquare calculates h = f*f. Can overlap h with f.\n//\n// Preconditions:\n//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n//\n// Postconditions:\n//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\nfunc FeSquare(h, f *FieldElement) {\n\th0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f)\n\tFeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)\n}\n\n// FeSquare2 sets h = 2 * f * f\n//\n// Can overlap h with f.\n//\n// Preconditions:\n//    |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.\n//\n// Postconditions:\n//    |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.\n// See fe_mul.c for discussion of implementation strategy.\nfunc FeSquare2(h, f *FieldElement) {\n\th0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f)\n\n\th0 += h0\n\th1 += h1\n\th2 += h2\n\th3 += h3\n\th4 += h4\n\th5 += h5\n\th6 += h6\n\th7 += h7\n\th8 += h8\n\th9 += h9\n\n\tFeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)\n}\n\nfunc FeInvert(out, z *FieldElement) {\n\tvar t0, t1, t2, t3 FieldElement\n\tvar i int\n\n\tFeSquare(&t0, z)        // 2^1\n\tFeSquare(&t1, &t0)      // 2^2\n\tfor i = 1; i < 2; i++ { // 2^3\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(&t1, z, &t1)      // 2^3 + 2^0\n\tFeMul(&t0, &t0, &t1)    // 2^3 + 2^1 + 2^0\n\tFeSquare(&t2, &t0)      // 2^4 + 2^2 + 2^1\n\tFeMul(&t1, &t1, &t2)    // 2^4 + 2^3 + 2^2 + 2^1 + 2^0\n\tFeSquare(&t2, &t1)      // 5,4,3,2,1\n\tfor i = 1; i < 5; i++ { // 9,8,7,6,5\n\t\tFeSquare(&t2, &t2)\n\t}\n\tFeMul(&t1, &t2, &t1)     // 9,8,7,6,5,4,3,2,1,0\n\tFeSquare(&t2, &t1)       // 10..1\n\tfor i = 1; i < 10; i++ { // 19..10\n\t\tFeSquare(&t2, &t2)\n\t}\n\tFeMul(&t2, &t2, &t1)     // 19..0\n\tFeSquare(&t3, &t2)       // 20..1\n\tfor i = 1; i < 20; i++ { // 39..20\n\t\tFeSquare(&t3, &t3)\n\t}\n\tFeMul(&t2, &t3, &t2)     // 39..0\n\tFeSquare(&t2, &t2)       // 40..1\n\tfor i = 1; i < 10; i++ { // 49..10\n\t\tFeSquare(&t2, &t2)\n\t}\n\tFeMul(&t1, &t2, &t1)     // 49..0\n\tFeSquare(&t2, &t1)       // 50..1\n\tfor i = 1; i < 50; i++ { // 99..50\n\t\tFeSquare(&t2, &t2)\n\t}\n\tFeMul(&t2, &t2, &t1)      // 99..0\n\tFeSquare(&t3, &t2)        // 100..1\n\tfor i = 1; i < 100; i++ { // 199..100\n\t\tFeSquare(&t3, &t3)\n\t}\n\tFeMul(&t2, &t3, &t2)     // 199..0\n\tFeSquare(&t2, &t2)       // 200..1\n\tfor i = 1; i < 50; i++ { // 249..50\n\t\tFeSquare(&t2, &t2)\n\t}\n\tFeMul(&t1, &t2, &t1)    // 249..0\n\tFeSquare(&t1, &t1)      // 250..1\n\tfor i = 1; i < 5; i++ { // 254..5\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(out, &t1, &t0) // 254..5,3,1,0\n}\n\nfunc fePow22523(out, z *FieldElement) {\n\tvar t0, t1, t2 FieldElement\n\tvar i int\n\n\tFeSquare(&t0, z)\n\tfor i = 1; i < 1; i++ {\n\t\tFeSquare(&t0, &t0)\n\t}\n\tFeSquare(&t1, &t0)\n\tfor i = 1; i < 2; i++ {\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(&t1, z, &t1)\n\tFeMul(&t0, &t0, &t1)\n\tFeSquare(&t0, &t0)\n\tfor i = 1; i < 1; i++ {\n\t\tFeSquare(&t0, &t0)\n\t}\n\tFeMul(&t0, &t1, &t0)\n\tFeSquare(&t1, &t0)\n\tfor i = 1; i < 5; i++ {\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(&t0, &t1, &t0)\n\tFeSquare(&t1, &t0)\n\tfor i = 1; i < 10; i++ {\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(&t1, &t1, &t0)\n\tFeSquare(&t2, &t1)\n\tfor i = 1; i < 20; i++ {\n\t\tFeSquare(&t2, &t2)\n\t}\n\tFeMul(&t1, &t2, &t1)\n\tFeSquare(&t1, &t1)\n\tfor i = 1; i < 10; i++ {\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(&t0, &t1, &t0)\n\tFeSquare(&t1, &t0)\n\tfor i = 1; i < 50; i++ {\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(&t1, &t1, &t0)\n\tFeSquare(&t2, &t1)\n\tfor i = 1; i < 100; i++ {\n\t\tFeSquare(&t2, &t2)\n\t}\n\tFeMul(&t1, &t2, &t1)\n\tFeSquare(&t1, &t1)\n\tfor i = 1; i < 50; i++ {\n\t\tFeSquare(&t1, &t1)\n\t}\n\tFeMul(&t0, &t1, &t0)\n\tFeSquare(&t0, &t0)\n\tfor i = 1; i < 2; i++ {\n\t\tFeSquare(&t0, &t0)\n\t}\n\tFeMul(out, &t0, z)\n}\n\n// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 *\n// y^2 where d = -121665/121666.\n//\n// Several representations are used:\n//   ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z\n//   ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT\n//   CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T\n//   PreComputedGroupElement: (y+x,y-x,2dxy)\n\ntype ProjectiveGroupElement struct {\n\tX, Y, Z FieldElement\n}\n\ntype ExtendedGroupElement struct {\n\tX, Y, Z, T FieldElement\n}\n\ntype CompletedGroupElement struct {\n\tX, Y, Z, T FieldElement\n}\n\ntype PreComputedGroupElement struct {\n\tyPlusX, yMinusX, xy2d FieldElement\n}\n\ntype CachedGroupElement struct {\n\tyPlusX, yMinusX, Z, T2d FieldElement\n}\n\nfunc (p *ProjectiveGroupElement) Zero() {\n\tFeZero(&p.X)\n\tFeOne(&p.Y)\n\tFeOne(&p.Z)\n}\n\nfunc (p *ProjectiveGroupElement) Double(r *CompletedGroupElement) {\n\tvar t0 FieldElement\n\n\tFeSquare(&r.X, &p.X)\n\tFeSquare(&r.Z, &p.Y)\n\tFeSquare2(&r.T, &p.Z)\n\tFeAdd(&r.Y, &p.X, &p.Y)\n\tFeSquare(&t0, &r.Y)\n\tFeAdd(&r.Y, &r.Z, &r.X)\n\tFeSub(&r.Z, &r.Z, &r.X)\n\tFeSub(&r.X, &t0, &r.Y)\n\tFeSub(&r.T, &r.T, &r.Z)\n}\n\nfunc (p *ProjectiveGroupElement) ToBytes(s *[32]byte) {\n\tvar recip, x, y FieldElement\n\n\tFeInvert(&recip, &p.Z)\n\tFeMul(&x, &p.X, &recip)\n\tFeMul(&y, &p.Y, &recip)\n\tFeToBytes(s, &y)\n\ts[31] ^= FeIsNegative(&x) << 7\n}\n\nfunc (p *ExtendedGroupElement) Zero() {\n\tFeZero(&p.X)\n\tFeOne(&p.Y)\n\tFeOne(&p.Z)\n\tFeZero(&p.T)\n}\n\nfunc (p *ExtendedGroupElement) Double(r *CompletedGroupElement) {\n\tvar q ProjectiveGroupElement\n\tp.ToProjective(&q)\n\tq.Double(r)\n}\n\nfunc (p *ExtendedGroupElement) ToCached(r *CachedGroupElement) {\n\tFeAdd(&r.yPlusX, &p.Y, &p.X)\n\tFeSub(&r.yMinusX, &p.Y, &p.X)\n\tFeCopy(&r.Z, &p.Z)\n\tFeMul(&r.T2d, &p.T, &d2)\n}\n\nfunc (p *ExtendedGroupElement) ToProjective(r *ProjectiveGroupElement) {\n\tFeCopy(&r.X, &p.X)\n\tFeCopy(&r.Y, &p.Y)\n\tFeCopy(&r.Z, &p.Z)\n}\n\nfunc (p *ExtendedGroupElement) ToBytes(s *[32]byte) {\n\tvar recip, x, y FieldElement\n\n\tFeInvert(&recip, &p.Z)\n\tFeMul(&x, &p.X, &recip)\n\tFeMul(&y, &p.Y, &recip)\n\tFeToBytes(s, &y)\n\ts[31] ^= FeIsNegative(&x) << 7\n}\n\nfunc (p *ExtendedGroupElement) FromBytes(s *[32]byte) bool {\n\tvar u, v, v3, vxx, check FieldElement\n\n\tFeFromBytes(&p.Y, s)\n\tFeOne(&p.Z)\n\tFeSquare(&u, &p.Y)\n\tFeMul(&v, &u, &d)\n\tFeSub(&u, &u, &p.Z) // y = y^2-1\n\tFeAdd(&v, &v, &p.Z) // v = dy^2+1\n\n\tFeSquare(&v3, &v)\n\tFeMul(&v3, &v3, &v) // v3 = v^3\n\tFeSquare(&p.X, &v3)\n\tFeMul(&p.X, &p.X, &v)\n\tFeMul(&p.X, &p.X, &u) // x = uv^7\n\n\tfePow22523(&p.X, &p.X) // x = (uv^7)^((q-5)/8)\n\tFeMul(&p.X, &p.X, &v3)\n\tFeMul(&p.X, &p.X, &u) // x = uv^3(uv^7)^((q-5)/8)\n\n\tvar tmpX, tmp2 [32]byte\n\n\tFeSquare(&vxx, &p.X)\n\tFeMul(&vxx, &vxx, &v)\n\tFeSub(&check, &vxx, &u) // vx^2-u\n\tif FeIsNonZero(&check) == 1 {\n\t\tFeAdd(&check, &vxx, &u) // vx^2+u\n\t\tif FeIsNonZero(&check) == 1 {\n\t\t\treturn false\n\t\t}\n\t\tFeMul(&p.X, &p.X, &SqrtM1)\n\n\t\tFeToBytes(&tmpX, &p.X)\n\t\tfor i, v := range tmpX {\n\t\t\ttmp2[31-i] = v\n\t\t}\n\t}\n\n\tif FeIsNegative(&p.X) != (s[31] >> 7) {\n\t\tFeNeg(&p.X, &p.X)\n\t}\n\n\tFeMul(&p.T, &p.X, &p.Y)\n\treturn true\n}\n\nfunc (p *CompletedGroupElement) ToProjective(r *ProjectiveGroupElement) {\n\tFeMul(&r.X, &p.X, &p.T)\n\tFeMul(&r.Y, &p.Y, &p.Z)\n\tFeMul(&r.Z, &p.Z, &p.T)\n}\n\nfunc (p *CompletedGroupElement) ToExtended(r *ExtendedGroupElement) {\n\tFeMul(&r.X, &p.X, &p.T)\n\tFeMul(&r.Y, &p.Y, &p.Z)\n\tFeMul(&r.Z, &p.Z, &p.T)\n\tFeMul(&r.T, &p.X, &p.Y)\n}\n\nfunc (p *PreComputedGroupElement) Zero() {\n\tFeOne(&p.yPlusX)\n\tFeOne(&p.yMinusX)\n\tFeZero(&p.xy2d)\n}\n\nfunc geAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) {\n\tvar t0 FieldElement\n\n\tFeAdd(&r.X, &p.Y, &p.X)\n\tFeSub(&r.Y, &p.Y, &p.X)\n\tFeMul(&r.Z, &r.X, &q.yPlusX)\n\tFeMul(&r.Y, &r.Y, &q.yMinusX)\n\tFeMul(&r.T, &q.T2d, &p.T)\n\tFeMul(&r.X, &p.Z, &q.Z)\n\tFeAdd(&t0, &r.X, &r.X)\n\tFeSub(&r.X, &r.Z, &r.Y)\n\tFeAdd(&r.Y, &r.Z, &r.Y)\n\tFeAdd(&r.Z, &t0, &r.T)\n\tFeSub(&r.T, &t0, &r.T)\n}\n\nfunc geSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) {\n\tvar t0 FieldElement\n\n\tFeAdd(&r.X, &p.Y, &p.X)\n\tFeSub(&r.Y, &p.Y, &p.X)\n\tFeMul(&r.Z, &r.X, &q.yMinusX)\n\tFeMul(&r.Y, &r.Y, &q.yPlusX)\n\tFeMul(&r.T, &q.T2d, &p.T)\n\tFeMul(&r.X, &p.Z, &q.Z)\n\tFeAdd(&t0, &r.X, &r.X)\n\tFeSub(&r.X, &r.Z, &r.Y)\n\tFeAdd(&r.Y, &r.Z, &r.Y)\n\tFeSub(&r.Z, &t0, &r.T)\n\tFeAdd(&r.T, &t0, &r.T)\n}\n\nfunc geMixedAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) {\n\tvar t0 FieldElement\n\n\tFeAdd(&r.X, &p.Y, &p.X)\n\tFeSub(&r.Y, &p.Y, &p.X)\n\tFeMul(&r.Z, &r.X, &q.yPlusX)\n\tFeMul(&r.Y, &r.Y, &q.yMinusX)\n\tFeMul(&r.T, &q.xy2d, &p.T)\n\tFeAdd(&t0, &p.Z, &p.Z)\n\tFeSub(&r.X, &r.Z, &r.Y)\n\tFeAdd(&r.Y, &r.Z, &r.Y)\n\tFeAdd(&r.Z, &t0, &r.T)\n\tFeSub(&r.T, &t0, &r.T)\n}\n\nfunc geMixedSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) {\n\tvar t0 FieldElement\n\n\tFeAdd(&r.X, &p.Y, &p.X)\n\tFeSub(&r.Y, &p.Y, &p.X)\n\tFeMul(&r.Z, &r.X, &q.yMinusX)\n\tFeMul(&r.Y, &r.Y, &q.yPlusX)\n\tFeMul(&r.T, &q.xy2d, &p.T)\n\tFeAdd(&t0, &p.Z, &p.Z)\n\tFeSub(&r.X, &r.Z, &r.Y)\n\tFeAdd(&r.Y, &r.Z, &r.Y)\n\tFeSub(&r.Z, &t0, &r.T)\n\tFeAdd(&r.T, &t0, &r.T)\n}\n\nfunc slide(r *[256]int8, a *[32]byte) {\n\tfor i := range r {\n\t\tr[i] = int8(1 & (a[i>>3] >> uint(i&7)))\n\t}\n\n\tfor i := range r {\n\t\tif r[i] != 0 {\n\t\t\tfor b := 1; b <= 6 && i+b < 256; b++ {\n\t\t\t\tif r[i+b] != 0 {\n\t\t\t\t\tif r[i]+(r[i+b]<<uint(b)) <= 15 {\n\t\t\t\t\t\tr[i] += r[i+b] << uint(b)\n\t\t\t\t\t\tr[i+b] = 0\n\t\t\t\t\t} else if r[i]-(r[i+b]<<uint(b)) >= -15 {\n\t\t\t\t\t\tr[i] -= r[i+b] << uint(b)\n\t\t\t\t\t\tfor k := i + b; k < 256; k++ {\n\t\t\t\t\t\t\tif r[k] == 0 {\n\t\t\t\t\t\t\t\tr[k] = 1\n\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tr[k] = 0\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// GeDoubleScalarMultVartime sets r = a*A + b*B\n// where a = a[0]+256*a[1]+...+256^31 a[31].\n// and b = b[0]+256*b[1]+...+256^31 b[31].\n// B is the Ed25519 base point (x,4/5) with x positive.\nfunc GeDoubleScalarMultVartime(r *ProjectiveGroupElement, a *[32]byte, A *ExtendedGroupElement, b *[32]byte) {\n\tvar aSlide, bSlide [256]int8\n\tvar Ai [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A\n\tvar t CompletedGroupElement\n\tvar u, A2 ExtendedGroupElement\n\tvar i int\n\n\tslide(&aSlide, a)\n\tslide(&bSlide, b)\n\n\tA.ToCached(&Ai[0])\n\tA.Double(&t)\n\tt.ToExtended(&A2)\n\n\tfor i := 0; i < 7; i++ {\n\t\tgeAdd(&t, &A2, &Ai[i])\n\t\tt.ToExtended(&u)\n\t\tu.ToCached(&Ai[i+1])\n\t}\n\n\tr.Zero()\n\n\tfor i = 255; i >= 0; i-- {\n\t\tif aSlide[i] != 0 || bSlide[i] != 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tfor ; i >= 0; i-- {\n\t\tr.Double(&t)\n\n\t\tif aSlide[i] > 0 {\n\t\t\tt.ToExtended(&u)\n\t\t\tgeAdd(&t, &u, &Ai[aSlide[i]/2])\n\t\t} else if aSlide[i] < 0 {\n\t\t\tt.ToExtended(&u)\n\t\t\tgeSub(&t, &u, &Ai[(-aSlide[i])/2])\n\t\t}\n\n\t\tif bSlide[i] > 0 {\n\t\t\tt.ToExtended(&u)\n\t\t\tgeMixedAdd(&t, &u, &bi[bSlide[i]/2])\n\t\t} else if bSlide[i] < 0 {\n\t\t\tt.ToExtended(&u)\n\t\t\tgeMixedSub(&t, &u, &bi[(-bSlide[i])/2])\n\t\t}\n\n\t\tt.ToProjective(r)\n\t}\n}\n\n// equal returns 1 if b == c and 0 otherwise, assuming that b and c are\n// non-negative.\nfunc equal(b, c int32) int32 {\n\tx := uint32(b ^ c)\n\tx--\n\treturn int32(x >> 31)\n}\n\n// negative returns 1 if b < 0 and 0 otherwise.\nfunc negative(b int32) int32 {\n\treturn (b >> 31) & 1\n}\n\nfunc PreComputedGroupElementCMove(t, u *PreComputedGroupElement, b int32) {\n\tFeCMove(&t.yPlusX, &u.yPlusX, b)\n\tFeCMove(&t.yMinusX, &u.yMinusX, b)\n\tFeCMove(&t.xy2d, &u.xy2d, b)\n}\n\nfunc selectPoint(t *PreComputedGroupElement, pos int32, b int32) {\n\tvar minusT PreComputedGroupElement\n\tbNegative := negative(b)\n\tbAbs := b - (((-bNegative) & b) << 1)\n\n\tt.Zero()\n\tfor i := int32(0); i < 8; i++ {\n\t\tPreComputedGroupElementCMove(t, &base[pos][i], equal(bAbs, i+1))\n\t}\n\tFeCopy(&minusT.yPlusX, &t.yMinusX)\n\tFeCopy(&minusT.yMinusX, &t.yPlusX)\n\tFeNeg(&minusT.xy2d, &t.xy2d)\n\tPreComputedGroupElementCMove(t, &minusT, bNegative)\n}\n\n// GeScalarMultBase computes h = a*B, where\n//   a = a[0]+256*a[1]+...+256^31 a[31]\n//   B is the Ed25519 base point (x,4/5) with x positive.\n//\n// Preconditions:\n//   a[31] <= 127\nfunc GeScalarMultBase(h *ExtendedGroupElement, a *[32]byte) {\n\tvar e [64]int8\n\n\tfor i, v := range a {\n\t\te[2*i] = int8(v & 15)\n\t\te[2*i+1] = int8((v >> 4) & 15)\n\t}\n\n\t// each e[i] is between 0 and 15 and e[63] is between 0 and 7.\n\n\tcarry := int8(0)\n\tfor i := 0; i < 63; i++ {\n\t\te[i] += carry\n\t\tcarry = (e[i] + 8) >> 4\n\t\te[i] -= carry << 4\n\t}\n\te[63] += carry\n\t// each e[i] is between -8 and 8.\n\n\th.Zero()\n\tvar t PreComputedGroupElement\n\tvar r CompletedGroupElement\n\tfor i := int32(1); i < 64; i += 2 {\n\t\tselectPoint(&t, i/2, int32(e[i]))\n\t\tgeMixedAdd(&r, h, &t)\n\t\tr.ToExtended(h)\n\t}\n\n\tvar s ProjectiveGroupElement\n\n\th.Double(&r)\n\tr.ToProjective(&s)\n\ts.Double(&r)\n\tr.ToProjective(&s)\n\ts.Double(&r)\n\tr.ToProjective(&s)\n\ts.Double(&r)\n\tr.ToExtended(h)\n\n\tfor i := int32(0); i < 64; i += 2 {\n\t\tselectPoint(&t, i/2, int32(e[i]))\n\t\tgeMixedAdd(&r, h, &t)\n\t\tr.ToExtended(h)\n\t}\n}\n\n// The scalars are GF(2^252 + 27742317777372353535851937790883648493).\n\n// Input:\n//   a[0]+256*a[1]+...+256^31*a[31] = a\n//   b[0]+256*b[1]+...+256^31*b[31] = b\n//   c[0]+256*c[1]+...+256^31*c[31] = c\n//\n// Output:\n//   s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l\n//   where l = 2^252 + 27742317777372353535851937790883648493.\nfunc ScMulAdd(s, a, b, c *[32]byte) {\n\ta0 := 2097151 & load3(a[:])\n\ta1 := 2097151 & (load4(a[2:]) >> 5)\n\ta2 := 2097151 & (load3(a[5:]) >> 2)\n\ta3 := 2097151 & (load4(a[7:]) >> 7)\n\ta4 := 2097151 & (load4(a[10:]) >> 4)\n\ta5 := 2097151 & (load3(a[13:]) >> 1)\n\ta6 := 2097151 & (load4(a[15:]) >> 6)\n\ta7 := 2097151 & (load3(a[18:]) >> 3)\n\ta8 := 2097151 & load3(a[21:])\n\ta9 := 2097151 & (load4(a[23:]) >> 5)\n\ta10 := 2097151 & (load3(a[26:]) >> 2)\n\ta11 := (load4(a[28:]) >> 7)\n\tb0 := 2097151 & load3(b[:])\n\tb1 := 2097151 & (load4(b[2:]) >> 5)\n\tb2 := 2097151 & (load3(b[5:]) >> 2)\n\tb3 := 2097151 & (load4(b[7:]) >> 7)\n\tb4 := 2097151 & (load4(b[10:]) >> 4)\n\tb5 := 2097151 & (load3(b[13:]) >> 1)\n\tb6 := 2097151 & (load4(b[15:]) >> 6)\n\tb7 := 2097151 & (load3(b[18:]) >> 3)\n\tb8 := 2097151 & load3(b[21:])\n\tb9 := 2097151 & (load4(b[23:]) >> 5)\n\tb10 := 2097151 & (load3(b[26:]) >> 2)\n\tb11 := (load4(b[28:]) >> 7)\n\tc0 := 2097151 & load3(c[:])\n\tc1 := 2097151 & (load4(c[2:]) >> 5)\n\tc2 := 2097151 & (load3(c[5:]) >> 2)\n\tc3 := 2097151 & (load4(c[7:]) >> 7)\n\tc4 := 2097151 & (load4(c[10:]) >> 4)\n\tc5 := 2097151 & (load3(c[13:]) >> 1)\n\tc6 := 2097151 & (load4(c[15:]) >> 6)\n\tc7 := 2097151 & (load3(c[18:]) >> 3)\n\tc8 := 2097151 & load3(c[21:])\n\tc9 := 2097151 & (load4(c[23:]) >> 5)\n\tc10 := 2097151 & (load3(c[26:]) >> 2)\n\tc11 := (load4(c[28:]) >> 7)\n\tvar carry [23]int64\n\n\ts0 := c0 + a0*b0\n\ts1 := c1 + a0*b1 + a1*b0\n\ts2 := c2 + a0*b2 + a1*b1 + a2*b0\n\ts3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0\n\ts4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0\n\ts5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0\n\ts6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0\n\ts7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0\n\ts8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0\n\ts9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0\n\ts10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0\n\ts11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0\n\ts12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1\n\ts13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2\n\ts14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3\n\ts15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4\n\ts16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5\n\ts17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6\n\ts18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7\n\ts19 := a8*b11 + a9*b10 + a10*b9 + a11*b8\n\ts20 := a9*b11 + a10*b10 + a11*b9\n\ts21 := a10*b11 + a11*b10\n\ts22 := a11 * b11\n\ts23 := int64(0)\n\n\tcarry[0] = (s0 + (1 << 20)) >> 21\n\ts1 += carry[0]\n\ts0 -= carry[0] << 21\n\tcarry[2] = (s2 + (1 << 20)) >> 21\n\ts3 += carry[2]\n\ts2 -= carry[2] << 21\n\tcarry[4] = (s4 + (1 << 20)) >> 21\n\ts5 += carry[4]\n\ts4 -= carry[4] << 21\n\tcarry[6] = (s6 + (1 << 20)) >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[8] = (s8 + (1 << 20)) >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[10] = (s10 + (1 << 20)) >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\tcarry[12] = (s12 + (1 << 20)) >> 21\n\ts13 += carry[12]\n\ts12 -= carry[12] << 21\n\tcarry[14] = (s14 + (1 << 20)) >> 21\n\ts15 += carry[14]\n\ts14 -= carry[14] << 21\n\tcarry[16] = (s16 + (1 << 20)) >> 21\n\ts17 += carry[16]\n\ts16 -= carry[16] << 21\n\tcarry[18] = (s18 + (1 << 20)) >> 21\n\ts19 += carry[18]\n\ts18 -= carry[18] << 21\n\tcarry[20] = (s20 + (1 << 20)) >> 21\n\ts21 += carry[20]\n\ts20 -= carry[20] << 21\n\tcarry[22] = (s22 + (1 << 20)) >> 21\n\ts23 += carry[22]\n\ts22 -= carry[22] << 21\n\n\tcarry[1] = (s1 + (1 << 20)) >> 21\n\ts2 += carry[1]\n\ts1 -= carry[1] << 21\n\tcarry[3] = (s3 + (1 << 20)) >> 21\n\ts4 += carry[3]\n\ts3 -= carry[3] << 21\n\tcarry[5] = (s5 + (1 << 20)) >> 21\n\ts6 += carry[5]\n\ts5 -= carry[5] << 21\n\tcarry[7] = (s7 + (1 << 20)) >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[9] = (s9 + (1 << 20)) >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[11] = (s11 + (1 << 20)) >> 21\n\ts12 += carry[11]\n\ts11 -= carry[11] << 21\n\tcarry[13] = (s13 + (1 << 20)) >> 21\n\ts14 += carry[13]\n\ts13 -= carry[13] << 21\n\tcarry[15] = (s15 + (1 << 20)) >> 21\n\ts16 += carry[15]\n\ts15 -= carry[15] << 21\n\tcarry[17] = (s17 + (1 << 20)) >> 21\n\ts18 += carry[17]\n\ts17 -= carry[17] << 21\n\tcarry[19] = (s19 + (1 << 20)) >> 21\n\ts20 += carry[19]\n\ts19 -= carry[19] << 21\n\tcarry[21] = (s21 + (1 << 20)) >> 21\n\ts22 += carry[21]\n\ts21 -= carry[21] << 21\n\n\ts11 += s23 * 666643\n\ts12 += s23 * 470296\n\ts13 += s23 * 654183\n\ts14 -= s23 * 997805\n\ts15 += s23 * 136657\n\ts16 -= s23 * 683901\n\ts23 = 0\n\n\ts10 += s22 * 666643\n\ts11 += s22 * 470296\n\ts12 += s22 * 654183\n\ts13 -= s22 * 997805\n\ts14 += s22 * 136657\n\ts15 -= s22 * 683901\n\ts22 = 0\n\n\ts9 += s21 * 666643\n\ts10 += s21 * 470296\n\ts11 += s21 * 654183\n\ts12 -= s21 * 997805\n\ts13 += s21 * 136657\n\ts14 -= s21 * 683901\n\ts21 = 0\n\n\ts8 += s20 * 666643\n\ts9 += s20 * 470296\n\ts10 += s20 * 654183\n\ts11 -= s20 * 997805\n\ts12 += s20 * 136657\n\ts13 -= s20 * 683901\n\ts20 = 0\n\n\ts7 += s19 * 666643\n\ts8 += s19 * 470296\n\ts9 += s19 * 654183\n\ts10 -= s19 * 997805\n\ts11 += s19 * 136657\n\ts12 -= s19 * 683901\n\ts19 = 0\n\n\ts6 += s18 * 666643\n\ts7 += s18 * 470296\n\ts8 += s18 * 654183\n\ts9 -= s18 * 997805\n\ts10 += s18 * 136657\n\ts11 -= s18 * 683901\n\ts18 = 0\n\n\tcarry[6] = (s6 + (1 << 20)) >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[8] = (s8 + (1 << 20)) >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[10] = (s10 + (1 << 20)) >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\tcarry[12] = (s12 + (1 << 20)) >> 21\n\ts13 += carry[12]\n\ts12 -= carry[12] << 21\n\tcarry[14] = (s14 + (1 << 20)) >> 21\n\ts15 += carry[14]\n\ts14 -= carry[14] << 21\n\tcarry[16] = (s16 + (1 << 20)) >> 21\n\ts17 += carry[16]\n\ts16 -= carry[16] << 21\n\n\tcarry[7] = (s7 + (1 << 20)) >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[9] = (s9 + (1 << 20)) >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[11] = (s11 + (1 << 20)) >> 21\n\ts12 += carry[11]\n\ts11 -= carry[11] << 21\n\tcarry[13] = (s13 + (1 << 20)) >> 21\n\ts14 += carry[13]\n\ts13 -= carry[13] << 21\n\tcarry[15] = (s15 + (1 << 20)) >> 21\n\ts16 += carry[15]\n\ts15 -= carry[15] << 21\n\n\ts5 += s17 * 666643\n\ts6 += s17 * 470296\n\ts7 += s17 * 654183\n\ts8 -= s17 * 997805\n\ts9 += s17 * 136657\n\ts10 -= s17 * 683901\n\ts17 = 0\n\n\ts4 += s16 * 666643\n\ts5 += s16 * 470296\n\ts6 += s16 * 654183\n\ts7 -= s16 * 997805\n\ts8 += s16 * 136657\n\ts9 -= s16 * 683901\n\ts16 = 0\n\n\ts3 += s15 * 666643\n\ts4 += s15 * 470296\n\ts5 += s15 * 654183\n\ts6 -= s15 * 997805\n\ts7 += s15 * 136657\n\ts8 -= s15 * 683901\n\ts15 = 0\n\n\ts2 += s14 * 666643\n\ts3 += s14 * 470296\n\ts4 += s14 * 654183\n\ts5 -= s14 * 997805\n\ts6 += s14 * 136657\n\ts7 -= s14 * 683901\n\ts14 = 0\n\n\ts1 += s13 * 666643\n\ts2 += s13 * 470296\n\ts3 += s13 * 654183\n\ts4 -= s13 * 997805\n\ts5 += s13 * 136657\n\ts6 -= s13 * 683901\n\ts13 = 0\n\n\ts0 += s12 * 666643\n\ts1 += s12 * 470296\n\ts2 += s12 * 654183\n\ts3 -= s12 * 997805\n\ts4 += s12 * 136657\n\ts5 -= s12 * 683901\n\ts12 = 0\n\n\tcarry[0] = (s0 + (1 << 20)) >> 21\n\ts1 += carry[0]\n\ts0 -= carry[0] << 21\n\tcarry[2] = (s2 + (1 << 20)) >> 21\n\ts3 += carry[2]\n\ts2 -= carry[2] << 21\n\tcarry[4] = (s4 + (1 << 20)) >> 21\n\ts5 += carry[4]\n\ts4 -= carry[4] << 21\n\tcarry[6] = (s6 + (1 << 20)) >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[8] = (s8 + (1 << 20)) >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[10] = (s10 + (1 << 20)) >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\n\tcarry[1] = (s1 + (1 << 20)) >> 21\n\ts2 += carry[1]\n\ts1 -= carry[1] << 21\n\tcarry[3] = (s3 + (1 << 20)) >> 21\n\ts4 += carry[3]\n\ts3 -= carry[3] << 21\n\tcarry[5] = (s5 + (1 << 20)) >> 21\n\ts6 += carry[5]\n\ts5 -= carry[5] << 21\n\tcarry[7] = (s7 + (1 << 20)) >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[9] = (s9 + (1 << 20)) >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[11] = (s11 + (1 << 20)) >> 21\n\ts12 += carry[11]\n\ts11 -= carry[11] << 21\n\n\ts0 += s12 * 666643\n\ts1 += s12 * 470296\n\ts2 += s12 * 654183\n\ts3 -= s12 * 997805\n\ts4 += s12 * 136657\n\ts5 -= s12 * 683901\n\ts12 = 0\n\n\tcarry[0] = s0 >> 21\n\ts1 += carry[0]\n\ts0 -= carry[0] << 21\n\tcarry[1] = s1 >> 21\n\ts2 += carry[1]\n\ts1 -= carry[1] << 21\n\tcarry[2] = s2 >> 21\n\ts3 += carry[2]\n\ts2 -= carry[2] << 21\n\tcarry[3] = s3 >> 21\n\ts4 += carry[3]\n\ts3 -= carry[3] << 21\n\tcarry[4] = s4 >> 21\n\ts5 += carry[4]\n\ts4 -= carry[4] << 21\n\tcarry[5] = s5 >> 21\n\ts6 += carry[5]\n\ts5 -= carry[5] << 21\n\tcarry[6] = s6 >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[7] = s7 >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[8] = s8 >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[9] = s9 >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[10] = s10 >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\tcarry[11] = s11 >> 21\n\ts12 += carry[11]\n\ts11 -= carry[11] << 21\n\n\ts0 += s12 * 666643\n\ts1 += s12 * 470296\n\ts2 += s12 * 654183\n\ts3 -= s12 * 997805\n\ts4 += s12 * 136657\n\ts5 -= s12 * 683901\n\ts12 = 0\n\n\tcarry[0] = s0 >> 21\n\ts1 += carry[0]\n\ts0 -= carry[0] << 21\n\tcarry[1] = s1 >> 21\n\ts2 += carry[1]\n\ts1 -= carry[1] << 21\n\tcarry[2] = s2 >> 21\n\ts3 += carry[2]\n\ts2 -= carry[2] << 21\n\tcarry[3] = s3 >> 21\n\ts4 += carry[3]\n\ts3 -= carry[3] << 21\n\tcarry[4] = s4 >> 21\n\ts5 += carry[4]\n\ts4 -= carry[4] << 21\n\tcarry[5] = s5 >> 21\n\ts6 += carry[5]\n\ts5 -= carry[5] << 21\n\tcarry[6] = s6 >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[7] = s7 >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[8] = s8 >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[9] = s9 >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[10] = s10 >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\n\ts[0] = byte(s0 >> 0)\n\ts[1] = byte(s0 >> 8)\n\ts[2] = byte((s0 >> 16) | (s1 << 5))\n\ts[3] = byte(s1 >> 3)\n\ts[4] = byte(s1 >> 11)\n\ts[5] = byte((s1 >> 19) | (s2 << 2))\n\ts[6] = byte(s2 >> 6)\n\ts[7] = byte((s2 >> 14) | (s3 << 7))\n\ts[8] = byte(s3 >> 1)\n\ts[9] = byte(s3 >> 9)\n\ts[10] = byte((s3 >> 17) | (s4 << 4))\n\ts[11] = byte(s4 >> 4)\n\ts[12] = byte(s4 >> 12)\n\ts[13] = byte((s4 >> 20) | (s5 << 1))\n\ts[14] = byte(s5 >> 7)\n\ts[15] = byte((s5 >> 15) | (s6 << 6))\n\ts[16] = byte(s6 >> 2)\n\ts[17] = byte(s6 >> 10)\n\ts[18] = byte((s6 >> 18) | (s7 << 3))\n\ts[19] = byte(s7 >> 5)\n\ts[20] = byte(s7 >> 13)\n\ts[21] = byte(s8 >> 0)\n\ts[22] = byte(s8 >> 8)\n\ts[23] = byte((s8 >> 16) | (s9 << 5))\n\ts[24] = byte(s9 >> 3)\n\ts[25] = byte(s9 >> 11)\n\ts[26] = byte((s9 >> 19) | (s10 << 2))\n\ts[27] = byte(s10 >> 6)\n\ts[28] = byte((s10 >> 14) | (s11 << 7))\n\ts[29] = byte(s11 >> 1)\n\ts[30] = byte(s11 >> 9)\n\ts[31] = byte(s11 >> 17)\n}\n\n// Input:\n//   s[0]+256*s[1]+...+256^63*s[63] = s\n//\n// Output:\n//   s[0]+256*s[1]+...+256^31*s[31] = s mod l\n//   where l = 2^252 + 27742317777372353535851937790883648493.\nfunc ScReduce(out *[32]byte, s *[64]byte) {\n\ts0 := 2097151 & load3(s[:])\n\ts1 := 2097151 & (load4(s[2:]) >> 5)\n\ts2 := 2097151 & (load3(s[5:]) >> 2)\n\ts3 := 2097151 & (load4(s[7:]) >> 7)\n\ts4 := 2097151 & (load4(s[10:]) >> 4)\n\ts5 := 2097151 & (load3(s[13:]) >> 1)\n\ts6 := 2097151 & (load4(s[15:]) >> 6)\n\ts7 := 2097151 & (load3(s[18:]) >> 3)\n\ts8 := 2097151 & load3(s[21:])\n\ts9 := 2097151 & (load4(s[23:]) >> 5)\n\ts10 := 2097151 & (load3(s[26:]) >> 2)\n\ts11 := 2097151 & (load4(s[28:]) >> 7)\n\ts12 := 2097151 & (load4(s[31:]) >> 4)\n\ts13 := 2097151 & (load3(s[34:]) >> 1)\n\ts14 := 2097151 & (load4(s[36:]) >> 6)\n\ts15 := 2097151 & (load3(s[39:]) >> 3)\n\ts16 := 2097151 & load3(s[42:])\n\ts17 := 2097151 & (load4(s[44:]) >> 5)\n\ts18 := 2097151 & (load3(s[47:]) >> 2)\n\ts19 := 2097151 & (load4(s[49:]) >> 7)\n\ts20 := 2097151 & (load4(s[52:]) >> 4)\n\ts21 := 2097151 & (load3(s[55:]) >> 1)\n\ts22 := 2097151 & (load4(s[57:]) >> 6)\n\ts23 := (load4(s[60:]) >> 3)\n\n\ts11 += s23 * 666643\n\ts12 += s23 * 470296\n\ts13 += s23 * 654183\n\ts14 -= s23 * 997805\n\ts15 += s23 * 136657\n\ts16 -= s23 * 683901\n\ts23 = 0\n\n\ts10 += s22 * 666643\n\ts11 += s22 * 470296\n\ts12 += s22 * 654183\n\ts13 -= s22 * 997805\n\ts14 += s22 * 136657\n\ts15 -= s22 * 683901\n\ts22 = 0\n\n\ts9 += s21 * 666643\n\ts10 += s21 * 470296\n\ts11 += s21 * 654183\n\ts12 -= s21 * 997805\n\ts13 += s21 * 136657\n\ts14 -= s21 * 683901\n\ts21 = 0\n\n\ts8 += s20 * 666643\n\ts9 += s20 * 470296\n\ts10 += s20 * 654183\n\ts11 -= s20 * 997805\n\ts12 += s20 * 136657\n\ts13 -= s20 * 683901\n\ts20 = 0\n\n\ts7 += s19 * 666643\n\ts8 += s19 * 470296\n\ts9 += s19 * 654183\n\ts10 -= s19 * 997805\n\ts11 += s19 * 136657\n\ts12 -= s19 * 683901\n\ts19 = 0\n\n\ts6 += s18 * 666643\n\ts7 += s18 * 470296\n\ts8 += s18 * 654183\n\ts9 -= s18 * 997805\n\ts10 += s18 * 136657\n\ts11 -= s18 * 683901\n\ts18 = 0\n\n\tvar carry [17]int64\n\n\tcarry[6] = (s6 + (1 << 20)) >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[8] = (s8 + (1 << 20)) >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[10] = (s10 + (1 << 20)) >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\tcarry[12] = (s12 + (1 << 20)) >> 21\n\ts13 += carry[12]\n\ts12 -= carry[12] << 21\n\tcarry[14] = (s14 + (1 << 20)) >> 21\n\ts15 += carry[14]\n\ts14 -= carry[14] << 21\n\tcarry[16] = (s16 + (1 << 20)) >> 21\n\ts17 += carry[16]\n\ts16 -= carry[16] << 21\n\n\tcarry[7] = (s7 + (1 << 20)) >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[9] = (s9 + (1 << 20)) >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[11] = (s11 + (1 << 20)) >> 21\n\ts12 += carry[11]\n\ts11 -= carry[11] << 21\n\tcarry[13] = (s13 + (1 << 20)) >> 21\n\ts14 += carry[13]\n\ts13 -= carry[13] << 21\n\tcarry[15] = (s15 + (1 << 20)) >> 21\n\ts16 += carry[15]\n\ts15 -= carry[15] << 21\n\n\ts5 += s17 * 666643\n\ts6 += s17 * 470296\n\ts7 += s17 * 654183\n\ts8 -= s17 * 997805\n\ts9 += s17 * 136657\n\ts10 -= s17 * 683901\n\ts17 = 0\n\n\ts4 += s16 * 666643\n\ts5 += s16 * 470296\n\ts6 += s16 * 654183\n\ts7 -= s16 * 997805\n\ts8 += s16 * 136657\n\ts9 -= s16 * 683901\n\ts16 = 0\n\n\ts3 += s15 * 666643\n\ts4 += s15 * 470296\n\ts5 += s15 * 654183\n\ts6 -= s15 * 997805\n\ts7 += s15 * 136657\n\ts8 -= s15 * 683901\n\ts15 = 0\n\n\ts2 += s14 * 666643\n\ts3 += s14 * 470296\n\ts4 += s14 * 654183\n\ts5 -= s14 * 997805\n\ts6 += s14 * 136657\n\ts7 -= s14 * 683901\n\ts14 = 0\n\n\ts1 += s13 * 666643\n\ts2 += s13 * 470296\n\ts3 += s13 * 654183\n\ts4 -= s13 * 997805\n\ts5 += s13 * 136657\n\ts6 -= s13 * 683901\n\ts13 = 0\n\n\ts0 += s12 * 666643\n\ts1 += s12 * 470296\n\ts2 += s12 * 654183\n\ts3 -= s12 * 997805\n\ts4 += s12 * 136657\n\ts5 -= s12 * 683901\n\ts12 = 0\n\n\tcarry[0] = (s0 + (1 << 20)) >> 21\n\ts1 += carry[0]\n\ts0 -= carry[0] << 21\n\tcarry[2] = (s2 + (1 << 20)) >> 21\n\ts3 += carry[2]\n\ts2 -= carry[2] << 21\n\tcarry[4] = (s4 + (1 << 20)) >> 21\n\ts5 += carry[4]\n\ts4 -= carry[4] << 21\n\tcarry[6] = (s6 + (1 << 20)) >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[8] = (s8 + (1 << 20)) >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[10] = (s10 + (1 << 20)) >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\n\tcarry[1] = (s1 + (1 << 20)) >> 21\n\ts2 += carry[1]\n\ts1 -= carry[1] << 21\n\tcarry[3] = (s3 + (1 << 20)) >> 21\n\ts4 += carry[3]\n\ts3 -= carry[3] << 21\n\tcarry[5] = (s5 + (1 << 20)) >> 21\n\ts6 += carry[5]\n\ts5 -= carry[5] << 21\n\tcarry[7] = (s7 + (1 << 20)) >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[9] = (s9 + (1 << 20)) >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[11] = (s11 + (1 << 20)) >> 21\n\ts12 += carry[11]\n\ts11 -= carry[11] << 21\n\n\ts0 += s12 * 666643\n\ts1 += s12 * 470296\n\ts2 += s12 * 654183\n\ts3 -= s12 * 997805\n\ts4 += s12 * 136657\n\ts5 -= s12 * 683901\n\ts12 = 0\n\n\tcarry[0] = s0 >> 21\n\ts1 += carry[0]\n\ts0 -= carry[0] << 21\n\tcarry[1] = s1 >> 21\n\ts2 += carry[1]\n\ts1 -= carry[1] << 21\n\tcarry[2] = s2 >> 21\n\ts3 += carry[2]\n\ts2 -= carry[2] << 21\n\tcarry[3] = s3 >> 21\n\ts4 += carry[3]\n\ts3 -= carry[3] << 21\n\tcarry[4] = s4 >> 21\n\ts5 += carry[4]\n\ts4 -= carry[4] << 21\n\tcarry[5] = s5 >> 21\n\ts6 += carry[5]\n\ts5 -= carry[5] << 21\n\tcarry[6] = s6 >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[7] = s7 >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[8] = s8 >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[9] = s9 >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[10] = s10 >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\tcarry[11] = s11 >> 21\n\ts12 += carry[11]\n\ts11 -= carry[11] << 21\n\n\ts0 += s12 * 666643\n\ts1 += s12 * 470296\n\ts2 += s12 * 654183\n\ts3 -= s12 * 997805\n\ts4 += s12 * 136657\n\ts5 -= s12 * 683901\n\ts12 = 0\n\n\tcarry[0] = s0 >> 21\n\ts1 += carry[0]\n\ts0 -= carry[0] << 21\n\tcarry[1] = s1 >> 21\n\ts2 += carry[1]\n\ts1 -= carry[1] << 21\n\tcarry[2] = s2 >> 21\n\ts3 += carry[2]\n\ts2 -= carry[2] << 21\n\tcarry[3] = s3 >> 21\n\ts4 += carry[3]\n\ts3 -= carry[3] << 21\n\tcarry[4] = s4 >> 21\n\ts5 += carry[4]\n\ts4 -= carry[4] << 21\n\tcarry[5] = s5 >> 21\n\ts6 += carry[5]\n\ts5 -= carry[5] << 21\n\tcarry[6] = s6 >> 21\n\ts7 += carry[6]\n\ts6 -= carry[6] << 21\n\tcarry[7] = s7 >> 21\n\ts8 += carry[7]\n\ts7 -= carry[7] << 21\n\tcarry[8] = s8 >> 21\n\ts9 += carry[8]\n\ts8 -= carry[8] << 21\n\tcarry[9] = s9 >> 21\n\ts10 += carry[9]\n\ts9 -= carry[9] << 21\n\tcarry[10] = s10 >> 21\n\ts11 += carry[10]\n\ts10 -= carry[10] << 21\n\n\tout[0] = byte(s0 >> 0)\n\tout[1] = byte(s0 >> 8)\n\tout[2] = byte((s0 >> 16) | (s1 << 5))\n\tout[3] = byte(s1 >> 3)\n\tout[4] = byte(s1 >> 11)\n\tout[5] = byte((s1 >> 19) | (s2 << 2))\n\tout[6] = byte(s2 >> 6)\n\tout[7] = byte((s2 >> 14) | (s3 << 7))\n\tout[8] = byte(s3 >> 1)\n\tout[9] = byte(s3 >> 9)\n\tout[10] = byte((s3 >> 17) | (s4 << 4))\n\tout[11] = byte(s4 >> 4)\n\tout[12] = byte(s4 >> 12)\n\tout[13] = byte((s4 >> 20) | (s5 << 1))\n\tout[14] = byte(s5 >> 7)\n\tout[15] = byte((s5 >> 15) | (s6 << 6))\n\tout[16] = byte(s6 >> 2)\n\tout[17] = byte(s6 >> 10)\n\tout[18] = byte((s6 >> 18) | (s7 << 3))\n\tout[19] = byte(s7 >> 5)\n\tout[20] = byte(s7 >> 13)\n\tout[21] = byte(s8 >> 0)\n\tout[22] = byte(s8 >> 8)\n\tout[23] = byte((s8 >> 16) | (s9 << 5))\n\tout[24] = byte(s9 >> 3)\n\tout[25] = byte(s9 >> 11)\n\tout[26] = byte((s9 >> 19) | (s10 << 2))\n\tout[27] = byte(s10 >> 6)\n\tout[28] = byte((s10 >> 14) | (s11 << 7))\n\tout[29] = byte(s11 >> 1)\n\tout[30] = byte(s11 >> 9)\n\tout[31] = byte(s11 >> 17)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/armor/armor.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package armor implements OpenPGP ASCII Armor, see RFC 4880. OpenPGP Armor is\n// very similar to PEM except that it has an additional CRC checksum.\npackage armor // import \"golang.org/x/crypto/openpgp/armor\"\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/base64\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"io\"\n)\n\n// A Block represents an OpenPGP armored structure.\n//\n// The encoded form is:\n//    -----BEGIN Type-----\n//    Headers\n//\n//    base64-encoded Bytes\n//    '=' base64 encoded checksum\n//    -----END Type-----\n// where Headers is a possibly empty sequence of Key: Value lines.\n//\n// Since the armored data can be very large, this package presents a streaming\n// interface.\ntype Block struct {\n\tType    string            // The type, taken from the preamble (i.e. \"PGP SIGNATURE\").\n\tHeader  map[string]string // Optional headers.\n\tBody    io.Reader         // A Reader from which the contents can be read\n\tlReader lineReader\n\toReader openpgpReader\n}\n\nvar ArmorCorrupt error = errors.StructuralError(\"armor invalid\")\n\nconst crc24Init = 0xb704ce\nconst crc24Poly = 0x1864cfb\nconst crc24Mask = 0xffffff\n\n// crc24 calculates the OpenPGP checksum as specified in RFC 4880, section 6.1\nfunc crc24(crc uint32, d []byte) uint32 {\n\tfor _, b := range d {\n\t\tcrc ^= uint32(b) << 16\n\t\tfor i := 0; i < 8; i++ {\n\t\t\tcrc <<= 1\n\t\t\tif crc&0x1000000 != 0 {\n\t\t\t\tcrc ^= crc24Poly\n\t\t\t}\n\t\t}\n\t}\n\treturn crc\n}\n\nvar armorStart = []byte(\"-----BEGIN \")\nvar armorEnd = []byte(\"-----END \")\nvar armorEndOfLine = []byte(\"-----\")\n\n// lineReader wraps a line based reader. It watches for the end of an armor\n// block and records the expected CRC value.\ntype lineReader struct {\n\tin  *bufio.Reader\n\tbuf []byte\n\teof bool\n\tcrc uint32\n}\n\nfunc (l *lineReader) Read(p []byte) (n int, err error) {\n\tif l.eof {\n\t\treturn 0, io.EOF\n\t}\n\n\tif len(l.buf) > 0 {\n\t\tn = copy(p, l.buf)\n\t\tl.buf = l.buf[n:]\n\t\treturn\n\t}\n\n\tline, isPrefix, err := l.in.ReadLine()\n\tif err != nil {\n\t\treturn\n\t}\n\tif isPrefix {\n\t\treturn 0, ArmorCorrupt\n\t}\n\n\tif len(line) == 5 && line[0] == '=' {\n\t\t// This is the checksum line\n\t\tvar expectedBytes [3]byte\n\t\tvar m int\n\t\tm, err = base64.StdEncoding.Decode(expectedBytes[0:], line[1:])\n\t\tif m != 3 || err != nil {\n\t\t\treturn\n\t\t}\n\t\tl.crc = uint32(expectedBytes[0])<<16 |\n\t\t\tuint32(expectedBytes[1])<<8 |\n\t\t\tuint32(expectedBytes[2])\n\n\t\tline, _, err = l.in.ReadLine()\n\t\tif err != nil && err != io.EOF {\n\t\t\treturn\n\t\t}\n\t\tif !bytes.HasPrefix(line, armorEnd) {\n\t\t\treturn 0, ArmorCorrupt\n\t\t}\n\n\t\tl.eof = true\n\t\treturn 0, io.EOF\n\t}\n\n\tif len(line) > 96 {\n\t\treturn 0, ArmorCorrupt\n\t}\n\n\tn = copy(p, line)\n\tbytesToSave := len(line) - n\n\tif bytesToSave > 0 {\n\t\tif cap(l.buf) < bytesToSave {\n\t\t\tl.buf = make([]byte, 0, bytesToSave)\n\t\t}\n\t\tl.buf = l.buf[0:bytesToSave]\n\t\tcopy(l.buf, line[n:])\n\t}\n\n\treturn\n}\n\n// openpgpReader passes Read calls to the underlying base64 decoder, but keeps\n// a running CRC of the resulting data and checks the CRC against the value\n// found by the lineReader at EOF.\ntype openpgpReader struct {\n\tlReader    *lineReader\n\tb64Reader  io.Reader\n\tcurrentCRC uint32\n}\n\nfunc (r *openpgpReader) Read(p []byte) (n int, err error) {\n\tn, err = r.b64Reader.Read(p)\n\tr.currentCRC = crc24(r.currentCRC, p[:n])\n\n\tif err == io.EOF {\n\t\tif r.lReader.crc != uint32(r.currentCRC&crc24Mask) {\n\t\t\treturn 0, ArmorCorrupt\n\t\t}\n\t}\n\n\treturn\n}\n\n// Decode reads a PGP armored block from the given Reader. It will ignore\n// leading garbage. If it doesn't find a block, it will return nil, io.EOF. The\n// given Reader is not usable after calling this function: an arbitrary amount\n// of data may have been read past the end of the block.\nfunc Decode(in io.Reader) (p *Block, err error) {\n\tr := bufio.NewReaderSize(in, 100)\n\tvar line []byte\n\tignoreNext := false\n\nTryNextBlock:\n\tp = nil\n\n\t// Skip leading garbage\n\tfor {\n\t\tignoreThis := ignoreNext\n\t\tline, ignoreNext, err = r.ReadLine()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif ignoreNext || ignoreThis {\n\t\t\tcontinue\n\t\t}\n\t\tline = bytes.TrimSpace(line)\n\t\tif len(line) > len(armorStart)+len(armorEndOfLine) && bytes.HasPrefix(line, armorStart) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tp = new(Block)\n\tp.Type = string(line[len(armorStart) : len(line)-len(armorEndOfLine)])\n\tp.Header = make(map[string]string)\n\tnextIsContinuation := false\n\tvar lastKey string\n\n\t// Read headers\n\tfor {\n\t\tisContinuation := nextIsContinuation\n\t\tline, nextIsContinuation, err = r.ReadLine()\n\t\tif err != nil {\n\t\t\tp = nil\n\t\t\treturn\n\t\t}\n\t\tif isContinuation {\n\t\t\tp.Header[lastKey] += string(line)\n\t\t\tcontinue\n\t\t}\n\t\tline = bytes.TrimSpace(line)\n\t\tif len(line) == 0 {\n\t\t\tbreak\n\t\t}\n\n\t\ti := bytes.Index(line, []byte(\": \"))\n\t\tif i == -1 {\n\t\t\tgoto TryNextBlock\n\t\t}\n\t\tlastKey = string(line[:i])\n\t\tp.Header[lastKey] = string(line[i+2:])\n\t}\n\n\tp.lReader.in = r\n\tp.oReader.currentCRC = crc24Init\n\tp.oReader.lReader = &p.lReader\n\tp.oReader.b64Reader = base64.NewDecoder(base64.StdEncoding, &p.lReader)\n\tp.Body = &p.oReader\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/armor/encode.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage armor\n\nimport (\n\t\"encoding/base64\"\n\t\"io\"\n)\n\nvar armorHeaderSep = []byte(\": \")\nvar blockEnd = []byte(\"\\n=\")\nvar newline = []byte(\"\\n\")\nvar armorEndOfLineOut = []byte(\"-----\\n\")\n\n// writeSlices writes its arguments to the given Writer.\nfunc writeSlices(out io.Writer, slices ...[]byte) (err error) {\n\tfor _, s := range slices {\n\t\t_, err = out.Write(s)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn\n}\n\n// lineBreaker breaks data across several lines, all of the same byte length\n// (except possibly the last). Lines are broken with a single '\\n'.\ntype lineBreaker struct {\n\tlineLength  int\n\tline        []byte\n\tused        int\n\tout         io.Writer\n\thaveWritten bool\n}\n\nfunc newLineBreaker(out io.Writer, lineLength int) *lineBreaker {\n\treturn &lineBreaker{\n\t\tlineLength: lineLength,\n\t\tline:       make([]byte, lineLength),\n\t\tused:       0,\n\t\tout:        out,\n\t}\n}\n\nfunc (l *lineBreaker) Write(b []byte) (n int, err error) {\n\tn = len(b)\n\n\tif n == 0 {\n\t\treturn\n\t}\n\n\tif l.used == 0 && l.haveWritten {\n\t\t_, err = l.out.Write([]byte{'\\n'})\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif l.used+len(b) < l.lineLength {\n\t\tl.used += copy(l.line[l.used:], b)\n\t\treturn\n\t}\n\n\tl.haveWritten = true\n\t_, err = l.out.Write(l.line[0:l.used])\n\tif err != nil {\n\t\treturn\n\t}\n\texcess := l.lineLength - l.used\n\tl.used = 0\n\n\t_, err = l.out.Write(b[0:excess])\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = l.Write(b[excess:])\n\treturn\n}\n\nfunc (l *lineBreaker) Close() (err error) {\n\tif l.used > 0 {\n\t\t_, err = l.out.Write(l.line[0:l.used])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\n// encoding keeps track of a running CRC24 over the data which has been written\n// to it and outputs a OpenPGP checksum when closed, followed by an armor\n// trailer.\n//\n// It's built into a stack of io.Writers:\n//    encoding -> base64 encoder -> lineBreaker -> out\ntype encoding struct {\n\tout       io.Writer\n\tbreaker   *lineBreaker\n\tb64       io.WriteCloser\n\tcrc       uint32\n\tblockType []byte\n}\n\nfunc (e *encoding) Write(data []byte) (n int, err error) {\n\te.crc = crc24(e.crc, data)\n\treturn e.b64.Write(data)\n}\n\nfunc (e *encoding) Close() (err error) {\n\terr = e.b64.Close()\n\tif err != nil {\n\t\treturn\n\t}\n\te.breaker.Close()\n\n\tvar checksumBytes [3]byte\n\tchecksumBytes[0] = byte(e.crc >> 16)\n\tchecksumBytes[1] = byte(e.crc >> 8)\n\tchecksumBytes[2] = byte(e.crc)\n\n\tvar b64ChecksumBytes [4]byte\n\tbase64.StdEncoding.Encode(b64ChecksumBytes[:], checksumBytes[:])\n\n\treturn writeSlices(e.out, blockEnd, b64ChecksumBytes[:], newline, armorEnd, e.blockType, armorEndOfLine)\n}\n\n// Encode returns a WriteCloser which will encode the data written to it in\n// OpenPGP armor.\nfunc Encode(out io.Writer, blockType string, headers map[string]string) (w io.WriteCloser, err error) {\n\tbType := []byte(blockType)\n\terr = writeSlices(out, armorStart, bType, armorEndOfLineOut)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tfor k, v := range headers {\n\t\terr = writeSlices(out, []byte(k), armorHeaderSep, []byte(v), newline)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\t_, err = out.Write(newline)\n\tif err != nil {\n\t\treturn\n\t}\n\n\te := &encoding{\n\t\tout:       out,\n\t\tbreaker:   newLineBreaker(out, 64),\n\t\tcrc:       crc24Init,\n\t\tblockType: bType,\n\t}\n\te.b64 = base64.NewEncoder(base64.StdEncoding, e.breaker)\n\treturn e, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/canonical_text.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage openpgp\n\nimport \"hash\"\n\n// NewCanonicalTextHash reformats text written to it into the canonical\n// form and then applies the hash h.  See RFC 4880, section 5.2.1.\nfunc NewCanonicalTextHash(h hash.Hash) hash.Hash {\n\treturn &canonicalTextHash{h, 0}\n}\n\ntype canonicalTextHash struct {\n\th hash.Hash\n\ts int\n}\n\nvar newline = []byte{'\\r', '\\n'}\n\nfunc (cth *canonicalTextHash) Write(buf []byte) (int, error) {\n\tstart := 0\n\n\tfor i, c := range buf {\n\t\tswitch cth.s {\n\t\tcase 0:\n\t\t\tif c == '\\r' {\n\t\t\t\tcth.s = 1\n\t\t\t} else if c == '\\n' {\n\t\t\t\tcth.h.Write(buf[start:i])\n\t\t\t\tcth.h.Write(newline)\n\t\t\t\tstart = i + 1\n\t\t\t}\n\t\tcase 1:\n\t\t\tcth.s = 0\n\t\t}\n\t}\n\n\tcth.h.Write(buf[start:])\n\treturn len(buf), nil\n}\n\nfunc (cth *canonicalTextHash) Sum(in []byte) []byte {\n\treturn cth.h.Sum(in)\n}\n\nfunc (cth *canonicalTextHash) Reset() {\n\tcth.h.Reset()\n\tcth.s = 0\n}\n\nfunc (cth *canonicalTextHash) Size() int {\n\treturn cth.h.Size()\n}\n\nfunc (cth *canonicalTextHash) BlockSize() int {\n\treturn cth.h.BlockSize()\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package elgamal implements ElGamal encryption, suitable for OpenPGP,\n// as specified in \"A Public-Key Cryptosystem and a Signature Scheme Based on\n// Discrete Logarithms,\" IEEE Transactions on Information Theory, v. IT-31,\n// n. 4, 1985, pp. 469-472.\n//\n// This form of ElGamal embeds PKCS#1 v1.5 padding, which may make it\n// unsuitable for other protocols. RSA should be used in preference in any\n// case.\npackage elgamal // import \"golang.org/x/crypto/openpgp/elgamal\"\n\nimport (\n\t\"crypto/rand\"\n\t\"crypto/subtle\"\n\t\"errors\"\n\t\"io\"\n\t\"math/big\"\n)\n\n// PublicKey represents an ElGamal public key.\ntype PublicKey struct {\n\tG, P, Y *big.Int\n}\n\n// PrivateKey represents an ElGamal private key.\ntype PrivateKey struct {\n\tPublicKey\n\tX *big.Int\n}\n\n// Encrypt encrypts the given message to the given public key. The result is a\n// pair of integers. Errors can result from reading random, or because msg is\n// too large to be encrypted to the public key.\nfunc Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err error) {\n\tpLen := (pub.P.BitLen() + 7) / 8\n\tif len(msg) > pLen-11 {\n\t\terr = errors.New(\"elgamal: message too long\")\n\t\treturn\n\t}\n\n\t// EM = 0x02 || PS || 0x00 || M\n\tem := make([]byte, pLen-1)\n\tem[0] = 2\n\tps, mm := em[1:len(em)-len(msg)-1], em[len(em)-len(msg):]\n\terr = nonZeroRandomBytes(ps, random)\n\tif err != nil {\n\t\treturn\n\t}\n\tem[len(em)-len(msg)-1] = 0\n\tcopy(mm, msg)\n\n\tm := new(big.Int).SetBytes(em)\n\n\tk, err := rand.Int(random, pub.P)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tc1 = new(big.Int).Exp(pub.G, k, pub.P)\n\ts := new(big.Int).Exp(pub.Y, k, pub.P)\n\tc2 = s.Mul(s, m)\n\tc2.Mod(c2, pub.P)\n\n\treturn\n}\n\n// Decrypt takes two integers, resulting from an ElGamal encryption, and\n// returns the plaintext of the message. An error can result only if the\n// ciphertext is invalid. Users should keep in mind that this is a padding\n// oracle and thus, if exposed to an adaptive chosen ciphertext attack, can\n// be used to break the cryptosystem.  See ``Chosen Ciphertext Attacks\n// Against Protocols Based on the RSA Encryption Standard PKCS #1'', Daniel\n// Bleichenbacher, Advances in Cryptology (Crypto '98),\nfunc Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) {\n\ts := new(big.Int).Exp(c1, priv.X, priv.P)\n\ts.ModInverse(s, priv.P)\n\ts.Mul(s, c2)\n\ts.Mod(s, priv.P)\n\tem := s.Bytes()\n\n\tfirstByteIsTwo := subtle.ConstantTimeByteEq(em[0], 2)\n\n\t// The remainder of the plaintext must be a string of non-zero random\n\t// octets, followed by a 0, followed by the message.\n\t//   lookingForIndex: 1 iff we are still looking for the zero.\n\t//   index: the offset of the first zero byte.\n\tvar lookingForIndex, index int\n\tlookingForIndex = 1\n\n\tfor i := 1; i < len(em); i++ {\n\t\tequals0 := subtle.ConstantTimeByteEq(em[i], 0)\n\t\tindex = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index)\n\t\tlookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex)\n\t}\n\n\tif firstByteIsTwo != 1 || lookingForIndex != 0 || index < 9 {\n\t\treturn nil, errors.New(\"elgamal: decryption error\")\n\t}\n\treturn em[index+1:], nil\n}\n\n// nonZeroRandomBytes fills the given slice with non-zero random octets.\nfunc nonZeroRandomBytes(s []byte, rand io.Reader) (err error) {\n\t_, err = io.ReadFull(rand, s)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tfor i := 0; i < len(s); i++ {\n\t\tfor s[i] == 0 {\n\t\t\t_, err = io.ReadFull(rand, s[i:i+1])\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/errors/errors.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package errors contains common error types for the OpenPGP packages.\npackage errors // import \"golang.org/x/crypto/openpgp/errors\"\n\nimport (\n\t\"strconv\"\n)\n\n// A StructuralError is returned when OpenPGP data is found to be syntactically\n// invalid.\ntype StructuralError string\n\nfunc (s StructuralError) Error() string {\n\treturn \"openpgp: invalid data: \" + string(s)\n}\n\n// UnsupportedError indicates that, although the OpenPGP data is valid, it\n// makes use of currently unimplemented features.\ntype UnsupportedError string\n\nfunc (s UnsupportedError) Error() string {\n\treturn \"openpgp: unsupported feature: \" + string(s)\n}\n\n// InvalidArgumentError indicates that the caller is in error and passed an\n// incorrect value.\ntype InvalidArgumentError string\n\nfunc (i InvalidArgumentError) Error() string {\n\treturn \"openpgp: invalid argument: \" + string(i)\n}\n\n// SignatureError indicates that a syntactically valid signature failed to\n// validate.\ntype SignatureError string\n\nfunc (b SignatureError) Error() string {\n\treturn \"openpgp: invalid signature: \" + string(b)\n}\n\ntype keyIncorrectError int\n\nfunc (ki keyIncorrectError) Error() string {\n\treturn \"openpgp: incorrect key\"\n}\n\nvar ErrKeyIncorrect error = keyIncorrectError(0)\n\ntype unknownIssuerError int\n\nfunc (unknownIssuerError) Error() string {\n\treturn \"openpgp: signature made by unknown entity\"\n}\n\nvar ErrUnknownIssuer error = unknownIssuerError(0)\n\ntype keyRevokedError int\n\nfunc (keyRevokedError) Error() string {\n\treturn \"openpgp: signature made by revoked key\"\n}\n\nvar ErrKeyRevoked error = keyRevokedError(0)\n\ntype UnknownPacketTypeError uint8\n\nfunc (upte UnknownPacketTypeError) Error() string {\n\treturn \"openpgp: unknown packet type: \" + strconv.Itoa(int(upte))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/keys.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage openpgp\n\nimport (\n\t\"crypto/rsa\"\n\t\"io\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/openpgp/armor\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/packet\"\n)\n\n// PublicKeyType is the armor type for a PGP public key.\nvar PublicKeyType = \"PGP PUBLIC KEY BLOCK\"\n\n// PrivateKeyType is the armor type for a PGP private key.\nvar PrivateKeyType = \"PGP PRIVATE KEY BLOCK\"\n\n// An Entity represents the components of an OpenPGP key: a primary public key\n// (which must be a signing key), one or more identities claimed by that key,\n// and zero or more subkeys, which may be encryption keys.\ntype Entity struct {\n\tPrimaryKey  *packet.PublicKey\n\tPrivateKey  *packet.PrivateKey\n\tIdentities  map[string]*Identity // indexed by Identity.Name\n\tRevocations []*packet.Signature\n\tSubkeys     []Subkey\n}\n\n// An Identity represents an identity claimed by an Entity and zero or more\n// assertions by other entities about that claim.\ntype Identity struct {\n\tName          string // by convention, has the form \"Full Name (comment) <email@example.com>\"\n\tUserId        *packet.UserId\n\tSelfSignature *packet.Signature\n\tSignatures    []*packet.Signature\n}\n\n// A Subkey is an additional public key in an Entity. Subkeys can be used for\n// encryption.\ntype Subkey struct {\n\tPublicKey  *packet.PublicKey\n\tPrivateKey *packet.PrivateKey\n\tSig        *packet.Signature\n}\n\n// A Key identifies a specific public key in an Entity. This is either the\n// Entity's primary key or a subkey.\ntype Key struct {\n\tEntity        *Entity\n\tPublicKey     *packet.PublicKey\n\tPrivateKey    *packet.PrivateKey\n\tSelfSignature *packet.Signature\n}\n\n// A KeyRing provides access to public and private keys.\ntype KeyRing interface {\n\t// KeysById returns the set of keys that have the given key id.\n\tKeysById(id uint64) []Key\n\t// KeysByIdAndUsage returns the set of keys with the given id\n\t// that also meet the key usage given by requiredUsage.\n\t// The requiredUsage is expressed as the bitwise-OR of\n\t// packet.KeyFlag* values.\n\tKeysByIdUsage(id uint64, requiredUsage byte) []Key\n\t// DecryptionKeys returns all private keys that are valid for\n\t// decryption.\n\tDecryptionKeys() []Key\n}\n\n// primaryIdentity returns the Identity marked as primary or the first identity\n// if none are so marked.\nfunc (e *Entity) primaryIdentity() *Identity {\n\tvar firstIdentity *Identity\n\tfor _, ident := range e.Identities {\n\t\tif firstIdentity == nil {\n\t\t\tfirstIdentity = ident\n\t\t}\n\t\tif ident.SelfSignature.IsPrimaryId != nil && *ident.SelfSignature.IsPrimaryId {\n\t\t\treturn ident\n\t\t}\n\t}\n\treturn firstIdentity\n}\n\n// encryptionKey returns the best candidate Key for encrypting a message to the\n// given Entity.\nfunc (e *Entity) encryptionKey(now time.Time) (Key, bool) {\n\tcandidateSubkey := -1\n\n\t// Iterate the keys to find the newest key\n\tvar maxTime time.Time\n\tfor i, subkey := range e.Subkeys {\n\t\tif subkey.Sig.FlagsValid &&\n\t\t\tsubkey.Sig.FlagEncryptCommunications &&\n\t\t\tsubkey.PublicKey.PubKeyAlgo.CanEncrypt() &&\n\t\t\t!subkey.Sig.KeyExpired(now) &&\n\t\t\t(maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) {\n\t\t\tcandidateSubkey = i\n\t\t\tmaxTime = subkey.Sig.CreationTime\n\t\t}\n\t}\n\n\tif candidateSubkey != -1 {\n\t\tsubkey := e.Subkeys[candidateSubkey]\n\t\treturn Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig}, true\n\t}\n\n\t// If we don't have any candidate subkeys for encryption and\n\t// the primary key doesn't have any usage metadata then we\n\t// assume that the primary key is ok. Or, if the primary key is\n\t// marked as ok to encrypt to, then we can obviously use it.\n\ti := e.primaryIdentity()\n\tif !i.SelfSignature.FlagsValid || i.SelfSignature.FlagEncryptCommunications &&\n\t\te.PrimaryKey.PubKeyAlgo.CanEncrypt() &&\n\t\t!i.SelfSignature.KeyExpired(now) {\n\t\treturn Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature}, true\n\t}\n\n\t// This Entity appears to be signing only.\n\treturn Key{}, false\n}\n\n// signingKey return the best candidate Key for signing a message with this\n// Entity.\nfunc (e *Entity) signingKey(now time.Time) (Key, bool) {\n\tcandidateSubkey := -1\n\n\tfor i, subkey := range e.Subkeys {\n\t\tif subkey.Sig.FlagsValid &&\n\t\t\tsubkey.Sig.FlagSign &&\n\t\t\tsubkey.PublicKey.PubKeyAlgo.CanSign() &&\n\t\t\t!subkey.Sig.KeyExpired(now) {\n\t\t\tcandidateSubkey = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif candidateSubkey != -1 {\n\t\tsubkey := e.Subkeys[candidateSubkey]\n\t\treturn Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig}, true\n\t}\n\n\t// If we have no candidate subkey then we assume that it's ok to sign\n\t// with the primary key.\n\ti := e.primaryIdentity()\n\tif !i.SelfSignature.FlagsValid || i.SelfSignature.FlagSign &&\n\t\t!i.SelfSignature.KeyExpired(now) {\n\t\treturn Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature}, true\n\t}\n\n\treturn Key{}, false\n}\n\n// An EntityList contains one or more Entities.\ntype EntityList []*Entity\n\n// KeysById returns the set of keys that have the given key id.\nfunc (el EntityList) KeysById(id uint64) (keys []Key) {\n\tfor _, e := range el {\n\t\tif e.PrimaryKey.KeyId == id {\n\t\t\tvar selfSig *packet.Signature\n\t\t\tfor _, ident := range e.Identities {\n\t\t\t\tif selfSig == nil {\n\t\t\t\t\tselfSig = ident.SelfSignature\n\t\t\t\t} else if ident.SelfSignature.IsPrimaryId != nil && *ident.SelfSignature.IsPrimaryId {\n\t\t\t\t\tselfSig = ident.SelfSignature\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tkeys = append(keys, Key{e, e.PrimaryKey, e.PrivateKey, selfSig})\n\t\t}\n\n\t\tfor _, subKey := range e.Subkeys {\n\t\t\tif subKey.PublicKey.KeyId == id {\n\t\t\t\tkeys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig})\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// KeysByIdAndUsage returns the set of keys with the given id that also meet\n// the key usage given by requiredUsage.  The requiredUsage is expressed as\n// the bitwise-OR of packet.KeyFlag* values.\nfunc (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) {\n\tfor _, key := range el.KeysById(id) {\n\t\tif len(key.Entity.Revocations) > 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tif key.SelfSignature.RevocationReason != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tif key.SelfSignature.FlagsValid && requiredUsage != 0 {\n\t\t\tvar usage byte\n\t\t\tif key.SelfSignature.FlagCertify {\n\t\t\t\tusage |= packet.KeyFlagCertify\n\t\t\t}\n\t\t\tif key.SelfSignature.FlagSign {\n\t\t\t\tusage |= packet.KeyFlagSign\n\t\t\t}\n\t\t\tif key.SelfSignature.FlagEncryptCommunications {\n\t\t\t\tusage |= packet.KeyFlagEncryptCommunications\n\t\t\t}\n\t\t\tif key.SelfSignature.FlagEncryptStorage {\n\t\t\t\tusage |= packet.KeyFlagEncryptStorage\n\t\t\t}\n\t\t\tif usage&requiredUsage != requiredUsage {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tkeys = append(keys, key)\n\t}\n\treturn\n}\n\n// DecryptionKeys returns all private keys that are valid for decryption.\nfunc (el EntityList) DecryptionKeys() (keys []Key) {\n\tfor _, e := range el {\n\t\tfor _, subKey := range e.Subkeys {\n\t\t\tif subKey.PrivateKey != nil && (!subKey.Sig.FlagsValid || subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) {\n\t\t\t\tkeys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig})\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// ReadArmoredKeyRing reads one or more public/private keys from an armor keyring file.\nfunc ReadArmoredKeyRing(r io.Reader) (EntityList, error) {\n\tblock, err := armor.Decode(r)\n\tif err == io.EOF {\n\t\treturn nil, errors.InvalidArgumentError(\"no armored data found\")\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif block.Type != PublicKeyType && block.Type != PrivateKeyType {\n\t\treturn nil, errors.InvalidArgumentError(\"expected public or private key block, got: \" + block.Type)\n\t}\n\n\treturn ReadKeyRing(block.Body)\n}\n\n// ReadKeyRing reads one or more public/private keys. Unsupported keys are\n// ignored as long as at least a single valid key is found.\nfunc ReadKeyRing(r io.Reader) (el EntityList, err error) {\n\tpackets := packet.NewReader(r)\n\tvar lastUnsupportedError error\n\n\tfor {\n\t\tvar e *Entity\n\t\te, err = ReadEntity(packets)\n\t\tif err != nil {\n\t\t\t// TODO: warn about skipped unsupported/unreadable keys\n\t\t\tif _, ok := err.(errors.UnsupportedError); ok {\n\t\t\t\tlastUnsupportedError = err\n\t\t\t\terr = readToNextPublicKey(packets)\n\t\t\t} else if _, ok := err.(errors.StructuralError); ok {\n\t\t\t\t// Skip unreadable, badly-formatted keys\n\t\t\t\tlastUnsupportedError = err\n\t\t\t\terr = readToNextPublicKey(packets)\n\t\t\t}\n\t\t\tif err == io.EOF {\n\t\t\t\terr = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif err != nil {\n\t\t\t\tel = nil\n\t\t\t\tbreak\n\t\t\t}\n\t\t} else {\n\t\t\tel = append(el, e)\n\t\t}\n\t}\n\n\tif len(el) == 0 && err == nil {\n\t\terr = lastUnsupportedError\n\t}\n\treturn\n}\n\n// readToNextPublicKey reads packets until the start of the entity and leaves\n// the first packet of the new entity in the Reader.\nfunc readToNextPublicKey(packets *packet.Reader) (err error) {\n\tvar p packet.Packet\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err == io.EOF {\n\t\t\treturn\n\t\t} else if err != nil {\n\t\t\tif _, ok := err.(errors.UnsupportedError); ok {\n\t\t\t\terr = nil\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tif pk, ok := p.(*packet.PublicKey); ok && !pk.IsSubkey {\n\t\t\tpackets.Unread(p)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// ReadEntity reads an entity (public key, identities, subkeys etc) from the\n// given Reader.\nfunc ReadEntity(packets *packet.Reader) (*Entity, error) {\n\te := new(Entity)\n\te.Identities = make(map[string]*Identity)\n\n\tp, err := packets.Next()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar ok bool\n\tif e.PrimaryKey, ok = p.(*packet.PublicKey); !ok {\n\t\tif e.PrivateKey, ok = p.(*packet.PrivateKey); !ok {\n\t\t\tpackets.Unread(p)\n\t\t\treturn nil, errors.StructuralError(\"first packet was not a public/private key\")\n\t\t} else {\n\t\t\te.PrimaryKey = &e.PrivateKey.PublicKey\n\t\t}\n\t}\n\n\tif !e.PrimaryKey.PubKeyAlgo.CanSign() {\n\t\treturn nil, errors.StructuralError(\"primary key cannot be used for signatures\")\n\t}\n\n\tvar current *Identity\n\tvar revocations []*packet.Signature\nEachPacket:\n\tfor {\n\t\tp, err := packets.Next()\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t} else if err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tswitch pkt := p.(type) {\n\t\tcase *packet.UserId:\n\t\t\tcurrent = new(Identity)\n\t\t\tcurrent.Name = pkt.Id\n\t\t\tcurrent.UserId = pkt\n\t\t\te.Identities[pkt.Id] = current\n\n\t\t\tfor {\n\t\t\t\tp, err = packets.Next()\n\t\t\t\tif err == io.EOF {\n\t\t\t\t\treturn nil, io.ErrUnexpectedEOF\n\t\t\t\t} else if err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tsig, ok := p.(*packet.Signature)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil, errors.StructuralError(\"user ID packet not followed by self-signature\")\n\t\t\t\t}\n\n\t\t\t\tif (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId {\n\t\t\t\t\tif err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil {\n\t\t\t\t\t\treturn nil, errors.StructuralError(\"user ID self-signature invalid: \" + err.Error())\n\t\t\t\t\t}\n\t\t\t\t\tcurrent.SelfSignature = sig\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcurrent.Signatures = append(current.Signatures, sig)\n\t\t\t}\n\t\tcase *packet.Signature:\n\t\t\tif pkt.SigType == packet.SigTypeKeyRevocation {\n\t\t\t\trevocations = append(revocations, pkt)\n\t\t\t} else if pkt.SigType == packet.SigTypeDirectSignature {\n\t\t\t\t// TODO: RFC4880 5.2.1 permits signatures\n\t\t\t\t// directly on keys (eg. to bind additional\n\t\t\t\t// revocation keys).\n\t\t\t} else if current == nil {\n\t\t\t\treturn nil, errors.StructuralError(\"signature packet found before user id packet\")\n\t\t\t} else {\n\t\t\t\tcurrent.Signatures = append(current.Signatures, pkt)\n\t\t\t}\n\t\tcase *packet.PrivateKey:\n\t\t\tif pkt.IsSubkey == false {\n\t\t\t\tpackets.Unread(p)\n\t\t\t\tbreak EachPacket\n\t\t\t}\n\t\t\terr = addSubkey(e, packets, &pkt.PublicKey, pkt)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\tcase *packet.PublicKey:\n\t\t\tif pkt.IsSubkey == false {\n\t\t\t\tpackets.Unread(p)\n\t\t\t\tbreak EachPacket\n\t\t\t}\n\t\t\terr = addSubkey(e, packets, pkt, nil)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\tdefault:\n\t\t\t// we ignore unknown packets\n\t\t}\n\t}\n\n\tif len(e.Identities) == 0 {\n\t\treturn nil, errors.StructuralError(\"entity without any identities\")\n\t}\n\n\tfor _, revocation := range revocations {\n\t\terr = e.PrimaryKey.VerifyRevocationSignature(revocation)\n\t\tif err == nil {\n\t\t\te.Revocations = append(e.Revocations, revocation)\n\t\t} else {\n\t\t\t// TODO: RFC 4880 5.2.3.15 defines revocation keys.\n\t\t\treturn nil, errors.StructuralError(\"revocation signature signed by alternate key\")\n\t\t}\n\t}\n\n\treturn e, nil\n}\n\nfunc addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error {\n\tvar subKey Subkey\n\tsubKey.PublicKey = pub\n\tsubKey.PrivateKey = priv\n\tp, err := packets.Next()\n\tif err == io.EOF {\n\t\treturn io.ErrUnexpectedEOF\n\t}\n\tif err != nil {\n\t\treturn errors.StructuralError(\"subkey signature invalid: \" + err.Error())\n\t}\n\tvar ok bool\n\tsubKey.Sig, ok = p.(*packet.Signature)\n\tif !ok {\n\t\treturn errors.StructuralError(\"subkey packet not followed by signature\")\n\t}\n\tif subKey.Sig.SigType != packet.SigTypeSubkeyBinding && subKey.Sig.SigType != packet.SigTypeSubkeyRevocation {\n\t\treturn errors.StructuralError(\"subkey signature with wrong type\")\n\t}\n\terr = e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, subKey.Sig)\n\tif err != nil {\n\t\treturn errors.StructuralError(\"subkey signature invalid: \" + err.Error())\n\t}\n\te.Subkeys = append(e.Subkeys, subKey)\n\treturn nil\n}\n\nconst defaultRSAKeyBits = 2048\n\n// NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a\n// single identity composed of the given full name, comment and email, any of\n// which may be empty but must not contain any of \"()<>\\x00\".\n// If config is nil, sensible defaults will be used.\nfunc NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) {\n\tcurrentTime := config.Now()\n\n\tbits := defaultRSAKeyBits\n\tif config != nil && config.RSABits != 0 {\n\t\tbits = config.RSABits\n\t}\n\n\tuid := packet.NewUserId(name, comment, email)\n\tif uid == nil {\n\t\treturn nil, errors.InvalidArgumentError(\"user id field contained invalid characters\")\n\t}\n\tsigningPriv, err := rsa.GenerateKey(config.Random(), bits)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tencryptingPriv, err := rsa.GenerateKey(config.Random(), bits)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\te := &Entity{\n\t\tPrimaryKey: packet.NewRSAPublicKey(currentTime, &signingPriv.PublicKey),\n\t\tPrivateKey: packet.NewRSAPrivateKey(currentTime, signingPriv),\n\t\tIdentities: make(map[string]*Identity),\n\t}\n\tisPrimaryId := true\n\te.Identities[uid.Id] = &Identity{\n\t\tName:   uid.Name,\n\t\tUserId: uid,\n\t\tSelfSignature: &packet.Signature{\n\t\t\tCreationTime: currentTime,\n\t\t\tSigType:      packet.SigTypePositiveCert,\n\t\t\tPubKeyAlgo:   packet.PubKeyAlgoRSA,\n\t\t\tHash:         config.Hash(),\n\t\t\tIsPrimaryId:  &isPrimaryId,\n\t\t\tFlagsValid:   true,\n\t\t\tFlagSign:     true,\n\t\t\tFlagCertify:  true,\n\t\t\tIssuerKeyId:  &e.PrimaryKey.KeyId,\n\t\t},\n\t}\n\n\t// If the user passes in a DefaultHash via packet.Config,\n\t// set the PreferredHash for the SelfSignature.\n\tif config != nil && config.DefaultHash != 0 {\n\t\te.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)}\n\t}\n\n\te.Subkeys = make([]Subkey, 1)\n\te.Subkeys[0] = Subkey{\n\t\tPublicKey:  packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey),\n\t\tPrivateKey: packet.NewRSAPrivateKey(currentTime, encryptingPriv),\n\t\tSig: &packet.Signature{\n\t\t\tCreationTime:              currentTime,\n\t\t\tSigType:                   packet.SigTypeSubkeyBinding,\n\t\t\tPubKeyAlgo:                packet.PubKeyAlgoRSA,\n\t\t\tHash:                      config.Hash(),\n\t\t\tFlagsValid:                true,\n\t\t\tFlagEncryptStorage:        true,\n\t\t\tFlagEncryptCommunications: true,\n\t\t\tIssuerKeyId:               &e.PrimaryKey.KeyId,\n\t\t},\n\t}\n\te.Subkeys[0].PublicKey.IsSubkey = true\n\te.Subkeys[0].PrivateKey.IsSubkey = true\n\n\treturn e, nil\n}\n\n// SerializePrivate serializes an Entity, including private key material, to\n// the given Writer. For now, it must only be used on an Entity returned from\n// NewEntity.\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) {\n\terr = e.PrivateKey.Serialize(w)\n\tif err != nil {\n\t\treturn\n\t}\n\tfor _, ident := range e.Identities {\n\t\terr = ident.UserId.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = ident.SelfSignature.SignUserId(ident.UserId.Id, e.PrimaryKey, e.PrivateKey, config)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = ident.SelfSignature.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tfor _, subkey := range e.Subkeys {\n\t\terr = subkey.PrivateKey.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\terr = subkey.Sig.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn nil\n}\n\n// Serialize writes the public part of the given Entity to w. (No private\n// key material will be output).\nfunc (e *Entity) Serialize(w io.Writer) error {\n\terr := e.PrimaryKey.Serialize(w)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor _, ident := range e.Identities {\n\t\terr = ident.UserId.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = ident.SelfSignature.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, sig := range ident.Signatures {\n\t\t\terr = sig.Serialize(w)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\tfor _, subkey := range e.Subkeys {\n\t\terr = subkey.PublicKey.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = subkey.Sig.Serialize(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// SignIdentity adds a signature to e, from signer, attesting that identity is\n// associated with e. The provided identity must already be an element of\n// e.Identities and the private key of signer must have been decrypted if\n// necessary.\n// If config is nil, sensible defaults will be used.\nfunc (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Config) error {\n\tif signer.PrivateKey == nil {\n\t\treturn errors.InvalidArgumentError(\"signing Entity must have a private key\")\n\t}\n\tif signer.PrivateKey.Encrypted {\n\t\treturn errors.InvalidArgumentError(\"signing Entity's private key must be decrypted\")\n\t}\n\tident, ok := e.Identities[identity]\n\tif !ok {\n\t\treturn errors.InvalidArgumentError(\"given identity string not found in Entity\")\n\t}\n\n\tsig := &packet.Signature{\n\t\tSigType:      packet.SigTypeGenericCert,\n\t\tPubKeyAlgo:   signer.PrivateKey.PubKeyAlgo,\n\t\tHash:         config.Hash(),\n\t\tCreationTime: config.Now(),\n\t\tIssuerKeyId:  &signer.PrivateKey.KeyId,\n\t}\n\tif err := sig.SignUserId(identity, e.PrimaryKey, signer.PrivateKey, config); err != nil {\n\t\treturn err\n\t}\n\tident.Signatures = append(ident.Signatures, sig)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/compressed.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"compress/bzip2\"\n\t\"compress/flate\"\n\t\"compress/zlib\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"io\"\n\t\"strconv\"\n)\n\n// Compressed represents a compressed OpenPGP packet. The decompressed contents\n// will contain more OpenPGP packets. See RFC 4880, section 5.6.\ntype Compressed struct {\n\tBody io.Reader\n}\n\nconst (\n\tNoCompression      = flate.NoCompression\n\tBestSpeed          = flate.BestSpeed\n\tBestCompression    = flate.BestCompression\n\tDefaultCompression = flate.DefaultCompression\n)\n\n// CompressionConfig contains compressor configuration settings.\ntype CompressionConfig struct {\n\t// Level is the compression level to use. It must be set to\n\t// between -1 and 9, with -1 causing the compressor to use the\n\t// default compression level, 0 causing the compressor to use\n\t// no compression and 1 to 9 representing increasing (better,\n\t// slower) compression levels. If Level is less than -1 or\n\t// more then 9, a non-nil error will be returned during\n\t// encryption. See the constants above for convenient common\n\t// settings for Level.\n\tLevel int\n}\n\nfunc (c *Compressed) parse(r io.Reader) error {\n\tvar buf [1]byte\n\t_, err := readFull(r, buf[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch buf[0] {\n\tcase 1:\n\t\tc.Body = flate.NewReader(r)\n\tcase 2:\n\t\tc.Body, err = zlib.NewReader(r)\n\tcase 3:\n\t\tc.Body = bzip2.NewReader(r)\n\tdefault:\n\t\terr = errors.UnsupportedError(\"unknown compression algorithm: \" + strconv.Itoa(int(buf[0])))\n\t}\n\n\treturn err\n}\n\n// compressedWriterCloser represents the serialized compression stream\n// header and the compressor. Its Close() method ensures that both the\n// compressor and serialized stream header are closed. Its Write()\n// method writes to the compressor.\ntype compressedWriteCloser struct {\n\tsh io.Closer      // Stream Header\n\tc  io.WriteCloser // Compressor\n}\n\nfunc (cwc compressedWriteCloser) Write(p []byte) (int, error) {\n\treturn cwc.c.Write(p)\n}\n\nfunc (cwc compressedWriteCloser) Close() (err error) {\n\terr = cwc.c.Close()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn cwc.sh.Close()\n}\n\n// SerializeCompressed serializes a compressed data packet to w and\n// returns a WriteCloser to which the literal data packets themselves\n// can be written and which MUST be closed on completion. If cc is\n// nil, sensible defaults will be used to configure the compression\n// algorithm.\nfunc SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, err error) {\n\tcompressed, err := serializeStreamHeader(w, packetTypeCompressed)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = compressed.Write([]byte{uint8(algo)})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tlevel := DefaultCompression\n\tif cc != nil {\n\t\tlevel = cc.Level\n\t}\n\n\tvar compressor io.WriteCloser\n\tswitch algo {\n\tcase CompressionZIP:\n\t\tcompressor, err = flate.NewWriter(compressed, level)\n\tcase CompressionZLIB:\n\t\tcompressor, err = zlib.NewWriterLevel(compressed, level)\n\tdefault:\n\t\ts := strconv.Itoa(int(algo))\n\t\terr = errors.UnsupportedError(\"Unsupported compression algorithm: \" + s)\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\n\tliteraldata = compressedWriteCloser{compressed, compressor}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/config.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"io\"\n\t\"time\"\n)\n\n// Config collects a number of parameters along with sensible defaults.\n// A nil *Config is valid and results in all default values.\ntype Config struct {\n\t// Rand provides the source of entropy.\n\t// If nil, the crypto/rand Reader is used.\n\tRand io.Reader\n\t// DefaultHash is the default hash function to be used.\n\t// If zero, SHA-256 is used.\n\tDefaultHash crypto.Hash\n\t// DefaultCipher is the cipher to be used.\n\t// If zero, AES-128 is used.\n\tDefaultCipher CipherFunction\n\t// Time returns the current time as the number of seconds since the\n\t// epoch. If Time is nil, time.Now is used.\n\tTime func() time.Time\n\t// DefaultCompressionAlgo is the compression algorithm to be\n\t// applied to the plaintext before encryption. If zero, no\n\t// compression is done.\n\tDefaultCompressionAlgo CompressionAlgo\n\t// CompressionConfig configures the compression settings.\n\tCompressionConfig *CompressionConfig\n\t// S2KCount is only used for symmetric encryption. It\n\t// determines the strength of the passphrase stretching when\n\t// the said passphrase is hashed to produce a key. S2KCount\n\t// should be between 1024 and 65011712, inclusive. If Config\n\t// is nil or S2KCount is 0, the value 65536 used. Not all\n\t// values in the above range can be represented. S2KCount will\n\t// be rounded up to the next representable value if it cannot\n\t// be encoded exactly. When set, it is strongly encrouraged to\n\t// use a value that is at least 65536. See RFC 4880 Section\n\t// 3.7.1.3.\n\tS2KCount int\n\t// RSABits is the number of bits in new RSA keys made with NewEntity.\n\t// If zero, then 2048 bit keys are created.\n\tRSABits int\n}\n\nfunc (c *Config) Random() io.Reader {\n\tif c == nil || c.Rand == nil {\n\t\treturn rand.Reader\n\t}\n\treturn c.Rand\n}\n\nfunc (c *Config) Hash() crypto.Hash {\n\tif c == nil || uint(c.DefaultHash) == 0 {\n\t\treturn crypto.SHA256\n\t}\n\treturn c.DefaultHash\n}\n\nfunc (c *Config) Cipher() CipherFunction {\n\tif c == nil || uint8(c.DefaultCipher) == 0 {\n\t\treturn CipherAES128\n\t}\n\treturn c.DefaultCipher\n}\n\nfunc (c *Config) Now() time.Time {\n\tif c == nil || c.Time == nil {\n\t\treturn time.Now()\n\t}\n\treturn c.Time()\n}\n\nfunc (c *Config) Compression() CompressionAlgo {\n\tif c == nil {\n\t\treturn CompressionNone\n\t}\n\treturn c.DefaultCompressionAlgo\n}\n\nfunc (c *Config) PasswordHashIterations() int {\n\tif c == nil || c.S2KCount == 0 {\n\t\treturn 0\n\t}\n\treturn c.S2KCount\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto/rsa\"\n\t\"encoding/binary\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\n\t\"golang.org/x/crypto/openpgp/elgamal\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n)\n\nconst encryptedKeyVersion = 3\n\n// EncryptedKey represents a public-key encrypted session key. See RFC 4880,\n// section 5.1.\ntype EncryptedKey struct {\n\tKeyId      uint64\n\tAlgo       PublicKeyAlgorithm\n\tCipherFunc CipherFunction // only valid after a successful Decrypt\n\tKey        []byte         // only valid after a successful Decrypt\n\n\tencryptedMPI1, encryptedMPI2 parsedMPI\n}\n\nfunc (e *EncryptedKey) parse(r io.Reader) (err error) {\n\tvar buf [10]byte\n\t_, err = readFull(r, buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\tif buf[0] != encryptedKeyVersion {\n\t\treturn errors.UnsupportedError(\"unknown EncryptedKey version \" + strconv.Itoa(int(buf[0])))\n\t}\n\te.KeyId = binary.BigEndian.Uint64(buf[1:9])\n\te.Algo = PublicKeyAlgorithm(buf[9])\n\tswitch e.Algo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\te.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r)\n\tcase PubKeyAlgoElGamal:\n\t\te.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\te.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r)\n\t}\n\t_, err = consumeAll(r)\n\treturn\n}\n\nfunc checksumKeyMaterial(key []byte) uint16 {\n\tvar checksum uint16\n\tfor _, v := range key {\n\t\tchecksum += uint16(v)\n\t}\n\treturn checksum\n}\n\n// Decrypt decrypts an encrypted session key with the given private key. The\n// private key must have been decrypted first.\n// If config is nil, sensible defaults will be used.\nfunc (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error {\n\tvar err error\n\tvar b []byte\n\n\t// TODO(agl): use session key decryption routines here to avoid\n\t// padding oracle attacks.\n\tswitch priv.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\tb, err = rsa.DecryptPKCS1v15(config.Random(), priv.PrivateKey.(*rsa.PrivateKey), e.encryptedMPI1.bytes)\n\tcase PubKeyAlgoElGamal:\n\t\tc1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes)\n\t\tc2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes)\n\t\tb, err = elgamal.Decrypt(priv.PrivateKey.(*elgamal.PrivateKey), c1, c2)\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"cannot decrypted encrypted session key with private key of type \" + strconv.Itoa(int(priv.PubKeyAlgo)))\n\t}\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\te.CipherFunc = CipherFunction(b[0])\n\te.Key = b[1 : len(b)-2]\n\texpectedChecksum := uint16(b[len(b)-2])<<8 | uint16(b[len(b)-1])\n\tchecksum := checksumKeyMaterial(e.Key)\n\tif checksum != expectedChecksum {\n\t\treturn errors.StructuralError(\"EncryptedKey checksum incorrect\")\n\t}\n\n\treturn nil\n}\n\n// Serialize writes the encrypted key packet, e, to w.\nfunc (e *EncryptedKey) Serialize(w io.Writer) error {\n\tvar mpiLen int\n\tswitch e.Algo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\tmpiLen = 2 + len(e.encryptedMPI1.bytes)\n\tcase PubKeyAlgoElGamal:\n\t\tmpiLen = 2 + len(e.encryptedMPI1.bytes) + 2 + len(e.encryptedMPI2.bytes)\n\tdefault:\n\t\treturn errors.InvalidArgumentError(\"don't know how to serialize encrypted key type \" + strconv.Itoa(int(e.Algo)))\n\t}\n\n\tserializeHeader(w, packetTypeEncryptedKey, 1 /* version */ +8 /* key id */ +1 /* algo */ +mpiLen)\n\n\tw.Write([]byte{encryptedKeyVersion})\n\tbinary.Write(w, binary.BigEndian, e.KeyId)\n\tw.Write([]byte{byte(e.Algo)})\n\n\tswitch e.Algo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\twriteMPIs(w, e.encryptedMPI1)\n\tcase PubKeyAlgoElGamal:\n\t\twriteMPIs(w, e.encryptedMPI1, e.encryptedMPI2)\n\tdefault:\n\t\tpanic(\"internal error\")\n\t}\n\n\treturn nil\n}\n\n// SerializeEncryptedKey serializes an encrypted key packet to w that contains\n// key, encrypted to pub.\n// If config is nil, sensible defaults will be used.\nfunc SerializeEncryptedKey(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, config *Config) error {\n\tvar buf [10]byte\n\tbuf[0] = encryptedKeyVersion\n\tbinary.BigEndian.PutUint64(buf[1:9], pub.KeyId)\n\tbuf[9] = byte(pub.PubKeyAlgo)\n\n\tkeyBlock := make([]byte, 1 /* cipher type */ +len(key)+2 /* checksum */)\n\tkeyBlock[0] = byte(cipherFunc)\n\tcopy(keyBlock[1:], key)\n\tchecksum := checksumKeyMaterial(key)\n\tkeyBlock[1+len(key)] = byte(checksum >> 8)\n\tkeyBlock[1+len(key)+1] = byte(checksum)\n\n\tswitch pub.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:\n\t\treturn serializeEncryptedKeyRSA(w, config.Random(), buf, pub.PublicKey.(*rsa.PublicKey), keyBlock)\n\tcase PubKeyAlgoElGamal:\n\t\treturn serializeEncryptedKeyElGamal(w, config.Random(), buf, pub.PublicKey.(*elgamal.PublicKey), keyBlock)\n\tcase PubKeyAlgoDSA, PubKeyAlgoRSASignOnly:\n\t\treturn errors.InvalidArgumentError(\"cannot encrypt to public key of type \" + strconv.Itoa(int(pub.PubKeyAlgo)))\n\t}\n\n\treturn errors.UnsupportedError(\"encrypting a key to public key of type \" + strconv.Itoa(int(pub.PubKeyAlgo)))\n}\n\nfunc serializeEncryptedKeyRSA(w io.Writer, rand io.Reader, header [10]byte, pub *rsa.PublicKey, keyBlock []byte) error {\n\tcipherText, err := rsa.EncryptPKCS1v15(rand, pub, keyBlock)\n\tif err != nil {\n\t\treturn errors.InvalidArgumentError(\"RSA encryption failed: \" + err.Error())\n\t}\n\n\tpacketLen := 10 /* header length */ + 2 /* mpi size */ + len(cipherText)\n\n\terr = serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(header[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn writeMPI(w, 8*uint16(len(cipherText)), cipherText)\n}\n\nfunc serializeEncryptedKeyElGamal(w io.Writer, rand io.Reader, header [10]byte, pub *elgamal.PublicKey, keyBlock []byte) error {\n\tc1, c2, err := elgamal.Encrypt(rand, pub, keyBlock)\n\tif err != nil {\n\t\treturn errors.InvalidArgumentError(\"ElGamal encryption failed: \" + err.Error())\n\t}\n\n\tpacketLen := 10 /* header length */\n\tpacketLen += 2 /* mpi size */ + (c1.BitLen()+7)/8\n\tpacketLen += 2 /* mpi size */ + (c2.BitLen()+7)/8\n\n\terr = serializeHeader(w, packetTypeEncryptedKey, packetLen)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(header[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = writeBig(w, c1)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn writeBig(w, c2)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/literal.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"encoding/binary\"\n\t\"io\"\n)\n\n// LiteralData represents an encrypted file. See RFC 4880, section 5.9.\ntype LiteralData struct {\n\tIsBinary bool\n\tFileName string\n\tTime     uint32 // Unix epoch time. Either creation time or modification time. 0 means undefined.\n\tBody     io.Reader\n}\n\n// ForEyesOnly returns whether the contents of the LiteralData have been marked\n// as especially sensitive.\nfunc (l *LiteralData) ForEyesOnly() bool {\n\treturn l.FileName == \"_CONSOLE\"\n}\n\nfunc (l *LiteralData) parse(r io.Reader) (err error) {\n\tvar buf [256]byte\n\n\t_, err = readFull(r, buf[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tl.IsBinary = buf[0] == 'b'\n\tfileNameLen := int(buf[1])\n\n\t_, err = readFull(r, buf[:fileNameLen])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tl.FileName = string(buf[:fileNameLen])\n\n\t_, err = readFull(r, buf[:4])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tl.Time = binary.BigEndian.Uint32(buf[:4])\n\tl.Body = r\n\treturn\n}\n\n// SerializeLiteral serializes a literal data packet to w and returns a\n// WriteCloser to which the data itself can be written and which MUST be closed\n// on completion. The fileName is truncated to 255 bytes.\nfunc SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) {\n\tvar buf [4]byte\n\tbuf[0] = 't'\n\tif isBinary {\n\t\tbuf[0] = 'b'\n\t}\n\tif len(fileName) > 255 {\n\t\tfileName = fileName[:255]\n\t}\n\tbuf[1] = byte(len(fileName))\n\n\tinner, err := serializeStreamHeader(w, packetTypeLiteralData)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = inner.Write(buf[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = inner.Write([]byte(fileName))\n\tif err != nil {\n\t\treturn\n\t}\n\tbinary.BigEndian.PutUint32(buf[:], time)\n\t_, err = inner.Write(buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tplaintext = inner\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/ocfb.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// OpenPGP CFB Mode. http://tools.ietf.org/html/rfc4880#section-13.9\n\npackage packet\n\nimport (\n\t\"crypto/cipher\"\n)\n\ntype ocfbEncrypter struct {\n\tb       cipher.Block\n\tfre     []byte\n\toutUsed int\n}\n\n// An OCFBResyncOption determines if the \"resynchronization step\" of OCFB is\n// performed.\ntype OCFBResyncOption bool\n\nconst (\n\tOCFBResync   OCFBResyncOption = true\n\tOCFBNoResync OCFBResyncOption = false\n)\n\n// NewOCFBEncrypter returns a cipher.Stream which encrypts data with OpenPGP's\n// cipher feedback mode using the given cipher.Block, and an initial amount of\n// ciphertext.  randData must be random bytes and be the same length as the\n// cipher.Block's block size. Resync determines if the \"resynchronization step\"\n// from RFC 4880, 13.9 step 7 is performed. Different parts of OpenPGP vary on\n// this point.\nfunc NewOCFBEncrypter(block cipher.Block, randData []byte, resync OCFBResyncOption) (cipher.Stream, []byte) {\n\tblockSize := block.BlockSize()\n\tif len(randData) != blockSize {\n\t\treturn nil, nil\n\t}\n\n\tx := &ocfbEncrypter{\n\t\tb:       block,\n\t\tfre:     make([]byte, blockSize),\n\t\toutUsed: 0,\n\t}\n\tprefix := make([]byte, blockSize+2)\n\n\tblock.Encrypt(x.fre, x.fre)\n\tfor i := 0; i < blockSize; i++ {\n\t\tprefix[i] = randData[i] ^ x.fre[i]\n\t}\n\n\tblock.Encrypt(x.fre, prefix[:blockSize])\n\tprefix[blockSize] = x.fre[0] ^ randData[blockSize-2]\n\tprefix[blockSize+1] = x.fre[1] ^ randData[blockSize-1]\n\n\tif resync {\n\t\tblock.Encrypt(x.fre, prefix[2:])\n\t} else {\n\t\tx.fre[0] = prefix[blockSize]\n\t\tx.fre[1] = prefix[blockSize+1]\n\t\tx.outUsed = 2\n\t}\n\treturn x, prefix\n}\n\nfunc (x *ocfbEncrypter) XORKeyStream(dst, src []byte) {\n\tfor i := 0; i < len(src); i++ {\n\t\tif x.outUsed == len(x.fre) {\n\t\t\tx.b.Encrypt(x.fre, x.fre)\n\t\t\tx.outUsed = 0\n\t\t}\n\n\t\tx.fre[x.outUsed] ^= src[i]\n\t\tdst[i] = x.fre[x.outUsed]\n\t\tx.outUsed++\n\t}\n}\n\ntype ocfbDecrypter struct {\n\tb       cipher.Block\n\tfre     []byte\n\toutUsed int\n}\n\n// NewOCFBDecrypter returns a cipher.Stream which decrypts data with OpenPGP's\n// cipher feedback mode using the given cipher.Block. Prefix must be the first\n// blockSize + 2 bytes of the ciphertext, where blockSize is the cipher.Block's\n// block size. If an incorrect key is detected then nil is returned. On\n// successful exit, blockSize+2 bytes of decrypted data are written into\n// prefix. Resync determines if the \"resynchronization step\" from RFC 4880,\n// 13.9 step 7 is performed. Different parts of OpenPGP vary on this point.\nfunc NewOCFBDecrypter(block cipher.Block, prefix []byte, resync OCFBResyncOption) cipher.Stream {\n\tblockSize := block.BlockSize()\n\tif len(prefix) != blockSize+2 {\n\t\treturn nil\n\t}\n\n\tx := &ocfbDecrypter{\n\t\tb:       block,\n\t\tfre:     make([]byte, blockSize),\n\t\toutUsed: 0,\n\t}\n\tprefixCopy := make([]byte, len(prefix))\n\tcopy(prefixCopy, prefix)\n\n\tblock.Encrypt(x.fre, x.fre)\n\tfor i := 0; i < blockSize; i++ {\n\t\tprefixCopy[i] ^= x.fre[i]\n\t}\n\n\tblock.Encrypt(x.fre, prefix[:blockSize])\n\tprefixCopy[blockSize] ^= x.fre[0]\n\tprefixCopy[blockSize+1] ^= x.fre[1]\n\n\tif prefixCopy[blockSize-2] != prefixCopy[blockSize] ||\n\t\tprefixCopy[blockSize-1] != prefixCopy[blockSize+1] {\n\t\treturn nil\n\t}\n\n\tif resync {\n\t\tblock.Encrypt(x.fre, prefix[2:])\n\t} else {\n\t\tx.fre[0] = prefix[blockSize]\n\t\tx.fre[1] = prefix[blockSize+1]\n\t\tx.outUsed = 2\n\t}\n\tcopy(prefix, prefixCopy)\n\treturn x\n}\n\nfunc (x *ocfbDecrypter) XORKeyStream(dst, src []byte) {\n\tfor i := 0; i < len(src); i++ {\n\t\tif x.outUsed == len(x.fre) {\n\t\t\tx.b.Encrypt(x.fre, x.fre)\n\t\t\tx.outUsed = 0\n\t\t}\n\n\t\tc := src[i]\n\t\tdst[i] = x.fre[x.outUsed] ^ src[i]\n\t\tx.fre[x.outUsed] = c\n\t\tx.outUsed++\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto\"\n\t\"encoding/binary\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/s2k\"\n\t\"io\"\n\t\"strconv\"\n)\n\n// OnePassSignature represents a one-pass signature packet. See RFC 4880,\n// section 5.4.\ntype OnePassSignature struct {\n\tSigType    SignatureType\n\tHash       crypto.Hash\n\tPubKeyAlgo PublicKeyAlgorithm\n\tKeyId      uint64\n\tIsLast     bool\n}\n\nconst onePassSignatureVersion = 3\n\nfunc (ops *OnePassSignature) parse(r io.Reader) (err error) {\n\tvar buf [13]byte\n\n\t_, err = readFull(r, buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\tif buf[0] != onePassSignatureVersion {\n\t\terr = errors.UnsupportedError(\"one-pass-signature packet version \" + strconv.Itoa(int(buf[0])))\n\t}\n\n\tvar ok bool\n\tops.Hash, ok = s2k.HashIdToHash(buf[2])\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"hash function: \" + strconv.Itoa(int(buf[2])))\n\t}\n\n\tops.SigType = SignatureType(buf[1])\n\tops.PubKeyAlgo = PublicKeyAlgorithm(buf[3])\n\tops.KeyId = binary.BigEndian.Uint64(buf[4:12])\n\tops.IsLast = buf[12] != 0\n\treturn\n}\n\n// Serialize marshals the given OnePassSignature to w.\nfunc (ops *OnePassSignature) Serialize(w io.Writer) error {\n\tvar buf [13]byte\n\tbuf[0] = onePassSignatureVersion\n\tbuf[1] = uint8(ops.SigType)\n\tvar ok bool\n\tbuf[2], ok = s2k.HashToHashId(ops.Hash)\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"hash type: \" + strconv.Itoa(int(ops.Hash)))\n\t}\n\tbuf[3] = uint8(ops.PubKeyAlgo)\n\tbinary.BigEndian.PutUint64(buf[4:12], ops.KeyId)\n\tif ops.IsLast {\n\t\tbuf[12] = 1\n\t}\n\n\tif err := serializeHeader(w, packetTypeOnePassSignature, len(buf)); err != nil {\n\t\treturn err\n\t}\n\t_, err := w.Write(buf[:])\n\treturn err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/opaque.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"io/ioutil\"\n\n\t\"golang.org/x/crypto/openpgp/errors\"\n)\n\n// OpaquePacket represents an OpenPGP packet as raw, unparsed data. This is\n// useful for splitting and storing the original packet contents separately,\n// handling unsupported packet types or accessing parts of the packet not yet\n// implemented by this package.\ntype OpaquePacket struct {\n\t// Packet type\n\tTag uint8\n\t// Reason why the packet was parsed opaquely\n\tReason error\n\t// Binary contents of the packet data\n\tContents []byte\n}\n\nfunc (op *OpaquePacket) parse(r io.Reader) (err error) {\n\top.Contents, err = ioutil.ReadAll(r)\n\treturn\n}\n\n// Serialize marshals the packet to a writer in its original form, including\n// the packet header.\nfunc (op *OpaquePacket) Serialize(w io.Writer) (err error) {\n\terr = serializeHeader(w, packetType(op.Tag), len(op.Contents))\n\tif err == nil {\n\t\t_, err = w.Write(op.Contents)\n\t}\n\treturn\n}\n\n// Parse attempts to parse the opaque contents into a structure supported by\n// this package. If the packet is not known then the result will be another\n// OpaquePacket.\nfunc (op *OpaquePacket) Parse() (p Packet, err error) {\n\thdr := bytes.NewBuffer(nil)\n\terr = serializeHeader(hdr, packetType(op.Tag), len(op.Contents))\n\tif err != nil {\n\t\top.Reason = err\n\t\treturn op, err\n\t}\n\tp, err = Read(io.MultiReader(hdr, bytes.NewBuffer(op.Contents)))\n\tif err != nil {\n\t\top.Reason = err\n\t\tp = op\n\t}\n\treturn\n}\n\n// OpaqueReader reads OpaquePackets from an io.Reader.\ntype OpaqueReader struct {\n\tr io.Reader\n}\n\nfunc NewOpaqueReader(r io.Reader) *OpaqueReader {\n\treturn &OpaqueReader{r: r}\n}\n\n// Read the next OpaquePacket.\nfunc (or *OpaqueReader) Next() (op *OpaquePacket, err error) {\n\ttag, _, contents, err := readHeader(or.r)\n\tif err != nil {\n\t\treturn\n\t}\n\top = &OpaquePacket{Tag: uint8(tag), Reason: err}\n\terr = op.parse(contents)\n\tif err != nil {\n\t\tconsumeAll(contents)\n\t}\n\treturn\n}\n\n// OpaqueSubpacket represents an unparsed OpenPGP subpacket,\n// as found in signature and user attribute packets.\ntype OpaqueSubpacket struct {\n\tSubType  uint8\n\tContents []byte\n}\n\n// OpaqueSubpackets extracts opaque, unparsed OpenPGP subpackets from\n// their byte representation.\nfunc OpaqueSubpackets(contents []byte) (result []*OpaqueSubpacket, err error) {\n\tvar (\n\t\tsubHeaderLen int\n\t\tsubPacket    *OpaqueSubpacket\n\t)\n\tfor len(contents) > 0 {\n\t\tsubHeaderLen, subPacket, err = nextSubpacket(contents)\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tresult = append(result, subPacket)\n\t\tcontents = contents[subHeaderLen+len(subPacket.Contents):]\n\t}\n\treturn\n}\n\nfunc nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacket, err error) {\n\t// RFC 4880, section 5.2.3.1\n\tvar subLen uint32\n\tif len(contents) < 1 {\n\t\tgoto Truncated\n\t}\n\tsubPacket = &OpaqueSubpacket{}\n\tswitch {\n\tcase contents[0] < 192:\n\t\tsubHeaderLen = 2 // 1 length byte, 1 subtype byte\n\t\tif len(contents) < subHeaderLen {\n\t\t\tgoto Truncated\n\t\t}\n\t\tsubLen = uint32(contents[0])\n\t\tcontents = contents[1:]\n\tcase contents[0] < 255:\n\t\tsubHeaderLen = 3 // 2 length bytes, 1 subtype\n\t\tif len(contents) < subHeaderLen {\n\t\t\tgoto Truncated\n\t\t}\n\t\tsubLen = uint32(contents[0]-192)<<8 + uint32(contents[1]) + 192\n\t\tcontents = contents[2:]\n\tdefault:\n\t\tsubHeaderLen = 6 // 5 length bytes, 1 subtype\n\t\tif len(contents) < subHeaderLen {\n\t\t\tgoto Truncated\n\t\t}\n\t\tsubLen = uint32(contents[1])<<24 |\n\t\t\tuint32(contents[2])<<16 |\n\t\t\tuint32(contents[3])<<8 |\n\t\t\tuint32(contents[4])\n\t\tcontents = contents[5:]\n\t}\n\tif subLen > uint32(len(contents)) || subLen == 0 {\n\t\tgoto Truncated\n\t}\n\tsubPacket.SubType = contents[0]\n\tsubPacket.Contents = contents[1:subLen]\n\treturn\nTruncated:\n\terr = errors.StructuralError(\"subpacket truncated\")\n\treturn\n}\n\nfunc (osp *OpaqueSubpacket) Serialize(w io.Writer) (err error) {\n\tbuf := make([]byte, 6)\n\tn := serializeSubpacketLength(buf, len(osp.Contents)+1)\n\tbuf[n] = osp.SubType\n\tif _, err = w.Write(buf[:n+1]); err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(osp.Contents)\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/packet.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package packet implements parsing and serialization of OpenPGP packets, as\n// specified in RFC 4880.\npackage packet // import \"golang.org/x/crypto/openpgp/packet\"\n\nimport (\n\t\"bufio\"\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/des\"\n\t\"golang.org/x/crypto/cast5\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"io\"\n\t\"math/big\"\n)\n\n// readFull is the same as io.ReadFull except that reading zero bytes returns\n// ErrUnexpectedEOF rather than EOF.\nfunc readFull(r io.Reader, buf []byte) (n int, err error) {\n\tn, err = io.ReadFull(r, buf)\n\tif err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn\n}\n\n// readLength reads an OpenPGP length from r. See RFC 4880, section 4.2.2.\nfunc readLength(r io.Reader) (length int64, isPartial bool, err error) {\n\tvar buf [4]byte\n\t_, err = readFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\tswitch {\n\tcase buf[0] < 192:\n\t\tlength = int64(buf[0])\n\tcase buf[0] < 224:\n\t\tlength = int64(buf[0]-192) << 8\n\t\t_, err = readFull(r, buf[0:1])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tlength += int64(buf[0]) + 192\n\tcase buf[0] < 255:\n\t\tlength = int64(1) << (buf[0] & 0x1f)\n\t\tisPartial = true\n\tdefault:\n\t\t_, err = readFull(r, buf[0:4])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tlength = int64(buf[0])<<24 |\n\t\t\tint64(buf[1])<<16 |\n\t\t\tint64(buf[2])<<8 |\n\t\t\tint64(buf[3])\n\t}\n\treturn\n}\n\n// partialLengthReader wraps an io.Reader and handles OpenPGP partial lengths.\n// The continuation lengths are parsed and removed from the stream and EOF is\n// returned at the end of the packet. See RFC 4880, section 4.2.2.4.\ntype partialLengthReader struct {\n\tr         io.Reader\n\tremaining int64\n\tisPartial bool\n}\n\nfunc (r *partialLengthReader) Read(p []byte) (n int, err error) {\n\tfor r.remaining == 0 {\n\t\tif !r.isPartial {\n\t\t\treturn 0, io.EOF\n\t\t}\n\t\tr.remaining, r.isPartial, err = readLength(r.r)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\n\ttoRead := int64(len(p))\n\tif toRead > r.remaining {\n\t\ttoRead = r.remaining\n\t}\n\n\tn, err = r.r.Read(p[:int(toRead)])\n\tr.remaining -= int64(n)\n\tif n < int(toRead) && err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn\n}\n\n// partialLengthWriter writes a stream of data using OpenPGP partial lengths.\n// See RFC 4880, section 4.2.2.4.\ntype partialLengthWriter struct {\n\tw          io.WriteCloser\n\tlengthByte [1]byte\n}\n\nfunc (w *partialLengthWriter) Write(p []byte) (n int, err error) {\n\tfor len(p) > 0 {\n\t\tfor power := uint(14); power < 32; power-- {\n\t\t\tl := 1 << power\n\t\t\tif len(p) >= l {\n\t\t\t\tw.lengthByte[0] = 224 + uint8(power)\n\t\t\t\t_, err = w.w.Write(w.lengthByte[:])\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvar m int\n\t\t\t\tm, err = w.w.Write(p[:l])\n\t\t\t\tn += m\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tp = p[l:]\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (w *partialLengthWriter) Close() error {\n\tw.lengthByte[0] = 0\n\t_, err := w.w.Write(w.lengthByte[:])\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn w.w.Close()\n}\n\n// A spanReader is an io.LimitReader, but it returns ErrUnexpectedEOF if the\n// underlying Reader returns EOF before the limit has been reached.\ntype spanReader struct {\n\tr io.Reader\n\tn int64\n}\n\nfunc (l *spanReader) Read(p []byte) (n int, err error) {\n\tif l.n <= 0 {\n\t\treturn 0, io.EOF\n\t}\n\tif int64(len(p)) > l.n {\n\t\tp = p[0:l.n]\n\t}\n\tn, err = l.r.Read(p)\n\tl.n -= int64(n)\n\tif l.n > 0 && err == io.EOF {\n\t\terr = io.ErrUnexpectedEOF\n\t}\n\treturn\n}\n\n// readHeader parses a packet header and returns an io.Reader which will return\n// the contents of the packet. See RFC 4880, section 4.2.\nfunc readHeader(r io.Reader) (tag packetType, length int64, contents io.Reader, err error) {\n\tvar buf [4]byte\n\t_, err = io.ReadFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\tif buf[0]&0x80 == 0 {\n\t\terr = errors.StructuralError(\"tag byte does not have MSB set\")\n\t\treturn\n\t}\n\tif buf[0]&0x40 == 0 {\n\t\t// Old format packet\n\t\ttag = packetType((buf[0] & 0x3f) >> 2)\n\t\tlengthType := buf[0] & 3\n\t\tif lengthType == 3 {\n\t\t\tlength = -1\n\t\t\tcontents = r\n\t\t\treturn\n\t\t}\n\t\tlengthBytes := 1 << lengthType\n\t\t_, err = readFull(r, buf[0:lengthBytes])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tfor i := 0; i < lengthBytes; i++ {\n\t\t\tlength <<= 8\n\t\t\tlength |= int64(buf[i])\n\t\t}\n\t\tcontents = &spanReader{r, length}\n\t\treturn\n\t}\n\n\t// New format packet\n\ttag = packetType(buf[0] & 0x3f)\n\tlength, isPartial, err := readLength(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tif isPartial {\n\t\tcontents = &partialLengthReader{\n\t\t\tremaining: length,\n\t\t\tisPartial: true,\n\t\t\tr:         r,\n\t\t}\n\t\tlength = -1\n\t} else {\n\t\tcontents = &spanReader{r, length}\n\t}\n\treturn\n}\n\n// serializeHeader writes an OpenPGP packet header to w. See RFC 4880, section\n// 4.2.\nfunc serializeHeader(w io.Writer, ptype packetType, length int) (err error) {\n\tvar buf [6]byte\n\tvar n int\n\n\tbuf[0] = 0x80 | 0x40 | byte(ptype)\n\tif length < 192 {\n\t\tbuf[1] = byte(length)\n\t\tn = 2\n\t} else if length < 8384 {\n\t\tlength -= 192\n\t\tbuf[1] = 192 + byte(length>>8)\n\t\tbuf[2] = byte(length)\n\t\tn = 3\n\t} else {\n\t\tbuf[1] = 255\n\t\tbuf[2] = byte(length >> 24)\n\t\tbuf[3] = byte(length >> 16)\n\t\tbuf[4] = byte(length >> 8)\n\t\tbuf[5] = byte(length)\n\t\tn = 6\n\t}\n\n\t_, err = w.Write(buf[:n])\n\treturn\n}\n\n// serializeStreamHeader writes an OpenPGP packet header to w where the\n// length of the packet is unknown. It returns a io.WriteCloser which can be\n// used to write the contents of the packet. See RFC 4880, section 4.2.\nfunc serializeStreamHeader(w io.WriteCloser, ptype packetType) (out io.WriteCloser, err error) {\n\tvar buf [1]byte\n\tbuf[0] = 0x80 | 0x40 | byte(ptype)\n\t_, err = w.Write(buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\tout = &partialLengthWriter{w: w}\n\treturn\n}\n\n// Packet represents an OpenPGP packet. Users are expected to try casting\n// instances of this interface to specific packet types.\ntype Packet interface {\n\tparse(io.Reader) error\n}\n\n// consumeAll reads from the given Reader until error, returning the number of\n// bytes read.\nfunc consumeAll(r io.Reader) (n int64, err error) {\n\tvar m int\n\tvar buf [1024]byte\n\n\tfor {\n\t\tm, err = r.Read(buf[:])\n\t\tn += int64(m)\n\t\tif err == io.EOF {\n\t\t\terr = nil\n\t\t\treturn\n\t\t}\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// packetType represents the numeric ids of the different OpenPGP packet types. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-2\ntype packetType uint8\n\nconst (\n\tpacketTypeEncryptedKey              packetType = 1\n\tpacketTypeSignature                 packetType = 2\n\tpacketTypeSymmetricKeyEncrypted     packetType = 3\n\tpacketTypeOnePassSignature          packetType = 4\n\tpacketTypePrivateKey                packetType = 5\n\tpacketTypePublicKey                 packetType = 6\n\tpacketTypePrivateSubkey             packetType = 7\n\tpacketTypeCompressed                packetType = 8\n\tpacketTypeSymmetricallyEncrypted    packetType = 9\n\tpacketTypeLiteralData               packetType = 11\n\tpacketTypeUserId                    packetType = 13\n\tpacketTypePublicSubkey              packetType = 14\n\tpacketTypeUserAttribute             packetType = 17\n\tpacketTypeSymmetricallyEncryptedMDC packetType = 18\n)\n\n// peekVersion detects the version of a public key packet about to\n// be read. A bufio.Reader at the original position of the io.Reader\n// is returned.\nfunc peekVersion(r io.Reader) (bufr *bufio.Reader, ver byte, err error) {\n\tbufr = bufio.NewReader(r)\n\tvar verBuf []byte\n\tif verBuf, err = bufr.Peek(1); err != nil {\n\t\treturn\n\t}\n\tver = verBuf[0]\n\treturn\n}\n\n// Read reads a single OpenPGP packet from the given io.Reader. If there is an\n// error parsing a packet, the whole packet is consumed from the input.\nfunc Read(r io.Reader) (p Packet, err error) {\n\ttag, _, contents, err := readHeader(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tswitch tag {\n\tcase packetTypeEncryptedKey:\n\t\tp = new(EncryptedKey)\n\tcase packetTypeSignature:\n\t\tvar version byte\n\t\t// Detect signature version\n\t\tif contents, version, err = peekVersion(contents); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif version < 4 {\n\t\t\tp = new(SignatureV3)\n\t\t} else {\n\t\t\tp = new(Signature)\n\t\t}\n\tcase packetTypeSymmetricKeyEncrypted:\n\t\tp = new(SymmetricKeyEncrypted)\n\tcase packetTypeOnePassSignature:\n\t\tp = new(OnePassSignature)\n\tcase packetTypePrivateKey, packetTypePrivateSubkey:\n\t\tpk := new(PrivateKey)\n\t\tif tag == packetTypePrivateSubkey {\n\t\t\tpk.IsSubkey = true\n\t\t}\n\t\tp = pk\n\tcase packetTypePublicKey, packetTypePublicSubkey:\n\t\tvar version byte\n\t\tif contents, version, err = peekVersion(contents); err != nil {\n\t\t\treturn\n\t\t}\n\t\tisSubkey := tag == packetTypePublicSubkey\n\t\tif version < 4 {\n\t\t\tp = &PublicKeyV3{IsSubkey: isSubkey}\n\t\t} else {\n\t\t\tp = &PublicKey{IsSubkey: isSubkey}\n\t\t}\n\tcase packetTypeCompressed:\n\t\tp = new(Compressed)\n\tcase packetTypeSymmetricallyEncrypted:\n\t\tp = new(SymmetricallyEncrypted)\n\tcase packetTypeLiteralData:\n\t\tp = new(LiteralData)\n\tcase packetTypeUserId:\n\t\tp = new(UserId)\n\tcase packetTypeUserAttribute:\n\t\tp = new(UserAttribute)\n\tcase packetTypeSymmetricallyEncryptedMDC:\n\t\tse := new(SymmetricallyEncrypted)\n\t\tse.MDC = true\n\t\tp = se\n\tdefault:\n\t\terr = errors.UnknownPacketTypeError(tag)\n\t}\n\tif p != nil {\n\t\terr = p.parse(contents)\n\t}\n\tif err != nil {\n\t\tconsumeAll(contents)\n\t}\n\treturn\n}\n\n// SignatureType represents the different semantic meanings of an OpenPGP\n// signature. See RFC 4880, section 5.2.1.\ntype SignatureType uint8\n\nconst (\n\tSigTypeBinary            SignatureType = 0\n\tSigTypeText                            = 1\n\tSigTypeGenericCert                     = 0x10\n\tSigTypePersonaCert                     = 0x11\n\tSigTypeCasualCert                      = 0x12\n\tSigTypePositiveCert                    = 0x13\n\tSigTypeSubkeyBinding                   = 0x18\n\tSigTypePrimaryKeyBinding               = 0x19\n\tSigTypeDirectSignature                 = 0x1F\n\tSigTypeKeyRevocation                   = 0x20\n\tSigTypeSubkeyRevocation                = 0x28\n)\n\n// PublicKeyAlgorithm represents the different public key system specified for\n// OpenPGP. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-12\ntype PublicKeyAlgorithm uint8\n\nconst (\n\tPubKeyAlgoRSA            PublicKeyAlgorithm = 1\n\tPubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2\n\tPubKeyAlgoRSASignOnly    PublicKeyAlgorithm = 3\n\tPubKeyAlgoElGamal        PublicKeyAlgorithm = 16\n\tPubKeyAlgoDSA            PublicKeyAlgorithm = 17\n\t// RFC 6637, Section 5.\n\tPubKeyAlgoECDH  PublicKeyAlgorithm = 18\n\tPubKeyAlgoECDSA PublicKeyAlgorithm = 19\n)\n\n// CanEncrypt returns true if it's possible to encrypt a message to a public\n// key of the given type.\nfunc (pka PublicKeyAlgorithm) CanEncrypt() bool {\n\tswitch pka {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// CanSign returns true if it's possible for a public key of the given type to\n// sign a message.\nfunc (pka PublicKeyAlgorithm) CanSign() bool {\n\tswitch pka {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// CipherFunction represents the different block ciphers specified for OpenPGP. See\n// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13\ntype CipherFunction uint8\n\nconst (\n\tCipher3DES   CipherFunction = 2\n\tCipherCAST5  CipherFunction = 3\n\tCipherAES128 CipherFunction = 7\n\tCipherAES192 CipherFunction = 8\n\tCipherAES256 CipherFunction = 9\n)\n\n// KeySize returns the key size, in bytes, of cipher.\nfunc (cipher CipherFunction) KeySize() int {\n\tswitch cipher {\n\tcase Cipher3DES:\n\t\treturn 24\n\tcase CipherCAST5:\n\t\treturn cast5.KeySize\n\tcase CipherAES128:\n\t\treturn 16\n\tcase CipherAES192:\n\t\treturn 24\n\tcase CipherAES256:\n\t\treturn 32\n\t}\n\treturn 0\n}\n\n// blockSize returns the block size, in bytes, of cipher.\nfunc (cipher CipherFunction) blockSize() int {\n\tswitch cipher {\n\tcase Cipher3DES:\n\t\treturn des.BlockSize\n\tcase CipherCAST5:\n\t\treturn 8\n\tcase CipherAES128, CipherAES192, CipherAES256:\n\t\treturn 16\n\t}\n\treturn 0\n}\n\n// new returns a fresh instance of the given cipher.\nfunc (cipher CipherFunction) new(key []byte) (block cipher.Block) {\n\tswitch cipher {\n\tcase Cipher3DES:\n\t\tblock, _ = des.NewTripleDESCipher(key)\n\tcase CipherCAST5:\n\t\tblock, _ = cast5.NewCipher(key)\n\tcase CipherAES128, CipherAES192, CipherAES256:\n\t\tblock, _ = aes.NewCipher(key)\n\t}\n\treturn\n}\n\n// readMPI reads a big integer from r. The bit length returned is the bit\n// length that was specified in r. This is preserved so that the integer can be\n// reserialized exactly.\nfunc readMPI(r io.Reader) (mpi []byte, bitLength uint16, err error) {\n\tvar buf [2]byte\n\t_, err = readFull(r, buf[0:])\n\tif err != nil {\n\t\treturn\n\t}\n\tbitLength = uint16(buf[0])<<8 | uint16(buf[1])\n\tnumBytes := (int(bitLength) + 7) / 8\n\tmpi = make([]byte, numBytes)\n\t_, err = readFull(r, mpi)\n\treturn\n}\n\n// mpiLength returns the length of the given *big.Int when serialized as an\n// MPI.\nfunc mpiLength(n *big.Int) (mpiLengthInBytes int) {\n\tmpiLengthInBytes = 2 /* MPI length */\n\tmpiLengthInBytes += (n.BitLen() + 7) / 8\n\treturn\n}\n\n// writeMPI serializes a big integer to w.\nfunc writeMPI(w io.Writer, bitLength uint16, mpiBytes []byte) (err error) {\n\t_, err = w.Write([]byte{byte(bitLength >> 8), byte(bitLength)})\n\tif err == nil {\n\t\t_, err = w.Write(mpiBytes)\n\t}\n\treturn\n}\n\n// writeBig serializes a *big.Int to w.\nfunc writeBig(w io.Writer, i *big.Int) error {\n\treturn writeMPI(w, uint16(i.BitLen()), i.Bytes())\n}\n\n// CompressionAlgo Represents the different compression algorithms\n// supported by OpenPGP (except for BZIP2, which is not currently\n// supported). See Section 9.3 of RFC 4880.\ntype CompressionAlgo uint8\n\nconst (\n\tCompressionNone CompressionAlgo = 0\n\tCompressionZIP  CompressionAlgo = 1\n\tCompressionZLIB CompressionAlgo = 2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/private_key.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/cipher\"\n\t\"crypto/dsa\"\n\t\"crypto/ecdsa\"\n\t\"crypto/rsa\"\n\t\"crypto/sha1\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/openpgp/elgamal\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/s2k\"\n)\n\n// PrivateKey represents a possibly encrypted private key. See RFC 4880,\n// section 5.5.3.\ntype PrivateKey struct {\n\tPublicKey\n\tEncrypted     bool // if true then the private key is unavailable until Decrypt has been called.\n\tencryptedData []byte\n\tcipher        CipherFunction\n\ts2k           func(out, in []byte)\n\tPrivateKey    interface{} // An *{rsa|dsa|ecdsa}.PrivateKey or a crypto.Signer.\n\tsha1Checksum  bool\n\tiv            []byte\n}\n\nfunc NewRSAPrivateKey(currentTime time.Time, priv *rsa.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewRSAPublicKey(currentTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewDSAPrivateKey(currentTime time.Time, priv *dsa.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewDSAPublicKey(currentTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewElGamalPrivateKey(currentTime time.Time, priv *elgamal.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewElGamalPublicKey(currentTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\nfunc NewECDSAPrivateKey(currentTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey {\n\tpk := new(PrivateKey)\n\tpk.PublicKey = *NewECDSAPublicKey(currentTime, &priv.PublicKey)\n\tpk.PrivateKey = priv\n\treturn pk\n}\n\n// NewSignerPrivateKey creates a sign-only PrivateKey from a crypto.Signer that\n// implements RSA or ECDSA.\nfunc NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *PrivateKey {\n\tpk := new(PrivateKey)\n\tswitch pubkey := signer.Public().(type) {\n\tcase rsa.PublicKey:\n\t\tpk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey)\n\t\tpk.PubKeyAlgo = PubKeyAlgoRSASignOnly\n\tcase ecdsa.PublicKey:\n\t\tpk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey)\n\tdefault:\n\t\tpanic(\"openpgp: unknown crypto.Signer type in NewSignerPrivateKey\")\n\t}\n\tpk.PrivateKey = signer\n\treturn pk\n}\n\nfunc (pk *PrivateKey) parse(r io.Reader) (err error) {\n\terr = (&pk.PublicKey).parse(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar buf [1]byte\n\t_, err = readFull(r, buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\ts2kType := buf[0]\n\n\tswitch s2kType {\n\tcase 0:\n\t\tpk.s2k = nil\n\t\tpk.Encrypted = false\n\tcase 254, 255:\n\t\t_, err = readFull(r, buf[:])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tpk.cipher = CipherFunction(buf[0])\n\t\tpk.Encrypted = true\n\t\tpk.s2k, err = s2k.Parse(r)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif s2kType == 254 {\n\t\t\tpk.sha1Checksum = true\n\t\t}\n\tdefault:\n\t\treturn errors.UnsupportedError(\"deprecated s2k function in private key\")\n\t}\n\n\tif pk.Encrypted {\n\t\tblockSize := pk.cipher.blockSize()\n\t\tif blockSize == 0 {\n\t\t\treturn errors.UnsupportedError(\"unsupported cipher in private key: \" + strconv.Itoa(int(pk.cipher)))\n\t\t}\n\t\tpk.iv = make([]byte, blockSize)\n\t\t_, err = readFull(r, pk.iv)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tpk.encryptedData, err = ioutil.ReadAll(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif !pk.Encrypted {\n\t\treturn pk.parsePrivateKey(pk.encryptedData)\n\t}\n\n\treturn\n}\n\nfunc mod64kHash(d []byte) uint16 {\n\tvar h uint16\n\tfor _, b := range d {\n\t\th += uint16(b)\n\t}\n\treturn h\n}\n\nfunc (pk *PrivateKey) Serialize(w io.Writer) (err error) {\n\t// TODO(agl): support encrypted private keys\n\tbuf := bytes.NewBuffer(nil)\n\terr = pk.PublicKey.serializeWithoutHeaders(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\tbuf.WriteByte(0 /* no encryption */)\n\n\tprivateKeyBuf := bytes.NewBuffer(nil)\n\n\tswitch priv := pk.PrivateKey.(type) {\n\tcase *rsa.PrivateKey:\n\t\terr = serializeRSAPrivateKey(privateKeyBuf, priv)\n\tcase *dsa.PrivateKey:\n\t\terr = serializeDSAPrivateKey(privateKeyBuf, priv)\n\tcase *elgamal.PrivateKey:\n\t\terr = serializeElGamalPrivateKey(privateKeyBuf, priv)\n\tcase *ecdsa.PrivateKey:\n\t\terr = serializeECDSAPrivateKey(privateKeyBuf, priv)\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"unknown private key type\")\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\n\tptype := packetTypePrivateKey\n\tcontents := buf.Bytes()\n\tprivateKeyBytes := privateKeyBuf.Bytes()\n\tif pk.IsSubkey {\n\t\tptype = packetTypePrivateSubkey\n\t}\n\terr = serializeHeader(w, ptype, len(contents)+len(privateKeyBytes)+2)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(contents)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(privateKeyBytes)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tchecksum := mod64kHash(privateKeyBytes)\n\tvar checksumBytes [2]byte\n\tchecksumBytes[0] = byte(checksum >> 8)\n\tchecksumBytes[1] = byte(checksum)\n\t_, err = w.Write(checksumBytes[:])\n\n\treturn\n}\n\nfunc serializeRSAPrivateKey(w io.Writer, priv *rsa.PrivateKey) error {\n\terr := writeBig(w, priv.D)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = writeBig(w, priv.Primes[1])\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = writeBig(w, priv.Primes[0])\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn writeBig(w, priv.Precomputed.Qinv)\n}\n\nfunc serializeDSAPrivateKey(w io.Writer, priv *dsa.PrivateKey) error {\n\treturn writeBig(w, priv.X)\n}\n\nfunc serializeElGamalPrivateKey(w io.Writer, priv *elgamal.PrivateKey) error {\n\treturn writeBig(w, priv.X)\n}\n\nfunc serializeECDSAPrivateKey(w io.Writer, priv *ecdsa.PrivateKey) error {\n\treturn writeBig(w, priv.D)\n}\n\n// Decrypt decrypts an encrypted private key using a passphrase.\nfunc (pk *PrivateKey) Decrypt(passphrase []byte) error {\n\tif !pk.Encrypted {\n\t\treturn nil\n\t}\n\n\tkey := make([]byte, pk.cipher.KeySize())\n\tpk.s2k(key, passphrase)\n\tblock := pk.cipher.new(key)\n\tcfb := cipher.NewCFBDecrypter(block, pk.iv)\n\n\tdata := make([]byte, len(pk.encryptedData))\n\tcfb.XORKeyStream(data, pk.encryptedData)\n\n\tif pk.sha1Checksum {\n\t\tif len(data) < sha1.Size {\n\t\t\treturn errors.StructuralError(\"truncated private key data\")\n\t\t}\n\t\th := sha1.New()\n\t\th.Write(data[:len(data)-sha1.Size])\n\t\tsum := h.Sum(nil)\n\t\tif !bytes.Equal(sum, data[len(data)-sha1.Size:]) {\n\t\t\treturn errors.StructuralError(\"private key checksum failure\")\n\t\t}\n\t\tdata = data[:len(data)-sha1.Size]\n\t} else {\n\t\tif len(data) < 2 {\n\t\t\treturn errors.StructuralError(\"truncated private key data\")\n\t\t}\n\t\tvar sum uint16\n\t\tfor i := 0; i < len(data)-2; i++ {\n\t\t\tsum += uint16(data[i])\n\t\t}\n\t\tif data[len(data)-2] != uint8(sum>>8) ||\n\t\t\tdata[len(data)-1] != uint8(sum) {\n\t\t\treturn errors.StructuralError(\"private key checksum failure\")\n\t\t}\n\t\tdata = data[:len(data)-2]\n\t}\n\n\treturn pk.parsePrivateKey(data)\n}\n\nfunc (pk *PrivateKey) parsePrivateKey(data []byte) (err error) {\n\tswitch pk.PublicKey.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoRSAEncryptOnly:\n\t\treturn pk.parseRSAPrivateKey(data)\n\tcase PubKeyAlgoDSA:\n\t\treturn pk.parseDSAPrivateKey(data)\n\tcase PubKeyAlgoElGamal:\n\t\treturn pk.parseElGamalPrivateKey(data)\n\tcase PubKeyAlgoECDSA:\n\t\treturn pk.parseECDSAPrivateKey(data)\n\t}\n\tpanic(\"impossible\")\n}\n\nfunc (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) {\n\trsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey)\n\trsaPriv := new(rsa.PrivateKey)\n\trsaPriv.PublicKey = *rsaPub\n\n\tbuf := bytes.NewBuffer(data)\n\td, _, err := readMPI(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\tp, _, err := readMPI(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\tq, _, err := readMPI(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\n\trsaPriv.D = new(big.Int).SetBytes(d)\n\trsaPriv.Primes = make([]*big.Int, 2)\n\trsaPriv.Primes[0] = new(big.Int).SetBytes(p)\n\trsaPriv.Primes[1] = new(big.Int).SetBytes(q)\n\tif err := rsaPriv.Validate(); err != nil {\n\t\treturn err\n\t}\n\trsaPriv.Precompute()\n\tpk.PrivateKey = rsaPriv\n\tpk.Encrypted = false\n\tpk.encryptedData = nil\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err error) {\n\tdsaPub := pk.PublicKey.PublicKey.(*dsa.PublicKey)\n\tdsaPriv := new(dsa.PrivateKey)\n\tdsaPriv.PublicKey = *dsaPub\n\n\tbuf := bytes.NewBuffer(data)\n\tx, _, err := readMPI(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tdsaPriv.X = new(big.Int).SetBytes(x)\n\tpk.PrivateKey = dsaPriv\n\tpk.Encrypted = false\n\tpk.encryptedData = nil\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) {\n\tpub := pk.PublicKey.PublicKey.(*elgamal.PublicKey)\n\tpriv := new(elgamal.PrivateKey)\n\tpriv.PublicKey = *pub\n\n\tbuf := bytes.NewBuffer(data)\n\tx, _, err := readMPI(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tpriv.X = new(big.Int).SetBytes(x)\n\tpk.PrivateKey = priv\n\tpk.Encrypted = false\n\tpk.encryptedData = nil\n\n\treturn nil\n}\n\nfunc (pk *PrivateKey) parseECDSAPrivateKey(data []byte) (err error) {\n\tecdsaPub := pk.PublicKey.PublicKey.(*ecdsa.PublicKey)\n\n\tbuf := bytes.NewBuffer(data)\n\td, _, err := readMPI(buf)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tpk.PrivateKey = &ecdsa.PrivateKey{\n\t\tPublicKey: *ecdsaPub,\n\t\tD:         new(big.Int).SetBytes(d),\n\t}\n\tpk.Encrypted = false\n\tpk.encryptedData = nil\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/public_key.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/dsa\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rsa\"\n\t\"crypto/sha1\"\n\t_ \"crypto/sha256\"\n\t_ \"crypto/sha512\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/openpgp/elgamal\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n)\n\nvar (\n\t// NIST curve P-256\n\toidCurveP256 []byte = []byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}\n\t// NIST curve P-384\n\toidCurveP384 []byte = []byte{0x2B, 0x81, 0x04, 0x00, 0x22}\n\t// NIST curve P-521\n\toidCurveP521 []byte = []byte{0x2B, 0x81, 0x04, 0x00, 0x23}\n)\n\nconst maxOIDLength = 8\n\n// ecdsaKey stores the algorithm-specific fields for ECDSA keys.\n// as defined in RFC 6637, Section 9.\ntype ecdsaKey struct {\n\t// oid contains the OID byte sequence identifying the elliptic curve used\n\toid []byte\n\t// p contains the elliptic curve point that represents the public key\n\tp parsedMPI\n}\n\n// parseOID reads the OID for the curve as defined in RFC 6637, Section 9.\nfunc parseOID(r io.Reader) (oid []byte, err error) {\n\tbuf := make([]byte, maxOIDLength)\n\tif _, err = readFull(r, buf[:1]); err != nil {\n\t\treturn\n\t}\n\toidLen := buf[0]\n\tif int(oidLen) > len(buf) {\n\t\terr = errors.UnsupportedError(\"invalid oid length: \" + strconv.Itoa(int(oidLen)))\n\t\treturn\n\t}\n\toid = buf[:oidLen]\n\t_, err = readFull(r, oid)\n\treturn\n}\n\nfunc (f *ecdsaKey) parse(r io.Reader) (err error) {\n\tif f.oid, err = parseOID(r); err != nil {\n\t\treturn err\n\t}\n\tf.p.bytes, f.p.bitLength, err = readMPI(r)\n\treturn\n}\n\nfunc (f *ecdsaKey) serialize(w io.Writer) (err error) {\n\tbuf := make([]byte, maxOIDLength+1)\n\tbuf[0] = byte(len(f.oid))\n\tcopy(buf[1:], f.oid)\n\tif _, err = w.Write(buf[:len(f.oid)+1]); err != nil {\n\t\treturn\n\t}\n\treturn writeMPIs(w, f.p)\n}\n\nfunc (f *ecdsaKey) newECDSA() (*ecdsa.PublicKey, error) {\n\tvar c elliptic.Curve\n\tif bytes.Equal(f.oid, oidCurveP256) {\n\t\tc = elliptic.P256()\n\t} else if bytes.Equal(f.oid, oidCurveP384) {\n\t\tc = elliptic.P384()\n\t} else if bytes.Equal(f.oid, oidCurveP521) {\n\t\tc = elliptic.P521()\n\t} else {\n\t\treturn nil, errors.UnsupportedError(fmt.Sprintf(\"unsupported oid: %x\", f.oid))\n\t}\n\tx, y := elliptic.Unmarshal(c, f.p.bytes)\n\tif x == nil {\n\t\treturn nil, errors.UnsupportedError(\"failed to parse EC point\")\n\t}\n\treturn &ecdsa.PublicKey{Curve: c, X: x, Y: y}, nil\n}\n\nfunc (f *ecdsaKey) byteLen() int {\n\treturn 1 + len(f.oid) + 2 + len(f.p.bytes)\n}\n\ntype kdfHashFunction byte\ntype kdfAlgorithm byte\n\n// ecdhKdf stores key derivation function parameters\n// used for ECDH encryption. See RFC 6637, Section 9.\ntype ecdhKdf struct {\n\tKdfHash kdfHashFunction\n\tKdfAlgo kdfAlgorithm\n}\n\nfunc (f *ecdhKdf) parse(r io.Reader) (err error) {\n\tbuf := make([]byte, 1)\n\tif _, err = readFull(r, buf); err != nil {\n\t\treturn\n\t}\n\tkdfLen := int(buf[0])\n\tif kdfLen < 3 {\n\t\treturn errors.UnsupportedError(\"Unsupported ECDH KDF length: \" + strconv.Itoa(kdfLen))\n\t}\n\tbuf = make([]byte, kdfLen)\n\tif _, err = readFull(r, buf); err != nil {\n\t\treturn\n\t}\n\treserved := int(buf[0])\n\tf.KdfHash = kdfHashFunction(buf[1])\n\tf.KdfAlgo = kdfAlgorithm(buf[2])\n\tif reserved != 0x01 {\n\t\treturn errors.UnsupportedError(\"Unsupported KDF reserved field: \" + strconv.Itoa(reserved))\n\t}\n\treturn\n}\n\nfunc (f *ecdhKdf) serialize(w io.Writer) (err error) {\n\tbuf := make([]byte, 4)\n\t// See RFC 6637, Section 9, Algorithm-Specific Fields for ECDH keys.\n\tbuf[0] = byte(0x03) // Length of the following fields\n\tbuf[1] = byte(0x01) // Reserved for future extensions, must be 1 for now\n\tbuf[2] = byte(f.KdfHash)\n\tbuf[3] = byte(f.KdfAlgo)\n\t_, err = w.Write(buf[:])\n\treturn\n}\n\nfunc (f *ecdhKdf) byteLen() int {\n\treturn 4\n}\n\n// PublicKey represents an OpenPGP public key. See RFC 4880, section 5.5.2.\ntype PublicKey struct {\n\tCreationTime time.Time\n\tPubKeyAlgo   PublicKeyAlgorithm\n\tPublicKey    interface{} // *rsa.PublicKey, *dsa.PublicKey or *ecdsa.PublicKey\n\tFingerprint  [20]byte\n\tKeyId        uint64\n\tIsSubkey     bool\n\n\tn, e, p, q, g, y parsedMPI\n\n\t// RFC 6637 fields\n\tec   *ecdsaKey\n\tecdh *ecdhKdf\n}\n\n// signingKey provides a convenient abstraction over signature verification\n// for v3 and v4 public keys.\ntype signingKey interface {\n\tSerializeSignaturePrefix(io.Writer)\n\tserializeWithoutHeaders(io.Writer) error\n}\n\nfunc fromBig(n *big.Int) parsedMPI {\n\treturn parsedMPI{\n\t\tbytes:     n.Bytes(),\n\t\tbitLength: uint16(n.BitLen()),\n\t}\n}\n\n// NewRSAPublicKey returns a PublicKey that wraps the given rsa.PublicKey.\nfunc NewRSAPublicKey(creationTime time.Time, pub *rsa.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoRSA,\n\t\tPublicKey:    pub,\n\t\tn:            fromBig(pub.N),\n\t\te:            fromBig(big.NewInt(int64(pub.E))),\n\t}\n\n\tpk.setFingerPrintAndKeyId()\n\treturn pk\n}\n\n// NewDSAPublicKey returns a PublicKey that wraps the given dsa.PublicKey.\nfunc NewDSAPublicKey(creationTime time.Time, pub *dsa.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoDSA,\n\t\tPublicKey:    pub,\n\t\tp:            fromBig(pub.P),\n\t\tq:            fromBig(pub.Q),\n\t\tg:            fromBig(pub.G),\n\t\ty:            fromBig(pub.Y),\n\t}\n\n\tpk.setFingerPrintAndKeyId()\n\treturn pk\n}\n\n// NewElGamalPublicKey returns a PublicKey that wraps the given elgamal.PublicKey.\nfunc NewElGamalPublicKey(creationTime time.Time, pub *elgamal.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoElGamal,\n\t\tPublicKey:    pub,\n\t\tp:            fromBig(pub.P),\n\t\tg:            fromBig(pub.G),\n\t\ty:            fromBig(pub.Y),\n\t}\n\n\tpk.setFingerPrintAndKeyId()\n\treturn pk\n}\n\nfunc NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey {\n\tpk := &PublicKey{\n\t\tCreationTime: creationTime,\n\t\tPubKeyAlgo:   PubKeyAlgoECDSA,\n\t\tPublicKey:    pub,\n\t\tec:           new(ecdsaKey),\n\t}\n\n\tswitch pub.Curve {\n\tcase elliptic.P256():\n\t\tpk.ec.oid = oidCurveP256\n\tcase elliptic.P384():\n\t\tpk.ec.oid = oidCurveP384\n\tcase elliptic.P521():\n\t\tpk.ec.oid = oidCurveP521\n\tdefault:\n\t\tpanic(\"unknown elliptic curve\")\n\t}\n\n\tpk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y)\n\tpk.ec.p.bitLength = uint16(8 * len(pk.ec.p.bytes))\n\n\tpk.setFingerPrintAndKeyId()\n\treturn pk\n}\n\nfunc (pk *PublicKey) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.5.2\n\tvar buf [6]byte\n\t_, err = readFull(r, buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\tif buf[0] != 4 {\n\t\treturn errors.UnsupportedError(\"public key version\")\n\t}\n\tpk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0)\n\tpk.PubKeyAlgo = PublicKeyAlgorithm(buf[5])\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\terr = pk.parseRSA(r)\n\tcase PubKeyAlgoDSA:\n\t\terr = pk.parseDSA(r)\n\tcase PubKeyAlgoElGamal:\n\t\terr = pk.parseElGamal(r)\n\tcase PubKeyAlgoECDSA:\n\t\tpk.ec = new(ecdsaKey)\n\t\tif err = pk.ec.parse(r); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpk.PublicKey, err = pk.ec.newECDSA()\n\tcase PubKeyAlgoECDH:\n\t\tpk.ec = new(ecdsaKey)\n\t\tif err = pk.ec.parse(r); err != nil {\n\t\t\treturn\n\t\t}\n\t\tpk.ecdh = new(ecdhKdf)\n\t\tif err = pk.ecdh.parse(r); err != nil {\n\t\t\treturn\n\t\t}\n\t\t// The ECDH key is stored in an ecdsa.PublicKey for convenience.\n\t\tpk.PublicKey, err = pk.ec.newECDSA()\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key type: \" + strconv.Itoa(int(pk.PubKeyAlgo)))\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\n\tpk.setFingerPrintAndKeyId()\n\treturn\n}\n\nfunc (pk *PublicKey) setFingerPrintAndKeyId() {\n\t// RFC 4880, section 12.2\n\tfingerPrint := sha1.New()\n\tpk.SerializeSignaturePrefix(fingerPrint)\n\tpk.serializeWithoutHeaders(fingerPrint)\n\tcopy(pk.Fingerprint[:], fingerPrint.Sum(nil))\n\tpk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[12:20])\n}\n\n// parseRSA parses RSA public key material from the given Reader. See RFC 4880,\n// section 5.5.2.\nfunc (pk *PublicKey) parseRSA(r io.Reader) (err error) {\n\tpk.n.bytes, pk.n.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tpk.e.bytes, pk.e.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif len(pk.e.bytes) > 3 {\n\t\terr = errors.UnsupportedError(\"large public exponent\")\n\t\treturn\n\t}\n\trsa := &rsa.PublicKey{\n\t\tN: new(big.Int).SetBytes(pk.n.bytes),\n\t\tE: 0,\n\t}\n\tfor i := 0; i < len(pk.e.bytes); i++ {\n\t\trsa.E <<= 8\n\t\trsa.E |= int(pk.e.bytes[i])\n\t}\n\tpk.PublicKey = rsa\n\treturn\n}\n\n// parseDSA parses DSA public key material from the given Reader. See RFC 4880,\n// section 5.5.2.\nfunc (pk *PublicKey) parseDSA(r io.Reader) (err error) {\n\tpk.p.bytes, pk.p.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tpk.q.bytes, pk.q.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tpk.g.bytes, pk.g.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tpk.y.bytes, pk.y.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tdsa := new(dsa.PublicKey)\n\tdsa.P = new(big.Int).SetBytes(pk.p.bytes)\n\tdsa.Q = new(big.Int).SetBytes(pk.q.bytes)\n\tdsa.G = new(big.Int).SetBytes(pk.g.bytes)\n\tdsa.Y = new(big.Int).SetBytes(pk.y.bytes)\n\tpk.PublicKey = dsa\n\treturn\n}\n\n// parseElGamal parses ElGamal public key material from the given Reader. See\n// RFC 4880, section 5.5.2.\nfunc (pk *PublicKey) parseElGamal(r io.Reader) (err error) {\n\tpk.p.bytes, pk.p.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tpk.g.bytes, pk.g.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tpk.y.bytes, pk.y.bitLength, err = readMPI(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\telgamal := new(elgamal.PublicKey)\n\telgamal.P = new(big.Int).SetBytes(pk.p.bytes)\n\telgamal.G = new(big.Int).SetBytes(pk.g.bytes)\n\telgamal.Y = new(big.Int).SetBytes(pk.y.bytes)\n\tpk.PublicKey = elgamal\n\treturn\n}\n\n// SerializeSignaturePrefix writes the prefix for this public key to the given Writer.\n// The prefix is used when calculating a signature over this public key. See\n// RFC 4880, section 5.2.4.\nfunc (pk *PublicKey) SerializeSignaturePrefix(h io.Writer) {\n\tvar pLength uint16\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tpLength += 2 + uint16(len(pk.n.bytes))\n\t\tpLength += 2 + uint16(len(pk.e.bytes))\n\tcase PubKeyAlgoDSA:\n\t\tpLength += 2 + uint16(len(pk.p.bytes))\n\t\tpLength += 2 + uint16(len(pk.q.bytes))\n\t\tpLength += 2 + uint16(len(pk.g.bytes))\n\t\tpLength += 2 + uint16(len(pk.y.bytes))\n\tcase PubKeyAlgoElGamal:\n\t\tpLength += 2 + uint16(len(pk.p.bytes))\n\t\tpLength += 2 + uint16(len(pk.g.bytes))\n\t\tpLength += 2 + uint16(len(pk.y.bytes))\n\tcase PubKeyAlgoECDSA:\n\t\tpLength += uint16(pk.ec.byteLen())\n\tcase PubKeyAlgoECDH:\n\t\tpLength += uint16(pk.ec.byteLen())\n\t\tpLength += uint16(pk.ecdh.byteLen())\n\tdefault:\n\t\tpanic(\"unknown public key algorithm\")\n\t}\n\tpLength += 6\n\th.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)})\n\treturn\n}\n\nfunc (pk *PublicKey) Serialize(w io.Writer) (err error) {\n\tlength := 6 // 6 byte header\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tlength += 2 + len(pk.n.bytes)\n\t\tlength += 2 + len(pk.e.bytes)\n\tcase PubKeyAlgoDSA:\n\t\tlength += 2 + len(pk.p.bytes)\n\t\tlength += 2 + len(pk.q.bytes)\n\t\tlength += 2 + len(pk.g.bytes)\n\t\tlength += 2 + len(pk.y.bytes)\n\tcase PubKeyAlgoElGamal:\n\t\tlength += 2 + len(pk.p.bytes)\n\t\tlength += 2 + len(pk.g.bytes)\n\t\tlength += 2 + len(pk.y.bytes)\n\tcase PubKeyAlgoECDSA:\n\t\tlength += pk.ec.byteLen()\n\tcase PubKeyAlgoECDH:\n\t\tlength += pk.ec.byteLen()\n\t\tlength += pk.ecdh.byteLen()\n\tdefault:\n\t\tpanic(\"unknown public key algorithm\")\n\t}\n\n\tpacketType := packetTypePublicKey\n\tif pk.IsSubkey {\n\t\tpacketType = packetTypePublicSubkey\n\t}\n\terr = serializeHeader(w, packetType, length)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn pk.serializeWithoutHeaders(w)\n}\n\n// serializeWithoutHeaders marshals the PublicKey to w in the form of an\n// OpenPGP public key packet, not including the packet header.\nfunc (pk *PublicKey) serializeWithoutHeaders(w io.Writer) (err error) {\n\tvar buf [6]byte\n\tbuf[0] = 4\n\tt := uint32(pk.CreationTime.Unix())\n\tbuf[1] = byte(t >> 24)\n\tbuf[2] = byte(t >> 16)\n\tbuf[3] = byte(t >> 8)\n\tbuf[4] = byte(t)\n\tbuf[5] = byte(pk.PubKeyAlgo)\n\n\t_, err = w.Write(buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\treturn writeMPIs(w, pk.n, pk.e)\n\tcase PubKeyAlgoDSA:\n\t\treturn writeMPIs(w, pk.p, pk.q, pk.g, pk.y)\n\tcase PubKeyAlgoElGamal:\n\t\treturn writeMPIs(w, pk.p, pk.g, pk.y)\n\tcase PubKeyAlgoECDSA:\n\t\treturn pk.ec.serialize(w)\n\tcase PubKeyAlgoECDH:\n\t\tif err = pk.ec.serialize(w); err != nil {\n\t\t\treturn\n\t\t}\n\t\treturn pk.ecdh.serialize(w)\n\t}\n\treturn errors.InvalidArgumentError(\"bad public-key algorithm\")\n}\n\n// CanSign returns true iff this public key can generate signatures\nfunc (pk *PublicKey) CanSign() bool {\n\treturn pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly && pk.PubKeyAlgo != PubKeyAlgoElGamal\n}\n\n// VerifySignature returns nil iff sig is a valid signature, made by this\n// public key, of the data hashed into signed. signed is mutated by this call.\nfunc (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err error) {\n\tif !pk.CanSign() {\n\t\treturn errors.InvalidArgumentError(\"public key cannot generate signatures\")\n\t}\n\n\tsigned.Write(sig.HashSuffix)\n\thashBytes := signed.Sum(nil)\n\n\tif hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] {\n\t\treturn errors.SignatureError(\"hash tag doesn't match\")\n\t}\n\n\tif pk.PubKeyAlgo != sig.PubKeyAlgo {\n\t\treturn errors.InvalidArgumentError(\"public key and signature use different algorithms\")\n\t}\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\trsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey)\n\t\terr = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes)\n\t\tif err != nil {\n\t\t\treturn errors.SignatureError(\"RSA verification failure\")\n\t\t}\n\t\treturn nil\n\tcase PubKeyAlgoDSA:\n\t\tdsaPublicKey, _ := pk.PublicKey.(*dsa.PublicKey)\n\t\t// Need to truncate hashBytes to match FIPS 186-3 section 4.6.\n\t\tsubgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8\n\t\tif len(hashBytes) > subgroupSize {\n\t\t\thashBytes = hashBytes[:subgroupSize]\n\t\t}\n\t\tif !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) {\n\t\t\treturn errors.SignatureError(\"DSA verification failure\")\n\t\t}\n\t\treturn nil\n\tcase PubKeyAlgoECDSA:\n\t\tecdsaPublicKey := pk.PublicKey.(*ecdsa.PublicKey)\n\t\tif !ecdsa.Verify(ecdsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.ECDSASigR.bytes), new(big.Int).SetBytes(sig.ECDSASigS.bytes)) {\n\t\t\treturn errors.SignatureError(\"ECDSA verification failure\")\n\t\t}\n\t\treturn nil\n\tdefault:\n\t\treturn errors.SignatureError(\"Unsupported public key algorithm used in signature\")\n\t}\n}\n\n// VerifySignatureV3 returns nil iff sig is a valid signature, made by this\n// public key, of the data hashed into signed. signed is mutated by this call.\nfunc (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err error) {\n\tif !pk.CanSign() {\n\t\treturn errors.InvalidArgumentError(\"public key cannot generate signatures\")\n\t}\n\n\tsuffix := make([]byte, 5)\n\tsuffix[0] = byte(sig.SigType)\n\tbinary.BigEndian.PutUint32(suffix[1:], uint32(sig.CreationTime.Unix()))\n\tsigned.Write(suffix)\n\thashBytes := signed.Sum(nil)\n\n\tif hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] {\n\t\treturn errors.SignatureError(\"hash tag doesn't match\")\n\t}\n\n\tif pk.PubKeyAlgo != sig.PubKeyAlgo {\n\t\treturn errors.InvalidArgumentError(\"public key and signature use different algorithms\")\n\t}\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\trsaPublicKey := pk.PublicKey.(*rsa.PublicKey)\n\t\tif err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil {\n\t\t\treturn errors.SignatureError(\"RSA verification failure\")\n\t\t}\n\t\treturn\n\tcase PubKeyAlgoDSA:\n\t\tdsaPublicKey := pk.PublicKey.(*dsa.PublicKey)\n\t\t// Need to truncate hashBytes to match FIPS 186-3 section 4.6.\n\t\tsubgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8\n\t\tif len(hashBytes) > subgroupSize {\n\t\t\thashBytes = hashBytes[:subgroupSize]\n\t\t}\n\t\tif !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) {\n\t\t\treturn errors.SignatureError(\"DSA verification failure\")\n\t\t}\n\t\treturn nil\n\tdefault:\n\t\tpanic(\"shouldn't happen\")\n\t}\n}\n\n// keySignatureHash returns a Hash of the message that needs to be signed for\n// pk to assert a subkey relationship to signed.\nfunc keySignatureHash(pk, signed signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) {\n\tif !hashFunc.Available() {\n\t\treturn nil, errors.UnsupportedError(\"hash function\")\n\t}\n\th = hashFunc.New()\n\n\t// RFC 4880, section 5.2.4\n\tpk.SerializeSignaturePrefix(h)\n\tpk.serializeWithoutHeaders(h)\n\tsigned.SerializeSignaturePrefix(h)\n\tsigned.serializeWithoutHeaders(h)\n\treturn\n}\n\n// VerifyKeySignature returns nil iff sig is a valid signature, made by this\n// public key, of signed.\nfunc (pk *PublicKey) VerifyKeySignature(signed *PublicKey, sig *Signature) error {\n\th, err := keySignatureHash(pk, signed, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = pk.VerifySignature(h, sig); err != nil {\n\t\treturn err\n\t}\n\n\tif sig.FlagSign {\n\t\t// Signing subkeys must be cross-signed. See\n\t\t// https://www.gnupg.org/faq/subkey-cross-certify.html.\n\t\tif sig.EmbeddedSignature == nil {\n\t\t\treturn errors.StructuralError(\"signing subkey is missing cross-signature\")\n\t\t}\n\t\t// Verify the cross-signature. This is calculated over the same\n\t\t// data as the main signature, so we cannot just recursively\n\t\t// call signed.VerifyKeySignature(...)\n\t\tif h, err = keySignatureHash(pk, signed, sig.EmbeddedSignature.Hash); err != nil {\n\t\t\treturn errors.StructuralError(\"error while hashing for cross-signature: \" + err.Error())\n\t\t}\n\t\tif err := signed.VerifySignature(h, sig.EmbeddedSignature); err != nil {\n\t\t\treturn errors.StructuralError(\"error while verifying cross-signature: \" + err.Error())\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc keyRevocationHash(pk signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) {\n\tif !hashFunc.Available() {\n\t\treturn nil, errors.UnsupportedError(\"hash function\")\n\t}\n\th = hashFunc.New()\n\n\t// RFC 4880, section 5.2.4\n\tpk.SerializeSignaturePrefix(h)\n\tpk.serializeWithoutHeaders(h)\n\n\treturn\n}\n\n// VerifyRevocationSignature returns nil iff sig is a valid signature, made by this\n// public key.\nfunc (pk *PublicKey) VerifyRevocationSignature(sig *Signature) (err error) {\n\th, err := keyRevocationHash(pk, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignature(h, sig)\n}\n\n// userIdSignatureHash returns a Hash of the message that needs to be signed\n// to assert that pk is a valid key for id.\nfunc userIdSignatureHash(id string, pk *PublicKey, hashFunc crypto.Hash) (h hash.Hash, err error) {\n\tif !hashFunc.Available() {\n\t\treturn nil, errors.UnsupportedError(\"hash function\")\n\t}\n\th = hashFunc.New()\n\n\t// RFC 4880, section 5.2.4\n\tpk.SerializeSignaturePrefix(h)\n\tpk.serializeWithoutHeaders(h)\n\n\tvar buf [5]byte\n\tbuf[0] = 0xb4\n\tbuf[1] = byte(len(id) >> 24)\n\tbuf[2] = byte(len(id) >> 16)\n\tbuf[3] = byte(len(id) >> 8)\n\tbuf[4] = byte(len(id))\n\th.Write(buf[:])\n\th.Write([]byte(id))\n\n\treturn\n}\n\n// VerifyUserIdSignature returns nil iff sig is a valid signature, made by this\n// public key, that id is the identity of pub.\nfunc (pk *PublicKey) VerifyUserIdSignature(id string, pub *PublicKey, sig *Signature) (err error) {\n\th, err := userIdSignatureHash(id, pub, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignature(h, sig)\n}\n\n// VerifyUserIdSignatureV3 returns nil iff sig is a valid signature, made by this\n// public key, that id is the identity of pub.\nfunc (pk *PublicKey) VerifyUserIdSignatureV3(id string, pub *PublicKey, sig *SignatureV3) (err error) {\n\th, err := userIdSignatureV3Hash(id, pub, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignatureV3(h, sig)\n}\n\n// KeyIdString returns the public key's fingerprint in capital hex\n// (e.g. \"6C7EE1B8621CC013\").\nfunc (pk *PublicKey) KeyIdString() string {\n\treturn fmt.Sprintf(\"%X\", pk.Fingerprint[12:20])\n}\n\n// KeyIdShortString returns the short form of public key's fingerprint\n// in capital hex, as shown by gpg --list-keys (e.g. \"621CC013\").\nfunc (pk *PublicKey) KeyIdShortString() string {\n\treturn fmt.Sprintf(\"%X\", pk.Fingerprint[16:20])\n}\n\n// A parsedMPI is used to store the contents of a big integer, along with the\n// bit length that was specified in the original input. This allows the MPI to\n// be reserialized exactly.\ntype parsedMPI struct {\n\tbytes     []byte\n\tbitLength uint16\n}\n\n// writeMPIs is a utility function for serializing several big integers to the\n// given Writer.\nfunc writeMPIs(w io.Writer, mpis ...parsedMPI) (err error) {\n\tfor _, mpi := range mpis {\n\t\terr = writeMPI(w, mpi.bitLength, mpi.bytes)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\n// BitLength returns the bit length for the given public key.\nfunc (pk *PublicKey) BitLength() (bitLength uint16, err error) {\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tbitLength = pk.n.bitLength\n\tcase PubKeyAlgoDSA:\n\t\tbitLength = pk.p.bitLength\n\tcase PubKeyAlgoElGamal:\n\t\tbitLength = pk.p.bitLength\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"bad public-key algorithm\")\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto\"\n\t\"crypto/md5\"\n\t\"crypto/rsa\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/openpgp/errors\"\n)\n\n// PublicKeyV3 represents older, version 3 public keys. These keys are less secure and\n// should not be used for signing or encrypting. They are supported here only for\n// parsing version 3 key material and validating signatures.\n// See RFC 4880, section 5.5.2.\ntype PublicKeyV3 struct {\n\tCreationTime time.Time\n\tDaysToExpire uint16\n\tPubKeyAlgo   PublicKeyAlgorithm\n\tPublicKey    *rsa.PublicKey\n\tFingerprint  [16]byte\n\tKeyId        uint64\n\tIsSubkey     bool\n\n\tn, e parsedMPI\n}\n\n// newRSAPublicKeyV3 returns a PublicKey that wraps the given rsa.PublicKey.\n// Included here for testing purposes only. RFC 4880, section 5.5.2:\n// \"an implementation MUST NOT generate a V3 key, but MAY accept it.\"\nfunc newRSAPublicKeyV3(creationTime time.Time, pub *rsa.PublicKey) *PublicKeyV3 {\n\tpk := &PublicKeyV3{\n\t\tCreationTime: creationTime,\n\t\tPublicKey:    pub,\n\t\tn:            fromBig(pub.N),\n\t\te:            fromBig(big.NewInt(int64(pub.E))),\n\t}\n\n\tpk.setFingerPrintAndKeyId()\n\treturn pk\n}\n\nfunc (pk *PublicKeyV3) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.5.2\n\tvar buf [8]byte\n\tif _, err = readFull(r, buf[:]); err != nil {\n\t\treturn\n\t}\n\tif buf[0] < 2 || buf[0] > 3 {\n\t\treturn errors.UnsupportedError(\"public key version\")\n\t}\n\tpk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0)\n\tpk.DaysToExpire = binary.BigEndian.Uint16(buf[5:7])\n\tpk.PubKeyAlgo = PublicKeyAlgorithm(buf[7])\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\terr = pk.parseRSA(r)\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key type: \" + strconv.Itoa(int(pk.PubKeyAlgo)))\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\n\tpk.setFingerPrintAndKeyId()\n\treturn\n}\n\nfunc (pk *PublicKeyV3) setFingerPrintAndKeyId() {\n\t// RFC 4880, section 12.2\n\tfingerPrint := md5.New()\n\tfingerPrint.Write(pk.n.bytes)\n\tfingerPrint.Write(pk.e.bytes)\n\tfingerPrint.Sum(pk.Fingerprint[:0])\n\tpk.KeyId = binary.BigEndian.Uint64(pk.n.bytes[len(pk.n.bytes)-8:])\n}\n\n// parseRSA parses RSA public key material from the given Reader. See RFC 4880,\n// section 5.5.2.\nfunc (pk *PublicKeyV3) parseRSA(r io.Reader) (err error) {\n\tif pk.n.bytes, pk.n.bitLength, err = readMPI(r); err != nil {\n\t\treturn\n\t}\n\tif pk.e.bytes, pk.e.bitLength, err = readMPI(r); err != nil {\n\t\treturn\n\t}\n\n\t// RFC 4880 Section 12.2 requires the low 8 bytes of the\n\t// modulus to form the key id.\n\tif len(pk.n.bytes) < 8 {\n\t\treturn errors.StructuralError(\"v3 public key modulus is too short\")\n\t}\n\tif len(pk.e.bytes) > 3 {\n\t\terr = errors.UnsupportedError(\"large public exponent\")\n\t\treturn\n\t}\n\trsa := &rsa.PublicKey{N: new(big.Int).SetBytes(pk.n.bytes)}\n\tfor i := 0; i < len(pk.e.bytes); i++ {\n\t\trsa.E <<= 8\n\t\trsa.E |= int(pk.e.bytes[i])\n\t}\n\tpk.PublicKey = rsa\n\treturn\n}\n\n// SerializeSignaturePrefix writes the prefix for this public key to the given Writer.\n// The prefix is used when calculating a signature over this public key. See\n// RFC 4880, section 5.2.4.\nfunc (pk *PublicKeyV3) SerializeSignaturePrefix(w io.Writer) {\n\tvar pLength uint16\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tpLength += 2 + uint16(len(pk.n.bytes))\n\t\tpLength += 2 + uint16(len(pk.e.bytes))\n\tdefault:\n\t\tpanic(\"unknown public key algorithm\")\n\t}\n\tpLength += 6\n\tw.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)})\n\treturn\n}\n\nfunc (pk *PublicKeyV3) Serialize(w io.Writer) (err error) {\n\tlength := 8 // 8 byte header\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tlength += 2 + len(pk.n.bytes)\n\t\tlength += 2 + len(pk.e.bytes)\n\tdefault:\n\t\tpanic(\"unknown public key algorithm\")\n\t}\n\n\tpacketType := packetTypePublicKey\n\tif pk.IsSubkey {\n\t\tpacketType = packetTypePublicSubkey\n\t}\n\tif err = serializeHeader(w, packetType, length); err != nil {\n\t\treturn\n\t}\n\treturn pk.serializeWithoutHeaders(w)\n}\n\n// serializeWithoutHeaders marshals the PublicKey to w in the form of an\n// OpenPGP public key packet, not including the packet header.\nfunc (pk *PublicKeyV3) serializeWithoutHeaders(w io.Writer) (err error) {\n\tvar buf [8]byte\n\t// Version 3\n\tbuf[0] = 3\n\t// Creation time\n\tt := uint32(pk.CreationTime.Unix())\n\tbuf[1] = byte(t >> 24)\n\tbuf[2] = byte(t >> 16)\n\tbuf[3] = byte(t >> 8)\n\tbuf[4] = byte(t)\n\t// Days to expire\n\tbuf[5] = byte(pk.DaysToExpire >> 8)\n\tbuf[6] = byte(pk.DaysToExpire)\n\t// Public key algorithm\n\tbuf[7] = byte(pk.PubKeyAlgo)\n\n\tif _, err = w.Write(buf[:]); err != nil {\n\t\treturn\n\t}\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\treturn writeMPIs(w, pk.n, pk.e)\n\t}\n\treturn errors.InvalidArgumentError(\"bad public-key algorithm\")\n}\n\n// CanSign returns true iff this public key can generate signatures\nfunc (pk *PublicKeyV3) CanSign() bool {\n\treturn pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly\n}\n\n// VerifySignatureV3 returns nil iff sig is a valid signature, made by this\n// public key, of the data hashed into signed. signed is mutated by this call.\nfunc (pk *PublicKeyV3) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err error) {\n\tif !pk.CanSign() {\n\t\treturn errors.InvalidArgumentError(\"public key cannot generate signatures\")\n\t}\n\n\tsuffix := make([]byte, 5)\n\tsuffix[0] = byte(sig.SigType)\n\tbinary.BigEndian.PutUint32(suffix[1:], uint32(sig.CreationTime.Unix()))\n\tsigned.Write(suffix)\n\thashBytes := signed.Sum(nil)\n\n\tif hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] {\n\t\treturn errors.SignatureError(\"hash tag doesn't match\")\n\t}\n\n\tif pk.PubKeyAlgo != sig.PubKeyAlgo {\n\t\treturn errors.InvalidArgumentError(\"public key and signature use different algorithms\")\n\t}\n\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\tif err = rsa.VerifyPKCS1v15(pk.PublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil {\n\t\t\treturn errors.SignatureError(\"RSA verification failure\")\n\t\t}\n\t\treturn\n\tdefault:\n\t\t// V3 public keys only support RSA.\n\t\tpanic(\"shouldn't happen\")\n\t}\n}\n\n// VerifyUserIdSignatureV3 returns nil iff sig is a valid signature, made by this\n// public key, that id is the identity of pub.\nfunc (pk *PublicKeyV3) VerifyUserIdSignatureV3(id string, pub *PublicKeyV3, sig *SignatureV3) (err error) {\n\th, err := userIdSignatureV3Hash(id, pk, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignatureV3(h, sig)\n}\n\n// VerifyKeySignatureV3 returns nil iff sig is a valid signature, made by this\n// public key, of signed.\nfunc (pk *PublicKeyV3) VerifyKeySignatureV3(signed *PublicKeyV3, sig *SignatureV3) (err error) {\n\th, err := keySignatureHash(pk, signed, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn pk.VerifySignatureV3(h, sig)\n}\n\n// userIdSignatureV3Hash returns a Hash of the message that needs to be signed\n// to assert that pk is a valid key for id.\nfunc userIdSignatureV3Hash(id string, pk signingKey, hfn crypto.Hash) (h hash.Hash, err error) {\n\tif !hfn.Available() {\n\t\treturn nil, errors.UnsupportedError(\"hash function\")\n\t}\n\th = hfn.New()\n\n\t// RFC 4880, section 5.2.4\n\tpk.SerializeSignaturePrefix(h)\n\tpk.serializeWithoutHeaders(h)\n\n\th.Write([]byte(id))\n\n\treturn\n}\n\n// KeyIdString returns the public key's fingerprint in capital hex\n// (e.g. \"6C7EE1B8621CC013\").\nfunc (pk *PublicKeyV3) KeyIdString() string {\n\treturn fmt.Sprintf(\"%X\", pk.KeyId)\n}\n\n// KeyIdShortString returns the short form of public key's fingerprint\n// in capital hex, as shown by gpg --list-keys (e.g. \"621CC013\").\nfunc (pk *PublicKeyV3) KeyIdShortString() string {\n\treturn fmt.Sprintf(\"%X\", pk.KeyId&0xFFFFFFFF)\n}\n\n// BitLength returns the bit length for the given public key.\nfunc (pk *PublicKeyV3) BitLength() (bitLength uint16, err error) {\n\tswitch pk.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly:\n\t\tbitLength = pk.n.bitLength\n\tdefault:\n\t\terr = errors.InvalidArgumentError(\"bad public-key algorithm\")\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/reader.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"io\"\n)\n\n// Reader reads packets from an io.Reader and allows packets to be 'unread' so\n// that they result from the next call to Next.\ntype Reader struct {\n\tq       []Packet\n\treaders []io.Reader\n}\n\n// New io.Readers are pushed when a compressed or encrypted packet is processed\n// and recursively treated as a new source of packets. However, a carefully\n// crafted packet can trigger an infinite recursive sequence of packets. See\n// http://mumble.net/~campbell/misc/pgp-quine\n// https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-4402\n// This constant limits the number of recursive packets that may be pushed.\nconst maxReaders = 32\n\n// Next returns the most recently unread Packet, or reads another packet from\n// the top-most io.Reader. Unknown packet types are skipped.\nfunc (r *Reader) Next() (p Packet, err error) {\n\tif len(r.q) > 0 {\n\t\tp = r.q[len(r.q)-1]\n\t\tr.q = r.q[:len(r.q)-1]\n\t\treturn\n\t}\n\n\tfor len(r.readers) > 0 {\n\t\tp, err = Read(r.readers[len(r.readers)-1])\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\t\tif err == io.EOF {\n\t\t\tr.readers = r.readers[:len(r.readers)-1]\n\t\t\tcontinue\n\t\t}\n\t\tif _, ok := err.(errors.UnknownPacketTypeError); !ok {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn nil, io.EOF\n}\n\n// Push causes the Reader to start reading from a new io.Reader. When an EOF\n// error is seen from the new io.Reader, it is popped and the Reader continues\n// to read from the next most recent io.Reader. Push returns a StructuralError\n// if pushing the reader would exceed the maximum recursion level, otherwise it\n// returns nil.\nfunc (r *Reader) Push(reader io.Reader) (err error) {\n\tif len(r.readers) >= maxReaders {\n\t\treturn errors.StructuralError(\"too many layers of packets\")\n\t}\n\tr.readers = append(r.readers, reader)\n\treturn nil\n}\n\n// Unread causes the given Packet to be returned from the next call to Next.\nfunc (r *Reader) Unread(p Packet) {\n\tr.q = append(r.q, p)\n}\n\nfunc NewReader(r io.Reader) *Reader {\n\treturn &Reader{\n\t\tq:       nil,\n\t\treaders: []io.Reader{r},\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/signature.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/dsa\"\n\t\"crypto/ecdsa\"\n\t\"encoding/asn1\"\n\t\"encoding/binary\"\n\t\"hash\"\n\t\"io\"\n\t\"math/big\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/s2k\"\n)\n\nconst (\n\t// See RFC 4880, section 5.2.3.21 for details.\n\tKeyFlagCertify = 1 << iota\n\tKeyFlagSign\n\tKeyFlagEncryptCommunications\n\tKeyFlagEncryptStorage\n)\n\n// Signature represents a signature. See RFC 4880, section 5.2.\ntype Signature struct {\n\tSigType    SignatureType\n\tPubKeyAlgo PublicKeyAlgorithm\n\tHash       crypto.Hash\n\n\t// HashSuffix is extra data that is hashed in after the signed data.\n\tHashSuffix []byte\n\t// HashTag contains the first two bytes of the hash for fast rejection\n\t// of bad signed data.\n\tHashTag      [2]byte\n\tCreationTime time.Time\n\n\tRSASignature         parsedMPI\n\tDSASigR, DSASigS     parsedMPI\n\tECDSASigR, ECDSASigS parsedMPI\n\n\t// rawSubpackets contains the unparsed subpackets, in order.\n\trawSubpackets []outputSubpacket\n\n\t// The following are optional so are nil when not included in the\n\t// signature.\n\n\tSigLifetimeSecs, KeyLifetimeSecs                        *uint32\n\tPreferredSymmetric, PreferredHash, PreferredCompression []uint8\n\tIssuerKeyId                                             *uint64\n\tIsPrimaryId                                             *bool\n\n\t// FlagsValid is set if any flags were given. See RFC 4880, section\n\t// 5.2.3.21 for details.\n\tFlagsValid                                                           bool\n\tFlagCertify, FlagSign, FlagEncryptCommunications, FlagEncryptStorage bool\n\n\t// RevocationReason is set if this signature has been revoked.\n\t// See RFC 4880, section 5.2.3.23 for details.\n\tRevocationReason     *uint8\n\tRevocationReasonText string\n\n\t// MDC is set if this signature has a feature packet that indicates\n\t// support for MDC subpackets.\n\tMDC bool\n\n\t// EmbeddedSignature, if non-nil, is a signature of the parent key, by\n\t// this key. This prevents an attacker from claiming another's signing\n\t// subkey as their own.\n\tEmbeddedSignature *Signature\n\n\toutSubpackets []outputSubpacket\n}\n\nfunc (sig *Signature) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.2.3\n\tvar buf [5]byte\n\t_, err = readFull(r, buf[:1])\n\tif err != nil {\n\t\treturn\n\t}\n\tif buf[0] != 4 {\n\t\terr = errors.UnsupportedError(\"signature packet version \" + strconv.Itoa(int(buf[0])))\n\t\treturn\n\t}\n\n\t_, err = readFull(r, buf[:5])\n\tif err != nil {\n\t\treturn\n\t}\n\tsig.SigType = SignatureType(buf[0])\n\tsig.PubKeyAlgo = PublicKeyAlgorithm(buf[1])\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA:\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key algorithm \" + strconv.Itoa(int(sig.PubKeyAlgo)))\n\t\treturn\n\t}\n\n\tvar ok bool\n\tsig.Hash, ok = s2k.HashIdToHash(buf[2])\n\tif !ok {\n\t\treturn errors.UnsupportedError(\"hash function \" + strconv.Itoa(int(buf[2])))\n\t}\n\n\thashedSubpacketsLength := int(buf[3])<<8 | int(buf[4])\n\tl := 6 + hashedSubpacketsLength\n\tsig.HashSuffix = make([]byte, l+6)\n\tsig.HashSuffix[0] = 4\n\tcopy(sig.HashSuffix[1:], buf[:5])\n\thashedSubpackets := sig.HashSuffix[6:l]\n\t_, err = readFull(r, hashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\t// See RFC 4880, section 5.2.4\n\ttrailer := sig.HashSuffix[l:]\n\ttrailer[0] = 4\n\ttrailer[1] = 0xff\n\ttrailer[2] = uint8(l >> 24)\n\ttrailer[3] = uint8(l >> 16)\n\ttrailer[4] = uint8(l >> 8)\n\ttrailer[5] = uint8(l)\n\n\terr = parseSignatureSubpackets(sig, hashedSubpackets, true)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = readFull(r, buf[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\tunhashedSubpacketsLength := int(buf[0])<<8 | int(buf[1])\n\tunhashedSubpackets := make([]byte, unhashedSubpacketsLength)\n\t_, err = readFull(r, unhashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = parseSignatureSubpackets(sig, unhashedSubpackets, false)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = readFull(r, sig.HashTag[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\tsig.RSASignature.bytes, sig.RSASignature.bitLength, err = readMPI(r)\n\tcase PubKeyAlgoDSA:\n\t\tsig.DSASigR.bytes, sig.DSASigR.bitLength, err = readMPI(r)\n\t\tif err == nil {\n\t\t\tsig.DSASigS.bytes, sig.DSASigS.bitLength, err = readMPI(r)\n\t\t}\n\tcase PubKeyAlgoECDSA:\n\t\tsig.ECDSASigR.bytes, sig.ECDSASigR.bitLength, err = readMPI(r)\n\t\tif err == nil {\n\t\t\tsig.ECDSASigS.bytes, sig.ECDSASigS.bitLength, err = readMPI(r)\n\t\t}\n\tdefault:\n\t\tpanic(\"unreachable\")\n\t}\n\treturn\n}\n\n// parseSignatureSubpackets parses subpackets of the main signature packet. See\n// RFC 4880, section 5.2.3.1.\nfunc parseSignatureSubpackets(sig *Signature, subpackets []byte, isHashed bool) (err error) {\n\tfor len(subpackets) > 0 {\n\t\tsubpackets, err = parseSignatureSubpacket(sig, subpackets, isHashed)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif sig.CreationTime.IsZero() {\n\t\terr = errors.StructuralError(\"no creation time in signature\")\n\t}\n\n\treturn\n}\n\ntype signatureSubpacketType uint8\n\nconst (\n\tcreationTimeSubpacket        signatureSubpacketType = 2\n\tsignatureExpirationSubpacket signatureSubpacketType = 3\n\tkeyExpirationSubpacket       signatureSubpacketType = 9\n\tprefSymmetricAlgosSubpacket  signatureSubpacketType = 11\n\tissuerSubpacket              signatureSubpacketType = 16\n\tprefHashAlgosSubpacket       signatureSubpacketType = 21\n\tprefCompressionSubpacket     signatureSubpacketType = 22\n\tprimaryUserIdSubpacket       signatureSubpacketType = 25\n\tkeyFlagsSubpacket            signatureSubpacketType = 27\n\treasonForRevocationSubpacket signatureSubpacketType = 29\n\tfeaturesSubpacket            signatureSubpacketType = 30\n\tembeddedSignatureSubpacket   signatureSubpacketType = 32\n)\n\n// parseSignatureSubpacket parses a single subpacket. len(subpacket) is >= 1.\nfunc parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (rest []byte, err error) {\n\t// RFC 4880, section 5.2.3.1\n\tvar (\n\t\tlength     uint32\n\t\tpacketType signatureSubpacketType\n\t\tisCritical bool\n\t)\n\tswitch {\n\tcase subpacket[0] < 192:\n\t\tlength = uint32(subpacket[0])\n\t\tsubpacket = subpacket[1:]\n\tcase subpacket[0] < 255:\n\t\tif len(subpacket) < 2 {\n\t\t\tgoto Truncated\n\t\t}\n\t\tlength = uint32(subpacket[0]-192)<<8 + uint32(subpacket[1]) + 192\n\t\tsubpacket = subpacket[2:]\n\tdefault:\n\t\tif len(subpacket) < 5 {\n\t\t\tgoto Truncated\n\t\t}\n\t\tlength = uint32(subpacket[1])<<24 |\n\t\t\tuint32(subpacket[2])<<16 |\n\t\t\tuint32(subpacket[3])<<8 |\n\t\t\tuint32(subpacket[4])\n\t\tsubpacket = subpacket[5:]\n\t}\n\tif length > uint32(len(subpacket)) {\n\t\tgoto Truncated\n\t}\n\trest = subpacket[length:]\n\tsubpacket = subpacket[:length]\n\tif len(subpacket) == 0 {\n\t\terr = errors.StructuralError(\"zero length signature subpacket\")\n\t\treturn\n\t}\n\tpacketType = signatureSubpacketType(subpacket[0] & 0x7f)\n\tisCritical = subpacket[0]&0x80 == 0x80\n\tsubpacket = subpacket[1:]\n\tsig.rawSubpackets = append(sig.rawSubpackets, outputSubpacket{isHashed, packetType, isCritical, subpacket})\n\tswitch packetType {\n\tcase creationTimeSubpacket:\n\t\tif !isHashed {\n\t\t\terr = errors.StructuralError(\"signature creation time in non-hashed area\")\n\t\t\treturn\n\t\t}\n\t\tif len(subpacket) != 4 {\n\t\t\terr = errors.StructuralError(\"signature creation time not four bytes\")\n\t\t\treturn\n\t\t}\n\t\tt := binary.BigEndian.Uint32(subpacket)\n\t\tsig.CreationTime = time.Unix(int64(t), 0)\n\tcase signatureExpirationSubpacket:\n\t\t// Signature expiration time, section 5.2.3.10\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tif len(subpacket) != 4 {\n\t\t\terr = errors.StructuralError(\"expiration subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tsig.SigLifetimeSecs = new(uint32)\n\t\t*sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket)\n\tcase keyExpirationSubpacket:\n\t\t// Key expiration time, section 5.2.3.6\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tif len(subpacket) != 4 {\n\t\t\terr = errors.StructuralError(\"key expiration subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tsig.KeyLifetimeSecs = new(uint32)\n\t\t*sig.KeyLifetimeSecs = binary.BigEndian.Uint32(subpacket)\n\tcase prefSymmetricAlgosSubpacket:\n\t\t// Preferred symmetric algorithms, section 5.2.3.7\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tsig.PreferredSymmetric = make([]byte, len(subpacket))\n\t\tcopy(sig.PreferredSymmetric, subpacket)\n\tcase issuerSubpacket:\n\t\t// Issuer, section 5.2.3.5\n\t\tif len(subpacket) != 8 {\n\t\t\terr = errors.StructuralError(\"issuer subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tsig.IssuerKeyId = new(uint64)\n\t\t*sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket)\n\tcase prefHashAlgosSubpacket:\n\t\t// Preferred hash algorithms, section 5.2.3.8\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tsig.PreferredHash = make([]byte, len(subpacket))\n\t\tcopy(sig.PreferredHash, subpacket)\n\tcase prefCompressionSubpacket:\n\t\t// Preferred compression algorithms, section 5.2.3.9\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tsig.PreferredCompression = make([]byte, len(subpacket))\n\t\tcopy(sig.PreferredCompression, subpacket)\n\tcase primaryUserIdSubpacket:\n\t\t// Primary User ID, section 5.2.3.19\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tif len(subpacket) != 1 {\n\t\t\terr = errors.StructuralError(\"primary user id subpacket with bad length\")\n\t\t\treturn\n\t\t}\n\t\tsig.IsPrimaryId = new(bool)\n\t\tif subpacket[0] > 0 {\n\t\t\t*sig.IsPrimaryId = true\n\t\t}\n\tcase keyFlagsSubpacket:\n\t\t// Key flags, section 5.2.3.21\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tif len(subpacket) == 0 {\n\t\t\terr = errors.StructuralError(\"empty key flags subpacket\")\n\t\t\treturn\n\t\t}\n\t\tsig.FlagsValid = true\n\t\tif subpacket[0]&KeyFlagCertify != 0 {\n\t\t\tsig.FlagCertify = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagSign != 0 {\n\t\t\tsig.FlagSign = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagEncryptCommunications != 0 {\n\t\t\tsig.FlagEncryptCommunications = true\n\t\t}\n\t\tif subpacket[0]&KeyFlagEncryptStorage != 0 {\n\t\t\tsig.FlagEncryptStorage = true\n\t\t}\n\tcase reasonForRevocationSubpacket:\n\t\t// Reason For Revocation, section 5.2.3.23\n\t\tif !isHashed {\n\t\t\treturn\n\t\t}\n\t\tif len(subpacket) == 0 {\n\t\t\terr = errors.StructuralError(\"empty revocation reason subpacket\")\n\t\t\treturn\n\t\t}\n\t\tsig.RevocationReason = new(uint8)\n\t\t*sig.RevocationReason = subpacket[0]\n\t\tsig.RevocationReasonText = string(subpacket[1:])\n\tcase featuresSubpacket:\n\t\t// Features subpacket, section 5.2.3.24 specifies a very general\n\t\t// mechanism for OpenPGP implementations to signal support for new\n\t\t// features. In practice, the subpacket is used exclusively to\n\t\t// indicate support for MDC-protected encryption.\n\t\tsig.MDC = len(subpacket) >= 1 && subpacket[0]&1 == 1\n\tcase embeddedSignatureSubpacket:\n\t\t// Only usage is in signatures that cross-certify\n\t\t// signing subkeys. section 5.2.3.26 describes the\n\t\t// format, with its usage described in section 11.1\n\t\tif sig.EmbeddedSignature != nil {\n\t\t\terr = errors.StructuralError(\"Cannot have multiple embedded signatures\")\n\t\t\treturn\n\t\t}\n\t\tsig.EmbeddedSignature = new(Signature)\n\t\t// Embedded signatures are required to be v4 signatures see\n\t\t// section 12.1. However, we only parse v4 signatures in this\n\t\t// file anyway.\n\t\tif err := sig.EmbeddedSignature.parse(bytes.NewBuffer(subpacket)); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif sigType := sig.EmbeddedSignature.SigType; sigType != SigTypePrimaryKeyBinding {\n\t\t\treturn nil, errors.StructuralError(\"cross-signature has unexpected type \" + strconv.Itoa(int(sigType)))\n\t\t}\n\tdefault:\n\t\tif isCritical {\n\t\t\terr = errors.UnsupportedError(\"unknown critical signature subpacket type \" + strconv.Itoa(int(packetType)))\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n\nTruncated:\n\terr = errors.StructuralError(\"signature subpacket truncated\")\n\treturn\n}\n\n// subpacketLengthLength returns the length, in bytes, of an encoded length value.\nfunc subpacketLengthLength(length int) int {\n\tif length < 192 {\n\t\treturn 1\n\t}\n\tif length < 16320 {\n\t\treturn 2\n\t}\n\treturn 5\n}\n\n// serializeSubpacketLength marshals the given length into to.\nfunc serializeSubpacketLength(to []byte, length int) int {\n\t// RFC 4880, Section 4.2.2.\n\tif length < 192 {\n\t\tto[0] = byte(length)\n\t\treturn 1\n\t}\n\tif length < 16320 {\n\t\tlength -= 192\n\t\tto[0] = byte((length >> 8) + 192)\n\t\tto[1] = byte(length)\n\t\treturn 2\n\t}\n\tto[0] = 255\n\tto[1] = byte(length >> 24)\n\tto[2] = byte(length >> 16)\n\tto[3] = byte(length >> 8)\n\tto[4] = byte(length)\n\treturn 5\n}\n\n// subpacketsLength returns the serialized length, in bytes, of the given\n// subpackets.\nfunc subpacketsLength(subpackets []outputSubpacket, hashed bool) (length int) {\n\tfor _, subpacket := range subpackets {\n\t\tif subpacket.hashed == hashed {\n\t\t\tlength += subpacketLengthLength(len(subpacket.contents) + 1)\n\t\t\tlength += 1 // type byte\n\t\t\tlength += len(subpacket.contents)\n\t\t}\n\t}\n\treturn\n}\n\n// serializeSubpackets marshals the given subpackets into to.\nfunc serializeSubpackets(to []byte, subpackets []outputSubpacket, hashed bool) {\n\tfor _, subpacket := range subpackets {\n\t\tif subpacket.hashed == hashed {\n\t\t\tn := serializeSubpacketLength(to, len(subpacket.contents)+1)\n\t\t\tto[n] = byte(subpacket.subpacketType)\n\t\t\tto = to[1+n:]\n\t\t\tn = copy(to, subpacket.contents)\n\t\t\tto = to[n:]\n\t\t}\n\t}\n\treturn\n}\n\n// KeyExpired returns whether sig is a self-signature of a key that has\n// expired.\nfunc (sig *Signature) KeyExpired(currentTime time.Time) bool {\n\tif sig.KeyLifetimeSecs == nil {\n\t\treturn false\n\t}\n\texpiry := sig.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second)\n\treturn currentTime.After(expiry)\n}\n\n// buildHashSuffix constructs the HashSuffix member of sig in preparation for signing.\nfunc (sig *Signature) buildHashSuffix() (err error) {\n\thashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true)\n\n\tvar ok bool\n\tl := 6 + hashedSubpacketsLen\n\tsig.HashSuffix = make([]byte, l+6)\n\tsig.HashSuffix[0] = 4\n\tsig.HashSuffix[1] = uint8(sig.SigType)\n\tsig.HashSuffix[2] = uint8(sig.PubKeyAlgo)\n\tsig.HashSuffix[3], ok = s2k.HashToHashId(sig.Hash)\n\tif !ok {\n\t\tsig.HashSuffix = nil\n\t\treturn errors.InvalidArgumentError(\"hash cannot be represented in OpenPGP: \" + strconv.Itoa(int(sig.Hash)))\n\t}\n\tsig.HashSuffix[4] = byte(hashedSubpacketsLen >> 8)\n\tsig.HashSuffix[5] = byte(hashedSubpacketsLen)\n\tserializeSubpackets(sig.HashSuffix[6:l], sig.outSubpackets, true)\n\ttrailer := sig.HashSuffix[l:]\n\ttrailer[0] = 4\n\ttrailer[1] = 0xff\n\ttrailer[2] = byte(l >> 24)\n\ttrailer[3] = byte(l >> 16)\n\ttrailer[4] = byte(l >> 8)\n\ttrailer[5] = byte(l)\n\treturn\n}\n\nfunc (sig *Signature) signPrepareHash(h hash.Hash) (digest []byte, err error) {\n\terr = sig.buildHashSuffix()\n\tif err != nil {\n\t\treturn\n\t}\n\n\th.Write(sig.HashSuffix)\n\tdigest = h.Sum(nil)\n\tcopy(sig.HashTag[:], digest)\n\treturn\n}\n\n// Sign signs a message with a private key. The hash, h, must contain\n// the hash of the message to be signed and will be mutated by this function.\n// On success, the signature is stored in sig. Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err error) {\n\tsig.outSubpackets = sig.buildSubpackets()\n\tdigest, err := sig.signPrepareHash(h)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tswitch priv.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\t// supports both *rsa.PrivateKey and crypto.Signer\n\t\tsig.RSASignature.bytes, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash)\n\t\tsig.RSASignature.bitLength = uint16(8 * len(sig.RSASignature.bytes))\n\tcase PubKeyAlgoDSA:\n\t\tdsaPriv := priv.PrivateKey.(*dsa.PrivateKey)\n\n\t\t// Need to truncate hashBytes to match FIPS 186-3 section 4.6.\n\t\tsubgroupSize := (dsaPriv.Q.BitLen() + 7) / 8\n\t\tif len(digest) > subgroupSize {\n\t\t\tdigest = digest[:subgroupSize]\n\t\t}\n\t\tr, s, err := dsa.Sign(config.Random(), dsaPriv, digest)\n\t\tif err == nil {\n\t\t\tsig.DSASigR.bytes = r.Bytes()\n\t\t\tsig.DSASigR.bitLength = uint16(8 * len(sig.DSASigR.bytes))\n\t\t\tsig.DSASigS.bytes = s.Bytes()\n\t\t\tsig.DSASigS.bitLength = uint16(8 * len(sig.DSASigS.bytes))\n\t\t}\n\tcase PubKeyAlgoECDSA:\n\t\tvar r, s *big.Int\n\t\tif pk, ok := priv.PrivateKey.(*ecdsa.PrivateKey); ok {\n\t\t\t// direct support, avoid asn1 wrapping/unwrapping\n\t\t\tr, s, err = ecdsa.Sign(config.Random(), pk, digest)\n\t\t} else {\n\t\t\tvar b []byte\n\t\t\tb, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, nil)\n\t\t\tif err == nil {\n\t\t\t\tr, s, err = unwrapECDSASig(b)\n\t\t\t}\n\t\t}\n\t\tif err == nil {\n\t\t\tsig.ECDSASigR = fromBig(r)\n\t\t\tsig.ECDSASigS = fromBig(s)\n\t\t}\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key algorithm: \" + strconv.Itoa(int(sig.PubKeyAlgo)))\n\t}\n\n\treturn\n}\n\n// unwrapECDSASig parses the two integer components of an ASN.1-encoded ECDSA\n// signature.\nfunc unwrapECDSASig(b []byte) (r, s *big.Int, err error) {\n\tvar ecsdaSig struct {\n\t\tR, S *big.Int\n\t}\n\t_, err = asn1.Unmarshal(b, &ecsdaSig)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn ecsdaSig.R, ecsdaSig.S, nil\n}\n\n// SignUserId computes a signature from priv, asserting that pub is a valid\n// key for the identity id.  On success, the signature is stored in sig. Call\n// Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) SignUserId(id string, pub *PublicKey, priv *PrivateKey, config *Config) error {\n\th, err := userIdSignatureHash(id, pub, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn sig.Sign(h, priv, config)\n}\n\n// SignKey computes a signature from priv, asserting that pub is a subkey. On\n// success, the signature is stored in sig. Call Serialize to write it out.\n// If config is nil, sensible defaults will be used.\nfunc (sig *Signature) SignKey(pub *PublicKey, priv *PrivateKey, config *Config) error {\n\th, err := keySignatureHash(&priv.PublicKey, pub, sig.Hash)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn sig.Sign(h, priv, config)\n}\n\n// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been\n// called first.\nfunc (sig *Signature) Serialize(w io.Writer) (err error) {\n\tif len(sig.outSubpackets) == 0 {\n\t\tsig.outSubpackets = sig.rawSubpackets\n\t}\n\tif sig.RSASignature.bytes == nil && sig.DSASigR.bytes == nil && sig.ECDSASigR.bytes == nil {\n\t\treturn errors.InvalidArgumentError(\"Signature: need to call Sign, SignUserId or SignKey before Serialize\")\n\t}\n\n\tsigLength := 0\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\tsigLength = 2 + len(sig.RSASignature.bytes)\n\tcase PubKeyAlgoDSA:\n\t\tsigLength = 2 + len(sig.DSASigR.bytes)\n\t\tsigLength += 2 + len(sig.DSASigS.bytes)\n\tcase PubKeyAlgoECDSA:\n\t\tsigLength = 2 + len(sig.ECDSASigR.bytes)\n\t\tsigLength += 2 + len(sig.ECDSASigS.bytes)\n\tdefault:\n\t\tpanic(\"impossible\")\n\t}\n\n\tunhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false)\n\tlength := len(sig.HashSuffix) - 6 /* trailer not included */ +\n\t\t2 /* length of unhashed subpackets */ + unhashedSubpacketsLen +\n\t\t2 /* hash tag */ + sigLength\n\terr = serializeHeader(w, packetTypeSignature, length)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = w.Write(sig.HashSuffix[:len(sig.HashSuffix)-6])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tunhashedSubpackets := make([]byte, 2+unhashedSubpacketsLen)\n\tunhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 8)\n\tunhashedSubpackets[1] = byte(unhashedSubpacketsLen)\n\tserializeSubpackets(unhashedSubpackets[2:], sig.outSubpackets, false)\n\n\t_, err = w.Write(unhashedSubpackets)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(sig.HashTag[:])\n\tif err != nil {\n\t\treturn\n\t}\n\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\terr = writeMPIs(w, sig.RSASignature)\n\tcase PubKeyAlgoDSA:\n\t\terr = writeMPIs(w, sig.DSASigR, sig.DSASigS)\n\tcase PubKeyAlgoECDSA:\n\t\terr = writeMPIs(w, sig.ECDSASigR, sig.ECDSASigS)\n\tdefault:\n\t\tpanic(\"impossible\")\n\t}\n\treturn\n}\n\n// outputSubpacket represents a subpacket to be marshaled.\ntype outputSubpacket struct {\n\thashed        bool // true if this subpacket is in the hashed area.\n\tsubpacketType signatureSubpacketType\n\tisCritical    bool\n\tcontents      []byte\n}\n\nfunc (sig *Signature) buildSubpackets() (subpackets []outputSubpacket) {\n\tcreationTime := make([]byte, 4)\n\tbinary.BigEndian.PutUint32(creationTime, uint32(sig.CreationTime.Unix()))\n\tsubpackets = append(subpackets, outputSubpacket{true, creationTimeSubpacket, false, creationTime})\n\n\tif sig.IssuerKeyId != nil {\n\t\tkeyId := make([]byte, 8)\n\t\tbinary.BigEndian.PutUint64(keyId, *sig.IssuerKeyId)\n\t\tsubpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, false, keyId})\n\t}\n\n\tif sig.SigLifetimeSecs != nil && *sig.SigLifetimeSecs != 0 {\n\t\tsigLifetime := make([]byte, 4)\n\t\tbinary.BigEndian.PutUint32(sigLifetime, *sig.SigLifetimeSecs)\n\t\tsubpackets = append(subpackets, outputSubpacket{true, signatureExpirationSubpacket, true, sigLifetime})\n\t}\n\n\t// Key flags may only appear in self-signatures or certification signatures.\n\n\tif sig.FlagsValid {\n\t\tvar flags byte\n\t\tif sig.FlagCertify {\n\t\t\tflags |= KeyFlagCertify\n\t\t}\n\t\tif sig.FlagSign {\n\t\t\tflags |= KeyFlagSign\n\t\t}\n\t\tif sig.FlagEncryptCommunications {\n\t\t\tflags |= KeyFlagEncryptCommunications\n\t\t}\n\t\tif sig.FlagEncryptStorage {\n\t\t\tflags |= KeyFlagEncryptStorage\n\t\t}\n\t\tsubpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, false, []byte{flags}})\n\t}\n\n\t// The following subpackets may only appear in self-signatures\n\n\tif sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 {\n\t\tkeyLifetime := make([]byte, 4)\n\t\tbinary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs)\n\t\tsubpackets = append(subpackets, outputSubpacket{true, keyExpirationSubpacket, true, keyLifetime})\n\t}\n\n\tif sig.IsPrimaryId != nil && *sig.IsPrimaryId {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, primaryUserIdSubpacket, false, []byte{1}})\n\t}\n\n\tif len(sig.PreferredSymmetric) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefSymmetricAlgosSubpacket, false, sig.PreferredSymmetric})\n\t}\n\n\tif len(sig.PreferredHash) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefHashAlgosSubpacket, false, sig.PreferredHash})\n\t}\n\n\tif len(sig.PreferredCompression) > 0 {\n\t\tsubpackets = append(subpackets, outputSubpacket{true, prefCompressionSubpacket, false, sig.PreferredCompression})\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/s2k\"\n)\n\n// SignatureV3 represents older version 3 signatures. These signatures are less secure\n// than version 4 and should not be used to create new signatures. They are included\n// here for backwards compatibility to read and validate with older key material.\n// See RFC 4880, section 5.2.2.\ntype SignatureV3 struct {\n\tSigType      SignatureType\n\tCreationTime time.Time\n\tIssuerKeyId  uint64\n\tPubKeyAlgo   PublicKeyAlgorithm\n\tHash         crypto.Hash\n\tHashTag      [2]byte\n\n\tRSASignature     parsedMPI\n\tDSASigR, DSASigS parsedMPI\n}\n\nfunc (sig *SignatureV3) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.2.2\n\tvar buf [8]byte\n\tif _, err = readFull(r, buf[:1]); err != nil {\n\t\treturn\n\t}\n\tif buf[0] < 2 || buf[0] > 3 {\n\t\terr = errors.UnsupportedError(\"signature packet version \" + strconv.Itoa(int(buf[0])))\n\t\treturn\n\t}\n\tif _, err = readFull(r, buf[:1]); err != nil {\n\t\treturn\n\t}\n\tif buf[0] != 5 {\n\t\terr = errors.UnsupportedError(\n\t\t\t\"invalid hashed material length \" + strconv.Itoa(int(buf[0])))\n\t\treturn\n\t}\n\n\t// Read hashed material: signature type + creation time\n\tif _, err = readFull(r, buf[:5]); err != nil {\n\t\treturn\n\t}\n\tsig.SigType = SignatureType(buf[0])\n\tt := binary.BigEndian.Uint32(buf[1:5])\n\tsig.CreationTime = time.Unix(int64(t), 0)\n\n\t// Eight-octet Key ID of signer.\n\tif _, err = readFull(r, buf[:8]); err != nil {\n\t\treturn\n\t}\n\tsig.IssuerKeyId = binary.BigEndian.Uint64(buf[:])\n\n\t// Public-key and hash algorithm\n\tif _, err = readFull(r, buf[:2]); err != nil {\n\t\treturn\n\t}\n\tsig.PubKeyAlgo = PublicKeyAlgorithm(buf[0])\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA:\n\tdefault:\n\t\terr = errors.UnsupportedError(\"public key algorithm \" + strconv.Itoa(int(sig.PubKeyAlgo)))\n\t\treturn\n\t}\n\tvar ok bool\n\tif sig.Hash, ok = s2k.HashIdToHash(buf[1]); !ok {\n\t\treturn errors.UnsupportedError(\"hash function \" + strconv.Itoa(int(buf[2])))\n\t}\n\n\t// Two-octet field holding left 16 bits of signed hash value.\n\tif _, err = readFull(r, sig.HashTag[:2]); err != nil {\n\t\treturn\n\t}\n\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\tsig.RSASignature.bytes, sig.RSASignature.bitLength, err = readMPI(r)\n\tcase PubKeyAlgoDSA:\n\t\tif sig.DSASigR.bytes, sig.DSASigR.bitLength, err = readMPI(r); err != nil {\n\t\t\treturn\n\t\t}\n\t\tsig.DSASigS.bytes, sig.DSASigS.bitLength, err = readMPI(r)\n\tdefault:\n\t\tpanic(\"unreachable\")\n\t}\n\treturn\n}\n\n// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been\n// called first.\nfunc (sig *SignatureV3) Serialize(w io.Writer) (err error) {\n\tbuf := make([]byte, 8)\n\n\t// Write the sig type and creation time\n\tbuf[0] = byte(sig.SigType)\n\tbinary.BigEndian.PutUint32(buf[1:5], uint32(sig.CreationTime.Unix()))\n\tif _, err = w.Write(buf[:5]); err != nil {\n\t\treturn\n\t}\n\n\t// Write the issuer long key ID\n\tbinary.BigEndian.PutUint64(buf[:8], sig.IssuerKeyId)\n\tif _, err = w.Write(buf[:8]); err != nil {\n\t\treturn\n\t}\n\n\t// Write public key algorithm, hash ID, and hash value\n\tbuf[0] = byte(sig.PubKeyAlgo)\n\thashId, ok := s2k.HashToHashId(sig.Hash)\n\tif !ok {\n\t\treturn errors.UnsupportedError(fmt.Sprintf(\"hash function %v\", sig.Hash))\n\t}\n\tbuf[1] = hashId\n\tcopy(buf[2:4], sig.HashTag[:])\n\tif _, err = w.Write(buf[:4]); err != nil {\n\t\treturn\n\t}\n\n\tif sig.RSASignature.bytes == nil && sig.DSASigR.bytes == nil {\n\t\treturn errors.InvalidArgumentError(\"Signature: need to call Sign, SignUserId or SignKey before Serialize\")\n\t}\n\n\tswitch sig.PubKeyAlgo {\n\tcase PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:\n\t\terr = writeMPIs(w, sig.RSASignature)\n\tcase PubKeyAlgoDSA:\n\t\terr = writeMPIs(w, sig.DSASigR, sig.DSASigS)\n\tdefault:\n\t\tpanic(\"impossible\")\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"crypto/cipher\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/s2k\"\n)\n\n// This is the largest session key that we'll support. Since no 512-bit cipher\n// has even been seriously used, this is comfortably large.\nconst maxSessionKeySizeInBytes = 64\n\n// SymmetricKeyEncrypted represents a passphrase protected session key. See RFC\n// 4880, section 5.3.\ntype SymmetricKeyEncrypted struct {\n\tCipherFunc   CipherFunction\n\ts2k          func(out, in []byte)\n\tencryptedKey []byte\n}\n\nconst symmetricKeyEncryptedVersion = 4\n\nfunc (ske *SymmetricKeyEncrypted) parse(r io.Reader) error {\n\t// RFC 4880, section 5.3.\n\tvar buf [2]byte\n\tif _, err := readFull(r, buf[:]); err != nil {\n\t\treturn err\n\t}\n\tif buf[0] != symmetricKeyEncryptedVersion {\n\t\treturn errors.UnsupportedError(\"SymmetricKeyEncrypted version\")\n\t}\n\tske.CipherFunc = CipherFunction(buf[1])\n\n\tif ske.CipherFunc.KeySize() == 0 {\n\t\treturn errors.UnsupportedError(\"unknown cipher: \" + strconv.Itoa(int(buf[1])))\n\t}\n\n\tvar err error\n\tske.s2k, err = s2k.Parse(r)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tencryptedKey := make([]byte, maxSessionKeySizeInBytes)\n\t// The session key may follow. We just have to try and read to find\n\t// out. If it exists then we limit it to maxSessionKeySizeInBytes.\n\tn, err := readFull(r, encryptedKey)\n\tif err != nil && err != io.ErrUnexpectedEOF {\n\t\treturn err\n\t}\n\n\tif n != 0 {\n\t\tif n == maxSessionKeySizeInBytes {\n\t\t\treturn errors.UnsupportedError(\"oversized encrypted session key\")\n\t\t}\n\t\tske.encryptedKey = encryptedKey[:n]\n\t}\n\n\treturn nil\n}\n\n// Decrypt attempts to decrypt an encrypted session key and returns the key and\n// the cipher to use when decrypting a subsequent Symmetrically Encrypted Data\n// packet.\nfunc (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunction, error) {\n\tkey := make([]byte, ske.CipherFunc.KeySize())\n\tske.s2k(key, passphrase)\n\n\tif len(ske.encryptedKey) == 0 {\n\t\treturn key, ske.CipherFunc, nil\n\t}\n\n\t// the IV is all zeros\n\tiv := make([]byte, ske.CipherFunc.blockSize())\n\tc := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv)\n\tplaintextKey := make([]byte, len(ske.encryptedKey))\n\tc.XORKeyStream(plaintextKey, ske.encryptedKey)\n\tcipherFunc := CipherFunction(plaintextKey[0])\n\tif cipherFunc.blockSize() == 0 {\n\t\treturn nil, ske.CipherFunc, errors.UnsupportedError(\"unknown cipher: \" + strconv.Itoa(int(cipherFunc)))\n\t}\n\tplaintextKey = plaintextKey[1:]\n\tif l, cipherKeySize := len(plaintextKey), cipherFunc.KeySize(); l != cipherFunc.KeySize() {\n\t\treturn nil, cipherFunc, errors.StructuralError(\"length of decrypted key (\" + strconv.Itoa(l) + \") \" +\n\t\t\t\"not equal to cipher keysize (\" + strconv.Itoa(cipherKeySize) + \")\")\n\t}\n\treturn plaintextKey, cipherFunc, nil\n}\n\n// SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w. The\n// packet contains a random session key, encrypted by a key derived from the\n// given passphrase. The session key is returned and must be passed to\n// SerializeSymmetricallyEncrypted.\n// If config is nil, sensible defaults will be used.\nfunc SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Config) (key []byte, err error) {\n\tcipherFunc := config.Cipher()\n\tkeySize := cipherFunc.KeySize()\n\tif keySize == 0 {\n\t\treturn nil, errors.UnsupportedError(\"unknown cipher: \" + strconv.Itoa(int(cipherFunc)))\n\t}\n\n\ts2kBuf := new(bytes.Buffer)\n\tkeyEncryptingKey := make([]byte, keySize)\n\t// s2k.Serialize salts and stretches the passphrase, and writes the\n\t// resulting key to keyEncryptingKey and the s2k descriptor to s2kBuf.\n\terr = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, &s2k.Config{Hash: config.Hash(), S2KCount: config.PasswordHashIterations()})\n\tif err != nil {\n\t\treturn\n\t}\n\ts2kBytes := s2kBuf.Bytes()\n\n\tpacketLength := 2 /* header */ + len(s2kBytes) + 1 /* cipher type */ + keySize\n\terr = serializeHeader(w, packetTypeSymmetricKeyEncrypted, packetLength)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tvar buf [2]byte\n\tbuf[0] = symmetricKeyEncryptedVersion\n\tbuf[1] = byte(cipherFunc)\n\t_, err = w.Write(buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\t_, err = w.Write(s2kBytes)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tsessionKey := make([]byte, keySize)\n\t_, err = io.ReadFull(config.Random(), sessionKey)\n\tif err != nil {\n\t\treturn\n\t}\n\tiv := make([]byte, cipherFunc.blockSize())\n\tc := cipher.NewCFBEncrypter(cipherFunc.new(keyEncryptingKey), iv)\n\tencryptedCipherAndKey := make([]byte, keySize+1)\n\tc.XORKeyStream(encryptedCipherAndKey, buf[1:])\n\tc.XORKeyStream(encryptedCipherAndKey[1:], sessionKey)\n\t_, err = w.Write(encryptedCipherAndKey)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tkey = sessionKey\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"crypto/cipher\"\n\t\"crypto/sha1\"\n\t\"crypto/subtle\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n)\n\n// SymmetricallyEncrypted represents a symmetrically encrypted byte string. The\n// encrypted contents will consist of more OpenPGP packets. See RFC 4880,\n// sections 5.7 and 5.13.\ntype SymmetricallyEncrypted struct {\n\tMDC      bool // true iff this is a type 18 packet and thus has an embedded MAC.\n\tcontents io.Reader\n\tprefix   []byte\n}\n\nconst symmetricallyEncryptedVersion = 1\n\nfunc (se *SymmetricallyEncrypted) parse(r io.Reader) error {\n\tif se.MDC {\n\t\t// See RFC 4880, section 5.13.\n\t\tvar buf [1]byte\n\t\t_, err := readFull(r, buf[:])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif buf[0] != symmetricallyEncryptedVersion {\n\t\t\treturn errors.UnsupportedError(\"unknown SymmetricallyEncrypted version\")\n\t\t}\n\t}\n\tse.contents = r\n\treturn nil\n}\n\n// Decrypt returns a ReadCloser, from which the decrypted contents of the\n// packet can be read. An incorrect key can, with high probability, be detected\n// immediately and this will result in a KeyIncorrect error being returned.\nfunc (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) {\n\tkeySize := c.KeySize()\n\tif keySize == 0 {\n\t\treturn nil, errors.UnsupportedError(\"unknown cipher: \" + strconv.Itoa(int(c)))\n\t}\n\tif len(key) != keySize {\n\t\treturn nil, errors.InvalidArgumentError(\"SymmetricallyEncrypted: incorrect key length\")\n\t}\n\n\tif se.prefix == nil {\n\t\tse.prefix = make([]byte, c.blockSize()+2)\n\t\t_, err := readFull(se.contents, se.prefix)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else if len(se.prefix) != c.blockSize()+2 {\n\t\treturn nil, errors.InvalidArgumentError(\"can't try ciphers with different block lengths\")\n\t}\n\n\tocfbResync := OCFBResync\n\tif se.MDC {\n\t\t// MDC packets use a different form of OCFB mode.\n\t\tocfbResync = OCFBNoResync\n\t}\n\n\ts := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync)\n\tif s == nil {\n\t\treturn nil, errors.ErrKeyIncorrect\n\t}\n\n\tplaintext := cipher.StreamReader{S: s, R: se.contents}\n\n\tif se.MDC {\n\t\t// MDC packets have an embedded hash that we need to check.\n\t\th := sha1.New()\n\t\th.Write(se.prefix)\n\t\treturn &seMDCReader{in: plaintext, h: h}, nil\n\t}\n\n\t// Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser.\n\treturn seReader{plaintext}, nil\n}\n\n// seReader wraps an io.Reader with a no-op Close method.\ntype seReader struct {\n\tin io.Reader\n}\n\nfunc (ser seReader) Read(buf []byte) (int, error) {\n\treturn ser.in.Read(buf)\n}\n\nfunc (ser seReader) Close() error {\n\treturn nil\n}\n\nconst mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size\n\n// An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold\n// of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an\n// MDC packet containing a hash of the previous contents which is checked\n// against the running hash. See RFC 4880, section 5.13.\ntype seMDCReader struct {\n\tin          io.Reader\n\th           hash.Hash\n\ttrailer     [mdcTrailerSize]byte\n\tscratch     [mdcTrailerSize]byte\n\ttrailerUsed int\n\terror       bool\n\teof         bool\n}\n\nfunc (ser *seMDCReader) Read(buf []byte) (n int, err error) {\n\tif ser.error {\n\t\terr = io.ErrUnexpectedEOF\n\t\treturn\n\t}\n\tif ser.eof {\n\t\terr = io.EOF\n\t\treturn\n\t}\n\n\t// If we haven't yet filled the trailer buffer then we must do that\n\t// first.\n\tfor ser.trailerUsed < mdcTrailerSize {\n\t\tn, err = ser.in.Read(ser.trailer[ser.trailerUsed:])\n\t\tser.trailerUsed += n\n\t\tif err == io.EOF {\n\t\t\tif ser.trailerUsed != mdcTrailerSize {\n\t\t\t\tn = 0\n\t\t\t\terr = io.ErrUnexpectedEOF\n\t\t\t\tser.error = true\n\t\t\t\treturn\n\t\t\t}\n\t\t\tser.eof = true\n\t\t\tn = 0\n\t\t\treturn\n\t\t}\n\n\t\tif err != nil {\n\t\t\tn = 0\n\t\t\treturn\n\t\t}\n\t}\n\n\t// If it's a short read then we read into a temporary buffer and shift\n\t// the data into the caller's buffer.\n\tif len(buf) <= mdcTrailerSize {\n\t\tn, err = readFull(ser.in, ser.scratch[:len(buf)])\n\t\tcopy(buf, ser.trailer[:n])\n\t\tser.h.Write(buf[:n])\n\t\tcopy(ser.trailer[:], ser.trailer[n:])\n\t\tcopy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:])\n\t\tif n < len(buf) {\n\t\t\tser.eof = true\n\t\t\terr = io.EOF\n\t\t}\n\t\treturn\n\t}\n\n\tn, err = ser.in.Read(buf[mdcTrailerSize:])\n\tcopy(buf, ser.trailer[:])\n\tser.h.Write(buf[:n])\n\tcopy(ser.trailer[:], buf[n:])\n\n\tif err == io.EOF {\n\t\tser.eof = true\n\t}\n\treturn\n}\n\n// This is a new-format packet tag byte for a type 19 (MDC) packet.\nconst mdcPacketTagByte = byte(0x80) | 0x40 | 19\n\nfunc (ser *seMDCReader) Close() error {\n\tif ser.error {\n\t\treturn errors.SignatureError(\"error during reading\")\n\t}\n\n\tfor !ser.eof {\n\t\t// We haven't seen EOF so we need to read to the end\n\t\tvar buf [1024]byte\n\t\t_, err := ser.Read(buf[:])\n\t\tif err == io.EOF {\n\t\t\tbreak\n\t\t}\n\t\tif err != nil {\n\t\t\treturn errors.SignatureError(\"error during reading\")\n\t\t}\n\t}\n\n\tif ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size {\n\t\treturn errors.SignatureError(\"MDC packet not found\")\n\t}\n\tser.h.Write(ser.trailer[:2])\n\n\tfinal := ser.h.Sum(nil)\n\tif subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 {\n\t\treturn errors.SignatureError(\"hash mismatch\")\n\t}\n\treturn nil\n}\n\n// An seMDCWriter writes through to an io.WriteCloser while maintains a running\n// hash of the data written. On close, it emits an MDC packet containing the\n// running hash.\ntype seMDCWriter struct {\n\tw io.WriteCloser\n\th hash.Hash\n}\n\nfunc (w *seMDCWriter) Write(buf []byte) (n int, err error) {\n\tw.h.Write(buf)\n\treturn w.w.Write(buf)\n}\n\nfunc (w *seMDCWriter) Close() (err error) {\n\tvar buf [mdcTrailerSize]byte\n\n\tbuf[0] = mdcPacketTagByte\n\tbuf[1] = sha1.Size\n\tw.h.Write(buf[:2])\n\tdigest := w.h.Sum(nil)\n\tcopy(buf[2:], digest)\n\n\t_, err = w.w.Write(buf[:])\n\tif err != nil {\n\t\treturn\n\t}\n\treturn w.w.Close()\n}\n\n// noOpCloser is like an ioutil.NopCloser, but for an io.Writer.\ntype noOpCloser struct {\n\tw io.Writer\n}\n\nfunc (c noOpCloser) Write(data []byte) (n int, err error) {\n\treturn c.w.Write(data)\n}\n\nfunc (c noOpCloser) Close() error {\n\treturn nil\n}\n\n// SerializeSymmetricallyEncrypted serializes a symmetrically encrypted packet\n// to w and returns a WriteCloser to which the to-be-encrypted packets can be\n// written.\n// If config is nil, sensible defaults will be used.\nfunc SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte, config *Config) (contents io.WriteCloser, err error) {\n\tif c.KeySize() != len(key) {\n\t\treturn nil, errors.InvalidArgumentError(\"SymmetricallyEncrypted.Serialize: bad key length\")\n\t}\n\twriteCloser := noOpCloser{w}\n\tciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedMDC)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = ciphertext.Write([]byte{symmetricallyEncryptedVersion})\n\tif err != nil {\n\t\treturn\n\t}\n\n\tblock := c.new(key)\n\tblockSize := block.BlockSize()\n\tiv := make([]byte, blockSize)\n\t_, err = config.Random().Read(iv)\n\tif err != nil {\n\t\treturn\n\t}\n\ts, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync)\n\t_, err = ciphertext.Write(prefix)\n\tif err != nil {\n\t\treturn\n\t}\n\tplaintext := cipher.StreamWriter{S: s, W: ciphertext}\n\n\th := sha1.New()\n\th.Write(iv)\n\th.Write(iv[blockSize-2:])\n\tcontents = &seMDCWriter{w: plaintext, h: h}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/userattribute.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"bytes\"\n\t\"image\"\n\t\"image/jpeg\"\n\t\"io\"\n\t\"io/ioutil\"\n)\n\nconst UserAttrImageSubpacket = 1\n\n// UserAttribute is capable of storing other types of data about a user\n// beyond name, email and a text comment. In practice, user attributes are typically used\n// to store a signed thumbnail photo JPEG image of the user.\n// See RFC 4880, section 5.12.\ntype UserAttribute struct {\n\tContents []*OpaqueSubpacket\n}\n\n// NewUserAttributePhoto creates a user attribute packet\n// containing the given images.\nfunc NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error) {\n\tuat = new(UserAttribute)\n\tfor _, photo := range photos {\n\t\tvar buf bytes.Buffer\n\t\t// RFC 4880, Section 5.12.1.\n\t\tdata := []byte{\n\t\t\t0x10, 0x00, // Little-endian image header length (16 bytes)\n\t\t\t0x01,       // Image header version 1\n\t\t\t0x01,       // JPEG\n\t\t\t0, 0, 0, 0, // 12 reserved octets, must be all zero.\n\t\t\t0, 0, 0, 0,\n\t\t\t0, 0, 0, 0}\n\t\tif _, err = buf.Write(data); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif err = jpeg.Encode(&buf, photo, nil); err != nil {\n\t\t\treturn\n\t\t}\n\t\tuat.Contents = append(uat.Contents, &OpaqueSubpacket{\n\t\t\tSubType:  UserAttrImageSubpacket,\n\t\t\tContents: buf.Bytes()})\n\t}\n\treturn\n}\n\n// NewUserAttribute creates a new user attribute packet containing the given subpackets.\nfunc NewUserAttribute(contents ...*OpaqueSubpacket) *UserAttribute {\n\treturn &UserAttribute{Contents: contents}\n}\n\nfunc (uat *UserAttribute) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.13\n\tb, err := ioutil.ReadAll(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tuat.Contents, err = OpaqueSubpackets(b)\n\treturn\n}\n\n// Serialize marshals the user attribute to w in the form of an OpenPGP packet, including\n// header.\nfunc (uat *UserAttribute) Serialize(w io.Writer) (err error) {\n\tvar buf bytes.Buffer\n\tfor _, sp := range uat.Contents {\n\t\tsp.Serialize(&buf)\n\t}\n\tif err = serializeHeader(w, packetTypeUserAttribute, buf.Len()); err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(buf.Bytes())\n\treturn\n}\n\n// ImageData returns zero or more byte slices, each containing\n// JPEG File Interchange Format (JFIF), for each photo in the\n// the user attribute packet.\nfunc (uat *UserAttribute) ImageData() (imageData [][]byte) {\n\tfor _, sp := range uat.Contents {\n\t\tif sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 {\n\t\t\timageData = append(imageData, sp.Contents[16:])\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/packet/userid.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage packet\n\nimport (\n\t\"io\"\n\t\"io/ioutil\"\n\t\"strings\"\n)\n\n// UserId contains text that is intended to represent the name and email\n// address of the key holder. See RFC 4880, section 5.11. By convention, this\n// takes the form \"Full Name (Comment) <email@example.com>\"\ntype UserId struct {\n\tId string // By convention, this takes the form \"Full Name (Comment) <email@example.com>\" which is split out in the fields below.\n\n\tName, Comment, Email string\n}\n\nfunc hasInvalidCharacters(s string) bool {\n\tfor _, c := range s {\n\t\tswitch c {\n\t\tcase '(', ')', '<', '>', 0:\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// NewUserId returns a UserId or nil if any of the arguments contain invalid\n// characters. The invalid characters are '\\x00', '(', ')', '<' and '>'\nfunc NewUserId(name, comment, email string) *UserId {\n\t// RFC 4880 doesn't deal with the structure of userid strings; the\n\t// name, comment and email form is just a convention. However, there's\n\t// no convention about escaping the metacharacters and GPG just refuses\n\t// to create user ids where, say, the name contains a '('. We mirror\n\t// this behaviour.\n\n\tif hasInvalidCharacters(name) || hasInvalidCharacters(comment) || hasInvalidCharacters(email) {\n\t\treturn nil\n\t}\n\n\tuid := new(UserId)\n\tuid.Name, uid.Comment, uid.Email = name, comment, email\n\tuid.Id = name\n\tif len(comment) > 0 {\n\t\tif len(uid.Id) > 0 {\n\t\t\tuid.Id += \" \"\n\t\t}\n\t\tuid.Id += \"(\"\n\t\tuid.Id += comment\n\t\tuid.Id += \")\"\n\t}\n\tif len(email) > 0 {\n\t\tif len(uid.Id) > 0 {\n\t\t\tuid.Id += \" \"\n\t\t}\n\t\tuid.Id += \"<\"\n\t\tuid.Id += email\n\t\tuid.Id += \">\"\n\t}\n\treturn uid\n}\n\nfunc (uid *UserId) parse(r io.Reader) (err error) {\n\t// RFC 4880, section 5.11\n\tb, err := ioutil.ReadAll(r)\n\tif err != nil {\n\t\treturn\n\t}\n\tuid.Id = string(b)\n\tuid.Name, uid.Comment, uid.Email = parseUserId(uid.Id)\n\treturn\n}\n\n// Serialize marshals uid to w in the form of an OpenPGP packet, including\n// header.\nfunc (uid *UserId) Serialize(w io.Writer) error {\n\terr := serializeHeader(w, packetTypeUserId, len(uid.Id))\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write([]byte(uid.Id))\n\treturn err\n}\n\n// parseUserId extracts the name, comment and email from a user id string that\n// is formatted as \"Full Name (Comment) <email@example.com>\".\nfunc parseUserId(id string) (name, comment, email string) {\n\tvar n, c, e struct {\n\t\tstart, end int\n\t}\n\tvar state int\n\n\tfor offset, rune := range id {\n\t\tswitch state {\n\t\tcase 0:\n\t\t\t// Entering name\n\t\t\tn.start = offset\n\t\t\tstate = 1\n\t\t\tfallthrough\n\t\tcase 1:\n\t\t\t// In name\n\t\t\tif rune == '(' {\n\t\t\t\tstate = 2\n\t\t\t\tn.end = offset\n\t\t\t} else if rune == '<' {\n\t\t\t\tstate = 5\n\t\t\t\tn.end = offset\n\t\t\t}\n\t\tcase 2:\n\t\t\t// Entering comment\n\t\t\tc.start = offset\n\t\t\tstate = 3\n\t\t\tfallthrough\n\t\tcase 3:\n\t\t\t// In comment\n\t\t\tif rune == ')' {\n\t\t\t\tstate = 4\n\t\t\t\tc.end = offset\n\t\t\t}\n\t\tcase 4:\n\t\t\t// Between comment and email\n\t\t\tif rune == '<' {\n\t\t\t\tstate = 5\n\t\t\t}\n\t\tcase 5:\n\t\t\t// Entering email\n\t\t\te.start = offset\n\t\t\tstate = 6\n\t\t\tfallthrough\n\t\tcase 6:\n\t\t\t// In email\n\t\t\tif rune == '>' {\n\t\t\t\tstate = 7\n\t\t\t\te.end = offset\n\t\t\t}\n\t\tdefault:\n\t\t\t// After email\n\t\t}\n\t}\n\tswitch state {\n\tcase 1:\n\t\t// ended in the name\n\t\tn.end = len(id)\n\tcase 3:\n\t\t// ended in comment\n\t\tc.end = len(id)\n\tcase 6:\n\t\t// ended in email\n\t\te.end = len(id)\n\t}\n\n\tname = strings.TrimSpace(id[n.start:n.end])\n\tcomment = strings.TrimSpace(id[c.start:c.end])\n\temail = strings.TrimSpace(id[e.start:e.end])\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/read.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package openpgp implements high level operations on OpenPGP messages.\npackage openpgp // import \"golang.org/x/crypto/openpgp\"\n\nimport (\n\t\"crypto\"\n\t_ \"crypto/sha256\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"golang.org/x/crypto/openpgp/armor\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/packet\"\n)\n\n// SignatureType is the armor type for a PGP signature.\nvar SignatureType = \"PGP SIGNATURE\"\n\n// readArmored reads an armored block with the given type.\nfunc readArmored(r io.Reader, expectedType string) (body io.Reader, err error) {\n\tblock, err := armor.Decode(r)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif block.Type != expectedType {\n\t\treturn nil, errors.InvalidArgumentError(\"expected '\" + expectedType + \"', got: \" + block.Type)\n\t}\n\n\treturn block.Body, nil\n}\n\n// MessageDetails contains the result of parsing an OpenPGP encrypted and/or\n// signed message.\ntype MessageDetails struct {\n\tIsEncrypted              bool                // true if the message was encrypted.\n\tEncryptedToKeyIds        []uint64            // the list of recipient key ids.\n\tIsSymmetricallyEncrypted bool                // true if a passphrase could have decrypted the message.\n\tDecryptedWith            Key                 // the private key used to decrypt the message, if any.\n\tIsSigned                 bool                // true if the message is signed.\n\tSignedByKeyId            uint64              // the key id of the signer, if any.\n\tSignedBy                 *Key                // the key of the signer, if available.\n\tLiteralData              *packet.LiteralData // the metadata of the contents\n\tUnverifiedBody           io.Reader           // the contents of the message.\n\n\t// If IsSigned is true and SignedBy is non-zero then the signature will\n\t// be verified as UnverifiedBody is read. The signature cannot be\n\t// checked until the whole of UnverifiedBody is read so UnverifiedBody\n\t// must be consumed until EOF before the data can be trusted. Even if a\n\t// message isn't signed (or the signer is unknown) the data may contain\n\t// an authentication code that is only checked once UnverifiedBody has\n\t// been consumed. Once EOF has been seen, the following fields are\n\t// valid. (An authentication code failure is reported as a\n\t// SignatureError error when reading from UnverifiedBody.)\n\tSignatureError error               // nil if the signature is good.\n\tSignature      *packet.Signature   // the signature packet itself, if v4 (default)\n\tSignatureV3    *packet.SignatureV3 // the signature packet if it is a v2 or v3 signature\n\n\tdecrypted io.ReadCloser\n}\n\n// A PromptFunction is used as a callback by functions that may need to decrypt\n// a private key, or prompt for a passphrase. It is called with a list of\n// acceptable, encrypted private keys and a boolean that indicates whether a\n// passphrase is usable. It should either decrypt a private key or return a\n// passphrase to try. If the decrypted private key or given passphrase isn't\n// correct, the function will be called again, forever. Any error returned will\n// be passed up.\ntype PromptFunction func(keys []Key, symmetric bool) ([]byte, error)\n\n// A keyEnvelopePair is used to store a private key with the envelope that\n// contains a symmetric key, encrypted with that key.\ntype keyEnvelopePair struct {\n\tkey          Key\n\tencryptedKey *packet.EncryptedKey\n}\n\n// ReadMessage parses an OpenPGP message that may be signed and/or encrypted.\n// The given KeyRing should contain both public keys (for signature\n// verification) and, possibly encrypted, private keys for decrypting.\n// If config is nil, sensible defaults will be used.\nfunc ReadMessage(r io.Reader, keyring KeyRing, prompt PromptFunction, config *packet.Config) (md *MessageDetails, err error) {\n\tvar p packet.Packet\n\n\tvar symKeys []*packet.SymmetricKeyEncrypted\n\tvar pubKeys []keyEnvelopePair\n\tvar se *packet.SymmetricallyEncrypted\n\n\tpackets := packet.NewReader(r)\n\tmd = new(MessageDetails)\n\tmd.IsEncrypted = true\n\n\t// The message, if encrypted, starts with a number of packets\n\t// containing an encrypted decryption key. The decryption key is either\n\t// encrypted to a public key, or with a passphrase. This loop\n\t// collects these packets.\nParsePackets:\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tswitch p := p.(type) {\n\t\tcase *packet.SymmetricKeyEncrypted:\n\t\t\t// This packet contains the decryption key encrypted with a passphrase.\n\t\t\tmd.IsSymmetricallyEncrypted = true\n\t\t\tsymKeys = append(symKeys, p)\n\t\tcase *packet.EncryptedKey:\n\t\t\t// This packet contains the decryption key encrypted to a public key.\n\t\t\tmd.EncryptedToKeyIds = append(md.EncryptedToKeyIds, p.KeyId)\n\t\t\tswitch p.Algo {\n\t\t\tcase packet.PubKeyAlgoRSA, packet.PubKeyAlgoRSAEncryptOnly, packet.PubKeyAlgoElGamal:\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvar keys []Key\n\t\t\tif p.KeyId == 0 {\n\t\t\t\tkeys = keyring.DecryptionKeys()\n\t\t\t} else {\n\t\t\t\tkeys = keyring.KeysById(p.KeyId)\n\t\t\t}\n\t\t\tfor _, k := range keys {\n\t\t\t\tpubKeys = append(pubKeys, keyEnvelopePair{k, p})\n\t\t\t}\n\t\tcase *packet.SymmetricallyEncrypted:\n\t\t\tse = p\n\t\t\tbreak ParsePackets\n\t\tcase *packet.Compressed, *packet.LiteralData, *packet.OnePassSignature:\n\t\t\t// This message isn't encrypted.\n\t\t\tif len(symKeys) != 0 || len(pubKeys) != 0 {\n\t\t\t\treturn nil, errors.StructuralError(\"key material not followed by encrypted message\")\n\t\t\t}\n\t\t\tpackets.Unread(p)\n\t\t\treturn readSignedMessage(packets, nil, keyring)\n\t\t}\n\t}\n\n\tvar candidates []Key\n\tvar decrypted io.ReadCloser\n\n\t// Now that we have the list of encrypted keys we need to decrypt at\n\t// least one of them or, if we cannot, we need to call the prompt\n\t// function so that it can decrypt a key or give us a passphrase.\nFindKey:\n\tfor {\n\t\t// See if any of the keys already have a private key available\n\t\tcandidates = candidates[:0]\n\t\tcandidateFingerprints := make(map[string]bool)\n\n\t\tfor _, pk := range pubKeys {\n\t\t\tif pk.key.PrivateKey == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif !pk.key.PrivateKey.Encrypted {\n\t\t\t\tif len(pk.encryptedKey.Key) == 0 {\n\t\t\t\t\tpk.encryptedKey.Decrypt(pk.key.PrivateKey, config)\n\t\t\t\t}\n\t\t\t\tif len(pk.encryptedKey.Key) == 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tdecrypted, err = se.Decrypt(pk.encryptedKey.CipherFunc, pk.encryptedKey.Key)\n\t\t\t\tif err != nil && err != errors.ErrKeyIncorrect {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\tif decrypted != nil {\n\t\t\t\t\tmd.DecryptedWith = pk.key\n\t\t\t\t\tbreak FindKey\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfpr := string(pk.key.PublicKey.Fingerprint[:])\n\t\t\t\tif v := candidateFingerprints[fpr]; v {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tcandidates = append(candidates, pk.key)\n\t\t\t\tcandidateFingerprints[fpr] = true\n\t\t\t}\n\t\t}\n\n\t\tif len(candidates) == 0 && len(symKeys) == 0 {\n\t\t\treturn nil, errors.ErrKeyIncorrect\n\t\t}\n\n\t\tif prompt == nil {\n\t\t\treturn nil, errors.ErrKeyIncorrect\n\t\t}\n\n\t\tpassphrase, err := prompt(candidates, len(symKeys) != 0)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Try the symmetric passphrase first\n\t\tif len(symKeys) != 0 && passphrase != nil {\n\t\t\tfor _, s := range symKeys {\n\t\t\t\tkey, cipherFunc, err := s.Decrypt(passphrase)\n\t\t\t\tif err == nil {\n\t\t\t\t\tdecrypted, err = se.Decrypt(cipherFunc, key)\n\t\t\t\t\tif err != nil && err != errors.ErrKeyIncorrect {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tif decrypted != nil {\n\t\t\t\t\t\tbreak FindKey\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n\n\tmd.decrypted = decrypted\n\tif err := packets.Push(decrypted); err != nil {\n\t\treturn nil, err\n\t}\n\treturn readSignedMessage(packets, md, keyring)\n}\n\n// readSignedMessage reads a possibly signed message if mdin is non-zero then\n// that structure is updated and returned. Otherwise a fresh MessageDetails is\n// used.\nfunc readSignedMessage(packets *packet.Reader, mdin *MessageDetails, keyring KeyRing) (md *MessageDetails, err error) {\n\tif mdin == nil {\n\t\tmdin = new(MessageDetails)\n\t}\n\tmd = mdin\n\n\tvar p packet.Packet\n\tvar h hash.Hash\n\tvar wrappedHash hash.Hash\nFindLiteralData:\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tswitch p := p.(type) {\n\t\tcase *packet.Compressed:\n\t\t\tif err := packets.Push(p.Body); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\tcase *packet.OnePassSignature:\n\t\t\tif !p.IsLast {\n\t\t\t\treturn nil, errors.UnsupportedError(\"nested signatures\")\n\t\t\t}\n\n\t\t\th, wrappedHash, err = hashForSignature(p.Hash, p.SigType)\n\t\t\tif err != nil {\n\t\t\t\tmd = nil\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tmd.IsSigned = true\n\t\t\tmd.SignedByKeyId = p.KeyId\n\t\t\tkeys := keyring.KeysByIdUsage(p.KeyId, packet.KeyFlagSign)\n\t\t\tif len(keys) > 0 {\n\t\t\t\tmd.SignedBy = &keys[0]\n\t\t\t}\n\t\tcase *packet.LiteralData:\n\t\t\tmd.LiteralData = p\n\t\t\tbreak FindLiteralData\n\t\t}\n\t}\n\n\tif md.SignedBy != nil {\n\t\tmd.UnverifiedBody = &signatureCheckReader{packets, h, wrappedHash, md}\n\t} else if md.decrypted != nil {\n\t\tmd.UnverifiedBody = checkReader{md}\n\t} else {\n\t\tmd.UnverifiedBody = md.LiteralData.Body\n\t}\n\n\treturn md, nil\n}\n\n// hashForSignature returns a pair of hashes that can be used to verify a\n// signature. The signature may specify that the contents of the signed message\n// should be preprocessed (i.e. to normalize line endings). Thus this function\n// returns two hashes. The second should be used to hash the message itself and\n// performs any needed preprocessing.\nfunc hashForSignature(hashId crypto.Hash, sigType packet.SignatureType) (hash.Hash, hash.Hash, error) {\n\tif !hashId.Available() {\n\t\treturn nil, nil, errors.UnsupportedError(\"hash not available: \" + strconv.Itoa(int(hashId)))\n\t}\n\th := hashId.New()\n\n\tswitch sigType {\n\tcase packet.SigTypeBinary:\n\t\treturn h, h, nil\n\tcase packet.SigTypeText:\n\t\treturn h, NewCanonicalTextHash(h), nil\n\t}\n\n\treturn nil, nil, errors.UnsupportedError(\"unsupported signature type: \" + strconv.Itoa(int(sigType)))\n}\n\n// checkReader wraps an io.Reader from a LiteralData packet. When it sees EOF\n// it closes the ReadCloser from any SymmetricallyEncrypted packet to trigger\n// MDC checks.\ntype checkReader struct {\n\tmd *MessageDetails\n}\n\nfunc (cr checkReader) Read(buf []byte) (n int, err error) {\n\tn, err = cr.md.LiteralData.Body.Read(buf)\n\tif err == io.EOF {\n\t\tmdcErr := cr.md.decrypted.Close()\n\t\tif mdcErr != nil {\n\t\t\terr = mdcErr\n\t\t}\n\t}\n\treturn\n}\n\n// signatureCheckReader wraps an io.Reader from a LiteralData packet and hashes\n// the data as it is read. When it sees an EOF from the underlying io.Reader\n// it parses and checks a trailing Signature packet and triggers any MDC checks.\ntype signatureCheckReader struct {\n\tpackets        *packet.Reader\n\th, wrappedHash hash.Hash\n\tmd             *MessageDetails\n}\n\nfunc (scr *signatureCheckReader) Read(buf []byte) (n int, err error) {\n\tn, err = scr.md.LiteralData.Body.Read(buf)\n\tscr.wrappedHash.Write(buf[:n])\n\tif err == io.EOF {\n\t\tvar p packet.Packet\n\t\tp, scr.md.SignatureError = scr.packets.Next()\n\t\tif scr.md.SignatureError != nil {\n\t\t\treturn\n\t\t}\n\n\t\tvar ok bool\n\t\tif scr.md.Signature, ok = p.(*packet.Signature); ok {\n\t\t\tscr.md.SignatureError = scr.md.SignedBy.PublicKey.VerifySignature(scr.h, scr.md.Signature)\n\t\t} else if scr.md.SignatureV3, ok = p.(*packet.SignatureV3); ok {\n\t\t\tscr.md.SignatureError = scr.md.SignedBy.PublicKey.VerifySignatureV3(scr.h, scr.md.SignatureV3)\n\t\t} else {\n\t\t\tscr.md.SignatureError = errors.StructuralError(\"LiteralData not followed by Signature\")\n\t\t\treturn\n\t\t}\n\n\t\t// The SymmetricallyEncrypted packet, if any, might have an\n\t\t// unsigned hash of its own. In order to check this we need to\n\t\t// close that Reader.\n\t\tif scr.md.decrypted != nil {\n\t\t\tmdcErr := scr.md.decrypted.Close()\n\t\t\tif mdcErr != nil {\n\t\t\t\terr = mdcErr\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\n// CheckDetachedSignature takes a signed file and a detached signature and\n// returns the signer if the signature is valid. If the signer isn't known,\n// ErrUnknownIssuer is returned.\nfunc CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signer *Entity, err error) {\n\tvar issuerKeyId uint64\n\tvar hashFunc crypto.Hash\n\tvar sigType packet.SignatureType\n\tvar keys []Key\n\tvar p packet.Packet\n\n\tpackets := packet.NewReader(signature)\n\tfor {\n\t\tp, err = packets.Next()\n\t\tif err == io.EOF {\n\t\t\treturn nil, errors.ErrUnknownIssuer\n\t\t}\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tswitch sig := p.(type) {\n\t\tcase *packet.Signature:\n\t\t\tif sig.IssuerKeyId == nil {\n\t\t\t\treturn nil, errors.StructuralError(\"signature doesn't have an issuer\")\n\t\t\t}\n\t\t\tissuerKeyId = *sig.IssuerKeyId\n\t\t\thashFunc = sig.Hash\n\t\t\tsigType = sig.SigType\n\t\tcase *packet.SignatureV3:\n\t\t\tissuerKeyId = sig.IssuerKeyId\n\t\t\thashFunc = sig.Hash\n\t\t\tsigType = sig.SigType\n\t\tdefault:\n\t\t\treturn nil, errors.StructuralError(\"non signature packet found\")\n\t\t}\n\n\t\tkeys = keyring.KeysByIdUsage(issuerKeyId, packet.KeyFlagSign)\n\t\tif len(keys) > 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif len(keys) == 0 {\n\t\tpanic(\"unreachable\")\n\t}\n\n\th, wrappedHash, err := hashForSignature(hashFunc, sigType)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif _, err := io.Copy(wrappedHash, signed); err != nil && err != io.EOF {\n\t\treturn nil, err\n\t}\n\n\tfor _, key := range keys {\n\t\tswitch sig := p.(type) {\n\t\tcase *packet.Signature:\n\t\t\terr = key.PublicKey.VerifySignature(h, sig)\n\t\tcase *packet.SignatureV3:\n\t\t\terr = key.PublicKey.VerifySignatureV3(h, sig)\n\t\tdefault:\n\t\t\tpanic(\"unreachable\")\n\t\t}\n\n\t\tif err == nil {\n\t\t\treturn key.Entity, nil\n\t\t}\n\t}\n\n\treturn nil, err\n}\n\n// CheckArmoredDetachedSignature performs the same actions as\n// CheckDetachedSignature but expects the signature to be armored.\nfunc CheckArmoredDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signer *Entity, err error) {\n\tbody, err := readArmored(signature, SignatureType)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn CheckDetachedSignature(keyring, signed, body)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/s2k/s2k.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package s2k implements the various OpenPGP string-to-key transforms as\n// specified in RFC 4800 section 3.7.1.\npackage s2k // import \"golang.org/x/crypto/openpgp/s2k\"\n\nimport (\n\t\"crypto\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\n\t\"golang.org/x/crypto/openpgp/errors\"\n)\n\n// Config collects configuration parameters for s2k key-stretching\n// transformatioms. A nil *Config is valid and results in all default\n// values. Currently, Config is used only by the Serialize function in\n// this package.\ntype Config struct {\n\t// Hash is the default hash function to be used. If\n\t// nil, SHA1 is used.\n\tHash crypto.Hash\n\t// S2KCount is only used for symmetric encryption. It\n\t// determines the strength of the passphrase stretching when\n\t// the said passphrase is hashed to produce a key. S2KCount\n\t// should be between 1024 and 65011712, inclusive. If Config\n\t// is nil or S2KCount is 0, the value 65536 used. Not all\n\t// values in the above range can be represented. S2KCount will\n\t// be rounded up to the next representable value if it cannot\n\t// be encoded exactly. When set, it is strongly encrouraged to\n\t// use a value that is at least 65536. See RFC 4880 Section\n\t// 3.7.1.3.\n\tS2KCount int\n}\n\nfunc (c *Config) hash() crypto.Hash {\n\tif c == nil || uint(c.Hash) == 0 {\n\t\t// SHA1 is the historical default in this package.\n\t\treturn crypto.SHA1\n\t}\n\n\treturn c.Hash\n}\n\nfunc (c *Config) encodedCount() uint8 {\n\tif c == nil || c.S2KCount == 0 {\n\t\treturn 96 // The common case. Correspoding to 65536\n\t}\n\n\ti := c.S2KCount\n\tswitch {\n\t// Behave like GPG. Should we make 65536 the lowest value used?\n\tcase i < 1024:\n\t\ti = 1024\n\tcase i > 65011712:\n\t\ti = 65011712\n\t}\n\n\treturn encodeCount(i)\n}\n\n// encodeCount converts an iterative \"count\" in the range 1024 to\n// 65011712, inclusive, to an encoded count. The return value is the\n// octet that is actually stored in the GPG file. encodeCount panics\n// if i is not in the above range (encodedCount above takes care to\n// pass i in the correct range). See RFC 4880 Section 3.7.7.1.\nfunc encodeCount(i int) uint8 {\n\tif i < 1024 || i > 65011712 {\n\t\tpanic(\"count arg i outside the required range\")\n\t}\n\n\tfor encoded := 0; encoded < 256; encoded++ {\n\t\tcount := decodeCount(uint8(encoded))\n\t\tif count >= i {\n\t\t\treturn uint8(encoded)\n\t\t}\n\t}\n\n\treturn 255\n}\n\n// decodeCount returns the s2k mode 3 iterative \"count\" corresponding to\n// the encoded octet c.\nfunc decodeCount(c uint8) int {\n\treturn (16 + int(c&15)) << (uint32(c>>4) + 6)\n}\n\n// Simple writes to out the result of computing the Simple S2K function (RFC\n// 4880, section 3.7.1.1) using the given hash and input passphrase.\nfunc Simple(out []byte, h hash.Hash, in []byte) {\n\tSalted(out, h, in, nil)\n}\n\nvar zero [1]byte\n\n// Salted writes to out the result of computing the Salted S2K function (RFC\n// 4880, section 3.7.1.2) using the given hash, input passphrase and salt.\nfunc Salted(out []byte, h hash.Hash, in []byte, salt []byte) {\n\tdone := 0\n\tvar digest []byte\n\n\tfor i := 0; done < len(out); i++ {\n\t\th.Reset()\n\t\tfor j := 0; j < i; j++ {\n\t\t\th.Write(zero[:])\n\t\t}\n\t\th.Write(salt)\n\t\th.Write(in)\n\t\tdigest = h.Sum(digest[:0])\n\t\tn := copy(out[done:], digest)\n\t\tdone += n\n\t}\n}\n\n// Iterated writes to out the result of computing the Iterated and Salted S2K\n// function (RFC 4880, section 3.7.1.3) using the given hash, input passphrase,\n// salt and iteration count.\nfunc Iterated(out []byte, h hash.Hash, in []byte, salt []byte, count int) {\n\tcombined := make([]byte, len(in)+len(salt))\n\tcopy(combined, salt)\n\tcopy(combined[len(salt):], in)\n\n\tif count < len(combined) {\n\t\tcount = len(combined)\n\t}\n\n\tdone := 0\n\tvar digest []byte\n\tfor i := 0; done < len(out); i++ {\n\t\th.Reset()\n\t\tfor j := 0; j < i; j++ {\n\t\t\th.Write(zero[:])\n\t\t}\n\t\twritten := 0\n\t\tfor written < count {\n\t\t\tif written+len(combined) > count {\n\t\t\t\ttodo := count - written\n\t\t\t\th.Write(combined[:todo])\n\t\t\t\twritten = count\n\t\t\t} else {\n\t\t\t\th.Write(combined)\n\t\t\t\twritten += len(combined)\n\t\t\t}\n\t\t}\n\t\tdigest = h.Sum(digest[:0])\n\t\tn := copy(out[done:], digest)\n\t\tdone += n\n\t}\n}\n\n// Parse reads a binary specification for a string-to-key transformation from r\n// and returns a function which performs that transform.\nfunc Parse(r io.Reader) (f func(out, in []byte), err error) {\n\tvar buf [9]byte\n\n\t_, err = io.ReadFull(r, buf[:2])\n\tif err != nil {\n\t\treturn\n\t}\n\n\thash, ok := HashIdToHash(buf[1])\n\tif !ok {\n\t\treturn nil, errors.UnsupportedError(\"hash for S2K function: \" + strconv.Itoa(int(buf[1])))\n\t}\n\tif !hash.Available() {\n\t\treturn nil, errors.UnsupportedError(\"hash not available: \" + strconv.Itoa(int(hash)))\n\t}\n\th := hash.New()\n\n\tswitch buf[0] {\n\tcase 0:\n\t\tf := func(out, in []byte) {\n\t\t\tSimple(out, h, in)\n\t\t}\n\t\treturn f, nil\n\tcase 1:\n\t\t_, err = io.ReadFull(r, buf[:8])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tf := func(out, in []byte) {\n\t\t\tSalted(out, h, in, buf[:8])\n\t\t}\n\t\treturn f, nil\n\tcase 3:\n\t\t_, err = io.ReadFull(r, buf[:9])\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tcount := decodeCount(buf[8])\n\t\tf := func(out, in []byte) {\n\t\t\tIterated(out, h, in, buf[:8], count)\n\t\t}\n\t\treturn f, nil\n\t}\n\n\treturn nil, errors.UnsupportedError(\"S2K function\")\n}\n\n// Serialize salts and stretches the given passphrase and writes the\n// resulting key into key. It also serializes an S2K descriptor to\n// w. The key stretching can be configured with c, which may be\n// nil. In that case, sensible defaults will be used.\nfunc Serialize(w io.Writer, key []byte, rand io.Reader, passphrase []byte, c *Config) error {\n\tvar buf [11]byte\n\tbuf[0] = 3 /* iterated and salted */\n\tbuf[1], _ = HashToHashId(c.hash())\n\tsalt := buf[2:10]\n\tif _, err := io.ReadFull(rand, salt); err != nil {\n\t\treturn err\n\t}\n\tencodedCount := c.encodedCount()\n\tcount := decodeCount(encodedCount)\n\tbuf[10] = encodedCount\n\tif _, err := w.Write(buf[:]); err != nil {\n\t\treturn err\n\t}\n\n\tIterated(key, c.hash().New(), passphrase, salt, count)\n\treturn nil\n}\n\n// hashToHashIdMapping contains pairs relating OpenPGP's hash identifier with\n// Go's crypto.Hash type. See RFC 4880, section 9.4.\nvar hashToHashIdMapping = []struct {\n\tid   byte\n\thash crypto.Hash\n\tname string\n}{\n\t{1, crypto.MD5, \"MD5\"},\n\t{2, crypto.SHA1, \"SHA1\"},\n\t{3, crypto.RIPEMD160, \"RIPEMD160\"},\n\t{8, crypto.SHA256, \"SHA256\"},\n\t{9, crypto.SHA384, \"SHA384\"},\n\t{10, crypto.SHA512, \"SHA512\"},\n\t{11, crypto.SHA224, \"SHA224\"},\n}\n\n// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP\n// hash id.\nfunc HashIdToHash(id byte) (h crypto.Hash, ok bool) {\n\tfor _, m := range hashToHashIdMapping {\n\t\tif m.id == id {\n\t\t\treturn m.hash, true\n\t\t}\n\t}\n\treturn 0, false\n}\n\n// HashIdToString returns the name of the hash function corresponding to the\n// given OpenPGP hash id.\nfunc HashIdToString(id byte) (name string, ok bool) {\n\tfor _, m := range hashToHashIdMapping {\n\t\tif m.id == id {\n\t\t\treturn m.name, true\n\t\t}\n\t}\n\n\treturn \"\", false\n}\n\n// HashIdToHash returns an OpenPGP hash id which corresponds the given Hash.\nfunc HashToHashId(h crypto.Hash) (id byte, ok bool) {\n\tfor _, m := range hashToHashIdMapping {\n\t\tif m.hash == h {\n\t\t\treturn m.id, true\n\t\t}\n\t}\n\treturn 0, false\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/openpgp/write.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage openpgp\n\nimport (\n\t\"crypto\"\n\t\"hash\"\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"golang.org/x/crypto/openpgp/armor\"\n\t\"golang.org/x/crypto/openpgp/errors\"\n\t\"golang.org/x/crypto/openpgp/packet\"\n\t\"golang.org/x/crypto/openpgp/s2k\"\n)\n\n// DetachSign signs message with the private key from signer (which must\n// already have been decrypted) and writes the signature to w.\n// If config is nil, sensible defaults will be used.\nfunc DetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error {\n\treturn detachSign(w, signer, message, packet.SigTypeBinary, config)\n}\n\n// ArmoredDetachSign signs message with the private key from signer (which\n// must already have been decrypted) and writes an armored signature to w.\n// If config is nil, sensible defaults will be used.\nfunc ArmoredDetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) (err error) {\n\treturn armoredDetachSign(w, signer, message, packet.SigTypeBinary, config)\n}\n\n// DetachSignText signs message (after canonicalising the line endings) with\n// the private key from signer (which must already have been decrypted) and\n// writes the signature to w.\n// If config is nil, sensible defaults will be used.\nfunc DetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error {\n\treturn detachSign(w, signer, message, packet.SigTypeText, config)\n}\n\n// ArmoredDetachSignText signs message (after canonicalising the line endings)\n// with the private key from signer (which must already have been decrypted)\n// and writes an armored signature to w.\n// If config is nil, sensible defaults will be used.\nfunc ArmoredDetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error {\n\treturn armoredDetachSign(w, signer, message, packet.SigTypeText, config)\n}\n\nfunc armoredDetachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) {\n\tout, err := armor.Encode(w, SignatureType, nil)\n\tif err != nil {\n\t\treturn\n\t}\n\terr = detachSign(out, signer, message, sigType, config)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn out.Close()\n}\n\nfunc detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) {\n\tif signer.PrivateKey == nil {\n\t\treturn errors.InvalidArgumentError(\"signing key doesn't have a private key\")\n\t}\n\tif signer.PrivateKey.Encrypted {\n\t\treturn errors.InvalidArgumentError(\"signing key is encrypted\")\n\t}\n\n\tsig := new(packet.Signature)\n\tsig.SigType = sigType\n\tsig.PubKeyAlgo = signer.PrivateKey.PubKeyAlgo\n\tsig.Hash = config.Hash()\n\tsig.CreationTime = config.Now()\n\tsig.IssuerKeyId = &signer.PrivateKey.KeyId\n\n\th, wrappedHash, err := hashForSignature(sig.Hash, sig.SigType)\n\tif err != nil {\n\t\treturn\n\t}\n\tio.Copy(wrappedHash, message)\n\n\terr = sig.Sign(h, signer.PrivateKey, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn sig.Serialize(w)\n}\n\n// FileHints contains metadata about encrypted files. This metadata is, itself,\n// encrypted.\ntype FileHints struct {\n\t// IsBinary can be set to hint that the contents are binary data.\n\tIsBinary bool\n\t// FileName hints at the name of the file that should be written. It's\n\t// truncated to 255 bytes if longer. It may be empty to suggest that the\n\t// file should not be written to disk. It may be equal to \"_CONSOLE\" to\n\t// suggest the data should not be written to disk.\n\tFileName string\n\t// ModTime contains the modification time of the file, or the zero time if not applicable.\n\tModTime time.Time\n}\n\n// SymmetricallyEncrypt acts like gpg -c: it encrypts a file with a passphrase.\n// The resulting WriteCloser must be closed after the contents of the file have\n// been written.\n// If config is nil, sensible defaults will be used.\nfunc SymmetricallyEncrypt(ciphertext io.Writer, passphrase []byte, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\tif hints == nil {\n\t\thints = &FileHints{}\n\t}\n\n\tkey, err := packet.SerializeSymmetricKeyEncrypted(ciphertext, passphrase, config)\n\tif err != nil {\n\t\treturn\n\t}\n\tw, err := packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), key, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tliteraldata := w\n\tif algo := config.Compression(); algo != packet.CompressionNone {\n\t\tvar compConfig *packet.CompressionConfig\n\t\tif config != nil {\n\t\t\tcompConfig = config.CompressionConfig\n\t\t}\n\t\tliteraldata, err = packet.SerializeCompressed(w, algo, compConfig)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t}\n\n\tvar epochSeconds uint32\n\tif !hints.ModTime.IsZero() {\n\t\tepochSeconds = uint32(hints.ModTime.Unix())\n\t}\n\treturn packet.SerializeLiteral(literaldata, hints.IsBinary, hints.FileName, epochSeconds)\n}\n\n// intersectPreferences mutates and returns a prefix of a that contains only\n// the values in the intersection of a and b. The order of a is preserved.\nfunc intersectPreferences(a []uint8, b []uint8) (intersection []uint8) {\n\tvar j int\n\tfor _, v := range a {\n\t\tfor _, v2 := range b {\n\t\t\tif v == v2 {\n\t\t\t\ta[j] = v\n\t\t\t\tj++\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a[:j]\n}\n\nfunc hashToHashId(h crypto.Hash) uint8 {\n\tv, ok := s2k.HashToHashId(h)\n\tif !ok {\n\t\tpanic(\"tried to convert unknown hash\")\n\t}\n\treturn v\n}\n\n// Encrypt encrypts a message to a number of recipients and, optionally, signs\n// it. hints contains optional information, that is also encrypted, that aids\n// the recipients in processing the message. The resulting WriteCloser must\n// be closed after the contents of the file have been written.\n// If config is nil, sensible defaults will be used.\nfunc Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) {\n\tvar signer *packet.PrivateKey\n\tif signed != nil {\n\t\tsignKey, ok := signed.signingKey(config.Now())\n\t\tif !ok {\n\t\t\treturn nil, errors.InvalidArgumentError(\"no valid signing keys\")\n\t\t}\n\t\tsigner = signKey.PrivateKey\n\t\tif signer == nil {\n\t\t\treturn nil, errors.InvalidArgumentError(\"no private key in signing key\")\n\t\t}\n\t\tif signer.Encrypted {\n\t\t\treturn nil, errors.InvalidArgumentError(\"signing key must be decrypted\")\n\t\t}\n\t}\n\n\t// These are the possible ciphers that we'll use for the message.\n\tcandidateCiphers := []uint8{\n\t\tuint8(packet.CipherAES128),\n\t\tuint8(packet.CipherAES256),\n\t\tuint8(packet.CipherCAST5),\n\t}\n\t// These are the possible hash functions that we'll use for the signature.\n\tcandidateHashes := []uint8{\n\t\thashToHashId(crypto.SHA256),\n\t\thashToHashId(crypto.SHA512),\n\t\thashToHashId(crypto.SHA1),\n\t\thashToHashId(crypto.RIPEMD160),\n\t}\n\t// In the event that a recipient doesn't specify any supported ciphers\n\t// or hash functions, these are the ones that we assume that every\n\t// implementation supports.\n\tdefaultCiphers := candidateCiphers[len(candidateCiphers)-1:]\n\tdefaultHashes := candidateHashes[len(candidateHashes)-1:]\n\n\tencryptKeys := make([]Key, len(to))\n\tfor i := range to {\n\t\tvar ok bool\n\t\tencryptKeys[i], ok = to[i].encryptionKey(config.Now())\n\t\tif !ok {\n\t\t\treturn nil, errors.InvalidArgumentError(\"cannot encrypt a message to key id \" + strconv.FormatUint(to[i].PrimaryKey.KeyId, 16) + \" because it has no encryption keys\")\n\t\t}\n\n\t\tsig := to[i].primaryIdentity().SelfSignature\n\n\t\tpreferredSymmetric := sig.PreferredSymmetric\n\t\tif len(preferredSymmetric) == 0 {\n\t\t\tpreferredSymmetric = defaultCiphers\n\t\t}\n\t\tpreferredHashes := sig.PreferredHash\n\t\tif len(preferredHashes) == 0 {\n\t\t\tpreferredHashes = defaultHashes\n\t\t}\n\t\tcandidateCiphers = intersectPreferences(candidateCiphers, preferredSymmetric)\n\t\tcandidateHashes = intersectPreferences(candidateHashes, preferredHashes)\n\t}\n\n\tif len(candidateCiphers) == 0 || len(candidateHashes) == 0 {\n\t\treturn nil, errors.InvalidArgumentError(\"cannot encrypt because recipient set shares no common algorithms\")\n\t}\n\n\tcipher := packet.CipherFunction(candidateCiphers[0])\n\t// If the cipher specified by config is a candidate, we'll use that.\n\tconfiguredCipher := config.Cipher()\n\tfor _, c := range candidateCiphers {\n\t\tcipherFunc := packet.CipherFunction(c)\n\t\tif cipherFunc == configuredCipher {\n\t\t\tcipher = cipherFunc\n\t\t\tbreak\n\t\t}\n\t}\n\n\tvar hash crypto.Hash\n\tfor _, hashId := range candidateHashes {\n\t\tif h, ok := s2k.HashIdToHash(hashId); ok && h.Available() {\n\t\t\thash = h\n\t\t\tbreak\n\t\t}\n\t}\n\n\t// If the hash specified by config is a candidate, we'll use that.\n\tif configuredHash := config.Hash(); configuredHash.Available() {\n\t\tfor _, hashId := range candidateHashes {\n\t\t\tif h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash {\n\t\t\t\thash = h\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tif hash == 0 {\n\t\thashId := candidateHashes[0]\n\t\tname, ok := s2k.HashIdToString(hashId)\n\t\tif !ok {\n\t\t\tname = \"#\" + strconv.Itoa(int(hashId))\n\t\t}\n\t\treturn nil, errors.InvalidArgumentError(\"cannot encrypt because no candidate hash functions are compiled in. (Wanted \" + name + \" in this case.)\")\n\t}\n\n\tsymKey := make([]byte, cipher.KeySize())\n\tif _, err := io.ReadFull(config.Random(), symKey); err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, key := range encryptKeys {\n\t\tif err := packet.SerializeEncryptedKey(ciphertext, key.PublicKey, cipher, symKey, config); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tencryptedData, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif signer != nil {\n\t\tops := &packet.OnePassSignature{\n\t\t\tSigType:    packet.SigTypeBinary,\n\t\t\tHash:       hash,\n\t\t\tPubKeyAlgo: signer.PubKeyAlgo,\n\t\t\tKeyId:      signer.KeyId,\n\t\t\tIsLast:     true,\n\t\t}\n\t\tif err := ops.Serialize(encryptedData); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif hints == nil {\n\t\thints = &FileHints{}\n\t}\n\n\tw := encryptedData\n\tif signer != nil {\n\t\t// If we need to write a signature packet after the literal\n\t\t// data then we need to stop literalData from closing\n\t\t// encryptedData.\n\t\tw = noOpCloser{encryptedData}\n\n\t}\n\tvar epochSeconds uint32\n\tif !hints.ModTime.IsZero() {\n\t\tepochSeconds = uint32(hints.ModTime.Unix())\n\t}\n\tliteralData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif signer != nil {\n\t\treturn signatureWriter{encryptedData, literalData, hash, hash.New(), signer, config}, nil\n\t}\n\treturn literalData, nil\n}\n\n// signatureWriter hashes the contents of a message while passing it along to\n// literalData. When closed, it closes literalData, writes a signature packet\n// to encryptedData and then also closes encryptedData.\ntype signatureWriter struct {\n\tencryptedData io.WriteCloser\n\tliteralData   io.WriteCloser\n\thashType      crypto.Hash\n\th             hash.Hash\n\tsigner        *packet.PrivateKey\n\tconfig        *packet.Config\n}\n\nfunc (s signatureWriter) Write(data []byte) (int, error) {\n\ts.h.Write(data)\n\treturn s.literalData.Write(data)\n}\n\nfunc (s signatureWriter) Close() error {\n\tsig := &packet.Signature{\n\t\tSigType:      packet.SigTypeBinary,\n\t\tPubKeyAlgo:   s.signer.PubKeyAlgo,\n\t\tHash:         s.hashType,\n\t\tCreationTime: s.config.Now(),\n\t\tIssuerKeyId:  &s.signer.KeyId,\n\t}\n\n\tif err := sig.Sign(s.h, s.signer, s.config); err != nil {\n\t\treturn err\n\t}\n\tif err := s.literalData.Close(); err != nil {\n\t\treturn err\n\t}\n\tif err := sig.Serialize(s.encryptedData); err != nil {\n\t\treturn err\n\t}\n\treturn s.encryptedData.Close()\n}\n\n// noOpCloser is like an ioutil.NopCloser, but for an io.Writer.\n// TODO: we have two of these in OpenPGP packages alone. This probably needs\n// to be promoted somewhere more common.\ntype noOpCloser struct {\n\tw io.Writer\n}\n\nfunc (c noOpCloser) Write(data []byte) (n int, err error) {\n\treturn c.w.Write(data)\n}\n\nfunc (c noOpCloser) Close() error {\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/*\nPackage pbkdf2 implements the key derivation function PBKDF2 as defined in RFC\n2898 / PKCS #5 v2.0.\n\nA key derivation function is useful when encrypting data based on a password\nor any other not-fully-random data. It uses a pseudorandom function to derive\na secure encryption key based on the password.\n\nWhile v2.0 of the standard defines only one pseudorandom function to use,\nHMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved\nHash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To\nchoose, you can pass the `New` functions from the different SHA packages to\npbkdf2.Key.\n*/\npackage pbkdf2 // import \"golang.org/x/crypto/pbkdf2\"\n\nimport (\n\t\"crypto/hmac\"\n\t\"hash\"\n)\n\n// Key derives a key from the password, salt and iteration count, returning a\n// []byte of length keylen that can be used as cryptographic key. The key is\n// derived based on the method described as PBKDF2 with the HMAC variant using\n// the supplied hash function.\n//\n// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you\n// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by\n// doing:\n//\n// \tdk := pbkdf2.Key([]byte(\"some password\"), salt, 4096, 32, sha1.New)\n//\n// Remember to get a good random salt. At least 8 bytes is recommended by the\n// RFC.\n//\n// Using a higher iteration count will increase the cost of an exhaustive\n// search but will also make derivation proportionally slower.\nfunc Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte {\n\tprf := hmac.New(h, password)\n\thashLen := prf.Size()\n\tnumBlocks := (keyLen + hashLen - 1) / hashLen\n\n\tvar buf [4]byte\n\tdk := make([]byte, 0, numBlocks*hashLen)\n\tU := make([]byte, hashLen)\n\tfor block := 1; block <= numBlocks; block++ {\n\t\t// N.B.: || means concatenation, ^ means XOR\n\t\t// for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter\n\t\t// U_1 = PRF(password, salt || uint(i))\n\t\tprf.Reset()\n\t\tprf.Write(salt)\n\t\tbuf[0] = byte(block >> 24)\n\t\tbuf[1] = byte(block >> 16)\n\t\tbuf[2] = byte(block >> 8)\n\t\tbuf[3] = byte(block)\n\t\tprf.Write(buf[:4])\n\t\tdk = prf.Sum(dk)\n\t\tT := dk[len(dk)-hashLen:]\n\t\tcopy(U, T)\n\n\t\t// U_n = PRF(password, U_(n-1))\n\t\tfor n := 2; n <= iter; n++ {\n\t\t\tprf.Reset()\n\t\t\tprf.Write(U)\n\t\t\tU = U[:0]\n\t\t\tU = prf.Sum(U)\n\t\t\tfor x := range U {\n\t\t\t\tT[x] ^= U[x]\n\t\t\t}\n\t\t}\n\t}\n\treturn dk[:keyLen]\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ripemd160/ripemd160.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package ripemd160 implements the RIPEMD-160 hash algorithm.\npackage ripemd160 // import \"golang.org/x/crypto/ripemd160\"\n\n// RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart\n// Preneel with specifications available at:\n// http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf.\n\nimport (\n\t\"crypto\"\n\t\"hash\"\n)\n\nfunc init() {\n\tcrypto.RegisterHash(crypto.RIPEMD160, New)\n}\n\n// The size of the checksum in bytes.\nconst Size = 20\n\n// The block size of the hash algorithm in bytes.\nconst BlockSize = 64\n\nconst (\n\t_s0 = 0x67452301\n\t_s1 = 0xefcdab89\n\t_s2 = 0x98badcfe\n\t_s3 = 0x10325476\n\t_s4 = 0xc3d2e1f0\n)\n\n// digest represents the partial evaluation of a checksum.\ntype digest struct {\n\ts  [5]uint32       // running context\n\tx  [BlockSize]byte // temporary buffer\n\tnx int             // index into x\n\ttc uint64          // total count of bytes processed\n}\n\nfunc (d *digest) Reset() {\n\td.s[0], d.s[1], d.s[2], d.s[3], d.s[4] = _s0, _s1, _s2, _s3, _s4\n\td.nx = 0\n\td.tc = 0\n}\n\n// New returns a new hash.Hash computing the checksum.\nfunc New() hash.Hash {\n\tresult := new(digest)\n\tresult.Reset()\n\treturn result\n}\n\nfunc (d *digest) Size() int { return Size }\n\nfunc (d *digest) BlockSize() int { return BlockSize }\n\nfunc (d *digest) Write(p []byte) (nn int, err error) {\n\tnn = len(p)\n\td.tc += uint64(nn)\n\tif d.nx > 0 {\n\t\tn := len(p)\n\t\tif n > BlockSize-d.nx {\n\t\t\tn = BlockSize - d.nx\n\t\t}\n\t\tfor i := 0; i < n; i++ {\n\t\t\td.x[d.nx+i] = p[i]\n\t\t}\n\t\td.nx += n\n\t\tif d.nx == BlockSize {\n\t\t\t_Block(d, d.x[0:])\n\t\t\td.nx = 0\n\t\t}\n\t\tp = p[n:]\n\t}\n\tn := _Block(d, p)\n\tp = p[n:]\n\tif len(p) > 0 {\n\t\td.nx = copy(d.x[:], p)\n\t}\n\treturn\n}\n\nfunc (d0 *digest) Sum(in []byte) []byte {\n\t// Make a copy of d0 so that caller can keep writing and summing.\n\td := *d0\n\n\t// Padding.  Add a 1 bit and 0 bits until 56 bytes mod 64.\n\ttc := d.tc\n\tvar tmp [64]byte\n\ttmp[0] = 0x80\n\tif tc%64 < 56 {\n\t\td.Write(tmp[0 : 56-tc%64])\n\t} else {\n\t\td.Write(tmp[0 : 64+56-tc%64])\n\t}\n\n\t// Length in bits.\n\ttc <<= 3\n\tfor i := uint(0); i < 8; i++ {\n\t\ttmp[i] = byte(tc >> (8 * i))\n\t}\n\td.Write(tmp[0:8])\n\n\tif d.nx != 0 {\n\t\tpanic(\"d.nx != 0\")\n\t}\n\n\tvar digest [Size]byte\n\tfor i, s := range d.s {\n\t\tdigest[i*4] = byte(s)\n\t\tdigest[i*4+1] = byte(s >> 8)\n\t\tdigest[i*4+2] = byte(s >> 16)\n\t\tdigest[i*4+3] = byte(s >> 24)\n\t}\n\n\treturn append(in, digest[:]...)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ripemd160/ripemd160block.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// RIPEMD-160 block step.\n// In its own file so that a faster assembly or C version\n// can be substituted easily.\n\npackage ripemd160\n\n// work buffer indices and roll amounts for one line\nvar _n = [80]uint{\n\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n\t7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n\t3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,\n\t1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,\n\t4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13,\n}\n\nvar _r = [80]uint{\n\t11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,\n\t7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,\n\t11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,\n\t11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,\n\t9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6,\n}\n\n// same for the other parallel one\nvar n_ = [80]uint{\n\t5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,\n\t6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,\n\t15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,\n\t8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,\n\t12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11,\n}\n\nvar r_ = [80]uint{\n\t8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,\n\t9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,\n\t9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,\n\t15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,\n\t8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11,\n}\n\nfunc _Block(md *digest, p []byte) int {\n\tn := 0\n\tvar x [16]uint32\n\tvar alpha, beta uint32\n\tfor len(p) >= BlockSize {\n\t\ta, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4]\n\t\taa, bb, cc, dd, ee := a, b, c, d, e\n\t\tj := 0\n\t\tfor i := 0; i < 16; i++ {\n\t\t\tx[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24\n\t\t\tj += 4\n\t\t}\n\n\t\t// round 1\n\t\ti := 0\n\t\tfor i < 16 {\n\t\t\talpha = a + (b ^ c ^ d) + x[_n[i]]\n\t\t\ts := _r[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + e\n\t\t\tbeta = c<<10 | c>>22\n\t\t\ta, b, c, d, e = e, alpha, b, beta, d\n\n\t\t\t// parallel line\n\t\t\talpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6\n\t\t\ts = r_[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + ee\n\t\t\tbeta = cc<<10 | cc>>22\n\t\t\taa, bb, cc, dd, ee = ee, alpha, bb, beta, dd\n\n\t\t\ti++\n\t\t}\n\n\t\t// round 2\n\t\tfor i < 32 {\n\t\t\talpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999\n\t\t\ts := _r[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + e\n\t\t\tbeta = c<<10 | c>>22\n\t\t\ta, b, c, d, e = e, alpha, b, beta, d\n\n\t\t\t// parallel line\n\t\t\talpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124\n\t\t\ts = r_[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + ee\n\t\t\tbeta = cc<<10 | cc>>22\n\t\t\taa, bb, cc, dd, ee = ee, alpha, bb, beta, dd\n\n\t\t\ti++\n\t\t}\n\n\t\t// round 3\n\t\tfor i < 48 {\n\t\t\talpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1\n\t\t\ts := _r[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + e\n\t\t\tbeta = c<<10 | c>>22\n\t\t\ta, b, c, d, e = e, alpha, b, beta, d\n\n\t\t\t// parallel line\n\t\t\talpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3\n\t\t\ts = r_[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + ee\n\t\t\tbeta = cc<<10 | cc>>22\n\t\t\taa, bb, cc, dd, ee = ee, alpha, bb, beta, dd\n\n\t\t\ti++\n\t\t}\n\n\t\t// round 4\n\t\tfor i < 64 {\n\t\t\talpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc\n\t\t\ts := _r[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + e\n\t\t\tbeta = c<<10 | c>>22\n\t\t\ta, b, c, d, e = e, alpha, b, beta, d\n\n\t\t\t// parallel line\n\t\t\talpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9\n\t\t\ts = r_[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + ee\n\t\t\tbeta = cc<<10 | cc>>22\n\t\t\taa, bb, cc, dd, ee = ee, alpha, bb, beta, dd\n\n\t\t\ti++\n\t\t}\n\n\t\t// round 5\n\t\tfor i < 80 {\n\t\t\talpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e\n\t\t\ts := _r[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + e\n\t\t\tbeta = c<<10 | c>>22\n\t\t\ta, b, c, d, e = e, alpha, b, beta, d\n\n\t\t\t// parallel line\n\t\t\talpha = aa + (bb ^ cc ^ dd) + x[n_[i]]\n\t\t\ts = r_[i]\n\t\t\talpha = (alpha<<s | alpha>>(32-s)) + ee\n\t\t\tbeta = cc<<10 | cc>>22\n\t\t\taa, bb, cc, dd, ee = ee, alpha, bb, beta, dd\n\n\t\t\ti++\n\t\t}\n\n\t\t// combine results\n\t\tdd += c + md.s[1]\n\t\tmd.s[1] = md.s[2] + d + ee\n\t\tmd.s[2] = md.s[3] + e + aa\n\t\tmd.s[3] = md.s[4] + a + bb\n\t\tmd.s[4] = md.s[0] + b + cc\n\t\tmd.s[0] = dd\n\n\t\tp = p[BlockSize:]\n\t\tn += BlockSize\n\t}\n\treturn n\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/scrypt/scrypt.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package scrypt implements the scrypt key derivation function as defined in\n// Colin Percival's paper \"Stronger Key Derivation via Sequential Memory-Hard\n// Functions\" (https://www.tarsnap.com/scrypt/scrypt.pdf).\npackage scrypt // import \"golang.org/x/crypto/scrypt\"\n\nimport (\n\t\"crypto/sha256\"\n\t\"errors\"\n\n\t\"golang.org/x/crypto/pbkdf2\"\n)\n\nconst maxInt = int(^uint(0) >> 1)\n\n// blockCopy copies n numbers from src into dst.\nfunc blockCopy(dst, src []uint32, n int) {\n\tcopy(dst, src[:n])\n}\n\n// blockXOR XORs numbers from dst with n numbers from src.\nfunc blockXOR(dst, src []uint32, n int) {\n\tfor i, v := range src[:n] {\n\t\tdst[i] ^= v\n\t}\n}\n\n// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in,\n// and puts the result into both both tmp and out.\nfunc salsaXOR(tmp *[16]uint32, in, out []uint32) {\n\tw0 := tmp[0] ^ in[0]\n\tw1 := tmp[1] ^ in[1]\n\tw2 := tmp[2] ^ in[2]\n\tw3 := tmp[3] ^ in[3]\n\tw4 := tmp[4] ^ in[4]\n\tw5 := tmp[5] ^ in[5]\n\tw6 := tmp[6] ^ in[6]\n\tw7 := tmp[7] ^ in[7]\n\tw8 := tmp[8] ^ in[8]\n\tw9 := tmp[9] ^ in[9]\n\tw10 := tmp[10] ^ in[10]\n\tw11 := tmp[11] ^ in[11]\n\tw12 := tmp[12] ^ in[12]\n\tw13 := tmp[13] ^ in[13]\n\tw14 := tmp[14] ^ in[14]\n\tw15 := tmp[15] ^ in[15]\n\n\tx0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8\n\tx9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15\n\n\tfor i := 0; i < 8; i += 2 {\n\t\tu := x0 + x12\n\t\tx4 ^= u<<7 | u>>(32-7)\n\t\tu = x4 + x0\n\t\tx8 ^= u<<9 | u>>(32-9)\n\t\tu = x8 + x4\n\t\tx12 ^= u<<13 | u>>(32-13)\n\t\tu = x12 + x8\n\t\tx0 ^= u<<18 | u>>(32-18)\n\n\t\tu = x5 + x1\n\t\tx9 ^= u<<7 | u>>(32-7)\n\t\tu = x9 + x5\n\t\tx13 ^= u<<9 | u>>(32-9)\n\t\tu = x13 + x9\n\t\tx1 ^= u<<13 | u>>(32-13)\n\t\tu = x1 + x13\n\t\tx5 ^= u<<18 | u>>(32-18)\n\n\t\tu = x10 + x6\n\t\tx14 ^= u<<7 | u>>(32-7)\n\t\tu = x14 + x10\n\t\tx2 ^= u<<9 | u>>(32-9)\n\t\tu = x2 + x14\n\t\tx6 ^= u<<13 | u>>(32-13)\n\t\tu = x6 + x2\n\t\tx10 ^= u<<18 | u>>(32-18)\n\n\t\tu = x15 + x11\n\t\tx3 ^= u<<7 | u>>(32-7)\n\t\tu = x3 + x15\n\t\tx7 ^= u<<9 | u>>(32-9)\n\t\tu = x7 + x3\n\t\tx11 ^= u<<13 | u>>(32-13)\n\t\tu = x11 + x7\n\t\tx15 ^= u<<18 | u>>(32-18)\n\n\t\tu = x0 + x3\n\t\tx1 ^= u<<7 | u>>(32-7)\n\t\tu = x1 + x0\n\t\tx2 ^= u<<9 | u>>(32-9)\n\t\tu = x2 + x1\n\t\tx3 ^= u<<13 | u>>(32-13)\n\t\tu = x3 + x2\n\t\tx0 ^= u<<18 | u>>(32-18)\n\n\t\tu = x5 + x4\n\t\tx6 ^= u<<7 | u>>(32-7)\n\t\tu = x6 + x5\n\t\tx7 ^= u<<9 | u>>(32-9)\n\t\tu = x7 + x6\n\t\tx4 ^= u<<13 | u>>(32-13)\n\t\tu = x4 + x7\n\t\tx5 ^= u<<18 | u>>(32-18)\n\n\t\tu = x10 + x9\n\t\tx11 ^= u<<7 | u>>(32-7)\n\t\tu = x11 + x10\n\t\tx8 ^= u<<9 | u>>(32-9)\n\t\tu = x8 + x11\n\t\tx9 ^= u<<13 | u>>(32-13)\n\t\tu = x9 + x8\n\t\tx10 ^= u<<18 | u>>(32-18)\n\n\t\tu = x15 + x14\n\t\tx12 ^= u<<7 | u>>(32-7)\n\t\tu = x12 + x15\n\t\tx13 ^= u<<9 | u>>(32-9)\n\t\tu = x13 + x12\n\t\tx14 ^= u<<13 | u>>(32-13)\n\t\tu = x14 + x13\n\t\tx15 ^= u<<18 | u>>(32-18)\n\t}\n\tx0 += w0\n\tx1 += w1\n\tx2 += w2\n\tx3 += w3\n\tx4 += w4\n\tx5 += w5\n\tx6 += w6\n\tx7 += w7\n\tx8 += w8\n\tx9 += w9\n\tx10 += w10\n\tx11 += w11\n\tx12 += w12\n\tx13 += w13\n\tx14 += w14\n\tx15 += w15\n\n\tout[0], tmp[0] = x0, x0\n\tout[1], tmp[1] = x1, x1\n\tout[2], tmp[2] = x2, x2\n\tout[3], tmp[3] = x3, x3\n\tout[4], tmp[4] = x4, x4\n\tout[5], tmp[5] = x5, x5\n\tout[6], tmp[6] = x6, x6\n\tout[7], tmp[7] = x7, x7\n\tout[8], tmp[8] = x8, x8\n\tout[9], tmp[9] = x9, x9\n\tout[10], tmp[10] = x10, x10\n\tout[11], tmp[11] = x11, x11\n\tout[12], tmp[12] = x12, x12\n\tout[13], tmp[13] = x13, x13\n\tout[14], tmp[14] = x14, x14\n\tout[15], tmp[15] = x15, x15\n}\n\nfunc blockMix(tmp *[16]uint32, in, out []uint32, r int) {\n\tblockCopy(tmp[:], in[(2*r-1)*16:], 16)\n\tfor i := 0; i < 2*r; i += 2 {\n\t\tsalsaXOR(tmp, in[i*16:], out[i*8:])\n\t\tsalsaXOR(tmp, in[i*16+16:], out[i*8+r*16:])\n\t}\n}\n\nfunc integer(b []uint32, r int) uint64 {\n\tj := (2*r - 1) * 16\n\treturn uint64(b[j]) | uint64(b[j+1])<<32\n}\n\nfunc smix(b []byte, r, N int, v, xy []uint32) {\n\tvar tmp [16]uint32\n\tx := xy\n\ty := xy[32*r:]\n\n\tj := 0\n\tfor i := 0; i < 32*r; i++ {\n\t\tx[i] = uint32(b[j]) | uint32(b[j+1])<<8 | uint32(b[j+2])<<16 | uint32(b[j+3])<<24\n\t\tj += 4\n\t}\n\tfor i := 0; i < N; i += 2 {\n\t\tblockCopy(v[i*(32*r):], x, 32*r)\n\t\tblockMix(&tmp, x, y, r)\n\n\t\tblockCopy(v[(i+1)*(32*r):], y, 32*r)\n\t\tblockMix(&tmp, y, x, r)\n\t}\n\tfor i := 0; i < N; i += 2 {\n\t\tj := int(integer(x, r) & uint64(N-1))\n\t\tblockXOR(x, v[j*(32*r):], 32*r)\n\t\tblockMix(&tmp, x, y, r)\n\n\t\tj = int(integer(y, r) & uint64(N-1))\n\t\tblockXOR(y, v[j*(32*r):], 32*r)\n\t\tblockMix(&tmp, y, x, r)\n\t}\n\tj = 0\n\tfor _, v := range x[:32*r] {\n\t\tb[j+0] = byte(v >> 0)\n\t\tb[j+1] = byte(v >> 8)\n\t\tb[j+2] = byte(v >> 16)\n\t\tb[j+3] = byte(v >> 24)\n\t\tj += 4\n\t}\n}\n\n// Key derives a key from the password, salt, and cost parameters, returning\n// a byte slice of length keyLen that can be used as cryptographic key.\n//\n// N is a CPU/memory cost parameter, which must be a power of two greater than 1.\n// r and p must satisfy r * p < 2³⁰. If the parameters do not satisfy the\n// limits, the function returns a nil byte slice and an error.\n//\n// For example, you can get a derived key for e.g. AES-256 (which needs a\n// 32-byte key) by doing:\n//\n//      dk, err := scrypt.Key([]byte(\"some password\"), salt, 16384, 8, 1, 32)\n//\n// The recommended parameters for interactive logins as of 2017 are N=32768, r=8\n// and p=1. The parameters N, r, and p should be increased as memory latency and\n// CPU parallelism increases; consider setting N to the highest power of 2 you\n// can derive within 100 milliseconds. Remember to get a good random salt.\nfunc Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) {\n\tif N <= 1 || N&(N-1) != 0 {\n\t\treturn nil, errors.New(\"scrypt: N must be > 1 and a power of 2\")\n\t}\n\tif uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r {\n\t\treturn nil, errors.New(\"scrypt: parameters are too large\")\n\t}\n\n\txy := make([]uint32, 64*r)\n\tv := make([]uint32, 32*N*r)\n\tb := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New)\n\n\tfor i := 0; i < p; i++ {\n\t\tsmix(b[i*128*r:], r, N, v, xy)\n\t}\n\n\treturn pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/buffer.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"io\"\n\t\"sync\"\n)\n\n// buffer provides a linked list buffer for data exchange\n// between producer and consumer. Theoretically the buffer is\n// of unlimited capacity as it does no allocation of its own.\ntype buffer struct {\n\t// protects concurrent access to head, tail and closed\n\t*sync.Cond\n\n\thead *element // the buffer that will be read first\n\ttail *element // the buffer that will be read last\n\n\tclosed bool\n}\n\n// An element represents a single link in a linked list.\ntype element struct {\n\tbuf  []byte\n\tnext *element\n}\n\n// newBuffer returns an empty buffer that is not closed.\nfunc newBuffer() *buffer {\n\te := new(element)\n\tb := &buffer{\n\t\tCond: newCond(),\n\t\thead: e,\n\t\ttail: e,\n\t}\n\treturn b\n}\n\n// write makes buf available for Read to receive.\n// buf must not be modified after the call to write.\nfunc (b *buffer) write(buf []byte) {\n\tb.Cond.L.Lock()\n\te := &element{buf: buf}\n\tb.tail.next = e\n\tb.tail = e\n\tb.Cond.Signal()\n\tb.Cond.L.Unlock()\n}\n\n// eof closes the buffer. Reads from the buffer once all\n// the data has been consumed will receive io.EOF.\nfunc (b *buffer) eof() {\n\tb.Cond.L.Lock()\n\tb.closed = true\n\tb.Cond.Signal()\n\tb.Cond.L.Unlock()\n}\n\n// Read reads data from the internal buffer in buf.  Reads will block\n// if no data is available, or until the buffer is closed.\nfunc (b *buffer) Read(buf []byte) (n int, err error) {\n\tb.Cond.L.Lock()\n\tdefer b.Cond.L.Unlock()\n\n\tfor len(buf) > 0 {\n\t\t// if there is data in b.head, copy it\n\t\tif len(b.head.buf) > 0 {\n\t\t\tr := copy(buf, b.head.buf)\n\t\t\tbuf, b.head.buf = buf[r:], b.head.buf[r:]\n\t\t\tn += r\n\t\t\tcontinue\n\t\t}\n\t\t// if there is a next buffer, make it the head\n\t\tif len(b.head.buf) == 0 && b.head != b.tail {\n\t\t\tb.head = b.head.next\n\t\t\tcontinue\n\t\t}\n\n\t\t// if at least one byte has been copied, return\n\t\tif n > 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// if nothing was read, and there is nothing outstanding\n\t\t// check to see if the buffer is closed.\n\t\tif b.closed {\n\t\t\terr = io.EOF\n\t\t\tbreak\n\t\t}\n\t\t// out of buffers, wait for producer\n\t\tb.Cond.Wait()\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/certs.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"sort\"\n\t\"time\"\n)\n\n// These constants from [PROTOCOL.certkeys] represent the algorithm names\n// for certificate types supported by this package.\nconst (\n\tCertAlgoRSAv01      = \"ssh-rsa-cert-v01@openssh.com\"\n\tCertAlgoDSAv01      = \"ssh-dss-cert-v01@openssh.com\"\n\tCertAlgoECDSA256v01 = \"ecdsa-sha2-nistp256-cert-v01@openssh.com\"\n\tCertAlgoECDSA384v01 = \"ecdsa-sha2-nistp384-cert-v01@openssh.com\"\n\tCertAlgoECDSA521v01 = \"ecdsa-sha2-nistp521-cert-v01@openssh.com\"\n\tCertAlgoED25519v01  = \"ssh-ed25519-cert-v01@openssh.com\"\n)\n\n// Certificate types distinguish between host and user\n// certificates. The values can be set in the CertType field of\n// Certificate.\nconst (\n\tUserCert = 1\n\tHostCert = 2\n)\n\n// Signature represents a cryptographic signature.\ntype Signature struct {\n\tFormat string\n\tBlob   []byte\n}\n\n// CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that\n// a certificate does not expire.\nconst CertTimeInfinity = 1<<64 - 1\n\n// An Certificate represents an OpenSSH certificate as defined in\n// [PROTOCOL.certkeys]?rev=1.8.\ntype Certificate struct {\n\tNonce           []byte\n\tKey             PublicKey\n\tSerial          uint64\n\tCertType        uint32\n\tKeyId           string\n\tValidPrincipals []string\n\tValidAfter      uint64\n\tValidBefore     uint64\n\tPermissions\n\tReserved     []byte\n\tSignatureKey PublicKey\n\tSignature    *Signature\n}\n\n// genericCertData holds the key-independent part of the certificate data.\n// Overall, certificates contain an nonce, public key fields and\n// key-independent fields.\ntype genericCertData struct {\n\tSerial          uint64\n\tCertType        uint32\n\tKeyId           string\n\tValidPrincipals []byte\n\tValidAfter      uint64\n\tValidBefore     uint64\n\tCriticalOptions []byte\n\tExtensions      []byte\n\tReserved        []byte\n\tSignatureKey    []byte\n\tSignature       []byte\n}\n\nfunc marshalStringList(namelist []string) []byte {\n\tvar to []byte\n\tfor _, name := range namelist {\n\t\ts := struct{ N string }{name}\n\t\tto = append(to, Marshal(&s)...)\n\t}\n\treturn to\n}\n\ntype optionsTuple struct {\n\tKey   string\n\tValue []byte\n}\n\ntype optionsTupleValue struct {\n\tValue string\n}\n\n// serialize a map of critical options or extensions\n// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation,\n// we need two length prefixes for a non-empty string value\nfunc marshalTuples(tups map[string]string) []byte {\n\tkeys := make([]string, 0, len(tups))\n\tfor key := range tups {\n\t\tkeys = append(keys, key)\n\t}\n\tsort.Strings(keys)\n\n\tvar ret []byte\n\tfor _, key := range keys {\n\t\ts := optionsTuple{Key: key}\n\t\tif value := tups[key]; len(value) > 0 {\n\t\t\ts.Value = Marshal(&optionsTupleValue{value})\n\t\t}\n\t\tret = append(ret, Marshal(&s)...)\n\t}\n\treturn ret\n}\n\n// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation,\n// we need two length prefixes for a non-empty option value\nfunc parseTuples(in []byte) (map[string]string, error) {\n\ttups := map[string]string{}\n\tvar lastKey string\n\tvar haveLastKey bool\n\n\tfor len(in) > 0 {\n\t\tvar key, val, extra []byte\n\t\tvar ok bool\n\n\t\tif key, in, ok = parseString(in); !ok {\n\t\t\treturn nil, errShortRead\n\t\t}\n\t\tkeyStr := string(key)\n\t\t// according to [PROTOCOL.certkeys], the names must be in\n\t\t// lexical order.\n\t\tif haveLastKey && keyStr <= lastKey {\n\t\t\treturn nil, fmt.Errorf(\"ssh: certificate options are not in lexical order\")\n\t\t}\n\t\tlastKey, haveLastKey = keyStr, true\n\t\t// the next field is a data field, which if non-empty has a string embedded\n\t\tif val, in, ok = parseString(in); !ok {\n\t\t\treturn nil, errShortRead\n\t\t}\n\t\tif len(val) > 0 {\n\t\t\tval, extra, ok = parseString(val)\n\t\t\tif !ok {\n\t\t\t\treturn nil, errShortRead\n\t\t\t}\n\t\t\tif len(extra) > 0 {\n\t\t\t\treturn nil, fmt.Errorf(\"ssh: unexpected trailing data after certificate option value\")\n\t\t\t}\n\t\t\ttups[keyStr] = string(val)\n\t\t} else {\n\t\t\ttups[keyStr] = \"\"\n\t\t}\n\t}\n\treturn tups, nil\n}\n\nfunc parseCert(in []byte, privAlgo string) (*Certificate, error) {\n\tnonce, rest, ok := parseString(in)\n\tif !ok {\n\t\treturn nil, errShortRead\n\t}\n\n\tkey, rest, err := parsePubKey(rest, privAlgo)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar g genericCertData\n\tif err := Unmarshal(rest, &g); err != nil {\n\t\treturn nil, err\n\t}\n\n\tc := &Certificate{\n\t\tNonce:       nonce,\n\t\tKey:         key,\n\t\tSerial:      g.Serial,\n\t\tCertType:    g.CertType,\n\t\tKeyId:       g.KeyId,\n\t\tValidAfter:  g.ValidAfter,\n\t\tValidBefore: g.ValidBefore,\n\t}\n\n\tfor principals := g.ValidPrincipals; len(principals) > 0; {\n\t\tprincipal, rest, ok := parseString(principals)\n\t\tif !ok {\n\t\t\treturn nil, errShortRead\n\t\t}\n\t\tc.ValidPrincipals = append(c.ValidPrincipals, string(principal))\n\t\tprincipals = rest\n\t}\n\n\tc.CriticalOptions, err = parseTuples(g.CriticalOptions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc.Extensions, err = parseTuples(g.Extensions)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc.Reserved = g.Reserved\n\tk, err := ParsePublicKey(g.SignatureKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tc.SignatureKey = k\n\tc.Signature, rest, ok = parseSignatureBody(g.Signature)\n\tif !ok || len(rest) > 0 {\n\t\treturn nil, errors.New(\"ssh: signature parse error\")\n\t}\n\n\treturn c, nil\n}\n\ntype openSSHCertSigner struct {\n\tpub    *Certificate\n\tsigner Signer\n}\n\n// NewCertSigner returns a Signer that signs with the given Certificate, whose\n// private key is held by signer. It returns an error if the public key in cert\n// doesn't match the key used by signer.\nfunc NewCertSigner(cert *Certificate, signer Signer) (Signer, error) {\n\tif bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 {\n\t\treturn nil, errors.New(\"ssh: signer and cert have different public key\")\n\t}\n\n\treturn &openSSHCertSigner{cert, signer}, nil\n}\n\nfunc (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) {\n\treturn s.signer.Sign(rand, data)\n}\n\nfunc (s *openSSHCertSigner) PublicKey() PublicKey {\n\treturn s.pub\n}\n\nconst sourceAddressCriticalOption = \"source-address\"\n\n// CertChecker does the work of verifying a certificate. Its methods\n// can be plugged into ClientConfig.HostKeyCallback and\n// ServerConfig.PublicKeyCallback. For the CertChecker to work,\n// minimally, the IsAuthority callback should be set.\ntype CertChecker struct {\n\t// SupportedCriticalOptions lists the CriticalOptions that the\n\t// server application layer understands. These are only used\n\t// for user certificates.\n\tSupportedCriticalOptions []string\n\n\t// IsUserAuthority should return true if the key is recognized as an\n\t// authority for the given user certificate. This allows for\n\t// certificates to be signed by other certificates. This must be set\n\t// if this CertChecker will be checking user certificates.\n\tIsUserAuthority func(auth PublicKey) bool\n\n\t// IsHostAuthority should report whether the key is recognized as\n\t// an authority for this host. This allows for certificates to be\n\t// signed by other keys, and for those other keys to only be valid\n\t// signers for particular hostnames. This must be set if this\n\t// CertChecker will be checking host certificates.\n\tIsHostAuthority func(auth PublicKey, address string) bool\n\n\t// Clock is used for verifying time stamps. If nil, time.Now\n\t// is used.\n\tClock func() time.Time\n\n\t// UserKeyFallback is called when CertChecker.Authenticate encounters a\n\t// public key that is not a certificate. It must implement validation\n\t// of user keys or else, if nil, all such keys are rejected.\n\tUserKeyFallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)\n\n\t// HostKeyFallback is called when CertChecker.CheckHostKey encounters a\n\t// public key that is not a certificate. It must implement host key\n\t// validation or else, if nil, all such keys are rejected.\n\tHostKeyFallback HostKeyCallback\n\n\t// IsRevoked is called for each certificate so that revocation checking\n\t// can be implemented. It should return true if the given certificate\n\t// is revoked and false otherwise. If nil, no certificates are\n\t// considered to have been revoked.\n\tIsRevoked func(cert *Certificate) bool\n}\n\n// CheckHostKey checks a host key certificate. This method can be\n// plugged into ClientConfig.HostKeyCallback.\nfunc (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error {\n\tcert, ok := key.(*Certificate)\n\tif !ok {\n\t\tif c.HostKeyFallback != nil {\n\t\t\treturn c.HostKeyFallback(addr, remote, key)\n\t\t}\n\t\treturn errors.New(\"ssh: non-certificate host key\")\n\t}\n\tif cert.CertType != HostCert {\n\t\treturn fmt.Errorf(\"ssh: certificate presented as a host key has type %d\", cert.CertType)\n\t}\n\tif !c.IsHostAuthority(cert.SignatureKey, addr) {\n\t\treturn fmt.Errorf(\"ssh: no authorities for hostname: %v\", addr)\n\t}\n\n\thostname, _, err := net.SplitHostPort(addr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Pass hostname only as principal for host certificates (consistent with OpenSSH)\n\treturn c.CheckCert(hostname, cert)\n}\n\n// Authenticate checks a user certificate. Authenticate can be used as\n// a value for ServerConfig.PublicKeyCallback.\nfunc (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permissions, error) {\n\tcert, ok := pubKey.(*Certificate)\n\tif !ok {\n\t\tif c.UserKeyFallback != nil {\n\t\t\treturn c.UserKeyFallback(conn, pubKey)\n\t\t}\n\t\treturn nil, errors.New(\"ssh: normal key pairs not accepted\")\n\t}\n\n\tif cert.CertType != UserCert {\n\t\treturn nil, fmt.Errorf(\"ssh: cert has type %d\", cert.CertType)\n\t}\n\tif !c.IsUserAuthority(cert.SignatureKey) {\n\t\treturn nil, fmt.Errorf(\"ssh: certificate signed by unrecognized authority\")\n\t}\n\n\tif err := c.CheckCert(conn.User(), cert); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &cert.Permissions, nil\n}\n\n// CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and\n// the signature of the certificate.\nfunc (c *CertChecker) CheckCert(principal string, cert *Certificate) error {\n\tif c.IsRevoked != nil && c.IsRevoked(cert) {\n\t\treturn fmt.Errorf(\"ssh: certicate serial %d revoked\", cert.Serial)\n\t}\n\n\tfor opt, _ := range cert.CriticalOptions {\n\t\t// sourceAddressCriticalOption will be enforced by\n\t\t// serverAuthenticate\n\t\tif opt == sourceAddressCriticalOption {\n\t\t\tcontinue\n\t\t}\n\n\t\tfound := false\n\t\tfor _, supp := range c.SupportedCriticalOptions {\n\t\t\tif supp == opt {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\treturn fmt.Errorf(\"ssh: unsupported critical option %q in certificate\", opt)\n\t\t}\n\t}\n\n\tif len(cert.ValidPrincipals) > 0 {\n\t\t// By default, certs are valid for all users/hosts.\n\t\tfound := false\n\t\tfor _, p := range cert.ValidPrincipals {\n\t\t\tif p == principal {\n\t\t\t\tfound = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !found {\n\t\t\treturn fmt.Errorf(\"ssh: principal %q not in the set of valid principals for given certificate: %q\", principal, cert.ValidPrincipals)\n\t\t}\n\t}\n\n\tclock := c.Clock\n\tif clock == nil {\n\t\tclock = time.Now\n\t}\n\n\tunixNow := clock().Unix()\n\tif after := int64(cert.ValidAfter); after < 0 || unixNow < int64(cert.ValidAfter) {\n\t\treturn fmt.Errorf(\"ssh: cert is not yet valid\")\n\t}\n\tif before := int64(cert.ValidBefore); cert.ValidBefore != uint64(CertTimeInfinity) && (unixNow >= before || before < 0) {\n\t\treturn fmt.Errorf(\"ssh: cert has expired\")\n\t}\n\tif err := cert.SignatureKey.Verify(cert.bytesForSigning(), cert.Signature); err != nil {\n\t\treturn fmt.Errorf(\"ssh: certificate signature does not verify\")\n\t}\n\n\treturn nil\n}\n\n// SignCert sets c.SignatureKey to the authority's public key and stores a\n// Signature, by authority, in the certificate.\nfunc (c *Certificate) SignCert(rand io.Reader, authority Signer) error {\n\tc.Nonce = make([]byte, 32)\n\tif _, err := io.ReadFull(rand, c.Nonce); err != nil {\n\t\treturn err\n\t}\n\tc.SignatureKey = authority.PublicKey()\n\n\tsig, err := authority.Sign(rand, c.bytesForSigning())\n\tif err != nil {\n\t\treturn err\n\t}\n\tc.Signature = sig\n\treturn nil\n}\n\nvar certAlgoNames = map[string]string{\n\tKeyAlgoRSA:      CertAlgoRSAv01,\n\tKeyAlgoDSA:      CertAlgoDSAv01,\n\tKeyAlgoECDSA256: CertAlgoECDSA256v01,\n\tKeyAlgoECDSA384: CertAlgoECDSA384v01,\n\tKeyAlgoECDSA521: CertAlgoECDSA521v01,\n\tKeyAlgoED25519:  CertAlgoED25519v01,\n}\n\n// certToPrivAlgo returns the underlying algorithm for a certificate algorithm.\n// Panics if a non-certificate algorithm is passed.\nfunc certToPrivAlgo(algo string) string {\n\tfor privAlgo, pubAlgo := range certAlgoNames {\n\t\tif pubAlgo == algo {\n\t\t\treturn privAlgo\n\t\t}\n\t}\n\tpanic(\"unknown cert algorithm\")\n}\n\nfunc (cert *Certificate) bytesForSigning() []byte {\n\tc2 := *cert\n\tc2.Signature = nil\n\tout := c2.Marshal()\n\t// Drop trailing signature length.\n\treturn out[:len(out)-4]\n}\n\n// Marshal serializes c into OpenSSH's wire format. It is part of the\n// PublicKey interface.\nfunc (c *Certificate) Marshal() []byte {\n\tgeneric := genericCertData{\n\t\tSerial:          c.Serial,\n\t\tCertType:        c.CertType,\n\t\tKeyId:           c.KeyId,\n\t\tValidPrincipals: marshalStringList(c.ValidPrincipals),\n\t\tValidAfter:      uint64(c.ValidAfter),\n\t\tValidBefore:     uint64(c.ValidBefore),\n\t\tCriticalOptions: marshalTuples(c.CriticalOptions),\n\t\tExtensions:      marshalTuples(c.Extensions),\n\t\tReserved:        c.Reserved,\n\t\tSignatureKey:    c.SignatureKey.Marshal(),\n\t}\n\tif c.Signature != nil {\n\t\tgeneric.Signature = Marshal(c.Signature)\n\t}\n\tgenericBytes := Marshal(&generic)\n\tkeyBytes := c.Key.Marshal()\n\t_, keyBytes, _ = parseString(keyBytes)\n\tprefix := Marshal(&struct {\n\t\tName  string\n\t\tNonce []byte\n\t\tKey   []byte `ssh:\"rest\"`\n\t}{c.Type(), c.Nonce, keyBytes})\n\n\tresult := make([]byte, 0, len(prefix)+len(genericBytes))\n\tresult = append(result, prefix...)\n\tresult = append(result, genericBytes...)\n\treturn result\n}\n\n// Type returns the key name. It is part of the PublicKey interface.\nfunc (c *Certificate) Type() string {\n\talgo, ok := certAlgoNames[c.Key.Type()]\n\tif !ok {\n\t\tpanic(\"unknown cert key type \" + c.Key.Type())\n\t}\n\treturn algo\n}\n\n// Verify verifies a signature against the certificate's public\n// key. It is part of the PublicKey interface.\nfunc (c *Certificate) Verify(data []byte, sig *Signature) error {\n\treturn c.Key.Verify(data, sig)\n}\n\nfunc parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) {\n\tformat, in, ok := parseString(in)\n\tif !ok {\n\t\treturn\n\t}\n\n\tout = &Signature{\n\t\tFormat: string(format),\n\t}\n\n\tif out.Blob, in, ok = parseString(in); !ok {\n\t\treturn\n\t}\n\n\treturn out, in, ok\n}\n\nfunc parseSignature(in []byte) (out *Signature, rest []byte, ok bool) {\n\tsigBytes, rest, ok := parseString(in)\n\tif !ok {\n\t\treturn\n\t}\n\n\tout, trailing, ok := parseSignatureBody(sigBytes)\n\tif !ok || len(trailing) > 0 {\n\t\treturn nil, nil, false\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/channel.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"sync\"\n)\n\nconst (\n\tminPacketLength = 9\n\t// channelMaxPacket contains the maximum number of bytes that will be\n\t// sent in a single packet. As per RFC 4253, section 6.1, 32k is also\n\t// the minimum.\n\tchannelMaxPacket = 1 << 15\n\t// We follow OpenSSH here.\n\tchannelWindowSize = 64 * channelMaxPacket\n)\n\n// NewChannel represents an incoming request to a channel. It must either be\n// accepted for use by calling Accept, or rejected by calling Reject.\ntype NewChannel interface {\n\t// Accept accepts the channel creation request. It returns the Channel\n\t// and a Go channel containing SSH requests. The Go channel must be\n\t// serviced otherwise the Channel will hang.\n\tAccept() (Channel, <-chan *Request, error)\n\n\t// Reject rejects the channel creation request. After calling\n\t// this, no other methods on the Channel may be called.\n\tReject(reason RejectionReason, message string) error\n\n\t// ChannelType returns the type of the channel, as supplied by the\n\t// client.\n\tChannelType() string\n\n\t// ExtraData returns the arbitrary payload for this channel, as supplied\n\t// by the client. This data is specific to the channel type.\n\tExtraData() []byte\n}\n\n// A Channel is an ordered, reliable, flow-controlled, duplex stream\n// that is multiplexed over an SSH connection.\ntype Channel interface {\n\t// Read reads up to len(data) bytes from the channel.\n\tRead(data []byte) (int, error)\n\n\t// Write writes len(data) bytes to the channel.\n\tWrite(data []byte) (int, error)\n\n\t// Close signals end of channel use. No data may be sent after this\n\t// call.\n\tClose() error\n\n\t// CloseWrite signals the end of sending in-band\n\t// data. Requests may still be sent, and the other side may\n\t// still send data\n\tCloseWrite() error\n\n\t// SendRequest sends a channel request.  If wantReply is true,\n\t// it will wait for a reply and return the result as a\n\t// boolean, otherwise the return value will be false. Channel\n\t// requests are out-of-band messages so they may be sent even\n\t// if the data stream is closed or blocked by flow control.\n\t// If the channel is closed before a reply is returned, io.EOF\n\t// is returned.\n\tSendRequest(name string, wantReply bool, payload []byte) (bool, error)\n\n\t// Stderr returns an io.ReadWriter that writes to this channel\n\t// with the extended data type set to stderr. Stderr may\n\t// safely be read and written from a different goroutine than\n\t// Read and Write respectively.\n\tStderr() io.ReadWriter\n}\n\n// Request is a request sent outside of the normal stream of\n// data. Requests can either be specific to an SSH channel, or they\n// can be global.\ntype Request struct {\n\tType      string\n\tWantReply bool\n\tPayload   []byte\n\n\tch  *channel\n\tmux *mux\n}\n\n// Reply sends a response to a request. It must be called for all requests\n// where WantReply is true and is a no-op otherwise. The payload argument is\n// ignored for replies to channel-specific requests.\nfunc (r *Request) Reply(ok bool, payload []byte) error {\n\tif !r.WantReply {\n\t\treturn nil\n\t}\n\n\tif r.ch == nil {\n\t\treturn r.mux.ackRequest(ok, payload)\n\t}\n\n\treturn r.ch.ackRequest(ok)\n}\n\n// RejectionReason is an enumeration used when rejecting channel creation\n// requests. See RFC 4254, section 5.1.\ntype RejectionReason uint32\n\nconst (\n\tProhibited RejectionReason = iota + 1\n\tConnectionFailed\n\tUnknownChannelType\n\tResourceShortage\n)\n\n// String converts the rejection reason to human readable form.\nfunc (r RejectionReason) String() string {\n\tswitch r {\n\tcase Prohibited:\n\t\treturn \"administratively prohibited\"\n\tcase ConnectionFailed:\n\t\treturn \"connect failed\"\n\tcase UnknownChannelType:\n\t\treturn \"unknown channel type\"\n\tcase ResourceShortage:\n\t\treturn \"resource shortage\"\n\t}\n\treturn fmt.Sprintf(\"unknown reason %d\", int(r))\n}\n\nfunc min(a uint32, b int) uint32 {\n\tif a < uint32(b) {\n\t\treturn a\n\t}\n\treturn uint32(b)\n}\n\ntype channelDirection uint8\n\nconst (\n\tchannelInbound channelDirection = iota\n\tchannelOutbound\n)\n\n// channel is an implementation of the Channel interface that works\n// with the mux class.\ntype channel struct {\n\t// R/O after creation\n\tchanType          string\n\textraData         []byte\n\tlocalId, remoteId uint32\n\n\t// maxIncomingPayload and maxRemotePayload are the maximum\n\t// payload sizes of normal and extended data packets for\n\t// receiving and sending, respectively. The wire packet will\n\t// be 9 or 13 bytes larger (excluding encryption overhead).\n\tmaxIncomingPayload uint32\n\tmaxRemotePayload   uint32\n\n\tmux *mux\n\n\t// decided is set to true if an accept or reject message has been sent\n\t// (for outbound channels) or received (for inbound channels).\n\tdecided bool\n\n\t// direction contains either channelOutbound, for channels created\n\t// locally, or channelInbound, for channels created by the peer.\n\tdirection channelDirection\n\n\t// Pending internal channel messages.\n\tmsg chan interface{}\n\n\t// Since requests have no ID, there can be only one request\n\t// with WantReply=true outstanding.  This lock is held by a\n\t// goroutine that has such an outgoing request pending.\n\tsentRequestMu sync.Mutex\n\n\tincomingRequests chan *Request\n\n\tsentEOF bool\n\n\t// thread-safe data\n\tremoteWin  window\n\tpending    *buffer\n\textPending *buffer\n\n\t// windowMu protects myWindow, the flow-control window.\n\twindowMu sync.Mutex\n\tmyWindow uint32\n\n\t// writeMu serializes calls to mux.conn.writePacket() and\n\t// protects sentClose and packetPool. This mutex must be\n\t// different from windowMu, as writePacket can block if there\n\t// is a key exchange pending.\n\twriteMu   sync.Mutex\n\tsentClose bool\n\n\t// packetPool has a buffer for each extended channel ID to\n\t// save allocations during writes.\n\tpacketPool map[uint32][]byte\n}\n\n// writePacket sends a packet. If the packet is a channel close, it updates\n// sentClose. This method takes the lock c.writeMu.\nfunc (c *channel) writePacket(packet []byte) error {\n\tc.writeMu.Lock()\n\tif c.sentClose {\n\t\tc.writeMu.Unlock()\n\t\treturn io.EOF\n\t}\n\tc.sentClose = (packet[0] == msgChannelClose)\n\terr := c.mux.conn.writePacket(packet)\n\tc.writeMu.Unlock()\n\treturn err\n}\n\nfunc (c *channel) sendMessage(msg interface{}) error {\n\tif debugMux {\n\t\tlog.Printf(\"send(%d): %#v\", c.mux.chanList.offset, msg)\n\t}\n\n\tp := Marshal(msg)\n\tbinary.BigEndian.PutUint32(p[1:], c.remoteId)\n\treturn c.writePacket(p)\n}\n\n// WriteExtended writes data to a specific extended stream. These streams are\n// used, for example, for stderr.\nfunc (c *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) {\n\tif c.sentEOF {\n\t\treturn 0, io.EOF\n\t}\n\t// 1 byte message type, 4 bytes remoteId, 4 bytes data length\n\topCode := byte(msgChannelData)\n\theaderLength := uint32(9)\n\tif extendedCode > 0 {\n\t\theaderLength += 4\n\t\topCode = msgChannelExtendedData\n\t}\n\n\tc.writeMu.Lock()\n\tpacket := c.packetPool[extendedCode]\n\t// We don't remove the buffer from packetPool, so\n\t// WriteExtended calls from different goroutines will be\n\t// flagged as errors by the race detector.\n\tc.writeMu.Unlock()\n\n\tfor len(data) > 0 {\n\t\tspace := min(c.maxRemotePayload, len(data))\n\t\tif space, err = c.remoteWin.reserve(space); err != nil {\n\t\t\treturn n, err\n\t\t}\n\t\tif want := headerLength + space; uint32(cap(packet)) < want {\n\t\t\tpacket = make([]byte, want)\n\t\t} else {\n\t\t\tpacket = packet[:want]\n\t\t}\n\n\t\ttodo := data[:space]\n\n\t\tpacket[0] = opCode\n\t\tbinary.BigEndian.PutUint32(packet[1:], c.remoteId)\n\t\tif extendedCode > 0 {\n\t\t\tbinary.BigEndian.PutUint32(packet[5:], uint32(extendedCode))\n\t\t}\n\t\tbinary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo)))\n\t\tcopy(packet[headerLength:], todo)\n\t\tif err = c.writePacket(packet); err != nil {\n\t\t\treturn n, err\n\t\t}\n\n\t\tn += len(todo)\n\t\tdata = data[len(todo):]\n\t}\n\n\tc.writeMu.Lock()\n\tc.packetPool[extendedCode] = packet\n\tc.writeMu.Unlock()\n\n\treturn n, err\n}\n\nfunc (c *channel) handleData(packet []byte) error {\n\theaderLen := 9\n\tisExtendedData := packet[0] == msgChannelExtendedData\n\tif isExtendedData {\n\t\theaderLen = 13\n\t}\n\tif len(packet) < headerLen {\n\t\t// malformed data packet\n\t\treturn parseError(packet[0])\n\t}\n\n\tvar extended uint32\n\tif isExtendedData {\n\t\textended = binary.BigEndian.Uint32(packet[5:])\n\t}\n\n\tlength := binary.BigEndian.Uint32(packet[headerLen-4 : headerLen])\n\tif length == 0 {\n\t\treturn nil\n\t}\n\tif length > c.maxIncomingPayload {\n\t\t// TODO(hanwen): should send Disconnect?\n\t\treturn errors.New(\"ssh: incoming packet exceeds maximum payload size\")\n\t}\n\n\tdata := packet[headerLen:]\n\tif length != uint32(len(data)) {\n\t\treturn errors.New(\"ssh: wrong packet length\")\n\t}\n\n\tc.windowMu.Lock()\n\tif c.myWindow < length {\n\t\tc.windowMu.Unlock()\n\t\t// TODO(hanwen): should send Disconnect with reason?\n\t\treturn errors.New(\"ssh: remote side wrote too much\")\n\t}\n\tc.myWindow -= length\n\tc.windowMu.Unlock()\n\n\tif extended == 1 {\n\t\tc.extPending.write(data)\n\t} else if extended > 0 {\n\t\t// discard other extended data.\n\t} else {\n\t\tc.pending.write(data)\n\t}\n\treturn nil\n}\n\nfunc (c *channel) adjustWindow(n uint32) error {\n\tc.windowMu.Lock()\n\t// Since myWindow is managed on our side, and can never exceed\n\t// the initial window setting, we don't worry about overflow.\n\tc.myWindow += uint32(n)\n\tc.windowMu.Unlock()\n\treturn c.sendMessage(windowAdjustMsg{\n\t\tAdditionalBytes: uint32(n),\n\t})\n}\n\nfunc (c *channel) ReadExtended(data []byte, extended uint32) (n int, err error) {\n\tswitch extended {\n\tcase 1:\n\t\tn, err = c.extPending.Read(data)\n\tcase 0:\n\t\tn, err = c.pending.Read(data)\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"ssh: extended code %d unimplemented\", extended)\n\t}\n\n\tif n > 0 {\n\t\terr = c.adjustWindow(uint32(n))\n\t\t// sendWindowAdjust can return io.EOF if the remote\n\t\t// peer has closed the connection, however we want to\n\t\t// defer forwarding io.EOF to the caller of Read until\n\t\t// the buffer has been drained.\n\t\tif n > 0 && err == io.EOF {\n\t\t\terr = nil\n\t\t}\n\t}\n\n\treturn n, err\n}\n\nfunc (c *channel) close() {\n\tc.pending.eof()\n\tc.extPending.eof()\n\tclose(c.msg)\n\tclose(c.incomingRequests)\n\tc.writeMu.Lock()\n\t// This is not necessary for a normal channel teardown, but if\n\t// there was another error, it is.\n\tc.sentClose = true\n\tc.writeMu.Unlock()\n\t// Unblock writers.\n\tc.remoteWin.close()\n}\n\n// responseMessageReceived is called when a success or failure message is\n// received on a channel to check that such a message is reasonable for the\n// given channel.\nfunc (c *channel) responseMessageReceived() error {\n\tif c.direction == channelInbound {\n\t\treturn errors.New(\"ssh: channel response message received on inbound channel\")\n\t}\n\tif c.decided {\n\t\treturn errors.New(\"ssh: duplicate response received for channel\")\n\t}\n\tc.decided = true\n\treturn nil\n}\n\nfunc (c *channel) handlePacket(packet []byte) error {\n\tswitch packet[0] {\n\tcase msgChannelData, msgChannelExtendedData:\n\t\treturn c.handleData(packet)\n\tcase msgChannelClose:\n\t\tc.sendMessage(channelCloseMsg{PeersId: c.remoteId})\n\t\tc.mux.chanList.remove(c.localId)\n\t\tc.close()\n\t\treturn nil\n\tcase msgChannelEOF:\n\t\t// RFC 4254 is mute on how EOF affects dataExt messages but\n\t\t// it is logical to signal EOF at the same time.\n\t\tc.extPending.eof()\n\t\tc.pending.eof()\n\t\treturn nil\n\t}\n\n\tdecoded, err := decode(packet)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch msg := decoded.(type) {\n\tcase *channelOpenFailureMsg:\n\t\tif err := c.responseMessageReceived(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.mux.chanList.remove(msg.PeersId)\n\t\tc.msg <- msg\n\tcase *channelOpenConfirmMsg:\n\t\tif err := c.responseMessageReceived(); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 {\n\t\t\treturn fmt.Errorf(\"ssh: invalid MaxPacketSize %d from peer\", msg.MaxPacketSize)\n\t\t}\n\t\tc.remoteId = msg.MyId\n\t\tc.maxRemotePayload = msg.MaxPacketSize\n\t\tc.remoteWin.add(msg.MyWindow)\n\t\tc.msg <- msg\n\tcase *windowAdjustMsg:\n\t\tif !c.remoteWin.add(msg.AdditionalBytes) {\n\t\t\treturn fmt.Errorf(\"ssh: invalid window update for %d bytes\", msg.AdditionalBytes)\n\t\t}\n\tcase *channelRequestMsg:\n\t\treq := Request{\n\t\t\tType:      msg.Request,\n\t\t\tWantReply: msg.WantReply,\n\t\t\tPayload:   msg.RequestSpecificData,\n\t\t\tch:        c,\n\t\t}\n\n\t\tc.incomingRequests <- &req\n\tdefault:\n\t\tc.msg <- msg\n\t}\n\treturn nil\n}\n\nfunc (m *mux) newChannel(chanType string, direction channelDirection, extraData []byte) *channel {\n\tch := &channel{\n\t\tremoteWin:        window{Cond: newCond()},\n\t\tmyWindow:         channelWindowSize,\n\t\tpending:          newBuffer(),\n\t\textPending:       newBuffer(),\n\t\tdirection:        direction,\n\t\tincomingRequests: make(chan *Request, chanSize),\n\t\tmsg:              make(chan interface{}, chanSize),\n\t\tchanType:         chanType,\n\t\textraData:        extraData,\n\t\tmux:              m,\n\t\tpacketPool:       make(map[uint32][]byte),\n\t}\n\tch.localId = m.chanList.add(ch)\n\treturn ch\n}\n\nvar errUndecided = errors.New(\"ssh: must Accept or Reject channel\")\nvar errDecidedAlready = errors.New(\"ssh: can call Accept or Reject only once\")\n\ntype extChannel struct {\n\tcode uint32\n\tch   *channel\n}\n\nfunc (e *extChannel) Write(data []byte) (n int, err error) {\n\treturn e.ch.WriteExtended(data, e.code)\n}\n\nfunc (e *extChannel) Read(data []byte) (n int, err error) {\n\treturn e.ch.ReadExtended(data, e.code)\n}\n\nfunc (c *channel) Accept() (Channel, <-chan *Request, error) {\n\tif c.decided {\n\t\treturn nil, nil, errDecidedAlready\n\t}\n\tc.maxIncomingPayload = channelMaxPacket\n\tconfirm := channelOpenConfirmMsg{\n\t\tPeersId:       c.remoteId,\n\t\tMyId:          c.localId,\n\t\tMyWindow:      c.myWindow,\n\t\tMaxPacketSize: c.maxIncomingPayload,\n\t}\n\tc.decided = true\n\tif err := c.sendMessage(confirm); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn c, c.incomingRequests, nil\n}\n\nfunc (ch *channel) Reject(reason RejectionReason, message string) error {\n\tif ch.decided {\n\t\treturn errDecidedAlready\n\t}\n\treject := channelOpenFailureMsg{\n\t\tPeersId:  ch.remoteId,\n\t\tReason:   reason,\n\t\tMessage:  message,\n\t\tLanguage: \"en\",\n\t}\n\tch.decided = true\n\treturn ch.sendMessage(reject)\n}\n\nfunc (ch *channel) Read(data []byte) (int, error) {\n\tif !ch.decided {\n\t\treturn 0, errUndecided\n\t}\n\treturn ch.ReadExtended(data, 0)\n}\n\nfunc (ch *channel) Write(data []byte) (int, error) {\n\tif !ch.decided {\n\t\treturn 0, errUndecided\n\t}\n\treturn ch.WriteExtended(data, 0)\n}\n\nfunc (ch *channel) CloseWrite() error {\n\tif !ch.decided {\n\t\treturn errUndecided\n\t}\n\tch.sentEOF = true\n\treturn ch.sendMessage(channelEOFMsg{\n\t\tPeersId: ch.remoteId})\n}\n\nfunc (ch *channel) Close() error {\n\tif !ch.decided {\n\t\treturn errUndecided\n\t}\n\n\treturn ch.sendMessage(channelCloseMsg{\n\t\tPeersId: ch.remoteId})\n}\n\n// Extended returns an io.ReadWriter that sends and receives data on the given,\n// SSH extended stream. Such streams are used, for example, for stderr.\nfunc (ch *channel) Extended(code uint32) io.ReadWriter {\n\tif !ch.decided {\n\t\treturn nil\n\t}\n\treturn &extChannel{code, ch}\n}\n\nfunc (ch *channel) Stderr() io.ReadWriter {\n\treturn ch.Extended(1)\n}\n\nfunc (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (bool, error) {\n\tif !ch.decided {\n\t\treturn false, errUndecided\n\t}\n\n\tif wantReply {\n\t\tch.sentRequestMu.Lock()\n\t\tdefer ch.sentRequestMu.Unlock()\n\t}\n\n\tmsg := channelRequestMsg{\n\t\tPeersId:             ch.remoteId,\n\t\tRequest:             name,\n\t\tWantReply:           wantReply,\n\t\tRequestSpecificData: payload,\n\t}\n\n\tif err := ch.sendMessage(msg); err != nil {\n\t\treturn false, err\n\t}\n\n\tif wantReply {\n\t\tm, ok := (<-ch.msg)\n\t\tif !ok {\n\t\t\treturn false, io.EOF\n\t\t}\n\t\tswitch m.(type) {\n\t\tcase *channelRequestFailureMsg:\n\t\t\treturn false, nil\n\t\tcase *channelRequestSuccessMsg:\n\t\t\treturn true, nil\n\t\tdefault:\n\t\t\treturn false, fmt.Errorf(\"ssh: unexpected response to channel request: %#v\", m)\n\t\t}\n\t}\n\n\treturn false, nil\n}\n\n// ackRequest either sends an ack or nack to the channel request.\nfunc (ch *channel) ackRequest(ok bool) error {\n\tif !ch.decided {\n\t\treturn errUndecided\n\t}\n\n\tvar msg interface{}\n\tif !ok {\n\t\tmsg = channelRequestFailureMsg{\n\t\t\tPeersId: ch.remoteId,\n\t\t}\n\t} else {\n\t\tmsg = channelRequestSuccessMsg{\n\t\t\tPeersId: ch.remoteId,\n\t\t}\n\t}\n\treturn ch.sendMessage(msg)\n}\n\nfunc (ch *channel) ChannelType() string {\n\treturn ch.chanType\n}\n\nfunc (ch *channel) ExtraData() []byte {\n\treturn ch.extraData\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/cipher.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/des\"\n\t\"crypto/rc4\"\n\t\"crypto/subtle\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"io/ioutil\"\n)\n\nconst (\n\tpacketSizeMultiple = 16 // TODO(huin) this should be determined by the cipher.\n\n\t// RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations\n\t// MUST be able to process (plus a few more kilobytes for padding and mac). The RFC\n\t// indicates implementations SHOULD be able to handle larger packet sizes, but then\n\t// waffles on about reasonable limits.\n\t//\n\t// OpenSSH caps their maxPacket at 256kB so we choose to do\n\t// the same. maxPacket is also used to ensure that uint32\n\t// length fields do not overflow, so it should remain well\n\t// below 4G.\n\tmaxPacket = 256 * 1024\n)\n\n// noneCipher implements cipher.Stream and provides no encryption. It is used\n// by the transport before the first key-exchange.\ntype noneCipher struct{}\n\nfunc (c noneCipher) XORKeyStream(dst, src []byte) {\n\tcopy(dst, src)\n}\n\nfunc newAESCTR(key, iv []byte) (cipher.Stream, error) {\n\tc, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn cipher.NewCTR(c, iv), nil\n}\n\nfunc newRC4(key, iv []byte) (cipher.Stream, error) {\n\treturn rc4.NewCipher(key)\n}\n\ntype streamCipherMode struct {\n\tkeySize    int\n\tivSize     int\n\tskip       int\n\tcreateFunc func(key, iv []byte) (cipher.Stream, error)\n}\n\nfunc (c *streamCipherMode) createStream(key, iv []byte) (cipher.Stream, error) {\n\tif len(key) < c.keySize {\n\t\tpanic(\"ssh: key length too small for cipher\")\n\t}\n\tif len(iv) < c.ivSize {\n\t\tpanic(\"ssh: iv too small for cipher\")\n\t}\n\n\tstream, err := c.createFunc(key[:c.keySize], iv[:c.ivSize])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar streamDump []byte\n\tif c.skip > 0 {\n\t\tstreamDump = make([]byte, 512)\n\t}\n\n\tfor remainingToDump := c.skip; remainingToDump > 0; {\n\t\tdumpThisTime := remainingToDump\n\t\tif dumpThisTime > len(streamDump) {\n\t\t\tdumpThisTime = len(streamDump)\n\t\t}\n\t\tstream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime])\n\t\tremainingToDump -= dumpThisTime\n\t}\n\n\treturn stream, nil\n}\n\n// cipherModes documents properties of supported ciphers. Ciphers not included\n// are not supported and will not be negotiated, even if explicitly requested in\n// ClientConfig.Crypto.Ciphers.\nvar cipherModes = map[string]*streamCipherMode{\n\t// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms\n\t// are defined in the order specified in the RFC.\n\t\"aes128-ctr\": {16, aes.BlockSize, 0, newAESCTR},\n\t\"aes192-ctr\": {24, aes.BlockSize, 0, newAESCTR},\n\t\"aes256-ctr\": {32, aes.BlockSize, 0, newAESCTR},\n\n\t// Ciphers from RFC4345, which introduces security-improved arcfour ciphers.\n\t// They are defined in the order specified in the RFC.\n\t\"arcfour128\": {16, 0, 1536, newRC4},\n\t\"arcfour256\": {32, 0, 1536, newRC4},\n\n\t// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.\n\t// Note that this cipher is not safe, as stated in RFC 4253: \"Arcfour (and\n\t// RC4) has problems with weak keys, and should be used with caution.\"\n\t// RFC4345 introduces improved versions of Arcfour.\n\t\"arcfour\": {16, 0, 0, newRC4},\n\n\t// AES-GCM is not a stream cipher, so it is constructed with a\n\t// special case. If we add any more non-stream ciphers, we\n\t// should invest a cleaner way to do this.\n\tgcmCipherID: {16, 12, 0, nil},\n\n\t// CBC mode is insecure and so is not included in the default config.\n\t// (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely\n\t// needed, it's possible to specify a custom Config to enable it.\n\t// You should expect that an active attacker can recover plaintext if\n\t// you do.\n\taes128cbcID: {16, aes.BlockSize, 0, nil},\n\n\t// 3des-cbc is insecure and is disabled by default.\n\ttripledescbcID: {24, des.BlockSize, 0, nil},\n}\n\n// prefixLen is the length of the packet prefix that contains the packet length\n// and number of padding bytes.\nconst prefixLen = 5\n\n// streamPacketCipher is a packetCipher using a stream cipher.\ntype streamPacketCipher struct {\n\tmac    hash.Hash\n\tcipher cipher.Stream\n\tetm    bool\n\n\t// The following members are to avoid per-packet allocations.\n\tprefix      [prefixLen]byte\n\tseqNumBytes [4]byte\n\tpadding     [2 * packetSizeMultiple]byte\n\tpacketData  []byte\n\tmacResult   []byte\n}\n\n// readPacket reads and decrypt a single packet from the reader argument.\nfunc (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) {\n\tif _, err := io.ReadFull(r, s.prefix[:]); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar encryptedPaddingLength [1]byte\n\tif s.mac != nil && s.etm {\n\t\tcopy(encryptedPaddingLength[:], s.prefix[4:5])\n\t\ts.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5])\n\t} else {\n\t\ts.cipher.XORKeyStream(s.prefix[:], s.prefix[:])\n\t}\n\n\tlength := binary.BigEndian.Uint32(s.prefix[0:4])\n\tpaddingLength := uint32(s.prefix[4])\n\n\tvar macSize uint32\n\tif s.mac != nil {\n\t\ts.mac.Reset()\n\t\tbinary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum)\n\t\ts.mac.Write(s.seqNumBytes[:])\n\t\tif s.etm {\n\t\t\ts.mac.Write(s.prefix[:4])\n\t\t\ts.mac.Write(encryptedPaddingLength[:])\n\t\t} else {\n\t\t\ts.mac.Write(s.prefix[:])\n\t\t}\n\t\tmacSize = uint32(s.mac.Size())\n\t}\n\n\tif length <= paddingLength+1 {\n\t\treturn nil, errors.New(\"ssh: invalid packet length, packet too small\")\n\t}\n\n\tif length > maxPacket {\n\t\treturn nil, errors.New(\"ssh: invalid packet length, packet too large\")\n\t}\n\n\t// the maxPacket check above ensures that length-1+macSize\n\t// does not overflow.\n\tif uint32(cap(s.packetData)) < length-1+macSize {\n\t\ts.packetData = make([]byte, length-1+macSize)\n\t} else {\n\t\ts.packetData = s.packetData[:length-1+macSize]\n\t}\n\n\tif _, err := io.ReadFull(r, s.packetData); err != nil {\n\t\treturn nil, err\n\t}\n\tmac := s.packetData[length-1:]\n\tdata := s.packetData[:length-1]\n\n\tif s.mac != nil && s.etm {\n\t\ts.mac.Write(data)\n\t}\n\n\ts.cipher.XORKeyStream(data, data)\n\n\tif s.mac != nil {\n\t\tif !s.etm {\n\t\t\ts.mac.Write(data)\n\t\t}\n\t\ts.macResult = s.mac.Sum(s.macResult[:0])\n\t\tif subtle.ConstantTimeCompare(s.macResult, mac) != 1 {\n\t\t\treturn nil, errors.New(\"ssh: MAC failure\")\n\t\t}\n\t}\n\n\treturn s.packetData[:length-paddingLength-1], nil\n}\n\n// writePacket encrypts and sends a packet of data to the writer argument\nfunc (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error {\n\tif len(packet) > maxPacket {\n\t\treturn errors.New(\"ssh: packet too large\")\n\t}\n\n\taadlen := 0\n\tif s.mac != nil && s.etm {\n\t\t// packet length is not encrypted for EtM modes\n\t\taadlen = 4\n\t}\n\n\tpaddingLength := packetSizeMultiple - (prefixLen+len(packet)-aadlen)%packetSizeMultiple\n\tif paddingLength < 4 {\n\t\tpaddingLength += packetSizeMultiple\n\t}\n\n\tlength := len(packet) + 1 + paddingLength\n\tbinary.BigEndian.PutUint32(s.prefix[:], uint32(length))\n\ts.prefix[4] = byte(paddingLength)\n\tpadding := s.padding[:paddingLength]\n\tif _, err := io.ReadFull(rand, padding); err != nil {\n\t\treturn err\n\t}\n\n\tif s.mac != nil {\n\t\ts.mac.Reset()\n\t\tbinary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum)\n\t\ts.mac.Write(s.seqNumBytes[:])\n\n\t\tif s.etm {\n\t\t\t// For EtM algorithms, the packet length must stay unencrypted,\n\t\t\t// but the following data (padding length) must be encrypted\n\t\t\ts.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5])\n\t\t}\n\n\t\ts.mac.Write(s.prefix[:])\n\n\t\tif !s.etm {\n\t\t\t// For non-EtM algorithms, the algorithm is applied on unencrypted data\n\t\t\ts.mac.Write(packet)\n\t\t\ts.mac.Write(padding)\n\t\t}\n\t}\n\n\tif !(s.mac != nil && s.etm) {\n\t\t// For EtM algorithms, the padding length has already been encrypted\n\t\t// and the packet length must remain unencrypted\n\t\ts.cipher.XORKeyStream(s.prefix[:], s.prefix[:])\n\t}\n\n\ts.cipher.XORKeyStream(packet, packet)\n\ts.cipher.XORKeyStream(padding, padding)\n\n\tif s.mac != nil && s.etm {\n\t\t// For EtM algorithms, packet and padding must be encrypted\n\t\ts.mac.Write(packet)\n\t\ts.mac.Write(padding)\n\t}\n\n\tif _, err := w.Write(s.prefix[:]); err != nil {\n\t\treturn err\n\t}\n\tif _, err := w.Write(packet); err != nil {\n\t\treturn err\n\t}\n\tif _, err := w.Write(padding); err != nil {\n\t\treturn err\n\t}\n\n\tif s.mac != nil {\n\t\ts.macResult = s.mac.Sum(s.macResult[:0])\n\t\tif _, err := w.Write(s.macResult); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\ntype gcmCipher struct {\n\taead   cipher.AEAD\n\tprefix [4]byte\n\tiv     []byte\n\tbuf    []byte\n}\n\nfunc newGCMCipher(iv, key []byte) (packetCipher, error) {\n\tc, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taead, err := cipher.NewGCM(c)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &gcmCipher{\n\t\taead: aead,\n\t\tiv:   iv,\n\t}, nil\n}\n\nconst gcmTagSize = 16\n\nfunc (c *gcmCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error {\n\t// Pad out to multiple of 16 bytes. This is different from the\n\t// stream cipher because that encrypts the length too.\n\tpadding := byte(packetSizeMultiple - (1+len(packet))%packetSizeMultiple)\n\tif padding < 4 {\n\t\tpadding += packetSizeMultiple\n\t}\n\n\tlength := uint32(len(packet) + int(padding) + 1)\n\tbinary.BigEndian.PutUint32(c.prefix[:], length)\n\tif _, err := w.Write(c.prefix[:]); err != nil {\n\t\treturn err\n\t}\n\n\tif cap(c.buf) < int(length) {\n\t\tc.buf = make([]byte, length)\n\t} else {\n\t\tc.buf = c.buf[:length]\n\t}\n\n\tc.buf[0] = padding\n\tcopy(c.buf[1:], packet)\n\tif _, err := io.ReadFull(rand, c.buf[1+len(packet):]); err != nil {\n\t\treturn err\n\t}\n\tc.buf = c.aead.Seal(c.buf[:0], c.iv, c.buf, c.prefix[:])\n\tif _, err := w.Write(c.buf); err != nil {\n\t\treturn err\n\t}\n\tc.incIV()\n\n\treturn nil\n}\n\nfunc (c *gcmCipher) incIV() {\n\tfor i := 4 + 7; i >= 4; i-- {\n\t\tc.iv[i]++\n\t\tif c.iv[i] != 0 {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) {\n\tif _, err := io.ReadFull(r, c.prefix[:]); err != nil {\n\t\treturn nil, err\n\t}\n\tlength := binary.BigEndian.Uint32(c.prefix[:])\n\tif length > maxPacket {\n\t\treturn nil, errors.New(\"ssh: max packet length exceeded.\")\n\t}\n\n\tif cap(c.buf) < int(length+gcmTagSize) {\n\t\tc.buf = make([]byte, length+gcmTagSize)\n\t} else {\n\t\tc.buf = c.buf[:length+gcmTagSize]\n\t}\n\n\tif _, err := io.ReadFull(r, c.buf); err != nil {\n\t\treturn nil, err\n\t}\n\n\tplain, err := c.aead.Open(c.buf[:0], c.iv, c.buf, c.prefix[:])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc.incIV()\n\n\tpadding := plain[0]\n\tif padding < 4 {\n\t\t// padding is a byte, so it automatically satisfies\n\t\t// the maximum size, which is 255.\n\t\treturn nil, fmt.Errorf(\"ssh: illegal padding %d\", padding)\n\t}\n\n\tif int(padding+1) >= len(plain) {\n\t\treturn nil, fmt.Errorf(\"ssh: padding %d too large\", padding)\n\t}\n\tplain = plain[1 : length-uint32(padding)]\n\treturn plain, nil\n}\n\n// cbcCipher implements aes128-cbc cipher defined in RFC 4253 section 6.1\ntype cbcCipher struct {\n\tmac       hash.Hash\n\tmacSize   uint32\n\tdecrypter cipher.BlockMode\n\tencrypter cipher.BlockMode\n\n\t// The following members are to avoid per-packet allocations.\n\tseqNumBytes [4]byte\n\tpacketData  []byte\n\tmacResult   []byte\n\n\t// Amount of data we should still read to hide which\n\t// verification error triggered.\n\toracleCamouflage uint32\n}\n\nfunc newCBCCipher(c cipher.Block, iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) {\n\tcbc := &cbcCipher{\n\t\tmac:        macModes[algs.MAC].new(macKey),\n\t\tdecrypter:  cipher.NewCBCDecrypter(c, iv),\n\t\tencrypter:  cipher.NewCBCEncrypter(c, iv),\n\t\tpacketData: make([]byte, 1024),\n\t}\n\tif cbc.mac != nil {\n\t\tcbc.macSize = uint32(cbc.mac.Size())\n\t}\n\n\treturn cbc, nil\n}\n\nfunc newAESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) {\n\tc, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcbc, err := newCBCCipher(c, iv, key, macKey, algs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn cbc, nil\n}\n\nfunc newTripleDESCBCCipher(iv, key, macKey []byte, algs directionAlgorithms) (packetCipher, error) {\n\tc, err := des.NewTripleDESCipher(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tcbc, err := newCBCCipher(c, iv, key, macKey, algs)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn cbc, nil\n}\n\nfunc maxUInt32(a, b int) uint32 {\n\tif a > b {\n\t\treturn uint32(a)\n\t}\n\treturn uint32(b)\n}\n\nconst (\n\tcbcMinPacketSizeMultiple = 8\n\tcbcMinPacketSize         = 16\n\tcbcMinPaddingSize        = 4\n)\n\n// cbcError represents a verification error that may leak information.\ntype cbcError string\n\nfunc (e cbcError) Error() string { return string(e) }\n\nfunc (c *cbcCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) {\n\tp, err := c.readPacketLeaky(seqNum, r)\n\tif err != nil {\n\t\tif _, ok := err.(cbcError); ok {\n\t\t\t// Verification error: read a fixed amount of\n\t\t\t// data, to make distinguishing between\n\t\t\t// failing MAC and failing length check more\n\t\t\t// difficult.\n\t\t\tio.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage))\n\t\t}\n\t}\n\treturn p, err\n}\n\nfunc (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) {\n\tblockSize := c.decrypter.BlockSize()\n\n\t// Read the header, which will include some of the subsequent data in the\n\t// case of block ciphers - this is copied back to the payload later.\n\t// How many bytes of payload/padding will be read with this first read.\n\tfirstBlockLength := uint32((prefixLen + blockSize - 1) / blockSize * blockSize)\n\tfirstBlock := c.packetData[:firstBlockLength]\n\tif _, err := io.ReadFull(r, firstBlock); err != nil {\n\t\treturn nil, err\n\t}\n\n\tc.oracleCamouflage = maxPacket + 4 + c.macSize - firstBlockLength\n\n\tc.decrypter.CryptBlocks(firstBlock, firstBlock)\n\tlength := binary.BigEndian.Uint32(firstBlock[:4])\n\tif length > maxPacket {\n\t\treturn nil, cbcError(\"ssh: packet too large\")\n\t}\n\tif length+4 < maxUInt32(cbcMinPacketSize, blockSize) {\n\t\t// The minimum size of a packet is 16 (or the cipher block size, whichever\n\t\t// is larger) bytes.\n\t\treturn nil, cbcError(\"ssh: packet too small\")\n\t}\n\t// The length of the packet (including the length field but not the MAC) must\n\t// be a multiple of the block size or 8, whichever is larger.\n\tif (length+4)%maxUInt32(cbcMinPacketSizeMultiple, blockSize) != 0 {\n\t\treturn nil, cbcError(\"ssh: invalid packet length multiple\")\n\t}\n\n\tpaddingLength := uint32(firstBlock[4])\n\tif paddingLength < cbcMinPaddingSize || length <= paddingLength+1 {\n\t\treturn nil, cbcError(\"ssh: invalid packet length\")\n\t}\n\n\t// Positions within the c.packetData buffer:\n\tmacStart := 4 + length\n\tpaddingStart := macStart - paddingLength\n\n\t// Entire packet size, starting before length, ending at end of mac.\n\tentirePacketSize := macStart + c.macSize\n\n\t// Ensure c.packetData is large enough for the entire packet data.\n\tif uint32(cap(c.packetData)) < entirePacketSize {\n\t\t// Still need to upsize and copy, but this should be rare at runtime, only\n\t\t// on upsizing the packetData buffer.\n\t\tc.packetData = make([]byte, entirePacketSize)\n\t\tcopy(c.packetData, firstBlock)\n\t} else {\n\t\tc.packetData = c.packetData[:entirePacketSize]\n\t}\n\n\tif n, err := io.ReadFull(r, c.packetData[firstBlockLength:]); err != nil {\n\t\treturn nil, err\n\t} else {\n\t\tc.oracleCamouflage -= uint32(n)\n\t}\n\n\tremainingCrypted := c.packetData[firstBlockLength:macStart]\n\tc.decrypter.CryptBlocks(remainingCrypted, remainingCrypted)\n\n\tmac := c.packetData[macStart:]\n\tif c.mac != nil {\n\t\tc.mac.Reset()\n\t\tbinary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum)\n\t\tc.mac.Write(c.seqNumBytes[:])\n\t\tc.mac.Write(c.packetData[:macStart])\n\t\tc.macResult = c.mac.Sum(c.macResult[:0])\n\t\tif subtle.ConstantTimeCompare(c.macResult, mac) != 1 {\n\t\t\treturn nil, cbcError(\"ssh: MAC failure\")\n\t\t}\n\t}\n\n\treturn c.packetData[prefixLen:paddingStart], nil\n}\n\nfunc (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error {\n\teffectiveBlockSize := maxUInt32(cbcMinPacketSizeMultiple, c.encrypter.BlockSize())\n\n\t// Length of encrypted portion of the packet (header, payload, padding).\n\t// Enforce minimum padding and packet size.\n\tencLength := maxUInt32(prefixLen+len(packet)+cbcMinPaddingSize, cbcMinPaddingSize)\n\t// Enforce block size.\n\tencLength = (encLength + effectiveBlockSize - 1) / effectiveBlockSize * effectiveBlockSize\n\n\tlength := encLength - 4\n\tpaddingLength := int(length) - (1 + len(packet))\n\n\t// Overall buffer contains: header, payload, padding, mac.\n\t// Space for the MAC is reserved in the capacity but not the slice length.\n\tbufferSize := encLength + c.macSize\n\tif uint32(cap(c.packetData)) < bufferSize {\n\t\tc.packetData = make([]byte, encLength, bufferSize)\n\t} else {\n\t\tc.packetData = c.packetData[:encLength]\n\t}\n\n\tp := c.packetData\n\n\t// Packet header.\n\tbinary.BigEndian.PutUint32(p, length)\n\tp = p[4:]\n\tp[0] = byte(paddingLength)\n\n\t// Payload.\n\tp = p[1:]\n\tcopy(p, packet)\n\n\t// Padding.\n\tp = p[len(packet):]\n\tif _, err := io.ReadFull(rand, p); err != nil {\n\t\treturn err\n\t}\n\n\tif c.mac != nil {\n\t\tc.mac.Reset()\n\t\tbinary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum)\n\t\tc.mac.Write(c.seqNumBytes[:])\n\t\tc.mac.Write(c.packetData)\n\t\t// The MAC is now appended into the capacity reserved for it earlier.\n\t\tc.packetData = c.mac.Sum(c.packetData)\n\t}\n\n\tc.encrypter.CryptBlocks(c.packetData[:encLength], c.packetData[:encLength])\n\n\tif _, err := w.Write(c.packetData); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/client.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"sync\"\n\t\"time\"\n)\n\n// Client implements a traditional SSH client that supports shells,\n// subprocesses, TCP port/streamlocal forwarding and tunneled dialing.\ntype Client struct {\n\tConn\n\n\tforwards        forwardList // forwarded tcpip connections from the remote side\n\tmu              sync.Mutex\n\tchannelHandlers map[string]chan NewChannel\n}\n\n// HandleChannelOpen returns a channel on which NewChannel requests\n// for the given type are sent. If the type already is being handled,\n// nil is returned. The channel is closed when the connection is closed.\nfunc (c *Client) HandleChannelOpen(channelType string) <-chan NewChannel {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tif c.channelHandlers == nil {\n\t\t// The SSH channel has been closed.\n\t\tc := make(chan NewChannel)\n\t\tclose(c)\n\t\treturn c\n\t}\n\n\tch := c.channelHandlers[channelType]\n\tif ch != nil {\n\t\treturn nil\n\t}\n\n\tch = make(chan NewChannel, chanSize)\n\tc.channelHandlers[channelType] = ch\n\treturn ch\n}\n\n// NewClient creates a Client on top of the given connection.\nfunc NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client {\n\tconn := &Client{\n\t\tConn:            c,\n\t\tchannelHandlers: make(map[string]chan NewChannel, 1),\n\t}\n\n\tgo conn.handleGlobalRequests(reqs)\n\tgo conn.handleChannelOpens(chans)\n\tgo func() {\n\t\tconn.Wait()\n\t\tconn.forwards.closeAll()\n\t}()\n\tgo conn.forwards.handleChannels(conn.HandleChannelOpen(\"forwarded-tcpip\"))\n\tgo conn.forwards.handleChannels(conn.HandleChannelOpen(\"forwarded-streamlocal@openssh.com\"))\n\treturn conn\n}\n\n// NewClientConn establishes an authenticated SSH connection using c\n// as the underlying transport.  The Request and NewChannel channels\n// must be serviced or the connection will hang.\nfunc NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan NewChannel, <-chan *Request, error) {\n\tfullConf := *config\n\tfullConf.SetDefaults()\n\tif fullConf.HostKeyCallback == nil {\n\t\tc.Close()\n\t\treturn nil, nil, nil, errors.New(\"ssh: must specify HostKeyCallback\")\n\t}\n\n\tconn := &connection{\n\t\tsshConn: sshConn{conn: c},\n\t}\n\n\tif err := conn.clientHandshake(addr, &fullConf); err != nil {\n\t\tc.Close()\n\t\treturn nil, nil, nil, fmt.Errorf(\"ssh: handshake failed: %v\", err)\n\t}\n\tconn.mux = newMux(conn.transport)\n\treturn conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil\n}\n\n// clientHandshake performs the client side key exchange. See RFC 4253 Section\n// 7.\nfunc (c *connection) clientHandshake(dialAddress string, config *ClientConfig) error {\n\tif config.ClientVersion != \"\" {\n\t\tc.clientVersion = []byte(config.ClientVersion)\n\t} else {\n\t\tc.clientVersion = []byte(packageVersion)\n\t}\n\tvar err error\n\tc.serverVersion, err = exchangeVersions(c.sshConn.conn, c.clientVersion)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tc.transport = newClientTransport(\n\t\tnewTransport(c.sshConn.conn, config.Rand, true /* is client */),\n\t\tc.clientVersion, c.serverVersion, config, dialAddress, c.sshConn.RemoteAddr())\n\tif err := c.transport.waitSession(); err != nil {\n\t\treturn err\n\t}\n\n\tc.sessionID = c.transport.getSessionID()\n\treturn c.clientAuthenticate(config)\n}\n\n// verifyHostKeySignature verifies the host key obtained in the key\n// exchange.\nfunc verifyHostKeySignature(hostKey PublicKey, result *kexResult) error {\n\tsig, rest, ok := parseSignatureBody(result.Signature)\n\tif len(rest) > 0 || !ok {\n\t\treturn errors.New(\"ssh: signature parse error\")\n\t}\n\n\treturn hostKey.Verify(result.H, sig)\n}\n\n// NewSession opens a new Session for this client. (A session is a remote\n// execution of a program.)\nfunc (c *Client) NewSession() (*Session, error) {\n\tch, in, err := c.OpenChannel(\"session\", nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn newSession(ch, in)\n}\n\nfunc (c *Client) handleGlobalRequests(incoming <-chan *Request) {\n\tfor r := range incoming {\n\t\t// This handles keepalive messages and matches\n\t\t// the behaviour of OpenSSH.\n\t\tr.Reply(false, nil)\n\t}\n}\n\n// handleChannelOpens channel open messages from the remote side.\nfunc (c *Client) handleChannelOpens(in <-chan NewChannel) {\n\tfor ch := range in {\n\t\tc.mu.Lock()\n\t\thandler := c.channelHandlers[ch.ChannelType()]\n\t\tc.mu.Unlock()\n\n\t\tif handler != nil {\n\t\t\thandler <- ch\n\t\t} else {\n\t\t\tch.Reject(UnknownChannelType, fmt.Sprintf(\"unknown channel type: %v\", ch.ChannelType()))\n\t\t}\n\t}\n\n\tc.mu.Lock()\n\tfor _, ch := range c.channelHandlers {\n\t\tclose(ch)\n\t}\n\tc.channelHandlers = nil\n\tc.mu.Unlock()\n}\n\n// Dial starts a client connection to the given SSH server. It is a\n// convenience function that connects to the given network address,\n// initiates the SSH handshake, and then sets up a Client.  For access\n// to incoming channels and requests, use net.Dial with NewClientConn\n// instead.\nfunc Dial(network, addr string, config *ClientConfig) (*Client, error) {\n\tconn, err := net.DialTimeout(network, addr, config.Timeout)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc, chans, reqs, err := NewClientConn(conn, addr, config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewClient(c, chans, reqs), nil\n}\n\n// HostKeyCallback is the function type used for verifying server\n// keys.  A HostKeyCallback must return nil if the host key is OK, or\n// an error to reject it. It receives the hostname as passed to Dial\n// or NewClientConn. The remote address is the RemoteAddr of the\n// net.Conn underlying the the SSH connection.\ntype HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error\n\n// A ClientConfig structure is used to configure a Client. It must not be\n// modified after having been passed to an SSH function.\ntype ClientConfig struct {\n\t// Config contains configuration that is shared between clients and\n\t// servers.\n\tConfig\n\n\t// User contains the username to authenticate as.\n\tUser string\n\n\t// Auth contains possible authentication methods to use with the\n\t// server. Only the first instance of a particular RFC 4252 method will\n\t// be used during authentication.\n\tAuth []AuthMethod\n\n\t// HostKeyCallback is called during the cryptographic\n\t// handshake to validate the server's host key. The client\n\t// configuration must supply this callback for the connection\n\t// to succeed. The functions InsecureIgnoreHostKey or\n\t// FixedHostKey can be used for simplistic host key checks.\n\tHostKeyCallback HostKeyCallback\n\n\t// ClientVersion contains the version identification string that will\n\t// be used for the connection. If empty, a reasonable default is used.\n\tClientVersion string\n\n\t// HostKeyAlgorithms lists the key types that the client will\n\t// accept from the server as host key, in order of\n\t// preference. If empty, a reasonable default is used. Any\n\t// string returned from PublicKey.Type method may be used, or\n\t// any of the CertAlgoXxxx and KeyAlgoXxxx constants.\n\tHostKeyAlgorithms []string\n\n\t// Timeout is the maximum amount of time for the TCP connection to establish.\n\t//\n\t// A Timeout of zero means no timeout.\n\tTimeout time.Duration\n}\n\n// InsecureIgnoreHostKey returns a function that can be used for\n// ClientConfig.HostKeyCallback to accept any host key. It should\n// not be used for production code.\nfunc InsecureIgnoreHostKey() HostKeyCallback {\n\treturn func(hostname string, remote net.Addr, key PublicKey) error {\n\t\treturn nil\n\t}\n}\n\ntype fixedHostKey struct {\n\tkey PublicKey\n}\n\nfunc (f *fixedHostKey) check(hostname string, remote net.Addr, key PublicKey) error {\n\tif f.key == nil {\n\t\treturn fmt.Errorf(\"ssh: required host key was nil\")\n\t}\n\tif !bytes.Equal(key.Marshal(), f.key.Marshal()) {\n\t\treturn fmt.Errorf(\"ssh: host key mismatch\")\n\t}\n\treturn nil\n}\n\n// FixedHostKey returns a function for use in\n// ClientConfig.HostKeyCallback to accept only a specific host key.\nfunc FixedHostKey(key PublicKey) HostKeyCallback {\n\thk := &fixedHostKey{key}\n\treturn hk.check\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/client_auth.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n)\n\n// clientAuthenticate authenticates with the remote server. See RFC 4252.\nfunc (c *connection) clientAuthenticate(config *ClientConfig) error {\n\t// initiate user auth session\n\tif err := c.transport.writePacket(Marshal(&serviceRequestMsg{serviceUserAuth})); err != nil {\n\t\treturn err\n\t}\n\tpacket, err := c.transport.readPacket()\n\tif err != nil {\n\t\treturn err\n\t}\n\tvar serviceAccept serviceAcceptMsg\n\tif err := Unmarshal(packet, &serviceAccept); err != nil {\n\t\treturn err\n\t}\n\n\t// during the authentication phase the client first attempts the \"none\" method\n\t// then any untried methods suggested by the server.\n\ttried := make(map[string]bool)\n\tvar lastMethods []string\n\n\tsessionID := c.transport.getSessionID()\n\tfor auth := AuthMethod(new(noneAuth)); auth != nil; {\n\t\tok, methods, err := auth.auth(sessionID, config.User, c.transport, config.Rand)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif ok {\n\t\t\t// success\n\t\t\treturn nil\n\t\t}\n\t\ttried[auth.method()] = true\n\t\tif methods == nil {\n\t\t\tmethods = lastMethods\n\t\t}\n\t\tlastMethods = methods\n\n\t\tauth = nil\n\n\tfindNext:\n\t\tfor _, a := range config.Auth {\n\t\t\tcandidateMethod := a.method()\n\t\t\tif tried[candidateMethod] {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor _, meth := range methods {\n\t\t\t\tif meth == candidateMethod {\n\t\t\t\t\tauth = a\n\t\t\t\t\tbreak findNext\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn fmt.Errorf(\"ssh: unable to authenticate, attempted methods %v, no supported methods remain\", keys(tried))\n}\n\nfunc keys(m map[string]bool) []string {\n\ts := make([]string, 0, len(m))\n\n\tfor key := range m {\n\t\ts = append(s, key)\n\t}\n\treturn s\n}\n\n// An AuthMethod represents an instance of an RFC 4252 authentication method.\ntype AuthMethod interface {\n\t// auth authenticates user over transport t.\n\t// Returns true if authentication is successful.\n\t// If authentication is not successful, a []string of alternative\n\t// method names is returned. If the slice is nil, it will be ignored\n\t// and the previous set of possible methods will be reused.\n\tauth(session []byte, user string, p packetConn, rand io.Reader) (bool, []string, error)\n\n\t// method returns the RFC 4252 method name.\n\tmethod() string\n}\n\n// \"none\" authentication, RFC 4252 section 5.2.\ntype noneAuth int\n\nfunc (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {\n\tif err := c.writePacket(Marshal(&userAuthRequestMsg{\n\t\tUser:    user,\n\t\tService: serviceSSH,\n\t\tMethod:  \"none\",\n\t})); err != nil {\n\t\treturn false, nil, err\n\t}\n\n\treturn handleAuthResponse(c)\n}\n\nfunc (n *noneAuth) method() string {\n\treturn \"none\"\n}\n\n// passwordCallback is an AuthMethod that fetches the password through\n// a function call, e.g. by prompting the user.\ntype passwordCallback func() (password string, err error)\n\nfunc (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {\n\ttype passwordAuthMsg struct {\n\t\tUser     string `sshtype:\"50\"`\n\t\tService  string\n\t\tMethod   string\n\t\tReply    bool\n\t\tPassword string\n\t}\n\n\tpw, err := cb()\n\t// REVIEW NOTE: is there a need to support skipping a password attempt?\n\t// The program may only find out that the user doesn't have a password\n\t// when prompting.\n\tif err != nil {\n\t\treturn false, nil, err\n\t}\n\n\tif err := c.writePacket(Marshal(&passwordAuthMsg{\n\t\tUser:     user,\n\t\tService:  serviceSSH,\n\t\tMethod:   cb.method(),\n\t\tReply:    false,\n\t\tPassword: pw,\n\t})); err != nil {\n\t\treturn false, nil, err\n\t}\n\n\treturn handleAuthResponse(c)\n}\n\nfunc (cb passwordCallback) method() string {\n\treturn \"password\"\n}\n\n// Password returns an AuthMethod using the given password.\nfunc Password(secret string) AuthMethod {\n\treturn passwordCallback(func() (string, error) { return secret, nil })\n}\n\n// PasswordCallback returns an AuthMethod that uses a callback for\n// fetching a password.\nfunc PasswordCallback(prompt func() (secret string, err error)) AuthMethod {\n\treturn passwordCallback(prompt)\n}\n\ntype publickeyAuthMsg struct {\n\tUser    string `sshtype:\"50\"`\n\tService string\n\tMethod  string\n\t// HasSig indicates to the receiver packet that the auth request is signed and\n\t// should be used for authentication of the request.\n\tHasSig   bool\n\tAlgoname string\n\tPubKey   []byte\n\t// Sig is tagged with \"rest\" so Marshal will exclude it during\n\t// validateKey\n\tSig []byte `ssh:\"rest\"`\n}\n\n// publicKeyCallback is an AuthMethod that uses a set of key\n// pairs for authentication.\ntype publicKeyCallback func() ([]Signer, error)\n\nfunc (cb publicKeyCallback) method() string {\n\treturn \"publickey\"\n}\n\nfunc (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {\n\t// Authentication is performed by sending an enquiry to test if a key is\n\t// acceptable to the remote. If the key is acceptable, the client will\n\t// attempt to authenticate with the valid key.  If not the client will repeat\n\t// the process with the remaining keys.\n\n\tsigners, err := cb()\n\tif err != nil {\n\t\treturn false, nil, err\n\t}\n\tvar methods []string\n\tfor _, signer := range signers {\n\t\tok, err := validateKey(signer.PublicKey(), user, c)\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\n\t\tpub := signer.PublicKey()\n\t\tpubKey := pub.Marshal()\n\t\tsign, err := signer.Sign(rand, buildDataSignedForAuth(session, userAuthRequestMsg{\n\t\t\tUser:    user,\n\t\t\tService: serviceSSH,\n\t\t\tMethod:  cb.method(),\n\t\t}, []byte(pub.Type()), pubKey))\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\n\t\t// manually wrap the serialized signature in a string\n\t\ts := Marshal(sign)\n\t\tsig := make([]byte, stringLength(len(s)))\n\t\tmarshalString(sig, s)\n\t\tmsg := publickeyAuthMsg{\n\t\t\tUser:     user,\n\t\t\tService:  serviceSSH,\n\t\t\tMethod:   cb.method(),\n\t\t\tHasSig:   true,\n\t\t\tAlgoname: pub.Type(),\n\t\t\tPubKey:   pubKey,\n\t\t\tSig:      sig,\n\t\t}\n\t\tp := Marshal(&msg)\n\t\tif err := c.writePacket(p); err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\t\tvar success bool\n\t\tsuccess, methods, err = handleAuthResponse(c)\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\n\t\t// If authentication succeeds or the list of available methods does not\n\t\t// contain the \"publickey\" method, do not attempt to authenticate with any\n\t\t// other keys.  According to RFC 4252 Section 7, the latter can occur when\n\t\t// additional authentication methods are required.\n\t\tif success || !containsMethod(methods, cb.method()) {\n\t\t\treturn success, methods, err\n\t\t}\n\t}\n\n\treturn false, methods, nil\n}\n\nfunc containsMethod(methods []string, method string) bool {\n\tfor _, m := range methods {\n\t\tif m == method {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// validateKey validates the key provided is acceptable to the server.\nfunc validateKey(key PublicKey, user string, c packetConn) (bool, error) {\n\tpubKey := key.Marshal()\n\tmsg := publickeyAuthMsg{\n\t\tUser:     user,\n\t\tService:  serviceSSH,\n\t\tMethod:   \"publickey\",\n\t\tHasSig:   false,\n\t\tAlgoname: key.Type(),\n\t\tPubKey:   pubKey,\n\t}\n\tif err := c.writePacket(Marshal(&msg)); err != nil {\n\t\treturn false, err\n\t}\n\n\treturn confirmKeyAck(key, c)\n}\n\nfunc confirmKeyAck(key PublicKey, c packetConn) (bool, error) {\n\tpubKey := key.Marshal()\n\talgoname := key.Type()\n\n\tfor {\n\t\tpacket, err := c.readPacket()\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tswitch packet[0] {\n\t\tcase msgUserAuthBanner:\n\t\t\t// TODO(gpaul): add callback to present the banner to the user\n\t\tcase msgUserAuthPubKeyOk:\n\t\t\tvar msg userAuthPubKeyOkMsg\n\t\t\tif err := Unmarshal(packet, &msg); err != nil {\n\t\t\t\treturn false, err\n\t\t\t}\n\t\t\tif msg.Algo != algoname || !bytes.Equal(msg.PubKey, pubKey) {\n\t\t\t\treturn false, nil\n\t\t\t}\n\t\t\treturn true, nil\n\t\tcase msgUserAuthFailure:\n\t\t\treturn false, nil\n\t\tdefault:\n\t\t\treturn false, unexpectedMessageError(msgUserAuthSuccess, packet[0])\n\t\t}\n\t}\n}\n\n// PublicKeys returns an AuthMethod that uses the given key\n// pairs.\nfunc PublicKeys(signers ...Signer) AuthMethod {\n\treturn publicKeyCallback(func() ([]Signer, error) { return signers, nil })\n}\n\n// PublicKeysCallback returns an AuthMethod that runs the given\n// function to obtain a list of key pairs.\nfunc PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMethod {\n\treturn publicKeyCallback(getSigners)\n}\n\n// handleAuthResponse returns whether the preceding authentication request succeeded\n// along with a list of remaining authentication methods to try next and\n// an error if an unexpected response was received.\nfunc handleAuthResponse(c packetConn) (bool, []string, error) {\n\tfor {\n\t\tpacket, err := c.readPacket()\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\n\t\tswitch packet[0] {\n\t\tcase msgUserAuthBanner:\n\t\t\t// TODO: add callback to present the banner to the user\n\t\tcase msgUserAuthFailure:\n\t\t\tvar msg userAuthFailureMsg\n\t\t\tif err := Unmarshal(packet, &msg); err != nil {\n\t\t\t\treturn false, nil, err\n\t\t\t}\n\t\t\treturn false, msg.Methods, nil\n\t\tcase msgUserAuthSuccess:\n\t\t\treturn true, nil, nil\n\t\tdefault:\n\t\t\treturn false, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0])\n\t\t}\n\t}\n}\n\n// KeyboardInteractiveChallenge should print questions, optionally\n// disabling echoing (e.g. for passwords), and return all the answers.\n// Challenge may be called multiple times in a single session. After\n// successful authentication, the server may send a challenge with no\n// questions, for which the user and instruction messages should be\n// printed.  RFC 4256 section 3.3 details how the UI should behave for\n// both CLI and GUI environments.\ntype KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error)\n\n// KeyboardInteractive returns an AuthMethod using a prompt/response\n// sequence controlled by the server.\nfunc KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod {\n\treturn challenge\n}\n\nfunc (cb KeyboardInteractiveChallenge) method() string {\n\treturn \"keyboard-interactive\"\n}\n\nfunc (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (bool, []string, error) {\n\ttype initiateMsg struct {\n\t\tUser       string `sshtype:\"50\"`\n\t\tService    string\n\t\tMethod     string\n\t\tLanguage   string\n\t\tSubmethods string\n\t}\n\n\tif err := c.writePacket(Marshal(&initiateMsg{\n\t\tUser:    user,\n\t\tService: serviceSSH,\n\t\tMethod:  \"keyboard-interactive\",\n\t})); err != nil {\n\t\treturn false, nil, err\n\t}\n\n\tfor {\n\t\tpacket, err := c.readPacket()\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\n\t\t// like handleAuthResponse, but with less options.\n\t\tswitch packet[0] {\n\t\tcase msgUserAuthBanner:\n\t\t\t// TODO: Print banners during userauth.\n\t\t\tcontinue\n\t\tcase msgUserAuthInfoRequest:\n\t\t\t// OK\n\t\tcase msgUserAuthFailure:\n\t\t\tvar msg userAuthFailureMsg\n\t\t\tif err := Unmarshal(packet, &msg); err != nil {\n\t\t\t\treturn false, nil, err\n\t\t\t}\n\t\t\treturn false, msg.Methods, nil\n\t\tcase msgUserAuthSuccess:\n\t\t\treturn true, nil, nil\n\t\tdefault:\n\t\t\treturn false, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0])\n\t\t}\n\n\t\tvar msg userAuthInfoRequestMsg\n\t\tif err := Unmarshal(packet, &msg); err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\n\t\t// Manually unpack the prompt/echo pairs.\n\t\trest := msg.Prompts\n\t\tvar prompts []string\n\t\tvar echos []bool\n\t\tfor i := 0; i < int(msg.NumPrompts); i++ {\n\t\t\tprompt, r, ok := parseString(rest)\n\t\t\tif !ok || len(r) == 0 {\n\t\t\t\treturn false, nil, errors.New(\"ssh: prompt format error\")\n\t\t\t}\n\t\t\tprompts = append(prompts, string(prompt))\n\t\t\techos = append(echos, r[0] != 0)\n\t\t\trest = r[1:]\n\t\t}\n\n\t\tif len(rest) != 0 {\n\t\t\treturn false, nil, errors.New(\"ssh: extra data following keyboard-interactive pairs\")\n\t\t}\n\n\t\tanswers, err := cb(msg.User, msg.Instruction, prompts, echos)\n\t\tif err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\n\t\tif len(answers) != len(prompts) {\n\t\t\treturn false, nil, errors.New(\"ssh: not enough answers from keyboard-interactive callback\")\n\t\t}\n\t\tresponseLength := 1 + 4\n\t\tfor _, a := range answers {\n\t\t\tresponseLength += stringLength(len(a))\n\t\t}\n\t\tserialized := make([]byte, responseLength)\n\t\tp := serialized\n\t\tp[0] = msgUserAuthInfoResponse\n\t\tp = p[1:]\n\t\tp = marshalUint32(p, uint32(len(answers)))\n\t\tfor _, a := range answers {\n\t\t\tp = marshalString(p, []byte(a))\n\t\t}\n\n\t\tif err := c.writePacket(serialized); err != nil {\n\t\t\treturn false, nil, err\n\t\t}\n\t}\n}\n\ntype retryableAuthMethod struct {\n\tauthMethod AuthMethod\n\tmaxTries   int\n}\n\nfunc (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok bool, methods []string, err error) {\n\tfor i := 0; r.maxTries <= 0 || i < r.maxTries; i++ {\n\t\tok, methods, err = r.authMethod.auth(session, user, c, rand)\n\t\tif ok || err != nil { // either success or error terminate\n\t\t\treturn ok, methods, err\n\t\t}\n\t}\n\treturn ok, methods, err\n}\n\nfunc (r *retryableAuthMethod) method() string {\n\treturn r.authMethod.method()\n}\n\n// RetryableAuthMethod is a decorator for other auth methods enabling them to\n// be retried up to maxTries before considering that AuthMethod itself failed.\n// If maxTries is <= 0, will retry indefinitely\n//\n// This is useful for interactive clients using challenge/response type\n// authentication (e.g. Keyboard-Interactive, Password, etc) where the user\n// could mistype their response resulting in the server issuing a\n// SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4\n// [keyboard-interactive]); Without this decorator, the non-retryable\n// AuthMethod would be removed from future consideration, and never tried again\n// (and so the user would never be able to retry their entry).\nfunc RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod {\n\treturn &retryableAuthMethod{authMethod: auth, maxTries: maxTries}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/common.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"sync\"\n\n\t_ \"crypto/sha1\"\n\t_ \"crypto/sha256\"\n\t_ \"crypto/sha512\"\n)\n\n// These are string constants in the SSH protocol.\nconst (\n\tcompressionNone = \"none\"\n\tserviceUserAuth = \"ssh-userauth\"\n\tserviceSSH      = \"ssh-connection\"\n)\n\n// supportedCiphers specifies the supported ciphers in preference order.\nvar supportedCiphers = []string{\n\t\"aes128-ctr\", \"aes192-ctr\", \"aes256-ctr\",\n\t\"aes128-gcm@openssh.com\",\n\t\"arcfour256\", \"arcfour128\",\n}\n\n// supportedKexAlgos specifies the supported key-exchange algorithms in\n// preference order.\nvar supportedKexAlgos = []string{\n\tkexAlgoCurve25519SHA256,\n\t// P384 and P521 are not constant-time yet, but since we don't\n\t// reuse ephemeral keys, using them for ECDH should be OK.\n\tkexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521,\n\tkexAlgoDH14SHA1, kexAlgoDH1SHA1,\n}\n\n// supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods\n// of authenticating servers) in preference order.\nvar supportedHostKeyAlgos = []string{\n\tCertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01,\n\tCertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01,\n\n\tKeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521,\n\tKeyAlgoRSA, KeyAlgoDSA,\n\n\tKeyAlgoED25519,\n}\n\n// supportedMACs specifies a default set of MAC algorithms in preference order.\n// This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed\n// because they have reached the end of their useful life.\nvar supportedMACs = []string{\n\t\"hmac-sha2-256-etm@openssh.com\", \"hmac-sha2-256\", \"hmac-sha1\", \"hmac-sha1-96\",\n}\n\nvar supportedCompressions = []string{compressionNone}\n\n// hashFuncs keeps the mapping of supported algorithms to their respective\n// hashes needed for signature verification.\nvar hashFuncs = map[string]crypto.Hash{\n\tKeyAlgoRSA:          crypto.SHA1,\n\tKeyAlgoDSA:          crypto.SHA1,\n\tKeyAlgoECDSA256:     crypto.SHA256,\n\tKeyAlgoECDSA384:     crypto.SHA384,\n\tKeyAlgoECDSA521:     crypto.SHA512,\n\tCertAlgoRSAv01:      crypto.SHA1,\n\tCertAlgoDSAv01:      crypto.SHA1,\n\tCertAlgoECDSA256v01: crypto.SHA256,\n\tCertAlgoECDSA384v01: crypto.SHA384,\n\tCertAlgoECDSA521v01: crypto.SHA512,\n}\n\n// unexpectedMessageError results when the SSH message that we received didn't\n// match what we wanted.\nfunc unexpectedMessageError(expected, got uint8) error {\n\treturn fmt.Errorf(\"ssh: unexpected message type %d (expected %d)\", got, expected)\n}\n\n// parseError results from a malformed SSH message.\nfunc parseError(tag uint8) error {\n\treturn fmt.Errorf(\"ssh: parse error in message type %d\", tag)\n}\n\nfunc findCommon(what string, client []string, server []string) (common string, err error) {\n\tfor _, c := range client {\n\t\tfor _, s := range server {\n\t\t\tif c == s {\n\t\t\t\treturn c, nil\n\t\t\t}\n\t\t}\n\t}\n\treturn \"\", fmt.Errorf(\"ssh: no common algorithm for %s; client offered: %v, server offered: %v\", what, client, server)\n}\n\ntype directionAlgorithms struct {\n\tCipher      string\n\tMAC         string\n\tCompression string\n}\n\n// rekeyBytes returns a rekeying intervals in bytes.\nfunc (a *directionAlgorithms) rekeyBytes() int64 {\n\t// According to RFC4344 block ciphers should rekey after\n\t// 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is\n\t// 128.\n\tswitch a.Cipher {\n\tcase \"aes128-ctr\", \"aes192-ctr\", \"aes256-ctr\", gcmCipherID, aes128cbcID:\n\t\treturn 16 * (1 << 32)\n\n\t}\n\n\t// For others, stick with RFC4253 recommendation to rekey after 1 Gb of data.\n\treturn 1 << 30\n}\n\ntype algorithms struct {\n\tkex     string\n\thostKey string\n\tw       directionAlgorithms\n\tr       directionAlgorithms\n}\n\nfunc findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms, err error) {\n\tresult := &algorithms{}\n\n\tresult.kex, err = findCommon(\"key exchange\", clientKexInit.KexAlgos, serverKexInit.KexAlgos)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult.hostKey, err = findCommon(\"host key\", clientKexInit.ServerHostKeyAlgos, serverKexInit.ServerHostKeyAlgos)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult.w.Cipher, err = findCommon(\"client to server cipher\", clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult.r.Cipher, err = findCommon(\"server to client cipher\", clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult.w.MAC, err = findCommon(\"client to server MAC\", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult.r.MAC, err = findCommon(\"server to client MAC\", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult.w.Compression, err = findCommon(\"client to server compression\", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tresult.r.Compression, err = findCommon(\"server to client compression\", clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient)\n\tif err != nil {\n\t\treturn\n\t}\n\n\treturn result, nil\n}\n\n// If rekeythreshold is too small, we can't make any progress sending\n// stuff.\nconst minRekeyThreshold uint64 = 256\n\n// Config contains configuration data common to both ServerConfig and\n// ClientConfig.\ntype Config struct {\n\t// Rand provides the source of entropy for cryptographic\n\t// primitives. If Rand is nil, the cryptographic random reader\n\t// in package crypto/rand will be used.\n\tRand io.Reader\n\n\t// The maximum number of bytes sent or received after which a\n\t// new key is negotiated. It must be at least 256. If\n\t// unspecified, a size suitable for the chosen cipher is used.\n\tRekeyThreshold uint64\n\n\t// The allowed key exchanges algorithms. If unspecified then a\n\t// default set of algorithms is used.\n\tKeyExchanges []string\n\n\t// The allowed cipher algorithms. If unspecified then a sensible\n\t// default is used.\n\tCiphers []string\n\n\t// The allowed MAC algorithms. If unspecified then a sensible default\n\t// is used.\n\tMACs []string\n}\n\n// SetDefaults sets sensible values for unset fields in config. This is\n// exported for testing: Configs passed to SSH functions are copied and have\n// default values set automatically.\nfunc (c *Config) SetDefaults() {\n\tif c.Rand == nil {\n\t\tc.Rand = rand.Reader\n\t}\n\tif c.Ciphers == nil {\n\t\tc.Ciphers = supportedCiphers\n\t}\n\tvar ciphers []string\n\tfor _, c := range c.Ciphers {\n\t\tif cipherModes[c] != nil {\n\t\t\t// reject the cipher if we have no cipherModes definition\n\t\t\tciphers = append(ciphers, c)\n\t\t}\n\t}\n\tc.Ciphers = ciphers\n\n\tif c.KeyExchanges == nil {\n\t\tc.KeyExchanges = supportedKexAlgos\n\t}\n\n\tif c.MACs == nil {\n\t\tc.MACs = supportedMACs\n\t}\n\n\tif c.RekeyThreshold == 0 {\n\t\t// cipher specific default\n\t} else if c.RekeyThreshold < minRekeyThreshold {\n\t\tc.RekeyThreshold = minRekeyThreshold\n\t} else if c.RekeyThreshold >= math.MaxInt64 {\n\t\t// Avoid weirdness if somebody uses -1 as a threshold.\n\t\tc.RekeyThreshold = math.MaxInt64\n\t}\n}\n\n// buildDataSignedForAuth returns the data that is signed in order to prove\n// possession of a private key. See RFC 4252, section 7.\nfunc buildDataSignedForAuth(sessionId []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte {\n\tdata := struct {\n\t\tSession []byte\n\t\tType    byte\n\t\tUser    string\n\t\tService string\n\t\tMethod  string\n\t\tSign    bool\n\t\tAlgo    []byte\n\t\tPubKey  []byte\n\t}{\n\t\tsessionId,\n\t\tmsgUserAuthRequest,\n\t\treq.User,\n\t\treq.Service,\n\t\treq.Method,\n\t\ttrue,\n\t\talgo,\n\t\tpubKey,\n\t}\n\treturn Marshal(data)\n}\n\nfunc appendU16(buf []byte, n uint16) []byte {\n\treturn append(buf, byte(n>>8), byte(n))\n}\n\nfunc appendU32(buf []byte, n uint32) []byte {\n\treturn append(buf, byte(n>>24), byte(n>>16), byte(n>>8), byte(n))\n}\n\nfunc appendU64(buf []byte, n uint64) []byte {\n\treturn append(buf,\n\t\tbyte(n>>56), byte(n>>48), byte(n>>40), byte(n>>32),\n\t\tbyte(n>>24), byte(n>>16), byte(n>>8), byte(n))\n}\n\nfunc appendInt(buf []byte, n int) []byte {\n\treturn appendU32(buf, uint32(n))\n}\n\nfunc appendString(buf []byte, s string) []byte {\n\tbuf = appendU32(buf, uint32(len(s)))\n\tbuf = append(buf, s...)\n\treturn buf\n}\n\nfunc appendBool(buf []byte, b bool) []byte {\n\tif b {\n\t\treturn append(buf, 1)\n\t}\n\treturn append(buf, 0)\n}\n\n// newCond is a helper to hide the fact that there is no usable zero\n// value for sync.Cond.\nfunc newCond() *sync.Cond { return sync.NewCond(new(sync.Mutex)) }\n\n// window represents the buffer available to clients\n// wishing to write to a channel.\ntype window struct {\n\t*sync.Cond\n\twin          uint32 // RFC 4254 5.2 says the window size can grow to 2^32-1\n\twriteWaiters int\n\tclosed       bool\n}\n\n// add adds win to the amount of window available\n// for consumers.\nfunc (w *window) add(win uint32) bool {\n\t// a zero sized window adjust is a noop.\n\tif win == 0 {\n\t\treturn true\n\t}\n\tw.L.Lock()\n\tif w.win+win < win {\n\t\tw.L.Unlock()\n\t\treturn false\n\t}\n\tw.win += win\n\t// It is unusual that multiple goroutines would be attempting to reserve\n\t// window space, but not guaranteed. Use broadcast to notify all waiters\n\t// that additional window is available.\n\tw.Broadcast()\n\tw.L.Unlock()\n\treturn true\n}\n\n// close sets the window to closed, so all reservations fail\n// immediately.\nfunc (w *window) close() {\n\tw.L.Lock()\n\tw.closed = true\n\tw.Broadcast()\n\tw.L.Unlock()\n}\n\n// reserve reserves win from the available window capacity.\n// If no capacity remains, reserve will block. reserve may\n// return less than requested.\nfunc (w *window) reserve(win uint32) (uint32, error) {\n\tvar err error\n\tw.L.Lock()\n\tw.writeWaiters++\n\tw.Broadcast()\n\tfor w.win == 0 && !w.closed {\n\t\tw.Wait()\n\t}\n\tw.writeWaiters--\n\tif w.win < win {\n\t\twin = w.win\n\t}\n\tw.win -= win\n\tif w.closed {\n\t\terr = io.EOF\n\t}\n\tw.L.Unlock()\n\treturn win, err\n}\n\n// waitWriterBlocked waits until some goroutine is blocked for further\n// writes. It is used in tests only.\nfunc (w *window) waitWriterBlocked() {\n\tw.Cond.L.Lock()\n\tfor w.writeWaiters == 0 {\n\t\tw.Cond.Wait()\n\t}\n\tw.Cond.L.Unlock()\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/connection.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"fmt\"\n\t\"net\"\n)\n\n// OpenChannelError is returned if the other side rejects an\n// OpenChannel request.\ntype OpenChannelError struct {\n\tReason  RejectionReason\n\tMessage string\n}\n\nfunc (e *OpenChannelError) Error() string {\n\treturn fmt.Sprintf(\"ssh: rejected: %s (%s)\", e.Reason, e.Message)\n}\n\n// ConnMetadata holds metadata for the connection.\ntype ConnMetadata interface {\n\t// User returns the user ID for this connection.\n\tUser() string\n\n\t// SessionID returns the session hash, also denoted by H.\n\tSessionID() []byte\n\n\t// ClientVersion returns the client's version string as hashed\n\t// into the session ID.\n\tClientVersion() []byte\n\n\t// ServerVersion returns the server's version string as hashed\n\t// into the session ID.\n\tServerVersion() []byte\n\n\t// RemoteAddr returns the remote address for this connection.\n\tRemoteAddr() net.Addr\n\n\t// LocalAddr returns the local address for this connection.\n\tLocalAddr() net.Addr\n}\n\n// Conn represents an SSH connection for both server and client roles.\n// Conn is the basis for implementing an application layer, such\n// as ClientConn, which implements the traditional shell access for\n// clients.\ntype Conn interface {\n\tConnMetadata\n\n\t// SendRequest sends a global request, and returns the\n\t// reply. If wantReply is true, it returns the response status\n\t// and payload. See also RFC4254, section 4.\n\tSendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error)\n\n\t// OpenChannel tries to open an channel. If the request is\n\t// rejected, it returns *OpenChannelError. On success it returns\n\t// the SSH Channel and a Go channel for incoming, out-of-band\n\t// requests. The Go channel must be serviced, or the\n\t// connection will hang.\n\tOpenChannel(name string, data []byte) (Channel, <-chan *Request, error)\n\n\t// Close closes the underlying network connection\n\tClose() error\n\n\t// Wait blocks until the connection has shut down, and returns the\n\t// error causing the shutdown.\n\tWait() error\n\n\t// TODO(hanwen): consider exposing:\n\t//   RequestKeyChange\n\t//   Disconnect\n}\n\n// DiscardRequests consumes and rejects all requests from the\n// passed-in channel.\nfunc DiscardRequests(in <-chan *Request) {\n\tfor req := range in {\n\t\tif req.WantReply {\n\t\t\treq.Reply(false, nil)\n\t\t}\n\t}\n}\n\n// A connection represents an incoming connection.\ntype connection struct {\n\ttransport *handshakeTransport\n\tsshConn\n\n\t// The connection protocol.\n\t*mux\n}\n\nfunc (c *connection) Close() error {\n\treturn c.sshConn.conn.Close()\n}\n\n// sshconn provides net.Conn metadata, but disallows direct reads and\n// writes.\ntype sshConn struct {\n\tconn net.Conn\n\n\tuser          string\n\tsessionID     []byte\n\tclientVersion []byte\n\tserverVersion []byte\n}\n\nfunc dup(src []byte) []byte {\n\tdst := make([]byte, len(src))\n\tcopy(dst, src)\n\treturn dst\n}\n\nfunc (c *sshConn) User() string {\n\treturn c.user\n}\n\nfunc (c *sshConn) RemoteAddr() net.Addr {\n\treturn c.conn.RemoteAddr()\n}\n\nfunc (c *sshConn) Close() error {\n\treturn c.conn.Close()\n}\n\nfunc (c *sshConn) LocalAddr() net.Addr {\n\treturn c.conn.LocalAddr()\n}\n\nfunc (c *sshConn) SessionID() []byte {\n\treturn dup(c.sessionID)\n}\n\nfunc (c *sshConn) ClientVersion() []byte {\n\treturn dup(c.clientVersion)\n}\n\nfunc (c *sshConn) ServerVersion() []byte {\n\treturn dup(c.serverVersion)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/doc.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/*\nPackage ssh implements an SSH client and server.\n\nSSH is a transport security protocol, an authentication protocol and a\nfamily of application protocols. The most typical application level\nprotocol is a remote shell and this is specifically implemented.  However,\nthe multiplexed nature of SSH is exposed to users that wish to support\nothers.\n\nReferences:\n  [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD\n  [SSH-PARAMETERS]:    http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1\n\nThis package does not fall under the stability promise of the Go language itself,\nso its API may be changed when pressing needs arise.\n*/\npackage ssh // import \"golang.org/x/crypto/ssh\"\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/handshake.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"crypto/rand\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"net\"\n\t\"sync\"\n)\n\n// debugHandshake, if set, prints messages sent and received.  Key\n// exchange messages are printed as if DH were used, so the debug\n// messages are wrong when using ECDH.\nconst debugHandshake = false\n\n// chanSize sets the amount of buffering SSH connections. This is\n// primarily for testing: setting chanSize=0 uncovers deadlocks more\n// quickly.\nconst chanSize = 16\n\n// keyingTransport is a packet based transport that supports key\n// changes. It need not be thread-safe. It should pass through\n// msgNewKeys in both directions.\ntype keyingTransport interface {\n\tpacketConn\n\n\t// prepareKeyChange sets up a key change. The key change for a\n\t// direction will be effected if a msgNewKeys message is sent\n\t// or received.\n\tprepareKeyChange(*algorithms, *kexResult) error\n}\n\n// handshakeTransport implements rekeying on top of a keyingTransport\n// and offers a thread-safe writePacket() interface.\ntype handshakeTransport struct {\n\tconn   keyingTransport\n\tconfig *Config\n\n\tserverVersion []byte\n\tclientVersion []byte\n\n\t// hostKeys is non-empty if we are the server. In that case,\n\t// it contains all host keys that can be used to sign the\n\t// connection.\n\thostKeys []Signer\n\n\t// hostKeyAlgorithms is non-empty if we are the client. In that case,\n\t// we accept these key types from the server as host key.\n\thostKeyAlgorithms []string\n\n\t// On read error, incoming is closed, and readError is set.\n\tincoming  chan []byte\n\treadError error\n\n\tmu             sync.Mutex\n\twriteError     error\n\tsentInitPacket []byte\n\tsentInitMsg    *kexInitMsg\n\tpendingPackets [][]byte // Used when a key exchange is in progress.\n\n\t// If the read loop wants to schedule a kex, it pings this\n\t// channel, and the write loop will send out a kex\n\t// message.\n\trequestKex chan struct{}\n\n\t// If the other side requests or confirms a kex, its kexInit\n\t// packet is sent here for the write loop to find it.\n\tstartKex chan *pendingKex\n\n\t// data for host key checking\n\thostKeyCallback HostKeyCallback\n\tdialAddress     string\n\tremoteAddr      net.Addr\n\n\t// Algorithms agreed in the last key exchange.\n\talgorithms *algorithms\n\n\treadPacketsLeft uint32\n\treadBytesLeft   int64\n\n\twritePacketsLeft uint32\n\twriteBytesLeft   int64\n\n\t// The session ID or nil if first kex did not complete yet.\n\tsessionID []byte\n}\n\ntype pendingKex struct {\n\totherInit []byte\n\tdone      chan error\n}\n\nfunc newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion []byte) *handshakeTransport {\n\tt := &handshakeTransport{\n\t\tconn:          conn,\n\t\tserverVersion: serverVersion,\n\t\tclientVersion: clientVersion,\n\t\tincoming:      make(chan []byte, chanSize),\n\t\trequestKex:    make(chan struct{}, 1),\n\t\tstartKex:      make(chan *pendingKex, 1),\n\n\t\tconfig: config,\n\t}\n\tt.resetReadThresholds()\n\tt.resetWriteThresholds()\n\n\t// We always start with a mandatory key exchange.\n\tt.requestKex <- struct{}{}\n\treturn t\n}\n\nfunc newClientTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ClientConfig, dialAddr string, addr net.Addr) *handshakeTransport {\n\tt := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion)\n\tt.dialAddress = dialAddr\n\tt.remoteAddr = addr\n\tt.hostKeyCallback = config.HostKeyCallback\n\tif config.HostKeyAlgorithms != nil {\n\t\tt.hostKeyAlgorithms = config.HostKeyAlgorithms\n\t} else {\n\t\tt.hostKeyAlgorithms = supportedHostKeyAlgos\n\t}\n\tgo t.readLoop()\n\tgo t.kexLoop()\n\treturn t\n}\n\nfunc newServerTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ServerConfig) *handshakeTransport {\n\tt := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion)\n\tt.hostKeys = config.hostKeys\n\tgo t.readLoop()\n\tgo t.kexLoop()\n\treturn t\n}\n\nfunc (t *handshakeTransport) getSessionID() []byte {\n\treturn t.sessionID\n}\n\n// waitSession waits for the session to be established. This should be\n// the first thing to call after instantiating handshakeTransport.\nfunc (t *handshakeTransport) waitSession() error {\n\tp, err := t.readPacket()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif p[0] != msgNewKeys {\n\t\treturn fmt.Errorf(\"ssh: first packet should be msgNewKeys\")\n\t}\n\n\treturn nil\n}\n\nfunc (t *handshakeTransport) id() string {\n\tif len(t.hostKeys) > 0 {\n\t\treturn \"server\"\n\t}\n\treturn \"client\"\n}\n\nfunc (t *handshakeTransport) printPacket(p []byte, write bool) {\n\taction := \"got\"\n\tif write {\n\t\taction = \"sent\"\n\t}\n\n\tif p[0] == msgChannelData || p[0] == msgChannelExtendedData {\n\t\tlog.Printf(\"%s %s data (packet %d bytes)\", t.id(), action, len(p))\n\t} else {\n\t\tmsg, err := decode(p)\n\t\tlog.Printf(\"%s %s %T %v (%v)\", t.id(), action, msg, msg, err)\n\t}\n}\n\nfunc (t *handshakeTransport) readPacket() ([]byte, error) {\n\tp, ok := <-t.incoming\n\tif !ok {\n\t\treturn nil, t.readError\n\t}\n\treturn p, nil\n}\n\nfunc (t *handshakeTransport) readLoop() {\n\tfirst := true\n\tfor {\n\t\tp, err := t.readOnePacket(first)\n\t\tfirst = false\n\t\tif err != nil {\n\t\t\tt.readError = err\n\t\t\tclose(t.incoming)\n\t\t\tbreak\n\t\t}\n\t\tif p[0] == msgIgnore || p[0] == msgDebug {\n\t\t\tcontinue\n\t\t}\n\t\tt.incoming <- p\n\t}\n\n\t// Stop writers too.\n\tt.recordWriteError(t.readError)\n\n\t// Unblock the writer should it wait for this.\n\tclose(t.startKex)\n\n\t// Don't close t.requestKex; it's also written to from writePacket.\n}\n\nfunc (t *handshakeTransport) pushPacket(p []byte) error {\n\tif debugHandshake {\n\t\tt.printPacket(p, true)\n\t}\n\treturn t.conn.writePacket(p)\n}\n\nfunc (t *handshakeTransport) getWriteError() error {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\treturn t.writeError\n}\n\nfunc (t *handshakeTransport) recordWriteError(err error) {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\tif t.writeError == nil && err != nil {\n\t\tt.writeError = err\n\t}\n}\n\nfunc (t *handshakeTransport) requestKeyExchange() {\n\tselect {\n\tcase t.requestKex <- struct{}{}:\n\tdefault:\n\t\t// something already requested a kex, so do nothing.\n\t}\n}\n\nfunc (t *handshakeTransport) resetWriteThresholds() {\n\tt.writePacketsLeft = packetRekeyThreshold\n\tif t.config.RekeyThreshold > 0 {\n\t\tt.writeBytesLeft = int64(t.config.RekeyThreshold)\n\t} else if t.algorithms != nil {\n\t\tt.writeBytesLeft = t.algorithms.w.rekeyBytes()\n\t} else {\n\t\tt.writeBytesLeft = 1 << 30\n\t}\n}\n\nfunc (t *handshakeTransport) kexLoop() {\n\nwrite:\n\tfor t.getWriteError() == nil {\n\t\tvar request *pendingKex\n\t\tvar sent bool\n\n\t\tfor request == nil || !sent {\n\t\t\tvar ok bool\n\t\t\tselect {\n\t\t\tcase request, ok = <-t.startKex:\n\t\t\t\tif !ok {\n\t\t\t\t\tbreak write\n\t\t\t\t}\n\t\t\tcase <-t.requestKex:\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif !sent {\n\t\t\t\tif err := t.sendKexInit(); err != nil {\n\t\t\t\t\tt.recordWriteError(err)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tsent = true\n\t\t\t}\n\t\t}\n\n\t\tif err := t.getWriteError(); err != nil {\n\t\t\tif request != nil {\n\t\t\t\trequest.done <- err\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\t// We're not servicing t.requestKex, but that is OK:\n\t\t// we never block on sending to t.requestKex.\n\n\t\t// We're not servicing t.startKex, but the remote end\n\t\t// has just sent us a kexInitMsg, so it can't send\n\t\t// another key change request, until we close the done\n\t\t// channel on the pendingKex request.\n\n\t\terr := t.enterKeyExchange(request.otherInit)\n\n\t\tt.mu.Lock()\n\t\tt.writeError = err\n\t\tt.sentInitPacket = nil\n\t\tt.sentInitMsg = nil\n\n\t\tt.resetWriteThresholds()\n\n\t\t// we have completed the key exchange. Since the\n\t\t// reader is still blocked, it is safe to clear out\n\t\t// the requestKex channel. This avoids the situation\n\t\t// where: 1) we consumed our own request for the\n\t\t// initial kex, and 2) the kex from the remote side\n\t\t// caused another send on the requestKex channel,\n\tclear:\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase <-t.requestKex:\n\t\t\t\t//\n\t\t\tdefault:\n\t\t\t\tbreak clear\n\t\t\t}\n\t\t}\n\n\t\trequest.done <- t.writeError\n\n\t\t// kex finished. Push packets that we received while\n\t\t// the kex was in progress. Don't look at t.startKex\n\t\t// and don't increment writtenSinceKex: if we trigger\n\t\t// another kex while we are still busy with the last\n\t\t// one, things will become very confusing.\n\t\tfor _, p := range t.pendingPackets {\n\t\t\tt.writeError = t.pushPacket(p)\n\t\t\tif t.writeError != nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tt.pendingPackets = t.pendingPackets[:0]\n\t\tt.mu.Unlock()\n\t}\n\n\t// drain startKex channel. We don't service t.requestKex\n\t// because nobody does blocking sends there.\n\tgo func() {\n\t\tfor init := range t.startKex {\n\t\t\tinit.done <- t.writeError\n\t\t}\n\t}()\n\n\t// Unblock reader.\n\tt.conn.Close()\n}\n\n// The protocol uses uint32 for packet counters, so we can't let them\n// reach 1<<32.  We will actually read and write more packets than\n// this, though: the other side may send more packets, and after we\n// hit this limit on writing we will send a few more packets for the\n// key exchange itself.\nconst packetRekeyThreshold = (1 << 31)\n\nfunc (t *handshakeTransport) resetReadThresholds() {\n\tt.readPacketsLeft = packetRekeyThreshold\n\tif t.config.RekeyThreshold > 0 {\n\t\tt.readBytesLeft = int64(t.config.RekeyThreshold)\n\t} else if t.algorithms != nil {\n\t\tt.readBytesLeft = t.algorithms.r.rekeyBytes()\n\t} else {\n\t\tt.readBytesLeft = 1 << 30\n\t}\n}\n\nfunc (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) {\n\tp, err := t.conn.readPacket()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif t.readPacketsLeft > 0 {\n\t\tt.readPacketsLeft--\n\t} else {\n\t\tt.requestKeyExchange()\n\t}\n\n\tif t.readBytesLeft > 0 {\n\t\tt.readBytesLeft -= int64(len(p))\n\t} else {\n\t\tt.requestKeyExchange()\n\t}\n\n\tif debugHandshake {\n\t\tt.printPacket(p, false)\n\t}\n\n\tif first && p[0] != msgKexInit {\n\t\treturn nil, fmt.Errorf(\"ssh: first packet should be msgKexInit\")\n\t}\n\n\tif p[0] != msgKexInit {\n\t\treturn p, nil\n\t}\n\n\tfirstKex := t.sessionID == nil\n\n\tkex := pendingKex{\n\t\tdone:      make(chan error, 1),\n\t\totherInit: p,\n\t}\n\tt.startKex <- &kex\n\terr = <-kex.done\n\n\tif debugHandshake {\n\t\tlog.Printf(\"%s exited key exchange (first %v), err %v\", t.id(), firstKex, err)\n\t}\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tt.resetReadThresholds()\n\n\t// By default, a key exchange is hidden from higher layers by\n\t// translating it into msgIgnore.\n\tsuccessPacket := []byte{msgIgnore}\n\tif firstKex {\n\t\t// sendKexInit() for the first kex waits for\n\t\t// msgNewKeys so the authentication process is\n\t\t// guaranteed to happen over an encrypted transport.\n\t\tsuccessPacket = []byte{msgNewKeys}\n\t}\n\n\treturn successPacket, nil\n}\n\n// sendKexInit sends a key change message.\nfunc (t *handshakeTransport) sendKexInit() error {\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\tif t.sentInitMsg != nil {\n\t\t// kexInits may be sent either in response to the other side,\n\t\t// or because our side wants to initiate a key change, so we\n\t\t// may have already sent a kexInit. In that case, don't send a\n\t\t// second kexInit.\n\t\treturn nil\n\t}\n\n\tmsg := &kexInitMsg{\n\t\tKexAlgos:                t.config.KeyExchanges,\n\t\tCiphersClientServer:     t.config.Ciphers,\n\t\tCiphersServerClient:     t.config.Ciphers,\n\t\tMACsClientServer:        t.config.MACs,\n\t\tMACsServerClient:        t.config.MACs,\n\t\tCompressionClientServer: supportedCompressions,\n\t\tCompressionServerClient: supportedCompressions,\n\t}\n\tio.ReadFull(rand.Reader, msg.Cookie[:])\n\n\tif len(t.hostKeys) > 0 {\n\t\tfor _, k := range t.hostKeys {\n\t\t\tmsg.ServerHostKeyAlgos = append(\n\t\t\t\tmsg.ServerHostKeyAlgos, k.PublicKey().Type())\n\t\t}\n\t} else {\n\t\tmsg.ServerHostKeyAlgos = t.hostKeyAlgorithms\n\t}\n\tpacket := Marshal(msg)\n\n\t// writePacket destroys the contents, so save a copy.\n\tpacketCopy := make([]byte, len(packet))\n\tcopy(packetCopy, packet)\n\n\tif err := t.pushPacket(packetCopy); err != nil {\n\t\treturn err\n\t}\n\n\tt.sentInitMsg = msg\n\tt.sentInitPacket = packet\n\n\treturn nil\n}\n\nfunc (t *handshakeTransport) writePacket(p []byte) error {\n\tswitch p[0] {\n\tcase msgKexInit:\n\t\treturn errors.New(\"ssh: only handshakeTransport can send kexInit\")\n\tcase msgNewKeys:\n\t\treturn errors.New(\"ssh: only handshakeTransport can send newKeys\")\n\t}\n\n\tt.mu.Lock()\n\tdefer t.mu.Unlock()\n\tif t.writeError != nil {\n\t\treturn t.writeError\n\t}\n\n\tif t.sentInitMsg != nil {\n\t\t// Copy the packet so the writer can reuse the buffer.\n\t\tcp := make([]byte, len(p))\n\t\tcopy(cp, p)\n\t\tt.pendingPackets = append(t.pendingPackets, cp)\n\t\treturn nil\n\t}\n\n\tif t.writeBytesLeft > 0 {\n\t\tt.writeBytesLeft -= int64(len(p))\n\t} else {\n\t\tt.requestKeyExchange()\n\t}\n\n\tif t.writePacketsLeft > 0 {\n\t\tt.writePacketsLeft--\n\t} else {\n\t\tt.requestKeyExchange()\n\t}\n\n\tif err := t.pushPacket(p); err != nil {\n\t\tt.writeError = err\n\t}\n\n\treturn nil\n}\n\nfunc (t *handshakeTransport) Close() error {\n\treturn t.conn.Close()\n}\n\nfunc (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {\n\tif debugHandshake {\n\t\tlog.Printf(\"%s entered key exchange\", t.id())\n\t}\n\n\totherInit := &kexInitMsg{}\n\tif err := Unmarshal(otherInitPacket, otherInit); err != nil {\n\t\treturn err\n\t}\n\n\tmagics := handshakeMagics{\n\t\tclientVersion: t.clientVersion,\n\t\tserverVersion: t.serverVersion,\n\t\tclientKexInit: otherInitPacket,\n\t\tserverKexInit: t.sentInitPacket,\n\t}\n\n\tclientInit := otherInit\n\tserverInit := t.sentInitMsg\n\tif len(t.hostKeys) == 0 {\n\t\tclientInit, serverInit = serverInit, clientInit\n\n\t\tmagics.clientKexInit = t.sentInitPacket\n\t\tmagics.serverKexInit = otherInitPacket\n\t}\n\n\tvar err error\n\tt.algorithms, err = findAgreedAlgorithms(clientInit, serverInit)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// We don't send FirstKexFollows, but we handle receiving it.\n\t//\n\t// RFC 4253 section 7 defines the kex and the agreement method for\n\t// first_kex_packet_follows. It states that the guessed packet\n\t// should be ignored if the \"kex algorithm and/or the host\n\t// key algorithm is guessed wrong (server and client have\n\t// different preferred algorithm), or if any of the other\n\t// algorithms cannot be agreed upon\". The other algorithms have\n\t// already been checked above so the kex algorithm and host key\n\t// algorithm are checked here.\n\tif otherInit.FirstKexFollows && (clientInit.KexAlgos[0] != serverInit.KexAlgos[0] || clientInit.ServerHostKeyAlgos[0] != serverInit.ServerHostKeyAlgos[0]) {\n\t\t// other side sent a kex message for the wrong algorithm,\n\t\t// which we have to ignore.\n\t\tif _, err := t.conn.readPacket(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tkex, ok := kexAlgoMap[t.algorithms.kex]\n\tif !ok {\n\t\treturn fmt.Errorf(\"ssh: unexpected key exchange algorithm %v\", t.algorithms.kex)\n\t}\n\n\tvar result *kexResult\n\tif len(t.hostKeys) > 0 {\n\t\tresult, err = t.server(kex, t.algorithms, &magics)\n\t} else {\n\t\tresult, err = t.client(kex, t.algorithms, &magics)\n\t}\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif t.sessionID == nil {\n\t\tt.sessionID = result.H\n\t}\n\tresult.SessionID = t.sessionID\n\n\tif err := t.conn.prepareKeyChange(t.algorithms, result); err != nil {\n\t\treturn err\n\t}\n\tif err = t.conn.writePacket([]byte{msgNewKeys}); err != nil {\n\t\treturn err\n\t}\n\tif packet, err := t.conn.readPacket(); err != nil {\n\t\treturn err\n\t} else if packet[0] != msgNewKeys {\n\t\treturn unexpectedMessageError(msgNewKeys, packet[0])\n\t}\n\n\treturn nil\n}\n\nfunc (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) {\n\tvar hostKey Signer\n\tfor _, k := range t.hostKeys {\n\t\tif algs.hostKey == k.PublicKey().Type() {\n\t\t\thostKey = k\n\t\t}\n\t}\n\n\tr, err := kex.Server(t.conn, t.config.Rand, magics, hostKey)\n\treturn r, err\n}\n\nfunc (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) {\n\tresult, err := kex.Client(t.conn, t.config.Rand, magics)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\thostKey, err := ParsePublicKey(result.HostKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err := verifyHostKeySignature(hostKey, result); err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = t.hostKeyCallback(t.dialAddress, t.remoteAddr, hostKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/kex.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"crypto\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/subtle\"\n\t\"errors\"\n\t\"io\"\n\t\"math/big\"\n\n\t\"golang.org/x/crypto/curve25519\"\n)\n\nconst (\n\tkexAlgoDH1SHA1          = \"diffie-hellman-group1-sha1\"\n\tkexAlgoDH14SHA1         = \"diffie-hellman-group14-sha1\"\n\tkexAlgoECDH256          = \"ecdh-sha2-nistp256\"\n\tkexAlgoECDH384          = \"ecdh-sha2-nistp384\"\n\tkexAlgoECDH521          = \"ecdh-sha2-nistp521\"\n\tkexAlgoCurve25519SHA256 = \"curve25519-sha256@libssh.org\"\n)\n\n// kexResult captures the outcome of a key exchange.\ntype kexResult struct {\n\t// Session hash. See also RFC 4253, section 8.\n\tH []byte\n\n\t// Shared secret. See also RFC 4253, section 8.\n\tK []byte\n\n\t// Host key as hashed into H.\n\tHostKey []byte\n\n\t// Signature of H.\n\tSignature []byte\n\n\t// A cryptographic hash function that matches the security\n\t// level of the key exchange algorithm. It is used for\n\t// calculating H, and for deriving keys from H and K.\n\tHash crypto.Hash\n\n\t// The session ID, which is the first H computed. This is used\n\t// to derive key material inside the transport.\n\tSessionID []byte\n}\n\n// handshakeMagics contains data that is always included in the\n// session hash.\ntype handshakeMagics struct {\n\tclientVersion, serverVersion []byte\n\tclientKexInit, serverKexInit []byte\n}\n\nfunc (m *handshakeMagics) write(w io.Writer) {\n\twriteString(w, m.clientVersion)\n\twriteString(w, m.serverVersion)\n\twriteString(w, m.clientKexInit)\n\twriteString(w, m.serverKexInit)\n}\n\n// kexAlgorithm abstracts different key exchange algorithms.\ntype kexAlgorithm interface {\n\t// Server runs server-side key agreement, signing the result\n\t// with a hostkey.\n\tServer(p packetConn, rand io.Reader, magics *handshakeMagics, s Signer) (*kexResult, error)\n\n\t// Client runs the client-side key agreement. Caller is\n\t// responsible for verifying the host key signature.\n\tClient(p packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error)\n}\n\n// dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement.\ntype dhGroup struct {\n\tg, p, pMinus1 *big.Int\n}\n\nfunc (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) {\n\tif theirPublic.Cmp(bigOne) <= 0 || theirPublic.Cmp(group.pMinus1) >= 0 {\n\t\treturn nil, errors.New(\"ssh: DH parameter out of bounds\")\n\t}\n\treturn new(big.Int).Exp(theirPublic, myPrivate, group.p), nil\n}\n\nfunc (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) {\n\thashFunc := crypto.SHA1\n\n\tvar x *big.Int\n\tfor {\n\t\tvar err error\n\t\tif x, err = rand.Int(randSource, group.pMinus1); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif x.Sign() > 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tX := new(big.Int).Exp(group.g, x, group.p)\n\tkexDHInit := kexDHInitMsg{\n\t\tX: X,\n\t}\n\tif err := c.writePacket(Marshal(&kexDHInit)); err != nil {\n\t\treturn nil, err\n\t}\n\n\tpacket, err := c.readPacket()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar kexDHReply kexDHReplyMsg\n\tif err = Unmarshal(packet, &kexDHReply); err != nil {\n\t\treturn nil, err\n\t}\n\n\tkInt, err := group.diffieHellman(kexDHReply.Y, x)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\th := hashFunc.New()\n\tmagics.write(h)\n\twriteString(h, kexDHReply.HostKey)\n\twriteInt(h, X)\n\twriteInt(h, kexDHReply.Y)\n\tK := make([]byte, intLength(kInt))\n\tmarshalInt(K, kInt)\n\th.Write(K)\n\n\treturn &kexResult{\n\t\tH:         h.Sum(nil),\n\t\tK:         K,\n\t\tHostKey:   kexDHReply.HostKey,\n\t\tSignature: kexDHReply.Signature,\n\t\tHash:      crypto.SHA1,\n\t}, nil\n}\n\nfunc (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) {\n\thashFunc := crypto.SHA1\n\tpacket, err := c.readPacket()\n\tif err != nil {\n\t\treturn\n\t}\n\tvar kexDHInit kexDHInitMsg\n\tif err = Unmarshal(packet, &kexDHInit); err != nil {\n\t\treturn\n\t}\n\n\tvar y *big.Int\n\tfor {\n\t\tif y, err = rand.Int(randSource, group.pMinus1); err != nil {\n\t\t\treturn\n\t\t}\n\t\tif y.Sign() > 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tY := new(big.Int).Exp(group.g, y, group.p)\n\tkInt, err := group.diffieHellman(kexDHInit.X, y)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\thostKeyBytes := priv.PublicKey().Marshal()\n\n\th := hashFunc.New()\n\tmagics.write(h)\n\twriteString(h, hostKeyBytes)\n\twriteInt(h, kexDHInit.X)\n\twriteInt(h, Y)\n\n\tK := make([]byte, intLength(kInt))\n\tmarshalInt(K, kInt)\n\th.Write(K)\n\n\tH := h.Sum(nil)\n\n\t// H is already a hash, but the hostkey signing will apply its\n\t// own key-specific hash algorithm.\n\tsig, err := signAndMarshal(priv, randSource, H)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tkexDHReply := kexDHReplyMsg{\n\t\tHostKey:   hostKeyBytes,\n\t\tY:         Y,\n\t\tSignature: sig,\n\t}\n\tpacket = Marshal(&kexDHReply)\n\n\terr = c.writePacket(packet)\n\treturn &kexResult{\n\t\tH:         H,\n\t\tK:         K,\n\t\tHostKey:   hostKeyBytes,\n\t\tSignature: sig,\n\t\tHash:      crypto.SHA1,\n\t}, nil\n}\n\n// ecdh performs Elliptic Curve Diffie-Hellman key exchange as\n// described in RFC 5656, section 4.\ntype ecdh struct {\n\tcurve elliptic.Curve\n}\n\nfunc (kex *ecdh) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) {\n\tephKey, err := ecdsa.GenerateKey(kex.curve, rand)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tkexInit := kexECDHInitMsg{\n\t\tClientPubKey: elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y),\n\t}\n\n\tserialized := Marshal(&kexInit)\n\tif err := c.writePacket(serialized); err != nil {\n\t\treturn nil, err\n\t}\n\n\tpacket, err := c.readPacket()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar reply kexECDHReplyMsg\n\tif err = Unmarshal(packet, &reply); err != nil {\n\t\treturn nil, err\n\t}\n\n\tx, y, err := unmarshalECKey(kex.curve, reply.EphemeralPubKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// generate shared secret\n\tsecret, _ := kex.curve.ScalarMult(x, y, ephKey.D.Bytes())\n\n\th := ecHash(kex.curve).New()\n\tmagics.write(h)\n\twriteString(h, reply.HostKey)\n\twriteString(h, kexInit.ClientPubKey)\n\twriteString(h, reply.EphemeralPubKey)\n\tK := make([]byte, intLength(secret))\n\tmarshalInt(K, secret)\n\th.Write(K)\n\n\treturn &kexResult{\n\t\tH:         h.Sum(nil),\n\t\tK:         K,\n\t\tHostKey:   reply.HostKey,\n\t\tSignature: reply.Signature,\n\t\tHash:      ecHash(kex.curve),\n\t}, nil\n}\n\n// unmarshalECKey parses and checks an EC key.\nfunc unmarshalECKey(curve elliptic.Curve, pubkey []byte) (x, y *big.Int, err error) {\n\tx, y = elliptic.Unmarshal(curve, pubkey)\n\tif x == nil {\n\t\treturn nil, nil, errors.New(\"ssh: elliptic.Unmarshal failure\")\n\t}\n\tif !validateECPublicKey(curve, x, y) {\n\t\treturn nil, nil, errors.New(\"ssh: public key not on curve\")\n\t}\n\treturn x, y, nil\n}\n\n// validateECPublicKey checks that the point is a valid public key for\n// the given curve. See [SEC1], 3.2.2\nfunc validateECPublicKey(curve elliptic.Curve, x, y *big.Int) bool {\n\tif x.Sign() == 0 && y.Sign() == 0 {\n\t\treturn false\n\t}\n\n\tif x.Cmp(curve.Params().P) >= 0 {\n\t\treturn false\n\t}\n\n\tif y.Cmp(curve.Params().P) >= 0 {\n\t\treturn false\n\t}\n\n\tif !curve.IsOnCurve(x, y) {\n\t\treturn false\n\t}\n\n\t// We don't check if N * PubKey == 0, since\n\t//\n\t// - the NIST curves have cofactor = 1, so this is implicit.\n\t// (We don't foresee an implementation that supports non NIST\n\t// curves)\n\t//\n\t// - for ephemeral keys, we don't need to worry about small\n\t// subgroup attacks.\n\treturn true\n}\n\nfunc (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) {\n\tpacket, err := c.readPacket()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar kexECDHInit kexECDHInitMsg\n\tif err = Unmarshal(packet, &kexECDHInit); err != nil {\n\t\treturn nil, err\n\t}\n\n\tclientX, clientY, err := unmarshalECKey(kex.curve, kexECDHInit.ClientPubKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// We could cache this key across multiple users/multiple\n\t// connection attempts, but the benefit is small. OpenSSH\n\t// generates a new key for each incoming connection.\n\tephKey, err := ecdsa.GenerateKey(kex.curve, rand)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\thostKeyBytes := priv.PublicKey().Marshal()\n\n\tserializedEphKey := elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y)\n\n\t// generate shared secret\n\tsecret, _ := kex.curve.ScalarMult(clientX, clientY, ephKey.D.Bytes())\n\n\th := ecHash(kex.curve).New()\n\tmagics.write(h)\n\twriteString(h, hostKeyBytes)\n\twriteString(h, kexECDHInit.ClientPubKey)\n\twriteString(h, serializedEphKey)\n\n\tK := make([]byte, intLength(secret))\n\tmarshalInt(K, secret)\n\th.Write(K)\n\n\tH := h.Sum(nil)\n\n\t// H is already a hash, but the hostkey signing will apply its\n\t// own key-specific hash algorithm.\n\tsig, err := signAndMarshal(priv, rand, H)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treply := kexECDHReplyMsg{\n\t\tEphemeralPubKey: serializedEphKey,\n\t\tHostKey:         hostKeyBytes,\n\t\tSignature:       sig,\n\t}\n\n\tserialized := Marshal(&reply)\n\tif err := c.writePacket(serialized); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &kexResult{\n\t\tH:         H,\n\t\tK:         K,\n\t\tHostKey:   reply.HostKey,\n\t\tSignature: sig,\n\t\tHash:      ecHash(kex.curve),\n\t}, nil\n}\n\nvar kexAlgoMap = map[string]kexAlgorithm{}\n\nfunc init() {\n\t// This is the group called diffie-hellman-group1-sha1 in RFC\n\t// 4253 and Oakley Group 2 in RFC 2409.\n\tp, _ := new(big.Int).SetString(\"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF\", 16)\n\tkexAlgoMap[kexAlgoDH1SHA1] = &dhGroup{\n\t\tg:       new(big.Int).SetInt64(2),\n\t\tp:       p,\n\t\tpMinus1: new(big.Int).Sub(p, bigOne),\n\t}\n\n\t// This is the group called diffie-hellman-group14-sha1 in RFC\n\t// 4253 and Oakley Group 14 in RFC 3526.\n\tp, _ = new(big.Int).SetString(\"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF\", 16)\n\n\tkexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{\n\t\tg:       new(big.Int).SetInt64(2),\n\t\tp:       p,\n\t\tpMinus1: new(big.Int).Sub(p, bigOne),\n\t}\n\n\tkexAlgoMap[kexAlgoECDH521] = &ecdh{elliptic.P521()}\n\tkexAlgoMap[kexAlgoECDH384] = &ecdh{elliptic.P384()}\n\tkexAlgoMap[kexAlgoECDH256] = &ecdh{elliptic.P256()}\n\tkexAlgoMap[kexAlgoCurve25519SHA256] = &curve25519sha256{}\n}\n\n// curve25519sha256 implements the curve25519-sha256@libssh.org key\n// agreement protocol, as described in\n// https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt\ntype curve25519sha256 struct{}\n\ntype curve25519KeyPair struct {\n\tpriv [32]byte\n\tpub  [32]byte\n}\n\nfunc (kp *curve25519KeyPair) generate(rand io.Reader) error {\n\tif _, err := io.ReadFull(rand, kp.priv[:]); err != nil {\n\t\treturn err\n\t}\n\tcurve25519.ScalarBaseMult(&kp.pub, &kp.priv)\n\treturn nil\n}\n\n// curve25519Zeros is just an array of 32 zero bytes so that we have something\n// convenient to compare against in order to reject curve25519 points with the\n// wrong order.\nvar curve25519Zeros [32]byte\n\nfunc (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) {\n\tvar kp curve25519KeyPair\n\tif err := kp.generate(rand); err != nil {\n\t\treturn nil, err\n\t}\n\tif err := c.writePacket(Marshal(&kexECDHInitMsg{kp.pub[:]})); err != nil {\n\t\treturn nil, err\n\t}\n\n\tpacket, err := c.readPacket()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar reply kexECDHReplyMsg\n\tif err = Unmarshal(packet, &reply); err != nil {\n\t\treturn nil, err\n\t}\n\tif len(reply.EphemeralPubKey) != 32 {\n\t\treturn nil, errors.New(\"ssh: peer's curve25519 public value has wrong length\")\n\t}\n\n\tvar servPub, secret [32]byte\n\tcopy(servPub[:], reply.EphemeralPubKey)\n\tcurve25519.ScalarMult(&secret, &kp.priv, &servPub)\n\tif subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 {\n\t\treturn nil, errors.New(\"ssh: peer's curve25519 public value has wrong order\")\n\t}\n\n\th := crypto.SHA256.New()\n\tmagics.write(h)\n\twriteString(h, reply.HostKey)\n\twriteString(h, kp.pub[:])\n\twriteString(h, reply.EphemeralPubKey)\n\n\tkInt := new(big.Int).SetBytes(secret[:])\n\tK := make([]byte, intLength(kInt))\n\tmarshalInt(K, kInt)\n\th.Write(K)\n\n\treturn &kexResult{\n\t\tH:         h.Sum(nil),\n\t\tK:         K,\n\t\tHostKey:   reply.HostKey,\n\t\tSignature: reply.Signature,\n\t\tHash:      crypto.SHA256,\n\t}, nil\n}\n\nfunc (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) {\n\tpacket, err := c.readPacket()\n\tif err != nil {\n\t\treturn\n\t}\n\tvar kexInit kexECDHInitMsg\n\tif err = Unmarshal(packet, &kexInit); err != nil {\n\t\treturn\n\t}\n\n\tif len(kexInit.ClientPubKey) != 32 {\n\t\treturn nil, errors.New(\"ssh: peer's curve25519 public value has wrong length\")\n\t}\n\n\tvar kp curve25519KeyPair\n\tif err := kp.generate(rand); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar clientPub, secret [32]byte\n\tcopy(clientPub[:], kexInit.ClientPubKey)\n\tcurve25519.ScalarMult(&secret, &kp.priv, &clientPub)\n\tif subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 {\n\t\treturn nil, errors.New(\"ssh: peer's curve25519 public value has wrong order\")\n\t}\n\n\thostKeyBytes := priv.PublicKey().Marshal()\n\n\th := crypto.SHA256.New()\n\tmagics.write(h)\n\twriteString(h, hostKeyBytes)\n\twriteString(h, kexInit.ClientPubKey)\n\twriteString(h, kp.pub[:])\n\n\tkInt := new(big.Int).SetBytes(secret[:])\n\tK := make([]byte, intLength(kInt))\n\tmarshalInt(K, kInt)\n\th.Write(K)\n\n\tH := h.Sum(nil)\n\n\tsig, err := signAndMarshal(priv, rand, H)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treply := kexECDHReplyMsg{\n\t\tEphemeralPubKey: kp.pub[:],\n\t\tHostKey:         hostKeyBytes,\n\t\tSignature:       sig,\n\t}\n\tif err := c.writePacket(Marshal(&reply)); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &kexResult{\n\t\tH:         H,\n\t\tK:         K,\n\t\tHostKey:   hostKeyBytes,\n\t\tSignature: sig,\n\t\tHash:      crypto.SHA256,\n\t}, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/keys.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"bytes\"\n\t\"crypto\"\n\t\"crypto/dsa\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/md5\"\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"crypto/x509\"\n\t\"encoding/asn1\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"golang.org/x/crypto/ed25519\"\n)\n\n// These constants represent the algorithm names for key types supported by this\n// package.\nconst (\n\tKeyAlgoRSA      = \"ssh-rsa\"\n\tKeyAlgoDSA      = \"ssh-dss\"\n\tKeyAlgoECDSA256 = \"ecdsa-sha2-nistp256\"\n\tKeyAlgoECDSA384 = \"ecdsa-sha2-nistp384\"\n\tKeyAlgoECDSA521 = \"ecdsa-sha2-nistp521\"\n\tKeyAlgoED25519  = \"ssh-ed25519\"\n)\n\n// parsePubKey parses a public key of the given algorithm.\n// Use ParsePublicKey for keys with prepended algorithm.\nfunc parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) {\n\tswitch algo {\n\tcase KeyAlgoRSA:\n\t\treturn parseRSA(in)\n\tcase KeyAlgoDSA:\n\t\treturn parseDSA(in)\n\tcase KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521:\n\t\treturn parseECDSA(in)\n\tcase KeyAlgoED25519:\n\t\treturn parseED25519(in)\n\tcase CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01:\n\t\tcert, err := parseCert(in, certToPrivAlgo(algo))\n\t\tif err != nil {\n\t\t\treturn nil, nil, err\n\t\t}\n\t\treturn cert, nil, nil\n\t}\n\treturn nil, nil, fmt.Errorf(\"ssh: unknown key algorithm: %v\", algo)\n}\n\n// parseAuthorizedKey parses a public key in OpenSSH authorized_keys format\n// (see sshd(8) manual page) once the options and key type fields have been\n// removed.\nfunc parseAuthorizedKey(in []byte) (out PublicKey, comment string, err error) {\n\tin = bytes.TrimSpace(in)\n\n\ti := bytes.IndexAny(in, \" \\t\")\n\tif i == -1 {\n\t\ti = len(in)\n\t}\n\tbase64Key := in[:i]\n\n\tkey := make([]byte, base64.StdEncoding.DecodedLen(len(base64Key)))\n\tn, err := base64.StdEncoding.Decode(key, base64Key)\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\tkey = key[:n]\n\tout, err = ParsePublicKey(key)\n\tif err != nil {\n\t\treturn nil, \"\", err\n\t}\n\tcomment = string(bytes.TrimSpace(in[i:]))\n\treturn out, comment, nil\n}\n\n// ParseKnownHosts parses an entry in the format of the known_hosts file.\n//\n// The known_hosts format is documented in the sshd(8) manual page. This\n// function will parse a single entry from in. On successful return, marker\n// will contain the optional marker value (i.e. \"cert-authority\" or \"revoked\")\n// or else be empty, hosts will contain the hosts that this entry matches,\n// pubKey will contain the public key and comment will contain any trailing\n// comment at the end of the line. See the sshd(8) manual page for the various\n// forms that a host string can take.\n//\n// The unparsed remainder of the input will be returned in rest. This function\n// can be called repeatedly to parse multiple entries.\n//\n// If no entries were found in the input then err will be io.EOF. Otherwise a\n// non-nil err value indicates a parse error.\nfunc ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey, comment string, rest []byte, err error) {\n\tfor len(in) > 0 {\n\t\tend := bytes.IndexByte(in, '\\n')\n\t\tif end != -1 {\n\t\t\trest = in[end+1:]\n\t\t\tin = in[:end]\n\t\t} else {\n\t\t\trest = nil\n\t\t}\n\n\t\tend = bytes.IndexByte(in, '\\r')\n\t\tif end != -1 {\n\t\t\tin = in[:end]\n\t\t}\n\n\t\tin = bytes.TrimSpace(in)\n\t\tif len(in) == 0 || in[0] == '#' {\n\t\t\tin = rest\n\t\t\tcontinue\n\t\t}\n\n\t\ti := bytes.IndexAny(in, \" \\t\")\n\t\tif i == -1 {\n\t\t\tin = rest\n\t\t\tcontinue\n\t\t}\n\n\t\t// Strip out the beginning of the known_host key.\n\t\t// This is either an optional marker or a (set of) hostname(s).\n\t\tkeyFields := bytes.Fields(in)\n\t\tif len(keyFields) < 3 || len(keyFields) > 5 {\n\t\t\treturn \"\", nil, nil, \"\", nil, errors.New(\"ssh: invalid entry in known_hosts data\")\n\t\t}\n\n\t\t// keyFields[0] is either \"@cert-authority\", \"@revoked\" or a comma separated\n\t\t// list of hosts\n\t\tmarker := \"\"\n\t\tif keyFields[0][0] == '@' {\n\t\t\tmarker = string(keyFields[0][1:])\n\t\t\tkeyFields = keyFields[1:]\n\t\t}\n\n\t\thosts := string(keyFields[0])\n\t\t// keyFields[1] contains the key type (e.g. “ssh-rsa”).\n\t\t// However, that information is duplicated inside the\n\t\t// base64-encoded key and so is ignored here.\n\n\t\tkey := bytes.Join(keyFields[2:], []byte(\" \"))\n\t\tif pubKey, comment, err = parseAuthorizedKey(key); err != nil {\n\t\t\treturn \"\", nil, nil, \"\", nil, err\n\t\t}\n\n\t\treturn marker, strings.Split(hosts, \",\"), pubKey, comment, rest, nil\n\t}\n\n\treturn \"\", nil, nil, \"\", nil, io.EOF\n}\n\n// ParseAuthorizedKeys parses a public key from an authorized_keys\n// file used in OpenSSH according to the sshd(8) manual page.\nfunc ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {\n\tfor len(in) > 0 {\n\t\tend := bytes.IndexByte(in, '\\n')\n\t\tif end != -1 {\n\t\t\trest = in[end+1:]\n\t\t\tin = in[:end]\n\t\t} else {\n\t\t\trest = nil\n\t\t}\n\n\t\tend = bytes.IndexByte(in, '\\r')\n\t\tif end != -1 {\n\t\t\tin = in[:end]\n\t\t}\n\n\t\tin = bytes.TrimSpace(in)\n\t\tif len(in) == 0 || in[0] == '#' {\n\t\t\tin = rest\n\t\t\tcontinue\n\t\t}\n\n\t\ti := bytes.IndexAny(in, \" \\t\")\n\t\tif i == -1 {\n\t\t\tin = rest\n\t\t\tcontinue\n\t\t}\n\n\t\tif out, comment, err = parseAuthorizedKey(in[i:]); err == nil {\n\t\t\treturn out, comment, options, rest, nil\n\t\t}\n\n\t\t// No key type recognised. Maybe there's an options field at\n\t\t// the beginning.\n\t\tvar b byte\n\t\tinQuote := false\n\t\tvar candidateOptions []string\n\t\toptionStart := 0\n\t\tfor i, b = range in {\n\t\t\tisEnd := !inQuote && (b == ' ' || b == '\\t')\n\t\t\tif (b == ',' && !inQuote) || isEnd {\n\t\t\t\tif i-optionStart > 0 {\n\t\t\t\t\tcandidateOptions = append(candidateOptions, string(in[optionStart:i]))\n\t\t\t\t}\n\t\t\t\toptionStart = i + 1\n\t\t\t}\n\t\t\tif isEnd {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif b == '\"' && (i == 0 || (i > 0 && in[i-1] != '\\\\')) {\n\t\t\t\tinQuote = !inQuote\n\t\t\t}\n\t\t}\n\t\tfor i < len(in) && (in[i] == ' ' || in[i] == '\\t') {\n\t\t\ti++\n\t\t}\n\t\tif i == len(in) {\n\t\t\t// Invalid line: unmatched quote\n\t\t\tin = rest\n\t\t\tcontinue\n\t\t}\n\n\t\tin = in[i:]\n\t\ti = bytes.IndexAny(in, \" \\t\")\n\t\tif i == -1 {\n\t\t\tin = rest\n\t\t\tcontinue\n\t\t}\n\n\t\tif out, comment, err = parseAuthorizedKey(in[i:]); err == nil {\n\t\t\toptions = candidateOptions\n\t\t\treturn out, comment, options, rest, nil\n\t\t}\n\n\t\tin = rest\n\t\tcontinue\n\t}\n\n\treturn nil, \"\", nil, nil, errors.New(\"ssh: no key found\")\n}\n\n// ParsePublicKey parses an SSH public key formatted for use in\n// the SSH wire protocol according to RFC 4253, section 6.6.\nfunc ParsePublicKey(in []byte) (out PublicKey, err error) {\n\talgo, in, ok := parseString(in)\n\tif !ok {\n\t\treturn nil, errShortRead\n\t}\n\tvar rest []byte\n\tout, rest, err = parsePubKey(in, string(algo))\n\tif len(rest) > 0 {\n\t\treturn nil, errors.New(\"ssh: trailing junk in public key\")\n\t}\n\n\treturn out, err\n}\n\n// MarshalAuthorizedKey serializes key for inclusion in an OpenSSH\n// authorized_keys file. The return value ends with newline.\nfunc MarshalAuthorizedKey(key PublicKey) []byte {\n\tb := &bytes.Buffer{}\n\tb.WriteString(key.Type())\n\tb.WriteByte(' ')\n\te := base64.NewEncoder(base64.StdEncoding, b)\n\te.Write(key.Marshal())\n\te.Close()\n\tb.WriteByte('\\n')\n\treturn b.Bytes()\n}\n\n// PublicKey is an abstraction of different types of public keys.\ntype PublicKey interface {\n\t// Type returns the key's type, e.g. \"ssh-rsa\".\n\tType() string\n\n\t// Marshal returns the serialized key data in SSH wire format,\n\t// with the name prefix.\n\tMarshal() []byte\n\n\t// Verify that sig is a signature on the given data using this\n\t// key. This function will hash the data appropriately first.\n\tVerify(data []byte, sig *Signature) error\n}\n\n// CryptoPublicKey, if implemented by a PublicKey,\n// returns the underlying crypto.PublicKey form of the key.\ntype CryptoPublicKey interface {\n\tCryptoPublicKey() crypto.PublicKey\n}\n\n// A Signer can create signatures that verify against a public key.\ntype Signer interface {\n\t// PublicKey returns an associated PublicKey instance.\n\tPublicKey() PublicKey\n\n\t// Sign returns raw signature for the given data. This method\n\t// will apply the hash specified for the keytype to the data.\n\tSign(rand io.Reader, data []byte) (*Signature, error)\n}\n\ntype rsaPublicKey rsa.PublicKey\n\nfunc (r *rsaPublicKey) Type() string {\n\treturn \"ssh-rsa\"\n}\n\n// parseRSA parses an RSA key according to RFC 4253, section 6.6.\nfunc parseRSA(in []byte) (out PublicKey, rest []byte, err error) {\n\tvar w struct {\n\t\tE    *big.Int\n\t\tN    *big.Int\n\t\tRest []byte `ssh:\"rest\"`\n\t}\n\tif err := Unmarshal(in, &w); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tif w.E.BitLen() > 24 {\n\t\treturn nil, nil, errors.New(\"ssh: exponent too large\")\n\t}\n\te := w.E.Int64()\n\tif e < 3 || e&1 == 0 {\n\t\treturn nil, nil, errors.New(\"ssh: incorrect exponent\")\n\t}\n\n\tvar key rsa.PublicKey\n\tkey.E = int(e)\n\tkey.N = w.N\n\treturn (*rsaPublicKey)(&key), w.Rest, nil\n}\n\nfunc (r *rsaPublicKey) Marshal() []byte {\n\te := new(big.Int).SetInt64(int64(r.E))\n\t// RSA publickey struct layout should match the struct used by\n\t// parseRSACert in the x/crypto/ssh/agent package.\n\twirekey := struct {\n\t\tName string\n\t\tE    *big.Int\n\t\tN    *big.Int\n\t}{\n\t\tKeyAlgoRSA,\n\t\te,\n\t\tr.N,\n\t}\n\treturn Marshal(&wirekey)\n}\n\nfunc (r *rsaPublicKey) Verify(data []byte, sig *Signature) error {\n\tif sig.Format != r.Type() {\n\t\treturn fmt.Errorf(\"ssh: signature type %s for key type %s\", sig.Format, r.Type())\n\t}\n\th := crypto.SHA1.New()\n\th.Write(data)\n\tdigest := h.Sum(nil)\n\treturn rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob)\n}\n\nfunc (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey {\n\treturn (*rsa.PublicKey)(r)\n}\n\ntype dsaPublicKey dsa.PublicKey\n\nfunc (r *dsaPublicKey) Type() string {\n\treturn \"ssh-dss\"\n}\n\nfunc checkDSAParams(param *dsa.Parameters) error {\n\t// SSH specifies FIPS 186-2, which only provided a single size\n\t// (1024 bits) DSA key. FIPS 186-3 allows for larger key\n\t// sizes, which would confuse SSH.\n\tif l := param.P.BitLen(); l != 1024 {\n\t\treturn fmt.Errorf(\"ssh: unsupported DSA key size %d\", l)\n\t}\n\n\treturn nil\n}\n\n// parseDSA parses an DSA key according to RFC 4253, section 6.6.\nfunc parseDSA(in []byte) (out PublicKey, rest []byte, err error) {\n\tvar w struct {\n\t\tP, Q, G, Y *big.Int\n\t\tRest       []byte `ssh:\"rest\"`\n\t}\n\tif err := Unmarshal(in, &w); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tparam := dsa.Parameters{\n\t\tP: w.P,\n\t\tQ: w.Q,\n\t\tG: w.G,\n\t}\n\tif err := checkDSAParams(&param); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tkey := &dsaPublicKey{\n\t\tParameters: param,\n\t\tY:          w.Y,\n\t}\n\treturn key, w.Rest, nil\n}\n\nfunc (k *dsaPublicKey) Marshal() []byte {\n\t// DSA publickey struct layout should match the struct used by\n\t// parseDSACert in the x/crypto/ssh/agent package.\n\tw := struct {\n\t\tName       string\n\t\tP, Q, G, Y *big.Int\n\t}{\n\t\tk.Type(),\n\t\tk.P,\n\t\tk.Q,\n\t\tk.G,\n\t\tk.Y,\n\t}\n\n\treturn Marshal(&w)\n}\n\nfunc (k *dsaPublicKey) Verify(data []byte, sig *Signature) error {\n\tif sig.Format != k.Type() {\n\t\treturn fmt.Errorf(\"ssh: signature type %s for key type %s\", sig.Format, k.Type())\n\t}\n\th := crypto.SHA1.New()\n\th.Write(data)\n\tdigest := h.Sum(nil)\n\n\t// Per RFC 4253, section 6.6,\n\t// The value for 'dss_signature_blob' is encoded as a string containing\n\t// r, followed by s (which are 160-bit integers, without lengths or\n\t// padding, unsigned, and in network byte order).\n\t// For DSS purposes, sig.Blob should be exactly 40 bytes in length.\n\tif len(sig.Blob) != 40 {\n\t\treturn errors.New(\"ssh: DSA signature parse error\")\n\t}\n\tr := new(big.Int).SetBytes(sig.Blob[:20])\n\ts := new(big.Int).SetBytes(sig.Blob[20:])\n\tif dsa.Verify((*dsa.PublicKey)(k), digest, r, s) {\n\t\treturn nil\n\t}\n\treturn errors.New(\"ssh: signature did not verify\")\n}\n\nfunc (k *dsaPublicKey) CryptoPublicKey() crypto.PublicKey {\n\treturn (*dsa.PublicKey)(k)\n}\n\ntype dsaPrivateKey struct {\n\t*dsa.PrivateKey\n}\n\nfunc (k *dsaPrivateKey) PublicKey() PublicKey {\n\treturn (*dsaPublicKey)(&k.PrivateKey.PublicKey)\n}\n\nfunc (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) {\n\th := crypto.SHA1.New()\n\th.Write(data)\n\tdigest := h.Sum(nil)\n\tr, s, err := dsa.Sign(rand, k.PrivateKey, digest)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsig := make([]byte, 40)\n\trb := r.Bytes()\n\tsb := s.Bytes()\n\n\tcopy(sig[20-len(rb):20], rb)\n\tcopy(sig[40-len(sb):], sb)\n\n\treturn &Signature{\n\t\tFormat: k.PublicKey().Type(),\n\t\tBlob:   sig,\n\t}, nil\n}\n\ntype ecdsaPublicKey ecdsa.PublicKey\n\nfunc (key *ecdsaPublicKey) Type() string {\n\treturn \"ecdsa-sha2-\" + key.nistID()\n}\n\nfunc (key *ecdsaPublicKey) nistID() string {\n\tswitch key.Params().BitSize {\n\tcase 256:\n\t\treturn \"nistp256\"\n\tcase 384:\n\t\treturn \"nistp384\"\n\tcase 521:\n\t\treturn \"nistp521\"\n\t}\n\tpanic(\"ssh: unsupported ecdsa key size\")\n}\n\ntype ed25519PublicKey ed25519.PublicKey\n\nfunc (key ed25519PublicKey) Type() string {\n\treturn KeyAlgoED25519\n}\n\nfunc parseED25519(in []byte) (out PublicKey, rest []byte, err error) {\n\tvar w struct {\n\t\tKeyBytes []byte\n\t\tRest     []byte `ssh:\"rest\"`\n\t}\n\n\tif err := Unmarshal(in, &w); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tkey := ed25519.PublicKey(w.KeyBytes)\n\n\treturn (ed25519PublicKey)(key), w.Rest, nil\n}\n\nfunc (key ed25519PublicKey) Marshal() []byte {\n\tw := struct {\n\t\tName     string\n\t\tKeyBytes []byte\n\t}{\n\t\tKeyAlgoED25519,\n\t\t[]byte(key),\n\t}\n\treturn Marshal(&w)\n}\n\nfunc (key ed25519PublicKey) Verify(b []byte, sig *Signature) error {\n\tif sig.Format != key.Type() {\n\t\treturn fmt.Errorf(\"ssh: signature type %s for key type %s\", sig.Format, key.Type())\n\t}\n\n\tedKey := (ed25519.PublicKey)(key)\n\tif ok := ed25519.Verify(edKey, b, sig.Blob); !ok {\n\t\treturn errors.New(\"ssh: signature did not verify\")\n\t}\n\n\treturn nil\n}\n\nfunc (k ed25519PublicKey) CryptoPublicKey() crypto.PublicKey {\n\treturn ed25519.PublicKey(k)\n}\n\nfunc supportedEllipticCurve(curve elliptic.Curve) bool {\n\treturn curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521()\n}\n\n// ecHash returns the hash to match the given elliptic curve, see RFC\n// 5656, section 6.2.1\nfunc ecHash(curve elliptic.Curve) crypto.Hash {\n\tbitSize := curve.Params().BitSize\n\tswitch {\n\tcase bitSize <= 256:\n\t\treturn crypto.SHA256\n\tcase bitSize <= 384:\n\t\treturn crypto.SHA384\n\t}\n\treturn crypto.SHA512\n}\n\n// parseECDSA parses an ECDSA key according to RFC 5656, section 3.1.\nfunc parseECDSA(in []byte) (out PublicKey, rest []byte, err error) {\n\tvar w struct {\n\t\tCurve    string\n\t\tKeyBytes []byte\n\t\tRest     []byte `ssh:\"rest\"`\n\t}\n\n\tif err := Unmarshal(in, &w); err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tkey := new(ecdsa.PublicKey)\n\n\tswitch w.Curve {\n\tcase \"nistp256\":\n\t\tkey.Curve = elliptic.P256()\n\tcase \"nistp384\":\n\t\tkey.Curve = elliptic.P384()\n\tcase \"nistp521\":\n\t\tkey.Curve = elliptic.P521()\n\tdefault:\n\t\treturn nil, nil, errors.New(\"ssh: unsupported curve\")\n\t}\n\n\tkey.X, key.Y = elliptic.Unmarshal(key.Curve, w.KeyBytes)\n\tif key.X == nil || key.Y == nil {\n\t\treturn nil, nil, errors.New(\"ssh: invalid curve point\")\n\t}\n\treturn (*ecdsaPublicKey)(key), w.Rest, nil\n}\n\nfunc (key *ecdsaPublicKey) Marshal() []byte {\n\t// See RFC 5656, section 3.1.\n\tkeyBytes := elliptic.Marshal(key.Curve, key.X, key.Y)\n\t// ECDSA publickey struct layout should match the struct used by\n\t// parseECDSACert in the x/crypto/ssh/agent package.\n\tw := struct {\n\t\tName string\n\t\tID   string\n\t\tKey  []byte\n\t}{\n\t\tkey.Type(),\n\t\tkey.nistID(),\n\t\tkeyBytes,\n\t}\n\n\treturn Marshal(&w)\n}\n\nfunc (key *ecdsaPublicKey) Verify(data []byte, sig *Signature) error {\n\tif sig.Format != key.Type() {\n\t\treturn fmt.Errorf(\"ssh: signature type %s for key type %s\", sig.Format, key.Type())\n\t}\n\n\th := ecHash(key.Curve).New()\n\th.Write(data)\n\tdigest := h.Sum(nil)\n\n\t// Per RFC 5656, section 3.1.2,\n\t// The ecdsa_signature_blob value has the following specific encoding:\n\t//    mpint    r\n\t//    mpint    s\n\tvar ecSig struct {\n\t\tR *big.Int\n\t\tS *big.Int\n\t}\n\n\tif err := Unmarshal(sig.Blob, &ecSig); err != nil {\n\t\treturn err\n\t}\n\n\tif ecdsa.Verify((*ecdsa.PublicKey)(key), digest, ecSig.R, ecSig.S) {\n\t\treturn nil\n\t}\n\treturn errors.New(\"ssh: signature did not verify\")\n}\n\nfunc (k *ecdsaPublicKey) CryptoPublicKey() crypto.PublicKey {\n\treturn (*ecdsa.PublicKey)(k)\n}\n\n// NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey,\n// *ecdsa.PrivateKey or any other crypto.Signer and returns a\n// corresponding Signer instance. ECDSA keys must use P-256, P-384 or\n// P-521. DSA keys must use parameter size L1024N160.\nfunc NewSignerFromKey(key interface{}) (Signer, error) {\n\tswitch key := key.(type) {\n\tcase crypto.Signer:\n\t\treturn NewSignerFromSigner(key)\n\tcase *dsa.PrivateKey:\n\t\treturn newDSAPrivateKey(key)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unsupported key type %T\", key)\n\t}\n}\n\nfunc newDSAPrivateKey(key *dsa.PrivateKey) (Signer, error) {\n\tif err := checkDSAParams(&key.PublicKey.Parameters); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &dsaPrivateKey{key}, nil\n}\n\ntype wrappedSigner struct {\n\tsigner crypto.Signer\n\tpubKey PublicKey\n}\n\n// NewSignerFromSigner takes any crypto.Signer implementation and\n// returns a corresponding Signer interface. This can be used, for\n// example, with keys kept in hardware modules.\nfunc NewSignerFromSigner(signer crypto.Signer) (Signer, error) {\n\tpubKey, err := NewPublicKey(signer.Public())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &wrappedSigner{signer, pubKey}, nil\n}\n\nfunc (s *wrappedSigner) PublicKey() PublicKey {\n\treturn s.pubKey\n}\n\nfunc (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) {\n\tvar hashFunc crypto.Hash\n\n\tswitch key := s.pubKey.(type) {\n\tcase *rsaPublicKey, *dsaPublicKey:\n\t\thashFunc = crypto.SHA1\n\tcase *ecdsaPublicKey:\n\t\thashFunc = ecHash(key.Curve)\n\tcase ed25519PublicKey:\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unsupported key type %T\", key)\n\t}\n\n\tvar digest []byte\n\tif hashFunc != 0 {\n\t\th := hashFunc.New()\n\t\th.Write(data)\n\t\tdigest = h.Sum(nil)\n\t} else {\n\t\tdigest = data\n\t}\n\n\tsignature, err := s.signer.Sign(rand, digest, hashFunc)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// crypto.Signer.Sign is expected to return an ASN.1-encoded signature\n\t// for ECDSA and DSA, but that's not the encoding expected by SSH, so\n\t// re-encode.\n\tswitch s.pubKey.(type) {\n\tcase *ecdsaPublicKey, *dsaPublicKey:\n\t\ttype asn1Signature struct {\n\t\t\tR, S *big.Int\n\t\t}\n\t\tasn1Sig := new(asn1Signature)\n\t\t_, err := asn1.Unmarshal(signature, asn1Sig)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tswitch s.pubKey.(type) {\n\t\tcase *ecdsaPublicKey:\n\t\t\tsignature = Marshal(asn1Sig)\n\n\t\tcase *dsaPublicKey:\n\t\t\tsignature = make([]byte, 40)\n\t\t\tr := asn1Sig.R.Bytes()\n\t\t\ts := asn1Sig.S.Bytes()\n\t\t\tcopy(signature[20-len(r):20], r)\n\t\t\tcopy(signature[40-len(s):40], s)\n\t\t}\n\t}\n\n\treturn &Signature{\n\t\tFormat: s.pubKey.Type(),\n\t\tBlob:   signature,\n\t}, nil\n}\n\n// NewPublicKey takes an *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey,\n// or ed25519.PublicKey returns a corresponding PublicKey instance.\n// ECDSA keys must use P-256, P-384 or P-521.\nfunc NewPublicKey(key interface{}) (PublicKey, error) {\n\tswitch key := key.(type) {\n\tcase *rsa.PublicKey:\n\t\treturn (*rsaPublicKey)(key), nil\n\tcase *ecdsa.PublicKey:\n\t\tif !supportedEllipticCurve(key.Curve) {\n\t\t\treturn nil, errors.New(\"ssh: only P-256, P-384 and P-521 EC keys are supported.\")\n\t\t}\n\t\treturn (*ecdsaPublicKey)(key), nil\n\tcase *dsa.PublicKey:\n\t\treturn (*dsaPublicKey)(key), nil\n\tcase ed25519.PublicKey:\n\t\treturn (ed25519PublicKey)(key), nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unsupported key type %T\", key)\n\t}\n}\n\n// ParsePrivateKey returns a Signer from a PEM encoded private key. It supports\n// the same keys as ParseRawPrivateKey.\nfunc ParsePrivateKey(pemBytes []byte) (Signer, error) {\n\tkey, err := ParseRawPrivateKey(pemBytes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn NewSignerFromKey(key)\n}\n\n// ParsePrivateKeyWithPassphrase returns a Signer from a PEM encoded private\n// key and passphrase. It supports the same keys as\n// ParseRawPrivateKeyWithPassphrase.\nfunc ParsePrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (Signer, error) {\n\tkey, err := ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn NewSignerFromKey(key)\n}\n\n// encryptedBlock tells whether a private key is\n// encrypted by examining its Proc-Type header\n// for a mention of ENCRYPTED\n// according to RFC 1421 Section 4.6.1.1.\nfunc encryptedBlock(block *pem.Block) bool {\n\treturn strings.Contains(block.Headers[\"Proc-Type\"], \"ENCRYPTED\")\n}\n\n// ParseRawPrivateKey returns a private key from a PEM encoded private key. It\n// supports RSA (PKCS#1), DSA (OpenSSL), and ECDSA private keys.\nfunc ParseRawPrivateKey(pemBytes []byte) (interface{}, error) {\n\tblock, _ := pem.Decode(pemBytes)\n\tif block == nil {\n\t\treturn nil, errors.New(\"ssh: no key found\")\n\t}\n\n\tif encryptedBlock(block) {\n\t\treturn nil, errors.New(\"ssh: cannot decode encrypted private keys\")\n\t}\n\n\tswitch block.Type {\n\tcase \"RSA PRIVATE KEY\":\n\t\treturn x509.ParsePKCS1PrivateKey(block.Bytes)\n\tcase \"EC PRIVATE KEY\":\n\t\treturn x509.ParseECPrivateKey(block.Bytes)\n\tcase \"DSA PRIVATE KEY\":\n\t\treturn ParseDSAPrivateKey(block.Bytes)\n\tcase \"OPENSSH PRIVATE KEY\":\n\t\treturn parseOpenSSHPrivateKey(block.Bytes)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unsupported key type %q\", block.Type)\n\t}\n}\n\n// ParseRawPrivateKeyWithPassphrase returns a private key decrypted with\n// passphrase from a PEM encoded private key. If wrong passphrase, return\n// x509.IncorrectPasswordError.\nfunc ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (interface{}, error) {\n\tblock, _ := pem.Decode(pemBytes)\n\tif block == nil {\n\t\treturn nil, errors.New(\"ssh: no key found\")\n\t}\n\tbuf := block.Bytes\n\n\tif encryptedBlock(block) {\n\t\tif x509.IsEncryptedPEMBlock(block) {\n\t\t\tvar err error\n\t\t\tbuf, err = x509.DecryptPEMBlock(block, passPhrase)\n\t\t\tif err != nil {\n\t\t\t\tif err == x509.IncorrectPasswordError {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t\treturn nil, fmt.Errorf(\"ssh: cannot decode encrypted private keys: %v\", err)\n\t\t\t}\n\t\t}\n\t}\n\n\tswitch block.Type {\n\tcase \"RSA PRIVATE KEY\":\n\t\treturn x509.ParsePKCS1PrivateKey(buf)\n\tcase \"EC PRIVATE KEY\":\n\t\treturn x509.ParseECPrivateKey(buf)\n\tcase \"DSA PRIVATE KEY\":\n\t\treturn ParseDSAPrivateKey(buf)\n\tcase \"OPENSSH PRIVATE KEY\":\n\t\treturn parseOpenSSHPrivateKey(buf)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unsupported key type %q\", block.Type)\n\t}\n}\n\n// ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as\n// specified by the OpenSSL DSA man page.\nfunc ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) {\n\tvar k struct {\n\t\tVersion int\n\t\tP       *big.Int\n\t\tQ       *big.Int\n\t\tG       *big.Int\n\t\tPub     *big.Int\n\t\tPriv    *big.Int\n\t}\n\trest, err := asn1.Unmarshal(der, &k)\n\tif err != nil {\n\t\treturn nil, errors.New(\"ssh: failed to parse DSA key: \" + err.Error())\n\t}\n\tif len(rest) > 0 {\n\t\treturn nil, errors.New(\"ssh: garbage after DSA key\")\n\t}\n\n\treturn &dsa.PrivateKey{\n\t\tPublicKey: dsa.PublicKey{\n\t\t\tParameters: dsa.Parameters{\n\t\t\t\tP: k.P,\n\t\t\t\tQ: k.Q,\n\t\t\t\tG: k.G,\n\t\t\t},\n\t\t\tY: k.Pub,\n\t\t},\n\t\tX: k.Priv,\n\t}, nil\n}\n\n// Implemented based on the documentation at\n// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key\nfunc parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) {\n\tmagic := append([]byte(\"openssh-key-v1\"), 0)\n\tif !bytes.Equal(magic, key[0:len(magic)]) {\n\t\treturn nil, errors.New(\"ssh: invalid openssh private key format\")\n\t}\n\tremaining := key[len(magic):]\n\n\tvar w struct {\n\t\tCipherName   string\n\t\tKdfName      string\n\t\tKdfOpts      string\n\t\tNumKeys      uint32\n\t\tPubKey       []byte\n\t\tPrivKeyBlock []byte\n\t}\n\n\tif err := Unmarshal(remaining, &w); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif w.KdfName != \"none\" || w.CipherName != \"none\" {\n\t\treturn nil, errors.New(\"ssh: cannot decode encrypted private keys\")\n\t}\n\n\tpk1 := struct {\n\t\tCheck1  uint32\n\t\tCheck2  uint32\n\t\tKeytype string\n\t\tRest    []byte `ssh:\"rest\"`\n\t}{}\n\n\tif err := Unmarshal(w.PrivKeyBlock, &pk1); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif pk1.Check1 != pk1.Check2 {\n\t\treturn nil, errors.New(\"ssh: checkint mismatch\")\n\t}\n\n\t// we only handle ed25519 and rsa keys currently\n\tswitch pk1.Keytype {\n\tcase KeyAlgoRSA:\n\t\t// https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773\n\t\tkey := struct {\n\t\t\tN       *big.Int\n\t\t\tE       *big.Int\n\t\t\tD       *big.Int\n\t\t\tIqmp    *big.Int\n\t\t\tP       *big.Int\n\t\t\tQ       *big.Int\n\t\t\tComment string\n\t\t\tPad     []byte `ssh:\"rest\"`\n\t\t}{}\n\n\t\tif err := Unmarshal(pk1.Rest, &key); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tfor i, b := range key.Pad {\n\t\t\tif int(b) != i+1 {\n\t\t\t\treturn nil, errors.New(\"ssh: padding not as expected\")\n\t\t\t}\n\t\t}\n\n\t\tpk := &rsa.PrivateKey{\n\t\t\tPublicKey: rsa.PublicKey{\n\t\t\t\tN: key.N,\n\t\t\t\tE: int(key.E.Int64()),\n\t\t\t},\n\t\t\tD:      key.D,\n\t\t\tPrimes: []*big.Int{key.P, key.Q},\n\t\t}\n\n\t\tif err := pk.Validate(); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tpk.Precompute()\n\n\t\treturn pk, nil\n\tcase KeyAlgoED25519:\n\t\tkey := struct {\n\t\t\tPub     []byte\n\t\t\tPriv    []byte\n\t\t\tComment string\n\t\t\tPad     []byte `ssh:\"rest\"`\n\t\t}{}\n\n\t\tif err := Unmarshal(pk1.Rest, &key); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif len(key.Priv) != ed25519.PrivateKeySize {\n\t\t\treturn nil, errors.New(\"ssh: private key unexpected length\")\n\t\t}\n\n\t\tfor i, b := range key.Pad {\n\t\t\tif int(b) != i+1 {\n\t\t\t\treturn nil, errors.New(\"ssh: padding not as expected\")\n\t\t\t}\n\t\t}\n\n\t\tpk := ed25519.PrivateKey(make([]byte, ed25519.PrivateKeySize))\n\t\tcopy(pk, key.Priv)\n\t\treturn &pk, nil\n\tdefault:\n\t\treturn nil, errors.New(\"ssh: unhandled key type\")\n\t}\n}\n\n// FingerprintLegacyMD5 returns the user presentation of the key's\n// fingerprint as described by RFC 4716 section 4.\nfunc FingerprintLegacyMD5(pubKey PublicKey) string {\n\tmd5sum := md5.Sum(pubKey.Marshal())\n\thexarray := make([]string, len(md5sum))\n\tfor i, c := range md5sum {\n\t\thexarray[i] = hex.EncodeToString([]byte{c})\n\t}\n\treturn strings.Join(hexarray, \":\")\n}\n\n// FingerprintSHA256 returns the user presentation of the key's\n// fingerprint as unpadded base64 encoded sha256 hash.\n// This format was introduced from OpenSSH 6.8.\n// https://www.openssh.com/txt/release-6.8\n// https://tools.ietf.org/html/rfc4648#section-3.2 (unpadded base64 encoding)\nfunc FingerprintSHA256(pubKey PublicKey) string {\n\tsha256sum := sha256.Sum256(pubKey.Marshal())\n\thash := base64.RawStdEncoding.EncodeToString(sha256sum[:])\n\treturn \"SHA256:\" + hash\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/mac.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\n// Message authentication support\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"hash\"\n)\n\ntype macMode struct {\n\tkeySize int\n\tetm     bool\n\tnew     func(key []byte) hash.Hash\n}\n\n// truncatingMAC wraps around a hash.Hash and truncates the output digest to\n// a given size.\ntype truncatingMAC struct {\n\tlength int\n\thmac   hash.Hash\n}\n\nfunc (t truncatingMAC) Write(data []byte) (int, error) {\n\treturn t.hmac.Write(data)\n}\n\nfunc (t truncatingMAC) Sum(in []byte) []byte {\n\tout := t.hmac.Sum(in)\n\treturn out[:len(in)+t.length]\n}\n\nfunc (t truncatingMAC) Reset() {\n\tt.hmac.Reset()\n}\n\nfunc (t truncatingMAC) Size() int {\n\treturn t.length\n}\n\nfunc (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() }\n\nvar macModes = map[string]*macMode{\n\t\"hmac-sha2-256-etm@openssh.com\": {32, true, func(key []byte) hash.Hash {\n\t\treturn hmac.New(sha256.New, key)\n\t}},\n\t\"hmac-sha2-256\": {32, false, func(key []byte) hash.Hash {\n\t\treturn hmac.New(sha256.New, key)\n\t}},\n\t\"hmac-sha1\": {20, false, func(key []byte) hash.Hash {\n\t\treturn hmac.New(sha1.New, key)\n\t}},\n\t\"hmac-sha1-96\": {20, false, func(key []byte) hash.Hash {\n\t\treturn truncatingMAC{12, hmac.New(sha1.New, key)}\n\t}},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/messages.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// These are SSH message type numbers. They are scattered around several\n// documents but many were taken from [SSH-PARAMETERS].\nconst (\n\tmsgIgnore        = 2\n\tmsgUnimplemented = 3\n\tmsgDebug         = 4\n\tmsgNewKeys       = 21\n\n\t// Standard authentication messages\n\tmsgUserAuthSuccess = 52\n\tmsgUserAuthBanner  = 53\n)\n\n// SSH messages:\n//\n// These structures mirror the wire format of the corresponding SSH messages.\n// They are marshaled using reflection with the marshal and unmarshal functions\n// in this file. The only wrinkle is that a final member of type []byte with a\n// ssh tag of \"rest\" receives the remainder of a packet when unmarshaling.\n\n// See RFC 4253, section 11.1.\nconst msgDisconnect = 1\n\n// disconnectMsg is the message that signals a disconnect. It is also\n// the error type returned from mux.Wait()\ntype disconnectMsg struct {\n\tReason   uint32 `sshtype:\"1\"`\n\tMessage  string\n\tLanguage string\n}\n\nfunc (d *disconnectMsg) Error() string {\n\treturn fmt.Sprintf(\"ssh: disconnect, reason %d: %s\", d.Reason, d.Message)\n}\n\n// See RFC 4253, section 7.1.\nconst msgKexInit = 20\n\ntype kexInitMsg struct {\n\tCookie                  [16]byte `sshtype:\"20\"`\n\tKexAlgos                []string\n\tServerHostKeyAlgos      []string\n\tCiphersClientServer     []string\n\tCiphersServerClient     []string\n\tMACsClientServer        []string\n\tMACsServerClient        []string\n\tCompressionClientServer []string\n\tCompressionServerClient []string\n\tLanguagesClientServer   []string\n\tLanguagesServerClient   []string\n\tFirstKexFollows         bool\n\tReserved                uint32\n}\n\n// See RFC 4253, section 8.\n\n// Diffie-Helman\nconst msgKexDHInit = 30\n\ntype kexDHInitMsg struct {\n\tX *big.Int `sshtype:\"30\"`\n}\n\nconst msgKexECDHInit = 30\n\ntype kexECDHInitMsg struct {\n\tClientPubKey []byte `sshtype:\"30\"`\n}\n\nconst msgKexECDHReply = 31\n\ntype kexECDHReplyMsg struct {\n\tHostKey         []byte `sshtype:\"31\"`\n\tEphemeralPubKey []byte\n\tSignature       []byte\n}\n\nconst msgKexDHReply = 31\n\ntype kexDHReplyMsg struct {\n\tHostKey   []byte `sshtype:\"31\"`\n\tY         *big.Int\n\tSignature []byte\n}\n\n// See RFC 4253, section 10.\nconst msgServiceRequest = 5\n\ntype serviceRequestMsg struct {\n\tService string `sshtype:\"5\"`\n}\n\n// See RFC 4253, section 10.\nconst msgServiceAccept = 6\n\ntype serviceAcceptMsg struct {\n\tService string `sshtype:\"6\"`\n}\n\n// See RFC 4252, section 5.\nconst msgUserAuthRequest = 50\n\ntype userAuthRequestMsg struct {\n\tUser    string `sshtype:\"50\"`\n\tService string\n\tMethod  string\n\tPayload []byte `ssh:\"rest\"`\n}\n\n// Used for debug printouts of packets.\ntype userAuthSuccessMsg struct {\n}\n\n// See RFC 4252, section 5.1\nconst msgUserAuthFailure = 51\n\ntype userAuthFailureMsg struct {\n\tMethods        []string `sshtype:\"51\"`\n\tPartialSuccess bool\n}\n\n// See RFC 4256, section 3.2\nconst msgUserAuthInfoRequest = 60\nconst msgUserAuthInfoResponse = 61\n\ntype userAuthInfoRequestMsg struct {\n\tUser               string `sshtype:\"60\"`\n\tInstruction        string\n\tDeprecatedLanguage string\n\tNumPrompts         uint32\n\tPrompts            []byte `ssh:\"rest\"`\n}\n\n// See RFC 4254, section 5.1.\nconst msgChannelOpen = 90\n\ntype channelOpenMsg struct {\n\tChanType         string `sshtype:\"90\"`\n\tPeersId          uint32\n\tPeersWindow      uint32\n\tMaxPacketSize    uint32\n\tTypeSpecificData []byte `ssh:\"rest\"`\n}\n\nconst msgChannelExtendedData = 95\nconst msgChannelData = 94\n\n// Used for debug print outs of packets.\ntype channelDataMsg struct {\n\tPeersId uint32 `sshtype:\"94\"`\n\tLength  uint32\n\tRest    []byte `ssh:\"rest\"`\n}\n\n// See RFC 4254, section 5.1.\nconst msgChannelOpenConfirm = 91\n\ntype channelOpenConfirmMsg struct {\n\tPeersId          uint32 `sshtype:\"91\"`\n\tMyId             uint32\n\tMyWindow         uint32\n\tMaxPacketSize    uint32\n\tTypeSpecificData []byte `ssh:\"rest\"`\n}\n\n// See RFC 4254, section 5.1.\nconst msgChannelOpenFailure = 92\n\ntype channelOpenFailureMsg struct {\n\tPeersId  uint32 `sshtype:\"92\"`\n\tReason   RejectionReason\n\tMessage  string\n\tLanguage string\n}\n\nconst msgChannelRequest = 98\n\ntype channelRequestMsg struct {\n\tPeersId             uint32 `sshtype:\"98\"`\n\tRequest             string\n\tWantReply           bool\n\tRequestSpecificData []byte `ssh:\"rest\"`\n}\n\n// See RFC 4254, section 5.4.\nconst msgChannelSuccess = 99\n\ntype channelRequestSuccessMsg struct {\n\tPeersId uint32 `sshtype:\"99\"`\n}\n\n// See RFC 4254, section 5.4.\nconst msgChannelFailure = 100\n\ntype channelRequestFailureMsg struct {\n\tPeersId uint32 `sshtype:\"100\"`\n}\n\n// See RFC 4254, section 5.3\nconst msgChannelClose = 97\n\ntype channelCloseMsg struct {\n\tPeersId uint32 `sshtype:\"97\"`\n}\n\n// See RFC 4254, section 5.3\nconst msgChannelEOF = 96\n\ntype channelEOFMsg struct {\n\tPeersId uint32 `sshtype:\"96\"`\n}\n\n// See RFC 4254, section 4\nconst msgGlobalRequest = 80\n\ntype globalRequestMsg struct {\n\tType      string `sshtype:\"80\"`\n\tWantReply bool\n\tData      []byte `ssh:\"rest\"`\n}\n\n// See RFC 4254, section 4\nconst msgRequestSuccess = 81\n\ntype globalRequestSuccessMsg struct {\n\tData []byte `ssh:\"rest\" sshtype:\"81\"`\n}\n\n// See RFC 4254, section 4\nconst msgRequestFailure = 82\n\ntype globalRequestFailureMsg struct {\n\tData []byte `ssh:\"rest\" sshtype:\"82\"`\n}\n\n// See RFC 4254, section 5.2\nconst msgChannelWindowAdjust = 93\n\ntype windowAdjustMsg struct {\n\tPeersId         uint32 `sshtype:\"93\"`\n\tAdditionalBytes uint32\n}\n\n// See RFC 4252, section 7\nconst msgUserAuthPubKeyOk = 60\n\ntype userAuthPubKeyOkMsg struct {\n\tAlgo   string `sshtype:\"60\"`\n\tPubKey []byte\n}\n\n// typeTags returns the possible type bytes for the given reflect.Type, which\n// should be a struct. The possible values are separated by a '|' character.\nfunc typeTags(structType reflect.Type) (tags []byte) {\n\ttagStr := structType.Field(0).Tag.Get(\"sshtype\")\n\n\tfor _, tag := range strings.Split(tagStr, \"|\") {\n\t\ti, err := strconv.Atoi(tag)\n\t\tif err == nil {\n\t\t\ttags = append(tags, byte(i))\n\t\t}\n\t}\n\n\treturn tags\n}\n\nfunc fieldError(t reflect.Type, field int, problem string) error {\n\tif problem != \"\" {\n\t\tproblem = \": \" + problem\n\t}\n\treturn fmt.Errorf(\"ssh: unmarshal error for field %s of type %s%s\", t.Field(field).Name, t.Name(), problem)\n}\n\nvar errShortRead = errors.New(\"ssh: short read\")\n\n// Unmarshal parses data in SSH wire format into a structure. The out\n// argument should be a pointer to struct. If the first member of the\n// struct has the \"sshtype\" tag set to a '|'-separated set of numbers\n// in decimal, the packet must start with one of those numbers. In\n// case of error, Unmarshal returns a ParseError or\n// UnexpectedMessageError.\nfunc Unmarshal(data []byte, out interface{}) error {\n\tv := reflect.ValueOf(out).Elem()\n\tstructType := v.Type()\n\texpectedTypes := typeTags(structType)\n\n\tvar expectedType byte\n\tif len(expectedTypes) > 0 {\n\t\texpectedType = expectedTypes[0]\n\t}\n\n\tif len(data) == 0 {\n\t\treturn parseError(expectedType)\n\t}\n\n\tif len(expectedTypes) > 0 {\n\t\tgoodType := false\n\t\tfor _, e := range expectedTypes {\n\t\t\tif e > 0 && data[0] == e {\n\t\t\t\tgoodType = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !goodType {\n\t\t\treturn fmt.Errorf(\"ssh: unexpected message type %d (expected one of %v)\", data[0], expectedTypes)\n\t\t}\n\t\tdata = data[1:]\n\t}\n\n\tvar ok bool\n\tfor i := 0; i < v.NumField(); i++ {\n\t\tfield := v.Field(i)\n\t\tt := field.Type()\n\t\tswitch t.Kind() {\n\t\tcase reflect.Bool:\n\t\t\tif len(data) < 1 {\n\t\t\t\treturn errShortRead\n\t\t\t}\n\t\t\tfield.SetBool(data[0] != 0)\n\t\t\tdata = data[1:]\n\t\tcase reflect.Array:\n\t\t\tif t.Elem().Kind() != reflect.Uint8 {\n\t\t\t\treturn fieldError(structType, i, \"array of unsupported type\")\n\t\t\t}\n\t\t\tif len(data) < t.Len() {\n\t\t\t\treturn errShortRead\n\t\t\t}\n\t\t\tfor j, n := 0, t.Len(); j < n; j++ {\n\t\t\t\tfield.Index(j).Set(reflect.ValueOf(data[j]))\n\t\t\t}\n\t\t\tdata = data[t.Len():]\n\t\tcase reflect.Uint64:\n\t\t\tvar u64 uint64\n\t\t\tif u64, data, ok = parseUint64(data); !ok {\n\t\t\t\treturn errShortRead\n\t\t\t}\n\t\t\tfield.SetUint(u64)\n\t\tcase reflect.Uint32:\n\t\t\tvar u32 uint32\n\t\t\tif u32, data, ok = parseUint32(data); !ok {\n\t\t\t\treturn errShortRead\n\t\t\t}\n\t\t\tfield.SetUint(uint64(u32))\n\t\tcase reflect.Uint8:\n\t\t\tif len(data) < 1 {\n\t\t\t\treturn errShortRead\n\t\t\t}\n\t\t\tfield.SetUint(uint64(data[0]))\n\t\t\tdata = data[1:]\n\t\tcase reflect.String:\n\t\t\tvar s []byte\n\t\t\tif s, data, ok = parseString(data); !ok {\n\t\t\t\treturn fieldError(structType, i, \"\")\n\t\t\t}\n\t\t\tfield.SetString(string(s))\n\t\tcase reflect.Slice:\n\t\t\tswitch t.Elem().Kind() {\n\t\t\tcase reflect.Uint8:\n\t\t\t\tif structType.Field(i).Tag.Get(\"ssh\") == \"rest\" {\n\t\t\t\t\tfield.Set(reflect.ValueOf(data))\n\t\t\t\t\tdata = nil\n\t\t\t\t} else {\n\t\t\t\t\tvar s []byte\n\t\t\t\t\tif s, data, ok = parseString(data); !ok {\n\t\t\t\t\t\treturn errShortRead\n\t\t\t\t\t}\n\t\t\t\t\tfield.Set(reflect.ValueOf(s))\n\t\t\t\t}\n\t\t\tcase reflect.String:\n\t\t\t\tvar nl []string\n\t\t\t\tif nl, data, ok = parseNameList(data); !ok {\n\t\t\t\t\treturn errShortRead\n\t\t\t\t}\n\t\t\t\tfield.Set(reflect.ValueOf(nl))\n\t\t\tdefault:\n\t\t\t\treturn fieldError(structType, i, \"slice of unsupported type\")\n\t\t\t}\n\t\tcase reflect.Ptr:\n\t\t\tif t == bigIntType {\n\t\t\t\tvar n *big.Int\n\t\t\t\tif n, data, ok = parseInt(data); !ok {\n\t\t\t\t\treturn errShortRead\n\t\t\t\t}\n\t\t\t\tfield.Set(reflect.ValueOf(n))\n\t\t\t} else {\n\t\t\t\treturn fieldError(structType, i, \"pointer to unsupported type\")\n\t\t\t}\n\t\tdefault:\n\t\t\treturn fieldError(structType, i, fmt.Sprintf(\"unsupported type: %v\", t))\n\t\t}\n\t}\n\n\tif len(data) != 0 {\n\t\treturn parseError(expectedType)\n\t}\n\n\treturn nil\n}\n\n// Marshal serializes the message in msg to SSH wire format.  The msg\n// argument should be a struct or pointer to struct. If the first\n// member has the \"sshtype\" tag set to a number in decimal, that\n// number is prepended to the result. If the last of member has the\n// \"ssh\" tag set to \"rest\", its contents are appended to the output.\nfunc Marshal(msg interface{}) []byte {\n\tout := make([]byte, 0, 64)\n\treturn marshalStruct(out, msg)\n}\n\nfunc marshalStruct(out []byte, msg interface{}) []byte {\n\tv := reflect.Indirect(reflect.ValueOf(msg))\n\tmsgTypes := typeTags(v.Type())\n\tif len(msgTypes) > 0 {\n\t\tout = append(out, msgTypes[0])\n\t}\n\n\tfor i, n := 0, v.NumField(); i < n; i++ {\n\t\tfield := v.Field(i)\n\t\tswitch t := field.Type(); t.Kind() {\n\t\tcase reflect.Bool:\n\t\t\tvar v uint8\n\t\t\tif field.Bool() {\n\t\t\t\tv = 1\n\t\t\t}\n\t\t\tout = append(out, v)\n\t\tcase reflect.Array:\n\t\t\tif t.Elem().Kind() != reflect.Uint8 {\n\t\t\t\tpanic(fmt.Sprintf(\"array of non-uint8 in field %d: %T\", i, field.Interface()))\n\t\t\t}\n\t\t\tfor j, l := 0, t.Len(); j < l; j++ {\n\t\t\t\tout = append(out, uint8(field.Index(j).Uint()))\n\t\t\t}\n\t\tcase reflect.Uint32:\n\t\t\tout = appendU32(out, uint32(field.Uint()))\n\t\tcase reflect.Uint64:\n\t\t\tout = appendU64(out, uint64(field.Uint()))\n\t\tcase reflect.Uint8:\n\t\t\tout = append(out, uint8(field.Uint()))\n\t\tcase reflect.String:\n\t\t\ts := field.String()\n\t\t\tout = appendInt(out, len(s))\n\t\t\tout = append(out, s...)\n\t\tcase reflect.Slice:\n\t\t\tswitch t.Elem().Kind() {\n\t\t\tcase reflect.Uint8:\n\t\t\t\tif v.Type().Field(i).Tag.Get(\"ssh\") != \"rest\" {\n\t\t\t\t\tout = appendInt(out, field.Len())\n\t\t\t\t}\n\t\t\t\tout = append(out, field.Bytes()...)\n\t\t\tcase reflect.String:\n\t\t\t\toffset := len(out)\n\t\t\t\tout = appendU32(out, 0)\n\t\t\t\tif n := field.Len(); n > 0 {\n\t\t\t\t\tfor j := 0; j < n; j++ {\n\t\t\t\t\t\tf := field.Index(j)\n\t\t\t\t\t\tif j != 0 {\n\t\t\t\t\t\t\tout = append(out, ',')\n\t\t\t\t\t\t}\n\t\t\t\t\t\tout = append(out, f.String()...)\n\t\t\t\t\t}\n\t\t\t\t\t// overwrite length value\n\t\t\t\t\tbinary.BigEndian.PutUint32(out[offset:], uint32(len(out)-offset-4))\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpanic(fmt.Sprintf(\"slice of unknown type in field %d: %T\", i, field.Interface()))\n\t\t\t}\n\t\tcase reflect.Ptr:\n\t\t\tif t == bigIntType {\n\t\t\t\tvar n *big.Int\n\t\t\t\tnValue := reflect.ValueOf(&n)\n\t\t\t\tnValue.Elem().Set(field)\n\t\t\t\tneeded := intLength(n)\n\t\t\t\toldLength := len(out)\n\n\t\t\t\tif cap(out)-len(out) < needed {\n\t\t\t\t\tnewOut := make([]byte, len(out), 2*(len(out)+needed))\n\t\t\t\t\tcopy(newOut, out)\n\t\t\t\t\tout = newOut\n\t\t\t\t}\n\t\t\t\tout = out[:oldLength+needed]\n\t\t\t\tmarshalInt(out[oldLength:], n)\n\t\t\t} else {\n\t\t\t\tpanic(fmt.Sprintf(\"pointer to unknown type in field %d: %T\", i, field.Interface()))\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out\n}\n\nvar bigOne = big.NewInt(1)\n\nfunc parseString(in []byte) (out, rest []byte, ok bool) {\n\tif len(in) < 4 {\n\t\treturn\n\t}\n\tlength := binary.BigEndian.Uint32(in)\n\tin = in[4:]\n\tif uint32(len(in)) < length {\n\t\treturn\n\t}\n\tout = in[:length]\n\trest = in[length:]\n\tok = true\n\treturn\n}\n\nvar (\n\tcomma         = []byte{','}\n\temptyNameList = []string{}\n)\n\nfunc parseNameList(in []byte) (out []string, rest []byte, ok bool) {\n\tcontents, rest, ok := parseString(in)\n\tif !ok {\n\t\treturn\n\t}\n\tif len(contents) == 0 {\n\t\tout = emptyNameList\n\t\treturn\n\t}\n\tparts := bytes.Split(contents, comma)\n\tout = make([]string, len(parts))\n\tfor i, part := range parts {\n\t\tout[i] = string(part)\n\t}\n\treturn\n}\n\nfunc parseInt(in []byte) (out *big.Int, rest []byte, ok bool) {\n\tcontents, rest, ok := parseString(in)\n\tif !ok {\n\t\treturn\n\t}\n\tout = new(big.Int)\n\n\tif len(contents) > 0 && contents[0]&0x80 == 0x80 {\n\t\t// This is a negative number\n\t\tnotBytes := make([]byte, len(contents))\n\t\tfor i := range notBytes {\n\t\t\tnotBytes[i] = ^contents[i]\n\t\t}\n\t\tout.SetBytes(notBytes)\n\t\tout.Add(out, bigOne)\n\t\tout.Neg(out)\n\t} else {\n\t\t// Positive number\n\t\tout.SetBytes(contents)\n\t}\n\tok = true\n\treturn\n}\n\nfunc parseUint32(in []byte) (uint32, []byte, bool) {\n\tif len(in) < 4 {\n\t\treturn 0, nil, false\n\t}\n\treturn binary.BigEndian.Uint32(in), in[4:], true\n}\n\nfunc parseUint64(in []byte) (uint64, []byte, bool) {\n\tif len(in) < 8 {\n\t\treturn 0, nil, false\n\t}\n\treturn binary.BigEndian.Uint64(in), in[8:], true\n}\n\nfunc intLength(n *big.Int) int {\n\tlength := 4 /* length bytes */\n\tif n.Sign() < 0 {\n\t\tnMinus1 := new(big.Int).Neg(n)\n\t\tnMinus1.Sub(nMinus1, bigOne)\n\t\tbitLen := nMinus1.BitLen()\n\t\tif bitLen%8 == 0 {\n\t\t\t// The number will need 0xff padding\n\t\t\tlength++\n\t\t}\n\t\tlength += (bitLen + 7) / 8\n\t} else if n.Sign() == 0 {\n\t\t// A zero is the zero length string\n\t} else {\n\t\tbitLen := n.BitLen()\n\t\tif bitLen%8 == 0 {\n\t\t\t// The number will need 0x00 padding\n\t\t\tlength++\n\t\t}\n\t\tlength += (bitLen + 7) / 8\n\t}\n\n\treturn length\n}\n\nfunc marshalUint32(to []byte, n uint32) []byte {\n\tbinary.BigEndian.PutUint32(to, n)\n\treturn to[4:]\n}\n\nfunc marshalUint64(to []byte, n uint64) []byte {\n\tbinary.BigEndian.PutUint64(to, n)\n\treturn to[8:]\n}\n\nfunc marshalInt(to []byte, n *big.Int) []byte {\n\tlengthBytes := to\n\tto = to[4:]\n\tlength := 0\n\n\tif n.Sign() < 0 {\n\t\t// A negative number has to be converted to two's-complement\n\t\t// form. So we'll subtract 1 and invert. If the\n\t\t// most-significant-bit isn't set then we'll need to pad the\n\t\t// beginning with 0xff in order to keep the number negative.\n\t\tnMinus1 := new(big.Int).Neg(n)\n\t\tnMinus1.Sub(nMinus1, bigOne)\n\t\tbytes := nMinus1.Bytes()\n\t\tfor i := range bytes {\n\t\t\tbytes[i] ^= 0xff\n\t\t}\n\t\tif len(bytes) == 0 || bytes[0]&0x80 == 0 {\n\t\t\tto[0] = 0xff\n\t\t\tto = to[1:]\n\t\t\tlength++\n\t\t}\n\t\tnBytes := copy(to, bytes)\n\t\tto = to[nBytes:]\n\t\tlength += nBytes\n\t} else if n.Sign() == 0 {\n\t\t// A zero is the zero length string\n\t} else {\n\t\tbytes := n.Bytes()\n\t\tif len(bytes) > 0 && bytes[0]&0x80 != 0 {\n\t\t\t// We'll have to pad this with a 0x00 in order to\n\t\t\t// stop it looking like a negative number.\n\t\t\tto[0] = 0\n\t\t\tto = to[1:]\n\t\t\tlength++\n\t\t}\n\t\tnBytes := copy(to, bytes)\n\t\tto = to[nBytes:]\n\t\tlength += nBytes\n\t}\n\n\tlengthBytes[0] = byte(length >> 24)\n\tlengthBytes[1] = byte(length >> 16)\n\tlengthBytes[2] = byte(length >> 8)\n\tlengthBytes[3] = byte(length)\n\treturn to\n}\n\nfunc writeInt(w io.Writer, n *big.Int) {\n\tlength := intLength(n)\n\tbuf := make([]byte, length)\n\tmarshalInt(buf, n)\n\tw.Write(buf)\n}\n\nfunc writeString(w io.Writer, s []byte) {\n\tvar lengthBytes [4]byte\n\tlengthBytes[0] = byte(len(s) >> 24)\n\tlengthBytes[1] = byte(len(s) >> 16)\n\tlengthBytes[2] = byte(len(s) >> 8)\n\tlengthBytes[3] = byte(len(s))\n\tw.Write(lengthBytes[:])\n\tw.Write(s)\n}\n\nfunc stringLength(n int) int {\n\treturn 4 + n\n}\n\nfunc marshalString(to []byte, s []byte) []byte {\n\tto[0] = byte(len(s) >> 24)\n\tto[1] = byte(len(s) >> 16)\n\tto[2] = byte(len(s) >> 8)\n\tto[3] = byte(len(s))\n\tto = to[4:]\n\tcopy(to, s)\n\treturn to[len(s):]\n}\n\nvar bigIntType = reflect.TypeOf((*big.Int)(nil))\n\n// Decode a packet into its corresponding message.\nfunc decode(packet []byte) (interface{}, error) {\n\tvar msg interface{}\n\tswitch packet[0] {\n\tcase msgDisconnect:\n\t\tmsg = new(disconnectMsg)\n\tcase msgServiceRequest:\n\t\tmsg = new(serviceRequestMsg)\n\tcase msgServiceAccept:\n\t\tmsg = new(serviceAcceptMsg)\n\tcase msgKexInit:\n\t\tmsg = new(kexInitMsg)\n\tcase msgKexDHInit:\n\t\tmsg = new(kexDHInitMsg)\n\tcase msgKexDHReply:\n\t\tmsg = new(kexDHReplyMsg)\n\tcase msgUserAuthRequest:\n\t\tmsg = new(userAuthRequestMsg)\n\tcase msgUserAuthSuccess:\n\t\treturn new(userAuthSuccessMsg), nil\n\tcase msgUserAuthFailure:\n\t\tmsg = new(userAuthFailureMsg)\n\tcase msgUserAuthPubKeyOk:\n\t\tmsg = new(userAuthPubKeyOkMsg)\n\tcase msgGlobalRequest:\n\t\tmsg = new(globalRequestMsg)\n\tcase msgRequestSuccess:\n\t\tmsg = new(globalRequestSuccessMsg)\n\tcase msgRequestFailure:\n\t\tmsg = new(globalRequestFailureMsg)\n\tcase msgChannelOpen:\n\t\tmsg = new(channelOpenMsg)\n\tcase msgChannelData:\n\t\tmsg = new(channelDataMsg)\n\tcase msgChannelOpenConfirm:\n\t\tmsg = new(channelOpenConfirmMsg)\n\tcase msgChannelOpenFailure:\n\t\tmsg = new(channelOpenFailureMsg)\n\tcase msgChannelWindowAdjust:\n\t\tmsg = new(windowAdjustMsg)\n\tcase msgChannelEOF:\n\t\tmsg = new(channelEOFMsg)\n\tcase msgChannelClose:\n\t\tmsg = new(channelCloseMsg)\n\tcase msgChannelRequest:\n\t\tmsg = new(channelRequestMsg)\n\tcase msgChannelSuccess:\n\t\tmsg = new(channelRequestSuccessMsg)\n\tcase msgChannelFailure:\n\t\tmsg = new(channelRequestFailureMsg)\n\tdefault:\n\t\treturn nil, unexpectedMessageError(0, packet[0])\n\t}\n\tif err := Unmarshal(packet, msg); err != nil {\n\t\treturn nil, err\n\t}\n\treturn msg, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/mux.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"sync\"\n\t\"sync/atomic\"\n)\n\n// debugMux, if set, causes messages in the connection protocol to be\n// logged.\nconst debugMux = false\n\n// chanList is a thread safe channel list.\ntype chanList struct {\n\t// protects concurrent access to chans\n\tsync.Mutex\n\n\t// chans are indexed by the local id of the channel, which the\n\t// other side should send in the PeersId field.\n\tchans []*channel\n\n\t// This is a debugging aid: it offsets all IDs by this\n\t// amount. This helps distinguish otherwise identical\n\t// server/client muxes\n\toffset uint32\n}\n\n// Assigns a channel ID to the given channel.\nfunc (c *chanList) add(ch *channel) uint32 {\n\tc.Lock()\n\tdefer c.Unlock()\n\tfor i := range c.chans {\n\t\tif c.chans[i] == nil {\n\t\t\tc.chans[i] = ch\n\t\t\treturn uint32(i) + c.offset\n\t\t}\n\t}\n\tc.chans = append(c.chans, ch)\n\treturn uint32(len(c.chans)-1) + c.offset\n}\n\n// getChan returns the channel for the given ID.\nfunc (c *chanList) getChan(id uint32) *channel {\n\tid -= c.offset\n\n\tc.Lock()\n\tdefer c.Unlock()\n\tif id < uint32(len(c.chans)) {\n\t\treturn c.chans[id]\n\t}\n\treturn nil\n}\n\nfunc (c *chanList) remove(id uint32) {\n\tid -= c.offset\n\tc.Lock()\n\tif id < uint32(len(c.chans)) {\n\t\tc.chans[id] = nil\n\t}\n\tc.Unlock()\n}\n\n// dropAll forgets all channels it knows, returning them in a slice.\nfunc (c *chanList) dropAll() []*channel {\n\tc.Lock()\n\tdefer c.Unlock()\n\tvar r []*channel\n\n\tfor _, ch := range c.chans {\n\t\tif ch == nil {\n\t\t\tcontinue\n\t\t}\n\t\tr = append(r, ch)\n\t}\n\tc.chans = nil\n\treturn r\n}\n\n// mux represents the state for the SSH connection protocol, which\n// multiplexes many channels onto a single packet transport.\ntype mux struct {\n\tconn     packetConn\n\tchanList chanList\n\n\tincomingChannels chan NewChannel\n\n\tglobalSentMu     sync.Mutex\n\tglobalResponses  chan interface{}\n\tincomingRequests chan *Request\n\n\terrCond *sync.Cond\n\terr     error\n}\n\n// When debugging, each new chanList instantiation has a different\n// offset.\nvar globalOff uint32\n\nfunc (m *mux) Wait() error {\n\tm.errCond.L.Lock()\n\tdefer m.errCond.L.Unlock()\n\tfor m.err == nil {\n\t\tm.errCond.Wait()\n\t}\n\treturn m.err\n}\n\n// newMux returns a mux that runs over the given connection.\nfunc newMux(p packetConn) *mux {\n\tm := &mux{\n\t\tconn:             p,\n\t\tincomingChannels: make(chan NewChannel, chanSize),\n\t\tglobalResponses:  make(chan interface{}, 1),\n\t\tincomingRequests: make(chan *Request, chanSize),\n\t\terrCond:          newCond(),\n\t}\n\tif debugMux {\n\t\tm.chanList.offset = atomic.AddUint32(&globalOff, 1)\n\t}\n\n\tgo m.loop()\n\treturn m\n}\n\nfunc (m *mux) sendMessage(msg interface{}) error {\n\tp := Marshal(msg)\n\tif debugMux {\n\t\tlog.Printf(\"send global(%d): %#v\", m.chanList.offset, msg)\n\t}\n\treturn m.conn.writePacket(p)\n}\n\nfunc (m *mux) SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) {\n\tif wantReply {\n\t\tm.globalSentMu.Lock()\n\t\tdefer m.globalSentMu.Unlock()\n\t}\n\n\tif err := m.sendMessage(globalRequestMsg{\n\t\tType:      name,\n\t\tWantReply: wantReply,\n\t\tData:      payload,\n\t}); err != nil {\n\t\treturn false, nil, err\n\t}\n\n\tif !wantReply {\n\t\treturn false, nil, nil\n\t}\n\n\tmsg, ok := <-m.globalResponses\n\tif !ok {\n\t\treturn false, nil, io.EOF\n\t}\n\tswitch msg := msg.(type) {\n\tcase *globalRequestFailureMsg:\n\t\treturn false, msg.Data, nil\n\tcase *globalRequestSuccessMsg:\n\t\treturn true, msg.Data, nil\n\tdefault:\n\t\treturn false, nil, fmt.Errorf(\"ssh: unexpected response to request: %#v\", msg)\n\t}\n}\n\n// ackRequest must be called after processing a global request that\n// has WantReply set.\nfunc (m *mux) ackRequest(ok bool, data []byte) error {\n\tif ok {\n\t\treturn m.sendMessage(globalRequestSuccessMsg{Data: data})\n\t}\n\treturn m.sendMessage(globalRequestFailureMsg{Data: data})\n}\n\nfunc (m *mux) Close() error {\n\treturn m.conn.Close()\n}\n\n// loop runs the connection machine. It will process packets until an\n// error is encountered. To synchronize on loop exit, use mux.Wait.\nfunc (m *mux) loop() {\n\tvar err error\n\tfor err == nil {\n\t\terr = m.onePacket()\n\t}\n\n\tfor _, ch := range m.chanList.dropAll() {\n\t\tch.close()\n\t}\n\n\tclose(m.incomingChannels)\n\tclose(m.incomingRequests)\n\tclose(m.globalResponses)\n\n\tm.conn.Close()\n\n\tm.errCond.L.Lock()\n\tm.err = err\n\tm.errCond.Broadcast()\n\tm.errCond.L.Unlock()\n\n\tif debugMux {\n\t\tlog.Println(\"loop exit\", err)\n\t}\n}\n\n// onePacket reads and processes one packet.\nfunc (m *mux) onePacket() error {\n\tpacket, err := m.conn.readPacket()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif debugMux {\n\t\tif packet[0] == msgChannelData || packet[0] == msgChannelExtendedData {\n\t\t\tlog.Printf(\"decoding(%d): data packet - %d bytes\", m.chanList.offset, len(packet))\n\t\t} else {\n\t\t\tp, _ := decode(packet)\n\t\t\tlog.Printf(\"decoding(%d): %d %#v - %d bytes\", m.chanList.offset, packet[0], p, len(packet))\n\t\t}\n\t}\n\n\tswitch packet[0] {\n\tcase msgChannelOpen:\n\t\treturn m.handleChannelOpen(packet)\n\tcase msgGlobalRequest, msgRequestSuccess, msgRequestFailure:\n\t\treturn m.handleGlobalPacket(packet)\n\t}\n\n\t// assume a channel packet.\n\tif len(packet) < 5 {\n\t\treturn parseError(packet[0])\n\t}\n\tid := binary.BigEndian.Uint32(packet[1:])\n\tch := m.chanList.getChan(id)\n\tif ch == nil {\n\t\treturn fmt.Errorf(\"ssh: invalid channel %d\", id)\n\t}\n\n\treturn ch.handlePacket(packet)\n}\n\nfunc (m *mux) handleGlobalPacket(packet []byte) error {\n\tmsg, err := decode(packet)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch msg := msg.(type) {\n\tcase *globalRequestMsg:\n\t\tm.incomingRequests <- &Request{\n\t\t\tType:      msg.Type,\n\t\t\tWantReply: msg.WantReply,\n\t\t\tPayload:   msg.Data,\n\t\t\tmux:       m,\n\t\t}\n\tcase *globalRequestSuccessMsg, *globalRequestFailureMsg:\n\t\tm.globalResponses <- msg\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"not a global message %#v\", msg))\n\t}\n\n\treturn nil\n}\n\n// handleChannelOpen schedules a channel to be Accept()ed.\nfunc (m *mux) handleChannelOpen(packet []byte) error {\n\tvar msg channelOpenMsg\n\tif err := Unmarshal(packet, &msg); err != nil {\n\t\treturn err\n\t}\n\n\tif msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 {\n\t\tfailMsg := channelOpenFailureMsg{\n\t\t\tPeersId:  msg.PeersId,\n\t\t\tReason:   ConnectionFailed,\n\t\t\tMessage:  \"invalid request\",\n\t\t\tLanguage: \"en_US.UTF-8\",\n\t\t}\n\t\treturn m.sendMessage(failMsg)\n\t}\n\n\tc := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData)\n\tc.remoteId = msg.PeersId\n\tc.maxRemotePayload = msg.MaxPacketSize\n\tc.remoteWin.add(msg.PeersWindow)\n\tm.incomingChannels <- c\n\treturn nil\n}\n\nfunc (m *mux) OpenChannel(chanType string, extra []byte) (Channel, <-chan *Request, error) {\n\tch, err := m.openChannel(chanType, extra)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\treturn ch, ch.incomingRequests, nil\n}\n\nfunc (m *mux) openChannel(chanType string, extra []byte) (*channel, error) {\n\tch := m.newChannel(chanType, channelOutbound, extra)\n\n\tch.maxIncomingPayload = channelMaxPacket\n\n\topen := channelOpenMsg{\n\t\tChanType:         chanType,\n\t\tPeersWindow:      ch.myWindow,\n\t\tMaxPacketSize:    ch.maxIncomingPayload,\n\t\tTypeSpecificData: extra,\n\t\tPeersId:          ch.localId,\n\t}\n\tif err := m.sendMessage(open); err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch msg := (<-ch.msg).(type) {\n\tcase *channelOpenConfirmMsg:\n\t\treturn ch, nil\n\tcase *channelOpenFailureMsg:\n\t\treturn nil, &OpenChannelError{msg.Reason, msg.Message}\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unexpected packet in response to channel open: %T\", msg)\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/server.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"strings\"\n)\n\n// The Permissions type holds fine-grained permissions that are\n// specific to a user or a specific authentication method for a user.\n// The Permissions value for a successful authentication attempt is\n// available in ServerConn, so it can be used to pass information from\n// the user-authentication phase to the application layer.\ntype Permissions struct {\n\t// CriticalOptions indicate restrictions to the default\n\t// permissions, and are typically used in conjunction with\n\t// user certificates. The standard for SSH certificates\n\t// defines \"force-command\" (only allow the given command to\n\t// execute) and \"source-address\" (only allow connections from\n\t// the given address). The SSH package currently only enforces\n\t// the \"source-address\" critical option. It is up to server\n\t// implementations to enforce other critical options, such as\n\t// \"force-command\", by checking them after the SSH handshake\n\t// is successful. In general, SSH servers should reject\n\t// connections that specify critical options that are unknown\n\t// or not supported.\n\tCriticalOptions map[string]string\n\n\t// Extensions are extra functionality that the server may\n\t// offer on authenticated connections. Lack of support for an\n\t// extension does not preclude authenticating a user. Common\n\t// extensions are \"permit-agent-forwarding\",\n\t// \"permit-X11-forwarding\". The Go SSH library currently does\n\t// not act on any extension, and it is up to server\n\t// implementations to honor them. Extensions can be used to\n\t// pass data from the authentication callbacks to the server\n\t// application layer.\n\tExtensions map[string]string\n}\n\n// ServerConfig holds server specific configuration data.\ntype ServerConfig struct {\n\t// Config contains configuration shared between client and server.\n\tConfig\n\n\thostKeys []Signer\n\n\t// NoClientAuth is true if clients are allowed to connect without\n\t// authenticating.\n\tNoClientAuth bool\n\n\t// MaxAuthTries specifies the maximum number of authentication attempts\n\t// permitted per connection. If set to a negative number, the number of\n\t// attempts are unlimited. If set to zero, the number of attempts are limited\n\t// to 6.\n\tMaxAuthTries int\n\n\t// PasswordCallback, if non-nil, is called when a user\n\t// attempts to authenticate using a password.\n\tPasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error)\n\n\t// PublicKeyCallback, if non-nil, is called when a client\n\t// offers a public key for authentication. It must return a nil error\n\t// if the given public key can be used to authenticate the\n\t// given user. For example, see CertChecker.Authenticate. A\n\t// call to this function does not guarantee that the key\n\t// offered is in fact used to authenticate. To record any data\n\t// depending on the public key, store it inside a\n\t// Permissions.Extensions entry.\n\tPublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error)\n\n\t// KeyboardInteractiveCallback, if non-nil, is called when\n\t// keyboard-interactive authentication is selected (RFC\n\t// 4256). The client object's Challenge function should be\n\t// used to query the user. The callback may offer multiple\n\t// Challenge rounds. To avoid information leaks, the client\n\t// should be presented a challenge even if the user is\n\t// unknown.\n\tKeyboardInteractiveCallback func(conn ConnMetadata, client KeyboardInteractiveChallenge) (*Permissions, error)\n\n\t// AuthLogCallback, if non-nil, is called to log all authentication\n\t// attempts.\n\tAuthLogCallback func(conn ConnMetadata, method string, err error)\n\n\t// ServerVersion is the version identification string to announce in\n\t// the public handshake.\n\t// If empty, a reasonable default is used.\n\t// Note that RFC 4253 section 4.2 requires that this string start with\n\t// \"SSH-2.0-\".\n\tServerVersion string\n}\n\n// AddHostKey adds a private key as a host key. If an existing host\n// key exists with the same algorithm, it is overwritten. Each server\n// config must have at least one host key.\nfunc (s *ServerConfig) AddHostKey(key Signer) {\n\tfor i, k := range s.hostKeys {\n\t\tif k.PublicKey().Type() == key.PublicKey().Type() {\n\t\t\ts.hostKeys[i] = key\n\t\t\treturn\n\t\t}\n\t}\n\n\ts.hostKeys = append(s.hostKeys, key)\n}\n\n// cachedPubKey contains the results of querying whether a public key is\n// acceptable for a user.\ntype cachedPubKey struct {\n\tuser       string\n\tpubKeyData []byte\n\tresult     error\n\tperms      *Permissions\n}\n\nconst maxCachedPubKeys = 16\n\n// pubKeyCache caches tests for public keys.  Since SSH clients\n// will query whether a public key is acceptable before attempting to\n// authenticate with it, we end up with duplicate queries for public\n// key validity.  The cache only applies to a single ServerConn.\ntype pubKeyCache struct {\n\tkeys []cachedPubKey\n}\n\n// get returns the result for a given user/algo/key tuple.\nfunc (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) {\n\tfor _, k := range c.keys {\n\t\tif k.user == user && bytes.Equal(k.pubKeyData, pubKeyData) {\n\t\t\treturn k, true\n\t\t}\n\t}\n\treturn cachedPubKey{}, false\n}\n\n// add adds the given tuple to the cache.\nfunc (c *pubKeyCache) add(candidate cachedPubKey) {\n\tif len(c.keys) < maxCachedPubKeys {\n\t\tc.keys = append(c.keys, candidate)\n\t}\n}\n\n// ServerConn is an authenticated SSH connection, as seen from the\n// server\ntype ServerConn struct {\n\tConn\n\n\t// If the succeeding authentication callback returned a\n\t// non-nil Permissions pointer, it is stored here.\n\tPermissions *Permissions\n}\n\n// NewServerConn starts a new SSH server with c as the underlying\n// transport.  It starts with a handshake and, if the handshake is\n// unsuccessful, it closes the connection and returns an error.  The\n// Request and NewChannel channels must be serviced, or the connection\n// will hang.\nfunc NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) {\n\tfullConf := *config\n\tfullConf.SetDefaults()\n\tif fullConf.MaxAuthTries == 0 {\n\t\tfullConf.MaxAuthTries = 6\n\t}\n\n\ts := &connection{\n\t\tsshConn: sshConn{conn: c},\n\t}\n\tperms, err := s.serverHandshake(&fullConf)\n\tif err != nil {\n\t\tc.Close()\n\t\treturn nil, nil, nil, err\n\t}\n\treturn &ServerConn{s, perms}, s.mux.incomingChannels, s.mux.incomingRequests, nil\n}\n\n// signAndMarshal signs the data with the appropriate algorithm,\n// and serializes the result in SSH wire format.\nfunc signAndMarshal(k Signer, rand io.Reader, data []byte) ([]byte, error) {\n\tsig, err := k.Sign(rand, data)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn Marshal(sig), nil\n}\n\n// handshake performs key exchange and user authentication.\nfunc (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) {\n\tif len(config.hostKeys) == 0 {\n\t\treturn nil, errors.New(\"ssh: server has no host keys\")\n\t}\n\n\tif !config.NoClientAuth && config.PasswordCallback == nil && config.PublicKeyCallback == nil && config.KeyboardInteractiveCallback == nil {\n\t\treturn nil, errors.New(\"ssh: no authentication methods configured but NoClientAuth is also false\")\n\t}\n\n\tif config.ServerVersion != \"\" {\n\t\ts.serverVersion = []byte(config.ServerVersion)\n\t} else {\n\t\ts.serverVersion = []byte(packageVersion)\n\t}\n\tvar err error\n\ts.clientVersion, err = exchangeVersions(s.sshConn.conn, s.serverVersion)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ttr := newTransport(s.sshConn.conn, config.Rand, false /* not client */)\n\ts.transport = newServerTransport(tr, s.clientVersion, s.serverVersion, config)\n\n\tif err := s.transport.waitSession(); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// We just did the key change, so the session ID is established.\n\ts.sessionID = s.transport.getSessionID()\n\n\tvar packet []byte\n\tif packet, err = s.transport.readPacket(); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar serviceRequest serviceRequestMsg\n\tif err = Unmarshal(packet, &serviceRequest); err != nil {\n\t\treturn nil, err\n\t}\n\tif serviceRequest.Service != serviceUserAuth {\n\t\treturn nil, errors.New(\"ssh: requested service '\" + serviceRequest.Service + \"' before authenticating\")\n\t}\n\tserviceAccept := serviceAcceptMsg{\n\t\tService: serviceUserAuth,\n\t}\n\tif err := s.transport.writePacket(Marshal(&serviceAccept)); err != nil {\n\t\treturn nil, err\n\t}\n\n\tperms, err := s.serverAuthenticate(config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ts.mux = newMux(s.transport)\n\treturn perms, err\n}\n\nfunc isAcceptableAlgo(algo string) bool {\n\tswitch algo {\n\tcase KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519,\n\t\tCertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc checkSourceAddress(addr net.Addr, sourceAddrs string) error {\n\tif addr == nil {\n\t\treturn errors.New(\"ssh: no address known for client, but source-address match required\")\n\t}\n\n\ttcpAddr, ok := addr.(*net.TCPAddr)\n\tif !ok {\n\t\treturn fmt.Errorf(\"ssh: remote address %v is not an TCP address when checking source-address match\", addr)\n\t}\n\n\tfor _, sourceAddr := range strings.Split(sourceAddrs, \",\") {\n\t\tif allowedIP := net.ParseIP(sourceAddr); allowedIP != nil {\n\t\t\tif allowedIP.Equal(tcpAddr.IP) {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t} else {\n\t\t\t_, ipNet, err := net.ParseCIDR(sourceAddr)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"ssh: error parsing source-address restriction %q: %v\", sourceAddr, err)\n\t\t\t}\n\n\t\t\tif ipNet.Contains(tcpAddr.IP) {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fmt.Errorf(\"ssh: remote address %v is not allowed because of source-address restriction\", addr)\n}\n\n// ServerAuthError implements the error interface. It appends any authentication\n// errors that may occur, and is returned if all of the authentication methods\n// provided by the user failed to authenticate.\ntype ServerAuthError struct {\n\t// Errors contains authentication errors returned by the authentication\n\t// callback methods.\n\tErrors []error\n}\n\nfunc (l ServerAuthError) Error() string {\n\tvar errs []string\n\tfor _, err := range l.Errors {\n\t\terrs = append(errs, err.Error())\n\t}\n\treturn \"[\" + strings.Join(errs, \", \") + \"]\"\n}\n\nfunc (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) {\n\tsessionID := s.transport.getSessionID()\n\tvar cache pubKeyCache\n\tvar perms *Permissions\n\n\tauthFailures := 0\n\tvar authErrs []error\n\nuserAuthLoop:\n\tfor {\n\t\tif authFailures >= config.MaxAuthTries && config.MaxAuthTries > 0 {\n\t\t\tdiscMsg := &disconnectMsg{\n\t\t\t\tReason:  2,\n\t\t\t\tMessage: \"too many authentication failures\",\n\t\t\t}\n\n\t\t\tif err := s.transport.writePacket(Marshal(discMsg)); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\treturn nil, discMsg\n\t\t}\n\n\t\tvar userAuthReq userAuthRequestMsg\n\t\tif packet, err := s.transport.readPacket(); err != nil {\n\t\t\tif err == io.EOF {\n\t\t\t\treturn nil, &ServerAuthError{Errors: authErrs}\n\t\t\t}\n\t\t\treturn nil, err\n\t\t} else if err = Unmarshal(packet, &userAuthReq); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tif userAuthReq.Service != serviceSSH {\n\t\t\treturn nil, errors.New(\"ssh: client attempted to negotiate for unknown service: \" + userAuthReq.Service)\n\t\t}\n\n\t\ts.user = userAuthReq.User\n\t\tperms = nil\n\t\tauthErr := errors.New(\"no auth passed yet\")\n\n\t\tswitch userAuthReq.Method {\n\t\tcase \"none\":\n\t\t\tif config.NoClientAuth {\n\t\t\t\tauthErr = nil\n\t\t\t}\n\n\t\t\t// allow initial attempt of 'none' without penalty\n\t\t\tif authFailures == 0 {\n\t\t\t\tauthFailures--\n\t\t\t}\n\t\tcase \"password\":\n\t\t\tif config.PasswordCallback == nil {\n\t\t\t\tauthErr = errors.New(\"ssh: password auth not configured\")\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tpayload := userAuthReq.Payload\n\t\t\tif len(payload) < 1 || payload[0] != 0 {\n\t\t\t\treturn nil, parseError(msgUserAuthRequest)\n\t\t\t}\n\t\t\tpayload = payload[1:]\n\t\t\tpassword, payload, ok := parseString(payload)\n\t\t\tif !ok || len(payload) > 0 {\n\t\t\t\treturn nil, parseError(msgUserAuthRequest)\n\t\t\t}\n\n\t\t\tperms, authErr = config.PasswordCallback(s, password)\n\t\tcase \"keyboard-interactive\":\n\t\t\tif config.KeyboardInteractiveCallback == nil {\n\t\t\t\tauthErr = errors.New(\"ssh: keyboard-interactive auth not configubred\")\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tprompter := &sshClientKeyboardInteractive{s}\n\t\t\tperms, authErr = config.KeyboardInteractiveCallback(s, prompter.Challenge)\n\t\tcase \"publickey\":\n\t\t\tif config.PublicKeyCallback == nil {\n\t\t\t\tauthErr = errors.New(\"ssh: publickey auth not configured\")\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tpayload := userAuthReq.Payload\n\t\t\tif len(payload) < 1 {\n\t\t\t\treturn nil, parseError(msgUserAuthRequest)\n\t\t\t}\n\t\t\tisQuery := payload[0] == 0\n\t\t\tpayload = payload[1:]\n\t\t\talgoBytes, payload, ok := parseString(payload)\n\t\t\tif !ok {\n\t\t\t\treturn nil, parseError(msgUserAuthRequest)\n\t\t\t}\n\t\t\talgo := string(algoBytes)\n\t\t\tif !isAcceptableAlgo(algo) {\n\t\t\t\tauthErr = fmt.Errorf(\"ssh: algorithm %q not accepted\", algo)\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tpubKeyData, payload, ok := parseString(payload)\n\t\t\tif !ok {\n\t\t\t\treturn nil, parseError(msgUserAuthRequest)\n\t\t\t}\n\n\t\t\tpubKey, err := ParsePublicKey(pubKeyData)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tcandidate, ok := cache.get(s.user, pubKeyData)\n\t\t\tif !ok {\n\t\t\t\tcandidate.user = s.user\n\t\t\t\tcandidate.pubKeyData = pubKeyData\n\t\t\t\tcandidate.perms, candidate.result = config.PublicKeyCallback(s, pubKey)\n\t\t\t\tif candidate.result == nil && candidate.perms != nil && candidate.perms.CriticalOptions != nil && candidate.perms.CriticalOptions[sourceAddressCriticalOption] != \"\" {\n\t\t\t\t\tcandidate.result = checkSourceAddress(\n\t\t\t\t\t\ts.RemoteAddr(),\n\t\t\t\t\t\tcandidate.perms.CriticalOptions[sourceAddressCriticalOption])\n\t\t\t\t}\n\t\t\t\tcache.add(candidate)\n\t\t\t}\n\n\t\t\tif isQuery {\n\t\t\t\t// The client can query if the given public key\n\t\t\t\t// would be okay.\n\n\t\t\t\tif len(payload) > 0 {\n\t\t\t\t\treturn nil, parseError(msgUserAuthRequest)\n\t\t\t\t}\n\n\t\t\t\tif candidate.result == nil {\n\t\t\t\t\tokMsg := userAuthPubKeyOkMsg{\n\t\t\t\t\t\tAlgo:   algo,\n\t\t\t\t\t\tPubKey: pubKeyData,\n\t\t\t\t\t}\n\t\t\t\t\tif err = s.transport.writePacket(Marshal(&okMsg)); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\t\t\t\t\tcontinue userAuthLoop\n\t\t\t\t}\n\t\t\t\tauthErr = candidate.result\n\t\t\t} else {\n\t\t\t\tsig, payload, ok := parseSignature(payload)\n\t\t\t\tif !ok || len(payload) > 0 {\n\t\t\t\t\treturn nil, parseError(msgUserAuthRequest)\n\t\t\t\t}\n\t\t\t\t// Ensure the public key algo and signature algo\n\t\t\t\t// are supported.  Compare the private key\n\t\t\t\t// algorithm name that corresponds to algo with\n\t\t\t\t// sig.Format.  This is usually the same, but\n\t\t\t\t// for certs, the names differ.\n\t\t\t\tif !isAcceptableAlgo(sig.Format) {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tsignedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData)\n\n\t\t\t\tif err := pubKey.Verify(signedData, sig); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tauthErr = candidate.result\n\t\t\t\tperms = candidate.perms\n\t\t\t}\n\t\tdefault:\n\t\t\tauthErr = fmt.Errorf(\"ssh: unknown method %q\", userAuthReq.Method)\n\t\t}\n\n\t\tauthErrs = append(authErrs, authErr)\n\n\t\tif config.AuthLogCallback != nil {\n\t\t\tconfig.AuthLogCallback(s, userAuthReq.Method, authErr)\n\t\t}\n\n\t\tif authErr == nil {\n\t\t\tbreak userAuthLoop\n\t\t}\n\n\t\tauthFailures++\n\n\t\tvar failureMsg userAuthFailureMsg\n\t\tif config.PasswordCallback != nil {\n\t\t\tfailureMsg.Methods = append(failureMsg.Methods, \"password\")\n\t\t}\n\t\tif config.PublicKeyCallback != nil {\n\t\t\tfailureMsg.Methods = append(failureMsg.Methods, \"publickey\")\n\t\t}\n\t\tif config.KeyboardInteractiveCallback != nil {\n\t\t\tfailureMsg.Methods = append(failureMsg.Methods, \"keyboard-interactive\")\n\t\t}\n\n\t\tif len(failureMsg.Methods) == 0 {\n\t\t\treturn nil, errors.New(\"ssh: no authentication methods configured but NoClientAuth is also false\")\n\t\t}\n\n\t\tif err := s.transport.writePacket(Marshal(&failureMsg)); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tif err := s.transport.writePacket([]byte{msgUserAuthSuccess}); err != nil {\n\t\treturn nil, err\n\t}\n\treturn perms, nil\n}\n\n// sshClientKeyboardInteractive implements a ClientKeyboardInteractive by\n// asking the client on the other side of a ServerConn.\ntype sshClientKeyboardInteractive struct {\n\t*connection\n}\n\nfunc (c *sshClientKeyboardInteractive) Challenge(user, instruction string, questions []string, echos []bool) (answers []string, err error) {\n\tif len(questions) != len(echos) {\n\t\treturn nil, errors.New(\"ssh: echos and questions must have equal length\")\n\t}\n\n\tvar prompts []byte\n\tfor i := range questions {\n\t\tprompts = appendString(prompts, questions[i])\n\t\tprompts = appendBool(prompts, echos[i])\n\t}\n\n\tif err := c.transport.writePacket(Marshal(&userAuthInfoRequestMsg{\n\t\tInstruction: instruction,\n\t\tNumPrompts:  uint32(len(questions)),\n\t\tPrompts:     prompts,\n\t})); err != nil {\n\t\treturn nil, err\n\t}\n\n\tpacket, err := c.transport.readPacket()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif packet[0] != msgUserAuthInfoResponse {\n\t\treturn nil, unexpectedMessageError(msgUserAuthInfoResponse, packet[0])\n\t}\n\tpacket = packet[1:]\n\n\tn, packet, ok := parseUint32(packet)\n\tif !ok || int(n) != len(questions) {\n\t\treturn nil, parseError(msgUserAuthInfoResponse)\n\t}\n\n\tfor i := uint32(0); i < n; i++ {\n\t\tans, rest, ok := parseString(packet)\n\t\tif !ok {\n\t\t\treturn nil, parseError(msgUserAuthInfoResponse)\n\t\t}\n\n\t\tanswers = append(answers, string(ans))\n\t\tpacket = rest\n\t}\n\tif len(packet) != 0 {\n\t\treturn nil, errors.New(\"ssh: junk at end of message\")\n\t}\n\n\treturn answers, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/session.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\n// Session implements an interactive session described in\n// \"RFC 4254, section 6\".\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"sync\"\n)\n\ntype Signal string\n\n// POSIX signals as listed in RFC 4254 Section 6.10.\nconst (\n\tSIGABRT Signal = \"ABRT\"\n\tSIGALRM Signal = \"ALRM\"\n\tSIGFPE  Signal = \"FPE\"\n\tSIGHUP  Signal = \"HUP\"\n\tSIGILL  Signal = \"ILL\"\n\tSIGINT  Signal = \"INT\"\n\tSIGKILL Signal = \"KILL\"\n\tSIGPIPE Signal = \"PIPE\"\n\tSIGQUIT Signal = \"QUIT\"\n\tSIGSEGV Signal = \"SEGV\"\n\tSIGTERM Signal = \"TERM\"\n\tSIGUSR1 Signal = \"USR1\"\n\tSIGUSR2 Signal = \"USR2\"\n)\n\nvar signals = map[Signal]int{\n\tSIGABRT: 6,\n\tSIGALRM: 14,\n\tSIGFPE:  8,\n\tSIGHUP:  1,\n\tSIGILL:  4,\n\tSIGINT:  2,\n\tSIGKILL: 9,\n\tSIGPIPE: 13,\n\tSIGQUIT: 3,\n\tSIGSEGV: 11,\n\tSIGTERM: 15,\n}\n\ntype TerminalModes map[uint8]uint32\n\n// POSIX terminal mode flags as listed in RFC 4254 Section 8.\nconst (\n\ttty_OP_END    = 0\n\tVINTR         = 1\n\tVQUIT         = 2\n\tVERASE        = 3\n\tVKILL         = 4\n\tVEOF          = 5\n\tVEOL          = 6\n\tVEOL2         = 7\n\tVSTART        = 8\n\tVSTOP         = 9\n\tVSUSP         = 10\n\tVDSUSP        = 11\n\tVREPRINT      = 12\n\tVWERASE       = 13\n\tVLNEXT        = 14\n\tVFLUSH        = 15\n\tVSWTCH        = 16\n\tVSTATUS       = 17\n\tVDISCARD      = 18\n\tIGNPAR        = 30\n\tPARMRK        = 31\n\tINPCK         = 32\n\tISTRIP        = 33\n\tINLCR         = 34\n\tIGNCR         = 35\n\tICRNL         = 36\n\tIUCLC         = 37\n\tIXON          = 38\n\tIXANY         = 39\n\tIXOFF         = 40\n\tIMAXBEL       = 41\n\tISIG          = 50\n\tICANON        = 51\n\tXCASE         = 52\n\tECHO          = 53\n\tECHOE         = 54\n\tECHOK         = 55\n\tECHONL        = 56\n\tNOFLSH        = 57\n\tTOSTOP        = 58\n\tIEXTEN        = 59\n\tECHOCTL       = 60\n\tECHOKE        = 61\n\tPENDIN        = 62\n\tOPOST         = 70\n\tOLCUC         = 71\n\tONLCR         = 72\n\tOCRNL         = 73\n\tONOCR         = 74\n\tONLRET        = 75\n\tCS7           = 90\n\tCS8           = 91\n\tPARENB        = 92\n\tPARODD        = 93\n\tTTY_OP_ISPEED = 128\n\tTTY_OP_OSPEED = 129\n)\n\n// A Session represents a connection to a remote command or shell.\ntype Session struct {\n\t// Stdin specifies the remote process's standard input.\n\t// If Stdin is nil, the remote process reads from an empty\n\t// bytes.Buffer.\n\tStdin io.Reader\n\n\t// Stdout and Stderr specify the remote process's standard\n\t// output and error.\n\t//\n\t// If either is nil, Run connects the corresponding file\n\t// descriptor to an instance of ioutil.Discard. There is a\n\t// fixed amount of buffering that is shared for the two streams.\n\t// If either blocks it may eventually cause the remote\n\t// command to block.\n\tStdout io.Writer\n\tStderr io.Writer\n\n\tch        Channel // the channel backing this session\n\tstarted   bool    // true once Start, Run or Shell is invoked.\n\tcopyFuncs []func() error\n\terrors    chan error // one send per copyFunc\n\n\t// true if pipe method is active\n\tstdinpipe, stdoutpipe, stderrpipe bool\n\n\t// stdinPipeWriter is non-nil if StdinPipe has not been called\n\t// and Stdin was specified by the user; it is the write end of\n\t// a pipe connecting Session.Stdin to the stdin channel.\n\tstdinPipeWriter io.WriteCloser\n\n\texitStatus chan error\n}\n\n// SendRequest sends an out-of-band channel request on the SSH channel\n// underlying the session.\nfunc (s *Session) SendRequest(name string, wantReply bool, payload []byte) (bool, error) {\n\treturn s.ch.SendRequest(name, wantReply, payload)\n}\n\nfunc (s *Session) Close() error {\n\treturn s.ch.Close()\n}\n\n// RFC 4254 Section 6.4.\ntype setenvRequest struct {\n\tName  string\n\tValue string\n}\n\n// Setenv sets an environment variable that will be applied to any\n// command executed by Shell or Run.\nfunc (s *Session) Setenv(name, value string) error {\n\tmsg := setenvRequest{\n\t\tName:  name,\n\t\tValue: value,\n\t}\n\tok, err := s.ch.SendRequest(\"env\", true, Marshal(&msg))\n\tif err == nil && !ok {\n\t\terr = errors.New(\"ssh: setenv failed\")\n\t}\n\treturn err\n}\n\n// RFC 4254 Section 6.2.\ntype ptyRequestMsg struct {\n\tTerm     string\n\tColumns  uint32\n\tRows     uint32\n\tWidth    uint32\n\tHeight   uint32\n\tModelist string\n}\n\n// RequestPty requests the association of a pty with the session on the remote host.\nfunc (s *Session) RequestPty(term string, h, w int, termmodes TerminalModes) error {\n\tvar tm []byte\n\tfor k, v := range termmodes {\n\t\tkv := struct {\n\t\t\tKey byte\n\t\t\tVal uint32\n\t\t}{k, v}\n\n\t\ttm = append(tm, Marshal(&kv)...)\n\t}\n\ttm = append(tm, tty_OP_END)\n\treq := ptyRequestMsg{\n\t\tTerm:     term,\n\t\tColumns:  uint32(w),\n\t\tRows:     uint32(h),\n\t\tWidth:    uint32(w * 8),\n\t\tHeight:   uint32(h * 8),\n\t\tModelist: string(tm),\n\t}\n\tok, err := s.ch.SendRequest(\"pty-req\", true, Marshal(&req))\n\tif err == nil && !ok {\n\t\terr = errors.New(\"ssh: pty-req failed\")\n\t}\n\treturn err\n}\n\n// RFC 4254 Section 6.5.\ntype subsystemRequestMsg struct {\n\tSubsystem string\n}\n\n// RequestSubsystem requests the association of a subsystem with the session on the remote host.\n// A subsystem is a predefined command that runs in the background when the ssh session is initiated\nfunc (s *Session) RequestSubsystem(subsystem string) error {\n\tmsg := subsystemRequestMsg{\n\t\tSubsystem: subsystem,\n\t}\n\tok, err := s.ch.SendRequest(\"subsystem\", true, Marshal(&msg))\n\tif err == nil && !ok {\n\t\terr = errors.New(\"ssh: subsystem request failed\")\n\t}\n\treturn err\n}\n\n// RFC 4254 Section 6.7.\ntype ptyWindowChangeMsg struct {\n\tColumns uint32\n\tRows    uint32\n\tWidth   uint32\n\tHeight  uint32\n}\n\n// WindowChange informs the remote host about a terminal window dimension change to h rows and w columns.\nfunc (s *Session) WindowChange(h, w int) error {\n\treq := ptyWindowChangeMsg{\n\t\tColumns: uint32(w),\n\t\tRows:    uint32(h),\n\t\tWidth:   uint32(w * 8),\n\t\tHeight:  uint32(h * 8),\n\t}\n\t_, err := s.ch.SendRequest(\"window-change\", false, Marshal(&req))\n\treturn err\n}\n\n// RFC 4254 Section 6.9.\ntype signalMsg struct {\n\tSignal string\n}\n\n// Signal sends the given signal to the remote process.\n// sig is one of the SIG* constants.\nfunc (s *Session) Signal(sig Signal) error {\n\tmsg := signalMsg{\n\t\tSignal: string(sig),\n\t}\n\n\t_, err := s.ch.SendRequest(\"signal\", false, Marshal(&msg))\n\treturn err\n}\n\n// RFC 4254 Section 6.5.\ntype execMsg struct {\n\tCommand string\n}\n\n// Start runs cmd on the remote host. Typically, the remote\n// server passes cmd to the shell for interpretation.\n// A Session only accepts one call to Run, Start or Shell.\nfunc (s *Session) Start(cmd string) error {\n\tif s.started {\n\t\treturn errors.New(\"ssh: session already started\")\n\t}\n\treq := execMsg{\n\t\tCommand: cmd,\n\t}\n\n\tok, err := s.ch.SendRequest(\"exec\", true, Marshal(&req))\n\tif err == nil && !ok {\n\t\terr = fmt.Errorf(\"ssh: command %v failed\", cmd)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn s.start()\n}\n\n// Run runs cmd on the remote host. Typically, the remote\n// server passes cmd to the shell for interpretation.\n// A Session only accepts one call to Run, Start, Shell, Output,\n// or CombinedOutput.\n//\n// The returned error is nil if the command runs, has no problems\n// copying stdin, stdout, and stderr, and exits with a zero exit\n// status.\n//\n// If the remote server does not send an exit status, an error of type\n// *ExitMissingError is returned. If the command completes\n// unsuccessfully or is interrupted by a signal, the error is of type\n// *ExitError. Other error types may be returned for I/O problems.\nfunc (s *Session) Run(cmd string) error {\n\terr := s.Start(cmd)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn s.Wait()\n}\n\n// Output runs cmd on the remote host and returns its standard output.\nfunc (s *Session) Output(cmd string) ([]byte, error) {\n\tif s.Stdout != nil {\n\t\treturn nil, errors.New(\"ssh: Stdout already set\")\n\t}\n\tvar b bytes.Buffer\n\ts.Stdout = &b\n\terr := s.Run(cmd)\n\treturn b.Bytes(), err\n}\n\ntype singleWriter struct {\n\tb  bytes.Buffer\n\tmu sync.Mutex\n}\n\nfunc (w *singleWriter) Write(p []byte) (int, error) {\n\tw.mu.Lock()\n\tdefer w.mu.Unlock()\n\treturn w.b.Write(p)\n}\n\n// CombinedOutput runs cmd on the remote host and returns its combined\n// standard output and standard error.\nfunc (s *Session) CombinedOutput(cmd string) ([]byte, error) {\n\tif s.Stdout != nil {\n\t\treturn nil, errors.New(\"ssh: Stdout already set\")\n\t}\n\tif s.Stderr != nil {\n\t\treturn nil, errors.New(\"ssh: Stderr already set\")\n\t}\n\tvar b singleWriter\n\ts.Stdout = &b\n\ts.Stderr = &b\n\terr := s.Run(cmd)\n\treturn b.b.Bytes(), err\n}\n\n// Shell starts a login shell on the remote host. A Session only\n// accepts one call to Run, Start, Shell, Output, or CombinedOutput.\nfunc (s *Session) Shell() error {\n\tif s.started {\n\t\treturn errors.New(\"ssh: session already started\")\n\t}\n\n\tok, err := s.ch.SendRequest(\"shell\", true, nil)\n\tif err == nil && !ok {\n\t\treturn errors.New(\"ssh: could not start shell\")\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn s.start()\n}\n\nfunc (s *Session) start() error {\n\ts.started = true\n\n\ttype F func(*Session)\n\tfor _, setupFd := range []F{(*Session).stdin, (*Session).stdout, (*Session).stderr} {\n\t\tsetupFd(s)\n\t}\n\n\ts.errors = make(chan error, len(s.copyFuncs))\n\tfor _, fn := range s.copyFuncs {\n\t\tgo func(fn func() error) {\n\t\t\ts.errors <- fn()\n\t\t}(fn)\n\t}\n\treturn nil\n}\n\n// Wait waits for the remote command to exit.\n//\n// The returned error is nil if the command runs, has no problems\n// copying stdin, stdout, and stderr, and exits with a zero exit\n// status.\n//\n// If the remote server does not send an exit status, an error of type\n// *ExitMissingError is returned. If the command completes\n// unsuccessfully or is interrupted by a signal, the error is of type\n// *ExitError. Other error types may be returned for I/O problems.\nfunc (s *Session) Wait() error {\n\tif !s.started {\n\t\treturn errors.New(\"ssh: session not started\")\n\t}\n\twaitErr := <-s.exitStatus\n\n\tif s.stdinPipeWriter != nil {\n\t\ts.stdinPipeWriter.Close()\n\t}\n\tvar copyError error\n\tfor _ = range s.copyFuncs {\n\t\tif err := <-s.errors; err != nil && copyError == nil {\n\t\t\tcopyError = err\n\t\t}\n\t}\n\tif waitErr != nil {\n\t\treturn waitErr\n\t}\n\treturn copyError\n}\n\nfunc (s *Session) wait(reqs <-chan *Request) error {\n\twm := Waitmsg{status: -1}\n\t// Wait for msg channel to be closed before returning.\n\tfor msg := range reqs {\n\t\tswitch msg.Type {\n\t\tcase \"exit-status\":\n\t\t\twm.status = int(binary.BigEndian.Uint32(msg.Payload))\n\t\tcase \"exit-signal\":\n\t\t\tvar sigval struct {\n\t\t\t\tSignal     string\n\t\t\t\tCoreDumped bool\n\t\t\t\tError      string\n\t\t\t\tLang       string\n\t\t\t}\n\t\t\tif err := Unmarshal(msg.Payload, &sigval); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\t// Must sanitize strings?\n\t\t\twm.signal = sigval.Signal\n\t\t\twm.msg = sigval.Error\n\t\t\twm.lang = sigval.Lang\n\t\tdefault:\n\t\t\t// This handles keepalives and matches\n\t\t\t// OpenSSH's behaviour.\n\t\t\tif msg.WantReply {\n\t\t\t\tmsg.Reply(false, nil)\n\t\t\t}\n\t\t}\n\t}\n\tif wm.status == 0 {\n\t\treturn nil\n\t}\n\tif wm.status == -1 {\n\t\t// exit-status was never sent from server\n\t\tif wm.signal == \"\" {\n\t\t\t// signal was not sent either.  RFC 4254\n\t\t\t// section 6.10 recommends against this\n\t\t\t// behavior, but it is allowed, so we let\n\t\t\t// clients handle it.\n\t\t\treturn &ExitMissingError{}\n\t\t}\n\t\twm.status = 128\n\t\tif _, ok := signals[Signal(wm.signal)]; ok {\n\t\t\twm.status += signals[Signal(wm.signal)]\n\t\t}\n\t}\n\n\treturn &ExitError{wm}\n}\n\n// ExitMissingError is returned if a session is torn down cleanly, but\n// the server sends no confirmation of the exit status.\ntype ExitMissingError struct{}\n\nfunc (e *ExitMissingError) Error() string {\n\treturn \"wait: remote command exited without exit status or exit signal\"\n}\n\nfunc (s *Session) stdin() {\n\tif s.stdinpipe {\n\t\treturn\n\t}\n\tvar stdin io.Reader\n\tif s.Stdin == nil {\n\t\tstdin = new(bytes.Buffer)\n\t} else {\n\t\tr, w := io.Pipe()\n\t\tgo func() {\n\t\t\t_, err := io.Copy(w, s.Stdin)\n\t\t\tw.CloseWithError(err)\n\t\t}()\n\t\tstdin, s.stdinPipeWriter = r, w\n\t}\n\ts.copyFuncs = append(s.copyFuncs, func() error {\n\t\t_, err := io.Copy(s.ch, stdin)\n\t\tif err1 := s.ch.CloseWrite(); err == nil && err1 != io.EOF {\n\t\t\terr = err1\n\t\t}\n\t\treturn err\n\t})\n}\n\nfunc (s *Session) stdout() {\n\tif s.stdoutpipe {\n\t\treturn\n\t}\n\tif s.Stdout == nil {\n\t\ts.Stdout = ioutil.Discard\n\t}\n\ts.copyFuncs = append(s.copyFuncs, func() error {\n\t\t_, err := io.Copy(s.Stdout, s.ch)\n\t\treturn err\n\t})\n}\n\nfunc (s *Session) stderr() {\n\tif s.stderrpipe {\n\t\treturn\n\t}\n\tif s.Stderr == nil {\n\t\ts.Stderr = ioutil.Discard\n\t}\n\ts.copyFuncs = append(s.copyFuncs, func() error {\n\t\t_, err := io.Copy(s.Stderr, s.ch.Stderr())\n\t\treturn err\n\t})\n}\n\n// sessionStdin reroutes Close to CloseWrite.\ntype sessionStdin struct {\n\tio.Writer\n\tch Channel\n}\n\nfunc (s *sessionStdin) Close() error {\n\treturn s.ch.CloseWrite()\n}\n\n// StdinPipe returns a pipe that will be connected to the\n// remote command's standard input when the command starts.\nfunc (s *Session) StdinPipe() (io.WriteCloser, error) {\n\tif s.Stdin != nil {\n\t\treturn nil, errors.New(\"ssh: Stdin already set\")\n\t}\n\tif s.started {\n\t\treturn nil, errors.New(\"ssh: StdinPipe after process started\")\n\t}\n\ts.stdinpipe = true\n\treturn &sessionStdin{s.ch, s.ch}, nil\n}\n\n// StdoutPipe returns a pipe that will be connected to the\n// remote command's standard output when the command starts.\n// There is a fixed amount of buffering that is shared between\n// stdout and stderr streams. If the StdoutPipe reader is\n// not serviced fast enough it may eventually cause the\n// remote command to block.\nfunc (s *Session) StdoutPipe() (io.Reader, error) {\n\tif s.Stdout != nil {\n\t\treturn nil, errors.New(\"ssh: Stdout already set\")\n\t}\n\tif s.started {\n\t\treturn nil, errors.New(\"ssh: StdoutPipe after process started\")\n\t}\n\ts.stdoutpipe = true\n\treturn s.ch, nil\n}\n\n// StderrPipe returns a pipe that will be connected to the\n// remote command's standard error when the command starts.\n// There is a fixed amount of buffering that is shared between\n// stdout and stderr streams. If the StderrPipe reader is\n// not serviced fast enough it may eventually cause the\n// remote command to block.\nfunc (s *Session) StderrPipe() (io.Reader, error) {\n\tif s.Stderr != nil {\n\t\treturn nil, errors.New(\"ssh: Stderr already set\")\n\t}\n\tif s.started {\n\t\treturn nil, errors.New(\"ssh: StderrPipe after process started\")\n\t}\n\ts.stderrpipe = true\n\treturn s.ch.Stderr(), nil\n}\n\n// newSession returns a new interactive session on the remote host.\nfunc newSession(ch Channel, reqs <-chan *Request) (*Session, error) {\n\ts := &Session{\n\t\tch: ch,\n\t}\n\ts.exitStatus = make(chan error, 1)\n\tgo func() {\n\t\ts.exitStatus <- s.wait(reqs)\n\t}()\n\n\treturn s, nil\n}\n\n// An ExitError reports unsuccessful completion of a remote command.\ntype ExitError struct {\n\tWaitmsg\n}\n\nfunc (e *ExitError) Error() string {\n\treturn e.Waitmsg.String()\n}\n\n// Waitmsg stores the information about an exited remote command\n// as reported by Wait.\ntype Waitmsg struct {\n\tstatus int\n\tsignal string\n\tmsg    string\n\tlang   string\n}\n\n// ExitStatus returns the exit status of the remote command.\nfunc (w Waitmsg) ExitStatus() int {\n\treturn w.status\n}\n\n// Signal returns the exit signal of the remote command if\n// it was terminated violently.\nfunc (w Waitmsg) Signal() string {\n\treturn w.signal\n}\n\n// Msg returns the exit message given by the remote command\nfunc (w Waitmsg) Msg() string {\n\treturn w.msg\n}\n\n// Lang returns the language tag. See RFC 3066\nfunc (w Waitmsg) Lang() string {\n\treturn w.lang\n}\n\nfunc (w Waitmsg) String() string {\n\tstr := fmt.Sprintf(\"Process exited with status %v\", w.status)\n\tif w.signal != \"\" {\n\t\tstr += fmt.Sprintf(\" from signal %v\", w.signal)\n\t}\n\tif w.msg != \"\" {\n\t\tstr += fmt.Sprintf(\". Reason was: %v\", w.msg)\n\t}\n\treturn str\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/streamlocal.go",
    "content": "package ssh\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"net\"\n)\n\n// streamLocalChannelOpenDirectMsg is a struct used for SSH_MSG_CHANNEL_OPEN message\n// with \"direct-streamlocal@openssh.com\" string.\n//\n// See openssh-portable/PROTOCOL, section 2.4. connection: Unix domain socket forwarding\n// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL#L235\ntype streamLocalChannelOpenDirectMsg struct {\n\tsocketPath string\n\treserved0  string\n\treserved1  uint32\n}\n\n// forwardedStreamLocalPayload is a struct used for SSH_MSG_CHANNEL_OPEN message\n// with \"forwarded-streamlocal@openssh.com\" string.\ntype forwardedStreamLocalPayload struct {\n\tSocketPath string\n\tReserved0  string\n}\n\n// streamLocalChannelForwardMsg is a struct used for SSH2_MSG_GLOBAL_REQUEST message\n// with \"streamlocal-forward@openssh.com\"/\"cancel-streamlocal-forward@openssh.com\" string.\ntype streamLocalChannelForwardMsg struct {\n\tsocketPath string\n}\n\n// ListenUnix is similar to ListenTCP but uses a Unix domain socket.\nfunc (c *Client) ListenUnix(socketPath string) (net.Listener, error) {\n\tm := streamLocalChannelForwardMsg{\n\t\tsocketPath,\n\t}\n\t// send message\n\tok, _, err := c.SendRequest(\"streamlocal-forward@openssh.com\", true, Marshal(&m))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !ok {\n\t\treturn nil, errors.New(\"ssh: streamlocal-forward@openssh.com request denied by peer\")\n\t}\n\tch := c.forwards.add(&net.UnixAddr{Name: socketPath, Net: \"unix\"})\n\n\treturn &unixListener{socketPath, c, ch}, nil\n}\n\nfunc (c *Client) dialStreamLocal(socketPath string) (Channel, error) {\n\tmsg := streamLocalChannelOpenDirectMsg{\n\t\tsocketPath: socketPath,\n\t}\n\tch, in, err := c.OpenChannel(\"direct-streamlocal@openssh.com\", Marshal(&msg))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgo DiscardRequests(in)\n\treturn ch, err\n}\n\ntype unixListener struct {\n\tsocketPath string\n\n\tconn *Client\n\tin   <-chan forward\n}\n\n// Accept waits for and returns the next connection to the listener.\nfunc (l *unixListener) Accept() (net.Conn, error) {\n\ts, ok := <-l.in\n\tif !ok {\n\t\treturn nil, io.EOF\n\t}\n\tch, incoming, err := s.newCh.Accept()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgo DiscardRequests(incoming)\n\n\treturn &chanConn{\n\t\tChannel: ch,\n\t\tladdr: &net.UnixAddr{\n\t\t\tName: l.socketPath,\n\t\t\tNet:  \"unix\",\n\t\t},\n\t\traddr: &net.UnixAddr{\n\t\t\tName: \"@\",\n\t\t\tNet:  \"unix\",\n\t\t},\n\t}, nil\n}\n\n// Close closes the listener.\nfunc (l *unixListener) Close() error {\n\t// this also closes the listener.\n\tl.conn.forwards.remove(&net.UnixAddr{Name: l.socketPath, Net: \"unix\"})\n\tm := streamLocalChannelForwardMsg{\n\t\tl.socketPath,\n\t}\n\tok, _, err := l.conn.SendRequest(\"cancel-streamlocal-forward@openssh.com\", true, Marshal(&m))\n\tif err == nil && !ok {\n\t\terr = errors.New(\"ssh: cancel-streamlocal-forward@openssh.com failed\")\n\t}\n\treturn err\n}\n\n// Addr returns the listener's network address.\nfunc (l *unixListener) Addr() net.Addr {\n\treturn &net.UnixAddr{\n\t\tName: l.socketPath,\n\t\tNet:  \"unix\",\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/tcpip.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/rand\"\n\t\"net\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n)\n\n// Listen requests the remote peer open a listening socket on\n// addr. Incoming connections will be available by calling Accept on\n// the returned net.Listener. The listener must be serviced, or the\n// SSH connection may hang.\n// N must be \"tcp\", \"tcp4\", \"tcp6\", or \"unix\".\nfunc (c *Client) Listen(n, addr string) (net.Listener, error) {\n\tswitch n {\n\tcase \"tcp\", \"tcp4\", \"tcp6\":\n\t\tladdr, err := net.ResolveTCPAddr(n, addr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn c.ListenTCP(laddr)\n\tcase \"unix\":\n\t\treturn c.ListenUnix(addr)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unsupported protocol: %s\", n)\n\t}\n}\n\n// Automatic port allocation is broken with OpenSSH before 6.0. See\n// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017.  In\n// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0,\n// rather than the actual port number. This means you can never open\n// two different listeners with auto allocated ports. We work around\n// this by trying explicit ports until we succeed.\n\nconst openSSHPrefix = \"OpenSSH_\"\n\nvar portRandomizer = rand.New(rand.NewSource(time.Now().UnixNano()))\n\n// isBrokenOpenSSHVersion returns true if the given version string\n// specifies a version of OpenSSH that is known to have a bug in port\n// forwarding.\nfunc isBrokenOpenSSHVersion(versionStr string) bool {\n\ti := strings.Index(versionStr, openSSHPrefix)\n\tif i < 0 {\n\t\treturn false\n\t}\n\ti += len(openSSHPrefix)\n\tj := i\n\tfor ; j < len(versionStr); j++ {\n\t\tif versionStr[j] < '0' || versionStr[j] > '9' {\n\t\t\tbreak\n\t\t}\n\t}\n\tversion, _ := strconv.Atoi(versionStr[i:j])\n\treturn version < 6\n}\n\n// autoPortListenWorkaround simulates automatic port allocation by\n// trying random ports repeatedly.\nfunc (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) {\n\tvar sshListener net.Listener\n\tvar err error\n\tconst tries = 10\n\tfor i := 0; i < tries; i++ {\n\t\taddr := *laddr\n\t\taddr.Port = 1024 + portRandomizer.Intn(60000)\n\t\tsshListener, err = c.ListenTCP(&addr)\n\t\tif err == nil {\n\t\t\tladdr.Port = addr.Port\n\t\t\treturn sshListener, err\n\t\t}\n\t}\n\treturn nil, fmt.Errorf(\"ssh: listen on random port failed after %d tries: %v\", tries, err)\n}\n\n// RFC 4254 7.1\ntype channelForwardMsg struct {\n\taddr  string\n\trport uint32\n}\n\n// ListenTCP requests the remote peer open a listening socket\n// on laddr. Incoming connections will be available by calling\n// Accept on the returned net.Listener.\nfunc (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) {\n\tif laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) {\n\t\treturn c.autoPortListenWorkaround(laddr)\n\t}\n\n\tm := channelForwardMsg{\n\t\tladdr.IP.String(),\n\t\tuint32(laddr.Port),\n\t}\n\t// send message\n\tok, resp, err := c.SendRequest(\"tcpip-forward\", true, Marshal(&m))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !ok {\n\t\treturn nil, errors.New(\"ssh: tcpip-forward request denied by peer\")\n\t}\n\n\t// If the original port was 0, then the remote side will\n\t// supply a real port number in the response.\n\tif laddr.Port == 0 {\n\t\tvar p struct {\n\t\t\tPort uint32\n\t\t}\n\t\tif err := Unmarshal(resp, &p); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tladdr.Port = int(p.Port)\n\t}\n\n\t// Register this forward, using the port number we obtained.\n\tch := c.forwards.add(laddr)\n\n\treturn &tcpListener{laddr, c, ch}, nil\n}\n\n// forwardList stores a mapping between remote\n// forward requests and the tcpListeners.\ntype forwardList struct {\n\tsync.Mutex\n\tentries []forwardEntry\n}\n\n// forwardEntry represents an established mapping of a laddr on a\n// remote ssh server to a channel connected to a tcpListener.\ntype forwardEntry struct {\n\tladdr net.Addr\n\tc     chan forward\n}\n\n// forward represents an incoming forwarded tcpip connection. The\n// arguments to add/remove/lookup should be address as specified in\n// the original forward-request.\ntype forward struct {\n\tnewCh NewChannel // the ssh client channel underlying this forward\n\traddr net.Addr   // the raddr of the incoming connection\n}\n\nfunc (l *forwardList) add(addr net.Addr) chan forward {\n\tl.Lock()\n\tdefer l.Unlock()\n\tf := forwardEntry{\n\t\tladdr: addr,\n\t\tc:     make(chan forward, 1),\n\t}\n\tl.entries = append(l.entries, f)\n\treturn f.c\n}\n\n// See RFC 4254, section 7.2\ntype forwardedTCPPayload struct {\n\tAddr       string\n\tPort       uint32\n\tOriginAddr string\n\tOriginPort uint32\n}\n\n// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr.\nfunc parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) {\n\tif port == 0 || port > 65535 {\n\t\treturn nil, fmt.Errorf(\"ssh: port number out of range: %d\", port)\n\t}\n\tip := net.ParseIP(string(addr))\n\tif ip == nil {\n\t\treturn nil, fmt.Errorf(\"ssh: cannot parse IP address %q\", addr)\n\t}\n\treturn &net.TCPAddr{IP: ip, Port: int(port)}, nil\n}\n\nfunc (l *forwardList) handleChannels(in <-chan NewChannel) {\n\tfor ch := range in {\n\t\tvar (\n\t\t\tladdr net.Addr\n\t\t\traddr net.Addr\n\t\t\terr   error\n\t\t)\n\t\tswitch channelType := ch.ChannelType(); channelType {\n\t\tcase \"forwarded-tcpip\":\n\t\t\tvar payload forwardedTCPPayload\n\t\t\tif err = Unmarshal(ch.ExtraData(), &payload); err != nil {\n\t\t\t\tch.Reject(ConnectionFailed, \"could not parse forwarded-tcpip payload: \"+err.Error())\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// RFC 4254 section 7.2 specifies that incoming\n\t\t\t// addresses should list the address, in string\n\t\t\t// format. It is implied that this should be an IP\n\t\t\t// address, as it would be impossible to connect to it\n\t\t\t// otherwise.\n\t\t\tladdr, err = parseTCPAddr(payload.Addr, payload.Port)\n\t\t\tif err != nil {\n\t\t\t\tch.Reject(ConnectionFailed, err.Error())\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\traddr, err = parseTCPAddr(payload.OriginAddr, payload.OriginPort)\n\t\t\tif err != nil {\n\t\t\t\tch.Reject(ConnectionFailed, err.Error())\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\tcase \"forwarded-streamlocal@openssh.com\":\n\t\t\tvar payload forwardedStreamLocalPayload\n\t\t\tif err = Unmarshal(ch.ExtraData(), &payload); err != nil {\n\t\t\t\tch.Reject(ConnectionFailed, \"could not parse forwarded-streamlocal@openssh.com payload: \"+err.Error())\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tladdr = &net.UnixAddr{\n\t\t\t\tName: payload.SocketPath,\n\t\t\t\tNet:  \"unix\",\n\t\t\t}\n\t\t\traddr = &net.UnixAddr{\n\t\t\t\tName: \"@\",\n\t\t\t\tNet:  \"unix\",\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(fmt.Errorf(\"ssh: unknown channel type %s\", channelType))\n\t\t}\n\t\tif ok := l.forward(laddr, raddr, ch); !ok {\n\t\t\t// Section 7.2, implementations MUST reject spurious incoming\n\t\t\t// connections.\n\t\t\tch.Reject(Prohibited, \"no forward for address\")\n\t\t\tcontinue\n\t\t}\n\n\t}\n}\n\n// remove removes the forward entry, and the channel feeding its\n// listener.\nfunc (l *forwardList) remove(addr net.Addr) {\n\tl.Lock()\n\tdefer l.Unlock()\n\tfor i, f := range l.entries {\n\t\tif addr.Network() == f.laddr.Network() && addr.String() == f.laddr.String() {\n\t\t\tl.entries = append(l.entries[:i], l.entries[i+1:]...)\n\t\t\tclose(f.c)\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// closeAll closes and clears all forwards.\nfunc (l *forwardList) closeAll() {\n\tl.Lock()\n\tdefer l.Unlock()\n\tfor _, f := range l.entries {\n\t\tclose(f.c)\n\t}\n\tl.entries = nil\n}\n\nfunc (l *forwardList) forward(laddr, raddr net.Addr, ch NewChannel) bool {\n\tl.Lock()\n\tdefer l.Unlock()\n\tfor _, f := range l.entries {\n\t\tif laddr.Network() == f.laddr.Network() && laddr.String() == f.laddr.String() {\n\t\t\tf.c <- forward{newCh: ch, raddr: raddr}\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\ntype tcpListener struct {\n\tladdr *net.TCPAddr\n\n\tconn *Client\n\tin   <-chan forward\n}\n\n// Accept waits for and returns the next connection to the listener.\nfunc (l *tcpListener) Accept() (net.Conn, error) {\n\ts, ok := <-l.in\n\tif !ok {\n\t\treturn nil, io.EOF\n\t}\n\tch, incoming, err := s.newCh.Accept()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgo DiscardRequests(incoming)\n\n\treturn &chanConn{\n\t\tChannel: ch,\n\t\tladdr:   l.laddr,\n\t\traddr:   s.raddr,\n\t}, nil\n}\n\n// Close closes the listener.\nfunc (l *tcpListener) Close() error {\n\tm := channelForwardMsg{\n\t\tl.laddr.IP.String(),\n\t\tuint32(l.laddr.Port),\n\t}\n\n\t// this also closes the listener.\n\tl.conn.forwards.remove(l.laddr)\n\tok, _, err := l.conn.SendRequest(\"cancel-tcpip-forward\", true, Marshal(&m))\n\tif err == nil && !ok {\n\t\terr = errors.New(\"ssh: cancel-tcpip-forward failed\")\n\t}\n\treturn err\n}\n\n// Addr returns the listener's network address.\nfunc (l *tcpListener) Addr() net.Addr {\n\treturn l.laddr\n}\n\n// Dial initiates a connection to the addr from the remote host.\n// The resulting connection has a zero LocalAddr() and RemoteAddr().\nfunc (c *Client) Dial(n, addr string) (net.Conn, error) {\n\tvar ch Channel\n\tswitch n {\n\tcase \"tcp\", \"tcp4\", \"tcp6\":\n\t\t// Parse the address into host and numeric port.\n\t\thost, portString, err := net.SplitHostPort(addr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tport, err := strconv.ParseUint(portString, 10, 16)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tch, err = c.dial(net.IPv4zero.String(), 0, host, int(port))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// Use a zero address for local and remote address.\n\t\tzeroAddr := &net.TCPAddr{\n\t\t\tIP:   net.IPv4zero,\n\t\t\tPort: 0,\n\t\t}\n\t\treturn &chanConn{\n\t\t\tChannel: ch,\n\t\t\tladdr:   zeroAddr,\n\t\t\traddr:   zeroAddr,\n\t\t}, nil\n\tcase \"unix\":\n\t\tvar err error\n\t\tch, err = c.dialStreamLocal(addr)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn &chanConn{\n\t\t\tChannel: ch,\n\t\t\tladdr: &net.UnixAddr{\n\t\t\t\tName: \"@\",\n\t\t\t\tNet:  \"unix\",\n\t\t\t},\n\t\t\traddr: &net.UnixAddr{\n\t\t\t\tName: addr,\n\t\t\t\tNet:  \"unix\",\n\t\t\t},\n\t\t}, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"ssh: unsupported protocol: %s\", n)\n\t}\n}\n\n// DialTCP connects to the remote address raddr on the network net,\n// which must be \"tcp\", \"tcp4\", or \"tcp6\".  If laddr is not nil, it is used\n// as the local address for the connection.\nfunc (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) {\n\tif laddr == nil {\n\t\tladdr = &net.TCPAddr{\n\t\t\tIP:   net.IPv4zero,\n\t\t\tPort: 0,\n\t\t}\n\t}\n\tch, err := c.dial(laddr.IP.String(), laddr.Port, raddr.IP.String(), raddr.Port)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &chanConn{\n\t\tChannel: ch,\n\t\tladdr:   laddr,\n\t\traddr:   raddr,\n\t}, nil\n}\n\n// RFC 4254 7.2\ntype channelOpenDirectMsg struct {\n\traddr string\n\trport uint32\n\tladdr string\n\tlport uint32\n}\n\nfunc (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) {\n\tmsg := channelOpenDirectMsg{\n\t\traddr: raddr,\n\t\trport: uint32(rport),\n\t\tladdr: laddr,\n\t\tlport: uint32(lport),\n\t}\n\tch, in, err := c.OpenChannel(\"direct-tcpip\", Marshal(&msg))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgo DiscardRequests(in)\n\treturn ch, err\n}\n\ntype tcpChan struct {\n\tChannel // the backing channel\n}\n\n// chanConn fulfills the net.Conn interface without\n// the tcpChan having to hold laddr or raddr directly.\ntype chanConn struct {\n\tChannel\n\tladdr, raddr net.Addr\n}\n\n// LocalAddr returns the local network address.\nfunc (t *chanConn) LocalAddr() net.Addr {\n\treturn t.laddr\n}\n\n// RemoteAddr returns the remote network address.\nfunc (t *chanConn) RemoteAddr() net.Addr {\n\treturn t.raddr\n}\n\n// SetDeadline sets the read and write deadlines associated\n// with the connection.\nfunc (t *chanConn) SetDeadline(deadline time.Time) error {\n\tif err := t.SetReadDeadline(deadline); err != nil {\n\t\treturn err\n\t}\n\treturn t.SetWriteDeadline(deadline)\n}\n\n// SetReadDeadline sets the read deadline.\n// A zero value for t means Read will not time out.\n// After the deadline, the error from Read will implement net.Error\n// with Timeout() == true.\nfunc (t *chanConn) SetReadDeadline(deadline time.Time) error {\n\t// for compatibility with previous version,\n\t// the error message contains \"tcpChan\"\n\treturn errors.New(\"ssh: tcpChan: deadline not supported\")\n}\n\n// SetWriteDeadline exists to satisfy the net.Conn interface\n// but is not implemented by this type.  It always returns an error.\nfunc (t *chanConn) SetWriteDeadline(deadline time.Time) error {\n\treturn errors.New(\"ssh: tcpChan: deadline not supported\")\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/terminal/terminal.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage terminal\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"sync\"\n\t\"unicode/utf8\"\n)\n\n// EscapeCodes contains escape sequences that can be written to the terminal in\n// order to achieve different styles of text.\ntype EscapeCodes struct {\n\t// Foreground colors\n\tBlack, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte\n\n\t// Reset all attributes\n\tReset []byte\n}\n\nvar vt100EscapeCodes = EscapeCodes{\n\tBlack:   []byte{keyEscape, '[', '3', '0', 'm'},\n\tRed:     []byte{keyEscape, '[', '3', '1', 'm'},\n\tGreen:   []byte{keyEscape, '[', '3', '2', 'm'},\n\tYellow:  []byte{keyEscape, '[', '3', '3', 'm'},\n\tBlue:    []byte{keyEscape, '[', '3', '4', 'm'},\n\tMagenta: []byte{keyEscape, '[', '3', '5', 'm'},\n\tCyan:    []byte{keyEscape, '[', '3', '6', 'm'},\n\tWhite:   []byte{keyEscape, '[', '3', '7', 'm'},\n\n\tReset: []byte{keyEscape, '[', '0', 'm'},\n}\n\n// Terminal contains the state for running a VT100 terminal that is capable of\n// reading lines of input.\ntype Terminal struct {\n\t// AutoCompleteCallback, if non-null, is called for each keypress with\n\t// the full input line and the current position of the cursor (in\n\t// bytes, as an index into |line|). If it returns ok=false, the key\n\t// press is processed normally. Otherwise it returns a replacement line\n\t// and the new cursor position.\n\tAutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)\n\n\t// Escape contains a pointer to the escape codes for this terminal.\n\t// It's always a valid pointer, although the escape codes themselves\n\t// may be empty if the terminal doesn't support them.\n\tEscape *EscapeCodes\n\n\t// lock protects the terminal and the state in this object from\n\t// concurrent processing of a key press and a Write() call.\n\tlock sync.Mutex\n\n\tc      io.ReadWriter\n\tprompt []rune\n\n\t// line is the current line being entered.\n\tline []rune\n\t// pos is the logical position of the cursor in line\n\tpos int\n\t// echo is true if local echo is enabled\n\techo bool\n\t// pasteActive is true iff there is a bracketed paste operation in\n\t// progress.\n\tpasteActive bool\n\n\t// cursorX contains the current X value of the cursor where the left\n\t// edge is 0. cursorY contains the row number where the first row of\n\t// the current line is 0.\n\tcursorX, cursorY int\n\t// maxLine is the greatest value of cursorY so far.\n\tmaxLine int\n\n\ttermWidth, termHeight int\n\n\t// outBuf contains the terminal data to be sent.\n\toutBuf []byte\n\t// remainder contains the remainder of any partial key sequences after\n\t// a read. It aliases into inBuf.\n\tremainder []byte\n\tinBuf     [256]byte\n\n\t// history contains previously entered commands so that they can be\n\t// accessed with the up and down keys.\n\thistory stRingBuffer\n\t// historyIndex stores the currently accessed history entry, where zero\n\t// means the immediately previous entry.\n\thistoryIndex int\n\t// When navigating up and down the history it's possible to return to\n\t// the incomplete, initial line. That value is stored in\n\t// historyPending.\n\thistoryPending string\n}\n\n// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is\n// a local terminal, that terminal must first have been put into raw mode.\n// prompt is a string that is written at the start of each input line (i.e.\n// \"> \").\nfunc NewTerminal(c io.ReadWriter, prompt string) *Terminal {\n\treturn &Terminal{\n\t\tEscape:       &vt100EscapeCodes,\n\t\tc:            c,\n\t\tprompt:       []rune(prompt),\n\t\ttermWidth:    80,\n\t\ttermHeight:   24,\n\t\techo:         true,\n\t\thistoryIndex: -1,\n\t}\n}\n\nconst (\n\tkeyCtrlD     = 4\n\tkeyCtrlU     = 21\n\tkeyEnter     = '\\r'\n\tkeyEscape    = 27\n\tkeyBackspace = 127\n\tkeyUnknown   = 0xd800 /* UTF-16 surrogate area */ + iota\n\tkeyUp\n\tkeyDown\n\tkeyLeft\n\tkeyRight\n\tkeyAltLeft\n\tkeyAltRight\n\tkeyHome\n\tkeyEnd\n\tkeyDeleteWord\n\tkeyDeleteLine\n\tkeyClearScreen\n\tkeyPasteStart\n\tkeyPasteEnd\n)\n\nvar (\n\tcrlf       = []byte{'\\r', '\\n'}\n\tpasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}\n\tpasteEnd   = []byte{keyEscape, '[', '2', '0', '1', '~'}\n)\n\n// bytesToKey tries to parse a key sequence from b. If successful, it returns\n// the key and the remainder of the input. Otherwise it returns utf8.RuneError.\nfunc bytesToKey(b []byte, pasteActive bool) (rune, []byte) {\n\tif len(b) == 0 {\n\t\treturn utf8.RuneError, nil\n\t}\n\n\tif !pasteActive {\n\t\tswitch b[0] {\n\t\tcase 1: // ^A\n\t\t\treturn keyHome, b[1:]\n\t\tcase 5: // ^E\n\t\t\treturn keyEnd, b[1:]\n\t\tcase 8: // ^H\n\t\t\treturn keyBackspace, b[1:]\n\t\tcase 11: // ^K\n\t\t\treturn keyDeleteLine, b[1:]\n\t\tcase 12: // ^L\n\t\t\treturn keyClearScreen, b[1:]\n\t\tcase 23: // ^W\n\t\t\treturn keyDeleteWord, b[1:]\n\t\t}\n\t}\n\n\tif b[0] != keyEscape {\n\t\tif !utf8.FullRune(b) {\n\t\t\treturn utf8.RuneError, b\n\t\t}\n\t\tr, l := utf8.DecodeRune(b)\n\t\treturn r, b[l:]\n\t}\n\n\tif !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {\n\t\tswitch b[2] {\n\t\tcase 'A':\n\t\t\treturn keyUp, b[3:]\n\t\tcase 'B':\n\t\t\treturn keyDown, b[3:]\n\t\tcase 'C':\n\t\t\treturn keyRight, b[3:]\n\t\tcase 'D':\n\t\t\treturn keyLeft, b[3:]\n\t\tcase 'H':\n\t\t\treturn keyHome, b[3:]\n\t\tcase 'F':\n\t\t\treturn keyEnd, b[3:]\n\t\t}\n\t}\n\n\tif !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {\n\t\tswitch b[5] {\n\t\tcase 'C':\n\t\t\treturn keyAltRight, b[6:]\n\t\tcase 'D':\n\t\t\treturn keyAltLeft, b[6:]\n\t\t}\n\t}\n\n\tif !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {\n\t\treturn keyPasteStart, b[6:]\n\t}\n\n\tif pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {\n\t\treturn keyPasteEnd, b[6:]\n\t}\n\n\t// If we get here then we have a key that we don't recognise, or a\n\t// partial sequence. It's not clear how one should find the end of a\n\t// sequence without knowing them all, but it seems that [a-zA-Z~] only\n\t// appears at the end of a sequence.\n\tfor i, c := range b[0:] {\n\t\tif c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {\n\t\t\treturn keyUnknown, b[i+1:]\n\t\t}\n\t}\n\n\treturn utf8.RuneError, b\n}\n\n// queue appends data to the end of t.outBuf\nfunc (t *Terminal) queue(data []rune) {\n\tt.outBuf = append(t.outBuf, []byte(string(data))...)\n}\n\nvar eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'}\nvar space = []rune{' '}\n\nfunc isPrintable(key rune) bool {\n\tisInSurrogateArea := key >= 0xd800 && key <= 0xdbff\n\treturn key >= 32 && !isInSurrogateArea\n}\n\n// moveCursorToPos appends data to t.outBuf which will move the cursor to the\n// given, logical position in the text.\nfunc (t *Terminal) moveCursorToPos(pos int) {\n\tif !t.echo {\n\t\treturn\n\t}\n\n\tx := visualLength(t.prompt) + pos\n\ty := x / t.termWidth\n\tx = x % t.termWidth\n\n\tup := 0\n\tif y < t.cursorY {\n\t\tup = t.cursorY - y\n\t}\n\n\tdown := 0\n\tif y > t.cursorY {\n\t\tdown = y - t.cursorY\n\t}\n\n\tleft := 0\n\tif x < t.cursorX {\n\t\tleft = t.cursorX - x\n\t}\n\n\tright := 0\n\tif x > t.cursorX {\n\t\tright = x - t.cursorX\n\t}\n\n\tt.cursorX = x\n\tt.cursorY = y\n\tt.move(up, down, left, right)\n}\n\nfunc (t *Terminal) move(up, down, left, right int) {\n\tmovement := make([]rune, 3*(up+down+left+right))\n\tm := movement\n\tfor i := 0; i < up; i++ {\n\t\tm[0] = keyEscape\n\t\tm[1] = '['\n\t\tm[2] = 'A'\n\t\tm = m[3:]\n\t}\n\tfor i := 0; i < down; i++ {\n\t\tm[0] = keyEscape\n\t\tm[1] = '['\n\t\tm[2] = 'B'\n\t\tm = m[3:]\n\t}\n\tfor i := 0; i < left; i++ {\n\t\tm[0] = keyEscape\n\t\tm[1] = '['\n\t\tm[2] = 'D'\n\t\tm = m[3:]\n\t}\n\tfor i := 0; i < right; i++ {\n\t\tm[0] = keyEscape\n\t\tm[1] = '['\n\t\tm[2] = 'C'\n\t\tm = m[3:]\n\t}\n\n\tt.queue(movement)\n}\n\nfunc (t *Terminal) clearLineToRight() {\n\top := []rune{keyEscape, '[', 'K'}\n\tt.queue(op)\n}\n\nconst maxLineLength = 4096\n\nfunc (t *Terminal) setLine(newLine []rune, newPos int) {\n\tif t.echo {\n\t\tt.moveCursorToPos(0)\n\t\tt.writeLine(newLine)\n\t\tfor i := len(newLine); i < len(t.line); i++ {\n\t\t\tt.writeLine(space)\n\t\t}\n\t\tt.moveCursorToPos(newPos)\n\t}\n\tt.line = newLine\n\tt.pos = newPos\n}\n\nfunc (t *Terminal) advanceCursor(places int) {\n\tt.cursorX += places\n\tt.cursorY += t.cursorX / t.termWidth\n\tif t.cursorY > t.maxLine {\n\t\tt.maxLine = t.cursorY\n\t}\n\tt.cursorX = t.cursorX % t.termWidth\n\n\tif places > 0 && t.cursorX == 0 {\n\t\t// Normally terminals will advance the current position\n\t\t// when writing a character. But that doesn't happen\n\t\t// for the last character in a line. However, when\n\t\t// writing a character (except a new line) that causes\n\t\t// a line wrap, the position will be advanced two\n\t\t// places.\n\t\t//\n\t\t// So, if we are stopping at the end of a line, we\n\t\t// need to write a newline so that our cursor can be\n\t\t// advanced to the next line.\n\t\tt.outBuf = append(t.outBuf, '\\r', '\\n')\n\t}\n}\n\nfunc (t *Terminal) eraseNPreviousChars(n int) {\n\tif n == 0 {\n\t\treturn\n\t}\n\n\tif t.pos < n {\n\t\tn = t.pos\n\t}\n\tt.pos -= n\n\tt.moveCursorToPos(t.pos)\n\n\tcopy(t.line[t.pos:], t.line[n+t.pos:])\n\tt.line = t.line[:len(t.line)-n]\n\tif t.echo {\n\t\tt.writeLine(t.line[t.pos:])\n\t\tfor i := 0; i < n; i++ {\n\t\t\tt.queue(space)\n\t\t}\n\t\tt.advanceCursor(n)\n\t\tt.moveCursorToPos(t.pos)\n\t}\n}\n\n// countToLeftWord returns then number of characters from the cursor to the\n// start of the previous word.\nfunc (t *Terminal) countToLeftWord() int {\n\tif t.pos == 0 {\n\t\treturn 0\n\t}\n\n\tpos := t.pos - 1\n\tfor pos > 0 {\n\t\tif t.line[pos] != ' ' {\n\t\t\tbreak\n\t\t}\n\t\tpos--\n\t}\n\tfor pos > 0 {\n\t\tif t.line[pos] == ' ' {\n\t\t\tpos++\n\t\t\tbreak\n\t\t}\n\t\tpos--\n\t}\n\n\treturn t.pos - pos\n}\n\n// countToRightWord returns then number of characters from the cursor to the\n// start of the next word.\nfunc (t *Terminal) countToRightWord() int {\n\tpos := t.pos\n\tfor pos < len(t.line) {\n\t\tif t.line[pos] == ' ' {\n\t\t\tbreak\n\t\t}\n\t\tpos++\n\t}\n\tfor pos < len(t.line) {\n\t\tif t.line[pos] != ' ' {\n\t\t\tbreak\n\t\t}\n\t\tpos++\n\t}\n\treturn pos - t.pos\n}\n\n// visualLength returns the number of visible glyphs in s.\nfunc visualLength(runes []rune) int {\n\tinEscapeSeq := false\n\tlength := 0\n\n\tfor _, r := range runes {\n\t\tswitch {\n\t\tcase inEscapeSeq:\n\t\t\tif (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {\n\t\t\t\tinEscapeSeq = false\n\t\t\t}\n\t\tcase r == '\\x1b':\n\t\t\tinEscapeSeq = true\n\t\tdefault:\n\t\t\tlength++\n\t\t}\n\t}\n\n\treturn length\n}\n\n// handleKey processes the given key and, optionally, returns a line of text\n// that the user has entered.\nfunc (t *Terminal) handleKey(key rune) (line string, ok bool) {\n\tif t.pasteActive && key != keyEnter {\n\t\tt.addKeyToLine(key)\n\t\treturn\n\t}\n\n\tswitch key {\n\tcase keyBackspace:\n\t\tif t.pos == 0 {\n\t\t\treturn\n\t\t}\n\t\tt.eraseNPreviousChars(1)\n\tcase keyAltLeft:\n\t\t// move left by a word.\n\t\tt.pos -= t.countToLeftWord()\n\t\tt.moveCursorToPos(t.pos)\n\tcase keyAltRight:\n\t\t// move right by a word.\n\t\tt.pos += t.countToRightWord()\n\t\tt.moveCursorToPos(t.pos)\n\tcase keyLeft:\n\t\tif t.pos == 0 {\n\t\t\treturn\n\t\t}\n\t\tt.pos--\n\t\tt.moveCursorToPos(t.pos)\n\tcase keyRight:\n\t\tif t.pos == len(t.line) {\n\t\t\treturn\n\t\t}\n\t\tt.pos++\n\t\tt.moveCursorToPos(t.pos)\n\tcase keyHome:\n\t\tif t.pos == 0 {\n\t\t\treturn\n\t\t}\n\t\tt.pos = 0\n\t\tt.moveCursorToPos(t.pos)\n\tcase keyEnd:\n\t\tif t.pos == len(t.line) {\n\t\t\treturn\n\t\t}\n\t\tt.pos = len(t.line)\n\t\tt.moveCursorToPos(t.pos)\n\tcase keyUp:\n\t\tentry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)\n\t\tif !ok {\n\t\t\treturn \"\", false\n\t\t}\n\t\tif t.historyIndex == -1 {\n\t\t\tt.historyPending = string(t.line)\n\t\t}\n\t\tt.historyIndex++\n\t\trunes := []rune(entry)\n\t\tt.setLine(runes, len(runes))\n\tcase keyDown:\n\t\tswitch t.historyIndex {\n\t\tcase -1:\n\t\t\treturn\n\t\tcase 0:\n\t\t\trunes := []rune(t.historyPending)\n\t\t\tt.setLine(runes, len(runes))\n\t\t\tt.historyIndex--\n\t\tdefault:\n\t\t\tentry, ok := t.history.NthPreviousEntry(t.historyIndex - 1)\n\t\t\tif ok {\n\t\t\t\tt.historyIndex--\n\t\t\t\trunes := []rune(entry)\n\t\t\t\tt.setLine(runes, len(runes))\n\t\t\t}\n\t\t}\n\tcase keyEnter:\n\t\tt.moveCursorToPos(len(t.line))\n\t\tt.queue([]rune(\"\\r\\n\"))\n\t\tline = string(t.line)\n\t\tok = true\n\t\tt.line = t.line[:0]\n\t\tt.pos = 0\n\t\tt.cursorX = 0\n\t\tt.cursorY = 0\n\t\tt.maxLine = 0\n\tcase keyDeleteWord:\n\t\t// Delete zero or more spaces and then one or more characters.\n\t\tt.eraseNPreviousChars(t.countToLeftWord())\n\tcase keyDeleteLine:\n\t\t// Delete everything from the current cursor position to the\n\t\t// end of line.\n\t\tfor i := t.pos; i < len(t.line); i++ {\n\t\t\tt.queue(space)\n\t\t\tt.advanceCursor(1)\n\t\t}\n\t\tt.line = t.line[:t.pos]\n\t\tt.moveCursorToPos(t.pos)\n\tcase keyCtrlD:\n\t\t// Erase the character under the current position.\n\t\t// The EOF case when the line is empty is handled in\n\t\t// readLine().\n\t\tif t.pos < len(t.line) {\n\t\t\tt.pos++\n\t\t\tt.eraseNPreviousChars(1)\n\t\t}\n\tcase keyCtrlU:\n\t\tt.eraseNPreviousChars(t.pos)\n\tcase keyClearScreen:\n\t\t// Erases the screen and moves the cursor to the home position.\n\t\tt.queue([]rune(\"\\x1b[2J\\x1b[H\"))\n\t\tt.queue(t.prompt)\n\t\tt.cursorX, t.cursorY = 0, 0\n\t\tt.advanceCursor(visualLength(t.prompt))\n\t\tt.setLine(t.line, t.pos)\n\tdefault:\n\t\tif t.AutoCompleteCallback != nil {\n\t\t\tprefix := string(t.line[:t.pos])\n\t\t\tsuffix := string(t.line[t.pos:])\n\n\t\t\tt.lock.Unlock()\n\t\t\tnewLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key)\n\t\t\tt.lock.Lock()\n\n\t\t\tif completeOk {\n\t\t\t\tt.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos]))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif !isPrintable(key) {\n\t\t\treturn\n\t\t}\n\t\tif len(t.line) == maxLineLength {\n\t\t\treturn\n\t\t}\n\t\tt.addKeyToLine(key)\n\t}\n\treturn\n}\n\n// addKeyToLine inserts the given key at the current position in the current\n// line.\nfunc (t *Terminal) addKeyToLine(key rune) {\n\tif len(t.line) == cap(t.line) {\n\t\tnewLine := make([]rune, len(t.line), 2*(1+len(t.line)))\n\t\tcopy(newLine, t.line)\n\t\tt.line = newLine\n\t}\n\tt.line = t.line[:len(t.line)+1]\n\tcopy(t.line[t.pos+1:], t.line[t.pos:])\n\tt.line[t.pos] = key\n\tif t.echo {\n\t\tt.writeLine(t.line[t.pos:])\n\t}\n\tt.pos++\n\tt.moveCursorToPos(t.pos)\n}\n\nfunc (t *Terminal) writeLine(line []rune) {\n\tfor len(line) != 0 {\n\t\tremainingOnLine := t.termWidth - t.cursorX\n\t\ttodo := len(line)\n\t\tif todo > remainingOnLine {\n\t\t\ttodo = remainingOnLine\n\t\t}\n\t\tt.queue(line[:todo])\n\t\tt.advanceCursor(visualLength(line[:todo]))\n\t\tline = line[todo:]\n\t}\n}\n\n// writeWithCRLF writes buf to w but replaces all occurrences of \\n with \\r\\n.\nfunc writeWithCRLF(w io.Writer, buf []byte) (n int, err error) {\n\tfor len(buf) > 0 {\n\t\ti := bytes.IndexByte(buf, '\\n')\n\t\ttodo := len(buf)\n\t\tif i >= 0 {\n\t\t\ttodo = i\n\t\t}\n\n\t\tvar nn int\n\t\tnn, err = w.Write(buf[:todo])\n\t\tn += nn\n\t\tif err != nil {\n\t\t\treturn n, err\n\t\t}\n\t\tbuf = buf[todo:]\n\n\t\tif i >= 0 {\n\t\t\tif _, err = w.Write(crlf); err != nil {\n\t\t\t\treturn n, err\n\t\t\t}\n\t\t\tn += 1\n\t\t\tbuf = buf[1:]\n\t\t}\n\t}\n\n\treturn n, nil\n}\n\nfunc (t *Terminal) Write(buf []byte) (n int, err error) {\n\tt.lock.Lock()\n\tdefer t.lock.Unlock()\n\n\tif t.cursorX == 0 && t.cursorY == 0 {\n\t\t// This is the easy case: there's nothing on the screen that we\n\t\t// have to move out of the way.\n\t\treturn writeWithCRLF(t.c, buf)\n\t}\n\n\t// We have a prompt and possibly user input on the screen. We\n\t// have to clear it first.\n\tt.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)\n\tt.cursorX = 0\n\tt.clearLineToRight()\n\n\tfor t.cursorY > 0 {\n\t\tt.move(1 /* up */, 0, 0, 0)\n\t\tt.cursorY--\n\t\tt.clearLineToRight()\n\t}\n\n\tif _, err = t.c.Write(t.outBuf); err != nil {\n\t\treturn\n\t}\n\tt.outBuf = t.outBuf[:0]\n\n\tif n, err = writeWithCRLF(t.c, buf); err != nil {\n\t\treturn\n\t}\n\n\tt.writeLine(t.prompt)\n\tif t.echo {\n\t\tt.writeLine(t.line)\n\t}\n\n\tt.moveCursorToPos(t.pos)\n\n\tif _, err = t.c.Write(t.outBuf); err != nil {\n\t\treturn\n\t}\n\tt.outBuf = t.outBuf[:0]\n\treturn\n}\n\n// ReadPassword temporarily changes the prompt and reads a password, without\n// echo, from the terminal.\nfunc (t *Terminal) ReadPassword(prompt string) (line string, err error) {\n\tt.lock.Lock()\n\tdefer t.lock.Unlock()\n\n\toldPrompt := t.prompt\n\tt.prompt = []rune(prompt)\n\tt.echo = false\n\n\tline, err = t.readLine()\n\n\tt.prompt = oldPrompt\n\tt.echo = true\n\n\treturn\n}\n\n// ReadLine returns a line of input from the terminal.\nfunc (t *Terminal) ReadLine() (line string, err error) {\n\tt.lock.Lock()\n\tdefer t.lock.Unlock()\n\n\treturn t.readLine()\n}\n\nfunc (t *Terminal) readLine() (line string, err error) {\n\t// t.lock must be held at this point\n\n\tif t.cursorX == 0 && t.cursorY == 0 {\n\t\tt.writeLine(t.prompt)\n\t\tt.c.Write(t.outBuf)\n\t\tt.outBuf = t.outBuf[:0]\n\t}\n\n\tlineIsPasted := t.pasteActive\n\n\tfor {\n\t\trest := t.remainder\n\t\tlineOk := false\n\t\tfor !lineOk {\n\t\t\tvar key rune\n\t\t\tkey, rest = bytesToKey(rest, t.pasteActive)\n\t\t\tif key == utf8.RuneError {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif !t.pasteActive {\n\t\t\t\tif key == keyCtrlD {\n\t\t\t\t\tif len(t.line) == 0 {\n\t\t\t\t\t\treturn \"\", io.EOF\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif key == keyPasteStart {\n\t\t\t\t\tt.pasteActive = true\n\t\t\t\t\tif len(t.line) == 0 {\n\t\t\t\t\t\tlineIsPasted = true\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t} else if key == keyPasteEnd {\n\t\t\t\tt.pasteActive = false\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif !t.pasteActive {\n\t\t\t\tlineIsPasted = false\n\t\t\t}\n\t\t\tline, lineOk = t.handleKey(key)\n\t\t}\n\t\tif len(rest) > 0 {\n\t\t\tn := copy(t.inBuf[:], rest)\n\t\t\tt.remainder = t.inBuf[:n]\n\t\t} else {\n\t\t\tt.remainder = nil\n\t\t}\n\t\tt.c.Write(t.outBuf)\n\t\tt.outBuf = t.outBuf[:0]\n\t\tif lineOk {\n\t\t\tif t.echo {\n\t\t\t\tt.historyIndex = -1\n\t\t\t\tt.history.Add(line)\n\t\t\t}\n\t\t\tif lineIsPasted {\n\t\t\t\terr = ErrPasteIndicator\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// t.remainder is a slice at the beginning of t.inBuf\n\t\t// containing a partial key sequence\n\t\treadBuf := t.inBuf[len(t.remainder):]\n\t\tvar n int\n\n\t\tt.lock.Unlock()\n\t\tn, err = t.c.Read(readBuf)\n\t\tt.lock.Lock()\n\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\n\t\tt.remainder = t.inBuf[:n+len(t.remainder)]\n\t}\n}\n\n// SetPrompt sets the prompt to be used when reading subsequent lines.\nfunc (t *Terminal) SetPrompt(prompt string) {\n\tt.lock.Lock()\n\tdefer t.lock.Unlock()\n\n\tt.prompt = []rune(prompt)\n}\n\nfunc (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {\n\t// Move cursor to column zero at the start of the line.\n\tt.move(t.cursorY, 0, t.cursorX, 0)\n\tt.cursorX, t.cursorY = 0, 0\n\tt.clearLineToRight()\n\tfor t.cursorY < numPrevLines {\n\t\t// Move down a line\n\t\tt.move(0, 1, 0, 0)\n\t\tt.cursorY++\n\t\tt.clearLineToRight()\n\t}\n\t// Move back to beginning.\n\tt.move(t.cursorY, 0, 0, 0)\n\tt.cursorX, t.cursorY = 0, 0\n\n\tt.queue(t.prompt)\n\tt.advanceCursor(visualLength(t.prompt))\n\tt.writeLine(t.line)\n\tt.moveCursorToPos(t.pos)\n}\n\nfunc (t *Terminal) SetSize(width, height int) error {\n\tt.lock.Lock()\n\tdefer t.lock.Unlock()\n\n\tif width == 0 {\n\t\twidth = 1\n\t}\n\n\toldWidth := t.termWidth\n\tt.termWidth, t.termHeight = width, height\n\n\tswitch {\n\tcase width == oldWidth:\n\t\t// If the width didn't change then nothing else needs to be\n\t\t// done.\n\t\treturn nil\n\tcase len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0:\n\t\t// If there is nothing on current line and no prompt printed,\n\t\t// just do nothing\n\t\treturn nil\n\tcase width < oldWidth:\n\t\t// Some terminals (e.g. xterm) will truncate lines that were\n\t\t// too long when shinking. Others, (e.g. gnome-terminal) will\n\t\t// attempt to wrap them. For the former, repainting t.maxLine\n\t\t// works great, but that behaviour goes badly wrong in the case\n\t\t// of the latter because they have doubled every full line.\n\n\t\t// We assume that we are working on a terminal that wraps lines\n\t\t// and adjust the cursor position based on every previous line\n\t\t// wrapping and turning into two. This causes the prompt on\n\t\t// xterms to move upwards, which isn't great, but it avoids a\n\t\t// huge mess with gnome-terminal.\n\t\tif t.cursorX >= t.termWidth {\n\t\t\tt.cursorX = t.termWidth - 1\n\t\t}\n\t\tt.cursorY *= 2\n\t\tt.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)\n\tcase width > oldWidth:\n\t\t// If the terminal expands then our position calculations will\n\t\t// be wrong in the future because we think the cursor is\n\t\t// |t.pos| chars into the string, but there will be a gap at\n\t\t// the end of any wrapped line.\n\t\t//\n\t\t// But the position will actually be correct until we move, so\n\t\t// we can move back to the beginning and repaint everything.\n\t\tt.clearAndRepaintLinePlusNPrevious(t.maxLine)\n\t}\n\n\t_, err := t.c.Write(t.outBuf)\n\tt.outBuf = t.outBuf[:0]\n\treturn err\n}\n\ntype pasteIndicatorError struct{}\n\nfunc (pasteIndicatorError) Error() string {\n\treturn \"terminal: ErrPasteIndicator not correctly handled\"\n}\n\n// ErrPasteIndicator may be returned from ReadLine as the error, in addition\n// to valid line data. It indicates that bracketed paste mode is enabled and\n// that the returned line consists only of pasted data. Programs may wish to\n// interpret pasted data more literally than typed data.\nvar ErrPasteIndicator = pasteIndicatorError{}\n\n// SetBracketedPasteMode requests that the terminal bracket paste operations\n// with markers. Not all terminals support this but, if it is supported, then\n// enabling this mode will stop any autocomplete callback from running due to\n// pastes. Additionally, any lines that are completely pasted will be returned\n// from ReadLine with the error set to ErrPasteIndicator.\nfunc (t *Terminal) SetBracketedPasteMode(on bool) {\n\tif on {\n\t\tio.WriteString(t.c, \"\\x1b[?2004h\")\n\t} else {\n\t\tio.WriteString(t.c, \"\\x1b[?2004l\")\n\t}\n}\n\n// stRingBuffer is a ring buffer of strings.\ntype stRingBuffer struct {\n\t// entries contains max elements.\n\tentries []string\n\tmax     int\n\t// head contains the index of the element most recently added to the ring.\n\thead int\n\t// size contains the number of elements in the ring.\n\tsize int\n}\n\nfunc (s *stRingBuffer) Add(a string) {\n\tif s.entries == nil {\n\t\tconst defaultNumEntries = 100\n\t\ts.entries = make([]string, defaultNumEntries)\n\t\ts.max = defaultNumEntries\n\t}\n\n\ts.head = (s.head + 1) % s.max\n\ts.entries[s.head] = a\n\tif s.size < s.max {\n\t\ts.size++\n\t}\n}\n\n// NthPreviousEntry returns the value passed to the nth previous call to Add.\n// If n is zero then the immediately prior value is returned, if one, then the\n// next most recent, and so on. If such an element doesn't exist then ok is\n// false.\nfunc (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {\n\tif n >= s.size {\n\t\treturn \"\", false\n\t}\n\tindex := s.head - n\n\tif index < 0 {\n\t\tindex += s.max\n\t}\n\treturn s.entries[index], true\n}\n\n// readPasswordLine reads from reader until it finds \\n or io.EOF.\n// The slice returned does not include the \\n.\n// readPasswordLine also ignores any \\r it finds.\nfunc readPasswordLine(reader io.Reader) ([]byte, error) {\n\tvar buf [1]byte\n\tvar ret []byte\n\n\tfor {\n\t\tn, err := reader.Read(buf[:])\n\t\tif n > 0 {\n\t\t\tswitch buf[0] {\n\t\t\tcase '\\n':\n\t\t\t\treturn ret, nil\n\t\t\tcase '\\r':\n\t\t\t\t// remove \\r from passwords on Windows\n\t\t\tdefault:\n\t\t\t\tret = append(ret, buf[0])\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif err != nil {\n\t\t\tif err == io.EOF && len(ret) > 0 {\n\t\t\t\treturn ret, nil\n\t\t\t}\n\t\t\treturn ret, err\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/terminal/util.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd\n\n// Package terminal provides support functions for dealing with terminals, as\n// commonly found on UNIX systems.\n//\n// Putting a terminal into raw mode is the most common requirement:\n//\n// \toldState, err := terminal.MakeRaw(0)\n// \tif err != nil {\n// \t        panic(err)\n// \t}\n// \tdefer terminal.Restore(0, oldState)\npackage terminal // import \"golang.org/x/crypto/ssh/terminal\"\n\nimport (\n\t\"golang.org/x/sys/unix\"\n)\n\n// State contains the state of a terminal.\ntype State struct {\n\ttermios unix.Termios\n}\n\n// IsTerminal returns true if the given file descriptor is a terminal.\nfunc IsTerminal(fd int) bool {\n\t_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)\n\treturn err == nil\n}\n\n// MakeRaw put the terminal connected to the given file descriptor into raw\n// mode and returns the previous state of the terminal so that it can be\n// restored.\nfunc MakeRaw(fd int) (*State, error) {\n\ttermios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\toldState := State{termios: *termios}\n\n\t// This attempts to replicate the behaviour documented for cfmakeraw in\n\t// the termios(3) manpage.\n\ttermios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON\n\ttermios.Oflag &^= unix.OPOST\n\ttermios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN\n\ttermios.Cflag &^= unix.CSIZE | unix.PARENB\n\ttermios.Cflag |= unix.CS8\n\ttermios.Cc[unix.VMIN] = 1\n\ttermios.Cc[unix.VTIME] = 0\n\tif err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &oldState, nil\n}\n\n// GetState returns the current state of a terminal which may be useful to\n// restore the terminal after a signal.\nfunc GetState(fd int) (*State, error) {\n\ttermios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &State{termios: *termios}, nil\n}\n\n// Restore restores the terminal connected to the given file descriptor to a\n// previous state.\nfunc Restore(fd int, state *State) error {\n\treturn unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios)\n}\n\n// GetSize returns the dimensions of the given terminal.\nfunc GetSize(fd int) (width, height int, err error) {\n\tws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)\n\tif err != nil {\n\t\treturn -1, -1, err\n\t}\n\treturn int(ws.Col), int(ws.Row), nil\n}\n\n// passwordReader is an io.Reader that reads from a specific file descriptor.\ntype passwordReader int\n\nfunc (r passwordReader) Read(buf []byte) (int, error) {\n\treturn unix.Read(int(r), buf)\n}\n\n// ReadPassword reads a line of input from a terminal without local echo.  This\n// is commonly used for inputting passwords and other sensitive data. The slice\n// returned does not include the \\n.\nfunc ReadPassword(fd int) ([]byte, error) {\n\ttermios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnewState := *termios\n\tnewState.Lflag &^= unix.ECHO\n\tnewState.Lflag |= unix.ICANON | unix.ISIG\n\tnewState.Iflag |= unix.ICRNL\n\tif err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefer func() {\n\t\tunix.IoctlSetTermios(fd, ioctlWriteTermios, termios)\n\t}()\n\n\treturn readPasswordLine(passwordReader(fd))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd netbsd openbsd\n\npackage terminal\n\nimport \"golang.org/x/sys/unix\"\n\nconst ioctlReadTermios = unix.TIOCGETA\nconst ioctlWriteTermios = unix.TIOCSETA\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/terminal/util_linux.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage terminal\n\nimport \"golang.org/x/sys/unix\"\n\nconst ioctlReadTermios = unix.TCGETS\nconst ioctlWriteTermios = unix.TCSETS\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package terminal provides support functions for dealing with terminals, as\n// commonly found on UNIX systems.\n//\n// Putting a terminal into raw mode is the most common requirement:\n//\n// \toldState, err := terminal.MakeRaw(0)\n// \tif err != nil {\n// \t        panic(err)\n// \t}\n// \tdefer terminal.Restore(0, oldState)\npackage terminal\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n)\n\ntype State struct{}\n\n// IsTerminal returns true if the given file descriptor is a terminal.\nfunc IsTerminal(fd int) bool {\n\treturn false\n}\n\n// MakeRaw put the terminal connected to the given file descriptor into raw\n// mode and returns the previous state of the terminal so that it can be\n// restored.\nfunc MakeRaw(fd int) (*State, error) {\n\treturn nil, fmt.Errorf(\"terminal: MakeRaw not implemented on %s/%s\", runtime.GOOS, runtime.GOARCH)\n}\n\n// GetState returns the current state of a terminal which may be useful to\n// restore the terminal after a signal.\nfunc GetState(fd int) (*State, error) {\n\treturn nil, fmt.Errorf(\"terminal: GetState not implemented on %s/%s\", runtime.GOOS, runtime.GOARCH)\n}\n\n// Restore restores the terminal connected to the given file descriptor to a\n// previous state.\nfunc Restore(fd int, state *State) error {\n\treturn fmt.Errorf(\"terminal: Restore not implemented on %s/%s\", runtime.GOOS, runtime.GOARCH)\n}\n\n// GetSize returns the dimensions of the given terminal.\nfunc GetSize(fd int) (width, height int, err error) {\n\treturn 0, 0, fmt.Errorf(\"terminal: GetSize not implemented on %s/%s\", runtime.GOOS, runtime.GOARCH)\n}\n\n// ReadPassword reads a line of input from a terminal without local echo.  This\n// is commonly used for inputting passwords and other sensitive data. The slice\n// returned does not include the \\n.\nfunc ReadPassword(fd int) ([]byte, error) {\n\treturn nil, fmt.Errorf(\"terminal: ReadPassword not implemented on %s/%s\", runtime.GOOS, runtime.GOARCH)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build solaris\n\npackage terminal // import \"golang.org/x/crypto/ssh/terminal\"\n\nimport (\n\t\"golang.org/x/sys/unix\"\n\t\"io\"\n\t\"syscall\"\n)\n\n// State contains the state of a terminal.\ntype State struct {\n\tstate *unix.Termios\n}\n\n// IsTerminal returns true if the given file descriptor is a terminal.\nfunc IsTerminal(fd int) bool {\n\t_, err := unix.IoctlGetTermio(fd, unix.TCGETA)\n\treturn err == nil\n}\n\n// ReadPassword reads a line of input from a terminal without local echo.  This\n// is commonly used for inputting passwords and other sensitive data. The slice\n// returned does not include the \\n.\nfunc ReadPassword(fd int) ([]byte, error) {\n\t// see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c\n\tval, err := unix.IoctlGetTermios(fd, unix.TCGETS)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\toldState := *val\n\n\tnewState := oldState\n\tnewState.Lflag &^= syscall.ECHO\n\tnewState.Lflag |= syscall.ICANON | syscall.ISIG\n\tnewState.Iflag |= syscall.ICRNL\n\terr = unix.IoctlSetTermios(fd, unix.TCSETS, &newState)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState)\n\n\tvar buf [16]byte\n\tvar ret []byte\n\tfor {\n\t\tn, err := syscall.Read(fd, buf[:])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif n == 0 {\n\t\t\tif len(ret) == 0 {\n\t\t\t\treturn nil, io.EOF\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tif buf[n-1] == '\\n' {\n\t\t\tn--\n\t\t}\n\t\tret = append(ret, buf[:n]...)\n\t\tif n < len(buf) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn ret, nil\n}\n\n// MakeRaw puts the terminal connected to the given file descriptor into raw\n// mode and returns the previous state of the terminal so that it can be\n// restored.\n// see http://cr.illumos.org/~webrev/andy_js/1060/\nfunc MakeRaw(fd int) (*State, error) {\n\toldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\toldTermios := *oldTermiosPtr\n\n\tnewTermios := oldTermios\n\tnewTermios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON\n\tnewTermios.Oflag &^= syscall.OPOST\n\tnewTermios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN\n\tnewTermios.Cflag &^= syscall.CSIZE | syscall.PARENB\n\tnewTermios.Cflag |= syscall.CS8\n\tnewTermios.Cc[unix.VMIN] = 1\n\tnewTermios.Cc[unix.VTIME] = 0\n\n\tif err := unix.IoctlSetTermios(fd, unix.TCSETS, &newTermios); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &State{\n\t\tstate: oldTermiosPtr,\n\t}, nil\n}\n\n// Restore restores the terminal connected to the given file descriptor to a\n// previous state.\nfunc Restore(fd int, oldState *State) error {\n\treturn unix.IoctlSetTermios(fd, unix.TCSETS, oldState.state)\n}\n\n// GetState returns the current state of a terminal which may be useful to\n// restore the terminal after a signal.\nfunc GetState(fd int) (*State, error) {\n\toldTermiosPtr, err := unix.IoctlGetTermios(fd, unix.TCGETS)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &State{\n\t\tstate: oldTermiosPtr,\n\t}, nil\n}\n\n// GetSize returns the dimensions of the given terminal.\nfunc GetSize(fd int) (width, height int, err error) {\n\tws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\treturn int(ws.Col), int(ws.Row), nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/terminal/util_windows.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows\n\n// Package terminal provides support functions for dealing with terminals, as\n// commonly found on UNIX systems.\n//\n// Putting a terminal into raw mode is the most common requirement:\n//\n// \toldState, err := terminal.MakeRaw(0)\n// \tif err != nil {\n// \t        panic(err)\n// \t}\n// \tdefer terminal.Restore(0, oldState)\npackage terminal\n\nimport (\n\t\"golang.org/x/sys/windows\"\n)\n\ntype State struct {\n\tmode uint32\n}\n\n// IsTerminal returns true if the given file descriptor is a terminal.\nfunc IsTerminal(fd int) bool {\n\tvar st uint32\n\terr := windows.GetConsoleMode(windows.Handle(fd), &st)\n\treturn err == nil\n}\n\n// MakeRaw put the terminal connected to the given file descriptor into raw\n// mode and returns the previous state of the terminal so that it can be\n// restored.\nfunc MakeRaw(fd int) (*State, error) {\n\tvar st uint32\n\tif err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {\n\t\treturn nil, err\n\t}\n\traw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)\n\tif err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &State{st}, nil\n}\n\n// GetState returns the current state of a terminal which may be useful to\n// restore the terminal after a signal.\nfunc GetState(fd int) (*State, error) {\n\tvar st uint32\n\tif err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {\n\t\treturn nil, err\n\t}\n\treturn &State{st}, nil\n}\n\n// Restore restores the terminal connected to the given file descriptor to a\n// previous state.\nfunc Restore(fd int, state *State) error {\n\treturn windows.SetConsoleMode(windows.Handle(fd), state.mode)\n}\n\n// GetSize returns the dimensions of the given terminal.\nfunc GetSize(fd int) (width, height int, err error) {\n\tvar info windows.ConsoleScreenBufferInfo\n\tif err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil {\n\t\treturn 0, 0, err\n\t}\n\treturn int(info.Size.X), int(info.Size.Y), nil\n}\n\n// passwordReader is an io.Reader that reads from a specific Windows HANDLE.\ntype passwordReader int\n\nfunc (r passwordReader) Read(buf []byte) (int, error) {\n\treturn windows.Read(windows.Handle(r), buf)\n}\n\n// ReadPassword reads a line of input from a terminal without local echo.  This\n// is commonly used for inputting passwords and other sensitive data. The slice\n// returned does not include the \\n.\nfunc ReadPassword(fd int) ([]byte, error) {\n\tvar st uint32\n\tif err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {\n\t\treturn nil, err\n\t}\n\told := st\n\n\tst &^= (windows.ENABLE_ECHO_INPUT)\n\tst |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)\n\tif err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil {\n\t\treturn nil, err\n\t}\n\n\tdefer func() {\n\t\twindows.SetConsoleMode(windows.Handle(fd), old)\n\t}()\n\n\treturn readPasswordLine(passwordReader(fd))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/crypto/ssh/transport.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage ssh\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"io\"\n\t\"log\"\n)\n\n// debugTransport if set, will print packet types as they go over the\n// wire. No message decoding is done, to minimize the impact on timing.\nconst debugTransport = false\n\nconst (\n\tgcmCipherID    = \"aes128-gcm@openssh.com\"\n\taes128cbcID    = \"aes128-cbc\"\n\ttripledescbcID = \"3des-cbc\"\n)\n\n// packetConn represents a transport that implements packet based\n// operations.\ntype packetConn interface {\n\t// Encrypt and send a packet of data to the remote peer.\n\twritePacket(packet []byte) error\n\n\t// Read a packet from the connection. The read is blocking,\n\t// i.e. if error is nil, then the returned byte slice is\n\t// always non-empty.\n\treadPacket() ([]byte, error)\n\n\t// Close closes the write-side of the connection.\n\tClose() error\n}\n\n// transport is the keyingTransport that implements the SSH packet\n// protocol.\ntype transport struct {\n\treader connectionState\n\twriter connectionState\n\n\tbufReader *bufio.Reader\n\tbufWriter *bufio.Writer\n\trand      io.Reader\n\tisClient  bool\n\tio.Closer\n}\n\n// packetCipher represents a combination of SSH encryption/MAC\n// protocol.  A single instance should be used for one direction only.\ntype packetCipher interface {\n\t// writePacket encrypts the packet and writes it to w. The\n\t// contents of the packet are generally scrambled.\n\twritePacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error\n\n\t// readPacket reads and decrypts a packet of data. The\n\t// returned packet may be overwritten by future calls of\n\t// readPacket.\n\treadPacket(seqnum uint32, r io.Reader) ([]byte, error)\n}\n\n// connectionState represents one side (read or write) of the\n// connection. This is necessary because each direction has its own\n// keys, and can even have its own algorithms\ntype connectionState struct {\n\tpacketCipher\n\tseqNum           uint32\n\tdir              direction\n\tpendingKeyChange chan packetCipher\n}\n\n// prepareKeyChange sets up key material for a keychange. The key changes in\n// both directions are triggered by reading and writing a msgNewKey packet\n// respectively.\nfunc (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error {\n\tif ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult); err != nil {\n\t\treturn err\n\t} else {\n\t\tt.reader.pendingKeyChange <- ciph\n\t}\n\n\tif ciph, err := newPacketCipher(t.writer.dir, algs.w, kexResult); err != nil {\n\t\treturn err\n\t} else {\n\t\tt.writer.pendingKeyChange <- ciph\n\t}\n\n\treturn nil\n}\n\nfunc (t *transport) printPacket(p []byte, write bool) {\n\tif len(p) == 0 {\n\t\treturn\n\t}\n\twho := \"server\"\n\tif t.isClient {\n\t\twho = \"client\"\n\t}\n\twhat := \"read\"\n\tif write {\n\t\twhat = \"write\"\n\t}\n\n\tlog.Println(what, who, p[0])\n}\n\n// Read and decrypt next packet.\nfunc (t *transport) readPacket() (p []byte, err error) {\n\tfor {\n\t\tp, err = t.reader.readPacket(t.bufReader)\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\t\tif len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) {\n\t\t\tbreak\n\t\t}\n\t}\n\tif debugTransport {\n\t\tt.printPacket(p, false)\n\t}\n\n\treturn p, err\n}\n\nfunc (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) {\n\tpacket, err := s.packetCipher.readPacket(s.seqNum, r)\n\ts.seqNum++\n\tif err == nil && len(packet) == 0 {\n\t\terr = errors.New(\"ssh: zero length packet\")\n\t}\n\n\tif len(packet) > 0 {\n\t\tswitch packet[0] {\n\t\tcase msgNewKeys:\n\t\t\tselect {\n\t\t\tcase cipher := <-s.pendingKeyChange:\n\t\t\t\ts.packetCipher = cipher\n\t\t\tdefault:\n\t\t\t\treturn nil, errors.New(\"ssh: got bogus newkeys message.\")\n\t\t\t}\n\n\t\tcase msgDisconnect:\n\t\t\t// Transform a disconnect message into an\n\t\t\t// error. Since this is lowest level at which\n\t\t\t// we interpret message types, doing it here\n\t\t\t// ensures that we don't have to handle it\n\t\t\t// elsewhere.\n\t\t\tvar msg disconnectMsg\n\t\t\tif err := Unmarshal(packet, &msg); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn nil, &msg\n\t\t}\n\t}\n\n\t// The packet may point to an internal buffer, so copy the\n\t// packet out here.\n\tfresh := make([]byte, len(packet))\n\tcopy(fresh, packet)\n\n\treturn fresh, err\n}\n\nfunc (t *transport) writePacket(packet []byte) error {\n\tif debugTransport {\n\t\tt.printPacket(packet, true)\n\t}\n\treturn t.writer.writePacket(t.bufWriter, t.rand, packet)\n}\n\nfunc (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error {\n\tchangeKeys := len(packet) > 0 && packet[0] == msgNewKeys\n\n\terr := s.packetCipher.writePacket(s.seqNum, w, rand, packet)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = w.Flush(); err != nil {\n\t\treturn err\n\t}\n\ts.seqNum++\n\tif changeKeys {\n\t\tselect {\n\t\tcase cipher := <-s.pendingKeyChange:\n\t\t\ts.packetCipher = cipher\n\t\tdefault:\n\t\t\tpanic(\"ssh: no key material for msgNewKeys\")\n\t\t}\n\t}\n\treturn err\n}\n\nfunc newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport {\n\tt := &transport{\n\t\tbufReader: bufio.NewReader(rwc),\n\t\tbufWriter: bufio.NewWriter(rwc),\n\t\trand:      rand,\n\t\treader: connectionState{\n\t\t\tpacketCipher:     &streamPacketCipher{cipher: noneCipher{}},\n\t\t\tpendingKeyChange: make(chan packetCipher, 1),\n\t\t},\n\t\twriter: connectionState{\n\t\t\tpacketCipher:     &streamPacketCipher{cipher: noneCipher{}},\n\t\t\tpendingKeyChange: make(chan packetCipher, 1),\n\t\t},\n\t\tCloser: rwc,\n\t}\n\tt.isClient = isClient\n\n\tif isClient {\n\t\tt.reader.dir = serverKeys\n\t\tt.writer.dir = clientKeys\n\t} else {\n\t\tt.reader.dir = clientKeys\n\t\tt.writer.dir = serverKeys\n\t}\n\n\treturn t\n}\n\ntype direction struct {\n\tivTag     []byte\n\tkeyTag    []byte\n\tmacKeyTag []byte\n}\n\nvar (\n\tserverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}}\n\tclientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}}\n)\n\n// generateKeys generates key material for IV, MAC and encryption.\nfunc generateKeys(d direction, algs directionAlgorithms, kex *kexResult) (iv, key, macKey []byte) {\n\tcipherMode := cipherModes[algs.Cipher]\n\tmacMode := macModes[algs.MAC]\n\n\tiv = make([]byte, cipherMode.ivSize)\n\tkey = make([]byte, cipherMode.keySize)\n\tmacKey = make([]byte, macMode.keySize)\n\n\tgenerateKeyMaterial(iv, d.ivTag, kex)\n\tgenerateKeyMaterial(key, d.keyTag, kex)\n\tgenerateKeyMaterial(macKey, d.macKeyTag, kex)\n\treturn\n}\n\n// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as\n// described in RFC 4253, section 6.4. direction should either be serverKeys\n// (to setup server->client keys) or clientKeys (for client->server keys).\nfunc newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) {\n\tiv, key, macKey := generateKeys(d, algs, kex)\n\n\tif algs.Cipher == gcmCipherID {\n\t\treturn newGCMCipher(iv, key)\n\t}\n\n\tif algs.Cipher == aes128cbcID {\n\t\treturn newAESCBCCipher(iv, key, macKey, algs)\n\t}\n\n\tif algs.Cipher == tripledescbcID {\n\t\treturn newTripleDESCBCCipher(iv, key, macKey, algs)\n\t}\n\n\tc := &streamPacketCipher{\n\t\tmac: macModes[algs.MAC].new(macKey),\n\t\tetm: macModes[algs.MAC].etm,\n\t}\n\tc.macResult = make([]byte, c.mac.Size())\n\n\tvar err error\n\tc.cipher, err = cipherModes[algs.Cipher].createStream(key, iv)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn c, nil\n}\n\n// generateKeyMaterial fills out with key material generated from tag, K, H\n// and sessionId, as specified in RFC 4253, section 7.2.\nfunc generateKeyMaterial(out, tag []byte, r *kexResult) {\n\tvar digestsSoFar []byte\n\n\th := r.Hash.New()\n\tfor len(out) > 0 {\n\t\th.Reset()\n\t\th.Write(r.K)\n\t\th.Write(r.H)\n\n\t\tif len(digestsSoFar) == 0 {\n\t\t\th.Write(tag)\n\t\t\th.Write(r.SessionID)\n\t\t} else {\n\t\t\th.Write(digestsSoFar)\n\t\t}\n\n\t\tdigest := h.Sum(nil)\n\t\tn := copy(out, digest)\n\t\tout = out[n:]\n\t\tif len(out) > 0 {\n\t\t\tdigestsSoFar = append(digestsSoFar, digest...)\n\t\t}\n\t}\n}\n\nconst packageVersion = \"SSH-2.0-Go\"\n\n// Sends and receives a version line.  The versionLine string should\n// be US ASCII, start with \"SSH-2.0-\", and should not include a\n// newline. exchangeVersions returns the other side's version line.\nfunc exchangeVersions(rw io.ReadWriter, versionLine []byte) (them []byte, err error) {\n\t// Contrary to the RFC, we do not ignore lines that don't\n\t// start with \"SSH-2.0-\" to make the library usable with\n\t// nonconforming servers.\n\tfor _, c := range versionLine {\n\t\t// The spec disallows non US-ASCII chars, and\n\t\t// specifically forbids null chars.\n\t\tif c < 32 {\n\t\t\treturn nil, errors.New(\"ssh: junk character in version line\")\n\t\t}\n\t}\n\tif _, err = rw.Write(append(versionLine, '\\r', '\\n')); err != nil {\n\t\treturn\n\t}\n\n\tthem, err = readVersion(rw)\n\treturn them, err\n}\n\n// maxVersionStringBytes is the maximum number of bytes that we'll\n// accept as a version string. RFC 4253 section 4.2 limits this at 255\n// chars\nconst maxVersionStringBytes = 255\n\n// Read version string as specified by RFC 4253, section 4.2.\nfunc readVersion(r io.Reader) ([]byte, error) {\n\tversionString := make([]byte, 0, 64)\n\tvar ok bool\n\tvar buf [1]byte\n\n\tfor len(versionString) < maxVersionStringBytes {\n\t\t_, err := io.ReadFull(r, buf[:])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// The RFC says that the version should be terminated with \\r\\n\n\t\t// but several SSH servers actually only send a \\n.\n\t\tif buf[0] == '\\n' {\n\t\t\tok = true\n\t\t\tbreak\n\t\t}\n\n\t\t// non ASCII chars are disallowed, but we are lenient,\n\t\t// since Go doesn't use null-terminated strings.\n\n\t\t// The RFC allows a comment after a space, however,\n\t\t// all of it (version and comments) goes into the\n\t\t// session hash.\n\t\tversionString = append(versionString, buf[0])\n\t}\n\n\tif !ok {\n\t\treturn nil, errors.New(\"ssh: overflow reading version string\")\n\t}\n\n\t// There might be a '\\r' on the end which we should remove.\n\tif len(versionString) > 0 && versionString[len(versionString)-1] == '\\r' {\n\t\tversionString = versionString[:len(versionString)-1]\n\t}\n\treturn versionString, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/.gitattributes",
    "content": "# Treat all files in this repo as binary, with no git magic updating\n# line endings. Windows users contributing to Go will need to use a\n# modern version of git and editors capable of LF line endings.\n#\n# We'll prevent accidental CRLF line endings from entering the repo\n# via the git-review gofmt checks.\n#\n# See golang.org/issue/9281\n\n* -text\n"
  },
  {
    "path": "vendor/golang.org/x/net/.gitignore",
    "content": "# Add no patterns to .hgignore except for files generated by the build.\nlast-change\n"
  },
  {
    "path": "vendor/golang.org/x/net/AUTHORS",
    "content": "# This source code refers to The Go Authors for copyright purposes.\n# The master list of authors is in the main Go distribution,\n# visible at http://tip.golang.org/AUTHORS.\n"
  },
  {
    "path": "vendor/golang.org/x/net/CONTRIBUTING.md",
    "content": "# Contributing to Go\n\nGo is an open source project.\n\nIt is the work of hundreds of contributors. We appreciate your help!\n\n\n## Filing issues\n\nWhen [filing an issue](https://golang.org/issue/new), make sure to answer these five questions:\n\n1. What version of Go are you using (`go version`)?\n2. What operating system and processor architecture are you using?\n3. What did you do?\n4. What did you expect to see?\n5. What did you see instead?\n\nGeneral questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.\nThe gophers there will answer or ask you to file an issue if you've tripped over a bug.\n\n## Contributing code\n\nPlease read the [Contribution Guidelines](https://golang.org/doc/contribute.html)\nbefore sending patches.\n\n**We do not accept GitHub pull requests**\n(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review).\n\nUnless otherwise noted, the Go source files are distributed under\nthe BSD-style license found in the LICENSE file.\n\n"
  },
  {
    "path": "vendor/golang.org/x/net/CONTRIBUTORS",
    "content": "# This source code was written by the Go contributors.\n# The master list of contributors is in the main Go distribution,\n# visible at http://tip.golang.org/CONTRIBUTORS.\n"
  },
  {
    "path": "vendor/golang.org/x/net/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/golang.org/x/net/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "vendor/golang.org/x/net/README",
    "content": "This repository holds supplementary Go networking libraries.\n\nTo submit changes to this repository, see http://golang.org/doc/contribute.html.\n"
  },
  {
    "path": "vendor/golang.org/x/net/codereview.cfg",
    "content": "issuerepo: golang/go\n"
  },
  {
    "path": "vendor/golang.org/x/net/context/context.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package context defines the Context type, which carries deadlines,\n// cancelation signals, and other request-scoped values across API boundaries\n// and between processes.\n//\n// Incoming requests to a server should create a Context, and outgoing calls to\n// servers should accept a Context. The chain of function calls between must\n// propagate the Context, optionally replacing it with a modified copy created\n// using WithDeadline, WithTimeout, WithCancel, or WithValue.\n//\n// Programs that use Contexts should follow these rules to keep interfaces\n// consistent across packages and enable static analysis tools to check context\n// propagation:\n//\n// Do not store Contexts inside a struct type; instead, pass a Context\n// explicitly to each function that needs it. The Context should be the first\n// parameter, typically named ctx:\n//\n// \tfunc DoSomething(ctx context.Context, arg Arg) error {\n// \t\t// ... use ctx ...\n// \t}\n//\n// Do not pass a nil Context, even if a function permits it. Pass context.TODO\n// if you are unsure about which Context to use.\n//\n// Use context Values only for request-scoped data that transits processes and\n// APIs, not for passing optional parameters to functions.\n//\n// The same Context may be passed to functions running in different goroutines;\n// Contexts are safe for simultaneous use by multiple goroutines.\n//\n// See http://blog.golang.org/context for example code for a server that uses\n// Contexts.\npackage context // import \"golang.org/x/net/context\"\n\nimport \"time\"\n\n// A Context carries a deadline, a cancelation signal, and other values across\n// API boundaries.\n//\n// Context's methods may be called by multiple goroutines simultaneously.\ntype Context interface {\n\t// Deadline returns the time when work done on behalf of this context\n\t// should be canceled. Deadline returns ok==false when no deadline is\n\t// set. Successive calls to Deadline return the same results.\n\tDeadline() (deadline time.Time, ok bool)\n\n\t// Done returns a channel that's closed when work done on behalf of this\n\t// context should be canceled. Done may return nil if this context can\n\t// never be canceled. Successive calls to Done return the same value.\n\t//\n\t// WithCancel arranges for Done to be closed when cancel is called;\n\t// WithDeadline arranges for Done to be closed when the deadline\n\t// expires; WithTimeout arranges for Done to be closed when the timeout\n\t// elapses.\n\t//\n\t// Done is provided for use in select statements:\n\t//\n\t//  // Stream generates values with DoSomething and sends them to out\n\t//  // until DoSomething returns an error or ctx.Done is closed.\n\t//  func Stream(ctx context.Context, out chan<- Value) error {\n\t//  \tfor {\n\t//  \t\tv, err := DoSomething(ctx)\n\t//  \t\tif err != nil {\n\t//  \t\t\treturn err\n\t//  \t\t}\n\t//  \t\tselect {\n\t//  \t\tcase <-ctx.Done():\n\t//  \t\t\treturn ctx.Err()\n\t//  \t\tcase out <- v:\n\t//  \t\t}\n\t//  \t}\n\t//  }\n\t//\n\t// See http://blog.golang.org/pipelines for more examples of how to use\n\t// a Done channel for cancelation.\n\tDone() <-chan struct{}\n\n\t// Err returns a non-nil error value after Done is closed. Err returns\n\t// Canceled if the context was canceled or DeadlineExceeded if the\n\t// context's deadline passed. No other values for Err are defined.\n\t// After Done is closed, successive calls to Err return the same value.\n\tErr() error\n\n\t// Value returns the value associated with this context for key, or nil\n\t// if no value is associated with key. Successive calls to Value with\n\t// the same key returns the same result.\n\t//\n\t// Use context values only for request-scoped data that transits\n\t// processes and API boundaries, not for passing optional parameters to\n\t// functions.\n\t//\n\t// A key identifies a specific value in a Context. Functions that wish\n\t// to store values in Context typically allocate a key in a global\n\t// variable then use that key as the argument to context.WithValue and\n\t// Context.Value. A key can be any type that supports equality;\n\t// packages should define keys as an unexported type to avoid\n\t// collisions.\n\t//\n\t// Packages that define a Context key should provide type-safe accessors\n\t// for the values stores using that key:\n\t//\n\t// \t// Package user defines a User type that's stored in Contexts.\n\t// \tpackage user\n\t//\n\t// \timport \"golang.org/x/net/context\"\n\t//\n\t// \t// User is the type of value stored in the Contexts.\n\t// \ttype User struct {...}\n\t//\n\t// \t// key is an unexported type for keys defined in this package.\n\t// \t// This prevents collisions with keys defined in other packages.\n\t// \ttype key int\n\t//\n\t// \t// userKey is the key for user.User values in Contexts. It is\n\t// \t// unexported; clients use user.NewContext and user.FromContext\n\t// \t// instead of using this key directly.\n\t// \tvar userKey key = 0\n\t//\n\t// \t// NewContext returns a new Context that carries value u.\n\t// \tfunc NewContext(ctx context.Context, u *User) context.Context {\n\t// \t\treturn context.WithValue(ctx, userKey, u)\n\t// \t}\n\t//\n\t// \t// FromContext returns the User value stored in ctx, if any.\n\t// \tfunc FromContext(ctx context.Context) (*User, bool) {\n\t// \t\tu, ok := ctx.Value(userKey).(*User)\n\t// \t\treturn u, ok\n\t// \t}\n\tValue(key interface{}) interface{}\n}\n\n// Background returns a non-nil, empty Context. It is never canceled, has no\n// values, and has no deadline. It is typically used by the main function,\n// initialization, and tests, and as the top-level Context for incoming\n// requests.\nfunc Background() Context {\n\treturn background\n}\n\n// TODO returns a non-nil, empty Context. Code should use context.TODO when\n// it's unclear which Context to use or it is not yet available (because the\n// surrounding function has not yet been extended to accept a Context\n// parameter).  TODO is recognized by static analysis tools that determine\n// whether Contexts are propagated correctly in a program.\nfunc TODO() Context {\n\treturn todo\n}\n\n// A CancelFunc tells an operation to abandon its work.\n// A CancelFunc does not wait for the work to stop.\n// After the first call, subsequent calls to a CancelFunc do nothing.\ntype CancelFunc func()\n"
  },
  {
    "path": "vendor/golang.org/x/net/context/go17.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build go1.7\n\npackage context\n\nimport (\n\t\"context\" // standard library's context, as of Go 1.7\n\t\"time\"\n)\n\nvar (\n\ttodo       = context.TODO()\n\tbackground = context.Background()\n)\n\n// Canceled is the error returned by Context.Err when the context is canceled.\nvar Canceled = context.Canceled\n\n// DeadlineExceeded is the error returned by Context.Err when the context's\n// deadline passes.\nvar DeadlineExceeded = context.DeadlineExceeded\n\n// WithCancel returns a copy of parent with a new Done channel. The returned\n// context's Done channel is closed when the returned cancel function is called\n// or when the parent context's Done channel is closed, whichever happens first.\n//\n// Canceling this context releases resources associated with it, so code should\n// call cancel as soon as the operations running in this Context complete.\nfunc WithCancel(parent Context) (ctx Context, cancel CancelFunc) {\n\tctx, f := context.WithCancel(parent)\n\treturn ctx, CancelFunc(f)\n}\n\n// WithDeadline returns a copy of the parent context with the deadline adjusted\n// to be no later than d. If the parent's deadline is already earlier than d,\n// WithDeadline(parent, d) is semantically equivalent to parent. The returned\n// context's Done channel is closed when the deadline expires, when the returned\n// cancel function is called, or when the parent context's Done channel is\n// closed, whichever happens first.\n//\n// Canceling this context releases resources associated with it, so code should\n// call cancel as soon as the operations running in this Context complete.\nfunc WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) {\n\tctx, f := context.WithDeadline(parent, deadline)\n\treturn ctx, CancelFunc(f)\n}\n\n// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).\n//\n// Canceling this context releases resources associated with it, so code should\n// call cancel as soon as the operations running in this Context complete:\n//\n// \tfunc slowOperationWithTimeout(ctx context.Context) (Result, error) {\n// \t\tctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)\n// \t\tdefer cancel()  // releases resources if slowOperation completes before timeout elapses\n// \t\treturn slowOperation(ctx)\n// \t}\nfunc WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {\n\treturn WithDeadline(parent, time.Now().Add(timeout))\n}\n\n// WithValue returns a copy of parent in which the value associated with key is\n// val.\n//\n// Use context Values only for request-scoped data that transits processes and\n// APIs, not for passing optional parameters to functions.\nfunc WithValue(parent Context, key interface{}, val interface{}) Context {\n\treturn context.WithValue(parent, key, val)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/context/pre_go17.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !go1.7\n\npackage context\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n)\n\n// An emptyCtx is never canceled, has no values, and has no deadline. It is not\n// struct{}, since vars of this type must have distinct addresses.\ntype emptyCtx int\n\nfunc (*emptyCtx) Deadline() (deadline time.Time, ok bool) {\n\treturn\n}\n\nfunc (*emptyCtx) Done() <-chan struct{} {\n\treturn nil\n}\n\nfunc (*emptyCtx) Err() error {\n\treturn nil\n}\n\nfunc (*emptyCtx) Value(key interface{}) interface{} {\n\treturn nil\n}\n\nfunc (e *emptyCtx) String() string {\n\tswitch e {\n\tcase background:\n\t\treturn \"context.Background\"\n\tcase todo:\n\t\treturn \"context.TODO\"\n\t}\n\treturn \"unknown empty Context\"\n}\n\nvar (\n\tbackground = new(emptyCtx)\n\ttodo       = new(emptyCtx)\n)\n\n// Canceled is the error returned by Context.Err when the context is canceled.\nvar Canceled = errors.New(\"context canceled\")\n\n// DeadlineExceeded is the error returned by Context.Err when the context's\n// deadline passes.\nvar DeadlineExceeded = errors.New(\"context deadline exceeded\")\n\n// WithCancel returns a copy of parent with a new Done channel. The returned\n// context's Done channel is closed when the returned cancel function is called\n// or when the parent context's Done channel is closed, whichever happens first.\n//\n// Canceling this context releases resources associated with it, so code should\n// call cancel as soon as the operations running in this Context complete.\nfunc WithCancel(parent Context) (ctx Context, cancel CancelFunc) {\n\tc := newCancelCtx(parent)\n\tpropagateCancel(parent, c)\n\treturn c, func() { c.cancel(true, Canceled) }\n}\n\n// newCancelCtx returns an initialized cancelCtx.\nfunc newCancelCtx(parent Context) *cancelCtx {\n\treturn &cancelCtx{\n\t\tContext: parent,\n\t\tdone:    make(chan struct{}),\n\t}\n}\n\n// propagateCancel arranges for child to be canceled when parent is.\nfunc propagateCancel(parent Context, child canceler) {\n\tif parent.Done() == nil {\n\t\treturn // parent is never canceled\n\t}\n\tif p, ok := parentCancelCtx(parent); ok {\n\t\tp.mu.Lock()\n\t\tif p.err != nil {\n\t\t\t// parent has already been canceled\n\t\t\tchild.cancel(false, p.err)\n\t\t} else {\n\t\t\tif p.children == nil {\n\t\t\t\tp.children = make(map[canceler]bool)\n\t\t\t}\n\t\t\tp.children[child] = true\n\t\t}\n\t\tp.mu.Unlock()\n\t} else {\n\t\tgo func() {\n\t\t\tselect {\n\t\t\tcase <-parent.Done():\n\t\t\t\tchild.cancel(false, parent.Err())\n\t\t\tcase <-child.Done():\n\t\t\t}\n\t\t}()\n\t}\n}\n\n// parentCancelCtx follows a chain of parent references until it finds a\n// *cancelCtx. This function understands how each of the concrete types in this\n// package represents its parent.\nfunc parentCancelCtx(parent Context) (*cancelCtx, bool) {\n\tfor {\n\t\tswitch c := parent.(type) {\n\t\tcase *cancelCtx:\n\t\t\treturn c, true\n\t\tcase *timerCtx:\n\t\t\treturn c.cancelCtx, true\n\t\tcase *valueCtx:\n\t\t\tparent = c.Context\n\t\tdefault:\n\t\t\treturn nil, false\n\t\t}\n\t}\n}\n\n// removeChild removes a context from its parent.\nfunc removeChild(parent Context, child canceler) {\n\tp, ok := parentCancelCtx(parent)\n\tif !ok {\n\t\treturn\n\t}\n\tp.mu.Lock()\n\tif p.children != nil {\n\t\tdelete(p.children, child)\n\t}\n\tp.mu.Unlock()\n}\n\n// A canceler is a context type that can be canceled directly. The\n// implementations are *cancelCtx and *timerCtx.\ntype canceler interface {\n\tcancel(removeFromParent bool, err error)\n\tDone() <-chan struct{}\n}\n\n// A cancelCtx can be canceled. When canceled, it also cancels any children\n// that implement canceler.\ntype cancelCtx struct {\n\tContext\n\n\tdone chan struct{} // closed by the first cancel call.\n\n\tmu       sync.Mutex\n\tchildren map[canceler]bool // set to nil by the first cancel call\n\terr      error             // set to non-nil by the first cancel call\n}\n\nfunc (c *cancelCtx) Done() <-chan struct{} {\n\treturn c.done\n}\n\nfunc (c *cancelCtx) Err() error {\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\treturn c.err\n}\n\nfunc (c *cancelCtx) String() string {\n\treturn fmt.Sprintf(\"%v.WithCancel\", c.Context)\n}\n\n// cancel closes c.done, cancels each of c's children, and, if\n// removeFromParent is true, removes c from its parent's children.\nfunc (c *cancelCtx) cancel(removeFromParent bool, err error) {\n\tif err == nil {\n\t\tpanic(\"context: internal error: missing cancel error\")\n\t}\n\tc.mu.Lock()\n\tif c.err != nil {\n\t\tc.mu.Unlock()\n\t\treturn // already canceled\n\t}\n\tc.err = err\n\tclose(c.done)\n\tfor child := range c.children {\n\t\t// NOTE: acquiring the child's lock while holding parent's lock.\n\t\tchild.cancel(false, err)\n\t}\n\tc.children = nil\n\tc.mu.Unlock()\n\n\tif removeFromParent {\n\t\tremoveChild(c.Context, c)\n\t}\n}\n\n// WithDeadline returns a copy of the parent context with the deadline adjusted\n// to be no later than d. If the parent's deadline is already earlier than d,\n// WithDeadline(parent, d) is semantically equivalent to parent. The returned\n// context's Done channel is closed when the deadline expires, when the returned\n// cancel function is called, or when the parent context's Done channel is\n// closed, whichever happens first.\n//\n// Canceling this context releases resources associated with it, so code should\n// call cancel as soon as the operations running in this Context complete.\nfunc WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) {\n\tif cur, ok := parent.Deadline(); ok && cur.Before(deadline) {\n\t\t// The current deadline is already sooner than the new one.\n\t\treturn WithCancel(parent)\n\t}\n\tc := &timerCtx{\n\t\tcancelCtx: newCancelCtx(parent),\n\t\tdeadline:  deadline,\n\t}\n\tpropagateCancel(parent, c)\n\td := deadline.Sub(time.Now())\n\tif d <= 0 {\n\t\tc.cancel(true, DeadlineExceeded) // deadline has already passed\n\t\treturn c, func() { c.cancel(true, Canceled) }\n\t}\n\tc.mu.Lock()\n\tdefer c.mu.Unlock()\n\tif c.err == nil {\n\t\tc.timer = time.AfterFunc(d, func() {\n\t\t\tc.cancel(true, DeadlineExceeded)\n\t\t})\n\t}\n\treturn c, func() { c.cancel(true, Canceled) }\n}\n\n// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to\n// implement Done and Err. It implements cancel by stopping its timer then\n// delegating to cancelCtx.cancel.\ntype timerCtx struct {\n\t*cancelCtx\n\ttimer *time.Timer // Under cancelCtx.mu.\n\n\tdeadline time.Time\n}\n\nfunc (c *timerCtx) Deadline() (deadline time.Time, ok bool) {\n\treturn c.deadline, true\n}\n\nfunc (c *timerCtx) String() string {\n\treturn fmt.Sprintf(\"%v.WithDeadline(%s [%s])\", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now()))\n}\n\nfunc (c *timerCtx) cancel(removeFromParent bool, err error) {\n\tc.cancelCtx.cancel(false, err)\n\tif removeFromParent {\n\t\t// Remove this timerCtx from its parent cancelCtx's children.\n\t\tremoveChild(c.cancelCtx.Context, c)\n\t}\n\tc.mu.Lock()\n\tif c.timer != nil {\n\t\tc.timer.Stop()\n\t\tc.timer = nil\n\t}\n\tc.mu.Unlock()\n}\n\n// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).\n//\n// Canceling this context releases resources associated with it, so code should\n// call cancel as soon as the operations running in this Context complete:\n//\n// \tfunc slowOperationWithTimeout(ctx context.Context) (Result, error) {\n// \t\tctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)\n// \t\tdefer cancel()  // releases resources if slowOperation completes before timeout elapses\n// \t\treturn slowOperation(ctx)\n// \t}\nfunc WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {\n\treturn WithDeadline(parent, time.Now().Add(timeout))\n}\n\n// WithValue returns a copy of parent in which the value associated with key is\n// val.\n//\n// Use context Values only for request-scoped data that transits processes and\n// APIs, not for passing optional parameters to functions.\nfunc WithValue(parent Context, key interface{}, val interface{}) Context {\n\treturn &valueCtx{parent, key, val}\n}\n\n// A valueCtx carries a key-value pair. It implements Value for that key and\n// delegates all other calls to the embedded Context.\ntype valueCtx struct {\n\tContext\n\tkey, val interface{}\n}\n\nfunc (c *valueCtx) String() string {\n\treturn fmt.Sprintf(\"%v.WithValue(%#v, %#v)\", c.Context, c.key, c.val)\n}\n\nfunc (c *valueCtx) Value(key interface{}) interface{} {\n\tif c.key == key {\n\t\treturn c.val\n\t}\n\treturn c.Context.Value(key)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/atom/atom.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package atom provides integer codes (also known as atoms) for a fixed set of\n// frequently occurring HTML strings: tag names and attribute keys such as \"p\"\n// and \"id\".\n//\n// Sharing an atom's name between all elements with the same tag can result in\n// fewer string allocations when tokenizing and parsing HTML. Integer\n// comparisons are also generally faster than string comparisons.\n//\n// The value of an atom's particular code is not guaranteed to stay the same\n// between versions of this package. Neither is any ordering guaranteed:\n// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to\n// be dense. The only guarantees are that e.g. looking up \"div\" will yield\n// atom.Div, calling atom.Div.String will return \"div\", and atom.Div != 0.\npackage atom // import \"golang.org/x/net/html/atom\"\n\n// Atom is an integer code for a string. The zero value maps to \"\".\ntype Atom uint32\n\n// String returns the atom's name.\nfunc (a Atom) String() string {\n\tstart := uint32(a >> 8)\n\tn := uint32(a & 0xff)\n\tif start+n > uint32(len(atomText)) {\n\t\treturn \"\"\n\t}\n\treturn atomText[start : start+n]\n}\n\nfunc (a Atom) string() string {\n\treturn atomText[a>>8 : a>>8+a&0xff]\n}\n\n// fnv computes the FNV hash with an arbitrary starting value h.\nfunc fnv(h uint32, s []byte) uint32 {\n\tfor i := range s {\n\t\th ^= uint32(s[i])\n\t\th *= 16777619\n\t}\n\treturn h\n}\n\nfunc match(s string, t []byte) bool {\n\tfor i, c := range t {\n\t\tif s[i] != c {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// Lookup returns the atom whose name is s. It returns zero if there is no\n// such atom. The lookup is case sensitive.\nfunc Lookup(s []byte) Atom {\n\tif len(s) == 0 || len(s) > maxAtomLen {\n\t\treturn 0\n\t}\n\th := fnv(hash0, s)\n\tif a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) {\n\t\treturn a\n\t}\n\tif a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) {\n\t\treturn a\n\t}\n\treturn 0\n}\n\n// String returns a string whose contents are equal to s. In that sense, it is\n// equivalent to string(s) but may be more efficient.\nfunc String(s []byte) string {\n\tif a := Lookup(s); a != 0 {\n\t\treturn a.String()\n\t}\n\treturn string(s)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/atom/gen.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\n// This program generates table.go and table_test.go.\n// Invoke as\n//\n//\tgo run gen.go |gofmt >table.go\n//\tgo run gen.go -test |gofmt >table_test.go\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"os\"\n\t\"sort\"\n\t\"strings\"\n)\n\n// identifier converts s to a Go exported identifier.\n// It converts \"div\" to \"Div\" and \"accept-charset\" to \"AcceptCharset\".\nfunc identifier(s string) string {\n\tb := make([]byte, 0, len(s))\n\tcap := true\n\tfor _, c := range s {\n\t\tif c == '-' {\n\t\t\tcap = true\n\t\t\tcontinue\n\t\t}\n\t\tif cap && 'a' <= c && c <= 'z' {\n\t\t\tc -= 'a' - 'A'\n\t\t}\n\t\tcap = false\n\t\tb = append(b, byte(c))\n\t}\n\treturn string(b)\n}\n\nvar test = flag.Bool(\"test\", false, \"generate table_test.go\")\n\nfunc main() {\n\tflag.Parse()\n\n\tvar all []string\n\tall = append(all, elements...)\n\tall = append(all, attributes...)\n\tall = append(all, eventHandlers...)\n\tall = append(all, extra...)\n\tsort.Strings(all)\n\n\tif *test {\n\t\tfmt.Printf(\"// generated by go run gen.go -test; DO NOT EDIT\\n\\n\")\n\t\tfmt.Printf(\"package atom\\n\\n\")\n\t\tfmt.Printf(\"var testAtomList = []string{\\n\")\n\t\tfor _, s := range all {\n\t\t\tfmt.Printf(\"\\t%q,\\n\", s)\n\t\t}\n\t\tfmt.Printf(\"}\\n\")\n\t\treturn\n\t}\n\n\t// uniq - lists have dups\n\t// compute max len too\n\tmaxLen := 0\n\tw := 0\n\tfor _, s := range all {\n\t\tif w == 0 || all[w-1] != s {\n\t\t\tif maxLen < len(s) {\n\t\t\t\tmaxLen = len(s)\n\t\t\t}\n\t\t\tall[w] = s\n\t\t\tw++\n\t\t}\n\t}\n\tall = all[:w]\n\n\t// Find hash that minimizes table size.\n\tvar best *table\n\tfor i := 0; i < 1000000; i++ {\n\t\tif best != nil && 1<<(best.k-1) < len(all) {\n\t\t\tbreak\n\t\t}\n\t\th := rand.Uint32()\n\t\tfor k := uint(0); k <= 16; k++ {\n\t\t\tif best != nil && k >= best.k {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvar t table\n\t\t\tif t.init(h, k, all) {\n\t\t\t\tbest = &t\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif best == nil {\n\t\tfmt.Fprintf(os.Stderr, \"failed to construct string table\\n\")\n\t\tos.Exit(1)\n\t}\n\n\t// Lay out strings, using overlaps when possible.\n\tlayout := append([]string{}, all...)\n\n\t// Remove strings that are substrings of other strings\n\tfor changed := true; changed; {\n\t\tchanged = false\n\t\tfor i, s := range layout {\n\t\t\tif s == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor j, t := range layout {\n\t\t\t\tif i != j && t != \"\" && strings.Contains(s, t) {\n\t\t\t\t\tchanged = true\n\t\t\t\t\tlayout[j] = \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Join strings where one suffix matches another prefix.\n\tfor {\n\t\t// Find best i, j, k such that layout[i][len-k:] == layout[j][:k],\n\t\t// maximizing overlap length k.\n\t\tbesti := -1\n\t\tbestj := -1\n\t\tbestk := 0\n\t\tfor i, s := range layout {\n\t\t\tif s == \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor j, t := range layout {\n\t\t\t\tif i == j {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor k := bestk + 1; k <= len(s) && k <= len(t); k++ {\n\t\t\t\t\tif s[len(s)-k:] == t[:k] {\n\t\t\t\t\t\tbesti = i\n\t\t\t\t\t\tbestj = j\n\t\t\t\t\t\tbestk = k\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif bestk > 0 {\n\t\t\tlayout[besti] += layout[bestj][bestk:]\n\t\t\tlayout[bestj] = \"\"\n\t\t\tcontinue\n\t\t}\n\t\tbreak\n\t}\n\n\ttext := strings.Join(layout, \"\")\n\n\tatom := map[string]uint32{}\n\tfor _, s := range all {\n\t\toff := strings.Index(text, s)\n\t\tif off < 0 {\n\t\t\tpanic(\"lost string \" + s)\n\t\t}\n\t\tatom[s] = uint32(off<<8 | len(s))\n\t}\n\n\t// Generate the Go code.\n\tfmt.Printf(\"// generated by go run gen.go; DO NOT EDIT\\n\\n\")\n\tfmt.Printf(\"package atom\\n\\nconst (\\n\")\n\tfor _, s := range all {\n\t\tfmt.Printf(\"\\t%s Atom = %#x\\n\", identifier(s), atom[s])\n\t}\n\tfmt.Printf(\")\\n\\n\")\n\n\tfmt.Printf(\"const hash0 = %#x\\n\\n\", best.h0)\n\tfmt.Printf(\"const maxAtomLen = %d\\n\\n\", maxLen)\n\n\tfmt.Printf(\"var table = [1<<%d]Atom{\\n\", best.k)\n\tfor i, s := range best.tab {\n\t\tif s == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tfmt.Printf(\"\\t%#x: %#x, // %s\\n\", i, atom[s], s)\n\t}\n\tfmt.Printf(\"}\\n\")\n\tdatasize := (1 << best.k) * 4\n\n\tfmt.Printf(\"const atomText =\\n\")\n\ttextsize := len(text)\n\tfor len(text) > 60 {\n\t\tfmt.Printf(\"\\t%q +\\n\", text[:60])\n\t\ttext = text[60:]\n\t}\n\tfmt.Printf(\"\\t%q\\n\\n\", text)\n\n\tfmt.Fprintf(os.Stderr, \"%d atoms; %d string bytes + %d tables = %d total data\\n\", len(all), textsize, datasize, textsize+datasize)\n}\n\ntype byLen []string\n\nfunc (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) }\nfunc (x byLen) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }\nfunc (x byLen) Len() int           { return len(x) }\n\n// fnv computes the FNV hash with an arbitrary starting value h.\nfunc fnv(h uint32, s string) uint32 {\n\tfor i := 0; i < len(s); i++ {\n\t\th ^= uint32(s[i])\n\t\th *= 16777619\n\t}\n\treturn h\n}\n\n// A table represents an attempt at constructing the lookup table.\n// The lookup table uses cuckoo hashing, meaning that each string\n// can be found in one of two positions.\ntype table struct {\n\th0   uint32\n\tk    uint\n\tmask uint32\n\ttab  []string\n}\n\n// hash returns the two hashes for s.\nfunc (t *table) hash(s string) (h1, h2 uint32) {\n\th := fnv(t.h0, s)\n\th1 = h & t.mask\n\th2 = (h >> 16) & t.mask\n\treturn\n}\n\n// init initializes the table with the given parameters.\n// h0 is the initial hash value,\n// k is the number of bits of hash value to use, and\n// x is the list of strings to store in the table.\n// init returns false if the table cannot be constructed.\nfunc (t *table) init(h0 uint32, k uint, x []string) bool {\n\tt.h0 = h0\n\tt.k = k\n\tt.tab = make([]string, 1<<k)\n\tt.mask = 1<<k - 1\n\tfor _, s := range x {\n\t\tif !t.insert(s) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// insert inserts s in the table.\nfunc (t *table) insert(s string) bool {\n\th1, h2 := t.hash(s)\n\tif t.tab[h1] == \"\" {\n\t\tt.tab[h1] = s\n\t\treturn true\n\t}\n\tif t.tab[h2] == \"\" {\n\t\tt.tab[h2] = s\n\t\treturn true\n\t}\n\tif t.push(h1, 0) {\n\t\tt.tab[h1] = s\n\t\treturn true\n\t}\n\tif t.push(h2, 0) {\n\t\tt.tab[h2] = s\n\t\treturn true\n\t}\n\treturn false\n}\n\n// push attempts to push aside the entry in slot i.\nfunc (t *table) push(i uint32, depth int) bool {\n\tif depth > len(t.tab) {\n\t\treturn false\n\t}\n\ts := t.tab[i]\n\th1, h2 := t.hash(s)\n\tj := h1 + h2 - i\n\tif t.tab[j] != \"\" && !t.push(j, depth+1) {\n\t\treturn false\n\t}\n\tt.tab[j] = s\n\treturn true\n}\n\n// The lists of element names and attribute keys were taken from\n// https://html.spec.whatwg.org/multipage/indices.html#index\n// as of the \"HTML Living Standard - Last Updated 21 February 2015\" version.\n\nvar elements = []string{\n\t\"a\",\n\t\"abbr\",\n\t\"address\",\n\t\"area\",\n\t\"article\",\n\t\"aside\",\n\t\"audio\",\n\t\"b\",\n\t\"base\",\n\t\"bdi\",\n\t\"bdo\",\n\t\"blockquote\",\n\t\"body\",\n\t\"br\",\n\t\"button\",\n\t\"canvas\",\n\t\"caption\",\n\t\"cite\",\n\t\"code\",\n\t\"col\",\n\t\"colgroup\",\n\t\"command\",\n\t\"data\",\n\t\"datalist\",\n\t\"dd\",\n\t\"del\",\n\t\"details\",\n\t\"dfn\",\n\t\"dialog\",\n\t\"div\",\n\t\"dl\",\n\t\"dt\",\n\t\"em\",\n\t\"embed\",\n\t\"fieldset\",\n\t\"figcaption\",\n\t\"figure\",\n\t\"footer\",\n\t\"form\",\n\t\"h1\",\n\t\"h2\",\n\t\"h3\",\n\t\"h4\",\n\t\"h5\",\n\t\"h6\",\n\t\"head\",\n\t\"header\",\n\t\"hgroup\",\n\t\"hr\",\n\t\"html\",\n\t\"i\",\n\t\"iframe\",\n\t\"img\",\n\t\"input\",\n\t\"ins\",\n\t\"kbd\",\n\t\"keygen\",\n\t\"label\",\n\t\"legend\",\n\t\"li\",\n\t\"link\",\n\t\"map\",\n\t\"mark\",\n\t\"menu\",\n\t\"menuitem\",\n\t\"meta\",\n\t\"meter\",\n\t\"nav\",\n\t\"noscript\",\n\t\"object\",\n\t\"ol\",\n\t\"optgroup\",\n\t\"option\",\n\t\"output\",\n\t\"p\",\n\t\"param\",\n\t\"pre\",\n\t\"progress\",\n\t\"q\",\n\t\"rp\",\n\t\"rt\",\n\t\"ruby\",\n\t\"s\",\n\t\"samp\",\n\t\"script\",\n\t\"section\",\n\t\"select\",\n\t\"small\",\n\t\"source\",\n\t\"span\",\n\t\"strong\",\n\t\"style\",\n\t\"sub\",\n\t\"summary\",\n\t\"sup\",\n\t\"table\",\n\t\"tbody\",\n\t\"td\",\n\t\"template\",\n\t\"textarea\",\n\t\"tfoot\",\n\t\"th\",\n\t\"thead\",\n\t\"time\",\n\t\"title\",\n\t\"tr\",\n\t\"track\",\n\t\"u\",\n\t\"ul\",\n\t\"var\",\n\t\"video\",\n\t\"wbr\",\n}\n\n// https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n\nvar attributes = []string{\n\t\"abbr\",\n\t\"accept\",\n\t\"accept-charset\",\n\t\"accesskey\",\n\t\"action\",\n\t\"alt\",\n\t\"async\",\n\t\"autocomplete\",\n\t\"autofocus\",\n\t\"autoplay\",\n\t\"challenge\",\n\t\"charset\",\n\t\"checked\",\n\t\"cite\",\n\t\"class\",\n\t\"cols\",\n\t\"colspan\",\n\t\"command\",\n\t\"content\",\n\t\"contenteditable\",\n\t\"contextmenu\",\n\t\"controls\",\n\t\"coords\",\n\t\"crossorigin\",\n\t\"data\",\n\t\"datetime\",\n\t\"default\",\n\t\"defer\",\n\t\"dir\",\n\t\"dirname\",\n\t\"disabled\",\n\t\"download\",\n\t\"draggable\",\n\t\"dropzone\",\n\t\"enctype\",\n\t\"for\",\n\t\"form\",\n\t\"formaction\",\n\t\"formenctype\",\n\t\"formmethod\",\n\t\"formnovalidate\",\n\t\"formtarget\",\n\t\"headers\",\n\t\"height\",\n\t\"hidden\",\n\t\"high\",\n\t\"href\",\n\t\"hreflang\",\n\t\"http-equiv\",\n\t\"icon\",\n\t\"id\",\n\t\"inputmode\",\n\t\"ismap\",\n\t\"itemid\",\n\t\"itemprop\",\n\t\"itemref\",\n\t\"itemscope\",\n\t\"itemtype\",\n\t\"keytype\",\n\t\"kind\",\n\t\"label\",\n\t\"lang\",\n\t\"list\",\n\t\"loop\",\n\t\"low\",\n\t\"manifest\",\n\t\"max\",\n\t\"maxlength\",\n\t\"media\",\n\t\"mediagroup\",\n\t\"method\",\n\t\"min\",\n\t\"minlength\",\n\t\"multiple\",\n\t\"muted\",\n\t\"name\",\n\t\"novalidate\",\n\t\"open\",\n\t\"optimum\",\n\t\"pattern\",\n\t\"ping\",\n\t\"placeholder\",\n\t\"poster\",\n\t\"preload\",\n\t\"radiogroup\",\n\t\"readonly\",\n\t\"rel\",\n\t\"required\",\n\t\"reversed\",\n\t\"rows\",\n\t\"rowspan\",\n\t\"sandbox\",\n\t\"spellcheck\",\n\t\"scope\",\n\t\"scoped\",\n\t\"seamless\",\n\t\"selected\",\n\t\"shape\",\n\t\"size\",\n\t\"sizes\",\n\t\"sortable\",\n\t\"sorted\",\n\t\"span\",\n\t\"src\",\n\t\"srcdoc\",\n\t\"srclang\",\n\t\"start\",\n\t\"step\",\n\t\"style\",\n\t\"tabindex\",\n\t\"target\",\n\t\"title\",\n\t\"translate\",\n\t\"type\",\n\t\"typemustmatch\",\n\t\"usemap\",\n\t\"value\",\n\t\"width\",\n\t\"wrap\",\n}\n\nvar eventHandlers = []string{\n\t\"onabort\",\n\t\"onautocomplete\",\n\t\"onautocompleteerror\",\n\t\"onafterprint\",\n\t\"onbeforeprint\",\n\t\"onbeforeunload\",\n\t\"onblur\",\n\t\"oncancel\",\n\t\"oncanplay\",\n\t\"oncanplaythrough\",\n\t\"onchange\",\n\t\"onclick\",\n\t\"onclose\",\n\t\"oncontextmenu\",\n\t\"oncuechange\",\n\t\"ondblclick\",\n\t\"ondrag\",\n\t\"ondragend\",\n\t\"ondragenter\",\n\t\"ondragleave\",\n\t\"ondragover\",\n\t\"ondragstart\",\n\t\"ondrop\",\n\t\"ondurationchange\",\n\t\"onemptied\",\n\t\"onended\",\n\t\"onerror\",\n\t\"onfocus\",\n\t\"onhashchange\",\n\t\"oninput\",\n\t\"oninvalid\",\n\t\"onkeydown\",\n\t\"onkeypress\",\n\t\"onkeyup\",\n\t\"onlanguagechange\",\n\t\"onload\",\n\t\"onloadeddata\",\n\t\"onloadedmetadata\",\n\t\"onloadstart\",\n\t\"onmessage\",\n\t\"onmousedown\",\n\t\"onmousemove\",\n\t\"onmouseout\",\n\t\"onmouseover\",\n\t\"onmouseup\",\n\t\"onmousewheel\",\n\t\"onoffline\",\n\t\"ononline\",\n\t\"onpagehide\",\n\t\"onpageshow\",\n\t\"onpause\",\n\t\"onplay\",\n\t\"onplaying\",\n\t\"onpopstate\",\n\t\"onprogress\",\n\t\"onratechange\",\n\t\"onreset\",\n\t\"onresize\",\n\t\"onscroll\",\n\t\"onseeked\",\n\t\"onseeking\",\n\t\"onselect\",\n\t\"onshow\",\n\t\"onsort\",\n\t\"onstalled\",\n\t\"onstorage\",\n\t\"onsubmit\",\n\t\"onsuspend\",\n\t\"ontimeupdate\",\n\t\"ontoggle\",\n\t\"onunload\",\n\t\"onvolumechange\",\n\t\"onwaiting\",\n}\n\n// extra are ad-hoc values not covered by any of the lists above.\nvar extra = []string{\n\t\"align\",\n\t\"annotation\",\n\t\"annotation-xml\",\n\t\"applet\",\n\t\"basefont\",\n\t\"bgsound\",\n\t\"big\",\n\t\"blink\",\n\t\"center\",\n\t\"color\",\n\t\"desc\",\n\t\"face\",\n\t\"font\",\n\t\"foreignObject\", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive.\n\t\"foreignobject\",\n\t\"frame\",\n\t\"frameset\",\n\t\"image\",\n\t\"isindex\",\n\t\"listing\",\n\t\"malignmark\",\n\t\"marquee\",\n\t\"math\",\n\t\"mglyph\",\n\t\"mi\",\n\t\"mn\",\n\t\"mo\",\n\t\"ms\",\n\t\"mtext\",\n\t\"nobr\",\n\t\"noembed\",\n\t\"noframes\",\n\t\"plaintext\",\n\t\"prompt\",\n\t\"public\",\n\t\"spacer\",\n\t\"strike\",\n\t\"svg\",\n\t\"system\",\n\t\"tt\",\n\t\"xmp\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/atom/table.go",
    "content": "// generated by go run gen.go; DO NOT EDIT\n\npackage atom\n\nconst (\n\tA                   Atom = 0x1\n\tAbbr                Atom = 0x4\n\tAccept              Atom = 0x2106\n\tAcceptCharset       Atom = 0x210e\n\tAccesskey           Atom = 0x3309\n\tAction              Atom = 0x1f606\n\tAddress             Atom = 0x4f307\n\tAlign               Atom = 0x1105\n\tAlt                 Atom = 0x4503\n\tAnnotation          Atom = 0x1670a\n\tAnnotationXml       Atom = 0x1670e\n\tApplet              Atom = 0x2b306\n\tArea                Atom = 0x2fa04\n\tArticle             Atom = 0x38807\n\tAside               Atom = 0x8305\n\tAsync               Atom = 0x7b05\n\tAudio               Atom = 0xa605\n\tAutocomplete        Atom = 0x1fc0c\n\tAutofocus           Atom = 0xb309\n\tAutoplay            Atom = 0xce08\n\tB                   Atom = 0x101\n\tBase                Atom = 0xd604\n\tBasefont            Atom = 0xd608\n\tBdi                 Atom = 0x1a03\n\tBdo                 Atom = 0xe703\n\tBgsound             Atom = 0x11807\n\tBig                 Atom = 0x12403\n\tBlink               Atom = 0x12705\n\tBlockquote          Atom = 0x12c0a\n\tBody                Atom = 0x2f04\n\tBr                  Atom = 0x202\n\tButton              Atom = 0x13606\n\tCanvas              Atom = 0x7f06\n\tCaption             Atom = 0x1bb07\n\tCenter              Atom = 0x5b506\n\tChallenge           Atom = 0x21f09\n\tCharset             Atom = 0x2807\n\tChecked             Atom = 0x32807\n\tCite                Atom = 0x3c804\n\tClass               Atom = 0x4de05\n\tCode                Atom = 0x14904\n\tCol                 Atom = 0x15003\n\tColgroup            Atom = 0x15008\n\tColor               Atom = 0x15d05\n\tCols                Atom = 0x16204\n\tColspan             Atom = 0x16207\n\tCommand             Atom = 0x17507\n\tContent             Atom = 0x42307\n\tContenteditable     Atom = 0x4230f\n\tContextmenu         Atom = 0x3310b\n\tControls            Atom = 0x18808\n\tCoords              Atom = 0x19406\n\tCrossorigin         Atom = 0x19f0b\n\tData                Atom = 0x44a04\n\tDatalist            Atom = 0x44a08\n\tDatetime            Atom = 0x23c08\n\tDd                  Atom = 0x26702\n\tDefault             Atom = 0x8607\n\tDefer               Atom = 0x14b05\n\tDel                 Atom = 0x3ef03\n\tDesc                Atom = 0x4db04\n\tDetails             Atom = 0x4807\n\tDfn                 Atom = 0x6103\n\tDialog              Atom = 0x1b06\n\tDir                 Atom = 0x6903\n\tDirname             Atom = 0x6907\n\tDisabled            Atom = 0x10c08\n\tDiv                 Atom = 0x11303\n\tDl                  Atom = 0x11e02\n\tDownload            Atom = 0x40008\n\tDraggable           Atom = 0x17b09\n\tDropzone            Atom = 0x39108\n\tDt                  Atom = 0x50902\n\tEm                  Atom = 0x6502\n\tEmbed               Atom = 0x6505\n\tEnctype             Atom = 0x21107\n\tFace                Atom = 0x5b304\n\tFieldset            Atom = 0x1b008\n\tFigcaption          Atom = 0x1b80a\n\tFigure              Atom = 0x1cc06\n\tFont                Atom = 0xda04\n\tFooter              Atom = 0x8d06\n\tFor                 Atom = 0x1d803\n\tForeignObject       Atom = 0x1d80d\n\tForeignobject       Atom = 0x1e50d\n\tForm                Atom = 0x1f204\n\tFormaction          Atom = 0x1f20a\n\tFormenctype         Atom = 0x20d0b\n\tFormmethod          Atom = 0x2280a\n\tFormnovalidate      Atom = 0x2320e\n\tFormtarget          Atom = 0x2470a\n\tFrame               Atom = 0x9a05\n\tFrameset            Atom = 0x9a08\n\tH1                  Atom = 0x26e02\n\tH2                  Atom = 0x29402\n\tH3                  Atom = 0x2a702\n\tH4                  Atom = 0x2e902\n\tH5                  Atom = 0x2f302\n\tH6                  Atom = 0x50b02\n\tHead                Atom = 0x2d504\n\tHeader              Atom = 0x2d506\n\tHeaders             Atom = 0x2d507\n\tHeight              Atom = 0x25106\n\tHgroup              Atom = 0x25906\n\tHidden              Atom = 0x26506\n\tHigh                Atom = 0x26b04\n\tHr                  Atom = 0x27002\n\tHref                Atom = 0x27004\n\tHreflang            Atom = 0x27008\n\tHtml                Atom = 0x25504\n\tHttpEquiv           Atom = 0x2780a\n\tI                   Atom = 0x601\n\tIcon                Atom = 0x42204\n\tId                  Atom = 0x8502\n\tIframe              Atom = 0x29606\n\tImage               Atom = 0x29c05\n\tImg                 Atom = 0x2a103\n\tInput               Atom = 0x3e805\n\tInputmode           Atom = 0x3e809\n\tIns                 Atom = 0x1a803\n\tIsindex             Atom = 0x2a907\n\tIsmap               Atom = 0x2b005\n\tItemid              Atom = 0x33c06\n\tItemprop            Atom = 0x3c908\n\tItemref             Atom = 0x5ad07\n\tItemscope           Atom = 0x2b909\n\tItemtype            Atom = 0x2c308\n\tKbd                 Atom = 0x1903\n\tKeygen              Atom = 0x3906\n\tKeytype             Atom = 0x53707\n\tKind                Atom = 0x10904\n\tLabel               Atom = 0xf005\n\tLang                Atom = 0x27404\n\tLegend              Atom = 0x18206\n\tLi                  Atom = 0x1202\n\tLink                Atom = 0x12804\n\tList                Atom = 0x44e04\n\tListing             Atom = 0x44e07\n\tLoop                Atom = 0xf404\n\tLow                 Atom = 0x11f03\n\tMalignmark          Atom = 0x100a\n\tManifest            Atom = 0x5f108\n\tMap                 Atom = 0x2b203\n\tMark                Atom = 0x1604\n\tMarquee             Atom = 0x2cb07\n\tMath                Atom = 0x2d204\n\tMax                 Atom = 0x2e103\n\tMaxlength           Atom = 0x2e109\n\tMedia               Atom = 0x6e05\n\tMediagroup          Atom = 0x6e0a\n\tMenu                Atom = 0x33804\n\tMenuitem            Atom = 0x33808\n\tMeta                Atom = 0x45d04\n\tMeter               Atom = 0x24205\n\tMethod              Atom = 0x22c06\n\tMglyph              Atom = 0x2a206\n\tMi                  Atom = 0x2eb02\n\tMin                 Atom = 0x2eb03\n\tMinlength           Atom = 0x2eb09\n\tMn                  Atom = 0x23502\n\tMo                  Atom = 0x3ed02\n\tMs                  Atom = 0x2bc02\n\tMtext               Atom = 0x2f505\n\tMultiple            Atom = 0x30308\n\tMuted               Atom = 0x30b05\n\tName                Atom = 0x6c04\n\tNav                 Atom = 0x3e03\n\tNobr                Atom = 0x5704\n\tNoembed             Atom = 0x6307\n\tNoframes            Atom = 0x9808\n\tNoscript            Atom = 0x3d208\n\tNovalidate          Atom = 0x2360a\n\tObject              Atom = 0x1ec06\n\tOl                  Atom = 0xc902\n\tOnabort             Atom = 0x13a07\n\tOnafterprint        Atom = 0x1c00c\n\tOnautocomplete      Atom = 0x1fa0e\n\tOnautocompleteerror Atom = 0x1fa13\n\tOnbeforeprint       Atom = 0x6040d\n\tOnbeforeunload      Atom = 0x4e70e\n\tOnblur              Atom = 0xaa06\n\tOncancel            Atom = 0xe908\n\tOncanplay           Atom = 0x28509\n\tOncanplaythrough    Atom = 0x28510\n\tOnchange            Atom = 0x3a708\n\tOnclick             Atom = 0x31007\n\tOnclose             Atom = 0x31707\n\tOncontextmenu       Atom = 0x32f0d\n\tOncuechange         Atom = 0x3420b\n\tOndblclick          Atom = 0x34d0a\n\tOndrag              Atom = 0x35706\n\tOndragend           Atom = 0x35709\n\tOndragenter         Atom = 0x3600b\n\tOndragleave         Atom = 0x36b0b\n\tOndragover          Atom = 0x3760a\n\tOndragstart         Atom = 0x3800b\n\tOndrop              Atom = 0x38f06\n\tOndurationchange    Atom = 0x39f10\n\tOnemptied           Atom = 0x39609\n\tOnended             Atom = 0x3af07\n\tOnerror             Atom = 0x3b607\n\tOnfocus             Atom = 0x3bd07\n\tOnhashchange        Atom = 0x3da0c\n\tOninput             Atom = 0x3e607\n\tOninvalid           Atom = 0x3f209\n\tOnkeydown           Atom = 0x3fb09\n\tOnkeypress          Atom = 0x4080a\n\tOnkeyup             Atom = 0x41807\n\tOnlanguagechange    Atom = 0x43210\n\tOnload              Atom = 0x44206\n\tOnloadeddata        Atom = 0x4420c\n\tOnloadedmetadata    Atom = 0x45510\n\tOnloadstart         Atom = 0x46b0b\n\tOnmessage           Atom = 0x47609\n\tOnmousedown         Atom = 0x47f0b\n\tOnmousemove         Atom = 0x48a0b\n\tOnmouseout          Atom = 0x4950a\n\tOnmouseover         Atom = 0x4a20b\n\tOnmouseup           Atom = 0x4ad09\n\tOnmousewheel        Atom = 0x4b60c\n\tOnoffline           Atom = 0x4c209\n\tOnonline            Atom = 0x4cb08\n\tOnpagehide          Atom = 0x4d30a\n\tOnpageshow          Atom = 0x4fe0a\n\tOnpause             Atom = 0x50d07\n\tOnplay              Atom = 0x51706\n\tOnplaying           Atom = 0x51709\n\tOnpopstate          Atom = 0x5200a\n\tOnprogress          Atom = 0x52a0a\n\tOnratechange        Atom = 0x53e0c\n\tOnreset             Atom = 0x54a07\n\tOnresize            Atom = 0x55108\n\tOnscroll            Atom = 0x55f08\n\tOnseeked            Atom = 0x56708\n\tOnseeking           Atom = 0x56f09\n\tOnselect            Atom = 0x57808\n\tOnshow              Atom = 0x58206\n\tOnsort              Atom = 0x58b06\n\tOnstalled           Atom = 0x59509\n\tOnstorage           Atom = 0x59e09\n\tOnsubmit            Atom = 0x5a708\n\tOnsuspend           Atom = 0x5bb09\n\tOntimeupdate        Atom = 0xdb0c\n\tOntoggle            Atom = 0x5c408\n\tOnunload            Atom = 0x5cc08\n\tOnvolumechange      Atom = 0x5d40e\n\tOnwaiting           Atom = 0x5e209\n\tOpen                Atom = 0x3cf04\n\tOptgroup            Atom = 0xf608\n\tOptimum             Atom = 0x5eb07\n\tOption              Atom = 0x60006\n\tOutput              Atom = 0x49c06\n\tP                   Atom = 0xc01\n\tParam               Atom = 0xc05\n\tPattern             Atom = 0x5107\n\tPing                Atom = 0x7704\n\tPlaceholder         Atom = 0xc30b\n\tPlaintext           Atom = 0xfd09\n\tPoster              Atom = 0x15706\n\tPre                 Atom = 0x25e03\n\tPreload             Atom = 0x25e07\n\tProgress            Atom = 0x52c08\n\tPrompt              Atom = 0x5fa06\n\tPublic              Atom = 0x41e06\n\tQ                   Atom = 0x13101\n\tRadiogroup          Atom = 0x30a\n\tReadonly            Atom = 0x2fb08\n\tRel                 Atom = 0x25f03\n\tRequired            Atom = 0x1d008\n\tReversed            Atom = 0x5a08\n\tRows                Atom = 0x9204\n\tRowspan             Atom = 0x9207\n\tRp                  Atom = 0x1c602\n\tRt                  Atom = 0x13f02\n\tRuby                Atom = 0xaf04\n\tS                   Atom = 0x2c01\n\tSamp                Atom = 0x4e04\n\tSandbox             Atom = 0xbb07\n\tScope               Atom = 0x2bd05\n\tScoped              Atom = 0x2bd06\n\tScript              Atom = 0x3d406\n\tSeamless            Atom = 0x31c08\n\tSection             Atom = 0x4e207\n\tSelect              Atom = 0x57a06\n\tSelected            Atom = 0x57a08\n\tShape               Atom = 0x4f905\n\tSize                Atom = 0x55504\n\tSizes               Atom = 0x55505\n\tSmall               Atom = 0x18f05\n\tSortable            Atom = 0x58d08\n\tSorted              Atom = 0x19906\n\tSource              Atom = 0x1aa06\n\tSpacer              Atom = 0x2db06\n\tSpan                Atom = 0x9504\n\tSpellcheck          Atom = 0x3230a\n\tSrc                 Atom = 0x3c303\n\tSrcdoc              Atom = 0x3c306\n\tSrclang             Atom = 0x41107\n\tStart               Atom = 0x38605\n\tStep                Atom = 0x5f704\n\tStrike              Atom = 0x53306\n\tStrong              Atom = 0x55906\n\tStyle               Atom = 0x61105\n\tSub                 Atom = 0x5a903\n\tSummary             Atom = 0x61607\n\tSup                 Atom = 0x61d03\n\tSvg                 Atom = 0x62003\n\tSystem              Atom = 0x62306\n\tTabindex            Atom = 0x46308\n\tTable               Atom = 0x42d05\n\tTarget              Atom = 0x24b06\n\tTbody               Atom = 0x2e05\n\tTd                  Atom = 0x4702\n\tTemplate            Atom = 0x62608\n\tTextarea            Atom = 0x2f608\n\tTfoot               Atom = 0x8c05\n\tTh                  Atom = 0x22e02\n\tThead               Atom = 0x2d405\n\tTime                Atom = 0xdd04\n\tTitle               Atom = 0xa105\n\tTr                  Atom = 0x10502\n\tTrack               Atom = 0x10505\n\tTranslate           Atom = 0x14009\n\tTt                  Atom = 0x5302\n\tType                Atom = 0x21404\n\tTypemustmatch       Atom = 0x2140d\n\tU                   Atom = 0xb01\n\tUl                  Atom = 0x8a02\n\tUsemap              Atom = 0x51106\n\tValue               Atom = 0x4005\n\tVar                 Atom = 0x11503\n\tVideo               Atom = 0x28105\n\tWbr                 Atom = 0x12103\n\tWidth               Atom = 0x50705\n\tWrap                Atom = 0x58704\n\tXmp                 Atom = 0xc103\n)\n\nconst hash0 = 0xc17da63e\n\nconst maxAtomLen = 19\n\nvar table = [1 << 9]Atom{\n\t0x1:   0x48a0b, // onmousemove\n\t0x2:   0x5e209, // onwaiting\n\t0x3:   0x1fa13, // onautocompleteerror\n\t0x4:   0x5fa06, // prompt\n\t0x7:   0x5eb07, // optimum\n\t0x8:   0x1604,  // mark\n\t0xa:   0x5ad07, // itemref\n\t0xb:   0x4fe0a, // onpageshow\n\t0xc:   0x57a06, // select\n\t0xd:   0x17b09, // draggable\n\t0xe:   0x3e03,  // nav\n\t0xf:   0x17507, // command\n\t0x11:  0xb01,   // u\n\t0x14:  0x2d507, // headers\n\t0x15:  0x44a08, // datalist\n\t0x17:  0x4e04,  // samp\n\t0x1a:  0x3fb09, // onkeydown\n\t0x1b:  0x55f08, // onscroll\n\t0x1c:  0x15003, // col\n\t0x20:  0x3c908, // itemprop\n\t0x21:  0x2780a, // http-equiv\n\t0x22:  0x61d03, // sup\n\t0x24:  0x1d008, // required\n\t0x2b:  0x25e07, // preload\n\t0x2c:  0x6040d, // onbeforeprint\n\t0x2d:  0x3600b, // ondragenter\n\t0x2e:  0x50902, // dt\n\t0x2f:  0x5a708, // onsubmit\n\t0x30:  0x27002, // hr\n\t0x31:  0x32f0d, // oncontextmenu\n\t0x33:  0x29c05, // image\n\t0x34:  0x50d07, // onpause\n\t0x35:  0x25906, // hgroup\n\t0x36:  0x7704,  // ping\n\t0x37:  0x57808, // onselect\n\t0x3a:  0x11303, // div\n\t0x3b:  0x1fa0e, // onautocomplete\n\t0x40:  0x2eb02, // mi\n\t0x41:  0x31c08, // seamless\n\t0x42:  0x2807,  // charset\n\t0x43:  0x8502,  // id\n\t0x44:  0x5200a, // onpopstate\n\t0x45:  0x3ef03, // del\n\t0x46:  0x2cb07, // marquee\n\t0x47:  0x3309,  // accesskey\n\t0x49:  0x8d06,  // footer\n\t0x4a:  0x44e04, // list\n\t0x4b:  0x2b005, // ismap\n\t0x51:  0x33804, // menu\n\t0x52:  0x2f04,  // body\n\t0x55:  0x9a08,  // frameset\n\t0x56:  0x54a07, // onreset\n\t0x57:  0x12705, // blink\n\t0x58:  0xa105,  // title\n\t0x59:  0x38807, // article\n\t0x5b:  0x22e02, // th\n\t0x5d:  0x13101, // q\n\t0x5e:  0x3cf04, // open\n\t0x5f:  0x2fa04, // area\n\t0x61:  0x44206, // onload\n\t0x62:  0xda04,  // font\n\t0x63:  0xd604,  // base\n\t0x64:  0x16207, // colspan\n\t0x65:  0x53707, // keytype\n\t0x66:  0x11e02, // dl\n\t0x68:  0x1b008, // fieldset\n\t0x6a:  0x2eb03, // min\n\t0x6b:  0x11503, // var\n\t0x6f:  0x2d506, // header\n\t0x70:  0x13f02, // rt\n\t0x71:  0x15008, // colgroup\n\t0x72:  0x23502, // mn\n\t0x74:  0x13a07, // onabort\n\t0x75:  0x3906,  // keygen\n\t0x76:  0x4c209, // onoffline\n\t0x77:  0x21f09, // challenge\n\t0x78:  0x2b203, // map\n\t0x7a:  0x2e902, // h4\n\t0x7b:  0x3b607, // onerror\n\t0x7c:  0x2e109, // maxlength\n\t0x7d:  0x2f505, // mtext\n\t0x7e:  0xbb07,  // sandbox\n\t0x7f:  0x58b06, // onsort\n\t0x80:  0x100a,  // malignmark\n\t0x81:  0x45d04, // meta\n\t0x82:  0x7b05,  // async\n\t0x83:  0x2a702, // h3\n\t0x84:  0x26702, // dd\n\t0x85:  0x27004, // href\n\t0x86:  0x6e0a,  // mediagroup\n\t0x87:  0x19406, // coords\n\t0x88:  0x41107, // srclang\n\t0x89:  0x34d0a, // ondblclick\n\t0x8a:  0x4005,  // value\n\t0x8c:  0xe908,  // oncancel\n\t0x8e:  0x3230a, // spellcheck\n\t0x8f:  0x9a05,  // frame\n\t0x91:  0x12403, // big\n\t0x94:  0x1f606, // action\n\t0x95:  0x6903,  // dir\n\t0x97:  0x2fb08, // readonly\n\t0x99:  0x42d05, // table\n\t0x9a:  0x61607, // summary\n\t0x9b:  0x12103, // wbr\n\t0x9c:  0x30a,   // radiogroup\n\t0x9d:  0x6c04,  // name\n\t0x9f:  0x62306, // system\n\t0xa1:  0x15d05, // color\n\t0xa2:  0x7f06,  // canvas\n\t0xa3:  0x25504, // html\n\t0xa5:  0x56f09, // onseeking\n\t0xac:  0x4f905, // shape\n\t0xad:  0x25f03, // rel\n\t0xae:  0x28510, // oncanplaythrough\n\t0xaf:  0x3760a, // ondragover\n\t0xb0:  0x62608, // template\n\t0xb1:  0x1d80d, // foreignObject\n\t0xb3:  0x9204,  // rows\n\t0xb6:  0x44e07, // listing\n\t0xb7:  0x49c06, // output\n\t0xb9:  0x3310b, // contextmenu\n\t0xbb:  0x11f03, // low\n\t0xbc:  0x1c602, // rp\n\t0xbd:  0x5bb09, // onsuspend\n\t0xbe:  0x13606, // button\n\t0xbf:  0x4db04, // desc\n\t0xc1:  0x4e207, // section\n\t0xc2:  0x52a0a, // onprogress\n\t0xc3:  0x59e09, // onstorage\n\t0xc4:  0x2d204, // math\n\t0xc5:  0x4503,  // alt\n\t0xc7:  0x8a02,  // ul\n\t0xc8:  0x5107,  // pattern\n\t0xc9:  0x4b60c, // onmousewheel\n\t0xca:  0x35709, // ondragend\n\t0xcb:  0xaf04,  // ruby\n\t0xcc:  0xc01,   // p\n\t0xcd:  0x31707, // onclose\n\t0xce:  0x24205, // meter\n\t0xcf:  0x11807, // bgsound\n\t0xd2:  0x25106, // height\n\t0xd4:  0x101,   // b\n\t0xd5:  0x2c308, // itemtype\n\t0xd8:  0x1bb07, // caption\n\t0xd9:  0x10c08, // disabled\n\t0xdb:  0x33808, // menuitem\n\t0xdc:  0x62003, // svg\n\t0xdd:  0x18f05, // small\n\t0xde:  0x44a04, // data\n\t0xe0:  0x4cb08, // ononline\n\t0xe1:  0x2a206, // mglyph\n\t0xe3:  0x6505,  // embed\n\t0xe4:  0x10502, // tr\n\t0xe5:  0x46b0b, // onloadstart\n\t0xe7:  0x3c306, // srcdoc\n\t0xeb:  0x5c408, // ontoggle\n\t0xed:  0xe703,  // bdo\n\t0xee:  0x4702,  // td\n\t0xef:  0x8305,  // aside\n\t0xf0:  0x29402, // h2\n\t0xf1:  0x52c08, // progress\n\t0xf2:  0x12c0a, // blockquote\n\t0xf4:  0xf005,  // label\n\t0xf5:  0x601,   // i\n\t0xf7:  0x9207,  // rowspan\n\t0xfb:  0x51709, // onplaying\n\t0xfd:  0x2a103, // img\n\t0xfe:  0xf608,  // optgroup\n\t0xff:  0x42307, // content\n\t0x101: 0x53e0c, // onratechange\n\t0x103: 0x3da0c, // onhashchange\n\t0x104: 0x4807,  // details\n\t0x106: 0x40008, // download\n\t0x109: 0x14009, // translate\n\t0x10b: 0x4230f, // contenteditable\n\t0x10d: 0x36b0b, // ondragleave\n\t0x10e: 0x2106,  // accept\n\t0x10f: 0x57a08, // selected\n\t0x112: 0x1f20a, // formaction\n\t0x113: 0x5b506, // center\n\t0x115: 0x45510, // onloadedmetadata\n\t0x116: 0x12804, // link\n\t0x117: 0xdd04,  // time\n\t0x118: 0x19f0b, // crossorigin\n\t0x119: 0x3bd07, // onfocus\n\t0x11a: 0x58704, // wrap\n\t0x11b: 0x42204, // icon\n\t0x11d: 0x28105, // video\n\t0x11e: 0x4de05, // class\n\t0x121: 0x5d40e, // onvolumechange\n\t0x122: 0xaa06,  // onblur\n\t0x123: 0x2b909, // itemscope\n\t0x124: 0x61105, // style\n\t0x127: 0x41e06, // public\n\t0x129: 0x2320e, // formnovalidate\n\t0x12a: 0x58206, // onshow\n\t0x12c: 0x51706, // onplay\n\t0x12d: 0x3c804, // cite\n\t0x12e: 0x2bc02, // ms\n\t0x12f: 0xdb0c,  // ontimeupdate\n\t0x130: 0x10904, // kind\n\t0x131: 0x2470a, // formtarget\n\t0x135: 0x3af07, // onended\n\t0x136: 0x26506, // hidden\n\t0x137: 0x2c01,  // s\n\t0x139: 0x2280a, // formmethod\n\t0x13a: 0x3e805, // input\n\t0x13c: 0x50b02, // h6\n\t0x13d: 0xc902,  // ol\n\t0x13e: 0x3420b, // oncuechange\n\t0x13f: 0x1e50d, // foreignobject\n\t0x143: 0x4e70e, // onbeforeunload\n\t0x144: 0x2bd05, // scope\n\t0x145: 0x39609, // onemptied\n\t0x146: 0x14b05, // defer\n\t0x147: 0xc103,  // xmp\n\t0x148: 0x39f10, // ondurationchange\n\t0x149: 0x1903,  // kbd\n\t0x14c: 0x47609, // onmessage\n\t0x14d: 0x60006, // option\n\t0x14e: 0x2eb09, // minlength\n\t0x14f: 0x32807, // checked\n\t0x150: 0xce08,  // autoplay\n\t0x152: 0x202,   // br\n\t0x153: 0x2360a, // novalidate\n\t0x156: 0x6307,  // noembed\n\t0x159: 0x31007, // onclick\n\t0x15a: 0x47f0b, // onmousedown\n\t0x15b: 0x3a708, // onchange\n\t0x15e: 0x3f209, // oninvalid\n\t0x15f: 0x2bd06, // scoped\n\t0x160: 0x18808, // controls\n\t0x161: 0x30b05, // muted\n\t0x162: 0x58d08, // sortable\n\t0x163: 0x51106, // usemap\n\t0x164: 0x1b80a, // figcaption\n\t0x165: 0x35706, // ondrag\n\t0x166: 0x26b04, // high\n\t0x168: 0x3c303, // src\n\t0x169: 0x15706, // poster\n\t0x16b: 0x1670e, // annotation-xml\n\t0x16c: 0x5f704, // step\n\t0x16d: 0x4,     // abbr\n\t0x16e: 0x1b06,  // dialog\n\t0x170: 0x1202,  // li\n\t0x172: 0x3ed02, // mo\n\t0x175: 0x1d803, // for\n\t0x176: 0x1a803, // ins\n\t0x178: 0x55504, // size\n\t0x179: 0x43210, // onlanguagechange\n\t0x17a: 0x8607,  // default\n\t0x17b: 0x1a03,  // bdi\n\t0x17c: 0x4d30a, // onpagehide\n\t0x17d: 0x6907,  // dirname\n\t0x17e: 0x21404, // type\n\t0x17f: 0x1f204, // form\n\t0x181: 0x28509, // oncanplay\n\t0x182: 0x6103,  // dfn\n\t0x183: 0x46308, // tabindex\n\t0x186: 0x6502,  // em\n\t0x187: 0x27404, // lang\n\t0x189: 0x39108, // dropzone\n\t0x18a: 0x4080a, // onkeypress\n\t0x18b: 0x23c08, // datetime\n\t0x18c: 0x16204, // cols\n\t0x18d: 0x1,     // a\n\t0x18e: 0x4420c, // onloadeddata\n\t0x190: 0xa605,  // audio\n\t0x192: 0x2e05,  // tbody\n\t0x193: 0x22c06, // method\n\t0x195: 0xf404,  // loop\n\t0x196: 0x29606, // iframe\n\t0x198: 0x2d504, // head\n\t0x19e: 0x5f108, // manifest\n\t0x19f: 0xb309,  // autofocus\n\t0x1a0: 0x14904, // code\n\t0x1a1: 0x55906, // strong\n\t0x1a2: 0x30308, // multiple\n\t0x1a3: 0xc05,   // param\n\t0x1a6: 0x21107, // enctype\n\t0x1a7: 0x5b304, // face\n\t0x1a8: 0xfd09,  // plaintext\n\t0x1a9: 0x26e02, // h1\n\t0x1aa: 0x59509, // onstalled\n\t0x1ad: 0x3d406, // script\n\t0x1ae: 0x2db06, // spacer\n\t0x1af: 0x55108, // onresize\n\t0x1b0: 0x4a20b, // onmouseover\n\t0x1b1: 0x5cc08, // onunload\n\t0x1b2: 0x56708, // onseeked\n\t0x1b4: 0x2140d, // typemustmatch\n\t0x1b5: 0x1cc06, // figure\n\t0x1b6: 0x4950a, // onmouseout\n\t0x1b7: 0x25e03, // pre\n\t0x1b8: 0x50705, // width\n\t0x1b9: 0x19906, // sorted\n\t0x1bb: 0x5704,  // nobr\n\t0x1be: 0x5302,  // tt\n\t0x1bf: 0x1105,  // align\n\t0x1c0: 0x3e607, // oninput\n\t0x1c3: 0x41807, // onkeyup\n\t0x1c6: 0x1c00c, // onafterprint\n\t0x1c7: 0x210e,  // accept-charset\n\t0x1c8: 0x33c06, // itemid\n\t0x1c9: 0x3e809, // inputmode\n\t0x1cb: 0x53306, // strike\n\t0x1cc: 0x5a903, // sub\n\t0x1cd: 0x10505, // track\n\t0x1ce: 0x38605, // start\n\t0x1d0: 0xd608,  // basefont\n\t0x1d6: 0x1aa06, // source\n\t0x1d7: 0x18206, // legend\n\t0x1d8: 0x2d405, // thead\n\t0x1da: 0x8c05,  // tfoot\n\t0x1dd: 0x1ec06, // object\n\t0x1de: 0x6e05,  // media\n\t0x1df: 0x1670a, // annotation\n\t0x1e0: 0x20d0b, // formenctype\n\t0x1e2: 0x3d208, // noscript\n\t0x1e4: 0x55505, // sizes\n\t0x1e5: 0x1fc0c, // autocomplete\n\t0x1e6: 0x9504,  // span\n\t0x1e7: 0x9808,  // noframes\n\t0x1e8: 0x24b06, // target\n\t0x1e9: 0x38f06, // ondrop\n\t0x1ea: 0x2b306, // applet\n\t0x1ec: 0x5a08,  // reversed\n\t0x1f0: 0x2a907, // isindex\n\t0x1f3: 0x27008, // hreflang\n\t0x1f5: 0x2f302, // h5\n\t0x1f6: 0x4f307, // address\n\t0x1fa: 0x2e103, // max\n\t0x1fb: 0xc30b,  // placeholder\n\t0x1fc: 0x2f608, // textarea\n\t0x1fe: 0x4ad09, // onmouseup\n\t0x1ff: 0x3800b, // ondragstart\n}\n\nconst atomText = \"abbradiogrouparamalignmarkbdialogaccept-charsetbodyaccesskey\" +\n\t\"genavaluealtdetailsampatternobreversedfnoembedirnamediagroup\" +\n\t\"ingasyncanvasidefaultfooterowspanoframesetitleaudionblurubya\" +\n\t\"utofocusandboxmplaceholderautoplaybasefontimeupdatebdoncance\" +\n\t\"labelooptgrouplaintextrackindisabledivarbgsoundlowbrbigblink\" +\n\t\"blockquotebuttonabortranslatecodefercolgroupostercolorcolspa\" +\n\t\"nnotation-xmlcommandraggablegendcontrolsmallcoordsortedcross\" +\n\t\"originsourcefieldsetfigcaptionafterprintfigurequiredforeignO\" +\n\t\"bjectforeignobjectformactionautocompleteerrorformenctypemust\" +\n\t\"matchallengeformmethodformnovalidatetimeterformtargetheightm\" +\n\t\"lhgroupreloadhiddenhigh1hreflanghttp-equivideoncanplaythroug\" +\n\t\"h2iframeimageimglyph3isindexismappletitemscopeditemtypemarqu\" +\n\t\"eematheaderspacermaxlength4minlength5mtextareadonlymultiplem\" +\n\t\"utedonclickoncloseamlesspellcheckedoncontextmenuitemidoncuec\" +\n\t\"hangeondblclickondragendondragenterondragleaveondragoverondr\" +\n\t\"agstarticleondropzonemptiedondurationchangeonendedonerroronf\" +\n\t\"ocusrcdocitempropenoscriptonhashchangeoninputmodeloninvalido\" +\n\t\"nkeydownloadonkeypressrclangonkeyupublicontenteditableonlang\" +\n\t\"uagechangeonloadeddatalistingonloadedmetadatabindexonloadsta\" +\n\t\"rtonmessageonmousedownonmousemoveonmouseoutputonmouseoveronm\" +\n\t\"ouseuponmousewheelonofflineononlineonpagehidesclassectionbef\" +\n\t\"oreunloaddresshapeonpageshowidth6onpausemaponplayingonpopsta\" +\n\t\"teonprogresstrikeytypeonratechangeonresetonresizestrongonscr\" +\n\t\"ollonseekedonseekingonselectedonshowraponsortableonstalledon\" +\n\t\"storageonsubmitemrefacenteronsuspendontoggleonunloadonvolume\" +\n\t\"changeonwaitingoptimumanifestepromptoptionbeforeprintstylesu\" +\n\t\"mmarysupsvgsystemplate\"\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/charset/charset.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package charset provides common text encodings for HTML documents.\n//\n// The mapping from encoding labels to encodings is defined at\n// https://encoding.spec.whatwg.org/.\npackage charset // import \"golang.org/x/net/html/charset\"\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime\"\n\t\"strings\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/net/html\"\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/charmap\"\n\t\"golang.org/x/text/encoding/htmlindex\"\n\t\"golang.org/x/text/transform\"\n)\n\n// Lookup returns the encoding with the specified label, and its canonical\n// name. It returns nil and the empty string if label is not one of the\n// standard encodings for HTML. Matching is case-insensitive and ignores\n// leading and trailing whitespace. Encoders will use HTML escape sequences for\n// runes that are not supported by the character set.\nfunc Lookup(label string) (e encoding.Encoding, name string) {\n\te, err := htmlindex.Get(label)\n\tif err != nil {\n\t\treturn nil, \"\"\n\t}\n\tname, _ = htmlindex.Name(e)\n\treturn &htmlEncoding{e}, name\n}\n\ntype htmlEncoding struct{ encoding.Encoding }\n\nfunc (h *htmlEncoding) NewEncoder() *encoding.Encoder {\n\t// HTML requires a non-terminating legacy encoder. We use HTML escapes to\n\t// substitute unsupported code points.\n\treturn encoding.HTMLEscapeUnsupported(h.Encoding.NewEncoder())\n}\n\n// DetermineEncoding determines the encoding of an HTML document by examining\n// up to the first 1024 bytes of content and the declared Content-Type.\n//\n// See http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#determining-the-character-encoding\nfunc DetermineEncoding(content []byte, contentType string) (e encoding.Encoding, name string, certain bool) {\n\tif len(content) > 1024 {\n\t\tcontent = content[:1024]\n\t}\n\n\tfor _, b := range boms {\n\t\tif bytes.HasPrefix(content, b.bom) {\n\t\t\te, name = Lookup(b.enc)\n\t\t\treturn e, name, true\n\t\t}\n\t}\n\n\tif _, params, err := mime.ParseMediaType(contentType); err == nil {\n\t\tif cs, ok := params[\"charset\"]; ok {\n\t\t\tif e, name = Lookup(cs); e != nil {\n\t\t\t\treturn e, name, true\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(content) > 0 {\n\t\te, name = prescan(content)\n\t\tif e != nil {\n\t\t\treturn e, name, false\n\t\t}\n\t}\n\n\t// Try to detect UTF-8.\n\t// First eliminate any partial rune at the end.\n\tfor i := len(content) - 1; i >= 0 && i > len(content)-4; i-- {\n\t\tb := content[i]\n\t\tif b < 0x80 {\n\t\t\tbreak\n\t\t}\n\t\tif utf8.RuneStart(b) {\n\t\t\tcontent = content[:i]\n\t\t\tbreak\n\t\t}\n\t}\n\thasHighBit := false\n\tfor _, c := range content {\n\t\tif c >= 0x80 {\n\t\t\thasHighBit = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif hasHighBit && utf8.Valid(content) {\n\t\treturn encoding.Nop, \"utf-8\", false\n\t}\n\n\t// TODO: change default depending on user's locale?\n\treturn charmap.Windows1252, \"windows-1252\", false\n}\n\n// NewReader returns an io.Reader that converts the content of r to UTF-8.\n// It calls DetermineEncoding to find out what r's encoding is.\nfunc NewReader(r io.Reader, contentType string) (io.Reader, error) {\n\tpreview := make([]byte, 1024)\n\tn, err := io.ReadFull(r, preview)\n\tswitch {\n\tcase err == io.ErrUnexpectedEOF:\n\t\tpreview = preview[:n]\n\t\tr = bytes.NewReader(preview)\n\tcase err != nil:\n\t\treturn nil, err\n\tdefault:\n\t\tr = io.MultiReader(bytes.NewReader(preview), r)\n\t}\n\n\tif e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop {\n\t\tr = transform.NewReader(r, e.NewDecoder())\n\t}\n\treturn r, nil\n}\n\n// NewReaderLabel returns a reader that converts from the specified charset to\n// UTF-8. It uses Lookup to find the encoding that corresponds to label, and\n// returns an error if Lookup returns nil. It is suitable for use as\n// encoding/xml.Decoder's CharsetReader function.\nfunc NewReaderLabel(label string, input io.Reader) (io.Reader, error) {\n\te, _ := Lookup(label)\n\tif e == nil {\n\t\treturn nil, fmt.Errorf(\"unsupported charset: %q\", label)\n\t}\n\treturn transform.NewReader(input, e.NewDecoder()), nil\n}\n\nfunc prescan(content []byte) (e encoding.Encoding, name string) {\n\tz := html.NewTokenizer(bytes.NewReader(content))\n\tfor {\n\t\tswitch z.Next() {\n\t\tcase html.ErrorToken:\n\t\t\treturn nil, \"\"\n\n\t\tcase html.StartTagToken, html.SelfClosingTagToken:\n\t\t\ttagName, hasAttr := z.TagName()\n\t\t\tif !bytes.Equal(tagName, []byte(\"meta\")) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tattrList := make(map[string]bool)\n\t\t\tgotPragma := false\n\n\t\t\tconst (\n\t\t\t\tdontKnow = iota\n\t\t\t\tdoNeedPragma\n\t\t\t\tdoNotNeedPragma\n\t\t\t)\n\t\t\tneedPragma := dontKnow\n\n\t\t\tname = \"\"\n\t\t\te = nil\n\t\t\tfor hasAttr {\n\t\t\t\tvar key, val []byte\n\t\t\t\tkey, val, hasAttr = z.TagAttr()\n\t\t\t\tks := string(key)\n\t\t\t\tif attrList[ks] {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tattrList[ks] = true\n\t\t\t\tfor i, c := range val {\n\t\t\t\t\tif 'A' <= c && c <= 'Z' {\n\t\t\t\t\t\tval[i] = c + 0x20\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch ks {\n\t\t\t\tcase \"http-equiv\":\n\t\t\t\t\tif bytes.Equal(val, []byte(\"content-type\")) {\n\t\t\t\t\t\tgotPragma = true\n\t\t\t\t\t}\n\n\t\t\t\tcase \"content\":\n\t\t\t\t\tif e == nil {\n\t\t\t\t\t\tname = fromMetaElement(string(val))\n\t\t\t\t\t\tif name != \"\" {\n\t\t\t\t\t\t\te, name = Lookup(name)\n\t\t\t\t\t\t\tif e != nil {\n\t\t\t\t\t\t\t\tneedPragma = doNeedPragma\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\tcase \"charset\":\n\t\t\t\t\te, name = Lookup(string(val))\n\t\t\t\t\tneedPragma = doNotNeedPragma\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif strings.HasPrefix(name, \"utf-16\") {\n\t\t\t\tname = \"utf-8\"\n\t\t\t\te = encoding.Nop\n\t\t\t}\n\n\t\t\tif e != nil {\n\t\t\t\treturn e, name\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc fromMetaElement(s string) string {\n\tfor s != \"\" {\n\t\tcsLoc := strings.Index(s, \"charset\")\n\t\tif csLoc == -1 {\n\t\t\treturn \"\"\n\t\t}\n\t\ts = s[csLoc+len(\"charset\"):]\n\t\ts = strings.TrimLeft(s, \" \\t\\n\\f\\r\")\n\t\tif !strings.HasPrefix(s, \"=\") {\n\t\t\tcontinue\n\t\t}\n\t\ts = s[1:]\n\t\ts = strings.TrimLeft(s, \" \\t\\n\\f\\r\")\n\t\tif s == \"\" {\n\t\t\treturn \"\"\n\t\t}\n\t\tif q := s[0]; q == '\"' || q == '\\'' {\n\t\t\ts = s[1:]\n\t\t\tcloseQuote := strings.IndexRune(s, rune(q))\n\t\t\tif closeQuote == -1 {\n\t\t\t\treturn \"\"\n\t\t\t}\n\t\t\treturn s[:closeQuote]\n\t\t}\n\n\t\tend := strings.IndexAny(s, \"; \\t\\n\\f\\r\")\n\t\tif end == -1 {\n\t\t\tend = len(s)\n\t\t}\n\t\treturn s[:end]\n\t}\n\treturn \"\"\n}\n\nvar boms = []struct {\n\tbom []byte\n\tenc string\n}{\n\t{[]byte{0xfe, 0xff}, \"utf-16be\"},\n\t{[]byte{0xff, 0xfe}, \"utf-16le\"},\n\t{[]byte{0xef, 0xbb, 0xbf}, \"utf-8\"},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/const.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\n// Section 12.2.3.2 of the HTML5 specification says \"The following elements\n// have varying levels of special parsing rules\".\n// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements\nvar isSpecialElementMap = map[string]bool{\n\t\"address\":    true,\n\t\"applet\":     true,\n\t\"area\":       true,\n\t\"article\":    true,\n\t\"aside\":      true,\n\t\"base\":       true,\n\t\"basefont\":   true,\n\t\"bgsound\":    true,\n\t\"blockquote\": true,\n\t\"body\":       true,\n\t\"br\":         true,\n\t\"button\":     true,\n\t\"caption\":    true,\n\t\"center\":     true,\n\t\"col\":        true,\n\t\"colgroup\":   true,\n\t\"dd\":         true,\n\t\"details\":    true,\n\t\"dir\":        true,\n\t\"div\":        true,\n\t\"dl\":         true,\n\t\"dt\":         true,\n\t\"embed\":      true,\n\t\"fieldset\":   true,\n\t\"figcaption\": true,\n\t\"figure\":     true,\n\t\"footer\":     true,\n\t\"form\":       true,\n\t\"frame\":      true,\n\t\"frameset\":   true,\n\t\"h1\":         true,\n\t\"h2\":         true,\n\t\"h3\":         true,\n\t\"h4\":         true,\n\t\"h5\":         true,\n\t\"h6\":         true,\n\t\"head\":       true,\n\t\"header\":     true,\n\t\"hgroup\":     true,\n\t\"hr\":         true,\n\t\"html\":       true,\n\t\"iframe\":     true,\n\t\"img\":        true,\n\t\"input\":      true,\n\t\"isindex\":    true,\n\t\"li\":         true,\n\t\"link\":       true,\n\t\"listing\":    true,\n\t\"marquee\":    true,\n\t\"menu\":       true,\n\t\"meta\":       true,\n\t\"nav\":        true,\n\t\"noembed\":    true,\n\t\"noframes\":   true,\n\t\"noscript\":   true,\n\t\"object\":     true,\n\t\"ol\":         true,\n\t\"p\":          true,\n\t\"param\":      true,\n\t\"plaintext\":  true,\n\t\"pre\":        true,\n\t\"script\":     true,\n\t\"section\":    true,\n\t\"select\":     true,\n\t\"source\":     true,\n\t\"style\":      true,\n\t\"summary\":    true,\n\t\"table\":      true,\n\t\"tbody\":      true,\n\t\"td\":         true,\n\t\"template\":   true,\n\t\"textarea\":   true,\n\t\"tfoot\":      true,\n\t\"th\":         true,\n\t\"thead\":      true,\n\t\"title\":      true,\n\t\"tr\":         true,\n\t\"track\":      true,\n\t\"ul\":         true,\n\t\"wbr\":        true,\n\t\"xmp\":        true,\n}\n\nfunc isSpecialElement(element *Node) bool {\n\tswitch element.Namespace {\n\tcase \"\", \"html\":\n\t\treturn isSpecialElementMap[element.Data]\n\tcase \"svg\":\n\t\treturn element.Data == \"foreignObject\"\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/doc.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n/*\nPackage html implements an HTML5-compliant tokenizer and parser.\n\nTokenization is done by creating a Tokenizer for an io.Reader r. It is the\ncaller's responsibility to ensure that r provides UTF-8 encoded HTML.\n\n\tz := html.NewTokenizer(r)\n\nGiven a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(),\nwhich parses the next token and returns its type, or an error:\n\n\tfor {\n\t\ttt := z.Next()\n\t\tif tt == html.ErrorToken {\n\t\t\t// ...\n\t\t\treturn ...\n\t\t}\n\t\t// Process the current token.\n\t}\n\nThere are two APIs for retrieving the current token. The high-level API is to\ncall Token; the low-level API is to call Text or TagName / TagAttr. Both APIs\nallow optionally calling Raw after Next but before Token, Text, TagName, or\nTagAttr. In EBNF notation, the valid call sequence per token is:\n\n\tNext {Raw} [ Token | Text | TagName {TagAttr} ]\n\nToken returns an independent data structure that completely describes a token.\nEntities (such as \"&lt;\") are unescaped, tag names and attribute keys are\nlower-cased, and attributes are collected into a []Attribute. For example:\n\n\tfor {\n\t\tif z.Next() == html.ErrorToken {\n\t\t\t// Returning io.EOF indicates success.\n\t\t\treturn z.Err()\n\t\t}\n\t\temitToken(z.Token())\n\t}\n\nThe low-level API performs fewer allocations and copies, but the contents of\nthe []byte values returned by Text, TagName and TagAttr may change on the next\ncall to Next. For example, to extract an HTML page's anchor text:\n\n\tdepth := 0\n\tfor {\n\t\ttt := z.Next()\n\t\tswitch tt {\n\t\tcase ErrorToken:\n\t\t\treturn z.Err()\n\t\tcase TextToken:\n\t\t\tif depth > 0 {\n\t\t\t\t// emitBytes should copy the []byte it receives,\n\t\t\t\t// if it doesn't process it immediately.\n\t\t\t\temitBytes(z.Text())\n\t\t\t}\n\t\tcase StartTagToken, EndTagToken:\n\t\t\ttn, _ := z.TagName()\n\t\t\tif len(tn) == 1 && tn[0] == 'a' {\n\t\t\t\tif tt == StartTagToken {\n\t\t\t\t\tdepth++\n\t\t\t\t} else {\n\t\t\t\t\tdepth--\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nParsing is done by calling Parse with an io.Reader, which returns the root of\nthe parse tree (the document element) as a *Node. It is the caller's\nresponsibility to ensure that the Reader provides UTF-8 encoded HTML. For\nexample, to process each anchor node in depth-first order:\n\n\tdoc, err := html.Parse(r)\n\tif err != nil {\n\t\t// ...\n\t}\n\tvar f func(*html.Node)\n\tf = func(n *html.Node) {\n\t\tif n.Type == html.ElementNode && n.Data == \"a\" {\n\t\t\t// Do something with n...\n\t\t}\n\t\tfor c := n.FirstChild; c != nil; c = c.NextSibling {\n\t\t\tf(c)\n\t\t}\n\t}\n\tf(doc)\n\nThe relevant specifications include:\nhttps://html.spec.whatwg.org/multipage/syntax.html and\nhttps://html.spec.whatwg.org/multipage/syntax.html#tokenization\n*/\npackage html // import \"golang.org/x/net/html\"\n\n// The tokenization algorithm implemented by this package is not a line-by-line\n// transliteration of the relatively verbose state-machine in the WHATWG\n// specification. A more direct approach is used instead, where the program\n// counter implies the state, such as whether it is tokenizing a tag or a text\n// node. Specification compliance is verified by checking expected and actual\n// outputs over a test suite rather than aiming for algorithmic fidelity.\n\n// TODO(nigeltao): Does a DOM API belong in this package or a separate one?\n// TODO(nigeltao): How does parsing interact with a JavaScript engine?\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/doctype.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\nimport (\n\t\"strings\"\n)\n\n// parseDoctype parses the data from a DoctypeToken into a name,\n// public identifier, and system identifier. It returns a Node whose Type\n// is DoctypeNode, whose Data is the name, and which has attributes\n// named \"system\" and \"public\" for the two identifiers if they were present.\n// quirks is whether the document should be parsed in \"quirks mode\".\nfunc parseDoctype(s string) (n *Node, quirks bool) {\n\tn = &Node{Type: DoctypeNode}\n\n\t// Find the name.\n\tspace := strings.IndexAny(s, whitespace)\n\tif space == -1 {\n\t\tspace = len(s)\n\t}\n\tn.Data = s[:space]\n\t// The comparison to \"html\" is case-sensitive.\n\tif n.Data != \"html\" {\n\t\tquirks = true\n\t}\n\tn.Data = strings.ToLower(n.Data)\n\ts = strings.TrimLeft(s[space:], whitespace)\n\n\tif len(s) < 6 {\n\t\t// It can't start with \"PUBLIC\" or \"SYSTEM\".\n\t\t// Ignore the rest of the string.\n\t\treturn n, quirks || s != \"\"\n\t}\n\n\tkey := strings.ToLower(s[:6])\n\ts = s[6:]\n\tfor key == \"public\" || key == \"system\" {\n\t\ts = strings.TrimLeft(s, whitespace)\n\t\tif s == \"\" {\n\t\t\tbreak\n\t\t}\n\t\tquote := s[0]\n\t\tif quote != '\"' && quote != '\\'' {\n\t\t\tbreak\n\t\t}\n\t\ts = s[1:]\n\t\tq := strings.IndexRune(s, rune(quote))\n\t\tvar id string\n\t\tif q == -1 {\n\t\t\tid = s\n\t\t\ts = \"\"\n\t\t} else {\n\t\t\tid = s[:q]\n\t\t\ts = s[q+1:]\n\t\t}\n\t\tn.Attr = append(n.Attr, Attribute{Key: key, Val: id})\n\t\tif key == \"public\" {\n\t\t\tkey = \"system\"\n\t\t} else {\n\t\t\tkey = \"\"\n\t\t}\n\t}\n\n\tif key != \"\" || s != \"\" {\n\t\tquirks = true\n\t} else if len(n.Attr) > 0 {\n\t\tif n.Attr[0].Key == \"public\" {\n\t\t\tpublic := strings.ToLower(n.Attr[0].Val)\n\t\t\tswitch public {\n\t\t\tcase \"-//w3o//dtd w3 html strict 3.0//en//\", \"-/w3d/dtd html 4.0 transitional/en\", \"html\":\n\t\t\t\tquirks = true\n\t\t\tdefault:\n\t\t\t\tfor _, q := range quirkyIDs {\n\t\t\t\t\tif strings.HasPrefix(public, q) {\n\t\t\t\t\t\tquirks = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// The following two public IDs only cause quirks mode if there is no system ID.\n\t\t\tif len(n.Attr) == 1 && (strings.HasPrefix(public, \"-//w3c//dtd html 4.01 frameset//\") ||\n\t\t\t\tstrings.HasPrefix(public, \"-//w3c//dtd html 4.01 transitional//\")) {\n\t\t\t\tquirks = true\n\t\t\t}\n\t\t}\n\t\tif lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == \"system\" &&\n\t\t\tstrings.ToLower(lastAttr.Val) == \"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd\" {\n\t\t\tquirks = true\n\t\t}\n\t}\n\n\treturn n, quirks\n}\n\n// quirkyIDs is a list of public doctype identifiers that cause a document\n// to be interpreted in quirks mode. The identifiers should be in lower case.\nvar quirkyIDs = []string{\n\t\"+//silmaril//dtd html pro v0r11 19970101//\",\n\t\"-//advasoft ltd//dtd html 3.0 aswedit + extensions//\",\n\t\"-//as//dtd html 3.0 aswedit + extensions//\",\n\t\"-//ietf//dtd html 2.0 level 1//\",\n\t\"-//ietf//dtd html 2.0 level 2//\",\n\t\"-//ietf//dtd html 2.0 strict level 1//\",\n\t\"-//ietf//dtd html 2.0 strict level 2//\",\n\t\"-//ietf//dtd html 2.0 strict//\",\n\t\"-//ietf//dtd html 2.0//\",\n\t\"-//ietf//dtd html 2.1e//\",\n\t\"-//ietf//dtd html 3.0//\",\n\t\"-//ietf//dtd html 3.2 final//\",\n\t\"-//ietf//dtd html 3.2//\",\n\t\"-//ietf//dtd html 3//\",\n\t\"-//ietf//dtd html level 0//\",\n\t\"-//ietf//dtd html level 1//\",\n\t\"-//ietf//dtd html level 2//\",\n\t\"-//ietf//dtd html level 3//\",\n\t\"-//ietf//dtd html strict level 0//\",\n\t\"-//ietf//dtd html strict level 1//\",\n\t\"-//ietf//dtd html strict level 2//\",\n\t\"-//ietf//dtd html strict level 3//\",\n\t\"-//ietf//dtd html strict//\",\n\t\"-//ietf//dtd html//\",\n\t\"-//metrius//dtd metrius presentational//\",\n\t\"-//microsoft//dtd internet explorer 2.0 html strict//\",\n\t\"-//microsoft//dtd internet explorer 2.0 html//\",\n\t\"-//microsoft//dtd internet explorer 2.0 tables//\",\n\t\"-//microsoft//dtd internet explorer 3.0 html strict//\",\n\t\"-//microsoft//dtd internet explorer 3.0 html//\",\n\t\"-//microsoft//dtd internet explorer 3.0 tables//\",\n\t\"-//netscape comm. corp.//dtd html//\",\n\t\"-//netscape comm. corp.//dtd strict html//\",\n\t\"-//o'reilly and associates//dtd html 2.0//\",\n\t\"-//o'reilly and associates//dtd html extended 1.0//\",\n\t\"-//o'reilly and associates//dtd html extended relaxed 1.0//\",\n\t\"-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//\",\n\t\"-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//\",\n\t\"-//spyglass//dtd html 2.0 extended//\",\n\t\"-//sq//dtd html 2.0 hotmetal + extensions//\",\n\t\"-//sun microsystems corp.//dtd hotjava html//\",\n\t\"-//sun microsystems corp.//dtd hotjava strict html//\",\n\t\"-//w3c//dtd html 3 1995-03-24//\",\n\t\"-//w3c//dtd html 3.2 draft//\",\n\t\"-//w3c//dtd html 3.2 final//\",\n\t\"-//w3c//dtd html 3.2//\",\n\t\"-//w3c//dtd html 3.2s draft//\",\n\t\"-//w3c//dtd html 4.0 frameset//\",\n\t\"-//w3c//dtd html 4.0 transitional//\",\n\t\"-//w3c//dtd html experimental 19960712//\",\n\t\"-//w3c//dtd html experimental 970421//\",\n\t\"-//w3c//dtd w3 html//\",\n\t\"-//w3o//dtd w3 html 3.0//\",\n\t\"-//webtechs//dtd mozilla html 2.0//\",\n\t\"-//webtechs//dtd mozilla html//\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/entity.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\n// All entities that do not end with ';' are 6 or fewer bytes long.\nconst longestEntityWithoutSemicolon = 6\n\n// entity is a map from HTML entity names to their values. The semicolon matters:\n// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references\n// lists both \"amp\" and \"amp;\" as two separate entries.\n//\n// Note that the HTML5 list is larger than the HTML4 list at\n// http://www.w3.org/TR/html4/sgml/entities.html\nvar entity = map[string]rune{\n\t\"AElig;\":                           '\\U000000C6',\n\t\"AMP;\":                             '\\U00000026',\n\t\"Aacute;\":                          '\\U000000C1',\n\t\"Abreve;\":                          '\\U00000102',\n\t\"Acirc;\":                           '\\U000000C2',\n\t\"Acy;\":                             '\\U00000410',\n\t\"Afr;\":                             '\\U0001D504',\n\t\"Agrave;\":                          '\\U000000C0',\n\t\"Alpha;\":                           '\\U00000391',\n\t\"Amacr;\":                           '\\U00000100',\n\t\"And;\":                             '\\U00002A53',\n\t\"Aogon;\":                           '\\U00000104',\n\t\"Aopf;\":                            '\\U0001D538',\n\t\"ApplyFunction;\":                   '\\U00002061',\n\t\"Aring;\":                           '\\U000000C5',\n\t\"Ascr;\":                            '\\U0001D49C',\n\t\"Assign;\":                          '\\U00002254',\n\t\"Atilde;\":                          '\\U000000C3',\n\t\"Auml;\":                            '\\U000000C4',\n\t\"Backslash;\":                       '\\U00002216',\n\t\"Barv;\":                            '\\U00002AE7',\n\t\"Barwed;\":                          '\\U00002306',\n\t\"Bcy;\":                             '\\U00000411',\n\t\"Because;\":                         '\\U00002235',\n\t\"Bernoullis;\":                      '\\U0000212C',\n\t\"Beta;\":                            '\\U00000392',\n\t\"Bfr;\":                             '\\U0001D505',\n\t\"Bopf;\":                            '\\U0001D539',\n\t\"Breve;\":                           '\\U000002D8',\n\t\"Bscr;\":                            '\\U0000212C',\n\t\"Bumpeq;\":                          '\\U0000224E',\n\t\"CHcy;\":                            '\\U00000427',\n\t\"COPY;\":                            '\\U000000A9',\n\t\"Cacute;\":                          '\\U00000106',\n\t\"Cap;\":                             '\\U000022D2',\n\t\"CapitalDifferentialD;\":            '\\U00002145',\n\t\"Cayleys;\":                         '\\U0000212D',\n\t\"Ccaron;\":                          '\\U0000010C',\n\t\"Ccedil;\":                          '\\U000000C7',\n\t\"Ccirc;\":                           '\\U00000108',\n\t\"Cconint;\":                         '\\U00002230',\n\t\"Cdot;\":                            '\\U0000010A',\n\t\"Cedilla;\":                         '\\U000000B8',\n\t\"CenterDot;\":                       '\\U000000B7',\n\t\"Cfr;\":                             '\\U0000212D',\n\t\"Chi;\":                             '\\U000003A7',\n\t\"CircleDot;\":                       '\\U00002299',\n\t\"CircleMinus;\":                     '\\U00002296',\n\t\"CirclePlus;\":                      '\\U00002295',\n\t\"CircleTimes;\":                     '\\U00002297',\n\t\"ClockwiseContourIntegral;\":        '\\U00002232',\n\t\"CloseCurlyDoubleQuote;\":           '\\U0000201D',\n\t\"CloseCurlyQuote;\":                 '\\U00002019',\n\t\"Colon;\":                           '\\U00002237',\n\t\"Colone;\":                          '\\U00002A74',\n\t\"Congruent;\":                       '\\U00002261',\n\t\"Conint;\":                          '\\U0000222F',\n\t\"ContourIntegral;\":                 '\\U0000222E',\n\t\"Copf;\":                            '\\U00002102',\n\t\"Coproduct;\":                       '\\U00002210',\n\t\"CounterClockwiseContourIntegral;\": '\\U00002233',\n\t\"Cross;\":                    '\\U00002A2F',\n\t\"Cscr;\":                     '\\U0001D49E',\n\t\"Cup;\":                      '\\U000022D3',\n\t\"CupCap;\":                   '\\U0000224D',\n\t\"DD;\":                       '\\U00002145',\n\t\"DDotrahd;\":                 '\\U00002911',\n\t\"DJcy;\":                     '\\U00000402',\n\t\"DScy;\":                     '\\U00000405',\n\t\"DZcy;\":                     '\\U0000040F',\n\t\"Dagger;\":                   '\\U00002021',\n\t\"Darr;\":                     '\\U000021A1',\n\t\"Dashv;\":                    '\\U00002AE4',\n\t\"Dcaron;\":                   '\\U0000010E',\n\t\"Dcy;\":                      '\\U00000414',\n\t\"Del;\":                      '\\U00002207',\n\t\"Delta;\":                    '\\U00000394',\n\t\"Dfr;\":                      '\\U0001D507',\n\t\"DiacriticalAcute;\":         '\\U000000B4',\n\t\"DiacriticalDot;\":           '\\U000002D9',\n\t\"DiacriticalDoubleAcute;\":   '\\U000002DD',\n\t\"DiacriticalGrave;\":         '\\U00000060',\n\t\"DiacriticalTilde;\":         '\\U000002DC',\n\t\"Diamond;\":                  '\\U000022C4',\n\t\"DifferentialD;\":            '\\U00002146',\n\t\"Dopf;\":                     '\\U0001D53B',\n\t\"Dot;\":                      '\\U000000A8',\n\t\"DotDot;\":                   '\\U000020DC',\n\t\"DotEqual;\":                 '\\U00002250',\n\t\"DoubleContourIntegral;\":    '\\U0000222F',\n\t\"DoubleDot;\":                '\\U000000A8',\n\t\"DoubleDownArrow;\":          '\\U000021D3',\n\t\"DoubleLeftArrow;\":          '\\U000021D0',\n\t\"DoubleLeftRightArrow;\":     '\\U000021D4',\n\t\"DoubleLeftTee;\":            '\\U00002AE4',\n\t\"DoubleLongLeftArrow;\":      '\\U000027F8',\n\t\"DoubleLongLeftRightArrow;\": '\\U000027FA',\n\t\"DoubleLongRightArrow;\":     '\\U000027F9',\n\t\"DoubleRightArrow;\":         '\\U000021D2',\n\t\"DoubleRightTee;\":           '\\U000022A8',\n\t\"DoubleUpArrow;\":            '\\U000021D1',\n\t\"DoubleUpDownArrow;\":        '\\U000021D5',\n\t\"DoubleVerticalBar;\":        '\\U00002225',\n\t\"DownArrow;\":                '\\U00002193',\n\t\"DownArrowBar;\":             '\\U00002913',\n\t\"DownArrowUpArrow;\":         '\\U000021F5',\n\t\"DownBreve;\":                '\\U00000311',\n\t\"DownLeftRightVector;\":      '\\U00002950',\n\t\"DownLeftTeeVector;\":        '\\U0000295E',\n\t\"DownLeftVector;\":           '\\U000021BD',\n\t\"DownLeftVectorBar;\":        '\\U00002956',\n\t\"DownRightTeeVector;\":       '\\U0000295F',\n\t\"DownRightVector;\":          '\\U000021C1',\n\t\"DownRightVectorBar;\":       '\\U00002957',\n\t\"DownTee;\":                  '\\U000022A4',\n\t\"DownTeeArrow;\":             '\\U000021A7',\n\t\"Downarrow;\":                '\\U000021D3',\n\t\"Dscr;\":                     '\\U0001D49F',\n\t\"Dstrok;\":                   '\\U00000110',\n\t\"ENG;\":                      '\\U0000014A',\n\t\"ETH;\":                      '\\U000000D0',\n\t\"Eacute;\":                   '\\U000000C9',\n\t\"Ecaron;\":                   '\\U0000011A',\n\t\"Ecirc;\":                    '\\U000000CA',\n\t\"Ecy;\":                      '\\U0000042D',\n\t\"Edot;\":                     '\\U00000116',\n\t\"Efr;\":                      '\\U0001D508',\n\t\"Egrave;\":                   '\\U000000C8',\n\t\"Element;\":                  '\\U00002208',\n\t\"Emacr;\":                    '\\U00000112',\n\t\"EmptySmallSquare;\":         '\\U000025FB',\n\t\"EmptyVerySmallSquare;\":     '\\U000025AB',\n\t\"Eogon;\":                    '\\U00000118',\n\t\"Eopf;\":                     '\\U0001D53C',\n\t\"Epsilon;\":                  '\\U00000395',\n\t\"Equal;\":                    '\\U00002A75',\n\t\"EqualTilde;\":               '\\U00002242',\n\t\"Equilibrium;\":              '\\U000021CC',\n\t\"Escr;\":                     '\\U00002130',\n\t\"Esim;\":                     '\\U00002A73',\n\t\"Eta;\":                      '\\U00000397',\n\t\"Euml;\":                     '\\U000000CB',\n\t\"Exists;\":                   '\\U00002203',\n\t\"ExponentialE;\":             '\\U00002147',\n\t\"Fcy;\":                      '\\U00000424',\n\t\"Ffr;\":                      '\\U0001D509',\n\t\"FilledSmallSquare;\":        '\\U000025FC',\n\t\"FilledVerySmallSquare;\":    '\\U000025AA',\n\t\"Fopf;\":                     '\\U0001D53D',\n\t\"ForAll;\":                   '\\U00002200',\n\t\"Fouriertrf;\":               '\\U00002131',\n\t\"Fscr;\":                     '\\U00002131',\n\t\"GJcy;\":                     '\\U00000403',\n\t\"GT;\":                       '\\U0000003E',\n\t\"Gamma;\":                    '\\U00000393',\n\t\"Gammad;\":                   '\\U000003DC',\n\t\"Gbreve;\":                   '\\U0000011E',\n\t\"Gcedil;\":                   '\\U00000122',\n\t\"Gcirc;\":                    '\\U0000011C',\n\t\"Gcy;\":                      '\\U00000413',\n\t\"Gdot;\":                     '\\U00000120',\n\t\"Gfr;\":                      '\\U0001D50A',\n\t\"Gg;\":                       '\\U000022D9',\n\t\"Gopf;\":                     '\\U0001D53E',\n\t\"GreaterEqual;\":             '\\U00002265',\n\t\"GreaterEqualLess;\":         '\\U000022DB',\n\t\"GreaterFullEqual;\":         '\\U00002267',\n\t\"GreaterGreater;\":           '\\U00002AA2',\n\t\"GreaterLess;\":              '\\U00002277',\n\t\"GreaterSlantEqual;\":        '\\U00002A7E',\n\t\"GreaterTilde;\":             '\\U00002273',\n\t\"Gscr;\":                     '\\U0001D4A2',\n\t\"Gt;\":                       '\\U0000226B',\n\t\"HARDcy;\":                   '\\U0000042A',\n\t\"Hacek;\":                    '\\U000002C7',\n\t\"Hat;\":                      '\\U0000005E',\n\t\"Hcirc;\":                    '\\U00000124',\n\t\"Hfr;\":                      '\\U0000210C',\n\t\"HilbertSpace;\":             '\\U0000210B',\n\t\"Hopf;\":                     '\\U0000210D',\n\t\"HorizontalLine;\":           '\\U00002500',\n\t\"Hscr;\":                     '\\U0000210B',\n\t\"Hstrok;\":                   '\\U00000126',\n\t\"HumpDownHump;\":             '\\U0000224E',\n\t\"HumpEqual;\":                '\\U0000224F',\n\t\"IEcy;\":                     '\\U00000415',\n\t\"IJlig;\":                    '\\U00000132',\n\t\"IOcy;\":                     '\\U00000401',\n\t\"Iacute;\":                   '\\U000000CD',\n\t\"Icirc;\":                    '\\U000000CE',\n\t\"Icy;\":                      '\\U00000418',\n\t\"Idot;\":                     '\\U00000130',\n\t\"Ifr;\":                      '\\U00002111',\n\t\"Igrave;\":                   '\\U000000CC',\n\t\"Im;\":                       '\\U00002111',\n\t\"Imacr;\":                    '\\U0000012A',\n\t\"ImaginaryI;\":               '\\U00002148',\n\t\"Implies;\":                  '\\U000021D2',\n\t\"Int;\":                      '\\U0000222C',\n\t\"Integral;\":                 '\\U0000222B',\n\t\"Intersection;\":             '\\U000022C2',\n\t\"InvisibleComma;\":           '\\U00002063',\n\t\"InvisibleTimes;\":           '\\U00002062',\n\t\"Iogon;\":                    '\\U0000012E',\n\t\"Iopf;\":                     '\\U0001D540',\n\t\"Iota;\":                     '\\U00000399',\n\t\"Iscr;\":                     '\\U00002110',\n\t\"Itilde;\":                   '\\U00000128',\n\t\"Iukcy;\":                    '\\U00000406',\n\t\"Iuml;\":                     '\\U000000CF',\n\t\"Jcirc;\":                    '\\U00000134',\n\t\"Jcy;\":                      '\\U00000419',\n\t\"Jfr;\":                      '\\U0001D50D',\n\t\"Jopf;\":                     '\\U0001D541',\n\t\"Jscr;\":                     '\\U0001D4A5',\n\t\"Jsercy;\":                   '\\U00000408',\n\t\"Jukcy;\":                    '\\U00000404',\n\t\"KHcy;\":                     '\\U00000425',\n\t\"KJcy;\":                     '\\U0000040C',\n\t\"Kappa;\":                    '\\U0000039A',\n\t\"Kcedil;\":                   '\\U00000136',\n\t\"Kcy;\":                      '\\U0000041A',\n\t\"Kfr;\":                      '\\U0001D50E',\n\t\"Kopf;\":                     '\\U0001D542',\n\t\"Kscr;\":                     '\\U0001D4A6',\n\t\"LJcy;\":                     '\\U00000409',\n\t\"LT;\":                       '\\U0000003C',\n\t\"Lacute;\":                   '\\U00000139',\n\t\"Lambda;\":                   '\\U0000039B',\n\t\"Lang;\":                     '\\U000027EA',\n\t\"Laplacetrf;\":               '\\U00002112',\n\t\"Larr;\":                     '\\U0000219E',\n\t\"Lcaron;\":                   '\\U0000013D',\n\t\"Lcedil;\":                   '\\U0000013B',\n\t\"Lcy;\":                      '\\U0000041B',\n\t\"LeftAngleBracket;\":         '\\U000027E8',\n\t\"LeftArrow;\":                '\\U00002190',\n\t\"LeftArrowBar;\":             '\\U000021E4',\n\t\"LeftArrowRightArrow;\":      '\\U000021C6',\n\t\"LeftCeiling;\":              '\\U00002308',\n\t\"LeftDoubleBracket;\":        '\\U000027E6',\n\t\"LeftDownTeeVector;\":        '\\U00002961',\n\t\"LeftDownVector;\":           '\\U000021C3',\n\t\"LeftDownVectorBar;\":        '\\U00002959',\n\t\"LeftFloor;\":                '\\U0000230A',\n\t\"LeftRightArrow;\":           '\\U00002194',\n\t\"LeftRightVector;\":          '\\U0000294E',\n\t\"LeftTee;\":                  '\\U000022A3',\n\t\"LeftTeeArrow;\":             '\\U000021A4',\n\t\"LeftTeeVector;\":            '\\U0000295A',\n\t\"LeftTriangle;\":             '\\U000022B2',\n\t\"LeftTriangleBar;\":          '\\U000029CF',\n\t\"LeftTriangleEqual;\":        '\\U000022B4',\n\t\"LeftUpDownVector;\":         '\\U00002951',\n\t\"LeftUpTeeVector;\":          '\\U00002960',\n\t\"LeftUpVector;\":             '\\U000021BF',\n\t\"LeftUpVectorBar;\":          '\\U00002958',\n\t\"LeftVector;\":               '\\U000021BC',\n\t\"LeftVectorBar;\":            '\\U00002952',\n\t\"Leftarrow;\":                '\\U000021D0',\n\t\"Leftrightarrow;\":           '\\U000021D4',\n\t\"LessEqualGreater;\":         '\\U000022DA',\n\t\"LessFullEqual;\":            '\\U00002266',\n\t\"LessGreater;\":              '\\U00002276',\n\t\"LessLess;\":                 '\\U00002AA1',\n\t\"LessSlantEqual;\":           '\\U00002A7D',\n\t\"LessTilde;\":                '\\U00002272',\n\t\"Lfr;\":                      '\\U0001D50F',\n\t\"Ll;\":                       '\\U000022D8',\n\t\"Lleftarrow;\":               '\\U000021DA',\n\t\"Lmidot;\":                   '\\U0000013F',\n\t\"LongLeftArrow;\":            '\\U000027F5',\n\t\"LongLeftRightArrow;\":       '\\U000027F7',\n\t\"LongRightArrow;\":           '\\U000027F6',\n\t\"Longleftarrow;\":            '\\U000027F8',\n\t\"Longleftrightarrow;\":       '\\U000027FA',\n\t\"Longrightarrow;\":           '\\U000027F9',\n\t\"Lopf;\":                     '\\U0001D543',\n\t\"LowerLeftArrow;\":           '\\U00002199',\n\t\"LowerRightArrow;\":          '\\U00002198',\n\t\"Lscr;\":                     '\\U00002112',\n\t\"Lsh;\":                      '\\U000021B0',\n\t\"Lstrok;\":                   '\\U00000141',\n\t\"Lt;\":                       '\\U0000226A',\n\t\"Map;\":                      '\\U00002905',\n\t\"Mcy;\":                      '\\U0000041C',\n\t\"MediumSpace;\":              '\\U0000205F',\n\t\"Mellintrf;\":                '\\U00002133',\n\t\"Mfr;\":                      '\\U0001D510',\n\t\"MinusPlus;\":                '\\U00002213',\n\t\"Mopf;\":                     '\\U0001D544',\n\t\"Mscr;\":                     '\\U00002133',\n\t\"Mu;\":                       '\\U0000039C',\n\t\"NJcy;\":                     '\\U0000040A',\n\t\"Nacute;\":                   '\\U00000143',\n\t\"Ncaron;\":                   '\\U00000147',\n\t\"Ncedil;\":                   '\\U00000145',\n\t\"Ncy;\":                      '\\U0000041D',\n\t\"NegativeMediumSpace;\":      '\\U0000200B',\n\t\"NegativeThickSpace;\":       '\\U0000200B',\n\t\"NegativeThinSpace;\":        '\\U0000200B',\n\t\"NegativeVeryThinSpace;\":    '\\U0000200B',\n\t\"NestedGreaterGreater;\":     '\\U0000226B',\n\t\"NestedLessLess;\":           '\\U0000226A',\n\t\"NewLine;\":                  '\\U0000000A',\n\t\"Nfr;\":                      '\\U0001D511',\n\t\"NoBreak;\":                  '\\U00002060',\n\t\"NonBreakingSpace;\":         '\\U000000A0',\n\t\"Nopf;\":                     '\\U00002115',\n\t\"Not;\":                      '\\U00002AEC',\n\t\"NotCongruent;\":             '\\U00002262',\n\t\"NotCupCap;\":                '\\U0000226D',\n\t\"NotDoubleVerticalBar;\":     '\\U00002226',\n\t\"NotElement;\":               '\\U00002209',\n\t\"NotEqual;\":                 '\\U00002260',\n\t\"NotExists;\":                '\\U00002204',\n\t\"NotGreater;\":               '\\U0000226F',\n\t\"NotGreaterEqual;\":          '\\U00002271',\n\t\"NotGreaterLess;\":           '\\U00002279',\n\t\"NotGreaterTilde;\":          '\\U00002275',\n\t\"NotLeftTriangle;\":          '\\U000022EA',\n\t\"NotLeftTriangleEqual;\":     '\\U000022EC',\n\t\"NotLess;\":                  '\\U0000226E',\n\t\"NotLessEqual;\":             '\\U00002270',\n\t\"NotLessGreater;\":           '\\U00002278',\n\t\"NotLessTilde;\":             '\\U00002274',\n\t\"NotPrecedes;\":              '\\U00002280',\n\t\"NotPrecedesSlantEqual;\":    '\\U000022E0',\n\t\"NotReverseElement;\":        '\\U0000220C',\n\t\"NotRightTriangle;\":         '\\U000022EB',\n\t\"NotRightTriangleEqual;\":    '\\U000022ED',\n\t\"NotSquareSubsetEqual;\":     '\\U000022E2',\n\t\"NotSquareSupersetEqual;\":   '\\U000022E3',\n\t\"NotSubsetEqual;\":           '\\U00002288',\n\t\"NotSucceeds;\":              '\\U00002281',\n\t\"NotSucceedsSlantEqual;\":    '\\U000022E1',\n\t\"NotSupersetEqual;\":         '\\U00002289',\n\t\"NotTilde;\":                 '\\U00002241',\n\t\"NotTildeEqual;\":            '\\U00002244',\n\t\"NotTildeFullEqual;\":        '\\U00002247',\n\t\"NotTildeTilde;\":            '\\U00002249',\n\t\"NotVerticalBar;\":           '\\U00002224',\n\t\"Nscr;\":                     '\\U0001D4A9',\n\t\"Ntilde;\":                   '\\U000000D1',\n\t\"Nu;\":                       '\\U0000039D',\n\t\"OElig;\":                    '\\U00000152',\n\t\"Oacute;\":                   '\\U000000D3',\n\t\"Ocirc;\":                    '\\U000000D4',\n\t\"Ocy;\":                      '\\U0000041E',\n\t\"Odblac;\":                   '\\U00000150',\n\t\"Ofr;\":                      '\\U0001D512',\n\t\"Ograve;\":                   '\\U000000D2',\n\t\"Omacr;\":                    '\\U0000014C',\n\t\"Omega;\":                    '\\U000003A9',\n\t\"Omicron;\":                  '\\U0000039F',\n\t\"Oopf;\":                     '\\U0001D546',\n\t\"OpenCurlyDoubleQuote;\":     '\\U0000201C',\n\t\"OpenCurlyQuote;\":           '\\U00002018',\n\t\"Or;\":                       '\\U00002A54',\n\t\"Oscr;\":                     '\\U0001D4AA',\n\t\"Oslash;\":                   '\\U000000D8',\n\t\"Otilde;\":                   '\\U000000D5',\n\t\"Otimes;\":                   '\\U00002A37',\n\t\"Ouml;\":                     '\\U000000D6',\n\t\"OverBar;\":                  '\\U0000203E',\n\t\"OverBrace;\":                '\\U000023DE',\n\t\"OverBracket;\":              '\\U000023B4',\n\t\"OverParenthesis;\":          '\\U000023DC',\n\t\"PartialD;\":                 '\\U00002202',\n\t\"Pcy;\":                      '\\U0000041F',\n\t\"Pfr;\":                      '\\U0001D513',\n\t\"Phi;\":                      '\\U000003A6',\n\t\"Pi;\":                       '\\U000003A0',\n\t\"PlusMinus;\":                '\\U000000B1',\n\t\"Poincareplane;\":            '\\U0000210C',\n\t\"Popf;\":                     '\\U00002119',\n\t\"Pr;\":                       '\\U00002ABB',\n\t\"Precedes;\":                 '\\U0000227A',\n\t\"PrecedesEqual;\":            '\\U00002AAF',\n\t\"PrecedesSlantEqual;\":       '\\U0000227C',\n\t\"PrecedesTilde;\":            '\\U0000227E',\n\t\"Prime;\":                    '\\U00002033',\n\t\"Product;\":                  '\\U0000220F',\n\t\"Proportion;\":               '\\U00002237',\n\t\"Proportional;\":             '\\U0000221D',\n\t\"Pscr;\":                     '\\U0001D4AB',\n\t\"Psi;\":                      '\\U000003A8',\n\t\"QUOT;\":                     '\\U00000022',\n\t\"Qfr;\":                      '\\U0001D514',\n\t\"Qopf;\":                     '\\U0000211A',\n\t\"Qscr;\":                     '\\U0001D4AC',\n\t\"RBarr;\":                    '\\U00002910',\n\t\"REG;\":                      '\\U000000AE',\n\t\"Racute;\":                   '\\U00000154',\n\t\"Rang;\":                     '\\U000027EB',\n\t\"Rarr;\":                     '\\U000021A0',\n\t\"Rarrtl;\":                   '\\U00002916',\n\t\"Rcaron;\":                   '\\U00000158',\n\t\"Rcedil;\":                   '\\U00000156',\n\t\"Rcy;\":                      '\\U00000420',\n\t\"Re;\":                       '\\U0000211C',\n\t\"ReverseElement;\":           '\\U0000220B',\n\t\"ReverseEquilibrium;\":       '\\U000021CB',\n\t\"ReverseUpEquilibrium;\":     '\\U0000296F',\n\t\"Rfr;\":                      '\\U0000211C',\n\t\"Rho;\":                      '\\U000003A1',\n\t\"RightAngleBracket;\":        '\\U000027E9',\n\t\"RightArrow;\":               '\\U00002192',\n\t\"RightArrowBar;\":            '\\U000021E5',\n\t\"RightArrowLeftArrow;\":      '\\U000021C4',\n\t\"RightCeiling;\":             '\\U00002309',\n\t\"RightDoubleBracket;\":       '\\U000027E7',\n\t\"RightDownTeeVector;\":       '\\U0000295D',\n\t\"RightDownVector;\":          '\\U000021C2',\n\t\"RightDownVectorBar;\":       '\\U00002955',\n\t\"RightFloor;\":               '\\U0000230B',\n\t\"RightTee;\":                 '\\U000022A2',\n\t\"RightTeeArrow;\":            '\\U000021A6',\n\t\"RightTeeVector;\":           '\\U0000295B',\n\t\"RightTriangle;\":            '\\U000022B3',\n\t\"RightTriangleBar;\":         '\\U000029D0',\n\t\"RightTriangleEqual;\":       '\\U000022B5',\n\t\"RightUpDownVector;\":        '\\U0000294F',\n\t\"RightUpTeeVector;\":         '\\U0000295C',\n\t\"RightUpVector;\":            '\\U000021BE',\n\t\"RightUpVectorBar;\":         '\\U00002954',\n\t\"RightVector;\":              '\\U000021C0',\n\t\"RightVectorBar;\":           '\\U00002953',\n\t\"Rightarrow;\":               '\\U000021D2',\n\t\"Ropf;\":                     '\\U0000211D',\n\t\"RoundImplies;\":             '\\U00002970',\n\t\"Rrightarrow;\":              '\\U000021DB',\n\t\"Rscr;\":                     '\\U0000211B',\n\t\"Rsh;\":                      '\\U000021B1',\n\t\"RuleDelayed;\":              '\\U000029F4',\n\t\"SHCHcy;\":                   '\\U00000429',\n\t\"SHcy;\":                     '\\U00000428',\n\t\"SOFTcy;\":                   '\\U0000042C',\n\t\"Sacute;\":                   '\\U0000015A',\n\t\"Sc;\":                       '\\U00002ABC',\n\t\"Scaron;\":                   '\\U00000160',\n\t\"Scedil;\":                   '\\U0000015E',\n\t\"Scirc;\":                    '\\U0000015C',\n\t\"Scy;\":                      '\\U00000421',\n\t\"Sfr;\":                      '\\U0001D516',\n\t\"ShortDownArrow;\":           '\\U00002193',\n\t\"ShortLeftArrow;\":           '\\U00002190',\n\t\"ShortRightArrow;\":          '\\U00002192',\n\t\"ShortUpArrow;\":             '\\U00002191',\n\t\"Sigma;\":                    '\\U000003A3',\n\t\"SmallCircle;\":              '\\U00002218',\n\t\"Sopf;\":                     '\\U0001D54A',\n\t\"Sqrt;\":                     '\\U0000221A',\n\t\"Square;\":                   '\\U000025A1',\n\t\"SquareIntersection;\":       '\\U00002293',\n\t\"SquareSubset;\":             '\\U0000228F',\n\t\"SquareSubsetEqual;\":        '\\U00002291',\n\t\"SquareSuperset;\":           '\\U00002290',\n\t\"SquareSupersetEqual;\":      '\\U00002292',\n\t\"SquareUnion;\":              '\\U00002294',\n\t\"Sscr;\":                     '\\U0001D4AE',\n\t\"Star;\":                     '\\U000022C6',\n\t\"Sub;\":                      '\\U000022D0',\n\t\"Subset;\":                   '\\U000022D0',\n\t\"SubsetEqual;\":              '\\U00002286',\n\t\"Succeeds;\":                 '\\U0000227B',\n\t\"SucceedsEqual;\":            '\\U00002AB0',\n\t\"SucceedsSlantEqual;\":       '\\U0000227D',\n\t\"SucceedsTilde;\":            '\\U0000227F',\n\t\"SuchThat;\":                 '\\U0000220B',\n\t\"Sum;\":                      '\\U00002211',\n\t\"Sup;\":                      '\\U000022D1',\n\t\"Superset;\":                 '\\U00002283',\n\t\"SupersetEqual;\":            '\\U00002287',\n\t\"Supset;\":                   '\\U000022D1',\n\t\"THORN;\":                    '\\U000000DE',\n\t\"TRADE;\":                    '\\U00002122',\n\t\"TSHcy;\":                    '\\U0000040B',\n\t\"TScy;\":                     '\\U00000426',\n\t\"Tab;\":                      '\\U00000009',\n\t\"Tau;\":                      '\\U000003A4',\n\t\"Tcaron;\":                   '\\U00000164',\n\t\"Tcedil;\":                   '\\U00000162',\n\t\"Tcy;\":                      '\\U00000422',\n\t\"Tfr;\":                      '\\U0001D517',\n\t\"Therefore;\":                '\\U00002234',\n\t\"Theta;\":                    '\\U00000398',\n\t\"ThinSpace;\":                '\\U00002009',\n\t\"Tilde;\":                    '\\U0000223C',\n\t\"TildeEqual;\":               '\\U00002243',\n\t\"TildeFullEqual;\":           '\\U00002245',\n\t\"TildeTilde;\":               '\\U00002248',\n\t\"Topf;\":                     '\\U0001D54B',\n\t\"TripleDot;\":                '\\U000020DB',\n\t\"Tscr;\":                     '\\U0001D4AF',\n\t\"Tstrok;\":                   '\\U00000166',\n\t\"Uacute;\":                   '\\U000000DA',\n\t\"Uarr;\":                     '\\U0000219F',\n\t\"Uarrocir;\":                 '\\U00002949',\n\t\"Ubrcy;\":                    '\\U0000040E',\n\t\"Ubreve;\":                   '\\U0000016C',\n\t\"Ucirc;\":                    '\\U000000DB',\n\t\"Ucy;\":                      '\\U00000423',\n\t\"Udblac;\":                   '\\U00000170',\n\t\"Ufr;\":                      '\\U0001D518',\n\t\"Ugrave;\":                   '\\U000000D9',\n\t\"Umacr;\":                    '\\U0000016A',\n\t\"UnderBar;\":                 '\\U0000005F',\n\t\"UnderBrace;\":               '\\U000023DF',\n\t\"UnderBracket;\":             '\\U000023B5',\n\t\"UnderParenthesis;\":         '\\U000023DD',\n\t\"Union;\":                    '\\U000022C3',\n\t\"UnionPlus;\":                '\\U0000228E',\n\t\"Uogon;\":                    '\\U00000172',\n\t\"Uopf;\":                     '\\U0001D54C',\n\t\"UpArrow;\":                  '\\U00002191',\n\t\"UpArrowBar;\":               '\\U00002912',\n\t\"UpArrowDownArrow;\":         '\\U000021C5',\n\t\"UpDownArrow;\":              '\\U00002195',\n\t\"UpEquilibrium;\":            '\\U0000296E',\n\t\"UpTee;\":                    '\\U000022A5',\n\t\"UpTeeArrow;\":               '\\U000021A5',\n\t\"Uparrow;\":                  '\\U000021D1',\n\t\"Updownarrow;\":              '\\U000021D5',\n\t\"UpperLeftArrow;\":           '\\U00002196',\n\t\"UpperRightArrow;\":          '\\U00002197',\n\t\"Upsi;\":                     '\\U000003D2',\n\t\"Upsilon;\":                  '\\U000003A5',\n\t\"Uring;\":                    '\\U0000016E',\n\t\"Uscr;\":                     '\\U0001D4B0',\n\t\"Utilde;\":                   '\\U00000168',\n\t\"Uuml;\":                     '\\U000000DC',\n\t\"VDash;\":                    '\\U000022AB',\n\t\"Vbar;\":                     '\\U00002AEB',\n\t\"Vcy;\":                      '\\U00000412',\n\t\"Vdash;\":                    '\\U000022A9',\n\t\"Vdashl;\":                   '\\U00002AE6',\n\t\"Vee;\":                      '\\U000022C1',\n\t\"Verbar;\":                   '\\U00002016',\n\t\"Vert;\":                     '\\U00002016',\n\t\"VerticalBar;\":              '\\U00002223',\n\t\"VerticalLine;\":             '\\U0000007C',\n\t\"VerticalSeparator;\":        '\\U00002758',\n\t\"VerticalTilde;\":            '\\U00002240',\n\t\"VeryThinSpace;\":            '\\U0000200A',\n\t\"Vfr;\":                      '\\U0001D519',\n\t\"Vopf;\":                     '\\U0001D54D',\n\t\"Vscr;\":                     '\\U0001D4B1',\n\t\"Vvdash;\":                   '\\U000022AA',\n\t\"Wcirc;\":                    '\\U00000174',\n\t\"Wedge;\":                    '\\U000022C0',\n\t\"Wfr;\":                      '\\U0001D51A',\n\t\"Wopf;\":                     '\\U0001D54E',\n\t\"Wscr;\":                     '\\U0001D4B2',\n\t\"Xfr;\":                      '\\U0001D51B',\n\t\"Xi;\":                       '\\U0000039E',\n\t\"Xopf;\":                     '\\U0001D54F',\n\t\"Xscr;\":                     '\\U0001D4B3',\n\t\"YAcy;\":                     '\\U0000042F',\n\t\"YIcy;\":                     '\\U00000407',\n\t\"YUcy;\":                     '\\U0000042E',\n\t\"Yacute;\":                   '\\U000000DD',\n\t\"Ycirc;\":                    '\\U00000176',\n\t\"Ycy;\":                      '\\U0000042B',\n\t\"Yfr;\":                      '\\U0001D51C',\n\t\"Yopf;\":                     '\\U0001D550',\n\t\"Yscr;\":                     '\\U0001D4B4',\n\t\"Yuml;\":                     '\\U00000178',\n\t\"ZHcy;\":                     '\\U00000416',\n\t\"Zacute;\":                   '\\U00000179',\n\t\"Zcaron;\":                   '\\U0000017D',\n\t\"Zcy;\":                      '\\U00000417',\n\t\"Zdot;\":                     '\\U0000017B',\n\t\"ZeroWidthSpace;\":           '\\U0000200B',\n\t\"Zeta;\":                     '\\U00000396',\n\t\"Zfr;\":                      '\\U00002128',\n\t\"Zopf;\":                     '\\U00002124',\n\t\"Zscr;\":                     '\\U0001D4B5',\n\t\"aacute;\":                   '\\U000000E1',\n\t\"abreve;\":                   '\\U00000103',\n\t\"ac;\":                       '\\U0000223E',\n\t\"acd;\":                      '\\U0000223F',\n\t\"acirc;\":                    '\\U000000E2',\n\t\"acute;\":                    '\\U000000B4',\n\t\"acy;\":                      '\\U00000430',\n\t\"aelig;\":                    '\\U000000E6',\n\t\"af;\":                       '\\U00002061',\n\t\"afr;\":                      '\\U0001D51E',\n\t\"agrave;\":                   '\\U000000E0',\n\t\"alefsym;\":                  '\\U00002135',\n\t\"aleph;\":                    '\\U00002135',\n\t\"alpha;\":                    '\\U000003B1',\n\t\"amacr;\":                    '\\U00000101',\n\t\"amalg;\":                    '\\U00002A3F',\n\t\"amp;\":                      '\\U00000026',\n\t\"and;\":                      '\\U00002227',\n\t\"andand;\":                   '\\U00002A55',\n\t\"andd;\":                     '\\U00002A5C',\n\t\"andslope;\":                 '\\U00002A58',\n\t\"andv;\":                     '\\U00002A5A',\n\t\"ang;\":                      '\\U00002220',\n\t\"ange;\":                     '\\U000029A4',\n\t\"angle;\":                    '\\U00002220',\n\t\"angmsd;\":                   '\\U00002221',\n\t\"angmsdaa;\":                 '\\U000029A8',\n\t\"angmsdab;\":                 '\\U000029A9',\n\t\"angmsdac;\":                 '\\U000029AA',\n\t\"angmsdad;\":                 '\\U000029AB',\n\t\"angmsdae;\":                 '\\U000029AC',\n\t\"angmsdaf;\":                 '\\U000029AD',\n\t\"angmsdag;\":                 '\\U000029AE',\n\t\"angmsdah;\":                 '\\U000029AF',\n\t\"angrt;\":                    '\\U0000221F',\n\t\"angrtvb;\":                  '\\U000022BE',\n\t\"angrtvbd;\":                 '\\U0000299D',\n\t\"angsph;\":                   '\\U00002222',\n\t\"angst;\":                    '\\U000000C5',\n\t\"angzarr;\":                  '\\U0000237C',\n\t\"aogon;\":                    '\\U00000105',\n\t\"aopf;\":                     '\\U0001D552',\n\t\"ap;\":                       '\\U00002248',\n\t\"apE;\":                      '\\U00002A70',\n\t\"apacir;\":                   '\\U00002A6F',\n\t\"ape;\":                      '\\U0000224A',\n\t\"apid;\":                     '\\U0000224B',\n\t\"apos;\":                     '\\U00000027',\n\t\"approx;\":                   '\\U00002248',\n\t\"approxeq;\":                 '\\U0000224A',\n\t\"aring;\":                    '\\U000000E5',\n\t\"ascr;\":                     '\\U0001D4B6',\n\t\"ast;\":                      '\\U0000002A',\n\t\"asymp;\":                    '\\U00002248',\n\t\"asympeq;\":                  '\\U0000224D',\n\t\"atilde;\":                   '\\U000000E3',\n\t\"auml;\":                     '\\U000000E4',\n\t\"awconint;\":                 '\\U00002233',\n\t\"awint;\":                    '\\U00002A11',\n\t\"bNot;\":                     '\\U00002AED',\n\t\"backcong;\":                 '\\U0000224C',\n\t\"backepsilon;\":              '\\U000003F6',\n\t\"backprime;\":                '\\U00002035',\n\t\"backsim;\":                  '\\U0000223D',\n\t\"backsimeq;\":                '\\U000022CD',\n\t\"barvee;\":                   '\\U000022BD',\n\t\"barwed;\":                   '\\U00002305',\n\t\"barwedge;\":                 '\\U00002305',\n\t\"bbrk;\":                     '\\U000023B5',\n\t\"bbrktbrk;\":                 '\\U000023B6',\n\t\"bcong;\":                    '\\U0000224C',\n\t\"bcy;\":                      '\\U00000431',\n\t\"bdquo;\":                    '\\U0000201E',\n\t\"becaus;\":                   '\\U00002235',\n\t\"because;\":                  '\\U00002235',\n\t\"bemptyv;\":                  '\\U000029B0',\n\t\"bepsi;\":                    '\\U000003F6',\n\t\"bernou;\":                   '\\U0000212C',\n\t\"beta;\":                     '\\U000003B2',\n\t\"beth;\":                     '\\U00002136',\n\t\"between;\":                  '\\U0000226C',\n\t\"bfr;\":                      '\\U0001D51F',\n\t\"bigcap;\":                   '\\U000022C2',\n\t\"bigcirc;\":                  '\\U000025EF',\n\t\"bigcup;\":                   '\\U000022C3',\n\t\"bigodot;\":                  '\\U00002A00',\n\t\"bigoplus;\":                 '\\U00002A01',\n\t\"bigotimes;\":                '\\U00002A02',\n\t\"bigsqcup;\":                 '\\U00002A06',\n\t\"bigstar;\":                  '\\U00002605',\n\t\"bigtriangledown;\":          '\\U000025BD',\n\t\"bigtriangleup;\":            '\\U000025B3',\n\t\"biguplus;\":                 '\\U00002A04',\n\t\"bigvee;\":                   '\\U000022C1',\n\t\"bigwedge;\":                 '\\U000022C0',\n\t\"bkarow;\":                   '\\U0000290D',\n\t\"blacklozenge;\":             '\\U000029EB',\n\t\"blacksquare;\":              '\\U000025AA',\n\t\"blacktriangle;\":            '\\U000025B4',\n\t\"blacktriangledown;\":        '\\U000025BE',\n\t\"blacktriangleleft;\":        '\\U000025C2',\n\t\"blacktriangleright;\":       '\\U000025B8',\n\t\"blank;\":                    '\\U00002423',\n\t\"blk12;\":                    '\\U00002592',\n\t\"blk14;\":                    '\\U00002591',\n\t\"blk34;\":                    '\\U00002593',\n\t\"block;\":                    '\\U00002588',\n\t\"bnot;\":                     '\\U00002310',\n\t\"bopf;\":                     '\\U0001D553',\n\t\"bot;\":                      '\\U000022A5',\n\t\"bottom;\":                   '\\U000022A5',\n\t\"bowtie;\":                   '\\U000022C8',\n\t\"boxDL;\":                    '\\U00002557',\n\t\"boxDR;\":                    '\\U00002554',\n\t\"boxDl;\":                    '\\U00002556',\n\t\"boxDr;\":                    '\\U00002553',\n\t\"boxH;\":                     '\\U00002550',\n\t\"boxHD;\":                    '\\U00002566',\n\t\"boxHU;\":                    '\\U00002569',\n\t\"boxHd;\":                    '\\U00002564',\n\t\"boxHu;\":                    '\\U00002567',\n\t\"boxUL;\":                    '\\U0000255D',\n\t\"boxUR;\":                    '\\U0000255A',\n\t\"boxUl;\":                    '\\U0000255C',\n\t\"boxUr;\":                    '\\U00002559',\n\t\"boxV;\":                     '\\U00002551',\n\t\"boxVH;\":                    '\\U0000256C',\n\t\"boxVL;\":                    '\\U00002563',\n\t\"boxVR;\":                    '\\U00002560',\n\t\"boxVh;\":                    '\\U0000256B',\n\t\"boxVl;\":                    '\\U00002562',\n\t\"boxVr;\":                    '\\U0000255F',\n\t\"boxbox;\":                   '\\U000029C9',\n\t\"boxdL;\":                    '\\U00002555',\n\t\"boxdR;\":                    '\\U00002552',\n\t\"boxdl;\":                    '\\U00002510',\n\t\"boxdr;\":                    '\\U0000250C',\n\t\"boxh;\":                     '\\U00002500',\n\t\"boxhD;\":                    '\\U00002565',\n\t\"boxhU;\":                    '\\U00002568',\n\t\"boxhd;\":                    '\\U0000252C',\n\t\"boxhu;\":                    '\\U00002534',\n\t\"boxminus;\":                 '\\U0000229F',\n\t\"boxplus;\":                  '\\U0000229E',\n\t\"boxtimes;\":                 '\\U000022A0',\n\t\"boxuL;\":                    '\\U0000255B',\n\t\"boxuR;\":                    '\\U00002558',\n\t\"boxul;\":                    '\\U00002518',\n\t\"boxur;\":                    '\\U00002514',\n\t\"boxv;\":                     '\\U00002502',\n\t\"boxvH;\":                    '\\U0000256A',\n\t\"boxvL;\":                    '\\U00002561',\n\t\"boxvR;\":                    '\\U0000255E',\n\t\"boxvh;\":                    '\\U0000253C',\n\t\"boxvl;\":                    '\\U00002524',\n\t\"boxvr;\":                    '\\U0000251C',\n\t\"bprime;\":                   '\\U00002035',\n\t\"breve;\":                    '\\U000002D8',\n\t\"brvbar;\":                   '\\U000000A6',\n\t\"bscr;\":                     '\\U0001D4B7',\n\t\"bsemi;\":                    '\\U0000204F',\n\t\"bsim;\":                     '\\U0000223D',\n\t\"bsime;\":                    '\\U000022CD',\n\t\"bsol;\":                     '\\U0000005C',\n\t\"bsolb;\":                    '\\U000029C5',\n\t\"bsolhsub;\":                 '\\U000027C8',\n\t\"bull;\":                     '\\U00002022',\n\t\"bullet;\":                   '\\U00002022',\n\t\"bump;\":                     '\\U0000224E',\n\t\"bumpE;\":                    '\\U00002AAE',\n\t\"bumpe;\":                    '\\U0000224F',\n\t\"bumpeq;\":                   '\\U0000224F',\n\t\"cacute;\":                   '\\U00000107',\n\t\"cap;\":                      '\\U00002229',\n\t\"capand;\":                   '\\U00002A44',\n\t\"capbrcup;\":                 '\\U00002A49',\n\t\"capcap;\":                   '\\U00002A4B',\n\t\"capcup;\":                   '\\U00002A47',\n\t\"capdot;\":                   '\\U00002A40',\n\t\"caret;\":                    '\\U00002041',\n\t\"caron;\":                    '\\U000002C7',\n\t\"ccaps;\":                    '\\U00002A4D',\n\t\"ccaron;\":                   '\\U0000010D',\n\t\"ccedil;\":                   '\\U000000E7',\n\t\"ccirc;\":                    '\\U00000109',\n\t\"ccups;\":                    '\\U00002A4C',\n\t\"ccupssm;\":                  '\\U00002A50',\n\t\"cdot;\":                     '\\U0000010B',\n\t\"cedil;\":                    '\\U000000B8',\n\t\"cemptyv;\":                  '\\U000029B2',\n\t\"cent;\":                     '\\U000000A2',\n\t\"centerdot;\":                '\\U000000B7',\n\t\"cfr;\":                      '\\U0001D520',\n\t\"chcy;\":                     '\\U00000447',\n\t\"check;\":                    '\\U00002713',\n\t\"checkmark;\":                '\\U00002713',\n\t\"chi;\":                      '\\U000003C7',\n\t\"cir;\":                      '\\U000025CB',\n\t\"cirE;\":                     '\\U000029C3',\n\t\"circ;\":                     '\\U000002C6',\n\t\"circeq;\":                   '\\U00002257',\n\t\"circlearrowleft;\":          '\\U000021BA',\n\t\"circlearrowright;\":         '\\U000021BB',\n\t\"circledR;\":                 '\\U000000AE',\n\t\"circledS;\":                 '\\U000024C8',\n\t\"circledast;\":               '\\U0000229B',\n\t\"circledcirc;\":              '\\U0000229A',\n\t\"circleddash;\":              '\\U0000229D',\n\t\"cire;\":                     '\\U00002257',\n\t\"cirfnint;\":                 '\\U00002A10',\n\t\"cirmid;\":                   '\\U00002AEF',\n\t\"cirscir;\":                  '\\U000029C2',\n\t\"clubs;\":                    '\\U00002663',\n\t\"clubsuit;\":                 '\\U00002663',\n\t\"colon;\":                    '\\U0000003A',\n\t\"colone;\":                   '\\U00002254',\n\t\"coloneq;\":                  '\\U00002254',\n\t\"comma;\":                    '\\U0000002C',\n\t\"commat;\":                   '\\U00000040',\n\t\"comp;\":                     '\\U00002201',\n\t\"compfn;\":                   '\\U00002218',\n\t\"complement;\":               '\\U00002201',\n\t\"complexes;\":                '\\U00002102',\n\t\"cong;\":                     '\\U00002245',\n\t\"congdot;\":                  '\\U00002A6D',\n\t\"conint;\":                   '\\U0000222E',\n\t\"copf;\":                     '\\U0001D554',\n\t\"coprod;\":                   '\\U00002210',\n\t\"copy;\":                     '\\U000000A9',\n\t\"copysr;\":                   '\\U00002117',\n\t\"crarr;\":                    '\\U000021B5',\n\t\"cross;\":                    '\\U00002717',\n\t\"cscr;\":                     '\\U0001D4B8',\n\t\"csub;\":                     '\\U00002ACF',\n\t\"csube;\":                    '\\U00002AD1',\n\t\"csup;\":                     '\\U00002AD0',\n\t\"csupe;\":                    '\\U00002AD2',\n\t\"ctdot;\":                    '\\U000022EF',\n\t\"cudarrl;\":                  '\\U00002938',\n\t\"cudarrr;\":                  '\\U00002935',\n\t\"cuepr;\":                    '\\U000022DE',\n\t\"cuesc;\":                    '\\U000022DF',\n\t\"cularr;\":                   '\\U000021B6',\n\t\"cularrp;\":                  '\\U0000293D',\n\t\"cup;\":                      '\\U0000222A',\n\t\"cupbrcap;\":                 '\\U00002A48',\n\t\"cupcap;\":                   '\\U00002A46',\n\t\"cupcup;\":                   '\\U00002A4A',\n\t\"cupdot;\":                   '\\U0000228D',\n\t\"cupor;\":                    '\\U00002A45',\n\t\"curarr;\":                   '\\U000021B7',\n\t\"curarrm;\":                  '\\U0000293C',\n\t\"curlyeqprec;\":              '\\U000022DE',\n\t\"curlyeqsucc;\":              '\\U000022DF',\n\t\"curlyvee;\":                 '\\U000022CE',\n\t\"curlywedge;\":               '\\U000022CF',\n\t\"curren;\":                   '\\U000000A4',\n\t\"curvearrowleft;\":           '\\U000021B6',\n\t\"curvearrowright;\":          '\\U000021B7',\n\t\"cuvee;\":                    '\\U000022CE',\n\t\"cuwed;\":                    '\\U000022CF',\n\t\"cwconint;\":                 '\\U00002232',\n\t\"cwint;\":                    '\\U00002231',\n\t\"cylcty;\":                   '\\U0000232D',\n\t\"dArr;\":                     '\\U000021D3',\n\t\"dHar;\":                     '\\U00002965',\n\t\"dagger;\":                   '\\U00002020',\n\t\"daleth;\":                   '\\U00002138',\n\t\"darr;\":                     '\\U00002193',\n\t\"dash;\":                     '\\U00002010',\n\t\"dashv;\":                    '\\U000022A3',\n\t\"dbkarow;\":                  '\\U0000290F',\n\t\"dblac;\":                    '\\U000002DD',\n\t\"dcaron;\":                   '\\U0000010F',\n\t\"dcy;\":                      '\\U00000434',\n\t\"dd;\":                       '\\U00002146',\n\t\"ddagger;\":                  '\\U00002021',\n\t\"ddarr;\":                    '\\U000021CA',\n\t\"ddotseq;\":                  '\\U00002A77',\n\t\"deg;\":                      '\\U000000B0',\n\t\"delta;\":                    '\\U000003B4',\n\t\"demptyv;\":                  '\\U000029B1',\n\t\"dfisht;\":                   '\\U0000297F',\n\t\"dfr;\":                      '\\U0001D521',\n\t\"dharl;\":                    '\\U000021C3',\n\t\"dharr;\":                    '\\U000021C2',\n\t\"diam;\":                     '\\U000022C4',\n\t\"diamond;\":                  '\\U000022C4',\n\t\"diamondsuit;\":              '\\U00002666',\n\t\"diams;\":                    '\\U00002666',\n\t\"die;\":                      '\\U000000A8',\n\t\"digamma;\":                  '\\U000003DD',\n\t\"disin;\":                    '\\U000022F2',\n\t\"div;\":                      '\\U000000F7',\n\t\"divide;\":                   '\\U000000F7',\n\t\"divideontimes;\":            '\\U000022C7',\n\t\"divonx;\":                   '\\U000022C7',\n\t\"djcy;\":                     '\\U00000452',\n\t\"dlcorn;\":                   '\\U0000231E',\n\t\"dlcrop;\":                   '\\U0000230D',\n\t\"dollar;\":                   '\\U00000024',\n\t\"dopf;\":                     '\\U0001D555',\n\t\"dot;\":                      '\\U000002D9',\n\t\"doteq;\":                    '\\U00002250',\n\t\"doteqdot;\":                 '\\U00002251',\n\t\"dotminus;\":                 '\\U00002238',\n\t\"dotplus;\":                  '\\U00002214',\n\t\"dotsquare;\":                '\\U000022A1',\n\t\"doublebarwedge;\":           '\\U00002306',\n\t\"downarrow;\":                '\\U00002193',\n\t\"downdownarrows;\":           '\\U000021CA',\n\t\"downharpoonleft;\":          '\\U000021C3',\n\t\"downharpoonright;\":         '\\U000021C2',\n\t\"drbkarow;\":                 '\\U00002910',\n\t\"drcorn;\":                   '\\U0000231F',\n\t\"drcrop;\":                   '\\U0000230C',\n\t\"dscr;\":                     '\\U0001D4B9',\n\t\"dscy;\":                     '\\U00000455',\n\t\"dsol;\":                     '\\U000029F6',\n\t\"dstrok;\":                   '\\U00000111',\n\t\"dtdot;\":                    '\\U000022F1',\n\t\"dtri;\":                     '\\U000025BF',\n\t\"dtrif;\":                    '\\U000025BE',\n\t\"duarr;\":                    '\\U000021F5',\n\t\"duhar;\":                    '\\U0000296F',\n\t\"dwangle;\":                  '\\U000029A6',\n\t\"dzcy;\":                     '\\U0000045F',\n\t\"dzigrarr;\":                 '\\U000027FF',\n\t\"eDDot;\":                    '\\U00002A77',\n\t\"eDot;\":                     '\\U00002251',\n\t\"eacute;\":                   '\\U000000E9',\n\t\"easter;\":                   '\\U00002A6E',\n\t\"ecaron;\":                   '\\U0000011B',\n\t\"ecir;\":                     '\\U00002256',\n\t\"ecirc;\":                    '\\U000000EA',\n\t\"ecolon;\":                   '\\U00002255',\n\t\"ecy;\":                      '\\U0000044D',\n\t\"edot;\":                     '\\U00000117',\n\t\"ee;\":                       '\\U00002147',\n\t\"efDot;\":                    '\\U00002252',\n\t\"efr;\":                      '\\U0001D522',\n\t\"eg;\":                       '\\U00002A9A',\n\t\"egrave;\":                   '\\U000000E8',\n\t\"egs;\":                      '\\U00002A96',\n\t\"egsdot;\":                   '\\U00002A98',\n\t\"el;\":                       '\\U00002A99',\n\t\"elinters;\":                 '\\U000023E7',\n\t\"ell;\":                      '\\U00002113',\n\t\"els;\":                      '\\U00002A95',\n\t\"elsdot;\":                   '\\U00002A97',\n\t\"emacr;\":                    '\\U00000113',\n\t\"empty;\":                    '\\U00002205',\n\t\"emptyset;\":                 '\\U00002205',\n\t\"emptyv;\":                   '\\U00002205',\n\t\"emsp;\":                     '\\U00002003',\n\t\"emsp13;\":                   '\\U00002004',\n\t\"emsp14;\":                   '\\U00002005',\n\t\"eng;\":                      '\\U0000014B',\n\t\"ensp;\":                     '\\U00002002',\n\t\"eogon;\":                    '\\U00000119',\n\t\"eopf;\":                     '\\U0001D556',\n\t\"epar;\":                     '\\U000022D5',\n\t\"eparsl;\":                   '\\U000029E3',\n\t\"eplus;\":                    '\\U00002A71',\n\t\"epsi;\":                     '\\U000003B5',\n\t\"epsilon;\":                  '\\U000003B5',\n\t\"epsiv;\":                    '\\U000003F5',\n\t\"eqcirc;\":                   '\\U00002256',\n\t\"eqcolon;\":                  '\\U00002255',\n\t\"eqsim;\":                    '\\U00002242',\n\t\"eqslantgtr;\":               '\\U00002A96',\n\t\"eqslantless;\":              '\\U00002A95',\n\t\"equals;\":                   '\\U0000003D',\n\t\"equest;\":                   '\\U0000225F',\n\t\"equiv;\":                    '\\U00002261',\n\t\"equivDD;\":                  '\\U00002A78',\n\t\"eqvparsl;\":                 '\\U000029E5',\n\t\"erDot;\":                    '\\U00002253',\n\t\"erarr;\":                    '\\U00002971',\n\t\"escr;\":                     '\\U0000212F',\n\t\"esdot;\":                    '\\U00002250',\n\t\"esim;\":                     '\\U00002242',\n\t\"eta;\":                      '\\U000003B7',\n\t\"eth;\":                      '\\U000000F0',\n\t\"euml;\":                     '\\U000000EB',\n\t\"euro;\":                     '\\U000020AC',\n\t\"excl;\":                     '\\U00000021',\n\t\"exist;\":                    '\\U00002203',\n\t\"expectation;\":              '\\U00002130',\n\t\"exponentiale;\":             '\\U00002147',\n\t\"fallingdotseq;\":            '\\U00002252',\n\t\"fcy;\":                      '\\U00000444',\n\t\"female;\":                   '\\U00002640',\n\t\"ffilig;\":                   '\\U0000FB03',\n\t\"fflig;\":                    '\\U0000FB00',\n\t\"ffllig;\":                   '\\U0000FB04',\n\t\"ffr;\":                      '\\U0001D523',\n\t\"filig;\":                    '\\U0000FB01',\n\t\"flat;\":                     '\\U0000266D',\n\t\"fllig;\":                    '\\U0000FB02',\n\t\"fltns;\":                    '\\U000025B1',\n\t\"fnof;\":                     '\\U00000192',\n\t\"fopf;\":                     '\\U0001D557',\n\t\"forall;\":                   '\\U00002200',\n\t\"fork;\":                     '\\U000022D4',\n\t\"forkv;\":                    '\\U00002AD9',\n\t\"fpartint;\":                 '\\U00002A0D',\n\t\"frac12;\":                   '\\U000000BD',\n\t\"frac13;\":                   '\\U00002153',\n\t\"frac14;\":                   '\\U000000BC',\n\t\"frac15;\":                   '\\U00002155',\n\t\"frac16;\":                   '\\U00002159',\n\t\"frac18;\":                   '\\U0000215B',\n\t\"frac23;\":                   '\\U00002154',\n\t\"frac25;\":                   '\\U00002156',\n\t\"frac34;\":                   '\\U000000BE',\n\t\"frac35;\":                   '\\U00002157',\n\t\"frac38;\":                   '\\U0000215C',\n\t\"frac45;\":                   '\\U00002158',\n\t\"frac56;\":                   '\\U0000215A',\n\t\"frac58;\":                   '\\U0000215D',\n\t\"frac78;\":                   '\\U0000215E',\n\t\"frasl;\":                    '\\U00002044',\n\t\"frown;\":                    '\\U00002322',\n\t\"fscr;\":                     '\\U0001D4BB',\n\t\"gE;\":                       '\\U00002267',\n\t\"gEl;\":                      '\\U00002A8C',\n\t\"gacute;\":                   '\\U000001F5',\n\t\"gamma;\":                    '\\U000003B3',\n\t\"gammad;\":                   '\\U000003DD',\n\t\"gap;\":                      '\\U00002A86',\n\t\"gbreve;\":                   '\\U0000011F',\n\t\"gcirc;\":                    '\\U0000011D',\n\t\"gcy;\":                      '\\U00000433',\n\t\"gdot;\":                     '\\U00000121',\n\t\"ge;\":                       '\\U00002265',\n\t\"gel;\":                      '\\U000022DB',\n\t\"geq;\":                      '\\U00002265',\n\t\"geqq;\":                     '\\U00002267',\n\t\"geqslant;\":                 '\\U00002A7E',\n\t\"ges;\":                      '\\U00002A7E',\n\t\"gescc;\":                    '\\U00002AA9',\n\t\"gesdot;\":                   '\\U00002A80',\n\t\"gesdoto;\":                  '\\U00002A82',\n\t\"gesdotol;\":                 '\\U00002A84',\n\t\"gesles;\":                   '\\U00002A94',\n\t\"gfr;\":                      '\\U0001D524',\n\t\"gg;\":                       '\\U0000226B',\n\t\"ggg;\":                      '\\U000022D9',\n\t\"gimel;\":                    '\\U00002137',\n\t\"gjcy;\":                     '\\U00000453',\n\t\"gl;\":                       '\\U00002277',\n\t\"glE;\":                      '\\U00002A92',\n\t\"gla;\":                      '\\U00002AA5',\n\t\"glj;\":                      '\\U00002AA4',\n\t\"gnE;\":                      '\\U00002269',\n\t\"gnap;\":                     '\\U00002A8A',\n\t\"gnapprox;\":                 '\\U00002A8A',\n\t\"gne;\":                      '\\U00002A88',\n\t\"gneq;\":                     '\\U00002A88',\n\t\"gneqq;\":                    '\\U00002269',\n\t\"gnsim;\":                    '\\U000022E7',\n\t\"gopf;\":                     '\\U0001D558',\n\t\"grave;\":                    '\\U00000060',\n\t\"gscr;\":                     '\\U0000210A',\n\t\"gsim;\":                     '\\U00002273',\n\t\"gsime;\":                    '\\U00002A8E',\n\t\"gsiml;\":                    '\\U00002A90',\n\t\"gt;\":                       '\\U0000003E',\n\t\"gtcc;\":                     '\\U00002AA7',\n\t\"gtcir;\":                    '\\U00002A7A',\n\t\"gtdot;\":                    '\\U000022D7',\n\t\"gtlPar;\":                   '\\U00002995',\n\t\"gtquest;\":                  '\\U00002A7C',\n\t\"gtrapprox;\":                '\\U00002A86',\n\t\"gtrarr;\":                   '\\U00002978',\n\t\"gtrdot;\":                   '\\U000022D7',\n\t\"gtreqless;\":                '\\U000022DB',\n\t\"gtreqqless;\":               '\\U00002A8C',\n\t\"gtrless;\":                  '\\U00002277',\n\t\"gtrsim;\":                   '\\U00002273',\n\t\"hArr;\":                     '\\U000021D4',\n\t\"hairsp;\":                   '\\U0000200A',\n\t\"half;\":                     '\\U000000BD',\n\t\"hamilt;\":                   '\\U0000210B',\n\t\"hardcy;\":                   '\\U0000044A',\n\t\"harr;\":                     '\\U00002194',\n\t\"harrcir;\":                  '\\U00002948',\n\t\"harrw;\":                    '\\U000021AD',\n\t\"hbar;\":                     '\\U0000210F',\n\t\"hcirc;\":                    '\\U00000125',\n\t\"hearts;\":                   '\\U00002665',\n\t\"heartsuit;\":                '\\U00002665',\n\t\"hellip;\":                   '\\U00002026',\n\t\"hercon;\":                   '\\U000022B9',\n\t\"hfr;\":                      '\\U0001D525',\n\t\"hksearow;\":                 '\\U00002925',\n\t\"hkswarow;\":                 '\\U00002926',\n\t\"hoarr;\":                    '\\U000021FF',\n\t\"homtht;\":                   '\\U0000223B',\n\t\"hookleftarrow;\":            '\\U000021A9',\n\t\"hookrightarrow;\":           '\\U000021AA',\n\t\"hopf;\":                     '\\U0001D559',\n\t\"horbar;\":                   '\\U00002015',\n\t\"hscr;\":                     '\\U0001D4BD',\n\t\"hslash;\":                   '\\U0000210F',\n\t\"hstrok;\":                   '\\U00000127',\n\t\"hybull;\":                   '\\U00002043',\n\t\"hyphen;\":                   '\\U00002010',\n\t\"iacute;\":                   '\\U000000ED',\n\t\"ic;\":                       '\\U00002063',\n\t\"icirc;\":                    '\\U000000EE',\n\t\"icy;\":                      '\\U00000438',\n\t\"iecy;\":                     '\\U00000435',\n\t\"iexcl;\":                    '\\U000000A1',\n\t\"iff;\":                      '\\U000021D4',\n\t\"ifr;\":                      '\\U0001D526',\n\t\"igrave;\":                   '\\U000000EC',\n\t\"ii;\":                       '\\U00002148',\n\t\"iiiint;\":                   '\\U00002A0C',\n\t\"iiint;\":                    '\\U0000222D',\n\t\"iinfin;\":                   '\\U000029DC',\n\t\"iiota;\":                    '\\U00002129',\n\t\"ijlig;\":                    '\\U00000133',\n\t\"imacr;\":                    '\\U0000012B',\n\t\"image;\":                    '\\U00002111',\n\t\"imagline;\":                 '\\U00002110',\n\t\"imagpart;\":                 '\\U00002111',\n\t\"imath;\":                    '\\U00000131',\n\t\"imof;\":                     '\\U000022B7',\n\t\"imped;\":                    '\\U000001B5',\n\t\"in;\":                       '\\U00002208',\n\t\"incare;\":                   '\\U00002105',\n\t\"infin;\":                    '\\U0000221E',\n\t\"infintie;\":                 '\\U000029DD',\n\t\"inodot;\":                   '\\U00000131',\n\t\"int;\":                      '\\U0000222B',\n\t\"intcal;\":                   '\\U000022BA',\n\t\"integers;\":                 '\\U00002124',\n\t\"intercal;\":                 '\\U000022BA',\n\t\"intlarhk;\":                 '\\U00002A17',\n\t\"intprod;\":                  '\\U00002A3C',\n\t\"iocy;\":                     '\\U00000451',\n\t\"iogon;\":                    '\\U0000012F',\n\t\"iopf;\":                     '\\U0001D55A',\n\t\"iota;\":                     '\\U000003B9',\n\t\"iprod;\":                    '\\U00002A3C',\n\t\"iquest;\":                   '\\U000000BF',\n\t\"iscr;\":                     '\\U0001D4BE',\n\t\"isin;\":                     '\\U00002208',\n\t\"isinE;\":                    '\\U000022F9',\n\t\"isindot;\":                  '\\U000022F5',\n\t\"isins;\":                    '\\U000022F4',\n\t\"isinsv;\":                   '\\U000022F3',\n\t\"isinv;\":                    '\\U00002208',\n\t\"it;\":                       '\\U00002062',\n\t\"itilde;\":                   '\\U00000129',\n\t\"iukcy;\":                    '\\U00000456',\n\t\"iuml;\":                     '\\U000000EF',\n\t\"jcirc;\":                    '\\U00000135',\n\t\"jcy;\":                      '\\U00000439',\n\t\"jfr;\":                      '\\U0001D527',\n\t\"jmath;\":                    '\\U00000237',\n\t\"jopf;\":                     '\\U0001D55B',\n\t\"jscr;\":                     '\\U0001D4BF',\n\t\"jsercy;\":                   '\\U00000458',\n\t\"jukcy;\":                    '\\U00000454',\n\t\"kappa;\":                    '\\U000003BA',\n\t\"kappav;\":                   '\\U000003F0',\n\t\"kcedil;\":                   '\\U00000137',\n\t\"kcy;\":                      '\\U0000043A',\n\t\"kfr;\":                      '\\U0001D528',\n\t\"kgreen;\":                   '\\U00000138',\n\t\"khcy;\":                     '\\U00000445',\n\t\"kjcy;\":                     '\\U0000045C',\n\t\"kopf;\":                     '\\U0001D55C',\n\t\"kscr;\":                     '\\U0001D4C0',\n\t\"lAarr;\":                    '\\U000021DA',\n\t\"lArr;\":                     '\\U000021D0',\n\t\"lAtail;\":                   '\\U0000291B',\n\t\"lBarr;\":                    '\\U0000290E',\n\t\"lE;\":                       '\\U00002266',\n\t\"lEg;\":                      '\\U00002A8B',\n\t\"lHar;\":                     '\\U00002962',\n\t\"lacute;\":                   '\\U0000013A',\n\t\"laemptyv;\":                 '\\U000029B4',\n\t\"lagran;\":                   '\\U00002112',\n\t\"lambda;\":                   '\\U000003BB',\n\t\"lang;\":                     '\\U000027E8',\n\t\"langd;\":                    '\\U00002991',\n\t\"langle;\":                   '\\U000027E8',\n\t\"lap;\":                      '\\U00002A85',\n\t\"laquo;\":                    '\\U000000AB',\n\t\"larr;\":                     '\\U00002190',\n\t\"larrb;\":                    '\\U000021E4',\n\t\"larrbfs;\":                  '\\U0000291F',\n\t\"larrfs;\":                   '\\U0000291D',\n\t\"larrhk;\":                   '\\U000021A9',\n\t\"larrlp;\":                   '\\U000021AB',\n\t\"larrpl;\":                   '\\U00002939',\n\t\"larrsim;\":                  '\\U00002973',\n\t\"larrtl;\":                   '\\U000021A2',\n\t\"lat;\":                      '\\U00002AAB',\n\t\"latail;\":                   '\\U00002919',\n\t\"late;\":                     '\\U00002AAD',\n\t\"lbarr;\":                    '\\U0000290C',\n\t\"lbbrk;\":                    '\\U00002772',\n\t\"lbrace;\":                   '\\U0000007B',\n\t\"lbrack;\":                   '\\U0000005B',\n\t\"lbrke;\":                    '\\U0000298B',\n\t\"lbrksld;\":                  '\\U0000298F',\n\t\"lbrkslu;\":                  '\\U0000298D',\n\t\"lcaron;\":                   '\\U0000013E',\n\t\"lcedil;\":                   '\\U0000013C',\n\t\"lceil;\":                    '\\U00002308',\n\t\"lcub;\":                     '\\U0000007B',\n\t\"lcy;\":                      '\\U0000043B',\n\t\"ldca;\":                     '\\U00002936',\n\t\"ldquo;\":                    '\\U0000201C',\n\t\"ldquor;\":                   '\\U0000201E',\n\t\"ldrdhar;\":                  '\\U00002967',\n\t\"ldrushar;\":                 '\\U0000294B',\n\t\"ldsh;\":                     '\\U000021B2',\n\t\"le;\":                       '\\U00002264',\n\t\"leftarrow;\":                '\\U00002190',\n\t\"leftarrowtail;\":            '\\U000021A2',\n\t\"leftharpoondown;\":          '\\U000021BD',\n\t\"leftharpoonup;\":            '\\U000021BC',\n\t\"leftleftarrows;\":           '\\U000021C7',\n\t\"leftrightarrow;\":           '\\U00002194',\n\t\"leftrightarrows;\":          '\\U000021C6',\n\t\"leftrightharpoons;\":        '\\U000021CB',\n\t\"leftrightsquigarrow;\":      '\\U000021AD',\n\t\"leftthreetimes;\":           '\\U000022CB',\n\t\"leg;\":                      '\\U000022DA',\n\t\"leq;\":                      '\\U00002264',\n\t\"leqq;\":                     '\\U00002266',\n\t\"leqslant;\":                 '\\U00002A7D',\n\t\"les;\":                      '\\U00002A7D',\n\t\"lescc;\":                    '\\U00002AA8',\n\t\"lesdot;\":                   '\\U00002A7F',\n\t\"lesdoto;\":                  '\\U00002A81',\n\t\"lesdotor;\":                 '\\U00002A83',\n\t\"lesges;\":                   '\\U00002A93',\n\t\"lessapprox;\":               '\\U00002A85',\n\t\"lessdot;\":                  '\\U000022D6',\n\t\"lesseqgtr;\":                '\\U000022DA',\n\t\"lesseqqgtr;\":               '\\U00002A8B',\n\t\"lessgtr;\":                  '\\U00002276',\n\t\"lesssim;\":                  '\\U00002272',\n\t\"lfisht;\":                   '\\U0000297C',\n\t\"lfloor;\":                   '\\U0000230A',\n\t\"lfr;\":                      '\\U0001D529',\n\t\"lg;\":                       '\\U00002276',\n\t\"lgE;\":                      '\\U00002A91',\n\t\"lhard;\":                    '\\U000021BD',\n\t\"lharu;\":                    '\\U000021BC',\n\t\"lharul;\":                   '\\U0000296A',\n\t\"lhblk;\":                    '\\U00002584',\n\t\"ljcy;\":                     '\\U00000459',\n\t\"ll;\":                       '\\U0000226A',\n\t\"llarr;\":                    '\\U000021C7',\n\t\"llcorner;\":                 '\\U0000231E',\n\t\"llhard;\":                   '\\U0000296B',\n\t\"lltri;\":                    '\\U000025FA',\n\t\"lmidot;\":                   '\\U00000140',\n\t\"lmoust;\":                   '\\U000023B0',\n\t\"lmoustache;\":               '\\U000023B0',\n\t\"lnE;\":                      '\\U00002268',\n\t\"lnap;\":                     '\\U00002A89',\n\t\"lnapprox;\":                 '\\U00002A89',\n\t\"lne;\":                      '\\U00002A87',\n\t\"lneq;\":                     '\\U00002A87',\n\t\"lneqq;\":                    '\\U00002268',\n\t\"lnsim;\":                    '\\U000022E6',\n\t\"loang;\":                    '\\U000027EC',\n\t\"loarr;\":                    '\\U000021FD',\n\t\"lobrk;\":                    '\\U000027E6',\n\t\"longleftarrow;\":            '\\U000027F5',\n\t\"longleftrightarrow;\":       '\\U000027F7',\n\t\"longmapsto;\":               '\\U000027FC',\n\t\"longrightarrow;\":           '\\U000027F6',\n\t\"looparrowleft;\":            '\\U000021AB',\n\t\"looparrowright;\":           '\\U000021AC',\n\t\"lopar;\":                    '\\U00002985',\n\t\"lopf;\":                     '\\U0001D55D',\n\t\"loplus;\":                   '\\U00002A2D',\n\t\"lotimes;\":                  '\\U00002A34',\n\t\"lowast;\":                   '\\U00002217',\n\t\"lowbar;\":                   '\\U0000005F',\n\t\"loz;\":                      '\\U000025CA',\n\t\"lozenge;\":                  '\\U000025CA',\n\t\"lozf;\":                     '\\U000029EB',\n\t\"lpar;\":                     '\\U00000028',\n\t\"lparlt;\":                   '\\U00002993',\n\t\"lrarr;\":                    '\\U000021C6',\n\t\"lrcorner;\":                 '\\U0000231F',\n\t\"lrhar;\":                    '\\U000021CB',\n\t\"lrhard;\":                   '\\U0000296D',\n\t\"lrm;\":                      '\\U0000200E',\n\t\"lrtri;\":                    '\\U000022BF',\n\t\"lsaquo;\":                   '\\U00002039',\n\t\"lscr;\":                     '\\U0001D4C1',\n\t\"lsh;\":                      '\\U000021B0',\n\t\"lsim;\":                     '\\U00002272',\n\t\"lsime;\":                    '\\U00002A8D',\n\t\"lsimg;\":                    '\\U00002A8F',\n\t\"lsqb;\":                     '\\U0000005B',\n\t\"lsquo;\":                    '\\U00002018',\n\t\"lsquor;\":                   '\\U0000201A',\n\t\"lstrok;\":                   '\\U00000142',\n\t\"lt;\":                       '\\U0000003C',\n\t\"ltcc;\":                     '\\U00002AA6',\n\t\"ltcir;\":                    '\\U00002A79',\n\t\"ltdot;\":                    '\\U000022D6',\n\t\"lthree;\":                   '\\U000022CB',\n\t\"ltimes;\":                   '\\U000022C9',\n\t\"ltlarr;\":                   '\\U00002976',\n\t\"ltquest;\":                  '\\U00002A7B',\n\t\"ltrPar;\":                   '\\U00002996',\n\t\"ltri;\":                     '\\U000025C3',\n\t\"ltrie;\":                    '\\U000022B4',\n\t\"ltrif;\":                    '\\U000025C2',\n\t\"lurdshar;\":                 '\\U0000294A',\n\t\"luruhar;\":                  '\\U00002966',\n\t\"mDDot;\":                    '\\U0000223A',\n\t\"macr;\":                     '\\U000000AF',\n\t\"male;\":                     '\\U00002642',\n\t\"malt;\":                     '\\U00002720',\n\t\"maltese;\":                  '\\U00002720',\n\t\"map;\":                      '\\U000021A6',\n\t\"mapsto;\":                   '\\U000021A6',\n\t\"mapstodown;\":               '\\U000021A7',\n\t\"mapstoleft;\":               '\\U000021A4',\n\t\"mapstoup;\":                 '\\U000021A5',\n\t\"marker;\":                   '\\U000025AE',\n\t\"mcomma;\":                   '\\U00002A29',\n\t\"mcy;\":                      '\\U0000043C',\n\t\"mdash;\":                    '\\U00002014',\n\t\"measuredangle;\":            '\\U00002221',\n\t\"mfr;\":                      '\\U0001D52A',\n\t\"mho;\":                      '\\U00002127',\n\t\"micro;\":                    '\\U000000B5',\n\t\"mid;\":                      '\\U00002223',\n\t\"midast;\":                   '\\U0000002A',\n\t\"midcir;\":                   '\\U00002AF0',\n\t\"middot;\":                   '\\U000000B7',\n\t\"minus;\":                    '\\U00002212',\n\t\"minusb;\":                   '\\U0000229F',\n\t\"minusd;\":                   '\\U00002238',\n\t\"minusdu;\":                  '\\U00002A2A',\n\t\"mlcp;\":                     '\\U00002ADB',\n\t\"mldr;\":                     '\\U00002026',\n\t\"mnplus;\":                   '\\U00002213',\n\t\"models;\":                   '\\U000022A7',\n\t\"mopf;\":                     '\\U0001D55E',\n\t\"mp;\":                       '\\U00002213',\n\t\"mscr;\":                     '\\U0001D4C2',\n\t\"mstpos;\":                   '\\U0000223E',\n\t\"mu;\":                       '\\U000003BC',\n\t\"multimap;\":                 '\\U000022B8',\n\t\"mumap;\":                    '\\U000022B8',\n\t\"nLeftarrow;\":               '\\U000021CD',\n\t\"nLeftrightarrow;\":          '\\U000021CE',\n\t\"nRightarrow;\":              '\\U000021CF',\n\t\"nVDash;\":                   '\\U000022AF',\n\t\"nVdash;\":                   '\\U000022AE',\n\t\"nabla;\":                    '\\U00002207',\n\t\"nacute;\":                   '\\U00000144',\n\t\"nap;\":                      '\\U00002249',\n\t\"napos;\":                    '\\U00000149',\n\t\"napprox;\":                  '\\U00002249',\n\t\"natur;\":                    '\\U0000266E',\n\t\"natural;\":                  '\\U0000266E',\n\t\"naturals;\":                 '\\U00002115',\n\t\"nbsp;\":                     '\\U000000A0',\n\t\"ncap;\":                     '\\U00002A43',\n\t\"ncaron;\":                   '\\U00000148',\n\t\"ncedil;\":                   '\\U00000146',\n\t\"ncong;\":                    '\\U00002247',\n\t\"ncup;\":                     '\\U00002A42',\n\t\"ncy;\":                      '\\U0000043D',\n\t\"ndash;\":                    '\\U00002013',\n\t\"ne;\":                       '\\U00002260',\n\t\"neArr;\":                    '\\U000021D7',\n\t\"nearhk;\":                   '\\U00002924',\n\t\"nearr;\":                    '\\U00002197',\n\t\"nearrow;\":                  '\\U00002197',\n\t\"nequiv;\":                   '\\U00002262',\n\t\"nesear;\":                   '\\U00002928',\n\t\"nexist;\":                   '\\U00002204',\n\t\"nexists;\":                  '\\U00002204',\n\t\"nfr;\":                      '\\U0001D52B',\n\t\"nge;\":                      '\\U00002271',\n\t\"ngeq;\":                     '\\U00002271',\n\t\"ngsim;\":                    '\\U00002275',\n\t\"ngt;\":                      '\\U0000226F',\n\t\"ngtr;\":                     '\\U0000226F',\n\t\"nhArr;\":                    '\\U000021CE',\n\t\"nharr;\":                    '\\U000021AE',\n\t\"nhpar;\":                    '\\U00002AF2',\n\t\"ni;\":                       '\\U0000220B',\n\t\"nis;\":                      '\\U000022FC',\n\t\"nisd;\":                     '\\U000022FA',\n\t\"niv;\":                      '\\U0000220B',\n\t\"njcy;\":                     '\\U0000045A',\n\t\"nlArr;\":                    '\\U000021CD',\n\t\"nlarr;\":                    '\\U0000219A',\n\t\"nldr;\":                     '\\U00002025',\n\t\"nle;\":                      '\\U00002270',\n\t\"nleftarrow;\":               '\\U0000219A',\n\t\"nleftrightarrow;\":          '\\U000021AE',\n\t\"nleq;\":                     '\\U00002270',\n\t\"nless;\":                    '\\U0000226E',\n\t\"nlsim;\":                    '\\U00002274',\n\t\"nlt;\":                      '\\U0000226E',\n\t\"nltri;\":                    '\\U000022EA',\n\t\"nltrie;\":                   '\\U000022EC',\n\t\"nmid;\":                     '\\U00002224',\n\t\"nopf;\":                     '\\U0001D55F',\n\t\"not;\":                      '\\U000000AC',\n\t\"notin;\":                    '\\U00002209',\n\t\"notinva;\":                  '\\U00002209',\n\t\"notinvb;\":                  '\\U000022F7',\n\t\"notinvc;\":                  '\\U000022F6',\n\t\"notni;\":                    '\\U0000220C',\n\t\"notniva;\":                  '\\U0000220C',\n\t\"notnivb;\":                  '\\U000022FE',\n\t\"notnivc;\":                  '\\U000022FD',\n\t\"npar;\":                     '\\U00002226',\n\t\"nparallel;\":                '\\U00002226',\n\t\"npolint;\":                  '\\U00002A14',\n\t\"npr;\":                      '\\U00002280',\n\t\"nprcue;\":                   '\\U000022E0',\n\t\"nprec;\":                    '\\U00002280',\n\t\"nrArr;\":                    '\\U000021CF',\n\t\"nrarr;\":                    '\\U0000219B',\n\t\"nrightarrow;\":              '\\U0000219B',\n\t\"nrtri;\":                    '\\U000022EB',\n\t\"nrtrie;\":                   '\\U000022ED',\n\t\"nsc;\":                      '\\U00002281',\n\t\"nsccue;\":                   '\\U000022E1',\n\t\"nscr;\":                     '\\U0001D4C3',\n\t\"nshortmid;\":                '\\U00002224',\n\t\"nshortparallel;\":           '\\U00002226',\n\t\"nsim;\":                     '\\U00002241',\n\t\"nsime;\":                    '\\U00002244',\n\t\"nsimeq;\":                   '\\U00002244',\n\t\"nsmid;\":                    '\\U00002224',\n\t\"nspar;\":                    '\\U00002226',\n\t\"nsqsube;\":                  '\\U000022E2',\n\t\"nsqsupe;\":                  '\\U000022E3',\n\t\"nsub;\":                     '\\U00002284',\n\t\"nsube;\":                    '\\U00002288',\n\t\"nsubseteq;\":                '\\U00002288',\n\t\"nsucc;\":                    '\\U00002281',\n\t\"nsup;\":                     '\\U00002285',\n\t\"nsupe;\":                    '\\U00002289',\n\t\"nsupseteq;\":                '\\U00002289',\n\t\"ntgl;\":                     '\\U00002279',\n\t\"ntilde;\":                   '\\U000000F1',\n\t\"ntlg;\":                     '\\U00002278',\n\t\"ntriangleleft;\":            '\\U000022EA',\n\t\"ntrianglelefteq;\":          '\\U000022EC',\n\t\"ntriangleright;\":           '\\U000022EB',\n\t\"ntrianglerighteq;\":         '\\U000022ED',\n\t\"nu;\":                       '\\U000003BD',\n\t\"num;\":                      '\\U00000023',\n\t\"numero;\":                   '\\U00002116',\n\t\"numsp;\":                    '\\U00002007',\n\t\"nvDash;\":                   '\\U000022AD',\n\t\"nvHarr;\":                   '\\U00002904',\n\t\"nvdash;\":                   '\\U000022AC',\n\t\"nvinfin;\":                  '\\U000029DE',\n\t\"nvlArr;\":                   '\\U00002902',\n\t\"nvrArr;\":                   '\\U00002903',\n\t\"nwArr;\":                    '\\U000021D6',\n\t\"nwarhk;\":                   '\\U00002923',\n\t\"nwarr;\":                    '\\U00002196',\n\t\"nwarrow;\":                  '\\U00002196',\n\t\"nwnear;\":                   '\\U00002927',\n\t\"oS;\":                       '\\U000024C8',\n\t\"oacute;\":                   '\\U000000F3',\n\t\"oast;\":                     '\\U0000229B',\n\t\"ocir;\":                     '\\U0000229A',\n\t\"ocirc;\":                    '\\U000000F4',\n\t\"ocy;\":                      '\\U0000043E',\n\t\"odash;\":                    '\\U0000229D',\n\t\"odblac;\":                   '\\U00000151',\n\t\"odiv;\":                     '\\U00002A38',\n\t\"odot;\":                     '\\U00002299',\n\t\"odsold;\":                   '\\U000029BC',\n\t\"oelig;\":                    '\\U00000153',\n\t\"ofcir;\":                    '\\U000029BF',\n\t\"ofr;\":                      '\\U0001D52C',\n\t\"ogon;\":                     '\\U000002DB',\n\t\"ograve;\":                   '\\U000000F2',\n\t\"ogt;\":                      '\\U000029C1',\n\t\"ohbar;\":                    '\\U000029B5',\n\t\"ohm;\":                      '\\U000003A9',\n\t\"oint;\":                     '\\U0000222E',\n\t\"olarr;\":                    '\\U000021BA',\n\t\"olcir;\":                    '\\U000029BE',\n\t\"olcross;\":                  '\\U000029BB',\n\t\"oline;\":                    '\\U0000203E',\n\t\"olt;\":                      '\\U000029C0',\n\t\"omacr;\":                    '\\U0000014D',\n\t\"omega;\":                    '\\U000003C9',\n\t\"omicron;\":                  '\\U000003BF',\n\t\"omid;\":                     '\\U000029B6',\n\t\"ominus;\":                   '\\U00002296',\n\t\"oopf;\":                     '\\U0001D560',\n\t\"opar;\":                     '\\U000029B7',\n\t\"operp;\":                    '\\U000029B9',\n\t\"oplus;\":                    '\\U00002295',\n\t\"or;\":                       '\\U00002228',\n\t\"orarr;\":                    '\\U000021BB',\n\t\"ord;\":                      '\\U00002A5D',\n\t\"order;\":                    '\\U00002134',\n\t\"orderof;\":                  '\\U00002134',\n\t\"ordf;\":                     '\\U000000AA',\n\t\"ordm;\":                     '\\U000000BA',\n\t\"origof;\":                   '\\U000022B6',\n\t\"oror;\":                     '\\U00002A56',\n\t\"orslope;\":                  '\\U00002A57',\n\t\"orv;\":                      '\\U00002A5B',\n\t\"oscr;\":                     '\\U00002134',\n\t\"oslash;\":                   '\\U000000F8',\n\t\"osol;\":                     '\\U00002298',\n\t\"otilde;\":                   '\\U000000F5',\n\t\"otimes;\":                   '\\U00002297',\n\t\"otimesas;\":                 '\\U00002A36',\n\t\"ouml;\":                     '\\U000000F6',\n\t\"ovbar;\":                    '\\U0000233D',\n\t\"par;\":                      '\\U00002225',\n\t\"para;\":                     '\\U000000B6',\n\t\"parallel;\":                 '\\U00002225',\n\t\"parsim;\":                   '\\U00002AF3',\n\t\"parsl;\":                    '\\U00002AFD',\n\t\"part;\":                     '\\U00002202',\n\t\"pcy;\":                      '\\U0000043F',\n\t\"percnt;\":                   '\\U00000025',\n\t\"period;\":                   '\\U0000002E',\n\t\"permil;\":                   '\\U00002030',\n\t\"perp;\":                     '\\U000022A5',\n\t\"pertenk;\":                  '\\U00002031',\n\t\"pfr;\":                      '\\U0001D52D',\n\t\"phi;\":                      '\\U000003C6',\n\t\"phiv;\":                     '\\U000003D5',\n\t\"phmmat;\":                   '\\U00002133',\n\t\"phone;\":                    '\\U0000260E',\n\t\"pi;\":                       '\\U000003C0',\n\t\"pitchfork;\":                '\\U000022D4',\n\t\"piv;\":                      '\\U000003D6',\n\t\"planck;\":                   '\\U0000210F',\n\t\"planckh;\":                  '\\U0000210E',\n\t\"plankv;\":                   '\\U0000210F',\n\t\"plus;\":                     '\\U0000002B',\n\t\"plusacir;\":                 '\\U00002A23',\n\t\"plusb;\":                    '\\U0000229E',\n\t\"pluscir;\":                  '\\U00002A22',\n\t\"plusdo;\":                   '\\U00002214',\n\t\"plusdu;\":                   '\\U00002A25',\n\t\"pluse;\":                    '\\U00002A72',\n\t\"plusmn;\":                   '\\U000000B1',\n\t\"plussim;\":                  '\\U00002A26',\n\t\"plustwo;\":                  '\\U00002A27',\n\t\"pm;\":                       '\\U000000B1',\n\t\"pointint;\":                 '\\U00002A15',\n\t\"popf;\":                     '\\U0001D561',\n\t\"pound;\":                    '\\U000000A3',\n\t\"pr;\":                       '\\U0000227A',\n\t\"prE;\":                      '\\U00002AB3',\n\t\"prap;\":                     '\\U00002AB7',\n\t\"prcue;\":                    '\\U0000227C',\n\t\"pre;\":                      '\\U00002AAF',\n\t\"prec;\":                     '\\U0000227A',\n\t\"precapprox;\":               '\\U00002AB7',\n\t\"preccurlyeq;\":              '\\U0000227C',\n\t\"preceq;\":                   '\\U00002AAF',\n\t\"precnapprox;\":              '\\U00002AB9',\n\t\"precneqq;\":                 '\\U00002AB5',\n\t\"precnsim;\":                 '\\U000022E8',\n\t\"precsim;\":                  '\\U0000227E',\n\t\"prime;\":                    '\\U00002032',\n\t\"primes;\":                   '\\U00002119',\n\t\"prnE;\":                     '\\U00002AB5',\n\t\"prnap;\":                    '\\U00002AB9',\n\t\"prnsim;\":                   '\\U000022E8',\n\t\"prod;\":                     '\\U0000220F',\n\t\"profalar;\":                 '\\U0000232E',\n\t\"profline;\":                 '\\U00002312',\n\t\"profsurf;\":                 '\\U00002313',\n\t\"prop;\":                     '\\U0000221D',\n\t\"propto;\":                   '\\U0000221D',\n\t\"prsim;\":                    '\\U0000227E',\n\t\"prurel;\":                   '\\U000022B0',\n\t\"pscr;\":                     '\\U0001D4C5',\n\t\"psi;\":                      '\\U000003C8',\n\t\"puncsp;\":                   '\\U00002008',\n\t\"qfr;\":                      '\\U0001D52E',\n\t\"qint;\":                     '\\U00002A0C',\n\t\"qopf;\":                     '\\U0001D562',\n\t\"qprime;\":                   '\\U00002057',\n\t\"qscr;\":                     '\\U0001D4C6',\n\t\"quaternions;\":              '\\U0000210D',\n\t\"quatint;\":                  '\\U00002A16',\n\t\"quest;\":                    '\\U0000003F',\n\t\"questeq;\":                  '\\U0000225F',\n\t\"quot;\":                     '\\U00000022',\n\t\"rAarr;\":                    '\\U000021DB',\n\t\"rArr;\":                     '\\U000021D2',\n\t\"rAtail;\":                   '\\U0000291C',\n\t\"rBarr;\":                    '\\U0000290F',\n\t\"rHar;\":                     '\\U00002964',\n\t\"racute;\":                   '\\U00000155',\n\t\"radic;\":                    '\\U0000221A',\n\t\"raemptyv;\":                 '\\U000029B3',\n\t\"rang;\":                     '\\U000027E9',\n\t\"rangd;\":                    '\\U00002992',\n\t\"range;\":                    '\\U000029A5',\n\t\"rangle;\":                   '\\U000027E9',\n\t\"raquo;\":                    '\\U000000BB',\n\t\"rarr;\":                     '\\U00002192',\n\t\"rarrap;\":                   '\\U00002975',\n\t\"rarrb;\":                    '\\U000021E5',\n\t\"rarrbfs;\":                  '\\U00002920',\n\t\"rarrc;\":                    '\\U00002933',\n\t\"rarrfs;\":                   '\\U0000291E',\n\t\"rarrhk;\":                   '\\U000021AA',\n\t\"rarrlp;\":                   '\\U000021AC',\n\t\"rarrpl;\":                   '\\U00002945',\n\t\"rarrsim;\":                  '\\U00002974',\n\t\"rarrtl;\":                   '\\U000021A3',\n\t\"rarrw;\":                    '\\U0000219D',\n\t\"ratail;\":                   '\\U0000291A',\n\t\"ratio;\":                    '\\U00002236',\n\t\"rationals;\":                '\\U0000211A',\n\t\"rbarr;\":                    '\\U0000290D',\n\t\"rbbrk;\":                    '\\U00002773',\n\t\"rbrace;\":                   '\\U0000007D',\n\t\"rbrack;\":                   '\\U0000005D',\n\t\"rbrke;\":                    '\\U0000298C',\n\t\"rbrksld;\":                  '\\U0000298E',\n\t\"rbrkslu;\":                  '\\U00002990',\n\t\"rcaron;\":                   '\\U00000159',\n\t\"rcedil;\":                   '\\U00000157',\n\t\"rceil;\":                    '\\U00002309',\n\t\"rcub;\":                     '\\U0000007D',\n\t\"rcy;\":                      '\\U00000440',\n\t\"rdca;\":                     '\\U00002937',\n\t\"rdldhar;\":                  '\\U00002969',\n\t\"rdquo;\":                    '\\U0000201D',\n\t\"rdquor;\":                   '\\U0000201D',\n\t\"rdsh;\":                     '\\U000021B3',\n\t\"real;\":                     '\\U0000211C',\n\t\"realine;\":                  '\\U0000211B',\n\t\"realpart;\":                 '\\U0000211C',\n\t\"reals;\":                    '\\U0000211D',\n\t\"rect;\":                     '\\U000025AD',\n\t\"reg;\":                      '\\U000000AE',\n\t\"rfisht;\":                   '\\U0000297D',\n\t\"rfloor;\":                   '\\U0000230B',\n\t\"rfr;\":                      '\\U0001D52F',\n\t\"rhard;\":                    '\\U000021C1',\n\t\"rharu;\":                    '\\U000021C0',\n\t\"rharul;\":                   '\\U0000296C',\n\t\"rho;\":                      '\\U000003C1',\n\t\"rhov;\":                     '\\U000003F1',\n\t\"rightarrow;\":               '\\U00002192',\n\t\"rightarrowtail;\":           '\\U000021A3',\n\t\"rightharpoondown;\":         '\\U000021C1',\n\t\"rightharpoonup;\":           '\\U000021C0',\n\t\"rightleftarrows;\":          '\\U000021C4',\n\t\"rightleftharpoons;\":        '\\U000021CC',\n\t\"rightrightarrows;\":         '\\U000021C9',\n\t\"rightsquigarrow;\":          '\\U0000219D',\n\t\"rightthreetimes;\":          '\\U000022CC',\n\t\"ring;\":                     '\\U000002DA',\n\t\"risingdotseq;\":             '\\U00002253',\n\t\"rlarr;\":                    '\\U000021C4',\n\t\"rlhar;\":                    '\\U000021CC',\n\t\"rlm;\":                      '\\U0000200F',\n\t\"rmoust;\":                   '\\U000023B1',\n\t\"rmoustache;\":               '\\U000023B1',\n\t\"rnmid;\":                    '\\U00002AEE',\n\t\"roang;\":                    '\\U000027ED',\n\t\"roarr;\":                    '\\U000021FE',\n\t\"robrk;\":                    '\\U000027E7',\n\t\"ropar;\":                    '\\U00002986',\n\t\"ropf;\":                     '\\U0001D563',\n\t\"roplus;\":                   '\\U00002A2E',\n\t\"rotimes;\":                  '\\U00002A35',\n\t\"rpar;\":                     '\\U00000029',\n\t\"rpargt;\":                   '\\U00002994',\n\t\"rppolint;\":                 '\\U00002A12',\n\t\"rrarr;\":                    '\\U000021C9',\n\t\"rsaquo;\":                   '\\U0000203A',\n\t\"rscr;\":                     '\\U0001D4C7',\n\t\"rsh;\":                      '\\U000021B1',\n\t\"rsqb;\":                     '\\U0000005D',\n\t\"rsquo;\":                    '\\U00002019',\n\t\"rsquor;\":                   '\\U00002019',\n\t\"rthree;\":                   '\\U000022CC',\n\t\"rtimes;\":                   '\\U000022CA',\n\t\"rtri;\":                     '\\U000025B9',\n\t\"rtrie;\":                    '\\U000022B5',\n\t\"rtrif;\":                    '\\U000025B8',\n\t\"rtriltri;\":                 '\\U000029CE',\n\t\"ruluhar;\":                  '\\U00002968',\n\t\"rx;\":                       '\\U0000211E',\n\t\"sacute;\":                   '\\U0000015B',\n\t\"sbquo;\":                    '\\U0000201A',\n\t\"sc;\":                       '\\U0000227B',\n\t\"scE;\":                      '\\U00002AB4',\n\t\"scap;\":                     '\\U00002AB8',\n\t\"scaron;\":                   '\\U00000161',\n\t\"sccue;\":                    '\\U0000227D',\n\t\"sce;\":                      '\\U00002AB0',\n\t\"scedil;\":                   '\\U0000015F',\n\t\"scirc;\":                    '\\U0000015D',\n\t\"scnE;\":                     '\\U00002AB6',\n\t\"scnap;\":                    '\\U00002ABA',\n\t\"scnsim;\":                   '\\U000022E9',\n\t\"scpolint;\":                 '\\U00002A13',\n\t\"scsim;\":                    '\\U0000227F',\n\t\"scy;\":                      '\\U00000441',\n\t\"sdot;\":                     '\\U000022C5',\n\t\"sdotb;\":                    '\\U000022A1',\n\t\"sdote;\":                    '\\U00002A66',\n\t\"seArr;\":                    '\\U000021D8',\n\t\"searhk;\":                   '\\U00002925',\n\t\"searr;\":                    '\\U00002198',\n\t\"searrow;\":                  '\\U00002198',\n\t\"sect;\":                     '\\U000000A7',\n\t\"semi;\":                     '\\U0000003B',\n\t\"seswar;\":                   '\\U00002929',\n\t\"setminus;\":                 '\\U00002216',\n\t\"setmn;\":                    '\\U00002216',\n\t\"sext;\":                     '\\U00002736',\n\t\"sfr;\":                      '\\U0001D530',\n\t\"sfrown;\":                   '\\U00002322',\n\t\"sharp;\":                    '\\U0000266F',\n\t\"shchcy;\":                   '\\U00000449',\n\t\"shcy;\":                     '\\U00000448',\n\t\"shortmid;\":                 '\\U00002223',\n\t\"shortparallel;\":            '\\U00002225',\n\t\"shy;\":                      '\\U000000AD',\n\t\"sigma;\":                    '\\U000003C3',\n\t\"sigmaf;\":                   '\\U000003C2',\n\t\"sigmav;\":                   '\\U000003C2',\n\t\"sim;\":                      '\\U0000223C',\n\t\"simdot;\":                   '\\U00002A6A',\n\t\"sime;\":                     '\\U00002243',\n\t\"simeq;\":                    '\\U00002243',\n\t\"simg;\":                     '\\U00002A9E',\n\t\"simgE;\":                    '\\U00002AA0',\n\t\"siml;\":                     '\\U00002A9D',\n\t\"simlE;\":                    '\\U00002A9F',\n\t\"simne;\":                    '\\U00002246',\n\t\"simplus;\":                  '\\U00002A24',\n\t\"simrarr;\":                  '\\U00002972',\n\t\"slarr;\":                    '\\U00002190',\n\t\"smallsetminus;\":            '\\U00002216',\n\t\"smashp;\":                   '\\U00002A33',\n\t\"smeparsl;\":                 '\\U000029E4',\n\t\"smid;\":                     '\\U00002223',\n\t\"smile;\":                    '\\U00002323',\n\t\"smt;\":                      '\\U00002AAA',\n\t\"smte;\":                     '\\U00002AAC',\n\t\"softcy;\":                   '\\U0000044C',\n\t\"sol;\":                      '\\U0000002F',\n\t\"solb;\":                     '\\U000029C4',\n\t\"solbar;\":                   '\\U0000233F',\n\t\"sopf;\":                     '\\U0001D564',\n\t\"spades;\":                   '\\U00002660',\n\t\"spadesuit;\":                '\\U00002660',\n\t\"spar;\":                     '\\U00002225',\n\t\"sqcap;\":                    '\\U00002293',\n\t\"sqcup;\":                    '\\U00002294',\n\t\"sqsub;\":                    '\\U0000228F',\n\t\"sqsube;\":                   '\\U00002291',\n\t\"sqsubset;\":                 '\\U0000228F',\n\t\"sqsubseteq;\":               '\\U00002291',\n\t\"sqsup;\":                    '\\U00002290',\n\t\"sqsupe;\":                   '\\U00002292',\n\t\"sqsupset;\":                 '\\U00002290',\n\t\"sqsupseteq;\":               '\\U00002292',\n\t\"squ;\":                      '\\U000025A1',\n\t\"square;\":                   '\\U000025A1',\n\t\"squarf;\":                   '\\U000025AA',\n\t\"squf;\":                     '\\U000025AA',\n\t\"srarr;\":                    '\\U00002192',\n\t\"sscr;\":                     '\\U0001D4C8',\n\t\"ssetmn;\":                   '\\U00002216',\n\t\"ssmile;\":                   '\\U00002323',\n\t\"sstarf;\":                   '\\U000022C6',\n\t\"star;\":                     '\\U00002606',\n\t\"starf;\":                    '\\U00002605',\n\t\"straightepsilon;\":          '\\U000003F5',\n\t\"straightphi;\":              '\\U000003D5',\n\t\"strns;\":                    '\\U000000AF',\n\t\"sub;\":                      '\\U00002282',\n\t\"subE;\":                     '\\U00002AC5',\n\t\"subdot;\":                   '\\U00002ABD',\n\t\"sube;\":                     '\\U00002286',\n\t\"subedot;\":                  '\\U00002AC3',\n\t\"submult;\":                  '\\U00002AC1',\n\t\"subnE;\":                    '\\U00002ACB',\n\t\"subne;\":                    '\\U0000228A',\n\t\"subplus;\":                  '\\U00002ABF',\n\t\"subrarr;\":                  '\\U00002979',\n\t\"subset;\":                   '\\U00002282',\n\t\"subseteq;\":                 '\\U00002286',\n\t\"subseteqq;\":                '\\U00002AC5',\n\t\"subsetneq;\":                '\\U0000228A',\n\t\"subsetneqq;\":               '\\U00002ACB',\n\t\"subsim;\":                   '\\U00002AC7',\n\t\"subsub;\":                   '\\U00002AD5',\n\t\"subsup;\":                   '\\U00002AD3',\n\t\"succ;\":                     '\\U0000227B',\n\t\"succapprox;\":               '\\U00002AB8',\n\t\"succcurlyeq;\":              '\\U0000227D',\n\t\"succeq;\":                   '\\U00002AB0',\n\t\"succnapprox;\":              '\\U00002ABA',\n\t\"succneqq;\":                 '\\U00002AB6',\n\t\"succnsim;\":                 '\\U000022E9',\n\t\"succsim;\":                  '\\U0000227F',\n\t\"sum;\":                      '\\U00002211',\n\t\"sung;\":                     '\\U0000266A',\n\t\"sup;\":                      '\\U00002283',\n\t\"sup1;\":                     '\\U000000B9',\n\t\"sup2;\":                     '\\U000000B2',\n\t\"sup3;\":                     '\\U000000B3',\n\t\"supE;\":                     '\\U00002AC6',\n\t\"supdot;\":                   '\\U00002ABE',\n\t\"supdsub;\":                  '\\U00002AD8',\n\t\"supe;\":                     '\\U00002287',\n\t\"supedot;\":                  '\\U00002AC4',\n\t\"suphsol;\":                  '\\U000027C9',\n\t\"suphsub;\":                  '\\U00002AD7',\n\t\"suplarr;\":                  '\\U0000297B',\n\t\"supmult;\":                  '\\U00002AC2',\n\t\"supnE;\":                    '\\U00002ACC',\n\t\"supne;\":                    '\\U0000228B',\n\t\"supplus;\":                  '\\U00002AC0',\n\t\"supset;\":                   '\\U00002283',\n\t\"supseteq;\":                 '\\U00002287',\n\t\"supseteqq;\":                '\\U00002AC6',\n\t\"supsetneq;\":                '\\U0000228B',\n\t\"supsetneqq;\":               '\\U00002ACC',\n\t\"supsim;\":                   '\\U00002AC8',\n\t\"supsub;\":                   '\\U00002AD4',\n\t\"supsup;\":                   '\\U00002AD6',\n\t\"swArr;\":                    '\\U000021D9',\n\t\"swarhk;\":                   '\\U00002926',\n\t\"swarr;\":                    '\\U00002199',\n\t\"swarrow;\":                  '\\U00002199',\n\t\"swnwar;\":                   '\\U0000292A',\n\t\"szlig;\":                    '\\U000000DF',\n\t\"target;\":                   '\\U00002316',\n\t\"tau;\":                      '\\U000003C4',\n\t\"tbrk;\":                     '\\U000023B4',\n\t\"tcaron;\":                   '\\U00000165',\n\t\"tcedil;\":                   '\\U00000163',\n\t\"tcy;\":                      '\\U00000442',\n\t\"tdot;\":                     '\\U000020DB',\n\t\"telrec;\":                   '\\U00002315',\n\t\"tfr;\":                      '\\U0001D531',\n\t\"there4;\":                   '\\U00002234',\n\t\"therefore;\":                '\\U00002234',\n\t\"theta;\":                    '\\U000003B8',\n\t\"thetasym;\":                 '\\U000003D1',\n\t\"thetav;\":                   '\\U000003D1',\n\t\"thickapprox;\":              '\\U00002248',\n\t\"thicksim;\":                 '\\U0000223C',\n\t\"thinsp;\":                   '\\U00002009',\n\t\"thkap;\":                    '\\U00002248',\n\t\"thksim;\":                   '\\U0000223C',\n\t\"thorn;\":                    '\\U000000FE',\n\t\"tilde;\":                    '\\U000002DC',\n\t\"times;\":                    '\\U000000D7',\n\t\"timesb;\":                   '\\U000022A0',\n\t\"timesbar;\":                 '\\U00002A31',\n\t\"timesd;\":                   '\\U00002A30',\n\t\"tint;\":                     '\\U0000222D',\n\t\"toea;\":                     '\\U00002928',\n\t\"top;\":                      '\\U000022A4',\n\t\"topbot;\":                   '\\U00002336',\n\t\"topcir;\":                   '\\U00002AF1',\n\t\"topf;\":                     '\\U0001D565',\n\t\"topfork;\":                  '\\U00002ADA',\n\t\"tosa;\":                     '\\U00002929',\n\t\"tprime;\":                   '\\U00002034',\n\t\"trade;\":                    '\\U00002122',\n\t\"triangle;\":                 '\\U000025B5',\n\t\"triangledown;\":             '\\U000025BF',\n\t\"triangleleft;\":             '\\U000025C3',\n\t\"trianglelefteq;\":           '\\U000022B4',\n\t\"triangleq;\":                '\\U0000225C',\n\t\"triangleright;\":            '\\U000025B9',\n\t\"trianglerighteq;\":          '\\U000022B5',\n\t\"tridot;\":                   '\\U000025EC',\n\t\"trie;\":                     '\\U0000225C',\n\t\"triminus;\":                 '\\U00002A3A',\n\t\"triplus;\":                  '\\U00002A39',\n\t\"trisb;\":                    '\\U000029CD',\n\t\"tritime;\":                  '\\U00002A3B',\n\t\"trpezium;\":                 '\\U000023E2',\n\t\"tscr;\":                     '\\U0001D4C9',\n\t\"tscy;\":                     '\\U00000446',\n\t\"tshcy;\":                    '\\U0000045B',\n\t\"tstrok;\":                   '\\U00000167',\n\t\"twixt;\":                    '\\U0000226C',\n\t\"twoheadleftarrow;\":         '\\U0000219E',\n\t\"twoheadrightarrow;\":        '\\U000021A0',\n\t\"uArr;\":                     '\\U000021D1',\n\t\"uHar;\":                     '\\U00002963',\n\t\"uacute;\":                   '\\U000000FA',\n\t\"uarr;\":                     '\\U00002191',\n\t\"ubrcy;\":                    '\\U0000045E',\n\t\"ubreve;\":                   '\\U0000016D',\n\t\"ucirc;\":                    '\\U000000FB',\n\t\"ucy;\":                      '\\U00000443',\n\t\"udarr;\":                    '\\U000021C5',\n\t\"udblac;\":                   '\\U00000171',\n\t\"udhar;\":                    '\\U0000296E',\n\t\"ufisht;\":                   '\\U0000297E',\n\t\"ufr;\":                      '\\U0001D532',\n\t\"ugrave;\":                   '\\U000000F9',\n\t\"uharl;\":                    '\\U000021BF',\n\t\"uharr;\":                    '\\U000021BE',\n\t\"uhblk;\":                    '\\U00002580',\n\t\"ulcorn;\":                   '\\U0000231C',\n\t\"ulcorner;\":                 '\\U0000231C',\n\t\"ulcrop;\":                   '\\U0000230F',\n\t\"ultri;\":                    '\\U000025F8',\n\t\"umacr;\":                    '\\U0000016B',\n\t\"uml;\":                      '\\U000000A8',\n\t\"uogon;\":                    '\\U00000173',\n\t\"uopf;\":                     '\\U0001D566',\n\t\"uparrow;\":                  '\\U00002191',\n\t\"updownarrow;\":              '\\U00002195',\n\t\"upharpoonleft;\":            '\\U000021BF',\n\t\"upharpoonright;\":           '\\U000021BE',\n\t\"uplus;\":                    '\\U0000228E',\n\t\"upsi;\":                     '\\U000003C5',\n\t\"upsih;\":                    '\\U000003D2',\n\t\"upsilon;\":                  '\\U000003C5',\n\t\"upuparrows;\":               '\\U000021C8',\n\t\"urcorn;\":                   '\\U0000231D',\n\t\"urcorner;\":                 '\\U0000231D',\n\t\"urcrop;\":                   '\\U0000230E',\n\t\"uring;\":                    '\\U0000016F',\n\t\"urtri;\":                    '\\U000025F9',\n\t\"uscr;\":                     '\\U0001D4CA',\n\t\"utdot;\":                    '\\U000022F0',\n\t\"utilde;\":                   '\\U00000169',\n\t\"utri;\":                     '\\U000025B5',\n\t\"utrif;\":                    '\\U000025B4',\n\t\"uuarr;\":                    '\\U000021C8',\n\t\"uuml;\":                     '\\U000000FC',\n\t\"uwangle;\":                  '\\U000029A7',\n\t\"vArr;\":                     '\\U000021D5',\n\t\"vBar;\":                     '\\U00002AE8',\n\t\"vBarv;\":                    '\\U00002AE9',\n\t\"vDash;\":                    '\\U000022A8',\n\t\"vangrt;\":                   '\\U0000299C',\n\t\"varepsilon;\":               '\\U000003F5',\n\t\"varkappa;\":                 '\\U000003F0',\n\t\"varnothing;\":               '\\U00002205',\n\t\"varphi;\":                   '\\U000003D5',\n\t\"varpi;\":                    '\\U000003D6',\n\t\"varpropto;\":                '\\U0000221D',\n\t\"varr;\":                     '\\U00002195',\n\t\"varrho;\":                   '\\U000003F1',\n\t\"varsigma;\":                 '\\U000003C2',\n\t\"vartheta;\":                 '\\U000003D1',\n\t\"vartriangleleft;\":          '\\U000022B2',\n\t\"vartriangleright;\":         '\\U000022B3',\n\t\"vcy;\":                      '\\U00000432',\n\t\"vdash;\":                    '\\U000022A2',\n\t\"vee;\":                      '\\U00002228',\n\t\"veebar;\":                   '\\U000022BB',\n\t\"veeeq;\":                    '\\U0000225A',\n\t\"vellip;\":                   '\\U000022EE',\n\t\"verbar;\":                   '\\U0000007C',\n\t\"vert;\":                     '\\U0000007C',\n\t\"vfr;\":                      '\\U0001D533',\n\t\"vltri;\":                    '\\U000022B2',\n\t\"vopf;\":                     '\\U0001D567',\n\t\"vprop;\":                    '\\U0000221D',\n\t\"vrtri;\":                    '\\U000022B3',\n\t\"vscr;\":                     '\\U0001D4CB',\n\t\"vzigzag;\":                  '\\U0000299A',\n\t\"wcirc;\":                    '\\U00000175',\n\t\"wedbar;\":                   '\\U00002A5F',\n\t\"wedge;\":                    '\\U00002227',\n\t\"wedgeq;\":                   '\\U00002259',\n\t\"weierp;\":                   '\\U00002118',\n\t\"wfr;\":                      '\\U0001D534',\n\t\"wopf;\":                     '\\U0001D568',\n\t\"wp;\":                       '\\U00002118',\n\t\"wr;\":                       '\\U00002240',\n\t\"wreath;\":                   '\\U00002240',\n\t\"wscr;\":                     '\\U0001D4CC',\n\t\"xcap;\":                     '\\U000022C2',\n\t\"xcirc;\":                    '\\U000025EF',\n\t\"xcup;\":                     '\\U000022C3',\n\t\"xdtri;\":                    '\\U000025BD',\n\t\"xfr;\":                      '\\U0001D535',\n\t\"xhArr;\":                    '\\U000027FA',\n\t\"xharr;\":                    '\\U000027F7',\n\t\"xi;\":                       '\\U000003BE',\n\t\"xlArr;\":                    '\\U000027F8',\n\t\"xlarr;\":                    '\\U000027F5',\n\t\"xmap;\":                     '\\U000027FC',\n\t\"xnis;\":                     '\\U000022FB',\n\t\"xodot;\":                    '\\U00002A00',\n\t\"xopf;\":                     '\\U0001D569',\n\t\"xoplus;\":                   '\\U00002A01',\n\t\"xotime;\":                   '\\U00002A02',\n\t\"xrArr;\":                    '\\U000027F9',\n\t\"xrarr;\":                    '\\U000027F6',\n\t\"xscr;\":                     '\\U0001D4CD',\n\t\"xsqcup;\":                   '\\U00002A06',\n\t\"xuplus;\":                   '\\U00002A04',\n\t\"xutri;\":                    '\\U000025B3',\n\t\"xvee;\":                     '\\U000022C1',\n\t\"xwedge;\":                   '\\U000022C0',\n\t\"yacute;\":                   '\\U000000FD',\n\t\"yacy;\":                     '\\U0000044F',\n\t\"ycirc;\":                    '\\U00000177',\n\t\"ycy;\":                      '\\U0000044B',\n\t\"yen;\":                      '\\U000000A5',\n\t\"yfr;\":                      '\\U0001D536',\n\t\"yicy;\":                     '\\U00000457',\n\t\"yopf;\":                     '\\U0001D56A',\n\t\"yscr;\":                     '\\U0001D4CE',\n\t\"yucy;\":                     '\\U0000044E',\n\t\"yuml;\":                     '\\U000000FF',\n\t\"zacute;\":                   '\\U0000017A',\n\t\"zcaron;\":                   '\\U0000017E',\n\t\"zcy;\":                      '\\U00000437',\n\t\"zdot;\":                     '\\U0000017C',\n\t\"zeetrf;\":                   '\\U00002128',\n\t\"zeta;\":                     '\\U000003B6',\n\t\"zfr;\":                      '\\U0001D537',\n\t\"zhcy;\":                     '\\U00000436',\n\t\"zigrarr;\":                  '\\U000021DD',\n\t\"zopf;\":                     '\\U0001D56B',\n\t\"zscr;\":                     '\\U0001D4CF',\n\t\"zwj;\":                      '\\U0000200D',\n\t\"zwnj;\":                     '\\U0000200C',\n\t\"AElig\":                     '\\U000000C6',\n\t\"AMP\":                       '\\U00000026',\n\t\"Aacute\":                    '\\U000000C1',\n\t\"Acirc\":                     '\\U000000C2',\n\t\"Agrave\":                    '\\U000000C0',\n\t\"Aring\":                     '\\U000000C5',\n\t\"Atilde\":                    '\\U000000C3',\n\t\"Auml\":                      '\\U000000C4',\n\t\"COPY\":                      '\\U000000A9',\n\t\"Ccedil\":                    '\\U000000C7',\n\t\"ETH\":                       '\\U000000D0',\n\t\"Eacute\":                    '\\U000000C9',\n\t\"Ecirc\":                     '\\U000000CA',\n\t\"Egrave\":                    '\\U000000C8',\n\t\"Euml\":                      '\\U000000CB',\n\t\"GT\":                        '\\U0000003E',\n\t\"Iacute\":                    '\\U000000CD',\n\t\"Icirc\":                     '\\U000000CE',\n\t\"Igrave\":                    '\\U000000CC',\n\t\"Iuml\":                      '\\U000000CF',\n\t\"LT\":                        '\\U0000003C',\n\t\"Ntilde\":                    '\\U000000D1',\n\t\"Oacute\":                    '\\U000000D3',\n\t\"Ocirc\":                     '\\U000000D4',\n\t\"Ograve\":                    '\\U000000D2',\n\t\"Oslash\":                    '\\U000000D8',\n\t\"Otilde\":                    '\\U000000D5',\n\t\"Ouml\":                      '\\U000000D6',\n\t\"QUOT\":                      '\\U00000022',\n\t\"REG\":                       '\\U000000AE',\n\t\"THORN\":                     '\\U000000DE',\n\t\"Uacute\":                    '\\U000000DA',\n\t\"Ucirc\":                     '\\U000000DB',\n\t\"Ugrave\":                    '\\U000000D9',\n\t\"Uuml\":                      '\\U000000DC',\n\t\"Yacute\":                    '\\U000000DD',\n\t\"aacute\":                    '\\U000000E1',\n\t\"acirc\":                     '\\U000000E2',\n\t\"acute\":                     '\\U000000B4',\n\t\"aelig\":                     '\\U000000E6',\n\t\"agrave\":                    '\\U000000E0',\n\t\"amp\":                       '\\U00000026',\n\t\"aring\":                     '\\U000000E5',\n\t\"atilde\":                    '\\U000000E3',\n\t\"auml\":                      '\\U000000E4',\n\t\"brvbar\":                    '\\U000000A6',\n\t\"ccedil\":                    '\\U000000E7',\n\t\"cedil\":                     '\\U000000B8',\n\t\"cent\":                      '\\U000000A2',\n\t\"copy\":                      '\\U000000A9',\n\t\"curren\":                    '\\U000000A4',\n\t\"deg\":                       '\\U000000B0',\n\t\"divide\":                    '\\U000000F7',\n\t\"eacute\":                    '\\U000000E9',\n\t\"ecirc\":                     '\\U000000EA',\n\t\"egrave\":                    '\\U000000E8',\n\t\"eth\":                       '\\U000000F0',\n\t\"euml\":                      '\\U000000EB',\n\t\"frac12\":                    '\\U000000BD',\n\t\"frac14\":                    '\\U000000BC',\n\t\"frac34\":                    '\\U000000BE',\n\t\"gt\":                        '\\U0000003E',\n\t\"iacute\":                    '\\U000000ED',\n\t\"icirc\":                     '\\U000000EE',\n\t\"iexcl\":                     '\\U000000A1',\n\t\"igrave\":                    '\\U000000EC',\n\t\"iquest\":                    '\\U000000BF',\n\t\"iuml\":                      '\\U000000EF',\n\t\"laquo\":                     '\\U000000AB',\n\t\"lt\":                        '\\U0000003C',\n\t\"macr\":                      '\\U000000AF',\n\t\"micro\":                     '\\U000000B5',\n\t\"middot\":                    '\\U000000B7',\n\t\"nbsp\":                      '\\U000000A0',\n\t\"not\":                       '\\U000000AC',\n\t\"ntilde\":                    '\\U000000F1',\n\t\"oacute\":                    '\\U000000F3',\n\t\"ocirc\":                     '\\U000000F4',\n\t\"ograve\":                    '\\U000000F2',\n\t\"ordf\":                      '\\U000000AA',\n\t\"ordm\":                      '\\U000000BA',\n\t\"oslash\":                    '\\U000000F8',\n\t\"otilde\":                    '\\U000000F5',\n\t\"ouml\":                      '\\U000000F6',\n\t\"para\":                      '\\U000000B6',\n\t\"plusmn\":                    '\\U000000B1',\n\t\"pound\":                     '\\U000000A3',\n\t\"quot\":                      '\\U00000022',\n\t\"raquo\":                     '\\U000000BB',\n\t\"reg\":                       '\\U000000AE',\n\t\"sect\":                      '\\U000000A7',\n\t\"shy\":                       '\\U000000AD',\n\t\"sup1\":                      '\\U000000B9',\n\t\"sup2\":                      '\\U000000B2',\n\t\"sup3\":                      '\\U000000B3',\n\t\"szlig\":                     '\\U000000DF',\n\t\"thorn\":                     '\\U000000FE',\n\t\"times\":                     '\\U000000D7',\n\t\"uacute\":                    '\\U000000FA',\n\t\"ucirc\":                     '\\U000000FB',\n\t\"ugrave\":                    '\\U000000F9',\n\t\"uml\":                       '\\U000000A8',\n\t\"uuml\":                      '\\U000000FC',\n\t\"yacute\":                    '\\U000000FD',\n\t\"yen\":                       '\\U000000A5',\n\t\"yuml\":                      '\\U000000FF',\n}\n\n// HTML entities that are two unicode codepoints.\nvar entity2 = map[string][2]rune{\n\t// TODO(nigeltao): Handle replacements that are wider than their names.\n\t// \"nLt;\":                     {'\\u226A', '\\u20D2'},\n\t// \"nGt;\":                     {'\\u226B', '\\u20D2'},\n\t\"NotEqualTilde;\":           {'\\u2242', '\\u0338'},\n\t\"NotGreaterFullEqual;\":     {'\\u2267', '\\u0338'},\n\t\"NotGreaterGreater;\":       {'\\u226B', '\\u0338'},\n\t\"NotGreaterSlantEqual;\":    {'\\u2A7E', '\\u0338'},\n\t\"NotHumpDownHump;\":         {'\\u224E', '\\u0338'},\n\t\"NotHumpEqual;\":            {'\\u224F', '\\u0338'},\n\t\"NotLeftTriangleBar;\":      {'\\u29CF', '\\u0338'},\n\t\"NotLessLess;\":             {'\\u226A', '\\u0338'},\n\t\"NotLessSlantEqual;\":       {'\\u2A7D', '\\u0338'},\n\t\"NotNestedGreaterGreater;\": {'\\u2AA2', '\\u0338'},\n\t\"NotNestedLessLess;\":       {'\\u2AA1', '\\u0338'},\n\t\"NotPrecedesEqual;\":        {'\\u2AAF', '\\u0338'},\n\t\"NotRightTriangleBar;\":     {'\\u29D0', '\\u0338'},\n\t\"NotSquareSubset;\":         {'\\u228F', '\\u0338'},\n\t\"NotSquareSuperset;\":       {'\\u2290', '\\u0338'},\n\t\"NotSubset;\":               {'\\u2282', '\\u20D2'},\n\t\"NotSucceedsEqual;\":        {'\\u2AB0', '\\u0338'},\n\t\"NotSucceedsTilde;\":        {'\\u227F', '\\u0338'},\n\t\"NotSuperset;\":             {'\\u2283', '\\u20D2'},\n\t\"ThickSpace;\":              {'\\u205F', '\\u200A'},\n\t\"acE;\":                     {'\\u223E', '\\u0333'},\n\t\"bne;\":                     {'\\u003D', '\\u20E5'},\n\t\"bnequiv;\":                 {'\\u2261', '\\u20E5'},\n\t\"caps;\":                    {'\\u2229', '\\uFE00'},\n\t\"cups;\":                    {'\\u222A', '\\uFE00'},\n\t\"fjlig;\":                   {'\\u0066', '\\u006A'},\n\t\"gesl;\":                    {'\\u22DB', '\\uFE00'},\n\t\"gvertneqq;\":               {'\\u2269', '\\uFE00'},\n\t\"gvnE;\":                    {'\\u2269', '\\uFE00'},\n\t\"lates;\":                   {'\\u2AAD', '\\uFE00'},\n\t\"lesg;\":                    {'\\u22DA', '\\uFE00'},\n\t\"lvertneqq;\":               {'\\u2268', '\\uFE00'},\n\t\"lvnE;\":                    {'\\u2268', '\\uFE00'},\n\t\"nGg;\":                     {'\\u22D9', '\\u0338'},\n\t\"nGtv;\":                    {'\\u226B', '\\u0338'},\n\t\"nLl;\":                     {'\\u22D8', '\\u0338'},\n\t\"nLtv;\":                    {'\\u226A', '\\u0338'},\n\t\"nang;\":                    {'\\u2220', '\\u20D2'},\n\t\"napE;\":                    {'\\u2A70', '\\u0338'},\n\t\"napid;\":                   {'\\u224B', '\\u0338'},\n\t\"nbump;\":                   {'\\u224E', '\\u0338'},\n\t\"nbumpe;\":                  {'\\u224F', '\\u0338'},\n\t\"ncongdot;\":                {'\\u2A6D', '\\u0338'},\n\t\"nedot;\":                   {'\\u2250', '\\u0338'},\n\t\"nesim;\":                   {'\\u2242', '\\u0338'},\n\t\"ngE;\":                     {'\\u2267', '\\u0338'},\n\t\"ngeqq;\":                   {'\\u2267', '\\u0338'},\n\t\"ngeqslant;\":               {'\\u2A7E', '\\u0338'},\n\t\"nges;\":                    {'\\u2A7E', '\\u0338'},\n\t\"nlE;\":                     {'\\u2266', '\\u0338'},\n\t\"nleqq;\":                   {'\\u2266', '\\u0338'},\n\t\"nleqslant;\":               {'\\u2A7D', '\\u0338'},\n\t\"nles;\":                    {'\\u2A7D', '\\u0338'},\n\t\"notinE;\":                  {'\\u22F9', '\\u0338'},\n\t\"notindot;\":                {'\\u22F5', '\\u0338'},\n\t\"nparsl;\":                  {'\\u2AFD', '\\u20E5'},\n\t\"npart;\":                   {'\\u2202', '\\u0338'},\n\t\"npre;\":                    {'\\u2AAF', '\\u0338'},\n\t\"npreceq;\":                 {'\\u2AAF', '\\u0338'},\n\t\"nrarrc;\":                  {'\\u2933', '\\u0338'},\n\t\"nrarrw;\":                  {'\\u219D', '\\u0338'},\n\t\"nsce;\":                    {'\\u2AB0', '\\u0338'},\n\t\"nsubE;\":                   {'\\u2AC5', '\\u0338'},\n\t\"nsubset;\":                 {'\\u2282', '\\u20D2'},\n\t\"nsubseteqq;\":              {'\\u2AC5', '\\u0338'},\n\t\"nsucceq;\":                 {'\\u2AB0', '\\u0338'},\n\t\"nsupE;\":                   {'\\u2AC6', '\\u0338'},\n\t\"nsupset;\":                 {'\\u2283', '\\u20D2'},\n\t\"nsupseteqq;\":              {'\\u2AC6', '\\u0338'},\n\t\"nvap;\":                    {'\\u224D', '\\u20D2'},\n\t\"nvge;\":                    {'\\u2265', '\\u20D2'},\n\t\"nvgt;\":                    {'\\u003E', '\\u20D2'},\n\t\"nvle;\":                    {'\\u2264', '\\u20D2'},\n\t\"nvlt;\":                    {'\\u003C', '\\u20D2'},\n\t\"nvltrie;\":                 {'\\u22B4', '\\u20D2'},\n\t\"nvrtrie;\":                 {'\\u22B5', '\\u20D2'},\n\t\"nvsim;\":                   {'\\u223C', '\\u20D2'},\n\t\"race;\":                    {'\\u223D', '\\u0331'},\n\t\"smtes;\":                   {'\\u2AAC', '\\uFE00'},\n\t\"sqcaps;\":                  {'\\u2293', '\\uFE00'},\n\t\"sqcups;\":                  {'\\u2294', '\\uFE00'},\n\t\"varsubsetneq;\":            {'\\u228A', '\\uFE00'},\n\t\"varsubsetneqq;\":           {'\\u2ACB', '\\uFE00'},\n\t\"varsupsetneq;\":            {'\\u228B', '\\uFE00'},\n\t\"varsupsetneqq;\":           {'\\u2ACC', '\\uFE00'},\n\t\"vnsub;\":                   {'\\u2282', '\\u20D2'},\n\t\"vnsup;\":                   {'\\u2283', '\\u20D2'},\n\t\"vsubnE;\":                  {'\\u2ACB', '\\uFE00'},\n\t\"vsubne;\":                  {'\\u228A', '\\uFE00'},\n\t\"vsupnE;\":                  {'\\u2ACC', '\\uFE00'},\n\t\"vsupne;\":                  {'\\u228B', '\\uFE00'},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/escape.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\n// These replacements permit compatibility with old numeric entities that\n// assumed Windows-1252 encoding.\n// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference\nvar replacementTable = [...]rune{\n\t'\\u20AC', // First entry is what 0x80 should be replaced with.\n\t'\\u0081',\n\t'\\u201A',\n\t'\\u0192',\n\t'\\u201E',\n\t'\\u2026',\n\t'\\u2020',\n\t'\\u2021',\n\t'\\u02C6',\n\t'\\u2030',\n\t'\\u0160',\n\t'\\u2039',\n\t'\\u0152',\n\t'\\u008D',\n\t'\\u017D',\n\t'\\u008F',\n\t'\\u0090',\n\t'\\u2018',\n\t'\\u2019',\n\t'\\u201C',\n\t'\\u201D',\n\t'\\u2022',\n\t'\\u2013',\n\t'\\u2014',\n\t'\\u02DC',\n\t'\\u2122',\n\t'\\u0161',\n\t'\\u203A',\n\t'\\u0153',\n\t'\\u009D',\n\t'\\u017E',\n\t'\\u0178', // Last entry is 0x9F.\n\t// 0x00->'\\uFFFD' is handled programmatically.\n\t// 0x0D->'\\u000D' is a no-op.\n}\n\n// unescapeEntity reads an entity like \"&lt;\" from b[src:] and writes the\n// corresponding \"<\" to b[dst:], returning the incremented dst and src cursors.\n// Precondition: b[src] == '&' && dst <= src.\n// attribute should be true if parsing an attribute value.\nfunc unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) {\n\t// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference\n\n\t// i starts at 1 because we already know that s[0] == '&'.\n\ti, s := 1, b[src:]\n\n\tif len(s) <= 1 {\n\t\tb[dst] = b[src]\n\t\treturn dst + 1, src + 1\n\t}\n\n\tif s[i] == '#' {\n\t\tif len(s) <= 3 { // We need to have at least \"&#.\".\n\t\t\tb[dst] = b[src]\n\t\t\treturn dst + 1, src + 1\n\t\t}\n\t\ti++\n\t\tc := s[i]\n\t\thex := false\n\t\tif c == 'x' || c == 'X' {\n\t\t\thex = true\n\t\t\ti++\n\t\t}\n\n\t\tx := '\\x00'\n\t\tfor i < len(s) {\n\t\t\tc = s[i]\n\t\t\ti++\n\t\t\tif hex {\n\t\t\t\tif '0' <= c && c <= '9' {\n\t\t\t\t\tx = 16*x + rune(c) - '0'\n\t\t\t\t\tcontinue\n\t\t\t\t} else if 'a' <= c && c <= 'f' {\n\t\t\t\t\tx = 16*x + rune(c) - 'a' + 10\n\t\t\t\t\tcontinue\n\t\t\t\t} else if 'A' <= c && c <= 'F' {\n\t\t\t\t\tx = 16*x + rune(c) - 'A' + 10\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t} else if '0' <= c && c <= '9' {\n\t\t\t\tx = 10*x + rune(c) - '0'\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif c != ';' {\n\t\t\t\ti--\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\tif i <= 3 { // No characters matched.\n\t\t\tb[dst] = b[src]\n\t\t\treturn dst + 1, src + 1\n\t\t}\n\n\t\tif 0x80 <= x && x <= 0x9F {\n\t\t\t// Replace characters from Windows-1252 with UTF-8 equivalents.\n\t\t\tx = replacementTable[x-0x80]\n\t\t} else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF {\n\t\t\t// Replace invalid characters with the replacement character.\n\t\t\tx = '\\uFFFD'\n\t\t}\n\n\t\treturn dst + utf8.EncodeRune(b[dst:], x), src + i\n\t}\n\n\t// Consume the maximum number of characters possible, with the\n\t// consumed characters matching one of the named references.\n\n\tfor i < len(s) {\n\t\tc := s[i]\n\t\ti++\n\t\t// Lower-cased characters are more common in entities, so we check for them first.\n\t\tif 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' {\n\t\t\tcontinue\n\t\t}\n\t\tif c != ';' {\n\t\t\ti--\n\t\t}\n\t\tbreak\n\t}\n\n\tentityName := string(s[1:i])\n\tif entityName == \"\" {\n\t\t// No-op.\n\t} else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' {\n\t\t// No-op.\n\t} else if x := entity[entityName]; x != 0 {\n\t\treturn dst + utf8.EncodeRune(b[dst:], x), src + i\n\t} else if x := entity2[entityName]; x[0] != 0 {\n\t\tdst1 := dst + utf8.EncodeRune(b[dst:], x[0])\n\t\treturn dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i\n\t} else if !attribute {\n\t\tmaxLen := len(entityName) - 1\n\t\tif maxLen > longestEntityWithoutSemicolon {\n\t\t\tmaxLen = longestEntityWithoutSemicolon\n\t\t}\n\t\tfor j := maxLen; j > 1; j-- {\n\t\t\tif x := entity[entityName[:j]]; x != 0 {\n\t\t\t\treturn dst + utf8.EncodeRune(b[dst:], x), src + j + 1\n\t\t\t}\n\t\t}\n\t}\n\n\tdst1, src1 = dst+i, src+i\n\tcopy(b[dst:dst1], b[src:src1])\n\treturn dst1, src1\n}\n\n// unescape unescapes b's entities in-place, so that \"a&lt;b\" becomes \"a<b\".\n// attribute should be true if parsing an attribute value.\nfunc unescape(b []byte, attribute bool) []byte {\n\tfor i, c := range b {\n\t\tif c == '&' {\n\t\t\tdst, src := unescapeEntity(b, i, i, attribute)\n\t\t\tfor src < len(b) {\n\t\t\t\tc := b[src]\n\t\t\t\tif c == '&' {\n\t\t\t\t\tdst, src = unescapeEntity(b, dst, src, attribute)\n\t\t\t\t} else {\n\t\t\t\t\tb[dst] = c\n\t\t\t\t\tdst, src = dst+1, src+1\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn b[0:dst]\n\t\t}\n\t}\n\treturn b\n}\n\n// lower lower-cases the A-Z bytes in b in-place, so that \"aBc\" becomes \"abc\".\nfunc lower(b []byte) []byte {\n\tfor i, c := range b {\n\t\tif 'A' <= c && c <= 'Z' {\n\t\t\tb[i] = c + 'a' - 'A'\n\t\t}\n\t}\n\treturn b\n}\n\nconst escapedChars = \"&'<>\\\"\\r\"\n\nfunc escape(w writer, s string) error {\n\ti := strings.IndexAny(s, escapedChars)\n\tfor i != -1 {\n\t\tif _, err := w.WriteString(s[:i]); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvar esc string\n\t\tswitch s[i] {\n\t\tcase '&':\n\t\t\tesc = \"&amp;\"\n\t\tcase '\\'':\n\t\t\t// \"&#39;\" is shorter than \"&apos;\" and apos was not in HTML until HTML5.\n\t\t\tesc = \"&#39;\"\n\t\tcase '<':\n\t\t\tesc = \"&lt;\"\n\t\tcase '>':\n\t\t\tesc = \"&gt;\"\n\t\tcase '\"':\n\t\t\t// \"&#34;\" is shorter than \"&quot;\".\n\t\t\tesc = \"&#34;\"\n\t\tcase '\\r':\n\t\t\tesc = \"&#13;\"\n\t\tdefault:\n\t\t\tpanic(\"unrecognized escape character\")\n\t\t}\n\t\ts = s[i+1:]\n\t\tif _, err := w.WriteString(esc); err != nil {\n\t\t\treturn err\n\t\t}\n\t\ti = strings.IndexAny(s, escapedChars)\n\t}\n\t_, err := w.WriteString(s)\n\treturn err\n}\n\n// EscapeString escapes special characters like \"<\" to become \"&lt;\". It\n// escapes only five such characters: <, >, &, ' and \".\n// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't\n// always true.\nfunc EscapeString(s string) string {\n\tif strings.IndexAny(s, escapedChars) == -1 {\n\t\treturn s\n\t}\n\tvar buf bytes.Buffer\n\tescape(&buf, s)\n\treturn buf.String()\n}\n\n// UnescapeString unescapes entities like \"&lt;\" to become \"<\". It unescapes a\n// larger range of entities than EscapeString escapes. For example, \"&aacute;\"\n// unescapes to \"á\", as does \"&#225;\" and \"&xE1;\".\n// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't\n// always true.\nfunc UnescapeString(s string) string {\n\tfor _, c := range s {\n\t\tif c == '&' {\n\t\t\treturn string(unescape([]byte(s), false))\n\t\t}\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/foreign.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\nimport (\n\t\"strings\"\n)\n\nfunc adjustAttributeNames(aa []Attribute, nameMap map[string]string) {\n\tfor i := range aa {\n\t\tif newName, ok := nameMap[aa[i].Key]; ok {\n\t\t\taa[i].Key = newName\n\t\t}\n\t}\n}\n\nfunc adjustForeignAttributes(aa []Attribute) {\n\tfor i, a := range aa {\n\t\tif a.Key == \"\" || a.Key[0] != 'x' {\n\t\t\tcontinue\n\t\t}\n\t\tswitch a.Key {\n\t\tcase \"xlink:actuate\", \"xlink:arcrole\", \"xlink:href\", \"xlink:role\", \"xlink:show\",\n\t\t\t\"xlink:title\", \"xlink:type\", \"xml:base\", \"xml:lang\", \"xml:space\", \"xmlns:xlink\":\n\t\t\tj := strings.Index(a.Key, \":\")\n\t\t\taa[i].Namespace = a.Key[:j]\n\t\t\taa[i].Key = a.Key[j+1:]\n\t\t}\n\t}\n}\n\nfunc htmlIntegrationPoint(n *Node) bool {\n\tif n.Type != ElementNode {\n\t\treturn false\n\t}\n\tswitch n.Namespace {\n\tcase \"math\":\n\t\tif n.Data == \"annotation-xml\" {\n\t\t\tfor _, a := range n.Attr {\n\t\t\t\tif a.Key == \"encoding\" {\n\t\t\t\t\tval := strings.ToLower(a.Val)\n\t\t\t\t\tif val == \"text/html\" || val == \"application/xhtml+xml\" {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase \"svg\":\n\t\tswitch n.Data {\n\t\tcase \"desc\", \"foreignObject\", \"title\":\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc mathMLTextIntegrationPoint(n *Node) bool {\n\tif n.Namespace != \"math\" {\n\t\treturn false\n\t}\n\tswitch n.Data {\n\tcase \"mi\", \"mo\", \"mn\", \"ms\", \"mtext\":\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Section 12.2.5.5.\nvar breakout = map[string]bool{\n\t\"b\":          true,\n\t\"big\":        true,\n\t\"blockquote\": true,\n\t\"body\":       true,\n\t\"br\":         true,\n\t\"center\":     true,\n\t\"code\":       true,\n\t\"dd\":         true,\n\t\"div\":        true,\n\t\"dl\":         true,\n\t\"dt\":         true,\n\t\"em\":         true,\n\t\"embed\":      true,\n\t\"h1\":         true,\n\t\"h2\":         true,\n\t\"h3\":         true,\n\t\"h4\":         true,\n\t\"h5\":         true,\n\t\"h6\":         true,\n\t\"head\":       true,\n\t\"hr\":         true,\n\t\"i\":          true,\n\t\"img\":        true,\n\t\"li\":         true,\n\t\"listing\":    true,\n\t\"menu\":       true,\n\t\"meta\":       true,\n\t\"nobr\":       true,\n\t\"ol\":         true,\n\t\"p\":          true,\n\t\"pre\":        true,\n\t\"ruby\":       true,\n\t\"s\":          true,\n\t\"small\":      true,\n\t\"span\":       true,\n\t\"strong\":     true,\n\t\"strike\":     true,\n\t\"sub\":        true,\n\t\"sup\":        true,\n\t\"table\":      true,\n\t\"tt\":         true,\n\t\"u\":          true,\n\t\"ul\":         true,\n\t\"var\":        true,\n}\n\n// Section 12.2.5.5.\nvar svgTagNameAdjustments = map[string]string{\n\t\"altglyph\":            \"altGlyph\",\n\t\"altglyphdef\":         \"altGlyphDef\",\n\t\"altglyphitem\":        \"altGlyphItem\",\n\t\"animatecolor\":        \"animateColor\",\n\t\"animatemotion\":       \"animateMotion\",\n\t\"animatetransform\":    \"animateTransform\",\n\t\"clippath\":            \"clipPath\",\n\t\"feblend\":             \"feBlend\",\n\t\"fecolormatrix\":       \"feColorMatrix\",\n\t\"fecomponenttransfer\": \"feComponentTransfer\",\n\t\"fecomposite\":         \"feComposite\",\n\t\"feconvolvematrix\":    \"feConvolveMatrix\",\n\t\"fediffuselighting\":   \"feDiffuseLighting\",\n\t\"fedisplacementmap\":   \"feDisplacementMap\",\n\t\"fedistantlight\":      \"feDistantLight\",\n\t\"feflood\":             \"feFlood\",\n\t\"fefunca\":             \"feFuncA\",\n\t\"fefuncb\":             \"feFuncB\",\n\t\"fefuncg\":             \"feFuncG\",\n\t\"fefuncr\":             \"feFuncR\",\n\t\"fegaussianblur\":      \"feGaussianBlur\",\n\t\"feimage\":             \"feImage\",\n\t\"femerge\":             \"feMerge\",\n\t\"femergenode\":         \"feMergeNode\",\n\t\"femorphology\":        \"feMorphology\",\n\t\"feoffset\":            \"feOffset\",\n\t\"fepointlight\":        \"fePointLight\",\n\t\"fespecularlighting\":  \"feSpecularLighting\",\n\t\"fespotlight\":         \"feSpotLight\",\n\t\"fetile\":              \"feTile\",\n\t\"feturbulence\":        \"feTurbulence\",\n\t\"foreignobject\":       \"foreignObject\",\n\t\"glyphref\":            \"glyphRef\",\n\t\"lineargradient\":      \"linearGradient\",\n\t\"radialgradient\":      \"radialGradient\",\n\t\"textpath\":            \"textPath\",\n}\n\n// Section 12.2.5.1\nvar mathMLAttributeAdjustments = map[string]string{\n\t\"definitionurl\": \"definitionURL\",\n}\n\nvar svgAttributeAdjustments = map[string]string{\n\t\"attributename\":             \"attributeName\",\n\t\"attributetype\":             \"attributeType\",\n\t\"basefrequency\":             \"baseFrequency\",\n\t\"baseprofile\":               \"baseProfile\",\n\t\"calcmode\":                  \"calcMode\",\n\t\"clippathunits\":             \"clipPathUnits\",\n\t\"contentscripttype\":         \"contentScriptType\",\n\t\"contentstyletype\":          \"contentStyleType\",\n\t\"diffuseconstant\":           \"diffuseConstant\",\n\t\"edgemode\":                  \"edgeMode\",\n\t\"externalresourcesrequired\": \"externalResourcesRequired\",\n\t\"filterres\":                 \"filterRes\",\n\t\"filterunits\":               \"filterUnits\",\n\t\"glyphref\":                  \"glyphRef\",\n\t\"gradienttransform\":         \"gradientTransform\",\n\t\"gradientunits\":             \"gradientUnits\",\n\t\"kernelmatrix\":              \"kernelMatrix\",\n\t\"kernelunitlength\":          \"kernelUnitLength\",\n\t\"keypoints\":                 \"keyPoints\",\n\t\"keysplines\":                \"keySplines\",\n\t\"keytimes\":                  \"keyTimes\",\n\t\"lengthadjust\":              \"lengthAdjust\",\n\t\"limitingconeangle\":         \"limitingConeAngle\",\n\t\"markerheight\":              \"markerHeight\",\n\t\"markerunits\":               \"markerUnits\",\n\t\"markerwidth\":               \"markerWidth\",\n\t\"maskcontentunits\":          \"maskContentUnits\",\n\t\"maskunits\":                 \"maskUnits\",\n\t\"numoctaves\":                \"numOctaves\",\n\t\"pathlength\":                \"pathLength\",\n\t\"patterncontentunits\":       \"patternContentUnits\",\n\t\"patterntransform\":          \"patternTransform\",\n\t\"patternunits\":              \"patternUnits\",\n\t\"pointsatx\":                 \"pointsAtX\",\n\t\"pointsaty\":                 \"pointsAtY\",\n\t\"pointsatz\":                 \"pointsAtZ\",\n\t\"preservealpha\":             \"preserveAlpha\",\n\t\"preserveaspectratio\":       \"preserveAspectRatio\",\n\t\"primitiveunits\":            \"primitiveUnits\",\n\t\"refx\":                      \"refX\",\n\t\"refy\":                      \"refY\",\n\t\"repeatcount\":               \"repeatCount\",\n\t\"repeatdur\":                 \"repeatDur\",\n\t\"requiredextensions\":        \"requiredExtensions\",\n\t\"requiredfeatures\":          \"requiredFeatures\",\n\t\"specularconstant\":          \"specularConstant\",\n\t\"specularexponent\":          \"specularExponent\",\n\t\"spreadmethod\":              \"spreadMethod\",\n\t\"startoffset\":               \"startOffset\",\n\t\"stddeviation\":              \"stdDeviation\",\n\t\"stitchtiles\":               \"stitchTiles\",\n\t\"surfacescale\":              \"surfaceScale\",\n\t\"systemlanguage\":            \"systemLanguage\",\n\t\"tablevalues\":               \"tableValues\",\n\t\"targetx\":                   \"targetX\",\n\t\"targety\":                   \"targetY\",\n\t\"textlength\":                \"textLength\",\n\t\"viewbox\":                   \"viewBox\",\n\t\"viewtarget\":                \"viewTarget\",\n\t\"xchannelselector\":          \"xChannelSelector\",\n\t\"ychannelselector\":          \"yChannelSelector\",\n\t\"zoomandpan\":                \"zoomAndPan\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/node.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\nimport (\n\t\"golang.org/x/net/html/atom\"\n)\n\n// A NodeType is the type of a Node.\ntype NodeType uint32\n\nconst (\n\tErrorNode NodeType = iota\n\tTextNode\n\tDocumentNode\n\tElementNode\n\tCommentNode\n\tDoctypeNode\n\tscopeMarkerNode\n)\n\n// Section 12.2.3.3 says \"scope markers are inserted when entering applet\n// elements, buttons, object elements, marquees, table cells, and table\n// captions, and are used to prevent formatting from 'leaking'\".\nvar scopeMarker = Node{Type: scopeMarkerNode}\n\n// A Node consists of a NodeType and some Data (tag name for element nodes,\n// content for text) and are part of a tree of Nodes. Element nodes may also\n// have a Namespace and contain a slice of Attributes. Data is unescaped, so\n// that it looks like \"a<b\" rather than \"a&lt;b\". For element nodes, DataAtom\n// is the atom for Data, or zero if Data is not a known tag name.\n//\n// An empty Namespace implies a \"http://www.w3.org/1999/xhtml\" namespace.\n// Similarly, \"math\" is short for \"http://www.w3.org/1998/Math/MathML\", and\n// \"svg\" is short for \"http://www.w3.org/2000/svg\".\ntype Node struct {\n\tParent, FirstChild, LastChild, PrevSibling, NextSibling *Node\n\n\tType      NodeType\n\tDataAtom  atom.Atom\n\tData      string\n\tNamespace string\n\tAttr      []Attribute\n}\n\n// InsertBefore inserts newChild as a child of n, immediately before oldChild\n// in the sequence of n's children. oldChild may be nil, in which case newChild\n// is appended to the end of n's children.\n//\n// It will panic if newChild already has a parent or siblings.\nfunc (n *Node) InsertBefore(newChild, oldChild *Node) {\n\tif newChild.Parent != nil || newChild.PrevSibling != nil || newChild.NextSibling != nil {\n\t\tpanic(\"html: InsertBefore called for an attached child Node\")\n\t}\n\tvar prev, next *Node\n\tif oldChild != nil {\n\t\tprev, next = oldChild.PrevSibling, oldChild\n\t} else {\n\t\tprev = n.LastChild\n\t}\n\tif prev != nil {\n\t\tprev.NextSibling = newChild\n\t} else {\n\t\tn.FirstChild = newChild\n\t}\n\tif next != nil {\n\t\tnext.PrevSibling = newChild\n\t} else {\n\t\tn.LastChild = newChild\n\t}\n\tnewChild.Parent = n\n\tnewChild.PrevSibling = prev\n\tnewChild.NextSibling = next\n}\n\n// AppendChild adds a node c as a child of n.\n//\n// It will panic if c already has a parent or siblings.\nfunc (n *Node) AppendChild(c *Node) {\n\tif c.Parent != nil || c.PrevSibling != nil || c.NextSibling != nil {\n\t\tpanic(\"html: AppendChild called for an attached child Node\")\n\t}\n\tlast := n.LastChild\n\tif last != nil {\n\t\tlast.NextSibling = c\n\t} else {\n\t\tn.FirstChild = c\n\t}\n\tn.LastChild = c\n\tc.Parent = n\n\tc.PrevSibling = last\n}\n\n// RemoveChild removes a node c that is a child of n. Afterwards, c will have\n// no parent and no siblings.\n//\n// It will panic if c's parent is not n.\nfunc (n *Node) RemoveChild(c *Node) {\n\tif c.Parent != n {\n\t\tpanic(\"html: RemoveChild called for a non-child Node\")\n\t}\n\tif n.FirstChild == c {\n\t\tn.FirstChild = c.NextSibling\n\t}\n\tif c.NextSibling != nil {\n\t\tc.NextSibling.PrevSibling = c.PrevSibling\n\t}\n\tif n.LastChild == c {\n\t\tn.LastChild = c.PrevSibling\n\t}\n\tif c.PrevSibling != nil {\n\t\tc.PrevSibling.NextSibling = c.NextSibling\n\t}\n\tc.Parent = nil\n\tc.PrevSibling = nil\n\tc.NextSibling = nil\n}\n\n// reparentChildren reparents all of src's child nodes to dst.\nfunc reparentChildren(dst, src *Node) {\n\tfor {\n\t\tchild := src.FirstChild\n\t\tif child == nil {\n\t\t\tbreak\n\t\t}\n\t\tsrc.RemoveChild(child)\n\t\tdst.AppendChild(child)\n\t}\n}\n\n// clone returns a new node with the same type, data and attributes.\n// The clone has no parent, no siblings and no children.\nfunc (n *Node) clone() *Node {\n\tm := &Node{\n\t\tType:     n.Type,\n\t\tDataAtom: n.DataAtom,\n\t\tData:     n.Data,\n\t\tAttr:     make([]Attribute, len(n.Attr)),\n\t}\n\tcopy(m.Attr, n.Attr)\n\treturn m\n}\n\n// nodeStack is a stack of nodes.\ntype nodeStack []*Node\n\n// pop pops the stack. It will panic if s is empty.\nfunc (s *nodeStack) pop() *Node {\n\ti := len(*s)\n\tn := (*s)[i-1]\n\t*s = (*s)[:i-1]\n\treturn n\n}\n\n// top returns the most recently pushed node, or nil if s is empty.\nfunc (s *nodeStack) top() *Node {\n\tif i := len(*s); i > 0 {\n\t\treturn (*s)[i-1]\n\t}\n\treturn nil\n}\n\n// index returns the index of the top-most occurrence of n in the stack, or -1\n// if n is not present.\nfunc (s *nodeStack) index(n *Node) int {\n\tfor i := len(*s) - 1; i >= 0; i-- {\n\t\tif (*s)[i] == n {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\n// insert inserts a node at the given index.\nfunc (s *nodeStack) insert(i int, n *Node) {\n\t(*s) = append(*s, nil)\n\tcopy((*s)[i+1:], (*s)[i:])\n\t(*s)[i] = n\n}\n\n// remove removes a node from the stack. It is a no-op if n is not present.\nfunc (s *nodeStack) remove(n *Node) {\n\ti := s.index(n)\n\tif i == -1 {\n\t\treturn\n\t}\n\tcopy((*s)[i:], (*s)[i+1:])\n\tj := len(*s) - 1\n\t(*s)[j] = nil\n\t*s = (*s)[:j]\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/parse.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\ta \"golang.org/x/net/html/atom\"\n)\n\n// A parser implements the HTML5 parsing algorithm:\n// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction\ntype parser struct {\n\t// tokenizer provides the tokens for the parser.\n\ttokenizer *Tokenizer\n\t// tok is the most recently read token.\n\ttok Token\n\t// Self-closing tags like <hr/> are treated as start tags, except that\n\t// hasSelfClosingToken is set while they are being processed.\n\thasSelfClosingToken bool\n\t// doc is the document root element.\n\tdoc *Node\n\t// The stack of open elements (section 12.2.3.2) and active formatting\n\t// elements (section 12.2.3.3).\n\toe, afe nodeStack\n\t// Element pointers (section 12.2.3.4).\n\thead, form *Node\n\t// Other parsing state flags (section 12.2.3.5).\n\tscripting, framesetOK bool\n\t// im is the current insertion mode.\n\tim insertionMode\n\t// originalIM is the insertion mode to go back to after completing a text\n\t// or inTableText insertion mode.\n\toriginalIM insertionMode\n\t// fosterParenting is whether new elements should be inserted according to\n\t// the foster parenting rules (section 12.2.5.3).\n\tfosterParenting bool\n\t// quirks is whether the parser is operating in \"quirks mode.\"\n\tquirks bool\n\t// fragment is whether the parser is parsing an HTML fragment.\n\tfragment bool\n\t// context is the context element when parsing an HTML fragment\n\t// (section 12.4).\n\tcontext *Node\n}\n\nfunc (p *parser) top() *Node {\n\tif n := p.oe.top(); n != nil {\n\t\treturn n\n\t}\n\treturn p.doc\n}\n\n// Stop tags for use in popUntil. These come from section 12.2.3.2.\nvar (\n\tdefaultScopeStopTags = map[string][]a.Atom{\n\t\t\"\":     {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template},\n\t\t\"math\": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext},\n\t\t\"svg\":  {a.Desc, a.ForeignObject, a.Title},\n\t}\n)\n\ntype scope int\n\nconst (\n\tdefaultScope scope = iota\n\tlistItemScope\n\tbuttonScope\n\ttableScope\n\ttableRowScope\n\ttableBodyScope\n\tselectScope\n)\n\n// popUntil pops the stack of open elements at the highest element whose tag\n// is in matchTags, provided there is no higher element in the scope's stop\n// tags (as defined in section 12.2.3.2). It returns whether or not there was\n// such an element. If there was not, popUntil leaves the stack unchanged.\n//\n// For example, the set of stop tags for table scope is: \"html\", \"table\". If\n// the stack was:\n// [\"html\", \"body\", \"font\", \"table\", \"b\", \"i\", \"u\"]\n// then popUntil(tableScope, \"font\") would return false, but\n// popUntil(tableScope, \"i\") would return true and the stack would become:\n// [\"html\", \"body\", \"font\", \"table\", \"b\"]\n//\n// If an element's tag is in both the stop tags and matchTags, then the stack\n// will be popped and the function returns true (provided, of course, there was\n// no higher element in the stack that was also in the stop tags). For example,\n// popUntil(tableScope, \"table\") returns true and leaves:\n// [\"html\", \"body\", \"font\"]\nfunc (p *parser) popUntil(s scope, matchTags ...a.Atom) bool {\n\tif i := p.indexOfElementInScope(s, matchTags...); i != -1 {\n\t\tp.oe = p.oe[:i]\n\t\treturn true\n\t}\n\treturn false\n}\n\n// indexOfElementInScope returns the index in p.oe of the highest element whose\n// tag is in matchTags that is in scope. If no matching element is in scope, it\n// returns -1.\nfunc (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int {\n\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\ttagAtom := p.oe[i].DataAtom\n\t\tif p.oe[i].Namespace == \"\" {\n\t\t\tfor _, t := range matchTags {\n\t\t\t\tif t == tagAtom {\n\t\t\t\t\treturn i\n\t\t\t\t}\n\t\t\t}\n\t\t\tswitch s {\n\t\t\tcase defaultScope:\n\t\t\t\t// No-op.\n\t\t\tcase listItemScope:\n\t\t\t\tif tagAtom == a.Ol || tagAtom == a.Ul {\n\t\t\t\t\treturn -1\n\t\t\t\t}\n\t\t\tcase buttonScope:\n\t\t\t\tif tagAtom == a.Button {\n\t\t\t\t\treturn -1\n\t\t\t\t}\n\t\t\tcase tableScope:\n\t\t\t\tif tagAtom == a.Html || tagAtom == a.Table {\n\t\t\t\t\treturn -1\n\t\t\t\t}\n\t\t\tcase selectScope:\n\t\t\t\tif tagAtom != a.Optgroup && tagAtom != a.Option {\n\t\t\t\t\treturn -1\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tpanic(\"unreachable\")\n\t\t\t}\n\t\t}\n\t\tswitch s {\n\t\tcase defaultScope, listItemScope, buttonScope:\n\t\t\tfor _, t := range defaultScopeStopTags[p.oe[i].Namespace] {\n\t\t\t\tif t == tagAtom {\n\t\t\t\t\treturn -1\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn -1\n}\n\n// elementInScope is like popUntil, except that it doesn't modify the stack of\n// open elements.\nfunc (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool {\n\treturn p.indexOfElementInScope(s, matchTags...) != -1\n}\n\n// clearStackToContext pops elements off the stack of open elements until a\n// scope-defined element is found.\nfunc (p *parser) clearStackToContext(s scope) {\n\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\ttagAtom := p.oe[i].DataAtom\n\t\tswitch s {\n\t\tcase tableScope:\n\t\t\tif tagAtom == a.Html || tagAtom == a.Table {\n\t\t\t\tp.oe = p.oe[:i+1]\n\t\t\t\treturn\n\t\t\t}\n\t\tcase tableRowScope:\n\t\t\tif tagAtom == a.Html || tagAtom == a.Tr {\n\t\t\t\tp.oe = p.oe[:i+1]\n\t\t\t\treturn\n\t\t\t}\n\t\tcase tableBodyScope:\n\t\t\tif tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead {\n\t\t\t\tp.oe = p.oe[:i+1]\n\t\t\t\treturn\n\t\t\t}\n\t\tdefault:\n\t\t\tpanic(\"unreachable\")\n\t\t}\n\t}\n}\n\n// generateImpliedEndTags pops nodes off the stack of open elements as long as\n// the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt.\n// If exceptions are specified, nodes with that name will not be popped off.\nfunc (p *parser) generateImpliedEndTags(exceptions ...string) {\n\tvar i int\nloop:\n\tfor i = len(p.oe) - 1; i >= 0; i-- {\n\t\tn := p.oe[i]\n\t\tif n.Type == ElementNode {\n\t\t\tswitch n.DataAtom {\n\t\t\tcase a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt:\n\t\t\t\tfor _, except := range exceptions {\n\t\t\t\t\tif n.Data == except {\n\t\t\t\t\t\tbreak loop\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tbreak\n\t}\n\n\tp.oe = p.oe[:i+1]\n}\n\n// addChild adds a child node n to the top element, and pushes n onto the stack\n// of open elements if it is an element node.\nfunc (p *parser) addChild(n *Node) {\n\tif p.shouldFosterParent() {\n\t\tp.fosterParent(n)\n\t} else {\n\t\tp.top().AppendChild(n)\n\t}\n\n\tif n.Type == ElementNode {\n\t\tp.oe = append(p.oe, n)\n\t}\n}\n\n// shouldFosterParent returns whether the next node to be added should be\n// foster parented.\nfunc (p *parser) shouldFosterParent() bool {\n\tif p.fosterParenting {\n\t\tswitch p.top().DataAtom {\n\t\tcase a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// fosterParent adds a child node according to the foster parenting rules.\n// Section 12.2.5.3, \"foster parenting\".\nfunc (p *parser) fosterParent(n *Node) {\n\tvar table, parent, prev *Node\n\tvar i int\n\tfor i = len(p.oe) - 1; i >= 0; i-- {\n\t\tif p.oe[i].DataAtom == a.Table {\n\t\t\ttable = p.oe[i]\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif table == nil {\n\t\t// The foster parent is the html element.\n\t\tparent = p.oe[0]\n\t} else {\n\t\tparent = table.Parent\n\t}\n\tif parent == nil {\n\t\tparent = p.oe[i-1]\n\t}\n\n\tif table != nil {\n\t\tprev = table.PrevSibling\n\t} else {\n\t\tprev = parent.LastChild\n\t}\n\tif prev != nil && prev.Type == TextNode && n.Type == TextNode {\n\t\tprev.Data += n.Data\n\t\treturn\n\t}\n\n\tparent.InsertBefore(n, table)\n}\n\n// addText adds text to the preceding node if it is a text node, or else it\n// calls addChild with a new text node.\nfunc (p *parser) addText(text string) {\n\tif text == \"\" {\n\t\treturn\n\t}\n\n\tif p.shouldFosterParent() {\n\t\tp.fosterParent(&Node{\n\t\t\tType: TextNode,\n\t\t\tData: text,\n\t\t})\n\t\treturn\n\t}\n\n\tt := p.top()\n\tif n := t.LastChild; n != nil && n.Type == TextNode {\n\t\tn.Data += text\n\t\treturn\n\t}\n\tp.addChild(&Node{\n\t\tType: TextNode,\n\t\tData: text,\n\t})\n}\n\n// addElement adds a child element based on the current token.\nfunc (p *parser) addElement() {\n\tp.addChild(&Node{\n\t\tType:     ElementNode,\n\t\tDataAtom: p.tok.DataAtom,\n\t\tData:     p.tok.Data,\n\t\tAttr:     p.tok.Attr,\n\t})\n}\n\n// Section 12.2.3.3.\nfunc (p *parser) addFormattingElement() {\n\ttagAtom, attr := p.tok.DataAtom, p.tok.Attr\n\tp.addElement()\n\n\t// Implement the Noah's Ark clause, but with three per family instead of two.\n\tidenticalElements := 0\nfindIdenticalElements:\n\tfor i := len(p.afe) - 1; i >= 0; i-- {\n\t\tn := p.afe[i]\n\t\tif n.Type == scopeMarkerNode {\n\t\t\tbreak\n\t\t}\n\t\tif n.Type != ElementNode {\n\t\t\tcontinue\n\t\t}\n\t\tif n.Namespace != \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif n.DataAtom != tagAtom {\n\t\t\tcontinue\n\t\t}\n\t\tif len(n.Attr) != len(attr) {\n\t\t\tcontinue\n\t\t}\n\tcompareAttributes:\n\t\tfor _, t0 := range n.Attr {\n\t\t\tfor _, t1 := range attr {\n\t\t\t\tif t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val {\n\t\t\t\t\t// Found a match for this attribute, continue with the next attribute.\n\t\t\t\t\tcontinue compareAttributes\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we get here, there is no attribute that matches a.\n\t\t\t// Therefore the element is not identical to the new one.\n\t\t\tcontinue findIdenticalElements\n\t\t}\n\n\t\tidenticalElements++\n\t\tif identicalElements >= 3 {\n\t\t\tp.afe.remove(n)\n\t\t}\n\t}\n\n\tp.afe = append(p.afe, p.top())\n}\n\n// Section 12.2.3.3.\nfunc (p *parser) clearActiveFormattingElements() {\n\tfor {\n\t\tn := p.afe.pop()\n\t\tif len(p.afe) == 0 || n.Type == scopeMarkerNode {\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// Section 12.2.3.3.\nfunc (p *parser) reconstructActiveFormattingElements() {\n\tn := p.afe.top()\n\tif n == nil {\n\t\treturn\n\t}\n\tif n.Type == scopeMarkerNode || p.oe.index(n) != -1 {\n\t\treturn\n\t}\n\ti := len(p.afe) - 1\n\tfor n.Type != scopeMarkerNode && p.oe.index(n) == -1 {\n\t\tif i == 0 {\n\t\t\ti = -1\n\t\t\tbreak\n\t\t}\n\t\ti--\n\t\tn = p.afe[i]\n\t}\n\tfor {\n\t\ti++\n\t\tclone := p.afe[i].clone()\n\t\tp.addChild(clone)\n\t\tp.afe[i] = clone\n\t\tif i == len(p.afe)-1 {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Section 12.2.4.\nfunc (p *parser) acknowledgeSelfClosingTag() {\n\tp.hasSelfClosingToken = false\n}\n\n// An insertion mode (section 12.2.3.1) is the state transition function from\n// a particular state in the HTML5 parser's state machine. It updates the\n// parser's fields depending on parser.tok (where ErrorToken means EOF).\n// It returns whether the token was consumed.\ntype insertionMode func(*parser) bool\n\n// setOriginalIM sets the insertion mode to return to after completing a text or\n// inTableText insertion mode.\n// Section 12.2.3.1, \"using the rules for\".\nfunc (p *parser) setOriginalIM() {\n\tif p.originalIM != nil {\n\t\tpanic(\"html: bad parser state: originalIM was set twice\")\n\t}\n\tp.originalIM = p.im\n}\n\n// Section 12.2.3.1, \"reset the insertion mode\".\nfunc (p *parser) resetInsertionMode() {\n\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\tn := p.oe[i]\n\t\tif i == 0 && p.context != nil {\n\t\t\tn = p.context\n\t\t}\n\n\t\tswitch n.DataAtom {\n\t\tcase a.Select:\n\t\t\tp.im = inSelectIM\n\t\tcase a.Td, a.Th:\n\t\t\tp.im = inCellIM\n\t\tcase a.Tr:\n\t\t\tp.im = inRowIM\n\t\tcase a.Tbody, a.Thead, a.Tfoot:\n\t\t\tp.im = inTableBodyIM\n\t\tcase a.Caption:\n\t\t\tp.im = inCaptionIM\n\t\tcase a.Colgroup:\n\t\t\tp.im = inColumnGroupIM\n\t\tcase a.Table:\n\t\t\tp.im = inTableIM\n\t\tcase a.Head:\n\t\t\tp.im = inBodyIM\n\t\tcase a.Body:\n\t\t\tp.im = inBodyIM\n\t\tcase a.Frameset:\n\t\t\tp.im = inFramesetIM\n\t\tcase a.Html:\n\t\t\tp.im = beforeHeadIM\n\t\tdefault:\n\t\t\tcontinue\n\t\t}\n\t\treturn\n\t}\n\tp.im = inBodyIM\n}\n\nconst whitespace = \" \\t\\r\\n\\f\"\n\n// Section 12.2.5.4.1.\nfunc initialIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase TextToken:\n\t\tp.tok.Data = strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(p.tok.Data) == 0 {\n\t\t\t// It was all whitespace, so ignore it.\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\tp.doc.AppendChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\tcase DoctypeToken:\n\t\tn, quirks := parseDoctype(p.tok.Data)\n\t\tp.doc.AppendChild(n)\n\t\tp.quirks = quirks\n\t\tp.im = beforeHTMLIM\n\t\treturn true\n\t}\n\tp.quirks = true\n\tp.im = beforeHTMLIM\n\treturn false\n}\n\n// Section 12.2.5.4.2.\nfunc beforeHTMLIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase DoctypeToken:\n\t\t// Ignore the token.\n\t\treturn true\n\tcase TextToken:\n\t\tp.tok.Data = strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(p.tok.Data) == 0 {\n\t\t\t// It was all whitespace, so ignore it.\n\t\t\treturn true\n\t\t}\n\tcase StartTagToken:\n\t\tif p.tok.DataAtom == a.Html {\n\t\t\tp.addElement()\n\t\t\tp.im = beforeHeadIM\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Head, a.Body, a.Html, a.Br:\n\t\t\tp.parseImpliedToken(StartTagToken, a.Html, a.Html.String())\n\t\t\treturn false\n\t\tdefault:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\tp.doc.AppendChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\t}\n\tp.parseImpliedToken(StartTagToken, a.Html, a.Html.String())\n\treturn false\n}\n\n// Section 12.2.5.4.3.\nfunc beforeHeadIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase TextToken:\n\t\tp.tok.Data = strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(p.tok.Data) == 0 {\n\t\t\t// It was all whitespace, so ignore it.\n\t\t\treturn true\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Head:\n\t\t\tp.addElement()\n\t\t\tp.head = p.top()\n\t\t\tp.im = inHeadIM\n\t\t\treturn true\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Head, a.Body, a.Html, a.Br:\n\t\t\tp.parseImpliedToken(StartTagToken, a.Head, a.Head.String())\n\t\t\treturn false\n\t\tdefault:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\tcase DoctypeToken:\n\t\t// Ignore the token.\n\t\treturn true\n\t}\n\n\tp.parseImpliedToken(StartTagToken, a.Head, a.Head.String())\n\treturn false\n}\n\n// Section 12.2.5.4.4.\nfunc inHeadIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase TextToken:\n\t\ts := strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(s) < len(p.tok.Data) {\n\t\t\t// Add the initial whitespace to the current node.\n\t\t\tp.addText(p.tok.Data[:len(p.tok.Data)-len(s)])\n\t\t\tif s == \"\" {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tp.tok.Data = s\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\tcase a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta:\n\t\t\tp.addElement()\n\t\t\tp.oe.pop()\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\t\treturn true\n\t\tcase a.Script, a.Title, a.Noscript, a.Noframes, a.Style:\n\t\t\tp.addElement()\n\t\t\tp.setOriginalIM()\n\t\t\tp.im = textIM\n\t\t\treturn true\n\t\tcase a.Head:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Head:\n\t\t\tn := p.oe.pop()\n\t\t\tif n.DataAtom != a.Head {\n\t\t\t\tpanic(\"html: bad parser state: <head> element not found, in the in-head insertion mode\")\n\t\t\t}\n\t\t\tp.im = afterHeadIM\n\t\t\treturn true\n\t\tcase a.Body, a.Html, a.Br:\n\t\t\tp.parseImpliedToken(EndTagToken, a.Head, a.Head.String())\n\t\t\treturn false\n\t\tdefault:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\tcase DoctypeToken:\n\t\t// Ignore the token.\n\t\treturn true\n\t}\n\n\tp.parseImpliedToken(EndTagToken, a.Head, a.Head.String())\n\treturn false\n}\n\n// Section 12.2.5.4.6.\nfunc afterHeadIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase TextToken:\n\t\ts := strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(s) < len(p.tok.Data) {\n\t\t\t// Add the initial whitespace to the current node.\n\t\t\tp.addText(p.tok.Data[:len(p.tok.Data)-len(s)])\n\t\t\tif s == \"\" {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tp.tok.Data = s\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\tcase a.Body:\n\t\t\tp.addElement()\n\t\t\tp.framesetOK = false\n\t\t\tp.im = inBodyIM\n\t\t\treturn true\n\t\tcase a.Frameset:\n\t\t\tp.addElement()\n\t\t\tp.im = inFramesetIM\n\t\t\treturn true\n\t\tcase a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:\n\t\t\tp.oe = append(p.oe, p.head)\n\t\t\tdefer p.oe.remove(p.head)\n\t\t\treturn inHeadIM(p)\n\t\tcase a.Head:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Body, a.Html, a.Br:\n\t\t\t// Drop down to creating an implied <body> tag.\n\t\tdefault:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\tcase DoctypeToken:\n\t\t// Ignore the token.\n\t\treturn true\n\t}\n\n\tp.parseImpliedToken(StartTagToken, a.Body, a.Body.String())\n\tp.framesetOK = true\n\treturn false\n}\n\n// copyAttributes copies attributes of src not found on dst to dst.\nfunc copyAttributes(dst *Node, src Token) {\n\tif len(src.Attr) == 0 {\n\t\treturn\n\t}\n\tattr := map[string]string{}\n\tfor _, t := range dst.Attr {\n\t\tattr[t.Key] = t.Val\n\t}\n\tfor _, t := range src.Attr {\n\t\tif _, ok := attr[t.Key]; !ok {\n\t\t\tdst.Attr = append(dst.Attr, t)\n\t\t\tattr[t.Key] = t.Val\n\t\t}\n\t}\n}\n\n// Section 12.2.5.4.7.\nfunc inBodyIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase TextToken:\n\t\td := p.tok.Data\n\t\tswitch n := p.oe.top(); n.DataAtom {\n\t\tcase a.Pre, a.Listing:\n\t\t\tif n.FirstChild == nil {\n\t\t\t\t// Ignore a newline at the start of a <pre> block.\n\t\t\t\tif d != \"\" && d[0] == '\\r' {\n\t\t\t\t\td = d[1:]\n\t\t\t\t}\n\t\t\t\tif d != \"\" && d[0] == '\\n' {\n\t\t\t\t\td = d[1:]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\td = strings.Replace(d, \"\\x00\", \"\", -1)\n\t\tif d == \"\" {\n\t\t\treturn true\n\t\t}\n\t\tp.reconstructActiveFormattingElements()\n\t\tp.addText(d)\n\t\tif p.framesetOK && strings.TrimLeft(d, whitespace) != \"\" {\n\t\t\t// There were non-whitespace characters inserted.\n\t\t\tp.framesetOK = false\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\tcopyAttributes(p.oe[0], p.tok)\n\t\tcase a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:\n\t\t\treturn inHeadIM(p)\n\t\tcase a.Body:\n\t\t\tif len(p.oe) >= 2 {\n\t\t\t\tbody := p.oe[1]\n\t\t\t\tif body.Type == ElementNode && body.DataAtom == a.Body {\n\t\t\t\t\tp.framesetOK = false\n\t\t\t\t\tcopyAttributes(body, p.tok)\n\t\t\t\t}\n\t\t\t}\n\t\tcase a.Frameset:\n\t\t\tif !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tbody := p.oe[1]\n\t\t\tif body.Parent != nil {\n\t\t\t\tbody.Parent.RemoveChild(body)\n\t\t\t}\n\t\t\tp.oe = p.oe[:1]\n\t\t\tp.addElement()\n\t\t\tp.im = inFramesetIM\n\t\t\treturn true\n\t\tcase a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.addElement()\n\t\tcase a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tswitch n := p.top(); n.DataAtom {\n\t\t\tcase a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:\n\t\t\t\tp.oe.pop()\n\t\t\t}\n\t\t\tp.addElement()\n\t\tcase a.Pre, a.Listing:\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.addElement()\n\t\t\t// The newline, if any, will be dealt with by the TextToken case.\n\t\t\tp.framesetOK = false\n\t\tcase a.Form:\n\t\t\tif p.form == nil {\n\t\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\t\tp.addElement()\n\t\t\t\tp.form = p.top()\n\t\t\t}\n\t\tcase a.Li:\n\t\t\tp.framesetOK = false\n\t\t\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\t\t\tnode := p.oe[i]\n\t\t\t\tswitch node.DataAtom {\n\t\t\t\tcase a.Li:\n\t\t\t\t\tp.oe = p.oe[:i]\n\t\t\t\tcase a.Address, a.Div, a.P:\n\t\t\t\t\tcontinue\n\t\t\t\tdefault:\n\t\t\t\t\tif !isSpecialElement(node) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.addElement()\n\t\tcase a.Dd, a.Dt:\n\t\t\tp.framesetOK = false\n\t\t\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\t\t\tnode := p.oe[i]\n\t\t\t\tswitch node.DataAtom {\n\t\t\t\tcase a.Dd, a.Dt:\n\t\t\t\t\tp.oe = p.oe[:i]\n\t\t\t\tcase a.Address, a.Div, a.P:\n\t\t\t\t\tcontinue\n\t\t\t\tdefault:\n\t\t\t\t\tif !isSpecialElement(node) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.addElement()\n\t\tcase a.Plaintext:\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.addElement()\n\t\tcase a.Button:\n\t\t\tp.popUntil(defaultScope, a.Button)\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\t\tp.framesetOK = false\n\t\tcase a.A:\n\t\t\tfor i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {\n\t\t\t\tif n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A {\n\t\t\t\t\tp.inBodyEndTagFormatting(a.A)\n\t\t\t\t\tp.oe.remove(n)\n\t\t\t\t\tp.afe.remove(n)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addFormattingElement()\n\t\tcase a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addFormattingElement()\n\t\tcase a.Nobr:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tif p.elementInScope(defaultScope, a.Nobr) {\n\t\t\t\tp.inBodyEndTagFormatting(a.Nobr)\n\t\t\t\tp.reconstructActiveFormattingElements()\n\t\t\t}\n\t\t\tp.addFormattingElement()\n\t\tcase a.Applet, a.Marquee, a.Object:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\t\tp.afe = append(p.afe, &scopeMarker)\n\t\t\tp.framesetOK = false\n\t\tcase a.Table:\n\t\t\tif !p.quirks {\n\t\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\t}\n\t\t\tp.addElement()\n\t\t\tp.framesetOK = false\n\t\t\tp.im = inTableIM\n\t\t\treturn true\n\t\tcase a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\t\tp.oe.pop()\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\t\tif p.tok.DataAtom == a.Input {\n\t\t\t\tfor _, t := range p.tok.Attr {\n\t\t\t\t\tif t.Key == \"type\" {\n\t\t\t\t\t\tif strings.ToLower(t.Val) == \"hidden\" {\n\t\t\t\t\t\t\t// Skip setting framesetOK = false\n\t\t\t\t\t\t\treturn true\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\tp.framesetOK = false\n\t\tcase a.Param, a.Source, a.Track:\n\t\t\tp.addElement()\n\t\t\tp.oe.pop()\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\tcase a.Hr:\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.addElement()\n\t\t\tp.oe.pop()\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\t\tp.framesetOK = false\n\t\tcase a.Image:\n\t\t\tp.tok.DataAtom = a.Img\n\t\t\tp.tok.Data = a.Img.String()\n\t\t\treturn false\n\t\tcase a.Isindex:\n\t\t\tif p.form != nil {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\t\taction := \"\"\n\t\t\tprompt := \"This is a searchable index. Enter search keywords: \"\n\t\t\tattr := []Attribute{{Key: \"name\", Val: \"isindex\"}}\n\t\t\tfor _, t := range p.tok.Attr {\n\t\t\t\tswitch t.Key {\n\t\t\t\tcase \"action\":\n\t\t\t\t\taction = t.Val\n\t\t\t\tcase \"name\":\n\t\t\t\t\t// Ignore the attribute.\n\t\t\t\tcase \"prompt\":\n\t\t\t\t\tprompt = t.Val\n\t\t\t\tdefault:\n\t\t\t\t\tattr = append(attr, t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.parseImpliedToken(StartTagToken, a.Form, a.Form.String())\n\t\t\tif action != \"\" {\n\t\t\t\tp.form.Attr = []Attribute{{Key: \"action\", Val: action}}\n\t\t\t}\n\t\t\tp.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())\n\t\t\tp.parseImpliedToken(StartTagToken, a.Label, a.Label.String())\n\t\t\tp.addText(prompt)\n\t\t\tp.addChild(&Node{\n\t\t\t\tType:     ElementNode,\n\t\t\t\tDataAtom: a.Input,\n\t\t\t\tData:     a.Input.String(),\n\t\t\t\tAttr:     attr,\n\t\t\t})\n\t\t\tp.oe.pop()\n\t\t\tp.parseImpliedToken(EndTagToken, a.Label, a.Label.String())\n\t\t\tp.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())\n\t\t\tp.parseImpliedToken(EndTagToken, a.Form, a.Form.String())\n\t\tcase a.Textarea:\n\t\t\tp.addElement()\n\t\t\tp.setOriginalIM()\n\t\t\tp.framesetOK = false\n\t\t\tp.im = textIM\n\t\tcase a.Xmp:\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.framesetOK = false\n\t\t\tp.addElement()\n\t\t\tp.setOriginalIM()\n\t\t\tp.im = textIM\n\t\tcase a.Iframe:\n\t\t\tp.framesetOK = false\n\t\t\tp.addElement()\n\t\t\tp.setOriginalIM()\n\t\t\tp.im = textIM\n\t\tcase a.Noembed, a.Noscript:\n\t\t\tp.addElement()\n\t\t\tp.setOriginalIM()\n\t\t\tp.im = textIM\n\t\tcase a.Select:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\t\tp.framesetOK = false\n\t\t\tp.im = inSelectIM\n\t\t\treturn true\n\t\tcase a.Optgroup, a.Option:\n\t\t\tif p.top().DataAtom == a.Option {\n\t\t\t\tp.oe.pop()\n\t\t\t}\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\tcase a.Rp, a.Rt:\n\t\t\tif p.elementInScope(defaultScope, a.Ruby) {\n\t\t\t\tp.generateImpliedEndTags()\n\t\t\t}\n\t\t\tp.addElement()\n\t\tcase a.Math, a.Svg:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tif p.tok.DataAtom == a.Math {\n\t\t\t\tadjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)\n\t\t\t} else {\n\t\t\t\tadjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)\n\t\t\t}\n\t\t\tadjustForeignAttributes(p.tok.Attr)\n\t\t\tp.addElement()\n\t\t\tp.top().Namespace = p.tok.Data\n\t\t\tif p.hasSelfClosingToken {\n\t\t\t\tp.oe.pop()\n\t\t\t\tp.acknowledgeSelfClosingTag()\n\t\t\t}\n\t\t\treturn true\n\t\tcase a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:\n\t\t\t// Ignore the token.\n\t\tdefault:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Body:\n\t\t\tif p.elementInScope(defaultScope, a.Body) {\n\t\t\t\tp.im = afterBodyIM\n\t\t\t}\n\t\tcase a.Html:\n\t\t\tif p.elementInScope(defaultScope, a.Body) {\n\t\t\t\tp.parseImpliedToken(EndTagToken, a.Body, a.Body.String())\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\tcase a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:\n\t\t\tp.popUntil(defaultScope, p.tok.DataAtom)\n\t\tcase a.Form:\n\t\t\tnode := p.form\n\t\t\tp.form = nil\n\t\t\ti := p.indexOfElementInScope(defaultScope, a.Form)\n\t\t\tif node == nil || i == -1 || p.oe[i] != node {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tp.generateImpliedEndTags()\n\t\t\tp.oe.remove(node)\n\t\tcase a.P:\n\t\t\tif !p.elementInScope(buttonScope, a.P) {\n\t\t\t\tp.parseImpliedToken(StartTagToken, a.P, a.P.String())\n\t\t\t}\n\t\t\tp.popUntil(buttonScope, a.P)\n\t\tcase a.Li:\n\t\t\tp.popUntil(listItemScope, a.Li)\n\t\tcase a.Dd, a.Dt:\n\t\t\tp.popUntil(defaultScope, p.tok.DataAtom)\n\t\tcase a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:\n\t\t\tp.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6)\n\t\tcase a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:\n\t\t\tp.inBodyEndTagFormatting(p.tok.DataAtom)\n\t\tcase a.Applet, a.Marquee, a.Object:\n\t\t\tif p.popUntil(defaultScope, p.tok.DataAtom) {\n\t\t\t\tp.clearActiveFormattingElements()\n\t\t\t}\n\t\tcase a.Br:\n\t\t\tp.tok.Type = StartTagToken\n\t\t\treturn false\n\t\tdefault:\n\t\t\tp.inBodyEndTagOther(p.tok.DataAtom)\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t}\n\n\treturn true\n}\n\nfunc (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) {\n\t// This is the \"adoption agency\" algorithm, described at\n\t// https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency\n\n\t// TODO: this is a fairly literal line-by-line translation of that algorithm.\n\t// Once the code successfully parses the comprehensive test suite, we should\n\t// refactor this code to be more idiomatic.\n\n\t// Steps 1-4. The outer loop.\n\tfor i := 0; i < 8; i++ {\n\t\t// Step 5. Find the formatting element.\n\t\tvar formattingElement *Node\n\t\tfor j := len(p.afe) - 1; j >= 0; j-- {\n\t\t\tif p.afe[j].Type == scopeMarkerNode {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif p.afe[j].DataAtom == tagAtom {\n\t\t\t\tformattingElement = p.afe[j]\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif formattingElement == nil {\n\t\t\tp.inBodyEndTagOther(tagAtom)\n\t\t\treturn\n\t\t}\n\t\tfeIndex := p.oe.index(formattingElement)\n\t\tif feIndex == -1 {\n\t\t\tp.afe.remove(formattingElement)\n\t\t\treturn\n\t\t}\n\t\tif !p.elementInScope(defaultScope, tagAtom) {\n\t\t\t// Ignore the tag.\n\t\t\treturn\n\t\t}\n\n\t\t// Steps 9-10. Find the furthest block.\n\t\tvar furthestBlock *Node\n\t\tfor _, e := range p.oe[feIndex:] {\n\t\t\tif isSpecialElement(e) {\n\t\t\t\tfurthestBlock = e\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif furthestBlock == nil {\n\t\t\te := p.oe.pop()\n\t\t\tfor e != formattingElement {\n\t\t\t\te = p.oe.pop()\n\t\t\t}\n\t\t\tp.afe.remove(e)\n\t\t\treturn\n\t\t}\n\n\t\t// Steps 11-12. Find the common ancestor and bookmark node.\n\t\tcommonAncestor := p.oe[feIndex-1]\n\t\tbookmark := p.afe.index(formattingElement)\n\n\t\t// Step 13. The inner loop. Find the lastNode to reparent.\n\t\tlastNode := furthestBlock\n\t\tnode := furthestBlock\n\t\tx := p.oe.index(node)\n\t\t// Steps 13.1-13.2\n\t\tfor j := 0; j < 3; j++ {\n\t\t\t// Step 13.3.\n\t\t\tx--\n\t\t\tnode = p.oe[x]\n\t\t\t// Step 13.4 - 13.5.\n\t\t\tif p.afe.index(node) == -1 {\n\t\t\t\tp.oe.remove(node)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// Step 13.6.\n\t\t\tif node == formattingElement {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Step 13.7.\n\t\t\tclone := node.clone()\n\t\t\tp.afe[p.afe.index(node)] = clone\n\t\t\tp.oe[p.oe.index(node)] = clone\n\t\t\tnode = clone\n\t\t\t// Step 13.8.\n\t\t\tif lastNode == furthestBlock {\n\t\t\t\tbookmark = p.afe.index(node) + 1\n\t\t\t}\n\t\t\t// Step 13.9.\n\t\t\tif lastNode.Parent != nil {\n\t\t\t\tlastNode.Parent.RemoveChild(lastNode)\n\t\t\t}\n\t\t\tnode.AppendChild(lastNode)\n\t\t\t// Step 13.10.\n\t\t\tlastNode = node\n\t\t}\n\n\t\t// Step 14. Reparent lastNode to the common ancestor,\n\t\t// or for misnested table nodes, to the foster parent.\n\t\tif lastNode.Parent != nil {\n\t\t\tlastNode.Parent.RemoveChild(lastNode)\n\t\t}\n\t\tswitch commonAncestor.DataAtom {\n\t\tcase a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:\n\t\t\tp.fosterParent(lastNode)\n\t\tdefault:\n\t\t\tcommonAncestor.AppendChild(lastNode)\n\t\t}\n\n\t\t// Steps 15-17. Reparent nodes from the furthest block's children\n\t\t// to a clone of the formatting element.\n\t\tclone := formattingElement.clone()\n\t\treparentChildren(clone, furthestBlock)\n\t\tfurthestBlock.AppendChild(clone)\n\n\t\t// Step 18. Fix up the list of active formatting elements.\n\t\tif oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark {\n\t\t\t// Move the bookmark with the rest of the list.\n\t\t\tbookmark--\n\t\t}\n\t\tp.afe.remove(formattingElement)\n\t\tp.afe.insert(bookmark, clone)\n\n\t\t// Step 19. Fix up the stack of open elements.\n\t\tp.oe.remove(formattingElement)\n\t\tp.oe.insert(p.oe.index(furthestBlock)+1, clone)\n\t}\n}\n\n// inBodyEndTagOther performs the \"any other end tag\" algorithm for inBodyIM.\n// \"Any other end tag\" handling from 12.2.5.5 The rules for parsing tokens in foreign content\n// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign\nfunc (p *parser) inBodyEndTagOther(tagAtom a.Atom) {\n\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\tif p.oe[i].DataAtom == tagAtom {\n\t\t\tp.oe = p.oe[:i]\n\t\t\tbreak\n\t\t}\n\t\tif isSpecialElement(p.oe[i]) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Section 12.2.5.4.8.\nfunc textIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase ErrorToken:\n\t\tp.oe.pop()\n\tcase TextToken:\n\t\td := p.tok.Data\n\t\tif n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil {\n\t\t\t// Ignore a newline at the start of a <textarea> block.\n\t\t\tif d != \"\" && d[0] == '\\r' {\n\t\t\t\td = d[1:]\n\t\t\t}\n\t\t\tif d != \"\" && d[0] == '\\n' {\n\t\t\t\td = d[1:]\n\t\t\t}\n\t\t}\n\t\tif d == \"\" {\n\t\t\treturn true\n\t\t}\n\t\tp.addText(d)\n\t\treturn true\n\tcase EndTagToken:\n\t\tp.oe.pop()\n\t}\n\tp.im = p.originalIM\n\tp.originalIM = nil\n\treturn p.tok.Type == EndTagToken\n}\n\n// Section 12.2.5.4.9.\nfunc inTableIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase ErrorToken:\n\t\t// Stop parsing.\n\t\treturn true\n\tcase TextToken:\n\t\tp.tok.Data = strings.Replace(p.tok.Data, \"\\x00\", \"\", -1)\n\t\tswitch p.oe.top().DataAtom {\n\t\tcase a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:\n\t\t\tif strings.Trim(p.tok.Data, whitespace) == \"\" {\n\t\t\t\tp.addText(p.tok.Data)\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Caption:\n\t\t\tp.clearStackToContext(tableScope)\n\t\t\tp.afe = append(p.afe, &scopeMarker)\n\t\t\tp.addElement()\n\t\t\tp.im = inCaptionIM\n\t\t\treturn true\n\t\tcase a.Colgroup:\n\t\t\tp.clearStackToContext(tableScope)\n\t\t\tp.addElement()\n\t\t\tp.im = inColumnGroupIM\n\t\t\treturn true\n\t\tcase a.Col:\n\t\t\tp.parseImpliedToken(StartTagToken, a.Colgroup, a.Colgroup.String())\n\t\t\treturn false\n\t\tcase a.Tbody, a.Tfoot, a.Thead:\n\t\t\tp.clearStackToContext(tableScope)\n\t\t\tp.addElement()\n\t\t\tp.im = inTableBodyIM\n\t\t\treturn true\n\t\tcase a.Td, a.Th, a.Tr:\n\t\t\tp.parseImpliedToken(StartTagToken, a.Tbody, a.Tbody.String())\n\t\t\treturn false\n\t\tcase a.Table:\n\t\t\tif p.popUntil(tableScope, a.Table) {\n\t\t\t\tp.resetInsertionMode()\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Style, a.Script:\n\t\t\treturn inHeadIM(p)\n\t\tcase a.Input:\n\t\t\tfor _, t := range p.tok.Attr {\n\t\t\t\tif t.Key == \"type\" && strings.ToLower(t.Val) == \"hidden\" {\n\t\t\t\t\tp.addElement()\n\t\t\t\t\tp.oe.pop()\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Otherwise drop down to the default action.\n\t\tcase a.Form:\n\t\t\tif p.form != nil {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tp.addElement()\n\t\t\tp.form = p.oe.pop()\n\t\tcase a.Select:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tswitch p.top().DataAtom {\n\t\t\tcase a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:\n\t\t\t\tp.fosterParenting = true\n\t\t\t}\n\t\t\tp.addElement()\n\t\t\tp.fosterParenting = false\n\t\t\tp.framesetOK = false\n\t\t\tp.im = inSelectInTableIM\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Table:\n\t\t\tif p.popUntil(tableScope, a.Table) {\n\t\t\t\tp.resetInsertionMode()\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\tcase DoctypeToken:\n\t\t// Ignore the token.\n\t\treturn true\n\t}\n\n\tp.fosterParenting = true\n\tdefer func() { p.fosterParenting = false }()\n\n\treturn inBodyIM(p)\n}\n\n// Section 12.2.5.4.11.\nfunc inCaptionIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Caption, a.Col, a.Colgroup, a.Tbody, a.Td, a.Tfoot, a.Thead, a.Tr:\n\t\t\tif p.popUntil(tableScope, a.Caption) {\n\t\t\t\tp.clearActiveFormattingElements()\n\t\t\t\tp.im = inTableIM\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\tcase a.Select:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\t\tp.framesetOK = false\n\t\t\tp.im = inSelectInTableIM\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Caption:\n\t\t\tif p.popUntil(tableScope, a.Caption) {\n\t\t\t\tp.clearActiveFormattingElements()\n\t\t\t\tp.im = inTableIM\n\t\t\t}\n\t\t\treturn true\n\t\tcase a.Table:\n\t\t\tif p.popUntil(tableScope, a.Caption) {\n\t\t\t\tp.clearActiveFormattingElements()\n\t\t\t\tp.im = inTableIM\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\tcase a.Body, a.Col, a.Colgroup, a.Html, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\t}\n\treturn inBodyIM(p)\n}\n\n// Section 12.2.5.4.12.\nfunc inColumnGroupIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase TextToken:\n\t\ts := strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(s) < len(p.tok.Data) {\n\t\t\t// Add the initial whitespace to the current node.\n\t\t\tp.addText(p.tok.Data[:len(p.tok.Data)-len(s)])\n\t\t\tif s == \"\" {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tp.tok.Data = s\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\tcase DoctypeToken:\n\t\t// Ignore the token.\n\t\treturn true\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\tcase a.Col:\n\t\t\tp.addElement()\n\t\t\tp.oe.pop()\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Colgroup:\n\t\t\tif p.oe.top().DataAtom != a.Html {\n\t\t\t\tp.oe.pop()\n\t\t\t\tp.im = inTableIM\n\t\t\t}\n\t\t\treturn true\n\t\tcase a.Col:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\t}\n\tif p.oe.top().DataAtom != a.Html {\n\t\tp.oe.pop()\n\t\tp.im = inTableIM\n\t\treturn false\n\t}\n\treturn true\n}\n\n// Section 12.2.5.4.13.\nfunc inTableBodyIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Tr:\n\t\t\tp.clearStackToContext(tableBodyScope)\n\t\t\tp.addElement()\n\t\t\tp.im = inRowIM\n\t\t\treturn true\n\t\tcase a.Td, a.Th:\n\t\t\tp.parseImpliedToken(StartTagToken, a.Tr, a.Tr.String())\n\t\t\treturn false\n\t\tcase a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead:\n\t\t\tif p.popUntil(tableScope, a.Tbody, a.Thead, a.Tfoot) {\n\t\t\t\tp.im = inTableIM\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Tbody, a.Tfoot, a.Thead:\n\t\t\tif p.elementInScope(tableScope, p.tok.DataAtom) {\n\t\t\t\tp.clearStackToContext(tableBodyScope)\n\t\t\t\tp.oe.pop()\n\t\t\t\tp.im = inTableIM\n\t\t\t}\n\t\t\treturn true\n\t\tcase a.Table:\n\t\t\tif p.popUntil(tableScope, a.Tbody, a.Thead, a.Tfoot) {\n\t\t\t\tp.im = inTableIM\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Td, a.Th, a.Tr:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\t}\n\n\treturn inTableIM(p)\n}\n\n// Section 12.2.5.4.14.\nfunc inRowIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Td, a.Th:\n\t\t\tp.clearStackToContext(tableRowScope)\n\t\t\tp.addElement()\n\t\t\tp.afe = append(p.afe, &scopeMarker)\n\t\t\tp.im = inCellIM\n\t\t\treturn true\n\t\tcase a.Caption, a.Col, a.Colgroup, a.Tbody, a.Tfoot, a.Thead, a.Tr:\n\t\t\tif p.popUntil(tableScope, a.Tr) {\n\t\t\t\tp.im = inTableBodyIM\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Tr:\n\t\t\tif p.popUntil(tableScope, a.Tr) {\n\t\t\t\tp.im = inTableBodyIM\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Table:\n\t\t\tif p.popUntil(tableScope, a.Tr) {\n\t\t\t\tp.im = inTableBodyIM\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Tbody, a.Tfoot, a.Thead:\n\t\t\tif p.elementInScope(tableScope, p.tok.DataAtom) {\n\t\t\t\tp.parseImpliedToken(EndTagToken, a.Tr, a.Tr.String())\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Body, a.Caption, a.Col, a.Colgroup, a.Html, a.Td, a.Th:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn inTableIM(p)\n}\n\n// Section 12.2.5.4.15.\nfunc inCellIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Caption, a.Col, a.Colgroup, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:\n\t\t\tif p.popUntil(tableScope, a.Td, a.Th) {\n\t\t\t\t// Close the cell and reprocess.\n\t\t\t\tp.clearActiveFormattingElements()\n\t\t\t\tp.im = inRowIM\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Select:\n\t\t\tp.reconstructActiveFormattingElements()\n\t\t\tp.addElement()\n\t\t\tp.framesetOK = false\n\t\t\tp.im = inSelectInTableIM\n\t\t\treturn true\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Td, a.Th:\n\t\t\tif !p.popUntil(tableScope, p.tok.DataAtom) {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tp.clearActiveFormattingElements()\n\t\t\tp.im = inRowIM\n\t\t\treturn true\n\t\tcase a.Body, a.Caption, a.Col, a.Colgroup, a.Html:\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:\n\t\t\tif !p.elementInScope(tableScope, p.tok.DataAtom) {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// Close the cell and reprocess.\n\t\t\tp.popUntil(tableScope, a.Td, a.Th)\n\t\t\tp.clearActiveFormattingElements()\n\t\t\tp.im = inRowIM\n\t\t\treturn false\n\t\t}\n\t}\n\treturn inBodyIM(p)\n}\n\n// Section 12.2.5.4.16.\nfunc inSelectIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase ErrorToken:\n\t\t// Stop parsing.\n\t\treturn true\n\tcase TextToken:\n\t\tp.addText(strings.Replace(p.tok.Data, \"\\x00\", \"\", -1))\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\tcase a.Option:\n\t\t\tif p.top().DataAtom == a.Option {\n\t\t\t\tp.oe.pop()\n\t\t\t}\n\t\t\tp.addElement()\n\t\tcase a.Optgroup:\n\t\t\tif p.top().DataAtom == a.Option {\n\t\t\t\tp.oe.pop()\n\t\t\t}\n\t\t\tif p.top().DataAtom == a.Optgroup {\n\t\t\t\tp.oe.pop()\n\t\t\t}\n\t\t\tp.addElement()\n\t\tcase a.Select:\n\t\t\tp.tok.Type = EndTagToken\n\t\t\treturn false\n\t\tcase a.Input, a.Keygen, a.Textarea:\n\t\t\tif p.elementInScope(selectScope, a.Select) {\n\t\t\t\tp.parseImpliedToken(EndTagToken, a.Select, a.Select.String())\n\t\t\t\treturn false\n\t\t\t}\n\t\t\t// In order to properly ignore <textarea>, we need to change the tokenizer mode.\n\t\t\tp.tokenizer.NextIsNotRawText()\n\t\t\t// Ignore the token.\n\t\t\treturn true\n\t\tcase a.Script:\n\t\t\treturn inHeadIM(p)\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Option:\n\t\t\tif p.top().DataAtom == a.Option {\n\t\t\t\tp.oe.pop()\n\t\t\t}\n\t\tcase a.Optgroup:\n\t\t\ti := len(p.oe) - 1\n\t\t\tif p.oe[i].DataAtom == a.Option {\n\t\t\t\ti--\n\t\t\t}\n\t\t\tif p.oe[i].DataAtom == a.Optgroup {\n\t\t\t\tp.oe = p.oe[:i]\n\t\t\t}\n\t\tcase a.Select:\n\t\t\tif p.popUntil(selectScope, a.Select) {\n\t\t\t\tp.resetInsertionMode()\n\t\t\t}\n\t\t}\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\tcase DoctypeToken:\n\t\t// Ignore the token.\n\t\treturn true\n\t}\n\n\treturn true\n}\n\n// Section 12.2.5.4.17.\nfunc inSelectInTableIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase StartTagToken, EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Caption, a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr, a.Td, a.Th:\n\t\t\tif p.tok.Type == StartTagToken || p.elementInScope(tableScope, p.tok.DataAtom) {\n\t\t\t\tp.parseImpliedToken(EndTagToken, a.Select, a.Select.String())\n\t\t\t\treturn false\n\t\t\t} else {\n\t\t\t\t// Ignore the token.\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn inSelectIM(p)\n}\n\n// Section 12.2.5.4.18.\nfunc afterBodyIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase ErrorToken:\n\t\t// Stop parsing.\n\t\treturn true\n\tcase TextToken:\n\t\ts := strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(s) == 0 {\n\t\t\t// It was all whitespace.\n\t\t\treturn inBodyIM(p)\n\t\t}\n\tcase StartTagToken:\n\t\tif p.tok.DataAtom == a.Html {\n\t\t\treturn inBodyIM(p)\n\t\t}\n\tcase EndTagToken:\n\t\tif p.tok.DataAtom == a.Html {\n\t\t\tif !p.fragment {\n\t\t\t\tp.im = afterAfterBodyIM\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\tcase CommentToken:\n\t\t// The comment is attached to the <html> element.\n\t\tif len(p.oe) < 1 || p.oe[0].DataAtom != a.Html {\n\t\t\tpanic(\"html: bad parser state: <html> element not found, in the after-body insertion mode\")\n\t\t}\n\t\tp.oe[0].AppendChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\t}\n\tp.im = inBodyIM\n\treturn false\n}\n\n// Section 12.2.5.4.19.\nfunc inFramesetIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\tcase TextToken:\n\t\t// Ignore all text but whitespace.\n\t\ts := strings.Map(func(c rune) rune {\n\t\t\tswitch c {\n\t\t\tcase ' ', '\\t', '\\n', '\\f', '\\r':\n\t\t\t\treturn c\n\t\t\t}\n\t\t\treturn -1\n\t\t}, p.tok.Data)\n\t\tif s != \"\" {\n\t\t\tp.addText(s)\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\tcase a.Frameset:\n\t\t\tp.addElement()\n\t\tcase a.Frame:\n\t\t\tp.addElement()\n\t\t\tp.oe.pop()\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\tcase a.Noframes:\n\t\t\treturn inHeadIM(p)\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Frameset:\n\t\t\tif p.oe.top().DataAtom != a.Html {\n\t\t\t\tp.oe.pop()\n\t\t\t\tif p.oe.top().DataAtom != a.Frameset {\n\t\t\t\t\tp.im = afterFramesetIM\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tdefault:\n\t\t// Ignore the token.\n\t}\n\treturn true\n}\n\n// Section 12.2.5.4.20.\nfunc afterFramesetIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\tcase TextToken:\n\t\t// Ignore all text but whitespace.\n\t\ts := strings.Map(func(c rune) rune {\n\t\t\tswitch c {\n\t\t\tcase ' ', '\\t', '\\n', '\\f', '\\r':\n\t\t\t\treturn c\n\t\t\t}\n\t\t\treturn -1\n\t\t}, p.tok.Data)\n\t\tif s != \"\" {\n\t\t\tp.addText(s)\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\tcase a.Noframes:\n\t\t\treturn inHeadIM(p)\n\t\t}\n\tcase EndTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\tp.im = afterAfterFramesetIM\n\t\t\treturn true\n\t\t}\n\tdefault:\n\t\t// Ignore the token.\n\t}\n\treturn true\n}\n\n// Section 12.2.5.4.21.\nfunc afterAfterBodyIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase ErrorToken:\n\t\t// Stop parsing.\n\t\treturn true\n\tcase TextToken:\n\t\ts := strings.TrimLeft(p.tok.Data, whitespace)\n\t\tif len(s) == 0 {\n\t\t\t// It was all whitespace.\n\t\t\treturn inBodyIM(p)\n\t\t}\n\tcase StartTagToken:\n\t\tif p.tok.DataAtom == a.Html {\n\t\t\treturn inBodyIM(p)\n\t\t}\n\tcase CommentToken:\n\t\tp.doc.AppendChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\t\treturn true\n\tcase DoctypeToken:\n\t\treturn inBodyIM(p)\n\t}\n\tp.im = inBodyIM\n\treturn false\n}\n\n// Section 12.2.5.4.22.\nfunc afterAfterFramesetIM(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase CommentToken:\n\t\tp.doc.AppendChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\tcase TextToken:\n\t\t// Ignore all text but whitespace.\n\t\ts := strings.Map(func(c rune) rune {\n\t\t\tswitch c {\n\t\t\tcase ' ', '\\t', '\\n', '\\f', '\\r':\n\t\t\t\treturn c\n\t\t\t}\n\t\t\treturn -1\n\t\t}, p.tok.Data)\n\t\tif s != \"\" {\n\t\t\tp.tok.Data = s\n\t\t\treturn inBodyIM(p)\n\t\t}\n\tcase StartTagToken:\n\t\tswitch p.tok.DataAtom {\n\t\tcase a.Html:\n\t\t\treturn inBodyIM(p)\n\t\tcase a.Noframes:\n\t\t\treturn inHeadIM(p)\n\t\t}\n\tcase DoctypeToken:\n\t\treturn inBodyIM(p)\n\tdefault:\n\t\t// Ignore the token.\n\t}\n\treturn true\n}\n\nconst whitespaceOrNUL = whitespace + \"\\x00\"\n\n// Section 12.2.5.5.\nfunc parseForeignContent(p *parser) bool {\n\tswitch p.tok.Type {\n\tcase TextToken:\n\t\tif p.framesetOK {\n\t\t\tp.framesetOK = strings.TrimLeft(p.tok.Data, whitespaceOrNUL) == \"\"\n\t\t}\n\t\tp.tok.Data = strings.Replace(p.tok.Data, \"\\x00\", \"\\ufffd\", -1)\n\t\tp.addText(p.tok.Data)\n\tcase CommentToken:\n\t\tp.addChild(&Node{\n\t\t\tType: CommentNode,\n\t\t\tData: p.tok.Data,\n\t\t})\n\tcase StartTagToken:\n\t\tb := breakout[p.tok.Data]\n\t\tif p.tok.DataAtom == a.Font {\n\t\tloop:\n\t\t\tfor _, attr := range p.tok.Attr {\n\t\t\t\tswitch attr.Key {\n\t\t\t\tcase \"color\", \"face\", \"size\":\n\t\t\t\t\tb = true\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif b {\n\t\t\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\t\t\tn := p.oe[i]\n\t\t\t\tif n.Namespace == \"\" || htmlIntegrationPoint(n) || mathMLTextIntegrationPoint(n) {\n\t\t\t\t\tp.oe = p.oe[:i+1]\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t\tswitch p.top().Namespace {\n\t\tcase \"math\":\n\t\t\tadjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)\n\t\tcase \"svg\":\n\t\t\t// Adjust SVG tag names. The tokenizer lower-cases tag names, but\n\t\t\t// SVG wants e.g. \"foreignObject\" with a capital second \"O\".\n\t\t\tif x := svgTagNameAdjustments[p.tok.Data]; x != \"\" {\n\t\t\t\tp.tok.DataAtom = a.Lookup([]byte(x))\n\t\t\t\tp.tok.Data = x\n\t\t\t}\n\t\t\tadjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)\n\t\tdefault:\n\t\t\tpanic(\"html: bad parser state: unexpected namespace\")\n\t\t}\n\t\tadjustForeignAttributes(p.tok.Attr)\n\t\tnamespace := p.top().Namespace\n\t\tp.addElement()\n\t\tp.top().Namespace = namespace\n\t\tif namespace != \"\" {\n\t\t\t// Don't let the tokenizer go into raw text mode in foreign content\n\t\t\t// (e.g. in an SVG <title> tag).\n\t\t\tp.tokenizer.NextIsNotRawText()\n\t\t}\n\t\tif p.hasSelfClosingToken {\n\t\t\tp.oe.pop()\n\t\t\tp.acknowledgeSelfClosingTag()\n\t\t}\n\tcase EndTagToken:\n\t\tfor i := len(p.oe) - 1; i >= 0; i-- {\n\t\t\tif p.oe[i].Namespace == \"\" {\n\t\t\t\treturn p.im(p)\n\t\t\t}\n\t\t\tif strings.EqualFold(p.oe[i].Data, p.tok.Data) {\n\t\t\t\tp.oe = p.oe[:i]\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\treturn true\n\tdefault:\n\t\t// Ignore the token.\n\t}\n\treturn true\n}\n\n// Section 12.2.5.\nfunc (p *parser) inForeignContent() bool {\n\tif len(p.oe) == 0 {\n\t\treturn false\n\t}\n\tn := p.oe[len(p.oe)-1]\n\tif n.Namespace == \"\" {\n\t\treturn false\n\t}\n\tif mathMLTextIntegrationPoint(n) {\n\t\tif p.tok.Type == StartTagToken && p.tok.DataAtom != a.Mglyph && p.tok.DataAtom != a.Malignmark {\n\t\t\treturn false\n\t\t}\n\t\tif p.tok.Type == TextToken {\n\t\t\treturn false\n\t\t}\n\t}\n\tif n.Namespace == \"math\" && n.DataAtom == a.AnnotationXml && p.tok.Type == StartTagToken && p.tok.DataAtom == a.Svg {\n\t\treturn false\n\t}\n\tif htmlIntegrationPoint(n) && (p.tok.Type == StartTagToken || p.tok.Type == TextToken) {\n\t\treturn false\n\t}\n\tif p.tok.Type == ErrorToken {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// parseImpliedToken parses a token as though it had appeared in the parser's\n// input.\nfunc (p *parser) parseImpliedToken(t TokenType, dataAtom a.Atom, data string) {\n\trealToken, selfClosing := p.tok, p.hasSelfClosingToken\n\tp.tok = Token{\n\t\tType:     t,\n\t\tDataAtom: dataAtom,\n\t\tData:     data,\n\t}\n\tp.hasSelfClosingToken = false\n\tp.parseCurrentToken()\n\tp.tok, p.hasSelfClosingToken = realToken, selfClosing\n}\n\n// parseCurrentToken runs the current token through the parsing routines\n// until it is consumed.\nfunc (p *parser) parseCurrentToken() {\n\tif p.tok.Type == SelfClosingTagToken {\n\t\tp.hasSelfClosingToken = true\n\t\tp.tok.Type = StartTagToken\n\t}\n\n\tconsumed := false\n\tfor !consumed {\n\t\tif p.inForeignContent() {\n\t\t\tconsumed = parseForeignContent(p)\n\t\t} else {\n\t\t\tconsumed = p.im(p)\n\t\t}\n\t}\n\n\tif p.hasSelfClosingToken {\n\t\t// This is a parse error, but ignore it.\n\t\tp.hasSelfClosingToken = false\n\t}\n}\n\nfunc (p *parser) parse() error {\n\t// Iterate until EOF. Any other error will cause an early return.\n\tvar err error\n\tfor err != io.EOF {\n\t\t// CDATA sections are allowed only in foreign content.\n\t\tn := p.oe.top()\n\t\tp.tokenizer.AllowCDATA(n != nil && n.Namespace != \"\")\n\t\t// Read and parse the next token.\n\t\tp.tokenizer.Next()\n\t\tp.tok = p.tokenizer.Token()\n\t\tif p.tok.Type == ErrorToken {\n\t\t\terr = p.tokenizer.Err()\n\t\t\tif err != nil && err != io.EOF {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tp.parseCurrentToken()\n\t}\n\treturn nil\n}\n\n// Parse returns the parse tree for the HTML from the given Reader.\n// The input is assumed to be UTF-8 encoded.\nfunc Parse(r io.Reader) (*Node, error) {\n\tp := &parser{\n\t\ttokenizer: NewTokenizer(r),\n\t\tdoc: &Node{\n\t\t\tType: DocumentNode,\n\t\t},\n\t\tscripting:  true,\n\t\tframesetOK: true,\n\t\tim:         initialIM,\n\t}\n\terr := p.parse()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p.doc, nil\n}\n\n// ParseFragment parses a fragment of HTML and returns the nodes that were\n// found. If the fragment is the InnerHTML for an existing element, pass that\n// element in context.\nfunc ParseFragment(r io.Reader, context *Node) ([]*Node, error) {\n\tcontextTag := \"\"\n\tif context != nil {\n\t\tif context.Type != ElementNode {\n\t\t\treturn nil, errors.New(\"html: ParseFragment of non-element Node\")\n\t\t}\n\t\t// The next check isn't just context.DataAtom.String() == context.Data because\n\t\t// it is valid to pass an element whose tag isn't a known atom. For example,\n\t\t// DataAtom == 0 and Data = \"tagfromthefuture\" is perfectly consistent.\n\t\tif context.DataAtom != a.Lookup([]byte(context.Data)) {\n\t\t\treturn nil, fmt.Errorf(\"html: inconsistent Node: DataAtom=%q, Data=%q\", context.DataAtom, context.Data)\n\t\t}\n\t\tcontextTag = context.DataAtom.String()\n\t}\n\tp := &parser{\n\t\ttokenizer: NewTokenizerFragment(r, contextTag),\n\t\tdoc: &Node{\n\t\t\tType: DocumentNode,\n\t\t},\n\t\tscripting: true,\n\t\tfragment:  true,\n\t\tcontext:   context,\n\t}\n\n\troot := &Node{\n\t\tType:     ElementNode,\n\t\tDataAtom: a.Html,\n\t\tData:     a.Html.String(),\n\t}\n\tp.doc.AppendChild(root)\n\tp.oe = nodeStack{root}\n\tp.resetInsertionMode()\n\n\tfor n := context; n != nil; n = n.Parent {\n\t\tif n.Type == ElementNode && n.DataAtom == a.Form {\n\t\t\tp.form = n\n\t\t\tbreak\n\t\t}\n\t}\n\n\terr := p.parse()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tparent := p.doc\n\tif context != nil {\n\t\tparent = root\n\t}\n\n\tvar result []*Node\n\tfor c := parent.FirstChild; c != nil; {\n\t\tnext := c.NextSibling\n\t\tparent.RemoveChild(c)\n\t\tresult = append(result, c)\n\t\tc = next\n\t}\n\treturn result, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/render.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n)\n\ntype writer interface {\n\tio.Writer\n\tio.ByteWriter\n\tWriteString(string) (int, error)\n}\n\n// Render renders the parse tree n to the given writer.\n//\n// Rendering is done on a 'best effort' basis: calling Parse on the output of\n// Render will always result in something similar to the original tree, but it\n// is not necessarily an exact clone unless the original tree was 'well-formed'.\n// 'Well-formed' is not easily specified; the HTML5 specification is\n// complicated.\n//\n// Calling Parse on arbitrary input typically results in a 'well-formed' parse\n// tree. However, it is possible for Parse to yield a 'badly-formed' parse tree.\n// For example, in a 'well-formed' parse tree, no <a> element is a child of\n// another <a> element: parsing \"<a><a>\" results in two sibling elements.\n// Similarly, in a 'well-formed' parse tree, no <a> element is a child of a\n// <table> element: parsing \"<p><table><a>\" results in a <p> with two sibling\n// children; the <a> is reparented to the <table>'s parent. However, calling\n// Parse on \"<a><table><a>\" does not return an error, but the result has an <a>\n// element with an <a> child, and is therefore not 'well-formed'.\n//\n// Programmatically constructed trees are typically also 'well-formed', but it\n// is possible to construct a tree that looks innocuous but, when rendered and\n// re-parsed, results in a different tree. A simple example is that a solitary\n// text node would become a tree containing <html>, <head> and <body> elements.\n// Another example is that the programmatic equivalent of \"a<head>b</head>c\"\n// becomes \"<html><head><head/><body>abc</body></html>\".\nfunc Render(w io.Writer, n *Node) error {\n\tif x, ok := w.(writer); ok {\n\t\treturn render(x, n)\n\t}\n\tbuf := bufio.NewWriter(w)\n\tif err := render(buf, n); err != nil {\n\t\treturn err\n\t}\n\treturn buf.Flush()\n}\n\n// plaintextAbort is returned from render1 when a <plaintext> element\n// has been rendered. No more end tags should be rendered after that.\nvar plaintextAbort = errors.New(\"html: internal error (plaintext abort)\")\n\nfunc render(w writer, n *Node) error {\n\terr := render1(w, n)\n\tif err == plaintextAbort {\n\t\terr = nil\n\t}\n\treturn err\n}\n\nfunc render1(w writer, n *Node) error {\n\t// Render non-element nodes; these are the easy cases.\n\tswitch n.Type {\n\tcase ErrorNode:\n\t\treturn errors.New(\"html: cannot render an ErrorNode node\")\n\tcase TextNode:\n\t\treturn escape(w, n.Data)\n\tcase DocumentNode:\n\t\tfor c := n.FirstChild; c != nil; c = c.NextSibling {\n\t\t\tif err := render1(w, c); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn nil\n\tcase ElementNode:\n\t\t// No-op.\n\tcase CommentNode:\n\t\tif _, err := w.WriteString(\"<!--\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := w.WriteString(n.Data); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := w.WriteString(\"-->\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\tcase DoctypeNode:\n\t\tif _, err := w.WriteString(\"<!DOCTYPE \"); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := w.WriteString(n.Data); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif n.Attr != nil {\n\t\t\tvar p, s string\n\t\t\tfor _, a := range n.Attr {\n\t\t\t\tswitch a.Key {\n\t\t\t\tcase \"public\":\n\t\t\t\t\tp = a.Val\n\t\t\t\tcase \"system\":\n\t\t\t\t\ts = a.Val\n\t\t\t\t}\n\t\t\t}\n\t\t\tif p != \"\" {\n\t\t\t\tif _, err := w.WriteString(\" PUBLIC \"); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := writeQuoted(w, p); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif s != \"\" {\n\t\t\t\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tif err := writeQuoted(w, s); err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if s != \"\" {\n\t\t\t\tif _, err := w.WriteString(\" SYSTEM \"); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tif err := writeQuoted(w, s); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn w.WriteByte('>')\n\tdefault:\n\t\treturn errors.New(\"html: unknown node type\")\n\t}\n\n\t// Render the <xxx> opening tag.\n\tif err := w.WriteByte('<'); err != nil {\n\t\treturn err\n\t}\n\tif _, err := w.WriteString(n.Data); err != nil {\n\t\treturn err\n\t}\n\tfor _, a := range n.Attr {\n\t\tif err := w.WriteByte(' '); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif a.Namespace != \"\" {\n\t\t\tif _, err := w.WriteString(a.Namespace); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif err := w.WriteByte(':'); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tif _, err := w.WriteString(a.Key); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := w.WriteString(`=\"`); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := escape(w, a.Val); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := w.WriteByte('\"'); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tif voidElements[n.Data] {\n\t\tif n.FirstChild != nil {\n\t\t\treturn fmt.Errorf(\"html: void element <%s> has child nodes\", n.Data)\n\t\t}\n\t\t_, err := w.WriteString(\"/>\")\n\t\treturn err\n\t}\n\tif err := w.WriteByte('>'); err != nil {\n\t\treturn err\n\t}\n\n\t// Add initial newline where there is danger of a newline beging ignored.\n\tif c := n.FirstChild; c != nil && c.Type == TextNode && strings.HasPrefix(c.Data, \"\\n\") {\n\t\tswitch n.Data {\n\t\tcase \"pre\", \"listing\", \"textarea\":\n\t\t\tif err := w.WriteByte('\\n'); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\t// Render any child nodes.\n\tswitch n.Data {\n\tcase \"iframe\", \"noembed\", \"noframes\", \"noscript\", \"plaintext\", \"script\", \"style\", \"xmp\":\n\t\tfor c := n.FirstChild; c != nil; c = c.NextSibling {\n\t\t\tif c.Type == TextNode {\n\t\t\t\tif _, err := w.WriteString(c.Data); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := render1(w, c); err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif n.Data == \"plaintext\" {\n\t\t\t// Don't render anything else. <plaintext> must be the\n\t\t\t// last element in the file, with no closing tag.\n\t\t\treturn plaintextAbort\n\t\t}\n\tdefault:\n\t\tfor c := n.FirstChild; c != nil; c = c.NextSibling {\n\t\t\tif err := render1(w, c); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\t// Render the </xxx> closing tag.\n\tif _, err := w.WriteString(\"</\"); err != nil {\n\t\treturn err\n\t}\n\tif _, err := w.WriteString(n.Data); err != nil {\n\t\treturn err\n\t}\n\treturn w.WriteByte('>')\n}\n\n// writeQuoted writes s to w surrounded by quotes. Normally it will use double\n// quotes, but if s contains a double quote, it will use single quotes.\n// It is used for writing the identifiers in a doctype declaration.\n// In valid HTML, they can't contain both types of quotes.\nfunc writeQuoted(w writer, s string) error {\n\tvar q byte = '\"'\n\tif strings.Contains(s, `\"`) {\n\t\tq = '\\''\n\t}\n\tif err := w.WriteByte(q); err != nil {\n\t\treturn err\n\t}\n\tif _, err := w.WriteString(s); err != nil {\n\t\treturn err\n\t}\n\tif err := w.WriteByte(q); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Section 12.1.2, \"Elements\", gives this list of void elements. Void elements\n// are those that can't have any contents.\nvar voidElements = map[string]bool{\n\t\"area\":    true,\n\t\"base\":    true,\n\t\"br\":      true,\n\t\"col\":     true,\n\t\"command\": true,\n\t\"embed\":   true,\n\t\"hr\":      true,\n\t\"img\":     true,\n\t\"input\":   true,\n\t\"keygen\":  true,\n\t\"link\":    true,\n\t\"meta\":    true,\n\t\"param\":   true,\n\t\"source\":  true,\n\t\"track\":   true,\n\t\"wbr\":     true,\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/html/token.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage html\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"golang.org/x/net/html/atom\"\n)\n\n// A TokenType is the type of a Token.\ntype TokenType uint32\n\nconst (\n\t// ErrorToken means that an error occurred during tokenization.\n\tErrorToken TokenType = iota\n\t// TextToken means a text node.\n\tTextToken\n\t// A StartTagToken looks like <a>.\n\tStartTagToken\n\t// An EndTagToken looks like </a>.\n\tEndTagToken\n\t// A SelfClosingTagToken tag looks like <br/>.\n\tSelfClosingTagToken\n\t// A CommentToken looks like <!--x-->.\n\tCommentToken\n\t// A DoctypeToken looks like <!DOCTYPE x>\n\tDoctypeToken\n)\n\n// ErrBufferExceeded means that the buffering limit was exceeded.\nvar ErrBufferExceeded = errors.New(\"max buffer exceeded\")\n\n// String returns a string representation of the TokenType.\nfunc (t TokenType) String() string {\n\tswitch t {\n\tcase ErrorToken:\n\t\treturn \"Error\"\n\tcase TextToken:\n\t\treturn \"Text\"\n\tcase StartTagToken:\n\t\treturn \"StartTag\"\n\tcase EndTagToken:\n\t\treturn \"EndTag\"\n\tcase SelfClosingTagToken:\n\t\treturn \"SelfClosingTag\"\n\tcase CommentToken:\n\t\treturn \"Comment\"\n\tcase DoctypeToken:\n\t\treturn \"Doctype\"\n\t}\n\treturn \"Invalid(\" + strconv.Itoa(int(t)) + \")\"\n}\n\n// An Attribute is an attribute namespace-key-value triple. Namespace is\n// non-empty for foreign attributes like xlink, Key is alphabetic (and hence\n// does not contain escapable characters like '&', '<' or '>'), and Val is\n// unescaped (it looks like \"a<b\" rather than \"a&lt;b\").\n//\n// Namespace is only used by the parser, not the tokenizer.\ntype Attribute struct {\n\tNamespace, Key, Val string\n}\n\n// A Token consists of a TokenType and some Data (tag name for start and end\n// tags, content for text, comments and doctypes). A tag Token may also contain\n// a slice of Attributes. Data is unescaped for all Tokens (it looks like \"a<b\"\n// rather than \"a&lt;b\"). For tag Tokens, DataAtom is the atom for Data, or\n// zero if Data is not a known tag name.\ntype Token struct {\n\tType     TokenType\n\tDataAtom atom.Atom\n\tData     string\n\tAttr     []Attribute\n}\n\n// tagString returns a string representation of a tag Token's Data and Attr.\nfunc (t Token) tagString() string {\n\tif len(t.Attr) == 0 {\n\t\treturn t.Data\n\t}\n\tbuf := bytes.NewBufferString(t.Data)\n\tfor _, a := range t.Attr {\n\t\tbuf.WriteByte(' ')\n\t\tbuf.WriteString(a.Key)\n\t\tbuf.WriteString(`=\"`)\n\t\tescape(buf, a.Val)\n\t\tbuf.WriteByte('\"')\n\t}\n\treturn buf.String()\n}\n\n// String returns a string representation of the Token.\nfunc (t Token) String() string {\n\tswitch t.Type {\n\tcase ErrorToken:\n\t\treturn \"\"\n\tcase TextToken:\n\t\treturn EscapeString(t.Data)\n\tcase StartTagToken:\n\t\treturn \"<\" + t.tagString() + \">\"\n\tcase EndTagToken:\n\t\treturn \"</\" + t.tagString() + \">\"\n\tcase SelfClosingTagToken:\n\t\treturn \"<\" + t.tagString() + \"/>\"\n\tcase CommentToken:\n\t\treturn \"<!--\" + t.Data + \"-->\"\n\tcase DoctypeToken:\n\t\treturn \"<!DOCTYPE \" + t.Data + \">\"\n\t}\n\treturn \"Invalid(\" + strconv.Itoa(int(t.Type)) + \")\"\n}\n\n// span is a range of bytes in a Tokenizer's buffer. The start is inclusive,\n// the end is exclusive.\ntype span struct {\n\tstart, end int\n}\n\n// A Tokenizer returns a stream of HTML Tokens.\ntype Tokenizer struct {\n\t// r is the source of the HTML text.\n\tr io.Reader\n\t// tt is the TokenType of the current token.\n\ttt TokenType\n\t// err is the first error encountered during tokenization. It is possible\n\t// for tt != Error && err != nil to hold: this means that Next returned a\n\t// valid token but the subsequent Next call will return an error token.\n\t// For example, if the HTML text input was just \"plain\", then the first\n\t// Next call would set z.err to io.EOF but return a TextToken, and all\n\t// subsequent Next calls would return an ErrorToken.\n\t// err is never reset. Once it becomes non-nil, it stays non-nil.\n\terr error\n\t// readErr is the error returned by the io.Reader r. It is separate from\n\t// err because it is valid for an io.Reader to return (n int, err1 error)\n\t// such that n > 0 && err1 != nil, and callers should always process the\n\t// n > 0 bytes before considering the error err1.\n\treadErr error\n\t// buf[raw.start:raw.end] holds the raw bytes of the current token.\n\t// buf[raw.end:] is buffered input that will yield future tokens.\n\traw span\n\tbuf []byte\n\t// maxBuf limits the data buffered in buf. A value of 0 means unlimited.\n\tmaxBuf int\n\t// buf[data.start:data.end] holds the raw bytes of the current token's data:\n\t// a text token's text, a tag token's tag name, etc.\n\tdata span\n\t// pendingAttr is the attribute key and value currently being tokenized.\n\t// When complete, pendingAttr is pushed onto attr. nAttrReturned is\n\t// incremented on each call to TagAttr.\n\tpendingAttr   [2]span\n\tattr          [][2]span\n\tnAttrReturned int\n\t// rawTag is the \"script\" in \"</script>\" that closes the next token. If\n\t// non-empty, the subsequent call to Next will return a raw or RCDATA text\n\t// token: one that treats \"<p>\" as text instead of an element.\n\t// rawTag's contents are lower-cased.\n\trawTag string\n\t// textIsRaw is whether the current text token's data is not escaped.\n\ttextIsRaw bool\n\t// convertNUL is whether NUL bytes in the current token's data should\n\t// be converted into \\ufffd replacement characters.\n\tconvertNUL bool\n\t// allowCDATA is whether CDATA sections are allowed in the current context.\n\tallowCDATA bool\n}\n\n// AllowCDATA sets whether or not the tokenizer recognizes <![CDATA[foo]]> as\n// the text \"foo\". The default value is false, which means to recognize it as\n// a bogus comment \"<!-- [CDATA[foo]] -->\" instead.\n//\n// Strictly speaking, an HTML5 compliant tokenizer should allow CDATA if and\n// only if tokenizing foreign content, such as MathML and SVG. However,\n// tracking foreign-contentness is difficult to do purely in the tokenizer,\n// as opposed to the parser, due to HTML integration points: an <svg> element\n// can contain a <foreignObject> that is foreign-to-SVG but not foreign-to-\n// HTML. For strict compliance with the HTML5 tokenization algorithm, it is the\n// responsibility of the user of a tokenizer to call AllowCDATA as appropriate.\n// In practice, if using the tokenizer without caring whether MathML or SVG\n// CDATA is text or comments, such as tokenizing HTML to find all the anchor\n// text, it is acceptable to ignore this responsibility.\nfunc (z *Tokenizer) AllowCDATA(allowCDATA bool) {\n\tz.allowCDATA = allowCDATA\n}\n\n// NextIsNotRawText instructs the tokenizer that the next token should not be\n// considered as 'raw text'. Some elements, such as script and title elements,\n// normally require the next token after the opening tag to be 'raw text' that\n// has no child elements. For example, tokenizing \"<title>a<b>c</b>d</title>\"\n// yields a start tag token for \"<title>\", a text token for \"a<b>c</b>d\", and\n// an end tag token for \"</title>\". There are no distinct start tag or end tag\n// tokens for the \"<b>\" and \"</b>\".\n//\n// This tokenizer implementation will generally look for raw text at the right\n// times. Strictly speaking, an HTML5 compliant tokenizer should not look for\n// raw text if in foreign content: <title> generally needs raw text, but a\n// <title> inside an <svg> does not. Another example is that a <textarea>\n// generally needs raw text, but a <textarea> is not allowed as an immediate\n// child of a <select>; in normal parsing, a <textarea> implies </select>, but\n// one cannot close the implicit element when parsing a <select>'s InnerHTML.\n// Similarly to AllowCDATA, tracking the correct moment to override raw-text-\n// ness is difficult to do purely in the tokenizer, as opposed to the parser.\n// For strict compliance with the HTML5 tokenization algorithm, it is the\n// responsibility of the user of a tokenizer to call NextIsNotRawText as\n// appropriate. In practice, like AllowCDATA, it is acceptable to ignore this\n// responsibility for basic usage.\n//\n// Note that this 'raw text' concept is different from the one offered by the\n// Tokenizer.Raw method.\nfunc (z *Tokenizer) NextIsNotRawText() {\n\tz.rawTag = \"\"\n}\n\n// Err returns the error associated with the most recent ErrorToken token.\n// This is typically io.EOF, meaning the end of tokenization.\nfunc (z *Tokenizer) Err() error {\n\tif z.tt != ErrorToken {\n\t\treturn nil\n\t}\n\treturn z.err\n}\n\n// readByte returns the next byte from the input stream, doing a buffered read\n// from z.r into z.buf if necessary. z.buf[z.raw.start:z.raw.end] remains a contiguous byte\n// slice that holds all the bytes read so far for the current token.\n// It sets z.err if the underlying reader returns an error.\n// Pre-condition: z.err == nil.\nfunc (z *Tokenizer) readByte() byte {\n\tif z.raw.end >= len(z.buf) {\n\t\t// Our buffer is exhausted and we have to read from z.r. Check if the\n\t\t// previous read resulted in an error.\n\t\tif z.readErr != nil {\n\t\t\tz.err = z.readErr\n\t\t\treturn 0\n\t\t}\n\t\t// We copy z.buf[z.raw.start:z.raw.end] to the beginning of z.buf. If the length\n\t\t// z.raw.end - z.raw.start is more than half the capacity of z.buf, then we\n\t\t// allocate a new buffer before the copy.\n\t\tc := cap(z.buf)\n\t\td := z.raw.end - z.raw.start\n\t\tvar buf1 []byte\n\t\tif 2*d > c {\n\t\t\tbuf1 = make([]byte, d, 2*c)\n\t\t} else {\n\t\t\tbuf1 = z.buf[:d]\n\t\t}\n\t\tcopy(buf1, z.buf[z.raw.start:z.raw.end])\n\t\tif x := z.raw.start; x != 0 {\n\t\t\t// Adjust the data/attr spans to refer to the same contents after the copy.\n\t\t\tz.data.start -= x\n\t\t\tz.data.end -= x\n\t\t\tz.pendingAttr[0].start -= x\n\t\t\tz.pendingAttr[0].end -= x\n\t\t\tz.pendingAttr[1].start -= x\n\t\t\tz.pendingAttr[1].end -= x\n\t\t\tfor i := range z.attr {\n\t\t\t\tz.attr[i][0].start -= x\n\t\t\t\tz.attr[i][0].end -= x\n\t\t\t\tz.attr[i][1].start -= x\n\t\t\t\tz.attr[i][1].end -= x\n\t\t\t}\n\t\t}\n\t\tz.raw.start, z.raw.end, z.buf = 0, d, buf1[:d]\n\t\t// Now that we have copied the live bytes to the start of the buffer,\n\t\t// we read from z.r into the remainder.\n\t\tvar n int\n\t\tn, z.readErr = readAtLeastOneByte(z.r, buf1[d:cap(buf1)])\n\t\tif n == 0 {\n\t\t\tz.err = z.readErr\n\t\t\treturn 0\n\t\t}\n\t\tz.buf = buf1[:d+n]\n\t}\n\tx := z.buf[z.raw.end]\n\tz.raw.end++\n\tif z.maxBuf > 0 && z.raw.end-z.raw.start >= z.maxBuf {\n\t\tz.err = ErrBufferExceeded\n\t\treturn 0\n\t}\n\treturn x\n}\n\n// Buffered returns a slice containing data buffered but not yet tokenized.\nfunc (z *Tokenizer) Buffered() []byte {\n\treturn z.buf[z.raw.end:]\n}\n\n// readAtLeastOneByte wraps an io.Reader so that reading cannot return (0, nil).\n// It returns io.ErrNoProgress if the underlying r.Read method returns (0, nil)\n// too many times in succession.\nfunc readAtLeastOneByte(r io.Reader, b []byte) (int, error) {\n\tfor i := 0; i < 100; i++ {\n\t\tn, err := r.Read(b)\n\t\tif n != 0 || err != nil {\n\t\t\treturn n, err\n\t\t}\n\t}\n\treturn 0, io.ErrNoProgress\n}\n\n// skipWhiteSpace skips past any white space.\nfunc (z *Tokenizer) skipWhiteSpace() {\n\tif z.err != nil {\n\t\treturn\n\t}\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\treturn\n\t\t}\n\t\tswitch c {\n\t\tcase ' ', '\\n', '\\r', '\\t', '\\f':\n\t\t\t// No-op.\n\t\tdefault:\n\t\t\tz.raw.end--\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// readRawOrRCDATA reads until the next \"</foo>\", where \"foo\" is z.rawTag and\n// is typically something like \"script\" or \"textarea\".\nfunc (z *Tokenizer) readRawOrRCDATA() {\n\tif z.rawTag == \"script\" {\n\t\tz.readScript()\n\t\tz.textIsRaw = true\n\t\tz.rawTag = \"\"\n\t\treturn\n\t}\nloop:\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tbreak loop\n\t\t}\n\t\tif c != '<' {\n\t\t\tcontinue loop\n\t\t}\n\t\tc = z.readByte()\n\t\tif z.err != nil {\n\t\t\tbreak loop\n\t\t}\n\t\tif c != '/' {\n\t\t\tcontinue loop\n\t\t}\n\t\tif z.readRawEndTag() || z.err != nil {\n\t\t\tbreak loop\n\t\t}\n\t}\n\tz.data.end = z.raw.end\n\t// A textarea's or title's RCDATA can contain escaped entities.\n\tz.textIsRaw = z.rawTag != \"textarea\" && z.rawTag != \"title\"\n\tz.rawTag = \"\"\n}\n\n// readRawEndTag attempts to read a tag like \"</foo>\", where \"foo\" is z.rawTag.\n// If it succeeds, it backs up the input position to reconsume the tag and\n// returns true. Otherwise it returns false. The opening \"</\" has already been\n// consumed.\nfunc (z *Tokenizer) readRawEndTag() bool {\n\tfor i := 0; i < len(z.rawTag); i++ {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\treturn false\n\t\t}\n\t\tif c != z.rawTag[i] && c != z.rawTag[i]-('a'-'A') {\n\t\t\tz.raw.end--\n\t\t\treturn false\n\t\t}\n\t}\n\tc := z.readByte()\n\tif z.err != nil {\n\t\treturn false\n\t}\n\tswitch c {\n\tcase ' ', '\\n', '\\r', '\\t', '\\f', '/', '>':\n\t\t// The 3 is 2 for the leading \"</\" plus 1 for the trailing character c.\n\t\tz.raw.end -= 3 + len(z.rawTag)\n\t\treturn true\n\t}\n\tz.raw.end--\n\treturn false\n}\n\n// readScript reads until the next </script> tag, following the byzantine\n// rules for escaping/hiding the closing tag.\nfunc (z *Tokenizer) readScript() {\n\tdefer func() {\n\t\tz.data.end = z.raw.end\n\t}()\n\tvar c byte\n\nscriptData:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tif c == '<' {\n\t\tgoto scriptDataLessThanSign\n\t}\n\tgoto scriptData\n\nscriptDataLessThanSign:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase '/':\n\t\tgoto scriptDataEndTagOpen\n\tcase '!':\n\t\tgoto scriptDataEscapeStart\n\t}\n\tz.raw.end--\n\tgoto scriptData\n\nscriptDataEndTagOpen:\n\tif z.readRawEndTag() || z.err != nil {\n\t\treturn\n\t}\n\tgoto scriptData\n\nscriptDataEscapeStart:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tif c == '-' {\n\t\tgoto scriptDataEscapeStartDash\n\t}\n\tz.raw.end--\n\tgoto scriptData\n\nscriptDataEscapeStartDash:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tif c == '-' {\n\t\tgoto scriptDataEscapedDashDash\n\t}\n\tz.raw.end--\n\tgoto scriptData\n\nscriptDataEscaped:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase '-':\n\t\tgoto scriptDataEscapedDash\n\tcase '<':\n\t\tgoto scriptDataEscapedLessThanSign\n\t}\n\tgoto scriptDataEscaped\n\nscriptDataEscapedDash:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase '-':\n\t\tgoto scriptDataEscapedDashDash\n\tcase '<':\n\t\tgoto scriptDataEscapedLessThanSign\n\t}\n\tgoto scriptDataEscaped\n\nscriptDataEscapedDashDash:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase '-':\n\t\tgoto scriptDataEscapedDashDash\n\tcase '<':\n\t\tgoto scriptDataEscapedLessThanSign\n\tcase '>':\n\t\tgoto scriptData\n\t}\n\tgoto scriptDataEscaped\n\nscriptDataEscapedLessThanSign:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tif c == '/' {\n\t\tgoto scriptDataEscapedEndTagOpen\n\t}\n\tif 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' {\n\t\tgoto scriptDataDoubleEscapeStart\n\t}\n\tz.raw.end--\n\tgoto scriptData\n\nscriptDataEscapedEndTagOpen:\n\tif z.readRawEndTag() || z.err != nil {\n\t\treturn\n\t}\n\tgoto scriptDataEscaped\n\nscriptDataDoubleEscapeStart:\n\tz.raw.end--\n\tfor i := 0; i < len(\"script\"); i++ {\n\t\tc = z.readByte()\n\t\tif z.err != nil {\n\t\t\treturn\n\t\t}\n\t\tif c != \"script\"[i] && c != \"SCRIPT\"[i] {\n\t\t\tz.raw.end--\n\t\t\tgoto scriptDataEscaped\n\t\t}\n\t}\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase ' ', '\\n', '\\r', '\\t', '\\f', '/', '>':\n\t\tgoto scriptDataDoubleEscaped\n\t}\n\tz.raw.end--\n\tgoto scriptDataEscaped\n\nscriptDataDoubleEscaped:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase '-':\n\t\tgoto scriptDataDoubleEscapedDash\n\tcase '<':\n\t\tgoto scriptDataDoubleEscapedLessThanSign\n\t}\n\tgoto scriptDataDoubleEscaped\n\nscriptDataDoubleEscapedDash:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase '-':\n\t\tgoto scriptDataDoubleEscapedDashDash\n\tcase '<':\n\t\tgoto scriptDataDoubleEscapedLessThanSign\n\t}\n\tgoto scriptDataDoubleEscaped\n\nscriptDataDoubleEscapedDashDash:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch c {\n\tcase '-':\n\t\tgoto scriptDataDoubleEscapedDashDash\n\tcase '<':\n\t\tgoto scriptDataDoubleEscapedLessThanSign\n\tcase '>':\n\t\tgoto scriptData\n\t}\n\tgoto scriptDataDoubleEscaped\n\nscriptDataDoubleEscapedLessThanSign:\n\tc = z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tif c == '/' {\n\t\tgoto scriptDataDoubleEscapeEnd\n\t}\n\tz.raw.end--\n\tgoto scriptDataDoubleEscaped\n\nscriptDataDoubleEscapeEnd:\n\tif z.readRawEndTag() {\n\t\tz.raw.end += len(\"</script>\")\n\t\tgoto scriptDataEscaped\n\t}\n\tif z.err != nil {\n\t\treturn\n\t}\n\tgoto scriptDataDoubleEscaped\n}\n\n// readComment reads the next comment token starting with \"<!--\". The opening\n// \"<!--\" has already been consumed.\nfunc (z *Tokenizer) readComment() {\n\tz.data.start = z.raw.end\n\tdefer func() {\n\t\tif z.data.end < z.data.start {\n\t\t\t// It's a comment with no data, like <!-->.\n\t\t\tz.data.end = z.data.start\n\t\t}\n\t}()\n\tfor dashCount := 2; ; {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\t// Ignore up to two dashes at EOF.\n\t\t\tif dashCount > 2 {\n\t\t\t\tdashCount = 2\n\t\t\t}\n\t\t\tz.data.end = z.raw.end - dashCount\n\t\t\treturn\n\t\t}\n\t\tswitch c {\n\t\tcase '-':\n\t\t\tdashCount++\n\t\t\tcontinue\n\t\tcase '>':\n\t\t\tif dashCount >= 2 {\n\t\t\t\tz.data.end = z.raw.end - len(\"-->\")\n\t\t\t\treturn\n\t\t\t}\n\t\tcase '!':\n\t\t\tif dashCount >= 2 {\n\t\t\t\tc = z.readByte()\n\t\t\t\tif z.err != nil {\n\t\t\t\t\tz.data.end = z.raw.end\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif c == '>' {\n\t\t\t\t\tz.data.end = z.raw.end - len(\"--!>\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdashCount = 0\n\t}\n}\n\n// readUntilCloseAngle reads until the next \">\".\nfunc (z *Tokenizer) readUntilCloseAngle() {\n\tz.data.start = z.raw.end\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn\n\t\t}\n\t\tif c == '>' {\n\t\t\tz.data.end = z.raw.end - len(\">\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// readMarkupDeclaration reads the next token starting with \"<!\". It might be\n// a \"<!--comment-->\", a \"<!DOCTYPE foo>\", a \"<![CDATA[section]]>\" or\n// \"<!a bogus comment\". The opening \"<!\" has already been consumed.\nfunc (z *Tokenizer) readMarkupDeclaration() TokenType {\n\tz.data.start = z.raw.end\n\tvar c [2]byte\n\tfor i := 0; i < 2; i++ {\n\t\tc[i] = z.readByte()\n\t\tif z.err != nil {\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn CommentToken\n\t\t}\n\t}\n\tif c[0] == '-' && c[1] == '-' {\n\t\tz.readComment()\n\t\treturn CommentToken\n\t}\n\tz.raw.end -= 2\n\tif z.readDoctype() {\n\t\treturn DoctypeToken\n\t}\n\tif z.allowCDATA && z.readCDATA() {\n\t\tz.convertNUL = true\n\t\treturn TextToken\n\t}\n\t// It's a bogus comment.\n\tz.readUntilCloseAngle()\n\treturn CommentToken\n}\n\n// readDoctype attempts to read a doctype declaration and returns true if\n// successful. The opening \"<!\" has already been consumed.\nfunc (z *Tokenizer) readDoctype() bool {\n\tconst s = \"DOCTYPE\"\n\tfor i := 0; i < len(s); i++ {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn false\n\t\t}\n\t\tif c != s[i] && c != s[i]+('a'-'A') {\n\t\t\t// Back up to read the fragment of \"DOCTYPE\" again.\n\t\t\tz.raw.end = z.data.start\n\t\t\treturn false\n\t\t}\n\t}\n\tif z.skipWhiteSpace(); z.err != nil {\n\t\tz.data.start = z.raw.end\n\t\tz.data.end = z.raw.end\n\t\treturn true\n\t}\n\tz.readUntilCloseAngle()\n\treturn true\n}\n\n// readCDATA attempts to read a CDATA section and returns true if\n// successful. The opening \"<!\" has already been consumed.\nfunc (z *Tokenizer) readCDATA() bool {\n\tconst s = \"[CDATA[\"\n\tfor i := 0; i < len(s); i++ {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn false\n\t\t}\n\t\tif c != s[i] {\n\t\t\t// Back up to read the fragment of \"[CDATA[\" again.\n\t\t\tz.raw.end = z.data.start\n\t\t\treturn false\n\t\t}\n\t}\n\tz.data.start = z.raw.end\n\tbrackets := 0\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn true\n\t\t}\n\t\tswitch c {\n\t\tcase ']':\n\t\t\tbrackets++\n\t\tcase '>':\n\t\t\tif brackets >= 2 {\n\t\t\t\tz.data.end = z.raw.end - len(\"]]>\")\n\t\t\t\treturn true\n\t\t\t}\n\t\t\tbrackets = 0\n\t\tdefault:\n\t\t\tbrackets = 0\n\t\t}\n\t}\n}\n\n// startTagIn returns whether the start tag in z.buf[z.data.start:z.data.end]\n// case-insensitively matches any element of ss.\nfunc (z *Tokenizer) startTagIn(ss ...string) bool {\nloop:\n\tfor _, s := range ss {\n\t\tif z.data.end-z.data.start != len(s) {\n\t\t\tcontinue loop\n\t\t}\n\t\tfor i := 0; i < len(s); i++ {\n\t\t\tc := z.buf[z.data.start+i]\n\t\t\tif 'A' <= c && c <= 'Z' {\n\t\t\t\tc += 'a' - 'A'\n\t\t\t}\n\t\t\tif c != s[i] {\n\t\t\t\tcontinue loop\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n\n// readStartTag reads the next start tag token. The opening \"<a\" has already\n// been consumed, where 'a' means anything in [A-Za-z].\nfunc (z *Tokenizer) readStartTag() TokenType {\n\tz.readTag(true)\n\tif z.err != nil {\n\t\treturn ErrorToken\n\t}\n\t// Several tags flag the tokenizer's next token as raw.\n\tc, raw := z.buf[z.data.start], false\n\tif 'A' <= c && c <= 'Z' {\n\t\tc += 'a' - 'A'\n\t}\n\tswitch c {\n\tcase 'i':\n\t\traw = z.startTagIn(\"iframe\")\n\tcase 'n':\n\t\traw = z.startTagIn(\"noembed\", \"noframes\", \"noscript\")\n\tcase 'p':\n\t\traw = z.startTagIn(\"plaintext\")\n\tcase 's':\n\t\traw = z.startTagIn(\"script\", \"style\")\n\tcase 't':\n\t\traw = z.startTagIn(\"textarea\", \"title\")\n\tcase 'x':\n\t\traw = z.startTagIn(\"xmp\")\n\t}\n\tif raw {\n\t\tz.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end]))\n\t}\n\t// Look for a self-closing token like \"<br/>\".\n\tif z.err == nil && z.buf[z.raw.end-2] == '/' {\n\t\treturn SelfClosingTagToken\n\t}\n\treturn StartTagToken\n}\n\n// readTag reads the next tag token and its attributes. If saveAttr, those\n// attributes are saved in z.attr, otherwise z.attr is set to an empty slice.\n// The opening \"<a\" or \"</a\" has already been consumed, where 'a' means anything\n// in [A-Za-z].\nfunc (z *Tokenizer) readTag(saveAttr bool) {\n\tz.attr = z.attr[:0]\n\tz.nAttrReturned = 0\n\t// Read the tag name and attribute key/value pairs.\n\tz.readTagName()\n\tif z.skipWhiteSpace(); z.err != nil {\n\t\treturn\n\t}\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil || c == '>' {\n\t\t\tbreak\n\t\t}\n\t\tz.raw.end--\n\t\tz.readTagAttrKey()\n\t\tz.readTagAttrVal()\n\t\t// Save pendingAttr if saveAttr and that attribute has a non-empty key.\n\t\tif saveAttr && z.pendingAttr[0].start != z.pendingAttr[0].end {\n\t\t\tz.attr = append(z.attr, z.pendingAttr)\n\t\t}\n\t\tif z.skipWhiteSpace(); z.err != nil {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// readTagName sets z.data to the \"div\" in \"<div k=v>\". The reader (z.raw.end)\n// is positioned such that the first byte of the tag name (the \"d\" in \"<div\")\n// has already been consumed.\nfunc (z *Tokenizer) readTagName() {\n\tz.data.start = z.raw.end - 1\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn\n\t\t}\n\t\tswitch c {\n\t\tcase ' ', '\\n', '\\r', '\\t', '\\f':\n\t\t\tz.data.end = z.raw.end - 1\n\t\t\treturn\n\t\tcase '/', '>':\n\t\t\tz.raw.end--\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// readTagAttrKey sets z.pendingAttr[0] to the \"k\" in \"<div k=v>\".\n// Precondition: z.err == nil.\nfunc (z *Tokenizer) readTagAttrKey() {\n\tz.pendingAttr[0].start = z.raw.end\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tz.pendingAttr[0].end = z.raw.end\n\t\t\treturn\n\t\t}\n\t\tswitch c {\n\t\tcase ' ', '\\n', '\\r', '\\t', '\\f', '/':\n\t\t\tz.pendingAttr[0].end = z.raw.end - 1\n\t\t\treturn\n\t\tcase '=', '>':\n\t\t\tz.raw.end--\n\t\t\tz.pendingAttr[0].end = z.raw.end\n\t\t\treturn\n\t\t}\n\t}\n}\n\n// readTagAttrVal sets z.pendingAttr[1] to the \"v\" in \"<div k=v>\".\nfunc (z *Tokenizer) readTagAttrVal() {\n\tz.pendingAttr[1].start = z.raw.end\n\tz.pendingAttr[1].end = z.raw.end\n\tif z.skipWhiteSpace(); z.err != nil {\n\t\treturn\n\t}\n\tc := z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tif c != '=' {\n\t\tz.raw.end--\n\t\treturn\n\t}\n\tif z.skipWhiteSpace(); z.err != nil {\n\t\treturn\n\t}\n\tquote := z.readByte()\n\tif z.err != nil {\n\t\treturn\n\t}\n\tswitch quote {\n\tcase '>':\n\t\tz.raw.end--\n\t\treturn\n\n\tcase '\\'', '\"':\n\t\tz.pendingAttr[1].start = z.raw.end\n\t\tfor {\n\t\t\tc := z.readByte()\n\t\t\tif z.err != nil {\n\t\t\t\tz.pendingAttr[1].end = z.raw.end\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif c == quote {\n\t\t\t\tz.pendingAttr[1].end = z.raw.end - 1\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\tdefault:\n\t\tz.pendingAttr[1].start = z.raw.end - 1\n\t\tfor {\n\t\t\tc := z.readByte()\n\t\t\tif z.err != nil {\n\t\t\t\tz.pendingAttr[1].end = z.raw.end\n\t\t\t\treturn\n\t\t\t}\n\t\t\tswitch c {\n\t\t\tcase ' ', '\\n', '\\r', '\\t', '\\f':\n\t\t\t\tz.pendingAttr[1].end = z.raw.end - 1\n\t\t\t\treturn\n\t\t\tcase '>':\n\t\t\t\tz.raw.end--\n\t\t\t\tz.pendingAttr[1].end = z.raw.end\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Next scans the next token and returns its type.\nfunc (z *Tokenizer) Next() TokenType {\n\tz.raw.start = z.raw.end\n\tz.data.start = z.raw.end\n\tz.data.end = z.raw.end\n\tif z.err != nil {\n\t\tz.tt = ErrorToken\n\t\treturn z.tt\n\t}\n\tif z.rawTag != \"\" {\n\t\tif z.rawTag == \"plaintext\" {\n\t\t\t// Read everything up to EOF.\n\t\t\tfor z.err == nil {\n\t\t\t\tz.readByte()\n\t\t\t}\n\t\t\tz.data.end = z.raw.end\n\t\t\tz.textIsRaw = true\n\t\t} else {\n\t\t\tz.readRawOrRCDATA()\n\t\t}\n\t\tif z.data.end > z.data.start {\n\t\t\tz.tt = TextToken\n\t\t\tz.convertNUL = true\n\t\t\treturn z.tt\n\t\t}\n\t}\n\tz.textIsRaw = false\n\tz.convertNUL = false\n\nloop:\n\tfor {\n\t\tc := z.readByte()\n\t\tif z.err != nil {\n\t\t\tbreak loop\n\t\t}\n\t\tif c != '<' {\n\t\t\tcontinue loop\n\t\t}\n\n\t\t// Check if the '<' we have just read is part of a tag, comment\n\t\t// or doctype. If not, it's part of the accumulated text token.\n\t\tc = z.readByte()\n\t\tif z.err != nil {\n\t\t\tbreak loop\n\t\t}\n\t\tvar tokenType TokenType\n\t\tswitch {\n\t\tcase 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z':\n\t\t\ttokenType = StartTagToken\n\t\tcase c == '/':\n\t\t\ttokenType = EndTagToken\n\t\tcase c == '!' || c == '?':\n\t\t\t// We use CommentToken to mean any of \"<!--actual comments-->\",\n\t\t\t// \"<!DOCTYPE declarations>\" and \"<?xml processing instructions?>\".\n\t\t\ttokenType = CommentToken\n\t\tdefault:\n\t\t\t// Reconsume the current character.\n\t\t\tz.raw.end--\n\t\t\tcontinue\n\t\t}\n\n\t\t// We have a non-text token, but we might have accumulated some text\n\t\t// before that. If so, we return the text first, and return the non-\n\t\t// text token on the subsequent call to Next.\n\t\tif x := z.raw.end - len(\"<a\"); z.raw.start < x {\n\t\t\tz.raw.end = x\n\t\t\tz.data.end = x\n\t\t\tz.tt = TextToken\n\t\t\treturn z.tt\n\t\t}\n\t\tswitch tokenType {\n\t\tcase StartTagToken:\n\t\t\tz.tt = z.readStartTag()\n\t\t\treturn z.tt\n\t\tcase EndTagToken:\n\t\t\tc = z.readByte()\n\t\t\tif z.err != nil {\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tif c == '>' {\n\t\t\t\t// \"</>\" does not generate a token at all. Generate an empty comment\n\t\t\t\t// to allow passthrough clients to pick up the data using Raw.\n\t\t\t\t// Reset the tokenizer state and start again.\n\t\t\t\tz.tt = CommentToken\n\t\t\t\treturn z.tt\n\t\t\t}\n\t\t\tif 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' {\n\t\t\t\tz.readTag(false)\n\t\t\t\tif z.err != nil {\n\t\t\t\t\tz.tt = ErrorToken\n\t\t\t\t} else {\n\t\t\t\t\tz.tt = EndTagToken\n\t\t\t\t}\n\t\t\t\treturn z.tt\n\t\t\t}\n\t\t\tz.raw.end--\n\t\t\tz.readUntilCloseAngle()\n\t\t\tz.tt = CommentToken\n\t\t\treturn z.tt\n\t\tcase CommentToken:\n\t\t\tif c == '!' {\n\t\t\t\tz.tt = z.readMarkupDeclaration()\n\t\t\t\treturn z.tt\n\t\t\t}\n\t\t\tz.raw.end--\n\t\t\tz.readUntilCloseAngle()\n\t\t\tz.tt = CommentToken\n\t\t\treturn z.tt\n\t\t}\n\t}\n\tif z.raw.start < z.raw.end {\n\t\tz.data.end = z.raw.end\n\t\tz.tt = TextToken\n\t\treturn z.tt\n\t}\n\tz.tt = ErrorToken\n\treturn z.tt\n}\n\n// Raw returns the unmodified text of the current token. Calling Next, Token,\n// Text, TagName or TagAttr may change the contents of the returned slice.\nfunc (z *Tokenizer) Raw() []byte {\n\treturn z.buf[z.raw.start:z.raw.end]\n}\n\n// convertNewlines converts \"\\r\" and \"\\r\\n\" in s to \"\\n\".\n// The conversion happens in place, but the resulting slice may be shorter.\nfunc convertNewlines(s []byte) []byte {\n\tfor i, c := range s {\n\t\tif c != '\\r' {\n\t\t\tcontinue\n\t\t}\n\n\t\tsrc := i + 1\n\t\tif src >= len(s) || s[src] != '\\n' {\n\t\t\ts[i] = '\\n'\n\t\t\tcontinue\n\t\t}\n\n\t\tdst := i\n\t\tfor src < len(s) {\n\t\t\tif s[src] == '\\r' {\n\t\t\t\tif src+1 < len(s) && s[src+1] == '\\n' {\n\t\t\t\t\tsrc++\n\t\t\t\t}\n\t\t\t\ts[dst] = '\\n'\n\t\t\t} else {\n\t\t\t\ts[dst] = s[src]\n\t\t\t}\n\t\t\tsrc++\n\t\t\tdst++\n\t\t}\n\t\treturn s[:dst]\n\t}\n\treturn s\n}\n\nvar (\n\tnul         = []byte(\"\\x00\")\n\treplacement = []byte(\"\\ufffd\")\n)\n\n// Text returns the unescaped text of a text, comment or doctype token. The\n// contents of the returned slice may change on the next call to Next.\nfunc (z *Tokenizer) Text() []byte {\n\tswitch z.tt {\n\tcase TextToken, CommentToken, DoctypeToken:\n\t\ts := z.buf[z.data.start:z.data.end]\n\t\tz.data.start = z.raw.end\n\t\tz.data.end = z.raw.end\n\t\ts = convertNewlines(s)\n\t\tif (z.convertNUL || z.tt == CommentToken) && bytes.Contains(s, nul) {\n\t\t\ts = bytes.Replace(s, nul, replacement, -1)\n\t\t}\n\t\tif !z.textIsRaw {\n\t\t\ts = unescape(s, false)\n\t\t}\n\t\treturn s\n\t}\n\treturn nil\n}\n\n// TagName returns the lower-cased name of a tag token (the `img` out of\n// `<IMG SRC=\"foo\">`) and whether the tag has attributes.\n// The contents of the returned slice may change on the next call to Next.\nfunc (z *Tokenizer) TagName() (name []byte, hasAttr bool) {\n\tif z.data.start < z.data.end {\n\t\tswitch z.tt {\n\t\tcase StartTagToken, EndTagToken, SelfClosingTagToken:\n\t\t\ts := z.buf[z.data.start:z.data.end]\n\t\t\tz.data.start = z.raw.end\n\t\t\tz.data.end = z.raw.end\n\t\t\treturn lower(s), z.nAttrReturned < len(z.attr)\n\t\t}\n\t}\n\treturn nil, false\n}\n\n// TagAttr returns the lower-cased key and unescaped value of the next unparsed\n// attribute for the current tag token and whether there are more attributes.\n// The contents of the returned slices may change on the next call to Next.\nfunc (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) {\n\tif z.nAttrReturned < len(z.attr) {\n\t\tswitch z.tt {\n\t\tcase StartTagToken, SelfClosingTagToken:\n\t\t\tx := z.attr[z.nAttrReturned]\n\t\t\tz.nAttrReturned++\n\t\t\tkey = z.buf[x[0].start:x[0].end]\n\t\t\tval = z.buf[x[1].start:x[1].end]\n\t\t\treturn lower(key), unescape(convertNewlines(val), true), z.nAttrReturned < len(z.attr)\n\t\t}\n\t}\n\treturn nil, nil, false\n}\n\n// Token returns the next Token. The result's Data and Attr values remain valid\n// after subsequent Next calls.\nfunc (z *Tokenizer) Token() Token {\n\tt := Token{Type: z.tt}\n\tswitch z.tt {\n\tcase TextToken, CommentToken, DoctypeToken:\n\t\tt.Data = string(z.Text())\n\tcase StartTagToken, SelfClosingTagToken, EndTagToken:\n\t\tname, moreAttr := z.TagName()\n\t\tfor moreAttr {\n\t\t\tvar key, val []byte\n\t\t\tkey, val, moreAttr = z.TagAttr()\n\t\t\tt.Attr = append(t.Attr, Attribute{\"\", atom.String(key), string(val)})\n\t\t}\n\t\tif a := atom.Lookup(name); a != 0 {\n\t\t\tt.DataAtom, t.Data = a, a.String()\n\t\t} else {\n\t\t\tt.DataAtom, t.Data = 0, string(name)\n\t\t}\n\t}\n\treturn t\n}\n\n// SetMaxBuf sets a limit on the amount of data buffered during tokenization.\n// A value of 0 means unlimited.\nfunc (z *Tokenizer) SetMaxBuf(n int) {\n\tz.maxBuf = n\n}\n\n// NewTokenizer returns a new HTML Tokenizer for the given Reader.\n// The input is assumed to be UTF-8 encoded.\nfunc NewTokenizer(r io.Reader) *Tokenizer {\n\treturn NewTokenizerFragment(r, \"\")\n}\n\n// NewTokenizerFragment returns a new HTML Tokenizer for the given Reader, for\n// tokenizing an existing element's InnerHTML fragment. contextTag is that\n// element's tag, such as \"div\" or \"iframe\".\n//\n// For example, how the InnerHTML \"a<b\" is tokenized depends on whether it is\n// for a <p> tag or a <script> tag.\n//\n// The input is assumed to be UTF-8 encoded.\nfunc NewTokenizerFragment(r io.Reader, contextTag string) *Tokenizer {\n\tz := &Tokenizer{\n\t\tr:   r,\n\t\tbuf: make([]byte, 0, 4096),\n\t}\n\tif contextTag != \"\" {\n\t\tswitch s := strings.ToLower(contextTag); s {\n\t\tcase \"iframe\", \"noembed\", \"noframes\", \"noscript\", \"plaintext\", \"script\", \"style\", \"title\", \"textarea\", \"xmp\":\n\t\t\tz.rawTag = s\n\t\t}\n\t}\n\treturn z\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/idna/idna.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package idna implements IDNA2008 using the compatibility processing\n// defined by UTS (Unicode Technical Standard) #46, which defines a standard to\n// deal with the transition from IDNA2003.\n//\n// IDNA2008 (Internationalized Domain Names for Applications), is defined in RFC\n// 5890, RFC 5891, RFC 5892, RFC 5893 and RFC 5894.\n// UTS #46 is defined in http://www.unicode.org/reports/tr46.\n// See http://unicode.org/cldr/utility/idna.jsp for a visualization of the\n// differences between these two standards.\npackage idna // import \"golang.org/x/net/idna\"\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/secure/bidirule\"\n\t\"golang.org/x/text/unicode/bidi\"\n\t\"golang.org/x/text/unicode/norm\"\n)\n\n// NOTE: Unlike common practice in Go APIs, the functions will return a\n// sanitized domain name in case of errors. Browsers sometimes use a partially\n// evaluated string as lookup.\n// TODO: the current error handling is, in my opinion, the least opinionated.\n// Other strategies are also viable, though:\n// Option 1) Return an empty string in case of error, but allow the user to\n//    specify explicitly which errors to ignore.\n// Option 2) Return the partially evaluated string if it is itself a valid\n//    string, otherwise return the empty string in case of error.\n// Option 3) Option 1 and 2.\n// Option 4) Always return an empty string for now and implement Option 1 as\n//    needed, and document that the return string may not be empty in case of\n//    error in the future.\n// I think Option 1 is best, but it is quite opinionated.\n\n// ToASCII is a wrapper for Punycode.ToASCII.\nfunc ToASCII(s string) (string, error) {\n\treturn Punycode.process(s, true)\n}\n\n// ToUnicode is a wrapper for Punycode.ToUnicode.\nfunc ToUnicode(s string) (string, error) {\n\treturn Punycode.process(s, false)\n}\n\n// An Option configures a Profile at creation time.\ntype Option func(*options)\n\n// Transitional sets a Profile to use the Transitional mapping as defined in UTS\n// #46. This will cause, for example, \"ß\" to be mapped to \"ss\". Using the\n// transitional mapping provides a compromise between IDNA2003 and IDNA2008\n// compatibility. It is used by most browsers when resolving domain names. This\n// option is only meaningful if combined with MapForLookup.\nfunc Transitional(transitional bool) Option {\n\treturn func(o *options) { o.transitional = true }\n}\n\n// VerifyDNSLength sets whether a Profile should fail if any of the IDN parts\n// are longer than allowed by the RFC.\nfunc VerifyDNSLength(verify bool) Option {\n\treturn func(o *options) { o.verifyDNSLength = verify }\n}\n\n// RemoveLeadingDots removes leading label separators. Leading runes that map to\n// dots, such as U+3002 IDEOGRAPHIC FULL STOP, are removed as well.\n//\n// This is the behavior suggested by the UTS #46 and is adopted by some\n// browsers.\nfunc RemoveLeadingDots(remove bool) Option {\n\treturn func(o *options) { o.removeLeadingDots = remove }\n}\n\n// ValidateLabels sets whether to check the mandatory label validation criteria\n// as defined in Section 5.4 of RFC 5891. This includes testing for correct use\n// of hyphens ('-'), normalization, validity of runes, and the context rules.\nfunc ValidateLabels(enable bool) Option {\n\treturn func(o *options) {\n\t\t// Don't override existing mappings, but set one that at least checks\n\t\t// normalization if it is not set.\n\t\tif o.mapping == nil && enable {\n\t\t\to.mapping = normalize\n\t\t}\n\t\to.trie = trie\n\t\to.validateLabels = enable\n\t\to.fromPuny = validateFromPunycode\n\t}\n}\n\n// StrictDomainName limits the set of permissible ASCII characters to those\n// allowed in domain names as defined in RFC 1034 (A-Z, a-z, 0-9 and the\n// hyphen). This is set by default for MapForLookup and ValidateForRegistration.\n//\n// This option is useful, for instance, for browsers that allow characters\n// outside this range, for example a '_' (U+005F LOW LINE). See\n// http://www.rfc-editor.org/std/std3.txt for more details This option\n// corresponds to the UseSTD3ASCIIRules option in UTS #46.\nfunc StrictDomainName(use bool) Option {\n\treturn func(o *options) {\n\t\to.trie = trie\n\t\to.useSTD3Rules = use\n\t\to.fromPuny = validateFromPunycode\n\t}\n}\n\n// NOTE: the following options pull in tables. The tables should not be linked\n// in as long as the options are not used.\n\n// BidiRule enables the Bidi rule as defined in RFC 5893. Any application\n// that relies on proper validation of labels should include this rule.\nfunc BidiRule() Option {\n\treturn func(o *options) { o.bidirule = bidirule.ValidString }\n}\n\n// ValidateForRegistration sets validation options to verify that a given IDN is\n// properly formatted for registration as defined by Section 4 of RFC 5891.\nfunc ValidateForRegistration() Option {\n\treturn func(o *options) {\n\t\to.mapping = validateRegistration\n\t\tStrictDomainName(true)(o)\n\t\tValidateLabels(true)(o)\n\t\tVerifyDNSLength(true)(o)\n\t\tBidiRule()(o)\n\t}\n}\n\n// MapForLookup sets validation and mapping options such that a given IDN is\n// transformed for domain name lookup according to the requirements set out in\n// Section 5 of RFC 5891. The mappings follow the recommendations of RFC 5894,\n// RFC 5895 and UTS 46. It does not add the Bidi Rule. Use the BidiRule option\n// to add this check.\n//\n// The mappings include normalization and mapping case, width and other\n// compatibility mappings.\nfunc MapForLookup() Option {\n\treturn func(o *options) {\n\t\to.mapping = validateAndMap\n\t\tStrictDomainName(true)(o)\n\t\tValidateLabels(true)(o)\n\t}\n}\n\ntype options struct {\n\ttransitional      bool\n\tuseSTD3Rules      bool\n\tvalidateLabels    bool\n\tverifyDNSLength   bool\n\tremoveLeadingDots bool\n\n\ttrie *idnaTrie\n\n\t// fromPuny calls validation rules when converting A-labels to U-labels.\n\tfromPuny func(p *Profile, s string) error\n\n\t// mapping implements a validation and mapping step as defined in RFC 5895\n\t// or UTS 46, tailored to, for example, domain registration or lookup.\n\tmapping func(p *Profile, s string) (mapped string, isBidi bool, err error)\n\n\t// bidirule, if specified, checks whether s conforms to the Bidi Rule\n\t// defined in RFC 5893.\n\tbidirule func(s string) bool\n}\n\n// A Profile defines the configuration of an IDNA mapper.\ntype Profile struct {\n\toptions\n}\n\nfunc apply(o *options, opts []Option) {\n\tfor _, f := range opts {\n\t\tf(o)\n\t}\n}\n\n// New creates a new Profile.\n//\n// With no options, the returned Profile is the most permissive and equals the\n// Punycode Profile. Options can be passed to further restrict the Profile. The\n// MapForLookup and ValidateForRegistration options set a collection of options,\n// for lookup and registration purposes respectively, which can be tailored by\n// adding more fine-grained options, where later options override earlier\n// options.\nfunc New(o ...Option) *Profile {\n\tp := &Profile{}\n\tapply(&p.options, o)\n\treturn p\n}\n\n// ToASCII converts a domain or domain label to its ASCII form. For example,\n// ToASCII(\"bücher.example.com\") is \"xn--bcher-kva.example.com\", and\n// ToASCII(\"golang\") is \"golang\". If an error is encountered it will return\n// an error and a (partially) processed result.\nfunc (p *Profile) ToASCII(s string) (string, error) {\n\treturn p.process(s, true)\n}\n\n// ToUnicode converts a domain or domain label to its Unicode form. For example,\n// ToUnicode(\"xn--bcher-kva.example.com\") is \"bücher.example.com\", and\n// ToUnicode(\"golang\") is \"golang\". If an error is encountered it will return\n// an error and a (partially) processed result.\nfunc (p *Profile) ToUnicode(s string) (string, error) {\n\tpp := *p\n\tpp.transitional = false\n\treturn pp.process(s, false)\n}\n\n// String reports a string with a description of the profile for debugging\n// purposes. The string format may change with different versions.\nfunc (p *Profile) String() string {\n\ts := \"\"\n\tif p.transitional {\n\t\ts = \"Transitional\"\n\t} else {\n\t\ts = \"NonTransitional\"\n\t}\n\tif p.useSTD3Rules {\n\t\ts += \":UseSTD3Rules\"\n\t}\n\tif p.validateLabels {\n\t\ts += \":ValidateLabels\"\n\t}\n\tif p.verifyDNSLength {\n\t\ts += \":VerifyDNSLength\"\n\t}\n\treturn s\n}\n\nvar (\n\t// Punycode is a Profile that does raw punycode processing with a minimum\n\t// of validation.\n\tPunycode *Profile = punycode\n\n\t// Lookup is the recommended profile for looking up domain names, according\n\t// to Section 5 of RFC 5891. The exact configuration of this profile may\n\t// change over time.\n\tLookup *Profile = lookup\n\n\t// Display is the recommended profile for displaying domain names.\n\t// The configuration of this profile may change over time.\n\tDisplay *Profile = display\n\n\t// Registration is the recommended profile for checking whether a given\n\t// IDN is valid for registration, according to Section 4 of RFC 5891.\n\tRegistration *Profile = registration\n\n\tpunycode = &Profile{}\n\tlookup   = &Profile{options{\n\t\ttransitional:   true,\n\t\tuseSTD3Rules:   true,\n\t\tvalidateLabels: true,\n\t\ttrie:           trie,\n\t\tfromPuny:       validateFromPunycode,\n\t\tmapping:        validateAndMap,\n\t\tbidirule:       bidirule.ValidString,\n\t}}\n\tdisplay = &Profile{options{\n\t\tuseSTD3Rules:   true,\n\t\tvalidateLabels: true,\n\t\ttrie:           trie,\n\t\tfromPuny:       validateFromPunycode,\n\t\tmapping:        validateAndMap,\n\t\tbidirule:       bidirule.ValidString,\n\t}}\n\tregistration = &Profile{options{\n\t\tuseSTD3Rules:    true,\n\t\tvalidateLabels:  true,\n\t\tverifyDNSLength: true,\n\t\ttrie:            trie,\n\t\tfromPuny:        validateFromPunycode,\n\t\tmapping:         validateRegistration,\n\t\tbidirule:        bidirule.ValidString,\n\t}}\n\n\t// TODO: profiles\n\t// Register: recommended for approving domain names: don't do any mappings\n\t// but rather reject on invalid input. Bundle or block deviation characters.\n)\n\ntype labelError struct{ label, code_ string }\n\nfunc (e labelError) code() string { return e.code_ }\nfunc (e labelError) Error() string {\n\treturn fmt.Sprintf(\"idna: invalid label %q\", e.label)\n}\n\ntype runeError rune\n\nfunc (e runeError) code() string { return \"P1\" }\nfunc (e runeError) Error() string {\n\treturn fmt.Sprintf(\"idna: disallowed rune %U\", e)\n}\n\n// process implements the algorithm described in section 4 of UTS #46,\n// see http://www.unicode.org/reports/tr46.\nfunc (p *Profile) process(s string, toASCII bool) (string, error) {\n\tvar err error\n\tvar isBidi bool\n\tif p.mapping != nil {\n\t\ts, isBidi, err = p.mapping(p, s)\n\t}\n\t// Remove leading empty labels.\n\tif p.removeLeadingDots {\n\t\tfor ; len(s) > 0 && s[0] == '.'; s = s[1:] {\n\t\t}\n\t}\n\t// TODO: allow for a quick check of the tables data.\n\t// It seems like we should only create this error on ToASCII, but the\n\t// UTS 46 conformance tests suggests we should always check this.\n\tif err == nil && p.verifyDNSLength && s == \"\" {\n\t\terr = &labelError{s, \"A4\"}\n\t}\n\tlabels := labelIter{orig: s}\n\tfor ; !labels.done(); labels.next() {\n\t\tlabel := labels.label()\n\t\tif label == \"\" {\n\t\t\t// Empty labels are not okay. The label iterator skips the last\n\t\t\t// label if it is empty.\n\t\t\tif err == nil && p.verifyDNSLength {\n\t\t\t\terr = &labelError{s, \"A4\"}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif strings.HasPrefix(label, acePrefix) {\n\t\t\tu, err2 := decode(label[len(acePrefix):])\n\t\t\tif err2 != nil {\n\t\t\t\tif err == nil {\n\t\t\t\t\terr = err2\n\t\t\t\t}\n\t\t\t\t// Spec says keep the old label.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tisBidi = isBidi || bidirule.DirectionString(u) != bidi.LeftToRight\n\t\t\tlabels.set(u)\n\t\t\tif err == nil && p.validateLabels {\n\t\t\t\terr = p.fromPuny(p, u)\n\t\t\t}\n\t\t\tif err == nil {\n\t\t\t\t// This should be called on NonTransitional, according to the\n\t\t\t\t// spec, but that currently does not have any effect. Use the\n\t\t\t\t// original profile to preserve options.\n\t\t\t\terr = p.validateLabel(u)\n\t\t\t}\n\t\t} else if err == nil {\n\t\t\terr = p.validateLabel(label)\n\t\t}\n\t}\n\tif isBidi && p.bidirule != nil && err == nil {\n\t\tfor labels.reset(); !labels.done(); labels.next() {\n\t\t\tif !p.bidirule(labels.label()) {\n\t\t\t\terr = &labelError{s, \"B\"}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif toASCII {\n\t\tfor labels.reset(); !labels.done(); labels.next() {\n\t\t\tlabel := labels.label()\n\t\t\tif !ascii(label) {\n\t\t\t\ta, err2 := encode(acePrefix, label)\n\t\t\t\tif err == nil {\n\t\t\t\t\terr = err2\n\t\t\t\t}\n\t\t\t\tlabel = a\n\t\t\t\tlabels.set(a)\n\t\t\t}\n\t\t\tn := len(label)\n\t\t\tif p.verifyDNSLength && err == nil && (n == 0 || n > 63) {\n\t\t\t\terr = &labelError{label, \"A4\"}\n\t\t\t}\n\t\t}\n\t}\n\ts = labels.result()\n\tif toASCII && p.verifyDNSLength && err == nil {\n\t\t// Compute the length of the domain name minus the root label and its dot.\n\t\tn := len(s)\n\t\tif n > 0 && s[n-1] == '.' {\n\t\t\tn--\n\t\t}\n\t\tif len(s) < 1 || n > 253 {\n\t\t\terr = &labelError{s, \"A4\"}\n\t\t}\n\t}\n\treturn s, err\n}\n\nfunc normalize(p *Profile, s string) (mapped string, isBidi bool, err error) {\n\t// TODO: consider first doing a quick check to see if any of these checks\n\t// need to be done. This will make it slower in the general case, but\n\t// faster in the common case.\n\tmapped = norm.NFC.String(s)\n\tisBidi = bidirule.DirectionString(mapped) == bidi.RightToLeft\n\treturn mapped, isBidi, nil\n}\n\nfunc validateRegistration(p *Profile, s string) (idem string, bidi bool, err error) {\n\t// TODO: filter need for normalization in loop below.\n\tif !norm.NFC.IsNormalString(s) {\n\t\treturn s, false, &labelError{s, \"V1\"}\n\t}\n\tfor i := 0; i < len(s); {\n\t\tv, sz := trie.lookupString(s[i:])\n\t\tif sz == 0 {\n\t\t\treturn s, bidi, runeError(utf8.RuneError)\n\t\t}\n\t\tbidi = bidi || info(v).isBidi(s[i:])\n\t\t// Copy bytes not copied so far.\n\t\tswitch p.simplify(info(v).category()) {\n\t\t// TODO: handle the NV8 defined in the Unicode idna data set to allow\n\t\t// for strict conformance to IDNA2008.\n\t\tcase valid, deviation:\n\t\tcase disallowed, mapped, unknown, ignored:\n\t\t\tr, _ := utf8.DecodeRuneInString(s[i:])\n\t\t\treturn s, bidi, runeError(r)\n\t\t}\n\t\ti += sz\n\t}\n\treturn s, bidi, nil\n}\n\nfunc (c info) isBidi(s string) bool {\n\tif !c.isMapped() {\n\t\treturn c&attributesMask == rtl\n\t}\n\t// TODO: also store bidi info for mapped data. This is possible, but a bit\n\t// cumbersome and not for the common case.\n\tp, _ := bidi.LookupString(s)\n\tswitch p.Class() {\n\tcase bidi.R, bidi.AL, bidi.AN:\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc validateAndMap(p *Profile, s string) (vm string, bidi bool, err error) {\n\tvar (\n\t\tb []byte\n\t\tk int\n\t)\n\t// combinedInfoBits contains the or-ed bits of all runes. We use this\n\t// to derive the mayNeedNorm bit later. This may trigger normalization\n\t// overeagerly, but it will not do so in the common case. The end result\n\t// is another 10% saving on BenchmarkProfile for the common case.\n\tvar combinedInfoBits info\n\tfor i := 0; i < len(s); {\n\t\tv, sz := trie.lookupString(s[i:])\n\t\tif sz == 0 {\n\t\t\tb = append(b, s[k:i]...)\n\t\t\tb = append(b, \"\\ufffd\"...)\n\t\t\tk = len(s)\n\t\t\tif err == nil {\n\t\t\t\terr = runeError(utf8.RuneError)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tcombinedInfoBits |= info(v)\n\t\tbidi = bidi || info(v).isBidi(s[i:])\n\t\tstart := i\n\t\ti += sz\n\t\t// Copy bytes not copied so far.\n\t\tswitch p.simplify(info(v).category()) {\n\t\tcase valid:\n\t\t\tcontinue\n\t\tcase disallowed:\n\t\t\tif err == nil {\n\t\t\t\tr, _ := utf8.DecodeRuneInString(s[start:])\n\t\t\t\terr = runeError(r)\n\t\t\t}\n\t\t\tcontinue\n\t\tcase mapped, deviation:\n\t\t\tb = append(b, s[k:start]...)\n\t\t\tb = info(v).appendMapping(b, s[start:i])\n\t\tcase ignored:\n\t\t\tb = append(b, s[k:start]...)\n\t\t\t// drop the rune\n\t\tcase unknown:\n\t\t\tb = append(b, s[k:start]...)\n\t\t\tb = append(b, \"\\ufffd\"...)\n\t\t}\n\t\tk = i\n\t}\n\tif k == 0 {\n\t\t// No changes so far.\n\t\tif combinedInfoBits&mayNeedNorm != 0 {\n\t\t\ts = norm.NFC.String(s)\n\t\t}\n\t} else {\n\t\tb = append(b, s[k:]...)\n\t\tif norm.NFC.QuickSpan(b) != len(b) {\n\t\t\tb = norm.NFC.Bytes(b)\n\t\t}\n\t\t// TODO: the punycode converters require strings as input.\n\t\ts = string(b)\n\t}\n\treturn s, bidi, err\n}\n\n// A labelIter allows iterating over domain name labels.\ntype labelIter struct {\n\torig     string\n\tslice    []string\n\tcurStart int\n\tcurEnd   int\n\ti        int\n}\n\nfunc (l *labelIter) reset() {\n\tl.curStart = 0\n\tl.curEnd = 0\n\tl.i = 0\n}\n\nfunc (l *labelIter) done() bool {\n\treturn l.curStart >= len(l.orig)\n}\n\nfunc (l *labelIter) result() string {\n\tif l.slice != nil {\n\t\treturn strings.Join(l.slice, \".\")\n\t}\n\treturn l.orig\n}\n\nfunc (l *labelIter) label() string {\n\tif l.slice != nil {\n\t\treturn l.slice[l.i]\n\t}\n\tp := strings.IndexByte(l.orig[l.curStart:], '.')\n\tl.curEnd = l.curStart + p\n\tif p == -1 {\n\t\tl.curEnd = len(l.orig)\n\t}\n\treturn l.orig[l.curStart:l.curEnd]\n}\n\n// next sets the value to the next label. It skips the last label if it is empty.\nfunc (l *labelIter) next() {\n\tl.i++\n\tif l.slice != nil {\n\t\tif l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == \"\" {\n\t\t\tl.curStart = len(l.orig)\n\t\t}\n\t} else {\n\t\tl.curStart = l.curEnd + 1\n\t\tif l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' {\n\t\t\tl.curStart = len(l.orig)\n\t\t}\n\t}\n}\n\nfunc (l *labelIter) set(s string) {\n\tif l.slice == nil {\n\t\tl.slice = strings.Split(l.orig, \".\")\n\t}\n\tl.slice[l.i] = s\n}\n\n// acePrefix is the ASCII Compatible Encoding prefix.\nconst acePrefix = \"xn--\"\n\nfunc (p *Profile) simplify(cat category) category {\n\tswitch cat {\n\tcase disallowedSTD3Mapped:\n\t\tif p.useSTD3Rules {\n\t\t\tcat = disallowed\n\t\t} else {\n\t\t\tcat = mapped\n\t\t}\n\tcase disallowedSTD3Valid:\n\t\tif p.useSTD3Rules {\n\t\t\tcat = disallowed\n\t\t} else {\n\t\t\tcat = valid\n\t\t}\n\tcase deviation:\n\t\tif !p.transitional {\n\t\t\tcat = valid\n\t\t}\n\tcase validNV8, validXV8:\n\t\t// TODO: handle V2008\n\t\tcat = valid\n\t}\n\treturn cat\n}\n\nfunc validateFromPunycode(p *Profile, s string) error {\n\tif !norm.NFC.IsNormalString(s) {\n\t\treturn &labelError{s, \"V1\"}\n\t}\n\t// TODO: detect whether string may have to be normalized in the following\n\t// loop.\n\tfor i := 0; i < len(s); {\n\t\tv, sz := trie.lookupString(s[i:])\n\t\tif sz == 0 {\n\t\t\treturn runeError(utf8.RuneError)\n\t\t}\n\t\tif c := p.simplify(info(v).category()); c != valid && c != deviation {\n\t\t\treturn &labelError{s, \"V6\"}\n\t\t}\n\t\ti += sz\n\t}\n\treturn nil\n}\n\nconst (\n\tzwnj = \"\\u200c\"\n\tzwj  = \"\\u200d\"\n)\n\ntype joinState int8\n\nconst (\n\tstateStart joinState = iota\n\tstateVirama\n\tstateBefore\n\tstateBeforeVirama\n\tstateAfter\n\tstateFAIL\n)\n\nvar joinStates = [][numJoinTypes]joinState{\n\tstateStart: {\n\t\tjoiningL:   stateBefore,\n\t\tjoiningD:   stateBefore,\n\t\tjoinZWNJ:   stateFAIL,\n\t\tjoinZWJ:    stateFAIL,\n\t\tjoinVirama: stateVirama,\n\t},\n\tstateVirama: {\n\t\tjoiningL: stateBefore,\n\t\tjoiningD: stateBefore,\n\t},\n\tstateBefore: {\n\t\tjoiningL:   stateBefore,\n\t\tjoiningD:   stateBefore,\n\t\tjoiningT:   stateBefore,\n\t\tjoinZWNJ:   stateAfter,\n\t\tjoinZWJ:    stateFAIL,\n\t\tjoinVirama: stateBeforeVirama,\n\t},\n\tstateBeforeVirama: {\n\t\tjoiningL: stateBefore,\n\t\tjoiningD: stateBefore,\n\t\tjoiningT: stateBefore,\n\t},\n\tstateAfter: {\n\t\tjoiningL:   stateFAIL,\n\t\tjoiningD:   stateBefore,\n\t\tjoiningT:   stateAfter,\n\t\tjoiningR:   stateStart,\n\t\tjoinZWNJ:   stateFAIL,\n\t\tjoinZWJ:    stateFAIL,\n\t\tjoinVirama: stateAfter, // no-op as we can't accept joiners here\n\t},\n\tstateFAIL: {\n\t\t0:          stateFAIL,\n\t\tjoiningL:   stateFAIL,\n\t\tjoiningD:   stateFAIL,\n\t\tjoiningT:   stateFAIL,\n\t\tjoiningR:   stateFAIL,\n\t\tjoinZWNJ:   stateFAIL,\n\t\tjoinZWJ:    stateFAIL,\n\t\tjoinVirama: stateFAIL,\n\t},\n}\n\n// validateLabel validates the criteria from Section 4.1. Item 1, 4, and 6 are\n// already implicitly satisfied by the overall implementation.\nfunc (p *Profile) validateLabel(s string) (err error) {\n\tif s == \"\" {\n\t\tif p.verifyDNSLength {\n\t\t\treturn &labelError{s, \"A4\"}\n\t\t}\n\t\treturn nil\n\t}\n\tif !p.validateLabels {\n\t\treturn nil\n\t}\n\ttrie := p.trie // p.validateLabels is only set if trie is set.\n\tif len(s) > 4 && s[2] == '-' && s[3] == '-' {\n\t\treturn &labelError{s, \"V2\"}\n\t}\n\tif s[0] == '-' || s[len(s)-1] == '-' {\n\t\treturn &labelError{s, \"V3\"}\n\t}\n\t// TODO: merge the use of this in the trie.\n\tv, sz := trie.lookupString(s)\n\tx := info(v)\n\tif x.isModifier() {\n\t\treturn &labelError{s, \"V5\"}\n\t}\n\t// Quickly return in the absence of zero-width (non) joiners.\n\tif strings.Index(s, zwj) == -1 && strings.Index(s, zwnj) == -1 {\n\t\treturn nil\n\t}\n\tst := stateStart\n\tfor i := 0; ; {\n\t\tjt := x.joinType()\n\t\tif s[i:i+sz] == zwj {\n\t\t\tjt = joinZWJ\n\t\t} else if s[i:i+sz] == zwnj {\n\t\t\tjt = joinZWNJ\n\t\t}\n\t\tst = joinStates[st][jt]\n\t\tif x.isViramaModifier() {\n\t\t\tst = joinStates[st][joinVirama]\n\t\t}\n\t\tif i += sz; i == len(s) {\n\t\t\tbreak\n\t\t}\n\t\tv, sz = trie.lookupString(s[i:])\n\t\tx = info(v)\n\t}\n\tif st == stateFAIL || st == stateAfter {\n\t\treturn &labelError{s, \"C\"}\n\t}\n\treturn nil\n}\n\nfunc ascii(s string) bool {\n\tfor i := 0; i < len(s); i++ {\n\t\tif s[i] >= utf8.RuneSelf {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/idna/punycode.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage idna\n\n// This file implements the Punycode algorithm from RFC 3492.\n\nimport (\n\t\"math\"\n\t\"strings\"\n\t\"unicode/utf8\"\n)\n\n// These parameter values are specified in section 5.\n//\n// All computation is done with int32s, so that overflow behavior is identical\n// regardless of whether int is 32-bit or 64-bit.\nconst (\n\tbase        int32 = 36\n\tdamp        int32 = 700\n\tinitialBias int32 = 72\n\tinitialN    int32 = 128\n\tskew        int32 = 38\n\ttmax        int32 = 26\n\ttmin        int32 = 1\n)\n\nfunc punyError(s string) error { return &labelError{s, \"A3\"} }\n\n// decode decodes a string as specified in section 6.2.\nfunc decode(encoded string) (string, error) {\n\tif encoded == \"\" {\n\t\treturn \"\", nil\n\t}\n\tpos := 1 + strings.LastIndex(encoded, \"-\")\n\tif pos == 1 {\n\t\treturn \"\", punyError(encoded)\n\t}\n\tif pos == len(encoded) {\n\t\treturn encoded[:len(encoded)-1], nil\n\t}\n\toutput := make([]rune, 0, len(encoded))\n\tif pos != 0 {\n\t\tfor _, r := range encoded[:pos-1] {\n\t\t\toutput = append(output, r)\n\t\t}\n\t}\n\ti, n, bias := int32(0), initialN, initialBias\n\tfor pos < len(encoded) {\n\t\toldI, w := i, int32(1)\n\t\tfor k := base; ; k += base {\n\t\t\tif pos == len(encoded) {\n\t\t\t\treturn \"\", punyError(encoded)\n\t\t\t}\n\t\t\tdigit, ok := decodeDigit(encoded[pos])\n\t\t\tif !ok {\n\t\t\t\treturn \"\", punyError(encoded)\n\t\t\t}\n\t\t\tpos++\n\t\t\ti += digit * w\n\t\t\tif i < 0 {\n\t\t\t\treturn \"\", punyError(encoded)\n\t\t\t}\n\t\t\tt := k - bias\n\t\t\tif t < tmin {\n\t\t\t\tt = tmin\n\t\t\t} else if t > tmax {\n\t\t\t\tt = tmax\n\t\t\t}\n\t\t\tif digit < t {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tw *= base - t\n\t\t\tif w >= math.MaxInt32/base {\n\t\t\t\treturn \"\", punyError(encoded)\n\t\t\t}\n\t\t}\n\t\tx := int32(len(output) + 1)\n\t\tbias = adapt(i-oldI, x, oldI == 0)\n\t\tn += i / x\n\t\ti %= x\n\t\tif n > utf8.MaxRune || len(output) >= 1024 {\n\t\t\treturn \"\", punyError(encoded)\n\t\t}\n\t\toutput = append(output, 0)\n\t\tcopy(output[i+1:], output[i:])\n\t\toutput[i] = n\n\t\ti++\n\t}\n\treturn string(output), nil\n}\n\n// encode encodes a string as specified in section 6.3 and prepends prefix to\n// the result.\n//\n// The \"while h < length(input)\" line in the specification becomes \"for\n// remaining != 0\" in the Go code, because len(s) in Go is in bytes, not runes.\nfunc encode(prefix, s string) (string, error) {\n\toutput := make([]byte, len(prefix), len(prefix)+1+2*len(s))\n\tcopy(output, prefix)\n\tdelta, n, bias := int32(0), initialN, initialBias\n\tb, remaining := int32(0), int32(0)\n\tfor _, r := range s {\n\t\tif r < 0x80 {\n\t\t\tb++\n\t\t\toutput = append(output, byte(r))\n\t\t} else {\n\t\t\tremaining++\n\t\t}\n\t}\n\th := b\n\tif b > 0 {\n\t\toutput = append(output, '-')\n\t}\n\tfor remaining != 0 {\n\t\tm := int32(0x7fffffff)\n\t\tfor _, r := range s {\n\t\t\tif m > r && r >= n {\n\t\t\t\tm = r\n\t\t\t}\n\t\t}\n\t\tdelta += (m - n) * (h + 1)\n\t\tif delta < 0 {\n\t\t\treturn \"\", punyError(s)\n\t\t}\n\t\tn = m\n\t\tfor _, r := range s {\n\t\t\tif r < n {\n\t\t\t\tdelta++\n\t\t\t\tif delta < 0 {\n\t\t\t\t\treturn \"\", punyError(s)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif r > n {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tq := delta\n\t\t\tfor k := base; ; k += base {\n\t\t\t\tt := k - bias\n\t\t\t\tif t < tmin {\n\t\t\t\t\tt = tmin\n\t\t\t\t} else if t > tmax {\n\t\t\t\t\tt = tmax\n\t\t\t\t}\n\t\t\t\tif q < t {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\toutput = append(output, encodeDigit(t+(q-t)%(base-t)))\n\t\t\t\tq = (q - t) / (base - t)\n\t\t\t}\n\t\t\toutput = append(output, encodeDigit(q))\n\t\t\tbias = adapt(delta, h+1, h == b)\n\t\t\tdelta = 0\n\t\t\th++\n\t\t\tremaining--\n\t\t}\n\t\tdelta++\n\t\tn++\n\t}\n\treturn string(output), nil\n}\n\nfunc decodeDigit(x byte) (digit int32, ok bool) {\n\tswitch {\n\tcase '0' <= x && x <= '9':\n\t\treturn int32(x - ('0' - 26)), true\n\tcase 'A' <= x && x <= 'Z':\n\t\treturn int32(x - 'A'), true\n\tcase 'a' <= x && x <= 'z':\n\t\treturn int32(x - 'a'), true\n\t}\n\treturn 0, false\n}\n\nfunc encodeDigit(digit int32) byte {\n\tswitch {\n\tcase 0 <= digit && digit < 26:\n\t\treturn byte(digit + 'a')\n\tcase 26 <= digit && digit < 36:\n\t\treturn byte(digit + ('0' - 26))\n\t}\n\tpanic(\"idna: internal error in punycode encoding\")\n}\n\n// adapt is the bias adaptation function specified in section 6.1.\nfunc adapt(delta, numPoints int32, firstTime bool) int32 {\n\tif firstTime {\n\t\tdelta /= damp\n\t} else {\n\t\tdelta /= 2\n\t}\n\tdelta += delta / numPoints\n\tk := int32(0)\n\tfor delta > ((base-tmin)*tmax)/2 {\n\t\tdelta /= base - tmin\n\t\tk += base\n\t}\n\treturn k + (base-tmin+1)*delta/(delta+skew)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/idna/tables.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\npackage idna\n\n// UnicodeVersion is the Unicode version from which the tables in this package are derived.\nconst UnicodeVersion = \"10.0.0\"\n\nvar mappings string = \"\" + // Size: 8176 bytes\n\t\"\\x00\\x01 \\x03 ̈\\x01a\\x03 ̄\\x012\\x013\\x03 ́\\x03 ̧\\x011\\x01o\\x051⁄4\\x051⁄2\" +\n\t\"\\x053⁄4\\x03i̇\\x03l·\\x03ʼn\\x01s\\x03dž\\x03ⱥ\\x03ⱦ\\x01h\\x01j\\x01r\\x01w\\x01y\" +\n\t\"\\x03 ̆\\x03 ̇\\x03 ̊\\x03 ̨\\x03 ̃\\x03 ̋\\x01l\\x01x\\x04̈́\\x03 ι\\x01;\\x05 ̈́\" +\n\t\"\\x04եւ\\x04اٴ\\x04وٴ\\x04ۇٴ\\x04يٴ\\x06क़\\x06ख़\\x06ग़\\x06ज़\\x06ड़\\x06ढ़\\x06फ़\" +\n\t\"\\x06य़\\x06ড়\\x06ঢ়\\x06য়\\x06ਲ਼\\x06ਸ਼\\x06ਖ਼\\x06ਗ਼\\x06ਜ਼\\x06ਫ਼\\x06ଡ଼\\x06ଢ଼\" +\n\t\"\\x06ํา\\x06ໍາ\\x06ຫນ\\x06ຫມ\\x06གྷ\\x06ཌྷ\\x06དྷ\\x06བྷ\\x06ཛྷ\\x06ཀྵ\\x06ཱི\\x06ཱུ\" +\n\t\"\\x06ྲྀ\\x09ྲཱྀ\\x06ླྀ\\x09ླཱྀ\\x06ཱྀ\\x06ྒྷ\\x06ྜྷ\\x06ྡྷ\\x06ྦྷ\\x06ྫྷ\\x06ྐྵ\\x02\" +\n\t\"в\\x02д\\x02о\\x02с\\x02т\\x02ъ\\x02ѣ\\x02æ\\x01b\\x01d\\x01e\\x02ǝ\\x01g\\x01i\\x01k\" +\n\t\"\\x01m\\x01n\\x02ȣ\\x01p\\x01t\\x01u\\x02ɐ\\x02ɑ\\x02ə\\x02ɛ\\x02ɜ\\x02ŋ\\x02ɔ\\x02ɯ\" +\n\t\"\\x01v\\x02β\\x02γ\\x02δ\\x02φ\\x02χ\\x02ρ\\x02н\\x02ɒ\\x01c\\x02ɕ\\x02ð\\x01f\\x02ɟ\" +\n\t\"\\x02ɡ\\x02ɥ\\x02ɨ\\x02ɩ\\x02ɪ\\x02ʝ\\x02ɭ\\x02ʟ\\x02ɱ\\x02ɰ\\x02ɲ\\x02ɳ\\x02ɴ\\x02ɵ\" +\n\t\"\\x02ɸ\\x02ʂ\\x02ʃ\\x02ƫ\\x02ʉ\\x02ʊ\\x02ʋ\\x02ʌ\\x01z\\x02ʐ\\x02ʑ\\x02ʒ\\x02θ\\x02ss\" +\n\t\"\\x02ά\\x02έ\\x02ή\\x02ί\\x02ό\\x02ύ\\x02ώ\\x05ἀι\\x05ἁι\\x05ἂι\\x05ἃι\\x05ἄι\\x05ἅι\" +\n\t\"\\x05ἆι\\x05ἇι\\x05ἠι\\x05ἡι\\x05ἢι\\x05ἣι\\x05ἤι\\x05ἥι\\x05ἦι\\x05ἧι\\x05ὠι\\x05ὡι\" +\n\t\"\\x05ὢι\\x05ὣι\\x05ὤι\\x05ὥι\\x05ὦι\\x05ὧι\\x05ὰι\\x04αι\\x04άι\\x05ᾶι\\x02ι\\x05 ̈͂\" +\n\t\"\\x05ὴι\\x04ηι\\x04ήι\\x05ῆι\\x05 ̓̀\\x05 ̓́\\x05 ̓͂\\x02ΐ\\x05 ̔̀\\x05 ̔́\\x05 ̔͂\" +\n\t\"\\x02ΰ\\x05 ̈̀\\x01`\\x05ὼι\\x04ωι\\x04ώι\\x05ῶι\\x06′′\\x09′′′\\x06‵‵\\x09‵‵‵\\x02!\" +\n\t\"!\\x02??\\x02?!\\x02!?\\x0c′′′′\\x010\\x014\\x015\\x016\\x017\\x018\\x019\\x01+\\x01=\" +\n\t\"\\x01(\\x01)\\x02rs\\x02ħ\\x02no\\x01q\\x02sm\\x02tm\\x02ω\\x02å\\x02א\\x02ב\\x02ג\" +\n\t\"\\x02ד\\x02π\\x051⁄7\\x051⁄9\\x061⁄10\\x051⁄3\\x052⁄3\\x051⁄5\\x052⁄5\\x053⁄5\\x054\" +\n\t\"⁄5\\x051⁄6\\x055⁄6\\x051⁄8\\x053⁄8\\x055⁄8\\x057⁄8\\x041⁄\\x02ii\\x02iv\\x02vi\" +\n\t\"\\x04viii\\x02ix\\x02xi\\x050⁄3\\x06∫∫\\x09∫∫∫\\x06∮∮\\x09∮∮∮\\x0210\\x0211\\x0212\" +\n\t\"\\x0213\\x0214\\x0215\\x0216\\x0217\\x0218\\x0219\\x0220\\x04(10)\\x04(11)\\x04(12)\" +\n\t\"\\x04(13)\\x04(14)\\x04(15)\\x04(16)\\x04(17)\\x04(18)\\x04(19)\\x04(20)\\x0c∫∫∫∫\" +\n\t\"\\x02==\\x05⫝̸\\x02ɫ\\x02ɽ\\x02ȿ\\x02ɀ\\x01.\\x04 ゙\\x04 ゚\\x06より\\x06コト\\x05(ᄀ)\\x05\" +\n\t\"(ᄂ)\\x05(ᄃ)\\x05(ᄅ)\\x05(ᄆ)\\x05(ᄇ)\\x05(ᄉ)\\x05(ᄋ)\\x05(ᄌ)\\x05(ᄎ)\\x05(ᄏ)\\x05(ᄐ\" +\n\t\")\\x05(ᄑ)\\x05(ᄒ)\\x05(가)\\x05(나)\\x05(다)\\x05(라)\\x05(마)\\x05(바)\\x05(사)\\x05(아)\" +\n\t\"\\x05(자)\\x05(차)\\x05(카)\\x05(타)\\x05(파)\\x05(하)\\x05(주)\\x08(오전)\\x08(오후)\\x05(一)\" +\n\t\"\\x05(二)\\x05(三)\\x05(四)\\x05(五)\\x05(六)\\x05(七)\\x05(八)\\x05(九)\\x05(十)\\x05(月)\" +\n\t\"\\x05(火)\\x05(水)\\x05(木)\\x05(金)\\x05(土)\\x05(日)\\x05(株)\\x05(有)\\x05(社)\\x05(名)\" +\n\t\"\\x05(特)\\x05(財)\\x05(祝)\\x05(労)\\x05(代)\\x05(呼)\\x05(学)\\x05(監)\\x05(企)\\x05(資)\" +\n\t\"\\x05(協)\\x05(祭)\\x05(休)\\x05(自)\\x05(至)\\x0221\\x0222\\x0223\\x0224\\x0225\\x0226\" +\n\t\"\\x0227\\x0228\\x0229\\x0230\\x0231\\x0232\\x0233\\x0234\\x0235\\x06참고\\x06주의\\x0236\" +\n\t\"\\x0237\\x0238\\x0239\\x0240\\x0241\\x0242\\x0243\\x0244\\x0245\\x0246\\x0247\\x0248\" +\n\t\"\\x0249\\x0250\\x041月\\x042月\\x043月\\x044月\\x045月\\x046月\\x047月\\x048月\\x049月\\x0510\" +\n\t\"月\\x0511月\\x0512月\\x02hg\\x02ev\\x0cアパート\\x0cアルファ\\x0cアンペア\\x09アール\\x0cイニング\\x09\" +\n\t\"インチ\\x09ウォン\\x0fエスクード\\x0cエーカー\\x09オンス\\x09オーム\\x09カイリ\\x0cカラット\\x0cカロリー\\x09ガロ\" +\n\t\"ン\\x09ガンマ\\x06ギガ\\x09ギニー\\x0cキュリー\\x0cギルダー\\x06キロ\\x0fキログラム\\x12キロメートル\\x0fキロワッ\" +\n\t\"ト\\x09グラム\\x0fグラムトン\\x0fクルゼイロ\\x0cクローネ\\x09ケース\\x09コルナ\\x09コーポ\\x0cサイクル\\x0fサンチ\" +\n\t\"ーム\\x0cシリング\\x09センチ\\x09セント\\x09ダース\\x06デシ\\x06ドル\\x06トン\\x06ナノ\\x09ノット\\x09ハイツ\" +\n\t\"\\x0fパーセント\\x09パーツ\\x0cバーレル\\x0fピアストル\\x09ピクル\\x06ピコ\\x06ビル\\x0fファラッド\\x0cフィート\" +\n\t\"\\x0fブッシェル\\x09フラン\\x0fヘクタール\\x06ペソ\\x09ペニヒ\\x09ヘルツ\\x09ペンス\\x09ページ\\x09ベータ\\x0cポイ\" +\n\t\"ント\\x09ボルト\\x06ホン\\x09ポンド\\x09ホール\\x09ホーン\\x0cマイクロ\\x09マイル\\x09マッハ\\x09マルク\\x0fマ\" +\n\t\"ンション\\x0cミクロン\\x06ミリ\\x0fミリバール\\x06メガ\\x0cメガトン\\x0cメートル\\x09ヤード\\x09ヤール\\x09ユアン\" +\n\t\"\\x0cリットル\\x06リラ\\x09ルピー\\x0cルーブル\\x06レム\\x0fレントゲン\\x09ワット\\x040点\\x041点\\x042点\" +\n\t\"\\x043点\\x044点\\x045点\\x046点\\x047点\\x048点\\x049点\\x0510点\\x0511点\\x0512点\\x0513点\" +\n\t\"\\x0514点\\x0515点\\x0516点\\x0517点\\x0518点\\x0519点\\x0520点\\x0521点\\x0522点\\x0523点\" +\n\t\"\\x0524点\\x02da\\x02au\\x02ov\\x02pc\\x02dm\\x02iu\\x06平成\\x06昭和\\x06大正\\x06明治\\x0c株\" +\n\t\"式会社\\x02pa\\x02na\\x02ma\\x02ka\\x02kb\\x02mb\\x02gb\\x04kcal\\x02pf\\x02nf\\x02m\" +\n\t\"g\\x02kg\\x02hz\\x02ml\\x02dl\\x02kl\\x02fm\\x02nm\\x02mm\\x02cm\\x02km\\x02m2\\x02m\" +\n\t\"3\\x05m∕s\\x06m∕s2\\x07rad∕s\\x08rad∕s2\\x02ps\\x02ns\\x02ms\\x02pv\\x02nv\\x02mv\" +\n\t\"\\x02kv\\x02pw\\x02nw\\x02mw\\x02kw\\x02bq\\x02cc\\x02cd\\x06c∕kg\\x02db\\x02gy\\x02\" +\n\t\"ha\\x02hp\\x02in\\x02kk\\x02kt\\x02lm\\x02ln\\x02lx\\x02ph\\x02pr\\x02sr\\x02sv\\x02\" +\n\t\"wb\\x05v∕m\\x05a∕m\\x041日\\x042日\\x043日\\x044日\\x045日\\x046日\\x047日\\x048日\\x049日\" +\n\t\"\\x0510日\\x0511日\\x0512日\\x0513日\\x0514日\\x0515日\\x0516日\\x0517日\\x0518日\\x0519日\" +\n\t\"\\x0520日\\x0521日\\x0522日\\x0523日\\x0524日\\x0525日\\x0526日\\x0527日\\x0528日\\x0529日\" +\n\t\"\\x0530日\\x0531日\\x02ь\\x02ɦ\\x02ɬ\\x02ʞ\\x02ʇ\\x02œ\\x04𤋮\\x04𢡊\\x04𢡄\\x04𣏕\\x04𥉉\" +\n\t\"\\x04𥳐\\x04𧻓\\x02ff\\x02fi\\x02fl\\x02st\\x04մն\\x04մե\\x04մի\\x04վն\\x04մխ\\x04יִ\" +\n\t\"\\x04ײַ\\x02ע\\x02ה\\x02כ\\x02ל\\x02ם\\x02ר\\x02ת\\x04שׁ\\x04שׂ\\x06שּׁ\\x06שּׂ\\x04א\" +\n\t\"ַ\\x04אָ\\x04אּ\\x04בּ\\x04גּ\\x04דּ\\x04הּ\\x04וּ\\x04זּ\\x04טּ\\x04יּ\\x04ךּ\\x04\" +\n\t\"כּ\\x04לּ\\x04מּ\\x04נּ\\x04סּ\\x04ףּ\\x04פּ\\x04צּ\\x04קּ\\x04רּ\\x04שּ\\x04תּ\" +\n\t\"\\x04וֹ\\x04בֿ\\x04כֿ\\x04פֿ\\x04אל\\x02ٱ\\x02ٻ\\x02پ\\x02ڀ\\x02ٺ\\x02ٿ\\x02ٹ\\x02ڤ\" +\n\t\"\\x02ڦ\\x02ڄ\\x02ڃ\\x02چ\\x02ڇ\\x02ڍ\\x02ڌ\\x02ڎ\\x02ڈ\\x02ژ\\x02ڑ\\x02ک\\x02گ\\x02ڳ\" +\n\t\"\\x02ڱ\\x02ں\\x02ڻ\\x02ۀ\\x02ہ\\x02ھ\\x02ے\\x02ۓ\\x02ڭ\\x02ۇ\\x02ۆ\\x02ۈ\\x02ۋ\\x02ۅ\" +\n\t\"\\x02ۉ\\x02ې\\x02ى\\x04ئا\\x04ئە\\x04ئو\\x04ئۇ\\x04ئۆ\\x04ئۈ\\x04ئې\\x04ئى\\x02ی\\x04\" +\n\t\"ئج\\x04ئح\\x04ئم\\x04ئي\\x04بج\\x04بح\\x04بخ\\x04بم\\x04بى\\x04بي\\x04تج\\x04تح\" +\n\t\"\\x04تخ\\x04تم\\x04تى\\x04تي\\x04ثج\\x04ثم\\x04ثى\\x04ثي\\x04جح\\x04جم\\x04حج\\x04حم\" +\n\t\"\\x04خج\\x04خح\\x04خم\\x04سج\\x04سح\\x04سخ\\x04سم\\x04صح\\x04صم\\x04ضج\\x04ضح\\x04ضخ\" +\n\t\"\\x04ضم\\x04طح\\x04طم\\x04ظم\\x04عج\\x04عم\\x04غج\\x04غم\\x04فج\\x04فح\\x04فخ\\x04فم\" +\n\t\"\\x04فى\\x04في\\x04قح\\x04قم\\x04قى\\x04قي\\x04كا\\x04كج\\x04كح\\x04كخ\\x04كل\\x04كم\" +\n\t\"\\x04كى\\x04كي\\x04لج\\x04لح\\x04لخ\\x04لم\\x04لى\\x04لي\\x04مج\\x04مح\\x04مخ\\x04مم\" +\n\t\"\\x04مى\\x04مي\\x04نج\\x04نح\\x04نخ\\x04نم\\x04نى\\x04ني\\x04هج\\x04هم\\x04هى\\x04هي\" +\n\t\"\\x04يج\\x04يح\\x04يخ\\x04يم\\x04يى\\x04يي\\x04ذٰ\\x04رٰ\\x04ىٰ\\x05 ٌّ\\x05 ٍّ\\x05\" +\n\t\" َّ\\x05 ُّ\\x05 ِّ\\x05 ّٰ\\x04ئر\\x04ئز\\x04ئن\\x04بر\\x04بز\\x04بن\\x04تر\\x04تز\" +\n\t\"\\x04تن\\x04ثر\\x04ثز\\x04ثن\\x04ما\\x04نر\\x04نز\\x04نن\\x04ير\\x04يز\\x04ين\\x04ئخ\" +\n\t\"\\x04ئه\\x04به\\x04ته\\x04صخ\\x04له\\x04نه\\x04هٰ\\x04يه\\x04ثه\\x04سه\\x04شم\\x04شه\" +\n\t\"\\x06ـَّ\\x06ـُّ\\x06ـِّ\\x04طى\\x04طي\\x04عى\\x04عي\\x04غى\\x04غي\\x04سى\\x04سي\" +\n\t\"\\x04شى\\x04شي\\x04حى\\x04حي\\x04جى\\x04جي\\x04خى\\x04خي\\x04صى\\x04صي\\x04ضى\\x04ضي\" +\n\t\"\\x04شج\\x04شح\\x04شخ\\x04شر\\x04سر\\x04صر\\x04ضر\\x04اً\\x06تجم\\x06تحج\\x06تحم\" +\n\t\"\\x06تخم\\x06تمج\\x06تمح\\x06تمخ\\x06جمح\\x06حمي\\x06حمى\\x06سحج\\x06سجح\\x06سجى\" +\n\t\"\\x06سمح\\x06سمج\\x06سمم\\x06صحح\\x06صمم\\x06شحم\\x06شجي\\x06شمخ\\x06شمم\\x06ضحى\" +\n\t\"\\x06ضخم\\x06طمح\\x06طمم\\x06طمي\\x06عجم\\x06عمم\\x06عمى\\x06غمم\\x06غمي\\x06غمى\" +\n\t\"\\x06فخم\\x06قمح\\x06قمم\\x06لحم\\x06لحي\\x06لحى\\x06لجج\\x06لخم\\x06لمح\\x06محج\" +\n\t\"\\x06محم\\x06محي\\x06مجح\\x06مجم\\x06مخج\\x06مخم\\x06مجخ\\x06همج\\x06همم\\x06نحم\" +\n\t\"\\x06نحى\\x06نجم\\x06نجى\\x06نمي\\x06نمى\\x06يمم\\x06بخي\\x06تجي\\x06تجى\\x06تخي\" +\n\t\"\\x06تخى\\x06تمي\\x06تمى\\x06جمي\\x06جحى\\x06جمى\\x06سخى\\x06صحي\\x06شحي\\x06ضحي\" +\n\t\"\\x06لجي\\x06لمي\\x06يحي\\x06يجي\\x06يمي\\x06ممي\\x06قمي\\x06نحي\\x06عمي\\x06كمي\" +\n\t\"\\x06نجح\\x06مخي\\x06لجم\\x06كمم\\x06جحي\\x06حجي\\x06مجي\\x06فمي\\x06بحي\\x06سخي\" +\n\t\"\\x06نجي\\x06صلے\\x06قلے\\x08الله\\x08اكبر\\x08محمد\\x08صلعم\\x08رسول\\x08عليه\" +\n\t\"\\x08وسلم\\x06صلى!صلى الله عليه وسلم\\x0fجل جلاله\\x08ریال\\x01,\\x01:\\x01!\" +\n\t\"\\x01?\\x01_\\x01{\\x01}\\x01[\\x01]\\x01#\\x01&\\x01*\\x01-\\x01<\\x01>\\x01\\\\\\x01$\" +\n\t\"\\x01%\\x01@\\x04ـً\\x04ـَ\\x04ـُ\\x04ـِ\\x04ـّ\\x04ـْ\\x02ء\\x02آ\\x02أ\\x02ؤ\\x02إ\" +\n\t\"\\x02ئ\\x02ا\\x02ب\\x02ة\\x02ت\\x02ث\\x02ج\\x02ح\\x02خ\\x02د\\x02ذ\\x02ر\\x02ز\\x02س\" +\n\t\"\\x02ش\\x02ص\\x02ض\\x02ط\\x02ظ\\x02ع\\x02غ\\x02ف\\x02ق\\x02ك\\x02ل\\x02م\\x02ن\\x02ه\" +\n\t\"\\x02و\\x02ي\\x04لآ\\x04لأ\\x04لإ\\x04لا\\x01\\x22\\x01'\\x01/\\x01^\\x01|\\x01~\\x02¢\" +\n\t\"\\x02£\\x02¬\\x02¦\\x02¥\\x08𝅗𝅥\\x08𝅘𝅥\\x0c𝅘𝅥𝅮\\x0c𝅘𝅥𝅯\\x0c𝅘𝅥𝅰\\x0c𝅘𝅥𝅱\\x0c𝅘𝅥𝅲\\x08𝆹\" +\n\t\"𝅥\\x08𝆺𝅥\\x0c𝆹𝅥𝅮\\x0c𝆺𝅥𝅮\\x0c𝆹𝅥𝅯\\x0c𝆺𝅥𝅯\\x02ı\\x02ȷ\\x02α\\x02ε\\x02ζ\\x02η\\x02\" +\n\t\"κ\\x02λ\\x02μ\\x02ν\\x02ξ\\x02ο\\x02σ\\x02τ\\x02υ\\x02ψ\\x03∇\\x03∂\\x02ϝ\\x02ٮ\\x02ڡ\" +\n\t\"\\x02ٯ\\x020,\\x021,\\x022,\\x023,\\x024,\\x025,\\x026,\\x027,\\x028,\\x029,\\x03(a)\" +\n\t\"\\x03(b)\\x03(c)\\x03(d)\\x03(e)\\x03(f)\\x03(g)\\x03(h)\\x03(i)\\x03(j)\\x03(k)\" +\n\t\"\\x03(l)\\x03(m)\\x03(n)\\x03(o)\\x03(p)\\x03(q)\\x03(r)\\x03(s)\\x03(t)\\x03(u)\" +\n\t\"\\x03(v)\\x03(w)\\x03(x)\\x03(y)\\x03(z)\\x07〔s〕\\x02wz\\x02hv\\x02sd\\x03ppv\\x02w\" +\n\t\"c\\x02mc\\x02md\\x02dj\\x06ほか\\x06ココ\\x03サ\\x03手\\x03字\\x03双\\x03デ\\x03二\\x03多\\x03解\" +\n\t\"\\x03天\\x03交\\x03映\\x03無\\x03料\\x03前\\x03後\\x03再\\x03新\\x03初\\x03終\\x03生\\x03販\\x03声\" +\n\t\"\\x03吹\\x03演\\x03投\\x03捕\\x03一\\x03三\\x03遊\\x03左\\x03中\\x03右\\x03指\\x03走\\x03打\\x03禁\" +\n\t\"\\x03空\\x03合\\x03満\\x03有\\x03月\\x03申\\x03割\\x03営\\x03配\\x09〔本〕\\x09〔三〕\\x09〔二〕\\x09〔安\" +\n\t\"〕\\x09〔点〕\\x09〔打〕\\x09〔盗〕\\x09〔勝〕\\x09〔敗〕\\x03得\\x03可\\x03丽\\x03丸\\x03乁\\x03你\\x03\" +\n\t\"侮\\x03侻\\x03倂\\x03偺\\x03備\\x03僧\\x03像\\x03㒞\\x03免\\x03兔\\x03兤\\x03具\\x03㒹\\x03內\\x03\" +\n\t\"冗\\x03冤\\x03仌\\x03冬\\x03况\\x03凵\\x03刃\\x03㓟\\x03刻\\x03剆\\x03剷\\x03㔕\\x03勇\\x03勉\\x03\" +\n\t\"勤\\x03勺\\x03包\\x03匆\\x03北\\x03卉\\x03卑\\x03博\\x03即\\x03卽\\x03卿\\x03灰\\x03及\\x03叟\\x03\" +\n\t\"叫\\x03叱\\x03吆\\x03咞\\x03吸\\x03呈\\x03周\\x03咢\\x03哶\\x03唐\\x03啓\\x03啣\\x03善\\x03喙\\x03\" +\n\t\"喫\\x03喳\\x03嗂\\x03圖\\x03嘆\\x03圗\\x03噑\\x03噴\\x03切\\x03壮\\x03城\\x03埴\\x03堍\\x03型\\x03\" +\n\t\"堲\\x03報\\x03墬\\x03売\\x03壷\\x03夆\\x03夢\\x03奢\\x03姬\\x03娛\\x03娧\\x03姘\\x03婦\\x03㛮\\x03\" +\n\t\"嬈\\x03嬾\\x03寃\\x03寘\\x03寧\\x03寳\\x03寿\\x03将\\x03尢\\x03㞁\\x03屠\\x03屮\\x03峀\\x03岍\\x03\" +\n\t\"嵃\\x03嵮\\x03嵫\\x03嵼\\x03巡\\x03巢\\x03㠯\\x03巽\\x03帨\\x03帽\\x03幩\\x03㡢\\x03㡼\\x03庰\\x03\" +\n\t\"庳\\x03庶\\x03廊\\x03廾\\x03舁\\x03弢\\x03㣇\\x03形\\x03彫\\x03㣣\\x03徚\\x03忍\\x03志\\x03忹\\x03\" +\n\t\"悁\\x03㤺\\x03㤜\\x03悔\\x03惇\\x03慈\\x03慌\\x03慎\\x03慺\\x03憎\\x03憲\\x03憤\\x03憯\\x03懞\\x03\" +\n\t\"懲\\x03懶\\x03成\\x03戛\\x03扝\\x03抱\\x03拔\\x03捐\\x03挽\\x03拼\\x03捨\\x03掃\\x03揤\\x03搢\\x03\" +\n\t\"揅\\x03掩\\x03㨮\\x03摩\\x03摾\\x03撝\\x03摷\\x03㩬\\x03敏\\x03敬\\x03旣\\x03書\\x03晉\\x03㬙\\x03\" +\n\t\"暑\\x03㬈\\x03㫤\\x03冒\\x03冕\\x03最\\x03暜\\x03肭\\x03䏙\\x03朗\\x03望\\x03朡\\x03杞\\x03杓\\x03\" +\n\t\"㭉\\x03柺\\x03枅\\x03桒\\x03梅\\x03梎\\x03栟\\x03椔\\x03㮝\\x03楂\\x03榣\\x03槪\\x03檨\\x03櫛\\x03\" +\n\t\"㰘\\x03次\\x03歔\\x03㱎\\x03歲\\x03殟\\x03殺\\x03殻\\x03汎\\x03沿\\x03泍\\x03汧\\x03洖\\x03派\\x03\" +\n\t\"海\\x03流\\x03浩\\x03浸\\x03涅\\x03洴\\x03港\\x03湮\\x03㴳\\x03滋\\x03滇\\x03淹\\x03潮\\x03濆\\x03\" +\n\t\"瀹\\x03瀞\\x03瀛\\x03㶖\\x03灊\\x03災\\x03灷\\x03炭\\x03煅\\x03熜\\x03爨\\x03爵\\x03牐\\x03犀\\x03\" +\n\t\"犕\\x03獺\\x03王\\x03㺬\\x03玥\\x03㺸\\x03瑇\\x03瑜\\x03瑱\\x03璅\\x03瓊\\x03㼛\\x03甤\\x03甾\\x03\" +\n\t\"異\\x03瘐\\x03㿼\\x03䀈\\x03直\\x03眞\\x03真\\x03睊\\x03䀹\\x03瞋\\x03䁆\\x03䂖\\x03硎\\x03碌\\x03\" +\n\t\"磌\\x03䃣\\x03祖\\x03福\\x03秫\\x03䄯\\x03穀\\x03穊\\x03穏\\x03䈂\\x03篆\\x03築\\x03䈧\\x03糒\\x03\" +\n\t\"䊠\\x03糨\\x03糣\\x03紀\\x03絣\\x03䌁\\x03緇\\x03縂\\x03繅\\x03䌴\\x03䍙\\x03罺\\x03羕\\x03翺\\x03\" +\n\t\"者\\x03聠\\x03聰\\x03䏕\\x03育\\x03脃\\x03䐋\\x03脾\\x03媵\\x03舄\\x03辞\\x03䑫\\x03芑\\x03芋\\x03\" +\n\t\"芝\\x03劳\\x03花\\x03芳\\x03芽\\x03苦\\x03若\\x03茝\\x03荣\\x03莭\\x03茣\\x03莽\\x03菧\\x03著\\x03\" +\n\t\"荓\\x03菊\\x03菌\\x03菜\\x03䔫\\x03蓱\\x03蓳\\x03蔖\\x03蕤\\x03䕝\\x03䕡\\x03䕫\\x03虐\\x03虜\\x03\" +\n\t\"虧\\x03虩\\x03蚩\\x03蚈\\x03蜎\\x03蛢\\x03蝹\\x03蜨\\x03蝫\\x03螆\\x03蟡\\x03蠁\\x03䗹\\x03衠\\x03\" +\n\t\"衣\\x03裗\\x03裞\\x03䘵\\x03裺\\x03㒻\\x03䚾\\x03䛇\\x03誠\\x03諭\\x03變\\x03豕\\x03貫\\x03賁\\x03\" +\n\t\"贛\\x03起\\x03跋\\x03趼\\x03跰\\x03軔\\x03輸\\x03邔\\x03郱\\x03鄑\\x03鄛\\x03鈸\\x03鋗\\x03鋘\\x03\" +\n\t\"鉼\\x03鏹\\x03鐕\\x03開\\x03䦕\\x03閷\\x03䧦\\x03雃\\x03嶲\\x03霣\\x03䩮\\x03䩶\\x03韠\\x03䪲\\x03\" +\n\t\"頋\\x03頩\\x03飢\\x03䬳\\x03餩\\x03馧\\x03駂\\x03駾\\x03䯎\\x03鬒\\x03鱀\\x03鳽\\x03䳎\\x03䳭\\x03\" +\n\t\"鵧\\x03䳸\\x03麻\\x03䵖\\x03黹\\x03黾\\x03鼅\\x03鼏\\x03鼖\\x03鼻\"\n\nvar xorData string = \"\" + // Size: 4855 bytes\n\t\"\\x02\\x0c\\x09\\x02\\xb0\\xec\\x02\\xad\\xd8\\x02\\xad\\xd9\\x02\\x06\\x07\\x02\\x0f\\x12\" +\n\t\"\\x02\\x0f\\x1f\\x02\\x0f\\x1d\\x02\\x01\\x13\\x02\\x0f\\x16\\x02\\x0f\\x0b\\x02\\x0f3\" +\n\t\"\\x02\\x0f7\\x02\\x0f?\\x02\\x0f/\\x02\\x0f*\\x02\\x0c&\\x02\\x0c*\\x02\\x0c;\\x02\\x0c9\" +\n\t\"\\x02\\x0c%\\x02\\xab\\xed\\x02\\xab\\xe2\\x02\\xab\\xe3\\x02\\xa9\\xe0\\x02\\xa9\\xe1\" +\n\t\"\\x02\\xa9\\xe6\\x02\\xa3\\xcb\\x02\\xa3\\xc8\\x02\\xa3\\xc9\\x02\\x01#\\x02\\x01\\x08\" +\n\t\"\\x02\\x0e>\\x02\\x0e'\\x02\\x0f\\x03\\x02\\x03\\x0d\\x02\\x03\\x09\\x02\\x03\\x17\\x02\" +\n\t\"\\x03\\x0e\\x02\\x02\\x03\\x02\\x011\\x02\\x01\\x00\\x02\\x01\\x10\\x02\\x03<\\x02\\x07\" +\n\t\"\\x0d\\x02\\x02\\x0c\\x02\\x0c0\\x02\\x01\\x03\\x02\\x01\\x01\\x02\\x01 \\x02\\x01\\x22\" +\n\t\"\\x02\\x01)\\x02\\x01\\x0a\\x02\\x01\\x0c\\x02\\x02\\x06\\x02\\x02\\x02\\x02\\x03\\x10\" +\n\t\"\\x03\\x037 \\x03\\x0b+\\x03\\x02\\x01\\x04\\x02\\x01\\x02\\x02\\x019\\x02\\x03\\x1c\\x02\" +\n\t\"\\x02$\\x03\\x80p$\\x02\\x03:\\x02\\x03\\x0a\\x03\\xc1r.\\x03\\xc1r,\\x03\\xc1r\\x02\" +\n\t\"\\x02\\x02:\\x02\\x02>\\x02\\x02,\\x02\\x02\\x10\\x02\\x02\\x00\\x03\\xc1s<\\x03\\xc1s*\" +\n\t\"\\x03\\xc2L$\\x03\\xc2L;\\x02\\x09)\\x02\\x0a\\x19\\x03\\x83\\xab\\xe3\\x03\\x83\\xab\" +\n\t\"\\xf2\\x03 4\\xe0\\x03\\x81\\xab\\xea\\x03\\x81\\xab\\xf3\\x03 4\\xef\\x03\\x96\\xe1\\xcd\" +\n\t\"\\x03\\x84\\xe5\\xc3\\x02\\x0d\\x11\\x03\\x8b\\xec\\xcb\\x03\\x94\\xec\\xcf\\x03\\x9a\\xec\" +\n\t\"\\xc2\\x03\\x8b\\xec\\xdb\\x03\\x94\\xec\\xdf\\x03\\x9a\\xec\\xd2\\x03\\x01\\x0c!\\x03\" +\n\t\"\\x01\\x0c#\\x03ʠ\\x9d\\x03ʣ\\x9c\\x03ʢ\\x9f\\x03ʥ\\x9e\\x03ʤ\\x91\\x03ʧ\\x90\\x03ʦ\\x93\" +\n\t\"\\x03ʩ\\x92\\x03ʨ\\x95\\x03\\xca\\xf3\\xb5\\x03\\xca\\xf0\\xb4\\x03\\xca\\xf1\\xb7\\x03\" +\n\t\"\\xca\\xf6\\xb6\\x03\\xca\\xf7\\x89\\x03\\xca\\xf4\\x88\\x03\\xca\\xf5\\x8b\\x03\\xca\\xfa\" +\n\t\"\\x8a\\x03\\xca\\xfb\\x8d\\x03\\xca\\xf8\\x8c\\x03\\xca\\xf9\\x8f\\x03\\xca\\xfe\\x8e\\x03\" +\n\t\"\\xca\\xff\\x81\\x03\\xca\\xfc\\x80\\x03\\xca\\xfd\\x83\\x03\\xca\\xe2\\x82\\x03\\xca\\xe3\" +\n\t\"\\x85\\x03\\xca\\xe0\\x84\\x03\\xca\\xe1\\x87\\x03\\xca\\xe6\\x86\\x03\\xca\\xe7\\x99\\x03\" +\n\t\"\\xca\\xe4\\x98\\x03\\xca\\xe5\\x9b\\x03\\xca\\xea\\x9a\\x03\\xca\\xeb\\x9d\\x03\\xca\\xe8\" +\n\t\"\\x9c\\x03ؓ\\x89\\x03ߔ\\x8b\\x02\\x010\\x03\\x03\\x04\\x1e\\x03\\x04\\x15\\x12\\x03\\x0b\" +\n\t\"\\x05,\\x03\\x06\\x04\\x00\\x03\\x06\\x04)\\x03\\x06\\x044\\x03\\x06\\x04<\\x03\\x06\\x05\" +\n\t\"\\x1d\\x03\\x06\\x06\\x00\\x03\\x06\\x06\\x0a\\x03\\x06\\x06'\\x03\\x06\\x062\\x03\\x0786\" +\n\t\"\\x03\\x079/\\x03\\x079 \\x03\\x07:\\x0e\\x03\\x07:\\x1b\\x03\\x07:%\\x03\\x07;/\\x03\" +\n\t\"\\x07;%\\x03\\x074\\x11\\x03\\x076\\x09\\x03\\x077*\\x03\\x070\\x01\\x03\\x070\\x0f\\x03\" +\n\t\"\\x070.\\x03\\x071\\x16\\x03\\x071\\x04\\x03\\x0710\\x03\\x072\\x18\\x03\\x072-\\x03\" +\n\t\"\\x073\\x14\\x03\\x073>\\x03\\x07'\\x09\\x03\\x07 \\x00\\x03\\x07\\x1f\\x0b\\x03\\x07\" +\n\t\"\\x18#\\x03\\x07\\x18(\\x03\\x07\\x186\\x03\\x07\\x18\\x03\\x03\\x07\\x19\\x16\\x03\\x07\" +\n\t\"\\x116\\x03\\x07\\x12'\\x03\\x07\\x13\\x10\\x03\\x07\\x0c&\\x03\\x07\\x0c\\x08\\x03\\x07\" +\n\t\"\\x0c\\x13\\x03\\x07\\x0d\\x02\\x03\\x07\\x0d\\x1c\\x03\\x07\\x0b5\\x03\\x07\\x0b\\x0a\" +\n\t\"\\x03\\x07\\x0b\\x01\\x03\\x07\\x0b\\x0f\\x03\\x07\\x05\\x00\\x03\\x07\\x05\\x09\\x03\\x07\" +\n\t\"\\x05\\x0b\\x03\\x07\\x07\\x01\\x03\\x07\\x07\\x08\\x03\\x07\\x00<\\x03\\x07\\x00+\\x03\" +\n\t\"\\x07\\x01)\\x03\\x07\\x01\\x1b\\x03\\x07\\x01\\x08\\x03\\x07\\x03?\\x03\\x0445\\x03\\x04\" +\n\t\"4\\x08\\x03\\x0454\\x03\\x04)/\\x03\\x04)5\\x03\\x04+\\x05\\x03\\x04+\\x14\\x03\\x04+ \" +\n\t\"\\x03\\x04+<\\x03\\x04*&\\x03\\x04*\\x22\\x03\\x04&8\\x03\\x04!\\x01\\x03\\x04!\\x22\" +\n\t\"\\x03\\x04\\x11+\\x03\\x04\\x10.\\x03\\x04\\x104\\x03\\x04\\x13=\\x03\\x04\\x12\\x04\\x03\" +\n\t\"\\x04\\x12\\x0a\\x03\\x04\\x0d\\x1d\\x03\\x04\\x0d\\x07\\x03\\x04\\x0d \\x03\\x05<>\\x03\" +\n\t\"\\x055<\\x03\\x055!\\x03\\x055#\\x03\\x055&\\x03\\x054\\x1d\\x03\\x054\\x02\\x03\\x054\" +\n\t\"\\x07\\x03\\x0571\\x03\\x053\\x1a\\x03\\x053\\x16\\x03\\x05.<\\x03\\x05.\\x07\\x03\\x05)\" +\n\t\":\\x03\\x05)<\\x03\\x05)\\x0c\\x03\\x05)\\x15\\x03\\x05+-\\x03\\x05+5\\x03\\x05$\\x1e\" +\n\t\"\\x03\\x05$\\x14\\x03\\x05'\\x04\\x03\\x05'\\x14\\x03\\x05&\\x02\\x03\\x05\\x226\\x03\" +\n\t\"\\x05\\x22\\x0c\\x03\\x05\\x22\\x1c\\x03\\x05\\x19\\x0a\\x03\\x05\\x1b\\x09\\x03\\x05\\x1b\" +\n\t\"\\x0c\\x03\\x05\\x14\\x07\\x03\\x05\\x16?\\x03\\x05\\x16\\x0c\\x03\\x05\\x0c\\x05\\x03\" +\n\t\"\\x05\\x0e\\x0f\\x03\\x05\\x01\\x0e\\x03\\x05\\x00(\\x03\\x05\\x030\\x03\\x05\\x03\\x06\" +\n\t\"\\x03\\x0a==\\x03\\x0a=1\\x03\\x0a=,\\x03\\x0a=\\x0c\\x03\\x0a??\\x03\\x0a<\\x08\\x03\" +\n\t\"\\x0a9!\\x03\\x0a9)\\x03\\x0a97\\x03\\x0a99\\x03\\x0a6\\x0a\\x03\\x0a6\\x1c\\x03\\x0a6\" +\n\t\"\\x17\\x03\\x0a7'\\x03\\x0a78\\x03\\x0a73\\x03\\x0a'\\x01\\x03\\x0a'&\\x03\\x0a\\x1f\" +\n\t\"\\x0e\\x03\\x0a\\x1f\\x03\\x03\\x0a\\x1f3\\x03\\x0a\\x1b/\\x03\\x0a\\x18\\x19\\x03\\x0a\" +\n\t\"\\x19\\x01\\x03\\x0a\\x16\\x14\\x03\\x0a\\x0e\\x22\\x03\\x0a\\x0f\\x10\\x03\\x0a\\x0f\\x02\" +\n\t\"\\x03\\x0a\\x0f \\x03\\x0a\\x0c\\x04\\x03\\x0a\\x0b>\\x03\\x0a\\x0b+\\x03\\x0a\\x08/\\x03\" +\n\t\"\\x0a\\x046\\x03\\x0a\\x05\\x14\\x03\\x0a\\x00\\x04\\x03\\x0a\\x00\\x10\\x03\\x0a\\x00\" +\n\t\"\\x14\\x03\\x0b<3\\x03\\x0b;*\\x03\\x0b9\\x22\\x03\\x0b9)\\x03\\x0b97\\x03\\x0b+\\x10\" +\n\t\"\\x03\\x0b((\\x03\\x0b&5\\x03\\x0b$\\x1c\\x03\\x0b$\\x12\\x03\\x0b%\\x04\\x03\\x0b#<\" +\n\t\"\\x03\\x0b#0\\x03\\x0b#\\x0d\\x03\\x0b#\\x19\\x03\\x0b!:\\x03\\x0b!\\x1f\\x03\\x0b!\\x00\" +\n\t\"\\x03\\x0b\\x1e5\\x03\\x0b\\x1c\\x1d\\x03\\x0b\\x1d-\\x03\\x0b\\x1d(\\x03\\x0b\\x18.\\x03\" +\n\t\"\\x0b\\x18 \\x03\\x0b\\x18\\x16\\x03\\x0b\\x14\\x13\\x03\\x0b\\x15$\\x03\\x0b\\x15\\x22\" +\n\t\"\\x03\\x0b\\x12\\x1b\\x03\\x0b\\x12\\x10\\x03\\x0b\\x132\\x03\\x0b\\x13=\\x03\\x0b\\x12\" +\n\t\"\\x18\\x03\\x0b\\x0c&\\x03\\x0b\\x061\\x03\\x0b\\x06:\\x03\\x0b\\x05#\\x03\\x0b\\x05<\" +\n\t\"\\x03\\x0b\\x04\\x0b\\x03\\x0b\\x04\\x04\\x03\\x0b\\x04\\x1b\\x03\\x0b\\x042\\x03\\x0b\" +\n\t\"\\x041\\x03\\x0b\\x03\\x03\\x03\\x0b\\x03\\x1d\\x03\\x0b\\x03/\\x03\\x0b\\x03+\\x03\\x0b\" +\n\t\"\\x02\\x1b\\x03\\x0b\\x02\\x00\\x03\\x0b\\x01\\x1e\\x03\\x0b\\x01\\x08\\x03\\x0b\\x015\" +\n\t\"\\x03\\x06\\x0d9\\x03\\x06\\x0d=\\x03\\x06\\x0d?\\x03\\x02\\x001\\x03\\x02\\x003\\x03\" +\n\t\"\\x02\\x02\\x19\\x03\\x02\\x006\\x03\\x02\\x02\\x1b\\x03\\x02\\x004\\x03\\x02\\x00<\\x03\" +\n\t\"\\x02\\x02\\x0a\\x03\\x02\\x02\\x0e\\x03\\x02\\x01\\x1a\\x03\\x02\\x01\\x07\\x03\\x02\\x01\" +\n\t\"\\x05\\x03\\x02\\x01\\x0b\\x03\\x02\\x01%\\x03\\x02\\x01\\x0c\\x03\\x02\\x01\\x04\\x03\" +\n\t\"\\x02\\x01\\x1c\\x03\\x02\\x00.\\x03\\x02\\x002\\x03\\x02\\x00>\\x03\\x02\\x00\\x12\\x03\" +\n\t\"\\x02\\x00\\x16\\x03\\x02\\x011\\x03\\x02\\x013\\x03\\x02\\x02 \\x03\\x02\\x02%\\x03\\x02\" +\n\t\"\\x02$\\x03\\x02\\x028\\x03\\x02\\x02;\\x03\\x02\\x024\\x03\\x02\\x012\\x03\\x02\\x022\" +\n\t\"\\x03\\x02\\x02/\\x03\\x02\\x01,\\x03\\x02\\x01\\x13\\x03\\x02\\x01\\x16\\x03\\x02\\x01\" +\n\t\"\\x11\\x03\\x02\\x01\\x1e\\x03\\x02\\x01\\x15\\x03\\x02\\x01\\x17\\x03\\x02\\x01\\x0f\\x03\" +\n\t\"\\x02\\x01\\x08\\x03\\x02\\x00?\\x03\\x02\\x03\\x07\\x03\\x02\\x03\\x0d\\x03\\x02\\x03\" +\n\t\"\\x13\\x03\\x02\\x03\\x1d\\x03\\x02\\x03\\x1f\\x03\\x02\\x00\\x03\\x03\\x02\\x00\\x0d\\x03\" +\n\t\"\\x02\\x00\\x01\\x03\\x02\\x00\\x1b\\x03\\x02\\x00\\x19\\x03\\x02\\x00\\x18\\x03\\x02\\x00\" +\n\t\"\\x13\\x03\\x02\\x00/\\x03\\x07>\\x12\\x03\\x07<\\x1f\\x03\\x07>\\x1d\\x03\\x06\\x1d\\x0e\" +\n\t\"\\x03\\x07>\\x1c\\x03\\x07>:\\x03\\x07>\\x13\\x03\\x04\\x12+\\x03\\x07?\\x03\\x03\\x07>\" +\n\t\"\\x02\\x03\\x06\\x224\\x03\\x06\\x1a.\\x03\\x07<%\\x03\\x06\\x1c\\x0b\\x03\\x0609\\x03\" +\n\t\"\\x05\\x1f\\x01\\x03\\x04'\\x08\\x03\\x93\\xfd\\xf5\\x03\\x02\\x0d \\x03\\x02\\x0d#\\x03\" +\n\t\"\\x02\\x0d!\\x03\\x02\\x0d&\\x03\\x02\\x0d\\x22\\x03\\x02\\x0d/\\x03\\x02\\x0d,\\x03\\x02\" +\n\t\"\\x0d$\\x03\\x02\\x0d'\\x03\\x02\\x0d%\\x03\\x02\\x0d;\\x03\\x02\\x0d=\\x03\\x02\\x0d?\" +\n\t\"\\x03\\x099.\\x03\\x08\\x0b7\\x03\\x08\\x02\\x14\\x03\\x08\\x14\\x0d\\x03\\x08.:\\x03\" +\n\t\"\\x089'\\x03\\x0f\\x0b\\x18\\x03\\x0f\\x1c1\\x03\\x0f\\x17&\\x03\\x0f9\\x1f\\x03\\x0f0\" +\n\t\"\\x0c\\x03\\x0e\\x0a9\\x03\\x0e\\x056\\x03\\x0e\\x1c#\\x03\\x0f\\x13\\x0e\\x03\\x072\\x00\" +\n\t\"\\x03\\x070\\x0d\\x03\\x072\\x0b\\x03\\x06\\x11\\x18\\x03\\x070\\x10\\x03\\x06\\x0f(\\x03\" +\n\t\"\\x072\\x05\\x03\\x06\\x0f,\\x03\\x073\\x15\\x03\\x06\\x07\\x08\\x03\\x05\\x16\\x02\\x03\" +\n\t\"\\x04\\x0b \\x03\\x05:8\\x03\\x05\\x16%\\x03\\x0a\\x0d\\x1f\\x03\\x06\\x16\\x10\\x03\\x05\" +\n\t\"\\x1d5\\x03\\x05*;\\x03\\x05\\x16\\x1b\\x03\\x04.-\\x03\\x06\\x1a\\x19\\x03\\x04\\x03,\" +\n\t\"\\x03\\x0b87\\x03\\x04/\\x0a\\x03\\x06\\x00,\\x03\\x04-\\x01\\x03\\x04\\x1e-\\x03\\x06/(\" +\n\t\"\\x03\\x0a\\x0b5\\x03\\x06\\x0e7\\x03\\x06\\x07.\\x03\\x0597\\x03\\x0a*%\\x03\\x0760\" +\n\t\"\\x03\\x06\\x0c;\\x03\\x05'\\x00\\x03\\x072.\\x03\\x072\\x08\\x03\\x06=\\x01\\x03\\x06\" +\n\t\"\\x05\\x1b\\x03\\x06\\x06\\x12\\x03\\x06$=\\x03\\x06'\\x0d\\x03\\x04\\x11\\x0f\\x03\\x076\" +\n\t\",\\x03\\x06\\x07;\\x03\\x06.,\\x03\\x86\\xf9\\xea\\x03\\x8f\\xff\\xeb\\x02\\x092\\x02\" +\n\t\"\\x095\\x02\\x094\\x02\\x09;\\x02\\x09>\\x02\\x098\\x02\\x09*\\x02\\x09/\\x02\\x09,\\x02\" +\n\t\"\\x09%\\x02\\x09&\\x02\\x09#\\x02\\x09 \\x02\\x08!\\x02\\x08%\\x02\\x08$\\x02\\x08+\\x02\" +\n\t\"\\x08.\\x02\\x08*\\x02\\x08&\\x02\\x088\\x02\\x08>\\x02\\x084\\x02\\x086\\x02\\x080\\x02\" +\n\t\"\\x08\\x10\\x02\\x08\\x17\\x02\\x08\\x12\\x02\\x08\\x1d\\x02\\x08\\x1f\\x02\\x08\\x13\\x02\" +\n\t\"\\x08\\x15\\x02\\x08\\x14\\x02\\x08\\x0c\\x03\\x8b\\xfd\\xd0\\x03\\x81\\xec\\xc6\\x03\\x87\" +\n\t\"\\xe0\\x8a\\x03-2\\xe3\\x03\\x80\\xef\\xe4\\x03-2\\xea\\x03\\x88\\xe6\\xeb\\x03\\x8e\\xe6\" +\n\t\"\\xe8\\x03\\x84\\xe6\\xe9\\x03\\x97\\xe6\\xee\\x03-2\\xf9\\x03-2\\xf6\\x03\\x8e\\xe3\\xad\" +\n\t\"\\x03\\x80\\xe3\\x92\\x03\\x88\\xe3\\x90\\x03\\x8e\\xe3\\x90\\x03\\x80\\xe3\\x97\\x03\\x88\" +\n\t\"\\xe3\\x95\\x03\\x88\\xfe\\xcb\\x03\\x8e\\xfe\\xca\\x03\\x84\\xfe\\xcd\\x03\\x91\\xef\\xc9\" +\n\t\"\\x03-2\\xc1\\x03-2\\xc0\\x03-2\\xcb\\x03\\x88@\\x09\\x03\\x8e@\\x08\\x03\\x8f\\xe0\\xf5\" +\n\t\"\\x03\\x8e\\xe6\\xf9\\x03\\x8e\\xe0\\xfa\\x03\\x93\\xff\\xf4\\x03\\x84\\xee\\xd3\\x03\\x0b\" +\n\t\"(\\x04\\x023 \\x021;\\x02\\x01*\\x03\\x0b#\\x10\\x03\\x0b 0\\x03\\x0b!\\x10\\x03\\x0b!0\" +\n\t\"\\x03\\x07\\x15\\x08\\x03\\x09?5\\x03\\x07\\x1f\\x08\\x03\\x07\\x17\\x0b\\x03\\x09\\x1f\" +\n\t\"\\x15\\x03\\x0b\\x1c7\\x03\\x0a+#\\x03\\x06\\x1a\\x1b\\x03\\x06\\x1a\\x14\\x03\\x0a\\x01\" +\n\t\"\\x18\\x03\\x06#\\x1b\\x03\\x0a2\\x0c\\x03\\x0a\\x01\\x04\\x03\\x09#;\\x03\\x08='\\x03\" +\n\t\"\\x08\\x1a\\x0a\\x03\\x07</\\x03\\x07:+\\x03\\x07\\x07*\\x03\\x06&\\x1c\\x03\\x09\\x0c\" +\n\t\"\\x16\\x03\\x09\\x10\\x0e\\x03\\x08'\\x0f\\x03\\x08+\\x09\\x03\\x074%\\x03\\x06!3\\x03\" +\n\t\"\\x06\\x03+\\x03\\x0b\\x1e\\x19\\x03\\x0a))\\x03\\x09\\x08\\x19\\x03\\x08,\\x05\\x03\\x07\" +\n\t\"<2\\x03\\x06\\x1c>\\x03\\x0a\\x111\\x03\\x09\\x1b\\x09\\x03\\x073.\\x03\\x07\\x01\\x00\" +\n\t\"\\x03\\x09/,\\x03\\x07#>\\x03\\x07\\x048\\x03\\x0a\\x1f\\x22\\x03\\x098>\\x03\\x09\\x11\" +\n\t\"\\x00\\x03\\x08/\\x17\\x03\\x06'\\x22\\x03\\x0b\\x1a+\\x03\\x0a\\x22\\x19\\x03\\x0a/1\" +\n\t\"\\x03\\x0974\\x03\\x09\\x0f\\x22\\x03\\x08,\\x22\\x03\\x08?\\x14\\x03\\x07$5\\x03\\x07<3\" +\n\t\"\\x03\\x07=*\\x03\\x07\\x13\\x18\\x03\\x068\\x0a\\x03\\x06\\x09\\x16\\x03\\x06\\x13\\x00\" +\n\t\"\\x03\\x08\\x067\\x03\\x08\\x01\\x03\\x03\\x08\\x12\\x1d\\x03\\x07+7\\x03\\x06(;\\x03\" +\n\t\"\\x06\\x1c?\\x03\\x07\\x0e\\x17\\x03\\x0a\\x06\\x1d\\x03\\x0a\\x19\\x07\\x03\\x08\\x14$\" +\n\t\"\\x03\\x07$;\\x03\\x08,$\\x03\\x08\\x06\\x0d\\x03\\x07\\x16\\x0a\\x03\\x06>>\\x03\\x0a\" +\n\t\"\\x06\\x12\\x03\\x0a\\x14)\\x03\\x09\\x0d\\x1f\\x03\\x09\\x12\\x17\\x03\\x09\\x19\\x01\" +\n\t\"\\x03\\x08\\x11 \\x03\\x08\\x1d'\\x03\\x06<\\x1a\\x03\\x0a.\\x00\\x03\\x07'\\x18\\x03\" +\n\t\"\\x0a\\x22\\x08\\x03\\x08\\x0d\\x0a\\x03\\x08\\x13)\\x03\\x07*)\\x03\\x06<,\\x03\\x07\" +\n\t\"\\x0b\\x1a\\x03\\x09.\\x14\\x03\\x09\\x0d\\x1e\\x03\\x07\\x0e#\\x03\\x0b\\x1d'\\x03\\x0a\" +\n\t\"\\x0a8\\x03\\x09%2\\x03\\x08+&\\x03\\x080\\x12\\x03\\x0a)4\\x03\\x08\\x06\\x1f\\x03\\x0b\" +\n\t\"\\x1b\\x1a\\x03\\x0a\\x1b\\x0f\\x03\\x0b\\x1d*\\x03\\x09\\x16$\\x03\\x090\\x11\\x03\\x08\" +\n\t\"\\x11\\x08\\x03\\x0a*(\\x03\\x0a\\x042\\x03\\x089,\\x03\\x074'\\x03\\x07\\x0f\\x05\\x03\" +\n\t\"\\x09\\x0b\\x0a\\x03\\x07\\x1b\\x01\\x03\\x09\\x17:\\x03\\x09.\\x0d\\x03\\x07.\\x11\\x03\" +\n\t\"\\x09+\\x15\\x03\\x080\\x13\\x03\\x0b\\x1f\\x19\\x03\\x0a \\x11\\x03\\x0a\\x220\\x03\\x09\" +\n\t\"\\x07;\\x03\\x08\\x16\\x1c\\x03\\x07,\\x13\\x03\\x07\\x0e/\\x03\\x06\\x221\\x03\\x0a.\" +\n\t\"\\x0a\\x03\\x0a7\\x02\\x03\\x0a\\x032\\x03\\x0a\\x1d.\\x03\\x091\\x06\\x03\\x09\\x19:\" +\n\t\"\\x03\\x08\\x02/\\x03\\x060+\\x03\\x06\\x0f-\\x03\\x06\\x1c\\x1f\\x03\\x06\\x1d\\x07\\x03\" +\n\t\"\\x0a,\\x11\\x03\\x09=\\x0d\\x03\\x09\\x0b;\\x03\\x07\\x1b/\\x03\\x0a\\x1f:\\x03\\x09 \" +\n\t\"\\x1f\\x03\\x09.\\x10\\x03\\x094\\x0b\\x03\\x09\\x1a1\\x03\\x08#\\x1a\\x03\\x084\\x1d\" +\n\t\"\\x03\\x08\\x01\\x1f\\x03\\x08\\x11\\x22\\x03\\x07'8\\x03\\x07\\x1a>\\x03\\x0757\\x03\" +\n\t\"\\x06&9\\x03\\x06+\\x11\\x03\\x0a.\\x0b\\x03\\x0a,>\\x03\\x0a4#\\x03\\x08%\\x17\\x03\" +\n\t\"\\x07\\x05\\x22\\x03\\x07\\x0c\\x0b\\x03\\x0a\\x1d+\\x03\\x0a\\x19\\x16\\x03\\x09+\\x1f\" +\n\t\"\\x03\\x09\\x08\\x0b\\x03\\x08\\x16\\x18\\x03\\x08+\\x12\\x03\\x0b\\x1d\\x0c\\x03\\x0a=\" +\n\t\"\\x10\\x03\\x0a\\x09\\x0d\\x03\\x0a\\x10\\x11\\x03\\x09&0\\x03\\x08(\\x1f\\x03\\x087\\x07\" +\n\t\"\\x03\\x08\\x185\\x03\\x07'6\\x03\\x06.\\x05\\x03\\x06=\\x04\\x03\\x06;;\\x03\\x06\\x06,\" +\n\t\"\\x03\\x0b\\x18>\\x03\\x08\\x00\\x18\\x03\\x06 \\x03\\x03\\x06<\\x00\\x03\\x09%\\x18\\x03\" +\n\t\"\\x0b\\x1c<\\x03\\x0a%!\\x03\\x0a\\x09\\x12\\x03\\x0a\\x16\\x02\\x03\\x090'\\x03\\x09\" +\n\t\"\\x0e=\\x03\\x08 \\x0e\\x03\\x08>\\x03\\x03\\x074>\\x03\\x06&?\\x03\\x06\\x19\\x09\\x03\" +\n\t\"\\x06?(\\x03\\x0a-\\x0e\\x03\\x09:3\\x03\\x098:\\x03\\x09\\x12\\x0b\\x03\\x09\\x1d\\x17\" +\n\t\"\\x03\\x087\\x05\\x03\\x082\\x14\\x03\\x08\\x06%\\x03\\x08\\x13\\x1f\\x03\\x06\\x06\\x0e\" +\n\t\"\\x03\\x0a\\x22<\\x03\\x09/<\\x03\\x06>+\\x03\\x0a'?\\x03\\x0a\\x13\\x0c\\x03\\x09\\x10<\" +\n\t\"\\x03\\x07\\x1b=\\x03\\x0a\\x19\\x13\\x03\\x09\\x22\\x1d\\x03\\x09\\x07\\x0d\\x03\\x08)\" +\n\t\"\\x1c\\x03\\x06=\\x1a\\x03\\x0a/4\\x03\\x0a7\\x11\\x03\\x0a\\x16:\\x03\\x09?3\\x03\\x09:\" +\n\t\"/\\x03\\x09\\x05\\x0a\\x03\\x09\\x14\\x06\\x03\\x087\\x22\\x03\\x080\\x07\\x03\\x08\\x1a\" +\n\t\"\\x1f\\x03\\x07\\x04(\\x03\\x07\\x04\\x09\\x03\\x06 %\\x03\\x06<\\x08\\x03\\x0a+\\x14\" +\n\t\"\\x03\\x09\\x1d\\x16\\x03\\x0a70\\x03\\x08 >\\x03\\x0857\\x03\\x070\\x0a\\x03\\x06=\\x12\" +\n\t\"\\x03\\x06\\x16%\\x03\\x06\\x1d,\\x03\\x099#\\x03\\x09\\x10>\\x03\\x07 \\x1e\\x03\\x08\" +\n\t\"\\x0c<\\x03\\x08\\x0b\\x18\\x03\\x08\\x15+\\x03\\x08,:\\x03\\x08%\\x22\\x03\\x07\\x0a$\" +\n\t\"\\x03\\x0b\\x1c=\\x03\\x07+\\x08\\x03\\x0a/\\x05\\x03\\x0a \\x07\\x03\\x0a\\x12'\\x03\" +\n\t\"\\x09#\\x11\\x03\\x08\\x1b\\x15\\x03\\x0a\\x06\\x01\\x03\\x09\\x1c\\x1b\\x03\\x0922\\x03\" +\n\t\"\\x07\\x14<\\x03\\x07\\x09\\x04\\x03\\x061\\x04\\x03\\x07\\x0e\\x01\\x03\\x0a\\x13\\x18\" +\n\t\"\\x03\\x0a-\\x0c\\x03\\x0a?\\x0d\\x03\\x0a\\x09\\x0a\\x03\\x091&\\x03\\x0a/\\x0b\\x03\" +\n\t\"\\x08$<\\x03\\x083\\x1d\\x03\\x08\\x0c$\\x03\\x08\\x0d\\x07\\x03\\x08\\x0d?\\x03\\x08\" +\n\t\"\\x0e\\x14\\x03\\x065\\x0a\\x03\\x08\\x1a#\\x03\\x08\\x16#\\x03\\x0702\\x03\\x07\\x03\" +\n\t\"\\x1a\\x03\\x06(\\x1d\\x03\\x06+\\x1b\\x03\\x06\\x0b\\x05\\x03\\x06\\x0b\\x17\\x03\\x06\" +\n\t\"\\x0c\\x04\\x03\\x06\\x1e\\x19\\x03\\x06+0\\x03\\x062\\x18\\x03\\x0b\\x16\\x1e\\x03\\x0a+\" +\n\t\"\\x16\\x03\\x0a-?\\x03\\x0a#:\\x03\\x0a#\\x10\\x03\\x0a%$\\x03\\x0a>+\\x03\\x0a01\\x03\" +\n\t\"\\x0a1\\x10\\x03\\x0a\\x099\\x03\\x0a\\x0a\\x12\\x03\\x0a\\x19\\x1f\\x03\\x0a\\x19\\x12\" +\n\t\"\\x03\\x09*)\\x03\\x09-\\x16\\x03\\x09.1\\x03\\x09.2\\x03\\x09<\\x0e\\x03\\x09> \\x03\" +\n\t\"\\x093\\x12\\x03\\x09\\x0b\\x01\\x03\\x09\\x1c2\\x03\\x09\\x11\\x1c\\x03\\x09\\x15%\\x03\" +\n\t\"\\x08,&\\x03\\x08!\\x22\\x03\\x089(\\x03\\x08\\x0b\\x1a\\x03\\x08\\x0d2\\x03\\x08\\x0c\" +\n\t\"\\x04\\x03\\x08\\x0c\\x06\\x03\\x08\\x0c\\x1f\\x03\\x08\\x0c\\x0c\\x03\\x08\\x0f\\x1f\\x03\" +\n\t\"\\x08\\x0f\\x1d\\x03\\x08\\x00\\x14\\x03\\x08\\x03\\x14\\x03\\x08\\x06\\x16\\x03\\x08\\x1e\" +\n\t\"#\\x03\\x08\\x11\\x11\\x03\\x08\\x10\\x18\\x03\\x08\\x14(\\x03\\x07)\\x1e\\x03\\x07.1\" +\n\t\"\\x03\\x07 $\\x03\\x07 '\\x03\\x078\\x08\\x03\\x07\\x0d0\\x03\\x07\\x0f7\\x03\\x07\\x05#\" +\n\t\"\\x03\\x07\\x05\\x1a\\x03\\x07\\x1a7\\x03\\x07\\x1d-\\x03\\x07\\x17\\x10\\x03\\x06)\\x1f\" +\n\t\"\\x03\\x062\\x0b\\x03\\x066\\x16\\x03\\x06\\x09\\x11\\x03\\x09(\\x1e\\x03\\x07!5\\x03\" +\n\t\"\\x0b\\x11\\x16\\x03\\x0a/\\x04\\x03\\x0a,\\x1a\\x03\\x0b\\x173\\x03\\x0a,1\\x03\\x0a/5\" +\n\t\"\\x03\\x0a\\x221\\x03\\x0a\\x22\\x0d\\x03\\x0a?%\\x03\\x0a<,\\x03\\x0a?#\\x03\\x0a>\\x19\" +\n\t\"\\x03\\x0a\\x08&\\x03\\x0a\\x0b\\x0e\\x03\\x0a\\x0c:\\x03\\x0a\\x0c+\\x03\\x0a\\x03\\x22\" +\n\t\"\\x03\\x0a\\x06)\\x03\\x0a\\x11\\x10\\x03\\x0a\\x11\\x1a\\x03\\x0a\\x17-\\x03\\x0a\\x14(\" +\n\t\"\\x03\\x09)\\x1e\\x03\\x09/\\x09\\x03\\x09.\\x00\\x03\\x09,\\x07\\x03\\x09/*\\x03\\x09-9\" +\n\t\"\\x03\\x09\\x228\\x03\\x09%\\x09\\x03\\x09:\\x12\\x03\\x09;\\x1d\\x03\\x09?\\x06\\x03\" +\n\t\"\\x093%\\x03\\x096\\x05\\x03\\x096\\x08\\x03\\x097\\x02\\x03\\x09\\x07,\\x03\\x09\\x04,\" +\n\t\"\\x03\\x09\\x1f\\x16\\x03\\x09\\x11\\x03\\x03\\x09\\x11\\x12\\x03\\x09\\x168\\x03\\x08*\" +\n\t\"\\x05\\x03\\x08/2\\x03\\x084:\\x03\\x08\\x22+\\x03\\x08 0\\x03\\x08&\\x0a\\x03\\x08;\" +\n\t\"\\x10\\x03\\x08>$\\x03\\x08>\\x18\\x03\\x0829\\x03\\x082:\\x03\\x081,\\x03\\x081<\\x03\" +\n\t\"\\x081\\x1c\\x03\\x087#\\x03\\x087*\\x03\\x08\\x09'\\x03\\x08\\x00\\x1d\\x03\\x08\\x05-\" +\n\t\"\\x03\\x08\\x1f4\\x03\\x08\\x1d\\x04\\x03\\x08\\x16\\x0f\\x03\\x07*7\\x03\\x07'!\\x03\" +\n\t\"\\x07%\\x1b\\x03\\x077\\x0c\\x03\\x07\\x0c1\\x03\\x07\\x0c.\\x03\\x07\\x00\\x06\\x03\\x07\" +\n\t\"\\x01\\x02\\x03\\x07\\x010\\x03\\x07\\x06=\\x03\\x07\\x01\\x03\\x03\\x07\\x01\\x13\\x03\" +\n\t\"\\x07\\x06\\x06\\x03\\x07\\x05\\x0a\\x03\\x07\\x1f\\x09\\x03\\x07\\x17:\\x03\\x06*1\\x03\" +\n\t\"\\x06-\\x1d\\x03\\x06\\x223\\x03\\x062:\\x03\\x060$\\x03\\x066\\x1e\\x03\\x064\\x12\\x03\" +\n\t\"\\x0645\\x03\\x06\\x0b\\x00\\x03\\x06\\x0b7\\x03\\x06\\x07\\x1f\\x03\\x06\\x15\\x12\\x03\" +\n\t\"\\x0c\\x05\\x0f\\x03\\x0b+\\x0b\\x03\\x0b+-\\x03\\x06\\x16\\x1b\\x03\\x06\\x15\\x17\\x03\" +\n\t\"\\x89\\xca\\xea\\x03\\x89\\xca\\xe8\\x03\\x0c8\\x10\\x03\\x0c8\\x01\\x03\\x0c8\\x0f\\x03\" +\n\t\"\\x0d8%\\x03\\x0d8!\\x03\\x0c8-\\x03\\x0c8/\\x03\\x0c8+\\x03\\x0c87\\x03\\x0c85\\x03\" +\n\t\"\\x0c9\\x09\\x03\\x0c9\\x0d\\x03\\x0c9\\x0f\\x03\\x0c9\\x0b\\x03\\xcfu\\x0c\\x03\\xcfu\" +\n\t\"\\x0f\\x03\\xcfu\\x0e\\x03\\xcfu\\x09\\x03\\x0c9\\x10\\x03\\x0d9\\x0c\\x03\\xcf`;\\x03\" +\n\t\"\\xcf`>\\x03\\xcf`9\\x03\\xcf`8\\x03\\xcf`7\\x03\\xcf`*\\x03\\xcf`-\\x03\\xcf`,\\x03\" +\n\t\"\\x0d\\x1b\\x1a\\x03\\x0d\\x1b&\\x03\\x0c=.\\x03\\x0c=%\\x03\\x0c>\\x1e\\x03\\x0c>\\x14\" +\n\t\"\\x03\\x0c?\\x06\\x03\\x0c?\\x0b\\x03\\x0c?\\x0c\\x03\\x0c?\\x0d\\x03\\x0c?\\x02\\x03\" +\n\t\"\\x0c>\\x0f\\x03\\x0c>\\x08\\x03\\x0c>\\x09\\x03\\x0c>,\\x03\\x0c>\\x0c\\x03\\x0c?\\x13\" +\n\t\"\\x03\\x0c?\\x16\\x03\\x0c?\\x15\\x03\\x0c?\\x1c\\x03\\x0c?\\x1f\\x03\\x0c?\\x1d\\x03\" +\n\t\"\\x0c?\\x1a\\x03\\x0c?\\x17\\x03\\x0c?\\x08\\x03\\x0c?\\x09\\x03\\x0c?\\x0e\\x03\\x0c?\" +\n\t\"\\x04\\x03\\x0c?\\x05\\x03\\x0c<?\\x03\\x0c=\\x00\\x03\\x0c=\\x06\\x03\\x0c=\\x05\\x03\" +\n\t\"\\x0c=\\x0c\\x03\\x0c=\\x0f\\x03\\x0c=\\x0d\\x03\\x0c=\\x0b\\x03\\x0c=\\x07\\x03\\x0c=\" +\n\t\"\\x19\\x03\\x0c=\\x15\\x03\\x0c=\\x11\\x03\\x0c=1\\x03\\x0c=3\\x03\\x0c=0\\x03\\x0c=>\" +\n\t\"\\x03\\x0c=2\\x03\\x0c=6\\x03\\x0c<\\x07\\x03\\x0c<\\x05\\x03\\x0e:!\\x03\\x0e:#\\x03\" +\n\t\"\\x0e8\\x09\\x03\\x0e:&\\x03\\x0e8\\x0b\\x03\\x0e:$\\x03\\x0e:,\\x03\\x0e8\\x1a\\x03\" +\n\t\"\\x0e8\\x1e\\x03\\x0e:*\\x03\\x0e:7\\x03\\x0e:5\\x03\\x0e:;\\x03\\x0e:\\x15\\x03\\x0e:<\" +\n\t\"\\x03\\x0e:4\\x03\\x0e:'\\x03\\x0e:-\\x03\\x0e:%\\x03\\x0e:?\\x03\\x0e:=\\x03\\x0e:)\" +\n\t\"\\x03\\x0e:/\\x03\\xcfs'\\x03\\x0d=\\x0f\\x03\\x0d+*\\x03\\x0d99\\x03\\x0d9;\\x03\\x0d9\" +\n\t\"?\\x03\\x0d)\\x0d\\x03\\x0d(%\\x02\\x01\\x18\\x02\\x01(\\x02\\x01\\x1e\\x03\\x0f$!\\x03\" +\n\t\"\\x0f87\\x03\\x0f4\\x0e\\x03\\x0f5\\x1d\\x03\\x06'\\x03\\x03\\x0f\\x08\\x18\\x03\\x0f\" +\n\t\"\\x0d\\x1b\\x03\\x0e2=\\x03\\x0e;\\x08\\x03\\x0e:\\x0b\\x03\\x0e\\x06$\\x03\\x0e\\x0d)\" +\n\t\"\\x03\\x0e\\x16\\x1f\\x03\\x0e\\x16\\x1b\\x03\\x0d$\\x0a\\x03\\x05,\\x1d\\x03\\x0d. \\x03\" +\n\t\"\\x0d.#\\x03\\x0c(/\\x03\\x09%\\x02\\x03\\x0d90\\x03\\x0d\\x0e4\\x03\\x0d\\x0d\\x0f\\x03\" +\n\t\"\\x0c#\\x00\\x03\\x0c,\\x1e\\x03\\x0c2\\x0e\\x03\\x0c\\x01\\x17\\x03\\x0c\\x09:\\x03\\x0e\" +\n\t\"\\x173\\x03\\x0c\\x08\\x03\\x03\\x0c\\x11\\x07\\x03\\x0c\\x10\\x18\\x03\\x0c\\x1f\\x1c\" +\n\t\"\\x03\\x0c\\x19\\x0e\\x03\\x0c\\x1a\\x1f\\x03\\x0f0>\\x03\\x0b->\\x03\\x0b<+\\x03\\x0b8\" +\n\t\"\\x13\\x03\\x0b\\x043\\x03\\x0b\\x14\\x03\\x03\\x0b\\x16%\\x03\\x0d\\x22&\\x03\\x0b\\x1a\" +\n\t\"\\x1a\\x03\\x0b\\x1a\\x04\\x03\\x0a%9\\x03\\x0a&2\\x03\\x0a&0\\x03\\x0a!\\x1a\\x03\\x0a!\" +\n\t\"7\\x03\\x0a5\\x10\\x03\\x0a=4\\x03\\x0a?\\x0e\\x03\\x0a>\\x10\\x03\\x0a\\x00 \\x03\\x0a\" +\n\t\"\\x0f:\\x03\\x0a\\x0f9\\x03\\x0a\\x0b\\x0a\\x03\\x0a\\x17%\\x03\\x0a\\x1b-\\x03\\x09-\" +\n\t\"\\x1a\\x03\\x09,4\\x03\\x09.,\\x03\\x09)\\x09\\x03\\x096!\\x03\\x091\\x1f\\x03\\x093\" +\n\t\"\\x16\\x03\\x0c+\\x1f\\x03\\x098 \\x03\\x098=\\x03\\x0c(\\x1a\\x03\\x0c(\\x16\\x03\\x09\" +\n\t\"\\x0a+\\x03\\x09\\x16\\x12\\x03\\x09\\x13\\x0e\\x03\\x09\\x153\\x03\\x08)!\\x03\\x09\\x1a\" +\n\t\"\\x01\\x03\\x09\\x18\\x01\\x03\\x08%#\\x03\\x08>\\x22\\x03\\x08\\x05%\\x03\\x08\\x02*\" +\n\t\"\\x03\\x08\\x15;\\x03\\x08\\x1b7\\x03\\x0f\\x07\\x1d\\x03\\x0f\\x04\\x03\\x03\\x070\\x0c\" +\n\t\"\\x03\\x07;\\x0b\\x03\\x07\\x08\\x17\\x03\\x07\\x12\\x06\\x03\\x06/-\\x03\\x0671\\x03\" +\n\t\"\\x065+\\x03\\x06>7\\x03\\x06\\x049\\x03\\x05+\\x1e\\x03\\x05,\\x17\\x03\\x05 \\x1d\\x03\" +\n\t\"\\x05\\x22\\x05\\x03\\x050\\x1d\"\n\n// lookup returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *idnaTrie) lookup(s []byte) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn idnaValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := idnaIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := idnaIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = idnaIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := idnaIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = idnaIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = idnaIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *idnaTrie) lookupUnsafe(s []byte) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn idnaValues[c0]\n\t}\n\ti := idnaIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = idnaIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = idnaIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// lookupString returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *idnaTrie) lookupString(s string) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn idnaValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := idnaIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := idnaIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = idnaIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := idnaIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = idnaIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = idnaIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *idnaTrie) lookupStringUnsafe(s string) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn idnaValues[c0]\n\t}\n\ti := idnaIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = idnaIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = idnaIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// idnaTrie. Total size: 29052 bytes (28.37 KiB). Checksum: ef06e7ecc26f36dd.\ntype idnaTrie struct{}\n\nfunc newIdnaTrie(i int) *idnaTrie {\n\treturn &idnaTrie{}\n}\n\n// lookupValue determines the type of block n and looks up the value for b.\nfunc (t *idnaTrie) lookupValue(n uint32, b byte) uint16 {\n\tswitch {\n\tcase n < 125:\n\t\treturn uint16(idnaValues[n<<6+uint32(b)])\n\tdefault:\n\t\tn -= 125\n\t\treturn uint16(idnaSparse.lookup(n, b))\n\t}\n}\n\n// idnaValues: 127 blocks, 8128 entries, 16256 bytes\n// The third block is the zero block.\nvar idnaValues = [8128]uint16{\n\t// Block 0x0, offset 0x0\n\t0x00: 0x0080, 0x01: 0x0080, 0x02: 0x0080, 0x03: 0x0080, 0x04: 0x0080, 0x05: 0x0080,\n\t0x06: 0x0080, 0x07: 0x0080, 0x08: 0x0080, 0x09: 0x0080, 0x0a: 0x0080, 0x0b: 0x0080,\n\t0x0c: 0x0080, 0x0d: 0x0080, 0x0e: 0x0080, 0x0f: 0x0080, 0x10: 0x0080, 0x11: 0x0080,\n\t0x12: 0x0080, 0x13: 0x0080, 0x14: 0x0080, 0x15: 0x0080, 0x16: 0x0080, 0x17: 0x0080,\n\t0x18: 0x0080, 0x19: 0x0080, 0x1a: 0x0080, 0x1b: 0x0080, 0x1c: 0x0080, 0x1d: 0x0080,\n\t0x1e: 0x0080, 0x1f: 0x0080, 0x20: 0x0080, 0x21: 0x0080, 0x22: 0x0080, 0x23: 0x0080,\n\t0x24: 0x0080, 0x25: 0x0080, 0x26: 0x0080, 0x27: 0x0080, 0x28: 0x0080, 0x29: 0x0080,\n\t0x2a: 0x0080, 0x2b: 0x0080, 0x2c: 0x0080, 0x2d: 0x0008, 0x2e: 0x0008, 0x2f: 0x0080,\n\t0x30: 0x0008, 0x31: 0x0008, 0x32: 0x0008, 0x33: 0x0008, 0x34: 0x0008, 0x35: 0x0008,\n\t0x36: 0x0008, 0x37: 0x0008, 0x38: 0x0008, 0x39: 0x0008, 0x3a: 0x0080, 0x3b: 0x0080,\n\t0x3c: 0x0080, 0x3d: 0x0080, 0x3e: 0x0080, 0x3f: 0x0080,\n\t// Block 0x1, offset 0x40\n\t0x40: 0x0080, 0x41: 0xe105, 0x42: 0xe105, 0x43: 0xe105, 0x44: 0xe105, 0x45: 0xe105,\n\t0x46: 0xe105, 0x47: 0xe105, 0x48: 0xe105, 0x49: 0xe105, 0x4a: 0xe105, 0x4b: 0xe105,\n\t0x4c: 0xe105, 0x4d: 0xe105, 0x4e: 0xe105, 0x4f: 0xe105, 0x50: 0xe105, 0x51: 0xe105,\n\t0x52: 0xe105, 0x53: 0xe105, 0x54: 0xe105, 0x55: 0xe105, 0x56: 0xe105, 0x57: 0xe105,\n\t0x58: 0xe105, 0x59: 0xe105, 0x5a: 0xe105, 0x5b: 0x0080, 0x5c: 0x0080, 0x5d: 0x0080,\n\t0x5e: 0x0080, 0x5f: 0x0080, 0x60: 0x0080, 0x61: 0x0008, 0x62: 0x0008, 0x63: 0x0008,\n\t0x64: 0x0008, 0x65: 0x0008, 0x66: 0x0008, 0x67: 0x0008, 0x68: 0x0008, 0x69: 0x0008,\n\t0x6a: 0x0008, 0x6b: 0x0008, 0x6c: 0x0008, 0x6d: 0x0008, 0x6e: 0x0008, 0x6f: 0x0008,\n\t0x70: 0x0008, 0x71: 0x0008, 0x72: 0x0008, 0x73: 0x0008, 0x74: 0x0008, 0x75: 0x0008,\n\t0x76: 0x0008, 0x77: 0x0008, 0x78: 0x0008, 0x79: 0x0008, 0x7a: 0x0008, 0x7b: 0x0080,\n\t0x7c: 0x0080, 0x7d: 0x0080, 0x7e: 0x0080, 0x7f: 0x0080,\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040,\n\t0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040,\n\t0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040,\n\t0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040,\n\t0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040,\n\t0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x000a, 0xe1: 0x0018, 0xe2: 0x0018, 0xe3: 0x0018,\n\t0xe4: 0x0018, 0xe5: 0x0018, 0xe6: 0x0018, 0xe7: 0x0018, 0xe8: 0x001a, 0xe9: 0x0018,\n\t0xea: 0x0039, 0xeb: 0x0018, 0xec: 0x0018, 0xed: 0x03c0, 0xee: 0x0018, 0xef: 0x004a,\n\t0xf0: 0x0018, 0xf1: 0x0018, 0xf2: 0x0069, 0xf3: 0x0079, 0xf4: 0x008a, 0xf5: 0x0005,\n\t0xf6: 0x0018, 0xf7: 0x0008, 0xf8: 0x00aa, 0xf9: 0x00c9, 0xfa: 0x00d9, 0xfb: 0x0018,\n\t0xfc: 0x00e9, 0xfd: 0x0119, 0xfe: 0x0149, 0xff: 0x0018,\n\t// Block 0x4, offset 0x100\n\t0x100: 0xe00d, 0x101: 0x0008, 0x102: 0xe00d, 0x103: 0x0008, 0x104: 0xe00d, 0x105: 0x0008,\n\t0x106: 0xe00d, 0x107: 0x0008, 0x108: 0xe00d, 0x109: 0x0008, 0x10a: 0xe00d, 0x10b: 0x0008,\n\t0x10c: 0xe00d, 0x10d: 0x0008, 0x10e: 0xe00d, 0x10f: 0x0008, 0x110: 0xe00d, 0x111: 0x0008,\n\t0x112: 0xe00d, 0x113: 0x0008, 0x114: 0xe00d, 0x115: 0x0008, 0x116: 0xe00d, 0x117: 0x0008,\n\t0x118: 0xe00d, 0x119: 0x0008, 0x11a: 0xe00d, 0x11b: 0x0008, 0x11c: 0xe00d, 0x11d: 0x0008,\n\t0x11e: 0xe00d, 0x11f: 0x0008, 0x120: 0xe00d, 0x121: 0x0008, 0x122: 0xe00d, 0x123: 0x0008,\n\t0x124: 0xe00d, 0x125: 0x0008, 0x126: 0xe00d, 0x127: 0x0008, 0x128: 0xe00d, 0x129: 0x0008,\n\t0x12a: 0xe00d, 0x12b: 0x0008, 0x12c: 0xe00d, 0x12d: 0x0008, 0x12e: 0xe00d, 0x12f: 0x0008,\n\t0x130: 0x0179, 0x131: 0x0008, 0x132: 0x0035, 0x133: 0x004d, 0x134: 0xe00d, 0x135: 0x0008,\n\t0x136: 0xe00d, 0x137: 0x0008, 0x138: 0x0008, 0x139: 0xe01d, 0x13a: 0x0008, 0x13b: 0xe03d,\n\t0x13c: 0x0008, 0x13d: 0xe01d, 0x13e: 0x0008, 0x13f: 0x0199,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x0199, 0x141: 0xe01d, 0x142: 0x0008, 0x143: 0xe03d, 0x144: 0x0008, 0x145: 0xe01d,\n\t0x146: 0x0008, 0x147: 0xe07d, 0x148: 0x0008, 0x149: 0x01b9, 0x14a: 0xe00d, 0x14b: 0x0008,\n\t0x14c: 0xe00d, 0x14d: 0x0008, 0x14e: 0xe00d, 0x14f: 0x0008, 0x150: 0xe00d, 0x151: 0x0008,\n\t0x152: 0xe00d, 0x153: 0x0008, 0x154: 0xe00d, 0x155: 0x0008, 0x156: 0xe00d, 0x157: 0x0008,\n\t0x158: 0xe00d, 0x159: 0x0008, 0x15a: 0xe00d, 0x15b: 0x0008, 0x15c: 0xe00d, 0x15d: 0x0008,\n\t0x15e: 0xe00d, 0x15f: 0x0008, 0x160: 0xe00d, 0x161: 0x0008, 0x162: 0xe00d, 0x163: 0x0008,\n\t0x164: 0xe00d, 0x165: 0x0008, 0x166: 0xe00d, 0x167: 0x0008, 0x168: 0xe00d, 0x169: 0x0008,\n\t0x16a: 0xe00d, 0x16b: 0x0008, 0x16c: 0xe00d, 0x16d: 0x0008, 0x16e: 0xe00d, 0x16f: 0x0008,\n\t0x170: 0xe00d, 0x171: 0x0008, 0x172: 0xe00d, 0x173: 0x0008, 0x174: 0xe00d, 0x175: 0x0008,\n\t0x176: 0xe00d, 0x177: 0x0008, 0x178: 0x0065, 0x179: 0xe01d, 0x17a: 0x0008, 0x17b: 0xe03d,\n\t0x17c: 0x0008, 0x17d: 0xe01d, 0x17e: 0x0008, 0x17f: 0x01d9,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x0008, 0x181: 0x007d, 0x182: 0xe00d, 0x183: 0x0008, 0x184: 0xe00d, 0x185: 0x0008,\n\t0x186: 0x007d, 0x187: 0xe07d, 0x188: 0x0008, 0x189: 0x0095, 0x18a: 0x00ad, 0x18b: 0xe03d,\n\t0x18c: 0x0008, 0x18d: 0x0008, 0x18e: 0x00c5, 0x18f: 0x00dd, 0x190: 0x00f5, 0x191: 0xe01d,\n\t0x192: 0x0008, 0x193: 0x010d, 0x194: 0x0125, 0x195: 0x0008, 0x196: 0x013d, 0x197: 0x013d,\n\t0x198: 0xe00d, 0x199: 0x0008, 0x19a: 0x0008, 0x19b: 0x0008, 0x19c: 0x010d, 0x19d: 0x0155,\n\t0x19e: 0x0008, 0x19f: 0x016d, 0x1a0: 0xe00d, 0x1a1: 0x0008, 0x1a2: 0xe00d, 0x1a3: 0x0008,\n\t0x1a4: 0xe00d, 0x1a5: 0x0008, 0x1a6: 0x0185, 0x1a7: 0xe07d, 0x1a8: 0x0008, 0x1a9: 0x019d,\n\t0x1aa: 0x0008, 0x1ab: 0x0008, 0x1ac: 0xe00d, 0x1ad: 0x0008, 0x1ae: 0x0185, 0x1af: 0xe0fd,\n\t0x1b0: 0x0008, 0x1b1: 0x01b5, 0x1b2: 0x01cd, 0x1b3: 0xe03d, 0x1b4: 0x0008, 0x1b5: 0xe01d,\n\t0x1b6: 0x0008, 0x1b7: 0x01e5, 0x1b8: 0xe00d, 0x1b9: 0x0008, 0x1ba: 0x0008, 0x1bb: 0x0008,\n\t0x1bc: 0xe00d, 0x1bd: 0x0008, 0x1be: 0x0008, 0x1bf: 0x0008,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x0008, 0x1c1: 0x0008, 0x1c2: 0x0008, 0x1c3: 0x0008, 0x1c4: 0x01e9, 0x1c5: 0x01e9,\n\t0x1c6: 0x01e9, 0x1c7: 0x01fd, 0x1c8: 0x0215, 0x1c9: 0x022d, 0x1ca: 0x0245, 0x1cb: 0x025d,\n\t0x1cc: 0x0275, 0x1cd: 0xe01d, 0x1ce: 0x0008, 0x1cf: 0xe0fd, 0x1d0: 0x0008, 0x1d1: 0xe01d,\n\t0x1d2: 0x0008, 0x1d3: 0xe03d, 0x1d4: 0x0008, 0x1d5: 0xe01d, 0x1d6: 0x0008, 0x1d7: 0xe07d,\n\t0x1d8: 0x0008, 0x1d9: 0xe01d, 0x1da: 0x0008, 0x1db: 0xe03d, 0x1dc: 0x0008, 0x1dd: 0x0008,\n\t0x1de: 0xe00d, 0x1df: 0x0008, 0x1e0: 0xe00d, 0x1e1: 0x0008, 0x1e2: 0xe00d, 0x1e3: 0x0008,\n\t0x1e4: 0xe00d, 0x1e5: 0x0008, 0x1e6: 0xe00d, 0x1e7: 0x0008, 0x1e8: 0xe00d, 0x1e9: 0x0008,\n\t0x1ea: 0xe00d, 0x1eb: 0x0008, 0x1ec: 0xe00d, 0x1ed: 0x0008, 0x1ee: 0xe00d, 0x1ef: 0x0008,\n\t0x1f0: 0x0008, 0x1f1: 0x028d, 0x1f2: 0x02a5, 0x1f3: 0x02bd, 0x1f4: 0xe00d, 0x1f5: 0x0008,\n\t0x1f6: 0x02d5, 0x1f7: 0x02ed, 0x1f8: 0xe00d, 0x1f9: 0x0008, 0x1fa: 0xe00d, 0x1fb: 0x0008,\n\t0x1fc: 0xe00d, 0x1fd: 0x0008, 0x1fe: 0xe00d, 0x1ff: 0x0008,\n\t// Block 0x8, offset 0x200\n\t0x200: 0xe00d, 0x201: 0x0008, 0x202: 0xe00d, 0x203: 0x0008, 0x204: 0xe00d, 0x205: 0x0008,\n\t0x206: 0xe00d, 0x207: 0x0008, 0x208: 0xe00d, 0x209: 0x0008, 0x20a: 0xe00d, 0x20b: 0x0008,\n\t0x20c: 0xe00d, 0x20d: 0x0008, 0x20e: 0xe00d, 0x20f: 0x0008, 0x210: 0xe00d, 0x211: 0x0008,\n\t0x212: 0xe00d, 0x213: 0x0008, 0x214: 0xe00d, 0x215: 0x0008, 0x216: 0xe00d, 0x217: 0x0008,\n\t0x218: 0xe00d, 0x219: 0x0008, 0x21a: 0xe00d, 0x21b: 0x0008, 0x21c: 0xe00d, 0x21d: 0x0008,\n\t0x21e: 0xe00d, 0x21f: 0x0008, 0x220: 0x0305, 0x221: 0x0008, 0x222: 0xe00d, 0x223: 0x0008,\n\t0x224: 0xe00d, 0x225: 0x0008, 0x226: 0xe00d, 0x227: 0x0008, 0x228: 0xe00d, 0x229: 0x0008,\n\t0x22a: 0xe00d, 0x22b: 0x0008, 0x22c: 0xe00d, 0x22d: 0x0008, 0x22e: 0xe00d, 0x22f: 0x0008,\n\t0x230: 0xe00d, 0x231: 0x0008, 0x232: 0xe00d, 0x233: 0x0008, 0x234: 0x0008, 0x235: 0x0008,\n\t0x236: 0x0008, 0x237: 0x0008, 0x238: 0x0008, 0x239: 0x0008, 0x23a: 0x0209, 0x23b: 0xe03d,\n\t0x23c: 0x0008, 0x23d: 0x031d, 0x23e: 0x0229, 0x23f: 0x0008,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x0008, 0x241: 0x0008, 0x242: 0x0018, 0x243: 0x0018, 0x244: 0x0018, 0x245: 0x0018,\n\t0x246: 0x0008, 0x247: 0x0008, 0x248: 0x0008, 0x249: 0x0008, 0x24a: 0x0008, 0x24b: 0x0008,\n\t0x24c: 0x0008, 0x24d: 0x0008, 0x24e: 0x0008, 0x24f: 0x0008, 0x250: 0x0008, 0x251: 0x0008,\n\t0x252: 0x0018, 0x253: 0x0018, 0x254: 0x0018, 0x255: 0x0018, 0x256: 0x0018, 0x257: 0x0018,\n\t0x258: 0x029a, 0x259: 0x02ba, 0x25a: 0x02da, 0x25b: 0x02fa, 0x25c: 0x031a, 0x25d: 0x033a,\n\t0x25e: 0x0018, 0x25f: 0x0018, 0x260: 0x03ad, 0x261: 0x0359, 0x262: 0x01d9, 0x263: 0x0369,\n\t0x264: 0x03c5, 0x265: 0x0018, 0x266: 0x0018, 0x267: 0x0018, 0x268: 0x0018, 0x269: 0x0018,\n\t0x26a: 0x0018, 0x26b: 0x0018, 0x26c: 0x0008, 0x26d: 0x0018, 0x26e: 0x0008, 0x26f: 0x0018,\n\t0x270: 0x0018, 0x271: 0x0018, 0x272: 0x0018, 0x273: 0x0018, 0x274: 0x0018, 0x275: 0x0018,\n\t0x276: 0x0018, 0x277: 0x0018, 0x278: 0x0018, 0x279: 0x0018, 0x27a: 0x0018, 0x27b: 0x0018,\n\t0x27c: 0x0018, 0x27d: 0x0018, 0x27e: 0x0018, 0x27f: 0x0018,\n\t// Block 0xa, offset 0x280\n\t0x280: 0x03dd, 0x281: 0x03dd, 0x282: 0x3308, 0x283: 0x03f5, 0x284: 0x0379, 0x285: 0x040d,\n\t0x286: 0x3308, 0x287: 0x3308, 0x288: 0x3308, 0x289: 0x3308, 0x28a: 0x3308, 0x28b: 0x3308,\n\t0x28c: 0x3308, 0x28d: 0x3308, 0x28e: 0x3308, 0x28f: 0x33c0, 0x290: 0x3308, 0x291: 0x3308,\n\t0x292: 0x3308, 0x293: 0x3308, 0x294: 0x3308, 0x295: 0x3308, 0x296: 0x3308, 0x297: 0x3308,\n\t0x298: 0x3308, 0x299: 0x3308, 0x29a: 0x3308, 0x29b: 0x3308, 0x29c: 0x3308, 0x29d: 0x3308,\n\t0x29e: 0x3308, 0x29f: 0x3308, 0x2a0: 0x3308, 0x2a1: 0x3308, 0x2a2: 0x3308, 0x2a3: 0x3308,\n\t0x2a4: 0x3308, 0x2a5: 0x3308, 0x2a6: 0x3308, 0x2a7: 0x3308, 0x2a8: 0x3308, 0x2a9: 0x3308,\n\t0x2aa: 0x3308, 0x2ab: 0x3308, 0x2ac: 0x3308, 0x2ad: 0x3308, 0x2ae: 0x3308, 0x2af: 0x3308,\n\t0x2b0: 0xe00d, 0x2b1: 0x0008, 0x2b2: 0xe00d, 0x2b3: 0x0008, 0x2b4: 0x0425, 0x2b5: 0x0008,\n\t0x2b6: 0xe00d, 0x2b7: 0x0008, 0x2b8: 0x0040, 0x2b9: 0x0040, 0x2ba: 0x03a2, 0x2bb: 0x0008,\n\t0x2bc: 0x0008, 0x2bd: 0x0008, 0x2be: 0x03c2, 0x2bf: 0x043d,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0x0040, 0x2c1: 0x0040, 0x2c2: 0x0040, 0x2c3: 0x0040, 0x2c4: 0x008a, 0x2c5: 0x03d2,\n\t0x2c6: 0xe155, 0x2c7: 0x0455, 0x2c8: 0xe12d, 0x2c9: 0xe13d, 0x2ca: 0xe12d, 0x2cb: 0x0040,\n\t0x2cc: 0x03dd, 0x2cd: 0x0040, 0x2ce: 0x046d, 0x2cf: 0x0485, 0x2d0: 0x0008, 0x2d1: 0xe105,\n\t0x2d2: 0xe105, 0x2d3: 0xe105, 0x2d4: 0xe105, 0x2d5: 0xe105, 0x2d6: 0xe105, 0x2d7: 0xe105,\n\t0x2d8: 0xe105, 0x2d9: 0xe105, 0x2da: 0xe105, 0x2db: 0xe105, 0x2dc: 0xe105, 0x2dd: 0xe105,\n\t0x2de: 0xe105, 0x2df: 0xe105, 0x2e0: 0x049d, 0x2e1: 0x049d, 0x2e2: 0x0040, 0x2e3: 0x049d,\n\t0x2e4: 0x049d, 0x2e5: 0x049d, 0x2e6: 0x049d, 0x2e7: 0x049d, 0x2e8: 0x049d, 0x2e9: 0x049d,\n\t0x2ea: 0x049d, 0x2eb: 0x049d, 0x2ec: 0x0008, 0x2ed: 0x0008, 0x2ee: 0x0008, 0x2ef: 0x0008,\n\t0x2f0: 0x0008, 0x2f1: 0x0008, 0x2f2: 0x0008, 0x2f3: 0x0008, 0x2f4: 0x0008, 0x2f5: 0x0008,\n\t0x2f6: 0x0008, 0x2f7: 0x0008, 0x2f8: 0x0008, 0x2f9: 0x0008, 0x2fa: 0x0008, 0x2fb: 0x0008,\n\t0x2fc: 0x0008, 0x2fd: 0x0008, 0x2fe: 0x0008, 0x2ff: 0x0008,\n\t// Block 0xc, offset 0x300\n\t0x300: 0x0008, 0x301: 0x0008, 0x302: 0xe00f, 0x303: 0x0008, 0x304: 0x0008, 0x305: 0x0008,\n\t0x306: 0x0008, 0x307: 0x0008, 0x308: 0x0008, 0x309: 0x0008, 0x30a: 0x0008, 0x30b: 0x0008,\n\t0x30c: 0x0008, 0x30d: 0x0008, 0x30e: 0x0008, 0x30f: 0xe0c5, 0x310: 0x04b5, 0x311: 0x04cd,\n\t0x312: 0xe0bd, 0x313: 0xe0f5, 0x314: 0xe0fd, 0x315: 0xe09d, 0x316: 0xe0b5, 0x317: 0x0008,\n\t0x318: 0xe00d, 0x319: 0x0008, 0x31a: 0xe00d, 0x31b: 0x0008, 0x31c: 0xe00d, 0x31d: 0x0008,\n\t0x31e: 0xe00d, 0x31f: 0x0008, 0x320: 0xe00d, 0x321: 0x0008, 0x322: 0xe00d, 0x323: 0x0008,\n\t0x324: 0xe00d, 0x325: 0x0008, 0x326: 0xe00d, 0x327: 0x0008, 0x328: 0xe00d, 0x329: 0x0008,\n\t0x32a: 0xe00d, 0x32b: 0x0008, 0x32c: 0xe00d, 0x32d: 0x0008, 0x32e: 0xe00d, 0x32f: 0x0008,\n\t0x330: 0x04e5, 0x331: 0xe185, 0x332: 0xe18d, 0x333: 0x0008, 0x334: 0x04fd, 0x335: 0x03dd,\n\t0x336: 0x0018, 0x337: 0xe07d, 0x338: 0x0008, 0x339: 0xe1d5, 0x33a: 0xe00d, 0x33b: 0x0008,\n\t0x33c: 0x0008, 0x33d: 0x0515, 0x33e: 0x052d, 0x33f: 0x052d,\n\t// Block 0xd, offset 0x340\n\t0x340: 0x0008, 0x341: 0x0008, 0x342: 0x0008, 0x343: 0x0008, 0x344: 0x0008, 0x345: 0x0008,\n\t0x346: 0x0008, 0x347: 0x0008, 0x348: 0x0008, 0x349: 0x0008, 0x34a: 0x0008, 0x34b: 0x0008,\n\t0x34c: 0x0008, 0x34d: 0x0008, 0x34e: 0x0008, 0x34f: 0x0008, 0x350: 0x0008, 0x351: 0x0008,\n\t0x352: 0x0008, 0x353: 0x0008, 0x354: 0x0008, 0x355: 0x0008, 0x356: 0x0008, 0x357: 0x0008,\n\t0x358: 0x0008, 0x359: 0x0008, 0x35a: 0x0008, 0x35b: 0x0008, 0x35c: 0x0008, 0x35d: 0x0008,\n\t0x35e: 0x0008, 0x35f: 0x0008, 0x360: 0xe00d, 0x361: 0x0008, 0x362: 0xe00d, 0x363: 0x0008,\n\t0x364: 0xe00d, 0x365: 0x0008, 0x366: 0xe00d, 0x367: 0x0008, 0x368: 0xe00d, 0x369: 0x0008,\n\t0x36a: 0xe00d, 0x36b: 0x0008, 0x36c: 0xe00d, 0x36d: 0x0008, 0x36e: 0xe00d, 0x36f: 0x0008,\n\t0x370: 0xe00d, 0x371: 0x0008, 0x372: 0xe00d, 0x373: 0x0008, 0x374: 0xe00d, 0x375: 0x0008,\n\t0x376: 0xe00d, 0x377: 0x0008, 0x378: 0xe00d, 0x379: 0x0008, 0x37a: 0xe00d, 0x37b: 0x0008,\n\t0x37c: 0xe00d, 0x37d: 0x0008, 0x37e: 0xe00d, 0x37f: 0x0008,\n\t// Block 0xe, offset 0x380\n\t0x380: 0xe00d, 0x381: 0x0008, 0x382: 0x0018, 0x383: 0x3308, 0x384: 0x3308, 0x385: 0x3308,\n\t0x386: 0x3308, 0x387: 0x3308, 0x388: 0x3318, 0x389: 0x3318, 0x38a: 0xe00d, 0x38b: 0x0008,\n\t0x38c: 0xe00d, 0x38d: 0x0008, 0x38e: 0xe00d, 0x38f: 0x0008, 0x390: 0xe00d, 0x391: 0x0008,\n\t0x392: 0xe00d, 0x393: 0x0008, 0x394: 0xe00d, 0x395: 0x0008, 0x396: 0xe00d, 0x397: 0x0008,\n\t0x398: 0xe00d, 0x399: 0x0008, 0x39a: 0xe00d, 0x39b: 0x0008, 0x39c: 0xe00d, 0x39d: 0x0008,\n\t0x39e: 0xe00d, 0x39f: 0x0008, 0x3a0: 0xe00d, 0x3a1: 0x0008, 0x3a2: 0xe00d, 0x3a3: 0x0008,\n\t0x3a4: 0xe00d, 0x3a5: 0x0008, 0x3a6: 0xe00d, 0x3a7: 0x0008, 0x3a8: 0xe00d, 0x3a9: 0x0008,\n\t0x3aa: 0xe00d, 0x3ab: 0x0008, 0x3ac: 0xe00d, 0x3ad: 0x0008, 0x3ae: 0xe00d, 0x3af: 0x0008,\n\t0x3b0: 0xe00d, 0x3b1: 0x0008, 0x3b2: 0xe00d, 0x3b3: 0x0008, 0x3b4: 0xe00d, 0x3b5: 0x0008,\n\t0x3b6: 0xe00d, 0x3b7: 0x0008, 0x3b8: 0xe00d, 0x3b9: 0x0008, 0x3ba: 0xe00d, 0x3bb: 0x0008,\n\t0x3bc: 0xe00d, 0x3bd: 0x0008, 0x3be: 0xe00d, 0x3bf: 0x0008,\n\t// Block 0xf, offset 0x3c0\n\t0x3c0: 0x0040, 0x3c1: 0xe01d, 0x3c2: 0x0008, 0x3c3: 0xe03d, 0x3c4: 0x0008, 0x3c5: 0xe01d,\n\t0x3c6: 0x0008, 0x3c7: 0xe07d, 0x3c8: 0x0008, 0x3c9: 0xe01d, 0x3ca: 0x0008, 0x3cb: 0xe03d,\n\t0x3cc: 0x0008, 0x3cd: 0xe01d, 0x3ce: 0x0008, 0x3cf: 0x0008, 0x3d0: 0xe00d, 0x3d1: 0x0008,\n\t0x3d2: 0xe00d, 0x3d3: 0x0008, 0x3d4: 0xe00d, 0x3d5: 0x0008, 0x3d6: 0xe00d, 0x3d7: 0x0008,\n\t0x3d8: 0xe00d, 0x3d9: 0x0008, 0x3da: 0xe00d, 0x3db: 0x0008, 0x3dc: 0xe00d, 0x3dd: 0x0008,\n\t0x3de: 0xe00d, 0x3df: 0x0008, 0x3e0: 0xe00d, 0x3e1: 0x0008, 0x3e2: 0xe00d, 0x3e3: 0x0008,\n\t0x3e4: 0xe00d, 0x3e5: 0x0008, 0x3e6: 0xe00d, 0x3e7: 0x0008, 0x3e8: 0xe00d, 0x3e9: 0x0008,\n\t0x3ea: 0xe00d, 0x3eb: 0x0008, 0x3ec: 0xe00d, 0x3ed: 0x0008, 0x3ee: 0xe00d, 0x3ef: 0x0008,\n\t0x3f0: 0xe00d, 0x3f1: 0x0008, 0x3f2: 0xe00d, 0x3f3: 0x0008, 0x3f4: 0xe00d, 0x3f5: 0x0008,\n\t0x3f6: 0xe00d, 0x3f7: 0x0008, 0x3f8: 0xe00d, 0x3f9: 0x0008, 0x3fa: 0xe00d, 0x3fb: 0x0008,\n\t0x3fc: 0xe00d, 0x3fd: 0x0008, 0x3fe: 0xe00d, 0x3ff: 0x0008,\n\t// Block 0x10, offset 0x400\n\t0x400: 0xe00d, 0x401: 0x0008, 0x402: 0xe00d, 0x403: 0x0008, 0x404: 0xe00d, 0x405: 0x0008,\n\t0x406: 0xe00d, 0x407: 0x0008, 0x408: 0xe00d, 0x409: 0x0008, 0x40a: 0xe00d, 0x40b: 0x0008,\n\t0x40c: 0xe00d, 0x40d: 0x0008, 0x40e: 0xe00d, 0x40f: 0x0008, 0x410: 0xe00d, 0x411: 0x0008,\n\t0x412: 0xe00d, 0x413: 0x0008, 0x414: 0xe00d, 0x415: 0x0008, 0x416: 0xe00d, 0x417: 0x0008,\n\t0x418: 0xe00d, 0x419: 0x0008, 0x41a: 0xe00d, 0x41b: 0x0008, 0x41c: 0xe00d, 0x41d: 0x0008,\n\t0x41e: 0xe00d, 0x41f: 0x0008, 0x420: 0xe00d, 0x421: 0x0008, 0x422: 0xe00d, 0x423: 0x0008,\n\t0x424: 0xe00d, 0x425: 0x0008, 0x426: 0xe00d, 0x427: 0x0008, 0x428: 0xe00d, 0x429: 0x0008,\n\t0x42a: 0xe00d, 0x42b: 0x0008, 0x42c: 0xe00d, 0x42d: 0x0008, 0x42e: 0xe00d, 0x42f: 0x0008,\n\t0x430: 0x0040, 0x431: 0x03f5, 0x432: 0x03f5, 0x433: 0x03f5, 0x434: 0x03f5, 0x435: 0x03f5,\n\t0x436: 0x03f5, 0x437: 0x03f5, 0x438: 0x03f5, 0x439: 0x03f5, 0x43a: 0x03f5, 0x43b: 0x03f5,\n\t0x43c: 0x03f5, 0x43d: 0x03f5, 0x43e: 0x03f5, 0x43f: 0x03f5,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x0840, 0x441: 0x0840, 0x442: 0x0840, 0x443: 0x0840, 0x444: 0x0840, 0x445: 0x0840,\n\t0x446: 0x0018, 0x447: 0x0018, 0x448: 0x0818, 0x449: 0x0018, 0x44a: 0x0018, 0x44b: 0x0818,\n\t0x44c: 0x0018, 0x44d: 0x0818, 0x44e: 0x0018, 0x44f: 0x0018, 0x450: 0x3308, 0x451: 0x3308,\n\t0x452: 0x3308, 0x453: 0x3308, 0x454: 0x3308, 0x455: 0x3308, 0x456: 0x3308, 0x457: 0x3308,\n\t0x458: 0x3308, 0x459: 0x3308, 0x45a: 0x3308, 0x45b: 0x0818, 0x45c: 0x0b40, 0x45d: 0x0040,\n\t0x45e: 0x0818, 0x45f: 0x0818, 0x460: 0x0a08, 0x461: 0x0808, 0x462: 0x0c08, 0x463: 0x0c08,\n\t0x464: 0x0c08, 0x465: 0x0c08, 0x466: 0x0a08, 0x467: 0x0c08, 0x468: 0x0a08, 0x469: 0x0c08,\n\t0x46a: 0x0a08, 0x46b: 0x0a08, 0x46c: 0x0a08, 0x46d: 0x0a08, 0x46e: 0x0a08, 0x46f: 0x0c08,\n\t0x470: 0x0c08, 0x471: 0x0c08, 0x472: 0x0c08, 0x473: 0x0a08, 0x474: 0x0a08, 0x475: 0x0a08,\n\t0x476: 0x0a08, 0x477: 0x0a08, 0x478: 0x0a08, 0x479: 0x0a08, 0x47a: 0x0a08, 0x47b: 0x0a08,\n\t0x47c: 0x0a08, 0x47d: 0x0a08, 0x47e: 0x0a08, 0x47f: 0x0a08,\n\t// Block 0x12, offset 0x480\n\t0x480: 0x0818, 0x481: 0x0a08, 0x482: 0x0a08, 0x483: 0x0a08, 0x484: 0x0a08, 0x485: 0x0a08,\n\t0x486: 0x0a08, 0x487: 0x0a08, 0x488: 0x0c08, 0x489: 0x0a08, 0x48a: 0x0a08, 0x48b: 0x3308,\n\t0x48c: 0x3308, 0x48d: 0x3308, 0x48e: 0x3308, 0x48f: 0x3308, 0x490: 0x3308, 0x491: 0x3308,\n\t0x492: 0x3308, 0x493: 0x3308, 0x494: 0x3308, 0x495: 0x3308, 0x496: 0x3308, 0x497: 0x3308,\n\t0x498: 0x3308, 0x499: 0x3308, 0x49a: 0x3308, 0x49b: 0x3308, 0x49c: 0x3308, 0x49d: 0x3308,\n\t0x49e: 0x3308, 0x49f: 0x3308, 0x4a0: 0x0808, 0x4a1: 0x0808, 0x4a2: 0x0808, 0x4a3: 0x0808,\n\t0x4a4: 0x0808, 0x4a5: 0x0808, 0x4a6: 0x0808, 0x4a7: 0x0808, 0x4a8: 0x0808, 0x4a9: 0x0808,\n\t0x4aa: 0x0018, 0x4ab: 0x0818, 0x4ac: 0x0818, 0x4ad: 0x0818, 0x4ae: 0x0a08, 0x4af: 0x0a08,\n\t0x4b0: 0x3308, 0x4b1: 0x0c08, 0x4b2: 0x0c08, 0x4b3: 0x0c08, 0x4b4: 0x0808, 0x4b5: 0x0429,\n\t0x4b6: 0x0451, 0x4b7: 0x0479, 0x4b8: 0x04a1, 0x4b9: 0x0a08, 0x4ba: 0x0a08, 0x4bb: 0x0a08,\n\t0x4bc: 0x0a08, 0x4bd: 0x0a08, 0x4be: 0x0a08, 0x4bf: 0x0a08,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0x0c08, 0x4c1: 0x0a08, 0x4c2: 0x0a08, 0x4c3: 0x0c08, 0x4c4: 0x0c08, 0x4c5: 0x0c08,\n\t0x4c6: 0x0c08, 0x4c7: 0x0c08, 0x4c8: 0x0c08, 0x4c9: 0x0c08, 0x4ca: 0x0c08, 0x4cb: 0x0c08,\n\t0x4cc: 0x0a08, 0x4cd: 0x0c08, 0x4ce: 0x0a08, 0x4cf: 0x0c08, 0x4d0: 0x0a08, 0x4d1: 0x0a08,\n\t0x4d2: 0x0c08, 0x4d3: 0x0c08, 0x4d4: 0x0818, 0x4d5: 0x0c08, 0x4d6: 0x3308, 0x4d7: 0x3308,\n\t0x4d8: 0x3308, 0x4d9: 0x3308, 0x4da: 0x3308, 0x4db: 0x3308, 0x4dc: 0x3308, 0x4dd: 0x0840,\n\t0x4de: 0x0018, 0x4df: 0x3308, 0x4e0: 0x3308, 0x4e1: 0x3308, 0x4e2: 0x3308, 0x4e3: 0x3308,\n\t0x4e4: 0x3308, 0x4e5: 0x0808, 0x4e6: 0x0808, 0x4e7: 0x3308, 0x4e8: 0x3308, 0x4e9: 0x0018,\n\t0x4ea: 0x3308, 0x4eb: 0x3308, 0x4ec: 0x3308, 0x4ed: 0x3308, 0x4ee: 0x0c08, 0x4ef: 0x0c08,\n\t0x4f0: 0x0008, 0x4f1: 0x0008, 0x4f2: 0x0008, 0x4f3: 0x0008, 0x4f4: 0x0008, 0x4f5: 0x0008,\n\t0x4f6: 0x0008, 0x4f7: 0x0008, 0x4f8: 0x0008, 0x4f9: 0x0008, 0x4fa: 0x0a08, 0x4fb: 0x0a08,\n\t0x4fc: 0x0a08, 0x4fd: 0x0808, 0x4fe: 0x0808, 0x4ff: 0x0a08,\n\t// Block 0x14, offset 0x500\n\t0x500: 0x0818, 0x501: 0x0818, 0x502: 0x0818, 0x503: 0x0818, 0x504: 0x0818, 0x505: 0x0818,\n\t0x506: 0x0818, 0x507: 0x0818, 0x508: 0x0818, 0x509: 0x0818, 0x50a: 0x0818, 0x50b: 0x0818,\n\t0x50c: 0x0818, 0x50d: 0x0818, 0x50e: 0x0040, 0x50f: 0x0b40, 0x510: 0x0c08, 0x511: 0x3308,\n\t0x512: 0x0a08, 0x513: 0x0a08, 0x514: 0x0a08, 0x515: 0x0c08, 0x516: 0x0c08, 0x517: 0x0c08,\n\t0x518: 0x0c08, 0x519: 0x0c08, 0x51a: 0x0a08, 0x51b: 0x0a08, 0x51c: 0x0a08, 0x51d: 0x0a08,\n\t0x51e: 0x0c08, 0x51f: 0x0a08, 0x520: 0x0a08, 0x521: 0x0a08, 0x522: 0x0a08, 0x523: 0x0a08,\n\t0x524: 0x0a08, 0x525: 0x0a08, 0x526: 0x0a08, 0x527: 0x0a08, 0x528: 0x0c08, 0x529: 0x0a08,\n\t0x52a: 0x0c08, 0x52b: 0x0a08, 0x52c: 0x0c08, 0x52d: 0x0a08, 0x52e: 0x0a08, 0x52f: 0x0c08,\n\t0x530: 0x3308, 0x531: 0x3308, 0x532: 0x3308, 0x533: 0x3308, 0x534: 0x3308, 0x535: 0x3308,\n\t0x536: 0x3308, 0x537: 0x3308, 0x538: 0x3308, 0x539: 0x3308, 0x53a: 0x3308, 0x53b: 0x3308,\n\t0x53c: 0x3308, 0x53d: 0x3308, 0x53e: 0x3308, 0x53f: 0x3308,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x0c08, 0x541: 0x0a08, 0x542: 0x0a08, 0x543: 0x0a08, 0x544: 0x0a08, 0x545: 0x0a08,\n\t0x546: 0x0c08, 0x547: 0x0c08, 0x548: 0x0a08, 0x549: 0x0c08, 0x54a: 0x0a08, 0x54b: 0x0a08,\n\t0x54c: 0x0a08, 0x54d: 0x0a08, 0x54e: 0x0a08, 0x54f: 0x0a08, 0x550: 0x0a08, 0x551: 0x0a08,\n\t0x552: 0x0a08, 0x553: 0x0a08, 0x554: 0x0c08, 0x555: 0x0a08, 0x556: 0x0808, 0x557: 0x0808,\n\t0x558: 0x0808, 0x559: 0x3308, 0x55a: 0x3308, 0x55b: 0x3308, 0x55c: 0x0040, 0x55d: 0x0040,\n\t0x55e: 0x0818, 0x55f: 0x0040, 0x560: 0x0a08, 0x561: 0x0808, 0x562: 0x0a08, 0x563: 0x0a08,\n\t0x564: 0x0a08, 0x565: 0x0a08, 0x566: 0x0808, 0x567: 0x0c08, 0x568: 0x0a08, 0x569: 0x0c08,\n\t0x56a: 0x0c08, 0x56b: 0x0040, 0x56c: 0x0040, 0x56d: 0x0040, 0x56e: 0x0040, 0x56f: 0x0040,\n\t0x570: 0x0040, 0x571: 0x0040, 0x572: 0x0040, 0x573: 0x0040, 0x574: 0x0040, 0x575: 0x0040,\n\t0x576: 0x0040, 0x577: 0x0040, 0x578: 0x0040, 0x579: 0x0040, 0x57a: 0x0040, 0x57b: 0x0040,\n\t0x57c: 0x0040, 0x57d: 0x0040, 0x57e: 0x0040, 0x57f: 0x0040,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x3008, 0x581: 0x3308, 0x582: 0x3308, 0x583: 0x3308, 0x584: 0x3308, 0x585: 0x3308,\n\t0x586: 0x3308, 0x587: 0x3308, 0x588: 0x3308, 0x589: 0x3008, 0x58a: 0x3008, 0x58b: 0x3008,\n\t0x58c: 0x3008, 0x58d: 0x3b08, 0x58e: 0x3008, 0x58f: 0x3008, 0x590: 0x0008, 0x591: 0x3308,\n\t0x592: 0x3308, 0x593: 0x3308, 0x594: 0x3308, 0x595: 0x3308, 0x596: 0x3308, 0x597: 0x3308,\n\t0x598: 0x04c9, 0x599: 0x0501, 0x59a: 0x0539, 0x59b: 0x0571, 0x59c: 0x05a9, 0x59d: 0x05e1,\n\t0x59e: 0x0619, 0x59f: 0x0651, 0x5a0: 0x0008, 0x5a1: 0x0008, 0x5a2: 0x3308, 0x5a3: 0x3308,\n\t0x5a4: 0x0018, 0x5a5: 0x0018, 0x5a6: 0x0008, 0x5a7: 0x0008, 0x5a8: 0x0008, 0x5a9: 0x0008,\n\t0x5aa: 0x0008, 0x5ab: 0x0008, 0x5ac: 0x0008, 0x5ad: 0x0008, 0x5ae: 0x0008, 0x5af: 0x0008,\n\t0x5b0: 0x0018, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008,\n\t0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008,\n\t0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x0008, 0x5c1: 0x3308, 0x5c2: 0x3008, 0x5c3: 0x3008, 0x5c4: 0x0040, 0x5c5: 0x0008,\n\t0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, 0x5cb: 0x0008,\n\t0x5cc: 0x0008, 0x5cd: 0x0040, 0x5ce: 0x0040, 0x5cf: 0x0008, 0x5d0: 0x0008, 0x5d1: 0x0040,\n\t0x5d2: 0x0040, 0x5d3: 0x0008, 0x5d4: 0x0008, 0x5d5: 0x0008, 0x5d6: 0x0008, 0x5d7: 0x0008,\n\t0x5d8: 0x0008, 0x5d9: 0x0008, 0x5da: 0x0008, 0x5db: 0x0008, 0x5dc: 0x0008, 0x5dd: 0x0008,\n\t0x5de: 0x0008, 0x5df: 0x0008, 0x5e0: 0x0008, 0x5e1: 0x0008, 0x5e2: 0x0008, 0x5e3: 0x0008,\n\t0x5e4: 0x0008, 0x5e5: 0x0008, 0x5e6: 0x0008, 0x5e7: 0x0008, 0x5e8: 0x0008, 0x5e9: 0x0040,\n\t0x5ea: 0x0008, 0x5eb: 0x0008, 0x5ec: 0x0008, 0x5ed: 0x0008, 0x5ee: 0x0008, 0x5ef: 0x0008,\n\t0x5f0: 0x0008, 0x5f1: 0x0040, 0x5f2: 0x0008, 0x5f3: 0x0040, 0x5f4: 0x0040, 0x5f5: 0x0040,\n\t0x5f6: 0x0008, 0x5f7: 0x0008, 0x5f8: 0x0008, 0x5f9: 0x0008, 0x5fa: 0x0040, 0x5fb: 0x0040,\n\t0x5fc: 0x3308, 0x5fd: 0x0008, 0x5fe: 0x3008, 0x5ff: 0x3008,\n\t// Block 0x18, offset 0x600\n\t0x600: 0x3008, 0x601: 0x3308, 0x602: 0x3308, 0x603: 0x3308, 0x604: 0x3308, 0x605: 0x0040,\n\t0x606: 0x0040, 0x607: 0x3008, 0x608: 0x3008, 0x609: 0x0040, 0x60a: 0x0040, 0x60b: 0x3008,\n\t0x60c: 0x3008, 0x60d: 0x3b08, 0x60e: 0x0008, 0x60f: 0x0040, 0x610: 0x0040, 0x611: 0x0040,\n\t0x612: 0x0040, 0x613: 0x0040, 0x614: 0x0040, 0x615: 0x0040, 0x616: 0x0040, 0x617: 0x3008,\n\t0x618: 0x0040, 0x619: 0x0040, 0x61a: 0x0040, 0x61b: 0x0040, 0x61c: 0x0689, 0x61d: 0x06c1,\n\t0x61e: 0x0040, 0x61f: 0x06f9, 0x620: 0x0008, 0x621: 0x0008, 0x622: 0x3308, 0x623: 0x3308,\n\t0x624: 0x0040, 0x625: 0x0040, 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008,\n\t0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008,\n\t0x630: 0x0008, 0x631: 0x0008, 0x632: 0x0018, 0x633: 0x0018, 0x634: 0x0018, 0x635: 0x0018,\n\t0x636: 0x0018, 0x637: 0x0018, 0x638: 0x0018, 0x639: 0x0018, 0x63a: 0x0018, 0x63b: 0x0018,\n\t0x63c: 0x0008, 0x63d: 0x0018, 0x63e: 0x0040, 0x63f: 0x0040,\n\t// Block 0x19, offset 0x640\n\t0x640: 0x0040, 0x641: 0x3308, 0x642: 0x3308, 0x643: 0x3008, 0x644: 0x0040, 0x645: 0x0008,\n\t0x646: 0x0008, 0x647: 0x0008, 0x648: 0x0008, 0x649: 0x0008, 0x64a: 0x0008, 0x64b: 0x0040,\n\t0x64c: 0x0040, 0x64d: 0x0040, 0x64e: 0x0040, 0x64f: 0x0008, 0x650: 0x0008, 0x651: 0x0040,\n\t0x652: 0x0040, 0x653: 0x0008, 0x654: 0x0008, 0x655: 0x0008, 0x656: 0x0008, 0x657: 0x0008,\n\t0x658: 0x0008, 0x659: 0x0008, 0x65a: 0x0008, 0x65b: 0x0008, 0x65c: 0x0008, 0x65d: 0x0008,\n\t0x65e: 0x0008, 0x65f: 0x0008, 0x660: 0x0008, 0x661: 0x0008, 0x662: 0x0008, 0x663: 0x0008,\n\t0x664: 0x0008, 0x665: 0x0008, 0x666: 0x0008, 0x667: 0x0008, 0x668: 0x0008, 0x669: 0x0040,\n\t0x66a: 0x0008, 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008,\n\t0x670: 0x0008, 0x671: 0x0040, 0x672: 0x0008, 0x673: 0x0731, 0x674: 0x0040, 0x675: 0x0008,\n\t0x676: 0x0769, 0x677: 0x0040, 0x678: 0x0008, 0x679: 0x0008, 0x67a: 0x0040, 0x67b: 0x0040,\n\t0x67c: 0x3308, 0x67d: 0x0040, 0x67e: 0x3008, 0x67f: 0x3008,\n\t// Block 0x1a, offset 0x680\n\t0x680: 0x3008, 0x681: 0x3308, 0x682: 0x3308, 0x683: 0x0040, 0x684: 0x0040, 0x685: 0x0040,\n\t0x686: 0x0040, 0x687: 0x3308, 0x688: 0x3308, 0x689: 0x0040, 0x68a: 0x0040, 0x68b: 0x3308,\n\t0x68c: 0x3308, 0x68d: 0x3b08, 0x68e: 0x0040, 0x68f: 0x0040, 0x690: 0x0040, 0x691: 0x3308,\n\t0x692: 0x0040, 0x693: 0x0040, 0x694: 0x0040, 0x695: 0x0040, 0x696: 0x0040, 0x697: 0x0040,\n\t0x698: 0x0040, 0x699: 0x07a1, 0x69a: 0x07d9, 0x69b: 0x0811, 0x69c: 0x0008, 0x69d: 0x0040,\n\t0x69e: 0x0849, 0x69f: 0x0040, 0x6a0: 0x0040, 0x6a1: 0x0040, 0x6a2: 0x0040, 0x6a3: 0x0040,\n\t0x6a4: 0x0040, 0x6a5: 0x0040, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a8: 0x0008, 0x6a9: 0x0008,\n\t0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, 0x6ae: 0x0008, 0x6af: 0x0008,\n\t0x6b0: 0x3308, 0x6b1: 0x3308, 0x6b2: 0x0008, 0x6b3: 0x0008, 0x6b4: 0x0008, 0x6b5: 0x3308,\n\t0x6b6: 0x0040, 0x6b7: 0x0040, 0x6b8: 0x0040, 0x6b9: 0x0040, 0x6ba: 0x0040, 0x6bb: 0x0040,\n\t0x6bc: 0x0040, 0x6bd: 0x0040, 0x6be: 0x0040, 0x6bf: 0x0040,\n\t// Block 0x1b, offset 0x6c0\n\t0x6c0: 0x0040, 0x6c1: 0x3308, 0x6c2: 0x3308, 0x6c3: 0x3008, 0x6c4: 0x0040, 0x6c5: 0x0008,\n\t0x6c6: 0x0008, 0x6c7: 0x0008, 0x6c8: 0x0008, 0x6c9: 0x0008, 0x6ca: 0x0008, 0x6cb: 0x0008,\n\t0x6cc: 0x0008, 0x6cd: 0x0008, 0x6ce: 0x0040, 0x6cf: 0x0008, 0x6d0: 0x0008, 0x6d1: 0x0008,\n\t0x6d2: 0x0040, 0x6d3: 0x0008, 0x6d4: 0x0008, 0x6d5: 0x0008, 0x6d6: 0x0008, 0x6d7: 0x0008,\n\t0x6d8: 0x0008, 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, 0x6dc: 0x0008, 0x6dd: 0x0008,\n\t0x6de: 0x0008, 0x6df: 0x0008, 0x6e0: 0x0008, 0x6e1: 0x0008, 0x6e2: 0x0008, 0x6e3: 0x0008,\n\t0x6e4: 0x0008, 0x6e5: 0x0008, 0x6e6: 0x0008, 0x6e7: 0x0008, 0x6e8: 0x0008, 0x6e9: 0x0040,\n\t0x6ea: 0x0008, 0x6eb: 0x0008, 0x6ec: 0x0008, 0x6ed: 0x0008, 0x6ee: 0x0008, 0x6ef: 0x0008,\n\t0x6f0: 0x0008, 0x6f1: 0x0040, 0x6f2: 0x0008, 0x6f3: 0x0008, 0x6f4: 0x0040, 0x6f5: 0x0008,\n\t0x6f6: 0x0008, 0x6f7: 0x0008, 0x6f8: 0x0008, 0x6f9: 0x0008, 0x6fa: 0x0040, 0x6fb: 0x0040,\n\t0x6fc: 0x3308, 0x6fd: 0x0008, 0x6fe: 0x3008, 0x6ff: 0x3008,\n\t// Block 0x1c, offset 0x700\n\t0x700: 0x3008, 0x701: 0x3308, 0x702: 0x3308, 0x703: 0x3308, 0x704: 0x3308, 0x705: 0x3308,\n\t0x706: 0x0040, 0x707: 0x3308, 0x708: 0x3308, 0x709: 0x3008, 0x70a: 0x0040, 0x70b: 0x3008,\n\t0x70c: 0x3008, 0x70d: 0x3b08, 0x70e: 0x0040, 0x70f: 0x0040, 0x710: 0x0008, 0x711: 0x0040,\n\t0x712: 0x0040, 0x713: 0x0040, 0x714: 0x0040, 0x715: 0x0040, 0x716: 0x0040, 0x717: 0x0040,\n\t0x718: 0x0040, 0x719: 0x0040, 0x71a: 0x0040, 0x71b: 0x0040, 0x71c: 0x0040, 0x71d: 0x0040,\n\t0x71e: 0x0040, 0x71f: 0x0040, 0x720: 0x0008, 0x721: 0x0008, 0x722: 0x3308, 0x723: 0x3308,\n\t0x724: 0x0040, 0x725: 0x0040, 0x726: 0x0008, 0x727: 0x0008, 0x728: 0x0008, 0x729: 0x0008,\n\t0x72a: 0x0008, 0x72b: 0x0008, 0x72c: 0x0008, 0x72d: 0x0008, 0x72e: 0x0008, 0x72f: 0x0008,\n\t0x730: 0x0018, 0x731: 0x0018, 0x732: 0x0040, 0x733: 0x0040, 0x734: 0x0040, 0x735: 0x0040,\n\t0x736: 0x0040, 0x737: 0x0040, 0x738: 0x0040, 0x739: 0x0008, 0x73a: 0x3308, 0x73b: 0x3308,\n\t0x73c: 0x3308, 0x73d: 0x3308, 0x73e: 0x3308, 0x73f: 0x3308,\n\t// Block 0x1d, offset 0x740\n\t0x740: 0x0040, 0x741: 0x3308, 0x742: 0x3008, 0x743: 0x3008, 0x744: 0x0040, 0x745: 0x0008,\n\t0x746: 0x0008, 0x747: 0x0008, 0x748: 0x0008, 0x749: 0x0008, 0x74a: 0x0008, 0x74b: 0x0008,\n\t0x74c: 0x0008, 0x74d: 0x0040, 0x74e: 0x0040, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0040,\n\t0x752: 0x0040, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008,\n\t0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008,\n\t0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008,\n\t0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0040,\n\t0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008,\n\t0x770: 0x0008, 0x771: 0x0040, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0040, 0x775: 0x0008,\n\t0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0040, 0x77b: 0x0040,\n\t0x77c: 0x3308, 0x77d: 0x0008, 0x77e: 0x3008, 0x77f: 0x3308,\n\t// Block 0x1e, offset 0x780\n\t0x780: 0x3008, 0x781: 0x3308, 0x782: 0x3308, 0x783: 0x3308, 0x784: 0x3308, 0x785: 0x0040,\n\t0x786: 0x0040, 0x787: 0x3008, 0x788: 0x3008, 0x789: 0x0040, 0x78a: 0x0040, 0x78b: 0x3008,\n\t0x78c: 0x3008, 0x78d: 0x3b08, 0x78e: 0x0040, 0x78f: 0x0040, 0x790: 0x0040, 0x791: 0x0040,\n\t0x792: 0x0040, 0x793: 0x0040, 0x794: 0x0040, 0x795: 0x0040, 0x796: 0x3308, 0x797: 0x3008,\n\t0x798: 0x0040, 0x799: 0x0040, 0x79a: 0x0040, 0x79b: 0x0040, 0x79c: 0x0881, 0x79d: 0x08b9,\n\t0x79e: 0x0040, 0x79f: 0x0008, 0x7a0: 0x0008, 0x7a1: 0x0008, 0x7a2: 0x3308, 0x7a3: 0x3308,\n\t0x7a4: 0x0040, 0x7a5: 0x0040, 0x7a6: 0x0008, 0x7a7: 0x0008, 0x7a8: 0x0008, 0x7a9: 0x0008,\n\t0x7aa: 0x0008, 0x7ab: 0x0008, 0x7ac: 0x0008, 0x7ad: 0x0008, 0x7ae: 0x0008, 0x7af: 0x0008,\n\t0x7b0: 0x0018, 0x7b1: 0x0008, 0x7b2: 0x0018, 0x7b3: 0x0018, 0x7b4: 0x0018, 0x7b5: 0x0018,\n\t0x7b6: 0x0018, 0x7b7: 0x0018, 0x7b8: 0x0040, 0x7b9: 0x0040, 0x7ba: 0x0040, 0x7bb: 0x0040,\n\t0x7bc: 0x0040, 0x7bd: 0x0040, 0x7be: 0x0040, 0x7bf: 0x0040,\n\t// Block 0x1f, offset 0x7c0\n\t0x7c0: 0x0040, 0x7c1: 0x0040, 0x7c2: 0x3308, 0x7c3: 0x0008, 0x7c4: 0x0040, 0x7c5: 0x0008,\n\t0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, 0x7c9: 0x0008, 0x7ca: 0x0008, 0x7cb: 0x0040,\n\t0x7cc: 0x0040, 0x7cd: 0x0040, 0x7ce: 0x0008, 0x7cf: 0x0008, 0x7d0: 0x0008, 0x7d1: 0x0040,\n\t0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0040, 0x7d7: 0x0040,\n\t0x7d8: 0x0040, 0x7d9: 0x0008, 0x7da: 0x0008, 0x7db: 0x0040, 0x7dc: 0x0008, 0x7dd: 0x0040,\n\t0x7de: 0x0008, 0x7df: 0x0008, 0x7e0: 0x0040, 0x7e1: 0x0040, 0x7e2: 0x0040, 0x7e3: 0x0008,\n\t0x7e4: 0x0008, 0x7e5: 0x0040, 0x7e6: 0x0040, 0x7e7: 0x0040, 0x7e8: 0x0008, 0x7e9: 0x0008,\n\t0x7ea: 0x0008, 0x7eb: 0x0040, 0x7ec: 0x0040, 0x7ed: 0x0040, 0x7ee: 0x0008, 0x7ef: 0x0008,\n\t0x7f0: 0x0008, 0x7f1: 0x0008, 0x7f2: 0x0008, 0x7f3: 0x0008, 0x7f4: 0x0008, 0x7f5: 0x0008,\n\t0x7f6: 0x0008, 0x7f7: 0x0008, 0x7f8: 0x0008, 0x7f9: 0x0008, 0x7fa: 0x0040, 0x7fb: 0x0040,\n\t0x7fc: 0x0040, 0x7fd: 0x0040, 0x7fe: 0x3008, 0x7ff: 0x3008,\n\t// Block 0x20, offset 0x800\n\t0x800: 0x3308, 0x801: 0x3008, 0x802: 0x3008, 0x803: 0x3008, 0x804: 0x3008, 0x805: 0x0040,\n\t0x806: 0x3308, 0x807: 0x3308, 0x808: 0x3308, 0x809: 0x0040, 0x80a: 0x3308, 0x80b: 0x3308,\n\t0x80c: 0x3308, 0x80d: 0x3b08, 0x80e: 0x0040, 0x80f: 0x0040, 0x810: 0x0040, 0x811: 0x0040,\n\t0x812: 0x0040, 0x813: 0x0040, 0x814: 0x0040, 0x815: 0x3308, 0x816: 0x3308, 0x817: 0x0040,\n\t0x818: 0x0008, 0x819: 0x0008, 0x81a: 0x0008, 0x81b: 0x0040, 0x81c: 0x0040, 0x81d: 0x0040,\n\t0x81e: 0x0040, 0x81f: 0x0040, 0x820: 0x0008, 0x821: 0x0008, 0x822: 0x3308, 0x823: 0x3308,\n\t0x824: 0x0040, 0x825: 0x0040, 0x826: 0x0008, 0x827: 0x0008, 0x828: 0x0008, 0x829: 0x0008,\n\t0x82a: 0x0008, 0x82b: 0x0008, 0x82c: 0x0008, 0x82d: 0x0008, 0x82e: 0x0008, 0x82f: 0x0008,\n\t0x830: 0x0040, 0x831: 0x0040, 0x832: 0x0040, 0x833: 0x0040, 0x834: 0x0040, 0x835: 0x0040,\n\t0x836: 0x0040, 0x837: 0x0040, 0x838: 0x0018, 0x839: 0x0018, 0x83a: 0x0018, 0x83b: 0x0018,\n\t0x83c: 0x0018, 0x83d: 0x0018, 0x83e: 0x0018, 0x83f: 0x0018,\n\t// Block 0x21, offset 0x840\n\t0x840: 0x0008, 0x841: 0x3308, 0x842: 0x3008, 0x843: 0x3008, 0x844: 0x0040, 0x845: 0x0008,\n\t0x846: 0x0008, 0x847: 0x0008, 0x848: 0x0008, 0x849: 0x0008, 0x84a: 0x0008, 0x84b: 0x0008,\n\t0x84c: 0x0008, 0x84d: 0x0040, 0x84e: 0x0008, 0x84f: 0x0008, 0x850: 0x0008, 0x851: 0x0040,\n\t0x852: 0x0008, 0x853: 0x0008, 0x854: 0x0008, 0x855: 0x0008, 0x856: 0x0008, 0x857: 0x0008,\n\t0x858: 0x0008, 0x859: 0x0008, 0x85a: 0x0008, 0x85b: 0x0008, 0x85c: 0x0008, 0x85d: 0x0008,\n\t0x85e: 0x0008, 0x85f: 0x0008, 0x860: 0x0008, 0x861: 0x0008, 0x862: 0x0008, 0x863: 0x0008,\n\t0x864: 0x0008, 0x865: 0x0008, 0x866: 0x0008, 0x867: 0x0008, 0x868: 0x0008, 0x869: 0x0040,\n\t0x86a: 0x0008, 0x86b: 0x0008, 0x86c: 0x0008, 0x86d: 0x0008, 0x86e: 0x0008, 0x86f: 0x0008,\n\t0x870: 0x0008, 0x871: 0x0008, 0x872: 0x0008, 0x873: 0x0008, 0x874: 0x0040, 0x875: 0x0008,\n\t0x876: 0x0008, 0x877: 0x0008, 0x878: 0x0008, 0x879: 0x0008, 0x87a: 0x0040, 0x87b: 0x0040,\n\t0x87c: 0x3308, 0x87d: 0x0008, 0x87e: 0x3008, 0x87f: 0x3308,\n\t// Block 0x22, offset 0x880\n\t0x880: 0x3008, 0x881: 0x3008, 0x882: 0x3008, 0x883: 0x3008, 0x884: 0x3008, 0x885: 0x0040,\n\t0x886: 0x3308, 0x887: 0x3008, 0x888: 0x3008, 0x889: 0x0040, 0x88a: 0x3008, 0x88b: 0x3008,\n\t0x88c: 0x3308, 0x88d: 0x3b08, 0x88e: 0x0040, 0x88f: 0x0040, 0x890: 0x0040, 0x891: 0x0040,\n\t0x892: 0x0040, 0x893: 0x0040, 0x894: 0x0040, 0x895: 0x3008, 0x896: 0x3008, 0x897: 0x0040,\n\t0x898: 0x0040, 0x899: 0x0040, 0x89a: 0x0040, 0x89b: 0x0040, 0x89c: 0x0040, 0x89d: 0x0040,\n\t0x89e: 0x0008, 0x89f: 0x0040, 0x8a0: 0x0008, 0x8a1: 0x0008, 0x8a2: 0x3308, 0x8a3: 0x3308,\n\t0x8a4: 0x0040, 0x8a5: 0x0040, 0x8a6: 0x0008, 0x8a7: 0x0008, 0x8a8: 0x0008, 0x8a9: 0x0008,\n\t0x8aa: 0x0008, 0x8ab: 0x0008, 0x8ac: 0x0008, 0x8ad: 0x0008, 0x8ae: 0x0008, 0x8af: 0x0008,\n\t0x8b0: 0x0040, 0x8b1: 0x0008, 0x8b2: 0x0008, 0x8b3: 0x0040, 0x8b4: 0x0040, 0x8b5: 0x0040,\n\t0x8b6: 0x0040, 0x8b7: 0x0040, 0x8b8: 0x0040, 0x8b9: 0x0040, 0x8ba: 0x0040, 0x8bb: 0x0040,\n\t0x8bc: 0x0040, 0x8bd: 0x0040, 0x8be: 0x0040, 0x8bf: 0x0040,\n\t// Block 0x23, offset 0x8c0\n\t0x8c0: 0x3008, 0x8c1: 0x3308, 0x8c2: 0x3308, 0x8c3: 0x3308, 0x8c4: 0x3308, 0x8c5: 0x0040,\n\t0x8c6: 0x3008, 0x8c7: 0x3008, 0x8c8: 0x3008, 0x8c9: 0x0040, 0x8ca: 0x3008, 0x8cb: 0x3008,\n\t0x8cc: 0x3008, 0x8cd: 0x3b08, 0x8ce: 0x0008, 0x8cf: 0x0018, 0x8d0: 0x0040, 0x8d1: 0x0040,\n\t0x8d2: 0x0040, 0x8d3: 0x0040, 0x8d4: 0x0008, 0x8d5: 0x0008, 0x8d6: 0x0008, 0x8d7: 0x3008,\n\t0x8d8: 0x0018, 0x8d9: 0x0018, 0x8da: 0x0018, 0x8db: 0x0018, 0x8dc: 0x0018, 0x8dd: 0x0018,\n\t0x8de: 0x0018, 0x8df: 0x0008, 0x8e0: 0x0008, 0x8e1: 0x0008, 0x8e2: 0x3308, 0x8e3: 0x3308,\n\t0x8e4: 0x0040, 0x8e5: 0x0040, 0x8e6: 0x0008, 0x8e7: 0x0008, 0x8e8: 0x0008, 0x8e9: 0x0008,\n\t0x8ea: 0x0008, 0x8eb: 0x0008, 0x8ec: 0x0008, 0x8ed: 0x0008, 0x8ee: 0x0008, 0x8ef: 0x0008,\n\t0x8f0: 0x0018, 0x8f1: 0x0018, 0x8f2: 0x0018, 0x8f3: 0x0018, 0x8f4: 0x0018, 0x8f5: 0x0018,\n\t0x8f6: 0x0018, 0x8f7: 0x0018, 0x8f8: 0x0018, 0x8f9: 0x0018, 0x8fa: 0x0008, 0x8fb: 0x0008,\n\t0x8fc: 0x0008, 0x8fd: 0x0008, 0x8fe: 0x0008, 0x8ff: 0x0008,\n\t// Block 0x24, offset 0x900\n\t0x900: 0x0040, 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0040, 0x904: 0x0008, 0x905: 0x0040,\n\t0x906: 0x0040, 0x907: 0x0008, 0x908: 0x0008, 0x909: 0x0040, 0x90a: 0x0008, 0x90b: 0x0040,\n\t0x90c: 0x0040, 0x90d: 0x0008, 0x90e: 0x0040, 0x90f: 0x0040, 0x910: 0x0040, 0x911: 0x0040,\n\t0x912: 0x0040, 0x913: 0x0040, 0x914: 0x0008, 0x915: 0x0008, 0x916: 0x0008, 0x917: 0x0008,\n\t0x918: 0x0040, 0x919: 0x0008, 0x91a: 0x0008, 0x91b: 0x0008, 0x91c: 0x0008, 0x91d: 0x0008,\n\t0x91e: 0x0008, 0x91f: 0x0008, 0x920: 0x0040, 0x921: 0x0008, 0x922: 0x0008, 0x923: 0x0008,\n\t0x924: 0x0040, 0x925: 0x0008, 0x926: 0x0040, 0x927: 0x0008, 0x928: 0x0040, 0x929: 0x0040,\n\t0x92a: 0x0008, 0x92b: 0x0008, 0x92c: 0x0040, 0x92d: 0x0008, 0x92e: 0x0008, 0x92f: 0x0008,\n\t0x930: 0x0008, 0x931: 0x3308, 0x932: 0x0008, 0x933: 0x0929, 0x934: 0x3308, 0x935: 0x3308,\n\t0x936: 0x3308, 0x937: 0x3308, 0x938: 0x3308, 0x939: 0x3308, 0x93a: 0x0040, 0x93b: 0x3308,\n\t0x93c: 0x3308, 0x93d: 0x0008, 0x93e: 0x0040, 0x93f: 0x0040,\n\t// Block 0x25, offset 0x940\n\t0x940: 0x0008, 0x941: 0x0008, 0x942: 0x0008, 0x943: 0x09d1, 0x944: 0x0008, 0x945: 0x0008,\n\t0x946: 0x0008, 0x947: 0x0008, 0x948: 0x0040, 0x949: 0x0008, 0x94a: 0x0008, 0x94b: 0x0008,\n\t0x94c: 0x0008, 0x94d: 0x0a09, 0x94e: 0x0008, 0x94f: 0x0008, 0x950: 0x0008, 0x951: 0x0008,\n\t0x952: 0x0a41, 0x953: 0x0008, 0x954: 0x0008, 0x955: 0x0008, 0x956: 0x0008, 0x957: 0x0a79,\n\t0x958: 0x0008, 0x959: 0x0008, 0x95a: 0x0008, 0x95b: 0x0008, 0x95c: 0x0ab1, 0x95d: 0x0008,\n\t0x95e: 0x0008, 0x95f: 0x0008, 0x960: 0x0008, 0x961: 0x0008, 0x962: 0x0008, 0x963: 0x0008,\n\t0x964: 0x0008, 0x965: 0x0008, 0x966: 0x0008, 0x967: 0x0008, 0x968: 0x0008, 0x969: 0x0ae9,\n\t0x96a: 0x0008, 0x96b: 0x0008, 0x96c: 0x0008, 0x96d: 0x0040, 0x96e: 0x0040, 0x96f: 0x0040,\n\t0x970: 0x0040, 0x971: 0x3308, 0x972: 0x3308, 0x973: 0x0b21, 0x974: 0x3308, 0x975: 0x0b59,\n\t0x976: 0x0b91, 0x977: 0x0bc9, 0x978: 0x0c19, 0x979: 0x0c51, 0x97a: 0x3308, 0x97b: 0x3308,\n\t0x97c: 0x3308, 0x97d: 0x3308, 0x97e: 0x3308, 0x97f: 0x3008,\n\t// Block 0x26, offset 0x980\n\t0x980: 0x3308, 0x981: 0x0ca1, 0x982: 0x3308, 0x983: 0x3308, 0x984: 0x3b08, 0x985: 0x0018,\n\t0x986: 0x3308, 0x987: 0x3308, 0x988: 0x0008, 0x989: 0x0008, 0x98a: 0x0008, 0x98b: 0x0008,\n\t0x98c: 0x0008, 0x98d: 0x3308, 0x98e: 0x3308, 0x98f: 0x3308, 0x990: 0x3308, 0x991: 0x3308,\n\t0x992: 0x3308, 0x993: 0x0cd9, 0x994: 0x3308, 0x995: 0x3308, 0x996: 0x3308, 0x997: 0x3308,\n\t0x998: 0x0040, 0x999: 0x3308, 0x99a: 0x3308, 0x99b: 0x3308, 0x99c: 0x3308, 0x99d: 0x0d11,\n\t0x99e: 0x3308, 0x99f: 0x3308, 0x9a0: 0x3308, 0x9a1: 0x3308, 0x9a2: 0x0d49, 0x9a3: 0x3308,\n\t0x9a4: 0x3308, 0x9a5: 0x3308, 0x9a6: 0x3308, 0x9a7: 0x0d81, 0x9a8: 0x3308, 0x9a9: 0x3308,\n\t0x9aa: 0x3308, 0x9ab: 0x3308, 0x9ac: 0x0db9, 0x9ad: 0x3308, 0x9ae: 0x3308, 0x9af: 0x3308,\n\t0x9b0: 0x3308, 0x9b1: 0x3308, 0x9b2: 0x3308, 0x9b3: 0x3308, 0x9b4: 0x3308, 0x9b5: 0x3308,\n\t0x9b6: 0x3308, 0x9b7: 0x3308, 0x9b8: 0x3308, 0x9b9: 0x0df1, 0x9ba: 0x3308, 0x9bb: 0x3308,\n\t0x9bc: 0x3308, 0x9bd: 0x0040, 0x9be: 0x0018, 0x9bf: 0x0018,\n\t// Block 0x27, offset 0x9c0\n\t0x9c0: 0x0008, 0x9c1: 0x0008, 0x9c2: 0x0008, 0x9c3: 0x0008, 0x9c4: 0x0008, 0x9c5: 0x0008,\n\t0x9c6: 0x0008, 0x9c7: 0x0008, 0x9c8: 0x0008, 0x9c9: 0x0008, 0x9ca: 0x0008, 0x9cb: 0x0008,\n\t0x9cc: 0x0008, 0x9cd: 0x0008, 0x9ce: 0x0008, 0x9cf: 0x0008, 0x9d0: 0x0008, 0x9d1: 0x0008,\n\t0x9d2: 0x0008, 0x9d3: 0x0008, 0x9d4: 0x0008, 0x9d5: 0x0008, 0x9d6: 0x0008, 0x9d7: 0x0008,\n\t0x9d8: 0x0008, 0x9d9: 0x0008, 0x9da: 0x0008, 0x9db: 0x0008, 0x9dc: 0x0008, 0x9dd: 0x0008,\n\t0x9de: 0x0008, 0x9df: 0x0008, 0x9e0: 0x0008, 0x9e1: 0x0008, 0x9e2: 0x0008, 0x9e3: 0x0008,\n\t0x9e4: 0x0008, 0x9e5: 0x0008, 0x9e6: 0x0008, 0x9e7: 0x0008, 0x9e8: 0x0008, 0x9e9: 0x0008,\n\t0x9ea: 0x0008, 0x9eb: 0x0008, 0x9ec: 0x0039, 0x9ed: 0x0ed1, 0x9ee: 0x0ee9, 0x9ef: 0x0008,\n\t0x9f0: 0x0ef9, 0x9f1: 0x0f09, 0x9f2: 0x0f19, 0x9f3: 0x0f31, 0x9f4: 0x0249, 0x9f5: 0x0f41,\n\t0x9f6: 0x0259, 0x9f7: 0x0f51, 0x9f8: 0x0359, 0x9f9: 0x0f61, 0x9fa: 0x0f71, 0x9fb: 0x0008,\n\t0x9fc: 0x00d9, 0x9fd: 0x0f81, 0x9fe: 0x0f99, 0x9ff: 0x0269,\n\t// Block 0x28, offset 0xa00\n\t0xa00: 0x0fa9, 0xa01: 0x0fb9, 0xa02: 0x0279, 0xa03: 0x0039, 0xa04: 0x0fc9, 0xa05: 0x0fe1,\n\t0xa06: 0x059d, 0xa07: 0x0ee9, 0xa08: 0x0ef9, 0xa09: 0x0f09, 0xa0a: 0x0ff9, 0xa0b: 0x1011,\n\t0xa0c: 0x1029, 0xa0d: 0x0f31, 0xa0e: 0x0008, 0xa0f: 0x0f51, 0xa10: 0x0f61, 0xa11: 0x1041,\n\t0xa12: 0x00d9, 0xa13: 0x1059, 0xa14: 0x05b5, 0xa15: 0x05b5, 0xa16: 0x0f99, 0xa17: 0x0fa9,\n\t0xa18: 0x0fb9, 0xa19: 0x059d, 0xa1a: 0x1071, 0xa1b: 0x1089, 0xa1c: 0x05cd, 0xa1d: 0x1099,\n\t0xa1e: 0x10b1, 0xa1f: 0x10c9, 0xa20: 0x10e1, 0xa21: 0x10f9, 0xa22: 0x0f41, 0xa23: 0x0269,\n\t0xa24: 0x0fb9, 0xa25: 0x1089, 0xa26: 0x1099, 0xa27: 0x10b1, 0xa28: 0x1111, 0xa29: 0x10e1,\n\t0xa2a: 0x10f9, 0xa2b: 0x0008, 0xa2c: 0x0008, 0xa2d: 0x0008, 0xa2e: 0x0008, 0xa2f: 0x0008,\n\t0xa30: 0x0008, 0xa31: 0x0008, 0xa32: 0x0008, 0xa33: 0x0008, 0xa34: 0x0008, 0xa35: 0x0008,\n\t0xa36: 0x0008, 0xa37: 0x0008, 0xa38: 0x1129, 0xa39: 0x0008, 0xa3a: 0x0008, 0xa3b: 0x0008,\n\t0xa3c: 0x0008, 0xa3d: 0x0008, 0xa3e: 0x0008, 0xa3f: 0x0008,\n\t// Block 0x29, offset 0xa40\n\t0xa40: 0x0008, 0xa41: 0x0008, 0xa42: 0x0008, 0xa43: 0x0008, 0xa44: 0x0008, 0xa45: 0x0008,\n\t0xa46: 0x0008, 0xa47: 0x0008, 0xa48: 0x0008, 0xa49: 0x0008, 0xa4a: 0x0008, 0xa4b: 0x0008,\n\t0xa4c: 0x0008, 0xa4d: 0x0008, 0xa4e: 0x0008, 0xa4f: 0x0008, 0xa50: 0x0008, 0xa51: 0x0008,\n\t0xa52: 0x0008, 0xa53: 0x0008, 0xa54: 0x0008, 0xa55: 0x0008, 0xa56: 0x0008, 0xa57: 0x0008,\n\t0xa58: 0x0008, 0xa59: 0x0008, 0xa5a: 0x0008, 0xa5b: 0x1141, 0xa5c: 0x1159, 0xa5d: 0x1169,\n\t0xa5e: 0x1181, 0xa5f: 0x1029, 0xa60: 0x1199, 0xa61: 0x11a9, 0xa62: 0x11c1, 0xa63: 0x11d9,\n\t0xa64: 0x11f1, 0xa65: 0x1209, 0xa66: 0x1221, 0xa67: 0x05e5, 0xa68: 0x1239, 0xa69: 0x1251,\n\t0xa6a: 0xe17d, 0xa6b: 0x1269, 0xa6c: 0x1281, 0xa6d: 0x1299, 0xa6e: 0x12b1, 0xa6f: 0x12c9,\n\t0xa70: 0x12e1, 0xa71: 0x12f9, 0xa72: 0x1311, 0xa73: 0x1329, 0xa74: 0x1341, 0xa75: 0x1359,\n\t0xa76: 0x1371, 0xa77: 0x1389, 0xa78: 0x05fd, 0xa79: 0x13a1, 0xa7a: 0x13b9, 0xa7b: 0x13d1,\n\t0xa7c: 0x13e1, 0xa7d: 0x13f9, 0xa7e: 0x1411, 0xa7f: 0x1429,\n\t// Block 0x2a, offset 0xa80\n\t0xa80: 0xe00d, 0xa81: 0x0008, 0xa82: 0xe00d, 0xa83: 0x0008, 0xa84: 0xe00d, 0xa85: 0x0008,\n\t0xa86: 0xe00d, 0xa87: 0x0008, 0xa88: 0xe00d, 0xa89: 0x0008, 0xa8a: 0xe00d, 0xa8b: 0x0008,\n\t0xa8c: 0xe00d, 0xa8d: 0x0008, 0xa8e: 0xe00d, 0xa8f: 0x0008, 0xa90: 0xe00d, 0xa91: 0x0008,\n\t0xa92: 0xe00d, 0xa93: 0x0008, 0xa94: 0xe00d, 0xa95: 0x0008, 0xa96: 0xe00d, 0xa97: 0x0008,\n\t0xa98: 0xe00d, 0xa99: 0x0008, 0xa9a: 0xe00d, 0xa9b: 0x0008, 0xa9c: 0xe00d, 0xa9d: 0x0008,\n\t0xa9e: 0xe00d, 0xa9f: 0x0008, 0xaa0: 0xe00d, 0xaa1: 0x0008, 0xaa2: 0xe00d, 0xaa3: 0x0008,\n\t0xaa4: 0xe00d, 0xaa5: 0x0008, 0xaa6: 0xe00d, 0xaa7: 0x0008, 0xaa8: 0xe00d, 0xaa9: 0x0008,\n\t0xaaa: 0xe00d, 0xaab: 0x0008, 0xaac: 0xe00d, 0xaad: 0x0008, 0xaae: 0xe00d, 0xaaf: 0x0008,\n\t0xab0: 0xe00d, 0xab1: 0x0008, 0xab2: 0xe00d, 0xab3: 0x0008, 0xab4: 0xe00d, 0xab5: 0x0008,\n\t0xab6: 0xe00d, 0xab7: 0x0008, 0xab8: 0xe00d, 0xab9: 0x0008, 0xaba: 0xe00d, 0xabb: 0x0008,\n\t0xabc: 0xe00d, 0xabd: 0x0008, 0xabe: 0xe00d, 0xabf: 0x0008,\n\t// Block 0x2b, offset 0xac0\n\t0xac0: 0xe00d, 0xac1: 0x0008, 0xac2: 0xe00d, 0xac3: 0x0008, 0xac4: 0xe00d, 0xac5: 0x0008,\n\t0xac6: 0xe00d, 0xac7: 0x0008, 0xac8: 0xe00d, 0xac9: 0x0008, 0xaca: 0xe00d, 0xacb: 0x0008,\n\t0xacc: 0xe00d, 0xacd: 0x0008, 0xace: 0xe00d, 0xacf: 0x0008, 0xad0: 0xe00d, 0xad1: 0x0008,\n\t0xad2: 0xe00d, 0xad3: 0x0008, 0xad4: 0xe00d, 0xad5: 0x0008, 0xad6: 0x0008, 0xad7: 0x0008,\n\t0xad8: 0x0008, 0xad9: 0x0008, 0xada: 0x0615, 0xadb: 0x0635, 0xadc: 0x0008, 0xadd: 0x0008,\n\t0xade: 0x1441, 0xadf: 0x0008, 0xae0: 0xe00d, 0xae1: 0x0008, 0xae2: 0xe00d, 0xae3: 0x0008,\n\t0xae4: 0xe00d, 0xae5: 0x0008, 0xae6: 0xe00d, 0xae7: 0x0008, 0xae8: 0xe00d, 0xae9: 0x0008,\n\t0xaea: 0xe00d, 0xaeb: 0x0008, 0xaec: 0xe00d, 0xaed: 0x0008, 0xaee: 0xe00d, 0xaef: 0x0008,\n\t0xaf0: 0xe00d, 0xaf1: 0x0008, 0xaf2: 0xe00d, 0xaf3: 0x0008, 0xaf4: 0xe00d, 0xaf5: 0x0008,\n\t0xaf6: 0xe00d, 0xaf7: 0x0008, 0xaf8: 0xe00d, 0xaf9: 0x0008, 0xafa: 0xe00d, 0xafb: 0x0008,\n\t0xafc: 0xe00d, 0xafd: 0x0008, 0xafe: 0xe00d, 0xaff: 0x0008,\n\t// Block 0x2c, offset 0xb00\n\t0xb00: 0x0008, 0xb01: 0x0008, 0xb02: 0x0008, 0xb03: 0x0008, 0xb04: 0x0008, 0xb05: 0x0008,\n\t0xb06: 0x0040, 0xb07: 0x0040, 0xb08: 0xe045, 0xb09: 0xe045, 0xb0a: 0xe045, 0xb0b: 0xe045,\n\t0xb0c: 0xe045, 0xb0d: 0xe045, 0xb0e: 0x0040, 0xb0f: 0x0040, 0xb10: 0x0008, 0xb11: 0x0008,\n\t0xb12: 0x0008, 0xb13: 0x0008, 0xb14: 0x0008, 0xb15: 0x0008, 0xb16: 0x0008, 0xb17: 0x0008,\n\t0xb18: 0x0040, 0xb19: 0xe045, 0xb1a: 0x0040, 0xb1b: 0xe045, 0xb1c: 0x0040, 0xb1d: 0xe045,\n\t0xb1e: 0x0040, 0xb1f: 0xe045, 0xb20: 0x0008, 0xb21: 0x0008, 0xb22: 0x0008, 0xb23: 0x0008,\n\t0xb24: 0x0008, 0xb25: 0x0008, 0xb26: 0x0008, 0xb27: 0x0008, 0xb28: 0xe045, 0xb29: 0xe045,\n\t0xb2a: 0xe045, 0xb2b: 0xe045, 0xb2c: 0xe045, 0xb2d: 0xe045, 0xb2e: 0xe045, 0xb2f: 0xe045,\n\t0xb30: 0x0008, 0xb31: 0x1459, 0xb32: 0x0008, 0xb33: 0x1471, 0xb34: 0x0008, 0xb35: 0x1489,\n\t0xb36: 0x0008, 0xb37: 0x14a1, 0xb38: 0x0008, 0xb39: 0x14b9, 0xb3a: 0x0008, 0xb3b: 0x14d1,\n\t0xb3c: 0x0008, 0xb3d: 0x14e9, 0xb3e: 0x0040, 0xb3f: 0x0040,\n\t// Block 0x2d, offset 0xb40\n\t0xb40: 0x1501, 0xb41: 0x1531, 0xb42: 0x1561, 0xb43: 0x1591, 0xb44: 0x15c1, 0xb45: 0x15f1,\n\t0xb46: 0x1621, 0xb47: 0x1651, 0xb48: 0x1501, 0xb49: 0x1531, 0xb4a: 0x1561, 0xb4b: 0x1591,\n\t0xb4c: 0x15c1, 0xb4d: 0x15f1, 0xb4e: 0x1621, 0xb4f: 0x1651, 0xb50: 0x1681, 0xb51: 0x16b1,\n\t0xb52: 0x16e1, 0xb53: 0x1711, 0xb54: 0x1741, 0xb55: 0x1771, 0xb56: 0x17a1, 0xb57: 0x17d1,\n\t0xb58: 0x1681, 0xb59: 0x16b1, 0xb5a: 0x16e1, 0xb5b: 0x1711, 0xb5c: 0x1741, 0xb5d: 0x1771,\n\t0xb5e: 0x17a1, 0xb5f: 0x17d1, 0xb60: 0x1801, 0xb61: 0x1831, 0xb62: 0x1861, 0xb63: 0x1891,\n\t0xb64: 0x18c1, 0xb65: 0x18f1, 0xb66: 0x1921, 0xb67: 0x1951, 0xb68: 0x1801, 0xb69: 0x1831,\n\t0xb6a: 0x1861, 0xb6b: 0x1891, 0xb6c: 0x18c1, 0xb6d: 0x18f1, 0xb6e: 0x1921, 0xb6f: 0x1951,\n\t0xb70: 0x0008, 0xb71: 0x0008, 0xb72: 0x1981, 0xb73: 0x19b1, 0xb74: 0x19d9, 0xb75: 0x0040,\n\t0xb76: 0x0008, 0xb77: 0x1a01, 0xb78: 0xe045, 0xb79: 0xe045, 0xb7a: 0x064d, 0xb7b: 0x1459,\n\t0xb7c: 0x19b1, 0xb7d: 0x0666, 0xb7e: 0x1a31, 0xb7f: 0x0686,\n\t// Block 0x2e, offset 0xb80\n\t0xb80: 0x06a6, 0xb81: 0x1a4a, 0xb82: 0x1a79, 0xb83: 0x1aa9, 0xb84: 0x1ad1, 0xb85: 0x0040,\n\t0xb86: 0x0008, 0xb87: 0x1af9, 0xb88: 0x06c5, 0xb89: 0x1471, 0xb8a: 0x06dd, 0xb8b: 0x1489,\n\t0xb8c: 0x1aa9, 0xb8d: 0x1b2a, 0xb8e: 0x1b5a, 0xb8f: 0x1b8a, 0xb90: 0x0008, 0xb91: 0x0008,\n\t0xb92: 0x0008, 0xb93: 0x1bb9, 0xb94: 0x0040, 0xb95: 0x0040, 0xb96: 0x0008, 0xb97: 0x0008,\n\t0xb98: 0xe045, 0xb99: 0xe045, 0xb9a: 0x06f5, 0xb9b: 0x14a1, 0xb9c: 0x0040, 0xb9d: 0x1bd2,\n\t0xb9e: 0x1c02, 0xb9f: 0x1c32, 0xba0: 0x0008, 0xba1: 0x0008, 0xba2: 0x0008, 0xba3: 0x1c61,\n\t0xba4: 0x0008, 0xba5: 0x0008, 0xba6: 0x0008, 0xba7: 0x0008, 0xba8: 0xe045, 0xba9: 0xe045,\n\t0xbaa: 0x070d, 0xbab: 0x14d1, 0xbac: 0xe04d, 0xbad: 0x1c7a, 0xbae: 0x03d2, 0xbaf: 0x1caa,\n\t0xbb0: 0x0040, 0xbb1: 0x0040, 0xbb2: 0x1cb9, 0xbb3: 0x1ce9, 0xbb4: 0x1d11, 0xbb5: 0x0040,\n\t0xbb6: 0x0008, 0xbb7: 0x1d39, 0xbb8: 0x0725, 0xbb9: 0x14b9, 0xbba: 0x0515, 0xbbb: 0x14e9,\n\t0xbbc: 0x1ce9, 0xbbd: 0x073e, 0xbbe: 0x075e, 0xbbf: 0x0040,\n\t// Block 0x2f, offset 0xbc0\n\t0xbc0: 0x000a, 0xbc1: 0x000a, 0xbc2: 0x000a, 0xbc3: 0x000a, 0xbc4: 0x000a, 0xbc5: 0x000a,\n\t0xbc6: 0x000a, 0xbc7: 0x000a, 0xbc8: 0x000a, 0xbc9: 0x000a, 0xbca: 0x000a, 0xbcb: 0x03c0,\n\t0xbcc: 0x0003, 0xbcd: 0x0003, 0xbce: 0x0340, 0xbcf: 0x0b40, 0xbd0: 0x0018, 0xbd1: 0xe00d,\n\t0xbd2: 0x0018, 0xbd3: 0x0018, 0xbd4: 0x0018, 0xbd5: 0x0018, 0xbd6: 0x0018, 0xbd7: 0x077e,\n\t0xbd8: 0x0018, 0xbd9: 0x0018, 0xbda: 0x0018, 0xbdb: 0x0018, 0xbdc: 0x0018, 0xbdd: 0x0018,\n\t0xbde: 0x0018, 0xbdf: 0x0018, 0xbe0: 0x0018, 0xbe1: 0x0018, 0xbe2: 0x0018, 0xbe3: 0x0018,\n\t0xbe4: 0x0040, 0xbe5: 0x0040, 0xbe6: 0x0040, 0xbe7: 0x0018, 0xbe8: 0x0040, 0xbe9: 0x0040,\n\t0xbea: 0x0340, 0xbeb: 0x0340, 0xbec: 0x0340, 0xbed: 0x0340, 0xbee: 0x0340, 0xbef: 0x000a,\n\t0xbf0: 0x0018, 0xbf1: 0x0018, 0xbf2: 0x0018, 0xbf3: 0x1d69, 0xbf4: 0x1da1, 0xbf5: 0x0018,\n\t0xbf6: 0x1df1, 0xbf7: 0x1e29, 0xbf8: 0x0018, 0xbf9: 0x0018, 0xbfa: 0x0018, 0xbfb: 0x0018,\n\t0xbfc: 0x1e7a, 0xbfd: 0x0018, 0xbfe: 0x079e, 0xbff: 0x0018,\n\t// Block 0x30, offset 0xc00\n\t0xc00: 0x0018, 0xc01: 0x0018, 0xc02: 0x0018, 0xc03: 0x0018, 0xc04: 0x0018, 0xc05: 0x0018,\n\t0xc06: 0x0018, 0xc07: 0x1e92, 0xc08: 0x1eaa, 0xc09: 0x1ec2, 0xc0a: 0x0018, 0xc0b: 0x0018,\n\t0xc0c: 0x0018, 0xc0d: 0x0018, 0xc0e: 0x0018, 0xc0f: 0x0018, 0xc10: 0x0018, 0xc11: 0x0018,\n\t0xc12: 0x0018, 0xc13: 0x0018, 0xc14: 0x0018, 0xc15: 0x0018, 0xc16: 0x0018, 0xc17: 0x1ed9,\n\t0xc18: 0x0018, 0xc19: 0x0018, 0xc1a: 0x0018, 0xc1b: 0x0018, 0xc1c: 0x0018, 0xc1d: 0x0018,\n\t0xc1e: 0x0018, 0xc1f: 0x000a, 0xc20: 0x03c0, 0xc21: 0x0340, 0xc22: 0x0340, 0xc23: 0x0340,\n\t0xc24: 0x03c0, 0xc25: 0x0040, 0xc26: 0x0040, 0xc27: 0x0040, 0xc28: 0x0040, 0xc29: 0x0040,\n\t0xc2a: 0x0340, 0xc2b: 0x0340, 0xc2c: 0x0340, 0xc2d: 0x0340, 0xc2e: 0x0340, 0xc2f: 0x0340,\n\t0xc30: 0x1f41, 0xc31: 0x0f41, 0xc32: 0x0040, 0xc33: 0x0040, 0xc34: 0x1f51, 0xc35: 0x1f61,\n\t0xc36: 0x1f71, 0xc37: 0x1f81, 0xc38: 0x1f91, 0xc39: 0x1fa1, 0xc3a: 0x1fb2, 0xc3b: 0x07bd,\n\t0xc3c: 0x1fc2, 0xc3d: 0x1fd2, 0xc3e: 0x1fe2, 0xc3f: 0x0f71,\n\t// Block 0x31, offset 0xc40\n\t0xc40: 0x1f41, 0xc41: 0x00c9, 0xc42: 0x0069, 0xc43: 0x0079, 0xc44: 0x1f51, 0xc45: 0x1f61,\n\t0xc46: 0x1f71, 0xc47: 0x1f81, 0xc48: 0x1f91, 0xc49: 0x1fa1, 0xc4a: 0x1fb2, 0xc4b: 0x07d5,\n\t0xc4c: 0x1fc2, 0xc4d: 0x1fd2, 0xc4e: 0x1fe2, 0xc4f: 0x0040, 0xc50: 0x0039, 0xc51: 0x0f09,\n\t0xc52: 0x00d9, 0xc53: 0x0369, 0xc54: 0x0ff9, 0xc55: 0x0249, 0xc56: 0x0f51, 0xc57: 0x0359,\n\t0xc58: 0x0f61, 0xc59: 0x0f71, 0xc5a: 0x0f99, 0xc5b: 0x01d9, 0xc5c: 0x0fa9, 0xc5d: 0x0040,\n\t0xc5e: 0x0040, 0xc5f: 0x0040, 0xc60: 0x0018, 0xc61: 0x0018, 0xc62: 0x0018, 0xc63: 0x0018,\n\t0xc64: 0x0018, 0xc65: 0x0018, 0xc66: 0x0018, 0xc67: 0x0018, 0xc68: 0x1ff1, 0xc69: 0x0018,\n\t0xc6a: 0x0018, 0xc6b: 0x0018, 0xc6c: 0x0018, 0xc6d: 0x0018, 0xc6e: 0x0018, 0xc6f: 0x0018,\n\t0xc70: 0x0018, 0xc71: 0x0018, 0xc72: 0x0018, 0xc73: 0x0018, 0xc74: 0x0018, 0xc75: 0x0018,\n\t0xc76: 0x0018, 0xc77: 0x0018, 0xc78: 0x0018, 0xc79: 0x0018, 0xc7a: 0x0018, 0xc7b: 0x0018,\n\t0xc7c: 0x0018, 0xc7d: 0x0018, 0xc7e: 0x0018, 0xc7f: 0x0018,\n\t// Block 0x32, offset 0xc80\n\t0xc80: 0x07ee, 0xc81: 0x080e, 0xc82: 0x1159, 0xc83: 0x082d, 0xc84: 0x0018, 0xc85: 0x084e,\n\t0xc86: 0x086e, 0xc87: 0x1011, 0xc88: 0x0018, 0xc89: 0x088d, 0xc8a: 0x0f31, 0xc8b: 0x0249,\n\t0xc8c: 0x0249, 0xc8d: 0x0249, 0xc8e: 0x0249, 0xc8f: 0x2009, 0xc90: 0x0f41, 0xc91: 0x0f41,\n\t0xc92: 0x0359, 0xc93: 0x0359, 0xc94: 0x0018, 0xc95: 0x0f71, 0xc96: 0x2021, 0xc97: 0x0018,\n\t0xc98: 0x0018, 0xc99: 0x0f99, 0xc9a: 0x2039, 0xc9b: 0x0269, 0xc9c: 0x0269, 0xc9d: 0x0269,\n\t0xc9e: 0x0018, 0xc9f: 0x0018, 0xca0: 0x2049, 0xca1: 0x08ad, 0xca2: 0x2061, 0xca3: 0x0018,\n\t0xca4: 0x13d1, 0xca5: 0x0018, 0xca6: 0x2079, 0xca7: 0x0018, 0xca8: 0x13d1, 0xca9: 0x0018,\n\t0xcaa: 0x0f51, 0xcab: 0x2091, 0xcac: 0x0ee9, 0xcad: 0x1159, 0xcae: 0x0018, 0xcaf: 0x0f09,\n\t0xcb0: 0x0f09, 0xcb1: 0x1199, 0xcb2: 0x0040, 0xcb3: 0x0f61, 0xcb4: 0x00d9, 0xcb5: 0x20a9,\n\t0xcb6: 0x20c1, 0xcb7: 0x20d9, 0xcb8: 0x20f1, 0xcb9: 0x0f41, 0xcba: 0x0018, 0xcbb: 0x08cd,\n\t0xcbc: 0x2109, 0xcbd: 0x10b1, 0xcbe: 0x10b1, 0xcbf: 0x2109,\n\t// Block 0x33, offset 0xcc0\n\t0xcc0: 0x08ed, 0xcc1: 0x0018, 0xcc2: 0x0018, 0xcc3: 0x0018, 0xcc4: 0x0018, 0xcc5: 0x0ef9,\n\t0xcc6: 0x0ef9, 0xcc7: 0x0f09, 0xcc8: 0x0f41, 0xcc9: 0x0259, 0xcca: 0x0018, 0xccb: 0x0018,\n\t0xccc: 0x0018, 0xccd: 0x0018, 0xcce: 0x0008, 0xccf: 0x0018, 0xcd0: 0x2121, 0xcd1: 0x2151,\n\t0xcd2: 0x2181, 0xcd3: 0x21b9, 0xcd4: 0x21e9, 0xcd5: 0x2219, 0xcd6: 0x2249, 0xcd7: 0x2279,\n\t0xcd8: 0x22a9, 0xcd9: 0x22d9, 0xcda: 0x2309, 0xcdb: 0x2339, 0xcdc: 0x2369, 0xcdd: 0x2399,\n\t0xcde: 0x23c9, 0xcdf: 0x23f9, 0xce0: 0x0f41, 0xce1: 0x2421, 0xce2: 0x0905, 0xce3: 0x2439,\n\t0xce4: 0x1089, 0xce5: 0x2451, 0xce6: 0x0925, 0xce7: 0x2469, 0xce8: 0x2491, 0xce9: 0x0369,\n\t0xcea: 0x24a9, 0xceb: 0x0945, 0xcec: 0x0359, 0xced: 0x1159, 0xcee: 0x0ef9, 0xcef: 0x0f61,\n\t0xcf0: 0x0f41, 0xcf1: 0x2421, 0xcf2: 0x0965, 0xcf3: 0x2439, 0xcf4: 0x1089, 0xcf5: 0x2451,\n\t0xcf6: 0x0985, 0xcf7: 0x2469, 0xcf8: 0x2491, 0xcf9: 0x0369, 0xcfa: 0x24a9, 0xcfb: 0x09a5,\n\t0xcfc: 0x0359, 0xcfd: 0x1159, 0xcfe: 0x0ef9, 0xcff: 0x0f61,\n\t// Block 0x34, offset 0xd00\n\t0xd00: 0x0018, 0xd01: 0x0018, 0xd02: 0x0018, 0xd03: 0x0018, 0xd04: 0x0018, 0xd05: 0x0018,\n\t0xd06: 0x0018, 0xd07: 0x0018, 0xd08: 0x0018, 0xd09: 0x0018, 0xd0a: 0x0018, 0xd0b: 0x0040,\n\t0xd0c: 0x0040, 0xd0d: 0x0040, 0xd0e: 0x0040, 0xd0f: 0x0040, 0xd10: 0x0040, 0xd11: 0x0040,\n\t0xd12: 0x0040, 0xd13: 0x0040, 0xd14: 0x0040, 0xd15: 0x0040, 0xd16: 0x0040, 0xd17: 0x0040,\n\t0xd18: 0x0040, 0xd19: 0x0040, 0xd1a: 0x0040, 0xd1b: 0x0040, 0xd1c: 0x0040, 0xd1d: 0x0040,\n\t0xd1e: 0x0040, 0xd1f: 0x0040, 0xd20: 0x00c9, 0xd21: 0x0069, 0xd22: 0x0079, 0xd23: 0x1f51,\n\t0xd24: 0x1f61, 0xd25: 0x1f71, 0xd26: 0x1f81, 0xd27: 0x1f91, 0xd28: 0x1fa1, 0xd29: 0x2601,\n\t0xd2a: 0x2619, 0xd2b: 0x2631, 0xd2c: 0x2649, 0xd2d: 0x2661, 0xd2e: 0x2679, 0xd2f: 0x2691,\n\t0xd30: 0x26a9, 0xd31: 0x26c1, 0xd32: 0x26d9, 0xd33: 0x26f1, 0xd34: 0x0a06, 0xd35: 0x0a26,\n\t0xd36: 0x0a46, 0xd37: 0x0a66, 0xd38: 0x0a86, 0xd39: 0x0aa6, 0xd3a: 0x0ac6, 0xd3b: 0x0ae6,\n\t0xd3c: 0x0b06, 0xd3d: 0x270a, 0xd3e: 0x2732, 0xd3f: 0x275a,\n\t// Block 0x35, offset 0xd40\n\t0xd40: 0x2782, 0xd41: 0x27aa, 0xd42: 0x27d2, 0xd43: 0x27fa, 0xd44: 0x2822, 0xd45: 0x284a,\n\t0xd46: 0x2872, 0xd47: 0x289a, 0xd48: 0x0040, 0xd49: 0x0040, 0xd4a: 0x0040, 0xd4b: 0x0040,\n\t0xd4c: 0x0040, 0xd4d: 0x0040, 0xd4e: 0x0040, 0xd4f: 0x0040, 0xd50: 0x0040, 0xd51: 0x0040,\n\t0xd52: 0x0040, 0xd53: 0x0040, 0xd54: 0x0040, 0xd55: 0x0040, 0xd56: 0x0040, 0xd57: 0x0040,\n\t0xd58: 0x0040, 0xd59: 0x0040, 0xd5a: 0x0040, 0xd5b: 0x0040, 0xd5c: 0x0b26, 0xd5d: 0x0b46,\n\t0xd5e: 0x0b66, 0xd5f: 0x0b86, 0xd60: 0x0ba6, 0xd61: 0x0bc6, 0xd62: 0x0be6, 0xd63: 0x0c06,\n\t0xd64: 0x0c26, 0xd65: 0x0c46, 0xd66: 0x0c66, 0xd67: 0x0c86, 0xd68: 0x0ca6, 0xd69: 0x0cc6,\n\t0xd6a: 0x0ce6, 0xd6b: 0x0d06, 0xd6c: 0x0d26, 0xd6d: 0x0d46, 0xd6e: 0x0d66, 0xd6f: 0x0d86,\n\t0xd70: 0x0da6, 0xd71: 0x0dc6, 0xd72: 0x0de6, 0xd73: 0x0e06, 0xd74: 0x0e26, 0xd75: 0x0e46,\n\t0xd76: 0x0039, 0xd77: 0x0ee9, 0xd78: 0x1159, 0xd79: 0x0ef9, 0xd7a: 0x0f09, 0xd7b: 0x1199,\n\t0xd7c: 0x0f31, 0xd7d: 0x0249, 0xd7e: 0x0f41, 0xd7f: 0x0259,\n\t// Block 0x36, offset 0xd80\n\t0xd80: 0x0f51, 0xd81: 0x0359, 0xd82: 0x0f61, 0xd83: 0x0f71, 0xd84: 0x00d9, 0xd85: 0x0f99,\n\t0xd86: 0x2039, 0xd87: 0x0269, 0xd88: 0x01d9, 0xd89: 0x0fa9, 0xd8a: 0x0fb9, 0xd8b: 0x1089,\n\t0xd8c: 0x0279, 0xd8d: 0x0369, 0xd8e: 0x0289, 0xd8f: 0x13d1, 0xd90: 0x0039, 0xd91: 0x0ee9,\n\t0xd92: 0x1159, 0xd93: 0x0ef9, 0xd94: 0x0f09, 0xd95: 0x1199, 0xd96: 0x0f31, 0xd97: 0x0249,\n\t0xd98: 0x0f41, 0xd99: 0x0259, 0xd9a: 0x0f51, 0xd9b: 0x0359, 0xd9c: 0x0f61, 0xd9d: 0x0f71,\n\t0xd9e: 0x00d9, 0xd9f: 0x0f99, 0xda0: 0x2039, 0xda1: 0x0269, 0xda2: 0x01d9, 0xda3: 0x0fa9,\n\t0xda4: 0x0fb9, 0xda5: 0x1089, 0xda6: 0x0279, 0xda7: 0x0369, 0xda8: 0x0289, 0xda9: 0x13d1,\n\t0xdaa: 0x1f41, 0xdab: 0x0018, 0xdac: 0x0018, 0xdad: 0x0018, 0xdae: 0x0018, 0xdaf: 0x0018,\n\t0xdb0: 0x0018, 0xdb1: 0x0018, 0xdb2: 0x0018, 0xdb3: 0x0018, 0xdb4: 0x0018, 0xdb5: 0x0018,\n\t0xdb6: 0x0018, 0xdb7: 0x0018, 0xdb8: 0x0018, 0xdb9: 0x0018, 0xdba: 0x0018, 0xdbb: 0x0018,\n\t0xdbc: 0x0018, 0xdbd: 0x0018, 0xdbe: 0x0018, 0xdbf: 0x0018,\n\t// Block 0x37, offset 0xdc0\n\t0xdc0: 0x0008, 0xdc1: 0x0008, 0xdc2: 0x0008, 0xdc3: 0x0008, 0xdc4: 0x0008, 0xdc5: 0x0008,\n\t0xdc6: 0x0008, 0xdc7: 0x0008, 0xdc8: 0x0008, 0xdc9: 0x0008, 0xdca: 0x0008, 0xdcb: 0x0008,\n\t0xdcc: 0x0008, 0xdcd: 0x0008, 0xdce: 0x0008, 0xdcf: 0x0008, 0xdd0: 0x0008, 0xdd1: 0x0008,\n\t0xdd2: 0x0008, 0xdd3: 0x0008, 0xdd4: 0x0008, 0xdd5: 0x0008, 0xdd6: 0x0008, 0xdd7: 0x0008,\n\t0xdd8: 0x0008, 0xdd9: 0x0008, 0xdda: 0x0008, 0xddb: 0x0008, 0xddc: 0x0008, 0xddd: 0x0008,\n\t0xdde: 0x0008, 0xddf: 0x0040, 0xde0: 0xe00d, 0xde1: 0x0008, 0xde2: 0x2971, 0xde3: 0x0ebd,\n\t0xde4: 0x2989, 0xde5: 0x0008, 0xde6: 0x0008, 0xde7: 0xe07d, 0xde8: 0x0008, 0xde9: 0xe01d,\n\t0xdea: 0x0008, 0xdeb: 0xe03d, 0xdec: 0x0008, 0xded: 0x0fe1, 0xdee: 0x1281, 0xdef: 0x0fc9,\n\t0xdf0: 0x1141, 0xdf1: 0x0008, 0xdf2: 0xe00d, 0xdf3: 0x0008, 0xdf4: 0x0008, 0xdf5: 0xe01d,\n\t0xdf6: 0x0008, 0xdf7: 0x0008, 0xdf8: 0x0008, 0xdf9: 0x0008, 0xdfa: 0x0008, 0xdfb: 0x0008,\n\t0xdfc: 0x0259, 0xdfd: 0x1089, 0xdfe: 0x29a1, 0xdff: 0x29b9,\n\t// Block 0x38, offset 0xe00\n\t0xe00: 0xe00d, 0xe01: 0x0008, 0xe02: 0xe00d, 0xe03: 0x0008, 0xe04: 0xe00d, 0xe05: 0x0008,\n\t0xe06: 0xe00d, 0xe07: 0x0008, 0xe08: 0xe00d, 0xe09: 0x0008, 0xe0a: 0xe00d, 0xe0b: 0x0008,\n\t0xe0c: 0xe00d, 0xe0d: 0x0008, 0xe0e: 0xe00d, 0xe0f: 0x0008, 0xe10: 0xe00d, 0xe11: 0x0008,\n\t0xe12: 0xe00d, 0xe13: 0x0008, 0xe14: 0xe00d, 0xe15: 0x0008, 0xe16: 0xe00d, 0xe17: 0x0008,\n\t0xe18: 0xe00d, 0xe19: 0x0008, 0xe1a: 0xe00d, 0xe1b: 0x0008, 0xe1c: 0xe00d, 0xe1d: 0x0008,\n\t0xe1e: 0xe00d, 0xe1f: 0x0008, 0xe20: 0xe00d, 0xe21: 0x0008, 0xe22: 0xe00d, 0xe23: 0x0008,\n\t0xe24: 0x0008, 0xe25: 0x0018, 0xe26: 0x0018, 0xe27: 0x0018, 0xe28: 0x0018, 0xe29: 0x0018,\n\t0xe2a: 0x0018, 0xe2b: 0xe03d, 0xe2c: 0x0008, 0xe2d: 0xe01d, 0xe2e: 0x0008, 0xe2f: 0x3308,\n\t0xe30: 0x3308, 0xe31: 0x3308, 0xe32: 0xe00d, 0xe33: 0x0008, 0xe34: 0x0040, 0xe35: 0x0040,\n\t0xe36: 0x0040, 0xe37: 0x0040, 0xe38: 0x0040, 0xe39: 0x0018, 0xe3a: 0x0018, 0xe3b: 0x0018,\n\t0xe3c: 0x0018, 0xe3d: 0x0018, 0xe3e: 0x0018, 0xe3f: 0x0018,\n\t// Block 0x39, offset 0xe40\n\t0xe40: 0x26fd, 0xe41: 0x271d, 0xe42: 0x273d, 0xe43: 0x275d, 0xe44: 0x277d, 0xe45: 0x279d,\n\t0xe46: 0x27bd, 0xe47: 0x27dd, 0xe48: 0x27fd, 0xe49: 0x281d, 0xe4a: 0x283d, 0xe4b: 0x285d,\n\t0xe4c: 0x287d, 0xe4d: 0x289d, 0xe4e: 0x28bd, 0xe4f: 0x28dd, 0xe50: 0x28fd, 0xe51: 0x291d,\n\t0xe52: 0x293d, 0xe53: 0x295d, 0xe54: 0x297d, 0xe55: 0x299d, 0xe56: 0x0040, 0xe57: 0x0040,\n\t0xe58: 0x0040, 0xe59: 0x0040, 0xe5a: 0x0040, 0xe5b: 0x0040, 0xe5c: 0x0040, 0xe5d: 0x0040,\n\t0xe5e: 0x0040, 0xe5f: 0x0040, 0xe60: 0x0040, 0xe61: 0x0040, 0xe62: 0x0040, 0xe63: 0x0040,\n\t0xe64: 0x0040, 0xe65: 0x0040, 0xe66: 0x0040, 0xe67: 0x0040, 0xe68: 0x0040, 0xe69: 0x0040,\n\t0xe6a: 0x0040, 0xe6b: 0x0040, 0xe6c: 0x0040, 0xe6d: 0x0040, 0xe6e: 0x0040, 0xe6f: 0x0040,\n\t0xe70: 0x0040, 0xe71: 0x0040, 0xe72: 0x0040, 0xe73: 0x0040, 0xe74: 0x0040, 0xe75: 0x0040,\n\t0xe76: 0x0040, 0xe77: 0x0040, 0xe78: 0x0040, 0xe79: 0x0040, 0xe7a: 0x0040, 0xe7b: 0x0040,\n\t0xe7c: 0x0040, 0xe7d: 0x0040, 0xe7e: 0x0040, 0xe7f: 0x0040,\n\t// Block 0x3a, offset 0xe80\n\t0xe80: 0x000a, 0xe81: 0x0018, 0xe82: 0x29d1, 0xe83: 0x0018, 0xe84: 0x0018, 0xe85: 0x0008,\n\t0xe86: 0x0008, 0xe87: 0x0008, 0xe88: 0x0018, 0xe89: 0x0018, 0xe8a: 0x0018, 0xe8b: 0x0018,\n\t0xe8c: 0x0018, 0xe8d: 0x0018, 0xe8e: 0x0018, 0xe8f: 0x0018, 0xe90: 0x0018, 0xe91: 0x0018,\n\t0xe92: 0x0018, 0xe93: 0x0018, 0xe94: 0x0018, 0xe95: 0x0018, 0xe96: 0x0018, 0xe97: 0x0018,\n\t0xe98: 0x0018, 0xe99: 0x0018, 0xe9a: 0x0018, 0xe9b: 0x0018, 0xe9c: 0x0018, 0xe9d: 0x0018,\n\t0xe9e: 0x0018, 0xe9f: 0x0018, 0xea0: 0x0018, 0xea1: 0x0018, 0xea2: 0x0018, 0xea3: 0x0018,\n\t0xea4: 0x0018, 0xea5: 0x0018, 0xea6: 0x0018, 0xea7: 0x0018, 0xea8: 0x0018, 0xea9: 0x0018,\n\t0xeaa: 0x3308, 0xeab: 0x3308, 0xeac: 0x3308, 0xead: 0x3308, 0xeae: 0x3018, 0xeaf: 0x3018,\n\t0xeb0: 0x0018, 0xeb1: 0x0018, 0xeb2: 0x0018, 0xeb3: 0x0018, 0xeb4: 0x0018, 0xeb5: 0x0018,\n\t0xeb6: 0xe125, 0xeb7: 0x0018, 0xeb8: 0x29bd, 0xeb9: 0x29dd, 0xeba: 0x29fd, 0xebb: 0x0018,\n\t0xebc: 0x0008, 0xebd: 0x0018, 0xebe: 0x0018, 0xebf: 0x0018,\n\t// Block 0x3b, offset 0xec0\n\t0xec0: 0x2b3d, 0xec1: 0x2b5d, 0xec2: 0x2b7d, 0xec3: 0x2b9d, 0xec4: 0x2bbd, 0xec5: 0x2bdd,\n\t0xec6: 0x2bdd, 0xec7: 0x2bdd, 0xec8: 0x2bfd, 0xec9: 0x2bfd, 0xeca: 0x2bfd, 0xecb: 0x2bfd,\n\t0xecc: 0x2c1d, 0xecd: 0x2c1d, 0xece: 0x2c1d, 0xecf: 0x2c3d, 0xed0: 0x2c5d, 0xed1: 0x2c5d,\n\t0xed2: 0x2a7d, 0xed3: 0x2a7d, 0xed4: 0x2c5d, 0xed5: 0x2c5d, 0xed6: 0x2c7d, 0xed7: 0x2c7d,\n\t0xed8: 0x2c5d, 0xed9: 0x2c5d, 0xeda: 0x2a7d, 0xedb: 0x2a7d, 0xedc: 0x2c5d, 0xedd: 0x2c5d,\n\t0xede: 0x2c3d, 0xedf: 0x2c3d, 0xee0: 0x2c9d, 0xee1: 0x2c9d, 0xee2: 0x2cbd, 0xee3: 0x2cbd,\n\t0xee4: 0x0040, 0xee5: 0x2cdd, 0xee6: 0x2cfd, 0xee7: 0x2d1d, 0xee8: 0x2d1d, 0xee9: 0x2d3d,\n\t0xeea: 0x2d5d, 0xeeb: 0x2d7d, 0xeec: 0x2d9d, 0xeed: 0x2dbd, 0xeee: 0x2ddd, 0xeef: 0x2dfd,\n\t0xef0: 0x2e1d, 0xef1: 0x2e3d, 0xef2: 0x2e3d, 0xef3: 0x2e5d, 0xef4: 0x2e7d, 0xef5: 0x2e7d,\n\t0xef6: 0x2e9d, 0xef7: 0x2ebd, 0xef8: 0x2e5d, 0xef9: 0x2edd, 0xefa: 0x2efd, 0xefb: 0x2edd,\n\t0xefc: 0x2e5d, 0xefd: 0x2f1d, 0xefe: 0x2f3d, 0xeff: 0x2f5d,\n\t// Block 0x3c, offset 0xf00\n\t0xf00: 0x2f7d, 0xf01: 0x2f9d, 0xf02: 0x2cfd, 0xf03: 0x2cdd, 0xf04: 0x2fbd, 0xf05: 0x2fdd,\n\t0xf06: 0x2ffd, 0xf07: 0x301d, 0xf08: 0x303d, 0xf09: 0x305d, 0xf0a: 0x307d, 0xf0b: 0x309d,\n\t0xf0c: 0x30bd, 0xf0d: 0x30dd, 0xf0e: 0x30fd, 0xf0f: 0x0040, 0xf10: 0x0018, 0xf11: 0x0018,\n\t0xf12: 0x311d, 0xf13: 0x313d, 0xf14: 0x315d, 0xf15: 0x317d, 0xf16: 0x319d, 0xf17: 0x31bd,\n\t0xf18: 0x31dd, 0xf19: 0x31fd, 0xf1a: 0x321d, 0xf1b: 0x323d, 0xf1c: 0x315d, 0xf1d: 0x325d,\n\t0xf1e: 0x327d, 0xf1f: 0x329d, 0xf20: 0x0008, 0xf21: 0x0008, 0xf22: 0x0008, 0xf23: 0x0008,\n\t0xf24: 0x0008, 0xf25: 0x0008, 0xf26: 0x0008, 0xf27: 0x0008, 0xf28: 0x0008, 0xf29: 0x0008,\n\t0xf2a: 0x0008, 0xf2b: 0x0008, 0xf2c: 0x0008, 0xf2d: 0x0008, 0xf2e: 0x0008, 0xf2f: 0x0008,\n\t0xf30: 0x0008, 0xf31: 0x0008, 0xf32: 0x0008, 0xf33: 0x0008, 0xf34: 0x0008, 0xf35: 0x0008,\n\t0xf36: 0x0008, 0xf37: 0x0008, 0xf38: 0x0008, 0xf39: 0x0008, 0xf3a: 0x0008, 0xf3b: 0x0040,\n\t0xf3c: 0x0040, 0xf3d: 0x0040, 0xf3e: 0x0040, 0xf3f: 0x0040,\n\t// Block 0x3d, offset 0xf40\n\t0xf40: 0x36a2, 0xf41: 0x36d2, 0xf42: 0x3702, 0xf43: 0x3732, 0xf44: 0x32bd, 0xf45: 0x32dd,\n\t0xf46: 0x32fd, 0xf47: 0x331d, 0xf48: 0x0018, 0xf49: 0x0018, 0xf4a: 0x0018, 0xf4b: 0x0018,\n\t0xf4c: 0x0018, 0xf4d: 0x0018, 0xf4e: 0x0018, 0xf4f: 0x0018, 0xf50: 0x333d, 0xf51: 0x3761,\n\t0xf52: 0x3779, 0xf53: 0x3791, 0xf54: 0x37a9, 0xf55: 0x37c1, 0xf56: 0x37d9, 0xf57: 0x37f1,\n\t0xf58: 0x3809, 0xf59: 0x3821, 0xf5a: 0x3839, 0xf5b: 0x3851, 0xf5c: 0x3869, 0xf5d: 0x3881,\n\t0xf5e: 0x3899, 0xf5f: 0x38b1, 0xf60: 0x335d, 0xf61: 0x337d, 0xf62: 0x339d, 0xf63: 0x33bd,\n\t0xf64: 0x33dd, 0xf65: 0x33dd, 0xf66: 0x33fd, 0xf67: 0x341d, 0xf68: 0x343d, 0xf69: 0x345d,\n\t0xf6a: 0x347d, 0xf6b: 0x349d, 0xf6c: 0x34bd, 0xf6d: 0x34dd, 0xf6e: 0x34fd, 0xf6f: 0x351d,\n\t0xf70: 0x353d, 0xf71: 0x355d, 0xf72: 0x357d, 0xf73: 0x359d, 0xf74: 0x35bd, 0xf75: 0x35dd,\n\t0xf76: 0x35fd, 0xf77: 0x361d, 0xf78: 0x363d, 0xf79: 0x365d, 0xf7a: 0x367d, 0xf7b: 0x369d,\n\t0xf7c: 0x38c9, 0xf7d: 0x3901, 0xf7e: 0x36bd, 0xf7f: 0x0018,\n\t// Block 0x3e, offset 0xf80\n\t0xf80: 0x36dd, 0xf81: 0x36fd, 0xf82: 0x371d, 0xf83: 0x373d, 0xf84: 0x375d, 0xf85: 0x377d,\n\t0xf86: 0x379d, 0xf87: 0x37bd, 0xf88: 0x37dd, 0xf89: 0x37fd, 0xf8a: 0x381d, 0xf8b: 0x383d,\n\t0xf8c: 0x385d, 0xf8d: 0x387d, 0xf8e: 0x389d, 0xf8f: 0x38bd, 0xf90: 0x38dd, 0xf91: 0x38fd,\n\t0xf92: 0x391d, 0xf93: 0x393d, 0xf94: 0x395d, 0xf95: 0x397d, 0xf96: 0x399d, 0xf97: 0x39bd,\n\t0xf98: 0x39dd, 0xf99: 0x39fd, 0xf9a: 0x3a1d, 0xf9b: 0x3a3d, 0xf9c: 0x3a5d, 0xf9d: 0x3a7d,\n\t0xf9e: 0x3a9d, 0xf9f: 0x3abd, 0xfa0: 0x3add, 0xfa1: 0x3afd, 0xfa2: 0x3b1d, 0xfa3: 0x3b3d,\n\t0xfa4: 0x3b5d, 0xfa5: 0x3b7d, 0xfa6: 0x127d, 0xfa7: 0x3b9d, 0xfa8: 0x3bbd, 0xfa9: 0x3bdd,\n\t0xfaa: 0x3bfd, 0xfab: 0x3c1d, 0xfac: 0x3c3d, 0xfad: 0x3c5d, 0xfae: 0x239d, 0xfaf: 0x3c7d,\n\t0xfb0: 0x3c9d, 0xfb1: 0x3939, 0xfb2: 0x3951, 0xfb3: 0x3969, 0xfb4: 0x3981, 0xfb5: 0x3999,\n\t0xfb6: 0x39b1, 0xfb7: 0x39c9, 0xfb8: 0x39e1, 0xfb9: 0x39f9, 0xfba: 0x3a11, 0xfbb: 0x3a29,\n\t0xfbc: 0x3a41, 0xfbd: 0x3a59, 0xfbe: 0x3a71, 0xfbf: 0x3a89,\n\t// Block 0x3f, offset 0xfc0\n\t0xfc0: 0x3aa1, 0xfc1: 0x3ac9, 0xfc2: 0x3af1, 0xfc3: 0x3b19, 0xfc4: 0x3b41, 0xfc5: 0x3b69,\n\t0xfc6: 0x3b91, 0xfc7: 0x3bb9, 0xfc8: 0x3be1, 0xfc9: 0x3c09, 0xfca: 0x3c39, 0xfcb: 0x3c69,\n\t0xfcc: 0x3c99, 0xfcd: 0x3cbd, 0xfce: 0x3cb1, 0xfcf: 0x3cdd, 0xfd0: 0x3cfd, 0xfd1: 0x3d15,\n\t0xfd2: 0x3d2d, 0xfd3: 0x3d45, 0xfd4: 0x3d5d, 0xfd5: 0x3d5d, 0xfd6: 0x3d45, 0xfd7: 0x3d75,\n\t0xfd8: 0x07bd, 0xfd9: 0x3d8d, 0xfda: 0x3da5, 0xfdb: 0x3dbd, 0xfdc: 0x3dd5, 0xfdd: 0x3ded,\n\t0xfde: 0x3e05, 0xfdf: 0x3e1d, 0xfe0: 0x3e35, 0xfe1: 0x3e4d, 0xfe2: 0x3e65, 0xfe3: 0x3e7d,\n\t0xfe4: 0x3e95, 0xfe5: 0x3e95, 0xfe6: 0x3ead, 0xfe7: 0x3ead, 0xfe8: 0x3ec5, 0xfe9: 0x3ec5,\n\t0xfea: 0x3edd, 0xfeb: 0x3ef5, 0xfec: 0x3f0d, 0xfed: 0x3f25, 0xfee: 0x3f3d, 0xfef: 0x3f3d,\n\t0xff0: 0x3f55, 0xff1: 0x3f55, 0xff2: 0x3f55, 0xff3: 0x3f6d, 0xff4: 0x3f85, 0xff5: 0x3f9d,\n\t0xff6: 0x3fb5, 0xff7: 0x3f9d, 0xff8: 0x3fcd, 0xff9: 0x3fe5, 0xffa: 0x3f6d, 0xffb: 0x3ffd,\n\t0xffc: 0x4015, 0xffd: 0x4015, 0xffe: 0x4015, 0xfff: 0x0040,\n\t// Block 0x40, offset 0x1000\n\t0x1000: 0x3cc9, 0x1001: 0x3d31, 0x1002: 0x3d99, 0x1003: 0x3e01, 0x1004: 0x3e51, 0x1005: 0x3eb9,\n\t0x1006: 0x3f09, 0x1007: 0x3f59, 0x1008: 0x3fd9, 0x1009: 0x4041, 0x100a: 0x4091, 0x100b: 0x40e1,\n\t0x100c: 0x4131, 0x100d: 0x4199, 0x100e: 0x4201, 0x100f: 0x4251, 0x1010: 0x42a1, 0x1011: 0x42d9,\n\t0x1012: 0x4329, 0x1013: 0x4391, 0x1014: 0x43f9, 0x1015: 0x4431, 0x1016: 0x44b1, 0x1017: 0x4549,\n\t0x1018: 0x45c9, 0x1019: 0x4619, 0x101a: 0x4699, 0x101b: 0x4719, 0x101c: 0x4781, 0x101d: 0x47d1,\n\t0x101e: 0x4821, 0x101f: 0x4871, 0x1020: 0x48d9, 0x1021: 0x4959, 0x1022: 0x49c1, 0x1023: 0x4a11,\n\t0x1024: 0x4a61, 0x1025: 0x4ab1, 0x1026: 0x4ae9, 0x1027: 0x4b21, 0x1028: 0x4b59, 0x1029: 0x4b91,\n\t0x102a: 0x4be1, 0x102b: 0x4c31, 0x102c: 0x4cb1, 0x102d: 0x4d01, 0x102e: 0x4d69, 0x102f: 0x4de9,\n\t0x1030: 0x4e39, 0x1031: 0x4e71, 0x1032: 0x4ea9, 0x1033: 0x4f29, 0x1034: 0x4f91, 0x1035: 0x5011,\n\t0x1036: 0x5061, 0x1037: 0x50e1, 0x1038: 0x5119, 0x1039: 0x5169, 0x103a: 0x51b9, 0x103b: 0x5209,\n\t0x103c: 0x5259, 0x103d: 0x52a9, 0x103e: 0x5311, 0x103f: 0x5361,\n\t// Block 0x41, offset 0x1040\n\t0x1040: 0x5399, 0x1041: 0x53e9, 0x1042: 0x5439, 0x1043: 0x5489, 0x1044: 0x54f1, 0x1045: 0x5541,\n\t0x1046: 0x5591, 0x1047: 0x55e1, 0x1048: 0x5661, 0x1049: 0x56c9, 0x104a: 0x5701, 0x104b: 0x5781,\n\t0x104c: 0x57b9, 0x104d: 0x5821, 0x104e: 0x5889, 0x104f: 0x58d9, 0x1050: 0x5929, 0x1051: 0x5979,\n\t0x1052: 0x59e1, 0x1053: 0x5a19, 0x1054: 0x5a69, 0x1055: 0x5ad1, 0x1056: 0x5b09, 0x1057: 0x5b89,\n\t0x1058: 0x5bd9, 0x1059: 0x5c01, 0x105a: 0x5c29, 0x105b: 0x5c51, 0x105c: 0x5c79, 0x105d: 0x5ca1,\n\t0x105e: 0x5cc9, 0x105f: 0x5cf1, 0x1060: 0x5d19, 0x1061: 0x5d41, 0x1062: 0x5d69, 0x1063: 0x5d99,\n\t0x1064: 0x5dc9, 0x1065: 0x5df9, 0x1066: 0x5e29, 0x1067: 0x5e59, 0x1068: 0x5e89, 0x1069: 0x5eb9,\n\t0x106a: 0x5ee9, 0x106b: 0x5f19, 0x106c: 0x5f49, 0x106d: 0x5f79, 0x106e: 0x5fa9, 0x106f: 0x5fd9,\n\t0x1070: 0x6009, 0x1071: 0x402d, 0x1072: 0x6039, 0x1073: 0x6051, 0x1074: 0x404d, 0x1075: 0x6069,\n\t0x1076: 0x6081, 0x1077: 0x6099, 0x1078: 0x406d, 0x1079: 0x406d, 0x107a: 0x60b1, 0x107b: 0x60c9,\n\t0x107c: 0x6101, 0x107d: 0x6139, 0x107e: 0x6171, 0x107f: 0x61a9,\n\t// Block 0x42, offset 0x1080\n\t0x1080: 0x6211, 0x1081: 0x6229, 0x1082: 0x408d, 0x1083: 0x6241, 0x1084: 0x6259, 0x1085: 0x6271,\n\t0x1086: 0x6289, 0x1087: 0x62a1, 0x1088: 0x40ad, 0x1089: 0x62b9, 0x108a: 0x62e1, 0x108b: 0x62f9,\n\t0x108c: 0x40cd, 0x108d: 0x40cd, 0x108e: 0x6311, 0x108f: 0x6329, 0x1090: 0x6341, 0x1091: 0x40ed,\n\t0x1092: 0x410d, 0x1093: 0x412d, 0x1094: 0x414d, 0x1095: 0x416d, 0x1096: 0x6359, 0x1097: 0x6371,\n\t0x1098: 0x6389, 0x1099: 0x63a1, 0x109a: 0x63b9, 0x109b: 0x418d, 0x109c: 0x63d1, 0x109d: 0x63e9,\n\t0x109e: 0x6401, 0x109f: 0x41ad, 0x10a0: 0x41cd, 0x10a1: 0x6419, 0x10a2: 0x41ed, 0x10a3: 0x420d,\n\t0x10a4: 0x422d, 0x10a5: 0x6431, 0x10a6: 0x424d, 0x10a7: 0x6449, 0x10a8: 0x6479, 0x10a9: 0x6211,\n\t0x10aa: 0x426d, 0x10ab: 0x428d, 0x10ac: 0x42ad, 0x10ad: 0x42cd, 0x10ae: 0x64b1, 0x10af: 0x64f1,\n\t0x10b0: 0x6539, 0x10b1: 0x6551, 0x10b2: 0x42ed, 0x10b3: 0x6569, 0x10b4: 0x6581, 0x10b5: 0x6599,\n\t0x10b6: 0x430d, 0x10b7: 0x65b1, 0x10b8: 0x65c9, 0x10b9: 0x65b1, 0x10ba: 0x65e1, 0x10bb: 0x65f9,\n\t0x10bc: 0x432d, 0x10bd: 0x6611, 0x10be: 0x6629, 0x10bf: 0x6611,\n\t// Block 0x43, offset 0x10c0\n\t0x10c0: 0x434d, 0x10c1: 0x436d, 0x10c2: 0x0040, 0x10c3: 0x6641, 0x10c4: 0x6659, 0x10c5: 0x6671,\n\t0x10c6: 0x6689, 0x10c7: 0x0040, 0x10c8: 0x66c1, 0x10c9: 0x66d9, 0x10ca: 0x66f1, 0x10cb: 0x6709,\n\t0x10cc: 0x6721, 0x10cd: 0x6739, 0x10ce: 0x6401, 0x10cf: 0x6751, 0x10d0: 0x6769, 0x10d1: 0x6781,\n\t0x10d2: 0x438d, 0x10d3: 0x6799, 0x10d4: 0x6289, 0x10d5: 0x43ad, 0x10d6: 0x43cd, 0x10d7: 0x67b1,\n\t0x10d8: 0x0040, 0x10d9: 0x43ed, 0x10da: 0x67c9, 0x10db: 0x67e1, 0x10dc: 0x67f9, 0x10dd: 0x6811,\n\t0x10de: 0x6829, 0x10df: 0x6859, 0x10e0: 0x6889, 0x10e1: 0x68b1, 0x10e2: 0x68d9, 0x10e3: 0x6901,\n\t0x10e4: 0x6929, 0x10e5: 0x6951, 0x10e6: 0x6979, 0x10e7: 0x69a1, 0x10e8: 0x69c9, 0x10e9: 0x69f1,\n\t0x10ea: 0x6a21, 0x10eb: 0x6a51, 0x10ec: 0x6a81, 0x10ed: 0x6ab1, 0x10ee: 0x6ae1, 0x10ef: 0x6b11,\n\t0x10f0: 0x6b41, 0x10f1: 0x6b71, 0x10f2: 0x6ba1, 0x10f3: 0x6bd1, 0x10f4: 0x6c01, 0x10f5: 0x6c31,\n\t0x10f6: 0x6c61, 0x10f7: 0x6c91, 0x10f8: 0x6cc1, 0x10f9: 0x6cf1, 0x10fa: 0x6d21, 0x10fb: 0x6d51,\n\t0x10fc: 0x6d81, 0x10fd: 0x6db1, 0x10fe: 0x6de1, 0x10ff: 0x440d,\n\t// Block 0x44, offset 0x1100\n\t0x1100: 0xe00d, 0x1101: 0x0008, 0x1102: 0xe00d, 0x1103: 0x0008, 0x1104: 0xe00d, 0x1105: 0x0008,\n\t0x1106: 0xe00d, 0x1107: 0x0008, 0x1108: 0xe00d, 0x1109: 0x0008, 0x110a: 0xe00d, 0x110b: 0x0008,\n\t0x110c: 0xe00d, 0x110d: 0x0008, 0x110e: 0xe00d, 0x110f: 0x0008, 0x1110: 0xe00d, 0x1111: 0x0008,\n\t0x1112: 0xe00d, 0x1113: 0x0008, 0x1114: 0xe00d, 0x1115: 0x0008, 0x1116: 0xe00d, 0x1117: 0x0008,\n\t0x1118: 0xe00d, 0x1119: 0x0008, 0x111a: 0xe00d, 0x111b: 0x0008, 0x111c: 0xe00d, 0x111d: 0x0008,\n\t0x111e: 0xe00d, 0x111f: 0x0008, 0x1120: 0xe00d, 0x1121: 0x0008, 0x1122: 0xe00d, 0x1123: 0x0008,\n\t0x1124: 0xe00d, 0x1125: 0x0008, 0x1126: 0xe00d, 0x1127: 0x0008, 0x1128: 0xe00d, 0x1129: 0x0008,\n\t0x112a: 0xe00d, 0x112b: 0x0008, 0x112c: 0xe00d, 0x112d: 0x0008, 0x112e: 0x0008, 0x112f: 0x3308,\n\t0x1130: 0x3318, 0x1131: 0x3318, 0x1132: 0x3318, 0x1133: 0x0018, 0x1134: 0x3308, 0x1135: 0x3308,\n\t0x1136: 0x3308, 0x1137: 0x3308, 0x1138: 0x3308, 0x1139: 0x3308, 0x113a: 0x3308, 0x113b: 0x3308,\n\t0x113c: 0x3308, 0x113d: 0x3308, 0x113e: 0x0018, 0x113f: 0x0008,\n\t// Block 0x45, offset 0x1140\n\t0x1140: 0xe00d, 0x1141: 0x0008, 0x1142: 0xe00d, 0x1143: 0x0008, 0x1144: 0xe00d, 0x1145: 0x0008,\n\t0x1146: 0xe00d, 0x1147: 0x0008, 0x1148: 0xe00d, 0x1149: 0x0008, 0x114a: 0xe00d, 0x114b: 0x0008,\n\t0x114c: 0xe00d, 0x114d: 0x0008, 0x114e: 0xe00d, 0x114f: 0x0008, 0x1150: 0xe00d, 0x1151: 0x0008,\n\t0x1152: 0xe00d, 0x1153: 0x0008, 0x1154: 0xe00d, 0x1155: 0x0008, 0x1156: 0xe00d, 0x1157: 0x0008,\n\t0x1158: 0xe00d, 0x1159: 0x0008, 0x115a: 0xe00d, 0x115b: 0x0008, 0x115c: 0x0ea1, 0x115d: 0x6e11,\n\t0x115e: 0x3308, 0x115f: 0x3308, 0x1160: 0x0008, 0x1161: 0x0008, 0x1162: 0x0008, 0x1163: 0x0008,\n\t0x1164: 0x0008, 0x1165: 0x0008, 0x1166: 0x0008, 0x1167: 0x0008, 0x1168: 0x0008, 0x1169: 0x0008,\n\t0x116a: 0x0008, 0x116b: 0x0008, 0x116c: 0x0008, 0x116d: 0x0008, 0x116e: 0x0008, 0x116f: 0x0008,\n\t0x1170: 0x0008, 0x1171: 0x0008, 0x1172: 0x0008, 0x1173: 0x0008, 0x1174: 0x0008, 0x1175: 0x0008,\n\t0x1176: 0x0008, 0x1177: 0x0008, 0x1178: 0x0008, 0x1179: 0x0008, 0x117a: 0x0008, 0x117b: 0x0008,\n\t0x117c: 0x0008, 0x117d: 0x0008, 0x117e: 0x0008, 0x117f: 0x0008,\n\t// Block 0x46, offset 0x1180\n\t0x1180: 0x0018, 0x1181: 0x0018, 0x1182: 0x0018, 0x1183: 0x0018, 0x1184: 0x0018, 0x1185: 0x0018,\n\t0x1186: 0x0018, 0x1187: 0x0018, 0x1188: 0x0018, 0x1189: 0x0018, 0x118a: 0x0018, 0x118b: 0x0018,\n\t0x118c: 0x0018, 0x118d: 0x0018, 0x118e: 0x0018, 0x118f: 0x0018, 0x1190: 0x0018, 0x1191: 0x0018,\n\t0x1192: 0x0018, 0x1193: 0x0018, 0x1194: 0x0018, 0x1195: 0x0018, 0x1196: 0x0018, 0x1197: 0x0008,\n\t0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008,\n\t0x119e: 0x0008, 0x119f: 0x0008, 0x11a0: 0x0018, 0x11a1: 0x0018, 0x11a2: 0xe00d, 0x11a3: 0x0008,\n\t0x11a4: 0xe00d, 0x11a5: 0x0008, 0x11a6: 0xe00d, 0x11a7: 0x0008, 0x11a8: 0xe00d, 0x11a9: 0x0008,\n\t0x11aa: 0xe00d, 0x11ab: 0x0008, 0x11ac: 0xe00d, 0x11ad: 0x0008, 0x11ae: 0xe00d, 0x11af: 0x0008,\n\t0x11b0: 0x0008, 0x11b1: 0x0008, 0x11b2: 0xe00d, 0x11b3: 0x0008, 0x11b4: 0xe00d, 0x11b5: 0x0008,\n\t0x11b6: 0xe00d, 0x11b7: 0x0008, 0x11b8: 0xe00d, 0x11b9: 0x0008, 0x11ba: 0xe00d, 0x11bb: 0x0008,\n\t0x11bc: 0xe00d, 0x11bd: 0x0008, 0x11be: 0xe00d, 0x11bf: 0x0008,\n\t// Block 0x47, offset 0x11c0\n\t0x11c0: 0xe00d, 0x11c1: 0x0008, 0x11c2: 0xe00d, 0x11c3: 0x0008, 0x11c4: 0xe00d, 0x11c5: 0x0008,\n\t0x11c6: 0xe00d, 0x11c7: 0x0008, 0x11c8: 0xe00d, 0x11c9: 0x0008, 0x11ca: 0xe00d, 0x11cb: 0x0008,\n\t0x11cc: 0xe00d, 0x11cd: 0x0008, 0x11ce: 0xe00d, 0x11cf: 0x0008, 0x11d0: 0xe00d, 0x11d1: 0x0008,\n\t0x11d2: 0xe00d, 0x11d3: 0x0008, 0x11d4: 0xe00d, 0x11d5: 0x0008, 0x11d6: 0xe00d, 0x11d7: 0x0008,\n\t0x11d8: 0xe00d, 0x11d9: 0x0008, 0x11da: 0xe00d, 0x11db: 0x0008, 0x11dc: 0xe00d, 0x11dd: 0x0008,\n\t0x11de: 0xe00d, 0x11df: 0x0008, 0x11e0: 0xe00d, 0x11e1: 0x0008, 0x11e2: 0xe00d, 0x11e3: 0x0008,\n\t0x11e4: 0xe00d, 0x11e5: 0x0008, 0x11e6: 0xe00d, 0x11e7: 0x0008, 0x11e8: 0xe00d, 0x11e9: 0x0008,\n\t0x11ea: 0xe00d, 0x11eb: 0x0008, 0x11ec: 0xe00d, 0x11ed: 0x0008, 0x11ee: 0xe00d, 0x11ef: 0x0008,\n\t0x11f0: 0xe0fd, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008,\n\t0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0xe01d, 0x11fa: 0x0008, 0x11fb: 0xe03d,\n\t0x11fc: 0x0008, 0x11fd: 0x442d, 0x11fe: 0xe00d, 0x11ff: 0x0008,\n\t// Block 0x48, offset 0x1200\n\t0x1200: 0xe00d, 0x1201: 0x0008, 0x1202: 0xe00d, 0x1203: 0x0008, 0x1204: 0xe00d, 0x1205: 0x0008,\n\t0x1206: 0xe00d, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0018, 0x120a: 0x0018, 0x120b: 0xe03d,\n\t0x120c: 0x0008, 0x120d: 0x11d9, 0x120e: 0x0008, 0x120f: 0x0008, 0x1210: 0xe00d, 0x1211: 0x0008,\n\t0x1212: 0xe00d, 0x1213: 0x0008, 0x1214: 0x0008, 0x1215: 0x0008, 0x1216: 0xe00d, 0x1217: 0x0008,\n\t0x1218: 0xe00d, 0x1219: 0x0008, 0x121a: 0xe00d, 0x121b: 0x0008, 0x121c: 0xe00d, 0x121d: 0x0008,\n\t0x121e: 0xe00d, 0x121f: 0x0008, 0x1220: 0xe00d, 0x1221: 0x0008, 0x1222: 0xe00d, 0x1223: 0x0008,\n\t0x1224: 0xe00d, 0x1225: 0x0008, 0x1226: 0xe00d, 0x1227: 0x0008, 0x1228: 0xe00d, 0x1229: 0x0008,\n\t0x122a: 0x6e29, 0x122b: 0x1029, 0x122c: 0x11c1, 0x122d: 0x6e41, 0x122e: 0x1221, 0x122f: 0x0040,\n\t0x1230: 0x6e59, 0x1231: 0x6e71, 0x1232: 0x1239, 0x1233: 0x444d, 0x1234: 0xe00d, 0x1235: 0x0008,\n\t0x1236: 0xe00d, 0x1237: 0x0008, 0x1238: 0x0040, 0x1239: 0x0040, 0x123a: 0x0040, 0x123b: 0x0040,\n\t0x123c: 0x0040, 0x123d: 0x0040, 0x123e: 0x0040, 0x123f: 0x0040,\n\t// Block 0x49, offset 0x1240\n\t0x1240: 0x64d5, 0x1241: 0x64f5, 0x1242: 0x6515, 0x1243: 0x6535, 0x1244: 0x6555, 0x1245: 0x6575,\n\t0x1246: 0x6595, 0x1247: 0x65b5, 0x1248: 0x65d5, 0x1249: 0x65f5, 0x124a: 0x6615, 0x124b: 0x6635,\n\t0x124c: 0x6655, 0x124d: 0x6675, 0x124e: 0x0008, 0x124f: 0x0008, 0x1250: 0x6695, 0x1251: 0x0008,\n\t0x1252: 0x66b5, 0x1253: 0x0008, 0x1254: 0x0008, 0x1255: 0x66d5, 0x1256: 0x66f5, 0x1257: 0x6715,\n\t0x1258: 0x6735, 0x1259: 0x6755, 0x125a: 0x6775, 0x125b: 0x6795, 0x125c: 0x67b5, 0x125d: 0x67d5,\n\t0x125e: 0x67f5, 0x125f: 0x0008, 0x1260: 0x6815, 0x1261: 0x0008, 0x1262: 0x6835, 0x1263: 0x0008,\n\t0x1264: 0x0008, 0x1265: 0x6855, 0x1266: 0x6875, 0x1267: 0x0008, 0x1268: 0x0008, 0x1269: 0x0008,\n\t0x126a: 0x6895, 0x126b: 0x68b5, 0x126c: 0x68d5, 0x126d: 0x68f5, 0x126e: 0x6915, 0x126f: 0x6935,\n\t0x1270: 0x6955, 0x1271: 0x6975, 0x1272: 0x6995, 0x1273: 0x69b5, 0x1274: 0x69d5, 0x1275: 0x69f5,\n\t0x1276: 0x6a15, 0x1277: 0x6a35, 0x1278: 0x6a55, 0x1279: 0x6a75, 0x127a: 0x6a95, 0x127b: 0x6ab5,\n\t0x127c: 0x6ad5, 0x127d: 0x6af5, 0x127e: 0x6b15, 0x127f: 0x6b35,\n\t// Block 0x4a, offset 0x1280\n\t0x1280: 0x7a95, 0x1281: 0x7ab5, 0x1282: 0x7ad5, 0x1283: 0x7af5, 0x1284: 0x7b15, 0x1285: 0x7b35,\n\t0x1286: 0x7b55, 0x1287: 0x7b75, 0x1288: 0x7b95, 0x1289: 0x7bb5, 0x128a: 0x7bd5, 0x128b: 0x7bf5,\n\t0x128c: 0x7c15, 0x128d: 0x7c35, 0x128e: 0x7c55, 0x128f: 0x6ec9, 0x1290: 0x6ef1, 0x1291: 0x6f19,\n\t0x1292: 0x7c75, 0x1293: 0x7c95, 0x1294: 0x7cb5, 0x1295: 0x6f41, 0x1296: 0x6f69, 0x1297: 0x6f91,\n\t0x1298: 0x7cd5, 0x1299: 0x7cf5, 0x129a: 0x0040, 0x129b: 0x0040, 0x129c: 0x0040, 0x129d: 0x0040,\n\t0x129e: 0x0040, 0x129f: 0x0040, 0x12a0: 0x0040, 0x12a1: 0x0040, 0x12a2: 0x0040, 0x12a3: 0x0040,\n\t0x12a4: 0x0040, 0x12a5: 0x0040, 0x12a6: 0x0040, 0x12a7: 0x0040, 0x12a8: 0x0040, 0x12a9: 0x0040,\n\t0x12aa: 0x0040, 0x12ab: 0x0040, 0x12ac: 0x0040, 0x12ad: 0x0040, 0x12ae: 0x0040, 0x12af: 0x0040,\n\t0x12b0: 0x0040, 0x12b1: 0x0040, 0x12b2: 0x0040, 0x12b3: 0x0040, 0x12b4: 0x0040, 0x12b5: 0x0040,\n\t0x12b6: 0x0040, 0x12b7: 0x0040, 0x12b8: 0x0040, 0x12b9: 0x0040, 0x12ba: 0x0040, 0x12bb: 0x0040,\n\t0x12bc: 0x0040, 0x12bd: 0x0040, 0x12be: 0x0040, 0x12bf: 0x0040,\n\t// Block 0x4b, offset 0x12c0\n\t0x12c0: 0x6fb9, 0x12c1: 0x6fd1, 0x12c2: 0x6fe9, 0x12c3: 0x7d15, 0x12c4: 0x7d35, 0x12c5: 0x7001,\n\t0x12c6: 0x7001, 0x12c7: 0x0040, 0x12c8: 0x0040, 0x12c9: 0x0040, 0x12ca: 0x0040, 0x12cb: 0x0040,\n\t0x12cc: 0x0040, 0x12cd: 0x0040, 0x12ce: 0x0040, 0x12cf: 0x0040, 0x12d0: 0x0040, 0x12d1: 0x0040,\n\t0x12d2: 0x0040, 0x12d3: 0x7019, 0x12d4: 0x7041, 0x12d5: 0x7069, 0x12d6: 0x7091, 0x12d7: 0x70b9,\n\t0x12d8: 0x0040, 0x12d9: 0x0040, 0x12da: 0x0040, 0x12db: 0x0040, 0x12dc: 0x0040, 0x12dd: 0x70e1,\n\t0x12de: 0x3308, 0x12df: 0x7109, 0x12e0: 0x7131, 0x12e1: 0x20a9, 0x12e2: 0x20f1, 0x12e3: 0x7149,\n\t0x12e4: 0x7161, 0x12e5: 0x7179, 0x12e6: 0x7191, 0x12e7: 0x71a9, 0x12e8: 0x71c1, 0x12e9: 0x1fb2,\n\t0x12ea: 0x71d9, 0x12eb: 0x7201, 0x12ec: 0x7229, 0x12ed: 0x7261, 0x12ee: 0x7299, 0x12ef: 0x72c1,\n\t0x12f0: 0x72e9, 0x12f1: 0x7311, 0x12f2: 0x7339, 0x12f3: 0x7361, 0x12f4: 0x7389, 0x12f5: 0x73b1,\n\t0x12f6: 0x73d9, 0x12f7: 0x0040, 0x12f8: 0x7401, 0x12f9: 0x7429, 0x12fa: 0x7451, 0x12fb: 0x7479,\n\t0x12fc: 0x74a1, 0x12fd: 0x0040, 0x12fe: 0x74c9, 0x12ff: 0x0040,\n\t// Block 0x4c, offset 0x1300\n\t0x1300: 0x74f1, 0x1301: 0x7519, 0x1302: 0x0040, 0x1303: 0x7541, 0x1304: 0x7569, 0x1305: 0x0040,\n\t0x1306: 0x7591, 0x1307: 0x75b9, 0x1308: 0x75e1, 0x1309: 0x7609, 0x130a: 0x7631, 0x130b: 0x7659,\n\t0x130c: 0x7681, 0x130d: 0x76a9, 0x130e: 0x76d1, 0x130f: 0x76f9, 0x1310: 0x7721, 0x1311: 0x7721,\n\t0x1312: 0x7739, 0x1313: 0x7739, 0x1314: 0x7739, 0x1315: 0x7739, 0x1316: 0x7751, 0x1317: 0x7751,\n\t0x1318: 0x7751, 0x1319: 0x7751, 0x131a: 0x7769, 0x131b: 0x7769, 0x131c: 0x7769, 0x131d: 0x7769,\n\t0x131e: 0x7781, 0x131f: 0x7781, 0x1320: 0x7781, 0x1321: 0x7781, 0x1322: 0x7799, 0x1323: 0x7799,\n\t0x1324: 0x7799, 0x1325: 0x7799, 0x1326: 0x77b1, 0x1327: 0x77b1, 0x1328: 0x77b1, 0x1329: 0x77b1,\n\t0x132a: 0x77c9, 0x132b: 0x77c9, 0x132c: 0x77c9, 0x132d: 0x77c9, 0x132e: 0x77e1, 0x132f: 0x77e1,\n\t0x1330: 0x77e1, 0x1331: 0x77e1, 0x1332: 0x77f9, 0x1333: 0x77f9, 0x1334: 0x77f9, 0x1335: 0x77f9,\n\t0x1336: 0x7811, 0x1337: 0x7811, 0x1338: 0x7811, 0x1339: 0x7811, 0x133a: 0x7829, 0x133b: 0x7829,\n\t0x133c: 0x7829, 0x133d: 0x7829, 0x133e: 0x7841, 0x133f: 0x7841,\n\t// Block 0x4d, offset 0x1340\n\t0x1340: 0x7841, 0x1341: 0x7841, 0x1342: 0x7859, 0x1343: 0x7859, 0x1344: 0x7871, 0x1345: 0x7871,\n\t0x1346: 0x7889, 0x1347: 0x7889, 0x1348: 0x78a1, 0x1349: 0x78a1, 0x134a: 0x78b9, 0x134b: 0x78b9,\n\t0x134c: 0x78d1, 0x134d: 0x78d1, 0x134e: 0x78e9, 0x134f: 0x78e9, 0x1350: 0x78e9, 0x1351: 0x78e9,\n\t0x1352: 0x7901, 0x1353: 0x7901, 0x1354: 0x7901, 0x1355: 0x7901, 0x1356: 0x7919, 0x1357: 0x7919,\n\t0x1358: 0x7919, 0x1359: 0x7919, 0x135a: 0x7931, 0x135b: 0x7931, 0x135c: 0x7931, 0x135d: 0x7931,\n\t0x135e: 0x7949, 0x135f: 0x7949, 0x1360: 0x7961, 0x1361: 0x7961, 0x1362: 0x7961, 0x1363: 0x7961,\n\t0x1364: 0x7979, 0x1365: 0x7979, 0x1366: 0x7991, 0x1367: 0x7991, 0x1368: 0x7991, 0x1369: 0x7991,\n\t0x136a: 0x79a9, 0x136b: 0x79a9, 0x136c: 0x79a9, 0x136d: 0x79a9, 0x136e: 0x79c1, 0x136f: 0x79c1,\n\t0x1370: 0x79d9, 0x1371: 0x79d9, 0x1372: 0x0818, 0x1373: 0x0818, 0x1374: 0x0818, 0x1375: 0x0818,\n\t0x1376: 0x0818, 0x1377: 0x0818, 0x1378: 0x0818, 0x1379: 0x0818, 0x137a: 0x0818, 0x137b: 0x0818,\n\t0x137c: 0x0818, 0x137d: 0x0818, 0x137e: 0x0818, 0x137f: 0x0818,\n\t// Block 0x4e, offset 0x1380\n\t0x1380: 0x0818, 0x1381: 0x0818, 0x1382: 0x0040, 0x1383: 0x0040, 0x1384: 0x0040, 0x1385: 0x0040,\n\t0x1386: 0x0040, 0x1387: 0x0040, 0x1388: 0x0040, 0x1389: 0x0040, 0x138a: 0x0040, 0x138b: 0x0040,\n\t0x138c: 0x0040, 0x138d: 0x0040, 0x138e: 0x0040, 0x138f: 0x0040, 0x1390: 0x0040, 0x1391: 0x0040,\n\t0x1392: 0x0040, 0x1393: 0x79f1, 0x1394: 0x79f1, 0x1395: 0x79f1, 0x1396: 0x79f1, 0x1397: 0x7a09,\n\t0x1398: 0x7a09, 0x1399: 0x7a21, 0x139a: 0x7a21, 0x139b: 0x7a39, 0x139c: 0x7a39, 0x139d: 0x0479,\n\t0x139e: 0x7a51, 0x139f: 0x7a51, 0x13a0: 0x7a69, 0x13a1: 0x7a69, 0x13a2: 0x7a81, 0x13a3: 0x7a81,\n\t0x13a4: 0x7a99, 0x13a5: 0x7a99, 0x13a6: 0x7a99, 0x13a7: 0x7a99, 0x13a8: 0x7ab1, 0x13a9: 0x7ab1,\n\t0x13aa: 0x7ac9, 0x13ab: 0x7ac9, 0x13ac: 0x7af1, 0x13ad: 0x7af1, 0x13ae: 0x7b19, 0x13af: 0x7b19,\n\t0x13b0: 0x7b41, 0x13b1: 0x7b41, 0x13b2: 0x7b69, 0x13b3: 0x7b69, 0x13b4: 0x7b91, 0x13b5: 0x7b91,\n\t0x13b6: 0x7bb9, 0x13b7: 0x7bb9, 0x13b8: 0x7bb9, 0x13b9: 0x7be1, 0x13ba: 0x7be1, 0x13bb: 0x7be1,\n\t0x13bc: 0x7c09, 0x13bd: 0x7c09, 0x13be: 0x7c09, 0x13bf: 0x7c09,\n\t// Block 0x4f, offset 0x13c0\n\t0x13c0: 0x85f9, 0x13c1: 0x8621, 0x13c2: 0x8649, 0x13c3: 0x8671, 0x13c4: 0x8699, 0x13c5: 0x86c1,\n\t0x13c6: 0x86e9, 0x13c7: 0x8711, 0x13c8: 0x8739, 0x13c9: 0x8761, 0x13ca: 0x8789, 0x13cb: 0x87b1,\n\t0x13cc: 0x87d9, 0x13cd: 0x8801, 0x13ce: 0x8829, 0x13cf: 0x8851, 0x13d0: 0x8879, 0x13d1: 0x88a1,\n\t0x13d2: 0x88c9, 0x13d3: 0x88f1, 0x13d4: 0x8919, 0x13d5: 0x8941, 0x13d6: 0x8969, 0x13d7: 0x8991,\n\t0x13d8: 0x89b9, 0x13d9: 0x89e1, 0x13da: 0x8a09, 0x13db: 0x8a31, 0x13dc: 0x8a59, 0x13dd: 0x8a81,\n\t0x13de: 0x8aaa, 0x13df: 0x8ada, 0x13e0: 0x8b0a, 0x13e1: 0x8b3a, 0x13e2: 0x8b6a, 0x13e3: 0x8b9a,\n\t0x13e4: 0x8bc9, 0x13e5: 0x8bf1, 0x13e6: 0x7c71, 0x13e7: 0x8c19, 0x13e8: 0x7be1, 0x13e9: 0x7c99,\n\t0x13ea: 0x8c41, 0x13eb: 0x8c69, 0x13ec: 0x7d39, 0x13ed: 0x8c91, 0x13ee: 0x7d61, 0x13ef: 0x7d89,\n\t0x13f0: 0x8cb9, 0x13f1: 0x8ce1, 0x13f2: 0x7e29, 0x13f3: 0x8d09, 0x13f4: 0x7e51, 0x13f5: 0x7e79,\n\t0x13f6: 0x8d31, 0x13f7: 0x8d59, 0x13f8: 0x7ec9, 0x13f9: 0x8d81, 0x13fa: 0x7ef1, 0x13fb: 0x7f19,\n\t0x13fc: 0x83a1, 0x13fd: 0x83c9, 0x13fe: 0x8441, 0x13ff: 0x8469,\n\t// Block 0x50, offset 0x1400\n\t0x1400: 0x8491, 0x1401: 0x8531, 0x1402: 0x8559, 0x1403: 0x8581, 0x1404: 0x85a9, 0x1405: 0x8649,\n\t0x1406: 0x8671, 0x1407: 0x8699, 0x1408: 0x8da9, 0x1409: 0x8739, 0x140a: 0x8dd1, 0x140b: 0x8df9,\n\t0x140c: 0x8829, 0x140d: 0x8e21, 0x140e: 0x8851, 0x140f: 0x8879, 0x1410: 0x8a81, 0x1411: 0x8e49,\n\t0x1412: 0x8e71, 0x1413: 0x89b9, 0x1414: 0x8e99, 0x1415: 0x89e1, 0x1416: 0x8a09, 0x1417: 0x7c21,\n\t0x1418: 0x7c49, 0x1419: 0x8ec1, 0x141a: 0x7c71, 0x141b: 0x8ee9, 0x141c: 0x7cc1, 0x141d: 0x7ce9,\n\t0x141e: 0x7d11, 0x141f: 0x7d39, 0x1420: 0x8f11, 0x1421: 0x7db1, 0x1422: 0x7dd9, 0x1423: 0x7e01,\n\t0x1424: 0x7e29, 0x1425: 0x8f39, 0x1426: 0x7ec9, 0x1427: 0x7f41, 0x1428: 0x7f69, 0x1429: 0x7f91,\n\t0x142a: 0x7fb9, 0x142b: 0x7fe1, 0x142c: 0x8031, 0x142d: 0x8059, 0x142e: 0x8081, 0x142f: 0x80a9,\n\t0x1430: 0x80d1, 0x1431: 0x80f9, 0x1432: 0x8f61, 0x1433: 0x8121, 0x1434: 0x8149, 0x1435: 0x8171,\n\t0x1436: 0x8199, 0x1437: 0x81c1, 0x1438: 0x81e9, 0x1439: 0x8239, 0x143a: 0x8261, 0x143b: 0x8289,\n\t0x143c: 0x82b1, 0x143d: 0x82d9, 0x143e: 0x8301, 0x143f: 0x8329,\n\t// Block 0x51, offset 0x1440\n\t0x1440: 0x8351, 0x1441: 0x8379, 0x1442: 0x83f1, 0x1443: 0x8419, 0x1444: 0x84b9, 0x1445: 0x84e1,\n\t0x1446: 0x8509, 0x1447: 0x8531, 0x1448: 0x8559, 0x1449: 0x85d1, 0x144a: 0x85f9, 0x144b: 0x8621,\n\t0x144c: 0x8649, 0x144d: 0x8f89, 0x144e: 0x86c1, 0x144f: 0x86e9, 0x1450: 0x8711, 0x1451: 0x8739,\n\t0x1452: 0x87b1, 0x1453: 0x87d9, 0x1454: 0x8801, 0x1455: 0x8829, 0x1456: 0x8fb1, 0x1457: 0x88a1,\n\t0x1458: 0x88c9, 0x1459: 0x8fd9, 0x145a: 0x8941, 0x145b: 0x8969, 0x145c: 0x8991, 0x145d: 0x89b9,\n\t0x145e: 0x9001, 0x145f: 0x7c71, 0x1460: 0x8ee9, 0x1461: 0x7d39, 0x1462: 0x8f11, 0x1463: 0x7e29,\n\t0x1464: 0x8f39, 0x1465: 0x7ec9, 0x1466: 0x9029, 0x1467: 0x80d1, 0x1468: 0x9051, 0x1469: 0x9079,\n\t0x146a: 0x90a1, 0x146b: 0x8531, 0x146c: 0x8559, 0x146d: 0x8649, 0x146e: 0x8829, 0x146f: 0x8fb1,\n\t0x1470: 0x89b9, 0x1471: 0x9001, 0x1472: 0x90c9, 0x1473: 0x9101, 0x1474: 0x9139, 0x1475: 0x9171,\n\t0x1476: 0x9199, 0x1477: 0x91c1, 0x1478: 0x91e9, 0x1479: 0x9211, 0x147a: 0x9239, 0x147b: 0x9261,\n\t0x147c: 0x9289, 0x147d: 0x92b1, 0x147e: 0x92d9, 0x147f: 0x9301,\n\t// Block 0x52, offset 0x1480\n\t0x1480: 0x9329, 0x1481: 0x9351, 0x1482: 0x9379, 0x1483: 0x93a1, 0x1484: 0x93c9, 0x1485: 0x93f1,\n\t0x1486: 0x9419, 0x1487: 0x9441, 0x1488: 0x9469, 0x1489: 0x9491, 0x148a: 0x94b9, 0x148b: 0x94e1,\n\t0x148c: 0x9079, 0x148d: 0x9509, 0x148e: 0x9531, 0x148f: 0x9559, 0x1490: 0x9581, 0x1491: 0x9171,\n\t0x1492: 0x9199, 0x1493: 0x91c1, 0x1494: 0x91e9, 0x1495: 0x9211, 0x1496: 0x9239, 0x1497: 0x9261,\n\t0x1498: 0x9289, 0x1499: 0x92b1, 0x149a: 0x92d9, 0x149b: 0x9301, 0x149c: 0x9329, 0x149d: 0x9351,\n\t0x149e: 0x9379, 0x149f: 0x93a1, 0x14a0: 0x93c9, 0x14a1: 0x93f1, 0x14a2: 0x9419, 0x14a3: 0x9441,\n\t0x14a4: 0x9469, 0x14a5: 0x9491, 0x14a6: 0x94b9, 0x14a7: 0x94e1, 0x14a8: 0x9079, 0x14a9: 0x9509,\n\t0x14aa: 0x9531, 0x14ab: 0x9559, 0x14ac: 0x9581, 0x14ad: 0x9491, 0x14ae: 0x94b9, 0x14af: 0x94e1,\n\t0x14b0: 0x9079, 0x14b1: 0x9051, 0x14b2: 0x90a1, 0x14b3: 0x8211, 0x14b4: 0x8059, 0x14b5: 0x8081,\n\t0x14b6: 0x80a9, 0x14b7: 0x9491, 0x14b8: 0x94b9, 0x14b9: 0x94e1, 0x14ba: 0x8211, 0x14bb: 0x8239,\n\t0x14bc: 0x95a9, 0x14bd: 0x95a9, 0x14be: 0x0018, 0x14bf: 0x0018,\n\t// Block 0x53, offset 0x14c0\n\t0x14c0: 0x0040, 0x14c1: 0x0040, 0x14c2: 0x0040, 0x14c3: 0x0040, 0x14c4: 0x0040, 0x14c5: 0x0040,\n\t0x14c6: 0x0040, 0x14c7: 0x0040, 0x14c8: 0x0040, 0x14c9: 0x0040, 0x14ca: 0x0040, 0x14cb: 0x0040,\n\t0x14cc: 0x0040, 0x14cd: 0x0040, 0x14ce: 0x0040, 0x14cf: 0x0040, 0x14d0: 0x95d1, 0x14d1: 0x9609,\n\t0x14d2: 0x9609, 0x14d3: 0x9641, 0x14d4: 0x9679, 0x14d5: 0x96b1, 0x14d6: 0x96e9, 0x14d7: 0x9721,\n\t0x14d8: 0x9759, 0x14d9: 0x9759, 0x14da: 0x9791, 0x14db: 0x97c9, 0x14dc: 0x9801, 0x14dd: 0x9839,\n\t0x14de: 0x9871, 0x14df: 0x98a9, 0x14e0: 0x98a9, 0x14e1: 0x98e1, 0x14e2: 0x9919, 0x14e3: 0x9919,\n\t0x14e4: 0x9951, 0x14e5: 0x9951, 0x14e6: 0x9989, 0x14e7: 0x99c1, 0x14e8: 0x99c1, 0x14e9: 0x99f9,\n\t0x14ea: 0x9a31, 0x14eb: 0x9a31, 0x14ec: 0x9a69, 0x14ed: 0x9a69, 0x14ee: 0x9aa1, 0x14ef: 0x9ad9,\n\t0x14f0: 0x9ad9, 0x14f1: 0x9b11, 0x14f2: 0x9b11, 0x14f3: 0x9b49, 0x14f4: 0x9b81, 0x14f5: 0x9bb9,\n\t0x14f6: 0x9bf1, 0x14f7: 0x9bf1, 0x14f8: 0x9c29, 0x14f9: 0x9c61, 0x14fa: 0x9c99, 0x14fb: 0x9cd1,\n\t0x14fc: 0x9d09, 0x14fd: 0x9d09, 0x14fe: 0x9d41, 0x14ff: 0x9d79,\n\t// Block 0x54, offset 0x1500\n\t0x1500: 0xa949, 0x1501: 0xa981, 0x1502: 0xa9b9, 0x1503: 0xa8a1, 0x1504: 0x9bb9, 0x1505: 0x9989,\n\t0x1506: 0xa9f1, 0x1507: 0xaa29, 0x1508: 0x0040, 0x1509: 0x0040, 0x150a: 0x0040, 0x150b: 0x0040,\n\t0x150c: 0x0040, 0x150d: 0x0040, 0x150e: 0x0040, 0x150f: 0x0040, 0x1510: 0x0040, 0x1511: 0x0040,\n\t0x1512: 0x0040, 0x1513: 0x0040, 0x1514: 0x0040, 0x1515: 0x0040, 0x1516: 0x0040, 0x1517: 0x0040,\n\t0x1518: 0x0040, 0x1519: 0x0040, 0x151a: 0x0040, 0x151b: 0x0040, 0x151c: 0x0040, 0x151d: 0x0040,\n\t0x151e: 0x0040, 0x151f: 0x0040, 0x1520: 0x0040, 0x1521: 0x0040, 0x1522: 0x0040, 0x1523: 0x0040,\n\t0x1524: 0x0040, 0x1525: 0x0040, 0x1526: 0x0040, 0x1527: 0x0040, 0x1528: 0x0040, 0x1529: 0x0040,\n\t0x152a: 0x0040, 0x152b: 0x0040, 0x152c: 0x0040, 0x152d: 0x0040, 0x152e: 0x0040, 0x152f: 0x0040,\n\t0x1530: 0xaa61, 0x1531: 0xaa99, 0x1532: 0xaad1, 0x1533: 0xab19, 0x1534: 0xab61, 0x1535: 0xaba9,\n\t0x1536: 0xabf1, 0x1537: 0xac39, 0x1538: 0xac81, 0x1539: 0xacc9, 0x153a: 0xad02, 0x153b: 0xae12,\n\t0x153c: 0xae91, 0x153d: 0x0018, 0x153e: 0x0040, 0x153f: 0x0040,\n\t// Block 0x55, offset 0x1540\n\t0x1540: 0x33c0, 0x1541: 0x33c0, 0x1542: 0x33c0, 0x1543: 0x33c0, 0x1544: 0x33c0, 0x1545: 0x33c0,\n\t0x1546: 0x33c0, 0x1547: 0x33c0, 0x1548: 0x33c0, 0x1549: 0x33c0, 0x154a: 0x33c0, 0x154b: 0x33c0,\n\t0x154c: 0x33c0, 0x154d: 0x33c0, 0x154e: 0x33c0, 0x154f: 0x33c0, 0x1550: 0xaeda, 0x1551: 0x7d55,\n\t0x1552: 0x0040, 0x1553: 0xaeea, 0x1554: 0x03c2, 0x1555: 0xaefa, 0x1556: 0xaf0a, 0x1557: 0x7d75,\n\t0x1558: 0x7d95, 0x1559: 0x0040, 0x155a: 0x0040, 0x155b: 0x0040, 0x155c: 0x0040, 0x155d: 0x0040,\n\t0x155e: 0x0040, 0x155f: 0x0040, 0x1560: 0x3308, 0x1561: 0x3308, 0x1562: 0x3308, 0x1563: 0x3308,\n\t0x1564: 0x3308, 0x1565: 0x3308, 0x1566: 0x3308, 0x1567: 0x3308, 0x1568: 0x3308, 0x1569: 0x3308,\n\t0x156a: 0x3308, 0x156b: 0x3308, 0x156c: 0x3308, 0x156d: 0x3308, 0x156e: 0x3308, 0x156f: 0x3308,\n\t0x1570: 0x0040, 0x1571: 0x7db5, 0x1572: 0x7dd5, 0x1573: 0xaf1a, 0x1574: 0xaf1a, 0x1575: 0x1fd2,\n\t0x1576: 0x1fe2, 0x1577: 0xaf2a, 0x1578: 0xaf3a, 0x1579: 0x7df5, 0x157a: 0x7e15, 0x157b: 0x7e35,\n\t0x157c: 0x7df5, 0x157d: 0x7e55, 0x157e: 0x7e75, 0x157f: 0x7e55,\n\t// Block 0x56, offset 0x1580\n\t0x1580: 0x7e95, 0x1581: 0x7eb5, 0x1582: 0x7ed5, 0x1583: 0x7eb5, 0x1584: 0x7ef5, 0x1585: 0x0018,\n\t0x1586: 0x0018, 0x1587: 0xaf4a, 0x1588: 0xaf5a, 0x1589: 0x7f16, 0x158a: 0x7f36, 0x158b: 0x7f56,\n\t0x158c: 0x7f76, 0x158d: 0xaf1a, 0x158e: 0xaf1a, 0x158f: 0xaf1a, 0x1590: 0xaeda, 0x1591: 0x7f95,\n\t0x1592: 0x0040, 0x1593: 0x0040, 0x1594: 0x03c2, 0x1595: 0xaeea, 0x1596: 0xaf0a, 0x1597: 0xaefa,\n\t0x1598: 0x7fb5, 0x1599: 0x1fd2, 0x159a: 0x1fe2, 0x159b: 0xaf2a, 0x159c: 0xaf3a, 0x159d: 0x7e95,\n\t0x159e: 0x7ef5, 0x159f: 0xaf6a, 0x15a0: 0xaf7a, 0x15a1: 0xaf8a, 0x15a2: 0x1fb2, 0x15a3: 0xaf99,\n\t0x15a4: 0xafaa, 0x15a5: 0xafba, 0x15a6: 0x1fc2, 0x15a7: 0x0040, 0x15a8: 0xafca, 0x15a9: 0xafda,\n\t0x15aa: 0xafea, 0x15ab: 0xaffa, 0x15ac: 0x0040, 0x15ad: 0x0040, 0x15ae: 0x0040, 0x15af: 0x0040,\n\t0x15b0: 0x7fd6, 0x15b1: 0xb009, 0x15b2: 0x7ff6, 0x15b3: 0x0808, 0x15b4: 0x8016, 0x15b5: 0x0040,\n\t0x15b6: 0x8036, 0x15b7: 0xb031, 0x15b8: 0x8056, 0x15b9: 0xb059, 0x15ba: 0x8076, 0x15bb: 0xb081,\n\t0x15bc: 0x8096, 0x15bd: 0xb0a9, 0x15be: 0x80b6, 0x15bf: 0xb0d1,\n\t// Block 0x57, offset 0x15c0\n\t0x15c0: 0xb0f9, 0x15c1: 0xb111, 0x15c2: 0xb111, 0x15c3: 0xb129, 0x15c4: 0xb129, 0x15c5: 0xb141,\n\t0x15c6: 0xb141, 0x15c7: 0xb159, 0x15c8: 0xb159, 0x15c9: 0xb171, 0x15ca: 0xb171, 0x15cb: 0xb171,\n\t0x15cc: 0xb171, 0x15cd: 0xb189, 0x15ce: 0xb189, 0x15cf: 0xb1a1, 0x15d0: 0xb1a1, 0x15d1: 0xb1a1,\n\t0x15d2: 0xb1a1, 0x15d3: 0xb1b9, 0x15d4: 0xb1b9, 0x15d5: 0xb1d1, 0x15d6: 0xb1d1, 0x15d7: 0xb1d1,\n\t0x15d8: 0xb1d1, 0x15d9: 0xb1e9, 0x15da: 0xb1e9, 0x15db: 0xb1e9, 0x15dc: 0xb1e9, 0x15dd: 0xb201,\n\t0x15de: 0xb201, 0x15df: 0xb201, 0x15e0: 0xb201, 0x15e1: 0xb219, 0x15e2: 0xb219, 0x15e3: 0xb219,\n\t0x15e4: 0xb219, 0x15e5: 0xb231, 0x15e6: 0xb231, 0x15e7: 0xb231, 0x15e8: 0xb231, 0x15e9: 0xb249,\n\t0x15ea: 0xb249, 0x15eb: 0xb261, 0x15ec: 0xb261, 0x15ed: 0xb279, 0x15ee: 0xb279, 0x15ef: 0xb291,\n\t0x15f0: 0xb291, 0x15f1: 0xb2a9, 0x15f2: 0xb2a9, 0x15f3: 0xb2a9, 0x15f4: 0xb2a9, 0x15f5: 0xb2c1,\n\t0x15f6: 0xb2c1, 0x15f7: 0xb2c1, 0x15f8: 0xb2c1, 0x15f9: 0xb2d9, 0x15fa: 0xb2d9, 0x15fb: 0xb2d9,\n\t0x15fc: 0xb2d9, 0x15fd: 0xb2f1, 0x15fe: 0xb2f1, 0x15ff: 0xb2f1,\n\t// Block 0x58, offset 0x1600\n\t0x1600: 0xb2f1, 0x1601: 0xb309, 0x1602: 0xb309, 0x1603: 0xb309, 0x1604: 0xb309, 0x1605: 0xb321,\n\t0x1606: 0xb321, 0x1607: 0xb321, 0x1608: 0xb321, 0x1609: 0xb339, 0x160a: 0xb339, 0x160b: 0xb339,\n\t0x160c: 0xb339, 0x160d: 0xb351, 0x160e: 0xb351, 0x160f: 0xb351, 0x1610: 0xb351, 0x1611: 0xb369,\n\t0x1612: 0xb369, 0x1613: 0xb369, 0x1614: 0xb369, 0x1615: 0xb381, 0x1616: 0xb381, 0x1617: 0xb381,\n\t0x1618: 0xb381, 0x1619: 0xb399, 0x161a: 0xb399, 0x161b: 0xb399, 0x161c: 0xb399, 0x161d: 0xb3b1,\n\t0x161e: 0xb3b1, 0x161f: 0xb3b1, 0x1620: 0xb3b1, 0x1621: 0xb3c9, 0x1622: 0xb3c9, 0x1623: 0xb3c9,\n\t0x1624: 0xb3c9, 0x1625: 0xb3e1, 0x1626: 0xb3e1, 0x1627: 0xb3e1, 0x1628: 0xb3e1, 0x1629: 0xb3f9,\n\t0x162a: 0xb3f9, 0x162b: 0xb3f9, 0x162c: 0xb3f9, 0x162d: 0xb411, 0x162e: 0xb411, 0x162f: 0x7ab1,\n\t0x1630: 0x7ab1, 0x1631: 0xb429, 0x1632: 0xb429, 0x1633: 0xb429, 0x1634: 0xb429, 0x1635: 0xb441,\n\t0x1636: 0xb441, 0x1637: 0xb469, 0x1638: 0xb469, 0x1639: 0xb491, 0x163a: 0xb491, 0x163b: 0xb4b9,\n\t0x163c: 0xb4b9, 0x163d: 0x0040, 0x163e: 0x0040, 0x163f: 0x03c0,\n\t// Block 0x59, offset 0x1640\n\t0x1640: 0x0040, 0x1641: 0xaefa, 0x1642: 0xb4e2, 0x1643: 0xaf6a, 0x1644: 0xafda, 0x1645: 0xafea,\n\t0x1646: 0xaf7a, 0x1647: 0xb4f2, 0x1648: 0x1fd2, 0x1649: 0x1fe2, 0x164a: 0xaf8a, 0x164b: 0x1fb2,\n\t0x164c: 0xaeda, 0x164d: 0xaf99, 0x164e: 0x29d1, 0x164f: 0xb502, 0x1650: 0x1f41, 0x1651: 0x00c9,\n\t0x1652: 0x0069, 0x1653: 0x0079, 0x1654: 0x1f51, 0x1655: 0x1f61, 0x1656: 0x1f71, 0x1657: 0x1f81,\n\t0x1658: 0x1f91, 0x1659: 0x1fa1, 0x165a: 0xaeea, 0x165b: 0x03c2, 0x165c: 0xafaa, 0x165d: 0x1fc2,\n\t0x165e: 0xafba, 0x165f: 0xaf0a, 0x1660: 0xaffa, 0x1661: 0x0039, 0x1662: 0x0ee9, 0x1663: 0x1159,\n\t0x1664: 0x0ef9, 0x1665: 0x0f09, 0x1666: 0x1199, 0x1667: 0x0f31, 0x1668: 0x0249, 0x1669: 0x0f41,\n\t0x166a: 0x0259, 0x166b: 0x0f51, 0x166c: 0x0359, 0x166d: 0x0f61, 0x166e: 0x0f71, 0x166f: 0x00d9,\n\t0x1670: 0x0f99, 0x1671: 0x2039, 0x1672: 0x0269, 0x1673: 0x01d9, 0x1674: 0x0fa9, 0x1675: 0x0fb9,\n\t0x1676: 0x1089, 0x1677: 0x0279, 0x1678: 0x0369, 0x1679: 0x0289, 0x167a: 0x13d1, 0x167b: 0xaf4a,\n\t0x167c: 0xafca, 0x167d: 0xaf5a, 0x167e: 0xb512, 0x167f: 0xaf1a,\n\t// Block 0x5a, offset 0x1680\n\t0x1680: 0x1caa, 0x1681: 0x0039, 0x1682: 0x0ee9, 0x1683: 0x1159, 0x1684: 0x0ef9, 0x1685: 0x0f09,\n\t0x1686: 0x1199, 0x1687: 0x0f31, 0x1688: 0x0249, 0x1689: 0x0f41, 0x168a: 0x0259, 0x168b: 0x0f51,\n\t0x168c: 0x0359, 0x168d: 0x0f61, 0x168e: 0x0f71, 0x168f: 0x00d9, 0x1690: 0x0f99, 0x1691: 0x2039,\n\t0x1692: 0x0269, 0x1693: 0x01d9, 0x1694: 0x0fa9, 0x1695: 0x0fb9, 0x1696: 0x1089, 0x1697: 0x0279,\n\t0x1698: 0x0369, 0x1699: 0x0289, 0x169a: 0x13d1, 0x169b: 0xaf2a, 0x169c: 0xb522, 0x169d: 0xaf3a,\n\t0x169e: 0xb532, 0x169f: 0x80d5, 0x16a0: 0x80f5, 0x16a1: 0x29d1, 0x16a2: 0x8115, 0x16a3: 0x8115,\n\t0x16a4: 0x8135, 0x16a5: 0x8155, 0x16a6: 0x8175, 0x16a7: 0x8195, 0x16a8: 0x81b5, 0x16a9: 0x81d5,\n\t0x16aa: 0x81f5, 0x16ab: 0x8215, 0x16ac: 0x8235, 0x16ad: 0x8255, 0x16ae: 0x8275, 0x16af: 0x8295,\n\t0x16b0: 0x82b5, 0x16b1: 0x82d5, 0x16b2: 0x82f5, 0x16b3: 0x8315, 0x16b4: 0x8335, 0x16b5: 0x8355,\n\t0x16b6: 0x8375, 0x16b7: 0x8395, 0x16b8: 0x83b5, 0x16b9: 0x83d5, 0x16ba: 0x83f5, 0x16bb: 0x8415,\n\t0x16bc: 0x81b5, 0x16bd: 0x8435, 0x16be: 0x8455, 0x16bf: 0x8215,\n\t// Block 0x5b, offset 0x16c0\n\t0x16c0: 0x8475, 0x16c1: 0x8495, 0x16c2: 0x84b5, 0x16c3: 0x84d5, 0x16c4: 0x84f5, 0x16c5: 0x8515,\n\t0x16c6: 0x8535, 0x16c7: 0x8555, 0x16c8: 0x84d5, 0x16c9: 0x8575, 0x16ca: 0x84d5, 0x16cb: 0x8595,\n\t0x16cc: 0x8595, 0x16cd: 0x85b5, 0x16ce: 0x85b5, 0x16cf: 0x85d5, 0x16d0: 0x8515, 0x16d1: 0x85f5,\n\t0x16d2: 0x8615, 0x16d3: 0x85f5, 0x16d4: 0x8635, 0x16d5: 0x8615, 0x16d6: 0x8655, 0x16d7: 0x8655,\n\t0x16d8: 0x8675, 0x16d9: 0x8675, 0x16da: 0x8695, 0x16db: 0x8695, 0x16dc: 0x8615, 0x16dd: 0x8115,\n\t0x16de: 0x86b5, 0x16df: 0x86d5, 0x16e0: 0x0040, 0x16e1: 0x86f5, 0x16e2: 0x8715, 0x16e3: 0x8735,\n\t0x16e4: 0x8755, 0x16e5: 0x8735, 0x16e6: 0x8775, 0x16e7: 0x8795, 0x16e8: 0x87b5, 0x16e9: 0x87b5,\n\t0x16ea: 0x87d5, 0x16eb: 0x87d5, 0x16ec: 0x87f5, 0x16ed: 0x87f5, 0x16ee: 0x87d5, 0x16ef: 0x87d5,\n\t0x16f0: 0x8815, 0x16f1: 0x8835, 0x16f2: 0x8855, 0x16f3: 0x8875, 0x16f4: 0x8895, 0x16f5: 0x88b5,\n\t0x16f6: 0x88b5, 0x16f7: 0x88b5, 0x16f8: 0x88d5, 0x16f9: 0x88d5, 0x16fa: 0x88d5, 0x16fb: 0x88d5,\n\t0x16fc: 0x87b5, 0x16fd: 0x87b5, 0x16fe: 0x87b5, 0x16ff: 0x0040,\n\t// Block 0x5c, offset 0x1700\n\t0x1700: 0x0040, 0x1701: 0x0040, 0x1702: 0x8715, 0x1703: 0x86f5, 0x1704: 0x88f5, 0x1705: 0x86f5,\n\t0x1706: 0x8715, 0x1707: 0x86f5, 0x1708: 0x0040, 0x1709: 0x0040, 0x170a: 0x8915, 0x170b: 0x8715,\n\t0x170c: 0x8935, 0x170d: 0x88f5, 0x170e: 0x8935, 0x170f: 0x8715, 0x1710: 0x0040, 0x1711: 0x0040,\n\t0x1712: 0x8955, 0x1713: 0x8975, 0x1714: 0x8875, 0x1715: 0x8935, 0x1716: 0x88f5, 0x1717: 0x8935,\n\t0x1718: 0x0040, 0x1719: 0x0040, 0x171a: 0x8995, 0x171b: 0x89b5, 0x171c: 0x8995, 0x171d: 0x0040,\n\t0x171e: 0x0040, 0x171f: 0x0040, 0x1720: 0xb541, 0x1721: 0xb559, 0x1722: 0xb571, 0x1723: 0x89d6,\n\t0x1724: 0xb589, 0x1725: 0xb5a1, 0x1726: 0x89f5, 0x1727: 0x0040, 0x1728: 0x8a15, 0x1729: 0x8a35,\n\t0x172a: 0x8a55, 0x172b: 0x8a35, 0x172c: 0x8a75, 0x172d: 0x8a95, 0x172e: 0x8ab5, 0x172f: 0x0040,\n\t0x1730: 0x0040, 0x1731: 0x0040, 0x1732: 0x0040, 0x1733: 0x0040, 0x1734: 0x0040, 0x1735: 0x0040,\n\t0x1736: 0x0040, 0x1737: 0x0040, 0x1738: 0x0040, 0x1739: 0x0340, 0x173a: 0x0340, 0x173b: 0x0340,\n\t0x173c: 0x0040, 0x173d: 0x0040, 0x173e: 0x0040, 0x173f: 0x0040,\n\t// Block 0x5d, offset 0x1740\n\t0x1740: 0x0a08, 0x1741: 0x0a08, 0x1742: 0x0a08, 0x1743: 0x0a08, 0x1744: 0x0a08, 0x1745: 0x0c08,\n\t0x1746: 0x0808, 0x1747: 0x0c08, 0x1748: 0x0818, 0x1749: 0x0c08, 0x174a: 0x0c08, 0x174b: 0x0808,\n\t0x174c: 0x0808, 0x174d: 0x0908, 0x174e: 0x0c08, 0x174f: 0x0c08, 0x1750: 0x0c08, 0x1751: 0x0c08,\n\t0x1752: 0x0c08, 0x1753: 0x0a08, 0x1754: 0x0a08, 0x1755: 0x0a08, 0x1756: 0x0a08, 0x1757: 0x0908,\n\t0x1758: 0x0a08, 0x1759: 0x0a08, 0x175a: 0x0a08, 0x175b: 0x0a08, 0x175c: 0x0a08, 0x175d: 0x0c08,\n\t0x175e: 0x0a08, 0x175f: 0x0a08, 0x1760: 0x0a08, 0x1761: 0x0c08, 0x1762: 0x0808, 0x1763: 0x0808,\n\t0x1764: 0x0c08, 0x1765: 0x3308, 0x1766: 0x3308, 0x1767: 0x0040, 0x1768: 0x0040, 0x1769: 0x0040,\n\t0x176a: 0x0040, 0x176b: 0x0a18, 0x176c: 0x0a18, 0x176d: 0x0a18, 0x176e: 0x0a18, 0x176f: 0x0c18,\n\t0x1770: 0x0818, 0x1771: 0x0818, 0x1772: 0x0818, 0x1773: 0x0818, 0x1774: 0x0818, 0x1775: 0x0818,\n\t0x1776: 0x0818, 0x1777: 0x0040, 0x1778: 0x0040, 0x1779: 0x0040, 0x177a: 0x0040, 0x177b: 0x0040,\n\t0x177c: 0x0040, 0x177d: 0x0040, 0x177e: 0x0040, 0x177f: 0x0040,\n\t// Block 0x5e, offset 0x1780\n\t0x1780: 0x0a08, 0x1781: 0x0c08, 0x1782: 0x0a08, 0x1783: 0x0c08, 0x1784: 0x0c08, 0x1785: 0x0c08,\n\t0x1786: 0x0a08, 0x1787: 0x0a08, 0x1788: 0x0a08, 0x1789: 0x0c08, 0x178a: 0x0a08, 0x178b: 0x0a08,\n\t0x178c: 0x0c08, 0x178d: 0x0a08, 0x178e: 0x0c08, 0x178f: 0x0c08, 0x1790: 0x0a08, 0x1791: 0x0c08,\n\t0x1792: 0x0040, 0x1793: 0x0040, 0x1794: 0x0040, 0x1795: 0x0040, 0x1796: 0x0040, 0x1797: 0x0040,\n\t0x1798: 0x0040, 0x1799: 0x0818, 0x179a: 0x0818, 0x179b: 0x0818, 0x179c: 0x0818, 0x179d: 0x0040,\n\t0x179e: 0x0040, 0x179f: 0x0040, 0x17a0: 0x0040, 0x17a1: 0x0040, 0x17a2: 0x0040, 0x17a3: 0x0040,\n\t0x17a4: 0x0040, 0x17a5: 0x0040, 0x17a6: 0x0040, 0x17a7: 0x0040, 0x17a8: 0x0040, 0x17a9: 0x0c18,\n\t0x17aa: 0x0c18, 0x17ab: 0x0c18, 0x17ac: 0x0c18, 0x17ad: 0x0a18, 0x17ae: 0x0a18, 0x17af: 0x0818,\n\t0x17b0: 0x0040, 0x17b1: 0x0040, 0x17b2: 0x0040, 0x17b3: 0x0040, 0x17b4: 0x0040, 0x17b5: 0x0040,\n\t0x17b6: 0x0040, 0x17b7: 0x0040, 0x17b8: 0x0040, 0x17b9: 0x0040, 0x17ba: 0x0040, 0x17bb: 0x0040,\n\t0x17bc: 0x0040, 0x17bd: 0x0040, 0x17be: 0x0040, 0x17bf: 0x0040,\n\t// Block 0x5f, offset 0x17c0\n\t0x17c0: 0x3308, 0x17c1: 0x3308, 0x17c2: 0x3008, 0x17c3: 0x3008, 0x17c4: 0x0040, 0x17c5: 0x0008,\n\t0x17c6: 0x0008, 0x17c7: 0x0008, 0x17c8: 0x0008, 0x17c9: 0x0008, 0x17ca: 0x0008, 0x17cb: 0x0008,\n\t0x17cc: 0x0008, 0x17cd: 0x0040, 0x17ce: 0x0040, 0x17cf: 0x0008, 0x17d0: 0x0008, 0x17d1: 0x0040,\n\t0x17d2: 0x0040, 0x17d3: 0x0008, 0x17d4: 0x0008, 0x17d5: 0x0008, 0x17d6: 0x0008, 0x17d7: 0x0008,\n\t0x17d8: 0x0008, 0x17d9: 0x0008, 0x17da: 0x0008, 0x17db: 0x0008, 0x17dc: 0x0008, 0x17dd: 0x0008,\n\t0x17de: 0x0008, 0x17df: 0x0008, 0x17e0: 0x0008, 0x17e1: 0x0008, 0x17e2: 0x0008, 0x17e3: 0x0008,\n\t0x17e4: 0x0008, 0x17e5: 0x0008, 0x17e6: 0x0008, 0x17e7: 0x0008, 0x17e8: 0x0008, 0x17e9: 0x0040,\n\t0x17ea: 0x0008, 0x17eb: 0x0008, 0x17ec: 0x0008, 0x17ed: 0x0008, 0x17ee: 0x0008, 0x17ef: 0x0008,\n\t0x17f0: 0x0008, 0x17f1: 0x0040, 0x17f2: 0x0008, 0x17f3: 0x0008, 0x17f4: 0x0040, 0x17f5: 0x0008,\n\t0x17f6: 0x0008, 0x17f7: 0x0008, 0x17f8: 0x0008, 0x17f9: 0x0008, 0x17fa: 0x0040, 0x17fb: 0x0040,\n\t0x17fc: 0x3308, 0x17fd: 0x0008, 0x17fe: 0x3008, 0x17ff: 0x3008,\n\t// Block 0x60, offset 0x1800\n\t0x1800: 0x3308, 0x1801: 0x3008, 0x1802: 0x3008, 0x1803: 0x3008, 0x1804: 0x3008, 0x1805: 0x0040,\n\t0x1806: 0x0040, 0x1807: 0x3008, 0x1808: 0x3008, 0x1809: 0x0040, 0x180a: 0x0040, 0x180b: 0x3008,\n\t0x180c: 0x3008, 0x180d: 0x3808, 0x180e: 0x0040, 0x180f: 0x0040, 0x1810: 0x0008, 0x1811: 0x0040,\n\t0x1812: 0x0040, 0x1813: 0x0040, 0x1814: 0x0040, 0x1815: 0x0040, 0x1816: 0x0040, 0x1817: 0x3008,\n\t0x1818: 0x0040, 0x1819: 0x0040, 0x181a: 0x0040, 0x181b: 0x0040, 0x181c: 0x0040, 0x181d: 0x0008,\n\t0x181e: 0x0008, 0x181f: 0x0008, 0x1820: 0x0008, 0x1821: 0x0008, 0x1822: 0x3008, 0x1823: 0x3008,\n\t0x1824: 0x0040, 0x1825: 0x0040, 0x1826: 0x3308, 0x1827: 0x3308, 0x1828: 0x3308, 0x1829: 0x3308,\n\t0x182a: 0x3308, 0x182b: 0x3308, 0x182c: 0x3308, 0x182d: 0x0040, 0x182e: 0x0040, 0x182f: 0x0040,\n\t0x1830: 0x3308, 0x1831: 0x3308, 0x1832: 0x3308, 0x1833: 0x3308, 0x1834: 0x3308, 0x1835: 0x0040,\n\t0x1836: 0x0040, 0x1837: 0x0040, 0x1838: 0x0040, 0x1839: 0x0040, 0x183a: 0x0040, 0x183b: 0x0040,\n\t0x183c: 0x0040, 0x183d: 0x0040, 0x183e: 0x0040, 0x183f: 0x0040,\n\t// Block 0x61, offset 0x1840\n\t0x1840: 0x0039, 0x1841: 0x0ee9, 0x1842: 0x1159, 0x1843: 0x0ef9, 0x1844: 0x0f09, 0x1845: 0x1199,\n\t0x1846: 0x0f31, 0x1847: 0x0249, 0x1848: 0x0f41, 0x1849: 0x0259, 0x184a: 0x0f51, 0x184b: 0x0359,\n\t0x184c: 0x0f61, 0x184d: 0x0f71, 0x184e: 0x00d9, 0x184f: 0x0f99, 0x1850: 0x2039, 0x1851: 0x0269,\n\t0x1852: 0x01d9, 0x1853: 0x0fa9, 0x1854: 0x0fb9, 0x1855: 0x1089, 0x1856: 0x0279, 0x1857: 0x0369,\n\t0x1858: 0x0289, 0x1859: 0x13d1, 0x185a: 0x0039, 0x185b: 0x0ee9, 0x185c: 0x1159, 0x185d: 0x0ef9,\n\t0x185e: 0x0f09, 0x185f: 0x1199, 0x1860: 0x0f31, 0x1861: 0x0249, 0x1862: 0x0f41, 0x1863: 0x0259,\n\t0x1864: 0x0f51, 0x1865: 0x0359, 0x1866: 0x0f61, 0x1867: 0x0f71, 0x1868: 0x00d9, 0x1869: 0x0f99,\n\t0x186a: 0x2039, 0x186b: 0x0269, 0x186c: 0x01d9, 0x186d: 0x0fa9, 0x186e: 0x0fb9, 0x186f: 0x1089,\n\t0x1870: 0x0279, 0x1871: 0x0369, 0x1872: 0x0289, 0x1873: 0x13d1, 0x1874: 0x0039, 0x1875: 0x0ee9,\n\t0x1876: 0x1159, 0x1877: 0x0ef9, 0x1878: 0x0f09, 0x1879: 0x1199, 0x187a: 0x0f31, 0x187b: 0x0249,\n\t0x187c: 0x0f41, 0x187d: 0x0259, 0x187e: 0x0f51, 0x187f: 0x0359,\n\t// Block 0x62, offset 0x1880\n\t0x1880: 0x0f61, 0x1881: 0x0f71, 0x1882: 0x00d9, 0x1883: 0x0f99, 0x1884: 0x2039, 0x1885: 0x0269,\n\t0x1886: 0x01d9, 0x1887: 0x0fa9, 0x1888: 0x0fb9, 0x1889: 0x1089, 0x188a: 0x0279, 0x188b: 0x0369,\n\t0x188c: 0x0289, 0x188d: 0x13d1, 0x188e: 0x0039, 0x188f: 0x0ee9, 0x1890: 0x1159, 0x1891: 0x0ef9,\n\t0x1892: 0x0f09, 0x1893: 0x1199, 0x1894: 0x0f31, 0x1895: 0x0040, 0x1896: 0x0f41, 0x1897: 0x0259,\n\t0x1898: 0x0f51, 0x1899: 0x0359, 0x189a: 0x0f61, 0x189b: 0x0f71, 0x189c: 0x00d9, 0x189d: 0x0f99,\n\t0x189e: 0x2039, 0x189f: 0x0269, 0x18a0: 0x01d9, 0x18a1: 0x0fa9, 0x18a2: 0x0fb9, 0x18a3: 0x1089,\n\t0x18a4: 0x0279, 0x18a5: 0x0369, 0x18a6: 0x0289, 0x18a7: 0x13d1, 0x18a8: 0x0039, 0x18a9: 0x0ee9,\n\t0x18aa: 0x1159, 0x18ab: 0x0ef9, 0x18ac: 0x0f09, 0x18ad: 0x1199, 0x18ae: 0x0f31, 0x18af: 0x0249,\n\t0x18b0: 0x0f41, 0x18b1: 0x0259, 0x18b2: 0x0f51, 0x18b3: 0x0359, 0x18b4: 0x0f61, 0x18b5: 0x0f71,\n\t0x18b6: 0x00d9, 0x18b7: 0x0f99, 0x18b8: 0x2039, 0x18b9: 0x0269, 0x18ba: 0x01d9, 0x18bb: 0x0fa9,\n\t0x18bc: 0x0fb9, 0x18bd: 0x1089, 0x18be: 0x0279, 0x18bf: 0x0369,\n\t// Block 0x63, offset 0x18c0\n\t0x18c0: 0x0289, 0x18c1: 0x13d1, 0x18c2: 0x0039, 0x18c3: 0x0ee9, 0x18c4: 0x1159, 0x18c5: 0x0ef9,\n\t0x18c6: 0x0f09, 0x18c7: 0x1199, 0x18c8: 0x0f31, 0x18c9: 0x0249, 0x18ca: 0x0f41, 0x18cb: 0x0259,\n\t0x18cc: 0x0f51, 0x18cd: 0x0359, 0x18ce: 0x0f61, 0x18cf: 0x0f71, 0x18d0: 0x00d9, 0x18d1: 0x0f99,\n\t0x18d2: 0x2039, 0x18d3: 0x0269, 0x18d4: 0x01d9, 0x18d5: 0x0fa9, 0x18d6: 0x0fb9, 0x18d7: 0x1089,\n\t0x18d8: 0x0279, 0x18d9: 0x0369, 0x18da: 0x0289, 0x18db: 0x13d1, 0x18dc: 0x0039, 0x18dd: 0x0040,\n\t0x18de: 0x1159, 0x18df: 0x0ef9, 0x18e0: 0x0040, 0x18e1: 0x0040, 0x18e2: 0x0f31, 0x18e3: 0x0040,\n\t0x18e4: 0x0040, 0x18e5: 0x0259, 0x18e6: 0x0f51, 0x18e7: 0x0040, 0x18e8: 0x0040, 0x18e9: 0x0f71,\n\t0x18ea: 0x00d9, 0x18eb: 0x0f99, 0x18ec: 0x2039, 0x18ed: 0x0040, 0x18ee: 0x01d9, 0x18ef: 0x0fa9,\n\t0x18f0: 0x0fb9, 0x18f1: 0x1089, 0x18f2: 0x0279, 0x18f3: 0x0369, 0x18f4: 0x0289, 0x18f5: 0x13d1,\n\t0x18f6: 0x0039, 0x18f7: 0x0ee9, 0x18f8: 0x1159, 0x18f9: 0x0ef9, 0x18fa: 0x0040, 0x18fb: 0x1199,\n\t0x18fc: 0x0040, 0x18fd: 0x0249, 0x18fe: 0x0f41, 0x18ff: 0x0259,\n\t// Block 0x64, offset 0x1900\n\t0x1900: 0x0f51, 0x1901: 0x0359, 0x1902: 0x0f61, 0x1903: 0x0f71, 0x1904: 0x0040, 0x1905: 0x0f99,\n\t0x1906: 0x2039, 0x1907: 0x0269, 0x1908: 0x01d9, 0x1909: 0x0fa9, 0x190a: 0x0fb9, 0x190b: 0x1089,\n\t0x190c: 0x0279, 0x190d: 0x0369, 0x190e: 0x0289, 0x190f: 0x13d1, 0x1910: 0x0039, 0x1911: 0x0ee9,\n\t0x1912: 0x1159, 0x1913: 0x0ef9, 0x1914: 0x0f09, 0x1915: 0x1199, 0x1916: 0x0f31, 0x1917: 0x0249,\n\t0x1918: 0x0f41, 0x1919: 0x0259, 0x191a: 0x0f51, 0x191b: 0x0359, 0x191c: 0x0f61, 0x191d: 0x0f71,\n\t0x191e: 0x00d9, 0x191f: 0x0f99, 0x1920: 0x2039, 0x1921: 0x0269, 0x1922: 0x01d9, 0x1923: 0x0fa9,\n\t0x1924: 0x0fb9, 0x1925: 0x1089, 0x1926: 0x0279, 0x1927: 0x0369, 0x1928: 0x0289, 0x1929: 0x13d1,\n\t0x192a: 0x0039, 0x192b: 0x0ee9, 0x192c: 0x1159, 0x192d: 0x0ef9, 0x192e: 0x0f09, 0x192f: 0x1199,\n\t0x1930: 0x0f31, 0x1931: 0x0249, 0x1932: 0x0f41, 0x1933: 0x0259, 0x1934: 0x0f51, 0x1935: 0x0359,\n\t0x1936: 0x0f61, 0x1937: 0x0f71, 0x1938: 0x00d9, 0x1939: 0x0f99, 0x193a: 0x2039, 0x193b: 0x0269,\n\t0x193c: 0x01d9, 0x193d: 0x0fa9, 0x193e: 0x0fb9, 0x193f: 0x1089,\n\t// Block 0x65, offset 0x1940\n\t0x1940: 0x0279, 0x1941: 0x0369, 0x1942: 0x0289, 0x1943: 0x13d1, 0x1944: 0x0039, 0x1945: 0x0ee9,\n\t0x1946: 0x0040, 0x1947: 0x0ef9, 0x1948: 0x0f09, 0x1949: 0x1199, 0x194a: 0x0f31, 0x194b: 0x0040,\n\t0x194c: 0x0040, 0x194d: 0x0259, 0x194e: 0x0f51, 0x194f: 0x0359, 0x1950: 0x0f61, 0x1951: 0x0f71,\n\t0x1952: 0x00d9, 0x1953: 0x0f99, 0x1954: 0x2039, 0x1955: 0x0040, 0x1956: 0x01d9, 0x1957: 0x0fa9,\n\t0x1958: 0x0fb9, 0x1959: 0x1089, 0x195a: 0x0279, 0x195b: 0x0369, 0x195c: 0x0289, 0x195d: 0x0040,\n\t0x195e: 0x0039, 0x195f: 0x0ee9, 0x1960: 0x1159, 0x1961: 0x0ef9, 0x1962: 0x0f09, 0x1963: 0x1199,\n\t0x1964: 0x0f31, 0x1965: 0x0249, 0x1966: 0x0f41, 0x1967: 0x0259, 0x1968: 0x0f51, 0x1969: 0x0359,\n\t0x196a: 0x0f61, 0x196b: 0x0f71, 0x196c: 0x00d9, 0x196d: 0x0f99, 0x196e: 0x2039, 0x196f: 0x0269,\n\t0x1970: 0x01d9, 0x1971: 0x0fa9, 0x1972: 0x0fb9, 0x1973: 0x1089, 0x1974: 0x0279, 0x1975: 0x0369,\n\t0x1976: 0x0289, 0x1977: 0x13d1, 0x1978: 0x0039, 0x1979: 0x0ee9, 0x197a: 0x0040, 0x197b: 0x0ef9,\n\t0x197c: 0x0f09, 0x197d: 0x1199, 0x197e: 0x0f31, 0x197f: 0x0040,\n\t// Block 0x66, offset 0x1980\n\t0x1980: 0x0f41, 0x1981: 0x0259, 0x1982: 0x0f51, 0x1983: 0x0359, 0x1984: 0x0f61, 0x1985: 0x0040,\n\t0x1986: 0x00d9, 0x1987: 0x0040, 0x1988: 0x0040, 0x1989: 0x0040, 0x198a: 0x01d9, 0x198b: 0x0fa9,\n\t0x198c: 0x0fb9, 0x198d: 0x1089, 0x198e: 0x0279, 0x198f: 0x0369, 0x1990: 0x0289, 0x1991: 0x0040,\n\t0x1992: 0x0039, 0x1993: 0x0ee9, 0x1994: 0x1159, 0x1995: 0x0ef9, 0x1996: 0x0f09, 0x1997: 0x1199,\n\t0x1998: 0x0f31, 0x1999: 0x0249, 0x199a: 0x0f41, 0x199b: 0x0259, 0x199c: 0x0f51, 0x199d: 0x0359,\n\t0x199e: 0x0f61, 0x199f: 0x0f71, 0x19a0: 0x00d9, 0x19a1: 0x0f99, 0x19a2: 0x2039, 0x19a3: 0x0269,\n\t0x19a4: 0x01d9, 0x19a5: 0x0fa9, 0x19a6: 0x0fb9, 0x19a7: 0x1089, 0x19a8: 0x0279, 0x19a9: 0x0369,\n\t0x19aa: 0x0289, 0x19ab: 0x13d1, 0x19ac: 0x0039, 0x19ad: 0x0ee9, 0x19ae: 0x1159, 0x19af: 0x0ef9,\n\t0x19b0: 0x0f09, 0x19b1: 0x1199, 0x19b2: 0x0f31, 0x19b3: 0x0249, 0x19b4: 0x0f41, 0x19b5: 0x0259,\n\t0x19b6: 0x0f51, 0x19b7: 0x0359, 0x19b8: 0x0f61, 0x19b9: 0x0f71, 0x19ba: 0x00d9, 0x19bb: 0x0f99,\n\t0x19bc: 0x2039, 0x19bd: 0x0269, 0x19be: 0x01d9, 0x19bf: 0x0fa9,\n\t// Block 0x67, offset 0x19c0\n\t0x19c0: 0x0fb9, 0x19c1: 0x1089, 0x19c2: 0x0279, 0x19c3: 0x0369, 0x19c4: 0x0289, 0x19c5: 0x13d1,\n\t0x19c6: 0x0039, 0x19c7: 0x0ee9, 0x19c8: 0x1159, 0x19c9: 0x0ef9, 0x19ca: 0x0f09, 0x19cb: 0x1199,\n\t0x19cc: 0x0f31, 0x19cd: 0x0249, 0x19ce: 0x0f41, 0x19cf: 0x0259, 0x19d0: 0x0f51, 0x19d1: 0x0359,\n\t0x19d2: 0x0f61, 0x19d3: 0x0f71, 0x19d4: 0x00d9, 0x19d5: 0x0f99, 0x19d6: 0x2039, 0x19d7: 0x0269,\n\t0x19d8: 0x01d9, 0x19d9: 0x0fa9, 0x19da: 0x0fb9, 0x19db: 0x1089, 0x19dc: 0x0279, 0x19dd: 0x0369,\n\t0x19de: 0x0289, 0x19df: 0x13d1, 0x19e0: 0x0039, 0x19e1: 0x0ee9, 0x19e2: 0x1159, 0x19e3: 0x0ef9,\n\t0x19e4: 0x0f09, 0x19e5: 0x1199, 0x19e6: 0x0f31, 0x19e7: 0x0249, 0x19e8: 0x0f41, 0x19e9: 0x0259,\n\t0x19ea: 0x0f51, 0x19eb: 0x0359, 0x19ec: 0x0f61, 0x19ed: 0x0f71, 0x19ee: 0x00d9, 0x19ef: 0x0f99,\n\t0x19f0: 0x2039, 0x19f1: 0x0269, 0x19f2: 0x01d9, 0x19f3: 0x0fa9, 0x19f4: 0x0fb9, 0x19f5: 0x1089,\n\t0x19f6: 0x0279, 0x19f7: 0x0369, 0x19f8: 0x0289, 0x19f9: 0x13d1, 0x19fa: 0x0039, 0x19fb: 0x0ee9,\n\t0x19fc: 0x1159, 0x19fd: 0x0ef9, 0x19fe: 0x0f09, 0x19ff: 0x1199,\n\t// Block 0x68, offset 0x1a00\n\t0x1a00: 0x0f31, 0x1a01: 0x0249, 0x1a02: 0x0f41, 0x1a03: 0x0259, 0x1a04: 0x0f51, 0x1a05: 0x0359,\n\t0x1a06: 0x0f61, 0x1a07: 0x0f71, 0x1a08: 0x00d9, 0x1a09: 0x0f99, 0x1a0a: 0x2039, 0x1a0b: 0x0269,\n\t0x1a0c: 0x01d9, 0x1a0d: 0x0fa9, 0x1a0e: 0x0fb9, 0x1a0f: 0x1089, 0x1a10: 0x0279, 0x1a11: 0x0369,\n\t0x1a12: 0x0289, 0x1a13: 0x13d1, 0x1a14: 0x0039, 0x1a15: 0x0ee9, 0x1a16: 0x1159, 0x1a17: 0x0ef9,\n\t0x1a18: 0x0f09, 0x1a19: 0x1199, 0x1a1a: 0x0f31, 0x1a1b: 0x0249, 0x1a1c: 0x0f41, 0x1a1d: 0x0259,\n\t0x1a1e: 0x0f51, 0x1a1f: 0x0359, 0x1a20: 0x0f61, 0x1a21: 0x0f71, 0x1a22: 0x00d9, 0x1a23: 0x0f99,\n\t0x1a24: 0x2039, 0x1a25: 0x0269, 0x1a26: 0x01d9, 0x1a27: 0x0fa9, 0x1a28: 0x0fb9, 0x1a29: 0x1089,\n\t0x1a2a: 0x0279, 0x1a2b: 0x0369, 0x1a2c: 0x0289, 0x1a2d: 0x13d1, 0x1a2e: 0x0039, 0x1a2f: 0x0ee9,\n\t0x1a30: 0x1159, 0x1a31: 0x0ef9, 0x1a32: 0x0f09, 0x1a33: 0x1199, 0x1a34: 0x0f31, 0x1a35: 0x0249,\n\t0x1a36: 0x0f41, 0x1a37: 0x0259, 0x1a38: 0x0f51, 0x1a39: 0x0359, 0x1a3a: 0x0f61, 0x1a3b: 0x0f71,\n\t0x1a3c: 0x00d9, 0x1a3d: 0x0f99, 0x1a3e: 0x2039, 0x1a3f: 0x0269,\n\t// Block 0x69, offset 0x1a40\n\t0x1a40: 0x01d9, 0x1a41: 0x0fa9, 0x1a42: 0x0fb9, 0x1a43: 0x1089, 0x1a44: 0x0279, 0x1a45: 0x0369,\n\t0x1a46: 0x0289, 0x1a47: 0x13d1, 0x1a48: 0x0039, 0x1a49: 0x0ee9, 0x1a4a: 0x1159, 0x1a4b: 0x0ef9,\n\t0x1a4c: 0x0f09, 0x1a4d: 0x1199, 0x1a4e: 0x0f31, 0x1a4f: 0x0249, 0x1a50: 0x0f41, 0x1a51: 0x0259,\n\t0x1a52: 0x0f51, 0x1a53: 0x0359, 0x1a54: 0x0f61, 0x1a55: 0x0f71, 0x1a56: 0x00d9, 0x1a57: 0x0f99,\n\t0x1a58: 0x2039, 0x1a59: 0x0269, 0x1a5a: 0x01d9, 0x1a5b: 0x0fa9, 0x1a5c: 0x0fb9, 0x1a5d: 0x1089,\n\t0x1a5e: 0x0279, 0x1a5f: 0x0369, 0x1a60: 0x0289, 0x1a61: 0x13d1, 0x1a62: 0x0039, 0x1a63: 0x0ee9,\n\t0x1a64: 0x1159, 0x1a65: 0x0ef9, 0x1a66: 0x0f09, 0x1a67: 0x1199, 0x1a68: 0x0f31, 0x1a69: 0x0249,\n\t0x1a6a: 0x0f41, 0x1a6b: 0x0259, 0x1a6c: 0x0f51, 0x1a6d: 0x0359, 0x1a6e: 0x0f61, 0x1a6f: 0x0f71,\n\t0x1a70: 0x00d9, 0x1a71: 0x0f99, 0x1a72: 0x2039, 0x1a73: 0x0269, 0x1a74: 0x01d9, 0x1a75: 0x0fa9,\n\t0x1a76: 0x0fb9, 0x1a77: 0x1089, 0x1a78: 0x0279, 0x1a79: 0x0369, 0x1a7a: 0x0289, 0x1a7b: 0x13d1,\n\t0x1a7c: 0x0039, 0x1a7d: 0x0ee9, 0x1a7e: 0x1159, 0x1a7f: 0x0ef9,\n\t// Block 0x6a, offset 0x1a80\n\t0x1a80: 0x0f09, 0x1a81: 0x1199, 0x1a82: 0x0f31, 0x1a83: 0x0249, 0x1a84: 0x0f41, 0x1a85: 0x0259,\n\t0x1a86: 0x0f51, 0x1a87: 0x0359, 0x1a88: 0x0f61, 0x1a89: 0x0f71, 0x1a8a: 0x00d9, 0x1a8b: 0x0f99,\n\t0x1a8c: 0x2039, 0x1a8d: 0x0269, 0x1a8e: 0x01d9, 0x1a8f: 0x0fa9, 0x1a90: 0x0fb9, 0x1a91: 0x1089,\n\t0x1a92: 0x0279, 0x1a93: 0x0369, 0x1a94: 0x0289, 0x1a95: 0x13d1, 0x1a96: 0x0039, 0x1a97: 0x0ee9,\n\t0x1a98: 0x1159, 0x1a99: 0x0ef9, 0x1a9a: 0x0f09, 0x1a9b: 0x1199, 0x1a9c: 0x0f31, 0x1a9d: 0x0249,\n\t0x1a9e: 0x0f41, 0x1a9f: 0x0259, 0x1aa0: 0x0f51, 0x1aa1: 0x0359, 0x1aa2: 0x0f61, 0x1aa3: 0x0f71,\n\t0x1aa4: 0x00d9, 0x1aa5: 0x0f99, 0x1aa6: 0x2039, 0x1aa7: 0x0269, 0x1aa8: 0x01d9, 0x1aa9: 0x0fa9,\n\t0x1aaa: 0x0fb9, 0x1aab: 0x1089, 0x1aac: 0x0279, 0x1aad: 0x0369, 0x1aae: 0x0289, 0x1aaf: 0x13d1,\n\t0x1ab0: 0x0039, 0x1ab1: 0x0ee9, 0x1ab2: 0x1159, 0x1ab3: 0x0ef9, 0x1ab4: 0x0f09, 0x1ab5: 0x1199,\n\t0x1ab6: 0x0f31, 0x1ab7: 0x0249, 0x1ab8: 0x0f41, 0x1ab9: 0x0259, 0x1aba: 0x0f51, 0x1abb: 0x0359,\n\t0x1abc: 0x0f61, 0x1abd: 0x0f71, 0x1abe: 0x00d9, 0x1abf: 0x0f99,\n\t// Block 0x6b, offset 0x1ac0\n\t0x1ac0: 0x2039, 0x1ac1: 0x0269, 0x1ac2: 0x01d9, 0x1ac3: 0x0fa9, 0x1ac4: 0x0fb9, 0x1ac5: 0x1089,\n\t0x1ac6: 0x0279, 0x1ac7: 0x0369, 0x1ac8: 0x0289, 0x1ac9: 0x13d1, 0x1aca: 0x0039, 0x1acb: 0x0ee9,\n\t0x1acc: 0x1159, 0x1acd: 0x0ef9, 0x1ace: 0x0f09, 0x1acf: 0x1199, 0x1ad0: 0x0f31, 0x1ad1: 0x0249,\n\t0x1ad2: 0x0f41, 0x1ad3: 0x0259, 0x1ad4: 0x0f51, 0x1ad5: 0x0359, 0x1ad6: 0x0f61, 0x1ad7: 0x0f71,\n\t0x1ad8: 0x00d9, 0x1ad9: 0x0f99, 0x1ada: 0x2039, 0x1adb: 0x0269, 0x1adc: 0x01d9, 0x1add: 0x0fa9,\n\t0x1ade: 0x0fb9, 0x1adf: 0x1089, 0x1ae0: 0x0279, 0x1ae1: 0x0369, 0x1ae2: 0x0289, 0x1ae3: 0x13d1,\n\t0x1ae4: 0xba81, 0x1ae5: 0xba99, 0x1ae6: 0x0040, 0x1ae7: 0x0040, 0x1ae8: 0xbab1, 0x1ae9: 0x1099,\n\t0x1aea: 0x10b1, 0x1aeb: 0x10c9, 0x1aec: 0xbac9, 0x1aed: 0xbae1, 0x1aee: 0xbaf9, 0x1aef: 0x1429,\n\t0x1af0: 0x1a31, 0x1af1: 0xbb11, 0x1af2: 0xbb29, 0x1af3: 0xbb41, 0x1af4: 0xbb59, 0x1af5: 0xbb71,\n\t0x1af6: 0xbb89, 0x1af7: 0x2109, 0x1af8: 0x1111, 0x1af9: 0x1429, 0x1afa: 0xbba1, 0x1afb: 0xbbb9,\n\t0x1afc: 0xbbd1, 0x1afd: 0x10e1, 0x1afe: 0x10f9, 0x1aff: 0xbbe9,\n\t// Block 0x6c, offset 0x1b00\n\t0x1b00: 0x2079, 0x1b01: 0xbc01, 0x1b02: 0xbab1, 0x1b03: 0x1099, 0x1b04: 0x10b1, 0x1b05: 0x10c9,\n\t0x1b06: 0xbac9, 0x1b07: 0xbae1, 0x1b08: 0xbaf9, 0x1b09: 0x1429, 0x1b0a: 0x1a31, 0x1b0b: 0xbb11,\n\t0x1b0c: 0xbb29, 0x1b0d: 0xbb41, 0x1b0e: 0xbb59, 0x1b0f: 0xbb71, 0x1b10: 0xbb89, 0x1b11: 0x2109,\n\t0x1b12: 0x1111, 0x1b13: 0xbba1, 0x1b14: 0xbba1, 0x1b15: 0xbbb9, 0x1b16: 0xbbd1, 0x1b17: 0x10e1,\n\t0x1b18: 0x10f9, 0x1b19: 0xbbe9, 0x1b1a: 0x2079, 0x1b1b: 0xbc21, 0x1b1c: 0xbac9, 0x1b1d: 0x1429,\n\t0x1b1e: 0xbb11, 0x1b1f: 0x10e1, 0x1b20: 0x1111, 0x1b21: 0x2109, 0x1b22: 0xbab1, 0x1b23: 0x1099,\n\t0x1b24: 0x10b1, 0x1b25: 0x10c9, 0x1b26: 0xbac9, 0x1b27: 0xbae1, 0x1b28: 0xbaf9, 0x1b29: 0x1429,\n\t0x1b2a: 0x1a31, 0x1b2b: 0xbb11, 0x1b2c: 0xbb29, 0x1b2d: 0xbb41, 0x1b2e: 0xbb59, 0x1b2f: 0xbb71,\n\t0x1b30: 0xbb89, 0x1b31: 0x2109, 0x1b32: 0x1111, 0x1b33: 0x1429, 0x1b34: 0xbba1, 0x1b35: 0xbbb9,\n\t0x1b36: 0xbbd1, 0x1b37: 0x10e1, 0x1b38: 0x10f9, 0x1b39: 0xbbe9, 0x1b3a: 0x2079, 0x1b3b: 0xbc01,\n\t0x1b3c: 0xbab1, 0x1b3d: 0x1099, 0x1b3e: 0x10b1, 0x1b3f: 0x10c9,\n\t// Block 0x6d, offset 0x1b40\n\t0x1b40: 0xbac9, 0x1b41: 0xbae1, 0x1b42: 0xbaf9, 0x1b43: 0x1429, 0x1b44: 0x1a31, 0x1b45: 0xbb11,\n\t0x1b46: 0xbb29, 0x1b47: 0xbb41, 0x1b48: 0xbb59, 0x1b49: 0xbb71, 0x1b4a: 0xbb89, 0x1b4b: 0x2109,\n\t0x1b4c: 0x1111, 0x1b4d: 0xbba1, 0x1b4e: 0xbba1, 0x1b4f: 0xbbb9, 0x1b50: 0xbbd1, 0x1b51: 0x10e1,\n\t0x1b52: 0x10f9, 0x1b53: 0xbbe9, 0x1b54: 0x2079, 0x1b55: 0xbc21, 0x1b56: 0xbac9, 0x1b57: 0x1429,\n\t0x1b58: 0xbb11, 0x1b59: 0x10e1, 0x1b5a: 0x1111, 0x1b5b: 0x2109, 0x1b5c: 0xbab1, 0x1b5d: 0x1099,\n\t0x1b5e: 0x10b1, 0x1b5f: 0x10c9, 0x1b60: 0xbac9, 0x1b61: 0xbae1, 0x1b62: 0xbaf9, 0x1b63: 0x1429,\n\t0x1b64: 0x1a31, 0x1b65: 0xbb11, 0x1b66: 0xbb29, 0x1b67: 0xbb41, 0x1b68: 0xbb59, 0x1b69: 0xbb71,\n\t0x1b6a: 0xbb89, 0x1b6b: 0x2109, 0x1b6c: 0x1111, 0x1b6d: 0x1429, 0x1b6e: 0xbba1, 0x1b6f: 0xbbb9,\n\t0x1b70: 0xbbd1, 0x1b71: 0x10e1, 0x1b72: 0x10f9, 0x1b73: 0xbbe9, 0x1b74: 0x2079, 0x1b75: 0xbc01,\n\t0x1b76: 0xbab1, 0x1b77: 0x1099, 0x1b78: 0x10b1, 0x1b79: 0x10c9, 0x1b7a: 0xbac9, 0x1b7b: 0xbae1,\n\t0x1b7c: 0xbaf9, 0x1b7d: 0x1429, 0x1b7e: 0x1a31, 0x1b7f: 0xbb11,\n\t// Block 0x6e, offset 0x1b80\n\t0x1b80: 0xbb29, 0x1b81: 0xbb41, 0x1b82: 0xbb59, 0x1b83: 0xbb71, 0x1b84: 0xbb89, 0x1b85: 0x2109,\n\t0x1b86: 0x1111, 0x1b87: 0xbba1, 0x1b88: 0xbba1, 0x1b89: 0xbbb9, 0x1b8a: 0xbbd1, 0x1b8b: 0x10e1,\n\t0x1b8c: 0x10f9, 0x1b8d: 0xbbe9, 0x1b8e: 0x2079, 0x1b8f: 0xbc21, 0x1b90: 0xbac9, 0x1b91: 0x1429,\n\t0x1b92: 0xbb11, 0x1b93: 0x10e1, 0x1b94: 0x1111, 0x1b95: 0x2109, 0x1b96: 0xbab1, 0x1b97: 0x1099,\n\t0x1b98: 0x10b1, 0x1b99: 0x10c9, 0x1b9a: 0xbac9, 0x1b9b: 0xbae1, 0x1b9c: 0xbaf9, 0x1b9d: 0x1429,\n\t0x1b9e: 0x1a31, 0x1b9f: 0xbb11, 0x1ba0: 0xbb29, 0x1ba1: 0xbb41, 0x1ba2: 0xbb59, 0x1ba3: 0xbb71,\n\t0x1ba4: 0xbb89, 0x1ba5: 0x2109, 0x1ba6: 0x1111, 0x1ba7: 0x1429, 0x1ba8: 0xbba1, 0x1ba9: 0xbbb9,\n\t0x1baa: 0xbbd1, 0x1bab: 0x10e1, 0x1bac: 0x10f9, 0x1bad: 0xbbe9, 0x1bae: 0x2079, 0x1baf: 0xbc01,\n\t0x1bb0: 0xbab1, 0x1bb1: 0x1099, 0x1bb2: 0x10b1, 0x1bb3: 0x10c9, 0x1bb4: 0xbac9, 0x1bb5: 0xbae1,\n\t0x1bb6: 0xbaf9, 0x1bb7: 0x1429, 0x1bb8: 0x1a31, 0x1bb9: 0xbb11, 0x1bba: 0xbb29, 0x1bbb: 0xbb41,\n\t0x1bbc: 0xbb59, 0x1bbd: 0xbb71, 0x1bbe: 0xbb89, 0x1bbf: 0x2109,\n\t// Block 0x6f, offset 0x1bc0\n\t0x1bc0: 0x1111, 0x1bc1: 0xbba1, 0x1bc2: 0xbba1, 0x1bc3: 0xbbb9, 0x1bc4: 0xbbd1, 0x1bc5: 0x10e1,\n\t0x1bc6: 0x10f9, 0x1bc7: 0xbbe9, 0x1bc8: 0x2079, 0x1bc9: 0xbc21, 0x1bca: 0xbac9, 0x1bcb: 0x1429,\n\t0x1bcc: 0xbb11, 0x1bcd: 0x10e1, 0x1bce: 0x1111, 0x1bcf: 0x2109, 0x1bd0: 0xbab1, 0x1bd1: 0x1099,\n\t0x1bd2: 0x10b1, 0x1bd3: 0x10c9, 0x1bd4: 0xbac9, 0x1bd5: 0xbae1, 0x1bd6: 0xbaf9, 0x1bd7: 0x1429,\n\t0x1bd8: 0x1a31, 0x1bd9: 0xbb11, 0x1bda: 0xbb29, 0x1bdb: 0xbb41, 0x1bdc: 0xbb59, 0x1bdd: 0xbb71,\n\t0x1bde: 0xbb89, 0x1bdf: 0x2109, 0x1be0: 0x1111, 0x1be1: 0x1429, 0x1be2: 0xbba1, 0x1be3: 0xbbb9,\n\t0x1be4: 0xbbd1, 0x1be5: 0x10e1, 0x1be6: 0x10f9, 0x1be7: 0xbbe9, 0x1be8: 0x2079, 0x1be9: 0xbc01,\n\t0x1bea: 0xbab1, 0x1beb: 0x1099, 0x1bec: 0x10b1, 0x1bed: 0x10c9, 0x1bee: 0xbac9, 0x1bef: 0xbae1,\n\t0x1bf0: 0xbaf9, 0x1bf1: 0x1429, 0x1bf2: 0x1a31, 0x1bf3: 0xbb11, 0x1bf4: 0xbb29, 0x1bf5: 0xbb41,\n\t0x1bf6: 0xbb59, 0x1bf7: 0xbb71, 0x1bf8: 0xbb89, 0x1bf9: 0x2109, 0x1bfa: 0x1111, 0x1bfb: 0xbba1,\n\t0x1bfc: 0xbba1, 0x1bfd: 0xbbb9, 0x1bfe: 0xbbd1, 0x1bff: 0x10e1,\n\t// Block 0x70, offset 0x1c00\n\t0x1c00: 0x10f9, 0x1c01: 0xbbe9, 0x1c02: 0x2079, 0x1c03: 0xbc21, 0x1c04: 0xbac9, 0x1c05: 0x1429,\n\t0x1c06: 0xbb11, 0x1c07: 0x10e1, 0x1c08: 0x1111, 0x1c09: 0x2109, 0x1c0a: 0xbc41, 0x1c0b: 0xbc41,\n\t0x1c0c: 0x0040, 0x1c0d: 0x0040, 0x1c0e: 0x1f41, 0x1c0f: 0x00c9, 0x1c10: 0x0069, 0x1c11: 0x0079,\n\t0x1c12: 0x1f51, 0x1c13: 0x1f61, 0x1c14: 0x1f71, 0x1c15: 0x1f81, 0x1c16: 0x1f91, 0x1c17: 0x1fa1,\n\t0x1c18: 0x1f41, 0x1c19: 0x00c9, 0x1c1a: 0x0069, 0x1c1b: 0x0079, 0x1c1c: 0x1f51, 0x1c1d: 0x1f61,\n\t0x1c1e: 0x1f71, 0x1c1f: 0x1f81, 0x1c20: 0x1f91, 0x1c21: 0x1fa1, 0x1c22: 0x1f41, 0x1c23: 0x00c9,\n\t0x1c24: 0x0069, 0x1c25: 0x0079, 0x1c26: 0x1f51, 0x1c27: 0x1f61, 0x1c28: 0x1f71, 0x1c29: 0x1f81,\n\t0x1c2a: 0x1f91, 0x1c2b: 0x1fa1, 0x1c2c: 0x1f41, 0x1c2d: 0x00c9, 0x1c2e: 0x0069, 0x1c2f: 0x0079,\n\t0x1c30: 0x1f51, 0x1c31: 0x1f61, 0x1c32: 0x1f71, 0x1c33: 0x1f81, 0x1c34: 0x1f91, 0x1c35: 0x1fa1,\n\t0x1c36: 0x1f41, 0x1c37: 0x00c9, 0x1c38: 0x0069, 0x1c39: 0x0079, 0x1c3a: 0x1f51, 0x1c3b: 0x1f61,\n\t0x1c3c: 0x1f71, 0x1c3d: 0x1f81, 0x1c3e: 0x1f91, 0x1c3f: 0x1fa1,\n\t// Block 0x71, offset 0x1c40\n\t0x1c40: 0xe115, 0x1c41: 0xe115, 0x1c42: 0xe135, 0x1c43: 0xe135, 0x1c44: 0xe115, 0x1c45: 0xe115,\n\t0x1c46: 0xe175, 0x1c47: 0xe175, 0x1c48: 0xe115, 0x1c49: 0xe115, 0x1c4a: 0xe135, 0x1c4b: 0xe135,\n\t0x1c4c: 0xe115, 0x1c4d: 0xe115, 0x1c4e: 0xe1f5, 0x1c4f: 0xe1f5, 0x1c50: 0xe115, 0x1c51: 0xe115,\n\t0x1c52: 0xe135, 0x1c53: 0xe135, 0x1c54: 0xe115, 0x1c55: 0xe115, 0x1c56: 0xe175, 0x1c57: 0xe175,\n\t0x1c58: 0xe115, 0x1c59: 0xe115, 0x1c5a: 0xe135, 0x1c5b: 0xe135, 0x1c5c: 0xe115, 0x1c5d: 0xe115,\n\t0x1c5e: 0x8b05, 0x1c5f: 0x8b05, 0x1c60: 0x04b5, 0x1c61: 0x04b5, 0x1c62: 0x0a08, 0x1c63: 0x0a08,\n\t0x1c64: 0x0a08, 0x1c65: 0x0a08, 0x1c66: 0x0a08, 0x1c67: 0x0a08, 0x1c68: 0x0a08, 0x1c69: 0x0a08,\n\t0x1c6a: 0x0a08, 0x1c6b: 0x0a08, 0x1c6c: 0x0a08, 0x1c6d: 0x0a08, 0x1c6e: 0x0a08, 0x1c6f: 0x0a08,\n\t0x1c70: 0x0a08, 0x1c71: 0x0a08, 0x1c72: 0x0a08, 0x1c73: 0x0a08, 0x1c74: 0x0a08, 0x1c75: 0x0a08,\n\t0x1c76: 0x0a08, 0x1c77: 0x0a08, 0x1c78: 0x0a08, 0x1c79: 0x0a08, 0x1c7a: 0x0a08, 0x1c7b: 0x0a08,\n\t0x1c7c: 0x0a08, 0x1c7d: 0x0a08, 0x1c7e: 0x0a08, 0x1c7f: 0x0a08,\n\t// Block 0x72, offset 0x1c80\n\t0x1c80: 0xb189, 0x1c81: 0xb1a1, 0x1c82: 0xb201, 0x1c83: 0xb249, 0x1c84: 0x0040, 0x1c85: 0xb411,\n\t0x1c86: 0xb291, 0x1c87: 0xb219, 0x1c88: 0xb309, 0x1c89: 0xb429, 0x1c8a: 0xb399, 0x1c8b: 0xb3b1,\n\t0x1c8c: 0xb3c9, 0x1c8d: 0xb3e1, 0x1c8e: 0xb2a9, 0x1c8f: 0xb339, 0x1c90: 0xb369, 0x1c91: 0xb2d9,\n\t0x1c92: 0xb381, 0x1c93: 0xb279, 0x1c94: 0xb2c1, 0x1c95: 0xb1d1, 0x1c96: 0xb1e9, 0x1c97: 0xb231,\n\t0x1c98: 0xb261, 0x1c99: 0xb2f1, 0x1c9a: 0xb321, 0x1c9b: 0xb351, 0x1c9c: 0xbc59, 0x1c9d: 0x7949,\n\t0x1c9e: 0xbc71, 0x1c9f: 0xbc89, 0x1ca0: 0x0040, 0x1ca1: 0xb1a1, 0x1ca2: 0xb201, 0x1ca3: 0x0040,\n\t0x1ca4: 0xb3f9, 0x1ca5: 0x0040, 0x1ca6: 0x0040, 0x1ca7: 0xb219, 0x1ca8: 0x0040, 0x1ca9: 0xb429,\n\t0x1caa: 0xb399, 0x1cab: 0xb3b1, 0x1cac: 0xb3c9, 0x1cad: 0xb3e1, 0x1cae: 0xb2a9, 0x1caf: 0xb339,\n\t0x1cb0: 0xb369, 0x1cb1: 0xb2d9, 0x1cb2: 0xb381, 0x1cb3: 0x0040, 0x1cb4: 0xb2c1, 0x1cb5: 0xb1d1,\n\t0x1cb6: 0xb1e9, 0x1cb7: 0xb231, 0x1cb8: 0x0040, 0x1cb9: 0xb2f1, 0x1cba: 0x0040, 0x1cbb: 0xb351,\n\t0x1cbc: 0x0040, 0x1cbd: 0x0040, 0x1cbe: 0x0040, 0x1cbf: 0x0040,\n\t// Block 0x73, offset 0x1cc0\n\t0x1cc0: 0x0040, 0x1cc1: 0x0040, 0x1cc2: 0xb201, 0x1cc3: 0x0040, 0x1cc4: 0x0040, 0x1cc5: 0x0040,\n\t0x1cc6: 0x0040, 0x1cc7: 0xb219, 0x1cc8: 0x0040, 0x1cc9: 0xb429, 0x1cca: 0x0040, 0x1ccb: 0xb3b1,\n\t0x1ccc: 0x0040, 0x1ccd: 0xb3e1, 0x1cce: 0xb2a9, 0x1ccf: 0xb339, 0x1cd0: 0x0040, 0x1cd1: 0xb2d9,\n\t0x1cd2: 0xb381, 0x1cd3: 0x0040, 0x1cd4: 0xb2c1, 0x1cd5: 0x0040, 0x1cd6: 0x0040, 0x1cd7: 0xb231,\n\t0x1cd8: 0x0040, 0x1cd9: 0xb2f1, 0x1cda: 0x0040, 0x1cdb: 0xb351, 0x1cdc: 0x0040, 0x1cdd: 0x7949,\n\t0x1cde: 0x0040, 0x1cdf: 0xbc89, 0x1ce0: 0x0040, 0x1ce1: 0xb1a1, 0x1ce2: 0xb201, 0x1ce3: 0x0040,\n\t0x1ce4: 0xb3f9, 0x1ce5: 0x0040, 0x1ce6: 0x0040, 0x1ce7: 0xb219, 0x1ce8: 0xb309, 0x1ce9: 0xb429,\n\t0x1cea: 0xb399, 0x1ceb: 0x0040, 0x1cec: 0xb3c9, 0x1ced: 0xb3e1, 0x1cee: 0xb2a9, 0x1cef: 0xb339,\n\t0x1cf0: 0xb369, 0x1cf1: 0xb2d9, 0x1cf2: 0xb381, 0x1cf3: 0x0040, 0x1cf4: 0xb2c1, 0x1cf5: 0xb1d1,\n\t0x1cf6: 0xb1e9, 0x1cf7: 0xb231, 0x1cf8: 0x0040, 0x1cf9: 0xb2f1, 0x1cfa: 0xb321, 0x1cfb: 0xb351,\n\t0x1cfc: 0xbc59, 0x1cfd: 0x0040, 0x1cfe: 0xbc71, 0x1cff: 0x0040,\n\t// Block 0x74, offset 0x1d00\n\t0x1d00: 0xb189, 0x1d01: 0xb1a1, 0x1d02: 0xb201, 0x1d03: 0xb249, 0x1d04: 0xb3f9, 0x1d05: 0xb411,\n\t0x1d06: 0xb291, 0x1d07: 0xb219, 0x1d08: 0xb309, 0x1d09: 0xb429, 0x1d0a: 0x0040, 0x1d0b: 0xb3b1,\n\t0x1d0c: 0xb3c9, 0x1d0d: 0xb3e1, 0x1d0e: 0xb2a9, 0x1d0f: 0xb339, 0x1d10: 0xb369, 0x1d11: 0xb2d9,\n\t0x1d12: 0xb381, 0x1d13: 0xb279, 0x1d14: 0xb2c1, 0x1d15: 0xb1d1, 0x1d16: 0xb1e9, 0x1d17: 0xb231,\n\t0x1d18: 0xb261, 0x1d19: 0xb2f1, 0x1d1a: 0xb321, 0x1d1b: 0xb351, 0x1d1c: 0x0040, 0x1d1d: 0x0040,\n\t0x1d1e: 0x0040, 0x1d1f: 0x0040, 0x1d20: 0x0040, 0x1d21: 0xb1a1, 0x1d22: 0xb201, 0x1d23: 0xb249,\n\t0x1d24: 0x0040, 0x1d25: 0xb411, 0x1d26: 0xb291, 0x1d27: 0xb219, 0x1d28: 0xb309, 0x1d29: 0xb429,\n\t0x1d2a: 0x0040, 0x1d2b: 0xb3b1, 0x1d2c: 0xb3c9, 0x1d2d: 0xb3e1, 0x1d2e: 0xb2a9, 0x1d2f: 0xb339,\n\t0x1d30: 0xb369, 0x1d31: 0xb2d9, 0x1d32: 0xb381, 0x1d33: 0xb279, 0x1d34: 0xb2c1, 0x1d35: 0xb1d1,\n\t0x1d36: 0xb1e9, 0x1d37: 0xb231, 0x1d38: 0xb261, 0x1d39: 0xb2f1, 0x1d3a: 0xb321, 0x1d3b: 0xb351,\n\t0x1d3c: 0x0040, 0x1d3d: 0x0040, 0x1d3e: 0x0040, 0x1d3f: 0x0040,\n\t// Block 0x75, offset 0x1d40\n\t0x1d40: 0x0040, 0x1d41: 0xbca2, 0x1d42: 0xbcba, 0x1d43: 0xbcd2, 0x1d44: 0xbcea, 0x1d45: 0xbd02,\n\t0x1d46: 0xbd1a, 0x1d47: 0xbd32, 0x1d48: 0xbd4a, 0x1d49: 0xbd62, 0x1d4a: 0xbd7a, 0x1d4b: 0x0018,\n\t0x1d4c: 0x0018, 0x1d4d: 0x0040, 0x1d4e: 0x0040, 0x1d4f: 0x0040, 0x1d50: 0xbd92, 0x1d51: 0xbdb2,\n\t0x1d52: 0xbdd2, 0x1d53: 0xbdf2, 0x1d54: 0xbe12, 0x1d55: 0xbe32, 0x1d56: 0xbe52, 0x1d57: 0xbe72,\n\t0x1d58: 0xbe92, 0x1d59: 0xbeb2, 0x1d5a: 0xbed2, 0x1d5b: 0xbef2, 0x1d5c: 0xbf12, 0x1d5d: 0xbf32,\n\t0x1d5e: 0xbf52, 0x1d5f: 0xbf72, 0x1d60: 0xbf92, 0x1d61: 0xbfb2, 0x1d62: 0xbfd2, 0x1d63: 0xbff2,\n\t0x1d64: 0xc012, 0x1d65: 0xc032, 0x1d66: 0xc052, 0x1d67: 0xc072, 0x1d68: 0xc092, 0x1d69: 0xc0b2,\n\t0x1d6a: 0xc0d1, 0x1d6b: 0x1159, 0x1d6c: 0x0269, 0x1d6d: 0x6671, 0x1d6e: 0xc111, 0x1d6f: 0x0040,\n\t0x1d70: 0x0039, 0x1d71: 0x0ee9, 0x1d72: 0x1159, 0x1d73: 0x0ef9, 0x1d74: 0x0f09, 0x1d75: 0x1199,\n\t0x1d76: 0x0f31, 0x1d77: 0x0249, 0x1d78: 0x0f41, 0x1d79: 0x0259, 0x1d7a: 0x0f51, 0x1d7b: 0x0359,\n\t0x1d7c: 0x0f61, 0x1d7d: 0x0f71, 0x1d7e: 0x00d9, 0x1d7f: 0x0f99,\n\t// Block 0x76, offset 0x1d80\n\t0x1d80: 0x2039, 0x1d81: 0x0269, 0x1d82: 0x01d9, 0x1d83: 0x0fa9, 0x1d84: 0x0fb9, 0x1d85: 0x1089,\n\t0x1d86: 0x0279, 0x1d87: 0x0369, 0x1d88: 0x0289, 0x1d89: 0x13d1, 0x1d8a: 0xc129, 0x1d8b: 0x65b1,\n\t0x1d8c: 0xc141, 0x1d8d: 0x1441, 0x1d8e: 0xc159, 0x1d8f: 0xc179, 0x1d90: 0x0018, 0x1d91: 0x0018,\n\t0x1d92: 0x0018, 0x1d93: 0x0018, 0x1d94: 0x0018, 0x1d95: 0x0018, 0x1d96: 0x0018, 0x1d97: 0x0018,\n\t0x1d98: 0x0018, 0x1d99: 0x0018, 0x1d9a: 0x0018, 0x1d9b: 0x0018, 0x1d9c: 0x0018, 0x1d9d: 0x0018,\n\t0x1d9e: 0x0018, 0x1d9f: 0x0018, 0x1da0: 0x0018, 0x1da1: 0x0018, 0x1da2: 0x0018, 0x1da3: 0x0018,\n\t0x1da4: 0x0018, 0x1da5: 0x0018, 0x1da6: 0x0018, 0x1da7: 0x0018, 0x1da8: 0x0018, 0x1da9: 0x0018,\n\t0x1daa: 0xc191, 0x1dab: 0xc1a9, 0x1dac: 0x0040, 0x1dad: 0x0040, 0x1dae: 0x0040, 0x1daf: 0x0040,\n\t0x1db0: 0x0018, 0x1db1: 0x0018, 0x1db2: 0x0018, 0x1db3: 0x0018, 0x1db4: 0x0018, 0x1db5: 0x0018,\n\t0x1db6: 0x0018, 0x1db7: 0x0018, 0x1db8: 0x0018, 0x1db9: 0x0018, 0x1dba: 0x0018, 0x1dbb: 0x0018,\n\t0x1dbc: 0x0018, 0x1dbd: 0x0018, 0x1dbe: 0x0018, 0x1dbf: 0x0018,\n\t// Block 0x77, offset 0x1dc0\n\t0x1dc0: 0xc1d9, 0x1dc1: 0xc211, 0x1dc2: 0xc249, 0x1dc3: 0x0040, 0x1dc4: 0x0040, 0x1dc5: 0x0040,\n\t0x1dc6: 0x0040, 0x1dc7: 0x0040, 0x1dc8: 0x0040, 0x1dc9: 0x0040, 0x1dca: 0x0040, 0x1dcb: 0x0040,\n\t0x1dcc: 0x0040, 0x1dcd: 0x0040, 0x1dce: 0x0040, 0x1dcf: 0x0040, 0x1dd0: 0xc269, 0x1dd1: 0xc289,\n\t0x1dd2: 0xc2a9, 0x1dd3: 0xc2c9, 0x1dd4: 0xc2e9, 0x1dd5: 0xc309, 0x1dd6: 0xc329, 0x1dd7: 0xc349,\n\t0x1dd8: 0xc369, 0x1dd9: 0xc389, 0x1dda: 0xc3a9, 0x1ddb: 0xc3c9, 0x1ddc: 0xc3e9, 0x1ddd: 0xc409,\n\t0x1dde: 0xc429, 0x1ddf: 0xc449, 0x1de0: 0xc469, 0x1de1: 0xc489, 0x1de2: 0xc4a9, 0x1de3: 0xc4c9,\n\t0x1de4: 0xc4e9, 0x1de5: 0xc509, 0x1de6: 0xc529, 0x1de7: 0xc549, 0x1de8: 0xc569, 0x1de9: 0xc589,\n\t0x1dea: 0xc5a9, 0x1deb: 0xc5c9, 0x1dec: 0xc5e9, 0x1ded: 0xc609, 0x1dee: 0xc629, 0x1def: 0xc649,\n\t0x1df0: 0xc669, 0x1df1: 0xc689, 0x1df2: 0xc6a9, 0x1df3: 0xc6c9, 0x1df4: 0xc6e9, 0x1df5: 0xc709,\n\t0x1df6: 0xc729, 0x1df7: 0xc749, 0x1df8: 0xc769, 0x1df9: 0xc789, 0x1dfa: 0xc7a9, 0x1dfb: 0xc7c9,\n\t0x1dfc: 0x0040, 0x1dfd: 0x0040, 0x1dfe: 0x0040, 0x1dff: 0x0040,\n\t// Block 0x78, offset 0x1e00\n\t0x1e00: 0xcaf9, 0x1e01: 0xcb19, 0x1e02: 0xcb39, 0x1e03: 0x8b1d, 0x1e04: 0xcb59, 0x1e05: 0xcb79,\n\t0x1e06: 0xcb99, 0x1e07: 0xcbb9, 0x1e08: 0xcbd9, 0x1e09: 0xcbf9, 0x1e0a: 0xcc19, 0x1e0b: 0xcc39,\n\t0x1e0c: 0xcc59, 0x1e0d: 0x8b3d, 0x1e0e: 0xcc79, 0x1e0f: 0xcc99, 0x1e10: 0xccb9, 0x1e11: 0xccd9,\n\t0x1e12: 0x8b5d, 0x1e13: 0xccf9, 0x1e14: 0xcd19, 0x1e15: 0xc429, 0x1e16: 0x8b7d, 0x1e17: 0xcd39,\n\t0x1e18: 0xcd59, 0x1e19: 0xcd79, 0x1e1a: 0xcd99, 0x1e1b: 0xcdb9, 0x1e1c: 0x8b9d, 0x1e1d: 0xcdd9,\n\t0x1e1e: 0xcdf9, 0x1e1f: 0xce19, 0x1e20: 0xce39, 0x1e21: 0xce59, 0x1e22: 0xc789, 0x1e23: 0xce79,\n\t0x1e24: 0xce99, 0x1e25: 0xceb9, 0x1e26: 0xced9, 0x1e27: 0xcef9, 0x1e28: 0xcf19, 0x1e29: 0xcf39,\n\t0x1e2a: 0xcf59, 0x1e2b: 0xcf79, 0x1e2c: 0xcf99, 0x1e2d: 0xcfb9, 0x1e2e: 0xcfd9, 0x1e2f: 0xcff9,\n\t0x1e30: 0xd019, 0x1e31: 0xd039, 0x1e32: 0xd039, 0x1e33: 0xd039, 0x1e34: 0x8bbd, 0x1e35: 0xd059,\n\t0x1e36: 0xd079, 0x1e37: 0xd099, 0x1e38: 0x8bdd, 0x1e39: 0xd0b9, 0x1e3a: 0xd0d9, 0x1e3b: 0xd0f9,\n\t0x1e3c: 0xd119, 0x1e3d: 0xd139, 0x1e3e: 0xd159, 0x1e3f: 0xd179,\n\t// Block 0x79, offset 0x1e40\n\t0x1e40: 0xd199, 0x1e41: 0xd1b9, 0x1e42: 0xd1d9, 0x1e43: 0xd1f9, 0x1e44: 0xd219, 0x1e45: 0xd239,\n\t0x1e46: 0xd239, 0x1e47: 0xd259, 0x1e48: 0xd279, 0x1e49: 0xd299, 0x1e4a: 0xd2b9, 0x1e4b: 0xd2d9,\n\t0x1e4c: 0xd2f9, 0x1e4d: 0xd319, 0x1e4e: 0xd339, 0x1e4f: 0xd359, 0x1e50: 0xd379, 0x1e51: 0xd399,\n\t0x1e52: 0xd3b9, 0x1e53: 0xd3d9, 0x1e54: 0xd3f9, 0x1e55: 0xd419, 0x1e56: 0xd439, 0x1e57: 0xd459,\n\t0x1e58: 0xd479, 0x1e59: 0x8bfd, 0x1e5a: 0xd499, 0x1e5b: 0xd4b9, 0x1e5c: 0xd4d9, 0x1e5d: 0xc309,\n\t0x1e5e: 0xd4f9, 0x1e5f: 0xd519, 0x1e60: 0x8c1d, 0x1e61: 0x8c3d, 0x1e62: 0xd539, 0x1e63: 0xd559,\n\t0x1e64: 0xd579, 0x1e65: 0xd599, 0x1e66: 0xd5b9, 0x1e67: 0xd5d9, 0x1e68: 0x2040, 0x1e69: 0xd5f9,\n\t0x1e6a: 0xd619, 0x1e6b: 0xd619, 0x1e6c: 0x8c5d, 0x1e6d: 0xd639, 0x1e6e: 0xd659, 0x1e6f: 0xd679,\n\t0x1e70: 0xd699, 0x1e71: 0x8c7d, 0x1e72: 0xd6b9, 0x1e73: 0xd6d9, 0x1e74: 0x2040, 0x1e75: 0xd6f9,\n\t0x1e76: 0xd719, 0x1e77: 0xd739, 0x1e78: 0xd759, 0x1e79: 0xd779, 0x1e7a: 0xd799, 0x1e7b: 0x8c9d,\n\t0x1e7c: 0xd7b9, 0x1e7d: 0x8cbd, 0x1e7e: 0xd7d9, 0x1e7f: 0xd7f9,\n\t// Block 0x7a, offset 0x1e80\n\t0x1e80: 0xd819, 0x1e81: 0xd839, 0x1e82: 0xd859, 0x1e83: 0xd879, 0x1e84: 0xd899, 0x1e85: 0xd8b9,\n\t0x1e86: 0xd8d9, 0x1e87: 0xd8f9, 0x1e88: 0xd919, 0x1e89: 0x8cdd, 0x1e8a: 0xd939, 0x1e8b: 0xd959,\n\t0x1e8c: 0xd979, 0x1e8d: 0xd999, 0x1e8e: 0xd9b9, 0x1e8f: 0x8cfd, 0x1e90: 0xd9d9, 0x1e91: 0x8d1d,\n\t0x1e92: 0x8d3d, 0x1e93: 0xd9f9, 0x1e94: 0xda19, 0x1e95: 0xda19, 0x1e96: 0xda39, 0x1e97: 0x8d5d,\n\t0x1e98: 0x8d7d, 0x1e99: 0xda59, 0x1e9a: 0xda79, 0x1e9b: 0xda99, 0x1e9c: 0xdab9, 0x1e9d: 0xdad9,\n\t0x1e9e: 0xdaf9, 0x1e9f: 0xdb19, 0x1ea0: 0xdb39, 0x1ea1: 0xdb59, 0x1ea2: 0xdb79, 0x1ea3: 0xdb99,\n\t0x1ea4: 0x8d9d, 0x1ea5: 0xdbb9, 0x1ea6: 0xdbd9, 0x1ea7: 0xdbf9, 0x1ea8: 0xdc19, 0x1ea9: 0xdbf9,\n\t0x1eaa: 0xdc39, 0x1eab: 0xdc59, 0x1eac: 0xdc79, 0x1ead: 0xdc99, 0x1eae: 0xdcb9, 0x1eaf: 0xdcd9,\n\t0x1eb0: 0xdcf9, 0x1eb1: 0xdd19, 0x1eb2: 0xdd39, 0x1eb3: 0xdd59, 0x1eb4: 0xdd79, 0x1eb5: 0xdd99,\n\t0x1eb6: 0xddb9, 0x1eb7: 0xddd9, 0x1eb8: 0x8dbd, 0x1eb9: 0xddf9, 0x1eba: 0xde19, 0x1ebb: 0xde39,\n\t0x1ebc: 0xde59, 0x1ebd: 0xde79, 0x1ebe: 0x8ddd, 0x1ebf: 0xde99,\n\t// Block 0x7b, offset 0x1ec0\n\t0x1ec0: 0xe599, 0x1ec1: 0xe5b9, 0x1ec2: 0xe5d9, 0x1ec3: 0xe5f9, 0x1ec4: 0xe619, 0x1ec5: 0xe639,\n\t0x1ec6: 0x8efd, 0x1ec7: 0xe659, 0x1ec8: 0xe679, 0x1ec9: 0xe699, 0x1eca: 0xe6b9, 0x1ecb: 0xe6d9,\n\t0x1ecc: 0xe6f9, 0x1ecd: 0x8f1d, 0x1ece: 0xe719, 0x1ecf: 0xe739, 0x1ed0: 0x8f3d, 0x1ed1: 0x8f5d,\n\t0x1ed2: 0xe759, 0x1ed3: 0xe779, 0x1ed4: 0xe799, 0x1ed5: 0xe7b9, 0x1ed6: 0xe7d9, 0x1ed7: 0xe7f9,\n\t0x1ed8: 0xe819, 0x1ed9: 0xe839, 0x1eda: 0xe859, 0x1edb: 0x8f7d, 0x1edc: 0xe879, 0x1edd: 0x8f9d,\n\t0x1ede: 0xe899, 0x1edf: 0x2040, 0x1ee0: 0xe8b9, 0x1ee1: 0xe8d9, 0x1ee2: 0xe8f9, 0x1ee3: 0x8fbd,\n\t0x1ee4: 0xe919, 0x1ee5: 0xe939, 0x1ee6: 0x8fdd, 0x1ee7: 0x8ffd, 0x1ee8: 0xe959, 0x1ee9: 0xe979,\n\t0x1eea: 0xe999, 0x1eeb: 0xe9b9, 0x1eec: 0xe9d9, 0x1eed: 0xe9d9, 0x1eee: 0xe9f9, 0x1eef: 0xea19,\n\t0x1ef0: 0xea39, 0x1ef1: 0xea59, 0x1ef2: 0xea79, 0x1ef3: 0xea99, 0x1ef4: 0xeab9, 0x1ef5: 0x901d,\n\t0x1ef6: 0xead9, 0x1ef7: 0x903d, 0x1ef8: 0xeaf9, 0x1ef9: 0x905d, 0x1efa: 0xeb19, 0x1efb: 0x907d,\n\t0x1efc: 0x909d, 0x1efd: 0x90bd, 0x1efe: 0xeb39, 0x1eff: 0xeb59,\n\t// Block 0x7c, offset 0x1f00\n\t0x1f00: 0xeb79, 0x1f01: 0x90dd, 0x1f02: 0x90fd, 0x1f03: 0x911d, 0x1f04: 0x913d, 0x1f05: 0xeb99,\n\t0x1f06: 0xebb9, 0x1f07: 0xebb9, 0x1f08: 0xebd9, 0x1f09: 0xebf9, 0x1f0a: 0xec19, 0x1f0b: 0xec39,\n\t0x1f0c: 0xec59, 0x1f0d: 0x915d, 0x1f0e: 0xec79, 0x1f0f: 0xec99, 0x1f10: 0xecb9, 0x1f11: 0xecd9,\n\t0x1f12: 0x917d, 0x1f13: 0xecf9, 0x1f14: 0x919d, 0x1f15: 0x91bd, 0x1f16: 0xed19, 0x1f17: 0xed39,\n\t0x1f18: 0xed59, 0x1f19: 0xed79, 0x1f1a: 0xed99, 0x1f1b: 0xedb9, 0x1f1c: 0x91dd, 0x1f1d: 0x91fd,\n\t0x1f1e: 0x921d, 0x1f1f: 0x2040, 0x1f20: 0xedd9, 0x1f21: 0x923d, 0x1f22: 0xedf9, 0x1f23: 0xee19,\n\t0x1f24: 0xee39, 0x1f25: 0x925d, 0x1f26: 0xee59, 0x1f27: 0xee79, 0x1f28: 0xee99, 0x1f29: 0xeeb9,\n\t0x1f2a: 0xeed9, 0x1f2b: 0x927d, 0x1f2c: 0xeef9, 0x1f2d: 0xef19, 0x1f2e: 0xef39, 0x1f2f: 0xef59,\n\t0x1f30: 0xef79, 0x1f31: 0xef99, 0x1f32: 0x929d, 0x1f33: 0x92bd, 0x1f34: 0xefb9, 0x1f35: 0x92dd,\n\t0x1f36: 0xefd9, 0x1f37: 0x92fd, 0x1f38: 0xeff9, 0x1f39: 0xf019, 0x1f3a: 0xf039, 0x1f3b: 0x931d,\n\t0x1f3c: 0x933d, 0x1f3d: 0xf059, 0x1f3e: 0x935d, 0x1f3f: 0xf079,\n\t// Block 0x7d, offset 0x1f40\n\t0x1f40: 0xf6b9, 0x1f41: 0xf6d9, 0x1f42: 0xf6f9, 0x1f43: 0xf719, 0x1f44: 0xf739, 0x1f45: 0x951d,\n\t0x1f46: 0xf759, 0x1f47: 0xf779, 0x1f48: 0xf799, 0x1f49: 0xf7b9, 0x1f4a: 0xf7d9, 0x1f4b: 0x953d,\n\t0x1f4c: 0x955d, 0x1f4d: 0xf7f9, 0x1f4e: 0xf819, 0x1f4f: 0xf839, 0x1f50: 0xf859, 0x1f51: 0xf879,\n\t0x1f52: 0xf899, 0x1f53: 0x957d, 0x1f54: 0xf8b9, 0x1f55: 0xf8d9, 0x1f56: 0xf8f9, 0x1f57: 0xf919,\n\t0x1f58: 0x959d, 0x1f59: 0x95bd, 0x1f5a: 0xf939, 0x1f5b: 0xf959, 0x1f5c: 0xf979, 0x1f5d: 0x95dd,\n\t0x1f5e: 0xf999, 0x1f5f: 0xf9b9, 0x1f60: 0x6815, 0x1f61: 0x95fd, 0x1f62: 0xf9d9, 0x1f63: 0xf9f9,\n\t0x1f64: 0xfa19, 0x1f65: 0x961d, 0x1f66: 0xfa39, 0x1f67: 0xfa59, 0x1f68: 0xfa79, 0x1f69: 0xfa99,\n\t0x1f6a: 0xfab9, 0x1f6b: 0xfad9, 0x1f6c: 0xfaf9, 0x1f6d: 0x963d, 0x1f6e: 0xfb19, 0x1f6f: 0xfb39,\n\t0x1f70: 0xfb59, 0x1f71: 0x965d, 0x1f72: 0xfb79, 0x1f73: 0xfb99, 0x1f74: 0xfbb9, 0x1f75: 0xfbd9,\n\t0x1f76: 0x7b35, 0x1f77: 0x967d, 0x1f78: 0xfbf9, 0x1f79: 0xfc19, 0x1f7a: 0xfc39, 0x1f7b: 0x969d,\n\t0x1f7c: 0xfc59, 0x1f7d: 0x96bd, 0x1f7e: 0xfc79, 0x1f7f: 0xfc79,\n\t// Block 0x7e, offset 0x1f80\n\t0x1f80: 0xfc99, 0x1f81: 0x96dd, 0x1f82: 0xfcb9, 0x1f83: 0xfcd9, 0x1f84: 0xfcf9, 0x1f85: 0xfd19,\n\t0x1f86: 0xfd39, 0x1f87: 0xfd59, 0x1f88: 0xfd79, 0x1f89: 0x96fd, 0x1f8a: 0xfd99, 0x1f8b: 0xfdb9,\n\t0x1f8c: 0xfdd9, 0x1f8d: 0xfdf9, 0x1f8e: 0xfe19, 0x1f8f: 0xfe39, 0x1f90: 0x971d, 0x1f91: 0xfe59,\n\t0x1f92: 0x973d, 0x1f93: 0x975d, 0x1f94: 0x977d, 0x1f95: 0xfe79, 0x1f96: 0xfe99, 0x1f97: 0xfeb9,\n\t0x1f98: 0xfed9, 0x1f99: 0xfef9, 0x1f9a: 0xff19, 0x1f9b: 0xff39, 0x1f9c: 0xff59, 0x1f9d: 0x979d,\n\t0x1f9e: 0x0040, 0x1f9f: 0x0040, 0x1fa0: 0x0040, 0x1fa1: 0x0040, 0x1fa2: 0x0040, 0x1fa3: 0x0040,\n\t0x1fa4: 0x0040, 0x1fa5: 0x0040, 0x1fa6: 0x0040, 0x1fa7: 0x0040, 0x1fa8: 0x0040, 0x1fa9: 0x0040,\n\t0x1faa: 0x0040, 0x1fab: 0x0040, 0x1fac: 0x0040, 0x1fad: 0x0040, 0x1fae: 0x0040, 0x1faf: 0x0040,\n\t0x1fb0: 0x0040, 0x1fb1: 0x0040, 0x1fb2: 0x0040, 0x1fb3: 0x0040, 0x1fb4: 0x0040, 0x1fb5: 0x0040,\n\t0x1fb6: 0x0040, 0x1fb7: 0x0040, 0x1fb8: 0x0040, 0x1fb9: 0x0040, 0x1fba: 0x0040, 0x1fbb: 0x0040,\n\t0x1fbc: 0x0040, 0x1fbd: 0x0040, 0x1fbe: 0x0040, 0x1fbf: 0x0040,\n}\n\n// idnaIndex: 36 blocks, 2304 entries, 4608 bytes\n// Block 0 is the zero block.\nvar idnaIndex = [2304]uint16{\n\t// Block 0x0, offset 0x0\n\t// Block 0x1, offset 0x40\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc2: 0x01, 0xc3: 0x7d, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x04, 0xc7: 0x05,\n\t0xc8: 0x06, 0xc9: 0x7e, 0xca: 0x7f, 0xcb: 0x07, 0xcc: 0x80, 0xcd: 0x08, 0xce: 0x09, 0xcf: 0x0a,\n\t0xd0: 0x81, 0xd1: 0x0b, 0xd2: 0x0c, 0xd3: 0x0d, 0xd4: 0x0e, 0xd5: 0x82, 0xd6: 0x83, 0xd7: 0x84,\n\t0xd8: 0x0f, 0xd9: 0x10, 0xda: 0x85, 0xdb: 0x11, 0xdc: 0x12, 0xdd: 0x86, 0xde: 0x87, 0xdf: 0x88,\n\t0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07,\n\t0xe8: 0x07, 0xe9: 0x08, 0xea: 0x09, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c,\n\t0xf0: 0x1d, 0xf1: 0x1e, 0xf2: 0x1e, 0xf3: 0x20, 0xf4: 0x21,\n\t// Block 0x4, offset 0x100\n\t0x120: 0x89, 0x121: 0x13, 0x122: 0x8a, 0x123: 0x8b, 0x124: 0x8c, 0x125: 0x14, 0x126: 0x15, 0x127: 0x16,\n\t0x128: 0x17, 0x129: 0x18, 0x12a: 0x19, 0x12b: 0x1a, 0x12c: 0x1b, 0x12d: 0x1c, 0x12e: 0x1d, 0x12f: 0x8d,\n\t0x130: 0x8e, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x8f, 0x135: 0x21, 0x136: 0x90, 0x137: 0x91,\n\t0x138: 0x92, 0x139: 0x93, 0x13a: 0x22, 0x13b: 0x94, 0x13c: 0x95, 0x13d: 0x23, 0x13e: 0x24, 0x13f: 0x96,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x97, 0x141: 0x98, 0x142: 0x99, 0x143: 0x9a, 0x144: 0x9b, 0x145: 0x9c, 0x146: 0x9d, 0x147: 0x9e,\n\t0x148: 0x9f, 0x149: 0xa0, 0x14a: 0xa1, 0x14b: 0xa2, 0x14c: 0xa3, 0x14d: 0xa4, 0x14e: 0xa5, 0x14f: 0xa6,\n\t0x150: 0xa7, 0x151: 0x9f, 0x152: 0x9f, 0x153: 0x9f, 0x154: 0x9f, 0x155: 0x9f, 0x156: 0x9f, 0x157: 0x9f,\n\t0x158: 0x9f, 0x159: 0xa8, 0x15a: 0xa9, 0x15b: 0xaa, 0x15c: 0xab, 0x15d: 0xac, 0x15e: 0xad, 0x15f: 0xae,\n\t0x160: 0xaf, 0x161: 0xb0, 0x162: 0xb1, 0x163: 0xb2, 0x164: 0xb3, 0x165: 0xb4, 0x166: 0xb5, 0x167: 0xb6,\n\t0x168: 0xb7, 0x169: 0xb8, 0x16a: 0xb9, 0x16b: 0xba, 0x16c: 0xbb, 0x16d: 0xbc, 0x16e: 0xbd, 0x16f: 0xbe,\n\t0x170: 0xbf, 0x171: 0xc0, 0x172: 0xc1, 0x173: 0xc2, 0x174: 0x25, 0x175: 0x26, 0x176: 0x27, 0x177: 0xc3,\n\t0x178: 0x28, 0x179: 0x28, 0x17a: 0x29, 0x17b: 0x28, 0x17c: 0xc4, 0x17d: 0x2a, 0x17e: 0x2b, 0x17f: 0x2c,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x2d, 0x181: 0x2e, 0x182: 0x2f, 0x183: 0xc5, 0x184: 0x30, 0x185: 0x31, 0x186: 0xc6, 0x187: 0x9b,\n\t0x188: 0xc7, 0x189: 0xc8, 0x18a: 0x9b, 0x18b: 0x9b, 0x18c: 0xc9, 0x18d: 0x9b, 0x18e: 0x9b, 0x18f: 0x9b,\n\t0x190: 0xca, 0x191: 0x32, 0x192: 0x33, 0x193: 0x34, 0x194: 0x9b, 0x195: 0x9b, 0x196: 0x9b, 0x197: 0x9b,\n\t0x198: 0x9b, 0x199: 0x9b, 0x19a: 0x9b, 0x19b: 0x9b, 0x19c: 0x9b, 0x19d: 0x9b, 0x19e: 0x9b, 0x19f: 0x9b,\n\t0x1a0: 0x9b, 0x1a1: 0x9b, 0x1a2: 0x9b, 0x1a3: 0x9b, 0x1a4: 0x9b, 0x1a5: 0x9b, 0x1a6: 0x9b, 0x1a7: 0x9b,\n\t0x1a8: 0xcb, 0x1a9: 0xcc, 0x1aa: 0x9b, 0x1ab: 0xcd, 0x1ac: 0x9b, 0x1ad: 0xce, 0x1ae: 0xcf, 0x1af: 0xd0,\n\t0x1b0: 0xd1, 0x1b1: 0x35, 0x1b2: 0x28, 0x1b3: 0x36, 0x1b4: 0xd2, 0x1b5: 0xd3, 0x1b6: 0xd4, 0x1b7: 0xd5,\n\t0x1b8: 0xd6, 0x1b9: 0xd7, 0x1ba: 0xd8, 0x1bb: 0xd9, 0x1bc: 0xda, 0x1bd: 0xdb, 0x1be: 0xdc, 0x1bf: 0x37,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x38, 0x1c1: 0xdd, 0x1c2: 0xde, 0x1c3: 0xdf, 0x1c4: 0xe0, 0x1c5: 0x39, 0x1c6: 0x3a, 0x1c7: 0xe1,\n\t0x1c8: 0xe2, 0x1c9: 0x3b, 0x1ca: 0x3c, 0x1cb: 0x3d, 0x1cc: 0x3e, 0x1cd: 0x3f, 0x1ce: 0x40, 0x1cf: 0x41,\n\t0x1d0: 0x9f, 0x1d1: 0x9f, 0x1d2: 0x9f, 0x1d3: 0x9f, 0x1d4: 0x9f, 0x1d5: 0x9f, 0x1d6: 0x9f, 0x1d7: 0x9f,\n\t0x1d8: 0x9f, 0x1d9: 0x9f, 0x1da: 0x9f, 0x1db: 0x9f, 0x1dc: 0x9f, 0x1dd: 0x9f, 0x1de: 0x9f, 0x1df: 0x9f,\n\t0x1e0: 0x9f, 0x1e1: 0x9f, 0x1e2: 0x9f, 0x1e3: 0x9f, 0x1e4: 0x9f, 0x1e5: 0x9f, 0x1e6: 0x9f, 0x1e7: 0x9f,\n\t0x1e8: 0x9f, 0x1e9: 0x9f, 0x1ea: 0x9f, 0x1eb: 0x9f, 0x1ec: 0x9f, 0x1ed: 0x9f, 0x1ee: 0x9f, 0x1ef: 0x9f,\n\t0x1f0: 0x9f, 0x1f1: 0x9f, 0x1f2: 0x9f, 0x1f3: 0x9f, 0x1f4: 0x9f, 0x1f5: 0x9f, 0x1f6: 0x9f, 0x1f7: 0x9f,\n\t0x1f8: 0x9f, 0x1f9: 0x9f, 0x1fa: 0x9f, 0x1fb: 0x9f, 0x1fc: 0x9f, 0x1fd: 0x9f, 0x1fe: 0x9f, 0x1ff: 0x9f,\n\t// Block 0x8, offset 0x200\n\t0x200: 0x9f, 0x201: 0x9f, 0x202: 0x9f, 0x203: 0x9f, 0x204: 0x9f, 0x205: 0x9f, 0x206: 0x9f, 0x207: 0x9f,\n\t0x208: 0x9f, 0x209: 0x9f, 0x20a: 0x9f, 0x20b: 0x9f, 0x20c: 0x9f, 0x20d: 0x9f, 0x20e: 0x9f, 0x20f: 0x9f,\n\t0x210: 0x9f, 0x211: 0x9f, 0x212: 0x9f, 0x213: 0x9f, 0x214: 0x9f, 0x215: 0x9f, 0x216: 0x9f, 0x217: 0x9f,\n\t0x218: 0x9f, 0x219: 0x9f, 0x21a: 0x9f, 0x21b: 0x9f, 0x21c: 0x9f, 0x21d: 0x9f, 0x21e: 0x9f, 0x21f: 0x9f,\n\t0x220: 0x9f, 0x221: 0x9f, 0x222: 0x9f, 0x223: 0x9f, 0x224: 0x9f, 0x225: 0x9f, 0x226: 0x9f, 0x227: 0x9f,\n\t0x228: 0x9f, 0x229: 0x9f, 0x22a: 0x9f, 0x22b: 0x9f, 0x22c: 0x9f, 0x22d: 0x9f, 0x22e: 0x9f, 0x22f: 0x9f,\n\t0x230: 0x9f, 0x231: 0x9f, 0x232: 0x9f, 0x233: 0x9f, 0x234: 0x9f, 0x235: 0x9f, 0x236: 0xb2, 0x237: 0x9b,\n\t0x238: 0x9f, 0x239: 0x9f, 0x23a: 0x9f, 0x23b: 0x9f, 0x23c: 0x9f, 0x23d: 0x9f, 0x23e: 0x9f, 0x23f: 0x9f,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x9f, 0x241: 0x9f, 0x242: 0x9f, 0x243: 0x9f, 0x244: 0x9f, 0x245: 0x9f, 0x246: 0x9f, 0x247: 0x9f,\n\t0x248: 0x9f, 0x249: 0x9f, 0x24a: 0x9f, 0x24b: 0x9f, 0x24c: 0x9f, 0x24d: 0x9f, 0x24e: 0x9f, 0x24f: 0x9f,\n\t0x250: 0x9f, 0x251: 0x9f, 0x252: 0x9f, 0x253: 0x9f, 0x254: 0x9f, 0x255: 0x9f, 0x256: 0x9f, 0x257: 0x9f,\n\t0x258: 0x9f, 0x259: 0x9f, 0x25a: 0x9f, 0x25b: 0x9f, 0x25c: 0x9f, 0x25d: 0x9f, 0x25e: 0x9f, 0x25f: 0x9f,\n\t0x260: 0x9f, 0x261: 0x9f, 0x262: 0x9f, 0x263: 0x9f, 0x264: 0x9f, 0x265: 0x9f, 0x266: 0x9f, 0x267: 0x9f,\n\t0x268: 0x9f, 0x269: 0x9f, 0x26a: 0x9f, 0x26b: 0x9f, 0x26c: 0x9f, 0x26d: 0x9f, 0x26e: 0x9f, 0x26f: 0x9f,\n\t0x270: 0x9f, 0x271: 0x9f, 0x272: 0x9f, 0x273: 0x9f, 0x274: 0x9f, 0x275: 0x9f, 0x276: 0x9f, 0x277: 0x9f,\n\t0x278: 0x9f, 0x279: 0x9f, 0x27a: 0x9f, 0x27b: 0x9f, 0x27c: 0x9f, 0x27d: 0x9f, 0x27e: 0x9f, 0x27f: 0x9f,\n\t// Block 0xa, offset 0x280\n\t0x280: 0x9f, 0x281: 0x9f, 0x282: 0x9f, 0x283: 0x9f, 0x284: 0x9f, 0x285: 0x9f, 0x286: 0x9f, 0x287: 0x9f,\n\t0x288: 0x9f, 0x289: 0x9f, 0x28a: 0x9f, 0x28b: 0x9f, 0x28c: 0x9f, 0x28d: 0x9f, 0x28e: 0x9f, 0x28f: 0x9f,\n\t0x290: 0x9f, 0x291: 0x9f, 0x292: 0x9f, 0x293: 0x9f, 0x294: 0x9f, 0x295: 0x9f, 0x296: 0x9f, 0x297: 0x9f,\n\t0x298: 0x9f, 0x299: 0x9f, 0x29a: 0x9f, 0x29b: 0x9f, 0x29c: 0x9f, 0x29d: 0x9f, 0x29e: 0x9f, 0x29f: 0x9f,\n\t0x2a0: 0x9f, 0x2a1: 0x9f, 0x2a2: 0x9f, 0x2a3: 0x9f, 0x2a4: 0x9f, 0x2a5: 0x9f, 0x2a6: 0x9f, 0x2a7: 0x9f,\n\t0x2a8: 0x9f, 0x2a9: 0x9f, 0x2aa: 0x9f, 0x2ab: 0x9f, 0x2ac: 0x9f, 0x2ad: 0x9f, 0x2ae: 0x9f, 0x2af: 0x9f,\n\t0x2b0: 0x9f, 0x2b1: 0x9f, 0x2b2: 0x9f, 0x2b3: 0x9f, 0x2b4: 0x9f, 0x2b5: 0x9f, 0x2b6: 0x9f, 0x2b7: 0x9f,\n\t0x2b8: 0x9f, 0x2b9: 0x9f, 0x2ba: 0x9f, 0x2bb: 0x9f, 0x2bc: 0x9f, 0x2bd: 0x9f, 0x2be: 0x9f, 0x2bf: 0xe3,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0x9f, 0x2c1: 0x9f, 0x2c2: 0x9f, 0x2c3: 0x9f, 0x2c4: 0x9f, 0x2c5: 0x9f, 0x2c6: 0x9f, 0x2c7: 0x9f,\n\t0x2c8: 0x9f, 0x2c9: 0x9f, 0x2ca: 0x9f, 0x2cb: 0x9f, 0x2cc: 0x9f, 0x2cd: 0x9f, 0x2ce: 0x9f, 0x2cf: 0x9f,\n\t0x2d0: 0x9f, 0x2d1: 0x9f, 0x2d2: 0xe4, 0x2d3: 0xe5, 0x2d4: 0x9f, 0x2d5: 0x9f, 0x2d6: 0x9f, 0x2d7: 0x9f,\n\t0x2d8: 0xe6, 0x2d9: 0x42, 0x2da: 0x43, 0x2db: 0xe7, 0x2dc: 0x44, 0x2dd: 0x45, 0x2de: 0x46, 0x2df: 0xe8,\n\t0x2e0: 0xe9, 0x2e1: 0xea, 0x2e2: 0xeb, 0x2e3: 0xec, 0x2e4: 0xed, 0x2e5: 0xee, 0x2e6: 0xef, 0x2e7: 0xf0,\n\t0x2e8: 0xf1, 0x2e9: 0xf2, 0x2ea: 0xf3, 0x2eb: 0xf4, 0x2ec: 0xf5, 0x2ed: 0xf6, 0x2ee: 0xf7, 0x2ef: 0xf8,\n\t0x2f0: 0x9f, 0x2f1: 0x9f, 0x2f2: 0x9f, 0x2f3: 0x9f, 0x2f4: 0x9f, 0x2f5: 0x9f, 0x2f6: 0x9f, 0x2f7: 0x9f,\n\t0x2f8: 0x9f, 0x2f9: 0x9f, 0x2fa: 0x9f, 0x2fb: 0x9f, 0x2fc: 0x9f, 0x2fd: 0x9f, 0x2fe: 0x9f, 0x2ff: 0x9f,\n\t// Block 0xc, offset 0x300\n\t0x300: 0x9f, 0x301: 0x9f, 0x302: 0x9f, 0x303: 0x9f, 0x304: 0x9f, 0x305: 0x9f, 0x306: 0x9f, 0x307: 0x9f,\n\t0x308: 0x9f, 0x309: 0x9f, 0x30a: 0x9f, 0x30b: 0x9f, 0x30c: 0x9f, 0x30d: 0x9f, 0x30e: 0x9f, 0x30f: 0x9f,\n\t0x310: 0x9f, 0x311: 0x9f, 0x312: 0x9f, 0x313: 0x9f, 0x314: 0x9f, 0x315: 0x9f, 0x316: 0x9f, 0x317: 0x9f,\n\t0x318: 0x9f, 0x319: 0x9f, 0x31a: 0x9f, 0x31b: 0x9f, 0x31c: 0x9f, 0x31d: 0x9f, 0x31e: 0xf9, 0x31f: 0xfa,\n\t// Block 0xd, offset 0x340\n\t0x340: 0xba, 0x341: 0xba, 0x342: 0xba, 0x343: 0xba, 0x344: 0xba, 0x345: 0xba, 0x346: 0xba, 0x347: 0xba,\n\t0x348: 0xba, 0x349: 0xba, 0x34a: 0xba, 0x34b: 0xba, 0x34c: 0xba, 0x34d: 0xba, 0x34e: 0xba, 0x34f: 0xba,\n\t0x350: 0xba, 0x351: 0xba, 0x352: 0xba, 0x353: 0xba, 0x354: 0xba, 0x355: 0xba, 0x356: 0xba, 0x357: 0xba,\n\t0x358: 0xba, 0x359: 0xba, 0x35a: 0xba, 0x35b: 0xba, 0x35c: 0xba, 0x35d: 0xba, 0x35e: 0xba, 0x35f: 0xba,\n\t0x360: 0xba, 0x361: 0xba, 0x362: 0xba, 0x363: 0xba, 0x364: 0xba, 0x365: 0xba, 0x366: 0xba, 0x367: 0xba,\n\t0x368: 0xba, 0x369: 0xba, 0x36a: 0xba, 0x36b: 0xba, 0x36c: 0xba, 0x36d: 0xba, 0x36e: 0xba, 0x36f: 0xba,\n\t0x370: 0xba, 0x371: 0xba, 0x372: 0xba, 0x373: 0xba, 0x374: 0xba, 0x375: 0xba, 0x376: 0xba, 0x377: 0xba,\n\t0x378: 0xba, 0x379: 0xba, 0x37a: 0xba, 0x37b: 0xba, 0x37c: 0xba, 0x37d: 0xba, 0x37e: 0xba, 0x37f: 0xba,\n\t// Block 0xe, offset 0x380\n\t0x380: 0xba, 0x381: 0xba, 0x382: 0xba, 0x383: 0xba, 0x384: 0xba, 0x385: 0xba, 0x386: 0xba, 0x387: 0xba,\n\t0x388: 0xba, 0x389: 0xba, 0x38a: 0xba, 0x38b: 0xba, 0x38c: 0xba, 0x38d: 0xba, 0x38e: 0xba, 0x38f: 0xba,\n\t0x390: 0xba, 0x391: 0xba, 0x392: 0xba, 0x393: 0xba, 0x394: 0xba, 0x395: 0xba, 0x396: 0xba, 0x397: 0xba,\n\t0x398: 0xba, 0x399: 0xba, 0x39a: 0xba, 0x39b: 0xba, 0x39c: 0xba, 0x39d: 0xba, 0x39e: 0xba, 0x39f: 0xba,\n\t0x3a0: 0xba, 0x3a1: 0xba, 0x3a2: 0xba, 0x3a3: 0xba, 0x3a4: 0xfb, 0x3a5: 0xfc, 0x3a6: 0xfd, 0x3a7: 0xfe,\n\t0x3a8: 0x47, 0x3a9: 0xff, 0x3aa: 0x100, 0x3ab: 0x48, 0x3ac: 0x49, 0x3ad: 0x4a, 0x3ae: 0x4b, 0x3af: 0x4c,\n\t0x3b0: 0x101, 0x3b1: 0x4d, 0x3b2: 0x4e, 0x3b3: 0x4f, 0x3b4: 0x50, 0x3b5: 0x51, 0x3b6: 0x102, 0x3b7: 0x52,\n\t0x3b8: 0x53, 0x3b9: 0x54, 0x3ba: 0x55, 0x3bb: 0x56, 0x3bc: 0x57, 0x3bd: 0x58, 0x3be: 0x59, 0x3bf: 0x5a,\n\t// Block 0xf, offset 0x3c0\n\t0x3c0: 0x103, 0x3c1: 0x104, 0x3c2: 0x9f, 0x3c3: 0x105, 0x3c4: 0x106, 0x3c5: 0x9b, 0x3c6: 0x107, 0x3c7: 0x108,\n\t0x3c8: 0xba, 0x3c9: 0xba, 0x3ca: 0x109, 0x3cb: 0x10a, 0x3cc: 0x10b, 0x3cd: 0x10c, 0x3ce: 0x10d, 0x3cf: 0x10e,\n\t0x3d0: 0x10f, 0x3d1: 0x9f, 0x3d2: 0x110, 0x3d3: 0x111, 0x3d4: 0x112, 0x3d5: 0x113, 0x3d6: 0xba, 0x3d7: 0xba,\n\t0x3d8: 0x9f, 0x3d9: 0x9f, 0x3da: 0x9f, 0x3db: 0x9f, 0x3dc: 0x114, 0x3dd: 0x115, 0x3de: 0xba, 0x3df: 0xba,\n\t0x3e0: 0x116, 0x3e1: 0x117, 0x3e2: 0x118, 0x3e3: 0x119, 0x3e4: 0x11a, 0x3e5: 0xba, 0x3e6: 0x11b, 0x3e7: 0x11c,\n\t0x3e8: 0x11d, 0x3e9: 0x11e, 0x3ea: 0x11f, 0x3eb: 0x5b, 0x3ec: 0x120, 0x3ed: 0x121, 0x3ee: 0x5c, 0x3ef: 0xba,\n\t0x3f0: 0x122, 0x3f1: 0x123, 0x3f2: 0x124, 0x3f3: 0x125, 0x3f4: 0xba, 0x3f5: 0xba, 0x3f6: 0xba, 0x3f7: 0xba,\n\t0x3f8: 0xba, 0x3f9: 0x126, 0x3fa: 0xba, 0x3fb: 0xba, 0x3fc: 0xba, 0x3fd: 0xba, 0x3fe: 0xba, 0x3ff: 0xba,\n\t// Block 0x10, offset 0x400\n\t0x400: 0x127, 0x401: 0x128, 0x402: 0x129, 0x403: 0x12a, 0x404: 0x12b, 0x405: 0x12c, 0x406: 0x12d, 0x407: 0x12e,\n\t0x408: 0x12f, 0x409: 0xba, 0x40a: 0x130, 0x40b: 0x131, 0x40c: 0x5d, 0x40d: 0x5e, 0x40e: 0xba, 0x40f: 0xba,\n\t0x410: 0x132, 0x411: 0x133, 0x412: 0x134, 0x413: 0x135, 0x414: 0xba, 0x415: 0xba, 0x416: 0x136, 0x417: 0x137,\n\t0x418: 0x138, 0x419: 0x139, 0x41a: 0x13a, 0x41b: 0x13b, 0x41c: 0x13c, 0x41d: 0xba, 0x41e: 0xba, 0x41f: 0xba,\n\t0x420: 0xba, 0x421: 0xba, 0x422: 0x13d, 0x423: 0x13e, 0x424: 0xba, 0x425: 0xba, 0x426: 0xba, 0x427: 0xba,\n\t0x428: 0x13f, 0x429: 0x140, 0x42a: 0x141, 0x42b: 0x142, 0x42c: 0xba, 0x42d: 0xba, 0x42e: 0xba, 0x42f: 0xba,\n\t0x430: 0x143, 0x431: 0x144, 0x432: 0x145, 0x433: 0xba, 0x434: 0x146, 0x435: 0x147, 0x436: 0xba, 0x437: 0xba,\n\t0x438: 0xba, 0x439: 0xba, 0x43a: 0xba, 0x43b: 0xba, 0x43c: 0xba, 0x43d: 0xba, 0x43e: 0xba, 0x43f: 0xba,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x9f, 0x441: 0x9f, 0x442: 0x9f, 0x443: 0x9f, 0x444: 0x9f, 0x445: 0x9f, 0x446: 0x9f, 0x447: 0x9f,\n\t0x448: 0x9f, 0x449: 0x9f, 0x44a: 0x9f, 0x44b: 0x9f, 0x44c: 0x9f, 0x44d: 0x9f, 0x44e: 0x148, 0x44f: 0xba,\n\t0x450: 0x9b, 0x451: 0x149, 0x452: 0x9f, 0x453: 0x9f, 0x454: 0x9f, 0x455: 0x14a, 0x456: 0xba, 0x457: 0xba,\n\t0x458: 0xba, 0x459: 0xba, 0x45a: 0xba, 0x45b: 0xba, 0x45c: 0xba, 0x45d: 0xba, 0x45e: 0xba, 0x45f: 0xba,\n\t0x460: 0xba, 0x461: 0xba, 0x462: 0xba, 0x463: 0xba, 0x464: 0xba, 0x465: 0xba, 0x466: 0xba, 0x467: 0xba,\n\t0x468: 0xba, 0x469: 0xba, 0x46a: 0xba, 0x46b: 0xba, 0x46c: 0xba, 0x46d: 0xba, 0x46e: 0xba, 0x46f: 0xba,\n\t0x470: 0xba, 0x471: 0xba, 0x472: 0xba, 0x473: 0xba, 0x474: 0xba, 0x475: 0xba, 0x476: 0xba, 0x477: 0xba,\n\t0x478: 0xba, 0x479: 0xba, 0x47a: 0xba, 0x47b: 0xba, 0x47c: 0xba, 0x47d: 0xba, 0x47e: 0xba, 0x47f: 0xba,\n\t// Block 0x12, offset 0x480\n\t0x480: 0x9f, 0x481: 0x9f, 0x482: 0x9f, 0x483: 0x9f, 0x484: 0x9f, 0x485: 0x9f, 0x486: 0x9f, 0x487: 0x9f,\n\t0x488: 0x9f, 0x489: 0x9f, 0x48a: 0x9f, 0x48b: 0x9f, 0x48c: 0x9f, 0x48d: 0x9f, 0x48e: 0x9f, 0x48f: 0x9f,\n\t0x490: 0x14b, 0x491: 0xba, 0x492: 0xba, 0x493: 0xba, 0x494: 0xba, 0x495: 0xba, 0x496: 0xba, 0x497: 0xba,\n\t0x498: 0xba, 0x499: 0xba, 0x49a: 0xba, 0x49b: 0xba, 0x49c: 0xba, 0x49d: 0xba, 0x49e: 0xba, 0x49f: 0xba,\n\t0x4a0: 0xba, 0x4a1: 0xba, 0x4a2: 0xba, 0x4a3: 0xba, 0x4a4: 0xba, 0x4a5: 0xba, 0x4a6: 0xba, 0x4a7: 0xba,\n\t0x4a8: 0xba, 0x4a9: 0xba, 0x4aa: 0xba, 0x4ab: 0xba, 0x4ac: 0xba, 0x4ad: 0xba, 0x4ae: 0xba, 0x4af: 0xba,\n\t0x4b0: 0xba, 0x4b1: 0xba, 0x4b2: 0xba, 0x4b3: 0xba, 0x4b4: 0xba, 0x4b5: 0xba, 0x4b6: 0xba, 0x4b7: 0xba,\n\t0x4b8: 0xba, 0x4b9: 0xba, 0x4ba: 0xba, 0x4bb: 0xba, 0x4bc: 0xba, 0x4bd: 0xba, 0x4be: 0xba, 0x4bf: 0xba,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0xba, 0x4c1: 0xba, 0x4c2: 0xba, 0x4c3: 0xba, 0x4c4: 0xba, 0x4c5: 0xba, 0x4c6: 0xba, 0x4c7: 0xba,\n\t0x4c8: 0xba, 0x4c9: 0xba, 0x4ca: 0xba, 0x4cb: 0xba, 0x4cc: 0xba, 0x4cd: 0xba, 0x4ce: 0xba, 0x4cf: 0xba,\n\t0x4d0: 0x9f, 0x4d1: 0x9f, 0x4d2: 0x9f, 0x4d3: 0x9f, 0x4d4: 0x9f, 0x4d5: 0x9f, 0x4d6: 0x9f, 0x4d7: 0x9f,\n\t0x4d8: 0x9f, 0x4d9: 0x14c, 0x4da: 0xba, 0x4db: 0xba, 0x4dc: 0xba, 0x4dd: 0xba, 0x4de: 0xba, 0x4df: 0xba,\n\t0x4e0: 0xba, 0x4e1: 0xba, 0x4e2: 0xba, 0x4e3: 0xba, 0x4e4: 0xba, 0x4e5: 0xba, 0x4e6: 0xba, 0x4e7: 0xba,\n\t0x4e8: 0xba, 0x4e9: 0xba, 0x4ea: 0xba, 0x4eb: 0xba, 0x4ec: 0xba, 0x4ed: 0xba, 0x4ee: 0xba, 0x4ef: 0xba,\n\t0x4f0: 0xba, 0x4f1: 0xba, 0x4f2: 0xba, 0x4f3: 0xba, 0x4f4: 0xba, 0x4f5: 0xba, 0x4f6: 0xba, 0x4f7: 0xba,\n\t0x4f8: 0xba, 0x4f9: 0xba, 0x4fa: 0xba, 0x4fb: 0xba, 0x4fc: 0xba, 0x4fd: 0xba, 0x4fe: 0xba, 0x4ff: 0xba,\n\t// Block 0x14, offset 0x500\n\t0x500: 0xba, 0x501: 0xba, 0x502: 0xba, 0x503: 0xba, 0x504: 0xba, 0x505: 0xba, 0x506: 0xba, 0x507: 0xba,\n\t0x508: 0xba, 0x509: 0xba, 0x50a: 0xba, 0x50b: 0xba, 0x50c: 0xba, 0x50d: 0xba, 0x50e: 0xba, 0x50f: 0xba,\n\t0x510: 0xba, 0x511: 0xba, 0x512: 0xba, 0x513: 0xba, 0x514: 0xba, 0x515: 0xba, 0x516: 0xba, 0x517: 0xba,\n\t0x518: 0xba, 0x519: 0xba, 0x51a: 0xba, 0x51b: 0xba, 0x51c: 0xba, 0x51d: 0xba, 0x51e: 0xba, 0x51f: 0xba,\n\t0x520: 0x9f, 0x521: 0x9f, 0x522: 0x9f, 0x523: 0x9f, 0x524: 0x9f, 0x525: 0x9f, 0x526: 0x9f, 0x527: 0x9f,\n\t0x528: 0x142, 0x529: 0x14d, 0x52a: 0xba, 0x52b: 0x14e, 0x52c: 0x14f, 0x52d: 0x150, 0x52e: 0x151, 0x52f: 0xba,\n\t0x530: 0xba, 0x531: 0xba, 0x532: 0xba, 0x533: 0xba, 0x534: 0xba, 0x535: 0xba, 0x536: 0xba, 0x537: 0xba,\n\t0x538: 0xba, 0x539: 0xba, 0x53a: 0xba, 0x53b: 0xba, 0x53c: 0x9f, 0x53d: 0x152, 0x53e: 0x153, 0x53f: 0x154,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x9f, 0x541: 0x9f, 0x542: 0x9f, 0x543: 0x9f, 0x544: 0x9f, 0x545: 0x9f, 0x546: 0x9f, 0x547: 0x9f,\n\t0x548: 0x9f, 0x549: 0x9f, 0x54a: 0x9f, 0x54b: 0x9f, 0x54c: 0x9f, 0x54d: 0x9f, 0x54e: 0x9f, 0x54f: 0x9f,\n\t0x550: 0x9f, 0x551: 0x9f, 0x552: 0x9f, 0x553: 0x9f, 0x554: 0x9f, 0x555: 0x9f, 0x556: 0x9f, 0x557: 0x9f,\n\t0x558: 0x9f, 0x559: 0x9f, 0x55a: 0x9f, 0x55b: 0x9f, 0x55c: 0x9f, 0x55d: 0x9f, 0x55e: 0x9f, 0x55f: 0x155,\n\t0x560: 0x9f, 0x561: 0x9f, 0x562: 0x9f, 0x563: 0x9f, 0x564: 0x9f, 0x565: 0x9f, 0x566: 0x9f, 0x567: 0x9f,\n\t0x568: 0x9f, 0x569: 0x9f, 0x56a: 0x9f, 0x56b: 0x156, 0x56c: 0xba, 0x56d: 0xba, 0x56e: 0xba, 0x56f: 0xba,\n\t0x570: 0xba, 0x571: 0xba, 0x572: 0xba, 0x573: 0xba, 0x574: 0xba, 0x575: 0xba, 0x576: 0xba, 0x577: 0xba,\n\t0x578: 0xba, 0x579: 0xba, 0x57a: 0xba, 0x57b: 0xba, 0x57c: 0xba, 0x57d: 0xba, 0x57e: 0xba, 0x57f: 0xba,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x9f, 0x581: 0x9f, 0x582: 0x9f, 0x583: 0x9f, 0x584: 0x157, 0x585: 0x158, 0x586: 0x9f, 0x587: 0x9f,\n\t0x588: 0x9f, 0x589: 0x9f, 0x58a: 0x9f, 0x58b: 0x159, 0x58c: 0xba, 0x58d: 0xba, 0x58e: 0xba, 0x58f: 0xba,\n\t0x590: 0xba, 0x591: 0xba, 0x592: 0xba, 0x593: 0xba, 0x594: 0xba, 0x595: 0xba, 0x596: 0xba, 0x597: 0xba,\n\t0x598: 0xba, 0x599: 0xba, 0x59a: 0xba, 0x59b: 0xba, 0x59c: 0xba, 0x59d: 0xba, 0x59e: 0xba, 0x59f: 0xba,\n\t0x5a0: 0xba, 0x5a1: 0xba, 0x5a2: 0xba, 0x5a3: 0xba, 0x5a4: 0xba, 0x5a5: 0xba, 0x5a6: 0xba, 0x5a7: 0xba,\n\t0x5a8: 0xba, 0x5a9: 0xba, 0x5aa: 0xba, 0x5ab: 0xba, 0x5ac: 0xba, 0x5ad: 0xba, 0x5ae: 0xba, 0x5af: 0xba,\n\t0x5b0: 0x9f, 0x5b1: 0x15a, 0x5b2: 0x15b, 0x5b3: 0xba, 0x5b4: 0xba, 0x5b5: 0xba, 0x5b6: 0xba, 0x5b7: 0xba,\n\t0x5b8: 0xba, 0x5b9: 0xba, 0x5ba: 0xba, 0x5bb: 0xba, 0x5bc: 0xba, 0x5bd: 0xba, 0x5be: 0xba, 0x5bf: 0xba,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x9b, 0x5c1: 0x9b, 0x5c2: 0x9b, 0x5c3: 0x15c, 0x5c4: 0x15d, 0x5c5: 0x15e, 0x5c6: 0x15f, 0x5c7: 0x160,\n\t0x5c8: 0x9b, 0x5c9: 0x161, 0x5ca: 0xba, 0x5cb: 0xba, 0x5cc: 0x9b, 0x5cd: 0x162, 0x5ce: 0xba, 0x5cf: 0xba,\n\t0x5d0: 0x5f, 0x5d1: 0x60, 0x5d2: 0x61, 0x5d3: 0x62, 0x5d4: 0x63, 0x5d5: 0x64, 0x5d6: 0x65, 0x5d7: 0x66,\n\t0x5d8: 0x67, 0x5d9: 0x68, 0x5da: 0x69, 0x5db: 0x6a, 0x5dc: 0x6b, 0x5dd: 0x6c, 0x5de: 0x6d, 0x5df: 0x6e,\n\t0x5e0: 0x9b, 0x5e1: 0x9b, 0x5e2: 0x9b, 0x5e3: 0x9b, 0x5e4: 0x9b, 0x5e5: 0x9b, 0x5e6: 0x9b, 0x5e7: 0x9b,\n\t0x5e8: 0x163, 0x5e9: 0x164, 0x5ea: 0x165, 0x5eb: 0xba, 0x5ec: 0xba, 0x5ed: 0xba, 0x5ee: 0xba, 0x5ef: 0xba,\n\t0x5f0: 0xba, 0x5f1: 0xba, 0x5f2: 0xba, 0x5f3: 0xba, 0x5f4: 0xba, 0x5f5: 0xba, 0x5f6: 0xba, 0x5f7: 0xba,\n\t0x5f8: 0xba, 0x5f9: 0xba, 0x5fa: 0xba, 0x5fb: 0xba, 0x5fc: 0xba, 0x5fd: 0xba, 0x5fe: 0xba, 0x5ff: 0xba,\n\t// Block 0x18, offset 0x600\n\t0x600: 0x166, 0x601: 0xba, 0x602: 0xba, 0x603: 0xba, 0x604: 0xba, 0x605: 0xba, 0x606: 0xba, 0x607: 0xba,\n\t0x608: 0xba, 0x609: 0xba, 0x60a: 0xba, 0x60b: 0xba, 0x60c: 0xba, 0x60d: 0xba, 0x60e: 0xba, 0x60f: 0xba,\n\t0x610: 0xba, 0x611: 0xba, 0x612: 0xba, 0x613: 0xba, 0x614: 0xba, 0x615: 0xba, 0x616: 0xba, 0x617: 0xba,\n\t0x618: 0xba, 0x619: 0xba, 0x61a: 0xba, 0x61b: 0xba, 0x61c: 0xba, 0x61d: 0xba, 0x61e: 0xba, 0x61f: 0xba,\n\t0x620: 0x122, 0x621: 0x122, 0x622: 0x122, 0x623: 0x167, 0x624: 0x6f, 0x625: 0x168, 0x626: 0xba, 0x627: 0xba,\n\t0x628: 0xba, 0x629: 0xba, 0x62a: 0xba, 0x62b: 0xba, 0x62c: 0xba, 0x62d: 0xba, 0x62e: 0xba, 0x62f: 0xba,\n\t0x630: 0xba, 0x631: 0xba, 0x632: 0xba, 0x633: 0xba, 0x634: 0xba, 0x635: 0xba, 0x636: 0xba, 0x637: 0xba,\n\t0x638: 0x70, 0x639: 0x71, 0x63a: 0x72, 0x63b: 0x169, 0x63c: 0xba, 0x63d: 0xba, 0x63e: 0xba, 0x63f: 0xba,\n\t// Block 0x19, offset 0x640\n\t0x640: 0x16a, 0x641: 0x9b, 0x642: 0x16b, 0x643: 0x16c, 0x644: 0x73, 0x645: 0x74, 0x646: 0x16d, 0x647: 0x16e,\n\t0x648: 0x75, 0x649: 0x16f, 0x64a: 0xba, 0x64b: 0xba, 0x64c: 0x9b, 0x64d: 0x9b, 0x64e: 0x9b, 0x64f: 0x9b,\n\t0x650: 0x9b, 0x651: 0x9b, 0x652: 0x9b, 0x653: 0x9b, 0x654: 0x9b, 0x655: 0x9b, 0x656: 0x9b, 0x657: 0x9b,\n\t0x658: 0x9b, 0x659: 0x9b, 0x65a: 0x9b, 0x65b: 0x170, 0x65c: 0x9b, 0x65d: 0x171, 0x65e: 0x9b, 0x65f: 0x172,\n\t0x660: 0x173, 0x661: 0x174, 0x662: 0x175, 0x663: 0xba, 0x664: 0x176, 0x665: 0x177, 0x666: 0x178, 0x667: 0x179,\n\t0x668: 0xba, 0x669: 0xba, 0x66a: 0xba, 0x66b: 0xba, 0x66c: 0xba, 0x66d: 0xba, 0x66e: 0xba, 0x66f: 0xba,\n\t0x670: 0xba, 0x671: 0xba, 0x672: 0xba, 0x673: 0xba, 0x674: 0xba, 0x675: 0xba, 0x676: 0xba, 0x677: 0xba,\n\t0x678: 0xba, 0x679: 0xba, 0x67a: 0xba, 0x67b: 0xba, 0x67c: 0xba, 0x67d: 0xba, 0x67e: 0xba, 0x67f: 0xba,\n\t// Block 0x1a, offset 0x680\n\t0x680: 0x9f, 0x681: 0x9f, 0x682: 0x9f, 0x683: 0x9f, 0x684: 0x9f, 0x685: 0x9f, 0x686: 0x9f, 0x687: 0x9f,\n\t0x688: 0x9f, 0x689: 0x9f, 0x68a: 0x9f, 0x68b: 0x9f, 0x68c: 0x9f, 0x68d: 0x9f, 0x68e: 0x9f, 0x68f: 0x9f,\n\t0x690: 0x9f, 0x691: 0x9f, 0x692: 0x9f, 0x693: 0x9f, 0x694: 0x9f, 0x695: 0x9f, 0x696: 0x9f, 0x697: 0x9f,\n\t0x698: 0x9f, 0x699: 0x9f, 0x69a: 0x9f, 0x69b: 0x17a, 0x69c: 0x9f, 0x69d: 0x9f, 0x69e: 0x9f, 0x69f: 0x9f,\n\t0x6a0: 0x9f, 0x6a1: 0x9f, 0x6a2: 0x9f, 0x6a3: 0x9f, 0x6a4: 0x9f, 0x6a5: 0x9f, 0x6a6: 0x9f, 0x6a7: 0x9f,\n\t0x6a8: 0x9f, 0x6a9: 0x9f, 0x6aa: 0x9f, 0x6ab: 0x9f, 0x6ac: 0x9f, 0x6ad: 0x9f, 0x6ae: 0x9f, 0x6af: 0x9f,\n\t0x6b0: 0x9f, 0x6b1: 0x9f, 0x6b2: 0x9f, 0x6b3: 0x9f, 0x6b4: 0x9f, 0x6b5: 0x9f, 0x6b6: 0x9f, 0x6b7: 0x9f,\n\t0x6b8: 0x9f, 0x6b9: 0x9f, 0x6ba: 0x9f, 0x6bb: 0x9f, 0x6bc: 0x9f, 0x6bd: 0x9f, 0x6be: 0x9f, 0x6bf: 0x9f,\n\t// Block 0x1b, offset 0x6c0\n\t0x6c0: 0x9f, 0x6c1: 0x9f, 0x6c2: 0x9f, 0x6c3: 0x9f, 0x6c4: 0x9f, 0x6c5: 0x9f, 0x6c6: 0x9f, 0x6c7: 0x9f,\n\t0x6c8: 0x9f, 0x6c9: 0x9f, 0x6ca: 0x9f, 0x6cb: 0x9f, 0x6cc: 0x9f, 0x6cd: 0x9f, 0x6ce: 0x9f, 0x6cf: 0x9f,\n\t0x6d0: 0x9f, 0x6d1: 0x9f, 0x6d2: 0x9f, 0x6d3: 0x9f, 0x6d4: 0x9f, 0x6d5: 0x9f, 0x6d6: 0x9f, 0x6d7: 0x9f,\n\t0x6d8: 0x9f, 0x6d9: 0x9f, 0x6da: 0x9f, 0x6db: 0x9f, 0x6dc: 0x17b, 0x6dd: 0x9f, 0x6de: 0x9f, 0x6df: 0x9f,\n\t0x6e0: 0x17c, 0x6e1: 0x9f, 0x6e2: 0x9f, 0x6e3: 0x9f, 0x6e4: 0x9f, 0x6e5: 0x9f, 0x6e6: 0x9f, 0x6e7: 0x9f,\n\t0x6e8: 0x9f, 0x6e9: 0x9f, 0x6ea: 0x9f, 0x6eb: 0x9f, 0x6ec: 0x9f, 0x6ed: 0x9f, 0x6ee: 0x9f, 0x6ef: 0x9f,\n\t0x6f0: 0x9f, 0x6f1: 0x9f, 0x6f2: 0x9f, 0x6f3: 0x9f, 0x6f4: 0x9f, 0x6f5: 0x9f, 0x6f6: 0x9f, 0x6f7: 0x9f,\n\t0x6f8: 0x9f, 0x6f9: 0x9f, 0x6fa: 0x9f, 0x6fb: 0x9f, 0x6fc: 0x9f, 0x6fd: 0x9f, 0x6fe: 0x9f, 0x6ff: 0x9f,\n\t// Block 0x1c, offset 0x700\n\t0x700: 0x9f, 0x701: 0x9f, 0x702: 0x9f, 0x703: 0x9f, 0x704: 0x9f, 0x705: 0x9f, 0x706: 0x9f, 0x707: 0x9f,\n\t0x708: 0x9f, 0x709: 0x9f, 0x70a: 0x9f, 0x70b: 0x9f, 0x70c: 0x9f, 0x70d: 0x9f, 0x70e: 0x9f, 0x70f: 0x9f,\n\t0x710: 0x9f, 0x711: 0x9f, 0x712: 0x9f, 0x713: 0x9f, 0x714: 0x9f, 0x715: 0x9f, 0x716: 0x9f, 0x717: 0x9f,\n\t0x718: 0x9f, 0x719: 0x9f, 0x71a: 0x9f, 0x71b: 0x9f, 0x71c: 0x9f, 0x71d: 0x9f, 0x71e: 0x9f, 0x71f: 0x9f,\n\t0x720: 0x9f, 0x721: 0x9f, 0x722: 0x9f, 0x723: 0x9f, 0x724: 0x9f, 0x725: 0x9f, 0x726: 0x9f, 0x727: 0x9f,\n\t0x728: 0x9f, 0x729: 0x9f, 0x72a: 0x9f, 0x72b: 0x9f, 0x72c: 0x9f, 0x72d: 0x9f, 0x72e: 0x9f, 0x72f: 0x9f,\n\t0x730: 0x9f, 0x731: 0x9f, 0x732: 0x9f, 0x733: 0x9f, 0x734: 0x9f, 0x735: 0x9f, 0x736: 0x9f, 0x737: 0x9f,\n\t0x738: 0x9f, 0x739: 0x9f, 0x73a: 0x17d, 0x73b: 0x9f, 0x73c: 0x9f, 0x73d: 0x9f, 0x73e: 0x9f, 0x73f: 0x9f,\n\t// Block 0x1d, offset 0x740\n\t0x740: 0x9f, 0x741: 0x9f, 0x742: 0x9f, 0x743: 0x9f, 0x744: 0x9f, 0x745: 0x9f, 0x746: 0x9f, 0x747: 0x9f,\n\t0x748: 0x9f, 0x749: 0x9f, 0x74a: 0x9f, 0x74b: 0x9f, 0x74c: 0x9f, 0x74d: 0x9f, 0x74e: 0x9f, 0x74f: 0x9f,\n\t0x750: 0x9f, 0x751: 0x9f, 0x752: 0x9f, 0x753: 0x9f, 0x754: 0x9f, 0x755: 0x9f, 0x756: 0x9f, 0x757: 0x9f,\n\t0x758: 0x9f, 0x759: 0x9f, 0x75a: 0x9f, 0x75b: 0x9f, 0x75c: 0x9f, 0x75d: 0x9f, 0x75e: 0x9f, 0x75f: 0x9f,\n\t0x760: 0x9f, 0x761: 0x9f, 0x762: 0x9f, 0x763: 0x9f, 0x764: 0x9f, 0x765: 0x9f, 0x766: 0x9f, 0x767: 0x9f,\n\t0x768: 0x9f, 0x769: 0x9f, 0x76a: 0x9f, 0x76b: 0x9f, 0x76c: 0x9f, 0x76d: 0x9f, 0x76e: 0x9f, 0x76f: 0x17e,\n\t0x770: 0xba, 0x771: 0xba, 0x772: 0xba, 0x773: 0xba, 0x774: 0xba, 0x775: 0xba, 0x776: 0xba, 0x777: 0xba,\n\t0x778: 0xba, 0x779: 0xba, 0x77a: 0xba, 0x77b: 0xba, 0x77c: 0xba, 0x77d: 0xba, 0x77e: 0xba, 0x77f: 0xba,\n\t// Block 0x1e, offset 0x780\n\t0x780: 0xba, 0x781: 0xba, 0x782: 0xba, 0x783: 0xba, 0x784: 0xba, 0x785: 0xba, 0x786: 0xba, 0x787: 0xba,\n\t0x788: 0xba, 0x789: 0xba, 0x78a: 0xba, 0x78b: 0xba, 0x78c: 0xba, 0x78d: 0xba, 0x78e: 0xba, 0x78f: 0xba,\n\t0x790: 0xba, 0x791: 0xba, 0x792: 0xba, 0x793: 0xba, 0x794: 0xba, 0x795: 0xba, 0x796: 0xba, 0x797: 0xba,\n\t0x798: 0xba, 0x799: 0xba, 0x79a: 0xba, 0x79b: 0xba, 0x79c: 0xba, 0x79d: 0xba, 0x79e: 0xba, 0x79f: 0xba,\n\t0x7a0: 0x76, 0x7a1: 0x77, 0x7a2: 0x78, 0x7a3: 0x17f, 0x7a4: 0x79, 0x7a5: 0x7a, 0x7a6: 0x180, 0x7a7: 0x7b,\n\t0x7a8: 0x7c, 0x7a9: 0xba, 0x7aa: 0xba, 0x7ab: 0xba, 0x7ac: 0xba, 0x7ad: 0xba, 0x7ae: 0xba, 0x7af: 0xba,\n\t0x7b0: 0xba, 0x7b1: 0xba, 0x7b2: 0xba, 0x7b3: 0xba, 0x7b4: 0xba, 0x7b5: 0xba, 0x7b6: 0xba, 0x7b7: 0xba,\n\t0x7b8: 0xba, 0x7b9: 0xba, 0x7ba: 0xba, 0x7bb: 0xba, 0x7bc: 0xba, 0x7bd: 0xba, 0x7be: 0xba, 0x7bf: 0xba,\n\t// Block 0x1f, offset 0x7c0\n\t0x7d0: 0x0d, 0x7d1: 0x0e, 0x7d2: 0x0f, 0x7d3: 0x10, 0x7d4: 0x11, 0x7d5: 0x0b, 0x7d6: 0x12, 0x7d7: 0x07,\n\t0x7d8: 0x13, 0x7d9: 0x0b, 0x7da: 0x0b, 0x7db: 0x14, 0x7dc: 0x0b, 0x7dd: 0x15, 0x7de: 0x16, 0x7df: 0x17,\n\t0x7e0: 0x07, 0x7e1: 0x07, 0x7e2: 0x07, 0x7e3: 0x07, 0x7e4: 0x07, 0x7e5: 0x07, 0x7e6: 0x07, 0x7e7: 0x07,\n\t0x7e8: 0x07, 0x7e9: 0x07, 0x7ea: 0x18, 0x7eb: 0x19, 0x7ec: 0x1a, 0x7ed: 0x07, 0x7ee: 0x1b, 0x7ef: 0x1c,\n\t0x7f0: 0x0b, 0x7f1: 0x0b, 0x7f2: 0x0b, 0x7f3: 0x0b, 0x7f4: 0x0b, 0x7f5: 0x0b, 0x7f6: 0x0b, 0x7f7: 0x0b,\n\t0x7f8: 0x0b, 0x7f9: 0x0b, 0x7fa: 0x0b, 0x7fb: 0x0b, 0x7fc: 0x0b, 0x7fd: 0x0b, 0x7fe: 0x0b, 0x7ff: 0x0b,\n\t// Block 0x20, offset 0x800\n\t0x800: 0x0b, 0x801: 0x0b, 0x802: 0x0b, 0x803: 0x0b, 0x804: 0x0b, 0x805: 0x0b, 0x806: 0x0b, 0x807: 0x0b,\n\t0x808: 0x0b, 0x809: 0x0b, 0x80a: 0x0b, 0x80b: 0x0b, 0x80c: 0x0b, 0x80d: 0x0b, 0x80e: 0x0b, 0x80f: 0x0b,\n\t0x810: 0x0b, 0x811: 0x0b, 0x812: 0x0b, 0x813: 0x0b, 0x814: 0x0b, 0x815: 0x0b, 0x816: 0x0b, 0x817: 0x0b,\n\t0x818: 0x0b, 0x819: 0x0b, 0x81a: 0x0b, 0x81b: 0x0b, 0x81c: 0x0b, 0x81d: 0x0b, 0x81e: 0x0b, 0x81f: 0x0b,\n\t0x820: 0x0b, 0x821: 0x0b, 0x822: 0x0b, 0x823: 0x0b, 0x824: 0x0b, 0x825: 0x0b, 0x826: 0x0b, 0x827: 0x0b,\n\t0x828: 0x0b, 0x829: 0x0b, 0x82a: 0x0b, 0x82b: 0x0b, 0x82c: 0x0b, 0x82d: 0x0b, 0x82e: 0x0b, 0x82f: 0x0b,\n\t0x830: 0x0b, 0x831: 0x0b, 0x832: 0x0b, 0x833: 0x0b, 0x834: 0x0b, 0x835: 0x0b, 0x836: 0x0b, 0x837: 0x0b,\n\t0x838: 0x0b, 0x839: 0x0b, 0x83a: 0x0b, 0x83b: 0x0b, 0x83c: 0x0b, 0x83d: 0x0b, 0x83e: 0x0b, 0x83f: 0x0b,\n\t// Block 0x21, offset 0x840\n\t0x840: 0x181, 0x841: 0x182, 0x842: 0xba, 0x843: 0xba, 0x844: 0x183, 0x845: 0x183, 0x846: 0x183, 0x847: 0x184,\n\t0x848: 0xba, 0x849: 0xba, 0x84a: 0xba, 0x84b: 0xba, 0x84c: 0xba, 0x84d: 0xba, 0x84e: 0xba, 0x84f: 0xba,\n\t0x850: 0xba, 0x851: 0xba, 0x852: 0xba, 0x853: 0xba, 0x854: 0xba, 0x855: 0xba, 0x856: 0xba, 0x857: 0xba,\n\t0x858: 0xba, 0x859: 0xba, 0x85a: 0xba, 0x85b: 0xba, 0x85c: 0xba, 0x85d: 0xba, 0x85e: 0xba, 0x85f: 0xba,\n\t0x860: 0xba, 0x861: 0xba, 0x862: 0xba, 0x863: 0xba, 0x864: 0xba, 0x865: 0xba, 0x866: 0xba, 0x867: 0xba,\n\t0x868: 0xba, 0x869: 0xba, 0x86a: 0xba, 0x86b: 0xba, 0x86c: 0xba, 0x86d: 0xba, 0x86e: 0xba, 0x86f: 0xba,\n\t0x870: 0xba, 0x871: 0xba, 0x872: 0xba, 0x873: 0xba, 0x874: 0xba, 0x875: 0xba, 0x876: 0xba, 0x877: 0xba,\n\t0x878: 0xba, 0x879: 0xba, 0x87a: 0xba, 0x87b: 0xba, 0x87c: 0xba, 0x87d: 0xba, 0x87e: 0xba, 0x87f: 0xba,\n\t// Block 0x22, offset 0x880\n\t0x880: 0x0b, 0x881: 0x0b, 0x882: 0x0b, 0x883: 0x0b, 0x884: 0x0b, 0x885: 0x0b, 0x886: 0x0b, 0x887: 0x0b,\n\t0x888: 0x0b, 0x889: 0x0b, 0x88a: 0x0b, 0x88b: 0x0b, 0x88c: 0x0b, 0x88d: 0x0b, 0x88e: 0x0b, 0x88f: 0x0b,\n\t0x890: 0x0b, 0x891: 0x0b, 0x892: 0x0b, 0x893: 0x0b, 0x894: 0x0b, 0x895: 0x0b, 0x896: 0x0b, 0x897: 0x0b,\n\t0x898: 0x0b, 0x899: 0x0b, 0x89a: 0x0b, 0x89b: 0x0b, 0x89c: 0x0b, 0x89d: 0x0b, 0x89e: 0x0b, 0x89f: 0x0b,\n\t0x8a0: 0x1f, 0x8a1: 0x0b, 0x8a2: 0x0b, 0x8a3: 0x0b, 0x8a4: 0x0b, 0x8a5: 0x0b, 0x8a6: 0x0b, 0x8a7: 0x0b,\n\t0x8a8: 0x0b, 0x8a9: 0x0b, 0x8aa: 0x0b, 0x8ab: 0x0b, 0x8ac: 0x0b, 0x8ad: 0x0b, 0x8ae: 0x0b, 0x8af: 0x0b,\n\t0x8b0: 0x0b, 0x8b1: 0x0b, 0x8b2: 0x0b, 0x8b3: 0x0b, 0x8b4: 0x0b, 0x8b5: 0x0b, 0x8b6: 0x0b, 0x8b7: 0x0b,\n\t0x8b8: 0x0b, 0x8b9: 0x0b, 0x8ba: 0x0b, 0x8bb: 0x0b, 0x8bc: 0x0b, 0x8bd: 0x0b, 0x8be: 0x0b, 0x8bf: 0x0b,\n\t// Block 0x23, offset 0x8c0\n\t0x8c0: 0x0b, 0x8c1: 0x0b, 0x8c2: 0x0b, 0x8c3: 0x0b, 0x8c4: 0x0b, 0x8c5: 0x0b, 0x8c6: 0x0b, 0x8c7: 0x0b,\n\t0x8c8: 0x0b, 0x8c9: 0x0b, 0x8ca: 0x0b, 0x8cb: 0x0b, 0x8cc: 0x0b, 0x8cd: 0x0b, 0x8ce: 0x0b, 0x8cf: 0x0b,\n}\n\n// idnaSparseOffset: 264 entries, 528 bytes\nvar idnaSparseOffset = []uint16{0x0, 0x8, 0x19, 0x25, 0x27, 0x2c, 0x34, 0x3f, 0x4b, 0x4f, 0x5e, 0x63, 0x6b, 0x77, 0x85, 0x8a, 0x93, 0xa3, 0xb1, 0xbd, 0xc9, 0xda, 0xe4, 0xeb, 0xf8, 0x109, 0x110, 0x11b, 0x12a, 0x138, 0x142, 0x144, 0x149, 0x14c, 0x14f, 0x151, 0x15d, 0x168, 0x170, 0x176, 0x17c, 0x181, 0x186, 0x189, 0x18d, 0x193, 0x198, 0x1a4, 0x1ae, 0x1b4, 0x1c5, 0x1cf, 0x1d2, 0x1da, 0x1dd, 0x1ea, 0x1f2, 0x1f6, 0x1fd, 0x205, 0x215, 0x221, 0x223, 0x22d, 0x239, 0x245, 0x251, 0x259, 0x25e, 0x268, 0x279, 0x27d, 0x288, 0x28c, 0x295, 0x29d, 0x2a3, 0x2a8, 0x2ab, 0x2af, 0x2b5, 0x2b9, 0x2bd, 0x2c3, 0x2ca, 0x2d0, 0x2d8, 0x2df, 0x2ea, 0x2f4, 0x2f8, 0x2fb, 0x301, 0x305, 0x307, 0x30a, 0x30c, 0x30f, 0x319, 0x31c, 0x32b, 0x32f, 0x334, 0x337, 0x33b, 0x340, 0x345, 0x34b, 0x351, 0x360, 0x366, 0x36a, 0x379, 0x37e, 0x386, 0x390, 0x39b, 0x3a3, 0x3b4, 0x3bd, 0x3cd, 0x3da, 0x3e4, 0x3e9, 0x3f6, 0x3fa, 0x3ff, 0x401, 0x405, 0x407, 0x40b, 0x414, 0x41a, 0x41e, 0x42e, 0x438, 0x43d, 0x440, 0x446, 0x44d, 0x452, 0x456, 0x45c, 0x461, 0x46a, 0x46f, 0x475, 0x47c, 0x483, 0x48a, 0x48e, 0x493, 0x496, 0x49b, 0x4a7, 0x4ad, 0x4b2, 0x4b9, 0x4c1, 0x4c6, 0x4ca, 0x4da, 0x4e1, 0x4e5, 0x4e9, 0x4f0, 0x4f2, 0x4f5, 0x4f8, 0x4fc, 0x500, 0x506, 0x50f, 0x51b, 0x522, 0x52b, 0x533, 0x53a, 0x548, 0x555, 0x562, 0x56b, 0x56f, 0x57d, 0x585, 0x590, 0x599, 0x59f, 0x5a7, 0x5b0, 0x5ba, 0x5bd, 0x5c9, 0x5cc, 0x5d1, 0x5de, 0x5e7, 0x5f3, 0x5f6, 0x600, 0x609, 0x615, 0x622, 0x62a, 0x62d, 0x632, 0x635, 0x638, 0x63b, 0x642, 0x649, 0x64d, 0x658, 0x65b, 0x661, 0x666, 0x66a, 0x66d, 0x670, 0x673, 0x676, 0x679, 0x67e, 0x688, 0x68b, 0x68f, 0x69e, 0x6aa, 0x6ae, 0x6b3, 0x6b8, 0x6bc, 0x6c1, 0x6ca, 0x6d5, 0x6db, 0x6e3, 0x6e7, 0x6eb, 0x6f1, 0x6f7, 0x6fc, 0x6ff, 0x70f, 0x716, 0x719, 0x71c, 0x720, 0x726, 0x72b, 0x730, 0x735, 0x738, 0x73d, 0x740, 0x743, 0x747, 0x74b, 0x74e, 0x75e, 0x76f, 0x774, 0x776, 0x778}\n\n// idnaSparseValues: 1915 entries, 7660 bytes\nvar idnaSparseValues = [1915]valueRange{\n\t// Block 0x0, offset 0x0\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xe105, lo: 0x80, hi: 0x96},\n\t{value: 0x0018, lo: 0x97, hi: 0x97},\n\t{value: 0xe105, lo: 0x98, hi: 0x9e},\n\t{value: 0x001f, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xb6},\n\t{value: 0x0018, lo: 0xb7, hi: 0xb7},\n\t{value: 0x0008, lo: 0xb8, hi: 0xbf},\n\t// Block 0x1, offset 0x8\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x0008, lo: 0x80, hi: 0x80},\n\t{value: 0xe01d, lo: 0x81, hi: 0x81},\n\t{value: 0x0008, lo: 0x82, hi: 0x82},\n\t{value: 0x0335, lo: 0x83, hi: 0x83},\n\t{value: 0x034d, lo: 0x84, hi: 0x84},\n\t{value: 0x0365, lo: 0x85, hi: 0x85},\n\t{value: 0xe00d, lo: 0x86, hi: 0x86},\n\t{value: 0x0008, lo: 0x87, hi: 0x87},\n\t{value: 0xe00d, lo: 0x88, hi: 0x88},\n\t{value: 0x0008, lo: 0x89, hi: 0x89},\n\t{value: 0xe00d, lo: 0x8a, hi: 0x8a},\n\t{value: 0x0008, lo: 0x8b, hi: 0x8b},\n\t{value: 0xe00d, lo: 0x8c, hi: 0x8c},\n\t{value: 0x0008, lo: 0x8d, hi: 0x8d},\n\t{value: 0xe00d, lo: 0x8e, hi: 0x8e},\n\t{value: 0x0008, lo: 0x8f, hi: 0xbf},\n\t// Block 0x2, offset 0x19\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0xaf},\n\t{value: 0x0249, lo: 0xb0, hi: 0xb0},\n\t{value: 0x037d, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0259, lo: 0xb2, hi: 0xb2},\n\t{value: 0x0269, lo: 0xb3, hi: 0xb3},\n\t{value: 0x034d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x0395, lo: 0xb5, hi: 0xb5},\n\t{value: 0xe1bd, lo: 0xb6, hi: 0xb6},\n\t{value: 0x0279, lo: 0xb7, hi: 0xb7},\n\t{value: 0x0289, lo: 0xb8, hi: 0xb8},\n\t{value: 0x0008, lo: 0xb9, hi: 0xbf},\n\t// Block 0x3, offset 0x25\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x3308, lo: 0x80, hi: 0xbf},\n\t// Block 0x4, offset 0x27\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x03f5, lo: 0x80, hi: 0x8f},\n\t{value: 0xe105, lo: 0x90, hi: 0x9f},\n\t{value: 0x049d, lo: 0xa0, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x5, offset 0x2c\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xe185, lo: 0x80, hi: 0x8f},\n\t{value: 0x0545, lo: 0x90, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x98},\n\t{value: 0x0008, lo: 0x99, hi: 0x99},\n\t{value: 0x0018, lo: 0x9a, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0008, lo: 0xa1, hi: 0xbf},\n\t// Block 0x6, offset 0x34\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x0401, lo: 0x87, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x88},\n\t{value: 0x0018, lo: 0x89, hi: 0x8a},\n\t{value: 0x0040, lo: 0x8b, hi: 0x8c},\n\t{value: 0x0018, lo: 0x8d, hi: 0x8f},\n\t{value: 0x0040, lo: 0x90, hi: 0x90},\n\t{value: 0x3308, lo: 0x91, hi: 0xbd},\n\t{value: 0x0818, lo: 0xbe, hi: 0xbe},\n\t{value: 0x3308, lo: 0xbf, hi: 0xbf},\n\t// Block 0x7, offset 0x3f\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0818, lo: 0x80, hi: 0x80},\n\t{value: 0x3308, lo: 0x81, hi: 0x82},\n\t{value: 0x0818, lo: 0x83, hi: 0x83},\n\t{value: 0x3308, lo: 0x84, hi: 0x85},\n\t{value: 0x0818, lo: 0x86, hi: 0x86},\n\t{value: 0x3308, lo: 0x87, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x0808, lo: 0x90, hi: 0xaa},\n\t{value: 0x0040, lo: 0xab, hi: 0xaf},\n\t{value: 0x0808, lo: 0xb0, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xbf},\n\t// Block 0x8, offset 0x4b\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0a08, lo: 0x80, hi: 0x87},\n\t{value: 0x0c08, lo: 0x88, hi: 0x99},\n\t{value: 0x0a08, lo: 0x9a, hi: 0xbf},\n\t// Block 0x9, offset 0x4f\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x3308, lo: 0x80, hi: 0x8a},\n\t{value: 0x0040, lo: 0x8b, hi: 0x8c},\n\t{value: 0x0c08, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0a08, lo: 0x8e, hi: 0x98},\n\t{value: 0x0c08, lo: 0x99, hi: 0x9b},\n\t{value: 0x0a08, lo: 0x9c, hi: 0xaa},\n\t{value: 0x0c08, lo: 0xab, hi: 0xac},\n\t{value: 0x0a08, lo: 0xad, hi: 0xb0},\n\t{value: 0x0c08, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0a08, lo: 0xb2, hi: 0xb2},\n\t{value: 0x0c08, lo: 0xb3, hi: 0xb4},\n\t{value: 0x0a08, lo: 0xb5, hi: 0xb7},\n\t{value: 0x0c08, lo: 0xb8, hi: 0xb9},\n\t{value: 0x0a08, lo: 0xba, hi: 0xbf},\n\t// Block 0xa, offset 0x5e\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0808, lo: 0x80, hi: 0xa5},\n\t{value: 0x3308, lo: 0xa6, hi: 0xb0},\n\t{value: 0x0808, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0040, lo: 0xb2, hi: 0xbf},\n\t// Block 0xb, offset 0x63\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0808, lo: 0x80, hi: 0x89},\n\t{value: 0x0a08, lo: 0x8a, hi: 0xaa},\n\t{value: 0x3308, lo: 0xab, hi: 0xb3},\n\t{value: 0x0808, lo: 0xb4, hi: 0xb5},\n\t{value: 0x0018, lo: 0xb6, hi: 0xb9},\n\t{value: 0x0818, lo: 0xba, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbf},\n\t// Block 0xc, offset 0x6b\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0808, lo: 0x80, hi: 0x95},\n\t{value: 0x3308, lo: 0x96, hi: 0x99},\n\t{value: 0x0808, lo: 0x9a, hi: 0x9a},\n\t{value: 0x3308, lo: 0x9b, hi: 0xa3},\n\t{value: 0x0808, lo: 0xa4, hi: 0xa4},\n\t{value: 0x3308, lo: 0xa5, hi: 0xa7},\n\t{value: 0x0808, lo: 0xa8, hi: 0xa8},\n\t{value: 0x3308, lo: 0xa9, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xaf},\n\t{value: 0x0818, lo: 0xb0, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0xd, offset 0x77\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x0040, lo: 0x80, hi: 0x9f},\n\t{value: 0x0a08, lo: 0xa0, hi: 0xa9},\n\t{value: 0x0c08, lo: 0xaa, hi: 0xac},\n\t{value: 0x0808, lo: 0xad, hi: 0xad},\n\t{value: 0x0c08, lo: 0xae, hi: 0xae},\n\t{value: 0x0a08, lo: 0xaf, hi: 0xb0},\n\t{value: 0x0c08, lo: 0xb1, hi: 0xb2},\n\t{value: 0x0a08, lo: 0xb3, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xb5},\n\t{value: 0x0a08, lo: 0xb6, hi: 0xb8},\n\t{value: 0x0c08, lo: 0xb9, hi: 0xb9},\n\t{value: 0x0a08, lo: 0xba, hi: 0xbd},\n\t{value: 0x0040, lo: 0xbe, hi: 0xbf},\n\t// Block 0xe, offset 0x85\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0040, lo: 0x80, hi: 0x93},\n\t{value: 0x3308, lo: 0x94, hi: 0xa1},\n\t{value: 0x0840, lo: 0xa2, hi: 0xa2},\n\t{value: 0x3308, lo: 0xa3, hi: 0xbf},\n\t// Block 0xf, offset 0x8a\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x3308, lo: 0x80, hi: 0x82},\n\t{value: 0x3008, lo: 0x83, hi: 0x83},\n\t{value: 0x0008, lo: 0x84, hi: 0xb9},\n\t{value: 0x3308, lo: 0xba, hi: 0xba},\n\t{value: 0x3008, lo: 0xbb, hi: 0xbb},\n\t{value: 0x3308, lo: 0xbc, hi: 0xbc},\n\t{value: 0x0008, lo: 0xbd, hi: 0xbd},\n\t{value: 0x3008, lo: 0xbe, hi: 0xbf},\n\t// Block 0x10, offset 0x93\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0x3308, lo: 0x80, hi: 0x80},\n\t{value: 0x3008, lo: 0x81, hi: 0x82},\n\t{value: 0x0040, lo: 0x83, hi: 0x85},\n\t{value: 0x3008, lo: 0x86, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x89},\n\t{value: 0x3008, lo: 0x8a, hi: 0x8c},\n\t{value: 0x3b08, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x90},\n\t{value: 0x0040, lo: 0x91, hi: 0x96},\n\t{value: 0x3008, lo: 0x97, hi: 0x97},\n\t{value: 0x0040, lo: 0x98, hi: 0xa5},\n\t{value: 0x0008, lo: 0xa6, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbf},\n\t// Block 0x11, offset 0xa3\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x3308, lo: 0x80, hi: 0x80},\n\t{value: 0x3008, lo: 0x81, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0x84},\n\t{value: 0x0008, lo: 0x85, hi: 0x8c},\n\t{value: 0x0040, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0008, lo: 0x8e, hi: 0x90},\n\t{value: 0x0040, lo: 0x91, hi: 0x91},\n\t{value: 0x0008, lo: 0x92, hi: 0xa8},\n\t{value: 0x0040, lo: 0xa9, hi: 0xa9},\n\t{value: 0x0008, lo: 0xaa, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbc},\n\t{value: 0x0008, lo: 0xbd, hi: 0xbd},\n\t{value: 0x3308, lo: 0xbe, hi: 0xbf},\n\t// Block 0x12, offset 0xb1\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x3308, lo: 0x80, hi: 0x81},\n\t{value: 0x3008, lo: 0x82, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0x84},\n\t{value: 0x0008, lo: 0x85, hi: 0x8c},\n\t{value: 0x0040, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0008, lo: 0x8e, hi: 0x90},\n\t{value: 0x0040, lo: 0x91, hi: 0x91},\n\t{value: 0x0008, lo: 0x92, hi: 0xba},\n\t{value: 0x3b08, lo: 0xbb, hi: 0xbc},\n\t{value: 0x0008, lo: 0xbd, hi: 0xbd},\n\t{value: 0x3008, lo: 0xbe, hi: 0xbf},\n\t// Block 0x13, offset 0xbd\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0040, lo: 0x80, hi: 0x81},\n\t{value: 0x3008, lo: 0x82, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0x84},\n\t{value: 0x0008, lo: 0x85, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x99},\n\t{value: 0x0008, lo: 0x9a, hi: 0xb1},\n\t{value: 0x0040, lo: 0xb2, hi: 0xb2},\n\t{value: 0x0008, lo: 0xb3, hi: 0xbb},\n\t{value: 0x0040, lo: 0xbc, hi: 0xbc},\n\t{value: 0x0008, lo: 0xbd, hi: 0xbd},\n\t{value: 0x0040, lo: 0xbe, hi: 0xbf},\n\t// Block 0x14, offset 0xc9\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x89},\n\t{value: 0x3b08, lo: 0x8a, hi: 0x8a},\n\t{value: 0x0040, lo: 0x8b, hi: 0x8e},\n\t{value: 0x3008, lo: 0x8f, hi: 0x91},\n\t{value: 0x3308, lo: 0x92, hi: 0x94},\n\t{value: 0x0040, lo: 0x95, hi: 0x95},\n\t{value: 0x3308, lo: 0x96, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x97},\n\t{value: 0x3008, lo: 0x98, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xa5},\n\t{value: 0x0008, lo: 0xa6, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xb1},\n\t{value: 0x3008, lo: 0xb2, hi: 0xb3},\n\t{value: 0x0018, lo: 0xb4, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xbf},\n\t// Block 0x15, offset 0xda\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0040, lo: 0x80, hi: 0x80},\n\t{value: 0x0008, lo: 0x81, hi: 0xb0},\n\t{value: 0x3308, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0008, lo: 0xb2, hi: 0xb2},\n\t{value: 0x08f1, lo: 0xb3, hi: 0xb3},\n\t{value: 0x3308, lo: 0xb4, hi: 0xb9},\n\t{value: 0x3b08, lo: 0xba, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbe},\n\t{value: 0x0018, lo: 0xbf, hi: 0xbf},\n\t// Block 0x16, offset 0xe4\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x3308, lo: 0x87, hi: 0x8e},\n\t{value: 0x0018, lo: 0x8f, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0018, lo: 0x9a, hi: 0x9b},\n\t{value: 0x0040, lo: 0x9c, hi: 0xbf},\n\t// Block 0x17, offset 0xeb\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0008, lo: 0x80, hi: 0x84},\n\t{value: 0x0040, lo: 0x85, hi: 0x85},\n\t{value: 0x0008, lo: 0x86, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x87},\n\t{value: 0x3308, lo: 0x88, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9b},\n\t{value: 0x0961, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0999, lo: 0x9d, hi: 0x9d},\n\t{value: 0x0008, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xbf},\n\t// Block 0x18, offset 0xf8\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x0008, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0x8a},\n\t{value: 0x0008, lo: 0x8b, hi: 0x8b},\n\t{value: 0xe03d, lo: 0x8c, hi: 0x8c},\n\t{value: 0x0018, lo: 0x8d, hi: 0x97},\n\t{value: 0x3308, lo: 0x98, hi: 0x99},\n\t{value: 0x0018, lo: 0x9a, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa9},\n\t{value: 0x0018, lo: 0xaa, hi: 0xb4},\n\t{value: 0x3308, lo: 0xb5, hi: 0xb5},\n\t{value: 0x0018, lo: 0xb6, hi: 0xb6},\n\t{value: 0x3308, lo: 0xb7, hi: 0xb7},\n\t{value: 0x0018, lo: 0xb8, hi: 0xb8},\n\t{value: 0x3308, lo: 0xb9, hi: 0xb9},\n\t{value: 0x0018, lo: 0xba, hi: 0xbd},\n\t{value: 0x3008, lo: 0xbe, hi: 0xbf},\n\t// Block 0x19, offset 0x109\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0018, lo: 0x80, hi: 0x85},\n\t{value: 0x3308, lo: 0x86, hi: 0x86},\n\t{value: 0x0018, lo: 0x87, hi: 0x8c},\n\t{value: 0x0040, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0018, lo: 0x8e, hi: 0x9a},\n\t{value: 0x0040, lo: 0x9b, hi: 0xbf},\n\t// Block 0x1a, offset 0x110\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x0008, lo: 0x80, hi: 0xaa},\n\t{value: 0x3008, lo: 0xab, hi: 0xac},\n\t{value: 0x3308, lo: 0xad, hi: 0xb0},\n\t{value: 0x3008, lo: 0xb1, hi: 0xb1},\n\t{value: 0x3308, lo: 0xb2, hi: 0xb7},\n\t{value: 0x3008, lo: 0xb8, hi: 0xb8},\n\t{value: 0x3b08, lo: 0xb9, hi: 0xba},\n\t{value: 0x3008, lo: 0xbb, hi: 0xbc},\n\t{value: 0x3308, lo: 0xbd, hi: 0xbe},\n\t{value: 0x0008, lo: 0xbf, hi: 0xbf},\n\t// Block 0x1b, offset 0x11b\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x0008, lo: 0x80, hi: 0x89},\n\t{value: 0x0018, lo: 0x8a, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x95},\n\t{value: 0x3008, lo: 0x96, hi: 0x97},\n\t{value: 0x3308, lo: 0x98, hi: 0x99},\n\t{value: 0x0008, lo: 0x9a, hi: 0x9d},\n\t{value: 0x3308, lo: 0x9e, hi: 0xa0},\n\t{value: 0x0008, lo: 0xa1, hi: 0xa1},\n\t{value: 0x3008, lo: 0xa2, hi: 0xa4},\n\t{value: 0x0008, lo: 0xa5, hi: 0xa6},\n\t{value: 0x3008, lo: 0xa7, hi: 0xad},\n\t{value: 0x0008, lo: 0xae, hi: 0xb0},\n\t{value: 0x3308, lo: 0xb1, hi: 0xb4},\n\t{value: 0x0008, lo: 0xb5, hi: 0xbf},\n\t// Block 0x1c, offset 0x12a\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x0008, lo: 0x80, hi: 0x81},\n\t{value: 0x3308, lo: 0x82, hi: 0x82},\n\t{value: 0x3008, lo: 0x83, hi: 0x84},\n\t{value: 0x3308, lo: 0x85, hi: 0x86},\n\t{value: 0x3008, lo: 0x87, hi: 0x8c},\n\t{value: 0x3308, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0008, lo: 0x8e, hi: 0x8e},\n\t{value: 0x3008, lo: 0x8f, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x3008, lo: 0x9a, hi: 0x9c},\n\t{value: 0x3308, lo: 0x9d, hi: 0x9d},\n\t{value: 0x0018, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xbf},\n\t// Block 0x1d, offset 0x138\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0040, lo: 0x80, hi: 0x86},\n\t{value: 0x055d, lo: 0x87, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8c},\n\t{value: 0x055d, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xba},\n\t{value: 0x0018, lo: 0xbb, hi: 0xbb},\n\t{value: 0xe105, lo: 0xbc, hi: 0xbc},\n\t{value: 0x0008, lo: 0xbd, hi: 0xbf},\n\t// Block 0x1e, offset 0x142\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x0018, lo: 0x80, hi: 0xbf},\n\t// Block 0x1f, offset 0x144\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0xa0},\n\t{value: 0x2018, lo: 0xa1, hi: 0xb5},\n\t{value: 0x0018, lo: 0xb6, hi: 0xbf},\n\t// Block 0x20, offset 0x149\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0xa7},\n\t{value: 0x2018, lo: 0xa8, hi: 0xbf},\n\t// Block 0x21, offset 0x14c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x2018, lo: 0x80, hi: 0x82},\n\t{value: 0x0018, lo: 0x83, hi: 0xbf},\n\t// Block 0x22, offset 0x14f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x0008, lo: 0x80, hi: 0xbf},\n\t// Block 0x23, offset 0x151\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x89},\n\t{value: 0x0008, lo: 0x8a, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x97},\n\t{value: 0x0008, lo: 0x98, hi: 0x98},\n\t{value: 0x0040, lo: 0x99, hi: 0x99},\n\t{value: 0x0008, lo: 0x9a, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xbf},\n\t// Block 0x24, offset 0x15d\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x0008, lo: 0x80, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x89},\n\t{value: 0x0008, lo: 0x8a, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xb0},\n\t{value: 0x0040, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0008, lo: 0xb2, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xb7},\n\t{value: 0x0008, lo: 0xb8, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0x25, offset 0x168\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0x80},\n\t{value: 0x0040, lo: 0x81, hi: 0x81},\n\t{value: 0x0008, lo: 0x82, hi: 0x85},\n\t{value: 0x0040, lo: 0x86, hi: 0x87},\n\t{value: 0x0008, lo: 0x88, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x97},\n\t{value: 0x0008, lo: 0x98, hi: 0xbf},\n\t// Block 0x26, offset 0x170\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0008, lo: 0x80, hi: 0x90},\n\t{value: 0x0040, lo: 0x91, hi: 0x91},\n\t{value: 0x0008, lo: 0x92, hi: 0x95},\n\t{value: 0x0040, lo: 0x96, hi: 0x97},\n\t{value: 0x0008, lo: 0x98, hi: 0xbf},\n\t// Block 0x27, offset 0x176\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0008, lo: 0x80, hi: 0x9a},\n\t{value: 0x0040, lo: 0x9b, hi: 0x9c},\n\t{value: 0x3308, lo: 0x9d, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xbc},\n\t{value: 0x0040, lo: 0xbd, hi: 0xbf},\n\t// Block 0x28, offset 0x17c\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xbf},\n\t// Block 0x29, offset 0x181\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xb7},\n\t{value: 0xe045, lo: 0xb8, hi: 0xbd},\n\t{value: 0x0040, lo: 0xbe, hi: 0xbf},\n\t// Block 0x2a, offset 0x186\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0x80},\n\t{value: 0x0008, lo: 0x81, hi: 0xbf},\n\t// Block 0x2b, offset 0x189\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0xac},\n\t{value: 0x0018, lo: 0xad, hi: 0xae},\n\t{value: 0x0008, lo: 0xaf, hi: 0xbf},\n\t// Block 0x2c, offset 0x18d\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0040, lo: 0x80, hi: 0x80},\n\t{value: 0x0008, lo: 0x81, hi: 0x9a},\n\t{value: 0x0018, lo: 0x9b, hi: 0x9c},\n\t{value: 0x0040, lo: 0x9d, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xbf},\n\t// Block 0x2d, offset 0x193\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0xaa},\n\t{value: 0x0018, lo: 0xab, hi: 0xb0},\n\t{value: 0x0008, lo: 0xb1, hi: 0xb8},\n\t{value: 0x0040, lo: 0xb9, hi: 0xbf},\n\t// Block 0x2e, offset 0x198\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0x8c},\n\t{value: 0x0040, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0008, lo: 0x8e, hi: 0x91},\n\t{value: 0x3308, lo: 0x92, hi: 0x93},\n\t{value: 0x3b08, lo: 0x94, hi: 0x94},\n\t{value: 0x0040, lo: 0x95, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xb1},\n\t{value: 0x3308, lo: 0xb2, hi: 0xb3},\n\t{value: 0x3b08, lo: 0xb4, hi: 0xb4},\n\t{value: 0x0018, lo: 0xb5, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xbf},\n\t// Block 0x2f, offset 0x1a4\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0x91},\n\t{value: 0x3308, lo: 0x92, hi: 0x93},\n\t{value: 0x0040, lo: 0x94, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xac},\n\t{value: 0x0040, lo: 0xad, hi: 0xad},\n\t{value: 0x0008, lo: 0xae, hi: 0xb0},\n\t{value: 0x0040, lo: 0xb1, hi: 0xb1},\n\t{value: 0x3308, lo: 0xb2, hi: 0xb3},\n\t{value: 0x0040, lo: 0xb4, hi: 0xbf},\n\t// Block 0x30, offset 0x1ae\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0008, lo: 0x80, hi: 0xb3},\n\t{value: 0x3340, lo: 0xb4, hi: 0xb5},\n\t{value: 0x3008, lo: 0xb6, hi: 0xb6},\n\t{value: 0x3308, lo: 0xb7, hi: 0xbd},\n\t{value: 0x3008, lo: 0xbe, hi: 0xbf},\n\t// Block 0x31, offset 0x1b4\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x3008, lo: 0x80, hi: 0x85},\n\t{value: 0x3308, lo: 0x86, hi: 0x86},\n\t{value: 0x3008, lo: 0x87, hi: 0x88},\n\t{value: 0x3308, lo: 0x89, hi: 0x91},\n\t{value: 0x3b08, lo: 0x92, hi: 0x92},\n\t{value: 0x3308, lo: 0x93, hi: 0x93},\n\t{value: 0x0018, lo: 0x94, hi: 0x96},\n\t{value: 0x0008, lo: 0x97, hi: 0x97},\n\t{value: 0x0018, lo: 0x98, hi: 0x9b},\n\t{value: 0x0008, lo: 0x9c, hi: 0x9c},\n\t{value: 0x3308, lo: 0x9d, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa9},\n\t{value: 0x0040, lo: 0xaa, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbf},\n\t// Block 0x32, offset 0x1c5\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0018, lo: 0x80, hi: 0x85},\n\t{value: 0x0040, lo: 0x86, hi: 0x86},\n\t{value: 0x0218, lo: 0x87, hi: 0x87},\n\t{value: 0x0018, lo: 0x88, hi: 0x8a},\n\t{value: 0x33c0, lo: 0x8b, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9f},\n\t{value: 0x0208, lo: 0xa0, hi: 0xbf},\n\t// Block 0x33, offset 0x1cf\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0208, lo: 0x80, hi: 0xb7},\n\t{value: 0x0040, lo: 0xb8, hi: 0xbf},\n\t// Block 0x34, offset 0x1d2\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0x84},\n\t{value: 0x3308, lo: 0x85, hi: 0x86},\n\t{value: 0x0208, lo: 0x87, hi: 0xa8},\n\t{value: 0x3308, lo: 0xa9, hi: 0xa9},\n\t{value: 0x0208, lo: 0xaa, hi: 0xaa},\n\t{value: 0x0040, lo: 0xab, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x35, offset 0x1da\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xbf},\n\t// Block 0x36, offset 0x1dd\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0008, lo: 0x80, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0x9f},\n\t{value: 0x3308, lo: 0xa0, hi: 0xa2},\n\t{value: 0x3008, lo: 0xa3, hi: 0xa6},\n\t{value: 0x3308, lo: 0xa7, hi: 0xa8},\n\t{value: 0x3008, lo: 0xa9, hi: 0xab},\n\t{value: 0x0040, lo: 0xac, hi: 0xaf},\n\t{value: 0x3008, lo: 0xb0, hi: 0xb1},\n\t{value: 0x3308, lo: 0xb2, hi: 0xb2},\n\t{value: 0x3008, lo: 0xb3, hi: 0xb8},\n\t{value: 0x3308, lo: 0xb9, hi: 0xbb},\n\t{value: 0x0040, lo: 0xbc, hi: 0xbf},\n\t// Block 0x37, offset 0x1ea\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0018, lo: 0x80, hi: 0x80},\n\t{value: 0x0040, lo: 0x81, hi: 0x83},\n\t{value: 0x0018, lo: 0x84, hi: 0x85},\n\t{value: 0x0008, lo: 0x86, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xbf},\n\t// Block 0x38, offset 0x1f2\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0xab},\n\t{value: 0x0040, lo: 0xac, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x39, offset 0x1f6\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0008, lo: 0x80, hi: 0x89},\n\t{value: 0x0040, lo: 0x8a, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0028, lo: 0x9a, hi: 0x9a},\n\t{value: 0x0040, lo: 0x9b, hi: 0x9d},\n\t{value: 0x0018, lo: 0x9e, hi: 0xbf},\n\t// Block 0x3a, offset 0x1fd\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0x96},\n\t{value: 0x3308, lo: 0x97, hi: 0x98},\n\t{value: 0x3008, lo: 0x99, hi: 0x9a},\n\t{value: 0x3308, lo: 0x9b, hi: 0x9b},\n\t{value: 0x0040, lo: 0x9c, hi: 0x9d},\n\t{value: 0x0018, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xbf},\n\t// Block 0x3b, offset 0x205\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0x0008, lo: 0x80, hi: 0x94},\n\t{value: 0x3008, lo: 0x95, hi: 0x95},\n\t{value: 0x3308, lo: 0x96, hi: 0x96},\n\t{value: 0x3008, lo: 0x97, hi: 0x97},\n\t{value: 0x3308, lo: 0x98, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0x9f},\n\t{value: 0x3b08, lo: 0xa0, hi: 0xa0},\n\t{value: 0x3008, lo: 0xa1, hi: 0xa1},\n\t{value: 0x3308, lo: 0xa2, hi: 0xa2},\n\t{value: 0x3008, lo: 0xa3, hi: 0xa4},\n\t{value: 0x3308, lo: 0xa5, hi: 0xac},\n\t{value: 0x3008, lo: 0xad, hi: 0xb2},\n\t{value: 0x3308, lo: 0xb3, hi: 0xbc},\n\t{value: 0x0040, lo: 0xbd, hi: 0xbe},\n\t{value: 0x3308, lo: 0xbf, hi: 0xbf},\n\t// Block 0x3c, offset 0x215\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0x89},\n\t{value: 0x0040, lo: 0x8a, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xa6},\n\t{value: 0x0008, lo: 0xa7, hi: 0xa7},\n\t{value: 0x0018, lo: 0xa8, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xaf},\n\t{value: 0x3308, lo: 0xb0, hi: 0xbd},\n\t{value: 0x3318, lo: 0xbe, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0x3d, offset 0x221\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x0040, lo: 0x80, hi: 0xbf},\n\t// Block 0x3e, offset 0x223\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x3308, lo: 0x80, hi: 0x83},\n\t{value: 0x3008, lo: 0x84, hi: 0x84},\n\t{value: 0x0008, lo: 0x85, hi: 0xb3},\n\t{value: 0x3308, lo: 0xb4, hi: 0xb4},\n\t{value: 0x3008, lo: 0xb5, hi: 0xb5},\n\t{value: 0x3308, lo: 0xb6, hi: 0xba},\n\t{value: 0x3008, lo: 0xbb, hi: 0xbb},\n\t{value: 0x3308, lo: 0xbc, hi: 0xbc},\n\t{value: 0x3008, lo: 0xbd, hi: 0xbf},\n\t// Block 0x3f, offset 0x22d\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x3008, lo: 0x80, hi: 0x81},\n\t{value: 0x3308, lo: 0x82, hi: 0x82},\n\t{value: 0x3008, lo: 0x83, hi: 0x83},\n\t{value: 0x3808, lo: 0x84, hi: 0x84},\n\t{value: 0x0008, lo: 0x85, hi: 0x8b},\n\t{value: 0x0040, lo: 0x8c, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0018, lo: 0x9a, hi: 0xaa},\n\t{value: 0x3308, lo: 0xab, hi: 0xb3},\n\t{value: 0x0018, lo: 0xb4, hi: 0xbc},\n\t{value: 0x0040, lo: 0xbd, hi: 0xbf},\n\t// Block 0x40, offset 0x239\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x3308, lo: 0x80, hi: 0x81},\n\t{value: 0x3008, lo: 0x82, hi: 0x82},\n\t{value: 0x0008, lo: 0x83, hi: 0xa0},\n\t{value: 0x3008, lo: 0xa1, hi: 0xa1},\n\t{value: 0x3308, lo: 0xa2, hi: 0xa5},\n\t{value: 0x3008, lo: 0xa6, hi: 0xa7},\n\t{value: 0x3308, lo: 0xa8, hi: 0xa9},\n\t{value: 0x3808, lo: 0xaa, hi: 0xaa},\n\t{value: 0x3b08, lo: 0xab, hi: 0xab},\n\t{value: 0x3308, lo: 0xac, hi: 0xad},\n\t{value: 0x0008, lo: 0xae, hi: 0xbf},\n\t// Block 0x41, offset 0x245\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0xa5},\n\t{value: 0x3308, lo: 0xa6, hi: 0xa6},\n\t{value: 0x3008, lo: 0xa7, hi: 0xa7},\n\t{value: 0x3308, lo: 0xa8, hi: 0xa9},\n\t{value: 0x3008, lo: 0xaa, hi: 0xac},\n\t{value: 0x3308, lo: 0xad, hi: 0xad},\n\t{value: 0x3008, lo: 0xae, hi: 0xae},\n\t{value: 0x3308, lo: 0xaf, hi: 0xb1},\n\t{value: 0x3808, lo: 0xb2, hi: 0xb3},\n\t{value: 0x0040, lo: 0xb4, hi: 0xbb},\n\t{value: 0x0018, lo: 0xbc, hi: 0xbf},\n\t// Block 0x42, offset 0x251\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0xa3},\n\t{value: 0x3008, lo: 0xa4, hi: 0xab},\n\t{value: 0x3308, lo: 0xac, hi: 0xb3},\n\t{value: 0x3008, lo: 0xb4, hi: 0xb5},\n\t{value: 0x3308, lo: 0xb6, hi: 0xb7},\n\t{value: 0x0040, lo: 0xb8, hi: 0xba},\n\t{value: 0x0018, lo: 0xbb, hi: 0xbf},\n\t// Block 0x43, offset 0x259\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0x89},\n\t{value: 0x0040, lo: 0x8a, hi: 0x8c},\n\t{value: 0x0008, lo: 0x8d, hi: 0xbd},\n\t{value: 0x0018, lo: 0xbe, hi: 0xbf},\n\t// Block 0x44, offset 0x25e\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0e29, lo: 0x80, hi: 0x80},\n\t{value: 0x0e41, lo: 0x81, hi: 0x81},\n\t{value: 0x0e59, lo: 0x82, hi: 0x82},\n\t{value: 0x0e71, lo: 0x83, hi: 0x83},\n\t{value: 0x0e89, lo: 0x84, hi: 0x85},\n\t{value: 0x0ea1, lo: 0x86, hi: 0x86},\n\t{value: 0x0eb9, lo: 0x87, hi: 0x87},\n\t{value: 0x057d, lo: 0x88, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0xbf},\n\t// Block 0x45, offset 0x268\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x0018, lo: 0x80, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x3308, lo: 0x90, hi: 0x92},\n\t{value: 0x0018, lo: 0x93, hi: 0x93},\n\t{value: 0x3308, lo: 0x94, hi: 0xa0},\n\t{value: 0x3008, lo: 0xa1, hi: 0xa1},\n\t{value: 0x3308, lo: 0xa2, hi: 0xa8},\n\t{value: 0x0008, lo: 0xa9, hi: 0xac},\n\t{value: 0x3308, lo: 0xad, hi: 0xad},\n\t{value: 0x0008, lo: 0xae, hi: 0xb1},\n\t{value: 0x3008, lo: 0xb2, hi: 0xb3},\n\t{value: 0x3308, lo: 0xb4, hi: 0xb4},\n\t{value: 0x0008, lo: 0xb5, hi: 0xb6},\n\t{value: 0x3008, lo: 0xb7, hi: 0xb7},\n\t{value: 0x3308, lo: 0xb8, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbf},\n\t// Block 0x46, offset 0x279\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x3308, lo: 0x80, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xba},\n\t{value: 0x3308, lo: 0xbb, hi: 0xbf},\n\t// Block 0x47, offset 0x27d\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x0008, lo: 0x80, hi: 0x87},\n\t{value: 0xe045, lo: 0x88, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x95},\n\t{value: 0x0040, lo: 0x96, hi: 0x97},\n\t{value: 0xe045, lo: 0x98, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa7},\n\t{value: 0xe045, lo: 0xa8, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xb7},\n\t{value: 0xe045, lo: 0xb8, hi: 0xbf},\n\t// Block 0x48, offset 0x288\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0040, lo: 0x80, hi: 0x8f},\n\t{value: 0x3318, lo: 0x90, hi: 0xb0},\n\t{value: 0x0040, lo: 0xb1, hi: 0xbf},\n\t// Block 0x49, offset 0x28c\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0018, lo: 0x80, hi: 0x82},\n\t{value: 0x0040, lo: 0x83, hi: 0x83},\n\t{value: 0x0008, lo: 0x84, hi: 0x84},\n\t{value: 0x0018, lo: 0x85, hi: 0x88},\n\t{value: 0x24c1, lo: 0x89, hi: 0x89},\n\t{value: 0x0018, lo: 0x8a, hi: 0x8b},\n\t{value: 0x0040, lo: 0x8c, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xbf},\n\t// Block 0x4a, offset 0x295\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0018, lo: 0x80, hi: 0xab},\n\t{value: 0x24f1, lo: 0xac, hi: 0xac},\n\t{value: 0x2529, lo: 0xad, hi: 0xad},\n\t{value: 0x0018, lo: 0xae, hi: 0xae},\n\t{value: 0x2579, lo: 0xaf, hi: 0xaf},\n\t{value: 0x25b1, lo: 0xb0, hi: 0xb0},\n\t{value: 0x0018, lo: 0xb1, hi: 0xbf},\n\t// Block 0x4b, offset 0x29d\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0018, lo: 0x80, hi: 0x9f},\n\t{value: 0x0080, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0018, lo: 0xa1, hi: 0xad},\n\t{value: 0x0080, lo: 0xae, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xbf},\n\t// Block 0x4c, offset 0x2a3\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0xa8},\n\t{value: 0x09c5, lo: 0xa9, hi: 0xa9},\n\t{value: 0x09e5, lo: 0xaa, hi: 0xaa},\n\t{value: 0x0018, lo: 0xab, hi: 0xbf},\n\t// Block 0x4d, offset 0x2a8\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0xa6},\n\t{value: 0x0040, lo: 0xa7, hi: 0xbf},\n\t// Block 0x4e, offset 0x2ab\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0x8b},\n\t{value: 0x28c1, lo: 0x8c, hi: 0x8c},\n\t{value: 0x0018, lo: 0x8d, hi: 0xbf},\n\t// Block 0x4f, offset 0x2af\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0018, lo: 0x80, hi: 0xb3},\n\t{value: 0x0e66, lo: 0xb4, hi: 0xb4},\n\t{value: 0x292a, lo: 0xb5, hi: 0xb5},\n\t{value: 0x0e86, lo: 0xb6, hi: 0xb6},\n\t{value: 0x0018, lo: 0xb7, hi: 0xbf},\n\t// Block 0x50, offset 0x2b5\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0x9b},\n\t{value: 0x2941, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0018, lo: 0x9d, hi: 0xbf},\n\t// Block 0x51, offset 0x2b9\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0xb3},\n\t{value: 0x0040, lo: 0xb4, hi: 0xb5},\n\t{value: 0x0018, lo: 0xb6, hi: 0xbf},\n\t// Block 0x52, offset 0x2bd\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0018, lo: 0x80, hi: 0x95},\n\t{value: 0x0040, lo: 0x96, hi: 0x97},\n\t{value: 0x0018, lo: 0x98, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbc},\n\t{value: 0x0018, lo: 0xbd, hi: 0xbf},\n\t// Block 0x53, offset 0x2c3\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0018, lo: 0x80, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x89},\n\t{value: 0x0018, lo: 0x8a, hi: 0x92},\n\t{value: 0x0040, lo: 0x93, hi: 0xab},\n\t{value: 0x0018, lo: 0xac, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xbf},\n\t// Block 0x54, offset 0x2ca\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xe185, lo: 0x80, hi: 0x8f},\n\t{value: 0x03f5, lo: 0x90, hi: 0x9f},\n\t{value: 0x0ea5, lo: 0xa0, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x55, offset 0x2d0\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0xa5},\n\t{value: 0x0040, lo: 0xa6, hi: 0xa6},\n\t{value: 0x0008, lo: 0xa7, hi: 0xa7},\n\t{value: 0x0040, lo: 0xa8, hi: 0xac},\n\t{value: 0x0008, lo: 0xad, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x56, offset 0x2d8\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0008, lo: 0x80, hi: 0xa7},\n\t{value: 0x0040, lo: 0xa8, hi: 0xae},\n\t{value: 0xe075, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb0},\n\t{value: 0x0040, lo: 0xb1, hi: 0xbe},\n\t{value: 0x3b08, lo: 0xbf, hi: 0xbf},\n\t// Block 0x57, offset 0x2df\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x0008, lo: 0x80, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa6},\n\t{value: 0x0040, lo: 0xa7, hi: 0xa7},\n\t{value: 0x0008, lo: 0xa8, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xb7},\n\t{value: 0x0008, lo: 0xb8, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0x58, offset 0x2ea\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x87},\n\t{value: 0x0008, lo: 0x88, hi: 0x8e},\n\t{value: 0x0040, lo: 0x8f, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x97},\n\t{value: 0x0008, lo: 0x98, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0x9f},\n\t{value: 0x3308, lo: 0xa0, hi: 0xbf},\n\t// Block 0x59, offset 0x2f4\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0xae},\n\t{value: 0x0008, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xbf},\n\t// Block 0x5a, offset 0x2f8\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0x89},\n\t{value: 0x0040, lo: 0x8a, hi: 0xbf},\n\t// Block 0x5b, offset 0x2fb\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0018, lo: 0x80, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9a},\n\t{value: 0x0018, lo: 0x9b, hi: 0x9e},\n\t{value: 0x0edd, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xbf},\n\t// Block 0x5c, offset 0x301\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0xb2},\n\t{value: 0x0efd, lo: 0xb3, hi: 0xb3},\n\t{value: 0x0040, lo: 0xb4, hi: 0xbf},\n\t// Block 0x5d, offset 0x305\n\t{value: 0x0020, lo: 0x01},\n\t{value: 0x0f1d, lo: 0x80, hi: 0xbf},\n\t// Block 0x5e, offset 0x307\n\t{value: 0x0020, lo: 0x02},\n\t{value: 0x171d, lo: 0x80, hi: 0x8f},\n\t{value: 0x18fd, lo: 0x90, hi: 0xbf},\n\t// Block 0x5f, offset 0x30a\n\t{value: 0x0020, lo: 0x01},\n\t{value: 0x1efd, lo: 0x80, hi: 0xbf},\n\t// Block 0x60, offset 0x30c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0040, lo: 0x80, hi: 0x80},\n\t{value: 0x0008, lo: 0x81, hi: 0xbf},\n\t// Block 0x61, offset 0x30f\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x98},\n\t{value: 0x3308, lo: 0x99, hi: 0x9a},\n\t{value: 0x29e2, lo: 0x9b, hi: 0x9b},\n\t{value: 0x2a0a, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0008, lo: 0x9d, hi: 0x9e},\n\t{value: 0x2a31, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0008, lo: 0xa1, hi: 0xbf},\n\t// Block 0x62, offset 0x319\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xbe},\n\t{value: 0x2a69, lo: 0xbf, hi: 0xbf},\n\t// Block 0x63, offset 0x31c\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x0040, lo: 0x80, hi: 0x84},\n\t{value: 0x0008, lo: 0x85, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xb0},\n\t{value: 0x2a1d, lo: 0xb1, hi: 0xb1},\n\t{value: 0x2a3d, lo: 0xb2, hi: 0xb2},\n\t{value: 0x2a5d, lo: 0xb3, hi: 0xb3},\n\t{value: 0x2a7d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x2a5d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x2a9d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x2abd, lo: 0xb7, hi: 0xb7},\n\t{value: 0x2add, lo: 0xb8, hi: 0xb9},\n\t{value: 0x2afd, lo: 0xba, hi: 0xbb},\n\t{value: 0x2b1d, lo: 0xbc, hi: 0xbd},\n\t{value: 0x2afd, lo: 0xbe, hi: 0xbf},\n\t// Block 0x64, offset 0x32b\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0xa3},\n\t{value: 0x0040, lo: 0xa4, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x65, offset 0x32f\n\t{value: 0x0030, lo: 0x04},\n\t{value: 0x2aa2, lo: 0x80, hi: 0x9d},\n\t{value: 0x305a, lo: 0x9e, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0x9f},\n\t{value: 0x30a2, lo: 0xa0, hi: 0xbf},\n\t// Block 0x66, offset 0x334\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xaa},\n\t{value: 0x0040, lo: 0xab, hi: 0xbf},\n\t// Block 0x67, offset 0x337\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0x8c},\n\t{value: 0x0040, lo: 0x8d, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xbf},\n\t// Block 0x68, offset 0x33b\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xbd},\n\t{value: 0x0018, lo: 0xbe, hi: 0xbf},\n\t// Block 0x69, offset 0x340\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0x8c},\n\t{value: 0x0018, lo: 0x8d, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xab},\n\t{value: 0x0040, lo: 0xac, hi: 0xbf},\n\t// Block 0x6a, offset 0x345\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0008, lo: 0x80, hi: 0xa5},\n\t{value: 0x0018, lo: 0xa6, hi: 0xaf},\n\t{value: 0x3308, lo: 0xb0, hi: 0xb1},\n\t{value: 0x0018, lo: 0xb2, hi: 0xb7},\n\t{value: 0x0040, lo: 0xb8, hi: 0xbf},\n\t// Block 0x6b, offset 0x34b\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0040, lo: 0x80, hi: 0xb6},\n\t{value: 0x0008, lo: 0xb7, hi: 0xb7},\n\t{value: 0x2009, lo: 0xb8, hi: 0xb8},\n\t{value: 0x6e89, lo: 0xb9, hi: 0xb9},\n\t{value: 0x0008, lo: 0xba, hi: 0xbf},\n\t// Block 0x6c, offset 0x351\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x0008, lo: 0x80, hi: 0x81},\n\t{value: 0x3308, lo: 0x82, hi: 0x82},\n\t{value: 0x0008, lo: 0x83, hi: 0x85},\n\t{value: 0x3b08, lo: 0x86, hi: 0x86},\n\t{value: 0x0008, lo: 0x87, hi: 0x8a},\n\t{value: 0x3308, lo: 0x8b, hi: 0x8b},\n\t{value: 0x0008, lo: 0x8c, hi: 0xa2},\n\t{value: 0x3008, lo: 0xa3, hi: 0xa4},\n\t{value: 0x3308, lo: 0xa5, hi: 0xa6},\n\t{value: 0x3008, lo: 0xa7, hi: 0xa7},\n\t{value: 0x0018, lo: 0xa8, hi: 0xab},\n\t{value: 0x0040, lo: 0xac, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbf},\n\t// Block 0x6d, offset 0x360\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0208, lo: 0x80, hi: 0xb1},\n\t{value: 0x0108, lo: 0xb2, hi: 0xb2},\n\t{value: 0x0008, lo: 0xb3, hi: 0xb3},\n\t{value: 0x0018, lo: 0xb4, hi: 0xb7},\n\t{value: 0x0040, lo: 0xb8, hi: 0xbf},\n\t// Block 0x6e, offset 0x366\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x3008, lo: 0x80, hi: 0x81},\n\t{value: 0x0008, lo: 0x82, hi: 0xb3},\n\t{value: 0x3008, lo: 0xb4, hi: 0xbf},\n\t// Block 0x6f, offset 0x36a\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x3008, lo: 0x80, hi: 0x83},\n\t{value: 0x3b08, lo: 0x84, hi: 0x84},\n\t{value: 0x3308, lo: 0x85, hi: 0x85},\n\t{value: 0x0040, lo: 0x86, hi: 0x8d},\n\t{value: 0x0018, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9f},\n\t{value: 0x3308, lo: 0xa0, hi: 0xb1},\n\t{value: 0x0008, lo: 0xb2, hi: 0xb7},\n\t{value: 0x0018, lo: 0xb8, hi: 0xba},\n\t{value: 0x0008, lo: 0xbb, hi: 0xbb},\n\t{value: 0x0018, lo: 0xbc, hi: 0xbc},\n\t{value: 0x0008, lo: 0xbd, hi: 0xbd},\n\t{value: 0x0040, lo: 0xbe, hi: 0xbf},\n\t// Block 0x70, offset 0x379\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0xa5},\n\t{value: 0x3308, lo: 0xa6, hi: 0xad},\n\t{value: 0x0018, lo: 0xae, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x71, offset 0x37e\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x3308, lo: 0x87, hi: 0x91},\n\t{value: 0x3008, lo: 0x92, hi: 0x92},\n\t{value: 0x3808, lo: 0x93, hi: 0x93},\n\t{value: 0x0040, lo: 0x94, hi: 0x9e},\n\t{value: 0x0018, lo: 0x9f, hi: 0xbc},\n\t{value: 0x0040, lo: 0xbd, hi: 0xbf},\n\t// Block 0x72, offset 0x386\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x3308, lo: 0x80, hi: 0x82},\n\t{value: 0x3008, lo: 0x83, hi: 0x83},\n\t{value: 0x0008, lo: 0x84, hi: 0xb2},\n\t{value: 0x3308, lo: 0xb3, hi: 0xb3},\n\t{value: 0x3008, lo: 0xb4, hi: 0xb5},\n\t{value: 0x3308, lo: 0xb6, hi: 0xb9},\n\t{value: 0x3008, lo: 0xba, hi: 0xbb},\n\t{value: 0x3308, lo: 0xbc, hi: 0xbc},\n\t{value: 0x3008, lo: 0xbd, hi: 0xbf},\n\t// Block 0x73, offset 0x390\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x3808, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8e},\n\t{value: 0x0008, lo: 0x8f, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9d},\n\t{value: 0x0018, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa4},\n\t{value: 0x3308, lo: 0xa5, hi: 0xa5},\n\t{value: 0x0008, lo: 0xa6, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0x74, offset 0x39b\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0xa8},\n\t{value: 0x3308, lo: 0xa9, hi: 0xae},\n\t{value: 0x3008, lo: 0xaf, hi: 0xb0},\n\t{value: 0x3308, lo: 0xb1, hi: 0xb2},\n\t{value: 0x3008, lo: 0xb3, hi: 0xb4},\n\t{value: 0x3308, lo: 0xb5, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xbf},\n\t// Block 0x75, offset 0x3a3\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x0008, lo: 0x80, hi: 0x82},\n\t{value: 0x3308, lo: 0x83, hi: 0x83},\n\t{value: 0x0008, lo: 0x84, hi: 0x8b},\n\t{value: 0x3308, lo: 0x8c, hi: 0x8c},\n\t{value: 0x3008, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9b},\n\t{value: 0x0018, lo: 0x9c, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xb6},\n\t{value: 0x0018, lo: 0xb7, hi: 0xb9},\n\t{value: 0x0008, lo: 0xba, hi: 0xba},\n\t{value: 0x3008, lo: 0xbb, hi: 0xbb},\n\t{value: 0x3308, lo: 0xbc, hi: 0xbc},\n\t{value: 0x3008, lo: 0xbd, hi: 0xbd},\n\t{value: 0x0008, lo: 0xbe, hi: 0xbf},\n\t// Block 0x76, offset 0x3b4\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0008, lo: 0x80, hi: 0xaf},\n\t{value: 0x3308, lo: 0xb0, hi: 0xb0},\n\t{value: 0x0008, lo: 0xb1, hi: 0xb1},\n\t{value: 0x3308, lo: 0xb2, hi: 0xb4},\n\t{value: 0x0008, lo: 0xb5, hi: 0xb6},\n\t{value: 0x3308, lo: 0xb7, hi: 0xb8},\n\t{value: 0x0008, lo: 0xb9, hi: 0xbd},\n\t{value: 0x3308, lo: 0xbe, hi: 0xbf},\n\t// Block 0x77, offset 0x3bd\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0x0008, lo: 0x80, hi: 0x80},\n\t{value: 0x3308, lo: 0x81, hi: 0x81},\n\t{value: 0x0008, lo: 0x82, hi: 0x82},\n\t{value: 0x0040, lo: 0x83, hi: 0x9a},\n\t{value: 0x0008, lo: 0x9b, hi: 0x9d},\n\t{value: 0x0018, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xaa},\n\t{value: 0x3008, lo: 0xab, hi: 0xab},\n\t{value: 0x3308, lo: 0xac, hi: 0xad},\n\t{value: 0x3008, lo: 0xae, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb1},\n\t{value: 0x0008, lo: 0xb2, hi: 0xb4},\n\t{value: 0x3008, lo: 0xb5, hi: 0xb5},\n\t{value: 0x3b08, lo: 0xb6, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xbf},\n\t// Block 0x78, offset 0x3cd\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0040, lo: 0x80, hi: 0x80},\n\t{value: 0x0008, lo: 0x81, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x88},\n\t{value: 0x0008, lo: 0x89, hi: 0x8e},\n\t{value: 0x0040, lo: 0x8f, hi: 0x90},\n\t{value: 0x0008, lo: 0x91, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa6},\n\t{value: 0x0040, lo: 0xa7, hi: 0xa7},\n\t{value: 0x0008, lo: 0xa8, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x79, offset 0x3da\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0x9a},\n\t{value: 0x0018, lo: 0x9b, hi: 0x9b},\n\t{value: 0x4465, lo: 0x9c, hi: 0x9c},\n\t{value: 0x447d, lo: 0x9d, hi: 0x9d},\n\t{value: 0x2971, lo: 0x9e, hi: 0x9e},\n\t{value: 0xe06d, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa5},\n\t{value: 0x0040, lo: 0xa6, hi: 0xaf},\n\t{value: 0x4495, lo: 0xb0, hi: 0xbf},\n\t// Block 0x7a, offset 0x3e4\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x44b5, lo: 0x80, hi: 0x8f},\n\t{value: 0x44d5, lo: 0x90, hi: 0x9f},\n\t{value: 0x44f5, lo: 0xa0, hi: 0xaf},\n\t{value: 0x44d5, lo: 0xb0, hi: 0xbf},\n\t// Block 0x7b, offset 0x3e9\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0008, lo: 0x80, hi: 0xa2},\n\t{value: 0x3008, lo: 0xa3, hi: 0xa4},\n\t{value: 0x3308, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3008, lo: 0xa6, hi: 0xa7},\n\t{value: 0x3308, lo: 0xa8, hi: 0xa8},\n\t{value: 0x3008, lo: 0xa9, hi: 0xaa},\n\t{value: 0x0018, lo: 0xab, hi: 0xab},\n\t{value: 0x3008, lo: 0xac, hi: 0xac},\n\t{value: 0x3b08, lo: 0xad, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbf},\n\t// Block 0x7c, offset 0x3f6\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0xa3},\n\t{value: 0x0040, lo: 0xa4, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xbf},\n\t// Block 0x7d, offset 0x3fa\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x8a},\n\t{value: 0x0018, lo: 0x8b, hi: 0xbb},\n\t{value: 0x0040, lo: 0xbc, hi: 0xbf},\n\t// Block 0x7e, offset 0x3ff\n\t{value: 0x0020, lo: 0x01},\n\t{value: 0x4515, lo: 0x80, hi: 0xbf},\n\t// Block 0x7f, offset 0x401\n\t{value: 0x0020, lo: 0x03},\n\t{value: 0x4d15, lo: 0x80, hi: 0x94},\n\t{value: 0x4ad5, lo: 0x95, hi: 0x95},\n\t{value: 0x4fb5, lo: 0x96, hi: 0xbf},\n\t// Block 0x80, offset 0x405\n\t{value: 0x0020, lo: 0x01},\n\t{value: 0x54f5, lo: 0x80, hi: 0xbf},\n\t// Block 0x81, offset 0x407\n\t{value: 0x0020, lo: 0x03},\n\t{value: 0x5cf5, lo: 0x80, hi: 0x84},\n\t{value: 0x5655, lo: 0x85, hi: 0x85},\n\t{value: 0x5d95, lo: 0x86, hi: 0xbf},\n\t// Block 0x82, offset 0x40b\n\t{value: 0x0020, lo: 0x08},\n\t{value: 0x6b55, lo: 0x80, hi: 0x8f},\n\t{value: 0x6d15, lo: 0x90, hi: 0x90},\n\t{value: 0x6d55, lo: 0x91, hi: 0xab},\n\t{value: 0x6ea1, lo: 0xac, hi: 0xac},\n\t{value: 0x70b5, lo: 0xad, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xaf},\n\t{value: 0x70d5, lo: 0xb0, hi: 0xbf},\n\t// Block 0x83, offset 0x414\n\t{value: 0x0020, lo: 0x05},\n\t{value: 0x72d5, lo: 0x80, hi: 0xad},\n\t{value: 0x6535, lo: 0xae, hi: 0xae},\n\t{value: 0x7895, lo: 0xaf, hi: 0xb5},\n\t{value: 0x6f55, lo: 0xb6, hi: 0xb6},\n\t{value: 0x7975, lo: 0xb7, hi: 0xbf},\n\t// Block 0x84, offset 0x41a\n\t{value: 0x0028, lo: 0x03},\n\t{value: 0x7c21, lo: 0x80, hi: 0x82},\n\t{value: 0x7be1, lo: 0x83, hi: 0x83},\n\t{value: 0x7c99, lo: 0x84, hi: 0xbf},\n\t// Block 0x85, offset 0x41e\n\t{value: 0x0038, lo: 0x0f},\n\t{value: 0x9db1, lo: 0x80, hi: 0x83},\n\t{value: 0x9e59, lo: 0x84, hi: 0x85},\n\t{value: 0x9e91, lo: 0x86, hi: 0x87},\n\t{value: 0x9ec9, lo: 0x88, hi: 0x8f},\n\t{value: 0x0040, lo: 0x90, hi: 0x90},\n\t{value: 0x0040, lo: 0x91, hi: 0x91},\n\t{value: 0xa089, lo: 0x92, hi: 0x97},\n\t{value: 0xa1a1, lo: 0x98, hi: 0x9c},\n\t{value: 0xa281, lo: 0x9d, hi: 0xb3},\n\t{value: 0x9d41, lo: 0xb4, hi: 0xb4},\n\t{value: 0x9db1, lo: 0xb5, hi: 0xb5},\n\t{value: 0xa789, lo: 0xb6, hi: 0xbb},\n\t{value: 0xa869, lo: 0xbc, hi: 0xbc},\n\t{value: 0xa7f9, lo: 0xbd, hi: 0xbd},\n\t{value: 0xa8d9, lo: 0xbe, hi: 0xbf},\n\t// Block 0x86, offset 0x42e\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0x8b},\n\t{value: 0x0040, lo: 0x8c, hi: 0x8c},\n\t{value: 0x0008, lo: 0x8d, hi: 0xa6},\n\t{value: 0x0040, lo: 0xa7, hi: 0xa7},\n\t{value: 0x0008, lo: 0xa8, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbb},\n\t{value: 0x0008, lo: 0xbc, hi: 0xbd},\n\t{value: 0x0040, lo: 0xbe, hi: 0xbe},\n\t{value: 0x0008, lo: 0xbf, hi: 0xbf},\n\t// Block 0x87, offset 0x438\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0xbf},\n\t// Block 0x88, offset 0x43d\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbf},\n\t// Block 0x89, offset 0x440\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0018, lo: 0x80, hi: 0x82},\n\t{value: 0x0040, lo: 0x83, hi: 0x86},\n\t{value: 0x0018, lo: 0x87, hi: 0xb3},\n\t{value: 0x0040, lo: 0xb4, hi: 0xb6},\n\t{value: 0x0018, lo: 0xb7, hi: 0xbf},\n\t// Block 0x8a, offset 0x446\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0018, lo: 0x80, hi: 0x8e},\n\t{value: 0x0040, lo: 0x8f, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0x9b},\n\t{value: 0x0040, lo: 0x9c, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0040, lo: 0xa1, hi: 0xbf},\n\t// Block 0x8b, offset 0x44d\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0040, lo: 0x80, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xbc},\n\t{value: 0x3308, lo: 0xbd, hi: 0xbd},\n\t{value: 0x0040, lo: 0xbe, hi: 0xbf},\n\t// Block 0x8c, offset 0x452\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0x9c},\n\t{value: 0x0040, lo: 0x9d, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xbf},\n\t// Block 0x8d, offset 0x456\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0008, lo: 0x80, hi: 0x90},\n\t{value: 0x0040, lo: 0x91, hi: 0x9f},\n\t{value: 0x3308, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0018, lo: 0xa1, hi: 0xbb},\n\t{value: 0x0040, lo: 0xbc, hi: 0xbf},\n\t// Block 0x8e, offset 0x45c\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xa3},\n\t{value: 0x0040, lo: 0xa4, hi: 0xac},\n\t{value: 0x0008, lo: 0xad, hi: 0xbf},\n\t// Block 0x8f, offset 0x461\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0008, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0x81},\n\t{value: 0x0008, lo: 0x82, hi: 0x89},\n\t{value: 0x0018, lo: 0x8a, hi: 0x8a},\n\t{value: 0x0040, lo: 0x8b, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xb5},\n\t{value: 0x3308, lo: 0xb6, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbf},\n\t// Block 0x90, offset 0x46a\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0x9e},\n\t{value: 0x0018, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xbf},\n\t// Block 0x91, offset 0x46f\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0008, lo: 0x80, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0x87},\n\t{value: 0x0008, lo: 0x88, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0x95},\n\t{value: 0x0040, lo: 0x96, hi: 0xbf},\n\t// Block 0x92, offset 0x475\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xe145, lo: 0x80, hi: 0x87},\n\t{value: 0xe1c5, lo: 0x88, hi: 0x8f},\n\t{value: 0xe145, lo: 0x90, hi: 0x97},\n\t{value: 0x8ad5, lo: 0x98, hi: 0x9f},\n\t{value: 0x8aed, lo: 0xa0, hi: 0xa7},\n\t{value: 0x0008, lo: 0xa8, hi: 0xbf},\n\t// Block 0x93, offset 0x47c\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0008, lo: 0x80, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa9},\n\t{value: 0x0040, lo: 0xaa, hi: 0xaf},\n\t{value: 0x8aed, lo: 0xb0, hi: 0xb7},\n\t{value: 0x8ad5, lo: 0xb8, hi: 0xbf},\n\t// Block 0x94, offset 0x483\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xe145, lo: 0x80, hi: 0x87},\n\t{value: 0xe1c5, lo: 0x88, hi: 0x8f},\n\t{value: 0xe145, lo: 0x90, hi: 0x93},\n\t{value: 0x0040, lo: 0x94, hi: 0x97},\n\t{value: 0x0008, lo: 0x98, hi: 0xbb},\n\t{value: 0x0040, lo: 0xbc, hi: 0xbf},\n\t// Block 0x95, offset 0x48a\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0xa7},\n\t{value: 0x0040, lo: 0xa8, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x96, offset 0x48e\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0xa3},\n\t{value: 0x0040, lo: 0xa4, hi: 0xae},\n\t{value: 0x0018, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xbf},\n\t// Block 0x97, offset 0x493\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xbf},\n\t// Block 0x98, offset 0x496\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0x95},\n\t{value: 0x0040, lo: 0x96, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa7},\n\t{value: 0x0040, lo: 0xa8, hi: 0xbf},\n\t// Block 0x99, offset 0x49b\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0808, lo: 0x80, hi: 0x85},\n\t{value: 0x0040, lo: 0x86, hi: 0x87},\n\t{value: 0x0808, lo: 0x88, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x89},\n\t{value: 0x0808, lo: 0x8a, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xb6},\n\t{value: 0x0808, lo: 0xb7, hi: 0xb8},\n\t{value: 0x0040, lo: 0xb9, hi: 0xbb},\n\t{value: 0x0808, lo: 0xbc, hi: 0xbc},\n\t{value: 0x0040, lo: 0xbd, hi: 0xbe},\n\t{value: 0x0808, lo: 0xbf, hi: 0xbf},\n\t// Block 0x9a, offset 0x4a7\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0808, lo: 0x80, hi: 0x95},\n\t{value: 0x0040, lo: 0x96, hi: 0x96},\n\t{value: 0x0818, lo: 0x97, hi: 0x9f},\n\t{value: 0x0808, lo: 0xa0, hi: 0xb6},\n\t{value: 0x0818, lo: 0xb7, hi: 0xbf},\n\t// Block 0x9b, offset 0x4ad\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0808, lo: 0x80, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0xa6},\n\t{value: 0x0818, lo: 0xa7, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xbf},\n\t// Block 0x9c, offset 0x4b2\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0040, lo: 0x80, hi: 0x9f},\n\t{value: 0x0808, lo: 0xa0, hi: 0xb2},\n\t{value: 0x0040, lo: 0xb3, hi: 0xb3},\n\t{value: 0x0808, lo: 0xb4, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xba},\n\t{value: 0x0818, lo: 0xbb, hi: 0xbf},\n\t// Block 0x9d, offset 0x4b9\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0808, lo: 0x80, hi: 0x95},\n\t{value: 0x0818, lo: 0x96, hi: 0x9b},\n\t{value: 0x0040, lo: 0x9c, hi: 0x9e},\n\t{value: 0x0018, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0808, lo: 0xa0, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbe},\n\t{value: 0x0818, lo: 0xbf, hi: 0xbf},\n\t// Block 0x9e, offset 0x4c1\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0808, lo: 0x80, hi: 0xb7},\n\t{value: 0x0040, lo: 0xb8, hi: 0xbb},\n\t{value: 0x0818, lo: 0xbc, hi: 0xbd},\n\t{value: 0x0808, lo: 0xbe, hi: 0xbf},\n\t// Block 0x9f, offset 0x4c6\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0818, lo: 0x80, hi: 0x8f},\n\t{value: 0x0040, lo: 0x90, hi: 0x91},\n\t{value: 0x0818, lo: 0x92, hi: 0xbf},\n\t// Block 0xa0, offset 0x4ca\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0x0808, lo: 0x80, hi: 0x80},\n\t{value: 0x3308, lo: 0x81, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0x84},\n\t{value: 0x3308, lo: 0x85, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x8b},\n\t{value: 0x3308, lo: 0x8c, hi: 0x8f},\n\t{value: 0x0808, lo: 0x90, hi: 0x93},\n\t{value: 0x0040, lo: 0x94, hi: 0x94},\n\t{value: 0x0808, lo: 0x95, hi: 0x97},\n\t{value: 0x0040, lo: 0x98, hi: 0x98},\n\t{value: 0x0808, lo: 0x99, hi: 0xb3},\n\t{value: 0x0040, lo: 0xb4, hi: 0xb7},\n\t{value: 0x3308, lo: 0xb8, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbe},\n\t{value: 0x3b08, lo: 0xbf, hi: 0xbf},\n\t// Block 0xa1, offset 0x4da\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0818, lo: 0x80, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x0818, lo: 0x90, hi: 0x98},\n\t{value: 0x0040, lo: 0x99, hi: 0x9f},\n\t{value: 0x0808, lo: 0xa0, hi: 0xbc},\n\t{value: 0x0818, lo: 0xbd, hi: 0xbf},\n\t// Block 0xa2, offset 0x4e1\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0808, lo: 0x80, hi: 0x9c},\n\t{value: 0x0818, lo: 0x9d, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xbf},\n\t// Block 0xa3, offset 0x4e5\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0808, lo: 0x80, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xb8},\n\t{value: 0x0018, lo: 0xb9, hi: 0xbf},\n\t// Block 0xa4, offset 0x4e9\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0808, lo: 0x80, hi: 0x95},\n\t{value: 0x0040, lo: 0x96, hi: 0x97},\n\t{value: 0x0818, lo: 0x98, hi: 0x9f},\n\t{value: 0x0808, lo: 0xa0, hi: 0xb2},\n\t{value: 0x0040, lo: 0xb3, hi: 0xb7},\n\t{value: 0x0818, lo: 0xb8, hi: 0xbf},\n\t// Block 0xa5, offset 0x4f0\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x0808, lo: 0x80, hi: 0xbf},\n\t// Block 0xa6, offset 0x4f2\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0808, lo: 0x80, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0xbf},\n\t// Block 0xa7, offset 0x4f5\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x03dd, lo: 0x80, hi: 0xb2},\n\t{value: 0x0040, lo: 0xb3, hi: 0xbf},\n\t// Block 0xa8, offset 0x4f8\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0808, lo: 0x80, hi: 0xb2},\n\t{value: 0x0040, lo: 0xb3, hi: 0xb9},\n\t{value: 0x0818, lo: 0xba, hi: 0xbf},\n\t// Block 0xa9, offset 0x4fc\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0040, lo: 0x80, hi: 0x9f},\n\t{value: 0x0818, lo: 0xa0, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0xaa, offset 0x500\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x3008, lo: 0x80, hi: 0x80},\n\t{value: 0x3308, lo: 0x81, hi: 0x81},\n\t{value: 0x3008, lo: 0x82, hi: 0x82},\n\t{value: 0x0008, lo: 0x83, hi: 0xb7},\n\t{value: 0x3308, lo: 0xb8, hi: 0xbf},\n\t// Block 0xab, offset 0x506\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x3308, lo: 0x80, hi: 0x85},\n\t{value: 0x3b08, lo: 0x86, hi: 0x86},\n\t{value: 0x0018, lo: 0x87, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x91},\n\t{value: 0x0018, lo: 0x92, hi: 0xa5},\n\t{value: 0x0008, lo: 0xa6, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xbe},\n\t{value: 0x3b08, lo: 0xbf, hi: 0xbf},\n\t// Block 0xac, offset 0x50f\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x3308, lo: 0x80, hi: 0x81},\n\t{value: 0x3008, lo: 0x82, hi: 0x82},\n\t{value: 0x0008, lo: 0x83, hi: 0xaf},\n\t{value: 0x3008, lo: 0xb0, hi: 0xb2},\n\t{value: 0x3308, lo: 0xb3, hi: 0xb6},\n\t{value: 0x3008, lo: 0xb7, hi: 0xb8},\n\t{value: 0x3b08, lo: 0xb9, hi: 0xb9},\n\t{value: 0x3308, lo: 0xba, hi: 0xba},\n\t{value: 0x0018, lo: 0xbb, hi: 0xbc},\n\t{value: 0x0340, lo: 0xbd, hi: 0xbd},\n\t{value: 0x0018, lo: 0xbe, hi: 0xbf},\n\t// Block 0xad, offset 0x51b\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0018, lo: 0x80, hi: 0x81},\n\t{value: 0x0040, lo: 0x82, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xa8},\n\t{value: 0x0040, lo: 0xa9, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbf},\n\t// Block 0xae, offset 0x522\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x3308, lo: 0x80, hi: 0x82},\n\t{value: 0x0008, lo: 0x83, hi: 0xa6},\n\t{value: 0x3308, lo: 0xa7, hi: 0xab},\n\t{value: 0x3008, lo: 0xac, hi: 0xac},\n\t{value: 0x3308, lo: 0xad, hi: 0xb2},\n\t{value: 0x3b08, lo: 0xb3, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xb5},\n\t{value: 0x0008, lo: 0xb6, hi: 0xbf},\n\t// Block 0xaf, offset 0x52b\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0018, lo: 0x80, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xb2},\n\t{value: 0x3308, lo: 0xb3, hi: 0xb3},\n\t{value: 0x0018, lo: 0xb4, hi: 0xb5},\n\t{value: 0x0008, lo: 0xb6, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xbf},\n\t// Block 0xb0, offset 0x533\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x3308, lo: 0x80, hi: 0x81},\n\t{value: 0x3008, lo: 0x82, hi: 0x82},\n\t{value: 0x0008, lo: 0x83, hi: 0xb2},\n\t{value: 0x3008, lo: 0xb3, hi: 0xb5},\n\t{value: 0x3308, lo: 0xb6, hi: 0xbe},\n\t{value: 0x3008, lo: 0xbf, hi: 0xbf},\n\t// Block 0xb1, offset 0x53a\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x3808, lo: 0x80, hi: 0x80},\n\t{value: 0x0008, lo: 0x81, hi: 0x84},\n\t{value: 0x0018, lo: 0x85, hi: 0x89},\n\t{value: 0x3308, lo: 0x8a, hi: 0x8c},\n\t{value: 0x0018, lo: 0x8d, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x9a},\n\t{value: 0x0018, lo: 0x9b, hi: 0x9b},\n\t{value: 0x0008, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0018, lo: 0x9d, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0018, lo: 0xa1, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xbf},\n\t// Block 0xb2, offset 0x548\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0008, lo: 0x80, hi: 0x91},\n\t{value: 0x0040, lo: 0x92, hi: 0x92},\n\t{value: 0x0008, lo: 0x93, hi: 0xab},\n\t{value: 0x3008, lo: 0xac, hi: 0xae},\n\t{value: 0x3308, lo: 0xaf, hi: 0xb1},\n\t{value: 0x3008, lo: 0xb2, hi: 0xb3},\n\t{value: 0x3308, lo: 0xb4, hi: 0xb4},\n\t{value: 0x3808, lo: 0xb5, hi: 0xb5},\n\t{value: 0x3308, lo: 0xb6, hi: 0xb7},\n\t{value: 0x0018, lo: 0xb8, hi: 0xbd},\n\t{value: 0x3308, lo: 0xbe, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0xb3, offset 0x555\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x87},\n\t{value: 0x0008, lo: 0x88, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x89},\n\t{value: 0x0008, lo: 0x8a, hi: 0x8d},\n\t{value: 0x0040, lo: 0x8e, hi: 0x8e},\n\t{value: 0x0008, lo: 0x8f, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0x9e},\n\t{value: 0x0008, lo: 0x9f, hi: 0xa8},\n\t{value: 0x0018, lo: 0xa9, hi: 0xa9},\n\t{value: 0x0040, lo: 0xaa, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0xb4, offset 0x562\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0008, lo: 0x80, hi: 0x9e},\n\t{value: 0x3308, lo: 0x9f, hi: 0x9f},\n\t{value: 0x3008, lo: 0xa0, hi: 0xa2},\n\t{value: 0x3308, lo: 0xa3, hi: 0xa9},\n\t{value: 0x3b08, lo: 0xaa, hi: 0xaa},\n\t{value: 0x0040, lo: 0xab, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xb9},\n\t{value: 0x0040, lo: 0xba, hi: 0xbf},\n\t// Block 0xb5, offset 0x56b\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0xb4},\n\t{value: 0x3008, lo: 0xb5, hi: 0xb7},\n\t{value: 0x3308, lo: 0xb8, hi: 0xbf},\n\t// Block 0xb6, offset 0x56f\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x3008, lo: 0x80, hi: 0x81},\n\t{value: 0x3b08, lo: 0x82, hi: 0x82},\n\t{value: 0x3308, lo: 0x83, hi: 0x84},\n\t{value: 0x3008, lo: 0x85, hi: 0x85},\n\t{value: 0x3308, lo: 0x86, hi: 0x86},\n\t{value: 0x0008, lo: 0x87, hi: 0x8a},\n\t{value: 0x0018, lo: 0x8b, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9a},\n\t{value: 0x0018, lo: 0x9b, hi: 0x9b},\n\t{value: 0x0040, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0018, lo: 0x9d, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0xbf},\n\t// Block 0xb7, offset 0x57d\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0xaf},\n\t{value: 0x3008, lo: 0xb0, hi: 0xb2},\n\t{value: 0x3308, lo: 0xb3, hi: 0xb8},\n\t{value: 0x3008, lo: 0xb9, hi: 0xb9},\n\t{value: 0x3308, lo: 0xba, hi: 0xba},\n\t{value: 0x3008, lo: 0xbb, hi: 0xbe},\n\t{value: 0x3308, lo: 0xbf, hi: 0xbf},\n\t// Block 0xb8, offset 0x585\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x3308, lo: 0x80, hi: 0x80},\n\t{value: 0x3008, lo: 0x81, hi: 0x81},\n\t{value: 0x3b08, lo: 0x82, hi: 0x82},\n\t{value: 0x3308, lo: 0x83, hi: 0x83},\n\t{value: 0x0008, lo: 0x84, hi: 0x85},\n\t{value: 0x0018, lo: 0x86, hi: 0x86},\n\t{value: 0x0008, lo: 0x87, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0xbf},\n\t// Block 0xb9, offset 0x590\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0008, lo: 0x80, hi: 0xae},\n\t{value: 0x3008, lo: 0xaf, hi: 0xb1},\n\t{value: 0x3308, lo: 0xb2, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xb7},\n\t{value: 0x3008, lo: 0xb8, hi: 0xbb},\n\t{value: 0x3308, lo: 0xbc, hi: 0xbd},\n\t{value: 0x3008, lo: 0xbe, hi: 0xbe},\n\t{value: 0x3b08, lo: 0xbf, hi: 0xbf},\n\t// Block 0xba, offset 0x599\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x3308, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0x97},\n\t{value: 0x0008, lo: 0x98, hi: 0x9b},\n\t{value: 0x3308, lo: 0x9c, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0xbf},\n\t// Block 0xbb, offset 0x59f\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0008, lo: 0x80, hi: 0xaf},\n\t{value: 0x3008, lo: 0xb0, hi: 0xb2},\n\t{value: 0x3308, lo: 0xb3, hi: 0xba},\n\t{value: 0x3008, lo: 0xbb, hi: 0xbc},\n\t{value: 0x3308, lo: 0xbd, hi: 0xbd},\n\t{value: 0x3008, lo: 0xbe, hi: 0xbe},\n\t{value: 0x3b08, lo: 0xbf, hi: 0xbf},\n\t// Block 0xbc, offset 0x5a7\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x3308, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0x83},\n\t{value: 0x0008, lo: 0x84, hi: 0x84},\n\t{value: 0x0040, lo: 0x85, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xac},\n\t{value: 0x0040, lo: 0xad, hi: 0xbf},\n\t// Block 0xbd, offset 0x5b0\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0xaa},\n\t{value: 0x3308, lo: 0xab, hi: 0xab},\n\t{value: 0x3008, lo: 0xac, hi: 0xac},\n\t{value: 0x3308, lo: 0xad, hi: 0xad},\n\t{value: 0x3008, lo: 0xae, hi: 0xaf},\n\t{value: 0x3308, lo: 0xb0, hi: 0xb5},\n\t{value: 0x3808, lo: 0xb6, hi: 0xb6},\n\t{value: 0x3308, lo: 0xb7, hi: 0xb7},\n\t{value: 0x0040, lo: 0xb8, hi: 0xbf},\n\t// Block 0xbe, offset 0x5ba\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0x89},\n\t{value: 0x0040, lo: 0x8a, hi: 0xbf},\n\t// Block 0xbf, offset 0x5bd\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9c},\n\t{value: 0x3308, lo: 0x9d, hi: 0x9f},\n\t{value: 0x3008, lo: 0xa0, hi: 0xa1},\n\t{value: 0x3308, lo: 0xa2, hi: 0xa5},\n\t{value: 0x3008, lo: 0xa6, hi: 0xa6},\n\t{value: 0x3308, lo: 0xa7, hi: 0xaa},\n\t{value: 0x3b08, lo: 0xab, hi: 0xab},\n\t{value: 0x0040, lo: 0xac, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xb9},\n\t{value: 0x0018, lo: 0xba, hi: 0xbf},\n\t// Block 0xc0, offset 0x5c9\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0040, lo: 0x80, hi: 0x9f},\n\t{value: 0x049d, lo: 0xa0, hi: 0xbf},\n\t// Block 0xc1, offset 0x5cc\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0xa9},\n\t{value: 0x0018, lo: 0xaa, hi: 0xb2},\n\t{value: 0x0040, lo: 0xb3, hi: 0xbe},\n\t{value: 0x0008, lo: 0xbf, hi: 0xbf},\n\t// Block 0xc2, offset 0x5d1\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0008, lo: 0x80, hi: 0x80},\n\t{value: 0x3308, lo: 0x81, hi: 0x86},\n\t{value: 0x3008, lo: 0x87, hi: 0x88},\n\t{value: 0x3308, lo: 0x89, hi: 0x8a},\n\t{value: 0x0008, lo: 0x8b, hi: 0xb2},\n\t{value: 0x3308, lo: 0xb3, hi: 0xb3},\n\t{value: 0x3b08, lo: 0xb4, hi: 0xb4},\n\t{value: 0x3308, lo: 0xb5, hi: 0xb8},\n\t{value: 0x3008, lo: 0xb9, hi: 0xb9},\n\t{value: 0x0008, lo: 0xba, hi: 0xba},\n\t{value: 0x3308, lo: 0xbb, hi: 0xbe},\n\t{value: 0x0018, lo: 0xbf, hi: 0xbf},\n\t// Block 0xc3, offset 0x5de\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0018, lo: 0x80, hi: 0x86},\n\t{value: 0x3b08, lo: 0x87, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x90},\n\t{value: 0x3308, lo: 0x91, hi: 0x96},\n\t{value: 0x3008, lo: 0x97, hi: 0x98},\n\t{value: 0x3308, lo: 0x99, hi: 0x9b},\n\t{value: 0x0008, lo: 0x9c, hi: 0xbf},\n\t// Block 0xc4, offset 0x5e7\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0x85},\n\t{value: 0x0008, lo: 0x86, hi: 0x89},\n\t{value: 0x3308, lo: 0x8a, hi: 0x96},\n\t{value: 0x3008, lo: 0x97, hi: 0x97},\n\t{value: 0x3308, lo: 0x98, hi: 0x98},\n\t{value: 0x3b08, lo: 0x99, hi: 0x99},\n\t{value: 0x0018, lo: 0x9a, hi: 0x9c},\n\t{value: 0x0040, lo: 0x9d, hi: 0x9d},\n\t{value: 0x0018, lo: 0x9e, hi: 0xa2},\n\t{value: 0x0040, lo: 0xa3, hi: 0xbf},\n\t// Block 0xc5, offset 0x5f3\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xb8},\n\t{value: 0x0040, lo: 0xb9, hi: 0xbf},\n\t// Block 0xc6, offset 0x5f6\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x89},\n\t{value: 0x0008, lo: 0x8a, hi: 0xae},\n\t{value: 0x3008, lo: 0xaf, hi: 0xaf},\n\t{value: 0x3308, lo: 0xb0, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xb7},\n\t{value: 0x3308, lo: 0xb8, hi: 0xbd},\n\t{value: 0x3008, lo: 0xbe, hi: 0xbe},\n\t{value: 0x3b08, lo: 0xbf, hi: 0xbf},\n\t// Block 0xc7, offset 0x600\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0008, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0x85},\n\t{value: 0x0040, lo: 0x86, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0018, lo: 0x9a, hi: 0xac},\n\t{value: 0x0040, lo: 0xad, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb1},\n\t{value: 0x0008, lo: 0xb2, hi: 0xbf},\n\t// Block 0xc8, offset 0x609\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x0008, lo: 0x80, hi: 0x8f},\n\t{value: 0x0040, lo: 0x90, hi: 0x91},\n\t{value: 0x3308, lo: 0x92, hi: 0xa7},\n\t{value: 0x0040, lo: 0xa8, hi: 0xa8},\n\t{value: 0x3008, lo: 0xa9, hi: 0xa9},\n\t{value: 0x3308, lo: 0xaa, hi: 0xb0},\n\t{value: 0x3008, lo: 0xb1, hi: 0xb1},\n\t{value: 0x3308, lo: 0xb2, hi: 0xb3},\n\t{value: 0x3008, lo: 0xb4, hi: 0xb4},\n\t{value: 0x3308, lo: 0xb5, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xbf},\n\t// Block 0xc9, offset 0x615\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x87},\n\t{value: 0x0008, lo: 0x88, hi: 0x89},\n\t{value: 0x0040, lo: 0x8a, hi: 0x8a},\n\t{value: 0x0008, lo: 0x8b, hi: 0xb0},\n\t{value: 0x3308, lo: 0xb1, hi: 0xb6},\n\t{value: 0x0040, lo: 0xb7, hi: 0xb9},\n\t{value: 0x3308, lo: 0xba, hi: 0xba},\n\t{value: 0x0040, lo: 0xbb, hi: 0xbb},\n\t{value: 0x3308, lo: 0xbc, hi: 0xbd},\n\t{value: 0x0040, lo: 0xbe, hi: 0xbe},\n\t{value: 0x3308, lo: 0xbf, hi: 0xbf},\n\t// Block 0xca, offset 0x622\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x3308, lo: 0x80, hi: 0x83},\n\t{value: 0x3b08, lo: 0x84, hi: 0x85},\n\t{value: 0x0008, lo: 0x86, hi: 0x86},\n\t{value: 0x3308, lo: 0x87, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0xbf},\n\t// Block 0xcb, offset 0x62a\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0xbf},\n\t// Block 0xcc, offset 0x62d\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xbf},\n\t// Block 0xcd, offset 0x632\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0x83},\n\t{value: 0x0040, lo: 0x84, hi: 0xbf},\n\t// Block 0xce, offset 0x635\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xbf},\n\t// Block 0xcf, offset 0x638\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0xbf},\n\t// Block 0xd0, offset 0x63b\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0008, lo: 0x80, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa9},\n\t{value: 0x0040, lo: 0xaa, hi: 0xad},\n\t{value: 0x0018, lo: 0xae, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xbf},\n\t// Block 0xd1, offset 0x642\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0040, lo: 0x80, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xaf},\n\t{value: 0x3308, lo: 0xb0, hi: 0xb4},\n\t{value: 0x0018, lo: 0xb5, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xbf},\n\t// Block 0xd2, offset 0x649\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0xaf},\n\t{value: 0x3308, lo: 0xb0, hi: 0xb6},\n\t{value: 0x0018, lo: 0xb7, hi: 0xbf},\n\t// Block 0xd3, offset 0x64d\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x0008, lo: 0x80, hi: 0x83},\n\t{value: 0x0018, lo: 0x84, hi: 0x85},\n\t{value: 0x0040, lo: 0x86, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9a},\n\t{value: 0x0018, lo: 0x9b, hi: 0xa1},\n\t{value: 0x0040, lo: 0xa2, hi: 0xa2},\n\t{value: 0x0008, lo: 0xa3, hi: 0xb7},\n\t{value: 0x0040, lo: 0xb8, hi: 0xbc},\n\t{value: 0x0008, lo: 0xbd, hi: 0xbf},\n\t// Block 0xd4, offset 0x658\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0x8f},\n\t{value: 0x0040, lo: 0x90, hi: 0xbf},\n\t// Block 0xd5, offset 0x65b\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0008, lo: 0x80, hi: 0x84},\n\t{value: 0x0040, lo: 0x85, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x90},\n\t{value: 0x3008, lo: 0x91, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0xd6, offset 0x661\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0040, lo: 0x80, hi: 0x8e},\n\t{value: 0x3308, lo: 0x8f, hi: 0x92},\n\t{value: 0x0008, lo: 0x93, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xbf},\n\t// Block 0xd7, offset 0x666\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0040, lo: 0x80, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xa1},\n\t{value: 0x0040, lo: 0xa2, hi: 0xbf},\n\t// Block 0xd8, offset 0x66a\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xac},\n\t{value: 0x0040, lo: 0xad, hi: 0xbf},\n\t// Block 0xd9, offset 0x66d\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xb2},\n\t{value: 0x0040, lo: 0xb3, hi: 0xbf},\n\t// Block 0xda, offset 0x670\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0x9e},\n\t{value: 0x0040, lo: 0x9f, hi: 0xbf},\n\t// Block 0xdb, offset 0x673\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0040, lo: 0x80, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0xdc, offset 0x676\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xbb},\n\t{value: 0x0040, lo: 0xbc, hi: 0xbf},\n\t// Block 0xdd, offset 0x679\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0008, lo: 0x80, hi: 0xaa},\n\t{value: 0x0040, lo: 0xab, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbc},\n\t{value: 0x0040, lo: 0xbd, hi: 0xbf},\n\t// Block 0xde, offset 0x67e\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x0008, lo: 0x80, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x8f},\n\t{value: 0x0008, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9b},\n\t{value: 0x0018, lo: 0x9c, hi: 0x9c},\n\t{value: 0x3308, lo: 0x9d, hi: 0x9e},\n\t{value: 0x0018, lo: 0x9f, hi: 0x9f},\n\t{value: 0x03c0, lo: 0xa0, hi: 0xa3},\n\t{value: 0x0040, lo: 0xa4, hi: 0xbf},\n\t// Block 0xdf, offset 0x688\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xbf},\n\t// Block 0xe0, offset 0x68b\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0xa6},\n\t{value: 0x0040, lo: 0xa7, hi: 0xa8},\n\t{value: 0x0018, lo: 0xa9, hi: 0xbf},\n\t// Block 0xe1, offset 0x68f\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x0018, lo: 0x80, hi: 0x9d},\n\t{value: 0xb5b9, lo: 0x9e, hi: 0x9e},\n\t{value: 0xb601, lo: 0x9f, hi: 0x9f},\n\t{value: 0xb649, lo: 0xa0, hi: 0xa0},\n\t{value: 0xb6b1, lo: 0xa1, hi: 0xa1},\n\t{value: 0xb719, lo: 0xa2, hi: 0xa2},\n\t{value: 0xb781, lo: 0xa3, hi: 0xa3},\n\t{value: 0xb7e9, lo: 0xa4, hi: 0xa4},\n\t{value: 0x3018, lo: 0xa5, hi: 0xa6},\n\t{value: 0x3318, lo: 0xa7, hi: 0xa9},\n\t{value: 0x0018, lo: 0xaa, hi: 0xac},\n\t{value: 0x3018, lo: 0xad, hi: 0xb2},\n\t{value: 0x0340, lo: 0xb3, hi: 0xba},\n\t{value: 0x3318, lo: 0xbb, hi: 0xbf},\n\t// Block 0xe2, offset 0x69e\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x3318, lo: 0x80, hi: 0x82},\n\t{value: 0x0018, lo: 0x83, hi: 0x84},\n\t{value: 0x3318, lo: 0x85, hi: 0x8b},\n\t{value: 0x0018, lo: 0x8c, hi: 0xa9},\n\t{value: 0x3318, lo: 0xaa, hi: 0xad},\n\t{value: 0x0018, lo: 0xae, hi: 0xba},\n\t{value: 0xb851, lo: 0xbb, hi: 0xbb},\n\t{value: 0xb899, lo: 0xbc, hi: 0xbc},\n\t{value: 0xb8e1, lo: 0xbd, hi: 0xbd},\n\t{value: 0xb949, lo: 0xbe, hi: 0xbe},\n\t{value: 0xb9b1, lo: 0xbf, hi: 0xbf},\n\t// Block 0xe3, offset 0x6aa\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xba19, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0xa8},\n\t{value: 0x0040, lo: 0xa9, hi: 0xbf},\n\t// Block 0xe4, offset 0x6ae\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x81},\n\t{value: 0x3318, lo: 0x82, hi: 0x84},\n\t{value: 0x0018, lo: 0x85, hi: 0x85},\n\t{value: 0x0040, lo: 0x86, hi: 0xbf},\n\t// Block 0xe5, offset 0x6b3\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xb1},\n\t{value: 0x0040, lo: 0xb2, hi: 0xbf},\n\t// Block 0xe6, offset 0x6b8\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x3308, lo: 0x80, hi: 0xb6},\n\t{value: 0x0018, lo: 0xb7, hi: 0xba},\n\t{value: 0x3308, lo: 0xbb, hi: 0xbf},\n\t// Block 0xe7, offset 0x6bc\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x3308, lo: 0x80, hi: 0xac},\n\t{value: 0x0018, lo: 0xad, hi: 0xb4},\n\t{value: 0x3308, lo: 0xb5, hi: 0xb5},\n\t{value: 0x0018, lo: 0xb6, hi: 0xbf},\n\t// Block 0xe8, offset 0x6c1\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x0018, lo: 0x80, hi: 0x83},\n\t{value: 0x3308, lo: 0x84, hi: 0x84},\n\t{value: 0x0018, lo: 0x85, hi: 0x8b},\n\t{value: 0x0040, lo: 0x8c, hi: 0x9a},\n\t{value: 0x3308, lo: 0x9b, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xa0},\n\t{value: 0x3308, lo: 0xa1, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xbf},\n\t// Block 0xe9, offset 0x6ca\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x3308, lo: 0x80, hi: 0x86},\n\t{value: 0x0040, lo: 0x87, hi: 0x87},\n\t{value: 0x3308, lo: 0x88, hi: 0x98},\n\t{value: 0x0040, lo: 0x99, hi: 0x9a},\n\t{value: 0x3308, lo: 0x9b, hi: 0xa1},\n\t{value: 0x0040, lo: 0xa2, hi: 0xa2},\n\t{value: 0x3308, lo: 0xa3, hi: 0xa4},\n\t{value: 0x0040, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3308, lo: 0xa6, hi: 0xaa},\n\t{value: 0x0040, lo: 0xab, hi: 0xbf},\n\t// Block 0xea, offset 0x6d5\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0808, lo: 0x80, hi: 0x84},\n\t{value: 0x0040, lo: 0x85, hi: 0x86},\n\t{value: 0x0818, lo: 0x87, hi: 0x8f},\n\t{value: 0x3308, lo: 0x90, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0xbf},\n\t// Block 0xeb, offset 0x6db\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x0a08, lo: 0x80, hi: 0x83},\n\t{value: 0x3308, lo: 0x84, hi: 0x8a},\n\t{value: 0x0040, lo: 0x8b, hi: 0x8f},\n\t{value: 0x0808, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9d},\n\t{value: 0x0818, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0040, lo: 0xa0, hi: 0xbf},\n\t// Block 0xec, offset 0x6e3\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0040, lo: 0x80, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb1},\n\t{value: 0x0040, lo: 0xb2, hi: 0xbf},\n\t// Block 0xed, offset 0x6e7\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0xab},\n\t{value: 0x0040, lo: 0xac, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xbf},\n\t// Block 0xee, offset 0x6eb\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0018, lo: 0x80, hi: 0x93},\n\t{value: 0x0040, lo: 0x94, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xae},\n\t{value: 0x0040, lo: 0xaf, hi: 0xb0},\n\t{value: 0x0018, lo: 0xb1, hi: 0xbf},\n\t// Block 0xef, offset 0x6f1\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0040, lo: 0x80, hi: 0x80},\n\t{value: 0x0018, lo: 0x81, hi: 0x8f},\n\t{value: 0x0040, lo: 0x90, hi: 0x90},\n\t{value: 0x0018, lo: 0x91, hi: 0xb5},\n\t{value: 0x0040, lo: 0xb6, hi: 0xbf},\n\t// Block 0xf0, offset 0x6f7\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x8f},\n\t{value: 0xc1c1, lo: 0x90, hi: 0x90},\n\t{value: 0x0018, lo: 0x91, hi: 0xac},\n\t{value: 0x0040, lo: 0xad, hi: 0xbf},\n\t// Block 0xf1, offset 0x6fc\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0040, lo: 0x80, hi: 0xa5},\n\t{value: 0x0018, lo: 0xa6, hi: 0xbf},\n\t// Block 0xf2, offset 0x6ff\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0xc7e9, lo: 0x80, hi: 0x80},\n\t{value: 0xc839, lo: 0x81, hi: 0x81},\n\t{value: 0xc889, lo: 0x82, hi: 0x82},\n\t{value: 0xc8d9, lo: 0x83, hi: 0x83},\n\t{value: 0xc929, lo: 0x84, hi: 0x84},\n\t{value: 0xc979, lo: 0x85, hi: 0x85},\n\t{value: 0xc9c9, lo: 0x86, hi: 0x86},\n\t{value: 0xca19, lo: 0x87, hi: 0x87},\n\t{value: 0xca69, lo: 0x88, hi: 0x88},\n\t{value: 0x0040, lo: 0x89, hi: 0x8f},\n\t{value: 0xcab9, lo: 0x90, hi: 0x90},\n\t{value: 0xcad9, lo: 0x91, hi: 0x91},\n\t{value: 0x0040, lo: 0x92, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xa5},\n\t{value: 0x0040, lo: 0xa6, hi: 0xbf},\n\t// Block 0xf3, offset 0x70f\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x0018, lo: 0x80, hi: 0x94},\n\t{value: 0x0040, lo: 0x95, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xac},\n\t{value: 0x0040, lo: 0xad, hi: 0xaf},\n\t{value: 0x0018, lo: 0xb0, hi: 0xb8},\n\t{value: 0x0040, lo: 0xb9, hi: 0xbf},\n\t// Block 0xf4, offset 0x716\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0xb3},\n\t{value: 0x0040, lo: 0xb4, hi: 0xbf},\n\t// Block 0xf5, offset 0x719\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0x94},\n\t{value: 0x0040, lo: 0x95, hi: 0xbf},\n\t// Block 0xf6, offset 0x71c\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0018, lo: 0x80, hi: 0x8b},\n\t{value: 0x0040, lo: 0x8c, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xbf},\n\t// Block 0xf7, offset 0x720\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x0018, lo: 0x80, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0x99},\n\t{value: 0x0040, lo: 0x9a, hi: 0x9f},\n\t{value: 0x0018, lo: 0xa0, hi: 0xbf},\n\t// Block 0xf8, offset 0x726\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x87},\n\t{value: 0x0040, lo: 0x88, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xad},\n\t{value: 0x0040, lo: 0xae, hi: 0xbf},\n\t// Block 0xf9, offset 0x72b\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x8b},\n\t{value: 0x0040, lo: 0x8c, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xbe},\n\t{value: 0x0040, lo: 0xbf, hi: 0xbf},\n\t// Block 0xfa, offset 0x730\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x8c},\n\t{value: 0x0040, lo: 0x8d, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xab},\n\t{value: 0x0040, lo: 0xac, hi: 0xbf},\n\t// Block 0xfb, offset 0x735\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0018, lo: 0x80, hi: 0x97},\n\t{value: 0x0040, lo: 0x98, hi: 0xbf},\n\t// Block 0xfc, offset 0x738\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0018, lo: 0x80, hi: 0x80},\n\t{value: 0x0040, lo: 0x81, hi: 0x8f},\n\t{value: 0x0018, lo: 0x90, hi: 0xa6},\n\t{value: 0x0040, lo: 0xa7, hi: 0xbf},\n\t// Block 0xfd, offset 0x73d\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0x96},\n\t{value: 0x0040, lo: 0x97, hi: 0xbf},\n\t// Block 0xfe, offset 0x740\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xb4},\n\t{value: 0x0040, lo: 0xb5, hi: 0xbf},\n\t// Block 0xff, offset 0x743\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0x9d},\n\t{value: 0x0040, lo: 0x9e, hi: 0x9f},\n\t{value: 0x0008, lo: 0xa0, hi: 0xbf},\n\t// Block 0x100, offset 0x747\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x0008, lo: 0x80, hi: 0xa1},\n\t{value: 0x0040, lo: 0xa2, hi: 0xaf},\n\t{value: 0x0008, lo: 0xb0, hi: 0xbf},\n\t// Block 0x101, offset 0x74b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0008, lo: 0x80, hi: 0xa0},\n\t{value: 0x0040, lo: 0xa1, hi: 0xbf},\n\t// Block 0x102, offset 0x74e\n\t{value: 0x0020, lo: 0x0f},\n\t{value: 0xdeb9, lo: 0x80, hi: 0x89},\n\t{value: 0x8dfd, lo: 0x8a, hi: 0x8a},\n\t{value: 0xdff9, lo: 0x8b, hi: 0x9c},\n\t{value: 0x8e1d, lo: 0x9d, hi: 0x9d},\n\t{value: 0xe239, lo: 0x9e, hi: 0xa2},\n\t{value: 0x8e3d, lo: 0xa3, hi: 0xa3},\n\t{value: 0xe2d9, lo: 0xa4, hi: 0xab},\n\t{value: 0x7ed5, lo: 0xac, hi: 0xac},\n\t{value: 0xe3d9, lo: 0xad, hi: 0xaf},\n\t{value: 0x8e5d, lo: 0xb0, hi: 0xb0},\n\t{value: 0xe439, lo: 0xb1, hi: 0xb6},\n\t{value: 0x8e7d, lo: 0xb7, hi: 0xb9},\n\t{value: 0xe4f9, lo: 0xba, hi: 0xba},\n\t{value: 0x8edd, lo: 0xbb, hi: 0xbb},\n\t{value: 0xe519, lo: 0xbc, hi: 0xbf},\n\t// Block 0x103, offset 0x75e\n\t{value: 0x0020, lo: 0x10},\n\t{value: 0x937d, lo: 0x80, hi: 0x80},\n\t{value: 0xf099, lo: 0x81, hi: 0x86},\n\t{value: 0x939d, lo: 0x87, hi: 0x8a},\n\t{value: 0xd9f9, lo: 0x8b, hi: 0x8b},\n\t{value: 0xf159, lo: 0x8c, hi: 0x96},\n\t{value: 0x941d, lo: 0x97, hi: 0x97},\n\t{value: 0xf2b9, lo: 0x98, hi: 0xa3},\n\t{value: 0x943d, lo: 0xa4, hi: 0xa6},\n\t{value: 0xf439, lo: 0xa7, hi: 0xaa},\n\t{value: 0x949d, lo: 0xab, hi: 0xab},\n\t{value: 0xf4b9, lo: 0xac, hi: 0xac},\n\t{value: 0x94bd, lo: 0xad, hi: 0xad},\n\t{value: 0xf4d9, lo: 0xae, hi: 0xaf},\n\t{value: 0x94dd, lo: 0xb0, hi: 0xb1},\n\t{value: 0xf519, lo: 0xb2, hi: 0xbe},\n\t{value: 0x2040, lo: 0xbf, hi: 0xbf},\n\t// Block 0x104, offset 0x76f\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x0040, lo: 0x80, hi: 0x80},\n\t{value: 0x0340, lo: 0x81, hi: 0x81},\n\t{value: 0x0040, lo: 0x82, hi: 0x9f},\n\t{value: 0x0340, lo: 0xa0, hi: 0xbf},\n\t// Block 0x105, offset 0x774\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x0340, lo: 0x80, hi: 0xbf},\n\t// Block 0x106, offset 0x776\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x33c0, lo: 0x80, hi: 0xbf},\n\t// Block 0x107, offset 0x778\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x33c0, lo: 0x80, hi: 0xaf},\n\t{value: 0x0040, lo: 0xb0, hi: 0xbf},\n}\n\n// Total table size 42115 bytes (41KiB); checksum: F4A1FA4E\n"
  },
  {
    "path": "vendor/golang.org/x/net/idna/trie.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage idna\n\n// appendMapping appends the mapping for the respective rune. isMapped must be\n// true. A mapping is a categorization of a rune as defined in UTS #46.\nfunc (c info) appendMapping(b []byte, s string) []byte {\n\tindex := int(c >> indexShift)\n\tif c&xorBit == 0 {\n\t\ts := mappings[index:]\n\t\treturn append(b, s[1:s[0]+1]...)\n\t}\n\tb = append(b, s...)\n\tif c&inlineXOR == inlineXOR {\n\t\t// TODO: support and handle two-byte inline masks\n\t\tb[len(b)-1] ^= byte(index)\n\t} else {\n\t\tfor p := len(b) - int(xorData[index]); p < len(b); p++ {\n\t\t\tindex++\n\t\t\tb[p] ^= xorData[index]\n\t\t}\n\t}\n\treturn b\n}\n\n// Sparse block handling code.\n\ntype valueRange struct {\n\tvalue  uint16 // header: value:stride\n\tlo, hi byte   // header: lo:n\n}\n\ntype sparseBlocks struct {\n\tvalues []valueRange\n\toffset []uint16\n}\n\nvar idnaSparse = sparseBlocks{\n\tvalues: idnaSparseValues[:],\n\toffset: idnaSparseOffset[:],\n}\n\n// Don't use newIdnaTrie to avoid unconditional linking in of the table.\nvar trie = &idnaTrie{}\n\n// lookup determines the type of block n and looks up the value for b.\n// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block\n// is a list of ranges with an accompanying value. Given a matching range r,\n// the value for b is by r.value + (b - r.lo) * stride.\nfunc (t *sparseBlocks) lookup(n uint32, b byte) uint16 {\n\toffset := t.offset[n]\n\theader := t.values[offset]\n\tlo := offset + 1\n\thi := lo + uint16(header.lo)\n\tfor lo < hi {\n\t\tm := lo + (hi-lo)/2\n\t\tr := t.values[m]\n\t\tif r.lo <= b && b <= r.hi {\n\t\t\treturn r.value + uint16(b-r.lo)*header.value\n\t\t}\n\t\tif b < r.lo {\n\t\t\thi = m\n\t\t} else {\n\t\t\tlo = m + 1\n\t\t}\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/idna/trieval.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\npackage idna\n\n// This file contains definitions for interpreting the trie value of the idna\n// trie generated by \"go run gen*.go\". It is shared by both the generator\n// program and the resultant package. Sharing is achieved by the generator\n// copying gen_trieval.go to trieval.go and changing what's above this comment.\n\n// info holds information from the IDNA mapping table for a single rune. It is\n// the value returned by a trie lookup. In most cases, all information fits in\n// a 16-bit value. For mappings, this value may contain an index into a slice\n// with the mapped string. Such mappings can consist of the actual mapped value\n// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the\n// input rune. This technique is used by the cases packages and reduces the\n// table size significantly.\n//\n// The per-rune values have the following format:\n//\n//   if mapped {\n//     if inlinedXOR {\n//       15..13 inline XOR marker\n//       12..11 unused\n//       10..3  inline XOR mask\n//     } else {\n//       15..3  index into xor or mapping table\n//     }\n//   } else {\n//       15..14 unused\n//       13     mayNeedNorm\n//       12..11 attributes\n//       10..8  joining type\n//        7..3  category type\n//   }\n//      2  use xor pattern\n//   1..0  mapped category\n//\n// See the definitions below for a more detailed description of the various\n// bits.\ntype info uint16\n\nconst (\n\tcatSmallMask = 0x3\n\tcatBigMask   = 0xF8\n\tindexShift   = 3\n\txorBit       = 0x4    // interpret the index as an xor pattern\n\tinlineXOR    = 0xE000 // These bits are set if the XOR pattern is inlined.\n\n\tjoinShift = 8\n\tjoinMask  = 0x07\n\n\t// Attributes\n\tattributesMask = 0x1800\n\tviramaModifier = 0x1800\n\tmodifier       = 0x1000\n\trtl            = 0x0800\n\n\tmayNeedNorm = 0x2000\n)\n\n// A category corresponds to a category defined in the IDNA mapping table.\ntype category uint16\n\nconst (\n\tunknown              category = 0 // not currently defined in unicode.\n\tmapped               category = 1\n\tdisallowedSTD3Mapped category = 2\n\tdeviation            category = 3\n)\n\nconst (\n\tvalid               category = 0x08\n\tvalidNV8            category = 0x18\n\tvalidXV8            category = 0x28\n\tdisallowed          category = 0x40\n\tdisallowedSTD3Valid category = 0x80\n\tignored             category = 0xC0\n)\n\n// join types and additional rune information\nconst (\n\tjoiningL = (iota + 1)\n\tjoiningD\n\tjoiningT\n\tjoiningR\n\n\t//the following types are derived during processing\n\tjoinZWJ\n\tjoinZWNJ\n\tjoinVirama\n\tnumJoinTypes\n)\n\nfunc (c info) isMapped() bool {\n\treturn c&0x3 != 0\n}\n\nfunc (c info) category() category {\n\tsmall := c & catSmallMask\n\tif small != 0 {\n\t\treturn category(small)\n\t}\n\treturn category(c & catBigMask)\n}\n\nfunc (c info) joinType() info {\n\tif c.isMapped() {\n\t\treturn 0\n\t}\n\treturn (c >> joinShift) & joinMask\n}\n\nfunc (c info) isModifier() bool {\n\treturn c&(modifier|catSmallMask) == modifier\n}\n\nfunc (c info) isViramaModifier() bool {\n\treturn c&(attributesMask|catSmallMask) == viramaModifier\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/websocket/client.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage websocket\n\nimport (\n\t\"bufio\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n)\n\n// DialError is an error that occurs while dialling a websocket server.\ntype DialError struct {\n\t*Config\n\tErr error\n}\n\nfunc (e *DialError) Error() string {\n\treturn \"websocket.Dial \" + e.Config.Location.String() + \": \" + e.Err.Error()\n}\n\n// NewConfig creates a new WebSocket config for client connection.\nfunc NewConfig(server, origin string) (config *Config, err error) {\n\tconfig = new(Config)\n\tconfig.Version = ProtocolVersionHybi13\n\tconfig.Location, err = url.ParseRequestURI(server)\n\tif err != nil {\n\t\treturn\n\t}\n\tconfig.Origin, err = url.ParseRequestURI(origin)\n\tif err != nil {\n\t\treturn\n\t}\n\tconfig.Header = http.Header(make(map[string][]string))\n\treturn\n}\n\n// NewClient creates a new WebSocket client connection over rwc.\nfunc NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) {\n\tbr := bufio.NewReader(rwc)\n\tbw := bufio.NewWriter(rwc)\n\terr = hybiClientHandshake(config, br, bw)\n\tif err != nil {\n\t\treturn\n\t}\n\tbuf := bufio.NewReadWriter(br, bw)\n\tws = newHybiClientConn(config, buf, rwc)\n\treturn\n}\n\n// Dial opens a new client connection to a WebSocket.\nfunc Dial(url_, protocol, origin string) (ws *Conn, err error) {\n\tconfig, err := NewConfig(url_, origin)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif protocol != \"\" {\n\t\tconfig.Protocol = []string{protocol}\n\t}\n\treturn DialConfig(config)\n}\n\nvar portMap = map[string]string{\n\t\"ws\":  \"80\",\n\t\"wss\": \"443\",\n}\n\nfunc parseAuthority(location *url.URL) string {\n\tif _, ok := portMap[location.Scheme]; ok {\n\t\tif _, _, err := net.SplitHostPort(location.Host); err != nil {\n\t\t\treturn net.JoinHostPort(location.Host, portMap[location.Scheme])\n\t\t}\n\t}\n\treturn location.Host\n}\n\n// DialConfig opens a new client connection to a WebSocket with a config.\nfunc DialConfig(config *Config) (ws *Conn, err error) {\n\tvar client net.Conn\n\tif config.Location == nil {\n\t\treturn nil, &DialError{config, ErrBadWebSocketLocation}\n\t}\n\tif config.Origin == nil {\n\t\treturn nil, &DialError{config, ErrBadWebSocketOrigin}\n\t}\n\tdialer := config.Dialer\n\tif dialer == nil {\n\t\tdialer = &net.Dialer{}\n\t}\n\tclient, err = dialWithDialer(dialer, config)\n\tif err != nil {\n\t\tgoto Error\n\t}\n\tws, err = NewClient(config, client)\n\tif err != nil {\n\t\tclient.Close()\n\t\tgoto Error\n\t}\n\treturn\n\nError:\n\treturn nil, &DialError{config, err}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/websocket/dial.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage websocket\n\nimport (\n\t\"crypto/tls\"\n\t\"net\"\n)\n\nfunc dialWithDialer(dialer *net.Dialer, config *Config) (conn net.Conn, err error) {\n\tswitch config.Location.Scheme {\n\tcase \"ws\":\n\t\tconn, err = dialer.Dial(\"tcp\", parseAuthority(config.Location))\n\n\tcase \"wss\":\n\t\tconn, err = tls.DialWithDialer(dialer, \"tcp\", parseAuthority(config.Location), config.TlsConfig)\n\n\tdefault:\n\t\terr = ErrBadScheme\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/websocket/hybi.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage websocket\n\n// This file implements a protocol of hybi draft.\n// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"crypto/sha1\"\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n)\n\nconst (\n\twebsocketGUID = \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\"\n\n\tcloseStatusNormal            = 1000\n\tcloseStatusGoingAway         = 1001\n\tcloseStatusProtocolError     = 1002\n\tcloseStatusUnsupportedData   = 1003\n\tcloseStatusFrameTooLarge     = 1004\n\tcloseStatusNoStatusRcvd      = 1005\n\tcloseStatusAbnormalClosure   = 1006\n\tcloseStatusBadMessageData    = 1007\n\tcloseStatusPolicyViolation   = 1008\n\tcloseStatusTooBigData        = 1009\n\tcloseStatusExtensionMismatch = 1010\n\n\tmaxControlFramePayloadLength = 125\n)\n\nvar (\n\tErrBadMaskingKey         = &ProtocolError{\"bad masking key\"}\n\tErrBadPongMessage        = &ProtocolError{\"bad pong message\"}\n\tErrBadClosingStatus      = &ProtocolError{\"bad closing status\"}\n\tErrUnsupportedExtensions = &ProtocolError{\"unsupported extensions\"}\n\tErrNotImplemented        = &ProtocolError{\"not implemented\"}\n\n\thandshakeHeader = map[string]bool{\n\t\t\"Host\":                   true,\n\t\t\"Upgrade\":                true,\n\t\t\"Connection\":             true,\n\t\t\"Sec-Websocket-Key\":      true,\n\t\t\"Sec-Websocket-Origin\":   true,\n\t\t\"Sec-Websocket-Version\":  true,\n\t\t\"Sec-Websocket-Protocol\": true,\n\t\t\"Sec-Websocket-Accept\":   true,\n\t}\n)\n\n// A hybiFrameHeader is a frame header as defined in hybi draft.\ntype hybiFrameHeader struct {\n\tFin        bool\n\tRsv        [3]bool\n\tOpCode     byte\n\tLength     int64\n\tMaskingKey []byte\n\n\tdata *bytes.Buffer\n}\n\n// A hybiFrameReader is a reader for hybi frame.\ntype hybiFrameReader struct {\n\treader io.Reader\n\n\theader hybiFrameHeader\n\tpos    int64\n\tlength int\n}\n\nfunc (frame *hybiFrameReader) Read(msg []byte) (n int, err error) {\n\tn, err = frame.reader.Read(msg)\n\tif frame.header.MaskingKey != nil {\n\t\tfor i := 0; i < n; i++ {\n\t\t\tmsg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4]\n\t\t\tframe.pos++\n\t\t}\n\t}\n\treturn n, err\n}\n\nfunc (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode }\n\nfunc (frame *hybiFrameReader) HeaderReader() io.Reader {\n\tif frame.header.data == nil {\n\t\treturn nil\n\t}\n\tif frame.header.data.Len() == 0 {\n\t\treturn nil\n\t}\n\treturn frame.header.data\n}\n\nfunc (frame *hybiFrameReader) TrailerReader() io.Reader { return nil }\n\nfunc (frame *hybiFrameReader) Len() (n int) { return frame.length }\n\n// A hybiFrameReaderFactory creates new frame reader based on its frame type.\ntype hybiFrameReaderFactory struct {\n\t*bufio.Reader\n}\n\n// NewFrameReader reads a frame header from the connection, and creates new reader for the frame.\n// See Section 5.2 Base Framing protocol for detail.\n// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2\nfunc (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) {\n\thybiFrame := new(hybiFrameReader)\n\tframe = hybiFrame\n\tvar header []byte\n\tvar b byte\n\t// First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits)\n\tb, err = buf.ReadByte()\n\tif err != nil {\n\t\treturn\n\t}\n\theader = append(header, b)\n\thybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0\n\tfor i := 0; i < 3; i++ {\n\t\tj := uint(6 - i)\n\t\thybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0\n\t}\n\thybiFrame.header.OpCode = header[0] & 0x0f\n\n\t// Second byte. Mask/Payload len(7bits)\n\tb, err = buf.ReadByte()\n\tif err != nil {\n\t\treturn\n\t}\n\theader = append(header, b)\n\tmask := (b & 0x80) != 0\n\tb &= 0x7f\n\tlengthFields := 0\n\tswitch {\n\tcase b <= 125: // Payload length 7bits.\n\t\thybiFrame.header.Length = int64(b)\n\tcase b == 126: // Payload length 7+16bits\n\t\tlengthFields = 2\n\tcase b == 127: // Payload length 7+64bits\n\t\tlengthFields = 8\n\t}\n\tfor i := 0; i < lengthFields; i++ {\n\t\tb, err = buf.ReadByte()\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tif lengthFields == 8 && i == 0 { // MSB must be zero when 7+64 bits\n\t\t\tb &= 0x7f\n\t\t}\n\t\theader = append(header, b)\n\t\thybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b)\n\t}\n\tif mask {\n\t\t// Masking key. 4 bytes.\n\t\tfor i := 0; i < 4; i++ {\n\t\t\tb, err = buf.ReadByte()\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\theader = append(header, b)\n\t\t\thybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b)\n\t\t}\n\t}\n\thybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length)\n\thybiFrame.header.data = bytes.NewBuffer(header)\n\thybiFrame.length = len(header) + int(hybiFrame.header.Length)\n\treturn\n}\n\n// A HybiFrameWriter is a writer for hybi frame.\ntype hybiFrameWriter struct {\n\twriter *bufio.Writer\n\n\theader *hybiFrameHeader\n}\n\nfunc (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) {\n\tvar header []byte\n\tvar b byte\n\tif frame.header.Fin {\n\t\tb |= 0x80\n\t}\n\tfor i := 0; i < 3; i++ {\n\t\tif frame.header.Rsv[i] {\n\t\t\tj := uint(6 - i)\n\t\t\tb |= 1 << j\n\t\t}\n\t}\n\tb |= frame.header.OpCode\n\theader = append(header, b)\n\tif frame.header.MaskingKey != nil {\n\t\tb = 0x80\n\t} else {\n\t\tb = 0\n\t}\n\tlengthFields := 0\n\tlength := len(msg)\n\tswitch {\n\tcase length <= 125:\n\t\tb |= byte(length)\n\tcase length < 65536:\n\t\tb |= 126\n\t\tlengthFields = 2\n\tdefault:\n\t\tb |= 127\n\t\tlengthFields = 8\n\t}\n\theader = append(header, b)\n\tfor i := 0; i < lengthFields; i++ {\n\t\tj := uint((lengthFields - i - 1) * 8)\n\t\tb = byte((length >> j) & 0xff)\n\t\theader = append(header, b)\n\t}\n\tif frame.header.MaskingKey != nil {\n\t\tif len(frame.header.MaskingKey) != 4 {\n\t\t\treturn 0, ErrBadMaskingKey\n\t\t}\n\t\theader = append(header, frame.header.MaskingKey...)\n\t\tframe.writer.Write(header)\n\t\tdata := make([]byte, length)\n\t\tfor i := range data {\n\t\t\tdata[i] = msg[i] ^ frame.header.MaskingKey[i%4]\n\t\t}\n\t\tframe.writer.Write(data)\n\t\terr = frame.writer.Flush()\n\t\treturn length, err\n\t}\n\tframe.writer.Write(header)\n\tframe.writer.Write(msg)\n\terr = frame.writer.Flush()\n\treturn length, err\n}\n\nfunc (frame *hybiFrameWriter) Close() error { return nil }\n\ntype hybiFrameWriterFactory struct {\n\t*bufio.Writer\n\tneedMaskingKey bool\n}\n\nfunc (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) {\n\tframeHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType}\n\tif buf.needMaskingKey {\n\t\tframeHeader.MaskingKey, err = generateMaskingKey()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil\n}\n\ntype hybiFrameHandler struct {\n\tconn        *Conn\n\tpayloadType byte\n}\n\nfunc (handler *hybiFrameHandler) HandleFrame(frame frameReader) (frameReader, error) {\n\tif handler.conn.IsServerConn() {\n\t\t// The client MUST mask all frames sent to the server.\n\t\tif frame.(*hybiFrameReader).header.MaskingKey == nil {\n\t\t\thandler.WriteClose(closeStatusProtocolError)\n\t\t\treturn nil, io.EOF\n\t\t}\n\t} else {\n\t\t// The server MUST NOT mask all frames.\n\t\tif frame.(*hybiFrameReader).header.MaskingKey != nil {\n\t\t\thandler.WriteClose(closeStatusProtocolError)\n\t\t\treturn nil, io.EOF\n\t\t}\n\t}\n\tif header := frame.HeaderReader(); header != nil {\n\t\tio.Copy(ioutil.Discard, header)\n\t}\n\tswitch frame.PayloadType() {\n\tcase ContinuationFrame:\n\t\tframe.(*hybiFrameReader).header.OpCode = handler.payloadType\n\tcase TextFrame, BinaryFrame:\n\t\thandler.payloadType = frame.PayloadType()\n\tcase CloseFrame:\n\t\treturn nil, io.EOF\n\tcase PingFrame, PongFrame:\n\t\tb := make([]byte, maxControlFramePayloadLength)\n\t\tn, err := io.ReadFull(frame, b)\n\t\tif err != nil && err != io.EOF && err != io.ErrUnexpectedEOF {\n\t\t\treturn nil, err\n\t\t}\n\t\tio.Copy(ioutil.Discard, frame)\n\t\tif frame.PayloadType() == PingFrame {\n\t\t\tif _, err := handler.WritePong(b[:n]); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\treturn nil, nil\n\t}\n\treturn frame, nil\n}\n\nfunc (handler *hybiFrameHandler) WriteClose(status int) (err error) {\n\thandler.conn.wio.Lock()\n\tdefer handler.conn.wio.Unlock()\n\tw, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmsg := make([]byte, 2)\n\tbinary.BigEndian.PutUint16(msg, uint16(status))\n\t_, err = w.Write(msg)\n\tw.Close()\n\treturn err\n}\n\nfunc (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) {\n\thandler.conn.wio.Lock()\n\tdefer handler.conn.wio.Unlock()\n\tw, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tn, err = w.Write(msg)\n\tw.Close()\n\treturn n, err\n}\n\n// newHybiConn creates a new WebSocket connection speaking hybi draft protocol.\nfunc newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn {\n\tif buf == nil {\n\t\tbr := bufio.NewReader(rwc)\n\t\tbw := bufio.NewWriter(rwc)\n\t\tbuf = bufio.NewReadWriter(br, bw)\n\t}\n\tws := &Conn{config: config, request: request, buf: buf, rwc: rwc,\n\t\tframeReaderFactory: hybiFrameReaderFactory{buf.Reader},\n\t\tframeWriterFactory: hybiFrameWriterFactory{\n\t\t\tbuf.Writer, request == nil},\n\t\tPayloadType:        TextFrame,\n\t\tdefaultCloseStatus: closeStatusNormal}\n\tws.frameHandler = &hybiFrameHandler{conn: ws}\n\treturn ws\n}\n\n// generateMaskingKey generates a masking key for a frame.\nfunc generateMaskingKey() (maskingKey []byte, err error) {\n\tmaskingKey = make([]byte, 4)\n\tif _, err = io.ReadFull(rand.Reader, maskingKey); err != nil {\n\t\treturn\n\t}\n\treturn\n}\n\n// generateNonce generates a nonce consisting of a randomly selected 16-byte\n// value that has been base64-encoded.\nfunc generateNonce() (nonce []byte) {\n\tkey := make([]byte, 16)\n\tif _, err := io.ReadFull(rand.Reader, key); err != nil {\n\t\tpanic(err)\n\t}\n\tnonce = make([]byte, 24)\n\tbase64.StdEncoding.Encode(nonce, key)\n\treturn\n}\n\n// removeZone removes IPv6 zone identifer from host.\n// E.g., \"[fe80::1%en0]:8080\" to \"[fe80::1]:8080\"\nfunc removeZone(host string) string {\n\tif !strings.HasPrefix(host, \"[\") {\n\t\treturn host\n\t}\n\ti := strings.LastIndex(host, \"]\")\n\tif i < 0 {\n\t\treturn host\n\t}\n\tj := strings.LastIndex(host[:i], \"%\")\n\tif j < 0 {\n\t\treturn host\n\t}\n\treturn host[:j] + host[i:]\n}\n\n// getNonceAccept computes the base64-encoded SHA-1 of the concatenation of\n// the nonce (\"Sec-WebSocket-Key\" value) with the websocket GUID string.\nfunc getNonceAccept(nonce []byte) (expected []byte, err error) {\n\th := sha1.New()\n\tif _, err = h.Write(nonce); err != nil {\n\t\treturn\n\t}\n\tif _, err = h.Write([]byte(websocketGUID)); err != nil {\n\t\treturn\n\t}\n\texpected = make([]byte, 28)\n\tbase64.StdEncoding.Encode(expected, h.Sum(nil))\n\treturn\n}\n\n// Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17\nfunc hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) {\n\tbw.WriteString(\"GET \" + config.Location.RequestURI() + \" HTTP/1.1\\r\\n\")\n\n\t// According to RFC 6874, an HTTP client, proxy, or other\n\t// intermediary must remove any IPv6 zone identifier attached\n\t// to an outgoing URI.\n\tbw.WriteString(\"Host: \" + removeZone(config.Location.Host) + \"\\r\\n\")\n\tbw.WriteString(\"Upgrade: websocket\\r\\n\")\n\tbw.WriteString(\"Connection: Upgrade\\r\\n\")\n\tnonce := generateNonce()\n\tif config.handshakeData != nil {\n\t\tnonce = []byte(config.handshakeData[\"key\"])\n\t}\n\tbw.WriteString(\"Sec-WebSocket-Key: \" + string(nonce) + \"\\r\\n\")\n\tbw.WriteString(\"Origin: \" + strings.ToLower(config.Origin.String()) + \"\\r\\n\")\n\n\tif config.Version != ProtocolVersionHybi13 {\n\t\treturn ErrBadProtocolVersion\n\t}\n\n\tbw.WriteString(\"Sec-WebSocket-Version: \" + fmt.Sprintf(\"%d\", config.Version) + \"\\r\\n\")\n\tif len(config.Protocol) > 0 {\n\t\tbw.WriteString(\"Sec-WebSocket-Protocol: \" + strings.Join(config.Protocol, \", \") + \"\\r\\n\")\n\t}\n\t// TODO(ukai): send Sec-WebSocket-Extensions.\n\terr = config.Header.WriteSubset(bw, handshakeHeader)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tbw.WriteString(\"\\r\\n\")\n\tif err = bw.Flush(); err != nil {\n\t\treturn err\n\t}\n\n\tresp, err := http.ReadResponse(br, &http.Request{Method: \"GET\"})\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.StatusCode != 101 {\n\t\treturn ErrBadStatus\n\t}\n\tif strings.ToLower(resp.Header.Get(\"Upgrade\")) != \"websocket\" ||\n\t\tstrings.ToLower(resp.Header.Get(\"Connection\")) != \"upgrade\" {\n\t\treturn ErrBadUpgrade\n\t}\n\texpectedAccept, err := getNonceAccept(nonce)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif resp.Header.Get(\"Sec-WebSocket-Accept\") != string(expectedAccept) {\n\t\treturn ErrChallengeResponse\n\t}\n\tif resp.Header.Get(\"Sec-WebSocket-Extensions\") != \"\" {\n\t\treturn ErrUnsupportedExtensions\n\t}\n\tofferedProtocol := resp.Header.Get(\"Sec-WebSocket-Protocol\")\n\tif offeredProtocol != \"\" {\n\t\tprotocolMatched := false\n\t\tfor i := 0; i < len(config.Protocol); i++ {\n\t\t\tif config.Protocol[i] == offeredProtocol {\n\t\t\t\tprotocolMatched = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif !protocolMatched {\n\t\t\treturn ErrBadWebSocketProtocol\n\t\t}\n\t\tconfig.Protocol = []string{offeredProtocol}\n\t}\n\n\treturn nil\n}\n\n// newHybiClientConn creates a client WebSocket connection after handshake.\nfunc newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn {\n\treturn newHybiConn(config, buf, rwc, nil)\n}\n\n// A HybiServerHandshaker performs a server handshake using hybi draft protocol.\ntype hybiServerHandshaker struct {\n\t*Config\n\taccept []byte\n}\n\nfunc (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) {\n\tc.Version = ProtocolVersionHybi13\n\tif req.Method != \"GET\" {\n\t\treturn http.StatusMethodNotAllowed, ErrBadRequestMethod\n\t}\n\t// HTTP version can be safely ignored.\n\n\tif strings.ToLower(req.Header.Get(\"Upgrade\")) != \"websocket\" ||\n\t\t!strings.Contains(strings.ToLower(req.Header.Get(\"Connection\")), \"upgrade\") {\n\t\treturn http.StatusBadRequest, ErrNotWebSocket\n\t}\n\n\tkey := req.Header.Get(\"Sec-Websocket-Key\")\n\tif key == \"\" {\n\t\treturn http.StatusBadRequest, ErrChallengeResponse\n\t}\n\tversion := req.Header.Get(\"Sec-Websocket-Version\")\n\tswitch version {\n\tcase \"13\":\n\t\tc.Version = ProtocolVersionHybi13\n\tdefault:\n\t\treturn http.StatusBadRequest, ErrBadWebSocketVersion\n\t}\n\tvar scheme string\n\tif req.TLS != nil {\n\t\tscheme = \"wss\"\n\t} else {\n\t\tscheme = \"ws\"\n\t}\n\tc.Location, err = url.ParseRequestURI(scheme + \"://\" + req.Host + req.URL.RequestURI())\n\tif err != nil {\n\t\treturn http.StatusBadRequest, err\n\t}\n\tprotocol := strings.TrimSpace(req.Header.Get(\"Sec-Websocket-Protocol\"))\n\tif protocol != \"\" {\n\t\tprotocols := strings.Split(protocol, \",\")\n\t\tfor i := 0; i < len(protocols); i++ {\n\t\t\tc.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i]))\n\t\t}\n\t}\n\tc.accept, err = getNonceAccept([]byte(key))\n\tif err != nil {\n\t\treturn http.StatusInternalServerError, err\n\t}\n\treturn http.StatusSwitchingProtocols, nil\n}\n\n// Origin parses the Origin header in req.\n// If the Origin header is not set, it returns nil and nil.\nfunc Origin(config *Config, req *http.Request) (*url.URL, error) {\n\tvar origin string\n\tswitch config.Version {\n\tcase ProtocolVersionHybi13:\n\t\torigin = req.Header.Get(\"Origin\")\n\t}\n\tif origin == \"\" {\n\t\treturn nil, nil\n\t}\n\treturn url.ParseRequestURI(origin)\n}\n\nfunc (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) {\n\tif len(c.Protocol) > 0 {\n\t\tif len(c.Protocol) != 1 {\n\t\t\t// You need choose a Protocol in Handshake func in Server.\n\t\t\treturn ErrBadWebSocketProtocol\n\t\t}\n\t}\n\tbuf.WriteString(\"HTTP/1.1 101 Switching Protocols\\r\\n\")\n\tbuf.WriteString(\"Upgrade: websocket\\r\\n\")\n\tbuf.WriteString(\"Connection: Upgrade\\r\\n\")\n\tbuf.WriteString(\"Sec-WebSocket-Accept: \" + string(c.accept) + \"\\r\\n\")\n\tif len(c.Protocol) > 0 {\n\t\tbuf.WriteString(\"Sec-WebSocket-Protocol: \" + c.Protocol[0] + \"\\r\\n\")\n\t}\n\t// TODO(ukai): send Sec-WebSocket-Extensions.\n\tif c.Header != nil {\n\t\terr := c.Header.WriteSubset(buf, handshakeHeader)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\tbuf.WriteString(\"\\r\\n\")\n\treturn buf.Flush()\n}\n\nfunc (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn {\n\treturn newHybiServerConn(c.Config, buf, rwc, request)\n}\n\n// newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol.\nfunc newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn {\n\treturn newHybiConn(config, buf, rwc, request)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/websocket/server.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage websocket\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n)\n\nfunc newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) {\n\tvar hs serverHandshaker = &hybiServerHandshaker{Config: config}\n\tcode, err := hs.ReadHandshake(buf.Reader, req)\n\tif err == ErrBadWebSocketVersion {\n\t\tfmt.Fprintf(buf, \"HTTP/1.1 %03d %s\\r\\n\", code, http.StatusText(code))\n\t\tfmt.Fprintf(buf, \"Sec-WebSocket-Version: %s\\r\\n\", SupportedProtocolVersion)\n\t\tbuf.WriteString(\"\\r\\n\")\n\t\tbuf.WriteString(err.Error())\n\t\tbuf.Flush()\n\t\treturn\n\t}\n\tif err != nil {\n\t\tfmt.Fprintf(buf, \"HTTP/1.1 %03d %s\\r\\n\", code, http.StatusText(code))\n\t\tbuf.WriteString(\"\\r\\n\")\n\t\tbuf.WriteString(err.Error())\n\t\tbuf.Flush()\n\t\treturn\n\t}\n\tif handshake != nil {\n\t\terr = handshake(config, req)\n\t\tif err != nil {\n\t\t\tcode = http.StatusForbidden\n\t\t\tfmt.Fprintf(buf, \"HTTP/1.1 %03d %s\\r\\n\", code, http.StatusText(code))\n\t\t\tbuf.WriteString(\"\\r\\n\")\n\t\t\tbuf.Flush()\n\t\t\treturn\n\t\t}\n\t}\n\terr = hs.AcceptHandshake(buf.Writer)\n\tif err != nil {\n\t\tcode = http.StatusBadRequest\n\t\tfmt.Fprintf(buf, \"HTTP/1.1 %03d %s\\r\\n\", code, http.StatusText(code))\n\t\tbuf.WriteString(\"\\r\\n\")\n\t\tbuf.Flush()\n\t\treturn\n\t}\n\tconn = hs.NewServerConn(buf, rwc, req)\n\treturn\n}\n\n// Server represents a server of a WebSocket.\ntype Server struct {\n\t// Config is a WebSocket configuration for new WebSocket connection.\n\tConfig\n\n\t// Handshake is an optional function in WebSocket handshake.\n\t// For example, you can check, or don't check Origin header.\n\t// Another example, you can select config.Protocol.\n\tHandshake func(*Config, *http.Request) error\n\n\t// Handler handles a WebSocket connection.\n\tHandler\n}\n\n// ServeHTTP implements the http.Handler interface for a WebSocket\nfunc (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {\n\ts.serveWebSocket(w, req)\n}\n\nfunc (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) {\n\trwc, buf, err := w.(http.Hijacker).Hijack()\n\tif err != nil {\n\t\tpanic(\"Hijack failed: \" + err.Error())\n\t}\n\t// The server should abort the WebSocket connection if it finds\n\t// the client did not send a handshake that matches with protocol\n\t// specification.\n\tdefer rwc.Close()\n\tconn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake)\n\tif err != nil {\n\t\treturn\n\t}\n\tif conn == nil {\n\t\tpanic(\"unexpected nil conn\")\n\t}\n\ts.Handler(conn)\n}\n\n// Handler is a simple interface to a WebSocket browser client.\n// It checks if Origin header is valid URL by default.\n// You might want to verify websocket.Conn.Config().Origin in the func.\n// If you use Server instead of Handler, you could call websocket.Origin and\n// check the origin in your Handshake func. So, if you want to accept\n// non-browser clients, which do not send an Origin header, set a\n// Server.Handshake that does not check the origin.\ntype Handler func(*Conn)\n\nfunc checkOrigin(config *Config, req *http.Request) (err error) {\n\tconfig.Origin, err = Origin(config, req)\n\tif err == nil && config.Origin == nil {\n\t\treturn fmt.Errorf(\"null origin\")\n\t}\n\treturn err\n}\n\n// ServeHTTP implements the http.Handler interface for a WebSocket\nfunc (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {\n\ts := Server{Handler: h, Handshake: checkOrigin}\n\ts.serveWebSocket(w, req)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/net/websocket/websocket.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package websocket implements a client and server for the WebSocket protocol\n// as specified in RFC 6455.\n//\n// This package currently lacks some features found in an alternative\n// and more actively maintained WebSocket package:\n//\n//     https://godoc.org/github.com/gorilla/websocket\n//\npackage websocket // import \"golang.org/x/net/websocket\"\n\nimport (\n\t\"bufio\"\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\tProtocolVersionHybi13    = 13\n\tProtocolVersionHybi      = ProtocolVersionHybi13\n\tSupportedProtocolVersion = \"13\"\n\n\tContinuationFrame = 0\n\tTextFrame         = 1\n\tBinaryFrame       = 2\n\tCloseFrame        = 8\n\tPingFrame         = 9\n\tPongFrame         = 10\n\tUnknownFrame      = 255\n\n\tDefaultMaxPayloadBytes = 32 << 20 // 32MB\n)\n\n// ProtocolError represents WebSocket protocol errors.\ntype ProtocolError struct {\n\tErrorString string\n}\n\nfunc (err *ProtocolError) Error() string { return err.ErrorString }\n\nvar (\n\tErrBadProtocolVersion   = &ProtocolError{\"bad protocol version\"}\n\tErrBadScheme            = &ProtocolError{\"bad scheme\"}\n\tErrBadStatus            = &ProtocolError{\"bad status\"}\n\tErrBadUpgrade           = &ProtocolError{\"missing or bad upgrade\"}\n\tErrBadWebSocketOrigin   = &ProtocolError{\"missing or bad WebSocket-Origin\"}\n\tErrBadWebSocketLocation = &ProtocolError{\"missing or bad WebSocket-Location\"}\n\tErrBadWebSocketProtocol = &ProtocolError{\"missing or bad WebSocket-Protocol\"}\n\tErrBadWebSocketVersion  = &ProtocolError{\"missing or bad WebSocket Version\"}\n\tErrChallengeResponse    = &ProtocolError{\"mismatch challenge/response\"}\n\tErrBadFrame             = &ProtocolError{\"bad frame\"}\n\tErrBadFrameBoundary     = &ProtocolError{\"not on frame boundary\"}\n\tErrNotWebSocket         = &ProtocolError{\"not websocket protocol\"}\n\tErrBadRequestMethod     = &ProtocolError{\"bad method\"}\n\tErrNotSupported         = &ProtocolError{\"not supported\"}\n)\n\n// ErrFrameTooLarge is returned by Codec's Receive method if payload size\n// exceeds limit set by Conn.MaxPayloadBytes\nvar ErrFrameTooLarge = errors.New(\"websocket: frame payload size exceeds limit\")\n\n// Addr is an implementation of net.Addr for WebSocket.\ntype Addr struct {\n\t*url.URL\n}\n\n// Network returns the network type for a WebSocket, \"websocket\".\nfunc (addr *Addr) Network() string { return \"websocket\" }\n\n// Config is a WebSocket configuration\ntype Config struct {\n\t// A WebSocket server address.\n\tLocation *url.URL\n\n\t// A Websocket client origin.\n\tOrigin *url.URL\n\n\t// WebSocket subprotocols.\n\tProtocol []string\n\n\t// WebSocket protocol version.\n\tVersion int\n\n\t// TLS config for secure WebSocket (wss).\n\tTlsConfig *tls.Config\n\n\t// Additional header fields to be sent in WebSocket opening handshake.\n\tHeader http.Header\n\n\t// Dialer used when opening websocket connections.\n\tDialer *net.Dialer\n\n\thandshakeData map[string]string\n}\n\n// serverHandshaker is an interface to handle WebSocket server side handshake.\ntype serverHandshaker interface {\n\t// ReadHandshake reads handshake request message from client.\n\t// Returns http response code and error if any.\n\tReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error)\n\n\t// AcceptHandshake accepts the client handshake request and sends\n\t// handshake response back to client.\n\tAcceptHandshake(buf *bufio.Writer) (err error)\n\n\t// NewServerConn creates a new WebSocket connection.\n\tNewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn)\n}\n\n// frameReader is an interface to read a WebSocket frame.\ntype frameReader interface {\n\t// Reader is to read payload of the frame.\n\tio.Reader\n\n\t// PayloadType returns payload type.\n\tPayloadType() byte\n\n\t// HeaderReader returns a reader to read header of the frame.\n\tHeaderReader() io.Reader\n\n\t// TrailerReader returns a reader to read trailer of the frame.\n\t// If it returns nil, there is no trailer in the frame.\n\tTrailerReader() io.Reader\n\n\t// Len returns total length of the frame, including header and trailer.\n\tLen() int\n}\n\n// frameReaderFactory is an interface to creates new frame reader.\ntype frameReaderFactory interface {\n\tNewFrameReader() (r frameReader, err error)\n}\n\n// frameWriter is an interface to write a WebSocket frame.\ntype frameWriter interface {\n\t// Writer is to write payload of the frame.\n\tio.WriteCloser\n}\n\n// frameWriterFactory is an interface to create new frame writer.\ntype frameWriterFactory interface {\n\tNewFrameWriter(payloadType byte) (w frameWriter, err error)\n}\n\ntype frameHandler interface {\n\tHandleFrame(frame frameReader) (r frameReader, err error)\n\tWriteClose(status int) (err error)\n}\n\n// Conn represents a WebSocket connection.\n//\n// Multiple goroutines may invoke methods on a Conn simultaneously.\ntype Conn struct {\n\tconfig  *Config\n\trequest *http.Request\n\n\tbuf *bufio.ReadWriter\n\trwc io.ReadWriteCloser\n\n\trio sync.Mutex\n\tframeReaderFactory\n\tframeReader\n\n\twio sync.Mutex\n\tframeWriterFactory\n\n\tframeHandler\n\tPayloadType        byte\n\tdefaultCloseStatus int\n\n\t// MaxPayloadBytes limits the size of frame payload received over Conn\n\t// by Codec's Receive method. If zero, DefaultMaxPayloadBytes is used.\n\tMaxPayloadBytes int\n}\n\n// Read implements the io.Reader interface:\n// it reads data of a frame from the WebSocket connection.\n// if msg is not large enough for the frame data, it fills the msg and next Read\n// will read the rest of the frame data.\n// it reads Text frame or Binary frame.\nfunc (ws *Conn) Read(msg []byte) (n int, err error) {\n\tws.rio.Lock()\n\tdefer ws.rio.Unlock()\nagain:\n\tif ws.frameReader == nil {\n\t\tframe, err := ws.frameReaderFactory.NewFrameReader()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tws.frameReader, err = ws.frameHandler.HandleFrame(frame)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tif ws.frameReader == nil {\n\t\t\tgoto again\n\t\t}\n\t}\n\tn, err = ws.frameReader.Read(msg)\n\tif err == io.EOF {\n\t\tif trailer := ws.frameReader.TrailerReader(); trailer != nil {\n\t\t\tio.Copy(ioutil.Discard, trailer)\n\t\t}\n\t\tws.frameReader = nil\n\t\tgoto again\n\t}\n\treturn n, err\n}\n\n// Write implements the io.Writer interface:\n// it writes data as a frame to the WebSocket connection.\nfunc (ws *Conn) Write(msg []byte) (n int, err error) {\n\tws.wio.Lock()\n\tdefer ws.wio.Unlock()\n\tw, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tn, err = w.Write(msg)\n\tw.Close()\n\treturn n, err\n}\n\n// Close implements the io.Closer interface.\nfunc (ws *Conn) Close() error {\n\terr := ws.frameHandler.WriteClose(ws.defaultCloseStatus)\n\terr1 := ws.rwc.Close()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn err1\n}\n\nfunc (ws *Conn) IsClientConn() bool { return ws.request == nil }\nfunc (ws *Conn) IsServerConn() bool { return ws.request != nil }\n\n// LocalAddr returns the WebSocket Origin for the connection for client, or\n// the WebSocket location for server.\nfunc (ws *Conn) LocalAddr() net.Addr {\n\tif ws.IsClientConn() {\n\t\treturn &Addr{ws.config.Origin}\n\t}\n\treturn &Addr{ws.config.Location}\n}\n\n// RemoteAddr returns the WebSocket location for the connection for client, or\n// the Websocket Origin for server.\nfunc (ws *Conn) RemoteAddr() net.Addr {\n\tif ws.IsClientConn() {\n\t\treturn &Addr{ws.config.Location}\n\t}\n\treturn &Addr{ws.config.Origin}\n}\n\nvar errSetDeadline = errors.New(\"websocket: cannot set deadline: not using a net.Conn\")\n\n// SetDeadline sets the connection's network read & write deadlines.\nfunc (ws *Conn) SetDeadline(t time.Time) error {\n\tif conn, ok := ws.rwc.(net.Conn); ok {\n\t\treturn conn.SetDeadline(t)\n\t}\n\treturn errSetDeadline\n}\n\n// SetReadDeadline sets the connection's network read deadline.\nfunc (ws *Conn) SetReadDeadline(t time.Time) error {\n\tif conn, ok := ws.rwc.(net.Conn); ok {\n\t\treturn conn.SetReadDeadline(t)\n\t}\n\treturn errSetDeadline\n}\n\n// SetWriteDeadline sets the connection's network write deadline.\nfunc (ws *Conn) SetWriteDeadline(t time.Time) error {\n\tif conn, ok := ws.rwc.(net.Conn); ok {\n\t\treturn conn.SetWriteDeadline(t)\n\t}\n\treturn errSetDeadline\n}\n\n// Config returns the WebSocket config.\nfunc (ws *Conn) Config() *Config { return ws.config }\n\n// Request returns the http request upgraded to the WebSocket.\n// It is nil for client side.\nfunc (ws *Conn) Request() *http.Request { return ws.request }\n\n// Codec represents a symmetric pair of functions that implement a codec.\ntype Codec struct {\n\tMarshal   func(v interface{}) (data []byte, payloadType byte, err error)\n\tUnmarshal func(data []byte, payloadType byte, v interface{}) (err error)\n}\n\n// Send sends v marshaled by cd.Marshal as single frame to ws.\nfunc (cd Codec) Send(ws *Conn, v interface{}) (err error) {\n\tdata, payloadType, err := cd.Marshal(v)\n\tif err != nil {\n\t\treturn err\n\t}\n\tws.wio.Lock()\n\tdefer ws.wio.Unlock()\n\tw, err := ws.frameWriterFactory.NewFrameWriter(payloadType)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, err = w.Write(data)\n\tw.Close()\n\treturn err\n}\n\n// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores\n// in v. The whole frame payload is read to an in-memory buffer; max size of\n// payload is defined by ws.MaxPayloadBytes. If frame payload size exceeds\n// limit, ErrFrameTooLarge is returned; in this case frame is not read off wire\n// completely. The next call to Receive would read and discard leftover data of\n// previous oversized frame before processing next frame.\nfunc (cd Codec) Receive(ws *Conn, v interface{}) (err error) {\n\tws.rio.Lock()\n\tdefer ws.rio.Unlock()\n\tif ws.frameReader != nil {\n\t\t_, err = io.Copy(ioutil.Discard, ws.frameReader)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tws.frameReader = nil\n\t}\nagain:\n\tframe, err := ws.frameReaderFactory.NewFrameReader()\n\tif err != nil {\n\t\treturn err\n\t}\n\tframe, err = ws.frameHandler.HandleFrame(frame)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif frame == nil {\n\t\tgoto again\n\t}\n\tmaxPayloadBytes := ws.MaxPayloadBytes\n\tif maxPayloadBytes == 0 {\n\t\tmaxPayloadBytes = DefaultMaxPayloadBytes\n\t}\n\tif hf, ok := frame.(*hybiFrameReader); ok && hf.header.Length > int64(maxPayloadBytes) {\n\t\t// payload size exceeds limit, no need to call Unmarshal\n\t\t//\n\t\t// set frameReader to current oversized frame so that\n\t\t// the next call to this function can drain leftover\n\t\t// data before processing the next frame\n\t\tws.frameReader = frame\n\t\treturn ErrFrameTooLarge\n\t}\n\tpayloadType := frame.PayloadType()\n\tdata, err := ioutil.ReadAll(frame)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn cd.Unmarshal(data, payloadType, v)\n}\n\nfunc marshal(v interface{}) (msg []byte, payloadType byte, err error) {\n\tswitch data := v.(type) {\n\tcase string:\n\t\treturn []byte(data), TextFrame, nil\n\tcase []byte:\n\t\treturn data, BinaryFrame, nil\n\t}\n\treturn nil, UnknownFrame, ErrNotSupported\n}\n\nfunc unmarshal(msg []byte, payloadType byte, v interface{}) (err error) {\n\tswitch data := v.(type) {\n\tcase *string:\n\t\t*data = string(msg)\n\t\treturn nil\n\tcase *[]byte:\n\t\t*data = msg\n\t\treturn nil\n\t}\n\treturn ErrNotSupported\n}\n\n/*\nMessage is a codec to send/receive text/binary data in a frame on WebSocket connection.\nTo send/receive text frame, use string type.\nTo send/receive binary frame, use []byte type.\n\nTrivial usage:\n\n\timport \"websocket\"\n\n\t// receive text frame\n\tvar message string\n\twebsocket.Message.Receive(ws, &message)\n\n\t// send text frame\n\tmessage = \"hello\"\n\twebsocket.Message.Send(ws, message)\n\n\t// receive binary frame\n\tvar data []byte\n\twebsocket.Message.Receive(ws, &data)\n\n\t// send binary frame\n\tdata = []byte{0, 1, 2}\n\twebsocket.Message.Send(ws, data)\n\n*/\nvar Message = Codec{marshal, unmarshal}\n\nfunc jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) {\n\tmsg, err = json.Marshal(v)\n\treturn msg, TextFrame, err\n}\n\nfunc jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) {\n\treturn json.Unmarshal(msg, v)\n}\n\n/*\nJSON is a codec to send/receive JSON data in a frame from a WebSocket connection.\n\nTrivial usage:\n\n\timport \"websocket\"\n\n\ttype T struct {\n\t\tMsg string\n\t\tCount int\n\t}\n\n\t// receive JSON type T\n\tvar data T\n\twebsocket.JSON.Receive(ws, &data)\n\n\t// send JSON type T\n\twebsocket.JSON.Send(ws, data)\n*/\nvar JSON = Codec{jsonMarshal, jsonUnmarshal}\n"
  },
  {
    "path": "vendor/golang.org/x/sync/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/golang.org/x/sync/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "vendor/golang.org/x/sync/syncmap/map.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package syncmap provides a concurrent map implementation.\n// It is a prototype for a proposed addition to the sync package\n// in the standard library.\n// (https://golang.org/issue/18177)\npackage syncmap\n\nimport (\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"unsafe\"\n)\n\n// Map is a concurrent map with amortized-constant-time loads, stores, and deletes.\n// It is safe for multiple goroutines to call a Map's methods concurrently.\n//\n// The zero Map is valid and empty.\n//\n// A Map must not be copied after first use.\ntype Map struct {\n\tmu sync.Mutex\n\n\t// read contains the portion of the map's contents that are safe for\n\t// concurrent access (with or without mu held).\n\t//\n\t// The read field itself is always safe to load, but must only be stored with\n\t// mu held.\n\t//\n\t// Entries stored in read may be updated concurrently without mu, but updating\n\t// a previously-expunged entry requires that the entry be copied to the dirty\n\t// map and unexpunged with mu held.\n\tread atomic.Value // readOnly\n\n\t// dirty contains the portion of the map's contents that require mu to be\n\t// held. To ensure that the dirty map can be promoted to the read map quickly,\n\t// it also includes all of the non-expunged entries in the read map.\n\t//\n\t// Expunged entries are not stored in the dirty map. An expunged entry in the\n\t// clean map must be unexpunged and added to the dirty map before a new value\n\t// can be stored to it.\n\t//\n\t// If the dirty map is nil, the next write to the map will initialize it by\n\t// making a shallow copy of the clean map, omitting stale entries.\n\tdirty map[interface{}]*entry\n\n\t// misses counts the number of loads since the read map was last updated that\n\t// needed to lock mu to determine whether the key was present.\n\t//\n\t// Once enough misses have occurred to cover the cost of copying the dirty\n\t// map, the dirty map will be promoted to the read map (in the unamended\n\t// state) and the next store to the map will make a new dirty copy.\n\tmisses int\n}\n\n// readOnly is an immutable struct stored atomically in the Map.read field.\ntype readOnly struct {\n\tm       map[interface{}]*entry\n\tamended bool // true if the dirty map contains some key not in m.\n}\n\n// expunged is an arbitrary pointer that marks entries which have been deleted\n// from the dirty map.\nvar expunged = unsafe.Pointer(new(interface{}))\n\n// An entry is a slot in the map corresponding to a particular key.\ntype entry struct {\n\t// p points to the interface{} value stored for the entry.\n\t//\n\t// If p == nil, the entry has been deleted and m.dirty == nil.\n\t//\n\t// If p == expunged, the entry has been deleted, m.dirty != nil, and the entry\n\t// is missing from m.dirty.\n\t//\n\t// Otherwise, the entry is valid and recorded in m.read.m[key] and, if m.dirty\n\t// != nil, in m.dirty[key].\n\t//\n\t// An entry can be deleted by atomic replacement with nil: when m.dirty is\n\t// next created, it will atomically replace nil with expunged and leave\n\t// m.dirty[key] unset.\n\t//\n\t// An entry's associated value can be updated by atomic replacement, provided\n\t// p != expunged. If p == expunged, an entry's associated value can be updated\n\t// only after first setting m.dirty[key] = e so that lookups using the dirty\n\t// map find the entry.\n\tp unsafe.Pointer // *interface{}\n}\n\nfunc newEntry(i interface{}) *entry {\n\treturn &entry{p: unsafe.Pointer(&i)}\n}\n\n// Load returns the value stored in the map for a key, or nil if no\n// value is present.\n// The ok result indicates whether value was found in the map.\nfunc (m *Map) Load(key interface{}) (value interface{}, ok bool) {\n\tread, _ := m.read.Load().(readOnly)\n\te, ok := read.m[key]\n\tif !ok && read.amended {\n\t\tm.mu.Lock()\n\t\t// Avoid reporting a spurious miss if m.dirty got promoted while we were\n\t\t// blocked on m.mu. (If further loads of the same key will not miss, it's\n\t\t// not worth copying the dirty map for this key.)\n\t\tread, _ = m.read.Load().(readOnly)\n\t\te, ok = read.m[key]\n\t\tif !ok && read.amended {\n\t\t\te, ok = m.dirty[key]\n\t\t\t// Regardless of whether the entry was present, record a miss: this key\n\t\t\t// will take the slow path until the dirty map is promoted to the read\n\t\t\t// map.\n\t\t\tm.missLocked()\n\t\t}\n\t\tm.mu.Unlock()\n\t}\n\tif !ok {\n\t\treturn nil, false\n\t}\n\treturn e.load()\n}\n\nfunc (e *entry) load() (value interface{}, ok bool) {\n\tp := atomic.LoadPointer(&e.p)\n\tif p == nil || p == expunged {\n\t\treturn nil, false\n\t}\n\treturn *(*interface{})(p), true\n}\n\n// Store sets the value for a key.\nfunc (m *Map) Store(key, value interface{}) {\n\tread, _ := m.read.Load().(readOnly)\n\tif e, ok := read.m[key]; ok && e.tryStore(&value) {\n\t\treturn\n\t}\n\n\tm.mu.Lock()\n\tread, _ = m.read.Load().(readOnly)\n\tif e, ok := read.m[key]; ok {\n\t\tif e.unexpungeLocked() {\n\t\t\t// The entry was previously expunged, which implies that there is a\n\t\t\t// non-nil dirty map and this entry is not in it.\n\t\t\tm.dirty[key] = e\n\t\t}\n\t\te.storeLocked(&value)\n\t} else if e, ok := m.dirty[key]; ok {\n\t\te.storeLocked(&value)\n\t} else {\n\t\tif !read.amended {\n\t\t\t// We're adding the first new key to the dirty map.\n\t\t\t// Make sure it is allocated and mark the read-only map as incomplete.\n\t\t\tm.dirtyLocked()\n\t\t\tm.read.Store(readOnly{m: read.m, amended: true})\n\t\t}\n\t\tm.dirty[key] = newEntry(value)\n\t}\n\tm.mu.Unlock()\n}\n\n// tryStore stores a value if the entry has not been expunged.\n//\n// If the entry is expunged, tryStore returns false and leaves the entry\n// unchanged.\nfunc (e *entry) tryStore(i *interface{}) bool {\n\tp := atomic.LoadPointer(&e.p)\n\tif p == expunged {\n\t\treturn false\n\t}\n\tfor {\n\t\tif atomic.CompareAndSwapPointer(&e.p, p, unsafe.Pointer(i)) {\n\t\t\treturn true\n\t\t}\n\t\tp = atomic.LoadPointer(&e.p)\n\t\tif p == expunged {\n\t\t\treturn false\n\t\t}\n\t}\n}\n\n// unexpungeLocked ensures that the entry is not marked as expunged.\n//\n// If the entry was previously expunged, it must be added to the dirty map\n// before m.mu is unlocked.\nfunc (e *entry) unexpungeLocked() (wasExpunged bool) {\n\treturn atomic.CompareAndSwapPointer(&e.p, expunged, nil)\n}\n\n// storeLocked unconditionally stores a value to the entry.\n//\n// The entry must be known not to be expunged.\nfunc (e *entry) storeLocked(i *interface{}) {\n\tatomic.StorePointer(&e.p, unsafe.Pointer(i))\n}\n\n// LoadOrStore returns the existing value for the key if present.\n// Otherwise, it stores and returns the given value.\n// The loaded result is true if the value was loaded, false if stored.\nfunc (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) {\n\t// Avoid locking if it's a clean hit.\n\tread, _ := m.read.Load().(readOnly)\n\tif e, ok := read.m[key]; ok {\n\t\tactual, loaded, ok := e.tryLoadOrStore(value)\n\t\tif ok {\n\t\t\treturn actual, loaded\n\t\t}\n\t}\n\n\tm.mu.Lock()\n\tread, _ = m.read.Load().(readOnly)\n\tif e, ok := read.m[key]; ok {\n\t\tif e.unexpungeLocked() {\n\t\t\tm.dirty[key] = e\n\t\t}\n\t\tactual, loaded, _ = e.tryLoadOrStore(value)\n\t} else if e, ok := m.dirty[key]; ok {\n\t\tactual, loaded, _ = e.tryLoadOrStore(value)\n\t\tm.missLocked()\n\t} else {\n\t\tif !read.amended {\n\t\t\t// We're adding the first new key to the dirty map.\n\t\t\t// Make sure it is allocated and mark the read-only map as incomplete.\n\t\t\tm.dirtyLocked()\n\t\t\tm.read.Store(readOnly{m: read.m, amended: true})\n\t\t}\n\t\tm.dirty[key] = newEntry(value)\n\t\tactual, loaded = value, false\n\t}\n\tm.mu.Unlock()\n\n\treturn actual, loaded\n}\n\n// tryLoadOrStore atomically loads or stores a value if the entry is not\n// expunged.\n//\n// If the entry is expunged, tryLoadOrStore leaves the entry unchanged and\n// returns with ok==false.\nfunc (e *entry) tryLoadOrStore(i interface{}) (actual interface{}, loaded, ok bool) {\n\tp := atomic.LoadPointer(&e.p)\n\tif p == expunged {\n\t\treturn nil, false, false\n\t}\n\tif p != nil {\n\t\treturn *(*interface{})(p), true, true\n\t}\n\n\t// Copy the interface after the first load to make this method more amenable\n\t// to escape analysis: if we hit the \"load\" path or the entry is expunged, we\n\t// shouldn't bother heap-allocating.\n\tic := i\n\tfor {\n\t\tif atomic.CompareAndSwapPointer(&e.p, nil, unsafe.Pointer(&ic)) {\n\t\t\treturn i, false, true\n\t\t}\n\t\tp = atomic.LoadPointer(&e.p)\n\t\tif p == expunged {\n\t\t\treturn nil, false, false\n\t\t}\n\t\tif p != nil {\n\t\t\treturn *(*interface{})(p), true, true\n\t\t}\n\t}\n}\n\n// Delete deletes the value for a key.\nfunc (m *Map) Delete(key interface{}) {\n\tread, _ := m.read.Load().(readOnly)\n\te, ok := read.m[key]\n\tif !ok && read.amended {\n\t\tm.mu.Lock()\n\t\tread, _ = m.read.Load().(readOnly)\n\t\te, ok = read.m[key]\n\t\tif !ok && read.amended {\n\t\t\tdelete(m.dirty, key)\n\t\t}\n\t\tm.mu.Unlock()\n\t}\n\tif ok {\n\t\te.delete()\n\t}\n}\n\nfunc (e *entry) delete() (hadValue bool) {\n\tfor {\n\t\tp := atomic.LoadPointer(&e.p)\n\t\tif p == nil || p == expunged {\n\t\t\treturn false\n\t\t}\n\t\tif atomic.CompareAndSwapPointer(&e.p, p, nil) {\n\t\t\treturn true\n\t\t}\n\t}\n}\n\n// Range calls f sequentially for each key and value present in the map.\n// If f returns false, range stops the iteration.\n//\n// Range does not necessarily correspond to any consistent snapshot of the Map's\n// contents: no key will be visited more than once, but if the value for any key\n// is stored or deleted concurrently, Range may reflect any mapping for that key\n// from any point during the Range call.\n//\n// Range may be O(N) with the number of elements in the map even if f returns\n// false after a constant number of calls.\nfunc (m *Map) Range(f func(key, value interface{}) bool) {\n\t// We need to be able to iterate over all of the keys that were already\n\t// present at the start of the call to Range.\n\t// If read.amended is false, then read.m satisfies that property without\n\t// requiring us to hold m.mu for a long time.\n\tread, _ := m.read.Load().(readOnly)\n\tif read.amended {\n\t\t// m.dirty contains keys not in read.m. Fortunately, Range is already O(N)\n\t\t// (assuming the caller does not break out early), so a call to Range\n\t\t// amortizes an entire copy of the map: we can promote the dirty copy\n\t\t// immediately!\n\t\tm.mu.Lock()\n\t\tread, _ = m.read.Load().(readOnly)\n\t\tif read.amended {\n\t\t\tread = readOnly{m: m.dirty}\n\t\t\tm.read.Store(read)\n\t\t\tm.dirty = nil\n\t\t\tm.misses = 0\n\t\t}\n\t\tm.mu.Unlock()\n\t}\n\n\tfor k, e := range read.m {\n\t\tv, ok := e.load()\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tif !f(k, v) {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (m *Map) missLocked() {\n\tm.misses++\n\tif m.misses < len(m.dirty) {\n\t\treturn\n\t}\n\tm.read.Store(readOnly{m: m.dirty})\n\tm.dirty = nil\n\tm.misses = 0\n}\n\nfunc (m *Map) dirtyLocked() {\n\tif m.dirty != nil {\n\t\treturn\n\t}\n\n\tread, _ := m.read.Load().(readOnly)\n\tm.dirty = make(map[interface{}]*entry, len(read.m))\n\tfor k, e := range read.m {\n\t\tif !e.tryExpungeLocked() {\n\t\t\tm.dirty[k] = e\n\t\t}\n\t}\n}\n\nfunc (e *entry) tryExpungeLocked() (isExpunged bool) {\n\tp := atomic.LoadPointer(&e.p)\n\tfor p == nil {\n\t\tif atomic.CompareAndSwapPointer(&e.p, nil, expunged) {\n\t\t\treturn true\n\t\t}\n\t\tp = atomic.LoadPointer(&e.p)\n\t}\n\treturn p == expunged\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/.gitattributes",
    "content": "# Treat all files in this repo as binary, with no git magic updating\n# line endings. Windows users contributing to Go will need to use a\n# modern version of git and editors capable of LF line endings.\n#\n# We'll prevent accidental CRLF line endings from entering the repo\n# via the git-review gofmt checks.\n#\n# See golang.org/issue/9281\n\n* -text\n"
  },
  {
    "path": "vendor/golang.org/x/sys/.gitignore",
    "content": "# Add no patterns to .hgignore except for files generated by the build.\nlast-change\n"
  },
  {
    "path": "vendor/golang.org/x/sys/AUTHORS",
    "content": "# This source code refers to The Go Authors for copyright purposes.\n# The master list of authors is in the main Go distribution,\n# visible at http://tip.golang.org/AUTHORS.\n"
  },
  {
    "path": "vendor/golang.org/x/sys/CONTRIBUTING.md",
    "content": "# Contributing to Go\n\nGo is an open source project.\n\nIt is the work of hundreds of contributors. We appreciate your help!\n\n\n## Filing issues\n\nWhen [filing an issue](https://golang.org/issue/new), make sure to answer these five questions:\n\n1. What version of Go are you using (`go version`)?\n2. What operating system and processor architecture are you using?\n3. What did you do?\n4. What did you expect to see?\n5. What did you see instead?\n\nGeneral questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.\nThe gophers there will answer or ask you to file an issue if you've tripped over a bug.\n\n## Contributing code\n\nPlease read the [Contribution Guidelines](https://golang.org/doc/contribute.html)\nbefore sending patches.\n\n**We do not accept GitHub pull requests**\n(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review).\n\nUnless otherwise noted, the Go source files are distributed under\nthe BSD-style license found in the LICENSE file.\n\n"
  },
  {
    "path": "vendor/golang.org/x/sys/CONTRIBUTORS",
    "content": "# This source code was written by the Go contributors.\n# The master list of contributors is in the main Go distribution,\n# visible at http://tip.golang.org/CONTRIBUTORS.\n"
  },
  {
    "path": "vendor/golang.org/x/sys/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/golang.org/x/sys/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "vendor/golang.org/x/sys/README",
    "content": "This repository holds supplemental Go packages for low-level interactions with the operating system.\n\nTo submit changes to this repository, see http://golang.org/doc/contribute.html.\n"
  },
  {
    "path": "vendor/golang.org/x/sys/codereview.cfg",
    "content": "issuerepo: golang/go\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/README.md",
    "content": "# Building `sys/unix`\n\nThe sys/unix package provides access to the raw system call interface of the\nunderlying operating system. See: https://godoc.org/golang.org/x/sys/unix\n\nPorting Go to a new architecture/OS combination or adding syscalls, types, or\nconstants to an existing architecture/OS pair requires some manual effort;\nhowever, there are tools that automate much of the process.\n\n## Build Systems\n\nThere are currently two ways we generate the necessary files. We are currently\nmigrating the build system to use containers so the builds are reproducible.\nThis is being done on an OS-by-OS basis. Please update this documentation as\ncomponents of the build system change.\n\n### Old Build System (currently for `GOOS != \"Linux\" || GOARCH == \"sparc64\"`)\n\nThe old build system generates the Go files based on the C header files\npresent on your system. This means that files\nfor a given GOOS/GOARCH pair must be generated on a system with that OS and\narchitecture. This also means that the generated code can differ from system\nto system, based on differences in the header files.\n\nTo avoid this, if you are using the old build system, only generate the Go\nfiles on an installation with unmodified header files. It is also important to\nkeep track of which version of the OS the files were generated from (ex.\nDarwin 14 vs Darwin 15). This makes it easier to track the progress of changes\nand have each OS upgrade correspond to a single change.\n\nTo build the files for your current OS and architecture, make sure GOOS and\nGOARCH are set correctly and run `mkall.sh`. This will generate the files for\nyour specific system. Running `mkall.sh -n` shows the commands that will be run.\n\nRequirements: bash, perl, go\n\n### New Build System (currently for `GOOS == \"Linux\" && GOARCH != \"sparc64\"`)\n\nThe new build system uses a Docker container to generate the go files directly\nfrom source checkouts of the kernel and various system libraries. This means\nthat on any platform that supports Docker, all the files using the new build\nsystem can be generated at once, and generated files will not change based on\nwhat the person running the scripts has installed on their computer.\n\nThe OS specific files for the new build system are located in the `${GOOS}`\ndirectory, and the build is coordinated by the `${GOOS}/mkall.go` program. When\nthe kernel or system library updates, modify the Dockerfile at\n`${GOOS}/Dockerfile` to checkout the new release of the source.\n\nTo build all the files under the new build system, you must be on an amd64/Linux\nsystem and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will\nthen generate all of the files for all of the GOOS/GOARCH pairs in the new build\nsystem. Running `mkall.sh -n` shows the commands that will be run.\n\nRequirements: bash, perl, go, docker\n\n## Component files\n\nThis section describes the various files used in the code generation process.\nIt also contains instructions on how to modify these files to add a new\narchitecture/OS or to add additional syscalls, types, or constants. Note that\nif you are using the new build system, the scripts cannot be called normally.\nThey must be called from within the docker container.\n\n### asm files\n\nThe hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system\ncall dispatch. There are three entry points:\n```\n  func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)\n  func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)\n  func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)\n```\nThe first and second are the standard ones; they differ only in how many\narguments can be passed to the kernel. The third is for low-level use by the\nForkExec wrapper. Unlike the first two, it does not call into the scheduler to\nlet it know that a system call is running.\n\nWhen porting Go to an new architecture/OS, this file must be implemented for\neach GOOS/GOARCH pair.\n\n### mksysnum\n\nMksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl`\nfor the old system). This script takes in a list of header files containing the\nsyscall number declarations and parses them to produce the corresponding list of\nGo numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated\nconstants.\n\nAdding new syscall numbers is mostly done by running the build on a sufficiently\nnew installation of the target OS (or updating the source checkouts for the\nnew build system). However, depending on the OS, you make need to update the\nparsing in mksysnum.\n\n### mksyscall.pl\n\nThe `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are\nhand-written Go files which implement system calls (for unix, the specific OS,\nor the specific OS/Architecture pair respectively) that need special handling\nand list `//sys` comments giving prototypes for ones that can be generated.\n\nThe mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts\nthem into syscalls. This requires the name of the prototype in the comment to\nmatch a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function\nprototype can be exported (capitalized) or not.\n\nAdding a new syscall often just requires adding a new `//sys` function prototype\nwith the desired arguments and a capitalized name so it is exported. However, if\nyou want the interface to the syscall to be different, often one will make an\nunexported `//sys` prototype, an then write a custom wrapper in\n`syscall_${GOOS}.go`.\n\n### types files\n\nFor each OS, there is a hand-written Go file at `${GOOS}/types.go` (or\n`types_${GOOS}.go` on the old system). This file includes standard C headers and\ncreates Go type aliases to the corresponding C types. The file is then fed\nthrough godef to get the Go compatible definitions. Finally, the generated code\nis fed though mkpost.go to format the code correctly and remove any hidden or\nprivate identifiers. This cleaned-up code is written to\n`ztypes_${GOOS}_${GOARCH}.go`.\n\nThe hardest part about preparing this file is figuring out which headers to\ninclude and which symbols need to be `#define`d to get the actual data\nstructures that pass through to the kernel system calls. Some C libraries\npreset alternate versions for binary compatibility and translate them on the\nway in and out of system calls, but there is almost always a `#define` that can\nget the real ones.\nSee `types_darwin.go` and `linux/types.go` for examples.\n\nTo add a new type, add in the necessary include statement at the top of the\nfile (if it is not already there) and add in a type alias line. Note that if\nyour type is significantly different on different architectures, you may need\nsome `#if/#elif` macros in your include statements.\n\n### mkerrors.sh\n\nThis script is used to generate the system's various constants. This doesn't\njust include the error numbers and error strings, but also the signal numbers\nan a wide variety of miscellaneous constants. The constants come from the list\nof include files in the `includes_${uname}` variable. A regex then picks out\nthe desired `#define` statements, and generates the corresponding Go constants.\nThe error numbers and strings are generated from `#include <errno.h>`, and the\nsignal numbers and strings are generated from `#include <signal.h>`. All of\nthese constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program,\n`_errors.c`, which prints out all the constants.\n\nTo add a constant, add the header that includes it to the appropriate variable.\nThen, edit the regex (if necessary) to match the desired constant. Avoid making\nthe regex too broad to avoid matching unintended constants.\n\n\n## Generated files\n\n### `zerror_${GOOS}_${GOARCH}.go`\n\nA file containing all of the system's generated error numbers, error strings,\nsignal numbers, and constants. Generated by `mkerrors.sh` (see above).\n\n### `zsyscall_${GOOS}_${GOARCH}.go`\n\nA file containing all the generated syscalls for a specific GOOS and GOARCH.\nGenerated by `mksyscall.pl` (see above).\n\n### `zsysnum_${GOOS}_${GOARCH}.go`\n\nA list of numeric constants for all the syscall number of the specific GOOS\nand GOARCH. Generated by mksysnum (see above).\n\n### `ztypes_${GOOS}_${GOARCH}.go`\n\nA file containing Go types for passing into (or returning from) syscalls.\nGenerated by godefs and the types file (see above).\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_darwin_386.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for 386, Darwin\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_darwin_amd64.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for AMD64, Darwin\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-104\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_darwin_arm.s",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n// +build arm,darwin\n\n#include \"textflag.h\"\n\n//\n// System call support for ARM, Darwin\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tB\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_darwin_arm64.s",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n// +build arm64,darwin\n\n#include \"textflag.h\"\n\n//\n// System call support for AMD64, Darwin\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tB\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-80\n\tB\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-104\n\tB\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-56\n\tB\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-80\n\tB\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for AMD64, DragonFly\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-64\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-88\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-112\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-64\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-88\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_freebsd_386.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for 386, FreeBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for AMD64, FreeBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-104\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_freebsd_arm.s",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for ARM, FreeBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tB\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_386.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for 386, Linux\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·RawSyscall6(SB)\n\nTEXT ·socketcall(SB),NOSPLIT,$0-36\n\tJMP\tsyscall·socketcall(SB)\n\nTEXT ·rawsocketcall(SB),NOSPLIT,$0-36\n\tJMP\tsyscall·rawsocketcall(SB)\n\nTEXT ·seek(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·seek(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_amd64.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for AMD64, Linux\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT ·RawSyscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·RawSyscall6(SB)\n\nTEXT ·gettimeofday(SB),NOSPLIT,$0-16\n\tJMP\tsyscall·gettimeofday(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_arm.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for arm, Linux\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·Syscall6(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·RawSyscall6(SB)\n\nTEXT ·seek(SB),NOSPLIT,$0-32\n\tB\tsyscall·seek(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_arm64.s",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux\n// +build arm64\n// +build !gccgo\n\n#include \"textflag.h\"\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tB\tsyscall·Syscall(SB)\n\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tB\tsyscall·Syscall6(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-56\n\tB\tsyscall·RawSyscall(SB)\n\nTEXT ·RawSyscall6(SB),NOSPLIT,$0-80\n\tB\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_mips64x.s",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux\n// +build mips64 mips64le\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for mips64, Linux\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_mipsx.s",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux\n// +build mips mipsle\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for mips, Linux\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tJMP syscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tJMP syscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tJMP syscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-28\n\tJMP syscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tJMP syscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux\n// +build ppc64 ppc64le\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for ppc64, Linux\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tBR\tsyscall·Syscall(SB)\n\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tBR\tsyscall·Syscall6(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-56\n\tBR\tsyscall·RawSyscall(SB)\n\nTEXT ·RawSyscall6(SB),NOSPLIT,$0-80\n\tBR\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_linux_s390x.s",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build s390x\n// +build linux\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for s390x, Linux\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT ·Syscall(SB),NOSPLIT,$0-56\n\tBR\tsyscall·Syscall(SB)\n\nTEXT ·Syscall6(SB),NOSPLIT,$0-80\n\tBR\tsyscall·Syscall6(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-56\n\tBR\tsyscall·RawSyscall(SB)\n\nTEXT ·RawSyscall6(SB),NOSPLIT,$0-80\n\tBR\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_netbsd_386.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for 386, NetBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for AMD64, NetBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-104\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_netbsd_arm.s",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for ARM, NetBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tB\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_openbsd_386.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for 386, OpenBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT ·RawSyscall(SB),NOSPLIT,$0-28\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for AMD64, OpenBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-104\n\tJMP\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-56\n\tJMP\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-80\n\tJMP\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_openbsd_arm.s",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System call support for ARM, OpenBSD\n//\n\n// Just jump to package syscall's implementation for all these functions.\n// The runtime may know about them.\n\nTEXT\t·Syscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·Syscall(SB)\n\nTEXT\t·Syscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·Syscall6(SB)\n\nTEXT\t·Syscall9(SB),NOSPLIT,$0-52\n\tB\tsyscall·Syscall9(SB)\n\nTEXT\t·RawSyscall(SB),NOSPLIT,$0-28\n\tB\tsyscall·RawSyscall(SB)\n\nTEXT\t·RawSyscall6(SB),NOSPLIT,$0-40\n\tB\tsyscall·RawSyscall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/asm_solaris_amd64.s",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !gccgo\n\n#include \"textflag.h\"\n\n//\n// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go\n//\n\nTEXT ·sysvicall6(SB),NOSPLIT,$0-88\n\tJMP\tsyscall·sysvicall6(SB)\n\nTEXT ·rawSysvicall6(SB),NOSPLIT,$0-88\n\tJMP\tsyscall·rawSysvicall6(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/bluetooth_linux.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Bluetooth sockets and messages\n\npackage unix\n\n// Bluetooth Protocols\nconst (\n\tBTPROTO_L2CAP  = 0\n\tBTPROTO_HCI    = 1\n\tBTPROTO_SCO    = 2\n\tBTPROTO_RFCOMM = 3\n\tBTPROTO_BNEP   = 4\n\tBTPROTO_CMTP   = 5\n\tBTPROTO_HIDP   = 6\n\tBTPROTO_AVDTP  = 7\n)\n\nconst (\n\tHCI_CHANNEL_RAW     = 0\n\tHCI_CHANNEL_USER    = 1\n\tHCI_CHANNEL_MONITOR = 2\n\tHCI_CHANNEL_CONTROL = 3\n)\n\n// Socketoption Level\nconst (\n\tSOL_BLUETOOTH = 0x112\n\tSOL_HCI       = 0x0\n\tSOL_L2CAP     = 0x6\n\tSOL_RFCOMM    = 0x12\n\tSOL_SCO       = 0x11\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/cap_freebsd.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build freebsd\n\npackage unix\n\nimport (\n\terrorspkg \"errors\"\n\t\"fmt\"\n)\n\n// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c\n\nconst (\n\t// This is the version of CapRights this package understands. See C implementation for parallels.\n\tcapRightsGoVersion = CAP_RIGHTS_VERSION_00\n\tcapArSizeMin       = CAP_RIGHTS_VERSION_00 + 2\n\tcapArSizeMax       = capRightsGoVersion + 2\n)\n\nvar (\n\tbit2idx = []int{\n\t\t-1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1,\n\t\t4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n\t}\n)\n\nfunc capidxbit(right uint64) int {\n\treturn int((right >> 57) & 0x1f)\n}\n\nfunc rightToIndex(right uint64) (int, error) {\n\tidx := capidxbit(right)\n\tif idx < 0 || idx >= len(bit2idx) {\n\t\treturn -2, fmt.Errorf(\"index for right 0x%x out of range\", right)\n\t}\n\treturn bit2idx[idx], nil\n}\n\nfunc caprver(right uint64) int {\n\treturn int(right >> 62)\n}\n\nfunc capver(rights *CapRights) int {\n\treturn caprver(rights.Rights[0])\n}\n\nfunc caparsize(rights *CapRights) int {\n\treturn capver(rights) + 2\n}\n\n// CapRightsSet sets the permissions in setrights in rights.\nfunc CapRightsSet(rights *CapRights, setrights []uint64) error {\n\t// This is essentially a copy of cap_rights_vset()\n\tif capver(rights) != CAP_RIGHTS_VERSION_00 {\n\t\treturn fmt.Errorf(\"bad rights version %d\", capver(rights))\n\t}\n\n\tn := caparsize(rights)\n\tif n < capArSizeMin || n > capArSizeMax {\n\t\treturn errorspkg.New(\"bad rights size\")\n\t}\n\n\tfor _, right := range setrights {\n\t\tif caprver(right) != CAP_RIGHTS_VERSION_00 {\n\t\t\treturn errorspkg.New(\"bad right version\")\n\t\t}\n\t\ti, err := rightToIndex(right)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif i >= n {\n\t\t\treturn errorspkg.New(\"index overflow\")\n\t\t}\n\t\tif capidxbit(rights.Rights[i]) != capidxbit(right) {\n\t\t\treturn errorspkg.New(\"index mismatch\")\n\t\t}\n\t\trights.Rights[i] |= right\n\t\tif capidxbit(rights.Rights[i]) != capidxbit(right) {\n\t\t\treturn errorspkg.New(\"index mismatch (after assign)\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// CapRightsClear clears the permissions in clearrights from rights.\nfunc CapRightsClear(rights *CapRights, clearrights []uint64) error {\n\t// This is essentially a copy of cap_rights_vclear()\n\tif capver(rights) != CAP_RIGHTS_VERSION_00 {\n\t\treturn fmt.Errorf(\"bad rights version %d\", capver(rights))\n\t}\n\n\tn := caparsize(rights)\n\tif n < capArSizeMin || n > capArSizeMax {\n\t\treturn errorspkg.New(\"bad rights size\")\n\t}\n\n\tfor _, right := range clearrights {\n\t\tif caprver(right) != CAP_RIGHTS_VERSION_00 {\n\t\t\treturn errorspkg.New(\"bad right version\")\n\t\t}\n\t\ti, err := rightToIndex(right)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif i >= n {\n\t\t\treturn errorspkg.New(\"index overflow\")\n\t\t}\n\t\tif capidxbit(rights.Rights[i]) != capidxbit(right) {\n\t\t\treturn errorspkg.New(\"index mismatch\")\n\t\t}\n\t\trights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF)\n\t\tif capidxbit(rights.Rights[i]) != capidxbit(right) {\n\t\t\treturn errorspkg.New(\"index mismatch (after assign)\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// CapRightsIsSet checks whether all the permissions in setrights are present in rights.\nfunc CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) {\n\t// This is essentially a copy of cap_rights_is_vset()\n\tif capver(rights) != CAP_RIGHTS_VERSION_00 {\n\t\treturn false, fmt.Errorf(\"bad rights version %d\", capver(rights))\n\t}\n\n\tn := caparsize(rights)\n\tif n < capArSizeMin || n > capArSizeMax {\n\t\treturn false, errorspkg.New(\"bad rights size\")\n\t}\n\n\tfor _, right := range setrights {\n\t\tif caprver(right) != CAP_RIGHTS_VERSION_00 {\n\t\t\treturn false, errorspkg.New(\"bad right version\")\n\t\t}\n\t\ti, err := rightToIndex(right)\n\t\tif err != nil {\n\t\t\treturn false, err\n\t\t}\n\t\tif i >= n {\n\t\t\treturn false, errorspkg.New(\"index overflow\")\n\t\t}\n\t\tif capidxbit(rights.Rights[i]) != capidxbit(right) {\n\t\t\treturn false, errorspkg.New(\"index mismatch\")\n\t\t}\n\t\tif (rights.Rights[i] & right) != right {\n\t\t\treturn false, nil\n\t\t}\n\t}\n\n\treturn true, nil\n}\n\nfunc capright(idx uint64, bit uint64) uint64 {\n\treturn ((1 << (57 + idx)) | bit)\n}\n\n// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights.\n// See man cap_rights_init(3) and rights(4).\nfunc CapRightsInit(rights []uint64) (*CapRights, error) {\n\tvar r CapRights\n\tr.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0)\n\tr.Rights[1] = capright(1, 0)\n\n\terr := CapRightsSet(&r, rights)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &r, nil\n}\n\n// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights.\n// The capability rights on fd can never be increased by CapRightsLimit.\n// See man cap_rights_limit(2) and rights(4).\nfunc CapRightsLimit(fd uintptr, rights *CapRights) error {\n\treturn capRightsLimit(int(fd), rights)\n}\n\n// CapRightsGet returns a CapRights structure containing the operations permitted on fd.\n// See man cap_rights_get(3) and rights(4).\nfunc CapRightsGet(fd uintptr) (*CapRights, error) {\n\tr, err := CapRightsInit(nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = capRightsGet(capRightsGoVersion, int(fd), r)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn r, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/constants.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\npackage unix\n\nconst (\n\tR_OK = 0x4\n\tW_OK = 0x2\n\tX_OK = 0x1\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/dev_darwin.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Functions to access/create device major and minor numbers matching the\n// encoding used in Darwin's sys/types.h header.\n\npackage unix\n\n// Major returns the major component of a Darwin device number.\nfunc Major(dev uint64) uint32 {\n\treturn uint32((dev >> 24) & 0xff)\n}\n\n// Minor returns the minor component of a Darwin device number.\nfunc Minor(dev uint64) uint32 {\n\treturn uint32(dev & 0xffffff)\n}\n\n// Mkdev returns a Darwin device number generated from the given major and minor\n// components.\nfunc Mkdev(major, minor uint32) uint64 {\n\treturn (uint64(major) << 24) | uint64(minor)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/dev_dragonfly.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Functions to access/create device major and minor numbers matching the\n// encoding used in Dragonfly's sys/types.h header.\n//\n// The information below is extracted and adapted from sys/types.h:\n//\n// Minor gives a cookie instead of an index since in order to avoid changing the\n// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for\n// devices that don't use them.\n\npackage unix\n\n// Major returns the major component of a DragonFlyBSD device number.\nfunc Major(dev uint64) uint32 {\n\treturn uint32((dev >> 8) & 0xff)\n}\n\n// Minor returns the minor component of a DragonFlyBSD device number.\nfunc Minor(dev uint64) uint32 {\n\treturn uint32(dev & 0xffff00ff)\n}\n\n// Mkdev returns a DragonFlyBSD device number generated from the given major and\n// minor components.\nfunc Mkdev(major, minor uint32) uint64 {\n\treturn (uint64(major) << 8) | uint64(minor)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/dev_freebsd.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Functions to access/create device major and minor numbers matching the\n// encoding used in FreeBSD's sys/types.h header.\n//\n// The information below is extracted and adapted from sys/types.h:\n//\n// Minor gives a cookie instead of an index since in order to avoid changing the\n// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for\n// devices that don't use them.\n\npackage unix\n\n// Major returns the major component of a FreeBSD device number.\nfunc Major(dev uint64) uint32 {\n\treturn uint32((dev >> 8) & 0xff)\n}\n\n// Minor returns the minor component of a FreeBSD device number.\nfunc Minor(dev uint64) uint32 {\n\treturn uint32(dev & 0xffff00ff)\n}\n\n// Mkdev returns a FreeBSD device number generated from the given major and\n// minor components.\nfunc Mkdev(major, minor uint32) uint64 {\n\treturn (uint64(major) << 8) | uint64(minor)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/dev_linux.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Functions to access/create device major and minor numbers matching the\n// encoding used by the Linux kernel and glibc.\n//\n// The information below is extracted and adapted from bits/sysmacros.h in the\n// glibc sources:\n//\n// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's\n// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major\n// number and m is a hex digit of the minor number. This is backward compatible\n// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also\n// backward compatible with the Linux kernel, which for some architectures uses\n// 32-bit dev_t, encoded as mmmM MMmm.\n\npackage unix\n\n// Major returns the major component of a Linux device number.\nfunc Major(dev uint64) uint32 {\n\tmajor := uint32((dev & 0x00000000000fff00) >> 8)\n\tmajor |= uint32((dev & 0xfffff00000000000) >> 32)\n\treturn major\n}\n\n// Minor returns the minor component of a Linux device number.\nfunc Minor(dev uint64) uint32 {\n\tminor := uint32((dev & 0x00000000000000ff) >> 0)\n\tminor |= uint32((dev & 0x00000ffffff00000) >> 12)\n\treturn minor\n}\n\n// Mkdev returns a Linux device number generated from the given major and minor\n// components.\nfunc Mkdev(major, minor uint32) uint64 {\n\tdev := (uint64(major) & 0x00000fff) << 8\n\tdev |= (uint64(major) & 0xfffff000) << 32\n\tdev |= (uint64(minor) & 0x000000ff) << 0\n\tdev |= (uint64(minor) & 0xffffff00) << 12\n\treturn dev\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/dev_netbsd.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Functions to access/create device major and minor numbers matching the\n// encoding used in NetBSD's sys/types.h header.\n\npackage unix\n\n// Major returns the major component of a NetBSD device number.\nfunc Major(dev uint64) uint32 {\n\treturn uint32((dev & 0x000fff00) >> 8)\n}\n\n// Minor returns the minor component of a NetBSD device number.\nfunc Minor(dev uint64) uint32 {\n\tminor := uint32((dev & 0x000000ff) >> 0)\n\tminor |= uint32((dev & 0xfff00000) >> 12)\n\treturn minor\n}\n\n// Mkdev returns a NetBSD device number generated from the given major and minor\n// components.\nfunc Mkdev(major, minor uint32) uint64 {\n\tdev := (uint64(major) << 8) & 0x000fff00\n\tdev |= (uint64(minor) << 12) & 0xfff00000\n\tdev |= (uint64(minor) << 0) & 0x000000ff\n\treturn dev\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/dev_openbsd.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Functions to access/create device major and minor numbers matching the\n// encoding used in OpenBSD's sys/types.h header.\n\npackage unix\n\n// Major returns the major component of an OpenBSD device number.\nfunc Major(dev uint64) uint32 {\n\treturn uint32((dev & 0x0000ff00) >> 8)\n}\n\n// Minor returns the minor component of an OpenBSD device number.\nfunc Minor(dev uint64) uint32 {\n\tminor := uint32((dev & 0x000000ff) >> 0)\n\tminor |= uint32((dev & 0xffff0000) >> 8)\n\treturn minor\n}\n\n// Mkdev returns an OpenBSD device number generated from the given major and minor\n// components.\nfunc Mkdev(major, minor uint32) uint64 {\n\tdev := (uint64(major) << 8) & 0x0000ff00\n\tdev |= (uint64(minor) << 8) & 0xffff0000\n\tdev |= (uint64(minor) << 0) & 0x000000ff\n\treturn dev\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/dirent.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris\n\npackage unix\n\nimport \"unsafe\"\n\n// readInt returns the size-bytes unsigned integer in native byte order at offset off.\nfunc readInt(b []byte, off, size uintptr) (u uint64, ok bool) {\n\tif len(b) < int(off+size) {\n\t\treturn 0, false\n\t}\n\tif isBigEndian {\n\t\treturn readIntBE(b[off:], size), true\n\t}\n\treturn readIntLE(b[off:], size), true\n}\n\nfunc readIntBE(b []byte, size uintptr) uint64 {\n\tswitch size {\n\tcase 1:\n\t\treturn uint64(b[0])\n\tcase 2:\n\t\t_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808\n\t\treturn uint64(b[1]) | uint64(b[0])<<8\n\tcase 4:\n\t\t_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808\n\t\treturn uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24\n\tcase 8:\n\t\t_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808\n\t\treturn uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |\n\t\t\tuint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56\n\tdefault:\n\t\tpanic(\"syscall: readInt with unsupported size\")\n\t}\n}\n\nfunc readIntLE(b []byte, size uintptr) uint64 {\n\tswitch size {\n\tcase 1:\n\t\treturn uint64(b[0])\n\tcase 2:\n\t\t_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808\n\t\treturn uint64(b[0]) | uint64(b[1])<<8\n\tcase 4:\n\t\t_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808\n\t\treturn uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24\n\tcase 8:\n\t\t_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808\n\t\treturn uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |\n\t\t\tuint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56\n\tdefault:\n\t\tpanic(\"syscall: readInt with unsupported size\")\n\t}\n}\n\n// ParseDirent parses up to max directory entries in buf,\n// appending the names to names. It returns the number of\n// bytes consumed from buf, the number of entries added\n// to names, and the new names slice.\nfunc ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) {\n\toriglen := len(buf)\n\tcount = 0\n\tfor max != 0 && len(buf) > 0 {\n\t\treclen, ok := direntReclen(buf)\n\t\tif !ok || reclen > uint64(len(buf)) {\n\t\t\treturn origlen, count, names\n\t\t}\n\t\trec := buf[:reclen]\n\t\tbuf = buf[reclen:]\n\t\tino, ok := direntIno(rec)\n\t\tif !ok {\n\t\t\tbreak\n\t\t}\n\t\tif ino == 0 { // File absent in directory.\n\t\t\tcontinue\n\t\t}\n\t\tconst namoff = uint64(unsafe.Offsetof(Dirent{}.Name))\n\t\tnamlen, ok := direntNamlen(rec)\n\t\tif !ok || namoff+namlen > uint64(len(rec)) {\n\t\t\tbreak\n\t\t}\n\t\tname := rec[namoff : namoff+namlen]\n\t\tfor i, c := range name {\n\t\t\tif c == 0 {\n\t\t\t\tname = name[:i]\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\t// Check for useless names before allocating a string.\n\t\tif string(name) == \".\" || string(name) == \"..\" {\n\t\t\tcontinue\n\t\t}\n\t\tmax--\n\t\tcount++\n\t\tnames = append(names, string(name))\n\t}\n\treturn origlen - len(buf), count, names\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/endian_big.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n//\n// +build ppc64 s390x mips mips64\n\npackage unix\n\nconst isBigEndian = true\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/endian_little.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n//\n// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le\n\npackage unix\n\nconst isBigEndian = false\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/env_unix.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\n// Unix environment variables.\n\npackage unix\n\nimport \"syscall\"\n\nfunc Getenv(key string) (value string, found bool) {\n\treturn syscall.Getenv(key)\n}\n\nfunc Setenv(key, value string) error {\n\treturn syscall.Setenv(key, value)\n}\n\nfunc Clearenv() {\n\tsyscall.Clearenv()\n}\n\nfunc Environ() []string {\n\treturn syscall.Environ()\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/env_unset.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build go1.4\n\npackage unix\n\nimport \"syscall\"\n\nfunc Unsetenv(key string) error {\n\t// This was added in Go 1.4.\n\treturn syscall.Unsetenv(key)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/errors_freebsd_386.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep\n// them here for backwards compatibility.\n\npackage unix\n\nconst (\n\tIFF_SMART                         = 0x20\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BSC                           = 0x53\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf2\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_IPXIP                         = 0xf9\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf6\n\tIFT_PFSYNC                        = 0xf7\n\tIFT_PLC                           = 0xae\n\tIFT_POS                           = 0xab\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf1\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0xd7\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIPPROTO_MAXID                     = 0x34\n\tIPV6_FAITH                        = 0x1d\n\tIP_FAITH                          = 0x16\n\tMAP_NORESERVE                     = 0x40\n\tMAP_RENAME                        = 0x20\n\tNET_RT_MAXID                      = 0x6\n\tRTF_PRCLONING                     = 0x10000\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tSIOCADDRT                         = 0x8030720a\n\tSIOCALIFADDR                      = 0x8118691b\n\tSIOCDELRT                         = 0x8030720b\n\tSIOCDLIFADDR                      = 0x8118691d\n\tSIOCGLIFADDR                      = 0xc118691c\n\tSIOCGLIFPHYADDR                   = 0xc118694b\n\tSIOCSLIFPHYADDR                   = 0x8118694a\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep\n// them here for backwards compatibility.\n\npackage unix\n\nconst (\n\tIFF_SMART                         = 0x20\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BSC                           = 0x53\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf2\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_IPXIP                         = 0xf9\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf6\n\tIFT_PFSYNC                        = 0xf7\n\tIFT_PLC                           = 0xae\n\tIFT_POS                           = 0xab\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf1\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0xd7\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIPPROTO_MAXID                     = 0x34\n\tIPV6_FAITH                        = 0x1d\n\tIP_FAITH                          = 0x16\n\tMAP_NORESERVE                     = 0x40\n\tMAP_RENAME                        = 0x20\n\tNET_RT_MAXID                      = 0x6\n\tRTF_PRCLONING                     = 0x10000\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tSIOCADDRT                         = 0x8040720a\n\tSIOCALIFADDR                      = 0x8118691b\n\tSIOCDELRT                         = 0x8040720b\n\tSIOCDLIFADDR                      = 0x8118691d\n\tSIOCGLIFADDR                      = 0xc118691c\n\tSIOCGLIFPHYADDR                   = 0xc118694b\n\tSIOCSLIFPHYADDR                   = 0x8118694a\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/errors_freebsd_arm.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage unix\n\nconst (\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BSC                           = 0x53\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf6\n\tIFT_PFSYNC                        = 0xf7\n\tIFT_PLC                           = 0xae\n\tIFT_POS                           = 0xab\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf1\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0xd7\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\n\t// missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go\n\tIFF_SMART       = 0x20\n\tIFT_FAITH       = 0xf2\n\tIFT_IPXIP       = 0xf9\n\tIPPROTO_MAXID   = 0x34\n\tIPV6_FAITH      = 0x1d\n\tIP_FAITH        = 0x16\n\tMAP_NORESERVE   = 0x40\n\tMAP_RENAME      = 0x20\n\tNET_RT_MAXID    = 0x6\n\tRTF_PRCLONING   = 0x10000\n\tRTM_OLDADD      = 0x9\n\tRTM_OLDDEL      = 0xa\n\tSIOCADDRT       = 0x8030720a\n\tSIOCALIFADDR    = 0x8118691b\n\tSIOCDELRT       = 0x8030720b\n\tSIOCDLIFADDR    = 0x8118691d\n\tSIOCGLIFADDR    = 0xc118691c\n\tSIOCGLIFPHYADDR = 0xc118694b\n\tSIOCSLIFPHYADDR = 0x8118694a\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/flock.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd\n\npackage unix\n\nimport \"unsafe\"\n\n// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux\n// systems by flock_linux_32bit.go to be SYS_FCNTL64.\nvar fcntl64Syscall uintptr = SYS_FCNTL\n\n// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.\nfunc FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {\n\t_, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk)))\n\tif errno == 0 {\n\t\treturn nil\n\t}\n\treturn errno\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/flock_linux_32bit.go",
    "content": "// +build linux,386 linux,arm linux,mips linux,mipsle\n\n// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage unix\n\nfunc init() {\n\t// On 32-bit Linux systems, the fcntl syscall that matches Go's\n\t// Flock_t type is SYS_FCNTL64, not SYS_FCNTL.\n\tfcntl64Syscall = SYS_FCNTL64\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/gccgo.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build gccgo\n\npackage unix\n\nimport \"syscall\"\n\n// We can't use the gc-syntax .s files for gccgo. On the plus side\n// much of the functionality can be written directly in Go.\n\n//extern gccgoRealSyscall\nfunc realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr)\n\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {\n\tsyscall.Entersyscall()\n\tr, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)\n\tsyscall.Exitsyscall()\n\treturn r, 0, syscall.Errno(errno)\n}\n\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {\n\tsyscall.Entersyscall()\n\tr, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0)\n\tsyscall.Exitsyscall()\n\treturn r, 0, syscall.Errno(errno)\n}\n\nfunc Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) {\n\tsyscall.Entersyscall()\n\tr, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9)\n\tsyscall.Exitsyscall()\n\treturn r, 0, syscall.Errno(errno)\n}\n\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {\n\tr, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)\n\treturn r, 0, syscall.Errno(errno)\n}\n\nfunc RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {\n\tr, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0)\n\treturn r, 0, syscall.Errno(errno)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/gccgo_c.c",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build gccgo\n\n#include <errno.h>\n#include <stdint.h>\n#include <unistd.h>\n\n#define _STRINGIFY2_(x) #x\n#define _STRINGIFY_(x) _STRINGIFY2_(x)\n#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__)\n\n// Call syscall from C code because the gccgo support for calling from\n// Go to C does not support varargs functions.\n\nstruct ret {\n\tuintptr_t r;\n\tuintptr_t err;\n};\n\nstruct ret\ngccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9)\n{\n\tstruct ret r;\n\n\terrno = 0;\n\tr.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9);\n\tr.err = errno;\n\treturn r;\n}\n\n// Define the use function in C so that it is not inlined.\n\nextern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH \".use\") __attribute__((noinline));\n\nvoid\nuse(void *p __attribute__ ((unused)))\n{\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build gccgo,linux,amd64\n\npackage unix\n\nimport \"syscall\"\n\n//extern gettimeofday\nfunc realGettimeofday(*Timeval, *byte) int32\n\nfunc gettimeofday(tv *Timeval) (err syscall.Errno) {\n\tr := realGettimeofday(tv, nil)\n\tif r < 0 {\n\t\treturn syscall.GetErrno()\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mkall.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n\n# This script runs or (given -n) prints suggested commands to generate files for\n# the Architecture/OS specified by the GOARCH and GOOS environment variables.\n# See README.md for more information about how the build system works.\n\nGOOSARCH=\"${GOOS}_${GOARCH}\"\n\n# defaults\nmksyscall=\"./mksyscall.pl\"\nmkerrors=\"./mkerrors.sh\"\nzerrors=\"zerrors_$GOOSARCH.go\"\nmksysctl=\"\"\nzsysctl=\"zsysctl_$GOOSARCH.go\"\nmksysnum=\nmktypes=\nrun=\"sh\"\ncmd=\"\"\n\ncase \"$1\" in\n-syscalls)\n\tfor i in zsyscall*go\n\tdo\n\t\t# Run the command line that appears in the first line\n\t\t# of the generated file to regenerate it.\n\t\tsed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i\n\t\trm _$i\n\tdone\n\texit 0\n\t;;\n-n)\n\trun=\"cat\"\n\tcmd=\"echo\"\n\tshift\nesac\n\ncase \"$#\" in\n0)\n\t;;\n*)\n\techo 'usage: mkall.sh [-n]' 1>&2\n\texit 2\nesac\n\nif [[ \"$GOOS\" = \"linux\" ]] && [[ \"$GOARCH\" != \"sparc64\" ]]; then\n\t# Use then new build system\n\t# Files generated through docker (use $cmd so you can Ctl-C the build or run)\n\t$cmd docker build --tag generate:$GOOS $GOOS\n\t$cmd docker run --interactive --tty --volume $(dirname \"$(readlink -f \"$0\")\"):/build generate:$GOOS\n\texit\nfi\n\nGOOSARCH_in=syscall_$GOOSARCH.go\ncase \"$GOOSARCH\" in\n_* | *_ | _)\n\techo 'undefined $GOOS_$GOARCH:' \"$GOOSARCH\" 1>&2\n\texit 1\n\t;;\ndarwin_386)\n\tmkerrors=\"$mkerrors -m32\"\n\tmksyscall=\"./mksyscall.pl -l32\"\n\tmksysnum=\"./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\ndarwin_amd64)\n\tmkerrors=\"$mkerrors -m64\"\n\tmksysnum=\"./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\ndarwin_arm)\n\tmkerrors=\"$mkerrors\"\n\tmksysnum=\"./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\ndarwin_arm64)\n\tmkerrors=\"$mkerrors -m64\"\n\tmksysnum=\"./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\ndragonfly_386)\n\tmkerrors=\"$mkerrors -m32\"\n\tmksyscall=\"./mksyscall.pl -l32 -dragonfly\"\n\tmksysnum=\"curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\ndragonfly_amd64)\n\tmkerrors=\"$mkerrors -m64\"\n\tmksyscall=\"./mksyscall.pl -dragonfly\"\n\tmksysnum=\"curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nfreebsd_386)\n\tmkerrors=\"$mkerrors -m32\"\n\tmksyscall=\"./mksyscall.pl -l32\"\n\tmksysnum=\"curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nfreebsd_amd64)\n\tmkerrors=\"$mkerrors -m64\"\n\tmksysnum=\"curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nfreebsd_arm)\n\tmkerrors=\"$mkerrors\"\n\tmksyscall=\"./mksyscall.pl -l32 -arm\"\n\tmksysnum=\"curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl\"\n\t# Let the type of C char be signed for making the bare syscall\n\t# API consistent across platforms.\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char\"\n\t;;\nlinux_sparc64)\n\tGOOSARCH_in=syscall_linux_sparc64.go\n\tunistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h\n\tmkerrors=\"$mkerrors -m64\"\n\tmksysnum=\"./mksysnum_linux.pl $unistd_h\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nnetbsd_386)\n\tmkerrors=\"$mkerrors -m32\"\n\tmksyscall=\"./mksyscall.pl -l32 -netbsd\"\n\tmksysnum=\"curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nnetbsd_amd64)\n\tmkerrors=\"$mkerrors -m64\"\n\tmksyscall=\"./mksyscall.pl -netbsd\"\n\tmksysnum=\"curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nnetbsd_arm)\n\tmkerrors=\"$mkerrors\"\n\tmksyscall=\"./mksyscall.pl -l32 -netbsd -arm\"\n\tmksysnum=\"curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl\"\n\t# Let the type of C char be signed for making the bare syscall\n\t# API consistent across platforms.\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char\"\n\t;;\nopenbsd_386)\n\tmkerrors=\"$mkerrors -m32\"\n\tmksyscall=\"./mksyscall.pl -l32 -openbsd\"\n\tmksysctl=\"./mksysctl_openbsd.pl\"\n\tmksysnum=\"curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nopenbsd_amd64)\n\tmkerrors=\"$mkerrors -m64\"\n\tmksyscall=\"./mksyscall.pl -openbsd\"\n\tmksysctl=\"./mksysctl_openbsd.pl\"\n\tmksysnum=\"curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl\"\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\nopenbsd_arm)\n\tmkerrors=\"$mkerrors\"\n\tmksyscall=\"./mksyscall.pl -l32 -openbsd -arm\"\n\tmksysctl=\"./mksysctl_openbsd.pl\"\n\tmksysnum=\"curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl\"\n\t# Let the type of C char be signed for making the bare syscall\n\t# API consistent across platforms.\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char\"\n\t;;\nsolaris_amd64)\n\tmksyscall=\"./mksyscall_solaris.pl\"\n\tmkerrors=\"$mkerrors -m64\"\n\tmksysnum=\n\tmktypes=\"GOARCH=$GOARCH go tool cgo -godefs\"\n\t;;\n*)\n\techo 'unrecognized $GOOS_$GOARCH: ' \"$GOOSARCH\" 1>&2\n\texit 1\n\t;;\nesac\n\n(\n\tif [ -n \"$mkerrors\" ]; then echo \"$mkerrors |gofmt >$zerrors\"; fi\n\tcase \"$GOOS\" in\n\t*)\n\t\tsyscall_goos=\"syscall_$GOOS.go\"\n\t\tcase \"$GOOS\" in\n\t\tdarwin | dragonfly | freebsd | netbsd | openbsd)\n\t\t\tsyscall_goos=\"syscall_bsd.go $syscall_goos\"\n\t\t\t;;\n\t\tesac\n\t\tif [ -n \"$mksyscall\" ]; then echo \"$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go\"; fi\n\t\t;;\n\tesac\n\tif [ -n \"$mksysctl\" ]; then echo \"$mksysctl |gofmt >$zsysctl\"; fi\n\tif [ -n \"$mksysnum\" ]; then echo \"$mksysnum |gofmt >zsysnum_$GOOSARCH.go\"; fi\n\tif [ -n \"$mktypes\" ]; then\n\t\techo \"$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go\";\n\tfi\n) | $run\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mkerrors.sh",
    "content": "#!/usr/bin/env bash\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n\n# Generate Go code listing errors and other #defined constant\n# values (ENAMETOOLONG etc.), by asking the preprocessor\n# about the definitions.\n\nunset LANG\nexport LC_ALL=C\nexport LC_CTYPE=C\n\nif test -z \"$GOARCH\" -o -z \"$GOOS\"; then\n\techo 1>&2 \"GOARCH or GOOS not defined in environment\"\n\texit 1\nfi\n\n# Check that we are using the new build system if we should\nif [[ \"$GOOS\" = \"linux\" ]] && [[ \"$GOARCH\" != \"sparc64\" ]]; then\n\tif [[ \"$GOLANG_SYS_BUILD\" != \"docker\" ]]; then\n\t\techo 1>&2 \"In the new build system, mkerrors should not be called directly.\"\n\t\techo 1>&2 \"See README.md\"\n\t\texit 1\n\tfi\nfi\n\nCC=${CC:-cc}\n\nif [[ \"$GOOS\" = \"solaris\" ]]; then\n\t# Assumes GNU versions of utilities in PATH.\n\texport PATH=/usr/gnu/bin:$PATH\nfi\n\nuname=$(uname)\n\nincludes_Darwin='\n#define _DARWIN_C_SOURCE\n#define KERNEL\n#define _DARWIN_USE_64_BIT_INODE\n#include <stdint.h>\n#include <sys/attr.h>\n#include <sys/types.h>\n#include <sys/event.h>\n#include <sys/ptrace.h>\n#include <sys/socket.h>\n#include <sys/sockio.h>\n#include <sys/sysctl.h>\n#include <sys/mman.h>\n#include <sys/mount.h>\n#include <sys/wait.h>\n#include <net/bpf.h>\n#include <net/if.h>\n#include <net/if_types.h>\n#include <net/route.h>\n#include <netinet/in.h>\n#include <netinet/ip.h>\n#include <termios.h>\n'\n\nincludes_DragonFly='\n#include <sys/types.h>\n#include <sys/event.h>\n#include <sys/socket.h>\n#include <sys/sockio.h>\n#include <sys/sysctl.h>\n#include <sys/mman.h>\n#include <sys/wait.h>\n#include <sys/ioctl.h>\n#include <net/bpf.h>\n#include <net/if.h>\n#include <net/if_types.h>\n#include <net/route.h>\n#include <netinet/in.h>\n#include <termios.h>\n#include <netinet/ip.h>\n#include <net/ip_mroute/ip_mroute.h>\n'\n\nincludes_FreeBSD='\n#include <sys/capability.h>\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/event.h>\n#include <sys/socket.h>\n#include <sys/sockio.h>\n#include <sys/sysctl.h>\n#include <sys/mman.h>\n#include <sys/mount.h>\n#include <sys/wait.h>\n#include <sys/ioctl.h>\n#include <net/bpf.h>\n#include <net/if.h>\n#include <net/if_types.h>\n#include <net/route.h>\n#include <netinet/in.h>\n#include <termios.h>\n#include <netinet/ip.h>\n#include <netinet/ip_mroute.h>\n#include <sys/extattr.h>\n\n#if __FreeBSD__ >= 10\n#define IFT_CARP\t0xf8\t// IFT_CARP is deprecated in FreeBSD 10\n#undef SIOCAIFADDR\n#define SIOCAIFADDR\t_IOW(105, 26, struct oifaliasreq)\t// ifaliasreq contains if_data\n#undef SIOCSIFPHYADDR\n#define SIOCSIFPHYADDR\t_IOW(105, 70, struct oifaliasreq)\t// ifaliasreq contains if_data\n#endif\n'\n\nincludes_Linux='\n#define _LARGEFILE_SOURCE\n#define _LARGEFILE64_SOURCE\n#ifndef __LP64__\n#define _FILE_OFFSET_BITS 64\n#endif\n#define _GNU_SOURCE\n\n// <sys/ioctl.h> is broken on powerpc64, as it fails to include definitions of\n// these structures. We just include them copied from <bits/termios.h>.\n#if defined(__powerpc__)\nstruct sgttyb {\n        char    sg_ispeed;\n        char    sg_ospeed;\n        char    sg_erase;\n        char    sg_kill;\n        short   sg_flags;\n};\n\nstruct tchars {\n        char    t_intrc;\n        char    t_quitc;\n        char    t_startc;\n        char    t_stopc;\n        char    t_eofc;\n        char    t_brkc;\n};\n\nstruct ltchars {\n        char    t_suspc;\n        char    t_dsuspc;\n        char    t_rprntc;\n        char    t_flushc;\n        char    t_werasc;\n        char    t_lnextc;\n};\n#endif\n\n#include <bits/sockaddr.h>\n#include <sys/epoll.h>\n#include <sys/eventfd.h>\n#include <sys/inotify.h>\n#include <sys/ioctl.h>\n#include <sys/mman.h>\n#include <sys/mount.h>\n#include <sys/prctl.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/time.h>\n#include <sys/socket.h>\n#include <sys/xattr.h>\n#include <linux/if.h>\n#include <linux/if_alg.h>\n#include <linux/if_arp.h>\n#include <linux/if_ether.h>\n#include <linux/if_tun.h>\n#include <linux/if_packet.h>\n#include <linux/if_addr.h>\n#include <linux/falloc.h>\n#include <linux/filter.h>\n#include <linux/fs.h>\n#include <linux/keyctl.h>\n#include <linux/netlink.h>\n#include <linux/perf_event.h>\n#include <linux/random.h>\n#include <linux/reboot.h>\n#include <linux/rtnetlink.h>\n#include <linux/ptrace.h>\n#include <linux/sched.h>\n#include <linux/seccomp.h>\n#include <linux/sockios.h>\n#include <linux/wait.h>\n#include <linux/icmpv6.h>\n#include <linux/serial.h>\n#include <linux/can.h>\n#include <linux/vm_sockets.h>\n#include <linux/taskstats.h>\n#include <linux/genetlink.h>\n#include <linux/watchdog.h>\n#include <net/route.h>\n#include <asm/termbits.h>\n\n#ifndef MSG_FASTOPEN\n#define MSG_FASTOPEN    0x20000000\n#endif\n\n#ifndef PTRACE_GETREGS\n#define PTRACE_GETREGS\t0xc\n#endif\n\n#ifndef PTRACE_SETREGS\n#define PTRACE_SETREGS\t0xd\n#endif\n\n#ifndef SOL_NETLINK\n#define SOL_NETLINK\t270\n#endif\n\n#ifdef SOL_BLUETOOTH\n// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h\n// but it is already in bluetooth_linux.go\n#undef SOL_BLUETOOTH\n#endif\n\n// Certain constants are missing from the fs/crypto UAPI\n#define FS_KEY_DESC_PREFIX              \"fscrypt:\"\n#define FS_KEY_DESC_PREFIX_SIZE         8\n#define FS_MAX_KEY_SIZE                 64\n'\n\nincludes_NetBSD='\n#include <sys/types.h>\n#include <sys/param.h>\n#include <sys/event.h>\n#include <sys/mman.h>\n#include <sys/socket.h>\n#include <sys/sockio.h>\n#include <sys/sysctl.h>\n#include <sys/termios.h>\n#include <sys/ttycom.h>\n#include <sys/wait.h>\n#include <net/bpf.h>\n#include <net/if.h>\n#include <net/if_types.h>\n#include <net/route.h>\n#include <netinet/in.h>\n#include <netinet/in_systm.h>\n#include <netinet/ip.h>\n#include <netinet/ip_mroute.h>\n#include <netinet/if_ether.h>\n\n// Needed since <sys/param.h> refers to it...\n#define schedppq 1\n'\n\nincludes_OpenBSD='\n#include <sys/types.h>\n#include <sys/param.h>\n#include <sys/event.h>\n#include <sys/mman.h>\n#include <sys/socket.h>\n#include <sys/sockio.h>\n#include <sys/sysctl.h>\n#include <sys/termios.h>\n#include <sys/ttycom.h>\n#include <sys/wait.h>\n#include <net/bpf.h>\n#include <net/if.h>\n#include <net/if_types.h>\n#include <net/if_var.h>\n#include <net/route.h>\n#include <netinet/in.h>\n#include <netinet/in_systm.h>\n#include <netinet/ip.h>\n#include <netinet/ip_mroute.h>\n#include <netinet/if_ether.h>\n#include <net/if_bridge.h>\n\n// We keep some constants not supported in OpenBSD 5.5 and beyond for\n// the promise of compatibility.\n#define EMUL_ENABLED\t\t0x1\n#define EMUL_NATIVE\t\t0x2\n#define IPV6_FAITH\t\t0x1d\n#define IPV6_OPTIONS\t\t0x1\n#define IPV6_RTHDR_STRICT\t0x1\n#define IPV6_SOCKOPT_RESERVED1\t0x3\n#define SIOCGIFGENERIC\t\t0xc020693a\n#define SIOCSIFGENERIC\t\t0x80206939\n#define WALTSIG\t\t\t0x4\n'\n\nincludes_SunOS='\n#include <limits.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/sockio.h>\n#include <sys/mman.h>\n#include <sys/wait.h>\n#include <sys/ioctl.h>\n#include <sys/mkdev.h>\n#include <net/bpf.h>\n#include <net/if.h>\n#include <net/if_arp.h>\n#include <net/if_types.h>\n#include <net/route.h>\n#include <netinet/in.h>\n#include <termios.h>\n#include <netinet/ip.h>\n#include <netinet/ip_mroute.h>\n'\n\n\nincludes='\n#include <sys/types.h>\n#include <sys/file.h>\n#include <fcntl.h>\n#include <dirent.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <netinet/ip.h>\n#include <netinet/ip6.h>\n#include <netinet/tcp.h>\n#include <errno.h>\n#include <sys/signal.h>\n#include <signal.h>\n#include <sys/resource.h>\n#include <time.h>\n'\nccflags=\"$@\"\n\n# Write go tool cgo -godefs input.\n(\n\techo package unix\n\techo\n\techo '/*'\n\tindirect=\"includes_$(uname)\"\n\techo \"${!indirect} $includes\"\n\techo '*/'\n\techo 'import \"C\"'\n\techo 'import \"syscall\"'\n\techo\n\techo 'const ('\n\n\t# The gcc command line prints all the #defines\n\t# it encounters while processing the input\n\techo \"${!indirect} $includes\" | $CC -x c - -E -dM $ccflags |\n\tawk '\n\t\t$1 != \"#define\" || $2 ~ /\\(/ || $3 == \"\" {next}\n\n\t\t$2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next}  # 386 registers\n\t\t$2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next}\n\t\t$2 ~ /^(SCM_SRCRT)$/ {next}\n\t\t$2 ~ /^(MAP_FAILED)$/ {next}\n\t\t$2 ~ /^ELF_.*$/ {next}# <asm/elf.h> contains ELF_ARCH, etc.\n\n\t\t$2 ~ /^EXTATTR_NAMESPACE_NAMES/ ||\n\t\t$2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next}\n\n\t\t$2 !~ /^ETH_/ &&\n\t\t$2 !~ /^EPROC_/ &&\n\t\t$2 !~ /^EQUIV_/ &&\n\t\t$2 !~ /^EXPR_/ &&\n\t\t$2 ~ /^E[A-Z0-9_]+$/ ||\n\t\t$2 ~ /^B[0-9_]+$/ ||\n\t\t$2 ~ /^(OLD|NEW)DEV$/ ||\n\t\t$2 == \"BOTHER\" ||\n\t\t$2 ~ /^CI?BAUD(EX)?$/ ||\n\t\t$2 == \"IBSHIFT\" ||\n\t\t$2 ~ /^V[A-Z0-9]+$/ ||\n\t\t$2 ~ /^CS[A-Z0-9]/ ||\n\t\t$2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ ||\n\t\t$2 ~ /^IGN/ ||\n\t\t$2 ~ /^IX(ON|ANY|OFF)$/ ||\n\t\t$2 ~ /^IN(LCR|PCK)$/ ||\n\t\t$2 ~ /(^FLU?SH)|(FLU?SH$)/ ||\n\t\t$2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ ||\n\t\t$2 == \"BRKINT\" ||\n\t\t$2 == \"HUPCL\" ||\n\t\t$2 == \"PENDIN\" ||\n\t\t$2 == \"TOSTOP\" ||\n\t\t$2 == \"XCASE\" ||\n\t\t$2 == \"ALTWERASE\" ||\n\t\t$2 == \"NOKERNINFO\" ||\n\t\t$2 ~ /^PAR/ ||\n\t\t$2 ~ /^SIG[^_]/ ||\n\t\t$2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ ||\n\t\t$2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ ||\n\t\t$2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ ||\n\t\t$2 ~ /^O?XTABS$/ ||\n\t\t$2 ~ /^TC[IO](ON|OFF)$/ ||\n\t\t$2 ~ /^IN_/ ||\n\t\t$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||\n\t\t$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ ||\n\t\t$2 ~ /^FALLOC_/ ||\n\t\t$2 == \"ICMPV6_FILTER\" ||\n\t\t$2 == \"SOMAXCONN\" ||\n\t\t$2 == \"NAME_MAX\" ||\n\t\t$2 == \"IFNAMSIZ\" ||\n\t\t$2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ ||\n\t\t$2 ~ /^SYSCTL_VERS/ ||\n\t\t$2 ~ /^(MS|MNT|UMOUNT)_/ ||\n\t\t$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ ||\n\t\t$2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ ||\n\t\t$2 ~ /^LINUX_REBOOT_CMD_/ ||\n\t\t$2 ~ /^LINUX_REBOOT_MAGIC[12]$/ ||\n\t\t$2 !~ \"NLA_TYPE_MASK\" &&\n\t\t$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ ||\n\t\t$2 ~ /^SIOC/ ||\n\t\t$2 ~ /^TIOC/ ||\n\t\t$2 ~ /^TCGET/ ||\n\t\t$2 ~ /^TCSET/ ||\n\t\t$2 ~ /^TC(FLSH|SBRKP?|XONC)$/ ||\n\t\t$2 !~ \"RTF_BITS\" &&\n\t\t$2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ ||\n\t\t$2 ~ /^BIOC/ ||\n\t\t$2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ ||\n\t\t$2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ ||\n\t\t$2 ~ /^PRIO_(PROCESS|PGRP|USER)/ ||\n\t\t$2 ~ /^CLONE_[A-Z_]+/ ||\n\t\t$2 !~ /^(BPF_TIMEVAL)$/ &&\n\t\t$2 ~ /^(BPF|DLT)_/ ||\n\t\t$2 ~ /^CLOCK_/ ||\n\t\t$2 ~ /^CAN_/ ||\n\t\t$2 ~ /^CAP_/ ||\n\t\t$2 ~ /^ALG_/ ||\n\t\t$2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ ||\n\t\t$2 ~ /^GRND_/ ||\n\t\t$2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ ||\n\t\t$2 ~ /^KEYCTL_/ ||\n\t\t$2 ~ /^PERF_EVENT_IOC_/ ||\n\t\t$2 ~ /^SECCOMP_MODE_/ ||\n\t\t$2 ~ /^SPLICE_/ ||\n\t\t$2 ~ /^(VM|VMADDR)_/ ||\n\t\t$2 ~ /^IOCTL_VM_SOCKETS_/ ||\n\t\t$2 ~ /^(TASKSTATS|TS)_/ ||\n\t\t$2 ~ /^GENL_/ ||\n\t\t$2 ~ /^UTIME_/ ||\n\t\t$2 ~ /^XATTR_(CREATE|REPLACE)/ ||\n\t\t$2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ ||\n\t\t$2 ~ /^FSOPT_/ ||\n\t\t$2 ~ /^WDIOC_/ ||\n\t\t$2 !~ \"WMESGLEN\" &&\n\t\t$2 ~ /^W[A-Z0-9]+$/ ||\n\t\t$2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf(\"\\t%s = C.%s\\n\", $2, $2)}\n\t\t$2 ~ /^__WCOREFLAG$/ {next}\n\t\t$2 ~ /^__W[A-Z0-9]+$/ {printf(\"\\t%s = C.%s\\n\", substr($2,3), $2)}\n\n\t\t{next}\n\t' | sort\n\n\techo ')'\n) >_const.go\n\n# Pull out the error names for later.\nerrors=$(\n\techo '#include <errno.h>' | $CC -x c - -E -dM $ccflags |\n\tawk '$1==\"#define\" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' |\n\tsort\n)\n\n# Pull out the signal names for later.\nsignals=$(\n\techo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |\n\tawk '$1==\"#define\" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' |\n\tegrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' |\n\tsort\n)\n\n# Again, writing regexps to a file.\necho '#include <errno.h>' | $CC -x c - -E -dM $ccflags |\n\tawk '$1==\"#define\" && $2 ~ /^E[A-Z0-9_]+$/ { print \"^\\t\" $2 \"[ \\t]*=\" }' |\n\tsort >_error.grep\necho '#include <signal.h>' | $CC -x c - -E -dM $ccflags |\n\tawk '$1==\"#define\" && $2 ~ /^SIG[A-Z0-9]+$/ { print \"^\\t\" $2 \"[ \\t]*=\" }' |\n\tegrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' |\n\tsort >_signal.grep\n\necho '// mkerrors.sh' \"$@\"\necho '// Code generated by the command above; see README.md. DO NOT EDIT.'\necho\necho \"// +build ${GOARCH},${GOOS}\"\necho\ngo tool cgo -godefs -- \"$@\" _const.go >_error.out\ncat _error.out | grep -vf _error.grep | grep -vf _signal.grep\necho\necho '// Errors'\necho 'const ('\ncat _error.out | grep -f _error.grep | sed 's/=\\(.*\\)/= syscall.Errno(\\1)/'\necho ')'\n\necho\necho '// Signals'\necho 'const ('\ncat _error.out | grep -f _signal.grep | sed 's/=\\(.*\\)/= syscall.Signal(\\1)/'\necho ')'\n\n# Run C program to print error and syscall strings.\n(\n\techo -E \"\n#include <stdio.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <ctype.h>\n#include <string.h>\n#include <signal.h>\n\n#define nelem(x) (sizeof(x)/sizeof((x)[0]))\n\nenum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below\n\nint errors[] = {\n\"\n\tfor i in $errors\n\tdo\n\t\techo -E '\t'$i,\n\tdone\n\n\techo -E \"\n};\n\nint signals[] = {\n\"\n\tfor i in $signals\n\tdo\n\t\techo -E '\t'$i,\n\tdone\n\n\t# Use -E because on some systems bash builtin interprets \\n itself.\n\techo -E '\n};\n\nstatic int\nintcmp(const void *a, const void *b)\n{\n\treturn *(int*)a - *(int*)b;\n}\n\nint\nmain(void)\n{\n\tint i, e;\n\tchar buf[1024], *p;\n\n\tprintf(\"\\n\\n// Error table\\n\");\n\tprintf(\"var errors = [...]string {\\n\");\n\tqsort(errors, nelem(errors), sizeof errors[0], intcmp);\n\tfor(i=0; i<nelem(errors); i++) {\n\t\te = errors[i];\n\t\tif(i > 0 && errors[i-1] == e)\n\t\t\tcontinue;\n\t\tstrcpy(buf, strerror(e));\n\t\t// lowercase first letter: Bad -> bad, but STREAM -> STREAM.\n\t\tif(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)\n\t\t\tbuf[0] += a - A;\n\t\tprintf(\"\\t%d: \\\"%s\\\",\\n\", e, buf);\n\t}\n\tprintf(\"}\\n\\n\");\n\n\tprintf(\"\\n\\n// Signal table\\n\");\n\tprintf(\"var signals = [...]string {\\n\");\n\tqsort(signals, nelem(signals), sizeof signals[0], intcmp);\n\tfor(i=0; i<nelem(signals); i++) {\n\t\te = signals[i];\n\t\tif(i > 0 && signals[i-1] == e)\n\t\t\tcontinue;\n\t\tstrcpy(buf, strsignal(e));\n\t\t// lowercase first letter: Bad -> bad, but STREAM -> STREAM.\n\t\tif(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)\n\t\t\tbuf[0] += a - A;\n\t\t// cut trailing : number.\n\t\tp = strrchr(buf, \":\"[0]);\n\t\tif(p)\n\t\t\t*p = '\\0';\n\t\tprintf(\"\\t%d: \\\"%s\\\",\\n\", e, buf);\n\t}\n\tprintf(\"}\\n\\n\");\n\n\treturn 0;\n}\n\n'\n) >_errors.c\n\n$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksyscall.pl",
    "content": "#!/usr/bin/env perl\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n\n# This program reads a file containing function prototypes\n# (like syscall_darwin.go) and generates system call bodies.\n# The prototypes are marked by lines beginning with \"//sys\"\n# and read like func declarations if //sys is replaced by func, but:\n#\t* The parameter lists must give a name for each argument.\n#\t  This includes return parameters.\n#\t* The parameter lists must give a type for each argument:\n#\t  the (x, y, z int) shorthand is not allowed.\n#\t* If the return parameter is an error number, it must be named errno.\n\n# A line beginning with //sysnb is like //sys, except that the\n# goroutine will not be suspended during the execution of the system\n# call.  This must only be used for system calls which can never\n# block, as otherwise the system call could cause all goroutines to\n# hang.\n\nuse strict;\n\nmy $cmdline = \"mksyscall.pl \" . join(' ', @ARGV);\nmy $errors = 0;\nmy $_32bit = \"\";\nmy $plan9 = 0;\nmy $openbsd = 0;\nmy $netbsd = 0;\nmy $dragonfly = 0;\nmy $arm = 0; # 64-bit value should use (even, odd)-pair\nmy $tags = \"\";  # build tags\n\nif($ARGV[0] eq \"-b32\") {\n\t$_32bit = \"big-endian\";\n\tshift;\n} elsif($ARGV[0] eq \"-l32\") {\n\t$_32bit = \"little-endian\";\n\tshift;\n}\nif($ARGV[0] eq \"-plan9\") {\n\t$plan9 = 1;\n\tshift;\n}\nif($ARGV[0] eq \"-openbsd\") {\n\t$openbsd = 1;\n\tshift;\n}\nif($ARGV[0] eq \"-netbsd\") {\n\t$netbsd = 1;\n\tshift;\n}\nif($ARGV[0] eq \"-dragonfly\") {\n\t$dragonfly = 1;\n\tshift;\n}\nif($ARGV[0] eq \"-arm\") {\n\t$arm = 1;\n\tshift;\n}\nif($ARGV[0] eq \"-tags\") {\n\tshift;\n\t$tags = $ARGV[0];\n\tshift;\n}\n\nif($ARGV[0] =~ /^-/) {\n\tprint STDERR \"usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\\n\";\n\texit 1;\n}\n\n# Check that we are using the new build system if we should\nif($ENV{'GOOS'} eq \"linux\" && $ENV{'GOARCH'} ne \"sparc64\") {\n\tif($ENV{'GOLANG_SYS_BUILD'} ne \"docker\") {\n\t\tprint STDERR \"In the new build system, mksyscall should not be called directly.\\n\";\n\t\tprint STDERR \"See README.md\\n\";\n\t\texit 1;\n\t}\n}\n\n\nsub parseparamlist($) {\n\tmy ($list) = @_;\n\t$list =~ s/^\\s*//;\n\t$list =~ s/\\s*$//;\n\tif($list eq \"\") {\n\t\treturn ();\n\t}\n\treturn split(/\\s*,\\s*/, $list);\n}\n\nsub parseparam($) {\n\tmy ($p) = @_;\n\tif($p !~ /^(\\S*) (\\S*)$/) {\n\t\tprint STDERR \"$ARGV:$.: malformed parameter: $p\\n\";\n\t\t$errors = 1;\n\t\treturn (\"xx\", \"int\");\n\t}\n\treturn ($1, $2);\n}\n\nmy $text = \"\";\nwhile(<>) {\n\tchomp;\n\ts/\\s+/ /g;\n\ts/^\\s+//;\n\ts/\\s+$//;\n\tmy $nonblock = /^\\/\\/sysnb /;\n\tnext if !/^\\/\\/sys / && !$nonblock;\n\n\t# Line must be of the form\n\t#\tfunc Open(path string, mode int, perm int) (fd int, errno error)\n\t# Split into name, in params, out params.\n\tif(!/^\\/\\/sys(nb)? (\\w+)\\(([^()]*)\\)\\s*(?:\\(([^()]+)\\))?\\s*(?:=\\s*((?i)SYS_[A-Z0-9_]+))?$/) {\n\t\tprint STDERR \"$ARGV:$.: malformed //sys declaration\\n\";\n\t\t$errors = 1;\n\t\tnext;\n\t}\n\tmy ($func, $in, $out, $sysname) = ($2, $3, $4, $5);\n\n\t# Split argument lists on comma.\n\tmy @in = parseparamlist($in);\n\tmy @out = parseparamlist($out);\n\n\t# Try in vain to keep people from editing this file.\n\t# The theory is that they jump into the middle of the file\n\t# without reading the header.\n\t$text .= \"// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\\n\\n\";\n\n\t# Go function header.\n\tmy $out_decl = @out ? sprintf(\" (%s)\", join(', ', @out)) : \"\";\n\t$text .= sprintf \"func %s(%s)%s {\\n\", $func, join(', ', @in), $out_decl;\n\n\t# Check if err return available\n\tmy $errvar = \"\";\n\tforeach my $p (@out) {\n\t\tmy ($name, $type) = parseparam($p);\n\t\tif($type eq \"error\") {\n\t\t\t$errvar = $name;\n\t\t\tlast;\n\t\t}\n\t}\n\n\t# Prepare arguments to Syscall.\n\tmy @args = ();\n\tmy $n = 0;\n\tforeach my $p (@in) {\n\t\tmy ($name, $type) = parseparam($p);\n\t\tif($type =~ /^\\*/) {\n\t\t\tpush @args, \"uintptr(unsafe.Pointer($name))\";\n\t\t} elsif($type eq \"string\" && $errvar ne \"\") {\n\t\t\t$text .= \"\\tvar _p$n *byte\\n\";\n\t\t\t$text .= \"\\t_p$n, $errvar = BytePtrFromString($name)\\n\";\n\t\t\t$text .= \"\\tif $errvar != nil {\\n\\t\\treturn\\n\\t}\\n\";\n\t\t\tpush @args, \"uintptr(unsafe.Pointer(_p$n))\";\n\t\t\t$n++;\n\t\t} elsif($type eq \"string\") {\n\t\t\tprint STDERR \"$ARGV:$.: $func uses string arguments, but has no error return\\n\";\n\t\t\t$text .= \"\\tvar _p$n *byte\\n\";\n\t\t\t$text .= \"\\t_p$n, _ = BytePtrFromString($name)\\n\";\n\t\t\tpush @args, \"uintptr(unsafe.Pointer(_p$n))\";\n\t\t\t$n++;\n\t\t} elsif($type =~ /^\\[\\](.*)/) {\n\t\t\t# Convert slice into pointer, length.\n\t\t\t# Have to be careful not to take address of &a[0] if len == 0:\n\t\t\t# pass dummy pointer in that case.\n\t\t\t# Used to pass nil, but some OSes or simulators reject write(fd, nil, 0).\n\t\t\t$text .= \"\\tvar _p$n unsafe.Pointer\\n\";\n\t\t\t$text .= \"\\tif len($name) > 0 {\\n\\t\\t_p$n = unsafe.Pointer(\\&${name}[0])\\n\\t}\";\n\t\t\t$text .= \" else {\\n\\t\\t_p$n = unsafe.Pointer(&_zero)\\n\\t}\";\n\t\t\t$text .= \"\\n\";\n\t\t\tpush @args, \"uintptr(_p$n)\", \"uintptr(len($name))\";\n\t\t\t$n++;\n\t\t} elsif($type eq \"int64\" && ($openbsd || $netbsd)) {\n\t\t\tpush @args, \"0\";\n\t\t\tif($_32bit eq \"big-endian\") {\n\t\t\t\tpush @args, \"uintptr($name>>32)\", \"uintptr($name)\";\n\t\t\t} elsif($_32bit eq \"little-endian\") {\n\t\t\t\tpush @args, \"uintptr($name)\", \"uintptr($name>>32)\";\n\t\t\t} else {\n\t\t\t\tpush @args, \"uintptr($name)\";\n\t\t\t}\n\t\t} elsif($type eq \"int64\" && $dragonfly) {\n\t\t\tif ($func !~ /^extp(read|write)/i) {\n\t\t\t\tpush @args, \"0\";\n\t\t\t}\n\t\t\tif($_32bit eq \"big-endian\") {\n\t\t\t\tpush @args, \"uintptr($name>>32)\", \"uintptr($name)\";\n\t\t\t} elsif($_32bit eq \"little-endian\") {\n\t\t\t\tpush @args, \"uintptr($name)\", \"uintptr($name>>32)\";\n\t\t\t} else {\n\t\t\t\tpush @args, \"uintptr($name)\";\n\t\t\t}\n\t\t} elsif($type eq \"int64\" && $_32bit ne \"\") {\n\t\t\tif(@args % 2 && $arm) {\n\t\t\t\t# arm abi specifies 64-bit argument uses\n\t\t\t\t# (even, odd) pair\n\t\t\t\tpush @args, \"0\"\n\t\t\t}\n\t\t\tif($_32bit eq \"big-endian\") {\n\t\t\t\tpush @args, \"uintptr($name>>32)\", \"uintptr($name)\";\n\t\t\t} else {\n\t\t\t\tpush @args, \"uintptr($name)\", \"uintptr($name>>32)\";\n\t\t\t}\n\t\t} else {\n\t\t\tpush @args, \"uintptr($name)\";\n\t\t}\n\t}\n\n\t# Determine which form to use; pad args with zeros.\n\tmy $asm = \"Syscall\";\n\tif ($nonblock) {\n\t\t$asm = \"RawSyscall\";\n\t}\n\tif(@args <= 3) {\n\t\twhile(@args < 3) {\n\t\t\tpush @args, \"0\";\n\t\t}\n\t} elsif(@args <= 6) {\n\t\t$asm .= \"6\";\n\t\twhile(@args < 6) {\n\t\t\tpush @args, \"0\";\n\t\t}\n\t} elsif(@args <= 9) {\n\t\t$asm .= \"9\";\n\t\twhile(@args < 9) {\n\t\t\tpush @args, \"0\";\n\t\t}\n\t} else {\n\t\tprint STDERR \"$ARGV:$.: too many arguments to system call\\n\";\n\t}\n\n\t# System call number.\n\tif($sysname eq \"\") {\n\t\t$sysname = \"SYS_$func\";\n\t\t$sysname =~ s/([a-z])([A-Z])/${1}_$2/g;\t# turn FooBar into Foo_Bar\n\t\t$sysname =~ y/a-z/A-Z/;\n\t}\n\n\t# Actual call.\n\tmy $args = join(', ', @args);\n\tmy $call = \"$asm($sysname, $args)\";\n\n\t# Assign return values.\n\tmy $body = \"\";\n\tmy @ret = (\"_\", \"_\", \"_\");\n\tmy $do_errno = 0;\n\tfor(my $i=0; $i<@out; $i++) {\n\t\tmy $p = $out[$i];\n\t\tmy ($name, $type) = parseparam($p);\n\t\tmy $reg = \"\";\n\t\tif($name eq \"err\" && !$plan9) {\n\t\t\t$reg = \"e1\";\n\t\t\t$ret[2] = $reg;\n\t\t\t$do_errno = 1;\n\t\t} elsif($name eq \"err\" && $plan9) {\n\t\t\t$ret[0] = \"r0\";\n\t\t\t$ret[2] = \"e1\";\n\t\t\tnext;\n\t\t} else {\n\t\t\t$reg = sprintf(\"r%d\", $i);\n\t\t\t$ret[$i] = $reg;\n\t\t}\n\t\tif($type eq \"bool\") {\n\t\t\t$reg = \"$reg != 0\";\n\t\t}\n\t\tif($type eq \"int64\" && $_32bit ne \"\") {\n\t\t\t# 64-bit number in r1:r0 or r0:r1.\n\t\t\tif($i+2 > @out) {\n\t\t\t\tprint STDERR \"$ARGV:$.: not enough registers for int64 return\\n\";\n\t\t\t}\n\t\t\tif($_32bit eq \"big-endian\") {\n\t\t\t\t$reg = sprintf(\"int64(r%d)<<32 | int64(r%d)\", $i, $i+1);\n\t\t\t} else {\n\t\t\t\t$reg = sprintf(\"int64(r%d)<<32 | int64(r%d)\", $i+1, $i);\n\t\t\t}\n\t\t\t$ret[$i] = sprintf(\"r%d\", $i);\n\t\t\t$ret[$i+1] = sprintf(\"r%d\", $i+1);\n\t\t}\n\t\tif($reg ne \"e1\" || $plan9) {\n\t\t\t$body .= \"\\t$name = $type($reg)\\n\";\n\t\t}\n\t}\n\tif ($ret[0] eq \"_\" && $ret[1] eq \"_\" && $ret[2] eq \"_\") {\n\t\t$text .= \"\\t$call\\n\";\n\t} else {\n\t\t$text .= \"\\t$ret[0], $ret[1], $ret[2] := $call\\n\";\n\t}\n\t$text .= $body;\n\n\tif ($plan9 && $ret[2] eq \"e1\") {\n\t\t$text .= \"\\tif int32(r0) == -1 {\\n\";\n\t\t$text .= \"\\t\\terr = e1\\n\";\n\t\t$text .= \"\\t}\\n\";\n\t} elsif ($do_errno) {\n\t\t$text .= \"\\tif e1 != 0 {\\n\";\n\t\t$text .= \"\\t\\terr = errnoErr(e1)\\n\";\n\t\t$text .= \"\\t}\\n\";\n\t}\n\t$text .= \"\\treturn\\n\";\n\t$text .= \"}\\n\\n\";\n}\n\nchomp $text;\nchomp $text;\n\nif($errors) {\n\texit 1;\n}\n\nprint <<EOF;\n// $cmdline\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build $tags\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n$text\nEOF\nexit 0;\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksyscall_solaris.pl",
    "content": "#!/usr/bin/env perl\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n\n# This program reads a file containing function prototypes\n# (like syscall_solaris.go) and generates system call bodies.\n# The prototypes are marked by lines beginning with \"//sys\"\n# and read like func declarations if //sys is replaced by func, but:\n#\t* The parameter lists must give a name for each argument.\n#\t  This includes return parameters.\n#\t* The parameter lists must give a type for each argument:\n#\t  the (x, y, z int) shorthand is not allowed.\n#\t* If the return parameter is an error number, it must be named err.\n#\t* If go func name needs to be different than its libc name,\n#\t* or the function is not in libc, name could be specified\n#\t* at the end, after \"=\" sign, like\n#\t  //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt\n\nuse strict;\n\nmy $cmdline = \"mksyscall_solaris.pl \" . join(' ', @ARGV);\nmy $errors = 0;\nmy $_32bit = \"\";\nmy $tags = \"\";  # build tags\n\nbinmode STDOUT;\n\nif($ARGV[0] eq \"-b32\") {\n\t$_32bit = \"big-endian\";\n\tshift;\n} elsif($ARGV[0] eq \"-l32\") {\n\t$_32bit = \"little-endian\";\n\tshift;\n}\nif($ARGV[0] eq \"-tags\") {\n\tshift;\n\t$tags = $ARGV[0];\n\tshift;\n}\n\nif($ARGV[0] =~ /^-/) {\n\tprint STDERR \"usage: mksyscall_solaris.pl [-b32 | -l32] [-tags x,y] [file ...]\\n\";\n\texit 1;\n}\n\nsub parseparamlist($) {\n\tmy ($list) = @_;\n\t$list =~ s/^\\s*//;\n\t$list =~ s/\\s*$//;\n\tif($list eq \"\") {\n\t\treturn ();\n\t}\n\treturn split(/\\s*,\\s*/, $list);\n}\n\nsub parseparam($) {\n\tmy ($p) = @_;\n\tif($p !~ /^(\\S*) (\\S*)$/) {\n\t\tprint STDERR \"$ARGV:$.: malformed parameter: $p\\n\";\n\t\t$errors = 1;\n\t\treturn (\"xx\", \"int\");\n\t}\n\treturn ($1, $2);\n}\n\nmy $package = \"\";\nmy $text = \"\";\nmy $dynimports = \"\";\nmy $linknames = \"\";\nmy @vars = ();\nwhile(<>) {\n\tchomp;\n\ts/\\s+/ /g;\n\ts/^\\s+//;\n\ts/\\s+$//;\n\t$package = $1 if !$package && /^package (\\S+)$/;\n\tmy $nonblock = /^\\/\\/sysnb /;\n\tnext if !/^\\/\\/sys / && !$nonblock;\n\n\t# Line must be of the form\n\t#\tfunc Open(path string, mode int, perm int) (fd int, err error)\n\t# Split into name, in params, out params.\n\tif(!/^\\/\\/sys(nb)? (\\w+)\\(([^()]*)\\)\\s*(?:\\(([^()]+)\\))?\\s*(?:=\\s*(?:(\\w*)\\.)?(\\w*))?$/) {\n\t\tprint STDERR \"$ARGV:$.: malformed //sys declaration\\n\";\n\t\t$errors = 1;\n\t\tnext;\n\t}\n\tmy ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6);\n\n\t# Split argument lists on comma.\n\tmy @in = parseparamlist($in);\n\tmy @out = parseparamlist($out);\n\n\t# So file name.\n\tif($modname eq \"\") {\n\t\t$modname = \"libc\";\n\t}\n\n\t# System call name.\n\tif($sysname eq \"\") {\n\t\t$sysname = \"$func\";\n\t}\n\n\t# System call pointer variable name.\n\tmy $sysvarname = \"proc$sysname\";\n\n\tmy $strconvfunc = \"BytePtrFromString\";\n\tmy $strconvtype = \"*byte\";\n\n\t$sysname =~ y/A-Z/a-z/; # All libc functions are lowercase.\n\n\t# Runtime import of function to allow cross-platform builds.\n\t$dynimports .= \"//go:cgo_import_dynamic libc_${sysname} ${sysname} \\\"$modname.so\\\"\\n\";\n\t# Link symbol to proc address variable.\n\t$linknames .= \"//go:linkname ${sysvarname} libc_${sysname}\\n\";\n\t# Library proc address variable.\n\tpush @vars, $sysvarname;\n\n\t# Go function header.\n\t$out = join(', ', @out);\n\tif($out ne \"\") {\n\t\t$out = \" ($out)\";\n\t}\n\tif($text ne \"\") {\n\t\t$text .= \"\\n\"\n\t}\n\t$text .= sprintf \"func %s(%s)%s {\\n\", $func, join(', ', @in), $out;\n\n\t# Check if err return available\n\tmy $errvar = \"\";\n\tforeach my $p (@out) {\n\t\tmy ($name, $type) = parseparam($p);\n\t\tif($type eq \"error\") {\n\t\t\t$errvar = $name;\n\t\t\tlast;\n\t\t}\n\t}\n\n\t# Prepare arguments to Syscall.\n\tmy @args = ();\n\tmy $n = 0;\n\tforeach my $p (@in) {\n\t\tmy ($name, $type) = parseparam($p);\n\t\tif($type =~ /^\\*/) {\n\t\t\tpush @args, \"uintptr(unsafe.Pointer($name))\";\n\t\t} elsif($type eq \"string\" && $errvar ne \"\") {\n\t\t\t$text .= \"\\tvar _p$n $strconvtype\\n\";\n\t\t\t$text .= \"\\t_p$n, $errvar = $strconvfunc($name)\\n\";\n\t\t\t$text .= \"\\tif $errvar != nil {\\n\\t\\treturn\\n\\t}\\n\";\n\t\t\tpush @args, \"uintptr(unsafe.Pointer(_p$n))\";\n\t\t\t$n++;\n\t\t} elsif($type eq \"string\") {\n\t\t\tprint STDERR \"$ARGV:$.: $func uses string arguments, but has no error return\\n\";\n\t\t\t$text .= \"\\tvar _p$n $strconvtype\\n\";\n\t\t\t$text .= \"\\t_p$n, _ = $strconvfunc($name)\\n\";\n\t\t\tpush @args, \"uintptr(unsafe.Pointer(_p$n))\";\n\t\t\t$n++;\n\t\t} elsif($type =~ /^\\[\\](.*)/) {\n\t\t\t# Convert slice into pointer, length.\n\t\t\t# Have to be careful not to take address of &a[0] if len == 0:\n\t\t\t# pass nil in that case.\n\t\t\t$text .= \"\\tvar _p$n *$1\\n\";\n\t\t\t$text .= \"\\tif len($name) > 0 {\\n\\t\\t_p$n = \\&$name\\[0]\\n\\t}\\n\";\n\t\t\tpush @args, \"uintptr(unsafe.Pointer(_p$n))\", \"uintptr(len($name))\";\n\t\t\t$n++;\n\t\t} elsif($type eq \"int64\" && $_32bit ne \"\") {\n\t\t\tif($_32bit eq \"big-endian\") {\n\t\t\t\tpush @args, \"uintptr($name >> 32)\", \"uintptr($name)\";\n\t\t\t} else {\n\t\t\t\tpush @args, \"uintptr($name)\", \"uintptr($name >> 32)\";\n\t\t\t}\n\t\t} elsif($type eq \"bool\") {\n \t\t\t$text .= \"\\tvar _p$n uint32\\n\";\n\t\t\t$text .= \"\\tif $name {\\n\\t\\t_p$n = 1\\n\\t} else {\\n\\t\\t_p$n = 0\\n\\t}\\n\";\n\t\t\tpush @args, \"uintptr(_p$n)\";\n\t\t\t$n++;\n\t\t} else {\n\t\t\tpush @args, \"uintptr($name)\";\n\t\t}\n\t}\n\tmy $nargs = @args;\n\n\t# Determine which form to use; pad args with zeros.\n\tmy $asm = \"sysvicall6\";\n\tif ($nonblock) {\n\t\t$asm = \"rawSysvicall6\";\n\t}\n\tif(@args <= 6) {\n\t\twhile(@args < 6) {\n\t\t\tpush @args, \"0\";\n\t\t}\n\t} else {\n\t\tprint STDERR \"$ARGV:$.: too many arguments to system call\\n\";\n\t}\n\n\t# Actual call.\n\tmy $args = join(', ', @args);\n\tmy $call = \"$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)\";\n\n\t# Assign return values.\n\tmy $body = \"\";\n\tmy $failexpr = \"\";\n\tmy @ret = (\"_\", \"_\", \"_\");\n\tmy @pout= ();\n\tmy $do_errno = 0;\n\tfor(my $i=0; $i<@out; $i++) {\n\t\tmy $p = $out[$i];\n\t\tmy ($name, $type) = parseparam($p);\n\t\tmy $reg = \"\";\n\t\tif($name eq \"err\") {\n\t\t\t$reg = \"e1\";\n\t\t\t$ret[2] = $reg;\n\t\t\t$do_errno = 1;\n\t\t} else {\n\t\t\t$reg = sprintf(\"r%d\", $i);\n\t\t\t$ret[$i] = $reg;\n\t\t}\n\t\tif($type eq \"bool\") {\n\t\t\t$reg = \"$reg != 0\";\n\t\t}\n\t\tif($type eq \"int64\" && $_32bit ne \"\") {\n\t\t\t# 64-bit number in r1:r0 or r0:r1.\n\t\t\tif($i+2 > @out) {\n\t\t\t\tprint STDERR \"$ARGV:$.: not enough registers for int64 return\\n\";\n\t\t\t}\n\t\t\tif($_32bit eq \"big-endian\") {\n\t\t\t\t$reg = sprintf(\"int64(r%d)<<32 | int64(r%d)\", $i, $i+1);\n\t\t\t} else {\n\t\t\t\t$reg = sprintf(\"int64(r%d)<<32 | int64(r%d)\", $i+1, $i);\n\t\t\t}\n\t\t\t$ret[$i] = sprintf(\"r%d\", $i);\n\t\t\t$ret[$i+1] = sprintf(\"r%d\", $i+1);\n\t\t}\n\t\tif($reg ne \"e1\") {\n\t\t\t$body .= \"\\t$name = $type($reg)\\n\";\n\t\t}\n\t}\n\tif ($ret[0] eq \"_\" && $ret[1] eq \"_\" && $ret[2] eq \"_\") {\n\t\t$text .= \"\\t$call\\n\";\n\t} else {\n\t\t$text .= \"\\t$ret[0], $ret[1], $ret[2] := $call\\n\";\n\t}\n\t$text .= $body;\n\n\tif ($do_errno) {\n\t\t$text .= \"\\tif e1 != 0 {\\n\";\n\t\t$text .= \"\\t\\terr = e1\\n\";\n\t\t$text .= \"\\t}\\n\";\n\t}\n\t$text .= \"\\treturn\\n\";\n\t$text .= \"}\\n\";\n}\n\nif($errors) {\n\texit 1;\n}\n\nprint <<EOF;\n// $cmdline\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build $tags\n\npackage $package\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\nEOF\n\nprint \"import \\\"golang.org/x/sys/unix\\\"\\n\" if $package ne \"unix\";\n\nmy $vardecls = \"\\t\" . join(\",\\n\\t\", @vars);\n$vardecls .= \" syscallFunc\";\n\nchomp($_=<<EOF);\n\n$dynimports\n$linknames\nvar (\n$vardecls\n)\n\n$text\nEOF\nprint $_;\nexit 0;\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl",
    "content": "#!/usr/bin/env perl\n\n# Copyright 2011 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n\n#\n# Parse the header files for OpenBSD and generate a Go usable sysctl MIB.\n#\n# Build a MIB with each entry being an array containing the level, type and\n# a hash that will contain additional entries if the current entry is a node.\n# We then walk this MIB and create a flattened sysctl name to OID hash.\n#\n\nuse strict;\n\nif($ENV{'GOARCH'} eq \"\" || $ENV{'GOOS'} eq \"\") {\n\tprint STDERR \"GOARCH or GOOS not defined in environment\\n\";\n\texit 1;\n}\n\nmy $debug = 0;\nmy %ctls = ();\n\nmy @headers = qw (\n\tsys/sysctl.h\n\tsys/socket.h\n\tsys/tty.h\n\tsys/malloc.h\n\tsys/mount.h\n\tsys/namei.h\n\tsys/sem.h\n\tsys/shm.h\n\tsys/vmmeter.h\n\tuvm/uvm_param.h\n\tuvm/uvm_swap_encrypt.h\n\tddb/db_var.h\n\tnet/if.h\n\tnet/if_pfsync.h\n\tnet/pipex.h\n\tnetinet/in.h\n\tnetinet/icmp_var.h\n\tnetinet/igmp_var.h\n\tnetinet/ip_ah.h\n\tnetinet/ip_carp.h\n\tnetinet/ip_divert.h\n\tnetinet/ip_esp.h\n\tnetinet/ip_ether.h\n\tnetinet/ip_gre.h\n\tnetinet/ip_ipcomp.h\n\tnetinet/ip_ipip.h\n\tnetinet/pim_var.h\n\tnetinet/tcp_var.h\n\tnetinet/udp_var.h\n\tnetinet6/in6.h\n\tnetinet6/ip6_divert.h\n\tnetinet6/pim6_var.h\n\tnetinet/icmp6.h\n\tnetmpls/mpls.h\n);\n\nmy @ctls = qw (\n\tkern\n\tvm\n\tfs\n\tnet\n\t#debug\t\t\t\t# Special handling required\n\thw\n\t#machdep\t\t\t# Arch specific\n\tuser\n\tddb\n\t#vfs\t\t\t\t# Special handling required\n\tfs.posix\n\tkern.forkstat\n\tkern.intrcnt\n\tkern.malloc\n\tkern.nchstats\n\tkern.seminfo\n\tkern.shminfo\n\tkern.timecounter\n\tkern.tty\n\tkern.watchdog\n\tnet.bpf\n\tnet.ifq\n\tnet.inet\n\tnet.inet.ah\n\tnet.inet.carp\n\tnet.inet.divert\n\tnet.inet.esp\n\tnet.inet.etherip\n\tnet.inet.gre\n\tnet.inet.icmp\n\tnet.inet.igmp\n\tnet.inet.ip\n\tnet.inet.ip.ifq\n\tnet.inet.ipcomp\n\tnet.inet.ipip\n\tnet.inet.mobileip\n\tnet.inet.pfsync\n\tnet.inet.pim\n\tnet.inet.tcp\n\tnet.inet.udp\n\tnet.inet6\n\tnet.inet6.divert\n\tnet.inet6.ip6\n\tnet.inet6.icmp6\n\tnet.inet6.pim6\n\tnet.inet6.tcp6\n\tnet.inet6.udp6\n\tnet.mpls\n\tnet.mpls.ifq\n\tnet.key\n\tnet.pflow\n\tnet.pfsync\n\tnet.pipex\n\tnet.rt\n\tvm.swapencrypt\n\t#vfsgenctl\t\t\t# Special handling required\n);\n\n# Node name \"fixups\"\nmy %ctl_map = (\n\t\"ipproto\" => \"net.inet\",\n\t\"net.inet.ipproto\" => \"net.inet\",\n\t\"net.inet6.ipv6proto\" => \"net.inet6\",\n\t\"net.inet6.ipv6\" => \"net.inet6.ip6\",\n\t\"net.inet.icmpv6\" => \"net.inet6.icmp6\",\n\t\"net.inet6.divert6\" => \"net.inet6.divert\",\n\t\"net.inet6.tcp6\" => \"net.inet.tcp\",\n\t\"net.inet6.udp6\" => \"net.inet.udp\",\n\t\"mpls\" => \"net.mpls\",\n\t\"swpenc\" => \"vm.swapencrypt\"\n);\n\n# Node mappings\nmy %node_map = (\n\t\"net.inet.ip.ifq\" => \"net.ifq\",\n\t\"net.inet.pfsync\" => \"net.pfsync\",\n\t\"net.mpls.ifq\" => \"net.ifq\"\n);\n\nmy $ctlname;\nmy %mib = ();\nmy %sysctl = ();\nmy $node;\n\nsub debug() {\n\tprint STDERR \"$_[0]\\n\" if $debug;\n}\n\n# Walk the MIB and build a sysctl name to OID mapping.\nsub build_sysctl() {\n\tmy ($node, $name, $oid) = @_;\n\tmy %node = %{$node};\n\tmy @oid = @{$oid};\n\n\tforeach my $key (sort keys %node) {\n\t\tmy @node = @{$node{$key}};\n\t\tmy $nodename = $name.($name ne '' ? '.' : '').$key;\n\t\tmy @nodeoid = (@oid, $node[0]);\n\t\tif ($node[1] eq 'CTLTYPE_NODE') {\n\t\t\tif (exists $node_map{$nodename}) {\n\t\t\t\t$node = \\%mib;\n\t\t\t\t$ctlname = $node_map{$nodename};\n\t\t\t\tforeach my $part (split /\\./, $ctlname) {\n\t\t\t\t\t$node = \\%{@{$$node{$part}}[2]};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$node = $node[2];\n\t\t\t}\n\t\t\t&build_sysctl($node, $nodename, \\@nodeoid);\n\t\t} elsif ($node[1] ne '') {\n\t\t\t$sysctl{$nodename} = \\@nodeoid;\n\t\t}\n\t}\n}\n\nforeach my $ctl (@ctls) {\n\t$ctls{$ctl} = $ctl;\n}\n\n# Build MIB\nforeach my $header (@headers) {\n\t&debug(\"Processing $header...\");\n\topen HEADER, \"/usr/include/$header\" ||\n\t    print STDERR \"Failed to open $header\\n\";\n\twhile (<HEADER>) {\n\t\tif ($_ =~ /^#define\\s+(CTL_NAMES)\\s+{/ ||\n\t\t    $_ =~ /^#define\\s+(CTL_(.*)_NAMES)\\s+{/ ||\n\t\t    $_ =~ /^#define\\s+((.*)CTL_NAMES)\\s+{/) {\n\t\t\tif ($1 eq 'CTL_NAMES') {\n\t\t\t\t# Top level.\n\t\t\t\t$node = \\%mib;\n\t\t\t} else {\n\t\t\t\t# Node.\n\t\t\t\tmy $nodename = lc($2);\n\t\t\t\tif ($header =~ /^netinet\\//) {\n\t\t\t\t\t$ctlname = \"net.inet.$nodename\";\n\t\t\t\t} elsif ($header =~ /^netinet6\\//) {\n\t\t\t\t\t$ctlname = \"net.inet6.$nodename\";\n\t\t\t\t} elsif ($header =~ /^net\\//) {\n\t\t\t\t\t$ctlname = \"net.$nodename\";\n\t\t\t\t} else {\n\t\t\t\t\t$ctlname = \"$nodename\";\n\t\t\t\t\t$ctlname =~ s/^(fs|net|kern)_/$1\\./;\n\t\t\t\t}\n\t\t\t\tif (exists $ctl_map{$ctlname}) {\n\t\t\t\t\t$ctlname = $ctl_map{$ctlname};\n\t\t\t\t}\n\t\t\t\tif (not exists $ctls{$ctlname}) {\n\t\t\t\t\t&debug(\"Ignoring $ctlname...\");\n\t\t\t\t\tnext;\n\t\t\t\t}\n\n\t\t\t\t# Walk down from the top of the MIB.\n\t\t\t\t$node = \\%mib;\n\t\t\t\tforeach my $part (split /\\./, $ctlname) {\n\t\t\t\t\tif (not exists $$node{$part}) {\n\t\t\t\t\t\t&debug(\"Missing node $part\");\n\t\t\t\t\t\t$$node{$part} = [ 0, '', {} ];\n\t\t\t\t\t}\n\t\t\t\t\t$node = \\%{@{$$node{$part}}[2]};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t# Populate current node with entries.\n\t\t\tmy $i = -1;\n\t\t\twhile (defined($_) && $_ !~ /^}/) {\n\t\t\t\t$_ = <HEADER>;\n\t\t\t\t$i++ if $_ =~ /{.*}/;\n\t\t\t\tnext if $_ !~ /{\\s+\"(\\w+)\",\\s+(CTLTYPE_[A-Z]+)\\s+}/;\n\t\t\t\t$$node{$1} = [ $i, $2, {} ];\n\t\t\t}\n\t\t}\n\t}\n\tclose HEADER;\n}\n\n&build_sysctl(\\%mib, \"\", []);\n\nprint <<EOF;\n// mksysctl_openbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build $ENV{'GOARCH'},$ENV{'GOOS'}\n\npackage unix;\n\ntype mibentry struct {\n\tctlname string\n\tctloid []_C_int\n}\n\nvar sysctlMib = []mibentry {\nEOF\n\nforeach my $name (sort keys %sysctl) {\n\tmy @oid = @{$sysctl{$name}};\n\tprint \"\\t{ \\\"$name\\\", []_C_int{ \", join(', ', @oid), \" } }, \\n\";\n}\n\nprint <<EOF;\n}\nEOF\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksysnum_darwin.pl",
    "content": "#!/usr/bin/env perl\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n#\n# Generate system call table for Darwin from sys/syscall.h\n\nuse strict;\n\nif($ENV{'GOARCH'} eq \"\" || $ENV{'GOOS'} eq \"\") {\n\tprint STDERR \"GOARCH or GOOS not defined in environment\\n\";\n\texit 1;\n}\n\nmy $command = \"mksysnum_darwin.pl \" . join(' ', @ARGV);\n\nprint <<EOF;\n// $command\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build $ENV{'GOARCH'},$ENV{'GOOS'}\n\npackage unix\n\nconst (\nEOF\n\nwhile(<>){\n\tif(/^#define\\s+SYS_(\\w+)\\s+([0-9]+)/){\n\t\tmy $name = $1;\n\t\tmy $num = $2;\n\t\t$name =~ y/a-z/A-Z/;\n\t\tprint \"\tSYS_$name = $num;\"\n\t}\n}\n\nprint <<EOF;\n)\nEOF\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl",
    "content": "#!/usr/bin/env perl\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n#\n# Generate system call table for DragonFly from master list\n# (for example, /usr/src/sys/kern/syscalls.master).\n\nuse strict;\n\nif($ENV{'GOARCH'} eq \"\" || $ENV{'GOOS'} eq \"\") {\n\tprint STDERR \"GOARCH or GOOS not defined in environment\\n\";\n\texit 1;\n}\n\nmy $command = \"mksysnum_dragonfly.pl \" . join(' ', @ARGV);\n\nprint <<EOF;\n// $command\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build $ENV{'GOARCH'},$ENV{'GOOS'}\n\npackage unix\n\nconst (\nEOF\n\nwhile(<>){\n\tif(/^([0-9]+)\\s+STD\\s+({ \\S+\\s+(\\w+).*)$/){\n\t\tmy $num = $1;\n\t\tmy $proto = $2;\n\t\tmy $name = \"SYS_$3\";\n\t\t$name =~ y/a-z/A-Z/;\n\n\t\t# There are multiple entries for enosys and nosys, so comment them out.\n\t\tif($name =~ /^SYS_E?NOSYS$/){\n\t\t\t$name = \"// $name\";\n\t\t}\n\t\tif($name eq 'SYS_SYS_EXIT'){\n\t\t\t$name = 'SYS_EXIT';\n\t\t}\n\n\t\tprint \"\t$name = $num;  // $proto\\n\";\n\t}\n}\n\nprint <<EOF;\n)\nEOF\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl",
    "content": "#!/usr/bin/env perl\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n#\n# Generate system call table for FreeBSD from master list\n# (for example, /usr/src/sys/kern/syscalls.master).\n\nuse strict;\n\nif($ENV{'GOARCH'} eq \"\" || $ENV{'GOOS'} eq \"\") {\n\tprint STDERR \"GOARCH or GOOS not defined in environment\\n\";\n\texit 1;\n}\n\nmy $command = \"mksysnum_freebsd.pl \" . join(' ', @ARGV);\n\nprint <<EOF;\n// $command\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build $ENV{'GOARCH'},$ENV{'GOOS'}\n\npackage unix\n\nconst (\nEOF\n\nwhile(<>){\n\tif(/^([0-9]+)\\s+\\S+\\s+STD\\s+({ \\S+\\s+(\\w+).*)$/){\n\t\tmy $num = $1;\n\t\tmy $proto = $2;\n\t\tmy $name = \"SYS_$3\";\n\t\t$name =~ y/a-z/A-Z/;\n\n\t\t# There are multiple entries for enosys and nosys, so comment them out.\n\t\tif($name =~ /^SYS_E?NOSYS$/){\n\t\t\t$name = \"// $name\";\n\t\t}\n\t\tif($name eq 'SYS_SYS_EXIT'){\n\t\t\t$name = 'SYS_EXIT';\n\t\t}\n\n\t\tprint \"\t$name = $num;  // $proto\\n\";\n\t}\n}\n\nprint <<EOF;\n)\nEOF\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl",
    "content": "#!/usr/bin/env perl\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n#\n# Generate system call table for OpenBSD from master list\n# (for example, /usr/src/sys/kern/syscalls.master).\n\nuse strict;\n\nif($ENV{'GOARCH'} eq \"\" || $ENV{'GOOS'} eq \"\") {\n\tprint STDERR \"GOARCH or GOOS not defined in environment\\n\";\n\texit 1;\n}\n\nmy $command = \"mksysnum_netbsd.pl \" . join(' ', @ARGV);\n\nprint <<EOF;\n// $command\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build $ENV{'GOARCH'},$ENV{'GOOS'}\n\npackage unix\n\nconst (\nEOF\n\nmy $line = '';\nwhile(<>){\n\tif($line =~ /^(.*)\\\\$/) {\n\t\t# Handle continuation\n\t\t$line = $1;\n\t\t$_ =~ s/^\\s+//;\n\t\t$line .= $_;\n\t} else {\n\t\t# New line\n\t\t$line = $_;\n\t}\n\tnext if $line =~ /\\\\$/;\n\tif($line =~ /^([0-9]+)\\s+((STD)|(NOERR))\\s+(RUMP\\s+)?({\\s+\\S+\\s*\\*?\\s*\\|(\\S+)\\|(\\S*)\\|(\\w+).*\\s+})(\\s+(\\S+))?$/) {\n\t\tmy $num = $1;\n\t\tmy $proto = $6;\n\t\tmy $compat = $8;\n\t\tmy $name = \"$7_$9\";\n\n\t\t$name = \"$7_$11\" if $11 ne '';\n\t\t$name =~ y/a-z/A-Z/;\n\n\t\tif($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') {\n\t\t\tprint \"\t$name = $num;  // $proto\\n\";\n\t\t}\n\t}\n}\n\nprint <<EOF;\n)\nEOF\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl",
    "content": "#!/usr/bin/env perl\n# Copyright 2009 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n#\n# Generate system call table for OpenBSD from master list\n# (for example, /usr/src/sys/kern/syscalls.master).\n\nuse strict;\n\nif($ENV{'GOARCH'} eq \"\" || $ENV{'GOOS'} eq \"\") {\n\tprint STDERR \"GOARCH or GOOS not defined in environment\\n\";\n\texit 1;\n}\n\nmy $command = \"mksysnum_openbsd.pl \" . join(' ', @ARGV);\n\nprint <<EOF;\n// $command\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build $ENV{'GOARCH'},$ENV{'GOOS'}\n\npackage unix\n\nconst (\nEOF\n\nwhile(<>){\n\tif(/^([0-9]+)\\s+STD\\s+(NOLOCK\\s+)?({ \\S+\\s+\\*?(\\w+).*)$/){\n\t\tmy $num = $1;\n\t\tmy $proto = $3;\n\t\tmy $name = $4;\n\t\t$name =~ y/a-z/A-Z/;\n\n\t\t# There are multiple entries for enosys and nosys, so comment them out.\n\t\tif($name =~ /^SYS_E?NOSYS$/){\n\t\t\t$name = \"// $name\";\n\t\t}\n\t\tif($name eq 'SYS_SYS_EXIT'){\n\t\t\t$name = 'SYS_EXIT';\n\t\t}\n\n\t\tprint \"\t$name = $num;  // $proto\\n\";\n\t}\n}\n\nprint <<EOF;\n)\nEOF\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/openbsd_pledge.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build openbsd\n// +build 386 amd64 arm\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nconst (\n\tSYS_PLEDGE = 108\n)\n\n// Pledge implements the pledge syscall. For more information see pledge(2).\nfunc Pledge(promises string, paths []string) error {\n\tpromisesPtr, err := syscall.BytePtrFromString(promises)\n\tif err != nil {\n\t\treturn err\n\t}\n\tpromisesUnsafe, pathsUnsafe := unsafe.Pointer(promisesPtr), unsafe.Pointer(nil)\n\tif paths != nil {\n\t\tvar pathsPtr []*byte\n\t\tif pathsPtr, err = syscall.SlicePtrFromStrings(paths); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpathsUnsafe = unsafe.Pointer(&pathsPtr[0])\n\t}\n\t_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(promisesUnsafe), uintptr(pathsUnsafe), 0)\n\tif e != 0 {\n\t\treturn e\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/pagesize_unix.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\n// For Unix, get the pagesize from the runtime.\n\npackage unix\n\nimport \"syscall\"\n\nfunc Getpagesize() int {\n\treturn syscall.Getpagesize()\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/race.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin,race linux,race freebsd,race\n\npackage unix\n\nimport (\n\t\"runtime\"\n\t\"unsafe\"\n)\n\nconst raceenabled = true\n\nfunc raceAcquire(addr unsafe.Pointer) {\n\truntime.RaceAcquire(addr)\n}\n\nfunc raceReleaseMerge(addr unsafe.Pointer) {\n\truntime.RaceReleaseMerge(addr)\n}\n\nfunc raceReadRange(addr unsafe.Pointer, len int) {\n\truntime.RaceReadRange(addr, len)\n}\n\nfunc raceWriteRange(addr unsafe.Pointer, len int) {\n\truntime.RaceWriteRange(addr, len)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/race0.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly\n\npackage unix\n\nimport (\n\t\"unsafe\"\n)\n\nconst raceenabled = false\n\nfunc raceAcquire(addr unsafe.Pointer) {\n}\n\nfunc raceReleaseMerge(addr unsafe.Pointer) {\n}\n\nfunc raceReadRange(addr unsafe.Pointer, len int) {\n}\n\nfunc raceWriteRange(addr unsafe.Pointer, len int) {\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/sockcmsg_linux.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Socket control messages\n\npackage unix\n\nimport \"unsafe\"\n\n// UnixCredentials encodes credentials into a socket control message\n// for sending to another process. This can be used for\n// authentication.\nfunc UnixCredentials(ucred *Ucred) []byte {\n\tb := make([]byte, CmsgSpace(SizeofUcred))\n\th := (*Cmsghdr)(unsafe.Pointer(&b[0]))\n\th.Level = SOL_SOCKET\n\th.Type = SCM_CREDENTIALS\n\th.SetLen(CmsgLen(SizeofUcred))\n\t*((*Ucred)(cmsgData(h))) = *ucred\n\treturn b\n}\n\n// ParseUnixCredentials decodes a socket control message that contains\n// credentials in a Ucred structure. To receive such a message, the\n// SO_PASSCRED option must be enabled on the socket.\nfunc ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) {\n\tif m.Header.Level != SOL_SOCKET {\n\t\treturn nil, EINVAL\n\t}\n\tif m.Header.Type != SCM_CREDENTIALS {\n\t\treturn nil, EINVAL\n\t}\n\tucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))\n\treturn &ucred, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/sockcmsg_unix.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\n// Socket control messages\n\npackage unix\n\nimport \"unsafe\"\n\n// Round the length of a raw sockaddr up to align it properly.\nfunc cmsgAlignOf(salen int) int {\n\tsalign := sizeofPtr\n\t// NOTE: It seems like 64-bit Darwin, DragonFly BSD and\n\t// Solaris kernels still require 32-bit aligned access to\n\t// network subsystem.\n\tif darwin64Bit || dragonfly64Bit || solaris64Bit {\n\t\tsalign = 4\n\t}\n\treturn (salen + salign - 1) & ^(salign - 1)\n}\n\n// CmsgLen returns the value to store in the Len field of the Cmsghdr\n// structure, taking into account any necessary alignment.\nfunc CmsgLen(datalen int) int {\n\treturn cmsgAlignOf(SizeofCmsghdr) + datalen\n}\n\n// CmsgSpace returns the number of bytes an ancillary element with\n// payload of the passed data length occupies.\nfunc CmsgSpace(datalen int) int {\n\treturn cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen)\n}\n\nfunc cmsgData(h *Cmsghdr) unsafe.Pointer {\n\treturn unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)))\n}\n\n// SocketControlMessage represents a socket control message.\ntype SocketControlMessage struct {\n\tHeader Cmsghdr\n\tData   []byte\n}\n\n// ParseSocketControlMessage parses b as an array of socket control\n// messages.\nfunc ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) {\n\tvar msgs []SocketControlMessage\n\ti := 0\n\tfor i+CmsgLen(0) <= len(b) {\n\t\th, dbuf, err := socketControlMessageHeaderAndData(b[i:])\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tm := SocketControlMessage{Header: *h, Data: dbuf}\n\t\tmsgs = append(msgs, m)\n\t\ti += cmsgAlignOf(int(h.Len))\n\t}\n\treturn msgs, nil\n}\n\nfunc socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) {\n\th := (*Cmsghdr)(unsafe.Pointer(&b[0]))\n\tif h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) {\n\t\treturn nil, nil, EINVAL\n\t}\n\treturn h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil\n}\n\n// UnixRights encodes a set of open file descriptors into a socket\n// control message for sending to another process.\nfunc UnixRights(fds ...int) []byte {\n\tdatalen := len(fds) * 4\n\tb := make([]byte, CmsgSpace(datalen))\n\th := (*Cmsghdr)(unsafe.Pointer(&b[0]))\n\th.Level = SOL_SOCKET\n\th.Type = SCM_RIGHTS\n\th.SetLen(CmsgLen(datalen))\n\tdata := cmsgData(h)\n\tfor _, fd := range fds {\n\t\t*(*int32)(data) = int32(fd)\n\t\tdata = unsafe.Pointer(uintptr(data) + 4)\n\t}\n\treturn b\n}\n\n// ParseUnixRights decodes a socket control message that contains an\n// integer array of open file descriptors from another process.\nfunc ParseUnixRights(m *SocketControlMessage) ([]int, error) {\n\tif m.Header.Level != SOL_SOCKET {\n\t\treturn nil, EINVAL\n\t}\n\tif m.Header.Type != SCM_RIGHTS {\n\t\treturn nil, EINVAL\n\t}\n\tfds := make([]int, len(m.Data)>>2)\n\tfor i, j := 0, 0; i < len(m.Data); i += 4 {\n\t\tfds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i])))\n\t\tj++\n\t}\n\treturn fds, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/str.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\npackage unix\n\nfunc itoa(val int) string { // do it here rather than with fmt to avoid dependency\n\tif val < 0 {\n\t\treturn \"-\" + uitoa(uint(-val))\n\t}\n\treturn uitoa(uint(val))\n}\n\nfunc uitoa(val uint) string {\n\tvar buf [32]byte // big enough for int64\n\ti := len(buf) - 1\n\tfor val >= 10 {\n\t\tbuf[i] = byte(val%10 + '0')\n\t\ti--\n\t\tval /= 10\n\t}\n\tbuf[i] = byte(val + '0')\n\treturn string(buf[i:])\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\n// Package unix contains an interface to the low-level operating system\n// primitives. OS details vary depending on the underlying system, and\n// by default, godoc will display OS-specific documentation for the current\n// system. If you want godoc to display OS documentation for another\n// system, set $GOOS and $GOARCH to the desired system. For example, if\n// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS\n// to freebsd and $GOARCH to arm.\n// The primary use of this package is inside other packages that provide a more\n// portable interface to the system, such as \"os\", \"time\" and \"net\".  Use\n// those packages rather than this one if you can.\n// For details of the functions and data types in this package consult\n// the manuals for the appropriate operating system.\n// These calls return err == nil to indicate success; otherwise\n// err represents an operating system error describing the failure and\n// holds a value of type syscall.Errno.\npackage unix // import \"golang.org/x/sys/unix\"\n\n// ByteSliceFromString returns a NUL-terminated slice of bytes\n// containing the text of s. If s contains a NUL byte at any\n// location, it returns (nil, EINVAL).\nfunc ByteSliceFromString(s string) ([]byte, error) {\n\tfor i := 0; i < len(s); i++ {\n\t\tif s[i] == 0 {\n\t\t\treturn nil, EINVAL\n\t\t}\n\t}\n\ta := make([]byte, len(s)+1)\n\tcopy(a, s)\n\treturn a, nil\n}\n\n// BytePtrFromString returns a pointer to a NUL-terminated array of\n// bytes containing the text of s. If s contains a NUL byte at any\n// location, it returns (nil, EINVAL).\nfunc BytePtrFromString(s string) (*byte, error) {\n\ta, err := ByteSliceFromString(s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &a[0], nil\n}\n\n// Single-word zero for use when we need a valid pointer to 0 bytes.\n// See mkunix.pl.\nvar _zero uintptr\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_bsd.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd netbsd openbsd\n\n// BSD system call wrappers shared by *BSD based systems\n// including OS X (Darwin) and FreeBSD.  Like the other\n// syscall_*.go files it is compiled as Go code but also\n// used as input to mksyscall which parses the //sys\n// lines and generates system call stubs.\n\npackage unix\n\nimport (\n\t\"runtime\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n/*\n * Wrapped\n */\n\n//sysnb\tgetgroups(ngid int, gid *_Gid_t) (n int, err error)\n//sysnb\tsetgroups(ngid int, gid *_Gid_t) (err error)\n\nfunc Getgroups() (gids []int, err error) {\n\tn, err := getgroups(0, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif n == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Sanity check group count. Max is 16 on BSD.\n\tif n < 0 || n > 1000 {\n\t\treturn nil, EINVAL\n\t}\n\n\ta := make([]_Gid_t, n)\n\tn, err = getgroups(n, &a[0])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgids = make([]int, n)\n\tfor i, v := range a[0:n] {\n\t\tgids[i] = int(v)\n\t}\n\treturn\n}\n\nfunc Setgroups(gids []int) (err error) {\n\tif len(gids) == 0 {\n\t\treturn setgroups(0, nil)\n\t}\n\n\ta := make([]_Gid_t, len(gids))\n\tfor i, v := range gids {\n\t\ta[i] = _Gid_t(v)\n\t}\n\treturn setgroups(len(a), &a[0])\n}\n\nfunc ReadDirent(fd int, buf []byte) (n int, err error) {\n\t// Final argument is (basep *uintptr) and the syscall doesn't take nil.\n\t// 64 bits should be enough. (32 bits isn't even on 386). Since the\n\t// actual system call is getdirentries64, 64 is a good guess.\n\t// TODO(rsc): Can we use a single global basep for all calls?\n\tvar base = (*uintptr)(unsafe.Pointer(new(uint64)))\n\treturn Getdirentries(fd, buf, base)\n}\n\n// Wait status is 7 bits at bottom, either 0 (exited),\n// 0x7F (stopped), or a signal number that caused an exit.\n// The 0x80 bit is whether there was a core dump.\n// An extra number (exit code, signal causing a stop)\n// is in the high bits.\n\ntype WaitStatus uint32\n\nconst (\n\tmask  = 0x7F\n\tcore  = 0x80\n\tshift = 8\n\n\texited  = 0\n\tstopped = 0x7F\n)\n\nfunc (w WaitStatus) Exited() bool { return w&mask == exited }\n\nfunc (w WaitStatus) ExitStatus() int {\n\tif w&mask != exited {\n\t\treturn -1\n\t}\n\treturn int(w >> shift)\n}\n\nfunc (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }\n\nfunc (w WaitStatus) Signal() syscall.Signal {\n\tsig := syscall.Signal(w & mask)\n\tif sig == stopped || sig == 0 {\n\t\treturn -1\n\t}\n\treturn sig\n}\n\nfunc (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }\n\nfunc (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }\n\nfunc (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }\n\nfunc (w WaitStatus) StopSignal() syscall.Signal {\n\tif !w.Stopped() {\n\t\treturn -1\n\t}\n\treturn syscall.Signal(w>>shift) & 0xFF\n}\n\nfunc (w WaitStatus) TrapCause() int { return -1 }\n\n//sys\twait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)\n\nfunc Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {\n\tvar status _C_int\n\twpid, err = wait4(pid, &status, options, rusage)\n\tif wstatus != nil {\n\t\t*wstatus = WaitStatus(status)\n\t}\n\treturn\n}\n\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\tShutdown(s int, how int) (err error)\n\nfunc (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Len = SizeofSockaddrInet4\n\tsa.raw.Family = AF_INET\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil\n}\n\nfunc (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Len = SizeofSockaddrInet6\n\tsa.raw.Family = AF_INET6\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tsa.raw.Scope_id = sa.ZoneId\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil\n}\n\nfunc (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tname := sa.Name\n\tn := len(name)\n\tif n >= len(sa.raw.Path) || n == 0 {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL\n\tsa.raw.Family = AF_UNIX\n\tfor i := 0; i < n; i++ {\n\t\tsa.raw.Path[i] = int8(name[i])\n\t}\n\treturn unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil\n}\n\nfunc (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Index == 0 {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Len = sa.Len\n\tsa.raw.Family = AF_LINK\n\tsa.raw.Index = sa.Index\n\tsa.raw.Type = sa.Type\n\tsa.raw.Nlen = sa.Nlen\n\tsa.raw.Alen = sa.Alen\n\tsa.raw.Slen = sa.Slen\n\tfor i := 0; i < len(sa.raw.Data); i++ {\n\t\tsa.raw.Data[i] = sa.Data[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil\n}\n\nfunc anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {\n\tswitch rsa.Addr.Family {\n\tcase AF_LINK:\n\t\tpp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrDatalink)\n\t\tsa.Len = pp.Len\n\t\tsa.Family = pp.Family\n\t\tsa.Index = pp.Index\n\t\tsa.Type = pp.Type\n\t\tsa.Nlen = pp.Nlen\n\t\tsa.Alen = pp.Alen\n\t\tsa.Slen = pp.Slen\n\t\tfor i := 0; i < len(sa.Data); i++ {\n\t\t\tsa.Data[i] = pp.Data[i]\n\t\t}\n\t\treturn sa, nil\n\n\tcase AF_UNIX:\n\t\tpp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))\n\t\tif pp.Len < 2 || pp.Len > SizeofSockaddrUnix {\n\t\t\treturn nil, EINVAL\n\t\t}\n\t\tsa := new(SockaddrUnix)\n\n\t\t// Some BSDs include the trailing NUL in the length, whereas\n\t\t// others do not. Work around this by subtracting the leading\n\t\t// family and len. The path is then scanned to see if a NUL\n\t\t// terminator still exists within the length.\n\t\tn := int(pp.Len) - 2 // subtract leading Family, Len\n\t\tfor i := 0; i < n; i++ {\n\t\t\tif pp.Path[i] == 0 {\n\t\t\t\t// found early NUL; assume Len included the NUL\n\t\t\t\t// or was overestimating.\n\t\t\t\tn = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tbytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]\n\t\tsa.Name = string(bytes)\n\t\treturn sa, nil\n\n\tcase AF_INET:\n\t\tpp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet4)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\n\tcase AF_INET6:\n\t\tpp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet6)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tsa.ZoneId = pp.Scope_id\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\t}\n\treturn nil, EAFNOSUPPORT\n}\n\nfunc Accept(fd int) (nfd int, sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tnfd, err = accept(fd, &rsa, &len)\n\tif err != nil {\n\t\treturn\n\t}\n\tif runtime.GOOS == \"darwin\" && len == 0 {\n\t\t// Accepted socket has no address.\n\t\t// This is likely due to a bug in xnu kernels,\n\t\t// where instead of ECONNABORTED error socket\n\t\t// is accepted, but has no address.\n\t\tClose(nfd)\n\t\treturn 0, nil, ECONNABORTED\n\t}\n\tsa, err = anyToSockaddr(&rsa)\n\tif err != nil {\n\t\tClose(nfd)\n\t\tnfd = 0\n\t}\n\treturn\n}\n\nfunc Getsockname(fd int) (sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tif err = getsockname(fd, &rsa, &len); err != nil {\n\t\treturn\n\t}\n\t// TODO(jsing): DragonFly has a \"bug\" (see issue 3349), which should be\n\t// reported upstream.\n\tif runtime.GOOS == \"dragonfly\" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 {\n\t\trsa.Addr.Family = AF_UNIX\n\t\trsa.Addr.Len = SizeofSockaddrUnix\n\t}\n\treturn anyToSockaddr(&rsa)\n}\n\n//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)\n\nfunc GetsockoptByte(fd, level, opt int) (value byte, err error) {\n\tvar n byte\n\tvallen := _Socklen(1)\n\terr = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)\n\treturn n, err\n}\n\nfunc GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {\n\tvallen := _Socklen(4)\n\terr = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen)\n\treturn value, err\n}\n\nfunc GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {\n\tvar value IPMreq\n\tvallen := _Socklen(SizeofIPMreq)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {\n\tvar value IPv6Mreq\n\tvallen := _Socklen(SizeofIPv6Mreq)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {\n\tvar value IPv6MTUInfo\n\tvallen := _Socklen(SizeofIPv6MTUInfo)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) {\n\tvar value ICMPv6Filter\n\tvallen := _Socklen(SizeofICMPv6Filter)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\n//sys   recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys   sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n\nfunc Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {\n\tvar msg Msghdr\n\tvar rsa RawSockaddrAny\n\tmsg.Name = (*byte)(unsafe.Pointer(&rsa))\n\tmsg.Namelen = uint32(SizeofSockaddrAny)\n\tvar iov Iovec\n\tif len(p) > 0 {\n\t\tiov.Base = (*byte)(unsafe.Pointer(&p[0]))\n\t\tiov.SetLen(len(p))\n\t}\n\tvar dummy byte\n\tif len(oob) > 0 {\n\t\t// receive at least one normal byte\n\t\tif len(p) == 0 {\n\t\t\tiov.Base = &dummy\n\t\t\tiov.SetLen(1)\n\t\t}\n\t\tmsg.Control = (*byte)(unsafe.Pointer(&oob[0]))\n\t\tmsg.SetControllen(len(oob))\n\t}\n\tmsg.Iov = &iov\n\tmsg.Iovlen = 1\n\tif n, err = recvmsg(fd, &msg, flags); err != nil {\n\t\treturn\n\t}\n\toobn = int(msg.Controllen)\n\trecvflags = int(msg.Flags)\n\t// source address is only specified if the socket is unconnected\n\tif rsa.Addr.Family != AF_UNSPEC {\n\t\tfrom, err = anyToSockaddr(&rsa)\n\t}\n\treturn\n}\n\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n\nfunc Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {\n\t_, err = SendmsgN(fd, p, oob, to, flags)\n\treturn\n}\n\nfunc SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {\n\tvar ptr unsafe.Pointer\n\tvar salen _Socklen\n\tif to != nil {\n\t\tptr, salen, err = to.sockaddr()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\tvar msg Msghdr\n\tmsg.Name = (*byte)(unsafe.Pointer(ptr))\n\tmsg.Namelen = uint32(salen)\n\tvar iov Iovec\n\tif len(p) > 0 {\n\t\tiov.Base = (*byte)(unsafe.Pointer(&p[0]))\n\t\tiov.SetLen(len(p))\n\t}\n\tvar dummy byte\n\tif len(oob) > 0 {\n\t\t// send at least one normal byte\n\t\tif len(p) == 0 {\n\t\t\tiov.Base = &dummy\n\t\t\tiov.SetLen(1)\n\t\t}\n\t\tmsg.Control = (*byte)(unsafe.Pointer(&oob[0]))\n\t\tmsg.SetControllen(len(oob))\n\t}\n\tmsg.Iov = &iov\n\tmsg.Iovlen = 1\n\tif n, err = sendmsg(fd, &msg, flags); err != nil {\n\t\treturn 0, err\n\t}\n\tif len(oob) > 0 && len(p) == 0 {\n\t\tn = 0\n\t}\n\treturn n, nil\n}\n\n//sys\tkevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error)\n\nfunc Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) {\n\tvar change, event unsafe.Pointer\n\tif len(changes) > 0 {\n\t\tchange = unsafe.Pointer(&changes[0])\n\t}\n\tif len(events) > 0 {\n\t\tevent = unsafe.Pointer(&events[0])\n\t}\n\treturn kevent(kq, change, len(changes), event, len(events), timeout)\n}\n\n//sys\tsysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL\n\n// sysctlmib translates name to mib number and appends any additional args.\nfunc sysctlmib(name string, args ...int) ([]_C_int, error) {\n\t// Translate name to mib number.\n\tmib, err := nametomib(name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfor _, a := range args {\n\t\tmib = append(mib, _C_int(a))\n\t}\n\n\treturn mib, nil\n}\n\nfunc Sysctl(name string) (string, error) {\n\treturn SysctlArgs(name)\n}\n\nfunc SysctlArgs(name string, args ...int) (string, error) {\n\tbuf, err := SysctlRaw(name, args...)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tn := len(buf)\n\n\t// Throw away terminating NUL.\n\tif n > 0 && buf[n-1] == '\\x00' {\n\t\tn--\n\t}\n\treturn string(buf[0:n]), nil\n}\n\nfunc SysctlUint32(name string) (uint32, error) {\n\treturn SysctlUint32Args(name)\n}\n\nfunc SysctlUint32Args(name string, args ...int) (uint32, error) {\n\tmib, err := sysctlmib(name, args...)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tn := uintptr(4)\n\tbuf := make([]byte, 4)\n\tif err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {\n\t\treturn 0, err\n\t}\n\tif n != 4 {\n\t\treturn 0, EIO\n\t}\n\treturn *(*uint32)(unsafe.Pointer(&buf[0])), nil\n}\n\nfunc SysctlUint64(name string, args ...int) (uint64, error) {\n\tmib, err := sysctlmib(name, args...)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tn := uintptr(8)\n\tbuf := make([]byte, 8)\n\tif err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {\n\t\treturn 0, err\n\t}\n\tif n != 8 {\n\t\treturn 0, EIO\n\t}\n\treturn *(*uint64)(unsafe.Pointer(&buf[0])), nil\n}\n\nfunc SysctlRaw(name string, args ...int) ([]byte, error) {\n\tmib, err := sysctlmib(name, args...)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Find size.\n\tn := uintptr(0)\n\tif err := sysctl(mib, nil, &n, nil, 0); err != nil {\n\t\treturn nil, err\n\t}\n\tif n == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Read into buffer of that size.\n\tbuf := make([]byte, n)\n\tif err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// The actual call may return less than the original reported required\n\t// size so ensure we deal with that.\n\treturn buf[:n], nil\n}\n\n//sys\tutimes(path string, timeval *[2]Timeval) (err error)\n\nfunc Utimes(path string, tv []Timeval) error {\n\tif tv == nil {\n\t\treturn utimes(path, nil)\n\t}\n\tif len(tv) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\nfunc UtimesNano(path string, ts []Timespec) error {\n\tif ts == nil {\n\t\terr := utimensat(AT_FDCWD, path, nil, 0)\n\t\tif err != ENOSYS {\n\t\t\treturn err\n\t\t}\n\t\treturn utimes(path, nil)\n\t}\n\tif len(ts) != 2 {\n\t\treturn EINVAL\n\t}\n\t// Darwin setattrlist can set nanosecond timestamps\n\terr := setattrlistTimes(path, ts, 0)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\terr = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\t// Not as efficient as it could be because Timespec and\n\t// Timeval have different types in the different OSes\n\ttv := [2]Timeval{\n\t\tNsecToTimeval(TimespecToNsec(ts[0])),\n\t\tNsecToTimeval(TimespecToNsec(ts[1])),\n\t}\n\treturn utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\nfunc UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {\n\tif ts == nil {\n\t\treturn utimensat(dirfd, path, nil, flags)\n\t}\n\tif len(ts) != 2 {\n\t\treturn EINVAL\n\t}\n\terr := setattrlistTimes(path, ts, flags)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\treturn utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)\n}\n\n//sys\tfutimes(fd int, timeval *[2]Timeval) (err error)\n\nfunc Futimes(fd int, tv []Timeval) error {\n\tif tv == nil {\n\t\treturn futimes(fd, nil)\n\t}\n\tif len(tv) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\n//sys\tfcntl(fd int, cmd int, arg int) (val int, err error)\n\n//sys   poll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n\n// TODO: wrap\n//\tAcct(name nil-string) (err error)\n//\tGethostuuid(uuid *byte, timeout *Timespec) (err error)\n//\tPtrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error)\n\nvar mapper = &mmapper{\n\tactive: make(map[*byte][]byte),\n\tmmap:   mmap,\n\tmunmap: munmap,\n}\n\nfunc Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {\n\treturn mapper.Mmap(fd, offset, length, prot, flags)\n}\n\nfunc Munmap(b []byte) (err error) {\n\treturn mapper.Munmap(b)\n}\n\n//sys\tMadvise(b []byte, behav int) (err error)\n//sys\tMlock(b []byte) (err error)\n//sys\tMlockall(flags int) (err error)\n//sys\tMprotect(b []byte, prot int) (err error)\n//sys\tMsync(b []byte, flags int) (err error)\n//sys\tMunlock(b []byte) (err error)\n//sys\tMunlockall() (err error)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_darwin.go",
    "content": "// Copyright 2009,2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Darwin system calls.\n// This file is compiled as ordinary Go code,\n// but it is also input to mksyscall,\n// which parses the //sys lines and generates system call stubs.\n// Note that sometimes we use a lowercase //sys name and wrap\n// it in our own nicer implementation, either here or in\n// syscall_bsd.go or syscall_unix.go.\n\npackage unix\n\nimport (\n\terrorspkg \"errors\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nconst ImplementsGetwd = true\n\nfunc Getwd() (string, error) {\n\tbuf := make([]byte, 2048)\n\tattrs, err := getAttrList(\".\", attrList{CommonAttr: attrCmnFullpath}, buf, 0)\n\tif err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 {\n\t\twd := string(attrs[0])\n\t\t// Sanity check that it's an absolute path and ends\n\t\t// in a null byte, which we then strip.\n\t\tif wd[0] == '/' && wd[len(wd)-1] == 0 {\n\t\t\treturn wd[:len(wd)-1], nil\n\t\t}\n\t}\n\t// If pkg/os/getwd.go gets ENOTSUP, it will fall back to the\n\t// slow algorithm.\n\treturn \"\", ENOTSUP\n}\n\ntype SockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n\traw    RawSockaddrDatalink\n}\n\n// Translate \"kern.hostname\" to []_C_int{0,1,2,3}.\nfunc nametomib(name string) (mib []_C_int, err error) {\n\tconst siz = unsafe.Sizeof(mib[0])\n\n\t// NOTE(rsc): It seems strange to set the buffer to have\n\t// size CTL_MAXNAME+2 but use only CTL_MAXNAME\n\t// as the size. I don't know why the +2 is here, but the\n\t// kernel uses +2 for its own implementation of this function.\n\t// I am scared that if we don't include the +2 here, the kernel\n\t// will silently write 2 words farther than we specify\n\t// and we'll get memory corruption.\n\tvar buf [CTL_MAXNAME + 2]_C_int\n\tn := uintptr(CTL_MAXNAME) * siz\n\n\tp := (*byte)(unsafe.Pointer(&buf[0]))\n\tbytes, err := ByteSliceFromString(name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Magic sysctl: \"setting\" 0.3 to a string name\n\t// lets you read back the array of integers form.\n\tif err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {\n\t\treturn nil, err\n\t}\n\treturn buf[0 : n/siz], nil\n}\n\nfunc direntIno(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))\n}\n\nfunc direntReclen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))\n}\n\nfunc direntNamlen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))\n}\n\n//sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error)\nfunc PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }\nfunc PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }\n\nconst (\n\tattrBitMapCount = 5\n\tattrCmnFullpath = 0x08000000\n)\n\ntype attrList struct {\n\tbitmapCount uint16\n\t_           uint16\n\tCommonAttr  uint32\n\tVolAttr     uint32\n\tDirAttr     uint32\n\tFileAttr    uint32\n\tForkattr    uint32\n}\n\nfunc getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) {\n\tif len(attrBuf) < 4 {\n\t\treturn nil, errorspkg.New(\"attrBuf too small\")\n\t}\n\tattrList.bitmapCount = attrBitMapCount\n\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t_, _, e1 := Syscall6(\n\t\tSYS_GETATTRLIST,\n\t\tuintptr(unsafe.Pointer(_p0)),\n\t\tuintptr(unsafe.Pointer(&attrList)),\n\t\tuintptr(unsafe.Pointer(&attrBuf[0])),\n\t\tuintptr(len(attrBuf)),\n\t\tuintptr(options),\n\t\t0,\n\t)\n\tif e1 != 0 {\n\t\treturn nil, e1\n\t}\n\tsize := *(*uint32)(unsafe.Pointer(&attrBuf[0]))\n\n\t// dat is the section of attrBuf that contains valid data,\n\t// without the 4 byte length header. All attribute offsets\n\t// are relative to dat.\n\tdat := attrBuf\n\tif int(size) < len(attrBuf) {\n\t\tdat = dat[:size]\n\t}\n\tdat = dat[4:] // remove length prefix\n\n\tfor i := uint32(0); int(i) < len(dat); {\n\t\theader := dat[i:]\n\t\tif len(header) < 8 {\n\t\t\treturn attrs, errorspkg.New(\"truncated attribute header\")\n\t\t}\n\t\tdatOff := *(*int32)(unsafe.Pointer(&header[0]))\n\t\tattrLen := *(*uint32)(unsafe.Pointer(&header[4]))\n\t\tif datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) {\n\t\t\treturn attrs, errorspkg.New(\"truncated results; attrBuf too small\")\n\t\t}\n\t\tend := uint32(datOff) + attrLen\n\t\tattrs = append(attrs, dat[datOff:end])\n\t\ti = end\n\t\tif r := i % 4; r != 0 {\n\t\t\ti += (4 - r)\n\t\t}\n\t}\n\treturn\n}\n\n//sysnb pipe() (r int, w int, err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tp[0], p[1], err = pipe()\n\treturn\n}\n\nfunc Getfsstat(buf []Statfs_t, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tvar bufsize uintptr\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t\tbufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))\n\t}\n\tr0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc setattrlistTimes(path string, times []Timespec, flags int) error {\n\t_p0, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar attrList attrList\n\tattrList.bitmapCount = ATTR_BIT_MAP_COUNT\n\tattrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME\n\n\t// order is mtime, atime: the opposite of Chtimes\n\tattributes := [2]Timespec{times[1], times[0]}\n\toptions := 0\n\tif flags&AT_SYMLINK_NOFOLLOW != 0 {\n\t\toptions |= FSOPT_NOFOLLOW\n\t}\n\t_, _, e1 := Syscall6(\n\t\tSYS_SETATTRLIST,\n\t\tuintptr(unsafe.Pointer(_p0)),\n\t\tuintptr(unsafe.Pointer(&attrList)),\n\t\tuintptr(unsafe.Pointer(&attributes)),\n\t\tuintptr(unsafe.Sizeof(attributes)),\n\t\tuintptr(options),\n\t\t0,\n\t)\n\tif e1 != 0 {\n\t\treturn e1\n\t}\n\treturn nil\n}\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {\n\t// Darwin doesn't support SYS_UTIMENSAT\n\treturn ENOSYS\n}\n\n/*\n * Wrapped\n */\n\n//sys\tkill(pid int, signum int, posix int) (err error)\n\nfunc Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) }\n\n//sys\tioctl(fd int, req uint, arg uintptr) (err error)\n\n// ioctl itself should not be exposed directly, but additional get/set\n// functions for specific types are permissible.\n\n// IoctlSetInt performs an ioctl operation which sets an integer value\n// on fd, using the specified request number.\nfunc IoctlSetInt(fd int, req uint, value int) error {\n\treturn ioctl(fd, req, uintptr(value))\n}\n\nfunc IoctlSetWinsize(fd int, req uint, value *Winsize) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermios(fd int, req uint, value *Termios) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\n// IoctlGetInt performs an ioctl operation which gets an integer value\n// from fd, using the specified request number.\nfunc IoctlGetInt(fd int, req uint) (int, error) {\n\tvar value int\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn value, err\n}\n\nfunc IoctlGetWinsize(fd int, req uint) (*Winsize, error) {\n\tvar value Winsize\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermios(fd int, req uint) (*Termios, error) {\n\tvar value Termios\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\n/*\n * Exposed directly\n */\n//sys\tAccess(path string, mode uint32) (err error)\n//sys\tAdjtime(delta *Timeval, olddelta *Timeval) (err error)\n//sys\tChdir(path string) (err error)\n//sys\tChflags(path string, flags int) (err error)\n//sys\tChmod(path string, mode uint32) (err error)\n//sys\tChown(path string, uid int, gid int) (err error)\n//sys\tChroot(path string) (err error)\n//sys\tClose(fd int) (err error)\n//sys\tDup(fd int) (nfd int, err error)\n//sys\tDup2(from int, to int) (err error)\n//sys\tExchangedata(path1 string, path2 string, options int) (err error)\n//sys\tExit(code int)\n//sys\tFaccessat(dirfd int, path string, mode uint32, flags int) (err error)\n//sys\tFchdir(fd int) (err error)\n//sys\tFchflags(fd int, flags int) (err error)\n//sys\tFchmod(fd int, mode uint32) (err error)\n//sys\tFchmodat(dirfd int, path string, mode uint32, flags int) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFchownat(dirfd int, path string, uid int, gid int, flags int) (err error)\n//sys\tFlock(fd int, how int) (err error)\n//sys\tFpathconf(fd int, name int) (val int, err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64\n//sys\tFstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64\n//sys\tFsync(fd int) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sys\tGetdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64\n//sys\tGetdtablesize() (size int)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (uid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetpgid(pid int) (pgid int, err error)\n//sysnb\tGetpgrp() (pgrp int)\n//sysnb\tGetpid() (pid int)\n//sysnb\tGetppid() (ppid int)\n//sys\tGetpriority(which int, who int) (prio int, err error)\n//sysnb\tGetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tGetrusage(who int, rusage *Rusage) (err error)\n//sysnb\tGetsid(pid int) (sid int, err error)\n//sysnb\tGetuid() (uid int)\n//sysnb\tIssetugid() (tainted bool)\n//sys\tKqueue() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tLink(path string, link string) (err error)\n//sys\tLinkat(pathfd int, path string, linkfd int, link string, flags int) (err error)\n//sys\tListen(s int, backlog int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64\n//sys\tMkdir(path string, mode uint32) (err error)\n//sys\tMkdirat(dirfd int, path string, mode uint32) (err error)\n//sys\tMkfifo(path string, mode uint32) (err error)\n//sys\tMknod(path string, mode uint32, dev int) (err error)\n//sys\tOpen(path string, mode int, perm uint32) (fd int, err error)\n//sys\tOpenat(dirfd int, path string, mode int, perm uint32) (fd int, err error)\n//sys\tPathconf(path string, name int) (val int, err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error)\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error)\n//sys\tread(fd int, p []byte) (n int, err error)\n//sys\tReadlink(path string, buf []byte) (n int, err error)\n//sys\tReadlinkat(dirfd int, path string, buf []byte) (n int, err error)\n//sys\tRename(from string, to string) (err error)\n//sys\tRenameat(fromfd int, from string, tofd int, to string) (err error)\n//sys\tRevoke(path string) (err error)\n//sys\tRmdir(path string) (err error)\n//sys\tSeek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK\n//sys\tSelect(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)\n//sys\tSetegid(egid int) (err error)\n//sysnb\tSeteuid(euid int) (err error)\n//sysnb\tSetgid(gid int) (err error)\n//sys\tSetlogin(name string) (err error)\n//sysnb\tSetpgid(pid int, pgid int) (err error)\n//sys\tSetpriority(which int, who int, prio int) (err error)\n//sys\tSetprivexec(flag int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sysnb\tSetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tSetsid() (pid int, err error)\n//sysnb\tSettimeofday(tp *Timeval) (err error)\n//sysnb\tSetuid(uid int) (err error)\n//sys\tStat(path string, stat *Stat_t) (err error) = SYS_STAT64\n//sys\tStatfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64\n//sys\tSymlink(path string, link string) (err error)\n//sys\tSymlinkat(oldpath string, newdirfd int, newpath string) (err error)\n//sys\tSync() (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\tUmask(newmask int) (oldmask int)\n//sys\tUndelete(path string) (err error)\n//sys\tUnlink(path string) (err error)\n//sys\tUnlinkat(dirfd int, path string, flags int) (err error)\n//sys\tUnmount(path string, flags int) (err error)\n//sys\twrite(fd int, p []byte) (n int, err error)\n//sys   mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)\n//sys   munmap(addr uintptr, length uintptr) (err error)\n//sys\treadlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ\n//sys\twritelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE\n\n/*\n * Unimplemented\n */\n// Profil\n// Sigaction\n// Sigprocmask\n// Getlogin\n// Sigpending\n// Sigaltstack\n// Ioctl\n// Reboot\n// Execve\n// Vfork\n// Sbrk\n// Sstk\n// Ovadvise\n// Mincore\n// Setitimer\n// Swapon\n// Select\n// Sigsuspend\n// Readv\n// Writev\n// Nfssvc\n// Getfh\n// Quotactl\n// Mount\n// Csops\n// Waitid\n// Add_profil\n// Kdebug_trace\n// Sigreturn\n// Atsocket\n// Kqueue_from_portset_np\n// Kqueue_portset\n// Getattrlist\n// Setattrlist\n// Getdirentriesattr\n// Searchfs\n// Delete\n// Copyfile\n// Watchevent\n// Waitevent\n// Modwatch\n// Getxattr\n// Fgetxattr\n// Setxattr\n// Fsetxattr\n// Removexattr\n// Fremovexattr\n// Listxattr\n// Flistxattr\n// Fsctl\n// Initgroups\n// Posix_spawn\n// Nfsclnt\n// Fhopen\n// Minherit\n// Semsys\n// Msgsys\n// Shmsys\n// Semctl\n// Semget\n// Semop\n// Msgctl\n// Msgget\n// Msgsnd\n// Msgrcv\n// Shmat\n// Shmctl\n// Shmdt\n// Shmget\n// Shm_open\n// Shm_unlink\n// Sem_open\n// Sem_close\n// Sem_unlink\n// Sem_wait\n// Sem_trywait\n// Sem_post\n// Sem_getvalue\n// Sem_init\n// Sem_destroy\n// Open_extended\n// Umask_extended\n// Stat_extended\n// Lstat_extended\n// Fstat_extended\n// Chmod_extended\n// Fchmod_extended\n// Access_extended\n// Settid\n// Gettid\n// Setsgroups\n// Getsgroups\n// Setwgroups\n// Getwgroups\n// Mkfifo_extended\n// Mkdir_extended\n// Identitysvc\n// Shared_region_check_np\n// Shared_region_map_np\n// __pthread_mutex_destroy\n// __pthread_mutex_init\n// __pthread_mutex_lock\n// __pthread_mutex_trylock\n// __pthread_mutex_unlock\n// __pthread_cond_init\n// __pthread_cond_destroy\n// __pthread_cond_broadcast\n// __pthread_cond_signal\n// Setsid_with_pid\n// __pthread_cond_timedwait\n// Aio_fsync\n// Aio_return\n// Aio_suspend\n// Aio_cancel\n// Aio_error\n// Aio_read\n// Aio_write\n// Lio_listio\n// __pthread_cond_wait\n// Iopolicysys\n// __pthread_kill\n// __pthread_sigmask\n// __sigwait\n// __disable_threadsignal\n// __pthread_markcancel\n// __pthread_canceled\n// __semwait_signal\n// Proc_info\n// sendfile\n// Stat64_extended\n// Lstat64_extended\n// Fstat64_extended\n// __pthread_chdir\n// __pthread_fchdir\n// Audit\n// Auditon\n// Getauid\n// Setauid\n// Getaudit\n// Setaudit\n// Getaudit_addr\n// Setaudit_addr\n// Auditctl\n// Bsdthread_create\n// Bsdthread_terminate\n// Stack_snapshot\n// Bsdthread_register\n// Workq_open\n// Workq_ops\n// __mac_execve\n// __mac_syscall\n// __mac_get_file\n// __mac_set_file\n// __mac_get_link\n// __mac_set_link\n// __mac_get_proc\n// __mac_set_proc\n// __mac_get_fd\n// __mac_set_fd\n// __mac_get_pid\n// __mac_get_lcid\n// __mac_get_lctx\n// __mac_set_lctx\n// Setlcid\n// Read_nocancel\n// Write_nocancel\n// Open_nocancel\n// Close_nocancel\n// Wait4_nocancel\n// Recvmsg_nocancel\n// Sendmsg_nocancel\n// Recvfrom_nocancel\n// Accept_nocancel\n// Fcntl_nocancel\n// Select_nocancel\n// Fsync_nocancel\n// Connect_nocancel\n// Sigsuspend_nocancel\n// Readv_nocancel\n// Writev_nocancel\n// Sendto_nocancel\n// Pread_nocancel\n// Pwrite_nocancel\n// Waitid_nocancel\n// Poll_nocancel\n// Msgsnd_nocancel\n// Msgrcv_nocancel\n// Sem_wait_nocancel\n// Aio_suspend_nocancel\n// __sigwait_nocancel\n// __semwait_signal_nocancel\n// __mac_mount\n// __mac_get_mount\n// __mac_getfsstat\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_darwin_386.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build 386,darwin\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: int32(sec), Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: int32(sec), Usec: int32(usec)}\n}\n\n//sysnb\tgettimeofday(tp *Timeval) (sec int32, usec int32, err error)\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t// The tv passed to gettimeofday must be non-nil\n\t// but is otherwise unused. The answers come back\n\t// in the two registers.\n\tsec, usec, err := gettimeofday(tv)\n\ttv.Sec = int32(sec)\n\ttv.Usec = int32(usec)\n\treturn err\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar length = uint64(count)\n\n\t_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0)\n\n\twritten = int(length)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n\n// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions\n// of darwin/386 the syscall is called sysctl instead of __sysctl.\nconst SYS___SYSCTL = SYS_SYSCTL\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,darwin\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\n//sysnb\tgettimeofday(tp *Timeval) (sec int64, usec int32, err error)\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t// The tv passed to gettimeofday must be non-nil\n\t// but is otherwise unused. The answers come back\n\t// in the two registers.\n\tsec, usec, err := gettimeofday(tv)\n\ttv.Sec = sec\n\ttv.Usec = usec\n\treturn err\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint64(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar length = uint64(count)\n\n\t_, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0)\n\n\twritten = int(length)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n\n// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions\n// of darwin/amd64 the syscall is called sysctl instead of __sysctl.\nconst SYS___SYSCTL = SYS_SYSCTL\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_darwin_arm.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: int32(sec), Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: int32(sec), Usec: int32(usec)}\n}\n\n//sysnb\tgettimeofday(tp *Timeval) (sec int32, usec int32, err error)\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t// The tv passed to gettimeofday must be non-nil\n\t// but is otherwise unused. The answers come back\n\t// in the two registers.\n\tsec, usec, err := gettimeofday(tv)\n\ttv.Sec = int32(sec)\n\ttv.Usec = int32(usec)\n\treturn err\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar length = uint64(count)\n\n\t_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0)\n\n\twritten = int(length)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build arm64,darwin\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\n//sysnb\tgettimeofday(tp *Timeval) (sec int64, usec int32, err error)\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t// The tv passed to gettimeofday must be non-nil\n\t// but is otherwise unused. The answers come back\n\t// in the two registers.\n\tsec, usec, err := gettimeofday(tv)\n\ttv.Sec = sec\n\ttv.Usec = usec\n\treturn err\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint64(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar length = uint64(count)\n\n\t_, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0)\n\n\twritten = int(length)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic\n\n// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions\n// of darwin/arm64 the syscall is called sysctl instead of __sysctl.\nconst SYS___SYSCTL = SYS_SYSCTL\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_dragonfly.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// DragonFly BSD system calls.\n// This file is compiled as ordinary Go code,\n// but it is also input to mksyscall,\n// which parses the //sys lines and generates system call stubs.\n// Note that sometimes we use a lowercase //sys name and wrap\n// it in our own nicer implementation, either here or in\n// syscall_bsd.go or syscall_unix.go.\n\npackage unix\n\nimport \"unsafe\"\n\ntype SockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n\tRcf    uint16\n\tRoute  [16]uint16\n\traw    RawSockaddrDatalink\n}\n\n// Translate \"kern.hostname\" to []_C_int{0,1,2,3}.\nfunc nametomib(name string) (mib []_C_int, err error) {\n\tconst siz = unsafe.Sizeof(mib[0])\n\n\t// NOTE(rsc): It seems strange to set the buffer to have\n\t// size CTL_MAXNAME+2 but use only CTL_MAXNAME\n\t// as the size. I don't know why the +2 is here, but the\n\t// kernel uses +2 for its own implementation of this function.\n\t// I am scared that if we don't include the +2 here, the kernel\n\t// will silently write 2 words farther than we specify\n\t// and we'll get memory corruption.\n\tvar buf [CTL_MAXNAME + 2]_C_int\n\tn := uintptr(CTL_MAXNAME) * siz\n\n\tp := (*byte)(unsafe.Pointer(&buf[0]))\n\tbytes, err := ByteSliceFromString(name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Magic sysctl: \"setting\" 0.3 to a string name\n\t// lets you read back the array of integers form.\n\tif err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {\n\t\treturn nil, err\n\t}\n\treturn buf[0 : n/siz], nil\n}\n\nfunc direntIno(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))\n}\n\nfunc direntReclen(buf []byte) (uint64, bool) {\n\tnamlen, ok := direntNamlen(buf)\n\tif !ok {\n\t\treturn 0, false\n\t}\n\treturn (16 + namlen + 1 + 7) &^ 7, true\n}\n\nfunc direntNamlen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))\n}\n\n//sysnb pipe() (r int, w int, err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tp[0], p[1], err = pipe()\n\treturn\n}\n\n//sys\textpread(fd int, p []byte, flags int, offset int64) (n int, err error)\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\treturn extpread(fd, p, 0, offset)\n}\n\n//sys\textpwrite(fd int, p []byte, flags int, offset int64) (n int, err error)\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\treturn extpwrite(fd, p, 0, offset)\n}\n\nfunc Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tnfd, err = accept4(fd, &rsa, &len, flags)\n\tif err != nil {\n\t\treturn\n\t}\n\tif len > SizeofSockaddrAny {\n\t\tpanic(\"RawSockaddrAny too small\")\n\t}\n\tsa, err = anyToSockaddr(&rsa)\n\tif err != nil {\n\t\tClose(nfd)\n\t\tnfd = 0\n\t}\n\treturn\n}\n\nfunc Getfsstat(buf []Statfs_t, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tvar bufsize uintptr\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t\tbufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))\n\t}\n\tr0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc setattrlistTimes(path string, times []Timespec, flags int) error {\n\t// used on Darwin for UtimesNano\n\treturn ENOSYS\n}\n\n//sys\tioctl(fd int, req uint, arg uintptr) (err error)\n\n// ioctl itself should not be exposed directly, but additional get/set\n// functions for specific types are permissible.\n\n// IoctlSetInt performs an ioctl operation which sets an integer value\n// on fd, using the specified request number.\nfunc IoctlSetInt(fd int, req uint, value int) error {\n\treturn ioctl(fd, req, uintptr(value))\n}\n\nfunc IoctlSetWinsize(fd int, req uint, value *Winsize) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermios(fd int, req uint, value *Termios) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\n// IoctlGetInt performs an ioctl operation which gets an integer value\n// from fd, using the specified request number.\nfunc IoctlGetInt(fd int, req uint) (int, error) {\n\tvar value int\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn value, err\n}\n\nfunc IoctlGetWinsize(fd int, req uint) (*Winsize, error) {\n\tvar value Winsize\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermios(fd int, req uint) (*Termios, error) {\n\tvar value Termios\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\n/*\n * Exposed directly\n */\n//sys\tAccess(path string, mode uint32) (err error)\n//sys\tAdjtime(delta *Timeval, olddelta *Timeval) (err error)\n//sys\tChdir(path string) (err error)\n//sys\tChflags(path string, flags int) (err error)\n//sys\tChmod(path string, mode uint32) (err error)\n//sys\tChown(path string, uid int, gid int) (err error)\n//sys\tChroot(path string) (err error)\n//sys\tClose(fd int) (err error)\n//sys\tDup(fd int) (nfd int, err error)\n//sys\tDup2(from int, to int) (err error)\n//sys\tExit(code int)\n//sys\tFchdir(fd int) (err error)\n//sys\tFchflags(fd int, flags int) (err error)\n//sys\tFchmod(fd int, mode uint32) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFlock(fd int, how int) (err error)\n//sys\tFpathconf(fd int, name int) (val int, err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatfs(fd int, stat *Statfs_t) (err error)\n//sys\tFsync(fd int) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sys\tGetdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)\n//sys\tGetdtablesize() (size int)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (uid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetpgid(pid int) (pgid int, err error)\n//sysnb\tGetpgrp() (pgrp int)\n//sysnb\tGetpid() (pid int)\n//sysnb\tGetppid() (ppid int)\n//sys\tGetpriority(which int, who int) (prio int, err error)\n//sysnb\tGetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tGetrusage(who int, rusage *Rusage) (err error)\n//sysnb\tGetsid(pid int) (sid int, err error)\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tGetuid() (uid int)\n//sys\tIssetugid() (tainted bool)\n//sys\tKill(pid int, signum syscall.Signal) (err error)\n//sys\tKqueue() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tLink(path string, link string) (err error)\n//sys\tListen(s int, backlog int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tMkdir(path string, mode uint32) (err error)\n//sys\tMkfifo(path string, mode uint32) (err error)\n//sys\tMknod(path string, mode uint32, dev int) (err error)\n//sys\tNanosleep(time *Timespec, leftover *Timespec) (err error)\n//sys\tOpen(path string, mode int, perm uint32) (fd int, err error)\n//sys\tPathconf(path string, name int) (val int, err error)\n//sys\tread(fd int, p []byte) (n int, err error)\n//sys\tReadlink(path string, buf []byte) (n int, err error)\n//sys\tRename(from string, to string) (err error)\n//sys\tRevoke(path string) (err error)\n//sys\tRmdir(path string) (err error)\n//sys\tSeek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK\n//sys\tSelect(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)\n//sysnb\tSetegid(egid int) (err error)\n//sysnb\tSeteuid(euid int) (err error)\n//sysnb\tSetgid(gid int) (err error)\n//sys\tSetlogin(name string) (err error)\n//sysnb\tSetpgid(pid int, pgid int) (err error)\n//sys\tSetpriority(which int, who int, prio int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tSetsid() (pid int, err error)\n//sysnb\tSettimeofday(tp *Timeval) (err error)\n//sysnb\tSetuid(uid int) (err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatfs(path string, stat *Statfs_t) (err error)\n//sys\tSymlink(path string, link string) (err error)\n//sys\tSync() (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\tUmask(newmask int) (oldmask int)\n//sys\tUndelete(path string) (err error)\n//sys\tUnlink(path string) (err error)\n//sys\tUnmount(path string, flags int) (err error)\n//sys\twrite(fd int, p []byte) (n int, err error)\n//sys   mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)\n//sys   munmap(addr uintptr, length uintptr) (err error)\n//sys\treadlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ\n//sys\twritelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE\n//sys\taccept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error)\n//sys\tutimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)\n\n/*\n * Unimplemented\n * TODO(jsing): Update this list for DragonFly.\n */\n// Profil\n// Sigaction\n// Sigprocmask\n// Getlogin\n// Sigpending\n// Sigaltstack\n// Reboot\n// Execve\n// Vfork\n// Sbrk\n// Sstk\n// Ovadvise\n// Mincore\n// Setitimer\n// Swapon\n// Select\n// Sigsuspend\n// Readv\n// Writev\n// Nfssvc\n// Getfh\n// Quotactl\n// Mount\n// Csops\n// Waitid\n// Add_profil\n// Kdebug_trace\n// Sigreturn\n// Atsocket\n// Kqueue_from_portset_np\n// Kqueue_portset\n// Getattrlist\n// Setattrlist\n// Getdirentriesattr\n// Searchfs\n// Delete\n// Copyfile\n// Watchevent\n// Waitevent\n// Modwatch\n// Getxattr\n// Fgetxattr\n// Setxattr\n// Fsetxattr\n// Removexattr\n// Fremovexattr\n// Listxattr\n// Flistxattr\n// Fsctl\n// Initgroups\n// Posix_spawn\n// Nfsclnt\n// Fhopen\n// Minherit\n// Semsys\n// Msgsys\n// Shmsys\n// Semctl\n// Semget\n// Semop\n// Msgctl\n// Msgget\n// Msgsnd\n// Msgrcv\n// Shmat\n// Shmctl\n// Shmdt\n// Shmget\n// Shm_open\n// Shm_unlink\n// Sem_open\n// Sem_close\n// Sem_unlink\n// Sem_wait\n// Sem_trywait\n// Sem_post\n// Sem_getvalue\n// Sem_init\n// Sem_destroy\n// Open_extended\n// Umask_extended\n// Stat_extended\n// Lstat_extended\n// Fstat_extended\n// Chmod_extended\n// Fchmod_extended\n// Access_extended\n// Settid\n// Gettid\n// Setsgroups\n// Getsgroups\n// Setwgroups\n// Getwgroups\n// Mkfifo_extended\n// Mkdir_extended\n// Identitysvc\n// Shared_region_check_np\n// Shared_region_map_np\n// __pthread_mutex_destroy\n// __pthread_mutex_init\n// __pthread_mutex_lock\n// __pthread_mutex_trylock\n// __pthread_mutex_unlock\n// __pthread_cond_init\n// __pthread_cond_destroy\n// __pthread_cond_broadcast\n// __pthread_cond_signal\n// Setsid_with_pid\n// __pthread_cond_timedwait\n// Aio_fsync\n// Aio_return\n// Aio_suspend\n// Aio_cancel\n// Aio_error\n// Aio_read\n// Aio_write\n// Lio_listio\n// __pthread_cond_wait\n// Iopolicysys\n// __pthread_kill\n// __pthread_sigmask\n// __sigwait\n// __disable_threadsignal\n// __pthread_markcancel\n// __pthread_canceled\n// __semwait_signal\n// Proc_info\n// Stat64_extended\n// Lstat64_extended\n// Fstat64_extended\n// __pthread_chdir\n// __pthread_fchdir\n// Audit\n// Auditon\n// Getauid\n// Setauid\n// Getaudit\n// Setaudit\n// Getaudit_addr\n// Setaudit_addr\n// Auditctl\n// Bsdthread_create\n// Bsdthread_terminate\n// Stack_snapshot\n// Bsdthread_register\n// Workq_open\n// Workq_ops\n// __mac_execve\n// __mac_syscall\n// __mac_get_file\n// __mac_set_file\n// __mac_get_link\n// __mac_set_link\n// __mac_get_proc\n// __mac_set_proc\n// __mac_get_fd\n// __mac_set_fd\n// __mac_get_pid\n// __mac_get_lcid\n// __mac_get_lctx\n// __mac_set_lctx\n// Setlcid\n// Read_nocancel\n// Write_nocancel\n// Open_nocancel\n// Close_nocancel\n// Wait4_nocancel\n// Recvmsg_nocancel\n// Sendmsg_nocancel\n// Recvfrom_nocancel\n// Accept_nocancel\n// Fcntl_nocancel\n// Select_nocancel\n// Fsync_nocancel\n// Connect_nocancel\n// Sigsuspend_nocancel\n// Readv_nocancel\n// Writev_nocancel\n// Sendto_nocancel\n// Pread_nocancel\n// Pwrite_nocancel\n// Waitid_nocancel\n// Msgsnd_nocancel\n// Msgrcv_nocancel\n// Sem_wait_nocancel\n// Aio_suspend_nocancel\n// __sigwait_nocancel\n// __semwait_signal_nocancel\n// __mac_mount\n// __mac_get_mount\n// __mac_getfsstat\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,dragonfly\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint64(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar writtenOut uint64 = 0\n\t_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)\n\n\twritten = int(writtenOut)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_freebsd.go",
    "content": "// Copyright 2009,2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// FreeBSD system calls.\n// This file is compiled as ordinary Go code,\n// but it is also input to mksyscall,\n// which parses the //sys lines and generates system call stubs.\n// Note that sometimes we use a lowercase //sys name and wrap\n// it in our own nicer implementation, either here or in\n// syscall_bsd.go or syscall_unix.go.\n\npackage unix\n\nimport \"unsafe\"\n\ntype SockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [46]int8\n\traw    RawSockaddrDatalink\n}\n\n// Translate \"kern.hostname\" to []_C_int{0,1,2,3}.\nfunc nametomib(name string) (mib []_C_int, err error) {\n\tconst siz = unsafe.Sizeof(mib[0])\n\n\t// NOTE(rsc): It seems strange to set the buffer to have\n\t// size CTL_MAXNAME+2 but use only CTL_MAXNAME\n\t// as the size. I don't know why the +2 is here, but the\n\t// kernel uses +2 for its own implementation of this function.\n\t// I am scared that if we don't include the +2 here, the kernel\n\t// will silently write 2 words farther than we specify\n\t// and we'll get memory corruption.\n\tvar buf [CTL_MAXNAME + 2]_C_int\n\tn := uintptr(CTL_MAXNAME) * siz\n\n\tp := (*byte)(unsafe.Pointer(&buf[0]))\n\tbytes, err := ByteSliceFromString(name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Magic sysctl: \"setting\" 0.3 to a string name\n\t// lets you read back the array of integers form.\n\tif err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil {\n\t\treturn nil, err\n\t}\n\treturn buf[0 : n/siz], nil\n}\n\nfunc direntIno(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))\n}\n\nfunc direntReclen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))\n}\n\nfunc direntNamlen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))\n}\n\n//sysnb pipe() (r int, w int, err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tp[0], p[1], err = pipe()\n\treturn\n}\n\nfunc GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {\n\tvar value IPMreqn\n\tvallen := _Socklen(SizeofIPMreqn)\n\terrno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, errno\n}\n\nfunc SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))\n}\n\nfunc Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tnfd, err = accept4(fd, &rsa, &len, flags)\n\tif err != nil {\n\t\treturn\n\t}\n\tif len > SizeofSockaddrAny {\n\t\tpanic(\"RawSockaddrAny too small\")\n\t}\n\tsa, err = anyToSockaddr(&rsa)\n\tif err != nil {\n\t\tClose(nfd)\n\t\tnfd = 0\n\t}\n\treturn\n}\n\nfunc Getfsstat(buf []Statfs_t, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tvar bufsize uintptr\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t\tbufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))\n\t}\n\tr0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc setattrlistTimes(path string, times []Timespec, flags int) error {\n\t// used on Darwin for UtimesNano\n\treturn ENOSYS\n}\n\n// Derive extattr namespace and attribute name\n\nfunc xattrnamespace(fullattr string) (ns int, attr string, err error) {\n\ts := -1\n\tfor idx, val := range fullattr {\n\t\tif val == '.' {\n\t\t\ts = idx\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif s == -1 {\n\t\treturn -1, \"\", ENOATTR\n\t}\n\n\tnamespace := fullattr[0:s]\n\tattr = fullattr[s+1:]\n\n\tswitch namespace {\n\tcase \"user\":\n\t\treturn EXTATTR_NAMESPACE_USER, attr, nil\n\tcase \"system\":\n\t\treturn EXTATTR_NAMESPACE_SYSTEM, attr, nil\n\tdefault:\n\t\treturn -1, \"\", ENOATTR\n\t}\n}\n\nfunc initxattrdest(dest []byte, idx int) (d unsafe.Pointer) {\n\tif len(dest) > idx {\n\t\treturn unsafe.Pointer(&dest[idx])\n\t} else {\n\t\treturn unsafe.Pointer(_zero)\n\t}\n}\n\n// FreeBSD implements its own syscalls to handle extended attributes\n\nfunc Getxattr(file string, attr string, dest []byte) (sz int, err error) {\n\td := initxattrdest(dest, 0)\n\tdestsize := len(dest)\n\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\treturn ExtattrGetFile(file, nsid, a, uintptr(d), destsize)\n}\n\nfunc Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) {\n\td := initxattrdest(dest, 0)\n\tdestsize := len(dest)\n\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\treturn ExtattrGetFd(fd, nsid, a, uintptr(d), destsize)\n}\n\nfunc Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {\n\td := initxattrdest(dest, 0)\n\tdestsize := len(dest)\n\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\treturn ExtattrGetLink(link, nsid, a, uintptr(d), destsize)\n}\n\n// flags are unused on FreeBSD\n\nfunc Fsetxattr(fd int, attr string, data []byte, flags int) (err error) {\n\td := unsafe.Pointer(&data[0])\n\tdatasiz := len(data)\n\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz)\n\treturn\n}\n\nfunc Setxattr(file string, attr string, data []byte, flags int) (err error) {\n\td := unsafe.Pointer(&data[0])\n\tdatasiz := len(data)\n\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz)\n\treturn\n}\n\nfunc Lsetxattr(link string, attr string, data []byte, flags int) (err error) {\n\td := unsafe.Pointer(&data[0])\n\tdatasiz := len(data)\n\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\t_, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz)\n\treturn\n}\n\nfunc Removexattr(file string, attr string) (err error) {\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\terr = ExtattrDeleteFile(file, nsid, a)\n\treturn\n}\n\nfunc Fremovexattr(fd int, attr string) (err error) {\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\terr = ExtattrDeleteFd(fd, nsid, a)\n\treturn\n}\n\nfunc Lremovexattr(link string, attr string) (err error) {\n\tnsid, a, err := xattrnamespace(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\n\terr = ExtattrDeleteLink(link, nsid, a)\n\treturn\n}\n\nfunc Listxattr(file string, dest []byte) (sz int, err error) {\n\td := initxattrdest(dest, 0)\n\tdestsiz := len(dest)\n\n\t// FreeBSD won't allow you to list xattrs from multiple namespaces\n\ts := 0\n\tvar e error\n\tfor _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {\n\t\tstmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)\n\n\t\t/* Errors accessing system attrs are ignored so that\n\t\t * we can implement the Linux-like behavior of omitting errors that\n\t\t * we don't have read permissions on\n\t\t *\n\t\t * Linux will still error if we ask for user attributes on a file that\n\t\t * we don't have read permissions on, so don't ignore those errors\n\t\t */\n\t\tif e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {\n\t\t\te = nil\n\t\t\tcontinue\n\t\t} else if e != nil {\n\t\t\treturn s, e\n\t\t}\n\n\t\ts += stmp\n\t\tdestsiz -= s\n\t\tif destsiz < 0 {\n\t\t\tdestsiz = 0\n\t\t}\n\t\td = initxattrdest(dest, s)\n\t}\n\n\treturn s, e\n}\n\nfunc Flistxattr(fd int, dest []byte) (sz int, err error) {\n\td := initxattrdest(dest, 0)\n\tdestsiz := len(dest)\n\n\ts := 0\n\tvar e error\n\tfor _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {\n\t\tstmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)\n\t\tif e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {\n\t\t\te = nil\n\t\t\tcontinue\n\t\t} else if e != nil {\n\t\t\treturn s, e\n\t\t}\n\n\t\ts += stmp\n\t\tdestsiz -= s\n\t\tif destsiz < 0 {\n\t\t\tdestsiz = 0\n\t\t}\n\t\td = initxattrdest(dest, s)\n\t}\n\n\treturn s, e\n}\n\nfunc Llistxattr(link string, dest []byte) (sz int, err error) {\n\td := initxattrdest(dest, 0)\n\tdestsiz := len(dest)\n\n\ts := 0\n\tvar e error\n\tfor _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {\n\t\tstmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)\n\t\tif e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {\n\t\t\te = nil\n\t\t\tcontinue\n\t\t} else if e != nil {\n\t\t\treturn s, e\n\t\t}\n\n\t\ts += stmp\n\t\tdestsiz -= s\n\t\tif destsiz < 0 {\n\t\t\tdestsiz = 0\n\t\t}\n\t\td = initxattrdest(dest, s)\n\t}\n\n\treturn s, e\n}\n\n//sys   ioctl(fd int, req uint, arg uintptr) (err error)\n\n// ioctl itself should not be exposed directly, but additional get/set\n// functions for specific types are permissible.\n\n// IoctlSetInt performs an ioctl operation which sets an integer value\n// on fd, using the specified request number.\nfunc IoctlSetInt(fd int, req uint, value int) error {\n\treturn ioctl(fd, req, uintptr(value))\n}\n\nfunc IoctlSetWinsize(fd int, req uint, value *Winsize) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermios(fd int, req uint, value *Termios) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\n// IoctlGetInt performs an ioctl operation which gets an integer value\n// from fd, using the specified request number.\nfunc IoctlGetInt(fd int, req uint) (int, error) {\n\tvar value int\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn value, err\n}\n\nfunc IoctlGetWinsize(fd int, req uint) (*Winsize, error) {\n\tvar value Winsize\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermios(fd int, req uint) (*Termios, error) {\n\tvar value Termios\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\n/*\n * Exposed directly\n */\n//sys\tAccess(path string, mode uint32) (err error)\n//sys\tAdjtime(delta *Timeval, olddelta *Timeval) (err error)\n//sys\tCapEnter() (err error)\n//sys\tcapRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET\n//sys\tcapRightsLimit(fd int, rightsp *CapRights) (err error)\n//sys\tChdir(path string) (err error)\n//sys\tChflags(path string, flags int) (err error)\n//sys\tChmod(path string, mode uint32) (err error)\n//sys\tChown(path string, uid int, gid int) (err error)\n//sys\tChroot(path string) (err error)\n//sys\tClose(fd int) (err error)\n//sys\tDup(fd int) (nfd int, err error)\n//sys\tDup2(from int, to int) (err error)\n//sys\tExit(code int)\n//sys\tExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error)\n//sys\tExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error)\n//sys\tExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)\n//sys\tExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error)\n//sys\tExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error)\n//sys\tFadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE\n//sys\tFaccessat(dirfd int, path string, mode uint32, flags int) (err error)\n//sys\tFchdir(fd int) (err error)\n//sys\tFchflags(fd int, flags int) (err error)\n//sys\tFchmod(fd int, mode uint32) (err error)\n//sys\tFchmodat(dirfd int, path string, mode uint32, flags int) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFchownat(dirfd int, path string, uid int, gid int, flags int) (err error)\n//sys\tFlock(fd int, how int) (err error)\n//sys\tFpathconf(fd int, name int) (val int, err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatfs(fd int, stat *Statfs_t) (err error)\n//sys\tFsync(fd int) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sys\tGetdirentries(fd int, buf []byte, basep *uintptr) (n int, err error)\n//sys\tGetdtablesize() (size int)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (uid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetpgid(pid int) (pgid int, err error)\n//sysnb\tGetpgrp() (pgrp int)\n//sysnb\tGetpid() (pid int)\n//sysnb\tGetppid() (ppid int)\n//sys\tGetpriority(which int, who int) (prio int, err error)\n//sysnb\tGetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tGetrusage(who int, rusage *Rusage) (err error)\n//sysnb\tGetsid(pid int) (sid int, err error)\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tGetuid() (uid int)\n//sys\tIssetugid() (tainted bool)\n//sys\tKill(pid int, signum syscall.Signal) (err error)\n//sys\tKqueue() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tLink(path string, link string) (err error)\n//sys\tLinkat(pathfd int, path string, linkfd int, link string, flags int) (err error)\n//sys\tListen(s int, backlog int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tMkdir(path string, mode uint32) (err error)\n//sys\tMkdirat(dirfd int, path string, mode uint32) (err error)\n//sys\tMkfifo(path string, mode uint32) (err error)\n//sys\tMknod(path string, mode uint32, dev int) (err error)\n//sys\tNanosleep(time *Timespec, leftover *Timespec) (err error)\n//sys\tOpen(path string, mode int, perm uint32) (fd int, err error)\n//sys\tOpenat(fdat int, path string, mode int, perm uint32) (fd int, err error)\n//sys\tPathconf(path string, name int) (val int, err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error)\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error)\n//sys\tread(fd int, p []byte) (n int, err error)\n//sys\tReadlink(path string, buf []byte) (n int, err error)\n//sys\tReadlinkat(dirfd int, path string, buf []byte) (n int, err error)\n//sys\tRename(from string, to string) (err error)\n//sys\tRenameat(fromfd int, from string, tofd int, to string) (err error)\n//sys\tRevoke(path string) (err error)\n//sys\tRmdir(path string) (err error)\n//sys\tSeek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK\n//sys\tSelect(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)\n//sysnb\tSetegid(egid int) (err error)\n//sysnb\tSeteuid(euid int) (err error)\n//sysnb\tSetgid(gid int) (err error)\n//sys\tSetlogin(name string) (err error)\n//sysnb\tSetpgid(pid int, pgid int) (err error)\n//sys\tSetpriority(which int, who int, prio int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tSetsid() (pid int, err error)\n//sysnb\tSettimeofday(tp *Timeval) (err error)\n//sysnb\tSetuid(uid int) (err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatfs(path string, stat *Statfs_t) (err error)\n//sys\tSymlink(path string, link string) (err error)\n//sys\tSymlinkat(oldpath string, newdirfd int, newpath string) (err error)\n//sys\tSync() (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\tUmask(newmask int) (oldmask int)\n//sys\tUndelete(path string) (err error)\n//sys\tUnlink(path string) (err error)\n//sys\tUnlinkat(dirfd int, path string, flags int) (err error)\n//sys\tUnmount(path string, flags int) (err error)\n//sys\twrite(fd int, p []byte) (n int, err error)\n//sys   mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)\n//sys   munmap(addr uintptr, length uintptr) (err error)\n//sys\treadlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ\n//sys\twritelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE\n//sys\taccept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error)\n//sys\tutimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)\n\n/*\n * Unimplemented\n */\n// Profil\n// Sigaction\n// Sigprocmask\n// Getlogin\n// Sigpending\n// Sigaltstack\n// Ioctl\n// Reboot\n// Execve\n// Vfork\n// Sbrk\n// Sstk\n// Ovadvise\n// Mincore\n// Setitimer\n// Swapon\n// Select\n// Sigsuspend\n// Readv\n// Writev\n// Nfssvc\n// Getfh\n// Quotactl\n// Mount\n// Csops\n// Waitid\n// Add_profil\n// Kdebug_trace\n// Sigreturn\n// Atsocket\n// Kqueue_from_portset_np\n// Kqueue_portset\n// Getattrlist\n// Setattrlist\n// Getdirentriesattr\n// Searchfs\n// Delete\n// Copyfile\n// Watchevent\n// Waitevent\n// Modwatch\n// Getxattr\n// Fgetxattr\n// Setxattr\n// Fsetxattr\n// Removexattr\n// Fremovexattr\n// Listxattr\n// Flistxattr\n// Fsctl\n// Initgroups\n// Posix_spawn\n// Nfsclnt\n// Fhopen\n// Minherit\n// Semsys\n// Msgsys\n// Shmsys\n// Semctl\n// Semget\n// Semop\n// Msgctl\n// Msgget\n// Msgsnd\n// Msgrcv\n// Shmat\n// Shmctl\n// Shmdt\n// Shmget\n// Shm_open\n// Shm_unlink\n// Sem_open\n// Sem_close\n// Sem_unlink\n// Sem_wait\n// Sem_trywait\n// Sem_post\n// Sem_getvalue\n// Sem_init\n// Sem_destroy\n// Open_extended\n// Umask_extended\n// Stat_extended\n// Lstat_extended\n// Fstat_extended\n// Chmod_extended\n// Fchmod_extended\n// Access_extended\n// Settid\n// Gettid\n// Setsgroups\n// Getsgroups\n// Setwgroups\n// Getwgroups\n// Mkfifo_extended\n// Mkdir_extended\n// Identitysvc\n// Shared_region_check_np\n// Shared_region_map_np\n// __pthread_mutex_destroy\n// __pthread_mutex_init\n// __pthread_mutex_lock\n// __pthread_mutex_trylock\n// __pthread_mutex_unlock\n// __pthread_cond_init\n// __pthread_cond_destroy\n// __pthread_cond_broadcast\n// __pthread_cond_signal\n// Setsid_with_pid\n// __pthread_cond_timedwait\n// Aio_fsync\n// Aio_return\n// Aio_suspend\n// Aio_cancel\n// Aio_error\n// Aio_read\n// Aio_write\n// Lio_listio\n// __pthread_cond_wait\n// Iopolicysys\n// __pthread_kill\n// __pthread_sigmask\n// __sigwait\n// __disable_threadsignal\n// __pthread_markcancel\n// __pthread_canceled\n// __semwait_signal\n// Proc_info\n// Stat64_extended\n// Lstat64_extended\n// Fstat64_extended\n// __pthread_chdir\n// __pthread_fchdir\n// Audit\n// Auditon\n// Getauid\n// Setauid\n// Getaudit\n// Setaudit\n// Getaudit_addr\n// Setaudit_addr\n// Auditctl\n// Bsdthread_create\n// Bsdthread_terminate\n// Stack_snapshot\n// Bsdthread_register\n// Workq_open\n// Workq_ops\n// __mac_execve\n// __mac_syscall\n// __mac_get_file\n// __mac_set_file\n// __mac_get_link\n// __mac_set_link\n// __mac_get_proc\n// __mac_set_proc\n// __mac_get_fd\n// __mac_set_fd\n// __mac_get_pid\n// __mac_get_lcid\n// __mac_get_lctx\n// __mac_set_lctx\n// Setlcid\n// Read_nocancel\n// Write_nocancel\n// Open_nocancel\n// Close_nocancel\n// Wait4_nocancel\n// Recvmsg_nocancel\n// Sendmsg_nocancel\n// Recvfrom_nocancel\n// Accept_nocancel\n// Fcntl_nocancel\n// Select_nocancel\n// Fsync_nocancel\n// Connect_nocancel\n// Sigsuspend_nocancel\n// Readv_nocancel\n// Writev_nocancel\n// Sendto_nocancel\n// Pread_nocancel\n// Pwrite_nocancel\n// Waitid_nocancel\n// Poll_nocancel\n// Msgsnd_nocancel\n// Msgrcv_nocancel\n// Sem_wait_nocancel\n// Aio_suspend_nocancel\n// __sigwait_nocancel\n// __semwait_signal_nocancel\n// __mac_mount\n// __mac_get_mount\n// __mac_getfsstat\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_freebsd_386.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build 386,freebsd\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: int32(sec), Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: int32(sec), Usec: int32(usec)}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar writtenOut uint64 = 0\n\t_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)\n\n\twritten = int(writtenOut)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,freebsd\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint64(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar writtenOut uint64 = 0\n\t_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)\n\n\twritten = int(writtenOut)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build arm,freebsd\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tvar writtenOut uint64 = 0\n\t_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)\n\n\twritten = int(writtenOut)\n\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Linux system calls.\n// This file is compiled as ordinary Go code,\n// but it is also input to mksyscall,\n// which parses the //sys lines and generates system call stubs.\n// Note that sometimes we use a lowercase //sys name and\n// wrap it in our own nicer implementation.\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n/*\n * Wrapped\n */\n\nfunc Access(path string, mode uint32) (err error) {\n\treturn Faccessat(AT_FDCWD, path, mode, 0)\n}\n\nfunc Chmod(path string, mode uint32) (err error) {\n\treturn Fchmodat(AT_FDCWD, path, mode, 0)\n}\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\treturn Fchownat(AT_FDCWD, path, uid, gid, 0)\n}\n\nfunc Creat(path string, mode uint32) (fd int, err error) {\n\treturn Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)\n}\n\n//sys\tfchmodat(dirfd int, path string, mode uint32) (err error)\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\t// Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior\n\t// and check the flags. Otherwise the mode would be applied to the symlink\n\t// destination which is not what the user expects.\n\tif flags&^AT_SYMLINK_NOFOLLOW != 0 {\n\t\treturn EINVAL\n\t} else if flags&AT_SYMLINK_NOFOLLOW != 0 {\n\t\treturn EOPNOTSUPP\n\t}\n\treturn fchmodat(dirfd, path, mode)\n}\n\n//sys\tioctl(fd int, req uint, arg uintptr) (err error)\n\n// ioctl itself should not be exposed directly, but additional get/set\n// functions for specific types are permissible.\n\n// IoctlSetInt performs an ioctl operation which sets an integer value\n// on fd, using the specified request number.\nfunc IoctlSetInt(fd int, req uint, value int) error {\n\treturn ioctl(fd, req, uintptr(value))\n}\n\nfunc IoctlSetWinsize(fd int, req uint, value *Winsize) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermios(fd int, req uint, value *Termios) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\n// IoctlGetInt performs an ioctl operation which gets an integer value\n// from fd, using the specified request number.\nfunc IoctlGetInt(fd int, req uint) (int, error) {\n\tvar value int\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn value, err\n}\n\nfunc IoctlGetWinsize(fd int, req uint) (*Winsize, error) {\n\tvar value Winsize\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermios(fd int, req uint) (*Termios, error) {\n\tvar value Termios\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\n//sys\tLinkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error)\n\nfunc Link(oldpath string, newpath string) (err error) {\n\treturn Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0)\n}\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\treturn Mkdirat(AT_FDCWD, path, mode)\n}\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\treturn Mknodat(AT_FDCWD, path, mode, dev)\n}\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\treturn openat(AT_FDCWD, path, mode|O_LARGEFILE, perm)\n}\n\n//sys\topenat(dirfd int, path string, flags int, mode uint32) (fd int, err error)\n\nfunc Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\treturn openat(dirfd, path, flags|O_LARGEFILE, mode)\n}\n\n//sys\tppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error)\n\nfunc Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn ppoll(nil, 0, timeout, sigmask)\n\t}\n\treturn ppoll(&fds[0], len(fds), timeout, sigmask)\n}\n\n//sys\tReadlinkat(dirfd int, path string, buf []byte) (n int, err error)\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\treturn Readlinkat(AT_FDCWD, path, buf)\n}\n\nfunc Rename(oldpath string, newpath string) (err error) {\n\treturn Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath)\n}\n\nfunc Rmdir(path string) error {\n\treturn Unlinkat(AT_FDCWD, path, AT_REMOVEDIR)\n}\n\n//sys\tSymlinkat(oldpath string, newdirfd int, newpath string) (err error)\n\nfunc Symlink(oldpath string, newpath string) (err error) {\n\treturn Symlinkat(oldpath, AT_FDCWD, newpath)\n}\n\nfunc Unlink(path string) error {\n\treturn Unlinkat(AT_FDCWD, path, 0)\n}\n\n//sys\tUnlinkat(dirfd int, path string, flags int) (err error)\n\n//sys\tutimes(path string, times *[2]Timeval) (err error)\n\nfunc Utimes(path string, tv []Timeval) error {\n\tif tv == nil {\n\t\terr := utimensat(AT_FDCWD, path, nil, 0)\n\t\tif err != ENOSYS {\n\t\t\treturn err\n\t\t}\n\t\treturn utimes(path, nil)\n\t}\n\tif len(tv) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar ts [2]Timespec\n\tts[0] = NsecToTimespec(TimevalToNsec(tv[0]))\n\tts[1] = NsecToTimespec(TimevalToNsec(tv[1]))\n\terr := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\treturn utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\n//sys\tutimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)\n\nfunc UtimesNano(path string, ts []Timespec) error {\n\tif ts == nil {\n\t\terr := utimensat(AT_FDCWD, path, nil, 0)\n\t\tif err != ENOSYS {\n\t\t\treturn err\n\t\t}\n\t\treturn utimes(path, nil)\n\t}\n\tif len(ts) != 2 {\n\t\treturn EINVAL\n\t}\n\terr := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\t// If the utimensat syscall isn't available (utimensat was added to Linux\n\t// in 2.6.22, Released, 8 July 2007) then fall back to utimes\n\tvar tv [2]Timeval\n\tfor i := 0; i < 2; i++ {\n\t\ttv[i] = NsecToTimeval(TimespecToNsec(ts[i]))\n\t}\n\treturn utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\nfunc UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {\n\tif ts == nil {\n\t\treturn utimensat(dirfd, path, nil, flags)\n\t}\n\tif len(ts) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)\n}\n\n//sys\tfutimesat(dirfd int, path *byte, times *[2]Timeval) (err error)\n\nfunc Futimesat(dirfd int, path string, tv []Timeval) error {\n\tpathp, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif tv == nil {\n\t\treturn futimesat(dirfd, pathp, nil)\n\t}\n\tif len(tv) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\nfunc Futimes(fd int, tv []Timeval) (err error) {\n\t// Believe it or not, this is the best we can do on Linux\n\t// (and is what glibc does).\n\treturn Utimes(\"/proc/self/fd/\"+itoa(fd), tv)\n}\n\nconst ImplementsGetwd = true\n\n//sys\tGetcwd(buf []byte) (n int, err error)\n\nfunc Getwd() (wd string, err error) {\n\tvar buf [PathMax]byte\n\tn, err := Getcwd(buf[0:])\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\t// Getcwd returns the number of bytes written to buf, including the NUL.\n\tif n < 1 || n > len(buf) || buf[n-1] != 0 {\n\t\treturn \"\", EINVAL\n\t}\n\treturn string(buf[0 : n-1]), nil\n}\n\nfunc Getgroups() (gids []int, err error) {\n\tn, err := getgroups(0, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif n == 0 {\n\t\treturn nil, nil\n\t}\n\n\t// Sanity check group count. Max is 1<<16 on Linux.\n\tif n < 0 || n > 1<<20 {\n\t\treturn nil, EINVAL\n\t}\n\n\ta := make([]_Gid_t, n)\n\tn, err = getgroups(n, &a[0])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgids = make([]int, n)\n\tfor i, v := range a[0:n] {\n\t\tgids[i] = int(v)\n\t}\n\treturn\n}\n\nfunc Setgroups(gids []int) (err error) {\n\tif len(gids) == 0 {\n\t\treturn setgroups(0, nil)\n\t}\n\n\ta := make([]_Gid_t, len(gids))\n\tfor i, v := range gids {\n\t\ta[i] = _Gid_t(v)\n\t}\n\treturn setgroups(len(a), &a[0])\n}\n\ntype WaitStatus uint32\n\n// Wait status is 7 bits at bottom, either 0 (exited),\n// 0x7F (stopped), or a signal number that caused an exit.\n// The 0x80 bit is whether there was a core dump.\n// An extra number (exit code, signal causing a stop)\n// is in the high bits. At least that's the idea.\n// There are various irregularities. For example, the\n// \"continued\" status is 0xFFFF, distinguishing itself\n// from stopped via the core dump bit.\n\nconst (\n\tmask    = 0x7F\n\tcore    = 0x80\n\texited  = 0x00\n\tstopped = 0x7F\n\tshift   = 8\n)\n\nfunc (w WaitStatus) Exited() bool { return w&mask == exited }\n\nfunc (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited }\n\nfunc (w WaitStatus) Stopped() bool { return w&0xFF == stopped }\n\nfunc (w WaitStatus) Continued() bool { return w == 0xFFFF }\n\nfunc (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }\n\nfunc (w WaitStatus) ExitStatus() int {\n\tif !w.Exited() {\n\t\treturn -1\n\t}\n\treturn int(w>>shift) & 0xFF\n}\n\nfunc (w WaitStatus) Signal() syscall.Signal {\n\tif !w.Signaled() {\n\t\treturn -1\n\t}\n\treturn syscall.Signal(w & mask)\n}\n\nfunc (w WaitStatus) StopSignal() syscall.Signal {\n\tif !w.Stopped() {\n\t\treturn -1\n\t}\n\treturn syscall.Signal(w>>shift) & 0xFF\n}\n\nfunc (w WaitStatus) TrapCause() int {\n\tif w.StopSignal() != SIGTRAP {\n\t\treturn -1\n\t}\n\treturn int(w>>shift) >> 8\n}\n\n//sys\twait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)\n\nfunc Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {\n\tvar status _C_int\n\twpid, err = wait4(pid, &status, options, rusage)\n\tif wstatus != nil {\n\t\t*wstatus = WaitStatus(status)\n\t}\n\treturn\n}\n\nfunc Mkfifo(path string, mode uint32) error {\n\treturn Mknod(path, mode|S_IFIFO, 0)\n}\n\nfunc Mkfifoat(dirfd int, path string, mode uint32) error {\n\treturn Mknodat(dirfd, path, mode|S_IFIFO, 0)\n}\n\nfunc (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_INET\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil\n}\n\nfunc (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_INET6\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tsa.raw.Scope_id = sa.ZoneId\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil\n}\n\nfunc (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tname := sa.Name\n\tn := len(name)\n\tif n >= len(sa.raw.Path) {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_UNIX\n\tfor i := 0; i < n; i++ {\n\t\tsa.raw.Path[i] = int8(name[i])\n\t}\n\t// length is family (uint16), name, NUL.\n\tsl := _Socklen(2)\n\tif n > 0 {\n\t\tsl += _Socklen(n) + 1\n\t}\n\tif sa.raw.Path[0] == '@' {\n\t\tsa.raw.Path[0] = 0\n\t\t// Don't count trailing NUL for abstract address.\n\t\tsl--\n\t}\n\n\treturn unsafe.Pointer(&sa.raw), sl, nil\n}\n\ntype SockaddrLinklayer struct {\n\tProtocol uint16\n\tIfindex  int\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]byte\n\traw      RawSockaddrLinklayer\n}\n\nfunc (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_PACKET\n\tsa.raw.Protocol = sa.Protocol\n\tsa.raw.Ifindex = int32(sa.Ifindex)\n\tsa.raw.Hatype = sa.Hatype\n\tsa.raw.Pkttype = sa.Pkttype\n\tsa.raw.Halen = sa.Halen\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil\n}\n\ntype SockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n\traw    RawSockaddrNetlink\n}\n\nfunc (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tsa.raw.Family = AF_NETLINK\n\tsa.raw.Pad = sa.Pad\n\tsa.raw.Pid = sa.Pid\n\tsa.raw.Groups = sa.Groups\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil\n}\n\ntype SockaddrHCI struct {\n\tDev     uint16\n\tChannel uint16\n\traw     RawSockaddrHCI\n}\n\nfunc (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tsa.raw.Family = AF_BLUETOOTH\n\tsa.raw.Dev = sa.Dev\n\tsa.raw.Channel = sa.Channel\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil\n}\n\n// SockaddrCAN implements the Sockaddr interface for AF_CAN type sockets.\n// The RxID and TxID fields are used for transport protocol addressing in\n// (CAN_TP16, CAN_TP20, CAN_MCNET, and CAN_ISOTP), they can be left with\n// zero values for CAN_RAW and CAN_BCM sockets as they have no meaning.\n//\n// The SockaddrCAN struct must be bound to the socket file descriptor\n// using Bind before the CAN socket can be used.\n//\n//      // Read one raw CAN frame\n//      fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW)\n//      addr := &SockaddrCAN{Ifindex: index}\n//      Bind(fd, addr)\n//      frame := make([]byte, 16)\n//      Read(fd, frame)\n//\n// The full SocketCAN documentation can be found in the linux kernel\n// archives at: https://www.kernel.org/doc/Documentation/networking/can.txt\ntype SockaddrCAN struct {\n\tIfindex int\n\tRxID    uint32\n\tTxID    uint32\n\traw     RawSockaddrCAN\n}\n\nfunc (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_CAN\n\tsa.raw.Ifindex = int32(sa.Ifindex)\n\trx := (*[4]byte)(unsafe.Pointer(&sa.RxID))\n\tfor i := 0; i < 4; i++ {\n\t\tsa.raw.Addr[i] = rx[i]\n\t}\n\ttx := (*[4]byte)(unsafe.Pointer(&sa.TxID))\n\tfor i := 0; i < 4; i++ {\n\t\tsa.raw.Addr[i+4] = tx[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil\n}\n\n// SockaddrALG implements the Sockaddr interface for AF_ALG type sockets.\n// SockaddrALG enables userspace access to the Linux kernel's cryptography\n// subsystem. The Type and Name fields specify which type of hash or cipher\n// should be used with a given socket.\n//\n// To create a file descriptor that provides access to a hash or cipher, both\n// Bind and Accept must be used. Once the setup process is complete, input\n// data can be written to the socket, processed by the kernel, and then read\n// back as hash output or ciphertext.\n//\n// Here is an example of using an AF_ALG socket with SHA1 hashing.\n// The initial socket setup process is as follows:\n//\n//      // Open a socket to perform SHA1 hashing.\n//      fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0)\n//      addr := &unix.SockaddrALG{Type: \"hash\", Name: \"sha1\"}\n//      unix.Bind(fd, addr)\n//      // Note: unix.Accept does not work at this time; must invoke accept()\n//      // manually using unix.Syscall.\n//      hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0)\n//\n// Once a file descriptor has been returned from Accept, it may be used to\n// perform SHA1 hashing. The descriptor is not safe for concurrent use, but\n// may be re-used repeatedly with subsequent Write and Read operations.\n//\n// When hashing a small byte slice or string, a single Write and Read may\n// be used:\n//\n//      // Assume hashfd is already configured using the setup process.\n//      hash := os.NewFile(hashfd, \"sha1\")\n//      // Hash an input string and read the results. Each Write discards\n//      // previous hash state. Read always reads the current state.\n//      b := make([]byte, 20)\n//      for i := 0; i < 2; i++ {\n//          io.WriteString(hash, \"Hello, world.\")\n//          hash.Read(b)\n//          fmt.Println(hex.EncodeToString(b))\n//      }\n//      // Output:\n//      // 2ae01472317d1935a84797ec1983ae243fc6aa28\n//      // 2ae01472317d1935a84797ec1983ae243fc6aa28\n//\n// For hashing larger byte slices, or byte streams such as those read from\n// a file or socket, use Sendto with MSG_MORE to instruct the kernel to update\n// the hash digest instead of creating a new one for a given chunk and finalizing it.\n//\n//      // Assume hashfd and addr are already configured using the setup process.\n//      hash := os.NewFile(hashfd, \"sha1\")\n//      // Hash the contents of a file.\n//      f, _ := os.Open(\"/tmp/linux-4.10-rc7.tar.xz\")\n//      b := make([]byte, 4096)\n//      for {\n//          n, err := f.Read(b)\n//          if err == io.EOF {\n//              break\n//          }\n//          unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr)\n//      }\n//      hash.Read(b)\n//      fmt.Println(hex.EncodeToString(b))\n//      // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5\n//\n// For more information, see: http://www.chronox.de/crypto-API/crypto/userspace-if.html.\ntype SockaddrALG struct {\n\tType    string\n\tName    string\n\tFeature uint32\n\tMask    uint32\n\traw     RawSockaddrALG\n}\n\nfunc (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\t// Leave room for NUL byte terminator.\n\tif len(sa.Type) > 13 {\n\t\treturn nil, 0, EINVAL\n\t}\n\tif len(sa.Name) > 63 {\n\t\treturn nil, 0, EINVAL\n\t}\n\n\tsa.raw.Family = AF_ALG\n\tsa.raw.Feat = sa.Feature\n\tsa.raw.Mask = sa.Mask\n\n\ttyp, err := ByteSliceFromString(sa.Type)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\tname, err := ByteSliceFromString(sa.Name)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tcopy(sa.raw.Type[:], typ)\n\tcopy(sa.raw.Name[:], name)\n\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil\n}\n\n// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets.\n// SockaddrVM provides access to Linux VM sockets: a mechanism that enables\n// bidirectional communication between a hypervisor and its guest virtual\n// machines.\ntype SockaddrVM struct {\n\t// CID and Port specify a context ID and port address for a VM socket.\n\t// Guests have a unique CID, and hosts may have a well-known CID of:\n\t//  - VMADDR_CID_HYPERVISOR: refers to the hypervisor process.\n\t//  - VMADDR_CID_HOST: refers to other processes on the host.\n\tCID  uint32\n\tPort uint32\n\traw  RawSockaddrVM\n}\n\nfunc (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tsa.raw.Family = AF_VSOCK\n\tsa.raw.Port = sa.Port\n\tsa.raw.Cid = sa.CID\n\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil\n}\n\nfunc anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {\n\tswitch rsa.Addr.Family {\n\tcase AF_NETLINK:\n\t\tpp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrNetlink)\n\t\tsa.Family = pp.Family\n\t\tsa.Pad = pp.Pad\n\t\tsa.Pid = pp.Pid\n\t\tsa.Groups = pp.Groups\n\t\treturn sa, nil\n\n\tcase AF_PACKET:\n\t\tpp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrLinklayer)\n\t\tsa.Protocol = pp.Protocol\n\t\tsa.Ifindex = int(pp.Ifindex)\n\t\tsa.Hatype = pp.Hatype\n\t\tsa.Pkttype = pp.Pkttype\n\t\tsa.Halen = pp.Halen\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\n\tcase AF_UNIX:\n\t\tpp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrUnix)\n\t\tif pp.Path[0] == 0 {\n\t\t\t// \"Abstract\" Unix domain socket.\n\t\t\t// Rewrite leading NUL as @ for textual display.\n\t\t\t// (This is the standard convention.)\n\t\t\t// Not friendly to overwrite in place,\n\t\t\t// but the callers below don't care.\n\t\t\tpp.Path[0] = '@'\n\t\t}\n\n\t\t// Assume path ends at NUL.\n\t\t// This is not technically the Linux semantics for\n\t\t// abstract Unix domain sockets--they are supposed\n\t\t// to be uninterpreted fixed-size binary blobs--but\n\t\t// everyone uses this convention.\n\t\tn := 0\n\t\tfor n < len(pp.Path) && pp.Path[n] != 0 {\n\t\t\tn++\n\t\t}\n\t\tbytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]\n\t\tsa.Name = string(bytes)\n\t\treturn sa, nil\n\n\tcase AF_INET:\n\t\tpp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet4)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\n\tcase AF_INET6:\n\t\tpp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet6)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tsa.ZoneId = pp.Scope_id\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\n\tcase AF_VSOCK:\n\t\tpp := (*RawSockaddrVM)(unsafe.Pointer(rsa))\n\t\tsa := &SockaddrVM{\n\t\t\tCID:  pp.Cid,\n\t\t\tPort: pp.Port,\n\t\t}\n\t\treturn sa, nil\n\t}\n\treturn nil, EAFNOSUPPORT\n}\n\nfunc Accept(fd int) (nfd int, sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tnfd, err = accept(fd, &rsa, &len)\n\tif err != nil {\n\t\treturn\n\t}\n\tsa, err = anyToSockaddr(&rsa)\n\tif err != nil {\n\t\tClose(nfd)\n\t\tnfd = 0\n\t}\n\treturn\n}\n\nfunc Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tnfd, err = accept4(fd, &rsa, &len, flags)\n\tif err != nil {\n\t\treturn\n\t}\n\tif len > SizeofSockaddrAny {\n\t\tpanic(\"RawSockaddrAny too small\")\n\t}\n\tsa, err = anyToSockaddr(&rsa)\n\tif err != nil {\n\t\tClose(nfd)\n\t\tnfd = 0\n\t}\n\treturn\n}\n\nfunc Getsockname(fd int) (sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tif err = getsockname(fd, &rsa, &len); err != nil {\n\t\treturn\n\t}\n\treturn anyToSockaddr(&rsa)\n}\n\nfunc GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {\n\tvallen := _Socklen(4)\n\terr = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen)\n\treturn value, err\n}\n\nfunc GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {\n\tvar value IPMreq\n\tvallen := _Socklen(SizeofIPMreq)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {\n\tvar value IPMreqn\n\tvallen := _Socklen(SizeofIPMreqn)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {\n\tvar value IPv6Mreq\n\tvallen := _Socklen(SizeofIPv6Mreq)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {\n\tvar value IPv6MTUInfo\n\tvallen := _Socklen(SizeofIPv6MTUInfo)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) {\n\tvar value ICMPv6Filter\n\tvallen := _Socklen(SizeofICMPv6Filter)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptUcred(fd, level, opt int) (*Ucred, error) {\n\tvar value Ucred\n\tvallen := _Socklen(SizeofUcred)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) {\n\tvar value TCPInfo\n\tvallen := _Socklen(SizeofTCPInfo)\n\terr := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)\n\treturn &value, err\n}\n\nfunc SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))\n}\n\n// Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html)\n\n// KeyctlInt calls keyctl commands in which each argument is an int.\n// These commands are KEYCTL_REVOKE, KEYCTL_CHOWN, KEYCTL_CLEAR, KEYCTL_LINK,\n// KEYCTL_UNLINK, KEYCTL_NEGATE, KEYCTL_SET_REQKEY_KEYRING, KEYCTL_SET_TIMEOUT,\n// KEYCTL_ASSUME_AUTHORITY, KEYCTL_SESSION_TO_PARENT, KEYCTL_REJECT,\n// KEYCTL_INVALIDATE, and KEYCTL_GET_PERSISTENT.\n//sys\tKeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) = SYS_KEYCTL\n\n// KeyctlBuffer calls keyctl commands in which the third and fourth\n// arguments are a buffer and its length, respectively.\n// These commands are KEYCTL_UPDATE, KEYCTL_READ, and KEYCTL_INSTANTIATE.\n//sys\tKeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) = SYS_KEYCTL\n\n// KeyctlString calls keyctl commands which return a string.\n// These commands are KEYCTL_DESCRIBE and KEYCTL_GET_SECURITY.\nfunc KeyctlString(cmd int, id int) (string, error) {\n\t// We must loop as the string data may change in between the syscalls.\n\t// We could allocate a large buffer here to reduce the chance that the\n\t// syscall needs to be called twice; however, this is unnecessary as\n\t// the performance loss is negligible.\n\tvar buffer []byte\n\tfor {\n\t\t// Try to fill the buffer with data\n\t\tlength, err := KeyctlBuffer(cmd, id, buffer, 0)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\t// Check if the data was written\n\t\tif length <= len(buffer) {\n\t\t\t// Exclude the null terminator\n\t\t\treturn string(buffer[:length-1]), nil\n\t\t}\n\n\t\t// Make a bigger buffer if needed\n\t\tbuffer = make([]byte, length)\n\t}\n}\n\n// Keyctl commands with special signatures.\n\n// KeyctlGetKeyringID implements the KEYCTL_GET_KEYRING_ID command.\n// See the full documentation at:\n// http://man7.org/linux/man-pages/man3/keyctl_get_keyring_ID.3.html\nfunc KeyctlGetKeyringID(id int, create bool) (ringid int, err error) {\n\tcreateInt := 0\n\tif create {\n\t\tcreateInt = 1\n\t}\n\treturn KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0)\n}\n\n// KeyctlSetperm implements the KEYCTL_SETPERM command. The perm value is the\n// key handle permission mask as described in the \"keyctl setperm\" section of\n// http://man7.org/linux/man-pages/man1/keyctl.1.html.\n// See the full documentation at:\n// http://man7.org/linux/man-pages/man3/keyctl_setperm.3.html\nfunc KeyctlSetperm(id int, perm uint32) error {\n\t_, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0)\n\treturn err\n}\n\n//sys\tkeyctlJoin(cmd int, arg2 string) (ret int, err error) = SYS_KEYCTL\n\n// KeyctlJoinSessionKeyring implements the KEYCTL_JOIN_SESSION_KEYRING command.\n// See the full documentation at:\n// http://man7.org/linux/man-pages/man3/keyctl_join_session_keyring.3.html\nfunc KeyctlJoinSessionKeyring(name string) (ringid int, err error) {\n\treturn keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name)\n}\n\n//sys\tkeyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) = SYS_KEYCTL\n\n// KeyctlSearch implements the KEYCTL_SEARCH command.\n// See the full documentation at:\n// http://man7.org/linux/man-pages/man3/keyctl_search.3.html\nfunc KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) {\n\treturn keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid)\n}\n\n//sys\tkeyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) = SYS_KEYCTL\n\n// KeyctlInstantiateIOV implements the KEYCTL_INSTANTIATE_IOV command. This\n// command is similar to KEYCTL_INSTANTIATE, except that the payload is a slice\n// of Iovec (each of which represents a buffer) instead of a single buffer.\n// See the full documentation at:\n// http://man7.org/linux/man-pages/man3/keyctl_instantiate_iov.3.html\nfunc KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error {\n\treturn keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid)\n}\n\n//sys\tkeyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) = SYS_KEYCTL\n\n// KeyctlDHCompute implements the KEYCTL_DH_COMPUTE command. This command\n// computes a Diffie-Hellman shared secret based on the provide params. The\n// secret is written to the provided buffer and the returned size is the number\n// of bytes written (returning an error if there is insufficient space in the\n// buffer). If a nil buffer is passed in, this function returns the minimum\n// buffer length needed to store the appropriate data. Note that this differs\n// from KEYCTL_READ's behavior which always returns the requested payload size.\n// See the full documentation at:\n// http://man7.org/linux/man-pages/man3/keyctl_dh_compute.3.html\nfunc KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) {\n\treturn keyctlDH(KEYCTL_DH_COMPUTE, params, buffer)\n}\n\nfunc Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {\n\tvar msg Msghdr\n\tvar rsa RawSockaddrAny\n\tmsg.Name = (*byte)(unsafe.Pointer(&rsa))\n\tmsg.Namelen = uint32(SizeofSockaddrAny)\n\tvar iov Iovec\n\tif len(p) > 0 {\n\t\tiov.Base = &p[0]\n\t\tiov.SetLen(len(p))\n\t}\n\tvar dummy byte\n\tif len(oob) > 0 {\n\t\tvar sockType int\n\t\tsockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\t// receive at least one normal byte\n\t\tif sockType != SOCK_DGRAM && len(p) == 0 {\n\t\t\tiov.Base = &dummy\n\t\t\tiov.SetLen(1)\n\t\t}\n\t\tmsg.Control = &oob[0]\n\t\tmsg.SetControllen(len(oob))\n\t}\n\tmsg.Iov = &iov\n\tmsg.Iovlen = 1\n\tif n, err = recvmsg(fd, &msg, flags); err != nil {\n\t\treturn\n\t}\n\toobn = int(msg.Controllen)\n\trecvflags = int(msg.Flags)\n\t// source address is only specified if the socket is unconnected\n\tif rsa.Addr.Family != AF_UNSPEC {\n\t\tfrom, err = anyToSockaddr(&rsa)\n\t}\n\treturn\n}\n\nfunc Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {\n\t_, err = SendmsgN(fd, p, oob, to, flags)\n\treturn\n}\n\nfunc SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {\n\tvar ptr unsafe.Pointer\n\tvar salen _Socklen\n\tif to != nil {\n\t\tvar err error\n\t\tptr, salen, err = to.sockaddr()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\tvar msg Msghdr\n\tmsg.Name = (*byte)(ptr)\n\tmsg.Namelen = uint32(salen)\n\tvar iov Iovec\n\tif len(p) > 0 {\n\t\tiov.Base = &p[0]\n\t\tiov.SetLen(len(p))\n\t}\n\tvar dummy byte\n\tif len(oob) > 0 {\n\t\tvar sockType int\n\t\tsockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\t// send at least one normal byte\n\t\tif sockType != SOCK_DGRAM && len(p) == 0 {\n\t\t\tiov.Base = &dummy\n\t\t\tiov.SetLen(1)\n\t\t}\n\t\tmsg.Control = &oob[0]\n\t\tmsg.SetControllen(len(oob))\n\t}\n\tmsg.Iov = &iov\n\tmsg.Iovlen = 1\n\tif n, err = sendmsg(fd, &msg, flags); err != nil {\n\t\treturn 0, err\n\t}\n\tif len(oob) > 0 && len(p) == 0 {\n\t\tn = 0\n\t}\n\treturn n, nil\n}\n\n// BindToDevice binds the socket associated with fd to device.\nfunc BindToDevice(fd int, device string) (err error) {\n\treturn SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device)\n}\n\n//sys\tptrace(request int, pid int, addr uintptr, data uintptr) (err error)\n\nfunc ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) {\n\t// The peek requests are machine-size oriented, so we wrap it\n\t// to retrieve arbitrary-length data.\n\n\t// The ptrace syscall differs from glibc's ptrace.\n\t// Peeks returns the word in *data, not as the return value.\n\n\tvar buf [sizeofPtr]byte\n\n\t// Leading edge. PEEKTEXT/PEEKDATA don't require aligned\n\t// access (PEEKUSER warns that it might), but if we don't\n\t// align our reads, we might straddle an unmapped page\n\t// boundary and not get the bytes leading up to the page\n\t// boundary.\n\tn := 0\n\tif addr%sizeofPtr != 0 {\n\t\terr = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tn += copy(out, buf[addr%sizeofPtr:])\n\t\tout = out[n:]\n\t}\n\n\t// Remainder.\n\tfor len(out) > 0 {\n\t\t// We use an internal buffer to guarantee alignment.\n\t\t// It's not documented if this is necessary, but we're paranoid.\n\t\terr = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))\n\t\tif err != nil {\n\t\t\treturn n, err\n\t\t}\n\t\tcopied := copy(out, buf[0:])\n\t\tn += copied\n\t\tout = out[copied:]\n\t}\n\n\treturn n, nil\n}\n\nfunc PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) {\n\treturn ptracePeek(PTRACE_PEEKTEXT, pid, addr, out)\n}\n\nfunc PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) {\n\treturn ptracePeek(PTRACE_PEEKDATA, pid, addr, out)\n}\n\nfunc PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) {\n\treturn ptracePeek(PTRACE_PEEKUSR, pid, addr, out)\n}\n\nfunc ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) {\n\t// As for ptracePeek, we need to align our accesses to deal\n\t// with the possibility of straddling an invalid page.\n\n\t// Leading edge.\n\tn := 0\n\tif addr%sizeofPtr != 0 {\n\t\tvar buf [sizeofPtr]byte\n\t\terr = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0])))\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tn += copy(buf[addr%sizeofPtr:], data)\n\t\tword := *((*uintptr)(unsafe.Pointer(&buf[0])))\n\t\terr = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word)\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t\tdata = data[n:]\n\t}\n\n\t// Interior.\n\tfor len(data) > sizeofPtr {\n\t\tword := *((*uintptr)(unsafe.Pointer(&data[0])))\n\t\terr = ptrace(pokeReq, pid, addr+uintptr(n), word)\n\t\tif err != nil {\n\t\t\treturn n, err\n\t\t}\n\t\tn += sizeofPtr\n\t\tdata = data[sizeofPtr:]\n\t}\n\n\t// Trailing edge.\n\tif len(data) > 0 {\n\t\tvar buf [sizeofPtr]byte\n\t\terr = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0])))\n\t\tif err != nil {\n\t\t\treturn n, err\n\t\t}\n\t\tcopy(buf[0:], data)\n\t\tword := *((*uintptr)(unsafe.Pointer(&buf[0])))\n\t\terr = ptrace(pokeReq, pid, addr+uintptr(n), word)\n\t\tif err != nil {\n\t\t\treturn n, err\n\t\t}\n\t\tn += len(data)\n\t}\n\n\treturn n, nil\n}\n\nfunc PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) {\n\treturn ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data)\n}\n\nfunc PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {\n\treturn ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)\n}\n\nfunc PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) {\n\treturn ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data)\n}\n\nfunc PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\nfunc PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n\nfunc PtraceSetOptions(pid int, options int) (err error) {\n\treturn ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options))\n}\n\nfunc PtraceGetEventMsg(pid int) (msg uint, err error) {\n\tvar data _C_long\n\terr = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data)))\n\tmsg = uint(data)\n\treturn\n}\n\nfunc PtraceCont(pid int, signal int) (err error) {\n\treturn ptrace(PTRACE_CONT, pid, 0, uintptr(signal))\n}\n\nfunc PtraceSyscall(pid int, signal int) (err error) {\n\treturn ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal))\n}\n\nfunc PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) }\n\nfunc PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) }\n\nfunc PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) }\n\n//sys\treboot(magic1 uint, magic2 uint, cmd int, arg string) (err error)\n\nfunc Reboot(cmd int) (err error) {\n\treturn reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, \"\")\n}\n\nfunc ReadDirent(fd int, buf []byte) (n int, err error) {\n\treturn Getdents(fd, buf)\n}\n\nfunc direntIno(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))\n}\n\nfunc direntReclen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))\n}\n\nfunc direntNamlen(buf []byte) (uint64, bool) {\n\treclen, ok := direntReclen(buf)\n\tif !ok {\n\t\treturn 0, false\n\t}\n\treturn reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true\n}\n\n//sys\tmount(source string, target string, fstype string, flags uintptr, data *byte) (err error)\n\nfunc Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {\n\t// Certain file systems get rather angry and EINVAL if you give\n\t// them an empty string of data, rather than NULL.\n\tif data == \"\" {\n\t\treturn mount(source, target, fstype, flags, nil)\n\t}\n\tdatap, err := BytePtrFromString(data)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn mount(source, target, fstype, flags, datap)\n}\n\n// Sendto\n// Recvfrom\n// Socketpair\n\n/*\n * Direct access\n */\n//sys\tAcct(path string) (err error)\n//sys\tAddKey(keyType string, description string, payload []byte, ringid int) (id int, err error)\n//sys\tAdjtimex(buf *Timex) (state int, err error)\n//sys\tChdir(path string) (err error)\n//sys\tChroot(path string) (err error)\n//sys\tClockGettime(clockid int32, time *Timespec) (err error)\n//sys\tClose(fd int) (err error)\n//sys\tCopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)\n//sys\tDup(oldfd int) (fd int, err error)\n//sys\tDup3(oldfd int, newfd int, flags int) (err error)\n//sysnb\tEpollCreate(size int) (fd int, err error)\n//sysnb\tEpollCreate1(flag int) (fd int, err error)\n//sysnb\tEpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error)\n//sys\tEventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2\n//sys\tExit(code int) = SYS_EXIT_GROUP\n//sys\tFaccessat(dirfd int, path string, mode uint32, flags int) (err error)\n//sys\tFallocate(fd int, mode uint32, off int64, len int64) (err error)\n//sys\tFchdir(fd int) (err error)\n//sys\tFchmod(fd int, mode uint32) (err error)\n//sys\tFchownat(dirfd int, path string, uid int, gid int, flags int) (err error)\n//sys\tfcntl(fd int, cmd int, arg int) (val int, err error)\n//sys\tFdatasync(fd int) (err error)\n//sys\tFlock(fd int, how int) (err error)\n//sys\tFsync(fd int) (err error)\n//sys\tGetdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64\n//sysnb\tGetpgid(pid int) (pgid int, err error)\n\nfunc Getpgrp() (pid int) {\n\tpid, _ = Getpgid(0)\n\treturn\n}\n\n//sysnb\tGetpid() (pid int)\n//sysnb\tGetppid() (ppid int)\n//sys\tGetpriority(which int, who int) (prio int, err error)\n//sys\tGetrandom(buf []byte, flags int) (n int, err error)\n//sysnb\tGetrusage(who int, rusage *Rusage) (err error)\n//sysnb\tGetsid(pid int) (sid int, err error)\n//sysnb\tGettid() (tid int)\n//sys\tGetxattr(path string, attr string, dest []byte) (sz int, err error)\n//sys\tInotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error)\n//sysnb\tInotifyInit1(flags int) (fd int, err error)\n//sysnb\tInotifyRmWatch(fd int, watchdesc uint32) (success int, err error)\n//sysnb\tKill(pid int, sig syscall.Signal) (err error)\n//sys\tKlogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG\n//sys\tLgetxattr(path string, attr string, dest []byte) (sz int, err error)\n//sys\tListxattr(path string, dest []byte) (sz int, err error)\n//sys\tLlistxattr(path string, dest []byte) (sz int, err error)\n//sys\tLremovexattr(path string, attr string) (err error)\n//sys\tLsetxattr(path string, attr string, data []byte, flags int) (err error)\n//sys\tMkdirat(dirfd int, path string, mode uint32) (err error)\n//sys\tMknodat(dirfd int, path string, mode uint32, dev int) (err error)\n//sys\tNanosleep(time *Timespec, leftover *Timespec) (err error)\n//sys\tPivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT\n//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64\n//sys   Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error)\n//sys\tPselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6\n//sys\tread(fd int, p []byte) (n int, err error)\n//sys\tRemovexattr(path string, attr string) (err error)\n//sys\tRenameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)\n//sys\tRequestKey(keyType string, description string, callback string, destRingid int) (id int, err error)\n//sys\tSetdomainname(p []byte) (err error)\n//sys\tSethostname(p []byte) (err error)\n//sysnb\tSetpgid(pid int, pgid int) (err error)\n//sysnb\tSetsid() (pid int, err error)\n//sysnb\tSettimeofday(tv *Timeval) (err error)\n//sys\tSetns(fd int, nstype int) (err error)\n\n// issue 1435.\n// On linux Setuid and Setgid only affects the current thread, not the process.\n// This does not match what most callers expect so we must return an error\n// here rather than letting the caller think that the call succeeded.\n\nfunc Setuid(uid int) (err error) {\n\treturn EOPNOTSUPP\n}\n\nfunc Setgid(uid int) (err error) {\n\treturn EOPNOTSUPP\n}\n\n//sys\tSetpriority(which int, who int, prio int) (err error)\n//sys\tSetxattr(path string, attr string, data []byte, flags int) (err error)\n//sys\tSync()\n//sys\tSyncfs(fd int) (err error)\n//sysnb\tSysinfo(info *Sysinfo_t) (err error)\n//sys\tTee(rfd int, wfd int, len int, flags int) (n int64, err error)\n//sysnb\tTgkill(tgid int, tid int, sig syscall.Signal) (err error)\n//sysnb\tTimes(tms *Tms) (ticks uintptr, err error)\n//sysnb\tUmask(mask int) (oldmask int)\n//sysnb\tUname(buf *Utsname) (err error)\n//sys\tUnmount(target string, flags int) (err error) = SYS_UMOUNT2\n//sys\tUnshare(flags int) (err error)\n//sys\tUstat(dev int, ubuf *Ustat_t) (err error)\n//sys\twrite(fd int, p []byte) (n int, err error)\n//sys\texitThread(code int) (err error) = SYS_EXIT\n//sys\treadlen(fd int, p *byte, np int) (n int, err error) = SYS_READ\n//sys\twritelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE\n\n// mmap varies by architecture; see syscall_linux_*.go.\n//sys\tmunmap(addr uintptr, length uintptr) (err error)\n\nvar mapper = &mmapper{\n\tactive: make(map[*byte][]byte),\n\tmmap:   mmap,\n\tmunmap: munmap,\n}\n\nfunc Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {\n\treturn mapper.Mmap(fd, offset, length, prot, flags)\n}\n\nfunc Munmap(b []byte) (err error) {\n\treturn mapper.Munmap(b)\n}\n\n//sys\tMadvise(b []byte, advice int) (err error)\n//sys\tMprotect(b []byte, prot int) (err error)\n//sys\tMlock(b []byte) (err error)\n//sys\tMlockall(flags int) (err error)\n//sys\tMsync(b []byte, flags int) (err error)\n//sys\tMunlock(b []byte) (err error)\n//sys\tMunlockall() (err error)\n\n// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd,\n// using the specified flags.\nfunc Vmsplice(fd int, iovs []Iovec, flags int) (int, error) {\n\tn, _, errno := Syscall6(\n\t\tSYS_VMSPLICE,\n\t\tuintptr(fd),\n\t\tuintptr(unsafe.Pointer(&iovs[0])),\n\t\tuintptr(len(iovs)),\n\t\tuintptr(flags),\n\t\t0,\n\t\t0,\n\t)\n\tif errno != 0 {\n\t\treturn 0, syscall.Errno(errno)\n\t}\n\n\treturn int(n), nil\n}\n\n/*\n * Unimplemented\n */\n// AfsSyscall\n// Alarm\n// ArchPrctl\n// Brk\n// Capget\n// Capset\n// ClockGetres\n// ClockNanosleep\n// ClockSettime\n// Clone\n// CreateModule\n// DeleteModule\n// EpollCtlOld\n// EpollPwait\n// EpollWaitOld\n// Execve\n// Fgetxattr\n// Flistxattr\n// Fork\n// Fremovexattr\n// Fsetxattr\n// Futex\n// GetKernelSyms\n// GetMempolicy\n// GetRobustList\n// GetThreadArea\n// Getitimer\n// Getpmsg\n// IoCancel\n// IoDestroy\n// IoGetevents\n// IoSetup\n// IoSubmit\n// IoprioGet\n// IoprioSet\n// KexecLoad\n// LookupDcookie\n// Mbind\n// MigratePages\n// Mincore\n// ModifyLdt\n// Mount\n// MovePages\n// MqGetsetattr\n// MqNotify\n// MqOpen\n// MqTimedreceive\n// MqTimedsend\n// MqUnlink\n// Mremap\n// Msgctl\n// Msgget\n// Msgrcv\n// Msgsnd\n// Newfstatat\n// Nfsservctl\n// Personality\n// Pselect6\n// Ptrace\n// Putpmsg\n// QueryModule\n// Quotactl\n// Readahead\n// Readv\n// RemapFilePages\n// RestartSyscall\n// RtSigaction\n// RtSigpending\n// RtSigprocmask\n// RtSigqueueinfo\n// RtSigreturn\n// RtSigsuspend\n// RtSigtimedwait\n// SchedGetPriorityMax\n// SchedGetPriorityMin\n// SchedGetaffinity\n// SchedGetparam\n// SchedGetscheduler\n// SchedRrGetInterval\n// SchedSetaffinity\n// SchedSetparam\n// SchedYield\n// Security\n// Semctl\n// Semget\n// Semop\n// Semtimedop\n// SetMempolicy\n// SetRobustList\n// SetThreadArea\n// SetTidAddress\n// Shmat\n// Shmctl\n// Shmdt\n// Shmget\n// Sigaltstack\n// Signalfd\n// Swapoff\n// Swapon\n// Sysfs\n// TimerCreate\n// TimerDelete\n// TimerGetoverrun\n// TimerGettime\n// TimerSettime\n// Timerfd\n// Tkill (obsolete)\n// Tuxcall\n// Umount2\n// Uselib\n// Utimensat\n// Vfork\n// Vhangup\n// Vserver\n// Waitid\n// _Sysctl\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_386.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP)\n// so that go vet can check that they are correct.\n\n// +build 386,linux\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: int32(sec), Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: int32(sec), Usec: int32(usec)}\n}\n\n//sysnb\tpipe(p *[2]_C_int) (err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe(&pp)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n// 64-bit file system and 32-bit uid calls\n// (386 default is 32-bit file system and 16-bit uid).\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tFadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64\n//sys\tFchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32\n//sys\tFstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64\n//sys\tFtruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64\n//sysnb\tGetegid() (egid int) = SYS_GETEGID32\n//sysnb\tGeteuid() (euid int) = SYS_GETEUID32\n//sysnb\tGetgid() (gid int) = SYS_GETGID32\n//sysnb\tGetuid() (uid int) = SYS_GETUID32\n//sysnb\tInotifyInit() (fd int, err error)\n//sys\tIoperm(from int, num int, on int) (err error)\n//sys\tIopl(level int) (err error)\n//sys\tLchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32\n//sys\tLstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64\n//sys\tSetfsgid(gid int) (err error) = SYS_SETFSGID32\n//sys\tSetfsuid(uid int) (err error) = SYS_SETFSUID32\n//sysnb\tSetregid(rgid int, egid int) (err error) = SYS_SETREGID32\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32\n//sysnb\tSetreuid(ruid int, euid int) (err error) = SYS_SETREUID32\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)\n//sys\tStat(path string, stat *Stat_t) (err error) = SYS_STAT64\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error)\n//sys\tTruncate(path string, length int64) (err error) = SYS_TRUNCATE64\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32\n//sys\tSelect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT\n\n//sys\tmmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tPause() (err error)\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tpage := uintptr(offset / 4096)\n\tif offset != int64(page)*4096 {\n\t\treturn 0, EINVAL\n\t}\n\treturn mmap2(addr, length, prot, flags, fd, page)\n}\n\ntype rlimit32 struct {\n\tCur uint32\n\tMax uint32\n}\n\n//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT\n\nconst rlimInf32 = ^uint32(0)\nconst rlimInf64 = ^uint64(0)\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\terr = prlimit(0, resource, nil, rlim)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\n\trl := rlimit32{}\n\terr = getrlimit(resource, &rl)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif rl.Cur == rlimInf32 {\n\t\trlim.Cur = rlimInf64\n\t} else {\n\t\trlim.Cur = uint64(rl.Cur)\n\t}\n\n\tif rl.Max == rlimInf32 {\n\t\trlim.Max = rlimInf64\n\t} else {\n\t\trlim.Max = uint64(rl.Max)\n\t}\n\treturn\n}\n\n//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\terr = prlimit(0, resource, rlim, nil)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\n\trl := rlimit32{}\n\tif rlim.Cur == rlimInf64 {\n\t\trl.Cur = rlimInf32\n\t} else if rlim.Cur < uint64(rlimInf32) {\n\t\trl.Cur = uint32(rlim.Cur)\n\t} else {\n\t\treturn EINVAL\n\t}\n\tif rlim.Max == rlimInf64 {\n\t\trl.Max = rlimInf32\n\t} else if rlim.Max < uint64(rlimInf32) {\n\t\trl.Max = uint32(rlim.Max)\n\t} else {\n\t\treturn EINVAL\n\t}\n\n\treturn setrlimit(resource, &rl)\n}\n\n// Underlying system call writes to newoffset via pointer.\n// Implemented in assembly to avoid allocation.\nfunc seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tnewoffset, errno := seek(fd, offset, whence)\n\tif errno != 0 {\n\t\treturn 0, errno\n\t}\n\treturn newoffset, nil\n}\n\n// Vsyscalls on amd64.\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tTime(t *Time_t) (tt Time_t, err error)\n\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n\n// On x86 Linux, all the socket calls go through an extra indirection,\n// I think because the 5-register system call interface can't handle\n// the 6-argument calls like sendto and recvfrom. Instead the\n// arguments to the underlying system call are the number below\n// and a pointer to an array of uintptr. We hide the pointer in the\n// socketcall assembly to avoid allocation on every system call.\n\nconst (\n\t// see linux/net.h\n\t_SOCKET      = 1\n\t_BIND        = 2\n\t_CONNECT     = 3\n\t_LISTEN      = 4\n\t_ACCEPT      = 5\n\t_GETSOCKNAME = 6\n\t_GETPEERNAME = 7\n\t_SOCKETPAIR  = 8\n\t_SEND        = 9\n\t_RECV        = 10\n\t_SENDTO      = 11\n\t_RECVFROM    = 12\n\t_SHUTDOWN    = 13\n\t_SETSOCKOPT  = 14\n\t_GETSOCKOPT  = 15\n\t_SENDMSG     = 16\n\t_RECVMSG     = 17\n\t_ACCEPT4     = 18\n\t_RECVMMSG    = 19\n\t_SENDMMSG    = 20\n)\n\nfunc socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno)\nfunc rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno)\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tfd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tfd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {\n\t_, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tfd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar base uintptr\n\tif len(p) > 0 {\n\t\tbase = uintptr(unsafe.Pointer(&p[0]))\n\t}\n\tn, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar base uintptr\n\tif len(p) > 0 {\n\t\tbase = uintptr(unsafe.Pointer(&p[0]))\n\t}\n\t_, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tn, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tn, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc Listen(s int, n int) (err error) {\n\t_, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc Shutdown(s, how int) (err error) {\n\t_, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0)\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tpathp, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_amd64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,linux\n\npackage unix\n\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tFadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatfs(fd int, buf *Statfs_t) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (euid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tGetuid() (uid int)\n//sysnb\tInotifyInit() (fd int, err error)\n//sys\tIoperm(from int, num int, on int) (err error)\n//sys\tIopl(level int) (err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tListen(s int, n int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tPause() (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tSeek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK\n//sys\tSelect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error)\n//sys\tSetfsgid(gid int) (err error)\n//sys\tSetfsuid(uid int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sys\tShutdown(fd int, how int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatfs(path string, buf *Statfs_t) (err error)\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\taccept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error)\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sysnb\tsocketpair(domain int, typ int, proto int, fd *[2]int32) (err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tmmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\terrno := gettimeofday(tv)\n\tif errno != 0 {\n\t\treturn errno\n\t}\n\treturn nil\n}\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tvar tv Timeval\n\terrno := gettimeofday(&tv)\n\tif errno != 0 {\n\t\treturn 0, errno\n\t}\n\tif t != nil {\n\t\t*t = Time_t(tv.Sec)\n\t}\n\treturn Time_t(tv.Sec), nil\n}\n\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\n//sysnb\tpipe(p *[2]_C_int) (err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe(&pp)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return r.Rip }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint64(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint64(length)\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,linux\n// +build !gccgo\n\npackage unix\n\nimport \"syscall\"\n\n//go:noescape\nfunc gettimeofday(tv *Timeval) (err syscall.Errno)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_arm.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build arm,linux\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: int32(sec), Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: int32(sec), Usec: int32(usec)}\n}\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, 0)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n// Underlying system call writes to newoffset via pointer.\n// Implemented in assembly to avoid allocation.\nfunc seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tnewoffset, errno := seek(fd, offset, whence)\n\tif errno != 0 {\n\t\treturn 0, errno\n\t}\n\treturn newoffset, nil\n}\n\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\taccept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tsocketpair(domain int, typ int, flags int, fd *[2]int32) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n\n// 64-bit file system and 32-bit uid calls\n// (16-bit uid calls are not always supported in newer kernels)\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32\n//sys\tFstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64\n//sysnb\tGetegid() (egid int) = SYS_GETEGID32\n//sysnb\tGeteuid() (euid int) = SYS_GETEUID32\n//sysnb\tGetgid() (gid int) = SYS_GETGID32\n//sysnb\tGetuid() (uid int) = SYS_GETUID32\n//sysnb\tInotifyInit() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32\n//sys\tListen(s int, n int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64\n//sys\tSelect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT\n//sys\tSetfsgid(gid int) (err error) = SYS_SETFSGID32\n//sys\tSetfsuid(uid int) (err error) = SYS_SETFSUID32\n//sysnb\tSetregid(rgid int, egid int) (err error) = SYS_SETREGID32\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32\n//sysnb\tSetreuid(ruid int, euid int) (err error) = SYS_SETREUID32\n//sys\tShutdown(fd int, how int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)\n//sys\tStat(path string, stat *Stat_t) (err error) = SYS_STAT64\n\n// Vsyscalls on amd64.\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tPause() (err error)\n\nfunc Time(t *Time_t) (Time_t, error) {\n\tvar tv Timeval\n\terr := Gettimeofday(&tv)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif t != nil {\n\t\t*t = Time_t(tv.Sec)\n\t}\n\treturn Time_t(tv.Sec), nil\n}\n\nfunc Utime(path string, buf *Utimbuf) error {\n\ttv := []Timeval{\n\t\t{Sec: buf.Actime},\n\t\t{Sec: buf.Modtime},\n\t}\n\treturn Utimes(path, tv)\n}\n\n//sys   Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys   Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tTruncate(path string, length int64) (err error) = SYS_TRUNCATE64\n//sys\tFtruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64\n\nfunc Fadvise(fd int, offset int64, length int64, advice int) (err error) {\n\t_, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n//sys\tmmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tpathp, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))\n\tif e != 0 {\n\t\terr = e\n\t}\n\treturn\n}\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tpage := uintptr(offset / 4096)\n\tif offset != int64(page)*4096 {\n\t\treturn 0, EINVAL\n\t}\n\treturn mmap2(addr, length, prot, flags, fd, page)\n}\n\ntype rlimit32 struct {\n\tCur uint32\n\tMax uint32\n}\n\n//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT\n\nconst rlimInf32 = ^uint32(0)\nconst rlimInf64 = ^uint64(0)\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\terr = prlimit(0, resource, nil, rlim)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\n\trl := rlimit32{}\n\terr = getrlimit(resource, &rl)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif rl.Cur == rlimInf32 {\n\t\trlim.Cur = rlimInf64\n\t} else {\n\t\trlim.Cur = uint64(rl.Cur)\n\t}\n\n\tif rl.Max == rlimInf32 {\n\t\trlim.Max = rlimInf64\n\t} else {\n\t\trlim.Max = uint64(rl.Max)\n\t}\n\treturn\n}\n\n//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\terr = prlimit(0, resource, rlim, nil)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\n\trl := rlimit32{}\n\tif rlim.Cur == rlimInf64 {\n\t\trl.Cur = rlimInf32\n\t} else if rlim.Cur < uint64(rlimInf32) {\n\t\trl.Cur = uint32(rlim.Cur)\n\t} else {\n\t\treturn EINVAL\n\t}\n\tif rlim.Max == rlimInf64 {\n\t\trl.Max = rlimInf32\n\t} else if rlim.Max < uint64(rlimInf32) {\n\t\trl.Max = uint32(rlim.Max)\n\t} else {\n\t\treturn EINVAL\n\t}\n\n\treturn setrlimit(resource, &rl)\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_arm64.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build arm64,linux\n\npackage unix\n\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatat(fd int, path string, stat *Stat_t, flags int) (err error)\n//sys\tFstatfs(fd int, buf *Statfs_t) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (euid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tGetuid() (uid int)\n//sys\tListen(s int, n int) (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tSeek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}\n\treturn Pselect(nfd, r, w, e, &ts, nil)\n}\n\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error)\n//sys\tSetfsgid(gid int) (err error)\n//sys\tSetfsuid(uid int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sys\tShutdown(fd int, how int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\treturn Fstatat(AT_FDCWD, path, stat, 0)\n}\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\treturn Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW)\n}\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\treturn Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW)\n}\n\n//sys\tStatfs(path string, buf *Statfs_t) (err error)\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\taccept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error)\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sysnb\tsocketpair(domain int, typ int, proto int, fd *[2]int32) (err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tmmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)\n\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\nfunc Time(t *Time_t) (Time_t, error) {\n\tvar tv Timeval\n\terr := Gettimeofday(&tv)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif t != nil {\n\t\t*t = Time_t(tv.Sec)\n\t}\n\treturn Time_t(tv.Sec), nil\n}\n\nfunc Utime(path string, buf *Utimbuf) error {\n\ttv := []Timeval{\n\t\t{Sec: buf.Actime},\n\t\t{Sec: buf.Modtime},\n\t}\n\treturn Utimes(path, tv)\n}\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, 0)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return r.Pc }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint64(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint64(length)\n}\n\nfunc InotifyInit() (fd int, err error) {\n\treturn InotifyInit1(0)\n}\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\treturn Dup3(oldfd, newfd, 0)\n}\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove\n// these when the deprecated syscalls that the syscall package relies on\n// are removed.\nconst (\n\tSYS_GETPGRP      = 1060\n\tSYS_UTIMES       = 1037\n\tSYS_FUTIMESAT    = 1066\n\tSYS_PAUSE        = 1061\n\tSYS_USTAT        = 1070\n\tSYS_UTIME        = 1063\n\tSYS_LCHOWN       = 1032\n\tSYS_TIME         = 1062\n\tSYS_EPOLL_CREATE = 1042\n\tSYS_EPOLL_WAIT   = 1069\n)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tvar ts *Timespec\n\tif timeout >= 0 {\n\t\tts = new(Timespec)\n\t\t*ts = NsecToTimespec(int64(timeout) * 1e6)\n\t}\n\tif len(fds) == 0 {\n\t\treturn ppoll(nil, 0, ts, nil)\n\t}\n\treturn ppoll(&fds[0], len(fds), ts, nil)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux\n// +build mips64 mips64le\n\npackage unix\n\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFstatfs(fd int, buf *Statfs_t) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (euid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tGetuid() (uid int)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tListen(s int, n int) (err error)\n//sys\tPause() (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tSeek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tts := Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}\n\treturn Pselect(nfd, r, w, e, &ts, nil)\n}\n\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error)\n//sys\tSetfsgid(gid int) (err error)\n//sys\tSetfsuid(uid int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sys\tShutdown(fd int, how int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)\n//sys\tStatfs(path string, buf *Statfs_t) (err error)\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\taccept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error)\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sysnb\tsocketpair(domain int, typ int, proto int, fd *[2]int32) (err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tmmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)\n\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tvar tv Timeval\n\terr = Gettimeofday(&tv)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif t != nil {\n\t\t*t = Time_t(tv.Sec)\n\t}\n\treturn Time_t(tv.Sec), nil\n}\n\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, 0)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\treturn ENOSYS\n}\n\nfunc Iopl(level int) (err error) {\n\treturn ENOSYS\n}\n\ntype stat_t struct {\n\tDev        uint32\n\tPad0       [3]int32\n\tIno        uint64\n\tMode       uint32\n\tNlink      uint32\n\tUid        uint32\n\tGid        uint32\n\tRdev       uint32\n\tPad1       [3]uint32\n\tSize       int64\n\tAtime      uint32\n\tAtime_nsec uint32\n\tMtime      uint32\n\tMtime_nsec uint32\n\tCtime      uint32\n\tCtime_nsec uint32\n\tBlksize    uint32\n\tPad2       uint32\n\tBlocks     int64\n}\n\n//sys\tfstat(fd int, st *stat_t) (err error)\n//sys\tlstat(path string, st *stat_t) (err error)\n//sys\tstat(path string, st *stat_t) (err error)\n\nfunc Fstat(fd int, s *Stat_t) (err error) {\n\tst := &stat_t{}\n\terr = fstat(fd, st)\n\tfillStat_t(s, st)\n\treturn\n}\n\nfunc Lstat(path string, s *Stat_t) (err error) {\n\tst := &stat_t{}\n\terr = lstat(path, st)\n\tfillStat_t(s, st)\n\treturn\n}\n\nfunc Stat(path string, s *Stat_t) (err error) {\n\tst := &stat_t{}\n\terr = stat(path, st)\n\tfillStat_t(s, st)\n\treturn\n}\n\nfunc fillStat_t(s *Stat_t, st *stat_t) {\n\ts.Dev = st.Dev\n\ts.Ino = st.Ino\n\ts.Mode = st.Mode\n\ts.Nlink = st.Nlink\n\ts.Uid = st.Uid\n\ts.Gid = st.Gid\n\ts.Rdev = st.Rdev\n\ts.Size = st.Size\n\ts.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)}\n\ts.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)}\n\ts.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)}\n\ts.Blksize = st.Blksize\n\ts.Blocks = st.Blocks\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return r.Epc }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint64(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint64(length)\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux\n// +build mips mipsle\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nfunc Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFtruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (euid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetuid() (uid int)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tListen(s int, n int) (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tSelect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64\n//sys\tSetfsgid(gid int) (err error)\n//sys\tSetfsuid(uid int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sys\tShutdown(fd int, how int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)\n\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error)\n//sys\tTruncate(path string, length int64) (err error) = SYS_TRUNCATE64\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\taccept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error)\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sysnb\tsocketpair(domain int, typ int, proto int, fd *[2]int32) (err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n\n//sysnb\tInotifyInit() (fd int, err error)\n//sys\tIoperm(from int, num int, on int) (err error)\n//sys\tIopl(level int) (err error)\n\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tTime(t *Time_t) (tt Time_t, err error)\n\n//sys\tLstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64\n//sys\tFstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64\n//sys\tStat(path string, stat *Stat_t) (err error) = SYS_STAT64\n\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tPause() (err error)\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))\n\tif e != 0 {\n\t\terr = errnoErr(e)\n\t}\n\treturn\n}\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tp, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\t_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))\n\tif e != 0 {\n\t\terr = errnoErr(e)\n\t}\n\treturn\n}\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\t_, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0)\n\tif e != 0 {\n\t\terr = errnoErr(e)\n\t}\n\treturn\n}\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: int32(sec), Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: int32(sec), Usec: int32(usec)}\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, 0)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sys\tmmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tpage := uintptr(offset / 4096)\n\tif offset != int64(page)*4096 {\n\t\treturn 0, EINVAL\n\t}\n\treturn mmap2(addr, length, prot, flags, fd, page)\n}\n\nconst rlimInf32 = ^uint32(0)\nconst rlimInf64 = ^uint64(0)\n\ntype rlimit32 struct {\n\tCur uint32\n\tMax uint32\n}\n\n//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\terr = prlimit(0, resource, nil, rlim)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\n\trl := rlimit32{}\n\terr = getrlimit(resource, &rl)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tif rl.Cur == rlimInf32 {\n\t\trlim.Cur = rlimInf64\n\t} else {\n\t\trlim.Cur = uint64(rl.Cur)\n\t}\n\n\tif rl.Max == rlimInf32 {\n\t\trlim.Max = rlimInf64\n\t} else {\n\t\trlim.Max = uint64(rl.Max)\n\t}\n\treturn\n}\n\n//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\terr = prlimit(0, resource, rlim, nil)\n\tif err != ENOSYS {\n\t\treturn err\n\t}\n\n\trl := rlimit32{}\n\tif rlim.Cur == rlimInf64 {\n\t\trl.Cur = rlimInf32\n\t} else if rlim.Cur < uint64(rlimInf32) {\n\t\trl.Cur = uint32(rlim.Cur)\n\t} else {\n\t\treturn EINVAL\n\t}\n\tif rlim.Max == rlimInf64 {\n\t\trl.Max = rlimInf32\n\t} else if rlim.Max < uint64(rlimInf32) {\n\t\trl.Max = uint32(rlim.Max)\n\t} else {\n\t\treturn EINVAL\n\t}\n\n\treturn setrlimit(resource, &rl)\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return r.Epc }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux\n// +build ppc64 ppc64le\n\npackage unix\n\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatfs(fd int, buf *Statfs_t) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (euid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT\n//sysnb\tGetuid() (uid int)\n//sysnb\tInotifyInit() (fd int, err error)\n//sys\tIoperm(from int, num int, on int) (err error)\n//sys\tIopl(level int) (err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tListen(s int, n int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tPause() (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tSeek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK\n//sys\tSelect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error)\n//sys\tSetfsgid(gid int) (err error)\n//sys\tSetfsuid(uid int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sys\tShutdown(fd int, how int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatfs(path string, buf *Statfs_t) (err error)\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE2\n//sys\tTruncate(path string, length int64) (err error)\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\taccept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error)\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sysnb\tsocketpair(domain int, typ int, proto int, fd *[2]int32) (err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tmmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)\n\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tTime(t *Time_t) (tt Time_t, err error)\n\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return r.Nip }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint64(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint64(length)\n}\n\n//sysnb pipe(p *[2]_C_int) (err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe(&pp)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_s390x.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build s390x,linux\n\npackage unix\n\nimport (\n\t\"unsafe\"\n)\n\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tFadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatfs(fd int, buf *Statfs_t) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (euid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tGetuid() (uid int)\n//sysnb\tInotifyInit() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tPause() (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tSeek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK\n//sys\tSelect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error)\n//sys\tSetfsgid(gid int) (err error)\n//sys\tSetfsuid(uid int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatfs(path string, buf *Statfs_t) (err error)\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error)\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error)\n\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tvar tv Timeval\n\terr = Gettimeofday(&tv)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif t != nil {\n\t\t*t = Time_t(tv.Sec)\n\t}\n\treturn Time_t(tv.Sec), nil\n}\n\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0.\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\treturn ENOSYS\n}\n\nfunc Iopl(level int) (err error) {\n\treturn ENOSYS\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint64(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint64(length)\n}\n\n// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.\n// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tmmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}\n\tr0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// On s390x Linux, all the socket calls go through an extra indirection.\n// The arguments to the underlying system call (SYS_SOCKETCALL) are the\n// number below and a pointer to an array of uintptr.\nconst (\n\t// see linux/net.h\n\tnetSocket      = 1\n\tnetBind        = 2\n\tnetConnect     = 3\n\tnetListen      = 4\n\tnetAccept      = 5\n\tnetGetSockName = 6\n\tnetGetPeerName = 7\n\tnetSocketPair  = 8\n\tnetSend        = 9\n\tnetRecv        = 10\n\tnetSendTo      = 11\n\tnetRecvFrom    = 12\n\tnetShutdown    = 13\n\tnetSetSockOpt  = 14\n\tnetGetSockOpt  = 15\n\tnetSendMsg     = 16\n\tnetRecvMsg     = 17\n\tnetAccept4     = 18\n\tnetRecvMMsg    = 19\n\tnetSendMMsg    = 20\n)\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) {\n\targs := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}\n\tfd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn 0, err\n\t}\n\treturn int(fd), nil\n}\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) {\n\targs := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)}\n\tfd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn 0, err\n\t}\n\treturn int(fd), nil\n}\n\nfunc getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {\n\targs := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}\n\t_, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {\n\targs := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}\n\t_, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc socketpair(domain int, typ int, flags int, fd *[2]int32) error {\n\targs := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))}\n\t_, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) error {\n\targs := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}\n\t_, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) error {\n\targs := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}\n\t_, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc socket(domain int, typ int, proto int) (int, error) {\n\targs := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)}\n\tfd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn 0, err\n\t}\n\treturn int(fd), nil\n}\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error {\n\targs := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))}\n\t_, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error {\n\targs := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)}\n\t_, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) {\n\tvar base uintptr\n\tif len(p) > 0 {\n\t\tbase = uintptr(unsafe.Pointer(&p[0]))\n\t}\n\targs := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))}\n\tn, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn 0, err\n\t}\n\treturn int(n), nil\n}\n\nfunc sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error {\n\tvar base uintptr\n\tif len(p) > 0 {\n\t\tbase = uintptr(unsafe.Pointer(&p[0]))\n\t}\n\targs := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)}\n\t_, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (int, error) {\n\targs := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}\n\tn, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn 0, err\n\t}\n\treturn int(n), nil\n}\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (int, error) {\n\targs := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}\n\tn, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn 0, err\n\t}\n\treturn int(n), nil\n}\n\nfunc Listen(s int, n int) error {\n\targs := [2]uintptr{uintptr(s), uintptr(n)}\n\t_, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc Shutdown(s, how int) error {\n\targs := [2]uintptr{uintptr(s), uintptr(how)}\n\t_, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0)\n\tif err != 0 {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build sparc64,linux\n\npackage unix\n\n//sys\tEpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatfs(fd int, buf *Statfs_t) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (euid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tGetuid() (uid int)\n//sysnb\tInotifyInit() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tListen(s int, n int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tPause() (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64\n//sys\tSeek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK\n//sys\tSelect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)\n//sys\tsendfile(outfd int, infd int, offset *int64, count int) (written int, err error)\n//sys\tSetfsgid(gid int) (err error)\n//sys\tSetfsuid(uid int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(resource int, rlim *Rlimit) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sys\tShutdown(fd int, how int) (err error)\n//sys\tSplice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatfs(path string, buf *Statfs_t) (err error)\n//sys\tSyncFileRange(fd int, off int64, n int64, flags int) (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)\n//sys\taccept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)\n//sysnb\tgetgroups(n int, list *_Gid_t) (nn int, err error)\n//sysnb\tsetgroups(n int, list *_Gid_t) (err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)\n//sysnb\tsocket(domain int, typ int, proto int) (fd int, err error)\n//sysnb\tsocketpair(domain int, typ int, proto int, fd *[2]int32) (err error)\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sysnb\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error)\n//sys\tmmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\treturn ENOSYS\n}\n\nfunc Iopl(level int) (err error) {\n\treturn ENOSYS\n}\n\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tvar tv Timeval\n\terr = Gettimeofday(&tv)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif t != nil {\n\t\t*t = Time_t(tv.Sec)\n\t}\n\treturn Time_t(tv.Sec), nil\n}\n\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\nfunc (r *PtraceRegs) PC() uint64 { return r.Tpc }\n\nfunc (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc }\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint64(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint64(length)\n}\n\n//sysnb pipe(p *[2]_C_int) (err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe(&pp)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sysnb pipe2(p *[2]_C_int, flags int) (err error)\n\nfunc Pipe2(p []int, flags int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe2(&pp, flags)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sys\tpoll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_netbsd.go",
    "content": "// Copyright 2009,2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// NetBSD system calls.\n// This file is compiled as ordinary Go code,\n// but it is also input to mksyscall,\n// which parses the //sys lines and generates system call stubs.\n// Note that sometimes we use a lowercase //sys name and wrap\n// it in our own nicer implementation, either here or in\n// syscall_bsd.go or syscall_unix.go.\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\ntype SockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n\traw    RawSockaddrDatalink\n}\n\nfunc Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n\nfunc sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {\n\tvar olen uintptr\n\n\t// Get a list of all sysctl nodes below the given MIB by performing\n\t// a sysctl for the given MIB with CTL_QUERY appended.\n\tmib = append(mib, CTL_QUERY)\n\tqnode := Sysctlnode{Flags: SYSCTL_VERS_1}\n\tqp := (*byte)(unsafe.Pointer(&qnode))\n\tsz := unsafe.Sizeof(qnode)\n\tif err = sysctl(mib, nil, &olen, qp, sz); err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Now that we know the size, get the actual nodes.\n\tnodes = make([]Sysctlnode, olen/sz)\n\tnp := (*byte)(unsafe.Pointer(&nodes[0]))\n\tif err = sysctl(mib, np, &olen, qp, sz); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn nodes, nil\n}\n\nfunc nametomib(name string) (mib []_C_int, err error) {\n\t// Split name into components.\n\tvar parts []string\n\tlast := 0\n\tfor i := 0; i < len(name); i++ {\n\t\tif name[i] == '.' {\n\t\t\tparts = append(parts, name[last:i])\n\t\t\tlast = i + 1\n\t\t}\n\t}\n\tparts = append(parts, name[last:])\n\n\t// Discover the nodes and construct the MIB OID.\n\tfor partno, part := range parts {\n\t\tnodes, err := sysctlNodes(mib)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tfor _, node := range nodes {\n\t\t\tn := make([]byte, 0)\n\t\t\tfor i := range node.Name {\n\t\t\t\tif node.Name[i] != 0 {\n\t\t\t\t\tn = append(n, byte(node.Name[i]))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif string(n) == part {\n\t\t\t\tmib = append(mib, _C_int(node.Num))\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif len(mib) != partno+1 {\n\t\t\treturn nil, EINVAL\n\t\t}\n\t}\n\n\treturn mib, nil\n}\n\nfunc direntIno(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))\n}\n\nfunc direntReclen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))\n}\n\nfunc direntNamlen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))\n}\n\n//sysnb pipe() (fd1 int, fd2 int, err error)\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tp[0], p[1], err = pipe()\n\treturn\n}\n\n//sys getdents(fd int, buf []byte) (n int, err error)\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\treturn getdents(fd, buf)\n}\n\n// TODO\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\treturn -1, ENOSYS\n}\n\nfunc setattrlistTimes(path string, times []Timespec, flags int) error {\n\t// used on Darwin for UtimesNano\n\treturn ENOSYS\n}\n\n//sys\tioctl(fd int, req uint, arg uintptr) (err error)\n\n// ioctl itself should not be exposed directly, but additional get/set\n// functions for specific types are permissible.\n\n// IoctlSetInt performs an ioctl operation which sets an integer value\n// on fd, using the specified request number.\nfunc IoctlSetInt(fd int, req uint, value int) error {\n\treturn ioctl(fd, req, uintptr(value))\n}\n\nfunc IoctlSetWinsize(fd int, req uint, value *Winsize) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermios(fd int, req uint, value *Termios) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\n// IoctlGetInt performs an ioctl operation which gets an integer value\n// from fd, using the specified request number.\nfunc IoctlGetInt(fd int, req uint) (int, error) {\n\tvar value int\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn value, err\n}\n\nfunc IoctlGetWinsize(fd int, req uint) (*Winsize, error) {\n\tvar value Winsize\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermios(fd int, req uint) (*Termios, error) {\n\tvar value Termios\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\n/*\n * Exposed directly\n */\n//sys\tAccess(path string, mode uint32) (err error)\n//sys\tAdjtime(delta *Timeval, olddelta *Timeval) (err error)\n//sys\tChdir(path string) (err error)\n//sys\tChflags(path string, flags int) (err error)\n//sys\tChmod(path string, mode uint32) (err error)\n//sys\tChown(path string, uid int, gid int) (err error)\n//sys\tChroot(path string) (err error)\n//sys\tClose(fd int) (err error)\n//sys\tDup(fd int) (nfd int, err error)\n//sys\tDup2(from int, to int) (err error)\n//sys\tExit(code int)\n//sys\tFchdir(fd int) (err error)\n//sys\tFchflags(fd int, flags int) (err error)\n//sys\tFchmod(fd int, mode uint32) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFlock(fd int, how int) (err error)\n//sys\tFpathconf(fd int, name int) (val int, err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFsync(fd int) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (uid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetpgid(pid int) (pgid int, err error)\n//sysnb\tGetpgrp() (pgrp int)\n//sysnb\tGetpid() (pid int)\n//sysnb\tGetppid() (ppid int)\n//sys\tGetpriority(which int, who int) (prio int, err error)\n//sysnb\tGetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tGetrusage(who int, rusage *Rusage) (err error)\n//sysnb\tGetsid(pid int) (sid int, err error)\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tGetuid() (uid int)\n//sys\tIssetugid() (tainted bool)\n//sys\tKill(pid int, signum syscall.Signal) (err error)\n//sys\tKqueue() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tLink(path string, link string) (err error)\n//sys\tListen(s int, backlog int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tMkdir(path string, mode uint32) (err error)\n//sys\tMkfifo(path string, mode uint32) (err error)\n//sys\tMknod(path string, mode uint32, dev int) (err error)\n//sys\tNanosleep(time *Timespec, leftover *Timespec) (err error)\n//sys\tOpen(path string, mode int, perm uint32) (fd int, err error)\n//sys\tPathconf(path string, name int) (val int, err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error)\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error)\n//sys\tread(fd int, p []byte) (n int, err error)\n//sys\tReadlink(path string, buf []byte) (n int, err error)\n//sys\tRename(from string, to string) (err error)\n//sys\tRevoke(path string) (err error)\n//sys\tRmdir(path string) (err error)\n//sys\tSeek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK\n//sys\tSelect(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)\n//sysnb\tSetegid(egid int) (err error)\n//sysnb\tSeteuid(euid int) (err error)\n//sysnb\tSetgid(gid int) (err error)\n//sysnb\tSetpgid(pid int, pgid int) (err error)\n//sys\tSetpriority(which int, who int, prio int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sysnb\tSetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tSetsid() (pid int, err error)\n//sysnb\tSettimeofday(tp *Timeval) (err error)\n//sysnb\tSetuid(uid int) (err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tSymlink(path string, link string) (err error)\n//sys\tSync() (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\tUmask(newmask int) (oldmask int)\n//sys\tUnlink(path string) (err error)\n//sys\tUnmount(path string, flags int) (err error)\n//sys\twrite(fd int, p []byte) (n int, err error)\n//sys\tmmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)\n//sys\tmunmap(addr uintptr, length uintptr) (err error)\n//sys\treadlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ\n//sys\twritelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE\n//sys\tutimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)\n\n/*\n * Unimplemented\n */\n// ____semctl13\n// __clone\n// __fhopen40\n// __fhstat40\n// __fhstatvfs140\n// __fstat30\n// __getcwd\n// __getfh30\n// __getlogin\n// __lstat30\n// __mount50\n// __msgctl13\n// __msync13\n// __ntp_gettime30\n// __posix_chown\n// __posix_fadvise50\n// __posix_fchown\n// __posix_lchown\n// __posix_rename\n// __setlogin\n// __shmctl13\n// __sigaction_sigtramp\n// __sigaltstack14\n// __sigpending14\n// __sigprocmask14\n// __sigsuspend14\n// __sigtimedwait\n// __stat30\n// __syscall\n// __vfork14\n// _ksem_close\n// _ksem_destroy\n// _ksem_getvalue\n// _ksem_init\n// _ksem_open\n// _ksem_post\n// _ksem_trywait\n// _ksem_unlink\n// _ksem_wait\n// _lwp_continue\n// _lwp_create\n// _lwp_ctl\n// _lwp_detach\n// _lwp_exit\n// _lwp_getname\n// _lwp_getprivate\n// _lwp_kill\n// _lwp_park\n// _lwp_self\n// _lwp_setname\n// _lwp_setprivate\n// _lwp_suspend\n// _lwp_unpark\n// _lwp_unpark_all\n// _lwp_wait\n// _lwp_wakeup\n// _pset_bind\n// _sched_getaffinity\n// _sched_getparam\n// _sched_setaffinity\n// _sched_setparam\n// acct\n// aio_cancel\n// aio_error\n// aio_fsync\n// aio_read\n// aio_return\n// aio_suspend\n// aio_write\n// break\n// clock_getres\n// clock_gettime\n// clock_settime\n// compat_09_ogetdomainname\n// compat_09_osetdomainname\n// compat_09_ouname\n// compat_10_omsgsys\n// compat_10_osemsys\n// compat_10_oshmsys\n// compat_12_fstat12\n// compat_12_getdirentries\n// compat_12_lstat12\n// compat_12_msync\n// compat_12_oreboot\n// compat_12_oswapon\n// compat_12_stat12\n// compat_13_sigaction13\n// compat_13_sigaltstack13\n// compat_13_sigpending13\n// compat_13_sigprocmask13\n// compat_13_sigreturn13\n// compat_13_sigsuspend13\n// compat_14___semctl\n// compat_14_msgctl\n// compat_14_shmctl\n// compat_16___sigaction14\n// compat_16___sigreturn14\n// compat_20_fhstatfs\n// compat_20_fstatfs\n// compat_20_getfsstat\n// compat_20_statfs\n// compat_30___fhstat30\n// compat_30___fstat13\n// compat_30___lstat13\n// compat_30___stat13\n// compat_30_fhopen\n// compat_30_fhstat\n// compat_30_fhstatvfs1\n// compat_30_getdents\n// compat_30_getfh\n// compat_30_ntp_gettime\n// compat_30_socket\n// compat_40_mount\n// compat_43_fstat43\n// compat_43_lstat43\n// compat_43_oaccept\n// compat_43_ocreat\n// compat_43_oftruncate\n// compat_43_ogetdirentries\n// compat_43_ogetdtablesize\n// compat_43_ogethostid\n// compat_43_ogethostname\n// compat_43_ogetkerninfo\n// compat_43_ogetpagesize\n// compat_43_ogetpeername\n// compat_43_ogetrlimit\n// compat_43_ogetsockname\n// compat_43_okillpg\n// compat_43_olseek\n// compat_43_ommap\n// compat_43_oquota\n// compat_43_orecv\n// compat_43_orecvfrom\n// compat_43_orecvmsg\n// compat_43_osend\n// compat_43_osendmsg\n// compat_43_osethostid\n// compat_43_osethostname\n// compat_43_osetrlimit\n// compat_43_osigblock\n// compat_43_osigsetmask\n// compat_43_osigstack\n// compat_43_osigvec\n// compat_43_otruncate\n// compat_43_owait\n// compat_43_stat43\n// execve\n// extattr_delete_fd\n// extattr_delete_file\n// extattr_delete_link\n// extattr_get_fd\n// extattr_get_file\n// extattr_get_link\n// extattr_list_fd\n// extattr_list_file\n// extattr_list_link\n// extattr_set_fd\n// extattr_set_file\n// extattr_set_link\n// extattrctl\n// fchroot\n// fdatasync\n// fgetxattr\n// fktrace\n// flistxattr\n// fork\n// fremovexattr\n// fsetxattr\n// fstatvfs1\n// fsync_range\n// getcontext\n// getitimer\n// getvfsstat\n// getxattr\n// ktrace\n// lchflags\n// lchmod\n// lfs_bmapv\n// lfs_markv\n// lfs_segclean\n// lfs_segwait\n// lgetxattr\n// lio_listio\n// listxattr\n// llistxattr\n// lremovexattr\n// lseek\n// lsetxattr\n// lutimes\n// madvise\n// mincore\n// minherit\n// modctl\n// mq_close\n// mq_getattr\n// mq_notify\n// mq_open\n// mq_receive\n// mq_send\n// mq_setattr\n// mq_timedreceive\n// mq_timedsend\n// mq_unlink\n// mremap\n// msgget\n// msgrcv\n// msgsnd\n// nfssvc\n// ntp_adjtime\n// pmc_control\n// pmc_get_info\n// pollts\n// preadv\n// profil\n// pselect\n// pset_assign\n// pset_create\n// pset_destroy\n// ptrace\n// pwritev\n// quotactl\n// rasctl\n// readv\n// reboot\n// removexattr\n// sa_enable\n// sa_preempt\n// sa_register\n// sa_setconcurrency\n// sa_stacks\n// sa_yield\n// sbrk\n// sched_yield\n// semconfig\n// semget\n// semop\n// setcontext\n// setitimer\n// setxattr\n// shmat\n// shmdt\n// shmget\n// sstk\n// statvfs1\n// swapctl\n// sysarch\n// syscall\n// timer_create\n// timer_delete\n// timer_getoverrun\n// timer_gettime\n// timer_settime\n// undelete\n// utrace\n// uuidgen\n// vadvise\n// vfork\n// writev\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_netbsd_386.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build 386,netbsd\n\npackage unix\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = uint32(mode)\n\tk.Flags = uint32(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,netbsd\n\npackage unix\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint64(fd)\n\tk.Filter = uint32(mode)\n\tk.Flags = uint32(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build arm,netbsd\n\npackage unix\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = uint32(mode)\n\tk.Flags = uint32(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_no_getwd.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build dragonfly freebsd netbsd openbsd\n\npackage unix\n\nconst ImplementsGetwd = false\n\nfunc Getwd() (string, error) { return \"\", ENOTSUP }\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_openbsd.go",
    "content": "// Copyright 2009,2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// OpenBSD system calls.\n// This file is compiled as ordinary Go code,\n// but it is also input to mksyscall,\n// which parses the //sys lines and generates system call stubs.\n// Note that sometimes we use a lowercase //sys name and wrap\n// it in our own nicer implementation, either here or in\n// syscall_bsd.go or syscall_unix.go.\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\ntype SockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [24]int8\n\traw    RawSockaddrDatalink\n}\n\nfunc Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)\n\nfunc nametomib(name string) (mib []_C_int, err error) {\n\t// Perform lookup via a binary search\n\tleft := 0\n\tright := len(sysctlMib) - 1\n\tfor {\n\t\tidx := left + (right-left)/2\n\t\tswitch {\n\t\tcase name == sysctlMib[idx].ctlname:\n\t\t\treturn sysctlMib[idx].ctloid, nil\n\t\tcase name > sysctlMib[idx].ctlname:\n\t\t\tleft = idx + 1\n\t\tdefault:\n\t\t\tright = idx - 1\n\t\t}\n\t\tif left > right {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn nil, EINVAL\n}\n\nfunc direntIno(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))\n}\n\nfunc direntReclen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))\n}\n\nfunc direntNamlen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))\n}\n\n//sysnb pipe(p *[2]_C_int) (err error)\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\terr = pipe(&pp)\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn\n}\n\n//sys getdents(fd int, buf []byte) (n int, err error)\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\treturn getdents(fd, buf)\n}\n\n// TODO\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\treturn -1, ENOSYS\n}\n\nfunc Getfsstat(buf []Statfs_t, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tvar bufsize uintptr\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t\tbufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf))\n\t}\n\tr0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc setattrlistTimes(path string, times []Timespec, flags int) error {\n\t// used on Darwin for UtimesNano\n\treturn ENOSYS\n}\n\n//sys\tioctl(fd int, req uint, arg uintptr) (err error)\n\n// ioctl itself should not be exposed directly, but additional get/set\n// functions for specific types are permissible.\n\n// IoctlSetInt performs an ioctl operation which sets an integer value\n// on fd, using the specified request number.\nfunc IoctlSetInt(fd int, req uint, value int) error {\n\treturn ioctl(fd, req, uintptr(value))\n}\n\nfunc IoctlSetWinsize(fd int, req uint, value *Winsize) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermios(fd int, req uint, value *Termios) error {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\n// IoctlGetInt performs an ioctl operation which gets an integer value\n// from fd, using the specified request number.\nfunc IoctlGetInt(fd int, req uint) (int, error) {\n\tvar value int\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn value, err\n}\n\nfunc IoctlGetWinsize(fd int, req uint) (*Winsize, error) {\n\tvar value Winsize\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermios(fd int, req uint) (*Termios, error) {\n\tvar value Termios\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\n/*\n * Exposed directly\n */\n//sys\tAccess(path string, mode uint32) (err error)\n//sys\tAdjtime(delta *Timeval, olddelta *Timeval) (err error)\n//sys\tChdir(path string) (err error)\n//sys\tChflags(path string, flags int) (err error)\n//sys\tChmod(path string, mode uint32) (err error)\n//sys\tChown(path string, uid int, gid int) (err error)\n//sys\tChroot(path string) (err error)\n//sys\tClose(fd int) (err error)\n//sys\tDup(fd int) (nfd int, err error)\n//sys\tDup2(from int, to int) (err error)\n//sys\tExit(code int)\n//sys\tFchdir(fd int) (err error)\n//sys\tFchflags(fd int, flags int) (err error)\n//sys\tFchmod(fd int, mode uint32) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFlock(fd int, how int) (err error)\n//sys\tFpathconf(fd int, name int) (val int, err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatfs(fd int, stat *Statfs_t) (err error)\n//sys\tFsync(fd int) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sysnb\tGetegid() (egid int)\n//sysnb\tGeteuid() (uid int)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetpgid(pid int) (pgid int, err error)\n//sysnb\tGetpgrp() (pgrp int)\n//sysnb\tGetpid() (pid int)\n//sysnb\tGetppid() (ppid int)\n//sys\tGetpriority(which int, who int) (prio int, err error)\n//sysnb\tGetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tGetrusage(who int, rusage *Rusage) (err error)\n//sysnb\tGetsid(pid int) (sid int, err error)\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tGetuid() (uid int)\n//sys\tIssetugid() (tainted bool)\n//sys\tKill(pid int, signum syscall.Signal) (err error)\n//sys\tKqueue() (fd int, err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tLink(path string, link string) (err error)\n//sys\tListen(s int, backlog int) (err error)\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tMkdir(path string, mode uint32) (err error)\n//sys\tMkfifo(path string, mode uint32) (err error)\n//sys\tMknod(path string, mode uint32, dev int) (err error)\n//sys\tNanosleep(time *Timespec, leftover *Timespec) (err error)\n//sys\tOpen(path string, mode int, perm uint32) (fd int, err error)\n//sys\tPathconf(path string, name int) (val int, err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error)\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error)\n//sys\tread(fd int, p []byte) (n int, err error)\n//sys\tReadlink(path string, buf []byte) (n int, err error)\n//sys\tRename(from string, to string) (err error)\n//sys\tRevoke(path string) (err error)\n//sys\tRmdir(path string) (err error)\n//sys\tSeek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK\n//sys\tSelect(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error)\n//sysnb\tSetegid(egid int) (err error)\n//sysnb\tSeteuid(euid int) (err error)\n//sysnb\tSetgid(gid int) (err error)\n//sys\tSetlogin(name string) (err error)\n//sysnb\tSetpgid(pid int, pgid int) (err error)\n//sys\tSetpriority(which int, who int, prio int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sysnb\tSetresgid(rgid int, egid int, sgid int) (err error)\n//sysnb\tSetresuid(ruid int, euid int, suid int) (err error)\n//sysnb\tSetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tSetsid() (pid int, err error)\n//sysnb\tSettimeofday(tp *Timeval) (err error)\n//sysnb\tSetuid(uid int) (err error)\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatfs(path string, stat *Statfs_t) (err error)\n//sys\tSymlink(path string, link string) (err error)\n//sys\tSync() (err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\tUmask(newmask int) (oldmask int)\n//sys\tUnlink(path string) (err error)\n//sys\tUnmount(path string, flags int) (err error)\n//sys\twrite(fd int, p []byte) (n int, err error)\n//sys\tmmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)\n//sys\tmunmap(addr uintptr, length uintptr) (err error)\n//sys\treadlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ\n//sys\twritelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE\n//sys\tutimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)\n\n/*\n * Unimplemented\n */\n// __getcwd\n// __semctl\n// __syscall\n// __sysctl\n// adjfreq\n// break\n// clock_getres\n// clock_gettime\n// clock_settime\n// closefrom\n// execve\n// faccessat\n// fchmodat\n// fchownat\n// fcntl\n// fhopen\n// fhstat\n// fhstatfs\n// fork\n// fstatat\n// futimens\n// getfh\n// getgid\n// getitimer\n// getlogin\n// getresgid\n// getresuid\n// getrtable\n// getthrid\n// ktrace\n// lfs_bmapv\n// lfs_markv\n// lfs_segclean\n// lfs_segwait\n// linkat\n// mincore\n// minherit\n// mkdirat\n// mkfifoat\n// mknodat\n// mount\n// mquery\n// msgctl\n// msgget\n// msgrcv\n// msgsnd\n// nfssvc\n// nnpfspioctl\n// openat\n// preadv\n// profil\n// pwritev\n// quotactl\n// readlinkat\n// readv\n// reboot\n// renameat\n// rfork\n// sched_yield\n// semget\n// semop\n// setgroups\n// setitimer\n// setrtable\n// setsockopt\n// shmat\n// shmctl\n// shmdt\n// shmget\n// sigaction\n// sigaltstack\n// sigpending\n// sigprocmask\n// sigreturn\n// sigsuspend\n// symlinkat\n// sysarch\n// syscall\n// threxit\n// thrsigdivert\n// thrsleep\n// thrwakeup\n// unlinkat\n// vfork\n// writev\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_openbsd_386.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build 386,openbsd\n\npackage unix\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,openbsd\n\npackage unix\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint64(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build arm,openbsd\n\npackage unix\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: int32(nsec)}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: int32(usec)}\n}\n\nfunc SetKevent(k *Kevent_t, fd, mode, flags int) {\n\tk.Ident = uint32(fd)\n\tk.Filter = int16(mode)\n\tk.Flags = uint16(flags)\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint32(length)\n}\n\nfunc (msghdr *Msghdr) SetControllen(length int) {\n\tmsghdr.Controllen = uint32(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_solaris.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Solaris system calls.\n// This file is compiled as ordinary Go code,\n// but it is also input to mksyscall,\n// which parses the //sys lines and generates system call stubs.\n// Note that sometimes we use a lowercase //sys name and wrap\n// it in our own nicer implementation, either here or in\n// syscall_solaris.go or syscall_unix.go.\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n// Implemented in runtime/syscall_solaris.go.\ntype syscallFunc uintptr\n\nfunc rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)\nfunc sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)\n\ntype SockaddrDatalink struct {\n\tFamily uint16\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [244]int8\n\traw    RawSockaddrDatalink\n}\n\nfunc clen(n []byte) int {\n\tfor i := 0; i < len(n); i++ {\n\t\tif n[i] == 0 {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn len(n)\n}\n\nfunc direntIno(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))\n}\n\nfunc direntReclen(buf []byte) (uint64, bool) {\n\treturn readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))\n}\n\nfunc direntNamlen(buf []byte) (uint64, bool) {\n\treclen, ok := direntReclen(buf)\n\tif !ok {\n\t\treturn 0, false\n\t}\n\treturn reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true\n}\n\n//sysnb\tpipe(p *[2]_C_int) (n int, err error)\n\nfunc Pipe(p []int) (err error) {\n\tif len(p) != 2 {\n\t\treturn EINVAL\n\t}\n\tvar pp [2]_C_int\n\tn, err := pipe(&pp)\n\tif n != 0 {\n\t\treturn err\n\t}\n\tp[0] = int(pp[0])\n\tp[1] = int(pp[1])\n\treturn nil\n}\n\nfunc (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_INET\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil\n}\n\nfunc (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_INET6\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tsa.raw.Scope_id = sa.ZoneId\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil\n}\n\nfunc (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {\n\tname := sa.Name\n\tn := len(name)\n\tif n >= len(sa.raw.Path) {\n\t\treturn nil, 0, EINVAL\n\t}\n\tsa.raw.Family = AF_UNIX\n\tfor i := 0; i < n; i++ {\n\t\tsa.raw.Path[i] = int8(name[i])\n\t}\n\t// length is family (uint16), name, NUL.\n\tsl := _Socklen(2)\n\tif n > 0 {\n\t\tsl += _Socklen(n) + 1\n\t}\n\tif sa.raw.Path[0] == '@' {\n\t\tsa.raw.Path[0] = 0\n\t\t// Don't count trailing NUL for abstract address.\n\t\tsl--\n\t}\n\n\treturn unsafe.Pointer(&sa.raw), sl, nil\n}\n\n//sys\tgetsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname\n\nfunc Getsockname(fd int) (sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tif err = getsockname(fd, &rsa, &len); err != nil {\n\t\treturn\n\t}\n\treturn anyToSockaddr(&rsa)\n}\n\nconst ImplementsGetwd = true\n\n//sys\tGetcwd(buf []byte) (n int, err error)\n\nfunc Getwd() (wd string, err error) {\n\tvar buf [PathMax]byte\n\t// Getcwd will return an error if it failed for any reason.\n\t_, err = Getcwd(buf[0:])\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tn := clen(buf[:])\n\tif n < 1 {\n\t\treturn \"\", EINVAL\n\t}\n\treturn string(buf[:n]), nil\n}\n\n/*\n * Wrapped\n */\n\n//sysnb\tgetgroups(ngid int, gid *_Gid_t) (n int, err error)\n//sysnb\tsetgroups(ngid int, gid *_Gid_t) (err error)\n\nfunc Getgroups() (gids []int, err error) {\n\tn, err := getgroups(0, nil)\n\t// Check for error and sanity check group count. Newer versions of\n\t// Solaris allow up to 1024 (NGROUPS_MAX).\n\tif n < 0 || n > 1024 {\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn nil, EINVAL\n\t} else if n == 0 {\n\t\treturn nil, nil\n\t}\n\n\ta := make([]_Gid_t, n)\n\tn, err = getgroups(n, &a[0])\n\tif n == -1 {\n\t\treturn nil, err\n\t}\n\tgids = make([]int, n)\n\tfor i, v := range a[0:n] {\n\t\tgids[i] = int(v)\n\t}\n\treturn\n}\n\nfunc Setgroups(gids []int) (err error) {\n\tif len(gids) == 0 {\n\t\treturn setgroups(0, nil)\n\t}\n\n\ta := make([]_Gid_t, len(gids))\n\tfor i, v := range gids {\n\t\ta[i] = _Gid_t(v)\n\t}\n\treturn setgroups(len(a), &a[0])\n}\n\nfunc ReadDirent(fd int, buf []byte) (n int, err error) {\n\t// Final argument is (basep *uintptr) and the syscall doesn't take nil.\n\t// TODO(rsc): Can we use a single global basep for all calls?\n\treturn Getdents(fd, buf, new(uintptr))\n}\n\n// Wait status is 7 bits at bottom, either 0 (exited),\n// 0x7F (stopped), or a signal number that caused an exit.\n// The 0x80 bit is whether there was a core dump.\n// An extra number (exit code, signal causing a stop)\n// is in the high bits.\n\ntype WaitStatus uint32\n\nconst (\n\tmask  = 0x7F\n\tcore  = 0x80\n\tshift = 8\n\n\texited  = 0\n\tstopped = 0x7F\n)\n\nfunc (w WaitStatus) Exited() bool { return w&mask == exited }\n\nfunc (w WaitStatus) ExitStatus() int {\n\tif w&mask != exited {\n\t\treturn -1\n\t}\n\treturn int(w >> shift)\n}\n\nfunc (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }\n\nfunc (w WaitStatus) Signal() syscall.Signal {\n\tsig := syscall.Signal(w & mask)\n\tif sig == stopped || sig == 0 {\n\t\treturn -1\n\t}\n\treturn sig\n}\n\nfunc (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }\n\nfunc (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }\n\nfunc (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }\n\nfunc (w WaitStatus) StopSignal() syscall.Signal {\n\tif !w.Stopped() {\n\t\treturn -1\n\t}\n\treturn syscall.Signal(w>>shift) & 0xFF\n}\n\nfunc (w WaitStatus) TrapCause() int { return -1 }\n\n//sys\twait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error)\n\nfunc Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) {\n\tvar status _C_int\n\trpid, err := wait4(int32(pid), &status, options, rusage)\n\twpid := int(rpid)\n\tif wpid == -1 {\n\t\treturn wpid, err\n\t}\n\tif wstatus != nil {\n\t\t*wstatus = WaitStatus(status)\n\t}\n\treturn wpid, nil\n}\n\n//sys\tgethostname(buf []byte) (n int, err error)\n\nfunc Gethostname() (name string, err error) {\n\tvar buf [MaxHostNameLen]byte\n\tn, err := gethostname(buf[:])\n\tif n != 0 {\n\t\treturn \"\", err\n\t}\n\tn = clen(buf[:])\n\tif n < 1 {\n\t\treturn \"\", EFAULT\n\t}\n\treturn string(buf[:n]), nil\n}\n\n//sys\tutimes(path string, times *[2]Timeval) (err error)\n\nfunc Utimes(path string, tv []Timeval) (err error) {\n\tif tv == nil {\n\t\treturn utimes(path, nil)\n\t}\n\tif len(tv) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\n//sys\tutimensat(fd int, path string, times *[2]Timespec, flag int) (err error)\n\nfunc UtimesNano(path string, ts []Timespec) error {\n\tif ts == nil {\n\t\treturn utimensat(AT_FDCWD, path, nil, 0)\n\t}\n\tif len(ts) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)\n}\n\nfunc UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {\n\tif ts == nil {\n\t\treturn utimensat(dirfd, path, nil, flags)\n\t}\n\tif len(ts) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)\n}\n\n//sys\tfcntl(fd int, cmd int, arg int) (val int, err error)\n\n// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.\nfunc FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0)\n\tif e1 != 0 {\n\t\treturn e1\n\t}\n\treturn nil\n}\n\n//sys\tfutimesat(fildes int, path *byte, times *[2]Timeval) (err error)\n\nfunc Futimesat(dirfd int, path string, tv []Timeval) error {\n\tpathp, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif tv == nil {\n\t\treturn futimesat(dirfd, pathp, nil)\n\t}\n\tif len(tv) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\n// Solaris doesn't have an futimes function because it allows NULL to be\n// specified as the path for futimesat. However, Go doesn't like\n// NULL-style string interfaces, so this simple wrapper is provided.\nfunc Futimes(fd int, tv []Timeval) error {\n\tif tv == nil {\n\t\treturn futimesat(fd, nil, nil)\n\t}\n\tif len(tv) != 2 {\n\t\treturn EINVAL\n\t}\n\treturn futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0])))\n}\n\nfunc anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {\n\tswitch rsa.Addr.Family {\n\tcase AF_UNIX:\n\t\tpp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrUnix)\n\t\t// Assume path ends at NUL.\n\t\t// This is not technically the Solaris semantics for\n\t\t// abstract Unix domain sockets -- they are supposed\n\t\t// to be uninterpreted fixed-size binary blobs -- but\n\t\t// everyone uses this convention.\n\t\tn := 0\n\t\tfor n < len(pp.Path) && pp.Path[n] != 0 {\n\t\t\tn++\n\t\t}\n\t\tbytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]\n\t\tsa.Name = string(bytes)\n\t\treturn sa, nil\n\n\tcase AF_INET:\n\t\tpp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet4)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\n\tcase AF_INET6:\n\t\tpp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet6)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tsa.ZoneId = pp.Scope_id\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\t}\n\treturn nil, EAFNOSUPPORT\n}\n\n//sys\taccept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept\n\nfunc Accept(fd int) (nfd int, sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tnfd, err = accept(fd, &rsa, &len)\n\tif nfd == -1 {\n\t\treturn\n\t}\n\tsa, err = anyToSockaddr(&rsa)\n\tif err != nil {\n\t\tClose(nfd)\n\t\tnfd = 0\n\t}\n\treturn\n}\n\n//sys\trecvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg\n\nfunc Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {\n\tvar msg Msghdr\n\tvar rsa RawSockaddrAny\n\tmsg.Name = (*byte)(unsafe.Pointer(&rsa))\n\tmsg.Namelen = uint32(SizeofSockaddrAny)\n\tvar iov Iovec\n\tif len(p) > 0 {\n\t\tiov.Base = (*int8)(unsafe.Pointer(&p[0]))\n\t\tiov.SetLen(len(p))\n\t}\n\tvar dummy int8\n\tif len(oob) > 0 {\n\t\t// receive at least one normal byte\n\t\tif len(p) == 0 {\n\t\t\tiov.Base = &dummy\n\t\t\tiov.SetLen(1)\n\t\t}\n\t\tmsg.Accrightslen = int32(len(oob))\n\t}\n\tmsg.Iov = &iov\n\tmsg.Iovlen = 1\n\tif n, err = recvmsg(fd, &msg, flags); n == -1 {\n\t\treturn\n\t}\n\toobn = int(msg.Accrightslen)\n\t// source address is only specified if the socket is unconnected\n\tif rsa.Addr.Family != AF_UNSPEC {\n\t\tfrom, err = anyToSockaddr(&rsa)\n\t}\n\treturn\n}\n\nfunc Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {\n\t_, err = SendmsgN(fd, p, oob, to, flags)\n\treturn\n}\n\n//sys\tsendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg\n\nfunc SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {\n\tvar ptr unsafe.Pointer\n\tvar salen _Socklen\n\tif to != nil {\n\t\tptr, salen, err = to.sockaddr()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\t}\n\tvar msg Msghdr\n\tmsg.Name = (*byte)(unsafe.Pointer(ptr))\n\tmsg.Namelen = uint32(salen)\n\tvar iov Iovec\n\tif len(p) > 0 {\n\t\tiov.Base = (*int8)(unsafe.Pointer(&p[0]))\n\t\tiov.SetLen(len(p))\n\t}\n\tvar dummy int8\n\tif len(oob) > 0 {\n\t\t// send at least one normal byte\n\t\tif len(p) == 0 {\n\t\t\tiov.Base = &dummy\n\t\t\tiov.SetLen(1)\n\t\t}\n\t\tmsg.Accrightslen = int32(len(oob))\n\t}\n\tmsg.Iov = &iov\n\tmsg.Iovlen = 1\n\tif n, err = sendmsg(fd, &msg, flags); err != nil {\n\t\treturn 0, err\n\t}\n\tif len(oob) > 0 && len(p) == 0 {\n\t\tn = 0\n\t}\n\treturn n, nil\n}\n\n//sys\tacct(path *byte) (err error)\n\nfunc Acct(path string) (err error) {\n\tif len(path) == 0 {\n\t\t// Assume caller wants to disable accounting.\n\t\treturn acct(nil)\n\t}\n\n\tpathp, err := BytePtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn acct(pathp)\n}\n\n//sys\t__makedev(version int, major uint, minor uint) (val uint64)\n\nfunc Mkdev(major, minor uint32) uint64 {\n\treturn __makedev(NEWDEV, uint(major), uint(minor))\n}\n\n//sys\t__major(version int, dev uint64) (val uint)\n\nfunc Major(dev uint64) uint32 {\n\treturn uint32(__major(NEWDEV, dev))\n}\n\n//sys\t__minor(version int, dev uint64) (val uint)\n\nfunc Minor(dev uint64) uint32 {\n\treturn uint32(__minor(NEWDEV, dev))\n}\n\n/*\n * Expose the ioctl function\n */\n\n//sys\tioctl(fd int, req uint, arg uintptr) (err error)\n\nfunc IoctlSetInt(fd int, req uint, value int) (err error) {\n\treturn ioctl(fd, req, uintptr(value))\n}\n\nfunc IoctlSetWinsize(fd int, req uint, value *Winsize) (err error) {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermios(fd int, req uint, value *Termios) (err error) {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlSetTermio(fd int, req uint, value *Termio) (err error) {\n\treturn ioctl(fd, req, uintptr(unsafe.Pointer(value)))\n}\n\nfunc IoctlGetInt(fd int, req uint) (int, error) {\n\tvar value int\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn value, err\n}\n\nfunc IoctlGetWinsize(fd int, req uint) (*Winsize, error) {\n\tvar value Winsize\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermios(fd int, req uint) (*Termios, error) {\n\tvar value Termios\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\nfunc IoctlGetTermio(fd int, req uint) (*Termio, error) {\n\tvar value Termio\n\terr := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))\n\treturn &value, err\n}\n\n//sys   poll(fds *PollFd, nfds int, timeout int) (n int, err error)\n\nfunc Poll(fds []PollFd, timeout int) (n int, err error) {\n\tif len(fds) == 0 {\n\t\treturn poll(nil, 0, timeout)\n\t}\n\treturn poll(&fds[0], len(fds), timeout)\n}\n\n/*\n * Exposed directly\n */\n//sys\tAccess(path string, mode uint32) (err error)\n//sys\tAdjtime(delta *Timeval, olddelta *Timeval) (err error)\n//sys\tChdir(path string) (err error)\n//sys\tChmod(path string, mode uint32) (err error)\n//sys\tChown(path string, uid int, gid int) (err error)\n//sys\tChroot(path string) (err error)\n//sys\tClose(fd int) (err error)\n//sys\tCreat(path string, mode uint32) (fd int, err error)\n//sys\tDup(fd int) (nfd int, err error)\n//sys\tDup2(oldfd int, newfd int) (err error)\n//sys\tExit(code int)\n//sys\tFchdir(fd int) (err error)\n//sys\tFchmod(fd int, mode uint32) (err error)\n//sys\tFchmodat(dirfd int, path string, mode uint32, flags int) (err error)\n//sys\tFchown(fd int, uid int, gid int) (err error)\n//sys\tFchownat(dirfd int, path string, uid int, gid int, flags int) (err error)\n//sys\tFdatasync(fd int) (err error)\n//sys Flock(fd int, how int) (err error)\n//sys\tFpathconf(fd int, name int) (val int, err error)\n//sys\tFstat(fd int, stat *Stat_t) (err error)\n//sys\tFstatvfs(fd int, vfsstat *Statvfs_t) (err error)\n//sys\tGetdents(fd int, buf []byte, basep *uintptr) (n int, err error)\n//sysnb\tGetgid() (gid int)\n//sysnb\tGetpid() (pid int)\n//sysnb\tGetpgid(pid int) (pgid int, err error)\n//sysnb\tGetpgrp() (pgid int, err error)\n//sys\tGeteuid() (euid int)\n//sys\tGetegid() (egid int)\n//sys\tGetppid() (ppid int)\n//sys\tGetpriority(which int, who int) (n int, err error)\n//sysnb\tGetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tGetrusage(who int, rusage *Rusage) (err error)\n//sysnb\tGettimeofday(tv *Timeval) (err error)\n//sysnb\tGetuid() (uid int)\n//sys\tKill(pid int, signum syscall.Signal) (err error)\n//sys\tLchown(path string, uid int, gid int) (err error)\n//sys\tLink(path string, link string) (err error)\n//sys\tListen(s int, backlog int) (err error) = libsocket.__xnet_llisten\n//sys\tLstat(path string, stat *Stat_t) (err error)\n//sys\tMadvise(b []byte, advice int) (err error)\n//sys\tMkdir(path string, mode uint32) (err error)\n//sys\tMkdirat(dirfd int, path string, mode uint32) (err error)\n//sys\tMkfifo(path string, mode uint32) (err error)\n//sys\tMkfifoat(dirfd int, path string, mode uint32) (err error)\n//sys\tMknod(path string, mode uint32, dev int) (err error)\n//sys\tMknodat(dirfd int, path string, mode uint32, dev int) (err error)\n//sys\tMlock(b []byte) (err error)\n//sys\tMlockall(flags int) (err error)\n//sys\tMprotect(b []byte, prot int) (err error)\n//sys\tMsync(b []byte, flags int) (err error)\n//sys\tMunlock(b []byte) (err error)\n//sys\tMunlockall() (err error)\n//sys\tNanosleep(time *Timespec, leftover *Timespec) (err error)\n//sys\tOpen(path string, mode int, perm uint32) (fd int, err error)\n//sys\tOpenat(dirfd int, path string, flags int, mode uint32) (fd int, err error)\n//sys\tPathconf(path string, name int) (val int, err error)\n//sys\tPause() (err error)\n//sys\tPread(fd int, p []byte, offset int64) (n int, err error)\n//sys\tPwrite(fd int, p []byte, offset int64) (n int, err error)\n//sys\tread(fd int, p []byte) (n int, err error)\n//sys\tReadlink(path string, buf []byte) (n int, err error)\n//sys\tRename(from string, to string) (err error)\n//sys\tRenameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)\n//sys\tRmdir(path string) (err error)\n//sys\tSeek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek\n//sysnb\tSetegid(egid int) (err error)\n//sysnb\tSeteuid(euid int) (err error)\n//sysnb\tSetgid(gid int) (err error)\n//sys\tSethostname(p []byte) (err error)\n//sysnb\tSetpgid(pid int, pgid int) (err error)\n//sys\tSetpriority(which int, who int, prio int) (err error)\n//sysnb\tSetregid(rgid int, egid int) (err error)\n//sysnb\tSetreuid(ruid int, euid int) (err error)\n//sysnb\tSetrlimit(which int, lim *Rlimit) (err error)\n//sysnb\tSetsid() (pid int, err error)\n//sysnb\tSetuid(uid int) (err error)\n//sys\tShutdown(s int, how int) (err error) = libsocket.shutdown\n//sys\tStat(path string, stat *Stat_t) (err error)\n//sys\tStatvfs(path string, vfsstat *Statvfs_t) (err error)\n//sys\tSymlink(path string, link string) (err error)\n//sys\tSync() (err error)\n//sysnb\tTimes(tms *Tms) (ticks uintptr, err error)\n//sys\tTruncate(path string, length int64) (err error)\n//sys\tFsync(fd int) (err error)\n//sys\tFtruncate(fd int, length int64) (err error)\n//sys\tUmask(mask int) (oldmask int)\n//sysnb\tUname(buf *Utsname) (err error)\n//sys\tUnmount(target string, flags int) (err error) = libc.umount\n//sys\tUnlink(path string) (err error)\n//sys\tUnlinkat(dirfd int, path string, flags int) (err error)\n//sys\tUstat(dev int, ubuf *Ustat_t) (err error)\n//sys\tUtime(path string, buf *Utimbuf) (err error)\n//sys\tbind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind\n//sys\tconnect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect\n//sys\tmmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)\n//sys\tmunmap(addr uintptr, length uintptr) (err error)\n//sys\tsendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto\n//sys\tsocket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket\n//sysnb\tsocketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair\n//sys\twrite(fd int, p []byte) (n int, err error)\n//sys\tgetsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt\n//sysnb\tgetpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername\n//sys\tsetsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt\n//sys\trecvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nvar mapper = &mmapper{\n\tactive: make(map[*byte][]byte),\n\tmmap:   mmap,\n\tmunmap: munmap,\n}\n\nfunc Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {\n\treturn mapper.Mmap(fd, offset, length, prot, flags)\n}\n\nfunc Munmap(b []byte) (err error) {\n\treturn mapper.Munmap(b)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,solaris\n\npackage unix\n\nfunc setTimespec(sec, nsec int64) Timespec {\n\treturn Timespec{Sec: sec, Nsec: nsec}\n}\n\nfunc setTimeval(sec, usec int64) Timeval {\n\treturn Timeval{Sec: sec, Usec: usec}\n}\n\nfunc (iov *Iovec) SetLen(length int) {\n\tiov.Len = uint64(length)\n}\n\nfunc (cmsg *Cmsghdr) SetLen(length int) {\n\tcmsg.Len = uint32(length)\n}\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\t// TODO(aram): implement this, see issue 5847.\n\tpanic(\"unimplemented\")\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_unix.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\npackage unix\n\nimport (\n\t\"runtime\"\n\t\"sync\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar (\n\tStdin  = 0\n\tStdout = 1\n\tStderr = 2\n)\n\nconst (\n\tdarwin64Bit    = runtime.GOOS == \"darwin\" && sizeofPtr == 8\n\tdragonfly64Bit = runtime.GOOS == \"dragonfly\" && sizeofPtr == 8\n\tnetbsd32Bit    = runtime.GOOS == \"netbsd\" && sizeofPtr == 4\n\tsolaris64Bit   = runtime.GOOS == \"solaris\" && sizeofPtr == 8\n)\n\n// Do the interface allocations only once for common\n// Errno values.\nvar (\n\terrEAGAIN error = syscall.EAGAIN\n\terrEINVAL error = syscall.EINVAL\n\terrENOENT error = syscall.ENOENT\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn nil\n\tcase EAGAIN:\n\t\treturn errEAGAIN\n\tcase EINVAL:\n\t\treturn errEINVAL\n\tcase ENOENT:\n\t\treturn errENOENT\n\t}\n\treturn e\n}\n\n// Mmap manager, for use by operating system-specific implementations.\n\ntype mmapper struct {\n\tsync.Mutex\n\tactive map[*byte][]byte // active mappings; key is last byte in mapping\n\tmmap   func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)\n\tmunmap func(addr uintptr, length uintptr) error\n}\n\nfunc (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {\n\tif length <= 0 {\n\t\treturn nil, EINVAL\n\t}\n\n\t// Map the requested memory.\n\taddr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)\n\tif errno != nil {\n\t\treturn nil, errno\n\t}\n\n\t// Slice memory layout\n\tvar sl = struct {\n\t\taddr uintptr\n\t\tlen  int\n\t\tcap  int\n\t}{addr, length, length}\n\n\t// Use unsafe to turn sl into a []byte.\n\tb := *(*[]byte)(unsafe.Pointer(&sl))\n\n\t// Register mapping in m and return it.\n\tp := &b[cap(b)-1]\n\tm.Lock()\n\tdefer m.Unlock()\n\tm.active[p] = b\n\treturn b, nil\n}\n\nfunc (m *mmapper) Munmap(data []byte) (err error) {\n\tif len(data) == 0 || len(data) != cap(data) {\n\t\treturn EINVAL\n\t}\n\n\t// Find the base of the mapping.\n\tp := &data[cap(data)-1]\n\tm.Lock()\n\tdefer m.Unlock()\n\tb := m.active[p]\n\tif b == nil || &b[0] != &data[0] {\n\t\treturn EINVAL\n\t}\n\n\t// Unmap the memory and update m.\n\tif errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {\n\t\treturn errno\n\t}\n\tdelete(m.active, p)\n\treturn nil\n}\n\nfunc Read(fd int, p []byte) (n int, err error) {\n\tn, err = read(fd, p)\n\tif raceenabled {\n\t\tif n > 0 {\n\t\t\traceWriteRange(unsafe.Pointer(&p[0]), n)\n\t\t}\n\t\tif err == nil {\n\t\t\traceAcquire(unsafe.Pointer(&ioSync))\n\t\t}\n\t}\n\treturn\n}\n\nfunc Write(fd int, p []byte) (n int, err error) {\n\tif raceenabled {\n\t\traceReleaseMerge(unsafe.Pointer(&ioSync))\n\t}\n\tn, err = write(fd, p)\n\tif raceenabled && n > 0 {\n\t\traceReadRange(unsafe.Pointer(&p[0]), n)\n\t}\n\treturn\n}\n\n// For testing: clients can set this flag to force\n// creation of IPv6 sockets to return EAFNOSUPPORT.\nvar SocketDisableIPv6 bool\n\ntype Sockaddr interface {\n\tsockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs\n}\n\ntype SockaddrInet4 struct {\n\tPort int\n\tAddr [4]byte\n\traw  RawSockaddrInet4\n}\n\ntype SockaddrInet6 struct {\n\tPort   int\n\tZoneId uint32\n\tAddr   [16]byte\n\traw    RawSockaddrInet6\n}\n\ntype SockaddrUnix struct {\n\tName string\n\traw  RawSockaddrUnix\n}\n\nfunc Bind(fd int, sa Sockaddr) (err error) {\n\tptr, n, err := sa.sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn bind(fd, ptr, n)\n}\n\nfunc Connect(fd int, sa Sockaddr) (err error) {\n\tptr, n, err := sa.sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn connect(fd, ptr, n)\n}\n\nfunc Getpeername(fd int) (sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tif err = getpeername(fd, &rsa, &len); err != nil {\n\t\treturn\n\t}\n\treturn anyToSockaddr(&rsa)\n}\n\nfunc GetsockoptInt(fd, level, opt int) (value int, err error) {\n\tvar n int32\n\tvallen := _Socklen(4)\n\terr = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)\n\treturn int(n), err\n}\n\nfunc Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tvar len _Socklen = SizeofSockaddrAny\n\tif n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {\n\t\treturn\n\t}\n\tif rsa.Addr.Family != AF_UNSPEC {\n\t\tfrom, err = anyToSockaddr(&rsa)\n\t}\n\treturn\n}\n\nfunc Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {\n\tptr, n, err := to.sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn sendto(fd, p, flags, ptr, n)\n}\n\nfunc SetsockoptByte(fd, level, opt int, value byte) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(&value), 1)\n}\n\nfunc SetsockoptInt(fd, level, opt int, value int) (err error) {\n\tvar n = int32(value)\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(&n), 4)\n}\n\nfunc SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4)\n}\n\nfunc SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq)\n}\n\nfunc SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq)\n}\n\nfunc SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter)\n}\n\nfunc SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger)\n}\n\nfunc SetsockoptString(fd, level, opt int, s string) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s)))\n}\n\nfunc SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {\n\treturn setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv))\n}\n\nfunc Socket(domain, typ, proto int) (fd int, err error) {\n\tif domain == AF_INET6 && SocketDisableIPv6 {\n\t\treturn -1, EAFNOSUPPORT\n\t}\n\tfd, err = socket(domain, typ, proto)\n\treturn\n}\n\nfunc Socketpair(domain, typ, proto int) (fd [2]int, err error) {\n\tvar fdx [2]int32\n\terr = socketpair(domain, typ, proto, &fdx)\n\tif err == nil {\n\t\tfd[0] = int(fdx[0])\n\t\tfd[1] = int(fdx[1])\n\t}\n\treturn\n}\n\nfunc Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tif raceenabled {\n\t\traceReleaseMerge(unsafe.Pointer(&ioSync))\n\t}\n\treturn sendfile(outfd, infd, offset, count)\n}\n\nvar ioSync int64\n\nfunc CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }\n\nfunc SetNonblock(fd int, nonblocking bool) (err error) {\n\tflag, err := fcntl(fd, F_GETFL, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif nonblocking {\n\t\tflag |= O_NONBLOCK\n\t} else {\n\t\tflag &= ^O_NONBLOCK\n\t}\n\t_, err = fcntl(fd, F_SETFL, flag)\n\treturn err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/syscall_unix_gc.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n// +build !gccgo\n\npackage unix\n\nimport \"syscall\"\n\nfunc Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)\nfunc Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)\nfunc RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)\nfunc RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/timestruct.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build darwin dragonfly freebsd linux netbsd openbsd solaris\n\npackage unix\n\n// TimespecToNsec converts a Timespec value into a number of\n// nanoseconds since the Unix epoch.\nfunc TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }\n\n// NsecToTimespec takes a number of nanoseconds since the Unix epoch\n// and returns the corresponding Timespec value.\nfunc NsecToTimespec(nsec int64) Timespec {\n\tsec := nsec / 1e9\n\tnsec = nsec % 1e9\n\tif nsec < 0 {\n\t\tnsec += 1e9\n\t\tsec--\n\t}\n\treturn setTimespec(sec, nsec)\n}\n\n// TimevalToNsec converts a Timeval value into a number of nanoseconds\n// since the Unix epoch.\nfunc TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }\n\n// NsecToTimeval takes a number of nanoseconds since the Unix epoch\n// and returns the corresponding Timeval value.\nfunc NsecToTimeval(nsec int64) Timeval {\n\tnsec += 999 // round up to microsecond\n\tusec := nsec % 1e9 / 1e3\n\tsec := nsec / 1e9\n\tif usec < 0 {\n\t\tusec += 1e6\n\t\tsec--\n\t}\n\treturn setTimeval(sec, usec)\n}\n\n// Unix returns ts as the number of seconds and nanoseconds elapsed since the\n// Unix epoch.\nfunc (ts *Timespec) Unix() (sec int64, nsec int64) {\n\treturn int64(ts.Sec), int64(ts.Nsec)\n}\n\n// Unix returns tv as the number of seconds and nanoseconds elapsed since the\n// Unix epoch.\nfunc (tv *Timeval) Unix() (sec int64, nsec int64) {\n\treturn int64(tv.Sec), int64(tv.Usec) * 1000\n}\n\n// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch.\nfunc (ts *Timespec) Nano() int64 {\n\treturn int64(ts.Sec)*1e9 + int64(ts.Nsec)\n}\n\n// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch.\nfunc (tv *Timeval) Nano() int64 {\n\treturn int64(tv.Sec)*1e9 + int64(tv.Usec)*1000\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_darwin_386.go",
    "content": "// mkerrors.sh -m32\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,darwin\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m32 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1c\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x25\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x1e\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1c\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x28\n\tAF_NATM                           = 0x1f\n\tAF_NDRV                           = 0x1b\n\tAF_NETBIOS                        = 0x21\n\tAF_NS                             = 0x6\n\tAF_OSI                            = 0x7\n\tAF_PPP                            = 0x22\n\tAF_PUP                            = 0x4\n\tAF_RESERVED_36                    = 0x24\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x18\n\tAF_SNA                            = 0xb\n\tAF_SYSTEM                         = 0x20\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tAF_UTUN                           = 0x26\n\tALTWERASE                         = 0x200\n\tATTR_BIT_MAP_COUNT                = 0x5\n\tATTR_CMN_ACCESSMASK               = 0x20000\n\tATTR_CMN_ACCTIME                  = 0x1000\n\tATTR_CMN_ADDEDTIME                = 0x10000000\n\tATTR_CMN_BKUPTIME                 = 0x2000\n\tATTR_CMN_CHGTIME                  = 0x800\n\tATTR_CMN_CRTIME                   = 0x200\n\tATTR_CMN_DATA_PROTECT_FLAGS       = 0x40000000\n\tATTR_CMN_DEVID                    = 0x2\n\tATTR_CMN_DOCUMENT_ID              = 0x100000\n\tATTR_CMN_ERROR                    = 0x20000000\n\tATTR_CMN_EXTENDED_SECURITY        = 0x400000\n\tATTR_CMN_FILEID                   = 0x2000000\n\tATTR_CMN_FLAGS                    = 0x40000\n\tATTR_CMN_FNDRINFO                 = 0x4000\n\tATTR_CMN_FSID                     = 0x4\n\tATTR_CMN_FULLPATH                 = 0x8000000\n\tATTR_CMN_GEN_COUNT                = 0x80000\n\tATTR_CMN_GRPID                    = 0x10000\n\tATTR_CMN_GRPUUID                  = 0x1000000\n\tATTR_CMN_MODTIME                  = 0x400\n\tATTR_CMN_NAME                     = 0x1\n\tATTR_CMN_NAMEDATTRCOUNT           = 0x80000\n\tATTR_CMN_NAMEDATTRLIST            = 0x100000\n\tATTR_CMN_OBJID                    = 0x20\n\tATTR_CMN_OBJPERMANENTID           = 0x40\n\tATTR_CMN_OBJTAG                   = 0x10\n\tATTR_CMN_OBJTYPE                  = 0x8\n\tATTR_CMN_OWNERID                  = 0x8000\n\tATTR_CMN_PARENTID                 = 0x4000000\n\tATTR_CMN_PAROBJID                 = 0x80\n\tATTR_CMN_RETURNED_ATTRS           = 0x80000000\n\tATTR_CMN_SCRIPT                   = 0x100\n\tATTR_CMN_SETMASK                  = 0x41c7ff00\n\tATTR_CMN_USERACCESS               = 0x200000\n\tATTR_CMN_UUID                     = 0x800000\n\tATTR_CMN_VALIDMASK                = 0xffffffff\n\tATTR_CMN_VOLSETMASK               = 0x6700\n\tATTR_FILE_ALLOCSIZE               = 0x4\n\tATTR_FILE_CLUMPSIZE               = 0x10\n\tATTR_FILE_DATAALLOCSIZE           = 0x400\n\tATTR_FILE_DATAEXTENTS             = 0x800\n\tATTR_FILE_DATALENGTH              = 0x200\n\tATTR_FILE_DEVTYPE                 = 0x20\n\tATTR_FILE_FILETYPE                = 0x40\n\tATTR_FILE_FORKCOUNT               = 0x80\n\tATTR_FILE_FORKLIST                = 0x100\n\tATTR_FILE_IOBLOCKSIZE             = 0x8\n\tATTR_FILE_LINKCOUNT               = 0x1\n\tATTR_FILE_RSRCALLOCSIZE           = 0x2000\n\tATTR_FILE_RSRCEXTENTS             = 0x4000\n\tATTR_FILE_RSRCLENGTH              = 0x1000\n\tATTR_FILE_SETMASK                 = 0x20\n\tATTR_FILE_TOTALSIZE               = 0x2\n\tATTR_FILE_VALIDMASK               = 0x37ff\n\tATTR_VOL_ALLOCATIONCLUMP          = 0x40\n\tATTR_VOL_ATTRIBUTES               = 0x40000000\n\tATTR_VOL_CAPABILITIES             = 0x20000\n\tATTR_VOL_DIRCOUNT                 = 0x400\n\tATTR_VOL_ENCODINGSUSED            = 0x10000\n\tATTR_VOL_FILECOUNT                = 0x200\n\tATTR_VOL_FSTYPE                   = 0x1\n\tATTR_VOL_INFO                     = 0x80000000\n\tATTR_VOL_IOBLOCKSIZE              = 0x80\n\tATTR_VOL_MAXOBJCOUNT              = 0x800\n\tATTR_VOL_MINALLOCATION            = 0x20\n\tATTR_VOL_MOUNTEDDEVICE            = 0x8000\n\tATTR_VOL_MOUNTFLAGS               = 0x4000\n\tATTR_VOL_MOUNTPOINT               = 0x1000\n\tATTR_VOL_NAME                     = 0x2000\n\tATTR_VOL_OBJCOUNT                 = 0x100\n\tATTR_VOL_QUOTA_SIZE               = 0x10000000\n\tATTR_VOL_RESERVED_SIZE            = 0x20000000\n\tATTR_VOL_SETMASK                  = 0x80002000\n\tATTR_VOL_SIGNATURE                = 0x2\n\tATTR_VOL_SIZE                     = 0x4\n\tATTR_VOL_SPACEAVAIL               = 0x10\n\tATTR_VOL_SPACEFREE                = 0x8\n\tATTR_VOL_UUID                     = 0x40000\n\tATTR_VOL_VALIDMASK                = 0xf007ffff\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc00c4279\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044272\n\tBIOCGRTIMEOUT                     = 0x4008426e\n\tBIOCGSEESENT                      = 0x40044276\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044278\n\tBIOCSETF                          = 0x80084267\n\tBIOCSETFNR                        = 0x8008427e\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044273\n\tBIOCSRTIMEOUT                     = 0x8008426d\n\tBIOCSSEESENT                      = 0x80044277\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x80000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tBS0                               = 0x0\n\tBS1                               = 0x8000\n\tBSDLY                             = 0x8000\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCLOCK_MONOTONIC                   = 0x6\n\tCLOCK_MONOTONIC_RAW               = 0x4\n\tCLOCK_MONOTONIC_RAW_APPROX        = 0x5\n\tCLOCK_PROCESS_CPUTIME_ID          = 0xc\n\tCLOCK_REALTIME                    = 0x0\n\tCLOCK_THREAD_CPUTIME_ID           = 0x10\n\tCLOCK_UPTIME_RAW                  = 0x8\n\tCLOCK_UPTIME_RAW_APPROX           = 0x9\n\tCR0                               = 0x0\n\tCR1                               = 0x1000\n\tCR2                               = 0x2000\n\tCR3                               = 0x3000\n\tCRDLY                             = 0x3000\n\tCREAD                             = 0x800\n\tCRTSCTS                           = 0x30000\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_AOS                           = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CAN_SOCKETCAN                 = 0xe3\n\tDLT_CHAOS                         = 0x5\n\tDLT_CHDLC                         = 0x68\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DBUS                          = 0xe7\n\tDLT_DECT                          = 0xdd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_DVB_CI                        = 0xeb\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FC_2                          = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS        = 0xe1\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_GSMTAP_ABIS                   = 0xda\n\tDLT_GSMTAP_UM                     = 0xd9\n\tDLT_HHDLC                         = 0x79\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NOFCS            = 0xe6\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPFILTER                      = 0x74\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IPNET                         = 0xe2\n\tDLT_IPOIB                         = 0xf2\n\tDLT_IPV4                          = 0xe4\n\tDLT_IPV6                          = 0xe5\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_ATM_CEMIC             = 0xee\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FIBRECHANNEL          = 0xea\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_SRX_E2E               = 0xe9\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_JUNIPER_VS                    = 0xe8\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_EVDEV                   = 0xd8\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_PPP_WITHDIRECTION       = 0xa6\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MATCHING_MAX                  = 0xf5\n\tDLT_MATCHING_MIN                  = 0x68\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MPEG_2_TS                     = 0xf3\n\tDLT_MPLS                          = 0xdb\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_MUX27010                      = 0xec\n\tDLT_NETANALYZER                   = 0xf0\n\tDLT_NETANALYZER_TRANSPARENT       = 0xf1\n\tDLT_NFC_LLCP                      = 0xf5\n\tDLT_NFLOG                         = 0xef\n\tDLT_NG40                          = 0xf4\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PPP_WITH_DIRECTION            = 0xa6\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDLT_STANAG_5066_D_PDU             = 0xed\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_USB_LINUX_MMAPPED             = 0xdc\n\tDLT_USER0                         = 0x93\n\tDLT_USER1                         = 0x94\n\tDLT_USER10                        = 0x9d\n\tDLT_USER11                        = 0x9e\n\tDLT_USER12                        = 0x9f\n\tDLT_USER13                        = 0xa0\n\tDLT_USER14                        = 0xa1\n\tDLT_USER15                        = 0xa2\n\tDLT_USER2                         = 0x95\n\tDLT_USER3                         = 0x96\n\tDLT_USER4                         = 0x97\n\tDLT_USER5                         = 0x98\n\tDLT_USER6                         = 0x99\n\tDLT_USER7                         = 0x9a\n\tDLT_USER8                         = 0x9b\n\tDLT_USER9                         = 0x9c\n\tDLT_WIHART                        = 0xdf\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_EXCEPT                     = -0xf\n\tEVFILT_FS                         = -0x9\n\tEVFILT_MACHPORT                   = -0x8\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0xf\n\tEVFILT_THREADMARKER               = 0xf\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_USER                       = -0xa\n\tEVFILT_VM                         = -0xc\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_DISPATCH                       = 0x80\n\tEV_DISPATCH2                      = 0x180\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG0                          = 0x1000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_OOBAND                         = 0x2000\n\tEV_POLL                           = 0x1000\n\tEV_RECEIPT                        = 0x40\n\tEV_SYSFLAGS                       = 0xf000\n\tEV_UDATA_SPECIFIC                 = 0x100\n\tEV_VANISHED                       = 0x200\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFF0                               = 0x0\n\tFF1                               = 0x4000\n\tFFDLY                             = 0x4000\n\tFLUSHO                            = 0x800000\n\tFSOPT_ATTR_CMN_EXTENDED           = 0x20\n\tFSOPT_NOFOLLOW                    = 0x1\n\tFSOPT_NOINMEMUPDATE               = 0x2\n\tFSOPT_PACK_INVAL_ATTRS            = 0x8\n\tFSOPT_REPORT_FULLSIZE             = 0x4\n\tF_ADDFILESIGS                     = 0x3d\n\tF_ADDFILESIGS_FOR_DYLD_SIM        = 0x53\n\tF_ADDFILESIGS_RETURN              = 0x61\n\tF_ADDSIGS                         = 0x3b\n\tF_ALLOCATEALL                     = 0x4\n\tF_ALLOCATECONTIG                  = 0x2\n\tF_BARRIERFSYNC                    = 0x55\n\tF_CHECK_LV                        = 0x62\n\tF_CHKCLEAN                        = 0x29\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0x43\n\tF_FINDSIGS                        = 0x4e\n\tF_FLUSH_DATA                      = 0x28\n\tF_FREEZE_FS                       = 0x35\n\tF_FULLFSYNC                       = 0x33\n\tF_GETCODEDIR                      = 0x48\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETLKPID                        = 0x42\n\tF_GETNOSIGPIPE                    = 0x4a\n\tF_GETOWN                          = 0x5\n\tF_GETPATH                         = 0x32\n\tF_GETPATH_MTMINFO                 = 0x47\n\tF_GETPROTECTIONCLASS              = 0x3f\n\tF_GETPROTECTIONLEVEL              = 0x4d\n\tF_GLOBAL_NOCACHE                  = 0x37\n\tF_LOG2PHYS                        = 0x31\n\tF_LOG2PHYS_EXT                    = 0x41\n\tF_NOCACHE                         = 0x30\n\tF_NODIRECT                        = 0x3e\n\tF_OK                              = 0x0\n\tF_PATHPKG_CHECK                   = 0x34\n\tF_PEOFPOSMODE                     = 0x3\n\tF_PREALLOCATE                     = 0x2a\n\tF_PUNCHHOLE                       = 0x63\n\tF_RDADVISE                        = 0x2c\n\tF_RDAHEAD                         = 0x2d\n\tF_RDLCK                           = 0x1\n\tF_SETBACKINGSTORE                 = 0x46\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETLKWTIMEOUT                   = 0xa\n\tF_SETNOSIGPIPE                    = 0x49\n\tF_SETOWN                          = 0x6\n\tF_SETPROTECTIONCLASS              = 0x40\n\tF_SETSIZE                         = 0x2b\n\tF_SINGLE_WRITER                   = 0x4c\n\tF_THAW_FS                         = 0x36\n\tF_TRANSCODEKEY                    = 0x4b\n\tF_TRIM_ACTIVE_FILE                = 0x64\n\tF_UNLCK                           = 0x2\n\tF_VOLPOSMODE                      = 0x4\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_ALTPHYS                       = 0x4000\n\tIFF_BROADCAST                     = 0x2\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_AAL5                          = 0x31\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ATM                           = 0x25\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_CARP                          = 0xf8\n\tIFT_CELLULAR                      = 0xff\n\tIFT_CEPT                          = 0x13\n\tIFT_DS3                           = 0x1e\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0x38\n\tIFT_FDDI                          = 0xf\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_GIF                           = 0x37\n\tIFT_HDH1822                       = 0x3\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE8023ADLAG                 = 0x88\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88026                      = 0xa\n\tIFT_L2VLAN                        = 0x87\n\tIFT_LAPB                          = 0x10\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_NSIP                          = 0x1b\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PDP                           = 0xff\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PKTAP                         = 0xfe\n\tIFT_PPP                           = 0x17\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_RS232                         = 0x21\n\tIFT_SDLC                          = 0x11\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0x39\n\tIFT_T1                            = 0x12\n\tIFT_ULTRA                         = 0x1d\n\tIFT_V35                           = 0x2d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LINKLOCALNETNUM                = 0xa9fe0000\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_3PC                       = 0x22\n\tIPPROTO_ADFS                      = 0x44\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_AHIP                      = 0x3d\n\tIPPROTO_APES                      = 0x63\n\tIPPROTO_ARGUS                     = 0xd\n\tIPPROTO_AX25                      = 0x5d\n\tIPPROTO_BHA                       = 0x31\n\tIPPROTO_BLT                       = 0x1e\n\tIPPROTO_BRSATMON                  = 0x4c\n\tIPPROTO_CFTP                      = 0x3e\n\tIPPROTO_CHAOS                     = 0x10\n\tIPPROTO_CMTP                      = 0x26\n\tIPPROTO_CPHB                      = 0x49\n\tIPPROTO_CPNX                      = 0x48\n\tIPPROTO_DDP                       = 0x25\n\tIPPROTO_DGP                       = 0x56\n\tIPPROTO_DIVERT                    = 0xfe\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_EMCON                     = 0xe\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GMTP                      = 0x64\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HELLO                     = 0x3f\n\tIPPROTO_HMP                       = 0x14\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IDPR                      = 0x23\n\tIPPROTO_IDRP                      = 0x2d\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IGP                       = 0x55\n\tIPPROTO_IGRP                      = 0x58\n\tIPPROTO_IL                        = 0x28\n\tIPPROTO_INLSP                     = 0x34\n\tIPPROTO_INP                       = 0x20\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPCV                      = 0x47\n\tIPPROTO_IPEIP                     = 0x5e\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPPC                      = 0x43\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IRTP                      = 0x1c\n\tIPPROTO_KRYPTOLAN                 = 0x41\n\tIPPROTO_LARP                      = 0x5b\n\tIPPROTO_LEAF1                     = 0x19\n\tIPPROTO_LEAF2                     = 0x1a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MEAS                      = 0x13\n\tIPPROTO_MHRP                      = 0x30\n\tIPPROTO_MICP                      = 0x5f\n\tIPPROTO_MTP                       = 0x5c\n\tIPPROTO_MUX                       = 0x12\n\tIPPROTO_ND                        = 0x4d\n\tIPPROTO_NHRP                      = 0x36\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_NSP                       = 0x1f\n\tIPPROTO_NVPII                     = 0xb\n\tIPPROTO_OSPFIGP                   = 0x59\n\tIPPROTO_PGM                       = 0x71\n\tIPPROTO_PIGP                      = 0x9\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PRM                       = 0x15\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_PVP                       = 0x4b\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_RCCMON                    = 0xa\n\tIPPROTO_RDP                       = 0x1b\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_RVD                       = 0x42\n\tIPPROTO_SATEXPAK                  = 0x40\n\tIPPROTO_SATMON                    = 0x45\n\tIPPROTO_SCCSP                     = 0x60\n\tIPPROTO_SCTP                      = 0x84\n\tIPPROTO_SDRP                      = 0x2a\n\tIPPROTO_SEP                       = 0x21\n\tIPPROTO_SRPC                      = 0x5a\n\tIPPROTO_ST                        = 0x7\n\tIPPROTO_SVMTP                     = 0x52\n\tIPPROTO_SWIPE                     = 0x35\n\tIPPROTO_TCF                       = 0x57\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_TPXX                      = 0x27\n\tIPPROTO_TRUNK1                    = 0x17\n\tIPPROTO_TRUNK2                    = 0x18\n\tIPPROTO_TTP                       = 0x54\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_VINES                     = 0x53\n\tIPPROTO_VISA                      = 0x46\n\tIPPROTO_VMTP                      = 0x51\n\tIPPROTO_WBEXPAK                   = 0x4f\n\tIPPROTO_WBMON                     = 0x4e\n\tIPPROTO_WSN                       = 0x4a\n\tIPPROTO_XNET                      = 0xf\n\tIPPROTO_XTP                       = 0x24\n\tIPV6_2292DSTOPTS                  = 0x17\n\tIPV6_2292HOPLIMIT                 = 0x14\n\tIPV6_2292HOPOPTS                  = 0x16\n\tIPV6_2292NEXTHOP                  = 0x15\n\tIPV6_2292PKTINFO                  = 0x13\n\tIPV6_2292PKTOPTIONS               = 0x19\n\tIPV6_2292RTHDR                    = 0x18\n\tIPV6_BINDV6ONLY                   = 0x1b\n\tIPV6_BOUND_IF                     = 0x7d\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FLOW_ECN_MASK                = 0x300\n\tIPV6_FRAGTTL                      = 0x3c\n\tIPV6_FW_ADD                       = 0x1e\n\tIPV6_FW_DEL                       = 0x1f\n\tIPV6_FW_FLUSH                     = 0x20\n\tIPV6_FW_GET                       = 0x22\n\tIPV6_FW_ZERO                      = 0x21\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXOPTHDR                    = 0x800\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MAX_GROUP_SRC_FILTER         = 0x200\n\tIPV6_MAX_MEMBERSHIPS              = 0xfff\n\tIPV6_MAX_SOCK_SRC_FILTER          = 0x80\n\tIPV6_MIN_MEMBERSHIPS              = 0x1f\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVTCLASS                   = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x24\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_ADD_SOURCE_MEMBERSHIP          = 0x46\n\tIP_BLOCK_SOURCE                   = 0x48\n\tIP_BOUND_IF                       = 0x19\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_DROP_SOURCE_MEMBERSHIP         = 0x47\n\tIP_DUMMYNET_CONFIGURE             = 0x3c\n\tIP_DUMMYNET_DEL                   = 0x3d\n\tIP_DUMMYNET_FLUSH                 = 0x3e\n\tIP_DUMMYNET_GET                   = 0x40\n\tIP_FAITH                          = 0x16\n\tIP_FW_ADD                         = 0x28\n\tIP_FW_DEL                         = 0x29\n\tIP_FW_FLUSH                       = 0x2a\n\tIP_FW_GET                         = 0x2c\n\tIP_FW_RESETLOG                    = 0x2d\n\tIP_FW_ZERO                        = 0x2b\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x15\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_GROUP_SRC_FILTER           = 0x200\n\tIP_MAX_MEMBERSHIPS                = 0xfff\n\tIP_MAX_SOCK_MUTE_FILTER           = 0x80\n\tIP_MAX_SOCK_SRC_FILTER            = 0x80\n\tIP_MF                             = 0x2000\n\tIP_MIN_MEMBERSHIPS                = 0x1f\n\tIP_MSFILTER                       = 0x4a\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_IFINDEX              = 0x42\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_MULTICAST_VIF                  = 0xe\n\tIP_NAT__XXX                       = 0x37\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OLD_FW_ADD                     = 0x32\n\tIP_OLD_FW_DEL                     = 0x33\n\tIP_OLD_FW_FLUSH                   = 0x34\n\tIP_OLD_FW_GET                     = 0x36\n\tIP_OLD_FW_RESETLOG                = 0x38\n\tIP_OLD_FW_ZERO                    = 0x35\n\tIP_OPTIONS                        = 0x1\n\tIP_PKTINFO                        = 0x1a\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVPKTINFO                    = 0x1a\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTOS                        = 0x1b\n\tIP_RECVTTL                        = 0x18\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RSVP_OFF                       = 0x10\n\tIP_RSVP_ON                        = 0xf\n\tIP_RSVP_VIF_OFF                   = 0x12\n\tIP_RSVP_VIF_ON                    = 0x11\n\tIP_STRIPHDR                       = 0x17\n\tIP_TOS                            = 0x3\n\tIP_TRAFFIC_MGT_BACKGROUND         = 0x41\n\tIP_TTL                            = 0x4\n\tIP_UNBLOCK_SOURCE                 = 0x49\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIUTF8                             = 0x4000\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_CAN_REUSE                    = 0x9\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x5\n\tMADV_FREE_REUSABLE                = 0x7\n\tMADV_FREE_REUSE                   = 0x8\n\tMADV_NORMAL                       = 0x0\n\tMADV_PAGEOUT                      = 0xa\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_WILLNEED                     = 0x3\n\tMADV_ZERO_WIRED_PAGES             = 0x6\n\tMAP_ANON                          = 0x1000\n\tMAP_ANONYMOUS                     = 0x1000\n\tMAP_COPY                          = 0x2\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_JIT                           = 0x800\n\tMAP_NOCACHE                       = 0x400\n\tMAP_NOEXTEND                      = 0x100\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_RESERVED0080                  = 0x80\n\tMAP_RESILIENT_CODESIGN            = 0x2000\n\tMAP_RESILIENT_MEDIA               = 0x4000\n\tMAP_SHARED                        = 0x1\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMNT_ASYNC                         = 0x40\n\tMNT_AUTOMOUNTED                   = 0x400000\n\tMNT_CMDFLAGS                      = 0xf0000\n\tMNT_CPROTECT                      = 0x80\n\tMNT_DEFWRITE                      = 0x2000000\n\tMNT_DONTBROWSE                    = 0x100000\n\tMNT_DOVOLFS                       = 0x8000\n\tMNT_DWAIT                         = 0x4\n\tMNT_EXPORTED                      = 0x100\n\tMNT_FORCE                         = 0x80000\n\tMNT_IGNORE_OWNERSHIP              = 0x200000\n\tMNT_JOURNALED                     = 0x800000\n\tMNT_LOCAL                         = 0x1000\n\tMNT_MULTILABEL                    = 0x4000000\n\tMNT_NOATIME                       = 0x10000000\n\tMNT_NOBLOCK                       = 0x20000\n\tMNT_NODEV                         = 0x10\n\tMNT_NOEXEC                        = 0x4\n\tMNT_NOSUID                        = 0x8\n\tMNT_NOUSERXATTR                   = 0x1000000\n\tMNT_NOWAIT                        = 0x2\n\tMNT_QUARANTINE                    = 0x400\n\tMNT_QUOTA                         = 0x2000\n\tMNT_RDONLY                        = 0x1\n\tMNT_RELOAD                        = 0x40000\n\tMNT_ROOTFS                        = 0x4000\n\tMNT_SYNCHRONOUS                   = 0x2\n\tMNT_UNION                         = 0x20\n\tMNT_UNKNOWNPERMISSIONS            = 0x200000\n\tMNT_UPDATE                        = 0x10000\n\tMNT_VISFLAGMASK                   = 0x17f0f5ff\n\tMNT_WAIT                          = 0x1\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOF                           = 0x100\n\tMSG_EOR                           = 0x8\n\tMSG_FLUSH                         = 0x400\n\tMSG_HAVEMORE                      = 0x2000\n\tMSG_HOLD                          = 0x800\n\tMSG_NEEDSA                        = 0x10000\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_RCVMORE                       = 0x4000\n\tMSG_SEND                          = 0x1000\n\tMSG_TRUNC                         = 0x10\n\tMSG_WAITALL                       = 0x40\n\tMSG_WAITSTREAM                    = 0x200\n\tMS_ASYNC                          = 0x1\n\tMS_DEACTIVATE                     = 0x8\n\tMS_INVALIDATE                     = 0x2\n\tMS_KILLPAGES                      = 0x4\n\tMS_SYNC                           = 0x10\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_DUMP2                      = 0x7\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_IFLIST2                    = 0x6\n\tNET_RT_MAXID                      = 0xa\n\tNET_RT_STAT                       = 0x4\n\tNET_RT_TRASH                      = 0x5\n\tNL0                               = 0x0\n\tNL1                               = 0x100\n\tNL2                               = 0x200\n\tNL3                               = 0x300\n\tNLDLY                             = 0x300\n\tNOFLSH                            = 0x80000000\n\tNOKERNINFO                        = 0x2000000\n\tNOTE_ABSOLUTE                     = 0x8\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_BACKGROUND                   = 0x40\n\tNOTE_CHILD                        = 0x4\n\tNOTE_CRITICAL                     = 0x20\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXITSTATUS                   = 0x4000000\n\tNOTE_EXIT_CSERROR                 = 0x40000\n\tNOTE_EXIT_DECRYPTFAIL             = 0x10000\n\tNOTE_EXIT_DETAIL                  = 0x2000000\n\tNOTE_EXIT_DETAIL_MASK             = 0x70000\n\tNOTE_EXIT_MEMORY                  = 0x20000\n\tNOTE_EXIT_REPARENTED              = 0x80000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FFAND                        = 0x40000000\n\tNOTE_FFCOPY                       = 0xc0000000\n\tNOTE_FFCTRLMASK                   = 0xc0000000\n\tNOTE_FFLAGSMASK                   = 0xffffff\n\tNOTE_FFNOP                        = 0x0\n\tNOTE_FFOR                         = 0x80000000\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_FUNLOCK                      = 0x100\n\tNOTE_LEEWAY                       = 0x10\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_MACH_CONTINUOUS_TIME         = 0x80\n\tNOTE_NONE                         = 0x80\n\tNOTE_NSECONDS                     = 0x4\n\tNOTE_OOB                          = 0x2\n\tNOTE_PCTRLMASK                    = -0x100000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_REAP                         = 0x10000000\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_SECONDS                      = 0x1\n\tNOTE_SIGNAL                       = 0x8000000\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRIGGER                      = 0x1000000\n\tNOTE_USECONDS                     = 0x2\n\tNOTE_VM_ERROR                     = 0x10000000\n\tNOTE_VM_PRESSURE                  = 0x80000000\n\tNOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000\n\tNOTE_VM_PRESSURE_TERMINATE        = 0x40000000\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tOFDEL                             = 0x20000\n\tOFILL                             = 0x80\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tOXTABS                            = 0x4\n\tO_ACCMODE                         = 0x3\n\tO_ALERT                           = 0x20000000\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x1000000\n\tO_CREAT                           = 0x200\n\tO_DIRECTORY                       = 0x100000\n\tO_DP_GETRAWENCRYPTED              = 0x1\n\tO_DP_GETRAWUNENCRYPTED            = 0x2\n\tO_DSYNC                           = 0x400000\n\tO_EVTONLY                         = 0x8000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x20000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_POPUP                           = 0x80000000\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_SHLOCK                          = 0x10\n\tO_SYMLINK                         = 0x200000\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tPT_ATTACH                         = 0xa\n\tPT_ATTACHEXC                      = 0xe\n\tPT_CONTINUE                       = 0x7\n\tPT_DENY_ATTACH                    = 0x1f\n\tPT_DETACH                         = 0xb\n\tPT_FIRSTMACH                      = 0x20\n\tPT_FORCEQUOTA                     = 0x1e\n\tPT_KILL                           = 0x8\n\tPT_READ_D                         = 0x2\n\tPT_READ_I                         = 0x1\n\tPT_READ_U                         = 0x3\n\tPT_SIGEXC                         = 0xc\n\tPT_STEP                           = 0x9\n\tPT_THUPDATE                       = 0xd\n\tPT_TRACE_ME                       = 0x0\n\tPT_WRITE_D                        = 0x5\n\tPT_WRITE_I                        = 0x4\n\tPT_WRITE_U                        = 0x6\n\tRLIMIT_AS                         = 0x5\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_CPU_USAGE_MONITOR          = 0x2\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_MEMLOCK                    = 0x6\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_NPROC                      = 0x7\n\tRLIMIT_RSS                        = 0x5\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0x8\n\tRTAX_NETMASK                      = 0x2\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_NETMASK                       = 0x4\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_BROADCAST                     = 0x400000\n\tRTF_CLONING                       = 0x100\n\tRTF_CONDEMNED                     = 0x2000000\n\tRTF_DELCLONE                      = 0x80\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_IFREF                         = 0x4000000\n\tRTF_IFSCOPE                       = 0x1000000\n\tRTF_LLINFO                        = 0x400\n\tRTF_LOCAL                         = 0x200000\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MULTICAST                     = 0x800000\n\tRTF_NOIFREF                       = 0x2000\n\tRTF_PINNED                        = 0x100000\n\tRTF_PRCLONING                     = 0x10000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x40000\n\tRTF_PROXY                         = 0x8000000\n\tRTF_REJECT                        = 0x8\n\tRTF_ROUTER                        = 0x10000000\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_WASCLONED                     = 0x20000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DELMADDR                      = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_GET2                          = 0x14\n\tRTM_IFINFO                        = 0xe\n\tRTM_IFINFO2                       = 0x12\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_NEWMADDR                      = 0xf\n\tRTM_NEWMADDR2                     = 0x13\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x5\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x3\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x2\n\tSCM_TIMESTAMP_MONOTONIC           = 0x4\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCARPIPLL                       = 0xc0206928\n\tSIOCATMARK                        = 0x40047307\n\tSIOCAUTOADDR                      = 0xc0206926\n\tSIOCAUTONETMASK                   = 0x80206927\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFPHYADDR                    = 0x80206941\n\tSIOCGDRVSPEC                      = 0xc01c697b\n\tSIOCGETVLAN                       = 0xc020697f\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFALTMTU                     = 0xc0206948\n\tSIOCGIFASYNCMAP                   = 0xc020697c\n\tSIOCGIFBOND                       = 0xc0206947\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCAP                        = 0xc020695b\n\tSIOCGIFCONF                       = 0xc0086924\n\tSIOCGIFDEVMTU                     = 0xc0206944\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFKPI                        = 0xc0206987\n\tSIOCGIFMAC                        = 0xc0206982\n\tSIOCGIFMEDIA                      = 0xc0286938\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc0206933\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206940\n\tSIOCGIFPHYS                       = 0xc0206935\n\tSIOCGIFPSRCADDR                   = 0xc020693f\n\tSIOCGIFSTATUS                     = 0xc331693d\n\tSIOCGIFVLAN                       = 0xc020697f\n\tSIOCGIFWAKEFLAGS                  = 0xc0206988\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCIFCREATE                      = 0xc0206978\n\tSIOCIFCREATE2                     = 0xc020697a\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc00c6981\n\tSIOCRSLVMULTI                     = 0xc008693b\n\tSIOCSDRVSPEC                      = 0x801c697b\n\tSIOCSETVLAN                       = 0x8020697e\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFALTMTU                     = 0x80206945\n\tSIOCSIFASYNCMAP                   = 0x8020697d\n\tSIOCSIFBOND                       = 0x80206946\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFCAP                        = 0x8020695a\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFKPI                        = 0x80206986\n\tSIOCSIFLLADDR                     = 0x8020693c\n\tSIOCSIFMAC                        = 0x80206983\n\tSIOCSIFMEDIA                      = 0xc0206937\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x80206934\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x8040693e\n\tSIOCSIFPHYS                       = 0x80206936\n\tSIOCSIFVLAN                       = 0x8020697e\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_MAXADDRLEN                   = 0xff\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_DONTTRUNC                      = 0x2000\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LABEL                          = 0x1010\n\tSO_LINGER                         = 0x80\n\tSO_LINGER_SEC                     = 0x1080\n\tSO_NETSVC_MARKING_LEVEL           = 0x1119\n\tSO_NET_SERVICE_TYPE               = 0x1116\n\tSO_NKE                            = 0x1021\n\tSO_NOADDRERR                      = 0x1023\n\tSO_NOSIGPIPE                      = 0x1022\n\tSO_NOTIFYCONFLICT                 = 0x1026\n\tSO_NP_EXTENSIONS                  = 0x1083\n\tSO_NREAD                          = 0x1020\n\tSO_NUMRCVPKT                      = 0x1112\n\tSO_NWRITE                         = 0x1024\n\tSO_OOBINLINE                      = 0x100\n\tSO_PEERLABEL                      = 0x1011\n\tSO_RANDOMPORT                     = 0x1082\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_REUSESHAREUID                  = 0x1025\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_TIMESTAMP                      = 0x400\n\tSO_TIMESTAMP_MONOTONIC            = 0x800\n\tSO_TYPE                           = 0x1008\n\tSO_UPCALLCLOSEWAIT                = 0x1027\n\tSO_USELOOPBACK                    = 0x40\n\tSO_WANTMORE                       = 0x4000\n\tSO_WANTOOBFLAG                    = 0x8000\n\tS_IEXEC                           = 0x40\n\tS_IFBLK                           = 0x6000\n\tS_IFCHR                           = 0x2000\n\tS_IFDIR                           = 0x4000\n\tS_IFIFO                           = 0x1000\n\tS_IFLNK                           = 0xa000\n\tS_IFMT                            = 0xf000\n\tS_IFREG                           = 0x8000\n\tS_IFSOCK                          = 0xc000\n\tS_IFWHT                           = 0xe000\n\tS_IREAD                           = 0x100\n\tS_IRGRP                           = 0x20\n\tS_IROTH                           = 0x4\n\tS_IRUSR                           = 0x100\n\tS_IRWXG                           = 0x38\n\tS_IRWXO                           = 0x7\n\tS_IRWXU                           = 0x1c0\n\tS_ISGID                           = 0x400\n\tS_ISTXT                           = 0x200\n\tS_ISUID                           = 0x800\n\tS_ISVTX                           = 0x200\n\tS_IWGRP                           = 0x10\n\tS_IWOTH                           = 0x2\n\tS_IWRITE                          = 0x80\n\tS_IWUSR                           = 0x80\n\tS_IXGRP                           = 0x8\n\tS_IXOTH                           = 0x1\n\tS_IXUSR                           = 0x40\n\tTAB0                              = 0x0\n\tTAB1                              = 0x400\n\tTAB2                              = 0x800\n\tTAB3                              = 0x4\n\tTABDLY                            = 0xc04\n\tTCIFLUSH                          = 0x1\n\tTCIOFF                            = 0x3\n\tTCIOFLUSH                         = 0x3\n\tTCION                             = 0x4\n\tTCOFLUSH                          = 0x2\n\tTCOOFF                            = 0x1\n\tTCOON                             = 0x2\n\tTCP_CONNECTIONTIMEOUT             = 0x20\n\tTCP_CONNECTION_INFO               = 0x106\n\tTCP_ENABLE_ECN                    = 0x104\n\tTCP_FASTOPEN                      = 0x105\n\tTCP_KEEPALIVE                     = 0x10\n\tTCP_KEEPCNT                       = 0x102\n\tTCP_KEEPINTVL                     = 0x101\n\tTCP_MAXHLEN                       = 0x3c\n\tTCP_MAXOLEN                       = 0x28\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_SACK                      = 0x4\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MINMSS                        = 0xd8\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOOPT                         = 0x8\n\tTCP_NOPUSH                        = 0x4\n\tTCP_NOTSENT_LOWAT                 = 0x201\n\tTCP_RXT_CONNDROPTIME              = 0x80\n\tTCP_RXT_FINDROP                   = 0x100\n\tTCP_SENDMOREACKS                  = 0x103\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x40087458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCDSIMICROCODE                  = 0x20007455\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGDRAINWAIT                    = 0x40047456\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCIXOFF                         = 0x20007480\n\tTIOCIXON                          = 0x20007481\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGDTRWAIT                     = 0x4004745a\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x40047403\n\tTIOCMODS                          = 0x80047404\n\tTIOCMSDTRWAIT                     = 0x8004745b\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCPTYGNAME                      = 0x40807453\n\tTIOCPTYGRANT                      = 0x20007454\n\tTIOCPTYUNLK                       = 0x20007452\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCONS                         = 0x20007463\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDRAINWAIT                    = 0x80047457\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x20007465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCTIMESTAMP                     = 0x40087459\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVM_LOADAVG                        = 0x2\n\tVM_MACHFACTOR                     = 0x4\n\tVM_MAXID                          = 0x6\n\tVM_METER                          = 0x1\n\tVM_SWAPUSAGE                      = 0x5\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVT0                               = 0x0\n\tVT1                               = 0x10000\n\tVTDLY                             = 0x10000\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWCONTINUED                        = 0x10\n\tWCOREFLAG                         = 0x80\n\tWEXITED                           = 0x4\n\tWNOHANG                           = 0x1\n\tWNOWAIT                           = 0x20\n\tWORDSIZE                          = 0x20\n\tWSTOPPED                          = 0x8\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADARCH        = syscall.Errno(0x56)\n\tEBADEXEC        = syscall.Errno(0x55)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMACHO       = syscall.Errno(0x58)\n\tEBADMSG         = syscall.Errno(0x5e)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x59)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDEVERR         = syscall.Errno(0x53)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x5a)\n\tEILSEQ          = syscall.Errno(0x5c)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x6a)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5f)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x5d)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODATA         = syscall.Errno(0x60)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x61)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x5b)\n\tENOPOLICY       = syscall.Errno(0x67)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x62)\n\tENOSTR          = syscall.Errno(0x63)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTRECOVERABLE = syscall.Errno(0x68)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x66)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEOWNERDEAD      = syscall.Errno(0x69)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x64)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tEPWROFF         = syscall.Errno(0x52)\n\tEQFULL          = syscall.Errno(0x6a)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHLIBVERS      = syscall.Errno(0x57)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIME           = syscall.Errno(0x65)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"device not configured\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource deadlock avoided\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"resource busy\",\n\t17:  \"file exists\",\n\t18:  \"cross-device link\",\n\t19:  \"operation not supported by device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"result too large\",\n\t35:  \"resource temporarily unavailable\",\n\t36:  \"operation now in progress\",\n\t37:  \"operation already in progress\",\n\t38:  \"socket operation on non-socket\",\n\t39:  \"destination address required\",\n\t40:  \"message too long\",\n\t41:  \"protocol wrong type for socket\",\n\t42:  \"protocol not available\",\n\t43:  \"protocol not supported\",\n\t44:  \"socket type not supported\",\n\t45:  \"operation not supported\",\n\t46:  \"protocol family not supported\",\n\t47:  \"address family not supported by protocol family\",\n\t48:  \"address already in use\",\n\t49:  \"can't assign requested address\",\n\t50:  \"network is down\",\n\t51:  \"network is unreachable\",\n\t52:  \"network dropped connection on reset\",\n\t53:  \"software caused connection abort\",\n\t54:  \"connection reset by peer\",\n\t55:  \"no buffer space available\",\n\t56:  \"socket is already connected\",\n\t57:  \"socket is not connected\",\n\t58:  \"can't send after socket shutdown\",\n\t59:  \"too many references: can't splice\",\n\t60:  \"operation timed out\",\n\t61:  \"connection refused\",\n\t62:  \"too many levels of symbolic links\",\n\t63:  \"file name too long\",\n\t64:  \"host is down\",\n\t65:  \"no route to host\",\n\t66:  \"directory not empty\",\n\t67:  \"too many processes\",\n\t68:  \"too many users\",\n\t69:  \"disc quota exceeded\",\n\t70:  \"stale NFS file handle\",\n\t71:  \"too many levels of remote in path\",\n\t72:  \"RPC struct is bad\",\n\t73:  \"RPC version wrong\",\n\t74:  \"RPC prog. not avail\",\n\t75:  \"program version wrong\",\n\t76:  \"bad procedure for program\",\n\t77:  \"no locks available\",\n\t78:  \"function not implemented\",\n\t79:  \"inappropriate file type or format\",\n\t80:  \"authentication error\",\n\t81:  \"need authenticator\",\n\t82:  \"device power is off\",\n\t83:  \"device error\",\n\t84:  \"value too large to be stored in data type\",\n\t85:  \"bad executable (or shared library)\",\n\t86:  \"bad CPU type in executable\",\n\t87:  \"shared library version mismatch\",\n\t88:  \"malformed Mach-o file\",\n\t89:  \"operation canceled\",\n\t90:  \"identifier removed\",\n\t91:  \"no message of desired type\",\n\t92:  \"illegal byte sequence\",\n\t93:  \"attribute not found\",\n\t94:  \"bad message\",\n\t95:  \"EMULTIHOP (Reserved)\",\n\t96:  \"no message available on STREAM\",\n\t97:  \"ENOLINK (Reserved)\",\n\t98:  \"no STREAM resources\",\n\t99:  \"not a STREAM\",\n\t100: \"protocol error\",\n\t101: \"STREAM ioctl timeout\",\n\t102: \"operation not supported on socket\",\n\t103: \"policy not found\",\n\t104: \"state not recoverable\",\n\t105: \"previous owner died\",\n\t106: \"interface output queue is full\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go",
    "content": "// mkerrors.sh -m64\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,darwin\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1c\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x25\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x1e\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1c\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x28\n\tAF_NATM                           = 0x1f\n\tAF_NDRV                           = 0x1b\n\tAF_NETBIOS                        = 0x21\n\tAF_NS                             = 0x6\n\tAF_OSI                            = 0x7\n\tAF_PPP                            = 0x22\n\tAF_PUP                            = 0x4\n\tAF_RESERVED_36                    = 0x24\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x18\n\tAF_SNA                            = 0xb\n\tAF_SYSTEM                         = 0x20\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tAF_UTUN                           = 0x26\n\tALTWERASE                         = 0x200\n\tATTR_BIT_MAP_COUNT                = 0x5\n\tATTR_CMN_ACCESSMASK               = 0x20000\n\tATTR_CMN_ACCTIME                  = 0x1000\n\tATTR_CMN_ADDEDTIME                = 0x10000000\n\tATTR_CMN_BKUPTIME                 = 0x2000\n\tATTR_CMN_CHGTIME                  = 0x800\n\tATTR_CMN_CRTIME                   = 0x200\n\tATTR_CMN_DATA_PROTECT_FLAGS       = 0x40000000\n\tATTR_CMN_DEVID                    = 0x2\n\tATTR_CMN_DOCUMENT_ID              = 0x100000\n\tATTR_CMN_ERROR                    = 0x20000000\n\tATTR_CMN_EXTENDED_SECURITY        = 0x400000\n\tATTR_CMN_FILEID                   = 0x2000000\n\tATTR_CMN_FLAGS                    = 0x40000\n\tATTR_CMN_FNDRINFO                 = 0x4000\n\tATTR_CMN_FSID                     = 0x4\n\tATTR_CMN_FULLPATH                 = 0x8000000\n\tATTR_CMN_GEN_COUNT                = 0x80000\n\tATTR_CMN_GRPID                    = 0x10000\n\tATTR_CMN_GRPUUID                  = 0x1000000\n\tATTR_CMN_MODTIME                  = 0x400\n\tATTR_CMN_NAME                     = 0x1\n\tATTR_CMN_NAMEDATTRCOUNT           = 0x80000\n\tATTR_CMN_NAMEDATTRLIST            = 0x100000\n\tATTR_CMN_OBJID                    = 0x20\n\tATTR_CMN_OBJPERMANENTID           = 0x40\n\tATTR_CMN_OBJTAG                   = 0x10\n\tATTR_CMN_OBJTYPE                  = 0x8\n\tATTR_CMN_OWNERID                  = 0x8000\n\tATTR_CMN_PARENTID                 = 0x4000000\n\tATTR_CMN_PAROBJID                 = 0x80\n\tATTR_CMN_RETURNED_ATTRS           = 0x80000000\n\tATTR_CMN_SCRIPT                   = 0x100\n\tATTR_CMN_SETMASK                  = 0x41c7ff00\n\tATTR_CMN_USERACCESS               = 0x200000\n\tATTR_CMN_UUID                     = 0x800000\n\tATTR_CMN_VALIDMASK                = 0xffffffff\n\tATTR_CMN_VOLSETMASK               = 0x6700\n\tATTR_FILE_ALLOCSIZE               = 0x4\n\tATTR_FILE_CLUMPSIZE               = 0x10\n\tATTR_FILE_DATAALLOCSIZE           = 0x400\n\tATTR_FILE_DATAEXTENTS             = 0x800\n\tATTR_FILE_DATALENGTH              = 0x200\n\tATTR_FILE_DEVTYPE                 = 0x20\n\tATTR_FILE_FILETYPE                = 0x40\n\tATTR_FILE_FORKCOUNT               = 0x80\n\tATTR_FILE_FORKLIST                = 0x100\n\tATTR_FILE_IOBLOCKSIZE             = 0x8\n\tATTR_FILE_LINKCOUNT               = 0x1\n\tATTR_FILE_RSRCALLOCSIZE           = 0x2000\n\tATTR_FILE_RSRCEXTENTS             = 0x4000\n\tATTR_FILE_RSRCLENGTH              = 0x1000\n\tATTR_FILE_SETMASK                 = 0x20\n\tATTR_FILE_TOTALSIZE               = 0x2\n\tATTR_FILE_VALIDMASK               = 0x37ff\n\tATTR_VOL_ALLOCATIONCLUMP          = 0x40\n\tATTR_VOL_ATTRIBUTES               = 0x40000000\n\tATTR_VOL_CAPABILITIES             = 0x20000\n\tATTR_VOL_DIRCOUNT                 = 0x400\n\tATTR_VOL_ENCODINGSUSED            = 0x10000\n\tATTR_VOL_FILECOUNT                = 0x200\n\tATTR_VOL_FSTYPE                   = 0x1\n\tATTR_VOL_INFO                     = 0x80000000\n\tATTR_VOL_IOBLOCKSIZE              = 0x80\n\tATTR_VOL_MAXOBJCOUNT              = 0x800\n\tATTR_VOL_MINALLOCATION            = 0x20\n\tATTR_VOL_MOUNTEDDEVICE            = 0x8000\n\tATTR_VOL_MOUNTFLAGS               = 0x4000\n\tATTR_VOL_MOUNTPOINT               = 0x1000\n\tATTR_VOL_NAME                     = 0x2000\n\tATTR_VOL_OBJCOUNT                 = 0x100\n\tATTR_VOL_QUOTA_SIZE               = 0x10000000\n\tATTR_VOL_RESERVED_SIZE            = 0x20000000\n\tATTR_VOL_SETMASK                  = 0x80002000\n\tATTR_VOL_SIGNATURE                = 0x2\n\tATTR_VOL_SIZE                     = 0x4\n\tATTR_VOL_SPACEAVAIL               = 0x10\n\tATTR_VOL_SPACEFREE                = 0x8\n\tATTR_VOL_UUID                     = 0x40000\n\tATTR_VOL_VALIDMASK                = 0xf007ffff\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc00c4279\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044272\n\tBIOCGRTIMEOUT                     = 0x4010426e\n\tBIOCGSEESENT                      = 0x40044276\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044278\n\tBIOCSETF                          = 0x80104267\n\tBIOCSETFNR                        = 0x8010427e\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044273\n\tBIOCSRTIMEOUT                     = 0x8010426d\n\tBIOCSSEESENT                      = 0x80044277\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x80000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tBS0                               = 0x0\n\tBS1                               = 0x8000\n\tBSDLY                             = 0x8000\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCLOCK_MONOTONIC                   = 0x6\n\tCLOCK_MONOTONIC_RAW               = 0x4\n\tCLOCK_MONOTONIC_RAW_APPROX        = 0x5\n\tCLOCK_PROCESS_CPUTIME_ID          = 0xc\n\tCLOCK_REALTIME                    = 0x0\n\tCLOCK_THREAD_CPUTIME_ID           = 0x10\n\tCLOCK_UPTIME_RAW                  = 0x8\n\tCLOCK_UPTIME_RAW_APPROX           = 0x9\n\tCR0                               = 0x0\n\tCR1                               = 0x1000\n\tCR2                               = 0x2000\n\tCR3                               = 0x3000\n\tCRDLY                             = 0x3000\n\tCREAD                             = 0x800\n\tCRTSCTS                           = 0x30000\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_AOS                           = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CAN_SOCKETCAN                 = 0xe3\n\tDLT_CHAOS                         = 0x5\n\tDLT_CHDLC                         = 0x68\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DBUS                          = 0xe7\n\tDLT_DECT                          = 0xdd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_DVB_CI                        = 0xeb\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FC_2                          = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS        = 0xe1\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_GSMTAP_ABIS                   = 0xda\n\tDLT_GSMTAP_UM                     = 0xd9\n\tDLT_HHDLC                         = 0x79\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NOFCS            = 0xe6\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPFILTER                      = 0x74\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IPNET                         = 0xe2\n\tDLT_IPOIB                         = 0xf2\n\tDLT_IPV4                          = 0xe4\n\tDLT_IPV6                          = 0xe5\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_ATM_CEMIC             = 0xee\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FIBRECHANNEL          = 0xea\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_SRX_E2E               = 0xe9\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_JUNIPER_VS                    = 0xe8\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_EVDEV                   = 0xd8\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_PPP_WITHDIRECTION       = 0xa6\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MATCHING_MAX                  = 0xf5\n\tDLT_MATCHING_MIN                  = 0x68\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MPEG_2_TS                     = 0xf3\n\tDLT_MPLS                          = 0xdb\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_MUX27010                      = 0xec\n\tDLT_NETANALYZER                   = 0xf0\n\tDLT_NETANALYZER_TRANSPARENT       = 0xf1\n\tDLT_NFC_LLCP                      = 0xf5\n\tDLT_NFLOG                         = 0xef\n\tDLT_NG40                          = 0xf4\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PPP_WITH_DIRECTION            = 0xa6\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDLT_STANAG_5066_D_PDU             = 0xed\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_USB_LINUX_MMAPPED             = 0xdc\n\tDLT_USER0                         = 0x93\n\tDLT_USER1                         = 0x94\n\tDLT_USER10                        = 0x9d\n\tDLT_USER11                        = 0x9e\n\tDLT_USER12                        = 0x9f\n\tDLT_USER13                        = 0xa0\n\tDLT_USER14                        = 0xa1\n\tDLT_USER15                        = 0xa2\n\tDLT_USER2                         = 0x95\n\tDLT_USER3                         = 0x96\n\tDLT_USER4                         = 0x97\n\tDLT_USER5                         = 0x98\n\tDLT_USER6                         = 0x99\n\tDLT_USER7                         = 0x9a\n\tDLT_USER8                         = 0x9b\n\tDLT_USER9                         = 0x9c\n\tDLT_WIHART                        = 0xdf\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_EXCEPT                     = -0xf\n\tEVFILT_FS                         = -0x9\n\tEVFILT_MACHPORT                   = -0x8\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0xf\n\tEVFILT_THREADMARKER               = 0xf\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_USER                       = -0xa\n\tEVFILT_VM                         = -0xc\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_DISPATCH                       = 0x80\n\tEV_DISPATCH2                      = 0x180\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG0                          = 0x1000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_OOBAND                         = 0x2000\n\tEV_POLL                           = 0x1000\n\tEV_RECEIPT                        = 0x40\n\tEV_SYSFLAGS                       = 0xf000\n\tEV_UDATA_SPECIFIC                 = 0x100\n\tEV_VANISHED                       = 0x200\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFF0                               = 0x0\n\tFF1                               = 0x4000\n\tFFDLY                             = 0x4000\n\tFLUSHO                            = 0x800000\n\tFSOPT_ATTR_CMN_EXTENDED           = 0x20\n\tFSOPT_NOFOLLOW                    = 0x1\n\tFSOPT_NOINMEMUPDATE               = 0x2\n\tFSOPT_PACK_INVAL_ATTRS            = 0x8\n\tFSOPT_REPORT_FULLSIZE             = 0x4\n\tF_ADDFILESIGS                     = 0x3d\n\tF_ADDFILESIGS_FOR_DYLD_SIM        = 0x53\n\tF_ADDFILESIGS_RETURN              = 0x61\n\tF_ADDSIGS                         = 0x3b\n\tF_ALLOCATEALL                     = 0x4\n\tF_ALLOCATECONTIG                  = 0x2\n\tF_BARRIERFSYNC                    = 0x55\n\tF_CHECK_LV                        = 0x62\n\tF_CHKCLEAN                        = 0x29\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0x43\n\tF_FINDSIGS                        = 0x4e\n\tF_FLUSH_DATA                      = 0x28\n\tF_FREEZE_FS                       = 0x35\n\tF_FULLFSYNC                       = 0x33\n\tF_GETCODEDIR                      = 0x48\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETLKPID                        = 0x42\n\tF_GETNOSIGPIPE                    = 0x4a\n\tF_GETOWN                          = 0x5\n\tF_GETPATH                         = 0x32\n\tF_GETPATH_MTMINFO                 = 0x47\n\tF_GETPROTECTIONCLASS              = 0x3f\n\tF_GETPROTECTIONLEVEL              = 0x4d\n\tF_GLOBAL_NOCACHE                  = 0x37\n\tF_LOG2PHYS                        = 0x31\n\tF_LOG2PHYS_EXT                    = 0x41\n\tF_NOCACHE                         = 0x30\n\tF_NODIRECT                        = 0x3e\n\tF_OK                              = 0x0\n\tF_PATHPKG_CHECK                   = 0x34\n\tF_PEOFPOSMODE                     = 0x3\n\tF_PREALLOCATE                     = 0x2a\n\tF_PUNCHHOLE                       = 0x63\n\tF_RDADVISE                        = 0x2c\n\tF_RDAHEAD                         = 0x2d\n\tF_RDLCK                           = 0x1\n\tF_SETBACKINGSTORE                 = 0x46\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETLKWTIMEOUT                   = 0xa\n\tF_SETNOSIGPIPE                    = 0x49\n\tF_SETOWN                          = 0x6\n\tF_SETPROTECTIONCLASS              = 0x40\n\tF_SETSIZE                         = 0x2b\n\tF_SINGLE_WRITER                   = 0x4c\n\tF_THAW_FS                         = 0x36\n\tF_TRANSCODEKEY                    = 0x4b\n\tF_TRIM_ACTIVE_FILE                = 0x64\n\tF_UNLCK                           = 0x2\n\tF_VOLPOSMODE                      = 0x4\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_ALTPHYS                       = 0x4000\n\tIFF_BROADCAST                     = 0x2\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_AAL5                          = 0x31\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ATM                           = 0x25\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_CARP                          = 0xf8\n\tIFT_CELLULAR                      = 0xff\n\tIFT_CEPT                          = 0x13\n\tIFT_DS3                           = 0x1e\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0x38\n\tIFT_FDDI                          = 0xf\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_GIF                           = 0x37\n\tIFT_HDH1822                       = 0x3\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE8023ADLAG                 = 0x88\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88026                      = 0xa\n\tIFT_L2VLAN                        = 0x87\n\tIFT_LAPB                          = 0x10\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_NSIP                          = 0x1b\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PDP                           = 0xff\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PKTAP                         = 0xfe\n\tIFT_PPP                           = 0x17\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_RS232                         = 0x21\n\tIFT_SDLC                          = 0x11\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0x39\n\tIFT_T1                            = 0x12\n\tIFT_ULTRA                         = 0x1d\n\tIFT_V35                           = 0x2d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LINKLOCALNETNUM                = 0xa9fe0000\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_3PC                       = 0x22\n\tIPPROTO_ADFS                      = 0x44\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_AHIP                      = 0x3d\n\tIPPROTO_APES                      = 0x63\n\tIPPROTO_ARGUS                     = 0xd\n\tIPPROTO_AX25                      = 0x5d\n\tIPPROTO_BHA                       = 0x31\n\tIPPROTO_BLT                       = 0x1e\n\tIPPROTO_BRSATMON                  = 0x4c\n\tIPPROTO_CFTP                      = 0x3e\n\tIPPROTO_CHAOS                     = 0x10\n\tIPPROTO_CMTP                      = 0x26\n\tIPPROTO_CPHB                      = 0x49\n\tIPPROTO_CPNX                      = 0x48\n\tIPPROTO_DDP                       = 0x25\n\tIPPROTO_DGP                       = 0x56\n\tIPPROTO_DIVERT                    = 0xfe\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_EMCON                     = 0xe\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GMTP                      = 0x64\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HELLO                     = 0x3f\n\tIPPROTO_HMP                       = 0x14\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IDPR                      = 0x23\n\tIPPROTO_IDRP                      = 0x2d\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IGP                       = 0x55\n\tIPPROTO_IGRP                      = 0x58\n\tIPPROTO_IL                        = 0x28\n\tIPPROTO_INLSP                     = 0x34\n\tIPPROTO_INP                       = 0x20\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPCV                      = 0x47\n\tIPPROTO_IPEIP                     = 0x5e\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPPC                      = 0x43\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IRTP                      = 0x1c\n\tIPPROTO_KRYPTOLAN                 = 0x41\n\tIPPROTO_LARP                      = 0x5b\n\tIPPROTO_LEAF1                     = 0x19\n\tIPPROTO_LEAF2                     = 0x1a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MEAS                      = 0x13\n\tIPPROTO_MHRP                      = 0x30\n\tIPPROTO_MICP                      = 0x5f\n\tIPPROTO_MTP                       = 0x5c\n\tIPPROTO_MUX                       = 0x12\n\tIPPROTO_ND                        = 0x4d\n\tIPPROTO_NHRP                      = 0x36\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_NSP                       = 0x1f\n\tIPPROTO_NVPII                     = 0xb\n\tIPPROTO_OSPFIGP                   = 0x59\n\tIPPROTO_PGM                       = 0x71\n\tIPPROTO_PIGP                      = 0x9\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PRM                       = 0x15\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_PVP                       = 0x4b\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_RCCMON                    = 0xa\n\tIPPROTO_RDP                       = 0x1b\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_RVD                       = 0x42\n\tIPPROTO_SATEXPAK                  = 0x40\n\tIPPROTO_SATMON                    = 0x45\n\tIPPROTO_SCCSP                     = 0x60\n\tIPPROTO_SCTP                      = 0x84\n\tIPPROTO_SDRP                      = 0x2a\n\tIPPROTO_SEP                       = 0x21\n\tIPPROTO_SRPC                      = 0x5a\n\tIPPROTO_ST                        = 0x7\n\tIPPROTO_SVMTP                     = 0x52\n\tIPPROTO_SWIPE                     = 0x35\n\tIPPROTO_TCF                       = 0x57\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_TPXX                      = 0x27\n\tIPPROTO_TRUNK1                    = 0x17\n\tIPPROTO_TRUNK2                    = 0x18\n\tIPPROTO_TTP                       = 0x54\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_VINES                     = 0x53\n\tIPPROTO_VISA                      = 0x46\n\tIPPROTO_VMTP                      = 0x51\n\tIPPROTO_WBEXPAK                   = 0x4f\n\tIPPROTO_WBMON                     = 0x4e\n\tIPPROTO_WSN                       = 0x4a\n\tIPPROTO_XNET                      = 0xf\n\tIPPROTO_XTP                       = 0x24\n\tIPV6_2292DSTOPTS                  = 0x17\n\tIPV6_2292HOPLIMIT                 = 0x14\n\tIPV6_2292HOPOPTS                  = 0x16\n\tIPV6_2292NEXTHOP                  = 0x15\n\tIPV6_2292PKTINFO                  = 0x13\n\tIPV6_2292PKTOPTIONS               = 0x19\n\tIPV6_2292RTHDR                    = 0x18\n\tIPV6_BINDV6ONLY                   = 0x1b\n\tIPV6_BOUND_IF                     = 0x7d\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FLOW_ECN_MASK                = 0x300\n\tIPV6_FRAGTTL                      = 0x3c\n\tIPV6_FW_ADD                       = 0x1e\n\tIPV6_FW_DEL                       = 0x1f\n\tIPV6_FW_FLUSH                     = 0x20\n\tIPV6_FW_GET                       = 0x22\n\tIPV6_FW_ZERO                      = 0x21\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXOPTHDR                    = 0x800\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MAX_GROUP_SRC_FILTER         = 0x200\n\tIPV6_MAX_MEMBERSHIPS              = 0xfff\n\tIPV6_MAX_SOCK_SRC_FILTER          = 0x80\n\tIPV6_MIN_MEMBERSHIPS              = 0x1f\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVTCLASS                   = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x24\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_ADD_SOURCE_MEMBERSHIP          = 0x46\n\tIP_BLOCK_SOURCE                   = 0x48\n\tIP_BOUND_IF                       = 0x19\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_DROP_SOURCE_MEMBERSHIP         = 0x47\n\tIP_DUMMYNET_CONFIGURE             = 0x3c\n\tIP_DUMMYNET_DEL                   = 0x3d\n\tIP_DUMMYNET_FLUSH                 = 0x3e\n\tIP_DUMMYNET_GET                   = 0x40\n\tIP_FAITH                          = 0x16\n\tIP_FW_ADD                         = 0x28\n\tIP_FW_DEL                         = 0x29\n\tIP_FW_FLUSH                       = 0x2a\n\tIP_FW_GET                         = 0x2c\n\tIP_FW_RESETLOG                    = 0x2d\n\tIP_FW_ZERO                        = 0x2b\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x15\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_GROUP_SRC_FILTER           = 0x200\n\tIP_MAX_MEMBERSHIPS                = 0xfff\n\tIP_MAX_SOCK_MUTE_FILTER           = 0x80\n\tIP_MAX_SOCK_SRC_FILTER            = 0x80\n\tIP_MF                             = 0x2000\n\tIP_MIN_MEMBERSHIPS                = 0x1f\n\tIP_MSFILTER                       = 0x4a\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_IFINDEX              = 0x42\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_MULTICAST_VIF                  = 0xe\n\tIP_NAT__XXX                       = 0x37\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OLD_FW_ADD                     = 0x32\n\tIP_OLD_FW_DEL                     = 0x33\n\tIP_OLD_FW_FLUSH                   = 0x34\n\tIP_OLD_FW_GET                     = 0x36\n\tIP_OLD_FW_RESETLOG                = 0x38\n\tIP_OLD_FW_ZERO                    = 0x35\n\tIP_OPTIONS                        = 0x1\n\tIP_PKTINFO                        = 0x1a\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVPKTINFO                    = 0x1a\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTOS                        = 0x1b\n\tIP_RECVTTL                        = 0x18\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RSVP_OFF                       = 0x10\n\tIP_RSVP_ON                        = 0xf\n\tIP_RSVP_VIF_OFF                   = 0x12\n\tIP_RSVP_VIF_ON                    = 0x11\n\tIP_STRIPHDR                       = 0x17\n\tIP_TOS                            = 0x3\n\tIP_TRAFFIC_MGT_BACKGROUND         = 0x41\n\tIP_TTL                            = 0x4\n\tIP_UNBLOCK_SOURCE                 = 0x49\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIUTF8                             = 0x4000\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_CAN_REUSE                    = 0x9\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x5\n\tMADV_FREE_REUSABLE                = 0x7\n\tMADV_FREE_REUSE                   = 0x8\n\tMADV_NORMAL                       = 0x0\n\tMADV_PAGEOUT                      = 0xa\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_WILLNEED                     = 0x3\n\tMADV_ZERO_WIRED_PAGES             = 0x6\n\tMAP_ANON                          = 0x1000\n\tMAP_ANONYMOUS                     = 0x1000\n\tMAP_COPY                          = 0x2\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_JIT                           = 0x800\n\tMAP_NOCACHE                       = 0x400\n\tMAP_NOEXTEND                      = 0x100\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_RESERVED0080                  = 0x80\n\tMAP_RESILIENT_CODESIGN            = 0x2000\n\tMAP_RESILIENT_MEDIA               = 0x4000\n\tMAP_SHARED                        = 0x1\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMNT_ASYNC                         = 0x40\n\tMNT_AUTOMOUNTED                   = 0x400000\n\tMNT_CMDFLAGS                      = 0xf0000\n\tMNT_CPROTECT                      = 0x80\n\tMNT_DEFWRITE                      = 0x2000000\n\tMNT_DONTBROWSE                    = 0x100000\n\tMNT_DOVOLFS                       = 0x8000\n\tMNT_DWAIT                         = 0x4\n\tMNT_EXPORTED                      = 0x100\n\tMNT_FORCE                         = 0x80000\n\tMNT_IGNORE_OWNERSHIP              = 0x200000\n\tMNT_JOURNALED                     = 0x800000\n\tMNT_LOCAL                         = 0x1000\n\tMNT_MULTILABEL                    = 0x4000000\n\tMNT_NOATIME                       = 0x10000000\n\tMNT_NOBLOCK                       = 0x20000\n\tMNT_NODEV                         = 0x10\n\tMNT_NOEXEC                        = 0x4\n\tMNT_NOSUID                        = 0x8\n\tMNT_NOUSERXATTR                   = 0x1000000\n\tMNT_NOWAIT                        = 0x2\n\tMNT_QUARANTINE                    = 0x400\n\tMNT_QUOTA                         = 0x2000\n\tMNT_RDONLY                        = 0x1\n\tMNT_RELOAD                        = 0x40000\n\tMNT_ROOTFS                        = 0x4000\n\tMNT_SYNCHRONOUS                   = 0x2\n\tMNT_UNION                         = 0x20\n\tMNT_UNKNOWNPERMISSIONS            = 0x200000\n\tMNT_UPDATE                        = 0x10000\n\tMNT_VISFLAGMASK                   = 0x17f0f5ff\n\tMNT_WAIT                          = 0x1\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOF                           = 0x100\n\tMSG_EOR                           = 0x8\n\tMSG_FLUSH                         = 0x400\n\tMSG_HAVEMORE                      = 0x2000\n\tMSG_HOLD                          = 0x800\n\tMSG_NEEDSA                        = 0x10000\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_RCVMORE                       = 0x4000\n\tMSG_SEND                          = 0x1000\n\tMSG_TRUNC                         = 0x10\n\tMSG_WAITALL                       = 0x40\n\tMSG_WAITSTREAM                    = 0x200\n\tMS_ASYNC                          = 0x1\n\tMS_DEACTIVATE                     = 0x8\n\tMS_INVALIDATE                     = 0x2\n\tMS_KILLPAGES                      = 0x4\n\tMS_SYNC                           = 0x10\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_DUMP2                      = 0x7\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_IFLIST2                    = 0x6\n\tNET_RT_MAXID                      = 0xa\n\tNET_RT_STAT                       = 0x4\n\tNET_RT_TRASH                      = 0x5\n\tNL0                               = 0x0\n\tNL1                               = 0x100\n\tNL2                               = 0x200\n\tNL3                               = 0x300\n\tNLDLY                             = 0x300\n\tNOFLSH                            = 0x80000000\n\tNOKERNINFO                        = 0x2000000\n\tNOTE_ABSOLUTE                     = 0x8\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_BACKGROUND                   = 0x40\n\tNOTE_CHILD                        = 0x4\n\tNOTE_CRITICAL                     = 0x20\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXITSTATUS                   = 0x4000000\n\tNOTE_EXIT_CSERROR                 = 0x40000\n\tNOTE_EXIT_DECRYPTFAIL             = 0x10000\n\tNOTE_EXIT_DETAIL                  = 0x2000000\n\tNOTE_EXIT_DETAIL_MASK             = 0x70000\n\tNOTE_EXIT_MEMORY                  = 0x20000\n\tNOTE_EXIT_REPARENTED              = 0x80000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FFAND                        = 0x40000000\n\tNOTE_FFCOPY                       = 0xc0000000\n\tNOTE_FFCTRLMASK                   = 0xc0000000\n\tNOTE_FFLAGSMASK                   = 0xffffff\n\tNOTE_FFNOP                        = 0x0\n\tNOTE_FFOR                         = 0x80000000\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_FUNLOCK                      = 0x100\n\tNOTE_LEEWAY                       = 0x10\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_MACH_CONTINUOUS_TIME         = 0x80\n\tNOTE_NONE                         = 0x80\n\tNOTE_NSECONDS                     = 0x4\n\tNOTE_OOB                          = 0x2\n\tNOTE_PCTRLMASK                    = -0x100000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_REAP                         = 0x10000000\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_SECONDS                      = 0x1\n\tNOTE_SIGNAL                       = 0x8000000\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRIGGER                      = 0x1000000\n\tNOTE_USECONDS                     = 0x2\n\tNOTE_VM_ERROR                     = 0x10000000\n\tNOTE_VM_PRESSURE                  = 0x80000000\n\tNOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000\n\tNOTE_VM_PRESSURE_TERMINATE        = 0x40000000\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tOFDEL                             = 0x20000\n\tOFILL                             = 0x80\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tOXTABS                            = 0x4\n\tO_ACCMODE                         = 0x3\n\tO_ALERT                           = 0x20000000\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x1000000\n\tO_CREAT                           = 0x200\n\tO_DIRECTORY                       = 0x100000\n\tO_DP_GETRAWENCRYPTED              = 0x1\n\tO_DP_GETRAWUNENCRYPTED            = 0x2\n\tO_DSYNC                           = 0x400000\n\tO_EVTONLY                         = 0x8000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x20000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_POPUP                           = 0x80000000\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_SHLOCK                          = 0x10\n\tO_SYMLINK                         = 0x200000\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tPT_ATTACH                         = 0xa\n\tPT_ATTACHEXC                      = 0xe\n\tPT_CONTINUE                       = 0x7\n\tPT_DENY_ATTACH                    = 0x1f\n\tPT_DETACH                         = 0xb\n\tPT_FIRSTMACH                      = 0x20\n\tPT_FORCEQUOTA                     = 0x1e\n\tPT_KILL                           = 0x8\n\tPT_READ_D                         = 0x2\n\tPT_READ_I                         = 0x1\n\tPT_READ_U                         = 0x3\n\tPT_SIGEXC                         = 0xc\n\tPT_STEP                           = 0x9\n\tPT_THUPDATE                       = 0xd\n\tPT_TRACE_ME                       = 0x0\n\tPT_WRITE_D                        = 0x5\n\tPT_WRITE_I                        = 0x4\n\tPT_WRITE_U                        = 0x6\n\tRLIMIT_AS                         = 0x5\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_CPU_USAGE_MONITOR          = 0x2\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_MEMLOCK                    = 0x6\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_NPROC                      = 0x7\n\tRLIMIT_RSS                        = 0x5\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0x8\n\tRTAX_NETMASK                      = 0x2\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_NETMASK                       = 0x4\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_BROADCAST                     = 0x400000\n\tRTF_CLONING                       = 0x100\n\tRTF_CONDEMNED                     = 0x2000000\n\tRTF_DELCLONE                      = 0x80\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_IFREF                         = 0x4000000\n\tRTF_IFSCOPE                       = 0x1000000\n\tRTF_LLINFO                        = 0x400\n\tRTF_LOCAL                         = 0x200000\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MULTICAST                     = 0x800000\n\tRTF_NOIFREF                       = 0x2000\n\tRTF_PINNED                        = 0x100000\n\tRTF_PRCLONING                     = 0x10000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x40000\n\tRTF_PROXY                         = 0x8000000\n\tRTF_REJECT                        = 0x8\n\tRTF_ROUTER                        = 0x10000000\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_WASCLONED                     = 0x20000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DELMADDR                      = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_GET2                          = 0x14\n\tRTM_IFINFO                        = 0xe\n\tRTM_IFINFO2                       = 0x12\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_NEWMADDR                      = 0xf\n\tRTM_NEWMADDR2                     = 0x13\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x5\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x3\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x2\n\tSCM_TIMESTAMP_MONOTONIC           = 0x4\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCARPIPLL                       = 0xc0206928\n\tSIOCATMARK                        = 0x40047307\n\tSIOCAUTOADDR                      = 0xc0206926\n\tSIOCAUTONETMASK                   = 0x80206927\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFPHYADDR                    = 0x80206941\n\tSIOCGDRVSPEC                      = 0xc028697b\n\tSIOCGETVLAN                       = 0xc020697f\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFALTMTU                     = 0xc0206948\n\tSIOCGIFASYNCMAP                   = 0xc020697c\n\tSIOCGIFBOND                       = 0xc0206947\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCAP                        = 0xc020695b\n\tSIOCGIFCONF                       = 0xc00c6924\n\tSIOCGIFDEVMTU                     = 0xc0206944\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFKPI                        = 0xc0206987\n\tSIOCGIFMAC                        = 0xc0206982\n\tSIOCGIFMEDIA                      = 0xc02c6938\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc0206933\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206940\n\tSIOCGIFPHYS                       = 0xc0206935\n\tSIOCGIFPSRCADDR                   = 0xc020693f\n\tSIOCGIFSTATUS                     = 0xc331693d\n\tSIOCGIFVLAN                       = 0xc020697f\n\tSIOCGIFWAKEFLAGS                  = 0xc0206988\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCIFCREATE                      = 0xc0206978\n\tSIOCIFCREATE2                     = 0xc020697a\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc0106981\n\tSIOCRSLVMULTI                     = 0xc010693b\n\tSIOCSDRVSPEC                      = 0x8028697b\n\tSIOCSETVLAN                       = 0x8020697e\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFALTMTU                     = 0x80206945\n\tSIOCSIFASYNCMAP                   = 0x8020697d\n\tSIOCSIFBOND                       = 0x80206946\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFCAP                        = 0x8020695a\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFKPI                        = 0x80206986\n\tSIOCSIFLLADDR                     = 0x8020693c\n\tSIOCSIFMAC                        = 0x80206983\n\tSIOCSIFMEDIA                      = 0xc0206937\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x80206934\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x8040693e\n\tSIOCSIFPHYS                       = 0x80206936\n\tSIOCSIFVLAN                       = 0x8020697e\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_MAXADDRLEN                   = 0xff\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_DONTTRUNC                      = 0x2000\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LABEL                          = 0x1010\n\tSO_LINGER                         = 0x80\n\tSO_LINGER_SEC                     = 0x1080\n\tSO_NETSVC_MARKING_LEVEL           = 0x1119\n\tSO_NET_SERVICE_TYPE               = 0x1116\n\tSO_NKE                            = 0x1021\n\tSO_NOADDRERR                      = 0x1023\n\tSO_NOSIGPIPE                      = 0x1022\n\tSO_NOTIFYCONFLICT                 = 0x1026\n\tSO_NP_EXTENSIONS                  = 0x1083\n\tSO_NREAD                          = 0x1020\n\tSO_NUMRCVPKT                      = 0x1112\n\tSO_NWRITE                         = 0x1024\n\tSO_OOBINLINE                      = 0x100\n\tSO_PEERLABEL                      = 0x1011\n\tSO_RANDOMPORT                     = 0x1082\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_REUSESHAREUID                  = 0x1025\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_TIMESTAMP                      = 0x400\n\tSO_TIMESTAMP_MONOTONIC            = 0x800\n\tSO_TYPE                           = 0x1008\n\tSO_UPCALLCLOSEWAIT                = 0x1027\n\tSO_USELOOPBACK                    = 0x40\n\tSO_WANTMORE                       = 0x4000\n\tSO_WANTOOBFLAG                    = 0x8000\n\tS_IEXEC                           = 0x40\n\tS_IFBLK                           = 0x6000\n\tS_IFCHR                           = 0x2000\n\tS_IFDIR                           = 0x4000\n\tS_IFIFO                           = 0x1000\n\tS_IFLNK                           = 0xa000\n\tS_IFMT                            = 0xf000\n\tS_IFREG                           = 0x8000\n\tS_IFSOCK                          = 0xc000\n\tS_IFWHT                           = 0xe000\n\tS_IREAD                           = 0x100\n\tS_IRGRP                           = 0x20\n\tS_IROTH                           = 0x4\n\tS_IRUSR                           = 0x100\n\tS_IRWXG                           = 0x38\n\tS_IRWXO                           = 0x7\n\tS_IRWXU                           = 0x1c0\n\tS_ISGID                           = 0x400\n\tS_ISTXT                           = 0x200\n\tS_ISUID                           = 0x800\n\tS_ISVTX                           = 0x200\n\tS_IWGRP                           = 0x10\n\tS_IWOTH                           = 0x2\n\tS_IWRITE                          = 0x80\n\tS_IWUSR                           = 0x80\n\tS_IXGRP                           = 0x8\n\tS_IXOTH                           = 0x1\n\tS_IXUSR                           = 0x40\n\tTAB0                              = 0x0\n\tTAB1                              = 0x400\n\tTAB2                              = 0x800\n\tTAB3                              = 0x4\n\tTABDLY                            = 0xc04\n\tTCIFLUSH                          = 0x1\n\tTCIOFF                            = 0x3\n\tTCIOFLUSH                         = 0x3\n\tTCION                             = 0x4\n\tTCOFLUSH                          = 0x2\n\tTCOOFF                            = 0x1\n\tTCOON                             = 0x2\n\tTCP_CONNECTIONTIMEOUT             = 0x20\n\tTCP_CONNECTION_INFO               = 0x106\n\tTCP_ENABLE_ECN                    = 0x104\n\tTCP_FASTOPEN                      = 0x105\n\tTCP_KEEPALIVE                     = 0x10\n\tTCP_KEEPCNT                       = 0x102\n\tTCP_KEEPINTVL                     = 0x101\n\tTCP_MAXHLEN                       = 0x3c\n\tTCP_MAXOLEN                       = 0x28\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_SACK                      = 0x4\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MINMSS                        = 0xd8\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOOPT                         = 0x8\n\tTCP_NOPUSH                        = 0x4\n\tTCP_NOTSENT_LOWAT                 = 0x201\n\tTCP_RXT_CONNDROPTIME              = 0x80\n\tTCP_RXT_FINDROP                   = 0x100\n\tTCP_SENDMOREACKS                  = 0x103\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x40107458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCDSIMICROCODE                  = 0x20007455\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGDRAINWAIT                    = 0x40047456\n\tTIOCGETA                          = 0x40487413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCIXOFF                         = 0x20007480\n\tTIOCIXON                          = 0x20007481\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGDTRWAIT                     = 0x4004745a\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x40047403\n\tTIOCMODS                          = 0x80047404\n\tTIOCMSDTRWAIT                     = 0x8004745b\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCPTYGNAME                      = 0x40807453\n\tTIOCPTYGRANT                      = 0x20007454\n\tTIOCPTYUNLK                       = 0x20007452\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCONS                         = 0x20007463\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDRAINWAIT                    = 0x80047457\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x80487414\n\tTIOCSETAF                         = 0x80487416\n\tTIOCSETAW                         = 0x80487415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x20007465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCTIMESTAMP                     = 0x40107459\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVM_LOADAVG                        = 0x2\n\tVM_MACHFACTOR                     = 0x4\n\tVM_MAXID                          = 0x6\n\tVM_METER                          = 0x1\n\tVM_SWAPUSAGE                      = 0x5\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVT0                               = 0x0\n\tVT1                               = 0x10000\n\tVTDLY                             = 0x10000\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWCONTINUED                        = 0x10\n\tWCOREFLAG                         = 0x80\n\tWEXITED                           = 0x4\n\tWNOHANG                           = 0x1\n\tWNOWAIT                           = 0x20\n\tWORDSIZE                          = 0x40\n\tWSTOPPED                          = 0x8\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADARCH        = syscall.Errno(0x56)\n\tEBADEXEC        = syscall.Errno(0x55)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMACHO       = syscall.Errno(0x58)\n\tEBADMSG         = syscall.Errno(0x5e)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x59)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDEVERR         = syscall.Errno(0x53)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x5a)\n\tEILSEQ          = syscall.Errno(0x5c)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x6a)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5f)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x5d)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODATA         = syscall.Errno(0x60)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x61)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x5b)\n\tENOPOLICY       = syscall.Errno(0x67)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x62)\n\tENOSTR          = syscall.Errno(0x63)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTRECOVERABLE = syscall.Errno(0x68)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x66)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEOWNERDEAD      = syscall.Errno(0x69)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x64)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tEPWROFF         = syscall.Errno(0x52)\n\tEQFULL          = syscall.Errno(0x6a)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHLIBVERS      = syscall.Errno(0x57)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIME           = syscall.Errno(0x65)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"device not configured\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource deadlock avoided\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"resource busy\",\n\t17:  \"file exists\",\n\t18:  \"cross-device link\",\n\t19:  \"operation not supported by device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"result too large\",\n\t35:  \"resource temporarily unavailable\",\n\t36:  \"operation now in progress\",\n\t37:  \"operation already in progress\",\n\t38:  \"socket operation on non-socket\",\n\t39:  \"destination address required\",\n\t40:  \"message too long\",\n\t41:  \"protocol wrong type for socket\",\n\t42:  \"protocol not available\",\n\t43:  \"protocol not supported\",\n\t44:  \"socket type not supported\",\n\t45:  \"operation not supported\",\n\t46:  \"protocol family not supported\",\n\t47:  \"address family not supported by protocol family\",\n\t48:  \"address already in use\",\n\t49:  \"can't assign requested address\",\n\t50:  \"network is down\",\n\t51:  \"network is unreachable\",\n\t52:  \"network dropped connection on reset\",\n\t53:  \"software caused connection abort\",\n\t54:  \"connection reset by peer\",\n\t55:  \"no buffer space available\",\n\t56:  \"socket is already connected\",\n\t57:  \"socket is not connected\",\n\t58:  \"can't send after socket shutdown\",\n\t59:  \"too many references: can't splice\",\n\t60:  \"operation timed out\",\n\t61:  \"connection refused\",\n\t62:  \"too many levels of symbolic links\",\n\t63:  \"file name too long\",\n\t64:  \"host is down\",\n\t65:  \"no route to host\",\n\t66:  \"directory not empty\",\n\t67:  \"too many processes\",\n\t68:  \"too many users\",\n\t69:  \"disc quota exceeded\",\n\t70:  \"stale NFS file handle\",\n\t71:  \"too many levels of remote in path\",\n\t72:  \"RPC struct is bad\",\n\t73:  \"RPC version wrong\",\n\t74:  \"RPC prog. not avail\",\n\t75:  \"program version wrong\",\n\t76:  \"bad procedure for program\",\n\t77:  \"no locks available\",\n\t78:  \"function not implemented\",\n\t79:  \"inappropriate file type or format\",\n\t80:  \"authentication error\",\n\t81:  \"need authenticator\",\n\t82:  \"device power is off\",\n\t83:  \"device error\",\n\t84:  \"value too large to be stored in data type\",\n\t85:  \"bad executable (or shared library)\",\n\t86:  \"bad CPU type in executable\",\n\t87:  \"shared library version mismatch\",\n\t88:  \"malformed Mach-o file\",\n\t89:  \"operation canceled\",\n\t90:  \"identifier removed\",\n\t91:  \"no message of desired type\",\n\t92:  \"illegal byte sequence\",\n\t93:  \"attribute not found\",\n\t94:  \"bad message\",\n\t95:  \"EMULTIHOP (Reserved)\",\n\t96:  \"no message available on STREAM\",\n\t97:  \"ENOLINK (Reserved)\",\n\t98:  \"no STREAM resources\",\n\t99:  \"not a STREAM\",\n\t100: \"protocol error\",\n\t101: \"STREAM ioctl timeout\",\n\t102: \"operation not supported on socket\",\n\t103: \"policy not found\",\n\t104: \"state not recoverable\",\n\t105: \"previous owner died\",\n\t106: \"interface output queue is full\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go",
    "content": "// mkerrors.sh\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,darwin\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1c\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x25\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x1e\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1c\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x28\n\tAF_NATM                           = 0x1f\n\tAF_NDRV                           = 0x1b\n\tAF_NETBIOS                        = 0x21\n\tAF_NS                             = 0x6\n\tAF_OSI                            = 0x7\n\tAF_PPP                            = 0x22\n\tAF_PUP                            = 0x4\n\tAF_RESERVED_36                    = 0x24\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x18\n\tAF_SNA                            = 0xb\n\tAF_SYSTEM                         = 0x20\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tAF_UTUN                           = 0x26\n\tALTWERASE                         = 0x200\n\tATTR_BIT_MAP_COUNT                = 0x5\n\tATTR_CMN_ACCESSMASK               = 0x20000\n\tATTR_CMN_ACCTIME                  = 0x1000\n\tATTR_CMN_ADDEDTIME                = 0x10000000\n\tATTR_CMN_BKUPTIME                 = 0x2000\n\tATTR_CMN_CHGTIME                  = 0x800\n\tATTR_CMN_CRTIME                   = 0x200\n\tATTR_CMN_DATA_PROTECT_FLAGS       = 0x40000000\n\tATTR_CMN_DEVID                    = 0x2\n\tATTR_CMN_DOCUMENT_ID              = 0x100000\n\tATTR_CMN_ERROR                    = 0x20000000\n\tATTR_CMN_EXTENDED_SECURITY        = 0x400000\n\tATTR_CMN_FILEID                   = 0x2000000\n\tATTR_CMN_FLAGS                    = 0x40000\n\tATTR_CMN_FNDRINFO                 = 0x4000\n\tATTR_CMN_FSID                     = 0x4\n\tATTR_CMN_FULLPATH                 = 0x8000000\n\tATTR_CMN_GEN_COUNT                = 0x80000\n\tATTR_CMN_GRPID                    = 0x10000\n\tATTR_CMN_GRPUUID                  = 0x1000000\n\tATTR_CMN_MODTIME                  = 0x400\n\tATTR_CMN_NAME                     = 0x1\n\tATTR_CMN_NAMEDATTRCOUNT           = 0x80000\n\tATTR_CMN_NAMEDATTRLIST            = 0x100000\n\tATTR_CMN_OBJID                    = 0x20\n\tATTR_CMN_OBJPERMANENTID           = 0x40\n\tATTR_CMN_OBJTAG                   = 0x10\n\tATTR_CMN_OBJTYPE                  = 0x8\n\tATTR_CMN_OWNERID                  = 0x8000\n\tATTR_CMN_PARENTID                 = 0x4000000\n\tATTR_CMN_PAROBJID                 = 0x80\n\tATTR_CMN_RETURNED_ATTRS           = 0x80000000\n\tATTR_CMN_SCRIPT                   = 0x100\n\tATTR_CMN_SETMASK                  = 0x41c7ff00\n\tATTR_CMN_USERACCESS               = 0x200000\n\tATTR_CMN_UUID                     = 0x800000\n\tATTR_CMN_VALIDMASK                = 0xffffffff\n\tATTR_CMN_VOLSETMASK               = 0x6700\n\tATTR_FILE_ALLOCSIZE               = 0x4\n\tATTR_FILE_CLUMPSIZE               = 0x10\n\tATTR_FILE_DATAALLOCSIZE           = 0x400\n\tATTR_FILE_DATAEXTENTS             = 0x800\n\tATTR_FILE_DATALENGTH              = 0x200\n\tATTR_FILE_DEVTYPE                 = 0x20\n\tATTR_FILE_FILETYPE                = 0x40\n\tATTR_FILE_FORKCOUNT               = 0x80\n\tATTR_FILE_FORKLIST                = 0x100\n\tATTR_FILE_IOBLOCKSIZE             = 0x8\n\tATTR_FILE_LINKCOUNT               = 0x1\n\tATTR_FILE_RSRCALLOCSIZE           = 0x2000\n\tATTR_FILE_RSRCEXTENTS             = 0x4000\n\tATTR_FILE_RSRCLENGTH              = 0x1000\n\tATTR_FILE_SETMASK                 = 0x20\n\tATTR_FILE_TOTALSIZE               = 0x2\n\tATTR_FILE_VALIDMASK               = 0x37ff\n\tATTR_VOL_ALLOCATIONCLUMP          = 0x40\n\tATTR_VOL_ATTRIBUTES               = 0x40000000\n\tATTR_VOL_CAPABILITIES             = 0x20000\n\tATTR_VOL_DIRCOUNT                 = 0x400\n\tATTR_VOL_ENCODINGSUSED            = 0x10000\n\tATTR_VOL_FILECOUNT                = 0x200\n\tATTR_VOL_FSTYPE                   = 0x1\n\tATTR_VOL_INFO                     = 0x80000000\n\tATTR_VOL_IOBLOCKSIZE              = 0x80\n\tATTR_VOL_MAXOBJCOUNT              = 0x800\n\tATTR_VOL_MINALLOCATION            = 0x20\n\tATTR_VOL_MOUNTEDDEVICE            = 0x8000\n\tATTR_VOL_MOUNTFLAGS               = 0x4000\n\tATTR_VOL_MOUNTPOINT               = 0x1000\n\tATTR_VOL_NAME                     = 0x2000\n\tATTR_VOL_OBJCOUNT                 = 0x100\n\tATTR_VOL_QUOTA_SIZE               = 0x10000000\n\tATTR_VOL_RESERVED_SIZE            = 0x20000000\n\tATTR_VOL_SETMASK                  = 0x80002000\n\tATTR_VOL_SIGNATURE                = 0x2\n\tATTR_VOL_SIZE                     = 0x4\n\tATTR_VOL_SPACEAVAIL               = 0x10\n\tATTR_VOL_SPACEFREE                = 0x8\n\tATTR_VOL_UUID                     = 0x40000\n\tATTR_VOL_VALIDMASK                = 0xf007ffff\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc00c4279\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044272\n\tBIOCGRTIMEOUT                     = 0x4010426e\n\tBIOCGSEESENT                      = 0x40044276\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044278\n\tBIOCSETF                          = 0x80104267\n\tBIOCSETFNR                        = 0x8010427e\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044273\n\tBIOCSRTIMEOUT                     = 0x8010426d\n\tBIOCSSEESENT                      = 0x80044277\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x80000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tBS0                               = 0x0\n\tBS1                               = 0x8000\n\tBSDLY                             = 0x8000\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCLOCK_MONOTONIC                   = 0x6\n\tCLOCK_MONOTONIC_RAW               = 0x4\n\tCLOCK_MONOTONIC_RAW_APPROX        = 0x5\n\tCLOCK_PROCESS_CPUTIME_ID          = 0xc\n\tCLOCK_REALTIME                    = 0x0\n\tCLOCK_THREAD_CPUTIME_ID           = 0x10\n\tCLOCK_UPTIME_RAW                  = 0x8\n\tCLOCK_UPTIME_RAW_APPROX           = 0x9\n\tCR0                               = 0x0\n\tCR1                               = 0x1000\n\tCR2                               = 0x2000\n\tCR3                               = 0x3000\n\tCRDLY                             = 0x3000\n\tCREAD                             = 0x800\n\tCRTSCTS                           = 0x30000\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_AOS                           = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CAN_SOCKETCAN                 = 0xe3\n\tDLT_CHAOS                         = 0x5\n\tDLT_CHDLC                         = 0x68\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DBUS                          = 0xe7\n\tDLT_DECT                          = 0xdd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_DVB_CI                        = 0xeb\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FC_2                          = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS        = 0xe1\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_GSMTAP_ABIS                   = 0xda\n\tDLT_GSMTAP_UM                     = 0xd9\n\tDLT_HHDLC                         = 0x79\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NOFCS            = 0xe6\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPFILTER                      = 0x74\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IPNET                         = 0xe2\n\tDLT_IPOIB                         = 0xf2\n\tDLT_IPV4                          = 0xe4\n\tDLT_IPV6                          = 0xe5\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_ATM_CEMIC             = 0xee\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FIBRECHANNEL          = 0xea\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_SRX_E2E               = 0xe9\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_JUNIPER_VS                    = 0xe8\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_EVDEV                   = 0xd8\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_PPP_WITHDIRECTION       = 0xa6\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MATCHING_MAX                  = 0xf5\n\tDLT_MATCHING_MIN                  = 0x68\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MPEG_2_TS                     = 0xf3\n\tDLT_MPLS                          = 0xdb\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_MUX27010                      = 0xec\n\tDLT_NETANALYZER                   = 0xf0\n\tDLT_NETANALYZER_TRANSPARENT       = 0xf1\n\tDLT_NFC_LLCP                      = 0xf5\n\tDLT_NFLOG                         = 0xef\n\tDLT_NG40                          = 0xf4\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PPP_WITH_DIRECTION            = 0xa6\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDLT_STANAG_5066_D_PDU             = 0xed\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_USB_LINUX_MMAPPED             = 0xdc\n\tDLT_USER0                         = 0x93\n\tDLT_USER1                         = 0x94\n\tDLT_USER10                        = 0x9d\n\tDLT_USER11                        = 0x9e\n\tDLT_USER12                        = 0x9f\n\tDLT_USER13                        = 0xa0\n\tDLT_USER14                        = 0xa1\n\tDLT_USER15                        = 0xa2\n\tDLT_USER2                         = 0x95\n\tDLT_USER3                         = 0x96\n\tDLT_USER4                         = 0x97\n\tDLT_USER5                         = 0x98\n\tDLT_USER6                         = 0x99\n\tDLT_USER7                         = 0x9a\n\tDLT_USER8                         = 0x9b\n\tDLT_USER9                         = 0x9c\n\tDLT_WIHART                        = 0xdf\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_EXCEPT                     = -0xf\n\tEVFILT_FS                         = -0x9\n\tEVFILT_MACHPORT                   = -0x8\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0xf\n\tEVFILT_THREADMARKER               = 0xf\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_USER                       = -0xa\n\tEVFILT_VM                         = -0xc\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_DISPATCH                       = 0x80\n\tEV_DISPATCH2                      = 0x180\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG0                          = 0x1000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_OOBAND                         = 0x2000\n\tEV_POLL                           = 0x1000\n\tEV_RECEIPT                        = 0x40\n\tEV_SYSFLAGS                       = 0xf000\n\tEV_UDATA_SPECIFIC                 = 0x100\n\tEV_VANISHED                       = 0x200\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFF0                               = 0x0\n\tFF1                               = 0x4000\n\tFFDLY                             = 0x4000\n\tFLUSHO                            = 0x800000\n\tFSOPT_ATTR_CMN_EXTENDED           = 0x20\n\tFSOPT_NOFOLLOW                    = 0x1\n\tFSOPT_NOINMEMUPDATE               = 0x2\n\tFSOPT_PACK_INVAL_ATTRS            = 0x8\n\tFSOPT_REPORT_FULLSIZE             = 0x4\n\tF_ADDFILESIGS                     = 0x3d\n\tF_ADDFILESIGS_FOR_DYLD_SIM        = 0x53\n\tF_ADDFILESIGS_RETURN              = 0x61\n\tF_ADDSIGS                         = 0x3b\n\tF_ALLOCATEALL                     = 0x4\n\tF_ALLOCATECONTIG                  = 0x2\n\tF_BARRIERFSYNC                    = 0x55\n\tF_CHECK_LV                        = 0x62\n\tF_CHKCLEAN                        = 0x29\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0x43\n\tF_FINDSIGS                        = 0x4e\n\tF_FLUSH_DATA                      = 0x28\n\tF_FREEZE_FS                       = 0x35\n\tF_FULLFSYNC                       = 0x33\n\tF_GETCODEDIR                      = 0x48\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETLKPID                        = 0x42\n\tF_GETNOSIGPIPE                    = 0x4a\n\tF_GETOWN                          = 0x5\n\tF_GETPATH                         = 0x32\n\tF_GETPATH_MTMINFO                 = 0x47\n\tF_GETPROTECTIONCLASS              = 0x3f\n\tF_GETPROTECTIONLEVEL              = 0x4d\n\tF_GLOBAL_NOCACHE                  = 0x37\n\tF_LOG2PHYS                        = 0x31\n\tF_LOG2PHYS_EXT                    = 0x41\n\tF_NOCACHE                         = 0x30\n\tF_NODIRECT                        = 0x3e\n\tF_OK                              = 0x0\n\tF_PATHPKG_CHECK                   = 0x34\n\tF_PEOFPOSMODE                     = 0x3\n\tF_PREALLOCATE                     = 0x2a\n\tF_PUNCHHOLE                       = 0x63\n\tF_RDADVISE                        = 0x2c\n\tF_RDAHEAD                         = 0x2d\n\tF_RDLCK                           = 0x1\n\tF_SETBACKINGSTORE                 = 0x46\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETLKWTIMEOUT                   = 0xa\n\tF_SETNOSIGPIPE                    = 0x49\n\tF_SETOWN                          = 0x6\n\tF_SETPROTECTIONCLASS              = 0x40\n\tF_SETSIZE                         = 0x2b\n\tF_SINGLE_WRITER                   = 0x4c\n\tF_THAW_FS                         = 0x36\n\tF_TRANSCODEKEY                    = 0x4b\n\tF_TRIM_ACTIVE_FILE                = 0x64\n\tF_UNLCK                           = 0x2\n\tF_VOLPOSMODE                      = 0x4\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_ALTPHYS                       = 0x4000\n\tIFF_BROADCAST                     = 0x2\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_AAL5                          = 0x31\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ATM                           = 0x25\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_CARP                          = 0xf8\n\tIFT_CELLULAR                      = 0xff\n\tIFT_CEPT                          = 0x13\n\tIFT_DS3                           = 0x1e\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0x38\n\tIFT_FDDI                          = 0xf\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_GIF                           = 0x37\n\tIFT_HDH1822                       = 0x3\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE8023ADLAG                 = 0x88\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88026                      = 0xa\n\tIFT_L2VLAN                        = 0x87\n\tIFT_LAPB                          = 0x10\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_NSIP                          = 0x1b\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PDP                           = 0xff\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PKTAP                         = 0xfe\n\tIFT_PPP                           = 0x17\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_RS232                         = 0x21\n\tIFT_SDLC                          = 0x11\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0x39\n\tIFT_T1                            = 0x12\n\tIFT_ULTRA                         = 0x1d\n\tIFT_V35                           = 0x2d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LINKLOCALNETNUM                = 0xa9fe0000\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_3PC                       = 0x22\n\tIPPROTO_ADFS                      = 0x44\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_AHIP                      = 0x3d\n\tIPPROTO_APES                      = 0x63\n\tIPPROTO_ARGUS                     = 0xd\n\tIPPROTO_AX25                      = 0x5d\n\tIPPROTO_BHA                       = 0x31\n\tIPPROTO_BLT                       = 0x1e\n\tIPPROTO_BRSATMON                  = 0x4c\n\tIPPROTO_CFTP                      = 0x3e\n\tIPPROTO_CHAOS                     = 0x10\n\tIPPROTO_CMTP                      = 0x26\n\tIPPROTO_CPHB                      = 0x49\n\tIPPROTO_CPNX                      = 0x48\n\tIPPROTO_DDP                       = 0x25\n\tIPPROTO_DGP                       = 0x56\n\tIPPROTO_DIVERT                    = 0xfe\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_EMCON                     = 0xe\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GMTP                      = 0x64\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HELLO                     = 0x3f\n\tIPPROTO_HMP                       = 0x14\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IDPR                      = 0x23\n\tIPPROTO_IDRP                      = 0x2d\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IGP                       = 0x55\n\tIPPROTO_IGRP                      = 0x58\n\tIPPROTO_IL                        = 0x28\n\tIPPROTO_INLSP                     = 0x34\n\tIPPROTO_INP                       = 0x20\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPCV                      = 0x47\n\tIPPROTO_IPEIP                     = 0x5e\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPPC                      = 0x43\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IRTP                      = 0x1c\n\tIPPROTO_KRYPTOLAN                 = 0x41\n\tIPPROTO_LARP                      = 0x5b\n\tIPPROTO_LEAF1                     = 0x19\n\tIPPROTO_LEAF2                     = 0x1a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MEAS                      = 0x13\n\tIPPROTO_MHRP                      = 0x30\n\tIPPROTO_MICP                      = 0x5f\n\tIPPROTO_MTP                       = 0x5c\n\tIPPROTO_MUX                       = 0x12\n\tIPPROTO_ND                        = 0x4d\n\tIPPROTO_NHRP                      = 0x36\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_NSP                       = 0x1f\n\tIPPROTO_NVPII                     = 0xb\n\tIPPROTO_OSPFIGP                   = 0x59\n\tIPPROTO_PGM                       = 0x71\n\tIPPROTO_PIGP                      = 0x9\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PRM                       = 0x15\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_PVP                       = 0x4b\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_RCCMON                    = 0xa\n\tIPPROTO_RDP                       = 0x1b\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_RVD                       = 0x42\n\tIPPROTO_SATEXPAK                  = 0x40\n\tIPPROTO_SATMON                    = 0x45\n\tIPPROTO_SCCSP                     = 0x60\n\tIPPROTO_SCTP                      = 0x84\n\tIPPROTO_SDRP                      = 0x2a\n\tIPPROTO_SEP                       = 0x21\n\tIPPROTO_SRPC                      = 0x5a\n\tIPPROTO_ST                        = 0x7\n\tIPPROTO_SVMTP                     = 0x52\n\tIPPROTO_SWIPE                     = 0x35\n\tIPPROTO_TCF                       = 0x57\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_TPXX                      = 0x27\n\tIPPROTO_TRUNK1                    = 0x17\n\tIPPROTO_TRUNK2                    = 0x18\n\tIPPROTO_TTP                       = 0x54\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_VINES                     = 0x53\n\tIPPROTO_VISA                      = 0x46\n\tIPPROTO_VMTP                      = 0x51\n\tIPPROTO_WBEXPAK                   = 0x4f\n\tIPPROTO_WBMON                     = 0x4e\n\tIPPROTO_WSN                       = 0x4a\n\tIPPROTO_XNET                      = 0xf\n\tIPPROTO_XTP                       = 0x24\n\tIPV6_2292DSTOPTS                  = 0x17\n\tIPV6_2292HOPLIMIT                 = 0x14\n\tIPV6_2292HOPOPTS                  = 0x16\n\tIPV6_2292NEXTHOP                  = 0x15\n\tIPV6_2292PKTINFO                  = 0x13\n\tIPV6_2292PKTOPTIONS               = 0x19\n\tIPV6_2292RTHDR                    = 0x18\n\tIPV6_BINDV6ONLY                   = 0x1b\n\tIPV6_BOUND_IF                     = 0x7d\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FLOW_ECN_MASK                = 0x300\n\tIPV6_FRAGTTL                      = 0x3c\n\tIPV6_FW_ADD                       = 0x1e\n\tIPV6_FW_DEL                       = 0x1f\n\tIPV6_FW_FLUSH                     = 0x20\n\tIPV6_FW_GET                       = 0x22\n\tIPV6_FW_ZERO                      = 0x21\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXOPTHDR                    = 0x800\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MAX_GROUP_SRC_FILTER         = 0x200\n\tIPV6_MAX_MEMBERSHIPS              = 0xfff\n\tIPV6_MAX_SOCK_SRC_FILTER          = 0x80\n\tIPV6_MIN_MEMBERSHIPS              = 0x1f\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVTCLASS                   = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x24\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_ADD_SOURCE_MEMBERSHIP          = 0x46\n\tIP_BLOCK_SOURCE                   = 0x48\n\tIP_BOUND_IF                       = 0x19\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_DROP_SOURCE_MEMBERSHIP         = 0x47\n\tIP_DUMMYNET_CONFIGURE             = 0x3c\n\tIP_DUMMYNET_DEL                   = 0x3d\n\tIP_DUMMYNET_FLUSH                 = 0x3e\n\tIP_DUMMYNET_GET                   = 0x40\n\tIP_FAITH                          = 0x16\n\tIP_FW_ADD                         = 0x28\n\tIP_FW_DEL                         = 0x29\n\tIP_FW_FLUSH                       = 0x2a\n\tIP_FW_GET                         = 0x2c\n\tIP_FW_RESETLOG                    = 0x2d\n\tIP_FW_ZERO                        = 0x2b\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x15\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_GROUP_SRC_FILTER           = 0x200\n\tIP_MAX_MEMBERSHIPS                = 0xfff\n\tIP_MAX_SOCK_MUTE_FILTER           = 0x80\n\tIP_MAX_SOCK_SRC_FILTER            = 0x80\n\tIP_MF                             = 0x2000\n\tIP_MIN_MEMBERSHIPS                = 0x1f\n\tIP_MSFILTER                       = 0x4a\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_IFINDEX              = 0x42\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_MULTICAST_VIF                  = 0xe\n\tIP_NAT__XXX                       = 0x37\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OLD_FW_ADD                     = 0x32\n\tIP_OLD_FW_DEL                     = 0x33\n\tIP_OLD_FW_FLUSH                   = 0x34\n\tIP_OLD_FW_GET                     = 0x36\n\tIP_OLD_FW_RESETLOG                = 0x38\n\tIP_OLD_FW_ZERO                    = 0x35\n\tIP_OPTIONS                        = 0x1\n\tIP_PKTINFO                        = 0x1a\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVPKTINFO                    = 0x1a\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTOS                        = 0x1b\n\tIP_RECVTTL                        = 0x18\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RSVP_OFF                       = 0x10\n\tIP_RSVP_ON                        = 0xf\n\tIP_RSVP_VIF_OFF                   = 0x12\n\tIP_RSVP_VIF_ON                    = 0x11\n\tIP_STRIPHDR                       = 0x17\n\tIP_TOS                            = 0x3\n\tIP_TRAFFIC_MGT_BACKGROUND         = 0x41\n\tIP_TTL                            = 0x4\n\tIP_UNBLOCK_SOURCE                 = 0x49\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIUTF8                             = 0x4000\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_CAN_REUSE                    = 0x9\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x5\n\tMADV_FREE_REUSABLE                = 0x7\n\tMADV_FREE_REUSE                   = 0x8\n\tMADV_NORMAL                       = 0x0\n\tMADV_PAGEOUT                      = 0xa\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_WILLNEED                     = 0x3\n\tMADV_ZERO_WIRED_PAGES             = 0x6\n\tMAP_ANON                          = 0x1000\n\tMAP_ANONYMOUS                     = 0x1000\n\tMAP_COPY                          = 0x2\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_JIT                           = 0x800\n\tMAP_NOCACHE                       = 0x400\n\tMAP_NOEXTEND                      = 0x100\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_RESERVED0080                  = 0x80\n\tMAP_RESILIENT_CODESIGN            = 0x2000\n\tMAP_RESILIENT_MEDIA               = 0x4000\n\tMAP_SHARED                        = 0x1\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMNT_ASYNC                         = 0x40\n\tMNT_AUTOMOUNTED                   = 0x400000\n\tMNT_CMDFLAGS                      = 0xf0000\n\tMNT_CPROTECT                      = 0x80\n\tMNT_DEFWRITE                      = 0x2000000\n\tMNT_DONTBROWSE                    = 0x100000\n\tMNT_DOVOLFS                       = 0x8000\n\tMNT_DWAIT                         = 0x4\n\tMNT_EXPORTED                      = 0x100\n\tMNT_FORCE                         = 0x80000\n\tMNT_IGNORE_OWNERSHIP              = 0x200000\n\tMNT_JOURNALED                     = 0x800000\n\tMNT_LOCAL                         = 0x1000\n\tMNT_MULTILABEL                    = 0x4000000\n\tMNT_NOATIME                       = 0x10000000\n\tMNT_NOBLOCK                       = 0x20000\n\tMNT_NODEV                         = 0x10\n\tMNT_NOEXEC                        = 0x4\n\tMNT_NOSUID                        = 0x8\n\tMNT_NOUSERXATTR                   = 0x1000000\n\tMNT_NOWAIT                        = 0x2\n\tMNT_QUARANTINE                    = 0x400\n\tMNT_QUOTA                         = 0x2000\n\tMNT_RDONLY                        = 0x1\n\tMNT_RELOAD                        = 0x40000\n\tMNT_ROOTFS                        = 0x4000\n\tMNT_SYNCHRONOUS                   = 0x2\n\tMNT_UNION                         = 0x20\n\tMNT_UNKNOWNPERMISSIONS            = 0x200000\n\tMNT_UPDATE                        = 0x10000\n\tMNT_VISFLAGMASK                   = 0x17f0f5ff\n\tMNT_WAIT                          = 0x1\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOF                           = 0x100\n\tMSG_EOR                           = 0x8\n\tMSG_FLUSH                         = 0x400\n\tMSG_HAVEMORE                      = 0x2000\n\tMSG_HOLD                          = 0x800\n\tMSG_NEEDSA                        = 0x10000\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_RCVMORE                       = 0x4000\n\tMSG_SEND                          = 0x1000\n\tMSG_TRUNC                         = 0x10\n\tMSG_WAITALL                       = 0x40\n\tMSG_WAITSTREAM                    = 0x200\n\tMS_ASYNC                          = 0x1\n\tMS_DEACTIVATE                     = 0x8\n\tMS_INVALIDATE                     = 0x2\n\tMS_KILLPAGES                      = 0x4\n\tMS_SYNC                           = 0x10\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_DUMP2                      = 0x7\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_IFLIST2                    = 0x6\n\tNET_RT_MAXID                      = 0xa\n\tNET_RT_STAT                       = 0x4\n\tNET_RT_TRASH                      = 0x5\n\tNL0                               = 0x0\n\tNL1                               = 0x100\n\tNL2                               = 0x200\n\tNL3                               = 0x300\n\tNLDLY                             = 0x300\n\tNOFLSH                            = 0x80000000\n\tNOKERNINFO                        = 0x2000000\n\tNOTE_ABSOLUTE                     = 0x8\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_BACKGROUND                   = 0x40\n\tNOTE_CHILD                        = 0x4\n\tNOTE_CRITICAL                     = 0x20\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXITSTATUS                   = 0x4000000\n\tNOTE_EXIT_CSERROR                 = 0x40000\n\tNOTE_EXIT_DECRYPTFAIL             = 0x10000\n\tNOTE_EXIT_DETAIL                  = 0x2000000\n\tNOTE_EXIT_DETAIL_MASK             = 0x70000\n\tNOTE_EXIT_MEMORY                  = 0x20000\n\tNOTE_EXIT_REPARENTED              = 0x80000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FFAND                        = 0x40000000\n\tNOTE_FFCOPY                       = 0xc0000000\n\tNOTE_FFCTRLMASK                   = 0xc0000000\n\tNOTE_FFLAGSMASK                   = 0xffffff\n\tNOTE_FFNOP                        = 0x0\n\tNOTE_FFOR                         = 0x80000000\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_FUNLOCK                      = 0x100\n\tNOTE_LEEWAY                       = 0x10\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_MACH_CONTINUOUS_TIME         = 0x80\n\tNOTE_NONE                         = 0x80\n\tNOTE_NSECONDS                     = 0x4\n\tNOTE_OOB                          = 0x2\n\tNOTE_PCTRLMASK                    = -0x100000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_REAP                         = 0x10000000\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_SECONDS                      = 0x1\n\tNOTE_SIGNAL                       = 0x8000000\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRIGGER                      = 0x1000000\n\tNOTE_USECONDS                     = 0x2\n\tNOTE_VM_ERROR                     = 0x10000000\n\tNOTE_VM_PRESSURE                  = 0x80000000\n\tNOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000\n\tNOTE_VM_PRESSURE_TERMINATE        = 0x40000000\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tOFDEL                             = 0x20000\n\tOFILL                             = 0x80\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tOXTABS                            = 0x4\n\tO_ACCMODE                         = 0x3\n\tO_ALERT                           = 0x20000000\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x1000000\n\tO_CREAT                           = 0x200\n\tO_DIRECTORY                       = 0x100000\n\tO_DP_GETRAWENCRYPTED              = 0x1\n\tO_DP_GETRAWUNENCRYPTED            = 0x2\n\tO_DSYNC                           = 0x400000\n\tO_EVTONLY                         = 0x8000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x20000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_POPUP                           = 0x80000000\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_SHLOCK                          = 0x10\n\tO_SYMLINK                         = 0x200000\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tPT_ATTACH                         = 0xa\n\tPT_ATTACHEXC                      = 0xe\n\tPT_CONTINUE                       = 0x7\n\tPT_DENY_ATTACH                    = 0x1f\n\tPT_DETACH                         = 0xb\n\tPT_FIRSTMACH                      = 0x20\n\tPT_FORCEQUOTA                     = 0x1e\n\tPT_KILL                           = 0x8\n\tPT_READ_D                         = 0x2\n\tPT_READ_I                         = 0x1\n\tPT_READ_U                         = 0x3\n\tPT_SIGEXC                         = 0xc\n\tPT_STEP                           = 0x9\n\tPT_THUPDATE                       = 0xd\n\tPT_TRACE_ME                       = 0x0\n\tPT_WRITE_D                        = 0x5\n\tPT_WRITE_I                        = 0x4\n\tPT_WRITE_U                        = 0x6\n\tRLIMIT_AS                         = 0x5\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_CPU_USAGE_MONITOR          = 0x2\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_MEMLOCK                    = 0x6\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_NPROC                      = 0x7\n\tRLIMIT_RSS                        = 0x5\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0x8\n\tRTAX_NETMASK                      = 0x2\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_NETMASK                       = 0x4\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_BROADCAST                     = 0x400000\n\tRTF_CLONING                       = 0x100\n\tRTF_CONDEMNED                     = 0x2000000\n\tRTF_DELCLONE                      = 0x80\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_IFREF                         = 0x4000000\n\tRTF_IFSCOPE                       = 0x1000000\n\tRTF_LLINFO                        = 0x400\n\tRTF_LOCAL                         = 0x200000\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MULTICAST                     = 0x800000\n\tRTF_NOIFREF                       = 0x2000\n\tRTF_PINNED                        = 0x100000\n\tRTF_PRCLONING                     = 0x10000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x40000\n\tRTF_PROXY                         = 0x8000000\n\tRTF_REJECT                        = 0x8\n\tRTF_ROUTER                        = 0x10000000\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_WASCLONED                     = 0x20000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DELMADDR                      = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_GET2                          = 0x14\n\tRTM_IFINFO                        = 0xe\n\tRTM_IFINFO2                       = 0x12\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_NEWMADDR                      = 0xf\n\tRTM_NEWMADDR2                     = 0x13\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x5\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x3\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x2\n\tSCM_TIMESTAMP_MONOTONIC           = 0x4\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCARPIPLL                       = 0xc0206928\n\tSIOCATMARK                        = 0x40047307\n\tSIOCAUTOADDR                      = 0xc0206926\n\tSIOCAUTONETMASK                   = 0x80206927\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFPHYADDR                    = 0x80206941\n\tSIOCGDRVSPEC                      = 0xc028697b\n\tSIOCGETVLAN                       = 0xc020697f\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFALTMTU                     = 0xc0206948\n\tSIOCGIFASYNCMAP                   = 0xc020697c\n\tSIOCGIFBOND                       = 0xc0206947\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCAP                        = 0xc020695b\n\tSIOCGIFCONF                       = 0xc00c6924\n\tSIOCGIFDEVMTU                     = 0xc0206944\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFKPI                        = 0xc0206987\n\tSIOCGIFMAC                        = 0xc0206982\n\tSIOCGIFMEDIA                      = 0xc02c6938\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc0206933\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206940\n\tSIOCGIFPHYS                       = 0xc0206935\n\tSIOCGIFPSRCADDR                   = 0xc020693f\n\tSIOCGIFSTATUS                     = 0xc331693d\n\tSIOCGIFVLAN                       = 0xc020697f\n\tSIOCGIFWAKEFLAGS                  = 0xc0206988\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCIFCREATE                      = 0xc0206978\n\tSIOCIFCREATE2                     = 0xc020697a\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc0106981\n\tSIOCRSLVMULTI                     = 0xc010693b\n\tSIOCSDRVSPEC                      = 0x8028697b\n\tSIOCSETVLAN                       = 0x8020697e\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFALTMTU                     = 0x80206945\n\tSIOCSIFASYNCMAP                   = 0x8020697d\n\tSIOCSIFBOND                       = 0x80206946\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFCAP                        = 0x8020695a\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFKPI                        = 0x80206986\n\tSIOCSIFLLADDR                     = 0x8020693c\n\tSIOCSIFMAC                        = 0x80206983\n\tSIOCSIFMEDIA                      = 0xc0206937\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x80206934\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x8040693e\n\tSIOCSIFPHYS                       = 0x80206936\n\tSIOCSIFVLAN                       = 0x8020697e\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_MAXADDRLEN                   = 0xff\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_DONTTRUNC                      = 0x2000\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LABEL                          = 0x1010\n\tSO_LINGER                         = 0x80\n\tSO_LINGER_SEC                     = 0x1080\n\tSO_NETSVC_MARKING_LEVEL           = 0x1119\n\tSO_NET_SERVICE_TYPE               = 0x1116\n\tSO_NKE                            = 0x1021\n\tSO_NOADDRERR                      = 0x1023\n\tSO_NOSIGPIPE                      = 0x1022\n\tSO_NOTIFYCONFLICT                 = 0x1026\n\tSO_NP_EXTENSIONS                  = 0x1083\n\tSO_NREAD                          = 0x1020\n\tSO_NUMRCVPKT                      = 0x1112\n\tSO_NWRITE                         = 0x1024\n\tSO_OOBINLINE                      = 0x100\n\tSO_PEERLABEL                      = 0x1011\n\tSO_RANDOMPORT                     = 0x1082\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_REUSESHAREUID                  = 0x1025\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_TIMESTAMP                      = 0x400\n\tSO_TIMESTAMP_MONOTONIC            = 0x800\n\tSO_TYPE                           = 0x1008\n\tSO_UPCALLCLOSEWAIT                = 0x1027\n\tSO_USELOOPBACK                    = 0x40\n\tSO_WANTMORE                       = 0x4000\n\tSO_WANTOOBFLAG                    = 0x8000\n\tS_IEXEC                           = 0x40\n\tS_IFBLK                           = 0x6000\n\tS_IFCHR                           = 0x2000\n\tS_IFDIR                           = 0x4000\n\tS_IFIFO                           = 0x1000\n\tS_IFLNK                           = 0xa000\n\tS_IFMT                            = 0xf000\n\tS_IFREG                           = 0x8000\n\tS_IFSOCK                          = 0xc000\n\tS_IFWHT                           = 0xe000\n\tS_IREAD                           = 0x100\n\tS_IRGRP                           = 0x20\n\tS_IROTH                           = 0x4\n\tS_IRUSR                           = 0x100\n\tS_IRWXG                           = 0x38\n\tS_IRWXO                           = 0x7\n\tS_IRWXU                           = 0x1c0\n\tS_ISGID                           = 0x400\n\tS_ISTXT                           = 0x200\n\tS_ISUID                           = 0x800\n\tS_ISVTX                           = 0x200\n\tS_IWGRP                           = 0x10\n\tS_IWOTH                           = 0x2\n\tS_IWRITE                          = 0x80\n\tS_IWUSR                           = 0x80\n\tS_IXGRP                           = 0x8\n\tS_IXOTH                           = 0x1\n\tS_IXUSR                           = 0x40\n\tTAB0                              = 0x0\n\tTAB1                              = 0x400\n\tTAB2                              = 0x800\n\tTAB3                              = 0x4\n\tTABDLY                            = 0xc04\n\tTCIFLUSH                          = 0x1\n\tTCIOFF                            = 0x3\n\tTCIOFLUSH                         = 0x3\n\tTCION                             = 0x4\n\tTCOFLUSH                          = 0x2\n\tTCOOFF                            = 0x1\n\tTCOON                             = 0x2\n\tTCP_CONNECTIONTIMEOUT             = 0x20\n\tTCP_CONNECTION_INFO               = 0x106\n\tTCP_ENABLE_ECN                    = 0x104\n\tTCP_FASTOPEN                      = 0x105\n\tTCP_KEEPALIVE                     = 0x10\n\tTCP_KEEPCNT                       = 0x102\n\tTCP_KEEPINTVL                     = 0x101\n\tTCP_MAXHLEN                       = 0x3c\n\tTCP_MAXOLEN                       = 0x28\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_SACK                      = 0x4\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MINMSS                        = 0xd8\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOOPT                         = 0x8\n\tTCP_NOPUSH                        = 0x4\n\tTCP_NOTSENT_LOWAT                 = 0x201\n\tTCP_RXT_CONNDROPTIME              = 0x80\n\tTCP_RXT_FINDROP                   = 0x100\n\tTCP_SENDMOREACKS                  = 0x103\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x40107458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCDSIMICROCODE                  = 0x20007455\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGDRAINWAIT                    = 0x40047456\n\tTIOCGETA                          = 0x40487413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCIXOFF                         = 0x20007480\n\tTIOCIXON                          = 0x20007481\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGDTRWAIT                     = 0x4004745a\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x40047403\n\tTIOCMODS                          = 0x80047404\n\tTIOCMSDTRWAIT                     = 0x8004745b\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCPTYGNAME                      = 0x40807453\n\tTIOCPTYGRANT                      = 0x20007454\n\tTIOCPTYUNLK                       = 0x20007452\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCONS                         = 0x20007463\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDRAINWAIT                    = 0x80047457\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x80487414\n\tTIOCSETAF                         = 0x80487416\n\tTIOCSETAW                         = 0x80487415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x20007465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCTIMESTAMP                     = 0x40107459\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVM_LOADAVG                        = 0x2\n\tVM_MACHFACTOR                     = 0x4\n\tVM_MAXID                          = 0x6\n\tVM_METER                          = 0x1\n\tVM_SWAPUSAGE                      = 0x5\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVT0                               = 0x0\n\tVT1                               = 0x10000\n\tVTDLY                             = 0x10000\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWCONTINUED                        = 0x10\n\tWCOREFLAG                         = 0x80\n\tWEXITED                           = 0x4\n\tWNOHANG                           = 0x1\n\tWNOWAIT                           = 0x20\n\tWORDSIZE                          = 0x40\n\tWSTOPPED                          = 0x8\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADARCH        = syscall.Errno(0x56)\n\tEBADEXEC        = syscall.Errno(0x55)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMACHO       = syscall.Errno(0x58)\n\tEBADMSG         = syscall.Errno(0x5e)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x59)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDEVERR         = syscall.Errno(0x53)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x5a)\n\tEILSEQ          = syscall.Errno(0x5c)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x6a)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5f)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x5d)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODATA         = syscall.Errno(0x60)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x61)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x5b)\n\tENOPOLICY       = syscall.Errno(0x67)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x62)\n\tENOSTR          = syscall.Errno(0x63)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTRECOVERABLE = syscall.Errno(0x68)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x66)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEOWNERDEAD      = syscall.Errno(0x69)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x64)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tEPWROFF         = syscall.Errno(0x52)\n\tEQFULL          = syscall.Errno(0x6a)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHLIBVERS      = syscall.Errno(0x57)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIME           = syscall.Errno(0x65)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"device not configured\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource deadlock avoided\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"resource busy\",\n\t17:  \"file exists\",\n\t18:  \"cross-device link\",\n\t19:  \"operation not supported by device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"result too large\",\n\t35:  \"resource temporarily unavailable\",\n\t36:  \"operation now in progress\",\n\t37:  \"operation already in progress\",\n\t38:  \"socket operation on non-socket\",\n\t39:  \"destination address required\",\n\t40:  \"message too long\",\n\t41:  \"protocol wrong type for socket\",\n\t42:  \"protocol not available\",\n\t43:  \"protocol not supported\",\n\t44:  \"socket type not supported\",\n\t45:  \"operation not supported\",\n\t46:  \"protocol family not supported\",\n\t47:  \"address family not supported by protocol family\",\n\t48:  \"address already in use\",\n\t49:  \"can't assign requested address\",\n\t50:  \"network is down\",\n\t51:  \"network is unreachable\",\n\t52:  \"network dropped connection on reset\",\n\t53:  \"software caused connection abort\",\n\t54:  \"connection reset by peer\",\n\t55:  \"no buffer space available\",\n\t56:  \"socket is already connected\",\n\t57:  \"socket is not connected\",\n\t58:  \"can't send after socket shutdown\",\n\t59:  \"too many references: can't splice\",\n\t60:  \"operation timed out\",\n\t61:  \"connection refused\",\n\t62:  \"too many levels of symbolic links\",\n\t63:  \"file name too long\",\n\t64:  \"host is down\",\n\t65:  \"no route to host\",\n\t66:  \"directory not empty\",\n\t67:  \"too many processes\",\n\t68:  \"too many users\",\n\t69:  \"disc quota exceeded\",\n\t70:  \"stale NFS file handle\",\n\t71:  \"too many levels of remote in path\",\n\t72:  \"RPC struct is bad\",\n\t73:  \"RPC version wrong\",\n\t74:  \"RPC prog. not avail\",\n\t75:  \"program version wrong\",\n\t76:  \"bad procedure for program\",\n\t77:  \"no locks available\",\n\t78:  \"function not implemented\",\n\t79:  \"inappropriate file type or format\",\n\t80:  \"authentication error\",\n\t81:  \"need authenticator\",\n\t82:  \"device power is off\",\n\t83:  \"device error\",\n\t84:  \"value too large to be stored in data type\",\n\t85:  \"bad executable (or shared library)\",\n\t86:  \"bad CPU type in executable\",\n\t87:  \"shared library version mismatch\",\n\t88:  \"malformed Mach-o file\",\n\t89:  \"operation canceled\",\n\t90:  \"identifier removed\",\n\t91:  \"no message of desired type\",\n\t92:  \"illegal byte sequence\",\n\t93:  \"attribute not found\",\n\t94:  \"bad message\",\n\t95:  \"EMULTIHOP (Reserved)\",\n\t96:  \"no message available on STREAM\",\n\t97:  \"ENOLINK (Reserved)\",\n\t98:  \"no STREAM resources\",\n\t99:  \"not a STREAM\",\n\t100: \"protocol error\",\n\t101: \"STREAM ioctl timeout\",\n\t102: \"operation not supported on socket\",\n\t103: \"policy not found\",\n\t104: \"state not recoverable\",\n\t105: \"previous owner died\",\n\t106: \"interface output queue is full\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go",
    "content": "// mkerrors.sh -m64\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm64,darwin\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1c\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x25\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x1e\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1c\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x28\n\tAF_NATM                           = 0x1f\n\tAF_NDRV                           = 0x1b\n\tAF_NETBIOS                        = 0x21\n\tAF_NS                             = 0x6\n\tAF_OSI                            = 0x7\n\tAF_PPP                            = 0x22\n\tAF_PUP                            = 0x4\n\tAF_RESERVED_36                    = 0x24\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x18\n\tAF_SNA                            = 0xb\n\tAF_SYSTEM                         = 0x20\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tAF_UTUN                           = 0x26\n\tALTWERASE                         = 0x200\n\tATTR_BIT_MAP_COUNT                = 0x5\n\tATTR_CMN_ACCESSMASK               = 0x20000\n\tATTR_CMN_ACCTIME                  = 0x1000\n\tATTR_CMN_ADDEDTIME                = 0x10000000\n\tATTR_CMN_BKUPTIME                 = 0x2000\n\tATTR_CMN_CHGTIME                  = 0x800\n\tATTR_CMN_CRTIME                   = 0x200\n\tATTR_CMN_DATA_PROTECT_FLAGS       = 0x40000000\n\tATTR_CMN_DEVID                    = 0x2\n\tATTR_CMN_DOCUMENT_ID              = 0x100000\n\tATTR_CMN_ERROR                    = 0x20000000\n\tATTR_CMN_EXTENDED_SECURITY        = 0x400000\n\tATTR_CMN_FILEID                   = 0x2000000\n\tATTR_CMN_FLAGS                    = 0x40000\n\tATTR_CMN_FNDRINFO                 = 0x4000\n\tATTR_CMN_FSID                     = 0x4\n\tATTR_CMN_FULLPATH                 = 0x8000000\n\tATTR_CMN_GEN_COUNT                = 0x80000\n\tATTR_CMN_GRPID                    = 0x10000\n\tATTR_CMN_GRPUUID                  = 0x1000000\n\tATTR_CMN_MODTIME                  = 0x400\n\tATTR_CMN_NAME                     = 0x1\n\tATTR_CMN_NAMEDATTRCOUNT           = 0x80000\n\tATTR_CMN_NAMEDATTRLIST            = 0x100000\n\tATTR_CMN_OBJID                    = 0x20\n\tATTR_CMN_OBJPERMANENTID           = 0x40\n\tATTR_CMN_OBJTAG                   = 0x10\n\tATTR_CMN_OBJTYPE                  = 0x8\n\tATTR_CMN_OWNERID                  = 0x8000\n\tATTR_CMN_PARENTID                 = 0x4000000\n\tATTR_CMN_PAROBJID                 = 0x80\n\tATTR_CMN_RETURNED_ATTRS           = 0x80000000\n\tATTR_CMN_SCRIPT                   = 0x100\n\tATTR_CMN_SETMASK                  = 0x41c7ff00\n\tATTR_CMN_USERACCESS               = 0x200000\n\tATTR_CMN_UUID                     = 0x800000\n\tATTR_CMN_VALIDMASK                = 0xffffffff\n\tATTR_CMN_VOLSETMASK               = 0x6700\n\tATTR_FILE_ALLOCSIZE               = 0x4\n\tATTR_FILE_CLUMPSIZE               = 0x10\n\tATTR_FILE_DATAALLOCSIZE           = 0x400\n\tATTR_FILE_DATAEXTENTS             = 0x800\n\tATTR_FILE_DATALENGTH              = 0x200\n\tATTR_FILE_DEVTYPE                 = 0x20\n\tATTR_FILE_FILETYPE                = 0x40\n\tATTR_FILE_FORKCOUNT               = 0x80\n\tATTR_FILE_FORKLIST                = 0x100\n\tATTR_FILE_IOBLOCKSIZE             = 0x8\n\tATTR_FILE_LINKCOUNT               = 0x1\n\tATTR_FILE_RSRCALLOCSIZE           = 0x2000\n\tATTR_FILE_RSRCEXTENTS             = 0x4000\n\tATTR_FILE_RSRCLENGTH              = 0x1000\n\tATTR_FILE_SETMASK                 = 0x20\n\tATTR_FILE_TOTALSIZE               = 0x2\n\tATTR_FILE_VALIDMASK               = 0x37ff\n\tATTR_VOL_ALLOCATIONCLUMP          = 0x40\n\tATTR_VOL_ATTRIBUTES               = 0x40000000\n\tATTR_VOL_CAPABILITIES             = 0x20000\n\tATTR_VOL_DIRCOUNT                 = 0x400\n\tATTR_VOL_ENCODINGSUSED            = 0x10000\n\tATTR_VOL_FILECOUNT                = 0x200\n\tATTR_VOL_FSTYPE                   = 0x1\n\tATTR_VOL_INFO                     = 0x80000000\n\tATTR_VOL_IOBLOCKSIZE              = 0x80\n\tATTR_VOL_MAXOBJCOUNT              = 0x800\n\tATTR_VOL_MINALLOCATION            = 0x20\n\tATTR_VOL_MOUNTEDDEVICE            = 0x8000\n\tATTR_VOL_MOUNTFLAGS               = 0x4000\n\tATTR_VOL_MOUNTPOINT               = 0x1000\n\tATTR_VOL_NAME                     = 0x2000\n\tATTR_VOL_OBJCOUNT                 = 0x100\n\tATTR_VOL_QUOTA_SIZE               = 0x10000000\n\tATTR_VOL_RESERVED_SIZE            = 0x20000000\n\tATTR_VOL_SETMASK                  = 0x80002000\n\tATTR_VOL_SIGNATURE                = 0x2\n\tATTR_VOL_SIZE                     = 0x4\n\tATTR_VOL_SPACEAVAIL               = 0x10\n\tATTR_VOL_SPACEFREE                = 0x8\n\tATTR_VOL_UUID                     = 0x40000\n\tATTR_VOL_VALIDMASK                = 0xf007ffff\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc00c4279\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044272\n\tBIOCGRTIMEOUT                     = 0x4010426e\n\tBIOCGSEESENT                      = 0x40044276\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044278\n\tBIOCSETF                          = 0x80104267\n\tBIOCSETFNR                        = 0x8010427e\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044273\n\tBIOCSRTIMEOUT                     = 0x8010426d\n\tBIOCSSEESENT                      = 0x80044277\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x80000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tBS0                               = 0x0\n\tBS1                               = 0x8000\n\tBSDLY                             = 0x8000\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCLOCK_MONOTONIC                   = 0x6\n\tCLOCK_MONOTONIC_RAW               = 0x4\n\tCLOCK_MONOTONIC_RAW_APPROX        = 0x5\n\tCLOCK_PROCESS_CPUTIME_ID          = 0xc\n\tCLOCK_REALTIME                    = 0x0\n\tCLOCK_THREAD_CPUTIME_ID           = 0x10\n\tCLOCK_UPTIME_RAW                  = 0x8\n\tCLOCK_UPTIME_RAW_APPROX           = 0x9\n\tCR0                               = 0x0\n\tCR1                               = 0x1000\n\tCR2                               = 0x2000\n\tCR3                               = 0x3000\n\tCRDLY                             = 0x3000\n\tCREAD                             = 0x800\n\tCRTSCTS                           = 0x30000\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_AOS                           = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CAN_SOCKETCAN                 = 0xe3\n\tDLT_CHAOS                         = 0x5\n\tDLT_CHDLC                         = 0x68\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DBUS                          = 0xe7\n\tDLT_DECT                          = 0xdd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_DVB_CI                        = 0xeb\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FC_2                          = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS        = 0xe1\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_GSMTAP_ABIS                   = 0xda\n\tDLT_GSMTAP_UM                     = 0xd9\n\tDLT_HHDLC                         = 0x79\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NOFCS            = 0xe6\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPFILTER                      = 0x74\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IPNET                         = 0xe2\n\tDLT_IPOIB                         = 0xf2\n\tDLT_IPV4                          = 0xe4\n\tDLT_IPV6                          = 0xe5\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_ATM_CEMIC             = 0xee\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FIBRECHANNEL          = 0xea\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_SRX_E2E               = 0xe9\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_JUNIPER_VS                    = 0xe8\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_EVDEV                   = 0xd8\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_PPP_WITHDIRECTION       = 0xa6\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MATCHING_MAX                  = 0xf5\n\tDLT_MATCHING_MIN                  = 0x68\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MPEG_2_TS                     = 0xf3\n\tDLT_MPLS                          = 0xdb\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_MUX27010                      = 0xec\n\tDLT_NETANALYZER                   = 0xf0\n\tDLT_NETANALYZER_TRANSPARENT       = 0xf1\n\tDLT_NFC_LLCP                      = 0xf5\n\tDLT_NFLOG                         = 0xef\n\tDLT_NG40                          = 0xf4\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PPP_WITH_DIRECTION            = 0xa6\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDLT_STANAG_5066_D_PDU             = 0xed\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_USB_LINUX_MMAPPED             = 0xdc\n\tDLT_USER0                         = 0x93\n\tDLT_USER1                         = 0x94\n\tDLT_USER10                        = 0x9d\n\tDLT_USER11                        = 0x9e\n\tDLT_USER12                        = 0x9f\n\tDLT_USER13                        = 0xa0\n\tDLT_USER14                        = 0xa1\n\tDLT_USER15                        = 0xa2\n\tDLT_USER2                         = 0x95\n\tDLT_USER3                         = 0x96\n\tDLT_USER4                         = 0x97\n\tDLT_USER5                         = 0x98\n\tDLT_USER6                         = 0x99\n\tDLT_USER7                         = 0x9a\n\tDLT_USER8                         = 0x9b\n\tDLT_USER9                         = 0x9c\n\tDLT_WIHART                        = 0xdf\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_EXCEPT                     = -0xf\n\tEVFILT_FS                         = -0x9\n\tEVFILT_MACHPORT                   = -0x8\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0xf\n\tEVFILT_THREADMARKER               = 0xf\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_USER                       = -0xa\n\tEVFILT_VM                         = -0xc\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_DISPATCH                       = 0x80\n\tEV_DISPATCH2                      = 0x180\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG0                          = 0x1000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_OOBAND                         = 0x2000\n\tEV_POLL                           = 0x1000\n\tEV_RECEIPT                        = 0x40\n\tEV_SYSFLAGS                       = 0xf000\n\tEV_UDATA_SPECIFIC                 = 0x100\n\tEV_VANISHED                       = 0x200\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFF0                               = 0x0\n\tFF1                               = 0x4000\n\tFFDLY                             = 0x4000\n\tFLUSHO                            = 0x800000\n\tFSOPT_ATTR_CMN_EXTENDED           = 0x20\n\tFSOPT_NOFOLLOW                    = 0x1\n\tFSOPT_NOINMEMUPDATE               = 0x2\n\tFSOPT_PACK_INVAL_ATTRS            = 0x8\n\tFSOPT_REPORT_FULLSIZE             = 0x4\n\tF_ADDFILESIGS                     = 0x3d\n\tF_ADDFILESIGS_FOR_DYLD_SIM        = 0x53\n\tF_ADDFILESIGS_RETURN              = 0x61\n\tF_ADDSIGS                         = 0x3b\n\tF_ALLOCATEALL                     = 0x4\n\tF_ALLOCATECONTIG                  = 0x2\n\tF_BARRIERFSYNC                    = 0x55\n\tF_CHECK_LV                        = 0x62\n\tF_CHKCLEAN                        = 0x29\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0x43\n\tF_FINDSIGS                        = 0x4e\n\tF_FLUSH_DATA                      = 0x28\n\tF_FREEZE_FS                       = 0x35\n\tF_FULLFSYNC                       = 0x33\n\tF_GETCODEDIR                      = 0x48\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETLKPID                        = 0x42\n\tF_GETNOSIGPIPE                    = 0x4a\n\tF_GETOWN                          = 0x5\n\tF_GETPATH                         = 0x32\n\tF_GETPATH_MTMINFO                 = 0x47\n\tF_GETPROTECTIONCLASS              = 0x3f\n\tF_GETPROTECTIONLEVEL              = 0x4d\n\tF_GLOBAL_NOCACHE                  = 0x37\n\tF_LOG2PHYS                        = 0x31\n\tF_LOG2PHYS_EXT                    = 0x41\n\tF_NOCACHE                         = 0x30\n\tF_NODIRECT                        = 0x3e\n\tF_OK                              = 0x0\n\tF_PATHPKG_CHECK                   = 0x34\n\tF_PEOFPOSMODE                     = 0x3\n\tF_PREALLOCATE                     = 0x2a\n\tF_PUNCHHOLE                       = 0x63\n\tF_RDADVISE                        = 0x2c\n\tF_RDAHEAD                         = 0x2d\n\tF_RDLCK                           = 0x1\n\tF_SETBACKINGSTORE                 = 0x46\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETLKWTIMEOUT                   = 0xa\n\tF_SETNOSIGPIPE                    = 0x49\n\tF_SETOWN                          = 0x6\n\tF_SETPROTECTIONCLASS              = 0x40\n\tF_SETSIZE                         = 0x2b\n\tF_SINGLE_WRITER                   = 0x4c\n\tF_THAW_FS                         = 0x36\n\tF_TRANSCODEKEY                    = 0x4b\n\tF_TRIM_ACTIVE_FILE                = 0x64\n\tF_UNLCK                           = 0x2\n\tF_VOLPOSMODE                      = 0x4\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_ALTPHYS                       = 0x4000\n\tIFF_BROADCAST                     = 0x2\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_AAL5                          = 0x31\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ATM                           = 0x25\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_CARP                          = 0xf8\n\tIFT_CELLULAR                      = 0xff\n\tIFT_CEPT                          = 0x13\n\tIFT_DS3                           = 0x1e\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0x38\n\tIFT_FDDI                          = 0xf\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_GIF                           = 0x37\n\tIFT_HDH1822                       = 0x3\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE8023ADLAG                 = 0x88\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88026                      = 0xa\n\tIFT_L2VLAN                        = 0x87\n\tIFT_LAPB                          = 0x10\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_NSIP                          = 0x1b\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PDP                           = 0xff\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PKTAP                         = 0xfe\n\tIFT_PPP                           = 0x17\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_RS232                         = 0x21\n\tIFT_SDLC                          = 0x11\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0x39\n\tIFT_T1                            = 0x12\n\tIFT_ULTRA                         = 0x1d\n\tIFT_V35                           = 0x2d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LINKLOCALNETNUM                = 0xa9fe0000\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_3PC                       = 0x22\n\tIPPROTO_ADFS                      = 0x44\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_AHIP                      = 0x3d\n\tIPPROTO_APES                      = 0x63\n\tIPPROTO_ARGUS                     = 0xd\n\tIPPROTO_AX25                      = 0x5d\n\tIPPROTO_BHA                       = 0x31\n\tIPPROTO_BLT                       = 0x1e\n\tIPPROTO_BRSATMON                  = 0x4c\n\tIPPROTO_CFTP                      = 0x3e\n\tIPPROTO_CHAOS                     = 0x10\n\tIPPROTO_CMTP                      = 0x26\n\tIPPROTO_CPHB                      = 0x49\n\tIPPROTO_CPNX                      = 0x48\n\tIPPROTO_DDP                       = 0x25\n\tIPPROTO_DGP                       = 0x56\n\tIPPROTO_DIVERT                    = 0xfe\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_EMCON                     = 0xe\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GMTP                      = 0x64\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HELLO                     = 0x3f\n\tIPPROTO_HMP                       = 0x14\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IDPR                      = 0x23\n\tIPPROTO_IDRP                      = 0x2d\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IGP                       = 0x55\n\tIPPROTO_IGRP                      = 0x58\n\tIPPROTO_IL                        = 0x28\n\tIPPROTO_INLSP                     = 0x34\n\tIPPROTO_INP                       = 0x20\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPCV                      = 0x47\n\tIPPROTO_IPEIP                     = 0x5e\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPPC                      = 0x43\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IRTP                      = 0x1c\n\tIPPROTO_KRYPTOLAN                 = 0x41\n\tIPPROTO_LARP                      = 0x5b\n\tIPPROTO_LEAF1                     = 0x19\n\tIPPROTO_LEAF2                     = 0x1a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MEAS                      = 0x13\n\tIPPROTO_MHRP                      = 0x30\n\tIPPROTO_MICP                      = 0x5f\n\tIPPROTO_MTP                       = 0x5c\n\tIPPROTO_MUX                       = 0x12\n\tIPPROTO_ND                        = 0x4d\n\tIPPROTO_NHRP                      = 0x36\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_NSP                       = 0x1f\n\tIPPROTO_NVPII                     = 0xb\n\tIPPROTO_OSPFIGP                   = 0x59\n\tIPPROTO_PGM                       = 0x71\n\tIPPROTO_PIGP                      = 0x9\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PRM                       = 0x15\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_PVP                       = 0x4b\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_RCCMON                    = 0xa\n\tIPPROTO_RDP                       = 0x1b\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_RVD                       = 0x42\n\tIPPROTO_SATEXPAK                  = 0x40\n\tIPPROTO_SATMON                    = 0x45\n\tIPPROTO_SCCSP                     = 0x60\n\tIPPROTO_SCTP                      = 0x84\n\tIPPROTO_SDRP                      = 0x2a\n\tIPPROTO_SEP                       = 0x21\n\tIPPROTO_SRPC                      = 0x5a\n\tIPPROTO_ST                        = 0x7\n\tIPPROTO_SVMTP                     = 0x52\n\tIPPROTO_SWIPE                     = 0x35\n\tIPPROTO_TCF                       = 0x57\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_TPXX                      = 0x27\n\tIPPROTO_TRUNK1                    = 0x17\n\tIPPROTO_TRUNK2                    = 0x18\n\tIPPROTO_TTP                       = 0x54\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_VINES                     = 0x53\n\tIPPROTO_VISA                      = 0x46\n\tIPPROTO_VMTP                      = 0x51\n\tIPPROTO_WBEXPAK                   = 0x4f\n\tIPPROTO_WBMON                     = 0x4e\n\tIPPROTO_WSN                       = 0x4a\n\tIPPROTO_XNET                      = 0xf\n\tIPPROTO_XTP                       = 0x24\n\tIPV6_2292DSTOPTS                  = 0x17\n\tIPV6_2292HOPLIMIT                 = 0x14\n\tIPV6_2292HOPOPTS                  = 0x16\n\tIPV6_2292NEXTHOP                  = 0x15\n\tIPV6_2292PKTINFO                  = 0x13\n\tIPV6_2292PKTOPTIONS               = 0x19\n\tIPV6_2292RTHDR                    = 0x18\n\tIPV6_BINDV6ONLY                   = 0x1b\n\tIPV6_BOUND_IF                     = 0x7d\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FLOW_ECN_MASK                = 0x300\n\tIPV6_FRAGTTL                      = 0x3c\n\tIPV6_FW_ADD                       = 0x1e\n\tIPV6_FW_DEL                       = 0x1f\n\tIPV6_FW_FLUSH                     = 0x20\n\tIPV6_FW_GET                       = 0x22\n\tIPV6_FW_ZERO                      = 0x21\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXOPTHDR                    = 0x800\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MAX_GROUP_SRC_FILTER         = 0x200\n\tIPV6_MAX_MEMBERSHIPS              = 0xfff\n\tIPV6_MAX_SOCK_SRC_FILTER          = 0x80\n\tIPV6_MIN_MEMBERSHIPS              = 0x1f\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVTCLASS                   = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x24\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_ADD_SOURCE_MEMBERSHIP          = 0x46\n\tIP_BLOCK_SOURCE                   = 0x48\n\tIP_BOUND_IF                       = 0x19\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_DROP_SOURCE_MEMBERSHIP         = 0x47\n\tIP_DUMMYNET_CONFIGURE             = 0x3c\n\tIP_DUMMYNET_DEL                   = 0x3d\n\tIP_DUMMYNET_FLUSH                 = 0x3e\n\tIP_DUMMYNET_GET                   = 0x40\n\tIP_FAITH                          = 0x16\n\tIP_FW_ADD                         = 0x28\n\tIP_FW_DEL                         = 0x29\n\tIP_FW_FLUSH                       = 0x2a\n\tIP_FW_GET                         = 0x2c\n\tIP_FW_RESETLOG                    = 0x2d\n\tIP_FW_ZERO                        = 0x2b\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x15\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_GROUP_SRC_FILTER           = 0x200\n\tIP_MAX_MEMBERSHIPS                = 0xfff\n\tIP_MAX_SOCK_MUTE_FILTER           = 0x80\n\tIP_MAX_SOCK_SRC_FILTER            = 0x80\n\tIP_MF                             = 0x2000\n\tIP_MIN_MEMBERSHIPS                = 0x1f\n\tIP_MSFILTER                       = 0x4a\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_IFINDEX              = 0x42\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_MULTICAST_VIF                  = 0xe\n\tIP_NAT__XXX                       = 0x37\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OLD_FW_ADD                     = 0x32\n\tIP_OLD_FW_DEL                     = 0x33\n\tIP_OLD_FW_FLUSH                   = 0x34\n\tIP_OLD_FW_GET                     = 0x36\n\tIP_OLD_FW_RESETLOG                = 0x38\n\tIP_OLD_FW_ZERO                    = 0x35\n\tIP_OPTIONS                        = 0x1\n\tIP_PKTINFO                        = 0x1a\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVPKTINFO                    = 0x1a\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTOS                        = 0x1b\n\tIP_RECVTTL                        = 0x18\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RSVP_OFF                       = 0x10\n\tIP_RSVP_ON                        = 0xf\n\tIP_RSVP_VIF_OFF                   = 0x12\n\tIP_RSVP_VIF_ON                    = 0x11\n\tIP_STRIPHDR                       = 0x17\n\tIP_TOS                            = 0x3\n\tIP_TRAFFIC_MGT_BACKGROUND         = 0x41\n\tIP_TTL                            = 0x4\n\tIP_UNBLOCK_SOURCE                 = 0x49\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIUTF8                             = 0x4000\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_CAN_REUSE                    = 0x9\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x5\n\tMADV_FREE_REUSABLE                = 0x7\n\tMADV_FREE_REUSE                   = 0x8\n\tMADV_NORMAL                       = 0x0\n\tMADV_PAGEOUT                      = 0xa\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_WILLNEED                     = 0x3\n\tMADV_ZERO_WIRED_PAGES             = 0x6\n\tMAP_ANON                          = 0x1000\n\tMAP_ANONYMOUS                     = 0x1000\n\tMAP_COPY                          = 0x2\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_JIT                           = 0x800\n\tMAP_NOCACHE                       = 0x400\n\tMAP_NOEXTEND                      = 0x100\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_RESERVED0080                  = 0x80\n\tMAP_RESILIENT_CODESIGN            = 0x2000\n\tMAP_RESILIENT_MEDIA               = 0x4000\n\tMAP_SHARED                        = 0x1\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMNT_ASYNC                         = 0x40\n\tMNT_AUTOMOUNTED                   = 0x400000\n\tMNT_CMDFLAGS                      = 0xf0000\n\tMNT_CPROTECT                      = 0x80\n\tMNT_DEFWRITE                      = 0x2000000\n\tMNT_DONTBROWSE                    = 0x100000\n\tMNT_DOVOLFS                       = 0x8000\n\tMNT_DWAIT                         = 0x4\n\tMNT_EXPORTED                      = 0x100\n\tMNT_FORCE                         = 0x80000\n\tMNT_IGNORE_OWNERSHIP              = 0x200000\n\tMNT_JOURNALED                     = 0x800000\n\tMNT_LOCAL                         = 0x1000\n\tMNT_MULTILABEL                    = 0x4000000\n\tMNT_NOATIME                       = 0x10000000\n\tMNT_NOBLOCK                       = 0x20000\n\tMNT_NODEV                         = 0x10\n\tMNT_NOEXEC                        = 0x4\n\tMNT_NOSUID                        = 0x8\n\tMNT_NOUSERXATTR                   = 0x1000000\n\tMNT_NOWAIT                        = 0x2\n\tMNT_QUARANTINE                    = 0x400\n\tMNT_QUOTA                         = 0x2000\n\tMNT_RDONLY                        = 0x1\n\tMNT_RELOAD                        = 0x40000\n\tMNT_ROOTFS                        = 0x4000\n\tMNT_SYNCHRONOUS                   = 0x2\n\tMNT_UNION                         = 0x20\n\tMNT_UNKNOWNPERMISSIONS            = 0x200000\n\tMNT_UPDATE                        = 0x10000\n\tMNT_VISFLAGMASK                   = 0x17f0f5ff\n\tMNT_WAIT                          = 0x1\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOF                           = 0x100\n\tMSG_EOR                           = 0x8\n\tMSG_FLUSH                         = 0x400\n\tMSG_HAVEMORE                      = 0x2000\n\tMSG_HOLD                          = 0x800\n\tMSG_NEEDSA                        = 0x10000\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_RCVMORE                       = 0x4000\n\tMSG_SEND                          = 0x1000\n\tMSG_TRUNC                         = 0x10\n\tMSG_WAITALL                       = 0x40\n\tMSG_WAITSTREAM                    = 0x200\n\tMS_ASYNC                          = 0x1\n\tMS_DEACTIVATE                     = 0x8\n\tMS_INVALIDATE                     = 0x2\n\tMS_KILLPAGES                      = 0x4\n\tMS_SYNC                           = 0x10\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_DUMP2                      = 0x7\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_IFLIST2                    = 0x6\n\tNET_RT_MAXID                      = 0xa\n\tNET_RT_STAT                       = 0x4\n\tNET_RT_TRASH                      = 0x5\n\tNL0                               = 0x0\n\tNL1                               = 0x100\n\tNL2                               = 0x200\n\tNL3                               = 0x300\n\tNLDLY                             = 0x300\n\tNOFLSH                            = 0x80000000\n\tNOKERNINFO                        = 0x2000000\n\tNOTE_ABSOLUTE                     = 0x8\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_BACKGROUND                   = 0x40\n\tNOTE_CHILD                        = 0x4\n\tNOTE_CRITICAL                     = 0x20\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXITSTATUS                   = 0x4000000\n\tNOTE_EXIT_CSERROR                 = 0x40000\n\tNOTE_EXIT_DECRYPTFAIL             = 0x10000\n\tNOTE_EXIT_DETAIL                  = 0x2000000\n\tNOTE_EXIT_DETAIL_MASK             = 0x70000\n\tNOTE_EXIT_MEMORY                  = 0x20000\n\tNOTE_EXIT_REPARENTED              = 0x80000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FFAND                        = 0x40000000\n\tNOTE_FFCOPY                       = 0xc0000000\n\tNOTE_FFCTRLMASK                   = 0xc0000000\n\tNOTE_FFLAGSMASK                   = 0xffffff\n\tNOTE_FFNOP                        = 0x0\n\tNOTE_FFOR                         = 0x80000000\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_FUNLOCK                      = 0x100\n\tNOTE_LEEWAY                       = 0x10\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_MACH_CONTINUOUS_TIME         = 0x80\n\tNOTE_NONE                         = 0x80\n\tNOTE_NSECONDS                     = 0x4\n\tNOTE_OOB                          = 0x2\n\tNOTE_PCTRLMASK                    = -0x100000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_REAP                         = 0x10000000\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_SECONDS                      = 0x1\n\tNOTE_SIGNAL                       = 0x8000000\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRIGGER                      = 0x1000000\n\tNOTE_USECONDS                     = 0x2\n\tNOTE_VM_ERROR                     = 0x10000000\n\tNOTE_VM_PRESSURE                  = 0x80000000\n\tNOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000\n\tNOTE_VM_PRESSURE_TERMINATE        = 0x40000000\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tOFDEL                             = 0x20000\n\tOFILL                             = 0x80\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tOXTABS                            = 0x4\n\tO_ACCMODE                         = 0x3\n\tO_ALERT                           = 0x20000000\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x1000000\n\tO_CREAT                           = 0x200\n\tO_DIRECTORY                       = 0x100000\n\tO_DP_GETRAWENCRYPTED              = 0x1\n\tO_DP_GETRAWUNENCRYPTED            = 0x2\n\tO_DSYNC                           = 0x400000\n\tO_EVTONLY                         = 0x8000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x20000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_POPUP                           = 0x80000000\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_SHLOCK                          = 0x10\n\tO_SYMLINK                         = 0x200000\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tPT_ATTACH                         = 0xa\n\tPT_ATTACHEXC                      = 0xe\n\tPT_CONTINUE                       = 0x7\n\tPT_DENY_ATTACH                    = 0x1f\n\tPT_DETACH                         = 0xb\n\tPT_FIRSTMACH                      = 0x20\n\tPT_FORCEQUOTA                     = 0x1e\n\tPT_KILL                           = 0x8\n\tPT_READ_D                         = 0x2\n\tPT_READ_I                         = 0x1\n\tPT_READ_U                         = 0x3\n\tPT_SIGEXC                         = 0xc\n\tPT_STEP                           = 0x9\n\tPT_THUPDATE                       = 0xd\n\tPT_TRACE_ME                       = 0x0\n\tPT_WRITE_D                        = 0x5\n\tPT_WRITE_I                        = 0x4\n\tPT_WRITE_U                        = 0x6\n\tRLIMIT_AS                         = 0x5\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_CPU_USAGE_MONITOR          = 0x2\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_MEMLOCK                    = 0x6\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_NPROC                      = 0x7\n\tRLIMIT_RSS                        = 0x5\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0x8\n\tRTAX_NETMASK                      = 0x2\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_NETMASK                       = 0x4\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_BROADCAST                     = 0x400000\n\tRTF_CLONING                       = 0x100\n\tRTF_CONDEMNED                     = 0x2000000\n\tRTF_DELCLONE                      = 0x80\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_IFREF                         = 0x4000000\n\tRTF_IFSCOPE                       = 0x1000000\n\tRTF_LLINFO                        = 0x400\n\tRTF_LOCAL                         = 0x200000\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MULTICAST                     = 0x800000\n\tRTF_NOIFREF                       = 0x2000\n\tRTF_PINNED                        = 0x100000\n\tRTF_PRCLONING                     = 0x10000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x40000\n\tRTF_PROXY                         = 0x8000000\n\tRTF_REJECT                        = 0x8\n\tRTF_ROUTER                        = 0x10000000\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_WASCLONED                     = 0x20000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DELMADDR                      = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_GET2                          = 0x14\n\tRTM_IFINFO                        = 0xe\n\tRTM_IFINFO2                       = 0x12\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_NEWMADDR                      = 0xf\n\tRTM_NEWMADDR2                     = 0x13\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x5\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x3\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x2\n\tSCM_TIMESTAMP_MONOTONIC           = 0x4\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCARPIPLL                       = 0xc0206928\n\tSIOCATMARK                        = 0x40047307\n\tSIOCAUTOADDR                      = 0xc0206926\n\tSIOCAUTONETMASK                   = 0x80206927\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFPHYADDR                    = 0x80206941\n\tSIOCGDRVSPEC                      = 0xc028697b\n\tSIOCGETVLAN                       = 0xc020697f\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFALTMTU                     = 0xc0206948\n\tSIOCGIFASYNCMAP                   = 0xc020697c\n\tSIOCGIFBOND                       = 0xc0206947\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCAP                        = 0xc020695b\n\tSIOCGIFCONF                       = 0xc00c6924\n\tSIOCGIFDEVMTU                     = 0xc0206944\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFKPI                        = 0xc0206987\n\tSIOCGIFMAC                        = 0xc0206982\n\tSIOCGIFMEDIA                      = 0xc02c6938\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc0206933\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206940\n\tSIOCGIFPHYS                       = 0xc0206935\n\tSIOCGIFPSRCADDR                   = 0xc020693f\n\tSIOCGIFSTATUS                     = 0xc331693d\n\tSIOCGIFVLAN                       = 0xc020697f\n\tSIOCGIFWAKEFLAGS                  = 0xc0206988\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCIFCREATE                      = 0xc0206978\n\tSIOCIFCREATE2                     = 0xc020697a\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc0106981\n\tSIOCRSLVMULTI                     = 0xc010693b\n\tSIOCSDRVSPEC                      = 0x8028697b\n\tSIOCSETVLAN                       = 0x8020697e\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFALTMTU                     = 0x80206945\n\tSIOCSIFASYNCMAP                   = 0x8020697d\n\tSIOCSIFBOND                       = 0x80206946\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFCAP                        = 0x8020695a\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFKPI                        = 0x80206986\n\tSIOCSIFLLADDR                     = 0x8020693c\n\tSIOCSIFMAC                        = 0x80206983\n\tSIOCSIFMEDIA                      = 0xc0206937\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x80206934\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x8040693e\n\tSIOCSIFPHYS                       = 0x80206936\n\tSIOCSIFVLAN                       = 0x8020697e\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_MAXADDRLEN                   = 0xff\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_DONTTRUNC                      = 0x2000\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LABEL                          = 0x1010\n\tSO_LINGER                         = 0x80\n\tSO_LINGER_SEC                     = 0x1080\n\tSO_NETSVC_MARKING_LEVEL           = 0x1119\n\tSO_NET_SERVICE_TYPE               = 0x1116\n\tSO_NKE                            = 0x1021\n\tSO_NOADDRERR                      = 0x1023\n\tSO_NOSIGPIPE                      = 0x1022\n\tSO_NOTIFYCONFLICT                 = 0x1026\n\tSO_NP_EXTENSIONS                  = 0x1083\n\tSO_NREAD                          = 0x1020\n\tSO_NUMRCVPKT                      = 0x1112\n\tSO_NWRITE                         = 0x1024\n\tSO_OOBINLINE                      = 0x100\n\tSO_PEERLABEL                      = 0x1011\n\tSO_RANDOMPORT                     = 0x1082\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_REUSESHAREUID                  = 0x1025\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_TIMESTAMP                      = 0x400\n\tSO_TIMESTAMP_MONOTONIC            = 0x800\n\tSO_TYPE                           = 0x1008\n\tSO_UPCALLCLOSEWAIT                = 0x1027\n\tSO_USELOOPBACK                    = 0x40\n\tSO_WANTMORE                       = 0x4000\n\tSO_WANTOOBFLAG                    = 0x8000\n\tS_IEXEC                           = 0x40\n\tS_IFBLK                           = 0x6000\n\tS_IFCHR                           = 0x2000\n\tS_IFDIR                           = 0x4000\n\tS_IFIFO                           = 0x1000\n\tS_IFLNK                           = 0xa000\n\tS_IFMT                            = 0xf000\n\tS_IFREG                           = 0x8000\n\tS_IFSOCK                          = 0xc000\n\tS_IFWHT                           = 0xe000\n\tS_IREAD                           = 0x100\n\tS_IRGRP                           = 0x20\n\tS_IROTH                           = 0x4\n\tS_IRUSR                           = 0x100\n\tS_IRWXG                           = 0x38\n\tS_IRWXO                           = 0x7\n\tS_IRWXU                           = 0x1c0\n\tS_ISGID                           = 0x400\n\tS_ISTXT                           = 0x200\n\tS_ISUID                           = 0x800\n\tS_ISVTX                           = 0x200\n\tS_IWGRP                           = 0x10\n\tS_IWOTH                           = 0x2\n\tS_IWRITE                          = 0x80\n\tS_IWUSR                           = 0x80\n\tS_IXGRP                           = 0x8\n\tS_IXOTH                           = 0x1\n\tS_IXUSR                           = 0x40\n\tTAB0                              = 0x0\n\tTAB1                              = 0x400\n\tTAB2                              = 0x800\n\tTAB3                              = 0x4\n\tTABDLY                            = 0xc04\n\tTCIFLUSH                          = 0x1\n\tTCIOFF                            = 0x3\n\tTCIOFLUSH                         = 0x3\n\tTCION                             = 0x4\n\tTCOFLUSH                          = 0x2\n\tTCOOFF                            = 0x1\n\tTCOON                             = 0x2\n\tTCP_CONNECTIONTIMEOUT             = 0x20\n\tTCP_CONNECTION_INFO               = 0x106\n\tTCP_ENABLE_ECN                    = 0x104\n\tTCP_FASTOPEN                      = 0x105\n\tTCP_KEEPALIVE                     = 0x10\n\tTCP_KEEPCNT                       = 0x102\n\tTCP_KEEPINTVL                     = 0x101\n\tTCP_MAXHLEN                       = 0x3c\n\tTCP_MAXOLEN                       = 0x28\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_SACK                      = 0x4\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MINMSS                        = 0xd8\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOOPT                         = 0x8\n\tTCP_NOPUSH                        = 0x4\n\tTCP_NOTSENT_LOWAT                 = 0x201\n\tTCP_RXT_CONNDROPTIME              = 0x80\n\tTCP_RXT_FINDROP                   = 0x100\n\tTCP_SENDMOREACKS                  = 0x103\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x40107458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCDSIMICROCODE                  = 0x20007455\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGDRAINWAIT                    = 0x40047456\n\tTIOCGETA                          = 0x40487413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCIXOFF                         = 0x20007480\n\tTIOCIXON                          = 0x20007481\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGDTRWAIT                     = 0x4004745a\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x40047403\n\tTIOCMODS                          = 0x80047404\n\tTIOCMSDTRWAIT                     = 0x8004745b\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCPTYGNAME                      = 0x40807453\n\tTIOCPTYGRANT                      = 0x20007454\n\tTIOCPTYUNLK                       = 0x20007452\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCONS                         = 0x20007463\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDRAINWAIT                    = 0x80047457\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x80487414\n\tTIOCSETAF                         = 0x80487416\n\tTIOCSETAW                         = 0x80487415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x20007465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCTIMESTAMP                     = 0x40107459\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVM_LOADAVG                        = 0x2\n\tVM_MACHFACTOR                     = 0x4\n\tVM_MAXID                          = 0x6\n\tVM_METER                          = 0x1\n\tVM_SWAPUSAGE                      = 0x5\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVT0                               = 0x0\n\tVT1                               = 0x10000\n\tVTDLY                             = 0x10000\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWCONTINUED                        = 0x10\n\tWCOREFLAG                         = 0x80\n\tWEXITED                           = 0x4\n\tWNOHANG                           = 0x1\n\tWNOWAIT                           = 0x20\n\tWORDSIZE                          = 0x40\n\tWSTOPPED                          = 0x8\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADARCH        = syscall.Errno(0x56)\n\tEBADEXEC        = syscall.Errno(0x55)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMACHO       = syscall.Errno(0x58)\n\tEBADMSG         = syscall.Errno(0x5e)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x59)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDEVERR         = syscall.Errno(0x53)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x5a)\n\tEILSEQ          = syscall.Errno(0x5c)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x6a)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5f)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x5d)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODATA         = syscall.Errno(0x60)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x61)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x5b)\n\tENOPOLICY       = syscall.Errno(0x67)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x62)\n\tENOSTR          = syscall.Errno(0x63)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTRECOVERABLE = syscall.Errno(0x68)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x66)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEOWNERDEAD      = syscall.Errno(0x69)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x64)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tEPWROFF         = syscall.Errno(0x52)\n\tEQFULL          = syscall.Errno(0x6a)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHLIBVERS      = syscall.Errno(0x57)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIME           = syscall.Errno(0x65)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"device not configured\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource deadlock avoided\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"resource busy\",\n\t17:  \"file exists\",\n\t18:  \"cross-device link\",\n\t19:  \"operation not supported by device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"result too large\",\n\t35:  \"resource temporarily unavailable\",\n\t36:  \"operation now in progress\",\n\t37:  \"operation already in progress\",\n\t38:  \"socket operation on non-socket\",\n\t39:  \"destination address required\",\n\t40:  \"message too long\",\n\t41:  \"protocol wrong type for socket\",\n\t42:  \"protocol not available\",\n\t43:  \"protocol not supported\",\n\t44:  \"socket type not supported\",\n\t45:  \"operation not supported\",\n\t46:  \"protocol family not supported\",\n\t47:  \"address family not supported by protocol family\",\n\t48:  \"address already in use\",\n\t49:  \"can't assign requested address\",\n\t50:  \"network is down\",\n\t51:  \"network is unreachable\",\n\t52:  \"network dropped connection on reset\",\n\t53:  \"software caused connection abort\",\n\t54:  \"connection reset by peer\",\n\t55:  \"no buffer space available\",\n\t56:  \"socket is already connected\",\n\t57:  \"socket is not connected\",\n\t58:  \"can't send after socket shutdown\",\n\t59:  \"too many references: can't splice\",\n\t60:  \"operation timed out\",\n\t61:  \"connection refused\",\n\t62:  \"too many levels of symbolic links\",\n\t63:  \"file name too long\",\n\t64:  \"host is down\",\n\t65:  \"no route to host\",\n\t66:  \"directory not empty\",\n\t67:  \"too many processes\",\n\t68:  \"too many users\",\n\t69:  \"disc quota exceeded\",\n\t70:  \"stale NFS file handle\",\n\t71:  \"too many levels of remote in path\",\n\t72:  \"RPC struct is bad\",\n\t73:  \"RPC version wrong\",\n\t74:  \"RPC prog. not avail\",\n\t75:  \"program version wrong\",\n\t76:  \"bad procedure for program\",\n\t77:  \"no locks available\",\n\t78:  \"function not implemented\",\n\t79:  \"inappropriate file type or format\",\n\t80:  \"authentication error\",\n\t81:  \"need authenticator\",\n\t82:  \"device power is off\",\n\t83:  \"device error\",\n\t84:  \"value too large to be stored in data type\",\n\t85:  \"bad executable (or shared library)\",\n\t86:  \"bad CPU type in executable\",\n\t87:  \"shared library version mismatch\",\n\t88:  \"malformed Mach-o file\",\n\t89:  \"operation canceled\",\n\t90:  \"identifier removed\",\n\t91:  \"no message of desired type\",\n\t92:  \"illegal byte sequence\",\n\t93:  \"attribute not found\",\n\t94:  \"bad message\",\n\t95:  \"EMULTIHOP (Reserved)\",\n\t96:  \"no message available on STREAM\",\n\t97:  \"ENOLINK (Reserved)\",\n\t98:  \"no STREAM resources\",\n\t99:  \"not a STREAM\",\n\t100: \"protocol error\",\n\t101: \"STREAM ioctl timeout\",\n\t102: \"operation not supported on socket\",\n\t103: \"policy not found\",\n\t104: \"state not recoverable\",\n\t105: \"previous owner died\",\n\t106: \"interface output queue is full\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go",
    "content": "// mkerrors.sh -m64\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,dragonfly\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_ATM                            = 0x1e\n\tAF_BLUETOOTH                      = 0x21\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1a\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x23\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x1c\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1a\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x24\n\tAF_MPLS                           = 0x22\n\tAF_NATM                           = 0x1d\n\tAF_NETBIOS                        = 0x6\n\tAF_NETGRAPH                       = 0x20\n\tAF_OSI                            = 0x7\n\tAF_PUP                            = 0x4\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x18\n\tAF_SNA                            = 0xb\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tALTWERASE                         = 0x200\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc0104279\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044272\n\tBIOCGRTIMEOUT                     = 0x4010426e\n\tBIOCGSEESENT                      = 0x40044276\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCLOCK                          = 0x2000427a\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044278\n\tBIOCSETF                          = 0x80104267\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSETWF                         = 0x8010427b\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044273\n\tBIOCSRTIMEOUT                     = 0x8010426d\n\tBIOCSSEESENT                      = 0x80044277\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x8\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DEFAULTBUFSIZE                = 0x1000\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x80000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MAX_CLONES                    = 0x80\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCLOCK_MONOTONIC                   = 0x4\n\tCLOCK_MONOTONIC_FAST              = 0xc\n\tCLOCK_MONOTONIC_PRECISE           = 0xb\n\tCLOCK_PROCESS_CPUTIME_ID          = 0xf\n\tCLOCK_PROF                        = 0x2\n\tCLOCK_REALTIME                    = 0x0\n\tCLOCK_REALTIME_FAST               = 0xa\n\tCLOCK_REALTIME_PRECISE            = 0x9\n\tCLOCK_SECOND                      = 0xd\n\tCLOCK_THREAD_CPUTIME_ID           = 0xe\n\tCLOCK_UPTIME                      = 0x5\n\tCLOCK_UPTIME_FAST                 = 0x8\n\tCLOCK_UPTIME_PRECISE              = 0x7\n\tCLOCK_VIRTUAL                     = 0x1\n\tCREAD                             = 0x800\n\tCRTSCTS                           = 0x30000\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CHAOS                         = 0x5\n\tDLT_CHDLC                         = 0x68\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_HHDLC                         = 0x79\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPFILTER                      = 0x74\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_REDBACK_SMARTEDGE             = 0x20\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DBF                            = 0xf\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_EXCEPT                     = -0x8\n\tEVFILT_FS                         = -0xa\n\tEVFILT_MARKER                     = 0xf\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0xa\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_USER                       = -0x9\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_DISPATCH                       = 0x80\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG1                          = 0x2000\n\tEV_NODATA                         = 0x1000\n\tEV_ONESHOT                        = 0x10\n\tEV_RECEIPT                        = 0x40\n\tEV_SYSFLAGS                       = 0xf000\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTEXIT_LWP                       = 0x10000\n\tEXTEXIT_PROC                      = 0x0\n\tEXTEXIT_SETINT                    = 0x1\n\tEXTEXIT_SIMPLE                    = 0x0\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFLUSHO                            = 0x800000\n\tF_DUP2FD                          = 0xa\n\tF_DUP2FD_CLOEXEC                  = 0x12\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0x11\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETOWN                          = 0x5\n\tF_OK                              = 0x0\n\tF_RDLCK                           = 0x1\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETOWN                          = 0x6\n\tF_UNLCK                           = 0x2\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFAN_ARRIVAL                      = 0x0\n\tIFAN_DEPARTURE                    = 0x1\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_ALTPHYS                       = 0x4000\n\tIFF_BROADCAST                     = 0x2\n\tIFF_CANTCHANGE                    = 0x118e72\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MONITOR                       = 0x40000\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NPOLLING                      = 0x100000\n\tIFF_OACTIVE                       = 0x400\n\tIFF_OACTIVE_COMPAT                = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_POLLING                       = 0x10000\n\tIFF_POLLING_COMPAT                = 0x10000\n\tIFF_PPROMISC                      = 0x20000\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_SMART                         = 0x20\n\tIFF_STATICARP                     = 0x80000\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_BSC                           = 0x53\n\tIFT_CARP                          = 0xf8\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf2\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L2VLAN                        = 0x87\n\tIFT_L3IPVLAN                      = 0x88\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PLC                           = 0xae\n\tIFT_POS                           = 0xab\n\tIFT_PPP                           = 0x17\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf1\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0xf3\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_3PC                       = 0x22\n\tIPPROTO_ADFS                      = 0x44\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_AHIP                      = 0x3d\n\tIPPROTO_APES                      = 0x63\n\tIPPROTO_ARGUS                     = 0xd\n\tIPPROTO_AX25                      = 0x5d\n\tIPPROTO_BHA                       = 0x31\n\tIPPROTO_BLT                       = 0x1e\n\tIPPROTO_BRSATMON                  = 0x4c\n\tIPPROTO_CARP                      = 0x70\n\tIPPROTO_CFTP                      = 0x3e\n\tIPPROTO_CHAOS                     = 0x10\n\tIPPROTO_CMTP                      = 0x26\n\tIPPROTO_CPHB                      = 0x49\n\tIPPROTO_CPNX                      = 0x48\n\tIPPROTO_DDP                       = 0x25\n\tIPPROTO_DGP                       = 0x56\n\tIPPROTO_DIVERT                    = 0xfe\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_EMCON                     = 0xe\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GMTP                      = 0x64\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HELLO                     = 0x3f\n\tIPPROTO_HMP                       = 0x14\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IDPR                      = 0x23\n\tIPPROTO_IDRP                      = 0x2d\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IGP                       = 0x55\n\tIPPROTO_IGRP                      = 0x58\n\tIPPROTO_IL                        = 0x28\n\tIPPROTO_INLSP                     = 0x34\n\tIPPROTO_INP                       = 0x20\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPCV                      = 0x47\n\tIPPROTO_IPEIP                     = 0x5e\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPPC                      = 0x43\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IRTP                      = 0x1c\n\tIPPROTO_KRYPTOLAN                 = 0x41\n\tIPPROTO_LARP                      = 0x5b\n\tIPPROTO_LEAF1                     = 0x19\n\tIPPROTO_LEAF2                     = 0x1a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MEAS                      = 0x13\n\tIPPROTO_MHRP                      = 0x30\n\tIPPROTO_MICP                      = 0x5f\n\tIPPROTO_MOBILE                    = 0x37\n\tIPPROTO_MTP                       = 0x5c\n\tIPPROTO_MUX                       = 0x12\n\tIPPROTO_ND                        = 0x4d\n\tIPPROTO_NHRP                      = 0x36\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_NSP                       = 0x1f\n\tIPPROTO_NVPII                     = 0xb\n\tIPPROTO_OSPFIGP                   = 0x59\n\tIPPROTO_PFSYNC                    = 0xf0\n\tIPPROTO_PGM                       = 0x71\n\tIPPROTO_PIGP                      = 0x9\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PRM                       = 0x15\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_PVP                       = 0x4b\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_RCCMON                    = 0xa\n\tIPPROTO_RDP                       = 0x1b\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_RVD                       = 0x42\n\tIPPROTO_SATEXPAK                  = 0x40\n\tIPPROTO_SATMON                    = 0x45\n\tIPPROTO_SCCSP                     = 0x60\n\tIPPROTO_SDRP                      = 0x2a\n\tIPPROTO_SEP                       = 0x21\n\tIPPROTO_SKIP                      = 0x39\n\tIPPROTO_SRPC                      = 0x5a\n\tIPPROTO_ST                        = 0x7\n\tIPPROTO_SVMTP                     = 0x52\n\tIPPROTO_SWIPE                     = 0x35\n\tIPPROTO_TCF                       = 0x57\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TLSP                      = 0x38\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_TPXX                      = 0x27\n\tIPPROTO_TRUNK1                    = 0x17\n\tIPPROTO_TRUNK2                    = 0x18\n\tIPPROTO_TTP                       = 0x54\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_UNKNOWN                   = 0x102\n\tIPPROTO_VINES                     = 0x53\n\tIPPROTO_VISA                      = 0x46\n\tIPPROTO_VMTP                      = 0x51\n\tIPPROTO_WBEXPAK                   = 0x4f\n\tIPPROTO_WBMON                     = 0x4e\n\tIPPROTO_WSN                       = 0x4a\n\tIPPROTO_XNET                      = 0xf\n\tIPPROTO_XTP                       = 0x24\n\tIPV6_AUTOFLOWLABEL                = 0x3b\n\tIPV6_BINDV6ONLY                   = 0x1b\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_DONTFRAG                     = 0x3e\n\tIPV6_DSTOPTS                      = 0x32\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FRAGTTL                      = 0x78\n\tIPV6_FW_ADD                       = 0x1e\n\tIPV6_FW_DEL                       = 0x1f\n\tIPV6_FW_FLUSH                     = 0x20\n\tIPV6_FW_GET                       = 0x22\n\tIPV6_FW_ZERO                      = 0x21\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_HOPLIMIT                     = 0x2f\n\tIPV6_HOPOPTS                      = 0x31\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MINHLIM                      = 0x28\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MSFILTER                     = 0x4a\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_NEXTHOP                      = 0x30\n\tIPV6_PATHMTU                      = 0x2c\n\tIPV6_PKTINFO                      = 0x2e\n\tIPV6_PKTOPTIONS                   = 0x34\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_PREFER_TEMPADDR              = 0x3f\n\tIPV6_RECVDSTOPTS                  = 0x28\n\tIPV6_RECVHOPLIMIT                 = 0x25\n\tIPV6_RECVHOPOPTS                  = 0x27\n\tIPV6_RECVPATHMTU                  = 0x2b\n\tIPV6_RECVPKTINFO                  = 0x24\n\tIPV6_RECVRTHDR                    = 0x26\n\tIPV6_RECVTCLASS                   = 0x39\n\tIPV6_RTHDR                        = 0x33\n\tIPV6_RTHDRDSTOPTS                 = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x3d\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_USE_MIN_MTU                  = 0x2a\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_DUMMYNET_CONFIGURE             = 0x3c\n\tIP_DUMMYNET_DEL                   = 0x3d\n\tIP_DUMMYNET_FLUSH                 = 0x3e\n\tIP_DUMMYNET_GET                   = 0x40\n\tIP_FAITH                          = 0x16\n\tIP_FW_ADD                         = 0x32\n\tIP_FW_DEL                         = 0x33\n\tIP_FW_FLUSH                       = 0x34\n\tIP_FW_GET                         = 0x36\n\tIP_FW_RESETLOG                    = 0x37\n\tIP_FW_X                           = 0x31\n\tIP_FW_ZERO                        = 0x35\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x15\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_MEMBERSHIPS                = 0x14\n\tIP_MF                             = 0x2000\n\tIP_MINTTL                         = 0x42\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_MULTICAST_VIF                  = 0xe\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OPTIONS                        = 0x1\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTTL                        = 0x41\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RSVP_OFF                       = 0x10\n\tIP_RSVP_ON                        = 0xf\n\tIP_RSVP_VIF_OFF                   = 0x12\n\tIP_RSVP_VIF_ON                    = 0x11\n\tIP_TOS                            = 0x3\n\tIP_TTL                            = 0x4\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_AUTOSYNC                     = 0x7\n\tMADV_CONTROL_END                  = 0xb\n\tMADV_CONTROL_START                = 0xa\n\tMADV_CORE                         = 0x9\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x5\n\tMADV_INVAL                        = 0xa\n\tMADV_NOCORE                       = 0x8\n\tMADV_NORMAL                       = 0x0\n\tMADV_NOSYNC                       = 0x6\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_SETMAP                       = 0xb\n\tMADV_WILLNEED                     = 0x3\n\tMAP_ANON                          = 0x1000\n\tMAP_ANONYMOUS                     = 0x1000\n\tMAP_COPY                          = 0x2\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_INHERIT                       = 0x80\n\tMAP_NOCORE                        = 0x20000\n\tMAP_NOEXTEND                      = 0x100\n\tMAP_NORESERVE                     = 0x40\n\tMAP_NOSYNC                        = 0x800\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_SHARED                        = 0x1\n\tMAP_SIZEALIGN                     = 0x40000\n\tMAP_STACK                         = 0x400\n\tMAP_TRYFIXED                      = 0x10000\n\tMAP_VPAGETABLE                    = 0x2000\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMSG_CMSG_CLOEXEC                  = 0x1000\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOF                           = 0x100\n\tMSG_EOR                           = 0x8\n\tMSG_FBLOCKING                     = 0x10000\n\tMSG_FMASK                         = 0xffff0000\n\tMSG_FNONBLOCKING                  = 0x20000\n\tMSG_NOSIGNAL                      = 0x400\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_SYNC                          = 0x800\n\tMSG_TRUNC                         = 0x10\n\tMSG_UNUSED09                      = 0x200\n\tMSG_WAITALL                       = 0x40\n\tMS_ASYNC                          = 0x1\n\tMS_INVALIDATE                     = 0x2\n\tMS_SYNC                           = 0x0\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_MAXID                      = 0x4\n\tNOFLSH                            = 0x80000000\n\tNOKERNINFO                        = 0x2000000\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_CHILD                        = 0x4\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FFAND                        = 0x40000000\n\tNOTE_FFCOPY                       = 0xc0000000\n\tNOTE_FFCTRLMASK                   = 0xc0000000\n\tNOTE_FFLAGSMASK                   = 0xffffff\n\tNOTE_FFNOP                        = 0x0\n\tNOTE_FFOR                         = 0x80000000\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_OOB                          = 0x2\n\tNOTE_PCTRLMASK                    = 0xf0000000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRIGGER                      = 0x1000000\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tOXTABS                            = 0x4\n\tO_ACCMODE                         = 0x3\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x20000\n\tO_CREAT                           = 0x200\n\tO_DIRECT                          = 0x10000\n\tO_DIRECTORY                       = 0x8000000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FAPPEND                         = 0x100000\n\tO_FASYNCWRITE                     = 0x800000\n\tO_FBLOCKING                       = 0x40000\n\tO_FMASK                           = 0xfc0000\n\tO_FNONBLOCKING                    = 0x80000\n\tO_FOFFSET                         = 0x200000\n\tO_FSYNC                           = 0x80\n\tO_FSYNCWRITE                      = 0x400000\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x8000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_SHLOCK                          = 0x10\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tRLIMIT_AS                         = 0xa\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0xb\n\tRTAX_MPLS1                        = 0x8\n\tRTAX_MPLS2                        = 0x9\n\tRTAX_MPLS3                        = 0xa\n\tRTAX_NETMASK                      = 0x2\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_MPLS1                         = 0x100\n\tRTA_MPLS2                         = 0x200\n\tRTA_MPLS3                         = 0x400\n\tRTA_NETMASK                       = 0x4\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_BROADCAST                     = 0x400000\n\tRTF_CLONING                       = 0x100\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_LLINFO                        = 0x400\n\tRTF_LOCAL                         = 0x200000\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MPLSOPS                       = 0x1000000\n\tRTF_MULTICAST                     = 0x800000\n\tRTF_PINNED                        = 0x100000\n\tRTF_PRCLONING                     = 0x10000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x40000\n\tRTF_REJECT                        = 0x8\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_WASCLONED                     = 0x20000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DELMADDR                      = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_IEEE80211                     = 0x12\n\tRTM_IFANNOUNCE                    = 0x11\n\tRTM_IFINFO                        = 0xe\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_NEWMADDR                      = 0xf\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x6\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_IWCAPSEGS                     = 0x400\n\tRTV_IWMAXSEGS                     = 0x200\n\tRTV_MSL                           = 0x100\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x3\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x2\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCADDRT                         = 0x8040720a\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCALIFADDR                      = 0x8118691b\n\tSIOCATMARK                        = 0x40047307\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDELRT                         = 0x8040720b\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFPHYADDR                    = 0x80206949\n\tSIOCDLIFADDR                      = 0x8118691d\n\tSIOCGDRVSPEC                      = 0xc028697b\n\tSIOCGETSGCNT                      = 0xc0207210\n\tSIOCGETVIFCNT                     = 0xc028720f\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCAP                        = 0xc020691f\n\tSIOCGIFCONF                       = 0xc0106924\n\tSIOCGIFDATA                       = 0xc0206926\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFGMEMB                      = 0xc028698a\n\tSIOCGIFINDEX                      = 0xc0206920\n\tSIOCGIFMEDIA                      = 0xc0306938\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc0206933\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206948\n\tSIOCGIFPHYS                       = 0xc0206935\n\tSIOCGIFPOLLCPU                    = 0xc020697e\n\tSIOCGIFPSRCADDR                   = 0xc0206947\n\tSIOCGIFSTATUS                     = 0xc331693b\n\tSIOCGIFTSOLEN                     = 0xc0206980\n\tSIOCGLIFADDR                      = 0xc118691c\n\tSIOCGLIFPHYADDR                   = 0xc118694b\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCGPRIVATE_0                    = 0xc0206950\n\tSIOCGPRIVATE_1                    = 0xc0206951\n\tSIOCIFCREATE                      = 0xc020697a\n\tSIOCIFCREATE2                     = 0xc020697c\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc0106978\n\tSIOCSDRVSPEC                      = 0x8028697b\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFCAP                        = 0x8020691e\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFLLADDR                     = 0x8020693c\n\tSIOCSIFMEDIA                      = 0xc0206937\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x80206934\n\tSIOCSIFNAME                       = 0x80206928\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x80406946\n\tSIOCSIFPHYS                       = 0x80206936\n\tSIOCSIFPOLLCPU                    = 0x8020697d\n\tSIOCSIFTSOLEN                     = 0x8020697f\n\tSIOCSLIFPHYADDR                   = 0x8118694a\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSOCK_CLOEXEC                      = 0x10000000\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_MAXADDRLEN                   = 0xff\n\tSOCK_NONBLOCK                     = 0x20000000\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_ACCEPTFILTER                   = 0x1000\n\tSO_BROADCAST                      = 0x20\n\tSO_CPUHINT                        = 0x1030\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LINGER                         = 0x80\n\tSO_NOSIGPIPE                      = 0x800\n\tSO_OOBINLINE                      = 0x100\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDSPACE                       = 0x100a\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_TIMESTAMP                      = 0x400\n\tSO_TYPE                           = 0x1008\n\tSO_USELOOPBACK                    = 0x40\n\tTCIFLUSH                          = 0x1\n\tTCIOFF                            = 0x3\n\tTCIOFLUSH                         = 0x3\n\tTCION                             = 0x4\n\tTCOFLUSH                          = 0x2\n\tTCOOFF                            = 0x1\n\tTCOON                             = 0x2\n\tTCP_FASTKEEP                      = 0x80\n\tTCP_KEEPCNT                       = 0x400\n\tTCP_KEEPIDLE                      = 0x100\n\tTCP_KEEPINIT                      = 0x20\n\tTCP_KEEPINTVL                     = 0x200\n\tTCP_MAXBURST                      = 0x4\n\tTCP_MAXHLEN                       = 0x3c\n\tTCP_MAXOLEN                       = 0x28\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MINMSS                        = 0x100\n\tTCP_MIN_WINSHIFT                  = 0x5\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOOPT                         = 0x8\n\tTCP_NOPUSH                        = 0x4\n\tTCP_SIGNATURE_ENABLE              = 0x10\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x40107458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGDRAINWAIT                    = 0x40047456\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGSID                          = 0x40047463\n\tTIOCGSIZE                         = 0x40087468\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCISPTMASTER                    = 0x20007455\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGDTRWAIT                     = 0x4004745a\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x40047403\n\tTIOCMODS                          = 0x80047404\n\tTIOCMSDTRWAIT                     = 0x8004745b\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDRAINWAIT                    = 0x80047457\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSSIZE                         = 0x80087467\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x20007465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCTIMESTAMP                     = 0x40107459\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVCHECKPT                          = 0x13\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVERASE2                           = 0x7\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVM_BCACHE_SIZE_MAX                = 0x0\n\tVM_SWZONE_SIZE_MAX                = 0x4000000000\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWCONTINUED                        = 0x4\n\tWCOREFLAG                         = 0x80\n\tWLINUXCLONE                       = 0x80000000\n\tWNOHANG                           = 0x1\n\tWSTOPPED                          = 0x7f\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEASYNC          = syscall.Errno(0x63)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMSG         = syscall.Errno(0x59)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x55)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOOFUS         = syscall.Errno(0x58)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x52)\n\tEILSEQ          = syscall.Errno(0x56)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x63)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5a)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x57)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x5b)\n\tENOMEDIUM       = syscall.Errno(0x5d)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x53)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x5c)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUNUSED94       = syscall.Errno(0x5e)\n\tEUNUSED95       = syscall.Errno(0x5f)\n\tEUNUSED96       = syscall.Errno(0x60)\n\tEUNUSED97       = syscall.Errno(0x61)\n\tEUNUSED98       = syscall.Errno(0x62)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT     = syscall.Signal(0x6)\n\tSIGALRM     = syscall.Signal(0xe)\n\tSIGBUS      = syscall.Signal(0xa)\n\tSIGCHLD     = syscall.Signal(0x14)\n\tSIGCKPT     = syscall.Signal(0x21)\n\tSIGCKPTEXIT = syscall.Signal(0x22)\n\tSIGCONT     = syscall.Signal(0x13)\n\tSIGEMT      = syscall.Signal(0x7)\n\tSIGFPE      = syscall.Signal(0x8)\n\tSIGHUP      = syscall.Signal(0x1)\n\tSIGILL      = syscall.Signal(0x4)\n\tSIGINFO     = syscall.Signal(0x1d)\n\tSIGINT      = syscall.Signal(0x2)\n\tSIGIO       = syscall.Signal(0x17)\n\tSIGIOT      = syscall.Signal(0x6)\n\tSIGKILL     = syscall.Signal(0x9)\n\tSIGPIPE     = syscall.Signal(0xd)\n\tSIGPROF     = syscall.Signal(0x1b)\n\tSIGQUIT     = syscall.Signal(0x3)\n\tSIGSEGV     = syscall.Signal(0xb)\n\tSIGSTOP     = syscall.Signal(0x11)\n\tSIGSYS      = syscall.Signal(0xc)\n\tSIGTERM     = syscall.Signal(0xf)\n\tSIGTHR      = syscall.Signal(0x20)\n\tSIGTRAP     = syscall.Signal(0x5)\n\tSIGTSTP     = syscall.Signal(0x12)\n\tSIGTTIN     = syscall.Signal(0x15)\n\tSIGTTOU     = syscall.Signal(0x16)\n\tSIGURG      = syscall.Signal(0x10)\n\tSIGUSR1     = syscall.Signal(0x1e)\n\tSIGUSR2     = syscall.Signal(0x1f)\n\tSIGVTALRM   = syscall.Signal(0x1a)\n\tSIGWINCH    = syscall.Signal(0x1c)\n\tSIGXCPU     = syscall.Signal(0x18)\n\tSIGXFSZ     = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"operation timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"identifier removed\",\n\t83: \"no message of desired type\",\n\t84: \"value too large to be stored in data type\",\n\t85: \"operation canceled\",\n\t86: \"illegal byte sequence\",\n\t87: \"attribute not found\",\n\t88: \"programming error\",\n\t89: \"bad message\",\n\t90: \"multihop attempted\",\n\t91: \"link has been severed\",\n\t92: \"protocol error\",\n\t93: \"no medium found\",\n\t94: \"unknown error: 94\",\n\t95: \"unknown error: 95\",\n\t96: \"unknown error: 96\",\n\t97: \"unknown error: 97\",\n\t98: \"unknown error: 98\",\n\t99: \"unknown error: 99\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"thread Scheduler\",\n\t33: \"checkPoint\",\n\t34: \"checkPointExit\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go",
    "content": "// mkerrors.sh -m32\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,freebsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m32 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                   = 0x10\n\tAF_ARP                         = 0x23\n\tAF_ATM                         = 0x1e\n\tAF_BLUETOOTH                   = 0x24\n\tAF_CCITT                       = 0xa\n\tAF_CHAOS                       = 0x5\n\tAF_CNT                         = 0x15\n\tAF_COIP                        = 0x14\n\tAF_DATAKIT                     = 0x9\n\tAF_DECnet                      = 0xc\n\tAF_DLI                         = 0xd\n\tAF_E164                        = 0x1a\n\tAF_ECMA                        = 0x8\n\tAF_HYLINK                      = 0xf\n\tAF_IEEE80211                   = 0x25\n\tAF_IMPLINK                     = 0x3\n\tAF_INET                        = 0x2\n\tAF_INET6                       = 0x1c\n\tAF_INET6_SDP                   = 0x2a\n\tAF_INET_SDP                    = 0x28\n\tAF_IPX                         = 0x17\n\tAF_ISDN                        = 0x1a\n\tAF_ISO                         = 0x7\n\tAF_LAT                         = 0xe\n\tAF_LINK                        = 0x12\n\tAF_LOCAL                       = 0x1\n\tAF_MAX                         = 0x2a\n\tAF_NATM                        = 0x1d\n\tAF_NETBIOS                     = 0x6\n\tAF_NETGRAPH                    = 0x20\n\tAF_OSI                         = 0x7\n\tAF_PUP                         = 0x4\n\tAF_ROUTE                       = 0x11\n\tAF_SCLUSTER                    = 0x22\n\tAF_SIP                         = 0x18\n\tAF_SLOW                        = 0x21\n\tAF_SNA                         = 0xb\n\tAF_UNIX                        = 0x1\n\tAF_UNSPEC                      = 0x0\n\tAF_VENDOR00                    = 0x27\n\tAF_VENDOR01                    = 0x29\n\tAF_VENDOR02                    = 0x2b\n\tAF_VENDOR03                    = 0x2d\n\tAF_VENDOR04                    = 0x2f\n\tAF_VENDOR05                    = 0x31\n\tAF_VENDOR06                    = 0x33\n\tAF_VENDOR07                    = 0x35\n\tAF_VENDOR08                    = 0x37\n\tAF_VENDOR09                    = 0x39\n\tAF_VENDOR10                    = 0x3b\n\tAF_VENDOR11                    = 0x3d\n\tAF_VENDOR12                    = 0x3f\n\tAF_VENDOR13                    = 0x41\n\tAF_VENDOR14                    = 0x43\n\tAF_VENDOR15                    = 0x45\n\tAF_VENDOR16                    = 0x47\n\tAF_VENDOR17                    = 0x49\n\tAF_VENDOR18                    = 0x4b\n\tAF_VENDOR19                    = 0x4d\n\tAF_VENDOR20                    = 0x4f\n\tAF_VENDOR21                    = 0x51\n\tAF_VENDOR22                    = 0x53\n\tAF_VENDOR23                    = 0x55\n\tAF_VENDOR24                    = 0x57\n\tAF_VENDOR25                    = 0x59\n\tAF_VENDOR26                    = 0x5b\n\tAF_VENDOR27                    = 0x5d\n\tAF_VENDOR28                    = 0x5f\n\tAF_VENDOR29                    = 0x61\n\tAF_VENDOR30                    = 0x63\n\tAF_VENDOR31                    = 0x65\n\tAF_VENDOR32                    = 0x67\n\tAF_VENDOR33                    = 0x69\n\tAF_VENDOR34                    = 0x6b\n\tAF_VENDOR35                    = 0x6d\n\tAF_VENDOR36                    = 0x6f\n\tAF_VENDOR37                    = 0x71\n\tAF_VENDOR38                    = 0x73\n\tAF_VENDOR39                    = 0x75\n\tAF_VENDOR40                    = 0x77\n\tAF_VENDOR41                    = 0x79\n\tAF_VENDOR42                    = 0x7b\n\tAF_VENDOR43                    = 0x7d\n\tAF_VENDOR44                    = 0x7f\n\tAF_VENDOR45                    = 0x81\n\tAF_VENDOR46                    = 0x83\n\tAF_VENDOR47                    = 0x85\n\tALTWERASE                      = 0x200\n\tB0                             = 0x0\n\tB110                           = 0x6e\n\tB115200                        = 0x1c200\n\tB1200                          = 0x4b0\n\tB134                           = 0x86\n\tB14400                         = 0x3840\n\tB150                           = 0x96\n\tB1800                          = 0x708\n\tB19200                         = 0x4b00\n\tB200                           = 0xc8\n\tB230400                        = 0x38400\n\tB2400                          = 0x960\n\tB28800                         = 0x7080\n\tB300                           = 0x12c\n\tB38400                         = 0x9600\n\tB460800                        = 0x70800\n\tB4800                          = 0x12c0\n\tB50                            = 0x32\n\tB57600                         = 0xe100\n\tB600                           = 0x258\n\tB7200                          = 0x1c20\n\tB75                            = 0x4b\n\tB76800                         = 0x12c00\n\tB921600                        = 0xe1000\n\tB9600                          = 0x2580\n\tBIOCFEEDBACK                   = 0x8004427c\n\tBIOCFLUSH                      = 0x20004268\n\tBIOCGBLEN                      = 0x40044266\n\tBIOCGDIRECTION                 = 0x40044276\n\tBIOCGDLT                       = 0x4004426a\n\tBIOCGDLTLIST                   = 0xc0084279\n\tBIOCGETBUFMODE                 = 0x4004427d\n\tBIOCGETIF                      = 0x4020426b\n\tBIOCGETZMAX                    = 0x4004427f\n\tBIOCGHDRCMPLT                  = 0x40044274\n\tBIOCGRSIG                      = 0x40044272\n\tBIOCGRTIMEOUT                  = 0x4008426e\n\tBIOCGSEESENT                   = 0x40044276\n\tBIOCGSTATS                     = 0x4008426f\n\tBIOCGTSTAMP                    = 0x40044283\n\tBIOCIMMEDIATE                  = 0x80044270\n\tBIOCLOCK                       = 0x2000427a\n\tBIOCPROMISC                    = 0x20004269\n\tBIOCROTZBUF                    = 0x400c4280\n\tBIOCSBLEN                      = 0xc0044266\n\tBIOCSDIRECTION                 = 0x80044277\n\tBIOCSDLT                       = 0x80044278\n\tBIOCSETBUFMODE                 = 0x8004427e\n\tBIOCSETF                       = 0x80084267\n\tBIOCSETFNR                     = 0x80084282\n\tBIOCSETIF                      = 0x8020426c\n\tBIOCSETWF                      = 0x8008427b\n\tBIOCSETZBUF                    = 0x800c4281\n\tBIOCSHDRCMPLT                  = 0x80044275\n\tBIOCSRSIG                      = 0x80044273\n\tBIOCSRTIMEOUT                  = 0x8008426d\n\tBIOCSSEESENT                   = 0x80044277\n\tBIOCSTSTAMP                    = 0x80044284\n\tBIOCVERSION                    = 0x40044271\n\tBPF_A                          = 0x10\n\tBPF_ABS                        = 0x20\n\tBPF_ADD                        = 0x0\n\tBPF_ALIGNMENT                  = 0x4\n\tBPF_ALU                        = 0x4\n\tBPF_AND                        = 0x50\n\tBPF_B                          = 0x10\n\tBPF_BUFMODE_BUFFER             = 0x1\n\tBPF_BUFMODE_ZBUF               = 0x2\n\tBPF_DIV                        = 0x30\n\tBPF_H                          = 0x8\n\tBPF_IMM                        = 0x0\n\tBPF_IND                        = 0x40\n\tBPF_JA                         = 0x0\n\tBPF_JEQ                        = 0x10\n\tBPF_JGE                        = 0x30\n\tBPF_JGT                        = 0x20\n\tBPF_JMP                        = 0x5\n\tBPF_JSET                       = 0x40\n\tBPF_K                          = 0x0\n\tBPF_LD                         = 0x0\n\tBPF_LDX                        = 0x1\n\tBPF_LEN                        = 0x80\n\tBPF_LSH                        = 0x60\n\tBPF_MAJOR_VERSION              = 0x1\n\tBPF_MAXBUFSIZE                 = 0x80000\n\tBPF_MAXINSNS                   = 0x200\n\tBPF_MEM                        = 0x60\n\tBPF_MEMWORDS                   = 0x10\n\tBPF_MINBUFSIZE                 = 0x20\n\tBPF_MINOR_VERSION              = 0x1\n\tBPF_MISC                       = 0x7\n\tBPF_MOD                        = 0x90\n\tBPF_MSH                        = 0xa0\n\tBPF_MUL                        = 0x20\n\tBPF_NEG                        = 0x80\n\tBPF_OR                         = 0x40\n\tBPF_RELEASE                    = 0x30bb6\n\tBPF_RET                        = 0x6\n\tBPF_RSH                        = 0x70\n\tBPF_ST                         = 0x2\n\tBPF_STX                        = 0x3\n\tBPF_SUB                        = 0x10\n\tBPF_TAX                        = 0x0\n\tBPF_TXA                        = 0x80\n\tBPF_T_BINTIME                  = 0x2\n\tBPF_T_BINTIME_FAST             = 0x102\n\tBPF_T_BINTIME_MONOTONIC        = 0x202\n\tBPF_T_BINTIME_MONOTONIC_FAST   = 0x302\n\tBPF_T_FAST                     = 0x100\n\tBPF_T_FLAG_MASK                = 0x300\n\tBPF_T_FORMAT_MASK              = 0x3\n\tBPF_T_MICROTIME                = 0x0\n\tBPF_T_MICROTIME_FAST           = 0x100\n\tBPF_T_MICROTIME_MONOTONIC      = 0x200\n\tBPF_T_MICROTIME_MONOTONIC_FAST = 0x300\n\tBPF_T_MONOTONIC                = 0x200\n\tBPF_T_MONOTONIC_FAST           = 0x300\n\tBPF_T_NANOTIME                 = 0x1\n\tBPF_T_NANOTIME_FAST            = 0x101\n\tBPF_T_NANOTIME_MONOTONIC       = 0x201\n\tBPF_T_NANOTIME_MONOTONIC_FAST  = 0x301\n\tBPF_T_NONE                     = 0x3\n\tBPF_T_NORMAL                   = 0x0\n\tBPF_W                          = 0x0\n\tBPF_X                          = 0x8\n\tBPF_XOR                        = 0xa0\n\tBRKINT                         = 0x2\n\tCAP_ACCEPT                     = 0x200000020000000\n\tCAP_ACL_CHECK                  = 0x400000000010000\n\tCAP_ACL_DELETE                 = 0x400000000020000\n\tCAP_ACL_GET                    = 0x400000000040000\n\tCAP_ACL_SET                    = 0x400000000080000\n\tCAP_ALL0                       = 0x20007ffffffffff\n\tCAP_ALL1                       = 0x4000000001fffff\n\tCAP_BIND                       = 0x200000040000000\n\tCAP_BINDAT                     = 0x200008000000400\n\tCAP_CHFLAGSAT                  = 0x200000000001400\n\tCAP_CONNECT                    = 0x200000080000000\n\tCAP_CONNECTAT                  = 0x200010000000400\n\tCAP_CREATE                     = 0x200000000000040\n\tCAP_EVENT                      = 0x400000000000020\n\tCAP_EXTATTR_DELETE             = 0x400000000001000\n\tCAP_EXTATTR_GET                = 0x400000000002000\n\tCAP_EXTATTR_LIST               = 0x400000000004000\n\tCAP_EXTATTR_SET                = 0x400000000008000\n\tCAP_FCHDIR                     = 0x200000000000800\n\tCAP_FCHFLAGS                   = 0x200000000001000\n\tCAP_FCHMOD                     = 0x200000000002000\n\tCAP_FCHMODAT                   = 0x200000000002400\n\tCAP_FCHOWN                     = 0x200000000004000\n\tCAP_FCHOWNAT                   = 0x200000000004400\n\tCAP_FCNTL                      = 0x200000000008000\n\tCAP_FCNTL_ALL                  = 0x78\n\tCAP_FCNTL_GETFL                = 0x8\n\tCAP_FCNTL_GETOWN               = 0x20\n\tCAP_FCNTL_SETFL                = 0x10\n\tCAP_FCNTL_SETOWN               = 0x40\n\tCAP_FEXECVE                    = 0x200000000000080\n\tCAP_FLOCK                      = 0x200000000010000\n\tCAP_FPATHCONF                  = 0x200000000020000\n\tCAP_FSCK                       = 0x200000000040000\n\tCAP_FSTAT                      = 0x200000000080000\n\tCAP_FSTATAT                    = 0x200000000080400\n\tCAP_FSTATFS                    = 0x200000000100000\n\tCAP_FSYNC                      = 0x200000000000100\n\tCAP_FTRUNCATE                  = 0x200000000000200\n\tCAP_FUTIMES                    = 0x200000000200000\n\tCAP_FUTIMESAT                  = 0x200000000200400\n\tCAP_GETPEERNAME                = 0x200000100000000\n\tCAP_GETSOCKNAME                = 0x200000200000000\n\tCAP_GETSOCKOPT                 = 0x200000400000000\n\tCAP_IOCTL                      = 0x400000000000080\n\tCAP_IOCTLS_ALL                 = 0x7fffffff\n\tCAP_KQUEUE                     = 0x400000000100040\n\tCAP_KQUEUE_CHANGE              = 0x400000000100000\n\tCAP_KQUEUE_EVENT               = 0x400000000000040\n\tCAP_LINKAT_SOURCE              = 0x200020000000400\n\tCAP_LINKAT_TARGET              = 0x200000000400400\n\tCAP_LISTEN                     = 0x200000800000000\n\tCAP_LOOKUP                     = 0x200000000000400\n\tCAP_MAC_GET                    = 0x400000000000001\n\tCAP_MAC_SET                    = 0x400000000000002\n\tCAP_MKDIRAT                    = 0x200000000800400\n\tCAP_MKFIFOAT                   = 0x200000001000400\n\tCAP_MKNODAT                    = 0x200000002000400\n\tCAP_MMAP                       = 0x200000000000010\n\tCAP_MMAP_R                     = 0x20000000000001d\n\tCAP_MMAP_RW                    = 0x20000000000001f\n\tCAP_MMAP_RWX                   = 0x20000000000003f\n\tCAP_MMAP_RX                    = 0x20000000000003d\n\tCAP_MMAP_W                     = 0x20000000000001e\n\tCAP_MMAP_WX                    = 0x20000000000003e\n\tCAP_MMAP_X                     = 0x20000000000003c\n\tCAP_PDGETPID                   = 0x400000000000200\n\tCAP_PDKILL                     = 0x400000000000800\n\tCAP_PDWAIT                     = 0x400000000000400\n\tCAP_PEELOFF                    = 0x200001000000000\n\tCAP_POLL_EVENT                 = 0x400000000000020\n\tCAP_PREAD                      = 0x20000000000000d\n\tCAP_PWRITE                     = 0x20000000000000e\n\tCAP_READ                       = 0x200000000000001\n\tCAP_RECV                       = 0x200000000000001\n\tCAP_RENAMEAT_SOURCE            = 0x200000004000400\n\tCAP_RENAMEAT_TARGET            = 0x200040000000400\n\tCAP_RIGHTS_VERSION             = 0x0\n\tCAP_RIGHTS_VERSION_00          = 0x0\n\tCAP_SEEK                       = 0x20000000000000c\n\tCAP_SEEK_TELL                  = 0x200000000000004\n\tCAP_SEM_GETVALUE               = 0x400000000000004\n\tCAP_SEM_POST                   = 0x400000000000008\n\tCAP_SEM_WAIT                   = 0x400000000000010\n\tCAP_SEND                       = 0x200000000000002\n\tCAP_SETSOCKOPT                 = 0x200002000000000\n\tCAP_SHUTDOWN                   = 0x200004000000000\n\tCAP_SOCK_CLIENT                = 0x200007780000003\n\tCAP_SOCK_SERVER                = 0x200007f60000003\n\tCAP_SYMLINKAT                  = 0x200000008000400\n\tCAP_TTYHOOK                    = 0x400000000000100\n\tCAP_UNLINKAT                   = 0x200000010000400\n\tCAP_UNUSED0_44                 = 0x200080000000000\n\tCAP_UNUSED0_57                 = 0x300000000000000\n\tCAP_UNUSED1_22                 = 0x400000000200000\n\tCAP_UNUSED1_57                 = 0x500000000000000\n\tCAP_WRITE                      = 0x200000000000002\n\tCFLUSH                         = 0xf\n\tCLOCAL                         = 0x8000\n\tCLOCK_MONOTONIC                = 0x4\n\tCLOCK_MONOTONIC_FAST           = 0xc\n\tCLOCK_MONOTONIC_PRECISE        = 0xb\n\tCLOCK_PROCESS_CPUTIME_ID       = 0xf\n\tCLOCK_PROF                     = 0x2\n\tCLOCK_REALTIME                 = 0x0\n\tCLOCK_REALTIME_FAST            = 0xa\n\tCLOCK_REALTIME_PRECISE         = 0x9\n\tCLOCK_SECOND                   = 0xd\n\tCLOCK_THREAD_CPUTIME_ID        = 0xe\n\tCLOCK_UPTIME                   = 0x5\n\tCLOCK_UPTIME_FAST              = 0x8\n\tCLOCK_UPTIME_PRECISE           = 0x7\n\tCLOCK_VIRTUAL                  = 0x1\n\tCREAD                          = 0x800\n\tCRTSCTS                        = 0x30000\n\tCS5                            = 0x0\n\tCS6                            = 0x100\n\tCS7                            = 0x200\n\tCS8                            = 0x300\n\tCSIZE                          = 0x300\n\tCSTART                         = 0x11\n\tCSTATUS                        = 0x14\n\tCSTOP                          = 0x13\n\tCSTOPB                         = 0x400\n\tCSUSP                          = 0x1a\n\tCTL_MAXNAME                    = 0x18\n\tCTL_NET                        = 0x4\n\tDLT_A429                       = 0xb8\n\tDLT_A653_ICM                   = 0xb9\n\tDLT_AIRONET_HEADER             = 0x78\n\tDLT_AOS                        = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394     = 0x8a\n\tDLT_ARCNET                     = 0x7\n\tDLT_ARCNET_LINUX               = 0x81\n\tDLT_ATM_CLIP                   = 0x13\n\tDLT_ATM_RFC1483                = 0xb\n\tDLT_AURORA                     = 0x7e\n\tDLT_AX25                       = 0x3\n\tDLT_AX25_KISS                  = 0xca\n\tDLT_BACNET_MS_TP               = 0xa5\n\tDLT_BLUETOOTH_BREDR_BB         = 0xff\n\tDLT_BLUETOOTH_HCI_H4           = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9\n\tDLT_BLUETOOTH_LE_LL            = 0xfb\n\tDLT_BLUETOOTH_LE_LL_WITH_PHDR  = 0x100\n\tDLT_BLUETOOTH_LINUX_MONITOR    = 0xfe\n\tDLT_CAN20B                     = 0xbe\n\tDLT_CAN_SOCKETCAN              = 0xe3\n\tDLT_CHAOS                      = 0x5\n\tDLT_CHDLC                      = 0x68\n\tDLT_CISCO_IOS                  = 0x76\n\tDLT_C_HDLC                     = 0x68\n\tDLT_C_HDLC_WITH_DIR            = 0xcd\n\tDLT_DBUS                       = 0xe7\n\tDLT_DECT                       = 0xdd\n\tDLT_DOCSIS                     = 0x8f\n\tDLT_DVB_CI                     = 0xeb\n\tDLT_ECONET                     = 0x73\n\tDLT_EN10MB                     = 0x1\n\tDLT_EN3MB                      = 0x2\n\tDLT_ENC                        = 0x6d\n\tDLT_EPON                       = 0x103\n\tDLT_ERF                        = 0xc5\n\tDLT_ERF_ETH                    = 0xaf\n\tDLT_ERF_POS                    = 0xb0\n\tDLT_FC_2                       = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS     = 0xe1\n\tDLT_FDDI                       = 0xa\n\tDLT_FLEXRAY                    = 0xd2\n\tDLT_FRELAY                     = 0x6b\n\tDLT_FRELAY_WITH_DIR            = 0xce\n\tDLT_GCOM_SERIAL                = 0xad\n\tDLT_GCOM_T1E1                  = 0xac\n\tDLT_GPF_F                      = 0xab\n\tDLT_GPF_T                      = 0xaa\n\tDLT_GPRS_LLC                   = 0xa9\n\tDLT_GSMTAP_ABIS                = 0xda\n\tDLT_GSMTAP_UM                  = 0xd9\n\tDLT_HHDLC                      = 0x79\n\tDLT_IBM_SN                     = 0x92\n\tDLT_IBM_SP                     = 0x91\n\tDLT_IEEE802                    = 0x6\n\tDLT_IEEE802_11                 = 0x69\n\tDLT_IEEE802_11_RADIO           = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS       = 0xa3\n\tDLT_IEEE802_15_4               = 0xc3\n\tDLT_IEEE802_15_4_LINUX         = 0xbf\n\tDLT_IEEE802_15_4_NOFCS         = 0xe6\n\tDLT_IEEE802_15_4_NONASK_PHY    = 0xd7\n\tDLT_IEEE802_16_MAC_CPS         = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO   = 0xc1\n\tDLT_INFINIBAND                 = 0xf7\n\tDLT_IPFILTER                   = 0x74\n\tDLT_IPMB                       = 0xc7\n\tDLT_IPMB_LINUX                 = 0xd1\n\tDLT_IPMI_HPM_2                 = 0x104\n\tDLT_IPNET                      = 0xe2\n\tDLT_IPOIB                      = 0xf2\n\tDLT_IPV4                       = 0xe4\n\tDLT_IPV6                       = 0xe5\n\tDLT_IP_OVER_FC                 = 0x7a\n\tDLT_JUNIPER_ATM1               = 0x89\n\tDLT_JUNIPER_ATM2               = 0x87\n\tDLT_JUNIPER_ATM_CEMIC          = 0xee\n\tDLT_JUNIPER_CHDLC              = 0xb5\n\tDLT_JUNIPER_ES                 = 0x84\n\tDLT_JUNIPER_ETHER              = 0xb2\n\tDLT_JUNIPER_FIBRECHANNEL       = 0xea\n\tDLT_JUNIPER_FRELAY             = 0xb4\n\tDLT_JUNIPER_GGSN               = 0x85\n\tDLT_JUNIPER_ISM                = 0xc2\n\tDLT_JUNIPER_MFR                = 0x86\n\tDLT_JUNIPER_MLFR               = 0x83\n\tDLT_JUNIPER_MLPPP              = 0x82\n\tDLT_JUNIPER_MONITOR            = 0xa4\n\tDLT_JUNIPER_PIC_PEER           = 0xae\n\tDLT_JUNIPER_PPP                = 0xb3\n\tDLT_JUNIPER_PPPOE              = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM          = 0xa8\n\tDLT_JUNIPER_SERVICES           = 0x88\n\tDLT_JUNIPER_SRX_E2E            = 0xe9\n\tDLT_JUNIPER_ST                 = 0xc8\n\tDLT_JUNIPER_VP                 = 0xb7\n\tDLT_JUNIPER_VS                 = 0xe8\n\tDLT_LAPB_WITH_DIR              = 0xcf\n\tDLT_LAPD                       = 0xcb\n\tDLT_LIN                        = 0xd4\n\tDLT_LINUX_EVDEV                = 0xd8\n\tDLT_LINUX_IRDA                 = 0x90\n\tDLT_LINUX_LAPD                 = 0xb1\n\tDLT_LINUX_PPP_WITHDIRECTION    = 0xa6\n\tDLT_LINUX_SLL                  = 0x71\n\tDLT_LOOP                       = 0x6c\n\tDLT_LTALK                      = 0x72\n\tDLT_MATCHING_MAX               = 0x104\n\tDLT_MATCHING_MIN               = 0x68\n\tDLT_MFR                        = 0xb6\n\tDLT_MOST                       = 0xd3\n\tDLT_MPEG_2_TS                  = 0xf3\n\tDLT_MPLS                       = 0xdb\n\tDLT_MTP2                       = 0x8c\n\tDLT_MTP2_WITH_PHDR             = 0x8b\n\tDLT_MTP3                       = 0x8d\n\tDLT_MUX27010                   = 0xec\n\tDLT_NETANALYZER                = 0xf0\n\tDLT_NETANALYZER_TRANSPARENT    = 0xf1\n\tDLT_NETLINK                    = 0xfd\n\tDLT_NFC_LLCP                   = 0xf5\n\tDLT_NFLOG                      = 0xef\n\tDLT_NG40                       = 0xf4\n\tDLT_NULL                       = 0x0\n\tDLT_PCI_EXP                    = 0x7d\n\tDLT_PFLOG                      = 0x75\n\tDLT_PFSYNC                     = 0x79\n\tDLT_PKTAP                      = 0x102\n\tDLT_PPI                        = 0xc0\n\tDLT_PPP                        = 0x9\n\tDLT_PPP_BSDOS                  = 0x10\n\tDLT_PPP_ETHER                  = 0x33\n\tDLT_PPP_PPPD                   = 0xa6\n\tDLT_PPP_SERIAL                 = 0x32\n\tDLT_PPP_WITH_DIR               = 0xcc\n\tDLT_PPP_WITH_DIRECTION         = 0xa6\n\tDLT_PRISM_HEADER               = 0x77\n\tDLT_PROFIBUS_DL                = 0x101\n\tDLT_PRONET                     = 0x4\n\tDLT_RAIF1                      = 0xc6\n\tDLT_RAW                        = 0xc\n\tDLT_RIO                        = 0x7c\n\tDLT_RTAC_SERIAL                = 0xfa\n\tDLT_SCCP                       = 0x8e\n\tDLT_SCTP                       = 0xf8\n\tDLT_SITA                       = 0xc4\n\tDLT_SLIP                       = 0x8\n\tDLT_SLIP_BSDOS                 = 0xf\n\tDLT_STANAG_5066_D_PDU          = 0xed\n\tDLT_SUNATM                     = 0x7b\n\tDLT_SYMANTEC_FIREWALL          = 0x63\n\tDLT_TZSP                       = 0x80\n\tDLT_USB                        = 0xba\n\tDLT_USBPCAP                    = 0xf9\n\tDLT_USB_LINUX                  = 0xbd\n\tDLT_USB_LINUX_MMAPPED          = 0xdc\n\tDLT_USER0                      = 0x93\n\tDLT_USER1                      = 0x94\n\tDLT_USER10                     = 0x9d\n\tDLT_USER11                     = 0x9e\n\tDLT_USER12                     = 0x9f\n\tDLT_USER13                     = 0xa0\n\tDLT_USER14                     = 0xa1\n\tDLT_USER15                     = 0xa2\n\tDLT_USER2                      = 0x95\n\tDLT_USER3                      = 0x96\n\tDLT_USER4                      = 0x97\n\tDLT_USER5                      = 0x98\n\tDLT_USER6                      = 0x99\n\tDLT_USER7                      = 0x9a\n\tDLT_USER8                      = 0x9b\n\tDLT_USER9                      = 0x9c\n\tDLT_WIHART                     = 0xdf\n\tDLT_WIRESHARK_UPPER_PDU        = 0xfc\n\tDLT_X2E_SERIAL                 = 0xd5\n\tDLT_X2E_XORAYA                 = 0xd6\n\tDT_BLK                         = 0x6\n\tDT_CHR                         = 0x2\n\tDT_DIR                         = 0x4\n\tDT_FIFO                        = 0x1\n\tDT_LNK                         = 0xa\n\tDT_REG                         = 0x8\n\tDT_SOCK                        = 0xc\n\tDT_UNKNOWN                     = 0x0\n\tDT_WHT                         = 0xe\n\tECHO                           = 0x8\n\tECHOCTL                        = 0x40\n\tECHOE                          = 0x2\n\tECHOK                          = 0x4\n\tECHOKE                         = 0x1\n\tECHONL                         = 0x10\n\tECHOPRT                        = 0x20\n\tEVFILT_AIO                     = -0x3\n\tEVFILT_FS                      = -0x9\n\tEVFILT_LIO                     = -0xa\n\tEVFILT_PROC                    = -0x5\n\tEVFILT_PROCDESC                = -0x8\n\tEVFILT_READ                    = -0x1\n\tEVFILT_SENDFILE                = -0xc\n\tEVFILT_SIGNAL                  = -0x6\n\tEVFILT_SYSCOUNT                = 0xc\n\tEVFILT_TIMER                   = -0x7\n\tEVFILT_USER                    = -0xb\n\tEVFILT_VNODE                   = -0x4\n\tEVFILT_WRITE                   = -0x2\n\tEV_ADD                         = 0x1\n\tEV_CLEAR                       = 0x20\n\tEV_DELETE                      = 0x2\n\tEV_DISABLE                     = 0x8\n\tEV_DISPATCH                    = 0x80\n\tEV_DROP                        = 0x1000\n\tEV_ENABLE                      = 0x4\n\tEV_EOF                         = 0x8000\n\tEV_ERROR                       = 0x4000\n\tEV_FLAG1                       = 0x2000\n\tEV_FLAG2                       = 0x4000\n\tEV_FORCEONESHOT                = 0x100\n\tEV_ONESHOT                     = 0x10\n\tEV_RECEIPT                     = 0x40\n\tEV_SYSFLAGS                    = 0xf000\n\tEXTA                           = 0x4b00\n\tEXTATTR_NAMESPACE_EMPTY        = 0x0\n\tEXTATTR_NAMESPACE_SYSTEM       = 0x2\n\tEXTATTR_NAMESPACE_USER         = 0x1\n\tEXTB                           = 0x9600\n\tEXTPROC                        = 0x800\n\tFD_CLOEXEC                     = 0x1\n\tFD_SETSIZE                     = 0x400\n\tFLUSHO                         = 0x800000\n\tF_CANCEL                       = 0x5\n\tF_DUP2FD                       = 0xa\n\tF_DUP2FD_CLOEXEC               = 0x12\n\tF_DUPFD                        = 0x0\n\tF_DUPFD_CLOEXEC                = 0x11\n\tF_GETFD                        = 0x1\n\tF_GETFL                        = 0x3\n\tF_GETLK                        = 0xb\n\tF_GETOWN                       = 0x5\n\tF_OGETLK                       = 0x7\n\tF_OK                           = 0x0\n\tF_OSETLK                       = 0x8\n\tF_OSETLKW                      = 0x9\n\tF_RDAHEAD                      = 0x10\n\tF_RDLCK                        = 0x1\n\tF_READAHEAD                    = 0xf\n\tF_SETFD                        = 0x2\n\tF_SETFL                        = 0x4\n\tF_SETLK                        = 0xc\n\tF_SETLKW                       = 0xd\n\tF_SETLK_REMOTE                 = 0xe\n\tF_SETOWN                       = 0x6\n\tF_UNLCK                        = 0x2\n\tF_UNLCKSYS                     = 0x4\n\tF_WRLCK                        = 0x3\n\tHUPCL                          = 0x4000\n\tICANON                         = 0x100\n\tICMP6_FILTER                   = 0x12\n\tICRNL                          = 0x100\n\tIEXTEN                         = 0x400\n\tIFAN_ARRIVAL                   = 0x0\n\tIFAN_DEPARTURE                 = 0x1\n\tIFF_ALLMULTI                   = 0x200\n\tIFF_ALTPHYS                    = 0x4000\n\tIFF_BROADCAST                  = 0x2\n\tIFF_CANTCHANGE                 = 0x218f52\n\tIFF_CANTCONFIG                 = 0x10000\n\tIFF_DEBUG                      = 0x4\n\tIFF_DRV_OACTIVE                = 0x400\n\tIFF_DRV_RUNNING                = 0x40\n\tIFF_DYING                      = 0x200000\n\tIFF_LINK0                      = 0x1000\n\tIFF_LINK1                      = 0x2000\n\tIFF_LINK2                      = 0x4000\n\tIFF_LOOPBACK                   = 0x8\n\tIFF_MONITOR                    = 0x40000\n\tIFF_MULTICAST                  = 0x8000\n\tIFF_NOARP                      = 0x80\n\tIFF_OACTIVE                    = 0x400\n\tIFF_POINTOPOINT                = 0x10\n\tIFF_PPROMISC                   = 0x20000\n\tIFF_PROMISC                    = 0x100\n\tIFF_RENAMING                   = 0x400000\n\tIFF_RUNNING                    = 0x40\n\tIFF_SIMPLEX                    = 0x800\n\tIFF_STATICARP                  = 0x80000\n\tIFF_UP                         = 0x1\n\tIFNAMSIZ                       = 0x10\n\tIFT_BRIDGE                     = 0xd1\n\tIFT_CARP                       = 0xf8\n\tIFT_IEEE1394                   = 0x90\n\tIFT_INFINIBAND                 = 0xc7\n\tIFT_L2VLAN                     = 0x87\n\tIFT_L3IPVLAN                   = 0x88\n\tIFT_PPP                        = 0x17\n\tIFT_PROPVIRTUAL                = 0x35\n\tIGNBRK                         = 0x1\n\tIGNCR                          = 0x80\n\tIGNPAR                         = 0x4\n\tIMAXBEL                        = 0x2000\n\tINLCR                          = 0x40\n\tINPCK                          = 0x10\n\tIN_CLASSA_HOST                 = 0xffffff\n\tIN_CLASSA_MAX                  = 0x80\n\tIN_CLASSA_NET                  = 0xff000000\n\tIN_CLASSA_NSHIFT               = 0x18\n\tIN_CLASSB_HOST                 = 0xffff\n\tIN_CLASSB_MAX                  = 0x10000\n\tIN_CLASSB_NET                  = 0xffff0000\n\tIN_CLASSB_NSHIFT               = 0x10\n\tIN_CLASSC_HOST                 = 0xff\n\tIN_CLASSC_NET                  = 0xffffff00\n\tIN_CLASSC_NSHIFT               = 0x8\n\tIN_CLASSD_HOST                 = 0xfffffff\n\tIN_CLASSD_NET                  = 0xf0000000\n\tIN_CLASSD_NSHIFT               = 0x1c\n\tIN_LOOPBACKNET                 = 0x7f\n\tIN_RFC3021_MASK                = 0xfffffffe\n\tIPPROTO_3PC                    = 0x22\n\tIPPROTO_ADFS                   = 0x44\n\tIPPROTO_AH                     = 0x33\n\tIPPROTO_AHIP                   = 0x3d\n\tIPPROTO_APES                   = 0x63\n\tIPPROTO_ARGUS                  = 0xd\n\tIPPROTO_AX25                   = 0x5d\n\tIPPROTO_BHA                    = 0x31\n\tIPPROTO_BLT                    = 0x1e\n\tIPPROTO_BRSATMON               = 0x4c\n\tIPPROTO_CARP                   = 0x70\n\tIPPROTO_CFTP                   = 0x3e\n\tIPPROTO_CHAOS                  = 0x10\n\tIPPROTO_CMTP                   = 0x26\n\tIPPROTO_CPHB                   = 0x49\n\tIPPROTO_CPNX                   = 0x48\n\tIPPROTO_DDP                    = 0x25\n\tIPPROTO_DGP                    = 0x56\n\tIPPROTO_DIVERT                 = 0x102\n\tIPPROTO_DONE                   = 0x101\n\tIPPROTO_DSTOPTS                = 0x3c\n\tIPPROTO_EGP                    = 0x8\n\tIPPROTO_EMCON                  = 0xe\n\tIPPROTO_ENCAP                  = 0x62\n\tIPPROTO_EON                    = 0x50\n\tIPPROTO_ESP                    = 0x32\n\tIPPROTO_ETHERIP                = 0x61\n\tIPPROTO_FRAGMENT               = 0x2c\n\tIPPROTO_GGP                    = 0x3\n\tIPPROTO_GMTP                   = 0x64\n\tIPPROTO_GRE                    = 0x2f\n\tIPPROTO_HELLO                  = 0x3f\n\tIPPROTO_HIP                    = 0x8b\n\tIPPROTO_HMP                    = 0x14\n\tIPPROTO_HOPOPTS                = 0x0\n\tIPPROTO_ICMP                   = 0x1\n\tIPPROTO_ICMPV6                 = 0x3a\n\tIPPROTO_IDP                    = 0x16\n\tIPPROTO_IDPR                   = 0x23\n\tIPPROTO_IDRP                   = 0x2d\n\tIPPROTO_IGMP                   = 0x2\n\tIPPROTO_IGP                    = 0x55\n\tIPPROTO_IGRP                   = 0x58\n\tIPPROTO_IL                     = 0x28\n\tIPPROTO_INLSP                  = 0x34\n\tIPPROTO_INP                    = 0x20\n\tIPPROTO_IP                     = 0x0\n\tIPPROTO_IPCOMP                 = 0x6c\n\tIPPROTO_IPCV                   = 0x47\n\tIPPROTO_IPEIP                  = 0x5e\n\tIPPROTO_IPIP                   = 0x4\n\tIPPROTO_IPPC                   = 0x43\n\tIPPROTO_IPV4                   = 0x4\n\tIPPROTO_IPV6                   = 0x29\n\tIPPROTO_IRTP                   = 0x1c\n\tIPPROTO_KRYPTOLAN              = 0x41\n\tIPPROTO_LARP                   = 0x5b\n\tIPPROTO_LEAF1                  = 0x19\n\tIPPROTO_LEAF2                  = 0x1a\n\tIPPROTO_MAX                    = 0x100\n\tIPPROTO_MEAS                   = 0x13\n\tIPPROTO_MH                     = 0x87\n\tIPPROTO_MHRP                   = 0x30\n\tIPPROTO_MICP                   = 0x5f\n\tIPPROTO_MOBILE                 = 0x37\n\tIPPROTO_MPLS                   = 0x89\n\tIPPROTO_MTP                    = 0x5c\n\tIPPROTO_MUX                    = 0x12\n\tIPPROTO_ND                     = 0x4d\n\tIPPROTO_NHRP                   = 0x36\n\tIPPROTO_NONE                   = 0x3b\n\tIPPROTO_NSP                    = 0x1f\n\tIPPROTO_NVPII                  = 0xb\n\tIPPROTO_OLD_DIVERT             = 0xfe\n\tIPPROTO_OSPFIGP                = 0x59\n\tIPPROTO_PFSYNC                 = 0xf0\n\tIPPROTO_PGM                    = 0x71\n\tIPPROTO_PIGP                   = 0x9\n\tIPPROTO_PIM                    = 0x67\n\tIPPROTO_PRM                    = 0x15\n\tIPPROTO_PUP                    = 0xc\n\tIPPROTO_PVP                    = 0x4b\n\tIPPROTO_RAW                    = 0xff\n\tIPPROTO_RCCMON                 = 0xa\n\tIPPROTO_RDP                    = 0x1b\n\tIPPROTO_RESERVED_253           = 0xfd\n\tIPPROTO_RESERVED_254           = 0xfe\n\tIPPROTO_ROUTING                = 0x2b\n\tIPPROTO_RSVP                   = 0x2e\n\tIPPROTO_RVD                    = 0x42\n\tIPPROTO_SATEXPAK               = 0x40\n\tIPPROTO_SATMON                 = 0x45\n\tIPPROTO_SCCSP                  = 0x60\n\tIPPROTO_SCTP                   = 0x84\n\tIPPROTO_SDRP                   = 0x2a\n\tIPPROTO_SEND                   = 0x103\n\tIPPROTO_SEP                    = 0x21\n\tIPPROTO_SHIM6                  = 0x8c\n\tIPPROTO_SKIP                   = 0x39\n\tIPPROTO_SPACER                 = 0x7fff\n\tIPPROTO_SRPC                   = 0x5a\n\tIPPROTO_ST                     = 0x7\n\tIPPROTO_SVMTP                  = 0x52\n\tIPPROTO_SWIPE                  = 0x35\n\tIPPROTO_TCF                    = 0x57\n\tIPPROTO_TCP                    = 0x6\n\tIPPROTO_TLSP                   = 0x38\n\tIPPROTO_TP                     = 0x1d\n\tIPPROTO_TPXX                   = 0x27\n\tIPPROTO_TRUNK1                 = 0x17\n\tIPPROTO_TRUNK2                 = 0x18\n\tIPPROTO_TTP                    = 0x54\n\tIPPROTO_UDP                    = 0x11\n\tIPPROTO_UDPLITE                = 0x88\n\tIPPROTO_VINES                  = 0x53\n\tIPPROTO_VISA                   = 0x46\n\tIPPROTO_VMTP                   = 0x51\n\tIPPROTO_WBEXPAK                = 0x4f\n\tIPPROTO_WBMON                  = 0x4e\n\tIPPROTO_WSN                    = 0x4a\n\tIPPROTO_XNET                   = 0xf\n\tIPPROTO_XTP                    = 0x24\n\tIPV6_AUTOFLOWLABEL             = 0x3b\n\tIPV6_BINDANY                   = 0x40\n\tIPV6_BINDMULTI                 = 0x41\n\tIPV6_BINDV6ONLY                = 0x1b\n\tIPV6_CHECKSUM                  = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS    = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP    = 0x1\n\tIPV6_DEFHLIM                   = 0x40\n\tIPV6_DONTFRAG                  = 0x3e\n\tIPV6_DSTOPTS                   = 0x32\n\tIPV6_FLOWID                    = 0x43\n\tIPV6_FLOWINFO_MASK             = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK            = 0xffff0f00\n\tIPV6_FLOWTYPE                  = 0x44\n\tIPV6_FRAGTTL                   = 0x78\n\tIPV6_FW_ADD                    = 0x1e\n\tIPV6_FW_DEL                    = 0x1f\n\tIPV6_FW_FLUSH                  = 0x20\n\tIPV6_FW_GET                    = 0x22\n\tIPV6_FW_ZERO                   = 0x21\n\tIPV6_HLIMDEC                   = 0x1\n\tIPV6_HOPLIMIT                  = 0x2f\n\tIPV6_HOPOPTS                   = 0x31\n\tIPV6_IPSEC_POLICY              = 0x1c\n\tIPV6_JOIN_GROUP                = 0xc\n\tIPV6_LEAVE_GROUP               = 0xd\n\tIPV6_MAXHLIM                   = 0xff\n\tIPV6_MAXOPTHDR                 = 0x800\n\tIPV6_MAXPACKET                 = 0xffff\n\tIPV6_MAX_GROUP_SRC_FILTER      = 0x200\n\tIPV6_MAX_MEMBERSHIPS           = 0xfff\n\tIPV6_MAX_SOCK_SRC_FILTER       = 0x80\n\tIPV6_MIN_MEMBERSHIPS           = 0x1f\n\tIPV6_MMTU                      = 0x500\n\tIPV6_MSFILTER                  = 0x4a\n\tIPV6_MULTICAST_HOPS            = 0xa\n\tIPV6_MULTICAST_IF              = 0x9\n\tIPV6_MULTICAST_LOOP            = 0xb\n\tIPV6_NEXTHOP                   = 0x30\n\tIPV6_PATHMTU                   = 0x2c\n\tIPV6_PKTINFO                   = 0x2e\n\tIPV6_PORTRANGE                 = 0xe\n\tIPV6_PORTRANGE_DEFAULT         = 0x0\n\tIPV6_PORTRANGE_HIGH            = 0x1\n\tIPV6_PORTRANGE_LOW             = 0x2\n\tIPV6_PREFER_TEMPADDR           = 0x3f\n\tIPV6_RECVDSTOPTS               = 0x28\n\tIPV6_RECVFLOWID                = 0x46\n\tIPV6_RECVHOPLIMIT              = 0x25\n\tIPV6_RECVHOPOPTS               = 0x27\n\tIPV6_RECVPATHMTU               = 0x2b\n\tIPV6_RECVPKTINFO               = 0x24\n\tIPV6_RECVRSSBUCKETID           = 0x47\n\tIPV6_RECVRTHDR                 = 0x26\n\tIPV6_RECVTCLASS                = 0x39\n\tIPV6_RSSBUCKETID               = 0x45\n\tIPV6_RSS_LISTEN_BUCKET         = 0x42\n\tIPV6_RTHDR                     = 0x33\n\tIPV6_RTHDRDSTOPTS              = 0x23\n\tIPV6_RTHDR_LOOSE               = 0x0\n\tIPV6_RTHDR_STRICT              = 0x1\n\tIPV6_RTHDR_TYPE_0              = 0x0\n\tIPV6_SOCKOPT_RESERVED1         = 0x3\n\tIPV6_TCLASS                    = 0x3d\n\tIPV6_UNICAST_HOPS              = 0x4\n\tIPV6_USE_MIN_MTU               = 0x2a\n\tIPV6_V6ONLY                    = 0x1b\n\tIPV6_VERSION                   = 0x60\n\tIPV6_VERSION_MASK              = 0xf0\n\tIP_ADD_MEMBERSHIP              = 0xc\n\tIP_ADD_SOURCE_MEMBERSHIP       = 0x46\n\tIP_BINDANY                     = 0x18\n\tIP_BINDMULTI                   = 0x19\n\tIP_BLOCK_SOURCE                = 0x48\n\tIP_DEFAULT_MULTICAST_LOOP      = 0x1\n\tIP_DEFAULT_MULTICAST_TTL       = 0x1\n\tIP_DF                          = 0x4000\n\tIP_DONTFRAG                    = 0x43\n\tIP_DROP_MEMBERSHIP             = 0xd\n\tIP_DROP_SOURCE_MEMBERSHIP      = 0x47\n\tIP_DUMMYNET3                   = 0x31\n\tIP_DUMMYNET_CONFIGURE          = 0x3c\n\tIP_DUMMYNET_DEL                = 0x3d\n\tIP_DUMMYNET_FLUSH              = 0x3e\n\tIP_DUMMYNET_GET                = 0x40\n\tIP_FLOWID                      = 0x5a\n\tIP_FLOWTYPE                    = 0x5b\n\tIP_FW3                         = 0x30\n\tIP_FW_ADD                      = 0x32\n\tIP_FW_DEL                      = 0x33\n\tIP_FW_FLUSH                    = 0x34\n\tIP_FW_GET                      = 0x36\n\tIP_FW_NAT_CFG                  = 0x38\n\tIP_FW_NAT_DEL                  = 0x39\n\tIP_FW_NAT_GET_CONFIG           = 0x3a\n\tIP_FW_NAT_GET_LOG              = 0x3b\n\tIP_FW_RESETLOG                 = 0x37\n\tIP_FW_TABLE_ADD                = 0x28\n\tIP_FW_TABLE_DEL                = 0x29\n\tIP_FW_TABLE_FLUSH              = 0x2a\n\tIP_FW_TABLE_GETSIZE            = 0x2b\n\tIP_FW_TABLE_LIST               = 0x2c\n\tIP_FW_ZERO                     = 0x35\n\tIP_HDRINCL                     = 0x2\n\tIP_IPSEC_POLICY                = 0x15\n\tIP_MAXPACKET                   = 0xffff\n\tIP_MAX_GROUP_SRC_FILTER        = 0x200\n\tIP_MAX_MEMBERSHIPS             = 0xfff\n\tIP_MAX_SOCK_MUTE_FILTER        = 0x80\n\tIP_MAX_SOCK_SRC_FILTER         = 0x80\n\tIP_MAX_SOURCE_FILTER           = 0x400\n\tIP_MF                          = 0x2000\n\tIP_MINTTL                      = 0x42\n\tIP_MIN_MEMBERSHIPS             = 0x1f\n\tIP_MSFILTER                    = 0x4a\n\tIP_MSS                         = 0x240\n\tIP_MULTICAST_IF                = 0x9\n\tIP_MULTICAST_LOOP              = 0xb\n\tIP_MULTICAST_TTL               = 0xa\n\tIP_MULTICAST_VIF               = 0xe\n\tIP_OFFMASK                     = 0x1fff\n\tIP_ONESBCAST                   = 0x17\n\tIP_OPTIONS                     = 0x1\n\tIP_PORTRANGE                   = 0x13\n\tIP_PORTRANGE_DEFAULT           = 0x0\n\tIP_PORTRANGE_HIGH              = 0x1\n\tIP_PORTRANGE_LOW               = 0x2\n\tIP_RECVDSTADDR                 = 0x7\n\tIP_RECVFLOWID                  = 0x5d\n\tIP_RECVIF                      = 0x14\n\tIP_RECVOPTS                    = 0x5\n\tIP_RECVRETOPTS                 = 0x6\n\tIP_RECVRSSBUCKETID             = 0x5e\n\tIP_RECVTOS                     = 0x44\n\tIP_RECVTTL                     = 0x41\n\tIP_RETOPTS                     = 0x8\n\tIP_RF                          = 0x8000\n\tIP_RSSBUCKETID                 = 0x5c\n\tIP_RSS_LISTEN_BUCKET           = 0x1a\n\tIP_RSVP_OFF                    = 0x10\n\tIP_RSVP_ON                     = 0xf\n\tIP_RSVP_VIF_OFF                = 0x12\n\tIP_RSVP_VIF_ON                 = 0x11\n\tIP_SENDSRCADDR                 = 0x7\n\tIP_TOS                         = 0x3\n\tIP_TTL                         = 0x4\n\tIP_UNBLOCK_SOURCE              = 0x49\n\tISIG                           = 0x80\n\tISTRIP                         = 0x20\n\tIXANY                          = 0x800\n\tIXOFF                          = 0x400\n\tIXON                           = 0x200\n\tLOCK_EX                        = 0x2\n\tLOCK_NB                        = 0x4\n\tLOCK_SH                        = 0x1\n\tLOCK_UN                        = 0x8\n\tMADV_AUTOSYNC                  = 0x7\n\tMADV_CORE                      = 0x9\n\tMADV_DONTNEED                  = 0x4\n\tMADV_FREE                      = 0x5\n\tMADV_NOCORE                    = 0x8\n\tMADV_NORMAL                    = 0x0\n\tMADV_NOSYNC                    = 0x6\n\tMADV_PROTECT                   = 0xa\n\tMADV_RANDOM                    = 0x1\n\tMADV_SEQUENTIAL                = 0x2\n\tMADV_WILLNEED                  = 0x3\n\tMAP_ALIGNED_SUPER              = 0x1000000\n\tMAP_ALIGNMENT_MASK             = -0x1000000\n\tMAP_ALIGNMENT_SHIFT            = 0x18\n\tMAP_ANON                       = 0x1000\n\tMAP_ANONYMOUS                  = 0x1000\n\tMAP_COPY                       = 0x2\n\tMAP_EXCL                       = 0x4000\n\tMAP_FILE                       = 0x0\n\tMAP_FIXED                      = 0x10\n\tMAP_HASSEMAPHORE               = 0x200\n\tMAP_NOCORE                     = 0x20000\n\tMAP_NOSYNC                     = 0x800\n\tMAP_PREFAULT_READ              = 0x40000\n\tMAP_PRIVATE                    = 0x2\n\tMAP_RESERVED0020               = 0x20\n\tMAP_RESERVED0040               = 0x40\n\tMAP_RESERVED0080               = 0x80\n\tMAP_RESERVED0100               = 0x100\n\tMAP_SHARED                     = 0x1\n\tMAP_STACK                      = 0x400\n\tMCL_CURRENT                    = 0x1\n\tMCL_FUTURE                     = 0x2\n\tMNT_ACLS                       = 0x8000000\n\tMNT_ASYNC                      = 0x40\n\tMNT_AUTOMOUNTED                = 0x200000000\n\tMNT_BYFSID                     = 0x8000000\n\tMNT_CMDFLAGS                   = 0xd0f0000\n\tMNT_DEFEXPORTED                = 0x200\n\tMNT_DELEXPORT                  = 0x20000\n\tMNT_EXKERB                     = 0x800\n\tMNT_EXPORTANON                 = 0x400\n\tMNT_EXPORTED                   = 0x100\n\tMNT_EXPUBLIC                   = 0x20000000\n\tMNT_EXRDONLY                   = 0x80\n\tMNT_FORCE                      = 0x80000\n\tMNT_GJOURNAL                   = 0x2000000\n\tMNT_IGNORE                     = 0x800000\n\tMNT_LAZY                       = 0x3\n\tMNT_LOCAL                      = 0x1000\n\tMNT_MULTILABEL                 = 0x4000000\n\tMNT_NFS4ACLS                   = 0x10\n\tMNT_NOATIME                    = 0x10000000\n\tMNT_NOCLUSTERR                 = 0x40000000\n\tMNT_NOCLUSTERW                 = 0x80000000\n\tMNT_NOEXEC                     = 0x4\n\tMNT_NONBUSY                    = 0x4000000\n\tMNT_NOSUID                     = 0x8\n\tMNT_NOSYMFOLLOW                = 0x400000\n\tMNT_NOWAIT                     = 0x2\n\tMNT_QUOTA                      = 0x2000\n\tMNT_RDONLY                     = 0x1\n\tMNT_RELOAD                     = 0x40000\n\tMNT_ROOTFS                     = 0x4000\n\tMNT_SNAPSHOT                   = 0x1000000\n\tMNT_SOFTDEP                    = 0x200000\n\tMNT_SUIDDIR                    = 0x100000\n\tMNT_SUJ                        = 0x100000000\n\tMNT_SUSPEND                    = 0x4\n\tMNT_SYNCHRONOUS                = 0x2\n\tMNT_UNION                      = 0x20\n\tMNT_UPDATE                     = 0x10000\n\tMNT_UPDATEMASK                 = 0x2d8d0807e\n\tMNT_USER                       = 0x8000\n\tMNT_VISFLAGMASK                = 0x3fef0ffff\n\tMNT_WAIT                       = 0x1\n\tMSG_CMSG_CLOEXEC               = 0x40000\n\tMSG_COMPAT                     = 0x8000\n\tMSG_CTRUNC                     = 0x20\n\tMSG_DONTROUTE                  = 0x4\n\tMSG_DONTWAIT                   = 0x80\n\tMSG_EOF                        = 0x100\n\tMSG_EOR                        = 0x8\n\tMSG_NBIO                       = 0x4000\n\tMSG_NOSIGNAL                   = 0x20000\n\tMSG_NOTIFICATION               = 0x2000\n\tMSG_OOB                        = 0x1\n\tMSG_PEEK                       = 0x2\n\tMSG_TRUNC                      = 0x10\n\tMSG_WAITALL                    = 0x40\n\tMSG_WAITFORONE                 = 0x80000\n\tMS_ASYNC                       = 0x1\n\tMS_INVALIDATE                  = 0x2\n\tMS_SYNC                        = 0x0\n\tNAME_MAX                       = 0xff\n\tNET_RT_DUMP                    = 0x1\n\tNET_RT_FLAGS                   = 0x2\n\tNET_RT_IFLIST                  = 0x3\n\tNET_RT_IFLISTL                 = 0x5\n\tNET_RT_IFMALIST                = 0x4\n\tNOFLSH                         = 0x80000000\n\tNOKERNINFO                     = 0x2000000\n\tNOTE_ATTRIB                    = 0x8\n\tNOTE_CHILD                     = 0x4\n\tNOTE_CLOSE                     = 0x100\n\tNOTE_CLOSE_WRITE               = 0x200\n\tNOTE_DELETE                    = 0x1\n\tNOTE_EXEC                      = 0x20000000\n\tNOTE_EXIT                      = 0x80000000\n\tNOTE_EXTEND                    = 0x4\n\tNOTE_FFAND                     = 0x40000000\n\tNOTE_FFCOPY                    = 0xc0000000\n\tNOTE_FFCTRLMASK                = 0xc0000000\n\tNOTE_FFLAGSMASK                = 0xffffff\n\tNOTE_FFNOP                     = 0x0\n\tNOTE_FFOR                      = 0x80000000\n\tNOTE_FILE_POLL                 = 0x2\n\tNOTE_FORK                      = 0x40000000\n\tNOTE_LINK                      = 0x10\n\tNOTE_LOWAT                     = 0x1\n\tNOTE_MSECONDS                  = 0x2\n\tNOTE_NSECONDS                  = 0x8\n\tNOTE_OPEN                      = 0x80\n\tNOTE_PCTRLMASK                 = 0xf0000000\n\tNOTE_PDATAMASK                 = 0xfffff\n\tNOTE_READ                      = 0x400\n\tNOTE_RENAME                    = 0x20\n\tNOTE_REVOKE                    = 0x40\n\tNOTE_SECONDS                   = 0x1\n\tNOTE_TRACK                     = 0x1\n\tNOTE_TRACKERR                  = 0x2\n\tNOTE_TRIGGER                   = 0x1000000\n\tNOTE_USECONDS                  = 0x4\n\tNOTE_WRITE                     = 0x2\n\tOCRNL                          = 0x10\n\tONLCR                          = 0x2\n\tONLRET                         = 0x40\n\tONOCR                          = 0x20\n\tONOEOT                         = 0x8\n\tOPOST                          = 0x1\n\tOXTABS                         = 0x4\n\tO_ACCMODE                      = 0x3\n\tO_APPEND                       = 0x8\n\tO_ASYNC                        = 0x40\n\tO_CLOEXEC                      = 0x100000\n\tO_CREAT                        = 0x200\n\tO_DIRECT                       = 0x10000\n\tO_DIRECTORY                    = 0x20000\n\tO_EXCL                         = 0x800\n\tO_EXEC                         = 0x40000\n\tO_EXLOCK                       = 0x20\n\tO_FSYNC                        = 0x80\n\tO_NDELAY                       = 0x4\n\tO_NOCTTY                       = 0x8000\n\tO_NOFOLLOW                     = 0x100\n\tO_NONBLOCK                     = 0x4\n\tO_RDONLY                       = 0x0\n\tO_RDWR                         = 0x2\n\tO_SHLOCK                       = 0x10\n\tO_SYNC                         = 0x80\n\tO_TRUNC                        = 0x400\n\tO_TTY_INIT                     = 0x80000\n\tO_VERIFY                       = 0x200000\n\tO_WRONLY                       = 0x1\n\tPARENB                         = 0x1000\n\tPARMRK                         = 0x8\n\tPARODD                         = 0x2000\n\tPENDIN                         = 0x20000000\n\tPRIO_PGRP                      = 0x1\n\tPRIO_PROCESS                   = 0x0\n\tPRIO_USER                      = 0x2\n\tPROT_EXEC                      = 0x4\n\tPROT_NONE                      = 0x0\n\tPROT_READ                      = 0x1\n\tPROT_WRITE                     = 0x2\n\tRLIMIT_AS                      = 0xa\n\tRLIMIT_CORE                    = 0x4\n\tRLIMIT_CPU                     = 0x0\n\tRLIMIT_DATA                    = 0x2\n\tRLIMIT_FSIZE                   = 0x1\n\tRLIMIT_MEMLOCK                 = 0x6\n\tRLIMIT_NOFILE                  = 0x8\n\tRLIMIT_NPROC                   = 0x7\n\tRLIMIT_RSS                     = 0x5\n\tRLIMIT_STACK                   = 0x3\n\tRLIM_INFINITY                  = 0x7fffffffffffffff\n\tRTAX_AUTHOR                    = 0x6\n\tRTAX_BRD                       = 0x7\n\tRTAX_DST                       = 0x0\n\tRTAX_GATEWAY                   = 0x1\n\tRTAX_GENMASK                   = 0x3\n\tRTAX_IFA                       = 0x5\n\tRTAX_IFP                       = 0x4\n\tRTAX_MAX                       = 0x8\n\tRTAX_NETMASK                   = 0x2\n\tRTA_AUTHOR                     = 0x40\n\tRTA_BRD                        = 0x80\n\tRTA_DST                        = 0x1\n\tRTA_GATEWAY                    = 0x2\n\tRTA_GENMASK                    = 0x8\n\tRTA_IFA                        = 0x20\n\tRTA_IFP                        = 0x10\n\tRTA_NETMASK                    = 0x4\n\tRTF_BLACKHOLE                  = 0x1000\n\tRTF_BROADCAST                  = 0x400000\n\tRTF_DONE                       = 0x40\n\tRTF_DYNAMIC                    = 0x10\n\tRTF_FIXEDMTU                   = 0x80000\n\tRTF_FMASK                      = 0x1004d808\n\tRTF_GATEWAY                    = 0x2\n\tRTF_GWFLAG_COMPAT              = 0x80000000\n\tRTF_HOST                       = 0x4\n\tRTF_LLDATA                     = 0x400\n\tRTF_LLINFO                     = 0x400\n\tRTF_LOCAL                      = 0x200000\n\tRTF_MODIFIED                   = 0x20\n\tRTF_MULTICAST                  = 0x800000\n\tRTF_PINNED                     = 0x100000\n\tRTF_PROTO1                     = 0x8000\n\tRTF_PROTO2                     = 0x4000\n\tRTF_PROTO3                     = 0x40000\n\tRTF_REJECT                     = 0x8\n\tRTF_RNH_LOCKED                 = 0x40000000\n\tRTF_STATIC                     = 0x800\n\tRTF_STICKY                     = 0x10000000\n\tRTF_UP                         = 0x1\n\tRTF_XRESOLVE                   = 0x200\n\tRTM_ADD                        = 0x1\n\tRTM_CHANGE                     = 0x3\n\tRTM_DELADDR                    = 0xd\n\tRTM_DELETE                     = 0x2\n\tRTM_DELMADDR                   = 0x10\n\tRTM_GET                        = 0x4\n\tRTM_IEEE80211                  = 0x12\n\tRTM_IFANNOUNCE                 = 0x11\n\tRTM_IFINFO                     = 0xe\n\tRTM_LOCK                       = 0x8\n\tRTM_LOSING                     = 0x5\n\tRTM_MISS                       = 0x7\n\tRTM_NEWADDR                    = 0xc\n\tRTM_NEWMADDR                   = 0xf\n\tRTM_REDIRECT                   = 0x6\n\tRTM_RESOLVE                    = 0xb\n\tRTM_RTTUNIT                    = 0xf4240\n\tRTM_VERSION                    = 0x5\n\tRTV_EXPIRE                     = 0x4\n\tRTV_HOPCOUNT                   = 0x2\n\tRTV_MTU                        = 0x1\n\tRTV_RPIPE                      = 0x8\n\tRTV_RTT                        = 0x40\n\tRTV_RTTVAR                     = 0x80\n\tRTV_SPIPE                      = 0x10\n\tRTV_SSTHRESH                   = 0x20\n\tRTV_WEIGHT                     = 0x100\n\tRT_ALL_FIBS                    = -0x1\n\tRT_BLACKHOLE                   = 0x40\n\tRT_CACHING_CONTEXT             = 0x1\n\tRT_DEFAULT_FIB                 = 0x0\n\tRT_HAS_GW                      = 0x80\n\tRT_HAS_HEADER                  = 0x10\n\tRT_HAS_HEADER_BIT              = 0x4\n\tRT_L2_ME                       = 0x4\n\tRT_L2_ME_BIT                   = 0x2\n\tRT_LLE_CACHE                   = 0x100\n\tRT_MAY_LOOP                    = 0x8\n\tRT_MAY_LOOP_BIT                = 0x3\n\tRT_NORTREF                     = 0x2\n\tRT_REJECT                      = 0x20\n\tRUSAGE_CHILDREN                = -0x1\n\tRUSAGE_SELF                    = 0x0\n\tRUSAGE_THREAD                  = 0x1\n\tSCM_BINTIME                    = 0x4\n\tSCM_CREDS                      = 0x3\n\tSCM_RIGHTS                     = 0x1\n\tSCM_TIMESTAMP                  = 0x2\n\tSHUT_RD                        = 0x0\n\tSHUT_RDWR                      = 0x2\n\tSHUT_WR                        = 0x1\n\tSIOCADDMULTI                   = 0x80206931\n\tSIOCAIFADDR                    = 0x8040691a\n\tSIOCAIFGROUP                   = 0x80246987\n\tSIOCATMARK                     = 0x40047307\n\tSIOCDELMULTI                   = 0x80206932\n\tSIOCDIFADDR                    = 0x80206919\n\tSIOCDIFGROUP                   = 0x80246989\n\tSIOCDIFPHYADDR                 = 0x80206949\n\tSIOCGDRVSPEC                   = 0xc01c697b\n\tSIOCGETSGCNT                   = 0xc0147210\n\tSIOCGETVIFCNT                  = 0xc014720f\n\tSIOCGHIWAT                     = 0x40047301\n\tSIOCGI2C                       = 0xc020693d\n\tSIOCGIFADDR                    = 0xc0206921\n\tSIOCGIFBRDADDR                 = 0xc0206923\n\tSIOCGIFCAP                     = 0xc020691f\n\tSIOCGIFCONF                    = 0xc0086924\n\tSIOCGIFDESCR                   = 0xc020692a\n\tSIOCGIFDSTADDR                 = 0xc0206922\n\tSIOCGIFFIB                     = 0xc020695c\n\tSIOCGIFFLAGS                   = 0xc0206911\n\tSIOCGIFGENERIC                 = 0xc020693a\n\tSIOCGIFGMEMB                   = 0xc024698a\n\tSIOCGIFGROUP                   = 0xc0246988\n\tSIOCGIFINDEX                   = 0xc0206920\n\tSIOCGIFMAC                     = 0xc0206926\n\tSIOCGIFMEDIA                   = 0xc0286938\n\tSIOCGIFMETRIC                  = 0xc0206917\n\tSIOCGIFMTU                     = 0xc0206933\n\tSIOCGIFNETMASK                 = 0xc0206925\n\tSIOCGIFPDSTADDR                = 0xc0206948\n\tSIOCGIFPHYS                    = 0xc0206935\n\tSIOCGIFPSRCADDR                = 0xc0206947\n\tSIOCGIFSTATUS                  = 0xc331693b\n\tSIOCGIFXMEDIA                  = 0xc028698b\n\tSIOCGLOWAT                     = 0x40047303\n\tSIOCGPGRP                      = 0x40047309\n\tSIOCGPRIVATE_0                 = 0xc0206950\n\tSIOCGPRIVATE_1                 = 0xc0206951\n\tSIOCGTUNFIB                    = 0xc020695e\n\tSIOCIFCREATE                   = 0xc020697a\n\tSIOCIFCREATE2                  = 0xc020697c\n\tSIOCIFDESTROY                  = 0x80206979\n\tSIOCIFGCLONERS                 = 0xc00c6978\n\tSIOCSDRVSPEC                   = 0x801c697b\n\tSIOCSHIWAT                     = 0x80047300\n\tSIOCSIFADDR                    = 0x8020690c\n\tSIOCSIFBRDADDR                 = 0x80206913\n\tSIOCSIFCAP                     = 0x8020691e\n\tSIOCSIFDESCR                   = 0x80206929\n\tSIOCSIFDSTADDR                 = 0x8020690e\n\tSIOCSIFFIB                     = 0x8020695d\n\tSIOCSIFFLAGS                   = 0x80206910\n\tSIOCSIFGENERIC                 = 0x80206939\n\tSIOCSIFLLADDR                  = 0x8020693c\n\tSIOCSIFMAC                     = 0x80206927\n\tSIOCSIFMEDIA                   = 0xc0206937\n\tSIOCSIFMETRIC                  = 0x80206918\n\tSIOCSIFMTU                     = 0x80206934\n\tSIOCSIFNAME                    = 0x80206928\n\tSIOCSIFNETMASK                 = 0x80206916\n\tSIOCSIFPHYADDR                 = 0x80406946\n\tSIOCSIFPHYS                    = 0x80206936\n\tSIOCSIFRVNET                   = 0xc020695b\n\tSIOCSIFVNET                    = 0xc020695a\n\tSIOCSLOWAT                     = 0x80047302\n\tSIOCSPGRP                      = 0x80047308\n\tSIOCSTUNFIB                    = 0x8020695f\n\tSOCK_CLOEXEC                   = 0x10000000\n\tSOCK_DGRAM                     = 0x2\n\tSOCK_MAXADDRLEN                = 0xff\n\tSOCK_NONBLOCK                  = 0x20000000\n\tSOCK_RAW                       = 0x3\n\tSOCK_RDM                       = 0x4\n\tSOCK_SEQPACKET                 = 0x5\n\tSOCK_STREAM                    = 0x1\n\tSOL_SOCKET                     = 0xffff\n\tSOMAXCONN                      = 0x80\n\tSO_ACCEPTCONN                  = 0x2\n\tSO_ACCEPTFILTER                = 0x1000\n\tSO_BINTIME                     = 0x2000\n\tSO_BROADCAST                   = 0x20\n\tSO_DEBUG                       = 0x1\n\tSO_DONTROUTE                   = 0x10\n\tSO_ERROR                       = 0x1007\n\tSO_KEEPALIVE                   = 0x8\n\tSO_LABEL                       = 0x1009\n\tSO_LINGER                      = 0x80\n\tSO_LISTENINCQLEN               = 0x1013\n\tSO_LISTENQLEN                  = 0x1012\n\tSO_LISTENQLIMIT                = 0x1011\n\tSO_NOSIGPIPE                   = 0x800\n\tSO_NO_DDP                      = 0x8000\n\tSO_NO_OFFLOAD                  = 0x4000\n\tSO_OOBINLINE                   = 0x100\n\tSO_PEERLABEL                   = 0x1010\n\tSO_PROTOCOL                    = 0x1016\n\tSO_PROTOTYPE                   = 0x1016\n\tSO_RCVBUF                      = 0x1002\n\tSO_RCVLOWAT                    = 0x1004\n\tSO_RCVTIMEO                    = 0x1006\n\tSO_REUSEADDR                   = 0x4\n\tSO_REUSEPORT                   = 0x200\n\tSO_SETFIB                      = 0x1014\n\tSO_SNDBUF                      = 0x1001\n\tSO_SNDLOWAT                    = 0x1003\n\tSO_SNDTIMEO                    = 0x1005\n\tSO_TIMESTAMP                   = 0x400\n\tSO_TYPE                        = 0x1008\n\tSO_USELOOPBACK                 = 0x40\n\tSO_USER_COOKIE                 = 0x1015\n\tSO_VENDOR                      = 0x80000000\n\tTAB0                           = 0x0\n\tTAB3                           = 0x4\n\tTABDLY                         = 0x4\n\tTCIFLUSH                       = 0x1\n\tTCIOFF                         = 0x3\n\tTCIOFLUSH                      = 0x3\n\tTCION                          = 0x4\n\tTCOFLUSH                       = 0x2\n\tTCOOFF                         = 0x1\n\tTCOON                          = 0x2\n\tTCP_CA_NAME_MAX                = 0x10\n\tTCP_CCALGOOPT                  = 0x41\n\tTCP_CONGESTION                 = 0x40\n\tTCP_FASTOPEN                   = 0x401\n\tTCP_FUNCTION_BLK               = 0x2000\n\tTCP_FUNCTION_NAME_LEN_MAX      = 0x20\n\tTCP_INFO                       = 0x20\n\tTCP_KEEPCNT                    = 0x400\n\tTCP_KEEPIDLE                   = 0x100\n\tTCP_KEEPINIT                   = 0x80\n\tTCP_KEEPINTVL                  = 0x200\n\tTCP_MAXBURST                   = 0x4\n\tTCP_MAXHLEN                    = 0x3c\n\tTCP_MAXOLEN                    = 0x28\n\tTCP_MAXSEG                     = 0x2\n\tTCP_MAXWIN                     = 0xffff\n\tTCP_MAX_SACK                   = 0x4\n\tTCP_MAX_WINSHIFT               = 0xe\n\tTCP_MD5SIG                     = 0x10\n\tTCP_MINMSS                     = 0xd8\n\tTCP_MSS                        = 0x218\n\tTCP_NODELAY                    = 0x1\n\tTCP_NOOPT                      = 0x8\n\tTCP_NOPUSH                     = 0x4\n\tTCP_PCAP_IN                    = 0x1000\n\tTCP_PCAP_OUT                   = 0x800\n\tTCP_VENDOR                     = 0x80000000\n\tTCSAFLUSH                      = 0x2\n\tTIOCCBRK                       = 0x2000747a\n\tTIOCCDTR                       = 0x20007478\n\tTIOCCONS                       = 0x80047462\n\tTIOCDRAIN                      = 0x2000745e\n\tTIOCEXCL                       = 0x2000740d\n\tTIOCEXT                        = 0x80047460\n\tTIOCFLUSH                      = 0x80047410\n\tTIOCGDRAINWAIT                 = 0x40047456\n\tTIOCGETA                       = 0x402c7413\n\tTIOCGETD                       = 0x4004741a\n\tTIOCGPGRP                      = 0x40047477\n\tTIOCGPTN                       = 0x4004740f\n\tTIOCGSID                       = 0x40047463\n\tTIOCGWINSZ                     = 0x40087468\n\tTIOCMBIC                       = 0x8004746b\n\tTIOCMBIS                       = 0x8004746c\n\tTIOCMGDTRWAIT                  = 0x4004745a\n\tTIOCMGET                       = 0x4004746a\n\tTIOCMSDTRWAIT                  = 0x8004745b\n\tTIOCMSET                       = 0x8004746d\n\tTIOCM_CAR                      = 0x40\n\tTIOCM_CD                       = 0x40\n\tTIOCM_CTS                      = 0x20\n\tTIOCM_DCD                      = 0x40\n\tTIOCM_DSR                      = 0x100\n\tTIOCM_DTR                      = 0x2\n\tTIOCM_LE                       = 0x1\n\tTIOCM_RI                       = 0x80\n\tTIOCM_RNG                      = 0x80\n\tTIOCM_RTS                      = 0x4\n\tTIOCM_SR                       = 0x10\n\tTIOCM_ST                       = 0x8\n\tTIOCNOTTY                      = 0x20007471\n\tTIOCNXCL                       = 0x2000740e\n\tTIOCOUTQ                       = 0x40047473\n\tTIOCPKT                        = 0x80047470\n\tTIOCPKT_DATA                   = 0x0\n\tTIOCPKT_DOSTOP                 = 0x20\n\tTIOCPKT_FLUSHREAD              = 0x1\n\tTIOCPKT_FLUSHWRITE             = 0x2\n\tTIOCPKT_IOCTL                  = 0x40\n\tTIOCPKT_NOSTOP                 = 0x10\n\tTIOCPKT_START                  = 0x8\n\tTIOCPKT_STOP                   = 0x4\n\tTIOCPTMASTER                   = 0x2000741c\n\tTIOCSBRK                       = 0x2000747b\n\tTIOCSCTTY                      = 0x20007461\n\tTIOCSDRAINWAIT                 = 0x80047457\n\tTIOCSDTR                       = 0x20007479\n\tTIOCSETA                       = 0x802c7414\n\tTIOCSETAF                      = 0x802c7416\n\tTIOCSETAW                      = 0x802c7415\n\tTIOCSETD                       = 0x8004741b\n\tTIOCSIG                        = 0x2004745f\n\tTIOCSPGRP                      = 0x80047476\n\tTIOCSTART                      = 0x2000746e\n\tTIOCSTAT                       = 0x20007465\n\tTIOCSTI                        = 0x80017472\n\tTIOCSTOP                       = 0x2000746f\n\tTIOCSWINSZ                     = 0x80087467\n\tTIOCTIMESTAMP                  = 0x40087459\n\tTIOCUCNTL                      = 0x80047466\n\tTOSTOP                         = 0x400000\n\tVDISCARD                       = 0xf\n\tVDSUSP                         = 0xb\n\tVEOF                           = 0x0\n\tVEOL                           = 0x1\n\tVEOL2                          = 0x2\n\tVERASE                         = 0x3\n\tVERASE2                        = 0x7\n\tVINTR                          = 0x8\n\tVKILL                          = 0x5\n\tVLNEXT                         = 0xe\n\tVMIN                           = 0x10\n\tVQUIT                          = 0x9\n\tVREPRINT                       = 0x6\n\tVSTART                         = 0xc\n\tVSTATUS                        = 0x12\n\tVSTOP                          = 0xd\n\tVSUSP                          = 0xa\n\tVTIME                          = 0x11\n\tVWERASE                        = 0x4\n\tWCONTINUED                     = 0x4\n\tWCOREFLAG                      = 0x80\n\tWEXITED                        = 0x10\n\tWLINUXCLONE                    = 0x80000000\n\tWNOHANG                        = 0x1\n\tWNOWAIT                        = 0x8\n\tWSTOPPED                       = 0x2\n\tWTRAPPED                       = 0x20\n\tWUNTRACED                      = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMSG         = syscall.Errno(0x59)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x55)\n\tECAPMODE        = syscall.Errno(0x5e)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOOFUS         = syscall.Errno(0x58)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x52)\n\tEILSEQ          = syscall.Errno(0x56)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x60)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5a)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x57)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x5b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x53)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCAPABLE     = syscall.Errno(0x5d)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTRECOVERABLE = syscall.Errno(0x5f)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEOWNERDEAD      = syscall.Errno(0x60)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x5c)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGLIBRT  = syscall.Signal(0x21)\n\tSIGLWP    = syscall.Signal(0x20)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTHR    = syscall.Signal(0x20)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"operation timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"identifier removed\",\n\t83: \"no message of desired type\",\n\t84: \"value too large to be stored in data type\",\n\t85: \"operation canceled\",\n\t86: \"illegal byte sequence\",\n\t87: \"attribute not found\",\n\t88: \"programming error\",\n\t89: \"bad message\",\n\t90: \"multihop attempted\",\n\t91: \"link has been severed\",\n\t92: \"protocol error\",\n\t93: \"capabilities insufficient\",\n\t94: \"not permitted in capability mode\",\n\t95: \"state not recoverable\",\n\t96: \"previous owner died\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"unknown signal\",\n\t33: \"unknown signal\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go",
    "content": "// mkerrors.sh -m64\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,freebsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                   = 0x10\n\tAF_ARP                         = 0x23\n\tAF_ATM                         = 0x1e\n\tAF_BLUETOOTH                   = 0x24\n\tAF_CCITT                       = 0xa\n\tAF_CHAOS                       = 0x5\n\tAF_CNT                         = 0x15\n\tAF_COIP                        = 0x14\n\tAF_DATAKIT                     = 0x9\n\tAF_DECnet                      = 0xc\n\tAF_DLI                         = 0xd\n\tAF_E164                        = 0x1a\n\tAF_ECMA                        = 0x8\n\tAF_HYLINK                      = 0xf\n\tAF_IEEE80211                   = 0x25\n\tAF_IMPLINK                     = 0x3\n\tAF_INET                        = 0x2\n\tAF_INET6                       = 0x1c\n\tAF_INET6_SDP                   = 0x2a\n\tAF_INET_SDP                    = 0x28\n\tAF_IPX                         = 0x17\n\tAF_ISDN                        = 0x1a\n\tAF_ISO                         = 0x7\n\tAF_LAT                         = 0xe\n\tAF_LINK                        = 0x12\n\tAF_LOCAL                       = 0x1\n\tAF_MAX                         = 0x2a\n\tAF_NATM                        = 0x1d\n\tAF_NETBIOS                     = 0x6\n\tAF_NETGRAPH                    = 0x20\n\tAF_OSI                         = 0x7\n\tAF_PUP                         = 0x4\n\tAF_ROUTE                       = 0x11\n\tAF_SCLUSTER                    = 0x22\n\tAF_SIP                         = 0x18\n\tAF_SLOW                        = 0x21\n\tAF_SNA                         = 0xb\n\tAF_UNIX                        = 0x1\n\tAF_UNSPEC                      = 0x0\n\tAF_VENDOR00                    = 0x27\n\tAF_VENDOR01                    = 0x29\n\tAF_VENDOR02                    = 0x2b\n\tAF_VENDOR03                    = 0x2d\n\tAF_VENDOR04                    = 0x2f\n\tAF_VENDOR05                    = 0x31\n\tAF_VENDOR06                    = 0x33\n\tAF_VENDOR07                    = 0x35\n\tAF_VENDOR08                    = 0x37\n\tAF_VENDOR09                    = 0x39\n\tAF_VENDOR10                    = 0x3b\n\tAF_VENDOR11                    = 0x3d\n\tAF_VENDOR12                    = 0x3f\n\tAF_VENDOR13                    = 0x41\n\tAF_VENDOR14                    = 0x43\n\tAF_VENDOR15                    = 0x45\n\tAF_VENDOR16                    = 0x47\n\tAF_VENDOR17                    = 0x49\n\tAF_VENDOR18                    = 0x4b\n\tAF_VENDOR19                    = 0x4d\n\tAF_VENDOR20                    = 0x4f\n\tAF_VENDOR21                    = 0x51\n\tAF_VENDOR22                    = 0x53\n\tAF_VENDOR23                    = 0x55\n\tAF_VENDOR24                    = 0x57\n\tAF_VENDOR25                    = 0x59\n\tAF_VENDOR26                    = 0x5b\n\tAF_VENDOR27                    = 0x5d\n\tAF_VENDOR28                    = 0x5f\n\tAF_VENDOR29                    = 0x61\n\tAF_VENDOR30                    = 0x63\n\tAF_VENDOR31                    = 0x65\n\tAF_VENDOR32                    = 0x67\n\tAF_VENDOR33                    = 0x69\n\tAF_VENDOR34                    = 0x6b\n\tAF_VENDOR35                    = 0x6d\n\tAF_VENDOR36                    = 0x6f\n\tAF_VENDOR37                    = 0x71\n\tAF_VENDOR38                    = 0x73\n\tAF_VENDOR39                    = 0x75\n\tAF_VENDOR40                    = 0x77\n\tAF_VENDOR41                    = 0x79\n\tAF_VENDOR42                    = 0x7b\n\tAF_VENDOR43                    = 0x7d\n\tAF_VENDOR44                    = 0x7f\n\tAF_VENDOR45                    = 0x81\n\tAF_VENDOR46                    = 0x83\n\tAF_VENDOR47                    = 0x85\n\tALTWERASE                      = 0x200\n\tB0                             = 0x0\n\tB110                           = 0x6e\n\tB115200                        = 0x1c200\n\tB1200                          = 0x4b0\n\tB134                           = 0x86\n\tB14400                         = 0x3840\n\tB150                           = 0x96\n\tB1800                          = 0x708\n\tB19200                         = 0x4b00\n\tB200                           = 0xc8\n\tB230400                        = 0x38400\n\tB2400                          = 0x960\n\tB28800                         = 0x7080\n\tB300                           = 0x12c\n\tB38400                         = 0x9600\n\tB460800                        = 0x70800\n\tB4800                          = 0x12c0\n\tB50                            = 0x32\n\tB57600                         = 0xe100\n\tB600                           = 0x258\n\tB7200                          = 0x1c20\n\tB75                            = 0x4b\n\tB76800                         = 0x12c00\n\tB921600                        = 0xe1000\n\tB9600                          = 0x2580\n\tBIOCFEEDBACK                   = 0x8004427c\n\tBIOCFLUSH                      = 0x20004268\n\tBIOCGBLEN                      = 0x40044266\n\tBIOCGDIRECTION                 = 0x40044276\n\tBIOCGDLT                       = 0x4004426a\n\tBIOCGDLTLIST                   = 0xc0104279\n\tBIOCGETBUFMODE                 = 0x4004427d\n\tBIOCGETIF                      = 0x4020426b\n\tBIOCGETZMAX                    = 0x4008427f\n\tBIOCGHDRCMPLT                  = 0x40044274\n\tBIOCGRSIG                      = 0x40044272\n\tBIOCGRTIMEOUT                  = 0x4010426e\n\tBIOCGSEESENT                   = 0x40044276\n\tBIOCGSTATS                     = 0x4008426f\n\tBIOCGTSTAMP                    = 0x40044283\n\tBIOCIMMEDIATE                  = 0x80044270\n\tBIOCLOCK                       = 0x2000427a\n\tBIOCPROMISC                    = 0x20004269\n\tBIOCROTZBUF                    = 0x40184280\n\tBIOCSBLEN                      = 0xc0044266\n\tBIOCSDIRECTION                 = 0x80044277\n\tBIOCSDLT                       = 0x80044278\n\tBIOCSETBUFMODE                 = 0x8004427e\n\tBIOCSETF                       = 0x80104267\n\tBIOCSETFNR                     = 0x80104282\n\tBIOCSETIF                      = 0x8020426c\n\tBIOCSETWF                      = 0x8010427b\n\tBIOCSETZBUF                    = 0x80184281\n\tBIOCSHDRCMPLT                  = 0x80044275\n\tBIOCSRSIG                      = 0x80044273\n\tBIOCSRTIMEOUT                  = 0x8010426d\n\tBIOCSSEESENT                   = 0x80044277\n\tBIOCSTSTAMP                    = 0x80044284\n\tBIOCVERSION                    = 0x40044271\n\tBPF_A                          = 0x10\n\tBPF_ABS                        = 0x20\n\tBPF_ADD                        = 0x0\n\tBPF_ALIGNMENT                  = 0x8\n\tBPF_ALU                        = 0x4\n\tBPF_AND                        = 0x50\n\tBPF_B                          = 0x10\n\tBPF_BUFMODE_BUFFER             = 0x1\n\tBPF_BUFMODE_ZBUF               = 0x2\n\tBPF_DIV                        = 0x30\n\tBPF_H                          = 0x8\n\tBPF_IMM                        = 0x0\n\tBPF_IND                        = 0x40\n\tBPF_JA                         = 0x0\n\tBPF_JEQ                        = 0x10\n\tBPF_JGE                        = 0x30\n\tBPF_JGT                        = 0x20\n\tBPF_JMP                        = 0x5\n\tBPF_JSET                       = 0x40\n\tBPF_K                          = 0x0\n\tBPF_LD                         = 0x0\n\tBPF_LDX                        = 0x1\n\tBPF_LEN                        = 0x80\n\tBPF_LSH                        = 0x60\n\tBPF_MAJOR_VERSION              = 0x1\n\tBPF_MAXBUFSIZE                 = 0x80000\n\tBPF_MAXINSNS                   = 0x200\n\tBPF_MEM                        = 0x60\n\tBPF_MEMWORDS                   = 0x10\n\tBPF_MINBUFSIZE                 = 0x20\n\tBPF_MINOR_VERSION              = 0x1\n\tBPF_MISC                       = 0x7\n\tBPF_MOD                        = 0x90\n\tBPF_MSH                        = 0xa0\n\tBPF_MUL                        = 0x20\n\tBPF_NEG                        = 0x80\n\tBPF_OR                         = 0x40\n\tBPF_RELEASE                    = 0x30bb6\n\tBPF_RET                        = 0x6\n\tBPF_RSH                        = 0x70\n\tBPF_ST                         = 0x2\n\tBPF_STX                        = 0x3\n\tBPF_SUB                        = 0x10\n\tBPF_TAX                        = 0x0\n\tBPF_TXA                        = 0x80\n\tBPF_T_BINTIME                  = 0x2\n\tBPF_T_BINTIME_FAST             = 0x102\n\tBPF_T_BINTIME_MONOTONIC        = 0x202\n\tBPF_T_BINTIME_MONOTONIC_FAST   = 0x302\n\tBPF_T_FAST                     = 0x100\n\tBPF_T_FLAG_MASK                = 0x300\n\tBPF_T_FORMAT_MASK              = 0x3\n\tBPF_T_MICROTIME                = 0x0\n\tBPF_T_MICROTIME_FAST           = 0x100\n\tBPF_T_MICROTIME_MONOTONIC      = 0x200\n\tBPF_T_MICROTIME_MONOTONIC_FAST = 0x300\n\tBPF_T_MONOTONIC                = 0x200\n\tBPF_T_MONOTONIC_FAST           = 0x300\n\tBPF_T_NANOTIME                 = 0x1\n\tBPF_T_NANOTIME_FAST            = 0x101\n\tBPF_T_NANOTIME_MONOTONIC       = 0x201\n\tBPF_T_NANOTIME_MONOTONIC_FAST  = 0x301\n\tBPF_T_NONE                     = 0x3\n\tBPF_T_NORMAL                   = 0x0\n\tBPF_W                          = 0x0\n\tBPF_X                          = 0x8\n\tBPF_XOR                        = 0xa0\n\tBRKINT                         = 0x2\n\tCAP_ACCEPT                     = 0x200000020000000\n\tCAP_ACL_CHECK                  = 0x400000000010000\n\tCAP_ACL_DELETE                 = 0x400000000020000\n\tCAP_ACL_GET                    = 0x400000000040000\n\tCAP_ACL_SET                    = 0x400000000080000\n\tCAP_ALL0                       = 0x20007ffffffffff\n\tCAP_ALL1                       = 0x4000000001fffff\n\tCAP_BIND                       = 0x200000040000000\n\tCAP_BINDAT                     = 0x200008000000400\n\tCAP_CHFLAGSAT                  = 0x200000000001400\n\tCAP_CONNECT                    = 0x200000080000000\n\tCAP_CONNECTAT                  = 0x200010000000400\n\tCAP_CREATE                     = 0x200000000000040\n\tCAP_EVENT                      = 0x400000000000020\n\tCAP_EXTATTR_DELETE             = 0x400000000001000\n\tCAP_EXTATTR_GET                = 0x400000000002000\n\tCAP_EXTATTR_LIST               = 0x400000000004000\n\tCAP_EXTATTR_SET                = 0x400000000008000\n\tCAP_FCHDIR                     = 0x200000000000800\n\tCAP_FCHFLAGS                   = 0x200000000001000\n\tCAP_FCHMOD                     = 0x200000000002000\n\tCAP_FCHMODAT                   = 0x200000000002400\n\tCAP_FCHOWN                     = 0x200000000004000\n\tCAP_FCHOWNAT                   = 0x200000000004400\n\tCAP_FCNTL                      = 0x200000000008000\n\tCAP_FCNTL_ALL                  = 0x78\n\tCAP_FCNTL_GETFL                = 0x8\n\tCAP_FCNTL_GETOWN               = 0x20\n\tCAP_FCNTL_SETFL                = 0x10\n\tCAP_FCNTL_SETOWN               = 0x40\n\tCAP_FEXECVE                    = 0x200000000000080\n\tCAP_FLOCK                      = 0x200000000010000\n\tCAP_FPATHCONF                  = 0x200000000020000\n\tCAP_FSCK                       = 0x200000000040000\n\tCAP_FSTAT                      = 0x200000000080000\n\tCAP_FSTATAT                    = 0x200000000080400\n\tCAP_FSTATFS                    = 0x200000000100000\n\tCAP_FSYNC                      = 0x200000000000100\n\tCAP_FTRUNCATE                  = 0x200000000000200\n\tCAP_FUTIMES                    = 0x200000000200000\n\tCAP_FUTIMESAT                  = 0x200000000200400\n\tCAP_GETPEERNAME                = 0x200000100000000\n\tCAP_GETSOCKNAME                = 0x200000200000000\n\tCAP_GETSOCKOPT                 = 0x200000400000000\n\tCAP_IOCTL                      = 0x400000000000080\n\tCAP_IOCTLS_ALL                 = 0x7fffffffffffffff\n\tCAP_KQUEUE                     = 0x400000000100040\n\tCAP_KQUEUE_CHANGE              = 0x400000000100000\n\tCAP_KQUEUE_EVENT               = 0x400000000000040\n\tCAP_LINKAT_SOURCE              = 0x200020000000400\n\tCAP_LINKAT_TARGET              = 0x200000000400400\n\tCAP_LISTEN                     = 0x200000800000000\n\tCAP_LOOKUP                     = 0x200000000000400\n\tCAP_MAC_GET                    = 0x400000000000001\n\tCAP_MAC_SET                    = 0x400000000000002\n\tCAP_MKDIRAT                    = 0x200000000800400\n\tCAP_MKFIFOAT                   = 0x200000001000400\n\tCAP_MKNODAT                    = 0x200000002000400\n\tCAP_MMAP                       = 0x200000000000010\n\tCAP_MMAP_R                     = 0x20000000000001d\n\tCAP_MMAP_RW                    = 0x20000000000001f\n\tCAP_MMAP_RWX                   = 0x20000000000003f\n\tCAP_MMAP_RX                    = 0x20000000000003d\n\tCAP_MMAP_W                     = 0x20000000000001e\n\tCAP_MMAP_WX                    = 0x20000000000003e\n\tCAP_MMAP_X                     = 0x20000000000003c\n\tCAP_PDGETPID                   = 0x400000000000200\n\tCAP_PDKILL                     = 0x400000000000800\n\tCAP_PDWAIT                     = 0x400000000000400\n\tCAP_PEELOFF                    = 0x200001000000000\n\tCAP_POLL_EVENT                 = 0x400000000000020\n\tCAP_PREAD                      = 0x20000000000000d\n\tCAP_PWRITE                     = 0x20000000000000e\n\tCAP_READ                       = 0x200000000000001\n\tCAP_RECV                       = 0x200000000000001\n\tCAP_RENAMEAT_SOURCE            = 0x200000004000400\n\tCAP_RENAMEAT_TARGET            = 0x200040000000400\n\tCAP_RIGHTS_VERSION             = 0x0\n\tCAP_RIGHTS_VERSION_00          = 0x0\n\tCAP_SEEK                       = 0x20000000000000c\n\tCAP_SEEK_TELL                  = 0x200000000000004\n\tCAP_SEM_GETVALUE               = 0x400000000000004\n\tCAP_SEM_POST                   = 0x400000000000008\n\tCAP_SEM_WAIT                   = 0x400000000000010\n\tCAP_SEND                       = 0x200000000000002\n\tCAP_SETSOCKOPT                 = 0x200002000000000\n\tCAP_SHUTDOWN                   = 0x200004000000000\n\tCAP_SOCK_CLIENT                = 0x200007780000003\n\tCAP_SOCK_SERVER                = 0x200007f60000003\n\tCAP_SYMLINKAT                  = 0x200000008000400\n\tCAP_TTYHOOK                    = 0x400000000000100\n\tCAP_UNLINKAT                   = 0x200000010000400\n\tCAP_UNUSED0_44                 = 0x200080000000000\n\tCAP_UNUSED0_57                 = 0x300000000000000\n\tCAP_UNUSED1_22                 = 0x400000000200000\n\tCAP_UNUSED1_57                 = 0x500000000000000\n\tCAP_WRITE                      = 0x200000000000002\n\tCFLUSH                         = 0xf\n\tCLOCAL                         = 0x8000\n\tCLOCK_MONOTONIC                = 0x4\n\tCLOCK_MONOTONIC_FAST           = 0xc\n\tCLOCK_MONOTONIC_PRECISE        = 0xb\n\tCLOCK_PROCESS_CPUTIME_ID       = 0xf\n\tCLOCK_PROF                     = 0x2\n\tCLOCK_REALTIME                 = 0x0\n\tCLOCK_REALTIME_FAST            = 0xa\n\tCLOCK_REALTIME_PRECISE         = 0x9\n\tCLOCK_SECOND                   = 0xd\n\tCLOCK_THREAD_CPUTIME_ID        = 0xe\n\tCLOCK_UPTIME                   = 0x5\n\tCLOCK_UPTIME_FAST              = 0x8\n\tCLOCK_UPTIME_PRECISE           = 0x7\n\tCLOCK_VIRTUAL                  = 0x1\n\tCREAD                          = 0x800\n\tCRTSCTS                        = 0x30000\n\tCS5                            = 0x0\n\tCS6                            = 0x100\n\tCS7                            = 0x200\n\tCS8                            = 0x300\n\tCSIZE                          = 0x300\n\tCSTART                         = 0x11\n\tCSTATUS                        = 0x14\n\tCSTOP                          = 0x13\n\tCSTOPB                         = 0x400\n\tCSUSP                          = 0x1a\n\tCTL_MAXNAME                    = 0x18\n\tCTL_NET                        = 0x4\n\tDLT_A429                       = 0xb8\n\tDLT_A653_ICM                   = 0xb9\n\tDLT_AIRONET_HEADER             = 0x78\n\tDLT_AOS                        = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394     = 0x8a\n\tDLT_ARCNET                     = 0x7\n\tDLT_ARCNET_LINUX               = 0x81\n\tDLT_ATM_CLIP                   = 0x13\n\tDLT_ATM_RFC1483                = 0xb\n\tDLT_AURORA                     = 0x7e\n\tDLT_AX25                       = 0x3\n\tDLT_AX25_KISS                  = 0xca\n\tDLT_BACNET_MS_TP               = 0xa5\n\tDLT_BLUETOOTH_BREDR_BB         = 0xff\n\tDLT_BLUETOOTH_HCI_H4           = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9\n\tDLT_BLUETOOTH_LE_LL            = 0xfb\n\tDLT_BLUETOOTH_LE_LL_WITH_PHDR  = 0x100\n\tDLT_BLUETOOTH_LINUX_MONITOR    = 0xfe\n\tDLT_CAN20B                     = 0xbe\n\tDLT_CAN_SOCKETCAN              = 0xe3\n\tDLT_CHAOS                      = 0x5\n\tDLT_CHDLC                      = 0x68\n\tDLT_CISCO_IOS                  = 0x76\n\tDLT_C_HDLC                     = 0x68\n\tDLT_C_HDLC_WITH_DIR            = 0xcd\n\tDLT_DBUS                       = 0xe7\n\tDLT_DECT                       = 0xdd\n\tDLT_DOCSIS                     = 0x8f\n\tDLT_DVB_CI                     = 0xeb\n\tDLT_ECONET                     = 0x73\n\tDLT_EN10MB                     = 0x1\n\tDLT_EN3MB                      = 0x2\n\tDLT_ENC                        = 0x6d\n\tDLT_EPON                       = 0x103\n\tDLT_ERF                        = 0xc5\n\tDLT_ERF_ETH                    = 0xaf\n\tDLT_ERF_POS                    = 0xb0\n\tDLT_FC_2                       = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS     = 0xe1\n\tDLT_FDDI                       = 0xa\n\tDLT_FLEXRAY                    = 0xd2\n\tDLT_FRELAY                     = 0x6b\n\tDLT_FRELAY_WITH_DIR            = 0xce\n\tDLT_GCOM_SERIAL                = 0xad\n\tDLT_GCOM_T1E1                  = 0xac\n\tDLT_GPF_F                      = 0xab\n\tDLT_GPF_T                      = 0xaa\n\tDLT_GPRS_LLC                   = 0xa9\n\tDLT_GSMTAP_ABIS                = 0xda\n\tDLT_GSMTAP_UM                  = 0xd9\n\tDLT_HHDLC                      = 0x79\n\tDLT_IBM_SN                     = 0x92\n\tDLT_IBM_SP                     = 0x91\n\tDLT_IEEE802                    = 0x6\n\tDLT_IEEE802_11                 = 0x69\n\tDLT_IEEE802_11_RADIO           = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS       = 0xa3\n\tDLT_IEEE802_15_4               = 0xc3\n\tDLT_IEEE802_15_4_LINUX         = 0xbf\n\tDLT_IEEE802_15_4_NOFCS         = 0xe6\n\tDLT_IEEE802_15_4_NONASK_PHY    = 0xd7\n\tDLT_IEEE802_16_MAC_CPS         = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO   = 0xc1\n\tDLT_INFINIBAND                 = 0xf7\n\tDLT_IPFILTER                   = 0x74\n\tDLT_IPMB                       = 0xc7\n\tDLT_IPMB_LINUX                 = 0xd1\n\tDLT_IPMI_HPM_2                 = 0x104\n\tDLT_IPNET                      = 0xe2\n\tDLT_IPOIB                      = 0xf2\n\tDLT_IPV4                       = 0xe4\n\tDLT_IPV6                       = 0xe5\n\tDLT_IP_OVER_FC                 = 0x7a\n\tDLT_JUNIPER_ATM1               = 0x89\n\tDLT_JUNIPER_ATM2               = 0x87\n\tDLT_JUNIPER_ATM_CEMIC          = 0xee\n\tDLT_JUNIPER_CHDLC              = 0xb5\n\tDLT_JUNIPER_ES                 = 0x84\n\tDLT_JUNIPER_ETHER              = 0xb2\n\tDLT_JUNIPER_FIBRECHANNEL       = 0xea\n\tDLT_JUNIPER_FRELAY             = 0xb4\n\tDLT_JUNIPER_GGSN               = 0x85\n\tDLT_JUNIPER_ISM                = 0xc2\n\tDLT_JUNIPER_MFR                = 0x86\n\tDLT_JUNIPER_MLFR               = 0x83\n\tDLT_JUNIPER_MLPPP              = 0x82\n\tDLT_JUNIPER_MONITOR            = 0xa4\n\tDLT_JUNIPER_PIC_PEER           = 0xae\n\tDLT_JUNIPER_PPP                = 0xb3\n\tDLT_JUNIPER_PPPOE              = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM          = 0xa8\n\tDLT_JUNIPER_SERVICES           = 0x88\n\tDLT_JUNIPER_SRX_E2E            = 0xe9\n\tDLT_JUNIPER_ST                 = 0xc8\n\tDLT_JUNIPER_VP                 = 0xb7\n\tDLT_JUNIPER_VS                 = 0xe8\n\tDLT_LAPB_WITH_DIR              = 0xcf\n\tDLT_LAPD                       = 0xcb\n\tDLT_LIN                        = 0xd4\n\tDLT_LINUX_EVDEV                = 0xd8\n\tDLT_LINUX_IRDA                 = 0x90\n\tDLT_LINUX_LAPD                 = 0xb1\n\tDLT_LINUX_PPP_WITHDIRECTION    = 0xa6\n\tDLT_LINUX_SLL                  = 0x71\n\tDLT_LOOP                       = 0x6c\n\tDLT_LTALK                      = 0x72\n\tDLT_MATCHING_MAX               = 0x104\n\tDLT_MATCHING_MIN               = 0x68\n\tDLT_MFR                        = 0xb6\n\tDLT_MOST                       = 0xd3\n\tDLT_MPEG_2_TS                  = 0xf3\n\tDLT_MPLS                       = 0xdb\n\tDLT_MTP2                       = 0x8c\n\tDLT_MTP2_WITH_PHDR             = 0x8b\n\tDLT_MTP3                       = 0x8d\n\tDLT_MUX27010                   = 0xec\n\tDLT_NETANALYZER                = 0xf0\n\tDLT_NETANALYZER_TRANSPARENT    = 0xf1\n\tDLT_NETLINK                    = 0xfd\n\tDLT_NFC_LLCP                   = 0xf5\n\tDLT_NFLOG                      = 0xef\n\tDLT_NG40                       = 0xf4\n\tDLT_NULL                       = 0x0\n\tDLT_PCI_EXP                    = 0x7d\n\tDLT_PFLOG                      = 0x75\n\tDLT_PFSYNC                     = 0x79\n\tDLT_PKTAP                      = 0x102\n\tDLT_PPI                        = 0xc0\n\tDLT_PPP                        = 0x9\n\tDLT_PPP_BSDOS                  = 0x10\n\tDLT_PPP_ETHER                  = 0x33\n\tDLT_PPP_PPPD                   = 0xa6\n\tDLT_PPP_SERIAL                 = 0x32\n\tDLT_PPP_WITH_DIR               = 0xcc\n\tDLT_PPP_WITH_DIRECTION         = 0xa6\n\tDLT_PRISM_HEADER               = 0x77\n\tDLT_PROFIBUS_DL                = 0x101\n\tDLT_PRONET                     = 0x4\n\tDLT_RAIF1                      = 0xc6\n\tDLT_RAW                        = 0xc\n\tDLT_RIO                        = 0x7c\n\tDLT_RTAC_SERIAL                = 0xfa\n\tDLT_SCCP                       = 0x8e\n\tDLT_SCTP                       = 0xf8\n\tDLT_SITA                       = 0xc4\n\tDLT_SLIP                       = 0x8\n\tDLT_SLIP_BSDOS                 = 0xf\n\tDLT_STANAG_5066_D_PDU          = 0xed\n\tDLT_SUNATM                     = 0x7b\n\tDLT_SYMANTEC_FIREWALL          = 0x63\n\tDLT_TZSP                       = 0x80\n\tDLT_USB                        = 0xba\n\tDLT_USBPCAP                    = 0xf9\n\tDLT_USB_LINUX                  = 0xbd\n\tDLT_USB_LINUX_MMAPPED          = 0xdc\n\tDLT_USER0                      = 0x93\n\tDLT_USER1                      = 0x94\n\tDLT_USER10                     = 0x9d\n\tDLT_USER11                     = 0x9e\n\tDLT_USER12                     = 0x9f\n\tDLT_USER13                     = 0xa0\n\tDLT_USER14                     = 0xa1\n\tDLT_USER15                     = 0xa2\n\tDLT_USER2                      = 0x95\n\tDLT_USER3                      = 0x96\n\tDLT_USER4                      = 0x97\n\tDLT_USER5                      = 0x98\n\tDLT_USER6                      = 0x99\n\tDLT_USER7                      = 0x9a\n\tDLT_USER8                      = 0x9b\n\tDLT_USER9                      = 0x9c\n\tDLT_WIHART                     = 0xdf\n\tDLT_WIRESHARK_UPPER_PDU        = 0xfc\n\tDLT_X2E_SERIAL                 = 0xd5\n\tDLT_X2E_XORAYA                 = 0xd6\n\tDT_BLK                         = 0x6\n\tDT_CHR                         = 0x2\n\tDT_DIR                         = 0x4\n\tDT_FIFO                        = 0x1\n\tDT_LNK                         = 0xa\n\tDT_REG                         = 0x8\n\tDT_SOCK                        = 0xc\n\tDT_UNKNOWN                     = 0x0\n\tDT_WHT                         = 0xe\n\tECHO                           = 0x8\n\tECHOCTL                        = 0x40\n\tECHOE                          = 0x2\n\tECHOK                          = 0x4\n\tECHOKE                         = 0x1\n\tECHONL                         = 0x10\n\tECHOPRT                        = 0x20\n\tEVFILT_AIO                     = -0x3\n\tEVFILT_FS                      = -0x9\n\tEVFILT_LIO                     = -0xa\n\tEVFILT_PROC                    = -0x5\n\tEVFILT_PROCDESC                = -0x8\n\tEVFILT_READ                    = -0x1\n\tEVFILT_SENDFILE                = -0xc\n\tEVFILT_SIGNAL                  = -0x6\n\tEVFILT_SYSCOUNT                = 0xc\n\tEVFILT_TIMER                   = -0x7\n\tEVFILT_USER                    = -0xb\n\tEVFILT_VNODE                   = -0x4\n\tEVFILT_WRITE                   = -0x2\n\tEV_ADD                         = 0x1\n\tEV_CLEAR                       = 0x20\n\tEV_DELETE                      = 0x2\n\tEV_DISABLE                     = 0x8\n\tEV_DISPATCH                    = 0x80\n\tEV_DROP                        = 0x1000\n\tEV_ENABLE                      = 0x4\n\tEV_EOF                         = 0x8000\n\tEV_ERROR                       = 0x4000\n\tEV_FLAG1                       = 0x2000\n\tEV_FLAG2                       = 0x4000\n\tEV_FORCEONESHOT                = 0x100\n\tEV_ONESHOT                     = 0x10\n\tEV_RECEIPT                     = 0x40\n\tEV_SYSFLAGS                    = 0xf000\n\tEXTA                           = 0x4b00\n\tEXTATTR_NAMESPACE_EMPTY        = 0x0\n\tEXTATTR_NAMESPACE_SYSTEM       = 0x2\n\tEXTATTR_NAMESPACE_USER         = 0x1\n\tEXTB                           = 0x9600\n\tEXTPROC                        = 0x800\n\tFD_CLOEXEC                     = 0x1\n\tFD_SETSIZE                     = 0x400\n\tFLUSHO                         = 0x800000\n\tF_CANCEL                       = 0x5\n\tF_DUP2FD                       = 0xa\n\tF_DUP2FD_CLOEXEC               = 0x12\n\tF_DUPFD                        = 0x0\n\tF_DUPFD_CLOEXEC                = 0x11\n\tF_GETFD                        = 0x1\n\tF_GETFL                        = 0x3\n\tF_GETLK                        = 0xb\n\tF_GETOWN                       = 0x5\n\tF_OGETLK                       = 0x7\n\tF_OK                           = 0x0\n\tF_OSETLK                       = 0x8\n\tF_OSETLKW                      = 0x9\n\tF_RDAHEAD                      = 0x10\n\tF_RDLCK                        = 0x1\n\tF_READAHEAD                    = 0xf\n\tF_SETFD                        = 0x2\n\tF_SETFL                        = 0x4\n\tF_SETLK                        = 0xc\n\tF_SETLKW                       = 0xd\n\tF_SETLK_REMOTE                 = 0xe\n\tF_SETOWN                       = 0x6\n\tF_UNLCK                        = 0x2\n\tF_UNLCKSYS                     = 0x4\n\tF_WRLCK                        = 0x3\n\tHUPCL                          = 0x4000\n\tICANON                         = 0x100\n\tICMP6_FILTER                   = 0x12\n\tICRNL                          = 0x100\n\tIEXTEN                         = 0x400\n\tIFAN_ARRIVAL                   = 0x0\n\tIFAN_DEPARTURE                 = 0x1\n\tIFF_ALLMULTI                   = 0x200\n\tIFF_ALTPHYS                    = 0x4000\n\tIFF_BROADCAST                  = 0x2\n\tIFF_CANTCHANGE                 = 0x218f52\n\tIFF_CANTCONFIG                 = 0x10000\n\tIFF_DEBUG                      = 0x4\n\tIFF_DRV_OACTIVE                = 0x400\n\tIFF_DRV_RUNNING                = 0x40\n\tIFF_DYING                      = 0x200000\n\tIFF_LINK0                      = 0x1000\n\tIFF_LINK1                      = 0x2000\n\tIFF_LINK2                      = 0x4000\n\tIFF_LOOPBACK                   = 0x8\n\tIFF_MONITOR                    = 0x40000\n\tIFF_MULTICAST                  = 0x8000\n\tIFF_NOARP                      = 0x80\n\tIFF_OACTIVE                    = 0x400\n\tIFF_POINTOPOINT                = 0x10\n\tIFF_PPROMISC                   = 0x20000\n\tIFF_PROMISC                    = 0x100\n\tIFF_RENAMING                   = 0x400000\n\tIFF_RUNNING                    = 0x40\n\tIFF_SIMPLEX                    = 0x800\n\tIFF_STATICARP                  = 0x80000\n\tIFF_UP                         = 0x1\n\tIFNAMSIZ                       = 0x10\n\tIFT_BRIDGE                     = 0xd1\n\tIFT_CARP                       = 0xf8\n\tIFT_IEEE1394                   = 0x90\n\tIFT_INFINIBAND                 = 0xc7\n\tIFT_L2VLAN                     = 0x87\n\tIFT_L3IPVLAN                   = 0x88\n\tIFT_PPP                        = 0x17\n\tIFT_PROPVIRTUAL                = 0x35\n\tIGNBRK                         = 0x1\n\tIGNCR                          = 0x80\n\tIGNPAR                         = 0x4\n\tIMAXBEL                        = 0x2000\n\tINLCR                          = 0x40\n\tINPCK                          = 0x10\n\tIN_CLASSA_HOST                 = 0xffffff\n\tIN_CLASSA_MAX                  = 0x80\n\tIN_CLASSA_NET                  = 0xff000000\n\tIN_CLASSA_NSHIFT               = 0x18\n\tIN_CLASSB_HOST                 = 0xffff\n\tIN_CLASSB_MAX                  = 0x10000\n\tIN_CLASSB_NET                  = 0xffff0000\n\tIN_CLASSB_NSHIFT               = 0x10\n\tIN_CLASSC_HOST                 = 0xff\n\tIN_CLASSC_NET                  = 0xffffff00\n\tIN_CLASSC_NSHIFT               = 0x8\n\tIN_CLASSD_HOST                 = 0xfffffff\n\tIN_CLASSD_NET                  = 0xf0000000\n\tIN_CLASSD_NSHIFT               = 0x1c\n\tIN_LOOPBACKNET                 = 0x7f\n\tIN_RFC3021_MASK                = 0xfffffffe\n\tIPPROTO_3PC                    = 0x22\n\tIPPROTO_ADFS                   = 0x44\n\tIPPROTO_AH                     = 0x33\n\tIPPROTO_AHIP                   = 0x3d\n\tIPPROTO_APES                   = 0x63\n\tIPPROTO_ARGUS                  = 0xd\n\tIPPROTO_AX25                   = 0x5d\n\tIPPROTO_BHA                    = 0x31\n\tIPPROTO_BLT                    = 0x1e\n\tIPPROTO_BRSATMON               = 0x4c\n\tIPPROTO_CARP                   = 0x70\n\tIPPROTO_CFTP                   = 0x3e\n\tIPPROTO_CHAOS                  = 0x10\n\tIPPROTO_CMTP                   = 0x26\n\tIPPROTO_CPHB                   = 0x49\n\tIPPROTO_CPNX                   = 0x48\n\tIPPROTO_DDP                    = 0x25\n\tIPPROTO_DGP                    = 0x56\n\tIPPROTO_DIVERT                 = 0x102\n\tIPPROTO_DONE                   = 0x101\n\tIPPROTO_DSTOPTS                = 0x3c\n\tIPPROTO_EGP                    = 0x8\n\tIPPROTO_EMCON                  = 0xe\n\tIPPROTO_ENCAP                  = 0x62\n\tIPPROTO_EON                    = 0x50\n\tIPPROTO_ESP                    = 0x32\n\tIPPROTO_ETHERIP                = 0x61\n\tIPPROTO_FRAGMENT               = 0x2c\n\tIPPROTO_GGP                    = 0x3\n\tIPPROTO_GMTP                   = 0x64\n\tIPPROTO_GRE                    = 0x2f\n\tIPPROTO_HELLO                  = 0x3f\n\tIPPROTO_HIP                    = 0x8b\n\tIPPROTO_HMP                    = 0x14\n\tIPPROTO_HOPOPTS                = 0x0\n\tIPPROTO_ICMP                   = 0x1\n\tIPPROTO_ICMPV6                 = 0x3a\n\tIPPROTO_IDP                    = 0x16\n\tIPPROTO_IDPR                   = 0x23\n\tIPPROTO_IDRP                   = 0x2d\n\tIPPROTO_IGMP                   = 0x2\n\tIPPROTO_IGP                    = 0x55\n\tIPPROTO_IGRP                   = 0x58\n\tIPPROTO_IL                     = 0x28\n\tIPPROTO_INLSP                  = 0x34\n\tIPPROTO_INP                    = 0x20\n\tIPPROTO_IP                     = 0x0\n\tIPPROTO_IPCOMP                 = 0x6c\n\tIPPROTO_IPCV                   = 0x47\n\tIPPROTO_IPEIP                  = 0x5e\n\tIPPROTO_IPIP                   = 0x4\n\tIPPROTO_IPPC                   = 0x43\n\tIPPROTO_IPV4                   = 0x4\n\tIPPROTO_IPV6                   = 0x29\n\tIPPROTO_IRTP                   = 0x1c\n\tIPPROTO_KRYPTOLAN              = 0x41\n\tIPPROTO_LARP                   = 0x5b\n\tIPPROTO_LEAF1                  = 0x19\n\tIPPROTO_LEAF2                  = 0x1a\n\tIPPROTO_MAX                    = 0x100\n\tIPPROTO_MEAS                   = 0x13\n\tIPPROTO_MH                     = 0x87\n\tIPPROTO_MHRP                   = 0x30\n\tIPPROTO_MICP                   = 0x5f\n\tIPPROTO_MOBILE                 = 0x37\n\tIPPROTO_MPLS                   = 0x89\n\tIPPROTO_MTP                    = 0x5c\n\tIPPROTO_MUX                    = 0x12\n\tIPPROTO_ND                     = 0x4d\n\tIPPROTO_NHRP                   = 0x36\n\tIPPROTO_NONE                   = 0x3b\n\tIPPROTO_NSP                    = 0x1f\n\tIPPROTO_NVPII                  = 0xb\n\tIPPROTO_OLD_DIVERT             = 0xfe\n\tIPPROTO_OSPFIGP                = 0x59\n\tIPPROTO_PFSYNC                 = 0xf0\n\tIPPROTO_PGM                    = 0x71\n\tIPPROTO_PIGP                   = 0x9\n\tIPPROTO_PIM                    = 0x67\n\tIPPROTO_PRM                    = 0x15\n\tIPPROTO_PUP                    = 0xc\n\tIPPROTO_PVP                    = 0x4b\n\tIPPROTO_RAW                    = 0xff\n\tIPPROTO_RCCMON                 = 0xa\n\tIPPROTO_RDP                    = 0x1b\n\tIPPROTO_RESERVED_253           = 0xfd\n\tIPPROTO_RESERVED_254           = 0xfe\n\tIPPROTO_ROUTING                = 0x2b\n\tIPPROTO_RSVP                   = 0x2e\n\tIPPROTO_RVD                    = 0x42\n\tIPPROTO_SATEXPAK               = 0x40\n\tIPPROTO_SATMON                 = 0x45\n\tIPPROTO_SCCSP                  = 0x60\n\tIPPROTO_SCTP                   = 0x84\n\tIPPROTO_SDRP                   = 0x2a\n\tIPPROTO_SEND                   = 0x103\n\tIPPROTO_SEP                    = 0x21\n\tIPPROTO_SHIM6                  = 0x8c\n\tIPPROTO_SKIP                   = 0x39\n\tIPPROTO_SPACER                 = 0x7fff\n\tIPPROTO_SRPC                   = 0x5a\n\tIPPROTO_ST                     = 0x7\n\tIPPROTO_SVMTP                  = 0x52\n\tIPPROTO_SWIPE                  = 0x35\n\tIPPROTO_TCF                    = 0x57\n\tIPPROTO_TCP                    = 0x6\n\tIPPROTO_TLSP                   = 0x38\n\tIPPROTO_TP                     = 0x1d\n\tIPPROTO_TPXX                   = 0x27\n\tIPPROTO_TRUNK1                 = 0x17\n\tIPPROTO_TRUNK2                 = 0x18\n\tIPPROTO_TTP                    = 0x54\n\tIPPROTO_UDP                    = 0x11\n\tIPPROTO_UDPLITE                = 0x88\n\tIPPROTO_VINES                  = 0x53\n\tIPPROTO_VISA                   = 0x46\n\tIPPROTO_VMTP                   = 0x51\n\tIPPROTO_WBEXPAK                = 0x4f\n\tIPPROTO_WBMON                  = 0x4e\n\tIPPROTO_WSN                    = 0x4a\n\tIPPROTO_XNET                   = 0xf\n\tIPPROTO_XTP                    = 0x24\n\tIPV6_AUTOFLOWLABEL             = 0x3b\n\tIPV6_BINDANY                   = 0x40\n\tIPV6_BINDMULTI                 = 0x41\n\tIPV6_BINDV6ONLY                = 0x1b\n\tIPV6_CHECKSUM                  = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS    = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP    = 0x1\n\tIPV6_DEFHLIM                   = 0x40\n\tIPV6_DONTFRAG                  = 0x3e\n\tIPV6_DSTOPTS                   = 0x32\n\tIPV6_FLOWID                    = 0x43\n\tIPV6_FLOWINFO_MASK             = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK            = 0xffff0f00\n\tIPV6_FLOWTYPE                  = 0x44\n\tIPV6_FRAGTTL                   = 0x78\n\tIPV6_FW_ADD                    = 0x1e\n\tIPV6_FW_DEL                    = 0x1f\n\tIPV6_FW_FLUSH                  = 0x20\n\tIPV6_FW_GET                    = 0x22\n\tIPV6_FW_ZERO                   = 0x21\n\tIPV6_HLIMDEC                   = 0x1\n\tIPV6_HOPLIMIT                  = 0x2f\n\tIPV6_HOPOPTS                   = 0x31\n\tIPV6_IPSEC_POLICY              = 0x1c\n\tIPV6_JOIN_GROUP                = 0xc\n\tIPV6_LEAVE_GROUP               = 0xd\n\tIPV6_MAXHLIM                   = 0xff\n\tIPV6_MAXOPTHDR                 = 0x800\n\tIPV6_MAXPACKET                 = 0xffff\n\tIPV6_MAX_GROUP_SRC_FILTER      = 0x200\n\tIPV6_MAX_MEMBERSHIPS           = 0xfff\n\tIPV6_MAX_SOCK_SRC_FILTER       = 0x80\n\tIPV6_MIN_MEMBERSHIPS           = 0x1f\n\tIPV6_MMTU                      = 0x500\n\tIPV6_MSFILTER                  = 0x4a\n\tIPV6_MULTICAST_HOPS            = 0xa\n\tIPV6_MULTICAST_IF              = 0x9\n\tIPV6_MULTICAST_LOOP            = 0xb\n\tIPV6_NEXTHOP                   = 0x30\n\tIPV6_PATHMTU                   = 0x2c\n\tIPV6_PKTINFO                   = 0x2e\n\tIPV6_PORTRANGE                 = 0xe\n\tIPV6_PORTRANGE_DEFAULT         = 0x0\n\tIPV6_PORTRANGE_HIGH            = 0x1\n\tIPV6_PORTRANGE_LOW             = 0x2\n\tIPV6_PREFER_TEMPADDR           = 0x3f\n\tIPV6_RECVDSTOPTS               = 0x28\n\tIPV6_RECVFLOWID                = 0x46\n\tIPV6_RECVHOPLIMIT              = 0x25\n\tIPV6_RECVHOPOPTS               = 0x27\n\tIPV6_RECVPATHMTU               = 0x2b\n\tIPV6_RECVPKTINFO               = 0x24\n\tIPV6_RECVRSSBUCKETID           = 0x47\n\tIPV6_RECVRTHDR                 = 0x26\n\tIPV6_RECVTCLASS                = 0x39\n\tIPV6_RSSBUCKETID               = 0x45\n\tIPV6_RSS_LISTEN_BUCKET         = 0x42\n\tIPV6_RTHDR                     = 0x33\n\tIPV6_RTHDRDSTOPTS              = 0x23\n\tIPV6_RTHDR_LOOSE               = 0x0\n\tIPV6_RTHDR_STRICT              = 0x1\n\tIPV6_RTHDR_TYPE_0              = 0x0\n\tIPV6_SOCKOPT_RESERVED1         = 0x3\n\tIPV6_TCLASS                    = 0x3d\n\tIPV6_UNICAST_HOPS              = 0x4\n\tIPV6_USE_MIN_MTU               = 0x2a\n\tIPV6_V6ONLY                    = 0x1b\n\tIPV6_VERSION                   = 0x60\n\tIPV6_VERSION_MASK              = 0xf0\n\tIP_ADD_MEMBERSHIP              = 0xc\n\tIP_ADD_SOURCE_MEMBERSHIP       = 0x46\n\tIP_BINDANY                     = 0x18\n\tIP_BINDMULTI                   = 0x19\n\tIP_BLOCK_SOURCE                = 0x48\n\tIP_DEFAULT_MULTICAST_LOOP      = 0x1\n\tIP_DEFAULT_MULTICAST_TTL       = 0x1\n\tIP_DF                          = 0x4000\n\tIP_DONTFRAG                    = 0x43\n\tIP_DROP_MEMBERSHIP             = 0xd\n\tIP_DROP_SOURCE_MEMBERSHIP      = 0x47\n\tIP_DUMMYNET3                   = 0x31\n\tIP_DUMMYNET_CONFIGURE          = 0x3c\n\tIP_DUMMYNET_DEL                = 0x3d\n\tIP_DUMMYNET_FLUSH              = 0x3e\n\tIP_DUMMYNET_GET                = 0x40\n\tIP_FLOWID                      = 0x5a\n\tIP_FLOWTYPE                    = 0x5b\n\tIP_FW3                         = 0x30\n\tIP_FW_ADD                      = 0x32\n\tIP_FW_DEL                      = 0x33\n\tIP_FW_FLUSH                    = 0x34\n\tIP_FW_GET                      = 0x36\n\tIP_FW_NAT_CFG                  = 0x38\n\tIP_FW_NAT_DEL                  = 0x39\n\tIP_FW_NAT_GET_CONFIG           = 0x3a\n\tIP_FW_NAT_GET_LOG              = 0x3b\n\tIP_FW_RESETLOG                 = 0x37\n\tIP_FW_TABLE_ADD                = 0x28\n\tIP_FW_TABLE_DEL                = 0x29\n\tIP_FW_TABLE_FLUSH              = 0x2a\n\tIP_FW_TABLE_GETSIZE            = 0x2b\n\tIP_FW_TABLE_LIST               = 0x2c\n\tIP_FW_ZERO                     = 0x35\n\tIP_HDRINCL                     = 0x2\n\tIP_IPSEC_POLICY                = 0x15\n\tIP_MAXPACKET                   = 0xffff\n\tIP_MAX_GROUP_SRC_FILTER        = 0x200\n\tIP_MAX_MEMBERSHIPS             = 0xfff\n\tIP_MAX_SOCK_MUTE_FILTER        = 0x80\n\tIP_MAX_SOCK_SRC_FILTER         = 0x80\n\tIP_MAX_SOURCE_FILTER           = 0x400\n\tIP_MF                          = 0x2000\n\tIP_MINTTL                      = 0x42\n\tIP_MIN_MEMBERSHIPS             = 0x1f\n\tIP_MSFILTER                    = 0x4a\n\tIP_MSS                         = 0x240\n\tIP_MULTICAST_IF                = 0x9\n\tIP_MULTICAST_LOOP              = 0xb\n\tIP_MULTICAST_TTL               = 0xa\n\tIP_MULTICAST_VIF               = 0xe\n\tIP_OFFMASK                     = 0x1fff\n\tIP_ONESBCAST                   = 0x17\n\tIP_OPTIONS                     = 0x1\n\tIP_PORTRANGE                   = 0x13\n\tIP_PORTRANGE_DEFAULT           = 0x0\n\tIP_PORTRANGE_HIGH              = 0x1\n\tIP_PORTRANGE_LOW               = 0x2\n\tIP_RECVDSTADDR                 = 0x7\n\tIP_RECVFLOWID                  = 0x5d\n\tIP_RECVIF                      = 0x14\n\tIP_RECVOPTS                    = 0x5\n\tIP_RECVRETOPTS                 = 0x6\n\tIP_RECVRSSBUCKETID             = 0x5e\n\tIP_RECVTOS                     = 0x44\n\tIP_RECVTTL                     = 0x41\n\tIP_RETOPTS                     = 0x8\n\tIP_RF                          = 0x8000\n\tIP_RSSBUCKETID                 = 0x5c\n\tIP_RSS_LISTEN_BUCKET           = 0x1a\n\tIP_RSVP_OFF                    = 0x10\n\tIP_RSVP_ON                     = 0xf\n\tIP_RSVP_VIF_OFF                = 0x12\n\tIP_RSVP_VIF_ON                 = 0x11\n\tIP_SENDSRCADDR                 = 0x7\n\tIP_TOS                         = 0x3\n\tIP_TTL                         = 0x4\n\tIP_UNBLOCK_SOURCE              = 0x49\n\tISIG                           = 0x80\n\tISTRIP                         = 0x20\n\tIXANY                          = 0x800\n\tIXOFF                          = 0x400\n\tIXON                           = 0x200\n\tLOCK_EX                        = 0x2\n\tLOCK_NB                        = 0x4\n\tLOCK_SH                        = 0x1\n\tLOCK_UN                        = 0x8\n\tMADV_AUTOSYNC                  = 0x7\n\tMADV_CORE                      = 0x9\n\tMADV_DONTNEED                  = 0x4\n\tMADV_FREE                      = 0x5\n\tMADV_NOCORE                    = 0x8\n\tMADV_NORMAL                    = 0x0\n\tMADV_NOSYNC                    = 0x6\n\tMADV_PROTECT                   = 0xa\n\tMADV_RANDOM                    = 0x1\n\tMADV_SEQUENTIAL                = 0x2\n\tMADV_WILLNEED                  = 0x3\n\tMAP_32BIT                      = 0x80000\n\tMAP_ALIGNED_SUPER              = 0x1000000\n\tMAP_ALIGNMENT_MASK             = -0x1000000\n\tMAP_ALIGNMENT_SHIFT            = 0x18\n\tMAP_ANON                       = 0x1000\n\tMAP_ANONYMOUS                  = 0x1000\n\tMAP_COPY                       = 0x2\n\tMAP_EXCL                       = 0x4000\n\tMAP_FILE                       = 0x0\n\tMAP_FIXED                      = 0x10\n\tMAP_HASSEMAPHORE               = 0x200\n\tMAP_NOCORE                     = 0x20000\n\tMAP_NOSYNC                     = 0x800\n\tMAP_PREFAULT_READ              = 0x40000\n\tMAP_PRIVATE                    = 0x2\n\tMAP_RESERVED0020               = 0x20\n\tMAP_RESERVED0040               = 0x40\n\tMAP_RESERVED0080               = 0x80\n\tMAP_RESERVED0100               = 0x100\n\tMAP_SHARED                     = 0x1\n\tMAP_STACK                      = 0x400\n\tMCL_CURRENT                    = 0x1\n\tMCL_FUTURE                     = 0x2\n\tMNT_ACLS                       = 0x8000000\n\tMNT_ASYNC                      = 0x40\n\tMNT_AUTOMOUNTED                = 0x200000000\n\tMNT_BYFSID                     = 0x8000000\n\tMNT_CMDFLAGS                   = 0xd0f0000\n\tMNT_DEFEXPORTED                = 0x200\n\tMNT_DELEXPORT                  = 0x20000\n\tMNT_EXKERB                     = 0x800\n\tMNT_EXPORTANON                 = 0x400\n\tMNT_EXPORTED                   = 0x100\n\tMNT_EXPUBLIC                   = 0x20000000\n\tMNT_EXRDONLY                   = 0x80\n\tMNT_FORCE                      = 0x80000\n\tMNT_GJOURNAL                   = 0x2000000\n\tMNT_IGNORE                     = 0x800000\n\tMNT_LAZY                       = 0x3\n\tMNT_LOCAL                      = 0x1000\n\tMNT_MULTILABEL                 = 0x4000000\n\tMNT_NFS4ACLS                   = 0x10\n\tMNT_NOATIME                    = 0x10000000\n\tMNT_NOCLUSTERR                 = 0x40000000\n\tMNT_NOCLUSTERW                 = 0x80000000\n\tMNT_NOEXEC                     = 0x4\n\tMNT_NONBUSY                    = 0x4000000\n\tMNT_NOSUID                     = 0x8\n\tMNT_NOSYMFOLLOW                = 0x400000\n\tMNT_NOWAIT                     = 0x2\n\tMNT_QUOTA                      = 0x2000\n\tMNT_RDONLY                     = 0x1\n\tMNT_RELOAD                     = 0x40000\n\tMNT_ROOTFS                     = 0x4000\n\tMNT_SNAPSHOT                   = 0x1000000\n\tMNT_SOFTDEP                    = 0x200000\n\tMNT_SUIDDIR                    = 0x100000\n\tMNT_SUJ                        = 0x100000000\n\tMNT_SUSPEND                    = 0x4\n\tMNT_SYNCHRONOUS                = 0x2\n\tMNT_UNION                      = 0x20\n\tMNT_UPDATE                     = 0x10000\n\tMNT_UPDATEMASK                 = 0x2d8d0807e\n\tMNT_USER                       = 0x8000\n\tMNT_VISFLAGMASK                = 0x3fef0ffff\n\tMNT_WAIT                       = 0x1\n\tMSG_CMSG_CLOEXEC               = 0x40000\n\tMSG_COMPAT                     = 0x8000\n\tMSG_CTRUNC                     = 0x20\n\tMSG_DONTROUTE                  = 0x4\n\tMSG_DONTWAIT                   = 0x80\n\tMSG_EOF                        = 0x100\n\tMSG_EOR                        = 0x8\n\tMSG_NBIO                       = 0x4000\n\tMSG_NOSIGNAL                   = 0x20000\n\tMSG_NOTIFICATION               = 0x2000\n\tMSG_OOB                        = 0x1\n\tMSG_PEEK                       = 0x2\n\tMSG_TRUNC                      = 0x10\n\tMSG_WAITALL                    = 0x40\n\tMSG_WAITFORONE                 = 0x80000\n\tMS_ASYNC                       = 0x1\n\tMS_INVALIDATE                  = 0x2\n\tMS_SYNC                        = 0x0\n\tNAME_MAX                       = 0xff\n\tNET_RT_DUMP                    = 0x1\n\tNET_RT_FLAGS                   = 0x2\n\tNET_RT_IFLIST                  = 0x3\n\tNET_RT_IFLISTL                 = 0x5\n\tNET_RT_IFMALIST                = 0x4\n\tNOFLSH                         = 0x80000000\n\tNOKERNINFO                     = 0x2000000\n\tNOTE_ATTRIB                    = 0x8\n\tNOTE_CHILD                     = 0x4\n\tNOTE_CLOSE                     = 0x100\n\tNOTE_CLOSE_WRITE               = 0x200\n\tNOTE_DELETE                    = 0x1\n\tNOTE_EXEC                      = 0x20000000\n\tNOTE_EXIT                      = 0x80000000\n\tNOTE_EXTEND                    = 0x4\n\tNOTE_FFAND                     = 0x40000000\n\tNOTE_FFCOPY                    = 0xc0000000\n\tNOTE_FFCTRLMASK                = 0xc0000000\n\tNOTE_FFLAGSMASK                = 0xffffff\n\tNOTE_FFNOP                     = 0x0\n\tNOTE_FFOR                      = 0x80000000\n\tNOTE_FILE_POLL                 = 0x2\n\tNOTE_FORK                      = 0x40000000\n\tNOTE_LINK                      = 0x10\n\tNOTE_LOWAT                     = 0x1\n\tNOTE_MSECONDS                  = 0x2\n\tNOTE_NSECONDS                  = 0x8\n\tNOTE_OPEN                      = 0x80\n\tNOTE_PCTRLMASK                 = 0xf0000000\n\tNOTE_PDATAMASK                 = 0xfffff\n\tNOTE_READ                      = 0x400\n\tNOTE_RENAME                    = 0x20\n\tNOTE_REVOKE                    = 0x40\n\tNOTE_SECONDS                   = 0x1\n\tNOTE_TRACK                     = 0x1\n\tNOTE_TRACKERR                  = 0x2\n\tNOTE_TRIGGER                   = 0x1000000\n\tNOTE_USECONDS                  = 0x4\n\tNOTE_WRITE                     = 0x2\n\tOCRNL                          = 0x10\n\tONLCR                          = 0x2\n\tONLRET                         = 0x40\n\tONOCR                          = 0x20\n\tONOEOT                         = 0x8\n\tOPOST                          = 0x1\n\tOXTABS                         = 0x4\n\tO_ACCMODE                      = 0x3\n\tO_APPEND                       = 0x8\n\tO_ASYNC                        = 0x40\n\tO_CLOEXEC                      = 0x100000\n\tO_CREAT                        = 0x200\n\tO_DIRECT                       = 0x10000\n\tO_DIRECTORY                    = 0x20000\n\tO_EXCL                         = 0x800\n\tO_EXEC                         = 0x40000\n\tO_EXLOCK                       = 0x20\n\tO_FSYNC                        = 0x80\n\tO_NDELAY                       = 0x4\n\tO_NOCTTY                       = 0x8000\n\tO_NOFOLLOW                     = 0x100\n\tO_NONBLOCK                     = 0x4\n\tO_RDONLY                       = 0x0\n\tO_RDWR                         = 0x2\n\tO_SHLOCK                       = 0x10\n\tO_SYNC                         = 0x80\n\tO_TRUNC                        = 0x400\n\tO_TTY_INIT                     = 0x80000\n\tO_VERIFY                       = 0x200000\n\tO_WRONLY                       = 0x1\n\tPARENB                         = 0x1000\n\tPARMRK                         = 0x8\n\tPARODD                         = 0x2000\n\tPENDIN                         = 0x20000000\n\tPRIO_PGRP                      = 0x1\n\tPRIO_PROCESS                   = 0x0\n\tPRIO_USER                      = 0x2\n\tPROT_EXEC                      = 0x4\n\tPROT_NONE                      = 0x0\n\tPROT_READ                      = 0x1\n\tPROT_WRITE                     = 0x2\n\tRLIMIT_AS                      = 0xa\n\tRLIMIT_CORE                    = 0x4\n\tRLIMIT_CPU                     = 0x0\n\tRLIMIT_DATA                    = 0x2\n\tRLIMIT_FSIZE                   = 0x1\n\tRLIMIT_MEMLOCK                 = 0x6\n\tRLIMIT_NOFILE                  = 0x8\n\tRLIMIT_NPROC                   = 0x7\n\tRLIMIT_RSS                     = 0x5\n\tRLIMIT_STACK                   = 0x3\n\tRLIM_INFINITY                  = 0x7fffffffffffffff\n\tRTAX_AUTHOR                    = 0x6\n\tRTAX_BRD                       = 0x7\n\tRTAX_DST                       = 0x0\n\tRTAX_GATEWAY                   = 0x1\n\tRTAX_GENMASK                   = 0x3\n\tRTAX_IFA                       = 0x5\n\tRTAX_IFP                       = 0x4\n\tRTAX_MAX                       = 0x8\n\tRTAX_NETMASK                   = 0x2\n\tRTA_AUTHOR                     = 0x40\n\tRTA_BRD                        = 0x80\n\tRTA_DST                        = 0x1\n\tRTA_GATEWAY                    = 0x2\n\tRTA_GENMASK                    = 0x8\n\tRTA_IFA                        = 0x20\n\tRTA_IFP                        = 0x10\n\tRTA_NETMASK                    = 0x4\n\tRTF_BLACKHOLE                  = 0x1000\n\tRTF_BROADCAST                  = 0x400000\n\tRTF_DONE                       = 0x40\n\tRTF_DYNAMIC                    = 0x10\n\tRTF_FIXEDMTU                   = 0x80000\n\tRTF_FMASK                      = 0x1004d808\n\tRTF_GATEWAY                    = 0x2\n\tRTF_GWFLAG_COMPAT              = 0x80000000\n\tRTF_HOST                       = 0x4\n\tRTF_LLDATA                     = 0x400\n\tRTF_LLINFO                     = 0x400\n\tRTF_LOCAL                      = 0x200000\n\tRTF_MODIFIED                   = 0x20\n\tRTF_MULTICAST                  = 0x800000\n\tRTF_PINNED                     = 0x100000\n\tRTF_PROTO1                     = 0x8000\n\tRTF_PROTO2                     = 0x4000\n\tRTF_PROTO3                     = 0x40000\n\tRTF_REJECT                     = 0x8\n\tRTF_RNH_LOCKED                 = 0x40000000\n\tRTF_STATIC                     = 0x800\n\tRTF_STICKY                     = 0x10000000\n\tRTF_UP                         = 0x1\n\tRTF_XRESOLVE                   = 0x200\n\tRTM_ADD                        = 0x1\n\tRTM_CHANGE                     = 0x3\n\tRTM_DELADDR                    = 0xd\n\tRTM_DELETE                     = 0x2\n\tRTM_DELMADDR                   = 0x10\n\tRTM_GET                        = 0x4\n\tRTM_IEEE80211                  = 0x12\n\tRTM_IFANNOUNCE                 = 0x11\n\tRTM_IFINFO                     = 0xe\n\tRTM_LOCK                       = 0x8\n\tRTM_LOSING                     = 0x5\n\tRTM_MISS                       = 0x7\n\tRTM_NEWADDR                    = 0xc\n\tRTM_NEWMADDR                   = 0xf\n\tRTM_REDIRECT                   = 0x6\n\tRTM_RESOLVE                    = 0xb\n\tRTM_RTTUNIT                    = 0xf4240\n\tRTM_VERSION                    = 0x5\n\tRTV_EXPIRE                     = 0x4\n\tRTV_HOPCOUNT                   = 0x2\n\tRTV_MTU                        = 0x1\n\tRTV_RPIPE                      = 0x8\n\tRTV_RTT                        = 0x40\n\tRTV_RTTVAR                     = 0x80\n\tRTV_SPIPE                      = 0x10\n\tRTV_SSTHRESH                   = 0x20\n\tRTV_WEIGHT                     = 0x100\n\tRT_ALL_FIBS                    = -0x1\n\tRT_BLACKHOLE                   = 0x40\n\tRT_CACHING_CONTEXT             = 0x1\n\tRT_DEFAULT_FIB                 = 0x0\n\tRT_HAS_GW                      = 0x80\n\tRT_HAS_HEADER                  = 0x10\n\tRT_HAS_HEADER_BIT              = 0x4\n\tRT_L2_ME                       = 0x4\n\tRT_L2_ME_BIT                   = 0x2\n\tRT_LLE_CACHE                   = 0x100\n\tRT_MAY_LOOP                    = 0x8\n\tRT_MAY_LOOP_BIT                = 0x3\n\tRT_NORTREF                     = 0x2\n\tRT_REJECT                      = 0x20\n\tRUSAGE_CHILDREN                = -0x1\n\tRUSAGE_SELF                    = 0x0\n\tRUSAGE_THREAD                  = 0x1\n\tSCM_BINTIME                    = 0x4\n\tSCM_CREDS                      = 0x3\n\tSCM_RIGHTS                     = 0x1\n\tSCM_TIMESTAMP                  = 0x2\n\tSHUT_RD                        = 0x0\n\tSHUT_RDWR                      = 0x2\n\tSHUT_WR                        = 0x1\n\tSIOCADDMULTI                   = 0x80206931\n\tSIOCAIFADDR                    = 0x8040691a\n\tSIOCAIFGROUP                   = 0x80286987\n\tSIOCATMARK                     = 0x40047307\n\tSIOCDELMULTI                   = 0x80206932\n\tSIOCDIFADDR                    = 0x80206919\n\tSIOCDIFGROUP                   = 0x80286989\n\tSIOCDIFPHYADDR                 = 0x80206949\n\tSIOCGDRVSPEC                   = 0xc028697b\n\tSIOCGETSGCNT                   = 0xc0207210\n\tSIOCGETVIFCNT                  = 0xc028720f\n\tSIOCGHIWAT                     = 0x40047301\n\tSIOCGI2C                       = 0xc020693d\n\tSIOCGIFADDR                    = 0xc0206921\n\tSIOCGIFBRDADDR                 = 0xc0206923\n\tSIOCGIFCAP                     = 0xc020691f\n\tSIOCGIFCONF                    = 0xc0106924\n\tSIOCGIFDESCR                   = 0xc020692a\n\tSIOCGIFDSTADDR                 = 0xc0206922\n\tSIOCGIFFIB                     = 0xc020695c\n\tSIOCGIFFLAGS                   = 0xc0206911\n\tSIOCGIFGENERIC                 = 0xc020693a\n\tSIOCGIFGMEMB                   = 0xc028698a\n\tSIOCGIFGROUP                   = 0xc0286988\n\tSIOCGIFINDEX                   = 0xc0206920\n\tSIOCGIFMAC                     = 0xc0206926\n\tSIOCGIFMEDIA                   = 0xc0306938\n\tSIOCGIFMETRIC                  = 0xc0206917\n\tSIOCGIFMTU                     = 0xc0206933\n\tSIOCGIFNETMASK                 = 0xc0206925\n\tSIOCGIFPDSTADDR                = 0xc0206948\n\tSIOCGIFPHYS                    = 0xc0206935\n\tSIOCGIFPSRCADDR                = 0xc0206947\n\tSIOCGIFSTATUS                  = 0xc331693b\n\tSIOCGIFXMEDIA                  = 0xc030698b\n\tSIOCGLOWAT                     = 0x40047303\n\tSIOCGPGRP                      = 0x40047309\n\tSIOCGPRIVATE_0                 = 0xc0206950\n\tSIOCGPRIVATE_1                 = 0xc0206951\n\tSIOCGTUNFIB                    = 0xc020695e\n\tSIOCIFCREATE                   = 0xc020697a\n\tSIOCIFCREATE2                  = 0xc020697c\n\tSIOCIFDESTROY                  = 0x80206979\n\tSIOCIFGCLONERS                 = 0xc0106978\n\tSIOCSDRVSPEC                   = 0x8028697b\n\tSIOCSHIWAT                     = 0x80047300\n\tSIOCSIFADDR                    = 0x8020690c\n\tSIOCSIFBRDADDR                 = 0x80206913\n\tSIOCSIFCAP                     = 0x8020691e\n\tSIOCSIFDESCR                   = 0x80206929\n\tSIOCSIFDSTADDR                 = 0x8020690e\n\tSIOCSIFFIB                     = 0x8020695d\n\tSIOCSIFFLAGS                   = 0x80206910\n\tSIOCSIFGENERIC                 = 0x80206939\n\tSIOCSIFLLADDR                  = 0x8020693c\n\tSIOCSIFMAC                     = 0x80206927\n\tSIOCSIFMEDIA                   = 0xc0206937\n\tSIOCSIFMETRIC                  = 0x80206918\n\tSIOCSIFMTU                     = 0x80206934\n\tSIOCSIFNAME                    = 0x80206928\n\tSIOCSIFNETMASK                 = 0x80206916\n\tSIOCSIFPHYADDR                 = 0x80406946\n\tSIOCSIFPHYS                    = 0x80206936\n\tSIOCSIFRVNET                   = 0xc020695b\n\tSIOCSIFVNET                    = 0xc020695a\n\tSIOCSLOWAT                     = 0x80047302\n\tSIOCSPGRP                      = 0x80047308\n\tSIOCSTUNFIB                    = 0x8020695f\n\tSOCK_CLOEXEC                   = 0x10000000\n\tSOCK_DGRAM                     = 0x2\n\tSOCK_MAXADDRLEN                = 0xff\n\tSOCK_NONBLOCK                  = 0x20000000\n\tSOCK_RAW                       = 0x3\n\tSOCK_RDM                       = 0x4\n\tSOCK_SEQPACKET                 = 0x5\n\tSOCK_STREAM                    = 0x1\n\tSOL_SOCKET                     = 0xffff\n\tSOMAXCONN                      = 0x80\n\tSO_ACCEPTCONN                  = 0x2\n\tSO_ACCEPTFILTER                = 0x1000\n\tSO_BINTIME                     = 0x2000\n\tSO_BROADCAST                   = 0x20\n\tSO_DEBUG                       = 0x1\n\tSO_DONTROUTE                   = 0x10\n\tSO_ERROR                       = 0x1007\n\tSO_KEEPALIVE                   = 0x8\n\tSO_LABEL                       = 0x1009\n\tSO_LINGER                      = 0x80\n\tSO_LISTENINCQLEN               = 0x1013\n\tSO_LISTENQLEN                  = 0x1012\n\tSO_LISTENQLIMIT                = 0x1011\n\tSO_NOSIGPIPE                   = 0x800\n\tSO_NO_DDP                      = 0x8000\n\tSO_NO_OFFLOAD                  = 0x4000\n\tSO_OOBINLINE                   = 0x100\n\tSO_PEERLABEL                   = 0x1010\n\tSO_PROTOCOL                    = 0x1016\n\tSO_PROTOTYPE                   = 0x1016\n\tSO_RCVBUF                      = 0x1002\n\tSO_RCVLOWAT                    = 0x1004\n\tSO_RCVTIMEO                    = 0x1006\n\tSO_REUSEADDR                   = 0x4\n\tSO_REUSEPORT                   = 0x200\n\tSO_SETFIB                      = 0x1014\n\tSO_SNDBUF                      = 0x1001\n\tSO_SNDLOWAT                    = 0x1003\n\tSO_SNDTIMEO                    = 0x1005\n\tSO_TIMESTAMP                   = 0x400\n\tSO_TYPE                        = 0x1008\n\tSO_USELOOPBACK                 = 0x40\n\tSO_USER_COOKIE                 = 0x1015\n\tSO_VENDOR                      = 0x80000000\n\tTAB0                           = 0x0\n\tTAB3                           = 0x4\n\tTABDLY                         = 0x4\n\tTCIFLUSH                       = 0x1\n\tTCIOFF                         = 0x3\n\tTCIOFLUSH                      = 0x3\n\tTCION                          = 0x4\n\tTCOFLUSH                       = 0x2\n\tTCOOFF                         = 0x1\n\tTCOON                          = 0x2\n\tTCP_CA_NAME_MAX                = 0x10\n\tTCP_CCALGOOPT                  = 0x41\n\tTCP_CONGESTION                 = 0x40\n\tTCP_FASTOPEN                   = 0x401\n\tTCP_FUNCTION_BLK               = 0x2000\n\tTCP_FUNCTION_NAME_LEN_MAX      = 0x20\n\tTCP_INFO                       = 0x20\n\tTCP_KEEPCNT                    = 0x400\n\tTCP_KEEPIDLE                   = 0x100\n\tTCP_KEEPINIT                   = 0x80\n\tTCP_KEEPINTVL                  = 0x200\n\tTCP_MAXBURST                   = 0x4\n\tTCP_MAXHLEN                    = 0x3c\n\tTCP_MAXOLEN                    = 0x28\n\tTCP_MAXSEG                     = 0x2\n\tTCP_MAXWIN                     = 0xffff\n\tTCP_MAX_SACK                   = 0x4\n\tTCP_MAX_WINSHIFT               = 0xe\n\tTCP_MD5SIG                     = 0x10\n\tTCP_MINMSS                     = 0xd8\n\tTCP_MSS                        = 0x218\n\tTCP_NODELAY                    = 0x1\n\tTCP_NOOPT                      = 0x8\n\tTCP_NOPUSH                     = 0x4\n\tTCP_PCAP_IN                    = 0x1000\n\tTCP_PCAP_OUT                   = 0x800\n\tTCP_VENDOR                     = 0x80000000\n\tTCSAFLUSH                      = 0x2\n\tTIOCCBRK                       = 0x2000747a\n\tTIOCCDTR                       = 0x20007478\n\tTIOCCONS                       = 0x80047462\n\tTIOCDRAIN                      = 0x2000745e\n\tTIOCEXCL                       = 0x2000740d\n\tTIOCEXT                        = 0x80047460\n\tTIOCFLUSH                      = 0x80047410\n\tTIOCGDRAINWAIT                 = 0x40047456\n\tTIOCGETA                       = 0x402c7413\n\tTIOCGETD                       = 0x4004741a\n\tTIOCGPGRP                      = 0x40047477\n\tTIOCGPTN                       = 0x4004740f\n\tTIOCGSID                       = 0x40047463\n\tTIOCGWINSZ                     = 0x40087468\n\tTIOCMBIC                       = 0x8004746b\n\tTIOCMBIS                       = 0x8004746c\n\tTIOCMGDTRWAIT                  = 0x4004745a\n\tTIOCMGET                       = 0x4004746a\n\tTIOCMSDTRWAIT                  = 0x8004745b\n\tTIOCMSET                       = 0x8004746d\n\tTIOCM_CAR                      = 0x40\n\tTIOCM_CD                       = 0x40\n\tTIOCM_CTS                      = 0x20\n\tTIOCM_DCD                      = 0x40\n\tTIOCM_DSR                      = 0x100\n\tTIOCM_DTR                      = 0x2\n\tTIOCM_LE                       = 0x1\n\tTIOCM_RI                       = 0x80\n\tTIOCM_RNG                      = 0x80\n\tTIOCM_RTS                      = 0x4\n\tTIOCM_SR                       = 0x10\n\tTIOCM_ST                       = 0x8\n\tTIOCNOTTY                      = 0x20007471\n\tTIOCNXCL                       = 0x2000740e\n\tTIOCOUTQ                       = 0x40047473\n\tTIOCPKT                        = 0x80047470\n\tTIOCPKT_DATA                   = 0x0\n\tTIOCPKT_DOSTOP                 = 0x20\n\tTIOCPKT_FLUSHREAD              = 0x1\n\tTIOCPKT_FLUSHWRITE             = 0x2\n\tTIOCPKT_IOCTL                  = 0x40\n\tTIOCPKT_NOSTOP                 = 0x10\n\tTIOCPKT_START                  = 0x8\n\tTIOCPKT_STOP                   = 0x4\n\tTIOCPTMASTER                   = 0x2000741c\n\tTIOCSBRK                       = 0x2000747b\n\tTIOCSCTTY                      = 0x20007461\n\tTIOCSDRAINWAIT                 = 0x80047457\n\tTIOCSDTR                       = 0x20007479\n\tTIOCSETA                       = 0x802c7414\n\tTIOCSETAF                      = 0x802c7416\n\tTIOCSETAW                      = 0x802c7415\n\tTIOCSETD                       = 0x8004741b\n\tTIOCSIG                        = 0x2004745f\n\tTIOCSPGRP                      = 0x80047476\n\tTIOCSTART                      = 0x2000746e\n\tTIOCSTAT                       = 0x20007465\n\tTIOCSTI                        = 0x80017472\n\tTIOCSTOP                       = 0x2000746f\n\tTIOCSWINSZ                     = 0x80087467\n\tTIOCTIMESTAMP                  = 0x40107459\n\tTIOCUCNTL                      = 0x80047466\n\tTOSTOP                         = 0x400000\n\tVDISCARD                       = 0xf\n\tVDSUSP                         = 0xb\n\tVEOF                           = 0x0\n\tVEOL                           = 0x1\n\tVEOL2                          = 0x2\n\tVERASE                         = 0x3\n\tVERASE2                        = 0x7\n\tVINTR                          = 0x8\n\tVKILL                          = 0x5\n\tVLNEXT                         = 0xe\n\tVMIN                           = 0x10\n\tVQUIT                          = 0x9\n\tVREPRINT                       = 0x6\n\tVSTART                         = 0xc\n\tVSTATUS                        = 0x12\n\tVSTOP                          = 0xd\n\tVSUSP                          = 0xa\n\tVTIME                          = 0x11\n\tVWERASE                        = 0x4\n\tWCONTINUED                     = 0x4\n\tWCOREFLAG                      = 0x80\n\tWEXITED                        = 0x10\n\tWLINUXCLONE                    = 0x80000000\n\tWNOHANG                        = 0x1\n\tWNOWAIT                        = 0x8\n\tWSTOPPED                       = 0x2\n\tWTRAPPED                       = 0x20\n\tWUNTRACED                      = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMSG         = syscall.Errno(0x59)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x55)\n\tECAPMODE        = syscall.Errno(0x5e)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOOFUS         = syscall.Errno(0x58)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x52)\n\tEILSEQ          = syscall.Errno(0x56)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x60)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5a)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x57)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x5b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x53)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCAPABLE     = syscall.Errno(0x5d)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTRECOVERABLE = syscall.Errno(0x5f)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEOWNERDEAD      = syscall.Errno(0x60)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x5c)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGLIBRT  = syscall.Signal(0x21)\n\tSIGLWP    = syscall.Signal(0x20)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTHR    = syscall.Signal(0x20)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"operation timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"identifier removed\",\n\t83: \"no message of desired type\",\n\t84: \"value too large to be stored in data type\",\n\t85: \"operation canceled\",\n\t86: \"illegal byte sequence\",\n\t87: \"attribute not found\",\n\t88: \"programming error\",\n\t89: \"bad message\",\n\t90: \"multihop attempted\",\n\t91: \"link has been severed\",\n\t92: \"protocol error\",\n\t93: \"capabilities insufficient\",\n\t94: \"not permitted in capability mode\",\n\t95: \"state not recoverable\",\n\t96: \"previous owner died\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"unknown signal\",\n\t33: \"unknown signal\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go",
    "content": "// mkerrors.sh\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,freebsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                   = 0x10\n\tAF_ARP                         = 0x23\n\tAF_ATM                         = 0x1e\n\tAF_BLUETOOTH                   = 0x24\n\tAF_CCITT                       = 0xa\n\tAF_CHAOS                       = 0x5\n\tAF_CNT                         = 0x15\n\tAF_COIP                        = 0x14\n\tAF_DATAKIT                     = 0x9\n\tAF_DECnet                      = 0xc\n\tAF_DLI                         = 0xd\n\tAF_E164                        = 0x1a\n\tAF_ECMA                        = 0x8\n\tAF_HYLINK                      = 0xf\n\tAF_IEEE80211                   = 0x25\n\tAF_IMPLINK                     = 0x3\n\tAF_INET                        = 0x2\n\tAF_INET6                       = 0x1c\n\tAF_INET6_SDP                   = 0x2a\n\tAF_INET_SDP                    = 0x28\n\tAF_IPX                         = 0x17\n\tAF_ISDN                        = 0x1a\n\tAF_ISO                         = 0x7\n\tAF_LAT                         = 0xe\n\tAF_LINK                        = 0x12\n\tAF_LOCAL                       = 0x1\n\tAF_MAX                         = 0x2a\n\tAF_NATM                        = 0x1d\n\tAF_NETBIOS                     = 0x6\n\tAF_NETGRAPH                    = 0x20\n\tAF_OSI                         = 0x7\n\tAF_PUP                         = 0x4\n\tAF_ROUTE                       = 0x11\n\tAF_SCLUSTER                    = 0x22\n\tAF_SIP                         = 0x18\n\tAF_SLOW                        = 0x21\n\tAF_SNA                         = 0xb\n\tAF_UNIX                        = 0x1\n\tAF_UNSPEC                      = 0x0\n\tAF_VENDOR00                    = 0x27\n\tAF_VENDOR01                    = 0x29\n\tAF_VENDOR02                    = 0x2b\n\tAF_VENDOR03                    = 0x2d\n\tAF_VENDOR04                    = 0x2f\n\tAF_VENDOR05                    = 0x31\n\tAF_VENDOR06                    = 0x33\n\tAF_VENDOR07                    = 0x35\n\tAF_VENDOR08                    = 0x37\n\tAF_VENDOR09                    = 0x39\n\tAF_VENDOR10                    = 0x3b\n\tAF_VENDOR11                    = 0x3d\n\tAF_VENDOR12                    = 0x3f\n\tAF_VENDOR13                    = 0x41\n\tAF_VENDOR14                    = 0x43\n\tAF_VENDOR15                    = 0x45\n\tAF_VENDOR16                    = 0x47\n\tAF_VENDOR17                    = 0x49\n\tAF_VENDOR18                    = 0x4b\n\tAF_VENDOR19                    = 0x4d\n\tAF_VENDOR20                    = 0x4f\n\tAF_VENDOR21                    = 0x51\n\tAF_VENDOR22                    = 0x53\n\tAF_VENDOR23                    = 0x55\n\tAF_VENDOR24                    = 0x57\n\tAF_VENDOR25                    = 0x59\n\tAF_VENDOR26                    = 0x5b\n\tAF_VENDOR27                    = 0x5d\n\tAF_VENDOR28                    = 0x5f\n\tAF_VENDOR29                    = 0x61\n\tAF_VENDOR30                    = 0x63\n\tAF_VENDOR31                    = 0x65\n\tAF_VENDOR32                    = 0x67\n\tAF_VENDOR33                    = 0x69\n\tAF_VENDOR34                    = 0x6b\n\tAF_VENDOR35                    = 0x6d\n\tAF_VENDOR36                    = 0x6f\n\tAF_VENDOR37                    = 0x71\n\tAF_VENDOR38                    = 0x73\n\tAF_VENDOR39                    = 0x75\n\tAF_VENDOR40                    = 0x77\n\tAF_VENDOR41                    = 0x79\n\tAF_VENDOR42                    = 0x7b\n\tAF_VENDOR43                    = 0x7d\n\tAF_VENDOR44                    = 0x7f\n\tAF_VENDOR45                    = 0x81\n\tAF_VENDOR46                    = 0x83\n\tAF_VENDOR47                    = 0x85\n\tALTWERASE                      = 0x200\n\tB0                             = 0x0\n\tB110                           = 0x6e\n\tB115200                        = 0x1c200\n\tB1200                          = 0x4b0\n\tB134                           = 0x86\n\tB14400                         = 0x3840\n\tB150                           = 0x96\n\tB1800                          = 0x708\n\tB19200                         = 0x4b00\n\tB200                           = 0xc8\n\tB230400                        = 0x38400\n\tB2400                          = 0x960\n\tB28800                         = 0x7080\n\tB300                           = 0x12c\n\tB38400                         = 0x9600\n\tB460800                        = 0x70800\n\tB4800                          = 0x12c0\n\tB50                            = 0x32\n\tB57600                         = 0xe100\n\tB600                           = 0x258\n\tB7200                          = 0x1c20\n\tB75                            = 0x4b\n\tB76800                         = 0x12c00\n\tB921600                        = 0xe1000\n\tB9600                          = 0x2580\n\tBIOCFEEDBACK                   = 0x8004427c\n\tBIOCFLUSH                      = 0x20004268\n\tBIOCGBLEN                      = 0x40044266\n\tBIOCGDIRECTION                 = 0x40044276\n\tBIOCGDLT                       = 0x4004426a\n\tBIOCGDLTLIST                   = 0xc0084279\n\tBIOCGETBUFMODE                 = 0x4004427d\n\tBIOCGETIF                      = 0x4020426b\n\tBIOCGETZMAX                    = 0x4004427f\n\tBIOCGHDRCMPLT                  = 0x40044274\n\tBIOCGRSIG                      = 0x40044272\n\tBIOCGRTIMEOUT                  = 0x4010426e\n\tBIOCGSEESENT                   = 0x40044276\n\tBIOCGSTATS                     = 0x4008426f\n\tBIOCGTSTAMP                    = 0x40044283\n\tBIOCIMMEDIATE                  = 0x80044270\n\tBIOCLOCK                       = 0x2000427a\n\tBIOCPROMISC                    = 0x20004269\n\tBIOCROTZBUF                    = 0x400c4280\n\tBIOCSBLEN                      = 0xc0044266\n\tBIOCSDIRECTION                 = 0x80044277\n\tBIOCSDLT                       = 0x80044278\n\tBIOCSETBUFMODE                 = 0x8004427e\n\tBIOCSETF                       = 0x80084267\n\tBIOCSETFNR                     = 0x80084282\n\tBIOCSETIF                      = 0x8020426c\n\tBIOCSETWF                      = 0x8008427b\n\tBIOCSETZBUF                    = 0x800c4281\n\tBIOCSHDRCMPLT                  = 0x80044275\n\tBIOCSRSIG                      = 0x80044273\n\tBIOCSRTIMEOUT                  = 0x8010426d\n\tBIOCSSEESENT                   = 0x80044277\n\tBIOCSTSTAMP                    = 0x80044284\n\tBIOCVERSION                    = 0x40044271\n\tBPF_A                          = 0x10\n\tBPF_ABS                        = 0x20\n\tBPF_ADD                        = 0x0\n\tBPF_ALIGNMENT                  = 0x4\n\tBPF_ALU                        = 0x4\n\tBPF_AND                        = 0x50\n\tBPF_B                          = 0x10\n\tBPF_BUFMODE_BUFFER             = 0x1\n\tBPF_BUFMODE_ZBUF               = 0x2\n\tBPF_DIV                        = 0x30\n\tBPF_H                          = 0x8\n\tBPF_IMM                        = 0x0\n\tBPF_IND                        = 0x40\n\tBPF_JA                         = 0x0\n\tBPF_JEQ                        = 0x10\n\tBPF_JGE                        = 0x30\n\tBPF_JGT                        = 0x20\n\tBPF_JMP                        = 0x5\n\tBPF_JSET                       = 0x40\n\tBPF_K                          = 0x0\n\tBPF_LD                         = 0x0\n\tBPF_LDX                        = 0x1\n\tBPF_LEN                        = 0x80\n\tBPF_LSH                        = 0x60\n\tBPF_MAJOR_VERSION              = 0x1\n\tBPF_MAXBUFSIZE                 = 0x80000\n\tBPF_MAXINSNS                   = 0x200\n\tBPF_MEM                        = 0x60\n\tBPF_MEMWORDS                   = 0x10\n\tBPF_MINBUFSIZE                 = 0x20\n\tBPF_MINOR_VERSION              = 0x1\n\tBPF_MISC                       = 0x7\n\tBPF_MOD                        = 0x90\n\tBPF_MSH                        = 0xa0\n\tBPF_MUL                        = 0x20\n\tBPF_NEG                        = 0x80\n\tBPF_OR                         = 0x40\n\tBPF_RELEASE                    = 0x30bb6\n\tBPF_RET                        = 0x6\n\tBPF_RSH                        = 0x70\n\tBPF_ST                         = 0x2\n\tBPF_STX                        = 0x3\n\tBPF_SUB                        = 0x10\n\tBPF_TAX                        = 0x0\n\tBPF_TXA                        = 0x80\n\tBPF_T_BINTIME                  = 0x2\n\tBPF_T_BINTIME_FAST             = 0x102\n\tBPF_T_BINTIME_MONOTONIC        = 0x202\n\tBPF_T_BINTIME_MONOTONIC_FAST   = 0x302\n\tBPF_T_FAST                     = 0x100\n\tBPF_T_FLAG_MASK                = 0x300\n\tBPF_T_FORMAT_MASK              = 0x3\n\tBPF_T_MICROTIME                = 0x0\n\tBPF_T_MICROTIME_FAST           = 0x100\n\tBPF_T_MICROTIME_MONOTONIC      = 0x200\n\tBPF_T_MICROTIME_MONOTONIC_FAST = 0x300\n\tBPF_T_MONOTONIC                = 0x200\n\tBPF_T_MONOTONIC_FAST           = 0x300\n\tBPF_T_NANOTIME                 = 0x1\n\tBPF_T_NANOTIME_FAST            = 0x101\n\tBPF_T_NANOTIME_MONOTONIC       = 0x201\n\tBPF_T_NANOTIME_MONOTONIC_FAST  = 0x301\n\tBPF_T_NONE                     = 0x3\n\tBPF_T_NORMAL                   = 0x0\n\tBPF_W                          = 0x0\n\tBPF_X                          = 0x8\n\tBPF_XOR                        = 0xa0\n\tBRKINT                         = 0x2\n\tCAP_ACCEPT                     = 0x200000020000000\n\tCAP_ACL_CHECK                  = 0x400000000010000\n\tCAP_ACL_DELETE                 = 0x400000000020000\n\tCAP_ACL_GET                    = 0x400000000040000\n\tCAP_ACL_SET                    = 0x400000000080000\n\tCAP_ALL0                       = 0x20007ffffffffff\n\tCAP_ALL1                       = 0x4000000001fffff\n\tCAP_BIND                       = 0x200000040000000\n\tCAP_BINDAT                     = 0x200008000000400\n\tCAP_CHFLAGSAT                  = 0x200000000001400\n\tCAP_CONNECT                    = 0x200000080000000\n\tCAP_CONNECTAT                  = 0x200010000000400\n\tCAP_CREATE                     = 0x200000000000040\n\tCAP_EVENT                      = 0x400000000000020\n\tCAP_EXTATTR_DELETE             = 0x400000000001000\n\tCAP_EXTATTR_GET                = 0x400000000002000\n\tCAP_EXTATTR_LIST               = 0x400000000004000\n\tCAP_EXTATTR_SET                = 0x400000000008000\n\tCAP_FCHDIR                     = 0x200000000000800\n\tCAP_FCHFLAGS                   = 0x200000000001000\n\tCAP_FCHMOD                     = 0x200000000002000\n\tCAP_FCHMODAT                   = 0x200000000002400\n\tCAP_FCHOWN                     = 0x200000000004000\n\tCAP_FCHOWNAT                   = 0x200000000004400\n\tCAP_FCNTL                      = 0x200000000008000\n\tCAP_FCNTL_ALL                  = 0x78\n\tCAP_FCNTL_GETFL                = 0x8\n\tCAP_FCNTL_GETOWN               = 0x20\n\tCAP_FCNTL_SETFL                = 0x10\n\tCAP_FCNTL_SETOWN               = 0x40\n\tCAP_FEXECVE                    = 0x200000000000080\n\tCAP_FLOCK                      = 0x200000000010000\n\tCAP_FPATHCONF                  = 0x200000000020000\n\tCAP_FSCK                       = 0x200000000040000\n\tCAP_FSTAT                      = 0x200000000080000\n\tCAP_FSTATAT                    = 0x200000000080400\n\tCAP_FSTATFS                    = 0x200000000100000\n\tCAP_FSYNC                      = 0x200000000000100\n\tCAP_FTRUNCATE                  = 0x200000000000200\n\tCAP_FUTIMES                    = 0x200000000200000\n\tCAP_FUTIMESAT                  = 0x200000000200400\n\tCAP_GETPEERNAME                = 0x200000100000000\n\tCAP_GETSOCKNAME                = 0x200000200000000\n\tCAP_GETSOCKOPT                 = 0x200000400000000\n\tCAP_IOCTL                      = 0x400000000000080\n\tCAP_IOCTLS_ALL                 = 0x7fffffff\n\tCAP_KQUEUE                     = 0x400000000100040\n\tCAP_KQUEUE_CHANGE              = 0x400000000100000\n\tCAP_KQUEUE_EVENT               = 0x400000000000040\n\tCAP_LINKAT_SOURCE              = 0x200020000000400\n\tCAP_LINKAT_TARGET              = 0x200000000400400\n\tCAP_LISTEN                     = 0x200000800000000\n\tCAP_LOOKUP                     = 0x200000000000400\n\tCAP_MAC_GET                    = 0x400000000000001\n\tCAP_MAC_SET                    = 0x400000000000002\n\tCAP_MKDIRAT                    = 0x200000000800400\n\tCAP_MKFIFOAT                   = 0x200000001000400\n\tCAP_MKNODAT                    = 0x200000002000400\n\tCAP_MMAP                       = 0x200000000000010\n\tCAP_MMAP_R                     = 0x20000000000001d\n\tCAP_MMAP_RW                    = 0x20000000000001f\n\tCAP_MMAP_RWX                   = 0x20000000000003f\n\tCAP_MMAP_RX                    = 0x20000000000003d\n\tCAP_MMAP_W                     = 0x20000000000001e\n\tCAP_MMAP_WX                    = 0x20000000000003e\n\tCAP_MMAP_X                     = 0x20000000000003c\n\tCAP_PDGETPID                   = 0x400000000000200\n\tCAP_PDKILL                     = 0x400000000000800\n\tCAP_PDWAIT                     = 0x400000000000400\n\tCAP_PEELOFF                    = 0x200001000000000\n\tCAP_POLL_EVENT                 = 0x400000000000020\n\tCAP_PREAD                      = 0x20000000000000d\n\tCAP_PWRITE                     = 0x20000000000000e\n\tCAP_READ                       = 0x200000000000001\n\tCAP_RECV                       = 0x200000000000001\n\tCAP_RENAMEAT_SOURCE            = 0x200000004000400\n\tCAP_RENAMEAT_TARGET            = 0x200040000000400\n\tCAP_RIGHTS_VERSION             = 0x0\n\tCAP_RIGHTS_VERSION_00          = 0x0\n\tCAP_SEEK                       = 0x20000000000000c\n\tCAP_SEEK_TELL                  = 0x200000000000004\n\tCAP_SEM_GETVALUE               = 0x400000000000004\n\tCAP_SEM_POST                   = 0x400000000000008\n\tCAP_SEM_WAIT                   = 0x400000000000010\n\tCAP_SEND                       = 0x200000000000002\n\tCAP_SETSOCKOPT                 = 0x200002000000000\n\tCAP_SHUTDOWN                   = 0x200004000000000\n\tCAP_SOCK_CLIENT                = 0x200007780000003\n\tCAP_SOCK_SERVER                = 0x200007f60000003\n\tCAP_SYMLINKAT                  = 0x200000008000400\n\tCAP_TTYHOOK                    = 0x400000000000100\n\tCAP_UNLINKAT                   = 0x200000010000400\n\tCAP_UNUSED0_44                 = 0x200080000000000\n\tCAP_UNUSED0_57                 = 0x300000000000000\n\tCAP_UNUSED1_22                 = 0x400000000200000\n\tCAP_UNUSED1_57                 = 0x500000000000000\n\tCAP_WRITE                      = 0x200000000000002\n\tCFLUSH                         = 0xf\n\tCLOCAL                         = 0x8000\n\tCLOCK_MONOTONIC                = 0x4\n\tCLOCK_MONOTONIC_FAST           = 0xc\n\tCLOCK_MONOTONIC_PRECISE        = 0xb\n\tCLOCK_PROCESS_CPUTIME_ID       = 0xf\n\tCLOCK_PROF                     = 0x2\n\tCLOCK_REALTIME                 = 0x0\n\tCLOCK_REALTIME_FAST            = 0xa\n\tCLOCK_REALTIME_PRECISE         = 0x9\n\tCLOCK_SECOND                   = 0xd\n\tCLOCK_THREAD_CPUTIME_ID        = 0xe\n\tCLOCK_UPTIME                   = 0x5\n\tCLOCK_UPTIME_FAST              = 0x8\n\tCLOCK_UPTIME_PRECISE           = 0x7\n\tCLOCK_VIRTUAL                  = 0x1\n\tCREAD                          = 0x800\n\tCRTSCTS                        = 0x30000\n\tCS5                            = 0x0\n\tCS6                            = 0x100\n\tCS7                            = 0x200\n\tCS8                            = 0x300\n\tCSIZE                          = 0x300\n\tCSTART                         = 0x11\n\tCSTATUS                        = 0x14\n\tCSTOP                          = 0x13\n\tCSTOPB                         = 0x400\n\tCSUSP                          = 0x1a\n\tCTL_MAXNAME                    = 0x18\n\tCTL_NET                        = 0x4\n\tDLT_A429                       = 0xb8\n\tDLT_A653_ICM                   = 0xb9\n\tDLT_AIRONET_HEADER             = 0x78\n\tDLT_AOS                        = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394     = 0x8a\n\tDLT_ARCNET                     = 0x7\n\tDLT_ARCNET_LINUX               = 0x81\n\tDLT_ATM_CLIP                   = 0x13\n\tDLT_ATM_RFC1483                = 0xb\n\tDLT_AURORA                     = 0x7e\n\tDLT_AX25                       = 0x3\n\tDLT_AX25_KISS                  = 0xca\n\tDLT_BACNET_MS_TP               = 0xa5\n\tDLT_BLUETOOTH_BREDR_BB         = 0xff\n\tDLT_BLUETOOTH_HCI_H4           = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9\n\tDLT_BLUETOOTH_LE_LL            = 0xfb\n\tDLT_BLUETOOTH_LE_LL_WITH_PHDR  = 0x100\n\tDLT_BLUETOOTH_LINUX_MONITOR    = 0xfe\n\tDLT_CAN20B                     = 0xbe\n\tDLT_CAN_SOCKETCAN              = 0xe3\n\tDLT_CHAOS                      = 0x5\n\tDLT_CHDLC                      = 0x68\n\tDLT_CISCO_IOS                  = 0x76\n\tDLT_CLASS_NETBSD_RAWAF         = 0x2240000\n\tDLT_C_HDLC                     = 0x68\n\tDLT_C_HDLC_WITH_DIR            = 0xcd\n\tDLT_DBUS                       = 0xe7\n\tDLT_DECT                       = 0xdd\n\tDLT_DOCSIS                     = 0x8f\n\tDLT_DVB_CI                     = 0xeb\n\tDLT_ECONET                     = 0x73\n\tDLT_EN10MB                     = 0x1\n\tDLT_EN3MB                      = 0x2\n\tDLT_ENC                        = 0x6d\n\tDLT_EPON                       = 0x103\n\tDLT_ERF                        = 0xc5\n\tDLT_ERF_ETH                    = 0xaf\n\tDLT_ERF_POS                    = 0xb0\n\tDLT_FC_2                       = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS     = 0xe1\n\tDLT_FDDI                       = 0xa\n\tDLT_FLEXRAY                    = 0xd2\n\tDLT_FRELAY                     = 0x6b\n\tDLT_FRELAY_WITH_DIR            = 0xce\n\tDLT_GCOM_SERIAL                = 0xad\n\tDLT_GCOM_T1E1                  = 0xac\n\tDLT_GPF_F                      = 0xab\n\tDLT_GPF_T                      = 0xaa\n\tDLT_GPRS_LLC                   = 0xa9\n\tDLT_GSMTAP_ABIS                = 0xda\n\tDLT_GSMTAP_UM                  = 0xd9\n\tDLT_IBM_SN                     = 0x92\n\tDLT_IBM_SP                     = 0x91\n\tDLT_IEEE802                    = 0x6\n\tDLT_IEEE802_11                 = 0x69\n\tDLT_IEEE802_11_RADIO           = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS       = 0xa3\n\tDLT_IEEE802_15_4               = 0xc3\n\tDLT_IEEE802_15_4_LINUX         = 0xbf\n\tDLT_IEEE802_15_4_NOFCS         = 0xe6\n\tDLT_IEEE802_15_4_NONASK_PHY    = 0xd7\n\tDLT_IEEE802_16_MAC_CPS         = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO   = 0xc1\n\tDLT_INFINIBAND                 = 0xf7\n\tDLT_IPFILTER                   = 0x74\n\tDLT_IPMB                       = 0xc7\n\tDLT_IPMB_LINUX                 = 0xd1\n\tDLT_IPMI_HPM_2                 = 0x104\n\tDLT_IPNET                      = 0xe2\n\tDLT_IPOIB                      = 0xf2\n\tDLT_IPV4                       = 0xe4\n\tDLT_IPV6                       = 0xe5\n\tDLT_IP_OVER_FC                 = 0x7a\n\tDLT_ISO_14443                  = 0x108\n\tDLT_JUNIPER_ATM1               = 0x89\n\tDLT_JUNIPER_ATM2               = 0x87\n\tDLT_JUNIPER_ATM_CEMIC          = 0xee\n\tDLT_JUNIPER_CHDLC              = 0xb5\n\tDLT_JUNIPER_ES                 = 0x84\n\tDLT_JUNIPER_ETHER              = 0xb2\n\tDLT_JUNIPER_FIBRECHANNEL       = 0xea\n\tDLT_JUNIPER_FRELAY             = 0xb4\n\tDLT_JUNIPER_GGSN               = 0x85\n\tDLT_JUNIPER_ISM                = 0xc2\n\tDLT_JUNIPER_MFR                = 0x86\n\tDLT_JUNIPER_MLFR               = 0x83\n\tDLT_JUNIPER_MLPPP              = 0x82\n\tDLT_JUNIPER_MONITOR            = 0xa4\n\tDLT_JUNIPER_PIC_PEER           = 0xae\n\tDLT_JUNIPER_PPP                = 0xb3\n\tDLT_JUNIPER_PPPOE              = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM          = 0xa8\n\tDLT_JUNIPER_SERVICES           = 0x88\n\tDLT_JUNIPER_SRX_E2E            = 0xe9\n\tDLT_JUNIPER_ST                 = 0xc8\n\tDLT_JUNIPER_VP                 = 0xb7\n\tDLT_JUNIPER_VS                 = 0xe8\n\tDLT_LAPB_WITH_DIR              = 0xcf\n\tDLT_LAPD                       = 0xcb\n\tDLT_LIN                        = 0xd4\n\tDLT_LINUX_EVDEV                = 0xd8\n\tDLT_LINUX_IRDA                 = 0x90\n\tDLT_LINUX_LAPD                 = 0xb1\n\tDLT_LINUX_PPP_WITHDIRECTION    = 0xa6\n\tDLT_LINUX_SLL                  = 0x71\n\tDLT_LOOP                       = 0x6c\n\tDLT_LTALK                      = 0x72\n\tDLT_MATCHING_MAX               = 0x109\n\tDLT_MATCHING_MIN               = 0x68\n\tDLT_MFR                        = 0xb6\n\tDLT_MOST                       = 0xd3\n\tDLT_MPEG_2_TS                  = 0xf3\n\tDLT_MPLS                       = 0xdb\n\tDLT_MTP2                       = 0x8c\n\tDLT_MTP2_WITH_PHDR             = 0x8b\n\tDLT_MTP3                       = 0x8d\n\tDLT_MUX27010                   = 0xec\n\tDLT_NETANALYZER                = 0xf0\n\tDLT_NETANALYZER_TRANSPARENT    = 0xf1\n\tDLT_NETLINK                    = 0xfd\n\tDLT_NFC_LLCP                   = 0xf5\n\tDLT_NFLOG                      = 0xef\n\tDLT_NG40                       = 0xf4\n\tDLT_NULL                       = 0x0\n\tDLT_PCI_EXP                    = 0x7d\n\tDLT_PFLOG                      = 0x75\n\tDLT_PFSYNC                     = 0x79\n\tDLT_PKTAP                      = 0x102\n\tDLT_PPI                        = 0xc0\n\tDLT_PPP                        = 0x9\n\tDLT_PPP_BSDOS                  = 0xe\n\tDLT_PPP_ETHER                  = 0x33\n\tDLT_PPP_PPPD                   = 0xa6\n\tDLT_PPP_SERIAL                 = 0x32\n\tDLT_PPP_WITH_DIR               = 0xcc\n\tDLT_PPP_WITH_DIRECTION         = 0xa6\n\tDLT_PRISM_HEADER               = 0x77\n\tDLT_PROFIBUS_DL                = 0x101\n\tDLT_PRONET                     = 0x4\n\tDLT_RAIF1                      = 0xc6\n\tDLT_RAW                        = 0xc\n\tDLT_RDS                        = 0x109\n\tDLT_REDBACK_SMARTEDGE          = 0x20\n\tDLT_RIO                        = 0x7c\n\tDLT_RTAC_SERIAL                = 0xfa\n\tDLT_SCCP                       = 0x8e\n\tDLT_SCTP                       = 0xf8\n\tDLT_SITA                       = 0xc4\n\tDLT_SLIP                       = 0x8\n\tDLT_SLIP_BSDOS                 = 0xd\n\tDLT_STANAG_5066_D_PDU          = 0xed\n\tDLT_SUNATM                     = 0x7b\n\tDLT_SYMANTEC_FIREWALL          = 0x63\n\tDLT_TZSP                       = 0x80\n\tDLT_USB                        = 0xba\n\tDLT_USBPCAP                    = 0xf9\n\tDLT_USB_FREEBSD                = 0xba\n\tDLT_USB_LINUX                  = 0xbd\n\tDLT_USB_LINUX_MMAPPED          = 0xdc\n\tDLT_USER0                      = 0x93\n\tDLT_USER1                      = 0x94\n\tDLT_USER10                     = 0x9d\n\tDLT_USER11                     = 0x9e\n\tDLT_USER12                     = 0x9f\n\tDLT_USER13                     = 0xa0\n\tDLT_USER14                     = 0xa1\n\tDLT_USER15                     = 0xa2\n\tDLT_USER2                      = 0x95\n\tDLT_USER3                      = 0x96\n\tDLT_USER4                      = 0x97\n\tDLT_USER5                      = 0x98\n\tDLT_USER6                      = 0x99\n\tDLT_USER7                      = 0x9a\n\tDLT_USER8                      = 0x9b\n\tDLT_USER9                      = 0x9c\n\tDLT_WATTSTOPPER_DLM            = 0x107\n\tDLT_WIHART                     = 0xdf\n\tDLT_WIRESHARK_UPPER_PDU        = 0xfc\n\tDLT_X2E_SERIAL                 = 0xd5\n\tDLT_X2E_XORAYA                 = 0xd6\n\tDLT_ZWAVE_R1_R2                = 0x105\n\tDLT_ZWAVE_R3                   = 0x106\n\tDT_BLK                         = 0x6\n\tDT_CHR                         = 0x2\n\tDT_DIR                         = 0x4\n\tDT_FIFO                        = 0x1\n\tDT_LNK                         = 0xa\n\tDT_REG                         = 0x8\n\tDT_SOCK                        = 0xc\n\tDT_UNKNOWN                     = 0x0\n\tDT_WHT                         = 0xe\n\tECHO                           = 0x8\n\tECHOCTL                        = 0x40\n\tECHOE                          = 0x2\n\tECHOK                          = 0x4\n\tECHOKE                         = 0x1\n\tECHONL                         = 0x10\n\tECHOPRT                        = 0x20\n\tEVFILT_AIO                     = -0x3\n\tEVFILT_FS                      = -0x9\n\tEVFILT_LIO                     = -0xa\n\tEVFILT_PROC                    = -0x5\n\tEVFILT_PROCDESC                = -0x8\n\tEVFILT_READ                    = -0x1\n\tEVFILT_SENDFILE                = -0xc\n\tEVFILT_SIGNAL                  = -0x6\n\tEVFILT_SYSCOUNT                = 0xc\n\tEVFILT_TIMER                   = -0x7\n\tEVFILT_USER                    = -0xb\n\tEVFILT_VNODE                   = -0x4\n\tEVFILT_WRITE                   = -0x2\n\tEV_ADD                         = 0x1\n\tEV_CLEAR                       = 0x20\n\tEV_DELETE                      = 0x2\n\tEV_DISABLE                     = 0x8\n\tEV_DISPATCH                    = 0x80\n\tEV_DROP                        = 0x1000\n\tEV_ENABLE                      = 0x4\n\tEV_EOF                         = 0x8000\n\tEV_ERROR                       = 0x4000\n\tEV_FLAG1                       = 0x2000\n\tEV_FLAG2                       = 0x4000\n\tEV_FORCEONESHOT                = 0x100\n\tEV_ONESHOT                     = 0x10\n\tEV_RECEIPT                     = 0x40\n\tEV_SYSFLAGS                    = 0xf000\n\tEXTA                           = 0x4b00\n\tEXTATTR_NAMESPACE_EMPTY        = 0x0\n\tEXTATTR_NAMESPACE_SYSTEM       = 0x2\n\tEXTATTR_NAMESPACE_USER         = 0x1\n\tEXTB                           = 0x9600\n\tEXTPROC                        = 0x800\n\tFD_CLOEXEC                     = 0x1\n\tFD_SETSIZE                     = 0x400\n\tFLUSHO                         = 0x800000\n\tF_CANCEL                       = 0x5\n\tF_DUP2FD                       = 0xa\n\tF_DUP2FD_CLOEXEC               = 0x12\n\tF_DUPFD                        = 0x0\n\tF_DUPFD_CLOEXEC                = 0x11\n\tF_GETFD                        = 0x1\n\tF_GETFL                        = 0x3\n\tF_GETLK                        = 0xb\n\tF_GETOWN                       = 0x5\n\tF_OGETLK                       = 0x7\n\tF_OK                           = 0x0\n\tF_OSETLK                       = 0x8\n\tF_OSETLKW                      = 0x9\n\tF_RDAHEAD                      = 0x10\n\tF_RDLCK                        = 0x1\n\tF_READAHEAD                    = 0xf\n\tF_SETFD                        = 0x2\n\tF_SETFL                        = 0x4\n\tF_SETLK                        = 0xc\n\tF_SETLKW                       = 0xd\n\tF_SETLK_REMOTE                 = 0xe\n\tF_SETOWN                       = 0x6\n\tF_UNLCK                        = 0x2\n\tF_UNLCKSYS                     = 0x4\n\tF_WRLCK                        = 0x3\n\tHUPCL                          = 0x4000\n\tICANON                         = 0x100\n\tICMP6_FILTER                   = 0x12\n\tICRNL                          = 0x100\n\tIEXTEN                         = 0x400\n\tIFAN_ARRIVAL                   = 0x0\n\tIFAN_DEPARTURE                 = 0x1\n\tIFF_ALLMULTI                   = 0x200\n\tIFF_ALTPHYS                    = 0x4000\n\tIFF_BROADCAST                  = 0x2\n\tIFF_CANTCHANGE                 = 0x218f52\n\tIFF_CANTCONFIG                 = 0x10000\n\tIFF_DEBUG                      = 0x4\n\tIFF_DRV_OACTIVE                = 0x400\n\tIFF_DRV_RUNNING                = 0x40\n\tIFF_DYING                      = 0x200000\n\tIFF_LINK0                      = 0x1000\n\tIFF_LINK1                      = 0x2000\n\tIFF_LINK2                      = 0x4000\n\tIFF_LOOPBACK                   = 0x8\n\tIFF_MONITOR                    = 0x40000\n\tIFF_MULTICAST                  = 0x8000\n\tIFF_NOARP                      = 0x80\n\tIFF_OACTIVE                    = 0x400\n\tIFF_POINTOPOINT                = 0x10\n\tIFF_PPROMISC                   = 0x20000\n\tIFF_PROMISC                    = 0x100\n\tIFF_RENAMING                   = 0x400000\n\tIFF_RUNNING                    = 0x40\n\tIFF_SIMPLEX                    = 0x800\n\tIFF_STATICARP                  = 0x80000\n\tIFF_UP                         = 0x1\n\tIFNAMSIZ                       = 0x10\n\tIFT_BRIDGE                     = 0xd1\n\tIFT_CARP                       = 0xf8\n\tIFT_IEEE1394                   = 0x90\n\tIFT_INFINIBAND                 = 0xc7\n\tIFT_L2VLAN                     = 0x87\n\tIFT_L3IPVLAN                   = 0x88\n\tIFT_PPP                        = 0x17\n\tIFT_PROPVIRTUAL                = 0x35\n\tIGNBRK                         = 0x1\n\tIGNCR                          = 0x80\n\tIGNPAR                         = 0x4\n\tIMAXBEL                        = 0x2000\n\tINLCR                          = 0x40\n\tINPCK                          = 0x10\n\tIN_CLASSA_HOST                 = 0xffffff\n\tIN_CLASSA_MAX                  = 0x80\n\tIN_CLASSA_NET                  = 0xff000000\n\tIN_CLASSA_NSHIFT               = 0x18\n\tIN_CLASSB_HOST                 = 0xffff\n\tIN_CLASSB_MAX                  = 0x10000\n\tIN_CLASSB_NET                  = 0xffff0000\n\tIN_CLASSB_NSHIFT               = 0x10\n\tIN_CLASSC_HOST                 = 0xff\n\tIN_CLASSC_NET                  = 0xffffff00\n\tIN_CLASSC_NSHIFT               = 0x8\n\tIN_CLASSD_HOST                 = 0xfffffff\n\tIN_CLASSD_NET                  = 0xf0000000\n\tIN_CLASSD_NSHIFT               = 0x1c\n\tIN_LOOPBACKNET                 = 0x7f\n\tIN_RFC3021_MASK                = 0xfffffffe\n\tIPPROTO_3PC                    = 0x22\n\tIPPROTO_ADFS                   = 0x44\n\tIPPROTO_AH                     = 0x33\n\tIPPROTO_AHIP                   = 0x3d\n\tIPPROTO_APES                   = 0x63\n\tIPPROTO_ARGUS                  = 0xd\n\tIPPROTO_AX25                   = 0x5d\n\tIPPROTO_BHA                    = 0x31\n\tIPPROTO_BLT                    = 0x1e\n\tIPPROTO_BRSATMON               = 0x4c\n\tIPPROTO_CARP                   = 0x70\n\tIPPROTO_CFTP                   = 0x3e\n\tIPPROTO_CHAOS                  = 0x10\n\tIPPROTO_CMTP                   = 0x26\n\tIPPROTO_CPHB                   = 0x49\n\tIPPROTO_CPNX                   = 0x48\n\tIPPROTO_DDP                    = 0x25\n\tIPPROTO_DGP                    = 0x56\n\tIPPROTO_DIVERT                 = 0x102\n\tIPPROTO_DONE                   = 0x101\n\tIPPROTO_DSTOPTS                = 0x3c\n\tIPPROTO_EGP                    = 0x8\n\tIPPROTO_EMCON                  = 0xe\n\tIPPROTO_ENCAP                  = 0x62\n\tIPPROTO_EON                    = 0x50\n\tIPPROTO_ESP                    = 0x32\n\tIPPROTO_ETHERIP                = 0x61\n\tIPPROTO_FRAGMENT               = 0x2c\n\tIPPROTO_GGP                    = 0x3\n\tIPPROTO_GMTP                   = 0x64\n\tIPPROTO_GRE                    = 0x2f\n\tIPPROTO_HELLO                  = 0x3f\n\tIPPROTO_HIP                    = 0x8b\n\tIPPROTO_HMP                    = 0x14\n\tIPPROTO_HOPOPTS                = 0x0\n\tIPPROTO_ICMP                   = 0x1\n\tIPPROTO_ICMPV6                 = 0x3a\n\tIPPROTO_IDP                    = 0x16\n\tIPPROTO_IDPR                   = 0x23\n\tIPPROTO_IDRP                   = 0x2d\n\tIPPROTO_IGMP                   = 0x2\n\tIPPROTO_IGP                    = 0x55\n\tIPPROTO_IGRP                   = 0x58\n\tIPPROTO_IL                     = 0x28\n\tIPPROTO_INLSP                  = 0x34\n\tIPPROTO_INP                    = 0x20\n\tIPPROTO_IP                     = 0x0\n\tIPPROTO_IPCOMP                 = 0x6c\n\tIPPROTO_IPCV                   = 0x47\n\tIPPROTO_IPEIP                  = 0x5e\n\tIPPROTO_IPIP                   = 0x4\n\tIPPROTO_IPPC                   = 0x43\n\tIPPROTO_IPV4                   = 0x4\n\tIPPROTO_IPV6                   = 0x29\n\tIPPROTO_IRTP                   = 0x1c\n\tIPPROTO_KRYPTOLAN              = 0x41\n\tIPPROTO_LARP                   = 0x5b\n\tIPPROTO_LEAF1                  = 0x19\n\tIPPROTO_LEAF2                  = 0x1a\n\tIPPROTO_MAX                    = 0x100\n\tIPPROTO_MEAS                   = 0x13\n\tIPPROTO_MH                     = 0x87\n\tIPPROTO_MHRP                   = 0x30\n\tIPPROTO_MICP                   = 0x5f\n\tIPPROTO_MOBILE                 = 0x37\n\tIPPROTO_MPLS                   = 0x89\n\tIPPROTO_MTP                    = 0x5c\n\tIPPROTO_MUX                    = 0x12\n\tIPPROTO_ND                     = 0x4d\n\tIPPROTO_NHRP                   = 0x36\n\tIPPROTO_NONE                   = 0x3b\n\tIPPROTO_NSP                    = 0x1f\n\tIPPROTO_NVPII                  = 0xb\n\tIPPROTO_OLD_DIVERT             = 0xfe\n\tIPPROTO_OSPFIGP                = 0x59\n\tIPPROTO_PFSYNC                 = 0xf0\n\tIPPROTO_PGM                    = 0x71\n\tIPPROTO_PIGP                   = 0x9\n\tIPPROTO_PIM                    = 0x67\n\tIPPROTO_PRM                    = 0x15\n\tIPPROTO_PUP                    = 0xc\n\tIPPROTO_PVP                    = 0x4b\n\tIPPROTO_RAW                    = 0xff\n\tIPPROTO_RCCMON                 = 0xa\n\tIPPROTO_RDP                    = 0x1b\n\tIPPROTO_RESERVED_253           = 0xfd\n\tIPPROTO_RESERVED_254           = 0xfe\n\tIPPROTO_ROUTING                = 0x2b\n\tIPPROTO_RSVP                   = 0x2e\n\tIPPROTO_RVD                    = 0x42\n\tIPPROTO_SATEXPAK               = 0x40\n\tIPPROTO_SATMON                 = 0x45\n\tIPPROTO_SCCSP                  = 0x60\n\tIPPROTO_SCTP                   = 0x84\n\tIPPROTO_SDRP                   = 0x2a\n\tIPPROTO_SEND                   = 0x103\n\tIPPROTO_SEP                    = 0x21\n\tIPPROTO_SHIM6                  = 0x8c\n\tIPPROTO_SKIP                   = 0x39\n\tIPPROTO_SPACER                 = 0x7fff\n\tIPPROTO_SRPC                   = 0x5a\n\tIPPROTO_ST                     = 0x7\n\tIPPROTO_SVMTP                  = 0x52\n\tIPPROTO_SWIPE                  = 0x35\n\tIPPROTO_TCF                    = 0x57\n\tIPPROTO_TCP                    = 0x6\n\tIPPROTO_TLSP                   = 0x38\n\tIPPROTO_TP                     = 0x1d\n\tIPPROTO_TPXX                   = 0x27\n\tIPPROTO_TRUNK1                 = 0x17\n\tIPPROTO_TRUNK2                 = 0x18\n\tIPPROTO_TTP                    = 0x54\n\tIPPROTO_UDP                    = 0x11\n\tIPPROTO_UDPLITE                = 0x88\n\tIPPROTO_VINES                  = 0x53\n\tIPPROTO_VISA                   = 0x46\n\tIPPROTO_VMTP                   = 0x51\n\tIPPROTO_WBEXPAK                = 0x4f\n\tIPPROTO_WBMON                  = 0x4e\n\tIPPROTO_WSN                    = 0x4a\n\tIPPROTO_XNET                   = 0xf\n\tIPPROTO_XTP                    = 0x24\n\tIPV6_AUTOFLOWLABEL             = 0x3b\n\tIPV6_BINDANY                   = 0x40\n\tIPV6_BINDMULTI                 = 0x41\n\tIPV6_BINDV6ONLY                = 0x1b\n\tIPV6_CHECKSUM                  = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS    = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP    = 0x1\n\tIPV6_DEFHLIM                   = 0x40\n\tIPV6_DONTFRAG                  = 0x3e\n\tIPV6_DSTOPTS                   = 0x32\n\tIPV6_FLOWID                    = 0x43\n\tIPV6_FLOWINFO_MASK             = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK            = 0xffff0f00\n\tIPV6_FLOWTYPE                  = 0x44\n\tIPV6_FRAGTTL                   = 0x78\n\tIPV6_FW_ADD                    = 0x1e\n\tIPV6_FW_DEL                    = 0x1f\n\tIPV6_FW_FLUSH                  = 0x20\n\tIPV6_FW_GET                    = 0x22\n\tIPV6_FW_ZERO                   = 0x21\n\tIPV6_HLIMDEC                   = 0x1\n\tIPV6_HOPLIMIT                  = 0x2f\n\tIPV6_HOPOPTS                   = 0x31\n\tIPV6_IPSEC_POLICY              = 0x1c\n\tIPV6_JOIN_GROUP                = 0xc\n\tIPV6_LEAVE_GROUP               = 0xd\n\tIPV6_MAXHLIM                   = 0xff\n\tIPV6_MAXOPTHDR                 = 0x800\n\tIPV6_MAXPACKET                 = 0xffff\n\tIPV6_MAX_GROUP_SRC_FILTER      = 0x200\n\tIPV6_MAX_MEMBERSHIPS           = 0xfff\n\tIPV6_MAX_SOCK_SRC_FILTER       = 0x80\n\tIPV6_MIN_MEMBERSHIPS           = 0x1f\n\tIPV6_MMTU                      = 0x500\n\tIPV6_MSFILTER                  = 0x4a\n\tIPV6_MULTICAST_HOPS            = 0xa\n\tIPV6_MULTICAST_IF              = 0x9\n\tIPV6_MULTICAST_LOOP            = 0xb\n\tIPV6_NEXTHOP                   = 0x30\n\tIPV6_PATHMTU                   = 0x2c\n\tIPV6_PKTINFO                   = 0x2e\n\tIPV6_PORTRANGE                 = 0xe\n\tIPV6_PORTRANGE_DEFAULT         = 0x0\n\tIPV6_PORTRANGE_HIGH            = 0x1\n\tIPV6_PORTRANGE_LOW             = 0x2\n\tIPV6_PREFER_TEMPADDR           = 0x3f\n\tIPV6_RECVDSTOPTS               = 0x28\n\tIPV6_RECVFLOWID                = 0x46\n\tIPV6_RECVHOPLIMIT              = 0x25\n\tIPV6_RECVHOPOPTS               = 0x27\n\tIPV6_RECVPATHMTU               = 0x2b\n\tIPV6_RECVPKTINFO               = 0x24\n\tIPV6_RECVRSSBUCKETID           = 0x47\n\tIPV6_RECVRTHDR                 = 0x26\n\tIPV6_RECVTCLASS                = 0x39\n\tIPV6_RSSBUCKETID               = 0x45\n\tIPV6_RSS_LISTEN_BUCKET         = 0x42\n\tIPV6_RTHDR                     = 0x33\n\tIPV6_RTHDRDSTOPTS              = 0x23\n\tIPV6_RTHDR_LOOSE               = 0x0\n\tIPV6_RTHDR_STRICT              = 0x1\n\tIPV6_RTHDR_TYPE_0              = 0x0\n\tIPV6_SOCKOPT_RESERVED1         = 0x3\n\tIPV6_TCLASS                    = 0x3d\n\tIPV6_UNICAST_HOPS              = 0x4\n\tIPV6_USE_MIN_MTU               = 0x2a\n\tIPV6_V6ONLY                    = 0x1b\n\tIPV6_VERSION                   = 0x60\n\tIPV6_VERSION_MASK              = 0xf0\n\tIP_ADD_MEMBERSHIP              = 0xc\n\tIP_ADD_SOURCE_MEMBERSHIP       = 0x46\n\tIP_BINDANY                     = 0x18\n\tIP_BINDMULTI                   = 0x19\n\tIP_BLOCK_SOURCE                = 0x48\n\tIP_DEFAULT_MULTICAST_LOOP      = 0x1\n\tIP_DEFAULT_MULTICAST_TTL       = 0x1\n\tIP_DF                          = 0x4000\n\tIP_DONTFRAG                    = 0x43\n\tIP_DROP_MEMBERSHIP             = 0xd\n\tIP_DROP_SOURCE_MEMBERSHIP      = 0x47\n\tIP_DUMMYNET3                   = 0x31\n\tIP_DUMMYNET_CONFIGURE          = 0x3c\n\tIP_DUMMYNET_DEL                = 0x3d\n\tIP_DUMMYNET_FLUSH              = 0x3e\n\tIP_DUMMYNET_GET                = 0x40\n\tIP_FLOWID                      = 0x5a\n\tIP_FLOWTYPE                    = 0x5b\n\tIP_FW3                         = 0x30\n\tIP_FW_ADD                      = 0x32\n\tIP_FW_DEL                      = 0x33\n\tIP_FW_FLUSH                    = 0x34\n\tIP_FW_GET                      = 0x36\n\tIP_FW_NAT_CFG                  = 0x38\n\tIP_FW_NAT_DEL                  = 0x39\n\tIP_FW_NAT_GET_CONFIG           = 0x3a\n\tIP_FW_NAT_GET_LOG              = 0x3b\n\tIP_FW_RESETLOG                 = 0x37\n\tIP_FW_TABLE_ADD                = 0x28\n\tIP_FW_TABLE_DEL                = 0x29\n\tIP_FW_TABLE_FLUSH              = 0x2a\n\tIP_FW_TABLE_GETSIZE            = 0x2b\n\tIP_FW_TABLE_LIST               = 0x2c\n\tIP_FW_ZERO                     = 0x35\n\tIP_HDRINCL                     = 0x2\n\tIP_IPSEC_POLICY                = 0x15\n\tIP_MAXPACKET                   = 0xffff\n\tIP_MAX_GROUP_SRC_FILTER        = 0x200\n\tIP_MAX_MEMBERSHIPS             = 0xfff\n\tIP_MAX_SOCK_MUTE_FILTER        = 0x80\n\tIP_MAX_SOCK_SRC_FILTER         = 0x80\n\tIP_MAX_SOURCE_FILTER           = 0x400\n\tIP_MF                          = 0x2000\n\tIP_MINTTL                      = 0x42\n\tIP_MIN_MEMBERSHIPS             = 0x1f\n\tIP_MSFILTER                    = 0x4a\n\tIP_MSS                         = 0x240\n\tIP_MULTICAST_IF                = 0x9\n\tIP_MULTICAST_LOOP              = 0xb\n\tIP_MULTICAST_TTL               = 0xa\n\tIP_MULTICAST_VIF               = 0xe\n\tIP_OFFMASK                     = 0x1fff\n\tIP_ONESBCAST                   = 0x17\n\tIP_OPTIONS                     = 0x1\n\tIP_PORTRANGE                   = 0x13\n\tIP_PORTRANGE_DEFAULT           = 0x0\n\tIP_PORTRANGE_HIGH              = 0x1\n\tIP_PORTRANGE_LOW               = 0x2\n\tIP_RECVDSTADDR                 = 0x7\n\tIP_RECVFLOWID                  = 0x5d\n\tIP_RECVIF                      = 0x14\n\tIP_RECVOPTS                    = 0x5\n\tIP_RECVRETOPTS                 = 0x6\n\tIP_RECVRSSBUCKETID             = 0x5e\n\tIP_RECVTOS                     = 0x44\n\tIP_RECVTTL                     = 0x41\n\tIP_RETOPTS                     = 0x8\n\tIP_RF                          = 0x8000\n\tIP_RSSBUCKETID                 = 0x5c\n\tIP_RSS_LISTEN_BUCKET           = 0x1a\n\tIP_RSVP_OFF                    = 0x10\n\tIP_RSVP_ON                     = 0xf\n\tIP_RSVP_VIF_OFF                = 0x12\n\tIP_RSVP_VIF_ON                 = 0x11\n\tIP_SENDSRCADDR                 = 0x7\n\tIP_TOS                         = 0x3\n\tIP_TTL                         = 0x4\n\tIP_UNBLOCK_SOURCE              = 0x49\n\tISIG                           = 0x80\n\tISTRIP                         = 0x20\n\tIXANY                          = 0x800\n\tIXOFF                          = 0x400\n\tIXON                           = 0x200\n\tLOCK_EX                        = 0x2\n\tLOCK_NB                        = 0x4\n\tLOCK_SH                        = 0x1\n\tLOCK_UN                        = 0x8\n\tMADV_AUTOSYNC                  = 0x7\n\tMADV_CORE                      = 0x9\n\tMADV_DONTNEED                  = 0x4\n\tMADV_FREE                      = 0x5\n\tMADV_NOCORE                    = 0x8\n\tMADV_NORMAL                    = 0x0\n\tMADV_NOSYNC                    = 0x6\n\tMADV_PROTECT                   = 0xa\n\tMADV_RANDOM                    = 0x1\n\tMADV_SEQUENTIAL                = 0x2\n\tMADV_WILLNEED                  = 0x3\n\tMAP_ALIGNED_SUPER              = 0x1000000\n\tMAP_ALIGNMENT_MASK             = -0x1000000\n\tMAP_ALIGNMENT_SHIFT            = 0x18\n\tMAP_ANON                       = 0x1000\n\tMAP_ANONYMOUS                  = 0x1000\n\tMAP_COPY                       = 0x2\n\tMAP_EXCL                       = 0x4000\n\tMAP_FILE                       = 0x0\n\tMAP_FIXED                      = 0x10\n\tMAP_GUARD                      = 0x2000\n\tMAP_HASSEMAPHORE               = 0x200\n\tMAP_NOCORE                     = 0x20000\n\tMAP_NOSYNC                     = 0x800\n\tMAP_PREFAULT_READ              = 0x40000\n\tMAP_PRIVATE                    = 0x2\n\tMAP_RESERVED0020               = 0x20\n\tMAP_RESERVED0040               = 0x40\n\tMAP_RESERVED0080               = 0x80\n\tMAP_RESERVED0100               = 0x100\n\tMAP_SHARED                     = 0x1\n\tMAP_STACK                      = 0x400\n\tMCL_CURRENT                    = 0x1\n\tMCL_FUTURE                     = 0x2\n\tMNT_ACLS                       = 0x8000000\n\tMNT_ASYNC                      = 0x40\n\tMNT_AUTOMOUNTED                = 0x200000000\n\tMNT_BYFSID                     = 0x8000000\n\tMNT_CMDFLAGS                   = 0xd0f0000\n\tMNT_DEFEXPORTED                = 0x200\n\tMNT_DELEXPORT                  = 0x20000\n\tMNT_EXKERB                     = 0x800\n\tMNT_EXPORTANON                 = 0x400\n\tMNT_EXPORTED                   = 0x100\n\tMNT_EXPUBLIC                   = 0x20000000\n\tMNT_EXRDONLY                   = 0x80\n\tMNT_FORCE                      = 0x80000\n\tMNT_GJOURNAL                   = 0x2000000\n\tMNT_IGNORE                     = 0x800000\n\tMNT_LAZY                       = 0x3\n\tMNT_LOCAL                      = 0x1000\n\tMNT_MULTILABEL                 = 0x4000000\n\tMNT_NFS4ACLS                   = 0x10\n\tMNT_NOATIME                    = 0x10000000\n\tMNT_NOCLUSTERR                 = 0x40000000\n\tMNT_NOCLUSTERW                 = 0x80000000\n\tMNT_NOEXEC                     = 0x4\n\tMNT_NONBUSY                    = 0x4000000\n\tMNT_NOSUID                     = 0x8\n\tMNT_NOSYMFOLLOW                = 0x400000\n\tMNT_NOWAIT                     = 0x2\n\tMNT_QUOTA                      = 0x2000\n\tMNT_RDONLY                     = 0x1\n\tMNT_RELOAD                     = 0x40000\n\tMNT_ROOTFS                     = 0x4000\n\tMNT_SNAPSHOT                   = 0x1000000\n\tMNT_SOFTDEP                    = 0x200000\n\tMNT_SUIDDIR                    = 0x100000\n\tMNT_SUJ                        = 0x100000000\n\tMNT_SUSPEND                    = 0x4\n\tMNT_SYNCHRONOUS                = 0x2\n\tMNT_UNION                      = 0x20\n\tMNT_UPDATE                     = 0x10000\n\tMNT_UPDATEMASK                 = 0x2d8d0807e\n\tMNT_USER                       = 0x8000\n\tMNT_VISFLAGMASK                = 0x3fef0ffff\n\tMNT_WAIT                       = 0x1\n\tMSG_CMSG_CLOEXEC               = 0x40000\n\tMSG_COMPAT                     = 0x8000\n\tMSG_CTRUNC                     = 0x20\n\tMSG_DONTROUTE                  = 0x4\n\tMSG_DONTWAIT                   = 0x80\n\tMSG_EOF                        = 0x100\n\tMSG_EOR                        = 0x8\n\tMSG_NBIO                       = 0x4000\n\tMSG_NOSIGNAL                   = 0x20000\n\tMSG_NOTIFICATION               = 0x2000\n\tMSG_OOB                        = 0x1\n\tMSG_PEEK                       = 0x2\n\tMSG_TRUNC                      = 0x10\n\tMSG_WAITALL                    = 0x40\n\tMSG_WAITFORONE                 = 0x80000\n\tMS_ASYNC                       = 0x1\n\tMS_INVALIDATE                  = 0x2\n\tMS_SYNC                        = 0x0\n\tNAME_MAX                       = 0xff\n\tNET_RT_DUMP                    = 0x1\n\tNET_RT_FLAGS                   = 0x2\n\tNET_RT_IFLIST                  = 0x3\n\tNET_RT_IFLISTL                 = 0x5\n\tNET_RT_IFMALIST                = 0x4\n\tNOFLSH                         = 0x80000000\n\tNOKERNINFO                     = 0x2000000\n\tNOTE_ATTRIB                    = 0x8\n\tNOTE_CHILD                     = 0x4\n\tNOTE_CLOSE                     = 0x100\n\tNOTE_CLOSE_WRITE               = 0x200\n\tNOTE_DELETE                    = 0x1\n\tNOTE_EXEC                      = 0x20000000\n\tNOTE_EXIT                      = 0x80000000\n\tNOTE_EXTEND                    = 0x4\n\tNOTE_FFAND                     = 0x40000000\n\tNOTE_FFCOPY                    = 0xc0000000\n\tNOTE_FFCTRLMASK                = 0xc0000000\n\tNOTE_FFLAGSMASK                = 0xffffff\n\tNOTE_FFNOP                     = 0x0\n\tNOTE_FFOR                      = 0x80000000\n\tNOTE_FILE_POLL                 = 0x2\n\tNOTE_FORK                      = 0x40000000\n\tNOTE_LINK                      = 0x10\n\tNOTE_LOWAT                     = 0x1\n\tNOTE_MSECONDS                  = 0x2\n\tNOTE_NSECONDS                  = 0x8\n\tNOTE_OPEN                      = 0x80\n\tNOTE_PCTRLMASK                 = 0xf0000000\n\tNOTE_PDATAMASK                 = 0xfffff\n\tNOTE_READ                      = 0x400\n\tNOTE_RENAME                    = 0x20\n\tNOTE_REVOKE                    = 0x40\n\tNOTE_SECONDS                   = 0x1\n\tNOTE_TRACK                     = 0x1\n\tNOTE_TRACKERR                  = 0x2\n\tNOTE_TRIGGER                   = 0x1000000\n\tNOTE_USECONDS                  = 0x4\n\tNOTE_WRITE                     = 0x2\n\tOCRNL                          = 0x10\n\tONLCR                          = 0x2\n\tONLRET                         = 0x40\n\tONOCR                          = 0x20\n\tONOEOT                         = 0x8\n\tOPOST                          = 0x1\n\tOXTABS                         = 0x4\n\tO_ACCMODE                      = 0x3\n\tO_APPEND                       = 0x8\n\tO_ASYNC                        = 0x40\n\tO_CLOEXEC                      = 0x100000\n\tO_CREAT                        = 0x200\n\tO_DIRECT                       = 0x10000\n\tO_DIRECTORY                    = 0x20000\n\tO_EXCL                         = 0x800\n\tO_EXEC                         = 0x40000\n\tO_EXLOCK                       = 0x20\n\tO_FSYNC                        = 0x80\n\tO_NDELAY                       = 0x4\n\tO_NOCTTY                       = 0x8000\n\tO_NOFOLLOW                     = 0x100\n\tO_NONBLOCK                     = 0x4\n\tO_RDONLY                       = 0x0\n\tO_RDWR                         = 0x2\n\tO_SHLOCK                       = 0x10\n\tO_SYNC                         = 0x80\n\tO_TRUNC                        = 0x400\n\tO_TTY_INIT                     = 0x80000\n\tO_VERIFY                       = 0x200000\n\tO_WRONLY                       = 0x1\n\tPARENB                         = 0x1000\n\tPARMRK                         = 0x8\n\tPARODD                         = 0x2000\n\tPENDIN                         = 0x20000000\n\tPRIO_PGRP                      = 0x1\n\tPRIO_PROCESS                   = 0x0\n\tPRIO_USER                      = 0x2\n\tPROT_EXEC                      = 0x4\n\tPROT_NONE                      = 0x0\n\tPROT_READ                      = 0x1\n\tPROT_WRITE                     = 0x2\n\tRLIMIT_AS                      = 0xa\n\tRLIMIT_CORE                    = 0x4\n\tRLIMIT_CPU                     = 0x0\n\tRLIMIT_DATA                    = 0x2\n\tRLIMIT_FSIZE                   = 0x1\n\tRLIMIT_MEMLOCK                 = 0x6\n\tRLIMIT_NOFILE                  = 0x8\n\tRLIMIT_NPROC                   = 0x7\n\tRLIMIT_RSS                     = 0x5\n\tRLIMIT_STACK                   = 0x3\n\tRLIM_INFINITY                  = 0x7fffffffffffffff\n\tRTAX_AUTHOR                    = 0x6\n\tRTAX_BRD                       = 0x7\n\tRTAX_DST                       = 0x0\n\tRTAX_GATEWAY                   = 0x1\n\tRTAX_GENMASK                   = 0x3\n\tRTAX_IFA                       = 0x5\n\tRTAX_IFP                       = 0x4\n\tRTAX_MAX                       = 0x8\n\tRTAX_NETMASK                   = 0x2\n\tRTA_AUTHOR                     = 0x40\n\tRTA_BRD                        = 0x80\n\tRTA_DST                        = 0x1\n\tRTA_GATEWAY                    = 0x2\n\tRTA_GENMASK                    = 0x8\n\tRTA_IFA                        = 0x20\n\tRTA_IFP                        = 0x10\n\tRTA_NETMASK                    = 0x4\n\tRTF_BLACKHOLE                  = 0x1000\n\tRTF_BROADCAST                  = 0x400000\n\tRTF_DONE                       = 0x40\n\tRTF_DYNAMIC                    = 0x10\n\tRTF_FIXEDMTU                   = 0x80000\n\tRTF_FMASK                      = 0x1004d808\n\tRTF_GATEWAY                    = 0x2\n\tRTF_GWFLAG_COMPAT              = 0x80000000\n\tRTF_HOST                       = 0x4\n\tRTF_LLDATA                     = 0x400\n\tRTF_LLINFO                     = 0x400\n\tRTF_LOCAL                      = 0x200000\n\tRTF_MODIFIED                   = 0x20\n\tRTF_MULTICAST                  = 0x800000\n\tRTF_PINNED                     = 0x100000\n\tRTF_PROTO1                     = 0x8000\n\tRTF_PROTO2                     = 0x4000\n\tRTF_PROTO3                     = 0x40000\n\tRTF_REJECT                     = 0x8\n\tRTF_RNH_LOCKED                 = 0x40000000\n\tRTF_STATIC                     = 0x800\n\tRTF_STICKY                     = 0x10000000\n\tRTF_UP                         = 0x1\n\tRTF_XRESOLVE                   = 0x200\n\tRTM_ADD                        = 0x1\n\tRTM_CHANGE                     = 0x3\n\tRTM_DELADDR                    = 0xd\n\tRTM_DELETE                     = 0x2\n\tRTM_DELMADDR                   = 0x10\n\tRTM_GET                        = 0x4\n\tRTM_IEEE80211                  = 0x12\n\tRTM_IFANNOUNCE                 = 0x11\n\tRTM_IFINFO                     = 0xe\n\tRTM_LOCK                       = 0x8\n\tRTM_LOSING                     = 0x5\n\tRTM_MISS                       = 0x7\n\tRTM_NEWADDR                    = 0xc\n\tRTM_NEWMADDR                   = 0xf\n\tRTM_REDIRECT                   = 0x6\n\tRTM_RESOLVE                    = 0xb\n\tRTM_RTTUNIT                    = 0xf4240\n\tRTM_VERSION                    = 0x5\n\tRTV_EXPIRE                     = 0x4\n\tRTV_HOPCOUNT                   = 0x2\n\tRTV_MTU                        = 0x1\n\tRTV_RPIPE                      = 0x8\n\tRTV_RTT                        = 0x40\n\tRTV_RTTVAR                     = 0x80\n\tRTV_SPIPE                      = 0x10\n\tRTV_SSTHRESH                   = 0x20\n\tRTV_WEIGHT                     = 0x100\n\tRT_ALL_FIBS                    = -0x1\n\tRT_BLACKHOLE                   = 0x40\n\tRT_CACHING_CONTEXT             = 0x1\n\tRT_DEFAULT_FIB                 = 0x0\n\tRT_HAS_GW                      = 0x80\n\tRT_HAS_HEADER                  = 0x10\n\tRT_HAS_HEADER_BIT              = 0x4\n\tRT_L2_ME                       = 0x4\n\tRT_L2_ME_BIT                   = 0x2\n\tRT_LLE_CACHE                   = 0x100\n\tRT_MAY_LOOP                    = 0x8\n\tRT_MAY_LOOP_BIT                = 0x3\n\tRT_NORTREF                     = 0x2\n\tRT_REJECT                      = 0x20\n\tRUSAGE_CHILDREN                = -0x1\n\tRUSAGE_SELF                    = 0x0\n\tRUSAGE_THREAD                  = 0x1\n\tSCM_BINTIME                    = 0x4\n\tSCM_CREDS                      = 0x3\n\tSCM_RIGHTS                     = 0x1\n\tSCM_TIMESTAMP                  = 0x2\n\tSHUT_RD                        = 0x0\n\tSHUT_RDWR                      = 0x2\n\tSHUT_WR                        = 0x1\n\tSIOCADDMULTI                   = 0x80206931\n\tSIOCAIFADDR                    = 0x8040691a\n\tSIOCAIFGROUP                   = 0x80246987\n\tSIOCATMARK                     = 0x40047307\n\tSIOCDELMULTI                   = 0x80206932\n\tSIOCDIFADDR                    = 0x80206919\n\tSIOCDIFGROUP                   = 0x80246989\n\tSIOCDIFPHYADDR                 = 0x80206949\n\tSIOCGDRVSPEC                   = 0xc01c697b\n\tSIOCGETSGCNT                   = 0xc0147210\n\tSIOCGETVIFCNT                  = 0xc014720f\n\tSIOCGHIWAT                     = 0x40047301\n\tSIOCGHWADDR                    = 0xc020693e\n\tSIOCGI2C                       = 0xc020693d\n\tSIOCGIFADDR                    = 0xc0206921\n\tSIOCGIFBRDADDR                 = 0xc0206923\n\tSIOCGIFCAP                     = 0xc020691f\n\tSIOCGIFCONF                    = 0xc0086924\n\tSIOCGIFDESCR                   = 0xc020692a\n\tSIOCGIFDSTADDR                 = 0xc0206922\n\tSIOCGIFFIB                     = 0xc020695c\n\tSIOCGIFFLAGS                   = 0xc0206911\n\tSIOCGIFGENERIC                 = 0xc020693a\n\tSIOCGIFGMEMB                   = 0xc024698a\n\tSIOCGIFGROUP                   = 0xc0246988\n\tSIOCGIFINDEX                   = 0xc0206920\n\tSIOCGIFMAC                     = 0xc0206926\n\tSIOCGIFMEDIA                   = 0xc0286938\n\tSIOCGIFMETRIC                  = 0xc0206917\n\tSIOCGIFMTU                     = 0xc0206933\n\tSIOCGIFNETMASK                 = 0xc0206925\n\tSIOCGIFPDSTADDR                = 0xc0206948\n\tSIOCGIFPHYS                    = 0xc0206935\n\tSIOCGIFPSRCADDR                = 0xc0206947\n\tSIOCGIFSTATUS                  = 0xc331693b\n\tSIOCGIFXMEDIA                  = 0xc028698b\n\tSIOCGLOWAT                     = 0x40047303\n\tSIOCGPGRP                      = 0x40047309\n\tSIOCGPRIVATE_0                 = 0xc0206950\n\tSIOCGPRIVATE_1                 = 0xc0206951\n\tSIOCGTUNFIB                    = 0xc020695e\n\tSIOCIFCREATE                   = 0xc020697a\n\tSIOCIFCREATE2                  = 0xc020697c\n\tSIOCIFDESTROY                  = 0x80206979\n\tSIOCIFGCLONERS                 = 0xc00c6978\n\tSIOCSDRVSPEC                   = 0x801c697b\n\tSIOCSHIWAT                     = 0x80047300\n\tSIOCSIFADDR                    = 0x8020690c\n\tSIOCSIFBRDADDR                 = 0x80206913\n\tSIOCSIFCAP                     = 0x8020691e\n\tSIOCSIFDESCR                   = 0x80206929\n\tSIOCSIFDSTADDR                 = 0x8020690e\n\tSIOCSIFFIB                     = 0x8020695d\n\tSIOCSIFFLAGS                   = 0x80206910\n\tSIOCSIFGENERIC                 = 0x80206939\n\tSIOCSIFLLADDR                  = 0x8020693c\n\tSIOCSIFMAC                     = 0x80206927\n\tSIOCSIFMEDIA                   = 0xc0206937\n\tSIOCSIFMETRIC                  = 0x80206918\n\tSIOCSIFMTU                     = 0x80206934\n\tSIOCSIFNAME                    = 0x80206928\n\tSIOCSIFNETMASK                 = 0x80206916\n\tSIOCSIFPHYADDR                 = 0x80406946\n\tSIOCSIFPHYS                    = 0x80206936\n\tSIOCSIFRVNET                   = 0xc020695b\n\tSIOCSIFVNET                    = 0xc020695a\n\tSIOCSLOWAT                     = 0x80047302\n\tSIOCSPGRP                      = 0x80047308\n\tSIOCSTUNFIB                    = 0x8020695f\n\tSOCK_CLOEXEC                   = 0x10000000\n\tSOCK_DGRAM                     = 0x2\n\tSOCK_MAXADDRLEN                = 0xff\n\tSOCK_NONBLOCK                  = 0x20000000\n\tSOCK_RAW                       = 0x3\n\tSOCK_RDM                       = 0x4\n\tSOCK_SEQPACKET                 = 0x5\n\tSOCK_STREAM                    = 0x1\n\tSOL_SOCKET                     = 0xffff\n\tSOMAXCONN                      = 0x80\n\tSO_ACCEPTCONN                  = 0x2\n\tSO_ACCEPTFILTER                = 0x1000\n\tSO_BINTIME                     = 0x2000\n\tSO_BROADCAST                   = 0x20\n\tSO_DEBUG                       = 0x1\n\tSO_DONTROUTE                   = 0x10\n\tSO_ERROR                       = 0x1007\n\tSO_KEEPALIVE                   = 0x8\n\tSO_LABEL                       = 0x1009\n\tSO_LINGER                      = 0x80\n\tSO_LISTENINCQLEN               = 0x1013\n\tSO_LISTENQLEN                  = 0x1012\n\tSO_LISTENQLIMIT                = 0x1011\n\tSO_NOSIGPIPE                   = 0x800\n\tSO_NO_DDP                      = 0x8000\n\tSO_NO_OFFLOAD                  = 0x4000\n\tSO_OOBINLINE                   = 0x100\n\tSO_PEERLABEL                   = 0x1010\n\tSO_PROTOCOL                    = 0x1016\n\tSO_PROTOTYPE                   = 0x1016\n\tSO_RCVBUF                      = 0x1002\n\tSO_RCVLOWAT                    = 0x1004\n\tSO_RCVTIMEO                    = 0x1006\n\tSO_REUSEADDR                   = 0x4\n\tSO_REUSEPORT                   = 0x200\n\tSO_SETFIB                      = 0x1014\n\tSO_SNDBUF                      = 0x1001\n\tSO_SNDLOWAT                    = 0x1003\n\tSO_SNDTIMEO                    = 0x1005\n\tSO_TIMESTAMP                   = 0x400\n\tSO_TYPE                        = 0x1008\n\tSO_USELOOPBACK                 = 0x40\n\tSO_USER_COOKIE                 = 0x1015\n\tSO_VENDOR                      = 0x80000000\n\tTAB0                           = 0x0\n\tTAB3                           = 0x4\n\tTABDLY                         = 0x4\n\tTCIFLUSH                       = 0x1\n\tTCIOFF                         = 0x3\n\tTCIOFLUSH                      = 0x3\n\tTCION                          = 0x4\n\tTCOFLUSH                       = 0x2\n\tTCOOFF                         = 0x1\n\tTCOON                          = 0x2\n\tTCP_CA_NAME_MAX                = 0x10\n\tTCP_CCALGOOPT                  = 0x41\n\tTCP_CONGESTION                 = 0x40\n\tTCP_FASTOPEN                   = 0x401\n\tTCP_FUNCTION_BLK               = 0x2000\n\tTCP_FUNCTION_NAME_LEN_MAX      = 0x20\n\tTCP_INFO                       = 0x20\n\tTCP_KEEPCNT                    = 0x400\n\tTCP_KEEPIDLE                   = 0x100\n\tTCP_KEEPINIT                   = 0x80\n\tTCP_KEEPINTVL                  = 0x200\n\tTCP_MAXBURST                   = 0x4\n\tTCP_MAXHLEN                    = 0x3c\n\tTCP_MAXOLEN                    = 0x28\n\tTCP_MAXSEG                     = 0x2\n\tTCP_MAXWIN                     = 0xffff\n\tTCP_MAX_SACK                   = 0x4\n\tTCP_MAX_WINSHIFT               = 0xe\n\tTCP_MD5SIG                     = 0x10\n\tTCP_MINMSS                     = 0xd8\n\tTCP_MSS                        = 0x218\n\tTCP_NODELAY                    = 0x1\n\tTCP_NOOPT                      = 0x8\n\tTCP_NOPUSH                     = 0x4\n\tTCP_PCAP_IN                    = 0x1000\n\tTCP_PCAP_OUT                   = 0x800\n\tTCP_VENDOR                     = 0x80000000\n\tTCSAFLUSH                      = 0x2\n\tTIOCCBRK                       = 0x2000747a\n\tTIOCCDTR                       = 0x20007478\n\tTIOCCONS                       = 0x80047462\n\tTIOCDRAIN                      = 0x2000745e\n\tTIOCEXCL                       = 0x2000740d\n\tTIOCEXT                        = 0x80047460\n\tTIOCFLUSH                      = 0x80047410\n\tTIOCGDRAINWAIT                 = 0x40047456\n\tTIOCGETA                       = 0x402c7413\n\tTIOCGETD                       = 0x4004741a\n\tTIOCGPGRP                      = 0x40047477\n\tTIOCGPTN                       = 0x4004740f\n\tTIOCGSID                       = 0x40047463\n\tTIOCGWINSZ                     = 0x40087468\n\tTIOCMBIC                       = 0x8004746b\n\tTIOCMBIS                       = 0x8004746c\n\tTIOCMGDTRWAIT                  = 0x4004745a\n\tTIOCMGET                       = 0x4004746a\n\tTIOCMSDTRWAIT                  = 0x8004745b\n\tTIOCMSET                       = 0x8004746d\n\tTIOCM_CAR                      = 0x40\n\tTIOCM_CD                       = 0x40\n\tTIOCM_CTS                      = 0x20\n\tTIOCM_DCD                      = 0x40\n\tTIOCM_DSR                      = 0x100\n\tTIOCM_DTR                      = 0x2\n\tTIOCM_LE                       = 0x1\n\tTIOCM_RI                       = 0x80\n\tTIOCM_RNG                      = 0x80\n\tTIOCM_RTS                      = 0x4\n\tTIOCM_SR                       = 0x10\n\tTIOCM_ST                       = 0x8\n\tTIOCNOTTY                      = 0x20007471\n\tTIOCNXCL                       = 0x2000740e\n\tTIOCOUTQ                       = 0x40047473\n\tTIOCPKT                        = 0x80047470\n\tTIOCPKT_DATA                   = 0x0\n\tTIOCPKT_DOSTOP                 = 0x20\n\tTIOCPKT_FLUSHREAD              = 0x1\n\tTIOCPKT_FLUSHWRITE             = 0x2\n\tTIOCPKT_IOCTL                  = 0x40\n\tTIOCPKT_NOSTOP                 = 0x10\n\tTIOCPKT_START                  = 0x8\n\tTIOCPKT_STOP                   = 0x4\n\tTIOCPTMASTER                   = 0x2000741c\n\tTIOCSBRK                       = 0x2000747b\n\tTIOCSCTTY                      = 0x20007461\n\tTIOCSDRAINWAIT                 = 0x80047457\n\tTIOCSDTR                       = 0x20007479\n\tTIOCSETA                       = 0x802c7414\n\tTIOCSETAF                      = 0x802c7416\n\tTIOCSETAW                      = 0x802c7415\n\tTIOCSETD                       = 0x8004741b\n\tTIOCSIG                        = 0x2004745f\n\tTIOCSPGRP                      = 0x80047476\n\tTIOCSTART                      = 0x2000746e\n\tTIOCSTAT                       = 0x20007465\n\tTIOCSTI                        = 0x80017472\n\tTIOCSTOP                       = 0x2000746f\n\tTIOCSWINSZ                     = 0x80087467\n\tTIOCTIMESTAMP                  = 0x40107459\n\tTIOCUCNTL                      = 0x80047466\n\tTOSTOP                         = 0x400000\n\tVDISCARD                       = 0xf\n\tVDSUSP                         = 0xb\n\tVEOF                           = 0x0\n\tVEOL                           = 0x1\n\tVEOL2                          = 0x2\n\tVERASE                         = 0x3\n\tVERASE2                        = 0x7\n\tVINTR                          = 0x8\n\tVKILL                          = 0x5\n\tVLNEXT                         = 0xe\n\tVMIN                           = 0x10\n\tVQUIT                          = 0x9\n\tVREPRINT                       = 0x6\n\tVSTART                         = 0xc\n\tVSTATUS                        = 0x12\n\tVSTOP                          = 0xd\n\tVSUSP                          = 0xa\n\tVTIME                          = 0x11\n\tVWERASE                        = 0x4\n\tWCONTINUED                     = 0x4\n\tWCOREFLAG                      = 0x80\n\tWEXITED                        = 0x10\n\tWLINUXCLONE                    = 0x80000000\n\tWNOHANG                        = 0x1\n\tWNOWAIT                        = 0x8\n\tWSTOPPED                       = 0x2\n\tWTRAPPED                       = 0x20\n\tWUNTRACED                      = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMSG         = syscall.Errno(0x59)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x55)\n\tECAPMODE        = syscall.Errno(0x5e)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOOFUS         = syscall.Errno(0x58)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x52)\n\tEILSEQ          = syscall.Errno(0x56)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x60)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5a)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x57)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x5b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x53)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCAPABLE     = syscall.Errno(0x5d)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTRECOVERABLE = syscall.Errno(0x5f)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEOWNERDEAD      = syscall.Errno(0x60)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x5c)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGLIBRT  = syscall.Signal(0x21)\n\tSIGLWP    = syscall.Signal(0x20)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTHR    = syscall.Signal(0x20)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"operation timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"identifier removed\",\n\t83: \"no message of desired type\",\n\t84: \"value too large to be stored in data type\",\n\t85: \"operation canceled\",\n\t86: \"illegal byte sequence\",\n\t87: \"attribute not found\",\n\t88: \"programming error\",\n\t89: \"bad message\",\n\t90: \"multihop attempted\",\n\t91: \"link has been severed\",\n\t92: \"protocol error\",\n\t93: \"capabilities insufficient\",\n\t94: \"not permitted in capability mode\",\n\t95: \"state not recoverable\",\n\t96: \"previous owner died\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"suspended (signal)\",\n\t18: \"suspended\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"unknown signal\",\n\t33: \"unknown signal\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_386.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x80041270\n\tBLKBSZSET                            = 0x40041271\n\tBLKFLSBUF                            = 0x1261\n\tBLKFRAGET                            = 0x1265\n\tBLKFRASET                            = 0x1264\n\tBLKGETSIZE                           = 0x1260\n\tBLKGETSIZE64                         = 0x80041272\n\tBLKPBSZGET                           = 0x127b\n\tBLKRAGET                             = 0x1263\n\tBLKRASET                             = 0x1262\n\tBLKROGET                             = 0x125e\n\tBLKROSET                             = 0x125d\n\tBLKRRPART                            = 0x125f\n\tBLKSECTGET                           = 0x1267\n\tBLKSECTSET                           = 0x1266\n\tBLKSSZGET                            = 0x1268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x800\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x1000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x400c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x40106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x800c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0xc\n\tF_GETLK64                            = 0xc\n\tF_GETOWN                             = 0x9\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0xd\n\tF_SETLK64                            = 0xd\n\tF_SETLKW                             = 0xe\n\tF_SETLKW64                           = 0xe\n\tF_SETOWN                             = 0x8\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x8000\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x800\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x7b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_32BIT                            = 0x40\n\tMAP_ANON                             = 0x20\n\tMAP_ANONYMOUS                        = 0x20\n\tMAP_DENYWRITE                        = 0x800\n\tMAP_EXECUTABLE                       = 0x1000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x100\n\tMAP_HUGETLB                          = 0x40000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x2000\n\tMAP_NONBLOCK                         = 0x10000\n\tMAP_NORESERVE                        = 0x4000\n\tMAP_POPULATE                         = 0x8000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x20000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x400\n\tO_ASYNC                              = 0x2000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x40\n\tO_DIRECT                             = 0x4000\n\tO_DIRECTORY                          = 0x10000\n\tO_DSYNC                              = 0x1000\n\tO_EXCL                               = 0x80\n\tO_FSYNC                              = 0x101000\n\tO_LARGEFILE                          = 0x8000\n\tO_NDELAY                             = 0x800\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x100\n\tO_NOFOLLOW                           = 0x20000\n\tO_NONBLOCK                           = 0x800\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x101000\n\tO_SYNC                               = 0x101000\n\tO_TMPFILE                            = 0x410000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x2401\n\tPERF_EVENT_IOC_ENABLE                = 0x2400\n\tPERF_EVENT_IOC_ID                    = 0x80042407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x40042409\n\tPERF_EVENT_IOC_PERIOD                = 0x40082404\n\tPERF_EVENT_IOC_REFRESH               = 0x2402\n\tPERF_EVENT_IOC_RESET                 = 0x2403\n\tPERF_EVENT_IOC_SET_BPF               = 0x40042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x40042406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x2405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETFPXREGS                    = 0x12\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GET_THREAD_AREA               = 0x19\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETFPXREGS                    = 0x13\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SET_THREAD_AREA               = 0x1a\n\tPTRACE_SINGLEBLOCK                   = 0x21\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_SYSEMU                        = 0x1f\n\tPTRACE_SYSEMU_SINGLESTEP             = 0x20\n\tPTRACE_TRACEME                       = 0x0\n\tRLIMIT_AS                            = 0x9\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x8\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x7\n\tRLIMIT_NPROC                         = 0x6\n\tRLIMIT_RSS                           = 0x5\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x8905\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x8904\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x541b\n\tSIOCOUTQ                             = 0x5411\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x8902\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x2\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x800\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x1\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0x1\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1e\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x6\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x27\n\tSO_DONTROUTE                         = 0x5\n\tSO_ERROR                             = 0x4\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x9\n\tSO_LINGER                            = 0xd\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0xa\n\tSO_PASSCRED                          = 0x10\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x11\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1f\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x26\n\tSO_RCVBUF                            = 0x8\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x12\n\tSO_RCVTIMEO                          = 0x14\n\tSO_REUSEADDR                         = 0x2\n\tSO_REUSEPORT                         = 0xf\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x7\n\tSO_SNDBUFFORCE                       = 0x20\n\tSO_SNDLOWAT                          = 0x13\n\tSO_SNDTIMEO                          = 0x15\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x3\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x540b\n\tTCGETA                               = 0x5405\n\tTCGETS                               = 0x5401\n\tTCGETS2                              = 0x802c542a\n\tTCGETX                               = 0x5432\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x2\n\tTCSBRK                               = 0x5409\n\tTCSBRKP                              = 0x5425\n\tTCSETA                               = 0x5406\n\tTCSETAF                              = 0x5408\n\tTCSETAW                              = 0x5407\n\tTCSETS                               = 0x5402\n\tTCSETS2                              = 0x402c542b\n\tTCSETSF                              = 0x5404\n\tTCSETSF2                             = 0x402c542d\n\tTCSETSW                              = 0x5403\n\tTCSETSW2                             = 0x402c542c\n\tTCSETX                               = 0x5433\n\tTCSETXF                              = 0x5434\n\tTCSETXW                              = 0x5435\n\tTCXONC                               = 0x540a\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x541d\n\tTIOCEXCL                             = 0x540c\n\tTIOCGDEV                             = 0x80045432\n\tTIOCGETD                             = 0x5424\n\tTIOCGEXCL                            = 0x80045440\n\tTIOCGICOUNT                          = 0x545d\n\tTIOCGLCKTRMIOS                       = 0x5456\n\tTIOCGPGRP                            = 0x540f\n\tTIOCGPKT                             = 0x80045438\n\tTIOCGPTLCK                           = 0x80045439\n\tTIOCGPTN                             = 0x80045430\n\tTIOCGPTPEER                          = 0x5441\n\tTIOCGRS485                           = 0x542e\n\tTIOCGSERIAL                          = 0x541e\n\tTIOCGSID                             = 0x5429\n\tTIOCGSOFTCAR                         = 0x5419\n\tTIOCGWINSZ                           = 0x5413\n\tTIOCINQ                              = 0x541b\n\tTIOCLINUX                            = 0x541c\n\tTIOCMBIC                             = 0x5417\n\tTIOCMBIS                             = 0x5416\n\tTIOCMGET                             = 0x5415\n\tTIOCMIWAIT                           = 0x545c\n\tTIOCMSET                             = 0x5418\n\tTIOCM_CAR                            = 0x40\n\tTIOCM_CD                             = 0x40\n\tTIOCM_CTS                            = 0x20\n\tTIOCM_DSR                            = 0x100\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x80\n\tTIOCM_RNG                            = 0x80\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x10\n\tTIOCM_ST                             = 0x8\n\tTIOCNOTTY                            = 0x5422\n\tTIOCNXCL                             = 0x540d\n\tTIOCOUTQ                             = 0x5411\n\tTIOCPKT                              = 0x5420\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x540e\n\tTIOCSERCONFIG                        = 0x5453\n\tTIOCSERGETLSR                        = 0x5459\n\tTIOCSERGETMULTI                      = 0x545a\n\tTIOCSERGSTRUCT                       = 0x5458\n\tTIOCSERGWILD                         = 0x5454\n\tTIOCSERSETMULTI                      = 0x545b\n\tTIOCSERSWILD                         = 0x5455\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x5423\n\tTIOCSIG                              = 0x40045436\n\tTIOCSLCKTRMIOS                       = 0x5457\n\tTIOCSPGRP                            = 0x5410\n\tTIOCSPTLCK                           = 0x40045431\n\tTIOCSRS485                           = 0x542f\n\tTIOCSSERIAL                          = 0x541f\n\tTIOCSSOFTCAR                         = 0x541a\n\tTIOCSTI                              = 0x5412\n\tTIOCSWINSZ                           = 0x5414\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x100\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x400854d5\n\tTUNDETACHFILTER                      = 0x400854d6\n\tTUNGETFEATURES                       = 0x800454cf\n\tTUNGETFILTER                         = 0x800854db\n\tTUNGETIFF                            = 0x800454d2\n\tTUNGETSNDBUF                         = 0x800454d3\n\tTUNGETVNETBE                         = 0x800454df\n\tTUNGETVNETHDRSZ                      = 0x800454d7\n\tTUNGETVNETLE                         = 0x800454dd\n\tTUNSETDEBUG                          = 0x400454c9\n\tTUNSETGROUP                          = 0x400454ce\n\tTUNSETIFF                            = 0x400454ca\n\tTUNSETIFINDEX                        = 0x400454da\n\tTUNSETLINK                           = 0x400454cd\n\tTUNSETNOCSUM                         = 0x400454c8\n\tTUNSETOFFLOAD                        = 0x400454d0\n\tTUNSETOWNER                          = 0x400454cc\n\tTUNSETPERSIST                        = 0x400454cb\n\tTUNSETQUEUE                          = 0x400454d9\n\tTUNSETSNDBUF                         = 0x400454d4\n\tTUNSETTXFILTER                       = 0x400454d1\n\tTUNSETVNETBE                         = 0x400454de\n\tTUNSETVNETHDRSZ                      = 0x400454d8\n\tTUNSETVNETLE                         = 0x400454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x4\n\tVEOL                                 = 0xb\n\tVEOL2                                = 0x10\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x6\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x80045702\n\tWDIOC_GETPRETIMEOUT                  = 0x80045709\n\tWDIOC_GETSTATUS                      = 0x80045701\n\tWDIOC_GETSUPPORT                     = 0x80285700\n\tWDIOC_GETTEMP                        = 0x80045703\n\tWDIOC_GETTIMELEFT                    = 0x8004570a\n\tWDIOC_GETTIMEOUT                     = 0x80045707\n\tWDIOC_KEEPALIVE                      = 0x80045705\n\tWDIOC_SETOPTIONS                     = 0x80045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x20\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x62)\n\tEADDRNOTAVAIL   = syscall.Errno(0x63)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x61)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x72)\n\tEBADE           = syscall.Errno(0x34)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x4d)\n\tEBADMSG         = syscall.Errno(0x4a)\n\tEBADR           = syscall.Errno(0x35)\n\tEBADRQC         = syscall.Errno(0x38)\n\tEBADSLT         = syscall.Errno(0x39)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7d)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x2c)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x67)\n\tECONNREFUSED    = syscall.Errno(0x6f)\n\tECONNRESET      = syscall.Errno(0x68)\n\tEDEADLK         = syscall.Errno(0x23)\n\tEDEADLOCK       = syscall.Errno(0x23)\n\tEDESTADDRREQ    = syscall.Errno(0x59)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x7a)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x70)\n\tEHOSTUNREACH    = syscall.Errno(0x71)\n\tEHWPOISON       = syscall.Errno(0x85)\n\tEIDRM           = syscall.Errno(0x2b)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x73)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x6a)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x7f)\n\tEKEYREJECTED    = syscall.Errno(0x81)\n\tEKEYREVOKED     = syscall.Errno(0x80)\n\tEL2HLT          = syscall.Errno(0x33)\n\tEL2NSYNC        = syscall.Errno(0x2d)\n\tEL3HLT          = syscall.Errno(0x2e)\n\tEL3RST          = syscall.Errno(0x2f)\n\tELIBACC         = syscall.Errno(0x4f)\n\tELIBBAD         = syscall.Errno(0x50)\n\tELIBEXEC        = syscall.Errno(0x53)\n\tELIBMAX         = syscall.Errno(0x52)\n\tELIBSCN         = syscall.Errno(0x51)\n\tELNRNG          = syscall.Errno(0x30)\n\tELOOP           = syscall.Errno(0x28)\n\tEMEDIUMTYPE     = syscall.Errno(0x7c)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x5a)\n\tEMULTIHOP       = syscall.Errno(0x48)\n\tENAMETOOLONG    = syscall.Errno(0x24)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x64)\n\tENETRESET       = syscall.Errno(0x66)\n\tENETUNREACH     = syscall.Errno(0x65)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x37)\n\tENOBUFS         = syscall.Errno(0x69)\n\tENOCSI          = syscall.Errno(0x32)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x7e)\n\tENOLCK          = syscall.Errno(0x25)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x7b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x2a)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x5c)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x26)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x6b)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x27)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x83)\n\tENOTSOCK        = syscall.Errno(0x58)\n\tENOTSUP         = syscall.Errno(0x5f)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x4c)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x5f)\n\tEOVERFLOW       = syscall.Errno(0x4b)\n\tEOWNERDEAD      = syscall.Errno(0x82)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x60)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x5d)\n\tEPROTOTYPE      = syscall.Errno(0x5b)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x4e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x55)\n\tERFKILL         = syscall.Errno(0x84)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x6c)\n\tESOCKTNOSUPPORT = syscall.Errno(0x5e)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x74)\n\tESTRPIPE        = syscall.Errno(0x56)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x6e)\n\tETOOMANYREFS    = syscall.Errno(0x6d)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x31)\n\tEUSERS          = syscall.Errno(0x57)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x36)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0x7)\n\tSIGCHLD   = syscall.Signal(0x11)\n\tSIGCLD    = syscall.Signal(0x11)\n\tSIGCONT   = syscall.Signal(0x12)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x1d)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x1d)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1e)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTKFLT = syscall.Signal(0x10)\n\tSIGSTOP   = syscall.Signal(0x13)\n\tSIGSYS    = syscall.Signal(0x1f)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x14)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x17)\n\tSIGUSR1   = syscall.Signal(0xa)\n\tSIGUSR2   = syscall.Signal(0xc)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t35:  \"resource deadlock avoided\",\n\t36:  \"file name too long\",\n\t37:  \"no locks available\",\n\t38:  \"function not implemented\",\n\t39:  \"directory not empty\",\n\t40:  \"too many levels of symbolic links\",\n\t42:  \"no message of desired type\",\n\t43:  \"identifier removed\",\n\t44:  \"channel number out of range\",\n\t45:  \"level 2 not synchronized\",\n\t46:  \"level 3 halted\",\n\t47:  \"level 3 reset\",\n\t48:  \"link number out of range\",\n\t49:  \"protocol driver not attached\",\n\t50:  \"no CSI structure available\",\n\t51:  \"level 2 halted\",\n\t52:  \"invalid exchange\",\n\t53:  \"invalid request descriptor\",\n\t54:  \"exchange full\",\n\t55:  \"no anode\",\n\t56:  \"invalid request code\",\n\t57:  \"invalid slot\",\n\t59:  \"bad font file format\",\n\t60:  \"device not a stream\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of streams resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"multihop attempted\",\n\t73:  \"RFS specific error\",\n\t74:  \"bad message\",\n\t75:  \"value too large for defined data type\",\n\t76:  \"name not unique on network\",\n\t77:  \"file descriptor in bad state\",\n\t78:  \"remote address changed\",\n\t79:  \"can not access a needed shared library\",\n\t80:  \"accessing a corrupted shared library\",\n\t81:  \".lib section in a.out corrupted\",\n\t82:  \"attempting to link in too many shared libraries\",\n\t83:  \"cannot exec a shared library directly\",\n\t84:  \"invalid or incomplete multibyte or wide character\",\n\t85:  \"interrupted system call should be restarted\",\n\t86:  \"streams pipe error\",\n\t87:  \"too many users\",\n\t88:  \"socket operation on non-socket\",\n\t89:  \"destination address required\",\n\t90:  \"message too long\",\n\t91:  \"protocol wrong type for socket\",\n\t92:  \"protocol not available\",\n\t93:  \"protocol not supported\",\n\t94:  \"socket type not supported\",\n\t95:  \"operation not supported\",\n\t96:  \"protocol family not supported\",\n\t97:  \"address family not supported by protocol\",\n\t98:  \"address already in use\",\n\t99:  \"cannot assign requested address\",\n\t100: \"network is down\",\n\t101: \"network is unreachable\",\n\t102: \"network dropped connection on reset\",\n\t103: \"software caused connection abort\",\n\t104: \"connection reset by peer\",\n\t105: \"no buffer space available\",\n\t106: \"transport endpoint is already connected\",\n\t107: \"transport endpoint is not connected\",\n\t108: \"cannot send after transport endpoint shutdown\",\n\t109: \"too many references: cannot splice\",\n\t110: \"connection timed out\",\n\t111: \"connection refused\",\n\t112: \"host is down\",\n\t113: \"no route to host\",\n\t114: \"operation already in progress\",\n\t115: \"operation now in progress\",\n\t116: \"stale file handle\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"disk quota exceeded\",\n\t123: \"no medium found\",\n\t124: \"wrong medium type\",\n\t125: \"operation canceled\",\n\t126: \"required key not available\",\n\t127: \"key has expired\",\n\t128: \"key has been revoked\",\n\t129: \"key was rejected by service\",\n\t130: \"owner died\",\n\t131: \"state not recoverable\",\n\t132: \"operation not possible due to RF-kill\",\n\t133: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"stack fault\",\n\t17: \"child exited\",\n\t18: \"continued\",\n\t19: \"stopped (signal)\",\n\t20: \"stopped\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"urgent I/O condition\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"I/O possible\",\n\t30: \"power failure\",\n\t31: \"bad system call\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x80081270\n\tBLKBSZSET                            = 0x40081271\n\tBLKFLSBUF                            = 0x1261\n\tBLKFRAGET                            = 0x1265\n\tBLKFRASET                            = 0x1264\n\tBLKGETSIZE                           = 0x1260\n\tBLKGETSIZE64                         = 0x80081272\n\tBLKPBSZGET                           = 0x127b\n\tBLKRAGET                             = 0x1263\n\tBLKRASET                             = 0x1262\n\tBLKROGET                             = 0x125e\n\tBLKROSET                             = 0x125d\n\tBLKRRPART                            = 0x125f\n\tBLKSECTGET                           = 0x1267\n\tBLKSECTSET                           = 0x1266\n\tBLKSSZGET                            = 0x1268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x800\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x1000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x400c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x40106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x800c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0x5\n\tF_GETLK64                            = 0x5\n\tF_GETOWN                             = 0x9\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x6\n\tF_SETLK64                            = 0x6\n\tF_SETLKW                             = 0x7\n\tF_SETLKW64                           = 0x7\n\tF_SETOWN                             = 0x8\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x8000\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x800\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x7b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_32BIT                            = 0x40\n\tMAP_ANON                             = 0x20\n\tMAP_ANONYMOUS                        = 0x20\n\tMAP_DENYWRITE                        = 0x800\n\tMAP_EXECUTABLE                       = 0x1000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x100\n\tMAP_HUGETLB                          = 0x40000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x2000\n\tMAP_NONBLOCK                         = 0x10000\n\tMAP_NORESERVE                        = 0x4000\n\tMAP_POPULATE                         = 0x8000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x20000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x400\n\tO_ASYNC                              = 0x2000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x40\n\tO_DIRECT                             = 0x4000\n\tO_DIRECTORY                          = 0x10000\n\tO_DSYNC                              = 0x1000\n\tO_EXCL                               = 0x80\n\tO_FSYNC                              = 0x101000\n\tO_LARGEFILE                          = 0x0\n\tO_NDELAY                             = 0x800\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x100\n\tO_NOFOLLOW                           = 0x20000\n\tO_NONBLOCK                           = 0x800\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x101000\n\tO_SYNC                               = 0x101000\n\tO_TMPFILE                            = 0x410000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x2401\n\tPERF_EVENT_IOC_ENABLE                = 0x2400\n\tPERF_EVENT_IOC_ID                    = 0x80082407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x40042409\n\tPERF_EVENT_IOC_PERIOD                = 0x40082404\n\tPERF_EVENT_IOC_REFRESH               = 0x2402\n\tPERF_EVENT_IOC_RESET                 = 0x2403\n\tPERF_EVENT_IOC_SET_BPF               = 0x40042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x40082406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x2405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffffffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ARCH_PRCTL                    = 0x1e\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETFPXREGS                    = 0x12\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GET_THREAD_AREA               = 0x19\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETFPXREGS                    = 0x13\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SET_THREAD_AREA               = 0x1a\n\tPTRACE_SINGLEBLOCK                   = 0x21\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_SYSEMU                        = 0x1f\n\tPTRACE_SYSEMU_SINGLESTEP             = 0x20\n\tPTRACE_TRACEME                       = 0x0\n\tRLIMIT_AS                            = 0x9\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x8\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x7\n\tRLIMIT_NPROC                         = 0x6\n\tRLIMIT_RSS                           = 0x5\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x8905\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x8904\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x541b\n\tSIOCOUTQ                             = 0x5411\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x8902\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x2\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x800\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x1\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0x1\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1e\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x6\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x27\n\tSO_DONTROUTE                         = 0x5\n\tSO_ERROR                             = 0x4\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x9\n\tSO_LINGER                            = 0xd\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0xa\n\tSO_PASSCRED                          = 0x10\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x11\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1f\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x26\n\tSO_RCVBUF                            = 0x8\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x12\n\tSO_RCVTIMEO                          = 0x14\n\tSO_REUSEADDR                         = 0x2\n\tSO_REUSEPORT                         = 0xf\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x7\n\tSO_SNDBUFFORCE                       = 0x20\n\tSO_SNDLOWAT                          = 0x13\n\tSO_SNDTIMEO                          = 0x15\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x3\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x540b\n\tTCGETA                               = 0x5405\n\tTCGETS                               = 0x5401\n\tTCGETS2                              = 0x802c542a\n\tTCGETX                               = 0x5432\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x2\n\tTCSBRK                               = 0x5409\n\tTCSBRKP                              = 0x5425\n\tTCSETA                               = 0x5406\n\tTCSETAF                              = 0x5408\n\tTCSETAW                              = 0x5407\n\tTCSETS                               = 0x5402\n\tTCSETS2                              = 0x402c542b\n\tTCSETSF                              = 0x5404\n\tTCSETSF2                             = 0x402c542d\n\tTCSETSW                              = 0x5403\n\tTCSETSW2                             = 0x402c542c\n\tTCSETX                               = 0x5433\n\tTCSETXF                              = 0x5434\n\tTCSETXW                              = 0x5435\n\tTCXONC                               = 0x540a\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x541d\n\tTIOCEXCL                             = 0x540c\n\tTIOCGDEV                             = 0x80045432\n\tTIOCGETD                             = 0x5424\n\tTIOCGEXCL                            = 0x80045440\n\tTIOCGICOUNT                          = 0x545d\n\tTIOCGLCKTRMIOS                       = 0x5456\n\tTIOCGPGRP                            = 0x540f\n\tTIOCGPKT                             = 0x80045438\n\tTIOCGPTLCK                           = 0x80045439\n\tTIOCGPTN                             = 0x80045430\n\tTIOCGPTPEER                          = 0x5441\n\tTIOCGRS485                           = 0x542e\n\tTIOCGSERIAL                          = 0x541e\n\tTIOCGSID                             = 0x5429\n\tTIOCGSOFTCAR                         = 0x5419\n\tTIOCGWINSZ                           = 0x5413\n\tTIOCINQ                              = 0x541b\n\tTIOCLINUX                            = 0x541c\n\tTIOCMBIC                             = 0x5417\n\tTIOCMBIS                             = 0x5416\n\tTIOCMGET                             = 0x5415\n\tTIOCMIWAIT                           = 0x545c\n\tTIOCMSET                             = 0x5418\n\tTIOCM_CAR                            = 0x40\n\tTIOCM_CD                             = 0x40\n\tTIOCM_CTS                            = 0x20\n\tTIOCM_DSR                            = 0x100\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x80\n\tTIOCM_RNG                            = 0x80\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x10\n\tTIOCM_ST                             = 0x8\n\tTIOCNOTTY                            = 0x5422\n\tTIOCNXCL                             = 0x540d\n\tTIOCOUTQ                             = 0x5411\n\tTIOCPKT                              = 0x5420\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x540e\n\tTIOCSERCONFIG                        = 0x5453\n\tTIOCSERGETLSR                        = 0x5459\n\tTIOCSERGETMULTI                      = 0x545a\n\tTIOCSERGSTRUCT                       = 0x5458\n\tTIOCSERGWILD                         = 0x5454\n\tTIOCSERSETMULTI                      = 0x545b\n\tTIOCSERSWILD                         = 0x5455\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x5423\n\tTIOCSIG                              = 0x40045436\n\tTIOCSLCKTRMIOS                       = 0x5457\n\tTIOCSPGRP                            = 0x5410\n\tTIOCSPTLCK                           = 0x40045431\n\tTIOCSRS485                           = 0x542f\n\tTIOCSSERIAL                          = 0x541f\n\tTIOCSSOFTCAR                         = 0x541a\n\tTIOCSTI                              = 0x5412\n\tTIOCSWINSZ                           = 0x5414\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x100\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x401054d5\n\tTUNDETACHFILTER                      = 0x401054d6\n\tTUNGETFEATURES                       = 0x800454cf\n\tTUNGETFILTER                         = 0x801054db\n\tTUNGETIFF                            = 0x800454d2\n\tTUNGETSNDBUF                         = 0x800454d3\n\tTUNGETVNETBE                         = 0x800454df\n\tTUNGETVNETHDRSZ                      = 0x800454d7\n\tTUNGETVNETLE                         = 0x800454dd\n\tTUNSETDEBUG                          = 0x400454c9\n\tTUNSETGROUP                          = 0x400454ce\n\tTUNSETIFF                            = 0x400454ca\n\tTUNSETIFINDEX                        = 0x400454da\n\tTUNSETLINK                           = 0x400454cd\n\tTUNSETNOCSUM                         = 0x400454c8\n\tTUNSETOFFLOAD                        = 0x400454d0\n\tTUNSETOWNER                          = 0x400454cc\n\tTUNSETPERSIST                        = 0x400454cb\n\tTUNSETQUEUE                          = 0x400454d9\n\tTUNSETSNDBUF                         = 0x400454d4\n\tTUNSETTXFILTER                       = 0x400454d1\n\tTUNSETVNETBE                         = 0x400454de\n\tTUNSETVNETHDRSZ                      = 0x400454d8\n\tTUNSETVNETLE                         = 0x400454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x4\n\tVEOL                                 = 0xb\n\tVEOL2                                = 0x10\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x6\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x80045702\n\tWDIOC_GETPRETIMEOUT                  = 0x80045709\n\tWDIOC_GETSTATUS                      = 0x80045701\n\tWDIOC_GETSUPPORT                     = 0x80285700\n\tWDIOC_GETTEMP                        = 0x80045703\n\tWDIOC_GETTIMELEFT                    = 0x8004570a\n\tWDIOC_GETTIMEOUT                     = 0x80045707\n\tWDIOC_KEEPALIVE                      = 0x80045705\n\tWDIOC_SETOPTIONS                     = 0x80045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x40\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x62)\n\tEADDRNOTAVAIL   = syscall.Errno(0x63)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x61)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x72)\n\tEBADE           = syscall.Errno(0x34)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x4d)\n\tEBADMSG         = syscall.Errno(0x4a)\n\tEBADR           = syscall.Errno(0x35)\n\tEBADRQC         = syscall.Errno(0x38)\n\tEBADSLT         = syscall.Errno(0x39)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7d)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x2c)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x67)\n\tECONNREFUSED    = syscall.Errno(0x6f)\n\tECONNRESET      = syscall.Errno(0x68)\n\tEDEADLK         = syscall.Errno(0x23)\n\tEDEADLOCK       = syscall.Errno(0x23)\n\tEDESTADDRREQ    = syscall.Errno(0x59)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x7a)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x70)\n\tEHOSTUNREACH    = syscall.Errno(0x71)\n\tEHWPOISON       = syscall.Errno(0x85)\n\tEIDRM           = syscall.Errno(0x2b)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x73)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x6a)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x7f)\n\tEKEYREJECTED    = syscall.Errno(0x81)\n\tEKEYREVOKED     = syscall.Errno(0x80)\n\tEL2HLT          = syscall.Errno(0x33)\n\tEL2NSYNC        = syscall.Errno(0x2d)\n\tEL3HLT          = syscall.Errno(0x2e)\n\tEL3RST          = syscall.Errno(0x2f)\n\tELIBACC         = syscall.Errno(0x4f)\n\tELIBBAD         = syscall.Errno(0x50)\n\tELIBEXEC        = syscall.Errno(0x53)\n\tELIBMAX         = syscall.Errno(0x52)\n\tELIBSCN         = syscall.Errno(0x51)\n\tELNRNG          = syscall.Errno(0x30)\n\tELOOP           = syscall.Errno(0x28)\n\tEMEDIUMTYPE     = syscall.Errno(0x7c)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x5a)\n\tEMULTIHOP       = syscall.Errno(0x48)\n\tENAMETOOLONG    = syscall.Errno(0x24)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x64)\n\tENETRESET       = syscall.Errno(0x66)\n\tENETUNREACH     = syscall.Errno(0x65)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x37)\n\tENOBUFS         = syscall.Errno(0x69)\n\tENOCSI          = syscall.Errno(0x32)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x7e)\n\tENOLCK          = syscall.Errno(0x25)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x7b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x2a)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x5c)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x26)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x6b)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x27)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x83)\n\tENOTSOCK        = syscall.Errno(0x58)\n\tENOTSUP         = syscall.Errno(0x5f)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x4c)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x5f)\n\tEOVERFLOW       = syscall.Errno(0x4b)\n\tEOWNERDEAD      = syscall.Errno(0x82)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x60)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x5d)\n\tEPROTOTYPE      = syscall.Errno(0x5b)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x4e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x55)\n\tERFKILL         = syscall.Errno(0x84)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x6c)\n\tESOCKTNOSUPPORT = syscall.Errno(0x5e)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x74)\n\tESTRPIPE        = syscall.Errno(0x56)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x6e)\n\tETOOMANYREFS    = syscall.Errno(0x6d)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x31)\n\tEUSERS          = syscall.Errno(0x57)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x36)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0x7)\n\tSIGCHLD   = syscall.Signal(0x11)\n\tSIGCLD    = syscall.Signal(0x11)\n\tSIGCONT   = syscall.Signal(0x12)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x1d)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x1d)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1e)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTKFLT = syscall.Signal(0x10)\n\tSIGSTOP   = syscall.Signal(0x13)\n\tSIGSYS    = syscall.Signal(0x1f)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x14)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x17)\n\tSIGUSR1   = syscall.Signal(0xa)\n\tSIGUSR2   = syscall.Signal(0xc)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t35:  \"resource deadlock avoided\",\n\t36:  \"file name too long\",\n\t37:  \"no locks available\",\n\t38:  \"function not implemented\",\n\t39:  \"directory not empty\",\n\t40:  \"too many levels of symbolic links\",\n\t42:  \"no message of desired type\",\n\t43:  \"identifier removed\",\n\t44:  \"channel number out of range\",\n\t45:  \"level 2 not synchronized\",\n\t46:  \"level 3 halted\",\n\t47:  \"level 3 reset\",\n\t48:  \"link number out of range\",\n\t49:  \"protocol driver not attached\",\n\t50:  \"no CSI structure available\",\n\t51:  \"level 2 halted\",\n\t52:  \"invalid exchange\",\n\t53:  \"invalid request descriptor\",\n\t54:  \"exchange full\",\n\t55:  \"no anode\",\n\t56:  \"invalid request code\",\n\t57:  \"invalid slot\",\n\t59:  \"bad font file format\",\n\t60:  \"device not a stream\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of streams resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"multihop attempted\",\n\t73:  \"RFS specific error\",\n\t74:  \"bad message\",\n\t75:  \"value too large for defined data type\",\n\t76:  \"name not unique on network\",\n\t77:  \"file descriptor in bad state\",\n\t78:  \"remote address changed\",\n\t79:  \"can not access a needed shared library\",\n\t80:  \"accessing a corrupted shared library\",\n\t81:  \".lib section in a.out corrupted\",\n\t82:  \"attempting to link in too many shared libraries\",\n\t83:  \"cannot exec a shared library directly\",\n\t84:  \"invalid or incomplete multibyte or wide character\",\n\t85:  \"interrupted system call should be restarted\",\n\t86:  \"streams pipe error\",\n\t87:  \"too many users\",\n\t88:  \"socket operation on non-socket\",\n\t89:  \"destination address required\",\n\t90:  \"message too long\",\n\t91:  \"protocol wrong type for socket\",\n\t92:  \"protocol not available\",\n\t93:  \"protocol not supported\",\n\t94:  \"socket type not supported\",\n\t95:  \"operation not supported\",\n\t96:  \"protocol family not supported\",\n\t97:  \"address family not supported by protocol\",\n\t98:  \"address already in use\",\n\t99:  \"cannot assign requested address\",\n\t100: \"network is down\",\n\t101: \"network is unreachable\",\n\t102: \"network dropped connection on reset\",\n\t103: \"software caused connection abort\",\n\t104: \"connection reset by peer\",\n\t105: \"no buffer space available\",\n\t106: \"transport endpoint is already connected\",\n\t107: \"transport endpoint is not connected\",\n\t108: \"cannot send after transport endpoint shutdown\",\n\t109: \"too many references: cannot splice\",\n\t110: \"connection timed out\",\n\t111: \"connection refused\",\n\t112: \"host is down\",\n\t113: \"no route to host\",\n\t114: \"operation already in progress\",\n\t115: \"operation now in progress\",\n\t116: \"stale file handle\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"disk quota exceeded\",\n\t123: \"no medium found\",\n\t124: \"wrong medium type\",\n\t125: \"operation canceled\",\n\t126: \"required key not available\",\n\t127: \"key has expired\",\n\t128: \"key has been revoked\",\n\t129: \"key was rejected by service\",\n\t130: \"owner died\",\n\t131: \"state not recoverable\",\n\t132: \"operation not possible due to RF-kill\",\n\t133: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"stack fault\",\n\t17: \"child exited\",\n\t18: \"continued\",\n\t19: \"stopped (signal)\",\n\t20: \"stopped\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"urgent I/O condition\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"I/O possible\",\n\t30: \"power failure\",\n\t31: \"bad system call\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_arm.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x80041270\n\tBLKBSZSET                            = 0x40041271\n\tBLKFLSBUF                            = 0x1261\n\tBLKFRAGET                            = 0x1265\n\tBLKFRASET                            = 0x1264\n\tBLKGETSIZE                           = 0x1260\n\tBLKGETSIZE64                         = 0x80041272\n\tBLKPBSZGET                           = 0x127b\n\tBLKRAGET                             = 0x1263\n\tBLKRASET                             = 0x1262\n\tBLKROGET                             = 0x125e\n\tBLKROSET                             = 0x125d\n\tBLKRRPART                            = 0x125f\n\tBLKSECTGET                           = 0x1267\n\tBLKSECTSET                           = 0x1266\n\tBLKSSZGET                            = 0x1268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x800\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x1000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x400c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x40106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x800c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0xc\n\tF_GETLK64                            = 0xc\n\tF_GETOWN                             = 0x9\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0xd\n\tF_SETLK64                            = 0xd\n\tF_SETLKW                             = 0xe\n\tF_SETLKW64                           = 0xe\n\tF_SETOWN                             = 0x8\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x8000\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x800\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x7b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x20\n\tMAP_ANONYMOUS                        = 0x20\n\tMAP_DENYWRITE                        = 0x800\n\tMAP_EXECUTABLE                       = 0x1000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x100\n\tMAP_HUGETLB                          = 0x40000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x2000\n\tMAP_NONBLOCK                         = 0x10000\n\tMAP_NORESERVE                        = 0x4000\n\tMAP_POPULATE                         = 0x8000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x20000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x400\n\tO_ASYNC                              = 0x2000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x40\n\tO_DIRECT                             = 0x10000\n\tO_DIRECTORY                          = 0x4000\n\tO_DSYNC                              = 0x1000\n\tO_EXCL                               = 0x80\n\tO_FSYNC                              = 0x101000\n\tO_LARGEFILE                          = 0x20000\n\tO_NDELAY                             = 0x800\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x100\n\tO_NOFOLLOW                           = 0x8000\n\tO_NONBLOCK                           = 0x800\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x101000\n\tO_SYNC                               = 0x101000\n\tO_TMPFILE                            = 0x404000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x2401\n\tPERF_EVENT_IOC_ENABLE                = 0x2400\n\tPERF_EVENT_IOC_ID                    = 0x80042407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x40042409\n\tPERF_EVENT_IOC_PERIOD                = 0x40082404\n\tPERF_EVENT_IOC_REFRESH               = 0x2402\n\tPERF_EVENT_IOC_RESET                 = 0x2403\n\tPERF_EVENT_IOC_SET_BPF               = 0x40042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x40042406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x2405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETCRUNCHREGS                 = 0x19\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETHBPREGS                    = 0x1d\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GETVFPREGS                    = 0x1b\n\tPTRACE_GETWMMXREGS                   = 0x12\n\tPTRACE_GET_THREAD_AREA               = 0x16\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETCRUNCHREGS                 = 0x1a\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETHBPREGS                    = 0x1e\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SETVFPREGS                    = 0x1c\n\tPTRACE_SETWMMXREGS                   = 0x13\n\tPTRACE_SET_SYSCALL                   = 0x17\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tPT_DATA_ADDR                         = 0x10004\n\tPT_TEXT_ADDR                         = 0x10000\n\tPT_TEXT_END_ADDR                     = 0x10008\n\tRLIMIT_AS                            = 0x9\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x8\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x7\n\tRLIMIT_NPROC                         = 0x6\n\tRLIMIT_RSS                           = 0x5\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x8905\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x8904\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x541b\n\tSIOCOUTQ                             = 0x5411\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x8902\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x2\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x800\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x1\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0x1\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1e\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x6\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x27\n\tSO_DONTROUTE                         = 0x5\n\tSO_ERROR                             = 0x4\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x9\n\tSO_LINGER                            = 0xd\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0xa\n\tSO_PASSCRED                          = 0x10\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x11\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1f\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x26\n\tSO_RCVBUF                            = 0x8\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x12\n\tSO_RCVTIMEO                          = 0x14\n\tSO_REUSEADDR                         = 0x2\n\tSO_REUSEPORT                         = 0xf\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x7\n\tSO_SNDBUFFORCE                       = 0x20\n\tSO_SNDLOWAT                          = 0x13\n\tSO_SNDTIMEO                          = 0x15\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x3\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x540b\n\tTCGETA                               = 0x5405\n\tTCGETS                               = 0x5401\n\tTCGETS2                              = 0x802c542a\n\tTCGETX                               = 0x5432\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x2\n\tTCSBRK                               = 0x5409\n\tTCSBRKP                              = 0x5425\n\tTCSETA                               = 0x5406\n\tTCSETAF                              = 0x5408\n\tTCSETAW                              = 0x5407\n\tTCSETS                               = 0x5402\n\tTCSETS2                              = 0x402c542b\n\tTCSETSF                              = 0x5404\n\tTCSETSF2                             = 0x402c542d\n\tTCSETSW                              = 0x5403\n\tTCSETSW2                             = 0x402c542c\n\tTCSETX                               = 0x5433\n\tTCSETXF                              = 0x5434\n\tTCSETXW                              = 0x5435\n\tTCXONC                               = 0x540a\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x541d\n\tTIOCEXCL                             = 0x540c\n\tTIOCGDEV                             = 0x80045432\n\tTIOCGETD                             = 0x5424\n\tTIOCGEXCL                            = 0x80045440\n\tTIOCGICOUNT                          = 0x545d\n\tTIOCGLCKTRMIOS                       = 0x5456\n\tTIOCGPGRP                            = 0x540f\n\tTIOCGPKT                             = 0x80045438\n\tTIOCGPTLCK                           = 0x80045439\n\tTIOCGPTN                             = 0x80045430\n\tTIOCGPTPEER                          = 0x5441\n\tTIOCGRS485                           = 0x542e\n\tTIOCGSERIAL                          = 0x541e\n\tTIOCGSID                             = 0x5429\n\tTIOCGSOFTCAR                         = 0x5419\n\tTIOCGWINSZ                           = 0x5413\n\tTIOCINQ                              = 0x541b\n\tTIOCLINUX                            = 0x541c\n\tTIOCMBIC                             = 0x5417\n\tTIOCMBIS                             = 0x5416\n\tTIOCMGET                             = 0x5415\n\tTIOCMIWAIT                           = 0x545c\n\tTIOCMSET                             = 0x5418\n\tTIOCM_CAR                            = 0x40\n\tTIOCM_CD                             = 0x40\n\tTIOCM_CTS                            = 0x20\n\tTIOCM_DSR                            = 0x100\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x80\n\tTIOCM_RNG                            = 0x80\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x10\n\tTIOCM_ST                             = 0x8\n\tTIOCNOTTY                            = 0x5422\n\tTIOCNXCL                             = 0x540d\n\tTIOCOUTQ                             = 0x5411\n\tTIOCPKT                              = 0x5420\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x540e\n\tTIOCSERCONFIG                        = 0x5453\n\tTIOCSERGETLSR                        = 0x5459\n\tTIOCSERGETMULTI                      = 0x545a\n\tTIOCSERGSTRUCT                       = 0x5458\n\tTIOCSERGWILD                         = 0x5454\n\tTIOCSERSETMULTI                      = 0x545b\n\tTIOCSERSWILD                         = 0x5455\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x5423\n\tTIOCSIG                              = 0x40045436\n\tTIOCSLCKTRMIOS                       = 0x5457\n\tTIOCSPGRP                            = 0x5410\n\tTIOCSPTLCK                           = 0x40045431\n\tTIOCSRS485                           = 0x542f\n\tTIOCSSERIAL                          = 0x541f\n\tTIOCSSOFTCAR                         = 0x541a\n\tTIOCSTI                              = 0x5412\n\tTIOCSWINSZ                           = 0x5414\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x100\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x400854d5\n\tTUNDETACHFILTER                      = 0x400854d6\n\tTUNGETFEATURES                       = 0x800454cf\n\tTUNGETFILTER                         = 0x800854db\n\tTUNGETIFF                            = 0x800454d2\n\tTUNGETSNDBUF                         = 0x800454d3\n\tTUNGETVNETBE                         = 0x800454df\n\tTUNGETVNETHDRSZ                      = 0x800454d7\n\tTUNGETVNETLE                         = 0x800454dd\n\tTUNSETDEBUG                          = 0x400454c9\n\tTUNSETGROUP                          = 0x400454ce\n\tTUNSETIFF                            = 0x400454ca\n\tTUNSETIFINDEX                        = 0x400454da\n\tTUNSETLINK                           = 0x400454cd\n\tTUNSETNOCSUM                         = 0x400454c8\n\tTUNSETOFFLOAD                        = 0x400454d0\n\tTUNSETOWNER                          = 0x400454cc\n\tTUNSETPERSIST                        = 0x400454cb\n\tTUNSETQUEUE                          = 0x400454d9\n\tTUNSETSNDBUF                         = 0x400454d4\n\tTUNSETTXFILTER                       = 0x400454d1\n\tTUNSETVNETBE                         = 0x400454de\n\tTUNSETVNETHDRSZ                      = 0x400454d8\n\tTUNSETVNETLE                         = 0x400454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x4\n\tVEOL                                 = 0xb\n\tVEOL2                                = 0x10\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x6\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x80045702\n\tWDIOC_GETPRETIMEOUT                  = 0x80045709\n\tWDIOC_GETSTATUS                      = 0x80045701\n\tWDIOC_GETSUPPORT                     = 0x80285700\n\tWDIOC_GETTEMP                        = 0x80045703\n\tWDIOC_GETTIMELEFT                    = 0x8004570a\n\tWDIOC_GETTIMEOUT                     = 0x80045707\n\tWDIOC_KEEPALIVE                      = 0x80045705\n\tWDIOC_SETOPTIONS                     = 0x80045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x20\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x62)\n\tEADDRNOTAVAIL   = syscall.Errno(0x63)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x61)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x72)\n\tEBADE           = syscall.Errno(0x34)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x4d)\n\tEBADMSG         = syscall.Errno(0x4a)\n\tEBADR           = syscall.Errno(0x35)\n\tEBADRQC         = syscall.Errno(0x38)\n\tEBADSLT         = syscall.Errno(0x39)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7d)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x2c)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x67)\n\tECONNREFUSED    = syscall.Errno(0x6f)\n\tECONNRESET      = syscall.Errno(0x68)\n\tEDEADLK         = syscall.Errno(0x23)\n\tEDEADLOCK       = syscall.Errno(0x23)\n\tEDESTADDRREQ    = syscall.Errno(0x59)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x7a)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x70)\n\tEHOSTUNREACH    = syscall.Errno(0x71)\n\tEHWPOISON       = syscall.Errno(0x85)\n\tEIDRM           = syscall.Errno(0x2b)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x73)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x6a)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x7f)\n\tEKEYREJECTED    = syscall.Errno(0x81)\n\tEKEYREVOKED     = syscall.Errno(0x80)\n\tEL2HLT          = syscall.Errno(0x33)\n\tEL2NSYNC        = syscall.Errno(0x2d)\n\tEL3HLT          = syscall.Errno(0x2e)\n\tEL3RST          = syscall.Errno(0x2f)\n\tELIBACC         = syscall.Errno(0x4f)\n\tELIBBAD         = syscall.Errno(0x50)\n\tELIBEXEC        = syscall.Errno(0x53)\n\tELIBMAX         = syscall.Errno(0x52)\n\tELIBSCN         = syscall.Errno(0x51)\n\tELNRNG          = syscall.Errno(0x30)\n\tELOOP           = syscall.Errno(0x28)\n\tEMEDIUMTYPE     = syscall.Errno(0x7c)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x5a)\n\tEMULTIHOP       = syscall.Errno(0x48)\n\tENAMETOOLONG    = syscall.Errno(0x24)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x64)\n\tENETRESET       = syscall.Errno(0x66)\n\tENETUNREACH     = syscall.Errno(0x65)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x37)\n\tENOBUFS         = syscall.Errno(0x69)\n\tENOCSI          = syscall.Errno(0x32)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x7e)\n\tENOLCK          = syscall.Errno(0x25)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x7b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x2a)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x5c)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x26)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x6b)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x27)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x83)\n\tENOTSOCK        = syscall.Errno(0x58)\n\tENOTSUP         = syscall.Errno(0x5f)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x4c)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x5f)\n\tEOVERFLOW       = syscall.Errno(0x4b)\n\tEOWNERDEAD      = syscall.Errno(0x82)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x60)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x5d)\n\tEPROTOTYPE      = syscall.Errno(0x5b)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x4e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x55)\n\tERFKILL         = syscall.Errno(0x84)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x6c)\n\tESOCKTNOSUPPORT = syscall.Errno(0x5e)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x74)\n\tESTRPIPE        = syscall.Errno(0x56)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x6e)\n\tETOOMANYREFS    = syscall.Errno(0x6d)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x31)\n\tEUSERS          = syscall.Errno(0x57)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x36)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0x7)\n\tSIGCHLD   = syscall.Signal(0x11)\n\tSIGCLD    = syscall.Signal(0x11)\n\tSIGCONT   = syscall.Signal(0x12)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x1d)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x1d)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1e)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTKFLT = syscall.Signal(0x10)\n\tSIGSTOP   = syscall.Signal(0x13)\n\tSIGSYS    = syscall.Signal(0x1f)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x14)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x17)\n\tSIGUSR1   = syscall.Signal(0xa)\n\tSIGUSR2   = syscall.Signal(0xc)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t35:  \"resource deadlock avoided\",\n\t36:  \"file name too long\",\n\t37:  \"no locks available\",\n\t38:  \"function not implemented\",\n\t39:  \"directory not empty\",\n\t40:  \"too many levels of symbolic links\",\n\t42:  \"no message of desired type\",\n\t43:  \"identifier removed\",\n\t44:  \"channel number out of range\",\n\t45:  \"level 2 not synchronized\",\n\t46:  \"level 3 halted\",\n\t47:  \"level 3 reset\",\n\t48:  \"link number out of range\",\n\t49:  \"protocol driver not attached\",\n\t50:  \"no CSI structure available\",\n\t51:  \"level 2 halted\",\n\t52:  \"invalid exchange\",\n\t53:  \"invalid request descriptor\",\n\t54:  \"exchange full\",\n\t55:  \"no anode\",\n\t56:  \"invalid request code\",\n\t57:  \"invalid slot\",\n\t59:  \"bad font file format\",\n\t60:  \"device not a stream\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of streams resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"multihop attempted\",\n\t73:  \"RFS specific error\",\n\t74:  \"bad message\",\n\t75:  \"value too large for defined data type\",\n\t76:  \"name not unique on network\",\n\t77:  \"file descriptor in bad state\",\n\t78:  \"remote address changed\",\n\t79:  \"can not access a needed shared library\",\n\t80:  \"accessing a corrupted shared library\",\n\t81:  \".lib section in a.out corrupted\",\n\t82:  \"attempting to link in too many shared libraries\",\n\t83:  \"cannot exec a shared library directly\",\n\t84:  \"invalid or incomplete multibyte or wide character\",\n\t85:  \"interrupted system call should be restarted\",\n\t86:  \"streams pipe error\",\n\t87:  \"too many users\",\n\t88:  \"socket operation on non-socket\",\n\t89:  \"destination address required\",\n\t90:  \"message too long\",\n\t91:  \"protocol wrong type for socket\",\n\t92:  \"protocol not available\",\n\t93:  \"protocol not supported\",\n\t94:  \"socket type not supported\",\n\t95:  \"operation not supported\",\n\t96:  \"protocol family not supported\",\n\t97:  \"address family not supported by protocol\",\n\t98:  \"address already in use\",\n\t99:  \"cannot assign requested address\",\n\t100: \"network is down\",\n\t101: \"network is unreachable\",\n\t102: \"network dropped connection on reset\",\n\t103: \"software caused connection abort\",\n\t104: \"connection reset by peer\",\n\t105: \"no buffer space available\",\n\t106: \"transport endpoint is already connected\",\n\t107: \"transport endpoint is not connected\",\n\t108: \"cannot send after transport endpoint shutdown\",\n\t109: \"too many references: cannot splice\",\n\t110: \"connection timed out\",\n\t111: \"connection refused\",\n\t112: \"host is down\",\n\t113: \"no route to host\",\n\t114: \"operation already in progress\",\n\t115: \"operation now in progress\",\n\t116: \"stale file handle\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"disk quota exceeded\",\n\t123: \"no medium found\",\n\t124: \"wrong medium type\",\n\t125: \"operation canceled\",\n\t126: \"required key not available\",\n\t127: \"key has expired\",\n\t128: \"key has been revoked\",\n\t129: \"key was rejected by service\",\n\t130: \"owner died\",\n\t131: \"state not recoverable\",\n\t132: \"operation not possible due to RF-kill\",\n\t133: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"stack fault\",\n\t17: \"child exited\",\n\t18: \"continued\",\n\t19: \"stopped (signal)\",\n\t20: \"stopped\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"urgent I/O condition\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"I/O possible\",\n\t30: \"power failure\",\n\t31: \"bad system call\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm64,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x80081270\n\tBLKBSZSET                            = 0x40081271\n\tBLKFLSBUF                            = 0x1261\n\tBLKFRAGET                            = 0x1265\n\tBLKFRASET                            = 0x1264\n\tBLKGETSIZE                           = 0x1260\n\tBLKGETSIZE64                         = 0x80081272\n\tBLKPBSZGET                           = 0x127b\n\tBLKRAGET                             = 0x1263\n\tBLKRASET                             = 0x1262\n\tBLKROGET                             = 0x125e\n\tBLKROSET                             = 0x125d\n\tBLKRRPART                            = 0x125f\n\tBLKSECTGET                           = 0x1267\n\tBLKSECTSET                           = 0x1266\n\tBLKSSZGET                            = 0x1268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x800\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tESR_MAGIC                            = 0x45535201\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tEXTRA_MAGIC                          = 0x45585401\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x1000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x400c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x40106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x800c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0x5\n\tF_GETLK64                            = 0x5\n\tF_GETOWN                             = 0x9\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x6\n\tF_SETLK64                            = 0x6\n\tF_SETLKW                             = 0x7\n\tF_SETLKW64                           = 0x7\n\tF_SETOWN                             = 0x8\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x8000\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x800\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x7b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x20\n\tMAP_ANONYMOUS                        = 0x20\n\tMAP_DENYWRITE                        = 0x800\n\tMAP_EXECUTABLE                       = 0x1000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x100\n\tMAP_HUGETLB                          = 0x40000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x2000\n\tMAP_NONBLOCK                         = 0x10000\n\tMAP_NORESERVE                        = 0x4000\n\tMAP_POPULATE                         = 0x8000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x20000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x400\n\tO_ASYNC                              = 0x2000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x40\n\tO_DIRECT                             = 0x10000\n\tO_DIRECTORY                          = 0x4000\n\tO_DSYNC                              = 0x1000\n\tO_EXCL                               = 0x80\n\tO_FSYNC                              = 0x101000\n\tO_LARGEFILE                          = 0x0\n\tO_NDELAY                             = 0x800\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x100\n\tO_NOFOLLOW                           = 0x8000\n\tO_NONBLOCK                           = 0x800\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x101000\n\tO_SYNC                               = 0x101000\n\tO_TMPFILE                            = 0x404000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x2401\n\tPERF_EVENT_IOC_ENABLE                = 0x2400\n\tPERF_EVENT_IOC_ID                    = 0x80082407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x40042409\n\tPERF_EVENT_IOC_PERIOD                = 0x40082404\n\tPERF_EVENT_IOC_REFRESH               = 0x2402\n\tPERF_EVENT_IOC_RESET                 = 0x2403\n\tPERF_EVENT_IOC_SET_BPF               = 0x40042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x40082406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x2405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffffffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tRLIMIT_AS                            = 0x9\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x8\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x7\n\tRLIMIT_NPROC                         = 0x6\n\tRLIMIT_RSS                           = 0x5\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x8905\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x8904\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x541b\n\tSIOCOUTQ                             = 0x5411\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x8902\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x2\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x800\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x1\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0x1\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1e\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x6\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x27\n\tSO_DONTROUTE                         = 0x5\n\tSO_ERROR                             = 0x4\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x9\n\tSO_LINGER                            = 0xd\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0xa\n\tSO_PASSCRED                          = 0x10\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x11\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1f\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x26\n\tSO_RCVBUF                            = 0x8\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x12\n\tSO_RCVTIMEO                          = 0x14\n\tSO_REUSEADDR                         = 0x2\n\tSO_REUSEPORT                         = 0xf\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x7\n\tSO_SNDBUFFORCE                       = 0x20\n\tSO_SNDLOWAT                          = 0x13\n\tSO_SNDTIMEO                          = 0x15\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x3\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x540b\n\tTCGETA                               = 0x5405\n\tTCGETS                               = 0x5401\n\tTCGETS2                              = 0x802c542a\n\tTCGETX                               = 0x5432\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x2\n\tTCSBRK                               = 0x5409\n\tTCSBRKP                              = 0x5425\n\tTCSETA                               = 0x5406\n\tTCSETAF                              = 0x5408\n\tTCSETAW                              = 0x5407\n\tTCSETS                               = 0x5402\n\tTCSETS2                              = 0x402c542b\n\tTCSETSF                              = 0x5404\n\tTCSETSF2                             = 0x402c542d\n\tTCSETSW                              = 0x5403\n\tTCSETSW2                             = 0x402c542c\n\tTCSETX                               = 0x5433\n\tTCSETXF                              = 0x5434\n\tTCSETXW                              = 0x5435\n\tTCXONC                               = 0x540a\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x541d\n\tTIOCEXCL                             = 0x540c\n\tTIOCGDEV                             = 0x80045432\n\tTIOCGETD                             = 0x5424\n\tTIOCGEXCL                            = 0x80045440\n\tTIOCGICOUNT                          = 0x545d\n\tTIOCGLCKTRMIOS                       = 0x5456\n\tTIOCGPGRP                            = 0x540f\n\tTIOCGPKT                             = 0x80045438\n\tTIOCGPTLCK                           = 0x80045439\n\tTIOCGPTN                             = 0x80045430\n\tTIOCGPTPEER                          = 0x5441\n\tTIOCGRS485                           = 0x542e\n\tTIOCGSERIAL                          = 0x541e\n\tTIOCGSID                             = 0x5429\n\tTIOCGSOFTCAR                         = 0x5419\n\tTIOCGWINSZ                           = 0x5413\n\tTIOCINQ                              = 0x541b\n\tTIOCLINUX                            = 0x541c\n\tTIOCMBIC                             = 0x5417\n\tTIOCMBIS                             = 0x5416\n\tTIOCMGET                             = 0x5415\n\tTIOCMIWAIT                           = 0x545c\n\tTIOCMSET                             = 0x5418\n\tTIOCM_CAR                            = 0x40\n\tTIOCM_CD                             = 0x40\n\tTIOCM_CTS                            = 0x20\n\tTIOCM_DSR                            = 0x100\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x80\n\tTIOCM_RNG                            = 0x80\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x10\n\tTIOCM_ST                             = 0x8\n\tTIOCNOTTY                            = 0x5422\n\tTIOCNXCL                             = 0x540d\n\tTIOCOUTQ                             = 0x5411\n\tTIOCPKT                              = 0x5420\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x540e\n\tTIOCSERCONFIG                        = 0x5453\n\tTIOCSERGETLSR                        = 0x5459\n\tTIOCSERGETMULTI                      = 0x545a\n\tTIOCSERGSTRUCT                       = 0x5458\n\tTIOCSERGWILD                         = 0x5454\n\tTIOCSERSETMULTI                      = 0x545b\n\tTIOCSERSWILD                         = 0x5455\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x5423\n\tTIOCSIG                              = 0x40045436\n\tTIOCSLCKTRMIOS                       = 0x5457\n\tTIOCSPGRP                            = 0x5410\n\tTIOCSPTLCK                           = 0x40045431\n\tTIOCSRS485                           = 0x542f\n\tTIOCSSERIAL                          = 0x541f\n\tTIOCSSOFTCAR                         = 0x541a\n\tTIOCSTI                              = 0x5412\n\tTIOCSWINSZ                           = 0x5414\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x100\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x401054d5\n\tTUNDETACHFILTER                      = 0x401054d6\n\tTUNGETFEATURES                       = 0x800454cf\n\tTUNGETFILTER                         = 0x801054db\n\tTUNGETIFF                            = 0x800454d2\n\tTUNGETSNDBUF                         = 0x800454d3\n\tTUNGETVNETBE                         = 0x800454df\n\tTUNGETVNETHDRSZ                      = 0x800454d7\n\tTUNGETVNETLE                         = 0x800454dd\n\tTUNSETDEBUG                          = 0x400454c9\n\tTUNSETGROUP                          = 0x400454ce\n\tTUNSETIFF                            = 0x400454ca\n\tTUNSETIFINDEX                        = 0x400454da\n\tTUNSETLINK                           = 0x400454cd\n\tTUNSETNOCSUM                         = 0x400454c8\n\tTUNSETOFFLOAD                        = 0x400454d0\n\tTUNSETOWNER                          = 0x400454cc\n\tTUNSETPERSIST                        = 0x400454cb\n\tTUNSETQUEUE                          = 0x400454d9\n\tTUNSETSNDBUF                         = 0x400454d4\n\tTUNSETTXFILTER                       = 0x400454d1\n\tTUNSETVNETBE                         = 0x400454de\n\tTUNSETVNETHDRSZ                      = 0x400454d8\n\tTUNSETVNETLE                         = 0x400454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x4\n\tVEOL                                 = 0xb\n\tVEOL2                                = 0x10\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x6\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x80045702\n\tWDIOC_GETPRETIMEOUT                  = 0x80045709\n\tWDIOC_GETSTATUS                      = 0x80045701\n\tWDIOC_GETSUPPORT                     = 0x80285700\n\tWDIOC_GETTEMP                        = 0x80045703\n\tWDIOC_GETTIMELEFT                    = 0x8004570a\n\tWDIOC_GETTIMEOUT                     = 0x80045707\n\tWDIOC_KEEPALIVE                      = 0x80045705\n\tWDIOC_SETOPTIONS                     = 0x80045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x40\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x62)\n\tEADDRNOTAVAIL   = syscall.Errno(0x63)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x61)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x72)\n\tEBADE           = syscall.Errno(0x34)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x4d)\n\tEBADMSG         = syscall.Errno(0x4a)\n\tEBADR           = syscall.Errno(0x35)\n\tEBADRQC         = syscall.Errno(0x38)\n\tEBADSLT         = syscall.Errno(0x39)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7d)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x2c)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x67)\n\tECONNREFUSED    = syscall.Errno(0x6f)\n\tECONNRESET      = syscall.Errno(0x68)\n\tEDEADLK         = syscall.Errno(0x23)\n\tEDEADLOCK       = syscall.Errno(0x23)\n\tEDESTADDRREQ    = syscall.Errno(0x59)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x7a)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x70)\n\tEHOSTUNREACH    = syscall.Errno(0x71)\n\tEHWPOISON       = syscall.Errno(0x85)\n\tEIDRM           = syscall.Errno(0x2b)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x73)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x6a)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x7f)\n\tEKEYREJECTED    = syscall.Errno(0x81)\n\tEKEYREVOKED     = syscall.Errno(0x80)\n\tEL2HLT          = syscall.Errno(0x33)\n\tEL2NSYNC        = syscall.Errno(0x2d)\n\tEL3HLT          = syscall.Errno(0x2e)\n\tEL3RST          = syscall.Errno(0x2f)\n\tELIBACC         = syscall.Errno(0x4f)\n\tELIBBAD         = syscall.Errno(0x50)\n\tELIBEXEC        = syscall.Errno(0x53)\n\tELIBMAX         = syscall.Errno(0x52)\n\tELIBSCN         = syscall.Errno(0x51)\n\tELNRNG          = syscall.Errno(0x30)\n\tELOOP           = syscall.Errno(0x28)\n\tEMEDIUMTYPE     = syscall.Errno(0x7c)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x5a)\n\tEMULTIHOP       = syscall.Errno(0x48)\n\tENAMETOOLONG    = syscall.Errno(0x24)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x64)\n\tENETRESET       = syscall.Errno(0x66)\n\tENETUNREACH     = syscall.Errno(0x65)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x37)\n\tENOBUFS         = syscall.Errno(0x69)\n\tENOCSI          = syscall.Errno(0x32)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x7e)\n\tENOLCK          = syscall.Errno(0x25)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x7b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x2a)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x5c)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x26)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x6b)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x27)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x83)\n\tENOTSOCK        = syscall.Errno(0x58)\n\tENOTSUP         = syscall.Errno(0x5f)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x4c)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x5f)\n\tEOVERFLOW       = syscall.Errno(0x4b)\n\tEOWNERDEAD      = syscall.Errno(0x82)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x60)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x5d)\n\tEPROTOTYPE      = syscall.Errno(0x5b)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x4e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x55)\n\tERFKILL         = syscall.Errno(0x84)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x6c)\n\tESOCKTNOSUPPORT = syscall.Errno(0x5e)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x74)\n\tESTRPIPE        = syscall.Errno(0x56)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x6e)\n\tETOOMANYREFS    = syscall.Errno(0x6d)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x31)\n\tEUSERS          = syscall.Errno(0x57)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x36)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0x7)\n\tSIGCHLD   = syscall.Signal(0x11)\n\tSIGCLD    = syscall.Signal(0x11)\n\tSIGCONT   = syscall.Signal(0x12)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x1d)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x1d)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1e)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTKFLT = syscall.Signal(0x10)\n\tSIGSTOP   = syscall.Signal(0x13)\n\tSIGSYS    = syscall.Signal(0x1f)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x14)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x17)\n\tSIGUSR1   = syscall.Signal(0xa)\n\tSIGUSR2   = syscall.Signal(0xc)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t35:  \"resource deadlock avoided\",\n\t36:  \"file name too long\",\n\t37:  \"no locks available\",\n\t38:  \"function not implemented\",\n\t39:  \"directory not empty\",\n\t40:  \"too many levels of symbolic links\",\n\t42:  \"no message of desired type\",\n\t43:  \"identifier removed\",\n\t44:  \"channel number out of range\",\n\t45:  \"level 2 not synchronized\",\n\t46:  \"level 3 halted\",\n\t47:  \"level 3 reset\",\n\t48:  \"link number out of range\",\n\t49:  \"protocol driver not attached\",\n\t50:  \"no CSI structure available\",\n\t51:  \"level 2 halted\",\n\t52:  \"invalid exchange\",\n\t53:  \"invalid request descriptor\",\n\t54:  \"exchange full\",\n\t55:  \"no anode\",\n\t56:  \"invalid request code\",\n\t57:  \"invalid slot\",\n\t59:  \"bad font file format\",\n\t60:  \"device not a stream\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of streams resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"multihop attempted\",\n\t73:  \"RFS specific error\",\n\t74:  \"bad message\",\n\t75:  \"value too large for defined data type\",\n\t76:  \"name not unique on network\",\n\t77:  \"file descriptor in bad state\",\n\t78:  \"remote address changed\",\n\t79:  \"can not access a needed shared library\",\n\t80:  \"accessing a corrupted shared library\",\n\t81:  \".lib section in a.out corrupted\",\n\t82:  \"attempting to link in too many shared libraries\",\n\t83:  \"cannot exec a shared library directly\",\n\t84:  \"invalid or incomplete multibyte or wide character\",\n\t85:  \"interrupted system call should be restarted\",\n\t86:  \"streams pipe error\",\n\t87:  \"too many users\",\n\t88:  \"socket operation on non-socket\",\n\t89:  \"destination address required\",\n\t90:  \"message too long\",\n\t91:  \"protocol wrong type for socket\",\n\t92:  \"protocol not available\",\n\t93:  \"protocol not supported\",\n\t94:  \"socket type not supported\",\n\t95:  \"operation not supported\",\n\t96:  \"protocol family not supported\",\n\t97:  \"address family not supported by protocol\",\n\t98:  \"address already in use\",\n\t99:  \"cannot assign requested address\",\n\t100: \"network is down\",\n\t101: \"network is unreachable\",\n\t102: \"network dropped connection on reset\",\n\t103: \"software caused connection abort\",\n\t104: \"connection reset by peer\",\n\t105: \"no buffer space available\",\n\t106: \"transport endpoint is already connected\",\n\t107: \"transport endpoint is not connected\",\n\t108: \"cannot send after transport endpoint shutdown\",\n\t109: \"too many references: cannot splice\",\n\t110: \"connection timed out\",\n\t111: \"connection refused\",\n\t112: \"host is down\",\n\t113: \"no route to host\",\n\t114: \"operation already in progress\",\n\t115: \"operation now in progress\",\n\t116: \"stale file handle\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"disk quota exceeded\",\n\t123: \"no medium found\",\n\t124: \"wrong medium type\",\n\t125: \"operation canceled\",\n\t126: \"required key not available\",\n\t127: \"key has expired\",\n\t128: \"key has been revoked\",\n\t129: \"key was rejected by service\",\n\t130: \"owner died\",\n\t131: \"state not recoverable\",\n\t132: \"operation not possible due to RF-kill\",\n\t133: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"stack fault\",\n\t17: \"child exited\",\n\t18: \"continued\",\n\t19: \"stopped (signal)\",\n\t20: \"stopped\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"urgent I/O condition\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"I/O possible\",\n\t30: \"power failure\",\n\t31: \"bad system call\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_mips.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x40041270\n\tBLKBSZSET                            = 0x80041271\n\tBLKFLSBUF                            = 0x20001261\n\tBLKFRAGET                            = 0x20001265\n\tBLKFRASET                            = 0x20001264\n\tBLKGETSIZE                           = 0x20001260\n\tBLKGETSIZE64                         = 0x40041272\n\tBLKPBSZGET                           = 0x2000127b\n\tBLKRAGET                             = 0x20001263\n\tBLKRASET                             = 0x20001262\n\tBLKROGET                             = 0x2000125e\n\tBLKROSET                             = 0x2000125d\n\tBLKRRPART                            = 0x2000125f\n\tBLKSECTGET                           = 0x20001267\n\tBLKSECTSET                           = 0x20001266\n\tBLKSSZGET                            = 0x20001268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x80\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x2000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x800c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x80106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x400c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0x21\n\tF_GETLK64                            = 0x21\n\tF_GETOWN                             = 0x17\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x22\n\tF_SETLK64                            = 0x22\n\tF_SETLKW                             = 0x23\n\tF_SETLKW64                           = 0x23\n\tF_SETOWN                             = 0x18\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x100\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x80\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x200007b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x800\n\tMAP_ANONYMOUS                        = 0x800\n\tMAP_DENYWRITE                        = 0x2000\n\tMAP_EXECUTABLE                       = 0x4000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x1000\n\tMAP_HUGETLB                          = 0x80000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x8000\n\tMAP_NONBLOCK                         = 0x20000\n\tMAP_NORESERVE                        = 0x400\n\tMAP_POPULATE                         = 0x10000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_RENAME                           = 0x800\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x40000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x8\n\tO_ASYNC                              = 0x1000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x100\n\tO_DIRECT                             = 0x8000\n\tO_DIRECTORY                          = 0x10000\n\tO_DSYNC                              = 0x10\n\tO_EXCL                               = 0x400\n\tO_FSYNC                              = 0x4010\n\tO_LARGEFILE                          = 0x2000\n\tO_NDELAY                             = 0x80\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x800\n\tO_NOFOLLOW                           = 0x20000\n\tO_NONBLOCK                           = 0x80\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x4010\n\tO_SYNC                               = 0x4010\n\tO_TMPFILE                            = 0x410000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x20002401\n\tPERF_EVENT_IOC_ENABLE                = 0x20002400\n\tPERF_EVENT_IOC_ID                    = 0x40042407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x80042409\n\tPERF_EVENT_IOC_PERIOD                = 0x80082404\n\tPERF_EVENT_IOC_REFRESH               = 0x20002402\n\tPERF_EVENT_IOC_RESET                 = 0x20002403\n\tPERF_EVENT_IOC_SET_BPF               = 0x80042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x80042406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x20002405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GET_THREAD_AREA               = 0x19\n\tPTRACE_GET_THREAD_AREA_3264          = 0xc4\n\tPTRACE_GET_WATCH_REGS                = 0xd0\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKDATA_3264                 = 0xc1\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKTEXT_3264                 = 0xc0\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKEDATA_3264                 = 0xc3\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKETEXT_3264                 = 0xc2\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SET_THREAD_AREA               = 0x1a\n\tPTRACE_SET_WATCH_REGS                = 0xd1\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tRLIMIT_AS                            = 0x6\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x9\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x5\n\tRLIMIT_NPROC                         = 0x8\n\tRLIMIT_RSS                           = 0x7\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x40047307\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x40047309\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x467f\n\tSIOCOUTQ                             = 0x7472\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x80047308\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x1\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x80\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x2\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0xffff\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1009\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x20\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x1029\n\tSO_DONTROUTE                         = 0x10\n\tSO_ERROR                             = 0x1007\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x8\n\tSO_LINGER                            = 0x80\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0x100\n\tSO_PASSCRED                          = 0x11\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x12\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1e\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x1028\n\tSO_RCVBUF                            = 0x1002\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x1004\n\tSO_RCVTIMEO                          = 0x1006\n\tSO_REUSEADDR                         = 0x4\n\tSO_REUSEPORT                         = 0x200\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x1001\n\tSO_SNDBUFFORCE                       = 0x1f\n\tSO_SNDLOWAT                          = 0x1003\n\tSO_SNDTIMEO                          = 0x1005\n\tSO_STYLE                             = 0x1008\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x1008\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x5407\n\tTCGETA                               = 0x5401\n\tTCGETS                               = 0x540d\n\tTCGETS2                              = 0x4030542a\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x5410\n\tTCSBRK                               = 0x5405\n\tTCSBRKP                              = 0x5486\n\tTCSETA                               = 0x5402\n\tTCSETAF                              = 0x5404\n\tTCSETAW                              = 0x5403\n\tTCSETS                               = 0x540e\n\tTCSETS2                              = 0x8030542b\n\tTCSETSF                              = 0x5410\n\tTCSETSF2                             = 0x8030542d\n\tTCSETSW                              = 0x540f\n\tTCSETSW2                             = 0x8030542c\n\tTCXONC                               = 0x5406\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x80047478\n\tTIOCEXCL                             = 0x740d\n\tTIOCGDEV                             = 0x40045432\n\tTIOCGETD                             = 0x7400\n\tTIOCGETP                             = 0x7408\n\tTIOCGEXCL                            = 0x40045440\n\tTIOCGICOUNT                          = 0x5492\n\tTIOCGLCKTRMIOS                       = 0x548b\n\tTIOCGLTC                             = 0x7474\n\tTIOCGPGRP                            = 0x40047477\n\tTIOCGPKT                             = 0x40045438\n\tTIOCGPTLCK                           = 0x40045439\n\tTIOCGPTN                             = 0x40045430\n\tTIOCGPTPEER                          = 0x20005441\n\tTIOCGRS485                           = 0x4020542e\n\tTIOCGSERIAL                          = 0x5484\n\tTIOCGSID                             = 0x7416\n\tTIOCGSOFTCAR                         = 0x5481\n\tTIOCGWINSZ                           = 0x40087468\n\tTIOCINQ                              = 0x467f\n\tTIOCLINUX                            = 0x5483\n\tTIOCMBIC                             = 0x741c\n\tTIOCMBIS                             = 0x741b\n\tTIOCMGET                             = 0x741d\n\tTIOCMIWAIT                           = 0x5491\n\tTIOCMSET                             = 0x741a\n\tTIOCM_CAR                            = 0x100\n\tTIOCM_CD                             = 0x100\n\tTIOCM_CTS                            = 0x40\n\tTIOCM_DSR                            = 0x400\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x200\n\tTIOCM_RNG                            = 0x200\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x20\n\tTIOCM_ST                             = 0x10\n\tTIOCNOTTY                            = 0x5471\n\tTIOCNXCL                             = 0x740e\n\tTIOCOUTQ                             = 0x7472\n\tTIOCPKT                              = 0x5470\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x5480\n\tTIOCSERCONFIG                        = 0x5488\n\tTIOCSERGETLSR                        = 0x548e\n\tTIOCSERGETMULTI                      = 0x548f\n\tTIOCSERGSTRUCT                       = 0x548d\n\tTIOCSERGWILD                         = 0x5489\n\tTIOCSERSETMULTI                      = 0x5490\n\tTIOCSERSWILD                         = 0x548a\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x7401\n\tTIOCSETN                             = 0x740a\n\tTIOCSETP                             = 0x7409\n\tTIOCSIG                              = 0x80045436\n\tTIOCSLCKTRMIOS                       = 0x548c\n\tTIOCSLTC                             = 0x7475\n\tTIOCSPGRP                            = 0x80047476\n\tTIOCSPTLCK                           = 0x80045431\n\tTIOCSRS485                           = 0xc020542f\n\tTIOCSSERIAL                          = 0x5485\n\tTIOCSSOFTCAR                         = 0x5482\n\tTIOCSTI                              = 0x5472\n\tTIOCSWINSZ                           = 0x80087467\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x8000\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x800854d5\n\tTUNDETACHFILTER                      = 0x800854d6\n\tTUNGETFEATURES                       = 0x400454cf\n\tTUNGETFILTER                         = 0x400854db\n\tTUNGETIFF                            = 0x400454d2\n\tTUNGETSNDBUF                         = 0x400454d3\n\tTUNGETVNETBE                         = 0x400454df\n\tTUNGETVNETHDRSZ                      = 0x400454d7\n\tTUNGETVNETLE                         = 0x400454dd\n\tTUNSETDEBUG                          = 0x800454c9\n\tTUNSETGROUP                          = 0x800454ce\n\tTUNSETIFF                            = 0x800454ca\n\tTUNSETIFINDEX                        = 0x800454da\n\tTUNSETLINK                           = 0x800454cd\n\tTUNSETNOCSUM                         = 0x800454c8\n\tTUNSETOFFLOAD                        = 0x800454d0\n\tTUNSETOWNER                          = 0x800454cc\n\tTUNSETPERSIST                        = 0x800454cb\n\tTUNSETQUEUE                          = 0x800454d9\n\tTUNSETSNDBUF                         = 0x800454d4\n\tTUNSETTXFILTER                       = 0x800454d1\n\tTUNSETVNETBE                         = 0x800454de\n\tTUNSETVNETHDRSZ                      = 0x800454d8\n\tTUNSETVNETLE                         = 0x800454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x10\n\tVEOL                                 = 0x11\n\tVEOL2                                = 0x6\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x4\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVSWTCH                               = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x40045702\n\tWDIOC_GETPRETIMEOUT                  = 0x40045709\n\tWDIOC_GETSTATUS                      = 0x40045701\n\tWDIOC_GETSUPPORT                     = 0x40285700\n\tWDIOC_GETTEMP                        = 0x40045703\n\tWDIOC_GETTIMELEFT                    = 0x4004570a\n\tWDIOC_GETTIMEOUT                     = 0x40045707\n\tWDIOC_KEEPALIVE                      = 0x40045705\n\tWDIOC_SETOPTIONS                     = 0x40045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x20\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x7d)\n\tEADDRNOTAVAIL   = syscall.Errno(0x7e)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x7c)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x95)\n\tEBADE           = syscall.Errno(0x32)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x51)\n\tEBADMSG         = syscall.Errno(0x4d)\n\tEBADR           = syscall.Errno(0x33)\n\tEBADRQC         = syscall.Errno(0x36)\n\tEBADSLT         = syscall.Errno(0x37)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x9e)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x25)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x82)\n\tECONNREFUSED    = syscall.Errno(0x92)\n\tECONNRESET      = syscall.Errno(0x83)\n\tEDEADLK         = syscall.Errno(0x2d)\n\tEDEADLOCK       = syscall.Errno(0x38)\n\tEDESTADDRREQ    = syscall.Errno(0x60)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x46d)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x93)\n\tEHOSTUNREACH    = syscall.Errno(0x94)\n\tEHWPOISON       = syscall.Errno(0xa8)\n\tEIDRM           = syscall.Errno(0x24)\n\tEILSEQ          = syscall.Errno(0x58)\n\tEINIT           = syscall.Errno(0x8d)\n\tEINPROGRESS     = syscall.Errno(0x96)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x85)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x8b)\n\tEKEYEXPIRED     = syscall.Errno(0xa2)\n\tEKEYREJECTED    = syscall.Errno(0xa4)\n\tEKEYREVOKED     = syscall.Errno(0xa3)\n\tEL2HLT          = syscall.Errno(0x2c)\n\tEL2NSYNC        = syscall.Errno(0x26)\n\tEL3HLT          = syscall.Errno(0x27)\n\tEL3RST          = syscall.Errno(0x28)\n\tELIBACC         = syscall.Errno(0x53)\n\tELIBBAD         = syscall.Errno(0x54)\n\tELIBEXEC        = syscall.Errno(0x57)\n\tELIBMAX         = syscall.Errno(0x56)\n\tELIBSCN         = syscall.Errno(0x55)\n\tELNRNG          = syscall.Errno(0x29)\n\tELOOP           = syscall.Errno(0x5a)\n\tEMEDIUMTYPE     = syscall.Errno(0xa0)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x61)\n\tEMULTIHOP       = syscall.Errno(0x4a)\n\tENAMETOOLONG    = syscall.Errno(0x4e)\n\tENAVAIL         = syscall.Errno(0x8a)\n\tENETDOWN        = syscall.Errno(0x7f)\n\tENETRESET       = syscall.Errno(0x81)\n\tENETUNREACH     = syscall.Errno(0x80)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x35)\n\tENOBUFS         = syscall.Errno(0x84)\n\tENOCSI          = syscall.Errno(0x2b)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0xa1)\n\tENOLCK          = syscall.Errno(0x2e)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x9f)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x23)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x63)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x59)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x86)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x5d)\n\tENOTNAM         = syscall.Errno(0x89)\n\tENOTRECOVERABLE = syscall.Errno(0xa6)\n\tENOTSOCK        = syscall.Errno(0x5f)\n\tENOTSUP         = syscall.Errno(0x7a)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x50)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x7a)\n\tEOVERFLOW       = syscall.Errno(0x4f)\n\tEOWNERDEAD      = syscall.Errno(0xa5)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x7b)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x78)\n\tEPROTOTYPE      = syscall.Errno(0x62)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x52)\n\tEREMDEV         = syscall.Errno(0x8e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x8c)\n\tERESTART        = syscall.Errno(0x5b)\n\tERFKILL         = syscall.Errno(0xa7)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x8f)\n\tESOCKTNOSUPPORT = syscall.Errno(0x79)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x97)\n\tESTRPIPE        = syscall.Errno(0x5c)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x91)\n\tETOOMANYREFS    = syscall.Errno(0x90)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x87)\n\tEUNATCH         = syscall.Errno(0x2a)\n\tEUSERS          = syscall.Errno(0x5e)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x34)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x12)\n\tSIGCLD    = syscall.Signal(0x12)\n\tSIGCONT   = syscall.Signal(0x19)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x16)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x16)\n\tSIGPROF   = syscall.Signal(0x1d)\n\tSIGPWR    = syscall.Signal(0x13)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x17)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x18)\n\tSIGTTIN   = syscall.Signal(0x1a)\n\tSIGTTOU   = syscall.Signal(0x1b)\n\tSIGURG    = syscall.Signal(0x15)\n\tSIGUSR1   = syscall.Signal(0x10)\n\tSIGUSR2   = syscall.Signal(0x11)\n\tSIGVTALRM = syscall.Signal(0x1c)\n\tSIGWINCH  = syscall.Signal(0x14)\n\tSIGXCPU   = syscall.Signal(0x1e)\n\tSIGXFSZ   = syscall.Signal(0x1f)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:    \"operation not permitted\",\n\t2:    \"no such file or directory\",\n\t3:    \"no such process\",\n\t4:    \"interrupted system call\",\n\t5:    \"input/output error\",\n\t6:    \"no such device or address\",\n\t7:    \"argument list too long\",\n\t8:    \"exec format error\",\n\t9:    \"bad file descriptor\",\n\t10:   \"no child processes\",\n\t11:   \"resource temporarily unavailable\",\n\t12:   \"cannot allocate memory\",\n\t13:   \"permission denied\",\n\t14:   \"bad address\",\n\t15:   \"block device required\",\n\t16:   \"device or resource busy\",\n\t17:   \"file exists\",\n\t18:   \"invalid cross-device link\",\n\t19:   \"no such device\",\n\t20:   \"not a directory\",\n\t21:   \"is a directory\",\n\t22:   \"invalid argument\",\n\t23:   \"too many open files in system\",\n\t24:   \"too many open files\",\n\t25:   \"inappropriate ioctl for device\",\n\t26:   \"text file busy\",\n\t27:   \"file too large\",\n\t28:   \"no space left on device\",\n\t29:   \"illegal seek\",\n\t30:   \"read-only file system\",\n\t31:   \"too many links\",\n\t32:   \"broken pipe\",\n\t33:   \"numerical argument out of domain\",\n\t34:   \"numerical result out of range\",\n\t35:   \"no message of desired type\",\n\t36:   \"identifier removed\",\n\t37:   \"channel number out of range\",\n\t38:   \"level 2 not synchronized\",\n\t39:   \"level 3 halted\",\n\t40:   \"level 3 reset\",\n\t41:   \"link number out of range\",\n\t42:   \"protocol driver not attached\",\n\t43:   \"no CSI structure available\",\n\t44:   \"level 2 halted\",\n\t45:   \"resource deadlock avoided\",\n\t46:   \"no locks available\",\n\t50:   \"invalid exchange\",\n\t51:   \"invalid request descriptor\",\n\t52:   \"exchange full\",\n\t53:   \"no anode\",\n\t54:   \"invalid request code\",\n\t55:   \"invalid slot\",\n\t56:   \"file locking deadlock error\",\n\t59:   \"bad font file format\",\n\t60:   \"device not a stream\",\n\t61:   \"no data available\",\n\t62:   \"timer expired\",\n\t63:   \"out of streams resources\",\n\t64:   \"machine is not on the network\",\n\t65:   \"package not installed\",\n\t66:   \"object is remote\",\n\t67:   \"link has been severed\",\n\t68:   \"advertise error\",\n\t69:   \"srmount error\",\n\t70:   \"communication error on send\",\n\t71:   \"protocol error\",\n\t73:   \"RFS specific error\",\n\t74:   \"multihop attempted\",\n\t77:   \"bad message\",\n\t78:   \"file name too long\",\n\t79:   \"value too large for defined data type\",\n\t80:   \"name not unique on network\",\n\t81:   \"file descriptor in bad state\",\n\t82:   \"remote address changed\",\n\t83:   \"can not access a needed shared library\",\n\t84:   \"accessing a corrupted shared library\",\n\t85:   \".lib section in a.out corrupted\",\n\t86:   \"attempting to link in too many shared libraries\",\n\t87:   \"cannot exec a shared library directly\",\n\t88:   \"invalid or incomplete multibyte or wide character\",\n\t89:   \"function not implemented\",\n\t90:   \"too many levels of symbolic links\",\n\t91:   \"interrupted system call should be restarted\",\n\t92:   \"streams pipe error\",\n\t93:   \"directory not empty\",\n\t94:   \"too many users\",\n\t95:   \"socket operation on non-socket\",\n\t96:   \"destination address required\",\n\t97:   \"message too long\",\n\t98:   \"protocol wrong type for socket\",\n\t99:   \"protocol not available\",\n\t120:  \"protocol not supported\",\n\t121:  \"socket type not supported\",\n\t122:  \"operation not supported\",\n\t123:  \"protocol family not supported\",\n\t124:  \"address family not supported by protocol\",\n\t125:  \"address already in use\",\n\t126:  \"cannot assign requested address\",\n\t127:  \"network is down\",\n\t128:  \"network is unreachable\",\n\t129:  \"network dropped connection on reset\",\n\t130:  \"software caused connection abort\",\n\t131:  \"connection reset by peer\",\n\t132:  \"no buffer space available\",\n\t133:  \"transport endpoint is already connected\",\n\t134:  \"transport endpoint is not connected\",\n\t135:  \"structure needs cleaning\",\n\t137:  \"not a XENIX named type file\",\n\t138:  \"no XENIX semaphores available\",\n\t139:  \"is a named type file\",\n\t140:  \"remote I/O error\",\n\t141:  \"unknown error 141\",\n\t142:  \"unknown error 142\",\n\t143:  \"cannot send after transport endpoint shutdown\",\n\t144:  \"too many references: cannot splice\",\n\t145:  \"connection timed out\",\n\t146:  \"connection refused\",\n\t147:  \"host is down\",\n\t148:  \"no route to host\",\n\t149:  \"operation already in progress\",\n\t150:  \"operation now in progress\",\n\t151:  \"stale file handle\",\n\t158:  \"operation canceled\",\n\t159:  \"no medium found\",\n\t160:  \"wrong medium type\",\n\t161:  \"required key not available\",\n\t162:  \"key has expired\",\n\t163:  \"key has been revoked\",\n\t164:  \"key was rejected by service\",\n\t165:  \"owner died\",\n\t166:  \"state not recoverable\",\n\t167:  \"operation not possible due to RF-kill\",\n\t168:  \"memory page has hardware error\",\n\t1133: \"disk quota exceeded\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"user defined signal 1\",\n\t17: \"user defined signal 2\",\n\t18: \"child exited\",\n\t19: \"power failure\",\n\t20: \"window changed\",\n\t21: \"urgent I/O condition\",\n\t22: \"I/O possible\",\n\t23: \"stopped (signal)\",\n\t24: \"stopped\",\n\t25: \"continued\",\n\t26: \"stopped (tty input)\",\n\t27: \"stopped (tty output)\",\n\t28: \"virtual timer expired\",\n\t29: \"profiling timer expired\",\n\t30: \"CPU time limit exceeded\",\n\t31: \"file size limit exceeded\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips64,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x40081270\n\tBLKBSZSET                            = 0x80081271\n\tBLKFLSBUF                            = 0x20001261\n\tBLKFRAGET                            = 0x20001265\n\tBLKFRASET                            = 0x20001264\n\tBLKGETSIZE                           = 0x20001260\n\tBLKGETSIZE64                         = 0x40081272\n\tBLKPBSZGET                           = 0x2000127b\n\tBLKRAGET                             = 0x20001263\n\tBLKRASET                             = 0x20001262\n\tBLKROGET                             = 0x2000125e\n\tBLKROSET                             = 0x2000125d\n\tBLKRRPART                            = 0x2000125f\n\tBLKSECTGET                           = 0x20001267\n\tBLKSECTSET                           = 0x20001266\n\tBLKSSZGET                            = 0x20001268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x80\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x2000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x800c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x80106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x400c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0xe\n\tF_GETLK64                            = 0xe\n\tF_GETOWN                             = 0x17\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x6\n\tF_SETLK64                            = 0x6\n\tF_SETLKW                             = 0x7\n\tF_SETLKW64                           = 0x7\n\tF_SETOWN                             = 0x18\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x100\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x80\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x200007b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x800\n\tMAP_ANONYMOUS                        = 0x800\n\tMAP_DENYWRITE                        = 0x2000\n\tMAP_EXECUTABLE                       = 0x4000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x1000\n\tMAP_HUGETLB                          = 0x80000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x8000\n\tMAP_NONBLOCK                         = 0x20000\n\tMAP_NORESERVE                        = 0x400\n\tMAP_POPULATE                         = 0x10000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_RENAME                           = 0x800\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x40000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x8\n\tO_ASYNC                              = 0x1000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x100\n\tO_DIRECT                             = 0x8000\n\tO_DIRECTORY                          = 0x10000\n\tO_DSYNC                              = 0x10\n\tO_EXCL                               = 0x400\n\tO_FSYNC                              = 0x4010\n\tO_LARGEFILE                          = 0x0\n\tO_NDELAY                             = 0x80\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x800\n\tO_NOFOLLOW                           = 0x20000\n\tO_NONBLOCK                           = 0x80\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x4010\n\tO_SYNC                               = 0x4010\n\tO_TMPFILE                            = 0x410000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x20002401\n\tPERF_EVENT_IOC_ENABLE                = 0x20002400\n\tPERF_EVENT_IOC_ID                    = 0x40082407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x80042409\n\tPERF_EVENT_IOC_PERIOD                = 0x80082404\n\tPERF_EVENT_IOC_REFRESH               = 0x20002402\n\tPERF_EVENT_IOC_RESET                 = 0x20002403\n\tPERF_EVENT_IOC_SET_BPF               = 0x80042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x80082406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x20002405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffffffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GET_THREAD_AREA               = 0x19\n\tPTRACE_GET_THREAD_AREA_3264          = 0xc4\n\tPTRACE_GET_WATCH_REGS                = 0xd0\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKDATA_3264                 = 0xc1\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKTEXT_3264                 = 0xc0\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKEDATA_3264                 = 0xc3\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKETEXT_3264                 = 0xc2\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SET_THREAD_AREA               = 0x1a\n\tPTRACE_SET_WATCH_REGS                = 0xd1\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tRLIMIT_AS                            = 0x6\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x9\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x5\n\tRLIMIT_NPROC                         = 0x8\n\tRLIMIT_RSS                           = 0x7\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x40047307\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x40047309\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x467f\n\tSIOCOUTQ                             = 0x7472\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x80047308\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x1\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x80\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x2\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0xffff\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1009\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x20\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x1029\n\tSO_DONTROUTE                         = 0x10\n\tSO_ERROR                             = 0x1007\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x8\n\tSO_LINGER                            = 0x80\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0x100\n\tSO_PASSCRED                          = 0x11\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x12\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1e\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x1028\n\tSO_RCVBUF                            = 0x1002\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x1004\n\tSO_RCVTIMEO                          = 0x1006\n\tSO_REUSEADDR                         = 0x4\n\tSO_REUSEPORT                         = 0x200\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x1001\n\tSO_SNDBUFFORCE                       = 0x1f\n\tSO_SNDLOWAT                          = 0x1003\n\tSO_SNDTIMEO                          = 0x1005\n\tSO_STYLE                             = 0x1008\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x1008\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x5407\n\tTCGETA                               = 0x5401\n\tTCGETS                               = 0x540d\n\tTCGETS2                              = 0x4030542a\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x5410\n\tTCSBRK                               = 0x5405\n\tTCSBRKP                              = 0x5486\n\tTCSETA                               = 0x5402\n\tTCSETAF                              = 0x5404\n\tTCSETAW                              = 0x5403\n\tTCSETS                               = 0x540e\n\tTCSETS2                              = 0x8030542b\n\tTCSETSF                              = 0x5410\n\tTCSETSF2                             = 0x8030542d\n\tTCSETSW                              = 0x540f\n\tTCSETSW2                             = 0x8030542c\n\tTCXONC                               = 0x5406\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x80047478\n\tTIOCEXCL                             = 0x740d\n\tTIOCGDEV                             = 0x40045432\n\tTIOCGETD                             = 0x7400\n\tTIOCGETP                             = 0x7408\n\tTIOCGEXCL                            = 0x40045440\n\tTIOCGICOUNT                          = 0x5492\n\tTIOCGLCKTRMIOS                       = 0x548b\n\tTIOCGLTC                             = 0x7474\n\tTIOCGPGRP                            = 0x40047477\n\tTIOCGPKT                             = 0x40045438\n\tTIOCGPTLCK                           = 0x40045439\n\tTIOCGPTN                             = 0x40045430\n\tTIOCGPTPEER                          = 0x20005441\n\tTIOCGRS485                           = 0x4020542e\n\tTIOCGSERIAL                          = 0x5484\n\tTIOCGSID                             = 0x7416\n\tTIOCGSOFTCAR                         = 0x5481\n\tTIOCGWINSZ                           = 0x40087468\n\tTIOCINQ                              = 0x467f\n\tTIOCLINUX                            = 0x5483\n\tTIOCMBIC                             = 0x741c\n\tTIOCMBIS                             = 0x741b\n\tTIOCMGET                             = 0x741d\n\tTIOCMIWAIT                           = 0x5491\n\tTIOCMSET                             = 0x741a\n\tTIOCM_CAR                            = 0x100\n\tTIOCM_CD                             = 0x100\n\tTIOCM_CTS                            = 0x40\n\tTIOCM_DSR                            = 0x400\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x200\n\tTIOCM_RNG                            = 0x200\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x20\n\tTIOCM_ST                             = 0x10\n\tTIOCNOTTY                            = 0x5471\n\tTIOCNXCL                             = 0x740e\n\tTIOCOUTQ                             = 0x7472\n\tTIOCPKT                              = 0x5470\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x5480\n\tTIOCSERCONFIG                        = 0x5488\n\tTIOCSERGETLSR                        = 0x548e\n\tTIOCSERGETMULTI                      = 0x548f\n\tTIOCSERGSTRUCT                       = 0x548d\n\tTIOCSERGWILD                         = 0x5489\n\tTIOCSERSETMULTI                      = 0x5490\n\tTIOCSERSWILD                         = 0x548a\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x7401\n\tTIOCSETN                             = 0x740a\n\tTIOCSETP                             = 0x7409\n\tTIOCSIG                              = 0x80045436\n\tTIOCSLCKTRMIOS                       = 0x548c\n\tTIOCSLTC                             = 0x7475\n\tTIOCSPGRP                            = 0x80047476\n\tTIOCSPTLCK                           = 0x80045431\n\tTIOCSRS485                           = 0xc020542f\n\tTIOCSSERIAL                          = 0x5485\n\tTIOCSSOFTCAR                         = 0x5482\n\tTIOCSTI                              = 0x5472\n\tTIOCSWINSZ                           = 0x80087467\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x8000\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x801054d5\n\tTUNDETACHFILTER                      = 0x801054d6\n\tTUNGETFEATURES                       = 0x400454cf\n\tTUNGETFILTER                         = 0x401054db\n\tTUNGETIFF                            = 0x400454d2\n\tTUNGETSNDBUF                         = 0x400454d3\n\tTUNGETVNETBE                         = 0x400454df\n\tTUNGETVNETHDRSZ                      = 0x400454d7\n\tTUNGETVNETLE                         = 0x400454dd\n\tTUNSETDEBUG                          = 0x800454c9\n\tTUNSETGROUP                          = 0x800454ce\n\tTUNSETIFF                            = 0x800454ca\n\tTUNSETIFINDEX                        = 0x800454da\n\tTUNSETLINK                           = 0x800454cd\n\tTUNSETNOCSUM                         = 0x800454c8\n\tTUNSETOFFLOAD                        = 0x800454d0\n\tTUNSETOWNER                          = 0x800454cc\n\tTUNSETPERSIST                        = 0x800454cb\n\tTUNSETQUEUE                          = 0x800454d9\n\tTUNSETSNDBUF                         = 0x800454d4\n\tTUNSETTXFILTER                       = 0x800454d1\n\tTUNSETVNETBE                         = 0x800454de\n\tTUNSETVNETHDRSZ                      = 0x800454d8\n\tTUNSETVNETLE                         = 0x800454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x10\n\tVEOL                                 = 0x11\n\tVEOL2                                = 0x6\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x4\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVSWTCH                               = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x40045702\n\tWDIOC_GETPRETIMEOUT                  = 0x40045709\n\tWDIOC_GETSTATUS                      = 0x40045701\n\tWDIOC_GETSUPPORT                     = 0x40285700\n\tWDIOC_GETTEMP                        = 0x40045703\n\tWDIOC_GETTIMELEFT                    = 0x4004570a\n\tWDIOC_GETTIMEOUT                     = 0x40045707\n\tWDIOC_KEEPALIVE                      = 0x40045705\n\tWDIOC_SETOPTIONS                     = 0x40045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x40\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x7d)\n\tEADDRNOTAVAIL   = syscall.Errno(0x7e)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x7c)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x95)\n\tEBADE           = syscall.Errno(0x32)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x51)\n\tEBADMSG         = syscall.Errno(0x4d)\n\tEBADR           = syscall.Errno(0x33)\n\tEBADRQC         = syscall.Errno(0x36)\n\tEBADSLT         = syscall.Errno(0x37)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x9e)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x25)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x82)\n\tECONNREFUSED    = syscall.Errno(0x92)\n\tECONNRESET      = syscall.Errno(0x83)\n\tEDEADLK         = syscall.Errno(0x2d)\n\tEDEADLOCK       = syscall.Errno(0x38)\n\tEDESTADDRREQ    = syscall.Errno(0x60)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x46d)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x93)\n\tEHOSTUNREACH    = syscall.Errno(0x94)\n\tEHWPOISON       = syscall.Errno(0xa8)\n\tEIDRM           = syscall.Errno(0x24)\n\tEILSEQ          = syscall.Errno(0x58)\n\tEINIT           = syscall.Errno(0x8d)\n\tEINPROGRESS     = syscall.Errno(0x96)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x85)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x8b)\n\tEKEYEXPIRED     = syscall.Errno(0xa2)\n\tEKEYREJECTED    = syscall.Errno(0xa4)\n\tEKEYREVOKED     = syscall.Errno(0xa3)\n\tEL2HLT          = syscall.Errno(0x2c)\n\tEL2NSYNC        = syscall.Errno(0x26)\n\tEL3HLT          = syscall.Errno(0x27)\n\tEL3RST          = syscall.Errno(0x28)\n\tELIBACC         = syscall.Errno(0x53)\n\tELIBBAD         = syscall.Errno(0x54)\n\tELIBEXEC        = syscall.Errno(0x57)\n\tELIBMAX         = syscall.Errno(0x56)\n\tELIBSCN         = syscall.Errno(0x55)\n\tELNRNG          = syscall.Errno(0x29)\n\tELOOP           = syscall.Errno(0x5a)\n\tEMEDIUMTYPE     = syscall.Errno(0xa0)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x61)\n\tEMULTIHOP       = syscall.Errno(0x4a)\n\tENAMETOOLONG    = syscall.Errno(0x4e)\n\tENAVAIL         = syscall.Errno(0x8a)\n\tENETDOWN        = syscall.Errno(0x7f)\n\tENETRESET       = syscall.Errno(0x81)\n\tENETUNREACH     = syscall.Errno(0x80)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x35)\n\tENOBUFS         = syscall.Errno(0x84)\n\tENOCSI          = syscall.Errno(0x2b)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0xa1)\n\tENOLCK          = syscall.Errno(0x2e)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x9f)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x23)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x63)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x59)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x86)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x5d)\n\tENOTNAM         = syscall.Errno(0x89)\n\tENOTRECOVERABLE = syscall.Errno(0xa6)\n\tENOTSOCK        = syscall.Errno(0x5f)\n\tENOTSUP         = syscall.Errno(0x7a)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x50)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x7a)\n\tEOVERFLOW       = syscall.Errno(0x4f)\n\tEOWNERDEAD      = syscall.Errno(0xa5)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x7b)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x78)\n\tEPROTOTYPE      = syscall.Errno(0x62)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x52)\n\tEREMDEV         = syscall.Errno(0x8e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x8c)\n\tERESTART        = syscall.Errno(0x5b)\n\tERFKILL         = syscall.Errno(0xa7)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x8f)\n\tESOCKTNOSUPPORT = syscall.Errno(0x79)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x97)\n\tESTRPIPE        = syscall.Errno(0x5c)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x91)\n\tETOOMANYREFS    = syscall.Errno(0x90)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x87)\n\tEUNATCH         = syscall.Errno(0x2a)\n\tEUSERS          = syscall.Errno(0x5e)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x34)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x12)\n\tSIGCLD    = syscall.Signal(0x12)\n\tSIGCONT   = syscall.Signal(0x19)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x16)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x16)\n\tSIGPROF   = syscall.Signal(0x1d)\n\tSIGPWR    = syscall.Signal(0x13)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x17)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x18)\n\tSIGTTIN   = syscall.Signal(0x1a)\n\tSIGTTOU   = syscall.Signal(0x1b)\n\tSIGURG    = syscall.Signal(0x15)\n\tSIGUSR1   = syscall.Signal(0x10)\n\tSIGUSR2   = syscall.Signal(0x11)\n\tSIGVTALRM = syscall.Signal(0x1c)\n\tSIGWINCH  = syscall.Signal(0x14)\n\tSIGXCPU   = syscall.Signal(0x1e)\n\tSIGXFSZ   = syscall.Signal(0x1f)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:    \"operation not permitted\",\n\t2:    \"no such file or directory\",\n\t3:    \"no such process\",\n\t4:    \"interrupted system call\",\n\t5:    \"input/output error\",\n\t6:    \"no such device or address\",\n\t7:    \"argument list too long\",\n\t8:    \"exec format error\",\n\t9:    \"bad file descriptor\",\n\t10:   \"no child processes\",\n\t11:   \"resource temporarily unavailable\",\n\t12:   \"cannot allocate memory\",\n\t13:   \"permission denied\",\n\t14:   \"bad address\",\n\t15:   \"block device required\",\n\t16:   \"device or resource busy\",\n\t17:   \"file exists\",\n\t18:   \"invalid cross-device link\",\n\t19:   \"no such device\",\n\t20:   \"not a directory\",\n\t21:   \"is a directory\",\n\t22:   \"invalid argument\",\n\t23:   \"too many open files in system\",\n\t24:   \"too many open files\",\n\t25:   \"inappropriate ioctl for device\",\n\t26:   \"text file busy\",\n\t27:   \"file too large\",\n\t28:   \"no space left on device\",\n\t29:   \"illegal seek\",\n\t30:   \"read-only file system\",\n\t31:   \"too many links\",\n\t32:   \"broken pipe\",\n\t33:   \"numerical argument out of domain\",\n\t34:   \"numerical result out of range\",\n\t35:   \"no message of desired type\",\n\t36:   \"identifier removed\",\n\t37:   \"channel number out of range\",\n\t38:   \"level 2 not synchronized\",\n\t39:   \"level 3 halted\",\n\t40:   \"level 3 reset\",\n\t41:   \"link number out of range\",\n\t42:   \"protocol driver not attached\",\n\t43:   \"no CSI structure available\",\n\t44:   \"level 2 halted\",\n\t45:   \"resource deadlock avoided\",\n\t46:   \"no locks available\",\n\t50:   \"invalid exchange\",\n\t51:   \"invalid request descriptor\",\n\t52:   \"exchange full\",\n\t53:   \"no anode\",\n\t54:   \"invalid request code\",\n\t55:   \"invalid slot\",\n\t56:   \"file locking deadlock error\",\n\t59:   \"bad font file format\",\n\t60:   \"device not a stream\",\n\t61:   \"no data available\",\n\t62:   \"timer expired\",\n\t63:   \"out of streams resources\",\n\t64:   \"machine is not on the network\",\n\t65:   \"package not installed\",\n\t66:   \"object is remote\",\n\t67:   \"link has been severed\",\n\t68:   \"advertise error\",\n\t69:   \"srmount error\",\n\t70:   \"communication error on send\",\n\t71:   \"protocol error\",\n\t73:   \"RFS specific error\",\n\t74:   \"multihop attempted\",\n\t77:   \"bad message\",\n\t78:   \"file name too long\",\n\t79:   \"value too large for defined data type\",\n\t80:   \"name not unique on network\",\n\t81:   \"file descriptor in bad state\",\n\t82:   \"remote address changed\",\n\t83:   \"can not access a needed shared library\",\n\t84:   \"accessing a corrupted shared library\",\n\t85:   \".lib section in a.out corrupted\",\n\t86:   \"attempting to link in too many shared libraries\",\n\t87:   \"cannot exec a shared library directly\",\n\t88:   \"invalid or incomplete multibyte or wide character\",\n\t89:   \"function not implemented\",\n\t90:   \"too many levels of symbolic links\",\n\t91:   \"interrupted system call should be restarted\",\n\t92:   \"streams pipe error\",\n\t93:   \"directory not empty\",\n\t94:   \"too many users\",\n\t95:   \"socket operation on non-socket\",\n\t96:   \"destination address required\",\n\t97:   \"message too long\",\n\t98:   \"protocol wrong type for socket\",\n\t99:   \"protocol not available\",\n\t120:  \"protocol not supported\",\n\t121:  \"socket type not supported\",\n\t122:  \"operation not supported\",\n\t123:  \"protocol family not supported\",\n\t124:  \"address family not supported by protocol\",\n\t125:  \"address already in use\",\n\t126:  \"cannot assign requested address\",\n\t127:  \"network is down\",\n\t128:  \"network is unreachable\",\n\t129:  \"network dropped connection on reset\",\n\t130:  \"software caused connection abort\",\n\t131:  \"connection reset by peer\",\n\t132:  \"no buffer space available\",\n\t133:  \"transport endpoint is already connected\",\n\t134:  \"transport endpoint is not connected\",\n\t135:  \"structure needs cleaning\",\n\t137:  \"not a XENIX named type file\",\n\t138:  \"no XENIX semaphores available\",\n\t139:  \"is a named type file\",\n\t140:  \"remote I/O error\",\n\t141:  \"unknown error 141\",\n\t142:  \"unknown error 142\",\n\t143:  \"cannot send after transport endpoint shutdown\",\n\t144:  \"too many references: cannot splice\",\n\t145:  \"connection timed out\",\n\t146:  \"connection refused\",\n\t147:  \"host is down\",\n\t148:  \"no route to host\",\n\t149:  \"operation already in progress\",\n\t150:  \"operation now in progress\",\n\t151:  \"stale file handle\",\n\t158:  \"operation canceled\",\n\t159:  \"no medium found\",\n\t160:  \"wrong medium type\",\n\t161:  \"required key not available\",\n\t162:  \"key has expired\",\n\t163:  \"key has been revoked\",\n\t164:  \"key was rejected by service\",\n\t165:  \"owner died\",\n\t166:  \"state not recoverable\",\n\t167:  \"operation not possible due to RF-kill\",\n\t168:  \"memory page has hardware error\",\n\t1133: \"disk quota exceeded\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"user defined signal 1\",\n\t17: \"user defined signal 2\",\n\t18: \"child exited\",\n\t19: \"power failure\",\n\t20: \"window changed\",\n\t21: \"urgent I/O condition\",\n\t22: \"I/O possible\",\n\t23: \"stopped (signal)\",\n\t24: \"stopped\",\n\t25: \"continued\",\n\t26: \"stopped (tty input)\",\n\t27: \"stopped (tty output)\",\n\t28: \"virtual timer expired\",\n\t29: \"profiling timer expired\",\n\t30: \"CPU time limit exceeded\",\n\t31: \"file size limit exceeded\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips64le,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x40081270\n\tBLKBSZSET                            = 0x80081271\n\tBLKFLSBUF                            = 0x20001261\n\tBLKFRAGET                            = 0x20001265\n\tBLKFRASET                            = 0x20001264\n\tBLKGETSIZE                           = 0x20001260\n\tBLKGETSIZE64                         = 0x40081272\n\tBLKPBSZGET                           = 0x2000127b\n\tBLKRAGET                             = 0x20001263\n\tBLKRASET                             = 0x20001262\n\tBLKROGET                             = 0x2000125e\n\tBLKROSET                             = 0x2000125d\n\tBLKRRPART                            = 0x2000125f\n\tBLKSECTGET                           = 0x20001267\n\tBLKSECTSET                           = 0x20001266\n\tBLKSSZGET                            = 0x20001268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x80\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x2000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x800c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x80106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x400c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0xe\n\tF_GETLK64                            = 0xe\n\tF_GETOWN                             = 0x17\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x6\n\tF_SETLK64                            = 0x6\n\tF_SETLKW                             = 0x7\n\tF_SETLKW64                           = 0x7\n\tF_SETOWN                             = 0x18\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x100\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x80\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x200007b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x800\n\tMAP_ANONYMOUS                        = 0x800\n\tMAP_DENYWRITE                        = 0x2000\n\tMAP_EXECUTABLE                       = 0x4000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x1000\n\tMAP_HUGETLB                          = 0x80000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x8000\n\tMAP_NONBLOCK                         = 0x20000\n\tMAP_NORESERVE                        = 0x400\n\tMAP_POPULATE                         = 0x10000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_RENAME                           = 0x800\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x40000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x8\n\tO_ASYNC                              = 0x1000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x100\n\tO_DIRECT                             = 0x8000\n\tO_DIRECTORY                          = 0x10000\n\tO_DSYNC                              = 0x10\n\tO_EXCL                               = 0x400\n\tO_FSYNC                              = 0x4010\n\tO_LARGEFILE                          = 0x0\n\tO_NDELAY                             = 0x80\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x800\n\tO_NOFOLLOW                           = 0x20000\n\tO_NONBLOCK                           = 0x80\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x4010\n\tO_SYNC                               = 0x4010\n\tO_TMPFILE                            = 0x410000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x20002401\n\tPERF_EVENT_IOC_ENABLE                = 0x20002400\n\tPERF_EVENT_IOC_ID                    = 0x40082407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x80042409\n\tPERF_EVENT_IOC_PERIOD                = 0x80082404\n\tPERF_EVENT_IOC_REFRESH               = 0x20002402\n\tPERF_EVENT_IOC_RESET                 = 0x20002403\n\tPERF_EVENT_IOC_SET_BPF               = 0x80042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x80082406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x20002405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffffffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GET_THREAD_AREA               = 0x19\n\tPTRACE_GET_THREAD_AREA_3264          = 0xc4\n\tPTRACE_GET_WATCH_REGS                = 0xd0\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKDATA_3264                 = 0xc1\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKTEXT_3264                 = 0xc0\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKEDATA_3264                 = 0xc3\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKETEXT_3264                 = 0xc2\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SET_THREAD_AREA               = 0x1a\n\tPTRACE_SET_WATCH_REGS                = 0xd1\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tRLIMIT_AS                            = 0x6\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x9\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x5\n\tRLIMIT_NPROC                         = 0x8\n\tRLIMIT_RSS                           = 0x7\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x40047307\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x40047309\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x467f\n\tSIOCOUTQ                             = 0x7472\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x80047308\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x1\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x80\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x2\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0xffff\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1009\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x20\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x1029\n\tSO_DONTROUTE                         = 0x10\n\tSO_ERROR                             = 0x1007\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x8\n\tSO_LINGER                            = 0x80\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0x100\n\tSO_PASSCRED                          = 0x11\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x12\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1e\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x1028\n\tSO_RCVBUF                            = 0x1002\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x1004\n\tSO_RCVTIMEO                          = 0x1006\n\tSO_REUSEADDR                         = 0x4\n\tSO_REUSEPORT                         = 0x200\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x1001\n\tSO_SNDBUFFORCE                       = 0x1f\n\tSO_SNDLOWAT                          = 0x1003\n\tSO_SNDTIMEO                          = 0x1005\n\tSO_STYLE                             = 0x1008\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x1008\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x5407\n\tTCGETA                               = 0x5401\n\tTCGETS                               = 0x540d\n\tTCGETS2                              = 0x4030542a\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x5410\n\tTCSBRK                               = 0x5405\n\tTCSBRKP                              = 0x5486\n\tTCSETA                               = 0x5402\n\tTCSETAF                              = 0x5404\n\tTCSETAW                              = 0x5403\n\tTCSETS                               = 0x540e\n\tTCSETS2                              = 0x8030542b\n\tTCSETSF                              = 0x5410\n\tTCSETSF2                             = 0x8030542d\n\tTCSETSW                              = 0x540f\n\tTCSETSW2                             = 0x8030542c\n\tTCXONC                               = 0x5406\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x80047478\n\tTIOCEXCL                             = 0x740d\n\tTIOCGDEV                             = 0x40045432\n\tTIOCGETD                             = 0x7400\n\tTIOCGETP                             = 0x7408\n\tTIOCGEXCL                            = 0x40045440\n\tTIOCGICOUNT                          = 0x5492\n\tTIOCGLCKTRMIOS                       = 0x548b\n\tTIOCGLTC                             = 0x7474\n\tTIOCGPGRP                            = 0x40047477\n\tTIOCGPKT                             = 0x40045438\n\tTIOCGPTLCK                           = 0x40045439\n\tTIOCGPTN                             = 0x40045430\n\tTIOCGPTPEER                          = 0x20005441\n\tTIOCGRS485                           = 0x4020542e\n\tTIOCGSERIAL                          = 0x5484\n\tTIOCGSID                             = 0x7416\n\tTIOCGSOFTCAR                         = 0x5481\n\tTIOCGWINSZ                           = 0x40087468\n\tTIOCINQ                              = 0x467f\n\tTIOCLINUX                            = 0x5483\n\tTIOCMBIC                             = 0x741c\n\tTIOCMBIS                             = 0x741b\n\tTIOCMGET                             = 0x741d\n\tTIOCMIWAIT                           = 0x5491\n\tTIOCMSET                             = 0x741a\n\tTIOCM_CAR                            = 0x100\n\tTIOCM_CD                             = 0x100\n\tTIOCM_CTS                            = 0x40\n\tTIOCM_DSR                            = 0x400\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x200\n\tTIOCM_RNG                            = 0x200\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x20\n\tTIOCM_ST                             = 0x10\n\tTIOCNOTTY                            = 0x5471\n\tTIOCNXCL                             = 0x740e\n\tTIOCOUTQ                             = 0x7472\n\tTIOCPKT                              = 0x5470\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x5480\n\tTIOCSERCONFIG                        = 0x5488\n\tTIOCSERGETLSR                        = 0x548e\n\tTIOCSERGETMULTI                      = 0x548f\n\tTIOCSERGSTRUCT                       = 0x548d\n\tTIOCSERGWILD                         = 0x5489\n\tTIOCSERSETMULTI                      = 0x5490\n\tTIOCSERSWILD                         = 0x548a\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x7401\n\tTIOCSETN                             = 0x740a\n\tTIOCSETP                             = 0x7409\n\tTIOCSIG                              = 0x80045436\n\tTIOCSLCKTRMIOS                       = 0x548c\n\tTIOCSLTC                             = 0x7475\n\tTIOCSPGRP                            = 0x80047476\n\tTIOCSPTLCK                           = 0x80045431\n\tTIOCSRS485                           = 0xc020542f\n\tTIOCSSERIAL                          = 0x5485\n\tTIOCSSOFTCAR                         = 0x5482\n\tTIOCSTI                              = 0x5472\n\tTIOCSWINSZ                           = 0x80087467\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x8000\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x801054d5\n\tTUNDETACHFILTER                      = 0x801054d6\n\tTUNGETFEATURES                       = 0x400454cf\n\tTUNGETFILTER                         = 0x401054db\n\tTUNGETIFF                            = 0x400454d2\n\tTUNGETSNDBUF                         = 0x400454d3\n\tTUNGETVNETBE                         = 0x400454df\n\tTUNGETVNETHDRSZ                      = 0x400454d7\n\tTUNGETVNETLE                         = 0x400454dd\n\tTUNSETDEBUG                          = 0x800454c9\n\tTUNSETGROUP                          = 0x800454ce\n\tTUNSETIFF                            = 0x800454ca\n\tTUNSETIFINDEX                        = 0x800454da\n\tTUNSETLINK                           = 0x800454cd\n\tTUNSETNOCSUM                         = 0x800454c8\n\tTUNSETOFFLOAD                        = 0x800454d0\n\tTUNSETOWNER                          = 0x800454cc\n\tTUNSETPERSIST                        = 0x800454cb\n\tTUNSETQUEUE                          = 0x800454d9\n\tTUNSETSNDBUF                         = 0x800454d4\n\tTUNSETTXFILTER                       = 0x800454d1\n\tTUNSETVNETBE                         = 0x800454de\n\tTUNSETVNETHDRSZ                      = 0x800454d8\n\tTUNSETVNETLE                         = 0x800454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x10\n\tVEOL                                 = 0x11\n\tVEOL2                                = 0x6\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x4\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVSWTCH                               = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x40045702\n\tWDIOC_GETPRETIMEOUT                  = 0x40045709\n\tWDIOC_GETSTATUS                      = 0x40045701\n\tWDIOC_GETSUPPORT                     = 0x40285700\n\tWDIOC_GETTEMP                        = 0x40045703\n\tWDIOC_GETTIMELEFT                    = 0x4004570a\n\tWDIOC_GETTIMEOUT                     = 0x40045707\n\tWDIOC_KEEPALIVE                      = 0x40045705\n\tWDIOC_SETOPTIONS                     = 0x40045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x40\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x7d)\n\tEADDRNOTAVAIL   = syscall.Errno(0x7e)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x7c)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x95)\n\tEBADE           = syscall.Errno(0x32)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x51)\n\tEBADMSG         = syscall.Errno(0x4d)\n\tEBADR           = syscall.Errno(0x33)\n\tEBADRQC         = syscall.Errno(0x36)\n\tEBADSLT         = syscall.Errno(0x37)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x9e)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x25)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x82)\n\tECONNREFUSED    = syscall.Errno(0x92)\n\tECONNRESET      = syscall.Errno(0x83)\n\tEDEADLK         = syscall.Errno(0x2d)\n\tEDEADLOCK       = syscall.Errno(0x38)\n\tEDESTADDRREQ    = syscall.Errno(0x60)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x46d)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x93)\n\tEHOSTUNREACH    = syscall.Errno(0x94)\n\tEHWPOISON       = syscall.Errno(0xa8)\n\tEIDRM           = syscall.Errno(0x24)\n\tEILSEQ          = syscall.Errno(0x58)\n\tEINIT           = syscall.Errno(0x8d)\n\tEINPROGRESS     = syscall.Errno(0x96)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x85)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x8b)\n\tEKEYEXPIRED     = syscall.Errno(0xa2)\n\tEKEYREJECTED    = syscall.Errno(0xa4)\n\tEKEYREVOKED     = syscall.Errno(0xa3)\n\tEL2HLT          = syscall.Errno(0x2c)\n\tEL2NSYNC        = syscall.Errno(0x26)\n\tEL3HLT          = syscall.Errno(0x27)\n\tEL3RST          = syscall.Errno(0x28)\n\tELIBACC         = syscall.Errno(0x53)\n\tELIBBAD         = syscall.Errno(0x54)\n\tELIBEXEC        = syscall.Errno(0x57)\n\tELIBMAX         = syscall.Errno(0x56)\n\tELIBSCN         = syscall.Errno(0x55)\n\tELNRNG          = syscall.Errno(0x29)\n\tELOOP           = syscall.Errno(0x5a)\n\tEMEDIUMTYPE     = syscall.Errno(0xa0)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x61)\n\tEMULTIHOP       = syscall.Errno(0x4a)\n\tENAMETOOLONG    = syscall.Errno(0x4e)\n\tENAVAIL         = syscall.Errno(0x8a)\n\tENETDOWN        = syscall.Errno(0x7f)\n\tENETRESET       = syscall.Errno(0x81)\n\tENETUNREACH     = syscall.Errno(0x80)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x35)\n\tENOBUFS         = syscall.Errno(0x84)\n\tENOCSI          = syscall.Errno(0x2b)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0xa1)\n\tENOLCK          = syscall.Errno(0x2e)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x9f)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x23)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x63)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x59)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x86)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x5d)\n\tENOTNAM         = syscall.Errno(0x89)\n\tENOTRECOVERABLE = syscall.Errno(0xa6)\n\tENOTSOCK        = syscall.Errno(0x5f)\n\tENOTSUP         = syscall.Errno(0x7a)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x50)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x7a)\n\tEOVERFLOW       = syscall.Errno(0x4f)\n\tEOWNERDEAD      = syscall.Errno(0xa5)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x7b)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x78)\n\tEPROTOTYPE      = syscall.Errno(0x62)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x52)\n\tEREMDEV         = syscall.Errno(0x8e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x8c)\n\tERESTART        = syscall.Errno(0x5b)\n\tERFKILL         = syscall.Errno(0xa7)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x8f)\n\tESOCKTNOSUPPORT = syscall.Errno(0x79)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x97)\n\tESTRPIPE        = syscall.Errno(0x5c)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x91)\n\tETOOMANYREFS    = syscall.Errno(0x90)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x87)\n\tEUNATCH         = syscall.Errno(0x2a)\n\tEUSERS          = syscall.Errno(0x5e)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x34)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x12)\n\tSIGCLD    = syscall.Signal(0x12)\n\tSIGCONT   = syscall.Signal(0x19)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x16)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x16)\n\tSIGPROF   = syscall.Signal(0x1d)\n\tSIGPWR    = syscall.Signal(0x13)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x17)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x18)\n\tSIGTTIN   = syscall.Signal(0x1a)\n\tSIGTTOU   = syscall.Signal(0x1b)\n\tSIGURG    = syscall.Signal(0x15)\n\tSIGUSR1   = syscall.Signal(0x10)\n\tSIGUSR2   = syscall.Signal(0x11)\n\tSIGVTALRM = syscall.Signal(0x1c)\n\tSIGWINCH  = syscall.Signal(0x14)\n\tSIGXCPU   = syscall.Signal(0x1e)\n\tSIGXFSZ   = syscall.Signal(0x1f)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:    \"operation not permitted\",\n\t2:    \"no such file or directory\",\n\t3:    \"no such process\",\n\t4:    \"interrupted system call\",\n\t5:    \"input/output error\",\n\t6:    \"no such device or address\",\n\t7:    \"argument list too long\",\n\t8:    \"exec format error\",\n\t9:    \"bad file descriptor\",\n\t10:   \"no child processes\",\n\t11:   \"resource temporarily unavailable\",\n\t12:   \"cannot allocate memory\",\n\t13:   \"permission denied\",\n\t14:   \"bad address\",\n\t15:   \"block device required\",\n\t16:   \"device or resource busy\",\n\t17:   \"file exists\",\n\t18:   \"invalid cross-device link\",\n\t19:   \"no such device\",\n\t20:   \"not a directory\",\n\t21:   \"is a directory\",\n\t22:   \"invalid argument\",\n\t23:   \"too many open files in system\",\n\t24:   \"too many open files\",\n\t25:   \"inappropriate ioctl for device\",\n\t26:   \"text file busy\",\n\t27:   \"file too large\",\n\t28:   \"no space left on device\",\n\t29:   \"illegal seek\",\n\t30:   \"read-only file system\",\n\t31:   \"too many links\",\n\t32:   \"broken pipe\",\n\t33:   \"numerical argument out of domain\",\n\t34:   \"numerical result out of range\",\n\t35:   \"no message of desired type\",\n\t36:   \"identifier removed\",\n\t37:   \"channel number out of range\",\n\t38:   \"level 2 not synchronized\",\n\t39:   \"level 3 halted\",\n\t40:   \"level 3 reset\",\n\t41:   \"link number out of range\",\n\t42:   \"protocol driver not attached\",\n\t43:   \"no CSI structure available\",\n\t44:   \"level 2 halted\",\n\t45:   \"resource deadlock avoided\",\n\t46:   \"no locks available\",\n\t50:   \"invalid exchange\",\n\t51:   \"invalid request descriptor\",\n\t52:   \"exchange full\",\n\t53:   \"no anode\",\n\t54:   \"invalid request code\",\n\t55:   \"invalid slot\",\n\t56:   \"file locking deadlock error\",\n\t59:   \"bad font file format\",\n\t60:   \"device not a stream\",\n\t61:   \"no data available\",\n\t62:   \"timer expired\",\n\t63:   \"out of streams resources\",\n\t64:   \"machine is not on the network\",\n\t65:   \"package not installed\",\n\t66:   \"object is remote\",\n\t67:   \"link has been severed\",\n\t68:   \"advertise error\",\n\t69:   \"srmount error\",\n\t70:   \"communication error on send\",\n\t71:   \"protocol error\",\n\t73:   \"RFS specific error\",\n\t74:   \"multihop attempted\",\n\t77:   \"bad message\",\n\t78:   \"file name too long\",\n\t79:   \"value too large for defined data type\",\n\t80:   \"name not unique on network\",\n\t81:   \"file descriptor in bad state\",\n\t82:   \"remote address changed\",\n\t83:   \"can not access a needed shared library\",\n\t84:   \"accessing a corrupted shared library\",\n\t85:   \".lib section in a.out corrupted\",\n\t86:   \"attempting to link in too many shared libraries\",\n\t87:   \"cannot exec a shared library directly\",\n\t88:   \"invalid or incomplete multibyte or wide character\",\n\t89:   \"function not implemented\",\n\t90:   \"too many levels of symbolic links\",\n\t91:   \"interrupted system call should be restarted\",\n\t92:   \"streams pipe error\",\n\t93:   \"directory not empty\",\n\t94:   \"too many users\",\n\t95:   \"socket operation on non-socket\",\n\t96:   \"destination address required\",\n\t97:   \"message too long\",\n\t98:   \"protocol wrong type for socket\",\n\t99:   \"protocol not available\",\n\t120:  \"protocol not supported\",\n\t121:  \"socket type not supported\",\n\t122:  \"operation not supported\",\n\t123:  \"protocol family not supported\",\n\t124:  \"address family not supported by protocol\",\n\t125:  \"address already in use\",\n\t126:  \"cannot assign requested address\",\n\t127:  \"network is down\",\n\t128:  \"network is unreachable\",\n\t129:  \"network dropped connection on reset\",\n\t130:  \"software caused connection abort\",\n\t131:  \"connection reset by peer\",\n\t132:  \"no buffer space available\",\n\t133:  \"transport endpoint is already connected\",\n\t134:  \"transport endpoint is not connected\",\n\t135:  \"structure needs cleaning\",\n\t137:  \"not a XENIX named type file\",\n\t138:  \"no XENIX semaphores available\",\n\t139:  \"is a named type file\",\n\t140:  \"remote I/O error\",\n\t141:  \"unknown error 141\",\n\t142:  \"unknown error 142\",\n\t143:  \"cannot send after transport endpoint shutdown\",\n\t144:  \"too many references: cannot splice\",\n\t145:  \"connection timed out\",\n\t146:  \"connection refused\",\n\t147:  \"host is down\",\n\t148:  \"no route to host\",\n\t149:  \"operation already in progress\",\n\t150:  \"operation now in progress\",\n\t151:  \"stale file handle\",\n\t158:  \"operation canceled\",\n\t159:  \"no medium found\",\n\t160:  \"wrong medium type\",\n\t161:  \"required key not available\",\n\t162:  \"key has expired\",\n\t163:  \"key has been revoked\",\n\t164:  \"key was rejected by service\",\n\t165:  \"owner died\",\n\t166:  \"state not recoverable\",\n\t167:  \"operation not possible due to RF-kill\",\n\t168:  \"memory page has hardware error\",\n\t1133: \"disk quota exceeded\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"user defined signal 1\",\n\t17: \"user defined signal 2\",\n\t18: \"child exited\",\n\t19: \"power failure\",\n\t20: \"window changed\",\n\t21: \"urgent I/O condition\",\n\t22: \"I/O possible\",\n\t23: \"stopped (signal)\",\n\t24: \"stopped\",\n\t25: \"continued\",\n\t26: \"stopped (tty input)\",\n\t27: \"stopped (tty output)\",\n\t28: \"virtual timer expired\",\n\t29: \"profiling timer expired\",\n\t30: \"CPU time limit exceeded\",\n\t31: \"file size limit exceeded\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mipsle,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x40041270\n\tBLKBSZSET                            = 0x80041271\n\tBLKFLSBUF                            = 0x20001261\n\tBLKFRAGET                            = 0x20001265\n\tBLKFRASET                            = 0x20001264\n\tBLKGETSIZE                           = 0x20001260\n\tBLKGETSIZE64                         = 0x40041272\n\tBLKPBSZGET                           = 0x2000127b\n\tBLKRAGET                             = 0x20001263\n\tBLKRASET                             = 0x20001262\n\tBLKROGET                             = 0x2000125e\n\tBLKROSET                             = 0x2000125d\n\tBLKRRPART                            = 0x2000125f\n\tBLKSECTGET                           = 0x20001267\n\tBLKSECTSET                           = 0x20001266\n\tBLKSSZGET                            = 0x20001268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x80\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x2000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x800c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x80106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x400c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0x21\n\tF_GETLK64                            = 0x21\n\tF_GETOWN                             = 0x17\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x22\n\tF_SETLK64                            = 0x22\n\tF_SETLKW                             = 0x23\n\tF_SETLKW64                           = 0x23\n\tF_SETOWN                             = 0x18\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x100\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x80\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x200007b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x800\n\tMAP_ANONYMOUS                        = 0x800\n\tMAP_DENYWRITE                        = 0x2000\n\tMAP_EXECUTABLE                       = 0x4000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x1000\n\tMAP_HUGETLB                          = 0x80000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x8000\n\tMAP_NONBLOCK                         = 0x20000\n\tMAP_NORESERVE                        = 0x400\n\tMAP_POPULATE                         = 0x10000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_RENAME                           = 0x800\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x40000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x8\n\tO_ASYNC                              = 0x1000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x100\n\tO_DIRECT                             = 0x8000\n\tO_DIRECTORY                          = 0x10000\n\tO_DSYNC                              = 0x10\n\tO_EXCL                               = 0x400\n\tO_FSYNC                              = 0x4010\n\tO_LARGEFILE                          = 0x2000\n\tO_NDELAY                             = 0x80\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x800\n\tO_NOFOLLOW                           = 0x20000\n\tO_NONBLOCK                           = 0x80\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x4010\n\tO_SYNC                               = 0x4010\n\tO_TMPFILE                            = 0x410000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x20002401\n\tPERF_EVENT_IOC_ENABLE                = 0x20002400\n\tPERF_EVENT_IOC_ID                    = 0x40042407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x80042409\n\tPERF_EVENT_IOC_PERIOD                = 0x80082404\n\tPERF_EVENT_IOC_REFRESH               = 0x20002402\n\tPERF_EVENT_IOC_RESET                 = 0x20002403\n\tPERF_EVENT_IOC_SET_BPF               = 0x80042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x80042406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x20002405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GET_THREAD_AREA               = 0x19\n\tPTRACE_GET_THREAD_AREA_3264          = 0xc4\n\tPTRACE_GET_WATCH_REGS                = 0xd0\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKDATA_3264                 = 0xc1\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKTEXT_3264                 = 0xc0\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKEDATA_3264                 = 0xc3\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKETEXT_3264                 = 0xc2\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SET_THREAD_AREA               = 0x1a\n\tPTRACE_SET_WATCH_REGS                = 0xd1\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tRLIMIT_AS                            = 0x6\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x9\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x5\n\tRLIMIT_NPROC                         = 0x8\n\tRLIMIT_RSS                           = 0x7\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x40047307\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x40047309\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x467f\n\tSIOCOUTQ                             = 0x7472\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x80047308\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x1\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x80\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x2\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0xffff\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1009\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x20\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x1029\n\tSO_DONTROUTE                         = 0x10\n\tSO_ERROR                             = 0x1007\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x8\n\tSO_LINGER                            = 0x80\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0x100\n\tSO_PASSCRED                          = 0x11\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x12\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1e\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x1028\n\tSO_RCVBUF                            = 0x1002\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x1004\n\tSO_RCVTIMEO                          = 0x1006\n\tSO_REUSEADDR                         = 0x4\n\tSO_REUSEPORT                         = 0x200\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x1001\n\tSO_SNDBUFFORCE                       = 0x1f\n\tSO_SNDLOWAT                          = 0x1003\n\tSO_SNDTIMEO                          = 0x1005\n\tSO_STYLE                             = 0x1008\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x1008\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x5407\n\tTCGETA                               = 0x5401\n\tTCGETS                               = 0x540d\n\tTCGETS2                              = 0x4030542a\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x5410\n\tTCSBRK                               = 0x5405\n\tTCSBRKP                              = 0x5486\n\tTCSETA                               = 0x5402\n\tTCSETAF                              = 0x5404\n\tTCSETAW                              = 0x5403\n\tTCSETS                               = 0x540e\n\tTCSETS2                              = 0x8030542b\n\tTCSETSF                              = 0x5410\n\tTCSETSF2                             = 0x8030542d\n\tTCSETSW                              = 0x540f\n\tTCSETSW2                             = 0x8030542c\n\tTCXONC                               = 0x5406\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x80047478\n\tTIOCEXCL                             = 0x740d\n\tTIOCGDEV                             = 0x40045432\n\tTIOCGETD                             = 0x7400\n\tTIOCGETP                             = 0x7408\n\tTIOCGEXCL                            = 0x40045440\n\tTIOCGICOUNT                          = 0x5492\n\tTIOCGLCKTRMIOS                       = 0x548b\n\tTIOCGLTC                             = 0x7474\n\tTIOCGPGRP                            = 0x40047477\n\tTIOCGPKT                             = 0x40045438\n\tTIOCGPTLCK                           = 0x40045439\n\tTIOCGPTN                             = 0x40045430\n\tTIOCGPTPEER                          = 0x20005441\n\tTIOCGRS485                           = 0x4020542e\n\tTIOCGSERIAL                          = 0x5484\n\tTIOCGSID                             = 0x7416\n\tTIOCGSOFTCAR                         = 0x5481\n\tTIOCGWINSZ                           = 0x40087468\n\tTIOCINQ                              = 0x467f\n\tTIOCLINUX                            = 0x5483\n\tTIOCMBIC                             = 0x741c\n\tTIOCMBIS                             = 0x741b\n\tTIOCMGET                             = 0x741d\n\tTIOCMIWAIT                           = 0x5491\n\tTIOCMSET                             = 0x741a\n\tTIOCM_CAR                            = 0x100\n\tTIOCM_CD                             = 0x100\n\tTIOCM_CTS                            = 0x40\n\tTIOCM_DSR                            = 0x400\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x200\n\tTIOCM_RNG                            = 0x200\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x20\n\tTIOCM_ST                             = 0x10\n\tTIOCNOTTY                            = 0x5471\n\tTIOCNXCL                             = 0x740e\n\tTIOCOUTQ                             = 0x7472\n\tTIOCPKT                              = 0x5470\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x5480\n\tTIOCSERCONFIG                        = 0x5488\n\tTIOCSERGETLSR                        = 0x548e\n\tTIOCSERGETMULTI                      = 0x548f\n\tTIOCSERGSTRUCT                       = 0x548d\n\tTIOCSERGWILD                         = 0x5489\n\tTIOCSERSETMULTI                      = 0x5490\n\tTIOCSERSWILD                         = 0x548a\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x7401\n\tTIOCSETN                             = 0x740a\n\tTIOCSETP                             = 0x7409\n\tTIOCSIG                              = 0x80045436\n\tTIOCSLCKTRMIOS                       = 0x548c\n\tTIOCSLTC                             = 0x7475\n\tTIOCSPGRP                            = 0x80047476\n\tTIOCSPTLCK                           = 0x80045431\n\tTIOCSRS485                           = 0xc020542f\n\tTIOCSSERIAL                          = 0x5485\n\tTIOCSSOFTCAR                         = 0x5482\n\tTIOCSTI                              = 0x5472\n\tTIOCSWINSZ                           = 0x80087467\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x8000\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x800854d5\n\tTUNDETACHFILTER                      = 0x800854d6\n\tTUNGETFEATURES                       = 0x400454cf\n\tTUNGETFILTER                         = 0x400854db\n\tTUNGETIFF                            = 0x400454d2\n\tTUNGETSNDBUF                         = 0x400454d3\n\tTUNGETVNETBE                         = 0x400454df\n\tTUNGETVNETHDRSZ                      = 0x400454d7\n\tTUNGETVNETLE                         = 0x400454dd\n\tTUNSETDEBUG                          = 0x800454c9\n\tTUNSETGROUP                          = 0x800454ce\n\tTUNSETIFF                            = 0x800454ca\n\tTUNSETIFINDEX                        = 0x800454da\n\tTUNSETLINK                           = 0x800454cd\n\tTUNSETNOCSUM                         = 0x800454c8\n\tTUNSETOFFLOAD                        = 0x800454d0\n\tTUNSETOWNER                          = 0x800454cc\n\tTUNSETPERSIST                        = 0x800454cb\n\tTUNSETQUEUE                          = 0x800454d9\n\tTUNSETSNDBUF                         = 0x800454d4\n\tTUNSETTXFILTER                       = 0x800454d1\n\tTUNSETVNETBE                         = 0x800454de\n\tTUNSETVNETHDRSZ                      = 0x800454d8\n\tTUNSETVNETLE                         = 0x800454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x10\n\tVEOL                                 = 0x11\n\tVEOL2                                = 0x6\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x4\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVSWTCH                               = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x40045702\n\tWDIOC_GETPRETIMEOUT                  = 0x40045709\n\tWDIOC_GETSTATUS                      = 0x40045701\n\tWDIOC_GETSUPPORT                     = 0x40285700\n\tWDIOC_GETTEMP                        = 0x40045703\n\tWDIOC_GETTIMELEFT                    = 0x4004570a\n\tWDIOC_GETTIMEOUT                     = 0x40045707\n\tWDIOC_KEEPALIVE                      = 0x40045705\n\tWDIOC_SETOPTIONS                     = 0x40045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x20\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x7d)\n\tEADDRNOTAVAIL   = syscall.Errno(0x7e)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x7c)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x95)\n\tEBADE           = syscall.Errno(0x32)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x51)\n\tEBADMSG         = syscall.Errno(0x4d)\n\tEBADR           = syscall.Errno(0x33)\n\tEBADRQC         = syscall.Errno(0x36)\n\tEBADSLT         = syscall.Errno(0x37)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x9e)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x25)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x82)\n\tECONNREFUSED    = syscall.Errno(0x92)\n\tECONNRESET      = syscall.Errno(0x83)\n\tEDEADLK         = syscall.Errno(0x2d)\n\tEDEADLOCK       = syscall.Errno(0x38)\n\tEDESTADDRREQ    = syscall.Errno(0x60)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x46d)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x93)\n\tEHOSTUNREACH    = syscall.Errno(0x94)\n\tEHWPOISON       = syscall.Errno(0xa8)\n\tEIDRM           = syscall.Errno(0x24)\n\tEILSEQ          = syscall.Errno(0x58)\n\tEINIT           = syscall.Errno(0x8d)\n\tEINPROGRESS     = syscall.Errno(0x96)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x85)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x8b)\n\tEKEYEXPIRED     = syscall.Errno(0xa2)\n\tEKEYREJECTED    = syscall.Errno(0xa4)\n\tEKEYREVOKED     = syscall.Errno(0xa3)\n\tEL2HLT          = syscall.Errno(0x2c)\n\tEL2NSYNC        = syscall.Errno(0x26)\n\tEL3HLT          = syscall.Errno(0x27)\n\tEL3RST          = syscall.Errno(0x28)\n\tELIBACC         = syscall.Errno(0x53)\n\tELIBBAD         = syscall.Errno(0x54)\n\tELIBEXEC        = syscall.Errno(0x57)\n\tELIBMAX         = syscall.Errno(0x56)\n\tELIBSCN         = syscall.Errno(0x55)\n\tELNRNG          = syscall.Errno(0x29)\n\tELOOP           = syscall.Errno(0x5a)\n\tEMEDIUMTYPE     = syscall.Errno(0xa0)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x61)\n\tEMULTIHOP       = syscall.Errno(0x4a)\n\tENAMETOOLONG    = syscall.Errno(0x4e)\n\tENAVAIL         = syscall.Errno(0x8a)\n\tENETDOWN        = syscall.Errno(0x7f)\n\tENETRESET       = syscall.Errno(0x81)\n\tENETUNREACH     = syscall.Errno(0x80)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x35)\n\tENOBUFS         = syscall.Errno(0x84)\n\tENOCSI          = syscall.Errno(0x2b)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0xa1)\n\tENOLCK          = syscall.Errno(0x2e)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x9f)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x23)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x63)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x59)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x86)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x5d)\n\tENOTNAM         = syscall.Errno(0x89)\n\tENOTRECOVERABLE = syscall.Errno(0xa6)\n\tENOTSOCK        = syscall.Errno(0x5f)\n\tENOTSUP         = syscall.Errno(0x7a)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x50)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x7a)\n\tEOVERFLOW       = syscall.Errno(0x4f)\n\tEOWNERDEAD      = syscall.Errno(0xa5)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x7b)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x78)\n\tEPROTOTYPE      = syscall.Errno(0x62)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x52)\n\tEREMDEV         = syscall.Errno(0x8e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x8c)\n\tERESTART        = syscall.Errno(0x5b)\n\tERFKILL         = syscall.Errno(0xa7)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x8f)\n\tESOCKTNOSUPPORT = syscall.Errno(0x79)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x97)\n\tESTRPIPE        = syscall.Errno(0x5c)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x91)\n\tETOOMANYREFS    = syscall.Errno(0x90)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x87)\n\tEUNATCH         = syscall.Errno(0x2a)\n\tEUSERS          = syscall.Errno(0x5e)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x34)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x12)\n\tSIGCLD    = syscall.Signal(0x12)\n\tSIGCONT   = syscall.Signal(0x19)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x16)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x16)\n\tSIGPROF   = syscall.Signal(0x1d)\n\tSIGPWR    = syscall.Signal(0x13)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x17)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x18)\n\tSIGTTIN   = syscall.Signal(0x1a)\n\tSIGTTOU   = syscall.Signal(0x1b)\n\tSIGURG    = syscall.Signal(0x15)\n\tSIGUSR1   = syscall.Signal(0x10)\n\tSIGUSR2   = syscall.Signal(0x11)\n\tSIGVTALRM = syscall.Signal(0x1c)\n\tSIGWINCH  = syscall.Signal(0x14)\n\tSIGXCPU   = syscall.Signal(0x1e)\n\tSIGXFSZ   = syscall.Signal(0x1f)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:    \"operation not permitted\",\n\t2:    \"no such file or directory\",\n\t3:    \"no such process\",\n\t4:    \"interrupted system call\",\n\t5:    \"input/output error\",\n\t6:    \"no such device or address\",\n\t7:    \"argument list too long\",\n\t8:    \"exec format error\",\n\t9:    \"bad file descriptor\",\n\t10:   \"no child processes\",\n\t11:   \"resource temporarily unavailable\",\n\t12:   \"cannot allocate memory\",\n\t13:   \"permission denied\",\n\t14:   \"bad address\",\n\t15:   \"block device required\",\n\t16:   \"device or resource busy\",\n\t17:   \"file exists\",\n\t18:   \"invalid cross-device link\",\n\t19:   \"no such device\",\n\t20:   \"not a directory\",\n\t21:   \"is a directory\",\n\t22:   \"invalid argument\",\n\t23:   \"too many open files in system\",\n\t24:   \"too many open files\",\n\t25:   \"inappropriate ioctl for device\",\n\t26:   \"text file busy\",\n\t27:   \"file too large\",\n\t28:   \"no space left on device\",\n\t29:   \"illegal seek\",\n\t30:   \"read-only file system\",\n\t31:   \"too many links\",\n\t32:   \"broken pipe\",\n\t33:   \"numerical argument out of domain\",\n\t34:   \"numerical result out of range\",\n\t35:   \"no message of desired type\",\n\t36:   \"identifier removed\",\n\t37:   \"channel number out of range\",\n\t38:   \"level 2 not synchronized\",\n\t39:   \"level 3 halted\",\n\t40:   \"level 3 reset\",\n\t41:   \"link number out of range\",\n\t42:   \"protocol driver not attached\",\n\t43:   \"no CSI structure available\",\n\t44:   \"level 2 halted\",\n\t45:   \"resource deadlock avoided\",\n\t46:   \"no locks available\",\n\t50:   \"invalid exchange\",\n\t51:   \"invalid request descriptor\",\n\t52:   \"exchange full\",\n\t53:   \"no anode\",\n\t54:   \"invalid request code\",\n\t55:   \"invalid slot\",\n\t56:   \"file locking deadlock error\",\n\t59:   \"bad font file format\",\n\t60:   \"device not a stream\",\n\t61:   \"no data available\",\n\t62:   \"timer expired\",\n\t63:   \"out of streams resources\",\n\t64:   \"machine is not on the network\",\n\t65:   \"package not installed\",\n\t66:   \"object is remote\",\n\t67:   \"link has been severed\",\n\t68:   \"advertise error\",\n\t69:   \"srmount error\",\n\t70:   \"communication error on send\",\n\t71:   \"protocol error\",\n\t73:   \"RFS specific error\",\n\t74:   \"multihop attempted\",\n\t77:   \"bad message\",\n\t78:   \"file name too long\",\n\t79:   \"value too large for defined data type\",\n\t80:   \"name not unique on network\",\n\t81:   \"file descriptor in bad state\",\n\t82:   \"remote address changed\",\n\t83:   \"can not access a needed shared library\",\n\t84:   \"accessing a corrupted shared library\",\n\t85:   \".lib section in a.out corrupted\",\n\t86:   \"attempting to link in too many shared libraries\",\n\t87:   \"cannot exec a shared library directly\",\n\t88:   \"invalid or incomplete multibyte or wide character\",\n\t89:   \"function not implemented\",\n\t90:   \"too many levels of symbolic links\",\n\t91:   \"interrupted system call should be restarted\",\n\t92:   \"streams pipe error\",\n\t93:   \"directory not empty\",\n\t94:   \"too many users\",\n\t95:   \"socket operation on non-socket\",\n\t96:   \"destination address required\",\n\t97:   \"message too long\",\n\t98:   \"protocol wrong type for socket\",\n\t99:   \"protocol not available\",\n\t120:  \"protocol not supported\",\n\t121:  \"socket type not supported\",\n\t122:  \"operation not supported\",\n\t123:  \"protocol family not supported\",\n\t124:  \"address family not supported by protocol\",\n\t125:  \"address already in use\",\n\t126:  \"cannot assign requested address\",\n\t127:  \"network is down\",\n\t128:  \"network is unreachable\",\n\t129:  \"network dropped connection on reset\",\n\t130:  \"software caused connection abort\",\n\t131:  \"connection reset by peer\",\n\t132:  \"no buffer space available\",\n\t133:  \"transport endpoint is already connected\",\n\t134:  \"transport endpoint is not connected\",\n\t135:  \"structure needs cleaning\",\n\t137:  \"not a XENIX named type file\",\n\t138:  \"no XENIX semaphores available\",\n\t139:  \"is a named type file\",\n\t140:  \"remote I/O error\",\n\t141:  \"unknown error 141\",\n\t142:  \"unknown error 142\",\n\t143:  \"cannot send after transport endpoint shutdown\",\n\t144:  \"too many references: cannot splice\",\n\t145:  \"connection timed out\",\n\t146:  \"connection refused\",\n\t147:  \"host is down\",\n\t148:  \"no route to host\",\n\t149:  \"operation already in progress\",\n\t150:  \"operation now in progress\",\n\t151:  \"stale file handle\",\n\t158:  \"operation canceled\",\n\t159:  \"no medium found\",\n\t160:  \"wrong medium type\",\n\t161:  \"required key not available\",\n\t162:  \"key has expired\",\n\t163:  \"key has been revoked\",\n\t164:  \"key was rejected by service\",\n\t165:  \"owner died\",\n\t166:  \"state not recoverable\",\n\t167:  \"operation not possible due to RF-kill\",\n\t168:  \"memory page has hardware error\",\n\t1133: \"disk quota exceeded\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"user defined signal 1\",\n\t17: \"user defined signal 2\",\n\t18: \"child exited\",\n\t19: \"power failure\",\n\t20: \"window changed\",\n\t21: \"urgent I/O condition\",\n\t22: \"I/O possible\",\n\t23: \"stopped (signal)\",\n\t24: \"stopped\",\n\t25: \"continued\",\n\t26: \"stopped (tty input)\",\n\t27: \"stopped (tty output)\",\n\t28: \"virtual timer expired\",\n\t29: \"profiling timer expired\",\n\t30: \"CPU time limit exceeded\",\n\t31: \"file size limit exceeded\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build ppc64,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x17\n\tB110                                 = 0x3\n\tB115200                              = 0x11\n\tB1152000                             = 0x18\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x19\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x1a\n\tB230400                              = 0x12\n\tB2400                                = 0xb\n\tB2500000                             = 0x1b\n\tB300                                 = 0x7\n\tB3000000                             = 0x1c\n\tB3500000                             = 0x1d\n\tB38400                               = 0xf\n\tB4000000                             = 0x1e\n\tB460800                              = 0x13\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x14\n\tB57600                               = 0x10\n\tB576000                              = 0x15\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x16\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x40081270\n\tBLKBSZSET                            = 0x80081271\n\tBLKFLSBUF                            = 0x20001261\n\tBLKFRAGET                            = 0x20001265\n\tBLKFRASET                            = 0x20001264\n\tBLKGETSIZE                           = 0x20001260\n\tBLKGETSIZE64                         = 0x40081272\n\tBLKPBSZGET                           = 0x2000127b\n\tBLKRAGET                             = 0x20001263\n\tBLKRASET                             = 0x20001262\n\tBLKROGET                             = 0x2000125e\n\tBLKROSET                             = 0x2000125d\n\tBLKRRPART                            = 0x2000125f\n\tBLKSECTGET                           = 0x20001267\n\tBLKSECTSET                           = 0x20001266\n\tBLKSSZGET                            = 0x20001268\n\tBOTHER                               = 0x1f\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x8000\n\tBSDLY                                = 0x8000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0xff\n\tCBAUDEX                              = 0x0\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0xff0000\n\tCLOCAL                               = 0x8000\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x1000\n\tCR2                                  = 0x2000\n\tCR3                                  = 0x3000\n\tCRDLY                                = 0x3000\n\tCREAD                                = 0x800\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x100\n\tCS7                                  = 0x200\n\tCS8                                  = 0x300\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x300\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x400\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x40\n\tECHOE                                = 0x2\n\tECHOK                                = 0x4\n\tECHOKE                               = 0x1\n\tECHONL                               = 0x10\n\tECHOPRT                              = 0x20\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x800\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x4000\n\tFFDLY                                = 0x4000\n\tFLUSHO                               = 0x800000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x800c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x80106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x400c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0x5\n\tF_GETLK64                            = 0xc\n\tF_GETOWN                             = 0x9\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x6\n\tF_SETLK64                            = 0xd\n\tF_SETLKW                             = 0x7\n\tF_SETLKW64                           = 0xe\n\tF_SETOWN                             = 0x8\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x4000\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x100\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x400\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x800\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x200007b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x80\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x1000\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x400\n\tIXON                                 = 0x200\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x20\n\tMAP_ANONYMOUS                        = 0x20\n\tMAP_DENYWRITE                        = 0x800\n\tMAP_EXECUTABLE                       = 0x1000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x100\n\tMAP_HUGETLB                          = 0x40000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x80\n\tMAP_NONBLOCK                         = 0x10000\n\tMAP_NORESERVE                        = 0x40\n\tMAP_POPULATE                         = 0x8000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x20000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x2000\n\tMCL_FUTURE                           = 0x4000\n\tMCL_ONFAULT                          = 0x8000\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNL2                                  = 0x200\n\tNL3                                  = 0x300\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x300\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80000000\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x4\n\tONLCR                                = 0x2\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x400\n\tO_ASYNC                              = 0x2000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x40\n\tO_DIRECT                             = 0x20000\n\tO_DIRECTORY                          = 0x4000\n\tO_DSYNC                              = 0x1000\n\tO_EXCL                               = 0x80\n\tO_FSYNC                              = 0x101000\n\tO_LARGEFILE                          = 0x0\n\tO_NDELAY                             = 0x800\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x100\n\tO_NOFOLLOW                           = 0x8000\n\tO_NONBLOCK                           = 0x800\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x101000\n\tO_SYNC                               = 0x101000\n\tO_TMPFILE                            = 0x404000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x1000\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x2000\n\tPENDIN                               = 0x20000000\n\tPERF_EVENT_IOC_DISABLE               = 0x20002401\n\tPERF_EVENT_IOC_ENABLE                = 0x20002400\n\tPERF_EVENT_IOC_ID                    = 0x40082407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x80042409\n\tPERF_EVENT_IOC_PERIOD                = 0x80082404\n\tPERF_EVENT_IOC_REFRESH               = 0x20002402\n\tPERF_EVENT_IOC_RESET                 = 0x20002403\n\tPERF_EVENT_IOC_SET_BPF               = 0x80042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x80082406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x20002405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_SAO                             = 0x10\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffffffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETEVRREGS                    = 0x14\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGS64                     = 0x16\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GETVRREGS                     = 0x12\n\tPTRACE_GETVSRREGS                    = 0x1b\n\tPTRACE_GET_DEBUGREG                  = 0x19\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETEVRREGS                    = 0x15\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGS64                     = 0x17\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SETVRREGS                     = 0x13\n\tPTRACE_SETVSRREGS                    = 0x1c\n\tPTRACE_SET_DEBUGREG                  = 0x1a\n\tPTRACE_SINGLEBLOCK                   = 0x100\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tPT_CCR                               = 0x26\n\tPT_CTR                               = 0x23\n\tPT_DAR                               = 0x29\n\tPT_DSCR                              = 0x2c\n\tPT_DSISR                             = 0x2a\n\tPT_FPR0                              = 0x30\n\tPT_FPSCR                             = 0x50\n\tPT_LNK                               = 0x24\n\tPT_MSR                               = 0x21\n\tPT_NIP                               = 0x20\n\tPT_ORIG_R3                           = 0x22\n\tPT_R0                                = 0x0\n\tPT_R1                                = 0x1\n\tPT_R10                               = 0xa\n\tPT_R11                               = 0xb\n\tPT_R12                               = 0xc\n\tPT_R13                               = 0xd\n\tPT_R14                               = 0xe\n\tPT_R15                               = 0xf\n\tPT_R16                               = 0x10\n\tPT_R17                               = 0x11\n\tPT_R18                               = 0x12\n\tPT_R19                               = 0x13\n\tPT_R2                                = 0x2\n\tPT_R20                               = 0x14\n\tPT_R21                               = 0x15\n\tPT_R22                               = 0x16\n\tPT_R23                               = 0x17\n\tPT_R24                               = 0x18\n\tPT_R25                               = 0x19\n\tPT_R26                               = 0x1a\n\tPT_R27                               = 0x1b\n\tPT_R28                               = 0x1c\n\tPT_R29                               = 0x1d\n\tPT_R3                                = 0x3\n\tPT_R30                               = 0x1e\n\tPT_R31                               = 0x1f\n\tPT_R4                                = 0x4\n\tPT_R5                                = 0x5\n\tPT_R6                                = 0x6\n\tPT_R7                                = 0x7\n\tPT_R8                                = 0x8\n\tPT_R9                                = 0x9\n\tPT_REGS_COUNT                        = 0x2c\n\tPT_RESULT                            = 0x2b\n\tPT_SOFTE                             = 0x27\n\tPT_TRAP                              = 0x28\n\tPT_VR0                               = 0x52\n\tPT_VRSAVE                            = 0x94\n\tPT_VSCR                              = 0x93\n\tPT_VSR0                              = 0x96\n\tPT_VSR31                             = 0xd4\n\tPT_XER                               = 0x25\n\tRLIMIT_AS                            = 0x9\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x8\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x7\n\tRLIMIT_NPROC                         = 0x6\n\tRLIMIT_RSS                           = 0x5\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x8905\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x8904\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x4004667f\n\tSIOCOUTQ                             = 0x40047473\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x8902\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x2\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x800\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x1\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0x1\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1e\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x6\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x27\n\tSO_DONTROUTE                         = 0x5\n\tSO_ERROR                             = 0x4\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x9\n\tSO_LINGER                            = 0xd\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0xa\n\tSO_PASSCRED                          = 0x14\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x15\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1f\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x26\n\tSO_RCVBUF                            = 0x8\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x10\n\tSO_RCVTIMEO                          = 0x12\n\tSO_REUSEADDR                         = 0x2\n\tSO_REUSEPORT                         = 0xf\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x7\n\tSO_SNDBUFFORCE                       = 0x20\n\tSO_SNDLOWAT                          = 0x11\n\tSO_SNDTIMEO                          = 0x13\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x3\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x400\n\tTAB2                                 = 0x800\n\tTAB3                                 = 0xc00\n\tTABDLY                               = 0xc00\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x2000741f\n\tTCGETA                               = 0x40147417\n\tTCGETS                               = 0x402c7413\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x2\n\tTCSBRK                               = 0x2000741d\n\tTCSBRKP                              = 0x5425\n\tTCSETA                               = 0x80147418\n\tTCSETAF                              = 0x8014741c\n\tTCSETAW                              = 0x80147419\n\tTCSETS                               = 0x802c7414\n\tTCSETSF                              = 0x802c7416\n\tTCSETSW                              = 0x802c7415\n\tTCXONC                               = 0x2000741e\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x541d\n\tTIOCEXCL                             = 0x540c\n\tTIOCGDEV                             = 0x40045432\n\tTIOCGETC                             = 0x40067412\n\tTIOCGETD                             = 0x5424\n\tTIOCGETP                             = 0x40067408\n\tTIOCGEXCL                            = 0x40045440\n\tTIOCGICOUNT                          = 0x545d\n\tTIOCGLCKTRMIOS                       = 0x5456\n\tTIOCGLTC                             = 0x40067474\n\tTIOCGPGRP                            = 0x40047477\n\tTIOCGPKT                             = 0x40045438\n\tTIOCGPTLCK                           = 0x40045439\n\tTIOCGPTN                             = 0x40045430\n\tTIOCGPTPEER                          = 0x20005441\n\tTIOCGRS485                           = 0x542e\n\tTIOCGSERIAL                          = 0x541e\n\tTIOCGSID                             = 0x5429\n\tTIOCGSOFTCAR                         = 0x5419\n\tTIOCGWINSZ                           = 0x40087468\n\tTIOCINQ                              = 0x4004667f\n\tTIOCLINUX                            = 0x541c\n\tTIOCMBIC                             = 0x5417\n\tTIOCMBIS                             = 0x5416\n\tTIOCMGET                             = 0x5415\n\tTIOCMIWAIT                           = 0x545c\n\tTIOCMSET                             = 0x5418\n\tTIOCM_CAR                            = 0x40\n\tTIOCM_CD                             = 0x40\n\tTIOCM_CTS                            = 0x20\n\tTIOCM_DSR                            = 0x100\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_LOOP                           = 0x8000\n\tTIOCM_OUT1                           = 0x2000\n\tTIOCM_OUT2                           = 0x4000\n\tTIOCM_RI                             = 0x80\n\tTIOCM_RNG                            = 0x80\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x10\n\tTIOCM_ST                             = 0x8\n\tTIOCNOTTY                            = 0x5422\n\tTIOCNXCL                             = 0x540d\n\tTIOCOUTQ                             = 0x40047473\n\tTIOCPKT                              = 0x5420\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x540e\n\tTIOCSERCONFIG                        = 0x5453\n\tTIOCSERGETLSR                        = 0x5459\n\tTIOCSERGETMULTI                      = 0x545a\n\tTIOCSERGSTRUCT                       = 0x5458\n\tTIOCSERGWILD                         = 0x5454\n\tTIOCSERSETMULTI                      = 0x545b\n\tTIOCSERSWILD                         = 0x5455\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETC                             = 0x80067411\n\tTIOCSETD                             = 0x5423\n\tTIOCSETN                             = 0x8006740a\n\tTIOCSETP                             = 0x80067409\n\tTIOCSIG                              = 0x80045436\n\tTIOCSLCKTRMIOS                       = 0x5457\n\tTIOCSLTC                             = 0x80067475\n\tTIOCSPGRP                            = 0x80047476\n\tTIOCSPTLCK                           = 0x80045431\n\tTIOCSRS485                           = 0x542f\n\tTIOCSSERIAL                          = 0x541f\n\tTIOCSSOFTCAR                         = 0x541a\n\tTIOCSTART                            = 0x2000746e\n\tTIOCSTI                              = 0x5412\n\tTIOCSTOP                             = 0x2000746f\n\tTIOCSWINSZ                           = 0x80087467\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x400000\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x801054d5\n\tTUNDETACHFILTER                      = 0x801054d6\n\tTUNGETFEATURES                       = 0x400454cf\n\tTUNGETFILTER                         = 0x401054db\n\tTUNGETIFF                            = 0x400454d2\n\tTUNGETSNDBUF                         = 0x400454d3\n\tTUNGETVNETBE                         = 0x400454df\n\tTUNGETVNETHDRSZ                      = 0x400454d7\n\tTUNGETVNETLE                         = 0x400454dd\n\tTUNSETDEBUG                          = 0x800454c9\n\tTUNSETGROUP                          = 0x800454ce\n\tTUNSETIFF                            = 0x800454ca\n\tTUNSETIFINDEX                        = 0x800454da\n\tTUNSETLINK                           = 0x800454cd\n\tTUNSETNOCSUM                         = 0x800454c8\n\tTUNSETOFFLOAD                        = 0x800454d0\n\tTUNSETOWNER                          = 0x800454cc\n\tTUNSETPERSIST                        = 0x800454cb\n\tTUNSETQUEUE                          = 0x800454d9\n\tTUNSETSNDBUF                         = 0x800454d4\n\tTUNSETTXFILTER                       = 0x800454d1\n\tTUNSETVNETBE                         = 0x800454de\n\tTUNSETVNETHDRSZ                      = 0x800454d8\n\tTUNSETVNETLE                         = 0x800454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0x10\n\tVEOF                                 = 0x4\n\tVEOL                                 = 0x6\n\tVEOL2                                = 0x8\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x5\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xb\n\tVSTART                               = 0xd\n\tVSTOP                                = 0xe\n\tVSUSP                                = 0xc\n\tVSWTC                                = 0x9\n\tVT0                                  = 0x0\n\tVT1                                  = 0x10000\n\tVTDLY                                = 0x10000\n\tVTIME                                = 0x7\n\tVWERASE                              = 0xa\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x40045702\n\tWDIOC_GETPRETIMEOUT                  = 0x40045709\n\tWDIOC_GETSTATUS                      = 0x40045701\n\tWDIOC_GETSUPPORT                     = 0x40285700\n\tWDIOC_GETTEMP                        = 0x40045703\n\tWDIOC_GETTIMELEFT                    = 0x4004570a\n\tWDIOC_GETTIMEOUT                     = 0x40045707\n\tWDIOC_KEEPALIVE                      = 0x40045705\n\tWDIOC_SETOPTIONS                     = 0x40045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x40\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4000\n\tXTABS                                = 0xc00\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x62)\n\tEADDRNOTAVAIL   = syscall.Errno(0x63)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x61)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x72)\n\tEBADE           = syscall.Errno(0x34)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x4d)\n\tEBADMSG         = syscall.Errno(0x4a)\n\tEBADR           = syscall.Errno(0x35)\n\tEBADRQC         = syscall.Errno(0x38)\n\tEBADSLT         = syscall.Errno(0x39)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7d)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x2c)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x67)\n\tECONNREFUSED    = syscall.Errno(0x6f)\n\tECONNRESET      = syscall.Errno(0x68)\n\tEDEADLK         = syscall.Errno(0x23)\n\tEDEADLOCK       = syscall.Errno(0x3a)\n\tEDESTADDRREQ    = syscall.Errno(0x59)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x7a)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x70)\n\tEHOSTUNREACH    = syscall.Errno(0x71)\n\tEHWPOISON       = syscall.Errno(0x85)\n\tEIDRM           = syscall.Errno(0x2b)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x73)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x6a)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x7f)\n\tEKEYREJECTED    = syscall.Errno(0x81)\n\tEKEYREVOKED     = syscall.Errno(0x80)\n\tEL2HLT          = syscall.Errno(0x33)\n\tEL2NSYNC        = syscall.Errno(0x2d)\n\tEL3HLT          = syscall.Errno(0x2e)\n\tEL3RST          = syscall.Errno(0x2f)\n\tELIBACC         = syscall.Errno(0x4f)\n\tELIBBAD         = syscall.Errno(0x50)\n\tELIBEXEC        = syscall.Errno(0x53)\n\tELIBMAX         = syscall.Errno(0x52)\n\tELIBSCN         = syscall.Errno(0x51)\n\tELNRNG          = syscall.Errno(0x30)\n\tELOOP           = syscall.Errno(0x28)\n\tEMEDIUMTYPE     = syscall.Errno(0x7c)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x5a)\n\tEMULTIHOP       = syscall.Errno(0x48)\n\tENAMETOOLONG    = syscall.Errno(0x24)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x64)\n\tENETRESET       = syscall.Errno(0x66)\n\tENETUNREACH     = syscall.Errno(0x65)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x37)\n\tENOBUFS         = syscall.Errno(0x69)\n\tENOCSI          = syscall.Errno(0x32)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x7e)\n\tENOLCK          = syscall.Errno(0x25)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x7b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x2a)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x5c)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x26)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x6b)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x27)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x83)\n\tENOTSOCK        = syscall.Errno(0x58)\n\tENOTSUP         = syscall.Errno(0x5f)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x4c)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x5f)\n\tEOVERFLOW       = syscall.Errno(0x4b)\n\tEOWNERDEAD      = syscall.Errno(0x82)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x60)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x5d)\n\tEPROTOTYPE      = syscall.Errno(0x5b)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x4e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x55)\n\tERFKILL         = syscall.Errno(0x84)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x6c)\n\tESOCKTNOSUPPORT = syscall.Errno(0x5e)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x74)\n\tESTRPIPE        = syscall.Errno(0x56)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x6e)\n\tETOOMANYREFS    = syscall.Errno(0x6d)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x31)\n\tEUSERS          = syscall.Errno(0x57)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x36)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0x7)\n\tSIGCHLD   = syscall.Signal(0x11)\n\tSIGCLD    = syscall.Signal(0x11)\n\tSIGCONT   = syscall.Signal(0x12)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x1d)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x1d)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1e)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTKFLT = syscall.Signal(0x10)\n\tSIGSTOP   = syscall.Signal(0x13)\n\tSIGSYS    = syscall.Signal(0x1f)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x14)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x17)\n\tSIGUSR1   = syscall.Signal(0xa)\n\tSIGUSR2   = syscall.Signal(0xc)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t35:  \"resource deadlock avoided\",\n\t36:  \"file name too long\",\n\t37:  \"no locks available\",\n\t38:  \"function not implemented\",\n\t39:  \"directory not empty\",\n\t40:  \"too many levels of symbolic links\",\n\t42:  \"no message of desired type\",\n\t43:  \"identifier removed\",\n\t44:  \"channel number out of range\",\n\t45:  \"level 2 not synchronized\",\n\t46:  \"level 3 halted\",\n\t47:  \"level 3 reset\",\n\t48:  \"link number out of range\",\n\t49:  \"protocol driver not attached\",\n\t50:  \"no CSI structure available\",\n\t51:  \"level 2 halted\",\n\t52:  \"invalid exchange\",\n\t53:  \"invalid request descriptor\",\n\t54:  \"exchange full\",\n\t55:  \"no anode\",\n\t56:  \"invalid request code\",\n\t57:  \"invalid slot\",\n\t58:  \"file locking deadlock error\",\n\t59:  \"bad font file format\",\n\t60:  \"device not a stream\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of streams resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"multihop attempted\",\n\t73:  \"RFS specific error\",\n\t74:  \"bad message\",\n\t75:  \"value too large for defined data type\",\n\t76:  \"name not unique on network\",\n\t77:  \"file descriptor in bad state\",\n\t78:  \"remote address changed\",\n\t79:  \"can not access a needed shared library\",\n\t80:  \"accessing a corrupted shared library\",\n\t81:  \".lib section in a.out corrupted\",\n\t82:  \"attempting to link in too many shared libraries\",\n\t83:  \"cannot exec a shared library directly\",\n\t84:  \"invalid or incomplete multibyte or wide character\",\n\t85:  \"interrupted system call should be restarted\",\n\t86:  \"streams pipe error\",\n\t87:  \"too many users\",\n\t88:  \"socket operation on non-socket\",\n\t89:  \"destination address required\",\n\t90:  \"message too long\",\n\t91:  \"protocol wrong type for socket\",\n\t92:  \"protocol not available\",\n\t93:  \"protocol not supported\",\n\t94:  \"socket type not supported\",\n\t95:  \"operation not supported\",\n\t96:  \"protocol family not supported\",\n\t97:  \"address family not supported by protocol\",\n\t98:  \"address already in use\",\n\t99:  \"cannot assign requested address\",\n\t100: \"network is down\",\n\t101: \"network is unreachable\",\n\t102: \"network dropped connection on reset\",\n\t103: \"software caused connection abort\",\n\t104: \"connection reset by peer\",\n\t105: \"no buffer space available\",\n\t106: \"transport endpoint is already connected\",\n\t107: \"transport endpoint is not connected\",\n\t108: \"cannot send after transport endpoint shutdown\",\n\t109: \"too many references: cannot splice\",\n\t110: \"connection timed out\",\n\t111: \"connection refused\",\n\t112: \"host is down\",\n\t113: \"no route to host\",\n\t114: \"operation already in progress\",\n\t115: \"operation now in progress\",\n\t116: \"stale file handle\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"disk quota exceeded\",\n\t123: \"no medium found\",\n\t124: \"wrong medium type\",\n\t125: \"operation canceled\",\n\t126: \"required key not available\",\n\t127: \"key has expired\",\n\t128: \"key has been revoked\",\n\t129: \"key was rejected by service\",\n\t130: \"owner died\",\n\t131: \"state not recoverable\",\n\t132: \"operation not possible due to RF-kill\",\n\t133: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"stack fault\",\n\t17: \"child exited\",\n\t18: \"continued\",\n\t19: \"stopped (signal)\",\n\t20: \"stopped\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"urgent I/O condition\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"I/O possible\",\n\t30: \"power failure\",\n\t31: \"bad system call\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build ppc64le,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x17\n\tB110                                 = 0x3\n\tB115200                              = 0x11\n\tB1152000                             = 0x18\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x19\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x1a\n\tB230400                              = 0x12\n\tB2400                                = 0xb\n\tB2500000                             = 0x1b\n\tB300                                 = 0x7\n\tB3000000                             = 0x1c\n\tB3500000                             = 0x1d\n\tB38400                               = 0xf\n\tB4000000                             = 0x1e\n\tB460800                              = 0x13\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x14\n\tB57600                               = 0x10\n\tB576000                              = 0x15\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x16\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x40081270\n\tBLKBSZSET                            = 0x80081271\n\tBLKFLSBUF                            = 0x20001261\n\tBLKFRAGET                            = 0x20001265\n\tBLKFRASET                            = 0x20001264\n\tBLKGETSIZE                           = 0x20001260\n\tBLKGETSIZE64                         = 0x40081272\n\tBLKPBSZGET                           = 0x2000127b\n\tBLKRAGET                             = 0x20001263\n\tBLKRASET                             = 0x20001262\n\tBLKROGET                             = 0x2000125e\n\tBLKROSET                             = 0x2000125d\n\tBLKRRPART                            = 0x2000125f\n\tBLKSECTGET                           = 0x20001267\n\tBLKSECTSET                           = 0x20001266\n\tBLKSSZGET                            = 0x20001268\n\tBOTHER                               = 0x1f\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x8000\n\tBSDLY                                = 0x8000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0xff\n\tCBAUDEX                              = 0x0\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0xff0000\n\tCLOCAL                               = 0x8000\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x1000\n\tCR2                                  = 0x2000\n\tCR3                                  = 0x3000\n\tCRDLY                                = 0x3000\n\tCREAD                                = 0x800\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x100\n\tCS7                                  = 0x200\n\tCS8                                  = 0x300\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x300\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x400\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x40\n\tECHOE                                = 0x2\n\tECHOK                                = 0x4\n\tECHOKE                               = 0x1\n\tECHONL                               = 0x10\n\tECHOPRT                              = 0x20\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x800\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x4000\n\tFFDLY                                = 0x4000\n\tFLUSHO                               = 0x800000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x800c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x80106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x400c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0x5\n\tF_GETLK64                            = 0xc\n\tF_GETOWN                             = 0x9\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x6\n\tF_SETLK64                            = 0xd\n\tF_SETLKW                             = 0x7\n\tF_SETLKW64                           = 0xe\n\tF_SETOWN                             = 0x8\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x4000\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x100\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x400\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x800\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x200007b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x80\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x1000\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x400\n\tIXON                                 = 0x200\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x20\n\tMAP_ANONYMOUS                        = 0x20\n\tMAP_DENYWRITE                        = 0x800\n\tMAP_EXECUTABLE                       = 0x1000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x100\n\tMAP_HUGETLB                          = 0x40000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x80\n\tMAP_NONBLOCK                         = 0x10000\n\tMAP_NORESERVE                        = 0x40\n\tMAP_POPULATE                         = 0x8000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x20000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x2000\n\tMCL_FUTURE                           = 0x4000\n\tMCL_ONFAULT                          = 0x8000\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNL2                                  = 0x200\n\tNL3                                  = 0x300\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x300\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80000000\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x4\n\tONLCR                                = 0x2\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x400\n\tO_ASYNC                              = 0x2000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x40\n\tO_DIRECT                             = 0x20000\n\tO_DIRECTORY                          = 0x4000\n\tO_DSYNC                              = 0x1000\n\tO_EXCL                               = 0x80\n\tO_FSYNC                              = 0x101000\n\tO_LARGEFILE                          = 0x0\n\tO_NDELAY                             = 0x800\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x100\n\tO_NOFOLLOW                           = 0x8000\n\tO_NONBLOCK                           = 0x800\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x101000\n\tO_SYNC                               = 0x101000\n\tO_TMPFILE                            = 0x404000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x1000\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x2000\n\tPENDIN                               = 0x20000000\n\tPERF_EVENT_IOC_DISABLE               = 0x20002401\n\tPERF_EVENT_IOC_ENABLE                = 0x20002400\n\tPERF_EVENT_IOC_ID                    = 0x40082407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x80042409\n\tPERF_EVENT_IOC_PERIOD                = 0x80082404\n\tPERF_EVENT_IOC_REFRESH               = 0x20002402\n\tPERF_EVENT_IOC_RESET                 = 0x20002403\n\tPERF_EVENT_IOC_SET_BPF               = 0x80042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x80082406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x20002405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_SAO                             = 0x10\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffffffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETEVRREGS                    = 0x14\n\tPTRACE_GETFPREGS                     = 0xe\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGS64                     = 0x16\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GETVRREGS                     = 0x12\n\tPTRACE_GETVSRREGS                    = 0x1b\n\tPTRACE_GET_DEBUGREG                  = 0x19\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETEVRREGS                    = 0x15\n\tPTRACE_SETFPREGS                     = 0xf\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGS64                     = 0x17\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SETVRREGS                     = 0x13\n\tPTRACE_SETVSRREGS                    = 0x1c\n\tPTRACE_SET_DEBUGREG                  = 0x1a\n\tPTRACE_SINGLEBLOCK                   = 0x100\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TRACEME                       = 0x0\n\tPT_CCR                               = 0x26\n\tPT_CTR                               = 0x23\n\tPT_DAR                               = 0x29\n\tPT_DSCR                              = 0x2c\n\tPT_DSISR                             = 0x2a\n\tPT_FPR0                              = 0x30\n\tPT_FPSCR                             = 0x50\n\tPT_LNK                               = 0x24\n\tPT_MSR                               = 0x21\n\tPT_NIP                               = 0x20\n\tPT_ORIG_R3                           = 0x22\n\tPT_R0                                = 0x0\n\tPT_R1                                = 0x1\n\tPT_R10                               = 0xa\n\tPT_R11                               = 0xb\n\tPT_R12                               = 0xc\n\tPT_R13                               = 0xd\n\tPT_R14                               = 0xe\n\tPT_R15                               = 0xf\n\tPT_R16                               = 0x10\n\tPT_R17                               = 0x11\n\tPT_R18                               = 0x12\n\tPT_R19                               = 0x13\n\tPT_R2                                = 0x2\n\tPT_R20                               = 0x14\n\tPT_R21                               = 0x15\n\tPT_R22                               = 0x16\n\tPT_R23                               = 0x17\n\tPT_R24                               = 0x18\n\tPT_R25                               = 0x19\n\tPT_R26                               = 0x1a\n\tPT_R27                               = 0x1b\n\tPT_R28                               = 0x1c\n\tPT_R29                               = 0x1d\n\tPT_R3                                = 0x3\n\tPT_R30                               = 0x1e\n\tPT_R31                               = 0x1f\n\tPT_R4                                = 0x4\n\tPT_R5                                = 0x5\n\tPT_R6                                = 0x6\n\tPT_R7                                = 0x7\n\tPT_R8                                = 0x8\n\tPT_R9                                = 0x9\n\tPT_REGS_COUNT                        = 0x2c\n\tPT_RESULT                            = 0x2b\n\tPT_SOFTE                             = 0x27\n\tPT_TRAP                              = 0x28\n\tPT_VR0                               = 0x52\n\tPT_VRSAVE                            = 0x94\n\tPT_VSCR                              = 0x93\n\tPT_VSR0                              = 0x96\n\tPT_VSR31                             = 0xd4\n\tPT_XER                               = 0x25\n\tRLIMIT_AS                            = 0x9\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x8\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x7\n\tRLIMIT_NPROC                         = 0x6\n\tRLIMIT_RSS                           = 0x5\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x8905\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x8904\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x4004667f\n\tSIOCOUTQ                             = 0x40047473\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x8902\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x2\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x800\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x1\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0x1\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1e\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x6\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x27\n\tSO_DONTROUTE                         = 0x5\n\tSO_ERROR                             = 0x4\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x9\n\tSO_LINGER                            = 0xd\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0xa\n\tSO_PASSCRED                          = 0x14\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x15\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1f\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x26\n\tSO_RCVBUF                            = 0x8\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x10\n\tSO_RCVTIMEO                          = 0x12\n\tSO_REUSEADDR                         = 0x2\n\tSO_REUSEPORT                         = 0xf\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x7\n\tSO_SNDBUFFORCE                       = 0x20\n\tSO_SNDLOWAT                          = 0x11\n\tSO_SNDTIMEO                          = 0x13\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x3\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x400\n\tTAB2                                 = 0x800\n\tTAB3                                 = 0xc00\n\tTABDLY                               = 0xc00\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x2000741f\n\tTCGETA                               = 0x40147417\n\tTCGETS                               = 0x402c7413\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x2\n\tTCSBRK                               = 0x2000741d\n\tTCSBRKP                              = 0x5425\n\tTCSETA                               = 0x80147418\n\tTCSETAF                              = 0x8014741c\n\tTCSETAW                              = 0x80147419\n\tTCSETS                               = 0x802c7414\n\tTCSETSF                              = 0x802c7416\n\tTCSETSW                              = 0x802c7415\n\tTCXONC                               = 0x2000741e\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x541d\n\tTIOCEXCL                             = 0x540c\n\tTIOCGDEV                             = 0x40045432\n\tTIOCGETC                             = 0x40067412\n\tTIOCGETD                             = 0x5424\n\tTIOCGETP                             = 0x40067408\n\tTIOCGEXCL                            = 0x40045440\n\tTIOCGICOUNT                          = 0x545d\n\tTIOCGLCKTRMIOS                       = 0x5456\n\tTIOCGLTC                             = 0x40067474\n\tTIOCGPGRP                            = 0x40047477\n\tTIOCGPKT                             = 0x40045438\n\tTIOCGPTLCK                           = 0x40045439\n\tTIOCGPTN                             = 0x40045430\n\tTIOCGPTPEER                          = 0x20005441\n\tTIOCGRS485                           = 0x542e\n\tTIOCGSERIAL                          = 0x541e\n\tTIOCGSID                             = 0x5429\n\tTIOCGSOFTCAR                         = 0x5419\n\tTIOCGWINSZ                           = 0x40087468\n\tTIOCINQ                              = 0x4004667f\n\tTIOCLINUX                            = 0x541c\n\tTIOCMBIC                             = 0x5417\n\tTIOCMBIS                             = 0x5416\n\tTIOCMGET                             = 0x5415\n\tTIOCMIWAIT                           = 0x545c\n\tTIOCMSET                             = 0x5418\n\tTIOCM_CAR                            = 0x40\n\tTIOCM_CD                             = 0x40\n\tTIOCM_CTS                            = 0x20\n\tTIOCM_DSR                            = 0x100\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_LOOP                           = 0x8000\n\tTIOCM_OUT1                           = 0x2000\n\tTIOCM_OUT2                           = 0x4000\n\tTIOCM_RI                             = 0x80\n\tTIOCM_RNG                            = 0x80\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x10\n\tTIOCM_ST                             = 0x8\n\tTIOCNOTTY                            = 0x5422\n\tTIOCNXCL                             = 0x540d\n\tTIOCOUTQ                             = 0x40047473\n\tTIOCPKT                              = 0x5420\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x540e\n\tTIOCSERCONFIG                        = 0x5453\n\tTIOCSERGETLSR                        = 0x5459\n\tTIOCSERGETMULTI                      = 0x545a\n\tTIOCSERGSTRUCT                       = 0x5458\n\tTIOCSERGWILD                         = 0x5454\n\tTIOCSERSETMULTI                      = 0x545b\n\tTIOCSERSWILD                         = 0x5455\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETC                             = 0x80067411\n\tTIOCSETD                             = 0x5423\n\tTIOCSETN                             = 0x8006740a\n\tTIOCSETP                             = 0x80067409\n\tTIOCSIG                              = 0x80045436\n\tTIOCSLCKTRMIOS                       = 0x5457\n\tTIOCSLTC                             = 0x80067475\n\tTIOCSPGRP                            = 0x80047476\n\tTIOCSPTLCK                           = 0x80045431\n\tTIOCSRS485                           = 0x542f\n\tTIOCSSERIAL                          = 0x541f\n\tTIOCSSOFTCAR                         = 0x541a\n\tTIOCSTART                            = 0x2000746e\n\tTIOCSTI                              = 0x5412\n\tTIOCSTOP                             = 0x2000746f\n\tTIOCSWINSZ                           = 0x80087467\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x400000\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x801054d5\n\tTUNDETACHFILTER                      = 0x801054d6\n\tTUNGETFEATURES                       = 0x400454cf\n\tTUNGETFILTER                         = 0x401054db\n\tTUNGETIFF                            = 0x400454d2\n\tTUNGETSNDBUF                         = 0x400454d3\n\tTUNGETVNETBE                         = 0x400454df\n\tTUNGETVNETHDRSZ                      = 0x400454d7\n\tTUNGETVNETLE                         = 0x400454dd\n\tTUNSETDEBUG                          = 0x800454c9\n\tTUNSETGROUP                          = 0x800454ce\n\tTUNSETIFF                            = 0x800454ca\n\tTUNSETIFINDEX                        = 0x800454da\n\tTUNSETLINK                           = 0x800454cd\n\tTUNSETNOCSUM                         = 0x800454c8\n\tTUNSETOFFLOAD                        = 0x800454d0\n\tTUNSETOWNER                          = 0x800454cc\n\tTUNSETPERSIST                        = 0x800454cb\n\tTUNSETQUEUE                          = 0x800454d9\n\tTUNSETSNDBUF                         = 0x800454d4\n\tTUNSETTXFILTER                       = 0x800454d1\n\tTUNSETVNETBE                         = 0x800454de\n\tTUNSETVNETHDRSZ                      = 0x800454d8\n\tTUNSETVNETLE                         = 0x800454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0x10\n\tVEOF                                 = 0x4\n\tVEOL                                 = 0x6\n\tVEOL2                                = 0x8\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x5\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xb\n\tVSTART                               = 0xd\n\tVSTOP                                = 0xe\n\tVSUSP                                = 0xc\n\tVSWTC                                = 0x9\n\tVT0                                  = 0x0\n\tVT1                                  = 0x10000\n\tVTDLY                                = 0x10000\n\tVTIME                                = 0x7\n\tVWERASE                              = 0xa\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x40045702\n\tWDIOC_GETPRETIMEOUT                  = 0x40045709\n\tWDIOC_GETSTATUS                      = 0x40045701\n\tWDIOC_GETSUPPORT                     = 0x40285700\n\tWDIOC_GETTEMP                        = 0x40045703\n\tWDIOC_GETTIMELEFT                    = 0x4004570a\n\tWDIOC_GETTIMEOUT                     = 0x40045707\n\tWDIOC_KEEPALIVE                      = 0x40045705\n\tWDIOC_SETOPTIONS                     = 0x40045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x40\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4000\n\tXTABS                                = 0xc00\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x62)\n\tEADDRNOTAVAIL   = syscall.Errno(0x63)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x61)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x72)\n\tEBADE           = syscall.Errno(0x34)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x4d)\n\tEBADMSG         = syscall.Errno(0x4a)\n\tEBADR           = syscall.Errno(0x35)\n\tEBADRQC         = syscall.Errno(0x38)\n\tEBADSLT         = syscall.Errno(0x39)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7d)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x2c)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x67)\n\tECONNREFUSED    = syscall.Errno(0x6f)\n\tECONNRESET      = syscall.Errno(0x68)\n\tEDEADLK         = syscall.Errno(0x23)\n\tEDEADLOCK       = syscall.Errno(0x3a)\n\tEDESTADDRREQ    = syscall.Errno(0x59)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x7a)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x70)\n\tEHOSTUNREACH    = syscall.Errno(0x71)\n\tEHWPOISON       = syscall.Errno(0x85)\n\tEIDRM           = syscall.Errno(0x2b)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x73)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x6a)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x7f)\n\tEKEYREJECTED    = syscall.Errno(0x81)\n\tEKEYREVOKED     = syscall.Errno(0x80)\n\tEL2HLT          = syscall.Errno(0x33)\n\tEL2NSYNC        = syscall.Errno(0x2d)\n\tEL3HLT          = syscall.Errno(0x2e)\n\tEL3RST          = syscall.Errno(0x2f)\n\tELIBACC         = syscall.Errno(0x4f)\n\tELIBBAD         = syscall.Errno(0x50)\n\tELIBEXEC        = syscall.Errno(0x53)\n\tELIBMAX         = syscall.Errno(0x52)\n\tELIBSCN         = syscall.Errno(0x51)\n\tELNRNG          = syscall.Errno(0x30)\n\tELOOP           = syscall.Errno(0x28)\n\tEMEDIUMTYPE     = syscall.Errno(0x7c)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x5a)\n\tEMULTIHOP       = syscall.Errno(0x48)\n\tENAMETOOLONG    = syscall.Errno(0x24)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x64)\n\tENETRESET       = syscall.Errno(0x66)\n\tENETUNREACH     = syscall.Errno(0x65)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x37)\n\tENOBUFS         = syscall.Errno(0x69)\n\tENOCSI          = syscall.Errno(0x32)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x7e)\n\tENOLCK          = syscall.Errno(0x25)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x7b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x2a)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x5c)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x26)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x6b)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x27)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x83)\n\tENOTSOCK        = syscall.Errno(0x58)\n\tENOTSUP         = syscall.Errno(0x5f)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x4c)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x5f)\n\tEOVERFLOW       = syscall.Errno(0x4b)\n\tEOWNERDEAD      = syscall.Errno(0x82)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x60)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x5d)\n\tEPROTOTYPE      = syscall.Errno(0x5b)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x4e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x55)\n\tERFKILL         = syscall.Errno(0x84)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x6c)\n\tESOCKTNOSUPPORT = syscall.Errno(0x5e)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x74)\n\tESTRPIPE        = syscall.Errno(0x56)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x6e)\n\tETOOMANYREFS    = syscall.Errno(0x6d)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x31)\n\tEUSERS          = syscall.Errno(0x57)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x36)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0x7)\n\tSIGCHLD   = syscall.Signal(0x11)\n\tSIGCLD    = syscall.Signal(0x11)\n\tSIGCONT   = syscall.Signal(0x12)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x1d)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x1d)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1e)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTKFLT = syscall.Signal(0x10)\n\tSIGSTOP   = syscall.Signal(0x13)\n\tSIGSYS    = syscall.Signal(0x1f)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x14)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x17)\n\tSIGUSR1   = syscall.Signal(0xa)\n\tSIGUSR2   = syscall.Signal(0xc)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t35:  \"resource deadlock avoided\",\n\t36:  \"file name too long\",\n\t37:  \"no locks available\",\n\t38:  \"function not implemented\",\n\t39:  \"directory not empty\",\n\t40:  \"too many levels of symbolic links\",\n\t42:  \"no message of desired type\",\n\t43:  \"identifier removed\",\n\t44:  \"channel number out of range\",\n\t45:  \"level 2 not synchronized\",\n\t46:  \"level 3 halted\",\n\t47:  \"level 3 reset\",\n\t48:  \"link number out of range\",\n\t49:  \"protocol driver not attached\",\n\t50:  \"no CSI structure available\",\n\t51:  \"level 2 halted\",\n\t52:  \"invalid exchange\",\n\t53:  \"invalid request descriptor\",\n\t54:  \"exchange full\",\n\t55:  \"no anode\",\n\t56:  \"invalid request code\",\n\t57:  \"invalid slot\",\n\t58:  \"file locking deadlock error\",\n\t59:  \"bad font file format\",\n\t60:  \"device not a stream\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of streams resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"multihop attempted\",\n\t73:  \"RFS specific error\",\n\t74:  \"bad message\",\n\t75:  \"value too large for defined data type\",\n\t76:  \"name not unique on network\",\n\t77:  \"file descriptor in bad state\",\n\t78:  \"remote address changed\",\n\t79:  \"can not access a needed shared library\",\n\t80:  \"accessing a corrupted shared library\",\n\t81:  \".lib section in a.out corrupted\",\n\t82:  \"attempting to link in too many shared libraries\",\n\t83:  \"cannot exec a shared library directly\",\n\t84:  \"invalid or incomplete multibyte or wide character\",\n\t85:  \"interrupted system call should be restarted\",\n\t86:  \"streams pipe error\",\n\t87:  \"too many users\",\n\t88:  \"socket operation on non-socket\",\n\t89:  \"destination address required\",\n\t90:  \"message too long\",\n\t91:  \"protocol wrong type for socket\",\n\t92:  \"protocol not available\",\n\t93:  \"protocol not supported\",\n\t94:  \"socket type not supported\",\n\t95:  \"operation not supported\",\n\t96:  \"protocol family not supported\",\n\t97:  \"address family not supported by protocol\",\n\t98:  \"address already in use\",\n\t99:  \"cannot assign requested address\",\n\t100: \"network is down\",\n\t101: \"network is unreachable\",\n\t102: \"network dropped connection on reset\",\n\t103: \"software caused connection abort\",\n\t104: \"connection reset by peer\",\n\t105: \"no buffer space available\",\n\t106: \"transport endpoint is already connected\",\n\t107: \"transport endpoint is not connected\",\n\t108: \"cannot send after transport endpoint shutdown\",\n\t109: \"too many references: cannot splice\",\n\t110: \"connection timed out\",\n\t111: \"connection refused\",\n\t112: \"host is down\",\n\t113: \"no route to host\",\n\t114: \"operation already in progress\",\n\t115: \"operation now in progress\",\n\t116: \"stale file handle\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"disk quota exceeded\",\n\t123: \"no medium found\",\n\t124: \"wrong medium type\",\n\t125: \"operation canceled\",\n\t126: \"required key not available\",\n\t127: \"key has expired\",\n\t128: \"key has been revoked\",\n\t129: \"key was rejected by service\",\n\t130: \"owner died\",\n\t131: \"state not recoverable\",\n\t132: \"operation not possible due to RF-kill\",\n\t133: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"stack fault\",\n\t17: \"child exited\",\n\t18: \"continued\",\n\t19: \"stopped (signal)\",\n\t20: \"stopped\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"urgent I/O condition\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"I/O possible\",\n\t30: \"power failure\",\n\t31: \"bad system call\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go",
    "content": "// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build s390x,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                               = 0x26\n\tAF_APPLETALK                         = 0x5\n\tAF_ASH                               = 0x12\n\tAF_ATMPVC                            = 0x8\n\tAF_ATMSVC                            = 0x14\n\tAF_AX25                              = 0x3\n\tAF_BLUETOOTH                         = 0x1f\n\tAF_BRIDGE                            = 0x7\n\tAF_CAIF                              = 0x25\n\tAF_CAN                               = 0x1d\n\tAF_DECnet                            = 0xc\n\tAF_ECONET                            = 0x13\n\tAF_FILE                              = 0x1\n\tAF_IB                                = 0x1b\n\tAF_IEEE802154                        = 0x24\n\tAF_INET                              = 0x2\n\tAF_INET6                             = 0xa\n\tAF_IPX                               = 0x4\n\tAF_IRDA                              = 0x17\n\tAF_ISDN                              = 0x22\n\tAF_IUCV                              = 0x20\n\tAF_KCM                               = 0x29\n\tAF_KEY                               = 0xf\n\tAF_LLC                               = 0x1a\n\tAF_LOCAL                             = 0x1\n\tAF_MAX                               = 0x2c\n\tAF_MPLS                              = 0x1c\n\tAF_NETBEUI                           = 0xd\n\tAF_NETLINK                           = 0x10\n\tAF_NETROM                            = 0x6\n\tAF_NFC                               = 0x27\n\tAF_PACKET                            = 0x11\n\tAF_PHONET                            = 0x23\n\tAF_PPPOX                             = 0x18\n\tAF_QIPCRTR                           = 0x2a\n\tAF_RDS                               = 0x15\n\tAF_ROSE                              = 0xb\n\tAF_ROUTE                             = 0x10\n\tAF_RXRPC                             = 0x21\n\tAF_SECURITY                          = 0xe\n\tAF_SMC                               = 0x2b\n\tAF_SNA                               = 0x16\n\tAF_TIPC                              = 0x1e\n\tAF_UNIX                              = 0x1\n\tAF_UNSPEC                            = 0x0\n\tAF_VSOCK                             = 0x28\n\tAF_WANPIPE                           = 0x19\n\tAF_X25                               = 0x9\n\tALG_OP_DECRYPT                       = 0x0\n\tALG_OP_ENCRYPT                       = 0x1\n\tALG_SET_AEAD_ASSOCLEN                = 0x4\n\tALG_SET_AEAD_AUTHSIZE                = 0x5\n\tALG_SET_IV                           = 0x2\n\tALG_SET_KEY                          = 0x1\n\tALG_SET_OP                           = 0x3\n\tARPHRD_6LOWPAN                       = 0x339\n\tARPHRD_ADAPT                         = 0x108\n\tARPHRD_APPLETLK                      = 0x8\n\tARPHRD_ARCNET                        = 0x7\n\tARPHRD_ASH                           = 0x30d\n\tARPHRD_ATM                           = 0x13\n\tARPHRD_AX25                          = 0x3\n\tARPHRD_BIF                           = 0x307\n\tARPHRD_CAIF                          = 0x336\n\tARPHRD_CAN                           = 0x118\n\tARPHRD_CHAOS                         = 0x5\n\tARPHRD_CISCO                         = 0x201\n\tARPHRD_CSLIP                         = 0x101\n\tARPHRD_CSLIP6                        = 0x103\n\tARPHRD_DDCMP                         = 0x205\n\tARPHRD_DLCI                          = 0xf\n\tARPHRD_ECONET                        = 0x30e\n\tARPHRD_EETHER                        = 0x2\n\tARPHRD_ETHER                         = 0x1\n\tARPHRD_EUI64                         = 0x1b\n\tARPHRD_FCAL                          = 0x311\n\tARPHRD_FCFABRIC                      = 0x313\n\tARPHRD_FCPL                          = 0x312\n\tARPHRD_FCPP                          = 0x310\n\tARPHRD_FDDI                          = 0x306\n\tARPHRD_FRAD                          = 0x302\n\tARPHRD_HDLC                          = 0x201\n\tARPHRD_HIPPI                         = 0x30c\n\tARPHRD_HWX25                         = 0x110\n\tARPHRD_IEEE1394                      = 0x18\n\tARPHRD_IEEE802                       = 0x6\n\tARPHRD_IEEE80211                     = 0x321\n\tARPHRD_IEEE80211_PRISM               = 0x322\n\tARPHRD_IEEE80211_RADIOTAP            = 0x323\n\tARPHRD_IEEE802154                    = 0x324\n\tARPHRD_IEEE802154_MONITOR            = 0x325\n\tARPHRD_IEEE802_TR                    = 0x320\n\tARPHRD_INFINIBAND                    = 0x20\n\tARPHRD_IP6GRE                        = 0x337\n\tARPHRD_IPDDP                         = 0x309\n\tARPHRD_IPGRE                         = 0x30a\n\tARPHRD_IRDA                          = 0x30f\n\tARPHRD_LAPB                          = 0x204\n\tARPHRD_LOCALTLK                      = 0x305\n\tARPHRD_LOOPBACK                      = 0x304\n\tARPHRD_METRICOM                      = 0x17\n\tARPHRD_NETLINK                       = 0x338\n\tARPHRD_NETROM                        = 0x0\n\tARPHRD_NONE                          = 0xfffe\n\tARPHRD_PHONET                        = 0x334\n\tARPHRD_PHONET_PIPE                   = 0x335\n\tARPHRD_PIMREG                        = 0x30b\n\tARPHRD_PPP                           = 0x200\n\tARPHRD_PRONET                        = 0x4\n\tARPHRD_RAWHDLC                       = 0x206\n\tARPHRD_ROSE                          = 0x10e\n\tARPHRD_RSRVD                         = 0x104\n\tARPHRD_SIT                           = 0x308\n\tARPHRD_SKIP                          = 0x303\n\tARPHRD_SLIP                          = 0x100\n\tARPHRD_SLIP6                         = 0x102\n\tARPHRD_TUNNEL                        = 0x300\n\tARPHRD_TUNNEL6                       = 0x301\n\tARPHRD_VOID                          = 0xffff\n\tARPHRD_VSOCKMON                      = 0x33a\n\tARPHRD_X25                           = 0x10f\n\tB0                                   = 0x0\n\tB1000000                             = 0x1008\n\tB110                                 = 0x3\n\tB115200                              = 0x1002\n\tB1152000                             = 0x1009\n\tB1200                                = 0x9\n\tB134                                 = 0x4\n\tB150                                 = 0x5\n\tB1500000                             = 0x100a\n\tB1800                                = 0xa\n\tB19200                               = 0xe\n\tB200                                 = 0x6\n\tB2000000                             = 0x100b\n\tB230400                              = 0x1003\n\tB2400                                = 0xb\n\tB2500000                             = 0x100c\n\tB300                                 = 0x7\n\tB3000000                             = 0x100d\n\tB3500000                             = 0x100e\n\tB38400                               = 0xf\n\tB4000000                             = 0x100f\n\tB460800                              = 0x1004\n\tB4800                                = 0xc\n\tB50                                  = 0x1\n\tB500000                              = 0x1005\n\tB57600                               = 0x1001\n\tB576000                              = 0x1006\n\tB600                                 = 0x8\n\tB75                                  = 0x2\n\tB921600                              = 0x1007\n\tB9600                                = 0xd\n\tBLKBSZGET                            = 0x80081270\n\tBLKBSZSET                            = 0x40081271\n\tBLKFLSBUF                            = 0x1261\n\tBLKFRAGET                            = 0x1265\n\tBLKFRASET                            = 0x1264\n\tBLKGETSIZE                           = 0x1260\n\tBLKGETSIZE64                         = 0x80081272\n\tBLKPBSZGET                           = 0x127b\n\tBLKRAGET                             = 0x1263\n\tBLKRASET                             = 0x1262\n\tBLKROGET                             = 0x125e\n\tBLKROSET                             = 0x125d\n\tBLKRRPART                            = 0x125f\n\tBLKSECTGET                           = 0x1267\n\tBLKSECTSET                           = 0x1266\n\tBLKSSZGET                            = 0x1268\n\tBOTHER                               = 0x1000\n\tBPF_A                                = 0x10\n\tBPF_ABS                              = 0x20\n\tBPF_ADD                              = 0x0\n\tBPF_ALU                              = 0x4\n\tBPF_AND                              = 0x50\n\tBPF_B                                = 0x10\n\tBPF_DIV                              = 0x30\n\tBPF_H                                = 0x8\n\tBPF_IMM                              = 0x0\n\tBPF_IND                              = 0x40\n\tBPF_JA                               = 0x0\n\tBPF_JEQ                              = 0x10\n\tBPF_JGE                              = 0x30\n\tBPF_JGT                              = 0x20\n\tBPF_JMP                              = 0x5\n\tBPF_JSET                             = 0x40\n\tBPF_K                                = 0x0\n\tBPF_LD                               = 0x0\n\tBPF_LDX                              = 0x1\n\tBPF_LEN                              = 0x80\n\tBPF_LL_OFF                           = -0x200000\n\tBPF_LSH                              = 0x60\n\tBPF_MAJOR_VERSION                    = 0x1\n\tBPF_MAXINSNS                         = 0x1000\n\tBPF_MEM                              = 0x60\n\tBPF_MEMWORDS                         = 0x10\n\tBPF_MINOR_VERSION                    = 0x1\n\tBPF_MISC                             = 0x7\n\tBPF_MOD                              = 0x90\n\tBPF_MSH                              = 0xa0\n\tBPF_MUL                              = 0x20\n\tBPF_NEG                              = 0x80\n\tBPF_NET_OFF                          = -0x100000\n\tBPF_OR                               = 0x40\n\tBPF_RET                              = 0x6\n\tBPF_RSH                              = 0x70\n\tBPF_ST                               = 0x2\n\tBPF_STX                              = 0x3\n\tBPF_SUB                              = 0x10\n\tBPF_TAX                              = 0x0\n\tBPF_TXA                              = 0x80\n\tBPF_W                                = 0x0\n\tBPF_X                                = 0x8\n\tBPF_XOR                              = 0xa0\n\tBRKINT                               = 0x2\n\tBS0                                  = 0x0\n\tBS1                                  = 0x2000\n\tBSDLY                                = 0x2000\n\tCAN_BCM                              = 0x2\n\tCAN_EFF_FLAG                         = 0x80000000\n\tCAN_EFF_ID_BITS                      = 0x1d\n\tCAN_EFF_MASK                         = 0x1fffffff\n\tCAN_ERR_FLAG                         = 0x20000000\n\tCAN_ERR_MASK                         = 0x1fffffff\n\tCAN_INV_FILTER                       = 0x20000000\n\tCAN_ISOTP                            = 0x6\n\tCAN_MAX_DLC                          = 0x8\n\tCAN_MAX_DLEN                         = 0x8\n\tCAN_MCNET                            = 0x5\n\tCAN_MTU                              = 0x10\n\tCAN_NPROTO                           = 0x7\n\tCAN_RAW                              = 0x1\n\tCAN_RAW_FILTER_MAX                   = 0x200\n\tCAN_RTR_FLAG                         = 0x40000000\n\tCAN_SFF_ID_BITS                      = 0xb\n\tCAN_SFF_MASK                         = 0x7ff\n\tCAN_TP16                             = 0x3\n\tCAN_TP20                             = 0x4\n\tCBAUD                                = 0x100f\n\tCBAUDEX                              = 0x1000\n\tCFLUSH                               = 0xf\n\tCIBAUD                               = 0x100f0000\n\tCLOCAL                               = 0x800\n\tCLOCK_BOOTTIME                       = 0x7\n\tCLOCK_BOOTTIME_ALARM                 = 0x9\n\tCLOCK_DEFAULT                        = 0x0\n\tCLOCK_EXT                            = 0x1\n\tCLOCK_INT                            = 0x2\n\tCLOCK_MONOTONIC                      = 0x1\n\tCLOCK_MONOTONIC_COARSE               = 0x6\n\tCLOCK_MONOTONIC_RAW                  = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID             = 0x2\n\tCLOCK_REALTIME                       = 0x0\n\tCLOCK_REALTIME_ALARM                 = 0x8\n\tCLOCK_REALTIME_COARSE                = 0x5\n\tCLOCK_TAI                            = 0xb\n\tCLOCK_THREAD_CPUTIME_ID              = 0x3\n\tCLOCK_TXFROMRX                       = 0x4\n\tCLOCK_TXINT                          = 0x3\n\tCLONE_CHILD_CLEARTID                 = 0x200000\n\tCLONE_CHILD_SETTID                   = 0x1000000\n\tCLONE_DETACHED                       = 0x400000\n\tCLONE_FILES                          = 0x400\n\tCLONE_FS                             = 0x200\n\tCLONE_IO                             = 0x80000000\n\tCLONE_NEWCGROUP                      = 0x2000000\n\tCLONE_NEWIPC                         = 0x8000000\n\tCLONE_NEWNET                         = 0x40000000\n\tCLONE_NEWNS                          = 0x20000\n\tCLONE_NEWPID                         = 0x20000000\n\tCLONE_NEWUSER                        = 0x10000000\n\tCLONE_NEWUTS                         = 0x4000000\n\tCLONE_PARENT                         = 0x8000\n\tCLONE_PARENT_SETTID                  = 0x100000\n\tCLONE_PTRACE                         = 0x2000\n\tCLONE_SETTLS                         = 0x80000\n\tCLONE_SIGHAND                        = 0x800\n\tCLONE_SYSVSEM                        = 0x40000\n\tCLONE_THREAD                         = 0x10000\n\tCLONE_UNTRACED                       = 0x800000\n\tCLONE_VFORK                          = 0x4000\n\tCLONE_VM                             = 0x100\n\tCMSPAR                               = 0x40000000\n\tCR0                                  = 0x0\n\tCR1                                  = 0x200\n\tCR2                                  = 0x400\n\tCR3                                  = 0x600\n\tCRDLY                                = 0x600\n\tCREAD                                = 0x80\n\tCRTSCTS                              = 0x80000000\n\tCS5                                  = 0x0\n\tCS6                                  = 0x10\n\tCS7                                  = 0x20\n\tCS8                                  = 0x30\n\tCSIGNAL                              = 0xff\n\tCSIZE                                = 0x30\n\tCSTART                               = 0x11\n\tCSTATUS                              = 0x0\n\tCSTOP                                = 0x13\n\tCSTOPB                               = 0x40\n\tCSUSP                                = 0x1a\n\tDT_BLK                               = 0x6\n\tDT_CHR                               = 0x2\n\tDT_DIR                               = 0x4\n\tDT_FIFO                              = 0x1\n\tDT_LNK                               = 0xa\n\tDT_REG                               = 0x8\n\tDT_SOCK                              = 0xc\n\tDT_UNKNOWN                           = 0x0\n\tDT_WHT                               = 0xe\n\tECHO                                 = 0x8\n\tECHOCTL                              = 0x200\n\tECHOE                                = 0x10\n\tECHOK                                = 0x20\n\tECHOKE                               = 0x800\n\tECHONL                               = 0x40\n\tECHOPRT                              = 0x400\n\tEFD_CLOEXEC                          = 0x80000\n\tEFD_NONBLOCK                         = 0x800\n\tEFD_SEMAPHORE                        = 0x1\n\tENCODING_DEFAULT                     = 0x0\n\tENCODING_FM_MARK                     = 0x3\n\tENCODING_FM_SPACE                    = 0x4\n\tENCODING_MANCHESTER                  = 0x5\n\tENCODING_NRZ                         = 0x1\n\tENCODING_NRZI                        = 0x2\n\tEPOLLERR                             = 0x8\n\tEPOLLET                              = 0x80000000\n\tEPOLLEXCLUSIVE                       = 0x10000000\n\tEPOLLHUP                             = 0x10\n\tEPOLLIN                              = 0x1\n\tEPOLLMSG                             = 0x400\n\tEPOLLONESHOT                         = 0x40000000\n\tEPOLLOUT                             = 0x4\n\tEPOLLPRI                             = 0x2\n\tEPOLLRDBAND                          = 0x80\n\tEPOLLRDHUP                           = 0x2000\n\tEPOLLRDNORM                          = 0x40\n\tEPOLLWAKEUP                          = 0x20000000\n\tEPOLLWRBAND                          = 0x200\n\tEPOLLWRNORM                          = 0x100\n\tEPOLL_CLOEXEC                        = 0x80000\n\tEPOLL_CTL_ADD                        = 0x1\n\tEPOLL_CTL_DEL                        = 0x2\n\tEPOLL_CTL_MOD                        = 0x3\n\tETH_P_1588                           = 0x88f7\n\tETH_P_8021AD                         = 0x88a8\n\tETH_P_8021AH                         = 0x88e7\n\tETH_P_8021Q                          = 0x8100\n\tETH_P_80221                          = 0x8917\n\tETH_P_802_2                          = 0x4\n\tETH_P_802_3                          = 0x1\n\tETH_P_802_3_MIN                      = 0x600\n\tETH_P_802_EX1                        = 0x88b5\n\tETH_P_AARP                           = 0x80f3\n\tETH_P_AF_IUCV                        = 0xfbfb\n\tETH_P_ALL                            = 0x3\n\tETH_P_AOE                            = 0x88a2\n\tETH_P_ARCNET                         = 0x1a\n\tETH_P_ARP                            = 0x806\n\tETH_P_ATALK                          = 0x809b\n\tETH_P_ATMFATE                        = 0x8884\n\tETH_P_ATMMPOA                        = 0x884c\n\tETH_P_AX25                           = 0x2\n\tETH_P_BATMAN                         = 0x4305\n\tETH_P_BPQ                            = 0x8ff\n\tETH_P_CAIF                           = 0xf7\n\tETH_P_CAN                            = 0xc\n\tETH_P_CANFD                          = 0xd\n\tETH_P_CONTROL                        = 0x16\n\tETH_P_CUST                           = 0x6006\n\tETH_P_DDCMP                          = 0x6\n\tETH_P_DEC                            = 0x6000\n\tETH_P_DIAG                           = 0x6005\n\tETH_P_DNA_DL                         = 0x6001\n\tETH_P_DNA_RC                         = 0x6002\n\tETH_P_DNA_RT                         = 0x6003\n\tETH_P_DSA                            = 0x1b\n\tETH_P_ECONET                         = 0x18\n\tETH_P_EDSA                           = 0xdada\n\tETH_P_FCOE                           = 0x8906\n\tETH_P_FIP                            = 0x8914\n\tETH_P_HDLC                           = 0x19\n\tETH_P_HSR                            = 0x892f\n\tETH_P_IBOE                           = 0x8915\n\tETH_P_IEEE802154                     = 0xf6\n\tETH_P_IEEEPUP                        = 0xa00\n\tETH_P_IEEEPUPAT                      = 0xa01\n\tETH_P_IP                             = 0x800\n\tETH_P_IPV6                           = 0x86dd\n\tETH_P_IPX                            = 0x8137\n\tETH_P_IRDA                           = 0x17\n\tETH_P_LAT                            = 0x6004\n\tETH_P_LINK_CTL                       = 0x886c\n\tETH_P_LOCALTALK                      = 0x9\n\tETH_P_LOOP                           = 0x60\n\tETH_P_LOOPBACK                       = 0x9000\n\tETH_P_MACSEC                         = 0x88e5\n\tETH_P_MOBITEX                        = 0x15\n\tETH_P_MPLS_MC                        = 0x8848\n\tETH_P_MPLS_UC                        = 0x8847\n\tETH_P_MVRP                           = 0x88f5\n\tETH_P_NCSI                           = 0x88f8\n\tETH_P_PAE                            = 0x888e\n\tETH_P_PAUSE                          = 0x8808\n\tETH_P_PHONET                         = 0xf5\n\tETH_P_PPPTALK                        = 0x10\n\tETH_P_PPP_DISC                       = 0x8863\n\tETH_P_PPP_MP                         = 0x8\n\tETH_P_PPP_SES                        = 0x8864\n\tETH_P_PRP                            = 0x88fb\n\tETH_P_PUP                            = 0x200\n\tETH_P_PUPAT                          = 0x201\n\tETH_P_QINQ1                          = 0x9100\n\tETH_P_QINQ2                          = 0x9200\n\tETH_P_QINQ3                          = 0x9300\n\tETH_P_RARP                           = 0x8035\n\tETH_P_SCA                            = 0x6007\n\tETH_P_SLOW                           = 0x8809\n\tETH_P_SNAP                           = 0x5\n\tETH_P_TDLS                           = 0x890d\n\tETH_P_TEB                            = 0x6558\n\tETH_P_TIPC                           = 0x88ca\n\tETH_P_TRAILER                        = 0x1c\n\tETH_P_TR_802_2                       = 0x11\n\tETH_P_TSN                            = 0x22f0\n\tETH_P_WAN_PPP                        = 0x7\n\tETH_P_WCCP                           = 0x883e\n\tETH_P_X25                            = 0x805\n\tETH_P_XDSA                           = 0xf8\n\tEXTA                                 = 0xe\n\tEXTB                                 = 0xf\n\tEXTPROC                              = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE             = 0x8\n\tFALLOC_FL_INSERT_RANGE               = 0x20\n\tFALLOC_FL_KEEP_SIZE                  = 0x1\n\tFALLOC_FL_NO_HIDE_STALE              = 0x4\n\tFALLOC_FL_PUNCH_HOLE                 = 0x2\n\tFALLOC_FL_UNSHARE_RANGE              = 0x40\n\tFALLOC_FL_ZERO_RANGE                 = 0x10\n\tFD_CLOEXEC                           = 0x1\n\tFD_SETSIZE                           = 0x400\n\tFF0                                  = 0x0\n\tFF1                                  = 0x8000\n\tFFDLY                                = 0x8000\n\tFLUSHO                               = 0x1000\n\tFS_ENCRYPTION_MODE_AES_128_CBC       = 0x5\n\tFS_ENCRYPTION_MODE_AES_128_CTS       = 0x6\n\tFS_ENCRYPTION_MODE_AES_256_CBC       = 0x3\n\tFS_ENCRYPTION_MODE_AES_256_CTS       = 0x4\n\tFS_ENCRYPTION_MODE_AES_256_GCM       = 0x2\n\tFS_ENCRYPTION_MODE_AES_256_XTS       = 0x1\n\tFS_ENCRYPTION_MODE_INVALID           = 0x0\n\tFS_IOC_GET_ENCRYPTION_POLICY         = 0x400c6615\n\tFS_IOC_GET_ENCRYPTION_PWSALT         = 0x40106614\n\tFS_IOC_SET_ENCRYPTION_POLICY         = 0x800c6613\n\tFS_KEY_DESCRIPTOR_SIZE               = 0x8\n\tFS_KEY_DESC_PREFIX                   = \"fscrypt:\"\n\tFS_KEY_DESC_PREFIX_SIZE              = 0x8\n\tFS_MAX_KEY_SIZE                      = 0x40\n\tFS_POLICY_FLAGS_PAD_16               = 0x2\n\tFS_POLICY_FLAGS_PAD_32               = 0x3\n\tFS_POLICY_FLAGS_PAD_4                = 0x0\n\tFS_POLICY_FLAGS_PAD_8                = 0x1\n\tFS_POLICY_FLAGS_PAD_MASK             = 0x3\n\tFS_POLICY_FLAGS_VALID                = 0x3\n\tF_DUPFD                              = 0x0\n\tF_DUPFD_CLOEXEC                      = 0x406\n\tF_EXLCK                              = 0x4\n\tF_GETFD                              = 0x1\n\tF_GETFL                              = 0x3\n\tF_GETLEASE                           = 0x401\n\tF_GETLK                              = 0x5\n\tF_GETLK64                            = 0x5\n\tF_GETOWN                             = 0x9\n\tF_GETOWN_EX                          = 0x10\n\tF_GETPIPE_SZ                         = 0x408\n\tF_GETSIG                             = 0xb\n\tF_LOCK                               = 0x1\n\tF_NOTIFY                             = 0x402\n\tF_OFD_GETLK                          = 0x24\n\tF_OFD_SETLK                          = 0x25\n\tF_OFD_SETLKW                         = 0x26\n\tF_OK                                 = 0x0\n\tF_RDLCK                              = 0x0\n\tF_SETFD                              = 0x2\n\tF_SETFL                              = 0x4\n\tF_SETLEASE                           = 0x400\n\tF_SETLK                              = 0x6\n\tF_SETLK64                            = 0x6\n\tF_SETLKW                             = 0x7\n\tF_SETLKW64                           = 0x7\n\tF_SETOWN                             = 0x8\n\tF_SETOWN_EX                          = 0xf\n\tF_SETPIPE_SZ                         = 0x407\n\tF_SETSIG                             = 0xa\n\tF_SHLCK                              = 0x8\n\tF_TEST                               = 0x3\n\tF_TLOCK                              = 0x2\n\tF_ULOCK                              = 0x0\n\tF_UNLCK                              = 0x2\n\tF_WRLCK                              = 0x1\n\tGENL_ADMIN_PERM                      = 0x1\n\tGENL_CMD_CAP_DO                      = 0x2\n\tGENL_CMD_CAP_DUMP                    = 0x4\n\tGENL_CMD_CAP_HASPOL                  = 0x8\n\tGENL_HDRLEN                          = 0x4\n\tGENL_ID_CTRL                         = 0x10\n\tGENL_ID_PMCRAID                      = 0x12\n\tGENL_ID_VFS_DQUOT                    = 0x11\n\tGENL_MAX_ID                          = 0x3ff\n\tGENL_MIN_ID                          = 0x10\n\tGENL_NAMSIZ                          = 0x10\n\tGENL_START_ALLOC                     = 0x13\n\tGENL_UNS_ADMIN_PERM                  = 0x10\n\tGRND_NONBLOCK                        = 0x1\n\tGRND_RANDOM                          = 0x2\n\tHUPCL                                = 0x400\n\tIBSHIFT                              = 0x10\n\tICANON                               = 0x2\n\tICMPV6_FILTER                        = 0x1\n\tICRNL                                = 0x100\n\tIEXTEN                               = 0x8000\n\tIFA_F_DADFAILED                      = 0x8\n\tIFA_F_DEPRECATED                     = 0x20\n\tIFA_F_HOMEADDRESS                    = 0x10\n\tIFA_F_MANAGETEMPADDR                 = 0x100\n\tIFA_F_MCAUTOJOIN                     = 0x400\n\tIFA_F_NODAD                          = 0x2\n\tIFA_F_NOPREFIXROUTE                  = 0x200\n\tIFA_F_OPTIMISTIC                     = 0x4\n\tIFA_F_PERMANENT                      = 0x80\n\tIFA_F_SECONDARY                      = 0x1\n\tIFA_F_STABLE_PRIVACY                 = 0x800\n\tIFA_F_TEMPORARY                      = 0x1\n\tIFA_F_TENTATIVE                      = 0x40\n\tIFA_MAX                              = 0x8\n\tIFF_ALLMULTI                         = 0x200\n\tIFF_ATTACH_QUEUE                     = 0x200\n\tIFF_AUTOMEDIA                        = 0x4000\n\tIFF_BROADCAST                        = 0x2\n\tIFF_DEBUG                            = 0x4\n\tIFF_DETACH_QUEUE                     = 0x400\n\tIFF_DORMANT                          = 0x20000\n\tIFF_DYNAMIC                          = 0x8000\n\tIFF_ECHO                             = 0x40000\n\tIFF_LOOPBACK                         = 0x8\n\tIFF_LOWER_UP                         = 0x10000\n\tIFF_MASTER                           = 0x400\n\tIFF_MULTICAST                        = 0x1000\n\tIFF_MULTI_QUEUE                      = 0x100\n\tIFF_NOARP                            = 0x80\n\tIFF_NOFILTER                         = 0x1000\n\tIFF_NOTRAILERS                       = 0x20\n\tIFF_NO_PI                            = 0x1000\n\tIFF_ONE_QUEUE                        = 0x2000\n\tIFF_PERSIST                          = 0x800\n\tIFF_POINTOPOINT                      = 0x10\n\tIFF_PORTSEL                          = 0x2000\n\tIFF_PROMISC                          = 0x100\n\tIFF_RUNNING                          = 0x40\n\tIFF_SLAVE                            = 0x800\n\tIFF_TAP                              = 0x2\n\tIFF_TUN                              = 0x1\n\tIFF_TUN_EXCL                         = 0x8000\n\tIFF_UP                               = 0x1\n\tIFF_VNET_HDR                         = 0x4000\n\tIFF_VOLATILE                         = 0x70c5a\n\tIFNAMSIZ                             = 0x10\n\tIGNBRK                               = 0x1\n\tIGNCR                                = 0x80\n\tIGNPAR                               = 0x4\n\tIMAXBEL                              = 0x2000\n\tINLCR                                = 0x40\n\tINPCK                                = 0x10\n\tIN_ACCESS                            = 0x1\n\tIN_ALL_EVENTS                        = 0xfff\n\tIN_ATTRIB                            = 0x4\n\tIN_CLASSA_HOST                       = 0xffffff\n\tIN_CLASSA_MAX                        = 0x80\n\tIN_CLASSA_NET                        = 0xff000000\n\tIN_CLASSA_NSHIFT                     = 0x18\n\tIN_CLASSB_HOST                       = 0xffff\n\tIN_CLASSB_MAX                        = 0x10000\n\tIN_CLASSB_NET                        = 0xffff0000\n\tIN_CLASSB_NSHIFT                     = 0x10\n\tIN_CLASSC_HOST                       = 0xff\n\tIN_CLASSC_NET                        = 0xffffff00\n\tIN_CLASSC_NSHIFT                     = 0x8\n\tIN_CLOEXEC                           = 0x80000\n\tIN_CLOSE                             = 0x18\n\tIN_CLOSE_NOWRITE                     = 0x10\n\tIN_CLOSE_WRITE                       = 0x8\n\tIN_CREATE                            = 0x100\n\tIN_DELETE                            = 0x200\n\tIN_DELETE_SELF                       = 0x400\n\tIN_DONT_FOLLOW                       = 0x2000000\n\tIN_EXCL_UNLINK                       = 0x4000000\n\tIN_IGNORED                           = 0x8000\n\tIN_ISDIR                             = 0x40000000\n\tIN_LOOPBACKNET                       = 0x7f\n\tIN_MASK_ADD                          = 0x20000000\n\tIN_MODIFY                            = 0x2\n\tIN_MOVE                              = 0xc0\n\tIN_MOVED_FROM                        = 0x40\n\tIN_MOVED_TO                          = 0x80\n\tIN_MOVE_SELF                         = 0x800\n\tIN_NONBLOCK                          = 0x800\n\tIN_ONESHOT                           = 0x80000000\n\tIN_ONLYDIR                           = 0x1000000\n\tIN_OPEN                              = 0x20\n\tIN_Q_OVERFLOW                        = 0x4000\n\tIN_UNMOUNT                           = 0x2000\n\tIOCTL_VM_SOCKETS_GET_LOCAL_CID       = 0x7b9\n\tIPPROTO_AH                           = 0x33\n\tIPPROTO_BEETPH                       = 0x5e\n\tIPPROTO_COMP                         = 0x6c\n\tIPPROTO_DCCP                         = 0x21\n\tIPPROTO_DSTOPTS                      = 0x3c\n\tIPPROTO_EGP                          = 0x8\n\tIPPROTO_ENCAP                        = 0x62\n\tIPPROTO_ESP                          = 0x32\n\tIPPROTO_FRAGMENT                     = 0x2c\n\tIPPROTO_GRE                          = 0x2f\n\tIPPROTO_HOPOPTS                      = 0x0\n\tIPPROTO_ICMP                         = 0x1\n\tIPPROTO_ICMPV6                       = 0x3a\n\tIPPROTO_IDP                          = 0x16\n\tIPPROTO_IGMP                         = 0x2\n\tIPPROTO_IP                           = 0x0\n\tIPPROTO_IPIP                         = 0x4\n\tIPPROTO_IPV6                         = 0x29\n\tIPPROTO_MH                           = 0x87\n\tIPPROTO_MPLS                         = 0x89\n\tIPPROTO_MTP                          = 0x5c\n\tIPPROTO_NONE                         = 0x3b\n\tIPPROTO_PIM                          = 0x67\n\tIPPROTO_PUP                          = 0xc\n\tIPPROTO_RAW                          = 0xff\n\tIPPROTO_ROUTING                      = 0x2b\n\tIPPROTO_RSVP                         = 0x2e\n\tIPPROTO_SCTP                         = 0x84\n\tIPPROTO_TCP                          = 0x6\n\tIPPROTO_TP                           = 0x1d\n\tIPPROTO_UDP                          = 0x11\n\tIPPROTO_UDPLITE                      = 0x88\n\tIPV6_2292DSTOPTS                     = 0x4\n\tIPV6_2292HOPLIMIT                    = 0x8\n\tIPV6_2292HOPOPTS                     = 0x3\n\tIPV6_2292PKTINFO                     = 0x2\n\tIPV6_2292PKTOPTIONS                  = 0x6\n\tIPV6_2292RTHDR                       = 0x5\n\tIPV6_ADDRFORM                        = 0x1\n\tIPV6_ADDR_PREFERENCES                = 0x48\n\tIPV6_ADD_MEMBERSHIP                  = 0x14\n\tIPV6_AUTHHDR                         = 0xa\n\tIPV6_AUTOFLOWLABEL                   = 0x46\n\tIPV6_CHECKSUM                        = 0x7\n\tIPV6_DONTFRAG                        = 0x3e\n\tIPV6_DROP_MEMBERSHIP                 = 0x15\n\tIPV6_DSTOPTS                         = 0x3b\n\tIPV6_HDRINCL                         = 0x24\n\tIPV6_HOPLIMIT                        = 0x34\n\tIPV6_HOPOPTS                         = 0x36\n\tIPV6_IPSEC_POLICY                    = 0x22\n\tIPV6_JOIN_ANYCAST                    = 0x1b\n\tIPV6_JOIN_GROUP                      = 0x14\n\tIPV6_LEAVE_ANYCAST                   = 0x1c\n\tIPV6_LEAVE_GROUP                     = 0x15\n\tIPV6_MINHOPCOUNT                     = 0x49\n\tIPV6_MTU                             = 0x18\n\tIPV6_MTU_DISCOVER                    = 0x17\n\tIPV6_MULTICAST_HOPS                  = 0x12\n\tIPV6_MULTICAST_IF                    = 0x11\n\tIPV6_MULTICAST_LOOP                  = 0x13\n\tIPV6_NEXTHOP                         = 0x9\n\tIPV6_ORIGDSTADDR                     = 0x4a\n\tIPV6_PATHMTU                         = 0x3d\n\tIPV6_PKTINFO                         = 0x32\n\tIPV6_PMTUDISC_DO                     = 0x2\n\tIPV6_PMTUDISC_DONT                   = 0x0\n\tIPV6_PMTUDISC_INTERFACE              = 0x4\n\tIPV6_PMTUDISC_OMIT                   = 0x5\n\tIPV6_PMTUDISC_PROBE                  = 0x3\n\tIPV6_PMTUDISC_WANT                   = 0x1\n\tIPV6_RECVDSTOPTS                     = 0x3a\n\tIPV6_RECVERR                         = 0x19\n\tIPV6_RECVFRAGSIZE                    = 0x4d\n\tIPV6_RECVHOPLIMIT                    = 0x33\n\tIPV6_RECVHOPOPTS                     = 0x35\n\tIPV6_RECVORIGDSTADDR                 = 0x4a\n\tIPV6_RECVPATHMTU                     = 0x3c\n\tIPV6_RECVPKTINFO                     = 0x31\n\tIPV6_RECVRTHDR                       = 0x38\n\tIPV6_RECVTCLASS                      = 0x42\n\tIPV6_ROUTER_ALERT                    = 0x16\n\tIPV6_RTHDR                           = 0x39\n\tIPV6_RTHDRDSTOPTS                    = 0x37\n\tIPV6_RTHDR_LOOSE                     = 0x0\n\tIPV6_RTHDR_STRICT                    = 0x1\n\tIPV6_RTHDR_TYPE_0                    = 0x0\n\tIPV6_RXDSTOPTS                       = 0x3b\n\tIPV6_RXHOPOPTS                       = 0x36\n\tIPV6_TCLASS                          = 0x43\n\tIPV6_TRANSPARENT                     = 0x4b\n\tIPV6_UNICAST_HOPS                    = 0x10\n\tIPV6_UNICAST_IF                      = 0x4c\n\tIPV6_V6ONLY                          = 0x1a\n\tIPV6_XFRM_POLICY                     = 0x23\n\tIP_ADD_MEMBERSHIP                    = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP             = 0x27\n\tIP_BIND_ADDRESS_NO_PORT              = 0x18\n\tIP_BLOCK_SOURCE                      = 0x26\n\tIP_CHECKSUM                          = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP            = 0x1\n\tIP_DEFAULT_MULTICAST_TTL             = 0x1\n\tIP_DF                                = 0x4000\n\tIP_DROP_MEMBERSHIP                   = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP            = 0x28\n\tIP_FREEBIND                          = 0xf\n\tIP_HDRINCL                           = 0x3\n\tIP_IPSEC_POLICY                      = 0x10\n\tIP_MAXPACKET                         = 0xffff\n\tIP_MAX_MEMBERSHIPS                   = 0x14\n\tIP_MF                                = 0x2000\n\tIP_MINTTL                            = 0x15\n\tIP_MSFILTER                          = 0x29\n\tIP_MSS                               = 0x240\n\tIP_MTU                               = 0xe\n\tIP_MTU_DISCOVER                      = 0xa\n\tIP_MULTICAST_ALL                     = 0x31\n\tIP_MULTICAST_IF                      = 0x20\n\tIP_MULTICAST_LOOP                    = 0x22\n\tIP_MULTICAST_TTL                     = 0x21\n\tIP_NODEFRAG                          = 0x16\n\tIP_OFFMASK                           = 0x1fff\n\tIP_OPTIONS                           = 0x4\n\tIP_ORIGDSTADDR                       = 0x14\n\tIP_PASSSEC                           = 0x12\n\tIP_PKTINFO                           = 0x8\n\tIP_PKTOPTIONS                        = 0x9\n\tIP_PMTUDISC                          = 0xa\n\tIP_PMTUDISC_DO                       = 0x2\n\tIP_PMTUDISC_DONT                     = 0x0\n\tIP_PMTUDISC_INTERFACE                = 0x4\n\tIP_PMTUDISC_OMIT                     = 0x5\n\tIP_PMTUDISC_PROBE                    = 0x3\n\tIP_PMTUDISC_WANT                     = 0x1\n\tIP_RECVERR                           = 0xb\n\tIP_RECVFRAGSIZE                      = 0x19\n\tIP_RECVOPTS                          = 0x6\n\tIP_RECVORIGDSTADDR                   = 0x14\n\tIP_RECVRETOPTS                       = 0x7\n\tIP_RECVTOS                           = 0xd\n\tIP_RECVTTL                           = 0xc\n\tIP_RETOPTS                           = 0x7\n\tIP_RF                                = 0x8000\n\tIP_ROUTER_ALERT                      = 0x5\n\tIP_TOS                               = 0x1\n\tIP_TRANSPARENT                       = 0x13\n\tIP_TTL                               = 0x2\n\tIP_UNBLOCK_SOURCE                    = 0x25\n\tIP_UNICAST_IF                        = 0x32\n\tIP_XFRM_POLICY                       = 0x11\n\tISIG                                 = 0x1\n\tISTRIP                               = 0x20\n\tIUCLC                                = 0x200\n\tIUTF8                                = 0x4000\n\tIXANY                                = 0x800\n\tIXOFF                                = 0x1000\n\tIXON                                 = 0x400\n\tKEYCTL_ASSUME_AUTHORITY              = 0x10\n\tKEYCTL_CHOWN                         = 0x4\n\tKEYCTL_CLEAR                         = 0x7\n\tKEYCTL_DESCRIBE                      = 0x6\n\tKEYCTL_DH_COMPUTE                    = 0x17\n\tKEYCTL_GET_KEYRING_ID                = 0x0\n\tKEYCTL_GET_PERSISTENT                = 0x16\n\tKEYCTL_GET_SECURITY                  = 0x11\n\tKEYCTL_INSTANTIATE                   = 0xc\n\tKEYCTL_INSTANTIATE_IOV               = 0x14\n\tKEYCTL_INVALIDATE                    = 0x15\n\tKEYCTL_JOIN_SESSION_KEYRING          = 0x1\n\tKEYCTL_LINK                          = 0x8\n\tKEYCTL_NEGATE                        = 0xd\n\tKEYCTL_READ                          = 0xb\n\tKEYCTL_REJECT                        = 0x13\n\tKEYCTL_RESTRICT_KEYRING              = 0x1d\n\tKEYCTL_REVOKE                        = 0x3\n\tKEYCTL_SEARCH                        = 0xa\n\tKEYCTL_SESSION_TO_PARENT             = 0x12\n\tKEYCTL_SETPERM                       = 0x5\n\tKEYCTL_SET_REQKEY_KEYRING            = 0xe\n\tKEYCTL_SET_TIMEOUT                   = 0xf\n\tKEYCTL_UNLINK                        = 0x9\n\tKEYCTL_UPDATE                        = 0x2\n\tKEY_REQKEY_DEFL_DEFAULT              = 0x0\n\tKEY_REQKEY_DEFL_GROUP_KEYRING        = 0x6\n\tKEY_REQKEY_DEFL_NO_CHANGE            = -0x1\n\tKEY_REQKEY_DEFL_PROCESS_KEYRING      = 0x2\n\tKEY_REQKEY_DEFL_REQUESTOR_KEYRING    = 0x7\n\tKEY_REQKEY_DEFL_SESSION_KEYRING      = 0x3\n\tKEY_REQKEY_DEFL_THREAD_KEYRING       = 0x1\n\tKEY_REQKEY_DEFL_USER_KEYRING         = 0x4\n\tKEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5\n\tKEY_SPEC_GROUP_KEYRING               = -0x6\n\tKEY_SPEC_PROCESS_KEYRING             = -0x2\n\tKEY_SPEC_REQKEY_AUTH_KEY             = -0x7\n\tKEY_SPEC_REQUESTOR_KEYRING           = -0x8\n\tKEY_SPEC_SESSION_KEYRING             = -0x3\n\tKEY_SPEC_THREAD_KEYRING              = -0x1\n\tKEY_SPEC_USER_KEYRING                = -0x4\n\tKEY_SPEC_USER_SESSION_KEYRING        = -0x5\n\tLINUX_REBOOT_CMD_CAD_OFF             = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON              = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT                = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC               = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF           = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART             = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2            = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND          = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1                  = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2                  = 0x28121969\n\tLOCK_EX                              = 0x2\n\tLOCK_NB                              = 0x4\n\tLOCK_SH                              = 0x1\n\tLOCK_UN                              = 0x8\n\tMADV_DODUMP                          = 0x11\n\tMADV_DOFORK                          = 0xb\n\tMADV_DONTDUMP                        = 0x10\n\tMADV_DONTFORK                        = 0xa\n\tMADV_DONTNEED                        = 0x4\n\tMADV_FREE                            = 0x8\n\tMADV_HUGEPAGE                        = 0xe\n\tMADV_HWPOISON                        = 0x64\n\tMADV_MERGEABLE                       = 0xc\n\tMADV_NOHUGEPAGE                      = 0xf\n\tMADV_NORMAL                          = 0x0\n\tMADV_RANDOM                          = 0x1\n\tMADV_REMOVE                          = 0x9\n\tMADV_SEQUENTIAL                      = 0x2\n\tMADV_UNMERGEABLE                     = 0xd\n\tMADV_WILLNEED                        = 0x3\n\tMAP_ANON                             = 0x20\n\tMAP_ANONYMOUS                        = 0x20\n\tMAP_DENYWRITE                        = 0x800\n\tMAP_EXECUTABLE                       = 0x1000\n\tMAP_FILE                             = 0x0\n\tMAP_FIXED                            = 0x10\n\tMAP_GROWSDOWN                        = 0x100\n\tMAP_HUGETLB                          = 0x40000\n\tMAP_HUGE_MASK                        = 0x3f\n\tMAP_HUGE_SHIFT                       = 0x1a\n\tMAP_LOCKED                           = 0x2000\n\tMAP_NONBLOCK                         = 0x10000\n\tMAP_NORESERVE                        = 0x4000\n\tMAP_POPULATE                         = 0x8000\n\tMAP_PRIVATE                          = 0x2\n\tMAP_SHARED                           = 0x1\n\tMAP_STACK                            = 0x20000\n\tMAP_TYPE                             = 0xf\n\tMCL_CURRENT                          = 0x1\n\tMCL_FUTURE                           = 0x2\n\tMCL_ONFAULT                          = 0x4\n\tMNT_DETACH                           = 0x2\n\tMNT_EXPIRE                           = 0x4\n\tMNT_FORCE                            = 0x1\n\tMSG_BATCH                            = 0x40000\n\tMSG_CMSG_CLOEXEC                     = 0x40000000\n\tMSG_CONFIRM                          = 0x800\n\tMSG_CTRUNC                           = 0x8\n\tMSG_DONTROUTE                        = 0x4\n\tMSG_DONTWAIT                         = 0x40\n\tMSG_EOR                              = 0x80\n\tMSG_ERRQUEUE                         = 0x2000\n\tMSG_FASTOPEN                         = 0x20000000\n\tMSG_FIN                              = 0x200\n\tMSG_MORE                             = 0x8000\n\tMSG_NOSIGNAL                         = 0x4000\n\tMSG_OOB                              = 0x1\n\tMSG_PEEK                             = 0x2\n\tMSG_PROXY                            = 0x10\n\tMSG_RST                              = 0x1000\n\tMSG_SYN                              = 0x400\n\tMSG_TRUNC                            = 0x20\n\tMSG_TRYHARD                          = 0x4\n\tMSG_WAITALL                          = 0x100\n\tMSG_WAITFORONE                       = 0x10000\n\tMS_ACTIVE                            = 0x40000000\n\tMS_ASYNC                             = 0x1\n\tMS_BIND                              = 0x1000\n\tMS_BORN                              = 0x20000000\n\tMS_DIRSYNC                           = 0x80\n\tMS_INVALIDATE                        = 0x2\n\tMS_I_VERSION                         = 0x800000\n\tMS_KERNMOUNT                         = 0x400000\n\tMS_LAZYTIME                          = 0x2000000\n\tMS_MANDLOCK                          = 0x40\n\tMS_MGC_MSK                           = 0xffff0000\n\tMS_MGC_VAL                           = 0xc0ed0000\n\tMS_MOVE                              = 0x2000\n\tMS_NOATIME                           = 0x400\n\tMS_NODEV                             = 0x4\n\tMS_NODIRATIME                        = 0x800\n\tMS_NOEXEC                            = 0x8\n\tMS_NOREMOTELOCK                      = 0x8000000\n\tMS_NOSEC                             = 0x10000000\n\tMS_NOSUID                            = 0x2\n\tMS_NOUSER                            = -0x80000000\n\tMS_POSIXACL                          = 0x10000\n\tMS_PRIVATE                           = 0x40000\n\tMS_RDONLY                            = 0x1\n\tMS_REC                               = 0x4000\n\tMS_RELATIME                          = 0x200000\n\tMS_REMOUNT                           = 0x20\n\tMS_RMT_MASK                          = 0x2800051\n\tMS_SHARED                            = 0x100000\n\tMS_SILENT                            = 0x8000\n\tMS_SLAVE                             = 0x80000\n\tMS_STRICTATIME                       = 0x1000000\n\tMS_SUBMOUNT                          = 0x4000000\n\tMS_SYNC                              = 0x4\n\tMS_SYNCHRONOUS                       = 0x10\n\tMS_UNBINDABLE                        = 0x20000\n\tMS_VERBOSE                           = 0x8000\n\tNAME_MAX                             = 0xff\n\tNETLINK_ADD_MEMBERSHIP               = 0x1\n\tNETLINK_AUDIT                        = 0x9\n\tNETLINK_BROADCAST_ERROR              = 0x4\n\tNETLINK_CAP_ACK                      = 0xa\n\tNETLINK_CONNECTOR                    = 0xb\n\tNETLINK_CRYPTO                       = 0x15\n\tNETLINK_DNRTMSG                      = 0xe\n\tNETLINK_DROP_MEMBERSHIP              = 0x2\n\tNETLINK_ECRYPTFS                     = 0x13\n\tNETLINK_EXT_ACK                      = 0xb\n\tNETLINK_FIB_LOOKUP                   = 0xa\n\tNETLINK_FIREWALL                     = 0x3\n\tNETLINK_GENERIC                      = 0x10\n\tNETLINK_INET_DIAG                    = 0x4\n\tNETLINK_IP6_FW                       = 0xd\n\tNETLINK_ISCSI                        = 0x8\n\tNETLINK_KOBJECT_UEVENT               = 0xf\n\tNETLINK_LISTEN_ALL_NSID              = 0x8\n\tNETLINK_LIST_MEMBERSHIPS             = 0x9\n\tNETLINK_NETFILTER                    = 0xc\n\tNETLINK_NFLOG                        = 0x5\n\tNETLINK_NO_ENOBUFS                   = 0x5\n\tNETLINK_PKTINFO                      = 0x3\n\tNETLINK_RDMA                         = 0x14\n\tNETLINK_ROUTE                        = 0x0\n\tNETLINK_RX_RING                      = 0x6\n\tNETLINK_SCSITRANSPORT                = 0x12\n\tNETLINK_SELINUX                      = 0x7\n\tNETLINK_SMC                          = 0x16\n\tNETLINK_SOCK_DIAG                    = 0x4\n\tNETLINK_TX_RING                      = 0x7\n\tNETLINK_UNUSED                       = 0x1\n\tNETLINK_USERSOCK                     = 0x2\n\tNETLINK_XFRM                         = 0x6\n\tNL0                                  = 0x0\n\tNL1                                  = 0x100\n\tNLA_ALIGNTO                          = 0x4\n\tNLA_F_NESTED                         = 0x8000\n\tNLA_F_NET_BYTEORDER                  = 0x4000\n\tNLA_HDRLEN                           = 0x4\n\tNLDLY                                = 0x100\n\tNLMSG_ALIGNTO                        = 0x4\n\tNLMSG_DONE                           = 0x3\n\tNLMSG_ERROR                          = 0x2\n\tNLMSG_HDRLEN                         = 0x10\n\tNLMSG_MIN_TYPE                       = 0x10\n\tNLMSG_NOOP                           = 0x1\n\tNLMSG_OVERRUN                        = 0x4\n\tNLM_F_ACK                            = 0x4\n\tNLM_F_ACK_TLVS                       = 0x200\n\tNLM_F_APPEND                         = 0x800\n\tNLM_F_ATOMIC                         = 0x400\n\tNLM_F_CAPPED                         = 0x100\n\tNLM_F_CREATE                         = 0x400\n\tNLM_F_DUMP                           = 0x300\n\tNLM_F_DUMP_FILTERED                  = 0x20\n\tNLM_F_DUMP_INTR                      = 0x10\n\tNLM_F_ECHO                           = 0x8\n\tNLM_F_EXCL                           = 0x200\n\tNLM_F_MATCH                          = 0x200\n\tNLM_F_MULTI                          = 0x2\n\tNLM_F_REPLACE                        = 0x100\n\tNLM_F_REQUEST                        = 0x1\n\tNLM_F_ROOT                           = 0x100\n\tNOFLSH                               = 0x80\n\tOCRNL                                = 0x8\n\tOFDEL                                = 0x80\n\tOFILL                                = 0x40\n\tOLCUC                                = 0x2\n\tONLCR                                = 0x4\n\tONLRET                               = 0x20\n\tONOCR                                = 0x10\n\tOPOST                                = 0x1\n\tO_ACCMODE                            = 0x3\n\tO_APPEND                             = 0x400\n\tO_ASYNC                              = 0x2000\n\tO_CLOEXEC                            = 0x80000\n\tO_CREAT                              = 0x40\n\tO_DIRECT                             = 0x4000\n\tO_DIRECTORY                          = 0x10000\n\tO_DSYNC                              = 0x1000\n\tO_EXCL                               = 0x80\n\tO_FSYNC                              = 0x101000\n\tO_LARGEFILE                          = 0x0\n\tO_NDELAY                             = 0x800\n\tO_NOATIME                            = 0x40000\n\tO_NOCTTY                             = 0x100\n\tO_NOFOLLOW                           = 0x20000\n\tO_NONBLOCK                           = 0x800\n\tO_PATH                               = 0x200000\n\tO_RDONLY                             = 0x0\n\tO_RDWR                               = 0x2\n\tO_RSYNC                              = 0x101000\n\tO_SYNC                               = 0x101000\n\tO_TMPFILE                            = 0x410000\n\tO_TRUNC                              = 0x200\n\tO_WRONLY                             = 0x1\n\tPACKET_ADD_MEMBERSHIP                = 0x1\n\tPACKET_AUXDATA                       = 0x8\n\tPACKET_BROADCAST                     = 0x1\n\tPACKET_COPY_THRESH                   = 0x7\n\tPACKET_DROP_MEMBERSHIP               = 0x2\n\tPACKET_FANOUT                        = 0x12\n\tPACKET_FANOUT_CBPF                   = 0x6\n\tPACKET_FANOUT_CPU                    = 0x2\n\tPACKET_FANOUT_DATA                   = 0x16\n\tPACKET_FANOUT_EBPF                   = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG            = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER          = 0x1000\n\tPACKET_FANOUT_FLAG_UNIQUEID          = 0x2000\n\tPACKET_FANOUT_HASH                   = 0x0\n\tPACKET_FANOUT_LB                     = 0x1\n\tPACKET_FANOUT_QM                     = 0x5\n\tPACKET_FANOUT_RND                    = 0x4\n\tPACKET_FANOUT_ROLLOVER               = 0x3\n\tPACKET_FASTROUTE                     = 0x6\n\tPACKET_HDRLEN                        = 0xb\n\tPACKET_HOST                          = 0x0\n\tPACKET_KERNEL                        = 0x7\n\tPACKET_LOOPBACK                      = 0x5\n\tPACKET_LOSS                          = 0xe\n\tPACKET_MR_ALLMULTI                   = 0x2\n\tPACKET_MR_MULTICAST                  = 0x0\n\tPACKET_MR_PROMISC                    = 0x1\n\tPACKET_MR_UNICAST                    = 0x3\n\tPACKET_MULTICAST                     = 0x2\n\tPACKET_ORIGDEV                       = 0x9\n\tPACKET_OTHERHOST                     = 0x3\n\tPACKET_OUTGOING                      = 0x4\n\tPACKET_QDISC_BYPASS                  = 0x14\n\tPACKET_RECV_OUTPUT                   = 0x3\n\tPACKET_RESERVE                       = 0xc\n\tPACKET_ROLLOVER_STATS                = 0x15\n\tPACKET_RX_RING                       = 0x5\n\tPACKET_STATISTICS                    = 0x6\n\tPACKET_TIMESTAMP                     = 0x11\n\tPACKET_TX_HAS_OFF                    = 0x13\n\tPACKET_TX_RING                       = 0xd\n\tPACKET_TX_TIMESTAMP                  = 0x10\n\tPACKET_USER                          = 0x6\n\tPACKET_VERSION                       = 0xa\n\tPACKET_VNET_HDR                      = 0xf\n\tPARENB                               = 0x100\n\tPARITY_CRC16_PR0                     = 0x2\n\tPARITY_CRC16_PR0_CCITT               = 0x4\n\tPARITY_CRC16_PR1                     = 0x3\n\tPARITY_CRC16_PR1_CCITT               = 0x5\n\tPARITY_CRC32_PR0_CCITT               = 0x6\n\tPARITY_CRC32_PR1_CCITT               = 0x7\n\tPARITY_DEFAULT                       = 0x0\n\tPARITY_NONE                          = 0x1\n\tPARMRK                               = 0x8\n\tPARODD                               = 0x200\n\tPENDIN                               = 0x4000\n\tPERF_EVENT_IOC_DISABLE               = 0x2401\n\tPERF_EVENT_IOC_ENABLE                = 0x2400\n\tPERF_EVENT_IOC_ID                    = 0x80082407\n\tPERF_EVENT_IOC_PAUSE_OUTPUT          = 0x40042409\n\tPERF_EVENT_IOC_PERIOD                = 0x40082404\n\tPERF_EVENT_IOC_REFRESH               = 0x2402\n\tPERF_EVENT_IOC_RESET                 = 0x2403\n\tPERF_EVENT_IOC_SET_BPF               = 0x40042408\n\tPERF_EVENT_IOC_SET_FILTER            = 0x40082406\n\tPERF_EVENT_IOC_SET_OUTPUT            = 0x2405\n\tPRIO_PGRP                            = 0x1\n\tPRIO_PROCESS                         = 0x0\n\tPRIO_USER                            = 0x2\n\tPROT_EXEC                            = 0x4\n\tPROT_GROWSDOWN                       = 0x1000000\n\tPROT_GROWSUP                         = 0x2000000\n\tPROT_NONE                            = 0x0\n\tPROT_READ                            = 0x1\n\tPROT_WRITE                           = 0x2\n\tPR_CAPBSET_DROP                      = 0x18\n\tPR_CAPBSET_READ                      = 0x17\n\tPR_CAP_AMBIENT                       = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL             = 0x4\n\tPR_CAP_AMBIENT_IS_SET                = 0x1\n\tPR_CAP_AMBIENT_LOWER                 = 0x3\n\tPR_CAP_AMBIENT_RAISE                 = 0x2\n\tPR_ENDIAN_BIG                        = 0x0\n\tPR_ENDIAN_LITTLE                     = 0x1\n\tPR_ENDIAN_PPC_LITTLE                 = 0x2\n\tPR_FPEMU_NOPRINT                     = 0x1\n\tPR_FPEMU_SIGFPE                      = 0x2\n\tPR_FP_EXC_ASYNC                      = 0x2\n\tPR_FP_EXC_DISABLED                   = 0x0\n\tPR_FP_EXC_DIV                        = 0x10000\n\tPR_FP_EXC_INV                        = 0x100000\n\tPR_FP_EXC_NONRECOV                   = 0x1\n\tPR_FP_EXC_OVF                        = 0x20000\n\tPR_FP_EXC_PRECISE                    = 0x3\n\tPR_FP_EXC_RES                        = 0x80000\n\tPR_FP_EXC_SW_ENABLE                  = 0x80\n\tPR_FP_EXC_UND                        = 0x40000\n\tPR_FP_MODE_FR                        = 0x1\n\tPR_FP_MODE_FRE                       = 0x2\n\tPR_GET_CHILD_SUBREAPER               = 0x25\n\tPR_GET_DUMPABLE                      = 0x3\n\tPR_GET_ENDIAN                        = 0x13\n\tPR_GET_FPEMU                         = 0x9\n\tPR_GET_FPEXC                         = 0xb\n\tPR_GET_FP_MODE                       = 0x2e\n\tPR_GET_KEEPCAPS                      = 0x7\n\tPR_GET_NAME                          = 0x10\n\tPR_GET_NO_NEW_PRIVS                  = 0x27\n\tPR_GET_PDEATHSIG                     = 0x2\n\tPR_GET_SECCOMP                       = 0x15\n\tPR_GET_SECUREBITS                    = 0x1b\n\tPR_GET_THP_DISABLE                   = 0x2a\n\tPR_GET_TID_ADDRESS                   = 0x28\n\tPR_GET_TIMERSLACK                    = 0x1e\n\tPR_GET_TIMING                        = 0xd\n\tPR_GET_TSC                           = 0x19\n\tPR_GET_UNALIGN                       = 0x5\n\tPR_MCE_KILL                          = 0x21\n\tPR_MCE_KILL_CLEAR                    = 0x0\n\tPR_MCE_KILL_DEFAULT                  = 0x2\n\tPR_MCE_KILL_EARLY                    = 0x1\n\tPR_MCE_KILL_GET                      = 0x22\n\tPR_MCE_KILL_LATE                     = 0x0\n\tPR_MCE_KILL_SET                      = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT            = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT             = 0x2b\n\tPR_SET_CHILD_SUBREAPER               = 0x24\n\tPR_SET_DUMPABLE                      = 0x4\n\tPR_SET_ENDIAN                        = 0x14\n\tPR_SET_FPEMU                         = 0xa\n\tPR_SET_FPEXC                         = 0xc\n\tPR_SET_FP_MODE                       = 0x2d\n\tPR_SET_KEEPCAPS                      = 0x8\n\tPR_SET_MM                            = 0x23\n\tPR_SET_MM_ARG_END                    = 0x9\n\tPR_SET_MM_ARG_START                  = 0x8\n\tPR_SET_MM_AUXV                       = 0xc\n\tPR_SET_MM_BRK                        = 0x7\n\tPR_SET_MM_END_CODE                   = 0x2\n\tPR_SET_MM_END_DATA                   = 0x4\n\tPR_SET_MM_ENV_END                    = 0xb\n\tPR_SET_MM_ENV_START                  = 0xa\n\tPR_SET_MM_EXE_FILE                   = 0xd\n\tPR_SET_MM_MAP                        = 0xe\n\tPR_SET_MM_MAP_SIZE                   = 0xf\n\tPR_SET_MM_START_BRK                  = 0x6\n\tPR_SET_MM_START_CODE                 = 0x1\n\tPR_SET_MM_START_DATA                 = 0x3\n\tPR_SET_MM_START_STACK                = 0x5\n\tPR_SET_NAME                          = 0xf\n\tPR_SET_NO_NEW_PRIVS                  = 0x26\n\tPR_SET_PDEATHSIG                     = 0x1\n\tPR_SET_PTRACER                       = 0x59616d61\n\tPR_SET_PTRACER_ANY                   = 0xffffffffffffffff\n\tPR_SET_SECCOMP                       = 0x16\n\tPR_SET_SECUREBITS                    = 0x1c\n\tPR_SET_THP_DISABLE                   = 0x29\n\tPR_SET_TIMERSLACK                    = 0x1d\n\tPR_SET_TIMING                        = 0xe\n\tPR_SET_TSC                           = 0x1a\n\tPR_SET_UNALIGN                       = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE          = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE           = 0x20\n\tPR_TIMING_STATISTICAL                = 0x0\n\tPR_TIMING_TIMESTAMP                  = 0x1\n\tPR_TSC_ENABLE                        = 0x1\n\tPR_TSC_SIGSEGV                       = 0x2\n\tPR_UNALIGN_NOPRINT                   = 0x1\n\tPR_UNALIGN_SIGBUS                    = 0x2\n\tPTRACE_ATTACH                        = 0x10\n\tPTRACE_CONT                          = 0x7\n\tPTRACE_DETACH                        = 0x11\n\tPTRACE_DISABLE_TE                    = 0x5010\n\tPTRACE_ENABLE_TE                     = 0x5009\n\tPTRACE_EVENT_CLONE                   = 0x3\n\tPTRACE_EVENT_EXEC                    = 0x4\n\tPTRACE_EVENT_EXIT                    = 0x6\n\tPTRACE_EVENT_FORK                    = 0x1\n\tPTRACE_EVENT_SECCOMP                 = 0x7\n\tPTRACE_EVENT_STOP                    = 0x80\n\tPTRACE_EVENT_VFORK                   = 0x2\n\tPTRACE_EVENT_VFORK_DONE              = 0x5\n\tPTRACE_GETEVENTMSG                   = 0x4201\n\tPTRACE_GETREGS                       = 0xc\n\tPTRACE_GETREGSET                     = 0x4204\n\tPTRACE_GETSIGINFO                    = 0x4202\n\tPTRACE_GETSIGMASK                    = 0x420a\n\tPTRACE_GET_LAST_BREAK                = 0x5006\n\tPTRACE_INTERRUPT                     = 0x4207\n\tPTRACE_KILL                          = 0x8\n\tPTRACE_LISTEN                        = 0x4208\n\tPTRACE_OLDSETOPTIONS                 = 0x15\n\tPTRACE_O_EXITKILL                    = 0x100000\n\tPTRACE_O_MASK                        = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP             = 0x200000\n\tPTRACE_O_TRACECLONE                  = 0x8\n\tPTRACE_O_TRACEEXEC                   = 0x10\n\tPTRACE_O_TRACEEXIT                   = 0x40\n\tPTRACE_O_TRACEFORK                   = 0x2\n\tPTRACE_O_TRACESECCOMP                = 0x80\n\tPTRACE_O_TRACESYSGOOD                = 0x1\n\tPTRACE_O_TRACEVFORK                  = 0x4\n\tPTRACE_O_TRACEVFORKDONE              = 0x20\n\tPTRACE_PEEKDATA                      = 0x2\n\tPTRACE_PEEKDATA_AREA                 = 0x5003\n\tPTRACE_PEEKSIGINFO                   = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED            = 0x1\n\tPTRACE_PEEKTEXT                      = 0x1\n\tPTRACE_PEEKTEXT_AREA                 = 0x5002\n\tPTRACE_PEEKUSR                       = 0x3\n\tPTRACE_PEEKUSR_AREA                  = 0x5000\n\tPTRACE_PEEK_SYSTEM_CALL              = 0x5007\n\tPTRACE_POKEDATA                      = 0x5\n\tPTRACE_POKEDATA_AREA                 = 0x5005\n\tPTRACE_POKETEXT                      = 0x4\n\tPTRACE_POKETEXT_AREA                 = 0x5004\n\tPTRACE_POKEUSR                       = 0x6\n\tPTRACE_POKEUSR_AREA                  = 0x5001\n\tPTRACE_POKE_SYSTEM_CALL              = 0x5008\n\tPTRACE_PROT                          = 0x15\n\tPTRACE_SECCOMP_GET_FILTER            = 0x420c\n\tPTRACE_SEIZE                         = 0x4206\n\tPTRACE_SETOPTIONS                    = 0x4200\n\tPTRACE_SETREGS                       = 0xd\n\tPTRACE_SETREGSET                     = 0x4205\n\tPTRACE_SETSIGINFO                    = 0x4203\n\tPTRACE_SETSIGMASK                    = 0x420b\n\tPTRACE_SINGLEBLOCK                   = 0xc\n\tPTRACE_SINGLESTEP                    = 0x9\n\tPTRACE_SYSCALL                       = 0x18\n\tPTRACE_TE_ABORT_RAND                 = 0x5011\n\tPTRACE_TRACEME                       = 0x0\n\tPT_ACR0                              = 0x90\n\tPT_ACR1                              = 0x94\n\tPT_ACR10                             = 0xb8\n\tPT_ACR11                             = 0xbc\n\tPT_ACR12                             = 0xc0\n\tPT_ACR13                             = 0xc4\n\tPT_ACR14                             = 0xc8\n\tPT_ACR15                             = 0xcc\n\tPT_ACR2                              = 0x98\n\tPT_ACR3                              = 0x9c\n\tPT_ACR4                              = 0xa0\n\tPT_ACR5                              = 0xa4\n\tPT_ACR6                              = 0xa8\n\tPT_ACR7                              = 0xac\n\tPT_ACR8                              = 0xb0\n\tPT_ACR9                              = 0xb4\n\tPT_CR_10                             = 0x168\n\tPT_CR_11                             = 0x170\n\tPT_CR_9                              = 0x160\n\tPT_ENDREGS                           = 0x1af\n\tPT_FPC                               = 0xd8\n\tPT_FPR0                              = 0xe0\n\tPT_FPR1                              = 0xe8\n\tPT_FPR10                             = 0x130\n\tPT_FPR11                             = 0x138\n\tPT_FPR12                             = 0x140\n\tPT_FPR13                             = 0x148\n\tPT_FPR14                             = 0x150\n\tPT_FPR15                             = 0x158\n\tPT_FPR2                              = 0xf0\n\tPT_FPR3                              = 0xf8\n\tPT_FPR4                              = 0x100\n\tPT_FPR5                              = 0x108\n\tPT_FPR6                              = 0x110\n\tPT_FPR7                              = 0x118\n\tPT_FPR8                              = 0x120\n\tPT_FPR9                              = 0x128\n\tPT_GPR0                              = 0x10\n\tPT_GPR1                              = 0x18\n\tPT_GPR10                             = 0x60\n\tPT_GPR11                             = 0x68\n\tPT_GPR12                             = 0x70\n\tPT_GPR13                             = 0x78\n\tPT_GPR14                             = 0x80\n\tPT_GPR15                             = 0x88\n\tPT_GPR2                              = 0x20\n\tPT_GPR3                              = 0x28\n\tPT_GPR4                              = 0x30\n\tPT_GPR5                              = 0x38\n\tPT_GPR6                              = 0x40\n\tPT_GPR7                              = 0x48\n\tPT_GPR8                              = 0x50\n\tPT_GPR9                              = 0x58\n\tPT_IEEE_IP                           = 0x1a8\n\tPT_LASTOFF                           = 0x1a8\n\tPT_ORIGGPR2                          = 0xd0\n\tPT_PSWADDR                           = 0x8\n\tPT_PSWMASK                           = 0x0\n\tRLIMIT_AS                            = 0x9\n\tRLIMIT_CORE                          = 0x4\n\tRLIMIT_CPU                           = 0x0\n\tRLIMIT_DATA                          = 0x2\n\tRLIMIT_FSIZE                         = 0x1\n\tRLIMIT_LOCKS                         = 0xa\n\tRLIMIT_MEMLOCK                       = 0x8\n\tRLIMIT_MSGQUEUE                      = 0xc\n\tRLIMIT_NICE                          = 0xd\n\tRLIMIT_NOFILE                        = 0x7\n\tRLIMIT_NPROC                         = 0x6\n\tRLIMIT_RSS                           = 0x5\n\tRLIMIT_RTPRIO                        = 0xe\n\tRLIMIT_RTTIME                        = 0xf\n\tRLIMIT_SIGPENDING                    = 0xb\n\tRLIMIT_STACK                         = 0x3\n\tRLIM_INFINITY                        = 0xffffffffffffffff\n\tRTAX_ADVMSS                          = 0x8\n\tRTAX_CC_ALGO                         = 0x10\n\tRTAX_CWND                            = 0x7\n\tRTAX_FEATURES                        = 0xc\n\tRTAX_FEATURE_ALLFRAG                 = 0x8\n\tRTAX_FEATURE_ECN                     = 0x1\n\tRTAX_FEATURE_MASK                    = 0xf\n\tRTAX_FEATURE_SACK                    = 0x2\n\tRTAX_FEATURE_TIMESTAMP               = 0x4\n\tRTAX_HOPLIMIT                        = 0xa\n\tRTAX_INITCWND                        = 0xb\n\tRTAX_INITRWND                        = 0xe\n\tRTAX_LOCK                            = 0x1\n\tRTAX_MAX                             = 0x10\n\tRTAX_MTU                             = 0x2\n\tRTAX_QUICKACK                        = 0xf\n\tRTAX_REORDERING                      = 0x9\n\tRTAX_RTO_MIN                         = 0xd\n\tRTAX_RTT                             = 0x4\n\tRTAX_RTTVAR                          = 0x5\n\tRTAX_SSTHRESH                        = 0x6\n\tRTAX_UNSPEC                          = 0x0\n\tRTAX_WINDOW                          = 0x3\n\tRTA_ALIGNTO                          = 0x4\n\tRTA_MAX                              = 0x1a\n\tRTCF_DIRECTSRC                       = 0x4000000\n\tRTCF_DOREDIRECT                      = 0x1000000\n\tRTCF_LOG                             = 0x2000000\n\tRTCF_MASQ                            = 0x400000\n\tRTCF_NAT                             = 0x800000\n\tRTCF_VALVE                           = 0x200000\n\tRTF_ADDRCLASSMASK                    = 0xf8000000\n\tRTF_ADDRCONF                         = 0x40000\n\tRTF_ALLONLINK                        = 0x20000\n\tRTF_BROADCAST                        = 0x10000000\n\tRTF_CACHE                            = 0x1000000\n\tRTF_DEFAULT                          = 0x10000\n\tRTF_DYNAMIC                          = 0x10\n\tRTF_FLOW                             = 0x2000000\n\tRTF_GATEWAY                          = 0x2\n\tRTF_HOST                             = 0x4\n\tRTF_INTERFACE                        = 0x40000000\n\tRTF_IRTT                             = 0x100\n\tRTF_LINKRT                           = 0x100000\n\tRTF_LOCAL                            = 0x80000000\n\tRTF_MODIFIED                         = 0x20\n\tRTF_MSS                              = 0x40\n\tRTF_MTU                              = 0x40\n\tRTF_MULTICAST                        = 0x20000000\n\tRTF_NAT                              = 0x8000000\n\tRTF_NOFORWARD                        = 0x1000\n\tRTF_NONEXTHOP                        = 0x200000\n\tRTF_NOPMTUDISC                       = 0x4000\n\tRTF_POLICY                           = 0x4000000\n\tRTF_REINSTATE                        = 0x8\n\tRTF_REJECT                           = 0x200\n\tRTF_STATIC                           = 0x400\n\tRTF_THROW                            = 0x2000\n\tRTF_UP                               = 0x1\n\tRTF_WINDOW                           = 0x80\n\tRTF_XRESOLVE                         = 0x800\n\tRTM_BASE                             = 0x10\n\tRTM_DELACTION                        = 0x31\n\tRTM_DELADDR                          = 0x15\n\tRTM_DELADDRLABEL                     = 0x49\n\tRTM_DELLINK                          = 0x11\n\tRTM_DELMDB                           = 0x55\n\tRTM_DELNEIGH                         = 0x1d\n\tRTM_DELNETCONF                       = 0x51\n\tRTM_DELNSID                          = 0x59\n\tRTM_DELQDISC                         = 0x25\n\tRTM_DELROUTE                         = 0x19\n\tRTM_DELRULE                          = 0x21\n\tRTM_DELTCLASS                        = 0x29\n\tRTM_DELTFILTER                       = 0x2d\n\tRTM_F_CLONED                         = 0x200\n\tRTM_F_EQUALIZE                       = 0x400\n\tRTM_F_FIB_MATCH                      = 0x2000\n\tRTM_F_LOOKUP_TABLE                   = 0x1000\n\tRTM_F_NOTIFY                         = 0x100\n\tRTM_F_PREFIX                         = 0x800\n\tRTM_GETACTION                        = 0x32\n\tRTM_GETADDR                          = 0x16\n\tRTM_GETADDRLABEL                     = 0x4a\n\tRTM_GETANYCAST                       = 0x3e\n\tRTM_GETDCB                           = 0x4e\n\tRTM_GETLINK                          = 0x12\n\tRTM_GETMDB                           = 0x56\n\tRTM_GETMULTICAST                     = 0x3a\n\tRTM_GETNEIGH                         = 0x1e\n\tRTM_GETNEIGHTBL                      = 0x42\n\tRTM_GETNETCONF                       = 0x52\n\tRTM_GETNSID                          = 0x5a\n\tRTM_GETQDISC                         = 0x26\n\tRTM_GETROUTE                         = 0x1a\n\tRTM_GETRULE                          = 0x22\n\tRTM_GETSTATS                         = 0x5e\n\tRTM_GETTCLASS                        = 0x2a\n\tRTM_GETTFILTER                       = 0x2e\n\tRTM_MAX                              = 0x63\n\tRTM_NEWACTION                        = 0x30\n\tRTM_NEWADDR                          = 0x14\n\tRTM_NEWADDRLABEL                     = 0x48\n\tRTM_NEWCACHEREPORT                   = 0x60\n\tRTM_NEWLINK                          = 0x10\n\tRTM_NEWMDB                           = 0x54\n\tRTM_NEWNDUSEROPT                     = 0x44\n\tRTM_NEWNEIGH                         = 0x1c\n\tRTM_NEWNEIGHTBL                      = 0x40\n\tRTM_NEWNETCONF                       = 0x50\n\tRTM_NEWNSID                          = 0x58\n\tRTM_NEWPREFIX                        = 0x34\n\tRTM_NEWQDISC                         = 0x24\n\tRTM_NEWROUTE                         = 0x18\n\tRTM_NEWRULE                          = 0x20\n\tRTM_NEWSTATS                         = 0x5c\n\tRTM_NEWTCLASS                        = 0x28\n\tRTM_NEWTFILTER                       = 0x2c\n\tRTM_NR_FAMILIES                      = 0x15\n\tRTM_NR_MSGTYPES                      = 0x54\n\tRTM_SETDCB                           = 0x4f\n\tRTM_SETLINK                          = 0x13\n\tRTM_SETNEIGHTBL                      = 0x43\n\tRTNH_ALIGNTO                         = 0x4\n\tRTNH_COMPARE_MASK                    = 0x19\n\tRTNH_F_DEAD                          = 0x1\n\tRTNH_F_LINKDOWN                      = 0x10\n\tRTNH_F_OFFLOAD                       = 0x8\n\tRTNH_F_ONLINK                        = 0x4\n\tRTNH_F_PERVASIVE                     = 0x2\n\tRTNH_F_UNRESOLVED                    = 0x20\n\tRTN_MAX                              = 0xb\n\tRTPROT_BABEL                         = 0x2a\n\tRTPROT_BIRD                          = 0xc\n\tRTPROT_BOOT                          = 0x3\n\tRTPROT_DHCP                          = 0x10\n\tRTPROT_DNROUTED                      = 0xd\n\tRTPROT_GATED                         = 0x8\n\tRTPROT_KERNEL                        = 0x2\n\tRTPROT_MROUTED                       = 0x11\n\tRTPROT_MRT                           = 0xa\n\tRTPROT_NTK                           = 0xf\n\tRTPROT_RA                            = 0x9\n\tRTPROT_REDIRECT                      = 0x1\n\tRTPROT_STATIC                        = 0x4\n\tRTPROT_UNSPEC                        = 0x0\n\tRTPROT_XORP                          = 0xe\n\tRTPROT_ZEBRA                         = 0xb\n\tRT_CLASS_DEFAULT                     = 0xfd\n\tRT_CLASS_LOCAL                       = 0xff\n\tRT_CLASS_MAIN                        = 0xfe\n\tRT_CLASS_MAX                         = 0xff\n\tRT_CLASS_UNSPEC                      = 0x0\n\tRUSAGE_CHILDREN                      = -0x1\n\tRUSAGE_SELF                          = 0x0\n\tRUSAGE_THREAD                        = 0x1\n\tSCM_CREDENTIALS                      = 0x2\n\tSCM_RIGHTS                           = 0x1\n\tSCM_TIMESTAMP                        = 0x1d\n\tSCM_TIMESTAMPING                     = 0x25\n\tSCM_TIMESTAMPING_OPT_STATS           = 0x36\n\tSCM_TIMESTAMPING_PKTINFO             = 0x3a\n\tSCM_TIMESTAMPNS                      = 0x23\n\tSCM_WIFI_STATUS                      = 0x29\n\tSECCOMP_MODE_DISABLED                = 0x0\n\tSECCOMP_MODE_FILTER                  = 0x2\n\tSECCOMP_MODE_STRICT                  = 0x1\n\tSHUT_RD                              = 0x0\n\tSHUT_RDWR                            = 0x2\n\tSHUT_WR                              = 0x1\n\tSIOCADDDLCI                          = 0x8980\n\tSIOCADDMULTI                         = 0x8931\n\tSIOCADDRT                            = 0x890b\n\tSIOCATMARK                           = 0x8905\n\tSIOCBONDCHANGEACTIVE                 = 0x8995\n\tSIOCBONDENSLAVE                      = 0x8990\n\tSIOCBONDINFOQUERY                    = 0x8994\n\tSIOCBONDRELEASE                      = 0x8991\n\tSIOCBONDSETHWADDR                    = 0x8992\n\tSIOCBONDSLAVEINFOQUERY               = 0x8993\n\tSIOCBRADDBR                          = 0x89a0\n\tSIOCBRADDIF                          = 0x89a2\n\tSIOCBRDELBR                          = 0x89a1\n\tSIOCBRDELIF                          = 0x89a3\n\tSIOCDARP                             = 0x8953\n\tSIOCDELDLCI                          = 0x8981\n\tSIOCDELMULTI                         = 0x8932\n\tSIOCDELRT                            = 0x890c\n\tSIOCDEVPRIVATE                       = 0x89f0\n\tSIOCDIFADDR                          = 0x8936\n\tSIOCDRARP                            = 0x8960\n\tSIOCETHTOOL                          = 0x8946\n\tSIOCGARP                             = 0x8954\n\tSIOCGHWTSTAMP                        = 0x89b1\n\tSIOCGIFADDR                          = 0x8915\n\tSIOCGIFBR                            = 0x8940\n\tSIOCGIFBRDADDR                       = 0x8919\n\tSIOCGIFCONF                          = 0x8912\n\tSIOCGIFCOUNT                         = 0x8938\n\tSIOCGIFDSTADDR                       = 0x8917\n\tSIOCGIFENCAP                         = 0x8925\n\tSIOCGIFFLAGS                         = 0x8913\n\tSIOCGIFHWADDR                        = 0x8927\n\tSIOCGIFINDEX                         = 0x8933\n\tSIOCGIFMAP                           = 0x8970\n\tSIOCGIFMEM                           = 0x891f\n\tSIOCGIFMETRIC                        = 0x891d\n\tSIOCGIFMTU                           = 0x8921\n\tSIOCGIFNAME                          = 0x8910\n\tSIOCGIFNETMASK                       = 0x891b\n\tSIOCGIFPFLAGS                        = 0x8935\n\tSIOCGIFSLAVE                         = 0x8929\n\tSIOCGIFTXQLEN                        = 0x8942\n\tSIOCGIFVLAN                          = 0x8982\n\tSIOCGMIIPHY                          = 0x8947\n\tSIOCGMIIREG                          = 0x8948\n\tSIOCGPGRP                            = 0x8904\n\tSIOCGRARP                            = 0x8961\n\tSIOCGSKNS                            = 0x894c\n\tSIOCGSTAMP                           = 0x8906\n\tSIOCGSTAMPNS                         = 0x8907\n\tSIOCINQ                              = 0x541b\n\tSIOCOUTQ                             = 0x5411\n\tSIOCOUTQNSD                          = 0x894b\n\tSIOCPROTOPRIVATE                     = 0x89e0\n\tSIOCRTMSG                            = 0x890d\n\tSIOCSARP                             = 0x8955\n\tSIOCSHWTSTAMP                        = 0x89b0\n\tSIOCSIFADDR                          = 0x8916\n\tSIOCSIFBR                            = 0x8941\n\tSIOCSIFBRDADDR                       = 0x891a\n\tSIOCSIFDSTADDR                       = 0x8918\n\tSIOCSIFENCAP                         = 0x8926\n\tSIOCSIFFLAGS                         = 0x8914\n\tSIOCSIFHWADDR                        = 0x8924\n\tSIOCSIFHWBROADCAST                   = 0x8937\n\tSIOCSIFLINK                          = 0x8911\n\tSIOCSIFMAP                           = 0x8971\n\tSIOCSIFMEM                           = 0x8920\n\tSIOCSIFMETRIC                        = 0x891e\n\tSIOCSIFMTU                           = 0x8922\n\tSIOCSIFNAME                          = 0x8923\n\tSIOCSIFNETMASK                       = 0x891c\n\tSIOCSIFPFLAGS                        = 0x8934\n\tSIOCSIFSLAVE                         = 0x8930\n\tSIOCSIFTXQLEN                        = 0x8943\n\tSIOCSIFVLAN                          = 0x8983\n\tSIOCSMIIREG                          = 0x8949\n\tSIOCSPGRP                            = 0x8902\n\tSIOCSRARP                            = 0x8962\n\tSIOCWANDEV                           = 0x894a\n\tSOCK_CLOEXEC                         = 0x80000\n\tSOCK_DCCP                            = 0x6\n\tSOCK_DGRAM                           = 0x2\n\tSOCK_IOC_TYPE                        = 0x89\n\tSOCK_NONBLOCK                        = 0x800\n\tSOCK_PACKET                          = 0xa\n\tSOCK_RAW                             = 0x3\n\tSOCK_RDM                             = 0x4\n\tSOCK_SEQPACKET                       = 0x5\n\tSOCK_STREAM                          = 0x1\n\tSOL_AAL                              = 0x109\n\tSOL_ALG                              = 0x117\n\tSOL_ATM                              = 0x108\n\tSOL_CAIF                             = 0x116\n\tSOL_CAN_BASE                         = 0x64\n\tSOL_DCCP                             = 0x10d\n\tSOL_DECNET                           = 0x105\n\tSOL_ICMPV6                           = 0x3a\n\tSOL_IP                               = 0x0\n\tSOL_IPV6                             = 0x29\n\tSOL_IRDA                             = 0x10a\n\tSOL_IUCV                             = 0x115\n\tSOL_KCM                              = 0x119\n\tSOL_LLC                              = 0x10c\n\tSOL_NETBEUI                          = 0x10b\n\tSOL_NETLINK                          = 0x10e\n\tSOL_NFC                              = 0x118\n\tSOL_PACKET                           = 0x107\n\tSOL_PNPIPE                           = 0x113\n\tSOL_PPPOL2TP                         = 0x111\n\tSOL_RAW                              = 0xff\n\tSOL_RDS                              = 0x114\n\tSOL_RXRPC                            = 0x110\n\tSOL_SOCKET                           = 0x1\n\tSOL_TCP                              = 0x6\n\tSOL_TIPC                             = 0x10f\n\tSOL_X25                              = 0x106\n\tSOMAXCONN                            = 0x80\n\tSO_ACCEPTCONN                        = 0x1e\n\tSO_ATTACH_BPF                        = 0x32\n\tSO_ATTACH_FILTER                     = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF             = 0x33\n\tSO_ATTACH_REUSEPORT_EBPF             = 0x34\n\tSO_BINDTODEVICE                      = 0x19\n\tSO_BPF_EXTENSIONS                    = 0x30\n\tSO_BROADCAST                         = 0x6\n\tSO_BSDCOMPAT                         = 0xe\n\tSO_BUSY_POLL                         = 0x2e\n\tSO_CNX_ADVICE                        = 0x35\n\tSO_COOKIE                            = 0x39\n\tSO_DEBUG                             = 0x1\n\tSO_DETACH_BPF                        = 0x1b\n\tSO_DETACH_FILTER                     = 0x1b\n\tSO_DOMAIN                            = 0x27\n\tSO_DONTROUTE                         = 0x5\n\tSO_ERROR                             = 0x4\n\tSO_GET_FILTER                        = 0x1a\n\tSO_INCOMING_CPU                      = 0x31\n\tSO_INCOMING_NAPI_ID                  = 0x38\n\tSO_KEEPALIVE                         = 0x9\n\tSO_LINGER                            = 0xd\n\tSO_LOCK_FILTER                       = 0x2c\n\tSO_MARK                              = 0x24\n\tSO_MAX_PACING_RATE                   = 0x2f\n\tSO_MEMINFO                           = 0x37\n\tSO_NOFCS                             = 0x2b\n\tSO_NO_CHECK                          = 0xb\n\tSO_OOBINLINE                         = 0xa\n\tSO_PASSCRED                          = 0x10\n\tSO_PASSSEC                           = 0x22\n\tSO_PEEK_OFF                          = 0x2a\n\tSO_PEERCRED                          = 0x11\n\tSO_PEERGROUPS                        = 0x3b\n\tSO_PEERNAME                          = 0x1c\n\tSO_PEERSEC                           = 0x1f\n\tSO_PRIORITY                          = 0xc\n\tSO_PROTOCOL                          = 0x26\n\tSO_RCVBUF                            = 0x8\n\tSO_RCVBUFFORCE                       = 0x21\n\tSO_RCVLOWAT                          = 0x12\n\tSO_RCVTIMEO                          = 0x14\n\tSO_REUSEADDR                         = 0x2\n\tSO_REUSEPORT                         = 0xf\n\tSO_RXQ_OVFL                          = 0x28\n\tSO_SECURITY_AUTHENTICATION           = 0x16\n\tSO_SECURITY_ENCRYPTION_NETWORK       = 0x18\n\tSO_SECURITY_ENCRYPTION_TRANSPORT     = 0x17\n\tSO_SELECT_ERR_QUEUE                  = 0x2d\n\tSO_SNDBUF                            = 0x7\n\tSO_SNDBUFFORCE                       = 0x20\n\tSO_SNDLOWAT                          = 0x13\n\tSO_SNDTIMEO                          = 0x15\n\tSO_TIMESTAMP                         = 0x1d\n\tSO_TIMESTAMPING                      = 0x25\n\tSO_TIMESTAMPNS                       = 0x23\n\tSO_TYPE                              = 0x3\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE        = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE        = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE            = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT        = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX          = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID        = 0x3\n\tSO_VM_SOCKETS_TRUSTED                = 0x5\n\tSO_WIFI_STATUS                       = 0x29\n\tSPLICE_F_GIFT                        = 0x8\n\tSPLICE_F_MORE                        = 0x4\n\tSPLICE_F_MOVE                        = 0x1\n\tSPLICE_F_NONBLOCK                    = 0x2\n\tS_BLKSIZE                            = 0x200\n\tS_IEXEC                              = 0x40\n\tS_IFBLK                              = 0x6000\n\tS_IFCHR                              = 0x2000\n\tS_IFDIR                              = 0x4000\n\tS_IFIFO                              = 0x1000\n\tS_IFLNK                              = 0xa000\n\tS_IFMT                               = 0xf000\n\tS_IFREG                              = 0x8000\n\tS_IFSOCK                             = 0xc000\n\tS_IREAD                              = 0x100\n\tS_IRGRP                              = 0x20\n\tS_IROTH                              = 0x4\n\tS_IRUSR                              = 0x100\n\tS_IRWXG                              = 0x38\n\tS_IRWXO                              = 0x7\n\tS_IRWXU                              = 0x1c0\n\tS_ISGID                              = 0x400\n\tS_ISUID                              = 0x800\n\tS_ISVTX                              = 0x200\n\tS_IWGRP                              = 0x10\n\tS_IWOTH                              = 0x2\n\tS_IWRITE                             = 0x80\n\tS_IWUSR                              = 0x80\n\tS_IXGRP                              = 0x8\n\tS_IXOTH                              = 0x1\n\tS_IXUSR                              = 0x40\n\tTAB0                                 = 0x0\n\tTAB1                                 = 0x800\n\tTAB2                                 = 0x1000\n\tTAB3                                 = 0x1800\n\tTABDLY                               = 0x1800\n\tTASKSTATS_CMD_ATTR_MAX               = 0x4\n\tTASKSTATS_CMD_MAX                    = 0x2\n\tTASKSTATS_GENL_NAME                  = \"TASKSTATS\"\n\tTASKSTATS_GENL_VERSION               = 0x1\n\tTASKSTATS_TYPE_MAX                   = 0x6\n\tTASKSTATS_VERSION                    = 0x8\n\tTCFLSH                               = 0x540b\n\tTCGETA                               = 0x5405\n\tTCGETS                               = 0x5401\n\tTCGETS2                              = 0x802c542a\n\tTCGETX                               = 0x5432\n\tTCIFLUSH                             = 0x0\n\tTCIOFF                               = 0x2\n\tTCIOFLUSH                            = 0x2\n\tTCION                                = 0x3\n\tTCOFLUSH                             = 0x1\n\tTCOOFF                               = 0x0\n\tTCOON                                = 0x1\n\tTCP_CC_INFO                          = 0x1a\n\tTCP_CONGESTION                       = 0xd\n\tTCP_COOKIE_IN_ALWAYS                 = 0x1\n\tTCP_COOKIE_MAX                       = 0x10\n\tTCP_COOKIE_MIN                       = 0x8\n\tTCP_COOKIE_OUT_NEVER                 = 0x2\n\tTCP_COOKIE_PAIR_SIZE                 = 0x20\n\tTCP_COOKIE_TRANSACTIONS              = 0xf\n\tTCP_CORK                             = 0x3\n\tTCP_DEFER_ACCEPT                     = 0x9\n\tTCP_FASTOPEN                         = 0x17\n\tTCP_FASTOPEN_CONNECT                 = 0x1e\n\tTCP_INFO                             = 0xb\n\tTCP_KEEPCNT                          = 0x6\n\tTCP_KEEPIDLE                         = 0x4\n\tTCP_KEEPINTVL                        = 0x5\n\tTCP_LINGER2                          = 0x8\n\tTCP_MAXSEG                           = 0x2\n\tTCP_MAXWIN                           = 0xffff\n\tTCP_MAX_WINSHIFT                     = 0xe\n\tTCP_MD5SIG                           = 0xe\n\tTCP_MD5SIG_MAXKEYLEN                 = 0x50\n\tTCP_MSS                              = 0x200\n\tTCP_MSS_DEFAULT                      = 0x218\n\tTCP_MSS_DESIRED                      = 0x4c4\n\tTCP_NODELAY                          = 0x1\n\tTCP_NOTSENT_LOWAT                    = 0x19\n\tTCP_QUEUE_SEQ                        = 0x15\n\tTCP_QUICKACK                         = 0xc\n\tTCP_REPAIR                           = 0x13\n\tTCP_REPAIR_OPTIONS                   = 0x16\n\tTCP_REPAIR_QUEUE                     = 0x14\n\tTCP_REPAIR_WINDOW                    = 0x1d\n\tTCP_SAVED_SYN                        = 0x1c\n\tTCP_SAVE_SYN                         = 0x1b\n\tTCP_SYNCNT                           = 0x7\n\tTCP_S_DATA_IN                        = 0x4\n\tTCP_S_DATA_OUT                       = 0x8\n\tTCP_THIN_DUPACK                      = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS             = 0x10\n\tTCP_TIMESTAMP                        = 0x18\n\tTCP_USER_TIMEOUT                     = 0x12\n\tTCP_WINDOW_CLAMP                     = 0xa\n\tTCSAFLUSH                            = 0x2\n\tTCSBRK                               = 0x5409\n\tTCSBRKP                              = 0x5425\n\tTCSETA                               = 0x5406\n\tTCSETAF                              = 0x5408\n\tTCSETAW                              = 0x5407\n\tTCSETS                               = 0x5402\n\tTCSETS2                              = 0x402c542b\n\tTCSETSF                              = 0x5404\n\tTCSETSF2                             = 0x402c542d\n\tTCSETSW                              = 0x5403\n\tTCSETSW2                             = 0x402c542c\n\tTCSETX                               = 0x5433\n\tTCSETXF                              = 0x5434\n\tTCSETXW                              = 0x5435\n\tTCXONC                               = 0x540a\n\tTIOCCBRK                             = 0x5428\n\tTIOCCONS                             = 0x541d\n\tTIOCEXCL                             = 0x540c\n\tTIOCGDEV                             = 0x80045432\n\tTIOCGETD                             = 0x5424\n\tTIOCGEXCL                            = 0x80045440\n\tTIOCGICOUNT                          = 0x545d\n\tTIOCGLCKTRMIOS                       = 0x5456\n\tTIOCGPGRP                            = 0x540f\n\tTIOCGPKT                             = 0x80045438\n\tTIOCGPTLCK                           = 0x80045439\n\tTIOCGPTN                             = 0x80045430\n\tTIOCGPTPEER                          = 0x5441\n\tTIOCGRS485                           = 0x542e\n\tTIOCGSERIAL                          = 0x541e\n\tTIOCGSID                             = 0x5429\n\tTIOCGSOFTCAR                         = 0x5419\n\tTIOCGWINSZ                           = 0x5413\n\tTIOCINQ                              = 0x541b\n\tTIOCLINUX                            = 0x541c\n\tTIOCMBIC                             = 0x5417\n\tTIOCMBIS                             = 0x5416\n\tTIOCMGET                             = 0x5415\n\tTIOCMIWAIT                           = 0x545c\n\tTIOCMSET                             = 0x5418\n\tTIOCM_CAR                            = 0x40\n\tTIOCM_CD                             = 0x40\n\tTIOCM_CTS                            = 0x20\n\tTIOCM_DSR                            = 0x100\n\tTIOCM_DTR                            = 0x2\n\tTIOCM_LE                             = 0x1\n\tTIOCM_RI                             = 0x80\n\tTIOCM_RNG                            = 0x80\n\tTIOCM_RTS                            = 0x4\n\tTIOCM_SR                             = 0x10\n\tTIOCM_ST                             = 0x8\n\tTIOCNOTTY                            = 0x5422\n\tTIOCNXCL                             = 0x540d\n\tTIOCOUTQ                             = 0x5411\n\tTIOCPKT                              = 0x5420\n\tTIOCPKT_DATA                         = 0x0\n\tTIOCPKT_DOSTOP                       = 0x20\n\tTIOCPKT_FLUSHREAD                    = 0x1\n\tTIOCPKT_FLUSHWRITE                   = 0x2\n\tTIOCPKT_IOCTL                        = 0x40\n\tTIOCPKT_NOSTOP                       = 0x10\n\tTIOCPKT_START                        = 0x8\n\tTIOCPKT_STOP                         = 0x4\n\tTIOCSBRK                             = 0x5427\n\tTIOCSCTTY                            = 0x540e\n\tTIOCSERCONFIG                        = 0x5453\n\tTIOCSERGETLSR                        = 0x5459\n\tTIOCSERGETMULTI                      = 0x545a\n\tTIOCSERGSTRUCT                       = 0x5458\n\tTIOCSERGWILD                         = 0x5454\n\tTIOCSERSETMULTI                      = 0x545b\n\tTIOCSERSWILD                         = 0x5455\n\tTIOCSER_TEMT                         = 0x1\n\tTIOCSETD                             = 0x5423\n\tTIOCSIG                              = 0x40045436\n\tTIOCSLCKTRMIOS                       = 0x5457\n\tTIOCSPGRP                            = 0x5410\n\tTIOCSPTLCK                           = 0x40045431\n\tTIOCSRS485                           = 0x542f\n\tTIOCSSERIAL                          = 0x541f\n\tTIOCSSOFTCAR                         = 0x541a\n\tTIOCSTI                              = 0x5412\n\tTIOCSWINSZ                           = 0x5414\n\tTIOCVHANGUP                          = 0x5437\n\tTOSTOP                               = 0x100\n\tTS_COMM_LEN                          = 0x20\n\tTUNATTACHFILTER                      = 0x401054d5\n\tTUNDETACHFILTER                      = 0x401054d6\n\tTUNGETFEATURES                       = 0x800454cf\n\tTUNGETFILTER                         = 0x801054db\n\tTUNGETIFF                            = 0x800454d2\n\tTUNGETSNDBUF                         = 0x800454d3\n\tTUNGETVNETBE                         = 0x800454df\n\tTUNGETVNETHDRSZ                      = 0x800454d7\n\tTUNGETVNETLE                         = 0x800454dd\n\tTUNSETDEBUG                          = 0x400454c9\n\tTUNSETGROUP                          = 0x400454ce\n\tTUNSETIFF                            = 0x400454ca\n\tTUNSETIFINDEX                        = 0x400454da\n\tTUNSETLINK                           = 0x400454cd\n\tTUNSETNOCSUM                         = 0x400454c8\n\tTUNSETOFFLOAD                        = 0x400454d0\n\tTUNSETOWNER                          = 0x400454cc\n\tTUNSETPERSIST                        = 0x400454cb\n\tTUNSETQUEUE                          = 0x400454d9\n\tTUNSETSNDBUF                         = 0x400454d4\n\tTUNSETTXFILTER                       = 0x400454d1\n\tTUNSETVNETBE                         = 0x400454de\n\tTUNSETVNETHDRSZ                      = 0x400454d8\n\tTUNSETVNETLE                         = 0x400454dc\n\tUMOUNT_NOFOLLOW                      = 0x8\n\tUTIME_NOW                            = 0x3fffffff\n\tUTIME_OMIT                           = 0x3ffffffe\n\tVDISCARD                             = 0xd\n\tVEOF                                 = 0x4\n\tVEOL                                 = 0xb\n\tVEOL2                                = 0x10\n\tVERASE                               = 0x2\n\tVINTR                                = 0x0\n\tVKILL                                = 0x3\n\tVLNEXT                               = 0xf\n\tVMADDR_CID_ANY                       = 0xffffffff\n\tVMADDR_CID_HOST                      = 0x2\n\tVMADDR_CID_HYPERVISOR                = 0x0\n\tVMADDR_CID_RESERVED                  = 0x1\n\tVMADDR_PORT_ANY                      = 0xffffffff\n\tVMIN                                 = 0x6\n\tVM_SOCKETS_INVALID_VERSION           = 0xffffffff\n\tVQUIT                                = 0x1\n\tVREPRINT                             = 0xc\n\tVSTART                               = 0x8\n\tVSTOP                                = 0x9\n\tVSUSP                                = 0xa\n\tVSWTC                                = 0x7\n\tVT0                                  = 0x0\n\tVT1                                  = 0x4000\n\tVTDLY                                = 0x4000\n\tVTIME                                = 0x5\n\tVWERASE                              = 0xe\n\tWALL                                 = 0x40000000\n\tWCLONE                               = 0x80000000\n\tWCONTINUED                           = 0x8\n\tWDIOC_GETBOOTSTATUS                  = 0x80045702\n\tWDIOC_GETPRETIMEOUT                  = 0x80045709\n\tWDIOC_GETSTATUS                      = 0x80045701\n\tWDIOC_GETSUPPORT                     = 0x80285700\n\tWDIOC_GETTEMP                        = 0x80045703\n\tWDIOC_GETTIMELEFT                    = 0x8004570a\n\tWDIOC_GETTIMEOUT                     = 0x80045707\n\tWDIOC_KEEPALIVE                      = 0x80045705\n\tWDIOC_SETOPTIONS                     = 0x80045704\n\tWDIOC_SETPRETIMEOUT                  = 0xc0045708\n\tWDIOC_SETTIMEOUT                     = 0xc0045706\n\tWEXITED                              = 0x4\n\tWNOHANG                              = 0x1\n\tWNOTHREAD                            = 0x20000000\n\tWNOWAIT                              = 0x1000000\n\tWORDSIZE                             = 0x40\n\tWSTOPPED                             = 0x2\n\tWUNTRACED                            = 0x2\n\tXATTR_CREATE                         = 0x1\n\tXATTR_REPLACE                        = 0x2\n\tXCASE                                = 0x4\n\tXTABS                                = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x62)\n\tEADDRNOTAVAIL   = syscall.Errno(0x63)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x61)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x72)\n\tEBADE           = syscall.Errno(0x34)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x4d)\n\tEBADMSG         = syscall.Errno(0x4a)\n\tEBADR           = syscall.Errno(0x35)\n\tEBADRQC         = syscall.Errno(0x38)\n\tEBADSLT         = syscall.Errno(0x39)\n\tEBFONT          = syscall.Errno(0x3b)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7d)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x2c)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x67)\n\tECONNREFUSED    = syscall.Errno(0x6f)\n\tECONNRESET      = syscall.Errno(0x68)\n\tEDEADLK         = syscall.Errno(0x23)\n\tEDEADLOCK       = syscall.Errno(0x23)\n\tEDESTADDRREQ    = syscall.Errno(0x59)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x49)\n\tEDQUOT          = syscall.Errno(0x7a)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x70)\n\tEHOSTUNREACH    = syscall.Errno(0x71)\n\tEHWPOISON       = syscall.Errno(0x85)\n\tEIDRM           = syscall.Errno(0x2b)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x73)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x6a)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x7f)\n\tEKEYREJECTED    = syscall.Errno(0x81)\n\tEKEYREVOKED     = syscall.Errno(0x80)\n\tEL2HLT          = syscall.Errno(0x33)\n\tEL2NSYNC        = syscall.Errno(0x2d)\n\tEL3HLT          = syscall.Errno(0x2e)\n\tEL3RST          = syscall.Errno(0x2f)\n\tELIBACC         = syscall.Errno(0x4f)\n\tELIBBAD         = syscall.Errno(0x50)\n\tELIBEXEC        = syscall.Errno(0x53)\n\tELIBMAX         = syscall.Errno(0x52)\n\tELIBSCN         = syscall.Errno(0x51)\n\tELNRNG          = syscall.Errno(0x30)\n\tELOOP           = syscall.Errno(0x28)\n\tEMEDIUMTYPE     = syscall.Errno(0x7c)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x5a)\n\tEMULTIHOP       = syscall.Errno(0x48)\n\tENAMETOOLONG    = syscall.Errno(0x24)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x64)\n\tENETRESET       = syscall.Errno(0x66)\n\tENETUNREACH     = syscall.Errno(0x65)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x37)\n\tENOBUFS         = syscall.Errno(0x69)\n\tENOCSI          = syscall.Errno(0x32)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x7e)\n\tENOLCK          = syscall.Errno(0x25)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEDIUM       = syscall.Errno(0x7b)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x2a)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x5c)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x26)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x6b)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x27)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x83)\n\tENOTSOCK        = syscall.Errno(0x58)\n\tENOTSUP         = syscall.Errno(0x5f)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x4c)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x5f)\n\tEOVERFLOW       = syscall.Errno(0x4b)\n\tEOWNERDEAD      = syscall.Errno(0x82)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x60)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x5d)\n\tEPROTOTYPE      = syscall.Errno(0x5b)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x4e)\n\tEREMOTE         = syscall.Errno(0x42)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x55)\n\tERFKILL         = syscall.Errno(0x84)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x6c)\n\tESOCKTNOSUPPORT = syscall.Errno(0x5e)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x74)\n\tESTRPIPE        = syscall.Errno(0x56)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x6e)\n\tETOOMANYREFS    = syscall.Errno(0x6d)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x31)\n\tEUSERS          = syscall.Errno(0x57)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x36)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0x7)\n\tSIGCHLD   = syscall.Signal(0x11)\n\tSIGCLD    = syscall.Signal(0x11)\n\tSIGCONT   = syscall.Signal(0x12)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x1d)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x1d)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1e)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTKFLT = syscall.Signal(0x10)\n\tSIGSTOP   = syscall.Signal(0x13)\n\tSIGSYS    = syscall.Signal(0x1f)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x14)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x17)\n\tSIGUSR1   = syscall.Signal(0xa)\n\tSIGUSR2   = syscall.Signal(0xc)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t35:  \"resource deadlock avoided\",\n\t36:  \"file name too long\",\n\t37:  \"no locks available\",\n\t38:  \"function not implemented\",\n\t39:  \"directory not empty\",\n\t40:  \"too many levels of symbolic links\",\n\t42:  \"no message of desired type\",\n\t43:  \"identifier removed\",\n\t44:  \"channel number out of range\",\n\t45:  \"level 2 not synchronized\",\n\t46:  \"level 3 halted\",\n\t47:  \"level 3 reset\",\n\t48:  \"link number out of range\",\n\t49:  \"protocol driver not attached\",\n\t50:  \"no CSI structure available\",\n\t51:  \"level 2 halted\",\n\t52:  \"invalid exchange\",\n\t53:  \"invalid request descriptor\",\n\t54:  \"exchange full\",\n\t55:  \"no anode\",\n\t56:  \"invalid request code\",\n\t57:  \"invalid slot\",\n\t59:  \"bad font file format\",\n\t60:  \"device not a stream\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of streams resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"multihop attempted\",\n\t73:  \"RFS specific error\",\n\t74:  \"bad message\",\n\t75:  \"value too large for defined data type\",\n\t76:  \"name not unique on network\",\n\t77:  \"file descriptor in bad state\",\n\t78:  \"remote address changed\",\n\t79:  \"can not access a needed shared library\",\n\t80:  \"accessing a corrupted shared library\",\n\t81:  \".lib section in a.out corrupted\",\n\t82:  \"attempting to link in too many shared libraries\",\n\t83:  \"cannot exec a shared library directly\",\n\t84:  \"invalid or incomplete multibyte or wide character\",\n\t85:  \"interrupted system call should be restarted\",\n\t86:  \"streams pipe error\",\n\t87:  \"too many users\",\n\t88:  \"socket operation on non-socket\",\n\t89:  \"destination address required\",\n\t90:  \"message too long\",\n\t91:  \"protocol wrong type for socket\",\n\t92:  \"protocol not available\",\n\t93:  \"protocol not supported\",\n\t94:  \"socket type not supported\",\n\t95:  \"operation not supported\",\n\t96:  \"protocol family not supported\",\n\t97:  \"address family not supported by protocol\",\n\t98:  \"address already in use\",\n\t99:  \"cannot assign requested address\",\n\t100: \"network is down\",\n\t101: \"network is unreachable\",\n\t102: \"network dropped connection on reset\",\n\t103: \"software caused connection abort\",\n\t104: \"connection reset by peer\",\n\t105: \"no buffer space available\",\n\t106: \"transport endpoint is already connected\",\n\t107: \"transport endpoint is not connected\",\n\t108: \"cannot send after transport endpoint shutdown\",\n\t109: \"too many references: cannot splice\",\n\t110: \"connection timed out\",\n\t111: \"connection refused\",\n\t112: \"host is down\",\n\t113: \"no route to host\",\n\t114: \"operation already in progress\",\n\t115: \"operation now in progress\",\n\t116: \"stale file handle\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"disk quota exceeded\",\n\t123: \"no medium found\",\n\t124: \"wrong medium type\",\n\t125: \"operation canceled\",\n\t126: \"required key not available\",\n\t127: \"key has expired\",\n\t128: \"key has been revoked\",\n\t129: \"key was rejected by service\",\n\t130: \"owner died\",\n\t131: \"state not recoverable\",\n\t132: \"operation not possible due to RF-kill\",\n\t133: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"stack fault\",\n\t17: \"child exited\",\n\t18: \"continued\",\n\t19: \"stopped (signal)\",\n\t20: \"stopped\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"urgent I/O condition\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"I/O possible\",\n\t30: \"power failure\",\n\t31: \"bad system call\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go",
    "content": "// mkerrors.sh -m64\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n// +build sparc64,linux\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_ALG                           = 0x26\n\tAF_APPLETALK                     = 0x5\n\tAF_ASH                           = 0x12\n\tAF_ATMPVC                        = 0x8\n\tAF_ATMSVC                        = 0x14\n\tAF_AX25                          = 0x3\n\tAF_BLUETOOTH                     = 0x1f\n\tAF_BRIDGE                        = 0x7\n\tAF_CAIF                          = 0x25\n\tAF_CAN                           = 0x1d\n\tAF_DECnet                        = 0xc\n\tAF_ECONET                        = 0x13\n\tAF_FILE                          = 0x1\n\tAF_IB                            = 0x1b\n\tAF_IEEE802154                    = 0x24\n\tAF_INET                          = 0x2\n\tAF_INET6                         = 0xa\n\tAF_IPX                           = 0x4\n\tAF_IRDA                          = 0x17\n\tAF_ISDN                          = 0x22\n\tAF_IUCV                          = 0x20\n\tAF_KCM                           = 0x29\n\tAF_KEY                           = 0xf\n\tAF_LLC                           = 0x1a\n\tAF_LOCAL                         = 0x1\n\tAF_MAX                           = 0x2a\n\tAF_MPLS                          = 0x1c\n\tAF_NETBEUI                       = 0xd\n\tAF_NETLINK                       = 0x10\n\tAF_NETROM                        = 0x6\n\tAF_NFC                           = 0x27\n\tAF_PACKET                        = 0x11\n\tAF_PHONET                        = 0x23\n\tAF_PPPOX                         = 0x18\n\tAF_RDS                           = 0x15\n\tAF_ROSE                          = 0xb\n\tAF_ROUTE                         = 0x10\n\tAF_RXRPC                         = 0x21\n\tAF_SECURITY                      = 0xe\n\tAF_SNA                           = 0x16\n\tAF_TIPC                          = 0x1e\n\tAF_UNIX                          = 0x1\n\tAF_UNSPEC                        = 0x0\n\tAF_VSOCK                         = 0x28\n\tAF_WANPIPE                       = 0x19\n\tAF_X25                           = 0x9\n\tALG_OP_DECRYPT                   = 0x0\n\tALG_OP_ENCRYPT                   = 0x1\n\tALG_SET_AEAD_ASSOCLEN            = 0x4\n\tALG_SET_AEAD_AUTHSIZE            = 0x5\n\tALG_SET_IV                       = 0x2\n\tALG_SET_KEY                      = 0x1\n\tALG_SET_OP                       = 0x3\n\tARPHRD_6LOWPAN                   = 0x339\n\tARPHRD_ADAPT                     = 0x108\n\tARPHRD_APPLETLK                  = 0x8\n\tARPHRD_ARCNET                    = 0x7\n\tARPHRD_ASH                       = 0x30d\n\tARPHRD_ATM                       = 0x13\n\tARPHRD_AX25                      = 0x3\n\tARPHRD_BIF                       = 0x307\n\tARPHRD_CAIF                      = 0x336\n\tARPHRD_CAN                       = 0x118\n\tARPHRD_CHAOS                     = 0x5\n\tARPHRD_CISCO                     = 0x201\n\tARPHRD_CSLIP                     = 0x101\n\tARPHRD_CSLIP6                    = 0x103\n\tARPHRD_DDCMP                     = 0x205\n\tARPHRD_DLCI                      = 0xf\n\tARPHRD_ECONET                    = 0x30e\n\tARPHRD_EETHER                    = 0x2\n\tARPHRD_ETHER                     = 0x1\n\tARPHRD_EUI64                     = 0x1b\n\tARPHRD_FCAL                      = 0x311\n\tARPHRD_FCFABRIC                  = 0x313\n\tARPHRD_FCPL                      = 0x312\n\tARPHRD_FCPP                      = 0x310\n\tARPHRD_FDDI                      = 0x306\n\tARPHRD_FRAD                      = 0x302\n\tARPHRD_HDLC                      = 0x201\n\tARPHRD_HIPPI                     = 0x30c\n\tARPHRD_HWX25                     = 0x110\n\tARPHRD_IEEE1394                  = 0x18\n\tARPHRD_IEEE802                   = 0x6\n\tARPHRD_IEEE80211                 = 0x321\n\tARPHRD_IEEE80211_PRISM           = 0x322\n\tARPHRD_IEEE80211_RADIOTAP        = 0x323\n\tARPHRD_IEEE802154                = 0x324\n\tARPHRD_IEEE802154_MONITOR        = 0x325\n\tARPHRD_IEEE802_TR                = 0x320\n\tARPHRD_INFINIBAND                = 0x20\n\tARPHRD_IP6GRE                    = 0x337\n\tARPHRD_IPDDP                     = 0x309\n\tARPHRD_IPGRE                     = 0x30a\n\tARPHRD_IRDA                      = 0x30f\n\tARPHRD_LAPB                      = 0x204\n\tARPHRD_LOCALTLK                  = 0x305\n\tARPHRD_LOOPBACK                  = 0x304\n\tARPHRD_METRICOM                  = 0x17\n\tARPHRD_NETLINK                   = 0x338\n\tARPHRD_NETROM                    = 0x0\n\tARPHRD_NONE                      = 0xfffe\n\tARPHRD_PHONET                    = 0x334\n\tARPHRD_PHONET_PIPE               = 0x335\n\tARPHRD_PIMREG                    = 0x30b\n\tARPHRD_PPP                       = 0x200\n\tARPHRD_PRONET                    = 0x4\n\tARPHRD_RAWHDLC                   = 0x206\n\tARPHRD_ROSE                      = 0x10e\n\tARPHRD_RSRVD                     = 0x104\n\tARPHRD_SIT                       = 0x308\n\tARPHRD_SKIP                      = 0x303\n\tARPHRD_SLIP                      = 0x100\n\tARPHRD_SLIP6                     = 0x102\n\tARPHRD_TUNNEL                    = 0x300\n\tARPHRD_TUNNEL6                   = 0x301\n\tARPHRD_VOID                      = 0xffff\n\tARPHRD_X25                       = 0x10f\n\tASI_LEON_DFLUSH                  = 0x11\n\tASI_LEON_IFLUSH                  = 0x10\n\tASI_LEON_MMUFLUSH                = 0x18\n\tB0                               = 0x0\n\tB1000000                         = 0x100c\n\tB110                             = 0x3\n\tB115200                          = 0x1002\n\tB1152000                         = 0x100d\n\tB1200                            = 0x9\n\tB134                             = 0x4\n\tB150                             = 0x5\n\tB1500000                         = 0x100e\n\tB153600                          = 0x1006\n\tB1800                            = 0xa\n\tB19200                           = 0xe\n\tB200                             = 0x6\n\tB2000000                         = 0x100f\n\tB230400                          = 0x1003\n\tB2400                            = 0xb\n\tB300                             = 0x7\n\tB307200                          = 0x1007\n\tB38400                           = 0xf\n\tB460800                          = 0x1004\n\tB4800                            = 0xc\n\tB50                              = 0x1\n\tB500000                          = 0x100a\n\tB57600                           = 0x1001\n\tB576000                          = 0x100b\n\tB600                             = 0x8\n\tB614400                          = 0x1008\n\tB75                              = 0x2\n\tB76800                           = 0x1005\n\tB921600                          = 0x1009\n\tB9600                            = 0xd\n\tBLKBSZGET                        = 0x80081270\n\tBLKBSZSET                        = 0x40081271\n\tBLKFLSBUF                        = 0x1261\n\tBLKFRAGET                        = 0x1265\n\tBLKFRASET                        = 0x1264\n\tBLKGETSIZE                       = 0x1260\n\tBLKGETSIZE64                     = 0x80081272\n\tBLKRAGET                         = 0x1263\n\tBLKRASET                         = 0x1262\n\tBLKROGET                         = 0x125e\n\tBLKROSET                         = 0x125d\n\tBLKRRPART                        = 0x125f\n\tBLKSECTGET                       = 0x1267\n\tBLKSECTSET                       = 0x1266\n\tBLKSSZGET                        = 0x1268\n\tBOTHER                           = 0x1000\n\tBPF_A                            = 0x10\n\tBPF_ABS                          = 0x20\n\tBPF_ADD                          = 0x0\n\tBPF_ALU                          = 0x4\n\tBPF_AND                          = 0x50\n\tBPF_B                            = 0x10\n\tBPF_DIV                          = 0x30\n\tBPF_H                            = 0x8\n\tBPF_IMM                          = 0x0\n\tBPF_IND                          = 0x40\n\tBPF_JA                           = 0x0\n\tBPF_JEQ                          = 0x10\n\tBPF_JGE                          = 0x30\n\tBPF_JGT                          = 0x20\n\tBPF_JMP                          = 0x5\n\tBPF_JSET                         = 0x40\n\tBPF_K                            = 0x0\n\tBPF_LD                           = 0x0\n\tBPF_LDX                          = 0x1\n\tBPF_LEN                          = 0x80\n\tBPF_LL_OFF                       = -0x200000\n\tBPF_LSH                          = 0x60\n\tBPF_MAJOR_VERSION                = 0x1\n\tBPF_MAXINSNS                     = 0x1000\n\tBPF_MEM                          = 0x60\n\tBPF_MEMWORDS                     = 0x10\n\tBPF_MINOR_VERSION                = 0x1\n\tBPF_MISC                         = 0x7\n\tBPF_MOD                          = 0x90\n\tBPF_MSH                          = 0xa0\n\tBPF_MUL                          = 0x20\n\tBPF_NEG                          = 0x80\n\tBPF_NET_OFF                      = -0x100000\n\tBPF_OR                           = 0x40\n\tBPF_RET                          = 0x6\n\tBPF_RSH                          = 0x70\n\tBPF_ST                           = 0x2\n\tBPF_STX                          = 0x3\n\tBPF_SUB                          = 0x10\n\tBPF_TAX                          = 0x0\n\tBPF_TXA                          = 0x80\n\tBPF_W                            = 0x0\n\tBPF_X                            = 0x8\n\tBPF_XOR                          = 0xa0\n\tBRKINT                           = 0x2\n\tBS0                              = 0x0\n\tBS1                              = 0x2000\n\tBSDLY                            = 0x2000\n\tCAN_BCM                          = 0x2\n\tCAN_EFF_FLAG                     = 0x80000000\n\tCAN_EFF_ID_BITS                  = 0x1d\n\tCAN_EFF_MASK                     = 0x1fffffff\n\tCAN_ERR_FLAG                     = 0x20000000\n\tCAN_ERR_MASK                     = 0x1fffffff\n\tCAN_INV_FILTER                   = 0x20000000\n\tCAN_ISOTP                        = 0x6\n\tCAN_MAX_DLC                      = 0x8\n\tCAN_MAX_DLEN                     = 0x8\n\tCAN_MCNET                        = 0x5\n\tCAN_MTU                          = 0x10\n\tCAN_NPROTO                       = 0x7\n\tCAN_RAW                          = 0x1\n\tCAN_RTR_FLAG                     = 0x40000000\n\tCAN_SFF_ID_BITS                  = 0xb\n\tCAN_SFF_MASK                     = 0x7ff\n\tCAN_TP16                         = 0x3\n\tCAN_TP20                         = 0x4\n\tCBAUD                            = 0x100f\n\tCBAUDEX                          = 0x1000\n\tCFLUSH                           = 0xf\n\tCIBAUD                           = 0x100f0000\n\tCLOCAL                           = 0x800\n\tCLOCK_BOOTTIME                   = 0x7\n\tCLOCK_BOOTTIME_ALARM             = 0x9\n\tCLOCK_DEFAULT                    = 0x0\n\tCLOCK_EXT                        = 0x1\n\tCLOCK_INT                        = 0x2\n\tCLOCK_MONOTONIC                  = 0x1\n\tCLOCK_MONOTONIC_COARSE           = 0x6\n\tCLOCK_MONOTONIC_RAW              = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID         = 0x2\n\tCLOCK_REALTIME                   = 0x0\n\tCLOCK_REALTIME_ALARM             = 0x8\n\tCLOCK_REALTIME_COARSE            = 0x5\n\tCLOCK_TAI                        = 0xb\n\tCLOCK_THREAD_CPUTIME_ID          = 0x3\n\tCLOCK_TXFROMRX                   = 0x4\n\tCLOCK_TXINT                      = 0x3\n\tCLONE_CHILD_CLEARTID             = 0x200000\n\tCLONE_CHILD_SETTID               = 0x1000000\n\tCLONE_DETACHED                   = 0x400000\n\tCLONE_FILES                      = 0x400\n\tCLONE_FS                         = 0x200\n\tCLONE_IO                         = 0x80000000\n\tCLONE_NEWCGROUP                  = 0x2000000\n\tCLONE_NEWIPC                     = 0x8000000\n\tCLONE_NEWNET                     = 0x40000000\n\tCLONE_NEWNS                      = 0x20000\n\tCLONE_NEWPID                     = 0x20000000\n\tCLONE_NEWUSER                    = 0x10000000\n\tCLONE_NEWUTS                     = 0x4000000\n\tCLONE_PARENT                     = 0x8000\n\tCLONE_PARENT_SETTID              = 0x100000\n\tCLONE_PTRACE                     = 0x2000\n\tCLONE_SETTLS                     = 0x80000\n\tCLONE_SIGHAND                    = 0x800\n\tCLONE_SYSVSEM                    = 0x40000\n\tCLONE_THREAD                     = 0x10000\n\tCLONE_UNTRACED                   = 0x800000\n\tCLONE_VFORK                      = 0x4000\n\tCLONE_VM                         = 0x100\n\tCMSPAR                           = 0x40000000\n\tCR0                              = 0x0\n\tCR1                              = 0x200\n\tCR2                              = 0x400\n\tCR3                              = 0x600\n\tCRDLY                            = 0x600\n\tCREAD                            = 0x80\n\tCRTSCTS                          = 0x80000000\n\tCS5                              = 0x0\n\tCS6                              = 0x10\n\tCS7                              = 0x20\n\tCS8                              = 0x30\n\tCSIGNAL                          = 0xff\n\tCSIZE                            = 0x30\n\tCSTART                           = 0x11\n\tCSTATUS                          = 0x0\n\tCSTOP                            = 0x13\n\tCSTOPB                           = 0x40\n\tCSUSP                            = 0x1a\n\tDT_BLK                           = 0x6\n\tDT_CHR                           = 0x2\n\tDT_DIR                           = 0x4\n\tDT_FIFO                          = 0x1\n\tDT_LNK                           = 0xa\n\tDT_REG                           = 0x8\n\tDT_SOCK                          = 0xc\n\tDT_UNKNOWN                       = 0x0\n\tDT_WHT                           = 0xe\n\tECHO                             = 0x8\n\tECHOCTL                          = 0x200\n\tECHOE                            = 0x10\n\tECHOK                            = 0x20\n\tECHOKE                           = 0x800\n\tECHONL                           = 0x40\n\tECHOPRT                          = 0x400\n\tEMT_TAGOVF                       = 0x1\n\tENCODING_DEFAULT                 = 0x0\n\tENCODING_FM_MARK                 = 0x3\n\tENCODING_FM_SPACE                = 0x4\n\tENCODING_MANCHESTER              = 0x5\n\tENCODING_NRZ                     = 0x1\n\tENCODING_NRZI                    = 0x2\n\tEPOLLERR                         = 0x8\n\tEPOLLET                          = 0x80000000\n\tEPOLLEXCLUSIVE                   = 0x10000000\n\tEPOLLHUP                         = 0x10\n\tEPOLLIN                          = 0x1\n\tEPOLLMSG                         = 0x400\n\tEPOLLONESHOT                     = 0x40000000\n\tEPOLLOUT                         = 0x4\n\tEPOLLPRI                         = 0x2\n\tEPOLLRDBAND                      = 0x80\n\tEPOLLRDHUP                       = 0x2000\n\tEPOLLRDNORM                      = 0x40\n\tEPOLLWAKEUP                      = 0x20000000\n\tEPOLLWRBAND                      = 0x200\n\tEPOLLWRNORM                      = 0x100\n\tEPOLL_CLOEXEC                    = 0x400000\n\tEPOLL_CTL_ADD                    = 0x1\n\tEPOLL_CTL_DEL                    = 0x2\n\tEPOLL_CTL_MOD                    = 0x3\n\tETH_P_1588                       = 0x88f7\n\tETH_P_8021AD                     = 0x88a8\n\tETH_P_8021AH                     = 0x88e7\n\tETH_P_8021Q                      = 0x8100\n\tETH_P_80221                      = 0x8917\n\tETH_P_802_2                      = 0x4\n\tETH_P_802_3                      = 0x1\n\tETH_P_802_3_MIN                  = 0x600\n\tETH_P_802_EX1                    = 0x88b5\n\tETH_P_AARP                       = 0x80f3\n\tETH_P_AF_IUCV                    = 0xfbfb\n\tETH_P_ALL                        = 0x3\n\tETH_P_AOE                        = 0x88a2\n\tETH_P_ARCNET                     = 0x1a\n\tETH_P_ARP                        = 0x806\n\tETH_P_ATALK                      = 0x809b\n\tETH_P_ATMFATE                    = 0x8884\n\tETH_P_ATMMPOA                    = 0x884c\n\tETH_P_AX25                       = 0x2\n\tETH_P_BATMAN                     = 0x4305\n\tETH_P_BPQ                        = 0x8ff\n\tETH_P_CAIF                       = 0xf7\n\tETH_P_CAN                        = 0xc\n\tETH_P_CANFD                      = 0xd\n\tETH_P_CONTROL                    = 0x16\n\tETH_P_CUST                       = 0x6006\n\tETH_P_DDCMP                      = 0x6\n\tETH_P_DEC                        = 0x6000\n\tETH_P_DIAG                       = 0x6005\n\tETH_P_DNA_DL                     = 0x6001\n\tETH_P_DNA_RC                     = 0x6002\n\tETH_P_DNA_RT                     = 0x6003\n\tETH_P_DSA                        = 0x1b\n\tETH_P_ECONET                     = 0x18\n\tETH_P_EDSA                       = 0xdada\n\tETH_P_FCOE                       = 0x8906\n\tETH_P_FIP                        = 0x8914\n\tETH_P_HDLC                       = 0x19\n\tETH_P_HSR                        = 0x892f\n\tETH_P_IEEE802154                 = 0xf6\n\tETH_P_IEEEPUP                    = 0xa00\n\tETH_P_IEEEPUPAT                  = 0xa01\n\tETH_P_IP                         = 0x800\n\tETH_P_IPV6                       = 0x86dd\n\tETH_P_IPX                        = 0x8137\n\tETH_P_IRDA                       = 0x17\n\tETH_P_LAT                        = 0x6004\n\tETH_P_LINK_CTL                   = 0x886c\n\tETH_P_LOCALTALK                  = 0x9\n\tETH_P_LOOP                       = 0x60\n\tETH_P_LOOPBACK                   = 0x9000\n\tETH_P_MACSEC                     = 0x88e5\n\tETH_P_MOBITEX                    = 0x15\n\tETH_P_MPLS_MC                    = 0x8848\n\tETH_P_MPLS_UC                    = 0x8847\n\tETH_P_MVRP                       = 0x88f5\n\tETH_P_PAE                        = 0x888e\n\tETH_P_PAUSE                      = 0x8808\n\tETH_P_PHONET                     = 0xf5\n\tETH_P_PPPTALK                    = 0x10\n\tETH_P_PPP_DISC                   = 0x8863\n\tETH_P_PPP_MP                     = 0x8\n\tETH_P_PPP_SES                    = 0x8864\n\tETH_P_PRP                        = 0x88fb\n\tETH_P_PUP                        = 0x200\n\tETH_P_PUPAT                      = 0x201\n\tETH_P_QINQ1                      = 0x9100\n\tETH_P_QINQ2                      = 0x9200\n\tETH_P_QINQ3                      = 0x9300\n\tETH_P_RARP                       = 0x8035\n\tETH_P_SCA                        = 0x6007\n\tETH_P_SLOW                       = 0x8809\n\tETH_P_SNAP                       = 0x5\n\tETH_P_TDLS                       = 0x890d\n\tETH_P_TEB                        = 0x6558\n\tETH_P_TIPC                       = 0x88ca\n\tETH_P_TRAILER                    = 0x1c\n\tETH_P_TR_802_2                   = 0x11\n\tETH_P_TSN                        = 0x22f0\n\tETH_P_WAN_PPP                    = 0x7\n\tETH_P_WCCP                       = 0x883e\n\tETH_P_X25                        = 0x805\n\tETH_P_XDSA                       = 0xf8\n\tEXTA                             = 0xe\n\tEXTB                             = 0xf\n\tEXTPROC                          = 0x10000\n\tFALLOC_FL_COLLAPSE_RANGE         = 0x8\n\tFALLOC_FL_INSERT_RANGE           = 0x20\n\tFALLOC_FL_KEEP_SIZE              = 0x1\n\tFALLOC_FL_NO_HIDE_STALE          = 0x4\n\tFALLOC_FL_PUNCH_HOLE             = 0x2\n\tFALLOC_FL_ZERO_RANGE             = 0x10\n\tFD_CLOEXEC                       = 0x1\n\tFD_SETSIZE                       = 0x400\n\tFF0                              = 0x0\n\tFF1                              = 0x8000\n\tFFDLY                            = 0x8000\n\tFLUSHO                           = 0x2000\n\tF_DUPFD                          = 0x0\n\tF_DUPFD_CLOEXEC                  = 0x406\n\tF_EXLCK                          = 0x4\n\tF_GETFD                          = 0x1\n\tF_GETFL                          = 0x3\n\tF_GETLEASE                       = 0x401\n\tF_GETLK                          = 0x7\n\tF_GETLK64                        = 0x7\n\tF_GETOWN                         = 0x5\n\tF_GETOWN_EX                      = 0x10\n\tF_GETPIPE_SZ                     = 0x408\n\tF_GETSIG                         = 0xb\n\tF_LOCK                           = 0x1\n\tF_NOTIFY                         = 0x402\n\tF_OFD_GETLK                      = 0x24\n\tF_OFD_SETLK                      = 0x25\n\tF_OFD_SETLKW                     = 0x26\n\tF_OK                             = 0x0\n\tF_RDLCK                          = 0x1\n\tF_SETFD                          = 0x2\n\tF_SETFL                          = 0x4\n\tF_SETLEASE                       = 0x400\n\tF_SETLK                          = 0x8\n\tF_SETLK64                        = 0x8\n\tF_SETLKW                         = 0x9\n\tF_SETLKW64                       = 0x9\n\tF_SETOWN                         = 0x6\n\tF_SETOWN_EX                      = 0xf\n\tF_SETPIPE_SZ                     = 0x407\n\tF_SETSIG                         = 0xa\n\tF_SHLCK                          = 0x8\n\tF_TEST                           = 0x3\n\tF_TLOCK                          = 0x2\n\tF_ULOCK                          = 0x0\n\tF_UNLCK                          = 0x3\n\tF_WRLCK                          = 0x2\n\tGRND_NONBLOCK                    = 0x1\n\tGRND_RANDOM                      = 0x2\n\tHUPCL                            = 0x400\n\tIBSHIFT                          = 0x10\n\tICANON                           = 0x2\n\tICMPV6_FILTER                    = 0x1\n\tICRNL                            = 0x100\n\tIEXTEN                           = 0x8000\n\tIFA_F_DADFAILED                  = 0x8\n\tIFA_F_DEPRECATED                 = 0x20\n\tIFA_F_HOMEADDRESS                = 0x10\n\tIFA_F_MANAGETEMPADDR             = 0x100\n\tIFA_F_MCAUTOJOIN                 = 0x400\n\tIFA_F_NODAD                      = 0x2\n\tIFA_F_NOPREFIXROUTE              = 0x200\n\tIFA_F_OPTIMISTIC                 = 0x4\n\tIFA_F_PERMANENT                  = 0x80\n\tIFA_F_SECONDARY                  = 0x1\n\tIFA_F_STABLE_PRIVACY             = 0x800\n\tIFA_F_TEMPORARY                  = 0x1\n\tIFA_F_TENTATIVE                  = 0x40\n\tIFA_MAX                          = 0x8\n\tIFF_ALLMULTI                     = 0x200\n\tIFF_ATTACH_QUEUE                 = 0x200\n\tIFF_AUTOMEDIA                    = 0x4000\n\tIFF_BROADCAST                    = 0x2\n\tIFF_DEBUG                        = 0x4\n\tIFF_DETACH_QUEUE                 = 0x400\n\tIFF_DORMANT                      = 0x20000\n\tIFF_DYNAMIC                      = 0x8000\n\tIFF_ECHO                         = 0x40000\n\tIFF_LOOPBACK                     = 0x8\n\tIFF_LOWER_UP                     = 0x10000\n\tIFF_MASTER                       = 0x400\n\tIFF_MULTICAST                    = 0x1000\n\tIFF_MULTI_QUEUE                  = 0x100\n\tIFF_NOARP                        = 0x80\n\tIFF_NOFILTER                     = 0x1000\n\tIFF_NOTRAILERS                   = 0x20\n\tIFF_NO_PI                        = 0x1000\n\tIFF_ONE_QUEUE                    = 0x2000\n\tIFF_PERSIST                      = 0x800\n\tIFF_POINTOPOINT                  = 0x10\n\tIFF_PORTSEL                      = 0x2000\n\tIFF_PROMISC                      = 0x100\n\tIFF_RUNNING                      = 0x40\n\tIFF_SLAVE                        = 0x800\n\tIFF_TAP                          = 0x2\n\tIFF_TUN                          = 0x1\n\tIFF_TUN_EXCL                     = 0x8000\n\tIFF_UP                           = 0x1\n\tIFF_VNET_HDR                     = 0x4000\n\tIFF_VOLATILE                     = 0x70c5a\n\tIFNAMSIZ                         = 0x10\n\tIGNBRK                           = 0x1\n\tIGNCR                            = 0x80\n\tIGNPAR                           = 0x4\n\tIMAXBEL                          = 0x2000\n\tINLCR                            = 0x40\n\tINPCK                            = 0x10\n\tIN_ACCESS                        = 0x1\n\tIN_ALL_EVENTS                    = 0xfff\n\tIN_ATTRIB                        = 0x4\n\tIN_CLASSA_HOST                   = 0xffffff\n\tIN_CLASSA_MAX                    = 0x80\n\tIN_CLASSA_NET                    = 0xff000000\n\tIN_CLASSA_NSHIFT                 = 0x18\n\tIN_CLASSB_HOST                   = 0xffff\n\tIN_CLASSB_MAX                    = 0x10000\n\tIN_CLASSB_NET                    = 0xffff0000\n\tIN_CLASSB_NSHIFT                 = 0x10\n\tIN_CLASSC_HOST                   = 0xff\n\tIN_CLASSC_NET                    = 0xffffff00\n\tIN_CLASSC_NSHIFT                 = 0x8\n\tIN_CLOEXEC                       = 0x400000\n\tIN_CLOSE                         = 0x18\n\tIN_CLOSE_NOWRITE                 = 0x10\n\tIN_CLOSE_WRITE                   = 0x8\n\tIN_CREATE                        = 0x100\n\tIN_DELETE                        = 0x200\n\tIN_DELETE_SELF                   = 0x400\n\tIN_DONT_FOLLOW                   = 0x2000000\n\tIN_EXCL_UNLINK                   = 0x4000000\n\tIN_IGNORED                       = 0x8000\n\tIN_ISDIR                         = 0x40000000\n\tIN_LOOPBACKNET                   = 0x7f\n\tIN_MASK_ADD                      = 0x20000000\n\tIN_MODIFY                        = 0x2\n\tIN_MOVE                          = 0xc0\n\tIN_MOVED_FROM                    = 0x40\n\tIN_MOVED_TO                      = 0x80\n\tIN_MOVE_SELF                     = 0x800\n\tIN_NONBLOCK                      = 0x4000\n\tIN_ONESHOT                       = 0x80000000\n\tIN_ONLYDIR                       = 0x1000000\n\tIN_OPEN                          = 0x20\n\tIN_Q_OVERFLOW                    = 0x4000\n\tIN_UNMOUNT                       = 0x2000\n\tIPPROTO_AH                       = 0x33\n\tIPPROTO_BEETPH                   = 0x5e\n\tIPPROTO_COMP                     = 0x6c\n\tIPPROTO_DCCP                     = 0x21\n\tIPPROTO_DSTOPTS                  = 0x3c\n\tIPPROTO_EGP                      = 0x8\n\tIPPROTO_ENCAP                    = 0x62\n\tIPPROTO_ESP                      = 0x32\n\tIPPROTO_FRAGMENT                 = 0x2c\n\tIPPROTO_GRE                      = 0x2f\n\tIPPROTO_HOPOPTS                  = 0x0\n\tIPPROTO_ICMP                     = 0x1\n\tIPPROTO_ICMPV6                   = 0x3a\n\tIPPROTO_IDP                      = 0x16\n\tIPPROTO_IGMP                     = 0x2\n\tIPPROTO_IP                       = 0x0\n\tIPPROTO_IPIP                     = 0x4\n\tIPPROTO_IPV6                     = 0x29\n\tIPPROTO_MH                       = 0x87\n\tIPPROTO_MPLS                     = 0x89\n\tIPPROTO_MTP                      = 0x5c\n\tIPPROTO_NONE                     = 0x3b\n\tIPPROTO_PIM                      = 0x67\n\tIPPROTO_PUP                      = 0xc\n\tIPPROTO_RAW                      = 0xff\n\tIPPROTO_ROUTING                  = 0x2b\n\tIPPROTO_RSVP                     = 0x2e\n\tIPPROTO_SCTP                     = 0x84\n\tIPPROTO_TCP                      = 0x6\n\tIPPROTO_TP                       = 0x1d\n\tIPPROTO_UDP                      = 0x11\n\tIPPROTO_UDPLITE                  = 0x88\n\tIPV6_2292DSTOPTS                 = 0x4\n\tIPV6_2292HOPLIMIT                = 0x8\n\tIPV6_2292HOPOPTS                 = 0x3\n\tIPV6_2292PKTINFO                 = 0x2\n\tIPV6_2292PKTOPTIONS              = 0x6\n\tIPV6_2292RTHDR                   = 0x5\n\tIPV6_ADDRFORM                    = 0x1\n\tIPV6_ADD_MEMBERSHIP              = 0x14\n\tIPV6_AUTHHDR                     = 0xa\n\tIPV6_CHECKSUM                    = 0x7\n\tIPV6_DONTFRAG                    = 0x3e\n\tIPV6_DROP_MEMBERSHIP             = 0x15\n\tIPV6_DSTOPTS                     = 0x3b\n\tIPV6_HDRINCL                     = 0x24\n\tIPV6_HOPLIMIT                    = 0x34\n\tIPV6_HOPOPTS                     = 0x36\n\tIPV6_IPSEC_POLICY                = 0x22\n\tIPV6_JOIN_ANYCAST                = 0x1b\n\tIPV6_JOIN_GROUP                  = 0x14\n\tIPV6_LEAVE_ANYCAST               = 0x1c\n\tIPV6_LEAVE_GROUP                 = 0x15\n\tIPV6_MTU                         = 0x18\n\tIPV6_MTU_DISCOVER                = 0x17\n\tIPV6_MULTICAST_HOPS              = 0x12\n\tIPV6_MULTICAST_IF                = 0x11\n\tIPV6_MULTICAST_LOOP              = 0x13\n\tIPV6_NEXTHOP                     = 0x9\n\tIPV6_PATHMTU                     = 0x3d\n\tIPV6_PKTINFO                     = 0x32\n\tIPV6_PMTUDISC_DO                 = 0x2\n\tIPV6_PMTUDISC_DONT               = 0x0\n\tIPV6_PMTUDISC_INTERFACE          = 0x4\n\tIPV6_PMTUDISC_OMIT               = 0x5\n\tIPV6_PMTUDISC_PROBE              = 0x3\n\tIPV6_PMTUDISC_WANT               = 0x1\n\tIPV6_RECVDSTOPTS                 = 0x3a\n\tIPV6_RECVERR                     = 0x19\n\tIPV6_RECVHOPLIMIT                = 0x33\n\tIPV6_RECVHOPOPTS                 = 0x35\n\tIPV6_RECVPATHMTU                 = 0x3c\n\tIPV6_RECVPKTINFO                 = 0x31\n\tIPV6_RECVRTHDR                   = 0x38\n\tIPV6_RECVTCLASS                  = 0x42\n\tIPV6_ROUTER_ALERT                = 0x16\n\tIPV6_RTHDR                       = 0x39\n\tIPV6_RTHDRDSTOPTS                = 0x37\n\tIPV6_RTHDR_LOOSE                 = 0x0\n\tIPV6_RTHDR_STRICT                = 0x1\n\tIPV6_RTHDR_TYPE_0                = 0x0\n\tIPV6_RXDSTOPTS                   = 0x3b\n\tIPV6_RXHOPOPTS                   = 0x36\n\tIPV6_TCLASS                      = 0x43\n\tIPV6_UNICAST_HOPS                = 0x10\n\tIPV6_V6ONLY                      = 0x1a\n\tIPV6_XFRM_POLICY                 = 0x23\n\tIP_ADD_MEMBERSHIP                = 0x23\n\tIP_ADD_SOURCE_MEMBERSHIP         = 0x27\n\tIP_BIND_ADDRESS_NO_PORT          = 0x18\n\tIP_BLOCK_SOURCE                  = 0x26\n\tIP_CHECKSUM                      = 0x17\n\tIP_DEFAULT_MULTICAST_LOOP        = 0x1\n\tIP_DEFAULT_MULTICAST_TTL         = 0x1\n\tIP_DF                            = 0x4000\n\tIP_DROP_MEMBERSHIP               = 0x24\n\tIP_DROP_SOURCE_MEMBERSHIP        = 0x28\n\tIP_FREEBIND                      = 0xf\n\tIP_HDRINCL                       = 0x3\n\tIP_IPSEC_POLICY                  = 0x10\n\tIP_MAXPACKET                     = 0xffff\n\tIP_MAX_MEMBERSHIPS               = 0x14\n\tIP_MF                            = 0x2000\n\tIP_MINTTL                        = 0x15\n\tIP_MSFILTER                      = 0x29\n\tIP_MSS                           = 0x240\n\tIP_MTU                           = 0xe\n\tIP_MTU_DISCOVER                  = 0xa\n\tIP_MULTICAST_ALL                 = 0x31\n\tIP_MULTICAST_IF                  = 0x20\n\tIP_MULTICAST_LOOP                = 0x22\n\tIP_MULTICAST_TTL                 = 0x21\n\tIP_NODEFRAG                      = 0x16\n\tIP_OFFMASK                       = 0x1fff\n\tIP_OPTIONS                       = 0x4\n\tIP_ORIGDSTADDR                   = 0x14\n\tIP_PASSSEC                       = 0x12\n\tIP_PKTINFO                       = 0x8\n\tIP_PKTOPTIONS                    = 0x9\n\tIP_PMTUDISC                      = 0xa\n\tIP_PMTUDISC_DO                   = 0x2\n\tIP_PMTUDISC_DONT                 = 0x0\n\tIP_PMTUDISC_INTERFACE            = 0x4\n\tIP_PMTUDISC_OMIT                 = 0x5\n\tIP_PMTUDISC_PROBE                = 0x3\n\tIP_PMTUDISC_WANT                 = 0x1\n\tIP_RECVERR                       = 0xb\n\tIP_RECVOPTS                      = 0x6\n\tIP_RECVORIGDSTADDR               = 0x14\n\tIP_RECVRETOPTS                   = 0x7\n\tIP_RECVTOS                       = 0xd\n\tIP_RECVTTL                       = 0xc\n\tIP_RETOPTS                       = 0x7\n\tIP_RF                            = 0x8000\n\tIP_ROUTER_ALERT                  = 0x5\n\tIP_TOS                           = 0x1\n\tIP_TRANSPARENT                   = 0x13\n\tIP_TTL                           = 0x2\n\tIP_UNBLOCK_SOURCE                = 0x25\n\tIP_UNICAST_IF                    = 0x32\n\tIP_XFRM_POLICY                   = 0x11\n\tISIG                             = 0x1\n\tISTRIP                           = 0x20\n\tIUCLC                            = 0x200\n\tIUTF8                            = 0x4000\n\tIXANY                            = 0x800\n\tIXOFF                            = 0x1000\n\tIXON                             = 0x400\n\tLINUX_REBOOT_CMD_CAD_OFF         = 0x0\n\tLINUX_REBOOT_CMD_CAD_ON          = 0x89abcdef\n\tLINUX_REBOOT_CMD_HALT            = 0xcdef0123\n\tLINUX_REBOOT_CMD_KEXEC           = 0x45584543\n\tLINUX_REBOOT_CMD_POWER_OFF       = 0x4321fedc\n\tLINUX_REBOOT_CMD_RESTART         = 0x1234567\n\tLINUX_REBOOT_CMD_RESTART2        = 0xa1b2c3d4\n\tLINUX_REBOOT_CMD_SW_SUSPEND      = 0xd000fce2\n\tLINUX_REBOOT_MAGIC1              = 0xfee1dead\n\tLINUX_REBOOT_MAGIC2              = 0x28121969\n\tLOCK_EX                          = 0x2\n\tLOCK_NB                          = 0x4\n\tLOCK_SH                          = 0x1\n\tLOCK_UN                          = 0x8\n\tMADV_DODUMP                      = 0x11\n\tMADV_DOFORK                      = 0xb\n\tMADV_DONTDUMP                    = 0x10\n\tMADV_DONTFORK                    = 0xa\n\tMADV_DONTNEED                    = 0x4\n\tMADV_FREE                        = 0x8\n\tMADV_HUGEPAGE                    = 0xe\n\tMADV_HWPOISON                    = 0x64\n\tMADV_MERGEABLE                   = 0xc\n\tMADV_NOHUGEPAGE                  = 0xf\n\tMADV_NORMAL                      = 0x0\n\tMADV_RANDOM                      = 0x1\n\tMADV_REMOVE                      = 0x9\n\tMADV_SEQUENTIAL                  = 0x2\n\tMADV_UNMERGEABLE                 = 0xd\n\tMADV_WILLNEED                    = 0x3\n\tMAP_ANON                         = 0x20\n\tMAP_ANONYMOUS                    = 0x20\n\tMAP_DENYWRITE                    = 0x800\n\tMAP_EXECUTABLE                   = 0x1000\n\tMAP_FILE                         = 0x0\n\tMAP_FIXED                        = 0x10\n\tMAP_GROWSDOWN                    = 0x200\n\tMAP_HUGETLB                      = 0x40000\n\tMAP_HUGE_MASK                    = 0x3f\n\tMAP_HUGE_SHIFT                   = 0x1a\n\tMAP_LOCKED                       = 0x100\n\tMAP_NONBLOCK                     = 0x10000\n\tMAP_NORESERVE                    = 0x40\n\tMAP_POPULATE                     = 0x8000\n\tMAP_PRIVATE                      = 0x2\n\tMAP_RENAME                       = 0x20\n\tMAP_SHARED                       = 0x1\n\tMAP_STACK                        = 0x20000\n\tMAP_TYPE                         = 0xf\n\tMCL_CURRENT                      = 0x2000\n\tMCL_FUTURE                       = 0x4000\n\tMCL_ONFAULT                      = 0x8000\n\tMNT_DETACH                       = 0x2\n\tMNT_EXPIRE                       = 0x4\n\tMNT_FORCE                        = 0x1\n\tMSG_BATCH                        = 0x40000\n\tMSG_CMSG_CLOEXEC                 = 0x40000000\n\tMSG_CONFIRM                      = 0x800\n\tMSG_CTRUNC                       = 0x8\n\tMSG_DONTROUTE                    = 0x4\n\tMSG_DONTWAIT                     = 0x40\n\tMSG_EOR                          = 0x80\n\tMSG_ERRQUEUE                     = 0x2000\n\tMSG_FASTOPEN                     = 0x20000000\n\tMSG_FIN                          = 0x200\n\tMSG_MORE                         = 0x8000\n\tMSG_NOSIGNAL                     = 0x4000\n\tMSG_OOB                          = 0x1\n\tMSG_PEEK                         = 0x2\n\tMSG_PROXY                        = 0x10\n\tMSG_RST                          = 0x1000\n\tMSG_SYN                          = 0x400\n\tMSG_TRUNC                        = 0x20\n\tMSG_TRYHARD                      = 0x4\n\tMSG_WAITALL                      = 0x100\n\tMSG_WAITFORONE                   = 0x10000\n\tMS_ACTIVE                        = 0x40000000\n\tMS_ASYNC                         = 0x1\n\tMS_BIND                          = 0x1000\n\tMS_DIRSYNC                       = 0x80\n\tMS_INVALIDATE                    = 0x2\n\tMS_I_VERSION                     = 0x800000\n\tMS_KERNMOUNT                     = 0x400000\n\tMS_LAZYTIME                      = 0x2000000\n\tMS_MANDLOCK                      = 0x40\n\tMS_MGC_MSK                       = 0xffff0000\n\tMS_MGC_VAL                       = 0xc0ed0000\n\tMS_MOVE                          = 0x2000\n\tMS_NOATIME                       = 0x400\n\tMS_NODEV                         = 0x4\n\tMS_NODIRATIME                    = 0x800\n\tMS_NOEXEC                        = 0x8\n\tMS_NOSUID                        = 0x2\n\tMS_NOUSER                        = -0x80000000\n\tMS_POSIXACL                      = 0x10000\n\tMS_PRIVATE                       = 0x40000\n\tMS_RDONLY                        = 0x1\n\tMS_REC                           = 0x4000\n\tMS_RELATIME                      = 0x200000\n\tMS_REMOUNT                       = 0x20\n\tMS_RMT_MASK                      = 0x2800051\n\tMS_SHARED                        = 0x100000\n\tMS_SILENT                        = 0x8000\n\tMS_SLAVE                         = 0x80000\n\tMS_STRICTATIME                   = 0x1000000\n\tMS_SYNC                          = 0x4\n\tMS_SYNCHRONOUS                   = 0x10\n\tMS_UNBINDABLE                    = 0x20000\n\tNAME_MAX                         = 0xff\n\tNETLINK_ADD_MEMBERSHIP           = 0x1\n\tNETLINK_AUDIT                    = 0x9\n\tNETLINK_BROADCAST_ERROR          = 0x4\n\tNETLINK_CAP_ACK                  = 0xa\n\tNETLINK_CONNECTOR                = 0xb\n\tNETLINK_CRYPTO                   = 0x15\n\tNETLINK_DNRTMSG                  = 0xe\n\tNETLINK_DROP_MEMBERSHIP          = 0x2\n\tNETLINK_ECRYPTFS                 = 0x13\n\tNETLINK_FIB_LOOKUP               = 0xa\n\tNETLINK_FIREWALL                 = 0x3\n\tNETLINK_GENERIC                  = 0x10\n\tNETLINK_INET_DIAG                = 0x4\n\tNETLINK_IP6_FW                   = 0xd\n\tNETLINK_ISCSI                    = 0x8\n\tNETLINK_KOBJECT_UEVENT           = 0xf\n\tNETLINK_LISTEN_ALL_NSID          = 0x8\n\tNETLINK_LIST_MEMBERSHIPS         = 0x9\n\tNETLINK_NETFILTER                = 0xc\n\tNETLINK_NFLOG                    = 0x5\n\tNETLINK_NO_ENOBUFS               = 0x5\n\tNETLINK_PKTINFO                  = 0x3\n\tNETLINK_RDMA                     = 0x14\n\tNETLINK_ROUTE                    = 0x0\n\tNETLINK_RX_RING                  = 0x6\n\tNETLINK_SCSITRANSPORT            = 0x12\n\tNETLINK_SELINUX                  = 0x7\n\tNETLINK_SOCK_DIAG                = 0x4\n\tNETLINK_TX_RING                  = 0x7\n\tNETLINK_UNUSED                   = 0x1\n\tNETLINK_USERSOCK                 = 0x2\n\tNETLINK_XFRM                     = 0x6\n\tNL0                              = 0x0\n\tNL1                              = 0x100\n\tNLA_ALIGNTO                      = 0x4\n\tNLA_F_NESTED                     = 0x8000\n\tNLA_F_NET_BYTEORDER              = 0x4000\n\tNLA_HDRLEN                       = 0x4\n\tNLDLY                            = 0x100\n\tNLMSG_ALIGNTO                    = 0x4\n\tNLMSG_DONE                       = 0x3\n\tNLMSG_ERROR                      = 0x2\n\tNLMSG_HDRLEN                     = 0x10\n\tNLMSG_MIN_TYPE                   = 0x10\n\tNLMSG_NOOP                       = 0x1\n\tNLMSG_OVERRUN                    = 0x4\n\tNLM_F_ACK                        = 0x4\n\tNLM_F_APPEND                     = 0x800\n\tNLM_F_ATOMIC                     = 0x400\n\tNLM_F_CREATE                     = 0x400\n\tNLM_F_DUMP                       = 0x300\n\tNLM_F_DUMP_FILTERED              = 0x20\n\tNLM_F_DUMP_INTR                  = 0x10\n\tNLM_F_ECHO                       = 0x8\n\tNLM_F_EXCL                       = 0x200\n\tNLM_F_MATCH                      = 0x200\n\tNLM_F_MULTI                      = 0x2\n\tNLM_F_REPLACE                    = 0x100\n\tNLM_F_REQUEST                    = 0x1\n\tNLM_F_ROOT                       = 0x100\n\tNOFLSH                           = 0x80\n\tOCRNL                            = 0x8\n\tOFDEL                            = 0x80\n\tOFILL                            = 0x40\n\tOLCUC                            = 0x2\n\tONLCR                            = 0x4\n\tONLRET                           = 0x20\n\tONOCR                            = 0x10\n\tOPOST                            = 0x1\n\tO_ACCMODE                        = 0x3\n\tO_APPEND                         = 0x8\n\tO_ASYNC                          = 0x40\n\tO_CLOEXEC                        = 0x400000\n\tO_CREAT                          = 0x200\n\tO_DIRECT                         = 0x100000\n\tO_DIRECTORY                      = 0x10000\n\tO_DSYNC                          = 0x2000\n\tO_EXCL                           = 0x800\n\tO_FSYNC                          = 0x802000\n\tO_LARGEFILE                      = 0x0\n\tO_NDELAY                         = 0x4004\n\tO_NOATIME                        = 0x200000\n\tO_NOCTTY                         = 0x8000\n\tO_NOFOLLOW                       = 0x20000\n\tO_NONBLOCK                       = 0x4000\n\tO_PATH                           = 0x1000000\n\tO_RDONLY                         = 0x0\n\tO_RDWR                           = 0x2\n\tO_RSYNC                          = 0x802000\n\tO_SYNC                           = 0x802000\n\tO_TMPFILE                        = 0x2010000\n\tO_TRUNC                          = 0x400\n\tO_WRONLY                         = 0x1\n\tPACKET_ADD_MEMBERSHIP            = 0x1\n\tPACKET_AUXDATA                   = 0x8\n\tPACKET_BROADCAST                 = 0x1\n\tPACKET_COPY_THRESH               = 0x7\n\tPACKET_DROP_MEMBERSHIP           = 0x2\n\tPACKET_FANOUT                    = 0x12\n\tPACKET_FANOUT_CBPF               = 0x6\n\tPACKET_FANOUT_CPU                = 0x2\n\tPACKET_FANOUT_DATA               = 0x16\n\tPACKET_FANOUT_EBPF               = 0x7\n\tPACKET_FANOUT_FLAG_DEFRAG        = 0x8000\n\tPACKET_FANOUT_FLAG_ROLLOVER      = 0x1000\n\tPACKET_FANOUT_HASH               = 0x0\n\tPACKET_FANOUT_LB                 = 0x1\n\tPACKET_FANOUT_QM                 = 0x5\n\tPACKET_FANOUT_RND                = 0x4\n\tPACKET_FANOUT_ROLLOVER           = 0x3\n\tPACKET_FASTROUTE                 = 0x6\n\tPACKET_HDRLEN                    = 0xb\n\tPACKET_HOST                      = 0x0\n\tPACKET_KERNEL                    = 0x7\n\tPACKET_LOOPBACK                  = 0x5\n\tPACKET_LOSS                      = 0xe\n\tPACKET_MR_ALLMULTI               = 0x2\n\tPACKET_MR_MULTICAST              = 0x0\n\tPACKET_MR_PROMISC                = 0x1\n\tPACKET_MR_UNICAST                = 0x3\n\tPACKET_MULTICAST                 = 0x2\n\tPACKET_ORIGDEV                   = 0x9\n\tPACKET_OTHERHOST                 = 0x3\n\tPACKET_OUTGOING                  = 0x4\n\tPACKET_QDISC_BYPASS              = 0x14\n\tPACKET_RECV_OUTPUT               = 0x3\n\tPACKET_RESERVE                   = 0xc\n\tPACKET_ROLLOVER_STATS            = 0x15\n\tPACKET_RX_RING                   = 0x5\n\tPACKET_STATISTICS                = 0x6\n\tPACKET_TIMESTAMP                 = 0x11\n\tPACKET_TX_HAS_OFF                = 0x13\n\tPACKET_TX_RING                   = 0xd\n\tPACKET_TX_TIMESTAMP              = 0x10\n\tPACKET_USER                      = 0x6\n\tPACKET_VERSION                   = 0xa\n\tPACKET_VNET_HDR                  = 0xf\n\tPARENB                           = 0x100\n\tPARITY_CRC16_PR0                 = 0x2\n\tPARITY_CRC16_PR0_CCITT           = 0x4\n\tPARITY_CRC16_PR1                 = 0x3\n\tPARITY_CRC16_PR1_CCITT           = 0x5\n\tPARITY_CRC32_PR0_CCITT           = 0x6\n\tPARITY_CRC32_PR1_CCITT           = 0x7\n\tPARITY_DEFAULT                   = 0x0\n\tPARITY_NONE                      = 0x1\n\tPARMRK                           = 0x8\n\tPARODD                           = 0x200\n\tPENDIN                           = 0x4000\n\tPRIO_PGRP                        = 0x1\n\tPRIO_PROCESS                     = 0x0\n\tPRIO_USER                        = 0x2\n\tPROT_EXEC                        = 0x4\n\tPROT_GROWSDOWN                   = 0x1000000\n\tPROT_GROWSUP                     = 0x2000000\n\tPROT_NONE                        = 0x0\n\tPROT_READ                        = 0x1\n\tPROT_WRITE                       = 0x2\n\tPR_CAPBSET_DROP                  = 0x18\n\tPR_CAPBSET_READ                  = 0x17\n\tPR_CAP_AMBIENT                   = 0x2f\n\tPR_CAP_AMBIENT_CLEAR_ALL         = 0x4\n\tPR_CAP_AMBIENT_IS_SET            = 0x1\n\tPR_CAP_AMBIENT_LOWER             = 0x3\n\tPR_CAP_AMBIENT_RAISE             = 0x2\n\tPR_ENDIAN_BIG                    = 0x0\n\tPR_ENDIAN_LITTLE                 = 0x1\n\tPR_ENDIAN_PPC_LITTLE             = 0x2\n\tPR_FPEMU_NOPRINT                 = 0x1\n\tPR_FPEMU_SIGFPE                  = 0x2\n\tPR_FP_EXC_ASYNC                  = 0x2\n\tPR_FP_EXC_DISABLED               = 0x0\n\tPR_FP_EXC_DIV                    = 0x10000\n\tPR_FP_EXC_INV                    = 0x100000\n\tPR_FP_EXC_NONRECOV               = 0x1\n\tPR_FP_EXC_OVF                    = 0x20000\n\tPR_FP_EXC_PRECISE                = 0x3\n\tPR_FP_EXC_RES                    = 0x80000\n\tPR_FP_EXC_SW_ENABLE              = 0x80\n\tPR_FP_EXC_UND                    = 0x40000\n\tPR_FP_MODE_FR                    = 0x1\n\tPR_FP_MODE_FRE                   = 0x2\n\tPR_GET_CHILD_SUBREAPER           = 0x25\n\tPR_GET_DUMPABLE                  = 0x3\n\tPR_GET_ENDIAN                    = 0x13\n\tPR_GET_FPEMU                     = 0x9\n\tPR_GET_FPEXC                     = 0xb\n\tPR_GET_FP_MODE                   = 0x2e\n\tPR_GET_KEEPCAPS                  = 0x7\n\tPR_GET_NAME                      = 0x10\n\tPR_GET_NO_NEW_PRIVS              = 0x27\n\tPR_GET_PDEATHSIG                 = 0x2\n\tPR_GET_SECCOMP                   = 0x15\n\tPR_GET_SECUREBITS                = 0x1b\n\tPR_GET_THP_DISABLE               = 0x2a\n\tPR_GET_TID_ADDRESS               = 0x28\n\tPR_GET_TIMERSLACK                = 0x1e\n\tPR_GET_TIMING                    = 0xd\n\tPR_GET_TSC                       = 0x19\n\tPR_GET_UNALIGN                   = 0x5\n\tPR_MCE_KILL                      = 0x21\n\tPR_MCE_KILL_CLEAR                = 0x0\n\tPR_MCE_KILL_DEFAULT              = 0x2\n\tPR_MCE_KILL_EARLY                = 0x1\n\tPR_MCE_KILL_GET                  = 0x22\n\tPR_MCE_KILL_LATE                 = 0x0\n\tPR_MCE_KILL_SET                  = 0x1\n\tPR_MPX_DISABLE_MANAGEMENT        = 0x2c\n\tPR_MPX_ENABLE_MANAGEMENT         = 0x2b\n\tPR_SET_CHILD_SUBREAPER           = 0x24\n\tPR_SET_DUMPABLE                  = 0x4\n\tPR_SET_ENDIAN                    = 0x14\n\tPR_SET_FPEMU                     = 0xa\n\tPR_SET_FPEXC                     = 0xc\n\tPR_SET_FP_MODE                   = 0x2d\n\tPR_SET_KEEPCAPS                  = 0x8\n\tPR_SET_MM                        = 0x23\n\tPR_SET_MM_ARG_END                = 0x9\n\tPR_SET_MM_ARG_START              = 0x8\n\tPR_SET_MM_AUXV                   = 0xc\n\tPR_SET_MM_BRK                    = 0x7\n\tPR_SET_MM_END_CODE               = 0x2\n\tPR_SET_MM_END_DATA               = 0x4\n\tPR_SET_MM_ENV_END                = 0xb\n\tPR_SET_MM_ENV_START              = 0xa\n\tPR_SET_MM_EXE_FILE               = 0xd\n\tPR_SET_MM_MAP                    = 0xe\n\tPR_SET_MM_MAP_SIZE               = 0xf\n\tPR_SET_MM_START_BRK              = 0x6\n\tPR_SET_MM_START_CODE             = 0x1\n\tPR_SET_MM_START_DATA             = 0x3\n\tPR_SET_MM_START_STACK            = 0x5\n\tPR_SET_NAME                      = 0xf\n\tPR_SET_NO_NEW_PRIVS              = 0x26\n\tPR_SET_PDEATHSIG                 = 0x1\n\tPR_SET_PTRACER                   = 0x59616d61\n\tPR_SET_PTRACER_ANY               = -0x1\n\tPR_SET_SECCOMP                   = 0x16\n\tPR_SET_SECUREBITS                = 0x1c\n\tPR_SET_THP_DISABLE               = 0x29\n\tPR_SET_TIMERSLACK                = 0x1d\n\tPR_SET_TIMING                    = 0xe\n\tPR_SET_TSC                       = 0x1a\n\tPR_SET_UNALIGN                   = 0x6\n\tPR_TASK_PERF_EVENTS_DISABLE      = 0x1f\n\tPR_TASK_PERF_EVENTS_ENABLE       = 0x20\n\tPR_TIMING_STATISTICAL            = 0x0\n\tPR_TIMING_TIMESTAMP              = 0x1\n\tPR_TSC_ENABLE                    = 0x1\n\tPR_TSC_SIGSEGV                   = 0x2\n\tPR_UNALIGN_NOPRINT               = 0x1\n\tPR_UNALIGN_SIGBUS                = 0x2\n\tPTRACE_ATTACH                    = 0x10\n\tPTRACE_CONT                      = 0x7\n\tPTRACE_DETACH                    = 0x11\n\tPTRACE_EVENT_CLONE               = 0x3\n\tPTRACE_EVENT_EXEC                = 0x4\n\tPTRACE_EVENT_EXIT                = 0x6\n\tPTRACE_EVENT_FORK                = 0x1\n\tPTRACE_EVENT_SECCOMP             = 0x7\n\tPTRACE_EVENT_STOP                = 0x80\n\tPTRACE_EVENT_VFORK               = 0x2\n\tPTRACE_EVENT_VFORK_DONE          = 0x5\n\tPTRACE_GETEVENTMSG               = 0x4201\n\tPTRACE_GETFPAREGS                = 0x14\n\tPTRACE_GETFPREGS                 = 0xe\n\tPTRACE_GETFPREGS64               = 0x19\n\tPTRACE_GETREGS                   = 0xc\n\tPTRACE_GETREGS64                 = 0x16\n\tPTRACE_GETREGSET                 = 0x4204\n\tPTRACE_GETSIGINFO                = 0x4202\n\tPTRACE_GETSIGMASK                = 0x420a\n\tPTRACE_INTERRUPT                 = 0x4207\n\tPTRACE_KILL                      = 0x8\n\tPTRACE_LISTEN                    = 0x4208\n\tPTRACE_O_EXITKILL                = 0x100000\n\tPTRACE_O_MASK                    = 0x3000ff\n\tPTRACE_O_SUSPEND_SECCOMP         = 0x200000\n\tPTRACE_O_TRACECLONE              = 0x8\n\tPTRACE_O_TRACEEXEC               = 0x10\n\tPTRACE_O_TRACEEXIT               = 0x40\n\tPTRACE_O_TRACEFORK               = 0x2\n\tPTRACE_O_TRACESECCOMP            = 0x80\n\tPTRACE_O_TRACESYSGOOD            = 0x1\n\tPTRACE_O_TRACEVFORK              = 0x4\n\tPTRACE_O_TRACEVFORKDONE          = 0x20\n\tPTRACE_PEEKDATA                  = 0x2\n\tPTRACE_PEEKSIGINFO               = 0x4209\n\tPTRACE_PEEKSIGINFO_SHARED        = 0x1\n\tPTRACE_PEEKTEXT                  = 0x1\n\tPTRACE_PEEKUSR                   = 0x3\n\tPTRACE_POKEDATA                  = 0x5\n\tPTRACE_POKETEXT                  = 0x4\n\tPTRACE_POKEUSR                   = 0x6\n\tPTRACE_READDATA                  = 0x10\n\tPTRACE_READTEXT                  = 0x12\n\tPTRACE_SECCOMP_GET_FILTER        = 0x420c\n\tPTRACE_SEIZE                     = 0x4206\n\tPTRACE_SETFPAREGS                = 0x15\n\tPTRACE_SETFPREGS                 = 0xf\n\tPTRACE_SETFPREGS64               = 0x1a\n\tPTRACE_SETOPTIONS                = 0x4200\n\tPTRACE_SETREGS                   = 0xd\n\tPTRACE_SETREGS64                 = 0x17\n\tPTRACE_SETREGSET                 = 0x4205\n\tPTRACE_SETSIGINFO                = 0x4203\n\tPTRACE_SETSIGMASK                = 0x420b\n\tPTRACE_SINGLESTEP                = 0x9\n\tPTRACE_SPARC_DETACH              = 0xb\n\tPTRACE_SYSCALL                   = 0x18\n\tPTRACE_TRACEME                   = 0x0\n\tPTRACE_WRITEDATA                 = 0x11\n\tPTRACE_WRITETEXT                 = 0x13\n\tPT_FP                            = 0x48\n\tPT_G0                            = 0x10\n\tPT_G1                            = 0x14\n\tPT_G2                            = 0x18\n\tPT_G3                            = 0x1c\n\tPT_G4                            = 0x20\n\tPT_G5                            = 0x24\n\tPT_G6                            = 0x28\n\tPT_G7                            = 0x2c\n\tPT_I0                            = 0x30\n\tPT_I1                            = 0x34\n\tPT_I2                            = 0x38\n\tPT_I3                            = 0x3c\n\tPT_I4                            = 0x40\n\tPT_I5                            = 0x44\n\tPT_I6                            = 0x48\n\tPT_I7                            = 0x4c\n\tPT_NPC                           = 0x8\n\tPT_PC                            = 0x4\n\tPT_PSR                           = 0x0\n\tPT_REGS_MAGIC                    = 0x57ac6c00\n\tPT_TNPC                          = 0x90\n\tPT_TPC                           = 0x88\n\tPT_TSTATE                        = 0x80\n\tPT_V9_FP                         = 0x70\n\tPT_V9_G0                         = 0x0\n\tPT_V9_G1                         = 0x8\n\tPT_V9_G2                         = 0x10\n\tPT_V9_G3                         = 0x18\n\tPT_V9_G4                         = 0x20\n\tPT_V9_G5                         = 0x28\n\tPT_V9_G6                         = 0x30\n\tPT_V9_G7                         = 0x38\n\tPT_V9_I0                         = 0x40\n\tPT_V9_I1                         = 0x48\n\tPT_V9_I2                         = 0x50\n\tPT_V9_I3                         = 0x58\n\tPT_V9_I4                         = 0x60\n\tPT_V9_I5                         = 0x68\n\tPT_V9_I6                         = 0x70\n\tPT_V9_I7                         = 0x78\n\tPT_V9_MAGIC                      = 0x9c\n\tPT_V9_TNPC                       = 0x90\n\tPT_V9_TPC                        = 0x88\n\tPT_V9_TSTATE                     = 0x80\n\tPT_V9_Y                          = 0x98\n\tPT_WIM                           = 0x10\n\tPT_Y                             = 0xc\n\tRLIMIT_AS                        = 0x9\n\tRLIMIT_CORE                      = 0x4\n\tRLIMIT_CPU                       = 0x0\n\tRLIMIT_DATA                      = 0x2\n\tRLIMIT_FSIZE                     = 0x1\n\tRLIMIT_NOFILE                    = 0x6\n\tRLIMIT_STACK                     = 0x3\n\tRLIM_INFINITY                    = -0x1\n\tRTAX_ADVMSS                      = 0x8\n\tRTAX_CC_ALGO                     = 0x10\n\tRTAX_CWND                        = 0x7\n\tRTAX_FEATURES                    = 0xc\n\tRTAX_FEATURE_ALLFRAG             = 0x8\n\tRTAX_FEATURE_ECN                 = 0x1\n\tRTAX_FEATURE_MASK                = 0xf\n\tRTAX_FEATURE_SACK                = 0x2\n\tRTAX_FEATURE_TIMESTAMP           = 0x4\n\tRTAX_HOPLIMIT                    = 0xa\n\tRTAX_INITCWND                    = 0xb\n\tRTAX_INITRWND                    = 0xe\n\tRTAX_LOCK                        = 0x1\n\tRTAX_MAX                         = 0x10\n\tRTAX_MTU                         = 0x2\n\tRTAX_QUICKACK                    = 0xf\n\tRTAX_REORDERING                  = 0x9\n\tRTAX_RTO_MIN                     = 0xd\n\tRTAX_RTT                         = 0x4\n\tRTAX_RTTVAR                      = 0x5\n\tRTAX_SSTHRESH                    = 0x6\n\tRTAX_UNSPEC                      = 0x0\n\tRTAX_WINDOW                      = 0x3\n\tRTA_ALIGNTO                      = 0x4\n\tRTA_MAX                          = 0x18\n\tRTCF_DIRECTSRC                   = 0x4000000\n\tRTCF_DOREDIRECT                  = 0x1000000\n\tRTCF_LOG                         = 0x2000000\n\tRTCF_MASQ                        = 0x400000\n\tRTCF_NAT                         = 0x800000\n\tRTCF_VALVE                       = 0x200000\n\tRTF_ADDRCLASSMASK                = 0xf8000000\n\tRTF_ADDRCONF                     = 0x40000\n\tRTF_ALLONLINK                    = 0x20000\n\tRTF_BROADCAST                    = 0x10000000\n\tRTF_CACHE                        = 0x1000000\n\tRTF_DEFAULT                      = 0x10000\n\tRTF_DYNAMIC                      = 0x10\n\tRTF_FLOW                         = 0x2000000\n\tRTF_GATEWAY                      = 0x2\n\tRTF_HOST                         = 0x4\n\tRTF_INTERFACE                    = 0x40000000\n\tRTF_IRTT                         = 0x100\n\tRTF_LINKRT                       = 0x100000\n\tRTF_LOCAL                        = 0x80000000\n\tRTF_MODIFIED                     = 0x20\n\tRTF_MSS                          = 0x40\n\tRTF_MTU                          = 0x40\n\tRTF_MULTICAST                    = 0x20000000\n\tRTF_NAT                          = 0x8000000\n\tRTF_NOFORWARD                    = 0x1000\n\tRTF_NONEXTHOP                    = 0x200000\n\tRTF_NOPMTUDISC                   = 0x4000\n\tRTF_POLICY                       = 0x4000000\n\tRTF_REINSTATE                    = 0x8\n\tRTF_REJECT                       = 0x200\n\tRTF_STATIC                       = 0x400\n\tRTF_THROW                        = 0x2000\n\tRTF_UP                           = 0x1\n\tRTF_WINDOW                       = 0x80\n\tRTF_XRESOLVE                     = 0x800\n\tRTM_BASE                         = 0x10\n\tRTM_DELACTION                    = 0x31\n\tRTM_DELADDR                      = 0x15\n\tRTM_DELADDRLABEL                 = 0x49\n\tRTM_DELLINK                      = 0x11\n\tRTM_DELMDB                       = 0x55\n\tRTM_DELNEIGH                     = 0x1d\n\tRTM_DELNSID                      = 0x59\n\tRTM_DELQDISC                     = 0x25\n\tRTM_DELROUTE                     = 0x19\n\tRTM_DELRULE                      = 0x21\n\tRTM_DELTCLASS                    = 0x29\n\tRTM_DELTFILTER                   = 0x2d\n\tRTM_F_CLONED                     = 0x200\n\tRTM_F_EQUALIZE                   = 0x400\n\tRTM_F_LOOKUP_TABLE               = 0x1000\n\tRTM_F_NOTIFY                     = 0x100\n\tRTM_F_PREFIX                     = 0x800\n\tRTM_GETACTION                    = 0x32\n\tRTM_GETADDR                      = 0x16\n\tRTM_GETADDRLABEL                 = 0x4a\n\tRTM_GETANYCAST                   = 0x3e\n\tRTM_GETDCB                       = 0x4e\n\tRTM_GETLINK                      = 0x12\n\tRTM_GETMDB                       = 0x56\n\tRTM_GETMULTICAST                 = 0x3a\n\tRTM_GETNEIGH                     = 0x1e\n\tRTM_GETNEIGHTBL                  = 0x42\n\tRTM_GETNETCONF                   = 0x52\n\tRTM_GETNSID                      = 0x5a\n\tRTM_GETQDISC                     = 0x26\n\tRTM_GETROUTE                     = 0x1a\n\tRTM_GETRULE                      = 0x22\n\tRTM_GETSTATS                     = 0x5e\n\tRTM_GETTCLASS                    = 0x2a\n\tRTM_GETTFILTER                   = 0x2e\n\tRTM_MAX                          = 0x5f\n\tRTM_NEWACTION                    = 0x30\n\tRTM_NEWADDR                      = 0x14\n\tRTM_NEWADDRLABEL                 = 0x48\n\tRTM_NEWLINK                      = 0x10\n\tRTM_NEWMDB                       = 0x54\n\tRTM_NEWNDUSEROPT                 = 0x44\n\tRTM_NEWNEIGH                     = 0x1c\n\tRTM_NEWNEIGHTBL                  = 0x40\n\tRTM_NEWNETCONF                   = 0x50\n\tRTM_NEWNSID                      = 0x58\n\tRTM_NEWPREFIX                    = 0x34\n\tRTM_NEWQDISC                     = 0x24\n\tRTM_NEWROUTE                     = 0x18\n\tRTM_NEWRULE                      = 0x20\n\tRTM_NEWSTATS                     = 0x5c\n\tRTM_NEWTCLASS                    = 0x28\n\tRTM_NEWTFILTER                   = 0x2c\n\tRTM_NR_FAMILIES                  = 0x14\n\tRTM_NR_MSGTYPES                  = 0x50\n\tRTM_SETDCB                       = 0x4f\n\tRTM_SETLINK                      = 0x13\n\tRTM_SETNEIGHTBL                  = 0x43\n\tRTNH_ALIGNTO                     = 0x4\n\tRTNH_COMPARE_MASK                = 0x11\n\tRTNH_F_DEAD                      = 0x1\n\tRTNH_F_LINKDOWN                  = 0x10\n\tRTNH_F_OFFLOAD                   = 0x8\n\tRTNH_F_ONLINK                    = 0x4\n\tRTNH_F_PERVASIVE                 = 0x2\n\tRTN_MAX                          = 0xb\n\tRTPROT_BABEL                     = 0x2a\n\tRTPROT_BIRD                      = 0xc\n\tRTPROT_BOOT                      = 0x3\n\tRTPROT_DHCP                      = 0x10\n\tRTPROT_DNROUTED                  = 0xd\n\tRTPROT_GATED                     = 0x8\n\tRTPROT_KERNEL                    = 0x2\n\tRTPROT_MROUTED                   = 0x11\n\tRTPROT_MRT                       = 0xa\n\tRTPROT_NTK                       = 0xf\n\tRTPROT_RA                        = 0x9\n\tRTPROT_REDIRECT                  = 0x1\n\tRTPROT_STATIC                    = 0x4\n\tRTPROT_UNSPEC                    = 0x0\n\tRTPROT_XORP                      = 0xe\n\tRTPROT_ZEBRA                     = 0xb\n\tRT_CLASS_DEFAULT                 = 0xfd\n\tRT_CLASS_LOCAL                   = 0xff\n\tRT_CLASS_MAIN                    = 0xfe\n\tRT_CLASS_MAX                     = 0xff\n\tRT_CLASS_UNSPEC                  = 0x0\n\tRUSAGE_CHILDREN                  = -0x1\n\tRUSAGE_SELF                      = 0x0\n\tRUSAGE_THREAD                    = 0x1\n\tSCM_CREDENTIALS                  = 0x2\n\tSCM_RIGHTS                       = 0x1\n\tSCM_TIMESTAMP                    = 0x1d\n\tSCM_TIMESTAMPING                 = 0x23\n\tSCM_TIMESTAMPNS                  = 0x21\n\tSCM_WIFI_STATUS                  = 0x25\n\tSHUT_RD                          = 0x0\n\tSHUT_RDWR                        = 0x2\n\tSHUT_WR                          = 0x1\n\tSIOCADDDLCI                      = 0x8980\n\tSIOCADDMULTI                     = 0x8931\n\tSIOCADDRT                        = 0x890b\n\tSIOCATMARK                       = 0x8905\n\tSIOCBONDCHANGEACTIVE             = 0x8995\n\tSIOCBONDENSLAVE                  = 0x8990\n\tSIOCBONDINFOQUERY                = 0x8994\n\tSIOCBONDRELEASE                  = 0x8991\n\tSIOCBONDSETHWADDR                = 0x8992\n\tSIOCBONDSLAVEINFOQUERY           = 0x8993\n\tSIOCBRADDBR                      = 0x89a0\n\tSIOCBRADDIF                      = 0x89a2\n\tSIOCBRDELBR                      = 0x89a1\n\tSIOCBRDELIF                      = 0x89a3\n\tSIOCDARP                         = 0x8953\n\tSIOCDELDLCI                      = 0x8981\n\tSIOCDELMULTI                     = 0x8932\n\tSIOCDELRT                        = 0x890c\n\tSIOCDEVPRIVATE                   = 0x89f0\n\tSIOCDIFADDR                      = 0x8936\n\tSIOCDRARP                        = 0x8960\n\tSIOCETHTOOL                      = 0x8946\n\tSIOCGARP                         = 0x8954\n\tSIOCGHWTSTAMP                    = 0x89b1\n\tSIOCGIFADDR                      = 0x8915\n\tSIOCGIFBR                        = 0x8940\n\tSIOCGIFBRDADDR                   = 0x8919\n\tSIOCGIFCONF                      = 0x8912\n\tSIOCGIFCOUNT                     = 0x8938\n\tSIOCGIFDSTADDR                   = 0x8917\n\tSIOCGIFENCAP                     = 0x8925\n\tSIOCGIFFLAGS                     = 0x8913\n\tSIOCGIFHWADDR                    = 0x8927\n\tSIOCGIFINDEX                     = 0x8933\n\tSIOCGIFMAP                       = 0x8970\n\tSIOCGIFMEM                       = 0x891f\n\tSIOCGIFMETRIC                    = 0x891d\n\tSIOCGIFMTU                       = 0x8921\n\tSIOCGIFNAME                      = 0x8910\n\tSIOCGIFNETMASK                   = 0x891b\n\tSIOCGIFPFLAGS                    = 0x8935\n\tSIOCGIFSLAVE                     = 0x8929\n\tSIOCGIFTXQLEN                    = 0x8942\n\tSIOCGIFVLAN                      = 0x8982\n\tSIOCGMIIPHY                      = 0x8947\n\tSIOCGMIIREG                      = 0x8948\n\tSIOCGPGRP                        = 0x8904\n\tSIOCGRARP                        = 0x8961\n\tSIOCGSTAMP                       = 0x8906\n\tSIOCGSTAMPNS                     = 0x8907\n\tSIOCINQ                          = 0x4004667f\n\tSIOCOUTQ                         = 0x40047473\n\tSIOCOUTQNSD                      = 0x894b\n\tSIOCPROTOPRIVATE                 = 0x89e0\n\tSIOCRTMSG                        = 0x890d\n\tSIOCSARP                         = 0x8955\n\tSIOCSHWTSTAMP                    = 0x89b0\n\tSIOCSIFADDR                      = 0x8916\n\tSIOCSIFBR                        = 0x8941\n\tSIOCSIFBRDADDR                   = 0x891a\n\tSIOCSIFDSTADDR                   = 0x8918\n\tSIOCSIFENCAP                     = 0x8926\n\tSIOCSIFFLAGS                     = 0x8914\n\tSIOCSIFHWADDR                    = 0x8924\n\tSIOCSIFHWBROADCAST               = 0x8937\n\tSIOCSIFLINK                      = 0x8911\n\tSIOCSIFMAP                       = 0x8971\n\tSIOCSIFMEM                       = 0x8920\n\tSIOCSIFMETRIC                    = 0x891e\n\tSIOCSIFMTU                       = 0x8922\n\tSIOCSIFNAME                      = 0x8923\n\tSIOCSIFNETMASK                   = 0x891c\n\tSIOCSIFPFLAGS                    = 0x8934\n\tSIOCSIFSLAVE                     = 0x8930\n\tSIOCSIFTXQLEN                    = 0x8943\n\tSIOCSIFVLAN                      = 0x8983\n\tSIOCSMIIREG                      = 0x8949\n\tSIOCSPGRP                        = 0x8902\n\tSIOCSRARP                        = 0x8962\n\tSIOCWANDEV                       = 0x894a\n\tSOCK_CLOEXEC                     = 0x400000\n\tSOCK_DCCP                        = 0x6\n\tSOCK_DGRAM                       = 0x2\n\tSOCK_NONBLOCK                    = 0x4000\n\tSOCK_PACKET                      = 0xa\n\tSOCK_RAW                         = 0x3\n\tSOCK_RDM                         = 0x4\n\tSOCK_SEQPACKET                   = 0x5\n\tSOCK_STREAM                      = 0x1\n\tSOL_AAL                          = 0x109\n\tSOL_ALG                          = 0x117\n\tSOL_ATM                          = 0x108\n\tSOL_CAIF                         = 0x116\n\tSOL_DCCP                         = 0x10d\n\tSOL_DECNET                       = 0x105\n\tSOL_ICMPV6                       = 0x3a\n\tSOL_IP                           = 0x0\n\tSOL_IPV6                         = 0x29\n\tSOL_IRDA                         = 0x10a\n\tSOL_IUCV                         = 0x115\n\tSOL_KCM                          = 0x119\n\tSOL_LLC                          = 0x10c\n\tSOL_NETBEUI                      = 0x10b\n\tSOL_NETLINK                      = 0x10e\n\tSOL_NFC                          = 0x118\n\tSOL_PACKET                       = 0x107\n\tSOL_PNPIPE                       = 0x113\n\tSOL_PPPOL2TP                     = 0x111\n\tSOL_RAW                          = 0xff\n\tSOL_RDS                          = 0x114\n\tSOL_RXRPC                        = 0x110\n\tSOL_SOCKET                       = 0xffff\n\tSOL_TCP                          = 0x6\n\tSOL_TIPC                         = 0x10f\n\tSOL_X25                          = 0x106\n\tSOMAXCONN                        = 0x80\n\tSO_ACCEPTCONN                    = 0x8000\n\tSO_ATTACH_BPF                    = 0x34\n\tSO_ATTACH_FILTER                 = 0x1a\n\tSO_ATTACH_REUSEPORT_CBPF         = 0x35\n\tSO_ATTACH_REUSEPORT_EBPF         = 0x36\n\tSO_BINDTODEVICE                  = 0xd\n\tSO_BPF_EXTENSIONS                = 0x32\n\tSO_BROADCAST                     = 0x20\n\tSO_BSDCOMPAT                     = 0x400\n\tSO_BUSY_POLL                     = 0x30\n\tSO_CNX_ADVICE                    = 0x37\n\tSO_DEBUG                         = 0x1\n\tSO_DETACH_BPF                    = 0x1b\n\tSO_DETACH_FILTER                 = 0x1b\n\tSO_DOMAIN                        = 0x1029\n\tSO_DONTROUTE                     = 0x10\n\tSO_ERROR                         = 0x1007\n\tSO_GET_FILTER                    = 0x1a\n\tSO_INCOMING_CPU                  = 0x33\n\tSO_KEEPALIVE                     = 0x8\n\tSO_LINGER                        = 0x80\n\tSO_LOCK_FILTER                   = 0x28\n\tSO_MARK                          = 0x22\n\tSO_MAX_PACING_RATE               = 0x31\n\tSO_NOFCS                         = 0x27\n\tSO_NO_CHECK                      = 0xb\n\tSO_OOBINLINE                     = 0x100\n\tSO_PASSCRED                      = 0x2\n\tSO_PASSSEC                       = 0x1f\n\tSO_PEEK_OFF                      = 0x26\n\tSO_PEERCRED                      = 0x40\n\tSO_PEERNAME                      = 0x1c\n\tSO_PEERSEC                       = 0x1e\n\tSO_PRIORITY                      = 0xc\n\tSO_PROTOCOL                      = 0x1028\n\tSO_RCVBUF                        = 0x1002\n\tSO_RCVBUFFORCE                   = 0x100b\n\tSO_RCVLOWAT                      = 0x800\n\tSO_RCVTIMEO                      = 0x2000\n\tSO_REUSEADDR                     = 0x4\n\tSO_REUSEPORT                     = 0x200\n\tSO_RXQ_OVFL                      = 0x24\n\tSO_SECURITY_AUTHENTICATION       = 0x5001\n\tSO_SECURITY_ENCRYPTION_NETWORK   = 0x5004\n\tSO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002\n\tSO_SELECT_ERR_QUEUE              = 0x29\n\tSO_SNDBUF                        = 0x1001\n\tSO_SNDBUFFORCE                   = 0x100a\n\tSO_SNDLOWAT                      = 0x1000\n\tSO_SNDTIMEO                      = 0x4000\n\tSO_TIMESTAMP                     = 0x1d\n\tSO_TIMESTAMPING                  = 0x23\n\tSO_TIMESTAMPNS                   = 0x21\n\tSO_TYPE                          = 0x1008\n\tSO_VM_SOCKETS_BUFFER_MAX_SIZE    = 0x2\n\tSO_VM_SOCKETS_BUFFER_MIN_SIZE    = 0x1\n\tSO_VM_SOCKETS_BUFFER_SIZE        = 0x0\n\tSO_VM_SOCKETS_CONNECT_TIMEOUT    = 0x6\n\tSO_VM_SOCKETS_NONBLOCK_TXRX      = 0x7\n\tSO_VM_SOCKETS_PEER_HOST_VM_ID    = 0x3\n\tSO_VM_SOCKETS_TRUSTED            = 0x5\n\tSO_WIFI_STATUS                   = 0x25\n\tSPLICE_F_GIFT                    = 0x8\n\tSPLICE_F_MORE                    = 0x4\n\tSPLICE_F_MOVE                    = 0x1\n\tSPLICE_F_NONBLOCK                = 0x2\n\tS_BLKSIZE                        = 0x200\n\tS_IEXEC                          = 0x40\n\tS_IFBLK                          = 0x6000\n\tS_IFCHR                          = 0x2000\n\tS_IFDIR                          = 0x4000\n\tS_IFIFO                          = 0x1000\n\tS_IFLNK                          = 0xa000\n\tS_IFMT                           = 0xf000\n\tS_IFREG                          = 0x8000\n\tS_IFSOCK                         = 0xc000\n\tS_IREAD                          = 0x100\n\tS_IRGRP                          = 0x20\n\tS_IROTH                          = 0x4\n\tS_IRUSR                          = 0x100\n\tS_IRWXG                          = 0x38\n\tS_IRWXO                          = 0x7\n\tS_IRWXU                          = 0x1c0\n\tS_ISGID                          = 0x400\n\tS_ISUID                          = 0x800\n\tS_ISVTX                          = 0x200\n\tS_IWGRP                          = 0x10\n\tS_IWOTH                          = 0x2\n\tS_IWRITE                         = 0x80\n\tS_IWUSR                          = 0x80\n\tS_IXGRP                          = 0x8\n\tS_IXOTH                          = 0x1\n\tS_IXUSR                          = 0x40\n\tTAB0                             = 0x0\n\tTAB1                             = 0x800\n\tTAB2                             = 0x1000\n\tTAB3                             = 0x1800\n\tTABDLY                           = 0x1800\n\tTCFLSH                           = 0x20005407\n\tTCGETA                           = 0x40125401\n\tTCGETS                           = 0x40245408\n\tTCGETS2                          = 0x402c540c\n\tTCIFLUSH                         = 0x0\n\tTCIOFF                           = 0x2\n\tTCIOFLUSH                        = 0x2\n\tTCION                            = 0x3\n\tTCOFLUSH                         = 0x1\n\tTCOOFF                           = 0x0\n\tTCOON                            = 0x1\n\tTCP_CC_INFO                      = 0x1a\n\tTCP_CONGESTION                   = 0xd\n\tTCP_COOKIE_IN_ALWAYS             = 0x1\n\tTCP_COOKIE_MAX                   = 0x10\n\tTCP_COOKIE_MIN                   = 0x8\n\tTCP_COOKIE_OUT_NEVER             = 0x2\n\tTCP_COOKIE_PAIR_SIZE             = 0x20\n\tTCP_COOKIE_TRANSACTIONS          = 0xf\n\tTCP_CORK                         = 0x3\n\tTCP_DEFER_ACCEPT                 = 0x9\n\tTCP_FASTOPEN                     = 0x17\n\tTCP_INFO                         = 0xb\n\tTCP_KEEPCNT                      = 0x6\n\tTCP_KEEPIDLE                     = 0x4\n\tTCP_KEEPINTVL                    = 0x5\n\tTCP_LINGER2                      = 0x8\n\tTCP_MAXSEG                       = 0x2\n\tTCP_MAXWIN                       = 0xffff\n\tTCP_MAX_WINSHIFT                 = 0xe\n\tTCP_MD5SIG                       = 0xe\n\tTCP_MD5SIG_MAXKEYLEN             = 0x50\n\tTCP_MSS                          = 0x200\n\tTCP_MSS_DEFAULT                  = 0x218\n\tTCP_MSS_DESIRED                  = 0x4c4\n\tTCP_NODELAY                      = 0x1\n\tTCP_NOTSENT_LOWAT                = 0x19\n\tTCP_QUEUE_SEQ                    = 0x15\n\tTCP_QUICKACK                     = 0xc\n\tTCP_REPAIR                       = 0x13\n\tTCP_REPAIR_OPTIONS               = 0x16\n\tTCP_REPAIR_QUEUE                 = 0x14\n\tTCP_SAVED_SYN                    = 0x1c\n\tTCP_SAVE_SYN                     = 0x1b\n\tTCP_SYNCNT                       = 0x7\n\tTCP_S_DATA_IN                    = 0x4\n\tTCP_S_DATA_OUT                   = 0x8\n\tTCP_THIN_DUPACK                  = 0x11\n\tTCP_THIN_LINEAR_TIMEOUTS         = 0x10\n\tTCP_TIMESTAMP                    = 0x18\n\tTCP_USER_TIMEOUT                 = 0x12\n\tTCP_WINDOW_CLAMP                 = 0xa\n\tTCSAFLUSH                        = 0x2\n\tTCSBRK                           = 0x20005405\n\tTCSBRKP                          = 0x5425\n\tTCSETA                           = 0x80125402\n\tTCSETAF                          = 0x80125404\n\tTCSETAW                          = 0x80125403\n\tTCSETS                           = 0x80245409\n\tTCSETS2                          = 0x802c540d\n\tTCSETSF                          = 0x8024540b\n\tTCSETSF2                         = 0x802c540f\n\tTCSETSW                          = 0x8024540a\n\tTCSETSW2                         = 0x802c540e\n\tTCXONC                           = 0x20005406\n\tTIOCCBRK                         = 0x2000747a\n\tTIOCCONS                         = 0x20007424\n\tTIOCEXCL                         = 0x2000740d\n\tTIOCGDEV                         = 0x40045432\n\tTIOCGETD                         = 0x40047400\n\tTIOCGEXCL                        = 0x40045440\n\tTIOCGICOUNT                      = 0x545d\n\tTIOCGLCKTRMIOS                   = 0x5456\n\tTIOCGPGRP                        = 0x40047483\n\tTIOCGPKT                         = 0x40045438\n\tTIOCGPTLCK                       = 0x40045439\n\tTIOCGPTN                         = 0x40047486\n\tTIOCGRS485                       = 0x40205441\n\tTIOCGSERIAL                      = 0x541e\n\tTIOCGSID                         = 0x40047485\n\tTIOCGSOFTCAR                     = 0x40047464\n\tTIOCGWINSZ                       = 0x40087468\n\tTIOCINQ                          = 0x4004667f\n\tTIOCLINUX                        = 0x541c\n\tTIOCMBIC                         = 0x8004746b\n\tTIOCMBIS                         = 0x8004746c\n\tTIOCMGET                         = 0x4004746a\n\tTIOCMIWAIT                       = 0x545c\n\tTIOCMSET                         = 0x8004746d\n\tTIOCM_CAR                        = 0x40\n\tTIOCM_CD                         = 0x40\n\tTIOCM_CTS                        = 0x20\n\tTIOCM_DSR                        = 0x100\n\tTIOCM_DTR                        = 0x2\n\tTIOCM_LE                         = 0x1\n\tTIOCM_LOOP                       = 0x8000\n\tTIOCM_OUT1                       = 0x2000\n\tTIOCM_OUT2                       = 0x4000\n\tTIOCM_RI                         = 0x80\n\tTIOCM_RNG                        = 0x80\n\tTIOCM_RTS                        = 0x4\n\tTIOCM_SR                         = 0x10\n\tTIOCM_ST                         = 0x8\n\tTIOCNOTTY                        = 0x20007471\n\tTIOCNXCL                         = 0x2000740e\n\tTIOCOUTQ                         = 0x40047473\n\tTIOCPKT                          = 0x80047470\n\tTIOCPKT_DATA                     = 0x0\n\tTIOCPKT_DOSTOP                   = 0x20\n\tTIOCPKT_FLUSHREAD                = 0x1\n\tTIOCPKT_FLUSHWRITE               = 0x2\n\tTIOCPKT_IOCTL                    = 0x40\n\tTIOCPKT_NOSTOP                   = 0x10\n\tTIOCPKT_START                    = 0x8\n\tTIOCPKT_STOP                     = 0x4\n\tTIOCSBRK                         = 0x2000747b\n\tTIOCSCTTY                        = 0x20007484\n\tTIOCSERCONFIG                    = 0x5453\n\tTIOCSERGETLSR                    = 0x5459\n\tTIOCSERGETMULTI                  = 0x545a\n\tTIOCSERGSTRUCT                   = 0x5458\n\tTIOCSERGWILD                     = 0x5454\n\tTIOCSERSETMULTI                  = 0x545b\n\tTIOCSERSWILD                     = 0x5455\n\tTIOCSER_TEMT                     = 0x1\n\tTIOCSETD                         = 0x80047401\n\tTIOCSIG                          = 0x80047488\n\tTIOCSLCKTRMIOS                   = 0x5457\n\tTIOCSPGRP                        = 0x80047482\n\tTIOCSPTLCK                       = 0x80047487\n\tTIOCSRS485                       = 0xc0205442\n\tTIOCSSERIAL                      = 0x541f\n\tTIOCSSOFTCAR                     = 0x80047465\n\tTIOCSTART                        = 0x2000746e\n\tTIOCSTI                          = 0x80017472\n\tTIOCSTOP                         = 0x2000746f\n\tTIOCSWINSZ                       = 0x80087467\n\tTIOCVHANGUP                      = 0x20005437\n\tTOSTOP                           = 0x100\n\tTUNATTACHFILTER                  = 0x801054d5\n\tTUNDETACHFILTER                  = 0x801054d6\n\tTUNGETFEATURES                   = 0x400454cf\n\tTUNGETFILTER                     = 0x401054db\n\tTUNGETIFF                        = 0x400454d2\n\tTUNGETSNDBUF                     = 0x400454d3\n\tTUNGETVNETBE                     = 0x400454df\n\tTUNGETVNETHDRSZ                  = 0x400454d7\n\tTUNGETVNETLE                     = 0x400454dd\n\tTUNSETDEBUG                      = 0x800454c9\n\tTUNSETGROUP                      = 0x800454ce\n\tTUNSETIFF                        = 0x800454ca\n\tTUNSETIFINDEX                    = 0x800454da\n\tTUNSETLINK                       = 0x800454cd\n\tTUNSETNOCSUM                     = 0x800454c8\n\tTUNSETOFFLOAD                    = 0x800454d0\n\tTUNSETOWNER                      = 0x800454cc\n\tTUNSETPERSIST                    = 0x800454cb\n\tTUNSETQUEUE                      = 0x800454d9\n\tTUNSETSNDBUF                     = 0x800454d4\n\tTUNSETTXFILTER                   = 0x800454d1\n\tTUNSETVNETBE                     = 0x800454de\n\tTUNSETVNETHDRSZ                  = 0x800454d8\n\tTUNSETVNETLE                     = 0x800454dc\n\tVDISCARD                         = 0xd\n\tVDSUSP                           = 0xb\n\tVEOF                             = 0x4\n\tVEOL                             = 0x5\n\tVEOL2                            = 0x6\n\tVERASE                           = 0x2\n\tVINTR                            = 0x0\n\tVKILL                            = 0x3\n\tVLNEXT                           = 0xf\n\tVMADDR_CID_ANY                   = 0xffffffff\n\tVMADDR_CID_HOST                  = 0x2\n\tVMADDR_CID_HYPERVISOR            = 0x0\n\tVMADDR_CID_RESERVED              = 0x1\n\tVMADDR_PORT_ANY                  = 0xffffffff\n\tVMIN                             = 0x4\n\tVQUIT                            = 0x1\n\tVREPRINT                         = 0xc\n\tVSTART                           = 0x8\n\tVSTOP                            = 0x9\n\tVSUSP                            = 0xa\n\tVSWTC                            = 0x7\n\tVT0                              = 0x0\n\tVT1                              = 0x4000\n\tVTDLY                            = 0x4000\n\tVTIME                            = 0x5\n\tVWERASE                          = 0xe\n\tWALL                             = 0x40000000\n\tWCLONE                           = 0x80000000\n\tWCONTINUED                       = 0x8\n\tWEXITED                          = 0x4\n\tWNOHANG                          = 0x1\n\tWNOTHREAD                        = 0x20000000\n\tWNOWAIT                          = 0x1000000\n\tWORDSIZE                         = 0x40\n\tWRAP                             = 0x20000\n\tWSTOPPED                         = 0x2\n\tWUNTRACED                        = 0x2\n\tXCASE                            = 0x4\n\tXTABS                            = 0x1800\n\t__TIOCFLUSH                      = 0x80047410\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEADV            = syscall.Errno(0x53)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x25)\n\tEBADE           = syscall.Errno(0x66)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x5d)\n\tEBADMSG         = syscall.Errno(0x4c)\n\tEBADR           = syscall.Errno(0x67)\n\tEBADRQC         = syscall.Errno(0x6a)\n\tEBADSLT         = syscall.Errno(0x6b)\n\tEBFONT          = syscall.Errno(0x6d)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x7f)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x5e)\n\tECOMM           = syscall.Errno(0x55)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0x4e)\n\tEDEADLOCK       = syscall.Errno(0x6c)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDOTDOT         = syscall.Errno(0x58)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEHWPOISON       = syscall.Errno(0x87)\n\tEIDRM           = syscall.Errno(0x4d)\n\tEILSEQ          = syscall.Errno(0x7a)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tEISNAM          = syscall.Errno(0x78)\n\tEKEYEXPIRED     = syscall.Errno(0x81)\n\tEKEYREJECTED    = syscall.Errno(0x83)\n\tEKEYREVOKED     = syscall.Errno(0x82)\n\tEL2HLT          = syscall.Errno(0x65)\n\tEL2NSYNC        = syscall.Errno(0x5f)\n\tEL3HLT          = syscall.Errno(0x60)\n\tEL3RST          = syscall.Errno(0x61)\n\tELIBACC         = syscall.Errno(0x72)\n\tELIBBAD         = syscall.Errno(0x70)\n\tELIBEXEC        = syscall.Errno(0x6e)\n\tELIBMAX         = syscall.Errno(0x7b)\n\tELIBSCN         = syscall.Errno(0x7c)\n\tELNRNG          = syscall.Errno(0x62)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMEDIUMTYPE     = syscall.Errno(0x7e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x57)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENAVAIL         = syscall.Errno(0x77)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x69)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENOCSI          = syscall.Errno(0x64)\n\tENODATA         = syscall.Errno(0x6f)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOKEY          = syscall.Errno(0x80)\n\tENOLCK          = syscall.Errno(0x4f)\n\tENOLINK         = syscall.Errno(0x52)\n\tENOMEDIUM       = syscall.Errno(0x7d)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x4b)\n\tENONET          = syscall.Errno(0x50)\n\tENOPKG          = syscall.Errno(0x71)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x4a)\n\tENOSTR          = syscall.Errno(0x48)\n\tENOSYS          = syscall.Errno(0x5a)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTNAM         = syscall.Errno(0x76)\n\tENOTRECOVERABLE = syscall.Errno(0x85)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x2d)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x73)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x5c)\n\tEOWNERDEAD      = syscall.Errno(0x84)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROTO          = syscall.Errno(0x56)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x59)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEREMOTEIO       = syscall.Errno(0x79)\n\tERESTART        = syscall.Errno(0x74)\n\tERFKILL         = syscall.Errno(0x86)\n\tEROFS           = syscall.Errno(0x1e)\n\tERREMOTE        = syscall.Errno(0x51)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x54)\n\tESTALE          = syscall.Errno(0x46)\n\tESTRPIPE        = syscall.Errno(0x5b)\n\tETIME           = syscall.Errno(0x49)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUCLEAN         = syscall.Errno(0x75)\n\tEUNATCH         = syscall.Errno(0x63)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x68)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCLD    = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGLOST   = syscall.Signal(0x1d)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPOLL   = syscall.Signal(0x17)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x1d)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"operation not permitted\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"input/output error\",\n\t6:   \"no such device or address\",\n\t7:   \"argument list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file descriptor\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"cannot allocate memory\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device or resource busy\",\n\t17:  \"file exists\",\n\t18:  \"invalid cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"too many open files in system\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"numerical argument out of domain\",\n\t34:  \"numerical result out of range\",\n\t36:  \"operation now in progress\",\n\t37:  \"operation already in progress\",\n\t38:  \"socket operation on non-socket\",\n\t39:  \"destination address required\",\n\t40:  \"message too long\",\n\t41:  \"protocol wrong type for socket\",\n\t42:  \"protocol not available\",\n\t43:  \"protocol not supported\",\n\t44:  \"socket type not supported\",\n\t45:  \"operation not supported\",\n\t46:  \"protocol family not supported\",\n\t47:  \"address family not supported by protocol\",\n\t48:  \"address already in use\",\n\t49:  \"cannot assign requested address\",\n\t50:  \"network is down\",\n\t51:  \"network is unreachable\",\n\t52:  \"network dropped connection on reset\",\n\t53:  \"software caused connection abort\",\n\t54:  \"connection reset by peer\",\n\t55:  \"no buffer space available\",\n\t56:  \"transport endpoint is already connected\",\n\t57:  \"transport endpoint is not connected\",\n\t58:  \"cannot send after transport endpoint shutdown\",\n\t59:  \"too many references: cannot splice\",\n\t60:  \"connection timed out\",\n\t61:  \"connection refused\",\n\t62:  \"too many levels of symbolic links\",\n\t63:  \"file name too long\",\n\t64:  \"host is down\",\n\t65:  \"no route to host\",\n\t66:  \"directory not empty\",\n\t67:  \"too many processes\",\n\t68:  \"too many users\",\n\t69:  \"disk quota exceeded\",\n\t70:  \"stale file handle\",\n\t71:  \"object is remote\",\n\t72:  \"device not a stream\",\n\t73:  \"timer expired\",\n\t74:  \"out of streams resources\",\n\t75:  \"no message of desired type\",\n\t76:  \"bad message\",\n\t77:  \"identifier removed\",\n\t78:  \"resource deadlock avoided\",\n\t79:  \"no locks available\",\n\t80:  \"machine is not on the network\",\n\t81:  \"unknown error 81\",\n\t82:  \"link has been severed\",\n\t83:  \"advertise error\",\n\t84:  \"srmount error\",\n\t85:  \"communication error on send\",\n\t86:  \"protocol error\",\n\t87:  \"multihop attempted\",\n\t88:  \"RFS specific error\",\n\t89:  \"remote address changed\",\n\t90:  \"function not implemented\",\n\t91:  \"streams pipe error\",\n\t92:  \"value too large for defined data type\",\n\t93:  \"file descriptor in bad state\",\n\t94:  \"channel number out of range\",\n\t95:  \"level 2 not synchronized\",\n\t96:  \"level 3 halted\",\n\t97:  \"level 3 reset\",\n\t98:  \"link number out of range\",\n\t99:  \"protocol driver not attached\",\n\t100: \"no CSI structure available\",\n\t101: \"level 2 halted\",\n\t102: \"invalid exchange\",\n\t103: \"invalid request descriptor\",\n\t104: \"exchange full\",\n\t105: \"no anode\",\n\t106: \"invalid request code\",\n\t107: \"invalid slot\",\n\t108: \"file locking deadlock error\",\n\t109: \"bad font file format\",\n\t110: \"cannot exec a shared library directly\",\n\t111: \"no data available\",\n\t112: \"accessing a corrupted shared library\",\n\t113: \"package not installed\",\n\t114: \"can not access a needed shared library\",\n\t115: \"name not unique on network\",\n\t116: \"interrupted system call should be restarted\",\n\t117: \"structure needs cleaning\",\n\t118: \"not a XENIX named type file\",\n\t119: \"no XENIX semaphores available\",\n\t120: \"is a named type file\",\n\t121: \"remote I/O error\",\n\t122: \"invalid or incomplete multibyte or wide character\",\n\t123: \"attempting to link in too many shared libraries\",\n\t124: \".lib section in a.out corrupted\",\n\t125: \"no medium found\",\n\t126: \"wrong medium type\",\n\t127: \"operation canceled\",\n\t128: \"required key not available\",\n\t129: \"key has expired\",\n\t130: \"key has been revoked\",\n\t131: \"key was rejected by service\",\n\t132: \"owner died\",\n\t133: \"state not recoverable\",\n\t134: \"operation not possible due to RF-kill\",\n\t135: \"memory page has hardware error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"stopped (signal)\",\n\t18: \"stopped\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"CPU time limit exceeded\",\n\t25: \"file size limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window changed\",\n\t29: \"resource lost\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go",
    "content": "// mkerrors.sh -m32\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n// +build 386,netbsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m32 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_ARP                            = 0x1c\n\tAF_BLUETOOTH                      = 0x1f\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1a\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x20\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x18\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1a\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x23\n\tAF_MPLS                           = 0x21\n\tAF_NATM                           = 0x1b\n\tAF_NS                             = 0x6\n\tAF_OROUTE                         = 0x11\n\tAF_OSI                            = 0x7\n\tAF_PUP                            = 0x4\n\tAF_ROUTE                          = 0x22\n\tAF_SNA                            = 0xb\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tARPHRD_ARCNET                     = 0x7\n\tARPHRD_ETHER                      = 0x1\n\tARPHRD_FRELAY                     = 0xf\n\tARPHRD_IEEE1394                   = 0x18\n\tARPHRD_IEEE802                    = 0x6\n\tARPHRD_STRIP                      = 0x17\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB460800                           = 0x70800\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB921600                           = 0xe1000\n\tB9600                             = 0x2580\n\tBIOCFEEDBACK                      = 0x8004427d\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc0084277\n\tBIOCGETIF                         = 0x4090426b\n\tBIOCGFEEDBACK                     = 0x4004427c\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRTIMEOUT                     = 0x400c427b\n\tBIOCGSEESENT                      = 0x40044278\n\tBIOCGSTATS                        = 0x4080426f\n\tBIOCGSTATSOLD                     = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044276\n\tBIOCSETF                          = 0x80084267\n\tBIOCSETIF                         = 0x8090426c\n\tBIOCSFEEDBACK                     = 0x8004427d\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRTIMEOUT                     = 0x800c427a\n\tBIOCSSEESENT                      = 0x80044279\n\tBIOCSTCPF                         = 0x80084272\n\tBIOCSUDPF                         = 0x80084273\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALIGNMENT32                   = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DFLTBUFSIZE                   = 0x100000\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x1000000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCLONE_CSIGNAL                     = 0xff\n\tCLONE_FILES                       = 0x400\n\tCLONE_FS                          = 0x200\n\tCLONE_PID                         = 0x1000\n\tCLONE_PTRACE                      = 0x2000\n\tCLONE_SIGHAND                     = 0x800\n\tCLONE_VFORK                       = 0x4000\n\tCLONE_VM                          = 0x100\n\tCREAD                             = 0x800\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tCTL_QUERY                         = -0x2\n\tDIOCBSFLUSH                       = 0x20006478\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_AOS                           = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CAN_SOCKETCAN                 = 0xe3\n\tDLT_CHAOS                         = 0x5\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DECT                          = 0xdd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FC_2                          = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS        = 0xe1\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_GSMTAP_ABIS                   = 0xda\n\tDLT_GSMTAP_UM                     = 0xd9\n\tDLT_HDLC                          = 0x10\n\tDLT_HHDLC                         = 0x79\n\tDLT_HIPPI                         = 0xf\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IPNET                         = 0xe2\n\tDLT_IPV4                          = 0xe4\n\tDLT_IPV6                          = 0xe5\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_EVDEV                   = 0xd8\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MPLS                          = 0xdb\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0xe\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_RAWAF_MASK                    = 0x2240000\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xd\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_USB_LINUX_MMAPPED             = 0xdc\n\tDLT_WIHART                        = 0xdf\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEMUL_LINUX                        = 0x1\n\tEMUL_LINUX32                      = 0x5\n\tEMUL_MAXID                        = 0x6\n\tEN_SW_CTL_INF                     = 0x1000\n\tEN_SW_CTL_PREC                    = 0x300\n\tEN_SW_CTL_ROUND                   = 0xc00\n\tEN_SW_DATACHAIN                   = 0x80\n\tEN_SW_DENORM                      = 0x2\n\tEN_SW_INVOP                       = 0x1\n\tEN_SW_OVERFLOW                    = 0x8\n\tEN_SW_PRECLOSS                    = 0x20\n\tEN_SW_UNDERFLOW                   = 0x10\n\tEN_SW_ZERODIV                     = 0x4\n\tETHERCAP_JUMBO_MTU                = 0x4\n\tETHERCAP_VLAN_HWTAGGING           = 0x2\n\tETHERCAP_VLAN_MTU                 = 0x1\n\tETHERMIN                          = 0x2e\n\tETHERMTU                          = 0x5dc\n\tETHERMTU_JUMBO                    = 0x2328\n\tETHERTYPE_8023                    = 0x4\n\tETHERTYPE_AARP                    = 0x80f3\n\tETHERTYPE_ACCTON                  = 0x8390\n\tETHERTYPE_AEONIC                  = 0x8036\n\tETHERTYPE_ALPHA                   = 0x814a\n\tETHERTYPE_AMBER                   = 0x6008\n\tETHERTYPE_AMOEBA                  = 0x8145\n\tETHERTYPE_APOLLO                  = 0x80f7\n\tETHERTYPE_APOLLODOMAIN            = 0x8019\n\tETHERTYPE_APPLETALK               = 0x809b\n\tETHERTYPE_APPLITEK                = 0x80c7\n\tETHERTYPE_ARGONAUT                = 0x803a\n\tETHERTYPE_ARP                     = 0x806\n\tETHERTYPE_AT                      = 0x809b\n\tETHERTYPE_ATALK                   = 0x809b\n\tETHERTYPE_ATOMIC                  = 0x86df\n\tETHERTYPE_ATT                     = 0x8069\n\tETHERTYPE_ATTSTANFORD             = 0x8008\n\tETHERTYPE_AUTOPHON                = 0x806a\n\tETHERTYPE_AXIS                    = 0x8856\n\tETHERTYPE_BCLOOP                  = 0x9003\n\tETHERTYPE_BOFL                    = 0x8102\n\tETHERTYPE_CABLETRON               = 0x7034\n\tETHERTYPE_CHAOS                   = 0x804\n\tETHERTYPE_COMDESIGN               = 0x806c\n\tETHERTYPE_COMPUGRAPHIC            = 0x806d\n\tETHERTYPE_COUNTERPOINT            = 0x8062\n\tETHERTYPE_CRONUS                  = 0x8004\n\tETHERTYPE_CRONUSVLN               = 0x8003\n\tETHERTYPE_DCA                     = 0x1234\n\tETHERTYPE_DDE                     = 0x807b\n\tETHERTYPE_DEBNI                   = 0xaaaa\n\tETHERTYPE_DECAM                   = 0x8048\n\tETHERTYPE_DECCUST                 = 0x6006\n\tETHERTYPE_DECDIAG                 = 0x6005\n\tETHERTYPE_DECDNS                  = 0x803c\n\tETHERTYPE_DECDTS                  = 0x803e\n\tETHERTYPE_DECEXPER                = 0x6000\n\tETHERTYPE_DECLAST                 = 0x8041\n\tETHERTYPE_DECLTM                  = 0x803f\n\tETHERTYPE_DECMUMPS                = 0x6009\n\tETHERTYPE_DECNETBIOS              = 0x8040\n\tETHERTYPE_DELTACON                = 0x86de\n\tETHERTYPE_DIDDLE                  = 0x4321\n\tETHERTYPE_DLOG1                   = 0x660\n\tETHERTYPE_DLOG2                   = 0x661\n\tETHERTYPE_DN                      = 0x6003\n\tETHERTYPE_DOGFIGHT                = 0x1989\n\tETHERTYPE_DSMD                    = 0x8039\n\tETHERTYPE_ECMA                    = 0x803\n\tETHERTYPE_ENCRYPT                 = 0x803d\n\tETHERTYPE_ES                      = 0x805d\n\tETHERTYPE_EXCELAN                 = 0x8010\n\tETHERTYPE_EXPERDATA               = 0x8049\n\tETHERTYPE_FLIP                    = 0x8146\n\tETHERTYPE_FLOWCONTROL             = 0x8808\n\tETHERTYPE_FRARP                   = 0x808\n\tETHERTYPE_GENDYN                  = 0x8068\n\tETHERTYPE_HAYES                   = 0x8130\n\tETHERTYPE_HIPPI_FP                = 0x8180\n\tETHERTYPE_HITACHI                 = 0x8820\n\tETHERTYPE_HP                      = 0x8005\n\tETHERTYPE_IEEEPUP                 = 0xa00\n\tETHERTYPE_IEEEPUPAT               = 0xa01\n\tETHERTYPE_IMLBL                   = 0x4c42\n\tETHERTYPE_IMLBLDIAG               = 0x424c\n\tETHERTYPE_IP                      = 0x800\n\tETHERTYPE_IPAS                    = 0x876c\n\tETHERTYPE_IPV6                    = 0x86dd\n\tETHERTYPE_IPX                     = 0x8137\n\tETHERTYPE_IPXNEW                  = 0x8037\n\tETHERTYPE_KALPANA                 = 0x8582\n\tETHERTYPE_LANBRIDGE               = 0x8038\n\tETHERTYPE_LANPROBE                = 0x8888\n\tETHERTYPE_LAT                     = 0x6004\n\tETHERTYPE_LBACK                   = 0x9000\n\tETHERTYPE_LITTLE                  = 0x8060\n\tETHERTYPE_LOGICRAFT               = 0x8148\n\tETHERTYPE_LOOPBACK                = 0x9000\n\tETHERTYPE_MATRA                   = 0x807a\n\tETHERTYPE_MAX                     = 0xffff\n\tETHERTYPE_MERIT                   = 0x807c\n\tETHERTYPE_MICP                    = 0x873a\n\tETHERTYPE_MOPDL                   = 0x6001\n\tETHERTYPE_MOPRC                   = 0x6002\n\tETHERTYPE_MOTOROLA                = 0x818d\n\tETHERTYPE_MPLS                    = 0x8847\n\tETHERTYPE_MPLS_MCAST              = 0x8848\n\tETHERTYPE_MUMPS                   = 0x813f\n\tETHERTYPE_NBPCC                   = 0x3c04\n\tETHERTYPE_NBPCLAIM                = 0x3c09\n\tETHERTYPE_NBPCLREQ                = 0x3c05\n\tETHERTYPE_NBPCLRSP                = 0x3c06\n\tETHERTYPE_NBPCREQ                 = 0x3c02\n\tETHERTYPE_NBPCRSP                 = 0x3c03\n\tETHERTYPE_NBPDG                   = 0x3c07\n\tETHERTYPE_NBPDGB                  = 0x3c08\n\tETHERTYPE_NBPDLTE                 = 0x3c0a\n\tETHERTYPE_NBPRAR                  = 0x3c0c\n\tETHERTYPE_NBPRAS                  = 0x3c0b\n\tETHERTYPE_NBPRST                  = 0x3c0d\n\tETHERTYPE_NBPSCD                  = 0x3c01\n\tETHERTYPE_NBPVCD                  = 0x3c00\n\tETHERTYPE_NBS                     = 0x802\n\tETHERTYPE_NCD                     = 0x8149\n\tETHERTYPE_NESTAR                  = 0x8006\n\tETHERTYPE_NETBEUI                 = 0x8191\n\tETHERTYPE_NOVELL                  = 0x8138\n\tETHERTYPE_NS                      = 0x600\n\tETHERTYPE_NSAT                    = 0x601\n\tETHERTYPE_NSCOMPAT                = 0x807\n\tETHERTYPE_NTRAILER                = 0x10\n\tETHERTYPE_OS9                     = 0x7007\n\tETHERTYPE_OS9NET                  = 0x7009\n\tETHERTYPE_PACER                   = 0x80c6\n\tETHERTYPE_PAE                     = 0x888e\n\tETHERTYPE_PCS                     = 0x4242\n\tETHERTYPE_PLANNING                = 0x8044\n\tETHERTYPE_PPP                     = 0x880b\n\tETHERTYPE_PPPOE                   = 0x8864\n\tETHERTYPE_PPPOEDISC               = 0x8863\n\tETHERTYPE_PRIMENTS                = 0x7031\n\tETHERTYPE_PUP                     = 0x200\n\tETHERTYPE_PUPAT                   = 0x200\n\tETHERTYPE_RACAL                   = 0x7030\n\tETHERTYPE_RATIONAL                = 0x8150\n\tETHERTYPE_RAWFR                   = 0x6559\n\tETHERTYPE_RCL                     = 0x1995\n\tETHERTYPE_RDP                     = 0x8739\n\tETHERTYPE_RETIX                   = 0x80f2\n\tETHERTYPE_REVARP                  = 0x8035\n\tETHERTYPE_SCA                     = 0x6007\n\tETHERTYPE_SECTRA                  = 0x86db\n\tETHERTYPE_SECUREDATA              = 0x876d\n\tETHERTYPE_SGITW                   = 0x817e\n\tETHERTYPE_SG_BOUNCE               = 0x8016\n\tETHERTYPE_SG_DIAG                 = 0x8013\n\tETHERTYPE_SG_NETGAMES             = 0x8014\n\tETHERTYPE_SG_RESV                 = 0x8015\n\tETHERTYPE_SIMNET                  = 0x5208\n\tETHERTYPE_SLOWPROTOCOLS           = 0x8809\n\tETHERTYPE_SNA                     = 0x80d5\n\tETHERTYPE_SNMP                    = 0x814c\n\tETHERTYPE_SONIX                   = 0xfaf5\n\tETHERTYPE_SPIDER                  = 0x809f\n\tETHERTYPE_SPRITE                  = 0x500\n\tETHERTYPE_STP                     = 0x8181\n\tETHERTYPE_TALARIS                 = 0x812b\n\tETHERTYPE_TALARISMC               = 0x852b\n\tETHERTYPE_TCPCOMP                 = 0x876b\n\tETHERTYPE_TCPSM                   = 0x9002\n\tETHERTYPE_TEC                     = 0x814f\n\tETHERTYPE_TIGAN                   = 0x802f\n\tETHERTYPE_TRAIL                   = 0x1000\n\tETHERTYPE_TRANSETHER              = 0x6558\n\tETHERTYPE_TYMSHARE                = 0x802e\n\tETHERTYPE_UBBST                   = 0x7005\n\tETHERTYPE_UBDEBUG                 = 0x900\n\tETHERTYPE_UBDIAGLOOP              = 0x7002\n\tETHERTYPE_UBDL                    = 0x7000\n\tETHERTYPE_UBNIU                   = 0x7001\n\tETHERTYPE_UBNMC                   = 0x7003\n\tETHERTYPE_VALID                   = 0x1600\n\tETHERTYPE_VARIAN                  = 0x80dd\n\tETHERTYPE_VAXELN                  = 0x803b\n\tETHERTYPE_VEECO                   = 0x8067\n\tETHERTYPE_VEXP                    = 0x805b\n\tETHERTYPE_VGLAB                   = 0x8131\n\tETHERTYPE_VINES                   = 0xbad\n\tETHERTYPE_VINESECHO               = 0xbaf\n\tETHERTYPE_VINESLOOP               = 0xbae\n\tETHERTYPE_VITAL                   = 0xff00\n\tETHERTYPE_VLAN                    = 0x8100\n\tETHERTYPE_VLTLMAN                 = 0x8080\n\tETHERTYPE_VPROD                   = 0x805c\n\tETHERTYPE_VURESERVED              = 0x8147\n\tETHERTYPE_WATERLOO                = 0x8130\n\tETHERTYPE_WELLFLEET               = 0x8103\n\tETHERTYPE_X25                     = 0x805\n\tETHERTYPE_X75                     = 0x801\n\tETHERTYPE_XNSSM                   = 0x9001\n\tETHERTYPE_XTP                     = 0x817d\n\tETHER_ADDR_LEN                    = 0x6\n\tETHER_CRC_LEN                     = 0x4\n\tETHER_CRC_POLY_BE                 = 0x4c11db6\n\tETHER_CRC_POLY_LE                 = 0xedb88320\n\tETHER_HDR_LEN                     = 0xe\n\tETHER_MAX_LEN                     = 0x5ee\n\tETHER_MAX_LEN_JUMBO               = 0x233a\n\tETHER_MIN_LEN                     = 0x40\n\tETHER_PPPOE_ENCAP_LEN             = 0x8\n\tETHER_TYPE_LEN                    = 0x2\n\tETHER_VLAN_ENCAP_LEN              = 0x4\n\tEVFILT_AIO                        = 0x2\n\tEVFILT_PROC                       = 0x4\n\tEVFILT_READ                       = 0x0\n\tEVFILT_SIGNAL                     = 0x5\n\tEVFILT_SYSCOUNT                   = 0x7\n\tEVFILT_TIMER                      = 0x6\n\tEVFILT_VNODE                      = 0x3\n\tEVFILT_WRITE                      = 0x1\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_SYSFLAGS                       = 0xf000\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x100\n\tFLUSHO                            = 0x800000\n\tF_CLOSEM                          = 0xa\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0xc\n\tF_FSCTL                           = -0x80000000\n\tF_FSDIRMASK                       = 0x70000000\n\tF_FSIN                            = 0x10000000\n\tF_FSINOUT                         = 0x30000000\n\tF_FSOUT                           = 0x20000000\n\tF_FSPRIV                          = 0x8000\n\tF_FSVOID                          = 0x40000000\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETNOSIGPIPE                    = 0xd\n\tF_GETOWN                          = 0x5\n\tF_MAXFD                           = 0xb\n\tF_OK                              = 0x0\n\tF_PARAM_MASK                      = 0xfff\n\tF_PARAM_MAX                       = 0xfff\n\tF_RDLCK                           = 0x1\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETNOSIGPIPE                    = 0xe\n\tF_SETOWN                          = 0x6\n\tF_UNLCK                           = 0x2\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFAN_ARRIVAL                      = 0x0\n\tIFAN_DEPARTURE                    = 0x1\n\tIFA_ROUTE                         = 0x1\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_BROADCAST                     = 0x2\n\tIFF_CANTCHANGE                    = 0x8f52\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_BSC                           = 0x53\n\tIFT_CARP                          = 0xf8\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DOCSCABLEUPSTREAMCHANNEL      = 0xcd\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ECONET                        = 0xce\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf2\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INFINIBAND                    = 0xc7\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L2VLAN                        = 0x87\n\tIFT_L3IPVLAN                      = 0x88\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LINEGROUP                     = 0xd2\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PLC                           = 0xae\n\tIFT_PON155                        = 0xcf\n\tIFT_PON622                        = 0xd0\n\tIFT_POS                           = 0xab\n\tIFT_PPP                           = 0x17\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPATM                       = 0xc5\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf1\n\tIFT_Q2931                         = 0xc9\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SIPSIG                        = 0xcc\n\tIFT_SIPTG                         = 0xcb\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0xd7\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TELINK                        = 0xc8\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VIRTUALTG                     = 0xca\n\tIFT_VOICEDID                      = 0xd5\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEEMFGD                    = 0xd3\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFGDEANA                  = 0xd4\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERCABLE                = 0xc6\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_CARP                      = 0x70\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IPV6_ICMP                 = 0x3a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MOBILE                    = 0x37\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_PFSYNC                    = 0xf0\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_VRRP                      = 0x70\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_DONTFRAG                     = 0x3e\n\tIPV6_DSTOPTS                      = 0x32\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FRAGTTL                      = 0x78\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_HOPLIMIT                     = 0x2f\n\tIPV6_HOPOPTS                      = 0x31\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_NEXTHOP                      = 0x30\n\tIPV6_PATHMTU                      = 0x2c\n\tIPV6_PKTINFO                      = 0x2e\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVDSTOPTS                  = 0x28\n\tIPV6_RECVHOPLIMIT                 = 0x25\n\tIPV6_RECVHOPOPTS                  = 0x27\n\tIPV6_RECVPATHMTU                  = 0x2b\n\tIPV6_RECVPKTINFO                  = 0x24\n\tIPV6_RECVRTHDR                    = 0x26\n\tIPV6_RECVTCLASS                   = 0x39\n\tIPV6_RTHDR                        = 0x33\n\tIPV6_RTHDRDSTOPTS                 = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x3d\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_USE_MIN_MTU                  = 0x2a\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_EF                             = 0x8000\n\tIP_ERRORMTU                       = 0x15\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x16\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_MEMBERSHIPS                = 0x14\n\tIP_MF                             = 0x2000\n\tIP_MINFRAGSIZE                    = 0x45\n\tIP_MINTTL                         = 0x18\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OPTIONS                        = 0x1\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTTL                        = 0x17\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_TOS                            = 0x3\n\tIP_TTL                            = 0x4\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x6\n\tMADV_NORMAL                       = 0x0\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_SPACEAVAIL                   = 0x5\n\tMADV_WILLNEED                     = 0x3\n\tMAP_ALIGNMENT_16MB                = 0x18000000\n\tMAP_ALIGNMENT_1TB                 = 0x28000000\n\tMAP_ALIGNMENT_256TB               = 0x30000000\n\tMAP_ALIGNMENT_4GB                 = 0x20000000\n\tMAP_ALIGNMENT_64KB                = 0x10000000\n\tMAP_ALIGNMENT_64PB                = 0x38000000\n\tMAP_ALIGNMENT_MASK                = -0x1000000\n\tMAP_ALIGNMENT_SHIFT               = 0x18\n\tMAP_ANON                          = 0x1000\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_INHERIT                       = 0x80\n\tMAP_INHERIT_COPY                  = 0x1\n\tMAP_INHERIT_DEFAULT               = 0x1\n\tMAP_INHERIT_DONATE_COPY           = 0x3\n\tMAP_INHERIT_NONE                  = 0x2\n\tMAP_INHERIT_SHARE                 = 0x0\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_SHARED                        = 0x1\n\tMAP_STACK                         = 0x2000\n\tMAP_TRYFIXED                      = 0x400\n\tMAP_WIRED                         = 0x800\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMSG_BCAST                         = 0x100\n\tMSG_CMSG_CLOEXEC                  = 0x800\n\tMSG_CONTROLMBUF                   = 0x2000000\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOR                           = 0x8\n\tMSG_IOVUSRSPACE                   = 0x4000000\n\tMSG_LENUSRSPACE                   = 0x8000000\n\tMSG_MCAST                         = 0x200\n\tMSG_NAMEMBUF                      = 0x1000000\n\tMSG_NBIO                          = 0x1000\n\tMSG_NOSIGNAL                      = 0x400\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_TRUNC                         = 0x10\n\tMSG_USERFLAGS                     = 0xffffff\n\tMSG_WAITALL                       = 0x40\n\tMS_ASYNC                          = 0x1\n\tMS_INVALIDATE                     = 0x2\n\tMS_SYNC                           = 0x4\n\tNAME_MAX                          = 0x1ff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x5\n\tNET_RT_MAXID                      = 0x6\n\tNET_RT_OIFLIST                    = 0x4\n\tNET_RT_OOIFLIST                   = 0x3\n\tNOFLSH                            = 0x80000000\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_CHILD                        = 0x4\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_PCTRLMASK                    = 0xf0000000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tOFIOGETBMAP                       = 0xc004667a\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tO_ACCMODE                         = 0x3\n\tO_ALT_IO                          = 0x40000\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x400000\n\tO_CREAT                           = 0x200\n\tO_DIRECT                          = 0x80000\n\tO_DIRECTORY                       = 0x200000\n\tO_DSYNC                           = 0x10000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x8000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_NOSIGPIPE                       = 0x1000000\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_RSYNC                           = 0x20000\n\tO_SHLOCK                          = 0x10\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPRI_IOFLUSH                       = 0x7c\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tRLIMIT_AS                         = 0xa\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0x9\n\tRTAX_NETMASK                      = 0x2\n\tRTAX_TAG                          = 0x8\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_NETMASK                       = 0x4\n\tRTA_TAG                           = 0x100\n\tRTF_ANNOUNCE                      = 0x20000\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_CLONED                        = 0x2000\n\tRTF_CLONING                       = 0x100\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_LLINFO                        = 0x400\n\tRTF_MASK                          = 0x80\n\tRTF_MODIFIED                      = 0x20\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_REJECT                        = 0x8\n\tRTF_SRC                           = 0x10000\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_CHGADDR                       = 0x15\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_GET                           = 0x4\n\tRTM_IEEE80211                     = 0x11\n\tRTM_IFANNOUNCE                    = 0x10\n\tRTM_IFINFO                        = 0x14\n\tRTM_LLINFO_UPD                    = 0x13\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_OIFINFO                       = 0xf\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_OOIFINFO                      = 0xe\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_SETGATE                       = 0x12\n\tRTM_VERSION                       = 0x4\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x4\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x8\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80906931\n\tSIOCADDRT                         = 0x8030720a\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCALIFADDR                      = 0x8118691c\n\tSIOCATMARK                        = 0x40047307\n\tSIOCDELMULTI                      = 0x80906932\n\tSIOCDELRT                         = 0x8030720b\n\tSIOCDIFADDR                       = 0x80906919\n\tSIOCDIFPHYADDR                    = 0x80906949\n\tSIOCDLIFADDR                      = 0x8118691e\n\tSIOCGDRVSPEC                      = 0xc01c697b\n\tSIOCGETPFSYNC                     = 0xc09069f8\n\tSIOCGETSGCNT                      = 0xc0147534\n\tSIOCGETVIFCNT                     = 0xc0147533\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0906921\n\tSIOCGIFADDRPREF                   = 0xc0946920\n\tSIOCGIFALIAS                      = 0xc040691b\n\tSIOCGIFBRDADDR                    = 0xc0906923\n\tSIOCGIFCAP                        = 0xc0206976\n\tSIOCGIFCONF                       = 0xc0086926\n\tSIOCGIFDATA                       = 0xc0946985\n\tSIOCGIFDLT                        = 0xc0906977\n\tSIOCGIFDSTADDR                    = 0xc0906922\n\tSIOCGIFFLAGS                      = 0xc0906911\n\tSIOCGIFGENERIC                    = 0xc090693a\n\tSIOCGIFMEDIA                      = 0xc0286936\n\tSIOCGIFMETRIC                     = 0xc0906917\n\tSIOCGIFMTU                        = 0xc090697e\n\tSIOCGIFNETMASK                    = 0xc0906925\n\tSIOCGIFPDSTADDR                   = 0xc0906948\n\tSIOCGIFPSRCADDR                   = 0xc0906947\n\tSIOCGLIFADDR                      = 0xc118691d\n\tSIOCGLIFPHYADDR                   = 0xc118694b\n\tSIOCGLINKSTR                      = 0xc01c6987\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCGVH                           = 0xc0906983\n\tSIOCIFCREATE                      = 0x8090697a\n\tSIOCIFDESTROY                     = 0x80906979\n\tSIOCIFGCLONERS                    = 0xc00c6978\n\tSIOCINITIFADDR                    = 0xc0446984\n\tSIOCSDRVSPEC                      = 0x801c697b\n\tSIOCSETPFSYNC                     = 0x809069f7\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8090690c\n\tSIOCSIFADDRPREF                   = 0x8094691f\n\tSIOCSIFBRDADDR                    = 0x80906913\n\tSIOCSIFCAP                        = 0x80206975\n\tSIOCSIFDSTADDR                    = 0x8090690e\n\tSIOCSIFFLAGS                      = 0x80906910\n\tSIOCSIFGENERIC                    = 0x80906939\n\tSIOCSIFMEDIA                      = 0xc0906935\n\tSIOCSIFMETRIC                     = 0x80906918\n\tSIOCSIFMTU                        = 0x8090697f\n\tSIOCSIFNETMASK                    = 0x80906916\n\tSIOCSIFPHYADDR                    = 0x80406946\n\tSIOCSLIFPHYADDR                   = 0x8118694a\n\tSIOCSLINKSTR                      = 0x801c6988\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSIOCSVH                           = 0xc0906982\n\tSIOCZIFDATA                       = 0xc0946986\n\tSOCK_CLOEXEC                      = 0x10000000\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_FLAGS_MASK                   = 0xf0000000\n\tSOCK_NONBLOCK                     = 0x20000000\n\tSOCK_NOSIGPIPE                    = 0x40000000\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_ACCEPTFILTER                   = 0x1000\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LINGER                         = 0x80\n\tSO_NOHEADER                       = 0x100a\n\tSO_NOSIGPIPE                      = 0x800\n\tSO_OOBINLINE                      = 0x100\n\tSO_OVERFLOWED                     = 0x1009\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x100c\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x100b\n\tSO_TIMESTAMP                      = 0x2000\n\tSO_TYPE                           = 0x1008\n\tSO_USELOOPBACK                    = 0x40\n\tSYSCTL_VERSION                    = 0x1000000\n\tSYSCTL_VERS_0                     = 0x0\n\tSYSCTL_VERS_1                     = 0x1000000\n\tSYSCTL_VERS_MASK                  = 0xff000000\n\tS_ARCH1                           = 0x10000\n\tS_ARCH2                           = 0x20000\n\tS_BLKSIZE                         = 0x200\n\tS_IEXEC                           = 0x40\n\tS_IFBLK                           = 0x6000\n\tS_IFCHR                           = 0x2000\n\tS_IFDIR                           = 0x4000\n\tS_IFIFO                           = 0x1000\n\tS_IFLNK                           = 0xa000\n\tS_IFMT                            = 0xf000\n\tS_IFREG                           = 0x8000\n\tS_IFSOCK                          = 0xc000\n\tS_IFWHT                           = 0xe000\n\tS_IREAD                           = 0x100\n\tS_IRGRP                           = 0x20\n\tS_IROTH                           = 0x4\n\tS_IRUSR                           = 0x100\n\tS_IRWXG                           = 0x38\n\tS_IRWXO                           = 0x7\n\tS_IRWXU                           = 0x1c0\n\tS_ISGID                           = 0x400\n\tS_ISTXT                           = 0x200\n\tS_ISUID                           = 0x800\n\tS_ISVTX                           = 0x200\n\tS_IWGRP                           = 0x10\n\tS_IWOTH                           = 0x2\n\tS_IWRITE                          = 0x80\n\tS_IWUSR                           = 0x80\n\tS_IXGRP                           = 0x8\n\tS_IXOTH                           = 0x1\n\tS_IXUSR                           = 0x40\n\tS_LOGIN_SET                       = 0x1\n\tTCIFLUSH                          = 0x1\n\tTCIOFLUSH                         = 0x3\n\tTCOFLUSH                          = 0x2\n\tTCP_CONGCTL                       = 0x20\n\tTCP_KEEPCNT                       = 0x6\n\tTCP_KEEPIDLE                      = 0x3\n\tTCP_KEEPINIT                      = 0x7\n\tTCP_KEEPINTVL                     = 0x5\n\tTCP_MAXBURST                      = 0x4\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MD5SIG                        = 0x10\n\tTCP_MINMSS                        = 0xd8\n\tTCP_MSS                           = 0x218\n\tTCP_NODELAY                       = 0x1\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x400c7458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLAG_CDTRCTS                  = 0x10\n\tTIOCFLAG_CLOCAL                   = 0x2\n\tTIOCFLAG_CRTSCTS                  = 0x4\n\tTIOCFLAG_MDMBUF                   = 0x8\n\tTIOCFLAG_SOFTCAR                  = 0x1\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGFLAGS                        = 0x4004745d\n\tTIOCGLINED                        = 0x40207442\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGQSIZE                        = 0x40047481\n\tTIOCGRANTPT                       = 0x20007447\n\tTIOCGSID                          = 0x40047463\n\tTIOCGSIZE                         = 0x40087468\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCPTMGET                        = 0x40287446\n\tTIOCPTSNAME                       = 0x40287448\n\tTIOCRCVFRAME                      = 0x80047445\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSFLAGS                        = 0x8004745c\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSLINED                        = 0x80207443\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSQSIZE                        = 0x80047480\n\tTIOCSSIZE                         = 0x80087467\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x80047465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCUCNTL                         = 0x80047466\n\tTIOCXMTFRAME                      = 0x80047444\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWALL                              = 0x8\n\tWALLSIG                           = 0x8\n\tWALTSIG                           = 0x4\n\tWCLONE                            = 0x4\n\tWCOREFLAG                         = 0x80\n\tWNOHANG                           = 0x1\n\tWNOWAIT                           = 0x10000\n\tWNOZOMBIE                         = 0x20000\n\tWOPTSCHECKED                      = 0x40000\n\tWSTOPPED                          = 0x7f\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMSG         = syscall.Errno(0x58)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x57)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x52)\n\tEILSEQ          = syscall.Errno(0x55)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x60)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5e)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x5d)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODATA         = syscall.Errno(0x59)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x5f)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x53)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x5a)\n\tENOSTR          = syscall.Errno(0x5b)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x56)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x60)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIME           = syscall.Errno(0x5c)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x20)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large or too small\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol option not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"connection timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"identifier removed\",\n\t83: \"no message of desired type\",\n\t84: \"value too large to be stored in data type\",\n\t85: \"illegal byte sequence\",\n\t86: \"not supported\",\n\t87: \"operation Canceled\",\n\t88: \"bad or Corrupt message\",\n\t89: \"no message available\",\n\t90: \"no STREAM resources\",\n\t91: \"not a STREAM\",\n\t92: \"STREAM ioctl timeout\",\n\t93: \"attribute not found\",\n\t94: \"multihop attempted\",\n\t95: \"link has been severed\",\n\t96: \"protocol error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"stopped (signal)\",\n\t18: \"stopped\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"power fail/restart\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go",
    "content": "// mkerrors.sh -m64\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n// +build amd64,netbsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_ARP                            = 0x1c\n\tAF_BLUETOOTH                      = 0x1f\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1a\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x20\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x18\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1a\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x23\n\tAF_MPLS                           = 0x21\n\tAF_NATM                           = 0x1b\n\tAF_NS                             = 0x6\n\tAF_OROUTE                         = 0x11\n\tAF_OSI                            = 0x7\n\tAF_PUP                            = 0x4\n\tAF_ROUTE                          = 0x22\n\tAF_SNA                            = 0xb\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tARPHRD_ARCNET                     = 0x7\n\tARPHRD_ETHER                      = 0x1\n\tARPHRD_FRELAY                     = 0xf\n\tARPHRD_IEEE1394                   = 0x18\n\tARPHRD_IEEE802                    = 0x6\n\tARPHRD_STRIP                      = 0x17\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB460800                           = 0x70800\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB921600                           = 0xe1000\n\tB9600                             = 0x2580\n\tBIOCFEEDBACK                      = 0x8004427d\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc0104277\n\tBIOCGETIF                         = 0x4090426b\n\tBIOCGFEEDBACK                     = 0x4004427c\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRTIMEOUT                     = 0x4010427b\n\tBIOCGSEESENT                      = 0x40044278\n\tBIOCGSTATS                        = 0x4080426f\n\tBIOCGSTATSOLD                     = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044276\n\tBIOCSETF                          = 0x80104267\n\tBIOCSETIF                         = 0x8090426c\n\tBIOCSFEEDBACK                     = 0x8004427d\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRTIMEOUT                     = 0x8010427a\n\tBIOCSSEESENT                      = 0x80044279\n\tBIOCSTCPF                         = 0x80104272\n\tBIOCSUDPF                         = 0x80104273\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x8\n\tBPF_ALIGNMENT32                   = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DFLTBUFSIZE                   = 0x100000\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x1000000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCLONE_CSIGNAL                     = 0xff\n\tCLONE_FILES                       = 0x400\n\tCLONE_FS                          = 0x200\n\tCLONE_PID                         = 0x1000\n\tCLONE_PTRACE                      = 0x2000\n\tCLONE_SIGHAND                     = 0x800\n\tCLONE_VFORK                       = 0x4000\n\tCLONE_VM                          = 0x100\n\tCREAD                             = 0x800\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tCTL_QUERY                         = -0x2\n\tDIOCBSFLUSH                       = 0x20006478\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_AOS                           = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CAN_SOCKETCAN                 = 0xe3\n\tDLT_CHAOS                         = 0x5\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DECT                          = 0xdd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FC_2                          = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS        = 0xe1\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_GSMTAP_ABIS                   = 0xda\n\tDLT_GSMTAP_UM                     = 0xd9\n\tDLT_HDLC                          = 0x10\n\tDLT_HHDLC                         = 0x79\n\tDLT_HIPPI                         = 0xf\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IPNET                         = 0xe2\n\tDLT_IPV4                          = 0xe4\n\tDLT_IPV6                          = 0xe5\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_EVDEV                   = 0xd8\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MPLS                          = 0xdb\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0xe\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_RAWAF_MASK                    = 0x2240000\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xd\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_USB_LINUX_MMAPPED             = 0xdc\n\tDLT_WIHART                        = 0xdf\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEMUL_LINUX                        = 0x1\n\tEMUL_LINUX32                      = 0x5\n\tEMUL_MAXID                        = 0x6\n\tETHERCAP_JUMBO_MTU                = 0x4\n\tETHERCAP_VLAN_HWTAGGING           = 0x2\n\tETHERCAP_VLAN_MTU                 = 0x1\n\tETHERMIN                          = 0x2e\n\tETHERMTU                          = 0x5dc\n\tETHERMTU_JUMBO                    = 0x2328\n\tETHERTYPE_8023                    = 0x4\n\tETHERTYPE_AARP                    = 0x80f3\n\tETHERTYPE_ACCTON                  = 0x8390\n\tETHERTYPE_AEONIC                  = 0x8036\n\tETHERTYPE_ALPHA                   = 0x814a\n\tETHERTYPE_AMBER                   = 0x6008\n\tETHERTYPE_AMOEBA                  = 0x8145\n\tETHERTYPE_APOLLO                  = 0x80f7\n\tETHERTYPE_APOLLODOMAIN            = 0x8019\n\tETHERTYPE_APPLETALK               = 0x809b\n\tETHERTYPE_APPLITEK                = 0x80c7\n\tETHERTYPE_ARGONAUT                = 0x803a\n\tETHERTYPE_ARP                     = 0x806\n\tETHERTYPE_AT                      = 0x809b\n\tETHERTYPE_ATALK                   = 0x809b\n\tETHERTYPE_ATOMIC                  = 0x86df\n\tETHERTYPE_ATT                     = 0x8069\n\tETHERTYPE_ATTSTANFORD             = 0x8008\n\tETHERTYPE_AUTOPHON                = 0x806a\n\tETHERTYPE_AXIS                    = 0x8856\n\tETHERTYPE_BCLOOP                  = 0x9003\n\tETHERTYPE_BOFL                    = 0x8102\n\tETHERTYPE_CABLETRON               = 0x7034\n\tETHERTYPE_CHAOS                   = 0x804\n\tETHERTYPE_COMDESIGN               = 0x806c\n\tETHERTYPE_COMPUGRAPHIC            = 0x806d\n\tETHERTYPE_COUNTERPOINT            = 0x8062\n\tETHERTYPE_CRONUS                  = 0x8004\n\tETHERTYPE_CRONUSVLN               = 0x8003\n\tETHERTYPE_DCA                     = 0x1234\n\tETHERTYPE_DDE                     = 0x807b\n\tETHERTYPE_DEBNI                   = 0xaaaa\n\tETHERTYPE_DECAM                   = 0x8048\n\tETHERTYPE_DECCUST                 = 0x6006\n\tETHERTYPE_DECDIAG                 = 0x6005\n\tETHERTYPE_DECDNS                  = 0x803c\n\tETHERTYPE_DECDTS                  = 0x803e\n\tETHERTYPE_DECEXPER                = 0x6000\n\tETHERTYPE_DECLAST                 = 0x8041\n\tETHERTYPE_DECLTM                  = 0x803f\n\tETHERTYPE_DECMUMPS                = 0x6009\n\tETHERTYPE_DECNETBIOS              = 0x8040\n\tETHERTYPE_DELTACON                = 0x86de\n\tETHERTYPE_DIDDLE                  = 0x4321\n\tETHERTYPE_DLOG1                   = 0x660\n\tETHERTYPE_DLOG2                   = 0x661\n\tETHERTYPE_DN                      = 0x6003\n\tETHERTYPE_DOGFIGHT                = 0x1989\n\tETHERTYPE_DSMD                    = 0x8039\n\tETHERTYPE_ECMA                    = 0x803\n\tETHERTYPE_ENCRYPT                 = 0x803d\n\tETHERTYPE_ES                      = 0x805d\n\tETHERTYPE_EXCELAN                 = 0x8010\n\tETHERTYPE_EXPERDATA               = 0x8049\n\tETHERTYPE_FLIP                    = 0x8146\n\tETHERTYPE_FLOWCONTROL             = 0x8808\n\tETHERTYPE_FRARP                   = 0x808\n\tETHERTYPE_GENDYN                  = 0x8068\n\tETHERTYPE_HAYES                   = 0x8130\n\tETHERTYPE_HIPPI_FP                = 0x8180\n\tETHERTYPE_HITACHI                 = 0x8820\n\tETHERTYPE_HP                      = 0x8005\n\tETHERTYPE_IEEEPUP                 = 0xa00\n\tETHERTYPE_IEEEPUPAT               = 0xa01\n\tETHERTYPE_IMLBL                   = 0x4c42\n\tETHERTYPE_IMLBLDIAG               = 0x424c\n\tETHERTYPE_IP                      = 0x800\n\tETHERTYPE_IPAS                    = 0x876c\n\tETHERTYPE_IPV6                    = 0x86dd\n\tETHERTYPE_IPX                     = 0x8137\n\tETHERTYPE_IPXNEW                  = 0x8037\n\tETHERTYPE_KALPANA                 = 0x8582\n\tETHERTYPE_LANBRIDGE               = 0x8038\n\tETHERTYPE_LANPROBE                = 0x8888\n\tETHERTYPE_LAT                     = 0x6004\n\tETHERTYPE_LBACK                   = 0x9000\n\tETHERTYPE_LITTLE                  = 0x8060\n\tETHERTYPE_LOGICRAFT               = 0x8148\n\tETHERTYPE_LOOPBACK                = 0x9000\n\tETHERTYPE_MATRA                   = 0x807a\n\tETHERTYPE_MAX                     = 0xffff\n\tETHERTYPE_MERIT                   = 0x807c\n\tETHERTYPE_MICP                    = 0x873a\n\tETHERTYPE_MOPDL                   = 0x6001\n\tETHERTYPE_MOPRC                   = 0x6002\n\tETHERTYPE_MOTOROLA                = 0x818d\n\tETHERTYPE_MPLS                    = 0x8847\n\tETHERTYPE_MPLS_MCAST              = 0x8848\n\tETHERTYPE_MUMPS                   = 0x813f\n\tETHERTYPE_NBPCC                   = 0x3c04\n\tETHERTYPE_NBPCLAIM                = 0x3c09\n\tETHERTYPE_NBPCLREQ                = 0x3c05\n\tETHERTYPE_NBPCLRSP                = 0x3c06\n\tETHERTYPE_NBPCREQ                 = 0x3c02\n\tETHERTYPE_NBPCRSP                 = 0x3c03\n\tETHERTYPE_NBPDG                   = 0x3c07\n\tETHERTYPE_NBPDGB                  = 0x3c08\n\tETHERTYPE_NBPDLTE                 = 0x3c0a\n\tETHERTYPE_NBPRAR                  = 0x3c0c\n\tETHERTYPE_NBPRAS                  = 0x3c0b\n\tETHERTYPE_NBPRST                  = 0x3c0d\n\tETHERTYPE_NBPSCD                  = 0x3c01\n\tETHERTYPE_NBPVCD                  = 0x3c00\n\tETHERTYPE_NBS                     = 0x802\n\tETHERTYPE_NCD                     = 0x8149\n\tETHERTYPE_NESTAR                  = 0x8006\n\tETHERTYPE_NETBEUI                 = 0x8191\n\tETHERTYPE_NOVELL                  = 0x8138\n\tETHERTYPE_NS                      = 0x600\n\tETHERTYPE_NSAT                    = 0x601\n\tETHERTYPE_NSCOMPAT                = 0x807\n\tETHERTYPE_NTRAILER                = 0x10\n\tETHERTYPE_OS9                     = 0x7007\n\tETHERTYPE_OS9NET                  = 0x7009\n\tETHERTYPE_PACER                   = 0x80c6\n\tETHERTYPE_PAE                     = 0x888e\n\tETHERTYPE_PCS                     = 0x4242\n\tETHERTYPE_PLANNING                = 0x8044\n\tETHERTYPE_PPP                     = 0x880b\n\tETHERTYPE_PPPOE                   = 0x8864\n\tETHERTYPE_PPPOEDISC               = 0x8863\n\tETHERTYPE_PRIMENTS                = 0x7031\n\tETHERTYPE_PUP                     = 0x200\n\tETHERTYPE_PUPAT                   = 0x200\n\tETHERTYPE_RACAL                   = 0x7030\n\tETHERTYPE_RATIONAL                = 0x8150\n\tETHERTYPE_RAWFR                   = 0x6559\n\tETHERTYPE_RCL                     = 0x1995\n\tETHERTYPE_RDP                     = 0x8739\n\tETHERTYPE_RETIX                   = 0x80f2\n\tETHERTYPE_REVARP                  = 0x8035\n\tETHERTYPE_SCA                     = 0x6007\n\tETHERTYPE_SECTRA                  = 0x86db\n\tETHERTYPE_SECUREDATA              = 0x876d\n\tETHERTYPE_SGITW                   = 0x817e\n\tETHERTYPE_SG_BOUNCE               = 0x8016\n\tETHERTYPE_SG_DIAG                 = 0x8013\n\tETHERTYPE_SG_NETGAMES             = 0x8014\n\tETHERTYPE_SG_RESV                 = 0x8015\n\tETHERTYPE_SIMNET                  = 0x5208\n\tETHERTYPE_SLOWPROTOCOLS           = 0x8809\n\tETHERTYPE_SNA                     = 0x80d5\n\tETHERTYPE_SNMP                    = 0x814c\n\tETHERTYPE_SONIX                   = 0xfaf5\n\tETHERTYPE_SPIDER                  = 0x809f\n\tETHERTYPE_SPRITE                  = 0x500\n\tETHERTYPE_STP                     = 0x8181\n\tETHERTYPE_TALARIS                 = 0x812b\n\tETHERTYPE_TALARISMC               = 0x852b\n\tETHERTYPE_TCPCOMP                 = 0x876b\n\tETHERTYPE_TCPSM                   = 0x9002\n\tETHERTYPE_TEC                     = 0x814f\n\tETHERTYPE_TIGAN                   = 0x802f\n\tETHERTYPE_TRAIL                   = 0x1000\n\tETHERTYPE_TRANSETHER              = 0x6558\n\tETHERTYPE_TYMSHARE                = 0x802e\n\tETHERTYPE_UBBST                   = 0x7005\n\tETHERTYPE_UBDEBUG                 = 0x900\n\tETHERTYPE_UBDIAGLOOP              = 0x7002\n\tETHERTYPE_UBDL                    = 0x7000\n\tETHERTYPE_UBNIU                   = 0x7001\n\tETHERTYPE_UBNMC                   = 0x7003\n\tETHERTYPE_VALID                   = 0x1600\n\tETHERTYPE_VARIAN                  = 0x80dd\n\tETHERTYPE_VAXELN                  = 0x803b\n\tETHERTYPE_VEECO                   = 0x8067\n\tETHERTYPE_VEXP                    = 0x805b\n\tETHERTYPE_VGLAB                   = 0x8131\n\tETHERTYPE_VINES                   = 0xbad\n\tETHERTYPE_VINESECHO               = 0xbaf\n\tETHERTYPE_VINESLOOP               = 0xbae\n\tETHERTYPE_VITAL                   = 0xff00\n\tETHERTYPE_VLAN                    = 0x8100\n\tETHERTYPE_VLTLMAN                 = 0x8080\n\tETHERTYPE_VPROD                   = 0x805c\n\tETHERTYPE_VURESERVED              = 0x8147\n\tETHERTYPE_WATERLOO                = 0x8130\n\tETHERTYPE_WELLFLEET               = 0x8103\n\tETHERTYPE_X25                     = 0x805\n\tETHERTYPE_X75                     = 0x801\n\tETHERTYPE_XNSSM                   = 0x9001\n\tETHERTYPE_XTP                     = 0x817d\n\tETHER_ADDR_LEN                    = 0x6\n\tETHER_CRC_LEN                     = 0x4\n\tETHER_CRC_POLY_BE                 = 0x4c11db6\n\tETHER_CRC_POLY_LE                 = 0xedb88320\n\tETHER_HDR_LEN                     = 0xe\n\tETHER_MAX_LEN                     = 0x5ee\n\tETHER_MAX_LEN_JUMBO               = 0x233a\n\tETHER_MIN_LEN                     = 0x40\n\tETHER_PPPOE_ENCAP_LEN             = 0x8\n\tETHER_TYPE_LEN                    = 0x2\n\tETHER_VLAN_ENCAP_LEN              = 0x4\n\tEVFILT_AIO                        = 0x2\n\tEVFILT_PROC                       = 0x4\n\tEVFILT_READ                       = 0x0\n\tEVFILT_SIGNAL                     = 0x5\n\tEVFILT_SYSCOUNT                   = 0x7\n\tEVFILT_TIMER                      = 0x6\n\tEVFILT_VNODE                      = 0x3\n\tEVFILT_WRITE                      = 0x1\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_SYSFLAGS                       = 0xf000\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x100\n\tFLUSHO                            = 0x800000\n\tF_CLOSEM                          = 0xa\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0xc\n\tF_FSCTL                           = -0x80000000\n\tF_FSDIRMASK                       = 0x70000000\n\tF_FSIN                            = 0x10000000\n\tF_FSINOUT                         = 0x30000000\n\tF_FSOUT                           = 0x20000000\n\tF_FSPRIV                          = 0x8000\n\tF_FSVOID                          = 0x40000000\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETNOSIGPIPE                    = 0xd\n\tF_GETOWN                          = 0x5\n\tF_MAXFD                           = 0xb\n\tF_OK                              = 0x0\n\tF_PARAM_MASK                      = 0xfff\n\tF_PARAM_MAX                       = 0xfff\n\tF_RDLCK                           = 0x1\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETNOSIGPIPE                    = 0xe\n\tF_SETOWN                          = 0x6\n\tF_UNLCK                           = 0x2\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFAN_ARRIVAL                      = 0x0\n\tIFAN_DEPARTURE                    = 0x1\n\tIFA_ROUTE                         = 0x1\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_BROADCAST                     = 0x2\n\tIFF_CANTCHANGE                    = 0x8f52\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_BSC                           = 0x53\n\tIFT_CARP                          = 0xf8\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DOCSCABLEUPSTREAMCHANNEL      = 0xcd\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ECONET                        = 0xce\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf2\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INFINIBAND                    = 0xc7\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L2VLAN                        = 0x87\n\tIFT_L3IPVLAN                      = 0x88\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LINEGROUP                     = 0xd2\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PLC                           = 0xae\n\tIFT_PON155                        = 0xcf\n\tIFT_PON622                        = 0xd0\n\tIFT_POS                           = 0xab\n\tIFT_PPP                           = 0x17\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPATM                       = 0xc5\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf1\n\tIFT_Q2931                         = 0xc9\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SIPSIG                        = 0xcc\n\tIFT_SIPTG                         = 0xcb\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0xd7\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TELINK                        = 0xc8\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VIRTUALTG                     = 0xca\n\tIFT_VOICEDID                      = 0xd5\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEEMFGD                    = 0xd3\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFGDEANA                  = 0xd4\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERCABLE                = 0xc6\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_CARP                      = 0x70\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IPV6_ICMP                 = 0x3a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MOBILE                    = 0x37\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_PFSYNC                    = 0xf0\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_VRRP                      = 0x70\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_DONTFRAG                     = 0x3e\n\tIPV6_DSTOPTS                      = 0x32\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FRAGTTL                      = 0x78\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_HOPLIMIT                     = 0x2f\n\tIPV6_HOPOPTS                      = 0x31\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_NEXTHOP                      = 0x30\n\tIPV6_PATHMTU                      = 0x2c\n\tIPV6_PKTINFO                      = 0x2e\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVDSTOPTS                  = 0x28\n\tIPV6_RECVHOPLIMIT                 = 0x25\n\tIPV6_RECVHOPOPTS                  = 0x27\n\tIPV6_RECVPATHMTU                  = 0x2b\n\tIPV6_RECVPKTINFO                  = 0x24\n\tIPV6_RECVRTHDR                    = 0x26\n\tIPV6_RECVTCLASS                   = 0x39\n\tIPV6_RTHDR                        = 0x33\n\tIPV6_RTHDRDSTOPTS                 = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x3d\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_USE_MIN_MTU                  = 0x2a\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_EF                             = 0x8000\n\tIP_ERRORMTU                       = 0x15\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x16\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_MEMBERSHIPS                = 0x14\n\tIP_MF                             = 0x2000\n\tIP_MINFRAGSIZE                    = 0x45\n\tIP_MINTTL                         = 0x18\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OPTIONS                        = 0x1\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTTL                        = 0x17\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_TOS                            = 0x3\n\tIP_TTL                            = 0x4\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x6\n\tMADV_NORMAL                       = 0x0\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_SPACEAVAIL                   = 0x5\n\tMADV_WILLNEED                     = 0x3\n\tMAP_ALIGNMENT_16MB                = 0x18000000\n\tMAP_ALIGNMENT_1TB                 = 0x28000000\n\tMAP_ALIGNMENT_256TB               = 0x30000000\n\tMAP_ALIGNMENT_4GB                 = 0x20000000\n\tMAP_ALIGNMENT_64KB                = 0x10000000\n\tMAP_ALIGNMENT_64PB                = 0x38000000\n\tMAP_ALIGNMENT_MASK                = -0x1000000\n\tMAP_ALIGNMENT_SHIFT               = 0x18\n\tMAP_ANON                          = 0x1000\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_INHERIT                       = 0x80\n\tMAP_INHERIT_COPY                  = 0x1\n\tMAP_INHERIT_DEFAULT               = 0x1\n\tMAP_INHERIT_DONATE_COPY           = 0x3\n\tMAP_INHERIT_NONE                  = 0x2\n\tMAP_INHERIT_SHARE                 = 0x0\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_SHARED                        = 0x1\n\tMAP_STACK                         = 0x2000\n\tMAP_TRYFIXED                      = 0x400\n\tMAP_WIRED                         = 0x800\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMSG_BCAST                         = 0x100\n\tMSG_CMSG_CLOEXEC                  = 0x800\n\tMSG_CONTROLMBUF                   = 0x2000000\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOR                           = 0x8\n\tMSG_IOVUSRSPACE                   = 0x4000000\n\tMSG_LENUSRSPACE                   = 0x8000000\n\tMSG_MCAST                         = 0x200\n\tMSG_NAMEMBUF                      = 0x1000000\n\tMSG_NBIO                          = 0x1000\n\tMSG_NOSIGNAL                      = 0x400\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_TRUNC                         = 0x10\n\tMSG_USERFLAGS                     = 0xffffff\n\tMSG_WAITALL                       = 0x40\n\tMS_ASYNC                          = 0x1\n\tMS_INVALIDATE                     = 0x2\n\tMS_SYNC                           = 0x4\n\tNAME_MAX                          = 0x1ff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x5\n\tNET_RT_MAXID                      = 0x6\n\tNET_RT_OIFLIST                    = 0x4\n\tNET_RT_OOIFLIST                   = 0x3\n\tNOFLSH                            = 0x80000000\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_CHILD                        = 0x4\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_PCTRLMASK                    = 0xf0000000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tOFIOGETBMAP                       = 0xc004667a\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tO_ACCMODE                         = 0x3\n\tO_ALT_IO                          = 0x40000\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x400000\n\tO_CREAT                           = 0x200\n\tO_DIRECT                          = 0x80000\n\tO_DIRECTORY                       = 0x200000\n\tO_DSYNC                           = 0x10000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x8000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_NOSIGPIPE                       = 0x1000000\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_RSYNC                           = 0x20000\n\tO_SHLOCK                          = 0x10\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPRI_IOFLUSH                       = 0x7c\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tRLIMIT_AS                         = 0xa\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0x9\n\tRTAX_NETMASK                      = 0x2\n\tRTAX_TAG                          = 0x8\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_NETMASK                       = 0x4\n\tRTA_TAG                           = 0x100\n\tRTF_ANNOUNCE                      = 0x20000\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_CLONED                        = 0x2000\n\tRTF_CLONING                       = 0x100\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_LLINFO                        = 0x400\n\tRTF_MASK                          = 0x80\n\tRTF_MODIFIED                      = 0x20\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_REJECT                        = 0x8\n\tRTF_SRC                           = 0x10000\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_CHGADDR                       = 0x15\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_GET                           = 0x4\n\tRTM_IEEE80211                     = 0x11\n\tRTM_IFANNOUNCE                    = 0x10\n\tRTM_IFINFO                        = 0x14\n\tRTM_LLINFO_UPD                    = 0x13\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_OIFINFO                       = 0xf\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_OOIFINFO                      = 0xe\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_SETGATE                       = 0x12\n\tRTM_VERSION                       = 0x4\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x4\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x8\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80906931\n\tSIOCADDRT                         = 0x8038720a\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCALIFADDR                      = 0x8118691c\n\tSIOCATMARK                        = 0x40047307\n\tSIOCDELMULTI                      = 0x80906932\n\tSIOCDELRT                         = 0x8038720b\n\tSIOCDIFADDR                       = 0x80906919\n\tSIOCDIFPHYADDR                    = 0x80906949\n\tSIOCDLIFADDR                      = 0x8118691e\n\tSIOCGDRVSPEC                      = 0xc028697b\n\tSIOCGETPFSYNC                     = 0xc09069f8\n\tSIOCGETSGCNT                      = 0xc0207534\n\tSIOCGETVIFCNT                     = 0xc0287533\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0906921\n\tSIOCGIFADDRPREF                   = 0xc0986920\n\tSIOCGIFALIAS                      = 0xc040691b\n\tSIOCGIFBRDADDR                    = 0xc0906923\n\tSIOCGIFCAP                        = 0xc0206976\n\tSIOCGIFCONF                       = 0xc0106926\n\tSIOCGIFDATA                       = 0xc0986985\n\tSIOCGIFDLT                        = 0xc0906977\n\tSIOCGIFDSTADDR                    = 0xc0906922\n\tSIOCGIFFLAGS                      = 0xc0906911\n\tSIOCGIFGENERIC                    = 0xc090693a\n\tSIOCGIFMEDIA                      = 0xc0306936\n\tSIOCGIFMETRIC                     = 0xc0906917\n\tSIOCGIFMTU                        = 0xc090697e\n\tSIOCGIFNETMASK                    = 0xc0906925\n\tSIOCGIFPDSTADDR                   = 0xc0906948\n\tSIOCGIFPSRCADDR                   = 0xc0906947\n\tSIOCGLIFADDR                      = 0xc118691d\n\tSIOCGLIFPHYADDR                   = 0xc118694b\n\tSIOCGLINKSTR                      = 0xc0286987\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCGVH                           = 0xc0906983\n\tSIOCIFCREATE                      = 0x8090697a\n\tSIOCIFDESTROY                     = 0x80906979\n\tSIOCIFGCLONERS                    = 0xc0106978\n\tSIOCINITIFADDR                    = 0xc0706984\n\tSIOCSDRVSPEC                      = 0x8028697b\n\tSIOCSETPFSYNC                     = 0x809069f7\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8090690c\n\tSIOCSIFADDRPREF                   = 0x8098691f\n\tSIOCSIFBRDADDR                    = 0x80906913\n\tSIOCSIFCAP                        = 0x80206975\n\tSIOCSIFDSTADDR                    = 0x8090690e\n\tSIOCSIFFLAGS                      = 0x80906910\n\tSIOCSIFGENERIC                    = 0x80906939\n\tSIOCSIFMEDIA                      = 0xc0906935\n\tSIOCSIFMETRIC                     = 0x80906918\n\tSIOCSIFMTU                        = 0x8090697f\n\tSIOCSIFNETMASK                    = 0x80906916\n\tSIOCSIFPHYADDR                    = 0x80406946\n\tSIOCSLIFPHYADDR                   = 0x8118694a\n\tSIOCSLINKSTR                      = 0x80286988\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSIOCSVH                           = 0xc0906982\n\tSIOCZIFDATA                       = 0xc0986986\n\tSOCK_CLOEXEC                      = 0x10000000\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_FLAGS_MASK                   = 0xf0000000\n\tSOCK_NONBLOCK                     = 0x20000000\n\tSOCK_NOSIGPIPE                    = 0x40000000\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_ACCEPTFILTER                   = 0x1000\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LINGER                         = 0x80\n\tSO_NOHEADER                       = 0x100a\n\tSO_NOSIGPIPE                      = 0x800\n\tSO_OOBINLINE                      = 0x100\n\tSO_OVERFLOWED                     = 0x1009\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x100c\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x100b\n\tSO_TIMESTAMP                      = 0x2000\n\tSO_TYPE                           = 0x1008\n\tSO_USELOOPBACK                    = 0x40\n\tSYSCTL_VERSION                    = 0x1000000\n\tSYSCTL_VERS_0                     = 0x0\n\tSYSCTL_VERS_1                     = 0x1000000\n\tSYSCTL_VERS_MASK                  = 0xff000000\n\tS_ARCH1                           = 0x10000\n\tS_ARCH2                           = 0x20000\n\tS_BLKSIZE                         = 0x200\n\tS_IEXEC                           = 0x40\n\tS_IFBLK                           = 0x6000\n\tS_IFCHR                           = 0x2000\n\tS_IFDIR                           = 0x4000\n\tS_IFIFO                           = 0x1000\n\tS_IFLNK                           = 0xa000\n\tS_IFMT                            = 0xf000\n\tS_IFREG                           = 0x8000\n\tS_IFSOCK                          = 0xc000\n\tS_IFWHT                           = 0xe000\n\tS_IREAD                           = 0x100\n\tS_IRGRP                           = 0x20\n\tS_IROTH                           = 0x4\n\tS_IRUSR                           = 0x100\n\tS_IRWXG                           = 0x38\n\tS_IRWXO                           = 0x7\n\tS_IRWXU                           = 0x1c0\n\tS_ISGID                           = 0x400\n\tS_ISTXT                           = 0x200\n\tS_ISUID                           = 0x800\n\tS_ISVTX                           = 0x200\n\tS_IWGRP                           = 0x10\n\tS_IWOTH                           = 0x2\n\tS_IWRITE                          = 0x80\n\tS_IWUSR                           = 0x80\n\tS_IXGRP                           = 0x8\n\tS_IXOTH                           = 0x1\n\tS_IXUSR                           = 0x40\n\tS_LOGIN_SET                       = 0x1\n\tTCIFLUSH                          = 0x1\n\tTCIOFLUSH                         = 0x3\n\tTCOFLUSH                          = 0x2\n\tTCP_CONGCTL                       = 0x20\n\tTCP_KEEPCNT                       = 0x6\n\tTCP_KEEPIDLE                      = 0x3\n\tTCP_KEEPINIT                      = 0x7\n\tTCP_KEEPINTVL                     = 0x5\n\tTCP_MAXBURST                      = 0x4\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MD5SIG                        = 0x10\n\tTCP_MINMSS                        = 0xd8\n\tTCP_MSS                           = 0x218\n\tTCP_NODELAY                       = 0x1\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x40107458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLAG_CDTRCTS                  = 0x10\n\tTIOCFLAG_CLOCAL                   = 0x2\n\tTIOCFLAG_CRTSCTS                  = 0x4\n\tTIOCFLAG_MDMBUF                   = 0x8\n\tTIOCFLAG_SOFTCAR                  = 0x1\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGFLAGS                        = 0x4004745d\n\tTIOCGLINED                        = 0x40207442\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGQSIZE                        = 0x40047481\n\tTIOCGRANTPT                       = 0x20007447\n\tTIOCGSID                          = 0x40047463\n\tTIOCGSIZE                         = 0x40087468\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCPTMGET                        = 0x40287446\n\tTIOCPTSNAME                       = 0x40287448\n\tTIOCRCVFRAME                      = 0x80087445\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSFLAGS                        = 0x8004745c\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSLINED                        = 0x80207443\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSQSIZE                        = 0x80047480\n\tTIOCSSIZE                         = 0x80087467\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x80047465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCUCNTL                         = 0x80047466\n\tTIOCXMTFRAME                      = 0x80087444\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWALL                              = 0x8\n\tWALLSIG                           = 0x8\n\tWALTSIG                           = 0x4\n\tWCLONE                            = 0x4\n\tWCOREFLAG                         = 0x80\n\tWNOHANG                           = 0x1\n\tWNOWAIT                           = 0x10000\n\tWNOZOMBIE                         = 0x20000\n\tWOPTSCHECKED                      = 0x40000\n\tWSTOPPED                          = 0x7f\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMSG         = syscall.Errno(0x58)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x57)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x52)\n\tEILSEQ          = syscall.Errno(0x55)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x60)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5e)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x5d)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODATA         = syscall.Errno(0x59)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x5f)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x53)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x5a)\n\tENOSTR          = syscall.Errno(0x5b)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x56)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x60)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIME           = syscall.Errno(0x5c)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x20)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large or too small\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol option not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"connection timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"identifier removed\",\n\t83: \"no message of desired type\",\n\t84: \"value too large to be stored in data type\",\n\t85: \"illegal byte sequence\",\n\t86: \"not supported\",\n\t87: \"operation Canceled\",\n\t88: \"bad or Corrupt message\",\n\t89: \"no message available\",\n\t90: \"no STREAM resources\",\n\t91: \"not a STREAM\",\n\t92: \"STREAM ioctl timeout\",\n\t93: \"attribute not found\",\n\t94: \"multihop attempted\",\n\t95: \"link has been severed\",\n\t96: \"protocol error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"stopped (signal)\",\n\t18: \"stopped\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"power fail/restart\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go",
    "content": "// mkerrors.sh -marm\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n// +build arm,netbsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -marm _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_ARP                            = 0x1c\n\tAF_BLUETOOTH                      = 0x1f\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1a\n\tAF_ECMA                           = 0x8\n\tAF_HYLINK                         = 0xf\n\tAF_IEEE80211                      = 0x20\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x18\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1a\n\tAF_ISO                            = 0x7\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x23\n\tAF_MPLS                           = 0x21\n\tAF_NATM                           = 0x1b\n\tAF_NS                             = 0x6\n\tAF_OROUTE                         = 0x11\n\tAF_OSI                            = 0x7\n\tAF_PUP                            = 0x4\n\tAF_ROUTE                          = 0x22\n\tAF_SNA                            = 0xb\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tARPHRD_ARCNET                     = 0x7\n\tARPHRD_ETHER                      = 0x1\n\tARPHRD_FRELAY                     = 0xf\n\tARPHRD_IEEE1394                   = 0x18\n\tARPHRD_IEEE802                    = 0x6\n\tARPHRD_STRIP                      = 0x17\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB460800                           = 0x70800\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB921600                           = 0xe1000\n\tB9600                             = 0x2580\n\tBIOCFEEDBACK                      = 0x8004427d\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc0084277\n\tBIOCGETIF                         = 0x4090426b\n\tBIOCGFEEDBACK                     = 0x4004427c\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRTIMEOUT                     = 0x400c427b\n\tBIOCGSEESENT                      = 0x40044278\n\tBIOCGSTATS                        = 0x4080426f\n\tBIOCGSTATSOLD                     = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDLT                          = 0x80044276\n\tBIOCSETF                          = 0x80084267\n\tBIOCSETIF                         = 0x8090426c\n\tBIOCSFEEDBACK                     = 0x8004427d\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRTIMEOUT                     = 0x800c427a\n\tBIOCSSEESENT                      = 0x80044279\n\tBIOCSTCPF                         = 0x80084272\n\tBIOCSUDPF                         = 0x80084273\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALIGNMENT32                   = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DFLTBUFSIZE                   = 0x100000\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x1000000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCREAD                             = 0x800\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0x14\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tCTL_QUERY                         = -0x2\n\tDIOCBSFLUSH                       = 0x20006478\n\tDLT_A429                          = 0xb8\n\tDLT_A653_ICM                      = 0xb9\n\tDLT_AIRONET_HEADER                = 0x78\n\tDLT_AOS                           = 0xde\n\tDLT_APPLE_IP_OVER_IEEE1394        = 0x8a\n\tDLT_ARCNET                        = 0x7\n\tDLT_ARCNET_LINUX                  = 0x81\n\tDLT_ATM_CLIP                      = 0x13\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AURORA                        = 0x7e\n\tDLT_AX25                          = 0x3\n\tDLT_AX25_KISS                     = 0xca\n\tDLT_BACNET_MS_TP                  = 0xa5\n\tDLT_BLUETOOTH_HCI_H4              = 0xbb\n\tDLT_BLUETOOTH_HCI_H4_WITH_PHDR    = 0xc9\n\tDLT_CAN20B                        = 0xbe\n\tDLT_CAN_SOCKETCAN                 = 0xe3\n\tDLT_CHAOS                         = 0x5\n\tDLT_CISCO_IOS                     = 0x76\n\tDLT_C_HDLC                        = 0x68\n\tDLT_C_HDLC_WITH_DIR               = 0xcd\n\tDLT_DECT                          = 0xdd\n\tDLT_DOCSIS                        = 0x8f\n\tDLT_ECONET                        = 0x73\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0x6d\n\tDLT_ERF                           = 0xc5\n\tDLT_ERF_ETH                       = 0xaf\n\tDLT_ERF_POS                       = 0xb0\n\tDLT_FC_2                          = 0xe0\n\tDLT_FC_2_WITH_FRAME_DELIMS        = 0xe1\n\tDLT_FDDI                          = 0xa\n\tDLT_FLEXRAY                       = 0xd2\n\tDLT_FRELAY                        = 0x6b\n\tDLT_FRELAY_WITH_DIR               = 0xce\n\tDLT_GCOM_SERIAL                   = 0xad\n\tDLT_GCOM_T1E1                     = 0xac\n\tDLT_GPF_F                         = 0xab\n\tDLT_GPF_T                         = 0xaa\n\tDLT_GPRS_LLC                      = 0xa9\n\tDLT_GSMTAP_ABIS                   = 0xda\n\tDLT_GSMTAP_UM                     = 0xd9\n\tDLT_HDLC                          = 0x10\n\tDLT_HHDLC                         = 0x79\n\tDLT_HIPPI                         = 0xf\n\tDLT_IBM_SN                        = 0x92\n\tDLT_IBM_SP                        = 0x91\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS          = 0xa3\n\tDLT_IEEE802_15_4                  = 0xc3\n\tDLT_IEEE802_15_4_LINUX            = 0xbf\n\tDLT_IEEE802_15_4_NONASK_PHY       = 0xd7\n\tDLT_IEEE802_16_MAC_CPS            = 0xbc\n\tDLT_IEEE802_16_MAC_CPS_RADIO      = 0xc1\n\tDLT_IPMB                          = 0xc7\n\tDLT_IPMB_LINUX                    = 0xd1\n\tDLT_IPNET                         = 0xe2\n\tDLT_IPV4                          = 0xe4\n\tDLT_IPV6                          = 0xe5\n\tDLT_IP_OVER_FC                    = 0x7a\n\tDLT_JUNIPER_ATM1                  = 0x89\n\tDLT_JUNIPER_ATM2                  = 0x87\n\tDLT_JUNIPER_CHDLC                 = 0xb5\n\tDLT_JUNIPER_ES                    = 0x84\n\tDLT_JUNIPER_ETHER                 = 0xb2\n\tDLT_JUNIPER_FRELAY                = 0xb4\n\tDLT_JUNIPER_GGSN                  = 0x85\n\tDLT_JUNIPER_ISM                   = 0xc2\n\tDLT_JUNIPER_MFR                   = 0x86\n\tDLT_JUNIPER_MLFR                  = 0x83\n\tDLT_JUNIPER_MLPPP                 = 0x82\n\tDLT_JUNIPER_MONITOR               = 0xa4\n\tDLT_JUNIPER_PIC_PEER              = 0xae\n\tDLT_JUNIPER_PPP                   = 0xb3\n\tDLT_JUNIPER_PPPOE                 = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM             = 0xa8\n\tDLT_JUNIPER_SERVICES              = 0x88\n\tDLT_JUNIPER_ST                    = 0xc8\n\tDLT_JUNIPER_VP                    = 0xb7\n\tDLT_LAPB_WITH_DIR                 = 0xcf\n\tDLT_LAPD                          = 0xcb\n\tDLT_LIN                           = 0xd4\n\tDLT_LINUX_EVDEV                   = 0xd8\n\tDLT_LINUX_IRDA                    = 0x90\n\tDLT_LINUX_LAPD                    = 0xb1\n\tDLT_LINUX_SLL                     = 0x71\n\tDLT_LOOP                          = 0x6c\n\tDLT_LTALK                         = 0x72\n\tDLT_MFR                           = 0xb6\n\tDLT_MOST                          = 0xd3\n\tDLT_MPLS                          = 0xdb\n\tDLT_MTP2                          = 0x8c\n\tDLT_MTP2_WITH_PHDR                = 0x8b\n\tDLT_MTP3                          = 0x8d\n\tDLT_NULL                          = 0x0\n\tDLT_PCI_EXP                       = 0x7d\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPI                           = 0xc0\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0xe\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_PPPD                      = 0xa6\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PPP_WITH_DIR                  = 0xcc\n\tDLT_PRISM_HEADER                  = 0x77\n\tDLT_PRONET                        = 0x4\n\tDLT_RAIF1                         = 0xc6\n\tDLT_RAW                           = 0xc\n\tDLT_RAWAF_MASK                    = 0x2240000\n\tDLT_RIO                           = 0x7c\n\tDLT_SCCP                          = 0x8e\n\tDLT_SITA                          = 0xc4\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xd\n\tDLT_SUNATM                        = 0x7b\n\tDLT_SYMANTEC_FIREWALL             = 0x63\n\tDLT_TZSP                          = 0x80\n\tDLT_USB                           = 0xba\n\tDLT_USB_LINUX                     = 0xbd\n\tDLT_USB_LINUX_MMAPPED             = 0xdc\n\tDLT_WIHART                        = 0xdf\n\tDLT_X2E_SERIAL                    = 0xd5\n\tDLT_X2E_XORAYA                    = 0xd6\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tDT_WHT                            = 0xe\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEMUL_LINUX                        = 0x1\n\tEMUL_LINUX32                      = 0x5\n\tEMUL_MAXID                        = 0x6\n\tETHERCAP_JUMBO_MTU                = 0x4\n\tETHERCAP_VLAN_HWTAGGING           = 0x2\n\tETHERCAP_VLAN_MTU                 = 0x1\n\tETHERMIN                          = 0x2e\n\tETHERMTU                          = 0x5dc\n\tETHERMTU_JUMBO                    = 0x2328\n\tETHERTYPE_8023                    = 0x4\n\tETHERTYPE_AARP                    = 0x80f3\n\tETHERTYPE_ACCTON                  = 0x8390\n\tETHERTYPE_AEONIC                  = 0x8036\n\tETHERTYPE_ALPHA                   = 0x814a\n\tETHERTYPE_AMBER                   = 0x6008\n\tETHERTYPE_AMOEBA                  = 0x8145\n\tETHERTYPE_APOLLO                  = 0x80f7\n\tETHERTYPE_APOLLODOMAIN            = 0x8019\n\tETHERTYPE_APPLETALK               = 0x809b\n\tETHERTYPE_APPLITEK                = 0x80c7\n\tETHERTYPE_ARGONAUT                = 0x803a\n\tETHERTYPE_ARP                     = 0x806\n\tETHERTYPE_AT                      = 0x809b\n\tETHERTYPE_ATALK                   = 0x809b\n\tETHERTYPE_ATOMIC                  = 0x86df\n\tETHERTYPE_ATT                     = 0x8069\n\tETHERTYPE_ATTSTANFORD             = 0x8008\n\tETHERTYPE_AUTOPHON                = 0x806a\n\tETHERTYPE_AXIS                    = 0x8856\n\tETHERTYPE_BCLOOP                  = 0x9003\n\tETHERTYPE_BOFL                    = 0x8102\n\tETHERTYPE_CABLETRON               = 0x7034\n\tETHERTYPE_CHAOS                   = 0x804\n\tETHERTYPE_COMDESIGN               = 0x806c\n\tETHERTYPE_COMPUGRAPHIC            = 0x806d\n\tETHERTYPE_COUNTERPOINT            = 0x8062\n\tETHERTYPE_CRONUS                  = 0x8004\n\tETHERTYPE_CRONUSVLN               = 0x8003\n\tETHERTYPE_DCA                     = 0x1234\n\tETHERTYPE_DDE                     = 0x807b\n\tETHERTYPE_DEBNI                   = 0xaaaa\n\tETHERTYPE_DECAM                   = 0x8048\n\tETHERTYPE_DECCUST                 = 0x6006\n\tETHERTYPE_DECDIAG                 = 0x6005\n\tETHERTYPE_DECDNS                  = 0x803c\n\tETHERTYPE_DECDTS                  = 0x803e\n\tETHERTYPE_DECEXPER                = 0x6000\n\tETHERTYPE_DECLAST                 = 0x8041\n\tETHERTYPE_DECLTM                  = 0x803f\n\tETHERTYPE_DECMUMPS                = 0x6009\n\tETHERTYPE_DECNETBIOS              = 0x8040\n\tETHERTYPE_DELTACON                = 0x86de\n\tETHERTYPE_DIDDLE                  = 0x4321\n\tETHERTYPE_DLOG1                   = 0x660\n\tETHERTYPE_DLOG2                   = 0x661\n\tETHERTYPE_DN                      = 0x6003\n\tETHERTYPE_DOGFIGHT                = 0x1989\n\tETHERTYPE_DSMD                    = 0x8039\n\tETHERTYPE_ECMA                    = 0x803\n\tETHERTYPE_ENCRYPT                 = 0x803d\n\tETHERTYPE_ES                      = 0x805d\n\tETHERTYPE_EXCELAN                 = 0x8010\n\tETHERTYPE_EXPERDATA               = 0x8049\n\tETHERTYPE_FLIP                    = 0x8146\n\tETHERTYPE_FLOWCONTROL             = 0x8808\n\tETHERTYPE_FRARP                   = 0x808\n\tETHERTYPE_GENDYN                  = 0x8068\n\tETHERTYPE_HAYES                   = 0x8130\n\tETHERTYPE_HIPPI_FP                = 0x8180\n\tETHERTYPE_HITACHI                 = 0x8820\n\tETHERTYPE_HP                      = 0x8005\n\tETHERTYPE_IEEEPUP                 = 0xa00\n\tETHERTYPE_IEEEPUPAT               = 0xa01\n\tETHERTYPE_IMLBL                   = 0x4c42\n\tETHERTYPE_IMLBLDIAG               = 0x424c\n\tETHERTYPE_IP                      = 0x800\n\tETHERTYPE_IPAS                    = 0x876c\n\tETHERTYPE_IPV6                    = 0x86dd\n\tETHERTYPE_IPX                     = 0x8137\n\tETHERTYPE_IPXNEW                  = 0x8037\n\tETHERTYPE_KALPANA                 = 0x8582\n\tETHERTYPE_LANBRIDGE               = 0x8038\n\tETHERTYPE_LANPROBE                = 0x8888\n\tETHERTYPE_LAT                     = 0x6004\n\tETHERTYPE_LBACK                   = 0x9000\n\tETHERTYPE_LITTLE                  = 0x8060\n\tETHERTYPE_LOGICRAFT               = 0x8148\n\tETHERTYPE_LOOPBACK                = 0x9000\n\tETHERTYPE_MATRA                   = 0x807a\n\tETHERTYPE_MAX                     = 0xffff\n\tETHERTYPE_MERIT                   = 0x807c\n\tETHERTYPE_MICP                    = 0x873a\n\tETHERTYPE_MOPDL                   = 0x6001\n\tETHERTYPE_MOPRC                   = 0x6002\n\tETHERTYPE_MOTOROLA                = 0x818d\n\tETHERTYPE_MPLS                    = 0x8847\n\tETHERTYPE_MPLS_MCAST              = 0x8848\n\tETHERTYPE_MUMPS                   = 0x813f\n\tETHERTYPE_NBPCC                   = 0x3c04\n\tETHERTYPE_NBPCLAIM                = 0x3c09\n\tETHERTYPE_NBPCLREQ                = 0x3c05\n\tETHERTYPE_NBPCLRSP                = 0x3c06\n\tETHERTYPE_NBPCREQ                 = 0x3c02\n\tETHERTYPE_NBPCRSP                 = 0x3c03\n\tETHERTYPE_NBPDG                   = 0x3c07\n\tETHERTYPE_NBPDGB                  = 0x3c08\n\tETHERTYPE_NBPDLTE                 = 0x3c0a\n\tETHERTYPE_NBPRAR                  = 0x3c0c\n\tETHERTYPE_NBPRAS                  = 0x3c0b\n\tETHERTYPE_NBPRST                  = 0x3c0d\n\tETHERTYPE_NBPSCD                  = 0x3c01\n\tETHERTYPE_NBPVCD                  = 0x3c00\n\tETHERTYPE_NBS                     = 0x802\n\tETHERTYPE_NCD                     = 0x8149\n\tETHERTYPE_NESTAR                  = 0x8006\n\tETHERTYPE_NETBEUI                 = 0x8191\n\tETHERTYPE_NOVELL                  = 0x8138\n\tETHERTYPE_NS                      = 0x600\n\tETHERTYPE_NSAT                    = 0x601\n\tETHERTYPE_NSCOMPAT                = 0x807\n\tETHERTYPE_NTRAILER                = 0x10\n\tETHERTYPE_OS9                     = 0x7007\n\tETHERTYPE_OS9NET                  = 0x7009\n\tETHERTYPE_PACER                   = 0x80c6\n\tETHERTYPE_PAE                     = 0x888e\n\tETHERTYPE_PCS                     = 0x4242\n\tETHERTYPE_PLANNING                = 0x8044\n\tETHERTYPE_PPP                     = 0x880b\n\tETHERTYPE_PPPOE                   = 0x8864\n\tETHERTYPE_PPPOEDISC               = 0x8863\n\tETHERTYPE_PRIMENTS                = 0x7031\n\tETHERTYPE_PUP                     = 0x200\n\tETHERTYPE_PUPAT                   = 0x200\n\tETHERTYPE_RACAL                   = 0x7030\n\tETHERTYPE_RATIONAL                = 0x8150\n\tETHERTYPE_RAWFR                   = 0x6559\n\tETHERTYPE_RCL                     = 0x1995\n\tETHERTYPE_RDP                     = 0x8739\n\tETHERTYPE_RETIX                   = 0x80f2\n\tETHERTYPE_REVARP                  = 0x8035\n\tETHERTYPE_SCA                     = 0x6007\n\tETHERTYPE_SECTRA                  = 0x86db\n\tETHERTYPE_SECUREDATA              = 0x876d\n\tETHERTYPE_SGITW                   = 0x817e\n\tETHERTYPE_SG_BOUNCE               = 0x8016\n\tETHERTYPE_SG_DIAG                 = 0x8013\n\tETHERTYPE_SG_NETGAMES             = 0x8014\n\tETHERTYPE_SG_RESV                 = 0x8015\n\tETHERTYPE_SIMNET                  = 0x5208\n\tETHERTYPE_SLOWPROTOCOLS           = 0x8809\n\tETHERTYPE_SNA                     = 0x80d5\n\tETHERTYPE_SNMP                    = 0x814c\n\tETHERTYPE_SONIX                   = 0xfaf5\n\tETHERTYPE_SPIDER                  = 0x809f\n\tETHERTYPE_SPRITE                  = 0x500\n\tETHERTYPE_STP                     = 0x8181\n\tETHERTYPE_TALARIS                 = 0x812b\n\tETHERTYPE_TALARISMC               = 0x852b\n\tETHERTYPE_TCPCOMP                 = 0x876b\n\tETHERTYPE_TCPSM                   = 0x9002\n\tETHERTYPE_TEC                     = 0x814f\n\tETHERTYPE_TIGAN                   = 0x802f\n\tETHERTYPE_TRAIL                   = 0x1000\n\tETHERTYPE_TRANSETHER              = 0x6558\n\tETHERTYPE_TYMSHARE                = 0x802e\n\tETHERTYPE_UBBST                   = 0x7005\n\tETHERTYPE_UBDEBUG                 = 0x900\n\tETHERTYPE_UBDIAGLOOP              = 0x7002\n\tETHERTYPE_UBDL                    = 0x7000\n\tETHERTYPE_UBNIU                   = 0x7001\n\tETHERTYPE_UBNMC                   = 0x7003\n\tETHERTYPE_VALID                   = 0x1600\n\tETHERTYPE_VARIAN                  = 0x80dd\n\tETHERTYPE_VAXELN                  = 0x803b\n\tETHERTYPE_VEECO                   = 0x8067\n\tETHERTYPE_VEXP                    = 0x805b\n\tETHERTYPE_VGLAB                   = 0x8131\n\tETHERTYPE_VINES                   = 0xbad\n\tETHERTYPE_VINESECHO               = 0xbaf\n\tETHERTYPE_VINESLOOP               = 0xbae\n\tETHERTYPE_VITAL                   = 0xff00\n\tETHERTYPE_VLAN                    = 0x8100\n\tETHERTYPE_VLTLMAN                 = 0x8080\n\tETHERTYPE_VPROD                   = 0x805c\n\tETHERTYPE_VURESERVED              = 0x8147\n\tETHERTYPE_WATERLOO                = 0x8130\n\tETHERTYPE_WELLFLEET               = 0x8103\n\tETHERTYPE_X25                     = 0x805\n\tETHERTYPE_X75                     = 0x801\n\tETHERTYPE_XNSSM                   = 0x9001\n\tETHERTYPE_XTP                     = 0x817d\n\tETHER_ADDR_LEN                    = 0x6\n\tETHER_CRC_LEN                     = 0x4\n\tETHER_CRC_POLY_BE                 = 0x4c11db6\n\tETHER_CRC_POLY_LE                 = 0xedb88320\n\tETHER_HDR_LEN                     = 0xe\n\tETHER_MAX_LEN                     = 0x5ee\n\tETHER_MAX_LEN_JUMBO               = 0x233a\n\tETHER_MIN_LEN                     = 0x40\n\tETHER_PPPOE_ENCAP_LEN             = 0x8\n\tETHER_TYPE_LEN                    = 0x2\n\tETHER_VLAN_ENCAP_LEN              = 0x4\n\tEVFILT_AIO                        = 0x2\n\tEVFILT_PROC                       = 0x4\n\tEVFILT_READ                       = 0x0\n\tEVFILT_SIGNAL                     = 0x5\n\tEVFILT_SYSCOUNT                   = 0x7\n\tEVFILT_TIMER                      = 0x6\n\tEVFILT_VNODE                      = 0x3\n\tEVFILT_WRITE                      = 0x1\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_SYSFLAGS                       = 0xf000\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x100\n\tFLUSHO                            = 0x800000\n\tF_CLOSEM                          = 0xa\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0xc\n\tF_FSCTL                           = -0x80000000\n\tF_FSDIRMASK                       = 0x70000000\n\tF_FSIN                            = 0x10000000\n\tF_FSINOUT                         = 0x30000000\n\tF_FSOUT                           = 0x20000000\n\tF_FSPRIV                          = 0x8000\n\tF_FSVOID                          = 0x40000000\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETNOSIGPIPE                    = 0xd\n\tF_GETOWN                          = 0x5\n\tF_MAXFD                           = 0xb\n\tF_OK                              = 0x0\n\tF_PARAM_MASK                      = 0xfff\n\tF_PARAM_MAX                       = 0xfff\n\tF_RDLCK                           = 0x1\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETNOSIGPIPE                    = 0xe\n\tF_SETOWN                          = 0x6\n\tF_UNLCK                           = 0x2\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFAN_ARRIVAL                      = 0x0\n\tIFAN_DEPARTURE                    = 0x1\n\tIFA_ROUTE                         = 0x1\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_BROADCAST                     = 0x2\n\tIFF_CANTCHANGE                    = 0x8f52\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_BSC                           = 0x53\n\tIFT_CARP                          = 0xf8\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DOCSCABLEUPSTREAMCHANNEL      = 0xcd\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ECONET                        = 0xce\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf2\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INFINIBAND                    = 0xc7\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L2VLAN                        = 0x87\n\tIFT_L3IPVLAN                      = 0x88\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LINEGROUP                     = 0xd2\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PLC                           = 0xae\n\tIFT_PON155                        = 0xcf\n\tIFT_PON622                        = 0xd0\n\tIFT_POS                           = 0xab\n\tIFT_PPP                           = 0x17\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPATM                       = 0xc5\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf1\n\tIFT_Q2931                         = 0xc9\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SIPSIG                        = 0xcc\n\tIFT_SIPTG                         = 0xcb\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_STF                           = 0xd7\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TELINK                        = 0xc8\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VIRTUALTG                     = 0xca\n\tIFT_VOICEDID                      = 0xd5\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEEMFGD                    = 0xd3\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFGDEANA                  = 0xd4\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERCABLE                = 0xc6\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LOOPBACKNET                    = 0x7f\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_CARP                      = 0x70\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_IPV6_ICMP                 = 0x3a\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x34\n\tIPPROTO_MOBILE                    = 0x37\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_PFSYNC                    = 0xf0\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_UDP                       = 0x11\n\tIPPROTO_VRRP                      = 0x70\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_DONTFRAG                     = 0x3e\n\tIPV6_DSTOPTS                      = 0x32\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FRAGTTL                      = 0x78\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_HOPLIMIT                     = 0x2f\n\tIPV6_HOPOPTS                      = 0x31\n\tIPV6_IPSEC_POLICY                 = 0x1c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_NEXTHOP                      = 0x30\n\tIPV6_PATHMTU                      = 0x2c\n\tIPV6_PKTINFO                      = 0x2e\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVDSTOPTS                  = 0x28\n\tIPV6_RECVHOPLIMIT                 = 0x25\n\tIPV6_RECVHOPOPTS                  = 0x27\n\tIPV6_RECVPATHMTU                  = 0x2b\n\tIPV6_RECVPKTINFO                  = 0x24\n\tIPV6_RECVRTHDR                    = 0x26\n\tIPV6_RECVTCLASS                   = 0x39\n\tIPV6_RTHDR                        = 0x33\n\tIPV6_RTHDRDSTOPTS                 = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x3d\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_USE_MIN_MTU                  = 0x2a\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_EF                             = 0x8000\n\tIP_ERRORMTU                       = 0x15\n\tIP_HDRINCL                        = 0x2\n\tIP_IPSEC_POLICY                   = 0x16\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_MEMBERSHIPS                = 0x14\n\tIP_MF                             = 0x2000\n\tIP_MINFRAGSIZE                    = 0x45\n\tIP_MINTTL                         = 0x18\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OPTIONS                        = 0x1\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVIF                         = 0x14\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVTTL                        = 0x17\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_TOS                            = 0x3\n\tIP_TTL                            = 0x4\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x6\n\tMADV_NORMAL                       = 0x0\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_SPACEAVAIL                   = 0x5\n\tMADV_WILLNEED                     = 0x3\n\tMAP_ALIGNMENT_16MB                = 0x18000000\n\tMAP_ALIGNMENT_1TB                 = 0x28000000\n\tMAP_ALIGNMENT_256TB               = 0x30000000\n\tMAP_ALIGNMENT_4GB                 = 0x20000000\n\tMAP_ALIGNMENT_64KB                = 0x10000000\n\tMAP_ALIGNMENT_64PB                = 0x38000000\n\tMAP_ALIGNMENT_MASK                = -0x1000000\n\tMAP_ALIGNMENT_SHIFT               = 0x18\n\tMAP_ANON                          = 0x1000\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_INHERIT                       = 0x80\n\tMAP_INHERIT_COPY                  = 0x1\n\tMAP_INHERIT_DEFAULT               = 0x1\n\tMAP_INHERIT_DONATE_COPY           = 0x3\n\tMAP_INHERIT_NONE                  = 0x2\n\tMAP_INHERIT_SHARE                 = 0x0\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_SHARED                        = 0x1\n\tMAP_STACK                         = 0x2000\n\tMAP_TRYFIXED                      = 0x400\n\tMAP_WIRED                         = 0x800\n\tMSG_BCAST                         = 0x100\n\tMSG_CMSG_CLOEXEC                  = 0x800\n\tMSG_CONTROLMBUF                   = 0x2000000\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOR                           = 0x8\n\tMSG_IOVUSRSPACE                   = 0x4000000\n\tMSG_LENUSRSPACE                   = 0x8000000\n\tMSG_MCAST                         = 0x200\n\tMSG_NAMEMBUF                      = 0x1000000\n\tMSG_NBIO                          = 0x1000\n\tMSG_NOSIGNAL                      = 0x400\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_TRUNC                         = 0x10\n\tMSG_USERFLAGS                     = 0xffffff\n\tMSG_WAITALL                       = 0x40\n\tMS_ASYNC                          = 0x1\n\tMS_INVALIDATE                     = 0x2\n\tMS_SYNC                           = 0x4\n\tNAME_MAX                          = 0x1ff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x5\n\tNET_RT_MAXID                      = 0x6\n\tNET_RT_OIFLIST                    = 0x4\n\tNET_RT_OOIFLIST                   = 0x3\n\tNOFLSH                            = 0x80000000\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_CHILD                        = 0x4\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_PCTRLMASK                    = 0xf0000000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tOFIOGETBMAP                       = 0xc004667a\n\tONLCR                             = 0x2\n\tONLRET                            = 0x40\n\tONOCR                             = 0x20\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tO_ACCMODE                         = 0x3\n\tO_ALT_IO                          = 0x40000\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x400000\n\tO_CREAT                           = 0x200\n\tO_DIRECT                          = 0x80000\n\tO_DIRECTORY                       = 0x200000\n\tO_DSYNC                           = 0x10000\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x8000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_NOSIGPIPE                       = 0x1000000\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_RSYNC                           = 0x20000\n\tO_SHLOCK                          = 0x10\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tPRI_IOFLUSH                       = 0x7c\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tRLIMIT_AS                         = 0xa\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_MAX                          = 0x9\n\tRTAX_NETMASK                      = 0x2\n\tRTAX_TAG                          = 0x8\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_NETMASK                       = 0x4\n\tRTA_TAG                           = 0x100\n\tRTF_ANNOUNCE                      = 0x20000\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_CLONED                        = 0x2000\n\tRTF_CLONING                       = 0x100\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_LLINFO                        = 0x400\n\tRTF_MASK                          = 0x80\n\tRTF_MODIFIED                      = 0x20\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_REJECT                        = 0x8\n\tRTF_SRC                           = 0x10000\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_CHGADDR                       = 0x15\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_GET                           = 0x4\n\tRTM_IEEE80211                     = 0x11\n\tRTM_IFANNOUNCE                    = 0x10\n\tRTM_IFINFO                        = 0x14\n\tRTM_LLINFO_UPD                    = 0x13\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_OIFINFO                       = 0xf\n\tRTM_OLDADD                        = 0x9\n\tRTM_OLDDEL                        = 0xa\n\tRTM_OOIFINFO                      = 0xe\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_SETGATE                       = 0x12\n\tRTM_VERSION                       = 0x4\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tSCM_CREDS                         = 0x4\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x8\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80906931\n\tSIOCADDRT                         = 0x8030720a\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCALIFADDR                      = 0x8118691c\n\tSIOCATMARK                        = 0x40047307\n\tSIOCDELMULTI                      = 0x80906932\n\tSIOCDELRT                         = 0x8030720b\n\tSIOCDIFADDR                       = 0x80906919\n\tSIOCDIFPHYADDR                    = 0x80906949\n\tSIOCDLIFADDR                      = 0x8118691e\n\tSIOCGDRVSPEC                      = 0xc01c697b\n\tSIOCGETPFSYNC                     = 0xc09069f8\n\tSIOCGETSGCNT                      = 0xc0147534\n\tSIOCGETVIFCNT                     = 0xc0147533\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0906921\n\tSIOCGIFADDRPREF                   = 0xc0946920\n\tSIOCGIFALIAS                      = 0xc040691b\n\tSIOCGIFBRDADDR                    = 0xc0906923\n\tSIOCGIFCAP                        = 0xc0206976\n\tSIOCGIFCONF                       = 0xc0086926\n\tSIOCGIFDATA                       = 0xc0946985\n\tSIOCGIFDLT                        = 0xc0906977\n\tSIOCGIFDSTADDR                    = 0xc0906922\n\tSIOCGIFFLAGS                      = 0xc0906911\n\tSIOCGIFGENERIC                    = 0xc090693a\n\tSIOCGIFMEDIA                      = 0xc0286936\n\tSIOCGIFMETRIC                     = 0xc0906917\n\tSIOCGIFMTU                        = 0xc090697e\n\tSIOCGIFNETMASK                    = 0xc0906925\n\tSIOCGIFPDSTADDR                   = 0xc0906948\n\tSIOCGIFPSRCADDR                   = 0xc0906947\n\tSIOCGLIFADDR                      = 0xc118691d\n\tSIOCGLIFPHYADDR                   = 0xc118694b\n\tSIOCGLINKSTR                      = 0xc01c6987\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCGVH                           = 0xc0906983\n\tSIOCIFCREATE                      = 0x8090697a\n\tSIOCIFDESTROY                     = 0x80906979\n\tSIOCIFGCLONERS                    = 0xc00c6978\n\tSIOCINITIFADDR                    = 0xc0446984\n\tSIOCSDRVSPEC                      = 0x801c697b\n\tSIOCSETPFSYNC                     = 0x809069f7\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8090690c\n\tSIOCSIFADDRPREF                   = 0x8094691f\n\tSIOCSIFBRDADDR                    = 0x80906913\n\tSIOCSIFCAP                        = 0x80206975\n\tSIOCSIFDSTADDR                    = 0x8090690e\n\tSIOCSIFFLAGS                      = 0x80906910\n\tSIOCSIFGENERIC                    = 0x80906939\n\tSIOCSIFMEDIA                      = 0xc0906935\n\tSIOCSIFMETRIC                     = 0x80906918\n\tSIOCSIFMTU                        = 0x8090697f\n\tSIOCSIFNETMASK                    = 0x80906916\n\tSIOCSIFPHYADDR                    = 0x80406946\n\tSIOCSLIFPHYADDR                   = 0x8118694a\n\tSIOCSLINKSTR                      = 0x801c6988\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSIOCSVH                           = 0xc0906982\n\tSIOCZIFDATA                       = 0xc0946986\n\tSOCK_CLOEXEC                      = 0x10000000\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_FLAGS_MASK                   = 0xf0000000\n\tSOCK_NONBLOCK                     = 0x20000000\n\tSOCK_NOSIGPIPE                    = 0x40000000\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_ACCEPTFILTER                   = 0x1000\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LINGER                         = 0x80\n\tSO_NOHEADER                       = 0x100a\n\tSO_NOSIGPIPE                      = 0x800\n\tSO_OOBINLINE                      = 0x100\n\tSO_OVERFLOWED                     = 0x1009\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x100c\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x100b\n\tSO_TIMESTAMP                      = 0x2000\n\tSO_TYPE                           = 0x1008\n\tSO_USELOOPBACK                    = 0x40\n\tSYSCTL_VERSION                    = 0x1000000\n\tSYSCTL_VERS_0                     = 0x0\n\tSYSCTL_VERS_1                     = 0x1000000\n\tSYSCTL_VERS_MASK                  = 0xff000000\n\tS_ARCH1                           = 0x10000\n\tS_ARCH2                           = 0x20000\n\tS_BLKSIZE                         = 0x200\n\tS_IEXEC                           = 0x40\n\tS_IFBLK                           = 0x6000\n\tS_IFCHR                           = 0x2000\n\tS_IFDIR                           = 0x4000\n\tS_IFIFO                           = 0x1000\n\tS_IFLNK                           = 0xa000\n\tS_IFMT                            = 0xf000\n\tS_IFREG                           = 0x8000\n\tS_IFSOCK                          = 0xc000\n\tS_IFWHT                           = 0xe000\n\tS_IREAD                           = 0x100\n\tS_IRGRP                           = 0x20\n\tS_IROTH                           = 0x4\n\tS_IRUSR                           = 0x100\n\tS_IRWXG                           = 0x38\n\tS_IRWXO                           = 0x7\n\tS_IRWXU                           = 0x1c0\n\tS_ISGID                           = 0x400\n\tS_ISTXT                           = 0x200\n\tS_ISUID                           = 0x800\n\tS_ISVTX                           = 0x200\n\tS_IWGRP                           = 0x10\n\tS_IWOTH                           = 0x2\n\tS_IWRITE                          = 0x80\n\tS_IWUSR                           = 0x80\n\tS_IXGRP                           = 0x8\n\tS_IXOTH                           = 0x1\n\tS_IXUSR                           = 0x40\n\tTCIFLUSH                          = 0x1\n\tTCIOFLUSH                         = 0x3\n\tTCOFLUSH                          = 0x2\n\tTCP_CONGCTL                       = 0x20\n\tTCP_KEEPCNT                       = 0x6\n\tTCP_KEEPIDLE                      = 0x3\n\tTCP_KEEPINIT                      = 0x7\n\tTCP_KEEPINTVL                     = 0x5\n\tTCP_MAXBURST                      = 0x4\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MD5SIG                        = 0x10\n\tTCP_MINMSS                        = 0xd8\n\tTCP_MSS                           = 0x218\n\tTCP_NODELAY                       = 0x1\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDCDTIMESTAMP                  = 0x400c7458\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLAG_CDTRCTS                  = 0x10\n\tTIOCFLAG_CLOCAL                   = 0x2\n\tTIOCFLAG_CRTSCTS                  = 0x4\n\tTIOCFLAG_MDMBUF                   = 0x8\n\tTIOCFLAG_SOFTCAR                  = 0x1\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGFLAGS                        = 0x4004745d\n\tTIOCGLINED                        = 0x40207442\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGQSIZE                        = 0x40047481\n\tTIOCGRANTPT                       = 0x20007447\n\tTIOCGSID                          = 0x40047463\n\tTIOCGSIZE                         = 0x40087468\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCPTMGET                        = 0x48087446\n\tTIOCPTSNAME                       = 0x48087448\n\tTIOCRCVFRAME                      = 0x80047445\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSFLAGS                        = 0x8004745c\n\tTIOCSIG                           = 0x2000745f\n\tTIOCSLINED                        = 0x80207443\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSQSIZE                        = 0x80047480\n\tTIOCSSIZE                         = 0x80087467\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x80047465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCUCNTL                         = 0x80047466\n\tTIOCXMTFRAME                      = 0x80047444\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWALL                              = 0x8\n\tWALLSIG                           = 0x8\n\tWALTSIG                           = 0x4\n\tWCLONE                            = 0x4\n\tWCOREFLAG                         = 0x80\n\tWNOHANG                           = 0x1\n\tWNOWAIT                           = 0x10000\n\tWNOZOMBIE                         = 0x20000\n\tWOPTSCHECKED                      = 0x40000\n\tWSTOPPED                          = 0x7f\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADMSG         = syscall.Errno(0x58)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x57)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x52)\n\tEILSEQ          = syscall.Errno(0x55)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x60)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tEMULTIHOP       = syscall.Errno(0x5e)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x5d)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODATA         = syscall.Errno(0x59)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOLINK         = syscall.Errno(0x5f)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x53)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x5a)\n\tENOSTR          = syscall.Errno(0x5b)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x56)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x54)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTO          = syscall.Errno(0x60)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIME           = syscall.Errno(0x5c)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGPWR    = syscall.Signal(0x20)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large or too small\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol option not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"connection timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"identifier removed\",\n\t83: \"no message of desired type\",\n\t84: \"value too large to be stored in data type\",\n\t85: \"illegal byte sequence\",\n\t86: \"not supported\",\n\t87: \"operation Canceled\",\n\t88: \"bad or Corrupt message\",\n\t89: \"no message available\",\n\t90: \"no STREAM resources\",\n\t91: \"not a STREAM\",\n\t92: \"STREAM ioctl timeout\",\n\t93: \"attribute not found\",\n\t94: \"multihop attempted\",\n\t95: \"link has been severed\",\n\t96: \"protocol error\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"stopped (signal)\",\n\t18: \"stopped\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"power fail/restart\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go",
    "content": "// mkerrors.sh -m32\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n// +build 386,openbsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m32 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_BLUETOOTH                      = 0x20\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1a\n\tAF_ECMA                           = 0x8\n\tAF_ENCAP                          = 0x1c\n\tAF_HYLINK                         = 0xf\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x18\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1a\n\tAF_ISO                            = 0x7\n\tAF_KEY                            = 0x1e\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x24\n\tAF_MPLS                           = 0x21\n\tAF_NATM                           = 0x1b\n\tAF_NS                             = 0x6\n\tAF_OSI                            = 0x7\n\tAF_PUP                            = 0x4\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x1d\n\tAF_SNA                            = 0xb\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tARPHRD_ETHER                      = 0x1\n\tARPHRD_FRELAY                     = 0xf\n\tARPHRD_IEEE1394                   = 0x18\n\tARPHRD_IEEE802                    = 0x6\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDIRFILT                      = 0x4004427c\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc008427b\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGFILDROP                      = 0x40044278\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044273\n\tBIOCGRTIMEOUT                     = 0x400c426e\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCLOCK                          = 0x20004276\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDIRFILT                      = 0x8004427d\n\tBIOCSDLT                          = 0x8004427a\n\tBIOCSETF                          = 0x80084267\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSETWF                         = 0x80084277\n\tBIOCSFILDROP                      = 0x80044279\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044272\n\tBIOCSRTIMEOUT                     = 0x800c426d\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DIRECTION_IN                  = 0x1\n\tBPF_DIRECTION_OUT                 = 0x2\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x200000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCREAD                             = 0x800\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0xff\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDIOCOSFPFLUSH                     = 0x2000444e\n\tDLT_ARCNET                        = 0x7\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AX25                          = 0x3\n\tDLT_CHAOS                         = 0x5\n\tDLT_C_HDLC                        = 0x68\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0xd\n\tDLT_FDDI                          = 0xa\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_LOOP                          = 0xc\n\tDLT_MPLS                          = 0xdb\n\tDLT_NULL                          = 0x0\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PRONET                        = 0x4\n\tDLT_RAW                           = 0xe\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEMT_TAGOVF                        = 0x1\n\tEMUL_ENABLED                      = 0x1\n\tEMUL_NATIVE                       = 0x2\n\tENDRUNDISC                        = 0x9\n\tETHERMIN                          = 0x2e\n\tETHERMTU                          = 0x5dc\n\tETHERTYPE_8023                    = 0x4\n\tETHERTYPE_AARP                    = 0x80f3\n\tETHERTYPE_ACCTON                  = 0x8390\n\tETHERTYPE_AEONIC                  = 0x8036\n\tETHERTYPE_ALPHA                   = 0x814a\n\tETHERTYPE_AMBER                   = 0x6008\n\tETHERTYPE_AMOEBA                  = 0x8145\n\tETHERTYPE_AOE                     = 0x88a2\n\tETHERTYPE_APOLLO                  = 0x80f7\n\tETHERTYPE_APOLLODOMAIN            = 0x8019\n\tETHERTYPE_APPLETALK               = 0x809b\n\tETHERTYPE_APPLITEK                = 0x80c7\n\tETHERTYPE_ARGONAUT                = 0x803a\n\tETHERTYPE_ARP                     = 0x806\n\tETHERTYPE_AT                      = 0x809b\n\tETHERTYPE_ATALK                   = 0x809b\n\tETHERTYPE_ATOMIC                  = 0x86df\n\tETHERTYPE_ATT                     = 0x8069\n\tETHERTYPE_ATTSTANFORD             = 0x8008\n\tETHERTYPE_AUTOPHON                = 0x806a\n\tETHERTYPE_AXIS                    = 0x8856\n\tETHERTYPE_BCLOOP                  = 0x9003\n\tETHERTYPE_BOFL                    = 0x8102\n\tETHERTYPE_CABLETRON               = 0x7034\n\tETHERTYPE_CHAOS                   = 0x804\n\tETHERTYPE_COMDESIGN               = 0x806c\n\tETHERTYPE_COMPUGRAPHIC            = 0x806d\n\tETHERTYPE_COUNTERPOINT            = 0x8062\n\tETHERTYPE_CRONUS                  = 0x8004\n\tETHERTYPE_CRONUSVLN               = 0x8003\n\tETHERTYPE_DCA                     = 0x1234\n\tETHERTYPE_DDE                     = 0x807b\n\tETHERTYPE_DEBNI                   = 0xaaaa\n\tETHERTYPE_DECAM                   = 0x8048\n\tETHERTYPE_DECCUST                 = 0x6006\n\tETHERTYPE_DECDIAG                 = 0x6005\n\tETHERTYPE_DECDNS                  = 0x803c\n\tETHERTYPE_DECDTS                  = 0x803e\n\tETHERTYPE_DECEXPER                = 0x6000\n\tETHERTYPE_DECLAST                 = 0x8041\n\tETHERTYPE_DECLTM                  = 0x803f\n\tETHERTYPE_DECMUMPS                = 0x6009\n\tETHERTYPE_DECNETBIOS              = 0x8040\n\tETHERTYPE_DELTACON                = 0x86de\n\tETHERTYPE_DIDDLE                  = 0x4321\n\tETHERTYPE_DLOG1                   = 0x660\n\tETHERTYPE_DLOG2                   = 0x661\n\tETHERTYPE_DN                      = 0x6003\n\tETHERTYPE_DOGFIGHT                = 0x1989\n\tETHERTYPE_DSMD                    = 0x8039\n\tETHERTYPE_ECMA                    = 0x803\n\tETHERTYPE_ENCRYPT                 = 0x803d\n\tETHERTYPE_ES                      = 0x805d\n\tETHERTYPE_EXCELAN                 = 0x8010\n\tETHERTYPE_EXPERDATA               = 0x8049\n\tETHERTYPE_FLIP                    = 0x8146\n\tETHERTYPE_FLOWCONTROL             = 0x8808\n\tETHERTYPE_FRARP                   = 0x808\n\tETHERTYPE_GENDYN                  = 0x8068\n\tETHERTYPE_HAYES                   = 0x8130\n\tETHERTYPE_HIPPI_FP                = 0x8180\n\tETHERTYPE_HITACHI                 = 0x8820\n\tETHERTYPE_HP                      = 0x8005\n\tETHERTYPE_IEEEPUP                 = 0xa00\n\tETHERTYPE_IEEEPUPAT               = 0xa01\n\tETHERTYPE_IMLBL                   = 0x4c42\n\tETHERTYPE_IMLBLDIAG               = 0x424c\n\tETHERTYPE_IP                      = 0x800\n\tETHERTYPE_IPAS                    = 0x876c\n\tETHERTYPE_IPV6                    = 0x86dd\n\tETHERTYPE_IPX                     = 0x8137\n\tETHERTYPE_IPXNEW                  = 0x8037\n\tETHERTYPE_KALPANA                 = 0x8582\n\tETHERTYPE_LANBRIDGE               = 0x8038\n\tETHERTYPE_LANPROBE                = 0x8888\n\tETHERTYPE_LAT                     = 0x6004\n\tETHERTYPE_LBACK                   = 0x9000\n\tETHERTYPE_LITTLE                  = 0x8060\n\tETHERTYPE_LLDP                    = 0x88cc\n\tETHERTYPE_LOGICRAFT               = 0x8148\n\tETHERTYPE_LOOPBACK                = 0x9000\n\tETHERTYPE_MATRA                   = 0x807a\n\tETHERTYPE_MAX                     = 0xffff\n\tETHERTYPE_MERIT                   = 0x807c\n\tETHERTYPE_MICP                    = 0x873a\n\tETHERTYPE_MOPDL                   = 0x6001\n\tETHERTYPE_MOPRC                   = 0x6002\n\tETHERTYPE_MOTOROLA                = 0x818d\n\tETHERTYPE_MPLS                    = 0x8847\n\tETHERTYPE_MPLS_MCAST              = 0x8848\n\tETHERTYPE_MUMPS                   = 0x813f\n\tETHERTYPE_NBPCC                   = 0x3c04\n\tETHERTYPE_NBPCLAIM                = 0x3c09\n\tETHERTYPE_NBPCLREQ                = 0x3c05\n\tETHERTYPE_NBPCLRSP                = 0x3c06\n\tETHERTYPE_NBPCREQ                 = 0x3c02\n\tETHERTYPE_NBPCRSP                 = 0x3c03\n\tETHERTYPE_NBPDG                   = 0x3c07\n\tETHERTYPE_NBPDGB                  = 0x3c08\n\tETHERTYPE_NBPDLTE                 = 0x3c0a\n\tETHERTYPE_NBPRAR                  = 0x3c0c\n\tETHERTYPE_NBPRAS                  = 0x3c0b\n\tETHERTYPE_NBPRST                  = 0x3c0d\n\tETHERTYPE_NBPSCD                  = 0x3c01\n\tETHERTYPE_NBPVCD                  = 0x3c00\n\tETHERTYPE_NBS                     = 0x802\n\tETHERTYPE_NCD                     = 0x8149\n\tETHERTYPE_NESTAR                  = 0x8006\n\tETHERTYPE_NETBEUI                 = 0x8191\n\tETHERTYPE_NOVELL                  = 0x8138\n\tETHERTYPE_NS                      = 0x600\n\tETHERTYPE_NSAT                    = 0x601\n\tETHERTYPE_NSCOMPAT                = 0x807\n\tETHERTYPE_NTRAILER                = 0x10\n\tETHERTYPE_OS9                     = 0x7007\n\tETHERTYPE_OS9NET                  = 0x7009\n\tETHERTYPE_PACER                   = 0x80c6\n\tETHERTYPE_PAE                     = 0x888e\n\tETHERTYPE_PCS                     = 0x4242\n\tETHERTYPE_PLANNING                = 0x8044\n\tETHERTYPE_PPP                     = 0x880b\n\tETHERTYPE_PPPOE                   = 0x8864\n\tETHERTYPE_PPPOEDISC               = 0x8863\n\tETHERTYPE_PRIMENTS                = 0x7031\n\tETHERTYPE_PUP                     = 0x200\n\tETHERTYPE_PUPAT                   = 0x200\n\tETHERTYPE_QINQ                    = 0x88a8\n\tETHERTYPE_RACAL                   = 0x7030\n\tETHERTYPE_RATIONAL                = 0x8150\n\tETHERTYPE_RAWFR                   = 0x6559\n\tETHERTYPE_RCL                     = 0x1995\n\tETHERTYPE_RDP                     = 0x8739\n\tETHERTYPE_RETIX                   = 0x80f2\n\tETHERTYPE_REVARP                  = 0x8035\n\tETHERTYPE_SCA                     = 0x6007\n\tETHERTYPE_SECTRA                  = 0x86db\n\tETHERTYPE_SECUREDATA              = 0x876d\n\tETHERTYPE_SGITW                   = 0x817e\n\tETHERTYPE_SG_BOUNCE               = 0x8016\n\tETHERTYPE_SG_DIAG                 = 0x8013\n\tETHERTYPE_SG_NETGAMES             = 0x8014\n\tETHERTYPE_SG_RESV                 = 0x8015\n\tETHERTYPE_SIMNET                  = 0x5208\n\tETHERTYPE_SLOW                    = 0x8809\n\tETHERTYPE_SNA                     = 0x80d5\n\tETHERTYPE_SNMP                    = 0x814c\n\tETHERTYPE_SONIX                   = 0xfaf5\n\tETHERTYPE_SPIDER                  = 0x809f\n\tETHERTYPE_SPRITE                  = 0x500\n\tETHERTYPE_STP                     = 0x8181\n\tETHERTYPE_TALARIS                 = 0x812b\n\tETHERTYPE_TALARISMC               = 0x852b\n\tETHERTYPE_TCPCOMP                 = 0x876b\n\tETHERTYPE_TCPSM                   = 0x9002\n\tETHERTYPE_TEC                     = 0x814f\n\tETHERTYPE_TIGAN                   = 0x802f\n\tETHERTYPE_TRAIL                   = 0x1000\n\tETHERTYPE_TRANSETHER              = 0x6558\n\tETHERTYPE_TYMSHARE                = 0x802e\n\tETHERTYPE_UBBST                   = 0x7005\n\tETHERTYPE_UBDEBUG                 = 0x900\n\tETHERTYPE_UBDIAGLOOP              = 0x7002\n\tETHERTYPE_UBDL                    = 0x7000\n\tETHERTYPE_UBNIU                   = 0x7001\n\tETHERTYPE_UBNMC                   = 0x7003\n\tETHERTYPE_VALID                   = 0x1600\n\tETHERTYPE_VARIAN                  = 0x80dd\n\tETHERTYPE_VAXELN                  = 0x803b\n\tETHERTYPE_VEECO                   = 0x8067\n\tETHERTYPE_VEXP                    = 0x805b\n\tETHERTYPE_VGLAB                   = 0x8131\n\tETHERTYPE_VINES                   = 0xbad\n\tETHERTYPE_VINESECHO               = 0xbaf\n\tETHERTYPE_VINESLOOP               = 0xbae\n\tETHERTYPE_VITAL                   = 0xff00\n\tETHERTYPE_VLAN                    = 0x8100\n\tETHERTYPE_VLTLMAN                 = 0x8080\n\tETHERTYPE_VPROD                   = 0x805c\n\tETHERTYPE_VURESERVED              = 0x8147\n\tETHERTYPE_WATERLOO                = 0x8130\n\tETHERTYPE_WELLFLEET               = 0x8103\n\tETHERTYPE_X25                     = 0x805\n\tETHERTYPE_X75                     = 0x801\n\tETHERTYPE_XNSSM                   = 0x9001\n\tETHERTYPE_XTP                     = 0x817d\n\tETHER_ADDR_LEN                    = 0x6\n\tETHER_ALIGN                       = 0x2\n\tETHER_CRC_LEN                     = 0x4\n\tETHER_CRC_POLY_BE                 = 0x4c11db6\n\tETHER_CRC_POLY_LE                 = 0xedb88320\n\tETHER_HDR_LEN                     = 0xe\n\tETHER_MAX_DIX_LEN                 = 0x600\n\tETHER_MAX_LEN                     = 0x5ee\n\tETHER_MIN_LEN                     = 0x40\n\tETHER_TYPE_LEN                    = 0x2\n\tETHER_VLAN_ENCAP_LEN              = 0x4\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0x7\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_SYSFLAGS                       = 0xf000\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFLUSHO                            = 0x800000\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0xa\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETOWN                          = 0x5\n\tF_OK                              = 0x0\n\tF_RDLCK                           = 0x1\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETOWN                          = 0x6\n\tF_UNLCK                           = 0x2\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFAN_ARRIVAL                      = 0x0\n\tIFAN_DEPARTURE                    = 0x1\n\tIFA_ROUTE                         = 0x1\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_BROADCAST                     = 0x2\n\tIFF_CANTCHANGE                    = 0x8e52\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BLUETOOTH                     = 0xf8\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_BSC                           = 0x53\n\tIFT_CARP                          = 0xf7\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DOCSCABLEUPSTREAMCHANNEL      = 0xcd\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DUMMY                         = 0xf1\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ECONET                        = 0xce\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf3\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INFINIBAND                    = 0xc7\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L2VLAN                        = 0x87\n\tIFT_L3IPVLAN                      = 0x88\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LINEGROUP                     = 0xd2\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFLOW                         = 0xf9\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PLC                           = 0xae\n\tIFT_PON155                        = 0xcf\n\tIFT_PON622                        = 0xd0\n\tIFT_POS                           = 0xab\n\tIFT_PPP                           = 0x17\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPATM                       = 0xc5\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf2\n\tIFT_Q2931                         = 0xc9\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SIPSIG                        = 0xcc\n\tIFT_SIPTG                         = 0xcb\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TELINK                        = 0xc8\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VIRTUALTG                     = 0xca\n\tIFT_VOICEDID                      = 0xd5\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEEMFGD                    = 0xd3\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFGDEANA                  = 0xd4\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERCABLE                = 0xc6\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LOOPBACKNET                    = 0x7f\n\tIN_RFC3021_HOST                   = 0x1\n\tIN_RFC3021_NET                    = 0xfffffffe\n\tIN_RFC3021_NSHIFT                 = 0x1f\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_CARP                      = 0x70\n\tIPPROTO_DIVERT                    = 0x102\n\tIPPROTO_DIVERT_INIT               = 0x2\n\tIPPROTO_DIVERT_RESP               = 0x1\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x103\n\tIPPROTO_MOBILE                    = 0x37\n\tIPPROTO_MPLS                      = 0x89\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_PFSYNC                    = 0xf0\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_UDP                       = 0x11\n\tIPV6_AUTH_LEVEL                   = 0x35\n\tIPV6_AUTOFLOWLABEL                = 0x3b\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_DONTFRAG                     = 0x3e\n\tIPV6_DSTOPTS                      = 0x32\n\tIPV6_ESP_NETWORK_LEVEL            = 0x37\n\tIPV6_ESP_TRANS_LEVEL              = 0x36\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FRAGTTL                      = 0x78\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_HOPLIMIT                     = 0x2f\n\tIPV6_HOPOPTS                      = 0x31\n\tIPV6_IPCOMP_LEVEL                 = 0x3c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_NEXTHOP                      = 0x30\n\tIPV6_OPTIONS                      = 0x1\n\tIPV6_PATHMTU                      = 0x2c\n\tIPV6_PIPEX                        = 0x3f\n\tIPV6_PKTINFO                      = 0x2e\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVDSTOPTS                  = 0x28\n\tIPV6_RECVDSTPORT                  = 0x40\n\tIPV6_RECVHOPLIMIT                 = 0x25\n\tIPV6_RECVHOPOPTS                  = 0x27\n\tIPV6_RECVPATHMTU                  = 0x2b\n\tIPV6_RECVPKTINFO                  = 0x24\n\tIPV6_RECVRTHDR                    = 0x26\n\tIPV6_RECVTCLASS                   = 0x39\n\tIPV6_RTABLE                       = 0x1021\n\tIPV6_RTHDR                        = 0x33\n\tIPV6_RTHDRDSTOPTS                 = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x3d\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_USE_MIN_MTU                  = 0x2a\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_AUTH_LEVEL                     = 0x14\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DIVERTFL                       = 0x1022\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_ESP_NETWORK_LEVEL              = 0x16\n\tIP_ESP_TRANS_LEVEL                = 0x15\n\tIP_HDRINCL                        = 0x2\n\tIP_IPCOMP_LEVEL                   = 0x1d\n\tIP_IPSECFLOWINFO                  = 0x24\n\tIP_IPSEC_LOCAL_AUTH               = 0x1b\n\tIP_IPSEC_LOCAL_CRED               = 0x19\n\tIP_IPSEC_LOCAL_ID                 = 0x17\n\tIP_IPSEC_REMOTE_AUTH              = 0x1c\n\tIP_IPSEC_REMOTE_CRED              = 0x1a\n\tIP_IPSEC_REMOTE_ID                = 0x18\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_MEMBERSHIPS                = 0xfff\n\tIP_MF                             = 0x2000\n\tIP_MINTTL                         = 0x20\n\tIP_MIN_MEMBERSHIPS                = 0xf\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OPTIONS                        = 0x1\n\tIP_PIPEX                          = 0x22\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVDSTPORT                    = 0x21\n\tIP_RECVIF                         = 0x1e\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVRTABLE                     = 0x23\n\tIP_RECVTTL                        = 0x1f\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RTABLE                         = 0x1021\n\tIP_TOS                            = 0x3\n\tIP_TTL                            = 0x4\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLCNT_OVERLOAD_FLUSH               = 0x6\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x6\n\tMADV_NORMAL                       = 0x0\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_SPACEAVAIL                   = 0x5\n\tMADV_WILLNEED                     = 0x3\n\tMAP_ANON                          = 0x1000\n\tMAP_COPY                          = 0x4\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_FLAGMASK                      = 0x1ff7\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_INHERIT                       = 0x80\n\tMAP_INHERIT_COPY                  = 0x1\n\tMAP_INHERIT_DONATE_COPY           = 0x3\n\tMAP_INHERIT_NONE                  = 0x2\n\tMAP_INHERIT_SHARE                 = 0x0\n\tMAP_NOEXTEND                      = 0x100\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_SHARED                        = 0x1\n\tMAP_TRYFIXED                      = 0x400\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMSG_BCAST                         = 0x100\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOR                           = 0x8\n\tMSG_MCAST                         = 0x200\n\tMSG_NOSIGNAL                      = 0x400\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_TRUNC                         = 0x10\n\tMSG_WAITALL                       = 0x40\n\tMS_ASYNC                          = 0x1\n\tMS_INVALIDATE                     = 0x4\n\tMS_SYNC                           = 0x2\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_MAXID                      = 0x6\n\tNET_RT_STATS                      = 0x4\n\tNET_RT_TABLE                      = 0x5\n\tNOFLSH                            = 0x80000000\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_CHILD                        = 0x4\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EOF                          = 0x2\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_PCTRLMASK                    = 0xf0000000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRUNCATE                     = 0x80\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tONLCR                             = 0x2\n\tONLRET                            = 0x80\n\tONOCR                             = 0x40\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tO_ACCMODE                         = 0x3\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x10000\n\tO_CREAT                           = 0x200\n\tO_DIRECTORY                       = 0x20000\n\tO_DSYNC                           = 0x80\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x8000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_RSYNC                           = 0x80\n\tO_SHLOCK                          = 0x10\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPF_FLUSH                          = 0x1\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tPT_MASK                           = 0x3ff000\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_LABEL                        = 0xa\n\tRTAX_MAX                          = 0xb\n\tRTAX_NETMASK                      = 0x2\n\tRTAX_SRC                          = 0x8\n\tRTAX_SRCMASK                      = 0x9\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_LABEL                         = 0x400\n\tRTA_NETMASK                       = 0x4\n\tRTA_SRC                           = 0x100\n\tRTA_SRCMASK                       = 0x200\n\tRTF_ANNOUNCE                      = 0x4000\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_CLONED                        = 0x10000\n\tRTF_CLONING                       = 0x100\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_FMASK                         = 0x10f808\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_LLINFO                        = 0x400\n\tRTF_MASK                          = 0x80\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MPATH                         = 0x40000\n\tRTF_MPLS                          = 0x100000\n\tRTF_PERMANENT_ARP                 = 0x2000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x2000\n\tRTF_REJECT                        = 0x8\n\tRTF_SOURCE                        = 0x20000\n\tRTF_STATIC                        = 0x800\n\tRTF_TUNNEL                        = 0x100000\n\tRTF_UP                            = 0x1\n\tRTF_USETRAILERS                   = 0x8000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DESYNC                        = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_IFANNOUNCE                    = 0xf\n\tRTM_IFINFO                        = 0xe\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MAXSIZE                       = 0x800\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x5\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRT_TABLEID_MAX                    = 0xff\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tRUSAGE_THREAD                     = 0x1\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x4\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCAIFGROUP                      = 0x80246987\n\tSIOCALIFADDR                      = 0x8218691c\n\tSIOCATMARK                        = 0x40047307\n\tSIOCBRDGADD                       = 0x8054693c\n\tSIOCBRDGADDS                      = 0x80546941\n\tSIOCBRDGARL                       = 0x806e694d\n\tSIOCBRDGDADDR                     = 0x81286947\n\tSIOCBRDGDEL                       = 0x8054693d\n\tSIOCBRDGDELS                      = 0x80546942\n\tSIOCBRDGFLUSH                     = 0x80546948\n\tSIOCBRDGFRL                       = 0x806e694e\n\tSIOCBRDGGCACHE                    = 0xc0146941\n\tSIOCBRDGGFD                       = 0xc0146952\n\tSIOCBRDGGHT                       = 0xc0146951\n\tSIOCBRDGGIFFLGS                   = 0xc054693e\n\tSIOCBRDGGMA                       = 0xc0146953\n\tSIOCBRDGGPARAM                    = 0xc03c6958\n\tSIOCBRDGGPRI                      = 0xc0146950\n\tSIOCBRDGGRL                       = 0xc028694f\n\tSIOCBRDGGSIFS                     = 0xc054693c\n\tSIOCBRDGGTO                       = 0xc0146946\n\tSIOCBRDGIFS                       = 0xc0546942\n\tSIOCBRDGRTS                       = 0xc0186943\n\tSIOCBRDGSADDR                     = 0xc1286944\n\tSIOCBRDGSCACHE                    = 0x80146940\n\tSIOCBRDGSFD                       = 0x80146952\n\tSIOCBRDGSHT                       = 0x80146951\n\tSIOCBRDGSIFCOST                   = 0x80546955\n\tSIOCBRDGSIFFLGS                   = 0x8054693f\n\tSIOCBRDGSIFPRIO                   = 0x80546954\n\tSIOCBRDGSMA                       = 0x80146953\n\tSIOCBRDGSPRI                      = 0x80146950\n\tSIOCBRDGSPROTO                    = 0x8014695a\n\tSIOCBRDGSTO                       = 0x80146945\n\tSIOCBRDGSTXHC                     = 0x80146959\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFGROUP                      = 0x80246989\n\tSIOCDIFPHYADDR                    = 0x80206949\n\tSIOCDLIFADDR                      = 0x8218691e\n\tSIOCGETKALIVE                     = 0xc01869a4\n\tSIOCGETLABEL                      = 0x8020699a\n\tSIOCGETPFLOW                      = 0xc02069fe\n\tSIOCGETPFSYNC                     = 0xc02069f8\n\tSIOCGETSGCNT                      = 0xc0147534\n\tSIOCGETVIFCNT                     = 0xc0147533\n\tSIOCGETVLAN                       = 0xc0206990\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFASYNCMAP                   = 0xc020697c\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCONF                       = 0xc0086924\n\tSIOCGIFDATA                       = 0xc020691b\n\tSIOCGIFDESCR                      = 0xc0206981\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGATTR                      = 0xc024698b\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFGMEMB                      = 0xc024698a\n\tSIOCGIFGROUP                      = 0xc0246988\n\tSIOCGIFHARDMTU                    = 0xc02069a5\n\tSIOCGIFMEDIA                      = 0xc0286936\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc020697e\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206948\n\tSIOCGIFPRIORITY                   = 0xc020699c\n\tSIOCGIFPSRCADDR                   = 0xc0206947\n\tSIOCGIFRDOMAIN                    = 0xc02069a0\n\tSIOCGIFRTLABEL                    = 0xc0206983\n\tSIOCGIFTIMESLOT                   = 0xc0206986\n\tSIOCGIFXFLAGS                     = 0xc020699e\n\tSIOCGLIFADDR                      = 0xc218691d\n\tSIOCGLIFPHYADDR                   = 0xc218694b\n\tSIOCGLIFPHYRTABLE                 = 0xc02069a2\n\tSIOCGLIFPHYTTL                    = 0xc02069a9\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCGSPPPPARAMS                   = 0xc0206994\n\tSIOCGVH                           = 0xc02069f6\n\tSIOCGVNETID                       = 0xc02069a7\n\tSIOCIFCREATE                      = 0x8020697a\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc00c6978\n\tSIOCSETKALIVE                     = 0x801869a3\n\tSIOCSETLABEL                      = 0x80206999\n\tSIOCSETPFLOW                      = 0x802069fd\n\tSIOCSETPFSYNC                     = 0x802069f7\n\tSIOCSETVLAN                       = 0x8020698f\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFASYNCMAP                   = 0x8020697d\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFDESCR                      = 0x80206980\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGATTR                      = 0x8024698c\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFLLADDR                     = 0x8020691f\n\tSIOCSIFMEDIA                      = 0xc0206935\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x8020697f\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x80406946\n\tSIOCSIFPRIORITY                   = 0x8020699b\n\tSIOCSIFRDOMAIN                    = 0x8020699f\n\tSIOCSIFRTLABEL                    = 0x80206982\n\tSIOCSIFTIMESLOT                   = 0x80206985\n\tSIOCSIFXFLAGS                     = 0x8020699d\n\tSIOCSLIFPHYADDR                   = 0x8218694a\n\tSIOCSLIFPHYRTABLE                 = 0x802069a1\n\tSIOCSLIFPHYTTL                    = 0x802069a8\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSIOCSSPPPPARAMS                   = 0x80206993\n\tSIOCSVH                           = 0xc02069f5\n\tSIOCSVNETID                       = 0x802069a6\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_BINDANY                        = 0x1000\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LINGER                         = 0x80\n\tSO_NETPROC                        = 0x1020\n\tSO_OOBINLINE                      = 0x100\n\tSO_PEERCRED                       = 0x1022\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_RTABLE                         = 0x1021\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_SPLICE                         = 0x1023\n\tSO_TIMESTAMP                      = 0x800\n\tSO_TYPE                           = 0x1008\n\tSO_USELOOPBACK                    = 0x40\n\tTCIFLUSH                          = 0x1\n\tTCIOFLUSH                         = 0x3\n\tTCOFLUSH                          = 0x2\n\tTCP_MAXBURST                      = 0x4\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_SACK                      = 0x3\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MD5SIG                        = 0x4\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOPUSH                        = 0x10\n\tTCP_NSTATES                       = 0xb\n\tTCP_SACK_ENABLE                   = 0x8\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLAG_CLOCAL                   = 0x2\n\tTIOCFLAG_CRTSCTS                  = 0x4\n\tTIOCFLAG_MDMBUF                   = 0x8\n\tTIOCFLAG_PPS                      = 0x10\n\tTIOCFLAG_SOFTCAR                  = 0x1\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGFLAGS                        = 0x4004745d\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGSID                          = 0x40047463\n\tTIOCGTSTAMP                       = 0x400c745b\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x4004746a\n\tTIOCMODS                          = 0x8004746d\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSFLAGS                        = 0x8004745c\n\tTIOCSIG                           = 0x8004745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x80047465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSTSTAMP                       = 0x8008745a\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWALTSIG                           = 0x4\n\tWCONTINUED                        = 0x8\n\tWCOREFLAG                         = 0x80\n\tWNOHANG                           = 0x1\n\tWSTOPPED                          = 0x7f\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x58)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x59)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEIPSEC          = syscall.Errno(0x52)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x5b)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMEDIUMTYPE     = syscall.Errno(0x56)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x53)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOMEDIUM       = syscall.Errno(0x55)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x5a)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x5b)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x57)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTHR    = syscall.Signal(0x20)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"connection timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"IPsec processing failure\",\n\t83: \"attribute not found\",\n\t84: \"illegal byte sequence\",\n\t85: \"no medium found\",\n\t86: \"wrong medium type\",\n\t87: \"value too large to be stored in data type\",\n\t88: \"operation canceled\",\n\t89: \"identifier removed\",\n\t90: \"no message of desired type\",\n\t91: \"not supported\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"stopped (signal)\",\n\t18: \"stopped\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"thread AST\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go",
    "content": "// mkerrors.sh -m64\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n// +build amd64,openbsd\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_BLUETOOTH                      = 0x20\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1a\n\tAF_ECMA                           = 0x8\n\tAF_ENCAP                          = 0x1c\n\tAF_HYLINK                         = 0xf\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x18\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1a\n\tAF_ISO                            = 0x7\n\tAF_KEY                            = 0x1e\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x24\n\tAF_MPLS                           = 0x21\n\tAF_NATM                           = 0x1b\n\tAF_NS                             = 0x6\n\tAF_OSI                            = 0x7\n\tAF_PUP                            = 0x4\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x1d\n\tAF_SNA                            = 0xb\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tARPHRD_ETHER                      = 0x1\n\tARPHRD_FRELAY                     = 0xf\n\tARPHRD_IEEE1394                   = 0x18\n\tARPHRD_IEEE802                    = 0x6\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDIRFILT                      = 0x4004427c\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc010427b\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGFILDROP                      = 0x40044278\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044273\n\tBIOCGRTIMEOUT                     = 0x4010426e\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCLOCK                          = 0x20004276\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDIRFILT                      = 0x8004427d\n\tBIOCSDLT                          = 0x8004427a\n\tBIOCSETF                          = 0x80104267\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSETWF                         = 0x80104277\n\tBIOCSFILDROP                      = 0x80044279\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044272\n\tBIOCSRTIMEOUT                     = 0x8010426d\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DIRECTION_IN                  = 0x1\n\tBPF_DIRECTION_OUT                 = 0x2\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x200000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCREAD                             = 0x800\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0xff\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDIOCOSFPFLUSH                     = 0x2000444e\n\tDLT_ARCNET                        = 0x7\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AX25                          = 0x3\n\tDLT_CHAOS                         = 0x5\n\tDLT_C_HDLC                        = 0x68\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0xd\n\tDLT_FDDI                          = 0xa\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_LOOP                          = 0xc\n\tDLT_MPLS                          = 0xdb\n\tDLT_NULL                          = 0x0\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PRONET                        = 0x4\n\tDLT_RAW                           = 0xe\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEMT_TAGOVF                        = 0x1\n\tEMUL_ENABLED                      = 0x1\n\tEMUL_NATIVE                       = 0x2\n\tENDRUNDISC                        = 0x9\n\tETHERMIN                          = 0x2e\n\tETHERMTU                          = 0x5dc\n\tETHERTYPE_8023                    = 0x4\n\tETHERTYPE_AARP                    = 0x80f3\n\tETHERTYPE_ACCTON                  = 0x8390\n\tETHERTYPE_AEONIC                  = 0x8036\n\tETHERTYPE_ALPHA                   = 0x814a\n\tETHERTYPE_AMBER                   = 0x6008\n\tETHERTYPE_AMOEBA                  = 0x8145\n\tETHERTYPE_AOE                     = 0x88a2\n\tETHERTYPE_APOLLO                  = 0x80f7\n\tETHERTYPE_APOLLODOMAIN            = 0x8019\n\tETHERTYPE_APPLETALK               = 0x809b\n\tETHERTYPE_APPLITEK                = 0x80c7\n\tETHERTYPE_ARGONAUT                = 0x803a\n\tETHERTYPE_ARP                     = 0x806\n\tETHERTYPE_AT                      = 0x809b\n\tETHERTYPE_ATALK                   = 0x809b\n\tETHERTYPE_ATOMIC                  = 0x86df\n\tETHERTYPE_ATT                     = 0x8069\n\tETHERTYPE_ATTSTANFORD             = 0x8008\n\tETHERTYPE_AUTOPHON                = 0x806a\n\tETHERTYPE_AXIS                    = 0x8856\n\tETHERTYPE_BCLOOP                  = 0x9003\n\tETHERTYPE_BOFL                    = 0x8102\n\tETHERTYPE_CABLETRON               = 0x7034\n\tETHERTYPE_CHAOS                   = 0x804\n\tETHERTYPE_COMDESIGN               = 0x806c\n\tETHERTYPE_COMPUGRAPHIC            = 0x806d\n\tETHERTYPE_COUNTERPOINT            = 0x8062\n\tETHERTYPE_CRONUS                  = 0x8004\n\tETHERTYPE_CRONUSVLN               = 0x8003\n\tETHERTYPE_DCA                     = 0x1234\n\tETHERTYPE_DDE                     = 0x807b\n\tETHERTYPE_DEBNI                   = 0xaaaa\n\tETHERTYPE_DECAM                   = 0x8048\n\tETHERTYPE_DECCUST                 = 0x6006\n\tETHERTYPE_DECDIAG                 = 0x6005\n\tETHERTYPE_DECDNS                  = 0x803c\n\tETHERTYPE_DECDTS                  = 0x803e\n\tETHERTYPE_DECEXPER                = 0x6000\n\tETHERTYPE_DECLAST                 = 0x8041\n\tETHERTYPE_DECLTM                  = 0x803f\n\tETHERTYPE_DECMUMPS                = 0x6009\n\tETHERTYPE_DECNETBIOS              = 0x8040\n\tETHERTYPE_DELTACON                = 0x86de\n\tETHERTYPE_DIDDLE                  = 0x4321\n\tETHERTYPE_DLOG1                   = 0x660\n\tETHERTYPE_DLOG2                   = 0x661\n\tETHERTYPE_DN                      = 0x6003\n\tETHERTYPE_DOGFIGHT                = 0x1989\n\tETHERTYPE_DSMD                    = 0x8039\n\tETHERTYPE_ECMA                    = 0x803\n\tETHERTYPE_ENCRYPT                 = 0x803d\n\tETHERTYPE_ES                      = 0x805d\n\tETHERTYPE_EXCELAN                 = 0x8010\n\tETHERTYPE_EXPERDATA               = 0x8049\n\tETHERTYPE_FLIP                    = 0x8146\n\tETHERTYPE_FLOWCONTROL             = 0x8808\n\tETHERTYPE_FRARP                   = 0x808\n\tETHERTYPE_GENDYN                  = 0x8068\n\tETHERTYPE_HAYES                   = 0x8130\n\tETHERTYPE_HIPPI_FP                = 0x8180\n\tETHERTYPE_HITACHI                 = 0x8820\n\tETHERTYPE_HP                      = 0x8005\n\tETHERTYPE_IEEEPUP                 = 0xa00\n\tETHERTYPE_IEEEPUPAT               = 0xa01\n\tETHERTYPE_IMLBL                   = 0x4c42\n\tETHERTYPE_IMLBLDIAG               = 0x424c\n\tETHERTYPE_IP                      = 0x800\n\tETHERTYPE_IPAS                    = 0x876c\n\tETHERTYPE_IPV6                    = 0x86dd\n\tETHERTYPE_IPX                     = 0x8137\n\tETHERTYPE_IPXNEW                  = 0x8037\n\tETHERTYPE_KALPANA                 = 0x8582\n\tETHERTYPE_LANBRIDGE               = 0x8038\n\tETHERTYPE_LANPROBE                = 0x8888\n\tETHERTYPE_LAT                     = 0x6004\n\tETHERTYPE_LBACK                   = 0x9000\n\tETHERTYPE_LITTLE                  = 0x8060\n\tETHERTYPE_LLDP                    = 0x88cc\n\tETHERTYPE_LOGICRAFT               = 0x8148\n\tETHERTYPE_LOOPBACK                = 0x9000\n\tETHERTYPE_MATRA                   = 0x807a\n\tETHERTYPE_MAX                     = 0xffff\n\tETHERTYPE_MERIT                   = 0x807c\n\tETHERTYPE_MICP                    = 0x873a\n\tETHERTYPE_MOPDL                   = 0x6001\n\tETHERTYPE_MOPRC                   = 0x6002\n\tETHERTYPE_MOTOROLA                = 0x818d\n\tETHERTYPE_MPLS                    = 0x8847\n\tETHERTYPE_MPLS_MCAST              = 0x8848\n\tETHERTYPE_MUMPS                   = 0x813f\n\tETHERTYPE_NBPCC                   = 0x3c04\n\tETHERTYPE_NBPCLAIM                = 0x3c09\n\tETHERTYPE_NBPCLREQ                = 0x3c05\n\tETHERTYPE_NBPCLRSP                = 0x3c06\n\tETHERTYPE_NBPCREQ                 = 0x3c02\n\tETHERTYPE_NBPCRSP                 = 0x3c03\n\tETHERTYPE_NBPDG                   = 0x3c07\n\tETHERTYPE_NBPDGB                  = 0x3c08\n\tETHERTYPE_NBPDLTE                 = 0x3c0a\n\tETHERTYPE_NBPRAR                  = 0x3c0c\n\tETHERTYPE_NBPRAS                  = 0x3c0b\n\tETHERTYPE_NBPRST                  = 0x3c0d\n\tETHERTYPE_NBPSCD                  = 0x3c01\n\tETHERTYPE_NBPVCD                  = 0x3c00\n\tETHERTYPE_NBS                     = 0x802\n\tETHERTYPE_NCD                     = 0x8149\n\tETHERTYPE_NESTAR                  = 0x8006\n\tETHERTYPE_NETBEUI                 = 0x8191\n\tETHERTYPE_NOVELL                  = 0x8138\n\tETHERTYPE_NS                      = 0x600\n\tETHERTYPE_NSAT                    = 0x601\n\tETHERTYPE_NSCOMPAT                = 0x807\n\tETHERTYPE_NTRAILER                = 0x10\n\tETHERTYPE_OS9                     = 0x7007\n\tETHERTYPE_OS9NET                  = 0x7009\n\tETHERTYPE_PACER                   = 0x80c6\n\tETHERTYPE_PAE                     = 0x888e\n\tETHERTYPE_PCS                     = 0x4242\n\tETHERTYPE_PLANNING                = 0x8044\n\tETHERTYPE_PPP                     = 0x880b\n\tETHERTYPE_PPPOE                   = 0x8864\n\tETHERTYPE_PPPOEDISC               = 0x8863\n\tETHERTYPE_PRIMENTS                = 0x7031\n\tETHERTYPE_PUP                     = 0x200\n\tETHERTYPE_PUPAT                   = 0x200\n\tETHERTYPE_QINQ                    = 0x88a8\n\tETHERTYPE_RACAL                   = 0x7030\n\tETHERTYPE_RATIONAL                = 0x8150\n\tETHERTYPE_RAWFR                   = 0x6559\n\tETHERTYPE_RCL                     = 0x1995\n\tETHERTYPE_RDP                     = 0x8739\n\tETHERTYPE_RETIX                   = 0x80f2\n\tETHERTYPE_REVARP                  = 0x8035\n\tETHERTYPE_SCA                     = 0x6007\n\tETHERTYPE_SECTRA                  = 0x86db\n\tETHERTYPE_SECUREDATA              = 0x876d\n\tETHERTYPE_SGITW                   = 0x817e\n\tETHERTYPE_SG_BOUNCE               = 0x8016\n\tETHERTYPE_SG_DIAG                 = 0x8013\n\tETHERTYPE_SG_NETGAMES             = 0x8014\n\tETHERTYPE_SG_RESV                 = 0x8015\n\tETHERTYPE_SIMNET                  = 0x5208\n\tETHERTYPE_SLOW                    = 0x8809\n\tETHERTYPE_SNA                     = 0x80d5\n\tETHERTYPE_SNMP                    = 0x814c\n\tETHERTYPE_SONIX                   = 0xfaf5\n\tETHERTYPE_SPIDER                  = 0x809f\n\tETHERTYPE_SPRITE                  = 0x500\n\tETHERTYPE_STP                     = 0x8181\n\tETHERTYPE_TALARIS                 = 0x812b\n\tETHERTYPE_TALARISMC               = 0x852b\n\tETHERTYPE_TCPCOMP                 = 0x876b\n\tETHERTYPE_TCPSM                   = 0x9002\n\tETHERTYPE_TEC                     = 0x814f\n\tETHERTYPE_TIGAN                   = 0x802f\n\tETHERTYPE_TRAIL                   = 0x1000\n\tETHERTYPE_TRANSETHER              = 0x6558\n\tETHERTYPE_TYMSHARE                = 0x802e\n\tETHERTYPE_UBBST                   = 0x7005\n\tETHERTYPE_UBDEBUG                 = 0x900\n\tETHERTYPE_UBDIAGLOOP              = 0x7002\n\tETHERTYPE_UBDL                    = 0x7000\n\tETHERTYPE_UBNIU                   = 0x7001\n\tETHERTYPE_UBNMC                   = 0x7003\n\tETHERTYPE_VALID                   = 0x1600\n\tETHERTYPE_VARIAN                  = 0x80dd\n\tETHERTYPE_VAXELN                  = 0x803b\n\tETHERTYPE_VEECO                   = 0x8067\n\tETHERTYPE_VEXP                    = 0x805b\n\tETHERTYPE_VGLAB                   = 0x8131\n\tETHERTYPE_VINES                   = 0xbad\n\tETHERTYPE_VINESECHO               = 0xbaf\n\tETHERTYPE_VINESLOOP               = 0xbae\n\tETHERTYPE_VITAL                   = 0xff00\n\tETHERTYPE_VLAN                    = 0x8100\n\tETHERTYPE_VLTLMAN                 = 0x8080\n\tETHERTYPE_VPROD                   = 0x805c\n\tETHERTYPE_VURESERVED              = 0x8147\n\tETHERTYPE_WATERLOO                = 0x8130\n\tETHERTYPE_WELLFLEET               = 0x8103\n\tETHERTYPE_X25                     = 0x805\n\tETHERTYPE_X75                     = 0x801\n\tETHERTYPE_XNSSM                   = 0x9001\n\tETHERTYPE_XTP                     = 0x817d\n\tETHER_ADDR_LEN                    = 0x6\n\tETHER_ALIGN                       = 0x2\n\tETHER_CRC_LEN                     = 0x4\n\tETHER_CRC_POLY_BE                 = 0x4c11db6\n\tETHER_CRC_POLY_LE                 = 0xedb88320\n\tETHER_HDR_LEN                     = 0xe\n\tETHER_MAX_DIX_LEN                 = 0x600\n\tETHER_MAX_LEN                     = 0x5ee\n\tETHER_MIN_LEN                     = 0x40\n\tETHER_TYPE_LEN                    = 0x2\n\tETHER_VLAN_ENCAP_LEN              = 0x4\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0x7\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_SYSFLAGS                       = 0xf000\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFLUSHO                            = 0x800000\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0xa\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETOWN                          = 0x5\n\tF_OK                              = 0x0\n\tF_RDLCK                           = 0x1\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETOWN                          = 0x6\n\tF_UNLCK                           = 0x2\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFAN_ARRIVAL                      = 0x0\n\tIFAN_DEPARTURE                    = 0x1\n\tIFA_ROUTE                         = 0x1\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_BROADCAST                     = 0x2\n\tIFF_CANTCHANGE                    = 0x8e52\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BLUETOOTH                     = 0xf8\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_BSC                           = 0x53\n\tIFT_CARP                          = 0xf7\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DOCSCABLEUPSTREAMCHANNEL      = 0xcd\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DUMMY                         = 0xf1\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ECONET                        = 0xce\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf3\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INFINIBAND                    = 0xc7\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L2VLAN                        = 0x87\n\tIFT_L3IPVLAN                      = 0x88\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LINEGROUP                     = 0xd2\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFLOW                         = 0xf9\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PLC                           = 0xae\n\tIFT_PON155                        = 0xcf\n\tIFT_PON622                        = 0xd0\n\tIFT_POS                           = 0xab\n\tIFT_PPP                           = 0x17\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPATM                       = 0xc5\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf2\n\tIFT_Q2931                         = 0xc9\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SIPSIG                        = 0xcc\n\tIFT_SIPTG                         = 0xcb\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TELINK                        = 0xc8\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VIRTUALTG                     = 0xca\n\tIFT_VOICEDID                      = 0xd5\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEEMFGD                    = 0xd3\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFGDEANA                  = 0xd4\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERCABLE                = 0xc6\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LOOPBACKNET                    = 0x7f\n\tIN_RFC3021_HOST                   = 0x1\n\tIN_RFC3021_NET                    = 0xfffffffe\n\tIN_RFC3021_NSHIFT                 = 0x1f\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_CARP                      = 0x70\n\tIPPROTO_DIVERT                    = 0x102\n\tIPPROTO_DIVERT_INIT               = 0x2\n\tIPPROTO_DIVERT_RESP               = 0x1\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x103\n\tIPPROTO_MOBILE                    = 0x37\n\tIPPROTO_MPLS                      = 0x89\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_PFSYNC                    = 0xf0\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_UDP                       = 0x11\n\tIPV6_AUTH_LEVEL                   = 0x35\n\tIPV6_AUTOFLOWLABEL                = 0x3b\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_DONTFRAG                     = 0x3e\n\tIPV6_DSTOPTS                      = 0x32\n\tIPV6_ESP_NETWORK_LEVEL            = 0x37\n\tIPV6_ESP_TRANS_LEVEL              = 0x36\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FRAGTTL                      = 0x78\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_HOPLIMIT                     = 0x2f\n\tIPV6_HOPOPTS                      = 0x31\n\tIPV6_IPCOMP_LEVEL                 = 0x3c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_NEXTHOP                      = 0x30\n\tIPV6_OPTIONS                      = 0x1\n\tIPV6_PATHMTU                      = 0x2c\n\tIPV6_PIPEX                        = 0x3f\n\tIPV6_PKTINFO                      = 0x2e\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVDSTOPTS                  = 0x28\n\tIPV6_RECVDSTPORT                  = 0x40\n\tIPV6_RECVHOPLIMIT                 = 0x25\n\tIPV6_RECVHOPOPTS                  = 0x27\n\tIPV6_RECVPATHMTU                  = 0x2b\n\tIPV6_RECVPKTINFO                  = 0x24\n\tIPV6_RECVRTHDR                    = 0x26\n\tIPV6_RECVTCLASS                   = 0x39\n\tIPV6_RTABLE                       = 0x1021\n\tIPV6_RTHDR                        = 0x33\n\tIPV6_RTHDRDSTOPTS                 = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x3d\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_USE_MIN_MTU                  = 0x2a\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_AUTH_LEVEL                     = 0x14\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DIVERTFL                       = 0x1022\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_ESP_NETWORK_LEVEL              = 0x16\n\tIP_ESP_TRANS_LEVEL                = 0x15\n\tIP_HDRINCL                        = 0x2\n\tIP_IPCOMP_LEVEL                   = 0x1d\n\tIP_IPSECFLOWINFO                  = 0x24\n\tIP_IPSEC_LOCAL_AUTH               = 0x1b\n\tIP_IPSEC_LOCAL_CRED               = 0x19\n\tIP_IPSEC_LOCAL_ID                 = 0x17\n\tIP_IPSEC_REMOTE_AUTH              = 0x1c\n\tIP_IPSEC_REMOTE_CRED              = 0x1a\n\tIP_IPSEC_REMOTE_ID                = 0x18\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_MEMBERSHIPS                = 0xfff\n\tIP_MF                             = 0x2000\n\tIP_MINTTL                         = 0x20\n\tIP_MIN_MEMBERSHIPS                = 0xf\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OPTIONS                        = 0x1\n\tIP_PIPEX                          = 0x22\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVDSTPORT                    = 0x21\n\tIP_RECVIF                         = 0x1e\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVRTABLE                     = 0x23\n\tIP_RECVTTL                        = 0x1f\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RTABLE                         = 0x1021\n\tIP_TOS                            = 0x3\n\tIP_TTL                            = 0x4\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLCNT_OVERLOAD_FLUSH               = 0x6\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x6\n\tMADV_NORMAL                       = 0x0\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_SPACEAVAIL                   = 0x5\n\tMADV_WILLNEED                     = 0x3\n\tMAP_ANON                          = 0x1000\n\tMAP_COPY                          = 0x4\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_FLAGMASK                      = 0x1ff7\n\tMAP_HASSEMAPHORE                  = 0x200\n\tMAP_INHERIT                       = 0x80\n\tMAP_INHERIT_COPY                  = 0x1\n\tMAP_INHERIT_DONATE_COPY           = 0x3\n\tMAP_INHERIT_NONE                  = 0x2\n\tMAP_INHERIT_SHARE                 = 0x0\n\tMAP_NOEXTEND                      = 0x100\n\tMAP_NORESERVE                     = 0x40\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x20\n\tMAP_SHARED                        = 0x1\n\tMAP_TRYFIXED                      = 0x400\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMSG_BCAST                         = 0x100\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOR                           = 0x8\n\tMSG_MCAST                         = 0x200\n\tMSG_NOSIGNAL                      = 0x400\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_TRUNC                         = 0x10\n\tMSG_WAITALL                       = 0x40\n\tMS_ASYNC                          = 0x1\n\tMS_INVALIDATE                     = 0x4\n\tMS_SYNC                           = 0x2\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_MAXID                      = 0x6\n\tNET_RT_STATS                      = 0x4\n\tNET_RT_TABLE                      = 0x5\n\tNOFLSH                            = 0x80000000\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_CHILD                        = 0x4\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EOF                          = 0x2\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_PCTRLMASK                    = 0xf0000000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRUNCATE                     = 0x80\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tONLCR                             = 0x2\n\tONLRET                            = 0x80\n\tONOCR                             = 0x40\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tO_ACCMODE                         = 0x3\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x10000\n\tO_CREAT                           = 0x200\n\tO_DIRECTORY                       = 0x20000\n\tO_DSYNC                           = 0x80\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x8000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_RSYNC                           = 0x80\n\tO_SHLOCK                          = 0x10\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPF_FLUSH                          = 0x1\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_LABEL                        = 0xa\n\tRTAX_MAX                          = 0xb\n\tRTAX_NETMASK                      = 0x2\n\tRTAX_SRC                          = 0x8\n\tRTAX_SRCMASK                      = 0x9\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_LABEL                         = 0x400\n\tRTA_NETMASK                       = 0x4\n\tRTA_SRC                           = 0x100\n\tRTA_SRCMASK                       = 0x200\n\tRTF_ANNOUNCE                      = 0x4000\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_CLONED                        = 0x10000\n\tRTF_CLONING                       = 0x100\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_FMASK                         = 0x10f808\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_LLINFO                        = 0x400\n\tRTF_MASK                          = 0x80\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MPATH                         = 0x40000\n\tRTF_MPLS                          = 0x100000\n\tRTF_PERMANENT_ARP                 = 0x2000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x2000\n\tRTF_REJECT                        = 0x8\n\tRTF_SOURCE                        = 0x20000\n\tRTF_STATIC                        = 0x800\n\tRTF_TUNNEL                        = 0x100000\n\tRTF_UP                            = 0x1\n\tRTF_USETRAILERS                   = 0x8000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DESYNC                        = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_IFANNOUNCE                    = 0xf\n\tRTM_IFINFO                        = 0xe\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MAXSIZE                       = 0x800\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x5\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRT_TABLEID_MAX                    = 0xff\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tRUSAGE_THREAD                     = 0x1\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x4\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCAIFGROUP                      = 0x80286987\n\tSIOCALIFADDR                      = 0x8218691c\n\tSIOCATMARK                        = 0x40047307\n\tSIOCBRDGADD                       = 0x8058693c\n\tSIOCBRDGADDS                      = 0x80586941\n\tSIOCBRDGARL                       = 0x806e694d\n\tSIOCBRDGDADDR                     = 0x81286947\n\tSIOCBRDGDEL                       = 0x8058693d\n\tSIOCBRDGDELS                      = 0x80586942\n\tSIOCBRDGFLUSH                     = 0x80586948\n\tSIOCBRDGFRL                       = 0x806e694e\n\tSIOCBRDGGCACHE                    = 0xc0146941\n\tSIOCBRDGGFD                       = 0xc0146952\n\tSIOCBRDGGHT                       = 0xc0146951\n\tSIOCBRDGGIFFLGS                   = 0xc058693e\n\tSIOCBRDGGMA                       = 0xc0146953\n\tSIOCBRDGGPARAM                    = 0xc0406958\n\tSIOCBRDGGPRI                      = 0xc0146950\n\tSIOCBRDGGRL                       = 0xc030694f\n\tSIOCBRDGGSIFS                     = 0xc058693c\n\tSIOCBRDGGTO                       = 0xc0146946\n\tSIOCBRDGIFS                       = 0xc0586942\n\tSIOCBRDGRTS                       = 0xc0206943\n\tSIOCBRDGSADDR                     = 0xc1286944\n\tSIOCBRDGSCACHE                    = 0x80146940\n\tSIOCBRDGSFD                       = 0x80146952\n\tSIOCBRDGSHT                       = 0x80146951\n\tSIOCBRDGSIFCOST                   = 0x80586955\n\tSIOCBRDGSIFFLGS                   = 0x8058693f\n\tSIOCBRDGSIFPRIO                   = 0x80586954\n\tSIOCBRDGSMA                       = 0x80146953\n\tSIOCBRDGSPRI                      = 0x80146950\n\tSIOCBRDGSPROTO                    = 0x8014695a\n\tSIOCBRDGSTO                       = 0x80146945\n\tSIOCBRDGSTXHC                     = 0x80146959\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFGROUP                      = 0x80286989\n\tSIOCDIFPHYADDR                    = 0x80206949\n\tSIOCDLIFADDR                      = 0x8218691e\n\tSIOCGETKALIVE                     = 0xc01869a4\n\tSIOCGETLABEL                      = 0x8020699a\n\tSIOCGETPFLOW                      = 0xc02069fe\n\tSIOCGETPFSYNC                     = 0xc02069f8\n\tSIOCGETSGCNT                      = 0xc0207534\n\tSIOCGETVIFCNT                     = 0xc0287533\n\tSIOCGETVLAN                       = 0xc0206990\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFASYNCMAP                   = 0xc020697c\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCONF                       = 0xc0106924\n\tSIOCGIFDATA                       = 0xc020691b\n\tSIOCGIFDESCR                      = 0xc0206981\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGATTR                      = 0xc028698b\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFGMEMB                      = 0xc028698a\n\tSIOCGIFGROUP                      = 0xc0286988\n\tSIOCGIFHARDMTU                    = 0xc02069a5\n\tSIOCGIFMEDIA                      = 0xc0306936\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc020697e\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206948\n\tSIOCGIFPRIORITY                   = 0xc020699c\n\tSIOCGIFPSRCADDR                   = 0xc0206947\n\tSIOCGIFRDOMAIN                    = 0xc02069a0\n\tSIOCGIFRTLABEL                    = 0xc0206983\n\tSIOCGIFTIMESLOT                   = 0xc0206986\n\tSIOCGIFXFLAGS                     = 0xc020699e\n\tSIOCGLIFADDR                      = 0xc218691d\n\tSIOCGLIFPHYADDR                   = 0xc218694b\n\tSIOCGLIFPHYRTABLE                 = 0xc02069a2\n\tSIOCGLIFPHYTTL                    = 0xc02069a9\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCGSPPPPARAMS                   = 0xc0206994\n\tSIOCGVH                           = 0xc02069f6\n\tSIOCGVNETID                       = 0xc02069a7\n\tSIOCIFCREATE                      = 0x8020697a\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc0106978\n\tSIOCSETKALIVE                     = 0x801869a3\n\tSIOCSETLABEL                      = 0x80206999\n\tSIOCSETPFLOW                      = 0x802069fd\n\tSIOCSETPFSYNC                     = 0x802069f7\n\tSIOCSETVLAN                       = 0x8020698f\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFASYNCMAP                   = 0x8020697d\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFDESCR                      = 0x80206980\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGATTR                      = 0x8028698c\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFLLADDR                     = 0x8020691f\n\tSIOCSIFMEDIA                      = 0xc0206935\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x8020697f\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x80406946\n\tSIOCSIFPRIORITY                   = 0x8020699b\n\tSIOCSIFRDOMAIN                    = 0x8020699f\n\tSIOCSIFRTLABEL                    = 0x80206982\n\tSIOCSIFTIMESLOT                   = 0x80206985\n\tSIOCSIFXFLAGS                     = 0x8020699d\n\tSIOCSLIFPHYADDR                   = 0x8218694a\n\tSIOCSLIFPHYRTABLE                 = 0x802069a1\n\tSIOCSLIFPHYTTL                    = 0x802069a8\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSIOCSSPPPPARAMS                   = 0x80206993\n\tSIOCSVH                           = 0xc02069f5\n\tSIOCSVNETID                       = 0x802069a6\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_BINDANY                        = 0x1000\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LINGER                         = 0x80\n\tSO_NETPROC                        = 0x1020\n\tSO_OOBINLINE                      = 0x100\n\tSO_PEERCRED                       = 0x1022\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_RTABLE                         = 0x1021\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_SPLICE                         = 0x1023\n\tSO_TIMESTAMP                      = 0x800\n\tSO_TYPE                           = 0x1008\n\tSO_USELOOPBACK                    = 0x40\n\tTCIFLUSH                          = 0x1\n\tTCIOFLUSH                         = 0x3\n\tTCOFLUSH                          = 0x2\n\tTCP_MAXBURST                      = 0x4\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_SACK                      = 0x3\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MD5SIG                        = 0x4\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOPUSH                        = 0x10\n\tTCP_NSTATES                       = 0xb\n\tTCP_SACK_ENABLE                   = 0x8\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLAG_CLOCAL                   = 0x2\n\tTIOCFLAG_CRTSCTS                  = 0x4\n\tTIOCFLAG_MDMBUF                   = 0x8\n\tTIOCFLAG_PPS                      = 0x10\n\tTIOCFLAG_SOFTCAR                  = 0x1\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGFLAGS                        = 0x4004745d\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGSID                          = 0x40047463\n\tTIOCGTSTAMP                       = 0x4010745b\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x4004746a\n\tTIOCMODS                          = 0x8004746d\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSFLAGS                        = 0x8004745c\n\tTIOCSIG                           = 0x8004745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x80047465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSTSTAMP                       = 0x8008745a\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWALTSIG                           = 0x4\n\tWCONTINUED                        = 0x8\n\tWCOREFLAG                         = 0x80\n\tWNOHANG                           = 0x1\n\tWSTOPPED                          = 0x7f\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x58)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x59)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEIPSEC          = syscall.Errno(0x52)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x5b)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMEDIUMTYPE     = syscall.Errno(0x56)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x53)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOMEDIUM       = syscall.Errno(0x55)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x5a)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x5b)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x57)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTHR    = syscall.Signal(0x20)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"connection timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"IPsec processing failure\",\n\t83: \"attribute not found\",\n\t84: \"illegal byte sequence\",\n\t85: \"no medium found\",\n\t86: \"wrong medium type\",\n\t87: \"value too large to be stored in data type\",\n\t88: \"operation canceled\",\n\t89: \"identifier removed\",\n\t90: \"no message of desired type\",\n\t91: \"not supported\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"stopped (signal)\",\n\t18: \"stopped\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"thread AST\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go",
    "content": "// mkerrors.sh\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- _const.go\n\n// +build arm,openbsd\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_APPLETALK                      = 0x10\n\tAF_BLUETOOTH                      = 0x20\n\tAF_CCITT                          = 0xa\n\tAF_CHAOS                          = 0x5\n\tAF_CNT                            = 0x15\n\tAF_COIP                           = 0x14\n\tAF_DATAKIT                        = 0x9\n\tAF_DECnet                         = 0xc\n\tAF_DLI                            = 0xd\n\tAF_E164                           = 0x1a\n\tAF_ECMA                           = 0x8\n\tAF_ENCAP                          = 0x1c\n\tAF_HYLINK                         = 0xf\n\tAF_IMPLINK                        = 0x3\n\tAF_INET                           = 0x2\n\tAF_INET6                          = 0x18\n\tAF_IPX                            = 0x17\n\tAF_ISDN                           = 0x1a\n\tAF_ISO                            = 0x7\n\tAF_KEY                            = 0x1e\n\tAF_LAT                            = 0xe\n\tAF_LINK                           = 0x12\n\tAF_LOCAL                          = 0x1\n\tAF_MAX                            = 0x24\n\tAF_MPLS                           = 0x21\n\tAF_NATM                           = 0x1b\n\tAF_NS                             = 0x6\n\tAF_OSI                            = 0x7\n\tAF_PUP                            = 0x4\n\tAF_ROUTE                          = 0x11\n\tAF_SIP                            = 0x1d\n\tAF_SNA                            = 0xb\n\tAF_UNIX                           = 0x1\n\tAF_UNSPEC                         = 0x0\n\tARPHRD_ETHER                      = 0x1\n\tARPHRD_FRELAY                     = 0xf\n\tARPHRD_IEEE1394                   = 0x18\n\tARPHRD_IEEE802                    = 0x6\n\tB0                                = 0x0\n\tB110                              = 0x6e\n\tB115200                           = 0x1c200\n\tB1200                             = 0x4b0\n\tB134                              = 0x86\n\tB14400                            = 0x3840\n\tB150                              = 0x96\n\tB1800                             = 0x708\n\tB19200                            = 0x4b00\n\tB200                              = 0xc8\n\tB230400                           = 0x38400\n\tB2400                             = 0x960\n\tB28800                            = 0x7080\n\tB300                              = 0x12c\n\tB38400                            = 0x9600\n\tB4800                             = 0x12c0\n\tB50                               = 0x32\n\tB57600                            = 0xe100\n\tB600                              = 0x258\n\tB7200                             = 0x1c20\n\tB75                               = 0x4b\n\tB76800                            = 0x12c00\n\tB9600                             = 0x2580\n\tBIOCFLUSH                         = 0x20004268\n\tBIOCGBLEN                         = 0x40044266\n\tBIOCGDIRFILT                      = 0x4004427c\n\tBIOCGDLT                          = 0x4004426a\n\tBIOCGDLTLIST                      = 0xc008427b\n\tBIOCGETIF                         = 0x4020426b\n\tBIOCGFILDROP                      = 0x40044278\n\tBIOCGHDRCMPLT                     = 0x40044274\n\tBIOCGRSIG                         = 0x40044273\n\tBIOCGRTIMEOUT                     = 0x400c426e\n\tBIOCGSTATS                        = 0x4008426f\n\tBIOCIMMEDIATE                     = 0x80044270\n\tBIOCLOCK                          = 0x20004276\n\tBIOCPROMISC                       = 0x20004269\n\tBIOCSBLEN                         = 0xc0044266\n\tBIOCSDIRFILT                      = 0x8004427d\n\tBIOCSDLT                          = 0x8004427a\n\tBIOCSETF                          = 0x80084267\n\tBIOCSETIF                         = 0x8020426c\n\tBIOCSETWF                         = 0x80084277\n\tBIOCSFILDROP                      = 0x80044279\n\tBIOCSHDRCMPLT                     = 0x80044275\n\tBIOCSRSIG                         = 0x80044272\n\tBIOCSRTIMEOUT                     = 0x800c426d\n\tBIOCVERSION                       = 0x40044271\n\tBPF_A                             = 0x10\n\tBPF_ABS                           = 0x20\n\tBPF_ADD                           = 0x0\n\tBPF_ALIGNMENT                     = 0x4\n\tBPF_ALU                           = 0x4\n\tBPF_AND                           = 0x50\n\tBPF_B                             = 0x10\n\tBPF_DIRECTION_IN                  = 0x1\n\tBPF_DIRECTION_OUT                 = 0x2\n\tBPF_DIV                           = 0x30\n\tBPF_H                             = 0x8\n\tBPF_IMM                           = 0x0\n\tBPF_IND                           = 0x40\n\tBPF_JA                            = 0x0\n\tBPF_JEQ                           = 0x10\n\tBPF_JGE                           = 0x30\n\tBPF_JGT                           = 0x20\n\tBPF_JMP                           = 0x5\n\tBPF_JSET                          = 0x40\n\tBPF_K                             = 0x0\n\tBPF_LD                            = 0x0\n\tBPF_LDX                           = 0x1\n\tBPF_LEN                           = 0x80\n\tBPF_LSH                           = 0x60\n\tBPF_MAJOR_VERSION                 = 0x1\n\tBPF_MAXBUFSIZE                    = 0x200000\n\tBPF_MAXINSNS                      = 0x200\n\tBPF_MEM                           = 0x60\n\tBPF_MEMWORDS                      = 0x10\n\tBPF_MINBUFSIZE                    = 0x20\n\tBPF_MINOR_VERSION                 = 0x1\n\tBPF_MISC                          = 0x7\n\tBPF_MSH                           = 0xa0\n\tBPF_MUL                           = 0x20\n\tBPF_NEG                           = 0x80\n\tBPF_OR                            = 0x40\n\tBPF_RELEASE                       = 0x30bb6\n\tBPF_RET                           = 0x6\n\tBPF_RSH                           = 0x70\n\tBPF_ST                            = 0x2\n\tBPF_STX                           = 0x3\n\tBPF_SUB                           = 0x10\n\tBPF_TAX                           = 0x0\n\tBPF_TXA                           = 0x80\n\tBPF_W                             = 0x0\n\tBPF_X                             = 0x8\n\tBRKINT                            = 0x2\n\tCFLUSH                            = 0xf\n\tCLOCAL                            = 0x8000\n\tCREAD                             = 0x800\n\tCS5                               = 0x0\n\tCS6                               = 0x100\n\tCS7                               = 0x200\n\tCS8                               = 0x300\n\tCSIZE                             = 0x300\n\tCSTART                            = 0x11\n\tCSTATUS                           = 0xff\n\tCSTOP                             = 0x13\n\tCSTOPB                            = 0x400\n\tCSUSP                             = 0x1a\n\tCTL_MAXNAME                       = 0xc\n\tCTL_NET                           = 0x4\n\tDIOCOSFPFLUSH                     = 0x2000444e\n\tDLT_ARCNET                        = 0x7\n\tDLT_ATM_RFC1483                   = 0xb\n\tDLT_AX25                          = 0x3\n\tDLT_CHAOS                         = 0x5\n\tDLT_C_HDLC                        = 0x68\n\tDLT_EN10MB                        = 0x1\n\tDLT_EN3MB                         = 0x2\n\tDLT_ENC                           = 0xd\n\tDLT_FDDI                          = 0xa\n\tDLT_IEEE802                       = 0x6\n\tDLT_IEEE802_11                    = 0x69\n\tDLT_IEEE802_11_RADIO              = 0x7f\n\tDLT_LOOP                          = 0xc\n\tDLT_MPLS                          = 0xdb\n\tDLT_NULL                          = 0x0\n\tDLT_PFLOG                         = 0x75\n\tDLT_PFSYNC                        = 0x12\n\tDLT_PPP                           = 0x9\n\tDLT_PPP_BSDOS                     = 0x10\n\tDLT_PPP_ETHER                     = 0x33\n\tDLT_PPP_SERIAL                    = 0x32\n\tDLT_PRONET                        = 0x4\n\tDLT_RAW                           = 0xe\n\tDLT_SLIP                          = 0x8\n\tDLT_SLIP_BSDOS                    = 0xf\n\tDT_BLK                            = 0x6\n\tDT_CHR                            = 0x2\n\tDT_DIR                            = 0x4\n\tDT_FIFO                           = 0x1\n\tDT_LNK                            = 0xa\n\tDT_REG                            = 0x8\n\tDT_SOCK                           = 0xc\n\tDT_UNKNOWN                        = 0x0\n\tECHO                              = 0x8\n\tECHOCTL                           = 0x40\n\tECHOE                             = 0x2\n\tECHOK                             = 0x4\n\tECHOKE                            = 0x1\n\tECHONL                            = 0x10\n\tECHOPRT                           = 0x20\n\tEMT_TAGOVF                        = 0x1\n\tEMUL_ENABLED                      = 0x1\n\tEMUL_NATIVE                       = 0x2\n\tENDRUNDISC                        = 0x9\n\tETHERMIN                          = 0x2e\n\tETHERMTU                          = 0x5dc\n\tETHERTYPE_8023                    = 0x4\n\tETHERTYPE_AARP                    = 0x80f3\n\tETHERTYPE_ACCTON                  = 0x8390\n\tETHERTYPE_AEONIC                  = 0x8036\n\tETHERTYPE_ALPHA                   = 0x814a\n\tETHERTYPE_AMBER                   = 0x6008\n\tETHERTYPE_AMOEBA                  = 0x8145\n\tETHERTYPE_AOE                     = 0x88a2\n\tETHERTYPE_APOLLO                  = 0x80f7\n\tETHERTYPE_APOLLODOMAIN            = 0x8019\n\tETHERTYPE_APPLETALK               = 0x809b\n\tETHERTYPE_APPLITEK                = 0x80c7\n\tETHERTYPE_ARGONAUT                = 0x803a\n\tETHERTYPE_ARP                     = 0x806\n\tETHERTYPE_AT                      = 0x809b\n\tETHERTYPE_ATALK                   = 0x809b\n\tETHERTYPE_ATOMIC                  = 0x86df\n\tETHERTYPE_ATT                     = 0x8069\n\tETHERTYPE_ATTSTANFORD             = 0x8008\n\tETHERTYPE_AUTOPHON                = 0x806a\n\tETHERTYPE_AXIS                    = 0x8856\n\tETHERTYPE_BCLOOP                  = 0x9003\n\tETHERTYPE_BOFL                    = 0x8102\n\tETHERTYPE_CABLETRON               = 0x7034\n\tETHERTYPE_CHAOS                   = 0x804\n\tETHERTYPE_COMDESIGN               = 0x806c\n\tETHERTYPE_COMPUGRAPHIC            = 0x806d\n\tETHERTYPE_COUNTERPOINT            = 0x8062\n\tETHERTYPE_CRONUS                  = 0x8004\n\tETHERTYPE_CRONUSVLN               = 0x8003\n\tETHERTYPE_DCA                     = 0x1234\n\tETHERTYPE_DDE                     = 0x807b\n\tETHERTYPE_DEBNI                   = 0xaaaa\n\tETHERTYPE_DECAM                   = 0x8048\n\tETHERTYPE_DECCUST                 = 0x6006\n\tETHERTYPE_DECDIAG                 = 0x6005\n\tETHERTYPE_DECDNS                  = 0x803c\n\tETHERTYPE_DECDTS                  = 0x803e\n\tETHERTYPE_DECEXPER                = 0x6000\n\tETHERTYPE_DECLAST                 = 0x8041\n\tETHERTYPE_DECLTM                  = 0x803f\n\tETHERTYPE_DECMUMPS                = 0x6009\n\tETHERTYPE_DECNETBIOS              = 0x8040\n\tETHERTYPE_DELTACON                = 0x86de\n\tETHERTYPE_DIDDLE                  = 0x4321\n\tETHERTYPE_DLOG1                   = 0x660\n\tETHERTYPE_DLOG2                   = 0x661\n\tETHERTYPE_DN                      = 0x6003\n\tETHERTYPE_DOGFIGHT                = 0x1989\n\tETHERTYPE_DSMD                    = 0x8039\n\tETHERTYPE_ECMA                    = 0x803\n\tETHERTYPE_ENCRYPT                 = 0x803d\n\tETHERTYPE_ES                      = 0x805d\n\tETHERTYPE_EXCELAN                 = 0x8010\n\tETHERTYPE_EXPERDATA               = 0x8049\n\tETHERTYPE_FLIP                    = 0x8146\n\tETHERTYPE_FLOWCONTROL             = 0x8808\n\tETHERTYPE_FRARP                   = 0x808\n\tETHERTYPE_GENDYN                  = 0x8068\n\tETHERTYPE_HAYES                   = 0x8130\n\tETHERTYPE_HIPPI_FP                = 0x8180\n\tETHERTYPE_HITACHI                 = 0x8820\n\tETHERTYPE_HP                      = 0x8005\n\tETHERTYPE_IEEEPUP                 = 0xa00\n\tETHERTYPE_IEEEPUPAT               = 0xa01\n\tETHERTYPE_IMLBL                   = 0x4c42\n\tETHERTYPE_IMLBLDIAG               = 0x424c\n\tETHERTYPE_IP                      = 0x800\n\tETHERTYPE_IPAS                    = 0x876c\n\tETHERTYPE_IPV6                    = 0x86dd\n\tETHERTYPE_IPX                     = 0x8137\n\tETHERTYPE_IPXNEW                  = 0x8037\n\tETHERTYPE_KALPANA                 = 0x8582\n\tETHERTYPE_LANBRIDGE               = 0x8038\n\tETHERTYPE_LANPROBE                = 0x8888\n\tETHERTYPE_LAT                     = 0x6004\n\tETHERTYPE_LBACK                   = 0x9000\n\tETHERTYPE_LITTLE                  = 0x8060\n\tETHERTYPE_LLDP                    = 0x88cc\n\tETHERTYPE_LOGICRAFT               = 0x8148\n\tETHERTYPE_LOOPBACK                = 0x9000\n\tETHERTYPE_MATRA                   = 0x807a\n\tETHERTYPE_MAX                     = 0xffff\n\tETHERTYPE_MERIT                   = 0x807c\n\tETHERTYPE_MICP                    = 0x873a\n\tETHERTYPE_MOPDL                   = 0x6001\n\tETHERTYPE_MOPRC                   = 0x6002\n\tETHERTYPE_MOTOROLA                = 0x818d\n\tETHERTYPE_MPLS                    = 0x8847\n\tETHERTYPE_MPLS_MCAST              = 0x8848\n\tETHERTYPE_MUMPS                   = 0x813f\n\tETHERTYPE_NBPCC                   = 0x3c04\n\tETHERTYPE_NBPCLAIM                = 0x3c09\n\tETHERTYPE_NBPCLREQ                = 0x3c05\n\tETHERTYPE_NBPCLRSP                = 0x3c06\n\tETHERTYPE_NBPCREQ                 = 0x3c02\n\tETHERTYPE_NBPCRSP                 = 0x3c03\n\tETHERTYPE_NBPDG                   = 0x3c07\n\tETHERTYPE_NBPDGB                  = 0x3c08\n\tETHERTYPE_NBPDLTE                 = 0x3c0a\n\tETHERTYPE_NBPRAR                  = 0x3c0c\n\tETHERTYPE_NBPRAS                  = 0x3c0b\n\tETHERTYPE_NBPRST                  = 0x3c0d\n\tETHERTYPE_NBPSCD                  = 0x3c01\n\tETHERTYPE_NBPVCD                  = 0x3c00\n\tETHERTYPE_NBS                     = 0x802\n\tETHERTYPE_NCD                     = 0x8149\n\tETHERTYPE_NESTAR                  = 0x8006\n\tETHERTYPE_NETBEUI                 = 0x8191\n\tETHERTYPE_NOVELL                  = 0x8138\n\tETHERTYPE_NS                      = 0x600\n\tETHERTYPE_NSAT                    = 0x601\n\tETHERTYPE_NSCOMPAT                = 0x807\n\tETHERTYPE_NTRAILER                = 0x10\n\tETHERTYPE_OS9                     = 0x7007\n\tETHERTYPE_OS9NET                  = 0x7009\n\tETHERTYPE_PACER                   = 0x80c6\n\tETHERTYPE_PAE                     = 0x888e\n\tETHERTYPE_PCS                     = 0x4242\n\tETHERTYPE_PLANNING                = 0x8044\n\tETHERTYPE_PPP                     = 0x880b\n\tETHERTYPE_PPPOE                   = 0x8864\n\tETHERTYPE_PPPOEDISC               = 0x8863\n\tETHERTYPE_PRIMENTS                = 0x7031\n\tETHERTYPE_PUP                     = 0x200\n\tETHERTYPE_PUPAT                   = 0x200\n\tETHERTYPE_QINQ                    = 0x88a8\n\tETHERTYPE_RACAL                   = 0x7030\n\tETHERTYPE_RATIONAL                = 0x8150\n\tETHERTYPE_RAWFR                   = 0x6559\n\tETHERTYPE_RCL                     = 0x1995\n\tETHERTYPE_RDP                     = 0x8739\n\tETHERTYPE_RETIX                   = 0x80f2\n\tETHERTYPE_REVARP                  = 0x8035\n\tETHERTYPE_SCA                     = 0x6007\n\tETHERTYPE_SECTRA                  = 0x86db\n\tETHERTYPE_SECUREDATA              = 0x876d\n\tETHERTYPE_SGITW                   = 0x817e\n\tETHERTYPE_SG_BOUNCE               = 0x8016\n\tETHERTYPE_SG_DIAG                 = 0x8013\n\tETHERTYPE_SG_NETGAMES             = 0x8014\n\tETHERTYPE_SG_RESV                 = 0x8015\n\tETHERTYPE_SIMNET                  = 0x5208\n\tETHERTYPE_SLOW                    = 0x8809\n\tETHERTYPE_SNA                     = 0x80d5\n\tETHERTYPE_SNMP                    = 0x814c\n\tETHERTYPE_SONIX                   = 0xfaf5\n\tETHERTYPE_SPIDER                  = 0x809f\n\tETHERTYPE_SPRITE                  = 0x500\n\tETHERTYPE_STP                     = 0x8181\n\tETHERTYPE_TALARIS                 = 0x812b\n\tETHERTYPE_TALARISMC               = 0x852b\n\tETHERTYPE_TCPCOMP                 = 0x876b\n\tETHERTYPE_TCPSM                   = 0x9002\n\tETHERTYPE_TEC                     = 0x814f\n\tETHERTYPE_TIGAN                   = 0x802f\n\tETHERTYPE_TRAIL                   = 0x1000\n\tETHERTYPE_TRANSETHER              = 0x6558\n\tETHERTYPE_TYMSHARE                = 0x802e\n\tETHERTYPE_UBBST                   = 0x7005\n\tETHERTYPE_UBDEBUG                 = 0x900\n\tETHERTYPE_UBDIAGLOOP              = 0x7002\n\tETHERTYPE_UBDL                    = 0x7000\n\tETHERTYPE_UBNIU                   = 0x7001\n\tETHERTYPE_UBNMC                   = 0x7003\n\tETHERTYPE_VALID                   = 0x1600\n\tETHERTYPE_VARIAN                  = 0x80dd\n\tETHERTYPE_VAXELN                  = 0x803b\n\tETHERTYPE_VEECO                   = 0x8067\n\tETHERTYPE_VEXP                    = 0x805b\n\tETHERTYPE_VGLAB                   = 0x8131\n\tETHERTYPE_VINES                   = 0xbad\n\tETHERTYPE_VINESECHO               = 0xbaf\n\tETHERTYPE_VINESLOOP               = 0xbae\n\tETHERTYPE_VITAL                   = 0xff00\n\tETHERTYPE_VLAN                    = 0x8100\n\tETHERTYPE_VLTLMAN                 = 0x8080\n\tETHERTYPE_VPROD                   = 0x805c\n\tETHERTYPE_VURESERVED              = 0x8147\n\tETHERTYPE_WATERLOO                = 0x8130\n\tETHERTYPE_WELLFLEET               = 0x8103\n\tETHERTYPE_X25                     = 0x805\n\tETHERTYPE_X75                     = 0x801\n\tETHERTYPE_XNSSM                   = 0x9001\n\tETHERTYPE_XTP                     = 0x817d\n\tETHER_ADDR_LEN                    = 0x6\n\tETHER_ALIGN                       = 0x2\n\tETHER_CRC_LEN                     = 0x4\n\tETHER_CRC_POLY_BE                 = 0x4c11db6\n\tETHER_CRC_POLY_LE                 = 0xedb88320\n\tETHER_HDR_LEN                     = 0xe\n\tETHER_MAX_DIX_LEN                 = 0x600\n\tETHER_MAX_LEN                     = 0x5ee\n\tETHER_MIN_LEN                     = 0x40\n\tETHER_TYPE_LEN                    = 0x2\n\tETHER_VLAN_ENCAP_LEN              = 0x4\n\tEVFILT_AIO                        = -0x3\n\tEVFILT_PROC                       = -0x5\n\tEVFILT_READ                       = -0x1\n\tEVFILT_SIGNAL                     = -0x6\n\tEVFILT_SYSCOUNT                   = 0x7\n\tEVFILT_TIMER                      = -0x7\n\tEVFILT_VNODE                      = -0x4\n\tEVFILT_WRITE                      = -0x2\n\tEV_ADD                            = 0x1\n\tEV_CLEAR                          = 0x20\n\tEV_DELETE                         = 0x2\n\tEV_DISABLE                        = 0x8\n\tEV_ENABLE                         = 0x4\n\tEV_EOF                            = 0x8000\n\tEV_ERROR                          = 0x4000\n\tEV_FLAG1                          = 0x2000\n\tEV_ONESHOT                        = 0x10\n\tEV_SYSFLAGS                       = 0xf000\n\tEXTA                              = 0x4b00\n\tEXTB                              = 0x9600\n\tEXTPROC                           = 0x800\n\tFD_CLOEXEC                        = 0x1\n\tFD_SETSIZE                        = 0x400\n\tFLUSHO                            = 0x800000\n\tF_DUPFD                           = 0x0\n\tF_DUPFD_CLOEXEC                   = 0xa\n\tF_GETFD                           = 0x1\n\tF_GETFL                           = 0x3\n\tF_GETLK                           = 0x7\n\tF_GETOWN                          = 0x5\n\tF_RDLCK                           = 0x1\n\tF_SETFD                           = 0x2\n\tF_SETFL                           = 0x4\n\tF_SETLK                           = 0x8\n\tF_SETLKW                          = 0x9\n\tF_SETOWN                          = 0x6\n\tF_UNLCK                           = 0x2\n\tF_WRLCK                           = 0x3\n\tHUPCL                             = 0x4000\n\tICANON                            = 0x100\n\tICMP6_FILTER                      = 0x12\n\tICRNL                             = 0x100\n\tIEXTEN                            = 0x400\n\tIFAN_ARRIVAL                      = 0x0\n\tIFAN_DEPARTURE                    = 0x1\n\tIFA_ROUTE                         = 0x1\n\tIFF_ALLMULTI                      = 0x200\n\tIFF_BROADCAST                     = 0x2\n\tIFF_CANTCHANGE                    = 0x8e52\n\tIFF_DEBUG                         = 0x4\n\tIFF_LINK0                         = 0x1000\n\tIFF_LINK1                         = 0x2000\n\tIFF_LINK2                         = 0x4000\n\tIFF_LOOPBACK                      = 0x8\n\tIFF_MULTICAST                     = 0x8000\n\tIFF_NOARP                         = 0x80\n\tIFF_NOTRAILERS                    = 0x20\n\tIFF_OACTIVE                       = 0x400\n\tIFF_POINTOPOINT                   = 0x10\n\tIFF_PROMISC                       = 0x100\n\tIFF_RUNNING                       = 0x40\n\tIFF_SIMPLEX                       = 0x800\n\tIFF_UP                            = 0x1\n\tIFNAMSIZ                          = 0x10\n\tIFT_1822                          = 0x2\n\tIFT_A12MPPSWITCH                  = 0x82\n\tIFT_AAL2                          = 0xbb\n\tIFT_AAL5                          = 0x31\n\tIFT_ADSL                          = 0x5e\n\tIFT_AFLANE8023                    = 0x3b\n\tIFT_AFLANE8025                    = 0x3c\n\tIFT_ARAP                          = 0x58\n\tIFT_ARCNET                        = 0x23\n\tIFT_ARCNETPLUS                    = 0x24\n\tIFT_ASYNC                         = 0x54\n\tIFT_ATM                           = 0x25\n\tIFT_ATMDXI                        = 0x69\n\tIFT_ATMFUNI                       = 0x6a\n\tIFT_ATMIMA                        = 0x6b\n\tIFT_ATMLOGICAL                    = 0x50\n\tIFT_ATMRADIO                      = 0xbd\n\tIFT_ATMSUBINTERFACE               = 0x86\n\tIFT_ATMVCIENDPT                   = 0xc2\n\tIFT_ATMVIRTUAL                    = 0x95\n\tIFT_BGPPOLICYACCOUNTING           = 0xa2\n\tIFT_BLUETOOTH                     = 0xf8\n\tIFT_BRIDGE                        = 0xd1\n\tIFT_BSC                           = 0x53\n\tIFT_CARP                          = 0xf7\n\tIFT_CCTEMUL                       = 0x3d\n\tIFT_CEPT                          = 0x13\n\tIFT_CES                           = 0x85\n\tIFT_CHANNEL                       = 0x46\n\tIFT_CNR                           = 0x55\n\tIFT_COFFEE                        = 0x84\n\tIFT_COMPOSITELINK                 = 0x9b\n\tIFT_DCN                           = 0x8d\n\tIFT_DIGITALPOWERLINE              = 0x8a\n\tIFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba\n\tIFT_DLSW                          = 0x4a\n\tIFT_DOCSCABLEDOWNSTREAM           = 0x80\n\tIFT_DOCSCABLEMACLAYER             = 0x7f\n\tIFT_DOCSCABLEUPSTREAM             = 0x81\n\tIFT_DOCSCABLEUPSTREAMCHANNEL      = 0xcd\n\tIFT_DS0                           = 0x51\n\tIFT_DS0BUNDLE                     = 0x52\n\tIFT_DS1FDL                        = 0xaa\n\tIFT_DS3                           = 0x1e\n\tIFT_DTM                           = 0x8c\n\tIFT_DUMMY                         = 0xf1\n\tIFT_DVBASILN                      = 0xac\n\tIFT_DVBASIOUT                     = 0xad\n\tIFT_DVBRCCDOWNSTREAM              = 0x93\n\tIFT_DVBRCCMACLAYER                = 0x92\n\tIFT_DVBRCCUPSTREAM                = 0x94\n\tIFT_ECONET                        = 0xce\n\tIFT_ENC                           = 0xf4\n\tIFT_EON                           = 0x19\n\tIFT_EPLRS                         = 0x57\n\tIFT_ESCON                         = 0x49\n\tIFT_ETHER                         = 0x6\n\tIFT_FAITH                         = 0xf3\n\tIFT_FAST                          = 0x7d\n\tIFT_FASTETHER                     = 0x3e\n\tIFT_FASTETHERFX                   = 0x45\n\tIFT_FDDI                          = 0xf\n\tIFT_FIBRECHANNEL                  = 0x38\n\tIFT_FRAMERELAYINTERCONNECT        = 0x3a\n\tIFT_FRAMERELAYMPI                 = 0x5c\n\tIFT_FRDLCIENDPT                   = 0xc1\n\tIFT_FRELAY                        = 0x20\n\tIFT_FRELAYDCE                     = 0x2c\n\tIFT_FRF16MFRBUNDLE                = 0xa3\n\tIFT_FRFORWARD                     = 0x9e\n\tIFT_G703AT2MB                     = 0x43\n\tIFT_G703AT64K                     = 0x42\n\tIFT_GIF                           = 0xf0\n\tIFT_GIGABITETHERNET               = 0x75\n\tIFT_GR303IDT                      = 0xb2\n\tIFT_GR303RDT                      = 0xb1\n\tIFT_H323GATEKEEPER                = 0xa4\n\tIFT_H323PROXY                     = 0xa5\n\tIFT_HDH1822                       = 0x3\n\tIFT_HDLC                          = 0x76\n\tIFT_HDSL2                         = 0xa8\n\tIFT_HIPERLAN2                     = 0xb7\n\tIFT_HIPPI                         = 0x2f\n\tIFT_HIPPIINTERFACE                = 0x39\n\tIFT_HOSTPAD                       = 0x5a\n\tIFT_HSSI                          = 0x2e\n\tIFT_HY                            = 0xe\n\tIFT_IBM370PARCHAN                 = 0x48\n\tIFT_IDSL                          = 0x9a\n\tIFT_IEEE1394                      = 0x90\n\tIFT_IEEE80211                     = 0x47\n\tIFT_IEEE80212                     = 0x37\n\tIFT_IEEE8023ADLAG                 = 0xa1\n\tIFT_IFGSN                         = 0x91\n\tIFT_IMT                           = 0xbe\n\tIFT_INFINIBAND                    = 0xc7\n\tIFT_INTERLEAVE                    = 0x7c\n\tIFT_IP                            = 0x7e\n\tIFT_IPFORWARD                     = 0x8e\n\tIFT_IPOVERATM                     = 0x72\n\tIFT_IPOVERCDLC                    = 0x6d\n\tIFT_IPOVERCLAW                    = 0x6e\n\tIFT_IPSWITCH                      = 0x4e\n\tIFT_ISDN                          = 0x3f\n\tIFT_ISDNBASIC                     = 0x14\n\tIFT_ISDNPRIMARY                   = 0x15\n\tIFT_ISDNS                         = 0x4b\n\tIFT_ISDNU                         = 0x4c\n\tIFT_ISO88022LLC                   = 0x29\n\tIFT_ISO88023                      = 0x7\n\tIFT_ISO88024                      = 0x8\n\tIFT_ISO88025                      = 0x9\n\tIFT_ISO88025CRFPINT               = 0x62\n\tIFT_ISO88025DTR                   = 0x56\n\tIFT_ISO88025FIBER                 = 0x73\n\tIFT_ISO88026                      = 0xa\n\tIFT_ISUP                          = 0xb3\n\tIFT_L2VLAN                        = 0x87\n\tIFT_L3IPVLAN                      = 0x88\n\tIFT_L3IPXVLAN                     = 0x89\n\tIFT_LAPB                          = 0x10\n\tIFT_LAPD                          = 0x4d\n\tIFT_LAPF                          = 0x77\n\tIFT_LINEGROUP                     = 0xd2\n\tIFT_LOCALTALK                     = 0x2a\n\tIFT_LOOP                          = 0x18\n\tIFT_MEDIAMAILOVERIP               = 0x8b\n\tIFT_MFSIGLINK                     = 0xa7\n\tIFT_MIOX25                        = 0x26\n\tIFT_MODEM                         = 0x30\n\tIFT_MPC                           = 0x71\n\tIFT_MPLS                          = 0xa6\n\tIFT_MPLSTUNNEL                    = 0x96\n\tIFT_MSDSL                         = 0x8f\n\tIFT_MVL                           = 0xbf\n\tIFT_MYRINET                       = 0x63\n\tIFT_NFAS                          = 0xaf\n\tIFT_NSIP                          = 0x1b\n\tIFT_OPTICALCHANNEL                = 0xc3\n\tIFT_OPTICALTRANSPORT              = 0xc4\n\tIFT_OTHER                         = 0x1\n\tIFT_P10                           = 0xc\n\tIFT_P80                           = 0xd\n\tIFT_PARA                          = 0x22\n\tIFT_PFLOG                         = 0xf5\n\tIFT_PFLOW                         = 0xf9\n\tIFT_PFSYNC                        = 0xf6\n\tIFT_PLC                           = 0xae\n\tIFT_PON155                        = 0xcf\n\tIFT_PON622                        = 0xd0\n\tIFT_POS                           = 0xab\n\tIFT_PPP                           = 0x17\n\tIFT_PPPMULTILINKBUNDLE            = 0x6c\n\tIFT_PROPATM                       = 0xc5\n\tIFT_PROPBWAP2MP                   = 0xb8\n\tIFT_PROPCNLS                      = 0x59\n\tIFT_PROPDOCSWIRELESSDOWNSTREAM    = 0xb5\n\tIFT_PROPDOCSWIRELESSMACLAYER      = 0xb4\n\tIFT_PROPDOCSWIRELESSUPSTREAM      = 0xb6\n\tIFT_PROPMUX                       = 0x36\n\tIFT_PROPVIRTUAL                   = 0x35\n\tIFT_PROPWIRELESSP2P               = 0x9d\n\tIFT_PTPSERIAL                     = 0x16\n\tIFT_PVC                           = 0xf2\n\tIFT_Q2931                         = 0xc9\n\tIFT_QLLC                          = 0x44\n\tIFT_RADIOMAC                      = 0xbc\n\tIFT_RADSL                         = 0x5f\n\tIFT_REACHDSL                      = 0xc0\n\tIFT_RFC1483                       = 0x9f\n\tIFT_RS232                         = 0x21\n\tIFT_RSRB                          = 0x4f\n\tIFT_SDLC                          = 0x11\n\tIFT_SDSL                          = 0x60\n\tIFT_SHDSL                         = 0xa9\n\tIFT_SIP                           = 0x1f\n\tIFT_SIPSIG                        = 0xcc\n\tIFT_SIPTG                         = 0xcb\n\tIFT_SLIP                          = 0x1c\n\tIFT_SMDSDXI                       = 0x2b\n\tIFT_SMDSICIP                      = 0x34\n\tIFT_SONET                         = 0x27\n\tIFT_SONETOVERHEADCHANNEL          = 0xb9\n\tIFT_SONETPATH                     = 0x32\n\tIFT_SONETVT                       = 0x33\n\tIFT_SRP                           = 0x97\n\tIFT_SS7SIGLINK                    = 0x9c\n\tIFT_STACKTOSTACK                  = 0x6f\n\tIFT_STARLAN                       = 0xb\n\tIFT_T1                            = 0x12\n\tIFT_TDLC                          = 0x74\n\tIFT_TELINK                        = 0xc8\n\tIFT_TERMPAD                       = 0x5b\n\tIFT_TR008                         = 0xb0\n\tIFT_TRANSPHDLC                    = 0x7b\n\tIFT_TUNNEL                        = 0x83\n\tIFT_ULTRA                         = 0x1d\n\tIFT_USB                           = 0xa0\n\tIFT_V11                           = 0x40\n\tIFT_V35                           = 0x2d\n\tIFT_V36                           = 0x41\n\tIFT_V37                           = 0x78\n\tIFT_VDSL                          = 0x61\n\tIFT_VIRTUALIPADDRESS              = 0x70\n\tIFT_VIRTUALTG                     = 0xca\n\tIFT_VOICEDID                      = 0xd5\n\tIFT_VOICEEM                       = 0x64\n\tIFT_VOICEEMFGD                    = 0xd3\n\tIFT_VOICEENCAP                    = 0x67\n\tIFT_VOICEFGDEANA                  = 0xd4\n\tIFT_VOICEFXO                      = 0x65\n\tIFT_VOICEFXS                      = 0x66\n\tIFT_VOICEOVERATM                  = 0x98\n\tIFT_VOICEOVERCABLE                = 0xc6\n\tIFT_VOICEOVERFRAMERELAY           = 0x99\n\tIFT_VOICEOVERIP                   = 0x68\n\tIFT_X213                          = 0x5d\n\tIFT_X25                           = 0x5\n\tIFT_X25DDN                        = 0x4\n\tIFT_X25HUNTGROUP                  = 0x7a\n\tIFT_X25MLP                        = 0x79\n\tIFT_X25PLE                        = 0x28\n\tIFT_XETHER                        = 0x1a\n\tIGNBRK                            = 0x1\n\tIGNCR                             = 0x80\n\tIGNPAR                            = 0x4\n\tIMAXBEL                           = 0x2000\n\tINLCR                             = 0x40\n\tINPCK                             = 0x10\n\tIN_CLASSA_HOST                    = 0xffffff\n\tIN_CLASSA_MAX                     = 0x80\n\tIN_CLASSA_NET                     = 0xff000000\n\tIN_CLASSA_NSHIFT                  = 0x18\n\tIN_CLASSB_HOST                    = 0xffff\n\tIN_CLASSB_MAX                     = 0x10000\n\tIN_CLASSB_NET                     = 0xffff0000\n\tIN_CLASSB_NSHIFT                  = 0x10\n\tIN_CLASSC_HOST                    = 0xff\n\tIN_CLASSC_NET                     = 0xffffff00\n\tIN_CLASSC_NSHIFT                  = 0x8\n\tIN_CLASSD_HOST                    = 0xfffffff\n\tIN_CLASSD_NET                     = 0xf0000000\n\tIN_CLASSD_NSHIFT                  = 0x1c\n\tIN_LOOPBACKNET                    = 0x7f\n\tIN_RFC3021_HOST                   = 0x1\n\tIN_RFC3021_NET                    = 0xfffffffe\n\tIN_RFC3021_NSHIFT                 = 0x1f\n\tIPPROTO_AH                        = 0x33\n\tIPPROTO_CARP                      = 0x70\n\tIPPROTO_DIVERT                    = 0x102\n\tIPPROTO_DIVERT_INIT               = 0x2\n\tIPPROTO_DIVERT_RESP               = 0x1\n\tIPPROTO_DONE                      = 0x101\n\tIPPROTO_DSTOPTS                   = 0x3c\n\tIPPROTO_EGP                       = 0x8\n\tIPPROTO_ENCAP                     = 0x62\n\tIPPROTO_EON                       = 0x50\n\tIPPROTO_ESP                       = 0x32\n\tIPPROTO_ETHERIP                   = 0x61\n\tIPPROTO_FRAGMENT                  = 0x2c\n\tIPPROTO_GGP                       = 0x3\n\tIPPROTO_GRE                       = 0x2f\n\tIPPROTO_HOPOPTS                   = 0x0\n\tIPPROTO_ICMP                      = 0x1\n\tIPPROTO_ICMPV6                    = 0x3a\n\tIPPROTO_IDP                       = 0x16\n\tIPPROTO_IGMP                      = 0x2\n\tIPPROTO_IP                        = 0x0\n\tIPPROTO_IPCOMP                    = 0x6c\n\tIPPROTO_IPIP                      = 0x4\n\tIPPROTO_IPV4                      = 0x4\n\tIPPROTO_IPV6                      = 0x29\n\tIPPROTO_MAX                       = 0x100\n\tIPPROTO_MAXID                     = 0x103\n\tIPPROTO_MOBILE                    = 0x37\n\tIPPROTO_MPLS                      = 0x89\n\tIPPROTO_NONE                      = 0x3b\n\tIPPROTO_PFSYNC                    = 0xf0\n\tIPPROTO_PIM                       = 0x67\n\tIPPROTO_PUP                       = 0xc\n\tIPPROTO_RAW                       = 0xff\n\tIPPROTO_ROUTING                   = 0x2b\n\tIPPROTO_RSVP                      = 0x2e\n\tIPPROTO_TCP                       = 0x6\n\tIPPROTO_TP                        = 0x1d\n\tIPPROTO_UDP                       = 0x11\n\tIPV6_AUTH_LEVEL                   = 0x35\n\tIPV6_AUTOFLOWLABEL                = 0x3b\n\tIPV6_CHECKSUM                     = 0x1a\n\tIPV6_DEFAULT_MULTICAST_HOPS       = 0x1\n\tIPV6_DEFAULT_MULTICAST_LOOP       = 0x1\n\tIPV6_DEFHLIM                      = 0x40\n\tIPV6_DONTFRAG                     = 0x3e\n\tIPV6_DSTOPTS                      = 0x32\n\tIPV6_ESP_NETWORK_LEVEL            = 0x37\n\tIPV6_ESP_TRANS_LEVEL              = 0x36\n\tIPV6_FAITH                        = 0x1d\n\tIPV6_FLOWINFO_MASK                = 0xffffff0f\n\tIPV6_FLOWLABEL_MASK               = 0xffff0f00\n\tIPV6_FRAGTTL                      = 0x78\n\tIPV6_HLIMDEC                      = 0x1\n\tIPV6_HOPLIMIT                     = 0x2f\n\tIPV6_HOPOPTS                      = 0x31\n\tIPV6_IPCOMP_LEVEL                 = 0x3c\n\tIPV6_JOIN_GROUP                   = 0xc\n\tIPV6_LEAVE_GROUP                  = 0xd\n\tIPV6_MAXHLIM                      = 0xff\n\tIPV6_MAXPACKET                    = 0xffff\n\tIPV6_MMTU                         = 0x500\n\tIPV6_MULTICAST_HOPS               = 0xa\n\tIPV6_MULTICAST_IF                 = 0x9\n\tIPV6_MULTICAST_LOOP               = 0xb\n\tIPV6_NEXTHOP                      = 0x30\n\tIPV6_OPTIONS                      = 0x1\n\tIPV6_PATHMTU                      = 0x2c\n\tIPV6_PIPEX                        = 0x3f\n\tIPV6_PKTINFO                      = 0x2e\n\tIPV6_PORTRANGE                    = 0xe\n\tIPV6_PORTRANGE_DEFAULT            = 0x0\n\tIPV6_PORTRANGE_HIGH               = 0x1\n\tIPV6_PORTRANGE_LOW                = 0x2\n\tIPV6_RECVDSTOPTS                  = 0x28\n\tIPV6_RECVDSTPORT                  = 0x40\n\tIPV6_RECVHOPLIMIT                 = 0x25\n\tIPV6_RECVHOPOPTS                  = 0x27\n\tIPV6_RECVPATHMTU                  = 0x2b\n\tIPV6_RECVPKTINFO                  = 0x24\n\tIPV6_RECVRTHDR                    = 0x26\n\tIPV6_RECVTCLASS                   = 0x39\n\tIPV6_RTABLE                       = 0x1021\n\tIPV6_RTHDR                        = 0x33\n\tIPV6_RTHDRDSTOPTS                 = 0x23\n\tIPV6_RTHDR_LOOSE                  = 0x0\n\tIPV6_RTHDR_STRICT                 = 0x1\n\tIPV6_RTHDR_TYPE_0                 = 0x0\n\tIPV6_SOCKOPT_RESERVED1            = 0x3\n\tIPV6_TCLASS                       = 0x3d\n\tIPV6_UNICAST_HOPS                 = 0x4\n\tIPV6_USE_MIN_MTU                  = 0x2a\n\tIPV6_V6ONLY                       = 0x1b\n\tIPV6_VERSION                      = 0x60\n\tIPV6_VERSION_MASK                 = 0xf0\n\tIP_ADD_MEMBERSHIP                 = 0xc\n\tIP_AUTH_LEVEL                     = 0x14\n\tIP_DEFAULT_MULTICAST_LOOP         = 0x1\n\tIP_DEFAULT_MULTICAST_TTL          = 0x1\n\tIP_DF                             = 0x4000\n\tIP_DIVERTFL                       = 0x1022\n\tIP_DROP_MEMBERSHIP                = 0xd\n\tIP_ESP_NETWORK_LEVEL              = 0x16\n\tIP_ESP_TRANS_LEVEL                = 0x15\n\tIP_HDRINCL                        = 0x2\n\tIP_IPCOMP_LEVEL                   = 0x1d\n\tIP_IPSECFLOWINFO                  = 0x24\n\tIP_IPSEC_LOCAL_AUTH               = 0x1b\n\tIP_IPSEC_LOCAL_CRED               = 0x19\n\tIP_IPSEC_LOCAL_ID                 = 0x17\n\tIP_IPSEC_REMOTE_AUTH              = 0x1c\n\tIP_IPSEC_REMOTE_CRED              = 0x1a\n\tIP_IPSEC_REMOTE_ID                = 0x18\n\tIP_MAXPACKET                      = 0xffff\n\tIP_MAX_MEMBERSHIPS                = 0xfff\n\tIP_MF                             = 0x2000\n\tIP_MINTTL                         = 0x20\n\tIP_MIN_MEMBERSHIPS                = 0xf\n\tIP_MSS                            = 0x240\n\tIP_MULTICAST_IF                   = 0x9\n\tIP_MULTICAST_LOOP                 = 0xb\n\tIP_MULTICAST_TTL                  = 0xa\n\tIP_OFFMASK                        = 0x1fff\n\tIP_OPTIONS                        = 0x1\n\tIP_PIPEX                          = 0x22\n\tIP_PORTRANGE                      = 0x13\n\tIP_PORTRANGE_DEFAULT              = 0x0\n\tIP_PORTRANGE_HIGH                 = 0x1\n\tIP_PORTRANGE_LOW                  = 0x2\n\tIP_RECVDSTADDR                    = 0x7\n\tIP_RECVDSTPORT                    = 0x21\n\tIP_RECVIF                         = 0x1e\n\tIP_RECVOPTS                       = 0x5\n\tIP_RECVRETOPTS                    = 0x6\n\tIP_RECVRTABLE                     = 0x23\n\tIP_RECVTTL                        = 0x1f\n\tIP_RETOPTS                        = 0x8\n\tIP_RF                             = 0x8000\n\tIP_RTABLE                         = 0x1021\n\tIP_TOS                            = 0x3\n\tIP_TTL                            = 0x4\n\tISIG                              = 0x80\n\tISTRIP                            = 0x20\n\tIXANY                             = 0x800\n\tIXOFF                             = 0x400\n\tIXON                              = 0x200\n\tLCNT_OVERLOAD_FLUSH               = 0x6\n\tLOCK_EX                           = 0x2\n\tLOCK_NB                           = 0x4\n\tLOCK_SH                           = 0x1\n\tLOCK_UN                           = 0x8\n\tMADV_DONTNEED                     = 0x4\n\tMADV_FREE                         = 0x6\n\tMADV_NORMAL                       = 0x0\n\tMADV_RANDOM                       = 0x1\n\tMADV_SEQUENTIAL                   = 0x2\n\tMADV_SPACEAVAIL                   = 0x5\n\tMADV_WILLNEED                     = 0x3\n\tMAP_ANON                          = 0x1000\n\tMAP_ANONYMOUS                     = 0x1000\n\tMAP_COPY                          = 0x2\n\tMAP_FILE                          = 0x0\n\tMAP_FIXED                         = 0x10\n\tMAP_FLAGMASK                      = 0x3ff7\n\tMAP_HASSEMAPHORE                  = 0x0\n\tMAP_INHERIT                       = 0x0\n\tMAP_INHERIT_COPY                  = 0x1\n\tMAP_INHERIT_NONE                  = 0x2\n\tMAP_INHERIT_SHARE                 = 0x0\n\tMAP_INHERIT_ZERO                  = 0x3\n\tMAP_NOEXTEND                      = 0x0\n\tMAP_NORESERVE                     = 0x0\n\tMAP_PRIVATE                       = 0x2\n\tMAP_RENAME                        = 0x0\n\tMAP_SHARED                        = 0x1\n\tMAP_TRYFIXED                      = 0x0\n\tMCL_CURRENT                       = 0x1\n\tMCL_FUTURE                        = 0x2\n\tMSG_BCAST                         = 0x100\n\tMSG_CMSG_CLOEXEC                  = 0x800\n\tMSG_CTRUNC                        = 0x20\n\tMSG_DONTROUTE                     = 0x4\n\tMSG_DONTWAIT                      = 0x80\n\tMSG_EOR                           = 0x8\n\tMSG_MCAST                         = 0x200\n\tMSG_NOSIGNAL                      = 0x400\n\tMSG_OOB                           = 0x1\n\tMSG_PEEK                          = 0x2\n\tMSG_TRUNC                         = 0x10\n\tMSG_WAITALL                       = 0x40\n\tMS_ASYNC                          = 0x1\n\tMS_INVALIDATE                     = 0x4\n\tMS_SYNC                           = 0x2\n\tNAME_MAX                          = 0xff\n\tNET_RT_DUMP                       = 0x1\n\tNET_RT_FLAGS                      = 0x2\n\tNET_RT_IFLIST                     = 0x3\n\tNET_RT_MAXID                      = 0x6\n\tNET_RT_STATS                      = 0x4\n\tNET_RT_TABLE                      = 0x5\n\tNOFLSH                            = 0x80000000\n\tNOTE_ATTRIB                       = 0x8\n\tNOTE_CHILD                        = 0x4\n\tNOTE_DELETE                       = 0x1\n\tNOTE_EOF                          = 0x2\n\tNOTE_EXEC                         = 0x20000000\n\tNOTE_EXIT                         = 0x80000000\n\tNOTE_EXTEND                       = 0x4\n\tNOTE_FORK                         = 0x40000000\n\tNOTE_LINK                         = 0x10\n\tNOTE_LOWAT                        = 0x1\n\tNOTE_PCTRLMASK                    = 0xf0000000\n\tNOTE_PDATAMASK                    = 0xfffff\n\tNOTE_RENAME                       = 0x20\n\tNOTE_REVOKE                       = 0x40\n\tNOTE_TRACK                        = 0x1\n\tNOTE_TRACKERR                     = 0x2\n\tNOTE_TRUNCATE                     = 0x80\n\tNOTE_WRITE                        = 0x2\n\tOCRNL                             = 0x10\n\tONLCR                             = 0x2\n\tONLRET                            = 0x80\n\tONOCR                             = 0x40\n\tONOEOT                            = 0x8\n\tOPOST                             = 0x1\n\tO_ACCMODE                         = 0x3\n\tO_APPEND                          = 0x8\n\tO_ASYNC                           = 0x40\n\tO_CLOEXEC                         = 0x10000\n\tO_CREAT                           = 0x200\n\tO_DIRECTORY                       = 0x20000\n\tO_DSYNC                           = 0x80\n\tO_EXCL                            = 0x800\n\tO_EXLOCK                          = 0x20\n\tO_FSYNC                           = 0x80\n\tO_NDELAY                          = 0x4\n\tO_NOCTTY                          = 0x8000\n\tO_NOFOLLOW                        = 0x100\n\tO_NONBLOCK                        = 0x4\n\tO_RDONLY                          = 0x0\n\tO_RDWR                            = 0x2\n\tO_RSYNC                           = 0x80\n\tO_SHLOCK                          = 0x10\n\tO_SYNC                            = 0x80\n\tO_TRUNC                           = 0x400\n\tO_WRONLY                          = 0x1\n\tPARENB                            = 0x1000\n\tPARMRK                            = 0x8\n\tPARODD                            = 0x2000\n\tPENDIN                            = 0x20000000\n\tPF_FLUSH                          = 0x1\n\tPRIO_PGRP                         = 0x1\n\tPRIO_PROCESS                      = 0x0\n\tPRIO_USER                         = 0x2\n\tPROT_EXEC                         = 0x4\n\tPROT_NONE                         = 0x0\n\tPROT_READ                         = 0x1\n\tPROT_WRITE                        = 0x2\n\tRLIMIT_CORE                       = 0x4\n\tRLIMIT_CPU                        = 0x0\n\tRLIMIT_DATA                       = 0x2\n\tRLIMIT_FSIZE                      = 0x1\n\tRLIMIT_NOFILE                     = 0x8\n\tRLIMIT_STACK                      = 0x3\n\tRLIM_INFINITY                     = 0x7fffffffffffffff\n\tRTAX_AUTHOR                       = 0x6\n\tRTAX_BRD                          = 0x7\n\tRTAX_DST                          = 0x0\n\tRTAX_GATEWAY                      = 0x1\n\tRTAX_GENMASK                      = 0x3\n\tRTAX_IFA                          = 0x5\n\tRTAX_IFP                          = 0x4\n\tRTAX_LABEL                        = 0xa\n\tRTAX_MAX                          = 0xb\n\tRTAX_NETMASK                      = 0x2\n\tRTAX_SRC                          = 0x8\n\tRTAX_SRCMASK                      = 0x9\n\tRTA_AUTHOR                        = 0x40\n\tRTA_BRD                           = 0x80\n\tRTA_DST                           = 0x1\n\tRTA_GATEWAY                       = 0x2\n\tRTA_GENMASK                       = 0x8\n\tRTA_IFA                           = 0x20\n\tRTA_IFP                           = 0x10\n\tRTA_LABEL                         = 0x400\n\tRTA_NETMASK                       = 0x4\n\tRTA_SRC                           = 0x100\n\tRTA_SRCMASK                       = 0x200\n\tRTF_ANNOUNCE                      = 0x4000\n\tRTF_BLACKHOLE                     = 0x1000\n\tRTF_BROADCAST                     = 0x400000\n\tRTF_CLONED                        = 0x10000\n\tRTF_CLONING                       = 0x100\n\tRTF_DONE                          = 0x40\n\tRTF_DYNAMIC                       = 0x10\n\tRTF_FMASK                         = 0x70f808\n\tRTF_GATEWAY                       = 0x2\n\tRTF_HOST                          = 0x4\n\tRTF_LLINFO                        = 0x400\n\tRTF_LOCAL                         = 0x200000\n\tRTF_MASK                          = 0x80\n\tRTF_MODIFIED                      = 0x20\n\tRTF_MPATH                         = 0x40000\n\tRTF_MPLS                          = 0x100000\n\tRTF_PERMANENT_ARP                 = 0x2000\n\tRTF_PROTO1                        = 0x8000\n\tRTF_PROTO2                        = 0x4000\n\tRTF_PROTO3                        = 0x2000\n\tRTF_REJECT                        = 0x8\n\tRTF_STATIC                        = 0x800\n\tRTF_UP                            = 0x1\n\tRTF_USETRAILERS                   = 0x8000\n\tRTF_XRESOLVE                      = 0x200\n\tRTM_ADD                           = 0x1\n\tRTM_CHANGE                        = 0x3\n\tRTM_DELADDR                       = 0xd\n\tRTM_DELETE                        = 0x2\n\tRTM_DESYNC                        = 0x10\n\tRTM_GET                           = 0x4\n\tRTM_IFANNOUNCE                    = 0xf\n\tRTM_IFINFO                        = 0xe\n\tRTM_LOCK                          = 0x8\n\tRTM_LOSING                        = 0x5\n\tRTM_MAXSIZE                       = 0x800\n\tRTM_MISS                          = 0x7\n\tRTM_NEWADDR                       = 0xc\n\tRTM_REDIRECT                      = 0x6\n\tRTM_RESOLVE                       = 0xb\n\tRTM_RTTUNIT                       = 0xf4240\n\tRTM_VERSION                       = 0x5\n\tRTV_EXPIRE                        = 0x4\n\tRTV_HOPCOUNT                      = 0x2\n\tRTV_MTU                           = 0x1\n\tRTV_RPIPE                         = 0x8\n\tRTV_RTT                           = 0x40\n\tRTV_RTTVAR                        = 0x80\n\tRTV_SPIPE                         = 0x10\n\tRTV_SSTHRESH                      = 0x20\n\tRT_TABLEID_MAX                    = 0xff\n\tRUSAGE_CHILDREN                   = -0x1\n\tRUSAGE_SELF                       = 0x0\n\tRUSAGE_THREAD                     = 0x1\n\tSCM_RIGHTS                        = 0x1\n\tSCM_TIMESTAMP                     = 0x4\n\tSHUT_RD                           = 0x0\n\tSHUT_RDWR                         = 0x2\n\tSHUT_WR                           = 0x1\n\tSIOCADDMULTI                      = 0x80206931\n\tSIOCAIFADDR                       = 0x8040691a\n\tSIOCAIFGROUP                      = 0x80246987\n\tSIOCALIFADDR                      = 0x8218691c\n\tSIOCATMARK                        = 0x40047307\n\tSIOCBRDGADD                       = 0x8054693c\n\tSIOCBRDGADDS                      = 0x80546941\n\tSIOCBRDGARL                       = 0x806e694d\n\tSIOCBRDGDADDR                     = 0x81286947\n\tSIOCBRDGDEL                       = 0x8054693d\n\tSIOCBRDGDELS                      = 0x80546942\n\tSIOCBRDGFLUSH                     = 0x80546948\n\tSIOCBRDGFRL                       = 0x806e694e\n\tSIOCBRDGGCACHE                    = 0xc0146941\n\tSIOCBRDGGFD                       = 0xc0146952\n\tSIOCBRDGGHT                       = 0xc0146951\n\tSIOCBRDGGIFFLGS                   = 0xc054693e\n\tSIOCBRDGGMA                       = 0xc0146953\n\tSIOCBRDGGPARAM                    = 0xc03c6958\n\tSIOCBRDGGPRI                      = 0xc0146950\n\tSIOCBRDGGRL                       = 0xc028694f\n\tSIOCBRDGGSIFS                     = 0xc054693c\n\tSIOCBRDGGTO                       = 0xc0146946\n\tSIOCBRDGIFS                       = 0xc0546942\n\tSIOCBRDGRTS                       = 0xc0186943\n\tSIOCBRDGSADDR                     = 0xc1286944\n\tSIOCBRDGSCACHE                    = 0x80146940\n\tSIOCBRDGSFD                       = 0x80146952\n\tSIOCBRDGSHT                       = 0x80146951\n\tSIOCBRDGSIFCOST                   = 0x80546955\n\tSIOCBRDGSIFFLGS                   = 0x8054693f\n\tSIOCBRDGSIFPRIO                   = 0x80546954\n\tSIOCBRDGSMA                       = 0x80146953\n\tSIOCBRDGSPRI                      = 0x80146950\n\tSIOCBRDGSPROTO                    = 0x8014695a\n\tSIOCBRDGSTO                       = 0x80146945\n\tSIOCBRDGSTXHC                     = 0x80146959\n\tSIOCDELMULTI                      = 0x80206932\n\tSIOCDIFADDR                       = 0x80206919\n\tSIOCDIFGROUP                      = 0x80246989\n\tSIOCDIFPHYADDR                    = 0x80206949\n\tSIOCDLIFADDR                      = 0x8218691e\n\tSIOCGETKALIVE                     = 0xc01869a4\n\tSIOCGETLABEL                      = 0x8020699a\n\tSIOCGETPFLOW                      = 0xc02069fe\n\tSIOCGETPFSYNC                     = 0xc02069f8\n\tSIOCGETSGCNT                      = 0xc0147534\n\tSIOCGETVIFCNT                     = 0xc0147533\n\tSIOCGETVLAN                       = 0xc0206990\n\tSIOCGHIWAT                        = 0x40047301\n\tSIOCGIFADDR                       = 0xc0206921\n\tSIOCGIFASYNCMAP                   = 0xc020697c\n\tSIOCGIFBRDADDR                    = 0xc0206923\n\tSIOCGIFCONF                       = 0xc0086924\n\tSIOCGIFDATA                       = 0xc020691b\n\tSIOCGIFDESCR                      = 0xc0206981\n\tSIOCGIFDSTADDR                    = 0xc0206922\n\tSIOCGIFFLAGS                      = 0xc0206911\n\tSIOCGIFGATTR                      = 0xc024698b\n\tSIOCGIFGENERIC                    = 0xc020693a\n\tSIOCGIFGMEMB                      = 0xc024698a\n\tSIOCGIFGROUP                      = 0xc0246988\n\tSIOCGIFHARDMTU                    = 0xc02069a5\n\tSIOCGIFMEDIA                      = 0xc0286936\n\tSIOCGIFMETRIC                     = 0xc0206917\n\tSIOCGIFMTU                        = 0xc020697e\n\tSIOCGIFNETMASK                    = 0xc0206925\n\tSIOCGIFPDSTADDR                   = 0xc0206948\n\tSIOCGIFPRIORITY                   = 0xc020699c\n\tSIOCGIFPSRCADDR                   = 0xc0206947\n\tSIOCGIFRDOMAIN                    = 0xc02069a0\n\tSIOCGIFRTLABEL                    = 0xc0206983\n\tSIOCGIFRXR                        = 0x802069aa\n\tSIOCGIFTIMESLOT                   = 0xc0206986\n\tSIOCGIFXFLAGS                     = 0xc020699e\n\tSIOCGLIFADDR                      = 0xc218691d\n\tSIOCGLIFPHYADDR                   = 0xc218694b\n\tSIOCGLIFPHYRTABLE                 = 0xc02069a2\n\tSIOCGLIFPHYTTL                    = 0xc02069a9\n\tSIOCGLOWAT                        = 0x40047303\n\tSIOCGPGRP                         = 0x40047309\n\tSIOCGSPPPPARAMS                   = 0xc0206994\n\tSIOCGVH                           = 0xc02069f6\n\tSIOCGVNETID                       = 0xc02069a7\n\tSIOCIFCREATE                      = 0x8020697a\n\tSIOCIFDESTROY                     = 0x80206979\n\tSIOCIFGCLONERS                    = 0xc00c6978\n\tSIOCSETKALIVE                     = 0x801869a3\n\tSIOCSETLABEL                      = 0x80206999\n\tSIOCSETPFLOW                      = 0x802069fd\n\tSIOCSETPFSYNC                     = 0x802069f7\n\tSIOCSETVLAN                       = 0x8020698f\n\tSIOCSHIWAT                        = 0x80047300\n\tSIOCSIFADDR                       = 0x8020690c\n\tSIOCSIFASYNCMAP                   = 0x8020697d\n\tSIOCSIFBRDADDR                    = 0x80206913\n\tSIOCSIFDESCR                      = 0x80206980\n\tSIOCSIFDSTADDR                    = 0x8020690e\n\tSIOCSIFFLAGS                      = 0x80206910\n\tSIOCSIFGATTR                      = 0x8024698c\n\tSIOCSIFGENERIC                    = 0x80206939\n\tSIOCSIFLLADDR                     = 0x8020691f\n\tSIOCSIFMEDIA                      = 0xc0206935\n\tSIOCSIFMETRIC                     = 0x80206918\n\tSIOCSIFMTU                        = 0x8020697f\n\tSIOCSIFNETMASK                    = 0x80206916\n\tSIOCSIFPHYADDR                    = 0x80406946\n\tSIOCSIFPRIORITY                   = 0x8020699b\n\tSIOCSIFRDOMAIN                    = 0x8020699f\n\tSIOCSIFRTLABEL                    = 0x80206982\n\tSIOCSIFTIMESLOT                   = 0x80206985\n\tSIOCSIFXFLAGS                     = 0x8020699d\n\tSIOCSLIFPHYADDR                   = 0x8218694a\n\tSIOCSLIFPHYRTABLE                 = 0x802069a1\n\tSIOCSLIFPHYTTL                    = 0x802069a8\n\tSIOCSLOWAT                        = 0x80047302\n\tSIOCSPGRP                         = 0x80047308\n\tSIOCSSPPPPARAMS                   = 0x80206993\n\tSIOCSVH                           = 0xc02069f5\n\tSIOCSVNETID                       = 0x802069a6\n\tSOCK_CLOEXEC                      = 0x8000\n\tSOCK_DGRAM                        = 0x2\n\tSOCK_NONBLOCK                     = 0x4000\n\tSOCK_RAW                          = 0x3\n\tSOCK_RDM                          = 0x4\n\tSOCK_SEQPACKET                    = 0x5\n\tSOCK_STREAM                       = 0x1\n\tSOL_SOCKET                        = 0xffff\n\tSOMAXCONN                         = 0x80\n\tSO_ACCEPTCONN                     = 0x2\n\tSO_BINDANY                        = 0x1000\n\tSO_BROADCAST                      = 0x20\n\tSO_DEBUG                          = 0x1\n\tSO_DONTROUTE                      = 0x10\n\tSO_ERROR                          = 0x1007\n\tSO_KEEPALIVE                      = 0x8\n\tSO_LINGER                         = 0x80\n\tSO_NETPROC                        = 0x1020\n\tSO_OOBINLINE                      = 0x100\n\tSO_PEERCRED                       = 0x1022\n\tSO_RCVBUF                         = 0x1002\n\tSO_RCVLOWAT                       = 0x1004\n\tSO_RCVTIMEO                       = 0x1006\n\tSO_REUSEADDR                      = 0x4\n\tSO_REUSEPORT                      = 0x200\n\tSO_RTABLE                         = 0x1021\n\tSO_SNDBUF                         = 0x1001\n\tSO_SNDLOWAT                       = 0x1003\n\tSO_SNDTIMEO                       = 0x1005\n\tSO_SPLICE                         = 0x1023\n\tSO_TIMESTAMP                      = 0x800\n\tSO_TYPE                           = 0x1008\n\tSO_USELOOPBACK                    = 0x40\n\tTCIFLUSH                          = 0x1\n\tTCIOFLUSH                         = 0x3\n\tTCOFLUSH                          = 0x2\n\tTCP_MAXBURST                      = 0x4\n\tTCP_MAXSEG                        = 0x2\n\tTCP_MAXWIN                        = 0xffff\n\tTCP_MAX_SACK                      = 0x3\n\tTCP_MAX_WINSHIFT                  = 0xe\n\tTCP_MD5SIG                        = 0x4\n\tTCP_MSS                           = 0x200\n\tTCP_NODELAY                       = 0x1\n\tTCP_NOPUSH                        = 0x10\n\tTCP_NSTATES                       = 0xb\n\tTCP_SACK_ENABLE                   = 0x8\n\tTCSAFLUSH                         = 0x2\n\tTIOCCBRK                          = 0x2000747a\n\tTIOCCDTR                          = 0x20007478\n\tTIOCCONS                          = 0x80047462\n\tTIOCDRAIN                         = 0x2000745e\n\tTIOCEXCL                          = 0x2000740d\n\tTIOCEXT                           = 0x80047460\n\tTIOCFLAG_CLOCAL                   = 0x2\n\tTIOCFLAG_CRTSCTS                  = 0x4\n\tTIOCFLAG_MDMBUF                   = 0x8\n\tTIOCFLAG_PPS                      = 0x10\n\tTIOCFLAG_SOFTCAR                  = 0x1\n\tTIOCFLUSH                         = 0x80047410\n\tTIOCGETA                          = 0x402c7413\n\tTIOCGETD                          = 0x4004741a\n\tTIOCGFLAGS                        = 0x4004745d\n\tTIOCGPGRP                         = 0x40047477\n\tTIOCGSID                          = 0x40047463\n\tTIOCGTSTAMP                       = 0x400c745b\n\tTIOCGWINSZ                        = 0x40087468\n\tTIOCMBIC                          = 0x8004746b\n\tTIOCMBIS                          = 0x8004746c\n\tTIOCMGET                          = 0x4004746a\n\tTIOCMODG                          = 0x4004746a\n\tTIOCMODS                          = 0x8004746d\n\tTIOCMSET                          = 0x8004746d\n\tTIOCM_CAR                         = 0x40\n\tTIOCM_CD                          = 0x40\n\tTIOCM_CTS                         = 0x20\n\tTIOCM_DSR                         = 0x100\n\tTIOCM_DTR                         = 0x2\n\tTIOCM_LE                          = 0x1\n\tTIOCM_RI                          = 0x80\n\tTIOCM_RNG                         = 0x80\n\tTIOCM_RTS                         = 0x4\n\tTIOCM_SR                          = 0x10\n\tTIOCM_ST                          = 0x8\n\tTIOCNOTTY                         = 0x20007471\n\tTIOCNXCL                          = 0x2000740e\n\tTIOCOUTQ                          = 0x40047473\n\tTIOCPKT                           = 0x80047470\n\tTIOCPKT_DATA                      = 0x0\n\tTIOCPKT_DOSTOP                    = 0x20\n\tTIOCPKT_FLUSHREAD                 = 0x1\n\tTIOCPKT_FLUSHWRITE                = 0x2\n\tTIOCPKT_IOCTL                     = 0x40\n\tTIOCPKT_NOSTOP                    = 0x10\n\tTIOCPKT_START                     = 0x8\n\tTIOCPKT_STOP                      = 0x4\n\tTIOCREMOTE                        = 0x80047469\n\tTIOCSBRK                          = 0x2000747b\n\tTIOCSCTTY                         = 0x20007461\n\tTIOCSDTR                          = 0x20007479\n\tTIOCSETA                          = 0x802c7414\n\tTIOCSETAF                         = 0x802c7416\n\tTIOCSETAW                         = 0x802c7415\n\tTIOCSETD                          = 0x8004741b\n\tTIOCSFLAGS                        = 0x8004745c\n\tTIOCSIG                           = 0x8004745f\n\tTIOCSPGRP                         = 0x80047476\n\tTIOCSTART                         = 0x2000746e\n\tTIOCSTAT                          = 0x80047465\n\tTIOCSTI                           = 0x80017472\n\tTIOCSTOP                          = 0x2000746f\n\tTIOCSTSTAMP                       = 0x8008745a\n\tTIOCSWINSZ                        = 0x80087467\n\tTIOCUCNTL                         = 0x80047466\n\tTOSTOP                            = 0x400000\n\tVDISCARD                          = 0xf\n\tVDSUSP                            = 0xb\n\tVEOF                              = 0x0\n\tVEOL                              = 0x1\n\tVEOL2                             = 0x2\n\tVERASE                            = 0x3\n\tVINTR                             = 0x8\n\tVKILL                             = 0x5\n\tVLNEXT                            = 0xe\n\tVMIN                              = 0x10\n\tVQUIT                             = 0x9\n\tVREPRINT                          = 0x6\n\tVSTART                            = 0xc\n\tVSTATUS                           = 0x12\n\tVSTOP                             = 0xd\n\tVSUSP                             = 0xa\n\tVTIME                             = 0x11\n\tVWERASE                           = 0x4\n\tWALTSIG                           = 0x4\n\tWCONTINUED                        = 0x8\n\tWCOREFLAG                         = 0x80\n\tWNOHANG                           = 0x1\n\tWUNTRACED                         = 0x2\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x30)\n\tEADDRNOTAVAIL   = syscall.Errno(0x31)\n\tEAFNOSUPPORT    = syscall.Errno(0x2f)\n\tEAGAIN          = syscall.Errno(0x23)\n\tEALREADY        = syscall.Errno(0x25)\n\tEAUTH           = syscall.Errno(0x50)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADRPC         = syscall.Errno(0x48)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x58)\n\tECHILD          = syscall.Errno(0xa)\n\tECONNABORTED    = syscall.Errno(0x35)\n\tECONNREFUSED    = syscall.Errno(0x3d)\n\tECONNRESET      = syscall.Errno(0x36)\n\tEDEADLK         = syscall.Errno(0xb)\n\tEDESTADDRREQ    = syscall.Errno(0x27)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x45)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEFTYPE          = syscall.Errno(0x4f)\n\tEHOSTDOWN       = syscall.Errno(0x40)\n\tEHOSTUNREACH    = syscall.Errno(0x41)\n\tEIDRM           = syscall.Errno(0x59)\n\tEILSEQ          = syscall.Errno(0x54)\n\tEINPROGRESS     = syscall.Errno(0x24)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEIPSEC          = syscall.Errno(0x52)\n\tEISCONN         = syscall.Errno(0x38)\n\tEISDIR          = syscall.Errno(0x15)\n\tELAST           = syscall.Errno(0x5b)\n\tELOOP           = syscall.Errno(0x3e)\n\tEMEDIUMTYPE     = syscall.Errno(0x56)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x28)\n\tENAMETOOLONG    = syscall.Errno(0x3f)\n\tENEEDAUTH       = syscall.Errno(0x51)\n\tENETDOWN        = syscall.Errno(0x32)\n\tENETRESET       = syscall.Errno(0x34)\n\tENETUNREACH     = syscall.Errno(0x33)\n\tENFILE          = syscall.Errno(0x17)\n\tENOATTR         = syscall.Errno(0x53)\n\tENOBUFS         = syscall.Errno(0x37)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x4d)\n\tENOMEDIUM       = syscall.Errno(0x55)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x5a)\n\tENOPROTOOPT     = syscall.Errno(0x2a)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSYS          = syscall.Errno(0x4e)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x39)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x42)\n\tENOTSOCK        = syscall.Errno(0x26)\n\tENOTSUP         = syscall.Errno(0x5b)\n\tENOTTY          = syscall.Errno(0x19)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x2d)\n\tEOVERFLOW       = syscall.Errno(0x57)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x2e)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROCLIM        = syscall.Errno(0x43)\n\tEPROCUNAVAIL    = syscall.Errno(0x4c)\n\tEPROGMISMATCH   = syscall.Errno(0x4b)\n\tEPROGUNAVAIL    = syscall.Errno(0x4a)\n\tEPROTONOSUPPORT = syscall.Errno(0x2b)\n\tEPROTOTYPE      = syscall.Errno(0x29)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMOTE         = syscall.Errno(0x47)\n\tEROFS           = syscall.Errno(0x1e)\n\tERPCMISMATCH    = syscall.Errno(0x49)\n\tESHUTDOWN       = syscall.Errno(0x3a)\n\tESOCKTNOSUPPORT = syscall.Errno(0x2c)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESTALE          = syscall.Errno(0x46)\n\tETIMEDOUT       = syscall.Errno(0x3c)\n\tETOOMANYREFS    = syscall.Errno(0x3b)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUSERS          = syscall.Errno(0x44)\n\tEWOULDBLOCK     = syscall.Errno(0x23)\n\tEXDEV           = syscall.Errno(0x12)\n)\n\n// Signals\nconst (\n\tSIGABRT   = syscall.Signal(0x6)\n\tSIGALRM   = syscall.Signal(0xe)\n\tSIGBUS    = syscall.Signal(0xa)\n\tSIGCHLD   = syscall.Signal(0x14)\n\tSIGCONT   = syscall.Signal(0x13)\n\tSIGEMT    = syscall.Signal(0x7)\n\tSIGFPE    = syscall.Signal(0x8)\n\tSIGHUP    = syscall.Signal(0x1)\n\tSIGILL    = syscall.Signal(0x4)\n\tSIGINFO   = syscall.Signal(0x1d)\n\tSIGINT    = syscall.Signal(0x2)\n\tSIGIO     = syscall.Signal(0x17)\n\tSIGIOT    = syscall.Signal(0x6)\n\tSIGKILL   = syscall.Signal(0x9)\n\tSIGPIPE   = syscall.Signal(0xd)\n\tSIGPROF   = syscall.Signal(0x1b)\n\tSIGQUIT   = syscall.Signal(0x3)\n\tSIGSEGV   = syscall.Signal(0xb)\n\tSIGSTOP   = syscall.Signal(0x11)\n\tSIGSYS    = syscall.Signal(0xc)\n\tSIGTERM   = syscall.Signal(0xf)\n\tSIGTHR    = syscall.Signal(0x20)\n\tSIGTRAP   = syscall.Signal(0x5)\n\tSIGTSTP   = syscall.Signal(0x12)\n\tSIGTTIN   = syscall.Signal(0x15)\n\tSIGTTOU   = syscall.Signal(0x16)\n\tSIGURG    = syscall.Signal(0x10)\n\tSIGUSR1   = syscall.Signal(0x1e)\n\tSIGUSR2   = syscall.Signal(0x1f)\n\tSIGVTALRM = syscall.Signal(0x1a)\n\tSIGWINCH  = syscall.Signal(0x1c)\n\tSIGXCPU   = syscall.Signal(0x18)\n\tSIGXFSZ   = syscall.Signal(0x19)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:  \"operation not permitted\",\n\t2:  \"no such file or directory\",\n\t3:  \"no such process\",\n\t4:  \"interrupted system call\",\n\t5:  \"input/output error\",\n\t6:  \"device not configured\",\n\t7:  \"argument list too long\",\n\t8:  \"exec format error\",\n\t9:  \"bad file descriptor\",\n\t10: \"no child processes\",\n\t11: \"resource deadlock avoided\",\n\t12: \"cannot allocate memory\",\n\t13: \"permission denied\",\n\t14: \"bad address\",\n\t15: \"block device required\",\n\t16: \"device busy\",\n\t17: \"file exists\",\n\t18: \"cross-device link\",\n\t19: \"operation not supported by device\",\n\t20: \"not a directory\",\n\t21: \"is a directory\",\n\t22: \"invalid argument\",\n\t23: \"too many open files in system\",\n\t24: \"too many open files\",\n\t25: \"inappropriate ioctl for device\",\n\t26: \"text file busy\",\n\t27: \"file too large\",\n\t28: \"no space left on device\",\n\t29: \"illegal seek\",\n\t30: \"read-only file system\",\n\t31: \"too many links\",\n\t32: \"broken pipe\",\n\t33: \"numerical argument out of domain\",\n\t34: \"result too large\",\n\t35: \"resource temporarily unavailable\",\n\t36: \"operation now in progress\",\n\t37: \"operation already in progress\",\n\t38: \"socket operation on non-socket\",\n\t39: \"destination address required\",\n\t40: \"message too long\",\n\t41: \"protocol wrong type for socket\",\n\t42: \"protocol not available\",\n\t43: \"protocol not supported\",\n\t44: \"socket type not supported\",\n\t45: \"operation not supported\",\n\t46: \"protocol family not supported\",\n\t47: \"address family not supported by protocol family\",\n\t48: \"address already in use\",\n\t49: \"can't assign requested address\",\n\t50: \"network is down\",\n\t51: \"network is unreachable\",\n\t52: \"network dropped connection on reset\",\n\t53: \"software caused connection abort\",\n\t54: \"connection reset by peer\",\n\t55: \"no buffer space available\",\n\t56: \"socket is already connected\",\n\t57: \"socket is not connected\",\n\t58: \"can't send after socket shutdown\",\n\t59: \"too many references: can't splice\",\n\t60: \"connection timed out\",\n\t61: \"connection refused\",\n\t62: \"too many levels of symbolic links\",\n\t63: \"file name too long\",\n\t64: \"host is down\",\n\t65: \"no route to host\",\n\t66: \"directory not empty\",\n\t67: \"too many processes\",\n\t68: \"too many users\",\n\t69: \"disc quota exceeded\",\n\t70: \"stale NFS file handle\",\n\t71: \"too many levels of remote in path\",\n\t72: \"RPC struct is bad\",\n\t73: \"RPC version wrong\",\n\t74: \"RPC prog. not avail\",\n\t75: \"program version wrong\",\n\t76: \"bad procedure for program\",\n\t77: \"no locks available\",\n\t78: \"function not implemented\",\n\t79: \"inappropriate file type or format\",\n\t80: \"authentication error\",\n\t81: \"need authenticator\",\n\t82: \"IPsec processing failure\",\n\t83: \"attribute not found\",\n\t84: \"illegal byte sequence\",\n\t85: \"no medium found\",\n\t86: \"wrong medium type\",\n\t87: \"value too large to be stored in data type\",\n\t88: \"operation canceled\",\n\t89: \"identifier removed\",\n\t90: \"no message of desired type\",\n\t91: \"not supported\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/BPT trap\",\n\t6:  \"abort trap\",\n\t7:  \"EMT trap\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"bus error\",\n\t11: \"segmentation fault\",\n\t12: \"bad system call\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n\t16: \"urgent I/O condition\",\n\t17: \"stopped (signal)\",\n\t18: \"stopped\",\n\t19: \"continued\",\n\t20: \"child exited\",\n\t21: \"stopped (tty input)\",\n\t22: \"stopped (tty output)\",\n\t23: \"I/O possible\",\n\t24: \"cputime limit exceeded\",\n\t25: \"filesize limit exceeded\",\n\t26: \"virtual timer expired\",\n\t27: \"profiling timer expired\",\n\t28: \"window size changes\",\n\t29: \"information request\",\n\t30: \"user defined signal 1\",\n\t31: \"user defined signal 2\",\n\t32: \"thread AST\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go",
    "content": "// mkerrors.sh -m64\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,solaris\n\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs -- -m64 _const.go\n\npackage unix\n\nimport \"syscall\"\n\nconst (\n\tAF_802                        = 0x12\n\tAF_APPLETALK                  = 0x10\n\tAF_CCITT                      = 0xa\n\tAF_CHAOS                      = 0x5\n\tAF_DATAKIT                    = 0x9\n\tAF_DECnet                     = 0xc\n\tAF_DLI                        = 0xd\n\tAF_ECMA                       = 0x8\n\tAF_FILE                       = 0x1\n\tAF_GOSIP                      = 0x16\n\tAF_HYLINK                     = 0xf\n\tAF_IMPLINK                    = 0x3\n\tAF_INET                       = 0x2\n\tAF_INET6                      = 0x1a\n\tAF_INET_OFFLOAD               = 0x1e\n\tAF_IPX                        = 0x17\n\tAF_KEY                        = 0x1b\n\tAF_LAT                        = 0xe\n\tAF_LINK                       = 0x19\n\tAF_LOCAL                      = 0x1\n\tAF_MAX                        = 0x20\n\tAF_NBS                        = 0x7\n\tAF_NCA                        = 0x1c\n\tAF_NIT                        = 0x11\n\tAF_NS                         = 0x6\n\tAF_OSI                        = 0x13\n\tAF_OSINET                     = 0x15\n\tAF_PACKET                     = 0x20\n\tAF_POLICY                     = 0x1d\n\tAF_PUP                        = 0x4\n\tAF_ROUTE                      = 0x18\n\tAF_SNA                        = 0xb\n\tAF_TRILL                      = 0x1f\n\tAF_UNIX                       = 0x1\n\tAF_UNSPEC                     = 0x0\n\tAF_X25                        = 0x14\n\tARPHRD_ARCNET                 = 0x7\n\tARPHRD_ATM                    = 0x10\n\tARPHRD_AX25                   = 0x3\n\tARPHRD_CHAOS                  = 0x5\n\tARPHRD_EETHER                 = 0x2\n\tARPHRD_ETHER                  = 0x1\n\tARPHRD_FC                     = 0x12\n\tARPHRD_FRAME                  = 0xf\n\tARPHRD_HDLC                   = 0x11\n\tARPHRD_IB                     = 0x20\n\tARPHRD_IEEE802                = 0x6\n\tARPHRD_IPATM                  = 0x13\n\tARPHRD_METRICOM               = 0x17\n\tARPHRD_TUNNEL                 = 0x1f\n\tB0                            = 0x0\n\tB110                          = 0x3\n\tB115200                       = 0x12\n\tB1200                         = 0x9\n\tB134                          = 0x4\n\tB150                          = 0x5\n\tB153600                       = 0x13\n\tB1800                         = 0xa\n\tB19200                        = 0xe\n\tB200                          = 0x6\n\tB230400                       = 0x14\n\tB2400                         = 0xb\n\tB300                          = 0x7\n\tB307200                       = 0x15\n\tB38400                        = 0xf\n\tB460800                       = 0x16\n\tB4800                         = 0xc\n\tB50                           = 0x1\n\tB57600                        = 0x10\n\tB600                          = 0x8\n\tB75                           = 0x2\n\tB76800                        = 0x11\n\tB921600                       = 0x17\n\tB9600                         = 0xd\n\tBIOCFLUSH                     = 0x20004268\n\tBIOCGBLEN                     = 0x40044266\n\tBIOCGDLT                      = 0x4004426a\n\tBIOCGDLTLIST                  = -0x3fefbd89\n\tBIOCGDLTLIST32                = -0x3ff7bd89\n\tBIOCGETIF                     = 0x4020426b\n\tBIOCGETLIF                    = 0x4078426b\n\tBIOCGHDRCMPLT                 = 0x40044274\n\tBIOCGRTIMEOUT                 = 0x4010427b\n\tBIOCGRTIMEOUT32               = 0x4008427b\n\tBIOCGSEESENT                  = 0x40044278\n\tBIOCGSTATS                    = 0x4080426f\n\tBIOCGSTATSOLD                 = 0x4008426f\n\tBIOCIMMEDIATE                 = -0x7ffbbd90\n\tBIOCPROMISC                   = 0x20004269\n\tBIOCSBLEN                     = -0x3ffbbd9a\n\tBIOCSDLT                      = -0x7ffbbd8a\n\tBIOCSETF                      = -0x7fefbd99\n\tBIOCSETF32                    = -0x7ff7bd99\n\tBIOCSETIF                     = -0x7fdfbd94\n\tBIOCSETLIF                    = -0x7f87bd94\n\tBIOCSHDRCMPLT                 = -0x7ffbbd8b\n\tBIOCSRTIMEOUT                 = -0x7fefbd86\n\tBIOCSRTIMEOUT32               = -0x7ff7bd86\n\tBIOCSSEESENT                  = -0x7ffbbd87\n\tBIOCSTCPF                     = -0x7fefbd8e\n\tBIOCSUDPF                     = -0x7fefbd8d\n\tBIOCVERSION                   = 0x40044271\n\tBPF_A                         = 0x10\n\tBPF_ABS                       = 0x20\n\tBPF_ADD                       = 0x0\n\tBPF_ALIGNMENT                 = 0x4\n\tBPF_ALU                       = 0x4\n\tBPF_AND                       = 0x50\n\tBPF_B                         = 0x10\n\tBPF_DFLTBUFSIZE               = 0x100000\n\tBPF_DIV                       = 0x30\n\tBPF_H                         = 0x8\n\tBPF_IMM                       = 0x0\n\tBPF_IND                       = 0x40\n\tBPF_JA                        = 0x0\n\tBPF_JEQ                       = 0x10\n\tBPF_JGE                       = 0x30\n\tBPF_JGT                       = 0x20\n\tBPF_JMP                       = 0x5\n\tBPF_JSET                      = 0x40\n\tBPF_K                         = 0x0\n\tBPF_LD                        = 0x0\n\tBPF_LDX                       = 0x1\n\tBPF_LEN                       = 0x80\n\tBPF_LSH                       = 0x60\n\tBPF_MAJOR_VERSION             = 0x1\n\tBPF_MAXBUFSIZE                = 0x1000000\n\tBPF_MAXINSNS                  = 0x200\n\tBPF_MEM                       = 0x60\n\tBPF_MEMWORDS                  = 0x10\n\tBPF_MINBUFSIZE                = 0x20\n\tBPF_MINOR_VERSION             = 0x1\n\tBPF_MISC                      = 0x7\n\tBPF_MSH                       = 0xa0\n\tBPF_MUL                       = 0x20\n\tBPF_NEG                       = 0x80\n\tBPF_OR                        = 0x40\n\tBPF_RELEASE                   = 0x30bb6\n\tBPF_RET                       = 0x6\n\tBPF_RSH                       = 0x70\n\tBPF_ST                        = 0x2\n\tBPF_STX                       = 0x3\n\tBPF_SUB                       = 0x10\n\tBPF_TAX                       = 0x0\n\tBPF_TXA                       = 0x80\n\tBPF_W                         = 0x0\n\tBPF_X                         = 0x8\n\tBRKINT                        = 0x2\n\tBS0                           = 0x0\n\tBS1                           = 0x2000\n\tBSDLY                         = 0x2000\n\tCBAUD                         = 0xf\n\tCFLUSH                        = 0xf\n\tCIBAUD                        = 0xf0000\n\tCLOCAL                        = 0x800\n\tCLOCK_HIGHRES                 = 0x4\n\tCLOCK_LEVEL                   = 0xa\n\tCLOCK_MONOTONIC               = 0x4\n\tCLOCK_PROCESS_CPUTIME_ID      = 0x5\n\tCLOCK_PROF                    = 0x2\n\tCLOCK_REALTIME                = 0x3\n\tCLOCK_THREAD_CPUTIME_ID       = 0x2\n\tCLOCK_VIRTUAL                 = 0x1\n\tCR0                           = 0x0\n\tCR1                           = 0x200\n\tCR2                           = 0x400\n\tCR3                           = 0x600\n\tCRDLY                         = 0x600\n\tCREAD                         = 0x80\n\tCRTSCTS                       = 0x80000000\n\tCS5                           = 0x0\n\tCS6                           = 0x10\n\tCS7                           = 0x20\n\tCS8                           = 0x30\n\tCSIZE                         = 0x30\n\tCSTART                        = 0x11\n\tCSTATUS                       = 0x14\n\tCSTOP                         = 0x13\n\tCSTOPB                        = 0x40\n\tCSUSP                         = 0x1a\n\tCSWTCH                        = 0x1a\n\tDLT_AIRONET_HEADER            = 0x78\n\tDLT_APPLE_IP_OVER_IEEE1394    = 0x8a\n\tDLT_ARCNET                    = 0x7\n\tDLT_ARCNET_LINUX              = 0x81\n\tDLT_ATM_CLIP                  = 0x13\n\tDLT_ATM_RFC1483               = 0xb\n\tDLT_AURORA                    = 0x7e\n\tDLT_AX25                      = 0x3\n\tDLT_BACNET_MS_TP              = 0xa5\n\tDLT_CHAOS                     = 0x5\n\tDLT_CISCO_IOS                 = 0x76\n\tDLT_C_HDLC                    = 0x68\n\tDLT_DOCSIS                    = 0x8f\n\tDLT_ECONET                    = 0x73\n\tDLT_EN10MB                    = 0x1\n\tDLT_EN3MB                     = 0x2\n\tDLT_ENC                       = 0x6d\n\tDLT_ERF_ETH                   = 0xaf\n\tDLT_ERF_POS                   = 0xb0\n\tDLT_FDDI                      = 0xa\n\tDLT_FRELAY                    = 0x6b\n\tDLT_GCOM_SERIAL               = 0xad\n\tDLT_GCOM_T1E1                 = 0xac\n\tDLT_GPF_F                     = 0xab\n\tDLT_GPF_T                     = 0xaa\n\tDLT_GPRS_LLC                  = 0xa9\n\tDLT_HDLC                      = 0x10\n\tDLT_HHDLC                     = 0x79\n\tDLT_HIPPI                     = 0xf\n\tDLT_IBM_SN                    = 0x92\n\tDLT_IBM_SP                    = 0x91\n\tDLT_IEEE802                   = 0x6\n\tDLT_IEEE802_11                = 0x69\n\tDLT_IEEE802_11_RADIO          = 0x7f\n\tDLT_IEEE802_11_RADIO_AVS      = 0xa3\n\tDLT_IPNET                     = 0xe2\n\tDLT_IPOIB                     = 0xa2\n\tDLT_IP_OVER_FC                = 0x7a\n\tDLT_JUNIPER_ATM1              = 0x89\n\tDLT_JUNIPER_ATM2              = 0x87\n\tDLT_JUNIPER_CHDLC             = 0xb5\n\tDLT_JUNIPER_ES                = 0x84\n\tDLT_JUNIPER_ETHER             = 0xb2\n\tDLT_JUNIPER_FRELAY            = 0xb4\n\tDLT_JUNIPER_GGSN              = 0x85\n\tDLT_JUNIPER_MFR               = 0x86\n\tDLT_JUNIPER_MLFR              = 0x83\n\tDLT_JUNIPER_MLPPP             = 0x82\n\tDLT_JUNIPER_MONITOR           = 0xa4\n\tDLT_JUNIPER_PIC_PEER          = 0xae\n\tDLT_JUNIPER_PPP               = 0xb3\n\tDLT_JUNIPER_PPPOE             = 0xa7\n\tDLT_JUNIPER_PPPOE_ATM         = 0xa8\n\tDLT_JUNIPER_SERVICES          = 0x88\n\tDLT_LINUX_IRDA                = 0x90\n\tDLT_LINUX_LAPD                = 0xb1\n\tDLT_LINUX_SLL                 = 0x71\n\tDLT_LOOP                      = 0x6c\n\tDLT_LTALK                     = 0x72\n\tDLT_MTP2                      = 0x8c\n\tDLT_MTP2_WITH_PHDR            = 0x8b\n\tDLT_MTP3                      = 0x8d\n\tDLT_NULL                      = 0x0\n\tDLT_PCI_EXP                   = 0x7d\n\tDLT_PFLOG                     = 0x75\n\tDLT_PFSYNC                    = 0x12\n\tDLT_PPP                       = 0x9\n\tDLT_PPP_BSDOS                 = 0xe\n\tDLT_PPP_PPPD                  = 0xa6\n\tDLT_PRISM_HEADER              = 0x77\n\tDLT_PRONET                    = 0x4\n\tDLT_RAW                       = 0xc\n\tDLT_RAWAF_MASK                = 0x2240000\n\tDLT_RIO                       = 0x7c\n\tDLT_SCCP                      = 0x8e\n\tDLT_SLIP                      = 0x8\n\tDLT_SLIP_BSDOS                = 0xd\n\tDLT_SUNATM                    = 0x7b\n\tDLT_SYMANTEC_FIREWALL         = 0x63\n\tDLT_TZSP                      = 0x80\n\tECHO                          = 0x8\n\tECHOCTL                       = 0x200\n\tECHOE                         = 0x10\n\tECHOK                         = 0x20\n\tECHOKE                        = 0x800\n\tECHONL                        = 0x40\n\tECHOPRT                       = 0x400\n\tEMPTY_SET                     = 0x0\n\tEMT_CPCOVF                    = 0x1\n\tEQUALITY_CHECK                = 0x0\n\tEXTA                          = 0xe\n\tEXTB                          = 0xf\n\tFD_CLOEXEC                    = 0x1\n\tFD_NFDBITS                    = 0x40\n\tFD_SETSIZE                    = 0x10000\n\tFF0                           = 0x0\n\tFF1                           = 0x8000\n\tFFDLY                         = 0x8000\n\tFLUSHALL                      = 0x1\n\tFLUSHDATA                     = 0x0\n\tFLUSHO                        = 0x2000\n\tF_ALLOCSP                     = 0xa\n\tF_ALLOCSP64                   = 0xa\n\tF_BADFD                       = 0x2e\n\tF_BLKSIZE                     = 0x13\n\tF_BLOCKS                      = 0x12\n\tF_CHKFL                       = 0x8\n\tF_COMPAT                      = 0x8\n\tF_DUP2FD                      = 0x9\n\tF_DUP2FD_CLOEXEC              = 0x24\n\tF_DUPFD                       = 0x0\n\tF_DUPFD_CLOEXEC               = 0x25\n\tF_FLOCK                       = 0x35\n\tF_FLOCK64                     = 0x35\n\tF_FLOCKW                      = 0x36\n\tF_FLOCKW64                    = 0x36\n\tF_FREESP                      = 0xb\n\tF_FREESP64                    = 0xb\n\tF_GETFD                       = 0x1\n\tF_GETFL                       = 0x3\n\tF_GETLK                       = 0xe\n\tF_GETLK64                     = 0xe\n\tF_GETOWN                      = 0x17\n\tF_GETXFL                      = 0x2d\n\tF_HASREMOTELOCKS              = 0x1a\n\tF_ISSTREAM                    = 0xd\n\tF_MANDDNY                     = 0x10\n\tF_MDACC                       = 0x20\n\tF_NODNY                       = 0x0\n\tF_NPRIV                       = 0x10\n\tF_OFD_GETLK                   = 0x2f\n\tF_OFD_GETLK64                 = 0x2f\n\tF_OFD_SETLK                   = 0x30\n\tF_OFD_SETLK64                 = 0x30\n\tF_OFD_SETLKW                  = 0x31\n\tF_OFD_SETLKW64                = 0x31\n\tF_PRIV                        = 0xf\n\tF_QUOTACTL                    = 0x11\n\tF_RDACC                       = 0x1\n\tF_RDDNY                       = 0x1\n\tF_RDLCK                       = 0x1\n\tF_REVOKE                      = 0x19\n\tF_RMACC                       = 0x4\n\tF_RMDNY                       = 0x4\n\tF_RWACC                       = 0x3\n\tF_RWDNY                       = 0x3\n\tF_SETFD                       = 0x2\n\tF_SETFL                       = 0x4\n\tF_SETLK                       = 0x6\n\tF_SETLK64                     = 0x6\n\tF_SETLK64_NBMAND              = 0x2a\n\tF_SETLKW                      = 0x7\n\tF_SETLKW64                    = 0x7\n\tF_SETLK_NBMAND                = 0x2a\n\tF_SETOWN                      = 0x18\n\tF_SHARE                       = 0x28\n\tF_SHARE_NBMAND                = 0x2b\n\tF_UNLCK                       = 0x3\n\tF_UNLKSYS                     = 0x4\n\tF_UNSHARE                     = 0x29\n\tF_WRACC                       = 0x2\n\tF_WRDNY                       = 0x2\n\tF_WRLCK                       = 0x2\n\tHUPCL                         = 0x400\n\tIBSHIFT                       = 0x10\n\tICANON                        = 0x2\n\tICRNL                         = 0x100\n\tIEXTEN                        = 0x8000\n\tIFF_ADDRCONF                  = 0x80000\n\tIFF_ALLMULTI                  = 0x200\n\tIFF_ANYCAST                   = 0x400000\n\tIFF_BROADCAST                 = 0x2\n\tIFF_CANTCHANGE                = 0x7f203003b5a\n\tIFF_COS_ENABLED               = 0x200000000\n\tIFF_DEBUG                     = 0x4\n\tIFF_DEPRECATED                = 0x40000\n\tIFF_DHCPRUNNING               = 0x4000\n\tIFF_DUPLICATE                 = 0x4000000000\n\tIFF_FAILED                    = 0x10000000\n\tIFF_FIXEDMTU                  = 0x1000000000\n\tIFF_INACTIVE                  = 0x40000000\n\tIFF_INTELLIGENT               = 0x400\n\tIFF_IPMP                      = 0x8000000000\n\tIFF_IPMP_CANTCHANGE           = 0x10000000\n\tIFF_IPMP_INVALID              = 0x1ec200080\n\tIFF_IPV4                      = 0x1000000\n\tIFF_IPV6                      = 0x2000000\n\tIFF_L3PROTECT                 = 0x40000000000\n\tIFF_LOOPBACK                  = 0x8\n\tIFF_MULTICAST                 = 0x800\n\tIFF_MULTI_BCAST               = 0x1000\n\tIFF_NOACCEPT                  = 0x4000000\n\tIFF_NOARP                     = 0x80\n\tIFF_NOFAILOVER                = 0x8000000\n\tIFF_NOLINKLOCAL               = 0x20000000000\n\tIFF_NOLOCAL                   = 0x20000\n\tIFF_NONUD                     = 0x200000\n\tIFF_NORTEXCH                  = 0x800000\n\tIFF_NOTRAILERS                = 0x20\n\tIFF_NOXMIT                    = 0x10000\n\tIFF_OFFLINE                   = 0x80000000\n\tIFF_POINTOPOINT               = 0x10\n\tIFF_PREFERRED                 = 0x400000000\n\tIFF_PRIVATE                   = 0x8000\n\tIFF_PROMISC                   = 0x100\n\tIFF_ROUTER                    = 0x100000\n\tIFF_RUNNING                   = 0x40\n\tIFF_STANDBY                   = 0x20000000\n\tIFF_TEMPORARY                 = 0x800000000\n\tIFF_UNNUMBERED                = 0x2000\n\tIFF_UP                        = 0x1\n\tIFF_VIRTUAL                   = 0x2000000000\n\tIFF_VRRP                      = 0x10000000000\n\tIFF_XRESOLV                   = 0x100000000\n\tIFNAMSIZ                      = 0x10\n\tIFT_1822                      = 0x2\n\tIFT_6TO4                      = 0xca\n\tIFT_AAL5                      = 0x31\n\tIFT_ARCNET                    = 0x23\n\tIFT_ARCNETPLUS                = 0x24\n\tIFT_ATM                       = 0x25\n\tIFT_CEPT                      = 0x13\n\tIFT_DS3                       = 0x1e\n\tIFT_EON                       = 0x19\n\tIFT_ETHER                     = 0x6\n\tIFT_FDDI                      = 0xf\n\tIFT_FRELAY                    = 0x20\n\tIFT_FRELAYDCE                 = 0x2c\n\tIFT_HDH1822                   = 0x3\n\tIFT_HIPPI                     = 0x2f\n\tIFT_HSSI                      = 0x2e\n\tIFT_HY                        = 0xe\n\tIFT_IB                        = 0xc7\n\tIFT_IPV4                      = 0xc8\n\tIFT_IPV6                      = 0xc9\n\tIFT_ISDNBASIC                 = 0x14\n\tIFT_ISDNPRIMARY               = 0x15\n\tIFT_ISO88022LLC               = 0x29\n\tIFT_ISO88023                  = 0x7\n\tIFT_ISO88024                  = 0x8\n\tIFT_ISO88025                  = 0x9\n\tIFT_ISO88026                  = 0xa\n\tIFT_LAPB                      = 0x10\n\tIFT_LOCALTALK                 = 0x2a\n\tIFT_LOOP                      = 0x18\n\tIFT_MIOX25                    = 0x26\n\tIFT_MODEM                     = 0x30\n\tIFT_NSIP                      = 0x1b\n\tIFT_OTHER                     = 0x1\n\tIFT_P10                       = 0xc\n\tIFT_P80                       = 0xd\n\tIFT_PARA                      = 0x22\n\tIFT_PPP                       = 0x17\n\tIFT_PROPMUX                   = 0x36\n\tIFT_PROPVIRTUAL               = 0x35\n\tIFT_PTPSERIAL                 = 0x16\n\tIFT_RS232                     = 0x21\n\tIFT_SDLC                      = 0x11\n\tIFT_SIP                       = 0x1f\n\tIFT_SLIP                      = 0x1c\n\tIFT_SMDSDXI                   = 0x2b\n\tIFT_SMDSICIP                  = 0x34\n\tIFT_SONET                     = 0x27\n\tIFT_SONETPATH                 = 0x32\n\tIFT_SONETVT                   = 0x33\n\tIFT_STARLAN                   = 0xb\n\tIFT_T1                        = 0x12\n\tIFT_ULTRA                     = 0x1d\n\tIFT_V35                       = 0x2d\n\tIFT_X25                       = 0x5\n\tIFT_X25DDN                    = 0x4\n\tIFT_X25PLE                    = 0x28\n\tIFT_XETHER                    = 0x1a\n\tIGNBRK                        = 0x1\n\tIGNCR                         = 0x80\n\tIGNPAR                        = 0x4\n\tIMAXBEL                       = 0x2000\n\tINLCR                         = 0x40\n\tINPCK                         = 0x10\n\tIN_AUTOCONF_MASK              = 0xffff0000\n\tIN_AUTOCONF_NET               = 0xa9fe0000\n\tIN_CLASSA_HOST                = 0xffffff\n\tIN_CLASSA_MAX                 = 0x80\n\tIN_CLASSA_NET                 = 0xff000000\n\tIN_CLASSA_NSHIFT              = 0x18\n\tIN_CLASSB_HOST                = 0xffff\n\tIN_CLASSB_MAX                 = 0x10000\n\tIN_CLASSB_NET                 = 0xffff0000\n\tIN_CLASSB_NSHIFT              = 0x10\n\tIN_CLASSC_HOST                = 0xff\n\tIN_CLASSC_NET                 = 0xffffff00\n\tIN_CLASSC_NSHIFT              = 0x8\n\tIN_CLASSD_HOST                = 0xfffffff\n\tIN_CLASSD_NET                 = 0xf0000000\n\tIN_CLASSD_NSHIFT              = 0x1c\n\tIN_CLASSE_NET                 = 0xffffffff\n\tIN_LOOPBACKNET                = 0x7f\n\tIN_PRIVATE12_MASK             = 0xfff00000\n\tIN_PRIVATE12_NET              = 0xac100000\n\tIN_PRIVATE16_MASK             = 0xffff0000\n\tIN_PRIVATE16_NET              = 0xc0a80000\n\tIN_PRIVATE8_MASK              = 0xff000000\n\tIN_PRIVATE8_NET               = 0xa000000\n\tIPPROTO_AH                    = 0x33\n\tIPPROTO_DSTOPTS               = 0x3c\n\tIPPROTO_EGP                   = 0x8\n\tIPPROTO_ENCAP                 = 0x4\n\tIPPROTO_EON                   = 0x50\n\tIPPROTO_ESP                   = 0x32\n\tIPPROTO_FRAGMENT              = 0x2c\n\tIPPROTO_GGP                   = 0x3\n\tIPPROTO_HELLO                 = 0x3f\n\tIPPROTO_HOPOPTS               = 0x0\n\tIPPROTO_ICMP                  = 0x1\n\tIPPROTO_ICMPV6                = 0x3a\n\tIPPROTO_IDP                   = 0x16\n\tIPPROTO_IGMP                  = 0x2\n\tIPPROTO_IP                    = 0x0\n\tIPPROTO_IPV6                  = 0x29\n\tIPPROTO_MAX                   = 0x100\n\tIPPROTO_ND                    = 0x4d\n\tIPPROTO_NONE                  = 0x3b\n\tIPPROTO_OSPF                  = 0x59\n\tIPPROTO_PIM                   = 0x67\n\tIPPROTO_PUP                   = 0xc\n\tIPPROTO_RAW                   = 0xff\n\tIPPROTO_ROUTING               = 0x2b\n\tIPPROTO_RSVP                  = 0x2e\n\tIPPROTO_SCTP                  = 0x84\n\tIPPROTO_TCP                   = 0x6\n\tIPPROTO_UDP                   = 0x11\n\tIPV6_ADD_MEMBERSHIP           = 0x9\n\tIPV6_BOUND_IF                 = 0x41\n\tIPV6_CHECKSUM                 = 0x18\n\tIPV6_DONTFRAG                 = 0x21\n\tIPV6_DROP_MEMBERSHIP          = 0xa\n\tIPV6_DSTOPTS                  = 0xf\n\tIPV6_FLOWINFO_FLOWLABEL       = 0xffff0f00\n\tIPV6_FLOWINFO_TCLASS          = 0xf00f\n\tIPV6_HOPLIMIT                 = 0xc\n\tIPV6_HOPOPTS                  = 0xe\n\tIPV6_JOIN_GROUP               = 0x9\n\tIPV6_LEAVE_GROUP              = 0xa\n\tIPV6_MULTICAST_HOPS           = 0x7\n\tIPV6_MULTICAST_IF             = 0x6\n\tIPV6_MULTICAST_LOOP           = 0x8\n\tIPV6_NEXTHOP                  = 0xd\n\tIPV6_PAD1_OPT                 = 0x0\n\tIPV6_PATHMTU                  = 0x25\n\tIPV6_PKTINFO                  = 0xb\n\tIPV6_PREFER_SRC_CGA           = 0x20\n\tIPV6_PREFER_SRC_CGADEFAULT    = 0x10\n\tIPV6_PREFER_SRC_CGAMASK       = 0x30\n\tIPV6_PREFER_SRC_COA           = 0x2\n\tIPV6_PREFER_SRC_DEFAULT       = 0x15\n\tIPV6_PREFER_SRC_HOME          = 0x1\n\tIPV6_PREFER_SRC_MASK          = 0x3f\n\tIPV6_PREFER_SRC_MIPDEFAULT    = 0x1\n\tIPV6_PREFER_SRC_MIPMASK       = 0x3\n\tIPV6_PREFER_SRC_NONCGA        = 0x10\n\tIPV6_PREFER_SRC_PUBLIC        = 0x4\n\tIPV6_PREFER_SRC_TMP           = 0x8\n\tIPV6_PREFER_SRC_TMPDEFAULT    = 0x4\n\tIPV6_PREFER_SRC_TMPMASK       = 0xc\n\tIPV6_RECVDSTOPTS              = 0x28\n\tIPV6_RECVHOPLIMIT             = 0x13\n\tIPV6_RECVHOPOPTS              = 0x14\n\tIPV6_RECVPATHMTU              = 0x24\n\tIPV6_RECVPKTINFO              = 0x12\n\tIPV6_RECVRTHDR                = 0x16\n\tIPV6_RECVRTHDRDSTOPTS         = 0x17\n\tIPV6_RECVTCLASS               = 0x19\n\tIPV6_RTHDR                    = 0x10\n\tIPV6_RTHDRDSTOPTS             = 0x11\n\tIPV6_RTHDR_TYPE_0             = 0x0\n\tIPV6_SEC_OPT                  = 0x22\n\tIPV6_SRC_PREFERENCES          = 0x23\n\tIPV6_TCLASS                   = 0x26\n\tIPV6_UNICAST_HOPS             = 0x5\n\tIPV6_UNSPEC_SRC               = 0x42\n\tIPV6_USE_MIN_MTU              = 0x20\n\tIPV6_V6ONLY                   = 0x27\n\tIP_ADD_MEMBERSHIP             = 0x13\n\tIP_ADD_SOURCE_MEMBERSHIP      = 0x17\n\tIP_BLOCK_SOURCE               = 0x15\n\tIP_BOUND_IF                   = 0x41\n\tIP_BROADCAST                  = 0x106\n\tIP_BROADCAST_TTL              = 0x43\n\tIP_DEFAULT_MULTICAST_LOOP     = 0x1\n\tIP_DEFAULT_MULTICAST_TTL      = 0x1\n\tIP_DF                         = 0x4000\n\tIP_DHCPINIT_IF                = 0x45\n\tIP_DONTFRAG                   = 0x1b\n\tIP_DONTROUTE                  = 0x105\n\tIP_DROP_MEMBERSHIP            = 0x14\n\tIP_DROP_SOURCE_MEMBERSHIP     = 0x18\n\tIP_HDRINCL                    = 0x2\n\tIP_MAXPACKET                  = 0xffff\n\tIP_MF                         = 0x2000\n\tIP_MSS                        = 0x240\n\tIP_MULTICAST_IF               = 0x10\n\tIP_MULTICAST_LOOP             = 0x12\n\tIP_MULTICAST_TTL              = 0x11\n\tIP_NEXTHOP                    = 0x19\n\tIP_OPTIONS                    = 0x1\n\tIP_PKTINFO                    = 0x1a\n\tIP_RECVDSTADDR                = 0x7\n\tIP_RECVIF                     = 0x9\n\tIP_RECVOPTS                   = 0x5\n\tIP_RECVPKTINFO                = 0x1a\n\tIP_RECVRETOPTS                = 0x6\n\tIP_RECVSLLA                   = 0xa\n\tIP_RECVTTL                    = 0xb\n\tIP_RETOPTS                    = 0x8\n\tIP_REUSEADDR                  = 0x104\n\tIP_SEC_OPT                    = 0x22\n\tIP_TOS                        = 0x3\n\tIP_TTL                        = 0x4\n\tIP_UNBLOCK_SOURCE             = 0x16\n\tIP_UNSPEC_SRC                 = 0x42\n\tISIG                          = 0x1\n\tISTRIP                        = 0x20\n\tIUCLC                         = 0x200\n\tIXANY                         = 0x800\n\tIXOFF                         = 0x1000\n\tIXON                          = 0x400\n\tLOCK_EX                       = 0x2\n\tLOCK_NB                       = 0x4\n\tLOCK_SH                       = 0x1\n\tLOCK_UN                       = 0x8\n\tMADV_ACCESS_DEFAULT           = 0x6\n\tMADV_ACCESS_LWP               = 0x7\n\tMADV_ACCESS_MANY              = 0x8\n\tMADV_DONTNEED                 = 0x4\n\tMADV_FREE                     = 0x5\n\tMADV_NORMAL                   = 0x0\n\tMADV_PURGE                    = 0x9\n\tMADV_RANDOM                   = 0x1\n\tMADV_SEQUENTIAL               = 0x2\n\tMADV_WILLNEED                 = 0x3\n\tMAP_32BIT                     = 0x80\n\tMAP_ALIGN                     = 0x200\n\tMAP_ANON                      = 0x100\n\tMAP_ANONYMOUS                 = 0x100\n\tMAP_FILE                      = 0x0\n\tMAP_FIXED                     = 0x10\n\tMAP_INITDATA                  = 0x800\n\tMAP_NORESERVE                 = 0x40\n\tMAP_PRIVATE                   = 0x2\n\tMAP_RENAME                    = 0x20\n\tMAP_SHARED                    = 0x1\n\tMAP_TEXT                      = 0x400\n\tMAP_TYPE                      = 0xf\n\tMCL_CURRENT                   = 0x1\n\tMCL_FUTURE                    = 0x2\n\tMSG_CTRUNC                    = 0x10\n\tMSG_DONTROUTE                 = 0x4\n\tMSG_DONTWAIT                  = 0x80\n\tMSG_DUPCTRL                   = 0x800\n\tMSG_EOR                       = 0x8\n\tMSG_MAXIOVLEN                 = 0x10\n\tMSG_NOTIFICATION              = 0x100\n\tMSG_OOB                       = 0x1\n\tMSG_PEEK                      = 0x2\n\tMSG_TRUNC                     = 0x20\n\tMSG_WAITALL                   = 0x40\n\tMSG_XPG4_2                    = 0x8000\n\tMS_ASYNC                      = 0x1\n\tMS_INVALIDATE                 = 0x2\n\tMS_OLDSYNC                    = 0x0\n\tMS_SYNC                       = 0x4\n\tM_FLUSH                       = 0x86\n\tNAME_MAX                      = 0xff\n\tNEWDEV                        = 0x1\n\tNL0                           = 0x0\n\tNL1                           = 0x100\n\tNLDLY                         = 0x100\n\tNOFLSH                        = 0x80\n\tOCRNL                         = 0x8\n\tOFDEL                         = 0x80\n\tOFILL                         = 0x40\n\tOLCUC                         = 0x2\n\tOLDDEV                        = 0x0\n\tONBITSMAJOR                   = 0x7\n\tONBITSMINOR                   = 0x8\n\tONLCR                         = 0x4\n\tONLRET                        = 0x20\n\tONOCR                         = 0x10\n\tOPENFAIL                      = -0x1\n\tOPOST                         = 0x1\n\tO_ACCMODE                     = 0x600003\n\tO_APPEND                      = 0x8\n\tO_CLOEXEC                     = 0x800000\n\tO_CREAT                       = 0x100\n\tO_DSYNC                       = 0x40\n\tO_EXCL                        = 0x400\n\tO_EXEC                        = 0x400000\n\tO_LARGEFILE                   = 0x2000\n\tO_NDELAY                      = 0x4\n\tO_NOCTTY                      = 0x800\n\tO_NOFOLLOW                    = 0x20000\n\tO_NOLINKS                     = 0x40000\n\tO_NONBLOCK                    = 0x80\n\tO_RDONLY                      = 0x0\n\tO_RDWR                        = 0x2\n\tO_RSYNC                       = 0x8000\n\tO_SEARCH                      = 0x200000\n\tO_SIOCGIFCONF                 = -0x3ff796ec\n\tO_SIOCGLIFCONF                = -0x3fef9688\n\tO_SYNC                        = 0x10\n\tO_TRUNC                       = 0x200\n\tO_WRONLY                      = 0x1\n\tO_XATTR                       = 0x4000\n\tPARENB                        = 0x100\n\tPAREXT                        = 0x100000\n\tPARMRK                        = 0x8\n\tPARODD                        = 0x200\n\tPENDIN                        = 0x4000\n\tPRIO_PGRP                     = 0x1\n\tPRIO_PROCESS                  = 0x0\n\tPRIO_USER                     = 0x2\n\tPROT_EXEC                     = 0x4\n\tPROT_NONE                     = 0x0\n\tPROT_READ                     = 0x1\n\tPROT_WRITE                    = 0x2\n\tRLIMIT_AS                     = 0x6\n\tRLIMIT_CORE                   = 0x4\n\tRLIMIT_CPU                    = 0x0\n\tRLIMIT_DATA                   = 0x2\n\tRLIMIT_FSIZE                  = 0x1\n\tRLIMIT_NOFILE                 = 0x5\n\tRLIMIT_STACK                  = 0x3\n\tRLIM_INFINITY                 = -0x3\n\tRTAX_AUTHOR                   = 0x6\n\tRTAX_BRD                      = 0x7\n\tRTAX_DST                      = 0x0\n\tRTAX_GATEWAY                  = 0x1\n\tRTAX_GENMASK                  = 0x3\n\tRTAX_IFA                      = 0x5\n\tRTAX_IFP                      = 0x4\n\tRTAX_MAX                      = 0x9\n\tRTAX_NETMASK                  = 0x2\n\tRTAX_SRC                      = 0x8\n\tRTA_AUTHOR                    = 0x40\n\tRTA_BRD                       = 0x80\n\tRTA_DST                       = 0x1\n\tRTA_GATEWAY                   = 0x2\n\tRTA_GENMASK                   = 0x8\n\tRTA_IFA                       = 0x20\n\tRTA_IFP                       = 0x10\n\tRTA_NETMASK                   = 0x4\n\tRTA_NUMBITS                   = 0x9\n\tRTA_SRC                       = 0x100\n\tRTF_BLACKHOLE                 = 0x1000\n\tRTF_CLONING                   = 0x100\n\tRTF_DONE                      = 0x40\n\tRTF_DYNAMIC                   = 0x10\n\tRTF_GATEWAY                   = 0x2\n\tRTF_HOST                      = 0x4\n\tRTF_INDIRECT                  = 0x40000\n\tRTF_KERNEL                    = 0x80000\n\tRTF_LLINFO                    = 0x400\n\tRTF_MASK                      = 0x80\n\tRTF_MODIFIED                  = 0x20\n\tRTF_MULTIRT                   = 0x10000\n\tRTF_PRIVATE                   = 0x2000\n\tRTF_PROTO1                    = 0x8000\n\tRTF_PROTO2                    = 0x4000\n\tRTF_REJECT                    = 0x8\n\tRTF_SETSRC                    = 0x20000\n\tRTF_STATIC                    = 0x800\n\tRTF_UP                        = 0x1\n\tRTF_XRESOLVE                  = 0x200\n\tRTF_ZONE                      = 0x100000\n\tRTM_ADD                       = 0x1\n\tRTM_CHANGE                    = 0x3\n\tRTM_CHGADDR                   = 0xf\n\tRTM_DELADDR                   = 0xd\n\tRTM_DELETE                    = 0x2\n\tRTM_FREEADDR                  = 0x10\n\tRTM_GET                       = 0x4\n\tRTM_IFINFO                    = 0xe\n\tRTM_LOCK                      = 0x8\n\tRTM_LOSING                    = 0x5\n\tRTM_MISS                      = 0x7\n\tRTM_NEWADDR                   = 0xc\n\tRTM_OLDADD                    = 0x9\n\tRTM_OLDDEL                    = 0xa\n\tRTM_REDIRECT                  = 0x6\n\tRTM_RESOLVE                   = 0xb\n\tRTM_VERSION                   = 0x3\n\tRTV_EXPIRE                    = 0x4\n\tRTV_HOPCOUNT                  = 0x2\n\tRTV_MTU                       = 0x1\n\tRTV_RPIPE                     = 0x8\n\tRTV_RTT                       = 0x40\n\tRTV_RTTVAR                    = 0x80\n\tRTV_SPIPE                     = 0x10\n\tRTV_SSTHRESH                  = 0x20\n\tRT_AWARE                      = 0x1\n\tRUSAGE_CHILDREN               = -0x1\n\tRUSAGE_SELF                   = 0x0\n\tSCM_RIGHTS                    = 0x1010\n\tSCM_TIMESTAMP                 = 0x1013\n\tSCM_UCRED                     = 0x1012\n\tSHUT_RD                       = 0x0\n\tSHUT_RDWR                     = 0x2\n\tSHUT_WR                       = 0x1\n\tSIG2STR_MAX                   = 0x20\n\tSIOCADDMULTI                  = -0x7fdf96cf\n\tSIOCADDRT                     = -0x7fcf8df6\n\tSIOCATMARK                    = 0x40047307\n\tSIOCDARP                      = -0x7fdb96e0\n\tSIOCDELMULTI                  = -0x7fdf96ce\n\tSIOCDELRT                     = -0x7fcf8df5\n\tSIOCDXARP                     = -0x7fff9658\n\tSIOCGARP                      = -0x3fdb96e1\n\tSIOCGDSTINFO                  = -0x3fff965c\n\tSIOCGENADDR                   = -0x3fdf96ab\n\tSIOCGENPSTATS                 = -0x3fdf96c7\n\tSIOCGETLSGCNT                 = -0x3fef8deb\n\tSIOCGETNAME                   = 0x40107334\n\tSIOCGETPEER                   = 0x40107335\n\tSIOCGETPROP                   = -0x3fff8f44\n\tSIOCGETSGCNT                  = -0x3feb8deb\n\tSIOCGETSYNC                   = -0x3fdf96d3\n\tSIOCGETVIFCNT                 = -0x3feb8dec\n\tSIOCGHIWAT                    = 0x40047301\n\tSIOCGIFADDR                   = -0x3fdf96f3\n\tSIOCGIFBRDADDR                = -0x3fdf96e9\n\tSIOCGIFCONF                   = -0x3ff796a4\n\tSIOCGIFDSTADDR                = -0x3fdf96f1\n\tSIOCGIFFLAGS                  = -0x3fdf96ef\n\tSIOCGIFHWADDR                 = -0x3fdf9647\n\tSIOCGIFINDEX                  = -0x3fdf96a6\n\tSIOCGIFMEM                    = -0x3fdf96ed\n\tSIOCGIFMETRIC                 = -0x3fdf96e5\n\tSIOCGIFMTU                    = -0x3fdf96ea\n\tSIOCGIFMUXID                  = -0x3fdf96a8\n\tSIOCGIFNETMASK                = -0x3fdf96e7\n\tSIOCGIFNUM                    = 0x40046957\n\tSIOCGIP6ADDRPOLICY            = -0x3fff965e\n\tSIOCGIPMSFILTER               = -0x3ffb964c\n\tSIOCGLIFADDR                  = -0x3f87968f\n\tSIOCGLIFBINDING               = -0x3f879666\n\tSIOCGLIFBRDADDR               = -0x3f879685\n\tSIOCGLIFCONF                  = -0x3fef965b\n\tSIOCGLIFDADSTATE              = -0x3f879642\n\tSIOCGLIFDSTADDR               = -0x3f87968d\n\tSIOCGLIFFLAGS                 = -0x3f87968b\n\tSIOCGLIFGROUPINFO             = -0x3f4b9663\n\tSIOCGLIFGROUPNAME             = -0x3f879664\n\tSIOCGLIFHWADDR                = -0x3f879640\n\tSIOCGLIFINDEX                 = -0x3f87967b\n\tSIOCGLIFLNKINFO               = -0x3f879674\n\tSIOCGLIFMETRIC                = -0x3f879681\n\tSIOCGLIFMTU                   = -0x3f879686\n\tSIOCGLIFMUXID                 = -0x3f87967d\n\tSIOCGLIFNETMASK               = -0x3f879683\n\tSIOCGLIFNUM                   = -0x3ff3967e\n\tSIOCGLIFSRCOF                 = -0x3fef964f\n\tSIOCGLIFSUBNET                = -0x3f879676\n\tSIOCGLIFTOKEN                 = -0x3f879678\n\tSIOCGLIFUSESRC                = -0x3f879651\n\tSIOCGLIFZONE                  = -0x3f879656\n\tSIOCGLOWAT                    = 0x40047303\n\tSIOCGMSFILTER                 = -0x3ffb964e\n\tSIOCGPGRP                     = 0x40047309\n\tSIOCGSTAMP                    = -0x3fef9646\n\tSIOCGXARP                     = -0x3fff9659\n\tSIOCIFDETACH                  = -0x7fdf96c8\n\tSIOCILB                       = -0x3ffb9645\n\tSIOCLIFADDIF                  = -0x3f879691\n\tSIOCLIFDELND                  = -0x7f879673\n\tSIOCLIFGETND                  = -0x3f879672\n\tSIOCLIFREMOVEIF               = -0x7f879692\n\tSIOCLIFSETND                  = -0x7f879671\n\tSIOCLOWER                     = -0x7fdf96d7\n\tSIOCSARP                      = -0x7fdb96e2\n\tSIOCSCTPGOPT                  = -0x3fef9653\n\tSIOCSCTPPEELOFF               = -0x3ffb9652\n\tSIOCSCTPSOPT                  = -0x7fef9654\n\tSIOCSENABLESDP                = -0x3ffb9649\n\tSIOCSETPROP                   = -0x7ffb8f43\n\tSIOCSETSYNC                   = -0x7fdf96d4\n\tSIOCSHIWAT                    = -0x7ffb8d00\n\tSIOCSIFADDR                   = -0x7fdf96f4\n\tSIOCSIFBRDADDR                = -0x7fdf96e8\n\tSIOCSIFDSTADDR                = -0x7fdf96f2\n\tSIOCSIFFLAGS                  = -0x7fdf96f0\n\tSIOCSIFINDEX                  = -0x7fdf96a5\n\tSIOCSIFMEM                    = -0x7fdf96ee\n\tSIOCSIFMETRIC                 = -0x7fdf96e4\n\tSIOCSIFMTU                    = -0x7fdf96eb\n\tSIOCSIFMUXID                  = -0x7fdf96a7\n\tSIOCSIFNAME                   = -0x7fdf96b7\n\tSIOCSIFNETMASK                = -0x7fdf96e6\n\tSIOCSIP6ADDRPOLICY            = -0x7fff965d\n\tSIOCSIPMSFILTER               = -0x7ffb964b\n\tSIOCSLGETREQ                  = -0x3fdf96b9\n\tSIOCSLIFADDR                  = -0x7f879690\n\tSIOCSLIFBRDADDR               = -0x7f879684\n\tSIOCSLIFDSTADDR               = -0x7f87968e\n\tSIOCSLIFFLAGS                 = -0x7f87968c\n\tSIOCSLIFGROUPNAME             = -0x7f879665\n\tSIOCSLIFINDEX                 = -0x7f87967a\n\tSIOCSLIFLNKINFO               = -0x7f879675\n\tSIOCSLIFMETRIC                = -0x7f879680\n\tSIOCSLIFMTU                   = -0x7f879687\n\tSIOCSLIFMUXID                 = -0x7f87967c\n\tSIOCSLIFNAME                  = -0x3f87967f\n\tSIOCSLIFNETMASK               = -0x7f879682\n\tSIOCSLIFPREFIX                = -0x3f879641\n\tSIOCSLIFSUBNET                = -0x7f879677\n\tSIOCSLIFTOKEN                 = -0x7f879679\n\tSIOCSLIFUSESRC                = -0x7f879650\n\tSIOCSLIFZONE                  = -0x7f879655\n\tSIOCSLOWAT                    = -0x7ffb8cfe\n\tSIOCSLSTAT                    = -0x7fdf96b8\n\tSIOCSMSFILTER                 = -0x7ffb964d\n\tSIOCSPGRP                     = -0x7ffb8cf8\n\tSIOCSPROMISC                  = -0x7ffb96d0\n\tSIOCSQPTR                     = -0x3ffb9648\n\tSIOCSSDSTATS                  = -0x3fdf96d2\n\tSIOCSSESTATS                  = -0x3fdf96d1\n\tSIOCSXARP                     = -0x7fff965a\n\tSIOCTMYADDR                   = -0x3ff79670\n\tSIOCTMYSITE                   = -0x3ff7966e\n\tSIOCTONLINK                   = -0x3ff7966f\n\tSIOCUPPER                     = -0x7fdf96d8\n\tSIOCX25RCV                    = -0x3fdf96c4\n\tSIOCX25TBL                    = -0x3fdf96c3\n\tSIOCX25XMT                    = -0x3fdf96c5\n\tSIOCXPROTO                    = 0x20007337\n\tSOCK_CLOEXEC                  = 0x80000\n\tSOCK_DGRAM                    = 0x1\n\tSOCK_NDELAY                   = 0x200000\n\tSOCK_NONBLOCK                 = 0x100000\n\tSOCK_RAW                      = 0x4\n\tSOCK_RDM                      = 0x5\n\tSOCK_SEQPACKET                = 0x6\n\tSOCK_STREAM                   = 0x2\n\tSOCK_TYPE_MASK                = 0xffff\n\tSOL_FILTER                    = 0xfffc\n\tSOL_PACKET                    = 0xfffd\n\tSOL_ROUTE                     = 0xfffe\n\tSOL_SOCKET                    = 0xffff\n\tSOMAXCONN                     = 0x80\n\tSO_ACCEPTCONN                 = 0x2\n\tSO_ALL                        = 0x3f\n\tSO_ALLZONES                   = 0x1014\n\tSO_ANON_MLP                   = 0x100a\n\tSO_ATTACH_FILTER              = 0x40000001\n\tSO_BAND                       = 0x4000\n\tSO_BROADCAST                  = 0x20\n\tSO_COPYOPT                    = 0x80000\n\tSO_DEBUG                      = 0x1\n\tSO_DELIM                      = 0x8000\n\tSO_DETACH_FILTER              = 0x40000002\n\tSO_DGRAM_ERRIND               = 0x200\n\tSO_DOMAIN                     = 0x100c\n\tSO_DONTLINGER                 = -0x81\n\tSO_DONTROUTE                  = 0x10\n\tSO_ERROPT                     = 0x40000\n\tSO_ERROR                      = 0x1007\n\tSO_EXCLBIND                   = 0x1015\n\tSO_HIWAT                      = 0x10\n\tSO_ISNTTY                     = 0x800\n\tSO_ISTTY                      = 0x400\n\tSO_KEEPALIVE                  = 0x8\n\tSO_LINGER                     = 0x80\n\tSO_LOWAT                      = 0x20\n\tSO_MAC_EXEMPT                 = 0x100b\n\tSO_MAC_IMPLICIT               = 0x1016\n\tSO_MAXBLK                     = 0x100000\n\tSO_MAXPSZ                     = 0x8\n\tSO_MINPSZ                     = 0x4\n\tSO_MREADOFF                   = 0x80\n\tSO_MREADON                    = 0x40\n\tSO_NDELOFF                    = 0x200\n\tSO_NDELON                     = 0x100\n\tSO_NODELIM                    = 0x10000\n\tSO_OOBINLINE                  = 0x100\n\tSO_PROTOTYPE                  = 0x1009\n\tSO_RCVBUF                     = 0x1002\n\tSO_RCVLOWAT                   = 0x1004\n\tSO_RCVPSH                     = 0x100d\n\tSO_RCVTIMEO                   = 0x1006\n\tSO_READOPT                    = 0x1\n\tSO_RECVUCRED                  = 0x400\n\tSO_REUSEADDR                  = 0x4\n\tSO_SECATTR                    = 0x1011\n\tSO_SNDBUF                     = 0x1001\n\tSO_SNDLOWAT                   = 0x1003\n\tSO_SNDTIMEO                   = 0x1005\n\tSO_STRHOLD                    = 0x20000\n\tSO_TAIL                       = 0x200000\n\tSO_TIMESTAMP                  = 0x1013\n\tSO_TONSTOP                    = 0x2000\n\tSO_TOSTOP                     = 0x1000\n\tSO_TYPE                       = 0x1008\n\tSO_USELOOPBACK                = 0x40\n\tSO_VRRP                       = 0x1017\n\tSO_WROFF                      = 0x2\n\tTAB0                          = 0x0\n\tTAB1                          = 0x800\n\tTAB2                          = 0x1000\n\tTAB3                          = 0x1800\n\tTABDLY                        = 0x1800\n\tTCFLSH                        = 0x5407\n\tTCGETA                        = 0x5401\n\tTCGETS                        = 0x540d\n\tTCIFLUSH                      = 0x0\n\tTCIOFF                        = 0x2\n\tTCIOFLUSH                     = 0x2\n\tTCION                         = 0x3\n\tTCOFLUSH                      = 0x1\n\tTCOOFF                        = 0x0\n\tTCOON                         = 0x1\n\tTCP_ABORT_THRESHOLD           = 0x11\n\tTCP_ANONPRIVBIND              = 0x20\n\tTCP_CONN_ABORT_THRESHOLD      = 0x13\n\tTCP_CONN_NOTIFY_THRESHOLD     = 0x12\n\tTCP_CORK                      = 0x18\n\tTCP_EXCLBIND                  = 0x21\n\tTCP_INIT_CWND                 = 0x15\n\tTCP_KEEPALIVE                 = 0x8\n\tTCP_KEEPALIVE_ABORT_THRESHOLD = 0x17\n\tTCP_KEEPALIVE_THRESHOLD       = 0x16\n\tTCP_KEEPCNT                   = 0x23\n\tTCP_KEEPIDLE                  = 0x22\n\tTCP_KEEPINTVL                 = 0x24\n\tTCP_LINGER2                   = 0x1c\n\tTCP_MAXSEG                    = 0x2\n\tTCP_MSS                       = 0x218\n\tTCP_NODELAY                   = 0x1\n\tTCP_NOTIFY_THRESHOLD          = 0x10\n\tTCP_RECVDSTADDR               = 0x14\n\tTCP_RTO_INITIAL               = 0x19\n\tTCP_RTO_MAX                   = 0x1b\n\tTCP_RTO_MIN                   = 0x1a\n\tTCSAFLUSH                     = 0x5410\n\tTCSBRK                        = 0x5405\n\tTCSETA                        = 0x5402\n\tTCSETAF                       = 0x5404\n\tTCSETAW                       = 0x5403\n\tTCSETS                        = 0x540e\n\tTCSETSF                       = 0x5410\n\tTCSETSW                       = 0x540f\n\tTCXONC                        = 0x5406\n\tTIOC                          = 0x5400\n\tTIOCCBRK                      = 0x747a\n\tTIOCCDTR                      = 0x7478\n\tTIOCCILOOP                    = 0x746c\n\tTIOCEXCL                      = 0x740d\n\tTIOCFLUSH                     = 0x7410\n\tTIOCGETC                      = 0x7412\n\tTIOCGETD                      = 0x7400\n\tTIOCGETP                      = 0x7408\n\tTIOCGLTC                      = 0x7474\n\tTIOCGPGRP                     = 0x7414\n\tTIOCGPPS                      = 0x547d\n\tTIOCGPPSEV                    = 0x547f\n\tTIOCGSID                      = 0x7416\n\tTIOCGSOFTCAR                  = 0x5469\n\tTIOCGWINSZ                    = 0x5468\n\tTIOCHPCL                      = 0x7402\n\tTIOCKBOF                      = 0x5409\n\tTIOCKBON                      = 0x5408\n\tTIOCLBIC                      = 0x747e\n\tTIOCLBIS                      = 0x747f\n\tTIOCLGET                      = 0x747c\n\tTIOCLSET                      = 0x747d\n\tTIOCMBIC                      = 0x741c\n\tTIOCMBIS                      = 0x741b\n\tTIOCMGET                      = 0x741d\n\tTIOCMSET                      = 0x741a\n\tTIOCM_CAR                     = 0x40\n\tTIOCM_CD                      = 0x40\n\tTIOCM_CTS                     = 0x20\n\tTIOCM_DSR                     = 0x100\n\tTIOCM_DTR                     = 0x2\n\tTIOCM_LE                      = 0x1\n\tTIOCM_RI                      = 0x80\n\tTIOCM_RNG                     = 0x80\n\tTIOCM_RTS                     = 0x4\n\tTIOCM_SR                      = 0x10\n\tTIOCM_ST                      = 0x8\n\tTIOCNOTTY                     = 0x7471\n\tTIOCNXCL                      = 0x740e\n\tTIOCOUTQ                      = 0x7473\n\tTIOCREMOTE                    = 0x741e\n\tTIOCSBRK                      = 0x747b\n\tTIOCSCTTY                     = 0x7484\n\tTIOCSDTR                      = 0x7479\n\tTIOCSETC                      = 0x7411\n\tTIOCSETD                      = 0x7401\n\tTIOCSETN                      = 0x740a\n\tTIOCSETP                      = 0x7409\n\tTIOCSIGNAL                    = 0x741f\n\tTIOCSILOOP                    = 0x746d\n\tTIOCSLTC                      = 0x7475\n\tTIOCSPGRP                     = 0x7415\n\tTIOCSPPS                      = 0x547e\n\tTIOCSSOFTCAR                  = 0x546a\n\tTIOCSTART                     = 0x746e\n\tTIOCSTI                       = 0x7417\n\tTIOCSTOP                      = 0x746f\n\tTIOCSWINSZ                    = 0x5467\n\tTOSTOP                        = 0x100\n\tVCEOF                         = 0x8\n\tVCEOL                         = 0x9\n\tVDISCARD                      = 0xd\n\tVDSUSP                        = 0xb\n\tVEOF                          = 0x4\n\tVEOL                          = 0x5\n\tVEOL2                         = 0x6\n\tVERASE                        = 0x2\n\tVERASE2                       = 0x11\n\tVINTR                         = 0x0\n\tVKILL                         = 0x3\n\tVLNEXT                        = 0xf\n\tVMIN                          = 0x4\n\tVQUIT                         = 0x1\n\tVREPRINT                      = 0xc\n\tVSTART                        = 0x8\n\tVSTATUS                       = 0x10\n\tVSTOP                         = 0x9\n\tVSUSP                         = 0xa\n\tVSWTCH                        = 0x7\n\tVT0                           = 0x0\n\tVT1                           = 0x4000\n\tVTDLY                         = 0x4000\n\tVTIME                         = 0x5\n\tVWERASE                       = 0xe\n\tWCONTFLG                      = 0xffff\n\tWCONTINUED                    = 0x8\n\tWCOREFLG                      = 0x80\n\tWEXITED                       = 0x1\n\tWNOHANG                       = 0x40\n\tWNOWAIT                       = 0x80\n\tWOPTMASK                      = 0xcf\n\tWRAP                          = 0x20000\n\tWSIGMASK                      = 0x7f\n\tWSTOPFLG                      = 0x7f\n\tWSTOPPED                      = 0x4\n\tWTRAPPED                      = 0x2\n\tWUNTRACED                     = 0x4\n\tXCASE                         = 0x4\n\tXTABS                         = 0x1800\n)\n\n// Errors\nconst (\n\tE2BIG           = syscall.Errno(0x7)\n\tEACCES          = syscall.Errno(0xd)\n\tEADDRINUSE      = syscall.Errno(0x7d)\n\tEADDRNOTAVAIL   = syscall.Errno(0x7e)\n\tEADV            = syscall.Errno(0x44)\n\tEAFNOSUPPORT    = syscall.Errno(0x7c)\n\tEAGAIN          = syscall.Errno(0xb)\n\tEALREADY        = syscall.Errno(0x95)\n\tEBADE           = syscall.Errno(0x32)\n\tEBADF           = syscall.Errno(0x9)\n\tEBADFD          = syscall.Errno(0x51)\n\tEBADMSG         = syscall.Errno(0x4d)\n\tEBADR           = syscall.Errno(0x33)\n\tEBADRQC         = syscall.Errno(0x36)\n\tEBADSLT         = syscall.Errno(0x37)\n\tEBFONT          = syscall.Errno(0x39)\n\tEBUSY           = syscall.Errno(0x10)\n\tECANCELED       = syscall.Errno(0x2f)\n\tECHILD          = syscall.Errno(0xa)\n\tECHRNG          = syscall.Errno(0x25)\n\tECOMM           = syscall.Errno(0x46)\n\tECONNABORTED    = syscall.Errno(0x82)\n\tECONNREFUSED    = syscall.Errno(0x92)\n\tECONNRESET      = syscall.Errno(0x83)\n\tEDEADLK         = syscall.Errno(0x2d)\n\tEDEADLOCK       = syscall.Errno(0x38)\n\tEDESTADDRREQ    = syscall.Errno(0x60)\n\tEDOM            = syscall.Errno(0x21)\n\tEDQUOT          = syscall.Errno(0x31)\n\tEEXIST          = syscall.Errno(0x11)\n\tEFAULT          = syscall.Errno(0xe)\n\tEFBIG           = syscall.Errno(0x1b)\n\tEHOSTDOWN       = syscall.Errno(0x93)\n\tEHOSTUNREACH    = syscall.Errno(0x94)\n\tEIDRM           = syscall.Errno(0x24)\n\tEILSEQ          = syscall.Errno(0x58)\n\tEINPROGRESS     = syscall.Errno(0x96)\n\tEINTR           = syscall.Errno(0x4)\n\tEINVAL          = syscall.Errno(0x16)\n\tEIO             = syscall.Errno(0x5)\n\tEISCONN         = syscall.Errno(0x85)\n\tEISDIR          = syscall.Errno(0x15)\n\tEL2HLT          = syscall.Errno(0x2c)\n\tEL2NSYNC        = syscall.Errno(0x26)\n\tEL3HLT          = syscall.Errno(0x27)\n\tEL3RST          = syscall.Errno(0x28)\n\tELIBACC         = syscall.Errno(0x53)\n\tELIBBAD         = syscall.Errno(0x54)\n\tELIBEXEC        = syscall.Errno(0x57)\n\tELIBMAX         = syscall.Errno(0x56)\n\tELIBSCN         = syscall.Errno(0x55)\n\tELNRNG          = syscall.Errno(0x29)\n\tELOCKUNMAPPED   = syscall.Errno(0x48)\n\tELOOP           = syscall.Errno(0x5a)\n\tEMFILE          = syscall.Errno(0x18)\n\tEMLINK          = syscall.Errno(0x1f)\n\tEMSGSIZE        = syscall.Errno(0x61)\n\tEMULTIHOP       = syscall.Errno(0x4a)\n\tENAMETOOLONG    = syscall.Errno(0x4e)\n\tENETDOWN        = syscall.Errno(0x7f)\n\tENETRESET       = syscall.Errno(0x81)\n\tENETUNREACH     = syscall.Errno(0x80)\n\tENFILE          = syscall.Errno(0x17)\n\tENOANO          = syscall.Errno(0x35)\n\tENOBUFS         = syscall.Errno(0x84)\n\tENOCSI          = syscall.Errno(0x2b)\n\tENODATA         = syscall.Errno(0x3d)\n\tENODEV          = syscall.Errno(0x13)\n\tENOENT          = syscall.Errno(0x2)\n\tENOEXEC         = syscall.Errno(0x8)\n\tENOLCK          = syscall.Errno(0x2e)\n\tENOLINK         = syscall.Errno(0x43)\n\tENOMEM          = syscall.Errno(0xc)\n\tENOMSG          = syscall.Errno(0x23)\n\tENONET          = syscall.Errno(0x40)\n\tENOPKG          = syscall.Errno(0x41)\n\tENOPROTOOPT     = syscall.Errno(0x63)\n\tENOSPC          = syscall.Errno(0x1c)\n\tENOSR           = syscall.Errno(0x3f)\n\tENOSTR          = syscall.Errno(0x3c)\n\tENOSYS          = syscall.Errno(0x59)\n\tENOTACTIVE      = syscall.Errno(0x49)\n\tENOTBLK         = syscall.Errno(0xf)\n\tENOTCONN        = syscall.Errno(0x86)\n\tENOTDIR         = syscall.Errno(0x14)\n\tENOTEMPTY       = syscall.Errno(0x5d)\n\tENOTRECOVERABLE = syscall.Errno(0x3b)\n\tENOTSOCK        = syscall.Errno(0x5f)\n\tENOTSUP         = syscall.Errno(0x30)\n\tENOTTY          = syscall.Errno(0x19)\n\tENOTUNIQ        = syscall.Errno(0x50)\n\tENXIO           = syscall.Errno(0x6)\n\tEOPNOTSUPP      = syscall.Errno(0x7a)\n\tEOVERFLOW       = syscall.Errno(0x4f)\n\tEOWNERDEAD      = syscall.Errno(0x3a)\n\tEPERM           = syscall.Errno(0x1)\n\tEPFNOSUPPORT    = syscall.Errno(0x7b)\n\tEPIPE           = syscall.Errno(0x20)\n\tEPROTO          = syscall.Errno(0x47)\n\tEPROTONOSUPPORT = syscall.Errno(0x78)\n\tEPROTOTYPE      = syscall.Errno(0x62)\n\tERANGE          = syscall.Errno(0x22)\n\tEREMCHG         = syscall.Errno(0x52)\n\tEREMOTE         = syscall.Errno(0x42)\n\tERESTART        = syscall.Errno(0x5b)\n\tEROFS           = syscall.Errno(0x1e)\n\tESHUTDOWN       = syscall.Errno(0x8f)\n\tESOCKTNOSUPPORT = syscall.Errno(0x79)\n\tESPIPE          = syscall.Errno(0x1d)\n\tESRCH           = syscall.Errno(0x3)\n\tESRMNT          = syscall.Errno(0x45)\n\tESTALE          = syscall.Errno(0x97)\n\tESTRPIPE        = syscall.Errno(0x5c)\n\tETIME           = syscall.Errno(0x3e)\n\tETIMEDOUT       = syscall.Errno(0x91)\n\tETOOMANYREFS    = syscall.Errno(0x90)\n\tETXTBSY         = syscall.Errno(0x1a)\n\tEUNATCH         = syscall.Errno(0x2a)\n\tEUSERS          = syscall.Errno(0x5e)\n\tEWOULDBLOCK     = syscall.Errno(0xb)\n\tEXDEV           = syscall.Errno(0x12)\n\tEXFULL          = syscall.Errno(0x34)\n)\n\n// Signals\nconst (\n\tSIGABRT    = syscall.Signal(0x6)\n\tSIGALRM    = syscall.Signal(0xe)\n\tSIGBUS     = syscall.Signal(0xa)\n\tSIGCANCEL  = syscall.Signal(0x24)\n\tSIGCHLD    = syscall.Signal(0x12)\n\tSIGCLD     = syscall.Signal(0x12)\n\tSIGCONT    = syscall.Signal(0x19)\n\tSIGEMT     = syscall.Signal(0x7)\n\tSIGFPE     = syscall.Signal(0x8)\n\tSIGFREEZE  = syscall.Signal(0x22)\n\tSIGHUP     = syscall.Signal(0x1)\n\tSIGILL     = syscall.Signal(0x4)\n\tSIGINFO    = syscall.Signal(0x29)\n\tSIGINT     = syscall.Signal(0x2)\n\tSIGIO      = syscall.Signal(0x16)\n\tSIGIOT     = syscall.Signal(0x6)\n\tSIGJVM1    = syscall.Signal(0x27)\n\tSIGJVM2    = syscall.Signal(0x28)\n\tSIGKILL    = syscall.Signal(0x9)\n\tSIGLOST    = syscall.Signal(0x25)\n\tSIGLWP     = syscall.Signal(0x21)\n\tSIGPIPE    = syscall.Signal(0xd)\n\tSIGPOLL    = syscall.Signal(0x16)\n\tSIGPROF    = syscall.Signal(0x1d)\n\tSIGPWR     = syscall.Signal(0x13)\n\tSIGQUIT    = syscall.Signal(0x3)\n\tSIGSEGV    = syscall.Signal(0xb)\n\tSIGSTOP    = syscall.Signal(0x17)\n\tSIGSYS     = syscall.Signal(0xc)\n\tSIGTERM    = syscall.Signal(0xf)\n\tSIGTHAW    = syscall.Signal(0x23)\n\tSIGTRAP    = syscall.Signal(0x5)\n\tSIGTSTP    = syscall.Signal(0x18)\n\tSIGTTIN    = syscall.Signal(0x1a)\n\tSIGTTOU    = syscall.Signal(0x1b)\n\tSIGURG     = syscall.Signal(0x15)\n\tSIGUSR1    = syscall.Signal(0x10)\n\tSIGUSR2    = syscall.Signal(0x11)\n\tSIGVTALRM  = syscall.Signal(0x1c)\n\tSIGWAITING = syscall.Signal(0x20)\n\tSIGWINCH   = syscall.Signal(0x14)\n\tSIGXCPU    = syscall.Signal(0x1e)\n\tSIGXFSZ    = syscall.Signal(0x1f)\n\tSIGXRES    = syscall.Signal(0x26)\n)\n\n// Error table\nvar errors = [...]string{\n\t1:   \"not owner\",\n\t2:   \"no such file or directory\",\n\t3:   \"no such process\",\n\t4:   \"interrupted system call\",\n\t5:   \"I/O error\",\n\t6:   \"no such device or address\",\n\t7:   \"arg list too long\",\n\t8:   \"exec format error\",\n\t9:   \"bad file number\",\n\t10:  \"no child processes\",\n\t11:  \"resource temporarily unavailable\",\n\t12:  \"not enough space\",\n\t13:  \"permission denied\",\n\t14:  \"bad address\",\n\t15:  \"block device required\",\n\t16:  \"device busy\",\n\t17:  \"file exists\",\n\t18:  \"cross-device link\",\n\t19:  \"no such device\",\n\t20:  \"not a directory\",\n\t21:  \"is a directory\",\n\t22:  \"invalid argument\",\n\t23:  \"file table overflow\",\n\t24:  \"too many open files\",\n\t25:  \"inappropriate ioctl for device\",\n\t26:  \"text file busy\",\n\t27:  \"file too large\",\n\t28:  \"no space left on device\",\n\t29:  \"illegal seek\",\n\t30:  \"read-only file system\",\n\t31:  \"too many links\",\n\t32:  \"broken pipe\",\n\t33:  \"argument out of domain\",\n\t34:  \"result too large\",\n\t35:  \"no message of desired type\",\n\t36:  \"identifier removed\",\n\t37:  \"channel number out of range\",\n\t38:  \"level 2 not synchronized\",\n\t39:  \"level 3 halted\",\n\t40:  \"level 3 reset\",\n\t41:  \"link number out of range\",\n\t42:  \"protocol driver not attached\",\n\t43:  \"no CSI structure available\",\n\t44:  \"level 2 halted\",\n\t45:  \"deadlock situation detected/avoided\",\n\t46:  \"no record locks available\",\n\t47:  \"operation canceled\",\n\t48:  \"operation not supported\",\n\t49:  \"disc quota exceeded\",\n\t50:  \"bad exchange descriptor\",\n\t51:  \"bad request descriptor\",\n\t52:  \"message tables full\",\n\t53:  \"anode table overflow\",\n\t54:  \"bad request code\",\n\t55:  \"invalid slot\",\n\t56:  \"file locking deadlock\",\n\t57:  \"bad font file format\",\n\t58:  \"owner of the lock died\",\n\t59:  \"lock is not recoverable\",\n\t60:  \"not a stream device\",\n\t61:  \"no data available\",\n\t62:  \"timer expired\",\n\t63:  \"out of stream resources\",\n\t64:  \"machine is not on the network\",\n\t65:  \"package not installed\",\n\t66:  \"object is remote\",\n\t67:  \"link has been severed\",\n\t68:  \"advertise error\",\n\t69:  \"srmount error\",\n\t70:  \"communication error on send\",\n\t71:  \"protocol error\",\n\t72:  \"locked lock was unmapped \",\n\t73:  \"facility is not active\",\n\t74:  \"multihop attempted\",\n\t77:  \"not a data message\",\n\t78:  \"file name too long\",\n\t79:  \"value too large for defined data type\",\n\t80:  \"name not unique on network\",\n\t81:  \"file descriptor in bad state\",\n\t82:  \"remote address changed\",\n\t83:  \"can not access a needed shared library\",\n\t84:  \"accessing a corrupted shared library\",\n\t85:  \".lib section in a.out corrupted\",\n\t86:  \"attempting to link in more shared libraries than system limit\",\n\t87:  \"can not exec a shared library directly\",\n\t88:  \"illegal byte sequence\",\n\t89:  \"operation not applicable\",\n\t90:  \"number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS\",\n\t91:  \"error 91\",\n\t92:  \"error 92\",\n\t93:  \"directory not empty\",\n\t94:  \"too many users\",\n\t95:  \"socket operation on non-socket\",\n\t96:  \"destination address required\",\n\t97:  \"message too long\",\n\t98:  \"protocol wrong type for socket\",\n\t99:  \"option not supported by protocol\",\n\t120: \"protocol not supported\",\n\t121: \"socket type not supported\",\n\t122: \"operation not supported on transport endpoint\",\n\t123: \"protocol family not supported\",\n\t124: \"address family not supported by protocol family\",\n\t125: \"address already in use\",\n\t126: \"cannot assign requested address\",\n\t127: \"network is down\",\n\t128: \"network is unreachable\",\n\t129: \"network dropped connection because of reset\",\n\t130: \"software caused connection abort\",\n\t131: \"connection reset by peer\",\n\t132: \"no buffer space available\",\n\t133: \"transport endpoint is already connected\",\n\t134: \"transport endpoint is not connected\",\n\t143: \"cannot send after socket shutdown\",\n\t144: \"too many references: cannot splice\",\n\t145: \"connection timed out\",\n\t146: \"connection refused\",\n\t147: \"host is down\",\n\t148: \"no route to host\",\n\t149: \"operation already in progress\",\n\t150: \"operation now in progress\",\n\t151: \"stale NFS file handle\",\n}\n\n// Signal table\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal Instruction\",\n\t5:  \"trace/Breakpoint Trap\",\n\t6:  \"abort\",\n\t7:  \"emulation Trap\",\n\t8:  \"arithmetic Exception\",\n\t9:  \"killed\",\n\t10: \"bus Error\",\n\t11: \"segmentation Fault\",\n\t12: \"bad System Call\",\n\t13: \"broken Pipe\",\n\t14: \"alarm Clock\",\n\t15: \"terminated\",\n\t16: \"user Signal 1\",\n\t17: \"user Signal 2\",\n\t18: \"child Status Changed\",\n\t19: \"power-Fail/Restart\",\n\t20: \"window Size Change\",\n\t21: \"urgent Socket Condition\",\n\t22: \"pollable Event\",\n\t23: \"stopped (signal)\",\n\t24: \"stopped (user)\",\n\t25: \"continued\",\n\t26: \"stopped (tty input)\",\n\t27: \"stopped (tty output)\",\n\t28: \"virtual Timer Expired\",\n\t29: \"profiling Timer Expired\",\n\t30: \"cpu Limit Exceeded\",\n\t31: \"file Size Limit Exceeded\",\n\t32: \"no runnable lwp\",\n\t33: \"inter-lwp signal\",\n\t34: \"checkpoint Freeze\",\n\t35: \"checkpoint Thaw\",\n\t36: \"thread Cancellation\",\n\t37: \"resource Lost\",\n\t38: \"resource Control Exceeded\",\n\t39: \"reserved for JVM 1\",\n\t40: \"reserved for JVM 2\",\n\t41: \"information Request\",\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zptrace386_linux.go",
    "content": "// Code generated by linux/mkall.go generatePtracePair(386, amd64). DO NOT EDIT.\n\n// +build linux\n// +build 386 amd64\n\npackage unix\n\nimport \"unsafe\"\n\n// PtraceRegs386 is the registers used by 386 binaries.\ntype PtraceRegs386 struct {\n\tEbx      int32\n\tEcx      int32\n\tEdx      int32\n\tEsi      int32\n\tEdi      int32\n\tEbp      int32\n\tEax      int32\n\tXds      int32\n\tXes      int32\n\tXfs      int32\n\tXgs      int32\n\tOrig_eax int32\n\tEip      int32\n\tXcs      int32\n\tEflags   int32\n\tEsp      int32\n\tXss      int32\n}\n\n// PtraceGetRegs386 fetches the registers used by 386 binaries.\nfunc PtraceGetRegs386(pid int, regsout *PtraceRegs386) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegs386 sets the registers used by 386 binaries.\nfunc PtraceSetRegs386(pid int, regs *PtraceRegs386) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n\n// PtraceRegsAmd64 is the registers used by amd64 binaries.\ntype PtraceRegsAmd64 struct {\n\tR15      uint64\n\tR14      uint64\n\tR13      uint64\n\tR12      uint64\n\tRbp      uint64\n\tRbx      uint64\n\tR11      uint64\n\tR10      uint64\n\tR9       uint64\n\tR8       uint64\n\tRax      uint64\n\tRcx      uint64\n\tRdx      uint64\n\tRsi      uint64\n\tRdi      uint64\n\tOrig_rax uint64\n\tRip      uint64\n\tCs       uint64\n\tEflags   uint64\n\tRsp      uint64\n\tSs       uint64\n\tFs_base  uint64\n\tGs_base  uint64\n\tDs       uint64\n\tEs       uint64\n\tFs       uint64\n\tGs       uint64\n}\n\n// PtraceGetRegsAmd64 fetches the registers used by amd64 binaries.\nfunc PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegsAmd64 sets the registers used by amd64 binaries.\nfunc PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zptracearm_linux.go",
    "content": "// Code generated by linux/mkall.go generatePtracePair(arm, arm64). DO NOT EDIT.\n\n// +build linux\n// +build arm arm64\n\npackage unix\n\nimport \"unsafe\"\n\n// PtraceRegsArm is the registers used by arm binaries.\ntype PtraceRegsArm struct {\n\tUregs [18]uint32\n}\n\n// PtraceGetRegsArm fetches the registers used by arm binaries.\nfunc PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegsArm sets the registers used by arm binaries.\nfunc PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n\n// PtraceRegsArm64 is the registers used by arm64 binaries.\ntype PtraceRegsArm64 struct {\n\tRegs   [31]uint64\n\tSp     uint64\n\tPc     uint64\n\tPstate uint64\n}\n\n// PtraceGetRegsArm64 fetches the registers used by arm64 binaries.\nfunc PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegsArm64 sets the registers used by arm64 binaries.\nfunc PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zptracemips_linux.go",
    "content": "// Code generated by linux/mkall.go generatePtracePair(mips, mips64). DO NOT EDIT.\n\n// +build linux\n// +build mips mips64\n\npackage unix\n\nimport \"unsafe\"\n\n// PtraceRegsMips is the registers used by mips binaries.\ntype PtraceRegsMips struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\n// PtraceGetRegsMips fetches the registers used by mips binaries.\nfunc PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegsMips sets the registers used by mips binaries.\nfunc PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n\n// PtraceRegsMips64 is the registers used by mips64 binaries.\ntype PtraceRegsMips64 struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\n// PtraceGetRegsMips64 fetches the registers used by mips64 binaries.\nfunc PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegsMips64 sets the registers used by mips64 binaries.\nfunc PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zptracemipsle_linux.go",
    "content": "// Code generated by linux/mkall.go generatePtracePair(mipsle, mips64le). DO NOT EDIT.\n\n// +build linux\n// +build mipsle mips64le\n\npackage unix\n\nimport \"unsafe\"\n\n// PtraceRegsMipsle is the registers used by mipsle binaries.\ntype PtraceRegsMipsle struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\n// PtraceGetRegsMipsle fetches the registers used by mipsle binaries.\nfunc PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegsMipsle sets the registers used by mipsle binaries.\nfunc PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n\n// PtraceRegsMips64le is the registers used by mips64le binaries.\ntype PtraceRegsMips64le struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\n// PtraceGetRegsMips64le fetches the registers used by mips64le binaries.\nfunc PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error {\n\treturn ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))\n}\n\n// PtraceSetRegsMips64le sets the registers used by mips64le binaries.\nfunc PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error {\n\treturn ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go",
    "content": "// mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build darwin,386\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kill(pid int, signum int, posix int) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exchangedata(path1 string, path2 string, options int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path1)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(path2)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(fromfd int, from string, tofd int, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setprivexec(flag int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc gettimeofday(tp *Timeval) (sec int32, usec int32, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tsec = int32(r0)\n\tusec = int32(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go",
    "content": "// mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build darwin,amd64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kill(pid int, signum int, posix int) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exchangedata(path1 string, path2 string, options int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path1)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(path2)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(fromfd int, from string, tofd int, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\tnewoffset = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setprivexec(flag int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos))\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc gettimeofday(tp *Timeval) (sec int64, usec int32, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tsec = int64(r0)\n\tusec = int32(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go",
    "content": "// mksyscall.pl -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build darwin,arm\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kill(pid int, signum int, posix int) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exchangedata(path1 string, path2 string, options int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path1)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(path2)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(fromfd int, from string, tofd int, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setprivexec(flag int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc gettimeofday(tp *Timeval) (sec int32, usec int32, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tsec = int32(r0)\n\tusec = int32(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go",
    "content": "// mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build darwin,arm64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kill(pid int, signum int, posix int) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exchangedata(path1 string, path2 string, options int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path1)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(path2)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(fromfd int, from string, tofd int, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\tnewoffset = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setprivexec(flag int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos))\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc gettimeofday(tp *Timeval) (sec int64, usec int32, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tsec = int64(r0)\n\tusec = int32(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go",
    "content": "// mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build dragonfly,amd64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc extpread(fd int, p []byte, flags int, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTPREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTPWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0)\n\tnewoffset = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go",
    "content": "// mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build freebsd,386\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CapEnter() (err error) {\n\t_, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc capRightsGet(version int, fd int, rightsp *CapRights) (err error) {\n\t_, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc capRightsLimit(fd int, rightsp *CapRights) (err error) {\n\t_, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fadvise(fd int, offset int64, length int64, advice int) (err error) {\n\t_, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(fromfd int, from string, tofd int, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go",
    "content": "// mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build freebsd,amd64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CapEnter() (err error) {\n\t_, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc capRightsGet(version int, fd int, rightsp *CapRights) (err error) {\n\t_, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc capRightsLimit(fd int, rightsp *CapRights) (err error) {\n\t_, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fadvise(fd int, offset int64, length int64, advice int) (err error) {\n\t_, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(fromfd int, from string, tofd int, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\tnewoffset = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos))\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go",
    "content": "// mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build freebsd,arm\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (r int, w int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tr = int(r0)\n\tw = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CapEnter() (err error) {\n\t_, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc capRightsGet(version int, fd int, rightsp *CapRights) (err error) {\n\t_, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc capRightsLimit(fd int, rightsp *CapRights) (err error) {\n\t_, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(file)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attrname)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fadvise(fd int, offset int64, length int64, advice int) (err error) {\n\t_, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdtablesize() (size int) {\n\tr0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0)\n\tsize = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(fromfd int, from string, tofd int, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Undelete(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_386.go",
    "content": "// mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,386\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fadvise(fd int, offset int64, length int64, advice int) (err error) {\n\t_, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Iopl(level int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0)\n\ttt = Time_t(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go",
    "content": "// mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,amd64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fadvise(fd int, offset int64, length int64, advice int) (err error) {\n\t_, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Iopl(level int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go",
    "content": "// mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,arm\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go",
    "content": "// mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,arm64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go",
    "content": "// mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,mips\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(int64(r0)<<32 | int64(r1))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length>>32), uintptr(length), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(int64(r0)<<32 | int64(r1))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length>>32), uintptr(length), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Iopl(level int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0)\n\ttt = Time_t(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go",
    "content": "// mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,mips64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fstat(fd int, st *stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc lstat(path string, st *stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc stat(path string, st *stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go",
    "content": "// mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,mips64le\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fstat(fd int, st *stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc lstat(path string, st *stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc stat(path string, st *stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go",
    "content": "// mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,mipsle\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Iopl(level int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0)\n\ttt = Time_t(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setrlimit(resource int, rlim *rlimit32) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go",
    "content": "// mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,ppc64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Iopl(level int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0)\n\ttt = Time_t(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go",
    "content": "// mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,ppc64le\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ioperm(from int, num int, on int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Iopl(level int) (err error) {\n\t_, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Time(t *Time_t) (tt Time_t, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0)\n\ttt = Time_t(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go",
    "content": "// mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,s390x\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fchmodat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlJoin(cmd int, arg2 string) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg2)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg3)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(arg4)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p0 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0)\n\tret = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(payload) > 0 {\n\t\t_p2 = unsafe.Pointer(&payload[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Eventfd(initval uint, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lgetxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Llistxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lremovexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lsetxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(keyType)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(description)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(callback)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0)\n\tid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Syncfs(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fadvise(fd int, offset int64, length int64, advice int) (err error) {\n\t_, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go",
    "content": "// mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build linux,sparc64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlinkat(oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ptrace(request int, pid int, addr uintptr, data uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(arg)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(source)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 *byte\n\t_p2, err = BytePtrFromString(fstype)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Acct(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtimex(buf *Timex) (state int, err error) {\n\tr0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tstate = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ClockGettime(clockid int32, time *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(oldfd int) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup3(oldfd int, newfd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate(size int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCreate1(flag int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT_GROUP, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fallocate(fd int, mode uint32, off int64, len int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrandom(buf []byte, flags int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettid() (tid int) {\n\tr0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0)\n\ttid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getxattr(path string, attr string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p2 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0)\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(pathname)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask))\n\twatchdesc = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit1(flags int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0)\n\tsuccess = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Klogctl(typ int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listxattr(path string, dest []byte) (sz int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(dest) > 0 {\n\t\t_p1 = unsafe.Pointer(&dest[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest)))\n\tsz = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc PivotRoot(newroot string, putold string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(newroot)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(putold)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Removexattr(path string, attr string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setdomainname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setns(fd int, nstype int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setxattr(path string, attr string, data []byte, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(attr)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p2 unsafe.Pointer\n\tif len(data) > 0 {\n\t\t_p2 = unsafe.Pointer(&data[0])\n\t} else {\n\t\t_p2 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() {\n\tSyscall(SYS_SYNC, 0, 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sysinfo(info *Sysinfo_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tee(rfd int, wfd int, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0)\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {\n\t_, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unshare(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc exitThread(code int) (err error) {\n\t_, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, p *byte, np int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(events) > 0 {\n\t\t_p0 = unsafe.Pointer(&events[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, buf *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc InotifyInit() (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, n int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pause() (err error) {\n\t_, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (off int64, err error) {\n\tr0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence))\n\toff = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {\n\tr0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)\n\twritten = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsgid(gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setfsuid(uid int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(resource int, rlim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))\n\tn = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, buf *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc SyncFileRange(fd int, off int64, n int64, flags int) (err error) {\n\t_, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {\n\tr0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(n int, list *_Gid_t) (nn int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tnn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(n int, list *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {\n\tr0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))\n\txaddr = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe2(p *[2]_C_int, flags int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go",
    "content": "// mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build netbsd,386\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (fd1 int, fd2 int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tfd1 = int(r0)\n\tfd2 = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go",
    "content": "// mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build netbsd,amd64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (fd1 int, fd2 int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tfd1 = int(r0)\n\tfd2 = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0)\n\tnewoffset = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go",
    "content": "// mksyscall.pl -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build netbsd,arm\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe() (fd1 int, fd2 int, err error) {\n\tr0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0)\n\tfd1 = int(r0)\n\tfd2 = int(r1)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go",
    "content": "// mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build openbsd,386\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go",
    "content": "// mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build openbsd,amd64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0)\n\tnewoffset = int64(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go",
    "content": "// mksyscall.pl -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build openbsd,arm\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ syscall.Errno\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) {\n\tr0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) {\n\tr0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(mib) > 0 {\n\t\t_p0 = unsafe.Pointer(&mib[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimes(path string, timeval *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc futimes(fd int, timeval *[2]Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg))\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Madvise(b []byte, behav int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(b) > 0 {\n\t\t_p0 = unsafe.Pointer(&b[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\t_, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc pipe(p *[2]_C_int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc getdents(fd int, buf []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p0 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chflags(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Dup2(from int, to int) (err error) {\n\t_, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Exit(code int) {\n\tSyscall(SYS_EXIT, uintptr(code), 0, 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchflags(fd int, flags int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fstatfs(fd int, stat *Statfs_t) (err error) {\n\t_, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Geteuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpgrp() (pgrp int) {\n\tr0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0)\n\tpgrp = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getpriority(which int, who int) (prio int, err error) {\n\tr0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0)\n\tprio = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getsid(pid int) (sid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0)\n\tsid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Issetugid() (tainted bool) {\n\tr0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0)\n\ttainted = bool(r0 != 0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Kqueue() (fd int, err error) {\n\tr0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm))\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 unsafe.Pointer\n\tif len(buf) > 0 {\n\t\t_p1 = unsafe.Pointer(&buf[0])\n\t} else {\n\t\t_p1 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Revoke(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0)\n\tnewoffset = int64(int64(r1)<<32 | int64(r0))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) {\n\t_, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setlogin(name string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresgid(rgid int, egid int, sgid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setresuid(ruid int, euid int, suid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid))\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Settimeofday(tp *Timeval) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Statfs(path string, stat *Statfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Sync() (err error) {\n\t_, _, e1 := Syscall(SYS_SYNC, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Umask(newmask int) (oldmask int) {\n\tr0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc Unmount(path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 unsafe.Pointer\n\tif len(p) > 0 {\n\t\t_p0 = unsafe.Pointer(&p[0])\n\t} else {\n\t\t_p0 = unsafe.Pointer(&_zero)\n\t}\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0)\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc readlen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc writelen(fd int, buf *byte, nbuf int) (n int, err error) {\n\tr0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n\n// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\nfunc utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = errnoErr(e1)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go",
    "content": "// mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build solaris,amd64\n\npackage unix\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n//go:cgo_import_dynamic libc_pipe pipe \"libc.so\"\n//go:cgo_import_dynamic libc_getsockname getsockname \"libsocket.so\"\n//go:cgo_import_dynamic libc_getcwd getcwd \"libc.so\"\n//go:cgo_import_dynamic libc_getgroups getgroups \"libc.so\"\n//go:cgo_import_dynamic libc_setgroups setgroups \"libc.so\"\n//go:cgo_import_dynamic libc_wait4 wait4 \"libc.so\"\n//go:cgo_import_dynamic libc_gethostname gethostname \"libc.so\"\n//go:cgo_import_dynamic libc_utimes utimes \"libc.so\"\n//go:cgo_import_dynamic libc_utimensat utimensat \"libc.so\"\n//go:cgo_import_dynamic libc_fcntl fcntl \"libc.so\"\n//go:cgo_import_dynamic libc_futimesat futimesat \"libc.so\"\n//go:cgo_import_dynamic libc_accept accept \"libsocket.so\"\n//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg \"libsocket.so\"\n//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg \"libsocket.so\"\n//go:cgo_import_dynamic libc_acct acct \"libc.so\"\n//go:cgo_import_dynamic libc___makedev __makedev \"libc.so\"\n//go:cgo_import_dynamic libc___major __major \"libc.so\"\n//go:cgo_import_dynamic libc___minor __minor \"libc.so\"\n//go:cgo_import_dynamic libc_ioctl ioctl \"libc.so\"\n//go:cgo_import_dynamic libc_poll poll \"libc.so\"\n//go:cgo_import_dynamic libc_access access \"libc.so\"\n//go:cgo_import_dynamic libc_adjtime adjtime \"libc.so\"\n//go:cgo_import_dynamic libc_chdir chdir \"libc.so\"\n//go:cgo_import_dynamic libc_chmod chmod \"libc.so\"\n//go:cgo_import_dynamic libc_chown chown \"libc.so\"\n//go:cgo_import_dynamic libc_chroot chroot \"libc.so\"\n//go:cgo_import_dynamic libc_close close \"libc.so\"\n//go:cgo_import_dynamic libc_creat creat \"libc.so\"\n//go:cgo_import_dynamic libc_dup dup \"libc.so\"\n//go:cgo_import_dynamic libc_dup2 dup2 \"libc.so\"\n//go:cgo_import_dynamic libc_exit exit \"libc.so\"\n//go:cgo_import_dynamic libc_fchdir fchdir \"libc.so\"\n//go:cgo_import_dynamic libc_fchmod fchmod \"libc.so\"\n//go:cgo_import_dynamic libc_fchmodat fchmodat \"libc.so\"\n//go:cgo_import_dynamic libc_fchown fchown \"libc.so\"\n//go:cgo_import_dynamic libc_fchownat fchownat \"libc.so\"\n//go:cgo_import_dynamic libc_fdatasync fdatasync \"libc.so\"\n//go:cgo_import_dynamic libc_flock flock \"libc.so\"\n//go:cgo_import_dynamic libc_fpathconf fpathconf \"libc.so\"\n//go:cgo_import_dynamic libc_fstat fstat \"libc.so\"\n//go:cgo_import_dynamic libc_fstatvfs fstatvfs \"libc.so\"\n//go:cgo_import_dynamic libc_getdents getdents \"libc.so\"\n//go:cgo_import_dynamic libc_getgid getgid \"libc.so\"\n//go:cgo_import_dynamic libc_getpid getpid \"libc.so\"\n//go:cgo_import_dynamic libc_getpgid getpgid \"libc.so\"\n//go:cgo_import_dynamic libc_getpgrp getpgrp \"libc.so\"\n//go:cgo_import_dynamic libc_geteuid geteuid \"libc.so\"\n//go:cgo_import_dynamic libc_getegid getegid \"libc.so\"\n//go:cgo_import_dynamic libc_getppid getppid \"libc.so\"\n//go:cgo_import_dynamic libc_getpriority getpriority \"libc.so\"\n//go:cgo_import_dynamic libc_getrlimit getrlimit \"libc.so\"\n//go:cgo_import_dynamic libc_getrusage getrusage \"libc.so\"\n//go:cgo_import_dynamic libc_gettimeofday gettimeofday \"libc.so\"\n//go:cgo_import_dynamic libc_getuid getuid \"libc.so\"\n//go:cgo_import_dynamic libc_kill kill \"libc.so\"\n//go:cgo_import_dynamic libc_lchown lchown \"libc.so\"\n//go:cgo_import_dynamic libc_link link \"libc.so\"\n//go:cgo_import_dynamic libc___xnet_llisten __xnet_llisten \"libsocket.so\"\n//go:cgo_import_dynamic libc_lstat lstat \"libc.so\"\n//go:cgo_import_dynamic libc_madvise madvise \"libc.so\"\n//go:cgo_import_dynamic libc_mkdir mkdir \"libc.so\"\n//go:cgo_import_dynamic libc_mkdirat mkdirat \"libc.so\"\n//go:cgo_import_dynamic libc_mkfifo mkfifo \"libc.so\"\n//go:cgo_import_dynamic libc_mkfifoat mkfifoat \"libc.so\"\n//go:cgo_import_dynamic libc_mknod mknod \"libc.so\"\n//go:cgo_import_dynamic libc_mknodat mknodat \"libc.so\"\n//go:cgo_import_dynamic libc_mlock mlock \"libc.so\"\n//go:cgo_import_dynamic libc_mlockall mlockall \"libc.so\"\n//go:cgo_import_dynamic libc_mprotect mprotect \"libc.so\"\n//go:cgo_import_dynamic libc_msync msync \"libc.so\"\n//go:cgo_import_dynamic libc_munlock munlock \"libc.so\"\n//go:cgo_import_dynamic libc_munlockall munlockall \"libc.so\"\n//go:cgo_import_dynamic libc_nanosleep nanosleep \"libc.so\"\n//go:cgo_import_dynamic libc_open open \"libc.so\"\n//go:cgo_import_dynamic libc_openat openat \"libc.so\"\n//go:cgo_import_dynamic libc_pathconf pathconf \"libc.so\"\n//go:cgo_import_dynamic libc_pause pause \"libc.so\"\n//go:cgo_import_dynamic libc_pread pread \"libc.so\"\n//go:cgo_import_dynamic libc_pwrite pwrite \"libc.so\"\n//go:cgo_import_dynamic libc_read read \"libc.so\"\n//go:cgo_import_dynamic libc_readlink readlink \"libc.so\"\n//go:cgo_import_dynamic libc_rename rename \"libc.so\"\n//go:cgo_import_dynamic libc_renameat renameat \"libc.so\"\n//go:cgo_import_dynamic libc_rmdir rmdir \"libc.so\"\n//go:cgo_import_dynamic libc_lseek lseek \"libc.so\"\n//go:cgo_import_dynamic libc_setegid setegid \"libc.so\"\n//go:cgo_import_dynamic libc_seteuid seteuid \"libc.so\"\n//go:cgo_import_dynamic libc_setgid setgid \"libc.so\"\n//go:cgo_import_dynamic libc_sethostname sethostname \"libc.so\"\n//go:cgo_import_dynamic libc_setpgid setpgid \"libc.so\"\n//go:cgo_import_dynamic libc_setpriority setpriority \"libc.so\"\n//go:cgo_import_dynamic libc_setregid setregid \"libc.so\"\n//go:cgo_import_dynamic libc_setreuid setreuid \"libc.so\"\n//go:cgo_import_dynamic libc_setrlimit setrlimit \"libc.so\"\n//go:cgo_import_dynamic libc_setsid setsid \"libc.so\"\n//go:cgo_import_dynamic libc_setuid setuid \"libc.so\"\n//go:cgo_import_dynamic libc_shutdown shutdown \"libsocket.so\"\n//go:cgo_import_dynamic libc_stat stat \"libc.so\"\n//go:cgo_import_dynamic libc_statvfs statvfs \"libc.so\"\n//go:cgo_import_dynamic libc_symlink symlink \"libc.so\"\n//go:cgo_import_dynamic libc_sync sync \"libc.so\"\n//go:cgo_import_dynamic libc_times times \"libc.so\"\n//go:cgo_import_dynamic libc_truncate truncate \"libc.so\"\n//go:cgo_import_dynamic libc_fsync fsync \"libc.so\"\n//go:cgo_import_dynamic libc_ftruncate ftruncate \"libc.so\"\n//go:cgo_import_dynamic libc_umask umask \"libc.so\"\n//go:cgo_import_dynamic libc_uname uname \"libc.so\"\n//go:cgo_import_dynamic libc_umount umount \"libc.so\"\n//go:cgo_import_dynamic libc_unlink unlink \"libc.so\"\n//go:cgo_import_dynamic libc_unlinkat unlinkat \"libc.so\"\n//go:cgo_import_dynamic libc_ustat ustat \"libc.so\"\n//go:cgo_import_dynamic libc_utime utime \"libc.so\"\n//go:cgo_import_dynamic libc___xnet_bind __xnet_bind \"libsocket.so\"\n//go:cgo_import_dynamic libc___xnet_connect __xnet_connect \"libsocket.so\"\n//go:cgo_import_dynamic libc_mmap mmap \"libc.so\"\n//go:cgo_import_dynamic libc_munmap munmap \"libc.so\"\n//go:cgo_import_dynamic libc___xnet_sendto __xnet_sendto \"libsocket.so\"\n//go:cgo_import_dynamic libc___xnet_socket __xnet_socket \"libsocket.so\"\n//go:cgo_import_dynamic libc___xnet_socketpair __xnet_socketpair \"libsocket.so\"\n//go:cgo_import_dynamic libc_write write \"libc.so\"\n//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt \"libsocket.so\"\n//go:cgo_import_dynamic libc_getpeername getpeername \"libsocket.so\"\n//go:cgo_import_dynamic libc_setsockopt setsockopt \"libsocket.so\"\n//go:cgo_import_dynamic libc_recvfrom recvfrom \"libsocket.so\"\n\n//go:linkname procpipe libc_pipe\n//go:linkname procgetsockname libc_getsockname\n//go:linkname procGetcwd libc_getcwd\n//go:linkname procgetgroups libc_getgroups\n//go:linkname procsetgroups libc_setgroups\n//go:linkname procwait4 libc_wait4\n//go:linkname procgethostname libc_gethostname\n//go:linkname procutimes libc_utimes\n//go:linkname procutimensat libc_utimensat\n//go:linkname procfcntl libc_fcntl\n//go:linkname procfutimesat libc_futimesat\n//go:linkname procaccept libc_accept\n//go:linkname proc__xnet_recvmsg libc___xnet_recvmsg\n//go:linkname proc__xnet_sendmsg libc___xnet_sendmsg\n//go:linkname procacct libc_acct\n//go:linkname proc__makedev libc___makedev\n//go:linkname proc__major libc___major\n//go:linkname proc__minor libc___minor\n//go:linkname procioctl libc_ioctl\n//go:linkname procpoll libc_poll\n//go:linkname procAccess libc_access\n//go:linkname procAdjtime libc_adjtime\n//go:linkname procChdir libc_chdir\n//go:linkname procChmod libc_chmod\n//go:linkname procChown libc_chown\n//go:linkname procChroot libc_chroot\n//go:linkname procClose libc_close\n//go:linkname procCreat libc_creat\n//go:linkname procDup libc_dup\n//go:linkname procDup2 libc_dup2\n//go:linkname procExit libc_exit\n//go:linkname procFchdir libc_fchdir\n//go:linkname procFchmod libc_fchmod\n//go:linkname procFchmodat libc_fchmodat\n//go:linkname procFchown libc_fchown\n//go:linkname procFchownat libc_fchownat\n//go:linkname procFdatasync libc_fdatasync\n//go:linkname procFlock libc_flock\n//go:linkname procFpathconf libc_fpathconf\n//go:linkname procFstat libc_fstat\n//go:linkname procFstatvfs libc_fstatvfs\n//go:linkname procGetdents libc_getdents\n//go:linkname procGetgid libc_getgid\n//go:linkname procGetpid libc_getpid\n//go:linkname procGetpgid libc_getpgid\n//go:linkname procGetpgrp libc_getpgrp\n//go:linkname procGeteuid libc_geteuid\n//go:linkname procGetegid libc_getegid\n//go:linkname procGetppid libc_getppid\n//go:linkname procGetpriority libc_getpriority\n//go:linkname procGetrlimit libc_getrlimit\n//go:linkname procGetrusage libc_getrusage\n//go:linkname procGettimeofday libc_gettimeofday\n//go:linkname procGetuid libc_getuid\n//go:linkname procKill libc_kill\n//go:linkname procLchown libc_lchown\n//go:linkname procLink libc_link\n//go:linkname proc__xnet_llisten libc___xnet_llisten\n//go:linkname procLstat libc_lstat\n//go:linkname procMadvise libc_madvise\n//go:linkname procMkdir libc_mkdir\n//go:linkname procMkdirat libc_mkdirat\n//go:linkname procMkfifo libc_mkfifo\n//go:linkname procMkfifoat libc_mkfifoat\n//go:linkname procMknod libc_mknod\n//go:linkname procMknodat libc_mknodat\n//go:linkname procMlock libc_mlock\n//go:linkname procMlockall libc_mlockall\n//go:linkname procMprotect libc_mprotect\n//go:linkname procMsync libc_msync\n//go:linkname procMunlock libc_munlock\n//go:linkname procMunlockall libc_munlockall\n//go:linkname procNanosleep libc_nanosleep\n//go:linkname procOpen libc_open\n//go:linkname procOpenat libc_openat\n//go:linkname procPathconf libc_pathconf\n//go:linkname procPause libc_pause\n//go:linkname procPread libc_pread\n//go:linkname procPwrite libc_pwrite\n//go:linkname procread libc_read\n//go:linkname procReadlink libc_readlink\n//go:linkname procRename libc_rename\n//go:linkname procRenameat libc_renameat\n//go:linkname procRmdir libc_rmdir\n//go:linkname proclseek libc_lseek\n//go:linkname procSetegid libc_setegid\n//go:linkname procSeteuid libc_seteuid\n//go:linkname procSetgid libc_setgid\n//go:linkname procSethostname libc_sethostname\n//go:linkname procSetpgid libc_setpgid\n//go:linkname procSetpriority libc_setpriority\n//go:linkname procSetregid libc_setregid\n//go:linkname procSetreuid libc_setreuid\n//go:linkname procSetrlimit libc_setrlimit\n//go:linkname procSetsid libc_setsid\n//go:linkname procSetuid libc_setuid\n//go:linkname procshutdown libc_shutdown\n//go:linkname procStat libc_stat\n//go:linkname procStatvfs libc_statvfs\n//go:linkname procSymlink libc_symlink\n//go:linkname procSync libc_sync\n//go:linkname procTimes libc_times\n//go:linkname procTruncate libc_truncate\n//go:linkname procFsync libc_fsync\n//go:linkname procFtruncate libc_ftruncate\n//go:linkname procUmask libc_umask\n//go:linkname procUname libc_uname\n//go:linkname procumount libc_umount\n//go:linkname procUnlink libc_unlink\n//go:linkname procUnlinkat libc_unlinkat\n//go:linkname procUstat libc_ustat\n//go:linkname procUtime libc_utime\n//go:linkname proc__xnet_bind libc___xnet_bind\n//go:linkname proc__xnet_connect libc___xnet_connect\n//go:linkname procmmap libc_mmap\n//go:linkname procmunmap libc_munmap\n//go:linkname proc__xnet_sendto libc___xnet_sendto\n//go:linkname proc__xnet_socket libc___xnet_socket\n//go:linkname proc__xnet_socketpair libc___xnet_socketpair\n//go:linkname procwrite libc_write\n//go:linkname proc__xnet_getsockopt libc___xnet_getsockopt\n//go:linkname procgetpeername libc_getpeername\n//go:linkname procsetsockopt libc_setsockopt\n//go:linkname procrecvfrom libc_recvfrom\n\nvar (\n\tprocpipe,\n\tprocgetsockname,\n\tprocGetcwd,\n\tprocgetgroups,\n\tprocsetgroups,\n\tprocwait4,\n\tprocgethostname,\n\tprocutimes,\n\tprocutimensat,\n\tprocfcntl,\n\tprocfutimesat,\n\tprocaccept,\n\tproc__xnet_recvmsg,\n\tproc__xnet_sendmsg,\n\tprocacct,\n\tproc__makedev,\n\tproc__major,\n\tproc__minor,\n\tprocioctl,\n\tprocpoll,\n\tprocAccess,\n\tprocAdjtime,\n\tprocChdir,\n\tprocChmod,\n\tprocChown,\n\tprocChroot,\n\tprocClose,\n\tprocCreat,\n\tprocDup,\n\tprocDup2,\n\tprocExit,\n\tprocFchdir,\n\tprocFchmod,\n\tprocFchmodat,\n\tprocFchown,\n\tprocFchownat,\n\tprocFdatasync,\n\tprocFlock,\n\tprocFpathconf,\n\tprocFstat,\n\tprocFstatvfs,\n\tprocGetdents,\n\tprocGetgid,\n\tprocGetpid,\n\tprocGetpgid,\n\tprocGetpgrp,\n\tprocGeteuid,\n\tprocGetegid,\n\tprocGetppid,\n\tprocGetpriority,\n\tprocGetrlimit,\n\tprocGetrusage,\n\tprocGettimeofday,\n\tprocGetuid,\n\tprocKill,\n\tprocLchown,\n\tprocLink,\n\tproc__xnet_llisten,\n\tprocLstat,\n\tprocMadvise,\n\tprocMkdir,\n\tprocMkdirat,\n\tprocMkfifo,\n\tprocMkfifoat,\n\tprocMknod,\n\tprocMknodat,\n\tprocMlock,\n\tprocMlockall,\n\tprocMprotect,\n\tprocMsync,\n\tprocMunlock,\n\tprocMunlockall,\n\tprocNanosleep,\n\tprocOpen,\n\tprocOpenat,\n\tprocPathconf,\n\tprocPause,\n\tprocPread,\n\tprocPwrite,\n\tprocread,\n\tprocReadlink,\n\tprocRename,\n\tprocRenameat,\n\tprocRmdir,\n\tproclseek,\n\tprocSetegid,\n\tprocSeteuid,\n\tprocSetgid,\n\tprocSethostname,\n\tprocSetpgid,\n\tprocSetpriority,\n\tprocSetregid,\n\tprocSetreuid,\n\tprocSetrlimit,\n\tprocSetsid,\n\tprocSetuid,\n\tprocshutdown,\n\tprocStat,\n\tprocStatvfs,\n\tprocSymlink,\n\tprocSync,\n\tprocTimes,\n\tprocTruncate,\n\tprocFsync,\n\tprocFtruncate,\n\tprocUmask,\n\tprocUname,\n\tprocumount,\n\tprocUnlink,\n\tprocUnlinkat,\n\tprocUstat,\n\tprocUtime,\n\tproc__xnet_bind,\n\tproc__xnet_connect,\n\tprocmmap,\n\tprocmunmap,\n\tproc__xnet_sendto,\n\tproc__xnet_socket,\n\tproc__xnet_socketpair,\n\tprocwrite,\n\tproc__xnet_getsockopt,\n\tprocgetpeername,\n\tprocsetsockopt,\n\tprocrecvfrom syscallFunc\n)\n\nfunc pipe(p *[2]_C_int) (n int, err error) {\n\tr0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Getcwd(buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\tif len(buf) > 0 {\n\t\t_p0 = &buf[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc getgroups(ngid int, gid *_Gid_t) (n int, err error) {\n\tr0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc setgroups(ngid int, gid *_Gid_t) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0)\n\twpid = int32(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc gethostname(buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\tif len(buf) > 0 {\n\t\t_p0 = &buf[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc utimes(path string, times *[2]Timeval) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc fcntl(fd int, cmd int, arg int) (val int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc futimesat(fildes int, path *byte, times *[2]Timeval) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc acct(path *byte) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc __makedev(version int, major uint, minor uint) (val uint64) {\n\tr0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__makedev)), 3, uintptr(version), uintptr(major), uintptr(minor), 0, 0, 0)\n\tval = uint64(r0)\n\treturn\n}\n\nfunc __major(version int, dev uint64) (val uint) {\n\tr0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__major)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0)\n\tval = uint(r0)\n\treturn\n}\n\nfunc __minor(version int, dev uint64) (val uint) {\n\tr0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__minor)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0)\n\tval = uint(r0)\n\treturn\n}\n\nfunc ioctl(fd int, req uint, arg uintptr) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc poll(fds *PollFd, nfds int, timeout int) (n int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Access(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Adjtime(delta *Timeval, olddelta *Timeval) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Chdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Chown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Chroot(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Close(fd int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Creat(path string, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Dup(fd int) (nfd int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0)\n\tnfd = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Dup2(oldfd int, newfd int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Exit(code int) {\n\tsysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0)\n\treturn\n}\n\nfunc Fchdir(fd int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fchmod(fd int, mode uint32) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fchown(fd int, uid int, gid int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fdatasync(fd int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Flock(fd int, how int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fpathconf(fd int, name int) (val int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fstat(fd int, stat *Stat_t) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) {\n\tvar _p0 *byte\n\tif len(buf) > 0 {\n\t\t_p0 = &buf[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Getgid() (gid int) {\n\tr0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetgid)), 0, 0, 0, 0, 0, 0, 0)\n\tgid = int(r0)\n\treturn\n}\n\nfunc Getpid() (pid int) {\n\tr0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpid)), 0, 0, 0, 0, 0, 0, 0)\n\tpid = int(r0)\n\treturn\n}\n\nfunc Getpgid(pid int) (pgid int, err error) {\n\tr0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Getpgrp() (pgid int, err error) {\n\tr0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0)\n\tpgid = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Geteuid() (euid int) {\n\tr0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0)\n\teuid = int(r0)\n\treturn\n}\n\nfunc Getegid() (egid int) {\n\tr0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetegid)), 0, 0, 0, 0, 0, 0, 0)\n\tegid = int(r0)\n\treturn\n}\n\nfunc Getppid() (ppid int) {\n\tr0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetppid)), 0, 0, 0, 0, 0, 0, 0)\n\tppid = int(r0)\n\treturn\n}\n\nfunc Getpriority(which int, who int) (n int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Getrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Getrusage(who int, rusage *Rusage) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Getuid() (uid int) {\n\tr0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetuid)), 0, 0, 0, 0, 0, 0, 0)\n\tuid = int(r0)\n\treturn\n}\n\nfunc Kill(pid int, signum syscall.Signal) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Lchown(path string, uid int, gid int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Link(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Listen(s int, backlog int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Lstat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Madvise(b []byte, advice int) (err error) {\n\tvar _p0 *byte\n\tif len(b) > 0 {\n\t\t_p0 = &b[0]\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mkdirat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mkfifo(path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mkfifoat(dirfd int, path string, mode uint32) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mknod(path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mknodat(dirfd int, path string, mode uint32, dev int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mlock(b []byte) (err error) {\n\tvar _p0 *byte\n\tif len(b) > 0 {\n\t\t_p0 = &b[0]\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mlockall(flags int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Mprotect(b []byte, prot int) (err error) {\n\tvar _p0 *byte\n\tif len(b) > 0 {\n\t\t_p0 = &b[0]\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Msync(b []byte, flags int) (err error) {\n\tvar _p0 *byte\n\tif len(b) > 0 {\n\t\t_p0 = &b[0]\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Munlock(b []byte) (err error) {\n\tvar _p0 *byte\n\tif len(b) > 0 {\n\t\t_p0 = &b[0]\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Munlockall() (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Nanosleep(time *Timespec, leftover *Timespec) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Open(path string, mode int, perm uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Pathconf(path string, name int) (val int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0)\n\tval = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Pause() (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Pread(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 *byte\n\tif len(p) > 0 {\n\t\t_p0 = &p[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Pwrite(fd int, p []byte, offset int64) (n int, err error) {\n\tvar _p0 *byte\n\tif len(p) > 0 {\n\t\t_p0 = &p[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc read(fd int, p []byte) (n int, err error) {\n\tvar _p0 *byte\n\tif len(p) > 0 {\n\t\t_p0 = &p[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\tif len(buf) > 0 {\n\t\t_p1 = &buf[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Rename(from string, to string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(from)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(to)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(oldpath)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(newpath)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Rmdir(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Seek(fd int, offset int64, whence int) (newoffset int64, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0)\n\tnewoffset = int64(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setegid(egid int) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Seteuid(euid int) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setgid(gid int) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Sethostname(p []byte) (err error) {\n\tvar _p0 *byte\n\tif len(p) > 0 {\n\t\t_p0 = &p[0]\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setpgid(pid int, pgid int) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setpriority(which int, who int, prio int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setregid(rgid int, egid int) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setreuid(ruid int, euid int) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setrlimit(which int, lim *Rlimit) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setsid() (pid int, err error) {\n\tr0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0)\n\tpid = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Setuid(uid int) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Shutdown(s int, how int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Stat(path string, stat *Stat_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Statvfs(path string, vfsstat *Statvfs_t) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Symlink(path string, link string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = BytePtrFromString(link)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Sync() (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Times(tms *Tms) (ticks uintptr, err error) {\n\tr0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0)\n\tticks = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Truncate(path string, length int64) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Fsync(fd int) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Ftruncate(fd int, length int64) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Umask(mask int) (oldmask int) {\n\tr0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0)\n\toldmask = int(r0)\n\treturn\n}\n\nfunc Uname(buf *Utsname) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Unmount(target string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(target)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Unlink(path string) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Unlinkat(dirfd int, path string, flags int) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Ustat(dev int, ubuf *Ustat_t) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc Utime(path string, buf *Utimbuf) (err error) {\n\tvar _p0 *byte\n\t_p0, err = BytePtrFromString(path)\n\tif err != nil {\n\t\treturn\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos))\n\tret = uintptr(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc munmap(addr uintptr, length uintptr) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {\n\tvar _p0 *byte\n\tif len(buf) > 0 {\n\t\t_p0 = &buf[0]\n\t}\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen))\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc socket(domain int, typ int, proto int) (fd int, err error) {\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)\n\tfd = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc write(fd int, p []byte) (n int, err error) {\n\tvar _p0 *byte\n\tif len(p) > 0 {\n\t\t_p0 = &p[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0)\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {\n\t_, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {\n\t_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n\nfunc recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {\n\tvar _p0 *byte\n\tif len(p) > 0 {\n\t\t_p0 = &p[0]\n\t}\n\tr0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))\n\tn = int(r0)\n\tif e1 != 0 {\n\t\terr = e1\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go",
    "content": "// mksysctl_openbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\npackage unix\n\ntype mibentry struct {\n\tctlname string\n\tctloid  []_C_int\n}\n\nvar sysctlMib = []mibentry{\n\t{\"ddb.console\", []_C_int{9, 6}},\n\t{\"ddb.log\", []_C_int{9, 7}},\n\t{\"ddb.max_line\", []_C_int{9, 3}},\n\t{\"ddb.max_width\", []_C_int{9, 2}},\n\t{\"ddb.panic\", []_C_int{9, 5}},\n\t{\"ddb.radix\", []_C_int{9, 1}},\n\t{\"ddb.tab_stop_width\", []_C_int{9, 4}},\n\t{\"ddb.trigger\", []_C_int{9, 8}},\n\t{\"fs.posix.setuid\", []_C_int{3, 1, 1}},\n\t{\"hw.allowpowerdown\", []_C_int{6, 22}},\n\t{\"hw.byteorder\", []_C_int{6, 4}},\n\t{\"hw.cpuspeed\", []_C_int{6, 12}},\n\t{\"hw.diskcount\", []_C_int{6, 10}},\n\t{\"hw.disknames\", []_C_int{6, 8}},\n\t{\"hw.diskstats\", []_C_int{6, 9}},\n\t{\"hw.machine\", []_C_int{6, 1}},\n\t{\"hw.model\", []_C_int{6, 2}},\n\t{\"hw.ncpu\", []_C_int{6, 3}},\n\t{\"hw.ncpufound\", []_C_int{6, 21}},\n\t{\"hw.pagesize\", []_C_int{6, 7}},\n\t{\"hw.physmem\", []_C_int{6, 19}},\n\t{\"hw.product\", []_C_int{6, 15}},\n\t{\"hw.serialno\", []_C_int{6, 17}},\n\t{\"hw.setperf\", []_C_int{6, 13}},\n\t{\"hw.usermem\", []_C_int{6, 20}},\n\t{\"hw.uuid\", []_C_int{6, 18}},\n\t{\"hw.vendor\", []_C_int{6, 14}},\n\t{\"hw.version\", []_C_int{6, 16}},\n\t{\"kern.arandom\", []_C_int{1, 37}},\n\t{\"kern.argmax\", []_C_int{1, 8}},\n\t{\"kern.boottime\", []_C_int{1, 21}},\n\t{\"kern.bufcachepercent\", []_C_int{1, 72}},\n\t{\"kern.ccpu\", []_C_int{1, 45}},\n\t{\"kern.clockrate\", []_C_int{1, 12}},\n\t{\"kern.consdev\", []_C_int{1, 75}},\n\t{\"kern.cp_time\", []_C_int{1, 40}},\n\t{\"kern.cp_time2\", []_C_int{1, 71}},\n\t{\"kern.cryptodevallowsoft\", []_C_int{1, 53}},\n\t{\"kern.domainname\", []_C_int{1, 22}},\n\t{\"kern.file\", []_C_int{1, 73}},\n\t{\"kern.forkstat\", []_C_int{1, 42}},\n\t{\"kern.fscale\", []_C_int{1, 46}},\n\t{\"kern.fsync\", []_C_int{1, 33}},\n\t{\"kern.hostid\", []_C_int{1, 11}},\n\t{\"kern.hostname\", []_C_int{1, 10}},\n\t{\"kern.intrcnt.nintrcnt\", []_C_int{1, 63, 1}},\n\t{\"kern.job_control\", []_C_int{1, 19}},\n\t{\"kern.malloc.buckets\", []_C_int{1, 39, 1}},\n\t{\"kern.malloc.kmemnames\", []_C_int{1, 39, 3}},\n\t{\"kern.maxclusters\", []_C_int{1, 67}},\n\t{\"kern.maxfiles\", []_C_int{1, 7}},\n\t{\"kern.maxlocksperuid\", []_C_int{1, 70}},\n\t{\"kern.maxpartitions\", []_C_int{1, 23}},\n\t{\"kern.maxproc\", []_C_int{1, 6}},\n\t{\"kern.maxthread\", []_C_int{1, 25}},\n\t{\"kern.maxvnodes\", []_C_int{1, 5}},\n\t{\"kern.mbstat\", []_C_int{1, 59}},\n\t{\"kern.msgbuf\", []_C_int{1, 48}},\n\t{\"kern.msgbufsize\", []_C_int{1, 38}},\n\t{\"kern.nchstats\", []_C_int{1, 41}},\n\t{\"kern.netlivelocks\", []_C_int{1, 76}},\n\t{\"kern.nfiles\", []_C_int{1, 56}},\n\t{\"kern.ngroups\", []_C_int{1, 18}},\n\t{\"kern.nosuidcoredump\", []_C_int{1, 32}},\n\t{\"kern.nprocs\", []_C_int{1, 47}},\n\t{\"kern.nselcoll\", []_C_int{1, 43}},\n\t{\"kern.nthreads\", []_C_int{1, 26}},\n\t{\"kern.numvnodes\", []_C_int{1, 58}},\n\t{\"kern.osrelease\", []_C_int{1, 2}},\n\t{\"kern.osrevision\", []_C_int{1, 3}},\n\t{\"kern.ostype\", []_C_int{1, 1}},\n\t{\"kern.osversion\", []_C_int{1, 27}},\n\t{\"kern.pool_debug\", []_C_int{1, 77}},\n\t{\"kern.posix1version\", []_C_int{1, 17}},\n\t{\"kern.proc\", []_C_int{1, 66}},\n\t{\"kern.random\", []_C_int{1, 31}},\n\t{\"kern.rawpartition\", []_C_int{1, 24}},\n\t{\"kern.saved_ids\", []_C_int{1, 20}},\n\t{\"kern.securelevel\", []_C_int{1, 9}},\n\t{\"kern.seminfo\", []_C_int{1, 61}},\n\t{\"kern.shminfo\", []_C_int{1, 62}},\n\t{\"kern.somaxconn\", []_C_int{1, 28}},\n\t{\"kern.sominconn\", []_C_int{1, 29}},\n\t{\"kern.splassert\", []_C_int{1, 54}},\n\t{\"kern.stackgap_random\", []_C_int{1, 50}},\n\t{\"kern.sysvipc_info\", []_C_int{1, 51}},\n\t{\"kern.sysvmsg\", []_C_int{1, 34}},\n\t{\"kern.sysvsem\", []_C_int{1, 35}},\n\t{\"kern.sysvshm\", []_C_int{1, 36}},\n\t{\"kern.timecounter.choice\", []_C_int{1, 69, 4}},\n\t{\"kern.timecounter.hardware\", []_C_int{1, 69, 3}},\n\t{\"kern.timecounter.tick\", []_C_int{1, 69, 1}},\n\t{\"kern.timecounter.timestepwarnings\", []_C_int{1, 69, 2}},\n\t{\"kern.tty.maxptys\", []_C_int{1, 44, 6}},\n\t{\"kern.tty.nptys\", []_C_int{1, 44, 7}},\n\t{\"kern.tty.tk_cancc\", []_C_int{1, 44, 4}},\n\t{\"kern.tty.tk_nin\", []_C_int{1, 44, 1}},\n\t{\"kern.tty.tk_nout\", []_C_int{1, 44, 2}},\n\t{\"kern.tty.tk_rawcc\", []_C_int{1, 44, 3}},\n\t{\"kern.tty.ttyinfo\", []_C_int{1, 44, 5}},\n\t{\"kern.ttycount\", []_C_int{1, 57}},\n\t{\"kern.userasymcrypto\", []_C_int{1, 60}},\n\t{\"kern.usercrypto\", []_C_int{1, 52}},\n\t{\"kern.usermount\", []_C_int{1, 30}},\n\t{\"kern.version\", []_C_int{1, 4}},\n\t{\"kern.vnode\", []_C_int{1, 13}},\n\t{\"kern.watchdog.auto\", []_C_int{1, 64, 2}},\n\t{\"kern.watchdog.period\", []_C_int{1, 64, 1}},\n\t{\"net.bpf.bufsize\", []_C_int{4, 31, 1}},\n\t{\"net.bpf.maxbufsize\", []_C_int{4, 31, 2}},\n\t{\"net.inet.ah.enable\", []_C_int{4, 2, 51, 1}},\n\t{\"net.inet.ah.stats\", []_C_int{4, 2, 51, 2}},\n\t{\"net.inet.carp.allow\", []_C_int{4, 2, 112, 1}},\n\t{\"net.inet.carp.log\", []_C_int{4, 2, 112, 3}},\n\t{\"net.inet.carp.preempt\", []_C_int{4, 2, 112, 2}},\n\t{\"net.inet.carp.stats\", []_C_int{4, 2, 112, 4}},\n\t{\"net.inet.divert.recvspace\", []_C_int{4, 2, 258, 1}},\n\t{\"net.inet.divert.sendspace\", []_C_int{4, 2, 258, 2}},\n\t{\"net.inet.divert.stats\", []_C_int{4, 2, 258, 3}},\n\t{\"net.inet.esp.enable\", []_C_int{4, 2, 50, 1}},\n\t{\"net.inet.esp.stats\", []_C_int{4, 2, 50, 4}},\n\t{\"net.inet.esp.udpencap\", []_C_int{4, 2, 50, 2}},\n\t{\"net.inet.esp.udpencap_port\", []_C_int{4, 2, 50, 3}},\n\t{\"net.inet.etherip.allow\", []_C_int{4, 2, 97, 1}},\n\t{\"net.inet.etherip.stats\", []_C_int{4, 2, 97, 2}},\n\t{\"net.inet.gre.allow\", []_C_int{4, 2, 47, 1}},\n\t{\"net.inet.gre.wccp\", []_C_int{4, 2, 47, 2}},\n\t{\"net.inet.icmp.bmcastecho\", []_C_int{4, 2, 1, 2}},\n\t{\"net.inet.icmp.errppslimit\", []_C_int{4, 2, 1, 3}},\n\t{\"net.inet.icmp.maskrepl\", []_C_int{4, 2, 1, 1}},\n\t{\"net.inet.icmp.rediraccept\", []_C_int{4, 2, 1, 4}},\n\t{\"net.inet.icmp.redirtimeout\", []_C_int{4, 2, 1, 5}},\n\t{\"net.inet.icmp.stats\", []_C_int{4, 2, 1, 7}},\n\t{\"net.inet.icmp.tstamprepl\", []_C_int{4, 2, 1, 6}},\n\t{\"net.inet.igmp.stats\", []_C_int{4, 2, 2, 1}},\n\t{\"net.inet.ip.arpqueued\", []_C_int{4, 2, 0, 36}},\n\t{\"net.inet.ip.encdebug\", []_C_int{4, 2, 0, 12}},\n\t{\"net.inet.ip.forwarding\", []_C_int{4, 2, 0, 1}},\n\t{\"net.inet.ip.ifq.congestion\", []_C_int{4, 2, 0, 30, 4}},\n\t{\"net.inet.ip.ifq.drops\", []_C_int{4, 2, 0, 30, 3}},\n\t{\"net.inet.ip.ifq.len\", []_C_int{4, 2, 0, 30, 1}},\n\t{\"net.inet.ip.ifq.maxlen\", []_C_int{4, 2, 0, 30, 2}},\n\t{\"net.inet.ip.maxqueue\", []_C_int{4, 2, 0, 11}},\n\t{\"net.inet.ip.mforwarding\", []_C_int{4, 2, 0, 31}},\n\t{\"net.inet.ip.mrtproto\", []_C_int{4, 2, 0, 34}},\n\t{\"net.inet.ip.mrtstats\", []_C_int{4, 2, 0, 35}},\n\t{\"net.inet.ip.mtu\", []_C_int{4, 2, 0, 4}},\n\t{\"net.inet.ip.mtudisc\", []_C_int{4, 2, 0, 27}},\n\t{\"net.inet.ip.mtudisctimeout\", []_C_int{4, 2, 0, 28}},\n\t{\"net.inet.ip.multipath\", []_C_int{4, 2, 0, 32}},\n\t{\"net.inet.ip.portfirst\", []_C_int{4, 2, 0, 7}},\n\t{\"net.inet.ip.porthifirst\", []_C_int{4, 2, 0, 9}},\n\t{\"net.inet.ip.porthilast\", []_C_int{4, 2, 0, 10}},\n\t{\"net.inet.ip.portlast\", []_C_int{4, 2, 0, 8}},\n\t{\"net.inet.ip.redirect\", []_C_int{4, 2, 0, 2}},\n\t{\"net.inet.ip.sourceroute\", []_C_int{4, 2, 0, 5}},\n\t{\"net.inet.ip.stats\", []_C_int{4, 2, 0, 33}},\n\t{\"net.inet.ip.ttl\", []_C_int{4, 2, 0, 3}},\n\t{\"net.inet.ipcomp.enable\", []_C_int{4, 2, 108, 1}},\n\t{\"net.inet.ipcomp.stats\", []_C_int{4, 2, 108, 2}},\n\t{\"net.inet.ipip.allow\", []_C_int{4, 2, 4, 1}},\n\t{\"net.inet.ipip.stats\", []_C_int{4, 2, 4, 2}},\n\t{\"net.inet.mobileip.allow\", []_C_int{4, 2, 55, 1}},\n\t{\"net.inet.pfsync.stats\", []_C_int{4, 2, 240, 1}},\n\t{\"net.inet.pim.stats\", []_C_int{4, 2, 103, 1}},\n\t{\"net.inet.tcp.ackonpush\", []_C_int{4, 2, 6, 13}},\n\t{\"net.inet.tcp.always_keepalive\", []_C_int{4, 2, 6, 22}},\n\t{\"net.inet.tcp.baddynamic\", []_C_int{4, 2, 6, 6}},\n\t{\"net.inet.tcp.drop\", []_C_int{4, 2, 6, 19}},\n\t{\"net.inet.tcp.ecn\", []_C_int{4, 2, 6, 14}},\n\t{\"net.inet.tcp.ident\", []_C_int{4, 2, 6, 9}},\n\t{\"net.inet.tcp.keepidle\", []_C_int{4, 2, 6, 3}},\n\t{\"net.inet.tcp.keepinittime\", []_C_int{4, 2, 6, 2}},\n\t{\"net.inet.tcp.keepintvl\", []_C_int{4, 2, 6, 4}},\n\t{\"net.inet.tcp.mssdflt\", []_C_int{4, 2, 6, 11}},\n\t{\"net.inet.tcp.reasslimit\", []_C_int{4, 2, 6, 18}},\n\t{\"net.inet.tcp.rfc1323\", []_C_int{4, 2, 6, 1}},\n\t{\"net.inet.tcp.rfc3390\", []_C_int{4, 2, 6, 17}},\n\t{\"net.inet.tcp.rstppslimit\", []_C_int{4, 2, 6, 12}},\n\t{\"net.inet.tcp.sack\", []_C_int{4, 2, 6, 10}},\n\t{\"net.inet.tcp.sackholelimit\", []_C_int{4, 2, 6, 20}},\n\t{\"net.inet.tcp.slowhz\", []_C_int{4, 2, 6, 5}},\n\t{\"net.inet.tcp.stats\", []_C_int{4, 2, 6, 21}},\n\t{\"net.inet.tcp.synbucketlimit\", []_C_int{4, 2, 6, 16}},\n\t{\"net.inet.tcp.syncachelimit\", []_C_int{4, 2, 6, 15}},\n\t{\"net.inet.udp.baddynamic\", []_C_int{4, 2, 17, 2}},\n\t{\"net.inet.udp.checksum\", []_C_int{4, 2, 17, 1}},\n\t{\"net.inet.udp.recvspace\", []_C_int{4, 2, 17, 3}},\n\t{\"net.inet.udp.sendspace\", []_C_int{4, 2, 17, 4}},\n\t{\"net.inet.udp.stats\", []_C_int{4, 2, 17, 5}},\n\t{\"net.inet6.divert.recvspace\", []_C_int{4, 24, 86, 1}},\n\t{\"net.inet6.divert.sendspace\", []_C_int{4, 24, 86, 2}},\n\t{\"net.inet6.divert.stats\", []_C_int{4, 24, 86, 3}},\n\t{\"net.inet6.icmp6.errppslimit\", []_C_int{4, 24, 30, 14}},\n\t{\"net.inet6.icmp6.mtudisc_hiwat\", []_C_int{4, 24, 30, 16}},\n\t{\"net.inet6.icmp6.mtudisc_lowat\", []_C_int{4, 24, 30, 17}},\n\t{\"net.inet6.icmp6.nd6_debug\", []_C_int{4, 24, 30, 18}},\n\t{\"net.inet6.icmp6.nd6_delay\", []_C_int{4, 24, 30, 8}},\n\t{\"net.inet6.icmp6.nd6_maxnudhint\", []_C_int{4, 24, 30, 15}},\n\t{\"net.inet6.icmp6.nd6_mmaxtries\", []_C_int{4, 24, 30, 10}},\n\t{\"net.inet6.icmp6.nd6_prune\", []_C_int{4, 24, 30, 6}},\n\t{\"net.inet6.icmp6.nd6_umaxtries\", []_C_int{4, 24, 30, 9}},\n\t{\"net.inet6.icmp6.nd6_useloopback\", []_C_int{4, 24, 30, 11}},\n\t{\"net.inet6.icmp6.nodeinfo\", []_C_int{4, 24, 30, 13}},\n\t{\"net.inet6.icmp6.rediraccept\", []_C_int{4, 24, 30, 2}},\n\t{\"net.inet6.icmp6.redirtimeout\", []_C_int{4, 24, 30, 3}},\n\t{\"net.inet6.ip6.accept_rtadv\", []_C_int{4, 24, 17, 12}},\n\t{\"net.inet6.ip6.auto_flowlabel\", []_C_int{4, 24, 17, 17}},\n\t{\"net.inet6.ip6.dad_count\", []_C_int{4, 24, 17, 16}},\n\t{\"net.inet6.ip6.dad_pending\", []_C_int{4, 24, 17, 49}},\n\t{\"net.inet6.ip6.defmcasthlim\", []_C_int{4, 24, 17, 18}},\n\t{\"net.inet6.ip6.forwarding\", []_C_int{4, 24, 17, 1}},\n\t{\"net.inet6.ip6.forwsrcrt\", []_C_int{4, 24, 17, 5}},\n\t{\"net.inet6.ip6.hdrnestlimit\", []_C_int{4, 24, 17, 15}},\n\t{\"net.inet6.ip6.hlim\", []_C_int{4, 24, 17, 3}},\n\t{\"net.inet6.ip6.log_interval\", []_C_int{4, 24, 17, 14}},\n\t{\"net.inet6.ip6.maxdynroutes\", []_C_int{4, 24, 17, 48}},\n\t{\"net.inet6.ip6.maxfragpackets\", []_C_int{4, 24, 17, 9}},\n\t{\"net.inet6.ip6.maxfrags\", []_C_int{4, 24, 17, 41}},\n\t{\"net.inet6.ip6.maxifdefrouters\", []_C_int{4, 24, 17, 47}},\n\t{\"net.inet6.ip6.maxifprefixes\", []_C_int{4, 24, 17, 46}},\n\t{\"net.inet6.ip6.mforwarding\", []_C_int{4, 24, 17, 42}},\n\t{\"net.inet6.ip6.mrtproto\", []_C_int{4, 24, 17, 8}},\n\t{\"net.inet6.ip6.mtudisctimeout\", []_C_int{4, 24, 17, 50}},\n\t{\"net.inet6.ip6.multicast_mtudisc\", []_C_int{4, 24, 17, 44}},\n\t{\"net.inet6.ip6.multipath\", []_C_int{4, 24, 17, 43}},\n\t{\"net.inet6.ip6.neighborgcthresh\", []_C_int{4, 24, 17, 45}},\n\t{\"net.inet6.ip6.redirect\", []_C_int{4, 24, 17, 2}},\n\t{\"net.inet6.ip6.rr_prune\", []_C_int{4, 24, 17, 22}},\n\t{\"net.inet6.ip6.sourcecheck\", []_C_int{4, 24, 17, 10}},\n\t{\"net.inet6.ip6.sourcecheck_logint\", []_C_int{4, 24, 17, 11}},\n\t{\"net.inet6.ip6.use_deprecated\", []_C_int{4, 24, 17, 21}},\n\t{\"net.inet6.ip6.v6only\", []_C_int{4, 24, 17, 24}},\n\t{\"net.key.sadb_dump\", []_C_int{4, 30, 1}},\n\t{\"net.key.spd_dump\", []_C_int{4, 30, 2}},\n\t{\"net.mpls.ifq.congestion\", []_C_int{4, 33, 3, 4}},\n\t{\"net.mpls.ifq.drops\", []_C_int{4, 33, 3, 3}},\n\t{\"net.mpls.ifq.len\", []_C_int{4, 33, 3, 1}},\n\t{\"net.mpls.ifq.maxlen\", []_C_int{4, 33, 3, 2}},\n\t{\"net.mpls.mapttl_ip\", []_C_int{4, 33, 5}},\n\t{\"net.mpls.mapttl_ip6\", []_C_int{4, 33, 6}},\n\t{\"net.mpls.maxloop_inkernel\", []_C_int{4, 33, 4}},\n\t{\"net.mpls.ttl\", []_C_int{4, 33, 2}},\n\t{\"net.pflow.stats\", []_C_int{4, 34, 1}},\n\t{\"net.pipex.enable\", []_C_int{4, 35, 1}},\n\t{\"vm.anonmin\", []_C_int{2, 7}},\n\t{\"vm.loadavg\", []_C_int{2, 2}},\n\t{\"vm.maxslp\", []_C_int{2, 10}},\n\t{\"vm.nkmempages\", []_C_int{2, 6}},\n\t{\"vm.psstrings\", []_C_int{2, 3}},\n\t{\"vm.swapencrypt.enable\", []_C_int{2, 5, 0}},\n\t{\"vm.swapencrypt.keyscreated\", []_C_int{2, 5, 1}},\n\t{\"vm.swapencrypt.keysdeleted\", []_C_int{2, 5, 2}},\n\t{\"vm.uspace\", []_C_int{2, 11}},\n\t{\"vm.uvmexp\", []_C_int{2, 4}},\n\t{\"vm.vmmeter\", []_C_int{2, 1}},\n\t{\"vm.vnodemin\", []_C_int{2, 9}},\n\t{\"vm.vtextmin\", []_C_int{2, 8}},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go",
    "content": "// mksysctl_openbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\npackage unix\n\ntype mibentry struct {\n\tctlname string\n\tctloid  []_C_int\n}\n\nvar sysctlMib = []mibentry{\n\t{\"ddb.console\", []_C_int{9, 6}},\n\t{\"ddb.log\", []_C_int{9, 7}},\n\t{\"ddb.max_line\", []_C_int{9, 3}},\n\t{\"ddb.max_width\", []_C_int{9, 2}},\n\t{\"ddb.panic\", []_C_int{9, 5}},\n\t{\"ddb.radix\", []_C_int{9, 1}},\n\t{\"ddb.tab_stop_width\", []_C_int{9, 4}},\n\t{\"ddb.trigger\", []_C_int{9, 8}},\n\t{\"fs.posix.setuid\", []_C_int{3, 1, 1}},\n\t{\"hw.allowpowerdown\", []_C_int{6, 22}},\n\t{\"hw.byteorder\", []_C_int{6, 4}},\n\t{\"hw.cpuspeed\", []_C_int{6, 12}},\n\t{\"hw.diskcount\", []_C_int{6, 10}},\n\t{\"hw.disknames\", []_C_int{6, 8}},\n\t{\"hw.diskstats\", []_C_int{6, 9}},\n\t{\"hw.machine\", []_C_int{6, 1}},\n\t{\"hw.model\", []_C_int{6, 2}},\n\t{\"hw.ncpu\", []_C_int{6, 3}},\n\t{\"hw.ncpufound\", []_C_int{6, 21}},\n\t{\"hw.pagesize\", []_C_int{6, 7}},\n\t{\"hw.physmem\", []_C_int{6, 19}},\n\t{\"hw.product\", []_C_int{6, 15}},\n\t{\"hw.serialno\", []_C_int{6, 17}},\n\t{\"hw.setperf\", []_C_int{6, 13}},\n\t{\"hw.usermem\", []_C_int{6, 20}},\n\t{\"hw.uuid\", []_C_int{6, 18}},\n\t{\"hw.vendor\", []_C_int{6, 14}},\n\t{\"hw.version\", []_C_int{6, 16}},\n\t{\"kern.arandom\", []_C_int{1, 37}},\n\t{\"kern.argmax\", []_C_int{1, 8}},\n\t{\"kern.boottime\", []_C_int{1, 21}},\n\t{\"kern.bufcachepercent\", []_C_int{1, 72}},\n\t{\"kern.ccpu\", []_C_int{1, 45}},\n\t{\"kern.clockrate\", []_C_int{1, 12}},\n\t{\"kern.consdev\", []_C_int{1, 75}},\n\t{\"kern.cp_time\", []_C_int{1, 40}},\n\t{\"kern.cp_time2\", []_C_int{1, 71}},\n\t{\"kern.cryptodevallowsoft\", []_C_int{1, 53}},\n\t{\"kern.domainname\", []_C_int{1, 22}},\n\t{\"kern.file\", []_C_int{1, 73}},\n\t{\"kern.forkstat\", []_C_int{1, 42}},\n\t{\"kern.fscale\", []_C_int{1, 46}},\n\t{\"kern.fsync\", []_C_int{1, 33}},\n\t{\"kern.hostid\", []_C_int{1, 11}},\n\t{\"kern.hostname\", []_C_int{1, 10}},\n\t{\"kern.intrcnt.nintrcnt\", []_C_int{1, 63, 1}},\n\t{\"kern.job_control\", []_C_int{1, 19}},\n\t{\"kern.malloc.buckets\", []_C_int{1, 39, 1}},\n\t{\"kern.malloc.kmemnames\", []_C_int{1, 39, 3}},\n\t{\"kern.maxclusters\", []_C_int{1, 67}},\n\t{\"kern.maxfiles\", []_C_int{1, 7}},\n\t{\"kern.maxlocksperuid\", []_C_int{1, 70}},\n\t{\"kern.maxpartitions\", []_C_int{1, 23}},\n\t{\"kern.maxproc\", []_C_int{1, 6}},\n\t{\"kern.maxthread\", []_C_int{1, 25}},\n\t{\"kern.maxvnodes\", []_C_int{1, 5}},\n\t{\"kern.mbstat\", []_C_int{1, 59}},\n\t{\"kern.msgbuf\", []_C_int{1, 48}},\n\t{\"kern.msgbufsize\", []_C_int{1, 38}},\n\t{\"kern.nchstats\", []_C_int{1, 41}},\n\t{\"kern.netlivelocks\", []_C_int{1, 76}},\n\t{\"kern.nfiles\", []_C_int{1, 56}},\n\t{\"kern.ngroups\", []_C_int{1, 18}},\n\t{\"kern.nosuidcoredump\", []_C_int{1, 32}},\n\t{\"kern.nprocs\", []_C_int{1, 47}},\n\t{\"kern.nselcoll\", []_C_int{1, 43}},\n\t{\"kern.nthreads\", []_C_int{1, 26}},\n\t{\"kern.numvnodes\", []_C_int{1, 58}},\n\t{\"kern.osrelease\", []_C_int{1, 2}},\n\t{\"kern.osrevision\", []_C_int{1, 3}},\n\t{\"kern.ostype\", []_C_int{1, 1}},\n\t{\"kern.osversion\", []_C_int{1, 27}},\n\t{\"kern.pool_debug\", []_C_int{1, 77}},\n\t{\"kern.posix1version\", []_C_int{1, 17}},\n\t{\"kern.proc\", []_C_int{1, 66}},\n\t{\"kern.random\", []_C_int{1, 31}},\n\t{\"kern.rawpartition\", []_C_int{1, 24}},\n\t{\"kern.saved_ids\", []_C_int{1, 20}},\n\t{\"kern.securelevel\", []_C_int{1, 9}},\n\t{\"kern.seminfo\", []_C_int{1, 61}},\n\t{\"kern.shminfo\", []_C_int{1, 62}},\n\t{\"kern.somaxconn\", []_C_int{1, 28}},\n\t{\"kern.sominconn\", []_C_int{1, 29}},\n\t{\"kern.splassert\", []_C_int{1, 54}},\n\t{\"kern.stackgap_random\", []_C_int{1, 50}},\n\t{\"kern.sysvipc_info\", []_C_int{1, 51}},\n\t{\"kern.sysvmsg\", []_C_int{1, 34}},\n\t{\"kern.sysvsem\", []_C_int{1, 35}},\n\t{\"kern.sysvshm\", []_C_int{1, 36}},\n\t{\"kern.timecounter.choice\", []_C_int{1, 69, 4}},\n\t{\"kern.timecounter.hardware\", []_C_int{1, 69, 3}},\n\t{\"kern.timecounter.tick\", []_C_int{1, 69, 1}},\n\t{\"kern.timecounter.timestepwarnings\", []_C_int{1, 69, 2}},\n\t{\"kern.tty.maxptys\", []_C_int{1, 44, 6}},\n\t{\"kern.tty.nptys\", []_C_int{1, 44, 7}},\n\t{\"kern.tty.tk_cancc\", []_C_int{1, 44, 4}},\n\t{\"kern.tty.tk_nin\", []_C_int{1, 44, 1}},\n\t{\"kern.tty.tk_nout\", []_C_int{1, 44, 2}},\n\t{\"kern.tty.tk_rawcc\", []_C_int{1, 44, 3}},\n\t{\"kern.tty.ttyinfo\", []_C_int{1, 44, 5}},\n\t{\"kern.ttycount\", []_C_int{1, 57}},\n\t{\"kern.userasymcrypto\", []_C_int{1, 60}},\n\t{\"kern.usercrypto\", []_C_int{1, 52}},\n\t{\"kern.usermount\", []_C_int{1, 30}},\n\t{\"kern.version\", []_C_int{1, 4}},\n\t{\"kern.vnode\", []_C_int{1, 13}},\n\t{\"kern.watchdog.auto\", []_C_int{1, 64, 2}},\n\t{\"kern.watchdog.period\", []_C_int{1, 64, 1}},\n\t{\"net.bpf.bufsize\", []_C_int{4, 31, 1}},\n\t{\"net.bpf.maxbufsize\", []_C_int{4, 31, 2}},\n\t{\"net.inet.ah.enable\", []_C_int{4, 2, 51, 1}},\n\t{\"net.inet.ah.stats\", []_C_int{4, 2, 51, 2}},\n\t{\"net.inet.carp.allow\", []_C_int{4, 2, 112, 1}},\n\t{\"net.inet.carp.log\", []_C_int{4, 2, 112, 3}},\n\t{\"net.inet.carp.preempt\", []_C_int{4, 2, 112, 2}},\n\t{\"net.inet.carp.stats\", []_C_int{4, 2, 112, 4}},\n\t{\"net.inet.divert.recvspace\", []_C_int{4, 2, 258, 1}},\n\t{\"net.inet.divert.sendspace\", []_C_int{4, 2, 258, 2}},\n\t{\"net.inet.divert.stats\", []_C_int{4, 2, 258, 3}},\n\t{\"net.inet.esp.enable\", []_C_int{4, 2, 50, 1}},\n\t{\"net.inet.esp.stats\", []_C_int{4, 2, 50, 4}},\n\t{\"net.inet.esp.udpencap\", []_C_int{4, 2, 50, 2}},\n\t{\"net.inet.esp.udpencap_port\", []_C_int{4, 2, 50, 3}},\n\t{\"net.inet.etherip.allow\", []_C_int{4, 2, 97, 1}},\n\t{\"net.inet.etherip.stats\", []_C_int{4, 2, 97, 2}},\n\t{\"net.inet.gre.allow\", []_C_int{4, 2, 47, 1}},\n\t{\"net.inet.gre.wccp\", []_C_int{4, 2, 47, 2}},\n\t{\"net.inet.icmp.bmcastecho\", []_C_int{4, 2, 1, 2}},\n\t{\"net.inet.icmp.errppslimit\", []_C_int{4, 2, 1, 3}},\n\t{\"net.inet.icmp.maskrepl\", []_C_int{4, 2, 1, 1}},\n\t{\"net.inet.icmp.rediraccept\", []_C_int{4, 2, 1, 4}},\n\t{\"net.inet.icmp.redirtimeout\", []_C_int{4, 2, 1, 5}},\n\t{\"net.inet.icmp.stats\", []_C_int{4, 2, 1, 7}},\n\t{\"net.inet.icmp.tstamprepl\", []_C_int{4, 2, 1, 6}},\n\t{\"net.inet.igmp.stats\", []_C_int{4, 2, 2, 1}},\n\t{\"net.inet.ip.arpqueued\", []_C_int{4, 2, 0, 36}},\n\t{\"net.inet.ip.encdebug\", []_C_int{4, 2, 0, 12}},\n\t{\"net.inet.ip.forwarding\", []_C_int{4, 2, 0, 1}},\n\t{\"net.inet.ip.ifq.congestion\", []_C_int{4, 2, 0, 30, 4}},\n\t{\"net.inet.ip.ifq.drops\", []_C_int{4, 2, 0, 30, 3}},\n\t{\"net.inet.ip.ifq.len\", []_C_int{4, 2, 0, 30, 1}},\n\t{\"net.inet.ip.ifq.maxlen\", []_C_int{4, 2, 0, 30, 2}},\n\t{\"net.inet.ip.maxqueue\", []_C_int{4, 2, 0, 11}},\n\t{\"net.inet.ip.mforwarding\", []_C_int{4, 2, 0, 31}},\n\t{\"net.inet.ip.mrtproto\", []_C_int{4, 2, 0, 34}},\n\t{\"net.inet.ip.mrtstats\", []_C_int{4, 2, 0, 35}},\n\t{\"net.inet.ip.mtu\", []_C_int{4, 2, 0, 4}},\n\t{\"net.inet.ip.mtudisc\", []_C_int{4, 2, 0, 27}},\n\t{\"net.inet.ip.mtudisctimeout\", []_C_int{4, 2, 0, 28}},\n\t{\"net.inet.ip.multipath\", []_C_int{4, 2, 0, 32}},\n\t{\"net.inet.ip.portfirst\", []_C_int{4, 2, 0, 7}},\n\t{\"net.inet.ip.porthifirst\", []_C_int{4, 2, 0, 9}},\n\t{\"net.inet.ip.porthilast\", []_C_int{4, 2, 0, 10}},\n\t{\"net.inet.ip.portlast\", []_C_int{4, 2, 0, 8}},\n\t{\"net.inet.ip.redirect\", []_C_int{4, 2, 0, 2}},\n\t{\"net.inet.ip.sourceroute\", []_C_int{4, 2, 0, 5}},\n\t{\"net.inet.ip.stats\", []_C_int{4, 2, 0, 33}},\n\t{\"net.inet.ip.ttl\", []_C_int{4, 2, 0, 3}},\n\t{\"net.inet.ipcomp.enable\", []_C_int{4, 2, 108, 1}},\n\t{\"net.inet.ipcomp.stats\", []_C_int{4, 2, 108, 2}},\n\t{\"net.inet.ipip.allow\", []_C_int{4, 2, 4, 1}},\n\t{\"net.inet.ipip.stats\", []_C_int{4, 2, 4, 2}},\n\t{\"net.inet.mobileip.allow\", []_C_int{4, 2, 55, 1}},\n\t{\"net.inet.pfsync.stats\", []_C_int{4, 2, 240, 1}},\n\t{\"net.inet.pim.stats\", []_C_int{4, 2, 103, 1}},\n\t{\"net.inet.tcp.ackonpush\", []_C_int{4, 2, 6, 13}},\n\t{\"net.inet.tcp.always_keepalive\", []_C_int{4, 2, 6, 22}},\n\t{\"net.inet.tcp.baddynamic\", []_C_int{4, 2, 6, 6}},\n\t{\"net.inet.tcp.drop\", []_C_int{4, 2, 6, 19}},\n\t{\"net.inet.tcp.ecn\", []_C_int{4, 2, 6, 14}},\n\t{\"net.inet.tcp.ident\", []_C_int{4, 2, 6, 9}},\n\t{\"net.inet.tcp.keepidle\", []_C_int{4, 2, 6, 3}},\n\t{\"net.inet.tcp.keepinittime\", []_C_int{4, 2, 6, 2}},\n\t{\"net.inet.tcp.keepintvl\", []_C_int{4, 2, 6, 4}},\n\t{\"net.inet.tcp.mssdflt\", []_C_int{4, 2, 6, 11}},\n\t{\"net.inet.tcp.reasslimit\", []_C_int{4, 2, 6, 18}},\n\t{\"net.inet.tcp.rfc1323\", []_C_int{4, 2, 6, 1}},\n\t{\"net.inet.tcp.rfc3390\", []_C_int{4, 2, 6, 17}},\n\t{\"net.inet.tcp.rstppslimit\", []_C_int{4, 2, 6, 12}},\n\t{\"net.inet.tcp.sack\", []_C_int{4, 2, 6, 10}},\n\t{\"net.inet.tcp.sackholelimit\", []_C_int{4, 2, 6, 20}},\n\t{\"net.inet.tcp.slowhz\", []_C_int{4, 2, 6, 5}},\n\t{\"net.inet.tcp.stats\", []_C_int{4, 2, 6, 21}},\n\t{\"net.inet.tcp.synbucketlimit\", []_C_int{4, 2, 6, 16}},\n\t{\"net.inet.tcp.syncachelimit\", []_C_int{4, 2, 6, 15}},\n\t{\"net.inet.udp.baddynamic\", []_C_int{4, 2, 17, 2}},\n\t{\"net.inet.udp.checksum\", []_C_int{4, 2, 17, 1}},\n\t{\"net.inet.udp.recvspace\", []_C_int{4, 2, 17, 3}},\n\t{\"net.inet.udp.sendspace\", []_C_int{4, 2, 17, 4}},\n\t{\"net.inet.udp.stats\", []_C_int{4, 2, 17, 5}},\n\t{\"net.inet6.divert.recvspace\", []_C_int{4, 24, 86, 1}},\n\t{\"net.inet6.divert.sendspace\", []_C_int{4, 24, 86, 2}},\n\t{\"net.inet6.divert.stats\", []_C_int{4, 24, 86, 3}},\n\t{\"net.inet6.icmp6.errppslimit\", []_C_int{4, 24, 30, 14}},\n\t{\"net.inet6.icmp6.mtudisc_hiwat\", []_C_int{4, 24, 30, 16}},\n\t{\"net.inet6.icmp6.mtudisc_lowat\", []_C_int{4, 24, 30, 17}},\n\t{\"net.inet6.icmp6.nd6_debug\", []_C_int{4, 24, 30, 18}},\n\t{\"net.inet6.icmp6.nd6_delay\", []_C_int{4, 24, 30, 8}},\n\t{\"net.inet6.icmp6.nd6_maxnudhint\", []_C_int{4, 24, 30, 15}},\n\t{\"net.inet6.icmp6.nd6_mmaxtries\", []_C_int{4, 24, 30, 10}},\n\t{\"net.inet6.icmp6.nd6_prune\", []_C_int{4, 24, 30, 6}},\n\t{\"net.inet6.icmp6.nd6_umaxtries\", []_C_int{4, 24, 30, 9}},\n\t{\"net.inet6.icmp6.nd6_useloopback\", []_C_int{4, 24, 30, 11}},\n\t{\"net.inet6.icmp6.nodeinfo\", []_C_int{4, 24, 30, 13}},\n\t{\"net.inet6.icmp6.rediraccept\", []_C_int{4, 24, 30, 2}},\n\t{\"net.inet6.icmp6.redirtimeout\", []_C_int{4, 24, 30, 3}},\n\t{\"net.inet6.ip6.accept_rtadv\", []_C_int{4, 24, 17, 12}},\n\t{\"net.inet6.ip6.auto_flowlabel\", []_C_int{4, 24, 17, 17}},\n\t{\"net.inet6.ip6.dad_count\", []_C_int{4, 24, 17, 16}},\n\t{\"net.inet6.ip6.dad_pending\", []_C_int{4, 24, 17, 49}},\n\t{\"net.inet6.ip6.defmcasthlim\", []_C_int{4, 24, 17, 18}},\n\t{\"net.inet6.ip6.forwarding\", []_C_int{4, 24, 17, 1}},\n\t{\"net.inet6.ip6.forwsrcrt\", []_C_int{4, 24, 17, 5}},\n\t{\"net.inet6.ip6.hdrnestlimit\", []_C_int{4, 24, 17, 15}},\n\t{\"net.inet6.ip6.hlim\", []_C_int{4, 24, 17, 3}},\n\t{\"net.inet6.ip6.log_interval\", []_C_int{4, 24, 17, 14}},\n\t{\"net.inet6.ip6.maxdynroutes\", []_C_int{4, 24, 17, 48}},\n\t{\"net.inet6.ip6.maxfragpackets\", []_C_int{4, 24, 17, 9}},\n\t{\"net.inet6.ip6.maxfrags\", []_C_int{4, 24, 17, 41}},\n\t{\"net.inet6.ip6.maxifdefrouters\", []_C_int{4, 24, 17, 47}},\n\t{\"net.inet6.ip6.maxifprefixes\", []_C_int{4, 24, 17, 46}},\n\t{\"net.inet6.ip6.mforwarding\", []_C_int{4, 24, 17, 42}},\n\t{\"net.inet6.ip6.mrtproto\", []_C_int{4, 24, 17, 8}},\n\t{\"net.inet6.ip6.mtudisctimeout\", []_C_int{4, 24, 17, 50}},\n\t{\"net.inet6.ip6.multicast_mtudisc\", []_C_int{4, 24, 17, 44}},\n\t{\"net.inet6.ip6.multipath\", []_C_int{4, 24, 17, 43}},\n\t{\"net.inet6.ip6.neighborgcthresh\", []_C_int{4, 24, 17, 45}},\n\t{\"net.inet6.ip6.redirect\", []_C_int{4, 24, 17, 2}},\n\t{\"net.inet6.ip6.rr_prune\", []_C_int{4, 24, 17, 22}},\n\t{\"net.inet6.ip6.sourcecheck\", []_C_int{4, 24, 17, 10}},\n\t{\"net.inet6.ip6.sourcecheck_logint\", []_C_int{4, 24, 17, 11}},\n\t{\"net.inet6.ip6.use_deprecated\", []_C_int{4, 24, 17, 21}},\n\t{\"net.inet6.ip6.v6only\", []_C_int{4, 24, 17, 24}},\n\t{\"net.key.sadb_dump\", []_C_int{4, 30, 1}},\n\t{\"net.key.spd_dump\", []_C_int{4, 30, 2}},\n\t{\"net.mpls.ifq.congestion\", []_C_int{4, 33, 3, 4}},\n\t{\"net.mpls.ifq.drops\", []_C_int{4, 33, 3, 3}},\n\t{\"net.mpls.ifq.len\", []_C_int{4, 33, 3, 1}},\n\t{\"net.mpls.ifq.maxlen\", []_C_int{4, 33, 3, 2}},\n\t{\"net.mpls.mapttl_ip\", []_C_int{4, 33, 5}},\n\t{\"net.mpls.mapttl_ip6\", []_C_int{4, 33, 6}},\n\t{\"net.mpls.maxloop_inkernel\", []_C_int{4, 33, 4}},\n\t{\"net.mpls.ttl\", []_C_int{4, 33, 2}},\n\t{\"net.pflow.stats\", []_C_int{4, 34, 1}},\n\t{\"net.pipex.enable\", []_C_int{4, 35, 1}},\n\t{\"vm.anonmin\", []_C_int{2, 7}},\n\t{\"vm.loadavg\", []_C_int{2, 2}},\n\t{\"vm.maxslp\", []_C_int{2, 10}},\n\t{\"vm.nkmempages\", []_C_int{2, 6}},\n\t{\"vm.psstrings\", []_C_int{2, 3}},\n\t{\"vm.swapencrypt.enable\", []_C_int{2, 5, 0}},\n\t{\"vm.swapencrypt.keyscreated\", []_C_int{2, 5, 1}},\n\t{\"vm.swapencrypt.keysdeleted\", []_C_int{2, 5, 2}},\n\t{\"vm.uspace\", []_C_int{2, 11}},\n\t{\"vm.uvmexp\", []_C_int{2, 4}},\n\t{\"vm.vmmeter\", []_C_int{2, 1}},\n\t{\"vm.vnodemin\", []_C_int{2, 9}},\n\t{\"vm.vtextmin\", []_C_int{2, 8}},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go",
    "content": "// mksysctl_openbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\npackage unix\n\ntype mibentry struct {\n\tctlname string\n\tctloid  []_C_int\n}\n\nvar sysctlMib = []mibentry{\n\t{\"ddb.console\", []_C_int{9, 6}},\n\t{\"ddb.log\", []_C_int{9, 7}},\n\t{\"ddb.max_line\", []_C_int{9, 3}},\n\t{\"ddb.max_width\", []_C_int{9, 2}},\n\t{\"ddb.panic\", []_C_int{9, 5}},\n\t{\"ddb.radix\", []_C_int{9, 1}},\n\t{\"ddb.tab_stop_width\", []_C_int{9, 4}},\n\t{\"ddb.trigger\", []_C_int{9, 8}},\n\t{\"fs.posix.setuid\", []_C_int{3, 1, 1}},\n\t{\"hw.allowpowerdown\", []_C_int{6, 22}},\n\t{\"hw.byteorder\", []_C_int{6, 4}},\n\t{\"hw.cpuspeed\", []_C_int{6, 12}},\n\t{\"hw.diskcount\", []_C_int{6, 10}},\n\t{\"hw.disknames\", []_C_int{6, 8}},\n\t{\"hw.diskstats\", []_C_int{6, 9}},\n\t{\"hw.machine\", []_C_int{6, 1}},\n\t{\"hw.model\", []_C_int{6, 2}},\n\t{\"hw.ncpu\", []_C_int{6, 3}},\n\t{\"hw.ncpufound\", []_C_int{6, 21}},\n\t{\"hw.pagesize\", []_C_int{6, 7}},\n\t{\"hw.physmem\", []_C_int{6, 19}},\n\t{\"hw.product\", []_C_int{6, 15}},\n\t{\"hw.serialno\", []_C_int{6, 17}},\n\t{\"hw.setperf\", []_C_int{6, 13}},\n\t{\"hw.usermem\", []_C_int{6, 20}},\n\t{\"hw.uuid\", []_C_int{6, 18}},\n\t{\"hw.vendor\", []_C_int{6, 14}},\n\t{\"hw.version\", []_C_int{6, 16}},\n\t{\"kern.arandom\", []_C_int{1, 37}},\n\t{\"kern.argmax\", []_C_int{1, 8}},\n\t{\"kern.boottime\", []_C_int{1, 21}},\n\t{\"kern.bufcachepercent\", []_C_int{1, 72}},\n\t{\"kern.ccpu\", []_C_int{1, 45}},\n\t{\"kern.clockrate\", []_C_int{1, 12}},\n\t{\"kern.consdev\", []_C_int{1, 75}},\n\t{\"kern.cp_time\", []_C_int{1, 40}},\n\t{\"kern.cp_time2\", []_C_int{1, 71}},\n\t{\"kern.cryptodevallowsoft\", []_C_int{1, 53}},\n\t{\"kern.domainname\", []_C_int{1, 22}},\n\t{\"kern.file\", []_C_int{1, 73}},\n\t{\"kern.forkstat\", []_C_int{1, 42}},\n\t{\"kern.fscale\", []_C_int{1, 46}},\n\t{\"kern.fsync\", []_C_int{1, 33}},\n\t{\"kern.hostid\", []_C_int{1, 11}},\n\t{\"kern.hostname\", []_C_int{1, 10}},\n\t{\"kern.intrcnt.nintrcnt\", []_C_int{1, 63, 1}},\n\t{\"kern.job_control\", []_C_int{1, 19}},\n\t{\"kern.malloc.buckets\", []_C_int{1, 39, 1}},\n\t{\"kern.malloc.kmemnames\", []_C_int{1, 39, 3}},\n\t{\"kern.maxclusters\", []_C_int{1, 67}},\n\t{\"kern.maxfiles\", []_C_int{1, 7}},\n\t{\"kern.maxlocksperuid\", []_C_int{1, 70}},\n\t{\"kern.maxpartitions\", []_C_int{1, 23}},\n\t{\"kern.maxproc\", []_C_int{1, 6}},\n\t{\"kern.maxthread\", []_C_int{1, 25}},\n\t{\"kern.maxvnodes\", []_C_int{1, 5}},\n\t{\"kern.mbstat\", []_C_int{1, 59}},\n\t{\"kern.msgbuf\", []_C_int{1, 48}},\n\t{\"kern.msgbufsize\", []_C_int{1, 38}},\n\t{\"kern.nchstats\", []_C_int{1, 41}},\n\t{\"kern.netlivelocks\", []_C_int{1, 76}},\n\t{\"kern.nfiles\", []_C_int{1, 56}},\n\t{\"kern.ngroups\", []_C_int{1, 18}},\n\t{\"kern.nosuidcoredump\", []_C_int{1, 32}},\n\t{\"kern.nprocs\", []_C_int{1, 47}},\n\t{\"kern.nselcoll\", []_C_int{1, 43}},\n\t{\"kern.nthreads\", []_C_int{1, 26}},\n\t{\"kern.numvnodes\", []_C_int{1, 58}},\n\t{\"kern.osrelease\", []_C_int{1, 2}},\n\t{\"kern.osrevision\", []_C_int{1, 3}},\n\t{\"kern.ostype\", []_C_int{1, 1}},\n\t{\"kern.osversion\", []_C_int{1, 27}},\n\t{\"kern.pool_debug\", []_C_int{1, 77}},\n\t{\"kern.posix1version\", []_C_int{1, 17}},\n\t{\"kern.proc\", []_C_int{1, 66}},\n\t{\"kern.random\", []_C_int{1, 31}},\n\t{\"kern.rawpartition\", []_C_int{1, 24}},\n\t{\"kern.saved_ids\", []_C_int{1, 20}},\n\t{\"kern.securelevel\", []_C_int{1, 9}},\n\t{\"kern.seminfo\", []_C_int{1, 61}},\n\t{\"kern.shminfo\", []_C_int{1, 62}},\n\t{\"kern.somaxconn\", []_C_int{1, 28}},\n\t{\"kern.sominconn\", []_C_int{1, 29}},\n\t{\"kern.splassert\", []_C_int{1, 54}},\n\t{\"kern.stackgap_random\", []_C_int{1, 50}},\n\t{\"kern.sysvipc_info\", []_C_int{1, 51}},\n\t{\"kern.sysvmsg\", []_C_int{1, 34}},\n\t{\"kern.sysvsem\", []_C_int{1, 35}},\n\t{\"kern.sysvshm\", []_C_int{1, 36}},\n\t{\"kern.timecounter.choice\", []_C_int{1, 69, 4}},\n\t{\"kern.timecounter.hardware\", []_C_int{1, 69, 3}},\n\t{\"kern.timecounter.tick\", []_C_int{1, 69, 1}},\n\t{\"kern.timecounter.timestepwarnings\", []_C_int{1, 69, 2}},\n\t{\"kern.tty.maxptys\", []_C_int{1, 44, 6}},\n\t{\"kern.tty.nptys\", []_C_int{1, 44, 7}},\n\t{\"kern.tty.tk_cancc\", []_C_int{1, 44, 4}},\n\t{\"kern.tty.tk_nin\", []_C_int{1, 44, 1}},\n\t{\"kern.tty.tk_nout\", []_C_int{1, 44, 2}},\n\t{\"kern.tty.tk_rawcc\", []_C_int{1, 44, 3}},\n\t{\"kern.tty.ttyinfo\", []_C_int{1, 44, 5}},\n\t{\"kern.ttycount\", []_C_int{1, 57}},\n\t{\"kern.userasymcrypto\", []_C_int{1, 60}},\n\t{\"kern.usercrypto\", []_C_int{1, 52}},\n\t{\"kern.usermount\", []_C_int{1, 30}},\n\t{\"kern.version\", []_C_int{1, 4}},\n\t{\"kern.vnode\", []_C_int{1, 13}},\n\t{\"kern.watchdog.auto\", []_C_int{1, 64, 2}},\n\t{\"kern.watchdog.period\", []_C_int{1, 64, 1}},\n\t{\"net.bpf.bufsize\", []_C_int{4, 31, 1}},\n\t{\"net.bpf.maxbufsize\", []_C_int{4, 31, 2}},\n\t{\"net.inet.ah.enable\", []_C_int{4, 2, 51, 1}},\n\t{\"net.inet.ah.stats\", []_C_int{4, 2, 51, 2}},\n\t{\"net.inet.carp.allow\", []_C_int{4, 2, 112, 1}},\n\t{\"net.inet.carp.log\", []_C_int{4, 2, 112, 3}},\n\t{\"net.inet.carp.preempt\", []_C_int{4, 2, 112, 2}},\n\t{\"net.inet.carp.stats\", []_C_int{4, 2, 112, 4}},\n\t{\"net.inet.divert.recvspace\", []_C_int{4, 2, 258, 1}},\n\t{\"net.inet.divert.sendspace\", []_C_int{4, 2, 258, 2}},\n\t{\"net.inet.divert.stats\", []_C_int{4, 2, 258, 3}},\n\t{\"net.inet.esp.enable\", []_C_int{4, 2, 50, 1}},\n\t{\"net.inet.esp.stats\", []_C_int{4, 2, 50, 4}},\n\t{\"net.inet.esp.udpencap\", []_C_int{4, 2, 50, 2}},\n\t{\"net.inet.esp.udpencap_port\", []_C_int{4, 2, 50, 3}},\n\t{\"net.inet.etherip.allow\", []_C_int{4, 2, 97, 1}},\n\t{\"net.inet.etherip.stats\", []_C_int{4, 2, 97, 2}},\n\t{\"net.inet.gre.allow\", []_C_int{4, 2, 47, 1}},\n\t{\"net.inet.gre.wccp\", []_C_int{4, 2, 47, 2}},\n\t{\"net.inet.icmp.bmcastecho\", []_C_int{4, 2, 1, 2}},\n\t{\"net.inet.icmp.errppslimit\", []_C_int{4, 2, 1, 3}},\n\t{\"net.inet.icmp.maskrepl\", []_C_int{4, 2, 1, 1}},\n\t{\"net.inet.icmp.rediraccept\", []_C_int{4, 2, 1, 4}},\n\t{\"net.inet.icmp.redirtimeout\", []_C_int{4, 2, 1, 5}},\n\t{\"net.inet.icmp.stats\", []_C_int{4, 2, 1, 7}},\n\t{\"net.inet.icmp.tstamprepl\", []_C_int{4, 2, 1, 6}},\n\t{\"net.inet.igmp.stats\", []_C_int{4, 2, 2, 1}},\n\t{\"net.inet.ip.arpqueued\", []_C_int{4, 2, 0, 36}},\n\t{\"net.inet.ip.encdebug\", []_C_int{4, 2, 0, 12}},\n\t{\"net.inet.ip.forwarding\", []_C_int{4, 2, 0, 1}},\n\t{\"net.inet.ip.ifq.congestion\", []_C_int{4, 2, 0, 30, 4}},\n\t{\"net.inet.ip.ifq.drops\", []_C_int{4, 2, 0, 30, 3}},\n\t{\"net.inet.ip.ifq.len\", []_C_int{4, 2, 0, 30, 1}},\n\t{\"net.inet.ip.ifq.maxlen\", []_C_int{4, 2, 0, 30, 2}},\n\t{\"net.inet.ip.maxqueue\", []_C_int{4, 2, 0, 11}},\n\t{\"net.inet.ip.mforwarding\", []_C_int{4, 2, 0, 31}},\n\t{\"net.inet.ip.mrtproto\", []_C_int{4, 2, 0, 34}},\n\t{\"net.inet.ip.mrtstats\", []_C_int{4, 2, 0, 35}},\n\t{\"net.inet.ip.mtu\", []_C_int{4, 2, 0, 4}},\n\t{\"net.inet.ip.mtudisc\", []_C_int{4, 2, 0, 27}},\n\t{\"net.inet.ip.mtudisctimeout\", []_C_int{4, 2, 0, 28}},\n\t{\"net.inet.ip.multipath\", []_C_int{4, 2, 0, 32}},\n\t{\"net.inet.ip.portfirst\", []_C_int{4, 2, 0, 7}},\n\t{\"net.inet.ip.porthifirst\", []_C_int{4, 2, 0, 9}},\n\t{\"net.inet.ip.porthilast\", []_C_int{4, 2, 0, 10}},\n\t{\"net.inet.ip.portlast\", []_C_int{4, 2, 0, 8}},\n\t{\"net.inet.ip.redirect\", []_C_int{4, 2, 0, 2}},\n\t{\"net.inet.ip.sourceroute\", []_C_int{4, 2, 0, 5}},\n\t{\"net.inet.ip.stats\", []_C_int{4, 2, 0, 33}},\n\t{\"net.inet.ip.ttl\", []_C_int{4, 2, 0, 3}},\n\t{\"net.inet.ipcomp.enable\", []_C_int{4, 2, 108, 1}},\n\t{\"net.inet.ipcomp.stats\", []_C_int{4, 2, 108, 2}},\n\t{\"net.inet.ipip.allow\", []_C_int{4, 2, 4, 1}},\n\t{\"net.inet.ipip.stats\", []_C_int{4, 2, 4, 2}},\n\t{\"net.inet.mobileip.allow\", []_C_int{4, 2, 55, 1}},\n\t{\"net.inet.pfsync.stats\", []_C_int{4, 2, 240, 1}},\n\t{\"net.inet.pim.stats\", []_C_int{4, 2, 103, 1}},\n\t{\"net.inet.tcp.ackonpush\", []_C_int{4, 2, 6, 13}},\n\t{\"net.inet.tcp.always_keepalive\", []_C_int{4, 2, 6, 22}},\n\t{\"net.inet.tcp.baddynamic\", []_C_int{4, 2, 6, 6}},\n\t{\"net.inet.tcp.drop\", []_C_int{4, 2, 6, 19}},\n\t{\"net.inet.tcp.ecn\", []_C_int{4, 2, 6, 14}},\n\t{\"net.inet.tcp.ident\", []_C_int{4, 2, 6, 9}},\n\t{\"net.inet.tcp.keepidle\", []_C_int{4, 2, 6, 3}},\n\t{\"net.inet.tcp.keepinittime\", []_C_int{4, 2, 6, 2}},\n\t{\"net.inet.tcp.keepintvl\", []_C_int{4, 2, 6, 4}},\n\t{\"net.inet.tcp.mssdflt\", []_C_int{4, 2, 6, 11}},\n\t{\"net.inet.tcp.reasslimit\", []_C_int{4, 2, 6, 18}},\n\t{\"net.inet.tcp.rfc1323\", []_C_int{4, 2, 6, 1}},\n\t{\"net.inet.tcp.rfc3390\", []_C_int{4, 2, 6, 17}},\n\t{\"net.inet.tcp.rstppslimit\", []_C_int{4, 2, 6, 12}},\n\t{\"net.inet.tcp.sack\", []_C_int{4, 2, 6, 10}},\n\t{\"net.inet.tcp.sackholelimit\", []_C_int{4, 2, 6, 20}},\n\t{\"net.inet.tcp.slowhz\", []_C_int{4, 2, 6, 5}},\n\t{\"net.inet.tcp.stats\", []_C_int{4, 2, 6, 21}},\n\t{\"net.inet.tcp.synbucketlimit\", []_C_int{4, 2, 6, 16}},\n\t{\"net.inet.tcp.syncachelimit\", []_C_int{4, 2, 6, 15}},\n\t{\"net.inet.udp.baddynamic\", []_C_int{4, 2, 17, 2}},\n\t{\"net.inet.udp.checksum\", []_C_int{4, 2, 17, 1}},\n\t{\"net.inet.udp.recvspace\", []_C_int{4, 2, 17, 3}},\n\t{\"net.inet.udp.sendspace\", []_C_int{4, 2, 17, 4}},\n\t{\"net.inet.udp.stats\", []_C_int{4, 2, 17, 5}},\n\t{\"net.inet6.divert.recvspace\", []_C_int{4, 24, 86, 1}},\n\t{\"net.inet6.divert.sendspace\", []_C_int{4, 24, 86, 2}},\n\t{\"net.inet6.divert.stats\", []_C_int{4, 24, 86, 3}},\n\t{\"net.inet6.icmp6.errppslimit\", []_C_int{4, 24, 30, 14}},\n\t{\"net.inet6.icmp6.mtudisc_hiwat\", []_C_int{4, 24, 30, 16}},\n\t{\"net.inet6.icmp6.mtudisc_lowat\", []_C_int{4, 24, 30, 17}},\n\t{\"net.inet6.icmp6.nd6_debug\", []_C_int{4, 24, 30, 18}},\n\t{\"net.inet6.icmp6.nd6_delay\", []_C_int{4, 24, 30, 8}},\n\t{\"net.inet6.icmp6.nd6_maxnudhint\", []_C_int{4, 24, 30, 15}},\n\t{\"net.inet6.icmp6.nd6_mmaxtries\", []_C_int{4, 24, 30, 10}},\n\t{\"net.inet6.icmp6.nd6_prune\", []_C_int{4, 24, 30, 6}},\n\t{\"net.inet6.icmp6.nd6_umaxtries\", []_C_int{4, 24, 30, 9}},\n\t{\"net.inet6.icmp6.nd6_useloopback\", []_C_int{4, 24, 30, 11}},\n\t{\"net.inet6.icmp6.nodeinfo\", []_C_int{4, 24, 30, 13}},\n\t{\"net.inet6.icmp6.rediraccept\", []_C_int{4, 24, 30, 2}},\n\t{\"net.inet6.icmp6.redirtimeout\", []_C_int{4, 24, 30, 3}},\n\t{\"net.inet6.ip6.accept_rtadv\", []_C_int{4, 24, 17, 12}},\n\t{\"net.inet6.ip6.auto_flowlabel\", []_C_int{4, 24, 17, 17}},\n\t{\"net.inet6.ip6.dad_count\", []_C_int{4, 24, 17, 16}},\n\t{\"net.inet6.ip6.dad_pending\", []_C_int{4, 24, 17, 49}},\n\t{\"net.inet6.ip6.defmcasthlim\", []_C_int{4, 24, 17, 18}},\n\t{\"net.inet6.ip6.forwarding\", []_C_int{4, 24, 17, 1}},\n\t{\"net.inet6.ip6.forwsrcrt\", []_C_int{4, 24, 17, 5}},\n\t{\"net.inet6.ip6.hdrnestlimit\", []_C_int{4, 24, 17, 15}},\n\t{\"net.inet6.ip6.hlim\", []_C_int{4, 24, 17, 3}},\n\t{\"net.inet6.ip6.log_interval\", []_C_int{4, 24, 17, 14}},\n\t{\"net.inet6.ip6.maxdynroutes\", []_C_int{4, 24, 17, 48}},\n\t{\"net.inet6.ip6.maxfragpackets\", []_C_int{4, 24, 17, 9}},\n\t{\"net.inet6.ip6.maxfrags\", []_C_int{4, 24, 17, 41}},\n\t{\"net.inet6.ip6.maxifdefrouters\", []_C_int{4, 24, 17, 47}},\n\t{\"net.inet6.ip6.maxifprefixes\", []_C_int{4, 24, 17, 46}},\n\t{\"net.inet6.ip6.mforwarding\", []_C_int{4, 24, 17, 42}},\n\t{\"net.inet6.ip6.mrtproto\", []_C_int{4, 24, 17, 8}},\n\t{\"net.inet6.ip6.mtudisctimeout\", []_C_int{4, 24, 17, 50}},\n\t{\"net.inet6.ip6.multicast_mtudisc\", []_C_int{4, 24, 17, 44}},\n\t{\"net.inet6.ip6.multipath\", []_C_int{4, 24, 17, 43}},\n\t{\"net.inet6.ip6.neighborgcthresh\", []_C_int{4, 24, 17, 45}},\n\t{\"net.inet6.ip6.redirect\", []_C_int{4, 24, 17, 2}},\n\t{\"net.inet6.ip6.rr_prune\", []_C_int{4, 24, 17, 22}},\n\t{\"net.inet6.ip6.sourcecheck\", []_C_int{4, 24, 17, 10}},\n\t{\"net.inet6.ip6.sourcecheck_logint\", []_C_int{4, 24, 17, 11}},\n\t{\"net.inet6.ip6.use_deprecated\", []_C_int{4, 24, 17, 21}},\n\t{\"net.inet6.ip6.v6only\", []_C_int{4, 24, 17, 24}},\n\t{\"net.key.sadb_dump\", []_C_int{4, 30, 1}},\n\t{\"net.key.spd_dump\", []_C_int{4, 30, 2}},\n\t{\"net.mpls.ifq.congestion\", []_C_int{4, 33, 3, 4}},\n\t{\"net.mpls.ifq.drops\", []_C_int{4, 33, 3, 3}},\n\t{\"net.mpls.ifq.len\", []_C_int{4, 33, 3, 1}},\n\t{\"net.mpls.ifq.maxlen\", []_C_int{4, 33, 3, 2}},\n\t{\"net.mpls.mapttl_ip\", []_C_int{4, 33, 5}},\n\t{\"net.mpls.mapttl_ip6\", []_C_int{4, 33, 6}},\n\t{\"net.mpls.maxloop_inkernel\", []_C_int{4, 33, 4}},\n\t{\"net.mpls.ttl\", []_C_int{4, 33, 2}},\n\t{\"net.pflow.stats\", []_C_int{4, 34, 1}},\n\t{\"net.pipex.enable\", []_C_int{4, 35, 1}},\n\t{\"vm.anonmin\", []_C_int{2, 7}},\n\t{\"vm.loadavg\", []_C_int{2, 2}},\n\t{\"vm.maxslp\", []_C_int{2, 10}},\n\t{\"vm.nkmempages\", []_C_int{2, 6}},\n\t{\"vm.psstrings\", []_C_int{2, 3}},\n\t{\"vm.swapencrypt.enable\", []_C_int{2, 5, 0}},\n\t{\"vm.swapencrypt.keyscreated\", []_C_int{2, 5, 1}},\n\t{\"vm.swapencrypt.keysdeleted\", []_C_int{2, 5, 2}},\n\t{\"vm.uspace\", []_C_int{2, 11}},\n\t{\"vm.uvmexp\", []_C_int{2, 4}},\n\t{\"vm.vmmeter\", []_C_int{2, 1}},\n\t{\"vm.vnodemin\", []_C_int{2, 9}},\n\t{\"vm.vtextmin\", []_C_int{2, 8}},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go",
    "content": "// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,darwin\n\npackage unix\n\nconst (\n\tSYS_SYSCALL                        = 0\n\tSYS_EXIT                           = 1\n\tSYS_FORK                           = 2\n\tSYS_READ                           = 3\n\tSYS_WRITE                          = 4\n\tSYS_OPEN                           = 5\n\tSYS_CLOSE                          = 6\n\tSYS_WAIT4                          = 7\n\tSYS_LINK                           = 9\n\tSYS_UNLINK                         = 10\n\tSYS_CHDIR                          = 12\n\tSYS_FCHDIR                         = 13\n\tSYS_MKNOD                          = 14\n\tSYS_CHMOD                          = 15\n\tSYS_CHOWN                          = 16\n\tSYS_GETFSSTAT                      = 18\n\tSYS_GETPID                         = 20\n\tSYS_SETUID                         = 23\n\tSYS_GETUID                         = 24\n\tSYS_GETEUID                        = 25\n\tSYS_PTRACE                         = 26\n\tSYS_RECVMSG                        = 27\n\tSYS_SENDMSG                        = 28\n\tSYS_RECVFROM                       = 29\n\tSYS_ACCEPT                         = 30\n\tSYS_GETPEERNAME                    = 31\n\tSYS_GETSOCKNAME                    = 32\n\tSYS_ACCESS                         = 33\n\tSYS_CHFLAGS                        = 34\n\tSYS_FCHFLAGS                       = 35\n\tSYS_SYNC                           = 36\n\tSYS_KILL                           = 37\n\tSYS_GETPPID                        = 39\n\tSYS_DUP                            = 41\n\tSYS_PIPE                           = 42\n\tSYS_GETEGID                        = 43\n\tSYS_SIGACTION                      = 46\n\tSYS_GETGID                         = 47\n\tSYS_SIGPROCMASK                    = 48\n\tSYS_GETLOGIN                       = 49\n\tSYS_SETLOGIN                       = 50\n\tSYS_ACCT                           = 51\n\tSYS_SIGPENDING                     = 52\n\tSYS_SIGALTSTACK                    = 53\n\tSYS_IOCTL                          = 54\n\tSYS_REBOOT                         = 55\n\tSYS_REVOKE                         = 56\n\tSYS_SYMLINK                        = 57\n\tSYS_READLINK                       = 58\n\tSYS_EXECVE                         = 59\n\tSYS_UMASK                          = 60\n\tSYS_CHROOT                         = 61\n\tSYS_MSYNC                          = 65\n\tSYS_VFORK                          = 66\n\tSYS_MUNMAP                         = 73\n\tSYS_MPROTECT                       = 74\n\tSYS_MADVISE                        = 75\n\tSYS_MINCORE                        = 78\n\tSYS_GETGROUPS                      = 79\n\tSYS_SETGROUPS                      = 80\n\tSYS_GETPGRP                        = 81\n\tSYS_SETPGID                        = 82\n\tSYS_SETITIMER                      = 83\n\tSYS_SWAPON                         = 85\n\tSYS_GETITIMER                      = 86\n\tSYS_GETDTABLESIZE                  = 89\n\tSYS_DUP2                           = 90\n\tSYS_FCNTL                          = 92\n\tSYS_SELECT                         = 93\n\tSYS_FSYNC                          = 95\n\tSYS_SETPRIORITY                    = 96\n\tSYS_SOCKET                         = 97\n\tSYS_CONNECT                        = 98\n\tSYS_GETPRIORITY                    = 100\n\tSYS_BIND                           = 104\n\tSYS_SETSOCKOPT                     = 105\n\tSYS_LISTEN                         = 106\n\tSYS_SIGSUSPEND                     = 111\n\tSYS_GETTIMEOFDAY                   = 116\n\tSYS_GETRUSAGE                      = 117\n\tSYS_GETSOCKOPT                     = 118\n\tSYS_READV                          = 120\n\tSYS_WRITEV                         = 121\n\tSYS_SETTIMEOFDAY                   = 122\n\tSYS_FCHOWN                         = 123\n\tSYS_FCHMOD                         = 124\n\tSYS_SETREUID                       = 126\n\tSYS_SETREGID                       = 127\n\tSYS_RENAME                         = 128\n\tSYS_FLOCK                          = 131\n\tSYS_MKFIFO                         = 132\n\tSYS_SENDTO                         = 133\n\tSYS_SHUTDOWN                       = 134\n\tSYS_SOCKETPAIR                     = 135\n\tSYS_MKDIR                          = 136\n\tSYS_RMDIR                          = 137\n\tSYS_UTIMES                         = 138\n\tSYS_FUTIMES                        = 139\n\tSYS_ADJTIME                        = 140\n\tSYS_GETHOSTUUID                    = 142\n\tSYS_SETSID                         = 147\n\tSYS_GETPGID                        = 151\n\tSYS_SETPRIVEXEC                    = 152\n\tSYS_PREAD                          = 153\n\tSYS_PWRITE                         = 154\n\tSYS_NFSSVC                         = 155\n\tSYS_STATFS                         = 157\n\tSYS_FSTATFS                        = 158\n\tSYS_UNMOUNT                        = 159\n\tSYS_GETFH                          = 161\n\tSYS_QUOTACTL                       = 165\n\tSYS_MOUNT                          = 167\n\tSYS_CSOPS                          = 169\n\tSYS_CSOPS_AUDITTOKEN               = 170\n\tSYS_WAITID                         = 173\n\tSYS_KDEBUG_TYPEFILTER              = 177\n\tSYS_KDEBUG_TRACE_STRING            = 178\n\tSYS_KDEBUG_TRACE64                 = 179\n\tSYS_KDEBUG_TRACE                   = 180\n\tSYS_SETGID                         = 181\n\tSYS_SETEGID                        = 182\n\tSYS_SETEUID                        = 183\n\tSYS_SIGRETURN                      = 184\n\tSYS_THREAD_SELFCOUNTS              = 186\n\tSYS_FDATASYNC                      = 187\n\tSYS_STAT                           = 188\n\tSYS_FSTAT                          = 189\n\tSYS_LSTAT                          = 190\n\tSYS_PATHCONF                       = 191\n\tSYS_FPATHCONF                      = 192\n\tSYS_GETRLIMIT                      = 194\n\tSYS_SETRLIMIT                      = 195\n\tSYS_GETDIRENTRIES                  = 196\n\tSYS_MMAP                           = 197\n\tSYS_LSEEK                          = 199\n\tSYS_TRUNCATE                       = 200\n\tSYS_FTRUNCATE                      = 201\n\tSYS_SYSCTL                         = 202\n\tSYS_MLOCK                          = 203\n\tSYS_MUNLOCK                        = 204\n\tSYS_UNDELETE                       = 205\n\tSYS_OPEN_DPROTECTED_NP             = 216\n\tSYS_GETATTRLIST                    = 220\n\tSYS_SETATTRLIST                    = 221\n\tSYS_GETDIRENTRIESATTR              = 222\n\tSYS_EXCHANGEDATA                   = 223\n\tSYS_SEARCHFS                       = 225\n\tSYS_DELETE                         = 226\n\tSYS_COPYFILE                       = 227\n\tSYS_FGETATTRLIST                   = 228\n\tSYS_FSETATTRLIST                   = 229\n\tSYS_POLL                           = 230\n\tSYS_WATCHEVENT                     = 231\n\tSYS_WAITEVENT                      = 232\n\tSYS_MODWATCH                       = 233\n\tSYS_GETXATTR                       = 234\n\tSYS_FGETXATTR                      = 235\n\tSYS_SETXATTR                       = 236\n\tSYS_FSETXATTR                      = 237\n\tSYS_REMOVEXATTR                    = 238\n\tSYS_FREMOVEXATTR                   = 239\n\tSYS_LISTXATTR                      = 240\n\tSYS_FLISTXATTR                     = 241\n\tSYS_FSCTL                          = 242\n\tSYS_INITGROUPS                     = 243\n\tSYS_POSIX_SPAWN                    = 244\n\tSYS_FFSCTL                         = 245\n\tSYS_NFSCLNT                        = 247\n\tSYS_FHOPEN                         = 248\n\tSYS_MINHERIT                       = 250\n\tSYS_SEMSYS                         = 251\n\tSYS_MSGSYS                         = 252\n\tSYS_SHMSYS                         = 253\n\tSYS_SEMCTL                         = 254\n\tSYS_SEMGET                         = 255\n\tSYS_SEMOP                          = 256\n\tSYS_MSGCTL                         = 258\n\tSYS_MSGGET                         = 259\n\tSYS_MSGSND                         = 260\n\tSYS_MSGRCV                         = 261\n\tSYS_SHMAT                          = 262\n\tSYS_SHMCTL                         = 263\n\tSYS_SHMDT                          = 264\n\tSYS_SHMGET                         = 265\n\tSYS_SHM_OPEN                       = 266\n\tSYS_SHM_UNLINK                     = 267\n\tSYS_SEM_OPEN                       = 268\n\tSYS_SEM_CLOSE                      = 269\n\tSYS_SEM_UNLINK                     = 270\n\tSYS_SEM_WAIT                       = 271\n\tSYS_SEM_TRYWAIT                    = 272\n\tSYS_SEM_POST                       = 273\n\tSYS_SYSCTLBYNAME                   = 274\n\tSYS_OPEN_EXTENDED                  = 277\n\tSYS_UMASK_EXTENDED                 = 278\n\tSYS_STAT_EXTENDED                  = 279\n\tSYS_LSTAT_EXTENDED                 = 280\n\tSYS_FSTAT_EXTENDED                 = 281\n\tSYS_CHMOD_EXTENDED                 = 282\n\tSYS_FCHMOD_EXTENDED                = 283\n\tSYS_ACCESS_EXTENDED                = 284\n\tSYS_SETTID                         = 285\n\tSYS_GETTID                         = 286\n\tSYS_SETSGROUPS                     = 287\n\tSYS_GETSGROUPS                     = 288\n\tSYS_SETWGROUPS                     = 289\n\tSYS_GETWGROUPS                     = 290\n\tSYS_MKFIFO_EXTENDED                = 291\n\tSYS_MKDIR_EXTENDED                 = 292\n\tSYS_IDENTITYSVC                    = 293\n\tSYS_SHARED_REGION_CHECK_NP         = 294\n\tSYS_VM_PRESSURE_MONITOR            = 296\n\tSYS_PSYNCH_RW_LONGRDLOCK           = 297\n\tSYS_PSYNCH_RW_YIELDWRLOCK          = 298\n\tSYS_PSYNCH_RW_DOWNGRADE            = 299\n\tSYS_PSYNCH_RW_UPGRADE              = 300\n\tSYS_PSYNCH_MUTEXWAIT               = 301\n\tSYS_PSYNCH_MUTEXDROP               = 302\n\tSYS_PSYNCH_CVBROAD                 = 303\n\tSYS_PSYNCH_CVSIGNAL                = 304\n\tSYS_PSYNCH_CVWAIT                  = 305\n\tSYS_PSYNCH_RW_RDLOCK               = 306\n\tSYS_PSYNCH_RW_WRLOCK               = 307\n\tSYS_PSYNCH_RW_UNLOCK               = 308\n\tSYS_PSYNCH_RW_UNLOCK2              = 309\n\tSYS_GETSID                         = 310\n\tSYS_SETTID_WITH_PID                = 311\n\tSYS_PSYNCH_CVCLRPREPOST            = 312\n\tSYS_AIO_FSYNC                      = 313\n\tSYS_AIO_RETURN                     = 314\n\tSYS_AIO_SUSPEND                    = 315\n\tSYS_AIO_CANCEL                     = 316\n\tSYS_AIO_ERROR                      = 317\n\tSYS_AIO_READ                       = 318\n\tSYS_AIO_WRITE                      = 319\n\tSYS_LIO_LISTIO                     = 320\n\tSYS_IOPOLICYSYS                    = 322\n\tSYS_PROCESS_POLICY                 = 323\n\tSYS_MLOCKALL                       = 324\n\tSYS_MUNLOCKALL                     = 325\n\tSYS_ISSETUGID                      = 327\n\tSYS___PTHREAD_KILL                 = 328\n\tSYS___PTHREAD_SIGMASK              = 329\n\tSYS___SIGWAIT                      = 330\n\tSYS___DISABLE_THREADSIGNAL         = 331\n\tSYS___PTHREAD_MARKCANCEL           = 332\n\tSYS___PTHREAD_CANCELED             = 333\n\tSYS___SEMWAIT_SIGNAL               = 334\n\tSYS_PROC_INFO                      = 336\n\tSYS_SENDFILE                       = 337\n\tSYS_STAT64                         = 338\n\tSYS_FSTAT64                        = 339\n\tSYS_LSTAT64                        = 340\n\tSYS_STAT64_EXTENDED                = 341\n\tSYS_LSTAT64_EXTENDED               = 342\n\tSYS_FSTAT64_EXTENDED               = 343\n\tSYS_GETDIRENTRIES64                = 344\n\tSYS_STATFS64                       = 345\n\tSYS_FSTATFS64                      = 346\n\tSYS_GETFSSTAT64                    = 347\n\tSYS___PTHREAD_CHDIR                = 348\n\tSYS___PTHREAD_FCHDIR               = 349\n\tSYS_AUDIT                          = 350\n\tSYS_AUDITON                        = 351\n\tSYS_GETAUID                        = 353\n\tSYS_SETAUID                        = 354\n\tSYS_GETAUDIT_ADDR                  = 357\n\tSYS_SETAUDIT_ADDR                  = 358\n\tSYS_AUDITCTL                       = 359\n\tSYS_BSDTHREAD_CREATE               = 360\n\tSYS_BSDTHREAD_TERMINATE            = 361\n\tSYS_KQUEUE                         = 362\n\tSYS_KEVENT                         = 363\n\tSYS_LCHOWN                         = 364\n\tSYS_BSDTHREAD_REGISTER             = 366\n\tSYS_WORKQ_OPEN                     = 367\n\tSYS_WORKQ_KERNRETURN               = 368\n\tSYS_KEVENT64                       = 369\n\tSYS___OLD_SEMWAIT_SIGNAL           = 370\n\tSYS___OLD_SEMWAIT_SIGNAL_NOCANCEL  = 371\n\tSYS_THREAD_SELFID                  = 372\n\tSYS_LEDGER                         = 373\n\tSYS_KEVENT_QOS                     = 374\n\tSYS_KEVENT_ID                      = 375\n\tSYS___MAC_EXECVE                   = 380\n\tSYS___MAC_SYSCALL                  = 381\n\tSYS___MAC_GET_FILE                 = 382\n\tSYS___MAC_SET_FILE                 = 383\n\tSYS___MAC_GET_LINK                 = 384\n\tSYS___MAC_SET_LINK                 = 385\n\tSYS___MAC_GET_PROC                 = 386\n\tSYS___MAC_SET_PROC                 = 387\n\tSYS___MAC_GET_FD                   = 388\n\tSYS___MAC_SET_FD                   = 389\n\tSYS___MAC_GET_PID                  = 390\n\tSYS_PSELECT                        = 394\n\tSYS_PSELECT_NOCANCEL               = 395\n\tSYS_READ_NOCANCEL                  = 396\n\tSYS_WRITE_NOCANCEL                 = 397\n\tSYS_OPEN_NOCANCEL                  = 398\n\tSYS_CLOSE_NOCANCEL                 = 399\n\tSYS_WAIT4_NOCANCEL                 = 400\n\tSYS_RECVMSG_NOCANCEL               = 401\n\tSYS_SENDMSG_NOCANCEL               = 402\n\tSYS_RECVFROM_NOCANCEL              = 403\n\tSYS_ACCEPT_NOCANCEL                = 404\n\tSYS_MSYNC_NOCANCEL                 = 405\n\tSYS_FCNTL_NOCANCEL                 = 406\n\tSYS_SELECT_NOCANCEL                = 407\n\tSYS_FSYNC_NOCANCEL                 = 408\n\tSYS_CONNECT_NOCANCEL               = 409\n\tSYS_SIGSUSPEND_NOCANCEL            = 410\n\tSYS_READV_NOCANCEL                 = 411\n\tSYS_WRITEV_NOCANCEL                = 412\n\tSYS_SENDTO_NOCANCEL                = 413\n\tSYS_PREAD_NOCANCEL                 = 414\n\tSYS_PWRITE_NOCANCEL                = 415\n\tSYS_WAITID_NOCANCEL                = 416\n\tSYS_POLL_NOCANCEL                  = 417\n\tSYS_MSGSND_NOCANCEL                = 418\n\tSYS_MSGRCV_NOCANCEL                = 419\n\tSYS_SEM_WAIT_NOCANCEL              = 420\n\tSYS_AIO_SUSPEND_NOCANCEL           = 421\n\tSYS___SIGWAIT_NOCANCEL             = 422\n\tSYS___SEMWAIT_SIGNAL_NOCANCEL      = 423\n\tSYS___MAC_MOUNT                    = 424\n\tSYS___MAC_GET_MOUNT                = 425\n\tSYS___MAC_GETFSSTAT                = 426\n\tSYS_FSGETPATH                      = 427\n\tSYS_AUDIT_SESSION_SELF             = 428\n\tSYS_AUDIT_SESSION_JOIN             = 429\n\tSYS_FILEPORT_MAKEPORT              = 430\n\tSYS_FILEPORT_MAKEFD                = 431\n\tSYS_AUDIT_SESSION_PORT             = 432\n\tSYS_PID_SUSPEND                    = 433\n\tSYS_PID_RESUME                     = 434\n\tSYS_PID_HIBERNATE                  = 435\n\tSYS_PID_SHUTDOWN_SOCKETS           = 436\n\tSYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438\n\tSYS_KAS_INFO                       = 439\n\tSYS_MEMORYSTATUS_CONTROL           = 440\n\tSYS_GUARDED_OPEN_NP                = 441\n\tSYS_GUARDED_CLOSE_NP               = 442\n\tSYS_GUARDED_KQUEUE_NP              = 443\n\tSYS_CHANGE_FDGUARD_NP              = 444\n\tSYS_USRCTL                         = 445\n\tSYS_PROC_RLIMIT_CONTROL            = 446\n\tSYS_CONNECTX                       = 447\n\tSYS_DISCONNECTX                    = 448\n\tSYS_PEELOFF                        = 449\n\tSYS_SOCKET_DELEGATE                = 450\n\tSYS_TELEMETRY                      = 451\n\tSYS_PROC_UUID_POLICY               = 452\n\tSYS_MEMORYSTATUS_GET_LEVEL         = 453\n\tSYS_SYSTEM_OVERRIDE                = 454\n\tSYS_VFS_PURGE                      = 455\n\tSYS_SFI_CTL                        = 456\n\tSYS_SFI_PIDCTL                     = 457\n\tSYS_COALITION                      = 458\n\tSYS_COALITION_INFO                 = 459\n\tSYS_NECP_MATCH_POLICY              = 460\n\tSYS_GETATTRLISTBULK                = 461\n\tSYS_CLONEFILEAT                    = 462\n\tSYS_OPENAT                         = 463\n\tSYS_OPENAT_NOCANCEL                = 464\n\tSYS_RENAMEAT                       = 465\n\tSYS_FACCESSAT                      = 466\n\tSYS_FCHMODAT                       = 467\n\tSYS_FCHOWNAT                       = 468\n\tSYS_FSTATAT                        = 469\n\tSYS_FSTATAT64                      = 470\n\tSYS_LINKAT                         = 471\n\tSYS_UNLINKAT                       = 472\n\tSYS_READLINKAT                     = 473\n\tSYS_SYMLINKAT                      = 474\n\tSYS_MKDIRAT                        = 475\n\tSYS_GETATTRLISTAT                  = 476\n\tSYS_PROC_TRACE_LOG                 = 477\n\tSYS_BSDTHREAD_CTL                  = 478\n\tSYS_OPENBYID_NP                    = 479\n\tSYS_RECVMSG_X                      = 480\n\tSYS_SENDMSG_X                      = 481\n\tSYS_THREAD_SELFUSAGE               = 482\n\tSYS_CSRCTL                         = 483\n\tSYS_GUARDED_OPEN_DPROTECTED_NP     = 484\n\tSYS_GUARDED_WRITE_NP               = 485\n\tSYS_GUARDED_PWRITE_NP              = 486\n\tSYS_GUARDED_WRITEV_NP              = 487\n\tSYS_RENAMEATX_NP                   = 488\n\tSYS_MREMAP_ENCRYPTED               = 489\n\tSYS_NETAGENT_TRIGGER               = 490\n\tSYS_STACK_SNAPSHOT_WITH_CONFIG     = 491\n\tSYS_MICROSTACKSHOT                 = 492\n\tSYS_GRAB_PGO_DATA                  = 493\n\tSYS_PERSONA                        = 494\n\tSYS_WORK_INTERVAL_CTL              = 499\n\tSYS_GETENTROPY                     = 500\n\tSYS_NECP_OPEN                      = 501\n\tSYS_NECP_CLIENT_ACTION             = 502\n\tSYS___NEXUS_OPEN                   = 503\n\tSYS___NEXUS_REGISTER               = 504\n\tSYS___NEXUS_DEREGISTER             = 505\n\tSYS___NEXUS_CREATE                 = 506\n\tSYS___NEXUS_DESTROY                = 507\n\tSYS___NEXUS_GET_OPT                = 508\n\tSYS___NEXUS_SET_OPT                = 509\n\tSYS___CHANNEL_OPEN                 = 510\n\tSYS___CHANNEL_GET_INFO             = 511\n\tSYS___CHANNEL_SYNC                 = 512\n\tSYS___CHANNEL_GET_OPT              = 513\n\tSYS___CHANNEL_SET_OPT              = 514\n\tSYS_ULOCK_WAIT                     = 515\n\tSYS_ULOCK_WAKE                     = 516\n\tSYS_FCLONEFILEAT                   = 517\n\tSYS_FS_SNAPSHOT                    = 518\n\tSYS_TERMINATE_WITH_PAYLOAD         = 520\n\tSYS_ABORT_WITH_PAYLOAD             = 521\n\tSYS_NECP_SESSION_OPEN              = 522\n\tSYS_NECP_SESSION_ACTION            = 523\n\tSYS_SETATTRLISTAT                  = 524\n\tSYS_NET_QOS_GUIDELINE              = 525\n\tSYS_FMOUNT                         = 526\n\tSYS_NTP_ADJTIME                    = 527\n\tSYS_NTP_GETTIME                    = 528\n\tSYS_OS_FAULT_WITH_PAYLOAD          = 529\n\tSYS_MAXSYSCALL                     = 530\n\tSYS_INVALID                        = 63\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go",
    "content": "// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,darwin\n\npackage unix\n\nconst (\n\tSYS_SYSCALL                        = 0\n\tSYS_EXIT                           = 1\n\tSYS_FORK                           = 2\n\tSYS_READ                           = 3\n\tSYS_WRITE                          = 4\n\tSYS_OPEN                           = 5\n\tSYS_CLOSE                          = 6\n\tSYS_WAIT4                          = 7\n\tSYS_LINK                           = 9\n\tSYS_UNLINK                         = 10\n\tSYS_CHDIR                          = 12\n\tSYS_FCHDIR                         = 13\n\tSYS_MKNOD                          = 14\n\tSYS_CHMOD                          = 15\n\tSYS_CHOWN                          = 16\n\tSYS_GETFSSTAT                      = 18\n\tSYS_GETPID                         = 20\n\tSYS_SETUID                         = 23\n\tSYS_GETUID                         = 24\n\tSYS_GETEUID                        = 25\n\tSYS_PTRACE                         = 26\n\tSYS_RECVMSG                        = 27\n\tSYS_SENDMSG                        = 28\n\tSYS_RECVFROM                       = 29\n\tSYS_ACCEPT                         = 30\n\tSYS_GETPEERNAME                    = 31\n\tSYS_GETSOCKNAME                    = 32\n\tSYS_ACCESS                         = 33\n\tSYS_CHFLAGS                        = 34\n\tSYS_FCHFLAGS                       = 35\n\tSYS_SYNC                           = 36\n\tSYS_KILL                           = 37\n\tSYS_GETPPID                        = 39\n\tSYS_DUP                            = 41\n\tSYS_PIPE                           = 42\n\tSYS_GETEGID                        = 43\n\tSYS_SIGACTION                      = 46\n\tSYS_GETGID                         = 47\n\tSYS_SIGPROCMASK                    = 48\n\tSYS_GETLOGIN                       = 49\n\tSYS_SETLOGIN                       = 50\n\tSYS_ACCT                           = 51\n\tSYS_SIGPENDING                     = 52\n\tSYS_SIGALTSTACK                    = 53\n\tSYS_IOCTL                          = 54\n\tSYS_REBOOT                         = 55\n\tSYS_REVOKE                         = 56\n\tSYS_SYMLINK                        = 57\n\tSYS_READLINK                       = 58\n\tSYS_EXECVE                         = 59\n\tSYS_UMASK                          = 60\n\tSYS_CHROOT                         = 61\n\tSYS_MSYNC                          = 65\n\tSYS_VFORK                          = 66\n\tSYS_MUNMAP                         = 73\n\tSYS_MPROTECT                       = 74\n\tSYS_MADVISE                        = 75\n\tSYS_MINCORE                        = 78\n\tSYS_GETGROUPS                      = 79\n\tSYS_SETGROUPS                      = 80\n\tSYS_GETPGRP                        = 81\n\tSYS_SETPGID                        = 82\n\tSYS_SETITIMER                      = 83\n\tSYS_SWAPON                         = 85\n\tSYS_GETITIMER                      = 86\n\tSYS_GETDTABLESIZE                  = 89\n\tSYS_DUP2                           = 90\n\tSYS_FCNTL                          = 92\n\tSYS_SELECT                         = 93\n\tSYS_FSYNC                          = 95\n\tSYS_SETPRIORITY                    = 96\n\tSYS_SOCKET                         = 97\n\tSYS_CONNECT                        = 98\n\tSYS_GETPRIORITY                    = 100\n\tSYS_BIND                           = 104\n\tSYS_SETSOCKOPT                     = 105\n\tSYS_LISTEN                         = 106\n\tSYS_SIGSUSPEND                     = 111\n\tSYS_GETTIMEOFDAY                   = 116\n\tSYS_GETRUSAGE                      = 117\n\tSYS_GETSOCKOPT                     = 118\n\tSYS_READV                          = 120\n\tSYS_WRITEV                         = 121\n\tSYS_SETTIMEOFDAY                   = 122\n\tSYS_FCHOWN                         = 123\n\tSYS_FCHMOD                         = 124\n\tSYS_SETREUID                       = 126\n\tSYS_SETREGID                       = 127\n\tSYS_RENAME                         = 128\n\tSYS_FLOCK                          = 131\n\tSYS_MKFIFO                         = 132\n\tSYS_SENDTO                         = 133\n\tSYS_SHUTDOWN                       = 134\n\tSYS_SOCKETPAIR                     = 135\n\tSYS_MKDIR                          = 136\n\tSYS_RMDIR                          = 137\n\tSYS_UTIMES                         = 138\n\tSYS_FUTIMES                        = 139\n\tSYS_ADJTIME                        = 140\n\tSYS_GETHOSTUUID                    = 142\n\tSYS_SETSID                         = 147\n\tSYS_GETPGID                        = 151\n\tSYS_SETPRIVEXEC                    = 152\n\tSYS_PREAD                          = 153\n\tSYS_PWRITE                         = 154\n\tSYS_NFSSVC                         = 155\n\tSYS_STATFS                         = 157\n\tSYS_FSTATFS                        = 158\n\tSYS_UNMOUNT                        = 159\n\tSYS_GETFH                          = 161\n\tSYS_QUOTACTL                       = 165\n\tSYS_MOUNT                          = 167\n\tSYS_CSOPS                          = 169\n\tSYS_CSOPS_AUDITTOKEN               = 170\n\tSYS_WAITID                         = 173\n\tSYS_KDEBUG_TYPEFILTER              = 177\n\tSYS_KDEBUG_TRACE_STRING            = 178\n\tSYS_KDEBUG_TRACE64                 = 179\n\tSYS_KDEBUG_TRACE                   = 180\n\tSYS_SETGID                         = 181\n\tSYS_SETEGID                        = 182\n\tSYS_SETEUID                        = 183\n\tSYS_SIGRETURN                      = 184\n\tSYS_THREAD_SELFCOUNTS              = 186\n\tSYS_FDATASYNC                      = 187\n\tSYS_STAT                           = 188\n\tSYS_FSTAT                          = 189\n\tSYS_LSTAT                          = 190\n\tSYS_PATHCONF                       = 191\n\tSYS_FPATHCONF                      = 192\n\tSYS_GETRLIMIT                      = 194\n\tSYS_SETRLIMIT                      = 195\n\tSYS_GETDIRENTRIES                  = 196\n\tSYS_MMAP                           = 197\n\tSYS_LSEEK                          = 199\n\tSYS_TRUNCATE                       = 200\n\tSYS_FTRUNCATE                      = 201\n\tSYS_SYSCTL                         = 202\n\tSYS_MLOCK                          = 203\n\tSYS_MUNLOCK                        = 204\n\tSYS_UNDELETE                       = 205\n\tSYS_OPEN_DPROTECTED_NP             = 216\n\tSYS_GETATTRLIST                    = 220\n\tSYS_SETATTRLIST                    = 221\n\tSYS_GETDIRENTRIESATTR              = 222\n\tSYS_EXCHANGEDATA                   = 223\n\tSYS_SEARCHFS                       = 225\n\tSYS_DELETE                         = 226\n\tSYS_COPYFILE                       = 227\n\tSYS_FGETATTRLIST                   = 228\n\tSYS_FSETATTRLIST                   = 229\n\tSYS_POLL                           = 230\n\tSYS_WATCHEVENT                     = 231\n\tSYS_WAITEVENT                      = 232\n\tSYS_MODWATCH                       = 233\n\tSYS_GETXATTR                       = 234\n\tSYS_FGETXATTR                      = 235\n\tSYS_SETXATTR                       = 236\n\tSYS_FSETXATTR                      = 237\n\tSYS_REMOVEXATTR                    = 238\n\tSYS_FREMOVEXATTR                   = 239\n\tSYS_LISTXATTR                      = 240\n\tSYS_FLISTXATTR                     = 241\n\tSYS_FSCTL                          = 242\n\tSYS_INITGROUPS                     = 243\n\tSYS_POSIX_SPAWN                    = 244\n\tSYS_FFSCTL                         = 245\n\tSYS_NFSCLNT                        = 247\n\tSYS_FHOPEN                         = 248\n\tSYS_MINHERIT                       = 250\n\tSYS_SEMSYS                         = 251\n\tSYS_MSGSYS                         = 252\n\tSYS_SHMSYS                         = 253\n\tSYS_SEMCTL                         = 254\n\tSYS_SEMGET                         = 255\n\tSYS_SEMOP                          = 256\n\tSYS_MSGCTL                         = 258\n\tSYS_MSGGET                         = 259\n\tSYS_MSGSND                         = 260\n\tSYS_MSGRCV                         = 261\n\tSYS_SHMAT                          = 262\n\tSYS_SHMCTL                         = 263\n\tSYS_SHMDT                          = 264\n\tSYS_SHMGET                         = 265\n\tSYS_SHM_OPEN                       = 266\n\tSYS_SHM_UNLINK                     = 267\n\tSYS_SEM_OPEN                       = 268\n\tSYS_SEM_CLOSE                      = 269\n\tSYS_SEM_UNLINK                     = 270\n\tSYS_SEM_WAIT                       = 271\n\tSYS_SEM_TRYWAIT                    = 272\n\tSYS_SEM_POST                       = 273\n\tSYS_SYSCTLBYNAME                   = 274\n\tSYS_OPEN_EXTENDED                  = 277\n\tSYS_UMASK_EXTENDED                 = 278\n\tSYS_STAT_EXTENDED                  = 279\n\tSYS_LSTAT_EXTENDED                 = 280\n\tSYS_FSTAT_EXTENDED                 = 281\n\tSYS_CHMOD_EXTENDED                 = 282\n\tSYS_FCHMOD_EXTENDED                = 283\n\tSYS_ACCESS_EXTENDED                = 284\n\tSYS_SETTID                         = 285\n\tSYS_GETTID                         = 286\n\tSYS_SETSGROUPS                     = 287\n\tSYS_GETSGROUPS                     = 288\n\tSYS_SETWGROUPS                     = 289\n\tSYS_GETWGROUPS                     = 290\n\tSYS_MKFIFO_EXTENDED                = 291\n\tSYS_MKDIR_EXTENDED                 = 292\n\tSYS_IDENTITYSVC                    = 293\n\tSYS_SHARED_REGION_CHECK_NP         = 294\n\tSYS_VM_PRESSURE_MONITOR            = 296\n\tSYS_PSYNCH_RW_LONGRDLOCK           = 297\n\tSYS_PSYNCH_RW_YIELDWRLOCK          = 298\n\tSYS_PSYNCH_RW_DOWNGRADE            = 299\n\tSYS_PSYNCH_RW_UPGRADE              = 300\n\tSYS_PSYNCH_MUTEXWAIT               = 301\n\tSYS_PSYNCH_MUTEXDROP               = 302\n\tSYS_PSYNCH_CVBROAD                 = 303\n\tSYS_PSYNCH_CVSIGNAL                = 304\n\tSYS_PSYNCH_CVWAIT                  = 305\n\tSYS_PSYNCH_RW_RDLOCK               = 306\n\tSYS_PSYNCH_RW_WRLOCK               = 307\n\tSYS_PSYNCH_RW_UNLOCK               = 308\n\tSYS_PSYNCH_RW_UNLOCK2              = 309\n\tSYS_GETSID                         = 310\n\tSYS_SETTID_WITH_PID                = 311\n\tSYS_PSYNCH_CVCLRPREPOST            = 312\n\tSYS_AIO_FSYNC                      = 313\n\tSYS_AIO_RETURN                     = 314\n\tSYS_AIO_SUSPEND                    = 315\n\tSYS_AIO_CANCEL                     = 316\n\tSYS_AIO_ERROR                      = 317\n\tSYS_AIO_READ                       = 318\n\tSYS_AIO_WRITE                      = 319\n\tSYS_LIO_LISTIO                     = 320\n\tSYS_IOPOLICYSYS                    = 322\n\tSYS_PROCESS_POLICY                 = 323\n\tSYS_MLOCKALL                       = 324\n\tSYS_MUNLOCKALL                     = 325\n\tSYS_ISSETUGID                      = 327\n\tSYS___PTHREAD_KILL                 = 328\n\tSYS___PTHREAD_SIGMASK              = 329\n\tSYS___SIGWAIT                      = 330\n\tSYS___DISABLE_THREADSIGNAL         = 331\n\tSYS___PTHREAD_MARKCANCEL           = 332\n\tSYS___PTHREAD_CANCELED             = 333\n\tSYS___SEMWAIT_SIGNAL               = 334\n\tSYS_PROC_INFO                      = 336\n\tSYS_SENDFILE                       = 337\n\tSYS_STAT64                         = 338\n\tSYS_FSTAT64                        = 339\n\tSYS_LSTAT64                        = 340\n\tSYS_STAT64_EXTENDED                = 341\n\tSYS_LSTAT64_EXTENDED               = 342\n\tSYS_FSTAT64_EXTENDED               = 343\n\tSYS_GETDIRENTRIES64                = 344\n\tSYS_STATFS64                       = 345\n\tSYS_FSTATFS64                      = 346\n\tSYS_GETFSSTAT64                    = 347\n\tSYS___PTHREAD_CHDIR                = 348\n\tSYS___PTHREAD_FCHDIR               = 349\n\tSYS_AUDIT                          = 350\n\tSYS_AUDITON                        = 351\n\tSYS_GETAUID                        = 353\n\tSYS_SETAUID                        = 354\n\tSYS_GETAUDIT_ADDR                  = 357\n\tSYS_SETAUDIT_ADDR                  = 358\n\tSYS_AUDITCTL                       = 359\n\tSYS_BSDTHREAD_CREATE               = 360\n\tSYS_BSDTHREAD_TERMINATE            = 361\n\tSYS_KQUEUE                         = 362\n\tSYS_KEVENT                         = 363\n\tSYS_LCHOWN                         = 364\n\tSYS_BSDTHREAD_REGISTER             = 366\n\tSYS_WORKQ_OPEN                     = 367\n\tSYS_WORKQ_KERNRETURN               = 368\n\tSYS_KEVENT64                       = 369\n\tSYS___OLD_SEMWAIT_SIGNAL           = 370\n\tSYS___OLD_SEMWAIT_SIGNAL_NOCANCEL  = 371\n\tSYS_THREAD_SELFID                  = 372\n\tSYS_LEDGER                         = 373\n\tSYS_KEVENT_QOS                     = 374\n\tSYS_KEVENT_ID                      = 375\n\tSYS___MAC_EXECVE                   = 380\n\tSYS___MAC_SYSCALL                  = 381\n\tSYS___MAC_GET_FILE                 = 382\n\tSYS___MAC_SET_FILE                 = 383\n\tSYS___MAC_GET_LINK                 = 384\n\tSYS___MAC_SET_LINK                 = 385\n\tSYS___MAC_GET_PROC                 = 386\n\tSYS___MAC_SET_PROC                 = 387\n\tSYS___MAC_GET_FD                   = 388\n\tSYS___MAC_SET_FD                   = 389\n\tSYS___MAC_GET_PID                  = 390\n\tSYS_PSELECT                        = 394\n\tSYS_PSELECT_NOCANCEL               = 395\n\tSYS_READ_NOCANCEL                  = 396\n\tSYS_WRITE_NOCANCEL                 = 397\n\tSYS_OPEN_NOCANCEL                  = 398\n\tSYS_CLOSE_NOCANCEL                 = 399\n\tSYS_WAIT4_NOCANCEL                 = 400\n\tSYS_RECVMSG_NOCANCEL               = 401\n\tSYS_SENDMSG_NOCANCEL               = 402\n\tSYS_RECVFROM_NOCANCEL              = 403\n\tSYS_ACCEPT_NOCANCEL                = 404\n\tSYS_MSYNC_NOCANCEL                 = 405\n\tSYS_FCNTL_NOCANCEL                 = 406\n\tSYS_SELECT_NOCANCEL                = 407\n\tSYS_FSYNC_NOCANCEL                 = 408\n\tSYS_CONNECT_NOCANCEL               = 409\n\tSYS_SIGSUSPEND_NOCANCEL            = 410\n\tSYS_READV_NOCANCEL                 = 411\n\tSYS_WRITEV_NOCANCEL                = 412\n\tSYS_SENDTO_NOCANCEL                = 413\n\tSYS_PREAD_NOCANCEL                 = 414\n\tSYS_PWRITE_NOCANCEL                = 415\n\tSYS_WAITID_NOCANCEL                = 416\n\tSYS_POLL_NOCANCEL                  = 417\n\tSYS_MSGSND_NOCANCEL                = 418\n\tSYS_MSGRCV_NOCANCEL                = 419\n\tSYS_SEM_WAIT_NOCANCEL              = 420\n\tSYS_AIO_SUSPEND_NOCANCEL           = 421\n\tSYS___SIGWAIT_NOCANCEL             = 422\n\tSYS___SEMWAIT_SIGNAL_NOCANCEL      = 423\n\tSYS___MAC_MOUNT                    = 424\n\tSYS___MAC_GET_MOUNT                = 425\n\tSYS___MAC_GETFSSTAT                = 426\n\tSYS_FSGETPATH                      = 427\n\tSYS_AUDIT_SESSION_SELF             = 428\n\tSYS_AUDIT_SESSION_JOIN             = 429\n\tSYS_FILEPORT_MAKEPORT              = 430\n\tSYS_FILEPORT_MAKEFD                = 431\n\tSYS_AUDIT_SESSION_PORT             = 432\n\tSYS_PID_SUSPEND                    = 433\n\tSYS_PID_RESUME                     = 434\n\tSYS_PID_HIBERNATE                  = 435\n\tSYS_PID_SHUTDOWN_SOCKETS           = 436\n\tSYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438\n\tSYS_KAS_INFO                       = 439\n\tSYS_MEMORYSTATUS_CONTROL           = 440\n\tSYS_GUARDED_OPEN_NP                = 441\n\tSYS_GUARDED_CLOSE_NP               = 442\n\tSYS_GUARDED_KQUEUE_NP              = 443\n\tSYS_CHANGE_FDGUARD_NP              = 444\n\tSYS_USRCTL                         = 445\n\tSYS_PROC_RLIMIT_CONTROL            = 446\n\tSYS_CONNECTX                       = 447\n\tSYS_DISCONNECTX                    = 448\n\tSYS_PEELOFF                        = 449\n\tSYS_SOCKET_DELEGATE                = 450\n\tSYS_TELEMETRY                      = 451\n\tSYS_PROC_UUID_POLICY               = 452\n\tSYS_MEMORYSTATUS_GET_LEVEL         = 453\n\tSYS_SYSTEM_OVERRIDE                = 454\n\tSYS_VFS_PURGE                      = 455\n\tSYS_SFI_CTL                        = 456\n\tSYS_SFI_PIDCTL                     = 457\n\tSYS_COALITION                      = 458\n\tSYS_COALITION_INFO                 = 459\n\tSYS_NECP_MATCH_POLICY              = 460\n\tSYS_GETATTRLISTBULK                = 461\n\tSYS_CLONEFILEAT                    = 462\n\tSYS_OPENAT                         = 463\n\tSYS_OPENAT_NOCANCEL                = 464\n\tSYS_RENAMEAT                       = 465\n\tSYS_FACCESSAT                      = 466\n\tSYS_FCHMODAT                       = 467\n\tSYS_FCHOWNAT                       = 468\n\tSYS_FSTATAT                        = 469\n\tSYS_FSTATAT64                      = 470\n\tSYS_LINKAT                         = 471\n\tSYS_UNLINKAT                       = 472\n\tSYS_READLINKAT                     = 473\n\tSYS_SYMLINKAT                      = 474\n\tSYS_MKDIRAT                        = 475\n\tSYS_GETATTRLISTAT                  = 476\n\tSYS_PROC_TRACE_LOG                 = 477\n\tSYS_BSDTHREAD_CTL                  = 478\n\tSYS_OPENBYID_NP                    = 479\n\tSYS_RECVMSG_X                      = 480\n\tSYS_SENDMSG_X                      = 481\n\tSYS_THREAD_SELFUSAGE               = 482\n\tSYS_CSRCTL                         = 483\n\tSYS_GUARDED_OPEN_DPROTECTED_NP     = 484\n\tSYS_GUARDED_WRITE_NP               = 485\n\tSYS_GUARDED_PWRITE_NP              = 486\n\tSYS_GUARDED_WRITEV_NP              = 487\n\tSYS_RENAMEATX_NP                   = 488\n\tSYS_MREMAP_ENCRYPTED               = 489\n\tSYS_NETAGENT_TRIGGER               = 490\n\tSYS_STACK_SNAPSHOT_WITH_CONFIG     = 491\n\tSYS_MICROSTACKSHOT                 = 492\n\tSYS_GRAB_PGO_DATA                  = 493\n\tSYS_PERSONA                        = 494\n\tSYS_WORK_INTERVAL_CTL              = 499\n\tSYS_GETENTROPY                     = 500\n\tSYS_NECP_OPEN                      = 501\n\tSYS_NECP_CLIENT_ACTION             = 502\n\tSYS___NEXUS_OPEN                   = 503\n\tSYS___NEXUS_REGISTER               = 504\n\tSYS___NEXUS_DEREGISTER             = 505\n\tSYS___NEXUS_CREATE                 = 506\n\tSYS___NEXUS_DESTROY                = 507\n\tSYS___NEXUS_GET_OPT                = 508\n\tSYS___NEXUS_SET_OPT                = 509\n\tSYS___CHANNEL_OPEN                 = 510\n\tSYS___CHANNEL_GET_INFO             = 511\n\tSYS___CHANNEL_SYNC                 = 512\n\tSYS___CHANNEL_GET_OPT              = 513\n\tSYS___CHANNEL_SET_OPT              = 514\n\tSYS_ULOCK_WAIT                     = 515\n\tSYS_ULOCK_WAKE                     = 516\n\tSYS_FCLONEFILEAT                   = 517\n\tSYS_FS_SNAPSHOT                    = 518\n\tSYS_TERMINATE_WITH_PAYLOAD         = 520\n\tSYS_ABORT_WITH_PAYLOAD             = 521\n\tSYS_NECP_SESSION_OPEN              = 522\n\tSYS_NECP_SESSION_ACTION            = 523\n\tSYS_SETATTRLISTAT                  = 524\n\tSYS_NET_QOS_GUIDELINE              = 525\n\tSYS_FMOUNT                         = 526\n\tSYS_NTP_ADJTIME                    = 527\n\tSYS_NTP_GETTIME                    = 528\n\tSYS_OS_FAULT_WITH_PAYLOAD          = 529\n\tSYS_MAXSYSCALL                     = 530\n\tSYS_INVALID                        = 63\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go",
    "content": "// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,darwin\n\npackage unix\n\nconst (\n\tSYS_SYSCALL                        = 0\n\tSYS_EXIT                           = 1\n\tSYS_FORK                           = 2\n\tSYS_READ                           = 3\n\tSYS_WRITE                          = 4\n\tSYS_OPEN                           = 5\n\tSYS_CLOSE                          = 6\n\tSYS_WAIT4                          = 7\n\tSYS_LINK                           = 9\n\tSYS_UNLINK                         = 10\n\tSYS_CHDIR                          = 12\n\tSYS_FCHDIR                         = 13\n\tSYS_MKNOD                          = 14\n\tSYS_CHMOD                          = 15\n\tSYS_CHOWN                          = 16\n\tSYS_GETFSSTAT                      = 18\n\tSYS_GETPID                         = 20\n\tSYS_SETUID                         = 23\n\tSYS_GETUID                         = 24\n\tSYS_GETEUID                        = 25\n\tSYS_PTRACE                         = 26\n\tSYS_RECVMSG                        = 27\n\tSYS_SENDMSG                        = 28\n\tSYS_RECVFROM                       = 29\n\tSYS_ACCEPT                         = 30\n\tSYS_GETPEERNAME                    = 31\n\tSYS_GETSOCKNAME                    = 32\n\tSYS_ACCESS                         = 33\n\tSYS_CHFLAGS                        = 34\n\tSYS_FCHFLAGS                       = 35\n\tSYS_SYNC                           = 36\n\tSYS_KILL                           = 37\n\tSYS_GETPPID                        = 39\n\tSYS_DUP                            = 41\n\tSYS_PIPE                           = 42\n\tSYS_GETEGID                        = 43\n\tSYS_SIGACTION                      = 46\n\tSYS_GETGID                         = 47\n\tSYS_SIGPROCMASK                    = 48\n\tSYS_GETLOGIN                       = 49\n\tSYS_SETLOGIN                       = 50\n\tSYS_ACCT                           = 51\n\tSYS_SIGPENDING                     = 52\n\tSYS_SIGALTSTACK                    = 53\n\tSYS_IOCTL                          = 54\n\tSYS_REBOOT                         = 55\n\tSYS_REVOKE                         = 56\n\tSYS_SYMLINK                        = 57\n\tSYS_READLINK                       = 58\n\tSYS_EXECVE                         = 59\n\tSYS_UMASK                          = 60\n\tSYS_CHROOT                         = 61\n\tSYS_MSYNC                          = 65\n\tSYS_VFORK                          = 66\n\tSYS_MUNMAP                         = 73\n\tSYS_MPROTECT                       = 74\n\tSYS_MADVISE                        = 75\n\tSYS_MINCORE                        = 78\n\tSYS_GETGROUPS                      = 79\n\tSYS_SETGROUPS                      = 80\n\tSYS_GETPGRP                        = 81\n\tSYS_SETPGID                        = 82\n\tSYS_SETITIMER                      = 83\n\tSYS_SWAPON                         = 85\n\tSYS_GETITIMER                      = 86\n\tSYS_GETDTABLESIZE                  = 89\n\tSYS_DUP2                           = 90\n\tSYS_FCNTL                          = 92\n\tSYS_SELECT                         = 93\n\tSYS_FSYNC                          = 95\n\tSYS_SETPRIORITY                    = 96\n\tSYS_SOCKET                         = 97\n\tSYS_CONNECT                        = 98\n\tSYS_GETPRIORITY                    = 100\n\tSYS_BIND                           = 104\n\tSYS_SETSOCKOPT                     = 105\n\tSYS_LISTEN                         = 106\n\tSYS_SIGSUSPEND                     = 111\n\tSYS_GETTIMEOFDAY                   = 116\n\tSYS_GETRUSAGE                      = 117\n\tSYS_GETSOCKOPT                     = 118\n\tSYS_READV                          = 120\n\tSYS_WRITEV                         = 121\n\tSYS_SETTIMEOFDAY                   = 122\n\tSYS_FCHOWN                         = 123\n\tSYS_FCHMOD                         = 124\n\tSYS_SETREUID                       = 126\n\tSYS_SETREGID                       = 127\n\tSYS_RENAME                         = 128\n\tSYS_FLOCK                          = 131\n\tSYS_MKFIFO                         = 132\n\tSYS_SENDTO                         = 133\n\tSYS_SHUTDOWN                       = 134\n\tSYS_SOCKETPAIR                     = 135\n\tSYS_MKDIR                          = 136\n\tSYS_RMDIR                          = 137\n\tSYS_UTIMES                         = 138\n\tSYS_FUTIMES                        = 139\n\tSYS_ADJTIME                        = 140\n\tSYS_GETHOSTUUID                    = 142\n\tSYS_SETSID                         = 147\n\tSYS_GETPGID                        = 151\n\tSYS_SETPRIVEXEC                    = 152\n\tSYS_PREAD                          = 153\n\tSYS_PWRITE                         = 154\n\tSYS_NFSSVC                         = 155\n\tSYS_STATFS                         = 157\n\tSYS_FSTATFS                        = 158\n\tSYS_UNMOUNT                        = 159\n\tSYS_GETFH                          = 161\n\tSYS_QUOTACTL                       = 165\n\tSYS_MOUNT                          = 167\n\tSYS_CSOPS                          = 169\n\tSYS_CSOPS_AUDITTOKEN               = 170\n\tSYS_WAITID                         = 173\n\tSYS_KDEBUG_TYPEFILTER              = 177\n\tSYS_KDEBUG_TRACE_STRING            = 178\n\tSYS_KDEBUG_TRACE64                 = 179\n\tSYS_KDEBUG_TRACE                   = 180\n\tSYS_SETGID                         = 181\n\tSYS_SETEGID                        = 182\n\tSYS_SETEUID                        = 183\n\tSYS_SIGRETURN                      = 184\n\tSYS_THREAD_SELFCOUNTS              = 186\n\tSYS_FDATASYNC                      = 187\n\tSYS_STAT                           = 188\n\tSYS_FSTAT                          = 189\n\tSYS_LSTAT                          = 190\n\tSYS_PATHCONF                       = 191\n\tSYS_FPATHCONF                      = 192\n\tSYS_GETRLIMIT                      = 194\n\tSYS_SETRLIMIT                      = 195\n\tSYS_GETDIRENTRIES                  = 196\n\tSYS_MMAP                           = 197\n\tSYS_LSEEK                          = 199\n\tSYS_TRUNCATE                       = 200\n\tSYS_FTRUNCATE                      = 201\n\tSYS_SYSCTL                         = 202\n\tSYS_MLOCK                          = 203\n\tSYS_MUNLOCK                        = 204\n\tSYS_UNDELETE                       = 205\n\tSYS_OPEN_DPROTECTED_NP             = 216\n\tSYS_GETATTRLIST                    = 220\n\tSYS_SETATTRLIST                    = 221\n\tSYS_GETDIRENTRIESATTR              = 222\n\tSYS_EXCHANGEDATA                   = 223\n\tSYS_SEARCHFS                       = 225\n\tSYS_DELETE                         = 226\n\tSYS_COPYFILE                       = 227\n\tSYS_FGETATTRLIST                   = 228\n\tSYS_FSETATTRLIST                   = 229\n\tSYS_POLL                           = 230\n\tSYS_WATCHEVENT                     = 231\n\tSYS_WAITEVENT                      = 232\n\tSYS_MODWATCH                       = 233\n\tSYS_GETXATTR                       = 234\n\tSYS_FGETXATTR                      = 235\n\tSYS_SETXATTR                       = 236\n\tSYS_FSETXATTR                      = 237\n\tSYS_REMOVEXATTR                    = 238\n\tSYS_FREMOVEXATTR                   = 239\n\tSYS_LISTXATTR                      = 240\n\tSYS_FLISTXATTR                     = 241\n\tSYS_FSCTL                          = 242\n\tSYS_INITGROUPS                     = 243\n\tSYS_POSIX_SPAWN                    = 244\n\tSYS_FFSCTL                         = 245\n\tSYS_NFSCLNT                        = 247\n\tSYS_FHOPEN                         = 248\n\tSYS_MINHERIT                       = 250\n\tSYS_SEMSYS                         = 251\n\tSYS_MSGSYS                         = 252\n\tSYS_SHMSYS                         = 253\n\tSYS_SEMCTL                         = 254\n\tSYS_SEMGET                         = 255\n\tSYS_SEMOP                          = 256\n\tSYS_MSGCTL                         = 258\n\tSYS_MSGGET                         = 259\n\tSYS_MSGSND                         = 260\n\tSYS_MSGRCV                         = 261\n\tSYS_SHMAT                          = 262\n\tSYS_SHMCTL                         = 263\n\tSYS_SHMDT                          = 264\n\tSYS_SHMGET                         = 265\n\tSYS_SHM_OPEN                       = 266\n\tSYS_SHM_UNLINK                     = 267\n\tSYS_SEM_OPEN                       = 268\n\tSYS_SEM_CLOSE                      = 269\n\tSYS_SEM_UNLINK                     = 270\n\tSYS_SEM_WAIT                       = 271\n\tSYS_SEM_TRYWAIT                    = 272\n\tSYS_SEM_POST                       = 273\n\tSYS_SYSCTLBYNAME                   = 274\n\tSYS_OPEN_EXTENDED                  = 277\n\tSYS_UMASK_EXTENDED                 = 278\n\tSYS_STAT_EXTENDED                  = 279\n\tSYS_LSTAT_EXTENDED                 = 280\n\tSYS_FSTAT_EXTENDED                 = 281\n\tSYS_CHMOD_EXTENDED                 = 282\n\tSYS_FCHMOD_EXTENDED                = 283\n\tSYS_ACCESS_EXTENDED                = 284\n\tSYS_SETTID                         = 285\n\tSYS_GETTID                         = 286\n\tSYS_SETSGROUPS                     = 287\n\tSYS_GETSGROUPS                     = 288\n\tSYS_SETWGROUPS                     = 289\n\tSYS_GETWGROUPS                     = 290\n\tSYS_MKFIFO_EXTENDED                = 291\n\tSYS_MKDIR_EXTENDED                 = 292\n\tSYS_IDENTITYSVC                    = 293\n\tSYS_SHARED_REGION_CHECK_NP         = 294\n\tSYS_VM_PRESSURE_MONITOR            = 296\n\tSYS_PSYNCH_RW_LONGRDLOCK           = 297\n\tSYS_PSYNCH_RW_YIELDWRLOCK          = 298\n\tSYS_PSYNCH_RW_DOWNGRADE            = 299\n\tSYS_PSYNCH_RW_UPGRADE              = 300\n\tSYS_PSYNCH_MUTEXWAIT               = 301\n\tSYS_PSYNCH_MUTEXDROP               = 302\n\tSYS_PSYNCH_CVBROAD                 = 303\n\tSYS_PSYNCH_CVSIGNAL                = 304\n\tSYS_PSYNCH_CVWAIT                  = 305\n\tSYS_PSYNCH_RW_RDLOCK               = 306\n\tSYS_PSYNCH_RW_WRLOCK               = 307\n\tSYS_PSYNCH_RW_UNLOCK               = 308\n\tSYS_PSYNCH_RW_UNLOCK2              = 309\n\tSYS_GETSID                         = 310\n\tSYS_SETTID_WITH_PID                = 311\n\tSYS_PSYNCH_CVCLRPREPOST            = 312\n\tSYS_AIO_FSYNC                      = 313\n\tSYS_AIO_RETURN                     = 314\n\tSYS_AIO_SUSPEND                    = 315\n\tSYS_AIO_CANCEL                     = 316\n\tSYS_AIO_ERROR                      = 317\n\tSYS_AIO_READ                       = 318\n\tSYS_AIO_WRITE                      = 319\n\tSYS_LIO_LISTIO                     = 320\n\tSYS_IOPOLICYSYS                    = 322\n\tSYS_PROCESS_POLICY                 = 323\n\tSYS_MLOCKALL                       = 324\n\tSYS_MUNLOCKALL                     = 325\n\tSYS_ISSETUGID                      = 327\n\tSYS___PTHREAD_KILL                 = 328\n\tSYS___PTHREAD_SIGMASK              = 329\n\tSYS___SIGWAIT                      = 330\n\tSYS___DISABLE_THREADSIGNAL         = 331\n\tSYS___PTHREAD_MARKCANCEL           = 332\n\tSYS___PTHREAD_CANCELED             = 333\n\tSYS___SEMWAIT_SIGNAL               = 334\n\tSYS_PROC_INFO                      = 336\n\tSYS_SENDFILE                       = 337\n\tSYS_STAT64                         = 338\n\tSYS_FSTAT64                        = 339\n\tSYS_LSTAT64                        = 340\n\tSYS_STAT64_EXTENDED                = 341\n\tSYS_LSTAT64_EXTENDED               = 342\n\tSYS_FSTAT64_EXTENDED               = 343\n\tSYS_GETDIRENTRIES64                = 344\n\tSYS_STATFS64                       = 345\n\tSYS_FSTATFS64                      = 346\n\tSYS_GETFSSTAT64                    = 347\n\tSYS___PTHREAD_CHDIR                = 348\n\tSYS___PTHREAD_FCHDIR               = 349\n\tSYS_AUDIT                          = 350\n\tSYS_AUDITON                        = 351\n\tSYS_GETAUID                        = 353\n\tSYS_SETAUID                        = 354\n\tSYS_GETAUDIT_ADDR                  = 357\n\tSYS_SETAUDIT_ADDR                  = 358\n\tSYS_AUDITCTL                       = 359\n\tSYS_BSDTHREAD_CREATE               = 360\n\tSYS_BSDTHREAD_TERMINATE            = 361\n\tSYS_KQUEUE                         = 362\n\tSYS_KEVENT                         = 363\n\tSYS_LCHOWN                         = 364\n\tSYS_BSDTHREAD_REGISTER             = 366\n\tSYS_WORKQ_OPEN                     = 367\n\tSYS_WORKQ_KERNRETURN               = 368\n\tSYS_KEVENT64                       = 369\n\tSYS___OLD_SEMWAIT_SIGNAL           = 370\n\tSYS___OLD_SEMWAIT_SIGNAL_NOCANCEL  = 371\n\tSYS_THREAD_SELFID                  = 372\n\tSYS_LEDGER                         = 373\n\tSYS_KEVENT_QOS                     = 374\n\tSYS_KEVENT_ID                      = 375\n\tSYS___MAC_EXECVE                   = 380\n\tSYS___MAC_SYSCALL                  = 381\n\tSYS___MAC_GET_FILE                 = 382\n\tSYS___MAC_SET_FILE                 = 383\n\tSYS___MAC_GET_LINK                 = 384\n\tSYS___MAC_SET_LINK                 = 385\n\tSYS___MAC_GET_PROC                 = 386\n\tSYS___MAC_SET_PROC                 = 387\n\tSYS___MAC_GET_FD                   = 388\n\tSYS___MAC_SET_FD                   = 389\n\tSYS___MAC_GET_PID                  = 390\n\tSYS_PSELECT                        = 394\n\tSYS_PSELECT_NOCANCEL               = 395\n\tSYS_READ_NOCANCEL                  = 396\n\tSYS_WRITE_NOCANCEL                 = 397\n\tSYS_OPEN_NOCANCEL                  = 398\n\tSYS_CLOSE_NOCANCEL                 = 399\n\tSYS_WAIT4_NOCANCEL                 = 400\n\tSYS_RECVMSG_NOCANCEL               = 401\n\tSYS_SENDMSG_NOCANCEL               = 402\n\tSYS_RECVFROM_NOCANCEL              = 403\n\tSYS_ACCEPT_NOCANCEL                = 404\n\tSYS_MSYNC_NOCANCEL                 = 405\n\tSYS_FCNTL_NOCANCEL                 = 406\n\tSYS_SELECT_NOCANCEL                = 407\n\tSYS_FSYNC_NOCANCEL                 = 408\n\tSYS_CONNECT_NOCANCEL               = 409\n\tSYS_SIGSUSPEND_NOCANCEL            = 410\n\tSYS_READV_NOCANCEL                 = 411\n\tSYS_WRITEV_NOCANCEL                = 412\n\tSYS_SENDTO_NOCANCEL                = 413\n\tSYS_PREAD_NOCANCEL                 = 414\n\tSYS_PWRITE_NOCANCEL                = 415\n\tSYS_WAITID_NOCANCEL                = 416\n\tSYS_POLL_NOCANCEL                  = 417\n\tSYS_MSGSND_NOCANCEL                = 418\n\tSYS_MSGRCV_NOCANCEL                = 419\n\tSYS_SEM_WAIT_NOCANCEL              = 420\n\tSYS_AIO_SUSPEND_NOCANCEL           = 421\n\tSYS___SIGWAIT_NOCANCEL             = 422\n\tSYS___SEMWAIT_SIGNAL_NOCANCEL      = 423\n\tSYS___MAC_MOUNT                    = 424\n\tSYS___MAC_GET_MOUNT                = 425\n\tSYS___MAC_GETFSSTAT                = 426\n\tSYS_FSGETPATH                      = 427\n\tSYS_AUDIT_SESSION_SELF             = 428\n\tSYS_AUDIT_SESSION_JOIN             = 429\n\tSYS_FILEPORT_MAKEPORT              = 430\n\tSYS_FILEPORT_MAKEFD                = 431\n\tSYS_AUDIT_SESSION_PORT             = 432\n\tSYS_PID_SUSPEND                    = 433\n\tSYS_PID_RESUME                     = 434\n\tSYS_PID_HIBERNATE                  = 435\n\tSYS_PID_SHUTDOWN_SOCKETS           = 436\n\tSYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438\n\tSYS_KAS_INFO                       = 439\n\tSYS_MEMORYSTATUS_CONTROL           = 440\n\tSYS_GUARDED_OPEN_NP                = 441\n\tSYS_GUARDED_CLOSE_NP               = 442\n\tSYS_GUARDED_KQUEUE_NP              = 443\n\tSYS_CHANGE_FDGUARD_NP              = 444\n\tSYS_USRCTL                         = 445\n\tSYS_PROC_RLIMIT_CONTROL            = 446\n\tSYS_CONNECTX                       = 447\n\tSYS_DISCONNECTX                    = 448\n\tSYS_PEELOFF                        = 449\n\tSYS_SOCKET_DELEGATE                = 450\n\tSYS_TELEMETRY                      = 451\n\tSYS_PROC_UUID_POLICY               = 452\n\tSYS_MEMORYSTATUS_GET_LEVEL         = 453\n\tSYS_SYSTEM_OVERRIDE                = 454\n\tSYS_VFS_PURGE                      = 455\n\tSYS_SFI_CTL                        = 456\n\tSYS_SFI_PIDCTL                     = 457\n\tSYS_COALITION                      = 458\n\tSYS_COALITION_INFO                 = 459\n\tSYS_NECP_MATCH_POLICY              = 460\n\tSYS_GETATTRLISTBULK                = 461\n\tSYS_CLONEFILEAT                    = 462\n\tSYS_OPENAT                         = 463\n\tSYS_OPENAT_NOCANCEL                = 464\n\tSYS_RENAMEAT                       = 465\n\tSYS_FACCESSAT                      = 466\n\tSYS_FCHMODAT                       = 467\n\tSYS_FCHOWNAT                       = 468\n\tSYS_FSTATAT                        = 469\n\tSYS_FSTATAT64                      = 470\n\tSYS_LINKAT                         = 471\n\tSYS_UNLINKAT                       = 472\n\tSYS_READLINKAT                     = 473\n\tSYS_SYMLINKAT                      = 474\n\tSYS_MKDIRAT                        = 475\n\tSYS_GETATTRLISTAT                  = 476\n\tSYS_PROC_TRACE_LOG                 = 477\n\tSYS_BSDTHREAD_CTL                  = 478\n\tSYS_OPENBYID_NP                    = 479\n\tSYS_RECVMSG_X                      = 480\n\tSYS_SENDMSG_X                      = 481\n\tSYS_THREAD_SELFUSAGE               = 482\n\tSYS_CSRCTL                         = 483\n\tSYS_GUARDED_OPEN_DPROTECTED_NP     = 484\n\tSYS_GUARDED_WRITE_NP               = 485\n\tSYS_GUARDED_PWRITE_NP              = 486\n\tSYS_GUARDED_WRITEV_NP              = 487\n\tSYS_RENAMEATX_NP                   = 488\n\tSYS_MREMAP_ENCRYPTED               = 489\n\tSYS_NETAGENT_TRIGGER               = 490\n\tSYS_STACK_SNAPSHOT_WITH_CONFIG     = 491\n\tSYS_MICROSTACKSHOT                 = 492\n\tSYS_GRAB_PGO_DATA                  = 493\n\tSYS_PERSONA                        = 494\n\tSYS_WORK_INTERVAL_CTL              = 499\n\tSYS_GETENTROPY                     = 500\n\tSYS_NECP_OPEN                      = 501\n\tSYS_NECP_CLIENT_ACTION             = 502\n\tSYS___NEXUS_OPEN                   = 503\n\tSYS___NEXUS_REGISTER               = 504\n\tSYS___NEXUS_DEREGISTER             = 505\n\tSYS___NEXUS_CREATE                 = 506\n\tSYS___NEXUS_DESTROY                = 507\n\tSYS___NEXUS_GET_OPT                = 508\n\tSYS___NEXUS_SET_OPT                = 509\n\tSYS___CHANNEL_OPEN                 = 510\n\tSYS___CHANNEL_GET_INFO             = 511\n\tSYS___CHANNEL_SYNC                 = 512\n\tSYS___CHANNEL_GET_OPT              = 513\n\tSYS___CHANNEL_SET_OPT              = 514\n\tSYS_ULOCK_WAIT                     = 515\n\tSYS_ULOCK_WAKE                     = 516\n\tSYS_FCLONEFILEAT                   = 517\n\tSYS_FS_SNAPSHOT                    = 518\n\tSYS_TERMINATE_WITH_PAYLOAD         = 520\n\tSYS_ABORT_WITH_PAYLOAD             = 521\n\tSYS_NECP_SESSION_OPEN              = 522\n\tSYS_NECP_SESSION_ACTION            = 523\n\tSYS_SETATTRLISTAT                  = 524\n\tSYS_NET_QOS_GUIDELINE              = 525\n\tSYS_FMOUNT                         = 526\n\tSYS_NTP_ADJTIME                    = 527\n\tSYS_NTP_GETTIME                    = 528\n\tSYS_OS_FAULT_WITH_PAYLOAD          = 529\n\tSYS_MAXSYSCALL                     = 530\n\tSYS_INVALID                        = 63\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go",
    "content": "// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm64,darwin\n\npackage unix\n\nconst (\n\tSYS_SYSCALL                        = 0\n\tSYS_EXIT                           = 1\n\tSYS_FORK                           = 2\n\tSYS_READ                           = 3\n\tSYS_WRITE                          = 4\n\tSYS_OPEN                           = 5\n\tSYS_CLOSE                          = 6\n\tSYS_WAIT4                          = 7\n\tSYS_LINK                           = 9\n\tSYS_UNLINK                         = 10\n\tSYS_CHDIR                          = 12\n\tSYS_FCHDIR                         = 13\n\tSYS_MKNOD                          = 14\n\tSYS_CHMOD                          = 15\n\tSYS_CHOWN                          = 16\n\tSYS_GETFSSTAT                      = 18\n\tSYS_GETPID                         = 20\n\tSYS_SETUID                         = 23\n\tSYS_GETUID                         = 24\n\tSYS_GETEUID                        = 25\n\tSYS_PTRACE                         = 26\n\tSYS_RECVMSG                        = 27\n\tSYS_SENDMSG                        = 28\n\tSYS_RECVFROM                       = 29\n\tSYS_ACCEPT                         = 30\n\tSYS_GETPEERNAME                    = 31\n\tSYS_GETSOCKNAME                    = 32\n\tSYS_ACCESS                         = 33\n\tSYS_CHFLAGS                        = 34\n\tSYS_FCHFLAGS                       = 35\n\tSYS_SYNC                           = 36\n\tSYS_KILL                           = 37\n\tSYS_GETPPID                        = 39\n\tSYS_DUP                            = 41\n\tSYS_PIPE                           = 42\n\tSYS_GETEGID                        = 43\n\tSYS_SIGACTION                      = 46\n\tSYS_GETGID                         = 47\n\tSYS_SIGPROCMASK                    = 48\n\tSYS_GETLOGIN                       = 49\n\tSYS_SETLOGIN                       = 50\n\tSYS_ACCT                           = 51\n\tSYS_SIGPENDING                     = 52\n\tSYS_SIGALTSTACK                    = 53\n\tSYS_IOCTL                          = 54\n\tSYS_REBOOT                         = 55\n\tSYS_REVOKE                         = 56\n\tSYS_SYMLINK                        = 57\n\tSYS_READLINK                       = 58\n\tSYS_EXECVE                         = 59\n\tSYS_UMASK                          = 60\n\tSYS_CHROOT                         = 61\n\tSYS_MSYNC                          = 65\n\tSYS_VFORK                          = 66\n\tSYS_MUNMAP                         = 73\n\tSYS_MPROTECT                       = 74\n\tSYS_MADVISE                        = 75\n\tSYS_MINCORE                        = 78\n\tSYS_GETGROUPS                      = 79\n\tSYS_SETGROUPS                      = 80\n\tSYS_GETPGRP                        = 81\n\tSYS_SETPGID                        = 82\n\tSYS_SETITIMER                      = 83\n\tSYS_SWAPON                         = 85\n\tSYS_GETITIMER                      = 86\n\tSYS_GETDTABLESIZE                  = 89\n\tSYS_DUP2                           = 90\n\tSYS_FCNTL                          = 92\n\tSYS_SELECT                         = 93\n\tSYS_FSYNC                          = 95\n\tSYS_SETPRIORITY                    = 96\n\tSYS_SOCKET                         = 97\n\tSYS_CONNECT                        = 98\n\tSYS_GETPRIORITY                    = 100\n\tSYS_BIND                           = 104\n\tSYS_SETSOCKOPT                     = 105\n\tSYS_LISTEN                         = 106\n\tSYS_SIGSUSPEND                     = 111\n\tSYS_GETTIMEOFDAY                   = 116\n\tSYS_GETRUSAGE                      = 117\n\tSYS_GETSOCKOPT                     = 118\n\tSYS_READV                          = 120\n\tSYS_WRITEV                         = 121\n\tSYS_SETTIMEOFDAY                   = 122\n\tSYS_FCHOWN                         = 123\n\tSYS_FCHMOD                         = 124\n\tSYS_SETREUID                       = 126\n\tSYS_SETREGID                       = 127\n\tSYS_RENAME                         = 128\n\tSYS_FLOCK                          = 131\n\tSYS_MKFIFO                         = 132\n\tSYS_SENDTO                         = 133\n\tSYS_SHUTDOWN                       = 134\n\tSYS_SOCKETPAIR                     = 135\n\tSYS_MKDIR                          = 136\n\tSYS_RMDIR                          = 137\n\tSYS_UTIMES                         = 138\n\tSYS_FUTIMES                        = 139\n\tSYS_ADJTIME                        = 140\n\tSYS_GETHOSTUUID                    = 142\n\tSYS_SETSID                         = 147\n\tSYS_GETPGID                        = 151\n\tSYS_SETPRIVEXEC                    = 152\n\tSYS_PREAD                          = 153\n\tSYS_PWRITE                         = 154\n\tSYS_NFSSVC                         = 155\n\tSYS_STATFS                         = 157\n\tSYS_FSTATFS                        = 158\n\tSYS_UNMOUNT                        = 159\n\tSYS_GETFH                          = 161\n\tSYS_QUOTACTL                       = 165\n\tSYS_MOUNT                          = 167\n\tSYS_CSOPS                          = 169\n\tSYS_CSOPS_AUDITTOKEN               = 170\n\tSYS_WAITID                         = 173\n\tSYS_KDEBUG_TYPEFILTER              = 177\n\tSYS_KDEBUG_TRACE_STRING            = 178\n\tSYS_KDEBUG_TRACE64                 = 179\n\tSYS_KDEBUG_TRACE                   = 180\n\tSYS_SETGID                         = 181\n\tSYS_SETEGID                        = 182\n\tSYS_SETEUID                        = 183\n\tSYS_SIGRETURN                      = 184\n\tSYS_THREAD_SELFCOUNTS              = 186\n\tSYS_FDATASYNC                      = 187\n\tSYS_STAT                           = 188\n\tSYS_FSTAT                          = 189\n\tSYS_LSTAT                          = 190\n\tSYS_PATHCONF                       = 191\n\tSYS_FPATHCONF                      = 192\n\tSYS_GETRLIMIT                      = 194\n\tSYS_SETRLIMIT                      = 195\n\tSYS_GETDIRENTRIES                  = 196\n\tSYS_MMAP                           = 197\n\tSYS_LSEEK                          = 199\n\tSYS_TRUNCATE                       = 200\n\tSYS_FTRUNCATE                      = 201\n\tSYS_SYSCTL                         = 202\n\tSYS_MLOCK                          = 203\n\tSYS_MUNLOCK                        = 204\n\tSYS_UNDELETE                       = 205\n\tSYS_OPEN_DPROTECTED_NP             = 216\n\tSYS_GETATTRLIST                    = 220\n\tSYS_SETATTRLIST                    = 221\n\tSYS_GETDIRENTRIESATTR              = 222\n\tSYS_EXCHANGEDATA                   = 223\n\tSYS_SEARCHFS                       = 225\n\tSYS_DELETE                         = 226\n\tSYS_COPYFILE                       = 227\n\tSYS_FGETATTRLIST                   = 228\n\tSYS_FSETATTRLIST                   = 229\n\tSYS_POLL                           = 230\n\tSYS_WATCHEVENT                     = 231\n\tSYS_WAITEVENT                      = 232\n\tSYS_MODWATCH                       = 233\n\tSYS_GETXATTR                       = 234\n\tSYS_FGETXATTR                      = 235\n\tSYS_SETXATTR                       = 236\n\tSYS_FSETXATTR                      = 237\n\tSYS_REMOVEXATTR                    = 238\n\tSYS_FREMOVEXATTR                   = 239\n\tSYS_LISTXATTR                      = 240\n\tSYS_FLISTXATTR                     = 241\n\tSYS_FSCTL                          = 242\n\tSYS_INITGROUPS                     = 243\n\tSYS_POSIX_SPAWN                    = 244\n\tSYS_FFSCTL                         = 245\n\tSYS_NFSCLNT                        = 247\n\tSYS_FHOPEN                         = 248\n\tSYS_MINHERIT                       = 250\n\tSYS_SEMSYS                         = 251\n\tSYS_MSGSYS                         = 252\n\tSYS_SHMSYS                         = 253\n\tSYS_SEMCTL                         = 254\n\tSYS_SEMGET                         = 255\n\tSYS_SEMOP                          = 256\n\tSYS_MSGCTL                         = 258\n\tSYS_MSGGET                         = 259\n\tSYS_MSGSND                         = 260\n\tSYS_MSGRCV                         = 261\n\tSYS_SHMAT                          = 262\n\tSYS_SHMCTL                         = 263\n\tSYS_SHMDT                          = 264\n\tSYS_SHMGET                         = 265\n\tSYS_SHM_OPEN                       = 266\n\tSYS_SHM_UNLINK                     = 267\n\tSYS_SEM_OPEN                       = 268\n\tSYS_SEM_CLOSE                      = 269\n\tSYS_SEM_UNLINK                     = 270\n\tSYS_SEM_WAIT                       = 271\n\tSYS_SEM_TRYWAIT                    = 272\n\tSYS_SEM_POST                       = 273\n\tSYS_SYSCTLBYNAME                   = 274\n\tSYS_OPEN_EXTENDED                  = 277\n\tSYS_UMASK_EXTENDED                 = 278\n\tSYS_STAT_EXTENDED                  = 279\n\tSYS_LSTAT_EXTENDED                 = 280\n\tSYS_FSTAT_EXTENDED                 = 281\n\tSYS_CHMOD_EXTENDED                 = 282\n\tSYS_FCHMOD_EXTENDED                = 283\n\tSYS_ACCESS_EXTENDED                = 284\n\tSYS_SETTID                         = 285\n\tSYS_GETTID                         = 286\n\tSYS_SETSGROUPS                     = 287\n\tSYS_GETSGROUPS                     = 288\n\tSYS_SETWGROUPS                     = 289\n\tSYS_GETWGROUPS                     = 290\n\tSYS_MKFIFO_EXTENDED                = 291\n\tSYS_MKDIR_EXTENDED                 = 292\n\tSYS_IDENTITYSVC                    = 293\n\tSYS_SHARED_REGION_CHECK_NP         = 294\n\tSYS_VM_PRESSURE_MONITOR            = 296\n\tSYS_PSYNCH_RW_LONGRDLOCK           = 297\n\tSYS_PSYNCH_RW_YIELDWRLOCK          = 298\n\tSYS_PSYNCH_RW_DOWNGRADE            = 299\n\tSYS_PSYNCH_RW_UPGRADE              = 300\n\tSYS_PSYNCH_MUTEXWAIT               = 301\n\tSYS_PSYNCH_MUTEXDROP               = 302\n\tSYS_PSYNCH_CVBROAD                 = 303\n\tSYS_PSYNCH_CVSIGNAL                = 304\n\tSYS_PSYNCH_CVWAIT                  = 305\n\tSYS_PSYNCH_RW_RDLOCK               = 306\n\tSYS_PSYNCH_RW_WRLOCK               = 307\n\tSYS_PSYNCH_RW_UNLOCK               = 308\n\tSYS_PSYNCH_RW_UNLOCK2              = 309\n\tSYS_GETSID                         = 310\n\tSYS_SETTID_WITH_PID                = 311\n\tSYS_PSYNCH_CVCLRPREPOST            = 312\n\tSYS_AIO_FSYNC                      = 313\n\tSYS_AIO_RETURN                     = 314\n\tSYS_AIO_SUSPEND                    = 315\n\tSYS_AIO_CANCEL                     = 316\n\tSYS_AIO_ERROR                      = 317\n\tSYS_AIO_READ                       = 318\n\tSYS_AIO_WRITE                      = 319\n\tSYS_LIO_LISTIO                     = 320\n\tSYS_IOPOLICYSYS                    = 322\n\tSYS_PROCESS_POLICY                 = 323\n\tSYS_MLOCKALL                       = 324\n\tSYS_MUNLOCKALL                     = 325\n\tSYS_ISSETUGID                      = 327\n\tSYS___PTHREAD_KILL                 = 328\n\tSYS___PTHREAD_SIGMASK              = 329\n\tSYS___SIGWAIT                      = 330\n\tSYS___DISABLE_THREADSIGNAL         = 331\n\tSYS___PTHREAD_MARKCANCEL           = 332\n\tSYS___PTHREAD_CANCELED             = 333\n\tSYS___SEMWAIT_SIGNAL               = 334\n\tSYS_PROC_INFO                      = 336\n\tSYS_SENDFILE                       = 337\n\tSYS_STAT64                         = 338\n\tSYS_FSTAT64                        = 339\n\tSYS_LSTAT64                        = 340\n\tSYS_STAT64_EXTENDED                = 341\n\tSYS_LSTAT64_EXTENDED               = 342\n\tSYS_FSTAT64_EXTENDED               = 343\n\tSYS_GETDIRENTRIES64                = 344\n\tSYS_STATFS64                       = 345\n\tSYS_FSTATFS64                      = 346\n\tSYS_GETFSSTAT64                    = 347\n\tSYS___PTHREAD_CHDIR                = 348\n\tSYS___PTHREAD_FCHDIR               = 349\n\tSYS_AUDIT                          = 350\n\tSYS_AUDITON                        = 351\n\tSYS_GETAUID                        = 353\n\tSYS_SETAUID                        = 354\n\tSYS_GETAUDIT_ADDR                  = 357\n\tSYS_SETAUDIT_ADDR                  = 358\n\tSYS_AUDITCTL                       = 359\n\tSYS_BSDTHREAD_CREATE               = 360\n\tSYS_BSDTHREAD_TERMINATE            = 361\n\tSYS_KQUEUE                         = 362\n\tSYS_KEVENT                         = 363\n\tSYS_LCHOWN                         = 364\n\tSYS_BSDTHREAD_REGISTER             = 366\n\tSYS_WORKQ_OPEN                     = 367\n\tSYS_WORKQ_KERNRETURN               = 368\n\tSYS_KEVENT64                       = 369\n\tSYS___OLD_SEMWAIT_SIGNAL           = 370\n\tSYS___OLD_SEMWAIT_SIGNAL_NOCANCEL  = 371\n\tSYS_THREAD_SELFID                  = 372\n\tSYS_LEDGER                         = 373\n\tSYS_KEVENT_QOS                     = 374\n\tSYS_KEVENT_ID                      = 375\n\tSYS___MAC_EXECVE                   = 380\n\tSYS___MAC_SYSCALL                  = 381\n\tSYS___MAC_GET_FILE                 = 382\n\tSYS___MAC_SET_FILE                 = 383\n\tSYS___MAC_GET_LINK                 = 384\n\tSYS___MAC_SET_LINK                 = 385\n\tSYS___MAC_GET_PROC                 = 386\n\tSYS___MAC_SET_PROC                 = 387\n\tSYS___MAC_GET_FD                   = 388\n\tSYS___MAC_SET_FD                   = 389\n\tSYS___MAC_GET_PID                  = 390\n\tSYS_PSELECT                        = 394\n\tSYS_PSELECT_NOCANCEL               = 395\n\tSYS_READ_NOCANCEL                  = 396\n\tSYS_WRITE_NOCANCEL                 = 397\n\tSYS_OPEN_NOCANCEL                  = 398\n\tSYS_CLOSE_NOCANCEL                 = 399\n\tSYS_WAIT4_NOCANCEL                 = 400\n\tSYS_RECVMSG_NOCANCEL               = 401\n\tSYS_SENDMSG_NOCANCEL               = 402\n\tSYS_RECVFROM_NOCANCEL              = 403\n\tSYS_ACCEPT_NOCANCEL                = 404\n\tSYS_MSYNC_NOCANCEL                 = 405\n\tSYS_FCNTL_NOCANCEL                 = 406\n\tSYS_SELECT_NOCANCEL                = 407\n\tSYS_FSYNC_NOCANCEL                 = 408\n\tSYS_CONNECT_NOCANCEL               = 409\n\tSYS_SIGSUSPEND_NOCANCEL            = 410\n\tSYS_READV_NOCANCEL                 = 411\n\tSYS_WRITEV_NOCANCEL                = 412\n\tSYS_SENDTO_NOCANCEL                = 413\n\tSYS_PREAD_NOCANCEL                 = 414\n\tSYS_PWRITE_NOCANCEL                = 415\n\tSYS_WAITID_NOCANCEL                = 416\n\tSYS_POLL_NOCANCEL                  = 417\n\tSYS_MSGSND_NOCANCEL                = 418\n\tSYS_MSGRCV_NOCANCEL                = 419\n\tSYS_SEM_WAIT_NOCANCEL              = 420\n\tSYS_AIO_SUSPEND_NOCANCEL           = 421\n\tSYS___SIGWAIT_NOCANCEL             = 422\n\tSYS___SEMWAIT_SIGNAL_NOCANCEL      = 423\n\tSYS___MAC_MOUNT                    = 424\n\tSYS___MAC_GET_MOUNT                = 425\n\tSYS___MAC_GETFSSTAT                = 426\n\tSYS_FSGETPATH                      = 427\n\tSYS_AUDIT_SESSION_SELF             = 428\n\tSYS_AUDIT_SESSION_JOIN             = 429\n\tSYS_FILEPORT_MAKEPORT              = 430\n\tSYS_FILEPORT_MAKEFD                = 431\n\tSYS_AUDIT_SESSION_PORT             = 432\n\tSYS_PID_SUSPEND                    = 433\n\tSYS_PID_RESUME                     = 434\n\tSYS_PID_HIBERNATE                  = 435\n\tSYS_PID_SHUTDOWN_SOCKETS           = 436\n\tSYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438\n\tSYS_KAS_INFO                       = 439\n\tSYS_MEMORYSTATUS_CONTROL           = 440\n\tSYS_GUARDED_OPEN_NP                = 441\n\tSYS_GUARDED_CLOSE_NP               = 442\n\tSYS_GUARDED_KQUEUE_NP              = 443\n\tSYS_CHANGE_FDGUARD_NP              = 444\n\tSYS_USRCTL                         = 445\n\tSYS_PROC_RLIMIT_CONTROL            = 446\n\tSYS_CONNECTX                       = 447\n\tSYS_DISCONNECTX                    = 448\n\tSYS_PEELOFF                        = 449\n\tSYS_SOCKET_DELEGATE                = 450\n\tSYS_TELEMETRY                      = 451\n\tSYS_PROC_UUID_POLICY               = 452\n\tSYS_MEMORYSTATUS_GET_LEVEL         = 453\n\tSYS_SYSTEM_OVERRIDE                = 454\n\tSYS_VFS_PURGE                      = 455\n\tSYS_SFI_CTL                        = 456\n\tSYS_SFI_PIDCTL                     = 457\n\tSYS_COALITION                      = 458\n\tSYS_COALITION_INFO                 = 459\n\tSYS_NECP_MATCH_POLICY              = 460\n\tSYS_GETATTRLISTBULK                = 461\n\tSYS_CLONEFILEAT                    = 462\n\tSYS_OPENAT                         = 463\n\tSYS_OPENAT_NOCANCEL                = 464\n\tSYS_RENAMEAT                       = 465\n\tSYS_FACCESSAT                      = 466\n\tSYS_FCHMODAT                       = 467\n\tSYS_FCHOWNAT                       = 468\n\tSYS_FSTATAT                        = 469\n\tSYS_FSTATAT64                      = 470\n\tSYS_LINKAT                         = 471\n\tSYS_UNLINKAT                       = 472\n\tSYS_READLINKAT                     = 473\n\tSYS_SYMLINKAT                      = 474\n\tSYS_MKDIRAT                        = 475\n\tSYS_GETATTRLISTAT                  = 476\n\tSYS_PROC_TRACE_LOG                 = 477\n\tSYS_BSDTHREAD_CTL                  = 478\n\tSYS_OPENBYID_NP                    = 479\n\tSYS_RECVMSG_X                      = 480\n\tSYS_SENDMSG_X                      = 481\n\tSYS_THREAD_SELFUSAGE               = 482\n\tSYS_CSRCTL                         = 483\n\tSYS_GUARDED_OPEN_DPROTECTED_NP     = 484\n\tSYS_GUARDED_WRITE_NP               = 485\n\tSYS_GUARDED_PWRITE_NP              = 486\n\tSYS_GUARDED_WRITEV_NP              = 487\n\tSYS_RENAMEATX_NP                   = 488\n\tSYS_MREMAP_ENCRYPTED               = 489\n\tSYS_NETAGENT_TRIGGER               = 490\n\tSYS_STACK_SNAPSHOT_WITH_CONFIG     = 491\n\tSYS_MICROSTACKSHOT                 = 492\n\tSYS_GRAB_PGO_DATA                  = 493\n\tSYS_PERSONA                        = 494\n\tSYS_WORK_INTERVAL_CTL              = 499\n\tSYS_GETENTROPY                     = 500\n\tSYS_NECP_OPEN                      = 501\n\tSYS_NECP_CLIENT_ACTION             = 502\n\tSYS___NEXUS_OPEN                   = 503\n\tSYS___NEXUS_REGISTER               = 504\n\tSYS___NEXUS_DEREGISTER             = 505\n\tSYS___NEXUS_CREATE                 = 506\n\tSYS___NEXUS_DESTROY                = 507\n\tSYS___NEXUS_GET_OPT                = 508\n\tSYS___NEXUS_SET_OPT                = 509\n\tSYS___CHANNEL_OPEN                 = 510\n\tSYS___CHANNEL_GET_INFO             = 511\n\tSYS___CHANNEL_SYNC                 = 512\n\tSYS___CHANNEL_GET_OPT              = 513\n\tSYS___CHANNEL_SET_OPT              = 514\n\tSYS_ULOCK_WAIT                     = 515\n\tSYS_ULOCK_WAKE                     = 516\n\tSYS_FCLONEFILEAT                   = 517\n\tSYS_FS_SNAPSHOT                    = 518\n\tSYS_TERMINATE_WITH_PAYLOAD         = 520\n\tSYS_ABORT_WITH_PAYLOAD             = 521\n\tSYS_NECP_SESSION_OPEN              = 522\n\tSYS_NECP_SESSION_ACTION            = 523\n\tSYS_SETATTRLISTAT                  = 524\n\tSYS_NET_QOS_GUIDELINE              = 525\n\tSYS_FMOUNT                         = 526\n\tSYS_NTP_ADJTIME                    = 527\n\tSYS_NTP_GETTIME                    = 528\n\tSYS_OS_FAULT_WITH_PAYLOAD          = 529\n\tSYS_MAXSYSCALL                     = 530\n\tSYS_INVALID                        = 63\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go",
    "content": "// mksysnum_dragonfly.pl\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,dragonfly\n\npackage unix\n\nconst (\n\t// SYS_NOSYS = 0;  // { int nosys(void); } syscall nosys_args int\n\tSYS_EXIT          = 1   // { void exit(int rval); }\n\tSYS_FORK          = 2   // { int fork(void); }\n\tSYS_READ          = 3   // { ssize_t read(int fd, void *buf, size_t nbyte); }\n\tSYS_WRITE         = 4   // { ssize_t write(int fd, const void *buf, size_t nbyte); }\n\tSYS_OPEN          = 5   // { int open(char *path, int flags, int mode); }\n\tSYS_CLOSE         = 6   // { int close(int fd); }\n\tSYS_WAIT4         = 7   // { int wait4(int pid, int *status, int options, \\\n\tSYS_LINK          = 9   // { int link(char *path, char *link); }\n\tSYS_UNLINK        = 10  // { int unlink(char *path); }\n\tSYS_CHDIR         = 12  // { int chdir(char *path); }\n\tSYS_FCHDIR        = 13  // { int fchdir(int fd); }\n\tSYS_MKNOD         = 14  // { int mknod(char *path, int mode, int dev); }\n\tSYS_CHMOD         = 15  // { int chmod(char *path, int mode); }\n\tSYS_CHOWN         = 16  // { int chown(char *path, int uid, int gid); }\n\tSYS_OBREAK        = 17  // { int obreak(char *nsize); } break obreak_args int\n\tSYS_GETFSSTAT     = 18  // { int getfsstat(struct statfs *buf, long bufsize, \\\n\tSYS_GETPID        = 20  // { pid_t getpid(void); }\n\tSYS_MOUNT         = 21  // { int mount(char *type, char *path, int flags, \\\n\tSYS_UNMOUNT       = 22  // { int unmount(char *path, int flags); }\n\tSYS_SETUID        = 23  // { int setuid(uid_t uid); }\n\tSYS_GETUID        = 24  // { uid_t getuid(void); }\n\tSYS_GETEUID       = 25  // { uid_t geteuid(void); }\n\tSYS_PTRACE        = 26  // { int ptrace(int req, pid_t pid, caddr_t addr, \\\n\tSYS_RECVMSG       = 27  // { int recvmsg(int s, struct msghdr *msg, int flags); }\n\tSYS_SENDMSG       = 28  // { int sendmsg(int s, caddr_t msg, int flags); }\n\tSYS_RECVFROM      = 29  // { int recvfrom(int s, caddr_t buf, size_t len, \\\n\tSYS_ACCEPT        = 30  // { int accept(int s, caddr_t name, int *anamelen); }\n\tSYS_GETPEERNAME   = 31  // { int getpeername(int fdes, caddr_t asa, int *alen); }\n\tSYS_GETSOCKNAME   = 32  // { int getsockname(int fdes, caddr_t asa, int *alen); }\n\tSYS_ACCESS        = 33  // { int access(char *path, int flags); }\n\tSYS_CHFLAGS       = 34  // { int chflags(char *path, int flags); }\n\tSYS_FCHFLAGS      = 35  // { int fchflags(int fd, int flags); }\n\tSYS_SYNC          = 36  // { int sync(void); }\n\tSYS_KILL          = 37  // { int kill(int pid, int signum); }\n\tSYS_GETPPID       = 39  // { pid_t getppid(void); }\n\tSYS_DUP           = 41  // { int dup(int fd); }\n\tSYS_PIPE          = 42  // { int pipe(void); }\n\tSYS_GETEGID       = 43  // { gid_t getegid(void); }\n\tSYS_PROFIL        = 44  // { int profil(caddr_t samples, size_t size, \\\n\tSYS_KTRACE        = 45  // { int ktrace(const char *fname, int ops, int facs, \\\n\tSYS_GETGID        = 47  // { gid_t getgid(void); }\n\tSYS_GETLOGIN      = 49  // { int getlogin(char *namebuf, u_int namelen); }\n\tSYS_SETLOGIN      = 50  // { int setlogin(char *namebuf); }\n\tSYS_ACCT          = 51  // { int acct(char *path); }\n\tSYS_SIGALTSTACK   = 53  // { int sigaltstack(stack_t *ss, stack_t *oss); }\n\tSYS_IOCTL         = 54  // { int ioctl(int fd, u_long com, caddr_t data); }\n\tSYS_REBOOT        = 55  // { int reboot(int opt); }\n\tSYS_REVOKE        = 56  // { int revoke(char *path); }\n\tSYS_SYMLINK       = 57  // { int symlink(char *path, char *link); }\n\tSYS_READLINK      = 58  // { int readlink(char *path, char *buf, int count); }\n\tSYS_EXECVE        = 59  // { int execve(char *fname, char **argv, char **envv); }\n\tSYS_UMASK         = 60  // { int umask(int newmask); } umask umask_args int\n\tSYS_CHROOT        = 61  // { int chroot(char *path); }\n\tSYS_MSYNC         = 65  // { int msync(void *addr, size_t len, int flags); }\n\tSYS_VFORK         = 66  // { pid_t vfork(void); }\n\tSYS_SBRK          = 69  // { int sbrk(int incr); }\n\tSYS_SSTK          = 70  // { int sstk(int incr); }\n\tSYS_MUNMAP        = 73  // { int munmap(void *addr, size_t len); }\n\tSYS_MPROTECT      = 74  // { int mprotect(void *addr, size_t len, int prot); }\n\tSYS_MADVISE       = 75  // { int madvise(void *addr, size_t len, int behav); }\n\tSYS_MINCORE       = 78  // { int mincore(const void *addr, size_t len, \\\n\tSYS_GETGROUPS     = 79  // { int getgroups(u_int gidsetsize, gid_t *gidset); }\n\tSYS_SETGROUPS     = 80  // { int setgroups(u_int gidsetsize, gid_t *gidset); }\n\tSYS_GETPGRP       = 81  // { int getpgrp(void); }\n\tSYS_SETPGID       = 82  // { int setpgid(int pid, int pgid); }\n\tSYS_SETITIMER     = 83  // { int setitimer(u_int which, struct itimerval *itv, \\\n\tSYS_SWAPON        = 85  // { int swapon(char *name); }\n\tSYS_GETITIMER     = 86  // { int getitimer(u_int which, struct itimerval *itv); }\n\tSYS_GETDTABLESIZE = 89  // { int getdtablesize(void); }\n\tSYS_DUP2          = 90  // { int dup2(int from, int to); }\n\tSYS_FCNTL         = 92  // { int fcntl(int fd, int cmd, long arg); }\n\tSYS_SELECT        = 93  // { int select(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_FSYNC         = 95  // { int fsync(int fd); }\n\tSYS_SETPRIORITY   = 96  // { int setpriority(int which, int who, int prio); }\n\tSYS_SOCKET        = 97  // { int socket(int domain, int type, int protocol); }\n\tSYS_CONNECT       = 98  // { int connect(int s, caddr_t name, int namelen); }\n\tSYS_GETPRIORITY   = 100 // { int getpriority(int which, int who); }\n\tSYS_BIND          = 104 // { int bind(int s, caddr_t name, int namelen); }\n\tSYS_SETSOCKOPT    = 105 // { int setsockopt(int s, int level, int name, \\\n\tSYS_LISTEN        = 106 // { int listen(int s, int backlog); }\n\tSYS_GETTIMEOFDAY  = 116 // { int gettimeofday(struct timeval *tp, \\\n\tSYS_GETRUSAGE     = 117 // { int getrusage(int who, struct rusage *rusage); }\n\tSYS_GETSOCKOPT    = 118 // { int getsockopt(int s, int level, int name, \\\n\tSYS_READV         = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); }\n\tSYS_WRITEV        = 121 // { int writev(int fd, struct iovec *iovp, \\\n\tSYS_SETTIMEOFDAY  = 122 // { int settimeofday(struct timeval *tv, \\\n\tSYS_FCHOWN        = 123 // { int fchown(int fd, int uid, int gid); }\n\tSYS_FCHMOD        = 124 // { int fchmod(int fd, int mode); }\n\tSYS_SETREUID      = 126 // { int setreuid(int ruid, int euid); }\n\tSYS_SETREGID      = 127 // { int setregid(int rgid, int egid); }\n\tSYS_RENAME        = 128 // { int rename(char *from, char *to); }\n\tSYS_FLOCK         = 131 // { int flock(int fd, int how); }\n\tSYS_MKFIFO        = 132 // { int mkfifo(char *path, int mode); }\n\tSYS_SENDTO        = 133 // { int sendto(int s, caddr_t buf, size_t len, \\\n\tSYS_SHUTDOWN      = 134 // { int shutdown(int s, int how); }\n\tSYS_SOCKETPAIR    = 135 // { int socketpair(int domain, int type, int protocol, \\\n\tSYS_MKDIR         = 136 // { int mkdir(char *path, int mode); }\n\tSYS_RMDIR         = 137 // { int rmdir(char *path); }\n\tSYS_UTIMES        = 138 // { int utimes(char *path, struct timeval *tptr); }\n\tSYS_ADJTIME       = 140 // { int adjtime(struct timeval *delta, \\\n\tSYS_SETSID        = 147 // { int setsid(void); }\n\tSYS_QUOTACTL      = 148 // { int quotactl(char *path, int cmd, int uid, \\\n\tSYS_STATFS        = 157 // { int statfs(char *path, struct statfs *buf); }\n\tSYS_FSTATFS       = 158 // { int fstatfs(int fd, struct statfs *buf); }\n\tSYS_GETFH         = 161 // { int getfh(char *fname, struct fhandle *fhp); }\n\tSYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); }\n\tSYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); }\n\tSYS_UNAME         = 164 // { int uname(struct utsname *name); }\n\tSYS_SYSARCH       = 165 // { int sysarch(int op, char *parms); }\n\tSYS_RTPRIO        = 166 // { int rtprio(int function, pid_t pid, \\\n\tSYS_EXTPREAD      = 173 // { ssize_t extpread(int fd, void *buf, \\\n\tSYS_EXTPWRITE     = 174 // { ssize_t extpwrite(int fd, const void *buf, \\\n\tSYS_NTP_ADJTIME   = 176 // { int ntp_adjtime(struct timex *tp); }\n\tSYS_SETGID        = 181 // { int setgid(gid_t gid); }\n\tSYS_SETEGID       = 182 // { int setegid(gid_t egid); }\n\tSYS_SETEUID       = 183 // { int seteuid(uid_t euid); }\n\tSYS_PATHCONF      = 191 // { int pathconf(char *path, int name); }\n\tSYS_FPATHCONF     = 192 // { int fpathconf(int fd, int name); }\n\tSYS_GETRLIMIT     = 194 // { int getrlimit(u_int which, \\\n\tSYS_SETRLIMIT     = 195 // { int setrlimit(u_int which, \\\n\tSYS_MMAP          = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, \\\n\t// SYS_NOSYS = 198;  // { int nosys(void); } __syscall __syscall_args int\n\tSYS_LSEEK                  = 199 // { off_t lseek(int fd, int pad, off_t offset, \\\n\tSYS_TRUNCATE               = 200 // { int truncate(char *path, int pad, off_t length); }\n\tSYS_FTRUNCATE              = 201 // { int ftruncate(int fd, int pad, off_t length); }\n\tSYS___SYSCTL               = 202 // { int __sysctl(int *name, u_int namelen, void *old, \\\n\tSYS_MLOCK                  = 203 // { int mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK                = 204 // { int munlock(const void *addr, size_t len); }\n\tSYS_UNDELETE               = 205 // { int undelete(char *path); }\n\tSYS_FUTIMES                = 206 // { int futimes(int fd, struct timeval *tptr); }\n\tSYS_GETPGID                = 207 // { int getpgid(pid_t pid); }\n\tSYS_POLL                   = 209 // { int poll(struct pollfd *fds, u_int nfds, \\\n\tSYS___SEMCTL               = 220 // { int __semctl(int semid, int semnum, int cmd, \\\n\tSYS_SEMGET                 = 221 // { int semget(key_t key, int nsems, int semflg); }\n\tSYS_SEMOP                  = 222 // { int semop(int semid, struct sembuf *sops, \\\n\tSYS_MSGCTL                 = 224 // { int msgctl(int msqid, int cmd, \\\n\tSYS_MSGGET                 = 225 // { int msgget(key_t key, int msgflg); }\n\tSYS_MSGSND                 = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, \\\n\tSYS_MSGRCV                 = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \\\n\tSYS_SHMAT                  = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \\\n\tSYS_SHMCTL                 = 229 // { int shmctl(int shmid, int cmd, \\\n\tSYS_SHMDT                  = 230 // { int shmdt(const void *shmaddr); }\n\tSYS_SHMGET                 = 231 // { int shmget(key_t key, size_t size, int shmflg); }\n\tSYS_CLOCK_GETTIME          = 232 // { int clock_gettime(clockid_t clock_id, \\\n\tSYS_CLOCK_SETTIME          = 233 // { int clock_settime(clockid_t clock_id, \\\n\tSYS_CLOCK_GETRES           = 234 // { int clock_getres(clockid_t clock_id, \\\n\tSYS_NANOSLEEP              = 240 // { int nanosleep(const struct timespec *rqtp, \\\n\tSYS_MINHERIT               = 250 // { int minherit(void *addr, size_t len, int inherit); }\n\tSYS_RFORK                  = 251 // { int rfork(int flags); }\n\tSYS_OPENBSD_POLL           = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, \\\n\tSYS_ISSETUGID              = 253 // { int issetugid(void); }\n\tSYS_LCHOWN                 = 254 // { int lchown(char *path, int uid, int gid); }\n\tSYS_LCHMOD                 = 274 // { int lchmod(char *path, mode_t mode); }\n\tSYS_LUTIMES                = 276 // { int lutimes(char *path, struct timeval *tptr); }\n\tSYS_EXTPREADV              = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, \\\n\tSYS_EXTPWRITEV             = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,\\\n\tSYS_FHSTATFS               = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }\n\tSYS_FHOPEN                 = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); }\n\tSYS_MODNEXT                = 300 // { int modnext(int modid); }\n\tSYS_MODSTAT                = 301 // { int modstat(int modid, struct module_stat* stat); }\n\tSYS_MODFNEXT               = 302 // { int modfnext(int modid); }\n\tSYS_MODFIND                = 303 // { int modfind(const char *name); }\n\tSYS_KLDLOAD                = 304 // { int kldload(const char *file); }\n\tSYS_KLDUNLOAD              = 305 // { int kldunload(int fileid); }\n\tSYS_KLDFIND                = 306 // { int kldfind(const char *file); }\n\tSYS_KLDNEXT                = 307 // { int kldnext(int fileid); }\n\tSYS_KLDSTAT                = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); }\n\tSYS_KLDFIRSTMOD            = 309 // { int kldfirstmod(int fileid); }\n\tSYS_GETSID                 = 310 // { int getsid(pid_t pid); }\n\tSYS_SETRESUID              = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }\n\tSYS_SETRESGID              = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }\n\tSYS_AIO_RETURN             = 314 // { int aio_return(struct aiocb *aiocbp); }\n\tSYS_AIO_SUSPEND            = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }\n\tSYS_AIO_CANCEL             = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); }\n\tSYS_AIO_ERROR              = 317 // { int aio_error(struct aiocb *aiocbp); }\n\tSYS_AIO_READ               = 318 // { int aio_read(struct aiocb *aiocbp); }\n\tSYS_AIO_WRITE              = 319 // { int aio_write(struct aiocb *aiocbp); }\n\tSYS_LIO_LISTIO             = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); }\n\tSYS_YIELD                  = 321 // { int yield(void); }\n\tSYS_MLOCKALL               = 324 // { int mlockall(int how); }\n\tSYS_MUNLOCKALL             = 325 // { int munlockall(void); }\n\tSYS___GETCWD               = 326 // { int __getcwd(u_char *buf, u_int buflen); }\n\tSYS_SCHED_SETPARAM         = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); }\n\tSYS_SCHED_GETPARAM         = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); }\n\tSYS_SCHED_SETSCHEDULER     = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); }\n\tSYS_SCHED_GETSCHEDULER     = 330 // { int sched_getscheduler (pid_t pid); }\n\tSYS_SCHED_YIELD            = 331 // { int sched_yield (void); }\n\tSYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }\n\tSYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }\n\tSYS_SCHED_RR_GET_INTERVAL  = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); }\n\tSYS_UTRACE                 = 335 // { int utrace(const void *addr, size_t len); }\n\tSYS_KLDSYM                 = 337 // { int kldsym(int fileid, int cmd, void *data); }\n\tSYS_JAIL                   = 338 // { int jail(struct jail *jail); }\n\tSYS_SIGPROCMASK            = 340 // { int sigprocmask(int how, const sigset_t *set, \\\n\tSYS_SIGSUSPEND             = 341 // { int sigsuspend(const sigset_t *sigmask); }\n\tSYS_SIGACTION              = 342 // { int sigaction(int sig, const struct sigaction *act, \\\n\tSYS_SIGPENDING             = 343 // { int sigpending(sigset_t *set); }\n\tSYS_SIGRETURN              = 344 // { int sigreturn(ucontext_t *sigcntxp); }\n\tSYS_SIGTIMEDWAIT           = 345 // { int sigtimedwait(const sigset_t *set,\\\n\tSYS_SIGWAITINFO            = 346 // { int sigwaitinfo(const sigset_t *set,\\\n\tSYS___ACL_GET_FILE         = 347 // { int __acl_get_file(const char *path, \\\n\tSYS___ACL_SET_FILE         = 348 // { int __acl_set_file(const char *path, \\\n\tSYS___ACL_GET_FD           = 349 // { int __acl_get_fd(int filedes, acl_type_t type, \\\n\tSYS___ACL_SET_FD           = 350 // { int __acl_set_fd(int filedes, acl_type_t type, \\\n\tSYS___ACL_DELETE_FILE      = 351 // { int __acl_delete_file(const char *path, \\\n\tSYS___ACL_DELETE_FD        = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); }\n\tSYS___ACL_ACLCHECK_FILE    = 353 // { int __acl_aclcheck_file(const char *path, \\\n\tSYS___ACL_ACLCHECK_FD      = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, \\\n\tSYS_EXTATTRCTL             = 355 // { int extattrctl(const char *path, int cmd, \\\n\tSYS_EXTATTR_SET_FILE       = 356 // { int extattr_set_file(const char *path, \\\n\tSYS_EXTATTR_GET_FILE       = 357 // { int extattr_get_file(const char *path, \\\n\tSYS_EXTATTR_DELETE_FILE    = 358 // { int extattr_delete_file(const char *path, \\\n\tSYS_AIO_WAITCOMPLETE       = 359 // { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); }\n\tSYS_GETRESUID              = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }\n\tSYS_GETRESGID              = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }\n\tSYS_KQUEUE                 = 362 // { int kqueue(void); }\n\tSYS_KEVENT                 = 363 // { int kevent(int fd, \\\n\tSYS_KENV                   = 390 // { int kenv(int what, const char *name, char *value, int len); }\n\tSYS_LCHFLAGS               = 391 // { int lchflags(char *path, int flags); }\n\tSYS_UUIDGEN                = 392 // { int uuidgen(struct uuid *store, int count); }\n\tSYS_SENDFILE               = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \\\n\tSYS_VARSYM_SET             = 450 // { int varsym_set(int level, const char *name, const char *data); }\n\tSYS_VARSYM_GET             = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); }\n\tSYS_VARSYM_LIST            = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); }\n\tSYS_EXEC_SYS_REGISTER      = 465 // { int exec_sys_register(void *entry); }\n\tSYS_EXEC_SYS_UNREGISTER    = 466 // { int exec_sys_unregister(int id); }\n\tSYS_SYS_CHECKPOINT         = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); }\n\tSYS_MOUNTCTL               = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); }\n\tSYS_UMTX_SLEEP             = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); }\n\tSYS_UMTX_WAKEUP            = 470 // { int umtx_wakeup(volatile const int *ptr, int count); }\n\tSYS_JAIL_ATTACH            = 471 // { int jail_attach(int jid); }\n\tSYS_SET_TLS_AREA           = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); }\n\tSYS_GET_TLS_AREA           = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); }\n\tSYS_CLOSEFROM              = 474 // { int closefrom(int fd); }\n\tSYS_STAT                   = 475 // { int stat(const char *path, struct stat *ub); }\n\tSYS_FSTAT                  = 476 // { int fstat(int fd, struct stat *sb); }\n\tSYS_LSTAT                  = 477 // { int lstat(const char *path, struct stat *ub); }\n\tSYS_FHSTAT                 = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }\n\tSYS_GETDIRENTRIES          = 479 // { int getdirentries(int fd, char *buf, u_int count, \\\n\tSYS_GETDENTS               = 480 // { int getdents(int fd, char *buf, size_t count); }\n\tSYS_USCHED_SET             = 481 // { int usched_set(pid_t pid, int cmd, void *data, \\\n\tSYS_EXTACCEPT              = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); }\n\tSYS_EXTCONNECT             = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); }\n\tSYS_MCONTROL               = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); }\n\tSYS_VMSPACE_CREATE         = 486 // { int vmspace_create(void *id, int type, void *data); }\n\tSYS_VMSPACE_DESTROY        = 487 // { int vmspace_destroy(void *id); }\n\tSYS_VMSPACE_CTL            = 488 // { int vmspace_ctl(void *id, int cmd, \t\t\\\n\tSYS_VMSPACE_MMAP           = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, \\\n\tSYS_VMSPACE_MUNMAP         = 490 // { int vmspace_munmap(void *id, void *addr,\t\\\n\tSYS_VMSPACE_MCONTROL       = 491 // { int vmspace_mcontrol(void *id, void *addr, \t\\\n\tSYS_VMSPACE_PREAD          = 492 // { ssize_t vmspace_pread(void *id, void *buf, \\\n\tSYS_VMSPACE_PWRITE         = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, \\\n\tSYS_EXTEXIT                = 494 // { void extexit(int how, int status, void *addr); }\n\tSYS_LWP_CREATE             = 495 // { int lwp_create(struct lwp_params *params); }\n\tSYS_LWP_GETTID             = 496 // { lwpid_t lwp_gettid(void); }\n\tSYS_LWP_KILL               = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); }\n\tSYS_LWP_RTPRIO             = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); }\n\tSYS_PSELECT                = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_STATVFS                = 500 // { int statvfs(const char *path, struct statvfs *buf); }\n\tSYS_FSTATVFS               = 501 // { int fstatvfs(int fd, struct statvfs *buf); }\n\tSYS_FHSTATVFS              = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); }\n\tSYS_GETVFSSTAT             = 503 // { int getvfsstat(struct statfs *buf,          \\\n\tSYS_OPENAT                 = 504 // { int openat(int fd, char *path, int flags, int mode); }\n\tSYS_FSTATAT                = 505 // { int fstatat(int fd, char *path, \t\\\n\tSYS_FCHMODAT               = 506 // { int fchmodat(int fd, char *path, int mode, \\\n\tSYS_FCHOWNAT               = 507 // { int fchownat(int fd, char *path, int uid, int gid, \\\n\tSYS_UNLINKAT               = 508 // { int unlinkat(int fd, char *path, int flags); }\n\tSYS_FACCESSAT              = 509 // { int faccessat(int fd, char *path, int amode, \\\n\tSYS_MQ_OPEN                = 510 // { mqd_t mq_open(const char * name, int oflag, \\\n\tSYS_MQ_CLOSE               = 511 // { int mq_close(mqd_t mqdes); }\n\tSYS_MQ_UNLINK              = 512 // { int mq_unlink(const char *name); }\n\tSYS_MQ_GETATTR             = 513 // { int mq_getattr(mqd_t mqdes, \\\n\tSYS_MQ_SETATTR             = 514 // { int mq_setattr(mqd_t mqdes, \\\n\tSYS_MQ_NOTIFY              = 515 // { int mq_notify(mqd_t mqdes, \\\n\tSYS_MQ_SEND                = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, \\\n\tSYS_MQ_RECEIVE             = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, \\\n\tSYS_MQ_TIMEDSEND           = 518 // { int mq_timedsend(mqd_t mqdes, \\\n\tSYS_MQ_TIMEDRECEIVE        = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, \\\n\tSYS_IOPRIO_SET             = 520 // { int ioprio_set(int which, int who, int prio); }\n\tSYS_IOPRIO_GET             = 521 // { int ioprio_get(int which, int who); }\n\tSYS_CHROOT_KERNEL          = 522 // { int chroot_kernel(char *path); }\n\tSYS_RENAMEAT               = 523 // { int renameat(int oldfd, char *old, int newfd, \\\n\tSYS_MKDIRAT                = 524 // { int mkdirat(int fd, char *path, mode_t mode); }\n\tSYS_MKFIFOAT               = 525 // { int mkfifoat(int fd, char *path, mode_t mode); }\n\tSYS_MKNODAT                = 526 // { int mknodat(int fd, char *path, mode_t mode, \\\n\tSYS_READLINKAT             = 527 // { int readlinkat(int fd, char *path, char *buf, \\\n\tSYS_SYMLINKAT              = 528 // { int symlinkat(char *path1, int fd, char *path2); }\n\tSYS_SWAPOFF                = 529 // { int swapoff(char *name); }\n\tSYS_VQUOTACTL              = 530 // { int vquotactl(const char *path, \\\n\tSYS_LINKAT                 = 531 // { int linkat(int fd1, char *path1, int fd2, \\\n\tSYS_EACCESS                = 532 // { int eaccess(char *path, int flags); }\n\tSYS_LPATHCONF              = 533 // { int lpathconf(char *path, int name); }\n\tSYS_VMM_GUEST_CTL          = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); }\n\tSYS_VMM_GUEST_SYNC_ADDR    = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); }\n\tSYS_PROCCTL                = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); }\n\tSYS_CHFLAGSAT              = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);}\n\tSYS_PIPE2                  = 538 // { int pipe2(int *fildes, int flags); }\n\tSYS_UTIMENSAT              = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); }\n\tSYS_FUTIMENS               = 540 // { int futimens(int fd, const struct timespec *ts); }\n\tSYS_ACCEPT4                = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); }\n\tSYS_LWP_SETNAME            = 542 // { int lwp_setname(lwpid_t tid, const char *name); }\n\tSYS_PPOLL                  = 543 // { int ppoll(struct pollfd *fds, u_int nfds, \\\n\tSYS_LWP_SETAFFINITY        = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); }\n\tSYS_LWP_GETAFFINITY        = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); }\n\tSYS_LWP_CREATE2            = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); }\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go",
    "content": "// mksysnum_freebsd.pl\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,freebsd\n\npackage unix\n\nconst (\n\t// SYS_NOSYS = 0;  // { int nosys(void); } syscall nosys_args int\n\tSYS_EXIT                   = 1   // { void sys_exit(int rval); } exit \\\n\tSYS_FORK                   = 2   // { int fork(void); }\n\tSYS_READ                   = 3   // { ssize_t read(int fd, void *buf, \\\n\tSYS_WRITE                  = 4   // { ssize_t write(int fd, const void *buf, \\\n\tSYS_OPEN                   = 5   // { int open(char *path, int flags, int mode); }\n\tSYS_CLOSE                  = 6   // { int close(int fd); }\n\tSYS_WAIT4                  = 7   // { int wait4(int pid, int *status, \\\n\tSYS_LINK                   = 9   // { int link(char *path, char *link); }\n\tSYS_UNLINK                 = 10  // { int unlink(char *path); }\n\tSYS_CHDIR                  = 12  // { int chdir(char *path); }\n\tSYS_FCHDIR                 = 13  // { int fchdir(int fd); }\n\tSYS_MKNOD                  = 14  // { int mknod(char *path, int mode, int dev); }\n\tSYS_CHMOD                  = 15  // { int chmod(char *path, int mode); }\n\tSYS_CHOWN                  = 16  // { int chown(char *path, int uid, int gid); }\n\tSYS_OBREAK                 = 17  // { int obreak(char *nsize); } break \\\n\tSYS_GETPID                 = 20  // { pid_t getpid(void); }\n\tSYS_MOUNT                  = 21  // { int mount(char *type, char *path, \\\n\tSYS_UNMOUNT                = 22  // { int unmount(char *path, int flags); }\n\tSYS_SETUID                 = 23  // { int setuid(uid_t uid); }\n\tSYS_GETUID                 = 24  // { uid_t getuid(void); }\n\tSYS_GETEUID                = 25  // { uid_t geteuid(void); }\n\tSYS_PTRACE                 = 26  // { int ptrace(int req, pid_t pid, \\\n\tSYS_RECVMSG                = 27  // { int recvmsg(int s, struct msghdr *msg, \\\n\tSYS_SENDMSG                = 28  // { int sendmsg(int s, struct msghdr *msg, \\\n\tSYS_RECVFROM               = 29  // { int recvfrom(int s, caddr_t buf, \\\n\tSYS_ACCEPT                 = 30  // { int accept(int s, \\\n\tSYS_GETPEERNAME            = 31  // { int getpeername(int fdes, \\\n\tSYS_GETSOCKNAME            = 32  // { int getsockname(int fdes, \\\n\tSYS_ACCESS                 = 33  // { int access(char *path, int amode); }\n\tSYS_CHFLAGS                = 34  // { int chflags(const char *path, u_long flags); }\n\tSYS_FCHFLAGS               = 35  // { int fchflags(int fd, u_long flags); }\n\tSYS_SYNC                   = 36  // { int sync(void); }\n\tSYS_KILL                   = 37  // { int kill(int pid, int signum); }\n\tSYS_GETPPID                = 39  // { pid_t getppid(void); }\n\tSYS_DUP                    = 41  // { int dup(u_int fd); }\n\tSYS_PIPE                   = 42  // { int pipe(void); }\n\tSYS_GETEGID                = 43  // { gid_t getegid(void); }\n\tSYS_PROFIL                 = 44  // { int profil(caddr_t samples, size_t size, \\\n\tSYS_KTRACE                 = 45  // { int ktrace(const char *fname, int ops, \\\n\tSYS_GETGID                 = 47  // { gid_t getgid(void); }\n\tSYS_GETLOGIN               = 49  // { int getlogin(char *namebuf, u_int \\\n\tSYS_SETLOGIN               = 50  // { int setlogin(char *namebuf); }\n\tSYS_ACCT                   = 51  // { int acct(char *path); }\n\tSYS_SIGALTSTACK            = 53  // { int sigaltstack(stack_t *ss, \\\n\tSYS_IOCTL                  = 54  // { int ioctl(int fd, u_long com, \\\n\tSYS_REBOOT                 = 55  // { int reboot(int opt); }\n\tSYS_REVOKE                 = 56  // { int revoke(char *path); }\n\tSYS_SYMLINK                = 57  // { int symlink(char *path, char *link); }\n\tSYS_READLINK               = 58  // { ssize_t readlink(char *path, char *buf, \\\n\tSYS_EXECVE                 = 59  // { int execve(char *fname, char **argv, \\\n\tSYS_UMASK                  = 60  // { int umask(int newmask); } umask umask_args \\\n\tSYS_CHROOT                 = 61  // { int chroot(char *path); }\n\tSYS_MSYNC                  = 65  // { int msync(void *addr, size_t len, \\\n\tSYS_VFORK                  = 66  // { int vfork(void); }\n\tSYS_SBRK                   = 69  // { int sbrk(int incr); }\n\tSYS_SSTK                   = 70  // { int sstk(int incr); }\n\tSYS_OVADVISE               = 72  // { int ovadvise(int anom); } vadvise \\\n\tSYS_MUNMAP                 = 73  // { int munmap(void *addr, size_t len); }\n\tSYS_MPROTECT               = 74  // { int mprotect(const void *addr, size_t len, \\\n\tSYS_MADVISE                = 75  // { int madvise(void *addr, size_t len, \\\n\tSYS_MINCORE                = 78  // { int mincore(const void *addr, size_t len, \\\n\tSYS_GETGROUPS              = 79  // { int getgroups(u_int gidsetsize, \\\n\tSYS_SETGROUPS              = 80  // { int setgroups(u_int gidsetsize, \\\n\tSYS_GETPGRP                = 81  // { int getpgrp(void); }\n\tSYS_SETPGID                = 82  // { int setpgid(int pid, int pgid); }\n\tSYS_SETITIMER              = 83  // { int setitimer(u_int which, struct \\\n\tSYS_SWAPON                 = 85  // { int swapon(char *name); }\n\tSYS_GETITIMER              = 86  // { int getitimer(u_int which, \\\n\tSYS_GETDTABLESIZE          = 89  // { int getdtablesize(void); }\n\tSYS_DUP2                   = 90  // { int dup2(u_int from, u_int to); }\n\tSYS_FCNTL                  = 92  // { int fcntl(int fd, int cmd, long arg); }\n\tSYS_SELECT                 = 93  // { int select(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_FSYNC                  = 95  // { int fsync(int fd); }\n\tSYS_SETPRIORITY            = 96  // { int setpriority(int which, int who, \\\n\tSYS_SOCKET                 = 97  // { int socket(int domain, int type, \\\n\tSYS_CONNECT                = 98  // { int connect(int s, caddr_t name, \\\n\tSYS_GETPRIORITY            = 100 // { int getpriority(int which, int who); }\n\tSYS_BIND                   = 104 // { int bind(int s, caddr_t name, \\\n\tSYS_SETSOCKOPT             = 105 // { int setsockopt(int s, int level, int name, \\\n\tSYS_LISTEN                 = 106 // { int listen(int s, int backlog); }\n\tSYS_GETTIMEOFDAY           = 116 // { int gettimeofday(struct timeval *tp, \\\n\tSYS_GETRUSAGE              = 117 // { int getrusage(int who, \\\n\tSYS_GETSOCKOPT             = 118 // { int getsockopt(int s, int level, int name, \\\n\tSYS_READV                  = 120 // { int readv(int fd, struct iovec *iovp, \\\n\tSYS_WRITEV                 = 121 // { int writev(int fd, struct iovec *iovp, \\\n\tSYS_SETTIMEOFDAY           = 122 // { int settimeofday(struct timeval *tv, \\\n\tSYS_FCHOWN                 = 123 // { int fchown(int fd, int uid, int gid); }\n\tSYS_FCHMOD                 = 124 // { int fchmod(int fd, int mode); }\n\tSYS_SETREUID               = 126 // { int setreuid(int ruid, int euid); }\n\tSYS_SETREGID               = 127 // { int setregid(int rgid, int egid); }\n\tSYS_RENAME                 = 128 // { int rename(char *from, char *to); }\n\tSYS_FLOCK                  = 131 // { int flock(int fd, int how); }\n\tSYS_MKFIFO                 = 132 // { int mkfifo(char *path, int mode); }\n\tSYS_SENDTO                 = 133 // { int sendto(int s, caddr_t buf, size_t len, \\\n\tSYS_SHUTDOWN               = 134 // { int shutdown(int s, int how); }\n\tSYS_SOCKETPAIR             = 135 // { int socketpair(int domain, int type, \\\n\tSYS_MKDIR                  = 136 // { int mkdir(char *path, int mode); }\n\tSYS_RMDIR                  = 137 // { int rmdir(char *path); }\n\tSYS_UTIMES                 = 138 // { int utimes(char *path, \\\n\tSYS_ADJTIME                = 140 // { int adjtime(struct timeval *delta, \\\n\tSYS_SETSID                 = 147 // { int setsid(void); }\n\tSYS_QUOTACTL               = 148 // { int quotactl(char *path, int cmd, int uid, \\\n\tSYS_LGETFH                 = 160 // { int lgetfh(char *fname, \\\n\tSYS_GETFH                  = 161 // { int getfh(char *fname, \\\n\tSYS_SYSARCH                = 165 // { int sysarch(int op, char *parms); }\n\tSYS_RTPRIO                 = 166 // { int rtprio(int function, pid_t pid, \\\n\tSYS_FREEBSD6_PREAD         = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \\\n\tSYS_FREEBSD6_PWRITE        = 174 // { ssize_t freebsd6_pwrite(int fd, \\\n\tSYS_SETFIB                 = 175 // { int setfib(int fibnum); }\n\tSYS_NTP_ADJTIME            = 176 // { int ntp_adjtime(struct timex *tp); }\n\tSYS_SETGID                 = 181 // { int setgid(gid_t gid); }\n\tSYS_SETEGID                = 182 // { int setegid(gid_t egid); }\n\tSYS_SETEUID                = 183 // { int seteuid(uid_t euid); }\n\tSYS_STAT                   = 188 // { int stat(char *path, struct stat *ub); }\n\tSYS_FSTAT                  = 189 // { int fstat(int fd, struct stat *sb); }\n\tSYS_LSTAT                  = 190 // { int lstat(char *path, struct stat *ub); }\n\tSYS_PATHCONF               = 191 // { int pathconf(char *path, int name); }\n\tSYS_FPATHCONF              = 192 // { int fpathconf(int fd, int name); }\n\tSYS_GETRLIMIT              = 194 // { int getrlimit(u_int which, \\\n\tSYS_SETRLIMIT              = 195 // { int setrlimit(u_int which, \\\n\tSYS_GETDIRENTRIES          = 196 // { int getdirentries(int fd, char *buf, \\\n\tSYS_FREEBSD6_MMAP          = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \\\n\tSYS_FREEBSD6_LSEEK         = 199 // { off_t freebsd6_lseek(int fd, int pad, \\\n\tSYS_FREEBSD6_TRUNCATE      = 200 // { int freebsd6_truncate(char *path, int pad, \\\n\tSYS_FREEBSD6_FTRUNCATE     = 201 // { int freebsd6_ftruncate(int fd, int pad, \\\n\tSYS___SYSCTL               = 202 // { int __sysctl(int *name, u_int namelen, \\\n\tSYS_MLOCK                  = 203 // { int mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK                = 204 // { int munlock(const void *addr, size_t len); }\n\tSYS_UNDELETE               = 205 // { int undelete(char *path); }\n\tSYS_FUTIMES                = 206 // { int futimes(int fd, struct timeval *tptr); }\n\tSYS_GETPGID                = 207 // { int getpgid(pid_t pid); }\n\tSYS_POLL                   = 209 // { int poll(struct pollfd *fds, u_int nfds, \\\n\tSYS_CLOCK_GETTIME          = 232 // { int clock_gettime(clockid_t clock_id, \\\n\tSYS_CLOCK_SETTIME          = 233 // { int clock_settime( \\\n\tSYS_CLOCK_GETRES           = 234 // { int clock_getres(clockid_t clock_id, \\\n\tSYS_KTIMER_CREATE          = 235 // { int ktimer_create(clockid_t clock_id, \\\n\tSYS_KTIMER_DELETE          = 236 // { int ktimer_delete(int timerid); }\n\tSYS_KTIMER_SETTIME         = 237 // { int ktimer_settime(int timerid, int flags, \\\n\tSYS_KTIMER_GETTIME         = 238 // { int ktimer_gettime(int timerid, struct \\\n\tSYS_KTIMER_GETOVERRUN      = 239 // { int ktimer_getoverrun(int timerid); }\n\tSYS_NANOSLEEP              = 240 // { int nanosleep(const struct timespec *rqtp, \\\n\tSYS_FFCLOCK_GETCOUNTER     = 241 // { int ffclock_getcounter(ffcounter *ffcount); }\n\tSYS_FFCLOCK_SETESTIMATE    = 242 // { int ffclock_setestimate( \\\n\tSYS_FFCLOCK_GETESTIMATE    = 243 // { int ffclock_getestimate( \\\n\tSYS_CLOCK_GETCPUCLOCKID2   = 247 // { int clock_getcpuclockid2(id_t id,\\\n\tSYS_NTP_GETTIME            = 248 // { int ntp_gettime(struct ntptimeval *ntvp); }\n\tSYS_MINHERIT               = 250 // { int minherit(void *addr, size_t len, \\\n\tSYS_RFORK                  = 251 // { int rfork(int flags); }\n\tSYS_OPENBSD_POLL           = 252 // { int openbsd_poll(struct pollfd *fds, \\\n\tSYS_ISSETUGID              = 253 // { int issetugid(void); }\n\tSYS_LCHOWN                 = 254 // { int lchown(char *path, int uid, int gid); }\n\tSYS_GETDENTS               = 272 // { int getdents(int fd, char *buf, \\\n\tSYS_LCHMOD                 = 274 // { int lchmod(char *path, mode_t mode); }\n\tSYS_LUTIMES                = 276 // { int lutimes(char *path, \\\n\tSYS_NSTAT                  = 278 // { int nstat(char *path, struct nstat *ub); }\n\tSYS_NFSTAT                 = 279 // { int nfstat(int fd, struct nstat *sb); }\n\tSYS_NLSTAT                 = 280 // { int nlstat(char *path, struct nstat *ub); }\n\tSYS_PREADV                 = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \\\n\tSYS_PWRITEV                = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \\\n\tSYS_FHOPEN                 = 298 // { int fhopen(const struct fhandle *u_fhp, \\\n\tSYS_FHSTAT                 = 299 // { int fhstat(const struct fhandle *u_fhp, \\\n\tSYS_MODNEXT                = 300 // { int modnext(int modid); }\n\tSYS_MODSTAT                = 301 // { int modstat(int modid, \\\n\tSYS_MODFNEXT               = 302 // { int modfnext(int modid); }\n\tSYS_MODFIND                = 303 // { int modfind(const char *name); }\n\tSYS_KLDLOAD                = 304 // { int kldload(const char *file); }\n\tSYS_KLDUNLOAD              = 305 // { int kldunload(int fileid); }\n\tSYS_KLDFIND                = 306 // { int kldfind(const char *file); }\n\tSYS_KLDNEXT                = 307 // { int kldnext(int fileid); }\n\tSYS_KLDSTAT                = 308 // { int kldstat(int fileid, struct \\\n\tSYS_KLDFIRSTMOD            = 309 // { int kldfirstmod(int fileid); }\n\tSYS_GETSID                 = 310 // { int getsid(pid_t pid); }\n\tSYS_SETRESUID              = 311 // { int setresuid(uid_t ruid, uid_t euid, \\\n\tSYS_SETRESGID              = 312 // { int setresgid(gid_t rgid, gid_t egid, \\\n\tSYS_YIELD                  = 321 // { int yield(void); }\n\tSYS_MLOCKALL               = 324 // { int mlockall(int how); }\n\tSYS_MUNLOCKALL             = 325 // { int munlockall(void); }\n\tSYS___GETCWD               = 326 // { int __getcwd(char *buf, u_int buflen); }\n\tSYS_SCHED_SETPARAM         = 327 // { int sched_setparam (pid_t pid, \\\n\tSYS_SCHED_GETPARAM         = 328 // { int sched_getparam (pid_t pid, struct \\\n\tSYS_SCHED_SETSCHEDULER     = 329 // { int sched_setscheduler (pid_t pid, int \\\n\tSYS_SCHED_GETSCHEDULER     = 330 // { int sched_getscheduler (pid_t pid); }\n\tSYS_SCHED_YIELD            = 331 // { int sched_yield (void); }\n\tSYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }\n\tSYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }\n\tSYS_SCHED_RR_GET_INTERVAL  = 334 // { int sched_rr_get_interval (pid_t pid, \\\n\tSYS_UTRACE                 = 335 // { int utrace(const void *addr, size_t len); }\n\tSYS_KLDSYM                 = 337 // { int kldsym(int fileid, int cmd, \\\n\tSYS_JAIL                   = 338 // { int jail(struct jail *jail); }\n\tSYS_SIGPROCMASK            = 340 // { int sigprocmask(int how, \\\n\tSYS_SIGSUSPEND             = 341 // { int sigsuspend(const sigset_t *sigmask); }\n\tSYS_SIGPENDING             = 343 // { int sigpending(sigset_t *set); }\n\tSYS_SIGTIMEDWAIT           = 345 // { int sigtimedwait(const sigset_t *set, \\\n\tSYS_SIGWAITINFO            = 346 // { int sigwaitinfo(const sigset_t *set, \\\n\tSYS___ACL_GET_FILE         = 347 // { int __acl_get_file(const char *path, \\\n\tSYS___ACL_SET_FILE         = 348 // { int __acl_set_file(const char *path, \\\n\tSYS___ACL_GET_FD           = 349 // { int __acl_get_fd(int filedes, \\\n\tSYS___ACL_SET_FD           = 350 // { int __acl_set_fd(int filedes, \\\n\tSYS___ACL_DELETE_FILE      = 351 // { int __acl_delete_file(const char *path, \\\n\tSYS___ACL_DELETE_FD        = 352 // { int __acl_delete_fd(int filedes, \\\n\tSYS___ACL_ACLCHECK_FILE    = 353 // { int __acl_aclcheck_file(const char *path, \\\n\tSYS___ACL_ACLCHECK_FD      = 354 // { int __acl_aclcheck_fd(int filedes, \\\n\tSYS_EXTATTRCTL             = 355 // { int extattrctl(const char *path, int cmd, \\\n\tSYS_EXTATTR_SET_FILE       = 356 // { ssize_t extattr_set_file( \\\n\tSYS_EXTATTR_GET_FILE       = 357 // { ssize_t extattr_get_file( \\\n\tSYS_EXTATTR_DELETE_FILE    = 358 // { int extattr_delete_file(const char *path, \\\n\tSYS_GETRESUID              = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \\\n\tSYS_GETRESGID              = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \\\n\tSYS_KQUEUE                 = 362 // { int kqueue(void); }\n\tSYS_KEVENT                 = 363 // { int kevent(int fd, \\\n\tSYS_EXTATTR_SET_FD         = 371 // { ssize_t extattr_set_fd(int fd, \\\n\tSYS_EXTATTR_GET_FD         = 372 // { ssize_t extattr_get_fd(int fd, \\\n\tSYS_EXTATTR_DELETE_FD      = 373 // { int extattr_delete_fd(int fd, \\\n\tSYS___SETUGID              = 374 // { int __setugid(int flag); }\n\tSYS_EACCESS                = 376 // { int eaccess(char *path, int amode); }\n\tSYS_NMOUNT                 = 378 // { int nmount(struct iovec *iovp, \\\n\tSYS___MAC_GET_PROC         = 384 // { int __mac_get_proc(struct mac *mac_p); }\n\tSYS___MAC_SET_PROC         = 385 // { int __mac_set_proc(struct mac *mac_p); }\n\tSYS___MAC_GET_FD           = 386 // { int __mac_get_fd(int fd, \\\n\tSYS___MAC_GET_FILE         = 387 // { int __mac_get_file(const char *path_p, \\\n\tSYS___MAC_SET_FD           = 388 // { int __mac_set_fd(int fd, \\\n\tSYS___MAC_SET_FILE         = 389 // { int __mac_set_file(const char *path_p, \\\n\tSYS_KENV                   = 390 // { int kenv(int what, const char *name, \\\n\tSYS_LCHFLAGS               = 391 // { int lchflags(const char *path, \\\n\tSYS_UUIDGEN                = 392 // { int uuidgen(struct uuid *store, \\\n\tSYS_SENDFILE               = 393 // { int sendfile(int fd, int s, off_t offset, \\\n\tSYS_MAC_SYSCALL            = 394 // { int mac_syscall(const char *policy, \\\n\tSYS_GETFSSTAT              = 395 // { int getfsstat(struct statfs *buf, \\\n\tSYS_STATFS                 = 396 // { int statfs(char *path, \\\n\tSYS_FSTATFS                = 397 // { int fstatfs(int fd, struct statfs *buf); }\n\tSYS_FHSTATFS               = 398 // { int fhstatfs(const struct fhandle *u_fhp, \\\n\tSYS___MAC_GET_PID          = 409 // { int __mac_get_pid(pid_t pid, \\\n\tSYS___MAC_GET_LINK         = 410 // { int __mac_get_link(const char *path_p, \\\n\tSYS___MAC_SET_LINK         = 411 // { int __mac_set_link(const char *path_p, \\\n\tSYS_EXTATTR_SET_LINK       = 412 // { ssize_t extattr_set_link( \\\n\tSYS_EXTATTR_GET_LINK       = 413 // { ssize_t extattr_get_link( \\\n\tSYS_EXTATTR_DELETE_LINK    = 414 // { int extattr_delete_link( \\\n\tSYS___MAC_EXECVE           = 415 // { int __mac_execve(char *fname, char **argv, \\\n\tSYS_SIGACTION              = 416 // { int sigaction(int sig, \\\n\tSYS_SIGRETURN              = 417 // { int sigreturn( \\\n\tSYS_GETCONTEXT             = 421 // { int getcontext(struct __ucontext *ucp); }\n\tSYS_SETCONTEXT             = 422 // { int setcontext( \\\n\tSYS_SWAPCONTEXT            = 423 // { int swapcontext(struct __ucontext *oucp, \\\n\tSYS_SWAPOFF                = 424 // { int swapoff(const char *name); }\n\tSYS___ACL_GET_LINK         = 425 // { int __acl_get_link(const char *path, \\\n\tSYS___ACL_SET_LINK         = 426 // { int __acl_set_link(const char *path, \\\n\tSYS___ACL_DELETE_LINK      = 427 // { int __acl_delete_link(const char *path, \\\n\tSYS___ACL_ACLCHECK_LINK    = 428 // { int __acl_aclcheck_link(const char *path, \\\n\tSYS_SIGWAIT                = 429 // { int sigwait(const sigset_t *set, \\\n\tSYS_THR_CREATE             = 430 // { int thr_create(ucontext_t *ctx, long *id, \\\n\tSYS_THR_EXIT               = 431 // { void thr_exit(long *state); }\n\tSYS_THR_SELF               = 432 // { int thr_self(long *id); }\n\tSYS_THR_KILL               = 433 // { int thr_kill(long id, int sig); }\n\tSYS__UMTX_LOCK             = 434 // { int _umtx_lock(struct umtx *umtx); }\n\tSYS__UMTX_UNLOCK           = 435 // { int _umtx_unlock(struct umtx *umtx); }\n\tSYS_JAIL_ATTACH            = 436 // { int jail_attach(int jid); }\n\tSYS_EXTATTR_LIST_FD        = 437 // { ssize_t extattr_list_fd(int fd, \\\n\tSYS_EXTATTR_LIST_FILE      = 438 // { ssize_t extattr_list_file( \\\n\tSYS_EXTATTR_LIST_LINK      = 439 // { ssize_t extattr_list_link( \\\n\tSYS_THR_SUSPEND            = 442 // { int thr_suspend( \\\n\tSYS_THR_WAKE               = 443 // { int thr_wake(long id); }\n\tSYS_KLDUNLOADF             = 444 // { int kldunloadf(int fileid, int flags); }\n\tSYS_AUDIT                  = 445 // { int audit(const void *record, \\\n\tSYS_AUDITON                = 446 // { int auditon(int cmd, void *data, \\\n\tSYS_GETAUID                = 447 // { int getauid(uid_t *auid); }\n\tSYS_SETAUID                = 448 // { int setauid(uid_t *auid); }\n\tSYS_GETAUDIT               = 449 // { int getaudit(struct auditinfo *auditinfo); }\n\tSYS_SETAUDIT               = 450 // { int setaudit(struct auditinfo *auditinfo); }\n\tSYS_GETAUDIT_ADDR          = 451 // { int getaudit_addr( \\\n\tSYS_SETAUDIT_ADDR          = 452 // { int setaudit_addr( \\\n\tSYS_AUDITCTL               = 453 // { int auditctl(char *path); }\n\tSYS__UMTX_OP               = 454 // { int _umtx_op(void *obj, int op, \\\n\tSYS_THR_NEW                = 455 // { int thr_new(struct thr_param *param, \\\n\tSYS_SIGQUEUE               = 456 // { int sigqueue(pid_t pid, int signum, void *value); }\n\tSYS_ABORT2                 = 463 // { int abort2(const char *why, int nargs, void **args); }\n\tSYS_THR_SET_NAME           = 464 // { int thr_set_name(long id, const char *name); }\n\tSYS_RTPRIO_THREAD          = 466 // { int rtprio_thread(int function, \\\n\tSYS_PREAD                  = 475 // { ssize_t pread(int fd, void *buf, \\\n\tSYS_PWRITE                 = 476 // { ssize_t pwrite(int fd, const void *buf, \\\n\tSYS_MMAP                   = 477 // { caddr_t mmap(caddr_t addr, size_t len, \\\n\tSYS_LSEEK                  = 478 // { off_t lseek(int fd, off_t offset, \\\n\tSYS_TRUNCATE               = 479 // { int truncate(char *path, off_t length); }\n\tSYS_FTRUNCATE              = 480 // { int ftruncate(int fd, off_t length); }\n\tSYS_THR_KILL2              = 481 // { int thr_kill2(pid_t pid, long id, int sig); }\n\tSYS_SHM_OPEN               = 482 // { int shm_open(const char *path, int flags, \\\n\tSYS_SHM_UNLINK             = 483 // { int shm_unlink(const char *path); }\n\tSYS_CPUSET                 = 484 // { int cpuset(cpusetid_t *setid); }\n\tSYS_CPUSET_SETID           = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \\\n\tSYS_CPUSET_GETID           = 486 // { int cpuset_getid(cpulevel_t level, \\\n\tSYS_CPUSET_GETAFFINITY     = 487 // { int cpuset_getaffinity(cpulevel_t level, \\\n\tSYS_CPUSET_SETAFFINITY     = 488 // { int cpuset_setaffinity(cpulevel_t level, \\\n\tSYS_FACCESSAT              = 489 // { int faccessat(int fd, char *path, int amode, \\\n\tSYS_FCHMODAT               = 490 // { int fchmodat(int fd, char *path, mode_t mode, \\\n\tSYS_FCHOWNAT               = 491 // { int fchownat(int fd, char *path, uid_t uid, \\\n\tSYS_FEXECVE                = 492 // { int fexecve(int fd, char **argv, \\\n\tSYS_FSTATAT                = 493 // { int fstatat(int fd, char *path, \\\n\tSYS_FUTIMESAT              = 494 // { int futimesat(int fd, char *path, \\\n\tSYS_LINKAT                 = 495 // { int linkat(int fd1, char *path1, int fd2, \\\n\tSYS_MKDIRAT                = 496 // { int mkdirat(int fd, char *path, mode_t mode); }\n\tSYS_MKFIFOAT               = 497 // { int mkfifoat(int fd, char *path, mode_t mode); }\n\tSYS_MKNODAT                = 498 // { int mknodat(int fd, char *path, mode_t mode, \\\n\tSYS_OPENAT                 = 499 // { int openat(int fd, char *path, int flag, \\\n\tSYS_READLINKAT             = 500 // { int readlinkat(int fd, char *path, char *buf, \\\n\tSYS_RENAMEAT               = 501 // { int renameat(int oldfd, char *old, int newfd, \\\n\tSYS_SYMLINKAT              = 502 // { int symlinkat(char *path1, int fd, \\\n\tSYS_UNLINKAT               = 503 // { int unlinkat(int fd, char *path, int flag); }\n\tSYS_POSIX_OPENPT           = 504 // { int posix_openpt(int flags); }\n\tSYS_JAIL_GET               = 506 // { int jail_get(struct iovec *iovp, \\\n\tSYS_JAIL_SET               = 507 // { int jail_set(struct iovec *iovp, \\\n\tSYS_JAIL_REMOVE            = 508 // { int jail_remove(int jid); }\n\tSYS_CLOSEFROM              = 509 // { int closefrom(int lowfd); }\n\tSYS_LPATHCONF              = 513 // { int lpathconf(char *path, int name); }\n\tSYS___CAP_RIGHTS_GET       = 515 // { int __cap_rights_get(int version, \\\n\tSYS_CAP_ENTER              = 516 // { int cap_enter(void); }\n\tSYS_CAP_GETMODE            = 517 // { int cap_getmode(u_int *modep); }\n\tSYS_PDFORK                 = 518 // { int pdfork(int *fdp, int flags); }\n\tSYS_PDKILL                 = 519 // { int pdkill(int fd, int signum); }\n\tSYS_PDGETPID               = 520 // { int pdgetpid(int fd, pid_t *pidp); }\n\tSYS_PSELECT                = 522 // { int pselect(int nd, fd_set *in, \\\n\tSYS_GETLOGINCLASS          = 523 // { int getloginclass(char *namebuf, \\\n\tSYS_SETLOGINCLASS          = 524 // { int setloginclass(const char *namebuf); }\n\tSYS_RCTL_GET_RACCT         = 525 // { int rctl_get_racct(const void *inbufp, \\\n\tSYS_RCTL_GET_RULES         = 526 // { int rctl_get_rules(const void *inbufp, \\\n\tSYS_RCTL_GET_LIMITS        = 527 // { int rctl_get_limits(const void *inbufp, \\\n\tSYS_RCTL_ADD_RULE          = 528 // { int rctl_add_rule(const void *inbufp, \\\n\tSYS_RCTL_REMOVE_RULE       = 529 // { int rctl_remove_rule(const void *inbufp, \\\n\tSYS_POSIX_FALLOCATE        = 530 // { int posix_fallocate(int fd, \\\n\tSYS_POSIX_FADVISE          = 531 // { int posix_fadvise(int fd, off_t offset, \\\n\tSYS_WAIT6                  = 532 // { int wait6(idtype_t idtype, id_t id, \\\n\tSYS_CAP_RIGHTS_LIMIT       = 533 // { int cap_rights_limit(int fd, \\\n\tSYS_CAP_IOCTLS_LIMIT       = 534 // { int cap_ioctls_limit(int fd, \\\n\tSYS_CAP_IOCTLS_GET         = 535 // { ssize_t cap_ioctls_get(int fd, \\\n\tSYS_CAP_FCNTLS_LIMIT       = 536 // { int cap_fcntls_limit(int fd, \\\n\tSYS_CAP_FCNTLS_GET         = 537 // { int cap_fcntls_get(int fd, \\\n\tSYS_BINDAT                 = 538 // { int bindat(int fd, int s, caddr_t name, \\\n\tSYS_CONNECTAT              = 539 // { int connectat(int fd, int s, caddr_t name, \\\n\tSYS_CHFLAGSAT              = 540 // { int chflagsat(int fd, const char *path, \\\n\tSYS_ACCEPT4                = 541 // { int accept4(int s, \\\n\tSYS_PIPE2                  = 542 // { int pipe2(int *fildes, int flags); }\n\tSYS_PROCCTL                = 544 // { int procctl(idtype_t idtype, id_t id, \\\n\tSYS_PPOLL                  = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \\\n\tSYS_FUTIMENS               = 546 // { int futimens(int fd, \\\n\tSYS_UTIMENSAT              = 547 // { int utimensat(int fd, \\\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go",
    "content": "// mksysnum_freebsd.pl\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,freebsd\n\npackage unix\n\nconst (\n\t// SYS_NOSYS = 0;  // { int nosys(void); } syscall nosys_args int\n\tSYS_EXIT                   = 1   // { void sys_exit(int rval); } exit \\\n\tSYS_FORK                   = 2   // { int fork(void); }\n\tSYS_READ                   = 3   // { ssize_t read(int fd, void *buf, \\\n\tSYS_WRITE                  = 4   // { ssize_t write(int fd, const void *buf, \\\n\tSYS_OPEN                   = 5   // { int open(char *path, int flags, int mode); }\n\tSYS_CLOSE                  = 6   // { int close(int fd); }\n\tSYS_WAIT4                  = 7   // { int wait4(int pid, int *status, \\\n\tSYS_LINK                   = 9   // { int link(char *path, char *link); }\n\tSYS_UNLINK                 = 10  // { int unlink(char *path); }\n\tSYS_CHDIR                  = 12  // { int chdir(char *path); }\n\tSYS_FCHDIR                 = 13  // { int fchdir(int fd); }\n\tSYS_MKNOD                  = 14  // { int mknod(char *path, int mode, int dev); }\n\tSYS_CHMOD                  = 15  // { int chmod(char *path, int mode); }\n\tSYS_CHOWN                  = 16  // { int chown(char *path, int uid, int gid); }\n\tSYS_OBREAK                 = 17  // { int obreak(char *nsize); } break \\\n\tSYS_GETPID                 = 20  // { pid_t getpid(void); }\n\tSYS_MOUNT                  = 21  // { int mount(char *type, char *path, \\\n\tSYS_UNMOUNT                = 22  // { int unmount(char *path, int flags); }\n\tSYS_SETUID                 = 23  // { int setuid(uid_t uid); }\n\tSYS_GETUID                 = 24  // { uid_t getuid(void); }\n\tSYS_GETEUID                = 25  // { uid_t geteuid(void); }\n\tSYS_PTRACE                 = 26  // { int ptrace(int req, pid_t pid, \\\n\tSYS_RECVMSG                = 27  // { int recvmsg(int s, struct msghdr *msg, \\\n\tSYS_SENDMSG                = 28  // { int sendmsg(int s, struct msghdr *msg, \\\n\tSYS_RECVFROM               = 29  // { int recvfrom(int s, caddr_t buf, \\\n\tSYS_ACCEPT                 = 30  // { int accept(int s, \\\n\tSYS_GETPEERNAME            = 31  // { int getpeername(int fdes, \\\n\tSYS_GETSOCKNAME            = 32  // { int getsockname(int fdes, \\\n\tSYS_ACCESS                 = 33  // { int access(char *path, int amode); }\n\tSYS_CHFLAGS                = 34  // { int chflags(const char *path, u_long flags); }\n\tSYS_FCHFLAGS               = 35  // { int fchflags(int fd, u_long flags); }\n\tSYS_SYNC                   = 36  // { int sync(void); }\n\tSYS_KILL                   = 37  // { int kill(int pid, int signum); }\n\tSYS_GETPPID                = 39  // { pid_t getppid(void); }\n\tSYS_DUP                    = 41  // { int dup(u_int fd); }\n\tSYS_PIPE                   = 42  // { int pipe(void); }\n\tSYS_GETEGID                = 43  // { gid_t getegid(void); }\n\tSYS_PROFIL                 = 44  // { int profil(caddr_t samples, size_t size, \\\n\tSYS_KTRACE                 = 45  // { int ktrace(const char *fname, int ops, \\\n\tSYS_GETGID                 = 47  // { gid_t getgid(void); }\n\tSYS_GETLOGIN               = 49  // { int getlogin(char *namebuf, u_int \\\n\tSYS_SETLOGIN               = 50  // { int setlogin(char *namebuf); }\n\tSYS_ACCT                   = 51  // { int acct(char *path); }\n\tSYS_SIGALTSTACK            = 53  // { int sigaltstack(stack_t *ss, \\\n\tSYS_IOCTL                  = 54  // { int ioctl(int fd, u_long com, \\\n\tSYS_REBOOT                 = 55  // { int reboot(int opt); }\n\tSYS_REVOKE                 = 56  // { int revoke(char *path); }\n\tSYS_SYMLINK                = 57  // { int symlink(char *path, char *link); }\n\tSYS_READLINK               = 58  // { ssize_t readlink(char *path, char *buf, \\\n\tSYS_EXECVE                 = 59  // { int execve(char *fname, char **argv, \\\n\tSYS_UMASK                  = 60  // { int umask(int newmask); } umask umask_args \\\n\tSYS_CHROOT                 = 61  // { int chroot(char *path); }\n\tSYS_MSYNC                  = 65  // { int msync(void *addr, size_t len, \\\n\tSYS_VFORK                  = 66  // { int vfork(void); }\n\tSYS_SBRK                   = 69  // { int sbrk(int incr); }\n\tSYS_SSTK                   = 70  // { int sstk(int incr); }\n\tSYS_OVADVISE               = 72  // { int ovadvise(int anom); } vadvise \\\n\tSYS_MUNMAP                 = 73  // { int munmap(void *addr, size_t len); }\n\tSYS_MPROTECT               = 74  // { int mprotect(const void *addr, size_t len, \\\n\tSYS_MADVISE                = 75  // { int madvise(void *addr, size_t len, \\\n\tSYS_MINCORE                = 78  // { int mincore(const void *addr, size_t len, \\\n\tSYS_GETGROUPS              = 79  // { int getgroups(u_int gidsetsize, \\\n\tSYS_SETGROUPS              = 80  // { int setgroups(u_int gidsetsize, \\\n\tSYS_GETPGRP                = 81  // { int getpgrp(void); }\n\tSYS_SETPGID                = 82  // { int setpgid(int pid, int pgid); }\n\tSYS_SETITIMER              = 83  // { int setitimer(u_int which, struct \\\n\tSYS_SWAPON                 = 85  // { int swapon(char *name); }\n\tSYS_GETITIMER              = 86  // { int getitimer(u_int which, \\\n\tSYS_GETDTABLESIZE          = 89  // { int getdtablesize(void); }\n\tSYS_DUP2                   = 90  // { int dup2(u_int from, u_int to); }\n\tSYS_FCNTL                  = 92  // { int fcntl(int fd, int cmd, long arg); }\n\tSYS_SELECT                 = 93  // { int select(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_FSYNC                  = 95  // { int fsync(int fd); }\n\tSYS_SETPRIORITY            = 96  // { int setpriority(int which, int who, \\\n\tSYS_SOCKET                 = 97  // { int socket(int domain, int type, \\\n\tSYS_CONNECT                = 98  // { int connect(int s, caddr_t name, \\\n\tSYS_GETPRIORITY            = 100 // { int getpriority(int which, int who); }\n\tSYS_BIND                   = 104 // { int bind(int s, caddr_t name, \\\n\tSYS_SETSOCKOPT             = 105 // { int setsockopt(int s, int level, int name, \\\n\tSYS_LISTEN                 = 106 // { int listen(int s, int backlog); }\n\tSYS_GETTIMEOFDAY           = 116 // { int gettimeofday(struct timeval *tp, \\\n\tSYS_GETRUSAGE              = 117 // { int getrusage(int who, \\\n\tSYS_GETSOCKOPT             = 118 // { int getsockopt(int s, int level, int name, \\\n\tSYS_READV                  = 120 // { int readv(int fd, struct iovec *iovp, \\\n\tSYS_WRITEV                 = 121 // { int writev(int fd, struct iovec *iovp, \\\n\tSYS_SETTIMEOFDAY           = 122 // { int settimeofday(struct timeval *tv, \\\n\tSYS_FCHOWN                 = 123 // { int fchown(int fd, int uid, int gid); }\n\tSYS_FCHMOD                 = 124 // { int fchmod(int fd, int mode); }\n\tSYS_SETREUID               = 126 // { int setreuid(int ruid, int euid); }\n\tSYS_SETREGID               = 127 // { int setregid(int rgid, int egid); }\n\tSYS_RENAME                 = 128 // { int rename(char *from, char *to); }\n\tSYS_FLOCK                  = 131 // { int flock(int fd, int how); }\n\tSYS_MKFIFO                 = 132 // { int mkfifo(char *path, int mode); }\n\tSYS_SENDTO                 = 133 // { int sendto(int s, caddr_t buf, size_t len, \\\n\tSYS_SHUTDOWN               = 134 // { int shutdown(int s, int how); }\n\tSYS_SOCKETPAIR             = 135 // { int socketpair(int domain, int type, \\\n\tSYS_MKDIR                  = 136 // { int mkdir(char *path, int mode); }\n\tSYS_RMDIR                  = 137 // { int rmdir(char *path); }\n\tSYS_UTIMES                 = 138 // { int utimes(char *path, \\\n\tSYS_ADJTIME                = 140 // { int adjtime(struct timeval *delta, \\\n\tSYS_SETSID                 = 147 // { int setsid(void); }\n\tSYS_QUOTACTL               = 148 // { int quotactl(char *path, int cmd, int uid, \\\n\tSYS_LGETFH                 = 160 // { int lgetfh(char *fname, \\\n\tSYS_GETFH                  = 161 // { int getfh(char *fname, \\\n\tSYS_SYSARCH                = 165 // { int sysarch(int op, char *parms); }\n\tSYS_RTPRIO                 = 166 // { int rtprio(int function, pid_t pid, \\\n\tSYS_FREEBSD6_PREAD         = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \\\n\tSYS_FREEBSD6_PWRITE        = 174 // { ssize_t freebsd6_pwrite(int fd, \\\n\tSYS_SETFIB                 = 175 // { int setfib(int fibnum); }\n\tSYS_NTP_ADJTIME            = 176 // { int ntp_adjtime(struct timex *tp); }\n\tSYS_SETGID                 = 181 // { int setgid(gid_t gid); }\n\tSYS_SETEGID                = 182 // { int setegid(gid_t egid); }\n\tSYS_SETEUID                = 183 // { int seteuid(uid_t euid); }\n\tSYS_STAT                   = 188 // { int stat(char *path, struct stat *ub); }\n\tSYS_FSTAT                  = 189 // { int fstat(int fd, struct stat *sb); }\n\tSYS_LSTAT                  = 190 // { int lstat(char *path, struct stat *ub); }\n\tSYS_PATHCONF               = 191 // { int pathconf(char *path, int name); }\n\tSYS_FPATHCONF              = 192 // { int fpathconf(int fd, int name); }\n\tSYS_GETRLIMIT              = 194 // { int getrlimit(u_int which, \\\n\tSYS_SETRLIMIT              = 195 // { int setrlimit(u_int which, \\\n\tSYS_GETDIRENTRIES          = 196 // { int getdirentries(int fd, char *buf, \\\n\tSYS_FREEBSD6_MMAP          = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \\\n\tSYS_FREEBSD6_LSEEK         = 199 // { off_t freebsd6_lseek(int fd, int pad, \\\n\tSYS_FREEBSD6_TRUNCATE      = 200 // { int freebsd6_truncate(char *path, int pad, \\\n\tSYS_FREEBSD6_FTRUNCATE     = 201 // { int freebsd6_ftruncate(int fd, int pad, \\\n\tSYS___SYSCTL               = 202 // { int __sysctl(int *name, u_int namelen, \\\n\tSYS_MLOCK                  = 203 // { int mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK                = 204 // { int munlock(const void *addr, size_t len); }\n\tSYS_UNDELETE               = 205 // { int undelete(char *path); }\n\tSYS_FUTIMES                = 206 // { int futimes(int fd, struct timeval *tptr); }\n\tSYS_GETPGID                = 207 // { int getpgid(pid_t pid); }\n\tSYS_POLL                   = 209 // { int poll(struct pollfd *fds, u_int nfds, \\\n\tSYS_CLOCK_GETTIME          = 232 // { int clock_gettime(clockid_t clock_id, \\\n\tSYS_CLOCK_SETTIME          = 233 // { int clock_settime( \\\n\tSYS_CLOCK_GETRES           = 234 // { int clock_getres(clockid_t clock_id, \\\n\tSYS_KTIMER_CREATE          = 235 // { int ktimer_create(clockid_t clock_id, \\\n\tSYS_KTIMER_DELETE          = 236 // { int ktimer_delete(int timerid); }\n\tSYS_KTIMER_SETTIME         = 237 // { int ktimer_settime(int timerid, int flags, \\\n\tSYS_KTIMER_GETTIME         = 238 // { int ktimer_gettime(int timerid, struct \\\n\tSYS_KTIMER_GETOVERRUN      = 239 // { int ktimer_getoverrun(int timerid); }\n\tSYS_NANOSLEEP              = 240 // { int nanosleep(const struct timespec *rqtp, \\\n\tSYS_FFCLOCK_GETCOUNTER     = 241 // { int ffclock_getcounter(ffcounter *ffcount); }\n\tSYS_FFCLOCK_SETESTIMATE    = 242 // { int ffclock_setestimate( \\\n\tSYS_FFCLOCK_GETESTIMATE    = 243 // { int ffclock_getestimate( \\\n\tSYS_CLOCK_GETCPUCLOCKID2   = 247 // { int clock_getcpuclockid2(id_t id,\\\n\tSYS_NTP_GETTIME            = 248 // { int ntp_gettime(struct ntptimeval *ntvp); }\n\tSYS_MINHERIT               = 250 // { int minherit(void *addr, size_t len, \\\n\tSYS_RFORK                  = 251 // { int rfork(int flags); }\n\tSYS_OPENBSD_POLL           = 252 // { int openbsd_poll(struct pollfd *fds, \\\n\tSYS_ISSETUGID              = 253 // { int issetugid(void); }\n\tSYS_LCHOWN                 = 254 // { int lchown(char *path, int uid, int gid); }\n\tSYS_GETDENTS               = 272 // { int getdents(int fd, char *buf, \\\n\tSYS_LCHMOD                 = 274 // { int lchmod(char *path, mode_t mode); }\n\tSYS_LUTIMES                = 276 // { int lutimes(char *path, \\\n\tSYS_NSTAT                  = 278 // { int nstat(char *path, struct nstat *ub); }\n\tSYS_NFSTAT                 = 279 // { int nfstat(int fd, struct nstat *sb); }\n\tSYS_NLSTAT                 = 280 // { int nlstat(char *path, struct nstat *ub); }\n\tSYS_PREADV                 = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \\\n\tSYS_PWRITEV                = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \\\n\tSYS_FHOPEN                 = 298 // { int fhopen(const struct fhandle *u_fhp, \\\n\tSYS_FHSTAT                 = 299 // { int fhstat(const struct fhandle *u_fhp, \\\n\tSYS_MODNEXT                = 300 // { int modnext(int modid); }\n\tSYS_MODSTAT                = 301 // { int modstat(int modid, \\\n\tSYS_MODFNEXT               = 302 // { int modfnext(int modid); }\n\tSYS_MODFIND                = 303 // { int modfind(const char *name); }\n\tSYS_KLDLOAD                = 304 // { int kldload(const char *file); }\n\tSYS_KLDUNLOAD              = 305 // { int kldunload(int fileid); }\n\tSYS_KLDFIND                = 306 // { int kldfind(const char *file); }\n\tSYS_KLDNEXT                = 307 // { int kldnext(int fileid); }\n\tSYS_KLDSTAT                = 308 // { int kldstat(int fileid, struct \\\n\tSYS_KLDFIRSTMOD            = 309 // { int kldfirstmod(int fileid); }\n\tSYS_GETSID                 = 310 // { int getsid(pid_t pid); }\n\tSYS_SETRESUID              = 311 // { int setresuid(uid_t ruid, uid_t euid, \\\n\tSYS_SETRESGID              = 312 // { int setresgid(gid_t rgid, gid_t egid, \\\n\tSYS_YIELD                  = 321 // { int yield(void); }\n\tSYS_MLOCKALL               = 324 // { int mlockall(int how); }\n\tSYS_MUNLOCKALL             = 325 // { int munlockall(void); }\n\tSYS___GETCWD               = 326 // { int __getcwd(char *buf, u_int buflen); }\n\tSYS_SCHED_SETPARAM         = 327 // { int sched_setparam (pid_t pid, \\\n\tSYS_SCHED_GETPARAM         = 328 // { int sched_getparam (pid_t pid, struct \\\n\tSYS_SCHED_SETSCHEDULER     = 329 // { int sched_setscheduler (pid_t pid, int \\\n\tSYS_SCHED_GETSCHEDULER     = 330 // { int sched_getscheduler (pid_t pid); }\n\tSYS_SCHED_YIELD            = 331 // { int sched_yield (void); }\n\tSYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }\n\tSYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }\n\tSYS_SCHED_RR_GET_INTERVAL  = 334 // { int sched_rr_get_interval (pid_t pid, \\\n\tSYS_UTRACE                 = 335 // { int utrace(const void *addr, size_t len); }\n\tSYS_KLDSYM                 = 337 // { int kldsym(int fileid, int cmd, \\\n\tSYS_JAIL                   = 338 // { int jail(struct jail *jail); }\n\tSYS_SIGPROCMASK            = 340 // { int sigprocmask(int how, \\\n\tSYS_SIGSUSPEND             = 341 // { int sigsuspend(const sigset_t *sigmask); }\n\tSYS_SIGPENDING             = 343 // { int sigpending(sigset_t *set); }\n\tSYS_SIGTIMEDWAIT           = 345 // { int sigtimedwait(const sigset_t *set, \\\n\tSYS_SIGWAITINFO            = 346 // { int sigwaitinfo(const sigset_t *set, \\\n\tSYS___ACL_GET_FILE         = 347 // { int __acl_get_file(const char *path, \\\n\tSYS___ACL_SET_FILE         = 348 // { int __acl_set_file(const char *path, \\\n\tSYS___ACL_GET_FD           = 349 // { int __acl_get_fd(int filedes, \\\n\tSYS___ACL_SET_FD           = 350 // { int __acl_set_fd(int filedes, \\\n\tSYS___ACL_DELETE_FILE      = 351 // { int __acl_delete_file(const char *path, \\\n\tSYS___ACL_DELETE_FD        = 352 // { int __acl_delete_fd(int filedes, \\\n\tSYS___ACL_ACLCHECK_FILE    = 353 // { int __acl_aclcheck_file(const char *path, \\\n\tSYS___ACL_ACLCHECK_FD      = 354 // { int __acl_aclcheck_fd(int filedes, \\\n\tSYS_EXTATTRCTL             = 355 // { int extattrctl(const char *path, int cmd, \\\n\tSYS_EXTATTR_SET_FILE       = 356 // { ssize_t extattr_set_file( \\\n\tSYS_EXTATTR_GET_FILE       = 357 // { ssize_t extattr_get_file( \\\n\tSYS_EXTATTR_DELETE_FILE    = 358 // { int extattr_delete_file(const char *path, \\\n\tSYS_GETRESUID              = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \\\n\tSYS_GETRESGID              = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \\\n\tSYS_KQUEUE                 = 362 // { int kqueue(void); }\n\tSYS_KEVENT                 = 363 // { int kevent(int fd, \\\n\tSYS_EXTATTR_SET_FD         = 371 // { ssize_t extattr_set_fd(int fd, \\\n\tSYS_EXTATTR_GET_FD         = 372 // { ssize_t extattr_get_fd(int fd, \\\n\tSYS_EXTATTR_DELETE_FD      = 373 // { int extattr_delete_fd(int fd, \\\n\tSYS___SETUGID              = 374 // { int __setugid(int flag); }\n\tSYS_EACCESS                = 376 // { int eaccess(char *path, int amode); }\n\tSYS_NMOUNT                 = 378 // { int nmount(struct iovec *iovp, \\\n\tSYS___MAC_GET_PROC         = 384 // { int __mac_get_proc(struct mac *mac_p); }\n\tSYS___MAC_SET_PROC         = 385 // { int __mac_set_proc(struct mac *mac_p); }\n\tSYS___MAC_GET_FD           = 386 // { int __mac_get_fd(int fd, \\\n\tSYS___MAC_GET_FILE         = 387 // { int __mac_get_file(const char *path_p, \\\n\tSYS___MAC_SET_FD           = 388 // { int __mac_set_fd(int fd, \\\n\tSYS___MAC_SET_FILE         = 389 // { int __mac_set_file(const char *path_p, \\\n\tSYS_KENV                   = 390 // { int kenv(int what, const char *name, \\\n\tSYS_LCHFLAGS               = 391 // { int lchflags(const char *path, \\\n\tSYS_UUIDGEN                = 392 // { int uuidgen(struct uuid *store, \\\n\tSYS_SENDFILE               = 393 // { int sendfile(int fd, int s, off_t offset, \\\n\tSYS_MAC_SYSCALL            = 394 // { int mac_syscall(const char *policy, \\\n\tSYS_GETFSSTAT              = 395 // { int getfsstat(struct statfs *buf, \\\n\tSYS_STATFS                 = 396 // { int statfs(char *path, \\\n\tSYS_FSTATFS                = 397 // { int fstatfs(int fd, struct statfs *buf); }\n\tSYS_FHSTATFS               = 398 // { int fhstatfs(const struct fhandle *u_fhp, \\\n\tSYS___MAC_GET_PID          = 409 // { int __mac_get_pid(pid_t pid, \\\n\tSYS___MAC_GET_LINK         = 410 // { int __mac_get_link(const char *path_p, \\\n\tSYS___MAC_SET_LINK         = 411 // { int __mac_set_link(const char *path_p, \\\n\tSYS_EXTATTR_SET_LINK       = 412 // { ssize_t extattr_set_link( \\\n\tSYS_EXTATTR_GET_LINK       = 413 // { ssize_t extattr_get_link( \\\n\tSYS_EXTATTR_DELETE_LINK    = 414 // { int extattr_delete_link( \\\n\tSYS___MAC_EXECVE           = 415 // { int __mac_execve(char *fname, char **argv, \\\n\tSYS_SIGACTION              = 416 // { int sigaction(int sig, \\\n\tSYS_SIGRETURN              = 417 // { int sigreturn( \\\n\tSYS_GETCONTEXT             = 421 // { int getcontext(struct __ucontext *ucp); }\n\tSYS_SETCONTEXT             = 422 // { int setcontext( \\\n\tSYS_SWAPCONTEXT            = 423 // { int swapcontext(struct __ucontext *oucp, \\\n\tSYS_SWAPOFF                = 424 // { int swapoff(const char *name); }\n\tSYS___ACL_GET_LINK         = 425 // { int __acl_get_link(const char *path, \\\n\tSYS___ACL_SET_LINK         = 426 // { int __acl_set_link(const char *path, \\\n\tSYS___ACL_DELETE_LINK      = 427 // { int __acl_delete_link(const char *path, \\\n\tSYS___ACL_ACLCHECK_LINK    = 428 // { int __acl_aclcheck_link(const char *path, \\\n\tSYS_SIGWAIT                = 429 // { int sigwait(const sigset_t *set, \\\n\tSYS_THR_CREATE             = 430 // { int thr_create(ucontext_t *ctx, long *id, \\\n\tSYS_THR_EXIT               = 431 // { void thr_exit(long *state); }\n\tSYS_THR_SELF               = 432 // { int thr_self(long *id); }\n\tSYS_THR_KILL               = 433 // { int thr_kill(long id, int sig); }\n\tSYS__UMTX_LOCK             = 434 // { int _umtx_lock(struct umtx *umtx); }\n\tSYS__UMTX_UNLOCK           = 435 // { int _umtx_unlock(struct umtx *umtx); }\n\tSYS_JAIL_ATTACH            = 436 // { int jail_attach(int jid); }\n\tSYS_EXTATTR_LIST_FD        = 437 // { ssize_t extattr_list_fd(int fd, \\\n\tSYS_EXTATTR_LIST_FILE      = 438 // { ssize_t extattr_list_file( \\\n\tSYS_EXTATTR_LIST_LINK      = 439 // { ssize_t extattr_list_link( \\\n\tSYS_THR_SUSPEND            = 442 // { int thr_suspend( \\\n\tSYS_THR_WAKE               = 443 // { int thr_wake(long id); }\n\tSYS_KLDUNLOADF             = 444 // { int kldunloadf(int fileid, int flags); }\n\tSYS_AUDIT                  = 445 // { int audit(const void *record, \\\n\tSYS_AUDITON                = 446 // { int auditon(int cmd, void *data, \\\n\tSYS_GETAUID                = 447 // { int getauid(uid_t *auid); }\n\tSYS_SETAUID                = 448 // { int setauid(uid_t *auid); }\n\tSYS_GETAUDIT               = 449 // { int getaudit(struct auditinfo *auditinfo); }\n\tSYS_SETAUDIT               = 450 // { int setaudit(struct auditinfo *auditinfo); }\n\tSYS_GETAUDIT_ADDR          = 451 // { int getaudit_addr( \\\n\tSYS_SETAUDIT_ADDR          = 452 // { int setaudit_addr( \\\n\tSYS_AUDITCTL               = 453 // { int auditctl(char *path); }\n\tSYS__UMTX_OP               = 454 // { int _umtx_op(void *obj, int op, \\\n\tSYS_THR_NEW                = 455 // { int thr_new(struct thr_param *param, \\\n\tSYS_SIGQUEUE               = 456 // { int sigqueue(pid_t pid, int signum, void *value); }\n\tSYS_ABORT2                 = 463 // { int abort2(const char *why, int nargs, void **args); }\n\tSYS_THR_SET_NAME           = 464 // { int thr_set_name(long id, const char *name); }\n\tSYS_RTPRIO_THREAD          = 466 // { int rtprio_thread(int function, \\\n\tSYS_PREAD                  = 475 // { ssize_t pread(int fd, void *buf, \\\n\tSYS_PWRITE                 = 476 // { ssize_t pwrite(int fd, const void *buf, \\\n\tSYS_MMAP                   = 477 // { caddr_t mmap(caddr_t addr, size_t len, \\\n\tSYS_LSEEK                  = 478 // { off_t lseek(int fd, off_t offset, \\\n\tSYS_TRUNCATE               = 479 // { int truncate(char *path, off_t length); }\n\tSYS_FTRUNCATE              = 480 // { int ftruncate(int fd, off_t length); }\n\tSYS_THR_KILL2              = 481 // { int thr_kill2(pid_t pid, long id, int sig); }\n\tSYS_SHM_OPEN               = 482 // { int shm_open(const char *path, int flags, \\\n\tSYS_SHM_UNLINK             = 483 // { int shm_unlink(const char *path); }\n\tSYS_CPUSET                 = 484 // { int cpuset(cpusetid_t *setid); }\n\tSYS_CPUSET_SETID           = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \\\n\tSYS_CPUSET_GETID           = 486 // { int cpuset_getid(cpulevel_t level, \\\n\tSYS_CPUSET_GETAFFINITY     = 487 // { int cpuset_getaffinity(cpulevel_t level, \\\n\tSYS_CPUSET_SETAFFINITY     = 488 // { int cpuset_setaffinity(cpulevel_t level, \\\n\tSYS_FACCESSAT              = 489 // { int faccessat(int fd, char *path, int amode, \\\n\tSYS_FCHMODAT               = 490 // { int fchmodat(int fd, char *path, mode_t mode, \\\n\tSYS_FCHOWNAT               = 491 // { int fchownat(int fd, char *path, uid_t uid, \\\n\tSYS_FEXECVE                = 492 // { int fexecve(int fd, char **argv, \\\n\tSYS_FSTATAT                = 493 // { int fstatat(int fd, char *path, \\\n\tSYS_FUTIMESAT              = 494 // { int futimesat(int fd, char *path, \\\n\tSYS_LINKAT                 = 495 // { int linkat(int fd1, char *path1, int fd2, \\\n\tSYS_MKDIRAT                = 496 // { int mkdirat(int fd, char *path, mode_t mode); }\n\tSYS_MKFIFOAT               = 497 // { int mkfifoat(int fd, char *path, mode_t mode); }\n\tSYS_MKNODAT                = 498 // { int mknodat(int fd, char *path, mode_t mode, \\\n\tSYS_OPENAT                 = 499 // { int openat(int fd, char *path, int flag, \\\n\tSYS_READLINKAT             = 500 // { int readlinkat(int fd, char *path, char *buf, \\\n\tSYS_RENAMEAT               = 501 // { int renameat(int oldfd, char *old, int newfd, \\\n\tSYS_SYMLINKAT              = 502 // { int symlinkat(char *path1, int fd, \\\n\tSYS_UNLINKAT               = 503 // { int unlinkat(int fd, char *path, int flag); }\n\tSYS_POSIX_OPENPT           = 504 // { int posix_openpt(int flags); }\n\tSYS_JAIL_GET               = 506 // { int jail_get(struct iovec *iovp, \\\n\tSYS_JAIL_SET               = 507 // { int jail_set(struct iovec *iovp, \\\n\tSYS_JAIL_REMOVE            = 508 // { int jail_remove(int jid); }\n\tSYS_CLOSEFROM              = 509 // { int closefrom(int lowfd); }\n\tSYS_LPATHCONF              = 513 // { int lpathconf(char *path, int name); }\n\tSYS___CAP_RIGHTS_GET       = 515 // { int __cap_rights_get(int version, \\\n\tSYS_CAP_ENTER              = 516 // { int cap_enter(void); }\n\tSYS_CAP_GETMODE            = 517 // { int cap_getmode(u_int *modep); }\n\tSYS_PDFORK                 = 518 // { int pdfork(int *fdp, int flags); }\n\tSYS_PDKILL                 = 519 // { int pdkill(int fd, int signum); }\n\tSYS_PDGETPID               = 520 // { int pdgetpid(int fd, pid_t *pidp); }\n\tSYS_PSELECT                = 522 // { int pselect(int nd, fd_set *in, \\\n\tSYS_GETLOGINCLASS          = 523 // { int getloginclass(char *namebuf, \\\n\tSYS_SETLOGINCLASS          = 524 // { int setloginclass(const char *namebuf); }\n\tSYS_RCTL_GET_RACCT         = 525 // { int rctl_get_racct(const void *inbufp, \\\n\tSYS_RCTL_GET_RULES         = 526 // { int rctl_get_rules(const void *inbufp, \\\n\tSYS_RCTL_GET_LIMITS        = 527 // { int rctl_get_limits(const void *inbufp, \\\n\tSYS_RCTL_ADD_RULE          = 528 // { int rctl_add_rule(const void *inbufp, \\\n\tSYS_RCTL_REMOVE_RULE       = 529 // { int rctl_remove_rule(const void *inbufp, \\\n\tSYS_POSIX_FALLOCATE        = 530 // { int posix_fallocate(int fd, \\\n\tSYS_POSIX_FADVISE          = 531 // { int posix_fadvise(int fd, off_t offset, \\\n\tSYS_WAIT6                  = 532 // { int wait6(idtype_t idtype, id_t id, \\\n\tSYS_CAP_RIGHTS_LIMIT       = 533 // { int cap_rights_limit(int fd, \\\n\tSYS_CAP_IOCTLS_LIMIT       = 534 // { int cap_ioctls_limit(int fd, \\\n\tSYS_CAP_IOCTLS_GET         = 535 // { ssize_t cap_ioctls_get(int fd, \\\n\tSYS_CAP_FCNTLS_LIMIT       = 536 // { int cap_fcntls_limit(int fd, \\\n\tSYS_CAP_FCNTLS_GET         = 537 // { int cap_fcntls_get(int fd, \\\n\tSYS_BINDAT                 = 538 // { int bindat(int fd, int s, caddr_t name, \\\n\tSYS_CONNECTAT              = 539 // { int connectat(int fd, int s, caddr_t name, \\\n\tSYS_CHFLAGSAT              = 540 // { int chflagsat(int fd, const char *path, \\\n\tSYS_ACCEPT4                = 541 // { int accept4(int s, \\\n\tSYS_PIPE2                  = 542 // { int pipe2(int *fildes, int flags); }\n\tSYS_PROCCTL                = 544 // { int procctl(idtype_t idtype, id_t id, \\\n\tSYS_PPOLL                  = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \\\n\tSYS_FUTIMENS               = 546 // { int futimens(int fd, \\\n\tSYS_UTIMENSAT              = 547 // { int utimensat(int fd, \\\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go",
    "content": "// mksysnum_freebsd.pl\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,freebsd\n\npackage unix\n\nconst (\n\t// SYS_NOSYS = 0;  // { int nosys(void); } syscall nosys_args int\n\tSYS_EXIT                   = 1   // { void sys_exit(int rval); } exit \\\n\tSYS_FORK                   = 2   // { int fork(void); }\n\tSYS_READ                   = 3   // { ssize_t read(int fd, void *buf, \\\n\tSYS_WRITE                  = 4   // { ssize_t write(int fd, const void *buf, \\\n\tSYS_OPEN                   = 5   // { int open(char *path, int flags, int mode); }\n\tSYS_CLOSE                  = 6   // { int close(int fd); }\n\tSYS_WAIT4                  = 7   // { int wait4(int pid, int *status, \\\n\tSYS_LINK                   = 9   // { int link(char *path, char *link); }\n\tSYS_UNLINK                 = 10  // { int unlink(char *path); }\n\tSYS_CHDIR                  = 12  // { int chdir(char *path); }\n\tSYS_FCHDIR                 = 13  // { int fchdir(int fd); }\n\tSYS_MKNOD                  = 14  // { int mknod(char *path, int mode, int dev); }\n\tSYS_CHMOD                  = 15  // { int chmod(char *path, int mode); }\n\tSYS_CHOWN                  = 16  // { int chown(char *path, int uid, int gid); }\n\tSYS_OBREAK                 = 17  // { int obreak(char *nsize); } break \\\n\tSYS_GETPID                 = 20  // { pid_t getpid(void); }\n\tSYS_MOUNT                  = 21  // { int mount(char *type, char *path, \\\n\tSYS_UNMOUNT                = 22  // { int unmount(char *path, int flags); }\n\tSYS_SETUID                 = 23  // { int setuid(uid_t uid); }\n\tSYS_GETUID                 = 24  // { uid_t getuid(void); }\n\tSYS_GETEUID                = 25  // { uid_t geteuid(void); }\n\tSYS_PTRACE                 = 26  // { int ptrace(int req, pid_t pid, \\\n\tSYS_RECVMSG                = 27  // { int recvmsg(int s, struct msghdr *msg, \\\n\tSYS_SENDMSG                = 28  // { int sendmsg(int s, struct msghdr *msg, \\\n\tSYS_RECVFROM               = 29  // { int recvfrom(int s, caddr_t buf, \\\n\tSYS_ACCEPT                 = 30  // { int accept(int s, \\\n\tSYS_GETPEERNAME            = 31  // { int getpeername(int fdes, \\\n\tSYS_GETSOCKNAME            = 32  // { int getsockname(int fdes, \\\n\tSYS_ACCESS                 = 33  // { int access(char *path, int amode); }\n\tSYS_CHFLAGS                = 34  // { int chflags(const char *path, u_long flags); }\n\tSYS_FCHFLAGS               = 35  // { int fchflags(int fd, u_long flags); }\n\tSYS_SYNC                   = 36  // { int sync(void); }\n\tSYS_KILL                   = 37  // { int kill(int pid, int signum); }\n\tSYS_GETPPID                = 39  // { pid_t getppid(void); }\n\tSYS_DUP                    = 41  // { int dup(u_int fd); }\n\tSYS_PIPE                   = 42  // { int pipe(void); }\n\tSYS_GETEGID                = 43  // { gid_t getegid(void); }\n\tSYS_PROFIL                 = 44  // { int profil(caddr_t samples, size_t size, \\\n\tSYS_KTRACE                 = 45  // { int ktrace(const char *fname, int ops, \\\n\tSYS_GETGID                 = 47  // { gid_t getgid(void); }\n\tSYS_GETLOGIN               = 49  // { int getlogin(char *namebuf, u_int \\\n\tSYS_SETLOGIN               = 50  // { int setlogin(char *namebuf); }\n\tSYS_ACCT                   = 51  // { int acct(char *path); }\n\tSYS_SIGALTSTACK            = 53  // { int sigaltstack(stack_t *ss, \\\n\tSYS_IOCTL                  = 54  // { int ioctl(int fd, u_long com, \\\n\tSYS_REBOOT                 = 55  // { int reboot(int opt); }\n\tSYS_REVOKE                 = 56  // { int revoke(char *path); }\n\tSYS_SYMLINK                = 57  // { int symlink(char *path, char *link); }\n\tSYS_READLINK               = 58  // { ssize_t readlink(char *path, char *buf, \\\n\tSYS_EXECVE                 = 59  // { int execve(char *fname, char **argv, \\\n\tSYS_UMASK                  = 60  // { int umask(int newmask); } umask umask_args \\\n\tSYS_CHROOT                 = 61  // { int chroot(char *path); }\n\tSYS_MSYNC                  = 65  // { int msync(void *addr, size_t len, \\\n\tSYS_VFORK                  = 66  // { int vfork(void); }\n\tSYS_SBRK                   = 69  // { int sbrk(int incr); }\n\tSYS_SSTK                   = 70  // { int sstk(int incr); }\n\tSYS_OVADVISE               = 72  // { int ovadvise(int anom); } vadvise \\\n\tSYS_MUNMAP                 = 73  // { int munmap(void *addr, size_t len); }\n\tSYS_MPROTECT               = 74  // { int mprotect(const void *addr, size_t len, \\\n\tSYS_MADVISE                = 75  // { int madvise(void *addr, size_t len, \\\n\tSYS_MINCORE                = 78  // { int mincore(const void *addr, size_t len, \\\n\tSYS_GETGROUPS              = 79  // { int getgroups(u_int gidsetsize, \\\n\tSYS_SETGROUPS              = 80  // { int setgroups(u_int gidsetsize, \\\n\tSYS_GETPGRP                = 81  // { int getpgrp(void); }\n\tSYS_SETPGID                = 82  // { int setpgid(int pid, int pgid); }\n\tSYS_SETITIMER              = 83  // { int setitimer(u_int which, struct \\\n\tSYS_SWAPON                 = 85  // { int swapon(char *name); }\n\tSYS_GETITIMER              = 86  // { int getitimer(u_int which, \\\n\tSYS_GETDTABLESIZE          = 89  // { int getdtablesize(void); }\n\tSYS_DUP2                   = 90  // { int dup2(u_int from, u_int to); }\n\tSYS_FCNTL                  = 92  // { int fcntl(int fd, int cmd, long arg); }\n\tSYS_SELECT                 = 93  // { int select(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_FSYNC                  = 95  // { int fsync(int fd); }\n\tSYS_SETPRIORITY            = 96  // { int setpriority(int which, int who, \\\n\tSYS_SOCKET                 = 97  // { int socket(int domain, int type, \\\n\tSYS_CONNECT                = 98  // { int connect(int s, caddr_t name, \\\n\tSYS_GETPRIORITY            = 100 // { int getpriority(int which, int who); }\n\tSYS_BIND                   = 104 // { int bind(int s, caddr_t name, \\\n\tSYS_SETSOCKOPT             = 105 // { int setsockopt(int s, int level, int name, \\\n\tSYS_LISTEN                 = 106 // { int listen(int s, int backlog); }\n\tSYS_GETTIMEOFDAY           = 116 // { int gettimeofday(struct timeval *tp, \\\n\tSYS_GETRUSAGE              = 117 // { int getrusage(int who, \\\n\tSYS_GETSOCKOPT             = 118 // { int getsockopt(int s, int level, int name, \\\n\tSYS_READV                  = 120 // { int readv(int fd, struct iovec *iovp, \\\n\tSYS_WRITEV                 = 121 // { int writev(int fd, struct iovec *iovp, \\\n\tSYS_SETTIMEOFDAY           = 122 // { int settimeofday(struct timeval *tv, \\\n\tSYS_FCHOWN                 = 123 // { int fchown(int fd, int uid, int gid); }\n\tSYS_FCHMOD                 = 124 // { int fchmod(int fd, int mode); }\n\tSYS_SETREUID               = 126 // { int setreuid(int ruid, int euid); }\n\tSYS_SETREGID               = 127 // { int setregid(int rgid, int egid); }\n\tSYS_RENAME                 = 128 // { int rename(char *from, char *to); }\n\tSYS_FLOCK                  = 131 // { int flock(int fd, int how); }\n\tSYS_MKFIFO                 = 132 // { int mkfifo(char *path, int mode); }\n\tSYS_SENDTO                 = 133 // { int sendto(int s, caddr_t buf, size_t len, \\\n\tSYS_SHUTDOWN               = 134 // { int shutdown(int s, int how); }\n\tSYS_SOCKETPAIR             = 135 // { int socketpair(int domain, int type, \\\n\tSYS_MKDIR                  = 136 // { int mkdir(char *path, int mode); }\n\tSYS_RMDIR                  = 137 // { int rmdir(char *path); }\n\tSYS_UTIMES                 = 138 // { int utimes(char *path, \\\n\tSYS_ADJTIME                = 140 // { int adjtime(struct timeval *delta, \\\n\tSYS_SETSID                 = 147 // { int setsid(void); }\n\tSYS_QUOTACTL               = 148 // { int quotactl(char *path, int cmd, int uid, \\\n\tSYS_LGETFH                 = 160 // { int lgetfh(char *fname, \\\n\tSYS_GETFH                  = 161 // { int getfh(char *fname, \\\n\tSYS_SYSARCH                = 165 // { int sysarch(int op, char *parms); }\n\tSYS_RTPRIO                 = 166 // { int rtprio(int function, pid_t pid, \\\n\tSYS_FREEBSD6_PREAD         = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \\\n\tSYS_FREEBSD6_PWRITE        = 174 // { ssize_t freebsd6_pwrite(int fd, \\\n\tSYS_SETFIB                 = 175 // { int setfib(int fibnum); }\n\tSYS_NTP_ADJTIME            = 176 // { int ntp_adjtime(struct timex *tp); }\n\tSYS_SETGID                 = 181 // { int setgid(gid_t gid); }\n\tSYS_SETEGID                = 182 // { int setegid(gid_t egid); }\n\tSYS_SETEUID                = 183 // { int seteuid(uid_t euid); }\n\tSYS_STAT                   = 188 // { int stat(char *path, struct stat *ub); }\n\tSYS_FSTAT                  = 189 // { int fstat(int fd, struct stat *sb); }\n\tSYS_LSTAT                  = 190 // { int lstat(char *path, struct stat *ub); }\n\tSYS_PATHCONF               = 191 // { int pathconf(char *path, int name); }\n\tSYS_FPATHCONF              = 192 // { int fpathconf(int fd, int name); }\n\tSYS_GETRLIMIT              = 194 // { int getrlimit(u_int which, \\\n\tSYS_SETRLIMIT              = 195 // { int setrlimit(u_int which, \\\n\tSYS_GETDIRENTRIES          = 196 // { int getdirentries(int fd, char *buf, \\\n\tSYS_FREEBSD6_MMAP          = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \\\n\tSYS_FREEBSD6_LSEEK         = 199 // { off_t freebsd6_lseek(int fd, int pad, \\\n\tSYS_FREEBSD6_TRUNCATE      = 200 // { int freebsd6_truncate(char *path, int pad, \\\n\tSYS_FREEBSD6_FTRUNCATE     = 201 // { int freebsd6_ftruncate(int fd, int pad, \\\n\tSYS___SYSCTL               = 202 // { int __sysctl(int *name, u_int namelen, \\\n\tSYS_MLOCK                  = 203 // { int mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK                = 204 // { int munlock(const void *addr, size_t len); }\n\tSYS_UNDELETE               = 205 // { int undelete(char *path); }\n\tSYS_FUTIMES                = 206 // { int futimes(int fd, struct timeval *tptr); }\n\tSYS_GETPGID                = 207 // { int getpgid(pid_t pid); }\n\tSYS_POLL                   = 209 // { int poll(struct pollfd *fds, u_int nfds, \\\n\tSYS_CLOCK_GETTIME          = 232 // { int clock_gettime(clockid_t clock_id, \\\n\tSYS_CLOCK_SETTIME          = 233 // { int clock_settime( \\\n\tSYS_CLOCK_GETRES           = 234 // { int clock_getres(clockid_t clock_id, \\\n\tSYS_KTIMER_CREATE          = 235 // { int ktimer_create(clockid_t clock_id, \\\n\tSYS_KTIMER_DELETE          = 236 // { int ktimer_delete(int timerid); }\n\tSYS_KTIMER_SETTIME         = 237 // { int ktimer_settime(int timerid, int flags, \\\n\tSYS_KTIMER_GETTIME         = 238 // { int ktimer_gettime(int timerid, struct \\\n\tSYS_KTIMER_GETOVERRUN      = 239 // { int ktimer_getoverrun(int timerid); }\n\tSYS_NANOSLEEP              = 240 // { int nanosleep(const struct timespec *rqtp, \\\n\tSYS_FFCLOCK_GETCOUNTER     = 241 // { int ffclock_getcounter(ffcounter *ffcount); }\n\tSYS_FFCLOCK_SETESTIMATE    = 242 // { int ffclock_setestimate( \\\n\tSYS_FFCLOCK_GETESTIMATE    = 243 // { int ffclock_getestimate( \\\n\tSYS_CLOCK_GETCPUCLOCKID2   = 247 // { int clock_getcpuclockid2(id_t id,\\\n\tSYS_NTP_GETTIME            = 248 // { int ntp_gettime(struct ntptimeval *ntvp); }\n\tSYS_MINHERIT               = 250 // { int minherit(void *addr, size_t len, \\\n\tSYS_RFORK                  = 251 // { int rfork(int flags); }\n\tSYS_OPENBSD_POLL           = 252 // { int openbsd_poll(struct pollfd *fds, \\\n\tSYS_ISSETUGID              = 253 // { int issetugid(void); }\n\tSYS_LCHOWN                 = 254 // { int lchown(char *path, int uid, int gid); }\n\tSYS_GETDENTS               = 272 // { int getdents(int fd, char *buf, \\\n\tSYS_LCHMOD                 = 274 // { int lchmod(char *path, mode_t mode); }\n\tSYS_LUTIMES                = 276 // { int lutimes(char *path, \\\n\tSYS_NSTAT                  = 278 // { int nstat(char *path, struct nstat *ub); }\n\tSYS_NFSTAT                 = 279 // { int nfstat(int fd, struct nstat *sb); }\n\tSYS_NLSTAT                 = 280 // { int nlstat(char *path, struct nstat *ub); }\n\tSYS_PREADV                 = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \\\n\tSYS_PWRITEV                = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \\\n\tSYS_FHOPEN                 = 298 // { int fhopen(const struct fhandle *u_fhp, \\\n\tSYS_FHSTAT                 = 299 // { int fhstat(const struct fhandle *u_fhp, \\\n\tSYS_MODNEXT                = 300 // { int modnext(int modid); }\n\tSYS_MODSTAT                = 301 // { int modstat(int modid, \\\n\tSYS_MODFNEXT               = 302 // { int modfnext(int modid); }\n\tSYS_MODFIND                = 303 // { int modfind(const char *name); }\n\tSYS_KLDLOAD                = 304 // { int kldload(const char *file); }\n\tSYS_KLDUNLOAD              = 305 // { int kldunload(int fileid); }\n\tSYS_KLDFIND                = 306 // { int kldfind(const char *file); }\n\tSYS_KLDNEXT                = 307 // { int kldnext(int fileid); }\n\tSYS_KLDSTAT                = 308 // { int kldstat(int fileid, struct \\\n\tSYS_KLDFIRSTMOD            = 309 // { int kldfirstmod(int fileid); }\n\tSYS_GETSID                 = 310 // { int getsid(pid_t pid); }\n\tSYS_SETRESUID              = 311 // { int setresuid(uid_t ruid, uid_t euid, \\\n\tSYS_SETRESGID              = 312 // { int setresgid(gid_t rgid, gid_t egid, \\\n\tSYS_YIELD                  = 321 // { int yield(void); }\n\tSYS_MLOCKALL               = 324 // { int mlockall(int how); }\n\tSYS_MUNLOCKALL             = 325 // { int munlockall(void); }\n\tSYS___GETCWD               = 326 // { int __getcwd(char *buf, u_int buflen); }\n\tSYS_SCHED_SETPARAM         = 327 // { int sched_setparam (pid_t pid, \\\n\tSYS_SCHED_GETPARAM         = 328 // { int sched_getparam (pid_t pid, struct \\\n\tSYS_SCHED_SETSCHEDULER     = 329 // { int sched_setscheduler (pid_t pid, int \\\n\tSYS_SCHED_GETSCHEDULER     = 330 // { int sched_getscheduler (pid_t pid); }\n\tSYS_SCHED_YIELD            = 331 // { int sched_yield (void); }\n\tSYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); }\n\tSYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); }\n\tSYS_SCHED_RR_GET_INTERVAL  = 334 // { int sched_rr_get_interval (pid_t pid, \\\n\tSYS_UTRACE                 = 335 // { int utrace(const void *addr, size_t len); }\n\tSYS_KLDSYM                 = 337 // { int kldsym(int fileid, int cmd, \\\n\tSYS_JAIL                   = 338 // { int jail(struct jail *jail); }\n\tSYS_SIGPROCMASK            = 340 // { int sigprocmask(int how, \\\n\tSYS_SIGSUSPEND             = 341 // { int sigsuspend(const sigset_t *sigmask); }\n\tSYS_SIGPENDING             = 343 // { int sigpending(sigset_t *set); }\n\tSYS_SIGTIMEDWAIT           = 345 // { int sigtimedwait(const sigset_t *set, \\\n\tSYS_SIGWAITINFO            = 346 // { int sigwaitinfo(const sigset_t *set, \\\n\tSYS___ACL_GET_FILE         = 347 // { int __acl_get_file(const char *path, \\\n\tSYS___ACL_SET_FILE         = 348 // { int __acl_set_file(const char *path, \\\n\tSYS___ACL_GET_FD           = 349 // { int __acl_get_fd(int filedes, \\\n\tSYS___ACL_SET_FD           = 350 // { int __acl_set_fd(int filedes, \\\n\tSYS___ACL_DELETE_FILE      = 351 // { int __acl_delete_file(const char *path, \\\n\tSYS___ACL_DELETE_FD        = 352 // { int __acl_delete_fd(int filedes, \\\n\tSYS___ACL_ACLCHECK_FILE    = 353 // { int __acl_aclcheck_file(const char *path, \\\n\tSYS___ACL_ACLCHECK_FD      = 354 // { int __acl_aclcheck_fd(int filedes, \\\n\tSYS_EXTATTRCTL             = 355 // { int extattrctl(const char *path, int cmd, \\\n\tSYS_EXTATTR_SET_FILE       = 356 // { ssize_t extattr_set_file( \\\n\tSYS_EXTATTR_GET_FILE       = 357 // { ssize_t extattr_get_file( \\\n\tSYS_EXTATTR_DELETE_FILE    = 358 // { int extattr_delete_file(const char *path, \\\n\tSYS_GETRESUID              = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \\\n\tSYS_GETRESGID              = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \\\n\tSYS_KQUEUE                 = 362 // { int kqueue(void); }\n\tSYS_KEVENT                 = 363 // { int kevent(int fd, \\\n\tSYS_EXTATTR_SET_FD         = 371 // { ssize_t extattr_set_fd(int fd, \\\n\tSYS_EXTATTR_GET_FD         = 372 // { ssize_t extattr_get_fd(int fd, \\\n\tSYS_EXTATTR_DELETE_FD      = 373 // { int extattr_delete_fd(int fd, \\\n\tSYS___SETUGID              = 374 // { int __setugid(int flag); }\n\tSYS_EACCESS                = 376 // { int eaccess(char *path, int amode); }\n\tSYS_NMOUNT                 = 378 // { int nmount(struct iovec *iovp, \\\n\tSYS___MAC_GET_PROC         = 384 // { int __mac_get_proc(struct mac *mac_p); }\n\tSYS___MAC_SET_PROC         = 385 // { int __mac_set_proc(struct mac *mac_p); }\n\tSYS___MAC_GET_FD           = 386 // { int __mac_get_fd(int fd, \\\n\tSYS___MAC_GET_FILE         = 387 // { int __mac_get_file(const char *path_p, \\\n\tSYS___MAC_SET_FD           = 388 // { int __mac_set_fd(int fd, \\\n\tSYS___MAC_SET_FILE         = 389 // { int __mac_set_file(const char *path_p, \\\n\tSYS_KENV                   = 390 // { int kenv(int what, const char *name, \\\n\tSYS_LCHFLAGS               = 391 // { int lchflags(const char *path, \\\n\tSYS_UUIDGEN                = 392 // { int uuidgen(struct uuid *store, \\\n\tSYS_SENDFILE               = 393 // { int sendfile(int fd, int s, off_t offset, \\\n\tSYS_MAC_SYSCALL            = 394 // { int mac_syscall(const char *policy, \\\n\tSYS_GETFSSTAT              = 395 // { int getfsstat(struct statfs *buf, \\\n\tSYS_STATFS                 = 396 // { int statfs(char *path, \\\n\tSYS_FSTATFS                = 397 // { int fstatfs(int fd, struct statfs *buf); }\n\tSYS_FHSTATFS               = 398 // { int fhstatfs(const struct fhandle *u_fhp, \\\n\tSYS___MAC_GET_PID          = 409 // { int __mac_get_pid(pid_t pid, \\\n\tSYS___MAC_GET_LINK         = 410 // { int __mac_get_link(const char *path_p, \\\n\tSYS___MAC_SET_LINK         = 411 // { int __mac_set_link(const char *path_p, \\\n\tSYS_EXTATTR_SET_LINK       = 412 // { ssize_t extattr_set_link( \\\n\tSYS_EXTATTR_GET_LINK       = 413 // { ssize_t extattr_get_link( \\\n\tSYS_EXTATTR_DELETE_LINK    = 414 // { int extattr_delete_link( \\\n\tSYS___MAC_EXECVE           = 415 // { int __mac_execve(char *fname, char **argv, \\\n\tSYS_SIGACTION              = 416 // { int sigaction(int sig, \\\n\tSYS_SIGRETURN              = 417 // { int sigreturn( \\\n\tSYS_GETCONTEXT             = 421 // { int getcontext(struct __ucontext *ucp); }\n\tSYS_SETCONTEXT             = 422 // { int setcontext( \\\n\tSYS_SWAPCONTEXT            = 423 // { int swapcontext(struct __ucontext *oucp, \\\n\tSYS_SWAPOFF                = 424 // { int swapoff(const char *name); }\n\tSYS___ACL_GET_LINK         = 425 // { int __acl_get_link(const char *path, \\\n\tSYS___ACL_SET_LINK         = 426 // { int __acl_set_link(const char *path, \\\n\tSYS___ACL_DELETE_LINK      = 427 // { int __acl_delete_link(const char *path, \\\n\tSYS___ACL_ACLCHECK_LINK    = 428 // { int __acl_aclcheck_link(const char *path, \\\n\tSYS_SIGWAIT                = 429 // { int sigwait(const sigset_t *set, \\\n\tSYS_THR_CREATE             = 430 // { int thr_create(ucontext_t *ctx, long *id, \\\n\tSYS_THR_EXIT               = 431 // { void thr_exit(long *state); }\n\tSYS_THR_SELF               = 432 // { int thr_self(long *id); }\n\tSYS_THR_KILL               = 433 // { int thr_kill(long id, int sig); }\n\tSYS__UMTX_LOCK             = 434 // { int _umtx_lock(struct umtx *umtx); }\n\tSYS__UMTX_UNLOCK           = 435 // { int _umtx_unlock(struct umtx *umtx); }\n\tSYS_JAIL_ATTACH            = 436 // { int jail_attach(int jid); }\n\tSYS_EXTATTR_LIST_FD        = 437 // { ssize_t extattr_list_fd(int fd, \\\n\tSYS_EXTATTR_LIST_FILE      = 438 // { ssize_t extattr_list_file( \\\n\tSYS_EXTATTR_LIST_LINK      = 439 // { ssize_t extattr_list_link( \\\n\tSYS_THR_SUSPEND            = 442 // { int thr_suspend( \\\n\tSYS_THR_WAKE               = 443 // { int thr_wake(long id); }\n\tSYS_KLDUNLOADF             = 444 // { int kldunloadf(int fileid, int flags); }\n\tSYS_AUDIT                  = 445 // { int audit(const void *record, \\\n\tSYS_AUDITON                = 446 // { int auditon(int cmd, void *data, \\\n\tSYS_GETAUID                = 447 // { int getauid(uid_t *auid); }\n\tSYS_SETAUID                = 448 // { int setauid(uid_t *auid); }\n\tSYS_GETAUDIT               = 449 // { int getaudit(struct auditinfo *auditinfo); }\n\tSYS_SETAUDIT               = 450 // { int setaudit(struct auditinfo *auditinfo); }\n\tSYS_GETAUDIT_ADDR          = 451 // { int getaudit_addr( \\\n\tSYS_SETAUDIT_ADDR          = 452 // { int setaudit_addr( \\\n\tSYS_AUDITCTL               = 453 // { int auditctl(char *path); }\n\tSYS__UMTX_OP               = 454 // { int _umtx_op(void *obj, int op, \\\n\tSYS_THR_NEW                = 455 // { int thr_new(struct thr_param *param, \\\n\tSYS_SIGQUEUE               = 456 // { int sigqueue(pid_t pid, int signum, void *value); }\n\tSYS_ABORT2                 = 463 // { int abort2(const char *why, int nargs, void **args); }\n\tSYS_THR_SET_NAME           = 464 // { int thr_set_name(long id, const char *name); }\n\tSYS_RTPRIO_THREAD          = 466 // { int rtprio_thread(int function, \\\n\tSYS_PREAD                  = 475 // { ssize_t pread(int fd, void *buf, \\\n\tSYS_PWRITE                 = 476 // { ssize_t pwrite(int fd, const void *buf, \\\n\tSYS_MMAP                   = 477 // { caddr_t mmap(caddr_t addr, size_t len, \\\n\tSYS_LSEEK                  = 478 // { off_t lseek(int fd, off_t offset, \\\n\tSYS_TRUNCATE               = 479 // { int truncate(char *path, off_t length); }\n\tSYS_FTRUNCATE              = 480 // { int ftruncate(int fd, off_t length); }\n\tSYS_THR_KILL2              = 481 // { int thr_kill2(pid_t pid, long id, int sig); }\n\tSYS_SHM_OPEN               = 482 // { int shm_open(const char *path, int flags, \\\n\tSYS_SHM_UNLINK             = 483 // { int shm_unlink(const char *path); }\n\tSYS_CPUSET                 = 484 // { int cpuset(cpusetid_t *setid); }\n\tSYS_CPUSET_SETID           = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \\\n\tSYS_CPUSET_GETID           = 486 // { int cpuset_getid(cpulevel_t level, \\\n\tSYS_CPUSET_GETAFFINITY     = 487 // { int cpuset_getaffinity(cpulevel_t level, \\\n\tSYS_CPUSET_SETAFFINITY     = 488 // { int cpuset_setaffinity(cpulevel_t level, \\\n\tSYS_FACCESSAT              = 489 // { int faccessat(int fd, char *path, int amode, \\\n\tSYS_FCHMODAT               = 490 // { int fchmodat(int fd, char *path, mode_t mode, \\\n\tSYS_FCHOWNAT               = 491 // { int fchownat(int fd, char *path, uid_t uid, \\\n\tSYS_FEXECVE                = 492 // { int fexecve(int fd, char **argv, \\\n\tSYS_FSTATAT                = 493 // { int fstatat(int fd, char *path, \\\n\tSYS_FUTIMESAT              = 494 // { int futimesat(int fd, char *path, \\\n\tSYS_LINKAT                 = 495 // { int linkat(int fd1, char *path1, int fd2, \\\n\tSYS_MKDIRAT                = 496 // { int mkdirat(int fd, char *path, mode_t mode); }\n\tSYS_MKFIFOAT               = 497 // { int mkfifoat(int fd, char *path, mode_t mode); }\n\tSYS_MKNODAT                = 498 // { int mknodat(int fd, char *path, mode_t mode, \\\n\tSYS_OPENAT                 = 499 // { int openat(int fd, char *path, int flag, \\\n\tSYS_READLINKAT             = 500 // { int readlinkat(int fd, char *path, char *buf, \\\n\tSYS_RENAMEAT               = 501 // { int renameat(int oldfd, char *old, int newfd, \\\n\tSYS_SYMLINKAT              = 502 // { int symlinkat(char *path1, int fd, \\\n\tSYS_UNLINKAT               = 503 // { int unlinkat(int fd, char *path, int flag); }\n\tSYS_POSIX_OPENPT           = 504 // { int posix_openpt(int flags); }\n\tSYS_JAIL_GET               = 506 // { int jail_get(struct iovec *iovp, \\\n\tSYS_JAIL_SET               = 507 // { int jail_set(struct iovec *iovp, \\\n\tSYS_JAIL_REMOVE            = 508 // { int jail_remove(int jid); }\n\tSYS_CLOSEFROM              = 509 // { int closefrom(int lowfd); }\n\tSYS_LPATHCONF              = 513 // { int lpathconf(char *path, int name); }\n\tSYS___CAP_RIGHTS_GET       = 515 // { int __cap_rights_get(int version, \\\n\tSYS_CAP_ENTER              = 516 // { int cap_enter(void); }\n\tSYS_CAP_GETMODE            = 517 // { int cap_getmode(u_int *modep); }\n\tSYS_PDFORK                 = 518 // { int pdfork(int *fdp, int flags); }\n\tSYS_PDKILL                 = 519 // { int pdkill(int fd, int signum); }\n\tSYS_PDGETPID               = 520 // { int pdgetpid(int fd, pid_t *pidp); }\n\tSYS_PSELECT                = 522 // { int pselect(int nd, fd_set *in, \\\n\tSYS_GETLOGINCLASS          = 523 // { int getloginclass(char *namebuf, \\\n\tSYS_SETLOGINCLASS          = 524 // { int setloginclass(const char *namebuf); }\n\tSYS_RCTL_GET_RACCT         = 525 // { int rctl_get_racct(const void *inbufp, \\\n\tSYS_RCTL_GET_RULES         = 526 // { int rctl_get_rules(const void *inbufp, \\\n\tSYS_RCTL_GET_LIMITS        = 527 // { int rctl_get_limits(const void *inbufp, \\\n\tSYS_RCTL_ADD_RULE          = 528 // { int rctl_add_rule(const void *inbufp, \\\n\tSYS_RCTL_REMOVE_RULE       = 529 // { int rctl_remove_rule(const void *inbufp, \\\n\tSYS_POSIX_FALLOCATE        = 530 // { int posix_fallocate(int fd, \\\n\tSYS_POSIX_FADVISE          = 531 // { int posix_fadvise(int fd, off_t offset, \\\n\tSYS_WAIT6                  = 532 // { int wait6(idtype_t idtype, id_t id, \\\n\tSYS_CAP_RIGHTS_LIMIT       = 533 // { int cap_rights_limit(int fd, \\\n\tSYS_CAP_IOCTLS_LIMIT       = 534 // { int cap_ioctls_limit(int fd, \\\n\tSYS_CAP_IOCTLS_GET         = 535 // { ssize_t cap_ioctls_get(int fd, \\\n\tSYS_CAP_FCNTLS_LIMIT       = 536 // { int cap_fcntls_limit(int fd, \\\n\tSYS_CAP_FCNTLS_GET         = 537 // { int cap_fcntls_get(int fd, \\\n\tSYS_BINDAT                 = 538 // { int bindat(int fd, int s, caddr_t name, \\\n\tSYS_CONNECTAT              = 539 // { int connectat(int fd, int s, caddr_t name, \\\n\tSYS_CHFLAGSAT              = 540 // { int chflagsat(int fd, const char *path, \\\n\tSYS_ACCEPT4                = 541 // { int accept4(int s, \\\n\tSYS_PIPE2                  = 542 // { int pipe2(int *fildes, int flags); }\n\tSYS_PROCCTL                = 544 // { int procctl(idtype_t idtype, id_t id, \\\n\tSYS_PPOLL                  = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \\\n\tSYS_FUTIMENS               = 546 // { int futimens(int fd, \\\n\tSYS_UTIMENSAT              = 547 // { int utimensat(int fd, \\\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_386.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,linux\n\npackage unix\n\nconst (\n\tSYS_RESTART_SYSCALL        = 0\n\tSYS_EXIT                   = 1\n\tSYS_FORK                   = 2\n\tSYS_READ                   = 3\n\tSYS_WRITE                  = 4\n\tSYS_OPEN                   = 5\n\tSYS_CLOSE                  = 6\n\tSYS_WAITPID                = 7\n\tSYS_CREAT                  = 8\n\tSYS_LINK                   = 9\n\tSYS_UNLINK                 = 10\n\tSYS_EXECVE                 = 11\n\tSYS_CHDIR                  = 12\n\tSYS_TIME                   = 13\n\tSYS_MKNOD                  = 14\n\tSYS_CHMOD                  = 15\n\tSYS_LCHOWN                 = 16\n\tSYS_BREAK                  = 17\n\tSYS_OLDSTAT                = 18\n\tSYS_LSEEK                  = 19\n\tSYS_GETPID                 = 20\n\tSYS_MOUNT                  = 21\n\tSYS_UMOUNT                 = 22\n\tSYS_SETUID                 = 23\n\tSYS_GETUID                 = 24\n\tSYS_STIME                  = 25\n\tSYS_PTRACE                 = 26\n\tSYS_ALARM                  = 27\n\tSYS_OLDFSTAT               = 28\n\tSYS_PAUSE                  = 29\n\tSYS_UTIME                  = 30\n\tSYS_STTY                   = 31\n\tSYS_GTTY                   = 32\n\tSYS_ACCESS                 = 33\n\tSYS_NICE                   = 34\n\tSYS_FTIME                  = 35\n\tSYS_SYNC                   = 36\n\tSYS_KILL                   = 37\n\tSYS_RENAME                 = 38\n\tSYS_MKDIR                  = 39\n\tSYS_RMDIR                  = 40\n\tSYS_DUP                    = 41\n\tSYS_PIPE                   = 42\n\tSYS_TIMES                  = 43\n\tSYS_PROF                   = 44\n\tSYS_BRK                    = 45\n\tSYS_SETGID                 = 46\n\tSYS_GETGID                 = 47\n\tSYS_SIGNAL                 = 48\n\tSYS_GETEUID                = 49\n\tSYS_GETEGID                = 50\n\tSYS_ACCT                   = 51\n\tSYS_UMOUNT2                = 52\n\tSYS_LOCK                   = 53\n\tSYS_IOCTL                  = 54\n\tSYS_FCNTL                  = 55\n\tSYS_MPX                    = 56\n\tSYS_SETPGID                = 57\n\tSYS_ULIMIT                 = 58\n\tSYS_OLDOLDUNAME            = 59\n\tSYS_UMASK                  = 60\n\tSYS_CHROOT                 = 61\n\tSYS_USTAT                  = 62\n\tSYS_DUP2                   = 63\n\tSYS_GETPPID                = 64\n\tSYS_GETPGRP                = 65\n\tSYS_SETSID                 = 66\n\tSYS_SIGACTION              = 67\n\tSYS_SGETMASK               = 68\n\tSYS_SSETMASK               = 69\n\tSYS_SETREUID               = 70\n\tSYS_SETREGID               = 71\n\tSYS_SIGSUSPEND             = 72\n\tSYS_SIGPENDING             = 73\n\tSYS_SETHOSTNAME            = 74\n\tSYS_SETRLIMIT              = 75\n\tSYS_GETRLIMIT              = 76\n\tSYS_GETRUSAGE              = 77\n\tSYS_GETTIMEOFDAY           = 78\n\tSYS_SETTIMEOFDAY           = 79\n\tSYS_GETGROUPS              = 80\n\tSYS_SETGROUPS              = 81\n\tSYS_SELECT                 = 82\n\tSYS_SYMLINK                = 83\n\tSYS_OLDLSTAT               = 84\n\tSYS_READLINK               = 85\n\tSYS_USELIB                 = 86\n\tSYS_SWAPON                 = 87\n\tSYS_REBOOT                 = 88\n\tSYS_READDIR                = 89\n\tSYS_MMAP                   = 90\n\tSYS_MUNMAP                 = 91\n\tSYS_TRUNCATE               = 92\n\tSYS_FTRUNCATE              = 93\n\tSYS_FCHMOD                 = 94\n\tSYS_FCHOWN                 = 95\n\tSYS_GETPRIORITY            = 96\n\tSYS_SETPRIORITY            = 97\n\tSYS_PROFIL                 = 98\n\tSYS_STATFS                 = 99\n\tSYS_FSTATFS                = 100\n\tSYS_IOPERM                 = 101\n\tSYS_SOCKETCALL             = 102\n\tSYS_SYSLOG                 = 103\n\tSYS_SETITIMER              = 104\n\tSYS_GETITIMER              = 105\n\tSYS_STAT                   = 106\n\tSYS_LSTAT                  = 107\n\tSYS_FSTAT                  = 108\n\tSYS_OLDUNAME               = 109\n\tSYS_IOPL                   = 110\n\tSYS_VHANGUP                = 111\n\tSYS_IDLE                   = 112\n\tSYS_VM86OLD                = 113\n\tSYS_WAIT4                  = 114\n\tSYS_SWAPOFF                = 115\n\tSYS_SYSINFO                = 116\n\tSYS_IPC                    = 117\n\tSYS_FSYNC                  = 118\n\tSYS_SIGRETURN              = 119\n\tSYS_CLONE                  = 120\n\tSYS_SETDOMAINNAME          = 121\n\tSYS_UNAME                  = 122\n\tSYS_MODIFY_LDT             = 123\n\tSYS_ADJTIMEX               = 124\n\tSYS_MPROTECT               = 125\n\tSYS_SIGPROCMASK            = 126\n\tSYS_CREATE_MODULE          = 127\n\tSYS_INIT_MODULE            = 128\n\tSYS_DELETE_MODULE          = 129\n\tSYS_GET_KERNEL_SYMS        = 130\n\tSYS_QUOTACTL               = 131\n\tSYS_GETPGID                = 132\n\tSYS_FCHDIR                 = 133\n\tSYS_BDFLUSH                = 134\n\tSYS_SYSFS                  = 135\n\tSYS_PERSONALITY            = 136\n\tSYS_AFS_SYSCALL            = 137\n\tSYS_SETFSUID               = 138\n\tSYS_SETFSGID               = 139\n\tSYS__LLSEEK                = 140\n\tSYS_GETDENTS               = 141\n\tSYS__NEWSELECT             = 142\n\tSYS_FLOCK                  = 143\n\tSYS_MSYNC                  = 144\n\tSYS_READV                  = 145\n\tSYS_WRITEV                 = 146\n\tSYS_GETSID                 = 147\n\tSYS_FDATASYNC              = 148\n\tSYS__SYSCTL                = 149\n\tSYS_MLOCK                  = 150\n\tSYS_MUNLOCK                = 151\n\tSYS_MLOCKALL               = 152\n\tSYS_MUNLOCKALL             = 153\n\tSYS_SCHED_SETPARAM         = 154\n\tSYS_SCHED_GETPARAM         = 155\n\tSYS_SCHED_SETSCHEDULER     = 156\n\tSYS_SCHED_GETSCHEDULER     = 157\n\tSYS_SCHED_YIELD            = 158\n\tSYS_SCHED_GET_PRIORITY_MAX = 159\n\tSYS_SCHED_GET_PRIORITY_MIN = 160\n\tSYS_SCHED_RR_GET_INTERVAL  = 161\n\tSYS_NANOSLEEP              = 162\n\tSYS_MREMAP                 = 163\n\tSYS_SETRESUID              = 164\n\tSYS_GETRESUID              = 165\n\tSYS_VM86                   = 166\n\tSYS_QUERY_MODULE           = 167\n\tSYS_POLL                   = 168\n\tSYS_NFSSERVCTL             = 169\n\tSYS_SETRESGID              = 170\n\tSYS_GETRESGID              = 171\n\tSYS_PRCTL                  = 172\n\tSYS_RT_SIGRETURN           = 173\n\tSYS_RT_SIGACTION           = 174\n\tSYS_RT_SIGPROCMASK         = 175\n\tSYS_RT_SIGPENDING          = 176\n\tSYS_RT_SIGTIMEDWAIT        = 177\n\tSYS_RT_SIGQUEUEINFO        = 178\n\tSYS_RT_SIGSUSPEND          = 179\n\tSYS_PREAD64                = 180\n\tSYS_PWRITE64               = 181\n\tSYS_CHOWN                  = 182\n\tSYS_GETCWD                 = 183\n\tSYS_CAPGET                 = 184\n\tSYS_CAPSET                 = 185\n\tSYS_SIGALTSTACK            = 186\n\tSYS_SENDFILE               = 187\n\tSYS_GETPMSG                = 188\n\tSYS_PUTPMSG                = 189\n\tSYS_VFORK                  = 190\n\tSYS_UGETRLIMIT             = 191\n\tSYS_MMAP2                  = 192\n\tSYS_TRUNCATE64             = 193\n\tSYS_FTRUNCATE64            = 194\n\tSYS_STAT64                 = 195\n\tSYS_LSTAT64                = 196\n\tSYS_FSTAT64                = 197\n\tSYS_LCHOWN32               = 198\n\tSYS_GETUID32               = 199\n\tSYS_GETGID32               = 200\n\tSYS_GETEUID32              = 201\n\tSYS_GETEGID32              = 202\n\tSYS_SETREUID32             = 203\n\tSYS_SETREGID32             = 204\n\tSYS_GETGROUPS32            = 205\n\tSYS_SETGROUPS32            = 206\n\tSYS_FCHOWN32               = 207\n\tSYS_SETRESUID32            = 208\n\tSYS_GETRESUID32            = 209\n\tSYS_SETRESGID32            = 210\n\tSYS_GETRESGID32            = 211\n\tSYS_CHOWN32                = 212\n\tSYS_SETUID32               = 213\n\tSYS_SETGID32               = 214\n\tSYS_SETFSUID32             = 215\n\tSYS_SETFSGID32             = 216\n\tSYS_PIVOT_ROOT             = 217\n\tSYS_MINCORE                = 218\n\tSYS_MADVISE                = 219\n\tSYS_GETDENTS64             = 220\n\tSYS_FCNTL64                = 221\n\tSYS_GETTID                 = 224\n\tSYS_READAHEAD              = 225\n\tSYS_SETXATTR               = 226\n\tSYS_LSETXATTR              = 227\n\tSYS_FSETXATTR              = 228\n\tSYS_GETXATTR               = 229\n\tSYS_LGETXATTR              = 230\n\tSYS_FGETXATTR              = 231\n\tSYS_LISTXATTR              = 232\n\tSYS_LLISTXATTR             = 233\n\tSYS_FLISTXATTR             = 234\n\tSYS_REMOVEXATTR            = 235\n\tSYS_LREMOVEXATTR           = 236\n\tSYS_FREMOVEXATTR           = 237\n\tSYS_TKILL                  = 238\n\tSYS_SENDFILE64             = 239\n\tSYS_FUTEX                  = 240\n\tSYS_SCHED_SETAFFINITY      = 241\n\tSYS_SCHED_GETAFFINITY      = 242\n\tSYS_SET_THREAD_AREA        = 243\n\tSYS_GET_THREAD_AREA        = 244\n\tSYS_IO_SETUP               = 245\n\tSYS_IO_DESTROY             = 246\n\tSYS_IO_GETEVENTS           = 247\n\tSYS_IO_SUBMIT              = 248\n\tSYS_IO_CANCEL              = 249\n\tSYS_FADVISE64              = 250\n\tSYS_EXIT_GROUP             = 252\n\tSYS_LOOKUP_DCOOKIE         = 253\n\tSYS_EPOLL_CREATE           = 254\n\tSYS_EPOLL_CTL              = 255\n\tSYS_EPOLL_WAIT             = 256\n\tSYS_REMAP_FILE_PAGES       = 257\n\tSYS_SET_TID_ADDRESS        = 258\n\tSYS_TIMER_CREATE           = 259\n\tSYS_TIMER_SETTIME          = 260\n\tSYS_TIMER_GETTIME          = 261\n\tSYS_TIMER_GETOVERRUN       = 262\n\tSYS_TIMER_DELETE           = 263\n\tSYS_CLOCK_SETTIME          = 264\n\tSYS_CLOCK_GETTIME          = 265\n\tSYS_CLOCK_GETRES           = 266\n\tSYS_CLOCK_NANOSLEEP        = 267\n\tSYS_STATFS64               = 268\n\tSYS_FSTATFS64              = 269\n\tSYS_TGKILL                 = 270\n\tSYS_UTIMES                 = 271\n\tSYS_FADVISE64_64           = 272\n\tSYS_VSERVER                = 273\n\tSYS_MBIND                  = 274\n\tSYS_GET_MEMPOLICY          = 275\n\tSYS_SET_MEMPOLICY          = 276\n\tSYS_MQ_OPEN                = 277\n\tSYS_MQ_UNLINK              = 278\n\tSYS_MQ_TIMEDSEND           = 279\n\tSYS_MQ_TIMEDRECEIVE        = 280\n\tSYS_MQ_NOTIFY              = 281\n\tSYS_MQ_GETSETATTR          = 282\n\tSYS_KEXEC_LOAD             = 283\n\tSYS_WAITID                 = 284\n\tSYS_ADD_KEY                = 286\n\tSYS_REQUEST_KEY            = 287\n\tSYS_KEYCTL                 = 288\n\tSYS_IOPRIO_SET             = 289\n\tSYS_IOPRIO_GET             = 290\n\tSYS_INOTIFY_INIT           = 291\n\tSYS_INOTIFY_ADD_WATCH      = 292\n\tSYS_INOTIFY_RM_WATCH       = 293\n\tSYS_MIGRATE_PAGES          = 294\n\tSYS_OPENAT                 = 295\n\tSYS_MKDIRAT                = 296\n\tSYS_MKNODAT                = 297\n\tSYS_FCHOWNAT               = 298\n\tSYS_FUTIMESAT              = 299\n\tSYS_FSTATAT64              = 300\n\tSYS_UNLINKAT               = 301\n\tSYS_RENAMEAT               = 302\n\tSYS_LINKAT                 = 303\n\tSYS_SYMLINKAT              = 304\n\tSYS_READLINKAT             = 305\n\tSYS_FCHMODAT               = 306\n\tSYS_FACCESSAT              = 307\n\tSYS_PSELECT6               = 308\n\tSYS_PPOLL                  = 309\n\tSYS_UNSHARE                = 310\n\tSYS_SET_ROBUST_LIST        = 311\n\tSYS_GET_ROBUST_LIST        = 312\n\tSYS_SPLICE                 = 313\n\tSYS_SYNC_FILE_RANGE        = 314\n\tSYS_TEE                    = 315\n\tSYS_VMSPLICE               = 316\n\tSYS_MOVE_PAGES             = 317\n\tSYS_GETCPU                 = 318\n\tSYS_EPOLL_PWAIT            = 319\n\tSYS_UTIMENSAT              = 320\n\tSYS_SIGNALFD               = 321\n\tSYS_TIMERFD_CREATE         = 322\n\tSYS_EVENTFD                = 323\n\tSYS_FALLOCATE              = 324\n\tSYS_TIMERFD_SETTIME        = 325\n\tSYS_TIMERFD_GETTIME        = 326\n\tSYS_SIGNALFD4              = 327\n\tSYS_EVENTFD2               = 328\n\tSYS_EPOLL_CREATE1          = 329\n\tSYS_DUP3                   = 330\n\tSYS_PIPE2                  = 331\n\tSYS_INOTIFY_INIT1          = 332\n\tSYS_PREADV                 = 333\n\tSYS_PWRITEV                = 334\n\tSYS_RT_TGSIGQUEUEINFO      = 335\n\tSYS_PERF_EVENT_OPEN        = 336\n\tSYS_RECVMMSG               = 337\n\tSYS_FANOTIFY_INIT          = 338\n\tSYS_FANOTIFY_MARK          = 339\n\tSYS_PRLIMIT64              = 340\n\tSYS_NAME_TO_HANDLE_AT      = 341\n\tSYS_OPEN_BY_HANDLE_AT      = 342\n\tSYS_CLOCK_ADJTIME          = 343\n\tSYS_SYNCFS                 = 344\n\tSYS_SENDMMSG               = 345\n\tSYS_SETNS                  = 346\n\tSYS_PROCESS_VM_READV       = 347\n\tSYS_PROCESS_VM_WRITEV      = 348\n\tSYS_KCMP                   = 349\n\tSYS_FINIT_MODULE           = 350\n\tSYS_SCHED_SETATTR          = 351\n\tSYS_SCHED_GETATTR          = 352\n\tSYS_RENAMEAT2              = 353\n\tSYS_SECCOMP                = 354\n\tSYS_GETRANDOM              = 355\n\tSYS_MEMFD_CREATE           = 356\n\tSYS_BPF                    = 357\n\tSYS_EXECVEAT               = 358\n\tSYS_SOCKET                 = 359\n\tSYS_SOCKETPAIR             = 360\n\tSYS_BIND                   = 361\n\tSYS_CONNECT                = 362\n\tSYS_LISTEN                 = 363\n\tSYS_ACCEPT4                = 364\n\tSYS_GETSOCKOPT             = 365\n\tSYS_SETSOCKOPT             = 366\n\tSYS_GETSOCKNAME            = 367\n\tSYS_GETPEERNAME            = 368\n\tSYS_SENDTO                 = 369\n\tSYS_SENDMSG                = 370\n\tSYS_RECVFROM               = 371\n\tSYS_RECVMSG                = 372\n\tSYS_SHUTDOWN               = 373\n\tSYS_USERFAULTFD            = 374\n\tSYS_MEMBARRIER             = 375\n\tSYS_MLOCK2                 = 376\n\tSYS_COPY_FILE_RANGE        = 377\n\tSYS_PREADV2                = 378\n\tSYS_PWRITEV2               = 379\n\tSYS_PKEY_MPROTECT          = 380\n\tSYS_PKEY_ALLOC             = 381\n\tSYS_PKEY_FREE              = 382\n\tSYS_STATX                  = 383\n\tSYS_ARCH_PRCTL             = 384\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,linux\n\npackage unix\n\nconst (\n\tSYS_READ                   = 0\n\tSYS_WRITE                  = 1\n\tSYS_OPEN                   = 2\n\tSYS_CLOSE                  = 3\n\tSYS_STAT                   = 4\n\tSYS_FSTAT                  = 5\n\tSYS_LSTAT                  = 6\n\tSYS_POLL                   = 7\n\tSYS_LSEEK                  = 8\n\tSYS_MMAP                   = 9\n\tSYS_MPROTECT               = 10\n\tSYS_MUNMAP                 = 11\n\tSYS_BRK                    = 12\n\tSYS_RT_SIGACTION           = 13\n\tSYS_RT_SIGPROCMASK         = 14\n\tSYS_RT_SIGRETURN           = 15\n\tSYS_IOCTL                  = 16\n\tSYS_PREAD64                = 17\n\tSYS_PWRITE64               = 18\n\tSYS_READV                  = 19\n\tSYS_WRITEV                 = 20\n\tSYS_ACCESS                 = 21\n\tSYS_PIPE                   = 22\n\tSYS_SELECT                 = 23\n\tSYS_SCHED_YIELD            = 24\n\tSYS_MREMAP                 = 25\n\tSYS_MSYNC                  = 26\n\tSYS_MINCORE                = 27\n\tSYS_MADVISE                = 28\n\tSYS_SHMGET                 = 29\n\tSYS_SHMAT                  = 30\n\tSYS_SHMCTL                 = 31\n\tSYS_DUP                    = 32\n\tSYS_DUP2                   = 33\n\tSYS_PAUSE                  = 34\n\tSYS_NANOSLEEP              = 35\n\tSYS_GETITIMER              = 36\n\tSYS_ALARM                  = 37\n\tSYS_SETITIMER              = 38\n\tSYS_GETPID                 = 39\n\tSYS_SENDFILE               = 40\n\tSYS_SOCKET                 = 41\n\tSYS_CONNECT                = 42\n\tSYS_ACCEPT                 = 43\n\tSYS_SENDTO                 = 44\n\tSYS_RECVFROM               = 45\n\tSYS_SENDMSG                = 46\n\tSYS_RECVMSG                = 47\n\tSYS_SHUTDOWN               = 48\n\tSYS_BIND                   = 49\n\tSYS_LISTEN                 = 50\n\tSYS_GETSOCKNAME            = 51\n\tSYS_GETPEERNAME            = 52\n\tSYS_SOCKETPAIR             = 53\n\tSYS_SETSOCKOPT             = 54\n\tSYS_GETSOCKOPT             = 55\n\tSYS_CLONE                  = 56\n\tSYS_FORK                   = 57\n\tSYS_VFORK                  = 58\n\tSYS_EXECVE                 = 59\n\tSYS_EXIT                   = 60\n\tSYS_WAIT4                  = 61\n\tSYS_KILL                   = 62\n\tSYS_UNAME                  = 63\n\tSYS_SEMGET                 = 64\n\tSYS_SEMOP                  = 65\n\tSYS_SEMCTL                 = 66\n\tSYS_SHMDT                  = 67\n\tSYS_MSGGET                 = 68\n\tSYS_MSGSND                 = 69\n\tSYS_MSGRCV                 = 70\n\tSYS_MSGCTL                 = 71\n\tSYS_FCNTL                  = 72\n\tSYS_FLOCK                  = 73\n\tSYS_FSYNC                  = 74\n\tSYS_FDATASYNC              = 75\n\tSYS_TRUNCATE               = 76\n\tSYS_FTRUNCATE              = 77\n\tSYS_GETDENTS               = 78\n\tSYS_GETCWD                 = 79\n\tSYS_CHDIR                  = 80\n\tSYS_FCHDIR                 = 81\n\tSYS_RENAME                 = 82\n\tSYS_MKDIR                  = 83\n\tSYS_RMDIR                  = 84\n\tSYS_CREAT                  = 85\n\tSYS_LINK                   = 86\n\tSYS_UNLINK                 = 87\n\tSYS_SYMLINK                = 88\n\tSYS_READLINK               = 89\n\tSYS_CHMOD                  = 90\n\tSYS_FCHMOD                 = 91\n\tSYS_CHOWN                  = 92\n\tSYS_FCHOWN                 = 93\n\tSYS_LCHOWN                 = 94\n\tSYS_UMASK                  = 95\n\tSYS_GETTIMEOFDAY           = 96\n\tSYS_GETRLIMIT              = 97\n\tSYS_GETRUSAGE              = 98\n\tSYS_SYSINFO                = 99\n\tSYS_TIMES                  = 100\n\tSYS_PTRACE                 = 101\n\tSYS_GETUID                 = 102\n\tSYS_SYSLOG                 = 103\n\tSYS_GETGID                 = 104\n\tSYS_SETUID                 = 105\n\tSYS_SETGID                 = 106\n\tSYS_GETEUID                = 107\n\tSYS_GETEGID                = 108\n\tSYS_SETPGID                = 109\n\tSYS_GETPPID                = 110\n\tSYS_GETPGRP                = 111\n\tSYS_SETSID                 = 112\n\tSYS_SETREUID               = 113\n\tSYS_SETREGID               = 114\n\tSYS_GETGROUPS              = 115\n\tSYS_SETGROUPS              = 116\n\tSYS_SETRESUID              = 117\n\tSYS_GETRESUID              = 118\n\tSYS_SETRESGID              = 119\n\tSYS_GETRESGID              = 120\n\tSYS_GETPGID                = 121\n\tSYS_SETFSUID               = 122\n\tSYS_SETFSGID               = 123\n\tSYS_GETSID                 = 124\n\tSYS_CAPGET                 = 125\n\tSYS_CAPSET                 = 126\n\tSYS_RT_SIGPENDING          = 127\n\tSYS_RT_SIGTIMEDWAIT        = 128\n\tSYS_RT_SIGQUEUEINFO        = 129\n\tSYS_RT_SIGSUSPEND          = 130\n\tSYS_SIGALTSTACK            = 131\n\tSYS_UTIME                  = 132\n\tSYS_MKNOD                  = 133\n\tSYS_USELIB                 = 134\n\tSYS_PERSONALITY            = 135\n\tSYS_USTAT                  = 136\n\tSYS_STATFS                 = 137\n\tSYS_FSTATFS                = 138\n\tSYS_SYSFS                  = 139\n\tSYS_GETPRIORITY            = 140\n\tSYS_SETPRIORITY            = 141\n\tSYS_SCHED_SETPARAM         = 142\n\tSYS_SCHED_GETPARAM         = 143\n\tSYS_SCHED_SETSCHEDULER     = 144\n\tSYS_SCHED_GETSCHEDULER     = 145\n\tSYS_SCHED_GET_PRIORITY_MAX = 146\n\tSYS_SCHED_GET_PRIORITY_MIN = 147\n\tSYS_SCHED_RR_GET_INTERVAL  = 148\n\tSYS_MLOCK                  = 149\n\tSYS_MUNLOCK                = 150\n\tSYS_MLOCKALL               = 151\n\tSYS_MUNLOCKALL             = 152\n\tSYS_VHANGUP                = 153\n\tSYS_MODIFY_LDT             = 154\n\tSYS_PIVOT_ROOT             = 155\n\tSYS__SYSCTL                = 156\n\tSYS_PRCTL                  = 157\n\tSYS_ARCH_PRCTL             = 158\n\tSYS_ADJTIMEX               = 159\n\tSYS_SETRLIMIT              = 160\n\tSYS_CHROOT                 = 161\n\tSYS_SYNC                   = 162\n\tSYS_ACCT                   = 163\n\tSYS_SETTIMEOFDAY           = 164\n\tSYS_MOUNT                  = 165\n\tSYS_UMOUNT2                = 166\n\tSYS_SWAPON                 = 167\n\tSYS_SWAPOFF                = 168\n\tSYS_REBOOT                 = 169\n\tSYS_SETHOSTNAME            = 170\n\tSYS_SETDOMAINNAME          = 171\n\tSYS_IOPL                   = 172\n\tSYS_IOPERM                 = 173\n\tSYS_CREATE_MODULE          = 174\n\tSYS_INIT_MODULE            = 175\n\tSYS_DELETE_MODULE          = 176\n\tSYS_GET_KERNEL_SYMS        = 177\n\tSYS_QUERY_MODULE           = 178\n\tSYS_QUOTACTL               = 179\n\tSYS_NFSSERVCTL             = 180\n\tSYS_GETPMSG                = 181\n\tSYS_PUTPMSG                = 182\n\tSYS_AFS_SYSCALL            = 183\n\tSYS_TUXCALL                = 184\n\tSYS_SECURITY               = 185\n\tSYS_GETTID                 = 186\n\tSYS_READAHEAD              = 187\n\tSYS_SETXATTR               = 188\n\tSYS_LSETXATTR              = 189\n\tSYS_FSETXATTR              = 190\n\tSYS_GETXATTR               = 191\n\tSYS_LGETXATTR              = 192\n\tSYS_FGETXATTR              = 193\n\tSYS_LISTXATTR              = 194\n\tSYS_LLISTXATTR             = 195\n\tSYS_FLISTXATTR             = 196\n\tSYS_REMOVEXATTR            = 197\n\tSYS_LREMOVEXATTR           = 198\n\tSYS_FREMOVEXATTR           = 199\n\tSYS_TKILL                  = 200\n\tSYS_TIME                   = 201\n\tSYS_FUTEX                  = 202\n\tSYS_SCHED_SETAFFINITY      = 203\n\tSYS_SCHED_GETAFFINITY      = 204\n\tSYS_SET_THREAD_AREA        = 205\n\tSYS_IO_SETUP               = 206\n\tSYS_IO_DESTROY             = 207\n\tSYS_IO_GETEVENTS           = 208\n\tSYS_IO_SUBMIT              = 209\n\tSYS_IO_CANCEL              = 210\n\tSYS_GET_THREAD_AREA        = 211\n\tSYS_LOOKUP_DCOOKIE         = 212\n\tSYS_EPOLL_CREATE           = 213\n\tSYS_EPOLL_CTL_OLD          = 214\n\tSYS_EPOLL_WAIT_OLD         = 215\n\tSYS_REMAP_FILE_PAGES       = 216\n\tSYS_GETDENTS64             = 217\n\tSYS_SET_TID_ADDRESS        = 218\n\tSYS_RESTART_SYSCALL        = 219\n\tSYS_SEMTIMEDOP             = 220\n\tSYS_FADVISE64              = 221\n\tSYS_TIMER_CREATE           = 222\n\tSYS_TIMER_SETTIME          = 223\n\tSYS_TIMER_GETTIME          = 224\n\tSYS_TIMER_GETOVERRUN       = 225\n\tSYS_TIMER_DELETE           = 226\n\tSYS_CLOCK_SETTIME          = 227\n\tSYS_CLOCK_GETTIME          = 228\n\tSYS_CLOCK_GETRES           = 229\n\tSYS_CLOCK_NANOSLEEP        = 230\n\tSYS_EXIT_GROUP             = 231\n\tSYS_EPOLL_WAIT             = 232\n\tSYS_EPOLL_CTL              = 233\n\tSYS_TGKILL                 = 234\n\tSYS_UTIMES                 = 235\n\tSYS_VSERVER                = 236\n\tSYS_MBIND                  = 237\n\tSYS_SET_MEMPOLICY          = 238\n\tSYS_GET_MEMPOLICY          = 239\n\tSYS_MQ_OPEN                = 240\n\tSYS_MQ_UNLINK              = 241\n\tSYS_MQ_TIMEDSEND           = 242\n\tSYS_MQ_TIMEDRECEIVE        = 243\n\tSYS_MQ_NOTIFY              = 244\n\tSYS_MQ_GETSETATTR          = 245\n\tSYS_KEXEC_LOAD             = 246\n\tSYS_WAITID                 = 247\n\tSYS_ADD_KEY                = 248\n\tSYS_REQUEST_KEY            = 249\n\tSYS_KEYCTL                 = 250\n\tSYS_IOPRIO_SET             = 251\n\tSYS_IOPRIO_GET             = 252\n\tSYS_INOTIFY_INIT           = 253\n\tSYS_INOTIFY_ADD_WATCH      = 254\n\tSYS_INOTIFY_RM_WATCH       = 255\n\tSYS_MIGRATE_PAGES          = 256\n\tSYS_OPENAT                 = 257\n\tSYS_MKDIRAT                = 258\n\tSYS_MKNODAT                = 259\n\tSYS_FCHOWNAT               = 260\n\tSYS_FUTIMESAT              = 261\n\tSYS_NEWFSTATAT             = 262\n\tSYS_UNLINKAT               = 263\n\tSYS_RENAMEAT               = 264\n\tSYS_LINKAT                 = 265\n\tSYS_SYMLINKAT              = 266\n\tSYS_READLINKAT             = 267\n\tSYS_FCHMODAT               = 268\n\tSYS_FACCESSAT              = 269\n\tSYS_PSELECT6               = 270\n\tSYS_PPOLL                  = 271\n\tSYS_UNSHARE                = 272\n\tSYS_SET_ROBUST_LIST        = 273\n\tSYS_GET_ROBUST_LIST        = 274\n\tSYS_SPLICE                 = 275\n\tSYS_TEE                    = 276\n\tSYS_SYNC_FILE_RANGE        = 277\n\tSYS_VMSPLICE               = 278\n\tSYS_MOVE_PAGES             = 279\n\tSYS_UTIMENSAT              = 280\n\tSYS_EPOLL_PWAIT            = 281\n\tSYS_SIGNALFD               = 282\n\tSYS_TIMERFD_CREATE         = 283\n\tSYS_EVENTFD                = 284\n\tSYS_FALLOCATE              = 285\n\tSYS_TIMERFD_SETTIME        = 286\n\tSYS_TIMERFD_GETTIME        = 287\n\tSYS_ACCEPT4                = 288\n\tSYS_SIGNALFD4              = 289\n\tSYS_EVENTFD2               = 290\n\tSYS_EPOLL_CREATE1          = 291\n\tSYS_DUP3                   = 292\n\tSYS_PIPE2                  = 293\n\tSYS_INOTIFY_INIT1          = 294\n\tSYS_PREADV                 = 295\n\tSYS_PWRITEV                = 296\n\tSYS_RT_TGSIGQUEUEINFO      = 297\n\tSYS_PERF_EVENT_OPEN        = 298\n\tSYS_RECVMMSG               = 299\n\tSYS_FANOTIFY_INIT          = 300\n\tSYS_FANOTIFY_MARK          = 301\n\tSYS_PRLIMIT64              = 302\n\tSYS_NAME_TO_HANDLE_AT      = 303\n\tSYS_OPEN_BY_HANDLE_AT      = 304\n\tSYS_CLOCK_ADJTIME          = 305\n\tSYS_SYNCFS                 = 306\n\tSYS_SENDMMSG               = 307\n\tSYS_SETNS                  = 308\n\tSYS_GETCPU                 = 309\n\tSYS_PROCESS_VM_READV       = 310\n\tSYS_PROCESS_VM_WRITEV      = 311\n\tSYS_KCMP                   = 312\n\tSYS_FINIT_MODULE           = 313\n\tSYS_SCHED_SETATTR          = 314\n\tSYS_SCHED_GETATTR          = 315\n\tSYS_RENAMEAT2              = 316\n\tSYS_SECCOMP                = 317\n\tSYS_GETRANDOM              = 318\n\tSYS_MEMFD_CREATE           = 319\n\tSYS_KEXEC_FILE_LOAD        = 320\n\tSYS_BPF                    = 321\n\tSYS_EXECVEAT               = 322\n\tSYS_USERFAULTFD            = 323\n\tSYS_MEMBARRIER             = 324\n\tSYS_MLOCK2                 = 325\n\tSYS_COPY_FILE_RANGE        = 326\n\tSYS_PREADV2                = 327\n\tSYS_PWRITEV2               = 328\n\tSYS_PKEY_MPROTECT          = 329\n\tSYS_PKEY_ALLOC             = 330\n\tSYS_PKEY_FREE              = 331\n\tSYS_STATX                  = 332\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,linux\n\npackage unix\n\nconst (\n\tSYS_RESTART_SYSCALL        = 0\n\tSYS_EXIT                   = 1\n\tSYS_FORK                   = 2\n\tSYS_READ                   = 3\n\tSYS_WRITE                  = 4\n\tSYS_OPEN                   = 5\n\tSYS_CLOSE                  = 6\n\tSYS_CREAT                  = 8\n\tSYS_LINK                   = 9\n\tSYS_UNLINK                 = 10\n\tSYS_EXECVE                 = 11\n\tSYS_CHDIR                  = 12\n\tSYS_MKNOD                  = 14\n\tSYS_CHMOD                  = 15\n\tSYS_LCHOWN                 = 16\n\tSYS_LSEEK                  = 19\n\tSYS_GETPID                 = 20\n\tSYS_MOUNT                  = 21\n\tSYS_SETUID                 = 23\n\tSYS_GETUID                 = 24\n\tSYS_PTRACE                 = 26\n\tSYS_PAUSE                  = 29\n\tSYS_ACCESS                 = 33\n\tSYS_NICE                   = 34\n\tSYS_SYNC                   = 36\n\tSYS_KILL                   = 37\n\tSYS_RENAME                 = 38\n\tSYS_MKDIR                  = 39\n\tSYS_RMDIR                  = 40\n\tSYS_DUP                    = 41\n\tSYS_PIPE                   = 42\n\tSYS_TIMES                  = 43\n\tSYS_BRK                    = 45\n\tSYS_SETGID                 = 46\n\tSYS_GETGID                 = 47\n\tSYS_GETEUID                = 49\n\tSYS_GETEGID                = 50\n\tSYS_ACCT                   = 51\n\tSYS_UMOUNT2                = 52\n\tSYS_IOCTL                  = 54\n\tSYS_FCNTL                  = 55\n\tSYS_SETPGID                = 57\n\tSYS_UMASK                  = 60\n\tSYS_CHROOT                 = 61\n\tSYS_USTAT                  = 62\n\tSYS_DUP2                   = 63\n\tSYS_GETPPID                = 64\n\tSYS_GETPGRP                = 65\n\tSYS_SETSID                 = 66\n\tSYS_SIGACTION              = 67\n\tSYS_SETREUID               = 70\n\tSYS_SETREGID               = 71\n\tSYS_SIGSUSPEND             = 72\n\tSYS_SIGPENDING             = 73\n\tSYS_SETHOSTNAME            = 74\n\tSYS_SETRLIMIT              = 75\n\tSYS_GETRUSAGE              = 77\n\tSYS_GETTIMEOFDAY           = 78\n\tSYS_SETTIMEOFDAY           = 79\n\tSYS_GETGROUPS              = 80\n\tSYS_SETGROUPS              = 81\n\tSYS_SYMLINK                = 83\n\tSYS_READLINK               = 85\n\tSYS_USELIB                 = 86\n\tSYS_SWAPON                 = 87\n\tSYS_REBOOT                 = 88\n\tSYS_MUNMAP                 = 91\n\tSYS_TRUNCATE               = 92\n\tSYS_FTRUNCATE              = 93\n\tSYS_FCHMOD                 = 94\n\tSYS_FCHOWN                 = 95\n\tSYS_GETPRIORITY            = 96\n\tSYS_SETPRIORITY            = 97\n\tSYS_STATFS                 = 99\n\tSYS_FSTATFS                = 100\n\tSYS_SYSLOG                 = 103\n\tSYS_SETITIMER              = 104\n\tSYS_GETITIMER              = 105\n\tSYS_STAT                   = 106\n\tSYS_LSTAT                  = 107\n\tSYS_FSTAT                  = 108\n\tSYS_VHANGUP                = 111\n\tSYS_WAIT4                  = 114\n\tSYS_SWAPOFF                = 115\n\tSYS_SYSINFO                = 116\n\tSYS_FSYNC                  = 118\n\tSYS_SIGRETURN              = 119\n\tSYS_CLONE                  = 120\n\tSYS_SETDOMAINNAME          = 121\n\tSYS_UNAME                  = 122\n\tSYS_ADJTIMEX               = 124\n\tSYS_MPROTECT               = 125\n\tSYS_SIGPROCMASK            = 126\n\tSYS_INIT_MODULE            = 128\n\tSYS_DELETE_MODULE          = 129\n\tSYS_QUOTACTL               = 131\n\tSYS_GETPGID                = 132\n\tSYS_FCHDIR                 = 133\n\tSYS_BDFLUSH                = 134\n\tSYS_SYSFS                  = 135\n\tSYS_PERSONALITY            = 136\n\tSYS_SETFSUID               = 138\n\tSYS_SETFSGID               = 139\n\tSYS__LLSEEK                = 140\n\tSYS_GETDENTS               = 141\n\tSYS__NEWSELECT             = 142\n\tSYS_FLOCK                  = 143\n\tSYS_MSYNC                  = 144\n\tSYS_READV                  = 145\n\tSYS_WRITEV                 = 146\n\tSYS_GETSID                 = 147\n\tSYS_FDATASYNC              = 148\n\tSYS__SYSCTL                = 149\n\tSYS_MLOCK                  = 150\n\tSYS_MUNLOCK                = 151\n\tSYS_MLOCKALL               = 152\n\tSYS_MUNLOCKALL             = 153\n\tSYS_SCHED_SETPARAM         = 154\n\tSYS_SCHED_GETPARAM         = 155\n\tSYS_SCHED_SETSCHEDULER     = 156\n\tSYS_SCHED_GETSCHEDULER     = 157\n\tSYS_SCHED_YIELD            = 158\n\tSYS_SCHED_GET_PRIORITY_MAX = 159\n\tSYS_SCHED_GET_PRIORITY_MIN = 160\n\tSYS_SCHED_RR_GET_INTERVAL  = 161\n\tSYS_NANOSLEEP              = 162\n\tSYS_MREMAP                 = 163\n\tSYS_SETRESUID              = 164\n\tSYS_GETRESUID              = 165\n\tSYS_POLL                   = 168\n\tSYS_NFSSERVCTL             = 169\n\tSYS_SETRESGID              = 170\n\tSYS_GETRESGID              = 171\n\tSYS_PRCTL                  = 172\n\tSYS_RT_SIGRETURN           = 173\n\tSYS_RT_SIGACTION           = 174\n\tSYS_RT_SIGPROCMASK         = 175\n\tSYS_RT_SIGPENDING          = 176\n\tSYS_RT_SIGTIMEDWAIT        = 177\n\tSYS_RT_SIGQUEUEINFO        = 178\n\tSYS_RT_SIGSUSPEND          = 179\n\tSYS_PREAD64                = 180\n\tSYS_PWRITE64               = 181\n\tSYS_CHOWN                  = 182\n\tSYS_GETCWD                 = 183\n\tSYS_CAPGET                 = 184\n\tSYS_CAPSET                 = 185\n\tSYS_SIGALTSTACK            = 186\n\tSYS_SENDFILE               = 187\n\tSYS_VFORK                  = 190\n\tSYS_UGETRLIMIT             = 191\n\tSYS_MMAP2                  = 192\n\tSYS_TRUNCATE64             = 193\n\tSYS_FTRUNCATE64            = 194\n\tSYS_STAT64                 = 195\n\tSYS_LSTAT64                = 196\n\tSYS_FSTAT64                = 197\n\tSYS_LCHOWN32               = 198\n\tSYS_GETUID32               = 199\n\tSYS_GETGID32               = 200\n\tSYS_GETEUID32              = 201\n\tSYS_GETEGID32              = 202\n\tSYS_SETREUID32             = 203\n\tSYS_SETREGID32             = 204\n\tSYS_GETGROUPS32            = 205\n\tSYS_SETGROUPS32            = 206\n\tSYS_FCHOWN32               = 207\n\tSYS_SETRESUID32            = 208\n\tSYS_GETRESUID32            = 209\n\tSYS_SETRESGID32            = 210\n\tSYS_GETRESGID32            = 211\n\tSYS_CHOWN32                = 212\n\tSYS_SETUID32               = 213\n\tSYS_SETGID32               = 214\n\tSYS_SETFSUID32             = 215\n\tSYS_SETFSGID32             = 216\n\tSYS_GETDENTS64             = 217\n\tSYS_PIVOT_ROOT             = 218\n\tSYS_MINCORE                = 219\n\tSYS_MADVISE                = 220\n\tSYS_FCNTL64                = 221\n\tSYS_GETTID                 = 224\n\tSYS_READAHEAD              = 225\n\tSYS_SETXATTR               = 226\n\tSYS_LSETXATTR              = 227\n\tSYS_FSETXATTR              = 228\n\tSYS_GETXATTR               = 229\n\tSYS_LGETXATTR              = 230\n\tSYS_FGETXATTR              = 231\n\tSYS_LISTXATTR              = 232\n\tSYS_LLISTXATTR             = 233\n\tSYS_FLISTXATTR             = 234\n\tSYS_REMOVEXATTR            = 235\n\tSYS_LREMOVEXATTR           = 236\n\tSYS_FREMOVEXATTR           = 237\n\tSYS_TKILL                  = 238\n\tSYS_SENDFILE64             = 239\n\tSYS_FUTEX                  = 240\n\tSYS_SCHED_SETAFFINITY      = 241\n\tSYS_SCHED_GETAFFINITY      = 242\n\tSYS_IO_SETUP               = 243\n\tSYS_IO_DESTROY             = 244\n\tSYS_IO_GETEVENTS           = 245\n\tSYS_IO_SUBMIT              = 246\n\tSYS_IO_CANCEL              = 247\n\tSYS_EXIT_GROUP             = 248\n\tSYS_LOOKUP_DCOOKIE         = 249\n\tSYS_EPOLL_CREATE           = 250\n\tSYS_EPOLL_CTL              = 251\n\tSYS_EPOLL_WAIT             = 252\n\tSYS_REMAP_FILE_PAGES       = 253\n\tSYS_SET_TID_ADDRESS        = 256\n\tSYS_TIMER_CREATE           = 257\n\tSYS_TIMER_SETTIME          = 258\n\tSYS_TIMER_GETTIME          = 259\n\tSYS_TIMER_GETOVERRUN       = 260\n\tSYS_TIMER_DELETE           = 261\n\tSYS_CLOCK_SETTIME          = 262\n\tSYS_CLOCK_GETTIME          = 263\n\tSYS_CLOCK_GETRES           = 264\n\tSYS_CLOCK_NANOSLEEP        = 265\n\tSYS_STATFS64               = 266\n\tSYS_FSTATFS64              = 267\n\tSYS_TGKILL                 = 268\n\tSYS_UTIMES                 = 269\n\tSYS_ARM_FADVISE64_64       = 270\n\tSYS_PCICONFIG_IOBASE       = 271\n\tSYS_PCICONFIG_READ         = 272\n\tSYS_PCICONFIG_WRITE        = 273\n\tSYS_MQ_OPEN                = 274\n\tSYS_MQ_UNLINK              = 275\n\tSYS_MQ_TIMEDSEND           = 276\n\tSYS_MQ_TIMEDRECEIVE        = 277\n\tSYS_MQ_NOTIFY              = 278\n\tSYS_MQ_GETSETATTR          = 279\n\tSYS_WAITID                 = 280\n\tSYS_SOCKET                 = 281\n\tSYS_BIND                   = 282\n\tSYS_CONNECT                = 283\n\tSYS_LISTEN                 = 284\n\tSYS_ACCEPT                 = 285\n\tSYS_GETSOCKNAME            = 286\n\tSYS_GETPEERNAME            = 287\n\tSYS_SOCKETPAIR             = 288\n\tSYS_SEND                   = 289\n\tSYS_SENDTO                 = 290\n\tSYS_RECV                   = 291\n\tSYS_RECVFROM               = 292\n\tSYS_SHUTDOWN               = 293\n\tSYS_SETSOCKOPT             = 294\n\tSYS_GETSOCKOPT             = 295\n\tSYS_SENDMSG                = 296\n\tSYS_RECVMSG                = 297\n\tSYS_SEMOP                  = 298\n\tSYS_SEMGET                 = 299\n\tSYS_SEMCTL                 = 300\n\tSYS_MSGSND                 = 301\n\tSYS_MSGRCV                 = 302\n\tSYS_MSGGET                 = 303\n\tSYS_MSGCTL                 = 304\n\tSYS_SHMAT                  = 305\n\tSYS_SHMDT                  = 306\n\tSYS_SHMGET                 = 307\n\tSYS_SHMCTL                 = 308\n\tSYS_ADD_KEY                = 309\n\tSYS_REQUEST_KEY            = 310\n\tSYS_KEYCTL                 = 311\n\tSYS_SEMTIMEDOP             = 312\n\tSYS_VSERVER                = 313\n\tSYS_IOPRIO_SET             = 314\n\tSYS_IOPRIO_GET             = 315\n\tSYS_INOTIFY_INIT           = 316\n\tSYS_INOTIFY_ADD_WATCH      = 317\n\tSYS_INOTIFY_RM_WATCH       = 318\n\tSYS_MBIND                  = 319\n\tSYS_GET_MEMPOLICY          = 320\n\tSYS_SET_MEMPOLICY          = 321\n\tSYS_OPENAT                 = 322\n\tSYS_MKDIRAT                = 323\n\tSYS_MKNODAT                = 324\n\tSYS_FCHOWNAT               = 325\n\tSYS_FUTIMESAT              = 326\n\tSYS_FSTATAT64              = 327\n\tSYS_UNLINKAT               = 328\n\tSYS_RENAMEAT               = 329\n\tSYS_LINKAT                 = 330\n\tSYS_SYMLINKAT              = 331\n\tSYS_READLINKAT             = 332\n\tSYS_FCHMODAT               = 333\n\tSYS_FACCESSAT              = 334\n\tSYS_PSELECT6               = 335\n\tSYS_PPOLL                  = 336\n\tSYS_UNSHARE                = 337\n\tSYS_SET_ROBUST_LIST        = 338\n\tSYS_GET_ROBUST_LIST        = 339\n\tSYS_SPLICE                 = 340\n\tSYS_ARM_SYNC_FILE_RANGE    = 341\n\tSYS_TEE                    = 342\n\tSYS_VMSPLICE               = 343\n\tSYS_MOVE_PAGES             = 344\n\tSYS_GETCPU                 = 345\n\tSYS_EPOLL_PWAIT            = 346\n\tSYS_KEXEC_LOAD             = 347\n\tSYS_UTIMENSAT              = 348\n\tSYS_SIGNALFD               = 349\n\tSYS_TIMERFD_CREATE         = 350\n\tSYS_EVENTFD                = 351\n\tSYS_FALLOCATE              = 352\n\tSYS_TIMERFD_SETTIME        = 353\n\tSYS_TIMERFD_GETTIME        = 354\n\tSYS_SIGNALFD4              = 355\n\tSYS_EVENTFD2               = 356\n\tSYS_EPOLL_CREATE1          = 357\n\tSYS_DUP3                   = 358\n\tSYS_PIPE2                  = 359\n\tSYS_INOTIFY_INIT1          = 360\n\tSYS_PREADV                 = 361\n\tSYS_PWRITEV                = 362\n\tSYS_RT_TGSIGQUEUEINFO      = 363\n\tSYS_PERF_EVENT_OPEN        = 364\n\tSYS_RECVMMSG               = 365\n\tSYS_ACCEPT4                = 366\n\tSYS_FANOTIFY_INIT          = 367\n\tSYS_FANOTIFY_MARK          = 368\n\tSYS_PRLIMIT64              = 369\n\tSYS_NAME_TO_HANDLE_AT      = 370\n\tSYS_OPEN_BY_HANDLE_AT      = 371\n\tSYS_CLOCK_ADJTIME          = 372\n\tSYS_SYNCFS                 = 373\n\tSYS_SENDMMSG               = 374\n\tSYS_SETNS                  = 375\n\tSYS_PROCESS_VM_READV       = 376\n\tSYS_PROCESS_VM_WRITEV      = 377\n\tSYS_KCMP                   = 378\n\tSYS_FINIT_MODULE           = 379\n\tSYS_SCHED_SETATTR          = 380\n\tSYS_SCHED_GETATTR          = 381\n\tSYS_RENAMEAT2              = 382\n\tSYS_SECCOMP                = 383\n\tSYS_GETRANDOM              = 384\n\tSYS_MEMFD_CREATE           = 385\n\tSYS_BPF                    = 386\n\tSYS_EXECVEAT               = 387\n\tSYS_USERFAULTFD            = 388\n\tSYS_MEMBARRIER             = 389\n\tSYS_MLOCK2                 = 390\n\tSYS_COPY_FILE_RANGE        = 391\n\tSYS_PREADV2                = 392\n\tSYS_PWRITEV2               = 393\n\tSYS_PKEY_MPROTECT          = 394\n\tSYS_PKEY_ALLOC             = 395\n\tSYS_PKEY_FREE              = 396\n\tSYS_STATX                  = 397\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm64,linux\n\npackage unix\n\nconst (\n\tSYS_IO_SETUP               = 0\n\tSYS_IO_DESTROY             = 1\n\tSYS_IO_SUBMIT              = 2\n\tSYS_IO_CANCEL              = 3\n\tSYS_IO_GETEVENTS           = 4\n\tSYS_SETXATTR               = 5\n\tSYS_LSETXATTR              = 6\n\tSYS_FSETXATTR              = 7\n\tSYS_GETXATTR               = 8\n\tSYS_LGETXATTR              = 9\n\tSYS_FGETXATTR              = 10\n\tSYS_LISTXATTR              = 11\n\tSYS_LLISTXATTR             = 12\n\tSYS_FLISTXATTR             = 13\n\tSYS_REMOVEXATTR            = 14\n\tSYS_LREMOVEXATTR           = 15\n\tSYS_FREMOVEXATTR           = 16\n\tSYS_GETCWD                 = 17\n\tSYS_LOOKUP_DCOOKIE         = 18\n\tSYS_EVENTFD2               = 19\n\tSYS_EPOLL_CREATE1          = 20\n\tSYS_EPOLL_CTL              = 21\n\tSYS_EPOLL_PWAIT            = 22\n\tSYS_DUP                    = 23\n\tSYS_DUP3                   = 24\n\tSYS_FCNTL                  = 25\n\tSYS_INOTIFY_INIT1          = 26\n\tSYS_INOTIFY_ADD_WATCH      = 27\n\tSYS_INOTIFY_RM_WATCH       = 28\n\tSYS_IOCTL                  = 29\n\tSYS_IOPRIO_SET             = 30\n\tSYS_IOPRIO_GET             = 31\n\tSYS_FLOCK                  = 32\n\tSYS_MKNODAT                = 33\n\tSYS_MKDIRAT                = 34\n\tSYS_UNLINKAT               = 35\n\tSYS_SYMLINKAT              = 36\n\tSYS_LINKAT                 = 37\n\tSYS_RENAMEAT               = 38\n\tSYS_UMOUNT2                = 39\n\tSYS_MOUNT                  = 40\n\tSYS_PIVOT_ROOT             = 41\n\tSYS_NFSSERVCTL             = 42\n\tSYS_STATFS                 = 43\n\tSYS_FSTATFS                = 44\n\tSYS_TRUNCATE               = 45\n\tSYS_FTRUNCATE              = 46\n\tSYS_FALLOCATE              = 47\n\tSYS_FACCESSAT              = 48\n\tSYS_CHDIR                  = 49\n\tSYS_FCHDIR                 = 50\n\tSYS_CHROOT                 = 51\n\tSYS_FCHMOD                 = 52\n\tSYS_FCHMODAT               = 53\n\tSYS_FCHOWNAT               = 54\n\tSYS_FCHOWN                 = 55\n\tSYS_OPENAT                 = 56\n\tSYS_CLOSE                  = 57\n\tSYS_VHANGUP                = 58\n\tSYS_PIPE2                  = 59\n\tSYS_QUOTACTL               = 60\n\tSYS_GETDENTS64             = 61\n\tSYS_LSEEK                  = 62\n\tSYS_READ                   = 63\n\tSYS_WRITE                  = 64\n\tSYS_READV                  = 65\n\tSYS_WRITEV                 = 66\n\tSYS_PREAD64                = 67\n\tSYS_PWRITE64               = 68\n\tSYS_PREADV                 = 69\n\tSYS_PWRITEV                = 70\n\tSYS_SENDFILE               = 71\n\tSYS_PSELECT6               = 72\n\tSYS_PPOLL                  = 73\n\tSYS_SIGNALFD4              = 74\n\tSYS_VMSPLICE               = 75\n\tSYS_SPLICE                 = 76\n\tSYS_TEE                    = 77\n\tSYS_READLINKAT             = 78\n\tSYS_FSTATAT                = 79\n\tSYS_FSTAT                  = 80\n\tSYS_SYNC                   = 81\n\tSYS_FSYNC                  = 82\n\tSYS_FDATASYNC              = 83\n\tSYS_SYNC_FILE_RANGE        = 84\n\tSYS_TIMERFD_CREATE         = 85\n\tSYS_TIMERFD_SETTIME        = 86\n\tSYS_TIMERFD_GETTIME        = 87\n\tSYS_UTIMENSAT              = 88\n\tSYS_ACCT                   = 89\n\tSYS_CAPGET                 = 90\n\tSYS_CAPSET                 = 91\n\tSYS_PERSONALITY            = 92\n\tSYS_EXIT                   = 93\n\tSYS_EXIT_GROUP             = 94\n\tSYS_WAITID                 = 95\n\tSYS_SET_TID_ADDRESS        = 96\n\tSYS_UNSHARE                = 97\n\tSYS_FUTEX                  = 98\n\tSYS_SET_ROBUST_LIST        = 99\n\tSYS_GET_ROBUST_LIST        = 100\n\tSYS_NANOSLEEP              = 101\n\tSYS_GETITIMER              = 102\n\tSYS_SETITIMER              = 103\n\tSYS_KEXEC_LOAD             = 104\n\tSYS_INIT_MODULE            = 105\n\tSYS_DELETE_MODULE          = 106\n\tSYS_TIMER_CREATE           = 107\n\tSYS_TIMER_GETTIME          = 108\n\tSYS_TIMER_GETOVERRUN       = 109\n\tSYS_TIMER_SETTIME          = 110\n\tSYS_TIMER_DELETE           = 111\n\tSYS_CLOCK_SETTIME          = 112\n\tSYS_CLOCK_GETTIME          = 113\n\tSYS_CLOCK_GETRES           = 114\n\tSYS_CLOCK_NANOSLEEP        = 115\n\tSYS_SYSLOG                 = 116\n\tSYS_PTRACE                 = 117\n\tSYS_SCHED_SETPARAM         = 118\n\tSYS_SCHED_SETSCHEDULER     = 119\n\tSYS_SCHED_GETSCHEDULER     = 120\n\tSYS_SCHED_GETPARAM         = 121\n\tSYS_SCHED_SETAFFINITY      = 122\n\tSYS_SCHED_GETAFFINITY      = 123\n\tSYS_SCHED_YIELD            = 124\n\tSYS_SCHED_GET_PRIORITY_MAX = 125\n\tSYS_SCHED_GET_PRIORITY_MIN = 126\n\tSYS_SCHED_RR_GET_INTERVAL  = 127\n\tSYS_RESTART_SYSCALL        = 128\n\tSYS_KILL                   = 129\n\tSYS_TKILL                  = 130\n\tSYS_TGKILL                 = 131\n\tSYS_SIGALTSTACK            = 132\n\tSYS_RT_SIGSUSPEND          = 133\n\tSYS_RT_SIGACTION           = 134\n\tSYS_RT_SIGPROCMASK         = 135\n\tSYS_RT_SIGPENDING          = 136\n\tSYS_RT_SIGTIMEDWAIT        = 137\n\tSYS_RT_SIGQUEUEINFO        = 138\n\tSYS_RT_SIGRETURN           = 139\n\tSYS_SETPRIORITY            = 140\n\tSYS_GETPRIORITY            = 141\n\tSYS_REBOOT                 = 142\n\tSYS_SETREGID               = 143\n\tSYS_SETGID                 = 144\n\tSYS_SETREUID               = 145\n\tSYS_SETUID                 = 146\n\tSYS_SETRESUID              = 147\n\tSYS_GETRESUID              = 148\n\tSYS_SETRESGID              = 149\n\tSYS_GETRESGID              = 150\n\tSYS_SETFSUID               = 151\n\tSYS_SETFSGID               = 152\n\tSYS_TIMES                  = 153\n\tSYS_SETPGID                = 154\n\tSYS_GETPGID                = 155\n\tSYS_GETSID                 = 156\n\tSYS_SETSID                 = 157\n\tSYS_GETGROUPS              = 158\n\tSYS_SETGROUPS              = 159\n\tSYS_UNAME                  = 160\n\tSYS_SETHOSTNAME            = 161\n\tSYS_SETDOMAINNAME          = 162\n\tSYS_GETRLIMIT              = 163\n\tSYS_SETRLIMIT              = 164\n\tSYS_GETRUSAGE              = 165\n\tSYS_UMASK                  = 166\n\tSYS_PRCTL                  = 167\n\tSYS_GETCPU                 = 168\n\tSYS_GETTIMEOFDAY           = 169\n\tSYS_SETTIMEOFDAY           = 170\n\tSYS_ADJTIMEX               = 171\n\tSYS_GETPID                 = 172\n\tSYS_GETPPID                = 173\n\tSYS_GETUID                 = 174\n\tSYS_GETEUID                = 175\n\tSYS_GETGID                 = 176\n\tSYS_GETEGID                = 177\n\tSYS_GETTID                 = 178\n\tSYS_SYSINFO                = 179\n\tSYS_MQ_OPEN                = 180\n\tSYS_MQ_UNLINK              = 181\n\tSYS_MQ_TIMEDSEND           = 182\n\tSYS_MQ_TIMEDRECEIVE        = 183\n\tSYS_MQ_NOTIFY              = 184\n\tSYS_MQ_GETSETATTR          = 185\n\tSYS_MSGGET                 = 186\n\tSYS_MSGCTL                 = 187\n\tSYS_MSGRCV                 = 188\n\tSYS_MSGSND                 = 189\n\tSYS_SEMGET                 = 190\n\tSYS_SEMCTL                 = 191\n\tSYS_SEMTIMEDOP             = 192\n\tSYS_SEMOP                  = 193\n\tSYS_SHMGET                 = 194\n\tSYS_SHMCTL                 = 195\n\tSYS_SHMAT                  = 196\n\tSYS_SHMDT                  = 197\n\tSYS_SOCKET                 = 198\n\tSYS_SOCKETPAIR             = 199\n\tSYS_BIND                   = 200\n\tSYS_LISTEN                 = 201\n\tSYS_ACCEPT                 = 202\n\tSYS_CONNECT                = 203\n\tSYS_GETSOCKNAME            = 204\n\tSYS_GETPEERNAME            = 205\n\tSYS_SENDTO                 = 206\n\tSYS_RECVFROM               = 207\n\tSYS_SETSOCKOPT             = 208\n\tSYS_GETSOCKOPT             = 209\n\tSYS_SHUTDOWN               = 210\n\tSYS_SENDMSG                = 211\n\tSYS_RECVMSG                = 212\n\tSYS_READAHEAD              = 213\n\tSYS_BRK                    = 214\n\tSYS_MUNMAP                 = 215\n\tSYS_MREMAP                 = 216\n\tSYS_ADD_KEY                = 217\n\tSYS_REQUEST_KEY            = 218\n\tSYS_KEYCTL                 = 219\n\tSYS_CLONE                  = 220\n\tSYS_EXECVE                 = 221\n\tSYS_MMAP                   = 222\n\tSYS_FADVISE64              = 223\n\tSYS_SWAPON                 = 224\n\tSYS_SWAPOFF                = 225\n\tSYS_MPROTECT               = 226\n\tSYS_MSYNC                  = 227\n\tSYS_MLOCK                  = 228\n\tSYS_MUNLOCK                = 229\n\tSYS_MLOCKALL               = 230\n\tSYS_MUNLOCKALL             = 231\n\tSYS_MINCORE                = 232\n\tSYS_MADVISE                = 233\n\tSYS_REMAP_FILE_PAGES       = 234\n\tSYS_MBIND                  = 235\n\tSYS_GET_MEMPOLICY          = 236\n\tSYS_SET_MEMPOLICY          = 237\n\tSYS_MIGRATE_PAGES          = 238\n\tSYS_MOVE_PAGES             = 239\n\tSYS_RT_TGSIGQUEUEINFO      = 240\n\tSYS_PERF_EVENT_OPEN        = 241\n\tSYS_ACCEPT4                = 242\n\tSYS_RECVMMSG               = 243\n\tSYS_ARCH_SPECIFIC_SYSCALL  = 244\n\tSYS_WAIT4                  = 260\n\tSYS_PRLIMIT64              = 261\n\tSYS_FANOTIFY_INIT          = 262\n\tSYS_FANOTIFY_MARK          = 263\n\tSYS_NAME_TO_HANDLE_AT      = 264\n\tSYS_OPEN_BY_HANDLE_AT      = 265\n\tSYS_CLOCK_ADJTIME          = 266\n\tSYS_SYNCFS                 = 267\n\tSYS_SETNS                  = 268\n\tSYS_SENDMMSG               = 269\n\tSYS_PROCESS_VM_READV       = 270\n\tSYS_PROCESS_VM_WRITEV      = 271\n\tSYS_KCMP                   = 272\n\tSYS_FINIT_MODULE           = 273\n\tSYS_SCHED_SETATTR          = 274\n\tSYS_SCHED_GETATTR          = 275\n\tSYS_RENAMEAT2              = 276\n\tSYS_SECCOMP                = 277\n\tSYS_GETRANDOM              = 278\n\tSYS_MEMFD_CREATE           = 279\n\tSYS_BPF                    = 280\n\tSYS_EXECVEAT               = 281\n\tSYS_USERFAULTFD            = 282\n\tSYS_MEMBARRIER             = 283\n\tSYS_MLOCK2                 = 284\n\tSYS_COPY_FILE_RANGE        = 285\n\tSYS_PREADV2                = 286\n\tSYS_PWRITEV2               = 287\n\tSYS_PKEY_MPROTECT          = 288\n\tSYS_PKEY_ALLOC             = 289\n\tSYS_PKEY_FREE              = 290\n\tSYS_STATX                  = 291\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips,linux\n\npackage unix\n\nconst (\n\tSYS_SYSCALL                = 4000\n\tSYS_EXIT                   = 4001\n\tSYS_FORK                   = 4002\n\tSYS_READ                   = 4003\n\tSYS_WRITE                  = 4004\n\tSYS_OPEN                   = 4005\n\tSYS_CLOSE                  = 4006\n\tSYS_WAITPID                = 4007\n\tSYS_CREAT                  = 4008\n\tSYS_LINK                   = 4009\n\tSYS_UNLINK                 = 4010\n\tSYS_EXECVE                 = 4011\n\tSYS_CHDIR                  = 4012\n\tSYS_TIME                   = 4013\n\tSYS_MKNOD                  = 4014\n\tSYS_CHMOD                  = 4015\n\tSYS_LCHOWN                 = 4016\n\tSYS_BREAK                  = 4017\n\tSYS_UNUSED18               = 4018\n\tSYS_LSEEK                  = 4019\n\tSYS_GETPID                 = 4020\n\tSYS_MOUNT                  = 4021\n\tSYS_UMOUNT                 = 4022\n\tSYS_SETUID                 = 4023\n\tSYS_GETUID                 = 4024\n\tSYS_STIME                  = 4025\n\tSYS_PTRACE                 = 4026\n\tSYS_ALARM                  = 4027\n\tSYS_UNUSED28               = 4028\n\tSYS_PAUSE                  = 4029\n\tSYS_UTIME                  = 4030\n\tSYS_STTY                   = 4031\n\tSYS_GTTY                   = 4032\n\tSYS_ACCESS                 = 4033\n\tSYS_NICE                   = 4034\n\tSYS_FTIME                  = 4035\n\tSYS_SYNC                   = 4036\n\tSYS_KILL                   = 4037\n\tSYS_RENAME                 = 4038\n\tSYS_MKDIR                  = 4039\n\tSYS_RMDIR                  = 4040\n\tSYS_DUP                    = 4041\n\tSYS_PIPE                   = 4042\n\tSYS_TIMES                  = 4043\n\tSYS_PROF                   = 4044\n\tSYS_BRK                    = 4045\n\tSYS_SETGID                 = 4046\n\tSYS_GETGID                 = 4047\n\tSYS_SIGNAL                 = 4048\n\tSYS_GETEUID                = 4049\n\tSYS_GETEGID                = 4050\n\tSYS_ACCT                   = 4051\n\tSYS_UMOUNT2                = 4052\n\tSYS_LOCK                   = 4053\n\tSYS_IOCTL                  = 4054\n\tSYS_FCNTL                  = 4055\n\tSYS_MPX                    = 4056\n\tSYS_SETPGID                = 4057\n\tSYS_ULIMIT                 = 4058\n\tSYS_UNUSED59               = 4059\n\tSYS_UMASK                  = 4060\n\tSYS_CHROOT                 = 4061\n\tSYS_USTAT                  = 4062\n\tSYS_DUP2                   = 4063\n\tSYS_GETPPID                = 4064\n\tSYS_GETPGRP                = 4065\n\tSYS_SETSID                 = 4066\n\tSYS_SIGACTION              = 4067\n\tSYS_SGETMASK               = 4068\n\tSYS_SSETMASK               = 4069\n\tSYS_SETREUID               = 4070\n\tSYS_SETREGID               = 4071\n\tSYS_SIGSUSPEND             = 4072\n\tSYS_SIGPENDING             = 4073\n\tSYS_SETHOSTNAME            = 4074\n\tSYS_SETRLIMIT              = 4075\n\tSYS_GETRLIMIT              = 4076\n\tSYS_GETRUSAGE              = 4077\n\tSYS_GETTIMEOFDAY           = 4078\n\tSYS_SETTIMEOFDAY           = 4079\n\tSYS_GETGROUPS              = 4080\n\tSYS_SETGROUPS              = 4081\n\tSYS_RESERVED82             = 4082\n\tSYS_SYMLINK                = 4083\n\tSYS_UNUSED84               = 4084\n\tSYS_READLINK               = 4085\n\tSYS_USELIB                 = 4086\n\tSYS_SWAPON                 = 4087\n\tSYS_REBOOT                 = 4088\n\tSYS_READDIR                = 4089\n\tSYS_MMAP                   = 4090\n\tSYS_MUNMAP                 = 4091\n\tSYS_TRUNCATE               = 4092\n\tSYS_FTRUNCATE              = 4093\n\tSYS_FCHMOD                 = 4094\n\tSYS_FCHOWN                 = 4095\n\tSYS_GETPRIORITY            = 4096\n\tSYS_SETPRIORITY            = 4097\n\tSYS_PROFIL                 = 4098\n\tSYS_STATFS                 = 4099\n\tSYS_FSTATFS                = 4100\n\tSYS_IOPERM                 = 4101\n\tSYS_SOCKETCALL             = 4102\n\tSYS_SYSLOG                 = 4103\n\tSYS_SETITIMER              = 4104\n\tSYS_GETITIMER              = 4105\n\tSYS_STAT                   = 4106\n\tSYS_LSTAT                  = 4107\n\tSYS_FSTAT                  = 4108\n\tSYS_UNUSED109              = 4109\n\tSYS_IOPL                   = 4110\n\tSYS_VHANGUP                = 4111\n\tSYS_IDLE                   = 4112\n\tSYS_VM86                   = 4113\n\tSYS_WAIT4                  = 4114\n\tSYS_SWAPOFF                = 4115\n\tSYS_SYSINFO                = 4116\n\tSYS_IPC                    = 4117\n\tSYS_FSYNC                  = 4118\n\tSYS_SIGRETURN              = 4119\n\tSYS_CLONE                  = 4120\n\tSYS_SETDOMAINNAME          = 4121\n\tSYS_UNAME                  = 4122\n\tSYS_MODIFY_LDT             = 4123\n\tSYS_ADJTIMEX               = 4124\n\tSYS_MPROTECT               = 4125\n\tSYS_SIGPROCMASK            = 4126\n\tSYS_CREATE_MODULE          = 4127\n\tSYS_INIT_MODULE            = 4128\n\tSYS_DELETE_MODULE          = 4129\n\tSYS_GET_KERNEL_SYMS        = 4130\n\tSYS_QUOTACTL               = 4131\n\tSYS_GETPGID                = 4132\n\tSYS_FCHDIR                 = 4133\n\tSYS_BDFLUSH                = 4134\n\tSYS_SYSFS                  = 4135\n\tSYS_PERSONALITY            = 4136\n\tSYS_AFS_SYSCALL            = 4137\n\tSYS_SETFSUID               = 4138\n\tSYS_SETFSGID               = 4139\n\tSYS__LLSEEK                = 4140\n\tSYS_GETDENTS               = 4141\n\tSYS__NEWSELECT             = 4142\n\tSYS_FLOCK                  = 4143\n\tSYS_MSYNC                  = 4144\n\tSYS_READV                  = 4145\n\tSYS_WRITEV                 = 4146\n\tSYS_CACHEFLUSH             = 4147\n\tSYS_CACHECTL               = 4148\n\tSYS_SYSMIPS                = 4149\n\tSYS_UNUSED150              = 4150\n\tSYS_GETSID                 = 4151\n\tSYS_FDATASYNC              = 4152\n\tSYS__SYSCTL                = 4153\n\tSYS_MLOCK                  = 4154\n\tSYS_MUNLOCK                = 4155\n\tSYS_MLOCKALL               = 4156\n\tSYS_MUNLOCKALL             = 4157\n\tSYS_SCHED_SETPARAM         = 4158\n\tSYS_SCHED_GETPARAM         = 4159\n\tSYS_SCHED_SETSCHEDULER     = 4160\n\tSYS_SCHED_GETSCHEDULER     = 4161\n\tSYS_SCHED_YIELD            = 4162\n\tSYS_SCHED_GET_PRIORITY_MAX = 4163\n\tSYS_SCHED_GET_PRIORITY_MIN = 4164\n\tSYS_SCHED_RR_GET_INTERVAL  = 4165\n\tSYS_NANOSLEEP              = 4166\n\tSYS_MREMAP                 = 4167\n\tSYS_ACCEPT                 = 4168\n\tSYS_BIND                   = 4169\n\tSYS_CONNECT                = 4170\n\tSYS_GETPEERNAME            = 4171\n\tSYS_GETSOCKNAME            = 4172\n\tSYS_GETSOCKOPT             = 4173\n\tSYS_LISTEN                 = 4174\n\tSYS_RECV                   = 4175\n\tSYS_RECVFROM               = 4176\n\tSYS_RECVMSG                = 4177\n\tSYS_SEND                   = 4178\n\tSYS_SENDMSG                = 4179\n\tSYS_SENDTO                 = 4180\n\tSYS_SETSOCKOPT             = 4181\n\tSYS_SHUTDOWN               = 4182\n\tSYS_SOCKET                 = 4183\n\tSYS_SOCKETPAIR             = 4184\n\tSYS_SETRESUID              = 4185\n\tSYS_GETRESUID              = 4186\n\tSYS_QUERY_MODULE           = 4187\n\tSYS_POLL                   = 4188\n\tSYS_NFSSERVCTL             = 4189\n\tSYS_SETRESGID              = 4190\n\tSYS_GETRESGID              = 4191\n\tSYS_PRCTL                  = 4192\n\tSYS_RT_SIGRETURN           = 4193\n\tSYS_RT_SIGACTION           = 4194\n\tSYS_RT_SIGPROCMASK         = 4195\n\tSYS_RT_SIGPENDING          = 4196\n\tSYS_RT_SIGTIMEDWAIT        = 4197\n\tSYS_RT_SIGQUEUEINFO        = 4198\n\tSYS_RT_SIGSUSPEND          = 4199\n\tSYS_PREAD64                = 4200\n\tSYS_PWRITE64               = 4201\n\tSYS_CHOWN                  = 4202\n\tSYS_GETCWD                 = 4203\n\tSYS_CAPGET                 = 4204\n\tSYS_CAPSET                 = 4205\n\tSYS_SIGALTSTACK            = 4206\n\tSYS_SENDFILE               = 4207\n\tSYS_GETPMSG                = 4208\n\tSYS_PUTPMSG                = 4209\n\tSYS_MMAP2                  = 4210\n\tSYS_TRUNCATE64             = 4211\n\tSYS_FTRUNCATE64            = 4212\n\tSYS_STAT64                 = 4213\n\tSYS_LSTAT64                = 4214\n\tSYS_FSTAT64                = 4215\n\tSYS_PIVOT_ROOT             = 4216\n\tSYS_MINCORE                = 4217\n\tSYS_MADVISE                = 4218\n\tSYS_GETDENTS64             = 4219\n\tSYS_FCNTL64                = 4220\n\tSYS_RESERVED221            = 4221\n\tSYS_GETTID                 = 4222\n\tSYS_READAHEAD              = 4223\n\tSYS_SETXATTR               = 4224\n\tSYS_LSETXATTR              = 4225\n\tSYS_FSETXATTR              = 4226\n\tSYS_GETXATTR               = 4227\n\tSYS_LGETXATTR              = 4228\n\tSYS_FGETXATTR              = 4229\n\tSYS_LISTXATTR              = 4230\n\tSYS_LLISTXATTR             = 4231\n\tSYS_FLISTXATTR             = 4232\n\tSYS_REMOVEXATTR            = 4233\n\tSYS_LREMOVEXATTR           = 4234\n\tSYS_FREMOVEXATTR           = 4235\n\tSYS_TKILL                  = 4236\n\tSYS_SENDFILE64             = 4237\n\tSYS_FUTEX                  = 4238\n\tSYS_SCHED_SETAFFINITY      = 4239\n\tSYS_SCHED_GETAFFINITY      = 4240\n\tSYS_IO_SETUP               = 4241\n\tSYS_IO_DESTROY             = 4242\n\tSYS_IO_GETEVENTS           = 4243\n\tSYS_IO_SUBMIT              = 4244\n\tSYS_IO_CANCEL              = 4245\n\tSYS_EXIT_GROUP             = 4246\n\tSYS_LOOKUP_DCOOKIE         = 4247\n\tSYS_EPOLL_CREATE           = 4248\n\tSYS_EPOLL_CTL              = 4249\n\tSYS_EPOLL_WAIT             = 4250\n\tSYS_REMAP_FILE_PAGES       = 4251\n\tSYS_SET_TID_ADDRESS        = 4252\n\tSYS_RESTART_SYSCALL        = 4253\n\tSYS_FADVISE64              = 4254\n\tSYS_STATFS64               = 4255\n\tSYS_FSTATFS64              = 4256\n\tSYS_TIMER_CREATE           = 4257\n\tSYS_TIMER_SETTIME          = 4258\n\tSYS_TIMER_GETTIME          = 4259\n\tSYS_TIMER_GETOVERRUN       = 4260\n\tSYS_TIMER_DELETE           = 4261\n\tSYS_CLOCK_SETTIME          = 4262\n\tSYS_CLOCK_GETTIME          = 4263\n\tSYS_CLOCK_GETRES           = 4264\n\tSYS_CLOCK_NANOSLEEP        = 4265\n\tSYS_TGKILL                 = 4266\n\tSYS_UTIMES                 = 4267\n\tSYS_MBIND                  = 4268\n\tSYS_GET_MEMPOLICY          = 4269\n\tSYS_SET_MEMPOLICY          = 4270\n\tSYS_MQ_OPEN                = 4271\n\tSYS_MQ_UNLINK              = 4272\n\tSYS_MQ_TIMEDSEND           = 4273\n\tSYS_MQ_TIMEDRECEIVE        = 4274\n\tSYS_MQ_NOTIFY              = 4275\n\tSYS_MQ_GETSETATTR          = 4276\n\tSYS_VSERVER                = 4277\n\tSYS_WAITID                 = 4278\n\tSYS_ADD_KEY                = 4280\n\tSYS_REQUEST_KEY            = 4281\n\tSYS_KEYCTL                 = 4282\n\tSYS_SET_THREAD_AREA        = 4283\n\tSYS_INOTIFY_INIT           = 4284\n\tSYS_INOTIFY_ADD_WATCH      = 4285\n\tSYS_INOTIFY_RM_WATCH       = 4286\n\tSYS_MIGRATE_PAGES          = 4287\n\tSYS_OPENAT                 = 4288\n\tSYS_MKDIRAT                = 4289\n\tSYS_MKNODAT                = 4290\n\tSYS_FCHOWNAT               = 4291\n\tSYS_FUTIMESAT              = 4292\n\tSYS_FSTATAT64              = 4293\n\tSYS_UNLINKAT               = 4294\n\tSYS_RENAMEAT               = 4295\n\tSYS_LINKAT                 = 4296\n\tSYS_SYMLINKAT              = 4297\n\tSYS_READLINKAT             = 4298\n\tSYS_FCHMODAT               = 4299\n\tSYS_FACCESSAT              = 4300\n\tSYS_PSELECT6               = 4301\n\tSYS_PPOLL                  = 4302\n\tSYS_UNSHARE                = 4303\n\tSYS_SPLICE                 = 4304\n\tSYS_SYNC_FILE_RANGE        = 4305\n\tSYS_TEE                    = 4306\n\tSYS_VMSPLICE               = 4307\n\tSYS_MOVE_PAGES             = 4308\n\tSYS_SET_ROBUST_LIST        = 4309\n\tSYS_GET_ROBUST_LIST        = 4310\n\tSYS_KEXEC_LOAD             = 4311\n\tSYS_GETCPU                 = 4312\n\tSYS_EPOLL_PWAIT            = 4313\n\tSYS_IOPRIO_SET             = 4314\n\tSYS_IOPRIO_GET             = 4315\n\tSYS_UTIMENSAT              = 4316\n\tSYS_SIGNALFD               = 4317\n\tSYS_TIMERFD                = 4318\n\tSYS_EVENTFD                = 4319\n\tSYS_FALLOCATE              = 4320\n\tSYS_TIMERFD_CREATE         = 4321\n\tSYS_TIMERFD_GETTIME        = 4322\n\tSYS_TIMERFD_SETTIME        = 4323\n\tSYS_SIGNALFD4              = 4324\n\tSYS_EVENTFD2               = 4325\n\tSYS_EPOLL_CREATE1          = 4326\n\tSYS_DUP3                   = 4327\n\tSYS_PIPE2                  = 4328\n\tSYS_INOTIFY_INIT1          = 4329\n\tSYS_PREADV                 = 4330\n\tSYS_PWRITEV                = 4331\n\tSYS_RT_TGSIGQUEUEINFO      = 4332\n\tSYS_PERF_EVENT_OPEN        = 4333\n\tSYS_ACCEPT4                = 4334\n\tSYS_RECVMMSG               = 4335\n\tSYS_FANOTIFY_INIT          = 4336\n\tSYS_FANOTIFY_MARK          = 4337\n\tSYS_PRLIMIT64              = 4338\n\tSYS_NAME_TO_HANDLE_AT      = 4339\n\tSYS_OPEN_BY_HANDLE_AT      = 4340\n\tSYS_CLOCK_ADJTIME          = 4341\n\tSYS_SYNCFS                 = 4342\n\tSYS_SENDMMSG               = 4343\n\tSYS_SETNS                  = 4344\n\tSYS_PROCESS_VM_READV       = 4345\n\tSYS_PROCESS_VM_WRITEV      = 4346\n\tSYS_KCMP                   = 4347\n\tSYS_FINIT_MODULE           = 4348\n\tSYS_SCHED_SETATTR          = 4349\n\tSYS_SCHED_GETATTR          = 4350\n\tSYS_RENAMEAT2              = 4351\n\tSYS_SECCOMP                = 4352\n\tSYS_GETRANDOM              = 4353\n\tSYS_MEMFD_CREATE           = 4354\n\tSYS_BPF                    = 4355\n\tSYS_EXECVEAT               = 4356\n\tSYS_USERFAULTFD            = 4357\n\tSYS_MEMBARRIER             = 4358\n\tSYS_MLOCK2                 = 4359\n\tSYS_COPY_FILE_RANGE        = 4360\n\tSYS_PREADV2                = 4361\n\tSYS_PWRITEV2               = 4362\n\tSYS_PKEY_MPROTECT          = 4363\n\tSYS_PKEY_ALLOC             = 4364\n\tSYS_PKEY_FREE              = 4365\n\tSYS_STATX                  = 4366\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips64,linux\n\npackage unix\n\nconst (\n\tSYS_READ                   = 5000\n\tSYS_WRITE                  = 5001\n\tSYS_OPEN                   = 5002\n\tSYS_CLOSE                  = 5003\n\tSYS_STAT                   = 5004\n\tSYS_FSTAT                  = 5005\n\tSYS_LSTAT                  = 5006\n\tSYS_POLL                   = 5007\n\tSYS_LSEEK                  = 5008\n\tSYS_MMAP                   = 5009\n\tSYS_MPROTECT               = 5010\n\tSYS_MUNMAP                 = 5011\n\tSYS_BRK                    = 5012\n\tSYS_RT_SIGACTION           = 5013\n\tSYS_RT_SIGPROCMASK         = 5014\n\tSYS_IOCTL                  = 5015\n\tSYS_PREAD64                = 5016\n\tSYS_PWRITE64               = 5017\n\tSYS_READV                  = 5018\n\tSYS_WRITEV                 = 5019\n\tSYS_ACCESS                 = 5020\n\tSYS_PIPE                   = 5021\n\tSYS__NEWSELECT             = 5022\n\tSYS_SCHED_YIELD            = 5023\n\tSYS_MREMAP                 = 5024\n\tSYS_MSYNC                  = 5025\n\tSYS_MINCORE                = 5026\n\tSYS_MADVISE                = 5027\n\tSYS_SHMGET                 = 5028\n\tSYS_SHMAT                  = 5029\n\tSYS_SHMCTL                 = 5030\n\tSYS_DUP                    = 5031\n\tSYS_DUP2                   = 5032\n\tSYS_PAUSE                  = 5033\n\tSYS_NANOSLEEP              = 5034\n\tSYS_GETITIMER              = 5035\n\tSYS_SETITIMER              = 5036\n\tSYS_ALARM                  = 5037\n\tSYS_GETPID                 = 5038\n\tSYS_SENDFILE               = 5039\n\tSYS_SOCKET                 = 5040\n\tSYS_CONNECT                = 5041\n\tSYS_ACCEPT                 = 5042\n\tSYS_SENDTO                 = 5043\n\tSYS_RECVFROM               = 5044\n\tSYS_SENDMSG                = 5045\n\tSYS_RECVMSG                = 5046\n\tSYS_SHUTDOWN               = 5047\n\tSYS_BIND                   = 5048\n\tSYS_LISTEN                 = 5049\n\tSYS_GETSOCKNAME            = 5050\n\tSYS_GETPEERNAME            = 5051\n\tSYS_SOCKETPAIR             = 5052\n\tSYS_SETSOCKOPT             = 5053\n\tSYS_GETSOCKOPT             = 5054\n\tSYS_CLONE                  = 5055\n\tSYS_FORK                   = 5056\n\tSYS_EXECVE                 = 5057\n\tSYS_EXIT                   = 5058\n\tSYS_WAIT4                  = 5059\n\tSYS_KILL                   = 5060\n\tSYS_UNAME                  = 5061\n\tSYS_SEMGET                 = 5062\n\tSYS_SEMOP                  = 5063\n\tSYS_SEMCTL                 = 5064\n\tSYS_SHMDT                  = 5065\n\tSYS_MSGGET                 = 5066\n\tSYS_MSGSND                 = 5067\n\tSYS_MSGRCV                 = 5068\n\tSYS_MSGCTL                 = 5069\n\tSYS_FCNTL                  = 5070\n\tSYS_FLOCK                  = 5071\n\tSYS_FSYNC                  = 5072\n\tSYS_FDATASYNC              = 5073\n\tSYS_TRUNCATE               = 5074\n\tSYS_FTRUNCATE              = 5075\n\tSYS_GETDENTS               = 5076\n\tSYS_GETCWD                 = 5077\n\tSYS_CHDIR                  = 5078\n\tSYS_FCHDIR                 = 5079\n\tSYS_RENAME                 = 5080\n\tSYS_MKDIR                  = 5081\n\tSYS_RMDIR                  = 5082\n\tSYS_CREAT                  = 5083\n\tSYS_LINK                   = 5084\n\tSYS_UNLINK                 = 5085\n\tSYS_SYMLINK                = 5086\n\tSYS_READLINK               = 5087\n\tSYS_CHMOD                  = 5088\n\tSYS_FCHMOD                 = 5089\n\tSYS_CHOWN                  = 5090\n\tSYS_FCHOWN                 = 5091\n\tSYS_LCHOWN                 = 5092\n\tSYS_UMASK                  = 5093\n\tSYS_GETTIMEOFDAY           = 5094\n\tSYS_GETRLIMIT              = 5095\n\tSYS_GETRUSAGE              = 5096\n\tSYS_SYSINFO                = 5097\n\tSYS_TIMES                  = 5098\n\tSYS_PTRACE                 = 5099\n\tSYS_GETUID                 = 5100\n\tSYS_SYSLOG                 = 5101\n\tSYS_GETGID                 = 5102\n\tSYS_SETUID                 = 5103\n\tSYS_SETGID                 = 5104\n\tSYS_GETEUID                = 5105\n\tSYS_GETEGID                = 5106\n\tSYS_SETPGID                = 5107\n\tSYS_GETPPID                = 5108\n\tSYS_GETPGRP                = 5109\n\tSYS_SETSID                 = 5110\n\tSYS_SETREUID               = 5111\n\tSYS_SETREGID               = 5112\n\tSYS_GETGROUPS              = 5113\n\tSYS_SETGROUPS              = 5114\n\tSYS_SETRESUID              = 5115\n\tSYS_GETRESUID              = 5116\n\tSYS_SETRESGID              = 5117\n\tSYS_GETRESGID              = 5118\n\tSYS_GETPGID                = 5119\n\tSYS_SETFSUID               = 5120\n\tSYS_SETFSGID               = 5121\n\tSYS_GETSID                 = 5122\n\tSYS_CAPGET                 = 5123\n\tSYS_CAPSET                 = 5124\n\tSYS_RT_SIGPENDING          = 5125\n\tSYS_RT_SIGTIMEDWAIT        = 5126\n\tSYS_RT_SIGQUEUEINFO        = 5127\n\tSYS_RT_SIGSUSPEND          = 5128\n\tSYS_SIGALTSTACK            = 5129\n\tSYS_UTIME                  = 5130\n\tSYS_MKNOD                  = 5131\n\tSYS_PERSONALITY            = 5132\n\tSYS_USTAT                  = 5133\n\tSYS_STATFS                 = 5134\n\tSYS_FSTATFS                = 5135\n\tSYS_SYSFS                  = 5136\n\tSYS_GETPRIORITY            = 5137\n\tSYS_SETPRIORITY            = 5138\n\tSYS_SCHED_SETPARAM         = 5139\n\tSYS_SCHED_GETPARAM         = 5140\n\tSYS_SCHED_SETSCHEDULER     = 5141\n\tSYS_SCHED_GETSCHEDULER     = 5142\n\tSYS_SCHED_GET_PRIORITY_MAX = 5143\n\tSYS_SCHED_GET_PRIORITY_MIN = 5144\n\tSYS_SCHED_RR_GET_INTERVAL  = 5145\n\tSYS_MLOCK                  = 5146\n\tSYS_MUNLOCK                = 5147\n\tSYS_MLOCKALL               = 5148\n\tSYS_MUNLOCKALL             = 5149\n\tSYS_VHANGUP                = 5150\n\tSYS_PIVOT_ROOT             = 5151\n\tSYS__SYSCTL                = 5152\n\tSYS_PRCTL                  = 5153\n\tSYS_ADJTIMEX               = 5154\n\tSYS_SETRLIMIT              = 5155\n\tSYS_CHROOT                 = 5156\n\tSYS_SYNC                   = 5157\n\tSYS_ACCT                   = 5158\n\tSYS_SETTIMEOFDAY           = 5159\n\tSYS_MOUNT                  = 5160\n\tSYS_UMOUNT2                = 5161\n\tSYS_SWAPON                 = 5162\n\tSYS_SWAPOFF                = 5163\n\tSYS_REBOOT                 = 5164\n\tSYS_SETHOSTNAME            = 5165\n\tSYS_SETDOMAINNAME          = 5166\n\tSYS_CREATE_MODULE          = 5167\n\tSYS_INIT_MODULE            = 5168\n\tSYS_DELETE_MODULE          = 5169\n\tSYS_GET_KERNEL_SYMS        = 5170\n\tSYS_QUERY_MODULE           = 5171\n\tSYS_QUOTACTL               = 5172\n\tSYS_NFSSERVCTL             = 5173\n\tSYS_GETPMSG                = 5174\n\tSYS_PUTPMSG                = 5175\n\tSYS_AFS_SYSCALL            = 5176\n\tSYS_RESERVED177            = 5177\n\tSYS_GETTID                 = 5178\n\tSYS_READAHEAD              = 5179\n\tSYS_SETXATTR               = 5180\n\tSYS_LSETXATTR              = 5181\n\tSYS_FSETXATTR              = 5182\n\tSYS_GETXATTR               = 5183\n\tSYS_LGETXATTR              = 5184\n\tSYS_FGETXATTR              = 5185\n\tSYS_LISTXATTR              = 5186\n\tSYS_LLISTXATTR             = 5187\n\tSYS_FLISTXATTR             = 5188\n\tSYS_REMOVEXATTR            = 5189\n\tSYS_LREMOVEXATTR           = 5190\n\tSYS_FREMOVEXATTR           = 5191\n\tSYS_TKILL                  = 5192\n\tSYS_RESERVED193            = 5193\n\tSYS_FUTEX                  = 5194\n\tSYS_SCHED_SETAFFINITY      = 5195\n\tSYS_SCHED_GETAFFINITY      = 5196\n\tSYS_CACHEFLUSH             = 5197\n\tSYS_CACHECTL               = 5198\n\tSYS_SYSMIPS                = 5199\n\tSYS_IO_SETUP               = 5200\n\tSYS_IO_DESTROY             = 5201\n\tSYS_IO_GETEVENTS           = 5202\n\tSYS_IO_SUBMIT              = 5203\n\tSYS_IO_CANCEL              = 5204\n\tSYS_EXIT_GROUP             = 5205\n\tSYS_LOOKUP_DCOOKIE         = 5206\n\tSYS_EPOLL_CREATE           = 5207\n\tSYS_EPOLL_CTL              = 5208\n\tSYS_EPOLL_WAIT             = 5209\n\tSYS_REMAP_FILE_PAGES       = 5210\n\tSYS_RT_SIGRETURN           = 5211\n\tSYS_SET_TID_ADDRESS        = 5212\n\tSYS_RESTART_SYSCALL        = 5213\n\tSYS_SEMTIMEDOP             = 5214\n\tSYS_FADVISE64              = 5215\n\tSYS_TIMER_CREATE           = 5216\n\tSYS_TIMER_SETTIME          = 5217\n\tSYS_TIMER_GETTIME          = 5218\n\tSYS_TIMER_GETOVERRUN       = 5219\n\tSYS_TIMER_DELETE           = 5220\n\tSYS_CLOCK_SETTIME          = 5221\n\tSYS_CLOCK_GETTIME          = 5222\n\tSYS_CLOCK_GETRES           = 5223\n\tSYS_CLOCK_NANOSLEEP        = 5224\n\tSYS_TGKILL                 = 5225\n\tSYS_UTIMES                 = 5226\n\tSYS_MBIND                  = 5227\n\tSYS_GET_MEMPOLICY          = 5228\n\tSYS_SET_MEMPOLICY          = 5229\n\tSYS_MQ_OPEN                = 5230\n\tSYS_MQ_UNLINK              = 5231\n\tSYS_MQ_TIMEDSEND           = 5232\n\tSYS_MQ_TIMEDRECEIVE        = 5233\n\tSYS_MQ_NOTIFY              = 5234\n\tSYS_MQ_GETSETATTR          = 5235\n\tSYS_VSERVER                = 5236\n\tSYS_WAITID                 = 5237\n\tSYS_ADD_KEY                = 5239\n\tSYS_REQUEST_KEY            = 5240\n\tSYS_KEYCTL                 = 5241\n\tSYS_SET_THREAD_AREA        = 5242\n\tSYS_INOTIFY_INIT           = 5243\n\tSYS_INOTIFY_ADD_WATCH      = 5244\n\tSYS_INOTIFY_RM_WATCH       = 5245\n\tSYS_MIGRATE_PAGES          = 5246\n\tSYS_OPENAT                 = 5247\n\tSYS_MKDIRAT                = 5248\n\tSYS_MKNODAT                = 5249\n\tSYS_FCHOWNAT               = 5250\n\tSYS_FUTIMESAT              = 5251\n\tSYS_NEWFSTATAT             = 5252\n\tSYS_UNLINKAT               = 5253\n\tSYS_RENAMEAT               = 5254\n\tSYS_LINKAT                 = 5255\n\tSYS_SYMLINKAT              = 5256\n\tSYS_READLINKAT             = 5257\n\tSYS_FCHMODAT               = 5258\n\tSYS_FACCESSAT              = 5259\n\tSYS_PSELECT6               = 5260\n\tSYS_PPOLL                  = 5261\n\tSYS_UNSHARE                = 5262\n\tSYS_SPLICE                 = 5263\n\tSYS_SYNC_FILE_RANGE        = 5264\n\tSYS_TEE                    = 5265\n\tSYS_VMSPLICE               = 5266\n\tSYS_MOVE_PAGES             = 5267\n\tSYS_SET_ROBUST_LIST        = 5268\n\tSYS_GET_ROBUST_LIST        = 5269\n\tSYS_KEXEC_LOAD             = 5270\n\tSYS_GETCPU                 = 5271\n\tSYS_EPOLL_PWAIT            = 5272\n\tSYS_IOPRIO_SET             = 5273\n\tSYS_IOPRIO_GET             = 5274\n\tSYS_UTIMENSAT              = 5275\n\tSYS_SIGNALFD               = 5276\n\tSYS_TIMERFD                = 5277\n\tSYS_EVENTFD                = 5278\n\tSYS_FALLOCATE              = 5279\n\tSYS_TIMERFD_CREATE         = 5280\n\tSYS_TIMERFD_GETTIME        = 5281\n\tSYS_TIMERFD_SETTIME        = 5282\n\tSYS_SIGNALFD4              = 5283\n\tSYS_EVENTFD2               = 5284\n\tSYS_EPOLL_CREATE1          = 5285\n\tSYS_DUP3                   = 5286\n\tSYS_PIPE2                  = 5287\n\tSYS_INOTIFY_INIT1          = 5288\n\tSYS_PREADV                 = 5289\n\tSYS_PWRITEV                = 5290\n\tSYS_RT_TGSIGQUEUEINFO      = 5291\n\tSYS_PERF_EVENT_OPEN        = 5292\n\tSYS_ACCEPT4                = 5293\n\tSYS_RECVMMSG               = 5294\n\tSYS_FANOTIFY_INIT          = 5295\n\tSYS_FANOTIFY_MARK          = 5296\n\tSYS_PRLIMIT64              = 5297\n\tSYS_NAME_TO_HANDLE_AT      = 5298\n\tSYS_OPEN_BY_HANDLE_AT      = 5299\n\tSYS_CLOCK_ADJTIME          = 5300\n\tSYS_SYNCFS                 = 5301\n\tSYS_SENDMMSG               = 5302\n\tSYS_SETNS                  = 5303\n\tSYS_PROCESS_VM_READV       = 5304\n\tSYS_PROCESS_VM_WRITEV      = 5305\n\tSYS_KCMP                   = 5306\n\tSYS_FINIT_MODULE           = 5307\n\tSYS_GETDENTS64             = 5308\n\tSYS_SCHED_SETATTR          = 5309\n\tSYS_SCHED_GETATTR          = 5310\n\tSYS_RENAMEAT2              = 5311\n\tSYS_SECCOMP                = 5312\n\tSYS_GETRANDOM              = 5313\n\tSYS_MEMFD_CREATE           = 5314\n\tSYS_BPF                    = 5315\n\tSYS_EXECVEAT               = 5316\n\tSYS_USERFAULTFD            = 5317\n\tSYS_MEMBARRIER             = 5318\n\tSYS_MLOCK2                 = 5319\n\tSYS_COPY_FILE_RANGE        = 5320\n\tSYS_PREADV2                = 5321\n\tSYS_PWRITEV2               = 5322\n\tSYS_PKEY_MPROTECT          = 5323\n\tSYS_PKEY_ALLOC             = 5324\n\tSYS_PKEY_FREE              = 5325\n\tSYS_STATX                  = 5326\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips64le,linux\n\npackage unix\n\nconst (\n\tSYS_READ                   = 5000\n\tSYS_WRITE                  = 5001\n\tSYS_OPEN                   = 5002\n\tSYS_CLOSE                  = 5003\n\tSYS_STAT                   = 5004\n\tSYS_FSTAT                  = 5005\n\tSYS_LSTAT                  = 5006\n\tSYS_POLL                   = 5007\n\tSYS_LSEEK                  = 5008\n\tSYS_MMAP                   = 5009\n\tSYS_MPROTECT               = 5010\n\tSYS_MUNMAP                 = 5011\n\tSYS_BRK                    = 5012\n\tSYS_RT_SIGACTION           = 5013\n\tSYS_RT_SIGPROCMASK         = 5014\n\tSYS_IOCTL                  = 5015\n\tSYS_PREAD64                = 5016\n\tSYS_PWRITE64               = 5017\n\tSYS_READV                  = 5018\n\tSYS_WRITEV                 = 5019\n\tSYS_ACCESS                 = 5020\n\tSYS_PIPE                   = 5021\n\tSYS__NEWSELECT             = 5022\n\tSYS_SCHED_YIELD            = 5023\n\tSYS_MREMAP                 = 5024\n\tSYS_MSYNC                  = 5025\n\tSYS_MINCORE                = 5026\n\tSYS_MADVISE                = 5027\n\tSYS_SHMGET                 = 5028\n\tSYS_SHMAT                  = 5029\n\tSYS_SHMCTL                 = 5030\n\tSYS_DUP                    = 5031\n\tSYS_DUP2                   = 5032\n\tSYS_PAUSE                  = 5033\n\tSYS_NANOSLEEP              = 5034\n\tSYS_GETITIMER              = 5035\n\tSYS_SETITIMER              = 5036\n\tSYS_ALARM                  = 5037\n\tSYS_GETPID                 = 5038\n\tSYS_SENDFILE               = 5039\n\tSYS_SOCKET                 = 5040\n\tSYS_CONNECT                = 5041\n\tSYS_ACCEPT                 = 5042\n\tSYS_SENDTO                 = 5043\n\tSYS_RECVFROM               = 5044\n\tSYS_SENDMSG                = 5045\n\tSYS_RECVMSG                = 5046\n\tSYS_SHUTDOWN               = 5047\n\tSYS_BIND                   = 5048\n\tSYS_LISTEN                 = 5049\n\tSYS_GETSOCKNAME            = 5050\n\tSYS_GETPEERNAME            = 5051\n\tSYS_SOCKETPAIR             = 5052\n\tSYS_SETSOCKOPT             = 5053\n\tSYS_GETSOCKOPT             = 5054\n\tSYS_CLONE                  = 5055\n\tSYS_FORK                   = 5056\n\tSYS_EXECVE                 = 5057\n\tSYS_EXIT                   = 5058\n\tSYS_WAIT4                  = 5059\n\tSYS_KILL                   = 5060\n\tSYS_UNAME                  = 5061\n\tSYS_SEMGET                 = 5062\n\tSYS_SEMOP                  = 5063\n\tSYS_SEMCTL                 = 5064\n\tSYS_SHMDT                  = 5065\n\tSYS_MSGGET                 = 5066\n\tSYS_MSGSND                 = 5067\n\tSYS_MSGRCV                 = 5068\n\tSYS_MSGCTL                 = 5069\n\tSYS_FCNTL                  = 5070\n\tSYS_FLOCK                  = 5071\n\tSYS_FSYNC                  = 5072\n\tSYS_FDATASYNC              = 5073\n\tSYS_TRUNCATE               = 5074\n\tSYS_FTRUNCATE              = 5075\n\tSYS_GETDENTS               = 5076\n\tSYS_GETCWD                 = 5077\n\tSYS_CHDIR                  = 5078\n\tSYS_FCHDIR                 = 5079\n\tSYS_RENAME                 = 5080\n\tSYS_MKDIR                  = 5081\n\tSYS_RMDIR                  = 5082\n\tSYS_CREAT                  = 5083\n\tSYS_LINK                   = 5084\n\tSYS_UNLINK                 = 5085\n\tSYS_SYMLINK                = 5086\n\tSYS_READLINK               = 5087\n\tSYS_CHMOD                  = 5088\n\tSYS_FCHMOD                 = 5089\n\tSYS_CHOWN                  = 5090\n\tSYS_FCHOWN                 = 5091\n\tSYS_LCHOWN                 = 5092\n\tSYS_UMASK                  = 5093\n\tSYS_GETTIMEOFDAY           = 5094\n\tSYS_GETRLIMIT              = 5095\n\tSYS_GETRUSAGE              = 5096\n\tSYS_SYSINFO                = 5097\n\tSYS_TIMES                  = 5098\n\tSYS_PTRACE                 = 5099\n\tSYS_GETUID                 = 5100\n\tSYS_SYSLOG                 = 5101\n\tSYS_GETGID                 = 5102\n\tSYS_SETUID                 = 5103\n\tSYS_SETGID                 = 5104\n\tSYS_GETEUID                = 5105\n\tSYS_GETEGID                = 5106\n\tSYS_SETPGID                = 5107\n\tSYS_GETPPID                = 5108\n\tSYS_GETPGRP                = 5109\n\tSYS_SETSID                 = 5110\n\tSYS_SETREUID               = 5111\n\tSYS_SETREGID               = 5112\n\tSYS_GETGROUPS              = 5113\n\tSYS_SETGROUPS              = 5114\n\tSYS_SETRESUID              = 5115\n\tSYS_GETRESUID              = 5116\n\tSYS_SETRESGID              = 5117\n\tSYS_GETRESGID              = 5118\n\tSYS_GETPGID                = 5119\n\tSYS_SETFSUID               = 5120\n\tSYS_SETFSGID               = 5121\n\tSYS_GETSID                 = 5122\n\tSYS_CAPGET                 = 5123\n\tSYS_CAPSET                 = 5124\n\tSYS_RT_SIGPENDING          = 5125\n\tSYS_RT_SIGTIMEDWAIT        = 5126\n\tSYS_RT_SIGQUEUEINFO        = 5127\n\tSYS_RT_SIGSUSPEND          = 5128\n\tSYS_SIGALTSTACK            = 5129\n\tSYS_UTIME                  = 5130\n\tSYS_MKNOD                  = 5131\n\tSYS_PERSONALITY            = 5132\n\tSYS_USTAT                  = 5133\n\tSYS_STATFS                 = 5134\n\tSYS_FSTATFS                = 5135\n\tSYS_SYSFS                  = 5136\n\tSYS_GETPRIORITY            = 5137\n\tSYS_SETPRIORITY            = 5138\n\tSYS_SCHED_SETPARAM         = 5139\n\tSYS_SCHED_GETPARAM         = 5140\n\tSYS_SCHED_SETSCHEDULER     = 5141\n\tSYS_SCHED_GETSCHEDULER     = 5142\n\tSYS_SCHED_GET_PRIORITY_MAX = 5143\n\tSYS_SCHED_GET_PRIORITY_MIN = 5144\n\tSYS_SCHED_RR_GET_INTERVAL  = 5145\n\tSYS_MLOCK                  = 5146\n\tSYS_MUNLOCK                = 5147\n\tSYS_MLOCKALL               = 5148\n\tSYS_MUNLOCKALL             = 5149\n\tSYS_VHANGUP                = 5150\n\tSYS_PIVOT_ROOT             = 5151\n\tSYS__SYSCTL                = 5152\n\tSYS_PRCTL                  = 5153\n\tSYS_ADJTIMEX               = 5154\n\tSYS_SETRLIMIT              = 5155\n\tSYS_CHROOT                 = 5156\n\tSYS_SYNC                   = 5157\n\tSYS_ACCT                   = 5158\n\tSYS_SETTIMEOFDAY           = 5159\n\tSYS_MOUNT                  = 5160\n\tSYS_UMOUNT2                = 5161\n\tSYS_SWAPON                 = 5162\n\tSYS_SWAPOFF                = 5163\n\tSYS_REBOOT                 = 5164\n\tSYS_SETHOSTNAME            = 5165\n\tSYS_SETDOMAINNAME          = 5166\n\tSYS_CREATE_MODULE          = 5167\n\tSYS_INIT_MODULE            = 5168\n\tSYS_DELETE_MODULE          = 5169\n\tSYS_GET_KERNEL_SYMS        = 5170\n\tSYS_QUERY_MODULE           = 5171\n\tSYS_QUOTACTL               = 5172\n\tSYS_NFSSERVCTL             = 5173\n\tSYS_GETPMSG                = 5174\n\tSYS_PUTPMSG                = 5175\n\tSYS_AFS_SYSCALL            = 5176\n\tSYS_RESERVED177            = 5177\n\tSYS_GETTID                 = 5178\n\tSYS_READAHEAD              = 5179\n\tSYS_SETXATTR               = 5180\n\tSYS_LSETXATTR              = 5181\n\tSYS_FSETXATTR              = 5182\n\tSYS_GETXATTR               = 5183\n\tSYS_LGETXATTR              = 5184\n\tSYS_FGETXATTR              = 5185\n\tSYS_LISTXATTR              = 5186\n\tSYS_LLISTXATTR             = 5187\n\tSYS_FLISTXATTR             = 5188\n\tSYS_REMOVEXATTR            = 5189\n\tSYS_LREMOVEXATTR           = 5190\n\tSYS_FREMOVEXATTR           = 5191\n\tSYS_TKILL                  = 5192\n\tSYS_RESERVED193            = 5193\n\tSYS_FUTEX                  = 5194\n\tSYS_SCHED_SETAFFINITY      = 5195\n\tSYS_SCHED_GETAFFINITY      = 5196\n\tSYS_CACHEFLUSH             = 5197\n\tSYS_CACHECTL               = 5198\n\tSYS_SYSMIPS                = 5199\n\tSYS_IO_SETUP               = 5200\n\tSYS_IO_DESTROY             = 5201\n\tSYS_IO_GETEVENTS           = 5202\n\tSYS_IO_SUBMIT              = 5203\n\tSYS_IO_CANCEL              = 5204\n\tSYS_EXIT_GROUP             = 5205\n\tSYS_LOOKUP_DCOOKIE         = 5206\n\tSYS_EPOLL_CREATE           = 5207\n\tSYS_EPOLL_CTL              = 5208\n\tSYS_EPOLL_WAIT             = 5209\n\tSYS_REMAP_FILE_PAGES       = 5210\n\tSYS_RT_SIGRETURN           = 5211\n\tSYS_SET_TID_ADDRESS        = 5212\n\tSYS_RESTART_SYSCALL        = 5213\n\tSYS_SEMTIMEDOP             = 5214\n\tSYS_FADVISE64              = 5215\n\tSYS_TIMER_CREATE           = 5216\n\tSYS_TIMER_SETTIME          = 5217\n\tSYS_TIMER_GETTIME          = 5218\n\tSYS_TIMER_GETOVERRUN       = 5219\n\tSYS_TIMER_DELETE           = 5220\n\tSYS_CLOCK_SETTIME          = 5221\n\tSYS_CLOCK_GETTIME          = 5222\n\tSYS_CLOCK_GETRES           = 5223\n\tSYS_CLOCK_NANOSLEEP        = 5224\n\tSYS_TGKILL                 = 5225\n\tSYS_UTIMES                 = 5226\n\tSYS_MBIND                  = 5227\n\tSYS_GET_MEMPOLICY          = 5228\n\tSYS_SET_MEMPOLICY          = 5229\n\tSYS_MQ_OPEN                = 5230\n\tSYS_MQ_UNLINK              = 5231\n\tSYS_MQ_TIMEDSEND           = 5232\n\tSYS_MQ_TIMEDRECEIVE        = 5233\n\tSYS_MQ_NOTIFY              = 5234\n\tSYS_MQ_GETSETATTR          = 5235\n\tSYS_VSERVER                = 5236\n\tSYS_WAITID                 = 5237\n\tSYS_ADD_KEY                = 5239\n\tSYS_REQUEST_KEY            = 5240\n\tSYS_KEYCTL                 = 5241\n\tSYS_SET_THREAD_AREA        = 5242\n\tSYS_INOTIFY_INIT           = 5243\n\tSYS_INOTIFY_ADD_WATCH      = 5244\n\tSYS_INOTIFY_RM_WATCH       = 5245\n\tSYS_MIGRATE_PAGES          = 5246\n\tSYS_OPENAT                 = 5247\n\tSYS_MKDIRAT                = 5248\n\tSYS_MKNODAT                = 5249\n\tSYS_FCHOWNAT               = 5250\n\tSYS_FUTIMESAT              = 5251\n\tSYS_NEWFSTATAT             = 5252\n\tSYS_UNLINKAT               = 5253\n\tSYS_RENAMEAT               = 5254\n\tSYS_LINKAT                 = 5255\n\tSYS_SYMLINKAT              = 5256\n\tSYS_READLINKAT             = 5257\n\tSYS_FCHMODAT               = 5258\n\tSYS_FACCESSAT              = 5259\n\tSYS_PSELECT6               = 5260\n\tSYS_PPOLL                  = 5261\n\tSYS_UNSHARE                = 5262\n\tSYS_SPLICE                 = 5263\n\tSYS_SYNC_FILE_RANGE        = 5264\n\tSYS_TEE                    = 5265\n\tSYS_VMSPLICE               = 5266\n\tSYS_MOVE_PAGES             = 5267\n\tSYS_SET_ROBUST_LIST        = 5268\n\tSYS_GET_ROBUST_LIST        = 5269\n\tSYS_KEXEC_LOAD             = 5270\n\tSYS_GETCPU                 = 5271\n\tSYS_EPOLL_PWAIT            = 5272\n\tSYS_IOPRIO_SET             = 5273\n\tSYS_IOPRIO_GET             = 5274\n\tSYS_UTIMENSAT              = 5275\n\tSYS_SIGNALFD               = 5276\n\tSYS_TIMERFD                = 5277\n\tSYS_EVENTFD                = 5278\n\tSYS_FALLOCATE              = 5279\n\tSYS_TIMERFD_CREATE         = 5280\n\tSYS_TIMERFD_GETTIME        = 5281\n\tSYS_TIMERFD_SETTIME        = 5282\n\tSYS_SIGNALFD4              = 5283\n\tSYS_EVENTFD2               = 5284\n\tSYS_EPOLL_CREATE1          = 5285\n\tSYS_DUP3                   = 5286\n\tSYS_PIPE2                  = 5287\n\tSYS_INOTIFY_INIT1          = 5288\n\tSYS_PREADV                 = 5289\n\tSYS_PWRITEV                = 5290\n\tSYS_RT_TGSIGQUEUEINFO      = 5291\n\tSYS_PERF_EVENT_OPEN        = 5292\n\tSYS_ACCEPT4                = 5293\n\tSYS_RECVMMSG               = 5294\n\tSYS_FANOTIFY_INIT          = 5295\n\tSYS_FANOTIFY_MARK          = 5296\n\tSYS_PRLIMIT64              = 5297\n\tSYS_NAME_TO_HANDLE_AT      = 5298\n\tSYS_OPEN_BY_HANDLE_AT      = 5299\n\tSYS_CLOCK_ADJTIME          = 5300\n\tSYS_SYNCFS                 = 5301\n\tSYS_SENDMMSG               = 5302\n\tSYS_SETNS                  = 5303\n\tSYS_PROCESS_VM_READV       = 5304\n\tSYS_PROCESS_VM_WRITEV      = 5305\n\tSYS_KCMP                   = 5306\n\tSYS_FINIT_MODULE           = 5307\n\tSYS_GETDENTS64             = 5308\n\tSYS_SCHED_SETATTR          = 5309\n\tSYS_SCHED_GETATTR          = 5310\n\tSYS_RENAMEAT2              = 5311\n\tSYS_SECCOMP                = 5312\n\tSYS_GETRANDOM              = 5313\n\tSYS_MEMFD_CREATE           = 5314\n\tSYS_BPF                    = 5315\n\tSYS_EXECVEAT               = 5316\n\tSYS_USERFAULTFD            = 5317\n\tSYS_MEMBARRIER             = 5318\n\tSYS_MLOCK2                 = 5319\n\tSYS_COPY_FILE_RANGE        = 5320\n\tSYS_PREADV2                = 5321\n\tSYS_PWRITEV2               = 5322\n\tSYS_PKEY_MPROTECT          = 5323\n\tSYS_PKEY_ALLOC             = 5324\n\tSYS_PKEY_FREE              = 5325\n\tSYS_STATX                  = 5326\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mipsle,linux\n\npackage unix\n\nconst (\n\tSYS_SYSCALL                = 4000\n\tSYS_EXIT                   = 4001\n\tSYS_FORK                   = 4002\n\tSYS_READ                   = 4003\n\tSYS_WRITE                  = 4004\n\tSYS_OPEN                   = 4005\n\tSYS_CLOSE                  = 4006\n\tSYS_WAITPID                = 4007\n\tSYS_CREAT                  = 4008\n\tSYS_LINK                   = 4009\n\tSYS_UNLINK                 = 4010\n\tSYS_EXECVE                 = 4011\n\tSYS_CHDIR                  = 4012\n\tSYS_TIME                   = 4013\n\tSYS_MKNOD                  = 4014\n\tSYS_CHMOD                  = 4015\n\tSYS_LCHOWN                 = 4016\n\tSYS_BREAK                  = 4017\n\tSYS_UNUSED18               = 4018\n\tSYS_LSEEK                  = 4019\n\tSYS_GETPID                 = 4020\n\tSYS_MOUNT                  = 4021\n\tSYS_UMOUNT                 = 4022\n\tSYS_SETUID                 = 4023\n\tSYS_GETUID                 = 4024\n\tSYS_STIME                  = 4025\n\tSYS_PTRACE                 = 4026\n\tSYS_ALARM                  = 4027\n\tSYS_UNUSED28               = 4028\n\tSYS_PAUSE                  = 4029\n\tSYS_UTIME                  = 4030\n\tSYS_STTY                   = 4031\n\tSYS_GTTY                   = 4032\n\tSYS_ACCESS                 = 4033\n\tSYS_NICE                   = 4034\n\tSYS_FTIME                  = 4035\n\tSYS_SYNC                   = 4036\n\tSYS_KILL                   = 4037\n\tSYS_RENAME                 = 4038\n\tSYS_MKDIR                  = 4039\n\tSYS_RMDIR                  = 4040\n\tSYS_DUP                    = 4041\n\tSYS_PIPE                   = 4042\n\tSYS_TIMES                  = 4043\n\tSYS_PROF                   = 4044\n\tSYS_BRK                    = 4045\n\tSYS_SETGID                 = 4046\n\tSYS_GETGID                 = 4047\n\tSYS_SIGNAL                 = 4048\n\tSYS_GETEUID                = 4049\n\tSYS_GETEGID                = 4050\n\tSYS_ACCT                   = 4051\n\tSYS_UMOUNT2                = 4052\n\tSYS_LOCK                   = 4053\n\tSYS_IOCTL                  = 4054\n\tSYS_FCNTL                  = 4055\n\tSYS_MPX                    = 4056\n\tSYS_SETPGID                = 4057\n\tSYS_ULIMIT                 = 4058\n\tSYS_UNUSED59               = 4059\n\tSYS_UMASK                  = 4060\n\tSYS_CHROOT                 = 4061\n\tSYS_USTAT                  = 4062\n\tSYS_DUP2                   = 4063\n\tSYS_GETPPID                = 4064\n\tSYS_GETPGRP                = 4065\n\tSYS_SETSID                 = 4066\n\tSYS_SIGACTION              = 4067\n\tSYS_SGETMASK               = 4068\n\tSYS_SSETMASK               = 4069\n\tSYS_SETREUID               = 4070\n\tSYS_SETREGID               = 4071\n\tSYS_SIGSUSPEND             = 4072\n\tSYS_SIGPENDING             = 4073\n\tSYS_SETHOSTNAME            = 4074\n\tSYS_SETRLIMIT              = 4075\n\tSYS_GETRLIMIT              = 4076\n\tSYS_GETRUSAGE              = 4077\n\tSYS_GETTIMEOFDAY           = 4078\n\tSYS_SETTIMEOFDAY           = 4079\n\tSYS_GETGROUPS              = 4080\n\tSYS_SETGROUPS              = 4081\n\tSYS_RESERVED82             = 4082\n\tSYS_SYMLINK                = 4083\n\tSYS_UNUSED84               = 4084\n\tSYS_READLINK               = 4085\n\tSYS_USELIB                 = 4086\n\tSYS_SWAPON                 = 4087\n\tSYS_REBOOT                 = 4088\n\tSYS_READDIR                = 4089\n\tSYS_MMAP                   = 4090\n\tSYS_MUNMAP                 = 4091\n\tSYS_TRUNCATE               = 4092\n\tSYS_FTRUNCATE              = 4093\n\tSYS_FCHMOD                 = 4094\n\tSYS_FCHOWN                 = 4095\n\tSYS_GETPRIORITY            = 4096\n\tSYS_SETPRIORITY            = 4097\n\tSYS_PROFIL                 = 4098\n\tSYS_STATFS                 = 4099\n\tSYS_FSTATFS                = 4100\n\tSYS_IOPERM                 = 4101\n\tSYS_SOCKETCALL             = 4102\n\tSYS_SYSLOG                 = 4103\n\tSYS_SETITIMER              = 4104\n\tSYS_GETITIMER              = 4105\n\tSYS_STAT                   = 4106\n\tSYS_LSTAT                  = 4107\n\tSYS_FSTAT                  = 4108\n\tSYS_UNUSED109              = 4109\n\tSYS_IOPL                   = 4110\n\tSYS_VHANGUP                = 4111\n\tSYS_IDLE                   = 4112\n\tSYS_VM86                   = 4113\n\tSYS_WAIT4                  = 4114\n\tSYS_SWAPOFF                = 4115\n\tSYS_SYSINFO                = 4116\n\tSYS_IPC                    = 4117\n\tSYS_FSYNC                  = 4118\n\tSYS_SIGRETURN              = 4119\n\tSYS_CLONE                  = 4120\n\tSYS_SETDOMAINNAME          = 4121\n\tSYS_UNAME                  = 4122\n\tSYS_MODIFY_LDT             = 4123\n\tSYS_ADJTIMEX               = 4124\n\tSYS_MPROTECT               = 4125\n\tSYS_SIGPROCMASK            = 4126\n\tSYS_CREATE_MODULE          = 4127\n\tSYS_INIT_MODULE            = 4128\n\tSYS_DELETE_MODULE          = 4129\n\tSYS_GET_KERNEL_SYMS        = 4130\n\tSYS_QUOTACTL               = 4131\n\tSYS_GETPGID                = 4132\n\tSYS_FCHDIR                 = 4133\n\tSYS_BDFLUSH                = 4134\n\tSYS_SYSFS                  = 4135\n\tSYS_PERSONALITY            = 4136\n\tSYS_AFS_SYSCALL            = 4137\n\tSYS_SETFSUID               = 4138\n\tSYS_SETFSGID               = 4139\n\tSYS__LLSEEK                = 4140\n\tSYS_GETDENTS               = 4141\n\tSYS__NEWSELECT             = 4142\n\tSYS_FLOCK                  = 4143\n\tSYS_MSYNC                  = 4144\n\tSYS_READV                  = 4145\n\tSYS_WRITEV                 = 4146\n\tSYS_CACHEFLUSH             = 4147\n\tSYS_CACHECTL               = 4148\n\tSYS_SYSMIPS                = 4149\n\tSYS_UNUSED150              = 4150\n\tSYS_GETSID                 = 4151\n\tSYS_FDATASYNC              = 4152\n\tSYS__SYSCTL                = 4153\n\tSYS_MLOCK                  = 4154\n\tSYS_MUNLOCK                = 4155\n\tSYS_MLOCKALL               = 4156\n\tSYS_MUNLOCKALL             = 4157\n\tSYS_SCHED_SETPARAM         = 4158\n\tSYS_SCHED_GETPARAM         = 4159\n\tSYS_SCHED_SETSCHEDULER     = 4160\n\tSYS_SCHED_GETSCHEDULER     = 4161\n\tSYS_SCHED_YIELD            = 4162\n\tSYS_SCHED_GET_PRIORITY_MAX = 4163\n\tSYS_SCHED_GET_PRIORITY_MIN = 4164\n\tSYS_SCHED_RR_GET_INTERVAL  = 4165\n\tSYS_NANOSLEEP              = 4166\n\tSYS_MREMAP                 = 4167\n\tSYS_ACCEPT                 = 4168\n\tSYS_BIND                   = 4169\n\tSYS_CONNECT                = 4170\n\tSYS_GETPEERNAME            = 4171\n\tSYS_GETSOCKNAME            = 4172\n\tSYS_GETSOCKOPT             = 4173\n\tSYS_LISTEN                 = 4174\n\tSYS_RECV                   = 4175\n\tSYS_RECVFROM               = 4176\n\tSYS_RECVMSG                = 4177\n\tSYS_SEND                   = 4178\n\tSYS_SENDMSG                = 4179\n\tSYS_SENDTO                 = 4180\n\tSYS_SETSOCKOPT             = 4181\n\tSYS_SHUTDOWN               = 4182\n\tSYS_SOCKET                 = 4183\n\tSYS_SOCKETPAIR             = 4184\n\tSYS_SETRESUID              = 4185\n\tSYS_GETRESUID              = 4186\n\tSYS_QUERY_MODULE           = 4187\n\tSYS_POLL                   = 4188\n\tSYS_NFSSERVCTL             = 4189\n\tSYS_SETRESGID              = 4190\n\tSYS_GETRESGID              = 4191\n\tSYS_PRCTL                  = 4192\n\tSYS_RT_SIGRETURN           = 4193\n\tSYS_RT_SIGACTION           = 4194\n\tSYS_RT_SIGPROCMASK         = 4195\n\tSYS_RT_SIGPENDING          = 4196\n\tSYS_RT_SIGTIMEDWAIT        = 4197\n\tSYS_RT_SIGQUEUEINFO        = 4198\n\tSYS_RT_SIGSUSPEND          = 4199\n\tSYS_PREAD64                = 4200\n\tSYS_PWRITE64               = 4201\n\tSYS_CHOWN                  = 4202\n\tSYS_GETCWD                 = 4203\n\tSYS_CAPGET                 = 4204\n\tSYS_CAPSET                 = 4205\n\tSYS_SIGALTSTACK            = 4206\n\tSYS_SENDFILE               = 4207\n\tSYS_GETPMSG                = 4208\n\tSYS_PUTPMSG                = 4209\n\tSYS_MMAP2                  = 4210\n\tSYS_TRUNCATE64             = 4211\n\tSYS_FTRUNCATE64            = 4212\n\tSYS_STAT64                 = 4213\n\tSYS_LSTAT64                = 4214\n\tSYS_FSTAT64                = 4215\n\tSYS_PIVOT_ROOT             = 4216\n\tSYS_MINCORE                = 4217\n\tSYS_MADVISE                = 4218\n\tSYS_GETDENTS64             = 4219\n\tSYS_FCNTL64                = 4220\n\tSYS_RESERVED221            = 4221\n\tSYS_GETTID                 = 4222\n\tSYS_READAHEAD              = 4223\n\tSYS_SETXATTR               = 4224\n\tSYS_LSETXATTR              = 4225\n\tSYS_FSETXATTR              = 4226\n\tSYS_GETXATTR               = 4227\n\tSYS_LGETXATTR              = 4228\n\tSYS_FGETXATTR              = 4229\n\tSYS_LISTXATTR              = 4230\n\tSYS_LLISTXATTR             = 4231\n\tSYS_FLISTXATTR             = 4232\n\tSYS_REMOVEXATTR            = 4233\n\tSYS_LREMOVEXATTR           = 4234\n\tSYS_FREMOVEXATTR           = 4235\n\tSYS_TKILL                  = 4236\n\tSYS_SENDFILE64             = 4237\n\tSYS_FUTEX                  = 4238\n\tSYS_SCHED_SETAFFINITY      = 4239\n\tSYS_SCHED_GETAFFINITY      = 4240\n\tSYS_IO_SETUP               = 4241\n\tSYS_IO_DESTROY             = 4242\n\tSYS_IO_GETEVENTS           = 4243\n\tSYS_IO_SUBMIT              = 4244\n\tSYS_IO_CANCEL              = 4245\n\tSYS_EXIT_GROUP             = 4246\n\tSYS_LOOKUP_DCOOKIE         = 4247\n\tSYS_EPOLL_CREATE           = 4248\n\tSYS_EPOLL_CTL              = 4249\n\tSYS_EPOLL_WAIT             = 4250\n\tSYS_REMAP_FILE_PAGES       = 4251\n\tSYS_SET_TID_ADDRESS        = 4252\n\tSYS_RESTART_SYSCALL        = 4253\n\tSYS_FADVISE64              = 4254\n\tSYS_STATFS64               = 4255\n\tSYS_FSTATFS64              = 4256\n\tSYS_TIMER_CREATE           = 4257\n\tSYS_TIMER_SETTIME          = 4258\n\tSYS_TIMER_GETTIME          = 4259\n\tSYS_TIMER_GETOVERRUN       = 4260\n\tSYS_TIMER_DELETE           = 4261\n\tSYS_CLOCK_SETTIME          = 4262\n\tSYS_CLOCK_GETTIME          = 4263\n\tSYS_CLOCK_GETRES           = 4264\n\tSYS_CLOCK_NANOSLEEP        = 4265\n\tSYS_TGKILL                 = 4266\n\tSYS_UTIMES                 = 4267\n\tSYS_MBIND                  = 4268\n\tSYS_GET_MEMPOLICY          = 4269\n\tSYS_SET_MEMPOLICY          = 4270\n\tSYS_MQ_OPEN                = 4271\n\tSYS_MQ_UNLINK              = 4272\n\tSYS_MQ_TIMEDSEND           = 4273\n\tSYS_MQ_TIMEDRECEIVE        = 4274\n\tSYS_MQ_NOTIFY              = 4275\n\tSYS_MQ_GETSETATTR          = 4276\n\tSYS_VSERVER                = 4277\n\tSYS_WAITID                 = 4278\n\tSYS_ADD_KEY                = 4280\n\tSYS_REQUEST_KEY            = 4281\n\tSYS_KEYCTL                 = 4282\n\tSYS_SET_THREAD_AREA        = 4283\n\tSYS_INOTIFY_INIT           = 4284\n\tSYS_INOTIFY_ADD_WATCH      = 4285\n\tSYS_INOTIFY_RM_WATCH       = 4286\n\tSYS_MIGRATE_PAGES          = 4287\n\tSYS_OPENAT                 = 4288\n\tSYS_MKDIRAT                = 4289\n\tSYS_MKNODAT                = 4290\n\tSYS_FCHOWNAT               = 4291\n\tSYS_FUTIMESAT              = 4292\n\tSYS_FSTATAT64              = 4293\n\tSYS_UNLINKAT               = 4294\n\tSYS_RENAMEAT               = 4295\n\tSYS_LINKAT                 = 4296\n\tSYS_SYMLINKAT              = 4297\n\tSYS_READLINKAT             = 4298\n\tSYS_FCHMODAT               = 4299\n\tSYS_FACCESSAT              = 4300\n\tSYS_PSELECT6               = 4301\n\tSYS_PPOLL                  = 4302\n\tSYS_UNSHARE                = 4303\n\tSYS_SPLICE                 = 4304\n\tSYS_SYNC_FILE_RANGE        = 4305\n\tSYS_TEE                    = 4306\n\tSYS_VMSPLICE               = 4307\n\tSYS_MOVE_PAGES             = 4308\n\tSYS_SET_ROBUST_LIST        = 4309\n\tSYS_GET_ROBUST_LIST        = 4310\n\tSYS_KEXEC_LOAD             = 4311\n\tSYS_GETCPU                 = 4312\n\tSYS_EPOLL_PWAIT            = 4313\n\tSYS_IOPRIO_SET             = 4314\n\tSYS_IOPRIO_GET             = 4315\n\tSYS_UTIMENSAT              = 4316\n\tSYS_SIGNALFD               = 4317\n\tSYS_TIMERFD                = 4318\n\tSYS_EVENTFD                = 4319\n\tSYS_FALLOCATE              = 4320\n\tSYS_TIMERFD_CREATE         = 4321\n\tSYS_TIMERFD_GETTIME        = 4322\n\tSYS_TIMERFD_SETTIME        = 4323\n\tSYS_SIGNALFD4              = 4324\n\tSYS_EVENTFD2               = 4325\n\tSYS_EPOLL_CREATE1          = 4326\n\tSYS_DUP3                   = 4327\n\tSYS_PIPE2                  = 4328\n\tSYS_INOTIFY_INIT1          = 4329\n\tSYS_PREADV                 = 4330\n\tSYS_PWRITEV                = 4331\n\tSYS_RT_TGSIGQUEUEINFO      = 4332\n\tSYS_PERF_EVENT_OPEN        = 4333\n\tSYS_ACCEPT4                = 4334\n\tSYS_RECVMMSG               = 4335\n\tSYS_FANOTIFY_INIT          = 4336\n\tSYS_FANOTIFY_MARK          = 4337\n\tSYS_PRLIMIT64              = 4338\n\tSYS_NAME_TO_HANDLE_AT      = 4339\n\tSYS_OPEN_BY_HANDLE_AT      = 4340\n\tSYS_CLOCK_ADJTIME          = 4341\n\tSYS_SYNCFS                 = 4342\n\tSYS_SENDMMSG               = 4343\n\tSYS_SETNS                  = 4344\n\tSYS_PROCESS_VM_READV       = 4345\n\tSYS_PROCESS_VM_WRITEV      = 4346\n\tSYS_KCMP                   = 4347\n\tSYS_FINIT_MODULE           = 4348\n\tSYS_SCHED_SETATTR          = 4349\n\tSYS_SCHED_GETATTR          = 4350\n\tSYS_RENAMEAT2              = 4351\n\tSYS_SECCOMP                = 4352\n\tSYS_GETRANDOM              = 4353\n\tSYS_MEMFD_CREATE           = 4354\n\tSYS_BPF                    = 4355\n\tSYS_EXECVEAT               = 4356\n\tSYS_USERFAULTFD            = 4357\n\tSYS_MEMBARRIER             = 4358\n\tSYS_MLOCK2                 = 4359\n\tSYS_COPY_FILE_RANGE        = 4360\n\tSYS_PREADV2                = 4361\n\tSYS_PWRITEV2               = 4362\n\tSYS_PKEY_MPROTECT          = 4363\n\tSYS_PKEY_ALLOC             = 4364\n\tSYS_PKEY_FREE              = 4365\n\tSYS_STATX                  = 4366\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build ppc64,linux\n\npackage unix\n\nconst (\n\tSYS_RESTART_SYSCALL        = 0\n\tSYS_EXIT                   = 1\n\tSYS_FORK                   = 2\n\tSYS_READ                   = 3\n\tSYS_WRITE                  = 4\n\tSYS_OPEN                   = 5\n\tSYS_CLOSE                  = 6\n\tSYS_WAITPID                = 7\n\tSYS_CREAT                  = 8\n\tSYS_LINK                   = 9\n\tSYS_UNLINK                 = 10\n\tSYS_EXECVE                 = 11\n\tSYS_CHDIR                  = 12\n\tSYS_TIME                   = 13\n\tSYS_MKNOD                  = 14\n\tSYS_CHMOD                  = 15\n\tSYS_LCHOWN                 = 16\n\tSYS_BREAK                  = 17\n\tSYS_OLDSTAT                = 18\n\tSYS_LSEEK                  = 19\n\tSYS_GETPID                 = 20\n\tSYS_MOUNT                  = 21\n\tSYS_UMOUNT                 = 22\n\tSYS_SETUID                 = 23\n\tSYS_GETUID                 = 24\n\tSYS_STIME                  = 25\n\tSYS_PTRACE                 = 26\n\tSYS_ALARM                  = 27\n\tSYS_OLDFSTAT               = 28\n\tSYS_PAUSE                  = 29\n\tSYS_UTIME                  = 30\n\tSYS_STTY                   = 31\n\tSYS_GTTY                   = 32\n\tSYS_ACCESS                 = 33\n\tSYS_NICE                   = 34\n\tSYS_FTIME                  = 35\n\tSYS_SYNC                   = 36\n\tSYS_KILL                   = 37\n\tSYS_RENAME                 = 38\n\tSYS_MKDIR                  = 39\n\tSYS_RMDIR                  = 40\n\tSYS_DUP                    = 41\n\tSYS_PIPE                   = 42\n\tSYS_TIMES                  = 43\n\tSYS_PROF                   = 44\n\tSYS_BRK                    = 45\n\tSYS_SETGID                 = 46\n\tSYS_GETGID                 = 47\n\tSYS_SIGNAL                 = 48\n\tSYS_GETEUID                = 49\n\tSYS_GETEGID                = 50\n\tSYS_ACCT                   = 51\n\tSYS_UMOUNT2                = 52\n\tSYS_LOCK                   = 53\n\tSYS_IOCTL                  = 54\n\tSYS_FCNTL                  = 55\n\tSYS_MPX                    = 56\n\tSYS_SETPGID                = 57\n\tSYS_ULIMIT                 = 58\n\tSYS_OLDOLDUNAME            = 59\n\tSYS_UMASK                  = 60\n\tSYS_CHROOT                 = 61\n\tSYS_USTAT                  = 62\n\tSYS_DUP2                   = 63\n\tSYS_GETPPID                = 64\n\tSYS_GETPGRP                = 65\n\tSYS_SETSID                 = 66\n\tSYS_SIGACTION              = 67\n\tSYS_SGETMASK               = 68\n\tSYS_SSETMASK               = 69\n\tSYS_SETREUID               = 70\n\tSYS_SETREGID               = 71\n\tSYS_SIGSUSPEND             = 72\n\tSYS_SIGPENDING             = 73\n\tSYS_SETHOSTNAME            = 74\n\tSYS_SETRLIMIT              = 75\n\tSYS_GETRLIMIT              = 76\n\tSYS_GETRUSAGE              = 77\n\tSYS_GETTIMEOFDAY           = 78\n\tSYS_SETTIMEOFDAY           = 79\n\tSYS_GETGROUPS              = 80\n\tSYS_SETGROUPS              = 81\n\tSYS_SELECT                 = 82\n\tSYS_SYMLINK                = 83\n\tSYS_OLDLSTAT               = 84\n\tSYS_READLINK               = 85\n\tSYS_USELIB                 = 86\n\tSYS_SWAPON                 = 87\n\tSYS_REBOOT                 = 88\n\tSYS_READDIR                = 89\n\tSYS_MMAP                   = 90\n\tSYS_MUNMAP                 = 91\n\tSYS_TRUNCATE               = 92\n\tSYS_FTRUNCATE              = 93\n\tSYS_FCHMOD                 = 94\n\tSYS_FCHOWN                 = 95\n\tSYS_GETPRIORITY            = 96\n\tSYS_SETPRIORITY            = 97\n\tSYS_PROFIL                 = 98\n\tSYS_STATFS                 = 99\n\tSYS_FSTATFS                = 100\n\tSYS_IOPERM                 = 101\n\tSYS_SOCKETCALL             = 102\n\tSYS_SYSLOG                 = 103\n\tSYS_SETITIMER              = 104\n\tSYS_GETITIMER              = 105\n\tSYS_STAT                   = 106\n\tSYS_LSTAT                  = 107\n\tSYS_FSTAT                  = 108\n\tSYS_OLDUNAME               = 109\n\tSYS_IOPL                   = 110\n\tSYS_VHANGUP                = 111\n\tSYS_IDLE                   = 112\n\tSYS_VM86                   = 113\n\tSYS_WAIT4                  = 114\n\tSYS_SWAPOFF                = 115\n\tSYS_SYSINFO                = 116\n\tSYS_IPC                    = 117\n\tSYS_FSYNC                  = 118\n\tSYS_SIGRETURN              = 119\n\tSYS_CLONE                  = 120\n\tSYS_SETDOMAINNAME          = 121\n\tSYS_UNAME                  = 122\n\tSYS_MODIFY_LDT             = 123\n\tSYS_ADJTIMEX               = 124\n\tSYS_MPROTECT               = 125\n\tSYS_SIGPROCMASK            = 126\n\tSYS_CREATE_MODULE          = 127\n\tSYS_INIT_MODULE            = 128\n\tSYS_DELETE_MODULE          = 129\n\tSYS_GET_KERNEL_SYMS        = 130\n\tSYS_QUOTACTL               = 131\n\tSYS_GETPGID                = 132\n\tSYS_FCHDIR                 = 133\n\tSYS_BDFLUSH                = 134\n\tSYS_SYSFS                  = 135\n\tSYS_PERSONALITY            = 136\n\tSYS_AFS_SYSCALL            = 137\n\tSYS_SETFSUID               = 138\n\tSYS_SETFSGID               = 139\n\tSYS__LLSEEK                = 140\n\tSYS_GETDENTS               = 141\n\tSYS__NEWSELECT             = 142\n\tSYS_FLOCK                  = 143\n\tSYS_MSYNC                  = 144\n\tSYS_READV                  = 145\n\tSYS_WRITEV                 = 146\n\tSYS_GETSID                 = 147\n\tSYS_FDATASYNC              = 148\n\tSYS__SYSCTL                = 149\n\tSYS_MLOCK                  = 150\n\tSYS_MUNLOCK                = 151\n\tSYS_MLOCKALL               = 152\n\tSYS_MUNLOCKALL             = 153\n\tSYS_SCHED_SETPARAM         = 154\n\tSYS_SCHED_GETPARAM         = 155\n\tSYS_SCHED_SETSCHEDULER     = 156\n\tSYS_SCHED_GETSCHEDULER     = 157\n\tSYS_SCHED_YIELD            = 158\n\tSYS_SCHED_GET_PRIORITY_MAX = 159\n\tSYS_SCHED_GET_PRIORITY_MIN = 160\n\tSYS_SCHED_RR_GET_INTERVAL  = 161\n\tSYS_NANOSLEEP              = 162\n\tSYS_MREMAP                 = 163\n\tSYS_SETRESUID              = 164\n\tSYS_GETRESUID              = 165\n\tSYS_QUERY_MODULE           = 166\n\tSYS_POLL                   = 167\n\tSYS_NFSSERVCTL             = 168\n\tSYS_SETRESGID              = 169\n\tSYS_GETRESGID              = 170\n\tSYS_PRCTL                  = 171\n\tSYS_RT_SIGRETURN           = 172\n\tSYS_RT_SIGACTION           = 173\n\tSYS_RT_SIGPROCMASK         = 174\n\tSYS_RT_SIGPENDING          = 175\n\tSYS_RT_SIGTIMEDWAIT        = 176\n\tSYS_RT_SIGQUEUEINFO        = 177\n\tSYS_RT_SIGSUSPEND          = 178\n\tSYS_PREAD64                = 179\n\tSYS_PWRITE64               = 180\n\tSYS_CHOWN                  = 181\n\tSYS_GETCWD                 = 182\n\tSYS_CAPGET                 = 183\n\tSYS_CAPSET                 = 184\n\tSYS_SIGALTSTACK            = 185\n\tSYS_SENDFILE               = 186\n\tSYS_GETPMSG                = 187\n\tSYS_PUTPMSG                = 188\n\tSYS_VFORK                  = 189\n\tSYS_UGETRLIMIT             = 190\n\tSYS_READAHEAD              = 191\n\tSYS_PCICONFIG_READ         = 198\n\tSYS_PCICONFIG_WRITE        = 199\n\tSYS_PCICONFIG_IOBASE       = 200\n\tSYS_MULTIPLEXER            = 201\n\tSYS_GETDENTS64             = 202\n\tSYS_PIVOT_ROOT             = 203\n\tSYS_MADVISE                = 205\n\tSYS_MINCORE                = 206\n\tSYS_GETTID                 = 207\n\tSYS_TKILL                  = 208\n\tSYS_SETXATTR               = 209\n\tSYS_LSETXATTR              = 210\n\tSYS_FSETXATTR              = 211\n\tSYS_GETXATTR               = 212\n\tSYS_LGETXATTR              = 213\n\tSYS_FGETXATTR              = 214\n\tSYS_LISTXATTR              = 215\n\tSYS_LLISTXATTR             = 216\n\tSYS_FLISTXATTR             = 217\n\tSYS_REMOVEXATTR            = 218\n\tSYS_LREMOVEXATTR           = 219\n\tSYS_FREMOVEXATTR           = 220\n\tSYS_FUTEX                  = 221\n\tSYS_SCHED_SETAFFINITY      = 222\n\tSYS_SCHED_GETAFFINITY      = 223\n\tSYS_TUXCALL                = 225\n\tSYS_IO_SETUP               = 227\n\tSYS_IO_DESTROY             = 228\n\tSYS_IO_GETEVENTS           = 229\n\tSYS_IO_SUBMIT              = 230\n\tSYS_IO_CANCEL              = 231\n\tSYS_SET_TID_ADDRESS        = 232\n\tSYS_FADVISE64              = 233\n\tSYS_EXIT_GROUP             = 234\n\tSYS_LOOKUP_DCOOKIE         = 235\n\tSYS_EPOLL_CREATE           = 236\n\tSYS_EPOLL_CTL              = 237\n\tSYS_EPOLL_WAIT             = 238\n\tSYS_REMAP_FILE_PAGES       = 239\n\tSYS_TIMER_CREATE           = 240\n\tSYS_TIMER_SETTIME          = 241\n\tSYS_TIMER_GETTIME          = 242\n\tSYS_TIMER_GETOVERRUN       = 243\n\tSYS_TIMER_DELETE           = 244\n\tSYS_CLOCK_SETTIME          = 245\n\tSYS_CLOCK_GETTIME          = 246\n\tSYS_CLOCK_GETRES           = 247\n\tSYS_CLOCK_NANOSLEEP        = 248\n\tSYS_SWAPCONTEXT            = 249\n\tSYS_TGKILL                 = 250\n\tSYS_UTIMES                 = 251\n\tSYS_STATFS64               = 252\n\tSYS_FSTATFS64              = 253\n\tSYS_RTAS                   = 255\n\tSYS_SYS_DEBUG_SETCONTEXT   = 256\n\tSYS_MIGRATE_PAGES          = 258\n\tSYS_MBIND                  = 259\n\tSYS_GET_MEMPOLICY          = 260\n\tSYS_SET_MEMPOLICY          = 261\n\tSYS_MQ_OPEN                = 262\n\tSYS_MQ_UNLINK              = 263\n\tSYS_MQ_TIMEDSEND           = 264\n\tSYS_MQ_TIMEDRECEIVE        = 265\n\tSYS_MQ_NOTIFY              = 266\n\tSYS_MQ_GETSETATTR          = 267\n\tSYS_KEXEC_LOAD             = 268\n\tSYS_ADD_KEY                = 269\n\tSYS_REQUEST_KEY            = 270\n\tSYS_KEYCTL                 = 271\n\tSYS_WAITID                 = 272\n\tSYS_IOPRIO_SET             = 273\n\tSYS_IOPRIO_GET             = 274\n\tSYS_INOTIFY_INIT           = 275\n\tSYS_INOTIFY_ADD_WATCH      = 276\n\tSYS_INOTIFY_RM_WATCH       = 277\n\tSYS_SPU_RUN                = 278\n\tSYS_SPU_CREATE             = 279\n\tSYS_PSELECT6               = 280\n\tSYS_PPOLL                  = 281\n\tSYS_UNSHARE                = 282\n\tSYS_SPLICE                 = 283\n\tSYS_TEE                    = 284\n\tSYS_VMSPLICE               = 285\n\tSYS_OPENAT                 = 286\n\tSYS_MKDIRAT                = 287\n\tSYS_MKNODAT                = 288\n\tSYS_FCHOWNAT               = 289\n\tSYS_FUTIMESAT              = 290\n\tSYS_NEWFSTATAT             = 291\n\tSYS_UNLINKAT               = 292\n\tSYS_RENAMEAT               = 293\n\tSYS_LINKAT                 = 294\n\tSYS_SYMLINKAT              = 295\n\tSYS_READLINKAT             = 296\n\tSYS_FCHMODAT               = 297\n\tSYS_FACCESSAT              = 298\n\tSYS_GET_ROBUST_LIST        = 299\n\tSYS_SET_ROBUST_LIST        = 300\n\tSYS_MOVE_PAGES             = 301\n\tSYS_GETCPU                 = 302\n\tSYS_EPOLL_PWAIT            = 303\n\tSYS_UTIMENSAT              = 304\n\tSYS_SIGNALFD               = 305\n\tSYS_TIMERFD_CREATE         = 306\n\tSYS_EVENTFD                = 307\n\tSYS_SYNC_FILE_RANGE2       = 308\n\tSYS_FALLOCATE              = 309\n\tSYS_SUBPAGE_PROT           = 310\n\tSYS_TIMERFD_SETTIME        = 311\n\tSYS_TIMERFD_GETTIME        = 312\n\tSYS_SIGNALFD4              = 313\n\tSYS_EVENTFD2               = 314\n\tSYS_EPOLL_CREATE1          = 315\n\tSYS_DUP3                   = 316\n\tSYS_PIPE2                  = 317\n\tSYS_INOTIFY_INIT1          = 318\n\tSYS_PERF_EVENT_OPEN        = 319\n\tSYS_PREADV                 = 320\n\tSYS_PWRITEV                = 321\n\tSYS_RT_TGSIGQUEUEINFO      = 322\n\tSYS_FANOTIFY_INIT          = 323\n\tSYS_FANOTIFY_MARK          = 324\n\tSYS_PRLIMIT64              = 325\n\tSYS_SOCKET                 = 326\n\tSYS_BIND                   = 327\n\tSYS_CONNECT                = 328\n\tSYS_LISTEN                 = 329\n\tSYS_ACCEPT                 = 330\n\tSYS_GETSOCKNAME            = 331\n\tSYS_GETPEERNAME            = 332\n\tSYS_SOCKETPAIR             = 333\n\tSYS_SEND                   = 334\n\tSYS_SENDTO                 = 335\n\tSYS_RECV                   = 336\n\tSYS_RECVFROM               = 337\n\tSYS_SHUTDOWN               = 338\n\tSYS_SETSOCKOPT             = 339\n\tSYS_GETSOCKOPT             = 340\n\tSYS_SENDMSG                = 341\n\tSYS_RECVMSG                = 342\n\tSYS_RECVMMSG               = 343\n\tSYS_ACCEPT4                = 344\n\tSYS_NAME_TO_HANDLE_AT      = 345\n\tSYS_OPEN_BY_HANDLE_AT      = 346\n\tSYS_CLOCK_ADJTIME          = 347\n\tSYS_SYNCFS                 = 348\n\tSYS_SENDMMSG               = 349\n\tSYS_SETNS                  = 350\n\tSYS_PROCESS_VM_READV       = 351\n\tSYS_PROCESS_VM_WRITEV      = 352\n\tSYS_FINIT_MODULE           = 353\n\tSYS_KCMP                   = 354\n\tSYS_SCHED_SETATTR          = 355\n\tSYS_SCHED_GETATTR          = 356\n\tSYS_RENAMEAT2              = 357\n\tSYS_SECCOMP                = 358\n\tSYS_GETRANDOM              = 359\n\tSYS_MEMFD_CREATE           = 360\n\tSYS_BPF                    = 361\n\tSYS_EXECVEAT               = 362\n\tSYS_SWITCH_ENDIAN          = 363\n\tSYS_USERFAULTFD            = 364\n\tSYS_MEMBARRIER             = 365\n\tSYS_MLOCK2                 = 378\n\tSYS_COPY_FILE_RANGE        = 379\n\tSYS_PREADV2                = 380\n\tSYS_PWRITEV2               = 381\n\tSYS_KEXEC_FILE_LOAD        = 382\n\tSYS_STATX                  = 383\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build ppc64le,linux\n\npackage unix\n\nconst (\n\tSYS_RESTART_SYSCALL        = 0\n\tSYS_EXIT                   = 1\n\tSYS_FORK                   = 2\n\tSYS_READ                   = 3\n\tSYS_WRITE                  = 4\n\tSYS_OPEN                   = 5\n\tSYS_CLOSE                  = 6\n\tSYS_WAITPID                = 7\n\tSYS_CREAT                  = 8\n\tSYS_LINK                   = 9\n\tSYS_UNLINK                 = 10\n\tSYS_EXECVE                 = 11\n\tSYS_CHDIR                  = 12\n\tSYS_TIME                   = 13\n\tSYS_MKNOD                  = 14\n\tSYS_CHMOD                  = 15\n\tSYS_LCHOWN                 = 16\n\tSYS_BREAK                  = 17\n\tSYS_OLDSTAT                = 18\n\tSYS_LSEEK                  = 19\n\tSYS_GETPID                 = 20\n\tSYS_MOUNT                  = 21\n\tSYS_UMOUNT                 = 22\n\tSYS_SETUID                 = 23\n\tSYS_GETUID                 = 24\n\tSYS_STIME                  = 25\n\tSYS_PTRACE                 = 26\n\tSYS_ALARM                  = 27\n\tSYS_OLDFSTAT               = 28\n\tSYS_PAUSE                  = 29\n\tSYS_UTIME                  = 30\n\tSYS_STTY                   = 31\n\tSYS_GTTY                   = 32\n\tSYS_ACCESS                 = 33\n\tSYS_NICE                   = 34\n\tSYS_FTIME                  = 35\n\tSYS_SYNC                   = 36\n\tSYS_KILL                   = 37\n\tSYS_RENAME                 = 38\n\tSYS_MKDIR                  = 39\n\tSYS_RMDIR                  = 40\n\tSYS_DUP                    = 41\n\tSYS_PIPE                   = 42\n\tSYS_TIMES                  = 43\n\tSYS_PROF                   = 44\n\tSYS_BRK                    = 45\n\tSYS_SETGID                 = 46\n\tSYS_GETGID                 = 47\n\tSYS_SIGNAL                 = 48\n\tSYS_GETEUID                = 49\n\tSYS_GETEGID                = 50\n\tSYS_ACCT                   = 51\n\tSYS_UMOUNT2                = 52\n\tSYS_LOCK                   = 53\n\tSYS_IOCTL                  = 54\n\tSYS_FCNTL                  = 55\n\tSYS_MPX                    = 56\n\tSYS_SETPGID                = 57\n\tSYS_ULIMIT                 = 58\n\tSYS_OLDOLDUNAME            = 59\n\tSYS_UMASK                  = 60\n\tSYS_CHROOT                 = 61\n\tSYS_USTAT                  = 62\n\tSYS_DUP2                   = 63\n\tSYS_GETPPID                = 64\n\tSYS_GETPGRP                = 65\n\tSYS_SETSID                 = 66\n\tSYS_SIGACTION              = 67\n\tSYS_SGETMASK               = 68\n\tSYS_SSETMASK               = 69\n\tSYS_SETREUID               = 70\n\tSYS_SETREGID               = 71\n\tSYS_SIGSUSPEND             = 72\n\tSYS_SIGPENDING             = 73\n\tSYS_SETHOSTNAME            = 74\n\tSYS_SETRLIMIT              = 75\n\tSYS_GETRLIMIT              = 76\n\tSYS_GETRUSAGE              = 77\n\tSYS_GETTIMEOFDAY           = 78\n\tSYS_SETTIMEOFDAY           = 79\n\tSYS_GETGROUPS              = 80\n\tSYS_SETGROUPS              = 81\n\tSYS_SELECT                 = 82\n\tSYS_SYMLINK                = 83\n\tSYS_OLDLSTAT               = 84\n\tSYS_READLINK               = 85\n\tSYS_USELIB                 = 86\n\tSYS_SWAPON                 = 87\n\tSYS_REBOOT                 = 88\n\tSYS_READDIR                = 89\n\tSYS_MMAP                   = 90\n\tSYS_MUNMAP                 = 91\n\tSYS_TRUNCATE               = 92\n\tSYS_FTRUNCATE              = 93\n\tSYS_FCHMOD                 = 94\n\tSYS_FCHOWN                 = 95\n\tSYS_GETPRIORITY            = 96\n\tSYS_SETPRIORITY            = 97\n\tSYS_PROFIL                 = 98\n\tSYS_STATFS                 = 99\n\tSYS_FSTATFS                = 100\n\tSYS_IOPERM                 = 101\n\tSYS_SOCKETCALL             = 102\n\tSYS_SYSLOG                 = 103\n\tSYS_SETITIMER              = 104\n\tSYS_GETITIMER              = 105\n\tSYS_STAT                   = 106\n\tSYS_LSTAT                  = 107\n\tSYS_FSTAT                  = 108\n\tSYS_OLDUNAME               = 109\n\tSYS_IOPL                   = 110\n\tSYS_VHANGUP                = 111\n\tSYS_IDLE                   = 112\n\tSYS_VM86                   = 113\n\tSYS_WAIT4                  = 114\n\tSYS_SWAPOFF                = 115\n\tSYS_SYSINFO                = 116\n\tSYS_IPC                    = 117\n\tSYS_FSYNC                  = 118\n\tSYS_SIGRETURN              = 119\n\tSYS_CLONE                  = 120\n\tSYS_SETDOMAINNAME          = 121\n\tSYS_UNAME                  = 122\n\tSYS_MODIFY_LDT             = 123\n\tSYS_ADJTIMEX               = 124\n\tSYS_MPROTECT               = 125\n\tSYS_SIGPROCMASK            = 126\n\tSYS_CREATE_MODULE          = 127\n\tSYS_INIT_MODULE            = 128\n\tSYS_DELETE_MODULE          = 129\n\tSYS_GET_KERNEL_SYMS        = 130\n\tSYS_QUOTACTL               = 131\n\tSYS_GETPGID                = 132\n\tSYS_FCHDIR                 = 133\n\tSYS_BDFLUSH                = 134\n\tSYS_SYSFS                  = 135\n\tSYS_PERSONALITY            = 136\n\tSYS_AFS_SYSCALL            = 137\n\tSYS_SETFSUID               = 138\n\tSYS_SETFSGID               = 139\n\tSYS__LLSEEK                = 140\n\tSYS_GETDENTS               = 141\n\tSYS__NEWSELECT             = 142\n\tSYS_FLOCK                  = 143\n\tSYS_MSYNC                  = 144\n\tSYS_READV                  = 145\n\tSYS_WRITEV                 = 146\n\tSYS_GETSID                 = 147\n\tSYS_FDATASYNC              = 148\n\tSYS__SYSCTL                = 149\n\tSYS_MLOCK                  = 150\n\tSYS_MUNLOCK                = 151\n\tSYS_MLOCKALL               = 152\n\tSYS_MUNLOCKALL             = 153\n\tSYS_SCHED_SETPARAM         = 154\n\tSYS_SCHED_GETPARAM         = 155\n\tSYS_SCHED_SETSCHEDULER     = 156\n\tSYS_SCHED_GETSCHEDULER     = 157\n\tSYS_SCHED_YIELD            = 158\n\tSYS_SCHED_GET_PRIORITY_MAX = 159\n\tSYS_SCHED_GET_PRIORITY_MIN = 160\n\tSYS_SCHED_RR_GET_INTERVAL  = 161\n\tSYS_NANOSLEEP              = 162\n\tSYS_MREMAP                 = 163\n\tSYS_SETRESUID              = 164\n\tSYS_GETRESUID              = 165\n\tSYS_QUERY_MODULE           = 166\n\tSYS_POLL                   = 167\n\tSYS_NFSSERVCTL             = 168\n\tSYS_SETRESGID              = 169\n\tSYS_GETRESGID              = 170\n\tSYS_PRCTL                  = 171\n\tSYS_RT_SIGRETURN           = 172\n\tSYS_RT_SIGACTION           = 173\n\tSYS_RT_SIGPROCMASK         = 174\n\tSYS_RT_SIGPENDING          = 175\n\tSYS_RT_SIGTIMEDWAIT        = 176\n\tSYS_RT_SIGQUEUEINFO        = 177\n\tSYS_RT_SIGSUSPEND          = 178\n\tSYS_PREAD64                = 179\n\tSYS_PWRITE64               = 180\n\tSYS_CHOWN                  = 181\n\tSYS_GETCWD                 = 182\n\tSYS_CAPGET                 = 183\n\tSYS_CAPSET                 = 184\n\tSYS_SIGALTSTACK            = 185\n\tSYS_SENDFILE               = 186\n\tSYS_GETPMSG                = 187\n\tSYS_PUTPMSG                = 188\n\tSYS_VFORK                  = 189\n\tSYS_UGETRLIMIT             = 190\n\tSYS_READAHEAD              = 191\n\tSYS_PCICONFIG_READ         = 198\n\tSYS_PCICONFIG_WRITE        = 199\n\tSYS_PCICONFIG_IOBASE       = 200\n\tSYS_MULTIPLEXER            = 201\n\tSYS_GETDENTS64             = 202\n\tSYS_PIVOT_ROOT             = 203\n\tSYS_MADVISE                = 205\n\tSYS_MINCORE                = 206\n\tSYS_GETTID                 = 207\n\tSYS_TKILL                  = 208\n\tSYS_SETXATTR               = 209\n\tSYS_LSETXATTR              = 210\n\tSYS_FSETXATTR              = 211\n\tSYS_GETXATTR               = 212\n\tSYS_LGETXATTR              = 213\n\tSYS_FGETXATTR              = 214\n\tSYS_LISTXATTR              = 215\n\tSYS_LLISTXATTR             = 216\n\tSYS_FLISTXATTR             = 217\n\tSYS_REMOVEXATTR            = 218\n\tSYS_LREMOVEXATTR           = 219\n\tSYS_FREMOVEXATTR           = 220\n\tSYS_FUTEX                  = 221\n\tSYS_SCHED_SETAFFINITY      = 222\n\tSYS_SCHED_GETAFFINITY      = 223\n\tSYS_TUXCALL                = 225\n\tSYS_IO_SETUP               = 227\n\tSYS_IO_DESTROY             = 228\n\tSYS_IO_GETEVENTS           = 229\n\tSYS_IO_SUBMIT              = 230\n\tSYS_IO_CANCEL              = 231\n\tSYS_SET_TID_ADDRESS        = 232\n\tSYS_FADVISE64              = 233\n\tSYS_EXIT_GROUP             = 234\n\tSYS_LOOKUP_DCOOKIE         = 235\n\tSYS_EPOLL_CREATE           = 236\n\tSYS_EPOLL_CTL              = 237\n\tSYS_EPOLL_WAIT             = 238\n\tSYS_REMAP_FILE_PAGES       = 239\n\tSYS_TIMER_CREATE           = 240\n\tSYS_TIMER_SETTIME          = 241\n\tSYS_TIMER_GETTIME          = 242\n\tSYS_TIMER_GETOVERRUN       = 243\n\tSYS_TIMER_DELETE           = 244\n\tSYS_CLOCK_SETTIME          = 245\n\tSYS_CLOCK_GETTIME          = 246\n\tSYS_CLOCK_GETRES           = 247\n\tSYS_CLOCK_NANOSLEEP        = 248\n\tSYS_SWAPCONTEXT            = 249\n\tSYS_TGKILL                 = 250\n\tSYS_UTIMES                 = 251\n\tSYS_STATFS64               = 252\n\tSYS_FSTATFS64              = 253\n\tSYS_RTAS                   = 255\n\tSYS_SYS_DEBUG_SETCONTEXT   = 256\n\tSYS_MIGRATE_PAGES          = 258\n\tSYS_MBIND                  = 259\n\tSYS_GET_MEMPOLICY          = 260\n\tSYS_SET_MEMPOLICY          = 261\n\tSYS_MQ_OPEN                = 262\n\tSYS_MQ_UNLINK              = 263\n\tSYS_MQ_TIMEDSEND           = 264\n\tSYS_MQ_TIMEDRECEIVE        = 265\n\tSYS_MQ_NOTIFY              = 266\n\tSYS_MQ_GETSETATTR          = 267\n\tSYS_KEXEC_LOAD             = 268\n\tSYS_ADD_KEY                = 269\n\tSYS_REQUEST_KEY            = 270\n\tSYS_KEYCTL                 = 271\n\tSYS_WAITID                 = 272\n\tSYS_IOPRIO_SET             = 273\n\tSYS_IOPRIO_GET             = 274\n\tSYS_INOTIFY_INIT           = 275\n\tSYS_INOTIFY_ADD_WATCH      = 276\n\tSYS_INOTIFY_RM_WATCH       = 277\n\tSYS_SPU_RUN                = 278\n\tSYS_SPU_CREATE             = 279\n\tSYS_PSELECT6               = 280\n\tSYS_PPOLL                  = 281\n\tSYS_UNSHARE                = 282\n\tSYS_SPLICE                 = 283\n\tSYS_TEE                    = 284\n\tSYS_VMSPLICE               = 285\n\tSYS_OPENAT                 = 286\n\tSYS_MKDIRAT                = 287\n\tSYS_MKNODAT                = 288\n\tSYS_FCHOWNAT               = 289\n\tSYS_FUTIMESAT              = 290\n\tSYS_NEWFSTATAT             = 291\n\tSYS_UNLINKAT               = 292\n\tSYS_RENAMEAT               = 293\n\tSYS_LINKAT                 = 294\n\tSYS_SYMLINKAT              = 295\n\tSYS_READLINKAT             = 296\n\tSYS_FCHMODAT               = 297\n\tSYS_FACCESSAT              = 298\n\tSYS_GET_ROBUST_LIST        = 299\n\tSYS_SET_ROBUST_LIST        = 300\n\tSYS_MOVE_PAGES             = 301\n\tSYS_GETCPU                 = 302\n\tSYS_EPOLL_PWAIT            = 303\n\tSYS_UTIMENSAT              = 304\n\tSYS_SIGNALFD               = 305\n\tSYS_TIMERFD_CREATE         = 306\n\tSYS_EVENTFD                = 307\n\tSYS_SYNC_FILE_RANGE2       = 308\n\tSYS_FALLOCATE              = 309\n\tSYS_SUBPAGE_PROT           = 310\n\tSYS_TIMERFD_SETTIME        = 311\n\tSYS_TIMERFD_GETTIME        = 312\n\tSYS_SIGNALFD4              = 313\n\tSYS_EVENTFD2               = 314\n\tSYS_EPOLL_CREATE1          = 315\n\tSYS_DUP3                   = 316\n\tSYS_PIPE2                  = 317\n\tSYS_INOTIFY_INIT1          = 318\n\tSYS_PERF_EVENT_OPEN        = 319\n\tSYS_PREADV                 = 320\n\tSYS_PWRITEV                = 321\n\tSYS_RT_TGSIGQUEUEINFO      = 322\n\tSYS_FANOTIFY_INIT          = 323\n\tSYS_FANOTIFY_MARK          = 324\n\tSYS_PRLIMIT64              = 325\n\tSYS_SOCKET                 = 326\n\tSYS_BIND                   = 327\n\tSYS_CONNECT                = 328\n\tSYS_LISTEN                 = 329\n\tSYS_ACCEPT                 = 330\n\tSYS_GETSOCKNAME            = 331\n\tSYS_GETPEERNAME            = 332\n\tSYS_SOCKETPAIR             = 333\n\tSYS_SEND                   = 334\n\tSYS_SENDTO                 = 335\n\tSYS_RECV                   = 336\n\tSYS_RECVFROM               = 337\n\tSYS_SHUTDOWN               = 338\n\tSYS_SETSOCKOPT             = 339\n\tSYS_GETSOCKOPT             = 340\n\tSYS_SENDMSG                = 341\n\tSYS_RECVMSG                = 342\n\tSYS_RECVMMSG               = 343\n\tSYS_ACCEPT4                = 344\n\tSYS_NAME_TO_HANDLE_AT      = 345\n\tSYS_OPEN_BY_HANDLE_AT      = 346\n\tSYS_CLOCK_ADJTIME          = 347\n\tSYS_SYNCFS                 = 348\n\tSYS_SENDMMSG               = 349\n\tSYS_SETNS                  = 350\n\tSYS_PROCESS_VM_READV       = 351\n\tSYS_PROCESS_VM_WRITEV      = 352\n\tSYS_FINIT_MODULE           = 353\n\tSYS_KCMP                   = 354\n\tSYS_SCHED_SETATTR          = 355\n\tSYS_SCHED_GETATTR          = 356\n\tSYS_RENAMEAT2              = 357\n\tSYS_SECCOMP                = 358\n\tSYS_GETRANDOM              = 359\n\tSYS_MEMFD_CREATE           = 360\n\tSYS_BPF                    = 361\n\tSYS_EXECVEAT               = 362\n\tSYS_SWITCH_ENDIAN          = 363\n\tSYS_USERFAULTFD            = 364\n\tSYS_MEMBARRIER             = 365\n\tSYS_MLOCK2                 = 378\n\tSYS_COPY_FILE_RANGE        = 379\n\tSYS_PREADV2                = 380\n\tSYS_PWRITEV2               = 381\n\tSYS_KEXEC_FILE_LOAD        = 382\n\tSYS_STATX                  = 383\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go",
    "content": "// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build s390x,linux\n\npackage unix\n\nconst (\n\tSYS_EXIT                   = 1\n\tSYS_FORK                   = 2\n\tSYS_READ                   = 3\n\tSYS_WRITE                  = 4\n\tSYS_OPEN                   = 5\n\tSYS_CLOSE                  = 6\n\tSYS_RESTART_SYSCALL        = 7\n\tSYS_CREAT                  = 8\n\tSYS_LINK                   = 9\n\tSYS_UNLINK                 = 10\n\tSYS_EXECVE                 = 11\n\tSYS_CHDIR                  = 12\n\tSYS_MKNOD                  = 14\n\tSYS_CHMOD                  = 15\n\tSYS_LSEEK                  = 19\n\tSYS_GETPID                 = 20\n\tSYS_MOUNT                  = 21\n\tSYS_UMOUNT                 = 22\n\tSYS_PTRACE                 = 26\n\tSYS_ALARM                  = 27\n\tSYS_PAUSE                  = 29\n\tSYS_UTIME                  = 30\n\tSYS_ACCESS                 = 33\n\tSYS_NICE                   = 34\n\tSYS_SYNC                   = 36\n\tSYS_KILL                   = 37\n\tSYS_RENAME                 = 38\n\tSYS_MKDIR                  = 39\n\tSYS_RMDIR                  = 40\n\tSYS_DUP                    = 41\n\tSYS_PIPE                   = 42\n\tSYS_TIMES                  = 43\n\tSYS_BRK                    = 45\n\tSYS_SIGNAL                 = 48\n\tSYS_ACCT                   = 51\n\tSYS_UMOUNT2                = 52\n\tSYS_IOCTL                  = 54\n\tSYS_FCNTL                  = 55\n\tSYS_SETPGID                = 57\n\tSYS_UMASK                  = 60\n\tSYS_CHROOT                 = 61\n\tSYS_USTAT                  = 62\n\tSYS_DUP2                   = 63\n\tSYS_GETPPID                = 64\n\tSYS_GETPGRP                = 65\n\tSYS_SETSID                 = 66\n\tSYS_SIGACTION              = 67\n\tSYS_SIGSUSPEND             = 72\n\tSYS_SIGPENDING             = 73\n\tSYS_SETHOSTNAME            = 74\n\tSYS_SETRLIMIT              = 75\n\tSYS_GETRUSAGE              = 77\n\tSYS_GETTIMEOFDAY           = 78\n\tSYS_SETTIMEOFDAY           = 79\n\tSYS_SYMLINK                = 83\n\tSYS_READLINK               = 85\n\tSYS_USELIB                 = 86\n\tSYS_SWAPON                 = 87\n\tSYS_REBOOT                 = 88\n\tSYS_READDIR                = 89\n\tSYS_MMAP                   = 90\n\tSYS_MUNMAP                 = 91\n\tSYS_TRUNCATE               = 92\n\tSYS_FTRUNCATE              = 93\n\tSYS_FCHMOD                 = 94\n\tSYS_GETPRIORITY            = 96\n\tSYS_SETPRIORITY            = 97\n\tSYS_STATFS                 = 99\n\tSYS_FSTATFS                = 100\n\tSYS_SOCKETCALL             = 102\n\tSYS_SYSLOG                 = 103\n\tSYS_SETITIMER              = 104\n\tSYS_GETITIMER              = 105\n\tSYS_STAT                   = 106\n\tSYS_LSTAT                  = 107\n\tSYS_FSTAT                  = 108\n\tSYS_LOOKUP_DCOOKIE         = 110\n\tSYS_VHANGUP                = 111\n\tSYS_IDLE                   = 112\n\tSYS_WAIT4                  = 114\n\tSYS_SWAPOFF                = 115\n\tSYS_SYSINFO                = 116\n\tSYS_IPC                    = 117\n\tSYS_FSYNC                  = 118\n\tSYS_SIGRETURN              = 119\n\tSYS_CLONE                  = 120\n\tSYS_SETDOMAINNAME          = 121\n\tSYS_UNAME                  = 122\n\tSYS_ADJTIMEX               = 124\n\tSYS_MPROTECT               = 125\n\tSYS_SIGPROCMASK            = 126\n\tSYS_CREATE_MODULE          = 127\n\tSYS_INIT_MODULE            = 128\n\tSYS_DELETE_MODULE          = 129\n\tSYS_GET_KERNEL_SYMS        = 130\n\tSYS_QUOTACTL               = 131\n\tSYS_GETPGID                = 132\n\tSYS_FCHDIR                 = 133\n\tSYS_BDFLUSH                = 134\n\tSYS_SYSFS                  = 135\n\tSYS_PERSONALITY            = 136\n\tSYS_AFS_SYSCALL            = 137\n\tSYS_GETDENTS               = 141\n\tSYS_FLOCK                  = 143\n\tSYS_MSYNC                  = 144\n\tSYS_READV                  = 145\n\tSYS_WRITEV                 = 146\n\tSYS_GETSID                 = 147\n\tSYS_FDATASYNC              = 148\n\tSYS__SYSCTL                = 149\n\tSYS_MLOCK                  = 150\n\tSYS_MUNLOCK                = 151\n\tSYS_MLOCKALL               = 152\n\tSYS_MUNLOCKALL             = 153\n\tSYS_SCHED_SETPARAM         = 154\n\tSYS_SCHED_GETPARAM         = 155\n\tSYS_SCHED_SETSCHEDULER     = 156\n\tSYS_SCHED_GETSCHEDULER     = 157\n\tSYS_SCHED_YIELD            = 158\n\tSYS_SCHED_GET_PRIORITY_MAX = 159\n\tSYS_SCHED_GET_PRIORITY_MIN = 160\n\tSYS_SCHED_RR_GET_INTERVAL  = 161\n\tSYS_NANOSLEEP              = 162\n\tSYS_MREMAP                 = 163\n\tSYS_QUERY_MODULE           = 167\n\tSYS_POLL                   = 168\n\tSYS_NFSSERVCTL             = 169\n\tSYS_PRCTL                  = 172\n\tSYS_RT_SIGRETURN           = 173\n\tSYS_RT_SIGACTION           = 174\n\tSYS_RT_SIGPROCMASK         = 175\n\tSYS_RT_SIGPENDING          = 176\n\tSYS_RT_SIGTIMEDWAIT        = 177\n\tSYS_RT_SIGQUEUEINFO        = 178\n\tSYS_RT_SIGSUSPEND          = 179\n\tSYS_PREAD64                = 180\n\tSYS_PWRITE64               = 181\n\tSYS_GETCWD                 = 183\n\tSYS_CAPGET                 = 184\n\tSYS_CAPSET                 = 185\n\tSYS_SIGALTSTACK            = 186\n\tSYS_SENDFILE               = 187\n\tSYS_GETPMSG                = 188\n\tSYS_PUTPMSG                = 189\n\tSYS_VFORK                  = 190\n\tSYS_PIVOT_ROOT             = 217\n\tSYS_MINCORE                = 218\n\tSYS_MADVISE                = 219\n\tSYS_GETDENTS64             = 220\n\tSYS_READAHEAD              = 222\n\tSYS_SETXATTR               = 224\n\tSYS_LSETXATTR              = 225\n\tSYS_FSETXATTR              = 226\n\tSYS_GETXATTR               = 227\n\tSYS_LGETXATTR              = 228\n\tSYS_FGETXATTR              = 229\n\tSYS_LISTXATTR              = 230\n\tSYS_LLISTXATTR             = 231\n\tSYS_FLISTXATTR             = 232\n\tSYS_REMOVEXATTR            = 233\n\tSYS_LREMOVEXATTR           = 234\n\tSYS_FREMOVEXATTR           = 235\n\tSYS_GETTID                 = 236\n\tSYS_TKILL                  = 237\n\tSYS_FUTEX                  = 238\n\tSYS_SCHED_SETAFFINITY      = 239\n\tSYS_SCHED_GETAFFINITY      = 240\n\tSYS_TGKILL                 = 241\n\tSYS_IO_SETUP               = 243\n\tSYS_IO_DESTROY             = 244\n\tSYS_IO_GETEVENTS           = 245\n\tSYS_IO_SUBMIT              = 246\n\tSYS_IO_CANCEL              = 247\n\tSYS_EXIT_GROUP             = 248\n\tSYS_EPOLL_CREATE           = 249\n\tSYS_EPOLL_CTL              = 250\n\tSYS_EPOLL_WAIT             = 251\n\tSYS_SET_TID_ADDRESS        = 252\n\tSYS_FADVISE64              = 253\n\tSYS_TIMER_CREATE           = 254\n\tSYS_TIMER_SETTIME          = 255\n\tSYS_TIMER_GETTIME          = 256\n\tSYS_TIMER_GETOVERRUN       = 257\n\tSYS_TIMER_DELETE           = 258\n\tSYS_CLOCK_SETTIME          = 259\n\tSYS_CLOCK_GETTIME          = 260\n\tSYS_CLOCK_GETRES           = 261\n\tSYS_CLOCK_NANOSLEEP        = 262\n\tSYS_STATFS64               = 265\n\tSYS_FSTATFS64              = 266\n\tSYS_REMAP_FILE_PAGES       = 267\n\tSYS_MBIND                  = 268\n\tSYS_GET_MEMPOLICY          = 269\n\tSYS_SET_MEMPOLICY          = 270\n\tSYS_MQ_OPEN                = 271\n\tSYS_MQ_UNLINK              = 272\n\tSYS_MQ_TIMEDSEND           = 273\n\tSYS_MQ_TIMEDRECEIVE        = 274\n\tSYS_MQ_NOTIFY              = 275\n\tSYS_MQ_GETSETATTR          = 276\n\tSYS_KEXEC_LOAD             = 277\n\tSYS_ADD_KEY                = 278\n\tSYS_REQUEST_KEY            = 279\n\tSYS_KEYCTL                 = 280\n\tSYS_WAITID                 = 281\n\tSYS_IOPRIO_SET             = 282\n\tSYS_IOPRIO_GET             = 283\n\tSYS_INOTIFY_INIT           = 284\n\tSYS_INOTIFY_ADD_WATCH      = 285\n\tSYS_INOTIFY_RM_WATCH       = 286\n\tSYS_MIGRATE_PAGES          = 287\n\tSYS_OPENAT                 = 288\n\tSYS_MKDIRAT                = 289\n\tSYS_MKNODAT                = 290\n\tSYS_FCHOWNAT               = 291\n\tSYS_FUTIMESAT              = 292\n\tSYS_UNLINKAT               = 294\n\tSYS_RENAMEAT               = 295\n\tSYS_LINKAT                 = 296\n\tSYS_SYMLINKAT              = 297\n\tSYS_READLINKAT             = 298\n\tSYS_FCHMODAT               = 299\n\tSYS_FACCESSAT              = 300\n\tSYS_PSELECT6               = 301\n\tSYS_PPOLL                  = 302\n\tSYS_UNSHARE                = 303\n\tSYS_SET_ROBUST_LIST        = 304\n\tSYS_GET_ROBUST_LIST        = 305\n\tSYS_SPLICE                 = 306\n\tSYS_SYNC_FILE_RANGE        = 307\n\tSYS_TEE                    = 308\n\tSYS_VMSPLICE               = 309\n\tSYS_MOVE_PAGES             = 310\n\tSYS_GETCPU                 = 311\n\tSYS_EPOLL_PWAIT            = 312\n\tSYS_UTIMES                 = 313\n\tSYS_FALLOCATE              = 314\n\tSYS_UTIMENSAT              = 315\n\tSYS_SIGNALFD               = 316\n\tSYS_TIMERFD                = 317\n\tSYS_EVENTFD                = 318\n\tSYS_TIMERFD_CREATE         = 319\n\tSYS_TIMERFD_SETTIME        = 320\n\tSYS_TIMERFD_GETTIME        = 321\n\tSYS_SIGNALFD4              = 322\n\tSYS_EVENTFD2               = 323\n\tSYS_INOTIFY_INIT1          = 324\n\tSYS_PIPE2                  = 325\n\tSYS_DUP3                   = 326\n\tSYS_EPOLL_CREATE1          = 327\n\tSYS_PREADV                 = 328\n\tSYS_PWRITEV                = 329\n\tSYS_RT_TGSIGQUEUEINFO      = 330\n\tSYS_PERF_EVENT_OPEN        = 331\n\tSYS_FANOTIFY_INIT          = 332\n\tSYS_FANOTIFY_MARK          = 333\n\tSYS_PRLIMIT64              = 334\n\tSYS_NAME_TO_HANDLE_AT      = 335\n\tSYS_OPEN_BY_HANDLE_AT      = 336\n\tSYS_CLOCK_ADJTIME          = 337\n\tSYS_SYNCFS                 = 338\n\tSYS_SETNS                  = 339\n\tSYS_PROCESS_VM_READV       = 340\n\tSYS_PROCESS_VM_WRITEV      = 341\n\tSYS_S390_RUNTIME_INSTR     = 342\n\tSYS_KCMP                   = 343\n\tSYS_FINIT_MODULE           = 344\n\tSYS_SCHED_SETATTR          = 345\n\tSYS_SCHED_GETATTR          = 346\n\tSYS_RENAMEAT2              = 347\n\tSYS_SECCOMP                = 348\n\tSYS_GETRANDOM              = 349\n\tSYS_MEMFD_CREATE           = 350\n\tSYS_BPF                    = 351\n\tSYS_S390_PCI_MMIO_WRITE    = 352\n\tSYS_S390_PCI_MMIO_READ     = 353\n\tSYS_EXECVEAT               = 354\n\tSYS_USERFAULTFD            = 355\n\tSYS_MEMBARRIER             = 356\n\tSYS_RECVMMSG               = 357\n\tSYS_SENDMMSG               = 358\n\tSYS_SOCKET                 = 359\n\tSYS_SOCKETPAIR             = 360\n\tSYS_BIND                   = 361\n\tSYS_CONNECT                = 362\n\tSYS_LISTEN                 = 363\n\tSYS_ACCEPT4                = 364\n\tSYS_GETSOCKOPT             = 365\n\tSYS_SETSOCKOPT             = 366\n\tSYS_GETSOCKNAME            = 367\n\tSYS_GETPEERNAME            = 368\n\tSYS_SENDTO                 = 369\n\tSYS_SENDMSG                = 370\n\tSYS_RECVFROM               = 371\n\tSYS_RECVMSG                = 372\n\tSYS_SHUTDOWN               = 373\n\tSYS_MLOCK2                 = 374\n\tSYS_COPY_FILE_RANGE        = 375\n\tSYS_PREADV2                = 376\n\tSYS_PWRITEV2               = 377\n\tSYS_S390_GUARDED_STORAGE   = 378\n\tSYS_STATX                  = 379\n\tSYS_SELECT                 = 142\n\tSYS_GETRLIMIT              = 191\n\tSYS_LCHOWN                 = 198\n\tSYS_GETUID                 = 199\n\tSYS_GETGID                 = 200\n\tSYS_GETEUID                = 201\n\tSYS_GETEGID                = 202\n\tSYS_SETREUID               = 203\n\tSYS_SETREGID               = 204\n\tSYS_GETGROUPS              = 205\n\tSYS_SETGROUPS              = 206\n\tSYS_FCHOWN                 = 207\n\tSYS_SETRESUID              = 208\n\tSYS_GETRESUID              = 209\n\tSYS_SETRESGID              = 210\n\tSYS_GETRESGID              = 211\n\tSYS_CHOWN                  = 212\n\tSYS_SETUID                 = 213\n\tSYS_SETGID                 = 214\n\tSYS_SETFSUID               = 215\n\tSYS_SETFSGID               = 216\n\tSYS_NEWFSTATAT             = 293\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go",
    "content": "// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build sparc64,linux\n\npackage unix\n\nconst (\n\tSYS_RESTART_SYSCALL        = 0\n\tSYS_EXIT                   = 1\n\tSYS_FORK                   = 2\n\tSYS_READ                   = 3\n\tSYS_WRITE                  = 4\n\tSYS_OPEN                   = 5\n\tSYS_CLOSE                  = 6\n\tSYS_WAIT4                  = 7\n\tSYS_CREAT                  = 8\n\tSYS_LINK                   = 9\n\tSYS_UNLINK                 = 10\n\tSYS_EXECV                  = 11\n\tSYS_CHDIR                  = 12\n\tSYS_CHOWN                  = 13\n\tSYS_MKNOD                  = 14\n\tSYS_CHMOD                  = 15\n\tSYS_LCHOWN                 = 16\n\tSYS_BRK                    = 17\n\tSYS_PERFCTR                = 18\n\tSYS_LSEEK                  = 19\n\tSYS_GETPID                 = 20\n\tSYS_CAPGET                 = 21\n\tSYS_CAPSET                 = 22\n\tSYS_SETUID                 = 23\n\tSYS_GETUID                 = 24\n\tSYS_VMSPLICE               = 25\n\tSYS_PTRACE                 = 26\n\tSYS_ALARM                  = 27\n\tSYS_SIGALTSTACK            = 28\n\tSYS_PAUSE                  = 29\n\tSYS_UTIME                  = 30\n\tSYS_ACCESS                 = 33\n\tSYS_NICE                   = 34\n\tSYS_SYNC                   = 36\n\tSYS_KILL                   = 37\n\tSYS_STAT                   = 38\n\tSYS_SENDFILE               = 39\n\tSYS_LSTAT                  = 40\n\tSYS_DUP                    = 41\n\tSYS_PIPE                   = 42\n\tSYS_TIMES                  = 43\n\tSYS_UMOUNT2                = 45\n\tSYS_SETGID                 = 46\n\tSYS_GETGID                 = 47\n\tSYS_SIGNAL                 = 48\n\tSYS_GETEUID                = 49\n\tSYS_GETEGID                = 50\n\tSYS_ACCT                   = 51\n\tSYS_MEMORY_ORDERING        = 52\n\tSYS_IOCTL                  = 54\n\tSYS_REBOOT                 = 55\n\tSYS_SYMLINK                = 57\n\tSYS_READLINK               = 58\n\tSYS_EXECVE                 = 59\n\tSYS_UMASK                  = 60\n\tSYS_CHROOT                 = 61\n\tSYS_FSTAT                  = 62\n\tSYS_FSTAT64                = 63\n\tSYS_GETPAGESIZE            = 64\n\tSYS_MSYNC                  = 65\n\tSYS_VFORK                  = 66\n\tSYS_PREAD64                = 67\n\tSYS_PWRITE64               = 68\n\tSYS_MMAP                   = 71\n\tSYS_MUNMAP                 = 73\n\tSYS_MPROTECT               = 74\n\tSYS_MADVISE                = 75\n\tSYS_VHANGUP                = 76\n\tSYS_MINCORE                = 78\n\tSYS_GETGROUPS              = 79\n\tSYS_SETGROUPS              = 80\n\tSYS_GETPGRP                = 81\n\tSYS_SETITIMER              = 83\n\tSYS_SWAPON                 = 85\n\tSYS_GETITIMER              = 86\n\tSYS_SETHOSTNAME            = 88\n\tSYS_DUP2                   = 90\n\tSYS_FCNTL                  = 92\n\tSYS_SELECT                 = 93\n\tSYS_FSYNC                  = 95\n\tSYS_SETPRIORITY            = 96\n\tSYS_SOCKET                 = 97\n\tSYS_CONNECT                = 98\n\tSYS_ACCEPT                 = 99\n\tSYS_GETPRIORITY            = 100\n\tSYS_RT_SIGRETURN           = 101\n\tSYS_RT_SIGACTION           = 102\n\tSYS_RT_SIGPROCMASK         = 103\n\tSYS_RT_SIGPENDING          = 104\n\tSYS_RT_SIGTIMEDWAIT        = 105\n\tSYS_RT_SIGQUEUEINFO        = 106\n\tSYS_RT_SIGSUSPEND          = 107\n\tSYS_SETRESUID              = 108\n\tSYS_GETRESUID              = 109\n\tSYS_SETRESGID              = 110\n\tSYS_GETRESGID              = 111\n\tSYS_RECVMSG                = 113\n\tSYS_SENDMSG                = 114\n\tSYS_GETTIMEOFDAY           = 116\n\tSYS_GETRUSAGE              = 117\n\tSYS_GETSOCKOPT             = 118\n\tSYS_GETCWD                 = 119\n\tSYS_READV                  = 120\n\tSYS_WRITEV                 = 121\n\tSYS_SETTIMEOFDAY           = 122\n\tSYS_FCHOWN                 = 123\n\tSYS_FCHMOD                 = 124\n\tSYS_RECVFROM               = 125\n\tSYS_SETREUID               = 126\n\tSYS_SETREGID               = 127\n\tSYS_RENAME                 = 128\n\tSYS_TRUNCATE               = 129\n\tSYS_FTRUNCATE              = 130\n\tSYS_FLOCK                  = 131\n\tSYS_LSTAT64                = 132\n\tSYS_SENDTO                 = 133\n\tSYS_SHUTDOWN               = 134\n\tSYS_SOCKETPAIR             = 135\n\tSYS_MKDIR                  = 136\n\tSYS_RMDIR                  = 137\n\tSYS_UTIMES                 = 138\n\tSYS_STAT64                 = 139\n\tSYS_SENDFILE64             = 140\n\tSYS_GETPEERNAME            = 141\n\tSYS_FUTEX                  = 142\n\tSYS_GETTID                 = 143\n\tSYS_GETRLIMIT              = 144\n\tSYS_SETRLIMIT              = 145\n\tSYS_PIVOT_ROOT             = 146\n\tSYS_PRCTL                  = 147\n\tSYS_PCICONFIG_READ         = 148\n\tSYS_PCICONFIG_WRITE        = 149\n\tSYS_GETSOCKNAME            = 150\n\tSYS_INOTIFY_INIT           = 151\n\tSYS_INOTIFY_ADD_WATCH      = 152\n\tSYS_POLL                   = 153\n\tSYS_GETDENTS64             = 154\n\tSYS_INOTIFY_RM_WATCH       = 156\n\tSYS_STATFS                 = 157\n\tSYS_FSTATFS                = 158\n\tSYS_UMOUNT                 = 159\n\tSYS_SCHED_SET_AFFINITY     = 160\n\tSYS_SCHED_GET_AFFINITY     = 161\n\tSYS_GETDOMAINNAME          = 162\n\tSYS_SETDOMAINNAME          = 163\n\tSYS_UTRAP_INSTALL          = 164\n\tSYS_QUOTACTL               = 165\n\tSYS_SET_TID_ADDRESS        = 166\n\tSYS_MOUNT                  = 167\n\tSYS_USTAT                  = 168\n\tSYS_SETXATTR               = 169\n\tSYS_LSETXATTR              = 170\n\tSYS_FSETXATTR              = 171\n\tSYS_GETXATTR               = 172\n\tSYS_LGETXATTR              = 173\n\tSYS_GETDENTS               = 174\n\tSYS_SETSID                 = 175\n\tSYS_FCHDIR                 = 176\n\tSYS_FGETXATTR              = 177\n\tSYS_LISTXATTR              = 178\n\tSYS_LLISTXATTR             = 179\n\tSYS_FLISTXATTR             = 180\n\tSYS_REMOVEXATTR            = 181\n\tSYS_LREMOVEXATTR           = 182\n\tSYS_SIGPENDING             = 183\n\tSYS_QUERY_MODULE           = 184\n\tSYS_SETPGID                = 185\n\tSYS_FREMOVEXATTR           = 186\n\tSYS_TKILL                  = 187\n\tSYS_EXIT_GROUP             = 188\n\tSYS_UNAME                  = 189\n\tSYS_INIT_MODULE            = 190\n\tSYS_PERSONALITY            = 191\n\tSYS_REMAP_FILE_PAGES       = 192\n\tSYS_EPOLL_CREATE           = 193\n\tSYS_EPOLL_CTL              = 194\n\tSYS_EPOLL_WAIT             = 195\n\tSYS_IOPRIO_SET             = 196\n\tSYS_GETPPID                = 197\n\tSYS_SIGACTION              = 198\n\tSYS_SGETMASK               = 199\n\tSYS_SSETMASK               = 200\n\tSYS_SIGSUSPEND             = 201\n\tSYS_OLDLSTAT               = 202\n\tSYS_USELIB                 = 203\n\tSYS_READDIR                = 204\n\tSYS_READAHEAD              = 205\n\tSYS_SOCKETCALL             = 206\n\tSYS_SYSLOG                 = 207\n\tSYS_LOOKUP_DCOOKIE         = 208\n\tSYS_FADVISE64              = 209\n\tSYS_FADVISE64_64           = 210\n\tSYS_TGKILL                 = 211\n\tSYS_WAITPID                = 212\n\tSYS_SWAPOFF                = 213\n\tSYS_SYSINFO                = 214\n\tSYS_IPC                    = 215\n\tSYS_SIGRETURN              = 216\n\tSYS_CLONE                  = 217\n\tSYS_IOPRIO_GET             = 218\n\tSYS_ADJTIMEX               = 219\n\tSYS_SIGPROCMASK            = 220\n\tSYS_CREATE_MODULE          = 221\n\tSYS_DELETE_MODULE          = 222\n\tSYS_GET_KERNEL_SYMS        = 223\n\tSYS_GETPGID                = 224\n\tSYS_BDFLUSH                = 225\n\tSYS_SYSFS                  = 226\n\tSYS_AFS_SYSCALL            = 227\n\tSYS_SETFSUID               = 228\n\tSYS_SETFSGID               = 229\n\tSYS__NEWSELECT             = 230\n\tSYS_SPLICE                 = 232\n\tSYS_STIME                  = 233\n\tSYS_STATFS64               = 234\n\tSYS_FSTATFS64              = 235\n\tSYS__LLSEEK                = 236\n\tSYS_MLOCK                  = 237\n\tSYS_MUNLOCK                = 238\n\tSYS_MLOCKALL               = 239\n\tSYS_MUNLOCKALL             = 240\n\tSYS_SCHED_SETPARAM         = 241\n\tSYS_SCHED_GETPARAM         = 242\n\tSYS_SCHED_SETSCHEDULER     = 243\n\tSYS_SCHED_GETSCHEDULER     = 244\n\tSYS_SCHED_YIELD            = 245\n\tSYS_SCHED_GET_PRIORITY_MAX = 246\n\tSYS_SCHED_GET_PRIORITY_MIN = 247\n\tSYS_SCHED_RR_GET_INTERVAL  = 248\n\tSYS_NANOSLEEP              = 249\n\tSYS_MREMAP                 = 250\n\tSYS__SYSCTL                = 251\n\tSYS_GETSID                 = 252\n\tSYS_FDATASYNC              = 253\n\tSYS_NFSSERVCTL             = 254\n\tSYS_SYNC_FILE_RANGE        = 255\n\tSYS_CLOCK_SETTIME          = 256\n\tSYS_CLOCK_GETTIME          = 257\n\tSYS_CLOCK_GETRES           = 258\n\tSYS_CLOCK_NANOSLEEP        = 259\n\tSYS_SCHED_GETAFFINITY      = 260\n\tSYS_SCHED_SETAFFINITY      = 261\n\tSYS_TIMER_SETTIME          = 262\n\tSYS_TIMER_GETTIME          = 263\n\tSYS_TIMER_GETOVERRUN       = 264\n\tSYS_TIMER_DELETE           = 265\n\tSYS_TIMER_CREATE           = 266\n\tSYS_IO_SETUP               = 268\n\tSYS_IO_DESTROY             = 269\n\tSYS_IO_SUBMIT              = 270\n\tSYS_IO_CANCEL              = 271\n\tSYS_IO_GETEVENTS           = 272\n\tSYS_MQ_OPEN                = 273\n\tSYS_MQ_UNLINK              = 274\n\tSYS_MQ_TIMEDSEND           = 275\n\tSYS_MQ_TIMEDRECEIVE        = 276\n\tSYS_MQ_NOTIFY              = 277\n\tSYS_MQ_GETSETATTR          = 278\n\tSYS_WAITID                 = 279\n\tSYS_TEE                    = 280\n\tSYS_ADD_KEY                = 281\n\tSYS_REQUEST_KEY            = 282\n\tSYS_KEYCTL                 = 283\n\tSYS_OPENAT                 = 284\n\tSYS_MKDIRAT                = 285\n\tSYS_MKNODAT                = 286\n\tSYS_FCHOWNAT               = 287\n\tSYS_FUTIMESAT              = 288\n\tSYS_FSTATAT64              = 289\n\tSYS_UNLINKAT               = 290\n\tSYS_RENAMEAT               = 291\n\tSYS_LINKAT                 = 292\n\tSYS_SYMLINKAT              = 293\n\tSYS_READLINKAT             = 294\n\tSYS_FCHMODAT               = 295\n\tSYS_FACCESSAT              = 296\n\tSYS_PSELECT6               = 297\n\tSYS_PPOLL                  = 298\n\tSYS_UNSHARE                = 299\n\tSYS_SET_ROBUST_LIST        = 300\n\tSYS_GET_ROBUST_LIST        = 301\n\tSYS_MIGRATE_PAGES          = 302\n\tSYS_MBIND                  = 303\n\tSYS_GET_MEMPOLICY          = 304\n\tSYS_SET_MEMPOLICY          = 305\n\tSYS_KEXEC_LOAD             = 306\n\tSYS_MOVE_PAGES             = 307\n\tSYS_GETCPU                 = 308\n\tSYS_EPOLL_PWAIT            = 309\n\tSYS_UTIMENSAT              = 310\n\tSYS_SIGNALFD               = 311\n\tSYS_TIMERFD_CREATE         = 312\n\tSYS_EVENTFD                = 313\n\tSYS_FALLOCATE              = 314\n\tSYS_TIMERFD_SETTIME        = 315\n\tSYS_TIMERFD_GETTIME        = 316\n\tSYS_SIGNALFD4              = 317\n\tSYS_EVENTFD2               = 318\n\tSYS_EPOLL_CREATE1          = 319\n\tSYS_DUP3                   = 320\n\tSYS_PIPE2                  = 321\n\tSYS_INOTIFY_INIT1          = 322\n\tSYS_ACCEPT4                = 323\n\tSYS_PREADV                 = 324\n\tSYS_PWRITEV                = 325\n\tSYS_RT_TGSIGQUEUEINFO      = 326\n\tSYS_PERF_EVENT_OPEN        = 327\n\tSYS_RECVMMSG               = 328\n\tSYS_FANOTIFY_INIT          = 329\n\tSYS_FANOTIFY_MARK          = 330\n\tSYS_PRLIMIT64              = 331\n\tSYS_NAME_TO_HANDLE_AT      = 332\n\tSYS_OPEN_BY_HANDLE_AT      = 333\n\tSYS_CLOCK_ADJTIME          = 334\n\tSYS_SYNCFS                 = 335\n\tSYS_SENDMMSG               = 336\n\tSYS_SETNS                  = 337\n\tSYS_PROCESS_VM_READV       = 338\n\tSYS_PROCESS_VM_WRITEV      = 339\n\tSYS_KERN_FEATURES          = 340\n\tSYS_KCMP                   = 341\n\tSYS_FINIT_MODULE           = 342\n\tSYS_SCHED_SETATTR          = 343\n\tSYS_SCHED_GETATTR          = 344\n\tSYS_RENAMEAT2              = 345\n\tSYS_SECCOMP                = 346\n\tSYS_GETRANDOM              = 347\n\tSYS_MEMFD_CREATE           = 348\n\tSYS_BPF                    = 349\n\tSYS_EXECVEAT               = 350\n\tSYS_MEMBARRIER             = 351\n\tSYS_USERFAULTFD            = 352\n\tSYS_BIND                   = 353\n\tSYS_LISTEN                 = 354\n\tSYS_SETSOCKOPT             = 355\n\tSYS_MLOCK2                 = 356\n\tSYS_COPY_FILE_RANGE        = 357\n\tSYS_PREADV2                = 358\n\tSYS_PWRITEV2               = 359\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go",
    "content": "// mksysnum_netbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build 386,netbsd\n\npackage unix\n\nconst (\n\tSYS_EXIT                 = 1   // { void|sys||exit(int rval); }\n\tSYS_FORK                 = 2   // { int|sys||fork(void); }\n\tSYS_READ                 = 3   // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); }\n\tSYS_WRITE                = 4   // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); }\n\tSYS_OPEN                 = 5   // { int|sys||open(const char *path, int flags, ... mode_t mode); }\n\tSYS_CLOSE                = 6   // { int|sys||close(int fd); }\n\tSYS_LINK                 = 9   // { int|sys||link(const char *path, const char *link); }\n\tSYS_UNLINK               = 10  // { int|sys||unlink(const char *path); }\n\tSYS_CHDIR                = 12  // { int|sys||chdir(const char *path); }\n\tSYS_FCHDIR               = 13  // { int|sys||fchdir(int fd); }\n\tSYS_CHMOD                = 15  // { int|sys||chmod(const char *path, mode_t mode); }\n\tSYS_CHOWN                = 16  // { int|sys||chown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_BREAK                = 17  // { int|sys||obreak(char *nsize); }\n\tSYS_GETPID               = 20  // { pid_t|sys||getpid_with_ppid(void); }\n\tSYS_UNMOUNT              = 22  // { int|sys||unmount(const char *path, int flags); }\n\tSYS_SETUID               = 23  // { int|sys||setuid(uid_t uid); }\n\tSYS_GETUID               = 24  // { uid_t|sys||getuid_with_euid(void); }\n\tSYS_GETEUID              = 25  // { uid_t|sys||geteuid(void); }\n\tSYS_PTRACE               = 26  // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); }\n\tSYS_RECVMSG              = 27  // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); }\n\tSYS_SENDMSG              = 28  // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); }\n\tSYS_RECVFROM             = 29  // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); }\n\tSYS_ACCEPT               = 30  // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); }\n\tSYS_GETPEERNAME          = 31  // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); }\n\tSYS_GETSOCKNAME          = 32  // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); }\n\tSYS_ACCESS               = 33  // { int|sys||access(const char *path, int flags); }\n\tSYS_CHFLAGS              = 34  // { int|sys||chflags(const char *path, u_long flags); }\n\tSYS_FCHFLAGS             = 35  // { int|sys||fchflags(int fd, u_long flags); }\n\tSYS_SYNC                 = 36  // { void|sys||sync(void); }\n\tSYS_KILL                 = 37  // { int|sys||kill(pid_t pid, int signum); }\n\tSYS_GETPPID              = 39  // { pid_t|sys||getppid(void); }\n\tSYS_DUP                  = 41  // { int|sys||dup(int fd); }\n\tSYS_PIPE                 = 42  // { int|sys||pipe(void); }\n\tSYS_GETEGID              = 43  // { gid_t|sys||getegid(void); }\n\tSYS_PROFIL               = 44  // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); }\n\tSYS_KTRACE               = 45  // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); }\n\tSYS_GETGID               = 47  // { gid_t|sys||getgid_with_egid(void); }\n\tSYS___GETLOGIN           = 49  // { int|sys||__getlogin(char *namebuf, size_t namelen); }\n\tSYS___SETLOGIN           = 50  // { int|sys||__setlogin(const char *namebuf); }\n\tSYS_ACCT                 = 51  // { int|sys||acct(const char *path); }\n\tSYS_IOCTL                = 54  // { int|sys||ioctl(int fd, u_long com, ... void *data); }\n\tSYS_REVOKE               = 56  // { int|sys||revoke(const char *path); }\n\tSYS_SYMLINK              = 57  // { int|sys||symlink(const char *path, const char *link); }\n\tSYS_READLINK             = 58  // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); }\n\tSYS_EXECVE               = 59  // { int|sys||execve(const char *path, char * const *argp, char * const *envp); }\n\tSYS_UMASK                = 60  // { mode_t|sys||umask(mode_t newmask); }\n\tSYS_CHROOT               = 61  // { int|sys||chroot(const char *path); }\n\tSYS_VFORK                = 66  // { int|sys||vfork(void); }\n\tSYS_SBRK                 = 69  // { int|sys||sbrk(intptr_t incr); }\n\tSYS_SSTK                 = 70  // { int|sys||sstk(int incr); }\n\tSYS_VADVISE              = 72  // { int|sys||ovadvise(int anom); }\n\tSYS_MUNMAP               = 73  // { int|sys||munmap(void *addr, size_t len); }\n\tSYS_MPROTECT             = 74  // { int|sys||mprotect(void *addr, size_t len, int prot); }\n\tSYS_MADVISE              = 75  // { int|sys||madvise(void *addr, size_t len, int behav); }\n\tSYS_MINCORE              = 78  // { int|sys||mincore(void *addr, size_t len, char *vec); }\n\tSYS_GETGROUPS            = 79  // { int|sys||getgroups(int gidsetsize, gid_t *gidset); }\n\tSYS_SETGROUPS            = 80  // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); }\n\tSYS_GETPGRP              = 81  // { int|sys||getpgrp(void); }\n\tSYS_SETPGID              = 82  // { int|sys||setpgid(pid_t pid, pid_t pgid); }\n\tSYS_DUP2                 = 90  // { int|sys||dup2(int from, int to); }\n\tSYS_FCNTL                = 92  // { int|sys||fcntl(int fd, int cmd, ... void *arg); }\n\tSYS_FSYNC                = 95  // { int|sys||fsync(int fd); }\n\tSYS_SETPRIORITY          = 96  // { int|sys||setpriority(int which, id_t who, int prio); }\n\tSYS_CONNECT              = 98  // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); }\n\tSYS_GETPRIORITY          = 100 // { int|sys||getpriority(int which, id_t who); }\n\tSYS_BIND                 = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); }\n\tSYS_SETSOCKOPT           = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); }\n\tSYS_LISTEN               = 106 // { int|sys||listen(int s, int backlog); }\n\tSYS_GETSOCKOPT           = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); }\n\tSYS_READV                = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); }\n\tSYS_WRITEV               = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); }\n\tSYS_FCHOWN               = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS_FCHMOD               = 124 // { int|sys||fchmod(int fd, mode_t mode); }\n\tSYS_SETREUID             = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); }\n\tSYS_SETREGID             = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); }\n\tSYS_RENAME               = 128 // { int|sys||rename(const char *from, const char *to); }\n\tSYS_FLOCK                = 131 // { int|sys||flock(int fd, int how); }\n\tSYS_MKFIFO               = 132 // { int|sys||mkfifo(const char *path, mode_t mode); }\n\tSYS_SENDTO               = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); }\n\tSYS_SHUTDOWN             = 134 // { int|sys||shutdown(int s, int how); }\n\tSYS_SOCKETPAIR           = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); }\n\tSYS_MKDIR                = 136 // { int|sys||mkdir(const char *path, mode_t mode); }\n\tSYS_RMDIR                = 137 // { int|sys||rmdir(const char *path); }\n\tSYS_SETSID               = 147 // { int|sys||setsid(void); }\n\tSYS_SYSARCH              = 165 // { int|sys||sysarch(int op, void *parms); }\n\tSYS_PREAD                = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); }\n\tSYS_PWRITE               = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); }\n\tSYS_NTP_ADJTIME          = 176 // { int|sys||ntp_adjtime(struct timex *tp); }\n\tSYS_SETGID               = 181 // { int|sys||setgid(gid_t gid); }\n\tSYS_SETEGID              = 182 // { int|sys||setegid(gid_t egid); }\n\tSYS_SETEUID              = 183 // { int|sys||seteuid(uid_t euid); }\n\tSYS_PATHCONF             = 191 // { long|sys||pathconf(const char *path, int name); }\n\tSYS_FPATHCONF            = 192 // { long|sys||fpathconf(int fd, int name); }\n\tSYS_GETRLIMIT            = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); }\n\tSYS_SETRLIMIT            = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); }\n\tSYS_MMAP                 = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); }\n\tSYS_LSEEK                = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); }\n\tSYS_TRUNCATE             = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); }\n\tSYS_FTRUNCATE            = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); }\n\tSYS___SYSCTL             = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); }\n\tSYS_MLOCK                = 203 // { int|sys||mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK              = 204 // { int|sys||munlock(const void *addr, size_t len); }\n\tSYS_UNDELETE             = 205 // { int|sys||undelete(const char *path); }\n\tSYS_GETPGID              = 207 // { pid_t|sys||getpgid(pid_t pid); }\n\tSYS_REBOOT               = 208 // { int|sys||reboot(int opt, char *bootstr); }\n\tSYS_POLL                 = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); }\n\tSYS_SEMGET               = 221 // { int|sys||semget(key_t key, int nsems, int semflg); }\n\tSYS_SEMOP                = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); }\n\tSYS_SEMCONFIG            = 223 // { int|sys||semconfig(int flag); }\n\tSYS_MSGGET               = 225 // { int|sys||msgget(key_t key, int msgflg); }\n\tSYS_MSGSND               = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }\n\tSYS_MSGRCV               = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }\n\tSYS_SHMAT                = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); }\n\tSYS_SHMDT                = 230 // { int|sys||shmdt(const void *shmaddr); }\n\tSYS_SHMGET               = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); }\n\tSYS_TIMER_CREATE         = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); }\n\tSYS_TIMER_DELETE         = 236 // { int|sys||timer_delete(timer_t timerid); }\n\tSYS_TIMER_GETOVERRUN     = 239 // { int|sys||timer_getoverrun(timer_t timerid); }\n\tSYS_FDATASYNC            = 241 // { int|sys||fdatasync(int fd); }\n\tSYS_MLOCKALL             = 242 // { int|sys||mlockall(int flags); }\n\tSYS_MUNLOCKALL           = 243 // { int|sys||munlockall(void); }\n\tSYS_SIGQUEUEINFO         = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); }\n\tSYS_MODCTL               = 246 // { int|sys||modctl(int cmd, void *arg); }\n\tSYS___POSIX_RENAME       = 270 // { int|sys||__posix_rename(const char *from, const char *to); }\n\tSYS_SWAPCTL              = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); }\n\tSYS_MINHERIT             = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); }\n\tSYS_LCHMOD               = 274 // { int|sys||lchmod(const char *path, mode_t mode); }\n\tSYS_LCHOWN               = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_MSYNC                = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); }\n\tSYS___POSIX_CHOWN        = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); }\n\tSYS___POSIX_FCHOWN       = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS___POSIX_LCHOWN       = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_GETSID               = 286 // { pid_t|sys||getsid(pid_t pid); }\n\tSYS___CLONE              = 287 // { pid_t|sys||__clone(int flags, void *stack); }\n\tSYS_FKTRACE              = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); }\n\tSYS_PREADV               = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }\n\tSYS_PWRITEV              = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }\n\tSYS___GETCWD             = 296 // { int|sys||__getcwd(char *bufp, size_t length); }\n\tSYS_FCHROOT              = 297 // { int|sys||fchroot(int fd); }\n\tSYS_LCHFLAGS             = 304 // { int|sys||lchflags(const char *path, u_long flags); }\n\tSYS_ISSETUGID            = 305 // { int|sys||issetugid(void); }\n\tSYS_UTRACE               = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); }\n\tSYS_GETCONTEXT           = 307 // { int|sys||getcontext(struct __ucontext *ucp); }\n\tSYS_SETCONTEXT           = 308 // { int|sys||setcontext(const struct __ucontext *ucp); }\n\tSYS__LWP_CREATE          = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); }\n\tSYS__LWP_EXIT            = 310 // { int|sys||_lwp_exit(void); }\n\tSYS__LWP_SELF            = 311 // { lwpid_t|sys||_lwp_self(void); }\n\tSYS__LWP_WAIT            = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); }\n\tSYS__LWP_SUSPEND         = 313 // { int|sys||_lwp_suspend(lwpid_t target); }\n\tSYS__LWP_CONTINUE        = 314 // { int|sys||_lwp_continue(lwpid_t target); }\n\tSYS__LWP_WAKEUP          = 315 // { int|sys||_lwp_wakeup(lwpid_t target); }\n\tSYS__LWP_GETPRIVATE      = 316 // { void *|sys||_lwp_getprivate(void); }\n\tSYS__LWP_SETPRIVATE      = 317 // { void|sys||_lwp_setprivate(void *ptr); }\n\tSYS__LWP_KILL            = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); }\n\tSYS__LWP_DETACH          = 319 // { int|sys||_lwp_detach(lwpid_t target); }\n\tSYS__LWP_UNPARK          = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); }\n\tSYS__LWP_UNPARK_ALL      = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); }\n\tSYS__LWP_SETNAME         = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); }\n\tSYS__LWP_GETNAME         = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); }\n\tSYS__LWP_CTL             = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); }\n\tSYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); }\n\tSYS_PMC_GET_INFO         = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); }\n\tSYS_PMC_CONTROL          = 342 // { int|sys||pmc_control(int ctr, int op, void *args); }\n\tSYS_RASCTL               = 343 // { int|sys||rasctl(void *addr, size_t len, int op); }\n\tSYS_KQUEUE               = 344 // { int|sys||kqueue(void); }\n\tSYS__SCHED_SETPARAM      = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); }\n\tSYS__SCHED_GETPARAM      = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); }\n\tSYS__SCHED_SETAFFINITY   = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); }\n\tSYS__SCHED_GETAFFINITY   = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); }\n\tSYS_SCHED_YIELD          = 350 // { int|sys||sched_yield(void); }\n\tSYS_FSYNC_RANGE          = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); }\n\tSYS_UUIDGEN              = 355 // { int|sys||uuidgen(struct uuid *store, int count); }\n\tSYS_GETVFSSTAT           = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); }\n\tSYS_STATVFS1             = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); }\n\tSYS_FSTATVFS1            = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); }\n\tSYS_EXTATTRCTL           = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_FILE     = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_FILE     = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_FILE  = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_FD       = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_FD       = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_FD    = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_LINK     = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_LINK     = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_LINK  = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_LIST_FD      = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_EXTATTR_LIST_FILE    = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_EXTATTR_LIST_LINK    = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_SETXATTR             = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); }\n\tSYS_LSETXATTR            = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); }\n\tSYS_FSETXATTR            = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); }\n\tSYS_GETXATTR             = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); }\n\tSYS_LGETXATTR            = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); }\n\tSYS_FGETXATTR            = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); }\n\tSYS_LISTXATTR            = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); }\n\tSYS_LLISTXATTR           = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); }\n\tSYS_FLISTXATTR           = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); }\n\tSYS_REMOVEXATTR          = 384 // { int|sys||removexattr(const char *path, const char *name); }\n\tSYS_LREMOVEXATTR         = 385 // { int|sys||lremovexattr(const char *path, const char *name); }\n\tSYS_FREMOVEXATTR         = 386 // { int|sys||fremovexattr(int fd, const char *name); }\n\tSYS_GETDENTS             = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); }\n\tSYS_SOCKET               = 394 // { int|sys|30|socket(int domain, int type, int protocol); }\n\tSYS_GETFH                = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); }\n\tSYS_MOUNT                = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); }\n\tSYS_MREMAP               = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); }\n\tSYS_PSET_CREATE          = 412 // { int|sys||pset_create(psetid_t *psid); }\n\tSYS_PSET_DESTROY         = 413 // { int|sys||pset_destroy(psetid_t psid); }\n\tSYS_PSET_ASSIGN          = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); }\n\tSYS__PSET_BIND           = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); }\n\tSYS_POSIX_FADVISE        = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); }\n\tSYS_SELECT               = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }\n\tSYS_GETTIMEOFDAY         = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); }\n\tSYS_SETTIMEOFDAY         = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); }\n\tSYS_UTIMES               = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); }\n\tSYS_ADJTIME              = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); }\n\tSYS_FUTIMES              = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); }\n\tSYS_LUTIMES              = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); }\n\tSYS_SETITIMER            = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); }\n\tSYS_GETITIMER            = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); }\n\tSYS_CLOCK_GETTIME        = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); }\n\tSYS_CLOCK_SETTIME        = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); }\n\tSYS_CLOCK_GETRES         = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); }\n\tSYS_NANOSLEEP            = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }\n\tSYS___SIGTIMEDWAIT       = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); }\n\tSYS__LWP_PARK            = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); }\n\tSYS_KEVENT               = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); }\n\tSYS_PSELECT              = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); }\n\tSYS_POLLTS               = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); }\n\tSYS_STAT                 = 439 // { int|sys|50|stat(const char *path, struct stat *ub); }\n\tSYS_FSTAT                = 440 // { int|sys|50|fstat(int fd, struct stat *sb); }\n\tSYS_LSTAT                = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); }\n\tSYS___SEMCTL             = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); }\n\tSYS_SHMCTL               = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); }\n\tSYS_MSGCTL               = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); }\n\tSYS_GETRUSAGE            = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); }\n\tSYS_TIMER_SETTIME        = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }\n\tSYS_TIMER_GETTIME        = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); }\n\tSYS_NTP_GETTIME          = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); }\n\tSYS_WAIT4                = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); }\n\tSYS_MKNOD                = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); }\n\tSYS_FHSTAT               = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); }\n\tSYS_PIPE2                = 453 // { int|sys||pipe2(int *fildes, int flags); }\n\tSYS_DUP3                 = 454 // { int|sys||dup3(int from, int to, int flags); }\n\tSYS_KQUEUE1              = 455 // { int|sys||kqueue1(int flags); }\n\tSYS_PACCEPT              = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); }\n\tSYS_LINKAT               = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); }\n\tSYS_RENAMEAT             = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); }\n\tSYS_MKFIFOAT             = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); }\n\tSYS_MKNODAT              = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); }\n\tSYS_MKDIRAT              = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); }\n\tSYS_FACCESSAT            = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); }\n\tSYS_FCHMODAT             = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); }\n\tSYS_FCHOWNAT             = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); }\n\tSYS_FEXECVE              = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); }\n\tSYS_FSTATAT              = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); }\n\tSYS_UTIMENSAT            = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); }\n\tSYS_OPENAT               = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); }\n\tSYS_READLINKAT           = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); }\n\tSYS_SYMLINKAT            = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); }\n\tSYS_UNLINKAT             = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); }\n\tSYS_FUTIMENS             = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); }\n\tSYS___QUOTACTL           = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); }\n\tSYS_POSIX_SPAWN          = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); }\n\tSYS_RECVMMSG             = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }\n\tSYS_SENDMMSG             = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go",
    "content": "// mksysnum_netbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build amd64,netbsd\n\npackage unix\n\nconst (\n\tSYS_EXIT                 = 1   // { void|sys||exit(int rval); }\n\tSYS_FORK                 = 2   // { int|sys||fork(void); }\n\tSYS_READ                 = 3   // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); }\n\tSYS_WRITE                = 4   // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); }\n\tSYS_OPEN                 = 5   // { int|sys||open(const char *path, int flags, ... mode_t mode); }\n\tSYS_CLOSE                = 6   // { int|sys||close(int fd); }\n\tSYS_LINK                 = 9   // { int|sys||link(const char *path, const char *link); }\n\tSYS_UNLINK               = 10  // { int|sys||unlink(const char *path); }\n\tSYS_CHDIR                = 12  // { int|sys||chdir(const char *path); }\n\tSYS_FCHDIR               = 13  // { int|sys||fchdir(int fd); }\n\tSYS_CHMOD                = 15  // { int|sys||chmod(const char *path, mode_t mode); }\n\tSYS_CHOWN                = 16  // { int|sys||chown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_BREAK                = 17  // { int|sys||obreak(char *nsize); }\n\tSYS_GETPID               = 20  // { pid_t|sys||getpid_with_ppid(void); }\n\tSYS_UNMOUNT              = 22  // { int|sys||unmount(const char *path, int flags); }\n\tSYS_SETUID               = 23  // { int|sys||setuid(uid_t uid); }\n\tSYS_GETUID               = 24  // { uid_t|sys||getuid_with_euid(void); }\n\tSYS_GETEUID              = 25  // { uid_t|sys||geteuid(void); }\n\tSYS_PTRACE               = 26  // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); }\n\tSYS_RECVMSG              = 27  // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); }\n\tSYS_SENDMSG              = 28  // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); }\n\tSYS_RECVFROM             = 29  // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); }\n\tSYS_ACCEPT               = 30  // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); }\n\tSYS_GETPEERNAME          = 31  // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); }\n\tSYS_GETSOCKNAME          = 32  // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); }\n\tSYS_ACCESS               = 33  // { int|sys||access(const char *path, int flags); }\n\tSYS_CHFLAGS              = 34  // { int|sys||chflags(const char *path, u_long flags); }\n\tSYS_FCHFLAGS             = 35  // { int|sys||fchflags(int fd, u_long flags); }\n\tSYS_SYNC                 = 36  // { void|sys||sync(void); }\n\tSYS_KILL                 = 37  // { int|sys||kill(pid_t pid, int signum); }\n\tSYS_GETPPID              = 39  // { pid_t|sys||getppid(void); }\n\tSYS_DUP                  = 41  // { int|sys||dup(int fd); }\n\tSYS_PIPE                 = 42  // { int|sys||pipe(void); }\n\tSYS_GETEGID              = 43  // { gid_t|sys||getegid(void); }\n\tSYS_PROFIL               = 44  // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); }\n\tSYS_KTRACE               = 45  // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); }\n\tSYS_GETGID               = 47  // { gid_t|sys||getgid_with_egid(void); }\n\tSYS___GETLOGIN           = 49  // { int|sys||__getlogin(char *namebuf, size_t namelen); }\n\tSYS___SETLOGIN           = 50  // { int|sys||__setlogin(const char *namebuf); }\n\tSYS_ACCT                 = 51  // { int|sys||acct(const char *path); }\n\tSYS_IOCTL                = 54  // { int|sys||ioctl(int fd, u_long com, ... void *data); }\n\tSYS_REVOKE               = 56  // { int|sys||revoke(const char *path); }\n\tSYS_SYMLINK              = 57  // { int|sys||symlink(const char *path, const char *link); }\n\tSYS_READLINK             = 58  // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); }\n\tSYS_EXECVE               = 59  // { int|sys||execve(const char *path, char * const *argp, char * const *envp); }\n\tSYS_UMASK                = 60  // { mode_t|sys||umask(mode_t newmask); }\n\tSYS_CHROOT               = 61  // { int|sys||chroot(const char *path); }\n\tSYS_VFORK                = 66  // { int|sys||vfork(void); }\n\tSYS_SBRK                 = 69  // { int|sys||sbrk(intptr_t incr); }\n\tSYS_SSTK                 = 70  // { int|sys||sstk(int incr); }\n\tSYS_VADVISE              = 72  // { int|sys||ovadvise(int anom); }\n\tSYS_MUNMAP               = 73  // { int|sys||munmap(void *addr, size_t len); }\n\tSYS_MPROTECT             = 74  // { int|sys||mprotect(void *addr, size_t len, int prot); }\n\tSYS_MADVISE              = 75  // { int|sys||madvise(void *addr, size_t len, int behav); }\n\tSYS_MINCORE              = 78  // { int|sys||mincore(void *addr, size_t len, char *vec); }\n\tSYS_GETGROUPS            = 79  // { int|sys||getgroups(int gidsetsize, gid_t *gidset); }\n\tSYS_SETGROUPS            = 80  // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); }\n\tSYS_GETPGRP              = 81  // { int|sys||getpgrp(void); }\n\tSYS_SETPGID              = 82  // { int|sys||setpgid(pid_t pid, pid_t pgid); }\n\tSYS_DUP2                 = 90  // { int|sys||dup2(int from, int to); }\n\tSYS_FCNTL                = 92  // { int|sys||fcntl(int fd, int cmd, ... void *arg); }\n\tSYS_FSYNC                = 95  // { int|sys||fsync(int fd); }\n\tSYS_SETPRIORITY          = 96  // { int|sys||setpriority(int which, id_t who, int prio); }\n\tSYS_CONNECT              = 98  // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); }\n\tSYS_GETPRIORITY          = 100 // { int|sys||getpriority(int which, id_t who); }\n\tSYS_BIND                 = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); }\n\tSYS_SETSOCKOPT           = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); }\n\tSYS_LISTEN               = 106 // { int|sys||listen(int s, int backlog); }\n\tSYS_GETSOCKOPT           = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); }\n\tSYS_READV                = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); }\n\tSYS_WRITEV               = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); }\n\tSYS_FCHOWN               = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS_FCHMOD               = 124 // { int|sys||fchmod(int fd, mode_t mode); }\n\tSYS_SETREUID             = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); }\n\tSYS_SETREGID             = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); }\n\tSYS_RENAME               = 128 // { int|sys||rename(const char *from, const char *to); }\n\tSYS_FLOCK                = 131 // { int|sys||flock(int fd, int how); }\n\tSYS_MKFIFO               = 132 // { int|sys||mkfifo(const char *path, mode_t mode); }\n\tSYS_SENDTO               = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); }\n\tSYS_SHUTDOWN             = 134 // { int|sys||shutdown(int s, int how); }\n\tSYS_SOCKETPAIR           = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); }\n\tSYS_MKDIR                = 136 // { int|sys||mkdir(const char *path, mode_t mode); }\n\tSYS_RMDIR                = 137 // { int|sys||rmdir(const char *path); }\n\tSYS_SETSID               = 147 // { int|sys||setsid(void); }\n\tSYS_SYSARCH              = 165 // { int|sys||sysarch(int op, void *parms); }\n\tSYS_PREAD                = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); }\n\tSYS_PWRITE               = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); }\n\tSYS_NTP_ADJTIME          = 176 // { int|sys||ntp_adjtime(struct timex *tp); }\n\tSYS_SETGID               = 181 // { int|sys||setgid(gid_t gid); }\n\tSYS_SETEGID              = 182 // { int|sys||setegid(gid_t egid); }\n\tSYS_SETEUID              = 183 // { int|sys||seteuid(uid_t euid); }\n\tSYS_PATHCONF             = 191 // { long|sys||pathconf(const char *path, int name); }\n\tSYS_FPATHCONF            = 192 // { long|sys||fpathconf(int fd, int name); }\n\tSYS_GETRLIMIT            = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); }\n\tSYS_SETRLIMIT            = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); }\n\tSYS_MMAP                 = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); }\n\tSYS_LSEEK                = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); }\n\tSYS_TRUNCATE             = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); }\n\tSYS_FTRUNCATE            = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); }\n\tSYS___SYSCTL             = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); }\n\tSYS_MLOCK                = 203 // { int|sys||mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK              = 204 // { int|sys||munlock(const void *addr, size_t len); }\n\tSYS_UNDELETE             = 205 // { int|sys||undelete(const char *path); }\n\tSYS_GETPGID              = 207 // { pid_t|sys||getpgid(pid_t pid); }\n\tSYS_REBOOT               = 208 // { int|sys||reboot(int opt, char *bootstr); }\n\tSYS_POLL                 = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); }\n\tSYS_SEMGET               = 221 // { int|sys||semget(key_t key, int nsems, int semflg); }\n\tSYS_SEMOP                = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); }\n\tSYS_SEMCONFIG            = 223 // { int|sys||semconfig(int flag); }\n\tSYS_MSGGET               = 225 // { int|sys||msgget(key_t key, int msgflg); }\n\tSYS_MSGSND               = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }\n\tSYS_MSGRCV               = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }\n\tSYS_SHMAT                = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); }\n\tSYS_SHMDT                = 230 // { int|sys||shmdt(const void *shmaddr); }\n\tSYS_SHMGET               = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); }\n\tSYS_TIMER_CREATE         = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); }\n\tSYS_TIMER_DELETE         = 236 // { int|sys||timer_delete(timer_t timerid); }\n\tSYS_TIMER_GETOVERRUN     = 239 // { int|sys||timer_getoverrun(timer_t timerid); }\n\tSYS_FDATASYNC            = 241 // { int|sys||fdatasync(int fd); }\n\tSYS_MLOCKALL             = 242 // { int|sys||mlockall(int flags); }\n\tSYS_MUNLOCKALL           = 243 // { int|sys||munlockall(void); }\n\tSYS_SIGQUEUEINFO         = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); }\n\tSYS_MODCTL               = 246 // { int|sys||modctl(int cmd, void *arg); }\n\tSYS___POSIX_RENAME       = 270 // { int|sys||__posix_rename(const char *from, const char *to); }\n\tSYS_SWAPCTL              = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); }\n\tSYS_MINHERIT             = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); }\n\tSYS_LCHMOD               = 274 // { int|sys||lchmod(const char *path, mode_t mode); }\n\tSYS_LCHOWN               = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_MSYNC                = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); }\n\tSYS___POSIX_CHOWN        = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); }\n\tSYS___POSIX_FCHOWN       = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS___POSIX_LCHOWN       = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_GETSID               = 286 // { pid_t|sys||getsid(pid_t pid); }\n\tSYS___CLONE              = 287 // { pid_t|sys||__clone(int flags, void *stack); }\n\tSYS_FKTRACE              = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); }\n\tSYS_PREADV               = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }\n\tSYS_PWRITEV              = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }\n\tSYS___GETCWD             = 296 // { int|sys||__getcwd(char *bufp, size_t length); }\n\tSYS_FCHROOT              = 297 // { int|sys||fchroot(int fd); }\n\tSYS_LCHFLAGS             = 304 // { int|sys||lchflags(const char *path, u_long flags); }\n\tSYS_ISSETUGID            = 305 // { int|sys||issetugid(void); }\n\tSYS_UTRACE               = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); }\n\tSYS_GETCONTEXT           = 307 // { int|sys||getcontext(struct __ucontext *ucp); }\n\tSYS_SETCONTEXT           = 308 // { int|sys||setcontext(const struct __ucontext *ucp); }\n\tSYS__LWP_CREATE          = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); }\n\tSYS__LWP_EXIT            = 310 // { int|sys||_lwp_exit(void); }\n\tSYS__LWP_SELF            = 311 // { lwpid_t|sys||_lwp_self(void); }\n\tSYS__LWP_WAIT            = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); }\n\tSYS__LWP_SUSPEND         = 313 // { int|sys||_lwp_suspend(lwpid_t target); }\n\tSYS__LWP_CONTINUE        = 314 // { int|sys||_lwp_continue(lwpid_t target); }\n\tSYS__LWP_WAKEUP          = 315 // { int|sys||_lwp_wakeup(lwpid_t target); }\n\tSYS__LWP_GETPRIVATE      = 316 // { void *|sys||_lwp_getprivate(void); }\n\tSYS__LWP_SETPRIVATE      = 317 // { void|sys||_lwp_setprivate(void *ptr); }\n\tSYS__LWP_KILL            = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); }\n\tSYS__LWP_DETACH          = 319 // { int|sys||_lwp_detach(lwpid_t target); }\n\tSYS__LWP_UNPARK          = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); }\n\tSYS__LWP_UNPARK_ALL      = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); }\n\tSYS__LWP_SETNAME         = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); }\n\tSYS__LWP_GETNAME         = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); }\n\tSYS__LWP_CTL             = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); }\n\tSYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); }\n\tSYS_PMC_GET_INFO         = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); }\n\tSYS_PMC_CONTROL          = 342 // { int|sys||pmc_control(int ctr, int op, void *args); }\n\tSYS_RASCTL               = 343 // { int|sys||rasctl(void *addr, size_t len, int op); }\n\tSYS_KQUEUE               = 344 // { int|sys||kqueue(void); }\n\tSYS__SCHED_SETPARAM      = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); }\n\tSYS__SCHED_GETPARAM      = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); }\n\tSYS__SCHED_SETAFFINITY   = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); }\n\tSYS__SCHED_GETAFFINITY   = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); }\n\tSYS_SCHED_YIELD          = 350 // { int|sys||sched_yield(void); }\n\tSYS_FSYNC_RANGE          = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); }\n\tSYS_UUIDGEN              = 355 // { int|sys||uuidgen(struct uuid *store, int count); }\n\tSYS_GETVFSSTAT           = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); }\n\tSYS_STATVFS1             = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); }\n\tSYS_FSTATVFS1            = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); }\n\tSYS_EXTATTRCTL           = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_FILE     = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_FILE     = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_FILE  = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_FD       = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_FD       = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_FD    = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_LINK     = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_LINK     = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_LINK  = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_LIST_FD      = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_EXTATTR_LIST_FILE    = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_EXTATTR_LIST_LINK    = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_SETXATTR             = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); }\n\tSYS_LSETXATTR            = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); }\n\tSYS_FSETXATTR            = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); }\n\tSYS_GETXATTR             = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); }\n\tSYS_LGETXATTR            = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); }\n\tSYS_FGETXATTR            = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); }\n\tSYS_LISTXATTR            = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); }\n\tSYS_LLISTXATTR           = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); }\n\tSYS_FLISTXATTR           = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); }\n\tSYS_REMOVEXATTR          = 384 // { int|sys||removexattr(const char *path, const char *name); }\n\tSYS_LREMOVEXATTR         = 385 // { int|sys||lremovexattr(const char *path, const char *name); }\n\tSYS_FREMOVEXATTR         = 386 // { int|sys||fremovexattr(int fd, const char *name); }\n\tSYS_GETDENTS             = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); }\n\tSYS_SOCKET               = 394 // { int|sys|30|socket(int domain, int type, int protocol); }\n\tSYS_GETFH                = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); }\n\tSYS_MOUNT                = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); }\n\tSYS_MREMAP               = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); }\n\tSYS_PSET_CREATE          = 412 // { int|sys||pset_create(psetid_t *psid); }\n\tSYS_PSET_DESTROY         = 413 // { int|sys||pset_destroy(psetid_t psid); }\n\tSYS_PSET_ASSIGN          = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); }\n\tSYS__PSET_BIND           = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); }\n\tSYS_POSIX_FADVISE        = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); }\n\tSYS_SELECT               = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }\n\tSYS_GETTIMEOFDAY         = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); }\n\tSYS_SETTIMEOFDAY         = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); }\n\tSYS_UTIMES               = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); }\n\tSYS_ADJTIME              = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); }\n\tSYS_FUTIMES              = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); }\n\tSYS_LUTIMES              = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); }\n\tSYS_SETITIMER            = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); }\n\tSYS_GETITIMER            = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); }\n\tSYS_CLOCK_GETTIME        = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); }\n\tSYS_CLOCK_SETTIME        = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); }\n\tSYS_CLOCK_GETRES         = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); }\n\tSYS_NANOSLEEP            = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }\n\tSYS___SIGTIMEDWAIT       = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); }\n\tSYS__LWP_PARK            = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); }\n\tSYS_KEVENT               = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); }\n\tSYS_PSELECT              = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); }\n\tSYS_POLLTS               = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); }\n\tSYS_STAT                 = 439 // { int|sys|50|stat(const char *path, struct stat *ub); }\n\tSYS_FSTAT                = 440 // { int|sys|50|fstat(int fd, struct stat *sb); }\n\tSYS_LSTAT                = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); }\n\tSYS___SEMCTL             = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); }\n\tSYS_SHMCTL               = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); }\n\tSYS_MSGCTL               = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); }\n\tSYS_GETRUSAGE            = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); }\n\tSYS_TIMER_SETTIME        = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }\n\tSYS_TIMER_GETTIME        = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); }\n\tSYS_NTP_GETTIME          = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); }\n\tSYS_WAIT4                = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); }\n\tSYS_MKNOD                = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); }\n\tSYS_FHSTAT               = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); }\n\tSYS_PIPE2                = 453 // { int|sys||pipe2(int *fildes, int flags); }\n\tSYS_DUP3                 = 454 // { int|sys||dup3(int from, int to, int flags); }\n\tSYS_KQUEUE1              = 455 // { int|sys||kqueue1(int flags); }\n\tSYS_PACCEPT              = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); }\n\tSYS_LINKAT               = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); }\n\tSYS_RENAMEAT             = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); }\n\tSYS_MKFIFOAT             = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); }\n\tSYS_MKNODAT              = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); }\n\tSYS_MKDIRAT              = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); }\n\tSYS_FACCESSAT            = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); }\n\tSYS_FCHMODAT             = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); }\n\tSYS_FCHOWNAT             = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); }\n\tSYS_FEXECVE              = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); }\n\tSYS_FSTATAT              = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); }\n\tSYS_UTIMENSAT            = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); }\n\tSYS_OPENAT               = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); }\n\tSYS_READLINKAT           = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); }\n\tSYS_SYMLINKAT            = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); }\n\tSYS_UNLINKAT             = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); }\n\tSYS_FUTIMENS             = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); }\n\tSYS___QUOTACTL           = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); }\n\tSYS_POSIX_SPAWN          = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); }\n\tSYS_RECVMMSG             = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }\n\tSYS_SENDMMSG             = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go",
    "content": "// mksysnum_netbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build arm,netbsd\n\npackage unix\n\nconst (\n\tSYS_EXIT                 = 1   // { void|sys||exit(int rval); }\n\tSYS_FORK                 = 2   // { int|sys||fork(void); }\n\tSYS_READ                 = 3   // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); }\n\tSYS_WRITE                = 4   // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); }\n\tSYS_OPEN                 = 5   // { int|sys||open(const char *path, int flags, ... mode_t mode); }\n\tSYS_CLOSE                = 6   // { int|sys||close(int fd); }\n\tSYS_LINK                 = 9   // { int|sys||link(const char *path, const char *link); }\n\tSYS_UNLINK               = 10  // { int|sys||unlink(const char *path); }\n\tSYS_CHDIR                = 12  // { int|sys||chdir(const char *path); }\n\tSYS_FCHDIR               = 13  // { int|sys||fchdir(int fd); }\n\tSYS_CHMOD                = 15  // { int|sys||chmod(const char *path, mode_t mode); }\n\tSYS_CHOWN                = 16  // { int|sys||chown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_BREAK                = 17  // { int|sys||obreak(char *nsize); }\n\tSYS_GETPID               = 20  // { pid_t|sys||getpid_with_ppid(void); }\n\tSYS_UNMOUNT              = 22  // { int|sys||unmount(const char *path, int flags); }\n\tSYS_SETUID               = 23  // { int|sys||setuid(uid_t uid); }\n\tSYS_GETUID               = 24  // { uid_t|sys||getuid_with_euid(void); }\n\tSYS_GETEUID              = 25  // { uid_t|sys||geteuid(void); }\n\tSYS_PTRACE               = 26  // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); }\n\tSYS_RECVMSG              = 27  // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); }\n\tSYS_SENDMSG              = 28  // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); }\n\tSYS_RECVFROM             = 29  // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); }\n\tSYS_ACCEPT               = 30  // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); }\n\tSYS_GETPEERNAME          = 31  // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); }\n\tSYS_GETSOCKNAME          = 32  // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); }\n\tSYS_ACCESS               = 33  // { int|sys||access(const char *path, int flags); }\n\tSYS_CHFLAGS              = 34  // { int|sys||chflags(const char *path, u_long flags); }\n\tSYS_FCHFLAGS             = 35  // { int|sys||fchflags(int fd, u_long flags); }\n\tSYS_SYNC                 = 36  // { void|sys||sync(void); }\n\tSYS_KILL                 = 37  // { int|sys||kill(pid_t pid, int signum); }\n\tSYS_GETPPID              = 39  // { pid_t|sys||getppid(void); }\n\tSYS_DUP                  = 41  // { int|sys||dup(int fd); }\n\tSYS_PIPE                 = 42  // { int|sys||pipe(void); }\n\tSYS_GETEGID              = 43  // { gid_t|sys||getegid(void); }\n\tSYS_PROFIL               = 44  // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); }\n\tSYS_KTRACE               = 45  // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); }\n\tSYS_GETGID               = 47  // { gid_t|sys||getgid_with_egid(void); }\n\tSYS___GETLOGIN           = 49  // { int|sys||__getlogin(char *namebuf, size_t namelen); }\n\tSYS___SETLOGIN           = 50  // { int|sys||__setlogin(const char *namebuf); }\n\tSYS_ACCT                 = 51  // { int|sys||acct(const char *path); }\n\tSYS_IOCTL                = 54  // { int|sys||ioctl(int fd, u_long com, ... void *data); }\n\tSYS_REVOKE               = 56  // { int|sys||revoke(const char *path); }\n\tSYS_SYMLINK              = 57  // { int|sys||symlink(const char *path, const char *link); }\n\tSYS_READLINK             = 58  // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); }\n\tSYS_EXECVE               = 59  // { int|sys||execve(const char *path, char * const *argp, char * const *envp); }\n\tSYS_UMASK                = 60  // { mode_t|sys||umask(mode_t newmask); }\n\tSYS_CHROOT               = 61  // { int|sys||chroot(const char *path); }\n\tSYS_VFORK                = 66  // { int|sys||vfork(void); }\n\tSYS_SBRK                 = 69  // { int|sys||sbrk(intptr_t incr); }\n\tSYS_SSTK                 = 70  // { int|sys||sstk(int incr); }\n\tSYS_VADVISE              = 72  // { int|sys||ovadvise(int anom); }\n\tSYS_MUNMAP               = 73  // { int|sys||munmap(void *addr, size_t len); }\n\tSYS_MPROTECT             = 74  // { int|sys||mprotect(void *addr, size_t len, int prot); }\n\tSYS_MADVISE              = 75  // { int|sys||madvise(void *addr, size_t len, int behav); }\n\tSYS_MINCORE              = 78  // { int|sys||mincore(void *addr, size_t len, char *vec); }\n\tSYS_GETGROUPS            = 79  // { int|sys||getgroups(int gidsetsize, gid_t *gidset); }\n\tSYS_SETGROUPS            = 80  // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); }\n\tSYS_GETPGRP              = 81  // { int|sys||getpgrp(void); }\n\tSYS_SETPGID              = 82  // { int|sys||setpgid(pid_t pid, pid_t pgid); }\n\tSYS_DUP2                 = 90  // { int|sys||dup2(int from, int to); }\n\tSYS_FCNTL                = 92  // { int|sys||fcntl(int fd, int cmd, ... void *arg); }\n\tSYS_FSYNC                = 95  // { int|sys||fsync(int fd); }\n\tSYS_SETPRIORITY          = 96  // { int|sys||setpriority(int which, id_t who, int prio); }\n\tSYS_CONNECT              = 98  // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); }\n\tSYS_GETPRIORITY          = 100 // { int|sys||getpriority(int which, id_t who); }\n\tSYS_BIND                 = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); }\n\tSYS_SETSOCKOPT           = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); }\n\tSYS_LISTEN               = 106 // { int|sys||listen(int s, int backlog); }\n\tSYS_GETSOCKOPT           = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); }\n\tSYS_READV                = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); }\n\tSYS_WRITEV               = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); }\n\tSYS_FCHOWN               = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS_FCHMOD               = 124 // { int|sys||fchmod(int fd, mode_t mode); }\n\tSYS_SETREUID             = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); }\n\tSYS_SETREGID             = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); }\n\tSYS_RENAME               = 128 // { int|sys||rename(const char *from, const char *to); }\n\tSYS_FLOCK                = 131 // { int|sys||flock(int fd, int how); }\n\tSYS_MKFIFO               = 132 // { int|sys||mkfifo(const char *path, mode_t mode); }\n\tSYS_SENDTO               = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); }\n\tSYS_SHUTDOWN             = 134 // { int|sys||shutdown(int s, int how); }\n\tSYS_SOCKETPAIR           = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); }\n\tSYS_MKDIR                = 136 // { int|sys||mkdir(const char *path, mode_t mode); }\n\tSYS_RMDIR                = 137 // { int|sys||rmdir(const char *path); }\n\tSYS_SETSID               = 147 // { int|sys||setsid(void); }\n\tSYS_SYSARCH              = 165 // { int|sys||sysarch(int op, void *parms); }\n\tSYS_PREAD                = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); }\n\tSYS_PWRITE               = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); }\n\tSYS_NTP_ADJTIME          = 176 // { int|sys||ntp_adjtime(struct timex *tp); }\n\tSYS_SETGID               = 181 // { int|sys||setgid(gid_t gid); }\n\tSYS_SETEGID              = 182 // { int|sys||setegid(gid_t egid); }\n\tSYS_SETEUID              = 183 // { int|sys||seteuid(uid_t euid); }\n\tSYS_PATHCONF             = 191 // { long|sys||pathconf(const char *path, int name); }\n\tSYS_FPATHCONF            = 192 // { long|sys||fpathconf(int fd, int name); }\n\tSYS_GETRLIMIT            = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); }\n\tSYS_SETRLIMIT            = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); }\n\tSYS_MMAP                 = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); }\n\tSYS_LSEEK                = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); }\n\tSYS_TRUNCATE             = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); }\n\tSYS_FTRUNCATE            = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); }\n\tSYS___SYSCTL             = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); }\n\tSYS_MLOCK                = 203 // { int|sys||mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK              = 204 // { int|sys||munlock(const void *addr, size_t len); }\n\tSYS_UNDELETE             = 205 // { int|sys||undelete(const char *path); }\n\tSYS_GETPGID              = 207 // { pid_t|sys||getpgid(pid_t pid); }\n\tSYS_REBOOT               = 208 // { int|sys||reboot(int opt, char *bootstr); }\n\tSYS_POLL                 = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); }\n\tSYS_SEMGET               = 221 // { int|sys||semget(key_t key, int nsems, int semflg); }\n\tSYS_SEMOP                = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); }\n\tSYS_SEMCONFIG            = 223 // { int|sys||semconfig(int flag); }\n\tSYS_MSGGET               = 225 // { int|sys||msgget(key_t key, int msgflg); }\n\tSYS_MSGSND               = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); }\n\tSYS_MSGRCV               = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); }\n\tSYS_SHMAT                = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); }\n\tSYS_SHMDT                = 230 // { int|sys||shmdt(const void *shmaddr); }\n\tSYS_SHMGET               = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); }\n\tSYS_TIMER_CREATE         = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); }\n\tSYS_TIMER_DELETE         = 236 // { int|sys||timer_delete(timer_t timerid); }\n\tSYS_TIMER_GETOVERRUN     = 239 // { int|sys||timer_getoverrun(timer_t timerid); }\n\tSYS_FDATASYNC            = 241 // { int|sys||fdatasync(int fd); }\n\tSYS_MLOCKALL             = 242 // { int|sys||mlockall(int flags); }\n\tSYS_MUNLOCKALL           = 243 // { int|sys||munlockall(void); }\n\tSYS_SIGQUEUEINFO         = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); }\n\tSYS_MODCTL               = 246 // { int|sys||modctl(int cmd, void *arg); }\n\tSYS___POSIX_RENAME       = 270 // { int|sys||__posix_rename(const char *from, const char *to); }\n\tSYS_SWAPCTL              = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); }\n\tSYS_MINHERIT             = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); }\n\tSYS_LCHMOD               = 274 // { int|sys||lchmod(const char *path, mode_t mode); }\n\tSYS_LCHOWN               = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_MSYNC                = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); }\n\tSYS___POSIX_CHOWN        = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); }\n\tSYS___POSIX_FCHOWN       = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS___POSIX_LCHOWN       = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_GETSID               = 286 // { pid_t|sys||getsid(pid_t pid); }\n\tSYS___CLONE              = 287 // { pid_t|sys||__clone(int flags, void *stack); }\n\tSYS_FKTRACE              = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); }\n\tSYS_PREADV               = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }\n\tSYS_PWRITEV              = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); }\n\tSYS___GETCWD             = 296 // { int|sys||__getcwd(char *bufp, size_t length); }\n\tSYS_FCHROOT              = 297 // { int|sys||fchroot(int fd); }\n\tSYS_LCHFLAGS             = 304 // { int|sys||lchflags(const char *path, u_long flags); }\n\tSYS_ISSETUGID            = 305 // { int|sys||issetugid(void); }\n\tSYS_UTRACE               = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); }\n\tSYS_GETCONTEXT           = 307 // { int|sys||getcontext(struct __ucontext *ucp); }\n\tSYS_SETCONTEXT           = 308 // { int|sys||setcontext(const struct __ucontext *ucp); }\n\tSYS__LWP_CREATE          = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); }\n\tSYS__LWP_EXIT            = 310 // { int|sys||_lwp_exit(void); }\n\tSYS__LWP_SELF            = 311 // { lwpid_t|sys||_lwp_self(void); }\n\tSYS__LWP_WAIT            = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); }\n\tSYS__LWP_SUSPEND         = 313 // { int|sys||_lwp_suspend(lwpid_t target); }\n\tSYS__LWP_CONTINUE        = 314 // { int|sys||_lwp_continue(lwpid_t target); }\n\tSYS__LWP_WAKEUP          = 315 // { int|sys||_lwp_wakeup(lwpid_t target); }\n\tSYS__LWP_GETPRIVATE      = 316 // { void *|sys||_lwp_getprivate(void); }\n\tSYS__LWP_SETPRIVATE      = 317 // { void|sys||_lwp_setprivate(void *ptr); }\n\tSYS__LWP_KILL            = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); }\n\tSYS__LWP_DETACH          = 319 // { int|sys||_lwp_detach(lwpid_t target); }\n\tSYS__LWP_UNPARK          = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); }\n\tSYS__LWP_UNPARK_ALL      = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); }\n\tSYS__LWP_SETNAME         = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); }\n\tSYS__LWP_GETNAME         = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); }\n\tSYS__LWP_CTL             = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); }\n\tSYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); }\n\tSYS_PMC_GET_INFO         = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); }\n\tSYS_PMC_CONTROL          = 342 // { int|sys||pmc_control(int ctr, int op, void *args); }\n\tSYS_RASCTL               = 343 // { int|sys||rasctl(void *addr, size_t len, int op); }\n\tSYS_KQUEUE               = 344 // { int|sys||kqueue(void); }\n\tSYS__SCHED_SETPARAM      = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); }\n\tSYS__SCHED_GETPARAM      = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); }\n\tSYS__SCHED_SETAFFINITY   = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); }\n\tSYS__SCHED_GETAFFINITY   = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); }\n\tSYS_SCHED_YIELD          = 350 // { int|sys||sched_yield(void); }\n\tSYS_FSYNC_RANGE          = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); }\n\tSYS_UUIDGEN              = 355 // { int|sys||uuidgen(struct uuid *store, int count); }\n\tSYS_GETVFSSTAT           = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); }\n\tSYS_STATVFS1             = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); }\n\tSYS_FSTATVFS1            = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); }\n\tSYS_EXTATTRCTL           = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_FILE     = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_FILE     = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_FILE  = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_FD       = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_FD       = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_FD    = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_SET_LINK     = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); }\n\tSYS_EXTATTR_GET_LINK     = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); }\n\tSYS_EXTATTR_DELETE_LINK  = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); }\n\tSYS_EXTATTR_LIST_FD      = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_EXTATTR_LIST_FILE    = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_EXTATTR_LIST_LINK    = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); }\n\tSYS_SETXATTR             = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); }\n\tSYS_LSETXATTR            = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); }\n\tSYS_FSETXATTR            = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); }\n\tSYS_GETXATTR             = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); }\n\tSYS_LGETXATTR            = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); }\n\tSYS_FGETXATTR            = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); }\n\tSYS_LISTXATTR            = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); }\n\tSYS_LLISTXATTR           = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); }\n\tSYS_FLISTXATTR           = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); }\n\tSYS_REMOVEXATTR          = 384 // { int|sys||removexattr(const char *path, const char *name); }\n\tSYS_LREMOVEXATTR         = 385 // { int|sys||lremovexattr(const char *path, const char *name); }\n\tSYS_FREMOVEXATTR         = 386 // { int|sys||fremovexattr(int fd, const char *name); }\n\tSYS_GETDENTS             = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); }\n\tSYS_SOCKET               = 394 // { int|sys|30|socket(int domain, int type, int protocol); }\n\tSYS_GETFH                = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); }\n\tSYS_MOUNT                = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); }\n\tSYS_MREMAP               = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); }\n\tSYS_PSET_CREATE          = 412 // { int|sys||pset_create(psetid_t *psid); }\n\tSYS_PSET_DESTROY         = 413 // { int|sys||pset_destroy(psetid_t psid); }\n\tSYS_PSET_ASSIGN          = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); }\n\tSYS__PSET_BIND           = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); }\n\tSYS_POSIX_FADVISE        = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); }\n\tSYS_SELECT               = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); }\n\tSYS_GETTIMEOFDAY         = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); }\n\tSYS_SETTIMEOFDAY         = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); }\n\tSYS_UTIMES               = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); }\n\tSYS_ADJTIME              = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); }\n\tSYS_FUTIMES              = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); }\n\tSYS_LUTIMES              = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); }\n\tSYS_SETITIMER            = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); }\n\tSYS_GETITIMER            = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); }\n\tSYS_CLOCK_GETTIME        = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); }\n\tSYS_CLOCK_SETTIME        = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); }\n\tSYS_CLOCK_GETRES         = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); }\n\tSYS_NANOSLEEP            = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); }\n\tSYS___SIGTIMEDWAIT       = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); }\n\tSYS__LWP_PARK            = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); }\n\tSYS_KEVENT               = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); }\n\tSYS_PSELECT              = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); }\n\tSYS_POLLTS               = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); }\n\tSYS_STAT                 = 439 // { int|sys|50|stat(const char *path, struct stat *ub); }\n\tSYS_FSTAT                = 440 // { int|sys|50|fstat(int fd, struct stat *sb); }\n\tSYS_LSTAT                = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); }\n\tSYS___SEMCTL             = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); }\n\tSYS_SHMCTL               = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); }\n\tSYS_MSGCTL               = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); }\n\tSYS_GETRUSAGE            = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); }\n\tSYS_TIMER_SETTIME        = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); }\n\tSYS_TIMER_GETTIME        = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); }\n\tSYS_NTP_GETTIME          = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); }\n\tSYS_WAIT4                = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); }\n\tSYS_MKNOD                = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); }\n\tSYS_FHSTAT               = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); }\n\tSYS_PIPE2                = 453 // { int|sys||pipe2(int *fildes, int flags); }\n\tSYS_DUP3                 = 454 // { int|sys||dup3(int from, int to, int flags); }\n\tSYS_KQUEUE1              = 455 // { int|sys||kqueue1(int flags); }\n\tSYS_PACCEPT              = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); }\n\tSYS_LINKAT               = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); }\n\tSYS_RENAMEAT             = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); }\n\tSYS_MKFIFOAT             = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); }\n\tSYS_MKNODAT              = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); }\n\tSYS_MKDIRAT              = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); }\n\tSYS_FACCESSAT            = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); }\n\tSYS_FCHMODAT             = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); }\n\tSYS_FCHOWNAT             = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); }\n\tSYS_FEXECVE              = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); }\n\tSYS_FSTATAT              = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); }\n\tSYS_UTIMENSAT            = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); }\n\tSYS_OPENAT               = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); }\n\tSYS_READLINKAT           = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); }\n\tSYS_SYMLINKAT            = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); }\n\tSYS_UNLINKAT             = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); }\n\tSYS_FUTIMENS             = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); }\n\tSYS___QUOTACTL           = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); }\n\tSYS_POSIX_SPAWN          = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); }\n\tSYS_RECVMMSG             = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); }\n\tSYS_SENDMMSG             = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); }\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go",
    "content": "// mksysnum_openbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build 386,openbsd\n\npackage unix\n\nconst (\n\tSYS_EXIT           = 1   // { void sys_exit(int rval); }\n\tSYS_FORK           = 2   // { int sys_fork(void); }\n\tSYS_READ           = 3   // { ssize_t sys_read(int fd, void *buf, size_t nbyte); }\n\tSYS_WRITE          = 4   // { ssize_t sys_write(int fd, const void *buf, \\\n\tSYS_OPEN           = 5   // { int sys_open(const char *path, \\\n\tSYS_CLOSE          = 6   // { int sys_close(int fd); }\n\tSYS___TFORK        = 8   // { int sys___tfork(const struct __tfork *param, \\\n\tSYS_LINK           = 9   // { int sys_link(const char *path, const char *link); }\n\tSYS_UNLINK         = 10  // { int sys_unlink(const char *path); }\n\tSYS_WAIT4          = 11  // { pid_t sys_wait4(pid_t pid, int *status, \\\n\tSYS_CHDIR          = 12  // { int sys_chdir(const char *path); }\n\tSYS_FCHDIR         = 13  // { int sys_fchdir(int fd); }\n\tSYS_MKNOD          = 14  // { int sys_mknod(const char *path, mode_t mode, \\\n\tSYS_CHMOD          = 15  // { int sys_chmod(const char *path, mode_t mode); }\n\tSYS_CHOWN          = 16  // { int sys_chown(const char *path, uid_t uid, \\\n\tSYS_OBREAK         = 17  // { int sys_obreak(char *nsize); } break\n\tSYS_GETDTABLECOUNT = 18  // { int sys_getdtablecount(void); }\n\tSYS_GETRUSAGE      = 19  // { int sys_getrusage(int who, \\\n\tSYS_GETPID         = 20  // { pid_t sys_getpid(void); }\n\tSYS_MOUNT          = 21  // { int sys_mount(const char *type, const char *path, \\\n\tSYS_UNMOUNT        = 22  // { int sys_unmount(const char *path, int flags); }\n\tSYS_SETUID         = 23  // { int sys_setuid(uid_t uid); }\n\tSYS_GETUID         = 24  // { uid_t sys_getuid(void); }\n\tSYS_GETEUID        = 25  // { uid_t sys_geteuid(void); }\n\tSYS_PTRACE         = 26  // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \\\n\tSYS_RECVMSG        = 27  // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \\\n\tSYS_SENDMSG        = 28  // { ssize_t sys_sendmsg(int s, \\\n\tSYS_RECVFROM       = 29  // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \\\n\tSYS_ACCEPT         = 30  // { int sys_accept(int s, struct sockaddr *name, \\\n\tSYS_GETPEERNAME    = 31  // { int sys_getpeername(int fdes, struct sockaddr *asa, \\\n\tSYS_GETSOCKNAME    = 32  // { int sys_getsockname(int fdes, struct sockaddr *asa, \\\n\tSYS_ACCESS         = 33  // { int sys_access(const char *path, int flags); }\n\tSYS_CHFLAGS        = 34  // { int sys_chflags(const char *path, u_int flags); }\n\tSYS_FCHFLAGS       = 35  // { int sys_fchflags(int fd, u_int flags); }\n\tSYS_SYNC           = 36  // { void sys_sync(void); }\n\tSYS_KILL           = 37  // { int sys_kill(int pid, int signum); }\n\tSYS_STAT           = 38  // { int sys_stat(const char *path, struct stat *ub); }\n\tSYS_GETPPID        = 39  // { pid_t sys_getppid(void); }\n\tSYS_LSTAT          = 40  // { int sys_lstat(const char *path, struct stat *ub); }\n\tSYS_DUP            = 41  // { int sys_dup(int fd); }\n\tSYS_FSTATAT        = 42  // { int sys_fstatat(int fd, const char *path, \\\n\tSYS_GETEGID        = 43  // { gid_t sys_getegid(void); }\n\tSYS_PROFIL         = 44  // { int sys_profil(caddr_t samples, size_t size, \\\n\tSYS_KTRACE         = 45  // { int sys_ktrace(const char *fname, int ops, \\\n\tSYS_SIGACTION      = 46  // { int sys_sigaction(int signum, \\\n\tSYS_GETGID         = 47  // { gid_t sys_getgid(void); }\n\tSYS_SIGPROCMASK    = 48  // { int sys_sigprocmask(int how, sigset_t mask); }\n\tSYS_GETLOGIN       = 49  // { int sys_getlogin(char *namebuf, u_int namelen); }\n\tSYS_SETLOGIN       = 50  // { int sys_setlogin(const char *namebuf); }\n\tSYS_ACCT           = 51  // { int sys_acct(const char *path); }\n\tSYS_SIGPENDING     = 52  // { int sys_sigpending(void); }\n\tSYS_FSTAT          = 53  // { int sys_fstat(int fd, struct stat *sb); }\n\tSYS_IOCTL          = 54  // { int sys_ioctl(int fd, \\\n\tSYS_REBOOT         = 55  // { int sys_reboot(int opt); }\n\tSYS_REVOKE         = 56  // { int sys_revoke(const char *path); }\n\tSYS_SYMLINK        = 57  // { int sys_symlink(const char *path, \\\n\tSYS_READLINK       = 58  // { int sys_readlink(const char *path, char *buf, \\\n\tSYS_EXECVE         = 59  // { int sys_execve(const char *path, \\\n\tSYS_UMASK          = 60  // { mode_t sys_umask(mode_t newmask); }\n\tSYS_CHROOT         = 61  // { int sys_chroot(const char *path); }\n\tSYS_GETFSSTAT      = 62  // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \\\n\tSYS_STATFS         = 63  // { int sys_statfs(const char *path, \\\n\tSYS_FSTATFS        = 64  // { int sys_fstatfs(int fd, struct statfs *buf); }\n\tSYS_FHSTATFS       = 65  // { int sys_fhstatfs(const fhandle_t *fhp, \\\n\tSYS_VFORK          = 66  // { int sys_vfork(void); }\n\tSYS_GETTIMEOFDAY   = 67  // { int sys_gettimeofday(struct timeval *tp, \\\n\tSYS_SETTIMEOFDAY   = 68  // { int sys_settimeofday(const struct timeval *tv, \\\n\tSYS_SETITIMER      = 69  // { int sys_setitimer(int which, \\\n\tSYS_GETITIMER      = 70  // { int sys_getitimer(int which, \\\n\tSYS_SELECT         = 71  // { int sys_select(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_KEVENT         = 72  // { int sys_kevent(int fd, \\\n\tSYS_MUNMAP         = 73  // { int sys_munmap(void *addr, size_t len); }\n\tSYS_MPROTECT       = 74  // { int sys_mprotect(void *addr, size_t len, \\\n\tSYS_MADVISE        = 75  // { int sys_madvise(void *addr, size_t len, \\\n\tSYS_UTIMES         = 76  // { int sys_utimes(const char *path, \\\n\tSYS_FUTIMES        = 77  // { int sys_futimes(int fd, \\\n\tSYS_MINCORE        = 78  // { int sys_mincore(void *addr, size_t len, \\\n\tSYS_GETGROUPS      = 79  // { int sys_getgroups(int gidsetsize, \\\n\tSYS_SETGROUPS      = 80  // { int sys_setgroups(int gidsetsize, \\\n\tSYS_GETPGRP        = 81  // { int sys_getpgrp(void); }\n\tSYS_SETPGID        = 82  // { int sys_setpgid(pid_t pid, int pgid); }\n\tSYS_UTIMENSAT      = 84  // { int sys_utimensat(int fd, const char *path, \\\n\tSYS_FUTIMENS       = 85  // { int sys_futimens(int fd, \\\n\tSYS_CLOCK_GETTIME  = 87  // { int sys_clock_gettime(clockid_t clock_id, \\\n\tSYS_CLOCK_SETTIME  = 88  // { int sys_clock_settime(clockid_t clock_id, \\\n\tSYS_CLOCK_GETRES   = 89  // { int sys_clock_getres(clockid_t clock_id, \\\n\tSYS_DUP2           = 90  // { int sys_dup2(int from, int to); }\n\tSYS_NANOSLEEP      = 91  // { int sys_nanosleep(const struct timespec *rqtp, \\\n\tSYS_FCNTL          = 92  // { int sys_fcntl(int fd, int cmd, ... void *arg); }\n\tSYS___THRSLEEP     = 94  // { int sys___thrsleep(const volatile void *ident, \\\n\tSYS_FSYNC          = 95  // { int sys_fsync(int fd); }\n\tSYS_SETPRIORITY    = 96  // { int sys_setpriority(int which, id_t who, int prio); }\n\tSYS_SOCKET         = 97  // { int sys_socket(int domain, int type, int protocol); }\n\tSYS_CONNECT        = 98  // { int sys_connect(int s, const struct sockaddr *name, \\\n\tSYS_GETDENTS       = 99  // { int sys_getdents(int fd, void *buf, size_t buflen); }\n\tSYS_GETPRIORITY    = 100 // { int sys_getpriority(int which, id_t who); }\n\tSYS_SIGRETURN      = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); }\n\tSYS_BIND           = 104 // { int sys_bind(int s, const struct sockaddr *name, \\\n\tSYS_SETSOCKOPT     = 105 // { int sys_setsockopt(int s, int level, int name, \\\n\tSYS_LISTEN         = 106 // { int sys_listen(int s, int backlog); }\n\tSYS_PPOLL          = 109 // { int sys_ppoll(struct pollfd *fds, \\\n\tSYS_PSELECT        = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_SIGSUSPEND     = 111 // { int sys_sigsuspend(int mask); }\n\tSYS_GETSOCKOPT     = 118 // { int sys_getsockopt(int s, int level, int name, \\\n\tSYS_READV          = 120 // { ssize_t sys_readv(int fd, \\\n\tSYS_WRITEV         = 121 // { ssize_t sys_writev(int fd, \\\n\tSYS_FCHOWN         = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS_FCHMOD         = 124 // { int sys_fchmod(int fd, mode_t mode); }\n\tSYS_SETREUID       = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); }\n\tSYS_SETREGID       = 127 // { int sys_setregid(gid_t rgid, gid_t egid); }\n\tSYS_RENAME         = 128 // { int sys_rename(const char *from, const char *to); }\n\tSYS_FLOCK          = 131 // { int sys_flock(int fd, int how); }\n\tSYS_MKFIFO         = 132 // { int sys_mkfifo(const char *path, mode_t mode); }\n\tSYS_SENDTO         = 133 // { ssize_t sys_sendto(int s, const void *buf, \\\n\tSYS_SHUTDOWN       = 134 // { int sys_shutdown(int s, int how); }\n\tSYS_SOCKETPAIR     = 135 // { int sys_socketpair(int domain, int type, \\\n\tSYS_MKDIR          = 136 // { int sys_mkdir(const char *path, mode_t mode); }\n\tSYS_RMDIR          = 137 // { int sys_rmdir(const char *path); }\n\tSYS_ADJTIME        = 140 // { int sys_adjtime(const struct timeval *delta, \\\n\tSYS_SETSID         = 147 // { int sys_setsid(void); }\n\tSYS_QUOTACTL       = 148 // { int sys_quotactl(const char *path, int cmd, \\\n\tSYS_NFSSVC         = 155 // { int sys_nfssvc(int flag, void *argp); }\n\tSYS_GETFH          = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); }\n\tSYS_SYSARCH        = 165 // { int sys_sysarch(int op, void *parms); }\n\tSYS_PREAD          = 173 // { ssize_t sys_pread(int fd, void *buf, \\\n\tSYS_PWRITE         = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \\\n\tSYS_SETGID         = 181 // { int sys_setgid(gid_t gid); }\n\tSYS_SETEGID        = 182 // { int sys_setegid(gid_t egid); }\n\tSYS_SETEUID        = 183 // { int sys_seteuid(uid_t euid); }\n\tSYS_PATHCONF       = 191 // { long sys_pathconf(const char *path, int name); }\n\tSYS_FPATHCONF      = 192 // { long sys_fpathconf(int fd, int name); }\n\tSYS_SWAPCTL        = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); }\n\tSYS_GETRLIMIT      = 194 // { int sys_getrlimit(int which, \\\n\tSYS_SETRLIMIT      = 195 // { int sys_setrlimit(int which, \\\n\tSYS_MMAP           = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \\\n\tSYS_LSEEK          = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \\\n\tSYS_TRUNCATE       = 200 // { int sys_truncate(const char *path, int pad, \\\n\tSYS_FTRUNCATE      = 201 // { int sys_ftruncate(int fd, int pad, off_t length); }\n\tSYS___SYSCTL       = 202 // { int sys___sysctl(const int *name, u_int namelen, \\\n\tSYS_MLOCK          = 203 // { int sys_mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK        = 204 // { int sys_munlock(const void *addr, size_t len); }\n\tSYS_GETPGID        = 207 // { pid_t sys_getpgid(pid_t pid); }\n\tSYS_UTRACE         = 209 // { int sys_utrace(const char *label, const void *addr, \\\n\tSYS_SEMGET         = 221 // { int sys_semget(key_t key, int nsems, int semflg); }\n\tSYS_MSGGET         = 225 // { int sys_msgget(key_t key, int msgflg); }\n\tSYS_MSGSND         = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \\\n\tSYS_MSGRCV         = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \\\n\tSYS_SHMAT          = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \\\n\tSYS_SHMDT          = 230 // { int sys_shmdt(const void *shmaddr); }\n\tSYS_MINHERIT       = 250 // { int sys_minherit(void *addr, size_t len, \\\n\tSYS_POLL           = 252 // { int sys_poll(struct pollfd *fds, \\\n\tSYS_ISSETUGID      = 253 // { int sys_issetugid(void); }\n\tSYS_LCHOWN         = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_GETSID         = 255 // { pid_t sys_getsid(pid_t pid); }\n\tSYS_MSYNC          = 256 // { int sys_msync(void *addr, size_t len, int flags); }\n\tSYS_PIPE           = 263 // { int sys_pipe(int *fdp); }\n\tSYS_FHOPEN         = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); }\n\tSYS_PREADV         = 267 // { ssize_t sys_preadv(int fd, \\\n\tSYS_PWRITEV        = 268 // { ssize_t sys_pwritev(int fd, \\\n\tSYS_KQUEUE         = 269 // { int sys_kqueue(void); }\n\tSYS_MLOCKALL       = 271 // { int sys_mlockall(int flags); }\n\tSYS_MUNLOCKALL     = 272 // { int sys_munlockall(void); }\n\tSYS_GETRESUID      = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \\\n\tSYS_SETRESUID      = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \\\n\tSYS_GETRESGID      = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \\\n\tSYS_SETRESGID      = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \\\n\tSYS_MQUERY         = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \\\n\tSYS_CLOSEFROM      = 287 // { int sys_closefrom(int fd); }\n\tSYS_SIGALTSTACK    = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \\\n\tSYS_SHMGET         = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); }\n\tSYS_SEMOP          = 290 // { int sys_semop(int semid, struct sembuf *sops, \\\n\tSYS_FHSTAT         = 294 // { int sys_fhstat(const fhandle_t *fhp, \\\n\tSYS___SEMCTL       = 295 // { int sys___semctl(int semid, int semnum, int cmd, \\\n\tSYS_SHMCTL         = 296 // { int sys_shmctl(int shmid, int cmd, \\\n\tSYS_MSGCTL         = 297 // { int sys_msgctl(int msqid, int cmd, \\\n\tSYS_SCHED_YIELD    = 298 // { int sys_sched_yield(void); }\n\tSYS_GETTHRID       = 299 // { pid_t sys_getthrid(void); }\n\tSYS___THRWAKEUP    = 301 // { int sys___thrwakeup(const volatile void *ident, \\\n\tSYS___THREXIT      = 302 // { void sys___threxit(pid_t *notdead); }\n\tSYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \\\n\tSYS___GETCWD       = 304 // { int sys___getcwd(char *buf, size_t len); }\n\tSYS_ADJFREQ        = 305 // { int sys_adjfreq(const int64_t *freq, \\\n\tSYS_SETRTABLE      = 310 // { int sys_setrtable(int rtableid); }\n\tSYS_GETRTABLE      = 311 // { int sys_getrtable(void); }\n\tSYS_FACCESSAT      = 313 // { int sys_faccessat(int fd, const char *path, \\\n\tSYS_FCHMODAT       = 314 // { int sys_fchmodat(int fd, const char *path, \\\n\tSYS_FCHOWNAT       = 315 // { int sys_fchownat(int fd, const char *path, \\\n\tSYS_LINKAT         = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \\\n\tSYS_MKDIRAT        = 318 // { int sys_mkdirat(int fd, const char *path, \\\n\tSYS_MKFIFOAT       = 319 // { int sys_mkfifoat(int fd, const char *path, \\\n\tSYS_MKNODAT        = 320 // { int sys_mknodat(int fd, const char *path, \\\n\tSYS_OPENAT         = 321 // { int sys_openat(int fd, const char *path, int flags, \\\n\tSYS_READLINKAT     = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \\\n\tSYS_RENAMEAT       = 323 // { int sys_renameat(int fromfd, const char *from, \\\n\tSYS_SYMLINKAT      = 324 // { int sys_symlinkat(const char *path, int fd, \\\n\tSYS_UNLINKAT       = 325 // { int sys_unlinkat(int fd, const char *path, \\\n\tSYS___SET_TCB      = 329 // { void sys___set_tcb(void *tcb); }\n\tSYS___GET_TCB      = 330 // { void *sys___get_tcb(void); }\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go",
    "content": "// mksysnum_openbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build amd64,openbsd\n\npackage unix\n\nconst (\n\tSYS_EXIT           = 1   // { void sys_exit(int rval); }\n\tSYS_FORK           = 2   // { int sys_fork(void); }\n\tSYS_READ           = 3   // { ssize_t sys_read(int fd, void *buf, size_t nbyte); }\n\tSYS_WRITE          = 4   // { ssize_t sys_write(int fd, const void *buf, \\\n\tSYS_OPEN           = 5   // { int sys_open(const char *path, \\\n\tSYS_CLOSE          = 6   // { int sys_close(int fd); }\n\tSYS___TFORK        = 8   // { int sys___tfork(const struct __tfork *param, \\\n\tSYS_LINK           = 9   // { int sys_link(const char *path, const char *link); }\n\tSYS_UNLINK         = 10  // { int sys_unlink(const char *path); }\n\tSYS_WAIT4          = 11  // { pid_t sys_wait4(pid_t pid, int *status, \\\n\tSYS_CHDIR          = 12  // { int sys_chdir(const char *path); }\n\tSYS_FCHDIR         = 13  // { int sys_fchdir(int fd); }\n\tSYS_MKNOD          = 14  // { int sys_mknod(const char *path, mode_t mode, \\\n\tSYS_CHMOD          = 15  // { int sys_chmod(const char *path, mode_t mode); }\n\tSYS_CHOWN          = 16  // { int sys_chown(const char *path, uid_t uid, \\\n\tSYS_OBREAK         = 17  // { int sys_obreak(char *nsize); } break\n\tSYS_GETDTABLECOUNT = 18  // { int sys_getdtablecount(void); }\n\tSYS_GETRUSAGE      = 19  // { int sys_getrusage(int who, \\\n\tSYS_GETPID         = 20  // { pid_t sys_getpid(void); }\n\tSYS_MOUNT          = 21  // { int sys_mount(const char *type, const char *path, \\\n\tSYS_UNMOUNT        = 22  // { int sys_unmount(const char *path, int flags); }\n\tSYS_SETUID         = 23  // { int sys_setuid(uid_t uid); }\n\tSYS_GETUID         = 24  // { uid_t sys_getuid(void); }\n\tSYS_GETEUID        = 25  // { uid_t sys_geteuid(void); }\n\tSYS_PTRACE         = 26  // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \\\n\tSYS_RECVMSG        = 27  // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \\\n\tSYS_SENDMSG        = 28  // { ssize_t sys_sendmsg(int s, \\\n\tSYS_RECVFROM       = 29  // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \\\n\tSYS_ACCEPT         = 30  // { int sys_accept(int s, struct sockaddr *name, \\\n\tSYS_GETPEERNAME    = 31  // { int sys_getpeername(int fdes, struct sockaddr *asa, \\\n\tSYS_GETSOCKNAME    = 32  // { int sys_getsockname(int fdes, struct sockaddr *asa, \\\n\tSYS_ACCESS         = 33  // { int sys_access(const char *path, int flags); }\n\tSYS_CHFLAGS        = 34  // { int sys_chflags(const char *path, u_int flags); }\n\tSYS_FCHFLAGS       = 35  // { int sys_fchflags(int fd, u_int flags); }\n\tSYS_SYNC           = 36  // { void sys_sync(void); }\n\tSYS_KILL           = 37  // { int sys_kill(int pid, int signum); }\n\tSYS_STAT           = 38  // { int sys_stat(const char *path, struct stat *ub); }\n\tSYS_GETPPID        = 39  // { pid_t sys_getppid(void); }\n\tSYS_LSTAT          = 40  // { int sys_lstat(const char *path, struct stat *ub); }\n\tSYS_DUP            = 41  // { int sys_dup(int fd); }\n\tSYS_FSTATAT        = 42  // { int sys_fstatat(int fd, const char *path, \\\n\tSYS_GETEGID        = 43  // { gid_t sys_getegid(void); }\n\tSYS_PROFIL         = 44  // { int sys_profil(caddr_t samples, size_t size, \\\n\tSYS_KTRACE         = 45  // { int sys_ktrace(const char *fname, int ops, \\\n\tSYS_SIGACTION      = 46  // { int sys_sigaction(int signum, \\\n\tSYS_GETGID         = 47  // { gid_t sys_getgid(void); }\n\tSYS_SIGPROCMASK    = 48  // { int sys_sigprocmask(int how, sigset_t mask); }\n\tSYS_GETLOGIN       = 49  // { int sys_getlogin(char *namebuf, u_int namelen); }\n\tSYS_SETLOGIN       = 50  // { int sys_setlogin(const char *namebuf); }\n\tSYS_ACCT           = 51  // { int sys_acct(const char *path); }\n\tSYS_SIGPENDING     = 52  // { int sys_sigpending(void); }\n\tSYS_FSTAT          = 53  // { int sys_fstat(int fd, struct stat *sb); }\n\tSYS_IOCTL          = 54  // { int sys_ioctl(int fd, \\\n\tSYS_REBOOT         = 55  // { int sys_reboot(int opt); }\n\tSYS_REVOKE         = 56  // { int sys_revoke(const char *path); }\n\tSYS_SYMLINK        = 57  // { int sys_symlink(const char *path, \\\n\tSYS_READLINK       = 58  // { int sys_readlink(const char *path, char *buf, \\\n\tSYS_EXECVE         = 59  // { int sys_execve(const char *path, \\\n\tSYS_UMASK          = 60  // { mode_t sys_umask(mode_t newmask); }\n\tSYS_CHROOT         = 61  // { int sys_chroot(const char *path); }\n\tSYS_GETFSSTAT      = 62  // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \\\n\tSYS_STATFS         = 63  // { int sys_statfs(const char *path, \\\n\tSYS_FSTATFS        = 64  // { int sys_fstatfs(int fd, struct statfs *buf); }\n\tSYS_FHSTATFS       = 65  // { int sys_fhstatfs(const fhandle_t *fhp, \\\n\tSYS_VFORK          = 66  // { int sys_vfork(void); }\n\tSYS_GETTIMEOFDAY   = 67  // { int sys_gettimeofday(struct timeval *tp, \\\n\tSYS_SETTIMEOFDAY   = 68  // { int sys_settimeofday(const struct timeval *tv, \\\n\tSYS_SETITIMER      = 69  // { int sys_setitimer(int which, \\\n\tSYS_GETITIMER      = 70  // { int sys_getitimer(int which, \\\n\tSYS_SELECT         = 71  // { int sys_select(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_KEVENT         = 72  // { int sys_kevent(int fd, \\\n\tSYS_MUNMAP         = 73  // { int sys_munmap(void *addr, size_t len); }\n\tSYS_MPROTECT       = 74  // { int sys_mprotect(void *addr, size_t len, \\\n\tSYS_MADVISE        = 75  // { int sys_madvise(void *addr, size_t len, \\\n\tSYS_UTIMES         = 76  // { int sys_utimes(const char *path, \\\n\tSYS_FUTIMES        = 77  // { int sys_futimes(int fd, \\\n\tSYS_MINCORE        = 78  // { int sys_mincore(void *addr, size_t len, \\\n\tSYS_GETGROUPS      = 79  // { int sys_getgroups(int gidsetsize, \\\n\tSYS_SETGROUPS      = 80  // { int sys_setgroups(int gidsetsize, \\\n\tSYS_GETPGRP        = 81  // { int sys_getpgrp(void); }\n\tSYS_SETPGID        = 82  // { int sys_setpgid(pid_t pid, int pgid); }\n\tSYS_UTIMENSAT      = 84  // { int sys_utimensat(int fd, const char *path, \\\n\tSYS_FUTIMENS       = 85  // { int sys_futimens(int fd, \\\n\tSYS_CLOCK_GETTIME  = 87  // { int sys_clock_gettime(clockid_t clock_id, \\\n\tSYS_CLOCK_SETTIME  = 88  // { int sys_clock_settime(clockid_t clock_id, \\\n\tSYS_CLOCK_GETRES   = 89  // { int sys_clock_getres(clockid_t clock_id, \\\n\tSYS_DUP2           = 90  // { int sys_dup2(int from, int to); }\n\tSYS_NANOSLEEP      = 91  // { int sys_nanosleep(const struct timespec *rqtp, \\\n\tSYS_FCNTL          = 92  // { int sys_fcntl(int fd, int cmd, ... void *arg); }\n\tSYS___THRSLEEP     = 94  // { int sys___thrsleep(const volatile void *ident, \\\n\tSYS_FSYNC          = 95  // { int sys_fsync(int fd); }\n\tSYS_SETPRIORITY    = 96  // { int sys_setpriority(int which, id_t who, int prio); }\n\tSYS_SOCKET         = 97  // { int sys_socket(int domain, int type, int protocol); }\n\tSYS_CONNECT        = 98  // { int sys_connect(int s, const struct sockaddr *name, \\\n\tSYS_GETDENTS       = 99  // { int sys_getdents(int fd, void *buf, size_t buflen); }\n\tSYS_GETPRIORITY    = 100 // { int sys_getpriority(int which, id_t who); }\n\tSYS_SIGRETURN      = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); }\n\tSYS_BIND           = 104 // { int sys_bind(int s, const struct sockaddr *name, \\\n\tSYS_SETSOCKOPT     = 105 // { int sys_setsockopt(int s, int level, int name, \\\n\tSYS_LISTEN         = 106 // { int sys_listen(int s, int backlog); }\n\tSYS_PPOLL          = 109 // { int sys_ppoll(struct pollfd *fds, \\\n\tSYS_PSELECT        = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_SIGSUSPEND     = 111 // { int sys_sigsuspend(int mask); }\n\tSYS_GETSOCKOPT     = 118 // { int sys_getsockopt(int s, int level, int name, \\\n\tSYS_READV          = 120 // { ssize_t sys_readv(int fd, \\\n\tSYS_WRITEV         = 121 // { ssize_t sys_writev(int fd, \\\n\tSYS_FCHOWN         = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS_FCHMOD         = 124 // { int sys_fchmod(int fd, mode_t mode); }\n\tSYS_SETREUID       = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); }\n\tSYS_SETREGID       = 127 // { int sys_setregid(gid_t rgid, gid_t egid); }\n\tSYS_RENAME         = 128 // { int sys_rename(const char *from, const char *to); }\n\tSYS_FLOCK          = 131 // { int sys_flock(int fd, int how); }\n\tSYS_MKFIFO         = 132 // { int sys_mkfifo(const char *path, mode_t mode); }\n\tSYS_SENDTO         = 133 // { ssize_t sys_sendto(int s, const void *buf, \\\n\tSYS_SHUTDOWN       = 134 // { int sys_shutdown(int s, int how); }\n\tSYS_SOCKETPAIR     = 135 // { int sys_socketpair(int domain, int type, \\\n\tSYS_MKDIR          = 136 // { int sys_mkdir(const char *path, mode_t mode); }\n\tSYS_RMDIR          = 137 // { int sys_rmdir(const char *path); }\n\tSYS_ADJTIME        = 140 // { int sys_adjtime(const struct timeval *delta, \\\n\tSYS_SETSID         = 147 // { int sys_setsid(void); }\n\tSYS_QUOTACTL       = 148 // { int sys_quotactl(const char *path, int cmd, \\\n\tSYS_NFSSVC         = 155 // { int sys_nfssvc(int flag, void *argp); }\n\tSYS_GETFH          = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); }\n\tSYS_SYSARCH        = 165 // { int sys_sysarch(int op, void *parms); }\n\tSYS_PREAD          = 173 // { ssize_t sys_pread(int fd, void *buf, \\\n\tSYS_PWRITE         = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \\\n\tSYS_SETGID         = 181 // { int sys_setgid(gid_t gid); }\n\tSYS_SETEGID        = 182 // { int sys_setegid(gid_t egid); }\n\tSYS_SETEUID        = 183 // { int sys_seteuid(uid_t euid); }\n\tSYS_PATHCONF       = 191 // { long sys_pathconf(const char *path, int name); }\n\tSYS_FPATHCONF      = 192 // { long sys_fpathconf(int fd, int name); }\n\tSYS_SWAPCTL        = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); }\n\tSYS_GETRLIMIT      = 194 // { int sys_getrlimit(int which, \\\n\tSYS_SETRLIMIT      = 195 // { int sys_setrlimit(int which, \\\n\tSYS_MMAP           = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \\\n\tSYS_LSEEK          = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \\\n\tSYS_TRUNCATE       = 200 // { int sys_truncate(const char *path, int pad, \\\n\tSYS_FTRUNCATE      = 201 // { int sys_ftruncate(int fd, int pad, off_t length); }\n\tSYS___SYSCTL       = 202 // { int sys___sysctl(const int *name, u_int namelen, \\\n\tSYS_MLOCK          = 203 // { int sys_mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK        = 204 // { int sys_munlock(const void *addr, size_t len); }\n\tSYS_GETPGID        = 207 // { pid_t sys_getpgid(pid_t pid); }\n\tSYS_UTRACE         = 209 // { int sys_utrace(const char *label, const void *addr, \\\n\tSYS_SEMGET         = 221 // { int sys_semget(key_t key, int nsems, int semflg); }\n\tSYS_MSGGET         = 225 // { int sys_msgget(key_t key, int msgflg); }\n\tSYS_MSGSND         = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \\\n\tSYS_MSGRCV         = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \\\n\tSYS_SHMAT          = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \\\n\tSYS_SHMDT          = 230 // { int sys_shmdt(const void *shmaddr); }\n\tSYS_MINHERIT       = 250 // { int sys_minherit(void *addr, size_t len, \\\n\tSYS_POLL           = 252 // { int sys_poll(struct pollfd *fds, \\\n\tSYS_ISSETUGID      = 253 // { int sys_issetugid(void); }\n\tSYS_LCHOWN         = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_GETSID         = 255 // { pid_t sys_getsid(pid_t pid); }\n\tSYS_MSYNC          = 256 // { int sys_msync(void *addr, size_t len, int flags); }\n\tSYS_PIPE           = 263 // { int sys_pipe(int *fdp); }\n\tSYS_FHOPEN         = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); }\n\tSYS_PREADV         = 267 // { ssize_t sys_preadv(int fd, \\\n\tSYS_PWRITEV        = 268 // { ssize_t sys_pwritev(int fd, \\\n\tSYS_KQUEUE         = 269 // { int sys_kqueue(void); }\n\tSYS_MLOCKALL       = 271 // { int sys_mlockall(int flags); }\n\tSYS_MUNLOCKALL     = 272 // { int sys_munlockall(void); }\n\tSYS_GETRESUID      = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \\\n\tSYS_SETRESUID      = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \\\n\tSYS_GETRESGID      = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \\\n\tSYS_SETRESGID      = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \\\n\tSYS_MQUERY         = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \\\n\tSYS_CLOSEFROM      = 287 // { int sys_closefrom(int fd); }\n\tSYS_SIGALTSTACK    = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \\\n\tSYS_SHMGET         = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); }\n\tSYS_SEMOP          = 290 // { int sys_semop(int semid, struct sembuf *sops, \\\n\tSYS_FHSTAT         = 294 // { int sys_fhstat(const fhandle_t *fhp, \\\n\tSYS___SEMCTL       = 295 // { int sys___semctl(int semid, int semnum, int cmd, \\\n\tSYS_SHMCTL         = 296 // { int sys_shmctl(int shmid, int cmd, \\\n\tSYS_MSGCTL         = 297 // { int sys_msgctl(int msqid, int cmd, \\\n\tSYS_SCHED_YIELD    = 298 // { int sys_sched_yield(void); }\n\tSYS_GETTHRID       = 299 // { pid_t sys_getthrid(void); }\n\tSYS___THRWAKEUP    = 301 // { int sys___thrwakeup(const volatile void *ident, \\\n\tSYS___THREXIT      = 302 // { void sys___threxit(pid_t *notdead); }\n\tSYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \\\n\tSYS___GETCWD       = 304 // { int sys___getcwd(char *buf, size_t len); }\n\tSYS_ADJFREQ        = 305 // { int sys_adjfreq(const int64_t *freq, \\\n\tSYS_SETRTABLE      = 310 // { int sys_setrtable(int rtableid); }\n\tSYS_GETRTABLE      = 311 // { int sys_getrtable(void); }\n\tSYS_FACCESSAT      = 313 // { int sys_faccessat(int fd, const char *path, \\\n\tSYS_FCHMODAT       = 314 // { int sys_fchmodat(int fd, const char *path, \\\n\tSYS_FCHOWNAT       = 315 // { int sys_fchownat(int fd, const char *path, \\\n\tSYS_LINKAT         = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \\\n\tSYS_MKDIRAT        = 318 // { int sys_mkdirat(int fd, const char *path, \\\n\tSYS_MKFIFOAT       = 319 // { int sys_mkfifoat(int fd, const char *path, \\\n\tSYS_MKNODAT        = 320 // { int sys_mknodat(int fd, const char *path, \\\n\tSYS_OPENAT         = 321 // { int sys_openat(int fd, const char *path, int flags, \\\n\tSYS_READLINKAT     = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \\\n\tSYS_RENAMEAT       = 323 // { int sys_renameat(int fromfd, const char *from, \\\n\tSYS_SYMLINKAT      = 324 // { int sys_symlinkat(const char *path, int fd, \\\n\tSYS_UNLINKAT       = 325 // { int sys_unlinkat(int fd, const char *path, \\\n\tSYS___SET_TCB      = 329 // { void sys___set_tcb(void *tcb); }\n\tSYS___GET_TCB      = 330 // { void *sys___get_tcb(void); }\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go",
    "content": "// mksysnum_openbsd.pl\n// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT\n\n// +build arm,openbsd\n\npackage unix\n\nconst (\n\tSYS_EXIT           = 1   // { void sys_exit(int rval); }\n\tSYS_FORK           = 2   // { int sys_fork(void); }\n\tSYS_READ           = 3   // { ssize_t sys_read(int fd, void *buf, size_t nbyte); }\n\tSYS_WRITE          = 4   // { ssize_t sys_write(int fd, const void *buf, \\\n\tSYS_OPEN           = 5   // { int sys_open(const char *path, \\\n\tSYS_CLOSE          = 6   // { int sys_close(int fd); }\n\tSYS_GETENTROPY     = 7   // { int sys_getentropy(void *buf, size_t nbyte); }\n\tSYS___TFORK        = 8   // { int sys___tfork(const struct __tfork *param, \\\n\tSYS_LINK           = 9   // { int sys_link(const char *path, const char *link); }\n\tSYS_UNLINK         = 10  // { int sys_unlink(const char *path); }\n\tSYS_WAIT4          = 11  // { pid_t sys_wait4(pid_t pid, int *status, \\\n\tSYS_CHDIR          = 12  // { int sys_chdir(const char *path); }\n\tSYS_FCHDIR         = 13  // { int sys_fchdir(int fd); }\n\tSYS_MKNOD          = 14  // { int sys_mknod(const char *path, mode_t mode, \\\n\tSYS_CHMOD          = 15  // { int sys_chmod(const char *path, mode_t mode); }\n\tSYS_CHOWN          = 16  // { int sys_chown(const char *path, uid_t uid, \\\n\tSYS_OBREAK         = 17  // { int sys_obreak(char *nsize); } break\n\tSYS_GETDTABLECOUNT = 18  // { int sys_getdtablecount(void); }\n\tSYS_GETRUSAGE      = 19  // { int sys_getrusage(int who, \\\n\tSYS_GETPID         = 20  // { pid_t sys_getpid(void); }\n\tSYS_MOUNT          = 21  // { int sys_mount(const char *type, const char *path, \\\n\tSYS_UNMOUNT        = 22  // { int sys_unmount(const char *path, int flags); }\n\tSYS_SETUID         = 23  // { int sys_setuid(uid_t uid); }\n\tSYS_GETUID         = 24  // { uid_t sys_getuid(void); }\n\tSYS_GETEUID        = 25  // { uid_t sys_geteuid(void); }\n\tSYS_PTRACE         = 26  // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \\\n\tSYS_RECVMSG        = 27  // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \\\n\tSYS_SENDMSG        = 28  // { ssize_t sys_sendmsg(int s, \\\n\tSYS_RECVFROM       = 29  // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \\\n\tSYS_ACCEPT         = 30  // { int sys_accept(int s, struct sockaddr *name, \\\n\tSYS_GETPEERNAME    = 31  // { int sys_getpeername(int fdes, struct sockaddr *asa, \\\n\tSYS_GETSOCKNAME    = 32  // { int sys_getsockname(int fdes, struct sockaddr *asa, \\\n\tSYS_ACCESS         = 33  // { int sys_access(const char *path, int amode); }\n\tSYS_CHFLAGS        = 34  // { int sys_chflags(const char *path, u_int flags); }\n\tSYS_FCHFLAGS       = 35  // { int sys_fchflags(int fd, u_int flags); }\n\tSYS_SYNC           = 36  // { void sys_sync(void); }\n\tSYS_STAT           = 38  // { int sys_stat(const char *path, struct stat *ub); }\n\tSYS_GETPPID        = 39  // { pid_t sys_getppid(void); }\n\tSYS_LSTAT          = 40  // { int sys_lstat(const char *path, struct stat *ub); }\n\tSYS_DUP            = 41  // { int sys_dup(int fd); }\n\tSYS_FSTATAT        = 42  // { int sys_fstatat(int fd, const char *path, \\\n\tSYS_GETEGID        = 43  // { gid_t sys_getegid(void); }\n\tSYS_PROFIL         = 44  // { int sys_profil(caddr_t samples, size_t size, \\\n\tSYS_KTRACE         = 45  // { int sys_ktrace(const char *fname, int ops, \\\n\tSYS_SIGACTION      = 46  // { int sys_sigaction(int signum, \\\n\tSYS_GETGID         = 47  // { gid_t sys_getgid(void); }\n\tSYS_SIGPROCMASK    = 48  // { int sys_sigprocmask(int how, sigset_t mask); }\n\tSYS_GETLOGIN       = 49  // { int sys_getlogin(char *namebuf, u_int namelen); }\n\tSYS_SETLOGIN       = 50  // { int sys_setlogin(const char *namebuf); }\n\tSYS_ACCT           = 51  // { int sys_acct(const char *path); }\n\tSYS_SIGPENDING     = 52  // { int sys_sigpending(void); }\n\tSYS_FSTAT          = 53  // { int sys_fstat(int fd, struct stat *sb); }\n\tSYS_IOCTL          = 54  // { int sys_ioctl(int fd, \\\n\tSYS_REBOOT         = 55  // { int sys_reboot(int opt); }\n\tSYS_REVOKE         = 56  // { int sys_revoke(const char *path); }\n\tSYS_SYMLINK        = 57  // { int sys_symlink(const char *path, \\\n\tSYS_READLINK       = 58  // { ssize_t sys_readlink(const char *path, \\\n\tSYS_EXECVE         = 59  // { int sys_execve(const char *path, \\\n\tSYS_UMASK          = 60  // { mode_t sys_umask(mode_t newmask); }\n\tSYS_CHROOT         = 61  // { int sys_chroot(const char *path); }\n\tSYS_GETFSSTAT      = 62  // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \\\n\tSYS_STATFS         = 63  // { int sys_statfs(const char *path, \\\n\tSYS_FSTATFS        = 64  // { int sys_fstatfs(int fd, struct statfs *buf); }\n\tSYS_FHSTATFS       = 65  // { int sys_fhstatfs(const fhandle_t *fhp, \\\n\tSYS_VFORK          = 66  // { int sys_vfork(void); }\n\tSYS_GETTIMEOFDAY   = 67  // { int sys_gettimeofday(struct timeval *tp, \\\n\tSYS_SETTIMEOFDAY   = 68  // { int sys_settimeofday(const struct timeval *tv, \\\n\tSYS_SETITIMER      = 69  // { int sys_setitimer(int which, \\\n\tSYS_GETITIMER      = 70  // { int sys_getitimer(int which, \\\n\tSYS_SELECT         = 71  // { int sys_select(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_KEVENT         = 72  // { int sys_kevent(int fd, \\\n\tSYS_MUNMAP         = 73  // { int sys_munmap(void *addr, size_t len); }\n\tSYS_MPROTECT       = 74  // { int sys_mprotect(void *addr, size_t len, \\\n\tSYS_MADVISE        = 75  // { int sys_madvise(void *addr, size_t len, \\\n\tSYS_UTIMES         = 76  // { int sys_utimes(const char *path, \\\n\tSYS_FUTIMES        = 77  // { int sys_futimes(int fd, \\\n\tSYS_MINCORE        = 78  // { int sys_mincore(void *addr, size_t len, \\\n\tSYS_GETGROUPS      = 79  // { int sys_getgroups(int gidsetsize, \\\n\tSYS_SETGROUPS      = 80  // { int sys_setgroups(int gidsetsize, \\\n\tSYS_GETPGRP        = 81  // { int sys_getpgrp(void); }\n\tSYS_SETPGID        = 82  // { int sys_setpgid(pid_t pid, pid_t pgid); }\n\tSYS_SENDSYSLOG     = 83  // { int sys_sendsyslog(const void *buf, size_t nbyte); }\n\tSYS_UTIMENSAT      = 84  // { int sys_utimensat(int fd, const char *path, \\\n\tSYS_FUTIMENS       = 85  // { int sys_futimens(int fd, \\\n\tSYS_CLOCK_GETTIME  = 87  // { int sys_clock_gettime(clockid_t clock_id, \\\n\tSYS_CLOCK_SETTIME  = 88  // { int sys_clock_settime(clockid_t clock_id, \\\n\tSYS_CLOCK_GETRES   = 89  // { int sys_clock_getres(clockid_t clock_id, \\\n\tSYS_DUP2           = 90  // { int sys_dup2(int from, int to); }\n\tSYS_NANOSLEEP      = 91  // { int sys_nanosleep(const struct timespec *rqtp, \\\n\tSYS_FCNTL          = 92  // { int sys_fcntl(int fd, int cmd, ... void *arg); }\n\tSYS_ACCEPT4        = 93  // { int sys_accept4(int s, struct sockaddr *name, \\\n\tSYS___THRSLEEP     = 94  // { int sys___thrsleep(const volatile void *ident, \\\n\tSYS_FSYNC          = 95  // { int sys_fsync(int fd); }\n\tSYS_SETPRIORITY    = 96  // { int sys_setpriority(int which, id_t who, int prio); }\n\tSYS_SOCKET         = 97  // { int sys_socket(int domain, int type, int protocol); }\n\tSYS_CONNECT        = 98  // { int sys_connect(int s, const struct sockaddr *name, \\\n\tSYS_GETDENTS       = 99  // { int sys_getdents(int fd, void *buf, size_t buflen); }\n\tSYS_GETPRIORITY    = 100 // { int sys_getpriority(int which, id_t who); }\n\tSYS_PIPE2          = 101 // { int sys_pipe2(int *fdp, int flags); }\n\tSYS_DUP3           = 102 // { int sys_dup3(int from, int to, int flags); }\n\tSYS_SIGRETURN      = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); }\n\tSYS_BIND           = 104 // { int sys_bind(int s, const struct sockaddr *name, \\\n\tSYS_SETSOCKOPT     = 105 // { int sys_setsockopt(int s, int level, int name, \\\n\tSYS_LISTEN         = 106 // { int sys_listen(int s, int backlog); }\n\tSYS_CHFLAGSAT      = 107 // { int sys_chflagsat(int fd, const char *path, \\\n\tSYS_PPOLL          = 109 // { int sys_ppoll(struct pollfd *fds, \\\n\tSYS_PSELECT        = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \\\n\tSYS_SIGSUSPEND     = 111 // { int sys_sigsuspend(int mask); }\n\tSYS_GETSOCKOPT     = 118 // { int sys_getsockopt(int s, int level, int name, \\\n\tSYS_READV          = 120 // { ssize_t sys_readv(int fd, \\\n\tSYS_WRITEV         = 121 // { ssize_t sys_writev(int fd, \\\n\tSYS_KILL           = 122 // { int sys_kill(int pid, int signum); }\n\tSYS_FCHOWN         = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); }\n\tSYS_FCHMOD         = 124 // { int sys_fchmod(int fd, mode_t mode); }\n\tSYS_SETREUID       = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); }\n\tSYS_SETREGID       = 127 // { int sys_setregid(gid_t rgid, gid_t egid); }\n\tSYS_RENAME         = 128 // { int sys_rename(const char *from, const char *to); }\n\tSYS_FLOCK          = 131 // { int sys_flock(int fd, int how); }\n\tSYS_MKFIFO         = 132 // { int sys_mkfifo(const char *path, mode_t mode); }\n\tSYS_SENDTO         = 133 // { ssize_t sys_sendto(int s, const void *buf, \\\n\tSYS_SHUTDOWN       = 134 // { int sys_shutdown(int s, int how); }\n\tSYS_SOCKETPAIR     = 135 // { int sys_socketpair(int domain, int type, \\\n\tSYS_MKDIR          = 136 // { int sys_mkdir(const char *path, mode_t mode); }\n\tSYS_RMDIR          = 137 // { int sys_rmdir(const char *path); }\n\tSYS_ADJTIME        = 140 // { int sys_adjtime(const struct timeval *delta, \\\n\tSYS_SETSID         = 147 // { int sys_setsid(void); }\n\tSYS_QUOTACTL       = 148 // { int sys_quotactl(const char *path, int cmd, \\\n\tSYS_NFSSVC         = 155 // { int sys_nfssvc(int flag, void *argp); }\n\tSYS_GETFH          = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); }\n\tSYS_SYSARCH        = 165 // { int sys_sysarch(int op, void *parms); }\n\tSYS_PREAD          = 173 // { ssize_t sys_pread(int fd, void *buf, \\\n\tSYS_PWRITE         = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \\\n\tSYS_SETGID         = 181 // { int sys_setgid(gid_t gid); }\n\tSYS_SETEGID        = 182 // { int sys_setegid(gid_t egid); }\n\tSYS_SETEUID        = 183 // { int sys_seteuid(uid_t euid); }\n\tSYS_PATHCONF       = 191 // { long sys_pathconf(const char *path, int name); }\n\tSYS_FPATHCONF      = 192 // { long sys_fpathconf(int fd, int name); }\n\tSYS_SWAPCTL        = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); }\n\tSYS_GETRLIMIT      = 194 // { int sys_getrlimit(int which, \\\n\tSYS_SETRLIMIT      = 195 // { int sys_setrlimit(int which, \\\n\tSYS_MMAP           = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \\\n\tSYS_LSEEK          = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \\\n\tSYS_TRUNCATE       = 200 // { int sys_truncate(const char *path, int pad, \\\n\tSYS_FTRUNCATE      = 201 // { int sys_ftruncate(int fd, int pad, off_t length); }\n\tSYS___SYSCTL       = 202 // { int sys___sysctl(const int *name, u_int namelen, \\\n\tSYS_MLOCK          = 203 // { int sys_mlock(const void *addr, size_t len); }\n\tSYS_MUNLOCK        = 204 // { int sys_munlock(const void *addr, size_t len); }\n\tSYS_GETPGID        = 207 // { pid_t sys_getpgid(pid_t pid); }\n\tSYS_UTRACE         = 209 // { int sys_utrace(const char *label, const void *addr, \\\n\tSYS_SEMGET         = 221 // { int sys_semget(key_t key, int nsems, int semflg); }\n\tSYS_MSGGET         = 225 // { int sys_msgget(key_t key, int msgflg); }\n\tSYS_MSGSND         = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \\\n\tSYS_MSGRCV         = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \\\n\tSYS_SHMAT          = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \\\n\tSYS_SHMDT          = 230 // { int sys_shmdt(const void *shmaddr); }\n\tSYS_MINHERIT       = 250 // { int sys_minherit(void *addr, size_t len, \\\n\tSYS_POLL           = 252 // { int sys_poll(struct pollfd *fds, \\\n\tSYS_ISSETUGID      = 253 // { int sys_issetugid(void); }\n\tSYS_LCHOWN         = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); }\n\tSYS_GETSID         = 255 // { pid_t sys_getsid(pid_t pid); }\n\tSYS_MSYNC          = 256 // { int sys_msync(void *addr, size_t len, int flags); }\n\tSYS_PIPE           = 263 // { int sys_pipe(int *fdp); }\n\tSYS_FHOPEN         = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); }\n\tSYS_PREADV         = 267 // { ssize_t sys_preadv(int fd, \\\n\tSYS_PWRITEV        = 268 // { ssize_t sys_pwritev(int fd, \\\n\tSYS_KQUEUE         = 269 // { int sys_kqueue(void); }\n\tSYS_MLOCKALL       = 271 // { int sys_mlockall(int flags); }\n\tSYS_MUNLOCKALL     = 272 // { int sys_munlockall(void); }\n\tSYS_GETRESUID      = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \\\n\tSYS_SETRESUID      = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \\\n\tSYS_GETRESGID      = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \\\n\tSYS_SETRESGID      = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \\\n\tSYS_MQUERY         = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \\\n\tSYS_CLOSEFROM      = 287 // { int sys_closefrom(int fd); }\n\tSYS_SIGALTSTACK    = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \\\n\tSYS_SHMGET         = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); }\n\tSYS_SEMOP          = 290 // { int sys_semop(int semid, struct sembuf *sops, \\\n\tSYS_FHSTAT         = 294 // { int sys_fhstat(const fhandle_t *fhp, \\\n\tSYS___SEMCTL       = 295 // { int sys___semctl(int semid, int semnum, int cmd, \\\n\tSYS_SHMCTL         = 296 // { int sys_shmctl(int shmid, int cmd, \\\n\tSYS_MSGCTL         = 297 // { int sys_msgctl(int msqid, int cmd, \\\n\tSYS_SCHED_YIELD    = 298 // { int sys_sched_yield(void); }\n\tSYS_GETTHRID       = 299 // { pid_t sys_getthrid(void); }\n\tSYS___THRWAKEUP    = 301 // { int sys___thrwakeup(const volatile void *ident, \\\n\tSYS___THREXIT      = 302 // { void sys___threxit(pid_t *notdead); }\n\tSYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \\\n\tSYS___GETCWD       = 304 // { int sys___getcwd(char *buf, size_t len); }\n\tSYS_ADJFREQ        = 305 // { int sys_adjfreq(const int64_t *freq, \\\n\tSYS_SETRTABLE      = 310 // { int sys_setrtable(int rtableid); }\n\tSYS_GETRTABLE      = 311 // { int sys_getrtable(void); }\n\tSYS_FACCESSAT      = 313 // { int sys_faccessat(int fd, const char *path, \\\n\tSYS_FCHMODAT       = 314 // { int sys_fchmodat(int fd, const char *path, \\\n\tSYS_FCHOWNAT       = 315 // { int sys_fchownat(int fd, const char *path, \\\n\tSYS_LINKAT         = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \\\n\tSYS_MKDIRAT        = 318 // { int sys_mkdirat(int fd, const char *path, \\\n\tSYS_MKFIFOAT       = 319 // { int sys_mkfifoat(int fd, const char *path, \\\n\tSYS_MKNODAT        = 320 // { int sys_mknodat(int fd, const char *path, \\\n\tSYS_OPENAT         = 321 // { int sys_openat(int fd, const char *path, int flags, \\\n\tSYS_READLINKAT     = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \\\n\tSYS_RENAMEAT       = 323 // { int sys_renameat(int fromfd, const char *from, \\\n\tSYS_SYMLINKAT      = 324 // { int sys_symlinkat(const char *path, int fd, \\\n\tSYS_UNLINKAT       = 325 // { int sys_unlinkat(int fd, const char *path, \\\n\tSYS___SET_TCB      = 329 // { void sys___set_tcb(void *tcb); }\n\tSYS___GET_TCB      = 330 // { void *sys___get_tcb(void); }\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build amd64,solaris\n\npackage unix\n\n// TODO(aram): remove these before Go 1.3.\nconst (\n\tSYS_EXECVE = 59\n\tSYS_FCNTL  = 62\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_darwin_386.go",
    "content": "// cgo -godefs types_darwin.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,darwin\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int32\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Timeval32 struct{}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev           int32\n\tMode          uint16\n\tNlink         uint16\n\tIno           uint64\n\tUid           uint32\n\tGid           uint32\n\tRdev          int32\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tBirthtimespec Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       int32\n\tFlags         uint32\n\tGen           uint32\n\tLspare        int32\n\tQspare        [2]int64\n}\n\ntype Statfs_t struct {\n\tBsize       uint32\n\tIosize      int32\n\tBlocks      uint64\n\tBfree       uint64\n\tBavail      uint64\n\tFiles       uint64\n\tFfree       uint64\n\tFsid        Fsid\n\tOwner       uint32\n\tType        uint32\n\tFlags       uint32\n\tFssubtype   uint32\n\tFstypename  [16]int8\n\tMntonname   [1024]int8\n\tMntfromname [1024]int8\n\tReserved    [8]uint32\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Fstore_t struct {\n\tFlags      uint32\n\tPosmode    int32\n\tOffset     int64\n\tLength     int64\n\tBytesalloc int64\n}\n\ntype Radvisory_t struct {\n\tOffset int64\n\tCount  int32\n}\n\ntype Fbootstraptransfer_t struct {\n\tOffset int64\n\tLength uint32\n\tBuffer *byte\n}\n\ntype Log2phys_t struct {\n\tFlags       uint32\n\tContigbytes int64\n\tDevoffset   int64\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tSeekoff   uint64\n\tReclen    uint16\n\tNamlen    uint16\n\tType      uint8\n\tName      [1024]int8\n\tPad_cgo_0 [3]byte\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     int32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  uint32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x14\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet4Pktinfo     = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint32\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int32\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\nconst (\n\tSizeofIfMsghdr    = 0x70\n\tSizeofIfData      = 0x60\n\tSizeofIfaMsghdr   = 0x14\n\tSizeofIfmaMsghdr  = 0x10\n\tSizeofIfmaMsghdr2 = 0x14\n\tSizeofRtMsghdr    = 0x5c\n\tSizeofRtMetrics   = 0x38\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tTypelen    uint8\n\tPhysical   uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tRecvquota  uint8\n\tXmitquota  uint8\n\tUnused1    uint8\n\tMtu        uint32\n\tMetric     uint32\n\tBaudrate   uint32\n\tIpackets   uint32\n\tIerrors    uint32\n\tOpackets   uint32\n\tOerrors    uint32\n\tCollisions uint32\n\tIbytes     uint32\n\tObytes     uint32\n\tImcasts    uint32\n\tOmcasts    uint32\n\tIqdrops    uint32\n\tNoproto    uint32\n\tRecvtiming uint32\n\tXmittiming uint32\n\tLastchange Timeval\n\tUnused2    uint32\n\tHwassist   uint32\n\tReserved1  uint32\n\tReserved2  uint32\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfmaMsghdr2 struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tRefcount  int32\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     uint32\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint32\n\tMtu      uint32\n\tHopcount uint32\n\tExpire   int32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPksent   uint32\n\tFiller   [4]uint32\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x8\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x2\n\tAT_REMOVEDIR        = 0x80\n\tAT_SYMLINK_FOLLOW   = 0x40\n\tAT_SYMLINK_NOFOLLOW = 0x20\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go",
    "content": "// cgo -godefs types_darwin.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,darwin\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec       int64\n\tUsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Timeval32 struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev           int32\n\tMode          uint16\n\tNlink         uint16\n\tIno           uint64\n\tUid           uint32\n\tGid           uint32\n\tRdev          int32\n\tPad_cgo_0     [4]byte\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tBirthtimespec Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       int32\n\tFlags         uint32\n\tGen           uint32\n\tLspare        int32\n\tQspare        [2]int64\n}\n\ntype Statfs_t struct {\n\tBsize       uint32\n\tIosize      int32\n\tBlocks      uint64\n\tBfree       uint64\n\tBavail      uint64\n\tFiles       uint64\n\tFfree       uint64\n\tFsid        Fsid\n\tOwner       uint32\n\tType        uint32\n\tFlags       uint32\n\tFssubtype   uint32\n\tFstypename  [16]int8\n\tMntonname   [1024]int8\n\tMntfromname [1024]int8\n\tReserved    [8]uint32\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Fstore_t struct {\n\tFlags      uint32\n\tPosmode    int32\n\tOffset     int64\n\tLength     int64\n\tBytesalloc int64\n}\n\ntype Radvisory_t struct {\n\tOffset    int64\n\tCount     int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Fbootstraptransfer_t struct {\n\tOffset int64\n\tLength uint64\n\tBuffer *byte\n}\n\ntype Log2phys_t struct {\n\tFlags     uint32\n\tPad_cgo_0 [8]byte\n\tPad_cgo_1 [8]byte\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tSeekoff   uint64\n\tReclen    uint16\n\tNamlen    uint16\n\tType      uint8\n\tName      [1024]int8\n\tPad_cgo_0 [3]byte\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     int32\n\tPad_cgo_1  [4]byte\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  uint32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x14\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x30\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet4Pktinfo     = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint64\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int64\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\nconst (\n\tSizeofIfMsghdr    = 0x70\n\tSizeofIfData      = 0x60\n\tSizeofIfaMsghdr   = 0x14\n\tSizeofIfmaMsghdr  = 0x10\n\tSizeofIfmaMsghdr2 = 0x14\n\tSizeofRtMsghdr    = 0x5c\n\tSizeofRtMetrics   = 0x38\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tTypelen    uint8\n\tPhysical   uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tRecvquota  uint8\n\tXmitquota  uint8\n\tUnused1    uint8\n\tMtu        uint32\n\tMetric     uint32\n\tBaudrate   uint32\n\tIpackets   uint32\n\tIerrors    uint32\n\tOpackets   uint32\n\tOerrors    uint32\n\tCollisions uint32\n\tIbytes     uint32\n\tObytes     uint32\n\tImcasts    uint32\n\tOmcasts    uint32\n\tIqdrops    uint32\n\tNoproto    uint32\n\tRecvtiming uint32\n\tXmittiming uint32\n\tLastchange Timeval32\n\tUnused2    uint32\n\tHwassist   uint32\n\tReserved1  uint32\n\tReserved2  uint32\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfmaMsghdr2 struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tRefcount  int32\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     uint32\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint32\n\tMtu      uint32\n\tHopcount uint32\n\tExpire   int32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPksent   uint32\n\tFiller   [4]uint32\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x10\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen       uint32\n\tPad_cgo_0 [4]byte\n\tInsns     *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval32\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype Termios struct {\n\tIflag     uint64\n\tOflag     uint64\n\tCflag     uint64\n\tLflag     uint64\n\tCc        [20]uint8\n\tPad_cgo_0 [4]byte\n\tIspeed    uint64\n\tOspeed    uint64\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x2\n\tAT_REMOVEDIR        = 0x80\n\tAT_SYMLINK_FOLLOW   = 0x40\n\tAT_SYMLINK_NOFOLLOW = 0x20\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go",
    "content": "// NOTE: cgo can't generate struct Stat_t and struct Statfs_t yet\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs types_darwin.go\n\n// +build arm,darwin\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int32\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Timeval32 [0]byte\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev           int32\n\tMode          uint16\n\tNlink         uint16\n\tIno           uint64\n\tUid           uint32\n\tGid           uint32\n\tRdev          int32\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tBirthtimespec Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       int32\n\tFlags         uint32\n\tGen           uint32\n\tLspare        int32\n\tQspare        [2]int64\n}\n\ntype Statfs_t struct {\n\tBsize       uint32\n\tIosize      int32\n\tBlocks      uint64\n\tBfree       uint64\n\tBavail      uint64\n\tFiles       uint64\n\tFfree       uint64\n\tFsid        Fsid\n\tOwner       uint32\n\tType        uint32\n\tFlags       uint32\n\tFssubtype   uint32\n\tFstypename  [16]int8\n\tMntonname   [1024]int8\n\tMntfromname [1024]int8\n\tReserved    [8]uint32\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Fstore_t struct {\n\tFlags      uint32\n\tPosmode    int32\n\tOffset     int64\n\tLength     int64\n\tBytesalloc int64\n}\n\ntype Radvisory_t struct {\n\tOffset int64\n\tCount  int32\n}\n\ntype Fbootstraptransfer_t struct {\n\tOffset int64\n\tLength uint32\n\tBuffer *byte\n}\n\ntype Log2phys_t struct {\n\tFlags       uint32\n\tContigbytes int64\n\tDevoffset   int64\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tSeekoff   uint64\n\tReclen    uint16\n\tNamlen    uint16\n\tType      uint8\n\tName      [1024]int8\n\tPad_cgo_0 [3]byte\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     int32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  uint32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x14\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet4Pktinfo     = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint32\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int32\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\nconst (\n\tSizeofIfMsghdr    = 0x70\n\tSizeofIfData      = 0x60\n\tSizeofIfaMsghdr   = 0x14\n\tSizeofIfmaMsghdr  = 0x10\n\tSizeofIfmaMsghdr2 = 0x14\n\tSizeofRtMsghdr    = 0x5c\n\tSizeofRtMetrics   = 0x38\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tTypelen    uint8\n\tPhysical   uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tRecvquota  uint8\n\tXmitquota  uint8\n\tUnused1    uint8\n\tMtu        uint32\n\tMetric     uint32\n\tBaudrate   uint32\n\tIpackets   uint32\n\tIerrors    uint32\n\tOpackets   uint32\n\tOerrors    uint32\n\tCollisions uint32\n\tIbytes     uint32\n\tObytes     uint32\n\tImcasts    uint32\n\tOmcasts    uint32\n\tIqdrops    uint32\n\tNoproto    uint32\n\tRecvtiming uint32\n\tXmittiming uint32\n\tLastchange Timeval\n\tUnused2    uint32\n\tHwassist   uint32\n\tReserved1  uint32\n\tReserved2  uint32\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfmaMsghdr2 struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tRefcount  int32\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     uint32\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint32\n\tMtu      uint32\n\tHopcount uint32\n\tExpire   int32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPksent   uint32\n\tFiller   [4]uint32\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x8\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x2\n\tAT_REMOVEDIR        = 0x80\n\tAT_SYMLINK_FOLLOW   = 0x40\n\tAT_SYMLINK_NOFOLLOW = 0x20\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go",
    "content": "// cgo -godefs types_darwin.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm64,darwin\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec       int64\n\tUsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Timeval32 struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev           int32\n\tMode          uint16\n\tNlink         uint16\n\tIno           uint64\n\tUid           uint32\n\tGid           uint32\n\tRdev          int32\n\tPad_cgo_0     [4]byte\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tBirthtimespec Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       int32\n\tFlags         uint32\n\tGen           uint32\n\tLspare        int32\n\tQspare        [2]int64\n}\n\ntype Statfs_t struct {\n\tBsize       uint32\n\tIosize      int32\n\tBlocks      uint64\n\tBfree       uint64\n\tBavail      uint64\n\tFiles       uint64\n\tFfree       uint64\n\tFsid        Fsid\n\tOwner       uint32\n\tType        uint32\n\tFlags       uint32\n\tFssubtype   uint32\n\tFstypename  [16]int8\n\tMntonname   [1024]int8\n\tMntfromname [1024]int8\n\tReserved    [8]uint32\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Fstore_t struct {\n\tFlags      uint32\n\tPosmode    int32\n\tOffset     int64\n\tLength     int64\n\tBytesalloc int64\n}\n\ntype Radvisory_t struct {\n\tOffset    int64\n\tCount     int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Fbootstraptransfer_t struct {\n\tOffset int64\n\tLength uint64\n\tBuffer *byte\n}\n\ntype Log2phys_t struct {\n\tFlags     uint32\n\tPad_cgo_0 [8]byte\n\tPad_cgo_1 [8]byte\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tSeekoff   uint64\n\tReclen    uint16\n\tNamlen    uint16\n\tType      uint8\n\tName      [1024]int8\n\tPad_cgo_0 [3]byte\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     int32\n\tPad_cgo_1  [4]byte\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  uint32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x14\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x30\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet4Pktinfo     = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint64\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int64\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\nconst (\n\tSizeofIfMsghdr    = 0x70\n\tSizeofIfData      = 0x60\n\tSizeofIfaMsghdr   = 0x14\n\tSizeofIfmaMsghdr  = 0x10\n\tSizeofIfmaMsghdr2 = 0x14\n\tSizeofRtMsghdr    = 0x5c\n\tSizeofRtMetrics   = 0x38\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tTypelen    uint8\n\tPhysical   uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tRecvquota  uint8\n\tXmitquota  uint8\n\tUnused1    uint8\n\tMtu        uint32\n\tMetric     uint32\n\tBaudrate   uint32\n\tIpackets   uint32\n\tIerrors    uint32\n\tOpackets   uint32\n\tOerrors    uint32\n\tCollisions uint32\n\tIbytes     uint32\n\tObytes     uint32\n\tImcasts    uint32\n\tOmcasts    uint32\n\tIqdrops    uint32\n\tNoproto    uint32\n\tRecvtiming uint32\n\tXmittiming uint32\n\tLastchange Timeval32\n\tUnused2    uint32\n\tHwassist   uint32\n\tReserved1  uint32\n\tReserved2  uint32\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfmaMsghdr2 struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tRefcount  int32\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     uint32\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint32\n\tMtu      uint32\n\tHopcount uint32\n\tExpire   int32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPksent   uint32\n\tFiller   [4]uint32\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x10\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen       uint32\n\tPad_cgo_0 [4]byte\n\tInsns     *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval32\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype Termios struct {\n\tIflag     uint64\n\tOflag     uint64\n\tCflag     uint64\n\tLflag     uint64\n\tCc        [20]uint8\n\tPad_cgo_0 [4]byte\n\tIspeed    uint64\n\tOspeed    uint64\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x2\n\tAT_REMOVEDIR        = 0x80\n\tAT_SYMLINK_FOLLOW   = 0x40\n\tAT_SYMLINK_NOFOLLOW = 0x20\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go",
    "content": "// cgo -godefs types_dragonfly.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,dragonfly\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur int64\n\tMax int64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tIno      uint64\n\tNlink    uint32\n\tDev      uint32\n\tMode     uint16\n\tPadding1 uint16\n\tUid      uint32\n\tGid      uint32\n\tRdev     uint32\n\tAtim     Timespec\n\tMtim     Timespec\n\tCtim     Timespec\n\tSize     int64\n\tBlocks   int64\n\tBlksize  uint32\n\tFlags    uint32\n\tGen      uint32\n\tLspare   int32\n\tQspare1  int64\n\tQspare2  int64\n}\n\ntype Statfs_t struct {\n\tSpare2      int64\n\tBsize       int64\n\tIosize      int64\n\tBlocks      int64\n\tBfree       int64\n\tBavail      int64\n\tFiles       int64\n\tFfree       int64\n\tFsid        Fsid\n\tOwner       uint32\n\tType        int32\n\tFlags       int32\n\tPad_cgo_0   [4]byte\n\tSyncwrites  int64\n\tAsyncwrites int64\n\tFstypename  [16]int8\n\tMntonname   [80]int8\n\tSyncreads   int64\n\tAsyncreads  int64\n\tSpares1     int16\n\tMntfromname [80]int8\n\tSpares2     int16\n\tPad_cgo_1   [4]byte\n\tSpare       [2]int64\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Dirent struct {\n\tFileno  uint64\n\tNamlen  uint16\n\tType    uint8\n\tUnused1 uint8\n\tUnused2 uint32\n\tName    [256]int8\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n\tRcf    uint16\n\tRoute  [16]uint16\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     int32\n\tPad_cgo_1  [4]byte\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x36\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x30\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint64\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int64\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [16]uint64\n}\n\nconst (\n\tSizeofIfMsghdr         = 0xb0\n\tSizeofIfData           = 0xa0\n\tSizeofIfaMsghdr        = 0x14\n\tSizeofIfmaMsghdr       = 0x10\n\tSizeofIfAnnounceMsghdr = 0x18\n\tSizeofRtMsghdr         = 0x98\n\tSizeofRtMetrics        = 0x70\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tPhysical   uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tRecvquota  uint8\n\tXmitquota  uint8\n\tPad_cgo_0  [2]byte\n\tMtu        uint64\n\tMetric     uint64\n\tLink_state uint64\n\tBaudrate   uint64\n\tIpackets   uint64\n\tIerrors    uint64\n\tOpackets   uint64\n\tOerrors    uint64\n\tCollisions uint64\n\tIbytes     uint64\n\tObytes     uint64\n\tImcasts    uint64\n\tOmcasts    uint64\n\tIqdrops    uint64\n\tNoproto    uint64\n\tHwassist   uint64\n\tOqdrops    uint64\n\tLastchange Timeval\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tIndex   uint16\n\tName    [16]int8\n\tWhat    uint16\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     uint64\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks     uint64\n\tMtu       uint64\n\tPksent    uint64\n\tExpire    uint64\n\tSendpipe  uint64\n\tSsthresh  uint64\n\tRtt       uint64\n\tRttvar    uint64\n\tRecvpipe  uint64\n\tHopcount  uint64\n\tMssopt    uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tMsl       uint64\n\tIwmaxsegs uint64\n\tIwcapsegs uint64\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x10\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x20\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen       uint32\n\tPad_cgo_0 [4]byte\n\tInsns     *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [6]byte\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = 0xfffafdcd\n\tAT_SYMLINK_NOFOLLOW = 0x1\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go",
    "content": "// cgo -godefs types_freebsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,freebsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int32\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur int64\n\tMax int64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tDev           uint32\n\tIno           uint32\n\tMode          uint16\n\tNlink         uint16\n\tUid           uint32\n\tGid           uint32\n\tRdev          uint32\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       int32\n\tFlags         uint32\n\tGen           uint32\n\tLspare        int32\n\tBirthtimespec Timespec\n\tPad_cgo_0     [8]byte\n}\n\ntype Statfs_t struct {\n\tVersion     uint32\n\tType        uint32\n\tFlags       uint64\n\tBsize       uint64\n\tIosize      uint64\n\tBlocks      uint64\n\tBfree       uint64\n\tBavail      int64\n\tFiles       uint64\n\tFfree       int64\n\tSyncwrites  uint64\n\tAsyncwrites uint64\n\tSyncreads   uint64\n\tAsyncreads  uint64\n\tSpare       [10]uint64\n\tNamemax     uint32\n\tOwner       uint32\n\tFsid        Fsid\n\tCharspare   [80]int8\n\tFstypename  [16]int8\n\tMntfromname [88]int8\n\tMntonname   [88]int8\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n\tSysid  int32\n}\n\ntype Dirent struct {\n\tFileno uint32\n\tReclen uint16\n\tType   uint8\n\tNamlen uint8\n\tName   [256]int8\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [46]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     int32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x36\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPMreqn          = 0xc\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint32\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int32\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tX__fds_bits [32]uint32\n}\n\nconst (\n\tsizeofIfMsghdr         = 0xa8\n\tSizeofIfMsghdr         = 0x60\n\tsizeofIfData           = 0x98\n\tSizeofIfData           = 0x50\n\tSizeofIfaMsghdr        = 0x14\n\tSizeofIfmaMsghdr       = 0x10\n\tSizeofIfAnnounceMsghdr = 0x18\n\tSizeofRtMsghdr         = 0x5c\n\tSizeofRtMetrics        = 0x38\n)\n\ntype ifMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      ifData\n}\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype ifData struct {\n\tType              uint8\n\tPhysical          uint8\n\tAddrlen           uint8\n\tHdrlen            uint8\n\tLink_state        uint8\n\tVhid              uint8\n\tDatalen           uint16\n\tMtu               uint32\n\tMetric            uint32\n\tBaudrate          uint64\n\tIpackets          uint64\n\tIerrors           uint64\n\tOpackets          uint64\n\tOerrors           uint64\n\tCollisions        uint64\n\tIbytes            uint64\n\tObytes            uint64\n\tImcasts           uint64\n\tOmcasts           uint64\n\tIqdrops           uint64\n\tOqdrops           uint64\n\tNoproto           uint64\n\tHwassist          uint64\n\tX__ifi_epoch      [8]byte\n\tX__ifi_lastchange [16]byte\n}\n\ntype IfData struct {\n\tType        uint8\n\tPhysical    uint8\n\tAddrlen     uint8\n\tHdrlen      uint8\n\tLink_state  uint8\n\tSpare_char1 uint8\n\tSpare_char2 uint8\n\tDatalen     uint8\n\tMtu         uint32\n\tMetric      uint32\n\tBaudrate    uint32\n\tIpackets    uint32\n\tIerrors     uint32\n\tOpackets    uint32\n\tOerrors     uint32\n\tCollisions  uint32\n\tIbytes      uint32\n\tObytes      uint32\n\tImcasts     uint32\n\tOmcasts     uint32\n\tIqdrops     uint32\n\tNoproto     uint32\n\tHwassist    uint32\n\tEpoch       int32\n\tLastchange  Timeval\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tIndex   uint16\n\tName    [16]int8\n\tWhat    uint16\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tFmask     int32\n\tInits     uint32\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint32\n\tMtu      uint32\n\tHopcount uint32\n\tExpire   uint32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPksent   uint32\n\tWeight   uint32\n\tFiller   [3]uint32\n}\n\nconst (\n\tSizeofBpfVersion    = 0x4\n\tSizeofBpfStat       = 0x8\n\tSizeofBpfZbuf       = 0xc\n\tSizeofBpfProgram    = 0x8\n\tSizeofBpfInsn       = 0x8\n\tSizeofBpfHdr        = 0x14\n\tSizeofBpfZbufHeader = 0x20\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfZbuf struct {\n\tBufa   *byte\n\tBufb   *byte\n\tBuflen uint32\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype BpfZbufHeader struct {\n\tKernel_gen uint32\n\tKernel_len uint32\n\tUser_gen   uint32\n\tX_bzh_pad  [5]uint32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x800\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x200\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR      = 0x8\n\tPOLLHUP      = 0x10\n\tPOLLIN       = 0x1\n\tPOLLINIGNEOF = 0x2000\n\tPOLLNVAL     = 0x20\n\tPOLLOUT      = 0x4\n\tPOLLPRI      = 0x2\n\tPOLLRDBAND   = 0x80\n\tPOLLRDNORM   = 0x40\n\tPOLLWRBAND   = 0x100\n\tPOLLWRNORM   = 0x4\n)\n\ntype CapRights struct {\n\tRights [2]uint64\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go",
    "content": "// cgo -godefs types_freebsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,freebsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur int64\n\tMax int64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tDev           uint32\n\tIno           uint32\n\tMode          uint16\n\tNlink         uint16\n\tUid           uint32\n\tGid           uint32\n\tRdev          uint32\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       int32\n\tFlags         uint32\n\tGen           uint32\n\tLspare        int32\n\tBirthtimespec Timespec\n}\n\ntype Statfs_t struct {\n\tVersion     uint32\n\tType        uint32\n\tFlags       uint64\n\tBsize       uint64\n\tIosize      uint64\n\tBlocks      uint64\n\tBfree       uint64\n\tBavail      int64\n\tFiles       uint64\n\tFfree       int64\n\tSyncwrites  uint64\n\tAsyncwrites uint64\n\tSyncreads   uint64\n\tAsyncreads  uint64\n\tSpare       [10]uint64\n\tNamemax     uint32\n\tOwner       uint32\n\tFsid        Fsid\n\tCharspare   [80]int8\n\tFstypename  [16]int8\n\tMntfromname [88]int8\n\tMntonname   [88]int8\n}\n\ntype Flock_t struct {\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tType      int16\n\tWhence    int16\n\tSysid     int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Dirent struct {\n\tFileno uint32\n\tReclen uint16\n\tType   uint8\n\tNamlen uint8\n\tName   [256]int8\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [46]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     int32\n\tPad_cgo_1  [4]byte\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x36\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPMreqn          = 0xc\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x30\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint64\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int64\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tX__fds_bits [16]uint64\n}\n\nconst (\n\tsizeofIfMsghdr         = 0xa8\n\tSizeofIfMsghdr         = 0xa8\n\tsizeofIfData           = 0x98\n\tSizeofIfData           = 0x98\n\tSizeofIfaMsghdr        = 0x14\n\tSizeofIfmaMsghdr       = 0x10\n\tSizeofIfAnnounceMsghdr = 0x18\n\tSizeofRtMsghdr         = 0x98\n\tSizeofRtMetrics        = 0x70\n)\n\ntype ifMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      ifData\n}\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype ifData struct {\n\tType              uint8\n\tPhysical          uint8\n\tAddrlen           uint8\n\tHdrlen            uint8\n\tLink_state        uint8\n\tVhid              uint8\n\tDatalen           uint16\n\tMtu               uint32\n\tMetric            uint32\n\tBaudrate          uint64\n\tIpackets          uint64\n\tIerrors           uint64\n\tOpackets          uint64\n\tOerrors           uint64\n\tCollisions        uint64\n\tIbytes            uint64\n\tObytes            uint64\n\tImcasts           uint64\n\tOmcasts           uint64\n\tIqdrops           uint64\n\tOqdrops           uint64\n\tNoproto           uint64\n\tHwassist          uint64\n\tX__ifi_epoch      [8]byte\n\tX__ifi_lastchange [16]byte\n}\n\ntype IfData struct {\n\tType        uint8\n\tPhysical    uint8\n\tAddrlen     uint8\n\tHdrlen      uint8\n\tLink_state  uint8\n\tSpare_char1 uint8\n\tSpare_char2 uint8\n\tDatalen     uint8\n\tMtu         uint64\n\tMetric      uint64\n\tBaudrate    uint64\n\tIpackets    uint64\n\tIerrors     uint64\n\tOpackets    uint64\n\tOerrors     uint64\n\tCollisions  uint64\n\tIbytes      uint64\n\tObytes      uint64\n\tImcasts     uint64\n\tOmcasts     uint64\n\tIqdrops     uint64\n\tNoproto     uint64\n\tHwassist    uint64\n\tEpoch       int64\n\tLastchange  Timeval\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tIndex   uint16\n\tName    [16]int8\n\tWhat    uint16\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tFmask     int32\n\tInits     uint64\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint64\n\tMtu      uint64\n\tHopcount uint64\n\tExpire   uint64\n\tRecvpipe uint64\n\tSendpipe uint64\n\tSsthresh uint64\n\tRtt      uint64\n\tRttvar   uint64\n\tPksent   uint64\n\tWeight   uint64\n\tFiller   [3]uint64\n}\n\nconst (\n\tSizeofBpfVersion    = 0x4\n\tSizeofBpfStat       = 0x8\n\tSizeofBpfZbuf       = 0x18\n\tSizeofBpfProgram    = 0x10\n\tSizeofBpfInsn       = 0x8\n\tSizeofBpfHdr        = 0x20\n\tSizeofBpfZbufHeader = 0x20\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfZbuf struct {\n\tBufa   *byte\n\tBufb   *byte\n\tBuflen uint64\n}\n\ntype BpfProgram struct {\n\tLen       uint32\n\tPad_cgo_0 [4]byte\n\tInsns     *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [6]byte\n}\n\ntype BpfZbufHeader struct {\n\tKernel_gen uint32\n\tKernel_len uint32\n\tUser_gen   uint32\n\tX_bzh_pad  [5]uint32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x800\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x200\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR      = 0x8\n\tPOLLHUP      = 0x10\n\tPOLLIN       = 0x1\n\tPOLLINIGNEOF = 0x2000\n\tPOLLNVAL     = 0x20\n\tPOLLOUT      = 0x4\n\tPOLLPRI      = 0x2\n\tPOLLRDBAND   = 0x80\n\tPOLLRDNORM   = 0x40\n\tPOLLWRBAND   = 0x100\n\tPOLLWRNORM   = 0x4\n)\n\ntype CapRights struct {\n\tRights [2]uint64\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go",
    "content": "// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,freebsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec       int64\n\tNsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Timeval struct {\n\tSec       int64\n\tUsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur int64\n\tMax int64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tDev           uint32\n\tIno           uint32\n\tMode          uint16\n\tNlink         uint16\n\tUid           uint32\n\tGid           uint32\n\tRdev          uint32\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       int32\n\tFlags         uint32\n\tGen           uint32\n\tLspare        int32\n\tBirthtimespec Timespec\n}\n\ntype Statfs_t struct {\n\tVersion     uint32\n\tType        uint32\n\tFlags       uint64\n\tBsize       uint64\n\tIosize      uint64\n\tBlocks      uint64\n\tBfree       uint64\n\tBavail      int64\n\tFiles       uint64\n\tFfree       int64\n\tSyncwrites  uint64\n\tAsyncwrites uint64\n\tSyncreads   uint64\n\tAsyncreads  uint64\n\tSpare       [10]uint64\n\tNamemax     uint32\n\tOwner       uint32\n\tFsid        Fsid\n\tCharspare   [80]int8\n\tFstypename  [16]int8\n\tMntfromname [88]int8\n\tMntonname   [88]int8\n}\n\ntype Flock_t struct {\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tType      int16\n\tWhence    int16\n\tSysid     int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Dirent struct {\n\tFileno uint32\n\tReclen uint16\n\tType   uint8\n\tNamlen uint8\n\tName   [256]int8\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [46]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     int32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x36\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPMreqn          = 0xc\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint32\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int32\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tX__fds_bits [32]uint32\n}\n\nconst (\n\tsizeofIfMsghdr         = 0xa8\n\tSizeofIfMsghdr         = 0x70\n\tsizeofIfData           = 0x98\n\tSizeofIfData           = 0x60\n\tSizeofIfaMsghdr        = 0x14\n\tSizeofIfmaMsghdr       = 0x10\n\tSizeofIfAnnounceMsghdr = 0x18\n\tSizeofRtMsghdr         = 0x5c\n\tSizeofRtMetrics        = 0x38\n)\n\ntype ifMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      ifData\n}\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype ifData struct {\n\tType              uint8\n\tPhysical          uint8\n\tAddrlen           uint8\n\tHdrlen            uint8\n\tLink_state        uint8\n\tVhid              uint8\n\tDatalen           uint16\n\tMtu               uint32\n\tMetric            uint32\n\tBaudrate          uint64\n\tIpackets          uint64\n\tIerrors           uint64\n\tOpackets          uint64\n\tOerrors           uint64\n\tCollisions        uint64\n\tIbytes            uint64\n\tObytes            uint64\n\tImcasts           uint64\n\tOmcasts           uint64\n\tIqdrops           uint64\n\tOqdrops           uint64\n\tNoproto           uint64\n\tHwassist          uint64\n\tX__ifi_epoch      [8]byte\n\tX__ifi_lastchange [16]byte\n}\n\ntype IfData struct {\n\tType        uint8\n\tPhysical    uint8\n\tAddrlen     uint8\n\tHdrlen      uint8\n\tLink_state  uint8\n\tSpare_char1 uint8\n\tSpare_char2 uint8\n\tDatalen     uint8\n\tMtu         uint32\n\tMetric      uint32\n\tBaudrate    uint32\n\tIpackets    uint32\n\tIerrors     uint32\n\tOpackets    uint32\n\tOerrors     uint32\n\tCollisions  uint32\n\tIbytes      uint32\n\tObytes      uint32\n\tImcasts     uint32\n\tOmcasts     uint32\n\tIqdrops     uint32\n\tNoproto     uint32\n\tHwassist    uint32\n\tPad_cgo_0   [4]byte\n\tEpoch       int64\n\tLastchange  Timeval\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype IfmaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tIndex   uint16\n\tName    [16]int8\n\tWhat    uint16\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tFmask     int32\n\tInits     uint32\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint32\n\tMtu      uint32\n\tHopcount uint32\n\tExpire   uint32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPksent   uint32\n\tWeight   uint32\n\tFiller   [3]uint32\n}\n\nconst (\n\tSizeofBpfVersion    = 0x4\n\tSizeofBpfStat       = 0x8\n\tSizeofBpfZbuf       = 0xc\n\tSizeofBpfProgram    = 0x8\n\tSizeofBpfInsn       = 0x8\n\tSizeofBpfHdr        = 0x20\n\tSizeofBpfZbufHeader = 0x20\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfZbuf struct {\n\tBufa   *byte\n\tBufb   *byte\n\tBuflen uint32\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    Timeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [6]byte\n}\n\ntype BpfZbufHeader struct {\n\tKernel_gen uint32\n\tKernel_len uint32\n\tUser_gen   uint32\n\tX_bzh_pad  [5]uint32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x800\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x200\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR      = 0x8\n\tPOLLHUP      = 0x10\n\tPOLLIN       = 0x1\n\tPOLLINIGNEOF = 0x2000\n\tPOLLNVAL     = 0x20\n\tPOLLOUT      = 0x4\n\tPOLLPRI      = 0x2\n\tPOLLRDBAND   = 0x80\n\tPOLLRDNORM   = 0x40\n\tPOLLWRBAND   = 0x100\n\tPOLLWRNORM   = 0x4\n)\n\ntype CapRights struct {\n\tRights [2]uint64\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_386.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int32\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Timex struct {\n\tModes     uint32\n\tOffset    int32\n\tFreq      int32\n\tMaxerror  int32\n\tEsterror  int32\n\tStatus    int32\n\tConstant  int32\n\tPrecision int32\n\tTolerance int32\n\tTime      Timeval\n\tTick      int32\n\tPpsfreq   int32\n\tJitter    int32\n\tShift     int32\n\tStabil    int32\n\tJitcnt    int32\n\tCalcnt    int32\n\tErrcnt    int32\n\tStbcnt    int32\n\tTai       int32\n\tPad_cgo_0 [44]byte\n}\n\ntype Time_t int32\n\ntype Tms struct {\n\tUtime  int32\n\tStime  int32\n\tCutime int32\n\tCstime int32\n}\n\ntype Utimbuf struct {\n\tActime  int32\n\tModtime int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev       uint64\n\tX__pad1   uint16\n\tPad_cgo_0 [2]byte\n\tX__st_ino uint32\n\tMode      uint32\n\tNlink     uint32\n\tUid       uint32\n\tGid       uint32\n\tRdev      uint64\n\tX__pad2   uint16\n\tPad_cgo_1 [2]byte\n\tSize      int64\n\tBlksize   int32\n\tBlocks    int64\n\tAtim      Timespec\n\tMtim      Timespec\n\tCtim      Timespec\n\tIno       uint64\n}\n\ntype Statfs_t struct {\n\tType    int32\n\tBsize   int32\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tFsid    Fsid\n\tNamelen int32\n\tFrsize  int32\n\tFlags   int32\n\tSpare   [4]int32\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [1]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType   int16\n\tWhence int16\n\tStart  int64\n\tLen    int64\n\tPid    int32\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     uint32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x8\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x1c\n\tSizeofCmsghdr           = 0xc\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x8\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [2]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tEbx      int32\n\tEcx      int32\n\tEdx      int32\n\tEsi      int32\n\tEdi      int32\n\tEbp      int32\n\tEax      int32\n\tXds      int32\n\tXes      int32\n\tXfs      int32\n\tXgs      int32\n\tOrig_eax int32\n\tEip      int32\n\tXcs      int32\n\tEflags   int32\n\tEsp      int32\n\tXss      int32\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\ntype Sysinfo_t struct {\n\tUptime    int32\n\tLoads     [3]uint32\n\tTotalram  uint32\n\tFreeram   uint32\n\tSharedram uint32\n\tBufferram uint32\n\tTotalswap uint32\n\tFreeswap  uint32\n\tProcs     uint16\n\tPad       uint16\n\tTotalhigh uint32\n\tFreehigh  uint32\n\tUnit      uint32\n\tX_f       [8]int8\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree  int32\n\tTinode uint32\n\tFname  [6]int8\n\tFpack  [6]int8\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [32]uint32\n}\n\nconst RNDGETENTCNT = 0x80045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [19]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timex struct {\n\tModes     uint32\n\tPad_cgo_0 [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\tPad_cgo_1 [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\tPad_cgo_2 [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\tPad_cgo_3 [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint64\n\tIno     uint64\n\tNlink   uint64\n\tMode    uint32\n\tUid     uint32\n\tGid     uint32\n\tX__pad0 int32\n\tRdev    uint64\n\tSize    int64\n\tBlksize int64\n\tBlocks  int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\t_       [3]int64\n}\n\ntype Statfs_t struct {\n\tType    int64\n\tBsize   int64\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tFsid    Fsid\n\tNamelen int64\n\tFrsize  int64\n\tFlags   int64\n\tSpare   [4]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\tPad_cgo_1  [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x10\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [6]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tR15      uint64\n\tR14      uint64\n\tR13      uint64\n\tR12      uint64\n\tRbp      uint64\n\tRbx      uint64\n\tR11      uint64\n\tR10      uint64\n\tR9       uint64\n\tR8       uint64\n\tRax      uint64\n\tRcx      uint64\n\tRdx      uint64\n\tRsi      uint64\n\tRdi      uint64\n\tOrig_rax uint64\n\tRip      uint64\n\tCs       uint64\n\tEflags   uint64\n\tRsp      uint64\n\tSs       uint64\n\tFs_base  uint64\n\tGs_base  uint64\n\tDs       uint64\n\tEs       uint64\n\tFs       uint64\n\tGs       uint64\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\tX_f       [0]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int32\n\tPad_cgo_0 [4]byte\n\tTinode    uint64\n\tFname     [6]int8\n\tFpack     [6]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [16]uint64\n}\n\nconst RNDGETENTCNT = 0x80045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [19]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_arm.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int32\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Timex struct {\n\tModes     uint32\n\tOffset    int32\n\tFreq      int32\n\tMaxerror  int32\n\tEsterror  int32\n\tStatus    int32\n\tConstant  int32\n\tPrecision int32\n\tTolerance int32\n\tTime      Timeval\n\tTick      int32\n\tPpsfreq   int32\n\tJitter    int32\n\tShift     int32\n\tStabil    int32\n\tJitcnt    int32\n\tCalcnt    int32\n\tErrcnt    int32\n\tStbcnt    int32\n\tTai       int32\n\tPad_cgo_0 [44]byte\n}\n\ntype Time_t int32\n\ntype Tms struct {\n\tUtime  int32\n\tStime  int32\n\tCutime int32\n\tCstime int32\n}\n\ntype Utimbuf struct {\n\tActime  int32\n\tModtime int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev       uint64\n\tX__pad1   uint16\n\tPad_cgo_0 [2]byte\n\tX__st_ino uint32\n\tMode      uint32\n\tNlink     uint32\n\tUid       uint32\n\tGid       uint32\n\tRdev      uint64\n\tX__pad2   uint16\n\tPad_cgo_1 [6]byte\n\tSize      int64\n\tBlksize   int32\n\tPad_cgo_2 [4]byte\n\tBlocks    int64\n\tAtim      Timespec\n\tMtim      Timespec\n\tCtim      Timespec\n\tIno       uint64\n}\n\ntype Statfs_t struct {\n\tType      int32\n\tBsize     int32\n\tBlocks    uint64\n\tBfree     uint64\n\tBavail    uint64\n\tFiles     uint64\n\tFfree     uint64\n\tFsid      Fsid\n\tNamelen   int32\n\tFrsize    int32\n\tFlags     int32\n\tSpare     [4]int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]uint8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]uint8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]uint8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     uint32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x8\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x1c\n\tSizeofCmsghdr           = 0xc\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x8\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [2]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tUregs [18]uint32\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\ntype Sysinfo_t struct {\n\tUptime    int32\n\tLoads     [3]uint32\n\tTotalram  uint32\n\tFreeram   uint32\n\tSharedram uint32\n\tBufferram uint32\n\tTotalswap uint32\n\tFreeswap  uint32\n\tProcs     uint16\n\tPad       uint16\n\tTotalhigh uint32\n\tFreehigh  uint32\n\tUnit      uint32\n\tX_f       [8]uint8\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree  int32\n\tTinode uint32\n\tFname  [6]uint8\n\tFpack  [6]uint8\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tPadFd  int32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [32]uint32\n}\n\nconst RNDGETENTCNT = 0x80045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [19]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]uint8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm64,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timex struct {\n\tModes     uint32\n\tPad_cgo_0 [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\tPad_cgo_1 [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\tPad_cgo_2 [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\tPad_cgo_3 [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint64\n\tIno     uint64\n\tMode    uint32\n\tNlink   uint32\n\tUid     uint32\n\tGid     uint32\n\tRdev    uint64\n\tX__pad1 uint64\n\tSize    int64\n\tBlksize int32\n\tX__pad2 int32\n\tBlocks  int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\t_       [2]int32\n}\n\ntype Statfs_t struct {\n\tType    int64\n\tBsize   int64\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tFsid    Fsid\n\tNamelen int64\n\tFrsize  int64\n\tFlags   int64\n\tSpare   [4]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\tPad_cgo_1  [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x10\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [6]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tRegs   [31]uint64\n\tSp     uint64\n\tPc     uint64\n\tPstate uint64\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\tX_f       [0]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int32\n\tPad_cgo_0 [4]byte\n\tTinode    uint64\n\tFname     [6]int8\n\tFpack     [6]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tPadFd  int32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [16]uint64\n}\n\nconst RNDGETENTCNT = 0x80045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [19]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_mips.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int32\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Timex struct {\n\tModes     uint32\n\tOffset    int32\n\tFreq      int32\n\tMaxerror  int32\n\tEsterror  int32\n\tStatus    int32\n\tConstant  int32\n\tPrecision int32\n\tTolerance int32\n\tTime      Timeval\n\tTick      int32\n\tPpsfreq   int32\n\tJitter    int32\n\tShift     int32\n\tStabil    int32\n\tJitcnt    int32\n\tCalcnt    int32\n\tErrcnt    int32\n\tStbcnt    int32\n\tTai       int32\n\tPad_cgo_0 [44]byte\n}\n\ntype Time_t int32\n\ntype Tms struct {\n\tUtime  int32\n\tStime  int32\n\tCutime int32\n\tCstime int32\n}\n\ntype Utimbuf struct {\n\tActime  int32\n\tModtime int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint32\n\tPad1    [3]int32\n\tIno     uint64\n\tMode    uint32\n\tNlink   uint32\n\tUid     uint32\n\tGid     uint32\n\tRdev    uint32\n\tPad2    [3]int32\n\tSize    int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\tBlksize int32\n\tPad4    int32\n\tBlocks  int64\n\tPad5    [14]int32\n}\n\ntype Statfs_t struct {\n\tType      int32\n\tBsize     int32\n\tFrsize    int32\n\tPad_cgo_0 [4]byte\n\tBlocks    uint64\n\tBfree     uint64\n\tFiles     uint64\n\tFfree     uint64\n\tBavail    uint64\n\tFsid      Fsid\n\tNamelen   int32\n\tFlags     int32\n\tSpare     [5]int32\n\tPad_cgo_1 [4]byte\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     uint32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x8\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x1c\n\tSizeofCmsghdr           = 0xc\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x8\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [2]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\ntype Sysinfo_t struct {\n\tUptime    int32\n\tLoads     [3]uint32\n\tTotalram  uint32\n\tFreeram   uint32\n\tSharedram uint32\n\tBufferram uint32\n\tTotalswap uint32\n\tFreeswap  uint32\n\tProcs     uint16\n\tPad       uint16\n\tTotalhigh uint32\n\tFreehigh  uint32\n\tUnit      uint32\n\tX_f       [8]int8\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree  int32\n\tTinode uint32\n\tFname  [6]int8\n\tFpack  [6]int8\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tPadFd  int32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [32]uint32\n}\n\nconst RNDGETENTCNT = 0x40045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [23]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips64,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timex struct {\n\tModes     uint32\n\tPad_cgo_0 [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\tPad_cgo_1 [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\tPad_cgo_2 [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\tPad_cgo_3 [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint32\n\tPad1    [3]uint32\n\tIno     uint64\n\tMode    uint32\n\tNlink   uint32\n\tUid     uint32\n\tGid     uint32\n\tRdev    uint32\n\tPad2    [3]uint32\n\tSize    int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\tBlksize uint32\n\tPad4    uint32\n\tBlocks  int64\n}\n\ntype Statfs_t struct {\n\tType    int64\n\tBsize   int64\n\tFrsize  int64\n\tBlocks  uint64\n\tBfree   uint64\n\tFiles   uint64\n\tFfree   uint64\n\tBavail  uint64\n\tFsid    Fsid\n\tNamelen int64\n\tFlags   int64\n\tSpare   [5]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\tPad_cgo_1  [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x10\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [6]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\tX_f       [0]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int32\n\tPad_cgo_0 [4]byte\n\tTinode    uint64\n\tFname     [6]int8\n\tFpack     [6]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [16]uint64\n}\n\nconst RNDGETENTCNT = 0x40045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [23]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mips64le,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timex struct {\n\tModes     uint32\n\tPad_cgo_0 [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\tPad_cgo_1 [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\tPad_cgo_2 [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\tPad_cgo_3 [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint32\n\tPad1    [3]uint32\n\tIno     uint64\n\tMode    uint32\n\tNlink   uint32\n\tUid     uint32\n\tGid     uint32\n\tRdev    uint32\n\tPad2    [3]uint32\n\tSize    int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\tBlksize uint32\n\tPad4    uint32\n\tBlocks  int64\n}\n\ntype Statfs_t struct {\n\tType    int64\n\tBsize   int64\n\tFrsize  int64\n\tBlocks  uint64\n\tBfree   uint64\n\tFiles   uint64\n\tFfree   uint64\n\tBavail  uint64\n\tFsid    Fsid\n\tNamelen int64\n\tFlags   int64\n\tSpare   [5]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\tPad_cgo_1  [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x10\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [6]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\tX_f       [0]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int32\n\tPad_cgo_0 [4]byte\n\tTinode    uint64\n\tFname     [6]int8\n\tFpack     [6]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [16]uint64\n}\n\nconst RNDGETENTCNT = 0x40045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [23]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build mipsle,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int32\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Timex struct {\n\tModes     uint32\n\tOffset    int32\n\tFreq      int32\n\tMaxerror  int32\n\tEsterror  int32\n\tStatus    int32\n\tConstant  int32\n\tPrecision int32\n\tTolerance int32\n\tTime      Timeval\n\tTick      int32\n\tPpsfreq   int32\n\tJitter    int32\n\tShift     int32\n\tStabil    int32\n\tJitcnt    int32\n\tCalcnt    int32\n\tErrcnt    int32\n\tStbcnt    int32\n\tTai       int32\n\tPad_cgo_0 [44]byte\n}\n\ntype Time_t int32\n\ntype Tms struct {\n\tUtime  int32\n\tStime  int32\n\tCutime int32\n\tCstime int32\n}\n\ntype Utimbuf struct {\n\tActime  int32\n\tModtime int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint32\n\tPad1    [3]int32\n\tIno     uint64\n\tMode    uint32\n\tNlink   uint32\n\tUid     uint32\n\tGid     uint32\n\tRdev    uint32\n\tPad2    [3]int32\n\tSize    int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\tBlksize int32\n\tPad4    int32\n\tBlocks  int64\n\tPad5    [14]int32\n}\n\ntype Statfs_t struct {\n\tType      int32\n\tBsize     int32\n\tFrsize    int32\n\tPad_cgo_0 [4]byte\n\tBlocks    uint64\n\tBfree     uint64\n\tFiles     uint64\n\tFfree     uint64\n\tBavail    uint64\n\tFsid      Fsid\n\tNamelen   int32\n\tFlags     int32\n\tSpare     [5]int32\n\tPad_cgo_1 [4]byte\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     uint32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x8\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x1c\n\tSizeofCmsghdr           = 0xc\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x8\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [2]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tRegs     [32]uint64\n\tLo       uint64\n\tHi       uint64\n\tEpc      uint64\n\tBadvaddr uint64\n\tStatus   uint64\n\tCause    uint64\n}\n\ntype FdSet struct {\n\tBits [32]int32\n}\n\ntype Sysinfo_t struct {\n\tUptime    int32\n\tLoads     [3]uint32\n\tTotalram  uint32\n\tFreeram   uint32\n\tSharedram uint32\n\tBufferram uint32\n\tTotalswap uint32\n\tFreeswap  uint32\n\tProcs     uint16\n\tPad       uint16\n\tTotalhigh uint32\n\tFreehigh  uint32\n\tUnit      uint32\n\tX_f       [8]int8\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree  int32\n\tTinode uint32\n\tFname  [6]int8\n\tFpack  [6]int8\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\tPadFd  int32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [32]uint32\n}\n\nconst RNDGETENTCNT = 0x40045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [23]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build ppc64,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timex struct {\n\tModes     uint32\n\tPad_cgo_0 [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\tPad_cgo_1 [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\tPad_cgo_2 [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\tPad_cgo_3 [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint64\n\tIno     uint64\n\tNlink   uint64\n\tMode    uint32\n\tUid     uint32\n\tGid     uint32\n\tX__pad2 int32\n\tRdev    uint64\n\tSize    int64\n\tBlksize int64\n\tBlocks  int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\t_       uint64\n\t_       uint64\n\t_       uint64\n}\n\ntype Statfs_t struct {\n\tType    int64\n\tBsize   int64\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tFsid    Fsid\n\tNamelen int64\n\tFrsize  int64\n\tFlags   int64\n\tSpare   [4]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]uint8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]uint8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]uint8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\tPad_cgo_1  [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x10\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [6]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tGpr       [32]uint64\n\tNip       uint64\n\tMsr       uint64\n\tOrig_gpr3 uint64\n\tCtr       uint64\n\tLink      uint64\n\tXer       uint64\n\tCcr       uint64\n\tSofte     uint64\n\tTrap      uint64\n\tDar       uint64\n\tDsisr     uint64\n\tResult    uint64\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\tX_f       [0]uint8\n\tPad_cgo_1 [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int32\n\tPad_cgo_0 [4]byte\n\tTinode    uint64\n\tFname     [6]uint8\n\tFpack     [6]uint8\n\tPad_cgo_1 [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents  uint32\n\tX_padFd int32\n\tFd      int32\n\tPad     int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [16]uint64\n}\n\nconst RNDGETENTCNT = 0x40045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [19]uint8\n\tLine   uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]uint8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build ppc64le,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timex struct {\n\tModes     uint32\n\tPad_cgo_0 [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\tPad_cgo_1 [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\tPad_cgo_2 [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\tPad_cgo_3 [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint64\n\tIno     uint64\n\tNlink   uint64\n\tMode    uint32\n\tUid     uint32\n\tGid     uint32\n\tX__pad2 int32\n\tRdev    uint64\n\tSize    int64\n\tBlksize int64\n\tBlocks  int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\t_       uint64\n\t_       uint64\n\t_       uint64\n}\n\ntype Statfs_t struct {\n\tType    int64\n\tBsize   int64\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tFsid    Fsid\n\tNamelen int64\n\tFrsize  int64\n\tFlags   int64\n\tSpare   [4]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]uint8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tPid       int32\n\tPad_cgo_1 [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]uint8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]uint8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\tPad_cgo_1  [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x10\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [6]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tGpr       [32]uint64\n\tNip       uint64\n\tMsr       uint64\n\tOrig_gpr3 uint64\n\tCtr       uint64\n\tLink      uint64\n\tXer       uint64\n\tCcr       uint64\n\tSofte     uint64\n\tTrap      uint64\n\tDar       uint64\n\tDsisr     uint64\n\tResult    uint64\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\tX_f       [0]uint8\n\tPad_cgo_1 [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int32\n\tPad_cgo_0 [4]byte\n\tTinode    uint64\n\tFname     [6]uint8\n\tFpack     [6]uint8\n\tPad_cgo_1 [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents  uint32\n\tX_padFd int32\n\tFd      int32\n\tPad     int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [16]uint64\n}\n\nconst RNDGETENTCNT = 0x40045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [19]uint8\n\tLine   uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\tPad_cgo_0                 [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\tPad_cgo_1                 [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]uint8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\tPad_cgo_2                 [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\tPad_cgo_3                 [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go",
    "content": "// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build s390x,linux\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timex struct {\n\tModes     uint32\n\t_         [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\t_         [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\t_         [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\t_         [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev     uint64\n\tIno     uint64\n\tNlink   uint64\n\tMode    uint32\n\tUid     uint32\n\tGid     uint32\n\t_       int32\n\tRdev    uint64\n\tSize    int64\n\tAtim    Timespec\n\tMtim    Timespec\n\tCtim    Timespec\n\tBlksize int64\n\tBlocks  int64\n\t_       [3]int64\n}\n\ntype Statfs_t struct {\n\tType    uint32\n\tBsize   uint32\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tFsid    Fsid\n\tNamelen uint32\n\tFrsize  uint32\n\tFlags   uint32\n\tSpare   [4]uint32\n\t_       [4]byte\n}\n\ntype Dirent struct {\n\tIno    uint64\n\tOff    int64\n\tReclen uint16\n\tType   uint8\n\tName   [256]int8\n\t_      [5]byte\n}\n\ntype Fsid struct {\n\t_ [2]int32\n}\n\ntype Flock_t struct {\n\tType   int16\n\tWhence int16\n\t_      [4]byte\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\t_      [4]byte\n}\n\ntype FscryptPolicy struct {\n\tVersion                   uint8\n\tContents_encryption_mode  uint8\n\tFilenames_encryption_mode uint8\n\tFlags                     uint8\n\tMaster_key_descriptor     [8]uint8\n}\n\ntype FscryptKey struct {\n\tMode uint32\n\tRaw  [64]uint8\n\tSize uint32\n}\n\ntype KeyctlDHParams struct {\n\tPrivate int32\n\tPrime   int32\n\tBase    int32\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x6\n\tFADV_NOREUSE    = 0x7\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily  uint16\n\t_       [2]byte\n\tIfindex int32\n\tAddr    [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype PacketMreq struct {\n\tIfindex int32\n\tType    uint16\n\tAlen    uint16\n\tAddress [8]uint8\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\t_          [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\t_          [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\t_              [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIovec             = 0x10\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofPacketMreq        = 0x10\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2c\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily uint8\n\t_      uint8\n\tType   uint16\n\tIndex  int32\n\tFlags  uint32\n\tChange uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen    uint16\n\t_      [6]byte\n\tFilter *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tPsw                      PtracePsw\n\tGprs                     [16]uint64\n\tAcrs                     [16]uint32\n\tOrig_gpr2                uint64\n\tFp_regs                  PtraceFpregs\n\tPer_info                 PtracePer\n\tIeee_instruction_pointer uint64\n}\n\ntype PtracePsw struct {\n\tMask uint64\n\tAddr uint64\n}\n\ntype PtraceFpregs struct {\n\tFpc  uint32\n\t_    [4]byte\n\tFprs [16]float64\n}\n\ntype PtracePer struct {\n\t_             [0]uint64\n\t_             [24]byte\n\t_             [8]byte\n\tStarting_addr uint64\n\tEnding_addr   uint64\n\tPerc_atmid    uint16\n\t_             [6]byte\n\tAddress       uint64\n\tAccess_id     uint8\n\t_             [7]byte\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\t_         [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\t_         [0]int8\n\t_         [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree  int32\n\t_      [4]byte\n\tTinode uint64\n\tFname  [6]int8\n\tFpack  [6]int8\n\t_      [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents uint32\n\t_      int32\n\tFd     int32\n\tPad    int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x2000\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\t_ [16]uint64\n}\n\nconst RNDGETENTCNT = 0x80045200\n\nconst PERF_IOC_FLAG_GROUP = 0x1\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [19]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype Taskstats struct {\n\tVersion                   uint16\n\t_                         [2]byte\n\tAc_exitcode               uint32\n\tAc_flag                   uint8\n\tAc_nice                   uint8\n\t_                         [6]byte\n\tCpu_count                 uint64\n\tCpu_delay_total           uint64\n\tBlkio_count               uint64\n\tBlkio_delay_total         uint64\n\tSwapin_count              uint64\n\tSwapin_delay_total        uint64\n\tCpu_run_real_total        uint64\n\tCpu_run_virtual_total     uint64\n\tAc_comm                   [32]int8\n\tAc_sched                  uint8\n\tAc_pad                    [3]uint8\n\t_                         [4]byte\n\tAc_uid                    uint32\n\tAc_gid                    uint32\n\tAc_pid                    uint32\n\tAc_ppid                   uint32\n\tAc_btime                  uint32\n\t_                         [4]byte\n\tAc_etime                  uint64\n\tAc_utime                  uint64\n\tAc_stime                  uint64\n\tAc_minflt                 uint64\n\tAc_majflt                 uint64\n\tCoremem                   uint64\n\tVirtmem                   uint64\n\tHiwater_rss               uint64\n\tHiwater_vm                uint64\n\tRead_char                 uint64\n\tWrite_char                uint64\n\tRead_syscalls             uint64\n\tWrite_syscalls            uint64\n\tRead_bytes                uint64\n\tWrite_bytes               uint64\n\tCancelled_write_bytes     uint64\n\tNvcsw                     uint64\n\tNivcsw                    uint64\n\tAc_utimescaled            uint64\n\tAc_stimescaled            uint64\n\tCpu_scaled_run_real_total uint64\n\tFreepages_count           uint64\n\tFreepages_delay_total     uint64\n}\n\nconst (\n\tTASKSTATS_CMD_UNSPEC                  = 0x0\n\tTASKSTATS_CMD_GET                     = 0x1\n\tTASKSTATS_CMD_NEW                     = 0x2\n\tTASKSTATS_TYPE_UNSPEC                 = 0x0\n\tTASKSTATS_TYPE_PID                    = 0x1\n\tTASKSTATS_TYPE_TGID                   = 0x2\n\tTASKSTATS_TYPE_STATS                  = 0x3\n\tTASKSTATS_TYPE_AGGR_PID               = 0x4\n\tTASKSTATS_TYPE_AGGR_TGID              = 0x5\n\tTASKSTATS_TYPE_NULL                   = 0x6\n\tTASKSTATS_CMD_ATTR_UNSPEC             = 0x0\n\tTASKSTATS_CMD_ATTR_PID                = 0x1\n\tTASKSTATS_CMD_ATTR_TGID               = 0x2\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK   = 0x3\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4\n)\n\ntype Genlmsghdr struct {\n\tCmd      uint8\n\tVersion  uint8\n\tReserved uint16\n}\n\nconst (\n\tCTRL_CMD_UNSPEC            = 0x0\n\tCTRL_CMD_NEWFAMILY         = 0x1\n\tCTRL_CMD_DELFAMILY         = 0x2\n\tCTRL_CMD_GETFAMILY         = 0x3\n\tCTRL_CMD_NEWOPS            = 0x4\n\tCTRL_CMD_DELOPS            = 0x5\n\tCTRL_CMD_GETOPS            = 0x6\n\tCTRL_CMD_NEWMCAST_GRP      = 0x7\n\tCTRL_CMD_DELMCAST_GRP      = 0x8\n\tCTRL_CMD_GETMCAST_GRP      = 0x9\n\tCTRL_ATTR_UNSPEC           = 0x0\n\tCTRL_ATTR_FAMILY_ID        = 0x1\n\tCTRL_ATTR_FAMILY_NAME      = 0x2\n\tCTRL_ATTR_VERSION          = 0x3\n\tCTRL_ATTR_HDRSIZE          = 0x4\n\tCTRL_ATTR_MAXATTR          = 0x5\n\tCTRL_ATTR_OPS              = 0x6\n\tCTRL_ATTR_MCAST_GROUPS     = 0x7\n\tCTRL_ATTR_OP_UNSPEC        = 0x0\n\tCTRL_ATTR_OP_ID            = 0x1\n\tCTRL_ATTR_OP_FLAGS         = 0x2\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0x0\n\tCTRL_ATTR_MCAST_GRP_NAME   = 0x1\n\tCTRL_ATTR_MCAST_GRP_ID     = 0x2\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go",
    "content": "// +build sparc64,linux\n// Created by cgo -godefs - DO NOT EDIT\n// cgo -godefs types_linux.go | go run mkpost.go\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x1000\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec       int64\n\tUsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Timex struct {\n\tModes     uint32\n\tPad_cgo_0 [4]byte\n\tOffset    int64\n\tFreq      int64\n\tMaxerror  int64\n\tEsterror  int64\n\tStatus    int32\n\tPad_cgo_1 [4]byte\n\tConstant  int64\n\tPrecision int64\n\tTolerance int64\n\tTime      Timeval\n\tTick      int64\n\tPpsfreq   int64\n\tJitter    int64\n\tShift     int32\n\tPad_cgo_2 [4]byte\n\tStabil    int64\n\tJitcnt    int64\n\tCalcnt    int64\n\tErrcnt    int64\n\tStbcnt    int64\n\tTai       int32\n\tPad_cgo_3 [44]byte\n}\n\ntype Time_t int64\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev                uint64\n\tX__pad1            uint16\n\tPad_cgo_0          [6]byte\n\tIno                uint64\n\tMode               uint32\n\tNlink              uint32\n\tUid                uint32\n\tGid                uint32\n\tRdev               uint64\n\tX__pad2            uint16\n\tPad_cgo_1          [6]byte\n\tSize               int64\n\tBlksize            int64\n\tBlocks             int64\n\tAtim               Timespec\n\tMtim               Timespec\n\tCtim               Timespec\n\tX__glibc_reserved4 uint64\n\tX__glibc_reserved5 uint64\n}\n\ntype Statfs_t struct {\n\tType    int64\n\tBsize   int64\n\tBlocks  uint64\n\tBfree   uint64\n\tBavail  uint64\n\tFiles   uint64\n\tFfree   uint64\n\tFsid    Fsid\n\tNamelen int64\n\tFrsize  int64\n\tFlags   int64\n\tSpare   [4]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tType      uint8\n\tName      [256]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype Fsid struct {\n\tX__val [2]int32\n}\n\ntype Flock_t struct {\n\tType              int16\n\tWhence            int16\n\tPad_cgo_0         [4]byte\n\tStart             int64\n\tLen               int64\n\tPid               int32\n\tX__glibc_reserved int16\n\tPad_cgo_1         [2]byte\n}\n\nconst (\n\tFADV_NORMAL     = 0x0\n\tFADV_RANDOM     = 0x1\n\tFADV_SEQUENTIAL = 0x2\n\tFADV_WILLNEED   = 0x3\n\tFADV_DONTNEED   = 0x4\n\tFADV_NOREUSE    = 0x5\n)\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrLinklayer struct {\n\tFamily   uint16\n\tProtocol uint16\n\tIfindex  int32\n\tHatype   uint16\n\tPkttype  uint8\n\tHalen    uint8\n\tAddr     [8]uint8\n}\n\ntype RawSockaddrNetlink struct {\n\tFamily uint16\n\tPad    uint16\n\tPid    uint32\n\tGroups uint32\n}\n\ntype RawSockaddrHCI struct {\n\tFamily  uint16\n\tDev     uint16\n\tChannel uint16\n}\n\ntype RawSockaddrCAN struct {\n\tFamily    uint16\n\tPad_cgo_0 [2]byte\n\tIfindex   int32\n\tAddr      [8]byte\n}\n\ntype RawSockaddrALG struct {\n\tFamily uint16\n\tType   [14]uint8\n\tFeat   uint32\n\tMask   uint32\n\tName   [64]uint8\n}\n\ntype RawSockaddrVM struct {\n\tFamily    uint16\n\tReserved1 uint16\n\tPort      uint32\n\tCid       uint32\n\tZero      [4]uint8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPMreqn struct {\n\tMultiaddr [4]byte /* in_addr */\n\tAddress   [4]byte /* in_addr */\n\tIfindex   int32\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint64\n\tControl    *byte\n\tControllen uint64\n\tFlags      int32\n\tPad_cgo_1  [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint64\n\tLevel int32\n\tType  int32\n}\n\ntype Inet4Pktinfo struct {\n\tIfindex  int32\n\tSpec_dst [4]byte /* in_addr */\n\tAddr     [4]byte /* in_addr */\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tData [8]uint32\n}\n\ntype Ucred struct {\n\tPid int32\n\tUid uint32\n\tGid uint32\n}\n\ntype TCPInfo struct {\n\tState          uint8\n\tCa_state       uint8\n\tRetransmits    uint8\n\tProbes         uint8\n\tBackoff        uint8\n\tOptions        uint8\n\tPad_cgo_0      [2]byte\n\tRto            uint32\n\tAto            uint32\n\tSnd_mss        uint32\n\tRcv_mss        uint32\n\tUnacked        uint32\n\tSacked         uint32\n\tLost           uint32\n\tRetrans        uint32\n\tFackets        uint32\n\tLast_data_sent uint32\n\tLast_ack_sent  uint32\n\tLast_data_recv uint32\n\tLast_ack_recv  uint32\n\tPmtu           uint32\n\tRcv_ssthresh   uint32\n\tRtt            uint32\n\tRttvar         uint32\n\tSnd_ssthresh   uint32\n\tSnd_cwnd       uint32\n\tAdvmss         uint32\n\tReordering     uint32\n\tRcv_rtt        uint32\n\tRcv_space      uint32\n\tTotal_retrans  uint32\n}\n\nconst (\n\tSizeofSockaddrInet4     = 0x10\n\tSizeofSockaddrInet6     = 0x1c\n\tSizeofSockaddrAny       = 0x70\n\tSizeofSockaddrUnix      = 0x6e\n\tSizeofSockaddrLinklayer = 0x14\n\tSizeofSockaddrNetlink   = 0xc\n\tSizeofSockaddrHCI       = 0x6\n\tSizeofSockaddrCAN       = 0x10\n\tSizeofSockaddrALG       = 0x58\n\tSizeofSockaddrVM        = 0x10\n\tSizeofLinger            = 0x8\n\tSizeofIPMreq            = 0x8\n\tSizeofIPMreqn           = 0xc\n\tSizeofIPv6Mreq          = 0x14\n\tSizeofMsghdr            = 0x38\n\tSizeofCmsghdr           = 0x10\n\tSizeofInet4Pktinfo      = 0xc\n\tSizeofInet6Pktinfo      = 0x14\n\tSizeofIPv6MTUInfo       = 0x20\n\tSizeofICMPv6Filter      = 0x20\n\tSizeofUcred             = 0xc\n\tSizeofTCPInfo           = 0x68\n)\n\nconst (\n\tIFA_UNSPEC          = 0x0\n\tIFA_ADDRESS         = 0x1\n\tIFA_LOCAL           = 0x2\n\tIFA_LABEL           = 0x3\n\tIFA_BROADCAST       = 0x4\n\tIFA_ANYCAST         = 0x5\n\tIFA_CACHEINFO       = 0x6\n\tIFA_MULTICAST       = 0x7\n\tIFLA_UNSPEC         = 0x0\n\tIFLA_ADDRESS        = 0x1\n\tIFLA_BROADCAST      = 0x2\n\tIFLA_IFNAME         = 0x3\n\tIFLA_MTU            = 0x4\n\tIFLA_LINK           = 0x5\n\tIFLA_QDISC          = 0x6\n\tIFLA_STATS          = 0x7\n\tIFLA_COST           = 0x8\n\tIFLA_PRIORITY       = 0x9\n\tIFLA_MASTER         = 0xa\n\tIFLA_WIRELESS       = 0xb\n\tIFLA_PROTINFO       = 0xc\n\tIFLA_TXQLEN         = 0xd\n\tIFLA_MAP            = 0xe\n\tIFLA_WEIGHT         = 0xf\n\tIFLA_OPERSTATE      = 0x10\n\tIFLA_LINKMODE       = 0x11\n\tIFLA_LINKINFO       = 0x12\n\tIFLA_NET_NS_PID     = 0x13\n\tIFLA_IFALIAS        = 0x14\n\tIFLA_MAX            = 0x2a\n\tRT_SCOPE_UNIVERSE   = 0x0\n\tRT_SCOPE_SITE       = 0xc8\n\tRT_SCOPE_LINK       = 0xfd\n\tRT_SCOPE_HOST       = 0xfe\n\tRT_SCOPE_NOWHERE    = 0xff\n\tRT_TABLE_UNSPEC     = 0x0\n\tRT_TABLE_COMPAT     = 0xfc\n\tRT_TABLE_DEFAULT    = 0xfd\n\tRT_TABLE_MAIN       = 0xfe\n\tRT_TABLE_LOCAL      = 0xff\n\tRT_TABLE_MAX        = 0xffffffff\n\tRTA_UNSPEC          = 0x0\n\tRTA_DST             = 0x1\n\tRTA_SRC             = 0x2\n\tRTA_IIF             = 0x3\n\tRTA_OIF             = 0x4\n\tRTA_GATEWAY         = 0x5\n\tRTA_PRIORITY        = 0x6\n\tRTA_PREFSRC         = 0x7\n\tRTA_METRICS         = 0x8\n\tRTA_MULTIPATH       = 0x9\n\tRTA_FLOW            = 0xb\n\tRTA_CACHEINFO       = 0xc\n\tRTA_TABLE           = 0xf\n\tRTN_UNSPEC          = 0x0\n\tRTN_UNICAST         = 0x1\n\tRTN_LOCAL           = 0x2\n\tRTN_BROADCAST       = 0x3\n\tRTN_ANYCAST         = 0x4\n\tRTN_MULTICAST       = 0x5\n\tRTN_BLACKHOLE       = 0x6\n\tRTN_UNREACHABLE     = 0x7\n\tRTN_PROHIBIT        = 0x8\n\tRTN_THROW           = 0x9\n\tRTN_NAT             = 0xa\n\tRTN_XRESOLVE        = 0xb\n\tRTNLGRP_NONE        = 0x0\n\tRTNLGRP_LINK        = 0x1\n\tRTNLGRP_NOTIFY      = 0x2\n\tRTNLGRP_NEIGH       = 0x3\n\tRTNLGRP_TC          = 0x4\n\tRTNLGRP_IPV4_IFADDR = 0x5\n\tRTNLGRP_IPV4_MROUTE = 0x6\n\tRTNLGRP_IPV4_ROUTE  = 0x7\n\tRTNLGRP_IPV4_RULE   = 0x8\n\tRTNLGRP_IPV6_IFADDR = 0x9\n\tRTNLGRP_IPV6_MROUTE = 0xa\n\tRTNLGRP_IPV6_ROUTE  = 0xb\n\tRTNLGRP_IPV6_IFINFO = 0xc\n\tRTNLGRP_IPV6_PREFIX = 0x12\n\tRTNLGRP_IPV6_RULE   = 0x13\n\tRTNLGRP_ND_USEROPT  = 0x14\n\tSizeofNlMsghdr      = 0x10\n\tSizeofNlMsgerr      = 0x14\n\tSizeofRtGenmsg      = 0x1\n\tSizeofNlAttr        = 0x4\n\tSizeofRtAttr        = 0x4\n\tSizeofIfInfomsg     = 0x10\n\tSizeofIfAddrmsg     = 0x8\n\tSizeofRtMsg         = 0xc\n\tSizeofRtNexthop     = 0x8\n)\n\ntype NlMsghdr struct {\n\tLen   uint32\n\tType  uint16\n\tFlags uint16\n\tSeq   uint32\n\tPid   uint32\n}\n\ntype NlMsgerr struct {\n\tError int32\n\tMsg   NlMsghdr\n}\n\ntype RtGenmsg struct {\n\tFamily uint8\n}\n\ntype NlAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype RtAttr struct {\n\tLen  uint16\n\tType uint16\n}\n\ntype IfInfomsg struct {\n\tFamily     uint8\n\tX__ifi_pad uint8\n\tType       uint16\n\tIndex      int32\n\tFlags      uint32\n\tChange     uint32\n}\n\ntype IfAddrmsg struct {\n\tFamily    uint8\n\tPrefixlen uint8\n\tFlags     uint8\n\tScope     uint8\n\tIndex     uint32\n}\n\ntype RtMsg struct {\n\tFamily   uint8\n\tDst_len  uint8\n\tSrc_len  uint8\n\tTos      uint8\n\tTable    uint8\n\tProtocol uint8\n\tScope    uint8\n\tType     uint8\n\tFlags    uint32\n}\n\ntype RtNexthop struct {\n\tLen     uint16\n\tFlags   uint8\n\tHops    uint8\n\tIfindex int32\n}\n\nconst (\n\tSizeofSockFilter = 0x8\n\tSizeofSockFprog  = 0x10\n)\n\ntype SockFilter struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype SockFprog struct {\n\tLen       uint16\n\tPad_cgo_0 [6]byte\n\tFilter    *SockFilter\n}\n\ntype InotifyEvent struct {\n\tWd     int32\n\tMask   uint32\n\tCookie uint32\n\tLen    uint32\n}\n\nconst SizeofInotifyEvent = 0x10\n\ntype PtraceRegs struct {\n\tRegs   [16]uint64\n\tTstate uint64\n\tTpc    uint64\n\tTnpc   uint64\n\tY      uint32\n\tMagic  uint32\n}\n\ntype ptracePsw struct {\n}\n\ntype ptraceFpregs struct {\n}\n\ntype ptracePer struct {\n}\n\ntype FdSet struct {\n\tBits [16]int64\n}\n\ntype Sysinfo_t struct {\n\tUptime    int64\n\tLoads     [3]uint64\n\tTotalram  uint64\n\tFreeram   uint64\n\tSharedram uint64\n\tBufferram uint64\n\tTotalswap uint64\n\tFreeswap  uint64\n\tProcs     uint16\n\tPad       uint16\n\tPad_cgo_0 [4]byte\n\tTotalhigh uint64\n\tFreehigh  uint64\n\tUnit      uint32\n\tX_f       [0]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype Utsname struct {\n\tSysname    [65]byte\n\tNodename   [65]byte\n\tRelease    [65]byte\n\tVersion    [65]byte\n\tMachine    [65]byte\n\tDomainname [65]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int32\n\tPad_cgo_0 [4]byte\n\tTinode    uint64\n\tFname     [6]int8\n\tFpack     [6]int8\n\tPad_cgo_1 [4]byte\n}\n\ntype EpollEvent struct {\n\tEvents  uint32\n\tX_padFd int32\n\tFd      int32\n\tPad     int32\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_REMOVEDIR        = 0x200\n\tAT_SYMLINK_FOLLOW   = 0x400\n\tAT_SYMLINK_NOFOLLOW = 0x100\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLIN    = 0x1\n\tPOLLPRI   = 0x2\n\tPOLLOUT   = 0x4\n\tPOLLRDHUP = 0x800\n\tPOLLERR   = 0x8\n\tPOLLHUP   = 0x10\n\tPOLLNVAL  = 0x20\n)\n\ntype Sigset_t struct {\n\tX__val [16]uint64\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tLine   uint8\n\tCc     [19]uint8\n\tIspeed uint32\n\tOspeed uint32\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go",
    "content": "// cgo -godefs types_netbsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,netbsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev           uint64\n\tMode          uint32\n\tIno           uint64\n\tNlink         uint32\n\tUid           uint32\n\tGid           uint32\n\tRdev          uint64\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tBirthtimespec Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       uint32\n\tFlags         uint32\n\tGen           uint32\n\tSpare         [2]uint32\n}\n\ntype Statfs_t [0]byte\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Dirent struct {\n\tFileno    uint64\n\tReclen    uint16\n\tNamlen    uint16\n\tType      uint8\n\tName      [512]int8\n\tPad_cgo_0 [3]byte\n}\n\ntype Fsid struct {\n\tX__fsid_val [2]int32\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     int32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x14\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint32\n\tFilter uint32\n\tFlags  uint32\n\tFflags uint32\n\tData   int64\n\tUdata  int32\n}\n\ntype FdSet struct {\n\tBits [8]uint32\n}\n\nconst (\n\tSizeofIfMsghdr         = 0x98\n\tSizeofIfData           = 0x84\n\tSizeofIfaMsghdr        = 0x18\n\tSizeofIfAnnounceMsghdr = 0x18\n\tSizeofRtMsghdr         = 0x78\n\tSizeofRtMetrics        = 0x50\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n\tPad_cgo_1 [4]byte\n}\n\ntype IfData struct {\n\tType       uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tPad_cgo_0  [1]byte\n\tLink_state int32\n\tMtu        uint64\n\tMetric     uint64\n\tBaudrate   uint64\n\tIpackets   uint64\n\tIerrors    uint64\n\tOpackets   uint64\n\tOerrors    uint64\n\tCollisions uint64\n\tIbytes     uint64\n\tObytes     uint64\n\tImcasts    uint64\n\tOmcasts    uint64\n\tIqdrops    uint64\n\tNoproto    uint64\n\tLastchange Timespec\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tMetric    int32\n\tIndex     uint16\n\tPad_cgo_0 [6]byte\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tIndex   uint16\n\tName    [16]int8\n\tWhat    uint16\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     int32\n\tPad_cgo_1 [4]byte\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint64\n\tMtu      uint64\n\tHopcount uint64\n\tRecvpipe uint64\n\tSendpipe uint64\n\tSsthresh uint64\n\tRtt      uint64\n\tRttvar   uint64\n\tExpire   int64\n\tPksent   int64\n}\n\ntype Mclpool [0]byte\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x80\n\tSizeofBpfProgram = 0x8\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv    uint64\n\tDrop    uint64\n\tCapt    uint64\n\tPadding [13]uint64\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    BpfTimeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype BpfTimeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_SYMLINK_NOFOLLOW = 0x200\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n\ntype Sysctlnode struct {\n\tFlags           uint32\n\tNum             int32\n\tName            [32]int8\n\tVer             uint32\n\tX__rsvd         uint32\n\tUn              [16]byte\n\tX_sysctl_size   [8]byte\n\tX_sysctl_func   [8]byte\n\tX_sysctl_parent [8]byte\n\tX_sysctl_desc   [8]byte\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go",
    "content": "// cgo -godefs types_netbsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,netbsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec       int64\n\tUsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev           uint64\n\tMode          uint32\n\tPad_cgo_0     [4]byte\n\tIno           uint64\n\tNlink         uint32\n\tUid           uint32\n\tGid           uint32\n\tPad_cgo_1     [4]byte\n\tRdev          uint64\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tBirthtimespec Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       uint32\n\tFlags         uint32\n\tGen           uint32\n\tSpare         [2]uint32\n\tPad_cgo_2     [4]byte\n}\n\ntype Statfs_t [0]byte\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Dirent struct {\n\tFileno    uint64\n\tReclen    uint16\n\tNamlen    uint16\n\tType      uint8\n\tName      [512]int8\n\tPad_cgo_0 [3]byte\n}\n\ntype Fsid struct {\n\tX__fsid_val [2]int32\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     int32\n\tPad_cgo_1  [4]byte\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x14\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x30\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent     uint64\n\tFilter    uint32\n\tFlags     uint32\n\tFflags    uint32\n\tPad_cgo_0 [4]byte\n\tData      int64\n\tUdata     int64\n}\n\ntype FdSet struct {\n\tBits [8]uint32\n}\n\nconst (\n\tSizeofIfMsghdr         = 0x98\n\tSizeofIfData           = 0x88\n\tSizeofIfaMsghdr        = 0x18\n\tSizeofIfAnnounceMsghdr = 0x18\n\tSizeofRtMsghdr         = 0x78\n\tSizeofRtMetrics        = 0x50\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tPad_cgo_0  [1]byte\n\tLink_state int32\n\tMtu        uint64\n\tMetric     uint64\n\tBaudrate   uint64\n\tIpackets   uint64\n\tIerrors    uint64\n\tOpackets   uint64\n\tOerrors    uint64\n\tCollisions uint64\n\tIbytes     uint64\n\tObytes     uint64\n\tImcasts    uint64\n\tOmcasts    uint64\n\tIqdrops    uint64\n\tNoproto    uint64\n\tLastchange Timespec\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tMetric    int32\n\tIndex     uint16\n\tPad_cgo_0 [6]byte\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tIndex   uint16\n\tName    [16]int8\n\tWhat    uint16\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     int32\n\tPad_cgo_1 [4]byte\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint64\n\tMtu      uint64\n\tHopcount uint64\n\tRecvpipe uint64\n\tSendpipe uint64\n\tSsthresh uint64\n\tRtt      uint64\n\tRttvar   uint64\n\tExpire   int64\n\tPksent   int64\n}\n\ntype Mclpool [0]byte\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x80\n\tSizeofBpfProgram = 0x10\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x20\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv    uint64\n\tDrop    uint64\n\tCapt    uint64\n\tPadding [13]uint64\n}\n\ntype BpfProgram struct {\n\tLen       uint32\n\tPad_cgo_0 [4]byte\n\tInsns     *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    BpfTimeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [6]byte\n}\n\ntype BpfTimeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_SYMLINK_NOFOLLOW = 0x200\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n\ntype Sysctlnode struct {\n\tFlags           uint32\n\tNum             int32\n\tName            [32]int8\n\tVer             uint32\n\tX__rsvd         uint32\n\tUn              [16]byte\n\tX_sysctl_size   [8]byte\n\tX_sysctl_func   [8]byte\n\tX_sysctl_parent [8]byte\n\tX_sysctl_desc   [8]byte\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go",
    "content": "// cgo -godefs types_netbsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,netbsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec       int64\n\tNsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Timeval struct {\n\tSec       int64\n\tUsec      int32\n\tPad_cgo_0 [4]byte\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\ntype Stat_t struct {\n\tDev           uint64\n\tMode          uint32\n\tPad_cgo_0     [4]byte\n\tIno           uint64\n\tNlink         uint32\n\tUid           uint32\n\tGid           uint32\n\tPad_cgo_1     [4]byte\n\tRdev          uint64\n\tAtimespec     Timespec\n\tMtimespec     Timespec\n\tCtimespec     Timespec\n\tBirthtimespec Timespec\n\tSize          int64\n\tBlocks        int64\n\tBlksize       uint32\n\tFlags         uint32\n\tGen           uint32\n\tSpare         [2]uint32\n\tPad_cgo_2     [4]byte\n}\n\ntype Statfs_t [0]byte\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Dirent struct {\n\tFileno    uint64\n\tReclen    uint16\n\tNamlen    uint16\n\tType      uint8\n\tName      [512]int8\n\tPad_cgo_0 [3]byte\n}\n\ntype Fsid struct {\n\tX__fsid_val [2]int32\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [12]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     int32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x14\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent     uint32\n\tFilter    uint32\n\tFlags     uint32\n\tFflags    uint32\n\tData      int64\n\tUdata     int32\n\tPad_cgo_0 [4]byte\n}\n\ntype FdSet struct {\n\tBits [8]uint32\n}\n\nconst (\n\tSizeofIfMsghdr         = 0x98\n\tSizeofIfData           = 0x88\n\tSizeofIfaMsghdr        = 0x18\n\tSizeofIfAnnounceMsghdr = 0x18\n\tSizeofRtMsghdr         = 0x78\n\tSizeofRtMetrics        = 0x50\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tPad_cgo_0  [1]byte\n\tLink_state int32\n\tMtu        uint64\n\tMetric     uint64\n\tBaudrate   uint64\n\tIpackets   uint64\n\tIerrors    uint64\n\tOpackets   uint64\n\tOerrors    uint64\n\tCollisions uint64\n\tIbytes     uint64\n\tObytes     uint64\n\tImcasts    uint64\n\tOmcasts    uint64\n\tIqdrops    uint64\n\tNoproto    uint64\n\tLastchange Timespec\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tMetric    int32\n\tIndex     uint16\n\tPad_cgo_0 [6]byte\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tIndex   uint16\n\tName    [16]int8\n\tWhat    uint16\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     int32\n\tPad_cgo_1 [4]byte\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint64\n\tMtu      uint64\n\tHopcount uint64\n\tRecvpipe uint64\n\tSendpipe uint64\n\tSsthresh uint64\n\tRtt      uint64\n\tRttvar   uint64\n\tExpire   int64\n\tPksent   int64\n}\n\ntype Mclpool [0]byte\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x80\n\tSizeofBpfProgram = 0x8\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv    uint64\n\tDrop    uint64\n\tCapt    uint64\n\tPadding [13]uint64\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    BpfTimeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype BpfTimeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_SYMLINK_NOFOLLOW = 0x200\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n\ntype Sysctlnode struct {\n\tFlags           uint32\n\tNum             int32\n\tName            [32]int8\n\tVer             uint32\n\tX__rsvd         uint32\n\tUn              [16]byte\n\tX_sysctl_size   [8]byte\n\tX_sysctl_func   [8]byte\n\tX_sysctl_parent [8]byte\n\tX_sysctl_desc   [8]byte\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go",
    "content": "// cgo -godefs types_openbsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build 386,openbsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tMode           uint32\n\tDev            int32\n\tIno            uint64\n\tNlink          uint32\n\tUid            uint32\n\tGid            uint32\n\tRdev           int32\n\tAtim           Timespec\n\tMtim           Timespec\n\tCtim           Timespec\n\tSize           int64\n\tBlocks         int64\n\tBlksize        uint32\n\tFlags          uint32\n\tGen            uint32\n\tX__st_birthtim Timespec\n}\n\ntype Statfs_t struct {\n\tF_flags       uint32\n\tF_bsize       uint32\n\tF_iosize      uint32\n\tF_blocks      uint64\n\tF_bfree       uint64\n\tF_bavail      int64\n\tF_files       uint64\n\tF_ffree       uint64\n\tF_favail      int64\n\tF_syncwrites  uint64\n\tF_syncreads   uint64\n\tF_asyncwrites uint64\n\tF_asyncreads  uint64\n\tF_fsid        Fsid\n\tF_namemax     uint32\n\tF_owner       uint32\n\tF_ctime       uint64\n\tF_fstypename  [16]int8\n\tF_mntonname   [90]int8\n\tF_mntfromname [90]int8\n\tF_mntfromspec [90]int8\n\tPad_cgo_0     [2]byte\n\tMount_info    [160]byte\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Dirent struct {\n\tFileno       uint64\n\tOff          int64\n\tReclen       uint16\n\tType         uint8\n\tNamlen       uint8\n\tX__d_padding [4]uint8\n\tName         [256]int8\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [24]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     uint32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x20\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint32\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int64\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [32]uint32\n}\n\nconst (\n\tSizeofIfMsghdr         = 0xec\n\tSizeofIfData           = 0xd4\n\tSizeofIfaMsghdr        = 0x18\n\tSizeofIfAnnounceMsghdr = 0x1a\n\tSizeofRtMsghdr         = 0x60\n\tSizeofRtMetrics        = 0x38\n)\n\ntype IfMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tTableid uint16\n\tPad1    uint8\n\tPad2    uint8\n\tAddrs   int32\n\tFlags   int32\n\tXflags  int32\n\tData    IfData\n}\n\ntype IfData struct {\n\tType         uint8\n\tAddrlen      uint8\n\tHdrlen       uint8\n\tLink_state   uint8\n\tMtu          uint32\n\tMetric       uint32\n\tPad          uint32\n\tBaudrate     uint64\n\tIpackets     uint64\n\tIerrors      uint64\n\tOpackets     uint64\n\tOerrors      uint64\n\tCollisions   uint64\n\tIbytes       uint64\n\tObytes       uint64\n\tImcasts      uint64\n\tOmcasts      uint64\n\tIqdrops      uint64\n\tNoproto      uint64\n\tCapabilities uint32\n\tLastchange   Timeval\n\tMclpool      [7]Mclpool\n}\n\ntype IfaMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tTableid uint16\n\tPad1    uint8\n\tPad2    uint8\n\tAddrs   int32\n\tFlags   int32\n\tMetric  int32\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tWhat    uint16\n\tName    [16]int8\n}\n\ntype RtMsghdr struct {\n\tMsglen   uint16\n\tVersion  uint8\n\tType     uint8\n\tHdrlen   uint16\n\tIndex    uint16\n\tTableid  uint16\n\tPriority uint8\n\tMpls     uint8\n\tAddrs    int32\n\tFlags    int32\n\tFmask    int32\n\tPid      int32\n\tSeq      int32\n\tErrno    int32\n\tInits    uint32\n\tRmx      RtMetrics\n}\n\ntype RtMetrics struct {\n\tPksent   uint64\n\tExpire   int64\n\tLocks    uint32\n\tMtu      uint32\n\tRefcnt   uint32\n\tHopcount uint32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPad      uint32\n}\n\ntype Mclpool struct {\n\tGrown int32\n\tAlive uint16\n\tHwm   uint16\n\tCwm   uint16\n\tLwm   uint16\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x8\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    BpfTimeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype BpfTimeval struct {\n\tSec  uint32\n\tUsec uint32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_SYMLINK_NOFOLLOW = 0x2\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go",
    "content": "// cgo -godefs types_openbsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,openbsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tMode           uint32\n\tDev            int32\n\tIno            uint64\n\tNlink          uint32\n\tUid            uint32\n\tGid            uint32\n\tRdev           int32\n\tAtim           Timespec\n\tMtim           Timespec\n\tCtim           Timespec\n\tSize           int64\n\tBlocks         int64\n\tBlksize        uint32\n\tFlags          uint32\n\tGen            uint32\n\tPad_cgo_0      [4]byte\n\tX__st_birthtim Timespec\n}\n\ntype Statfs_t struct {\n\tF_flags       uint32\n\tF_bsize       uint32\n\tF_iosize      uint32\n\tPad_cgo_0     [4]byte\n\tF_blocks      uint64\n\tF_bfree       uint64\n\tF_bavail      int64\n\tF_files       uint64\n\tF_ffree       uint64\n\tF_favail      int64\n\tF_syncwrites  uint64\n\tF_syncreads   uint64\n\tF_asyncwrites uint64\n\tF_asyncreads  uint64\n\tF_fsid        Fsid\n\tF_namemax     uint32\n\tF_owner       uint32\n\tF_ctime       uint64\n\tF_fstypename  [16]int8\n\tF_mntonname   [90]int8\n\tF_mntfromname [90]int8\n\tF_mntfromspec [90]int8\n\tPad_cgo_1     [2]byte\n\tMount_info    [160]byte\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Dirent struct {\n\tFileno       uint64\n\tOff          int64\n\tReclen       uint16\n\tType         uint8\n\tNamlen       uint8\n\tX__d_padding [4]uint8\n\tName         [256]int8\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [24]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tPad_cgo_0  [4]byte\n\tIov        *Iovec\n\tIovlen     uint32\n\tPad_cgo_1  [4]byte\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x20\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x30\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint64\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int64\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [32]uint32\n}\n\nconst (\n\tSizeofIfMsghdr         = 0xf8\n\tSizeofIfData           = 0xe0\n\tSizeofIfaMsghdr        = 0x18\n\tSizeofIfAnnounceMsghdr = 0x1a\n\tSizeofRtMsghdr         = 0x60\n\tSizeofRtMetrics        = 0x38\n)\n\ntype IfMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tTableid uint16\n\tPad1    uint8\n\tPad2    uint8\n\tAddrs   int32\n\tFlags   int32\n\tXflags  int32\n\tData    IfData\n}\n\ntype IfData struct {\n\tType         uint8\n\tAddrlen      uint8\n\tHdrlen       uint8\n\tLink_state   uint8\n\tMtu          uint32\n\tMetric       uint32\n\tPad          uint32\n\tBaudrate     uint64\n\tIpackets     uint64\n\tIerrors      uint64\n\tOpackets     uint64\n\tOerrors      uint64\n\tCollisions   uint64\n\tIbytes       uint64\n\tObytes       uint64\n\tImcasts      uint64\n\tOmcasts      uint64\n\tIqdrops      uint64\n\tNoproto      uint64\n\tCapabilities uint32\n\tPad_cgo_0    [4]byte\n\tLastchange   Timeval\n\tMclpool      [7]Mclpool\n\tPad_cgo_1    [4]byte\n}\n\ntype IfaMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tTableid uint16\n\tPad1    uint8\n\tPad2    uint8\n\tAddrs   int32\n\tFlags   int32\n\tMetric  int32\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tWhat    uint16\n\tName    [16]int8\n}\n\ntype RtMsghdr struct {\n\tMsglen   uint16\n\tVersion  uint8\n\tType     uint8\n\tHdrlen   uint16\n\tIndex    uint16\n\tTableid  uint16\n\tPriority uint8\n\tMpls     uint8\n\tAddrs    int32\n\tFlags    int32\n\tFmask    int32\n\tPid      int32\n\tSeq      int32\n\tErrno    int32\n\tInits    uint32\n\tRmx      RtMetrics\n}\n\ntype RtMetrics struct {\n\tPksent   uint64\n\tExpire   int64\n\tLocks    uint32\n\tMtu      uint32\n\tRefcnt   uint32\n\tHopcount uint32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPad      uint32\n}\n\ntype Mclpool struct {\n\tGrown int32\n\tAlive uint16\n\tHwm   uint16\n\tCwm   uint16\n\tLwm   uint16\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x10\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen       uint32\n\tPad_cgo_0 [4]byte\n\tInsns     *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    BpfTimeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype BpfTimeval struct {\n\tSec  uint32\n\tUsec uint32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_SYMLINK_NOFOLLOW = 0x2\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go",
    "content": "// cgo -godefs types_openbsd.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build arm,openbsd\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x4\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x4\n\tsizeofLongLong = 0x8\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int32\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int32\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int32\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int32\n\tIxrss    int32\n\tIdrss    int32\n\tIsrss    int32\n\tMinflt   int32\n\tMajflt   int32\n\tNswap    int32\n\tInblock  int32\n\tOublock  int32\n\tMsgsnd   int32\n\tMsgrcv   int32\n\tNsignals int32\n\tNvcsw    int32\n\tNivcsw   int32\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tMode           uint32\n\tDev            int32\n\tIno            uint64\n\tNlink          uint32\n\tUid            uint32\n\tGid            uint32\n\tRdev           int32\n\tAtim           Timespec\n\tMtim           Timespec\n\tCtim           Timespec\n\tSize           int64\n\tBlocks         int64\n\tBlksize        int32\n\tFlags          uint32\n\tGen            uint32\n\tX__st_birthtim Timespec\n}\n\ntype Statfs_t struct {\n\tF_flags       uint32\n\tF_bsize       uint32\n\tF_iosize      uint32\n\tF_blocks      uint64\n\tF_bfree       uint64\n\tF_bavail      int64\n\tF_files       uint64\n\tF_ffree       uint64\n\tF_favail      int64\n\tF_syncwrites  uint64\n\tF_syncreads   uint64\n\tF_asyncwrites uint64\n\tF_asyncreads  uint64\n\tF_fsid        Fsid\n\tF_namemax     uint32\n\tF_owner       uint32\n\tF_ctime       uint64\n\tF_fstypename  [16]uint8\n\tF_mntonname   [90]uint8\n\tF_mntfromname [90]uint8\n\tF_mntfromspec [90]uint8\n\tPad_cgo_0     [2]byte\n\tMount_info    [160]byte\n}\n\ntype Flock_t struct {\n\tStart  int64\n\tLen    int64\n\tPid    int32\n\tType   int16\n\tWhence int16\n}\n\ntype Dirent struct {\n\tFileno       uint64\n\tOff          int64\n\tReclen       uint16\n\tType         uint8\n\tNamlen       uint8\n\tX__d_padding [4]uint8\n\tName         [256]uint8\n}\n\ntype Fsid struct {\n\tVal [2]int32\n}\n\ntype RawSockaddrInet4 struct {\n\tLen    uint8\n\tFamily uint8\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tLen      uint8\n\tFamily   uint8\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tLen    uint8\n\tFamily uint8\n\tPath   [104]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tLen    uint8\n\tFamily uint8\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [24]int8\n}\n\ntype RawSockaddr struct {\n\tLen    uint8\n\tFamily uint8\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [92]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *byte\n\tLen  uint32\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName       *byte\n\tNamelen    uint32\n\tIov        *Iovec\n\tIovlen     uint32\n\tControl    *byte\n\tControllen uint32\n\tFlags      int32\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tFilt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x1c\n\tSizeofSockaddrAny      = 0x6c\n\tSizeofSockaddrUnix     = 0x6a\n\tSizeofSockaddrDatalink = 0x20\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x1c\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x20\n\tSizeofICMPv6Filter     = 0x20\n)\n\nconst (\n\tPTRACE_TRACEME = 0x0\n\tPTRACE_CONT    = 0x7\n\tPTRACE_KILL    = 0x8\n)\n\ntype Kevent_t struct {\n\tIdent  uint32\n\tFilter int16\n\tFlags  uint16\n\tFflags uint32\n\tData   int64\n\tUdata  *byte\n}\n\ntype FdSet struct {\n\tBits [32]uint32\n}\n\nconst (\n\tSizeofIfMsghdr         = 0x98\n\tSizeofIfData           = 0x80\n\tSizeofIfaMsghdr        = 0x18\n\tSizeofIfAnnounceMsghdr = 0x1a\n\tSizeofRtMsghdr         = 0x60\n\tSizeofRtMetrics        = 0x38\n)\n\ntype IfMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tTableid uint16\n\tPad1    uint8\n\tPad2    uint8\n\tAddrs   int32\n\tFlags   int32\n\tXflags  int32\n\tData    IfData\n}\n\ntype IfData struct {\n\tType         uint8\n\tAddrlen      uint8\n\tHdrlen       uint8\n\tLink_state   uint8\n\tMtu          uint32\n\tMetric       uint32\n\tPad          uint32\n\tBaudrate     uint64\n\tIpackets     uint64\n\tIerrors      uint64\n\tOpackets     uint64\n\tOerrors      uint64\n\tCollisions   uint64\n\tIbytes       uint64\n\tObytes       uint64\n\tImcasts      uint64\n\tOmcasts      uint64\n\tIqdrops      uint64\n\tNoproto      uint64\n\tCapabilities uint32\n\tLastchange   Timeval\n}\n\ntype IfaMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tTableid uint16\n\tPad1    uint8\n\tPad2    uint8\n\tAddrs   int32\n\tFlags   int32\n\tMetric  int32\n}\n\ntype IfAnnounceMsghdr struct {\n\tMsglen  uint16\n\tVersion uint8\n\tType    uint8\n\tHdrlen  uint16\n\tIndex   uint16\n\tWhat    uint16\n\tName    [16]uint8\n}\n\ntype RtMsghdr struct {\n\tMsglen   uint16\n\tVersion  uint8\n\tType     uint8\n\tHdrlen   uint16\n\tIndex    uint16\n\tTableid  uint16\n\tPriority uint8\n\tMpls     uint8\n\tAddrs    int32\n\tFlags    int32\n\tFmask    int32\n\tPid      int32\n\tSeq      int32\n\tErrno    int32\n\tInits    uint32\n\tRmx      RtMetrics\n}\n\ntype RtMetrics struct {\n\tPksent   uint64\n\tExpire   int64\n\tLocks    uint32\n\tMtu      uint32\n\tRefcnt   uint32\n\tHopcount uint32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPad      uint32\n}\n\ntype Mclpool struct{}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x8\n\tSizeofBpfProgram = 0x8\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv uint32\n\tDrop uint32\n}\n\ntype BpfProgram struct {\n\tLen   uint32\n\tInsns *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfHdr struct {\n\tTstamp    BpfTimeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype BpfTimeval struct {\n\tSec  uint32\n\tUsec uint32\n}\n\ntype Termios struct {\n\tIflag  uint32\n\tOflag  uint32\n\tCflag  uint32\n\tLflag  uint32\n\tCc     [20]uint8\n\tIspeed int32\n\tOspeed int32\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\nconst (\n\tAT_FDCWD            = -0x64\n\tAT_SYMLINK_NOFOLLOW = 0x2\n)\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go",
    "content": "// cgo -godefs types_solaris.go | go run mkpost.go\n// Code generated by the command above; see README.md. DO NOT EDIT.\n\n// +build amd64,solaris\n\npackage unix\n\nconst (\n\tsizeofPtr      = 0x8\n\tsizeofShort    = 0x2\n\tsizeofInt      = 0x4\n\tsizeofLong     = 0x8\n\tsizeofLongLong = 0x8\n\tPathMax        = 0x400\n\tMaxHostNameLen = 0x100\n)\n\ntype (\n\t_C_short     int16\n\t_C_int       int32\n\t_C_long      int64\n\t_C_long_long int64\n)\n\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\ntype Timeval struct {\n\tSec  int64\n\tUsec int64\n}\n\ntype Timeval32 struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype Tms struct {\n\tUtime  int64\n\tStime  int64\n\tCutime int64\n\tCstime int64\n}\n\ntype Utimbuf struct {\n\tActime  int64\n\tModtime int64\n}\n\ntype Rusage struct {\n\tUtime    Timeval\n\tStime    Timeval\n\tMaxrss   int64\n\tIxrss    int64\n\tIdrss    int64\n\tIsrss    int64\n\tMinflt   int64\n\tMajflt   int64\n\tNswap    int64\n\tInblock  int64\n\tOublock  int64\n\tMsgsnd   int64\n\tMsgrcv   int64\n\tNsignals int64\n\tNvcsw    int64\n\tNivcsw   int64\n}\n\ntype Rlimit struct {\n\tCur uint64\n\tMax uint64\n}\n\ntype _Gid_t uint32\n\nconst (\n\tS_IFMT   = 0xf000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\ntype Stat_t struct {\n\tDev       uint64\n\tIno       uint64\n\tMode      uint32\n\tNlink     uint32\n\tUid       uint32\n\tGid       uint32\n\tRdev      uint64\n\tSize      int64\n\tAtim      Timespec\n\tMtim      Timespec\n\tCtim      Timespec\n\tBlksize   int32\n\tPad_cgo_0 [4]byte\n\tBlocks    int64\n\tFstype    [16]int8\n}\n\ntype Flock_t struct {\n\tType      int16\n\tWhence    int16\n\tPad_cgo_0 [4]byte\n\tStart     int64\n\tLen       int64\n\tSysid     int32\n\tPid       int32\n\tPad       [4]int64\n}\n\ntype Dirent struct {\n\tIno       uint64\n\tOff       int64\n\tReclen    uint16\n\tName      [1]int8\n\tPad_cgo_0 [5]byte\n}\n\ntype _Fsblkcnt_t uint64\n\ntype Statvfs_t struct {\n\tBsize    uint64\n\tFrsize   uint64\n\tBlocks   uint64\n\tBfree    uint64\n\tBavail   uint64\n\tFiles    uint64\n\tFfree    uint64\n\tFavail   uint64\n\tFsid     uint64\n\tBasetype [16]int8\n\tFlag     uint64\n\tNamemax  uint64\n\tFstr     [32]int8\n}\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]int8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily         uint16\n\tPort           uint16\n\tFlowinfo       uint32\n\tAddr           [16]byte /* in6_addr */\n\tScope_id       uint32\n\tX__sin6_src_id uint32\n}\n\ntype RawSockaddrUnix struct {\n\tFamily uint16\n\tPath   [108]int8\n}\n\ntype RawSockaddrDatalink struct {\n\tFamily uint16\n\tIndex  uint16\n\tType   uint8\n\tNlen   uint8\n\tAlen   uint8\n\tSlen   uint8\n\tData   [244]int8\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [236]int8\n}\n\ntype _Socklen uint32\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype Iovec struct {\n\tBase *int8\n\tLen  uint64\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\ntype Msghdr struct {\n\tName         *byte\n\tNamelen      uint32\n\tPad_cgo_0    [4]byte\n\tIov          *Iovec\n\tIovlen       int32\n\tPad_cgo_1    [4]byte\n\tAccrights    *int8\n\tAccrightslen int32\n\tPad_cgo_2    [4]byte\n}\n\ntype Cmsghdr struct {\n\tLen   uint32\n\tLevel int32\n\tType  int32\n}\n\ntype Inet6Pktinfo struct {\n\tAddr    [16]byte /* in6_addr */\n\tIfindex uint32\n}\n\ntype IPv6MTUInfo struct {\n\tAddr RawSockaddrInet6\n\tMtu  uint32\n}\n\ntype ICMPv6Filter struct {\n\tX__icmp6_filt [8]uint32\n}\n\nconst (\n\tSizeofSockaddrInet4    = 0x10\n\tSizeofSockaddrInet6    = 0x20\n\tSizeofSockaddrAny      = 0xfc\n\tSizeofSockaddrUnix     = 0x6e\n\tSizeofSockaddrDatalink = 0xfc\n\tSizeofLinger           = 0x8\n\tSizeofIPMreq           = 0x8\n\tSizeofIPv6Mreq         = 0x14\n\tSizeofMsghdr           = 0x30\n\tSizeofCmsghdr          = 0xc\n\tSizeofInet6Pktinfo     = 0x14\n\tSizeofIPv6MTUInfo      = 0x24\n\tSizeofICMPv6Filter     = 0x20\n)\n\ntype FdSet struct {\n\tBits [1024]int64\n}\n\ntype Utsname struct {\n\tSysname  [257]byte\n\tNodename [257]byte\n\tRelease  [257]byte\n\tVersion  [257]byte\n\tMachine  [257]byte\n}\n\ntype Ustat_t struct {\n\tTfree     int64\n\tTinode    uint64\n\tFname     [6]int8\n\tFpack     [6]int8\n\tPad_cgo_0 [4]byte\n}\n\nconst (\n\tAT_FDCWD            = 0xffd19553\n\tAT_SYMLINK_NOFOLLOW = 0x1000\n\tAT_SYMLINK_FOLLOW   = 0x2000\n\tAT_REMOVEDIR        = 0x1\n\tAT_EACCESS          = 0x4\n)\n\nconst (\n\tSizeofIfMsghdr  = 0x54\n\tSizeofIfData    = 0x44\n\tSizeofIfaMsghdr = 0x14\n\tSizeofRtMsghdr  = 0x4c\n\tSizeofRtMetrics = 0x28\n)\n\ntype IfMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tData      IfData\n}\n\ntype IfData struct {\n\tType       uint8\n\tAddrlen    uint8\n\tHdrlen     uint8\n\tPad_cgo_0  [1]byte\n\tMtu        uint32\n\tMetric     uint32\n\tBaudrate   uint32\n\tIpackets   uint32\n\tIerrors    uint32\n\tOpackets   uint32\n\tOerrors    uint32\n\tCollisions uint32\n\tIbytes     uint32\n\tObytes     uint32\n\tImcasts    uint32\n\tOmcasts    uint32\n\tIqdrops    uint32\n\tNoproto    uint32\n\tLastchange Timeval32\n}\n\ntype IfaMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tAddrs     int32\n\tFlags     int32\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tMetric    int32\n}\n\ntype RtMsghdr struct {\n\tMsglen    uint16\n\tVersion   uint8\n\tType      uint8\n\tIndex     uint16\n\tPad_cgo_0 [2]byte\n\tFlags     int32\n\tAddrs     int32\n\tPid       int32\n\tSeq       int32\n\tErrno     int32\n\tUse       int32\n\tInits     uint32\n\tRmx       RtMetrics\n}\n\ntype RtMetrics struct {\n\tLocks    uint32\n\tMtu      uint32\n\tHopcount uint32\n\tExpire   uint32\n\tRecvpipe uint32\n\tSendpipe uint32\n\tSsthresh uint32\n\tRtt      uint32\n\tRttvar   uint32\n\tPksent   uint32\n}\n\nconst (\n\tSizeofBpfVersion = 0x4\n\tSizeofBpfStat    = 0x80\n\tSizeofBpfProgram = 0x10\n\tSizeofBpfInsn    = 0x8\n\tSizeofBpfHdr     = 0x14\n)\n\ntype BpfVersion struct {\n\tMajor uint16\n\tMinor uint16\n}\n\ntype BpfStat struct {\n\tRecv    uint64\n\tDrop    uint64\n\tCapt    uint64\n\tPadding [13]uint64\n}\n\ntype BpfProgram struct {\n\tLen       uint32\n\tPad_cgo_0 [4]byte\n\tInsns     *BpfInsn\n}\n\ntype BpfInsn struct {\n\tCode uint16\n\tJt   uint8\n\tJf   uint8\n\tK    uint32\n}\n\ntype BpfTimeval struct {\n\tSec  int32\n\tUsec int32\n}\n\ntype BpfHdr struct {\n\tTstamp    BpfTimeval\n\tCaplen    uint32\n\tDatalen   uint32\n\tHdrlen    uint16\n\tPad_cgo_0 [2]byte\n}\n\ntype Termios struct {\n\tIflag     uint32\n\tOflag     uint32\n\tCflag     uint32\n\tLflag     uint32\n\tCc        [19]uint8\n\tPad_cgo_0 [1]byte\n}\n\ntype Termio struct {\n\tIflag     uint16\n\tOflag     uint16\n\tCflag     uint16\n\tLflag     uint16\n\tLine      int8\n\tCc        [8]uint8\n\tPad_cgo_0 [1]byte\n}\n\ntype Winsize struct {\n\tRow    uint16\n\tCol    uint16\n\tXpixel uint16\n\tYpixel uint16\n}\n\ntype PollFd struct {\n\tFd      int32\n\tEvents  int16\n\tRevents int16\n}\n\nconst (\n\tPOLLERR    = 0x8\n\tPOLLHUP    = 0x10\n\tPOLLIN     = 0x1\n\tPOLLNVAL   = 0x20\n\tPOLLOUT    = 0x4\n\tPOLLPRI    = 0x2\n\tPOLLRDBAND = 0x80\n\tPOLLRDNORM = 0x40\n\tPOLLWRBAND = 0x100\n\tPOLLWRNORM = 0x4\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/asm_windows_386.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//\n// System calls for 386, Windows are implemented in runtime/syscall_windows.goc\n//\n\nTEXT ·getprocaddress(SB), 7, $0-8\n\tJMP\tsyscall·getprocaddress(SB)\n\nTEXT ·loadlibrary(SB), 7, $0-4\n\tJMP\tsyscall·loadlibrary(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/asm_windows_amd64.s",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//\n// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc\n//\n\nTEXT ·getprocaddress(SB), 7, $0-32\n\tJMP\tsyscall·getprocaddress(SB)\n\nTEXT ·loadlibrary(SB), 7, $0-8\n\tJMP\tsyscall·loadlibrary(SB)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/dll_windows.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage windows\n\nimport (\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\n// DLLError describes reasons for DLL load failures.\ntype DLLError struct {\n\tErr     error\n\tObjName string\n\tMsg     string\n}\n\nfunc (e *DLLError) Error() string { return e.Msg }\n\n// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file.\nfunc loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno)\nfunc getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno)\n\n// A DLL implements access to a single DLL.\ntype DLL struct {\n\tName   string\n\tHandle Handle\n}\n\n// LoadDLL loads DLL file into memory.\n//\n// Warning: using LoadDLL without an absolute path name is subject to\n// DLL preloading attacks. To safely load a system DLL, use LazyDLL\n// with System set to true, or use LoadLibraryEx directly.\nfunc LoadDLL(name string) (dll *DLL, err error) {\n\tnamep, err := UTF16PtrFromString(name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\th, e := loadlibrary(namep)\n\tif e != 0 {\n\t\treturn nil, &DLLError{\n\t\t\tErr:     e,\n\t\t\tObjName: name,\n\t\t\tMsg:     \"Failed to load \" + name + \": \" + e.Error(),\n\t\t}\n\t}\n\td := &DLL{\n\t\tName:   name,\n\t\tHandle: Handle(h),\n\t}\n\treturn d, nil\n}\n\n// MustLoadDLL is like LoadDLL but panics if load operation failes.\nfunc MustLoadDLL(name string) *DLL {\n\td, e := LoadDLL(name)\n\tif e != nil {\n\t\tpanic(e)\n\t}\n\treturn d\n}\n\n// FindProc searches DLL d for procedure named name and returns *Proc\n// if found. It returns an error if search fails.\nfunc (d *DLL) FindProc(name string) (proc *Proc, err error) {\n\tnamep, err := BytePtrFromString(name)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ta, e := getprocaddress(uintptr(d.Handle), namep)\n\tif e != 0 {\n\t\treturn nil, &DLLError{\n\t\t\tErr:     e,\n\t\t\tObjName: name,\n\t\t\tMsg:     \"Failed to find \" + name + \" procedure in \" + d.Name + \": \" + e.Error(),\n\t\t}\n\t}\n\tp := &Proc{\n\t\tDll:  d,\n\t\tName: name,\n\t\taddr: a,\n\t}\n\treturn p, nil\n}\n\n// MustFindProc is like FindProc but panics if search fails.\nfunc (d *DLL) MustFindProc(name string) *Proc {\n\tp, e := d.FindProc(name)\n\tif e != nil {\n\t\tpanic(e)\n\t}\n\treturn p\n}\n\n// Release unloads DLL d from memory.\nfunc (d *DLL) Release() (err error) {\n\treturn FreeLibrary(d.Handle)\n}\n\n// A Proc implements access to a procedure inside a DLL.\ntype Proc struct {\n\tDll  *DLL\n\tName string\n\taddr uintptr\n}\n\n// Addr returns the address of the procedure represented by p.\n// The return value can be passed to Syscall to run the procedure.\nfunc (p *Proc) Addr() uintptr {\n\treturn p.addr\n}\n\n//go:uintptrescapes\n\n// Call executes procedure p with arguments a. It will panic, if more than 15 arguments\n// are supplied.\n//\n// The returned error is always non-nil, constructed from the result of GetLastError.\n// Callers must inspect the primary return value to decide whether an error occurred\n// (according to the semantics of the specific function being called) before consulting\n// the error. The error will be guaranteed to contain windows.Errno.\nfunc (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {\n\tswitch len(a) {\n\tcase 0:\n\t\treturn syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0)\n\tcase 1:\n\t\treturn syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0)\n\tcase 2:\n\t\treturn syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0)\n\tcase 3:\n\t\treturn syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2])\n\tcase 4:\n\t\treturn syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0)\n\tcase 5:\n\t\treturn syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0)\n\tcase 6:\n\t\treturn syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5])\n\tcase 7:\n\t\treturn syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0)\n\tcase 8:\n\t\treturn syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0)\n\tcase 9:\n\t\treturn syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])\n\tcase 10:\n\t\treturn syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0)\n\tcase 11:\n\t\treturn syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0)\n\tcase 12:\n\t\treturn syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11])\n\tcase 13:\n\t\treturn syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0)\n\tcase 14:\n\t\treturn syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0)\n\tcase 15:\n\t\treturn syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14])\n\tdefault:\n\t\tpanic(\"Call \" + p.Name + \" with too many arguments \" + itoa(len(a)) + \".\")\n\t}\n}\n\n// A LazyDLL implements access to a single DLL.\n// It will delay the load of the DLL until the first\n// call to its Handle method or to one of its\n// LazyProc's Addr method.\ntype LazyDLL struct {\n\tName string\n\n\t// System determines whether the DLL must be loaded from the\n\t// Windows System directory, bypassing the normal DLL search\n\t// path.\n\tSystem bool\n\n\tmu  sync.Mutex\n\tdll *DLL // non nil once DLL is loaded\n}\n\n// Load loads DLL file d.Name into memory. It returns an error if fails.\n// Load will not try to load DLL, if it is already loaded into memory.\nfunc (d *LazyDLL) Load() error {\n\t// Non-racy version of:\n\t// if d.dll != nil {\n\tif atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil {\n\t\treturn nil\n\t}\n\td.mu.Lock()\n\tdefer d.mu.Unlock()\n\tif d.dll != nil {\n\t\treturn nil\n\t}\n\n\t// kernel32.dll is special, since it's where LoadLibraryEx comes from.\n\t// The kernel already special-cases its name, so it's always\n\t// loaded from system32.\n\tvar dll *DLL\n\tvar err error\n\tif d.Name == \"kernel32.dll\" {\n\t\tdll, err = LoadDLL(d.Name)\n\t} else {\n\t\tdll, err = loadLibraryEx(d.Name, d.System)\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Non-racy version of:\n\t// d.dll = dll\n\tatomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll))\n\treturn nil\n}\n\n// mustLoad is like Load but panics if search fails.\nfunc (d *LazyDLL) mustLoad() {\n\te := d.Load()\n\tif e != nil {\n\t\tpanic(e)\n\t}\n}\n\n// Handle returns d's module handle.\nfunc (d *LazyDLL) Handle() uintptr {\n\td.mustLoad()\n\treturn uintptr(d.dll.Handle)\n}\n\n// NewProc returns a LazyProc for accessing the named procedure in the DLL d.\nfunc (d *LazyDLL) NewProc(name string) *LazyProc {\n\treturn &LazyProc{l: d, Name: name}\n}\n\n// NewLazyDLL creates new LazyDLL associated with DLL file.\nfunc NewLazyDLL(name string) *LazyDLL {\n\treturn &LazyDLL{Name: name}\n}\n\n// NewLazySystemDLL is like NewLazyDLL, but will only\n// search Windows System directory for the DLL if name is\n// a base name (like \"advapi32.dll\").\nfunc NewLazySystemDLL(name string) *LazyDLL {\n\treturn &LazyDLL{Name: name, System: true}\n}\n\n// A LazyProc implements access to a procedure inside a LazyDLL.\n// It delays the lookup until the Addr method is called.\ntype LazyProc struct {\n\tName string\n\n\tmu   sync.Mutex\n\tl    *LazyDLL\n\tproc *Proc\n}\n\n// Find searches DLL for procedure named p.Name. It returns\n// an error if search fails. Find will not search procedure,\n// if it is already found and loaded into memory.\nfunc (p *LazyProc) Find() error {\n\t// Non-racy version of:\n\t// if p.proc == nil {\n\tif atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil {\n\t\tp.mu.Lock()\n\t\tdefer p.mu.Unlock()\n\t\tif p.proc == nil {\n\t\t\te := p.l.Load()\n\t\t\tif e != nil {\n\t\t\t\treturn e\n\t\t\t}\n\t\t\tproc, e := p.l.dll.FindProc(p.Name)\n\t\t\tif e != nil {\n\t\t\t\treturn e\n\t\t\t}\n\t\t\t// Non-racy version of:\n\t\t\t// p.proc = proc\n\t\t\tatomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc))\n\t\t}\n\t}\n\treturn nil\n}\n\n// mustFind is like Find but panics if search fails.\nfunc (p *LazyProc) mustFind() {\n\te := p.Find()\n\tif e != nil {\n\t\tpanic(e)\n\t}\n}\n\n// Addr returns the address of the procedure represented by p.\n// The return value can be passed to Syscall to run the procedure.\n// It will panic if the procedure cannot be found.\nfunc (p *LazyProc) Addr() uintptr {\n\tp.mustFind()\n\treturn p.proc.Addr()\n}\n\n//go:uintptrescapes\n\n// Call executes procedure p with arguments a. It will panic, if more than 15 arguments\n// are supplied. It will also panic if the procedure cannot be found.\n//\n// The returned error is always non-nil, constructed from the result of GetLastError.\n// Callers must inspect the primary return value to decide whether an error occurred\n// (according to the semantics of the specific function being called) before consulting\n// the error. The error will be guaranteed to contain windows.Errno.\nfunc (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {\n\tp.mustFind()\n\treturn p.proc.Call(a...)\n}\n\nvar canDoSearchSystem32Once struct {\n\tsync.Once\n\tv bool\n}\n\nfunc initCanDoSearchSystem32() {\n\t// https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:\n\t// \"Windows 7, Windows Server 2008 R2, Windows Vista, and Windows\n\t// Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on\n\t// systems that have KB2533623 installed. To determine whether the\n\t// flags are available, use GetProcAddress to get the address of the\n\t// AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories\n\t// function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*\n\t// flags can be used with LoadLibraryEx.\"\n\tcanDoSearchSystem32Once.v = (modkernel32.NewProc(\"AddDllDirectory\").Find() == nil)\n}\n\nfunc canDoSearchSystem32() bool {\n\tcanDoSearchSystem32Once.Do(initCanDoSearchSystem32)\n\treturn canDoSearchSystem32Once.v\n}\n\nfunc isBaseName(name string) bool {\n\tfor _, c := range name {\n\t\tif c == ':' || c == '/' || c == '\\\\' {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// loadLibraryEx wraps the Windows LoadLibraryEx function.\n//\n// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx\n//\n// If name is not an absolute path, LoadLibraryEx searches for the DLL\n// in a variety of automatic locations unless constrained by flags.\n// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx\nfunc loadLibraryEx(name string, system bool) (*DLL, error) {\n\tloadDLL := name\n\tvar flags uintptr\n\tif system {\n\t\tif canDoSearchSystem32() {\n\t\t\tconst LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800\n\t\t\tflags = LOAD_LIBRARY_SEARCH_SYSTEM32\n\t\t} else if isBaseName(name) {\n\t\t\t// WindowsXP or unpatched Windows machine\n\t\t\t// trying to load \"foo.dll\" out of the system\n\t\t\t// folder, but LoadLibraryEx doesn't support\n\t\t\t// that yet on their system, so emulate it.\n\t\t\twindir, _ := Getenv(\"WINDIR\") // old var; apparently works on XP\n\t\t\tif windir == \"\" {\n\t\t\t\treturn nil, errString(\"%WINDIR% not defined\")\n\t\t\t}\n\t\t\tloadDLL = windir + \"\\\\System32\\\\\" + name\n\t\t}\n\t}\n\th, err := LoadLibraryEx(loadDLL, 0, flags)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &DLL{Name: name, Handle: h}, nil\n}\n\ntype errString string\n\nfunc (s errString) Error() string { return string(s) }\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/env_unset.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows\n// +build go1.4\n\npackage windows\n\nimport \"syscall\"\n\nfunc Unsetenv(key string) error {\n\t// This was added in Go 1.4.\n\treturn syscall.Unsetenv(key)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/env_windows.go",
    "content": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Windows environment variables.\n\npackage windows\n\nimport \"syscall\"\n\nfunc Getenv(key string) (value string, found bool) {\n\treturn syscall.Getenv(key)\n}\n\nfunc Setenv(key, value string) error {\n\treturn syscall.Setenv(key, value)\n}\n\nfunc Clearenv() {\n\tsyscall.Clearenv()\n}\n\nfunc Environ() []string {\n\treturn syscall.Environ()\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/eventlog.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows\n\npackage windows\n\nconst (\n\tEVENTLOG_SUCCESS          = 0\n\tEVENTLOG_ERROR_TYPE       = 1\n\tEVENTLOG_WARNING_TYPE     = 2\n\tEVENTLOG_INFORMATION_TYPE = 4\n\tEVENTLOG_AUDIT_SUCCESS    = 8\n\tEVENTLOG_AUDIT_FAILURE    = 16\n)\n\n//sys\tRegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW\n//sys\tDeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource\n//sys\tReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/exec_windows.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Fork, exec, wait, etc.\n\npackage windows\n\n// EscapeArg rewrites command line argument s as prescribed\n// in http://msdn.microsoft.com/en-us/library/ms880421.\n// This function returns \"\" (2 double quotes) if s is empty.\n// Alternatively, these transformations are done:\n// - every back slash (\\) is doubled, but only if immediately\n//   followed by double quote (\");\n// - every double quote (\") is escaped by back slash (\\);\n// - finally, s is wrapped with double quotes (arg -> \"arg\"),\n//   but only if there is space or tab inside s.\nfunc EscapeArg(s string) string {\n\tif len(s) == 0 {\n\t\treturn \"\\\"\\\"\"\n\t}\n\tn := len(s)\n\thasSpace := false\n\tfor i := 0; i < len(s); i++ {\n\t\tswitch s[i] {\n\t\tcase '\"', '\\\\':\n\t\t\tn++\n\t\tcase ' ', '\\t':\n\t\t\thasSpace = true\n\t\t}\n\t}\n\tif hasSpace {\n\t\tn += 2\n\t}\n\tif n == len(s) {\n\t\treturn s\n\t}\n\n\tqs := make([]byte, n)\n\tj := 0\n\tif hasSpace {\n\t\tqs[j] = '\"'\n\t\tj++\n\t}\n\tslashes := 0\n\tfor i := 0; i < len(s); i++ {\n\t\tswitch s[i] {\n\t\tdefault:\n\t\t\tslashes = 0\n\t\t\tqs[j] = s[i]\n\t\tcase '\\\\':\n\t\t\tslashes++\n\t\t\tqs[j] = s[i]\n\t\tcase '\"':\n\t\t\tfor ; slashes > 0; slashes-- {\n\t\t\t\tqs[j] = '\\\\'\n\t\t\t\tj++\n\t\t\t}\n\t\t\tqs[j] = '\\\\'\n\t\t\tj++\n\t\t\tqs[j] = s[i]\n\t\t}\n\t\tj++\n\t}\n\tif hasSpace {\n\t\tfor ; slashes > 0; slashes-- {\n\t\t\tqs[j] = '\\\\'\n\t\t\tj++\n\t\t}\n\t\tqs[j] = '\"'\n\t\tj++\n\t}\n\treturn string(qs[:j])\n}\n\nfunc CloseOnExec(fd Handle) {\n\tSetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)\n}\n\n// FullPath retrieves the full path of the specified file.\nfunc FullPath(name string) (path string, err error) {\n\tp, err := UTF16PtrFromString(name)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tn := uint32(100)\n\tfor {\n\t\tbuf := make([]uint16, n)\n\t\tn, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\t\tif n <= uint32(len(buf)) {\n\t\t\treturn UTF16ToString(buf[:n]), nil\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/memory_windows.go",
    "content": "// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage windows\n\nconst (\n\tMEM_COMMIT      = 0x00001000\n\tMEM_RESERVE     = 0x00002000\n\tMEM_DECOMMIT    = 0x00004000\n\tMEM_RELEASE     = 0x00008000\n\tMEM_RESET       = 0x00080000\n\tMEM_TOP_DOWN    = 0x00100000\n\tMEM_WRITE_WATCH = 0x00200000\n\tMEM_PHYSICAL    = 0x00400000\n\tMEM_RESET_UNDO  = 0x01000000\n\tMEM_LARGE_PAGES = 0x20000000\n\n\tPAGE_NOACCESS          = 0x01\n\tPAGE_READONLY          = 0x02\n\tPAGE_READWRITE         = 0x04\n\tPAGE_WRITECOPY         = 0x08\n\tPAGE_EXECUTE_READ      = 0x20\n\tPAGE_EXECUTE_READWRITE = 0x40\n\tPAGE_EXECUTE_WRITECOPY = 0x80\n)\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/mksyscall.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage windows\n\n//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/race.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows,race\n\npackage windows\n\nimport (\n\t\"runtime\"\n\t\"unsafe\"\n)\n\nconst raceenabled = true\n\nfunc raceAcquire(addr unsafe.Pointer) {\n\truntime.RaceAcquire(addr)\n}\n\nfunc raceReleaseMerge(addr unsafe.Pointer) {\n\truntime.RaceReleaseMerge(addr)\n}\n\nfunc raceReadRange(addr unsafe.Pointer, len int) {\n\truntime.RaceReadRange(addr, len)\n}\n\nfunc raceWriteRange(addr unsafe.Pointer, len int) {\n\truntime.RaceWriteRange(addr, len)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/race0.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows,!race\n\npackage windows\n\nimport (\n\t\"unsafe\"\n)\n\nconst raceenabled = false\n\nfunc raceAcquire(addr unsafe.Pointer) {\n}\n\nfunc raceReleaseMerge(addr unsafe.Pointer) {\n}\n\nfunc raceReadRange(addr unsafe.Pointer, len int) {\n}\n\nfunc raceWriteRange(addr unsafe.Pointer, len int) {\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/security_windows.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage windows\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nconst (\n\tSTANDARD_RIGHTS_REQUIRED = 0xf0000\n\tSTANDARD_RIGHTS_READ     = 0x20000\n\tSTANDARD_RIGHTS_WRITE    = 0x20000\n\tSTANDARD_RIGHTS_EXECUTE  = 0x20000\n\tSTANDARD_RIGHTS_ALL      = 0x1F0000\n)\n\nconst (\n\tNameUnknown          = 0\n\tNameFullyQualifiedDN = 1\n\tNameSamCompatible    = 2\n\tNameDisplay          = 3\n\tNameUniqueId         = 6\n\tNameCanonical        = 7\n\tNameUserPrincipal    = 8\n\tNameCanonicalEx      = 9\n\tNameServicePrincipal = 10\n\tNameDnsDomain        = 12\n)\n\n// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.\n// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx\n//sys\tTranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW\n//sys\tGetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW\n\n// TranslateAccountName converts a directory service\n// object name from one format to another.\nfunc TranslateAccountName(username string, from, to uint32, initSize int) (string, error) {\n\tu, e := UTF16PtrFromString(username)\n\tif e != nil {\n\t\treturn \"\", e\n\t}\n\tn := uint32(50)\n\tfor {\n\t\tb := make([]uint16, n)\n\t\te = TranslateName(u, from, to, &b[0], &n)\n\t\tif e == nil {\n\t\t\treturn UTF16ToString(b[:n]), nil\n\t\t}\n\t\tif e != ERROR_INSUFFICIENT_BUFFER {\n\t\t\treturn \"\", e\n\t\t}\n\t\tif n <= uint32(len(b)) {\n\t\t\treturn \"\", e\n\t\t}\n\t}\n}\n\nconst (\n\t// do not reorder\n\tNetSetupUnknownStatus = iota\n\tNetSetupUnjoined\n\tNetSetupWorkgroupName\n\tNetSetupDomainName\n)\n\ntype UserInfo10 struct {\n\tName       *uint16\n\tComment    *uint16\n\tUsrComment *uint16\n\tFullName   *uint16\n}\n\n//sys\tNetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo\n//sys\tNetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation\n//sys\tNetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree\n\nconst (\n\t// do not reorder\n\tSidTypeUser = 1 + iota\n\tSidTypeGroup\n\tSidTypeDomain\n\tSidTypeAlias\n\tSidTypeWellKnownGroup\n\tSidTypeDeletedAccount\n\tSidTypeInvalid\n\tSidTypeUnknown\n\tSidTypeComputer\n\tSidTypeLabel\n)\n\ntype SidIdentifierAuthority struct {\n\tValue [6]byte\n}\n\nvar (\n\tSECURITY_NULL_SID_AUTHORITY        = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}}\n\tSECURITY_WORLD_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}}\n\tSECURITY_LOCAL_SID_AUTHORITY       = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}}\n\tSECURITY_CREATOR_SID_AUTHORITY     = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}}\n\tSECURITY_NON_UNIQUE_AUTHORITY      = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}}\n\tSECURITY_NT_AUTHORITY              = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}}\n\tSECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}}\n)\n\nconst (\n\tSECURITY_NULL_RID                   = 0\n\tSECURITY_WORLD_RID                  = 0\n\tSECURITY_LOCAL_RID                  = 0\n\tSECURITY_CREATOR_OWNER_RID          = 0\n\tSECURITY_CREATOR_GROUP_RID          = 1\n\tSECURITY_DIALUP_RID                 = 1\n\tSECURITY_NETWORK_RID                = 2\n\tSECURITY_BATCH_RID                  = 3\n\tSECURITY_INTERACTIVE_RID            = 4\n\tSECURITY_LOGON_IDS_RID              = 5\n\tSECURITY_SERVICE_RID                = 6\n\tSECURITY_LOCAL_SYSTEM_RID           = 18\n\tSECURITY_BUILTIN_DOMAIN_RID         = 32\n\tSECURITY_PRINCIPAL_SELF_RID         = 10\n\tSECURITY_CREATOR_OWNER_SERVER_RID   = 0x2\n\tSECURITY_CREATOR_GROUP_SERVER_RID   = 0x3\n\tSECURITY_LOGON_IDS_RID_COUNT        = 0x3\n\tSECURITY_ANONYMOUS_LOGON_RID        = 0x7\n\tSECURITY_PROXY_RID                  = 0x8\n\tSECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9\n\tSECURITY_SERVER_LOGON_RID           = SECURITY_ENTERPRISE_CONTROLLERS_RID\n\tSECURITY_AUTHENTICATED_USER_RID     = 0xb\n\tSECURITY_RESTRICTED_CODE_RID        = 0xc\n\tSECURITY_NT_NON_UNIQUE_RID          = 0x15\n)\n\n//sys\tLookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW\n//sys\tLookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW\n//sys\tConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW\n//sys\tConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW\n//sys\tGetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid\n//sys\tCopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid\n//sys\tAllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid\n//sys\tFreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid\n//sys\tEqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid\n\n// The security identifier (SID) structure is a variable-length\n// structure used to uniquely identify users or groups.\ntype SID struct{}\n\n// StringToSid converts a string-format security identifier\n// sid into a valid, functional sid.\nfunc StringToSid(s string) (*SID, error) {\n\tvar sid *SID\n\tp, e := UTF16PtrFromString(s)\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\te = ConvertStringSidToSid(p, &sid)\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\tdefer LocalFree((Handle)(unsafe.Pointer(sid)))\n\treturn sid.Copy()\n}\n\n// LookupSID retrieves a security identifier sid for the account\n// and the name of the domain on which the account was found.\n// System specify target computer to search.\nfunc LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) {\n\tif len(account) == 0 {\n\t\treturn nil, \"\", 0, syscall.EINVAL\n\t}\n\tacc, e := UTF16PtrFromString(account)\n\tif e != nil {\n\t\treturn nil, \"\", 0, e\n\t}\n\tvar sys *uint16\n\tif len(system) > 0 {\n\t\tsys, e = UTF16PtrFromString(system)\n\t\tif e != nil {\n\t\t\treturn nil, \"\", 0, e\n\t\t}\n\t}\n\tn := uint32(50)\n\tdn := uint32(50)\n\tfor {\n\t\tb := make([]byte, n)\n\t\tdb := make([]uint16, dn)\n\t\tsid = (*SID)(unsafe.Pointer(&b[0]))\n\t\te = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType)\n\t\tif e == nil {\n\t\t\treturn sid, UTF16ToString(db), accType, nil\n\t\t}\n\t\tif e != ERROR_INSUFFICIENT_BUFFER {\n\t\t\treturn nil, \"\", 0, e\n\t\t}\n\t\tif n <= uint32(len(b)) {\n\t\t\treturn nil, \"\", 0, e\n\t\t}\n\t}\n}\n\n// String converts sid to a string format\n// suitable for display, storage, or transmission.\nfunc (sid *SID) String() (string, error) {\n\tvar s *uint16\n\te := ConvertSidToStringSid(sid, &s)\n\tif e != nil {\n\t\treturn \"\", e\n\t}\n\tdefer LocalFree((Handle)(unsafe.Pointer(s)))\n\treturn UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil\n}\n\n// Len returns the length, in bytes, of a valid security identifier sid.\nfunc (sid *SID) Len() int {\n\treturn int(GetLengthSid(sid))\n}\n\n// Copy creates a duplicate of security identifier sid.\nfunc (sid *SID) Copy() (*SID, error) {\n\tb := make([]byte, sid.Len())\n\tsid2 := (*SID)(unsafe.Pointer(&b[0]))\n\te := CopySid(uint32(len(b)), sid2, sid)\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\treturn sid2, nil\n}\n\n// LookupAccount retrieves the name of the account for this sid\n// and the name of the first domain on which this sid is found.\n// System specify target computer to search for.\nfunc (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) {\n\tvar sys *uint16\n\tif len(system) > 0 {\n\t\tsys, err = UTF16PtrFromString(system)\n\t\tif err != nil {\n\t\t\treturn \"\", \"\", 0, err\n\t\t}\n\t}\n\tn := uint32(50)\n\tdn := uint32(50)\n\tfor {\n\t\tb := make([]uint16, n)\n\t\tdb := make([]uint16, dn)\n\t\te := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType)\n\t\tif e == nil {\n\t\t\treturn UTF16ToString(b), UTF16ToString(db), accType, nil\n\t\t}\n\t\tif e != ERROR_INSUFFICIENT_BUFFER {\n\t\t\treturn \"\", \"\", 0, e\n\t\t}\n\t\tif n <= uint32(len(b)) {\n\t\t\treturn \"\", \"\", 0, e\n\t\t}\n\t}\n}\n\nconst (\n\t// do not reorder\n\tTOKEN_ASSIGN_PRIMARY = 1 << iota\n\tTOKEN_DUPLICATE\n\tTOKEN_IMPERSONATE\n\tTOKEN_QUERY\n\tTOKEN_QUERY_SOURCE\n\tTOKEN_ADJUST_PRIVILEGES\n\tTOKEN_ADJUST_GROUPS\n\tTOKEN_ADJUST_DEFAULT\n\n\tTOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |\n\t\tTOKEN_ASSIGN_PRIMARY |\n\t\tTOKEN_DUPLICATE |\n\t\tTOKEN_IMPERSONATE |\n\t\tTOKEN_QUERY |\n\t\tTOKEN_QUERY_SOURCE |\n\t\tTOKEN_ADJUST_PRIVILEGES |\n\t\tTOKEN_ADJUST_GROUPS |\n\t\tTOKEN_ADJUST_DEFAULT\n\tTOKEN_READ  = STANDARD_RIGHTS_READ | TOKEN_QUERY\n\tTOKEN_WRITE = STANDARD_RIGHTS_WRITE |\n\t\tTOKEN_ADJUST_PRIVILEGES |\n\t\tTOKEN_ADJUST_GROUPS |\n\t\tTOKEN_ADJUST_DEFAULT\n\tTOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE\n)\n\nconst (\n\t// do not reorder\n\tTokenUser = 1 + iota\n\tTokenGroups\n\tTokenPrivileges\n\tTokenOwner\n\tTokenPrimaryGroup\n\tTokenDefaultDacl\n\tTokenSource\n\tTokenType\n\tTokenImpersonationLevel\n\tTokenStatistics\n\tTokenRestrictedSids\n\tTokenSessionId\n\tTokenGroupsAndPrivileges\n\tTokenSessionReference\n\tTokenSandBoxInert\n\tTokenAuditPolicy\n\tTokenOrigin\n\tTokenElevationType\n\tTokenLinkedToken\n\tTokenElevation\n\tTokenHasRestrictions\n\tTokenAccessInformation\n\tTokenVirtualizationAllowed\n\tTokenVirtualizationEnabled\n\tTokenIntegrityLevel\n\tTokenUIAccess\n\tTokenMandatoryPolicy\n\tTokenLogonSid\n\tMaxTokenInfoClass\n)\n\ntype SIDAndAttributes struct {\n\tSid        *SID\n\tAttributes uint32\n}\n\ntype Tokenuser struct {\n\tUser SIDAndAttributes\n}\n\ntype Tokenprimarygroup struct {\n\tPrimaryGroup *SID\n}\n\ntype Tokengroups struct {\n\tGroupCount uint32\n\tGroups     [1]SIDAndAttributes\n}\n\n//sys\tOpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken\n//sys\tGetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation\n//sys\tGetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW\n\n// An access token contains the security information for a logon session.\n// The system creates an access token when a user logs on, and every\n// process executed on behalf of the user has a copy of the token.\n// The token identifies the user, the user's groups, and the user's\n// privileges. The system uses the token to control access to securable\n// objects and to control the ability of the user to perform various\n// system-related operations on the local computer.\ntype Token Handle\n\n// OpenCurrentProcessToken opens the access token\n// associated with current process.\nfunc OpenCurrentProcessToken() (Token, error) {\n\tp, e := GetCurrentProcess()\n\tif e != nil {\n\t\treturn 0, e\n\t}\n\tvar t Token\n\te = OpenProcessToken(p, TOKEN_QUERY, &t)\n\tif e != nil {\n\t\treturn 0, e\n\t}\n\treturn t, nil\n}\n\n// Close releases access to access token.\nfunc (t Token) Close() error {\n\treturn CloseHandle(Handle(t))\n}\n\n// getInfo retrieves a specified type of information about an access token.\nfunc (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) {\n\tn := uint32(initSize)\n\tfor {\n\t\tb := make([]byte, n)\n\t\te := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n)\n\t\tif e == nil {\n\t\t\treturn unsafe.Pointer(&b[0]), nil\n\t\t}\n\t\tif e != ERROR_INSUFFICIENT_BUFFER {\n\t\t\treturn nil, e\n\t\t}\n\t\tif n <= uint32(len(b)) {\n\t\t\treturn nil, e\n\t\t}\n\t}\n}\n\n// GetTokenUser retrieves access token t user account information.\nfunc (t Token) GetTokenUser() (*Tokenuser, error) {\n\ti, e := t.getInfo(TokenUser, 50)\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\treturn (*Tokenuser)(i), nil\n}\n\n// GetTokenGroups retrieves group accounts associated with access token t.\nfunc (t Token) GetTokenGroups() (*Tokengroups, error) {\n\ti, e := t.getInfo(TokenGroups, 50)\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\treturn (*Tokengroups)(i), nil\n}\n\n// GetTokenPrimaryGroup retrieves access token t primary group information.\n// A pointer to a SID structure representing a group that will become\n// the primary group of any objects created by a process using this access token.\nfunc (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) {\n\ti, e := t.getInfo(TokenPrimaryGroup, 50)\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\treturn (*Tokenprimarygroup)(i), nil\n}\n\n// GetUserProfileDirectory retrieves path to the\n// root directory of the access token t user's profile.\nfunc (t Token) GetUserProfileDirectory() (string, error) {\n\tn := uint32(100)\n\tfor {\n\t\tb := make([]uint16, n)\n\t\te := GetUserProfileDirectory(t, &b[0], &n)\n\t\tif e == nil {\n\t\t\treturn UTF16ToString(b), nil\n\t\t}\n\t\tif e != ERROR_INSUFFICIENT_BUFFER {\n\t\t\treturn \"\", e\n\t\t}\n\t\tif n <= uint32(len(b)) {\n\t\t\treturn \"\", e\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/service.go",
    "content": "// Copyright 2012 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows\n\npackage windows\n\nconst (\n\tSC_MANAGER_CONNECT            = 1\n\tSC_MANAGER_CREATE_SERVICE     = 2\n\tSC_MANAGER_ENUMERATE_SERVICE  = 4\n\tSC_MANAGER_LOCK               = 8\n\tSC_MANAGER_QUERY_LOCK_STATUS  = 16\n\tSC_MANAGER_MODIFY_BOOT_CONFIG = 32\n\tSC_MANAGER_ALL_ACCESS         = 0xf003f\n)\n\n//sys\tOpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW\n\nconst (\n\tSERVICE_KERNEL_DRIVER       = 1\n\tSERVICE_FILE_SYSTEM_DRIVER  = 2\n\tSERVICE_ADAPTER             = 4\n\tSERVICE_RECOGNIZER_DRIVER   = 8\n\tSERVICE_WIN32_OWN_PROCESS   = 16\n\tSERVICE_WIN32_SHARE_PROCESS = 32\n\tSERVICE_WIN32               = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS\n\tSERVICE_INTERACTIVE_PROCESS = 256\n\tSERVICE_DRIVER              = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER\n\tSERVICE_TYPE_ALL            = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS\n\n\tSERVICE_BOOT_START   = 0\n\tSERVICE_SYSTEM_START = 1\n\tSERVICE_AUTO_START   = 2\n\tSERVICE_DEMAND_START = 3\n\tSERVICE_DISABLED     = 4\n\n\tSERVICE_ERROR_IGNORE   = 0\n\tSERVICE_ERROR_NORMAL   = 1\n\tSERVICE_ERROR_SEVERE   = 2\n\tSERVICE_ERROR_CRITICAL = 3\n\n\tSC_STATUS_PROCESS_INFO = 0\n\n\tSERVICE_STOPPED          = 1\n\tSERVICE_START_PENDING    = 2\n\tSERVICE_STOP_PENDING     = 3\n\tSERVICE_RUNNING          = 4\n\tSERVICE_CONTINUE_PENDING = 5\n\tSERVICE_PAUSE_PENDING    = 6\n\tSERVICE_PAUSED           = 7\n\tSERVICE_NO_CHANGE        = 0xffffffff\n\n\tSERVICE_ACCEPT_STOP                  = 1\n\tSERVICE_ACCEPT_PAUSE_CONTINUE        = 2\n\tSERVICE_ACCEPT_SHUTDOWN              = 4\n\tSERVICE_ACCEPT_PARAMCHANGE           = 8\n\tSERVICE_ACCEPT_NETBINDCHANGE         = 16\n\tSERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32\n\tSERVICE_ACCEPT_POWEREVENT            = 64\n\tSERVICE_ACCEPT_SESSIONCHANGE         = 128\n\n\tSERVICE_CONTROL_STOP                  = 1\n\tSERVICE_CONTROL_PAUSE                 = 2\n\tSERVICE_CONTROL_CONTINUE              = 3\n\tSERVICE_CONTROL_INTERROGATE           = 4\n\tSERVICE_CONTROL_SHUTDOWN              = 5\n\tSERVICE_CONTROL_PARAMCHANGE           = 6\n\tSERVICE_CONTROL_NETBINDADD            = 7\n\tSERVICE_CONTROL_NETBINDREMOVE         = 8\n\tSERVICE_CONTROL_NETBINDENABLE         = 9\n\tSERVICE_CONTROL_NETBINDDISABLE        = 10\n\tSERVICE_CONTROL_DEVICEEVENT           = 11\n\tSERVICE_CONTROL_HARDWAREPROFILECHANGE = 12\n\tSERVICE_CONTROL_POWEREVENT            = 13\n\tSERVICE_CONTROL_SESSIONCHANGE         = 14\n\n\tSERVICE_ACTIVE    = 1\n\tSERVICE_INACTIVE  = 2\n\tSERVICE_STATE_ALL = 3\n\n\tSERVICE_QUERY_CONFIG           = 1\n\tSERVICE_CHANGE_CONFIG          = 2\n\tSERVICE_QUERY_STATUS           = 4\n\tSERVICE_ENUMERATE_DEPENDENTS   = 8\n\tSERVICE_START                  = 16\n\tSERVICE_STOP                   = 32\n\tSERVICE_PAUSE_CONTINUE         = 64\n\tSERVICE_INTERROGATE            = 128\n\tSERVICE_USER_DEFINED_CONTROL   = 256\n\tSERVICE_ALL_ACCESS             = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL\n\tSERVICE_RUNS_IN_SYSTEM_PROCESS = 1\n\tSERVICE_CONFIG_DESCRIPTION     = 1\n\tSERVICE_CONFIG_FAILURE_ACTIONS = 2\n\n\tNO_ERROR = 0\n\n\tSC_ENUM_PROCESS_INFO = 0\n)\n\ntype SERVICE_STATUS struct {\n\tServiceType             uint32\n\tCurrentState            uint32\n\tControlsAccepted        uint32\n\tWin32ExitCode           uint32\n\tServiceSpecificExitCode uint32\n\tCheckPoint              uint32\n\tWaitHint                uint32\n}\n\ntype SERVICE_TABLE_ENTRY struct {\n\tServiceName *uint16\n\tServiceProc uintptr\n}\n\ntype QUERY_SERVICE_CONFIG struct {\n\tServiceType      uint32\n\tStartType        uint32\n\tErrorControl     uint32\n\tBinaryPathName   *uint16\n\tLoadOrderGroup   *uint16\n\tTagId            uint32\n\tDependencies     *uint16\n\tServiceStartName *uint16\n\tDisplayName      *uint16\n}\n\ntype SERVICE_DESCRIPTION struct {\n\tDescription *uint16\n}\n\ntype SERVICE_STATUS_PROCESS struct {\n\tServiceType             uint32\n\tCurrentState            uint32\n\tControlsAccepted        uint32\n\tWin32ExitCode           uint32\n\tServiceSpecificExitCode uint32\n\tCheckPoint              uint32\n\tWaitHint                uint32\n\tProcessId               uint32\n\tServiceFlags            uint32\n}\n\ntype ENUM_SERVICE_STATUS_PROCESS struct {\n\tServiceName          *uint16\n\tDisplayName          *uint16\n\tServiceStatusProcess SERVICE_STATUS_PROCESS\n}\n\n//sys\tCloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle\n//sys\tCreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW\n//sys\tOpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW\n//sys\tDeleteService(service Handle) (err error) = advapi32.DeleteService\n//sys\tStartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW\n//sys\tQueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus\n//sys\tControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService\n//sys\tStartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW\n//sys\tSetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus\n//sys\tChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW\n//sys\tQueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW\n//sys\tChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W\n//sys\tQueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W\n//sys\tEnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/str.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows\n\npackage windows\n\nfunc itoa(val int) string { // do it here rather than with fmt to avoid dependency\n\tif val < 0 {\n\t\treturn \"-\" + itoa(-val)\n\t}\n\tvar buf [32]byte // big enough for int64\n\ti := len(buf) - 1\n\tfor val >= 10 {\n\t\tbuf[i] = byte(val%10 + '0')\n\t\ti--\n\t\tval /= 10\n\t}\n\tbuf[i] = byte(val + '0')\n\treturn string(buf[i:])\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/syscall.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build windows\n\n// Package windows contains an interface to the low-level operating system\n// primitives. OS details vary depending on the underlying system, and\n// by default, godoc will display the OS-specific documentation for the current\n// system. If you want godoc to display syscall documentation for another\n// system, set $GOOS and $GOARCH to the desired system. For example, if\n// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS\n// to freebsd and $GOARCH to arm.\n// The primary use of this package is inside other packages that provide a more\n// portable interface to the system, such as \"os\", \"time\" and \"net\".  Use\n// those packages rather than this one if you can.\n// For details of the functions and data types in this package consult\n// the manuals for the appropriate operating system.\n// These calls return err == nil to indicate success; otherwise\n// err represents an operating system error describing the failure and\n// holds a value of type syscall.Errno.\npackage windows // import \"golang.org/x/sys/windows\"\n\nimport (\n\t\"syscall\"\n)\n\n// ByteSliceFromString returns a NUL-terminated slice of bytes\n// containing the text of s. If s contains a NUL byte at any\n// location, it returns (nil, syscall.EINVAL).\nfunc ByteSliceFromString(s string) ([]byte, error) {\n\tfor i := 0; i < len(s); i++ {\n\t\tif s[i] == 0 {\n\t\t\treturn nil, syscall.EINVAL\n\t\t}\n\t}\n\ta := make([]byte, len(s)+1)\n\tcopy(a, s)\n\treturn a, nil\n}\n\n// BytePtrFromString returns a pointer to a NUL-terminated array of\n// bytes containing the text of s. If s contains a NUL byte at any\n// location, it returns (nil, syscall.EINVAL).\nfunc BytePtrFromString(s string) (*byte, error) {\n\ta, err := ByteSliceFromString(s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &a[0], nil\n}\n\n// Single-word zero for use when we need a valid pointer to 0 bytes.\n// See mksyscall.pl.\nvar _zero uintptr\n\nfunc (ts *Timespec) Unix() (sec int64, nsec int64) {\n\treturn int64(ts.Sec), int64(ts.Nsec)\n}\n\nfunc (tv *Timeval) Unix() (sec int64, nsec int64) {\n\treturn int64(tv.Sec), int64(tv.Usec) * 1000\n}\n\nfunc (ts *Timespec) Nano() int64 {\n\treturn int64(ts.Sec)*1e9 + int64(ts.Nsec)\n}\n\nfunc (tv *Timeval) Nano() int64 {\n\treturn int64(tv.Sec)*1e9 + int64(tv.Usec)*1000\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/syscall_windows.go",
    "content": "// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Windows system calls.\n\npackage windows\n\nimport (\n\terrorspkg \"errors\"\n\t\"sync\"\n\t\"syscall\"\n\t\"unicode/utf16\"\n\t\"unsafe\"\n)\n\ntype Handle uintptr\n\nconst InvalidHandle = ^Handle(0)\n\n// StringToUTF16 is deprecated. Use UTF16FromString instead.\n// If s contains a NUL byte this function panics instead of\n// returning an error.\nfunc StringToUTF16(s string) []uint16 {\n\ta, err := UTF16FromString(s)\n\tif err != nil {\n\t\tpanic(\"windows: string with NUL passed to StringToUTF16\")\n\t}\n\treturn a\n}\n\n// UTF16FromString returns the UTF-16 encoding of the UTF-8 string\n// s, with a terminating NUL added. If s contains a NUL byte at any\n// location, it returns (nil, syscall.EINVAL).\nfunc UTF16FromString(s string) ([]uint16, error) {\n\tfor i := 0; i < len(s); i++ {\n\t\tif s[i] == 0 {\n\t\t\treturn nil, syscall.EINVAL\n\t\t}\n\t}\n\treturn utf16.Encode([]rune(s + \"\\x00\")), nil\n}\n\n// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,\n// with a terminating NUL removed.\nfunc UTF16ToString(s []uint16) string {\n\tfor i, v := range s {\n\t\tif v == 0 {\n\t\t\ts = s[0:i]\n\t\t\tbreak\n\t\t}\n\t}\n\treturn string(utf16.Decode(s))\n}\n\n// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.\n// If s contains a NUL byte this function panics instead of\n// returning an error.\nfunc StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] }\n\n// UTF16PtrFromString returns pointer to the UTF-16 encoding of\n// the UTF-8 string s, with a terminating NUL added. If s\n// contains a NUL byte at any location, it returns (nil, syscall.EINVAL).\nfunc UTF16PtrFromString(s string) (*uint16, error) {\n\ta, err := UTF16FromString(s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &a[0], nil\n}\n\nfunc Getpagesize() int { return 4096 }\n\n// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention.\n// This is useful when interoperating with Windows code requiring callbacks.\nfunc NewCallback(fn interface{}) uintptr {\n\treturn syscall.NewCallback(fn)\n}\n\n// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention.\n// This is useful when interoperating with Windows code requiring callbacks.\nfunc NewCallbackCDecl(fn interface{}) uintptr {\n\treturn syscall.NewCallbackCDecl(fn)\n}\n\n// windows api calls\n\n//sys\tGetLastError() (lasterr error)\n//sys\tLoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW\n//sys\tLoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW\n//sys\tFreeLibrary(handle Handle) (err error)\n//sys\tGetProcAddress(module Handle, procname string) (proc uintptr, err error)\n//sys\tGetVersion() (ver uint32, err error)\n//sys\tFormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW\n//sys\tExitProcess(exitcode uint32)\n//sys\tCreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW\n//sys\tReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)\n//sys\tWriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)\n//sys\tSetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff]\n//sys\tCloseHandle(handle Handle) (err error)\n//sys\tGetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle]\n//sys\tSetStdHandle(stdhandle uint32, handle Handle) (err error)\n//sys\tfindFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW\n//sys\tfindNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW\n//sys\tFindClose(handle Handle) (err error)\n//sys\tGetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error)\n//sys\tGetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW\n//sys\tSetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW\n//sys\tCreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW\n//sys\tRemoveDirectory(path *uint16) (err error) = RemoveDirectoryW\n//sys\tDeleteFile(path *uint16) (err error) = DeleteFileW\n//sys\tMoveFile(from *uint16, to *uint16) (err error) = MoveFileW\n//sys\tMoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW\n//sys\tGetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW\n//sys\tGetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW\n//sys\tSetEndOfFile(handle Handle) (err error)\n//sys\tGetSystemTimeAsFileTime(time *Filetime)\n//sys\tGetSystemTimePreciseAsFileTime(time *Filetime)\n//sys\tGetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff]\n//sys\tCreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error)\n//sys\tGetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error)\n//sys\tPostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error)\n//sys\tCancelIo(s Handle) (err error)\n//sys\tCancelIoEx(s Handle, o *Overlapped) (err error)\n//sys\tCreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW\n//sys\tOpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error)\n//sys\tTerminateProcess(handle Handle, exitcode uint32) (err error)\n//sys\tGetExitCodeProcess(handle Handle, exitcode *uint32) (err error)\n//sys\tGetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW\n//sys\tGetCurrentProcess() (pseudoHandle Handle, err error)\n//sys\tGetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error)\n//sys\tDuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error)\n//sys\tWaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff]\n//sys\tGetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW\n//sys\tCreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error)\n//sys\tGetFileType(filehandle Handle) (n uint32, err error)\n//sys\tCryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW\n//sys\tCryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext\n//sys\tCryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom\n//sys\tGetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW\n//sys\tFreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW\n//sys\tGetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW\n//sys\tSetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW\n//sys\tSetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)\n//sys\tGetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW\n//sys\tSetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW\n//sys\tGetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW\n//sys\tGetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW\n//sys\tCommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW\n//sys\tLocalFree(hmem Handle) (handle Handle, err error) [failretval!=0]\n//sys\tSetHandleInformation(handle Handle, mask uint32, flags uint32) (err error)\n//sys\tFlushFileBuffers(handle Handle) (err error)\n//sys\tGetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW\n//sys\tGetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW\n//sys\tGetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW\n//sys\tCreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW\n//sys\tMapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error)\n//sys\tUnmapViewOfFile(addr uintptr) (err error)\n//sys\tFlushViewOfFile(addr uintptr, length uintptr) (err error)\n//sys\tVirtualLock(addr uintptr, length uintptr) (err error)\n//sys\tVirtualUnlock(addr uintptr, length uintptr) (err error)\n//sys\tVirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc\n//sys\tVirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree\n//sys\tVirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect\n//sys\tTransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile\n//sys\tReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW\n//sys\tCertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW\n//sys   CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore\n//sys\tCertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore\n//sys   CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore\n//sys\tCertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore\n//sys   CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain\n//sys   CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain\n//sys   CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext\n//sys   CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext\n//sys   CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy\n//sys\tRegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW\n//sys\tRegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey\n//sys\tRegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW\n//sys\tRegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW\n//sys\tRegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW\n//sys\tgetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId\n//sys\tGetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode\n//sys\tSetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode\n//sys\tGetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo\n//sys\tWriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW\n//sys\tReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW\n//sys\tCreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot\n//sys\tProcess32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW\n//sys\tProcess32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW\n//sys\tDeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error)\n// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.\n//sys\tCreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW\n//sys\tCreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW\n//sys\tGetCurrentThreadId() (id uint32)\n//sys\tCreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW\n//sys\tCreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW\n//sys\tOpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW\n//sys\tSetEvent(event Handle) (err error) = kernel32.SetEvent\n//sys\tResetEvent(event Handle) (err error) = kernel32.ResetEvent\n//sys\tPulseEvent(event Handle) (err error) = kernel32.PulseEvent\n\n// syscall interface implementation for other packages\n\n// GetProcAddressByOrdinal retrieves the address of the exported\n// function from module by ordinal.\nfunc GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0)\n\tproc = uintptr(r0)\n\tif proc == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc Exit(code int) { ExitProcess(uint32(code)) }\n\nfunc makeInheritSa() *SecurityAttributes {\n\tvar sa SecurityAttributes\n\tsa.Length = uint32(unsafe.Sizeof(sa))\n\tsa.InheritHandle = 1\n\treturn &sa\n}\n\nfunc Open(path string, mode int, perm uint32) (fd Handle, err error) {\n\tif len(path) == 0 {\n\t\treturn InvalidHandle, ERROR_FILE_NOT_FOUND\n\t}\n\tpathp, err := UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn InvalidHandle, err\n\t}\n\tvar access uint32\n\tswitch mode & (O_RDONLY | O_WRONLY | O_RDWR) {\n\tcase O_RDONLY:\n\t\taccess = GENERIC_READ\n\tcase O_WRONLY:\n\t\taccess = GENERIC_WRITE\n\tcase O_RDWR:\n\t\taccess = GENERIC_READ | GENERIC_WRITE\n\t}\n\tif mode&O_CREAT != 0 {\n\t\taccess |= GENERIC_WRITE\n\t}\n\tif mode&O_APPEND != 0 {\n\t\taccess &^= GENERIC_WRITE\n\t\taccess |= FILE_APPEND_DATA\n\t}\n\tsharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)\n\tvar sa *SecurityAttributes\n\tif mode&O_CLOEXEC == 0 {\n\t\tsa = makeInheritSa()\n\t}\n\tvar createmode uint32\n\tswitch {\n\tcase mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL):\n\t\tcreatemode = CREATE_NEW\n\tcase mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC):\n\t\tcreatemode = CREATE_ALWAYS\n\tcase mode&O_CREAT == O_CREAT:\n\t\tcreatemode = OPEN_ALWAYS\n\tcase mode&O_TRUNC == O_TRUNC:\n\t\tcreatemode = TRUNCATE_EXISTING\n\tdefault:\n\t\tcreatemode = OPEN_EXISTING\n\t}\n\th, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0)\n\treturn h, e\n}\n\nfunc Read(fd Handle, p []byte) (n int, err error) {\n\tvar done uint32\n\te := ReadFile(fd, p, &done, nil)\n\tif e != nil {\n\t\tif e == ERROR_BROKEN_PIPE {\n\t\t\t// NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin\n\t\t\treturn 0, nil\n\t\t}\n\t\treturn 0, e\n\t}\n\tif raceenabled {\n\t\tif done > 0 {\n\t\t\traceWriteRange(unsafe.Pointer(&p[0]), int(done))\n\t\t}\n\t\traceAcquire(unsafe.Pointer(&ioSync))\n\t}\n\treturn int(done), nil\n}\n\nfunc Write(fd Handle, p []byte) (n int, err error) {\n\tif raceenabled {\n\t\traceReleaseMerge(unsafe.Pointer(&ioSync))\n\t}\n\tvar done uint32\n\te := WriteFile(fd, p, &done, nil)\n\tif e != nil {\n\t\treturn 0, e\n\t}\n\tif raceenabled && done > 0 {\n\t\traceReadRange(unsafe.Pointer(&p[0]), int(done))\n\t}\n\treturn int(done), nil\n}\n\nvar ioSync int64\n\nfunc Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) {\n\tvar w uint32\n\tswitch whence {\n\tcase 0:\n\t\tw = FILE_BEGIN\n\tcase 1:\n\t\tw = FILE_CURRENT\n\tcase 2:\n\t\tw = FILE_END\n\t}\n\thi := int32(offset >> 32)\n\tlo := int32(offset)\n\t// use GetFileType to check pipe, pipe can't do seek\n\tft, _ := GetFileType(fd)\n\tif ft == FILE_TYPE_PIPE {\n\t\treturn 0, syscall.EPIPE\n\t}\n\trlo, e := SetFilePointer(fd, lo, &hi, w)\n\tif e != nil {\n\t\treturn 0, e\n\t}\n\treturn int64(hi)<<32 + int64(rlo), nil\n}\n\nfunc Close(fd Handle) (err error) {\n\treturn CloseHandle(fd)\n}\n\nvar (\n\tStdin  = getStdHandle(STD_INPUT_HANDLE)\n\tStdout = getStdHandle(STD_OUTPUT_HANDLE)\n\tStderr = getStdHandle(STD_ERROR_HANDLE)\n)\n\nfunc getStdHandle(stdhandle uint32) (fd Handle) {\n\tr, _ := GetStdHandle(stdhandle)\n\tCloseOnExec(r)\n\treturn r\n}\n\nconst ImplementsGetwd = true\n\nfunc Getwd() (wd string, err error) {\n\tb := make([]uint16, 300)\n\tn, e := GetCurrentDirectory(uint32(len(b)), &b[0])\n\tif e != nil {\n\t\treturn \"\", e\n\t}\n\treturn string(utf16.Decode(b[0:n])), nil\n}\n\nfunc Chdir(path string) (err error) {\n\tpathp, err := UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn SetCurrentDirectory(pathp)\n}\n\nfunc Mkdir(path string, mode uint32) (err error) {\n\tpathp, err := UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn CreateDirectory(pathp, nil)\n}\n\nfunc Rmdir(path string) (err error) {\n\tpathp, err := UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn RemoveDirectory(pathp)\n}\n\nfunc Unlink(path string) (err error) {\n\tpathp, err := UTF16PtrFromString(path)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn DeleteFile(pathp)\n}\n\nfunc Rename(oldpath, newpath string) (err error) {\n\tfrom, err := UTF16PtrFromString(oldpath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tto, err := UTF16PtrFromString(newpath)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)\n}\n\nfunc ComputerName() (name string, err error) {\n\tvar n uint32 = MAX_COMPUTERNAME_LENGTH + 1\n\tb := make([]uint16, n)\n\te := GetComputerName(&b[0], &n)\n\tif e != nil {\n\t\treturn \"\", e\n\t}\n\treturn string(utf16.Decode(b[0:n])), nil\n}\n\nfunc Ftruncate(fd Handle, length int64) (err error) {\n\tcuroffset, e := Seek(fd, 0, 1)\n\tif e != nil {\n\t\treturn e\n\t}\n\tdefer Seek(fd, curoffset, 0)\n\t_, e = Seek(fd, length, 0)\n\tif e != nil {\n\t\treturn e\n\t}\n\te = SetEndOfFile(fd)\n\tif e != nil {\n\t\treturn e\n\t}\n\treturn nil\n}\n\nfunc Gettimeofday(tv *Timeval) (err error) {\n\tvar ft Filetime\n\tGetSystemTimeAsFileTime(&ft)\n\t*tv = NsecToTimeval(ft.Nanoseconds())\n\treturn nil\n}\n\nfunc Pipe(p []Handle) (err error) {\n\tif len(p) != 2 {\n\t\treturn syscall.EINVAL\n\t}\n\tvar r, w Handle\n\te := CreatePipe(&r, &w, makeInheritSa(), 0)\n\tif e != nil {\n\t\treturn e\n\t}\n\tp[0] = r\n\tp[1] = w\n\treturn nil\n}\n\nfunc Utimes(path string, tv []Timeval) (err error) {\n\tif len(tv) != 2 {\n\t\treturn syscall.EINVAL\n\t}\n\tpathp, e := UTF16PtrFromString(path)\n\tif e != nil {\n\t\treturn e\n\t}\n\th, e := CreateFile(pathp,\n\t\tFILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,\n\t\tOPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)\n\tif e != nil {\n\t\treturn e\n\t}\n\tdefer Close(h)\n\ta := NsecToFiletime(tv[0].Nanoseconds())\n\tw := NsecToFiletime(tv[1].Nanoseconds())\n\treturn SetFileTime(h, nil, &a, &w)\n}\n\nfunc UtimesNano(path string, ts []Timespec) (err error) {\n\tif len(ts) != 2 {\n\t\treturn syscall.EINVAL\n\t}\n\tpathp, e := UTF16PtrFromString(path)\n\tif e != nil {\n\t\treturn e\n\t}\n\th, e := CreateFile(pathp,\n\t\tFILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,\n\t\tOPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)\n\tif e != nil {\n\t\treturn e\n\t}\n\tdefer Close(h)\n\ta := NsecToFiletime(TimespecToNsec(ts[0]))\n\tw := NsecToFiletime(TimespecToNsec(ts[1]))\n\treturn SetFileTime(h, nil, &a, &w)\n}\n\nfunc Fsync(fd Handle) (err error) {\n\treturn FlushFileBuffers(fd)\n}\n\nfunc Chmod(path string, mode uint32) (err error) {\n\tif mode == 0 {\n\t\treturn syscall.EINVAL\n\t}\n\tp, e := UTF16PtrFromString(path)\n\tif e != nil {\n\t\treturn e\n\t}\n\tattrs, e := GetFileAttributes(p)\n\tif e != nil {\n\t\treturn e\n\t}\n\tif mode&S_IWRITE != 0 {\n\t\tattrs &^= FILE_ATTRIBUTE_READONLY\n\t} else {\n\t\tattrs |= FILE_ATTRIBUTE_READONLY\n\t}\n\treturn SetFileAttributes(p, attrs)\n}\n\nfunc LoadGetSystemTimePreciseAsFileTime() error {\n\treturn procGetSystemTimePreciseAsFileTime.Find()\n}\n\nfunc LoadCancelIoEx() error {\n\treturn procCancelIoEx.Find()\n}\n\nfunc LoadSetFileCompletionNotificationModes() error {\n\treturn procSetFileCompletionNotificationModes.Find()\n}\n\n// net api calls\n\nconst socket_error = uintptr(^uint32(0))\n\n//sys\tWSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup\n//sys\tWSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup\n//sys\tWSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl\n//sys\tsocket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket\n//sys\tSetsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt\n//sys\tGetsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt\n//sys\tbind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind\n//sys\tconnect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect\n//sys\tgetsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname\n//sys\tgetpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername\n//sys\tlisten(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen\n//sys\tshutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown\n//sys\tClosesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket\n//sys\tAcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx\n//sys\tGetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs\n//sys\tWSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv\n//sys\tWSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend\n//sys\tWSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32,  from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom\n//sys\tWSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32,  overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo\n//sys\tGetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname\n//sys\tGetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname\n//sys\tNtohs(netshort uint16) (u uint16) = ws2_32.ntohs\n//sys\tGetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname\n//sys\tDnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W\n//sys\tDnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree\n//sys\tDnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W\n//sys\tGetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW\n//sys\tFreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW\n//sys\tGetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry\n//sys\tGetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo\n//sys\tSetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes\n//sys\tWSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW\n//sys\tGetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses\n//sys\tGetACP() (acp uint32) = kernel32.GetACP\n//sys\tMultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar\n\n// For testing: clients can set this flag to force\n// creation of IPv6 sockets to return EAFNOSUPPORT.\nvar SocketDisableIPv6 bool\n\ntype RawSockaddrInet4 struct {\n\tFamily uint16\n\tPort   uint16\n\tAddr   [4]byte /* in_addr */\n\tZero   [8]uint8\n}\n\ntype RawSockaddrInet6 struct {\n\tFamily   uint16\n\tPort     uint16\n\tFlowinfo uint32\n\tAddr     [16]byte /* in6_addr */\n\tScope_id uint32\n}\n\ntype RawSockaddr struct {\n\tFamily uint16\n\tData   [14]int8\n}\n\ntype RawSockaddrAny struct {\n\tAddr RawSockaddr\n\tPad  [96]int8\n}\n\ntype Sockaddr interface {\n\tsockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs\n}\n\ntype SockaddrInet4 struct {\n\tPort int\n\tAddr [4]byte\n\traw  RawSockaddrInet4\n}\n\nfunc (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, syscall.EINVAL\n\t}\n\tsa.raw.Family = AF_INET\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil\n}\n\ntype SockaddrInet6 struct {\n\tPort   int\n\tZoneId uint32\n\tAddr   [16]byte\n\traw    RawSockaddrInet6\n}\n\nfunc (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) {\n\tif sa.Port < 0 || sa.Port > 0xFFFF {\n\t\treturn nil, 0, syscall.EINVAL\n\t}\n\tsa.raw.Family = AF_INET6\n\tp := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))\n\tp[0] = byte(sa.Port >> 8)\n\tp[1] = byte(sa.Port)\n\tsa.raw.Scope_id = sa.ZoneId\n\tfor i := 0; i < len(sa.Addr); i++ {\n\t\tsa.raw.Addr[i] = sa.Addr[i]\n\t}\n\treturn unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil\n}\n\ntype SockaddrUnix struct {\n\tName string\n}\n\nfunc (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) {\n\t// TODO(brainman): implement SockaddrUnix.sockaddr()\n\treturn nil, 0, syscall.EWINDOWS\n}\n\nfunc (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {\n\tswitch rsa.Addr.Family {\n\tcase AF_UNIX:\n\t\treturn nil, syscall.EWINDOWS\n\n\tcase AF_INET:\n\t\tpp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet4)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\n\tcase AF_INET6:\n\t\tpp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))\n\t\tsa := new(SockaddrInet6)\n\t\tp := (*[2]byte)(unsafe.Pointer(&pp.Port))\n\t\tsa.Port = int(p[0])<<8 + int(p[1])\n\t\tsa.ZoneId = pp.Scope_id\n\t\tfor i := 0; i < len(sa.Addr); i++ {\n\t\t\tsa.Addr[i] = pp.Addr[i]\n\t\t}\n\t\treturn sa, nil\n\t}\n\treturn nil, syscall.EAFNOSUPPORT\n}\n\nfunc Socket(domain, typ, proto int) (fd Handle, err error) {\n\tif domain == AF_INET6 && SocketDisableIPv6 {\n\t\treturn InvalidHandle, syscall.EAFNOSUPPORT\n\t}\n\treturn socket(int32(domain), int32(typ), int32(proto))\n}\n\nfunc SetsockoptInt(fd Handle, level, opt int, value int) (err error) {\n\tv := int32(value)\n\treturn Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v)))\n}\n\nfunc Bind(fd Handle, sa Sockaddr) (err error) {\n\tptr, n, err := sa.sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn bind(fd, ptr, n)\n}\n\nfunc Connect(fd Handle, sa Sockaddr) (err error) {\n\tptr, n, err := sa.sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn connect(fd, ptr, n)\n}\n\nfunc Getsockname(fd Handle) (sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tl := int32(unsafe.Sizeof(rsa))\n\tif err = getsockname(fd, &rsa, &l); err != nil {\n\t\treturn\n\t}\n\treturn rsa.Sockaddr()\n}\n\nfunc Getpeername(fd Handle) (sa Sockaddr, err error) {\n\tvar rsa RawSockaddrAny\n\tl := int32(unsafe.Sizeof(rsa))\n\tif err = getpeername(fd, &rsa, &l); err != nil {\n\t\treturn\n\t}\n\treturn rsa.Sockaddr()\n}\n\nfunc Listen(s Handle, n int) (err error) {\n\treturn listen(s, int32(n))\n}\n\nfunc Shutdown(fd Handle, how int) (err error) {\n\treturn shutdown(fd, int32(how))\n}\n\nfunc WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {\n\trsa, l, err := to.sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)\n}\n\nfunc LoadGetAddrInfo() error {\n\treturn procGetAddrInfoW.Find()\n}\n\nvar connectExFunc struct {\n\tonce sync.Once\n\taddr uintptr\n\terr  error\n}\n\nfunc LoadConnectEx() error {\n\tconnectExFunc.once.Do(func() {\n\t\tvar s Handle\n\t\ts, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)\n\t\tif connectExFunc.err != nil {\n\t\t\treturn\n\t\t}\n\t\tdefer CloseHandle(s)\n\t\tvar n uint32\n\t\tconnectExFunc.err = WSAIoctl(s,\n\t\t\tSIO_GET_EXTENSION_FUNCTION_POINTER,\n\t\t\t(*byte)(unsafe.Pointer(&WSAID_CONNECTEX)),\n\t\t\tuint32(unsafe.Sizeof(WSAID_CONNECTEX)),\n\t\t\t(*byte)(unsafe.Pointer(&connectExFunc.addr)),\n\t\t\tuint32(unsafe.Sizeof(connectExFunc.addr)),\n\t\t\t&n, nil, 0)\n\t})\n\treturn connectExFunc.err\n}\n\nfunc connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error {\n\terr := LoadConnectEx()\n\tif err != nil {\n\t\treturn errorspkg.New(\"failed to find ConnectEx: \" + err.Error())\n\t}\n\tptr, n, err := sa.sockaddr()\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)\n}\n\nvar sendRecvMsgFunc struct {\n\tonce     sync.Once\n\tsendAddr uintptr\n\trecvAddr uintptr\n\terr      error\n}\n\nfunc loadWSASendRecvMsg() error {\n\tsendRecvMsgFunc.once.Do(func() {\n\t\tvar s Handle\n\t\ts, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)\n\t\tif sendRecvMsgFunc.err != nil {\n\t\t\treturn\n\t\t}\n\t\tdefer CloseHandle(s)\n\t\tvar n uint32\n\t\tsendRecvMsgFunc.err = WSAIoctl(s,\n\t\t\tSIO_GET_EXTENSION_FUNCTION_POINTER,\n\t\t\t(*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)),\n\t\t\tuint32(unsafe.Sizeof(WSAID_WSARECVMSG)),\n\t\t\t(*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)),\n\t\t\tuint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)),\n\t\t\t&n, nil, 0)\n\t\tif sendRecvMsgFunc.err != nil {\n\t\t\treturn\n\t\t}\n\t\tsendRecvMsgFunc.err = WSAIoctl(s,\n\t\t\tSIO_GET_EXTENSION_FUNCTION_POINTER,\n\t\t\t(*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)),\n\t\t\tuint32(unsafe.Sizeof(WSAID_WSASENDMSG)),\n\t\t\t(*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)),\n\t\t\tuint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)),\n\t\t\t&n, nil, 0)\n\t})\n\treturn sendRecvMsgFunc.err\n}\n\nfunc WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error {\n\terr := loadWSASendRecvMsg()\n\tif err != nil {\n\t\treturn err\n\t}\n\tr1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn err\n}\n\nfunc WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error {\n\terr := loadWSASendRecvMsg()\n\tif err != nil {\n\t\treturn err\n\t}\n\tr1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn err\n}\n\n// Invented structures to support what package os expects.\ntype Rusage struct {\n\tCreationTime Filetime\n\tExitTime     Filetime\n\tKernelTime   Filetime\n\tUserTime     Filetime\n}\n\ntype WaitStatus struct {\n\tExitCode uint32\n}\n\nfunc (w WaitStatus) Exited() bool { return true }\n\nfunc (w WaitStatus) ExitStatus() int { return int(w.ExitCode) }\n\nfunc (w WaitStatus) Signal() Signal { return -1 }\n\nfunc (w WaitStatus) CoreDump() bool { return false }\n\nfunc (w WaitStatus) Stopped() bool { return false }\n\nfunc (w WaitStatus) Continued() bool { return false }\n\nfunc (w WaitStatus) StopSignal() Signal { return -1 }\n\nfunc (w WaitStatus) Signaled() bool { return false }\n\nfunc (w WaitStatus) TrapCause() int { return -1 }\n\n// Timespec is an invented structure on Windows, but here for\n// consistency with the corresponding package for other operating systems.\ntype Timespec struct {\n\tSec  int64\n\tNsec int64\n}\n\nfunc TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }\n\nfunc NsecToTimespec(nsec int64) (ts Timespec) {\n\tts.Sec = nsec / 1e9\n\tts.Nsec = nsec % 1e9\n\treturn\n}\n\n// TODO(brainman): fix all needed for net\n\nfunc Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS }\nfunc Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) {\n\treturn 0, nil, syscall.EWINDOWS\n}\nfunc Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error)       { return syscall.EWINDOWS }\nfunc SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS }\n\n// The Linger struct is wrong but we only noticed after Go 1.\n// sysLinger is the real system call structure.\n\n// BUG(brainman): The definition of Linger is not appropriate for direct use\n// with Setsockopt and Getsockopt.\n// Use SetsockoptLinger instead.\n\ntype Linger struct {\n\tOnoff  int32\n\tLinger int32\n}\n\ntype sysLinger struct {\n\tOnoff  uint16\n\tLinger uint16\n}\n\ntype IPMreq struct {\n\tMultiaddr [4]byte /* in_addr */\n\tInterface [4]byte /* in_addr */\n}\n\ntype IPv6Mreq struct {\n\tMultiaddr [16]byte /* in6_addr */\n\tInterface uint32\n}\n\nfunc GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS }\n\nfunc SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) {\n\tsys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)}\n\treturn Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys)))\n}\n\nfunc SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) {\n\treturn Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4)\n}\nfunc SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) {\n\treturn Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))\n}\nfunc SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) {\n\treturn syscall.EWINDOWS\n}\n\nfunc Getpid() (pid int) { return int(getCurrentProcessId()) }\n\nfunc FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) {\n\t// NOTE(rsc): The Win32finddata struct is wrong for the system call:\n\t// the two paths are each one uint16 short. Use the correct struct,\n\t// a win32finddata1, and then copy the results out.\n\t// There is no loss of expressivity here, because the final\n\t// uint16, if it is used, is supposed to be a NUL, and Go doesn't need that.\n\t// For Go 1.1, we might avoid the allocation of win32finddata1 here\n\t// by adding a final Bug [2]uint16 field to the struct and then\n\t// adjusting the fields in the result directly.\n\tvar data1 win32finddata1\n\thandle, err = findFirstFile1(name, &data1)\n\tif err == nil {\n\t\tcopyFindData(data, &data1)\n\t}\n\treturn\n}\n\nfunc FindNextFile(handle Handle, data *Win32finddata) (err error) {\n\tvar data1 win32finddata1\n\terr = findNextFile1(handle, &data1)\n\tif err == nil {\n\t\tcopyFindData(data, &data1)\n\t}\n\treturn\n}\n\nfunc getProcessEntry(pid int) (*ProcessEntry32, error) {\n\tsnapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer CloseHandle(snapshot)\n\tvar procEntry ProcessEntry32\n\tprocEntry.Size = uint32(unsafe.Sizeof(procEntry))\n\tif err = Process32First(snapshot, &procEntry); err != nil {\n\t\treturn nil, err\n\t}\n\tfor {\n\t\tif procEntry.ProcessID == uint32(pid) {\n\t\t\treturn &procEntry, nil\n\t\t}\n\t\terr = Process32Next(snapshot, &procEntry)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n}\n\nfunc Getppid() (ppid int) {\n\tpe, err := getProcessEntry(Getpid())\n\tif err != nil {\n\t\treturn -1\n\t}\n\treturn int(pe.ParentProcessID)\n}\n\n// TODO(brainman): fix all needed for os\nfunc Fchdir(fd Handle) (err error)             { return syscall.EWINDOWS }\nfunc Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS }\nfunc Symlink(path, link string) (err error)    { return syscall.EWINDOWS }\n\nfunc Fchmod(fd Handle, mode uint32) (err error)        { return syscall.EWINDOWS }\nfunc Chown(path string, uid int, gid int) (err error)  { return syscall.EWINDOWS }\nfunc Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }\nfunc Fchown(fd Handle, uid int, gid int) (err error)   { return syscall.EWINDOWS }\n\nfunc Getuid() (uid int)                  { return -1 }\nfunc Geteuid() (euid int)                { return -1 }\nfunc Getgid() (gid int)                  { return -1 }\nfunc Getegid() (egid int)                { return -1 }\nfunc Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS }\n\ntype Signal int\n\nfunc (s Signal) Signal() {}\n\nfunc (s Signal) String() string {\n\tif 0 <= s && int(s) < len(signals) {\n\t\tstr := signals[s]\n\t\tif str != \"\" {\n\t\t\treturn str\n\t\t}\n\t}\n\treturn \"signal \" + itoa(int(s))\n}\n\nfunc LoadCreateSymbolicLink() error {\n\treturn procCreateSymbolicLinkW.Find()\n}\n\n// Readlink returns the destination of the named symbolic link.\nfunc Readlink(path string, buf []byte) (n int, err error) {\n\tfd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING,\n\t\tFILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\tdefer CloseHandle(fd)\n\n\trdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE)\n\tvar bytesReturned uint32\n\terr = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\trdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0]))\n\tvar s string\n\tswitch rdb.ReparseTag {\n\tcase IO_REPARSE_TAG_SYMLINK:\n\t\tdata := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))\n\t\tp := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))\n\t\ts = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])\n\tcase IO_REPARSE_TAG_MOUNT_POINT:\n\t\tdata := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))\n\t\tp := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))\n\t\ts = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])\n\tdefault:\n\t\t// the path is not a symlink or junction but another type of reparse\n\t\t// point\n\t\treturn -1, syscall.ENOENT\n\t}\n\tn = copy(buf, []byte(s))\n\n\treturn n, nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/types_windows.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage windows\n\nimport \"syscall\"\n\nconst (\n\t// Windows errors.\n\tERROR_FILE_NOT_FOUND         syscall.Errno = 2\n\tERROR_PATH_NOT_FOUND         syscall.Errno = 3\n\tERROR_ACCESS_DENIED          syscall.Errno = 5\n\tERROR_NO_MORE_FILES          syscall.Errno = 18\n\tERROR_HANDLE_EOF             syscall.Errno = 38\n\tERROR_NETNAME_DELETED        syscall.Errno = 64\n\tERROR_FILE_EXISTS            syscall.Errno = 80\n\tERROR_BROKEN_PIPE            syscall.Errno = 109\n\tERROR_BUFFER_OVERFLOW        syscall.Errno = 111\n\tERROR_INSUFFICIENT_BUFFER    syscall.Errno = 122\n\tERROR_MOD_NOT_FOUND          syscall.Errno = 126\n\tERROR_PROC_NOT_FOUND         syscall.Errno = 127\n\tERROR_ALREADY_EXISTS         syscall.Errno = 183\n\tERROR_ENVVAR_NOT_FOUND       syscall.Errno = 203\n\tERROR_MORE_DATA              syscall.Errno = 234\n\tERROR_OPERATION_ABORTED      syscall.Errno = 995\n\tERROR_IO_PENDING             syscall.Errno = 997\n\tERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066\n\tERROR_NOT_FOUND              syscall.Errno = 1168\n\tERROR_PRIVILEGE_NOT_HELD     syscall.Errno = 1314\n\tWSAEACCES                    syscall.Errno = 10013\n\tWSAEMSGSIZE                  syscall.Errno = 10040\n\tWSAECONNRESET                syscall.Errno = 10054\n)\n\nconst (\n\t// Invented values to support what package os expects.\n\tO_RDONLY   = 0x00000\n\tO_WRONLY   = 0x00001\n\tO_RDWR     = 0x00002\n\tO_CREAT    = 0x00040\n\tO_EXCL     = 0x00080\n\tO_NOCTTY   = 0x00100\n\tO_TRUNC    = 0x00200\n\tO_NONBLOCK = 0x00800\n\tO_APPEND   = 0x00400\n\tO_SYNC     = 0x01000\n\tO_ASYNC    = 0x02000\n\tO_CLOEXEC  = 0x80000\n)\n\nconst (\n\t// More invented values for signals\n\tSIGHUP  = Signal(0x1)\n\tSIGINT  = Signal(0x2)\n\tSIGQUIT = Signal(0x3)\n\tSIGILL  = Signal(0x4)\n\tSIGTRAP = Signal(0x5)\n\tSIGABRT = Signal(0x6)\n\tSIGBUS  = Signal(0x7)\n\tSIGFPE  = Signal(0x8)\n\tSIGKILL = Signal(0x9)\n\tSIGSEGV = Signal(0xb)\n\tSIGPIPE = Signal(0xd)\n\tSIGALRM = Signal(0xe)\n\tSIGTERM = Signal(0xf)\n)\n\nvar signals = [...]string{\n\t1:  \"hangup\",\n\t2:  \"interrupt\",\n\t3:  \"quit\",\n\t4:  \"illegal instruction\",\n\t5:  \"trace/breakpoint trap\",\n\t6:  \"aborted\",\n\t7:  \"bus error\",\n\t8:  \"floating point exception\",\n\t9:  \"killed\",\n\t10: \"user defined signal 1\",\n\t11: \"segmentation fault\",\n\t12: \"user defined signal 2\",\n\t13: \"broken pipe\",\n\t14: \"alarm clock\",\n\t15: \"terminated\",\n}\n\nconst (\n\tGENERIC_READ    = 0x80000000\n\tGENERIC_WRITE   = 0x40000000\n\tGENERIC_EXECUTE = 0x20000000\n\tGENERIC_ALL     = 0x10000000\n\n\tFILE_LIST_DIRECTORY   = 0x00000001\n\tFILE_APPEND_DATA      = 0x00000004\n\tFILE_WRITE_ATTRIBUTES = 0x00000100\n\n\tFILE_SHARE_READ              = 0x00000001\n\tFILE_SHARE_WRITE             = 0x00000002\n\tFILE_SHARE_DELETE            = 0x00000004\n\tFILE_ATTRIBUTE_READONLY      = 0x00000001\n\tFILE_ATTRIBUTE_HIDDEN        = 0x00000002\n\tFILE_ATTRIBUTE_SYSTEM        = 0x00000004\n\tFILE_ATTRIBUTE_DIRECTORY     = 0x00000010\n\tFILE_ATTRIBUTE_ARCHIVE       = 0x00000020\n\tFILE_ATTRIBUTE_NORMAL        = 0x00000080\n\tFILE_ATTRIBUTE_REPARSE_POINT = 0x00000400\n\n\tINVALID_FILE_ATTRIBUTES = 0xffffffff\n\n\tCREATE_NEW        = 1\n\tCREATE_ALWAYS     = 2\n\tOPEN_EXISTING     = 3\n\tOPEN_ALWAYS       = 4\n\tTRUNCATE_EXISTING = 5\n\n\tFILE_FLAG_OPEN_REPARSE_POINT = 0x00200000\n\tFILE_FLAG_BACKUP_SEMANTICS   = 0x02000000\n\tFILE_FLAG_OVERLAPPED         = 0x40000000\n\n\tHANDLE_FLAG_INHERIT    = 0x00000001\n\tSTARTF_USESTDHANDLES   = 0x00000100\n\tSTARTF_USESHOWWINDOW   = 0x00000001\n\tDUPLICATE_CLOSE_SOURCE = 0x00000001\n\tDUPLICATE_SAME_ACCESS  = 0x00000002\n\n\tSTD_INPUT_HANDLE  = -10 & (1<<32 - 1)\n\tSTD_OUTPUT_HANDLE = -11 & (1<<32 - 1)\n\tSTD_ERROR_HANDLE  = -12 & (1<<32 - 1)\n\n\tFILE_BEGIN   = 0\n\tFILE_CURRENT = 1\n\tFILE_END     = 2\n\n\tLANG_ENGLISH       = 0x09\n\tSUBLANG_ENGLISH_US = 0x01\n\n\tFORMAT_MESSAGE_ALLOCATE_BUFFER = 256\n\tFORMAT_MESSAGE_IGNORE_INSERTS  = 512\n\tFORMAT_MESSAGE_FROM_STRING     = 1024\n\tFORMAT_MESSAGE_FROM_HMODULE    = 2048\n\tFORMAT_MESSAGE_FROM_SYSTEM     = 4096\n\tFORMAT_MESSAGE_ARGUMENT_ARRAY  = 8192\n\tFORMAT_MESSAGE_MAX_WIDTH_MASK  = 255\n\n\tMAX_PATH      = 260\n\tMAX_LONG_PATH = 32768\n\n\tMAX_COMPUTERNAME_LENGTH = 15\n\n\tTIME_ZONE_ID_UNKNOWN  = 0\n\tTIME_ZONE_ID_STANDARD = 1\n\n\tTIME_ZONE_ID_DAYLIGHT = 2\n\tIGNORE                = 0\n\tINFINITE              = 0xffffffff\n\n\tWAIT_TIMEOUT   = 258\n\tWAIT_ABANDONED = 0x00000080\n\tWAIT_OBJECT_0  = 0x00000000\n\tWAIT_FAILED    = 0xFFFFFFFF\n\n\tCREATE_NEW_PROCESS_GROUP   = 0x00000200\n\tCREATE_UNICODE_ENVIRONMENT = 0x00000400\n\n\tPROCESS_TERMINATE         = 1\n\tPROCESS_QUERY_INFORMATION = 0x00000400\n\tSYNCHRONIZE               = 0x00100000\n\n\tFILE_MAP_COPY    = 0x01\n\tFILE_MAP_WRITE   = 0x02\n\tFILE_MAP_READ    = 0x04\n\tFILE_MAP_EXECUTE = 0x20\n\n\tCTRL_C_EVENT     = 0\n\tCTRL_BREAK_EVENT = 1\n\n\t// Windows reserves errors >= 1<<29 for application use.\n\tAPPLICATION_ERROR = 1 << 29\n)\n\nconst (\n\t// flags for CreateToolhelp32Snapshot\n\tTH32CS_SNAPHEAPLIST = 0x01\n\tTH32CS_SNAPPROCESS  = 0x02\n\tTH32CS_SNAPTHREAD   = 0x04\n\tTH32CS_SNAPMODULE   = 0x08\n\tTH32CS_SNAPMODULE32 = 0x10\n\tTH32CS_SNAPALL      = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD\n\tTH32CS_INHERIT      = 0x80000000\n)\n\nconst (\n\t// filters for ReadDirectoryChangesW\n\tFILE_NOTIFY_CHANGE_FILE_NAME   = 0x001\n\tFILE_NOTIFY_CHANGE_DIR_NAME    = 0x002\n\tFILE_NOTIFY_CHANGE_ATTRIBUTES  = 0x004\n\tFILE_NOTIFY_CHANGE_SIZE        = 0x008\n\tFILE_NOTIFY_CHANGE_LAST_WRITE  = 0x010\n\tFILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020\n\tFILE_NOTIFY_CHANGE_CREATION    = 0x040\n\tFILE_NOTIFY_CHANGE_SECURITY    = 0x100\n)\n\nconst (\n\t// do not reorder\n\tFILE_ACTION_ADDED = iota + 1\n\tFILE_ACTION_REMOVED\n\tFILE_ACTION_MODIFIED\n\tFILE_ACTION_RENAMED_OLD_NAME\n\tFILE_ACTION_RENAMED_NEW_NAME\n)\n\nconst (\n\t// wincrypt.h\n\tPROV_RSA_FULL                    = 1\n\tPROV_RSA_SIG                     = 2\n\tPROV_DSS                         = 3\n\tPROV_FORTEZZA                    = 4\n\tPROV_MS_EXCHANGE                 = 5\n\tPROV_SSL                         = 6\n\tPROV_RSA_SCHANNEL                = 12\n\tPROV_DSS_DH                      = 13\n\tPROV_EC_ECDSA_SIG                = 14\n\tPROV_EC_ECNRA_SIG                = 15\n\tPROV_EC_ECDSA_FULL               = 16\n\tPROV_EC_ECNRA_FULL               = 17\n\tPROV_DH_SCHANNEL                 = 18\n\tPROV_SPYRUS_LYNKS                = 20\n\tPROV_RNG                         = 21\n\tPROV_INTEL_SEC                   = 22\n\tPROV_REPLACE_OWF                 = 23\n\tPROV_RSA_AES                     = 24\n\tCRYPT_VERIFYCONTEXT              = 0xF0000000\n\tCRYPT_NEWKEYSET                  = 0x00000008\n\tCRYPT_DELETEKEYSET               = 0x00000010\n\tCRYPT_MACHINE_KEYSET             = 0x00000020\n\tCRYPT_SILENT                     = 0x00000040\n\tCRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080\n\n\tUSAGE_MATCH_TYPE_AND = 0\n\tUSAGE_MATCH_TYPE_OR  = 1\n\n\tX509_ASN_ENCODING   = 0x00000001\n\tPKCS_7_ASN_ENCODING = 0x00010000\n\n\tCERT_STORE_PROV_MEMORY = 2\n\n\tCERT_STORE_ADD_ALWAYS = 4\n\n\tCERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004\n\n\tCERT_TRUST_NO_ERROR                          = 0x00000000\n\tCERT_TRUST_IS_NOT_TIME_VALID                 = 0x00000001\n\tCERT_TRUST_IS_REVOKED                        = 0x00000004\n\tCERT_TRUST_IS_NOT_SIGNATURE_VALID            = 0x00000008\n\tCERT_TRUST_IS_NOT_VALID_FOR_USAGE            = 0x00000010\n\tCERT_TRUST_IS_UNTRUSTED_ROOT                 = 0x00000020\n\tCERT_TRUST_REVOCATION_STATUS_UNKNOWN         = 0x00000040\n\tCERT_TRUST_IS_CYCLIC                         = 0x00000080\n\tCERT_TRUST_INVALID_EXTENSION                 = 0x00000100\n\tCERT_TRUST_INVALID_POLICY_CONSTRAINTS        = 0x00000200\n\tCERT_TRUST_INVALID_BASIC_CONSTRAINTS         = 0x00000400\n\tCERT_TRUST_INVALID_NAME_CONSTRAINTS          = 0x00000800\n\tCERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000\n\tCERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT   = 0x00002000\n\tCERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000\n\tCERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT      = 0x00008000\n\tCERT_TRUST_IS_OFFLINE_REVOCATION             = 0x01000000\n\tCERT_TRUST_NO_ISSUANCE_CHAIN_POLICY          = 0x02000000\n\tCERT_TRUST_IS_EXPLICIT_DISTRUST              = 0x04000000\n\tCERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT    = 0x08000000\n\n\tCERT_CHAIN_POLICY_BASE              = 1\n\tCERT_CHAIN_POLICY_AUTHENTICODE      = 2\n\tCERT_CHAIN_POLICY_AUTHENTICODE_TS   = 3\n\tCERT_CHAIN_POLICY_SSL               = 4\n\tCERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5\n\tCERT_CHAIN_POLICY_NT_AUTH           = 6\n\tCERT_CHAIN_POLICY_MICROSOFT_ROOT    = 7\n\tCERT_CHAIN_POLICY_EV                = 8\n\n\tCERT_E_EXPIRED       = 0x800B0101\n\tCERT_E_ROLE          = 0x800B0103\n\tCERT_E_PURPOSE       = 0x800B0106\n\tCERT_E_UNTRUSTEDROOT = 0x800B0109\n\tCERT_E_CN_NO_MATCH   = 0x800B010F\n\n\tAUTHTYPE_CLIENT = 1\n\tAUTHTYPE_SERVER = 2\n)\n\nvar (\n\tOID_PKIX_KP_SERVER_AUTH = []byte(\"1.3.6.1.5.5.7.3.1\\x00\")\n\tOID_SERVER_GATED_CRYPTO = []byte(\"1.3.6.1.4.1.311.10.3.3\\x00\")\n\tOID_SGC_NETSCAPE        = []byte(\"2.16.840.1.113730.4.1\\x00\")\n)\n\n// Invented values to support what package os expects.\ntype Timeval struct {\n\tSec  int32\n\tUsec int32\n}\n\nfunc (tv *Timeval) Nanoseconds() int64 {\n\treturn (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3\n}\n\nfunc NsecToTimeval(nsec int64) (tv Timeval) {\n\ttv.Sec = int32(nsec / 1e9)\n\ttv.Usec = int32(nsec % 1e9 / 1e3)\n\treturn\n}\n\ntype SecurityAttributes struct {\n\tLength             uint32\n\tSecurityDescriptor uintptr\n\tInheritHandle      uint32\n}\n\ntype Overlapped struct {\n\tInternal     uintptr\n\tInternalHigh uintptr\n\tOffset       uint32\n\tOffsetHigh   uint32\n\tHEvent       Handle\n}\n\ntype FileNotifyInformation struct {\n\tNextEntryOffset uint32\n\tAction          uint32\n\tFileNameLength  uint32\n\tFileName        uint16\n}\n\ntype Filetime struct {\n\tLowDateTime  uint32\n\tHighDateTime uint32\n}\n\n// Nanoseconds returns Filetime ft in nanoseconds\n// since Epoch (00:00:00 UTC, January 1, 1970).\nfunc (ft *Filetime) Nanoseconds() int64 {\n\t// 100-nanosecond intervals since January 1, 1601\n\tnsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)\n\t// change starting time to the Epoch (00:00:00 UTC, January 1, 1970)\n\tnsec -= 116444736000000000\n\t// convert into nanoseconds\n\tnsec *= 100\n\treturn nsec\n}\n\nfunc NsecToFiletime(nsec int64) (ft Filetime) {\n\t// convert into 100-nanosecond\n\tnsec /= 100\n\t// change starting time to January 1, 1601\n\tnsec += 116444736000000000\n\t// split into high / low\n\tft.LowDateTime = uint32(nsec & 0xffffffff)\n\tft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)\n\treturn ft\n}\n\ntype Win32finddata struct {\n\tFileAttributes    uint32\n\tCreationTime      Filetime\n\tLastAccessTime    Filetime\n\tLastWriteTime     Filetime\n\tFileSizeHigh      uint32\n\tFileSizeLow       uint32\n\tReserved0         uint32\n\tReserved1         uint32\n\tFileName          [MAX_PATH - 1]uint16\n\tAlternateFileName [13]uint16\n}\n\n// This is the actual system call structure.\n// Win32finddata is what we committed to in Go 1.\ntype win32finddata1 struct {\n\tFileAttributes    uint32\n\tCreationTime      Filetime\n\tLastAccessTime    Filetime\n\tLastWriteTime     Filetime\n\tFileSizeHigh      uint32\n\tFileSizeLow       uint32\n\tReserved0         uint32\n\tReserved1         uint32\n\tFileName          [MAX_PATH]uint16\n\tAlternateFileName [14]uint16\n}\n\nfunc copyFindData(dst *Win32finddata, src *win32finddata1) {\n\tdst.FileAttributes = src.FileAttributes\n\tdst.CreationTime = src.CreationTime\n\tdst.LastAccessTime = src.LastAccessTime\n\tdst.LastWriteTime = src.LastWriteTime\n\tdst.FileSizeHigh = src.FileSizeHigh\n\tdst.FileSizeLow = src.FileSizeLow\n\tdst.Reserved0 = src.Reserved0\n\tdst.Reserved1 = src.Reserved1\n\n\t// The src is 1 element bigger than dst, but it must be NUL.\n\tcopy(dst.FileName[:], src.FileName[:])\n\tcopy(dst.AlternateFileName[:], src.AlternateFileName[:])\n}\n\ntype ByHandleFileInformation struct {\n\tFileAttributes     uint32\n\tCreationTime       Filetime\n\tLastAccessTime     Filetime\n\tLastWriteTime      Filetime\n\tVolumeSerialNumber uint32\n\tFileSizeHigh       uint32\n\tFileSizeLow        uint32\n\tNumberOfLinks      uint32\n\tFileIndexHigh      uint32\n\tFileIndexLow       uint32\n}\n\nconst (\n\tGetFileExInfoStandard = 0\n\tGetFileExMaxInfoLevel = 1\n)\n\ntype Win32FileAttributeData struct {\n\tFileAttributes uint32\n\tCreationTime   Filetime\n\tLastAccessTime Filetime\n\tLastWriteTime  Filetime\n\tFileSizeHigh   uint32\n\tFileSizeLow    uint32\n}\n\n// ShowWindow constants\nconst (\n\t// winuser.h\n\tSW_HIDE            = 0\n\tSW_NORMAL          = 1\n\tSW_SHOWNORMAL      = 1\n\tSW_SHOWMINIMIZED   = 2\n\tSW_SHOWMAXIMIZED   = 3\n\tSW_MAXIMIZE        = 3\n\tSW_SHOWNOACTIVATE  = 4\n\tSW_SHOW            = 5\n\tSW_MINIMIZE        = 6\n\tSW_SHOWMINNOACTIVE = 7\n\tSW_SHOWNA          = 8\n\tSW_RESTORE         = 9\n\tSW_SHOWDEFAULT     = 10\n\tSW_FORCEMINIMIZE   = 11\n)\n\ntype StartupInfo struct {\n\tCb            uint32\n\t_             *uint16\n\tDesktop       *uint16\n\tTitle         *uint16\n\tX             uint32\n\tY             uint32\n\tXSize         uint32\n\tYSize         uint32\n\tXCountChars   uint32\n\tYCountChars   uint32\n\tFillAttribute uint32\n\tFlags         uint32\n\tShowWindow    uint16\n\t_             uint16\n\t_             *byte\n\tStdInput      Handle\n\tStdOutput     Handle\n\tStdErr        Handle\n}\n\ntype ProcessInformation struct {\n\tProcess   Handle\n\tThread    Handle\n\tProcessId uint32\n\tThreadId  uint32\n}\n\ntype ProcessEntry32 struct {\n\tSize            uint32\n\tUsage           uint32\n\tProcessID       uint32\n\tDefaultHeapID   uintptr\n\tModuleID        uint32\n\tThreads         uint32\n\tParentProcessID uint32\n\tPriClassBase    int32\n\tFlags           uint32\n\tExeFile         [MAX_PATH]uint16\n}\n\ntype Systemtime struct {\n\tYear         uint16\n\tMonth        uint16\n\tDayOfWeek    uint16\n\tDay          uint16\n\tHour         uint16\n\tMinute       uint16\n\tSecond       uint16\n\tMilliseconds uint16\n}\n\ntype Timezoneinformation struct {\n\tBias         int32\n\tStandardName [32]uint16\n\tStandardDate Systemtime\n\tStandardBias int32\n\tDaylightName [32]uint16\n\tDaylightDate Systemtime\n\tDaylightBias int32\n}\n\n// Socket related.\n\nconst (\n\tAF_UNSPEC  = 0\n\tAF_UNIX    = 1\n\tAF_INET    = 2\n\tAF_INET6   = 23\n\tAF_NETBIOS = 17\n\n\tSOCK_STREAM    = 1\n\tSOCK_DGRAM     = 2\n\tSOCK_RAW       = 3\n\tSOCK_SEQPACKET = 5\n\n\tIPPROTO_IP   = 0\n\tIPPROTO_IPV6 = 0x29\n\tIPPROTO_TCP  = 6\n\tIPPROTO_UDP  = 17\n\n\tSOL_SOCKET                = 0xffff\n\tSO_REUSEADDR              = 4\n\tSO_KEEPALIVE              = 8\n\tSO_DONTROUTE              = 16\n\tSO_BROADCAST              = 32\n\tSO_LINGER                 = 128\n\tSO_RCVBUF                 = 0x1002\n\tSO_SNDBUF                 = 0x1001\n\tSO_UPDATE_ACCEPT_CONTEXT  = 0x700b\n\tSO_UPDATE_CONNECT_CONTEXT = 0x7010\n\n\tIOC_OUT                            = 0x40000000\n\tIOC_IN                             = 0x80000000\n\tIOC_VENDOR                         = 0x18000000\n\tIOC_INOUT                          = IOC_IN | IOC_OUT\n\tIOC_WS2                            = 0x08000000\n\tSIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6\n\tSIO_KEEPALIVE_VALS                 = IOC_IN | IOC_VENDOR | 4\n\tSIO_UDP_CONNRESET                  = IOC_IN | IOC_VENDOR | 12\n\n\t// cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460\n\n\tIP_TOS             = 0x3\n\tIP_TTL             = 0x4\n\tIP_MULTICAST_IF    = 0x9\n\tIP_MULTICAST_TTL   = 0xa\n\tIP_MULTICAST_LOOP  = 0xb\n\tIP_ADD_MEMBERSHIP  = 0xc\n\tIP_DROP_MEMBERSHIP = 0xd\n\n\tIPV6_V6ONLY         = 0x1b\n\tIPV6_UNICAST_HOPS   = 0x4\n\tIPV6_MULTICAST_IF   = 0x9\n\tIPV6_MULTICAST_HOPS = 0xa\n\tIPV6_MULTICAST_LOOP = 0xb\n\tIPV6_JOIN_GROUP     = 0xc\n\tIPV6_LEAVE_GROUP    = 0xd\n\n\tMSG_OOB       = 0x1\n\tMSG_PEEK      = 0x2\n\tMSG_DONTROUTE = 0x4\n\tMSG_WAITALL   = 0x8\n\n\tMSG_TRUNC  = 0x0100\n\tMSG_CTRUNC = 0x0200\n\tMSG_BCAST  = 0x0400\n\tMSG_MCAST  = 0x0800\n\n\tSOMAXCONN = 0x7fffffff\n\n\tTCP_NODELAY = 1\n\n\tSHUT_RD   = 0\n\tSHUT_WR   = 1\n\tSHUT_RDWR = 2\n\n\tWSADESCRIPTION_LEN = 256\n\tWSASYS_STATUS_LEN  = 128\n)\n\ntype WSABuf struct {\n\tLen uint32\n\tBuf *byte\n}\n\ntype WSAMsg struct {\n\tName        *syscall.RawSockaddrAny\n\tNamelen     int32\n\tBuffers     *WSABuf\n\tBufferCount uint32\n\tControl     WSABuf\n\tFlags       uint32\n}\n\n// Invented values to support what package os expects.\nconst (\n\tS_IFMT   = 0x1f000\n\tS_IFIFO  = 0x1000\n\tS_IFCHR  = 0x2000\n\tS_IFDIR  = 0x4000\n\tS_IFBLK  = 0x6000\n\tS_IFREG  = 0x8000\n\tS_IFLNK  = 0xa000\n\tS_IFSOCK = 0xc000\n\tS_ISUID  = 0x800\n\tS_ISGID  = 0x400\n\tS_ISVTX  = 0x200\n\tS_IRUSR  = 0x100\n\tS_IWRITE = 0x80\n\tS_IWUSR  = 0x80\n\tS_IXUSR  = 0x40\n)\n\nconst (\n\tFILE_TYPE_CHAR    = 0x0002\n\tFILE_TYPE_DISK    = 0x0001\n\tFILE_TYPE_PIPE    = 0x0003\n\tFILE_TYPE_REMOTE  = 0x8000\n\tFILE_TYPE_UNKNOWN = 0x0000\n)\n\ntype Hostent struct {\n\tName     *byte\n\tAliases  **byte\n\tAddrType uint16\n\tLength   uint16\n\tAddrList **byte\n}\n\ntype Protoent struct {\n\tName    *byte\n\tAliases **byte\n\tProto   uint16\n}\n\nconst (\n\tDNS_TYPE_A       = 0x0001\n\tDNS_TYPE_NS      = 0x0002\n\tDNS_TYPE_MD      = 0x0003\n\tDNS_TYPE_MF      = 0x0004\n\tDNS_TYPE_CNAME   = 0x0005\n\tDNS_TYPE_SOA     = 0x0006\n\tDNS_TYPE_MB      = 0x0007\n\tDNS_TYPE_MG      = 0x0008\n\tDNS_TYPE_MR      = 0x0009\n\tDNS_TYPE_NULL    = 0x000a\n\tDNS_TYPE_WKS     = 0x000b\n\tDNS_TYPE_PTR     = 0x000c\n\tDNS_TYPE_HINFO   = 0x000d\n\tDNS_TYPE_MINFO   = 0x000e\n\tDNS_TYPE_MX      = 0x000f\n\tDNS_TYPE_TEXT    = 0x0010\n\tDNS_TYPE_RP      = 0x0011\n\tDNS_TYPE_AFSDB   = 0x0012\n\tDNS_TYPE_X25     = 0x0013\n\tDNS_TYPE_ISDN    = 0x0014\n\tDNS_TYPE_RT      = 0x0015\n\tDNS_TYPE_NSAP    = 0x0016\n\tDNS_TYPE_NSAPPTR = 0x0017\n\tDNS_TYPE_SIG     = 0x0018\n\tDNS_TYPE_KEY     = 0x0019\n\tDNS_TYPE_PX      = 0x001a\n\tDNS_TYPE_GPOS    = 0x001b\n\tDNS_TYPE_AAAA    = 0x001c\n\tDNS_TYPE_LOC     = 0x001d\n\tDNS_TYPE_NXT     = 0x001e\n\tDNS_TYPE_EID     = 0x001f\n\tDNS_TYPE_NIMLOC  = 0x0020\n\tDNS_TYPE_SRV     = 0x0021\n\tDNS_TYPE_ATMA    = 0x0022\n\tDNS_TYPE_NAPTR   = 0x0023\n\tDNS_TYPE_KX      = 0x0024\n\tDNS_TYPE_CERT    = 0x0025\n\tDNS_TYPE_A6      = 0x0026\n\tDNS_TYPE_DNAME   = 0x0027\n\tDNS_TYPE_SINK    = 0x0028\n\tDNS_TYPE_OPT     = 0x0029\n\tDNS_TYPE_DS      = 0x002B\n\tDNS_TYPE_RRSIG   = 0x002E\n\tDNS_TYPE_NSEC    = 0x002F\n\tDNS_TYPE_DNSKEY  = 0x0030\n\tDNS_TYPE_DHCID   = 0x0031\n\tDNS_TYPE_UINFO   = 0x0064\n\tDNS_TYPE_UID     = 0x0065\n\tDNS_TYPE_GID     = 0x0066\n\tDNS_TYPE_UNSPEC  = 0x0067\n\tDNS_TYPE_ADDRS   = 0x00f8\n\tDNS_TYPE_TKEY    = 0x00f9\n\tDNS_TYPE_TSIG    = 0x00fa\n\tDNS_TYPE_IXFR    = 0x00fb\n\tDNS_TYPE_AXFR    = 0x00fc\n\tDNS_TYPE_MAILB   = 0x00fd\n\tDNS_TYPE_MAILA   = 0x00fe\n\tDNS_TYPE_ALL     = 0x00ff\n\tDNS_TYPE_ANY     = 0x00ff\n\tDNS_TYPE_WINS    = 0xff01\n\tDNS_TYPE_WINSR   = 0xff02\n\tDNS_TYPE_NBSTAT  = 0xff01\n)\n\nconst (\n\tDNS_INFO_NO_RECORDS = 0x251D\n)\n\nconst (\n\t// flags inside DNSRecord.Dw\n\tDnsSectionQuestion   = 0x0000\n\tDnsSectionAnswer     = 0x0001\n\tDnsSectionAuthority  = 0x0002\n\tDnsSectionAdditional = 0x0003\n)\n\ntype DNSSRVData struct {\n\tTarget   *uint16\n\tPriority uint16\n\tWeight   uint16\n\tPort     uint16\n\tPad      uint16\n}\n\ntype DNSPTRData struct {\n\tHost *uint16\n}\n\ntype DNSMXData struct {\n\tNameExchange *uint16\n\tPreference   uint16\n\tPad          uint16\n}\n\ntype DNSTXTData struct {\n\tStringCount uint16\n\tStringArray [1]*uint16\n}\n\ntype DNSRecord struct {\n\tNext     *DNSRecord\n\tName     *uint16\n\tType     uint16\n\tLength   uint16\n\tDw       uint32\n\tTtl      uint32\n\tReserved uint32\n\tData     [40]byte\n}\n\nconst (\n\tTF_DISCONNECT         = 1\n\tTF_REUSE_SOCKET       = 2\n\tTF_WRITE_BEHIND       = 4\n\tTF_USE_DEFAULT_WORKER = 0\n\tTF_USE_SYSTEM_THREAD  = 16\n\tTF_USE_KERNEL_APC     = 32\n)\n\ntype TransmitFileBuffers struct {\n\tHead       uintptr\n\tHeadLength uint32\n\tTail       uintptr\n\tTailLength uint32\n}\n\nconst (\n\tIFF_UP           = 1\n\tIFF_BROADCAST    = 2\n\tIFF_LOOPBACK     = 4\n\tIFF_POINTTOPOINT = 8\n\tIFF_MULTICAST    = 16\n)\n\nconst SIO_GET_INTERFACE_LIST = 0x4004747F\n\n// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.\n// will be fixed to change variable type as suitable.\n\ntype SockaddrGen [24]byte\n\ntype InterfaceInfo struct {\n\tFlags            uint32\n\tAddress          SockaddrGen\n\tBroadcastAddress SockaddrGen\n\tNetmask          SockaddrGen\n}\n\ntype IpAddressString struct {\n\tString [16]byte\n}\n\ntype IpMaskString IpAddressString\n\ntype IpAddrString struct {\n\tNext      *IpAddrString\n\tIpAddress IpAddressString\n\tIpMask    IpMaskString\n\tContext   uint32\n}\n\nconst MAX_ADAPTER_NAME_LENGTH = 256\nconst MAX_ADAPTER_DESCRIPTION_LENGTH = 128\nconst MAX_ADAPTER_ADDRESS_LENGTH = 8\n\ntype IpAdapterInfo struct {\n\tNext                *IpAdapterInfo\n\tComboIndex          uint32\n\tAdapterName         [MAX_ADAPTER_NAME_LENGTH + 4]byte\n\tDescription         [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte\n\tAddressLength       uint32\n\tAddress             [MAX_ADAPTER_ADDRESS_LENGTH]byte\n\tIndex               uint32\n\tType                uint32\n\tDhcpEnabled         uint32\n\tCurrentIpAddress    *IpAddrString\n\tIpAddressList       IpAddrString\n\tGatewayList         IpAddrString\n\tDhcpServer          IpAddrString\n\tHaveWins            bool\n\tPrimaryWinsServer   IpAddrString\n\tSecondaryWinsServer IpAddrString\n\tLeaseObtained       int64\n\tLeaseExpires        int64\n}\n\nconst MAXLEN_PHYSADDR = 8\nconst MAX_INTERFACE_NAME_LEN = 256\nconst MAXLEN_IFDESCR = 256\n\ntype MibIfRow struct {\n\tName            [MAX_INTERFACE_NAME_LEN]uint16\n\tIndex           uint32\n\tType            uint32\n\tMtu             uint32\n\tSpeed           uint32\n\tPhysAddrLen     uint32\n\tPhysAddr        [MAXLEN_PHYSADDR]byte\n\tAdminStatus     uint32\n\tOperStatus      uint32\n\tLastChange      uint32\n\tInOctets        uint32\n\tInUcastPkts     uint32\n\tInNUcastPkts    uint32\n\tInDiscards      uint32\n\tInErrors        uint32\n\tInUnknownProtos uint32\n\tOutOctets       uint32\n\tOutUcastPkts    uint32\n\tOutNUcastPkts   uint32\n\tOutDiscards     uint32\n\tOutErrors       uint32\n\tOutQLen         uint32\n\tDescrLen        uint32\n\tDescr           [MAXLEN_IFDESCR]byte\n}\n\ntype CertContext struct {\n\tEncodingType uint32\n\tEncodedCert  *byte\n\tLength       uint32\n\tCertInfo     uintptr\n\tStore        Handle\n}\n\ntype CertChainContext struct {\n\tSize                       uint32\n\tTrustStatus                CertTrustStatus\n\tChainCount                 uint32\n\tChains                     **CertSimpleChain\n\tLowerQualityChainCount     uint32\n\tLowerQualityChains         **CertChainContext\n\tHasRevocationFreshnessTime uint32\n\tRevocationFreshnessTime    uint32\n}\n\ntype CertSimpleChain struct {\n\tSize                       uint32\n\tTrustStatus                CertTrustStatus\n\tNumElements                uint32\n\tElements                   **CertChainElement\n\tTrustListInfo              uintptr\n\tHasRevocationFreshnessTime uint32\n\tRevocationFreshnessTime    uint32\n}\n\ntype CertChainElement struct {\n\tSize              uint32\n\tCertContext       *CertContext\n\tTrustStatus       CertTrustStatus\n\tRevocationInfo    *CertRevocationInfo\n\tIssuanceUsage     *CertEnhKeyUsage\n\tApplicationUsage  *CertEnhKeyUsage\n\tExtendedErrorInfo *uint16\n}\n\ntype CertRevocationInfo struct {\n\tSize             uint32\n\tRevocationResult uint32\n\tRevocationOid    *byte\n\tOidSpecificInfo  uintptr\n\tHasFreshnessTime uint32\n\tFreshnessTime    uint32\n\tCrlInfo          uintptr // *CertRevocationCrlInfo\n}\n\ntype CertTrustStatus struct {\n\tErrorStatus uint32\n\tInfoStatus  uint32\n}\n\ntype CertUsageMatch struct {\n\tType  uint32\n\tUsage CertEnhKeyUsage\n}\n\ntype CertEnhKeyUsage struct {\n\tLength           uint32\n\tUsageIdentifiers **byte\n}\n\ntype CertChainPara struct {\n\tSize                         uint32\n\tRequestedUsage               CertUsageMatch\n\tRequstedIssuancePolicy       CertUsageMatch\n\tURLRetrievalTimeout          uint32\n\tCheckRevocationFreshnessTime uint32\n\tRevocationFreshnessTime      uint32\n\tCacheResync                  *Filetime\n}\n\ntype CertChainPolicyPara struct {\n\tSize            uint32\n\tFlags           uint32\n\tExtraPolicyPara uintptr\n}\n\ntype SSLExtraCertChainPolicyPara struct {\n\tSize       uint32\n\tAuthType   uint32\n\tChecks     uint32\n\tServerName *uint16\n}\n\ntype CertChainPolicyStatus struct {\n\tSize              uint32\n\tError             uint32\n\tChainIndex        uint32\n\tElementIndex      uint32\n\tExtraPolicyStatus uintptr\n}\n\nconst (\n\t// do not reorder\n\tHKEY_CLASSES_ROOT = 0x80000000 + iota\n\tHKEY_CURRENT_USER\n\tHKEY_LOCAL_MACHINE\n\tHKEY_USERS\n\tHKEY_PERFORMANCE_DATA\n\tHKEY_CURRENT_CONFIG\n\tHKEY_DYN_DATA\n\n\tKEY_QUERY_VALUE        = 1\n\tKEY_SET_VALUE          = 2\n\tKEY_CREATE_SUB_KEY     = 4\n\tKEY_ENUMERATE_SUB_KEYS = 8\n\tKEY_NOTIFY             = 16\n\tKEY_CREATE_LINK        = 32\n\tKEY_WRITE              = 0x20006\n\tKEY_EXECUTE            = 0x20019\n\tKEY_READ               = 0x20019\n\tKEY_WOW64_64KEY        = 0x0100\n\tKEY_WOW64_32KEY        = 0x0200\n\tKEY_ALL_ACCESS         = 0xf003f\n)\n\nconst (\n\t// do not reorder\n\tREG_NONE = iota\n\tREG_SZ\n\tREG_EXPAND_SZ\n\tREG_BINARY\n\tREG_DWORD_LITTLE_ENDIAN\n\tREG_DWORD_BIG_ENDIAN\n\tREG_LINK\n\tREG_MULTI_SZ\n\tREG_RESOURCE_LIST\n\tREG_FULL_RESOURCE_DESCRIPTOR\n\tREG_RESOURCE_REQUIREMENTS_LIST\n\tREG_QWORD_LITTLE_ENDIAN\n\tREG_DWORD = REG_DWORD_LITTLE_ENDIAN\n\tREG_QWORD = REG_QWORD_LITTLE_ENDIAN\n)\n\ntype AddrinfoW struct {\n\tFlags     int32\n\tFamily    int32\n\tSocktype  int32\n\tProtocol  int32\n\tAddrlen   uintptr\n\tCanonname *uint16\n\tAddr      uintptr\n\tNext      *AddrinfoW\n}\n\nconst (\n\tAI_PASSIVE     = 1\n\tAI_CANONNAME   = 2\n\tAI_NUMERICHOST = 4\n)\n\ntype GUID struct {\n\tData1 uint32\n\tData2 uint16\n\tData3 uint16\n\tData4 [8]byte\n}\n\nvar WSAID_CONNECTEX = GUID{\n\t0x25a207b9,\n\t0xddf3,\n\t0x4660,\n\t[8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},\n}\n\nvar WSAID_WSASENDMSG = GUID{\n\t0xa441e712,\n\t0x754f,\n\t0x43ca,\n\t[8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},\n}\n\nvar WSAID_WSARECVMSG = GUID{\n\t0xf689d7c8,\n\t0x6f1f,\n\t0x436b,\n\t[8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},\n}\n\nconst (\n\tFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1\n\tFILE_SKIP_SET_EVENT_ON_HANDLE        = 2\n)\n\nconst (\n\tWSAPROTOCOL_LEN    = 255\n\tMAX_PROTOCOL_CHAIN = 7\n\tBASE_PROTOCOL      = 1\n\tLAYERED_PROTOCOL   = 0\n\n\tXP1_CONNECTIONLESS           = 0x00000001\n\tXP1_GUARANTEED_DELIVERY      = 0x00000002\n\tXP1_GUARANTEED_ORDER         = 0x00000004\n\tXP1_MESSAGE_ORIENTED         = 0x00000008\n\tXP1_PSEUDO_STREAM            = 0x00000010\n\tXP1_GRACEFUL_CLOSE           = 0x00000020\n\tXP1_EXPEDITED_DATA           = 0x00000040\n\tXP1_CONNECT_DATA             = 0x00000080\n\tXP1_DISCONNECT_DATA          = 0x00000100\n\tXP1_SUPPORT_BROADCAST        = 0x00000200\n\tXP1_SUPPORT_MULTIPOINT       = 0x00000400\n\tXP1_MULTIPOINT_CONTROL_PLANE = 0x00000800\n\tXP1_MULTIPOINT_DATA_PLANE    = 0x00001000\n\tXP1_QOS_SUPPORTED            = 0x00002000\n\tXP1_UNI_SEND                 = 0x00008000\n\tXP1_UNI_RECV                 = 0x00010000\n\tXP1_IFS_HANDLES              = 0x00020000\n\tXP1_PARTIAL_MESSAGE          = 0x00040000\n\tXP1_SAN_SUPPORT_SDP          = 0x00080000\n\n\tPFL_MULTIPLE_PROTO_ENTRIES  = 0x00000001\n\tPFL_RECOMMENDED_PROTO_ENTRY = 0x00000002\n\tPFL_HIDDEN                  = 0x00000004\n\tPFL_MATCHES_PROTOCOL_ZERO   = 0x00000008\n\tPFL_NETWORKDIRECT_PROVIDER  = 0x00000010\n)\n\ntype WSAProtocolInfo struct {\n\tServiceFlags1     uint32\n\tServiceFlags2     uint32\n\tServiceFlags3     uint32\n\tServiceFlags4     uint32\n\tProviderFlags     uint32\n\tProviderId        GUID\n\tCatalogEntryId    uint32\n\tProtocolChain     WSAProtocolChain\n\tVersion           int32\n\tAddressFamily     int32\n\tMaxSockAddr       int32\n\tMinSockAddr       int32\n\tSocketType        int32\n\tProtocol          int32\n\tProtocolMaxOffset int32\n\tNetworkByteOrder  int32\n\tSecurityScheme    int32\n\tMessageSize       uint32\n\tProviderReserved  uint32\n\tProtocolName      [WSAPROTOCOL_LEN + 1]uint16\n}\n\ntype WSAProtocolChain struct {\n\tChainLen     int32\n\tChainEntries [MAX_PROTOCOL_CHAIN]uint32\n}\n\ntype TCPKeepalive struct {\n\tOnOff    uint32\n\tTime     uint32\n\tInterval uint32\n}\n\ntype symbolicLinkReparseBuffer struct {\n\tSubstituteNameOffset uint16\n\tSubstituteNameLength uint16\n\tPrintNameOffset      uint16\n\tPrintNameLength      uint16\n\tFlags                uint32\n\tPathBuffer           [1]uint16\n}\n\ntype mountPointReparseBuffer struct {\n\tSubstituteNameOffset uint16\n\tSubstituteNameLength uint16\n\tPrintNameOffset      uint16\n\tPrintNameLength      uint16\n\tPathBuffer           [1]uint16\n}\n\ntype reparseDataBuffer struct {\n\tReparseTag        uint32\n\tReparseDataLength uint16\n\tReserved          uint16\n\n\t// GenericReparseBuffer\n\treparseBuffer byte\n}\n\nconst (\n\tFSCTL_GET_REPARSE_POINT          = 0x900A8\n\tMAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024\n\tIO_REPARSE_TAG_MOUNT_POINT       = 0xA0000003\n\tIO_REPARSE_TAG_SYMLINK           = 0xA000000C\n\tSYMBOLIC_LINK_FLAG_DIRECTORY     = 0x1\n)\n\nconst (\n\tComputerNameNetBIOS                   = 0\n\tComputerNameDnsHostname               = 1\n\tComputerNameDnsDomain                 = 2\n\tComputerNameDnsFullyQualified         = 3\n\tComputerNamePhysicalNetBIOS           = 4\n\tComputerNamePhysicalDnsHostname       = 5\n\tComputerNamePhysicalDnsDomain         = 6\n\tComputerNamePhysicalDnsFullyQualified = 7\n\tComputerNameMax                       = 8\n)\n\nconst (\n\tMOVEFILE_REPLACE_EXISTING      = 0x1\n\tMOVEFILE_COPY_ALLOWED          = 0x2\n\tMOVEFILE_DELAY_UNTIL_REBOOT    = 0x4\n\tMOVEFILE_WRITE_THROUGH         = 0x8\n\tMOVEFILE_CREATE_HARDLINK       = 0x10\n\tMOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20\n)\n\nconst GAA_FLAG_INCLUDE_PREFIX = 0x00000010\n\nconst (\n\tIF_TYPE_OTHER              = 1\n\tIF_TYPE_ETHERNET_CSMACD    = 6\n\tIF_TYPE_ISO88025_TOKENRING = 9\n\tIF_TYPE_PPP                = 23\n\tIF_TYPE_SOFTWARE_LOOPBACK  = 24\n\tIF_TYPE_ATM                = 37\n\tIF_TYPE_IEEE80211          = 71\n\tIF_TYPE_TUNNEL             = 131\n\tIF_TYPE_IEEE1394           = 144\n)\n\ntype SocketAddress struct {\n\tSockaddr       *syscall.RawSockaddrAny\n\tSockaddrLength int32\n}\n\ntype IpAdapterUnicastAddress struct {\n\tLength             uint32\n\tFlags              uint32\n\tNext               *IpAdapterUnicastAddress\n\tAddress            SocketAddress\n\tPrefixOrigin       int32\n\tSuffixOrigin       int32\n\tDadState           int32\n\tValidLifetime      uint32\n\tPreferredLifetime  uint32\n\tLeaseLifetime      uint32\n\tOnLinkPrefixLength uint8\n}\n\ntype IpAdapterAnycastAddress struct {\n\tLength  uint32\n\tFlags   uint32\n\tNext    *IpAdapterAnycastAddress\n\tAddress SocketAddress\n}\n\ntype IpAdapterMulticastAddress struct {\n\tLength  uint32\n\tFlags   uint32\n\tNext    *IpAdapterMulticastAddress\n\tAddress SocketAddress\n}\n\ntype IpAdapterDnsServerAdapter struct {\n\tLength   uint32\n\tReserved uint32\n\tNext     *IpAdapterDnsServerAdapter\n\tAddress  SocketAddress\n}\n\ntype IpAdapterPrefix struct {\n\tLength       uint32\n\tFlags        uint32\n\tNext         *IpAdapterPrefix\n\tAddress      SocketAddress\n\tPrefixLength uint32\n}\n\ntype IpAdapterAddresses struct {\n\tLength                uint32\n\tIfIndex               uint32\n\tNext                  *IpAdapterAddresses\n\tAdapterName           *byte\n\tFirstUnicastAddress   *IpAdapterUnicastAddress\n\tFirstAnycastAddress   *IpAdapterAnycastAddress\n\tFirstMulticastAddress *IpAdapterMulticastAddress\n\tFirstDnsServerAddress *IpAdapterDnsServerAdapter\n\tDnsSuffix             *uint16\n\tDescription           *uint16\n\tFriendlyName          *uint16\n\tPhysicalAddress       [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte\n\tPhysicalAddressLength uint32\n\tFlags                 uint32\n\tMtu                   uint32\n\tIfType                uint32\n\tOperStatus            uint32\n\tIpv6IfIndex           uint32\n\tZoneIndices           [16]uint32\n\tFirstPrefix           *IpAdapterPrefix\n\t/* more fields might be present here. */\n}\n\nconst (\n\tIfOperStatusUp             = 1\n\tIfOperStatusDown           = 2\n\tIfOperStatusTesting        = 3\n\tIfOperStatusUnknown        = 4\n\tIfOperStatusDormant        = 5\n\tIfOperStatusNotPresent     = 6\n\tIfOperStatusLowerLayerDown = 7\n)\n\n// Console related constants used for the mode parameter to SetConsoleMode. See\n// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.\n\nconst (\n\tENABLE_PROCESSED_INPUT        = 0x1\n\tENABLE_LINE_INPUT             = 0x2\n\tENABLE_ECHO_INPUT             = 0x4\n\tENABLE_WINDOW_INPUT           = 0x8\n\tENABLE_MOUSE_INPUT            = 0x10\n\tENABLE_INSERT_MODE            = 0x20\n\tENABLE_QUICK_EDIT_MODE        = 0x40\n\tENABLE_EXTENDED_FLAGS         = 0x80\n\tENABLE_AUTO_POSITION          = 0x100\n\tENABLE_VIRTUAL_TERMINAL_INPUT = 0x200\n\n\tENABLE_PROCESSED_OUTPUT            = 0x1\n\tENABLE_WRAP_AT_EOL_OUTPUT          = 0x2\n\tENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4\n\tDISABLE_NEWLINE_AUTO_RETURN        = 0x8\n\tENABLE_LVB_GRID_WORLDWIDE          = 0x10\n)\n\ntype Coord struct {\n\tX int16\n\tY int16\n}\n\ntype SmallRect struct {\n\tLeft   int16\n\tTop    int16\n\tRight  int16\n\tBottom int16\n}\n\n// Used with GetConsoleScreenBuffer to retreive information about a console\n// screen buffer. See\n// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str\n// for details.\n\ntype ConsoleScreenBufferInfo struct {\n\tSize              Coord\n\tCursorPosition    Coord\n\tAttributes        uint16\n\tWindow            SmallRect\n\tMaximumWindowSize Coord\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/types_windows_386.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage windows\n\ntype WSAData struct {\n\tVersion      uint16\n\tHighVersion  uint16\n\tDescription  [WSADESCRIPTION_LEN + 1]byte\n\tSystemStatus [WSASYS_STATUS_LEN + 1]byte\n\tMaxSockets   uint16\n\tMaxUdpDg     uint16\n\tVendorInfo   *byte\n}\n\ntype Servent struct {\n\tName    *byte\n\tAliases **byte\n\tPort    uint16\n\tProto   *byte\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/types_windows_amd64.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage windows\n\ntype WSAData struct {\n\tVersion      uint16\n\tHighVersion  uint16\n\tMaxSockets   uint16\n\tMaxUdpDg     uint16\n\tVendorInfo   *byte\n\tDescription  [WSADESCRIPTION_LEN + 1]byte\n\tSystemStatus [WSASYS_STATUS_LEN + 1]byte\n}\n\ntype Servent struct {\n\tName    *byte\n\tAliases **byte\n\tProto   *byte\n\tPort    uint16\n}\n"
  },
  {
    "path": "vendor/golang.org/x/sys/windows/zsyscall_windows.go",
    "content": "// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT\n\npackage windows\n\nimport (\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nvar _ unsafe.Pointer\n\n// Do the interface allocations only once for common\n// Errno values.\nconst (\n\terrnoERROR_IO_PENDING = 997\n)\n\nvar (\n\terrERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)\n)\n\n// errnoErr returns common boxed Errno values, to prevent\n// allocations at runtime.\nfunc errnoErr(e syscall.Errno) error {\n\tswitch e {\n\tcase 0:\n\t\treturn nil\n\tcase errnoERROR_IO_PENDING:\n\t\treturn errERROR_IO_PENDING\n\t}\n\t// TODO: add more here, after collecting data on the common\n\t// error values see on Windows. (perhaps when running\n\t// all.bat?)\n\treturn e\n}\n\nvar (\n\tmodadvapi32 = NewLazySystemDLL(\"advapi32.dll\")\n\tmodkernel32 = NewLazySystemDLL(\"kernel32.dll\")\n\tmodshell32  = NewLazySystemDLL(\"shell32.dll\")\n\tmodmswsock  = NewLazySystemDLL(\"mswsock.dll\")\n\tmodcrypt32  = NewLazySystemDLL(\"crypt32.dll\")\n\tmodws2_32   = NewLazySystemDLL(\"ws2_32.dll\")\n\tmoddnsapi   = NewLazySystemDLL(\"dnsapi.dll\")\n\tmodiphlpapi = NewLazySystemDLL(\"iphlpapi.dll\")\n\tmodsecur32  = NewLazySystemDLL(\"secur32.dll\")\n\tmodnetapi32 = NewLazySystemDLL(\"netapi32.dll\")\n\tmoduserenv  = NewLazySystemDLL(\"userenv.dll\")\n\n\tprocRegisterEventSourceW               = modadvapi32.NewProc(\"RegisterEventSourceW\")\n\tprocDeregisterEventSource              = modadvapi32.NewProc(\"DeregisterEventSource\")\n\tprocReportEventW                       = modadvapi32.NewProc(\"ReportEventW\")\n\tprocOpenSCManagerW                     = modadvapi32.NewProc(\"OpenSCManagerW\")\n\tprocCloseServiceHandle                 = modadvapi32.NewProc(\"CloseServiceHandle\")\n\tprocCreateServiceW                     = modadvapi32.NewProc(\"CreateServiceW\")\n\tprocOpenServiceW                       = modadvapi32.NewProc(\"OpenServiceW\")\n\tprocDeleteService                      = modadvapi32.NewProc(\"DeleteService\")\n\tprocStartServiceW                      = modadvapi32.NewProc(\"StartServiceW\")\n\tprocQueryServiceStatus                 = modadvapi32.NewProc(\"QueryServiceStatus\")\n\tprocControlService                     = modadvapi32.NewProc(\"ControlService\")\n\tprocStartServiceCtrlDispatcherW        = modadvapi32.NewProc(\"StartServiceCtrlDispatcherW\")\n\tprocSetServiceStatus                   = modadvapi32.NewProc(\"SetServiceStatus\")\n\tprocChangeServiceConfigW               = modadvapi32.NewProc(\"ChangeServiceConfigW\")\n\tprocQueryServiceConfigW                = modadvapi32.NewProc(\"QueryServiceConfigW\")\n\tprocChangeServiceConfig2W              = modadvapi32.NewProc(\"ChangeServiceConfig2W\")\n\tprocQueryServiceConfig2W               = modadvapi32.NewProc(\"QueryServiceConfig2W\")\n\tprocEnumServicesStatusExW              = modadvapi32.NewProc(\"EnumServicesStatusExW\")\n\tprocGetLastError                       = modkernel32.NewProc(\"GetLastError\")\n\tprocLoadLibraryW                       = modkernel32.NewProc(\"LoadLibraryW\")\n\tprocLoadLibraryExW                     = modkernel32.NewProc(\"LoadLibraryExW\")\n\tprocFreeLibrary                        = modkernel32.NewProc(\"FreeLibrary\")\n\tprocGetProcAddress                     = modkernel32.NewProc(\"GetProcAddress\")\n\tprocGetVersion                         = modkernel32.NewProc(\"GetVersion\")\n\tprocFormatMessageW                     = modkernel32.NewProc(\"FormatMessageW\")\n\tprocExitProcess                        = modkernel32.NewProc(\"ExitProcess\")\n\tprocCreateFileW                        = modkernel32.NewProc(\"CreateFileW\")\n\tprocReadFile                           = modkernel32.NewProc(\"ReadFile\")\n\tprocWriteFile                          = modkernel32.NewProc(\"WriteFile\")\n\tprocSetFilePointer                     = modkernel32.NewProc(\"SetFilePointer\")\n\tprocCloseHandle                        = modkernel32.NewProc(\"CloseHandle\")\n\tprocGetStdHandle                       = modkernel32.NewProc(\"GetStdHandle\")\n\tprocSetStdHandle                       = modkernel32.NewProc(\"SetStdHandle\")\n\tprocFindFirstFileW                     = modkernel32.NewProc(\"FindFirstFileW\")\n\tprocFindNextFileW                      = modkernel32.NewProc(\"FindNextFileW\")\n\tprocFindClose                          = modkernel32.NewProc(\"FindClose\")\n\tprocGetFileInformationByHandle         = modkernel32.NewProc(\"GetFileInformationByHandle\")\n\tprocGetCurrentDirectoryW               = modkernel32.NewProc(\"GetCurrentDirectoryW\")\n\tprocSetCurrentDirectoryW               = modkernel32.NewProc(\"SetCurrentDirectoryW\")\n\tprocCreateDirectoryW                   = modkernel32.NewProc(\"CreateDirectoryW\")\n\tprocRemoveDirectoryW                   = modkernel32.NewProc(\"RemoveDirectoryW\")\n\tprocDeleteFileW                        = modkernel32.NewProc(\"DeleteFileW\")\n\tprocMoveFileW                          = modkernel32.NewProc(\"MoveFileW\")\n\tprocMoveFileExW                        = modkernel32.NewProc(\"MoveFileExW\")\n\tprocGetComputerNameW                   = modkernel32.NewProc(\"GetComputerNameW\")\n\tprocGetComputerNameExW                 = modkernel32.NewProc(\"GetComputerNameExW\")\n\tprocSetEndOfFile                       = modkernel32.NewProc(\"SetEndOfFile\")\n\tprocGetSystemTimeAsFileTime            = modkernel32.NewProc(\"GetSystemTimeAsFileTime\")\n\tprocGetSystemTimePreciseAsFileTime     = modkernel32.NewProc(\"GetSystemTimePreciseAsFileTime\")\n\tprocGetTimeZoneInformation             = modkernel32.NewProc(\"GetTimeZoneInformation\")\n\tprocCreateIoCompletionPort             = modkernel32.NewProc(\"CreateIoCompletionPort\")\n\tprocGetQueuedCompletionStatus          = modkernel32.NewProc(\"GetQueuedCompletionStatus\")\n\tprocPostQueuedCompletionStatus         = modkernel32.NewProc(\"PostQueuedCompletionStatus\")\n\tprocCancelIo                           = modkernel32.NewProc(\"CancelIo\")\n\tprocCancelIoEx                         = modkernel32.NewProc(\"CancelIoEx\")\n\tprocCreateProcessW                     = modkernel32.NewProc(\"CreateProcessW\")\n\tprocOpenProcess                        = modkernel32.NewProc(\"OpenProcess\")\n\tprocTerminateProcess                   = modkernel32.NewProc(\"TerminateProcess\")\n\tprocGetExitCodeProcess                 = modkernel32.NewProc(\"GetExitCodeProcess\")\n\tprocGetStartupInfoW                    = modkernel32.NewProc(\"GetStartupInfoW\")\n\tprocGetCurrentProcess                  = modkernel32.NewProc(\"GetCurrentProcess\")\n\tprocGetProcessTimes                    = modkernel32.NewProc(\"GetProcessTimes\")\n\tprocDuplicateHandle                    = modkernel32.NewProc(\"DuplicateHandle\")\n\tprocWaitForSingleObject                = modkernel32.NewProc(\"WaitForSingleObject\")\n\tprocGetTempPathW                       = modkernel32.NewProc(\"GetTempPathW\")\n\tprocCreatePipe                         = modkernel32.NewProc(\"CreatePipe\")\n\tprocGetFileType                        = modkernel32.NewProc(\"GetFileType\")\n\tprocCryptAcquireContextW               = modadvapi32.NewProc(\"CryptAcquireContextW\")\n\tprocCryptReleaseContext                = modadvapi32.NewProc(\"CryptReleaseContext\")\n\tprocCryptGenRandom                     = modadvapi32.NewProc(\"CryptGenRandom\")\n\tprocGetEnvironmentStringsW             = modkernel32.NewProc(\"GetEnvironmentStringsW\")\n\tprocFreeEnvironmentStringsW            = modkernel32.NewProc(\"FreeEnvironmentStringsW\")\n\tprocGetEnvironmentVariableW            = modkernel32.NewProc(\"GetEnvironmentVariableW\")\n\tprocSetEnvironmentVariableW            = modkernel32.NewProc(\"SetEnvironmentVariableW\")\n\tprocSetFileTime                        = modkernel32.NewProc(\"SetFileTime\")\n\tprocGetFileAttributesW                 = modkernel32.NewProc(\"GetFileAttributesW\")\n\tprocSetFileAttributesW                 = modkernel32.NewProc(\"SetFileAttributesW\")\n\tprocGetFileAttributesExW               = modkernel32.NewProc(\"GetFileAttributesExW\")\n\tprocGetCommandLineW                    = modkernel32.NewProc(\"GetCommandLineW\")\n\tprocCommandLineToArgvW                 = modshell32.NewProc(\"CommandLineToArgvW\")\n\tprocLocalFree                          = modkernel32.NewProc(\"LocalFree\")\n\tprocSetHandleInformation               = modkernel32.NewProc(\"SetHandleInformation\")\n\tprocFlushFileBuffers                   = modkernel32.NewProc(\"FlushFileBuffers\")\n\tprocGetFullPathNameW                   = modkernel32.NewProc(\"GetFullPathNameW\")\n\tprocGetLongPathNameW                   = modkernel32.NewProc(\"GetLongPathNameW\")\n\tprocGetShortPathNameW                  = modkernel32.NewProc(\"GetShortPathNameW\")\n\tprocCreateFileMappingW                 = modkernel32.NewProc(\"CreateFileMappingW\")\n\tprocMapViewOfFile                      = modkernel32.NewProc(\"MapViewOfFile\")\n\tprocUnmapViewOfFile                    = modkernel32.NewProc(\"UnmapViewOfFile\")\n\tprocFlushViewOfFile                    = modkernel32.NewProc(\"FlushViewOfFile\")\n\tprocVirtualLock                        = modkernel32.NewProc(\"VirtualLock\")\n\tprocVirtualUnlock                      = modkernel32.NewProc(\"VirtualUnlock\")\n\tprocVirtualAlloc                       = modkernel32.NewProc(\"VirtualAlloc\")\n\tprocVirtualFree                        = modkernel32.NewProc(\"VirtualFree\")\n\tprocVirtualProtect                     = modkernel32.NewProc(\"VirtualProtect\")\n\tprocTransmitFile                       = modmswsock.NewProc(\"TransmitFile\")\n\tprocReadDirectoryChangesW              = modkernel32.NewProc(\"ReadDirectoryChangesW\")\n\tprocCertOpenSystemStoreW               = modcrypt32.NewProc(\"CertOpenSystemStoreW\")\n\tprocCertOpenStore                      = modcrypt32.NewProc(\"CertOpenStore\")\n\tprocCertEnumCertificatesInStore        = modcrypt32.NewProc(\"CertEnumCertificatesInStore\")\n\tprocCertAddCertificateContextToStore   = modcrypt32.NewProc(\"CertAddCertificateContextToStore\")\n\tprocCertCloseStore                     = modcrypt32.NewProc(\"CertCloseStore\")\n\tprocCertGetCertificateChain            = modcrypt32.NewProc(\"CertGetCertificateChain\")\n\tprocCertFreeCertificateChain           = modcrypt32.NewProc(\"CertFreeCertificateChain\")\n\tprocCertCreateCertificateContext       = modcrypt32.NewProc(\"CertCreateCertificateContext\")\n\tprocCertFreeCertificateContext         = modcrypt32.NewProc(\"CertFreeCertificateContext\")\n\tprocCertVerifyCertificateChainPolicy   = modcrypt32.NewProc(\"CertVerifyCertificateChainPolicy\")\n\tprocRegOpenKeyExW                      = modadvapi32.NewProc(\"RegOpenKeyExW\")\n\tprocRegCloseKey                        = modadvapi32.NewProc(\"RegCloseKey\")\n\tprocRegQueryInfoKeyW                   = modadvapi32.NewProc(\"RegQueryInfoKeyW\")\n\tprocRegEnumKeyExW                      = modadvapi32.NewProc(\"RegEnumKeyExW\")\n\tprocRegQueryValueExW                   = modadvapi32.NewProc(\"RegQueryValueExW\")\n\tprocGetCurrentProcessId                = modkernel32.NewProc(\"GetCurrentProcessId\")\n\tprocGetConsoleMode                     = modkernel32.NewProc(\"GetConsoleMode\")\n\tprocSetConsoleMode                     = modkernel32.NewProc(\"SetConsoleMode\")\n\tprocGetConsoleScreenBufferInfo         = modkernel32.NewProc(\"GetConsoleScreenBufferInfo\")\n\tprocWriteConsoleW                      = modkernel32.NewProc(\"WriteConsoleW\")\n\tprocReadConsoleW                       = modkernel32.NewProc(\"ReadConsoleW\")\n\tprocCreateToolhelp32Snapshot           = modkernel32.NewProc(\"CreateToolhelp32Snapshot\")\n\tprocProcess32FirstW                    = modkernel32.NewProc(\"Process32FirstW\")\n\tprocProcess32NextW                     = modkernel32.NewProc(\"Process32NextW\")\n\tprocDeviceIoControl                    = modkernel32.NewProc(\"DeviceIoControl\")\n\tprocCreateSymbolicLinkW                = modkernel32.NewProc(\"CreateSymbolicLinkW\")\n\tprocCreateHardLinkW                    = modkernel32.NewProc(\"CreateHardLinkW\")\n\tprocGetCurrentThreadId                 = modkernel32.NewProc(\"GetCurrentThreadId\")\n\tprocCreateEventW                       = modkernel32.NewProc(\"CreateEventW\")\n\tprocCreateEventExW                     = modkernel32.NewProc(\"CreateEventExW\")\n\tprocOpenEventW                         = modkernel32.NewProc(\"OpenEventW\")\n\tprocSetEvent                           = modkernel32.NewProc(\"SetEvent\")\n\tprocResetEvent                         = modkernel32.NewProc(\"ResetEvent\")\n\tprocPulseEvent                         = modkernel32.NewProc(\"PulseEvent\")\n\tprocWSAStartup                         = modws2_32.NewProc(\"WSAStartup\")\n\tprocWSACleanup                         = modws2_32.NewProc(\"WSACleanup\")\n\tprocWSAIoctl                           = modws2_32.NewProc(\"WSAIoctl\")\n\tprocsocket                             = modws2_32.NewProc(\"socket\")\n\tprocsetsockopt                         = modws2_32.NewProc(\"setsockopt\")\n\tprocgetsockopt                         = modws2_32.NewProc(\"getsockopt\")\n\tprocbind                               = modws2_32.NewProc(\"bind\")\n\tprocconnect                            = modws2_32.NewProc(\"connect\")\n\tprocgetsockname                        = modws2_32.NewProc(\"getsockname\")\n\tprocgetpeername                        = modws2_32.NewProc(\"getpeername\")\n\tproclisten                             = modws2_32.NewProc(\"listen\")\n\tprocshutdown                           = modws2_32.NewProc(\"shutdown\")\n\tprocclosesocket                        = modws2_32.NewProc(\"closesocket\")\n\tprocAcceptEx                           = modmswsock.NewProc(\"AcceptEx\")\n\tprocGetAcceptExSockaddrs               = modmswsock.NewProc(\"GetAcceptExSockaddrs\")\n\tprocWSARecv                            = modws2_32.NewProc(\"WSARecv\")\n\tprocWSASend                            = modws2_32.NewProc(\"WSASend\")\n\tprocWSARecvFrom                        = modws2_32.NewProc(\"WSARecvFrom\")\n\tprocWSASendTo                          = modws2_32.NewProc(\"WSASendTo\")\n\tprocgethostbyname                      = modws2_32.NewProc(\"gethostbyname\")\n\tprocgetservbyname                      = modws2_32.NewProc(\"getservbyname\")\n\tprocntohs                              = modws2_32.NewProc(\"ntohs\")\n\tprocgetprotobyname                     = modws2_32.NewProc(\"getprotobyname\")\n\tprocDnsQuery_W                         = moddnsapi.NewProc(\"DnsQuery_W\")\n\tprocDnsRecordListFree                  = moddnsapi.NewProc(\"DnsRecordListFree\")\n\tprocDnsNameCompare_W                   = moddnsapi.NewProc(\"DnsNameCompare_W\")\n\tprocGetAddrInfoW                       = modws2_32.NewProc(\"GetAddrInfoW\")\n\tprocFreeAddrInfoW                      = modws2_32.NewProc(\"FreeAddrInfoW\")\n\tprocGetIfEntry                         = modiphlpapi.NewProc(\"GetIfEntry\")\n\tprocGetAdaptersInfo                    = modiphlpapi.NewProc(\"GetAdaptersInfo\")\n\tprocSetFileCompletionNotificationModes = modkernel32.NewProc(\"SetFileCompletionNotificationModes\")\n\tprocWSAEnumProtocolsW                  = modws2_32.NewProc(\"WSAEnumProtocolsW\")\n\tprocGetAdaptersAddresses               = modiphlpapi.NewProc(\"GetAdaptersAddresses\")\n\tprocGetACP                             = modkernel32.NewProc(\"GetACP\")\n\tprocMultiByteToWideChar                = modkernel32.NewProc(\"MultiByteToWideChar\")\n\tprocTranslateNameW                     = modsecur32.NewProc(\"TranslateNameW\")\n\tprocGetUserNameExW                     = modsecur32.NewProc(\"GetUserNameExW\")\n\tprocNetUserGetInfo                     = modnetapi32.NewProc(\"NetUserGetInfo\")\n\tprocNetGetJoinInformation              = modnetapi32.NewProc(\"NetGetJoinInformation\")\n\tprocNetApiBufferFree                   = modnetapi32.NewProc(\"NetApiBufferFree\")\n\tprocLookupAccountSidW                  = modadvapi32.NewProc(\"LookupAccountSidW\")\n\tprocLookupAccountNameW                 = modadvapi32.NewProc(\"LookupAccountNameW\")\n\tprocConvertSidToStringSidW             = modadvapi32.NewProc(\"ConvertSidToStringSidW\")\n\tprocConvertStringSidToSidW             = modadvapi32.NewProc(\"ConvertStringSidToSidW\")\n\tprocGetLengthSid                       = modadvapi32.NewProc(\"GetLengthSid\")\n\tprocCopySid                            = modadvapi32.NewProc(\"CopySid\")\n\tprocAllocateAndInitializeSid           = modadvapi32.NewProc(\"AllocateAndInitializeSid\")\n\tprocFreeSid                            = modadvapi32.NewProc(\"FreeSid\")\n\tprocEqualSid                           = modadvapi32.NewProc(\"EqualSid\")\n\tprocOpenProcessToken                   = modadvapi32.NewProc(\"OpenProcessToken\")\n\tprocGetTokenInformation                = modadvapi32.NewProc(\"GetTokenInformation\")\n\tprocGetUserProfileDirectoryW           = moduserenv.NewProc(\"GetUserProfileDirectoryW\")\n)\n\nfunc RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0)\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc DeregisterEventSource(handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access))\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CloseServiceHandle(handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0)\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access))\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc DeleteService(service Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) {\n\tr1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) {\n\tr1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) {\n\tr1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetLastError() (lasterr error) {\n\tr0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)\n\tif r0 != 0 {\n\t\tlasterr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc LoadLibrary(libname string) (handle Handle, err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(libname)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _LoadLibrary(_p0)\n}\n\nfunc _LoadLibrary(libname *uint16) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0)\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) {\n\tvar _p0 *uint16\n\t_p0, err = syscall.UTF16PtrFromString(libname)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _LoadLibraryEx(_p0, zero, flags)\n}\n\nfunc _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags))\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc FreeLibrary(handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetProcAddress(module Handle, procname string) (proc uintptr, err error) {\n\tvar _p0 *byte\n\t_p0, err = syscall.BytePtrFromString(procname)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _GetProcAddress(module, _p0)\n}\n\nfunc _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0)\n\tproc = uintptr(r0)\n\tif proc == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetVersion() (ver uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0)\n\tver = uint32(r0)\n\tif ver == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) {\n\tvar _p0 *uint16\n\tif len(buf) > 0 {\n\t\t_p0 = &buf[0]\n\t}\n\tr0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0)\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ExitProcess(exitcode uint32) {\n\tsyscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0)\n\treturn\n}\n\nfunc CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0)\n\thandle = Handle(r0)\n\tif handle == InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) {\n\tvar _p0 *byte\n\tif len(buf) > 0 {\n\t\t_p0 = &buf[0]\n\t}\n\tr1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) {\n\tvar _p0 *byte\n\tif len(buf) > 0 {\n\t\t_p0 = &buf[0]\n\t}\n\tr1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) {\n\tr0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0)\n\tnewlowoffset = uint32(r0)\n\tif newlowoffset == 0xffffffff {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CloseHandle(handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetStdHandle(stdhandle uint32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0)\n\thandle = Handle(r0)\n\tif handle == InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetStdHandle(stdhandle uint32, handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0)\n\thandle = Handle(r0)\n\tif handle == InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc findNextFile1(handle Handle, data *win32finddata1) (err error) {\n\tr1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc FindClose(handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetCurrentDirectory(path *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc RemoveDirectory(path *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc DeleteFile(path *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc MoveFile(from *uint16, to *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetComputerName(buf *uint16, n *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetEndOfFile(handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetSystemTimeAsFileTime(time *Filetime) {\n\tsyscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0)\n\treturn\n}\n\nfunc GetSystemTimePreciseAsFileTime(time *Filetime) {\n\tsyscall.Syscall(procGetSystemTimePreciseAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0)\n\treturn\n}\n\nfunc GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0)\n\trc = uint32(r0)\n\tif rc == 0xffffffff {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0)\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CancelIo(s Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CancelIoEx(s Handle, o *Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) {\n\tvar _p0 uint32\n\tif inheritHandles {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) {\n\tvar _p0 uint32\n\tif inheritHandle {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid))\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc TerminateProcess(handle Handle, exitcode uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetStartupInfo(startupInfo *StartupInfo) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetCurrentProcess() (pseudoHandle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0)\n\tpseudoHandle = Handle(r0)\n\tif pseudoHandle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) {\n\tvar _p0 uint32\n\tif bInheritHandle {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0)\n\tevent = uint32(r0)\n\tif event == 0xffffffff {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetFileType(filehandle Handle) (n uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0)\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CryptReleaseContext(provhandle Handle, flags uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetEnvironmentStrings() (envs *uint16, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0)\n\tenvs = (*uint16)(unsafe.Pointer(r0))\n\tif envs == nil {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc FreeEnvironmentStrings(envs *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size))\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetEnvironmentVariable(name *uint16, value *uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetFileAttributes(name *uint16) (attrs uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)\n\tattrs = uint32(r0)\n\tif attrs == INVALID_FILE_ATTRIBUTES {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetFileAttributes(name *uint16, attrs uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetCommandLine() (cmd *uint16) {\n\tr0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0)\n\tcmd = (*uint16)(unsafe.Pointer(r0))\n\treturn\n}\n\nfunc CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) {\n\tr0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0)\n\targv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0))\n\tif argv == nil {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc LocalFree(hmem Handle) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0)\n\thandle = Handle(r0)\n\tif handle != 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc FlushFileBuffers(handle Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) {\n\tr0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0)\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen))\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) {\n\tr0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen))\n\tn = uint32(r0)\n\tif n == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name)))\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) {\n\tr0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0)\n\taddr = uintptr(r0)\n\tif addr == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc UnmapViewOfFile(addr uintptr) (err error) {\n\tr1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc FlushViewOfFile(addr uintptr, length uintptr) (err error) {\n\tr1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc VirtualLock(addr uintptr, length uintptr) (err error) {\n\tr1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc VirtualUnlock(addr uintptr, length uintptr) (err error) {\n\tr1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) {\n\tr0, _, e1 := syscall.Syscall6(procVirtualAlloc.Addr(), 4, uintptr(address), uintptr(size), uintptr(alloctype), uintptr(protect), 0, 0)\n\tvalue = uintptr(r0)\n\tif value == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procVirtualFree.Addr(), 3, uintptr(address), uintptr(size), uintptr(freetype))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procVirtualProtect.Addr(), 4, uintptr(address), uintptr(size), uintptr(newprotect), uintptr(unsafe.Pointer(oldprotect)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) {\n\tvar _p0 uint32\n\tif watchSubTree {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0)\n\tstore = Handle(r0)\n\tif store == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0)\n\thandle = Handle(r0)\n\tif handle == InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) {\n\tr0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0)\n\tcontext = (*CertContext)(unsafe.Pointer(r0))\n\tif context == nil {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertCloseStore(store Handle, flags uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertFreeCertificateChain(ctx *CertChainContext) {\n\tsyscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0)\n\treturn\n}\n\nfunc CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) {\n\tr0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen))\n\tcontext = (*CertContext)(unsafe.Pointer(r0))\n\tif context == nil {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertFreeCertificateContext(ctx *CertContext) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) {\n\tr0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0)\n\tif r0 != 0 {\n\t\tregerrno = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc RegCloseKey(key Handle) (regerrno error) {\n\tr0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0)\n\tif r0 != 0 {\n\t\tregerrno = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) {\n\tr0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime)))\n\tif r0 != 0 {\n\t\tregerrno = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) {\n\tr0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0)\n\tif r0 != 0 {\n\t\tregerrno = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) {\n\tr0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)))\n\tif r0 != 0 {\n\t\tregerrno = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc getCurrentProcessId() (pid uint32) {\n\tr0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0)\n\tpid = uint32(r0)\n\treturn\n}\n\nfunc GetConsoleMode(console Handle, mode *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetConsoleMode(console Handle, mode uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0)\n\thandle = Handle(r0)\n\tif handle == InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags))\n\tif r1&0xff == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved))\n\tif r1&0xff == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetCurrentThreadId() (id uint32) {\n\tr0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0)\n\tid = uint32(r0)\n\treturn\n}\n\nfunc CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0)\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall6(procCreateEventExW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0)\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) {\n\tvar _p0 uint32\n\tif inheritHandle {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr0, _, e1 := syscall.Syscall(procOpenEventW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name)))\n\thandle = Handle(r0)\n\tif handle == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc SetEvent(event Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ResetEvent(event Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc PulseEvent(event Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procPulseEvent.Addr(), 1, uintptr(event), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WSAStartup(verreq uint32, data *WSAData) (sockerr error) {\n\tr0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0)\n\tif r0 != 0 {\n\t\tsockerr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc WSACleanup() (err error) {\n\tr1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc socket(af int32, typ int32, protocol int32) (handle Handle, err error) {\n\tr0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol))\n\thandle = Handle(r0)\n\tif handle == InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc bind(s Handle, name unsafe.Pointer, namelen int32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc connect(s Handle, name unsafe.Pointer, namelen int32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc listen(s Handle, backlog int32) (err error) {\n\tr1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc shutdown(s Handle, how int32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc Closesocket(s Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) {\n\tsyscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0)\n\treturn\n}\n\nfunc WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))\n\tif r1 == socket_error {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetHostByName(name string) (h *Hostent, err error) {\n\tvar _p0 *byte\n\t_p0, err = syscall.BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _GetHostByName(_p0)\n}\n\nfunc _GetHostByName(name *byte) (h *Hostent, err error) {\n\tr0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)\n\th = (*Hostent)(unsafe.Pointer(r0))\n\tif h == nil {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetServByName(name string, proto string) (s *Servent, err error) {\n\tvar _p0 *byte\n\t_p0, err = syscall.BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\tvar _p1 *byte\n\t_p1, err = syscall.BytePtrFromString(proto)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _GetServByName(_p0, _p1)\n}\n\nfunc _GetServByName(name *byte, proto *byte) (s *Servent, err error) {\n\tr0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0)\n\ts = (*Servent)(unsafe.Pointer(r0))\n\tif s == nil {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc Ntohs(netshort uint16) (u uint16) {\n\tr0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0)\n\tu = uint16(r0)\n\treturn\n}\n\nfunc GetProtoByName(name string) (p *Protoent, err error) {\n\tvar _p0 *byte\n\t_p0, err = syscall.BytePtrFromString(name)\n\tif err != nil {\n\t\treturn\n\t}\n\treturn _GetProtoByName(_p0)\n}\n\nfunc _GetProtoByName(name *byte) (p *Protoent, err error) {\n\tr0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)\n\tp = (*Protoent)(unsafe.Pointer(r0))\n\tif p == nil {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) {\n\tvar _p0 *uint16\n\t_p0, status = syscall.UTF16PtrFromString(name)\n\tif status != nil {\n\t\treturn\n\t}\n\treturn _DnsQuery(_p0, qtype, options, extra, qrs, pr)\n}\n\nfunc _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) {\n\tr0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr)))\n\tif r0 != 0 {\n\t\tstatus = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc DnsRecordListFree(rl *DNSRecord, freetype uint32) {\n\tsyscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0)\n\treturn\n}\n\nfunc DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) {\n\tr0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0)\n\tsame = r0 != 0\n\treturn\n}\n\nfunc GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) {\n\tr0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0)\n\tif r0 != 0 {\n\t\tsockerr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc FreeAddrInfoW(addrinfo *AddrinfoW) {\n\tsyscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0)\n\treturn\n}\n\nfunc GetIfEntry(pIfRow *MibIfRow) (errcode error) {\n\tr0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0)\n\tif r0 != 0 {\n\t\terrcode = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) {\n\tr0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0)\n\tif r0 != 0 {\n\t\terrcode = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) {\n\tr1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) {\n\tr0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength)))\n\tn = int32(r0)\n\tif n == -1 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) {\n\tr0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0)\n\tif r0 != 0 {\n\t\terrcode = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc GetACP() (acp uint32) {\n\tr0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0)\n\tacp = uint32(r0)\n\treturn\n}\n\nfunc MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) {\n\tr0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar))\n\tnwrite = int32(r0)\n\tif nwrite == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0)\n\tif r1&0xff == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize)))\n\tif r1&0xff == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) {\n\tr0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif r0 != 0 {\n\t\tneterr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) {\n\tr0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType)))\n\tif r0 != 0 {\n\t\tneterr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc NetApiBufferFree(buf *byte) (neterr error) {\n\tr0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0)\n\tif r0 != 0 {\n\t\tneterr = syscall.Errno(r0)\n\t}\n\treturn\n}\n\nfunc LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) {\n\tr1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) {\n\tr1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetLengthSid(sid *SID) (len uint32) {\n\tr0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0)\n\tlen = uint32(r0)\n\treturn\n}\n\nfunc CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) {\n\tr1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc FreeSid(sid *SID) (err error) {\n\tr1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0)\n\tif r1 != 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) {\n\tr0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0)\n\tisEqual = r0 != 0\n\treturn\n}\n\nfunc OpenProcessToken(h Handle, access uint32, token *Token) (err error) {\n\tr1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen)))\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = errnoErr(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/.gitattributes",
    "content": "# Treat all files in this repo as binary, with no git magic updating\n# line endings. Windows users contributing to Go will need to use a\n# modern version of git and editors capable of LF line endings.\n#\n# We'll prevent accidental CRLF line endings from entering the repo\n# via the git-review gofmt checks.\n#\n# See golang.org/issue/9281\n\n* -text\n"
  },
  {
    "path": "vendor/golang.org/x/text/.gitignore",
    "content": "# Add no patterns to .gitignore except for files generated by the build.\nlast-change\n/DATA\n"
  },
  {
    "path": "vendor/golang.org/x/text/AUTHORS",
    "content": "# This source code refers to The Go Authors for copyright purposes.\n# The master list of authors is in the main Go distribution,\n# visible at http://tip.golang.org/AUTHORS.\n"
  },
  {
    "path": "vendor/golang.org/x/text/CONTRIBUTING.md",
    "content": "# Contributing to Go\n\nGo is an open source project.\n\nIt is the work of hundreds of contributors. We appreciate your help!\n\n\n## Filing issues\n\nWhen [filing an issue](https://golang.org/issue/new), make sure to answer these five questions:\n\n1. What version of Go are you using (`go version`)?\n2. What operating system and processor architecture are you using?\n3. What did you do?\n4. What did you expect to see?\n5. What did you see instead?\n\nGeneral questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.\nThe gophers there will answer or ask you to file an issue if you've tripped over a bug.\n\n## Contributing code\n\nPlease read the [Contribution Guidelines](https://golang.org/doc/contribute.html)\nbefore sending patches.\n\n**We do not accept GitHub pull requests**\n(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review).\n\nUnless otherwise noted, the Go source files are distributed under\nthe BSD-style license found in the LICENSE file.\n\n"
  },
  {
    "path": "vendor/golang.org/x/text/CONTRIBUTORS",
    "content": "# This source code was written by the Go contributors.\n# The master list of contributors is in the main Go distribution,\n# visible at http://tip.golang.org/CONTRIBUTORS.\n"
  },
  {
    "path": "vendor/golang.org/x/text/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/golang.org/x/text/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "vendor/golang.org/x/text/README",
    "content": "This repository holds supplementary Go libraries for text processing, many involving Unicode.\n\nTo submit changes to this repository, see http://golang.org/doc/contribute.html.\n\nTo generate the tables in this repository (except for the encoding tables),\nrun go generate from this directory. By default tables are generated for the\nUnicode version in core and the CLDR version defined in\ngolang.org/x/text/unicode/cldr.\n\nRunning go generate will as a side effect create a DATA subdirectory in this\ndirectory which holds all files that are used as a source for generating the\ntables. This directory will also serve as a cache.\n\nRun\n\n\tgo test ./...\n\nfrom this directory to run all tests. Add the \"-tags icu\" flag to also run\nICU conformance tests (if available). This requires that you have the correct\nICU version installed on your system.\n\nTODO:\n- updating unversioned source files."
  },
  {
    "path": "vendor/golang.org/x/text/codereview.cfg",
    "content": "issuerepo: golang/go\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/charmap/charmap.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:generate go run maketables.go\n\n// Package charmap provides simple character encodings such as IBM Code Page 437\n// and Windows 1252.\npackage charmap // import \"golang.org/x/text/encoding/charmap\"\n\nimport (\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// These encodings vary only in the way clients should interpret them. Their\n// coded character set is identical and a single implementation can be shared.\nvar (\n\t// ISO8859_6E is the ISO 8859-6E encoding.\n\tISO8859_6E encoding.Encoding = &iso8859_6E\n\n\t// ISO8859_6I is the ISO 8859-6I encoding.\n\tISO8859_6I encoding.Encoding = &iso8859_6I\n\n\t// ISO8859_8E is the ISO 8859-8E encoding.\n\tISO8859_8E encoding.Encoding = &iso8859_8E\n\n\t// ISO8859_8I is the ISO 8859-8I encoding.\n\tISO8859_8I encoding.Encoding = &iso8859_8I\n\n\tiso8859_6E = internal.Encoding{\n\t\tISO8859_6,\n\t\t\"ISO-8859-6E\",\n\t\tidentifier.ISO88596E,\n\t}\n\n\tiso8859_6I = internal.Encoding{\n\t\tISO8859_6,\n\t\t\"ISO-8859-6I\",\n\t\tidentifier.ISO88596I,\n\t}\n\n\tiso8859_8E = internal.Encoding{\n\t\tISO8859_8,\n\t\t\"ISO-8859-8E\",\n\t\tidentifier.ISO88598E,\n\t}\n\n\tiso8859_8I = internal.Encoding{\n\t\tISO8859_8,\n\t\t\"ISO-8859-8I\",\n\t\tidentifier.ISO88598I,\n\t}\n)\n\n// All is a list of all defined encodings in this package.\nvar All = listAll\n\n// TODO: implement these encodings, in order of importance.\n// ASCII, ISO8859_1:       Rather common. Close to Windows 1252.\n// ISO8859_9:              Close to Windows 1254.\n\n// utf8Enc holds a rune's UTF-8 encoding in data[:len].\ntype utf8Enc struct {\n\tlen  uint8\n\tdata [3]byte\n}\n\n// charmap describes an 8-bit character set encoding.\ntype charmap struct {\n\t// name is the encoding's name.\n\tname string\n\t// mib is the encoding type of this encoder.\n\tmib identifier.MIB\n\t// asciiSuperset states whether the encoding is a superset of ASCII.\n\tasciiSuperset bool\n\t// low is the lower bound of the encoded byte for a non-ASCII rune. If\n\t// charmap.asciiSuperset is true then this will be 0x80, otherwise 0x00.\n\tlow uint8\n\t// replacement is the encoded replacement character.\n\treplacement byte\n\t// decode is the map from encoded byte to UTF-8.\n\tdecode [256]utf8Enc\n\t// encoding is the map from runes to encoded bytes. Each entry is a\n\t// uint32: the high 8 bits are the encoded byte and the low 24 bits are\n\t// the rune. The table entries are sorted by ascending rune.\n\tencode [256]uint32\n}\n\nfunc (m *charmap) NewDecoder() *encoding.Decoder {\n\treturn &encoding.Decoder{Transformer: charmapDecoder{charmap: m}}\n}\n\nfunc (m *charmap) NewEncoder() *encoding.Encoder {\n\treturn &encoding.Encoder{Transformer: charmapEncoder{charmap: m}}\n}\n\nfunc (m *charmap) String() string {\n\treturn m.name\n}\n\nfunc (m *charmap) ID() (mib identifier.MIB, other string) {\n\treturn m.mib, \"\"\n}\n\n// charmapDecoder implements transform.Transformer by decoding to UTF-8.\ntype charmapDecoder struct {\n\ttransform.NopResetter\n\tcharmap *charmap\n}\n\nfunc (m charmapDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tfor i, c := range src {\n\t\tif m.charmap.asciiSuperset && c < utf8.RuneSelf {\n\t\t\tif nDst >= len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst] = c\n\t\t\tnDst++\n\t\t\tnSrc = i + 1\n\t\t\tcontinue\n\t\t}\n\n\t\tdecode := &m.charmap.decode[c]\n\t\tn := int(decode.len)\n\t\tif nDst+n > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\t// It's 15% faster to avoid calling copy for these tiny slices.\n\t\tfor j := 0; j < n; j++ {\n\t\t\tdst[nDst] = decode.data[j]\n\t\t\tnDst++\n\t\t}\n\t\tnSrc = i + 1\n\t}\n\treturn nDst, nSrc, err\n}\n\n// charmapEncoder implements transform.Transformer by encoding from UTF-8.\ntype charmapEncoder struct {\n\ttransform.NopResetter\n\tcharmap *charmap\n}\n\nfunc (m charmapEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor nSrc < len(src) {\n\t\tif nDst >= len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tif m.charmap.asciiSuperset {\n\t\t\t\tnSrc++\n\t\t\t\tdst[nDst] = uint8(r)\n\t\t\t\tnDst++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsize = 1\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t} else {\n\t\t\t\t\terr = internal.RepertoireError(m.charmap.replacement)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\t// Binary search in [low, high) for that rune in the m.charmap.encode table.\n\t\tfor low, high := int(m.charmap.low), 0x100; ; {\n\t\t\tif low >= high {\n\t\t\t\terr = internal.RepertoireError(m.charmap.replacement)\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tmid := (low + high) / 2\n\t\t\tgot := m.charmap.encode[mid]\n\t\t\tgotRune := rune(got & (1<<24 - 1))\n\t\t\tif gotRune < r {\n\t\t\t\tlow = mid + 1\n\t\t\t} else if gotRune > r {\n\t\t\t\thigh = mid\n\t\t\t} else {\n\t\t\t\tdst[nDst] = byte(got >> 24)\n\t\t\t\tnDst++\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tnSrc += size\n\t}\n\treturn nDst, nSrc, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/charmap/maketables.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"sort\"\n\t\"strings\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/internal/gen\"\n)\n\nconst ascii = \"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\" +\n\t\"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f\" +\n\t` !\"#$%&'()*+,-./0123456789:;<=>?` +\n\t`@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_` +\n\t\"`abcdefghijklmnopqrstuvwxyz{|}~\\u007f\"\n\nvar encodings = []struct {\n\tname        string\n\tmib         string\n\tcomment     string\n\tvarName     string\n\treplacement byte\n\tmapping     string\n}{\n\t{\n\t\t\"IBM Code Page 037\",\n\t\t\"IBM037\",\n\t\t\"\",\n\t\t\"CodePage037\",\n\t\t0x3f,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM037-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 437\",\n\t\t\"PC8CodePage437\",\n\t\t\"\",\n\t\t\"CodePage437\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM437-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 850\",\n\t\t\"PC850Multilingual\",\n\t\t\"\",\n\t\t\"CodePage850\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM850-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 852\",\n\t\t\"PCp852\",\n\t\t\"\",\n\t\t\"CodePage852\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM852-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 855\",\n\t\t\"IBM855\",\n\t\t\"\",\n\t\t\"CodePage855\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM855-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"Windows Code Page 858\", // PC latin1 with Euro\n\t\t\"IBM00858\",\n\t\t\"\",\n\t\t\"CodePage858\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/windows-858-2000.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 860\",\n\t\t\"IBM860\",\n\t\t\"\",\n\t\t\"CodePage860\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM860-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 862\",\n\t\t\"PC862LatinHebrew\",\n\t\t\"\",\n\t\t\"CodePage862\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM862-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 863\",\n\t\t\"IBM863\",\n\t\t\"\",\n\t\t\"CodePage863\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM863-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 865\",\n\t\t\"IBM865\",\n\t\t\"\",\n\t\t\"CodePage865\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM865-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 866\",\n\t\t\"IBM866\",\n\t\t\"\",\n\t\t\"CodePage866\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-ibm866.txt\",\n\t},\n\t{\n\t\t\"IBM Code Page 1047\",\n\t\t\"IBM1047\",\n\t\t\"\",\n\t\t\"CodePage1047\",\n\t\t0x3f,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/glibc-IBM1047-2.1.2.ucm\",\n\t},\n\t{\n\t\t\"IBM Code Page 1140\",\n\t\t\"IBM01140\",\n\t\t\"\",\n\t\t\"CodePage1140\",\n\t\t0x3f,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/ibm-1140_P100-1997.ucm\",\n\t},\n\t{\n\t\t\"ISO 8859-1\",\n\t\t\"ISOLatin1\",\n\t\t\"\",\n\t\t\"ISO8859_1\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_1-1998.ucm\",\n\t},\n\t{\n\t\t\"ISO 8859-2\",\n\t\t\"ISOLatin2\",\n\t\t\"\",\n\t\t\"ISO8859_2\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-2.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-3\",\n\t\t\"ISOLatin3\",\n\t\t\"\",\n\t\t\"ISO8859_3\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-3.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-4\",\n\t\t\"ISOLatin4\",\n\t\t\"\",\n\t\t\"ISO8859_4\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-4.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-5\",\n\t\t\"ISOLatinCyrillic\",\n\t\t\"\",\n\t\t\"ISO8859_5\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-5.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-6\",\n\t\t\"ISOLatinArabic\",\n\t\t\"\",\n\t\t\"ISO8859_6,ISO8859_6E,ISO8859_6I\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-6.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-7\",\n\t\t\"ISOLatinGreek\",\n\t\t\"\",\n\t\t\"ISO8859_7\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-7.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-8\",\n\t\t\"ISOLatinHebrew\",\n\t\t\"\",\n\t\t\"ISO8859_8,ISO8859_8E,ISO8859_8I\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-8.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-9\",\n\t\t\"ISOLatin5\",\n\t\t\"\",\n\t\t\"ISO8859_9\",\n\t\tencoding.ASCIISub,\n\t\t\"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/iso-8859_9-1999.ucm\",\n\t},\n\t{\n\t\t\"ISO 8859-10\",\n\t\t\"ISOLatin6\",\n\t\t\"\",\n\t\t\"ISO8859_10\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-10.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-13\",\n\t\t\"ISO885913\",\n\t\t\"\",\n\t\t\"ISO8859_13\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-13.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-14\",\n\t\t\"ISO885914\",\n\t\t\"\",\n\t\t\"ISO8859_14\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-14.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-15\",\n\t\t\"ISO885915\",\n\t\t\"\",\n\t\t\"ISO8859_15\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-15.txt\",\n\t},\n\t{\n\t\t\"ISO 8859-16\",\n\t\t\"ISO885916\",\n\t\t\"\",\n\t\t\"ISO8859_16\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-iso-8859-16.txt\",\n\t},\n\t{\n\t\t\"KOI8-R\",\n\t\t\"KOI8R\",\n\t\t\"\",\n\t\t\"KOI8R\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-koi8-r.txt\",\n\t},\n\t{\n\t\t\"KOI8-U\",\n\t\t\"KOI8U\",\n\t\t\"\",\n\t\t\"KOI8U\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-koi8-u.txt\",\n\t},\n\t{\n\t\t\"Macintosh\",\n\t\t\"Macintosh\",\n\t\t\"\",\n\t\t\"Macintosh\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-macintosh.txt\",\n\t},\n\t{\n\t\t\"Macintosh Cyrillic\",\n\t\t\"MacintoshCyrillic\",\n\t\t\"\",\n\t\t\"MacintoshCyrillic\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-x-mac-cyrillic.txt\",\n\t},\n\t{\n\t\t\"Windows 874\",\n\t\t\"Windows874\",\n\t\t\"\",\n\t\t\"Windows874\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-874.txt\",\n\t},\n\t{\n\t\t\"Windows 1250\",\n\t\t\"Windows1250\",\n\t\t\"\",\n\t\t\"Windows1250\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1250.txt\",\n\t},\n\t{\n\t\t\"Windows 1251\",\n\t\t\"Windows1251\",\n\t\t\"\",\n\t\t\"Windows1251\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1251.txt\",\n\t},\n\t{\n\t\t\"Windows 1252\",\n\t\t\"Windows1252\",\n\t\t\"\",\n\t\t\"Windows1252\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1252.txt\",\n\t},\n\t{\n\t\t\"Windows 1253\",\n\t\t\"Windows1253\",\n\t\t\"\",\n\t\t\"Windows1253\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1253.txt\",\n\t},\n\t{\n\t\t\"Windows 1254\",\n\t\t\"Windows1254\",\n\t\t\"\",\n\t\t\"Windows1254\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1254.txt\",\n\t},\n\t{\n\t\t\"Windows 1255\",\n\t\t\"Windows1255\",\n\t\t\"\",\n\t\t\"Windows1255\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1255.txt\",\n\t},\n\t{\n\t\t\"Windows 1256\",\n\t\t\"Windows1256\",\n\t\t\"\",\n\t\t\"Windows1256\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1256.txt\",\n\t},\n\t{\n\t\t\"Windows 1257\",\n\t\t\"Windows1257\",\n\t\t\"\",\n\t\t\"Windows1257\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1257.txt\",\n\t},\n\t{\n\t\t\"Windows 1258\",\n\t\t\"Windows1258\",\n\t\t\"\",\n\t\t\"Windows1258\",\n\t\tencoding.ASCIISub,\n\t\t\"http://encoding.spec.whatwg.org/index-windows-1258.txt\",\n\t},\n\t{\n\t\t\"X-User-Defined\",\n\t\t\"XUserDefined\",\n\t\t\"It is defined at http://encoding.spec.whatwg.org/#x-user-defined\",\n\t\t\"XUserDefined\",\n\t\tencoding.ASCIISub,\n\t\tascii +\n\t\t\t\"\\uf780\\uf781\\uf782\\uf783\\uf784\\uf785\\uf786\\uf787\" +\n\t\t\t\"\\uf788\\uf789\\uf78a\\uf78b\\uf78c\\uf78d\\uf78e\\uf78f\" +\n\t\t\t\"\\uf790\\uf791\\uf792\\uf793\\uf794\\uf795\\uf796\\uf797\" +\n\t\t\t\"\\uf798\\uf799\\uf79a\\uf79b\\uf79c\\uf79d\\uf79e\\uf79f\" +\n\t\t\t\"\\uf7a0\\uf7a1\\uf7a2\\uf7a3\\uf7a4\\uf7a5\\uf7a6\\uf7a7\" +\n\t\t\t\"\\uf7a8\\uf7a9\\uf7aa\\uf7ab\\uf7ac\\uf7ad\\uf7ae\\uf7af\" +\n\t\t\t\"\\uf7b0\\uf7b1\\uf7b2\\uf7b3\\uf7b4\\uf7b5\\uf7b6\\uf7b7\" +\n\t\t\t\"\\uf7b8\\uf7b9\\uf7ba\\uf7bb\\uf7bc\\uf7bd\\uf7be\\uf7bf\" +\n\t\t\t\"\\uf7c0\\uf7c1\\uf7c2\\uf7c3\\uf7c4\\uf7c5\\uf7c6\\uf7c7\" +\n\t\t\t\"\\uf7c8\\uf7c9\\uf7ca\\uf7cb\\uf7cc\\uf7cd\\uf7ce\\uf7cf\" +\n\t\t\t\"\\uf7d0\\uf7d1\\uf7d2\\uf7d3\\uf7d4\\uf7d5\\uf7d6\\uf7d7\" +\n\t\t\t\"\\uf7d8\\uf7d9\\uf7da\\uf7db\\uf7dc\\uf7dd\\uf7de\\uf7df\" +\n\t\t\t\"\\uf7e0\\uf7e1\\uf7e2\\uf7e3\\uf7e4\\uf7e5\\uf7e6\\uf7e7\" +\n\t\t\t\"\\uf7e8\\uf7e9\\uf7ea\\uf7eb\\uf7ec\\uf7ed\\uf7ee\\uf7ef\" +\n\t\t\t\"\\uf7f0\\uf7f1\\uf7f2\\uf7f3\\uf7f4\\uf7f5\\uf7f6\\uf7f7\" +\n\t\t\t\"\\uf7f8\\uf7f9\\uf7fa\\uf7fb\\uf7fc\\uf7fd\\uf7fe\\uf7ff\",\n\t},\n}\n\nfunc getWHATWG(url string) string {\n\tres, err := http.Get(url)\n\tif err != nil {\n\t\tlog.Fatalf(\"%q: Get: %v\", url, err)\n\t}\n\tdefer res.Body.Close()\n\n\tmapping := make([]rune, 128)\n\tfor i := range mapping {\n\t\tmapping[i] = '\\ufffd'\n\t}\n\n\tscanner := bufio.NewScanner(res.Body)\n\tfor scanner.Scan() {\n\t\ts := strings.TrimSpace(scanner.Text())\n\t\tif s == \"\" || s[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\tx, y := 0, 0\n\t\tif _, err := fmt.Sscanf(s, \"%d\\t0x%x\", &x, &y); err != nil {\n\t\t\tlog.Fatalf(\"could not parse %q\", s)\n\t\t}\n\t\tif x < 0 || 128 <= x {\n\t\t\tlog.Fatalf(\"code %d is out of range\", x)\n\t\t}\n\t\tif 0x80 <= y && y < 0xa0 {\n\t\t\t// We diverge from the WHATWG spec by mapping control characters\n\t\t\t// in the range [0x80, 0xa0) to U+FFFD.\n\t\t\tcontinue\n\t\t}\n\t\tmapping[x] = rune(y)\n\t}\n\treturn ascii + string(mapping)\n}\n\nfunc getUCM(url string) string {\n\tres, err := http.Get(url)\n\tif err != nil {\n\t\tlog.Fatalf(\"%q: Get: %v\", url, err)\n\t}\n\tdefer res.Body.Close()\n\n\tmapping := make([]rune, 256)\n\tfor i := range mapping {\n\t\tmapping[i] = '\\ufffd'\n\t}\n\n\tcharsFound := 0\n\tscanner := bufio.NewScanner(res.Body)\n\tfor scanner.Scan() {\n\t\ts := strings.TrimSpace(scanner.Text())\n\t\tif s == \"\" || s[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\tvar c byte\n\t\tvar r rune\n\t\tif _, err := fmt.Sscanf(s, `<U%x> \\x%x |0`, &r, &c); err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tmapping[c] = r\n\t\tcharsFound++\n\t}\n\n\tif charsFound < 200 {\n\t\tlog.Fatalf(\"%q: only %d characters found (wrong page format?)\", url, charsFound)\n\t}\n\n\treturn string(mapping)\n}\n\nfunc main() {\n\tmibs := map[string]bool{}\n\tall := []string{}\n\n\tw := gen.NewCodeWriter()\n\tdefer w.WriteGoFile(\"tables.go\", \"charmap\")\n\n\tprintf := func(s string, a ...interface{}) { fmt.Fprintf(w, s, a...) }\n\n\tprintf(\"import (\\n\")\n\tprintf(\"\\t\\\"golang.org/x/text/encoding\\\"\\n\")\n\tprintf(\"\\t\\\"golang.org/x/text/encoding/internal/identifier\\\"\\n\")\n\tprintf(\")\\n\\n\")\n\tfor _, e := range encodings {\n\t\tvarNames := strings.Split(e.varName, \",\")\n\t\tall = append(all, varNames...)\n\t\tvarName := varNames[0]\n\t\tswitch {\n\t\tcase strings.HasPrefix(e.mapping, \"http://encoding.spec.whatwg.org/\"):\n\t\t\te.mapping = getWHATWG(e.mapping)\n\t\tcase strings.HasPrefix(e.mapping, \"http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/\"):\n\t\t\te.mapping = getUCM(e.mapping)\n\t\t}\n\n\t\tasciiSuperset, low := strings.HasPrefix(e.mapping, ascii), 0x00\n\t\tif asciiSuperset {\n\t\t\tlow = 0x80\n\t\t}\n\t\tlvn := 1\n\t\tif strings.HasPrefix(varName, \"ISO\") || strings.HasPrefix(varName, \"KOI\") {\n\t\t\tlvn = 3\n\t\t}\n\t\tlowerVarName := strings.ToLower(varName[:lvn]) + varName[lvn:]\n\t\tprintf(\"// %s is the %s encoding.\\n\", varName, e.name)\n\t\tif e.comment != \"\" {\n\t\t\tprintf(\"//\\n// %s\\n\", e.comment)\n\t\t}\n\t\tprintf(\"var %s encoding.Encoding = &%s\\n\\nvar %s = charmap{\\nname: %q,\\n\",\n\t\t\tvarName, lowerVarName, lowerVarName, e.name)\n\t\tif mibs[e.mib] {\n\t\t\tlog.Fatalf(\"MIB type %q declared multiple times.\", e.mib)\n\t\t}\n\t\tprintf(\"mib: identifier.%s,\\n\", e.mib)\n\t\tprintf(\"asciiSuperset: %t,\\n\", asciiSuperset)\n\t\tprintf(\"low: 0x%02x,\\n\", low)\n\t\tprintf(\"replacement: 0x%02x,\\n\", e.replacement)\n\n\t\tprintf(\"decode: [256]utf8Enc{\\n\")\n\t\ti, backMapping := 0, map[rune]byte{}\n\t\tfor _, c := range e.mapping {\n\t\t\tif _, ok := backMapping[c]; !ok && c != utf8.RuneError {\n\t\t\t\tbackMapping[c] = byte(i)\n\t\t\t}\n\t\t\tvar buf [8]byte\n\t\t\tn := utf8.EncodeRune(buf[:], c)\n\t\t\tif n > 3 {\n\t\t\t\tpanic(fmt.Sprintf(\"rune %q (%U) is too long\", c, c))\n\t\t\t}\n\t\t\tprintf(\"{%d,[3]byte{0x%02x,0x%02x,0x%02x}},\", n, buf[0], buf[1], buf[2])\n\t\t\tif i%2 == 1 {\n\t\t\t\tprintf(\"\\n\")\n\t\t\t}\n\t\t\ti++\n\t\t}\n\t\tprintf(\"},\\n\")\n\n\t\tprintf(\"encode: [256]uint32{\\n\")\n\t\tencode := make([]uint32, 0, 256)\n\t\tfor c, i := range backMapping {\n\t\t\tencode = append(encode, uint32(i)<<24|uint32(c))\n\t\t}\n\t\tsort.Sort(byRune(encode))\n\t\tfor len(encode) < cap(encode) {\n\t\t\tencode = append(encode, encode[len(encode)-1])\n\t\t}\n\t\tfor i, enc := range encode {\n\t\t\tprintf(\"0x%08x,\", enc)\n\t\t\tif i%8 == 7 {\n\t\t\t\tprintf(\"\\n\")\n\t\t\t}\n\t\t}\n\t\tprintf(\"},\\n}\\n\")\n\n\t\t// Add an estimate of the size of a single charmap{} struct value, which\n\t\t// includes two 256 elem arrays of 4 bytes and some extra fields, which\n\t\t// align to 3 uint64s on 64-bit architectures.\n\t\tw.Size += 2*4*256 + 3*8\n\t}\n\t// TODO: add proper line breaking.\n\tprintf(\"var listAll = []encoding.Encoding{\\n%s,\\n}\\n\\n\", strings.Join(all, \",\\n\"))\n}\n\ntype byRune []uint32\n\nfunc (b byRune) Len() int           { return len(b) }\nfunc (b byRune) Less(i, j int) bool { return b[i]&0xffffff < b[j]&0xffffff }\nfunc (b byRune) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/charmap/tables.go",
    "content": "// This file was generated by go generate; DO NOT EDIT\n\npackage charmap\n\nimport (\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n)\n\n// CodePage037 is the IBM Code Page 037 encoding.\nvar CodePage037 encoding.Encoding = &codePage037\n\nvar codePage037 = charmap{\n\tname:          \"IBM Code Page 037\",\n\tmib:           identifier.IBM037,\n\tasciiSuperset: false,\n\tlow:           0x00,\n\treplacement:   0x3f,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9c, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x86, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8e, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x84, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8c, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x96, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9e, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3b, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}},\n\t\t{1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}},\n\t\t{1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}},\n\t\t{1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}},\n\t\t{1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}},\n\t\t{1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}},\n\t\t{1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}},\n\t\t{1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}},\n\t\t{1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}},\n\t\t{1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}},\n\t\t{1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x37000004, 0x2d000005, 0x2e000006, 0x2f000007,\n\t\t0x16000008, 0x05000009, 0x2500000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x3c000014, 0x3d000015, 0x32000016, 0x26000017,\n\t\t0x18000018, 0x19000019, 0x3f00001a, 0x2700001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x40000020, 0x5a000021, 0x7f000022, 0x7b000023, 0x5b000024, 0x6c000025, 0x50000026, 0x7d000027,\n\t\t0x4d000028, 0x5d000029, 0x5c00002a, 0x4e00002b, 0x6b00002c, 0x6000002d, 0x4b00002e, 0x6100002f,\n\t\t0xf0000030, 0xf1000031, 0xf2000032, 0xf3000033, 0xf4000034, 0xf5000035, 0xf6000036, 0xf7000037,\n\t\t0xf8000038, 0xf9000039, 0x7a00003a, 0x5e00003b, 0x4c00003c, 0x7e00003d, 0x6e00003e, 0x6f00003f,\n\t\t0x7c000040, 0xc1000041, 0xc2000042, 0xc3000043, 0xc4000044, 0xc5000045, 0xc6000046, 0xc7000047,\n\t\t0xc8000048, 0xc9000049, 0xd100004a, 0xd200004b, 0xd300004c, 0xd400004d, 0xd500004e, 0xd600004f,\n\t\t0xd7000050, 0xd8000051, 0xd9000052, 0xe2000053, 0xe3000054, 0xe4000055, 0xe5000056, 0xe6000057,\n\t\t0xe7000058, 0xe8000059, 0xe900005a, 0xba00005b, 0xe000005c, 0xbb00005d, 0xb000005e, 0x6d00005f,\n\t\t0x79000060, 0x81000061, 0x82000062, 0x83000063, 0x84000064, 0x85000065, 0x86000066, 0x87000067,\n\t\t0x88000068, 0x89000069, 0x9100006a, 0x9200006b, 0x9300006c, 0x9400006d, 0x9500006e, 0x9600006f,\n\t\t0x97000070, 0x98000071, 0x99000072, 0xa2000073, 0xa3000074, 0xa4000075, 0xa5000076, 0xa6000077,\n\t\t0xa7000078, 0xa8000079, 0xa900007a, 0xc000007b, 0x4f00007c, 0xd000007d, 0xa100007e, 0x0700007f,\n\t\t0x20000080, 0x21000081, 0x22000082, 0x23000083, 0x24000084, 0x15000085, 0x06000086, 0x17000087,\n\t\t0x28000088, 0x29000089, 0x2a00008a, 0x2b00008b, 0x2c00008c, 0x0900008d, 0x0a00008e, 0x1b00008f,\n\t\t0x30000090, 0x31000091, 0x1a000092, 0x33000093, 0x34000094, 0x35000095, 0x36000096, 0x08000097,\n\t\t0x38000098, 0x39000099, 0x3a00009a, 0x3b00009b, 0x0400009c, 0x1400009d, 0x3e00009e, 0xff00009f,\n\t\t0x410000a0, 0xaa0000a1, 0x4a0000a2, 0xb10000a3, 0x9f0000a4, 0xb20000a5, 0x6a0000a6, 0xb50000a7,\n\t\t0xbd0000a8, 0xb40000a9, 0x9a0000aa, 0x8a0000ab, 0x5f0000ac, 0xca0000ad, 0xaf0000ae, 0xbc0000af,\n\t\t0x900000b0, 0x8f0000b1, 0xea0000b2, 0xfa0000b3, 0xbe0000b4, 0xa00000b5, 0xb60000b6, 0xb30000b7,\n\t\t0x9d0000b8, 0xda0000b9, 0x9b0000ba, 0x8b0000bb, 0xb70000bc, 0xb80000bd, 0xb90000be, 0xab0000bf,\n\t\t0x640000c0, 0x650000c1, 0x620000c2, 0x660000c3, 0x630000c4, 0x670000c5, 0x9e0000c6, 0x680000c7,\n\t\t0x740000c8, 0x710000c9, 0x720000ca, 0x730000cb, 0x780000cc, 0x750000cd, 0x760000ce, 0x770000cf,\n\t\t0xac0000d0, 0x690000d1, 0xed0000d2, 0xee0000d3, 0xeb0000d4, 0xef0000d5, 0xec0000d6, 0xbf0000d7,\n\t\t0x800000d8, 0xfd0000d9, 0xfe0000da, 0xfb0000db, 0xfc0000dc, 0xad0000dd, 0xae0000de, 0x590000df,\n\t\t0x440000e0, 0x450000e1, 0x420000e2, 0x460000e3, 0x430000e4, 0x470000e5, 0x9c0000e6, 0x480000e7,\n\t\t0x540000e8, 0x510000e9, 0x520000ea, 0x530000eb, 0x580000ec, 0x550000ed, 0x560000ee, 0x570000ef,\n\t\t0x8c0000f0, 0x490000f1, 0xcd0000f2, 0xce0000f3, 0xcb0000f4, 0xcf0000f5, 0xcc0000f6, 0xe10000f7,\n\t\t0x700000f8, 0xdd0000f9, 0xde0000fa, 0xdb0000fb, 0xdc0000fc, 0x8d0000fd, 0x8e0000fe, 0xdf0000ff,\n\t},\n}\n\n// CodePage437 is the IBM Code Page 437 encoding.\nvar CodePage437 encoding.Encoding = &codePage437\n\nvar codePage437 = charmap{\n\tname:          \"IBM Code Page 437\",\n\tmib:           identifier.PC8CodePage437,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0x9d0000a5, 0xa60000aa, 0xae0000ab, 0xaa0000ac,\n\t\t0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc,\n\t\t0xab0000bd, 0xa80000bf, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, 0x900000c9, 0xa50000d1,\n\t\t0x990000d6, 0x9a0000dc, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0x840000e4, 0x860000e5,\n\t\t0x910000e6, 0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed,\n\t\t0x8c0000ee, 0x8b0000ef, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7,\n\t\t0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0x980000ff, 0x9f000192, 0xe2000393, 0xe9000398,\n\t\t0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3,\n\t\t0xe70003c4, 0xed0003c6, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229,\n\t\t0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500,\n\t\t0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c,\n\t\t0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555,\n\t\t0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d,\n\t\t0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565,\n\t\t0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580,\n\t\t0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage850 is the IBM Code Page 850 encoding.\nvar CodePage850 encoding.Encoding = &codePage850\n\nvar codePage850 = charmap{\n\tname:          \"IBM Code Page 850\",\n\tmib:           identifier.PC850Multilingual,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc2, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc2, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xc2, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xad0000a1, 0xbd0000a2, 0x9c0000a3, 0xcf0000a4, 0xbe0000a5, 0xdd0000a6, 0xf50000a7,\n\t\t0xf90000a8, 0xb80000a9, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xa90000ae, 0xee0000af,\n\t\t0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xfc0000b3, 0xef0000b4, 0xe60000b5, 0xf40000b6, 0xfa0000b7,\n\t\t0xf70000b8, 0xfb0000b9, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xf30000be, 0xa80000bf,\n\t\t0xb70000c0, 0xb50000c1, 0xb60000c2, 0xc70000c3, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7,\n\t\t0xd40000c8, 0x900000c9, 0xd20000ca, 0xd30000cb, 0xde0000cc, 0xd60000cd, 0xd70000ce, 0xd80000cf,\n\t\t0xd10000d0, 0xa50000d1, 0xe30000d2, 0xe00000d3, 0xe20000d4, 0xe50000d5, 0x990000d6, 0x9e0000d7,\n\t\t0x9d0000d8, 0xeb0000d9, 0xe90000da, 0xea0000db, 0x9a0000dc, 0xed0000dd, 0xe80000de, 0xe10000df,\n\t\t0x850000e0, 0xa00000e1, 0x830000e2, 0xc60000e3, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7,\n\t\t0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef,\n\t\t0xd00000f0, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0xe40000f5, 0x940000f6, 0xf60000f7,\n\t\t0x9b0000f8, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0xec0000fd, 0xe70000fe, 0x980000ff,\n\t\t0xd5000131, 0x9f000192, 0xf2002017, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514,\n\t\t0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551,\n\t\t0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569,\n\t\t0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage852 is the IBM Code Page 852 encoding.\nvar CodePage852 encoding.Encoding = &codePage852\n\nvar codePage852 = charmap{\n\tname:          \"IBM Code Page 852\",\n\tmib:           identifier.PCp852,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x82, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc4, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa5, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc5, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9e, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc5, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbc, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{2, [3]byte{0xc4, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8f, 0x00}}, {2, [3]byte{0xc5, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9b, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc5, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x84, 0x00}}, {2, [3]byte{0xc5, 0x88, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x99, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xcf0000a4, 0xf50000a7, 0xf90000a8, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xf80000b0,\n\t\t0xef0000b4, 0xf70000b8, 0xaf0000bb, 0xb50000c1, 0xb60000c2, 0x8e0000c4, 0x800000c7, 0x900000c9,\n\t\t0xd30000cb, 0xd60000cd, 0xd70000ce, 0xe00000d3, 0xe20000d4, 0x990000d6, 0x9e0000d7, 0xe90000da,\n\t\t0x9a0000dc, 0xed0000dd, 0xe10000df, 0xa00000e1, 0x830000e2, 0x840000e4, 0x870000e7, 0x820000e9,\n\t\t0x890000eb, 0xa10000ed, 0x8c0000ee, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7, 0xa30000fa,\n\t\t0x810000fc, 0xec0000fd, 0xc6000102, 0xc7000103, 0xa4000104, 0xa5000105, 0x8f000106, 0x86000107,\n\t\t0xac00010c, 0x9f00010d, 0xd200010e, 0xd400010f, 0xd1000110, 0xd0000111, 0xa8000118, 0xa9000119,\n\t\t0xb700011a, 0xd800011b, 0x91000139, 0x9200013a, 0x9500013d, 0x9600013e, 0x9d000141, 0x88000142,\n\t\t0xe3000143, 0xe4000144, 0xd5000147, 0xe5000148, 0x8a000150, 0x8b000151, 0xe8000154, 0xea000155,\n\t\t0xfc000158, 0xfd000159, 0x9700015a, 0x9800015b, 0xb800015e, 0xad00015f, 0xe6000160, 0xe7000161,\n\t\t0xdd000162, 0xee000163, 0x9b000164, 0x9c000165, 0xde00016e, 0x8500016f, 0xeb000170, 0xfb000171,\n\t\t0x8d000179, 0xab00017a, 0xbd00017b, 0xbe00017c, 0xa600017d, 0xa700017e, 0xf30002c7, 0xf40002d8,\n\t\t0xfa0002d9, 0xf20002db, 0xf10002dd, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514,\n\t\t0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551,\n\t\t0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569,\n\t\t0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage855 is the IBM Code Page 855 encoding.\nvar CodePage855 encoding.Encoding = &codePage855\n\nvar codePage855 = charmap{\n\tname:          \"IBM Code Page 855\",\n\tmib:           identifier.IBM855,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x82, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x93, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x84, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x95, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x97, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xae, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0x94, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb5, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb3, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xd1, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x98, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xd0, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xd0, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xd0, 0xaf, 0x00}}, {2, [3]byte{0xd1, 0x80, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa1, 0x00}}, {2, [3]byte{0xd1, 0x82, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa3, 0x00}}, {2, [3]byte{0xd0, 0xb6, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd1, 0x8c, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}},\n\t\t{2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xab, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa9, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xcf0000a4, 0xfd0000a7, 0xae0000ab, 0xf00000ad, 0xaf0000bb, 0x85000401, 0x81000402,\n\t\t0x83000403, 0x87000404, 0x89000405, 0x8b000406, 0x8d000407, 0x8f000408, 0x91000409, 0x9300040a,\n\t\t0x9500040b, 0x9700040c, 0x9900040e, 0x9b00040f, 0xa1000410, 0xa3000411, 0xec000412, 0xad000413,\n\t\t0xa7000414, 0xa9000415, 0xea000416, 0xf4000417, 0xb8000418, 0xbe000419, 0xc700041a, 0xd100041b,\n\t\t0xd300041c, 0xd500041d, 0xd700041e, 0xdd00041f, 0xe2000420, 0xe4000421, 0xe6000422, 0xe8000423,\n\t\t0xab000424, 0xb6000425, 0xa5000426, 0xfc000427, 0xf6000428, 0xfa000429, 0x9f00042a, 0xf200042b,\n\t\t0xee00042c, 0xf800042d, 0x9d00042e, 0xe000042f, 0xa0000430, 0xa2000431, 0xeb000432, 0xac000433,\n\t\t0xa6000434, 0xa8000435, 0xe9000436, 0xf3000437, 0xb7000438, 0xbd000439, 0xc600043a, 0xd000043b,\n\t\t0xd200043c, 0xd400043d, 0xd600043e, 0xd800043f, 0xe1000440, 0xe3000441, 0xe5000442, 0xe7000443,\n\t\t0xaa000444, 0xb5000445, 0xa4000446, 0xfb000447, 0xf5000448, 0xf9000449, 0x9e00044a, 0xf100044b,\n\t\t0xed00044c, 0xf700044d, 0x9c00044e, 0xde00044f, 0x84000451, 0x80000452, 0x82000453, 0x86000454,\n\t\t0x88000455, 0x8a000456, 0x8c000457, 0x8e000458, 0x90000459, 0x9200045a, 0x9400045b, 0x9600045c,\n\t\t0x9800045e, 0x9a00045f, 0xef002116, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514,\n\t\t0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551,\n\t\t0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569,\n\t\t0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage858 is the Windows Code Page 858 encoding.\nvar CodePage858 encoding.Encoding = &codePage858\n\nvar codePage858 = charmap{\n\tname:          \"Windows Code Page 858\",\n\tmib:           identifier.IBM00858,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {2, [3]byte{0xc2, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa5, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}},\n\t\t{2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8f, 0x00}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {2, [3]byte{0xc2, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x97}}, {2, [3]byte{0xc2, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xad0000a1, 0xbd0000a2, 0x9c0000a3, 0xcf0000a4, 0xbe0000a5, 0xdd0000a6, 0xf50000a7,\n\t\t0xf90000a8, 0xb80000a9, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf00000ad, 0xa90000ae, 0xee0000af,\n\t\t0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xfc0000b3, 0xef0000b4, 0xe60000b5, 0xf40000b6, 0xfa0000b7,\n\t\t0xf70000b8, 0xfb0000b9, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xf30000be, 0xa80000bf,\n\t\t0xb70000c0, 0xb50000c1, 0xb60000c2, 0xc70000c3, 0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7,\n\t\t0xd40000c8, 0x900000c9, 0xd20000ca, 0xd30000cb, 0xde0000cc, 0xd60000cd, 0xd70000ce, 0xd80000cf,\n\t\t0xd10000d0, 0xa50000d1, 0xe30000d2, 0xe00000d3, 0xe20000d4, 0xe50000d5, 0x990000d6, 0x9e0000d7,\n\t\t0x9d0000d8, 0xeb0000d9, 0xe90000da, 0xea0000db, 0x9a0000dc, 0xed0000dd, 0xe80000de, 0xe10000df,\n\t\t0x850000e0, 0xa00000e1, 0x830000e2, 0xc60000e3, 0x840000e4, 0x860000e5, 0x910000e6, 0x870000e7,\n\t\t0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee, 0x8b0000ef,\n\t\t0xd00000f0, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0xe40000f5, 0x940000f6, 0xf60000f7,\n\t\t0x9b0000f8, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0xec0000fd, 0xe70000fe, 0x980000ff,\n\t\t0x9f000192, 0xf2002017, 0xd50020ac, 0xc4002500, 0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514,\n\t\t0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c, 0xc1002534, 0xc500253c, 0xcd002550, 0xba002551,\n\t\t0xc9002554, 0xbb002557, 0xc800255a, 0xbc00255d, 0xcc002560, 0xb9002563, 0xcb002566, 0xca002569,\n\t\t0xce00256c, 0xdf002580, 0xdc002584, 0xdb002588, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage860 is the IBM Code Page 860 encoding.\nvar CodePage860 encoding.Encoding = &codePage860\n\nvar codePage860 = charmap{\n\tname:          \"IBM Code Page 860\",\n\tmib:           identifier.IBM860,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf80000b0,\n\t\t0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc, 0xab0000bd,\n\t\t0xa80000bf, 0x910000c0, 0x860000c1, 0x8f0000c2, 0x8e0000c3, 0x800000c7, 0x920000c8, 0x900000c9,\n\t\t0x890000ca, 0x980000cc, 0x8b0000cd, 0xa50000d1, 0xa90000d2, 0x9f0000d3, 0x8c0000d4, 0x990000d5,\n\t\t0x9d0000d9, 0x960000da, 0x9a0000dc, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0x840000e3,\n\t\t0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x8d0000ec, 0xa10000ed, 0xa40000f1, 0x950000f2,\n\t\t0xa20000f3, 0x930000f4, 0x940000f5, 0xf60000f7, 0x970000f9, 0xa30000fa, 0x810000fc, 0xe2000393,\n\t\t0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0,\n\t\t0xe50003c3, 0xe70003c4, 0xed0003c6, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e,\n\t\t0xef002229, 0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xf4002320, 0xf5002321, 0xc4002500,\n\t\t0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c,\n\t\t0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555,\n\t\t0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d,\n\t\t0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565,\n\t\t0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580,\n\t\t0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage862 is the IBM Code Page 862 encoding.\nvar CodePage862 encoding.Encoding = &codePage862\n\nvar codePage862 = charmap{\n\tname:          \"IBM Code Page 862\",\n\tmib:           identifier.PC862LatinHebrew,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xad0000a1, 0x9b0000a2, 0x9c0000a3, 0x9d0000a5, 0xa60000aa, 0xae0000ab, 0xaa0000ac,\n\t\t0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xaf0000bb, 0xac0000bc,\n\t\t0xab0000bd, 0xa80000bf, 0xa50000d1, 0xe10000df, 0xa00000e1, 0xa10000ed, 0xa40000f1, 0xa20000f3,\n\t\t0xf60000f7, 0xa30000fa, 0x9f000192, 0xe2000393, 0xe9000398, 0xe40003a3, 0xe80003a6, 0xea0003a9,\n\t\t0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3, 0xe70003c4, 0xed0003c6, 0x800005d0,\n\t\t0x810005d1, 0x820005d2, 0x830005d3, 0x840005d4, 0x850005d5, 0x860005d6, 0x870005d7, 0x880005d8,\n\t\t0x890005d9, 0x8a0005da, 0x8b0005db, 0x8c0005dc, 0x8d0005dd, 0x8e0005de, 0x8f0005df, 0x900005e0,\n\t\t0x910005e1, 0x920005e2, 0x930005e3, 0x940005e4, 0x950005e5, 0x960005e6, 0x970005e7, 0x980005e8,\n\t\t0x990005e9, 0x9a0005ea, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229,\n\t\t0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500,\n\t\t0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c,\n\t\t0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555,\n\t\t0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d,\n\t\t0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565,\n\t\t0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580,\n\t\t0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage863 is the IBM Code Page 863 encoding.\nvar CodePage863 encoding.Encoding = &codePage863\n\nvar codePage863 = charmap{\n\tname:          \"IBM Code Page 863\",\n\tmib:           identifier.IBM863,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x97}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9b, 0x00}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0x9b0000a2, 0x9c0000a3, 0x980000a4, 0xa00000a6, 0x8f0000a7, 0xa40000a8, 0xae0000ab,\n\t\t0xaa0000ac, 0xa70000af, 0xf80000b0, 0xf10000b1, 0xfd0000b2, 0xa60000b3, 0xa10000b4, 0xe60000b5,\n\t\t0x860000b6, 0xfa0000b7, 0xa50000b8, 0xaf0000bb, 0xac0000bc, 0xab0000bd, 0xad0000be, 0x8e0000c0,\n\t\t0x840000c2, 0x800000c7, 0x910000c8, 0x900000c9, 0x920000ca, 0x940000cb, 0xa80000ce, 0x950000cf,\n\t\t0x990000d4, 0x9d0000d9, 0x9e0000db, 0x9a0000dc, 0xe10000df, 0x850000e0, 0x830000e2, 0x870000e7,\n\t\t0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8c0000ee, 0x8b0000ef, 0xa20000f3, 0x930000f4,\n\t\t0xf60000f7, 0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0x9f000192, 0xe2000393, 0xe9000398,\n\t\t0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3,\n\t\t0xe70003c4, 0xed0003c6, 0x8d002017, 0xfc00207f, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229,\n\t\t0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500,\n\t\t0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c,\n\t\t0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555,\n\t\t0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d,\n\t\t0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565,\n\t\t0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580,\n\t\t0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage865 is the IBM Code Page 865 encoding.\nvar CodePage865 encoding.Encoding = &codePage865\n\nvar codePage865 = charmap{\n\tname:          \"IBM Code Page 865\",\n\tmib:           identifier.IBM865,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xa7}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa1, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbf, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0x90}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xce, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xce, 0x93, 0x00}}, {2, [3]byte{0xcf, 0x80, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa3, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {2, [3]byte{0xcf, 0x84, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0x98, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa9, 0x00}}, {2, [3]byte{0xce, 0xb4, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xcf, 0x86, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb5, 0x00}}, {3, [3]byte{0xe2, 0x88, 0xa9}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa1}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa5}}, {3, [3]byte{0xe2, 0x89, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x8c, 0xa0}}, {3, [3]byte{0xe2, 0x8c, 0xa1}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x81, 0xbf}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xad0000a1, 0x9c0000a3, 0xaf0000a4, 0xa60000aa, 0xae0000ab, 0xaa0000ac, 0xf80000b0,\n\t\t0xf10000b1, 0xfd0000b2, 0xe60000b5, 0xfa0000b7, 0xa70000ba, 0xac0000bc, 0xab0000bd, 0xa80000bf,\n\t\t0x8e0000c4, 0x8f0000c5, 0x920000c6, 0x800000c7, 0x900000c9, 0xa50000d1, 0x990000d6, 0x9d0000d8,\n\t\t0x9a0000dc, 0xe10000df, 0x850000e0, 0xa00000e1, 0x830000e2, 0x840000e4, 0x860000e5, 0x910000e6,\n\t\t0x870000e7, 0x8a0000e8, 0x820000e9, 0x880000ea, 0x890000eb, 0x8d0000ec, 0xa10000ed, 0x8c0000ee,\n\t\t0x8b0000ef, 0xa40000f1, 0x950000f2, 0xa20000f3, 0x930000f4, 0x940000f6, 0xf60000f7, 0x9b0000f8,\n\t\t0x970000f9, 0xa30000fa, 0x960000fb, 0x810000fc, 0x980000ff, 0x9f000192, 0xe2000393, 0xe9000398,\n\t\t0xe40003a3, 0xe80003a6, 0xea0003a9, 0xe00003b1, 0xeb0003b4, 0xee0003b5, 0xe30003c0, 0xe50003c3,\n\t\t0xe70003c4, 0xed0003c6, 0xfc00207f, 0x9e0020a7, 0xf9002219, 0xfb00221a, 0xec00221e, 0xef002229,\n\t\t0xf7002248, 0xf0002261, 0xf3002264, 0xf2002265, 0xa9002310, 0xf4002320, 0xf5002321, 0xc4002500,\n\t\t0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c,\n\t\t0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555,\n\t\t0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d,\n\t\t0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565,\n\t\t0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580,\n\t\t0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage866 is the IBM Code Page 866 encoding.\nvar CodePage866 encoding.Encoding = &codePage866\n\nvar codePage866 = charmap{\n\tname:          \"IBM Code Page 866\",\n\tmib:           identifier.IBM866,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa1}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0x96}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x91}}, {3, [3]byte{0xe2, 0x95, 0x97}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0xbc}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9e}}, {3, [3]byte{0xe2, 0x95, 0x9f}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9a}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa9}}, {3, [3]byte{0xe2, 0x95, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa0}}, {3, [3]byte{0xe2, 0x95, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa5}}, {3, [3]byte{0xe2, 0x95, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x98}}, {3, [3]byte{0xe2, 0x95, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0xab}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x8c}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x90}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xd1, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xff0000a0, 0xfd0000a4, 0xf80000b0, 0xfa0000b7, 0xf0000401, 0xf2000404, 0xf4000407, 0xf600040e,\n\t\t0x80000410, 0x81000411, 0x82000412, 0x83000413, 0x84000414, 0x85000415, 0x86000416, 0x87000417,\n\t\t0x88000418, 0x89000419, 0x8a00041a, 0x8b00041b, 0x8c00041c, 0x8d00041d, 0x8e00041e, 0x8f00041f,\n\t\t0x90000420, 0x91000421, 0x92000422, 0x93000423, 0x94000424, 0x95000425, 0x96000426, 0x97000427,\n\t\t0x98000428, 0x99000429, 0x9a00042a, 0x9b00042b, 0x9c00042c, 0x9d00042d, 0x9e00042e, 0x9f00042f,\n\t\t0xa0000430, 0xa1000431, 0xa2000432, 0xa3000433, 0xa4000434, 0xa5000435, 0xa6000436, 0xa7000437,\n\t\t0xa8000438, 0xa9000439, 0xaa00043a, 0xab00043b, 0xac00043c, 0xad00043d, 0xae00043e, 0xaf00043f,\n\t\t0xe0000440, 0xe1000441, 0xe2000442, 0xe3000443, 0xe4000444, 0xe5000445, 0xe6000446, 0xe7000447,\n\t\t0xe8000448, 0xe9000449, 0xea00044a, 0xeb00044b, 0xec00044c, 0xed00044d, 0xee00044e, 0xef00044f,\n\t\t0xf1000451, 0xf3000454, 0xf5000457, 0xf700045e, 0xfc002116, 0xf9002219, 0xfb00221a, 0xc4002500,\n\t\t0xb3002502, 0xda00250c, 0xbf002510, 0xc0002514, 0xd9002518, 0xc300251c, 0xb4002524, 0xc200252c,\n\t\t0xc1002534, 0xc500253c, 0xcd002550, 0xba002551, 0xd5002552, 0xd6002553, 0xc9002554, 0xb8002555,\n\t\t0xb7002556, 0xbb002557, 0xd4002558, 0xd3002559, 0xc800255a, 0xbe00255b, 0xbd00255c, 0xbc00255d,\n\t\t0xc600255e, 0xc700255f, 0xcc002560, 0xb5002561, 0xb6002562, 0xb9002563, 0xd1002564, 0xd2002565,\n\t\t0xcb002566, 0xcf002567, 0xd0002568, 0xca002569, 0xd800256a, 0xd700256b, 0xce00256c, 0xdf002580,\n\t\t0xdc002584, 0xdb002588, 0xdd00258c, 0xde002590, 0xb0002591, 0xb1002592, 0xb2002593, 0xfe0025a0,\n\t},\n}\n\n// CodePage1047 is the IBM Code Page 1047 encoding.\nvar CodePage1047 encoding.Encoding = &codePage1047\n\nvar codePage1047 = charmap{\n\tname:          \"IBM Code Page 1047\",\n\tmib:           identifier.IBM1047,\n\tasciiSuperset: false,\n\tlow:           0x00,\n\treplacement:   0x3f,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9c, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x86, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8e, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x84, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8c, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x96, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9e, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3b, 0x00, 0x00}}, {1, [3]byte{0x5e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}},\n\t\t{1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}},\n\t\t{1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}},\n\t\t{1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}},\n\t\t{1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x90, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaf, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}},\n\t\t{1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}},\n\t\t{1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}},\n\t\t{1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}},\n\t\t{1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x37000004, 0x2d000005, 0x2e000006, 0x2f000007,\n\t\t0x16000008, 0x05000009, 0x2500000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x3c000014, 0x3d000015, 0x32000016, 0x26000017,\n\t\t0x18000018, 0x19000019, 0x3f00001a, 0x2700001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x40000020, 0x5a000021, 0x7f000022, 0x7b000023, 0x5b000024, 0x6c000025, 0x50000026, 0x7d000027,\n\t\t0x4d000028, 0x5d000029, 0x5c00002a, 0x4e00002b, 0x6b00002c, 0x6000002d, 0x4b00002e, 0x6100002f,\n\t\t0xf0000030, 0xf1000031, 0xf2000032, 0xf3000033, 0xf4000034, 0xf5000035, 0xf6000036, 0xf7000037,\n\t\t0xf8000038, 0xf9000039, 0x7a00003a, 0x5e00003b, 0x4c00003c, 0x7e00003d, 0x6e00003e, 0x6f00003f,\n\t\t0x7c000040, 0xc1000041, 0xc2000042, 0xc3000043, 0xc4000044, 0xc5000045, 0xc6000046, 0xc7000047,\n\t\t0xc8000048, 0xc9000049, 0xd100004a, 0xd200004b, 0xd300004c, 0xd400004d, 0xd500004e, 0xd600004f,\n\t\t0xd7000050, 0xd8000051, 0xd9000052, 0xe2000053, 0xe3000054, 0xe4000055, 0xe5000056, 0xe6000057,\n\t\t0xe7000058, 0xe8000059, 0xe900005a, 0xad00005b, 0xe000005c, 0xbd00005d, 0x5f00005e, 0x6d00005f,\n\t\t0x79000060, 0x81000061, 0x82000062, 0x83000063, 0x84000064, 0x85000065, 0x86000066, 0x87000067,\n\t\t0x88000068, 0x89000069, 0x9100006a, 0x9200006b, 0x9300006c, 0x9400006d, 0x9500006e, 0x9600006f,\n\t\t0x97000070, 0x98000071, 0x99000072, 0xa2000073, 0xa3000074, 0xa4000075, 0xa5000076, 0xa6000077,\n\t\t0xa7000078, 0xa8000079, 0xa900007a, 0xc000007b, 0x4f00007c, 0xd000007d, 0xa100007e, 0x0700007f,\n\t\t0x20000080, 0x21000081, 0x22000082, 0x23000083, 0x24000084, 0x15000085, 0x06000086, 0x17000087,\n\t\t0x28000088, 0x29000089, 0x2a00008a, 0x2b00008b, 0x2c00008c, 0x0900008d, 0x0a00008e, 0x1b00008f,\n\t\t0x30000090, 0x31000091, 0x1a000092, 0x33000093, 0x34000094, 0x35000095, 0x36000096, 0x08000097,\n\t\t0x38000098, 0x39000099, 0x3a00009a, 0x3b00009b, 0x0400009c, 0x1400009d, 0x3e00009e, 0xff00009f,\n\t\t0x410000a0, 0xaa0000a1, 0x4a0000a2, 0xb10000a3, 0x9f0000a4, 0xb20000a5, 0x6a0000a6, 0xb50000a7,\n\t\t0xbb0000a8, 0xb40000a9, 0x9a0000aa, 0x8a0000ab, 0xb00000ac, 0xca0000ad, 0xaf0000ae, 0xbc0000af,\n\t\t0x900000b0, 0x8f0000b1, 0xea0000b2, 0xfa0000b3, 0xbe0000b4, 0xa00000b5, 0xb60000b6, 0xb30000b7,\n\t\t0x9d0000b8, 0xda0000b9, 0x9b0000ba, 0x8b0000bb, 0xb70000bc, 0xb80000bd, 0xb90000be, 0xab0000bf,\n\t\t0x640000c0, 0x650000c1, 0x620000c2, 0x660000c3, 0x630000c4, 0x670000c5, 0x9e0000c6, 0x680000c7,\n\t\t0x740000c8, 0x710000c9, 0x720000ca, 0x730000cb, 0x780000cc, 0x750000cd, 0x760000ce, 0x770000cf,\n\t\t0xac0000d0, 0x690000d1, 0xed0000d2, 0xee0000d3, 0xeb0000d4, 0xef0000d5, 0xec0000d6, 0xbf0000d7,\n\t\t0x800000d8, 0xfd0000d9, 0xfe0000da, 0xfb0000db, 0xfc0000dc, 0xba0000dd, 0xae0000de, 0x590000df,\n\t\t0x440000e0, 0x450000e1, 0x420000e2, 0x460000e3, 0x430000e4, 0x470000e5, 0x9c0000e6, 0x480000e7,\n\t\t0x540000e8, 0x510000e9, 0x520000ea, 0x530000eb, 0x580000ec, 0x550000ed, 0x560000ee, 0x570000ef,\n\t\t0x8c0000f0, 0x490000f1, 0xcd0000f2, 0xce0000f3, 0xcb0000f4, 0xcf0000f5, 0xcc0000f6, 0xe10000f7,\n\t\t0x700000f8, 0xdd0000f9, 0xde0000fa, 0xdb0000fb, 0xdc0000fc, 0x8d0000fd, 0x8e0000fe, 0xdf0000ff,\n\t},\n}\n\n// CodePage1140 is the IBM Code Page 1140 encoding.\nvar CodePage1140 encoding.Encoding = &codePage1140\n\nvar codePage1140 = charmap{\n\tname:          \"IBM Code Page 1140\",\n\tmib:           identifier.IBM01140,\n\tasciiSuperset: false,\n\tlow:           0x00,\n\treplacement:   0x3f,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9c, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x86, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x97, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8e, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9d, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x84, 0x00}}, {1, [3]byte{0x0a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x17, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8c, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x96, 0x00}}, {1, [3]byte{0x04, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9e, 0x00}}, {1, [3]byte{0x1a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa7, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {1, [3]byte{0x2e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x28, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2b, 0x00, 0x00}}, {1, [3]byte{0x7c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{1, [3]byte{0x21, 0x00, 0x00}}, {1, [3]byte{0x24, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3b, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xac, 0x00}},\n\t\t{1, [3]byte{0x2d, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {1, [3]byte{0x2c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x25, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {1, [3]byte{0x60, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3d, 0x00, 0x00}}, {1, [3]byte{0x22, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xab, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {1, [3]byte{0x6a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6b, 0x00, 0x00}}, {1, [3]byte{0x6c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6d, 0x00, 0x00}}, {1, [3]byte{0x6e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6f, 0x00, 0x00}}, {1, [3]byte{0x70, 0x00, 0x00}},\n\t\t{1, [3]byte{0x71, 0x00, 0x00}}, {1, [3]byte{0x72, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}},\n\t\t{2, [3]byte{0xc2, 0xb5, 0x00}}, {1, [3]byte{0x7e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x73, 0x00, 0x00}}, {1, [3]byte{0x74, 0x00, 0x00}},\n\t\t{1, [3]byte{0x75, 0x00, 0x00}}, {1, [3]byte{0x76, 0x00, 0x00}},\n\t\t{1, [3]byte{0x77, 0x00, 0x00}}, {1, [3]byte{0x78, 0x00, 0x00}},\n\t\t{1, [3]byte{0x79, 0x00, 0x00}}, {1, [3]byte{0x7a, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xae, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa9, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xbe, 0x00}},\n\t\t{1, [3]byte{0x5b, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xc2, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{1, [3]byte{0x7b, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{1, [3]byte{0x7d, 0x00, 0x00}}, {1, [3]byte{0x4a, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4b, 0x00, 0x00}}, {1, [3]byte{0x4c, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4d, 0x00, 0x00}}, {1, [3]byte{0x4e, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4f, 0x00, 0x00}}, {1, [3]byte{0x50, 0x00, 0x00}},\n\t\t{1, [3]byte{0x51, 0x00, 0x00}}, {1, [3]byte{0x52, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb9, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{1, [3]byte{0x53, 0x00, 0x00}}, {1, [3]byte{0x54, 0x00, 0x00}},\n\t\t{1, [3]byte{0x55, 0x00, 0x00}}, {1, [3]byte{0x56, 0x00, 0x00}},\n\t\t{1, [3]byte{0x57, 0x00, 0x00}}, {1, [3]byte{0x58, 0x00, 0x00}},\n\t\t{1, [3]byte{0x59, 0x00, 0x00}}, {1, [3]byte{0x5a, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb3, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x37000004, 0x2d000005, 0x2e000006, 0x2f000007,\n\t\t0x16000008, 0x05000009, 0x2500000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x3c000014, 0x3d000015, 0x32000016, 0x26000017,\n\t\t0x18000018, 0x19000019, 0x3f00001a, 0x2700001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x40000020, 0x5a000021, 0x7f000022, 0x7b000023, 0x5b000024, 0x6c000025, 0x50000026, 0x7d000027,\n\t\t0x4d000028, 0x5d000029, 0x5c00002a, 0x4e00002b, 0x6b00002c, 0x6000002d, 0x4b00002e, 0x6100002f,\n\t\t0xf0000030, 0xf1000031, 0xf2000032, 0xf3000033, 0xf4000034, 0xf5000035, 0xf6000036, 0xf7000037,\n\t\t0xf8000038, 0xf9000039, 0x7a00003a, 0x5e00003b, 0x4c00003c, 0x7e00003d, 0x6e00003e, 0x6f00003f,\n\t\t0x7c000040, 0xc1000041, 0xc2000042, 0xc3000043, 0xc4000044, 0xc5000045, 0xc6000046, 0xc7000047,\n\t\t0xc8000048, 0xc9000049, 0xd100004a, 0xd200004b, 0xd300004c, 0xd400004d, 0xd500004e, 0xd600004f,\n\t\t0xd7000050, 0xd8000051, 0xd9000052, 0xe2000053, 0xe3000054, 0xe4000055, 0xe5000056, 0xe6000057,\n\t\t0xe7000058, 0xe8000059, 0xe900005a, 0xba00005b, 0xe000005c, 0xbb00005d, 0xb000005e, 0x6d00005f,\n\t\t0x79000060, 0x81000061, 0x82000062, 0x83000063, 0x84000064, 0x85000065, 0x86000066, 0x87000067,\n\t\t0x88000068, 0x89000069, 0x9100006a, 0x9200006b, 0x9300006c, 0x9400006d, 0x9500006e, 0x9600006f,\n\t\t0x97000070, 0x98000071, 0x99000072, 0xa2000073, 0xa3000074, 0xa4000075, 0xa5000076, 0xa6000077,\n\t\t0xa7000078, 0xa8000079, 0xa900007a, 0xc000007b, 0x4f00007c, 0xd000007d, 0xa100007e, 0x0700007f,\n\t\t0x20000080, 0x21000081, 0x22000082, 0x23000083, 0x24000084, 0x15000085, 0x06000086, 0x17000087,\n\t\t0x28000088, 0x29000089, 0x2a00008a, 0x2b00008b, 0x2c00008c, 0x0900008d, 0x0a00008e, 0x1b00008f,\n\t\t0x30000090, 0x31000091, 0x1a000092, 0x33000093, 0x34000094, 0x35000095, 0x36000096, 0x08000097,\n\t\t0x38000098, 0x39000099, 0x3a00009a, 0x3b00009b, 0x0400009c, 0x1400009d, 0x3e00009e, 0xff00009f,\n\t\t0x410000a0, 0xaa0000a1, 0x4a0000a2, 0xb10000a3, 0xb20000a5, 0x6a0000a6, 0xb50000a7, 0xbd0000a8,\n\t\t0xb40000a9, 0x9a0000aa, 0x8a0000ab, 0x5f0000ac, 0xca0000ad, 0xaf0000ae, 0xbc0000af, 0x900000b0,\n\t\t0x8f0000b1, 0xea0000b2, 0xfa0000b3, 0xbe0000b4, 0xa00000b5, 0xb60000b6, 0xb30000b7, 0x9d0000b8,\n\t\t0xda0000b9, 0x9b0000ba, 0x8b0000bb, 0xb70000bc, 0xb80000bd, 0xb90000be, 0xab0000bf, 0x640000c0,\n\t\t0x650000c1, 0x620000c2, 0x660000c3, 0x630000c4, 0x670000c5, 0x9e0000c6, 0x680000c7, 0x740000c8,\n\t\t0x710000c9, 0x720000ca, 0x730000cb, 0x780000cc, 0x750000cd, 0x760000ce, 0x770000cf, 0xac0000d0,\n\t\t0x690000d1, 0xed0000d2, 0xee0000d3, 0xeb0000d4, 0xef0000d5, 0xec0000d6, 0xbf0000d7, 0x800000d8,\n\t\t0xfd0000d9, 0xfe0000da, 0xfb0000db, 0xfc0000dc, 0xad0000dd, 0xae0000de, 0x590000df, 0x440000e0,\n\t\t0x450000e1, 0x420000e2, 0x460000e3, 0x430000e4, 0x470000e5, 0x9c0000e6, 0x480000e7, 0x540000e8,\n\t\t0x510000e9, 0x520000ea, 0x530000eb, 0x580000ec, 0x550000ed, 0x560000ee, 0x570000ef, 0x8c0000f0,\n\t\t0x490000f1, 0xcd0000f2, 0xce0000f3, 0xcb0000f4, 0xcf0000f5, 0xcc0000f6, 0xe10000f7, 0x700000f8,\n\t\t0xdd0000f9, 0xde0000fa, 0xdb0000fb, 0xdc0000fc, 0x8d0000fd, 0x8e0000fe, 0xdf0000ff, 0x9f0020ac,\n\t},\n}\n\n// ISO8859_1 is the ISO 8859-1 encoding.\nvar ISO8859_1 encoding.Encoding = &iso8859_1\n\nvar iso8859_1 = charmap{\n\tname:          \"ISO 8859-1\",\n\tmib:           identifier.ISOLatin1,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x84, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x86, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x96, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0x80000080, 0x81000081, 0x82000082, 0x83000083, 0x84000084, 0x85000085, 0x86000086, 0x87000087,\n\t\t0x88000088, 0x89000089, 0x8a00008a, 0x8b00008b, 0x8c00008c, 0x8d00008d, 0x8e00008e, 0x8f00008f,\n\t\t0x90000090, 0x91000091, 0x92000092, 0x93000093, 0x94000094, 0x95000095, 0x96000096, 0x97000097,\n\t\t0x98000098, 0x99000099, 0x9a00009a, 0x9b00009b, 0x9c00009c, 0x9d00009d, 0x9e00009e, 0x9f00009f,\n\t\t0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7,\n\t\t0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af,\n\t\t0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7,\n\t\t0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf,\n\t\t0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7,\n\t\t0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf,\n\t\t0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7,\n\t\t0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df,\n\t\t0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7,\n\t\t0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef,\n\t\t0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7,\n\t\t0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff,\n\t},\n}\n\n// ISO8859_2 is the ISO 8859-2 encoding.\nvar ISO8859_2 encoding.Encoding = &iso8859_2\n\nvar iso8859_2 = charmap{\n\tname:          \"ISO 8859-2\",\n\tmib:           identifier.ISOLatin2,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc5, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xb00000b0, 0xb40000b4, 0xb80000b8,\n\t\t0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce,\n\t\t0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xda0000da, 0xdc0000dc, 0xdd0000dd, 0xdf0000df,\n\t\t0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee,\n\t\t0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xfa0000fa, 0xfc0000fc, 0xfd0000fd, 0xc3000102,\n\t\t0xe3000103, 0xa1000104, 0xb1000105, 0xc6000106, 0xe6000107, 0xc800010c, 0xe800010d, 0xcf00010e,\n\t\t0xef00010f, 0xd0000110, 0xf0000111, 0xca000118, 0xea000119, 0xcc00011a, 0xec00011b, 0xc5000139,\n\t\t0xe500013a, 0xa500013d, 0xb500013e, 0xa3000141, 0xb3000142, 0xd1000143, 0xf1000144, 0xd2000147,\n\t\t0xf2000148, 0xd5000150, 0xf5000151, 0xc0000154, 0xe0000155, 0xd8000158, 0xf8000159, 0xa600015a,\n\t\t0xb600015b, 0xaa00015e, 0xba00015f, 0xa9000160, 0xb9000161, 0xde000162, 0xfe000163, 0xab000164,\n\t\t0xbb000165, 0xd900016e, 0xf900016f, 0xdb000170, 0xfb000171, 0xac000179, 0xbc00017a, 0xaf00017b,\n\t\t0xbf00017c, 0xae00017d, 0xbe00017e, 0xb70002c7, 0xa20002d8, 0xff0002d9, 0xb20002db, 0xbd0002dd,\n\t\t0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd,\n\t\t0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd,\n\t\t0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd,\n\t\t0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd, 0xbd0002dd,\n\t},\n}\n\n// ISO8859_3 is the ISO 8859-3 encoding.\nvar ISO8859_3 encoding.Encoding = &iso8859_3\n\nvar iso8859_3 = charmap{\n\tname:          \"ISO 8859-3\",\n\tmib:           identifier.ISOLatin3,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc4, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc4, 0x9e, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc4, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xb5, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc4, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xac, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x89, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9d, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9d, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa30000a3, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xb00000b0, 0xb20000b2,\n\t\t0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb70000b7, 0xb80000b8, 0xbd0000bd, 0xc00000c0, 0xc10000c1,\n\t\t0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc,\n\t\t0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd60000d6,\n\t\t0xd70000d7, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1,\n\t\t0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec,\n\t\t0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf60000f6,\n\t\t0xf70000f7, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xc6000108, 0xe6000109, 0xc500010a,\n\t\t0xe500010b, 0xd800011c, 0xf800011d, 0xab00011e, 0xbb00011f, 0xd5000120, 0xf5000121, 0xa6000124,\n\t\t0xb6000125, 0xa1000126, 0xb1000127, 0xa9000130, 0xb9000131, 0xac000134, 0xbc000135, 0xde00015c,\n\t\t0xfe00015d, 0xaa00015e, 0xba00015f, 0xdd00016c, 0xfd00016d, 0xaf00017b, 0xbf00017c, 0xa20002d8,\n\t\t0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9,\n\t\t0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9,\n\t\t0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9,\n\t\t0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9,\n\t\t0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9, 0xff0002d9,\n\t},\n}\n\n// ISO8859_4 is the ISO 8859-4 encoding.\nvar ISO8859_4 encoding.Encoding = &iso8859_4\n\nvar iso8859_4 = charmap{\n\tname:          \"ISO 8859-4\",\n\tmib:           identifier.ISOLatin4,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc5, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc4, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa7, 0x00}}, {2, [3]byte{0xc5, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0xaa, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa40000a4, 0xa70000a7, 0xa80000a8, 0xad0000ad, 0xaf0000af, 0xb00000b0, 0xb40000b4,\n\t\t0xb80000b8, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc90000c9,\n\t\t0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8,\n\t\t0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4,\n\t\t0xe50000e5, 0xe60000e6, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xf40000f4, 0xf50000f5,\n\t\t0xf60000f6, 0xf70000f7, 0xf80000f8, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xc0000100, 0xe0000101,\n\t\t0xa1000104, 0xb1000105, 0xc800010c, 0xe800010d, 0xd0000110, 0xf0000111, 0xaa000112, 0xba000113,\n\t\t0xcc000116, 0xec000117, 0xca000118, 0xea000119, 0xab000122, 0xbb000123, 0xa5000128, 0xb5000129,\n\t\t0xcf00012a, 0xef00012b, 0xc700012e, 0xe700012f, 0xd3000136, 0xf3000137, 0xa2000138, 0xa600013b,\n\t\t0xb600013c, 0xd1000145, 0xf1000146, 0xbd00014a, 0xbf00014b, 0xd200014c, 0xf200014d, 0xa3000156,\n\t\t0xb3000157, 0xa9000160, 0xb9000161, 0xac000166, 0xbc000167, 0xdd000168, 0xfd000169, 0xde00016a,\n\t\t0xfe00016b, 0xd9000172, 0xf9000173, 0xae00017d, 0xbe00017e, 0xb70002c7, 0xff0002d9, 0xb20002db,\n\t\t0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db,\n\t\t0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db,\n\t\t0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db,\n\t\t0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db, 0xb20002db,\n\t},\n}\n\n// ISO8859_5 is the ISO 8859-5 encoding.\nvar ISO8859_5 encoding.Encoding = &iso8859_5\n\nvar iso8859_5 = charmap{\n\tname:          \"ISO 8859-5\",\n\tmib:           identifier.ISOLatinCyrillic,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x88, 0x00}}, {2, [3]byte{0xd0, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xd1, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x92, 0x00}}, {2, [3]byte{0xd1, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd1, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd1, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xfd0000a7, 0xad0000ad, 0xa1000401, 0xa2000402, 0xa3000403, 0xa4000404, 0xa5000405,\n\t\t0xa6000406, 0xa7000407, 0xa8000408, 0xa9000409, 0xaa00040a, 0xab00040b, 0xac00040c, 0xae00040e,\n\t\t0xaf00040f, 0xb0000410, 0xb1000411, 0xb2000412, 0xb3000413, 0xb4000414, 0xb5000415, 0xb6000416,\n\t\t0xb7000417, 0xb8000418, 0xb9000419, 0xba00041a, 0xbb00041b, 0xbc00041c, 0xbd00041d, 0xbe00041e,\n\t\t0xbf00041f, 0xc0000420, 0xc1000421, 0xc2000422, 0xc3000423, 0xc4000424, 0xc5000425, 0xc6000426,\n\t\t0xc7000427, 0xc8000428, 0xc9000429, 0xca00042a, 0xcb00042b, 0xcc00042c, 0xcd00042d, 0xce00042e,\n\t\t0xcf00042f, 0xd0000430, 0xd1000431, 0xd2000432, 0xd3000433, 0xd4000434, 0xd5000435, 0xd6000436,\n\t\t0xd7000437, 0xd8000438, 0xd9000439, 0xda00043a, 0xdb00043b, 0xdc00043c, 0xdd00043d, 0xde00043e,\n\t\t0xdf00043f, 0xe0000440, 0xe1000441, 0xe2000442, 0xe3000443, 0xe4000444, 0xe5000445, 0xe6000446,\n\t\t0xe7000447, 0xe8000448, 0xe9000449, 0xea00044a, 0xeb00044b, 0xec00044c, 0xed00044d, 0xee00044e,\n\t\t0xef00044f, 0xf1000451, 0xf2000452, 0xf3000453, 0xf4000454, 0xf5000455, 0xf6000456, 0xf7000457,\n\t\t0xf8000458, 0xf9000459, 0xfa00045a, 0xfb00045b, 0xfc00045c, 0xfe00045e, 0xff00045f, 0xf0002116,\n\t\t0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116,\n\t\t0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116,\n\t\t0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116,\n\t\t0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116, 0xf0002116,\n\t},\n}\n\n// ISO8859_6 is the ISO 8859-6 encoding.\nvar ISO8859_6 encoding.Encoding = &iso8859_6\n\nvar iso8859_6 = charmap{\n\tname:          \"ISO 8859-6\",\n\tmib:           identifier.ISOLatinArabic,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xd8, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0x9b, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0x9f, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd8, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa2, 0x00}}, {2, [3]byte{0xd8, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa4, 0x00}}, {2, [3]byte{0xd8, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa6, 0x00}}, {2, [3]byte{0xd8, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa8, 0x00}}, {2, [3]byte{0xd8, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xaa, 0x00}}, {2, [3]byte{0xd8, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xac, 0x00}}, {2, [3]byte{0xd8, 0xad, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xae, 0x00}}, {2, [3]byte{0xd8, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb0, 0x00}}, {2, [3]byte{0xd8, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb2, 0x00}}, {2, [3]byte{0xd8, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb4, 0x00}}, {2, [3]byte{0xd8, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb6, 0x00}}, {2, [3]byte{0xd8, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb8, 0x00}}, {2, [3]byte{0xd8, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xba, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xd9, 0x80, 0x00}}, {2, [3]byte{0xd9, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x82, 0x00}}, {2, [3]byte{0xd9, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x84, 0x00}}, {2, [3]byte{0xd9, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x86, 0x00}}, {2, [3]byte{0xd9, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x88, 0x00}}, {2, [3]byte{0xd9, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x8a, 0x00}}, {2, [3]byte{0xd9, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x8c, 0x00}}, {2, [3]byte{0xd9, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x8e, 0x00}}, {2, [3]byte{0xd9, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x90, 0x00}}, {2, [3]byte{0xd9, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa40000a4, 0xad0000ad, 0xac00060c, 0xbb00061b, 0xbf00061f, 0xc1000621, 0xc2000622,\n\t\t0xc3000623, 0xc4000624, 0xc5000625, 0xc6000626, 0xc7000627, 0xc8000628, 0xc9000629, 0xca00062a,\n\t\t0xcb00062b, 0xcc00062c, 0xcd00062d, 0xce00062e, 0xcf00062f, 0xd0000630, 0xd1000631, 0xd2000632,\n\t\t0xd3000633, 0xd4000634, 0xd5000635, 0xd6000636, 0xd7000637, 0xd8000638, 0xd9000639, 0xda00063a,\n\t\t0xe0000640, 0xe1000641, 0xe2000642, 0xe3000643, 0xe4000644, 0xe5000645, 0xe6000646, 0xe7000647,\n\t\t0xe8000648, 0xe9000649, 0xea00064a, 0xeb00064b, 0xec00064c, 0xed00064d, 0xee00064e, 0xef00064f,\n\t\t0xf0000650, 0xf1000651, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t\t0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652, 0xf2000652,\n\t},\n}\n\n// ISO8859_7 is the ISO 8859-7 encoding.\nvar ISO8859_7 encoding.Encoding = &iso8859_7\n\nvar iso8859_7 = charmap{\n\tname:          \"ISO 8859-7\",\n\tmib:           identifier.ISOLatinGreek,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x82, 0xaf}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xcd, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x95}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xce, 0x84, 0x00}}, {2, [3]byte{0xce, 0x85, 0x00}},\n\t\t{2, [3]byte{0xce, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xce, 0x88, 0x00}}, {2, [3]byte{0xce, 0x89, 0x00}},\n\t\t{2, [3]byte{0xce, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xce, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xce, 0x8e, 0x00}}, {2, [3]byte{0xce, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xce, 0x90, 0x00}}, {2, [3]byte{0xce, 0x91, 0x00}},\n\t\t{2, [3]byte{0xce, 0x92, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}},\n\t\t{2, [3]byte{0xce, 0x94, 0x00}}, {2, [3]byte{0xce, 0x95, 0x00}},\n\t\t{2, [3]byte{0xce, 0x96, 0x00}}, {2, [3]byte{0xce, 0x97, 0x00}},\n\t\t{2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0x99, 0x00}},\n\t\t{2, [3]byte{0xce, 0x9a, 0x00}}, {2, [3]byte{0xce, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xce, 0x9c, 0x00}}, {2, [3]byte{0xce, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xce, 0x9e, 0x00}}, {2, [3]byte{0xce, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa0, 0x00}}, {2, [3]byte{0xce, 0xa1, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xce, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa4, 0x00}}, {2, [3]byte{0xce, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa8, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xce, 0xaa, 0x00}}, {2, [3]byte{0xce, 0xab, 0x00}},\n\t\t{2, [3]byte{0xce, 0xac, 0x00}}, {2, [3]byte{0xce, 0xad, 0x00}},\n\t\t{2, [3]byte{0xce, 0xae, 0x00}}, {2, [3]byte{0xce, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb0, 0x00}}, {2, [3]byte{0xce, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb2, 0x00}}, {2, [3]byte{0xce, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb4, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb6, 0x00}}, {2, [3]byte{0xce, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb8, 0x00}}, {2, [3]byte{0xce, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xce, 0xba, 0x00}}, {2, [3]byte{0xce, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xce, 0xbc, 0x00}}, {2, [3]byte{0xce, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xce, 0xbe, 0x00}}, {2, [3]byte{0xce, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xcf, 0x81, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x82, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xcf, 0x85, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xcf, 0x87, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x88, 0x00}}, {2, [3]byte{0xcf, 0x89, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x8a, 0x00}}, {2, [3]byte{0xcf, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x8c, 0x00}}, {2, [3]byte{0xcf, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x8e, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa30000a3, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac,\n\t\t0xad0000ad, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb70000b7, 0xbb0000bb, 0xbd0000bd,\n\t\t0xaa00037a, 0xb4000384, 0xb5000385, 0xb6000386, 0xb8000388, 0xb9000389, 0xba00038a, 0xbc00038c,\n\t\t0xbe00038e, 0xbf00038f, 0xc0000390, 0xc1000391, 0xc2000392, 0xc3000393, 0xc4000394, 0xc5000395,\n\t\t0xc6000396, 0xc7000397, 0xc8000398, 0xc9000399, 0xca00039a, 0xcb00039b, 0xcc00039c, 0xcd00039d,\n\t\t0xce00039e, 0xcf00039f, 0xd00003a0, 0xd10003a1, 0xd30003a3, 0xd40003a4, 0xd50003a5, 0xd60003a6,\n\t\t0xd70003a7, 0xd80003a8, 0xd90003a9, 0xda0003aa, 0xdb0003ab, 0xdc0003ac, 0xdd0003ad, 0xde0003ae,\n\t\t0xdf0003af, 0xe00003b0, 0xe10003b1, 0xe20003b2, 0xe30003b3, 0xe40003b4, 0xe50003b5, 0xe60003b6,\n\t\t0xe70003b7, 0xe80003b8, 0xe90003b9, 0xea0003ba, 0xeb0003bb, 0xec0003bc, 0xed0003bd, 0xee0003be,\n\t\t0xef0003bf, 0xf00003c0, 0xf10003c1, 0xf20003c2, 0xf30003c3, 0xf40003c4, 0xf50003c5, 0xf60003c6,\n\t\t0xf70003c7, 0xf80003c8, 0xf90003c9, 0xfa0003ca, 0xfb0003cb, 0xfc0003cc, 0xfd0003cd, 0xfe0003ce,\n\t\t0xaf002015, 0xa1002018, 0xa2002019, 0xa40020ac, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af,\n\t\t0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af,\n\t\t0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af,\n\t\t0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af,\n\t\t0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af, 0xa50020af,\n\t},\n}\n\n// ISO8859_8 is the ISO 8859-8 encoding.\nvar ISO8859_8 encoding.Encoding = &iso8859_8\n\nvar iso8859_8 = charmap{\n\tname:          \"ISO 8859-8\",\n\tmib:           identifier.ISOLatinHebrew,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x97}},\n\t\t{2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xaa, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x8e}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x8f}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8,\n\t\t0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1,\n\t\t0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9,\n\t\t0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xaa0000d7, 0xba0000f7, 0xe00005d0, 0xe10005d1,\n\t\t0xe20005d2, 0xe30005d3, 0xe40005d4, 0xe50005d5, 0xe60005d6, 0xe70005d7, 0xe80005d8, 0xe90005d9,\n\t\t0xea0005da, 0xeb0005db, 0xec0005dc, 0xed0005dd, 0xee0005de, 0xef0005df, 0xf00005e0, 0xf10005e1,\n\t\t0xf20005e2, 0xf30005e3, 0xf40005e4, 0xf50005e5, 0xf60005e6, 0xf70005e7, 0xf80005e8, 0xf90005e9,\n\t\t0xfa0005ea, 0xfd00200e, 0xfe00200f, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t\t0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017, 0xdf002017,\n\t},\n}\n\n// ISO8859_9 is the ISO 8859-9 encoding.\nvar ISO8859_9 encoding.Encoding = &iso8859_9\n\nvar iso8859_9 = charmap{\n\tname:          \"ISO 8859-9\",\n\tmib:           identifier.ISOLatin5,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x80, 0x00}}, {2, [3]byte{0xc2, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x82, 0x00}}, {2, [3]byte{0xc2, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x84, 0x00}}, {2, [3]byte{0xc2, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x86, 0x00}}, {2, [3]byte{0xc2, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x88, 0x00}}, {2, [3]byte{0xc2, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x92, 0x00}}, {2, [3]byte{0xc2, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x94, 0x00}}, {2, [3]byte{0xc2, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x96, 0x00}}, {2, [3]byte{0xc2, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x98, 0x00}}, {2, [3]byte{0xc2, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9a, 0x00}}, {2, [3]byte{0xc2, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9c, 0x00}}, {2, [3]byte{0xc2, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc2, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0x80000080, 0x81000081, 0x82000082, 0x83000083, 0x84000084, 0x85000085, 0x86000086, 0x87000087,\n\t\t0x88000088, 0x89000089, 0x8a00008a, 0x8b00008b, 0x8c00008c, 0x8d00008d, 0x8e00008e, 0x8f00008f,\n\t\t0x90000090, 0x91000091, 0x92000092, 0x93000093, 0x94000094, 0x95000095, 0x96000096, 0x97000097,\n\t\t0x98000098, 0x99000099, 0x9a00009a, 0x9b00009b, 0x9c00009c, 0x9d00009d, 0x9e00009e, 0x9f00009f,\n\t\t0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7,\n\t\t0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af,\n\t\t0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7,\n\t\t0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf,\n\t\t0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7,\n\t\t0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf,\n\t\t0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8,\n\t\t0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2,\n\t\t0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea,\n\t\t0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3,\n\t\t0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb,\n\t\t0xfc0000fc, 0xff0000ff, 0xd000011e, 0xf000011f, 0xdd000130, 0xfd000131, 0xde00015e, 0xfe00015f,\n\t},\n}\n\n// ISO8859_10 is the ISO 8859-10 encoding.\nvar ISO8859_10 encoding.Encoding = &iso8859_10\n\nvar iso8859_10 = charmap{\n\tname:          \"ISO 8859-10\",\n\tmib:           identifier.ISOLatin6,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x92, 0x00}}, {2, [3]byte{0xc4, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xbb, 0x00}}, {2, [3]byte{0xc4, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xaa, 0x00}}, {2, [3]byte{0xc5, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x93, 0x00}}, {2, [3]byte{0xc4, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x95}},\n\t\t{2, [3]byte{0xc5, 0xab, 0x00}}, {2, [3]byte{0xc5, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc5, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x97, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc5, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc5, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc4, 0xb8, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa70000a7, 0xad0000ad, 0xb00000b0, 0xb70000b7, 0xc10000c1, 0xc20000c2, 0xc30000c3,\n\t\t0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc90000c9, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xcf0000cf,\n\t\t0xd00000d0, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd80000d8, 0xda0000da, 0xdb0000db,\n\t\t0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4,\n\t\t0xe50000e5, 0xe60000e6, 0xe90000e9, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf00000f0,\n\t\t0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf80000f8, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc,\n\t\t0xfd0000fd, 0xfe0000fe, 0xc0000100, 0xe0000101, 0xa1000104, 0xb1000105, 0xc800010c, 0xe800010d,\n\t\t0xa9000110, 0xb9000111, 0xa2000112, 0xb2000113, 0xcc000116, 0xec000117, 0xca000118, 0xea000119,\n\t\t0xa3000122, 0xb3000123, 0xa5000128, 0xb5000129, 0xa400012a, 0xb400012b, 0xc700012e, 0xe700012f,\n\t\t0xa6000136, 0xb6000137, 0xff000138, 0xa800013b, 0xb800013c, 0xd1000145, 0xf1000146, 0xaf00014a,\n\t\t0xbf00014b, 0xd200014c, 0xf200014d, 0xaa000160, 0xba000161, 0xab000166, 0xbb000167, 0xd7000168,\n\t\t0xf7000169, 0xae00016a, 0xbe00016b, 0xd9000172, 0xf9000173, 0xac00017d, 0xbc00017e, 0xbd002015,\n\t\t0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015,\n\t\t0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015,\n\t\t0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015,\n\t\t0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015, 0xbd002015,\n\t},\n}\n\n// ISO8859_13 is the ISO 8859-13 encoding.\nvar ISO8859_13 encoding.Encoding = &iso8859_13\n\nvar iso8859_13 = charmap{\n\tname:          \"ISO 8859-13\",\n\tmib:           identifier.ISO885913,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9d}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9c}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x99}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa90000a9, 0xab0000ab,\n\t\t0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb50000b5,\n\t\t0xb60000b6, 0xb70000b7, 0xb90000b9, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xc40000c4,\n\t\t0xc50000c5, 0xaf0000c6, 0xc90000c9, 0xd30000d3, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xa80000d8,\n\t\t0xdc0000dc, 0xdf0000df, 0xe40000e4, 0xe50000e5, 0xbf0000e6, 0xe90000e9, 0xf30000f3, 0xf50000f5,\n\t\t0xf60000f6, 0xf70000f7, 0xb80000f8, 0xfc0000fc, 0xc2000100, 0xe2000101, 0xc0000104, 0xe0000105,\n\t\t0xc3000106, 0xe3000107, 0xc800010c, 0xe800010d, 0xc7000112, 0xe7000113, 0xcb000116, 0xeb000117,\n\t\t0xc6000118, 0xe6000119, 0xcc000122, 0xec000123, 0xce00012a, 0xee00012b, 0xc100012e, 0xe100012f,\n\t\t0xcd000136, 0xed000137, 0xcf00013b, 0xef00013c, 0xd9000141, 0xf9000142, 0xd1000143, 0xf1000144,\n\t\t0xd2000145, 0xf2000146, 0xd400014c, 0xf400014d, 0xaa000156, 0xba000157, 0xda00015a, 0xfa00015b,\n\t\t0xd0000160, 0xf0000161, 0xdb00016a, 0xfb00016b, 0xd8000172, 0xf8000173, 0xca000179, 0xea00017a,\n\t\t0xdd00017b, 0xfd00017c, 0xde00017d, 0xfe00017e, 0xff002019, 0xb400201c, 0xa100201d, 0xa500201e,\n\t\t0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e,\n\t\t0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e,\n\t\t0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e,\n\t\t0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e, 0xa500201e,\n\t},\n}\n\n// ISO8859_14 is the ISO 8859-14 encoding.\nvar ISO8859_14 encoding.Encoding = &iso8859_14\n\nvar iso8859_14 = charmap{\n\tname:          \"ISO 8859-14\",\n\tmib:           identifier.ISO885914,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe1, 0xb8, 0x82}},\n\t\t{3, [3]byte{0xe1, 0xb8, 0x83}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8a, 0x00}}, {2, [3]byte{0xc4, 0x8b, 0x00}},\n\t\t{3, [3]byte{0xe1, 0xb8, 0x8a}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{3, [3]byte{0xe1, 0xba, 0x80}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{3, [3]byte{0xe1, 0xba, 0x82}}, {3, [3]byte{0xe1, 0xb8, 0x8b}},\n\t\t{3, [3]byte{0xe1, 0xbb, 0xb2}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}},\n\t\t{3, [3]byte{0xe1, 0xb8, 0x9e}}, {3, [3]byte{0xe1, 0xb8, 0x9f}},\n\t\t{2, [3]byte{0xc4, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0xa1, 0x00}},\n\t\t{3, [3]byte{0xe1, 0xb9, 0x80}}, {3, [3]byte{0xe1, 0xb9, 0x81}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0x96}},\n\t\t{3, [3]byte{0xe1, 0xba, 0x81}}, {3, [3]byte{0xe1, 0xb9, 0x97}},\n\t\t{3, [3]byte{0xe1, 0xba, 0x83}}, {3, [3]byte{0xe1, 0xb9, 0xa0}},\n\t\t{3, [3]byte{0xe1, 0xbb, 0xb3}}, {3, [3]byte{0xe1, 0xba, 0x84}},\n\t\t{3, [3]byte{0xe1, 0xba, 0x85}}, {3, [3]byte{0xe1, 0xb9, 0xa1}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0xaa}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb5, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {3, [3]byte{0xe1, 0xb9, 0xab}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa30000a3, 0xa70000a7, 0xa90000a9, 0xad0000ad, 0xae0000ae, 0xb60000b6, 0xc00000c0,\n\t\t0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8,\n\t\t0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1,\n\t\t0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd80000d8, 0xd90000d9, 0xda0000da,\n\t\t0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3,\n\t\t0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb,\n\t\t0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4,\n\t\t0xf50000f5, 0xf60000f6, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd,\n\t\t0xff0000ff, 0xa400010a, 0xa500010b, 0xb2000120, 0xb3000121, 0xd0000174, 0xf0000175, 0xde000176,\n\t\t0xfe000177, 0xaf000178, 0xa1001e02, 0xa2001e03, 0xa6001e0a, 0xab001e0b, 0xb0001e1e, 0xb1001e1f,\n\t\t0xb4001e40, 0xb5001e41, 0xb7001e56, 0xb9001e57, 0xbb001e60, 0xbf001e61, 0xd7001e6a, 0xf7001e6b,\n\t\t0xa8001e80, 0xb8001e81, 0xaa001e82, 0xba001e83, 0xbd001e84, 0xbe001e85, 0xac001ef2, 0xbc001ef3,\n\t\t0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3,\n\t\t0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3,\n\t\t0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3,\n\t\t0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3, 0xbc001ef3,\n\t},\n}\n\n// ISO8859_15 is the ISO 8859-15 encoding.\nvar ISO8859_15 encoding.Encoding = &iso8859_15\n\nvar iso8859_15 = charmap{\n\tname:          \"ISO 8859-15\",\n\tmib:           identifier.ISO885915,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa50000a5, 0xa70000a7, 0xa90000a9, 0xaa0000aa,\n\t\t0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2,\n\t\t0xb30000b3, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbf0000bf,\n\t\t0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7,\n\t\t0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf,\n\t\t0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7,\n\t\t0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df,\n\t\t0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7,\n\t\t0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef,\n\t\t0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7,\n\t\t0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff,\n\t\t0xbc000152, 0xbd000153, 0xa6000160, 0xa8000161, 0xbe000178, 0xb400017d, 0xb800017e, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t},\n}\n\n// ISO8859_16 is the ISO 8859-16 encoding.\nvar ISO8859_16 encoding.Encoding = &iso8859_16\n\nvar iso8859_16 = charmap{\n\tname:          \"ISO 8859-16\",\n\tmib:           identifier.ISO885916,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x80, 0x9e}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc8, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9d}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc4, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc8, 0x99, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb8, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc5, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0x98, 0x00}},\n\t\t{2, [3]byte{0xc8, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc5, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc8, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa70000a7, 0xa90000a9, 0xab0000ab, 0xad0000ad, 0xb00000b0, 0xb10000b1, 0xb60000b6,\n\t\t0xb70000b7, 0xbb0000bb, 0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc60000c6, 0xc70000c7,\n\t\t0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf,\n\t\t0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc,\n\t\t0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe60000e6, 0xe70000e7, 0xe80000e8,\n\t\t0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf20000f2,\n\t\t0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xff0000ff,\n\t\t0xc3000102, 0xe3000103, 0xa1000104, 0xa2000105, 0xc5000106, 0xe5000107, 0xb200010c, 0xb900010d,\n\t\t0xd0000110, 0xf0000111, 0xdd000118, 0xfd000119, 0xa3000141, 0xb3000142, 0xd1000143, 0xf1000144,\n\t\t0xd5000150, 0xf5000151, 0xbc000152, 0xbd000153, 0xd700015a, 0xf700015b, 0xa6000160, 0xa8000161,\n\t\t0xd8000170, 0xf8000171, 0xbe000178, 0xac000179, 0xae00017a, 0xaf00017b, 0xbf00017c, 0xb400017d,\n\t\t0xb800017e, 0xaa000218, 0xba000219, 0xde00021a, 0xfe00021b, 0xb500201d, 0xa500201e, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t\t0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac, 0xa40020ac,\n\t},\n}\n\n// KOI8R is the KOI8-R encoding.\nvar KOI8R encoding.Encoding = &koi8R\n\nvar koi8R = charmap{\n\tname:          \"KOI8-R\",\n\tmib:           identifier.KOI8R,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x8c, 0xa0}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0xa1}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0x91}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x92}}, {2, [3]byte{0xd1, 0x91, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x93}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x95}}, {3, [3]byte{0xe2, 0x95, 0x96}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {3, [3]byte{0xe2, 0x95, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9d}}, {3, [3]byte{0xe2, 0x95, 0x9e}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0xa0}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa1}}, {2, [3]byte{0xd0, 0x81, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa2}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa4}}, {3, [3]byte{0xe2, 0x95, 0xa5}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa9}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {3, [3]byte{0xe2, 0x95, 0xab}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xac}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0x9a0000a0, 0xbf0000a9, 0x9c0000b0, 0x9d0000b2, 0x9e0000b7, 0x9f0000f7, 0xb3000401, 0xe1000410,\n\t\t0xe2000411, 0xf7000412, 0xe7000413, 0xe4000414, 0xe5000415, 0xf6000416, 0xfa000417, 0xe9000418,\n\t\t0xea000419, 0xeb00041a, 0xec00041b, 0xed00041c, 0xee00041d, 0xef00041e, 0xf000041f, 0xf2000420,\n\t\t0xf3000421, 0xf4000422, 0xf5000423, 0xe6000424, 0xe8000425, 0xe3000426, 0xfe000427, 0xfb000428,\n\t\t0xfd000429, 0xff00042a, 0xf900042b, 0xf800042c, 0xfc00042d, 0xe000042e, 0xf100042f, 0xc1000430,\n\t\t0xc2000431, 0xd7000432, 0xc7000433, 0xc4000434, 0xc5000435, 0xd6000436, 0xda000437, 0xc9000438,\n\t\t0xca000439, 0xcb00043a, 0xcc00043b, 0xcd00043c, 0xce00043d, 0xcf00043e, 0xd000043f, 0xd2000440,\n\t\t0xd3000441, 0xd4000442, 0xd5000443, 0xc6000444, 0xc8000445, 0xc3000446, 0xde000447, 0xdb000448,\n\t\t0xdd000449, 0xdf00044a, 0xd900044b, 0xd800044c, 0xdc00044d, 0xc000044e, 0xd100044f, 0xa3000451,\n\t\t0x95002219, 0x9600221a, 0x97002248, 0x98002264, 0x99002265, 0x93002320, 0x9b002321, 0x80002500,\n\t\t0x81002502, 0x8200250c, 0x83002510, 0x84002514, 0x85002518, 0x8600251c, 0x87002524, 0x8800252c,\n\t\t0x89002534, 0x8a00253c, 0xa0002550, 0xa1002551, 0xa2002552, 0xa4002553, 0xa5002554, 0xa6002555,\n\t\t0xa7002556, 0xa8002557, 0xa9002558, 0xaa002559, 0xab00255a, 0xac00255b, 0xad00255c, 0xae00255d,\n\t\t0xaf00255e, 0xb000255f, 0xb1002560, 0xb2002561, 0xb4002562, 0xb5002563, 0xb6002564, 0xb7002565,\n\t\t0xb8002566, 0xb9002567, 0xba002568, 0xbb002569, 0xbc00256a, 0xbd00256b, 0xbe00256c, 0x8b002580,\n\t\t0x8c002584, 0x8d002588, 0x8e00258c, 0x8f002590, 0x90002591, 0x91002592, 0x92002593, 0x940025a0,\n\t},\n}\n\n// KOI8U is the KOI8-U encoding.\nvar KOI8U encoding.Encoding = &koi8U\n\nvar koi8U = charmap{\n\tname:          \"KOI8-U\",\n\tmib:           identifier.KOI8U,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x80}}, {3, [3]byte{0xe2, 0x94, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x8c}}, {3, [3]byte{0xe2, 0x94, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x94}}, {3, [3]byte{0xe2, 0x94, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x94, 0x9c}}, {3, [3]byte{0xe2, 0x94, 0xa4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xac}}, {3, [3]byte{0xe2, 0x94, 0xb4}},\n\t\t{3, [3]byte{0xe2, 0x94, 0xbc}}, {3, [3]byte{0xe2, 0x96, 0x80}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x84}}, {3, [3]byte{0xe2, 0x96, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x8c}}, {3, [3]byte{0xe2, 0x96, 0x90}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x91}}, {3, [3]byte{0xe2, 0x96, 0x92}},\n\t\t{3, [3]byte{0xe2, 0x96, 0x93}}, {3, [3]byte{0xe2, 0x8c, 0xa0}},\n\t\t{3, [3]byte{0xe2, 0x96, 0xa0}}, {3, [3]byte{0xe2, 0x88, 0x99}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9a}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x8c, 0xa1}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb7, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x90}}, {3, [3]byte{0xe2, 0x95, 0x91}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x92}}, {2, [3]byte{0xd1, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x94, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x94}},\n\t\t{2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x97}}, {3, [3]byte{0xe2, 0x95, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x99}}, {3, [3]byte{0xe2, 0x95, 0x9a}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9b}}, {2, [3]byte{0xd2, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9e, 0x00}}, {3, [3]byte{0xe2, 0x95, 0x9e}},\n\t\t{3, [3]byte{0xe2, 0x95, 0x9f}}, {3, [3]byte{0xe2, 0x95, 0xa0}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa1}}, {2, [3]byte{0xd0, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x84, 0x00}}, {3, [3]byte{0xe2, 0x95, 0xa3}},\n\t\t{2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa6}}, {3, [3]byte{0xe2, 0x95, 0xa7}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xa8}}, {3, [3]byte{0xe2, 0x95, 0xa9}},\n\t\t{3, [3]byte{0xe2, 0x95, 0xaa}}, {2, [3]byte{0xd2, 0x90, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd0, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb1, 0x00}}, {2, [3]byte{0xd1, 0x86, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x85, 0x00}}, {2, [3]byte{0xd0, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb9, 0x00}}, {2, [3]byte{0xd0, 0xba, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbb, 0x00}}, {2, [3]byte{0xd0, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbd, 0x00}}, {2, [3]byte{0xd0, 0xbe, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbf, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb2, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb7, 0x00}}, {2, [3]byte{0xd1, 0x88, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8d, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x90, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x91, 0x00}}, {2, [3]byte{0xd0, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa5, 0x00}}, {2, [3]byte{0xd0, 0x98, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x99, 0x00}}, {2, [3]byte{0xd0, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x9c, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9d, 0x00}}, {2, [3]byte{0xd0, 0x9e, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9f, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x92, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x97, 0x00}}, {2, [3]byte{0xd0, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xad, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa7, 0x00}}, {2, [3]byte{0xd0, 0xaa, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0x9a0000a0, 0xbf0000a9, 0x9c0000b0, 0x9d0000b2, 0x9e0000b7, 0x9f0000f7, 0xb3000401, 0xb4000404,\n\t\t0xb6000406, 0xb7000407, 0xbe00040e, 0xe1000410, 0xe2000411, 0xf7000412, 0xe7000413, 0xe4000414,\n\t\t0xe5000415, 0xf6000416, 0xfa000417, 0xe9000418, 0xea000419, 0xeb00041a, 0xec00041b, 0xed00041c,\n\t\t0xee00041d, 0xef00041e, 0xf000041f, 0xf2000420, 0xf3000421, 0xf4000422, 0xf5000423, 0xe6000424,\n\t\t0xe8000425, 0xe3000426, 0xfe000427, 0xfb000428, 0xfd000429, 0xff00042a, 0xf900042b, 0xf800042c,\n\t\t0xfc00042d, 0xe000042e, 0xf100042f, 0xc1000430, 0xc2000431, 0xd7000432, 0xc7000433, 0xc4000434,\n\t\t0xc5000435, 0xd6000436, 0xda000437, 0xc9000438, 0xca000439, 0xcb00043a, 0xcc00043b, 0xcd00043c,\n\t\t0xce00043d, 0xcf00043e, 0xd000043f, 0xd2000440, 0xd3000441, 0xd4000442, 0xd5000443, 0xc6000444,\n\t\t0xc8000445, 0xc3000446, 0xde000447, 0xdb000448, 0xdd000449, 0xdf00044a, 0xd900044b, 0xd800044c,\n\t\t0xdc00044d, 0xc000044e, 0xd100044f, 0xa3000451, 0xa4000454, 0xa6000456, 0xa7000457, 0xae00045e,\n\t\t0xbd000490, 0xad000491, 0x95002219, 0x9600221a, 0x97002248, 0x98002264, 0x99002265, 0x93002320,\n\t\t0x9b002321, 0x80002500, 0x81002502, 0x8200250c, 0x83002510, 0x84002514, 0x85002518, 0x8600251c,\n\t\t0x87002524, 0x8800252c, 0x89002534, 0x8a00253c, 0xa0002550, 0xa1002551, 0xa2002552, 0xa5002554,\n\t\t0xa8002557, 0xa9002558, 0xaa002559, 0xab00255a, 0xac00255b, 0xaf00255e, 0xb000255f, 0xb1002560,\n\t\t0xb2002561, 0xb5002563, 0xb8002566, 0xb9002567, 0xba002568, 0xbb002569, 0xbc00256a, 0x8b002580,\n\t\t0x8c002584, 0x8d002588, 0x8e00258c, 0x8f002590, 0x90002591, 0x91002592, 0x92002593, 0x940025a0,\n\t},\n}\n\n// Macintosh is the Macintosh encoding.\nvar Macintosh encoding.Encoding = &macintosh\n\nvar macintosh = charmap{\n\tname:          \"Macintosh\",\n\tmib:           identifier.Macintosh,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x91, 0x00}}, {2, [3]byte{0xc3, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa2, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa5, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa9, 0x00}}, {2, [3]byte{0xc3, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xad, 0x00}}, {2, [3]byte{0xc3, 0xac, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb1, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbb, 0x00}}, {2, [3]byte{0xc3, 0xbc, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {2, [3]byte{0xc2, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xc2, 0xb4, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa0}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x98, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}},\n\t\t{2, [3]byte{0xc2, 0xa5, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x82}}, {3, [3]byte{0xe2, 0x88, 0x91}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x8f}}, {2, [3]byte{0xcf, 0x80, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0xab}}, {2, [3]byte{0xc2, 0xaa, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbf, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x86}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0x80, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xc5, 0x93, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x97, 0x8a}},\n\t\t{2, [3]byte{0xc3, 0xbf, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x81, 0x84}}, {3, [3]byte{0xe2, 0x82, 0xac}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xb9}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{3, [3]byte{0xef, 0xac, 0x81}}, {3, [3]byte{0xef, 0xac, 0x82}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa1}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xe2, 0x80, 0x9e}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xb0}}, {2, [3]byte{0xc3, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8b, 0x00}}, {2, [3]byte{0xc3, 0x88, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8f, 0x00}}, {2, [3]byte{0xc3, 0x8c, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x93, 0x00}}, {2, [3]byte{0xc3, 0x94, 0x00}},\n\t\t{3, [3]byte{0xef, 0xa3, 0xbf}}, {2, [3]byte{0xc3, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x99, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x86, 0x00}}, {2, [3]byte{0xcb, 0x9c, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaf, 0x00}}, {2, [3]byte{0xcb, 0x98, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x99, 0x00}}, {2, [3]byte{0xcb, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xca0000a0, 0xc10000a1, 0xa20000a2, 0xa30000a3, 0xb40000a5, 0xa40000a7, 0xac0000a8, 0xa90000a9,\n\t\t0xbb0000aa, 0xc70000ab, 0xc20000ac, 0xa80000ae, 0xf80000af, 0xa10000b0, 0xb10000b1, 0xab0000b4,\n\t\t0xb50000b5, 0xa60000b6, 0xe10000b7, 0xfc0000b8, 0xbc0000ba, 0xc80000bb, 0xc00000bf, 0xcb0000c0,\n\t\t0xe70000c1, 0xe50000c2, 0xcc0000c3, 0x800000c4, 0x810000c5, 0xae0000c6, 0x820000c7, 0xe90000c8,\n\t\t0x830000c9, 0xe60000ca, 0xe80000cb, 0xed0000cc, 0xea0000cd, 0xeb0000ce, 0xec0000cf, 0x840000d1,\n\t\t0xf10000d2, 0xee0000d3, 0xef0000d4, 0xcd0000d5, 0x850000d6, 0xaf0000d8, 0xf40000d9, 0xf20000da,\n\t\t0xf30000db, 0x860000dc, 0xa70000df, 0x880000e0, 0x870000e1, 0x890000e2, 0x8b0000e3, 0x8a0000e4,\n\t\t0x8c0000e5, 0xbe0000e6, 0x8d0000e7, 0x8f0000e8, 0x8e0000e9, 0x900000ea, 0x910000eb, 0x930000ec,\n\t\t0x920000ed, 0x940000ee, 0x950000ef, 0x960000f1, 0x980000f2, 0x970000f3, 0x990000f4, 0x9b0000f5,\n\t\t0x9a0000f6, 0xd60000f7, 0xbf0000f8, 0x9d0000f9, 0x9c0000fa, 0x9e0000fb, 0x9f0000fc, 0xd80000ff,\n\t\t0xf5000131, 0xce000152, 0xcf000153, 0xd9000178, 0xc4000192, 0xf60002c6, 0xff0002c7, 0xf90002d8,\n\t\t0xfa0002d9, 0xfb0002da, 0xfe0002db, 0xf70002dc, 0xfd0002dd, 0xbd0003a9, 0xb90003c0, 0xd0002013,\n\t\t0xd1002014, 0xd4002018, 0xd5002019, 0xe200201a, 0xd200201c, 0xd300201d, 0xe300201e, 0xa0002020,\n\t\t0xe0002021, 0xa5002022, 0xc9002026, 0xe4002030, 0xdc002039, 0xdd00203a, 0xda002044, 0xdb0020ac,\n\t\t0xaa002122, 0xb6002202, 0xc6002206, 0xb800220f, 0xb7002211, 0xc300221a, 0xb000221e, 0xba00222b,\n\t\t0xc5002248, 0xad002260, 0xb2002264, 0xb3002265, 0xd70025ca, 0xf000f8ff, 0xde00fb01, 0xdf00fb02,\n\t},\n}\n\n// MacintoshCyrillic is the Macintosh Cyrillic encoding.\nvar MacintoshCyrillic encoding.Encoding = &macintoshCyrillic\n\nvar macintoshCyrillic = charmap{\n\tname:          \"Macintosh Cyrillic\",\n\tmib:           identifier.MacintoshCyrillic,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {2, [3]byte{0xc2, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xd2, 0x90, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x84, 0xa2}}, {2, [3]byte{0xd0, 0x82, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0xa0}},\n\t\t{2, [3]byte{0xd0, 0x83, 0x00}}, {2, [3]byte{0xd1, 0x93, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x9e}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x89, 0xa4}}, {3, [3]byte{0xe2, 0x89, 0xa5}},\n\t\t{2, [3]byte{0xd1, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd2, 0x91, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x94, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x87, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x89, 0x00}}, {2, [3]byte{0xd1, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x9a, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {3, [3]byte{0xe2, 0x88, 0x9a}},\n\t\t{2, [3]byte{0xc6, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x89, 0x88}},\n\t\t{3, [3]byte{0xe2, 0x88, 0x86}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbb, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9c, 0x00}}, {2, [3]byte{0xd1, 0x95, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9c}}, {3, [3]byte{0xe2, 0x80, 0x9d}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x98}}, {3, [3]byte{0xe2, 0x80, 0x99}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x9e}},\n\t\t{2, [3]byte{0xd0, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x9e, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8f, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x84, 0x96}}, {2, [3]byte{0xd0, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x91, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8e, 0x00}}, {3, [3]byte{0xe2, 0x82, 0xac}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xca0000a0, 0xa30000a3, 0xa40000a7, 0xa90000a9, 0xc70000ab, 0xc20000ac, 0xa80000ae, 0xa10000b0,\n\t\t0xb10000b1, 0xb50000b5, 0xa60000b6, 0xc80000bb, 0xd60000f7, 0xc4000192, 0xdd000401, 0xab000402,\n\t\t0xae000403, 0xb8000404, 0xc1000405, 0xa7000406, 0xba000407, 0xb7000408, 0xbc000409, 0xbe00040a,\n\t\t0xcb00040b, 0xcd00040c, 0xd800040e, 0xda00040f, 0x80000410, 0x81000411, 0x82000412, 0x83000413,\n\t\t0x84000414, 0x85000415, 0x86000416, 0x87000417, 0x88000418, 0x89000419, 0x8a00041a, 0x8b00041b,\n\t\t0x8c00041c, 0x8d00041d, 0x8e00041e, 0x8f00041f, 0x90000420, 0x91000421, 0x92000422, 0x93000423,\n\t\t0x94000424, 0x95000425, 0x96000426, 0x97000427, 0x98000428, 0x99000429, 0x9a00042a, 0x9b00042b,\n\t\t0x9c00042c, 0x9d00042d, 0x9e00042e, 0x9f00042f, 0xe0000430, 0xe1000431, 0xe2000432, 0xe3000433,\n\t\t0xe4000434, 0xe5000435, 0xe6000436, 0xe7000437, 0xe8000438, 0xe9000439, 0xea00043a, 0xeb00043b,\n\t\t0xec00043c, 0xed00043d, 0xee00043e, 0xef00043f, 0xf0000440, 0xf1000441, 0xf2000442, 0xf3000443,\n\t\t0xf4000444, 0xf5000445, 0xf6000446, 0xf7000447, 0xf8000448, 0xf9000449, 0xfa00044a, 0xfb00044b,\n\t\t0xfc00044c, 0xfd00044d, 0xfe00044e, 0xdf00044f, 0xde000451, 0xac000452, 0xaf000453, 0xb9000454,\n\t\t0xcf000455, 0xb4000456, 0xbb000457, 0xc0000458, 0xbd000459, 0xbf00045a, 0xcc00045b, 0xce00045c,\n\t\t0xd900045e, 0xdb00045f, 0xa2000490, 0xb6000491, 0xd0002013, 0xd1002014, 0xd4002018, 0xd5002019,\n\t\t0xd200201c, 0xd300201d, 0xd700201e, 0xa0002020, 0xa5002022, 0xc9002026, 0xff0020ac, 0xdc002116,\n\t\t0xaa002122, 0xc6002206, 0xc300221a, 0xb000221e, 0xc5002248, 0xad002260, 0xb2002264, 0xb3002265,\n\t},\n}\n\n// Windows874 is the Windows 874 encoding.\nvar Windows874 encoding.Encoding = &windows874\n\nvar windows874 = charmap{\n\tname:          \"Windows 874\",\n\tmib:           identifier.Windows874,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xe0, 0xb8, 0x81}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x82}}, {3, [3]byte{0xe0, 0xb8, 0x83}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x84}}, {3, [3]byte{0xe0, 0xb8, 0x85}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x86}}, {3, [3]byte{0xe0, 0xb8, 0x87}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x88}}, {3, [3]byte{0xe0, 0xb8, 0x89}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x8a}}, {3, [3]byte{0xe0, 0xb8, 0x8b}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x8c}}, {3, [3]byte{0xe0, 0xb8, 0x8d}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x8e}}, {3, [3]byte{0xe0, 0xb8, 0x8f}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x90}}, {3, [3]byte{0xe0, 0xb8, 0x91}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x92}}, {3, [3]byte{0xe0, 0xb8, 0x93}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x94}}, {3, [3]byte{0xe0, 0xb8, 0x95}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x96}}, {3, [3]byte{0xe0, 0xb8, 0x97}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x98}}, {3, [3]byte{0xe0, 0xb8, 0x99}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x9a}}, {3, [3]byte{0xe0, 0xb8, 0x9b}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x9c}}, {3, [3]byte{0xe0, 0xb8, 0x9d}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0x9e}}, {3, [3]byte{0xe0, 0xb8, 0x9f}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xa0}}, {3, [3]byte{0xe0, 0xb8, 0xa1}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xa2}}, {3, [3]byte{0xe0, 0xb8, 0xa3}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xa4}}, {3, [3]byte{0xe0, 0xb8, 0xa5}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xa6}}, {3, [3]byte{0xe0, 0xb8, 0xa7}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xa8}}, {3, [3]byte{0xe0, 0xb8, 0xa9}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xaa}}, {3, [3]byte{0xe0, 0xb8, 0xab}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xac}}, {3, [3]byte{0xe0, 0xb8, 0xad}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xae}}, {3, [3]byte{0xe0, 0xb8, 0xaf}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xb0}}, {3, [3]byte{0xe0, 0xb8, 0xb1}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xb2}}, {3, [3]byte{0xe0, 0xb8, 0xb3}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xb4}}, {3, [3]byte{0xe0, 0xb8, 0xb5}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xb6}}, {3, [3]byte{0xe0, 0xb8, 0xb7}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xb8}}, {3, [3]byte{0xe0, 0xb8, 0xb9}},\n\t\t{3, [3]byte{0xe0, 0xb8, 0xba}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe0, 0xb8, 0xbf}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x80}}, {3, [3]byte{0xe0, 0xb9, 0x81}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x82}}, {3, [3]byte{0xe0, 0xb9, 0x83}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x84}}, {3, [3]byte{0xe0, 0xb9, 0x85}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x86}}, {3, [3]byte{0xe0, 0xb9, 0x87}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x88}}, {3, [3]byte{0xe0, 0xb9, 0x89}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x8a}}, {3, [3]byte{0xe0, 0xb9, 0x8b}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x8c}}, {3, [3]byte{0xe0, 0xb9, 0x8d}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x8e}}, {3, [3]byte{0xe0, 0xb9, 0x8f}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x90}}, {3, [3]byte{0xe0, 0xb9, 0x91}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x92}}, {3, [3]byte{0xe0, 0xb9, 0x93}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x94}}, {3, [3]byte{0xe0, 0xb9, 0x95}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x96}}, {3, [3]byte{0xe0, 0xb9, 0x97}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x98}}, {3, [3]byte{0xe0, 0xb9, 0x99}},\n\t\t{3, [3]byte{0xe0, 0xb9, 0x9a}}, {3, [3]byte{0xe0, 0xb9, 0x9b}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa1000e01, 0xa2000e02, 0xa3000e03, 0xa4000e04, 0xa5000e05, 0xa6000e06, 0xa7000e07,\n\t\t0xa8000e08, 0xa9000e09, 0xaa000e0a, 0xab000e0b, 0xac000e0c, 0xad000e0d, 0xae000e0e, 0xaf000e0f,\n\t\t0xb0000e10, 0xb1000e11, 0xb2000e12, 0xb3000e13, 0xb4000e14, 0xb5000e15, 0xb6000e16, 0xb7000e17,\n\t\t0xb8000e18, 0xb9000e19, 0xba000e1a, 0xbb000e1b, 0xbc000e1c, 0xbd000e1d, 0xbe000e1e, 0xbf000e1f,\n\t\t0xc0000e20, 0xc1000e21, 0xc2000e22, 0xc3000e23, 0xc4000e24, 0xc5000e25, 0xc6000e26, 0xc7000e27,\n\t\t0xc8000e28, 0xc9000e29, 0xca000e2a, 0xcb000e2b, 0xcc000e2c, 0xcd000e2d, 0xce000e2e, 0xcf000e2f,\n\t\t0xd0000e30, 0xd1000e31, 0xd2000e32, 0xd3000e33, 0xd4000e34, 0xd5000e35, 0xd6000e36, 0xd7000e37,\n\t\t0xd8000e38, 0xd9000e39, 0xda000e3a, 0xdf000e3f, 0xe0000e40, 0xe1000e41, 0xe2000e42, 0xe3000e43,\n\t\t0xe4000e44, 0xe5000e45, 0xe6000e46, 0xe7000e47, 0xe8000e48, 0xe9000e49, 0xea000e4a, 0xeb000e4b,\n\t\t0xec000e4c, 0xed000e4d, 0xee000e4e, 0xef000e4f, 0xf0000e50, 0xf1000e51, 0xf2000e52, 0xf3000e53,\n\t\t0xf4000e54, 0xf5000e55, 0xf6000e56, 0xf7000e57, 0xf8000e58, 0xf9000e59, 0xfa000e5a, 0xfb000e5b,\n\t\t0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x9300201c, 0x9400201d, 0x95002022, 0x85002026,\n\t\t0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac,\n\t\t0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac,\n\t\t0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac,\n\t\t0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac, 0x800020ac,\n\t},\n}\n\n// Windows1250 is the Windows 1250 encoding.\nvar Windows1250 encoding.Encoding = &windows1250\n\nvar windows1250 = charmap{\n\tname:          \"Windows 1250\",\n\tmib:           identifier.Windows1250,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xa4, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc5, 0xb9, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xcb, 0x87, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x98, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc4, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xbd, 0x00}}, {2, [3]byte{0xcb, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc4, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x87, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc5, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x98, 0x00}}, {2, [3]byte{0xc5, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x95, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc4, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x87, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9b, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc4, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc5, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x99, 0x00}}, {2, [3]byte{0xc5, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc5, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa3, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9, 0xab0000ab, 0xac0000ac,\n\t\t0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7,\n\t\t0xb80000b8, 0xbb0000bb, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc70000c7, 0xc90000c9, 0xcb0000cb,\n\t\t0xcd0000cd, 0xce0000ce, 0xd30000d3, 0xd40000d4, 0xd60000d6, 0xd70000d7, 0xda0000da, 0xdc0000dc,\n\t\t0xdd0000dd, 0xdf0000df, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe70000e7, 0xe90000e9, 0xeb0000eb,\n\t\t0xed0000ed, 0xee0000ee, 0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xfa0000fa, 0xfc0000fc,\n\t\t0xfd0000fd, 0xc3000102, 0xe3000103, 0xa5000104, 0xb9000105, 0xc6000106, 0xe6000107, 0xc800010c,\n\t\t0xe800010d, 0xcf00010e, 0xef00010f, 0xd0000110, 0xf0000111, 0xca000118, 0xea000119, 0xcc00011a,\n\t\t0xec00011b, 0xc5000139, 0xe500013a, 0xbc00013d, 0xbe00013e, 0xa3000141, 0xb3000142, 0xd1000143,\n\t\t0xf1000144, 0xd2000147, 0xf2000148, 0xd5000150, 0xf5000151, 0xc0000154, 0xe0000155, 0xd8000158,\n\t\t0xf8000159, 0x8c00015a, 0x9c00015b, 0xaa00015e, 0xba00015f, 0x8a000160, 0x9a000161, 0xde000162,\n\t\t0xfe000163, 0x8d000164, 0x9d000165, 0xd900016e, 0xf900016f, 0xdb000170, 0xfb000171, 0x8f000179,\n\t\t0x9f00017a, 0xaf00017b, 0xbf00017c, 0x8e00017d, 0x9e00017e, 0xa10002c7, 0xa20002d8, 0xff0002d9,\n\t\t0xb20002db, 0xbd0002dd, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c,\n\t\t0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039,\n\t\t0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t},\n}\n\n// Windows1251 is the Windows 1251 encoding.\nvar Windows1251 encoding.Encoding = &windows1251\n\nvar windows1251 = charmap{\n\tname:          \"Windows 1251\",\n\tmib:           identifier.Windows1251,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x82, 0x00}}, {2, [3]byte{0xd0, 0x83, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xd1, 0x93, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{2, [3]byte{0xd0, 0x89, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{2, [3]byte{0xd0, 0x8a, 0x00}}, {2, [3]byte{0xd0, 0x8c, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x8b, 0x00}}, {2, [3]byte{0xd0, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x92, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{2, [3]byte{0xd1, 0x99, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{2, [3]byte{0xd1, 0x9a, 0x00}}, {2, [3]byte{0xd1, 0x9c, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9b, 0x00}}, {2, [3]byte{0xd1, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x88, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xd2, 0x90, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x81, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x84, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xd0, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x96, 0x00}},\n\t\t{2, [3]byte{0xd2, 0x91, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x91, 0x00}}, {3, [3]byte{0xe2, 0x84, 0x96}},\n\t\t{2, [3]byte{0xd1, 0x94, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x95, 0x00}}, {2, [3]byte{0xd1, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x90, 0x00}}, {2, [3]byte{0xd0, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x92, 0x00}}, {2, [3]byte{0xd0, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x94, 0x00}}, {2, [3]byte{0xd0, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x96, 0x00}}, {2, [3]byte{0xd0, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x98, 0x00}}, {2, [3]byte{0xd0, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9a, 0x00}}, {2, [3]byte{0xd0, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9c, 0x00}}, {2, [3]byte{0xd0, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd0, 0x9e, 0x00}}, {2, [3]byte{0xd0, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa0, 0x00}}, {2, [3]byte{0xd0, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa2, 0x00}}, {2, [3]byte{0xd0, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa4, 0x00}}, {2, [3]byte{0xd0, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa6, 0x00}}, {2, [3]byte{0xd0, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xa8, 0x00}}, {2, [3]byte{0xd0, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xaa, 0x00}}, {2, [3]byte{0xd0, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xac, 0x00}}, {2, [3]byte{0xd0, 0xad, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xae, 0x00}}, {2, [3]byte{0xd0, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb0, 0x00}}, {2, [3]byte{0xd0, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb2, 0x00}}, {2, [3]byte{0xd0, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb4, 0x00}}, {2, [3]byte{0xd0, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb6, 0x00}}, {2, [3]byte{0xd0, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xb8, 0x00}}, {2, [3]byte{0xd0, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xba, 0x00}}, {2, [3]byte{0xd0, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbc, 0x00}}, {2, [3]byte{0xd0, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xd0, 0xbe, 0x00}}, {2, [3]byte{0xd0, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x80, 0x00}}, {2, [3]byte{0xd1, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x82, 0x00}}, {2, [3]byte{0xd1, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x84, 0x00}}, {2, [3]byte{0xd1, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x86, 0x00}}, {2, [3]byte{0xd1, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x88, 0x00}}, {2, [3]byte{0xd1, 0x89, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8a, 0x00}}, {2, [3]byte{0xd1, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8c, 0x00}}, {2, [3]byte{0xd1, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xd1, 0x8e, 0x00}}, {2, [3]byte{0xd1, 0x8f, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad,\n\t\t0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xbb0000bb, 0xa8000401,\n\t\t0x80000402, 0x81000403, 0xaa000404, 0xbd000405, 0xb2000406, 0xaf000407, 0xa3000408, 0x8a000409,\n\t\t0x8c00040a, 0x8e00040b, 0x8d00040c, 0xa100040e, 0x8f00040f, 0xc0000410, 0xc1000411, 0xc2000412,\n\t\t0xc3000413, 0xc4000414, 0xc5000415, 0xc6000416, 0xc7000417, 0xc8000418, 0xc9000419, 0xca00041a,\n\t\t0xcb00041b, 0xcc00041c, 0xcd00041d, 0xce00041e, 0xcf00041f, 0xd0000420, 0xd1000421, 0xd2000422,\n\t\t0xd3000423, 0xd4000424, 0xd5000425, 0xd6000426, 0xd7000427, 0xd8000428, 0xd9000429, 0xda00042a,\n\t\t0xdb00042b, 0xdc00042c, 0xdd00042d, 0xde00042e, 0xdf00042f, 0xe0000430, 0xe1000431, 0xe2000432,\n\t\t0xe3000433, 0xe4000434, 0xe5000435, 0xe6000436, 0xe7000437, 0xe8000438, 0xe9000439, 0xea00043a,\n\t\t0xeb00043b, 0xec00043c, 0xed00043d, 0xee00043e, 0xef00043f, 0xf0000440, 0xf1000441, 0xf2000442,\n\t\t0xf3000443, 0xf4000444, 0xf5000445, 0xf6000446, 0xf7000447, 0xf8000448, 0xf9000449, 0xfa00044a,\n\t\t0xfb00044b, 0xfc00044c, 0xfd00044d, 0xfe00044e, 0xff00044f, 0xb8000451, 0x90000452, 0x83000453,\n\t\t0xba000454, 0xbe000455, 0xb3000456, 0xbf000457, 0xbc000458, 0x9a000459, 0x9c00045a, 0x9e00045b,\n\t\t0x9d00045c, 0xa200045e, 0x9f00045f, 0xa5000490, 0xb4000491, 0x96002013, 0x97002014, 0x91002018,\n\t\t0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022,\n\t\t0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x880020ac, 0xb9002116, 0x99002122, 0x99002122,\n\t},\n}\n\n// Windows1252 is the Windows 1252 encoding.\nvar Windows1252 encoding.Encoding = &windows1252\n\nvar windows1252 = charmap{\n\tname:          \"Windows 1252\",\n\tmib:           identifier.Windows1252,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xc5, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc3, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb0, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc3, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7,\n\t\t0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af,\n\t\t0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7,\n\t\t0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf,\n\t\t0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7,\n\t\t0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf,\n\t\t0xd00000d0, 0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7,\n\t\t0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdd0000dd, 0xde0000de, 0xdf0000df,\n\t\t0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7,\n\t\t0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef,\n\t\t0xf00000f0, 0xf10000f1, 0xf20000f2, 0xf30000f3, 0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7,\n\t\t0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb, 0xfc0000fc, 0xfd0000fd, 0xfe0000fe, 0xff0000ff,\n\t\t0x8c000152, 0x9c000153, 0x8a000160, 0x9a000161, 0x9f000178, 0x8e00017d, 0x9e00017e, 0x83000192,\n\t\t0x880002c6, 0x980002dc, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c,\n\t\t0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039,\n\t\t0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t},\n}\n\n// Windows1253 is the Windows 1253 encoding.\nvar Windows1253 encoding.Encoding = &windows1253\n\nvar windows1253 = charmap{\n\tname:          \"Windows 1253\",\n\tmib:           identifier.Windows1253,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xce, 0x85, 0x00}},\n\t\t{2, [3]byte{0xce, 0x86, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x95}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xce, 0x84, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xce, 0x88, 0x00}}, {2, [3]byte{0xce, 0x89, 0x00}},\n\t\t{2, [3]byte{0xce, 0x8a, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xce, 0x8c, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xce, 0x8e, 0x00}}, {2, [3]byte{0xce, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xce, 0x90, 0x00}}, {2, [3]byte{0xce, 0x91, 0x00}},\n\t\t{2, [3]byte{0xce, 0x92, 0x00}}, {2, [3]byte{0xce, 0x93, 0x00}},\n\t\t{2, [3]byte{0xce, 0x94, 0x00}}, {2, [3]byte{0xce, 0x95, 0x00}},\n\t\t{2, [3]byte{0xce, 0x96, 0x00}}, {2, [3]byte{0xce, 0x97, 0x00}},\n\t\t{2, [3]byte{0xce, 0x98, 0x00}}, {2, [3]byte{0xce, 0x99, 0x00}},\n\t\t{2, [3]byte{0xce, 0x9a, 0x00}}, {2, [3]byte{0xce, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xce, 0x9c, 0x00}}, {2, [3]byte{0xce, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xce, 0x9e, 0x00}}, {2, [3]byte{0xce, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa0, 0x00}}, {2, [3]byte{0xce, 0xa1, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xce, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa4, 0x00}}, {2, [3]byte{0xce, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa6, 0x00}}, {2, [3]byte{0xce, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xce, 0xa8, 0x00}}, {2, [3]byte{0xce, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xce, 0xaa, 0x00}}, {2, [3]byte{0xce, 0xab, 0x00}},\n\t\t{2, [3]byte{0xce, 0xac, 0x00}}, {2, [3]byte{0xce, 0xad, 0x00}},\n\t\t{2, [3]byte{0xce, 0xae, 0x00}}, {2, [3]byte{0xce, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb0, 0x00}}, {2, [3]byte{0xce, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb2, 0x00}}, {2, [3]byte{0xce, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb4, 0x00}}, {2, [3]byte{0xce, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb6, 0x00}}, {2, [3]byte{0xce, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xce, 0xb8, 0x00}}, {2, [3]byte{0xce, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xce, 0xba, 0x00}}, {2, [3]byte{0xce, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xce, 0xbc, 0x00}}, {2, [3]byte{0xce, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xce, 0xbe, 0x00}}, {2, [3]byte{0xce, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x80, 0x00}}, {2, [3]byte{0xcf, 0x81, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x82, 0x00}}, {2, [3]byte{0xcf, 0x83, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x84, 0x00}}, {2, [3]byte{0xcf, 0x85, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x86, 0x00}}, {2, [3]byte{0xcf, 0x87, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x88, 0x00}}, {2, [3]byte{0xcf, 0x89, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x8a, 0x00}}, {2, [3]byte{0xcf, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x8c, 0x00}}, {2, [3]byte{0xcf, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xcf, 0x8e, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8, 0xa90000a9,\n\t\t0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3,\n\t\t0xb50000b5, 0xb60000b6, 0xb70000b7, 0xbb0000bb, 0xbd0000bd, 0x83000192, 0xb4000384, 0xa1000385,\n\t\t0xa2000386, 0xb8000388, 0xb9000389, 0xba00038a, 0xbc00038c, 0xbe00038e, 0xbf00038f, 0xc0000390,\n\t\t0xc1000391, 0xc2000392, 0xc3000393, 0xc4000394, 0xc5000395, 0xc6000396, 0xc7000397, 0xc8000398,\n\t\t0xc9000399, 0xca00039a, 0xcb00039b, 0xcc00039c, 0xcd00039d, 0xce00039e, 0xcf00039f, 0xd00003a0,\n\t\t0xd10003a1, 0xd30003a3, 0xd40003a4, 0xd50003a5, 0xd60003a6, 0xd70003a7, 0xd80003a8, 0xd90003a9,\n\t\t0xda0003aa, 0xdb0003ab, 0xdc0003ac, 0xdd0003ad, 0xde0003ae, 0xdf0003af, 0xe00003b0, 0xe10003b1,\n\t\t0xe20003b2, 0xe30003b3, 0xe40003b4, 0xe50003b5, 0xe60003b6, 0xe70003b7, 0xe80003b8, 0xe90003b9,\n\t\t0xea0003ba, 0xeb0003bb, 0xec0003bc, 0xed0003bd, 0xee0003be, 0xef0003bf, 0xf00003c0, 0xf10003c1,\n\t\t0xf20003c2, 0xf30003c3, 0xf40003c4, 0xf50003c5, 0xf60003c6, 0xf70003c7, 0xf80003c8, 0xf90003c9,\n\t\t0xfa0003ca, 0xfb0003cb, 0xfc0003cc, 0xfd0003cd, 0xfe0003ce, 0x96002013, 0x97002014, 0xaf002015,\n\t\t0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021,\n\t\t0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t},\n}\n\n// Windows1254 is the Windows 1254 encoding.\nvar Windows1254 encoding.Encoding = &windows1254\n\nvar windows1254 = charmap{\n\tname:          \"Windows 1254\",\n\tmib:           identifier.Windows1254,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc3, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x92, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc4, 0xb0, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9e, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc3, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xac, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb2, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc4, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9f, 0x00}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7,\n\t\t0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af,\n\t\t0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7,\n\t\t0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf,\n\t\t0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc30000c3, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7,\n\t\t0xc80000c8, 0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcc0000cc, 0xcd0000cd, 0xce0000ce, 0xcf0000cf,\n\t\t0xd10000d1, 0xd20000d2, 0xd30000d3, 0xd40000d4, 0xd50000d5, 0xd60000d6, 0xd70000d7, 0xd80000d8,\n\t\t0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc, 0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2,\n\t\t0xe30000e3, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7, 0xe80000e8, 0xe90000e9, 0xea0000ea,\n\t\t0xeb0000eb, 0xec0000ec, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1, 0xf20000f2, 0xf30000f3,\n\t\t0xf40000f4, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb,\n\t\t0xfc0000fc, 0xff0000ff, 0xd000011e, 0xf000011f, 0xdd000130, 0xfd000131, 0x8c000152, 0x9c000153,\n\t\t0xde00015e, 0xfe00015f, 0x8a000160, 0x9a000161, 0x9f000178, 0x83000192, 0x880002c6, 0x980002dc,\n\t\t0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e,\n\t\t0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t},\n}\n\n// Windows1255 is the Windows 1255 encoding.\nvar Windows1255 encoding.Encoding = &windows1255\n\nvar windows1255 = charmap{\n\tname:          \"Windows 1255\",\n\tmib:           identifier.Windows1255,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xaa}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb7, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xd6, 0xb0, 0x00}}, {2, [3]byte{0xd6, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd6, 0xb2, 0x00}}, {2, [3]byte{0xd6, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd6, 0xb4, 0x00}}, {2, [3]byte{0xd6, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd6, 0xb6, 0x00}}, {2, [3]byte{0xd6, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd6, 0xb8, 0x00}}, {2, [3]byte{0xd6, 0xb9, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xd6, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xd6, 0xbc, 0x00}}, {2, [3]byte{0xd6, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xd6, 0xbe, 0x00}}, {2, [3]byte{0xd6, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x80, 0x00}}, {2, [3]byte{0xd7, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x82, 0x00}}, {2, [3]byte{0xd7, 0x83, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xb0, 0x00}}, {2, [3]byte{0xd7, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xb2, 0x00}}, {2, [3]byte{0xd7, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xb4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xd7, 0x90, 0x00}}, {2, [3]byte{0xd7, 0x91, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x92, 0x00}}, {2, [3]byte{0xd7, 0x93, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x94, 0x00}}, {2, [3]byte{0xd7, 0x95, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x96, 0x00}}, {2, [3]byte{0xd7, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x98, 0x00}}, {2, [3]byte{0xd7, 0x99, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9a, 0x00}}, {2, [3]byte{0xd7, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9c, 0x00}}, {2, [3]byte{0xd7, 0x9d, 0x00}},\n\t\t{2, [3]byte{0xd7, 0x9e, 0x00}}, {2, [3]byte{0xd7, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa0, 0x00}}, {2, [3]byte{0xd7, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa2, 0x00}}, {2, [3]byte{0xd7, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa4, 0x00}}, {2, [3]byte{0xd7, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa6, 0x00}}, {2, [3]byte{0xd7, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xa8, 0x00}}, {2, [3]byte{0xd7, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd7, 0xaa, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x8e}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x8f}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8,\n\t\t0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1,\n\t\t0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9,\n\t\t0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf, 0xaa0000d7, 0xba0000f7, 0x83000192,\n\t\t0x880002c6, 0x980002dc, 0xc00005b0, 0xc10005b1, 0xc20005b2, 0xc30005b3, 0xc40005b4, 0xc50005b5,\n\t\t0xc60005b6, 0xc70005b7, 0xc80005b8, 0xc90005b9, 0xcb0005bb, 0xcc0005bc, 0xcd0005bd, 0xce0005be,\n\t\t0xcf0005bf, 0xd00005c0, 0xd10005c1, 0xd20005c2, 0xd30005c3, 0xe00005d0, 0xe10005d1, 0xe20005d2,\n\t\t0xe30005d3, 0xe40005d4, 0xe50005d5, 0xe60005d6, 0xe70005d7, 0xe80005d8, 0xe90005d9, 0xea0005da,\n\t\t0xeb0005db, 0xec0005dc, 0xed0005dd, 0xee0005de, 0xef0005df, 0xf00005e0, 0xf10005e1, 0xf20005e2,\n\t\t0xf30005e3, 0xf40005e4, 0xf50005e5, 0xf60005e6, 0xf70005e7, 0xf80005e8, 0xf90005e9, 0xfa0005ea,\n\t\t0xd40005f0, 0xd50005f1, 0xd60005f2, 0xd70005f3, 0xd80005f4, 0xfd00200e, 0xfe00200f, 0x96002013,\n\t\t0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020,\n\t\t0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0xa40020aa, 0x800020ac,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t},\n}\n\n// Windows1256 is the Windows 1256 encoding.\nvar Windows1256 encoding.Encoding = &windows1256\n\nvar windows1256 = charmap{\n\tname:          \"Windows 1256\",\n\tmib:           identifier.Windows1256,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {2, [3]byte{0xd9, 0xbe, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{2, [3]byte{0xd9, 0xb9, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{2, [3]byte{0xc5, 0x92, 0x00}}, {2, [3]byte{0xda, 0x86, 0x00}},\n\t\t{2, [3]byte{0xda, 0x98, 0x00}}, {2, [3]byte{0xda, 0x88, 0x00}},\n\t\t{2, [3]byte{0xda, 0xaf, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{2, [3]byte{0xda, 0xa9, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{2, [3]byte{0xda, 0x91, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x8c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x8d}}, {2, [3]byte{0xda, 0xba, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xd8, 0x8c, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xda, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd8, 0x9b, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xd8, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xdb, 0x81, 0x00}}, {2, [3]byte{0xd8, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa2, 0x00}}, {2, [3]byte{0xd8, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa4, 0x00}}, {2, [3]byte{0xd8, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa6, 0x00}}, {2, [3]byte{0xd8, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xa8, 0x00}}, {2, [3]byte{0xd8, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xaa, 0x00}}, {2, [3]byte{0xd8, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xac, 0x00}}, {2, [3]byte{0xd8, 0xad, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xae, 0x00}}, {2, [3]byte{0xd8, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb0, 0x00}}, {2, [3]byte{0xd8, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb2, 0x00}}, {2, [3]byte{0xd8, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb4, 0x00}}, {2, [3]byte{0xd8, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb7, 0x00}}, {2, [3]byte{0xd8, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xd8, 0xb9, 0x00}}, {2, [3]byte{0xd8, 0xba, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x80, 0x00}}, {2, [3]byte{0xd9, 0x81, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x82, 0x00}}, {2, [3]byte{0xd9, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xd9, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xd9, 0x85, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x86, 0x00}}, {2, [3]byte{0xd9, 0x87, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x88, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x89, 0x00}}, {2, [3]byte{0xd9, 0x8a, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x8b, 0x00}}, {2, [3]byte{0xd9, 0x8c, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x8d, 0x00}}, {2, [3]byte{0xd9, 0x8e, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xd9, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x90, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xd9, 0x92, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {3, [3]byte{0xe2, 0x80, 0x8e}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x8f}}, {2, [3]byte{0xdb, 0x92, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7, 0xa80000a8,\n\t\t0xa90000a9, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af, 0xb00000b0, 0xb10000b1,\n\t\t0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0xb80000b8, 0xb90000b9,\n\t\t0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xd70000d7, 0xe00000e0, 0xe20000e2, 0xe70000e7,\n\t\t0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xee0000ee, 0xef0000ef, 0xf40000f4, 0xf70000f7,\n\t\t0xf90000f9, 0xfb0000fb, 0xfc0000fc, 0x8c000152, 0x9c000153, 0x83000192, 0x880002c6, 0xa100060c,\n\t\t0xba00061b, 0xbf00061f, 0xc1000621, 0xc2000622, 0xc3000623, 0xc4000624, 0xc5000625, 0xc6000626,\n\t\t0xc7000627, 0xc8000628, 0xc9000629, 0xca00062a, 0xcb00062b, 0xcc00062c, 0xcd00062d, 0xce00062e,\n\t\t0xcf00062f, 0xd0000630, 0xd1000631, 0xd2000632, 0xd3000633, 0xd4000634, 0xd5000635, 0xd6000636,\n\t\t0xd8000637, 0xd9000638, 0xda000639, 0xdb00063a, 0xdc000640, 0xdd000641, 0xde000642, 0xdf000643,\n\t\t0xe1000644, 0xe3000645, 0xe4000646, 0xe5000647, 0xe6000648, 0xec000649, 0xed00064a, 0xf000064b,\n\t\t0xf100064c, 0xf200064d, 0xf300064e, 0xf500064f, 0xf6000650, 0xf8000651, 0xfa000652, 0x8a000679,\n\t\t0x8100067e, 0x8d000686, 0x8f000688, 0x9a000691, 0x8e000698, 0x980006a9, 0x900006af, 0x9f0006ba,\n\t\t0xaa0006be, 0xc00006c1, 0xff0006d2, 0x9d00200c, 0x9e00200d, 0xfd00200e, 0xfe00200f, 0x96002013,\n\t\t0x97002014, 0x91002018, 0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020,\n\t\t0x87002021, 0x95002022, 0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122,\n\t},\n}\n\n// Windows1257 is the Windows 1257 encoding.\nvar Windows1257 encoding.Encoding = &windows1257\n\nvar windows1257 = charmap{\n\tname:          \"Windows 1257\",\n\tmib:           identifier.Windows1257,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xa8, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x87, 0x00}}, {2, [3]byte{0xc2, 0xb8, 0x00}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xcb, 0x9b, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x96, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc3, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x97, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc3, 0xa6, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x84, 0x00}}, {2, [3]byte{0xc4, 0xae, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x80, 0x00}}, {2, [3]byte{0xc4, 0x86, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x98, 0x00}}, {2, [3]byte{0xc4, 0x92, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb9, 0x00}}, {2, [3]byte{0xc4, 0x96, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0xb6, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xaa, 0x00}}, {2, [3]byte{0xc4, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa0, 0x00}}, {2, [3]byte{0xc5, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x85, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8c, 0x00}}, {2, [3]byte{0xc3, 0x95, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb2, 0x00}}, {2, [3]byte{0xc5, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9a, 0x00}}, {2, [3]byte{0xc5, 0xaa, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc5, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbd, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x85, 0x00}}, {2, [3]byte{0xc4, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x81, 0x00}}, {2, [3]byte{0xc4, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x99, 0x00}}, {2, [3]byte{0xc4, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xba, 0x00}}, {2, [3]byte{0xc4, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xa3, 0x00}}, {2, [3]byte{0xc4, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc4, 0xab, 0x00}}, {2, [3]byte{0xc4, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xa1, 0x00}}, {2, [3]byte{0xc5, 0x84, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x86, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x8d, 0x00}}, {2, [3]byte{0xc3, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xb3, 0x00}}, {2, [3]byte{0xc5, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc5, 0x9b, 0x00}}, {2, [3]byte{0xc5, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc5, 0xbc, 0x00}},\n\t\t{2, [3]byte{0xc5, 0xbe, 0x00}}, {2, [3]byte{0xcb, 0x99, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa60000a6, 0xa70000a7, 0x8d0000a8, 0xa90000a9,\n\t\t0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0x9d0000af, 0xb00000b0, 0xb10000b1, 0xb20000b2,\n\t\t0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7, 0x8f0000b8, 0xb90000b9, 0xbb0000bb,\n\t\t0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xc40000c4, 0xc50000c5, 0xaf0000c6, 0xc90000c9, 0xd30000d3,\n\t\t0xd50000d5, 0xd60000d6, 0xd70000d7, 0xa80000d8, 0xdc0000dc, 0xdf0000df, 0xe40000e4, 0xe50000e5,\n\t\t0xbf0000e6, 0xe90000e9, 0xf30000f3, 0xf50000f5, 0xf60000f6, 0xf70000f7, 0xb80000f8, 0xfc0000fc,\n\t\t0xc2000100, 0xe2000101, 0xc0000104, 0xe0000105, 0xc3000106, 0xe3000107, 0xc800010c, 0xe800010d,\n\t\t0xc7000112, 0xe7000113, 0xcb000116, 0xeb000117, 0xc6000118, 0xe6000119, 0xcc000122, 0xec000123,\n\t\t0xce00012a, 0xee00012b, 0xc100012e, 0xe100012f, 0xcd000136, 0xed000137, 0xcf00013b, 0xef00013c,\n\t\t0xd9000141, 0xf9000142, 0xd1000143, 0xf1000144, 0xd2000145, 0xf2000146, 0xd400014c, 0xf400014d,\n\t\t0xaa000156, 0xba000157, 0xda00015a, 0xfa00015b, 0xd0000160, 0xf0000161, 0xdb00016a, 0xfb00016b,\n\t\t0xd8000172, 0xf8000173, 0xca000179, 0xea00017a, 0xdd00017b, 0xfd00017c, 0xde00017d, 0xfe00017e,\n\t\t0x8e0002c7, 0xff0002d9, 0x9e0002db, 0x96002013, 0x97002014, 0x91002018, 0x92002019, 0x8200201a,\n\t\t0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022, 0x85002026, 0x89002030,\n\t\t0x8b002039, 0x9b00203a, 0x800020ac, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t},\n}\n\n// Windows1258 is the Windows 1258 encoding.\nvar Windows1258 encoding.Encoding = &windows1258\n\nvar windows1258 = charmap{\n\tname:          \"Windows 1258\",\n\tmib:           identifier.Windows1258,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xac}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9a}}, {2, [3]byte{0xc6, 0x92, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9e}}, {3, [3]byte{0xe2, 0x80, 0xa6}},\n\t\t{3, [3]byte{0xe2, 0x80, 0xa0}}, {3, [3]byte{0xe2, 0x80, 0xa1}},\n\t\t{2, [3]byte{0xcb, 0x86, 0x00}}, {3, [3]byte{0xe2, 0x80, 0xb0}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xb9}},\n\t\t{2, [3]byte{0xc5, 0x92, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0x98}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x99}}, {3, [3]byte{0xe2, 0x80, 0x9c}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x9d}}, {3, [3]byte{0xe2, 0x80, 0xa2}},\n\t\t{3, [3]byte{0xe2, 0x80, 0x93}}, {3, [3]byte{0xe2, 0x80, 0x94}},\n\t\t{2, [3]byte{0xcb, 0x9c, 0x00}}, {3, [3]byte{0xe2, 0x84, 0xa2}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {3, [3]byte{0xe2, 0x80, 0xba}},\n\t\t{2, [3]byte{0xc5, 0x93, 0x00}}, {3, [3]byte{0xef, 0xbf, 0xbd}},\n\t\t{3, [3]byte{0xef, 0xbf, 0xbd}}, {2, [3]byte{0xc5, 0xb8, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa0, 0x00}}, {2, [3]byte{0xc2, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa2, 0x00}}, {2, [3]byte{0xc2, 0xa3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa4, 0x00}}, {2, [3]byte{0xc2, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa6, 0x00}}, {2, [3]byte{0xc2, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xa8, 0x00}}, {2, [3]byte{0xc2, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xaa, 0x00}}, {2, [3]byte{0xc2, 0xab, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xac, 0x00}}, {2, [3]byte{0xc2, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xae, 0x00}}, {2, [3]byte{0xc2, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb0, 0x00}}, {2, [3]byte{0xc2, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb2, 0x00}}, {2, [3]byte{0xc2, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb4, 0x00}}, {2, [3]byte{0xc2, 0xb5, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb6, 0x00}}, {2, [3]byte{0xc2, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xb8, 0x00}}, {2, [3]byte{0xc2, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xba, 0x00}}, {2, [3]byte{0xc2, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbc, 0x00}}, {2, [3]byte{0xc2, 0xbd, 0x00}},\n\t\t{2, [3]byte{0xc2, 0xbe, 0x00}}, {2, [3]byte{0xc2, 0xbf, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x81, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x82, 0x00}}, {2, [3]byte{0xc4, 0x82, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x84, 0x00}}, {2, [3]byte{0xc3, 0x85, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x86, 0x00}}, {2, [3]byte{0xc3, 0x87, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x88, 0x00}}, {2, [3]byte{0xc3, 0x89, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8a, 0x00}}, {2, [3]byte{0xc3, 0x8b, 0x00}},\n\t\t{2, [3]byte{0xcc, 0x80, 0x00}}, {2, [3]byte{0xc3, 0x8d, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x8e, 0x00}}, {2, [3]byte{0xc3, 0x8f, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x90, 0x00}}, {2, [3]byte{0xc3, 0x91, 0x00}},\n\t\t{2, [3]byte{0xcc, 0x89, 0x00}}, {2, [3]byte{0xc3, 0x93, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x94, 0x00}}, {2, [3]byte{0xc6, 0xa0, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x96, 0x00}}, {2, [3]byte{0xc3, 0x97, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x98, 0x00}}, {2, [3]byte{0xc3, 0x99, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9a, 0x00}}, {2, [3]byte{0xc3, 0x9b, 0x00}},\n\t\t{2, [3]byte{0xc3, 0x9c, 0x00}}, {2, [3]byte{0xc6, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xcc, 0x83, 0x00}}, {2, [3]byte{0xc3, 0x9f, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa0, 0x00}}, {2, [3]byte{0xc3, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa2, 0x00}}, {2, [3]byte{0xc4, 0x83, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa4, 0x00}}, {2, [3]byte{0xc3, 0xa5, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa6, 0x00}}, {2, [3]byte{0xc3, 0xa7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xa8, 0x00}}, {2, [3]byte{0xc3, 0xa9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xaa, 0x00}}, {2, [3]byte{0xc3, 0xab, 0x00}},\n\t\t{2, [3]byte{0xcc, 0x81, 0x00}}, {2, [3]byte{0xc3, 0xad, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xae, 0x00}}, {2, [3]byte{0xc3, 0xaf, 0x00}},\n\t\t{2, [3]byte{0xc4, 0x91, 0x00}}, {2, [3]byte{0xc3, 0xb1, 0x00}},\n\t\t{2, [3]byte{0xcc, 0xa3, 0x00}}, {2, [3]byte{0xc3, 0xb3, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb4, 0x00}}, {2, [3]byte{0xc6, 0xa1, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb6, 0x00}}, {2, [3]byte{0xc3, 0xb7, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xb8, 0x00}}, {2, [3]byte{0xc3, 0xb9, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xba, 0x00}}, {2, [3]byte{0xc3, 0xbb, 0x00}},\n\t\t{2, [3]byte{0xc3, 0xbc, 0x00}}, {2, [3]byte{0xc6, 0xb0, 0x00}},\n\t\t{3, [3]byte{0xe2, 0x82, 0xab}}, {2, [3]byte{0xc3, 0xbf, 0x00}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0xa00000a0, 0xa10000a1, 0xa20000a2, 0xa30000a3, 0xa40000a4, 0xa50000a5, 0xa60000a6, 0xa70000a7,\n\t\t0xa80000a8, 0xa90000a9, 0xaa0000aa, 0xab0000ab, 0xac0000ac, 0xad0000ad, 0xae0000ae, 0xaf0000af,\n\t\t0xb00000b0, 0xb10000b1, 0xb20000b2, 0xb30000b3, 0xb40000b4, 0xb50000b5, 0xb60000b6, 0xb70000b7,\n\t\t0xb80000b8, 0xb90000b9, 0xba0000ba, 0xbb0000bb, 0xbc0000bc, 0xbd0000bd, 0xbe0000be, 0xbf0000bf,\n\t\t0xc00000c0, 0xc10000c1, 0xc20000c2, 0xc40000c4, 0xc50000c5, 0xc60000c6, 0xc70000c7, 0xc80000c8,\n\t\t0xc90000c9, 0xca0000ca, 0xcb0000cb, 0xcd0000cd, 0xce0000ce, 0xcf0000cf, 0xd10000d1, 0xd30000d3,\n\t\t0xd40000d4, 0xd60000d6, 0xd70000d7, 0xd80000d8, 0xd90000d9, 0xda0000da, 0xdb0000db, 0xdc0000dc,\n\t\t0xdf0000df, 0xe00000e0, 0xe10000e1, 0xe20000e2, 0xe40000e4, 0xe50000e5, 0xe60000e6, 0xe70000e7,\n\t\t0xe80000e8, 0xe90000e9, 0xea0000ea, 0xeb0000eb, 0xed0000ed, 0xee0000ee, 0xef0000ef, 0xf10000f1,\n\t\t0xf30000f3, 0xf40000f4, 0xf60000f6, 0xf70000f7, 0xf80000f8, 0xf90000f9, 0xfa0000fa, 0xfb0000fb,\n\t\t0xfc0000fc, 0xff0000ff, 0xc3000102, 0xe3000103, 0xd0000110, 0xf0000111, 0x8c000152, 0x9c000153,\n\t\t0x9f000178, 0x83000192, 0xd50001a0, 0xf50001a1, 0xdd0001af, 0xfd0001b0, 0x880002c6, 0x980002dc,\n\t\t0xcc000300, 0xec000301, 0xde000303, 0xd2000309, 0xf2000323, 0x96002013, 0x97002014, 0x91002018,\n\t\t0x92002019, 0x8200201a, 0x9300201c, 0x9400201d, 0x8400201e, 0x86002020, 0x87002021, 0x95002022,\n\t\t0x85002026, 0x89002030, 0x8b002039, 0x9b00203a, 0xfe0020ab, 0x800020ac, 0x99002122, 0x99002122,\n\t\t0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122, 0x99002122,\n\t},\n}\n\n// XUserDefined is the X-User-Defined encoding.\n//\n// It is defined at http://encoding.spec.whatwg.org/#x-user-defined\nvar XUserDefined encoding.Encoding = &xUserDefined\n\nvar xUserDefined = charmap{\n\tname:          \"X-User-Defined\",\n\tmib:           identifier.XUserDefined,\n\tasciiSuperset: true,\n\tlow:           0x80,\n\treplacement:   0x1a,\n\tdecode: [256]utf8Enc{\n\t\t{1, [3]byte{0x00, 0x00, 0x00}}, {1, [3]byte{0x01, 0x00, 0x00}},\n\t\t{1, [3]byte{0x02, 0x00, 0x00}}, {1, [3]byte{0x03, 0x00, 0x00}},\n\t\t{1, [3]byte{0x04, 0x00, 0x00}}, {1, [3]byte{0x05, 0x00, 0x00}},\n\t\t{1, [3]byte{0x06, 0x00, 0x00}}, {1, [3]byte{0x07, 0x00, 0x00}},\n\t\t{1, [3]byte{0x08, 0x00, 0x00}}, {1, [3]byte{0x09, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0a, 0x00, 0x00}}, {1, [3]byte{0x0b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0c, 0x00, 0x00}}, {1, [3]byte{0x0d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x0e, 0x00, 0x00}}, {1, [3]byte{0x0f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x10, 0x00, 0x00}}, {1, [3]byte{0x11, 0x00, 0x00}},\n\t\t{1, [3]byte{0x12, 0x00, 0x00}}, {1, [3]byte{0x13, 0x00, 0x00}},\n\t\t{1, [3]byte{0x14, 0x00, 0x00}}, {1, [3]byte{0x15, 0x00, 0x00}},\n\t\t{1, [3]byte{0x16, 0x00, 0x00}}, {1, [3]byte{0x17, 0x00, 0x00}},\n\t\t{1, [3]byte{0x18, 0x00, 0x00}}, {1, [3]byte{0x19, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1a, 0x00, 0x00}}, {1, [3]byte{0x1b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1c, 0x00, 0x00}}, {1, [3]byte{0x1d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x1e, 0x00, 0x00}}, {1, [3]byte{0x1f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x20, 0x00, 0x00}}, {1, [3]byte{0x21, 0x00, 0x00}},\n\t\t{1, [3]byte{0x22, 0x00, 0x00}}, {1, [3]byte{0x23, 0x00, 0x00}},\n\t\t{1, [3]byte{0x24, 0x00, 0x00}}, {1, [3]byte{0x25, 0x00, 0x00}},\n\t\t{1, [3]byte{0x26, 0x00, 0x00}}, {1, [3]byte{0x27, 0x00, 0x00}},\n\t\t{1, [3]byte{0x28, 0x00, 0x00}}, {1, [3]byte{0x29, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2a, 0x00, 0x00}}, {1, [3]byte{0x2b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2c, 0x00, 0x00}}, {1, [3]byte{0x2d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x2e, 0x00, 0x00}}, {1, [3]byte{0x2f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x30, 0x00, 0x00}}, {1, [3]byte{0x31, 0x00, 0x00}},\n\t\t{1, [3]byte{0x32, 0x00, 0x00}}, {1, [3]byte{0x33, 0x00, 0x00}},\n\t\t{1, [3]byte{0x34, 0x00, 0x00}}, {1, [3]byte{0x35, 0x00, 0x00}},\n\t\t{1, [3]byte{0x36, 0x00, 0x00}}, {1, [3]byte{0x37, 0x00, 0x00}},\n\t\t{1, [3]byte{0x38, 0x00, 0x00}}, {1, [3]byte{0x39, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3a, 0x00, 0x00}}, {1, [3]byte{0x3b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3c, 0x00, 0x00}}, {1, [3]byte{0x3d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x3e, 0x00, 0x00}}, {1, [3]byte{0x3f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x40, 0x00, 0x00}}, {1, [3]byte{0x41, 0x00, 0x00}},\n\t\t{1, [3]byte{0x42, 0x00, 0x00}}, {1, [3]byte{0x43, 0x00, 0x00}},\n\t\t{1, [3]byte{0x44, 0x00, 0x00}}, {1, [3]byte{0x45, 0x00, 0x00}},\n\t\t{1, [3]byte{0x46, 0x00, 0x00}}, {1, [3]byte{0x47, 0x00, 0x00}},\n\t\t{1, [3]byte{0x48, 0x00, 0x00}}, {1, [3]byte{0x49, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4a, 0x00, 0x00}}, {1, [3]byte{0x4b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4c, 0x00, 0x00}}, {1, [3]byte{0x4d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x4e, 0x00, 0x00}}, {1, [3]byte{0x4f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x50, 0x00, 0x00}}, {1, [3]byte{0x51, 0x00, 0x00}},\n\t\t{1, [3]byte{0x52, 0x00, 0x00}}, {1, [3]byte{0x53, 0x00, 0x00}},\n\t\t{1, [3]byte{0x54, 0x00, 0x00}}, {1, [3]byte{0x55, 0x00, 0x00}},\n\t\t{1, [3]byte{0x56, 0x00, 0x00}}, {1, [3]byte{0x57, 0x00, 0x00}},\n\t\t{1, [3]byte{0x58, 0x00, 0x00}}, {1, [3]byte{0x59, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5a, 0x00, 0x00}}, {1, [3]byte{0x5b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5c, 0x00, 0x00}}, {1, [3]byte{0x5d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x5e, 0x00, 0x00}}, {1, [3]byte{0x5f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x60, 0x00, 0x00}}, {1, [3]byte{0x61, 0x00, 0x00}},\n\t\t{1, [3]byte{0x62, 0x00, 0x00}}, {1, [3]byte{0x63, 0x00, 0x00}},\n\t\t{1, [3]byte{0x64, 0x00, 0x00}}, {1, [3]byte{0x65, 0x00, 0x00}},\n\t\t{1, [3]byte{0x66, 0x00, 0x00}}, {1, [3]byte{0x67, 0x00, 0x00}},\n\t\t{1, [3]byte{0x68, 0x00, 0x00}}, {1, [3]byte{0x69, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6a, 0x00, 0x00}}, {1, [3]byte{0x6b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6c, 0x00, 0x00}}, {1, [3]byte{0x6d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x6e, 0x00, 0x00}}, {1, [3]byte{0x6f, 0x00, 0x00}},\n\t\t{1, [3]byte{0x70, 0x00, 0x00}}, {1, [3]byte{0x71, 0x00, 0x00}},\n\t\t{1, [3]byte{0x72, 0x00, 0x00}}, {1, [3]byte{0x73, 0x00, 0x00}},\n\t\t{1, [3]byte{0x74, 0x00, 0x00}}, {1, [3]byte{0x75, 0x00, 0x00}},\n\t\t{1, [3]byte{0x76, 0x00, 0x00}}, {1, [3]byte{0x77, 0x00, 0x00}},\n\t\t{1, [3]byte{0x78, 0x00, 0x00}}, {1, [3]byte{0x79, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7a, 0x00, 0x00}}, {1, [3]byte{0x7b, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7c, 0x00, 0x00}}, {1, [3]byte{0x7d, 0x00, 0x00}},\n\t\t{1, [3]byte{0x7e, 0x00, 0x00}}, {1, [3]byte{0x7f, 0x00, 0x00}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x80}}, {3, [3]byte{0xef, 0x9e, 0x81}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x82}}, {3, [3]byte{0xef, 0x9e, 0x83}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x84}}, {3, [3]byte{0xef, 0x9e, 0x85}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x86}}, {3, [3]byte{0xef, 0x9e, 0x87}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x88}}, {3, [3]byte{0xef, 0x9e, 0x89}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x8a}}, {3, [3]byte{0xef, 0x9e, 0x8b}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x8c}}, {3, [3]byte{0xef, 0x9e, 0x8d}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x8e}}, {3, [3]byte{0xef, 0x9e, 0x8f}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x90}}, {3, [3]byte{0xef, 0x9e, 0x91}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x92}}, {3, [3]byte{0xef, 0x9e, 0x93}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x94}}, {3, [3]byte{0xef, 0x9e, 0x95}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x96}}, {3, [3]byte{0xef, 0x9e, 0x97}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x98}}, {3, [3]byte{0xef, 0x9e, 0x99}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x9a}}, {3, [3]byte{0xef, 0x9e, 0x9b}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x9c}}, {3, [3]byte{0xef, 0x9e, 0x9d}},\n\t\t{3, [3]byte{0xef, 0x9e, 0x9e}}, {3, [3]byte{0xef, 0x9e, 0x9f}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xa0}}, {3, [3]byte{0xef, 0x9e, 0xa1}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xa2}}, {3, [3]byte{0xef, 0x9e, 0xa3}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xa4}}, {3, [3]byte{0xef, 0x9e, 0xa5}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xa6}}, {3, [3]byte{0xef, 0x9e, 0xa7}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xa8}}, {3, [3]byte{0xef, 0x9e, 0xa9}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xaa}}, {3, [3]byte{0xef, 0x9e, 0xab}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xac}}, {3, [3]byte{0xef, 0x9e, 0xad}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xae}}, {3, [3]byte{0xef, 0x9e, 0xaf}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xb0}}, {3, [3]byte{0xef, 0x9e, 0xb1}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xb2}}, {3, [3]byte{0xef, 0x9e, 0xb3}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xb4}}, {3, [3]byte{0xef, 0x9e, 0xb5}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xb6}}, {3, [3]byte{0xef, 0x9e, 0xb7}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xb8}}, {3, [3]byte{0xef, 0x9e, 0xb9}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xba}}, {3, [3]byte{0xef, 0x9e, 0xbb}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xbc}}, {3, [3]byte{0xef, 0x9e, 0xbd}},\n\t\t{3, [3]byte{0xef, 0x9e, 0xbe}}, {3, [3]byte{0xef, 0x9e, 0xbf}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x80}}, {3, [3]byte{0xef, 0x9f, 0x81}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x82}}, {3, [3]byte{0xef, 0x9f, 0x83}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x84}}, {3, [3]byte{0xef, 0x9f, 0x85}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x86}}, {3, [3]byte{0xef, 0x9f, 0x87}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x88}}, {3, [3]byte{0xef, 0x9f, 0x89}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x8a}}, {3, [3]byte{0xef, 0x9f, 0x8b}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x8c}}, {3, [3]byte{0xef, 0x9f, 0x8d}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x8e}}, {3, [3]byte{0xef, 0x9f, 0x8f}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x90}}, {3, [3]byte{0xef, 0x9f, 0x91}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x92}}, {3, [3]byte{0xef, 0x9f, 0x93}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x94}}, {3, [3]byte{0xef, 0x9f, 0x95}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x96}}, {3, [3]byte{0xef, 0x9f, 0x97}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x98}}, {3, [3]byte{0xef, 0x9f, 0x99}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x9a}}, {3, [3]byte{0xef, 0x9f, 0x9b}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x9c}}, {3, [3]byte{0xef, 0x9f, 0x9d}},\n\t\t{3, [3]byte{0xef, 0x9f, 0x9e}}, {3, [3]byte{0xef, 0x9f, 0x9f}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xa0}}, {3, [3]byte{0xef, 0x9f, 0xa1}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xa2}}, {3, [3]byte{0xef, 0x9f, 0xa3}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xa4}}, {3, [3]byte{0xef, 0x9f, 0xa5}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xa6}}, {3, [3]byte{0xef, 0x9f, 0xa7}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xa8}}, {3, [3]byte{0xef, 0x9f, 0xa9}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xaa}}, {3, [3]byte{0xef, 0x9f, 0xab}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xac}}, {3, [3]byte{0xef, 0x9f, 0xad}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xae}}, {3, [3]byte{0xef, 0x9f, 0xaf}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xb0}}, {3, [3]byte{0xef, 0x9f, 0xb1}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xb2}}, {3, [3]byte{0xef, 0x9f, 0xb3}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xb4}}, {3, [3]byte{0xef, 0x9f, 0xb5}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xb6}}, {3, [3]byte{0xef, 0x9f, 0xb7}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xb8}}, {3, [3]byte{0xef, 0x9f, 0xb9}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xba}}, {3, [3]byte{0xef, 0x9f, 0xbb}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xbc}}, {3, [3]byte{0xef, 0x9f, 0xbd}},\n\t\t{3, [3]byte{0xef, 0x9f, 0xbe}}, {3, [3]byte{0xef, 0x9f, 0xbf}},\n\t},\n\tencode: [256]uint32{\n\t\t0x00000000, 0x01000001, 0x02000002, 0x03000003, 0x04000004, 0x05000005, 0x06000006, 0x07000007,\n\t\t0x08000008, 0x09000009, 0x0a00000a, 0x0b00000b, 0x0c00000c, 0x0d00000d, 0x0e00000e, 0x0f00000f,\n\t\t0x10000010, 0x11000011, 0x12000012, 0x13000013, 0x14000014, 0x15000015, 0x16000016, 0x17000017,\n\t\t0x18000018, 0x19000019, 0x1a00001a, 0x1b00001b, 0x1c00001c, 0x1d00001d, 0x1e00001e, 0x1f00001f,\n\t\t0x20000020, 0x21000021, 0x22000022, 0x23000023, 0x24000024, 0x25000025, 0x26000026, 0x27000027,\n\t\t0x28000028, 0x29000029, 0x2a00002a, 0x2b00002b, 0x2c00002c, 0x2d00002d, 0x2e00002e, 0x2f00002f,\n\t\t0x30000030, 0x31000031, 0x32000032, 0x33000033, 0x34000034, 0x35000035, 0x36000036, 0x37000037,\n\t\t0x38000038, 0x39000039, 0x3a00003a, 0x3b00003b, 0x3c00003c, 0x3d00003d, 0x3e00003e, 0x3f00003f,\n\t\t0x40000040, 0x41000041, 0x42000042, 0x43000043, 0x44000044, 0x45000045, 0x46000046, 0x47000047,\n\t\t0x48000048, 0x49000049, 0x4a00004a, 0x4b00004b, 0x4c00004c, 0x4d00004d, 0x4e00004e, 0x4f00004f,\n\t\t0x50000050, 0x51000051, 0x52000052, 0x53000053, 0x54000054, 0x55000055, 0x56000056, 0x57000057,\n\t\t0x58000058, 0x59000059, 0x5a00005a, 0x5b00005b, 0x5c00005c, 0x5d00005d, 0x5e00005e, 0x5f00005f,\n\t\t0x60000060, 0x61000061, 0x62000062, 0x63000063, 0x64000064, 0x65000065, 0x66000066, 0x67000067,\n\t\t0x68000068, 0x69000069, 0x6a00006a, 0x6b00006b, 0x6c00006c, 0x6d00006d, 0x6e00006e, 0x6f00006f,\n\t\t0x70000070, 0x71000071, 0x72000072, 0x73000073, 0x74000074, 0x75000075, 0x76000076, 0x77000077,\n\t\t0x78000078, 0x79000079, 0x7a00007a, 0x7b00007b, 0x7c00007c, 0x7d00007d, 0x7e00007e, 0x7f00007f,\n\t\t0x8000f780, 0x8100f781, 0x8200f782, 0x8300f783, 0x8400f784, 0x8500f785, 0x8600f786, 0x8700f787,\n\t\t0x8800f788, 0x8900f789, 0x8a00f78a, 0x8b00f78b, 0x8c00f78c, 0x8d00f78d, 0x8e00f78e, 0x8f00f78f,\n\t\t0x9000f790, 0x9100f791, 0x9200f792, 0x9300f793, 0x9400f794, 0x9500f795, 0x9600f796, 0x9700f797,\n\t\t0x9800f798, 0x9900f799, 0x9a00f79a, 0x9b00f79b, 0x9c00f79c, 0x9d00f79d, 0x9e00f79e, 0x9f00f79f,\n\t\t0xa000f7a0, 0xa100f7a1, 0xa200f7a2, 0xa300f7a3, 0xa400f7a4, 0xa500f7a5, 0xa600f7a6, 0xa700f7a7,\n\t\t0xa800f7a8, 0xa900f7a9, 0xaa00f7aa, 0xab00f7ab, 0xac00f7ac, 0xad00f7ad, 0xae00f7ae, 0xaf00f7af,\n\t\t0xb000f7b0, 0xb100f7b1, 0xb200f7b2, 0xb300f7b3, 0xb400f7b4, 0xb500f7b5, 0xb600f7b6, 0xb700f7b7,\n\t\t0xb800f7b8, 0xb900f7b9, 0xba00f7ba, 0xbb00f7bb, 0xbc00f7bc, 0xbd00f7bd, 0xbe00f7be, 0xbf00f7bf,\n\t\t0xc000f7c0, 0xc100f7c1, 0xc200f7c2, 0xc300f7c3, 0xc400f7c4, 0xc500f7c5, 0xc600f7c6, 0xc700f7c7,\n\t\t0xc800f7c8, 0xc900f7c9, 0xca00f7ca, 0xcb00f7cb, 0xcc00f7cc, 0xcd00f7cd, 0xce00f7ce, 0xcf00f7cf,\n\t\t0xd000f7d0, 0xd100f7d1, 0xd200f7d2, 0xd300f7d3, 0xd400f7d4, 0xd500f7d5, 0xd600f7d6, 0xd700f7d7,\n\t\t0xd800f7d8, 0xd900f7d9, 0xda00f7da, 0xdb00f7db, 0xdc00f7dc, 0xdd00f7dd, 0xde00f7de, 0xdf00f7df,\n\t\t0xe000f7e0, 0xe100f7e1, 0xe200f7e2, 0xe300f7e3, 0xe400f7e4, 0xe500f7e5, 0xe600f7e6, 0xe700f7e7,\n\t\t0xe800f7e8, 0xe900f7e9, 0xea00f7ea, 0xeb00f7eb, 0xec00f7ec, 0xed00f7ed, 0xee00f7ee, 0xef00f7ef,\n\t\t0xf000f7f0, 0xf100f7f1, 0xf200f7f2, 0xf300f7f3, 0xf400f7f4, 0xf500f7f5, 0xf600f7f6, 0xf700f7f7,\n\t\t0xf800f7f8, 0xf900f7f9, 0xfa00f7fa, 0xfb00f7fb, 0xfc00f7fc, 0xfd00f7fd, 0xfe00f7fe, 0xff00f7ff,\n\t},\n}\nvar listAll = []encoding.Encoding{\n\tCodePage037,\n\tCodePage437,\n\tCodePage850,\n\tCodePage852,\n\tCodePage855,\n\tCodePage858,\n\tCodePage860,\n\tCodePage862,\n\tCodePage863,\n\tCodePage865,\n\tCodePage866,\n\tCodePage1047,\n\tCodePage1140,\n\tISO8859_1,\n\tISO8859_2,\n\tISO8859_3,\n\tISO8859_4,\n\tISO8859_5,\n\tISO8859_6,\n\tISO8859_6E,\n\tISO8859_6I,\n\tISO8859_7,\n\tISO8859_8,\n\tISO8859_8E,\n\tISO8859_8I,\n\tISO8859_9,\n\tISO8859_10,\n\tISO8859_13,\n\tISO8859_14,\n\tISO8859_15,\n\tISO8859_16,\n\tKOI8R,\n\tKOI8U,\n\tMacintosh,\n\tMacintoshCyrillic,\n\tWindows874,\n\tWindows1250,\n\tWindows1251,\n\tWindows1252,\n\tWindows1253,\n\tWindows1254,\n\tWindows1255,\n\tWindows1256,\n\tWindows1257,\n\tWindows1258,\n\tXUserDefined,\n}\n\n// Total table size 87024 bytes (84KiB); checksum: 811C9DC5\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/encoding.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package encoding defines an interface for character encodings, such as Shift\n// JIS and Windows 1252, that can convert to and from UTF-8.\n//\n// Encoding implementations are provided in other packages, such as\n// golang.org/x/text/encoding/charmap and\n// golang.org/x/text/encoding/japanese.\npackage encoding // import \"golang.org/x/text/encoding\"\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"strconv\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// TODO:\n// - There seems to be some inconsistency in when decoders return errors\n//   and when not. Also documentation seems to suggest they shouldn't return\n//   errors at all (except for UTF-16).\n// - Encoders seem to rely on or at least benefit from the input being in NFC\n//   normal form. Perhaps add an example how users could prepare their output.\n\n// Encoding is a character set encoding that can be transformed to and from\n// UTF-8.\ntype Encoding interface {\n\t// NewDecoder returns a Decoder.\n\tNewDecoder() *Decoder\n\n\t// NewEncoder returns an Encoder.\n\tNewEncoder() *Encoder\n}\n\n// A Decoder converts bytes to UTF-8. It implements transform.Transformer.\n//\n// Transforming source bytes that are not of that encoding will not result in an\n// error per se. Each byte that cannot be transcoded will be represented in the\n// output by the UTF-8 encoding of '\\uFFFD', the replacement rune.\ntype Decoder struct {\n\ttransform.Transformer\n\n\t// This forces external creators of Decoders to use names in struct\n\t// initializers, allowing for future extendibility without having to break\n\t// code.\n\t_ struct{}\n}\n\n// Bytes converts the given encoded bytes to UTF-8. It returns the converted\n// bytes or nil, err if any error occurred.\nfunc (d *Decoder) Bytes(b []byte) ([]byte, error) {\n\tb, _, err := transform.Bytes(d, b)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn b, nil\n}\n\n// String converts the given encoded string to UTF-8. It returns the converted\n// string or \"\", err if any error occurred.\nfunc (d *Decoder) String(s string) (string, error) {\n\ts, _, err := transform.String(d, s)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn s, nil\n}\n\n// Reader wraps another Reader to decode its bytes.\n//\n// The Decoder may not be used for any other operation as long as the returned\n// Reader is in use.\nfunc (d *Decoder) Reader(r io.Reader) io.Reader {\n\treturn transform.NewReader(r, d)\n}\n\n// An Encoder converts bytes from UTF-8. It implements transform.Transformer.\n//\n// Each rune that cannot be transcoded will result in an error. In this case,\n// the transform will consume all source byte up to, not including the offending\n// rune. Transforming source bytes that are not valid UTF-8 will be replaced by\n// `\\uFFFD`. To return early with an error instead, use transform.Chain to\n// preprocess the data with a UTF8Validator.\ntype Encoder struct {\n\ttransform.Transformer\n\n\t// This forces external creators of Encoders to use names in struct\n\t// initializers, allowing for future extendibility without having to break\n\t// code.\n\t_ struct{}\n}\n\n// Bytes converts bytes from UTF-8. It returns the converted bytes or nil, err if\n// any error occurred.\nfunc (e *Encoder) Bytes(b []byte) ([]byte, error) {\n\tb, _, err := transform.Bytes(e, b)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn b, nil\n}\n\n// String converts a string from UTF-8. It returns the converted string or\n// \"\", err if any error occurred.\nfunc (e *Encoder) String(s string) (string, error) {\n\ts, _, err := transform.String(e, s)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn s, nil\n}\n\n// Writer wraps another Writer to encode its UTF-8 output.\n//\n// The Encoder may not be used for any other operation as long as the returned\n// Writer is in use.\nfunc (e *Encoder) Writer(w io.Writer) io.Writer {\n\treturn transform.NewWriter(w, e)\n}\n\n// ASCIISub is the ASCII substitute character, as recommended by\n// http://unicode.org/reports/tr36/#Text_Comparison\nconst ASCIISub = '\\x1a'\n\n// Nop is the nop encoding. Its transformed bytes are the same as the source\n// bytes; it does not replace invalid UTF-8 sequences.\nvar Nop Encoding = nop{}\n\ntype nop struct{}\n\nfunc (nop) NewDecoder() *Decoder {\n\treturn &Decoder{Transformer: transform.Nop}\n}\nfunc (nop) NewEncoder() *Encoder {\n\treturn &Encoder{Transformer: transform.Nop}\n}\n\n// Replacement is the replacement encoding. Decoding from the replacement\n// encoding yields a single '\\uFFFD' replacement rune. Encoding from UTF-8 to\n// the replacement encoding yields the same as the source bytes except that\n// invalid UTF-8 is converted to '\\uFFFD'.\n//\n// It is defined at http://encoding.spec.whatwg.org/#replacement\nvar Replacement Encoding = replacement{}\n\ntype replacement struct{}\n\nfunc (replacement) NewDecoder() *Decoder {\n\treturn &Decoder{Transformer: replacementDecoder{}}\n}\n\nfunc (replacement) NewEncoder() *Encoder {\n\treturn &Encoder{Transformer: replacementEncoder{}}\n}\n\nfunc (replacement) ID() (mib identifier.MIB, other string) {\n\treturn identifier.Replacement, \"\"\n}\n\ntype replacementDecoder struct{ transform.NopResetter }\n\nfunc (replacementDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tif len(dst) < 3 {\n\t\treturn 0, 0, transform.ErrShortDst\n\t}\n\tif atEOF {\n\t\tconst fffd = \"\\ufffd\"\n\t\tdst[0] = fffd[0]\n\t\tdst[1] = fffd[1]\n\t\tdst[2] = fffd[2]\n\t\tnDst = 3\n\t}\n\treturn nDst, len(src), nil\n}\n\ntype replacementEncoder struct{ transform.NopResetter }\n\nfunc (replacementEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\n\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tr = '\\ufffd'\n\t\t\t}\n\t\t}\n\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t}\n\treturn nDst, nSrc, err\n}\n\n// HTMLEscapeUnsupported wraps encoders to replace source runes outside the\n// repertoire of the destination encoding with HTML escape sequences.\n//\n// This wrapper exists to comply to URL and HTML forms requiring a\n// non-terminating legacy encoder. The produced sequences may lead to data\n// loss as they are indistinguishable from legitimate input. To avoid this\n// issue, use UTF-8 encodings whenever possible.\nfunc HTMLEscapeUnsupported(e *Encoder) *Encoder {\n\treturn &Encoder{Transformer: &errorHandler{e, errorToHTML}}\n}\n\n// ReplaceUnsupported wraps encoders to replace source runes outside the\n// repertoire of the destination encoding with an encoding-specific\n// replacement.\n//\n// This wrapper is only provided for backwards compatibility and legacy\n// handling. Its use is strongly discouraged. Use UTF-8 whenever possible.\nfunc ReplaceUnsupported(e *Encoder) *Encoder {\n\treturn &Encoder{Transformer: &errorHandler{e, errorToReplacement}}\n}\n\ntype errorHandler struct {\n\t*Encoder\n\thandler func(dst []byte, r rune, err repertoireError) (n int, ok bool)\n}\n\n// TODO: consider making this error public in some form.\ntype repertoireError interface {\n\tReplacement() byte\n}\n\nfunc (h errorHandler) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tnDst, nSrc, err = h.Transformer.Transform(dst, src, atEOF)\n\tfor err != nil {\n\t\trerr, ok := err.(repertoireError)\n\t\tif !ok {\n\t\t\treturn nDst, nSrc, err\n\t\t}\n\t\tr, sz := utf8.DecodeRune(src[nSrc:])\n\t\tn, ok := h.handler(dst[nDst:], r, rerr)\n\t\tif !ok {\n\t\t\treturn nDst, nSrc, transform.ErrShortDst\n\t\t}\n\t\terr = nil\n\t\tnDst += n\n\t\tif nSrc += sz; nSrc < len(src) {\n\t\t\tvar dn, sn int\n\t\t\tdn, sn, err = h.Transformer.Transform(dst[nDst:], src[nSrc:], atEOF)\n\t\t\tnDst += dn\n\t\t\tnSrc += sn\n\t\t}\n\t}\n\treturn nDst, nSrc, err\n}\n\nfunc errorToHTML(dst []byte, r rune, err repertoireError) (n int, ok bool) {\n\tbuf := [8]byte{}\n\tb := strconv.AppendUint(buf[:0], uint64(r), 10)\n\tif n = len(b) + len(\"&#;\"); n >= len(dst) {\n\t\treturn 0, false\n\t}\n\tdst[0] = '&'\n\tdst[1] = '#'\n\tdst[copy(dst[2:], b)+2] = ';'\n\treturn n, true\n}\n\nfunc errorToReplacement(dst []byte, r rune, err repertoireError) (n int, ok bool) {\n\tif len(dst) == 0 {\n\t\treturn 0, false\n\t}\n\tdst[0] = err.Replacement()\n\treturn 1, true\n}\n\n// ErrInvalidUTF8 means that a transformer encountered invalid UTF-8.\nvar ErrInvalidUTF8 = errors.New(\"encoding: invalid UTF-8\")\n\n// UTF8Validator is a transformer that returns ErrInvalidUTF8 on the first\n// input byte that is not valid UTF-8.\nvar UTF8Validator transform.Transformer = utf8Validator{}\n\ntype utf8Validator struct{ transform.NopResetter }\n\nfunc (utf8Validator) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tn := len(src)\n\tif n > len(dst) {\n\t\tn = len(dst)\n\t}\n\tfor i := 0; i < n; {\n\t\tif c := src[i]; c < utf8.RuneSelf {\n\t\t\tdst[i] = c\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\t\t_, size := utf8.DecodeRune(src[i:])\n\t\tif size == 1 {\n\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t// full character yet.\n\t\t\terr = ErrInvalidUTF8\n\t\t\tif !atEOF && !utf8.FullRune(src[i:]) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t}\n\t\t\treturn i, i, err\n\t\t}\n\t\tif i+size > len(dst) {\n\t\t\treturn i, i, transform.ErrShortDst\n\t\t}\n\t\tfor ; size > 0; size-- {\n\t\t\tdst[i] = src[i]\n\t\t\ti++\n\t\t}\n\t}\n\tif len(src) > len(dst) {\n\t\terr = transform.ErrShortDst\n\t}\n\treturn n, n, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/htmlindex/gen.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\n\t\"golang.org/x/text/internal/gen\"\n)\n\ntype group struct {\n\tEncodings []struct {\n\t\tLabels []string\n\t\tName   string\n\t}\n}\n\nfunc main() {\n\tgen.Init()\n\n\tr := gen.Open(\"https://encoding.spec.whatwg.org\", \"whatwg\", \"encodings.json\")\n\tvar groups []group\n\tif err := json.NewDecoder(r).Decode(&groups); err != nil {\n\t\tlog.Fatalf(\"Error reading encodings.json: %v\", err)\n\t}\n\n\tw := &bytes.Buffer{}\n\tfmt.Fprintln(w, \"type htmlEncoding byte\")\n\tfmt.Fprintln(w, \"const (\")\n\tfor i, g := range groups {\n\t\tfor _, e := range g.Encodings {\n\t\t\tkey := strings.ToLower(e.Name)\n\t\t\tname := consts[key]\n\t\t\tif name == \"\" {\n\t\t\t\tlog.Fatalf(\"No const defined for %s.\", key)\n\t\t\t}\n\t\t\tif i == 0 {\n\t\t\t\tfmt.Fprintf(w, \"%s htmlEncoding = iota\\n\", name)\n\t\t\t} else {\n\t\t\t\tfmt.Fprintf(w, \"%s\\n\", name)\n\t\t\t}\n\t\t}\n\t}\n\tfmt.Fprintln(w, \"numEncodings\")\n\tfmt.Fprint(w, \")\\n\\n\")\n\n\tfmt.Fprintln(w, \"var canonical = [numEncodings]string{\")\n\tfor _, g := range groups {\n\t\tfor _, e := range g.Encodings {\n\t\t\tfmt.Fprintf(w, \"%q,\\n\", strings.ToLower(e.Name))\n\t\t}\n\t}\n\tfmt.Fprint(w, \"}\\n\\n\")\n\n\tfmt.Fprintln(w, \"var nameMap = map[string]htmlEncoding{\")\n\tfor _, g := range groups {\n\t\tfor _, e := range g.Encodings {\n\t\t\tfor _, l := range e.Labels {\n\t\t\t\tkey := strings.ToLower(e.Name)\n\t\t\t\tname := consts[key]\n\t\t\t\tfmt.Fprintf(w, \"%q: %s,\\n\", l, name)\n\t\t\t}\n\t\t}\n\t}\n\tfmt.Fprint(w, \"}\\n\\n\")\n\n\tvar tags []string\n\tfmt.Fprintln(w, \"var localeMap = []htmlEncoding{\")\n\tfor _, loc := range locales {\n\t\ttags = append(tags, loc.tag)\n\t\tfmt.Fprintf(w, \"%s, // %s \\n\", consts[loc.name], loc.tag)\n\t}\n\tfmt.Fprint(w, \"}\\n\\n\")\n\n\tfmt.Fprintf(w, \"const locales = %q\\n\", strings.Join(tags, \" \"))\n\n\tgen.WriteGoFile(\"tables.go\", \"htmlindex\", w.Bytes())\n}\n\n// consts maps canonical encoding name to internal constant.\nvar consts = map[string]string{\n\t\"utf-8\":          \"utf8\",\n\t\"ibm866\":         \"ibm866\",\n\t\"iso-8859-2\":     \"iso8859_2\",\n\t\"iso-8859-3\":     \"iso8859_3\",\n\t\"iso-8859-4\":     \"iso8859_4\",\n\t\"iso-8859-5\":     \"iso8859_5\",\n\t\"iso-8859-6\":     \"iso8859_6\",\n\t\"iso-8859-7\":     \"iso8859_7\",\n\t\"iso-8859-8\":     \"iso8859_8\",\n\t\"iso-8859-8-i\":   \"iso8859_8I\",\n\t\"iso-8859-10\":    \"iso8859_10\",\n\t\"iso-8859-13\":    \"iso8859_13\",\n\t\"iso-8859-14\":    \"iso8859_14\",\n\t\"iso-8859-15\":    \"iso8859_15\",\n\t\"iso-8859-16\":    \"iso8859_16\",\n\t\"koi8-r\":         \"koi8r\",\n\t\"koi8-u\":         \"koi8u\",\n\t\"macintosh\":      \"macintosh\",\n\t\"windows-874\":    \"windows874\",\n\t\"windows-1250\":   \"windows1250\",\n\t\"windows-1251\":   \"windows1251\",\n\t\"windows-1252\":   \"windows1252\",\n\t\"windows-1253\":   \"windows1253\",\n\t\"windows-1254\":   \"windows1254\",\n\t\"windows-1255\":   \"windows1255\",\n\t\"windows-1256\":   \"windows1256\",\n\t\"windows-1257\":   \"windows1257\",\n\t\"windows-1258\":   \"windows1258\",\n\t\"x-mac-cyrillic\": \"macintoshCyrillic\",\n\t\"gbk\":            \"gbk\",\n\t\"gb18030\":        \"gb18030\",\n\t// \"hz-gb-2312\":     \"hzgb2312\", // Was removed from WhatWG\n\t\"big5\":           \"big5\",\n\t\"euc-jp\":         \"eucjp\",\n\t\"iso-2022-jp\":    \"iso2022jp\",\n\t\"shift_jis\":      \"shiftJIS\",\n\t\"euc-kr\":         \"euckr\",\n\t\"replacement\":    \"replacement\",\n\t\"utf-16be\":       \"utf16be\",\n\t\"utf-16le\":       \"utf16le\",\n\t\"x-user-defined\": \"xUserDefined\",\n}\n\n// locales is taken from\n// https://html.spec.whatwg.org/multipage/syntax.html#encoding-sniffing-algorithm.\nvar locales = []struct{ tag, name string }{\n\t{\"und\", \"windows-1252\"}, // The default value.\n\t{\"ar\", \"windows-1256\"},\n\t{\"ba\", \"windows-1251\"},\n\t{\"be\", \"windows-1251\"},\n\t{\"bg\", \"windows-1251\"},\n\t{\"cs\", \"windows-1250\"},\n\t{\"el\", \"iso-8859-7\"},\n\t{\"et\", \"windows-1257\"},\n\t{\"fa\", \"windows-1256\"},\n\t{\"he\", \"windows-1255\"},\n\t{\"hr\", \"windows-1250\"},\n\t{\"hu\", \"iso-8859-2\"},\n\t{\"ja\", \"shift_jis\"},\n\t{\"kk\", \"windows-1251\"},\n\t{\"ko\", \"euc-kr\"},\n\t{\"ku\", \"windows-1254\"},\n\t{\"ky\", \"windows-1251\"},\n\t{\"lt\", \"windows-1257\"},\n\t{\"lv\", \"windows-1257\"},\n\t{\"mk\", \"windows-1251\"},\n\t{\"pl\", \"iso-8859-2\"},\n\t{\"ru\", \"windows-1251\"},\n\t{\"sah\", \"windows-1251\"},\n\t{\"sk\", \"windows-1250\"},\n\t{\"sl\", \"iso-8859-2\"},\n\t{\"sr\", \"windows-1251\"},\n\t{\"tg\", \"windows-1251\"},\n\t{\"th\", \"windows-874\"},\n\t{\"tr\", \"windows-1254\"},\n\t{\"tt\", \"windows-1251\"},\n\t{\"uk\", \"windows-1251\"},\n\t{\"vi\", \"windows-1258\"},\n\t{\"zh-hans\", \"gb18030\"},\n\t{\"zh-hant\", \"big5\"},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:generate go run gen.go\n\n// Package htmlindex maps character set encoding names to Encodings as\n// recommended by the W3C for use in HTML 5. See http://www.w3.org/TR/encoding.\npackage htmlindex\n\n// TODO: perhaps have a \"bare\" version of the index (used by this package) that\n// is not pre-loaded with all encodings. Global variables in encodings prevent\n// the linker from being able to purge unneeded tables. This means that\n// referencing all encodings, as this package does for the default index, links\n// in all encodings unconditionally.\n//\n// This issue can be solved by either solving the linking issue (see\n// https://github.com/golang/go/issues/6330) or refactoring the encoding tables\n// (e.g. moving the tables to internal packages that do not use global\n// variables).\n\n// TODO: allow canonicalizing names\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/language\"\n)\n\nvar (\n\terrInvalidName = errors.New(\"htmlindex: invalid encoding name\")\n\terrUnknown     = errors.New(\"htmlindex: unknown Encoding\")\n\terrUnsupported = errors.New(\"htmlindex: this encoding is not supported\")\n)\n\nvar (\n\tmatcherOnce sync.Once\n\tmatcher     language.Matcher\n)\n\n// LanguageDefault returns the canonical name of the default encoding for a\n// given language.\nfunc LanguageDefault(tag language.Tag) string {\n\tmatcherOnce.Do(func() {\n\t\ttags := []language.Tag{}\n\t\tfor _, t := range strings.Split(locales, \" \") {\n\t\t\ttags = append(tags, language.MustParse(t))\n\t\t}\n\t\tmatcher = language.NewMatcher(tags)\n\t})\n\t_, i, _ := matcher.Match(tag)\n\treturn canonical[localeMap[i]] // Default is Windows-1252.\n}\n\n// Get returns an Encoding for one of the names listed in\n// http://www.w3.org/TR/encoding using the Default Index. Matching is case-\n// insensitive.\nfunc Get(name string) (encoding.Encoding, error) {\n\tx, ok := nameMap[strings.ToLower(strings.TrimSpace(name))]\n\tif !ok {\n\t\treturn nil, errInvalidName\n\t}\n\treturn encodings[x], nil\n}\n\n// Name reports the canonical name of the given Encoding. It will return\n// an error if e is not associated with a supported encoding scheme.\nfunc Name(e encoding.Encoding) (string, error) {\n\tid, ok := e.(identifier.Interface)\n\tif !ok {\n\t\treturn \"\", errUnknown\n\t}\n\tmib, _ := id.ID()\n\tif mib == 0 {\n\t\treturn \"\", errUnknown\n\t}\n\tv, ok := mibMap[mib]\n\tif !ok {\n\t\treturn \"\", errUnsupported\n\t}\n\treturn canonical[v], nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/htmlindex/map.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage htmlindex\n\nimport (\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/charmap\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/encoding/japanese\"\n\t\"golang.org/x/text/encoding/korean\"\n\t\"golang.org/x/text/encoding/simplifiedchinese\"\n\t\"golang.org/x/text/encoding/traditionalchinese\"\n\t\"golang.org/x/text/encoding/unicode\"\n)\n\n// mibMap maps a MIB identifier to an htmlEncoding index.\nvar mibMap = map[identifier.MIB]htmlEncoding{\n\tidentifier.UTF8:              utf8,\n\tidentifier.UTF16BE:           utf16be,\n\tidentifier.UTF16LE:           utf16le,\n\tidentifier.IBM866:            ibm866,\n\tidentifier.ISOLatin2:         iso8859_2,\n\tidentifier.ISOLatin3:         iso8859_3,\n\tidentifier.ISOLatin4:         iso8859_4,\n\tidentifier.ISOLatinCyrillic:  iso8859_5,\n\tidentifier.ISOLatinArabic:    iso8859_6,\n\tidentifier.ISOLatinGreek:     iso8859_7,\n\tidentifier.ISOLatinHebrew:    iso8859_8,\n\tidentifier.ISO88598I:         iso8859_8I,\n\tidentifier.ISOLatin6:         iso8859_10,\n\tidentifier.ISO885913:         iso8859_13,\n\tidentifier.ISO885914:         iso8859_14,\n\tidentifier.ISO885915:         iso8859_15,\n\tidentifier.ISO885916:         iso8859_16,\n\tidentifier.KOI8R:             koi8r,\n\tidentifier.KOI8U:             koi8u,\n\tidentifier.Macintosh:         macintosh,\n\tidentifier.MacintoshCyrillic: macintoshCyrillic,\n\tidentifier.Windows874:        windows874,\n\tidentifier.Windows1250:       windows1250,\n\tidentifier.Windows1251:       windows1251,\n\tidentifier.Windows1252:       windows1252,\n\tidentifier.Windows1253:       windows1253,\n\tidentifier.Windows1254:       windows1254,\n\tidentifier.Windows1255:       windows1255,\n\tidentifier.Windows1256:       windows1256,\n\tidentifier.Windows1257:       windows1257,\n\tidentifier.Windows1258:       windows1258,\n\tidentifier.XUserDefined:      xUserDefined,\n\tidentifier.GBK:               gbk,\n\tidentifier.GB18030:           gb18030,\n\tidentifier.Big5:              big5,\n\tidentifier.EUCPkdFmtJapanese: eucjp,\n\tidentifier.ISO2022JP:         iso2022jp,\n\tidentifier.ShiftJIS:          shiftJIS,\n\tidentifier.EUCKR:             euckr,\n\tidentifier.Replacement:       replacement,\n}\n\n// encodings maps the internal htmlEncoding to an Encoding.\n// TODO: consider using a reusable index in encoding/internal.\nvar encodings = [numEncodings]encoding.Encoding{\n\tutf8:              unicode.UTF8,\n\tibm866:            charmap.CodePage866,\n\tiso8859_2:         charmap.ISO8859_2,\n\tiso8859_3:         charmap.ISO8859_3,\n\tiso8859_4:         charmap.ISO8859_4,\n\tiso8859_5:         charmap.ISO8859_5,\n\tiso8859_6:         charmap.ISO8859_6,\n\tiso8859_7:         charmap.ISO8859_7,\n\tiso8859_8:         charmap.ISO8859_8,\n\tiso8859_8I:        charmap.ISO8859_8I,\n\tiso8859_10:        charmap.ISO8859_10,\n\tiso8859_13:        charmap.ISO8859_13,\n\tiso8859_14:        charmap.ISO8859_14,\n\tiso8859_15:        charmap.ISO8859_15,\n\tiso8859_16:        charmap.ISO8859_16,\n\tkoi8r:             charmap.KOI8R,\n\tkoi8u:             charmap.KOI8U,\n\tmacintosh:         charmap.Macintosh,\n\twindows874:        charmap.Windows874,\n\twindows1250:       charmap.Windows1250,\n\twindows1251:       charmap.Windows1251,\n\twindows1252:       charmap.Windows1252,\n\twindows1253:       charmap.Windows1253,\n\twindows1254:       charmap.Windows1254,\n\twindows1255:       charmap.Windows1255,\n\twindows1256:       charmap.Windows1256,\n\twindows1257:       charmap.Windows1257,\n\twindows1258:       charmap.Windows1258,\n\tmacintoshCyrillic: charmap.MacintoshCyrillic,\n\tgbk:               simplifiedchinese.GBK,\n\tgb18030:           simplifiedchinese.GB18030,\n\tbig5:              traditionalchinese.Big5,\n\teucjp:             japanese.EUCJP,\n\tiso2022jp:         japanese.ISO2022JP,\n\tshiftJIS:          japanese.ShiftJIS,\n\teuckr:             korean.EUCKR,\n\treplacement:       encoding.Replacement,\n\tutf16be:           unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM),\n\tutf16le:           unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM),\n\txUserDefined:      charmap.XUserDefined,\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/htmlindex/tables.go",
    "content": "// This file was generated by go generate; DO NOT EDIT\n\npackage htmlindex\n\ntype htmlEncoding byte\n\nconst (\n\tutf8 htmlEncoding = iota\n\tibm866\n\tiso8859_2\n\tiso8859_3\n\tiso8859_4\n\tiso8859_5\n\tiso8859_6\n\tiso8859_7\n\tiso8859_8\n\tiso8859_8I\n\tiso8859_10\n\tiso8859_13\n\tiso8859_14\n\tiso8859_15\n\tiso8859_16\n\tkoi8r\n\tkoi8u\n\tmacintosh\n\twindows874\n\twindows1250\n\twindows1251\n\twindows1252\n\twindows1253\n\twindows1254\n\twindows1255\n\twindows1256\n\twindows1257\n\twindows1258\n\tmacintoshCyrillic\n\tgbk\n\tgb18030\n\tbig5\n\teucjp\n\tiso2022jp\n\tshiftJIS\n\teuckr\n\treplacement\n\tutf16be\n\tutf16le\n\txUserDefined\n\tnumEncodings\n)\n\nvar canonical = [numEncodings]string{\n\t\"utf-8\",\n\t\"ibm866\",\n\t\"iso-8859-2\",\n\t\"iso-8859-3\",\n\t\"iso-8859-4\",\n\t\"iso-8859-5\",\n\t\"iso-8859-6\",\n\t\"iso-8859-7\",\n\t\"iso-8859-8\",\n\t\"iso-8859-8-i\",\n\t\"iso-8859-10\",\n\t\"iso-8859-13\",\n\t\"iso-8859-14\",\n\t\"iso-8859-15\",\n\t\"iso-8859-16\",\n\t\"koi8-r\",\n\t\"koi8-u\",\n\t\"macintosh\",\n\t\"windows-874\",\n\t\"windows-1250\",\n\t\"windows-1251\",\n\t\"windows-1252\",\n\t\"windows-1253\",\n\t\"windows-1254\",\n\t\"windows-1255\",\n\t\"windows-1256\",\n\t\"windows-1257\",\n\t\"windows-1258\",\n\t\"x-mac-cyrillic\",\n\t\"gbk\",\n\t\"gb18030\",\n\t\"big5\",\n\t\"euc-jp\",\n\t\"iso-2022-jp\",\n\t\"shift_jis\",\n\t\"euc-kr\",\n\t\"replacement\",\n\t\"utf-16be\",\n\t\"utf-16le\",\n\t\"x-user-defined\",\n}\n\nvar nameMap = map[string]htmlEncoding{\n\t\"unicode-1-1-utf-8\":   utf8,\n\t\"utf-8\":               utf8,\n\t\"utf8\":                utf8,\n\t\"866\":                 ibm866,\n\t\"cp866\":               ibm866,\n\t\"csibm866\":            ibm866,\n\t\"ibm866\":              ibm866,\n\t\"csisolatin2\":         iso8859_2,\n\t\"iso-8859-2\":          iso8859_2,\n\t\"iso-ir-101\":          iso8859_2,\n\t\"iso8859-2\":           iso8859_2,\n\t\"iso88592\":            iso8859_2,\n\t\"iso_8859-2\":          iso8859_2,\n\t\"iso_8859-2:1987\":     iso8859_2,\n\t\"l2\":                  iso8859_2,\n\t\"latin2\":              iso8859_2,\n\t\"csisolatin3\":         iso8859_3,\n\t\"iso-8859-3\":          iso8859_3,\n\t\"iso-ir-109\":          iso8859_3,\n\t\"iso8859-3\":           iso8859_3,\n\t\"iso88593\":            iso8859_3,\n\t\"iso_8859-3\":          iso8859_3,\n\t\"iso_8859-3:1988\":     iso8859_3,\n\t\"l3\":                  iso8859_3,\n\t\"latin3\":              iso8859_3,\n\t\"csisolatin4\":         iso8859_4,\n\t\"iso-8859-4\":          iso8859_4,\n\t\"iso-ir-110\":          iso8859_4,\n\t\"iso8859-4\":           iso8859_4,\n\t\"iso88594\":            iso8859_4,\n\t\"iso_8859-4\":          iso8859_4,\n\t\"iso_8859-4:1988\":     iso8859_4,\n\t\"l4\":                  iso8859_4,\n\t\"latin4\":              iso8859_4,\n\t\"csisolatincyrillic\":  iso8859_5,\n\t\"cyrillic\":            iso8859_5,\n\t\"iso-8859-5\":          iso8859_5,\n\t\"iso-ir-144\":          iso8859_5,\n\t\"iso8859-5\":           iso8859_5,\n\t\"iso88595\":            iso8859_5,\n\t\"iso_8859-5\":          iso8859_5,\n\t\"iso_8859-5:1988\":     iso8859_5,\n\t\"arabic\":              iso8859_6,\n\t\"asmo-708\":            iso8859_6,\n\t\"csiso88596e\":         iso8859_6,\n\t\"csiso88596i\":         iso8859_6,\n\t\"csisolatinarabic\":    iso8859_6,\n\t\"ecma-114\":            iso8859_6,\n\t\"iso-8859-6\":          iso8859_6,\n\t\"iso-8859-6-e\":        iso8859_6,\n\t\"iso-8859-6-i\":        iso8859_6,\n\t\"iso-ir-127\":          iso8859_6,\n\t\"iso8859-6\":           iso8859_6,\n\t\"iso88596\":            iso8859_6,\n\t\"iso_8859-6\":          iso8859_6,\n\t\"iso_8859-6:1987\":     iso8859_6,\n\t\"csisolatingreek\":     iso8859_7,\n\t\"ecma-118\":            iso8859_7,\n\t\"elot_928\":            iso8859_7,\n\t\"greek\":               iso8859_7,\n\t\"greek8\":              iso8859_7,\n\t\"iso-8859-7\":          iso8859_7,\n\t\"iso-ir-126\":          iso8859_7,\n\t\"iso8859-7\":           iso8859_7,\n\t\"iso88597\":            iso8859_7,\n\t\"iso_8859-7\":          iso8859_7,\n\t\"iso_8859-7:1987\":     iso8859_7,\n\t\"sun_eu_greek\":        iso8859_7,\n\t\"csiso88598e\":         iso8859_8,\n\t\"csisolatinhebrew\":    iso8859_8,\n\t\"hebrew\":              iso8859_8,\n\t\"iso-8859-8\":          iso8859_8,\n\t\"iso-8859-8-e\":        iso8859_8,\n\t\"iso-ir-138\":          iso8859_8,\n\t\"iso8859-8\":           iso8859_8,\n\t\"iso88598\":            iso8859_8,\n\t\"iso_8859-8\":          iso8859_8,\n\t\"iso_8859-8:1988\":     iso8859_8,\n\t\"visual\":              iso8859_8,\n\t\"csiso88598i\":         iso8859_8I,\n\t\"iso-8859-8-i\":        iso8859_8I,\n\t\"logical\":             iso8859_8I,\n\t\"csisolatin6\":         iso8859_10,\n\t\"iso-8859-10\":         iso8859_10,\n\t\"iso-ir-157\":          iso8859_10,\n\t\"iso8859-10\":          iso8859_10,\n\t\"iso885910\":           iso8859_10,\n\t\"l6\":                  iso8859_10,\n\t\"latin6\":              iso8859_10,\n\t\"iso-8859-13\":         iso8859_13,\n\t\"iso8859-13\":          iso8859_13,\n\t\"iso885913\":           iso8859_13,\n\t\"iso-8859-14\":         iso8859_14,\n\t\"iso8859-14\":          iso8859_14,\n\t\"iso885914\":           iso8859_14,\n\t\"csisolatin9\":         iso8859_15,\n\t\"iso-8859-15\":         iso8859_15,\n\t\"iso8859-15\":          iso8859_15,\n\t\"iso885915\":           iso8859_15,\n\t\"iso_8859-15\":         iso8859_15,\n\t\"l9\":                  iso8859_15,\n\t\"iso-8859-16\":         iso8859_16,\n\t\"cskoi8r\":             koi8r,\n\t\"koi\":                 koi8r,\n\t\"koi8\":                koi8r,\n\t\"koi8-r\":              koi8r,\n\t\"koi8_r\":              koi8r,\n\t\"koi8-ru\":             koi8u,\n\t\"koi8-u\":              koi8u,\n\t\"csmacintosh\":         macintosh,\n\t\"mac\":                 macintosh,\n\t\"macintosh\":           macintosh,\n\t\"x-mac-roman\":         macintosh,\n\t\"dos-874\":             windows874,\n\t\"iso-8859-11\":         windows874,\n\t\"iso8859-11\":          windows874,\n\t\"iso885911\":           windows874,\n\t\"tis-620\":             windows874,\n\t\"windows-874\":         windows874,\n\t\"cp1250\":              windows1250,\n\t\"windows-1250\":        windows1250,\n\t\"x-cp1250\":            windows1250,\n\t\"cp1251\":              windows1251,\n\t\"windows-1251\":        windows1251,\n\t\"x-cp1251\":            windows1251,\n\t\"ansi_x3.4-1968\":      windows1252,\n\t\"ascii\":               windows1252,\n\t\"cp1252\":              windows1252,\n\t\"cp819\":               windows1252,\n\t\"csisolatin1\":         windows1252,\n\t\"ibm819\":              windows1252,\n\t\"iso-8859-1\":          windows1252,\n\t\"iso-ir-100\":          windows1252,\n\t\"iso8859-1\":           windows1252,\n\t\"iso88591\":            windows1252,\n\t\"iso_8859-1\":          windows1252,\n\t\"iso_8859-1:1987\":     windows1252,\n\t\"l1\":                  windows1252,\n\t\"latin1\":              windows1252,\n\t\"us-ascii\":            windows1252,\n\t\"windows-1252\":        windows1252,\n\t\"x-cp1252\":            windows1252,\n\t\"cp1253\":              windows1253,\n\t\"windows-1253\":        windows1253,\n\t\"x-cp1253\":            windows1253,\n\t\"cp1254\":              windows1254,\n\t\"csisolatin5\":         windows1254,\n\t\"iso-8859-9\":          windows1254,\n\t\"iso-ir-148\":          windows1254,\n\t\"iso8859-9\":           windows1254,\n\t\"iso88599\":            windows1254,\n\t\"iso_8859-9\":          windows1254,\n\t\"iso_8859-9:1989\":     windows1254,\n\t\"l5\":                  windows1254,\n\t\"latin5\":              windows1254,\n\t\"windows-1254\":        windows1254,\n\t\"x-cp1254\":            windows1254,\n\t\"cp1255\":              windows1255,\n\t\"windows-1255\":        windows1255,\n\t\"x-cp1255\":            windows1255,\n\t\"cp1256\":              windows1256,\n\t\"windows-1256\":        windows1256,\n\t\"x-cp1256\":            windows1256,\n\t\"cp1257\":              windows1257,\n\t\"windows-1257\":        windows1257,\n\t\"x-cp1257\":            windows1257,\n\t\"cp1258\":              windows1258,\n\t\"windows-1258\":        windows1258,\n\t\"x-cp1258\":            windows1258,\n\t\"x-mac-cyrillic\":      macintoshCyrillic,\n\t\"x-mac-ukrainian\":     macintoshCyrillic,\n\t\"chinese\":             gbk,\n\t\"csgb2312\":            gbk,\n\t\"csiso58gb231280\":     gbk,\n\t\"gb2312\":              gbk,\n\t\"gb_2312\":             gbk,\n\t\"gb_2312-80\":          gbk,\n\t\"gbk\":                 gbk,\n\t\"iso-ir-58\":           gbk,\n\t\"x-gbk\":               gbk,\n\t\"gb18030\":             gb18030,\n\t\"big5\":                big5,\n\t\"big5-hkscs\":          big5,\n\t\"cn-big5\":             big5,\n\t\"csbig5\":              big5,\n\t\"x-x-big5\":            big5,\n\t\"cseucpkdfmtjapanese\": eucjp,\n\t\"euc-jp\":              eucjp,\n\t\"x-euc-jp\":            eucjp,\n\t\"csiso2022jp\":         iso2022jp,\n\t\"iso-2022-jp\":         iso2022jp,\n\t\"csshiftjis\":          shiftJIS,\n\t\"ms932\":               shiftJIS,\n\t\"ms_kanji\":            shiftJIS,\n\t\"shift-jis\":           shiftJIS,\n\t\"shift_jis\":           shiftJIS,\n\t\"sjis\":                shiftJIS,\n\t\"windows-31j\":         shiftJIS,\n\t\"x-sjis\":              shiftJIS,\n\t\"cseuckr\":             euckr,\n\t\"csksc56011987\":       euckr,\n\t\"euc-kr\":              euckr,\n\t\"iso-ir-149\":          euckr,\n\t\"korean\":              euckr,\n\t\"ks_c_5601-1987\":      euckr,\n\t\"ks_c_5601-1989\":      euckr,\n\t\"ksc5601\":             euckr,\n\t\"ksc_5601\":            euckr,\n\t\"windows-949\":         euckr,\n\t\"csiso2022kr\":         replacement,\n\t\"hz-gb-2312\":          replacement,\n\t\"iso-2022-cn\":         replacement,\n\t\"iso-2022-cn-ext\":     replacement,\n\t\"iso-2022-kr\":         replacement,\n\t\"utf-16be\":            utf16be,\n\t\"utf-16\":              utf16le,\n\t\"utf-16le\":            utf16le,\n\t\"x-user-defined\":      xUserDefined,\n}\n\nvar localeMap = []htmlEncoding{\n\twindows1252, // und\n\twindows1256, // ar\n\twindows1251, // ba\n\twindows1251, // be\n\twindows1251, // bg\n\twindows1250, // cs\n\tiso8859_7,   // el\n\twindows1257, // et\n\twindows1256, // fa\n\twindows1255, // he\n\twindows1250, // hr\n\tiso8859_2,   // hu\n\tshiftJIS,    // ja\n\twindows1251, // kk\n\teuckr,       // ko\n\twindows1254, // ku\n\twindows1251, // ky\n\twindows1257, // lt\n\twindows1257, // lv\n\twindows1251, // mk\n\tiso8859_2,   // pl\n\twindows1251, // ru\n\twindows1251, // sah\n\twindows1250, // sk\n\tiso8859_2,   // sl\n\twindows1251, // sr\n\twindows1251, // tg\n\twindows874,  // th\n\twindows1254, // tr\n\twindows1251, // tt\n\twindows1251, // uk\n\twindows1258, // vi\n\tgb18030,     // zh-hans\n\tbig5,        // zh-hant\n}\n\nconst locales = \"und ar ba be bg cs el et fa he hr hu ja kk ko ku ky lt lv mk pl ru sah sk sl sr tg th tr tt uk vi zh-hans zh-hant\"\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/internal/identifier/gen.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"encoding/xml\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"strings\"\n\n\t\"golang.org/x/text/internal/gen\"\n)\n\ntype registry struct {\n\tXMLName  xml.Name `xml:\"registry\"`\n\tUpdated  string   `xml:\"updated\"`\n\tRegistry []struct {\n\t\tID     string `xml:\"id,attr\"`\n\t\tRecord []struct {\n\t\t\tName string `xml:\"name\"`\n\t\t\tXref []struct {\n\t\t\t\tType string `xml:\"type,attr\"`\n\t\t\t\tData string `xml:\"data,attr\"`\n\t\t\t} `xml:\"xref\"`\n\t\t\tDesc struct {\n\t\t\t\tData string `xml:\",innerxml\"`\n\t\t\t\t// Any []struct {\n\t\t\t\t// \tData string `xml:\",chardata\"`\n\t\t\t\t// } `xml:\",any\"`\n\t\t\t\t// Data string `xml:\",chardata\"`\n\t\t\t} `xml:\"description,\"`\n\t\t\tMIB   string   `xml:\"value\"`\n\t\t\tAlias []string `xml:\"alias\"`\n\t\t\tMIME  string   `xml:\"preferred_alias\"`\n\t\t} `xml:\"record\"`\n\t} `xml:\"registry\"`\n}\n\nfunc main() {\n\tr := gen.OpenIANAFile(\"assignments/character-sets/character-sets.xml\")\n\treg := &registry{}\n\tif err := xml.NewDecoder(r).Decode(&reg); err != nil && err != io.EOF {\n\t\tlog.Fatalf(\"Error decoding charset registry: %v\", err)\n\t}\n\tif len(reg.Registry) == 0 || reg.Registry[0].ID != \"character-sets-1\" {\n\t\tlog.Fatalf(\"Unexpected ID %s\", reg.Registry[0].ID)\n\t}\n\n\tw := &bytes.Buffer{}\n\tfmt.Fprintf(w, \"const (\\n\")\n\tfor _, rec := range reg.Registry[0].Record {\n\t\tconstName := \"\"\n\t\tfor _, a := range rec.Alias {\n\t\t\tif strings.HasPrefix(a, \"cs\") && strings.IndexByte(a, '-') == -1 {\n\t\t\t\t// Some of the constant definitions have comments in them. Strip those.\n\t\t\t\tconstName = strings.Title(strings.SplitN(a[2:], \"\\n\", 2)[0])\n\t\t\t}\n\t\t}\n\t\tif constName == \"\" {\n\t\t\tswitch rec.MIB {\n\t\t\tcase \"2085\":\n\t\t\t\tconstName = \"HZGB2312\" // Not listed as alias for some reason.\n\t\t\tdefault:\n\t\t\t\tlog.Fatalf(\"No cs alias defined for %s.\", rec.MIB)\n\t\t\t}\n\t\t}\n\t\tif rec.MIME != \"\" {\n\t\t\trec.MIME = fmt.Sprintf(\" (MIME: %s)\", rec.MIME)\n\t\t}\n\t\tfmt.Fprintf(w, \"// %s is the MIB identifier with IANA name %s%s.\\n//\\n\", constName, rec.Name, rec.MIME)\n\t\tif len(rec.Desc.Data) > 0 {\n\t\t\tfmt.Fprint(w, \"// \")\n\t\t\td := xml.NewDecoder(strings.NewReader(rec.Desc.Data))\n\t\t\tinElem := true\n\t\t\tattr := \"\"\n\t\t\tfor {\n\t\t\t\tt, err := d.Token()\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err != io.EOF {\n\t\t\t\t\t\tlog.Fatal(err)\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tswitch x := t.(type) {\n\t\t\t\tcase xml.CharData:\n\t\t\t\t\tattr = \"\" // Don't need attribute info.\n\t\t\t\t\ta := bytes.Split([]byte(x), []byte(\"\\n\"))\n\t\t\t\t\tfor i, b := range a {\n\t\t\t\t\t\tif b = bytes.TrimSpace(b); len(b) != 0 {\n\t\t\t\t\t\t\tif !inElem && i > 0 {\n\t\t\t\t\t\t\t\tfmt.Fprint(w, \"\\n// \")\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinElem = false\n\t\t\t\t\t\t\tfmt.Fprintf(w, \"%s \", string(b))\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tcase xml.StartElement:\n\t\t\t\t\tif x.Name.Local == \"xref\" {\n\t\t\t\t\t\tinElem = true\n\t\t\t\t\t\tuse := false\n\t\t\t\t\t\tfor _, a := range x.Attr {\n\t\t\t\t\t\t\tif a.Name.Local == \"type\" {\n\t\t\t\t\t\t\t\tuse = use || a.Value != \"person\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif a.Name.Local == \"data\" && use {\n\t\t\t\t\t\t\t\tattr = a.Value + \" \"\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\tcase xml.EndElement:\n\t\t\t\t\tinElem = false\n\t\t\t\t\tfmt.Fprint(w, attr)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfmt.Fprint(w, \"\\n\")\n\t\t}\n\t\tfor _, x := range rec.Xref {\n\t\t\tswitch x.Type {\n\t\t\tcase \"rfc\":\n\t\t\t\tfmt.Fprintf(w, \"// Reference: %s\\n\", strings.ToUpper(x.Data))\n\t\t\tcase \"uri\":\n\t\t\t\tfmt.Fprintf(w, \"// Reference: %s\\n\", x.Data)\n\t\t\t}\n\t\t}\n\t\tfmt.Fprintf(w, \"%s MIB = %s\\n\", constName, rec.MIB)\n\t\tfmt.Fprintln(w)\n\t}\n\tfmt.Fprintln(w, \")\")\n\n\tgen.WriteGoFile(\"mib.go\", \"identifier\", w.Bytes())\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/internal/identifier/identifier.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:generate go run gen.go\n\n// Package identifier defines the contract between implementations of Encoding\n// and Index by defining identifiers that uniquely identify standardized coded\n// character sets (CCS) and character encoding schemes (CES), which we will\n// together refer to as encodings, for which Encoding implementations provide\n// converters to and from UTF-8. This package is typically only of concern to\n// implementers of Indexes and Encodings.\n//\n// One part of the identifier is the MIB code, which is defined by IANA and\n// uniquely identifies a CCS or CES. Each code is associated with data that\n// references authorities, official documentation as well as aliases and MIME\n// names.\n//\n// Not all CESs are covered by the IANA registry. The \"other\" string that is\n// returned by ID can be used to identify other character sets or versions of\n// existing ones.\n//\n// It is recommended that each package that provides a set of Encodings provide\n// the All and Common variables to reference all supported encodings and\n// commonly used subset. This allows Index implementations to include all\n// available encodings without explicitly referencing or knowing about them.\npackage identifier\n\n// Note: this package is internal, but could be made public if there is a need\n// for writing third-party Indexes and Encodings.\n\n// References:\n// - http://source.icu-project.org/repos/icu/icu/trunk/source/data/mappings/convrtrs.txt\n// - http://www.iana.org/assignments/character-sets/character-sets.xhtml\n// - http://www.iana.org/assignments/ianacharset-mib/ianacharset-mib\n// - http://www.ietf.org/rfc/rfc2978.txt\n// - http://www.unicode.org/reports/tr22/\n// - http://www.w3.org/TR/encoding/\n// - https://encoding.spec.whatwg.org/\n// - https://encoding.spec.whatwg.org/encodings.json\n// - https://tools.ietf.org/html/rfc6657#section-5\n\n// Interface can be implemented by Encodings to define the CCS or CES for which\n// it implements conversions.\ntype Interface interface {\n\t// ID returns an encoding identifier. Exactly one of the mib and other\n\t// values should be non-zero.\n\t//\n\t// In the usual case it is only necessary to indicate the MIB code. The\n\t// other string can be used to specify encodings for which there is no MIB,\n\t// such as \"x-mac-dingbat\".\n\t//\n\t// The other string may only contain the characters a-z, A-Z, 0-9, - and _.\n\tID() (mib MIB, other string)\n\n\t// NOTE: the restrictions on the encoding are to allow extending the syntax\n\t// with additional information such as versions, vendors and other variants.\n}\n\n// A MIB identifies an encoding. It is derived from the IANA MIB codes and adds\n// some identifiers for some encodings that are not covered by the IANA\n// standard.\n//\n// See http://www.iana.org/assignments/ianacharset-mib.\ntype MIB uint16\n\n// These additional MIB types are not defined in IANA. They are added because\n// they are common and defined within the text repo.\nconst (\n\t// Unofficial marks the start of encodings not registered by IANA.\n\tUnofficial MIB = 10000 + iota\n\n\t// Replacement is the WhatWG replacement encoding.\n\tReplacement\n\n\t// XUserDefined is the code for x-user-defined.\n\tXUserDefined\n\n\t// MacintoshCyrillic is the code for x-mac-cyrillic.\n\tMacintoshCyrillic\n)\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/internal/identifier/mib.go",
    "content": "// This file was generated by go generate; DO NOT EDIT\n\npackage identifier\n\nconst (\n\t// ASCII is the MIB identifier with IANA name US-ASCII (MIME: US-ASCII).\n\t//\n\t// ANSI X3.4-1986\n\t// Reference: RFC2046\n\tASCII MIB = 3\n\n\t// ISOLatin1 is the MIB identifier with IANA name ISO_8859-1:1987 (MIME: ISO-8859-1).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatin1 MIB = 4\n\n\t// ISOLatin2 is the MIB identifier with IANA name ISO_8859-2:1987 (MIME: ISO-8859-2).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatin2 MIB = 5\n\n\t// ISOLatin3 is the MIB identifier with IANA name ISO_8859-3:1988 (MIME: ISO-8859-3).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatin3 MIB = 6\n\n\t// ISOLatin4 is the MIB identifier with IANA name ISO_8859-4:1988 (MIME: ISO-8859-4).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatin4 MIB = 7\n\n\t// ISOLatinCyrillic is the MIB identifier with IANA name ISO_8859-5:1988 (MIME: ISO-8859-5).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatinCyrillic MIB = 8\n\n\t// ISOLatinArabic is the MIB identifier with IANA name ISO_8859-6:1987 (MIME: ISO-8859-6).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatinArabic MIB = 9\n\n\t// ISOLatinGreek is the MIB identifier with IANA name ISO_8859-7:1987 (MIME: ISO-8859-7).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1947\n\t// Reference: RFC1345\n\tISOLatinGreek MIB = 10\n\n\t// ISOLatinHebrew is the MIB identifier with IANA name ISO_8859-8:1988 (MIME: ISO-8859-8).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatinHebrew MIB = 11\n\n\t// ISOLatin5 is the MIB identifier with IANA name ISO_8859-9:1989 (MIME: ISO-8859-9).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatin5 MIB = 12\n\n\t// ISOLatin6 is the MIB identifier with IANA name ISO-8859-10 (MIME: ISO-8859-10).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOLatin6 MIB = 13\n\n\t// ISOTextComm is the MIB identifier with IANA name ISO_6937-2-add.\n\t//\n\t// ISO-IR: International Register of Escape Sequences and ISO 6937-2:1983\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISOTextComm MIB = 14\n\n\t// HalfWidthKatakana is the MIB identifier with IANA name JIS_X0201.\n\t//\n\t// JIS X 0201-1976.   One byte only, this is equivalent to\n\t// JIS/Roman (similar to ASCII) plus eight-bit half-width\n\t// Katakana\n\t// Reference: RFC1345\n\tHalfWidthKatakana MIB = 15\n\n\t// JISEncoding is the MIB identifier with IANA name JIS_Encoding.\n\t//\n\t// JIS X 0202-1991.  Uses ISO 2022 escape sequences to\n\t// shift code sets as documented in JIS X 0202-1991.\n\tJISEncoding MIB = 16\n\n\t// ShiftJIS is the MIB identifier with IANA name Shift_JIS (MIME: Shift_JIS).\n\t//\n\t// This charset is an extension of csHalfWidthKatakana by\n\t// adding graphic characters in JIS X 0208.  The CCS's are\n\t// JIS X0201:1997 and JIS X0208:1997.  The\n\t// complete definition is shown in Appendix 1 of JIS\n\t// X0208:1997.\n\t// This charset can be used for the top-level media type \"text\".\n\tShiftJIS MIB = 17\n\n\t// EUCPkdFmtJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Packed_Format_for_Japanese (MIME: EUC-JP).\n\t//\n\t// Standardized by OSF, UNIX International, and UNIX Systems\n\t// Laboratories Pacific.  Uses ISO 2022 rules to select\n\t// code set 0: US-ASCII (a single 7-bit byte set)\n\t// code set 1: JIS X0208-1990 (a double 8-bit byte set)\n\t// restricted to A0-FF in both bytes\n\t// code set 2: Half Width Katakana (a single 7-bit byte set)\n\t// requiring SS2 as the character prefix\n\t// code set 3: JIS X0212-1990 (a double 7-bit byte set)\n\t// restricted to A0-FF in both bytes\n\t// requiring SS3 as the character prefix\n\tEUCPkdFmtJapanese MIB = 18\n\n\t// EUCFixWidJapanese is the MIB identifier with IANA name Extended_UNIX_Code_Fixed_Width_for_Japanese.\n\t//\n\t// Used in Japan.  Each character is 2 octets.\n\t// code set 0: US-ASCII (a single 7-bit byte set)\n\t// 1st byte = 00\n\t// 2nd byte = 20-7E\n\t// code set 1: JIS X0208-1990 (a double 7-bit byte set)\n\t// restricted  to A0-FF in both bytes\n\t// code set 2: Half Width Katakana (a single 7-bit byte set)\n\t// 1st byte = 00\n\t// 2nd byte = A0-FF\n\t// code set 3: JIS X0212-1990 (a double 7-bit byte set)\n\t// restricted to A0-FF in\n\t// the first byte\n\t// and 21-7E in the second byte\n\tEUCFixWidJapanese MIB = 19\n\n\t// ISO4UnitedKingdom is the MIB identifier with IANA name BS_4730.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO4UnitedKingdom MIB = 20\n\n\t// ISO11SwedishForNames is the MIB identifier with IANA name SEN_850200_C.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO11SwedishForNames MIB = 21\n\n\t// ISO15Italian is the MIB identifier with IANA name IT.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO15Italian MIB = 22\n\n\t// ISO17Spanish is the MIB identifier with IANA name ES.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO17Spanish MIB = 23\n\n\t// ISO21German is the MIB identifier with IANA name DIN_66003.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO21German MIB = 24\n\n\t// ISO60Norwegian1 is the MIB identifier with IANA name NS_4551-1.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO60Norwegian1 MIB = 25\n\n\t// ISO69French is the MIB identifier with IANA name NF_Z_62-010.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO69French MIB = 26\n\n\t// ISO10646UTF1 is the MIB identifier with IANA name ISO-10646-UTF-1.\n\t//\n\t// Universal Transfer Format (1), this is the multibyte\n\t// encoding, that subsets ASCII-7. It does not have byte\n\t// ordering issues.\n\tISO10646UTF1 MIB = 27\n\n\t// ISO646basic1983 is the MIB identifier with IANA name ISO_646.basic:1983.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO646basic1983 MIB = 28\n\n\t// INVARIANT is the MIB identifier with IANA name INVARIANT.\n\t//\n\t// Reference: RFC1345\n\tINVARIANT MIB = 29\n\n\t// ISO2IntlRefVersion is the MIB identifier with IANA name ISO_646.irv:1983.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO2IntlRefVersion MIB = 30\n\n\t// NATSSEFI is the MIB identifier with IANA name NATS-SEFI.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tNATSSEFI MIB = 31\n\n\t// NATSSEFIADD is the MIB identifier with IANA name NATS-SEFI-ADD.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tNATSSEFIADD MIB = 32\n\n\t// NATSDANO is the MIB identifier with IANA name NATS-DANO.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tNATSDANO MIB = 33\n\n\t// NATSDANOADD is the MIB identifier with IANA name NATS-DANO-ADD.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tNATSDANOADD MIB = 34\n\n\t// ISO10Swedish is the MIB identifier with IANA name SEN_850200_B.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO10Swedish MIB = 35\n\n\t// KSC56011987 is the MIB identifier with IANA name KS_C_5601-1987.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tKSC56011987 MIB = 36\n\n\t// ISO2022KR is the MIB identifier with IANA name ISO-2022-KR (MIME: ISO-2022-KR).\n\t//\n\t// rfc1557 (see also KS_C_5601-1987)\n\t// Reference: RFC1557\n\tISO2022KR MIB = 37\n\n\t// EUCKR is the MIB identifier with IANA name EUC-KR (MIME: EUC-KR).\n\t//\n\t// rfc1557 (see also KS_C_5861-1992)\n\t// Reference: RFC1557\n\tEUCKR MIB = 38\n\n\t// ISO2022JP is the MIB identifier with IANA name ISO-2022-JP (MIME: ISO-2022-JP).\n\t//\n\t// rfc1468 (see also rfc2237 )\n\t// Reference: RFC1468\n\tISO2022JP MIB = 39\n\n\t// ISO2022JP2 is the MIB identifier with IANA name ISO-2022-JP-2 (MIME: ISO-2022-JP-2).\n\t//\n\t// rfc1554\n\t// Reference: RFC1554\n\tISO2022JP2 MIB = 40\n\n\t// ISO13JISC6220jp is the MIB identifier with IANA name JIS_C6220-1969-jp.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO13JISC6220jp MIB = 41\n\n\t// ISO14JISC6220ro is the MIB identifier with IANA name JIS_C6220-1969-ro.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO14JISC6220ro MIB = 42\n\n\t// ISO16Portuguese is the MIB identifier with IANA name PT.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO16Portuguese MIB = 43\n\n\t// ISO18Greek7Old is the MIB identifier with IANA name greek7-old.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO18Greek7Old MIB = 44\n\n\t// ISO19LatinGreek is the MIB identifier with IANA name latin-greek.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO19LatinGreek MIB = 45\n\n\t// ISO25French is the MIB identifier with IANA name NF_Z_62-010_(1973).\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO25French MIB = 46\n\n\t// ISO27LatinGreek1 is the MIB identifier with IANA name Latin-greek-1.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO27LatinGreek1 MIB = 47\n\n\t// ISO5427Cyrillic is the MIB identifier with IANA name ISO_5427.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO5427Cyrillic MIB = 48\n\n\t// ISO42JISC62261978 is the MIB identifier with IANA name JIS_C6226-1978.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO42JISC62261978 MIB = 49\n\n\t// ISO47BSViewdata is the MIB identifier with IANA name BS_viewdata.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO47BSViewdata MIB = 50\n\n\t// ISO49INIS is the MIB identifier with IANA name INIS.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO49INIS MIB = 51\n\n\t// ISO50INIS8 is the MIB identifier with IANA name INIS-8.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO50INIS8 MIB = 52\n\n\t// ISO51INISCyrillic is the MIB identifier with IANA name INIS-cyrillic.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO51INISCyrillic MIB = 53\n\n\t// ISO54271981 is the MIB identifier with IANA name ISO_5427:1981.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO54271981 MIB = 54\n\n\t// ISO5428Greek is the MIB identifier with IANA name ISO_5428:1980.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO5428Greek MIB = 55\n\n\t// ISO57GB1988 is the MIB identifier with IANA name GB_1988-80.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO57GB1988 MIB = 56\n\n\t// ISO58GB231280 is the MIB identifier with IANA name GB_2312-80.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO58GB231280 MIB = 57\n\n\t// ISO61Norwegian2 is the MIB identifier with IANA name NS_4551-2.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO61Norwegian2 MIB = 58\n\n\t// ISO70VideotexSupp1 is the MIB identifier with IANA name videotex-suppl.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO70VideotexSupp1 MIB = 59\n\n\t// ISO84Portuguese2 is the MIB identifier with IANA name PT2.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO84Portuguese2 MIB = 60\n\n\t// ISO85Spanish2 is the MIB identifier with IANA name ES2.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO85Spanish2 MIB = 61\n\n\t// ISO86Hungarian is the MIB identifier with IANA name MSZ_7795.3.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO86Hungarian MIB = 62\n\n\t// ISO87JISX0208 is the MIB identifier with IANA name JIS_C6226-1983.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO87JISX0208 MIB = 63\n\n\t// ISO88Greek7 is the MIB identifier with IANA name greek7.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO88Greek7 MIB = 64\n\n\t// ISO89ASMO449 is the MIB identifier with IANA name ASMO_449.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO89ASMO449 MIB = 65\n\n\t// ISO90 is the MIB identifier with IANA name iso-ir-90.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO90 MIB = 66\n\n\t// ISO91JISC62291984a is the MIB identifier with IANA name JIS_C6229-1984-a.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO91JISC62291984a MIB = 67\n\n\t// ISO92JISC62991984b is the MIB identifier with IANA name JIS_C6229-1984-b.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO92JISC62991984b MIB = 68\n\n\t// ISO93JIS62291984badd is the MIB identifier with IANA name JIS_C6229-1984-b-add.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO93JIS62291984badd MIB = 69\n\n\t// ISO94JIS62291984hand is the MIB identifier with IANA name JIS_C6229-1984-hand.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO94JIS62291984hand MIB = 70\n\n\t// ISO95JIS62291984handadd is the MIB identifier with IANA name JIS_C6229-1984-hand-add.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO95JIS62291984handadd MIB = 71\n\n\t// ISO96JISC62291984kana is the MIB identifier with IANA name JIS_C6229-1984-kana.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO96JISC62291984kana MIB = 72\n\n\t// ISO2033 is the MIB identifier with IANA name ISO_2033-1983.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO2033 MIB = 73\n\n\t// ISO99NAPLPS is the MIB identifier with IANA name ANSI_X3.110-1983.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO99NAPLPS MIB = 74\n\n\t// ISO102T617bit is the MIB identifier with IANA name T.61-7bit.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO102T617bit MIB = 75\n\n\t// ISO103T618bit is the MIB identifier with IANA name T.61-8bit.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO103T618bit MIB = 76\n\n\t// ISO111ECMACyrillic is the MIB identifier with IANA name ECMA-cyrillic.\n\t//\n\t// ISO registry\n\t// (formerly ECMA\n\t// registry )\n\tISO111ECMACyrillic MIB = 77\n\n\t// ISO121Canadian1 is the MIB identifier with IANA name CSA_Z243.4-1985-1.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO121Canadian1 MIB = 78\n\n\t// ISO122Canadian2 is the MIB identifier with IANA name CSA_Z243.4-1985-2.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO122Canadian2 MIB = 79\n\n\t// ISO123CSAZ24341985gr is the MIB identifier with IANA name CSA_Z243.4-1985-gr.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO123CSAZ24341985gr MIB = 80\n\n\t// ISO88596E is the MIB identifier with IANA name ISO_8859-6-E (MIME: ISO-8859-6-E).\n\t//\n\t// rfc1556\n\t// Reference: RFC1556\n\tISO88596E MIB = 81\n\n\t// ISO88596I is the MIB identifier with IANA name ISO_8859-6-I (MIME: ISO-8859-6-I).\n\t//\n\t// rfc1556\n\t// Reference: RFC1556\n\tISO88596I MIB = 82\n\n\t// ISO128T101G2 is the MIB identifier with IANA name T.101-G2.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO128T101G2 MIB = 83\n\n\t// ISO88598E is the MIB identifier with IANA name ISO_8859-8-E (MIME: ISO-8859-8-E).\n\t//\n\t// rfc1556\n\t// Reference: RFC1556\n\tISO88598E MIB = 84\n\n\t// ISO88598I is the MIB identifier with IANA name ISO_8859-8-I (MIME: ISO-8859-8-I).\n\t//\n\t// rfc1556\n\t// Reference: RFC1556\n\tISO88598I MIB = 85\n\n\t// ISO139CSN369103 is the MIB identifier with IANA name CSN_369103.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO139CSN369103 MIB = 86\n\n\t// ISO141JUSIB1002 is the MIB identifier with IANA name JUS_I.B1.002.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO141JUSIB1002 MIB = 87\n\n\t// ISO143IECP271 is the MIB identifier with IANA name IEC_P27-1.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO143IECP271 MIB = 88\n\n\t// ISO146Serbian is the MIB identifier with IANA name JUS_I.B1.003-serb.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO146Serbian MIB = 89\n\n\t// ISO147Macedonian is the MIB identifier with IANA name JUS_I.B1.003-mac.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO147Macedonian MIB = 90\n\n\t// ISO150GreekCCITT is the MIB identifier with IANA name greek-ccitt.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO150GreekCCITT MIB = 91\n\n\t// ISO151Cuba is the MIB identifier with IANA name NC_NC00-10:81.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO151Cuba MIB = 92\n\n\t// ISO6937Add is the MIB identifier with IANA name ISO_6937-2-25.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO6937Add MIB = 93\n\n\t// ISO153GOST1976874 is the MIB identifier with IANA name GOST_19768-74.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO153GOST1976874 MIB = 94\n\n\t// ISO8859Supp is the MIB identifier with IANA name ISO_8859-supp.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO8859Supp MIB = 95\n\n\t// ISO10367Box is the MIB identifier with IANA name ISO_10367-box.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO10367Box MIB = 96\n\n\t// ISO158Lap is the MIB identifier with IANA name latin-lap.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO158Lap MIB = 97\n\n\t// ISO159JISX02121990 is the MIB identifier with IANA name JIS_X0212-1990.\n\t//\n\t// ISO-IR: International Register of Escape Sequences\n\t// Note: The current registration authority is IPSJ/ITSCJ, Japan.\n\t// Reference: RFC1345\n\tISO159JISX02121990 MIB = 98\n\n\t// ISO646Danish is the MIB identifier with IANA name DS_2089.\n\t//\n\t// Danish Standard, DS 2089, February 1974\n\t// Reference: RFC1345\n\tISO646Danish MIB = 99\n\n\t// USDK is the MIB identifier with IANA name us-dk.\n\t//\n\t// Reference: RFC1345\n\tUSDK MIB = 100\n\n\t// DKUS is the MIB identifier with IANA name dk-us.\n\t//\n\t// Reference: RFC1345\n\tDKUS MIB = 101\n\n\t// KSC5636 is the MIB identifier with IANA name KSC5636.\n\t//\n\t// Reference: RFC1345\n\tKSC5636 MIB = 102\n\n\t// Unicode11UTF7 is the MIB identifier with IANA name UNICODE-1-1-UTF-7.\n\t//\n\t// rfc1642\n\t// Reference: RFC1642\n\tUnicode11UTF7 MIB = 103\n\n\t// ISO2022CN is the MIB identifier with IANA name ISO-2022-CN.\n\t//\n\t// rfc1922\n\t// Reference: RFC1922\n\tISO2022CN MIB = 104\n\n\t// ISO2022CNEXT is the MIB identifier with IANA name ISO-2022-CN-EXT.\n\t//\n\t// rfc1922\n\t// Reference: RFC1922\n\tISO2022CNEXT MIB = 105\n\n\t// UTF8 is the MIB identifier with IANA name UTF-8.\n\t//\n\t// rfc3629\n\t// Reference: RFC3629\n\tUTF8 MIB = 106\n\n\t// ISO885913 is the MIB identifier with IANA name ISO-8859-13.\n\t//\n\t// ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-13 http://www.iana.org/assignments/charset-reg/ISO-8859-13\n\tISO885913 MIB = 109\n\n\t// ISO885914 is the MIB identifier with IANA name ISO-8859-14.\n\t//\n\t// ISO See http://www.iana.org/assignments/charset-reg/ISO-8859-14\n\tISO885914 MIB = 110\n\n\t// ISO885915 is the MIB identifier with IANA name ISO-8859-15.\n\t//\n\t// ISO\n\t// Please see: http://www.iana.org/assignments/charset-reg/ISO-8859-15\n\tISO885915 MIB = 111\n\n\t// ISO885916 is the MIB identifier with IANA name ISO-8859-16.\n\t//\n\t// ISO\n\tISO885916 MIB = 112\n\n\t// GBK is the MIB identifier with IANA name GBK.\n\t//\n\t// Chinese IT Standardization Technical Committee\n\t// Please see: http://www.iana.org/assignments/charset-reg/GBK\n\tGBK MIB = 113\n\n\t// GB18030 is the MIB identifier with IANA name GB18030.\n\t//\n\t// Chinese IT Standardization Technical Committee\n\t// Please see: http://www.iana.org/assignments/charset-reg/GB18030\n\tGB18030 MIB = 114\n\n\t// OSDEBCDICDF0415 is the MIB identifier with IANA name OSD_EBCDIC_DF04_15.\n\t//\n\t// Fujitsu-Siemens standard mainframe EBCDIC encoding\n\t// Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15\n\tOSDEBCDICDF0415 MIB = 115\n\n\t// OSDEBCDICDF03IRV is the MIB identifier with IANA name OSD_EBCDIC_DF03_IRV.\n\t//\n\t// Fujitsu-Siemens standard mainframe EBCDIC encoding\n\t// Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV\n\tOSDEBCDICDF03IRV MIB = 116\n\n\t// OSDEBCDICDF041 is the MIB identifier with IANA name OSD_EBCDIC_DF04_1.\n\t//\n\t// Fujitsu-Siemens standard mainframe EBCDIC encoding\n\t// Please see: http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1\n\tOSDEBCDICDF041 MIB = 117\n\n\t// ISO115481 is the MIB identifier with IANA name ISO-11548-1.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/ISO-11548-1\n\tISO115481 MIB = 118\n\n\t// KZ1048 is the MIB identifier with IANA name KZ-1048.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/KZ-1048\n\tKZ1048 MIB = 119\n\n\t// Unicode is the MIB identifier with IANA name ISO-10646-UCS-2.\n\t//\n\t// the 2-octet Basic Multilingual Plane, aka Unicode\n\t// this needs to specify network byte order: the standard\n\t// does not specify (it is a 16-bit integer space)\n\tUnicode MIB = 1000\n\n\t// UCS4 is the MIB identifier with IANA name ISO-10646-UCS-4.\n\t//\n\t// the full code space. (same comment about byte order,\n\t// these are 31-bit numbers.\n\tUCS4 MIB = 1001\n\n\t// UnicodeASCII is the MIB identifier with IANA name ISO-10646-UCS-Basic.\n\t//\n\t// ASCII subset of Unicode.  Basic Latin = collection 1\n\t// See ISO 10646, Appendix A\n\tUnicodeASCII MIB = 1002\n\n\t// UnicodeLatin1 is the MIB identifier with IANA name ISO-10646-Unicode-Latin1.\n\t//\n\t// ISO Latin-1 subset of Unicode. Basic Latin and Latin-1\n\t// Supplement  = collections 1 and 2.  See ISO 10646,\n\t// Appendix A.  See rfc1815 .\n\tUnicodeLatin1 MIB = 1003\n\n\t// UnicodeJapanese is the MIB identifier with IANA name ISO-10646-J-1.\n\t//\n\t// ISO 10646 Japanese, see rfc1815 .\n\tUnicodeJapanese MIB = 1004\n\n\t// UnicodeIBM1261 is the MIB identifier with IANA name ISO-Unicode-IBM-1261.\n\t//\n\t// IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261\n\tUnicodeIBM1261 MIB = 1005\n\n\t// UnicodeIBM1268 is the MIB identifier with IANA name ISO-Unicode-IBM-1268.\n\t//\n\t// IBM Latin-4 Extended Presentation Set, GCSGID: 1268\n\tUnicodeIBM1268 MIB = 1006\n\n\t// UnicodeIBM1276 is the MIB identifier with IANA name ISO-Unicode-IBM-1276.\n\t//\n\t// IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276\n\tUnicodeIBM1276 MIB = 1007\n\n\t// UnicodeIBM1264 is the MIB identifier with IANA name ISO-Unicode-IBM-1264.\n\t//\n\t// IBM Arabic Presentation Set, GCSGID: 1264\n\tUnicodeIBM1264 MIB = 1008\n\n\t// UnicodeIBM1265 is the MIB identifier with IANA name ISO-Unicode-IBM-1265.\n\t//\n\t// IBM Hebrew Presentation Set, GCSGID: 1265\n\tUnicodeIBM1265 MIB = 1009\n\n\t// Unicode11 is the MIB identifier with IANA name UNICODE-1-1.\n\t//\n\t// rfc1641\n\t// Reference: RFC1641\n\tUnicode11 MIB = 1010\n\n\t// SCSU is the MIB identifier with IANA name SCSU.\n\t//\n\t// SCSU See http://www.iana.org/assignments/charset-reg/SCSU\n\tSCSU MIB = 1011\n\n\t// UTF7 is the MIB identifier with IANA name UTF-7.\n\t//\n\t// rfc2152\n\t// Reference: RFC2152\n\tUTF7 MIB = 1012\n\n\t// UTF16BE is the MIB identifier with IANA name UTF-16BE.\n\t//\n\t// rfc2781\n\t// Reference: RFC2781\n\tUTF16BE MIB = 1013\n\n\t// UTF16LE is the MIB identifier with IANA name UTF-16LE.\n\t//\n\t// rfc2781\n\t// Reference: RFC2781\n\tUTF16LE MIB = 1014\n\n\t// UTF16 is the MIB identifier with IANA name UTF-16.\n\t//\n\t// rfc2781\n\t// Reference: RFC2781\n\tUTF16 MIB = 1015\n\n\t// CESU8 is the MIB identifier with IANA name CESU-8.\n\t//\n\t// http://www.unicode.org/unicode/reports/tr26\n\tCESU8 MIB = 1016\n\n\t// UTF32 is the MIB identifier with IANA name UTF-32.\n\t//\n\t// http://www.unicode.org/unicode/reports/tr19/\n\tUTF32 MIB = 1017\n\n\t// UTF32BE is the MIB identifier with IANA name UTF-32BE.\n\t//\n\t// http://www.unicode.org/unicode/reports/tr19/\n\tUTF32BE MIB = 1018\n\n\t// UTF32LE is the MIB identifier with IANA name UTF-32LE.\n\t//\n\t// http://www.unicode.org/unicode/reports/tr19/\n\tUTF32LE MIB = 1019\n\n\t// BOCU1 is the MIB identifier with IANA name BOCU-1.\n\t//\n\t// http://www.unicode.org/notes/tn6/\n\tBOCU1 MIB = 1020\n\n\t// Windows30Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.0-Latin-1.\n\t//\n\t// Extended ISO 8859-1 Latin-1 for Windows 3.0.\n\t// PCL Symbol Set id: 9U\n\tWindows30Latin1 MIB = 2000\n\n\t// Windows31Latin1 is the MIB identifier with IANA name ISO-8859-1-Windows-3.1-Latin-1.\n\t//\n\t// Extended ISO 8859-1 Latin-1 for Windows 3.1.\n\t// PCL Symbol Set id: 19U\n\tWindows31Latin1 MIB = 2001\n\n\t// Windows31Latin2 is the MIB identifier with IANA name ISO-8859-2-Windows-Latin-2.\n\t//\n\t// Extended ISO 8859-2.  Latin-2 for Windows 3.1.\n\t// PCL Symbol Set id: 9E\n\tWindows31Latin2 MIB = 2002\n\n\t// Windows31Latin5 is the MIB identifier with IANA name ISO-8859-9-Windows-Latin-5.\n\t//\n\t// Extended ISO 8859-9.  Latin-5 for Windows 3.1\n\t// PCL Symbol Set id: 5T\n\tWindows31Latin5 MIB = 2003\n\n\t// HPRoman8 is the MIB identifier with IANA name hp-roman8.\n\t//\n\t// LaserJet IIP Printer User's Manual,\n\t// HP part no 33471-90901, Hewlet-Packard, June 1989.\n\t// Reference: RFC1345\n\tHPRoman8 MIB = 2004\n\n\t// AdobeStandardEncoding is the MIB identifier with IANA name Adobe-Standard-Encoding.\n\t//\n\t// PostScript Language Reference Manual\n\t// PCL Symbol Set id: 10J\n\tAdobeStandardEncoding MIB = 2005\n\n\t// VenturaUS is the MIB identifier with IANA name Ventura-US.\n\t//\n\t// Ventura US.  ASCII plus characters typically used in\n\t// publishing, like pilcrow, copyright, registered, trade mark,\n\t// section, dagger, and double dagger in the range A0 (hex)\n\t// to FF (hex).\n\t// PCL Symbol Set id: 14J\n\tVenturaUS MIB = 2006\n\n\t// VenturaInternational is the MIB identifier with IANA name Ventura-International.\n\t//\n\t// Ventura International.  ASCII plus coded characters similar\n\t// to Roman8.\n\t// PCL Symbol Set id: 13J\n\tVenturaInternational MIB = 2007\n\n\t// DECMCS is the MIB identifier with IANA name DEC-MCS.\n\t//\n\t// VAX/VMS User's Manual,\n\t// Order Number: AI-Y517A-TE, April 1986.\n\t// Reference: RFC1345\n\tDECMCS MIB = 2008\n\n\t// PC850Multilingual is the MIB identifier with IANA name IBM850.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tPC850Multilingual MIB = 2009\n\n\t// PC8DanishNorwegian is the MIB identifier with IANA name PC8-Danish-Norwegian.\n\t//\n\t// PC Danish Norwegian\n\t// 8-bit PC set for Danish Norwegian\n\t// PCL Symbol Set id: 11U\n\tPC8DanishNorwegian MIB = 2012\n\n\t// PC862LatinHebrew is the MIB identifier with IANA name IBM862.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tPC862LatinHebrew MIB = 2013\n\n\t// PC8Turkish is the MIB identifier with IANA name PC8-Turkish.\n\t//\n\t// PC Latin Turkish.  PCL Symbol Set id: 9T\n\tPC8Turkish MIB = 2014\n\n\t// IBMSymbols is the MIB identifier with IANA name IBM-Symbols.\n\t//\n\t// Presentation Set, CPGID: 259\n\tIBMSymbols MIB = 2015\n\n\t// IBMThai is the MIB identifier with IANA name IBM-Thai.\n\t//\n\t// Presentation Set, CPGID: 838\n\tIBMThai MIB = 2016\n\n\t// HPLegal is the MIB identifier with IANA name HP-Legal.\n\t//\n\t// PCL 5 Comparison Guide, Hewlett-Packard,\n\t// HP part number 5961-0510, October 1992\n\t// PCL Symbol Set id: 1U\n\tHPLegal MIB = 2017\n\n\t// HPPiFont is the MIB identifier with IANA name HP-Pi-font.\n\t//\n\t// PCL 5 Comparison Guide, Hewlett-Packard,\n\t// HP part number 5961-0510, October 1992\n\t// PCL Symbol Set id: 15U\n\tHPPiFont MIB = 2018\n\n\t// HPMath8 is the MIB identifier with IANA name HP-Math8.\n\t//\n\t// PCL 5 Comparison Guide, Hewlett-Packard,\n\t// HP part number 5961-0510, October 1992\n\t// PCL Symbol Set id: 8M\n\tHPMath8 MIB = 2019\n\n\t// HPPSMath is the MIB identifier with IANA name Adobe-Symbol-Encoding.\n\t//\n\t// PostScript Language Reference Manual\n\t// PCL Symbol Set id: 5M\n\tHPPSMath MIB = 2020\n\n\t// HPDesktop is the MIB identifier with IANA name HP-DeskTop.\n\t//\n\t// PCL 5 Comparison Guide, Hewlett-Packard,\n\t// HP part number 5961-0510, October 1992\n\t// PCL Symbol Set id: 7J\n\tHPDesktop MIB = 2021\n\n\t// VenturaMath is the MIB identifier with IANA name Ventura-Math.\n\t//\n\t// PCL 5 Comparison Guide, Hewlett-Packard,\n\t// HP part number 5961-0510, October 1992\n\t// PCL Symbol Set id: 6M\n\tVenturaMath MIB = 2022\n\n\t// MicrosoftPublishing is the MIB identifier with IANA name Microsoft-Publishing.\n\t//\n\t// PCL 5 Comparison Guide, Hewlett-Packard,\n\t// HP part number 5961-0510, October 1992\n\t// PCL Symbol Set id: 6J\n\tMicrosoftPublishing MIB = 2023\n\n\t// Windows31J is the MIB identifier with IANA name Windows-31J.\n\t//\n\t// Windows Japanese.  A further extension of Shift_JIS\n\t// to include NEC special characters (Row 13), NEC\n\t// selection of IBM extensions (Rows 89 to 92), and IBM\n\t// extensions (Rows 115 to 119).  The CCS's are\n\t// JIS X0201:1997, JIS X0208:1997, and these extensions.\n\t// This charset can be used for the top-level media type \"text\",\n\t// but it is of limited or specialized use (see rfc2278 ).\n\t// PCL Symbol Set id: 19K\n\tWindows31J MIB = 2024\n\n\t// GB2312 is the MIB identifier with IANA name GB2312 (MIME: GB2312).\n\t//\n\t// Chinese for People's Republic of China (PRC) mixed one byte,\n\t// two byte set:\n\t// 20-7E = one byte ASCII\n\t// A1-FE = two byte PRC Kanji\n\t// See GB 2312-80\n\t// PCL Symbol Set Id: 18C\n\tGB2312 MIB = 2025\n\n\t// Big5 is the MIB identifier with IANA name Big5 (MIME: Big5).\n\t//\n\t// Chinese for Taiwan Multi-byte set.\n\t// PCL Symbol Set Id: 18T\n\tBig5 MIB = 2026\n\n\t// Macintosh is the MIB identifier with IANA name macintosh.\n\t//\n\t// The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991\n\t// Reference: RFC1345\n\tMacintosh MIB = 2027\n\n\t// IBM037 is the MIB identifier with IANA name IBM037.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM037 MIB = 2028\n\n\t// IBM038 is the MIB identifier with IANA name IBM038.\n\t//\n\t// IBM 3174 Character Set Ref, GA27-3831-02, March 1990\n\t// Reference: RFC1345\n\tIBM038 MIB = 2029\n\n\t// IBM273 is the MIB identifier with IANA name IBM273.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM273 MIB = 2030\n\n\t// IBM274 is the MIB identifier with IANA name IBM274.\n\t//\n\t// IBM 3174 Character Set Ref, GA27-3831-02, March 1990\n\t// Reference: RFC1345\n\tIBM274 MIB = 2031\n\n\t// IBM275 is the MIB identifier with IANA name IBM275.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM275 MIB = 2032\n\n\t// IBM277 is the MIB identifier with IANA name IBM277.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM277 MIB = 2033\n\n\t// IBM278 is the MIB identifier with IANA name IBM278.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM278 MIB = 2034\n\n\t// IBM280 is the MIB identifier with IANA name IBM280.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM280 MIB = 2035\n\n\t// IBM281 is the MIB identifier with IANA name IBM281.\n\t//\n\t// IBM 3174 Character Set Ref, GA27-3831-02, March 1990\n\t// Reference: RFC1345\n\tIBM281 MIB = 2036\n\n\t// IBM284 is the MIB identifier with IANA name IBM284.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM284 MIB = 2037\n\n\t// IBM285 is the MIB identifier with IANA name IBM285.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM285 MIB = 2038\n\n\t// IBM290 is the MIB identifier with IANA name IBM290.\n\t//\n\t// IBM 3174 Character Set Ref, GA27-3831-02, March 1990\n\t// Reference: RFC1345\n\tIBM290 MIB = 2039\n\n\t// IBM297 is the MIB identifier with IANA name IBM297.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM297 MIB = 2040\n\n\t// IBM420 is the MIB identifier with IANA name IBM420.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990,\n\t// IBM NLS RM p 11-11\n\t// Reference: RFC1345\n\tIBM420 MIB = 2041\n\n\t// IBM423 is the MIB identifier with IANA name IBM423.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM423 MIB = 2042\n\n\t// IBM424 is the MIB identifier with IANA name IBM424.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM424 MIB = 2043\n\n\t// PC8CodePage437 is the MIB identifier with IANA name IBM437.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tPC8CodePage437 MIB = 2011\n\n\t// IBM500 is the MIB identifier with IANA name IBM500.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM500 MIB = 2044\n\n\t// IBM851 is the MIB identifier with IANA name IBM851.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM851 MIB = 2045\n\n\t// PCp852 is the MIB identifier with IANA name IBM852.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tPCp852 MIB = 2010\n\n\t// IBM855 is the MIB identifier with IANA name IBM855.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM855 MIB = 2046\n\n\t// IBM857 is the MIB identifier with IANA name IBM857.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM857 MIB = 2047\n\n\t// IBM860 is the MIB identifier with IANA name IBM860.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM860 MIB = 2048\n\n\t// IBM861 is the MIB identifier with IANA name IBM861.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM861 MIB = 2049\n\n\t// IBM863 is the MIB identifier with IANA name IBM863.\n\t//\n\t// IBM Keyboard layouts and code pages, PN 07G4586 June 1991\n\t// Reference: RFC1345\n\tIBM863 MIB = 2050\n\n\t// IBM864 is the MIB identifier with IANA name IBM864.\n\t//\n\t// IBM Keyboard layouts and code pages, PN 07G4586 June 1991\n\t// Reference: RFC1345\n\tIBM864 MIB = 2051\n\n\t// IBM865 is the MIB identifier with IANA name IBM865.\n\t//\n\t// IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)\n\t// Reference: RFC1345\n\tIBM865 MIB = 2052\n\n\t// IBM868 is the MIB identifier with IANA name IBM868.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM868 MIB = 2053\n\n\t// IBM869 is the MIB identifier with IANA name IBM869.\n\t//\n\t// IBM Keyboard layouts and code pages, PN 07G4586 June 1991\n\t// Reference: RFC1345\n\tIBM869 MIB = 2054\n\n\t// IBM870 is the MIB identifier with IANA name IBM870.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM870 MIB = 2055\n\n\t// IBM871 is the MIB identifier with IANA name IBM871.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM871 MIB = 2056\n\n\t// IBM880 is the MIB identifier with IANA name IBM880.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM880 MIB = 2057\n\n\t// IBM891 is the MIB identifier with IANA name IBM891.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM891 MIB = 2058\n\n\t// IBM903 is the MIB identifier with IANA name IBM903.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM903 MIB = 2059\n\n\t// IBBM904 is the MIB identifier with IANA name IBM904.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBBM904 MIB = 2060\n\n\t// IBM905 is the MIB identifier with IANA name IBM905.\n\t//\n\t// IBM 3174 Character Set Ref, GA27-3831-02, March 1990\n\t// Reference: RFC1345\n\tIBM905 MIB = 2061\n\n\t// IBM918 is the MIB identifier with IANA name IBM918.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM918 MIB = 2062\n\n\t// IBM1026 is the MIB identifier with IANA name IBM1026.\n\t//\n\t// IBM NLS RM Vol2 SE09-8002-01, March 1990\n\t// Reference: RFC1345\n\tIBM1026 MIB = 2063\n\n\t// IBMEBCDICATDE is the MIB identifier with IANA name EBCDIC-AT-DE.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tIBMEBCDICATDE MIB = 2064\n\n\t// EBCDICATDEA is the MIB identifier with IANA name EBCDIC-AT-DE-A.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICATDEA MIB = 2065\n\n\t// EBCDICCAFR is the MIB identifier with IANA name EBCDIC-CA-FR.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICCAFR MIB = 2066\n\n\t// EBCDICDKNO is the MIB identifier with IANA name EBCDIC-DK-NO.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICDKNO MIB = 2067\n\n\t// EBCDICDKNOA is the MIB identifier with IANA name EBCDIC-DK-NO-A.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICDKNOA MIB = 2068\n\n\t// EBCDICFISE is the MIB identifier with IANA name EBCDIC-FI-SE.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICFISE MIB = 2069\n\n\t// EBCDICFISEA is the MIB identifier with IANA name EBCDIC-FI-SE-A.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICFISEA MIB = 2070\n\n\t// EBCDICFR is the MIB identifier with IANA name EBCDIC-FR.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICFR MIB = 2071\n\n\t// EBCDICIT is the MIB identifier with IANA name EBCDIC-IT.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICIT MIB = 2072\n\n\t// EBCDICPT is the MIB identifier with IANA name EBCDIC-PT.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICPT MIB = 2073\n\n\t// EBCDICES is the MIB identifier with IANA name EBCDIC-ES.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICES MIB = 2074\n\n\t// EBCDICESA is the MIB identifier with IANA name EBCDIC-ES-A.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICESA MIB = 2075\n\n\t// EBCDICESS is the MIB identifier with IANA name EBCDIC-ES-S.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICESS MIB = 2076\n\n\t// EBCDICUK is the MIB identifier with IANA name EBCDIC-UK.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICUK MIB = 2077\n\n\t// EBCDICUS is the MIB identifier with IANA name EBCDIC-US.\n\t//\n\t// IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987\n\t// Reference: RFC1345\n\tEBCDICUS MIB = 2078\n\n\t// Unknown8BiT is the MIB identifier with IANA name UNKNOWN-8BIT.\n\t//\n\t// Reference: RFC1428\n\tUnknown8BiT MIB = 2079\n\n\t// Mnemonic is the MIB identifier with IANA name MNEMONIC.\n\t//\n\t// rfc1345 , also known as \"mnemonic+ascii+38\"\n\t// Reference: RFC1345\n\tMnemonic MIB = 2080\n\n\t// Mnem is the MIB identifier with IANA name MNEM.\n\t//\n\t// rfc1345 , also known as \"mnemonic+ascii+8200\"\n\t// Reference: RFC1345\n\tMnem MIB = 2081\n\n\t// VISCII is the MIB identifier with IANA name VISCII.\n\t//\n\t// rfc1456\n\t// Reference: RFC1456\n\tVISCII MIB = 2082\n\n\t// VIQR is the MIB identifier with IANA name VIQR.\n\t//\n\t// rfc1456\n\t// Reference: RFC1456\n\tVIQR MIB = 2083\n\n\t// KOI8R is the MIB identifier with IANA name KOI8-R (MIME: KOI8-R).\n\t//\n\t// rfc1489 , based on GOST-19768-74, ISO-6937/8,\n\t// INIS-Cyrillic, ISO-5427.\n\t// Reference: RFC1489\n\tKOI8R MIB = 2084\n\n\t// HZGB2312 is the MIB identifier with IANA name HZ-GB-2312.\n\t//\n\t// rfc1842 , rfc1843 rfc1843 rfc1842\n\tHZGB2312 MIB = 2085\n\n\t// IBM866 is the MIB identifier with IANA name IBM866.\n\t//\n\t// IBM NLDG Volume 2 (SE09-8002-03) August 1994\n\tIBM866 MIB = 2086\n\n\t// PC775Baltic is the MIB identifier with IANA name IBM775.\n\t//\n\t// HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996\n\tPC775Baltic MIB = 2087\n\n\t// KOI8U is the MIB identifier with IANA name KOI8-U.\n\t//\n\t// rfc2319\n\t// Reference: RFC2319\n\tKOI8U MIB = 2088\n\n\t// IBM00858 is the MIB identifier with IANA name IBM00858.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM00858\n\tIBM00858 MIB = 2089\n\n\t// IBM00924 is the MIB identifier with IANA name IBM00924.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM00924\n\tIBM00924 MIB = 2090\n\n\t// IBM01140 is the MIB identifier with IANA name IBM01140.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01140\n\tIBM01140 MIB = 2091\n\n\t// IBM01141 is the MIB identifier with IANA name IBM01141.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01141\n\tIBM01141 MIB = 2092\n\n\t// IBM01142 is the MIB identifier with IANA name IBM01142.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01142\n\tIBM01142 MIB = 2093\n\n\t// IBM01143 is the MIB identifier with IANA name IBM01143.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01143\n\tIBM01143 MIB = 2094\n\n\t// IBM01144 is the MIB identifier with IANA name IBM01144.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01144\n\tIBM01144 MIB = 2095\n\n\t// IBM01145 is the MIB identifier with IANA name IBM01145.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01145\n\tIBM01145 MIB = 2096\n\n\t// IBM01146 is the MIB identifier with IANA name IBM01146.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01146\n\tIBM01146 MIB = 2097\n\n\t// IBM01147 is the MIB identifier with IANA name IBM01147.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01147\n\tIBM01147 MIB = 2098\n\n\t// IBM01148 is the MIB identifier with IANA name IBM01148.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01148\n\tIBM01148 MIB = 2099\n\n\t// IBM01149 is the MIB identifier with IANA name IBM01149.\n\t//\n\t// IBM See http://www.iana.org/assignments/charset-reg/IBM01149\n\tIBM01149 MIB = 2100\n\n\t// Big5HKSCS is the MIB identifier with IANA name Big5-HKSCS.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/Big5-HKSCS\n\tBig5HKSCS MIB = 2101\n\n\t// IBM1047 is the MIB identifier with IANA name IBM1047.\n\t//\n\t// IBM1047 (EBCDIC Latin 1/Open Systems) http://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf\n\tIBM1047 MIB = 2102\n\n\t// PTCP154 is the MIB identifier with IANA name PTCP154.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/PTCP154\n\tPTCP154 MIB = 2103\n\n\t// Amiga1251 is the MIB identifier with IANA name Amiga-1251.\n\t//\n\t// See http://www.amiga.ultranet.ru/Amiga-1251.html\n\tAmiga1251 MIB = 2104\n\n\t// KOI7switched is the MIB identifier with IANA name KOI7-switched.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/KOI7-switched\n\tKOI7switched MIB = 2105\n\n\t// BRF is the MIB identifier with IANA name BRF.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/BRF\n\tBRF MIB = 2106\n\n\t// TSCII is the MIB identifier with IANA name TSCII.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/TSCII\n\tTSCII MIB = 2107\n\n\t// CP51932 is the MIB identifier with IANA name CP51932.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/CP51932\n\tCP51932 MIB = 2108\n\n\t// Windows874 is the MIB identifier with IANA name windows-874.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/windows-874\n\tWindows874 MIB = 2109\n\n\t// Windows1250 is the MIB identifier with IANA name windows-1250.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1250\n\tWindows1250 MIB = 2250\n\n\t// Windows1251 is the MIB identifier with IANA name windows-1251.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1251\n\tWindows1251 MIB = 2251\n\n\t// Windows1252 is the MIB identifier with IANA name windows-1252.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1252\n\tWindows1252 MIB = 2252\n\n\t// Windows1253 is the MIB identifier with IANA name windows-1253.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1253\n\tWindows1253 MIB = 2253\n\n\t// Windows1254 is the MIB identifier with IANA name windows-1254.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1254\n\tWindows1254 MIB = 2254\n\n\t// Windows1255 is the MIB identifier with IANA name windows-1255.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1255\n\tWindows1255 MIB = 2255\n\n\t// Windows1256 is the MIB identifier with IANA name windows-1256.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1256\n\tWindows1256 MIB = 2256\n\n\t// Windows1257 is the MIB identifier with IANA name windows-1257.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1257\n\tWindows1257 MIB = 2257\n\n\t// Windows1258 is the MIB identifier with IANA name windows-1258.\n\t//\n\t// Microsoft http://www.iana.org/assignments/charset-reg/windows-1258\n\tWindows1258 MIB = 2258\n\n\t// TIS620 is the MIB identifier with IANA name TIS-620.\n\t//\n\t// Thai Industrial Standards Institute (TISI)\n\tTIS620 MIB = 2259\n\n\t// CP50220 is the MIB identifier with IANA name CP50220.\n\t//\n\t// See http://www.iana.org/assignments/charset-reg/CP50220\n\tCP50220 MIB = 2260\n)\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/internal/internal.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package internal contains code that is shared among encoding implementations.\npackage internal\n\nimport (\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// Encoding is an implementation of the Encoding interface that adds the String\n// and ID methods to an existing encoding.\ntype Encoding struct {\n\tencoding.Encoding\n\tName string\n\tMIB  identifier.MIB\n}\n\n// _ verifies that Encoding implements identifier.Interface.\nvar _ identifier.Interface = (*Encoding)(nil)\n\nfunc (e *Encoding) String() string {\n\treturn e.Name\n}\n\nfunc (e *Encoding) ID() (mib identifier.MIB, other string) {\n\treturn e.MIB, \"\"\n}\n\n// SimpleEncoding is an Encoding that combines two Transformers.\ntype SimpleEncoding struct {\n\tDecoder transform.Transformer\n\tEncoder transform.Transformer\n}\n\nfunc (e *SimpleEncoding) NewDecoder() *encoding.Decoder {\n\treturn &encoding.Decoder{Transformer: e.Decoder}\n}\n\nfunc (e *SimpleEncoding) NewEncoder() *encoding.Encoder {\n\treturn &encoding.Encoder{Transformer: e.Encoder}\n}\n\n// FuncEncoding is an Encoding that combines two functions returning a new\n// Transformer.\ntype FuncEncoding struct {\n\tDecoder func() transform.Transformer\n\tEncoder func() transform.Transformer\n}\n\nfunc (e FuncEncoding) NewDecoder() *encoding.Decoder {\n\treturn &encoding.Decoder{Transformer: e.Decoder()}\n}\n\nfunc (e FuncEncoding) NewEncoder() *encoding.Encoder {\n\treturn &encoding.Encoder{Transformer: e.Encoder()}\n}\n\n// A RepertoireError indicates a rune is not in the repertoire of a destination\n// encoding. It is associated with an encoding-specific suggested replacement\n// byte.\ntype RepertoireError byte\n\n// Error implements the error interrface.\nfunc (r RepertoireError) Error() string {\n\treturn \"encoding: rune not supported by encoding.\"\n}\n\n// Replacement returns the replacement string associated with this error.\nfunc (r RepertoireError) Replacement() byte { return byte(r) }\n\nvar ErrASCIIReplacement = RepertoireError(encoding.ASCIISub)\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/japanese/all.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage japanese\n\nimport (\n\t\"golang.org/x/text/encoding\"\n)\n\n// All is a list of all defined encodings in this package.\nvar All = []encoding.Encoding{EUCJP, ISO2022JP, ShiftJIS}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/japanese/eucjp.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage japanese\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// EUCJP is the EUC-JP encoding.\nvar EUCJP encoding.Encoding = &eucJP\n\nvar eucJP = internal.Encoding{\n\t&internal.SimpleEncoding{eucJPDecoder{}, eucJPEncoder{}},\n\t\"EUC-JP\",\n\tidentifier.EUCPkdFmtJapanese,\n}\n\nvar errInvalidEUCJP = errors.New(\"japanese: invalid EUC-JP encoding\")\n\ntype eucJPDecoder struct{ transform.NopResetter }\n\nfunc (eucJPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tswitch c0 := src[nSrc]; {\n\t\tcase c0 < utf8.RuneSelf:\n\t\t\tr, size = rune(c0), 1\n\n\t\tcase c0 == 0x8e:\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tif c1 < 0xa1 || 0xdf < c1 {\n\t\t\t\terr = errInvalidEUCJP\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tr, size = rune(c1)+(0xff61-0xa1), 2\n\n\t\tcase c0 == 0x8f:\n\t\t\tif nSrc+2 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tif c1 < 0xa1 || 0xfe < c1 {\n\t\t\t\terr = errInvalidEUCJP\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc2 := src[nSrc+2]\n\t\t\tif c2 < 0xa1 || 0xfe < c2 {\n\t\t\t\terr = errInvalidEUCJP\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tr, size = '\\ufffd', 3\n\t\t\tif i := int(c1-0xa1)*94 + int(c2-0xa1); i < len(jis0212Decode) {\n\t\t\t\tr = rune(jis0212Decode[i])\n\t\t\t\tif r == 0 {\n\t\t\t\t\tr = '\\ufffd'\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase 0xa1 <= c0 && c0 <= 0xfe:\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tif c1 < 0xa1 || 0xfe < c1 {\n\t\t\t\terr = errInvalidEUCJP\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tr, size = '\\ufffd', 2\n\t\t\tif i := int(c0-0xa1)*94 + int(c1-0xa1); i < len(jis0208Decode) {\n\t\t\t\tr = rune(jis0208Decode[i])\n\t\t\t\tif r == 0 {\n\t\t\t\t\tr = '\\ufffd'\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\terr = errInvalidEUCJP\n\t\t\tbreak loop\n\t\t}\n\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t}\n\tif atEOF && err == transform.ErrShortSrc {\n\t\terr = errInvalidEUCJP\n\t}\n\treturn nDst, nSrc, err\n}\n\ntype eucJPEncoder struct{ transform.NopResetter }\n\nfunc (eucJPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// func init checks that the switch covers all tables.\n\t\t\tswitch {\n\t\t\tcase encode0Low <= r && r < encode0High:\n\t\t\t\tif r = rune(encode0[r-encode0Low]); r != 0 {\n\t\t\t\t\tgoto write2or3\n\t\t\t\t}\n\t\t\tcase encode1Low <= r && r < encode1High:\n\t\t\t\tif r = rune(encode1[r-encode1Low]); r != 0 {\n\t\t\t\t\tgoto write2or3\n\t\t\t\t}\n\t\t\tcase encode2Low <= r && r < encode2High:\n\t\t\t\tif r = rune(encode2[r-encode2Low]); r != 0 {\n\t\t\t\t\tgoto write2or3\n\t\t\t\t}\n\t\t\tcase encode3Low <= r && r < encode3High:\n\t\t\t\tif r = rune(encode3[r-encode3Low]); r != 0 {\n\t\t\t\t\tgoto write2or3\n\t\t\t\t}\n\t\t\tcase encode4Low <= r && r < encode4High:\n\t\t\t\tif r = rune(encode4[r-encode4Low]); r != 0 {\n\t\t\t\t\tgoto write2or3\n\t\t\t\t}\n\t\t\tcase encode5Low <= r && r < encode5High:\n\t\t\t\tif 0xff61 <= r && r < 0xffa0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\t\tif r = rune(encode5[r-encode5Low]); r != 0 {\n\t\t\t\t\tgoto write2or3\n\t\t\t\t}\n\t\t\t}\n\t\t\terr = internal.ErrASCIIReplacement\n\t\t\tbreak\n\t\t}\n\n\t\tif nDst >= len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst] = uint8(r)\n\t\tnDst++\n\t\tcontinue\n\n\twrite2or3:\n\t\tif r>>tableShift == jis0208 {\n\t\t\tif nDst+2 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t} else {\n\t\t\tif nDst+3 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst] = 0x8f\n\t\t\tnDst++\n\t\t}\n\t\tdst[nDst+0] = 0xa1 + uint8(r>>codeShift)&codeMask\n\t\tdst[nDst+1] = 0xa1 + uint8(r)&codeMask\n\t\tnDst += 2\n\t\tcontinue\n\n\twrite2:\n\t\tif nDst+2 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+0] = 0x8e\n\t\tdst[nDst+1] = uint8(r - (0xff61 - 0xa1))\n\t\tnDst += 2\n\t\tcontinue\n\t}\n\treturn nDst, nSrc, err\n}\n\nfunc init() {\n\t// Check that the hard-coded encode switch covers all tables.\n\tif numEncodeTables != 6 {\n\t\tpanic(\"bad numEncodeTables\")\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/japanese/iso2022jp.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage japanese\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// ISO2022JP is the ISO-2022-JP encoding.\nvar ISO2022JP encoding.Encoding = &iso2022JP\n\nvar iso2022JP = internal.Encoding{\n\tinternal.FuncEncoding{iso2022JPNewDecoder, iso2022JPNewEncoder},\n\t\"ISO-2022-JP\",\n\tidentifier.ISO2022JP,\n}\n\nfunc iso2022JPNewDecoder() transform.Transformer {\n\treturn new(iso2022JPDecoder)\n}\n\nfunc iso2022JPNewEncoder() transform.Transformer {\n\treturn new(iso2022JPEncoder)\n}\n\nvar errInvalidISO2022JP = errors.New(\"japanese: invalid ISO-2022-JP encoding\")\n\nconst (\n\tasciiState = iota\n\tkatakanaState\n\tjis0208State\n\tjis0212State\n)\n\nconst asciiEsc = 0x1b\n\ntype iso2022JPDecoder int\n\nfunc (d *iso2022JPDecoder) Reset() {\n\t*d = asciiState\n}\n\nfunc (d *iso2022JPDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tc0 := src[nSrc]\n\t\tif c0 >= utf8.RuneSelf {\n\t\t\terr = errInvalidISO2022JP\n\t\t\tbreak loop\n\t\t}\n\n\t\tif c0 == asciiEsc {\n\t\t\tif nSrc+2 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tsize = 3\n\t\t\tc1 := src[nSrc+1]\n\t\t\tc2 := src[nSrc+2]\n\t\t\tswitch {\n\t\t\tcase c1 == '$' && (c2 == '@' || c2 == 'B'):\n\t\t\t\t*d = jis0208State\n\t\t\t\tcontinue\n\t\t\tcase c1 == '$' && c2 == '(':\n\t\t\t\tif nSrc+3 >= len(src) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t\tsize = 4\n\t\t\t\tif src[nSrc]+3 == 'D' {\n\t\t\t\t\t*d = jis0212State\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\tcase c1 == '(' && (c2 == 'B' || c2 == 'J'):\n\t\t\t\t*d = asciiState\n\t\t\t\tcontinue\n\t\t\tcase c1 == '(' && c2 == 'I':\n\t\t\t\t*d = katakanaState\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\terr = errInvalidISO2022JP\n\t\t\tbreak loop\n\t\t}\n\n\t\tswitch *d {\n\t\tcase asciiState:\n\t\t\tr, size = rune(c0), 1\n\n\t\tcase katakanaState:\n\t\t\tif c0 < 0x21 || 0x60 <= c0 {\n\t\t\t\terr = errInvalidISO2022JP\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tr, size = rune(c0)+(0xff61-0x21), 1\n\n\t\tdefault:\n\t\t\tif c0 == 0x0a {\n\t\t\t\t*d = asciiState\n\t\t\t\tr, size = rune(c0), 1\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tsize = 2\n\t\t\tc1 := src[nSrc+1]\n\t\t\ti := int(c0-0x21)*94 + int(c1-0x21)\n\t\t\tif *d == jis0208State && i < len(jis0208Decode) {\n\t\t\t\tr = rune(jis0208Decode[i])\n\t\t\t} else if *d == jis0212State && i < len(jis0212Decode) {\n\t\t\t\tr = rune(jis0212Decode[i])\n\t\t\t} else {\n\t\t\t\tr = '\\ufffd'\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif r == 0 {\n\t\t\t\tr = '\\ufffd'\n\t\t\t}\n\t\t}\n\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t}\n\tif atEOF && err == transform.ErrShortSrc {\n\t\terr = errInvalidISO2022JP\n\t}\n\treturn nDst, nSrc, err\n}\n\ntype iso2022JPEncoder int\n\nfunc (e *iso2022JPEncoder) Reset() {\n\t*e = asciiState\n}\n\nfunc (e *iso2022JPEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// func init checks that the switch covers all tables.\n\t\t\t//\n\t\t\t// http://encoding.spec.whatwg.org/#iso-2022-jp says that \"the index jis0212\n\t\t\t// is not used by the iso-2022-jp encoder due to lack of widespread support\".\n\t\t\t//\n\t\t\t// TODO: do we have to special-case U+00A5 and U+203E, as per\n\t\t\t// http://encoding.spec.whatwg.org/#iso-2022-jp\n\t\t\t// Doing so would mean that \"\\u00a5\" would not be preserved\n\t\t\t// after an encode-decode round trip.\n\t\t\tswitch {\n\t\t\tcase encode0Low <= r && r < encode0High:\n\t\t\t\tif r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto writeJIS\n\t\t\t\t}\n\t\t\tcase encode1Low <= r && r < encode1High:\n\t\t\t\tif r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto writeJIS\n\t\t\t\t}\n\t\t\tcase encode2Low <= r && r < encode2High:\n\t\t\t\tif r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto writeJIS\n\t\t\t\t}\n\t\t\tcase encode3Low <= r && r < encode3High:\n\t\t\t\tif r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto writeJIS\n\t\t\t\t}\n\t\t\tcase encode4Low <= r && r < encode4High:\n\t\t\t\tif r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto writeJIS\n\t\t\t\t}\n\t\t\tcase encode5Low <= r && r < encode5High:\n\t\t\t\tif 0xff61 <= r && r < 0xffa0 {\n\t\t\t\t\tgoto writeKatakana\n\t\t\t\t}\n\t\t\t\tif r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto writeJIS\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Switch back to ASCII state in case of error so that an ASCII\n\t\t\t// replacement character can be written in the correct state.\n\t\t\tif *e != asciiState {\n\t\t\t\tif nDst+3 > len(dst) {\n\t\t\t\t\terr = transform.ErrShortDst\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t*e = asciiState\n\t\t\t\tdst[nDst+0] = asciiEsc\n\t\t\t\tdst[nDst+1] = '('\n\t\t\t\tdst[nDst+2] = 'B'\n\t\t\t\tnDst += 3\n\t\t\t}\n\t\t\terr = internal.ErrASCIIReplacement\n\t\t\tbreak\n\t\t}\n\n\t\tif *e != asciiState {\n\t\t\tif nDst+4 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t*e = asciiState\n\t\t\tdst[nDst+0] = asciiEsc\n\t\t\tdst[nDst+1] = '('\n\t\t\tdst[nDst+2] = 'B'\n\t\t\tnDst += 3\n\t\t} else if nDst >= len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst] = uint8(r)\n\t\tnDst++\n\t\tcontinue\n\n\twriteJIS:\n\t\tif *e != jis0208State {\n\t\t\tif nDst+5 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t*e = jis0208State\n\t\t\tdst[nDst+0] = asciiEsc\n\t\t\tdst[nDst+1] = '$'\n\t\t\tdst[nDst+2] = 'B'\n\t\t\tnDst += 3\n\t\t} else if nDst+2 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+0] = 0x21 + uint8(r>>codeShift)&codeMask\n\t\tdst[nDst+1] = 0x21 + uint8(r)&codeMask\n\t\tnDst += 2\n\t\tcontinue\n\n\twriteKatakana:\n\t\tif *e != katakanaState {\n\t\t\tif nDst+4 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t*e = katakanaState\n\t\t\tdst[nDst+0] = asciiEsc\n\t\t\tdst[nDst+1] = '('\n\t\t\tdst[nDst+2] = 'I'\n\t\t\tnDst += 3\n\t\t} else if nDst >= len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst] = uint8(r - (0xff61 - 0x21))\n\t\tnDst++\n\t\tcontinue\n\t}\n\tif atEOF && err == nil && *e != asciiState {\n\t\tif nDst+3 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t} else {\n\t\t\t*e = asciiState\n\t\t\tdst[nDst+0] = asciiEsc\n\t\t\tdst[nDst+1] = '('\n\t\t\tdst[nDst+2] = 'B'\n\t\t\tnDst += 3\n\t\t}\n\t}\n\treturn nDst, nSrc, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/japanese/maketables.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\n// This program generates tables.go:\n//\tgo run maketables.go | gofmt > tables.go\n\n// TODO: Emoji extensions?\n// http://www.unicode.org/faq/emoji_dingbats.html\n// http://www.unicode.org/Public/UNIDATA/EmojiSources.txt\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"sort\"\n\t\"strings\"\n)\n\ntype entry struct {\n\tjisCode, table int\n}\n\nfunc main() {\n\tfmt.Printf(\"// generated by go run maketables.go; DO NOT EDIT\\n\\n\")\n\tfmt.Printf(\"// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS.\\n\")\n\tfmt.Printf(`package japanese // import \"golang.org/x/text/encoding/japanese\"` + \"\\n\\n\")\n\n\treverse := [65536]entry{}\n\tfor i := range reverse {\n\t\treverse[i].table = -1\n\t}\n\n\ttables := []struct {\n\t\turl  string\n\t\tname string\n\t}{\n\t\t{\"http://encoding.spec.whatwg.org/index-jis0208.txt\", \"0208\"},\n\t\t{\"http://encoding.spec.whatwg.org/index-jis0212.txt\", \"0212\"},\n\t}\n\tfor i, table := range tables {\n\t\tres, err := http.Get(table.url)\n\t\tif err != nil {\n\t\t\tlog.Fatalf(\"%q: Get: %v\", table.url, err)\n\t\t}\n\t\tdefer res.Body.Close()\n\n\t\tmapping := [65536]uint16{}\n\n\t\tscanner := bufio.NewScanner(res.Body)\n\t\tfor scanner.Scan() {\n\t\t\ts := strings.TrimSpace(scanner.Text())\n\t\t\tif s == \"\" || s[0] == '#' {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tx, y := 0, uint16(0)\n\t\t\tif _, err := fmt.Sscanf(s, \"%d 0x%x\", &x, &y); err != nil {\n\t\t\t\tlog.Fatalf(\"%q: could not parse %q\", table.url, s)\n\t\t\t}\n\t\t\tif x < 0 || 120*94 <= x {\n\t\t\t\tlog.Fatalf(\"%q: JIS code %d is out of range\", table.url, x)\n\t\t\t}\n\t\t\tmapping[x] = y\n\t\t\tif reverse[y].table == -1 {\n\t\t\t\treverse[y] = entry{jisCode: x, table: i}\n\t\t\t}\n\t\t}\n\t\tif err := scanner.Err(); err != nil {\n\t\t\tlog.Fatalf(\"%q: scanner error: %v\", table.url, err)\n\t\t}\n\n\t\tfmt.Printf(\"// jis%sDecode is the decoding table from JIS %s code to Unicode.\\n// It is defined at %s\\n\",\n\t\t\ttable.name, table.name, table.url)\n\t\tfmt.Printf(\"var jis%sDecode = [...]uint16{\\n\", table.name)\n\t\tfor i, m := range mapping {\n\t\t\tif m != 0 {\n\t\t\t\tfmt.Printf(\"\\t%d: 0x%04X,\\n\", i, m)\n\t\t\t}\n\t\t}\n\t\tfmt.Printf(\"}\\n\\n\")\n\t}\n\n\t// Any run of at least separation continuous zero entries in the reverse map will\n\t// be a separate encode table.\n\tconst separation = 1024\n\n\tintervals := []interval(nil)\n\tlow, high := -1, -1\n\tfor i, v := range reverse {\n\t\tif v.table == -1 {\n\t\t\tcontinue\n\t\t}\n\t\tif low < 0 {\n\t\t\tlow = i\n\t\t} else if i-high >= separation {\n\t\t\tif high >= 0 {\n\t\t\t\tintervals = append(intervals, interval{low, high})\n\t\t\t}\n\t\t\tlow = i\n\t\t}\n\t\thigh = i + 1\n\t}\n\tif high >= 0 {\n\t\tintervals = append(intervals, interval{low, high})\n\t}\n\tsort.Sort(byDecreasingLength(intervals))\n\n\tfmt.Printf(\"const (\\n\")\n\tfmt.Printf(\"\\tjis0208    = 1\\n\")\n\tfmt.Printf(\"\\tjis0212    = 2\\n\")\n\tfmt.Printf(\"\\tcodeMask   = 0x7f\\n\")\n\tfmt.Printf(\"\\tcodeShift  = 7\\n\")\n\tfmt.Printf(\"\\ttableShift = 14\\n\")\n\tfmt.Printf(\")\\n\\n\")\n\n\tfmt.Printf(\"const numEncodeTables = %d\\n\\n\", len(intervals))\n\tfmt.Printf(\"// encodeX are the encoding tables from Unicode to JIS code,\\n\")\n\tfmt.Printf(\"// sorted by decreasing length.\\n\")\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"// encode%d: %5d entries for runes in [%5d, %5d).\\n\", i, v.len(), v.low, v.high)\n\t}\n\tfmt.Printf(\"//\\n\")\n\tfmt.Printf(\"// The high two bits of the value record whether the JIS code comes from the\\n\")\n\tfmt.Printf(\"// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2).\\n\")\n\tfmt.Printf(\"// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the\\n\")\n\tfmt.Printf(\"// JIS code (94*j1 + j2) within that table.\\n\")\n\tfmt.Printf(\"\\n\")\n\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"const encode%dLow, encode%dHigh = %d, %d\\n\\n\", i, i, v.low, v.high)\n\t\tfmt.Printf(\"var encode%d = [...]uint16{\\n\", i)\n\t\tfor j := v.low; j < v.high; j++ {\n\t\t\tx := reverse[j]\n\t\t\tif x.table == -1 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfmt.Printf(\"\\t%d - %d: jis%s<<14 | 0x%02X<<7 | 0x%02X,\\n\",\n\t\t\t\tj, v.low, tables[x.table].name, x.jisCode/94, x.jisCode%94)\n\t\t}\n\t\tfmt.Printf(\"}\\n\\n\")\n\t}\n}\n\n// interval is a half-open interval [low, high).\ntype interval struct {\n\tlow, high int\n}\n\nfunc (i interval) len() int { return i.high - i.low }\n\n// byDecreasingLength sorts intervals by decreasing length.\ntype byDecreasingLength []interval\n\nfunc (b byDecreasingLength) Len() int           { return len(b) }\nfunc (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }\nfunc (b byDecreasingLength) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/japanese/shiftjis.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage japanese\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// ShiftJIS is the Shift JIS encoding, also known as Code Page 932 and\n// Windows-31J.\nvar ShiftJIS encoding.Encoding = &shiftJIS\n\nvar shiftJIS = internal.Encoding{\n\t&internal.SimpleEncoding{shiftJISDecoder{}, shiftJISEncoder{}},\n\t\"Shift JIS\",\n\tidentifier.ShiftJIS,\n}\n\nvar errInvalidShiftJIS = errors.New(\"japanese: invalid Shift JIS encoding\")\n\ntype shiftJISDecoder struct{ transform.NopResetter }\n\nfunc (shiftJISDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tswitch c0 := src[nSrc]; {\n\t\tcase c0 < utf8.RuneSelf:\n\t\t\tr, size = rune(c0), 1\n\n\t\tcase 0xa1 <= c0 && c0 < 0xe0:\n\t\t\tr, size = rune(c0)+(0xff61-0xa1), 1\n\n\t\tcase (0x81 <= c0 && c0 < 0xa0) || (0xe0 <= c0 && c0 < 0xfd):\n\t\t\tif c0 <= 0x9f {\n\t\t\t\tc0 -= 0x70\n\t\t\t} else {\n\t\t\t\tc0 -= 0xb0\n\t\t\t}\n\t\t\tc0 = 2*c0 - 0x21\n\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tswitch {\n\t\t\tcase c1 < 0x40:\n\t\t\t\terr = errInvalidShiftJIS\n\t\t\t\tbreak loop\n\t\t\tcase c1 < 0x7f:\n\t\t\t\tc0--\n\t\t\t\tc1 -= 0x40\n\t\t\tcase c1 == 0x7f:\n\t\t\t\terr = errInvalidShiftJIS\n\t\t\t\tbreak loop\n\t\t\tcase c1 < 0x9f:\n\t\t\t\tc0--\n\t\t\t\tc1 -= 0x41\n\t\t\tcase c1 < 0xfd:\n\t\t\t\tc1 -= 0x9f\n\t\t\tdefault:\n\t\t\t\terr = errInvalidShiftJIS\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tr, size = '\\ufffd', 2\n\t\t\tif i := int(c0)*94 + int(c1); i < len(jis0208Decode) {\n\t\t\t\tr = rune(jis0208Decode[i])\n\t\t\t\tif r == 0 {\n\t\t\t\t\tr = '\\ufffd'\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\terr = errInvalidShiftJIS\n\t\t\tbreak loop\n\t\t}\n\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t}\n\tif atEOF && err == transform.ErrShortSrc {\n\t\terr = errInvalidShiftJIS\n\t}\n\treturn nDst, nSrc, err\n}\n\ntype shiftJISEncoder struct{ transform.NopResetter }\n\nfunc (shiftJISEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// func init checks that the switch covers all tables.\n\t\t\tswitch {\n\t\t\tcase encode0Low <= r && r < encode0High:\n\t\t\t\tif r = rune(encode0[r-encode0Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode1Low <= r && r < encode1High:\n\t\t\t\tif r = rune(encode1[r-encode1Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode2Low <= r && r < encode2High:\n\t\t\t\tif r = rune(encode2[r-encode2Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode3Low <= r && r < encode3High:\n\t\t\t\tif r = rune(encode3[r-encode3Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode4Low <= r && r < encode4High:\n\t\t\t\tif r = rune(encode4[r-encode4Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode5Low <= r && r < encode5High:\n\t\t\t\tif 0xff61 <= r && r < 0xffa0 {\n\t\t\t\t\tr -= 0xff61 - 0xa1\n\t\t\t\t\tgoto write1\n\t\t\t\t}\n\t\t\t\tif r = rune(encode5[r-encode5Low]); r>>tableShift == jis0208 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\t}\n\t\t\terr = internal.ErrASCIIReplacement\n\t\t\tbreak\n\t\t}\n\n\twrite1:\n\t\tif nDst >= len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst] = uint8(r)\n\t\tnDst++\n\t\tcontinue\n\n\twrite2:\n\t\tj1 := uint8(r>>codeShift) & codeMask\n\t\tj2 := uint8(r) & codeMask\n\t\tif nDst+2 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tif j1 <= 61 {\n\t\t\tdst[nDst+0] = 129 + j1/2\n\t\t} else {\n\t\t\tdst[nDst+0] = 193 + j1/2\n\t\t}\n\t\tif j1&1 == 0 {\n\t\t\tdst[nDst+1] = j2 + j2/63 + 64\n\t\t} else {\n\t\t\tdst[nDst+1] = j2 + 159\n\t\t}\n\t\tnDst += 2\n\t\tcontinue\n\t}\n\treturn nDst, nSrc, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/japanese/tables.go",
    "content": "// generated by go run maketables.go; DO NOT EDIT\n\n// Package japanese provides Japanese encodings such as EUC-JP and Shift JIS.\npackage japanese // import \"golang.org/x/text/encoding/japanese\"\n\n// jis0208Decode is the decoding table from JIS 0208 code to Unicode.\n// It is defined at http://encoding.spec.whatwg.org/index-jis0208.txt\nvar jis0208Decode = [...]uint16{\n\t0:     0x3000,\n\t1:     0x3001,\n\t2:     0x3002,\n\t3:     0xFF0C,\n\t4:     0xFF0E,\n\t5:     0x30FB,\n\t6:     0xFF1A,\n\t7:     0xFF1B,\n\t8:     0xFF1F,\n\t9:     0xFF01,\n\t10:    0x309B,\n\t11:    0x309C,\n\t12:    0x00B4,\n\t13:    0xFF40,\n\t14:    0x00A8,\n\t15:    0xFF3E,\n\t16:    0xFFE3,\n\t17:    0xFF3F,\n\t18:    0x30FD,\n\t19:    0x30FE,\n\t20:    0x309D,\n\t21:    0x309E,\n\t22:    0x3003,\n\t23:    0x4EDD,\n\t24:    0x3005,\n\t25:    0x3006,\n\t26:    0x3007,\n\t27:    0x30FC,\n\t28:    0x2015,\n\t29:    0x2010,\n\t30:    0xFF0F,\n\t31:    0xFF3C,\n\t32:    0xFF5E,\n\t33:    0x2225,\n\t34:    0xFF5C,\n\t35:    0x2026,\n\t36:    0x2025,\n\t37:    0x2018,\n\t38:    0x2019,\n\t39:    0x201C,\n\t40:    0x201D,\n\t41:    0xFF08,\n\t42:    0xFF09,\n\t43:    0x3014,\n\t44:    0x3015,\n\t45:    0xFF3B,\n\t46:    0xFF3D,\n\t47:    0xFF5B,\n\t48:    0xFF5D,\n\t49:    0x3008,\n\t50:    0x3009,\n\t51:    0x300A,\n\t52:    0x300B,\n\t53:    0x300C,\n\t54:    0x300D,\n\t55:    0x300E,\n\t56:    0x300F,\n\t57:    0x3010,\n\t58:    0x3011,\n\t59:    0xFF0B,\n\t60:    0xFF0D,\n\t61:    0x00B1,\n\t62:    0x00D7,\n\t63:    0x00F7,\n\t64:    0xFF1D,\n\t65:    0x2260,\n\t66:    0xFF1C,\n\t67:    0xFF1E,\n\t68:    0x2266,\n\t69:    0x2267,\n\t70:    0x221E,\n\t71:    0x2234,\n\t72:    0x2642,\n\t73:    0x2640,\n\t74:    0x00B0,\n\t75:    0x2032,\n\t76:    0x2033,\n\t77:    0x2103,\n\t78:    0xFFE5,\n\t79:    0xFF04,\n\t80:    0xFFE0,\n\t81:    0xFFE1,\n\t82:    0xFF05,\n\t83:    0xFF03,\n\t84:    0xFF06,\n\t85:    0xFF0A,\n\t86:    0xFF20,\n\t87:    0x00A7,\n\t88:    0x2606,\n\t89:    0x2605,\n\t90:    0x25CB,\n\t91:    0x25CF,\n\t92:    0x25CE,\n\t93:    0x25C7,\n\t94:    0x25C6,\n\t95:    0x25A1,\n\t96:    0x25A0,\n\t97:    0x25B3,\n\t98:    0x25B2,\n\t99:    0x25BD,\n\t100:   0x25BC,\n\t101:   0x203B,\n\t102:   0x3012,\n\t103:   0x2192,\n\t104:   0x2190,\n\t105:   0x2191,\n\t106:   0x2193,\n\t107:   0x3013,\n\t119:   0x2208,\n\t120:   0x220B,\n\t121:   0x2286,\n\t122:   0x2287,\n\t123:   0x2282,\n\t124:   0x2283,\n\t125:   0x222A,\n\t126:   0x2229,\n\t135:   0x2227,\n\t136:   0x2228,\n\t137:   0xFFE2,\n\t138:   0x21D2,\n\t139:   0x21D4,\n\t140:   0x2200,\n\t141:   0x2203,\n\t153:   0x2220,\n\t154:   0x22A5,\n\t155:   0x2312,\n\t156:   0x2202,\n\t157:   0x2207,\n\t158:   0x2261,\n\t159:   0x2252,\n\t160:   0x226A,\n\t161:   0x226B,\n\t162:   0x221A,\n\t163:   0x223D,\n\t164:   0x221D,\n\t165:   0x2235,\n\t166:   0x222B,\n\t167:   0x222C,\n\t175:   0x212B,\n\t176:   0x2030,\n\t177:   0x266F,\n\t178:   0x266D,\n\t179:   0x266A,\n\t180:   0x2020,\n\t181:   0x2021,\n\t182:   0x00B6,\n\t187:   0x25EF,\n\t203:   0xFF10,\n\t204:   0xFF11,\n\t205:   0xFF12,\n\t206:   0xFF13,\n\t207:   0xFF14,\n\t208:   0xFF15,\n\t209:   0xFF16,\n\t210:   0xFF17,\n\t211:   0xFF18,\n\t212:   0xFF19,\n\t220:   0xFF21,\n\t221:   0xFF22,\n\t222:   0xFF23,\n\t223:   0xFF24,\n\t224:   0xFF25,\n\t225:   0xFF26,\n\t226:   0xFF27,\n\t227:   0xFF28,\n\t228:   0xFF29,\n\t229:   0xFF2A,\n\t230:   0xFF2B,\n\t231:   0xFF2C,\n\t232:   0xFF2D,\n\t233:   0xFF2E,\n\t234:   0xFF2F,\n\t235:   0xFF30,\n\t236:   0xFF31,\n\t237:   0xFF32,\n\t238:   0xFF33,\n\t239:   0xFF34,\n\t240:   0xFF35,\n\t241:   0xFF36,\n\t242:   0xFF37,\n\t243:   0xFF38,\n\t244:   0xFF39,\n\t245:   0xFF3A,\n\t252:   0xFF41,\n\t253:   0xFF42,\n\t254:   0xFF43,\n\t255:   0xFF44,\n\t256:   0xFF45,\n\t257:   0xFF46,\n\t258:   0xFF47,\n\t259:   0xFF48,\n\t260:   0xFF49,\n\t261:   0xFF4A,\n\t262:   0xFF4B,\n\t263:   0xFF4C,\n\t264:   0xFF4D,\n\t265:   0xFF4E,\n\t266:   0xFF4F,\n\t267:   0xFF50,\n\t268:   0xFF51,\n\t269:   0xFF52,\n\t270:   0xFF53,\n\t271:   0xFF54,\n\t272:   0xFF55,\n\t273:   0xFF56,\n\t274:   0xFF57,\n\t275:   0xFF58,\n\t276:   0xFF59,\n\t277:   0xFF5A,\n\t282:   0x3041,\n\t283:   0x3042,\n\t284:   0x3043,\n\t285:   0x3044,\n\t286:   0x3045,\n\t287:   0x3046,\n\t288:   0x3047,\n\t289:   0x3048,\n\t290:   0x3049,\n\t291:   0x304A,\n\t292:   0x304B,\n\t293:   0x304C,\n\t294:   0x304D,\n\t295:   0x304E,\n\t296:   0x304F,\n\t297:   0x3050,\n\t298:   0x3051,\n\t299:   0x3052,\n\t300:   0x3053,\n\t301:   0x3054,\n\t302:   0x3055,\n\t303:   0x3056,\n\t304:   0x3057,\n\t305:   0x3058,\n\t306:   0x3059,\n\t307:   0x305A,\n\t308:   0x305B,\n\t309:   0x305C,\n\t310:   0x305D,\n\t311:   0x305E,\n\t312:   0x305F,\n\t313:   0x3060,\n\t314:   0x3061,\n\t315:   0x3062,\n\t316:   0x3063,\n\t317:   0x3064,\n\t318:   0x3065,\n\t319:   0x3066,\n\t320:   0x3067,\n\t321:   0x3068,\n\t322:   0x3069,\n\t323:   0x306A,\n\t324:   0x306B,\n\t325:   0x306C,\n\t326:   0x306D,\n\t327:   0x306E,\n\t328:   0x306F,\n\t329:   0x3070,\n\t330:   0x3071,\n\t331:   0x3072,\n\t332:   0x3073,\n\t333:   0x3074,\n\t334:   0x3075,\n\t335:   0x3076,\n\t336:   0x3077,\n\t337:   0x3078,\n\t338:   0x3079,\n\t339:   0x307A,\n\t340:   0x307B,\n\t341:   0x307C,\n\t342:   0x307D,\n\t343:   0x307E,\n\t344:   0x307F,\n\t345:   0x3080,\n\t346:   0x3081,\n\t347:   0x3082,\n\t348:   0x3083,\n\t349:   0x3084,\n\t350:   0x3085,\n\t351:   0x3086,\n\t352:   0x3087,\n\t353:   0x3088,\n\t354:   0x3089,\n\t355:   0x308A,\n\t356:   0x308B,\n\t357:   0x308C,\n\t358:   0x308D,\n\t359:   0x308E,\n\t360:   0x308F,\n\t361:   0x3090,\n\t362:   0x3091,\n\t363:   0x3092,\n\t364:   0x3093,\n\t376:   0x30A1,\n\t377:   0x30A2,\n\t378:   0x30A3,\n\t379:   0x30A4,\n\t380:   0x30A5,\n\t381:   0x30A6,\n\t382:   0x30A7,\n\t383:   0x30A8,\n\t384:   0x30A9,\n\t385:   0x30AA,\n\t386:   0x30AB,\n\t387:   0x30AC,\n\t388:   0x30AD,\n\t389:   0x30AE,\n\t390:   0x30AF,\n\t391:   0x30B0,\n\t392:   0x30B1,\n\t393:   0x30B2,\n\t394:   0x30B3,\n\t395:   0x30B4,\n\t396:   0x30B5,\n\t397:   0x30B6,\n\t398:   0x30B7,\n\t399:   0x30B8,\n\t400:   0x30B9,\n\t401:   0x30BA,\n\t402:   0x30BB,\n\t403:   0x30BC,\n\t404:   0x30BD,\n\t405:   0x30BE,\n\t406:   0x30BF,\n\t407:   0x30C0,\n\t408:   0x30C1,\n\t409:   0x30C2,\n\t410:   0x30C3,\n\t411:   0x30C4,\n\t412:   0x30C5,\n\t413:   0x30C6,\n\t414:   0x30C7,\n\t415:   0x30C8,\n\t416:   0x30C9,\n\t417:   0x30CA,\n\t418:   0x30CB,\n\t419:   0x30CC,\n\t420:   0x30CD,\n\t421:   0x30CE,\n\t422:   0x30CF,\n\t423:   0x30D0,\n\t424:   0x30D1,\n\t425:   0x30D2,\n\t426:   0x30D3,\n\t427:   0x30D4,\n\t428:   0x30D5,\n\t429:   0x30D6,\n\t430:   0x30D7,\n\t431:   0x30D8,\n\t432:   0x30D9,\n\t433:   0x30DA,\n\t434:   0x30DB,\n\t435:   0x30DC,\n\t436:   0x30DD,\n\t437:   0x30DE,\n\t438:   0x30DF,\n\t439:   0x30E0,\n\t440:   0x30E1,\n\t441:   0x30E2,\n\t442:   0x30E3,\n\t443:   0x30E4,\n\t444:   0x30E5,\n\t445:   0x30E6,\n\t446:   0x30E7,\n\t447:   0x30E8,\n\t448:   0x30E9,\n\t449:   0x30EA,\n\t450:   0x30EB,\n\t451:   0x30EC,\n\t452:   0x30ED,\n\t453:   0x30EE,\n\t454:   0x30EF,\n\t455:   0x30F0,\n\t456:   0x30F1,\n\t457:   0x30F2,\n\t458:   0x30F3,\n\t459:   0x30F4,\n\t460:   0x30F5,\n\t461:   0x30F6,\n\t470:   0x0391,\n\t471:   0x0392,\n\t472:   0x0393,\n\t473:   0x0394,\n\t474:   0x0395,\n\t475:   0x0396,\n\t476:   0x0397,\n\t477:   0x0398,\n\t478:   0x0399,\n\t479:   0x039A,\n\t480:   0x039B,\n\t481:   0x039C,\n\t482:   0x039D,\n\t483:   0x039E,\n\t484:   0x039F,\n\t485:   0x03A0,\n\t486:   0x03A1,\n\t487:   0x03A3,\n\t488:   0x03A4,\n\t489:   0x03A5,\n\t490:   0x03A6,\n\t491:   0x03A7,\n\t492:   0x03A8,\n\t493:   0x03A9,\n\t502:   0x03B1,\n\t503:   0x03B2,\n\t504:   0x03B3,\n\t505:   0x03B4,\n\t506:   0x03B5,\n\t507:   0x03B6,\n\t508:   0x03B7,\n\t509:   0x03B8,\n\t510:   0x03B9,\n\t511:   0x03BA,\n\t512:   0x03BB,\n\t513:   0x03BC,\n\t514:   0x03BD,\n\t515:   0x03BE,\n\t516:   0x03BF,\n\t517:   0x03C0,\n\t518:   0x03C1,\n\t519:   0x03C3,\n\t520:   0x03C4,\n\t521:   0x03C5,\n\t522:   0x03C6,\n\t523:   0x03C7,\n\t524:   0x03C8,\n\t525:   0x03C9,\n\t564:   0x0410,\n\t565:   0x0411,\n\t566:   0x0412,\n\t567:   0x0413,\n\t568:   0x0414,\n\t569:   0x0415,\n\t570:   0x0401,\n\t571:   0x0416,\n\t572:   0x0417,\n\t573:   0x0418,\n\t574:   0x0419,\n\t575:   0x041A,\n\t576:   0x041B,\n\t577:   0x041C,\n\t578:   0x041D,\n\t579:   0x041E,\n\t580:   0x041F,\n\t581:   0x0420,\n\t582:   0x0421,\n\t583:   0x0422,\n\t584:   0x0423,\n\t585:   0x0424,\n\t586:   0x0425,\n\t587:   0x0426,\n\t588:   0x0427,\n\t589:   0x0428,\n\t590:   0x0429,\n\t591:   0x042A,\n\t592:   0x042B,\n\t593:   0x042C,\n\t594:   0x042D,\n\t595:   0x042E,\n\t596:   0x042F,\n\t612:   0x0430,\n\t613:   0x0431,\n\t614:   0x0432,\n\t615:   0x0433,\n\t616:   0x0434,\n\t617:   0x0435,\n\t618:   0x0451,\n\t619:   0x0436,\n\t620:   0x0437,\n\t621:   0x0438,\n\t622:   0x0439,\n\t623:   0x043A,\n\t624:   0x043B,\n\t625:   0x043C,\n\t626:   0x043D,\n\t627:   0x043E,\n\t628:   0x043F,\n\t629:   0x0440,\n\t630:   0x0441,\n\t631:   0x0442,\n\t632:   0x0443,\n\t633:   0x0444,\n\t634:   0x0445,\n\t635:   0x0446,\n\t636:   0x0447,\n\t637:   0x0448,\n\t638:   0x0449,\n\t639:   0x044A,\n\t640:   0x044B,\n\t641:   0x044C,\n\t642:   0x044D,\n\t643:   0x044E,\n\t644:   0x044F,\n\t658:   0x2500,\n\t659:   0x2502,\n\t660:   0x250C,\n\t661:   0x2510,\n\t662:   0x2518,\n\t663:   0x2514,\n\t664:   0x251C,\n\t665:   0x252C,\n\t666:   0x2524,\n\t667:   0x2534,\n\t668:   0x253C,\n\t669:   0x2501,\n\t670:   0x2503,\n\t671:   0x250F,\n\t672:   0x2513,\n\t673:   0x251B,\n\t674:   0x2517,\n\t675:   0x2523,\n\t676:   0x2533,\n\t677:   0x252B,\n\t678:   0x253B,\n\t679:   0x254B,\n\t680:   0x2520,\n\t681:   0x252F,\n\t682:   0x2528,\n\t683:   0x2537,\n\t684:   0x253F,\n\t685:   0x251D,\n\t686:   0x2530,\n\t687:   0x2525,\n\t688:   0x2538,\n\t689:   0x2542,\n\t1128:  0x2460,\n\t1129:  0x2461,\n\t1130:  0x2462,\n\t1131:  0x2463,\n\t1132:  0x2464,\n\t1133:  0x2465,\n\t1134:  0x2466,\n\t1135:  0x2467,\n\t1136:  0x2468,\n\t1137:  0x2469,\n\t1138:  0x246A,\n\t1139:  0x246B,\n\t1140:  0x246C,\n\t1141:  0x246D,\n\t1142:  0x246E,\n\t1143:  0x246F,\n\t1144:  0x2470,\n\t1145:  0x2471,\n\t1146:  0x2472,\n\t1147:  0x2473,\n\t1148:  0x2160,\n\t1149:  0x2161,\n\t1150:  0x2162,\n\t1151:  0x2163,\n\t1152:  0x2164,\n\t1153:  0x2165,\n\t1154:  0x2166,\n\t1155:  0x2167,\n\t1156:  0x2168,\n\t1157:  0x2169,\n\t1159:  0x3349,\n\t1160:  0x3314,\n\t1161:  0x3322,\n\t1162:  0x334D,\n\t1163:  0x3318,\n\t1164:  0x3327,\n\t1165:  0x3303,\n\t1166:  0x3336,\n\t1167:  0x3351,\n\t1168:  0x3357,\n\t1169:  0x330D,\n\t1170:  0x3326,\n\t1171:  0x3323,\n\t1172:  0x332B,\n\t1173:  0x334A,\n\t1174:  0x333B,\n\t1175:  0x339C,\n\t1176:  0x339D,\n\t1177:  0x339E,\n\t1178:  0x338E,\n\t1179:  0x338F,\n\t1180:  0x33C4,\n\t1181:  0x33A1,\n\t1190:  0x337B,\n\t1191:  0x301D,\n\t1192:  0x301F,\n\t1193:  0x2116,\n\t1194:  0x33CD,\n\t1195:  0x2121,\n\t1196:  0x32A4,\n\t1197:  0x32A5,\n\t1198:  0x32A6,\n\t1199:  0x32A7,\n\t1200:  0x32A8,\n\t1201:  0x3231,\n\t1202:  0x3232,\n\t1203:  0x3239,\n\t1204:  0x337E,\n\t1205:  0x337D,\n\t1206:  0x337C,\n\t1207:  0x2252,\n\t1208:  0x2261,\n\t1209:  0x222B,\n\t1210:  0x222E,\n\t1211:  0x2211,\n\t1212:  0x221A,\n\t1213:  0x22A5,\n\t1214:  0x2220,\n\t1215:  0x221F,\n\t1216:  0x22BF,\n\t1217:  0x2235,\n\t1218:  0x2229,\n\t1219:  0x222A,\n\t1410:  0x4E9C,\n\t1411:  0x5516,\n\t1412:  0x5A03,\n\t1413:  0x963F,\n\t1414:  0x54C0,\n\t1415:  0x611B,\n\t1416:  0x6328,\n\t1417:  0x59F6,\n\t1418:  0x9022,\n\t1419:  0x8475,\n\t1420:  0x831C,\n\t1421:  0x7A50,\n\t1422:  0x60AA,\n\t1423:  0x63E1,\n\t1424:  0x6E25,\n\t1425:  0x65ED,\n\t1426:  0x8466,\n\t1427:  0x82A6,\n\t1428:  0x9BF5,\n\t1429:  0x6893,\n\t1430:  0x5727,\n\t1431:  0x65A1,\n\t1432:  0x6271,\n\t1433:  0x5B9B,\n\t1434:  0x59D0,\n\t1435:  0x867B,\n\t1436:  0x98F4,\n\t1437:  0x7D62,\n\t1438:  0x7DBE,\n\t1439:  0x9B8E,\n\t1440:  0x6216,\n\t1441:  0x7C9F,\n\t1442:  0x88B7,\n\t1443:  0x5B89,\n\t1444:  0x5EB5,\n\t1445:  0x6309,\n\t1446:  0x6697,\n\t1447:  0x6848,\n\t1448:  0x95C7,\n\t1449:  0x978D,\n\t1450:  0x674F,\n\t1451:  0x4EE5,\n\t1452:  0x4F0A,\n\t1453:  0x4F4D,\n\t1454:  0x4F9D,\n\t1455:  0x5049,\n\t1456:  0x56F2,\n\t1457:  0x5937,\n\t1458:  0x59D4,\n\t1459:  0x5A01,\n\t1460:  0x5C09,\n\t1461:  0x60DF,\n\t1462:  0x610F,\n\t1463:  0x6170,\n\t1464:  0x6613,\n\t1465:  0x6905,\n\t1466:  0x70BA,\n\t1467:  0x754F,\n\t1468:  0x7570,\n\t1469:  0x79FB,\n\t1470:  0x7DAD,\n\t1471:  0x7DEF,\n\t1472:  0x80C3,\n\t1473:  0x840E,\n\t1474:  0x8863,\n\t1475:  0x8B02,\n\t1476:  0x9055,\n\t1477:  0x907A,\n\t1478:  0x533B,\n\t1479:  0x4E95,\n\t1480:  0x4EA5,\n\t1481:  0x57DF,\n\t1482:  0x80B2,\n\t1483:  0x90C1,\n\t1484:  0x78EF,\n\t1485:  0x4E00,\n\t1486:  0x58F1,\n\t1487:  0x6EA2,\n\t1488:  0x9038,\n\t1489:  0x7A32,\n\t1490:  0x8328,\n\t1491:  0x828B,\n\t1492:  0x9C2F,\n\t1493:  0x5141,\n\t1494:  0x5370,\n\t1495:  0x54BD,\n\t1496:  0x54E1,\n\t1497:  0x56E0,\n\t1498:  0x59FB,\n\t1499:  0x5F15,\n\t1500:  0x98F2,\n\t1501:  0x6DEB,\n\t1502:  0x80E4,\n\t1503:  0x852D,\n\t1504:  0x9662,\n\t1505:  0x9670,\n\t1506:  0x96A0,\n\t1507:  0x97FB,\n\t1508:  0x540B,\n\t1509:  0x53F3,\n\t1510:  0x5B87,\n\t1511:  0x70CF,\n\t1512:  0x7FBD,\n\t1513:  0x8FC2,\n\t1514:  0x96E8,\n\t1515:  0x536F,\n\t1516:  0x9D5C,\n\t1517:  0x7ABA,\n\t1518:  0x4E11,\n\t1519:  0x7893,\n\t1520:  0x81FC,\n\t1521:  0x6E26,\n\t1522:  0x5618,\n\t1523:  0x5504,\n\t1524:  0x6B1D,\n\t1525:  0x851A,\n\t1526:  0x9C3B,\n\t1527:  0x59E5,\n\t1528:  0x53A9,\n\t1529:  0x6D66,\n\t1530:  0x74DC,\n\t1531:  0x958F,\n\t1532:  0x5642,\n\t1533:  0x4E91,\n\t1534:  0x904B,\n\t1535:  0x96F2,\n\t1536:  0x834F,\n\t1537:  0x990C,\n\t1538:  0x53E1,\n\t1539:  0x55B6,\n\t1540:  0x5B30,\n\t1541:  0x5F71,\n\t1542:  0x6620,\n\t1543:  0x66F3,\n\t1544:  0x6804,\n\t1545:  0x6C38,\n\t1546:  0x6CF3,\n\t1547:  0x6D29,\n\t1548:  0x745B,\n\t1549:  0x76C8,\n\t1550:  0x7A4E,\n\t1551:  0x9834,\n\t1552:  0x82F1,\n\t1553:  0x885B,\n\t1554:  0x8A60,\n\t1555:  0x92ED,\n\t1556:  0x6DB2,\n\t1557:  0x75AB,\n\t1558:  0x76CA,\n\t1559:  0x99C5,\n\t1560:  0x60A6,\n\t1561:  0x8B01,\n\t1562:  0x8D8A,\n\t1563:  0x95B2,\n\t1564:  0x698E,\n\t1565:  0x53AD,\n\t1566:  0x5186,\n\t1567:  0x5712,\n\t1568:  0x5830,\n\t1569:  0x5944,\n\t1570:  0x5BB4,\n\t1571:  0x5EF6,\n\t1572:  0x6028,\n\t1573:  0x63A9,\n\t1574:  0x63F4,\n\t1575:  0x6CBF,\n\t1576:  0x6F14,\n\t1577:  0x708E,\n\t1578:  0x7114,\n\t1579:  0x7159,\n\t1580:  0x71D5,\n\t1581:  0x733F,\n\t1582:  0x7E01,\n\t1583:  0x8276,\n\t1584:  0x82D1,\n\t1585:  0x8597,\n\t1586:  0x9060,\n\t1587:  0x925B,\n\t1588:  0x9D1B,\n\t1589:  0x5869,\n\t1590:  0x65BC,\n\t1591:  0x6C5A,\n\t1592:  0x7525,\n\t1593:  0x51F9,\n\t1594:  0x592E,\n\t1595:  0x5965,\n\t1596:  0x5F80,\n\t1597:  0x5FDC,\n\t1598:  0x62BC,\n\t1599:  0x65FA,\n\t1600:  0x6A2A,\n\t1601:  0x6B27,\n\t1602:  0x6BB4,\n\t1603:  0x738B,\n\t1604:  0x7FC1,\n\t1605:  0x8956,\n\t1606:  0x9D2C,\n\t1607:  0x9D0E,\n\t1608:  0x9EC4,\n\t1609:  0x5CA1,\n\t1610:  0x6C96,\n\t1611:  0x837B,\n\t1612:  0x5104,\n\t1613:  0x5C4B,\n\t1614:  0x61B6,\n\t1615:  0x81C6,\n\t1616:  0x6876,\n\t1617:  0x7261,\n\t1618:  0x4E59,\n\t1619:  0x4FFA,\n\t1620:  0x5378,\n\t1621:  0x6069,\n\t1622:  0x6E29,\n\t1623:  0x7A4F,\n\t1624:  0x97F3,\n\t1625:  0x4E0B,\n\t1626:  0x5316,\n\t1627:  0x4EEE,\n\t1628:  0x4F55,\n\t1629:  0x4F3D,\n\t1630:  0x4FA1,\n\t1631:  0x4F73,\n\t1632:  0x52A0,\n\t1633:  0x53EF,\n\t1634:  0x5609,\n\t1635:  0x590F,\n\t1636:  0x5AC1,\n\t1637:  0x5BB6,\n\t1638:  0x5BE1,\n\t1639:  0x79D1,\n\t1640:  0x6687,\n\t1641:  0x679C,\n\t1642:  0x67B6,\n\t1643:  0x6B4C,\n\t1644:  0x6CB3,\n\t1645:  0x706B,\n\t1646:  0x73C2,\n\t1647:  0x798D,\n\t1648:  0x79BE,\n\t1649:  0x7A3C,\n\t1650:  0x7B87,\n\t1651:  0x82B1,\n\t1652:  0x82DB,\n\t1653:  0x8304,\n\t1654:  0x8377,\n\t1655:  0x83EF,\n\t1656:  0x83D3,\n\t1657:  0x8766,\n\t1658:  0x8AB2,\n\t1659:  0x5629,\n\t1660:  0x8CA8,\n\t1661:  0x8FE6,\n\t1662:  0x904E,\n\t1663:  0x971E,\n\t1664:  0x868A,\n\t1665:  0x4FC4,\n\t1666:  0x5CE8,\n\t1667:  0x6211,\n\t1668:  0x7259,\n\t1669:  0x753B,\n\t1670:  0x81E5,\n\t1671:  0x82BD,\n\t1672:  0x86FE,\n\t1673:  0x8CC0,\n\t1674:  0x96C5,\n\t1675:  0x9913,\n\t1676:  0x99D5,\n\t1677:  0x4ECB,\n\t1678:  0x4F1A,\n\t1679:  0x89E3,\n\t1680:  0x56DE,\n\t1681:  0x584A,\n\t1682:  0x58CA,\n\t1683:  0x5EFB,\n\t1684:  0x5FEB,\n\t1685:  0x602A,\n\t1686:  0x6094,\n\t1687:  0x6062,\n\t1688:  0x61D0,\n\t1689:  0x6212,\n\t1690:  0x62D0,\n\t1691:  0x6539,\n\t1692:  0x9B41,\n\t1693:  0x6666,\n\t1694:  0x68B0,\n\t1695:  0x6D77,\n\t1696:  0x7070,\n\t1697:  0x754C,\n\t1698:  0x7686,\n\t1699:  0x7D75,\n\t1700:  0x82A5,\n\t1701:  0x87F9,\n\t1702:  0x958B,\n\t1703:  0x968E,\n\t1704:  0x8C9D,\n\t1705:  0x51F1,\n\t1706:  0x52BE,\n\t1707:  0x5916,\n\t1708:  0x54B3,\n\t1709:  0x5BB3,\n\t1710:  0x5D16,\n\t1711:  0x6168,\n\t1712:  0x6982,\n\t1713:  0x6DAF,\n\t1714:  0x788D,\n\t1715:  0x84CB,\n\t1716:  0x8857,\n\t1717:  0x8A72,\n\t1718:  0x93A7,\n\t1719:  0x9AB8,\n\t1720:  0x6D6C,\n\t1721:  0x99A8,\n\t1722:  0x86D9,\n\t1723:  0x57A3,\n\t1724:  0x67FF,\n\t1725:  0x86CE,\n\t1726:  0x920E,\n\t1727:  0x5283,\n\t1728:  0x5687,\n\t1729:  0x5404,\n\t1730:  0x5ED3,\n\t1731:  0x62E1,\n\t1732:  0x64B9,\n\t1733:  0x683C,\n\t1734:  0x6838,\n\t1735:  0x6BBB,\n\t1736:  0x7372,\n\t1737:  0x78BA,\n\t1738:  0x7A6B,\n\t1739:  0x899A,\n\t1740:  0x89D2,\n\t1741:  0x8D6B,\n\t1742:  0x8F03,\n\t1743:  0x90ED,\n\t1744:  0x95A3,\n\t1745:  0x9694,\n\t1746:  0x9769,\n\t1747:  0x5B66,\n\t1748:  0x5CB3,\n\t1749:  0x697D,\n\t1750:  0x984D,\n\t1751:  0x984E,\n\t1752:  0x639B,\n\t1753:  0x7B20,\n\t1754:  0x6A2B,\n\t1755:  0x6A7F,\n\t1756:  0x68B6,\n\t1757:  0x9C0D,\n\t1758:  0x6F5F,\n\t1759:  0x5272,\n\t1760:  0x559D,\n\t1761:  0x6070,\n\t1762:  0x62EC,\n\t1763:  0x6D3B,\n\t1764:  0x6E07,\n\t1765:  0x6ED1,\n\t1766:  0x845B,\n\t1767:  0x8910,\n\t1768:  0x8F44,\n\t1769:  0x4E14,\n\t1770:  0x9C39,\n\t1771:  0x53F6,\n\t1772:  0x691B,\n\t1773:  0x6A3A,\n\t1774:  0x9784,\n\t1775:  0x682A,\n\t1776:  0x515C,\n\t1777:  0x7AC3,\n\t1778:  0x84B2,\n\t1779:  0x91DC,\n\t1780:  0x938C,\n\t1781:  0x565B,\n\t1782:  0x9D28,\n\t1783:  0x6822,\n\t1784:  0x8305,\n\t1785:  0x8431,\n\t1786:  0x7CA5,\n\t1787:  0x5208,\n\t1788:  0x82C5,\n\t1789:  0x74E6,\n\t1790:  0x4E7E,\n\t1791:  0x4F83,\n\t1792:  0x51A0,\n\t1793:  0x5BD2,\n\t1794:  0x520A,\n\t1795:  0x52D8,\n\t1796:  0x52E7,\n\t1797:  0x5DFB,\n\t1798:  0x559A,\n\t1799:  0x582A,\n\t1800:  0x59E6,\n\t1801:  0x5B8C,\n\t1802:  0x5B98,\n\t1803:  0x5BDB,\n\t1804:  0x5E72,\n\t1805:  0x5E79,\n\t1806:  0x60A3,\n\t1807:  0x611F,\n\t1808:  0x6163,\n\t1809:  0x61BE,\n\t1810:  0x63DB,\n\t1811:  0x6562,\n\t1812:  0x67D1,\n\t1813:  0x6853,\n\t1814:  0x68FA,\n\t1815:  0x6B3E,\n\t1816:  0x6B53,\n\t1817:  0x6C57,\n\t1818:  0x6F22,\n\t1819:  0x6F97,\n\t1820:  0x6F45,\n\t1821:  0x74B0,\n\t1822:  0x7518,\n\t1823:  0x76E3,\n\t1824:  0x770B,\n\t1825:  0x7AFF,\n\t1826:  0x7BA1,\n\t1827:  0x7C21,\n\t1828:  0x7DE9,\n\t1829:  0x7F36,\n\t1830:  0x7FF0,\n\t1831:  0x809D,\n\t1832:  0x8266,\n\t1833:  0x839E,\n\t1834:  0x89B3,\n\t1835:  0x8ACC,\n\t1836:  0x8CAB,\n\t1837:  0x9084,\n\t1838:  0x9451,\n\t1839:  0x9593,\n\t1840:  0x9591,\n\t1841:  0x95A2,\n\t1842:  0x9665,\n\t1843:  0x97D3,\n\t1844:  0x9928,\n\t1845:  0x8218,\n\t1846:  0x4E38,\n\t1847:  0x542B,\n\t1848:  0x5CB8,\n\t1849:  0x5DCC,\n\t1850:  0x73A9,\n\t1851:  0x764C,\n\t1852:  0x773C,\n\t1853:  0x5CA9,\n\t1854:  0x7FEB,\n\t1855:  0x8D0B,\n\t1856:  0x96C1,\n\t1857:  0x9811,\n\t1858:  0x9854,\n\t1859:  0x9858,\n\t1860:  0x4F01,\n\t1861:  0x4F0E,\n\t1862:  0x5371,\n\t1863:  0x559C,\n\t1864:  0x5668,\n\t1865:  0x57FA,\n\t1866:  0x5947,\n\t1867:  0x5B09,\n\t1868:  0x5BC4,\n\t1869:  0x5C90,\n\t1870:  0x5E0C,\n\t1871:  0x5E7E,\n\t1872:  0x5FCC,\n\t1873:  0x63EE,\n\t1874:  0x673A,\n\t1875:  0x65D7,\n\t1876:  0x65E2,\n\t1877:  0x671F,\n\t1878:  0x68CB,\n\t1879:  0x68C4,\n\t1880:  0x6A5F,\n\t1881:  0x5E30,\n\t1882:  0x6BC5,\n\t1883:  0x6C17,\n\t1884:  0x6C7D,\n\t1885:  0x757F,\n\t1886:  0x7948,\n\t1887:  0x5B63,\n\t1888:  0x7A00,\n\t1889:  0x7D00,\n\t1890:  0x5FBD,\n\t1891:  0x898F,\n\t1892:  0x8A18,\n\t1893:  0x8CB4,\n\t1894:  0x8D77,\n\t1895:  0x8ECC,\n\t1896:  0x8F1D,\n\t1897:  0x98E2,\n\t1898:  0x9A0E,\n\t1899:  0x9B3C,\n\t1900:  0x4E80,\n\t1901:  0x507D,\n\t1902:  0x5100,\n\t1903:  0x5993,\n\t1904:  0x5B9C,\n\t1905:  0x622F,\n\t1906:  0x6280,\n\t1907:  0x64EC,\n\t1908:  0x6B3A,\n\t1909:  0x72A0,\n\t1910:  0x7591,\n\t1911:  0x7947,\n\t1912:  0x7FA9,\n\t1913:  0x87FB,\n\t1914:  0x8ABC,\n\t1915:  0x8B70,\n\t1916:  0x63AC,\n\t1917:  0x83CA,\n\t1918:  0x97A0,\n\t1919:  0x5409,\n\t1920:  0x5403,\n\t1921:  0x55AB,\n\t1922:  0x6854,\n\t1923:  0x6A58,\n\t1924:  0x8A70,\n\t1925:  0x7827,\n\t1926:  0x6775,\n\t1927:  0x9ECD,\n\t1928:  0x5374,\n\t1929:  0x5BA2,\n\t1930:  0x811A,\n\t1931:  0x8650,\n\t1932:  0x9006,\n\t1933:  0x4E18,\n\t1934:  0x4E45,\n\t1935:  0x4EC7,\n\t1936:  0x4F11,\n\t1937:  0x53CA,\n\t1938:  0x5438,\n\t1939:  0x5BAE,\n\t1940:  0x5F13,\n\t1941:  0x6025,\n\t1942:  0x6551,\n\t1943:  0x673D,\n\t1944:  0x6C42,\n\t1945:  0x6C72,\n\t1946:  0x6CE3,\n\t1947:  0x7078,\n\t1948:  0x7403,\n\t1949:  0x7A76,\n\t1950:  0x7AAE,\n\t1951:  0x7B08,\n\t1952:  0x7D1A,\n\t1953:  0x7CFE,\n\t1954:  0x7D66,\n\t1955:  0x65E7,\n\t1956:  0x725B,\n\t1957:  0x53BB,\n\t1958:  0x5C45,\n\t1959:  0x5DE8,\n\t1960:  0x62D2,\n\t1961:  0x62E0,\n\t1962:  0x6319,\n\t1963:  0x6E20,\n\t1964:  0x865A,\n\t1965:  0x8A31,\n\t1966:  0x8DDD,\n\t1967:  0x92F8,\n\t1968:  0x6F01,\n\t1969:  0x79A6,\n\t1970:  0x9B5A,\n\t1971:  0x4EA8,\n\t1972:  0x4EAB,\n\t1973:  0x4EAC,\n\t1974:  0x4F9B,\n\t1975:  0x4FA0,\n\t1976:  0x50D1,\n\t1977:  0x5147,\n\t1978:  0x7AF6,\n\t1979:  0x5171,\n\t1980:  0x51F6,\n\t1981:  0x5354,\n\t1982:  0x5321,\n\t1983:  0x537F,\n\t1984:  0x53EB,\n\t1985:  0x55AC,\n\t1986:  0x5883,\n\t1987:  0x5CE1,\n\t1988:  0x5F37,\n\t1989:  0x5F4A,\n\t1990:  0x602F,\n\t1991:  0x6050,\n\t1992:  0x606D,\n\t1993:  0x631F,\n\t1994:  0x6559,\n\t1995:  0x6A4B,\n\t1996:  0x6CC1,\n\t1997:  0x72C2,\n\t1998:  0x72ED,\n\t1999:  0x77EF,\n\t2000:  0x80F8,\n\t2001:  0x8105,\n\t2002:  0x8208,\n\t2003:  0x854E,\n\t2004:  0x90F7,\n\t2005:  0x93E1,\n\t2006:  0x97FF,\n\t2007:  0x9957,\n\t2008:  0x9A5A,\n\t2009:  0x4EF0,\n\t2010:  0x51DD,\n\t2011:  0x5C2D,\n\t2012:  0x6681,\n\t2013:  0x696D,\n\t2014:  0x5C40,\n\t2015:  0x66F2,\n\t2016:  0x6975,\n\t2017:  0x7389,\n\t2018:  0x6850,\n\t2019:  0x7C81,\n\t2020:  0x50C5,\n\t2021:  0x52E4,\n\t2022:  0x5747,\n\t2023:  0x5DFE,\n\t2024:  0x9326,\n\t2025:  0x65A4,\n\t2026:  0x6B23,\n\t2027:  0x6B3D,\n\t2028:  0x7434,\n\t2029:  0x7981,\n\t2030:  0x79BD,\n\t2031:  0x7B4B,\n\t2032:  0x7DCA,\n\t2033:  0x82B9,\n\t2034:  0x83CC,\n\t2035:  0x887F,\n\t2036:  0x895F,\n\t2037:  0x8B39,\n\t2038:  0x8FD1,\n\t2039:  0x91D1,\n\t2040:  0x541F,\n\t2041:  0x9280,\n\t2042:  0x4E5D,\n\t2043:  0x5036,\n\t2044:  0x53E5,\n\t2045:  0x533A,\n\t2046:  0x72D7,\n\t2047:  0x7396,\n\t2048:  0x77E9,\n\t2049:  0x82E6,\n\t2050:  0x8EAF,\n\t2051:  0x99C6,\n\t2052:  0x99C8,\n\t2053:  0x99D2,\n\t2054:  0x5177,\n\t2055:  0x611A,\n\t2056:  0x865E,\n\t2057:  0x55B0,\n\t2058:  0x7A7A,\n\t2059:  0x5076,\n\t2060:  0x5BD3,\n\t2061:  0x9047,\n\t2062:  0x9685,\n\t2063:  0x4E32,\n\t2064:  0x6ADB,\n\t2065:  0x91E7,\n\t2066:  0x5C51,\n\t2067:  0x5C48,\n\t2068:  0x6398,\n\t2069:  0x7A9F,\n\t2070:  0x6C93,\n\t2071:  0x9774,\n\t2072:  0x8F61,\n\t2073:  0x7AAA,\n\t2074:  0x718A,\n\t2075:  0x9688,\n\t2076:  0x7C82,\n\t2077:  0x6817,\n\t2078:  0x7E70,\n\t2079:  0x6851,\n\t2080:  0x936C,\n\t2081:  0x52F2,\n\t2082:  0x541B,\n\t2083:  0x85AB,\n\t2084:  0x8A13,\n\t2085:  0x7FA4,\n\t2086:  0x8ECD,\n\t2087:  0x90E1,\n\t2088:  0x5366,\n\t2089:  0x8888,\n\t2090:  0x7941,\n\t2091:  0x4FC2,\n\t2092:  0x50BE,\n\t2093:  0x5211,\n\t2094:  0x5144,\n\t2095:  0x5553,\n\t2096:  0x572D,\n\t2097:  0x73EA,\n\t2098:  0x578B,\n\t2099:  0x5951,\n\t2100:  0x5F62,\n\t2101:  0x5F84,\n\t2102:  0x6075,\n\t2103:  0x6176,\n\t2104:  0x6167,\n\t2105:  0x61A9,\n\t2106:  0x63B2,\n\t2107:  0x643A,\n\t2108:  0x656C,\n\t2109:  0x666F,\n\t2110:  0x6842,\n\t2111:  0x6E13,\n\t2112:  0x7566,\n\t2113:  0x7A3D,\n\t2114:  0x7CFB,\n\t2115:  0x7D4C,\n\t2116:  0x7D99,\n\t2117:  0x7E4B,\n\t2118:  0x7F6B,\n\t2119:  0x830E,\n\t2120:  0x834A,\n\t2121:  0x86CD,\n\t2122:  0x8A08,\n\t2123:  0x8A63,\n\t2124:  0x8B66,\n\t2125:  0x8EFD,\n\t2126:  0x981A,\n\t2127:  0x9D8F,\n\t2128:  0x82B8,\n\t2129:  0x8FCE,\n\t2130:  0x9BE8,\n\t2131:  0x5287,\n\t2132:  0x621F,\n\t2133:  0x6483,\n\t2134:  0x6FC0,\n\t2135:  0x9699,\n\t2136:  0x6841,\n\t2137:  0x5091,\n\t2138:  0x6B20,\n\t2139:  0x6C7A,\n\t2140:  0x6F54,\n\t2141:  0x7A74,\n\t2142:  0x7D50,\n\t2143:  0x8840,\n\t2144:  0x8A23,\n\t2145:  0x6708,\n\t2146:  0x4EF6,\n\t2147:  0x5039,\n\t2148:  0x5026,\n\t2149:  0x5065,\n\t2150:  0x517C,\n\t2151:  0x5238,\n\t2152:  0x5263,\n\t2153:  0x55A7,\n\t2154:  0x570F,\n\t2155:  0x5805,\n\t2156:  0x5ACC,\n\t2157:  0x5EFA,\n\t2158:  0x61B2,\n\t2159:  0x61F8,\n\t2160:  0x62F3,\n\t2161:  0x6372,\n\t2162:  0x691C,\n\t2163:  0x6A29,\n\t2164:  0x727D,\n\t2165:  0x72AC,\n\t2166:  0x732E,\n\t2167:  0x7814,\n\t2168:  0x786F,\n\t2169:  0x7D79,\n\t2170:  0x770C,\n\t2171:  0x80A9,\n\t2172:  0x898B,\n\t2173:  0x8B19,\n\t2174:  0x8CE2,\n\t2175:  0x8ED2,\n\t2176:  0x9063,\n\t2177:  0x9375,\n\t2178:  0x967A,\n\t2179:  0x9855,\n\t2180:  0x9A13,\n\t2181:  0x9E78,\n\t2182:  0x5143,\n\t2183:  0x539F,\n\t2184:  0x53B3,\n\t2185:  0x5E7B,\n\t2186:  0x5F26,\n\t2187:  0x6E1B,\n\t2188:  0x6E90,\n\t2189:  0x7384,\n\t2190:  0x73FE,\n\t2191:  0x7D43,\n\t2192:  0x8237,\n\t2193:  0x8A00,\n\t2194:  0x8AFA,\n\t2195:  0x9650,\n\t2196:  0x4E4E,\n\t2197:  0x500B,\n\t2198:  0x53E4,\n\t2199:  0x547C,\n\t2200:  0x56FA,\n\t2201:  0x59D1,\n\t2202:  0x5B64,\n\t2203:  0x5DF1,\n\t2204:  0x5EAB,\n\t2205:  0x5F27,\n\t2206:  0x6238,\n\t2207:  0x6545,\n\t2208:  0x67AF,\n\t2209:  0x6E56,\n\t2210:  0x72D0,\n\t2211:  0x7CCA,\n\t2212:  0x88B4,\n\t2213:  0x80A1,\n\t2214:  0x80E1,\n\t2215:  0x83F0,\n\t2216:  0x864E,\n\t2217:  0x8A87,\n\t2218:  0x8DE8,\n\t2219:  0x9237,\n\t2220:  0x96C7,\n\t2221:  0x9867,\n\t2222:  0x9F13,\n\t2223:  0x4E94,\n\t2224:  0x4E92,\n\t2225:  0x4F0D,\n\t2226:  0x5348,\n\t2227:  0x5449,\n\t2228:  0x543E,\n\t2229:  0x5A2F,\n\t2230:  0x5F8C,\n\t2231:  0x5FA1,\n\t2232:  0x609F,\n\t2233:  0x68A7,\n\t2234:  0x6A8E,\n\t2235:  0x745A,\n\t2236:  0x7881,\n\t2237:  0x8A9E,\n\t2238:  0x8AA4,\n\t2239:  0x8B77,\n\t2240:  0x9190,\n\t2241:  0x4E5E,\n\t2242:  0x9BC9,\n\t2243:  0x4EA4,\n\t2244:  0x4F7C,\n\t2245:  0x4FAF,\n\t2246:  0x5019,\n\t2247:  0x5016,\n\t2248:  0x5149,\n\t2249:  0x516C,\n\t2250:  0x529F,\n\t2251:  0x52B9,\n\t2252:  0x52FE,\n\t2253:  0x539A,\n\t2254:  0x53E3,\n\t2255:  0x5411,\n\t2256:  0x540E,\n\t2257:  0x5589,\n\t2258:  0x5751,\n\t2259:  0x57A2,\n\t2260:  0x597D,\n\t2261:  0x5B54,\n\t2262:  0x5B5D,\n\t2263:  0x5B8F,\n\t2264:  0x5DE5,\n\t2265:  0x5DE7,\n\t2266:  0x5DF7,\n\t2267:  0x5E78,\n\t2268:  0x5E83,\n\t2269:  0x5E9A,\n\t2270:  0x5EB7,\n\t2271:  0x5F18,\n\t2272:  0x6052,\n\t2273:  0x614C,\n\t2274:  0x6297,\n\t2275:  0x62D8,\n\t2276:  0x63A7,\n\t2277:  0x653B,\n\t2278:  0x6602,\n\t2279:  0x6643,\n\t2280:  0x66F4,\n\t2281:  0x676D,\n\t2282:  0x6821,\n\t2283:  0x6897,\n\t2284:  0x69CB,\n\t2285:  0x6C5F,\n\t2286:  0x6D2A,\n\t2287:  0x6D69,\n\t2288:  0x6E2F,\n\t2289:  0x6E9D,\n\t2290:  0x7532,\n\t2291:  0x7687,\n\t2292:  0x786C,\n\t2293:  0x7A3F,\n\t2294:  0x7CE0,\n\t2295:  0x7D05,\n\t2296:  0x7D18,\n\t2297:  0x7D5E,\n\t2298:  0x7DB1,\n\t2299:  0x8015,\n\t2300:  0x8003,\n\t2301:  0x80AF,\n\t2302:  0x80B1,\n\t2303:  0x8154,\n\t2304:  0x818F,\n\t2305:  0x822A,\n\t2306:  0x8352,\n\t2307:  0x884C,\n\t2308:  0x8861,\n\t2309:  0x8B1B,\n\t2310:  0x8CA2,\n\t2311:  0x8CFC,\n\t2312:  0x90CA,\n\t2313:  0x9175,\n\t2314:  0x9271,\n\t2315:  0x783F,\n\t2316:  0x92FC,\n\t2317:  0x95A4,\n\t2318:  0x964D,\n\t2319:  0x9805,\n\t2320:  0x9999,\n\t2321:  0x9AD8,\n\t2322:  0x9D3B,\n\t2323:  0x525B,\n\t2324:  0x52AB,\n\t2325:  0x53F7,\n\t2326:  0x5408,\n\t2327:  0x58D5,\n\t2328:  0x62F7,\n\t2329:  0x6FE0,\n\t2330:  0x8C6A,\n\t2331:  0x8F5F,\n\t2332:  0x9EB9,\n\t2333:  0x514B,\n\t2334:  0x523B,\n\t2335:  0x544A,\n\t2336:  0x56FD,\n\t2337:  0x7A40,\n\t2338:  0x9177,\n\t2339:  0x9D60,\n\t2340:  0x9ED2,\n\t2341:  0x7344,\n\t2342:  0x6F09,\n\t2343:  0x8170,\n\t2344:  0x7511,\n\t2345:  0x5FFD,\n\t2346:  0x60DA,\n\t2347:  0x9AA8,\n\t2348:  0x72DB,\n\t2349:  0x8FBC,\n\t2350:  0x6B64,\n\t2351:  0x9803,\n\t2352:  0x4ECA,\n\t2353:  0x56F0,\n\t2354:  0x5764,\n\t2355:  0x58BE,\n\t2356:  0x5A5A,\n\t2357:  0x6068,\n\t2358:  0x61C7,\n\t2359:  0x660F,\n\t2360:  0x6606,\n\t2361:  0x6839,\n\t2362:  0x68B1,\n\t2363:  0x6DF7,\n\t2364:  0x75D5,\n\t2365:  0x7D3A,\n\t2366:  0x826E,\n\t2367:  0x9B42,\n\t2368:  0x4E9B,\n\t2369:  0x4F50,\n\t2370:  0x53C9,\n\t2371:  0x5506,\n\t2372:  0x5D6F,\n\t2373:  0x5DE6,\n\t2374:  0x5DEE,\n\t2375:  0x67FB,\n\t2376:  0x6C99,\n\t2377:  0x7473,\n\t2378:  0x7802,\n\t2379:  0x8A50,\n\t2380:  0x9396,\n\t2381:  0x88DF,\n\t2382:  0x5750,\n\t2383:  0x5EA7,\n\t2384:  0x632B,\n\t2385:  0x50B5,\n\t2386:  0x50AC,\n\t2387:  0x518D,\n\t2388:  0x6700,\n\t2389:  0x54C9,\n\t2390:  0x585E,\n\t2391:  0x59BB,\n\t2392:  0x5BB0,\n\t2393:  0x5F69,\n\t2394:  0x624D,\n\t2395:  0x63A1,\n\t2396:  0x683D,\n\t2397:  0x6B73,\n\t2398:  0x6E08,\n\t2399:  0x707D,\n\t2400:  0x91C7,\n\t2401:  0x7280,\n\t2402:  0x7815,\n\t2403:  0x7826,\n\t2404:  0x796D,\n\t2405:  0x658E,\n\t2406:  0x7D30,\n\t2407:  0x83DC,\n\t2408:  0x88C1,\n\t2409:  0x8F09,\n\t2410:  0x969B,\n\t2411:  0x5264,\n\t2412:  0x5728,\n\t2413:  0x6750,\n\t2414:  0x7F6A,\n\t2415:  0x8CA1,\n\t2416:  0x51B4,\n\t2417:  0x5742,\n\t2418:  0x962A,\n\t2419:  0x583A,\n\t2420:  0x698A,\n\t2421:  0x80B4,\n\t2422:  0x54B2,\n\t2423:  0x5D0E,\n\t2424:  0x57FC,\n\t2425:  0x7895,\n\t2426:  0x9DFA,\n\t2427:  0x4F5C,\n\t2428:  0x524A,\n\t2429:  0x548B,\n\t2430:  0x643E,\n\t2431:  0x6628,\n\t2432:  0x6714,\n\t2433:  0x67F5,\n\t2434:  0x7A84,\n\t2435:  0x7B56,\n\t2436:  0x7D22,\n\t2437:  0x932F,\n\t2438:  0x685C,\n\t2439:  0x9BAD,\n\t2440:  0x7B39,\n\t2441:  0x5319,\n\t2442:  0x518A,\n\t2443:  0x5237,\n\t2444:  0x5BDF,\n\t2445:  0x62F6,\n\t2446:  0x64AE,\n\t2447:  0x64E6,\n\t2448:  0x672D,\n\t2449:  0x6BBA,\n\t2450:  0x85A9,\n\t2451:  0x96D1,\n\t2452:  0x7690,\n\t2453:  0x9BD6,\n\t2454:  0x634C,\n\t2455:  0x9306,\n\t2456:  0x9BAB,\n\t2457:  0x76BF,\n\t2458:  0x6652,\n\t2459:  0x4E09,\n\t2460:  0x5098,\n\t2461:  0x53C2,\n\t2462:  0x5C71,\n\t2463:  0x60E8,\n\t2464:  0x6492,\n\t2465:  0x6563,\n\t2466:  0x685F,\n\t2467:  0x71E6,\n\t2468:  0x73CA,\n\t2469:  0x7523,\n\t2470:  0x7B97,\n\t2471:  0x7E82,\n\t2472:  0x8695,\n\t2473:  0x8B83,\n\t2474:  0x8CDB,\n\t2475:  0x9178,\n\t2476:  0x9910,\n\t2477:  0x65AC,\n\t2478:  0x66AB,\n\t2479:  0x6B8B,\n\t2480:  0x4ED5,\n\t2481:  0x4ED4,\n\t2482:  0x4F3A,\n\t2483:  0x4F7F,\n\t2484:  0x523A,\n\t2485:  0x53F8,\n\t2486:  0x53F2,\n\t2487:  0x55E3,\n\t2488:  0x56DB,\n\t2489:  0x58EB,\n\t2490:  0x59CB,\n\t2491:  0x59C9,\n\t2492:  0x59FF,\n\t2493:  0x5B50,\n\t2494:  0x5C4D,\n\t2495:  0x5E02,\n\t2496:  0x5E2B,\n\t2497:  0x5FD7,\n\t2498:  0x601D,\n\t2499:  0x6307,\n\t2500:  0x652F,\n\t2501:  0x5B5C,\n\t2502:  0x65AF,\n\t2503:  0x65BD,\n\t2504:  0x65E8,\n\t2505:  0x679D,\n\t2506:  0x6B62,\n\t2507:  0x6B7B,\n\t2508:  0x6C0F,\n\t2509:  0x7345,\n\t2510:  0x7949,\n\t2511:  0x79C1,\n\t2512:  0x7CF8,\n\t2513:  0x7D19,\n\t2514:  0x7D2B,\n\t2515:  0x80A2,\n\t2516:  0x8102,\n\t2517:  0x81F3,\n\t2518:  0x8996,\n\t2519:  0x8A5E,\n\t2520:  0x8A69,\n\t2521:  0x8A66,\n\t2522:  0x8A8C,\n\t2523:  0x8AEE,\n\t2524:  0x8CC7,\n\t2525:  0x8CDC,\n\t2526:  0x96CC,\n\t2527:  0x98FC,\n\t2528:  0x6B6F,\n\t2529:  0x4E8B,\n\t2530:  0x4F3C,\n\t2531:  0x4F8D,\n\t2532:  0x5150,\n\t2533:  0x5B57,\n\t2534:  0x5BFA,\n\t2535:  0x6148,\n\t2536:  0x6301,\n\t2537:  0x6642,\n\t2538:  0x6B21,\n\t2539:  0x6ECB,\n\t2540:  0x6CBB,\n\t2541:  0x723E,\n\t2542:  0x74BD,\n\t2543:  0x75D4,\n\t2544:  0x78C1,\n\t2545:  0x793A,\n\t2546:  0x800C,\n\t2547:  0x8033,\n\t2548:  0x81EA,\n\t2549:  0x8494,\n\t2550:  0x8F9E,\n\t2551:  0x6C50,\n\t2552:  0x9E7F,\n\t2553:  0x5F0F,\n\t2554:  0x8B58,\n\t2555:  0x9D2B,\n\t2556:  0x7AFA,\n\t2557:  0x8EF8,\n\t2558:  0x5B8D,\n\t2559:  0x96EB,\n\t2560:  0x4E03,\n\t2561:  0x53F1,\n\t2562:  0x57F7,\n\t2563:  0x5931,\n\t2564:  0x5AC9,\n\t2565:  0x5BA4,\n\t2566:  0x6089,\n\t2567:  0x6E7F,\n\t2568:  0x6F06,\n\t2569:  0x75BE,\n\t2570:  0x8CEA,\n\t2571:  0x5B9F,\n\t2572:  0x8500,\n\t2573:  0x7BE0,\n\t2574:  0x5072,\n\t2575:  0x67F4,\n\t2576:  0x829D,\n\t2577:  0x5C61,\n\t2578:  0x854A,\n\t2579:  0x7E1E,\n\t2580:  0x820E,\n\t2581:  0x5199,\n\t2582:  0x5C04,\n\t2583:  0x6368,\n\t2584:  0x8D66,\n\t2585:  0x659C,\n\t2586:  0x716E,\n\t2587:  0x793E,\n\t2588:  0x7D17,\n\t2589:  0x8005,\n\t2590:  0x8B1D,\n\t2591:  0x8ECA,\n\t2592:  0x906E,\n\t2593:  0x86C7,\n\t2594:  0x90AA,\n\t2595:  0x501F,\n\t2596:  0x52FA,\n\t2597:  0x5C3A,\n\t2598:  0x6753,\n\t2599:  0x707C,\n\t2600:  0x7235,\n\t2601:  0x914C,\n\t2602:  0x91C8,\n\t2603:  0x932B,\n\t2604:  0x82E5,\n\t2605:  0x5BC2,\n\t2606:  0x5F31,\n\t2607:  0x60F9,\n\t2608:  0x4E3B,\n\t2609:  0x53D6,\n\t2610:  0x5B88,\n\t2611:  0x624B,\n\t2612:  0x6731,\n\t2613:  0x6B8A,\n\t2614:  0x72E9,\n\t2615:  0x73E0,\n\t2616:  0x7A2E,\n\t2617:  0x816B,\n\t2618:  0x8DA3,\n\t2619:  0x9152,\n\t2620:  0x9996,\n\t2621:  0x5112,\n\t2622:  0x53D7,\n\t2623:  0x546A,\n\t2624:  0x5BFF,\n\t2625:  0x6388,\n\t2626:  0x6A39,\n\t2627:  0x7DAC,\n\t2628:  0x9700,\n\t2629:  0x56DA,\n\t2630:  0x53CE,\n\t2631:  0x5468,\n\t2632:  0x5B97,\n\t2633:  0x5C31,\n\t2634:  0x5DDE,\n\t2635:  0x4FEE,\n\t2636:  0x6101,\n\t2637:  0x62FE,\n\t2638:  0x6D32,\n\t2639:  0x79C0,\n\t2640:  0x79CB,\n\t2641:  0x7D42,\n\t2642:  0x7E4D,\n\t2643:  0x7FD2,\n\t2644:  0x81ED,\n\t2645:  0x821F,\n\t2646:  0x8490,\n\t2647:  0x8846,\n\t2648:  0x8972,\n\t2649:  0x8B90,\n\t2650:  0x8E74,\n\t2651:  0x8F2F,\n\t2652:  0x9031,\n\t2653:  0x914B,\n\t2654:  0x916C,\n\t2655:  0x96C6,\n\t2656:  0x919C,\n\t2657:  0x4EC0,\n\t2658:  0x4F4F,\n\t2659:  0x5145,\n\t2660:  0x5341,\n\t2661:  0x5F93,\n\t2662:  0x620E,\n\t2663:  0x67D4,\n\t2664:  0x6C41,\n\t2665:  0x6E0B,\n\t2666:  0x7363,\n\t2667:  0x7E26,\n\t2668:  0x91CD,\n\t2669:  0x9283,\n\t2670:  0x53D4,\n\t2671:  0x5919,\n\t2672:  0x5BBF,\n\t2673:  0x6DD1,\n\t2674:  0x795D,\n\t2675:  0x7E2E,\n\t2676:  0x7C9B,\n\t2677:  0x587E,\n\t2678:  0x719F,\n\t2679:  0x51FA,\n\t2680:  0x8853,\n\t2681:  0x8FF0,\n\t2682:  0x4FCA,\n\t2683:  0x5CFB,\n\t2684:  0x6625,\n\t2685:  0x77AC,\n\t2686:  0x7AE3,\n\t2687:  0x821C,\n\t2688:  0x99FF,\n\t2689:  0x51C6,\n\t2690:  0x5FAA,\n\t2691:  0x65EC,\n\t2692:  0x696F,\n\t2693:  0x6B89,\n\t2694:  0x6DF3,\n\t2695:  0x6E96,\n\t2696:  0x6F64,\n\t2697:  0x76FE,\n\t2698:  0x7D14,\n\t2699:  0x5DE1,\n\t2700:  0x9075,\n\t2701:  0x9187,\n\t2702:  0x9806,\n\t2703:  0x51E6,\n\t2704:  0x521D,\n\t2705:  0x6240,\n\t2706:  0x6691,\n\t2707:  0x66D9,\n\t2708:  0x6E1A,\n\t2709:  0x5EB6,\n\t2710:  0x7DD2,\n\t2711:  0x7F72,\n\t2712:  0x66F8,\n\t2713:  0x85AF,\n\t2714:  0x85F7,\n\t2715:  0x8AF8,\n\t2716:  0x52A9,\n\t2717:  0x53D9,\n\t2718:  0x5973,\n\t2719:  0x5E8F,\n\t2720:  0x5F90,\n\t2721:  0x6055,\n\t2722:  0x92E4,\n\t2723:  0x9664,\n\t2724:  0x50B7,\n\t2725:  0x511F,\n\t2726:  0x52DD,\n\t2727:  0x5320,\n\t2728:  0x5347,\n\t2729:  0x53EC,\n\t2730:  0x54E8,\n\t2731:  0x5546,\n\t2732:  0x5531,\n\t2733:  0x5617,\n\t2734:  0x5968,\n\t2735:  0x59BE,\n\t2736:  0x5A3C,\n\t2737:  0x5BB5,\n\t2738:  0x5C06,\n\t2739:  0x5C0F,\n\t2740:  0x5C11,\n\t2741:  0x5C1A,\n\t2742:  0x5E84,\n\t2743:  0x5E8A,\n\t2744:  0x5EE0,\n\t2745:  0x5F70,\n\t2746:  0x627F,\n\t2747:  0x6284,\n\t2748:  0x62DB,\n\t2749:  0x638C,\n\t2750:  0x6377,\n\t2751:  0x6607,\n\t2752:  0x660C,\n\t2753:  0x662D,\n\t2754:  0x6676,\n\t2755:  0x677E,\n\t2756:  0x68A2,\n\t2757:  0x6A1F,\n\t2758:  0x6A35,\n\t2759:  0x6CBC,\n\t2760:  0x6D88,\n\t2761:  0x6E09,\n\t2762:  0x6E58,\n\t2763:  0x713C,\n\t2764:  0x7126,\n\t2765:  0x7167,\n\t2766:  0x75C7,\n\t2767:  0x7701,\n\t2768:  0x785D,\n\t2769:  0x7901,\n\t2770:  0x7965,\n\t2771:  0x79F0,\n\t2772:  0x7AE0,\n\t2773:  0x7B11,\n\t2774:  0x7CA7,\n\t2775:  0x7D39,\n\t2776:  0x8096,\n\t2777:  0x83D6,\n\t2778:  0x848B,\n\t2779:  0x8549,\n\t2780:  0x885D,\n\t2781:  0x88F3,\n\t2782:  0x8A1F,\n\t2783:  0x8A3C,\n\t2784:  0x8A54,\n\t2785:  0x8A73,\n\t2786:  0x8C61,\n\t2787:  0x8CDE,\n\t2788:  0x91A4,\n\t2789:  0x9266,\n\t2790:  0x937E,\n\t2791:  0x9418,\n\t2792:  0x969C,\n\t2793:  0x9798,\n\t2794:  0x4E0A,\n\t2795:  0x4E08,\n\t2796:  0x4E1E,\n\t2797:  0x4E57,\n\t2798:  0x5197,\n\t2799:  0x5270,\n\t2800:  0x57CE,\n\t2801:  0x5834,\n\t2802:  0x58CC,\n\t2803:  0x5B22,\n\t2804:  0x5E38,\n\t2805:  0x60C5,\n\t2806:  0x64FE,\n\t2807:  0x6761,\n\t2808:  0x6756,\n\t2809:  0x6D44,\n\t2810:  0x72B6,\n\t2811:  0x7573,\n\t2812:  0x7A63,\n\t2813:  0x84B8,\n\t2814:  0x8B72,\n\t2815:  0x91B8,\n\t2816:  0x9320,\n\t2817:  0x5631,\n\t2818:  0x57F4,\n\t2819:  0x98FE,\n\t2820:  0x62ED,\n\t2821:  0x690D,\n\t2822:  0x6B96,\n\t2823:  0x71ED,\n\t2824:  0x7E54,\n\t2825:  0x8077,\n\t2826:  0x8272,\n\t2827:  0x89E6,\n\t2828:  0x98DF,\n\t2829:  0x8755,\n\t2830:  0x8FB1,\n\t2831:  0x5C3B,\n\t2832:  0x4F38,\n\t2833:  0x4FE1,\n\t2834:  0x4FB5,\n\t2835:  0x5507,\n\t2836:  0x5A20,\n\t2837:  0x5BDD,\n\t2838:  0x5BE9,\n\t2839:  0x5FC3,\n\t2840:  0x614E,\n\t2841:  0x632F,\n\t2842:  0x65B0,\n\t2843:  0x664B,\n\t2844:  0x68EE,\n\t2845:  0x699B,\n\t2846:  0x6D78,\n\t2847:  0x6DF1,\n\t2848:  0x7533,\n\t2849:  0x75B9,\n\t2850:  0x771F,\n\t2851:  0x795E,\n\t2852:  0x79E6,\n\t2853:  0x7D33,\n\t2854:  0x81E3,\n\t2855:  0x82AF,\n\t2856:  0x85AA,\n\t2857:  0x89AA,\n\t2858:  0x8A3A,\n\t2859:  0x8EAB,\n\t2860:  0x8F9B,\n\t2861:  0x9032,\n\t2862:  0x91DD,\n\t2863:  0x9707,\n\t2864:  0x4EBA,\n\t2865:  0x4EC1,\n\t2866:  0x5203,\n\t2867:  0x5875,\n\t2868:  0x58EC,\n\t2869:  0x5C0B,\n\t2870:  0x751A,\n\t2871:  0x5C3D,\n\t2872:  0x814E,\n\t2873:  0x8A0A,\n\t2874:  0x8FC5,\n\t2875:  0x9663,\n\t2876:  0x976D,\n\t2877:  0x7B25,\n\t2878:  0x8ACF,\n\t2879:  0x9808,\n\t2880:  0x9162,\n\t2881:  0x56F3,\n\t2882:  0x53A8,\n\t2883:  0x9017,\n\t2884:  0x5439,\n\t2885:  0x5782,\n\t2886:  0x5E25,\n\t2887:  0x63A8,\n\t2888:  0x6C34,\n\t2889:  0x708A,\n\t2890:  0x7761,\n\t2891:  0x7C8B,\n\t2892:  0x7FE0,\n\t2893:  0x8870,\n\t2894:  0x9042,\n\t2895:  0x9154,\n\t2896:  0x9310,\n\t2897:  0x9318,\n\t2898:  0x968F,\n\t2899:  0x745E,\n\t2900:  0x9AC4,\n\t2901:  0x5D07,\n\t2902:  0x5D69,\n\t2903:  0x6570,\n\t2904:  0x67A2,\n\t2905:  0x8DA8,\n\t2906:  0x96DB,\n\t2907:  0x636E,\n\t2908:  0x6749,\n\t2909:  0x6919,\n\t2910:  0x83C5,\n\t2911:  0x9817,\n\t2912:  0x96C0,\n\t2913:  0x88FE,\n\t2914:  0x6F84,\n\t2915:  0x647A,\n\t2916:  0x5BF8,\n\t2917:  0x4E16,\n\t2918:  0x702C,\n\t2919:  0x755D,\n\t2920:  0x662F,\n\t2921:  0x51C4,\n\t2922:  0x5236,\n\t2923:  0x52E2,\n\t2924:  0x59D3,\n\t2925:  0x5F81,\n\t2926:  0x6027,\n\t2927:  0x6210,\n\t2928:  0x653F,\n\t2929:  0x6574,\n\t2930:  0x661F,\n\t2931:  0x6674,\n\t2932:  0x68F2,\n\t2933:  0x6816,\n\t2934:  0x6B63,\n\t2935:  0x6E05,\n\t2936:  0x7272,\n\t2937:  0x751F,\n\t2938:  0x76DB,\n\t2939:  0x7CBE,\n\t2940:  0x8056,\n\t2941:  0x58F0,\n\t2942:  0x88FD,\n\t2943:  0x897F,\n\t2944:  0x8AA0,\n\t2945:  0x8A93,\n\t2946:  0x8ACB,\n\t2947:  0x901D,\n\t2948:  0x9192,\n\t2949:  0x9752,\n\t2950:  0x9759,\n\t2951:  0x6589,\n\t2952:  0x7A0E,\n\t2953:  0x8106,\n\t2954:  0x96BB,\n\t2955:  0x5E2D,\n\t2956:  0x60DC,\n\t2957:  0x621A,\n\t2958:  0x65A5,\n\t2959:  0x6614,\n\t2960:  0x6790,\n\t2961:  0x77F3,\n\t2962:  0x7A4D,\n\t2963:  0x7C4D,\n\t2964:  0x7E3E,\n\t2965:  0x810A,\n\t2966:  0x8CAC,\n\t2967:  0x8D64,\n\t2968:  0x8DE1,\n\t2969:  0x8E5F,\n\t2970:  0x78A9,\n\t2971:  0x5207,\n\t2972:  0x62D9,\n\t2973:  0x63A5,\n\t2974:  0x6442,\n\t2975:  0x6298,\n\t2976:  0x8A2D,\n\t2977:  0x7A83,\n\t2978:  0x7BC0,\n\t2979:  0x8AAC,\n\t2980:  0x96EA,\n\t2981:  0x7D76,\n\t2982:  0x820C,\n\t2983:  0x8749,\n\t2984:  0x4ED9,\n\t2985:  0x5148,\n\t2986:  0x5343,\n\t2987:  0x5360,\n\t2988:  0x5BA3,\n\t2989:  0x5C02,\n\t2990:  0x5C16,\n\t2991:  0x5DDD,\n\t2992:  0x6226,\n\t2993:  0x6247,\n\t2994:  0x64B0,\n\t2995:  0x6813,\n\t2996:  0x6834,\n\t2997:  0x6CC9,\n\t2998:  0x6D45,\n\t2999:  0x6D17,\n\t3000:  0x67D3,\n\t3001:  0x6F5C,\n\t3002:  0x714E,\n\t3003:  0x717D,\n\t3004:  0x65CB,\n\t3005:  0x7A7F,\n\t3006:  0x7BAD,\n\t3007:  0x7DDA,\n\t3008:  0x7E4A,\n\t3009:  0x7FA8,\n\t3010:  0x817A,\n\t3011:  0x821B,\n\t3012:  0x8239,\n\t3013:  0x85A6,\n\t3014:  0x8A6E,\n\t3015:  0x8CCE,\n\t3016:  0x8DF5,\n\t3017:  0x9078,\n\t3018:  0x9077,\n\t3019:  0x92AD,\n\t3020:  0x9291,\n\t3021:  0x9583,\n\t3022:  0x9BAE,\n\t3023:  0x524D,\n\t3024:  0x5584,\n\t3025:  0x6F38,\n\t3026:  0x7136,\n\t3027:  0x5168,\n\t3028:  0x7985,\n\t3029:  0x7E55,\n\t3030:  0x81B3,\n\t3031:  0x7CCE,\n\t3032:  0x564C,\n\t3033:  0x5851,\n\t3034:  0x5CA8,\n\t3035:  0x63AA,\n\t3036:  0x66FE,\n\t3037:  0x66FD,\n\t3038:  0x695A,\n\t3039:  0x72D9,\n\t3040:  0x758F,\n\t3041:  0x758E,\n\t3042:  0x790E,\n\t3043:  0x7956,\n\t3044:  0x79DF,\n\t3045:  0x7C97,\n\t3046:  0x7D20,\n\t3047:  0x7D44,\n\t3048:  0x8607,\n\t3049:  0x8A34,\n\t3050:  0x963B,\n\t3051:  0x9061,\n\t3052:  0x9F20,\n\t3053:  0x50E7,\n\t3054:  0x5275,\n\t3055:  0x53CC,\n\t3056:  0x53E2,\n\t3057:  0x5009,\n\t3058:  0x55AA,\n\t3059:  0x58EE,\n\t3060:  0x594F,\n\t3061:  0x723D,\n\t3062:  0x5B8B,\n\t3063:  0x5C64,\n\t3064:  0x531D,\n\t3065:  0x60E3,\n\t3066:  0x60F3,\n\t3067:  0x635C,\n\t3068:  0x6383,\n\t3069:  0x633F,\n\t3070:  0x63BB,\n\t3071:  0x64CD,\n\t3072:  0x65E9,\n\t3073:  0x66F9,\n\t3074:  0x5DE3,\n\t3075:  0x69CD,\n\t3076:  0x69FD,\n\t3077:  0x6F15,\n\t3078:  0x71E5,\n\t3079:  0x4E89,\n\t3080:  0x75E9,\n\t3081:  0x76F8,\n\t3082:  0x7A93,\n\t3083:  0x7CDF,\n\t3084:  0x7DCF,\n\t3085:  0x7D9C,\n\t3086:  0x8061,\n\t3087:  0x8349,\n\t3088:  0x8358,\n\t3089:  0x846C,\n\t3090:  0x84BC,\n\t3091:  0x85FB,\n\t3092:  0x88C5,\n\t3093:  0x8D70,\n\t3094:  0x9001,\n\t3095:  0x906D,\n\t3096:  0x9397,\n\t3097:  0x971C,\n\t3098:  0x9A12,\n\t3099:  0x50CF,\n\t3100:  0x5897,\n\t3101:  0x618E,\n\t3102:  0x81D3,\n\t3103:  0x8535,\n\t3104:  0x8D08,\n\t3105:  0x9020,\n\t3106:  0x4FC3,\n\t3107:  0x5074,\n\t3108:  0x5247,\n\t3109:  0x5373,\n\t3110:  0x606F,\n\t3111:  0x6349,\n\t3112:  0x675F,\n\t3113:  0x6E2C,\n\t3114:  0x8DB3,\n\t3115:  0x901F,\n\t3116:  0x4FD7,\n\t3117:  0x5C5E,\n\t3118:  0x8CCA,\n\t3119:  0x65CF,\n\t3120:  0x7D9A,\n\t3121:  0x5352,\n\t3122:  0x8896,\n\t3123:  0x5176,\n\t3124:  0x63C3,\n\t3125:  0x5B58,\n\t3126:  0x5B6B,\n\t3127:  0x5C0A,\n\t3128:  0x640D,\n\t3129:  0x6751,\n\t3130:  0x905C,\n\t3131:  0x4ED6,\n\t3132:  0x591A,\n\t3133:  0x592A,\n\t3134:  0x6C70,\n\t3135:  0x8A51,\n\t3136:  0x553E,\n\t3137:  0x5815,\n\t3138:  0x59A5,\n\t3139:  0x60F0,\n\t3140:  0x6253,\n\t3141:  0x67C1,\n\t3142:  0x8235,\n\t3143:  0x6955,\n\t3144:  0x9640,\n\t3145:  0x99C4,\n\t3146:  0x9A28,\n\t3147:  0x4F53,\n\t3148:  0x5806,\n\t3149:  0x5BFE,\n\t3150:  0x8010,\n\t3151:  0x5CB1,\n\t3152:  0x5E2F,\n\t3153:  0x5F85,\n\t3154:  0x6020,\n\t3155:  0x614B,\n\t3156:  0x6234,\n\t3157:  0x66FF,\n\t3158:  0x6CF0,\n\t3159:  0x6EDE,\n\t3160:  0x80CE,\n\t3161:  0x817F,\n\t3162:  0x82D4,\n\t3163:  0x888B,\n\t3164:  0x8CB8,\n\t3165:  0x9000,\n\t3166:  0x902E,\n\t3167:  0x968A,\n\t3168:  0x9EDB,\n\t3169:  0x9BDB,\n\t3170:  0x4EE3,\n\t3171:  0x53F0,\n\t3172:  0x5927,\n\t3173:  0x7B2C,\n\t3174:  0x918D,\n\t3175:  0x984C,\n\t3176:  0x9DF9,\n\t3177:  0x6EDD,\n\t3178:  0x7027,\n\t3179:  0x5353,\n\t3180:  0x5544,\n\t3181:  0x5B85,\n\t3182:  0x6258,\n\t3183:  0x629E,\n\t3184:  0x62D3,\n\t3185:  0x6CA2,\n\t3186:  0x6FEF,\n\t3187:  0x7422,\n\t3188:  0x8A17,\n\t3189:  0x9438,\n\t3190:  0x6FC1,\n\t3191:  0x8AFE,\n\t3192:  0x8338,\n\t3193:  0x51E7,\n\t3194:  0x86F8,\n\t3195:  0x53EA,\n\t3196:  0x53E9,\n\t3197:  0x4F46,\n\t3198:  0x9054,\n\t3199:  0x8FB0,\n\t3200:  0x596A,\n\t3201:  0x8131,\n\t3202:  0x5DFD,\n\t3203:  0x7AEA,\n\t3204:  0x8FBF,\n\t3205:  0x68DA,\n\t3206:  0x8C37,\n\t3207:  0x72F8,\n\t3208:  0x9C48,\n\t3209:  0x6A3D,\n\t3210:  0x8AB0,\n\t3211:  0x4E39,\n\t3212:  0x5358,\n\t3213:  0x5606,\n\t3214:  0x5766,\n\t3215:  0x62C5,\n\t3216:  0x63A2,\n\t3217:  0x65E6,\n\t3218:  0x6B4E,\n\t3219:  0x6DE1,\n\t3220:  0x6E5B,\n\t3221:  0x70AD,\n\t3222:  0x77ED,\n\t3223:  0x7AEF,\n\t3224:  0x7BAA,\n\t3225:  0x7DBB,\n\t3226:  0x803D,\n\t3227:  0x80C6,\n\t3228:  0x86CB,\n\t3229:  0x8A95,\n\t3230:  0x935B,\n\t3231:  0x56E3,\n\t3232:  0x58C7,\n\t3233:  0x5F3E,\n\t3234:  0x65AD,\n\t3235:  0x6696,\n\t3236:  0x6A80,\n\t3237:  0x6BB5,\n\t3238:  0x7537,\n\t3239:  0x8AC7,\n\t3240:  0x5024,\n\t3241:  0x77E5,\n\t3242:  0x5730,\n\t3243:  0x5F1B,\n\t3244:  0x6065,\n\t3245:  0x667A,\n\t3246:  0x6C60,\n\t3247:  0x75F4,\n\t3248:  0x7A1A,\n\t3249:  0x7F6E,\n\t3250:  0x81F4,\n\t3251:  0x8718,\n\t3252:  0x9045,\n\t3253:  0x99B3,\n\t3254:  0x7BC9,\n\t3255:  0x755C,\n\t3256:  0x7AF9,\n\t3257:  0x7B51,\n\t3258:  0x84C4,\n\t3259:  0x9010,\n\t3260:  0x79E9,\n\t3261:  0x7A92,\n\t3262:  0x8336,\n\t3263:  0x5AE1,\n\t3264:  0x7740,\n\t3265:  0x4E2D,\n\t3266:  0x4EF2,\n\t3267:  0x5B99,\n\t3268:  0x5FE0,\n\t3269:  0x62BD,\n\t3270:  0x663C,\n\t3271:  0x67F1,\n\t3272:  0x6CE8,\n\t3273:  0x866B,\n\t3274:  0x8877,\n\t3275:  0x8A3B,\n\t3276:  0x914E,\n\t3277:  0x92F3,\n\t3278:  0x99D0,\n\t3279:  0x6A17,\n\t3280:  0x7026,\n\t3281:  0x732A,\n\t3282:  0x82E7,\n\t3283:  0x8457,\n\t3284:  0x8CAF,\n\t3285:  0x4E01,\n\t3286:  0x5146,\n\t3287:  0x51CB,\n\t3288:  0x558B,\n\t3289:  0x5BF5,\n\t3290:  0x5E16,\n\t3291:  0x5E33,\n\t3292:  0x5E81,\n\t3293:  0x5F14,\n\t3294:  0x5F35,\n\t3295:  0x5F6B,\n\t3296:  0x5FB4,\n\t3297:  0x61F2,\n\t3298:  0x6311,\n\t3299:  0x66A2,\n\t3300:  0x671D,\n\t3301:  0x6F6E,\n\t3302:  0x7252,\n\t3303:  0x753A,\n\t3304:  0x773A,\n\t3305:  0x8074,\n\t3306:  0x8139,\n\t3307:  0x8178,\n\t3308:  0x8776,\n\t3309:  0x8ABF,\n\t3310:  0x8ADC,\n\t3311:  0x8D85,\n\t3312:  0x8DF3,\n\t3313:  0x929A,\n\t3314:  0x9577,\n\t3315:  0x9802,\n\t3316:  0x9CE5,\n\t3317:  0x52C5,\n\t3318:  0x6357,\n\t3319:  0x76F4,\n\t3320:  0x6715,\n\t3321:  0x6C88,\n\t3322:  0x73CD,\n\t3323:  0x8CC3,\n\t3324:  0x93AE,\n\t3325:  0x9673,\n\t3326:  0x6D25,\n\t3327:  0x589C,\n\t3328:  0x690E,\n\t3329:  0x69CC,\n\t3330:  0x8FFD,\n\t3331:  0x939A,\n\t3332:  0x75DB,\n\t3333:  0x901A,\n\t3334:  0x585A,\n\t3335:  0x6802,\n\t3336:  0x63B4,\n\t3337:  0x69FB,\n\t3338:  0x4F43,\n\t3339:  0x6F2C,\n\t3340:  0x67D8,\n\t3341:  0x8FBB,\n\t3342:  0x8526,\n\t3343:  0x7DB4,\n\t3344:  0x9354,\n\t3345:  0x693F,\n\t3346:  0x6F70,\n\t3347:  0x576A,\n\t3348:  0x58F7,\n\t3349:  0x5B2C,\n\t3350:  0x7D2C,\n\t3351:  0x722A,\n\t3352:  0x540A,\n\t3353:  0x91E3,\n\t3354:  0x9DB4,\n\t3355:  0x4EAD,\n\t3356:  0x4F4E,\n\t3357:  0x505C,\n\t3358:  0x5075,\n\t3359:  0x5243,\n\t3360:  0x8C9E,\n\t3361:  0x5448,\n\t3362:  0x5824,\n\t3363:  0x5B9A,\n\t3364:  0x5E1D,\n\t3365:  0x5E95,\n\t3366:  0x5EAD,\n\t3367:  0x5EF7,\n\t3368:  0x5F1F,\n\t3369:  0x608C,\n\t3370:  0x62B5,\n\t3371:  0x633A,\n\t3372:  0x63D0,\n\t3373:  0x68AF,\n\t3374:  0x6C40,\n\t3375:  0x7887,\n\t3376:  0x798E,\n\t3377:  0x7A0B,\n\t3378:  0x7DE0,\n\t3379:  0x8247,\n\t3380:  0x8A02,\n\t3381:  0x8AE6,\n\t3382:  0x8E44,\n\t3383:  0x9013,\n\t3384:  0x90B8,\n\t3385:  0x912D,\n\t3386:  0x91D8,\n\t3387:  0x9F0E,\n\t3388:  0x6CE5,\n\t3389:  0x6458,\n\t3390:  0x64E2,\n\t3391:  0x6575,\n\t3392:  0x6EF4,\n\t3393:  0x7684,\n\t3394:  0x7B1B,\n\t3395:  0x9069,\n\t3396:  0x93D1,\n\t3397:  0x6EBA,\n\t3398:  0x54F2,\n\t3399:  0x5FB9,\n\t3400:  0x64A4,\n\t3401:  0x8F4D,\n\t3402:  0x8FED,\n\t3403:  0x9244,\n\t3404:  0x5178,\n\t3405:  0x586B,\n\t3406:  0x5929,\n\t3407:  0x5C55,\n\t3408:  0x5E97,\n\t3409:  0x6DFB,\n\t3410:  0x7E8F,\n\t3411:  0x751C,\n\t3412:  0x8CBC,\n\t3413:  0x8EE2,\n\t3414:  0x985B,\n\t3415:  0x70B9,\n\t3416:  0x4F1D,\n\t3417:  0x6BBF,\n\t3418:  0x6FB1,\n\t3419:  0x7530,\n\t3420:  0x96FB,\n\t3421:  0x514E,\n\t3422:  0x5410,\n\t3423:  0x5835,\n\t3424:  0x5857,\n\t3425:  0x59AC,\n\t3426:  0x5C60,\n\t3427:  0x5F92,\n\t3428:  0x6597,\n\t3429:  0x675C,\n\t3430:  0x6E21,\n\t3431:  0x767B,\n\t3432:  0x83DF,\n\t3433:  0x8CED,\n\t3434:  0x9014,\n\t3435:  0x90FD,\n\t3436:  0x934D,\n\t3437:  0x7825,\n\t3438:  0x783A,\n\t3439:  0x52AA,\n\t3440:  0x5EA6,\n\t3441:  0x571F,\n\t3442:  0x5974,\n\t3443:  0x6012,\n\t3444:  0x5012,\n\t3445:  0x515A,\n\t3446:  0x51AC,\n\t3447:  0x51CD,\n\t3448:  0x5200,\n\t3449:  0x5510,\n\t3450:  0x5854,\n\t3451:  0x5858,\n\t3452:  0x5957,\n\t3453:  0x5B95,\n\t3454:  0x5CF6,\n\t3455:  0x5D8B,\n\t3456:  0x60BC,\n\t3457:  0x6295,\n\t3458:  0x642D,\n\t3459:  0x6771,\n\t3460:  0x6843,\n\t3461:  0x68BC,\n\t3462:  0x68DF,\n\t3463:  0x76D7,\n\t3464:  0x6DD8,\n\t3465:  0x6E6F,\n\t3466:  0x6D9B,\n\t3467:  0x706F,\n\t3468:  0x71C8,\n\t3469:  0x5F53,\n\t3470:  0x75D8,\n\t3471:  0x7977,\n\t3472:  0x7B49,\n\t3473:  0x7B54,\n\t3474:  0x7B52,\n\t3475:  0x7CD6,\n\t3476:  0x7D71,\n\t3477:  0x5230,\n\t3478:  0x8463,\n\t3479:  0x8569,\n\t3480:  0x85E4,\n\t3481:  0x8A0E,\n\t3482:  0x8B04,\n\t3483:  0x8C46,\n\t3484:  0x8E0F,\n\t3485:  0x9003,\n\t3486:  0x900F,\n\t3487:  0x9419,\n\t3488:  0x9676,\n\t3489:  0x982D,\n\t3490:  0x9A30,\n\t3491:  0x95D8,\n\t3492:  0x50CD,\n\t3493:  0x52D5,\n\t3494:  0x540C,\n\t3495:  0x5802,\n\t3496:  0x5C0E,\n\t3497:  0x61A7,\n\t3498:  0x649E,\n\t3499:  0x6D1E,\n\t3500:  0x77B3,\n\t3501:  0x7AE5,\n\t3502:  0x80F4,\n\t3503:  0x8404,\n\t3504:  0x9053,\n\t3505:  0x9285,\n\t3506:  0x5CE0,\n\t3507:  0x9D07,\n\t3508:  0x533F,\n\t3509:  0x5F97,\n\t3510:  0x5FB3,\n\t3511:  0x6D9C,\n\t3512:  0x7279,\n\t3513:  0x7763,\n\t3514:  0x79BF,\n\t3515:  0x7BE4,\n\t3516:  0x6BD2,\n\t3517:  0x72EC,\n\t3518:  0x8AAD,\n\t3519:  0x6803,\n\t3520:  0x6A61,\n\t3521:  0x51F8,\n\t3522:  0x7A81,\n\t3523:  0x6934,\n\t3524:  0x5C4A,\n\t3525:  0x9CF6,\n\t3526:  0x82EB,\n\t3527:  0x5BC5,\n\t3528:  0x9149,\n\t3529:  0x701E,\n\t3530:  0x5678,\n\t3531:  0x5C6F,\n\t3532:  0x60C7,\n\t3533:  0x6566,\n\t3534:  0x6C8C,\n\t3535:  0x8C5A,\n\t3536:  0x9041,\n\t3537:  0x9813,\n\t3538:  0x5451,\n\t3539:  0x66C7,\n\t3540:  0x920D,\n\t3541:  0x5948,\n\t3542:  0x90A3,\n\t3543:  0x5185,\n\t3544:  0x4E4D,\n\t3545:  0x51EA,\n\t3546:  0x8599,\n\t3547:  0x8B0E,\n\t3548:  0x7058,\n\t3549:  0x637A,\n\t3550:  0x934B,\n\t3551:  0x6962,\n\t3552:  0x99B4,\n\t3553:  0x7E04,\n\t3554:  0x7577,\n\t3555:  0x5357,\n\t3556:  0x6960,\n\t3557:  0x8EDF,\n\t3558:  0x96E3,\n\t3559:  0x6C5D,\n\t3560:  0x4E8C,\n\t3561:  0x5C3C,\n\t3562:  0x5F10,\n\t3563:  0x8FE9,\n\t3564:  0x5302,\n\t3565:  0x8CD1,\n\t3566:  0x8089,\n\t3567:  0x8679,\n\t3568:  0x5EFF,\n\t3569:  0x65E5,\n\t3570:  0x4E73,\n\t3571:  0x5165,\n\t3572:  0x5982,\n\t3573:  0x5C3F,\n\t3574:  0x97EE,\n\t3575:  0x4EFB,\n\t3576:  0x598A,\n\t3577:  0x5FCD,\n\t3578:  0x8A8D,\n\t3579:  0x6FE1,\n\t3580:  0x79B0,\n\t3581:  0x7962,\n\t3582:  0x5BE7,\n\t3583:  0x8471,\n\t3584:  0x732B,\n\t3585:  0x71B1,\n\t3586:  0x5E74,\n\t3587:  0x5FF5,\n\t3588:  0x637B,\n\t3589:  0x649A,\n\t3590:  0x71C3,\n\t3591:  0x7C98,\n\t3592:  0x4E43,\n\t3593:  0x5EFC,\n\t3594:  0x4E4B,\n\t3595:  0x57DC,\n\t3596:  0x56A2,\n\t3597:  0x60A9,\n\t3598:  0x6FC3,\n\t3599:  0x7D0D,\n\t3600:  0x80FD,\n\t3601:  0x8133,\n\t3602:  0x81BF,\n\t3603:  0x8FB2,\n\t3604:  0x8997,\n\t3605:  0x86A4,\n\t3606:  0x5DF4,\n\t3607:  0x628A,\n\t3608:  0x64AD,\n\t3609:  0x8987,\n\t3610:  0x6777,\n\t3611:  0x6CE2,\n\t3612:  0x6D3E,\n\t3613:  0x7436,\n\t3614:  0x7834,\n\t3615:  0x5A46,\n\t3616:  0x7F75,\n\t3617:  0x82AD,\n\t3618:  0x99AC,\n\t3619:  0x4FF3,\n\t3620:  0x5EC3,\n\t3621:  0x62DD,\n\t3622:  0x6392,\n\t3623:  0x6557,\n\t3624:  0x676F,\n\t3625:  0x76C3,\n\t3626:  0x724C,\n\t3627:  0x80CC,\n\t3628:  0x80BA,\n\t3629:  0x8F29,\n\t3630:  0x914D,\n\t3631:  0x500D,\n\t3632:  0x57F9,\n\t3633:  0x5A92,\n\t3634:  0x6885,\n\t3635:  0x6973,\n\t3636:  0x7164,\n\t3637:  0x72FD,\n\t3638:  0x8CB7,\n\t3639:  0x58F2,\n\t3640:  0x8CE0,\n\t3641:  0x966A,\n\t3642:  0x9019,\n\t3643:  0x877F,\n\t3644:  0x79E4,\n\t3645:  0x77E7,\n\t3646:  0x8429,\n\t3647:  0x4F2F,\n\t3648:  0x5265,\n\t3649:  0x535A,\n\t3650:  0x62CD,\n\t3651:  0x67CF,\n\t3652:  0x6CCA,\n\t3653:  0x767D,\n\t3654:  0x7B94,\n\t3655:  0x7C95,\n\t3656:  0x8236,\n\t3657:  0x8584,\n\t3658:  0x8FEB,\n\t3659:  0x66DD,\n\t3660:  0x6F20,\n\t3661:  0x7206,\n\t3662:  0x7E1B,\n\t3663:  0x83AB,\n\t3664:  0x99C1,\n\t3665:  0x9EA6,\n\t3666:  0x51FD,\n\t3667:  0x7BB1,\n\t3668:  0x7872,\n\t3669:  0x7BB8,\n\t3670:  0x8087,\n\t3671:  0x7B48,\n\t3672:  0x6AE8,\n\t3673:  0x5E61,\n\t3674:  0x808C,\n\t3675:  0x7551,\n\t3676:  0x7560,\n\t3677:  0x516B,\n\t3678:  0x9262,\n\t3679:  0x6E8C,\n\t3680:  0x767A,\n\t3681:  0x9197,\n\t3682:  0x9AEA,\n\t3683:  0x4F10,\n\t3684:  0x7F70,\n\t3685:  0x629C,\n\t3686:  0x7B4F,\n\t3687:  0x95A5,\n\t3688:  0x9CE9,\n\t3689:  0x567A,\n\t3690:  0x5859,\n\t3691:  0x86E4,\n\t3692:  0x96BC,\n\t3693:  0x4F34,\n\t3694:  0x5224,\n\t3695:  0x534A,\n\t3696:  0x53CD,\n\t3697:  0x53DB,\n\t3698:  0x5E06,\n\t3699:  0x642C,\n\t3700:  0x6591,\n\t3701:  0x677F,\n\t3702:  0x6C3E,\n\t3703:  0x6C4E,\n\t3704:  0x7248,\n\t3705:  0x72AF,\n\t3706:  0x73ED,\n\t3707:  0x7554,\n\t3708:  0x7E41,\n\t3709:  0x822C,\n\t3710:  0x85E9,\n\t3711:  0x8CA9,\n\t3712:  0x7BC4,\n\t3713:  0x91C6,\n\t3714:  0x7169,\n\t3715:  0x9812,\n\t3716:  0x98EF,\n\t3717:  0x633D,\n\t3718:  0x6669,\n\t3719:  0x756A,\n\t3720:  0x76E4,\n\t3721:  0x78D0,\n\t3722:  0x8543,\n\t3723:  0x86EE,\n\t3724:  0x532A,\n\t3725:  0x5351,\n\t3726:  0x5426,\n\t3727:  0x5983,\n\t3728:  0x5E87,\n\t3729:  0x5F7C,\n\t3730:  0x60B2,\n\t3731:  0x6249,\n\t3732:  0x6279,\n\t3733:  0x62AB,\n\t3734:  0x6590,\n\t3735:  0x6BD4,\n\t3736:  0x6CCC,\n\t3737:  0x75B2,\n\t3738:  0x76AE,\n\t3739:  0x7891,\n\t3740:  0x79D8,\n\t3741:  0x7DCB,\n\t3742:  0x7F77,\n\t3743:  0x80A5,\n\t3744:  0x88AB,\n\t3745:  0x8AB9,\n\t3746:  0x8CBB,\n\t3747:  0x907F,\n\t3748:  0x975E,\n\t3749:  0x98DB,\n\t3750:  0x6A0B,\n\t3751:  0x7C38,\n\t3752:  0x5099,\n\t3753:  0x5C3E,\n\t3754:  0x5FAE,\n\t3755:  0x6787,\n\t3756:  0x6BD8,\n\t3757:  0x7435,\n\t3758:  0x7709,\n\t3759:  0x7F8E,\n\t3760:  0x9F3B,\n\t3761:  0x67CA,\n\t3762:  0x7A17,\n\t3763:  0x5339,\n\t3764:  0x758B,\n\t3765:  0x9AED,\n\t3766:  0x5F66,\n\t3767:  0x819D,\n\t3768:  0x83F1,\n\t3769:  0x8098,\n\t3770:  0x5F3C,\n\t3771:  0x5FC5,\n\t3772:  0x7562,\n\t3773:  0x7B46,\n\t3774:  0x903C,\n\t3775:  0x6867,\n\t3776:  0x59EB,\n\t3777:  0x5A9B,\n\t3778:  0x7D10,\n\t3779:  0x767E,\n\t3780:  0x8B2C,\n\t3781:  0x4FF5,\n\t3782:  0x5F6A,\n\t3783:  0x6A19,\n\t3784:  0x6C37,\n\t3785:  0x6F02,\n\t3786:  0x74E2,\n\t3787:  0x7968,\n\t3788:  0x8868,\n\t3789:  0x8A55,\n\t3790:  0x8C79,\n\t3791:  0x5EDF,\n\t3792:  0x63CF,\n\t3793:  0x75C5,\n\t3794:  0x79D2,\n\t3795:  0x82D7,\n\t3796:  0x9328,\n\t3797:  0x92F2,\n\t3798:  0x849C,\n\t3799:  0x86ED,\n\t3800:  0x9C2D,\n\t3801:  0x54C1,\n\t3802:  0x5F6C,\n\t3803:  0x658C,\n\t3804:  0x6D5C,\n\t3805:  0x7015,\n\t3806:  0x8CA7,\n\t3807:  0x8CD3,\n\t3808:  0x983B,\n\t3809:  0x654F,\n\t3810:  0x74F6,\n\t3811:  0x4E0D,\n\t3812:  0x4ED8,\n\t3813:  0x57E0,\n\t3814:  0x592B,\n\t3815:  0x5A66,\n\t3816:  0x5BCC,\n\t3817:  0x51A8,\n\t3818:  0x5E03,\n\t3819:  0x5E9C,\n\t3820:  0x6016,\n\t3821:  0x6276,\n\t3822:  0x6577,\n\t3823:  0x65A7,\n\t3824:  0x666E,\n\t3825:  0x6D6E,\n\t3826:  0x7236,\n\t3827:  0x7B26,\n\t3828:  0x8150,\n\t3829:  0x819A,\n\t3830:  0x8299,\n\t3831:  0x8B5C,\n\t3832:  0x8CA0,\n\t3833:  0x8CE6,\n\t3834:  0x8D74,\n\t3835:  0x961C,\n\t3836:  0x9644,\n\t3837:  0x4FAE,\n\t3838:  0x64AB,\n\t3839:  0x6B66,\n\t3840:  0x821E,\n\t3841:  0x8461,\n\t3842:  0x856A,\n\t3843:  0x90E8,\n\t3844:  0x5C01,\n\t3845:  0x6953,\n\t3846:  0x98A8,\n\t3847:  0x847A,\n\t3848:  0x8557,\n\t3849:  0x4F0F,\n\t3850:  0x526F,\n\t3851:  0x5FA9,\n\t3852:  0x5E45,\n\t3853:  0x670D,\n\t3854:  0x798F,\n\t3855:  0x8179,\n\t3856:  0x8907,\n\t3857:  0x8986,\n\t3858:  0x6DF5,\n\t3859:  0x5F17,\n\t3860:  0x6255,\n\t3861:  0x6CB8,\n\t3862:  0x4ECF,\n\t3863:  0x7269,\n\t3864:  0x9B92,\n\t3865:  0x5206,\n\t3866:  0x543B,\n\t3867:  0x5674,\n\t3868:  0x58B3,\n\t3869:  0x61A4,\n\t3870:  0x626E,\n\t3871:  0x711A,\n\t3872:  0x596E,\n\t3873:  0x7C89,\n\t3874:  0x7CDE,\n\t3875:  0x7D1B,\n\t3876:  0x96F0,\n\t3877:  0x6587,\n\t3878:  0x805E,\n\t3879:  0x4E19,\n\t3880:  0x4F75,\n\t3881:  0x5175,\n\t3882:  0x5840,\n\t3883:  0x5E63,\n\t3884:  0x5E73,\n\t3885:  0x5F0A,\n\t3886:  0x67C4,\n\t3887:  0x4E26,\n\t3888:  0x853D,\n\t3889:  0x9589,\n\t3890:  0x965B,\n\t3891:  0x7C73,\n\t3892:  0x9801,\n\t3893:  0x50FB,\n\t3894:  0x58C1,\n\t3895:  0x7656,\n\t3896:  0x78A7,\n\t3897:  0x5225,\n\t3898:  0x77A5,\n\t3899:  0x8511,\n\t3900:  0x7B86,\n\t3901:  0x504F,\n\t3902:  0x5909,\n\t3903:  0x7247,\n\t3904:  0x7BC7,\n\t3905:  0x7DE8,\n\t3906:  0x8FBA,\n\t3907:  0x8FD4,\n\t3908:  0x904D,\n\t3909:  0x4FBF,\n\t3910:  0x52C9,\n\t3911:  0x5A29,\n\t3912:  0x5F01,\n\t3913:  0x97AD,\n\t3914:  0x4FDD,\n\t3915:  0x8217,\n\t3916:  0x92EA,\n\t3917:  0x5703,\n\t3918:  0x6355,\n\t3919:  0x6B69,\n\t3920:  0x752B,\n\t3921:  0x88DC,\n\t3922:  0x8F14,\n\t3923:  0x7A42,\n\t3924:  0x52DF,\n\t3925:  0x5893,\n\t3926:  0x6155,\n\t3927:  0x620A,\n\t3928:  0x66AE,\n\t3929:  0x6BCD,\n\t3930:  0x7C3F,\n\t3931:  0x83E9,\n\t3932:  0x5023,\n\t3933:  0x4FF8,\n\t3934:  0x5305,\n\t3935:  0x5446,\n\t3936:  0x5831,\n\t3937:  0x5949,\n\t3938:  0x5B9D,\n\t3939:  0x5CF0,\n\t3940:  0x5CEF,\n\t3941:  0x5D29,\n\t3942:  0x5E96,\n\t3943:  0x62B1,\n\t3944:  0x6367,\n\t3945:  0x653E,\n\t3946:  0x65B9,\n\t3947:  0x670B,\n\t3948:  0x6CD5,\n\t3949:  0x6CE1,\n\t3950:  0x70F9,\n\t3951:  0x7832,\n\t3952:  0x7E2B,\n\t3953:  0x80DE,\n\t3954:  0x82B3,\n\t3955:  0x840C,\n\t3956:  0x84EC,\n\t3957:  0x8702,\n\t3958:  0x8912,\n\t3959:  0x8A2A,\n\t3960:  0x8C4A,\n\t3961:  0x90A6,\n\t3962:  0x92D2,\n\t3963:  0x98FD,\n\t3964:  0x9CF3,\n\t3965:  0x9D6C,\n\t3966:  0x4E4F,\n\t3967:  0x4EA1,\n\t3968:  0x508D,\n\t3969:  0x5256,\n\t3970:  0x574A,\n\t3971:  0x59A8,\n\t3972:  0x5E3D,\n\t3973:  0x5FD8,\n\t3974:  0x5FD9,\n\t3975:  0x623F,\n\t3976:  0x66B4,\n\t3977:  0x671B,\n\t3978:  0x67D0,\n\t3979:  0x68D2,\n\t3980:  0x5192,\n\t3981:  0x7D21,\n\t3982:  0x80AA,\n\t3983:  0x81A8,\n\t3984:  0x8B00,\n\t3985:  0x8C8C,\n\t3986:  0x8CBF,\n\t3987:  0x927E,\n\t3988:  0x9632,\n\t3989:  0x5420,\n\t3990:  0x982C,\n\t3991:  0x5317,\n\t3992:  0x50D5,\n\t3993:  0x535C,\n\t3994:  0x58A8,\n\t3995:  0x64B2,\n\t3996:  0x6734,\n\t3997:  0x7267,\n\t3998:  0x7766,\n\t3999:  0x7A46,\n\t4000:  0x91E6,\n\t4001:  0x52C3,\n\t4002:  0x6CA1,\n\t4003:  0x6B86,\n\t4004:  0x5800,\n\t4005:  0x5E4C,\n\t4006:  0x5954,\n\t4007:  0x672C,\n\t4008:  0x7FFB,\n\t4009:  0x51E1,\n\t4010:  0x76C6,\n\t4011:  0x6469,\n\t4012:  0x78E8,\n\t4013:  0x9B54,\n\t4014:  0x9EBB,\n\t4015:  0x57CB,\n\t4016:  0x59B9,\n\t4017:  0x6627,\n\t4018:  0x679A,\n\t4019:  0x6BCE,\n\t4020:  0x54E9,\n\t4021:  0x69D9,\n\t4022:  0x5E55,\n\t4023:  0x819C,\n\t4024:  0x6795,\n\t4025:  0x9BAA,\n\t4026:  0x67FE,\n\t4027:  0x9C52,\n\t4028:  0x685D,\n\t4029:  0x4EA6,\n\t4030:  0x4FE3,\n\t4031:  0x53C8,\n\t4032:  0x62B9,\n\t4033:  0x672B,\n\t4034:  0x6CAB,\n\t4035:  0x8FC4,\n\t4036:  0x4FAD,\n\t4037:  0x7E6D,\n\t4038:  0x9EBF,\n\t4039:  0x4E07,\n\t4040:  0x6162,\n\t4041:  0x6E80,\n\t4042:  0x6F2B,\n\t4043:  0x8513,\n\t4044:  0x5473,\n\t4045:  0x672A,\n\t4046:  0x9B45,\n\t4047:  0x5DF3,\n\t4048:  0x7B95,\n\t4049:  0x5CAC,\n\t4050:  0x5BC6,\n\t4051:  0x871C,\n\t4052:  0x6E4A,\n\t4053:  0x84D1,\n\t4054:  0x7A14,\n\t4055:  0x8108,\n\t4056:  0x5999,\n\t4057:  0x7C8D,\n\t4058:  0x6C11,\n\t4059:  0x7720,\n\t4060:  0x52D9,\n\t4061:  0x5922,\n\t4062:  0x7121,\n\t4063:  0x725F,\n\t4064:  0x77DB,\n\t4065:  0x9727,\n\t4066:  0x9D61,\n\t4067:  0x690B,\n\t4068:  0x5A7F,\n\t4069:  0x5A18,\n\t4070:  0x51A5,\n\t4071:  0x540D,\n\t4072:  0x547D,\n\t4073:  0x660E,\n\t4074:  0x76DF,\n\t4075:  0x8FF7,\n\t4076:  0x9298,\n\t4077:  0x9CF4,\n\t4078:  0x59EA,\n\t4079:  0x725D,\n\t4080:  0x6EC5,\n\t4081:  0x514D,\n\t4082:  0x68C9,\n\t4083:  0x7DBF,\n\t4084:  0x7DEC,\n\t4085:  0x9762,\n\t4086:  0x9EBA,\n\t4087:  0x6478,\n\t4088:  0x6A21,\n\t4089:  0x8302,\n\t4090:  0x5984,\n\t4091:  0x5B5F,\n\t4092:  0x6BDB,\n\t4093:  0x731B,\n\t4094:  0x76F2,\n\t4095:  0x7DB2,\n\t4096:  0x8017,\n\t4097:  0x8499,\n\t4098:  0x5132,\n\t4099:  0x6728,\n\t4100:  0x9ED9,\n\t4101:  0x76EE,\n\t4102:  0x6762,\n\t4103:  0x52FF,\n\t4104:  0x9905,\n\t4105:  0x5C24,\n\t4106:  0x623B,\n\t4107:  0x7C7E,\n\t4108:  0x8CB0,\n\t4109:  0x554F,\n\t4110:  0x60B6,\n\t4111:  0x7D0B,\n\t4112:  0x9580,\n\t4113:  0x5301,\n\t4114:  0x4E5F,\n\t4115:  0x51B6,\n\t4116:  0x591C,\n\t4117:  0x723A,\n\t4118:  0x8036,\n\t4119:  0x91CE,\n\t4120:  0x5F25,\n\t4121:  0x77E2,\n\t4122:  0x5384,\n\t4123:  0x5F79,\n\t4124:  0x7D04,\n\t4125:  0x85AC,\n\t4126:  0x8A33,\n\t4127:  0x8E8D,\n\t4128:  0x9756,\n\t4129:  0x67F3,\n\t4130:  0x85AE,\n\t4131:  0x9453,\n\t4132:  0x6109,\n\t4133:  0x6108,\n\t4134:  0x6CB9,\n\t4135:  0x7652,\n\t4136:  0x8AED,\n\t4137:  0x8F38,\n\t4138:  0x552F,\n\t4139:  0x4F51,\n\t4140:  0x512A,\n\t4141:  0x52C7,\n\t4142:  0x53CB,\n\t4143:  0x5BA5,\n\t4144:  0x5E7D,\n\t4145:  0x60A0,\n\t4146:  0x6182,\n\t4147:  0x63D6,\n\t4148:  0x6709,\n\t4149:  0x67DA,\n\t4150:  0x6E67,\n\t4151:  0x6D8C,\n\t4152:  0x7336,\n\t4153:  0x7337,\n\t4154:  0x7531,\n\t4155:  0x7950,\n\t4156:  0x88D5,\n\t4157:  0x8A98,\n\t4158:  0x904A,\n\t4159:  0x9091,\n\t4160:  0x90F5,\n\t4161:  0x96C4,\n\t4162:  0x878D,\n\t4163:  0x5915,\n\t4164:  0x4E88,\n\t4165:  0x4F59,\n\t4166:  0x4E0E,\n\t4167:  0x8A89,\n\t4168:  0x8F3F,\n\t4169:  0x9810,\n\t4170:  0x50AD,\n\t4171:  0x5E7C,\n\t4172:  0x5996,\n\t4173:  0x5BB9,\n\t4174:  0x5EB8,\n\t4175:  0x63DA,\n\t4176:  0x63FA,\n\t4177:  0x64C1,\n\t4178:  0x66DC,\n\t4179:  0x694A,\n\t4180:  0x69D8,\n\t4181:  0x6D0B,\n\t4182:  0x6EB6,\n\t4183:  0x7194,\n\t4184:  0x7528,\n\t4185:  0x7AAF,\n\t4186:  0x7F8A,\n\t4187:  0x8000,\n\t4188:  0x8449,\n\t4189:  0x84C9,\n\t4190:  0x8981,\n\t4191:  0x8B21,\n\t4192:  0x8E0A,\n\t4193:  0x9065,\n\t4194:  0x967D,\n\t4195:  0x990A,\n\t4196:  0x617E,\n\t4197:  0x6291,\n\t4198:  0x6B32,\n\t4199:  0x6C83,\n\t4200:  0x6D74,\n\t4201:  0x7FCC,\n\t4202:  0x7FFC,\n\t4203:  0x6DC0,\n\t4204:  0x7F85,\n\t4205:  0x87BA,\n\t4206:  0x88F8,\n\t4207:  0x6765,\n\t4208:  0x83B1,\n\t4209:  0x983C,\n\t4210:  0x96F7,\n\t4211:  0x6D1B,\n\t4212:  0x7D61,\n\t4213:  0x843D,\n\t4214:  0x916A,\n\t4215:  0x4E71,\n\t4216:  0x5375,\n\t4217:  0x5D50,\n\t4218:  0x6B04,\n\t4219:  0x6FEB,\n\t4220:  0x85CD,\n\t4221:  0x862D,\n\t4222:  0x89A7,\n\t4223:  0x5229,\n\t4224:  0x540F,\n\t4225:  0x5C65,\n\t4226:  0x674E,\n\t4227:  0x68A8,\n\t4228:  0x7406,\n\t4229:  0x7483,\n\t4230:  0x75E2,\n\t4231:  0x88CF,\n\t4232:  0x88E1,\n\t4233:  0x91CC,\n\t4234:  0x96E2,\n\t4235:  0x9678,\n\t4236:  0x5F8B,\n\t4237:  0x7387,\n\t4238:  0x7ACB,\n\t4239:  0x844E,\n\t4240:  0x63A0,\n\t4241:  0x7565,\n\t4242:  0x5289,\n\t4243:  0x6D41,\n\t4244:  0x6E9C,\n\t4245:  0x7409,\n\t4246:  0x7559,\n\t4247:  0x786B,\n\t4248:  0x7C92,\n\t4249:  0x9686,\n\t4250:  0x7ADC,\n\t4251:  0x9F8D,\n\t4252:  0x4FB6,\n\t4253:  0x616E,\n\t4254:  0x65C5,\n\t4255:  0x865C,\n\t4256:  0x4E86,\n\t4257:  0x4EAE,\n\t4258:  0x50DA,\n\t4259:  0x4E21,\n\t4260:  0x51CC,\n\t4261:  0x5BEE,\n\t4262:  0x6599,\n\t4263:  0x6881,\n\t4264:  0x6DBC,\n\t4265:  0x731F,\n\t4266:  0x7642,\n\t4267:  0x77AD,\n\t4268:  0x7A1C,\n\t4269:  0x7CE7,\n\t4270:  0x826F,\n\t4271:  0x8AD2,\n\t4272:  0x907C,\n\t4273:  0x91CF,\n\t4274:  0x9675,\n\t4275:  0x9818,\n\t4276:  0x529B,\n\t4277:  0x7DD1,\n\t4278:  0x502B,\n\t4279:  0x5398,\n\t4280:  0x6797,\n\t4281:  0x6DCB,\n\t4282:  0x71D0,\n\t4283:  0x7433,\n\t4284:  0x81E8,\n\t4285:  0x8F2A,\n\t4286:  0x96A3,\n\t4287:  0x9C57,\n\t4288:  0x9E9F,\n\t4289:  0x7460,\n\t4290:  0x5841,\n\t4291:  0x6D99,\n\t4292:  0x7D2F,\n\t4293:  0x985E,\n\t4294:  0x4EE4,\n\t4295:  0x4F36,\n\t4296:  0x4F8B,\n\t4297:  0x51B7,\n\t4298:  0x52B1,\n\t4299:  0x5DBA,\n\t4300:  0x601C,\n\t4301:  0x73B2,\n\t4302:  0x793C,\n\t4303:  0x82D3,\n\t4304:  0x9234,\n\t4305:  0x96B7,\n\t4306:  0x96F6,\n\t4307:  0x970A,\n\t4308:  0x9E97,\n\t4309:  0x9F62,\n\t4310:  0x66A6,\n\t4311:  0x6B74,\n\t4312:  0x5217,\n\t4313:  0x52A3,\n\t4314:  0x70C8,\n\t4315:  0x88C2,\n\t4316:  0x5EC9,\n\t4317:  0x604B,\n\t4318:  0x6190,\n\t4319:  0x6F23,\n\t4320:  0x7149,\n\t4321:  0x7C3E,\n\t4322:  0x7DF4,\n\t4323:  0x806F,\n\t4324:  0x84EE,\n\t4325:  0x9023,\n\t4326:  0x932C,\n\t4327:  0x5442,\n\t4328:  0x9B6F,\n\t4329:  0x6AD3,\n\t4330:  0x7089,\n\t4331:  0x8CC2,\n\t4332:  0x8DEF,\n\t4333:  0x9732,\n\t4334:  0x52B4,\n\t4335:  0x5A41,\n\t4336:  0x5ECA,\n\t4337:  0x5F04,\n\t4338:  0x6717,\n\t4339:  0x697C,\n\t4340:  0x6994,\n\t4341:  0x6D6A,\n\t4342:  0x6F0F,\n\t4343:  0x7262,\n\t4344:  0x72FC,\n\t4345:  0x7BED,\n\t4346:  0x8001,\n\t4347:  0x807E,\n\t4348:  0x874B,\n\t4349:  0x90CE,\n\t4350:  0x516D,\n\t4351:  0x9E93,\n\t4352:  0x7984,\n\t4353:  0x808B,\n\t4354:  0x9332,\n\t4355:  0x8AD6,\n\t4356:  0x502D,\n\t4357:  0x548C,\n\t4358:  0x8A71,\n\t4359:  0x6B6A,\n\t4360:  0x8CC4,\n\t4361:  0x8107,\n\t4362:  0x60D1,\n\t4363:  0x67A0,\n\t4364:  0x9DF2,\n\t4365:  0x4E99,\n\t4366:  0x4E98,\n\t4367:  0x9C10,\n\t4368:  0x8A6B,\n\t4369:  0x85C1,\n\t4370:  0x8568,\n\t4371:  0x6900,\n\t4372:  0x6E7E,\n\t4373:  0x7897,\n\t4374:  0x8155,\n\t4418:  0x5F0C,\n\t4419:  0x4E10,\n\t4420:  0x4E15,\n\t4421:  0x4E2A,\n\t4422:  0x4E31,\n\t4423:  0x4E36,\n\t4424:  0x4E3C,\n\t4425:  0x4E3F,\n\t4426:  0x4E42,\n\t4427:  0x4E56,\n\t4428:  0x4E58,\n\t4429:  0x4E82,\n\t4430:  0x4E85,\n\t4431:  0x8C6B,\n\t4432:  0x4E8A,\n\t4433:  0x8212,\n\t4434:  0x5F0D,\n\t4435:  0x4E8E,\n\t4436:  0x4E9E,\n\t4437:  0x4E9F,\n\t4438:  0x4EA0,\n\t4439:  0x4EA2,\n\t4440:  0x4EB0,\n\t4441:  0x4EB3,\n\t4442:  0x4EB6,\n\t4443:  0x4ECE,\n\t4444:  0x4ECD,\n\t4445:  0x4EC4,\n\t4446:  0x4EC6,\n\t4447:  0x4EC2,\n\t4448:  0x4ED7,\n\t4449:  0x4EDE,\n\t4450:  0x4EED,\n\t4451:  0x4EDF,\n\t4452:  0x4EF7,\n\t4453:  0x4F09,\n\t4454:  0x4F5A,\n\t4455:  0x4F30,\n\t4456:  0x4F5B,\n\t4457:  0x4F5D,\n\t4458:  0x4F57,\n\t4459:  0x4F47,\n\t4460:  0x4F76,\n\t4461:  0x4F88,\n\t4462:  0x4F8F,\n\t4463:  0x4F98,\n\t4464:  0x4F7B,\n\t4465:  0x4F69,\n\t4466:  0x4F70,\n\t4467:  0x4F91,\n\t4468:  0x4F6F,\n\t4469:  0x4F86,\n\t4470:  0x4F96,\n\t4471:  0x5118,\n\t4472:  0x4FD4,\n\t4473:  0x4FDF,\n\t4474:  0x4FCE,\n\t4475:  0x4FD8,\n\t4476:  0x4FDB,\n\t4477:  0x4FD1,\n\t4478:  0x4FDA,\n\t4479:  0x4FD0,\n\t4480:  0x4FE4,\n\t4481:  0x4FE5,\n\t4482:  0x501A,\n\t4483:  0x5028,\n\t4484:  0x5014,\n\t4485:  0x502A,\n\t4486:  0x5025,\n\t4487:  0x5005,\n\t4488:  0x4F1C,\n\t4489:  0x4FF6,\n\t4490:  0x5021,\n\t4491:  0x5029,\n\t4492:  0x502C,\n\t4493:  0x4FFE,\n\t4494:  0x4FEF,\n\t4495:  0x5011,\n\t4496:  0x5006,\n\t4497:  0x5043,\n\t4498:  0x5047,\n\t4499:  0x6703,\n\t4500:  0x5055,\n\t4501:  0x5050,\n\t4502:  0x5048,\n\t4503:  0x505A,\n\t4504:  0x5056,\n\t4505:  0x506C,\n\t4506:  0x5078,\n\t4507:  0x5080,\n\t4508:  0x509A,\n\t4509:  0x5085,\n\t4510:  0x50B4,\n\t4511:  0x50B2,\n\t4512:  0x50C9,\n\t4513:  0x50CA,\n\t4514:  0x50B3,\n\t4515:  0x50C2,\n\t4516:  0x50D6,\n\t4517:  0x50DE,\n\t4518:  0x50E5,\n\t4519:  0x50ED,\n\t4520:  0x50E3,\n\t4521:  0x50EE,\n\t4522:  0x50F9,\n\t4523:  0x50F5,\n\t4524:  0x5109,\n\t4525:  0x5101,\n\t4526:  0x5102,\n\t4527:  0x5116,\n\t4528:  0x5115,\n\t4529:  0x5114,\n\t4530:  0x511A,\n\t4531:  0x5121,\n\t4532:  0x513A,\n\t4533:  0x5137,\n\t4534:  0x513C,\n\t4535:  0x513B,\n\t4536:  0x513F,\n\t4537:  0x5140,\n\t4538:  0x5152,\n\t4539:  0x514C,\n\t4540:  0x5154,\n\t4541:  0x5162,\n\t4542:  0x7AF8,\n\t4543:  0x5169,\n\t4544:  0x516A,\n\t4545:  0x516E,\n\t4546:  0x5180,\n\t4547:  0x5182,\n\t4548:  0x56D8,\n\t4549:  0x518C,\n\t4550:  0x5189,\n\t4551:  0x518F,\n\t4552:  0x5191,\n\t4553:  0x5193,\n\t4554:  0x5195,\n\t4555:  0x5196,\n\t4556:  0x51A4,\n\t4557:  0x51A6,\n\t4558:  0x51A2,\n\t4559:  0x51A9,\n\t4560:  0x51AA,\n\t4561:  0x51AB,\n\t4562:  0x51B3,\n\t4563:  0x51B1,\n\t4564:  0x51B2,\n\t4565:  0x51B0,\n\t4566:  0x51B5,\n\t4567:  0x51BD,\n\t4568:  0x51C5,\n\t4569:  0x51C9,\n\t4570:  0x51DB,\n\t4571:  0x51E0,\n\t4572:  0x8655,\n\t4573:  0x51E9,\n\t4574:  0x51ED,\n\t4575:  0x51F0,\n\t4576:  0x51F5,\n\t4577:  0x51FE,\n\t4578:  0x5204,\n\t4579:  0x520B,\n\t4580:  0x5214,\n\t4581:  0x520E,\n\t4582:  0x5227,\n\t4583:  0x522A,\n\t4584:  0x522E,\n\t4585:  0x5233,\n\t4586:  0x5239,\n\t4587:  0x524F,\n\t4588:  0x5244,\n\t4589:  0x524B,\n\t4590:  0x524C,\n\t4591:  0x525E,\n\t4592:  0x5254,\n\t4593:  0x526A,\n\t4594:  0x5274,\n\t4595:  0x5269,\n\t4596:  0x5273,\n\t4597:  0x527F,\n\t4598:  0x527D,\n\t4599:  0x528D,\n\t4600:  0x5294,\n\t4601:  0x5292,\n\t4602:  0x5271,\n\t4603:  0x5288,\n\t4604:  0x5291,\n\t4605:  0x8FA8,\n\t4606:  0x8FA7,\n\t4607:  0x52AC,\n\t4608:  0x52AD,\n\t4609:  0x52BC,\n\t4610:  0x52B5,\n\t4611:  0x52C1,\n\t4612:  0x52CD,\n\t4613:  0x52D7,\n\t4614:  0x52DE,\n\t4615:  0x52E3,\n\t4616:  0x52E6,\n\t4617:  0x98ED,\n\t4618:  0x52E0,\n\t4619:  0x52F3,\n\t4620:  0x52F5,\n\t4621:  0x52F8,\n\t4622:  0x52F9,\n\t4623:  0x5306,\n\t4624:  0x5308,\n\t4625:  0x7538,\n\t4626:  0x530D,\n\t4627:  0x5310,\n\t4628:  0x530F,\n\t4629:  0x5315,\n\t4630:  0x531A,\n\t4631:  0x5323,\n\t4632:  0x532F,\n\t4633:  0x5331,\n\t4634:  0x5333,\n\t4635:  0x5338,\n\t4636:  0x5340,\n\t4637:  0x5346,\n\t4638:  0x5345,\n\t4639:  0x4E17,\n\t4640:  0x5349,\n\t4641:  0x534D,\n\t4642:  0x51D6,\n\t4643:  0x535E,\n\t4644:  0x5369,\n\t4645:  0x536E,\n\t4646:  0x5918,\n\t4647:  0x537B,\n\t4648:  0x5377,\n\t4649:  0x5382,\n\t4650:  0x5396,\n\t4651:  0x53A0,\n\t4652:  0x53A6,\n\t4653:  0x53A5,\n\t4654:  0x53AE,\n\t4655:  0x53B0,\n\t4656:  0x53B6,\n\t4657:  0x53C3,\n\t4658:  0x7C12,\n\t4659:  0x96D9,\n\t4660:  0x53DF,\n\t4661:  0x66FC,\n\t4662:  0x71EE,\n\t4663:  0x53EE,\n\t4664:  0x53E8,\n\t4665:  0x53ED,\n\t4666:  0x53FA,\n\t4667:  0x5401,\n\t4668:  0x543D,\n\t4669:  0x5440,\n\t4670:  0x542C,\n\t4671:  0x542D,\n\t4672:  0x543C,\n\t4673:  0x542E,\n\t4674:  0x5436,\n\t4675:  0x5429,\n\t4676:  0x541D,\n\t4677:  0x544E,\n\t4678:  0x548F,\n\t4679:  0x5475,\n\t4680:  0x548E,\n\t4681:  0x545F,\n\t4682:  0x5471,\n\t4683:  0x5477,\n\t4684:  0x5470,\n\t4685:  0x5492,\n\t4686:  0x547B,\n\t4687:  0x5480,\n\t4688:  0x5476,\n\t4689:  0x5484,\n\t4690:  0x5490,\n\t4691:  0x5486,\n\t4692:  0x54C7,\n\t4693:  0x54A2,\n\t4694:  0x54B8,\n\t4695:  0x54A5,\n\t4696:  0x54AC,\n\t4697:  0x54C4,\n\t4698:  0x54C8,\n\t4699:  0x54A8,\n\t4700:  0x54AB,\n\t4701:  0x54C2,\n\t4702:  0x54A4,\n\t4703:  0x54BE,\n\t4704:  0x54BC,\n\t4705:  0x54D8,\n\t4706:  0x54E5,\n\t4707:  0x54E6,\n\t4708:  0x550F,\n\t4709:  0x5514,\n\t4710:  0x54FD,\n\t4711:  0x54EE,\n\t4712:  0x54ED,\n\t4713:  0x54FA,\n\t4714:  0x54E2,\n\t4715:  0x5539,\n\t4716:  0x5540,\n\t4717:  0x5563,\n\t4718:  0x554C,\n\t4719:  0x552E,\n\t4720:  0x555C,\n\t4721:  0x5545,\n\t4722:  0x5556,\n\t4723:  0x5557,\n\t4724:  0x5538,\n\t4725:  0x5533,\n\t4726:  0x555D,\n\t4727:  0x5599,\n\t4728:  0x5580,\n\t4729:  0x54AF,\n\t4730:  0x558A,\n\t4731:  0x559F,\n\t4732:  0x557B,\n\t4733:  0x557E,\n\t4734:  0x5598,\n\t4735:  0x559E,\n\t4736:  0x55AE,\n\t4737:  0x557C,\n\t4738:  0x5583,\n\t4739:  0x55A9,\n\t4740:  0x5587,\n\t4741:  0x55A8,\n\t4742:  0x55DA,\n\t4743:  0x55C5,\n\t4744:  0x55DF,\n\t4745:  0x55C4,\n\t4746:  0x55DC,\n\t4747:  0x55E4,\n\t4748:  0x55D4,\n\t4749:  0x5614,\n\t4750:  0x55F7,\n\t4751:  0x5616,\n\t4752:  0x55FE,\n\t4753:  0x55FD,\n\t4754:  0x561B,\n\t4755:  0x55F9,\n\t4756:  0x564E,\n\t4757:  0x5650,\n\t4758:  0x71DF,\n\t4759:  0x5634,\n\t4760:  0x5636,\n\t4761:  0x5632,\n\t4762:  0x5638,\n\t4763:  0x566B,\n\t4764:  0x5664,\n\t4765:  0x562F,\n\t4766:  0x566C,\n\t4767:  0x566A,\n\t4768:  0x5686,\n\t4769:  0x5680,\n\t4770:  0x568A,\n\t4771:  0x56A0,\n\t4772:  0x5694,\n\t4773:  0x568F,\n\t4774:  0x56A5,\n\t4775:  0x56AE,\n\t4776:  0x56B6,\n\t4777:  0x56B4,\n\t4778:  0x56C2,\n\t4779:  0x56BC,\n\t4780:  0x56C1,\n\t4781:  0x56C3,\n\t4782:  0x56C0,\n\t4783:  0x56C8,\n\t4784:  0x56CE,\n\t4785:  0x56D1,\n\t4786:  0x56D3,\n\t4787:  0x56D7,\n\t4788:  0x56EE,\n\t4789:  0x56F9,\n\t4790:  0x5700,\n\t4791:  0x56FF,\n\t4792:  0x5704,\n\t4793:  0x5709,\n\t4794:  0x5708,\n\t4795:  0x570B,\n\t4796:  0x570D,\n\t4797:  0x5713,\n\t4798:  0x5718,\n\t4799:  0x5716,\n\t4800:  0x55C7,\n\t4801:  0x571C,\n\t4802:  0x5726,\n\t4803:  0x5737,\n\t4804:  0x5738,\n\t4805:  0x574E,\n\t4806:  0x573B,\n\t4807:  0x5740,\n\t4808:  0x574F,\n\t4809:  0x5769,\n\t4810:  0x57C0,\n\t4811:  0x5788,\n\t4812:  0x5761,\n\t4813:  0x577F,\n\t4814:  0x5789,\n\t4815:  0x5793,\n\t4816:  0x57A0,\n\t4817:  0x57B3,\n\t4818:  0x57A4,\n\t4819:  0x57AA,\n\t4820:  0x57B0,\n\t4821:  0x57C3,\n\t4822:  0x57C6,\n\t4823:  0x57D4,\n\t4824:  0x57D2,\n\t4825:  0x57D3,\n\t4826:  0x580A,\n\t4827:  0x57D6,\n\t4828:  0x57E3,\n\t4829:  0x580B,\n\t4830:  0x5819,\n\t4831:  0x581D,\n\t4832:  0x5872,\n\t4833:  0x5821,\n\t4834:  0x5862,\n\t4835:  0x584B,\n\t4836:  0x5870,\n\t4837:  0x6BC0,\n\t4838:  0x5852,\n\t4839:  0x583D,\n\t4840:  0x5879,\n\t4841:  0x5885,\n\t4842:  0x58B9,\n\t4843:  0x589F,\n\t4844:  0x58AB,\n\t4845:  0x58BA,\n\t4846:  0x58DE,\n\t4847:  0x58BB,\n\t4848:  0x58B8,\n\t4849:  0x58AE,\n\t4850:  0x58C5,\n\t4851:  0x58D3,\n\t4852:  0x58D1,\n\t4853:  0x58D7,\n\t4854:  0x58D9,\n\t4855:  0x58D8,\n\t4856:  0x58E5,\n\t4857:  0x58DC,\n\t4858:  0x58E4,\n\t4859:  0x58DF,\n\t4860:  0x58EF,\n\t4861:  0x58FA,\n\t4862:  0x58F9,\n\t4863:  0x58FB,\n\t4864:  0x58FC,\n\t4865:  0x58FD,\n\t4866:  0x5902,\n\t4867:  0x590A,\n\t4868:  0x5910,\n\t4869:  0x591B,\n\t4870:  0x68A6,\n\t4871:  0x5925,\n\t4872:  0x592C,\n\t4873:  0x592D,\n\t4874:  0x5932,\n\t4875:  0x5938,\n\t4876:  0x593E,\n\t4877:  0x7AD2,\n\t4878:  0x5955,\n\t4879:  0x5950,\n\t4880:  0x594E,\n\t4881:  0x595A,\n\t4882:  0x5958,\n\t4883:  0x5962,\n\t4884:  0x5960,\n\t4885:  0x5967,\n\t4886:  0x596C,\n\t4887:  0x5969,\n\t4888:  0x5978,\n\t4889:  0x5981,\n\t4890:  0x599D,\n\t4891:  0x4F5E,\n\t4892:  0x4FAB,\n\t4893:  0x59A3,\n\t4894:  0x59B2,\n\t4895:  0x59C6,\n\t4896:  0x59E8,\n\t4897:  0x59DC,\n\t4898:  0x598D,\n\t4899:  0x59D9,\n\t4900:  0x59DA,\n\t4901:  0x5A25,\n\t4902:  0x5A1F,\n\t4903:  0x5A11,\n\t4904:  0x5A1C,\n\t4905:  0x5A09,\n\t4906:  0x5A1A,\n\t4907:  0x5A40,\n\t4908:  0x5A6C,\n\t4909:  0x5A49,\n\t4910:  0x5A35,\n\t4911:  0x5A36,\n\t4912:  0x5A62,\n\t4913:  0x5A6A,\n\t4914:  0x5A9A,\n\t4915:  0x5ABC,\n\t4916:  0x5ABE,\n\t4917:  0x5ACB,\n\t4918:  0x5AC2,\n\t4919:  0x5ABD,\n\t4920:  0x5AE3,\n\t4921:  0x5AD7,\n\t4922:  0x5AE6,\n\t4923:  0x5AE9,\n\t4924:  0x5AD6,\n\t4925:  0x5AFA,\n\t4926:  0x5AFB,\n\t4927:  0x5B0C,\n\t4928:  0x5B0B,\n\t4929:  0x5B16,\n\t4930:  0x5B32,\n\t4931:  0x5AD0,\n\t4932:  0x5B2A,\n\t4933:  0x5B36,\n\t4934:  0x5B3E,\n\t4935:  0x5B43,\n\t4936:  0x5B45,\n\t4937:  0x5B40,\n\t4938:  0x5B51,\n\t4939:  0x5B55,\n\t4940:  0x5B5A,\n\t4941:  0x5B5B,\n\t4942:  0x5B65,\n\t4943:  0x5B69,\n\t4944:  0x5B70,\n\t4945:  0x5B73,\n\t4946:  0x5B75,\n\t4947:  0x5B78,\n\t4948:  0x6588,\n\t4949:  0x5B7A,\n\t4950:  0x5B80,\n\t4951:  0x5B83,\n\t4952:  0x5BA6,\n\t4953:  0x5BB8,\n\t4954:  0x5BC3,\n\t4955:  0x5BC7,\n\t4956:  0x5BC9,\n\t4957:  0x5BD4,\n\t4958:  0x5BD0,\n\t4959:  0x5BE4,\n\t4960:  0x5BE6,\n\t4961:  0x5BE2,\n\t4962:  0x5BDE,\n\t4963:  0x5BE5,\n\t4964:  0x5BEB,\n\t4965:  0x5BF0,\n\t4966:  0x5BF6,\n\t4967:  0x5BF3,\n\t4968:  0x5C05,\n\t4969:  0x5C07,\n\t4970:  0x5C08,\n\t4971:  0x5C0D,\n\t4972:  0x5C13,\n\t4973:  0x5C20,\n\t4974:  0x5C22,\n\t4975:  0x5C28,\n\t4976:  0x5C38,\n\t4977:  0x5C39,\n\t4978:  0x5C41,\n\t4979:  0x5C46,\n\t4980:  0x5C4E,\n\t4981:  0x5C53,\n\t4982:  0x5C50,\n\t4983:  0x5C4F,\n\t4984:  0x5B71,\n\t4985:  0x5C6C,\n\t4986:  0x5C6E,\n\t4987:  0x4E62,\n\t4988:  0x5C76,\n\t4989:  0x5C79,\n\t4990:  0x5C8C,\n\t4991:  0x5C91,\n\t4992:  0x5C94,\n\t4993:  0x599B,\n\t4994:  0x5CAB,\n\t4995:  0x5CBB,\n\t4996:  0x5CB6,\n\t4997:  0x5CBC,\n\t4998:  0x5CB7,\n\t4999:  0x5CC5,\n\t5000:  0x5CBE,\n\t5001:  0x5CC7,\n\t5002:  0x5CD9,\n\t5003:  0x5CE9,\n\t5004:  0x5CFD,\n\t5005:  0x5CFA,\n\t5006:  0x5CED,\n\t5007:  0x5D8C,\n\t5008:  0x5CEA,\n\t5009:  0x5D0B,\n\t5010:  0x5D15,\n\t5011:  0x5D17,\n\t5012:  0x5D5C,\n\t5013:  0x5D1F,\n\t5014:  0x5D1B,\n\t5015:  0x5D11,\n\t5016:  0x5D14,\n\t5017:  0x5D22,\n\t5018:  0x5D1A,\n\t5019:  0x5D19,\n\t5020:  0x5D18,\n\t5021:  0x5D4C,\n\t5022:  0x5D52,\n\t5023:  0x5D4E,\n\t5024:  0x5D4B,\n\t5025:  0x5D6C,\n\t5026:  0x5D73,\n\t5027:  0x5D76,\n\t5028:  0x5D87,\n\t5029:  0x5D84,\n\t5030:  0x5D82,\n\t5031:  0x5DA2,\n\t5032:  0x5D9D,\n\t5033:  0x5DAC,\n\t5034:  0x5DAE,\n\t5035:  0x5DBD,\n\t5036:  0x5D90,\n\t5037:  0x5DB7,\n\t5038:  0x5DBC,\n\t5039:  0x5DC9,\n\t5040:  0x5DCD,\n\t5041:  0x5DD3,\n\t5042:  0x5DD2,\n\t5043:  0x5DD6,\n\t5044:  0x5DDB,\n\t5045:  0x5DEB,\n\t5046:  0x5DF2,\n\t5047:  0x5DF5,\n\t5048:  0x5E0B,\n\t5049:  0x5E1A,\n\t5050:  0x5E19,\n\t5051:  0x5E11,\n\t5052:  0x5E1B,\n\t5053:  0x5E36,\n\t5054:  0x5E37,\n\t5055:  0x5E44,\n\t5056:  0x5E43,\n\t5057:  0x5E40,\n\t5058:  0x5E4E,\n\t5059:  0x5E57,\n\t5060:  0x5E54,\n\t5061:  0x5E5F,\n\t5062:  0x5E62,\n\t5063:  0x5E64,\n\t5064:  0x5E47,\n\t5065:  0x5E75,\n\t5066:  0x5E76,\n\t5067:  0x5E7A,\n\t5068:  0x9EBC,\n\t5069:  0x5E7F,\n\t5070:  0x5EA0,\n\t5071:  0x5EC1,\n\t5072:  0x5EC2,\n\t5073:  0x5EC8,\n\t5074:  0x5ED0,\n\t5075:  0x5ECF,\n\t5076:  0x5ED6,\n\t5077:  0x5EE3,\n\t5078:  0x5EDD,\n\t5079:  0x5EDA,\n\t5080:  0x5EDB,\n\t5081:  0x5EE2,\n\t5082:  0x5EE1,\n\t5083:  0x5EE8,\n\t5084:  0x5EE9,\n\t5085:  0x5EEC,\n\t5086:  0x5EF1,\n\t5087:  0x5EF3,\n\t5088:  0x5EF0,\n\t5089:  0x5EF4,\n\t5090:  0x5EF8,\n\t5091:  0x5EFE,\n\t5092:  0x5F03,\n\t5093:  0x5F09,\n\t5094:  0x5F5D,\n\t5095:  0x5F5C,\n\t5096:  0x5F0B,\n\t5097:  0x5F11,\n\t5098:  0x5F16,\n\t5099:  0x5F29,\n\t5100:  0x5F2D,\n\t5101:  0x5F38,\n\t5102:  0x5F41,\n\t5103:  0x5F48,\n\t5104:  0x5F4C,\n\t5105:  0x5F4E,\n\t5106:  0x5F2F,\n\t5107:  0x5F51,\n\t5108:  0x5F56,\n\t5109:  0x5F57,\n\t5110:  0x5F59,\n\t5111:  0x5F61,\n\t5112:  0x5F6D,\n\t5113:  0x5F73,\n\t5114:  0x5F77,\n\t5115:  0x5F83,\n\t5116:  0x5F82,\n\t5117:  0x5F7F,\n\t5118:  0x5F8A,\n\t5119:  0x5F88,\n\t5120:  0x5F91,\n\t5121:  0x5F87,\n\t5122:  0x5F9E,\n\t5123:  0x5F99,\n\t5124:  0x5F98,\n\t5125:  0x5FA0,\n\t5126:  0x5FA8,\n\t5127:  0x5FAD,\n\t5128:  0x5FBC,\n\t5129:  0x5FD6,\n\t5130:  0x5FFB,\n\t5131:  0x5FE4,\n\t5132:  0x5FF8,\n\t5133:  0x5FF1,\n\t5134:  0x5FDD,\n\t5135:  0x60B3,\n\t5136:  0x5FFF,\n\t5137:  0x6021,\n\t5138:  0x6060,\n\t5139:  0x6019,\n\t5140:  0x6010,\n\t5141:  0x6029,\n\t5142:  0x600E,\n\t5143:  0x6031,\n\t5144:  0x601B,\n\t5145:  0x6015,\n\t5146:  0x602B,\n\t5147:  0x6026,\n\t5148:  0x600F,\n\t5149:  0x603A,\n\t5150:  0x605A,\n\t5151:  0x6041,\n\t5152:  0x606A,\n\t5153:  0x6077,\n\t5154:  0x605F,\n\t5155:  0x604A,\n\t5156:  0x6046,\n\t5157:  0x604D,\n\t5158:  0x6063,\n\t5159:  0x6043,\n\t5160:  0x6064,\n\t5161:  0x6042,\n\t5162:  0x606C,\n\t5163:  0x606B,\n\t5164:  0x6059,\n\t5165:  0x6081,\n\t5166:  0x608D,\n\t5167:  0x60E7,\n\t5168:  0x6083,\n\t5169:  0x609A,\n\t5170:  0x6084,\n\t5171:  0x609B,\n\t5172:  0x6096,\n\t5173:  0x6097,\n\t5174:  0x6092,\n\t5175:  0x60A7,\n\t5176:  0x608B,\n\t5177:  0x60E1,\n\t5178:  0x60B8,\n\t5179:  0x60E0,\n\t5180:  0x60D3,\n\t5181:  0x60B4,\n\t5182:  0x5FF0,\n\t5183:  0x60BD,\n\t5184:  0x60C6,\n\t5185:  0x60B5,\n\t5186:  0x60D8,\n\t5187:  0x614D,\n\t5188:  0x6115,\n\t5189:  0x6106,\n\t5190:  0x60F6,\n\t5191:  0x60F7,\n\t5192:  0x6100,\n\t5193:  0x60F4,\n\t5194:  0x60FA,\n\t5195:  0x6103,\n\t5196:  0x6121,\n\t5197:  0x60FB,\n\t5198:  0x60F1,\n\t5199:  0x610D,\n\t5200:  0x610E,\n\t5201:  0x6147,\n\t5202:  0x613E,\n\t5203:  0x6128,\n\t5204:  0x6127,\n\t5205:  0x614A,\n\t5206:  0x613F,\n\t5207:  0x613C,\n\t5208:  0x612C,\n\t5209:  0x6134,\n\t5210:  0x613D,\n\t5211:  0x6142,\n\t5212:  0x6144,\n\t5213:  0x6173,\n\t5214:  0x6177,\n\t5215:  0x6158,\n\t5216:  0x6159,\n\t5217:  0x615A,\n\t5218:  0x616B,\n\t5219:  0x6174,\n\t5220:  0x616F,\n\t5221:  0x6165,\n\t5222:  0x6171,\n\t5223:  0x615F,\n\t5224:  0x615D,\n\t5225:  0x6153,\n\t5226:  0x6175,\n\t5227:  0x6199,\n\t5228:  0x6196,\n\t5229:  0x6187,\n\t5230:  0x61AC,\n\t5231:  0x6194,\n\t5232:  0x619A,\n\t5233:  0x618A,\n\t5234:  0x6191,\n\t5235:  0x61AB,\n\t5236:  0x61AE,\n\t5237:  0x61CC,\n\t5238:  0x61CA,\n\t5239:  0x61C9,\n\t5240:  0x61F7,\n\t5241:  0x61C8,\n\t5242:  0x61C3,\n\t5243:  0x61C6,\n\t5244:  0x61BA,\n\t5245:  0x61CB,\n\t5246:  0x7F79,\n\t5247:  0x61CD,\n\t5248:  0x61E6,\n\t5249:  0x61E3,\n\t5250:  0x61F6,\n\t5251:  0x61FA,\n\t5252:  0x61F4,\n\t5253:  0x61FF,\n\t5254:  0x61FD,\n\t5255:  0x61FC,\n\t5256:  0x61FE,\n\t5257:  0x6200,\n\t5258:  0x6208,\n\t5259:  0x6209,\n\t5260:  0x620D,\n\t5261:  0x620C,\n\t5262:  0x6214,\n\t5263:  0x621B,\n\t5264:  0x621E,\n\t5265:  0x6221,\n\t5266:  0x622A,\n\t5267:  0x622E,\n\t5268:  0x6230,\n\t5269:  0x6232,\n\t5270:  0x6233,\n\t5271:  0x6241,\n\t5272:  0x624E,\n\t5273:  0x625E,\n\t5274:  0x6263,\n\t5275:  0x625B,\n\t5276:  0x6260,\n\t5277:  0x6268,\n\t5278:  0x627C,\n\t5279:  0x6282,\n\t5280:  0x6289,\n\t5281:  0x627E,\n\t5282:  0x6292,\n\t5283:  0x6293,\n\t5284:  0x6296,\n\t5285:  0x62D4,\n\t5286:  0x6283,\n\t5287:  0x6294,\n\t5288:  0x62D7,\n\t5289:  0x62D1,\n\t5290:  0x62BB,\n\t5291:  0x62CF,\n\t5292:  0x62FF,\n\t5293:  0x62C6,\n\t5294:  0x64D4,\n\t5295:  0x62C8,\n\t5296:  0x62DC,\n\t5297:  0x62CC,\n\t5298:  0x62CA,\n\t5299:  0x62C2,\n\t5300:  0x62C7,\n\t5301:  0x629B,\n\t5302:  0x62C9,\n\t5303:  0x630C,\n\t5304:  0x62EE,\n\t5305:  0x62F1,\n\t5306:  0x6327,\n\t5307:  0x6302,\n\t5308:  0x6308,\n\t5309:  0x62EF,\n\t5310:  0x62F5,\n\t5311:  0x6350,\n\t5312:  0x633E,\n\t5313:  0x634D,\n\t5314:  0x641C,\n\t5315:  0x634F,\n\t5316:  0x6396,\n\t5317:  0x638E,\n\t5318:  0x6380,\n\t5319:  0x63AB,\n\t5320:  0x6376,\n\t5321:  0x63A3,\n\t5322:  0x638F,\n\t5323:  0x6389,\n\t5324:  0x639F,\n\t5325:  0x63B5,\n\t5326:  0x636B,\n\t5327:  0x6369,\n\t5328:  0x63BE,\n\t5329:  0x63E9,\n\t5330:  0x63C0,\n\t5331:  0x63C6,\n\t5332:  0x63E3,\n\t5333:  0x63C9,\n\t5334:  0x63D2,\n\t5335:  0x63F6,\n\t5336:  0x63C4,\n\t5337:  0x6416,\n\t5338:  0x6434,\n\t5339:  0x6406,\n\t5340:  0x6413,\n\t5341:  0x6426,\n\t5342:  0x6436,\n\t5343:  0x651D,\n\t5344:  0x6417,\n\t5345:  0x6428,\n\t5346:  0x640F,\n\t5347:  0x6467,\n\t5348:  0x646F,\n\t5349:  0x6476,\n\t5350:  0x644E,\n\t5351:  0x652A,\n\t5352:  0x6495,\n\t5353:  0x6493,\n\t5354:  0x64A5,\n\t5355:  0x64A9,\n\t5356:  0x6488,\n\t5357:  0x64BC,\n\t5358:  0x64DA,\n\t5359:  0x64D2,\n\t5360:  0x64C5,\n\t5361:  0x64C7,\n\t5362:  0x64BB,\n\t5363:  0x64D8,\n\t5364:  0x64C2,\n\t5365:  0x64F1,\n\t5366:  0x64E7,\n\t5367:  0x8209,\n\t5368:  0x64E0,\n\t5369:  0x64E1,\n\t5370:  0x62AC,\n\t5371:  0x64E3,\n\t5372:  0x64EF,\n\t5373:  0x652C,\n\t5374:  0x64F6,\n\t5375:  0x64F4,\n\t5376:  0x64F2,\n\t5377:  0x64FA,\n\t5378:  0x6500,\n\t5379:  0x64FD,\n\t5380:  0x6518,\n\t5381:  0x651C,\n\t5382:  0x6505,\n\t5383:  0x6524,\n\t5384:  0x6523,\n\t5385:  0x652B,\n\t5386:  0x6534,\n\t5387:  0x6535,\n\t5388:  0x6537,\n\t5389:  0x6536,\n\t5390:  0x6538,\n\t5391:  0x754B,\n\t5392:  0x6548,\n\t5393:  0x6556,\n\t5394:  0x6555,\n\t5395:  0x654D,\n\t5396:  0x6558,\n\t5397:  0x655E,\n\t5398:  0x655D,\n\t5399:  0x6572,\n\t5400:  0x6578,\n\t5401:  0x6582,\n\t5402:  0x6583,\n\t5403:  0x8B8A,\n\t5404:  0x659B,\n\t5405:  0x659F,\n\t5406:  0x65AB,\n\t5407:  0x65B7,\n\t5408:  0x65C3,\n\t5409:  0x65C6,\n\t5410:  0x65C1,\n\t5411:  0x65C4,\n\t5412:  0x65CC,\n\t5413:  0x65D2,\n\t5414:  0x65DB,\n\t5415:  0x65D9,\n\t5416:  0x65E0,\n\t5417:  0x65E1,\n\t5418:  0x65F1,\n\t5419:  0x6772,\n\t5420:  0x660A,\n\t5421:  0x6603,\n\t5422:  0x65FB,\n\t5423:  0x6773,\n\t5424:  0x6635,\n\t5425:  0x6636,\n\t5426:  0x6634,\n\t5427:  0x661C,\n\t5428:  0x664F,\n\t5429:  0x6644,\n\t5430:  0x6649,\n\t5431:  0x6641,\n\t5432:  0x665E,\n\t5433:  0x665D,\n\t5434:  0x6664,\n\t5435:  0x6667,\n\t5436:  0x6668,\n\t5437:  0x665F,\n\t5438:  0x6662,\n\t5439:  0x6670,\n\t5440:  0x6683,\n\t5441:  0x6688,\n\t5442:  0x668E,\n\t5443:  0x6689,\n\t5444:  0x6684,\n\t5445:  0x6698,\n\t5446:  0x669D,\n\t5447:  0x66C1,\n\t5448:  0x66B9,\n\t5449:  0x66C9,\n\t5450:  0x66BE,\n\t5451:  0x66BC,\n\t5452:  0x66C4,\n\t5453:  0x66B8,\n\t5454:  0x66D6,\n\t5455:  0x66DA,\n\t5456:  0x66E0,\n\t5457:  0x663F,\n\t5458:  0x66E6,\n\t5459:  0x66E9,\n\t5460:  0x66F0,\n\t5461:  0x66F5,\n\t5462:  0x66F7,\n\t5463:  0x670F,\n\t5464:  0x6716,\n\t5465:  0x671E,\n\t5466:  0x6726,\n\t5467:  0x6727,\n\t5468:  0x9738,\n\t5469:  0x672E,\n\t5470:  0x673F,\n\t5471:  0x6736,\n\t5472:  0x6741,\n\t5473:  0x6738,\n\t5474:  0x6737,\n\t5475:  0x6746,\n\t5476:  0x675E,\n\t5477:  0x6760,\n\t5478:  0x6759,\n\t5479:  0x6763,\n\t5480:  0x6764,\n\t5481:  0x6789,\n\t5482:  0x6770,\n\t5483:  0x67A9,\n\t5484:  0x677C,\n\t5485:  0x676A,\n\t5486:  0x678C,\n\t5487:  0x678B,\n\t5488:  0x67A6,\n\t5489:  0x67A1,\n\t5490:  0x6785,\n\t5491:  0x67B7,\n\t5492:  0x67EF,\n\t5493:  0x67B4,\n\t5494:  0x67EC,\n\t5495:  0x67B3,\n\t5496:  0x67E9,\n\t5497:  0x67B8,\n\t5498:  0x67E4,\n\t5499:  0x67DE,\n\t5500:  0x67DD,\n\t5501:  0x67E2,\n\t5502:  0x67EE,\n\t5503:  0x67B9,\n\t5504:  0x67CE,\n\t5505:  0x67C6,\n\t5506:  0x67E7,\n\t5507:  0x6A9C,\n\t5508:  0x681E,\n\t5509:  0x6846,\n\t5510:  0x6829,\n\t5511:  0x6840,\n\t5512:  0x684D,\n\t5513:  0x6832,\n\t5514:  0x684E,\n\t5515:  0x68B3,\n\t5516:  0x682B,\n\t5517:  0x6859,\n\t5518:  0x6863,\n\t5519:  0x6877,\n\t5520:  0x687F,\n\t5521:  0x689F,\n\t5522:  0x688F,\n\t5523:  0x68AD,\n\t5524:  0x6894,\n\t5525:  0x689D,\n\t5526:  0x689B,\n\t5527:  0x6883,\n\t5528:  0x6AAE,\n\t5529:  0x68B9,\n\t5530:  0x6874,\n\t5531:  0x68B5,\n\t5532:  0x68A0,\n\t5533:  0x68BA,\n\t5534:  0x690F,\n\t5535:  0x688D,\n\t5536:  0x687E,\n\t5537:  0x6901,\n\t5538:  0x68CA,\n\t5539:  0x6908,\n\t5540:  0x68D8,\n\t5541:  0x6922,\n\t5542:  0x6926,\n\t5543:  0x68E1,\n\t5544:  0x690C,\n\t5545:  0x68CD,\n\t5546:  0x68D4,\n\t5547:  0x68E7,\n\t5548:  0x68D5,\n\t5549:  0x6936,\n\t5550:  0x6912,\n\t5551:  0x6904,\n\t5552:  0x68D7,\n\t5553:  0x68E3,\n\t5554:  0x6925,\n\t5555:  0x68F9,\n\t5556:  0x68E0,\n\t5557:  0x68EF,\n\t5558:  0x6928,\n\t5559:  0x692A,\n\t5560:  0x691A,\n\t5561:  0x6923,\n\t5562:  0x6921,\n\t5563:  0x68C6,\n\t5564:  0x6979,\n\t5565:  0x6977,\n\t5566:  0x695C,\n\t5567:  0x6978,\n\t5568:  0x696B,\n\t5569:  0x6954,\n\t5570:  0x697E,\n\t5571:  0x696E,\n\t5572:  0x6939,\n\t5573:  0x6974,\n\t5574:  0x693D,\n\t5575:  0x6959,\n\t5576:  0x6930,\n\t5577:  0x6961,\n\t5578:  0x695E,\n\t5579:  0x695D,\n\t5580:  0x6981,\n\t5581:  0x696A,\n\t5582:  0x69B2,\n\t5583:  0x69AE,\n\t5584:  0x69D0,\n\t5585:  0x69BF,\n\t5586:  0x69C1,\n\t5587:  0x69D3,\n\t5588:  0x69BE,\n\t5589:  0x69CE,\n\t5590:  0x5BE8,\n\t5591:  0x69CA,\n\t5592:  0x69DD,\n\t5593:  0x69BB,\n\t5594:  0x69C3,\n\t5595:  0x69A7,\n\t5596:  0x6A2E,\n\t5597:  0x6991,\n\t5598:  0x69A0,\n\t5599:  0x699C,\n\t5600:  0x6995,\n\t5601:  0x69B4,\n\t5602:  0x69DE,\n\t5603:  0x69E8,\n\t5604:  0x6A02,\n\t5605:  0x6A1B,\n\t5606:  0x69FF,\n\t5607:  0x6B0A,\n\t5608:  0x69F9,\n\t5609:  0x69F2,\n\t5610:  0x69E7,\n\t5611:  0x6A05,\n\t5612:  0x69B1,\n\t5613:  0x6A1E,\n\t5614:  0x69ED,\n\t5615:  0x6A14,\n\t5616:  0x69EB,\n\t5617:  0x6A0A,\n\t5618:  0x6A12,\n\t5619:  0x6AC1,\n\t5620:  0x6A23,\n\t5621:  0x6A13,\n\t5622:  0x6A44,\n\t5623:  0x6A0C,\n\t5624:  0x6A72,\n\t5625:  0x6A36,\n\t5626:  0x6A78,\n\t5627:  0x6A47,\n\t5628:  0x6A62,\n\t5629:  0x6A59,\n\t5630:  0x6A66,\n\t5631:  0x6A48,\n\t5632:  0x6A38,\n\t5633:  0x6A22,\n\t5634:  0x6A90,\n\t5635:  0x6A8D,\n\t5636:  0x6AA0,\n\t5637:  0x6A84,\n\t5638:  0x6AA2,\n\t5639:  0x6AA3,\n\t5640:  0x6A97,\n\t5641:  0x8617,\n\t5642:  0x6ABB,\n\t5643:  0x6AC3,\n\t5644:  0x6AC2,\n\t5645:  0x6AB8,\n\t5646:  0x6AB3,\n\t5647:  0x6AAC,\n\t5648:  0x6ADE,\n\t5649:  0x6AD1,\n\t5650:  0x6ADF,\n\t5651:  0x6AAA,\n\t5652:  0x6ADA,\n\t5653:  0x6AEA,\n\t5654:  0x6AFB,\n\t5655:  0x6B05,\n\t5656:  0x8616,\n\t5657:  0x6AFA,\n\t5658:  0x6B12,\n\t5659:  0x6B16,\n\t5660:  0x9B31,\n\t5661:  0x6B1F,\n\t5662:  0x6B38,\n\t5663:  0x6B37,\n\t5664:  0x76DC,\n\t5665:  0x6B39,\n\t5666:  0x98EE,\n\t5667:  0x6B47,\n\t5668:  0x6B43,\n\t5669:  0x6B49,\n\t5670:  0x6B50,\n\t5671:  0x6B59,\n\t5672:  0x6B54,\n\t5673:  0x6B5B,\n\t5674:  0x6B5F,\n\t5675:  0x6B61,\n\t5676:  0x6B78,\n\t5677:  0x6B79,\n\t5678:  0x6B7F,\n\t5679:  0x6B80,\n\t5680:  0x6B84,\n\t5681:  0x6B83,\n\t5682:  0x6B8D,\n\t5683:  0x6B98,\n\t5684:  0x6B95,\n\t5685:  0x6B9E,\n\t5686:  0x6BA4,\n\t5687:  0x6BAA,\n\t5688:  0x6BAB,\n\t5689:  0x6BAF,\n\t5690:  0x6BB2,\n\t5691:  0x6BB1,\n\t5692:  0x6BB3,\n\t5693:  0x6BB7,\n\t5694:  0x6BBC,\n\t5695:  0x6BC6,\n\t5696:  0x6BCB,\n\t5697:  0x6BD3,\n\t5698:  0x6BDF,\n\t5699:  0x6BEC,\n\t5700:  0x6BEB,\n\t5701:  0x6BF3,\n\t5702:  0x6BEF,\n\t5703:  0x9EBE,\n\t5704:  0x6C08,\n\t5705:  0x6C13,\n\t5706:  0x6C14,\n\t5707:  0x6C1B,\n\t5708:  0x6C24,\n\t5709:  0x6C23,\n\t5710:  0x6C5E,\n\t5711:  0x6C55,\n\t5712:  0x6C62,\n\t5713:  0x6C6A,\n\t5714:  0x6C82,\n\t5715:  0x6C8D,\n\t5716:  0x6C9A,\n\t5717:  0x6C81,\n\t5718:  0x6C9B,\n\t5719:  0x6C7E,\n\t5720:  0x6C68,\n\t5721:  0x6C73,\n\t5722:  0x6C92,\n\t5723:  0x6C90,\n\t5724:  0x6CC4,\n\t5725:  0x6CF1,\n\t5726:  0x6CD3,\n\t5727:  0x6CBD,\n\t5728:  0x6CD7,\n\t5729:  0x6CC5,\n\t5730:  0x6CDD,\n\t5731:  0x6CAE,\n\t5732:  0x6CB1,\n\t5733:  0x6CBE,\n\t5734:  0x6CBA,\n\t5735:  0x6CDB,\n\t5736:  0x6CEF,\n\t5737:  0x6CD9,\n\t5738:  0x6CEA,\n\t5739:  0x6D1F,\n\t5740:  0x884D,\n\t5741:  0x6D36,\n\t5742:  0x6D2B,\n\t5743:  0x6D3D,\n\t5744:  0x6D38,\n\t5745:  0x6D19,\n\t5746:  0x6D35,\n\t5747:  0x6D33,\n\t5748:  0x6D12,\n\t5749:  0x6D0C,\n\t5750:  0x6D63,\n\t5751:  0x6D93,\n\t5752:  0x6D64,\n\t5753:  0x6D5A,\n\t5754:  0x6D79,\n\t5755:  0x6D59,\n\t5756:  0x6D8E,\n\t5757:  0x6D95,\n\t5758:  0x6FE4,\n\t5759:  0x6D85,\n\t5760:  0x6DF9,\n\t5761:  0x6E15,\n\t5762:  0x6E0A,\n\t5763:  0x6DB5,\n\t5764:  0x6DC7,\n\t5765:  0x6DE6,\n\t5766:  0x6DB8,\n\t5767:  0x6DC6,\n\t5768:  0x6DEC,\n\t5769:  0x6DDE,\n\t5770:  0x6DCC,\n\t5771:  0x6DE8,\n\t5772:  0x6DD2,\n\t5773:  0x6DC5,\n\t5774:  0x6DFA,\n\t5775:  0x6DD9,\n\t5776:  0x6DE4,\n\t5777:  0x6DD5,\n\t5778:  0x6DEA,\n\t5779:  0x6DEE,\n\t5780:  0x6E2D,\n\t5781:  0x6E6E,\n\t5782:  0x6E2E,\n\t5783:  0x6E19,\n\t5784:  0x6E72,\n\t5785:  0x6E5F,\n\t5786:  0x6E3E,\n\t5787:  0x6E23,\n\t5788:  0x6E6B,\n\t5789:  0x6E2B,\n\t5790:  0x6E76,\n\t5791:  0x6E4D,\n\t5792:  0x6E1F,\n\t5793:  0x6E43,\n\t5794:  0x6E3A,\n\t5795:  0x6E4E,\n\t5796:  0x6E24,\n\t5797:  0x6EFF,\n\t5798:  0x6E1D,\n\t5799:  0x6E38,\n\t5800:  0x6E82,\n\t5801:  0x6EAA,\n\t5802:  0x6E98,\n\t5803:  0x6EC9,\n\t5804:  0x6EB7,\n\t5805:  0x6ED3,\n\t5806:  0x6EBD,\n\t5807:  0x6EAF,\n\t5808:  0x6EC4,\n\t5809:  0x6EB2,\n\t5810:  0x6ED4,\n\t5811:  0x6ED5,\n\t5812:  0x6E8F,\n\t5813:  0x6EA5,\n\t5814:  0x6EC2,\n\t5815:  0x6E9F,\n\t5816:  0x6F41,\n\t5817:  0x6F11,\n\t5818:  0x704C,\n\t5819:  0x6EEC,\n\t5820:  0x6EF8,\n\t5821:  0x6EFE,\n\t5822:  0x6F3F,\n\t5823:  0x6EF2,\n\t5824:  0x6F31,\n\t5825:  0x6EEF,\n\t5826:  0x6F32,\n\t5827:  0x6ECC,\n\t5828:  0x6F3E,\n\t5829:  0x6F13,\n\t5830:  0x6EF7,\n\t5831:  0x6F86,\n\t5832:  0x6F7A,\n\t5833:  0x6F78,\n\t5834:  0x6F81,\n\t5835:  0x6F80,\n\t5836:  0x6F6F,\n\t5837:  0x6F5B,\n\t5838:  0x6FF3,\n\t5839:  0x6F6D,\n\t5840:  0x6F82,\n\t5841:  0x6F7C,\n\t5842:  0x6F58,\n\t5843:  0x6F8E,\n\t5844:  0x6F91,\n\t5845:  0x6FC2,\n\t5846:  0x6F66,\n\t5847:  0x6FB3,\n\t5848:  0x6FA3,\n\t5849:  0x6FA1,\n\t5850:  0x6FA4,\n\t5851:  0x6FB9,\n\t5852:  0x6FC6,\n\t5853:  0x6FAA,\n\t5854:  0x6FDF,\n\t5855:  0x6FD5,\n\t5856:  0x6FEC,\n\t5857:  0x6FD4,\n\t5858:  0x6FD8,\n\t5859:  0x6FF1,\n\t5860:  0x6FEE,\n\t5861:  0x6FDB,\n\t5862:  0x7009,\n\t5863:  0x700B,\n\t5864:  0x6FFA,\n\t5865:  0x7011,\n\t5866:  0x7001,\n\t5867:  0x700F,\n\t5868:  0x6FFE,\n\t5869:  0x701B,\n\t5870:  0x701A,\n\t5871:  0x6F74,\n\t5872:  0x701D,\n\t5873:  0x7018,\n\t5874:  0x701F,\n\t5875:  0x7030,\n\t5876:  0x703E,\n\t5877:  0x7032,\n\t5878:  0x7051,\n\t5879:  0x7063,\n\t5880:  0x7099,\n\t5881:  0x7092,\n\t5882:  0x70AF,\n\t5883:  0x70F1,\n\t5884:  0x70AC,\n\t5885:  0x70B8,\n\t5886:  0x70B3,\n\t5887:  0x70AE,\n\t5888:  0x70DF,\n\t5889:  0x70CB,\n\t5890:  0x70DD,\n\t5891:  0x70D9,\n\t5892:  0x7109,\n\t5893:  0x70FD,\n\t5894:  0x711C,\n\t5895:  0x7119,\n\t5896:  0x7165,\n\t5897:  0x7155,\n\t5898:  0x7188,\n\t5899:  0x7166,\n\t5900:  0x7162,\n\t5901:  0x714C,\n\t5902:  0x7156,\n\t5903:  0x716C,\n\t5904:  0x718F,\n\t5905:  0x71FB,\n\t5906:  0x7184,\n\t5907:  0x7195,\n\t5908:  0x71A8,\n\t5909:  0x71AC,\n\t5910:  0x71D7,\n\t5911:  0x71B9,\n\t5912:  0x71BE,\n\t5913:  0x71D2,\n\t5914:  0x71C9,\n\t5915:  0x71D4,\n\t5916:  0x71CE,\n\t5917:  0x71E0,\n\t5918:  0x71EC,\n\t5919:  0x71E7,\n\t5920:  0x71F5,\n\t5921:  0x71FC,\n\t5922:  0x71F9,\n\t5923:  0x71FF,\n\t5924:  0x720D,\n\t5925:  0x7210,\n\t5926:  0x721B,\n\t5927:  0x7228,\n\t5928:  0x722D,\n\t5929:  0x722C,\n\t5930:  0x7230,\n\t5931:  0x7232,\n\t5932:  0x723B,\n\t5933:  0x723C,\n\t5934:  0x723F,\n\t5935:  0x7240,\n\t5936:  0x7246,\n\t5937:  0x724B,\n\t5938:  0x7258,\n\t5939:  0x7274,\n\t5940:  0x727E,\n\t5941:  0x7282,\n\t5942:  0x7281,\n\t5943:  0x7287,\n\t5944:  0x7292,\n\t5945:  0x7296,\n\t5946:  0x72A2,\n\t5947:  0x72A7,\n\t5948:  0x72B9,\n\t5949:  0x72B2,\n\t5950:  0x72C3,\n\t5951:  0x72C6,\n\t5952:  0x72C4,\n\t5953:  0x72CE,\n\t5954:  0x72D2,\n\t5955:  0x72E2,\n\t5956:  0x72E0,\n\t5957:  0x72E1,\n\t5958:  0x72F9,\n\t5959:  0x72F7,\n\t5960:  0x500F,\n\t5961:  0x7317,\n\t5962:  0x730A,\n\t5963:  0x731C,\n\t5964:  0x7316,\n\t5965:  0x731D,\n\t5966:  0x7334,\n\t5967:  0x732F,\n\t5968:  0x7329,\n\t5969:  0x7325,\n\t5970:  0x733E,\n\t5971:  0x734E,\n\t5972:  0x734F,\n\t5973:  0x9ED8,\n\t5974:  0x7357,\n\t5975:  0x736A,\n\t5976:  0x7368,\n\t5977:  0x7370,\n\t5978:  0x7378,\n\t5979:  0x7375,\n\t5980:  0x737B,\n\t5981:  0x737A,\n\t5982:  0x73C8,\n\t5983:  0x73B3,\n\t5984:  0x73CE,\n\t5985:  0x73BB,\n\t5986:  0x73C0,\n\t5987:  0x73E5,\n\t5988:  0x73EE,\n\t5989:  0x73DE,\n\t5990:  0x74A2,\n\t5991:  0x7405,\n\t5992:  0x746F,\n\t5993:  0x7425,\n\t5994:  0x73F8,\n\t5995:  0x7432,\n\t5996:  0x743A,\n\t5997:  0x7455,\n\t5998:  0x743F,\n\t5999:  0x745F,\n\t6000:  0x7459,\n\t6001:  0x7441,\n\t6002:  0x745C,\n\t6003:  0x7469,\n\t6004:  0x7470,\n\t6005:  0x7463,\n\t6006:  0x746A,\n\t6007:  0x7476,\n\t6008:  0x747E,\n\t6009:  0x748B,\n\t6010:  0x749E,\n\t6011:  0x74A7,\n\t6012:  0x74CA,\n\t6013:  0x74CF,\n\t6014:  0x74D4,\n\t6015:  0x73F1,\n\t6016:  0x74E0,\n\t6017:  0x74E3,\n\t6018:  0x74E7,\n\t6019:  0x74E9,\n\t6020:  0x74EE,\n\t6021:  0x74F2,\n\t6022:  0x74F0,\n\t6023:  0x74F1,\n\t6024:  0x74F8,\n\t6025:  0x74F7,\n\t6026:  0x7504,\n\t6027:  0x7503,\n\t6028:  0x7505,\n\t6029:  0x750C,\n\t6030:  0x750E,\n\t6031:  0x750D,\n\t6032:  0x7515,\n\t6033:  0x7513,\n\t6034:  0x751E,\n\t6035:  0x7526,\n\t6036:  0x752C,\n\t6037:  0x753C,\n\t6038:  0x7544,\n\t6039:  0x754D,\n\t6040:  0x754A,\n\t6041:  0x7549,\n\t6042:  0x755B,\n\t6043:  0x7546,\n\t6044:  0x755A,\n\t6045:  0x7569,\n\t6046:  0x7564,\n\t6047:  0x7567,\n\t6048:  0x756B,\n\t6049:  0x756D,\n\t6050:  0x7578,\n\t6051:  0x7576,\n\t6052:  0x7586,\n\t6053:  0x7587,\n\t6054:  0x7574,\n\t6055:  0x758A,\n\t6056:  0x7589,\n\t6057:  0x7582,\n\t6058:  0x7594,\n\t6059:  0x759A,\n\t6060:  0x759D,\n\t6061:  0x75A5,\n\t6062:  0x75A3,\n\t6063:  0x75C2,\n\t6064:  0x75B3,\n\t6065:  0x75C3,\n\t6066:  0x75B5,\n\t6067:  0x75BD,\n\t6068:  0x75B8,\n\t6069:  0x75BC,\n\t6070:  0x75B1,\n\t6071:  0x75CD,\n\t6072:  0x75CA,\n\t6073:  0x75D2,\n\t6074:  0x75D9,\n\t6075:  0x75E3,\n\t6076:  0x75DE,\n\t6077:  0x75FE,\n\t6078:  0x75FF,\n\t6079:  0x75FC,\n\t6080:  0x7601,\n\t6081:  0x75F0,\n\t6082:  0x75FA,\n\t6083:  0x75F2,\n\t6084:  0x75F3,\n\t6085:  0x760B,\n\t6086:  0x760D,\n\t6087:  0x7609,\n\t6088:  0x761F,\n\t6089:  0x7627,\n\t6090:  0x7620,\n\t6091:  0x7621,\n\t6092:  0x7622,\n\t6093:  0x7624,\n\t6094:  0x7634,\n\t6095:  0x7630,\n\t6096:  0x763B,\n\t6097:  0x7647,\n\t6098:  0x7648,\n\t6099:  0x7646,\n\t6100:  0x765C,\n\t6101:  0x7658,\n\t6102:  0x7661,\n\t6103:  0x7662,\n\t6104:  0x7668,\n\t6105:  0x7669,\n\t6106:  0x766A,\n\t6107:  0x7667,\n\t6108:  0x766C,\n\t6109:  0x7670,\n\t6110:  0x7672,\n\t6111:  0x7676,\n\t6112:  0x7678,\n\t6113:  0x767C,\n\t6114:  0x7680,\n\t6115:  0x7683,\n\t6116:  0x7688,\n\t6117:  0x768B,\n\t6118:  0x768E,\n\t6119:  0x7696,\n\t6120:  0x7693,\n\t6121:  0x7699,\n\t6122:  0x769A,\n\t6123:  0x76B0,\n\t6124:  0x76B4,\n\t6125:  0x76B8,\n\t6126:  0x76B9,\n\t6127:  0x76BA,\n\t6128:  0x76C2,\n\t6129:  0x76CD,\n\t6130:  0x76D6,\n\t6131:  0x76D2,\n\t6132:  0x76DE,\n\t6133:  0x76E1,\n\t6134:  0x76E5,\n\t6135:  0x76E7,\n\t6136:  0x76EA,\n\t6137:  0x862F,\n\t6138:  0x76FB,\n\t6139:  0x7708,\n\t6140:  0x7707,\n\t6141:  0x7704,\n\t6142:  0x7729,\n\t6143:  0x7724,\n\t6144:  0x771E,\n\t6145:  0x7725,\n\t6146:  0x7726,\n\t6147:  0x771B,\n\t6148:  0x7737,\n\t6149:  0x7738,\n\t6150:  0x7747,\n\t6151:  0x775A,\n\t6152:  0x7768,\n\t6153:  0x776B,\n\t6154:  0x775B,\n\t6155:  0x7765,\n\t6156:  0x777F,\n\t6157:  0x777E,\n\t6158:  0x7779,\n\t6159:  0x778E,\n\t6160:  0x778B,\n\t6161:  0x7791,\n\t6162:  0x77A0,\n\t6163:  0x779E,\n\t6164:  0x77B0,\n\t6165:  0x77B6,\n\t6166:  0x77B9,\n\t6167:  0x77BF,\n\t6168:  0x77BC,\n\t6169:  0x77BD,\n\t6170:  0x77BB,\n\t6171:  0x77C7,\n\t6172:  0x77CD,\n\t6173:  0x77D7,\n\t6174:  0x77DA,\n\t6175:  0x77DC,\n\t6176:  0x77E3,\n\t6177:  0x77EE,\n\t6178:  0x77FC,\n\t6179:  0x780C,\n\t6180:  0x7812,\n\t6181:  0x7926,\n\t6182:  0x7820,\n\t6183:  0x792A,\n\t6184:  0x7845,\n\t6185:  0x788E,\n\t6186:  0x7874,\n\t6187:  0x7886,\n\t6188:  0x787C,\n\t6189:  0x789A,\n\t6190:  0x788C,\n\t6191:  0x78A3,\n\t6192:  0x78B5,\n\t6193:  0x78AA,\n\t6194:  0x78AF,\n\t6195:  0x78D1,\n\t6196:  0x78C6,\n\t6197:  0x78CB,\n\t6198:  0x78D4,\n\t6199:  0x78BE,\n\t6200:  0x78BC,\n\t6201:  0x78C5,\n\t6202:  0x78CA,\n\t6203:  0x78EC,\n\t6204:  0x78E7,\n\t6205:  0x78DA,\n\t6206:  0x78FD,\n\t6207:  0x78F4,\n\t6208:  0x7907,\n\t6209:  0x7912,\n\t6210:  0x7911,\n\t6211:  0x7919,\n\t6212:  0x792C,\n\t6213:  0x792B,\n\t6214:  0x7940,\n\t6215:  0x7960,\n\t6216:  0x7957,\n\t6217:  0x795F,\n\t6218:  0x795A,\n\t6219:  0x7955,\n\t6220:  0x7953,\n\t6221:  0x797A,\n\t6222:  0x797F,\n\t6223:  0x798A,\n\t6224:  0x799D,\n\t6225:  0x79A7,\n\t6226:  0x9F4B,\n\t6227:  0x79AA,\n\t6228:  0x79AE,\n\t6229:  0x79B3,\n\t6230:  0x79B9,\n\t6231:  0x79BA,\n\t6232:  0x79C9,\n\t6233:  0x79D5,\n\t6234:  0x79E7,\n\t6235:  0x79EC,\n\t6236:  0x79E1,\n\t6237:  0x79E3,\n\t6238:  0x7A08,\n\t6239:  0x7A0D,\n\t6240:  0x7A18,\n\t6241:  0x7A19,\n\t6242:  0x7A20,\n\t6243:  0x7A1F,\n\t6244:  0x7980,\n\t6245:  0x7A31,\n\t6246:  0x7A3B,\n\t6247:  0x7A3E,\n\t6248:  0x7A37,\n\t6249:  0x7A43,\n\t6250:  0x7A57,\n\t6251:  0x7A49,\n\t6252:  0x7A61,\n\t6253:  0x7A62,\n\t6254:  0x7A69,\n\t6255:  0x9F9D,\n\t6256:  0x7A70,\n\t6257:  0x7A79,\n\t6258:  0x7A7D,\n\t6259:  0x7A88,\n\t6260:  0x7A97,\n\t6261:  0x7A95,\n\t6262:  0x7A98,\n\t6263:  0x7A96,\n\t6264:  0x7AA9,\n\t6265:  0x7AC8,\n\t6266:  0x7AB0,\n\t6267:  0x7AB6,\n\t6268:  0x7AC5,\n\t6269:  0x7AC4,\n\t6270:  0x7ABF,\n\t6271:  0x9083,\n\t6272:  0x7AC7,\n\t6273:  0x7ACA,\n\t6274:  0x7ACD,\n\t6275:  0x7ACF,\n\t6276:  0x7AD5,\n\t6277:  0x7AD3,\n\t6278:  0x7AD9,\n\t6279:  0x7ADA,\n\t6280:  0x7ADD,\n\t6281:  0x7AE1,\n\t6282:  0x7AE2,\n\t6283:  0x7AE6,\n\t6284:  0x7AED,\n\t6285:  0x7AF0,\n\t6286:  0x7B02,\n\t6287:  0x7B0F,\n\t6288:  0x7B0A,\n\t6289:  0x7B06,\n\t6290:  0x7B33,\n\t6291:  0x7B18,\n\t6292:  0x7B19,\n\t6293:  0x7B1E,\n\t6294:  0x7B35,\n\t6295:  0x7B28,\n\t6296:  0x7B36,\n\t6297:  0x7B50,\n\t6298:  0x7B7A,\n\t6299:  0x7B04,\n\t6300:  0x7B4D,\n\t6301:  0x7B0B,\n\t6302:  0x7B4C,\n\t6303:  0x7B45,\n\t6304:  0x7B75,\n\t6305:  0x7B65,\n\t6306:  0x7B74,\n\t6307:  0x7B67,\n\t6308:  0x7B70,\n\t6309:  0x7B71,\n\t6310:  0x7B6C,\n\t6311:  0x7B6E,\n\t6312:  0x7B9D,\n\t6313:  0x7B98,\n\t6314:  0x7B9F,\n\t6315:  0x7B8D,\n\t6316:  0x7B9C,\n\t6317:  0x7B9A,\n\t6318:  0x7B8B,\n\t6319:  0x7B92,\n\t6320:  0x7B8F,\n\t6321:  0x7B5D,\n\t6322:  0x7B99,\n\t6323:  0x7BCB,\n\t6324:  0x7BC1,\n\t6325:  0x7BCC,\n\t6326:  0x7BCF,\n\t6327:  0x7BB4,\n\t6328:  0x7BC6,\n\t6329:  0x7BDD,\n\t6330:  0x7BE9,\n\t6331:  0x7C11,\n\t6332:  0x7C14,\n\t6333:  0x7BE6,\n\t6334:  0x7BE5,\n\t6335:  0x7C60,\n\t6336:  0x7C00,\n\t6337:  0x7C07,\n\t6338:  0x7C13,\n\t6339:  0x7BF3,\n\t6340:  0x7BF7,\n\t6341:  0x7C17,\n\t6342:  0x7C0D,\n\t6343:  0x7BF6,\n\t6344:  0x7C23,\n\t6345:  0x7C27,\n\t6346:  0x7C2A,\n\t6347:  0x7C1F,\n\t6348:  0x7C37,\n\t6349:  0x7C2B,\n\t6350:  0x7C3D,\n\t6351:  0x7C4C,\n\t6352:  0x7C43,\n\t6353:  0x7C54,\n\t6354:  0x7C4F,\n\t6355:  0x7C40,\n\t6356:  0x7C50,\n\t6357:  0x7C58,\n\t6358:  0x7C5F,\n\t6359:  0x7C64,\n\t6360:  0x7C56,\n\t6361:  0x7C65,\n\t6362:  0x7C6C,\n\t6363:  0x7C75,\n\t6364:  0x7C83,\n\t6365:  0x7C90,\n\t6366:  0x7CA4,\n\t6367:  0x7CAD,\n\t6368:  0x7CA2,\n\t6369:  0x7CAB,\n\t6370:  0x7CA1,\n\t6371:  0x7CA8,\n\t6372:  0x7CB3,\n\t6373:  0x7CB2,\n\t6374:  0x7CB1,\n\t6375:  0x7CAE,\n\t6376:  0x7CB9,\n\t6377:  0x7CBD,\n\t6378:  0x7CC0,\n\t6379:  0x7CC5,\n\t6380:  0x7CC2,\n\t6381:  0x7CD8,\n\t6382:  0x7CD2,\n\t6383:  0x7CDC,\n\t6384:  0x7CE2,\n\t6385:  0x9B3B,\n\t6386:  0x7CEF,\n\t6387:  0x7CF2,\n\t6388:  0x7CF4,\n\t6389:  0x7CF6,\n\t6390:  0x7CFA,\n\t6391:  0x7D06,\n\t6392:  0x7D02,\n\t6393:  0x7D1C,\n\t6394:  0x7D15,\n\t6395:  0x7D0A,\n\t6396:  0x7D45,\n\t6397:  0x7D4B,\n\t6398:  0x7D2E,\n\t6399:  0x7D32,\n\t6400:  0x7D3F,\n\t6401:  0x7D35,\n\t6402:  0x7D46,\n\t6403:  0x7D73,\n\t6404:  0x7D56,\n\t6405:  0x7D4E,\n\t6406:  0x7D72,\n\t6407:  0x7D68,\n\t6408:  0x7D6E,\n\t6409:  0x7D4F,\n\t6410:  0x7D63,\n\t6411:  0x7D93,\n\t6412:  0x7D89,\n\t6413:  0x7D5B,\n\t6414:  0x7D8F,\n\t6415:  0x7D7D,\n\t6416:  0x7D9B,\n\t6417:  0x7DBA,\n\t6418:  0x7DAE,\n\t6419:  0x7DA3,\n\t6420:  0x7DB5,\n\t6421:  0x7DC7,\n\t6422:  0x7DBD,\n\t6423:  0x7DAB,\n\t6424:  0x7E3D,\n\t6425:  0x7DA2,\n\t6426:  0x7DAF,\n\t6427:  0x7DDC,\n\t6428:  0x7DB8,\n\t6429:  0x7D9F,\n\t6430:  0x7DB0,\n\t6431:  0x7DD8,\n\t6432:  0x7DDD,\n\t6433:  0x7DE4,\n\t6434:  0x7DDE,\n\t6435:  0x7DFB,\n\t6436:  0x7DF2,\n\t6437:  0x7DE1,\n\t6438:  0x7E05,\n\t6439:  0x7E0A,\n\t6440:  0x7E23,\n\t6441:  0x7E21,\n\t6442:  0x7E12,\n\t6443:  0x7E31,\n\t6444:  0x7E1F,\n\t6445:  0x7E09,\n\t6446:  0x7E0B,\n\t6447:  0x7E22,\n\t6448:  0x7E46,\n\t6449:  0x7E66,\n\t6450:  0x7E3B,\n\t6451:  0x7E35,\n\t6452:  0x7E39,\n\t6453:  0x7E43,\n\t6454:  0x7E37,\n\t6455:  0x7E32,\n\t6456:  0x7E3A,\n\t6457:  0x7E67,\n\t6458:  0x7E5D,\n\t6459:  0x7E56,\n\t6460:  0x7E5E,\n\t6461:  0x7E59,\n\t6462:  0x7E5A,\n\t6463:  0x7E79,\n\t6464:  0x7E6A,\n\t6465:  0x7E69,\n\t6466:  0x7E7C,\n\t6467:  0x7E7B,\n\t6468:  0x7E83,\n\t6469:  0x7DD5,\n\t6470:  0x7E7D,\n\t6471:  0x8FAE,\n\t6472:  0x7E7F,\n\t6473:  0x7E88,\n\t6474:  0x7E89,\n\t6475:  0x7E8C,\n\t6476:  0x7E92,\n\t6477:  0x7E90,\n\t6478:  0x7E93,\n\t6479:  0x7E94,\n\t6480:  0x7E96,\n\t6481:  0x7E8E,\n\t6482:  0x7E9B,\n\t6483:  0x7E9C,\n\t6484:  0x7F38,\n\t6485:  0x7F3A,\n\t6486:  0x7F45,\n\t6487:  0x7F4C,\n\t6488:  0x7F4D,\n\t6489:  0x7F4E,\n\t6490:  0x7F50,\n\t6491:  0x7F51,\n\t6492:  0x7F55,\n\t6493:  0x7F54,\n\t6494:  0x7F58,\n\t6495:  0x7F5F,\n\t6496:  0x7F60,\n\t6497:  0x7F68,\n\t6498:  0x7F69,\n\t6499:  0x7F67,\n\t6500:  0x7F78,\n\t6501:  0x7F82,\n\t6502:  0x7F86,\n\t6503:  0x7F83,\n\t6504:  0x7F88,\n\t6505:  0x7F87,\n\t6506:  0x7F8C,\n\t6507:  0x7F94,\n\t6508:  0x7F9E,\n\t6509:  0x7F9D,\n\t6510:  0x7F9A,\n\t6511:  0x7FA3,\n\t6512:  0x7FAF,\n\t6513:  0x7FB2,\n\t6514:  0x7FB9,\n\t6515:  0x7FAE,\n\t6516:  0x7FB6,\n\t6517:  0x7FB8,\n\t6518:  0x8B71,\n\t6519:  0x7FC5,\n\t6520:  0x7FC6,\n\t6521:  0x7FCA,\n\t6522:  0x7FD5,\n\t6523:  0x7FD4,\n\t6524:  0x7FE1,\n\t6525:  0x7FE6,\n\t6526:  0x7FE9,\n\t6527:  0x7FF3,\n\t6528:  0x7FF9,\n\t6529:  0x98DC,\n\t6530:  0x8006,\n\t6531:  0x8004,\n\t6532:  0x800B,\n\t6533:  0x8012,\n\t6534:  0x8018,\n\t6535:  0x8019,\n\t6536:  0x801C,\n\t6537:  0x8021,\n\t6538:  0x8028,\n\t6539:  0x803F,\n\t6540:  0x803B,\n\t6541:  0x804A,\n\t6542:  0x8046,\n\t6543:  0x8052,\n\t6544:  0x8058,\n\t6545:  0x805A,\n\t6546:  0x805F,\n\t6547:  0x8062,\n\t6548:  0x8068,\n\t6549:  0x8073,\n\t6550:  0x8072,\n\t6551:  0x8070,\n\t6552:  0x8076,\n\t6553:  0x8079,\n\t6554:  0x807D,\n\t6555:  0x807F,\n\t6556:  0x8084,\n\t6557:  0x8086,\n\t6558:  0x8085,\n\t6559:  0x809B,\n\t6560:  0x8093,\n\t6561:  0x809A,\n\t6562:  0x80AD,\n\t6563:  0x5190,\n\t6564:  0x80AC,\n\t6565:  0x80DB,\n\t6566:  0x80E5,\n\t6567:  0x80D9,\n\t6568:  0x80DD,\n\t6569:  0x80C4,\n\t6570:  0x80DA,\n\t6571:  0x80D6,\n\t6572:  0x8109,\n\t6573:  0x80EF,\n\t6574:  0x80F1,\n\t6575:  0x811B,\n\t6576:  0x8129,\n\t6577:  0x8123,\n\t6578:  0x812F,\n\t6579:  0x814B,\n\t6580:  0x968B,\n\t6581:  0x8146,\n\t6582:  0x813E,\n\t6583:  0x8153,\n\t6584:  0x8151,\n\t6585:  0x80FC,\n\t6586:  0x8171,\n\t6587:  0x816E,\n\t6588:  0x8165,\n\t6589:  0x8166,\n\t6590:  0x8174,\n\t6591:  0x8183,\n\t6592:  0x8188,\n\t6593:  0x818A,\n\t6594:  0x8180,\n\t6595:  0x8182,\n\t6596:  0x81A0,\n\t6597:  0x8195,\n\t6598:  0x81A4,\n\t6599:  0x81A3,\n\t6600:  0x815F,\n\t6601:  0x8193,\n\t6602:  0x81A9,\n\t6603:  0x81B0,\n\t6604:  0x81B5,\n\t6605:  0x81BE,\n\t6606:  0x81B8,\n\t6607:  0x81BD,\n\t6608:  0x81C0,\n\t6609:  0x81C2,\n\t6610:  0x81BA,\n\t6611:  0x81C9,\n\t6612:  0x81CD,\n\t6613:  0x81D1,\n\t6614:  0x81D9,\n\t6615:  0x81D8,\n\t6616:  0x81C8,\n\t6617:  0x81DA,\n\t6618:  0x81DF,\n\t6619:  0x81E0,\n\t6620:  0x81E7,\n\t6621:  0x81FA,\n\t6622:  0x81FB,\n\t6623:  0x81FE,\n\t6624:  0x8201,\n\t6625:  0x8202,\n\t6626:  0x8205,\n\t6627:  0x8207,\n\t6628:  0x820A,\n\t6629:  0x820D,\n\t6630:  0x8210,\n\t6631:  0x8216,\n\t6632:  0x8229,\n\t6633:  0x822B,\n\t6634:  0x8238,\n\t6635:  0x8233,\n\t6636:  0x8240,\n\t6637:  0x8259,\n\t6638:  0x8258,\n\t6639:  0x825D,\n\t6640:  0x825A,\n\t6641:  0x825F,\n\t6642:  0x8264,\n\t6643:  0x8262,\n\t6644:  0x8268,\n\t6645:  0x826A,\n\t6646:  0x826B,\n\t6647:  0x822E,\n\t6648:  0x8271,\n\t6649:  0x8277,\n\t6650:  0x8278,\n\t6651:  0x827E,\n\t6652:  0x828D,\n\t6653:  0x8292,\n\t6654:  0x82AB,\n\t6655:  0x829F,\n\t6656:  0x82BB,\n\t6657:  0x82AC,\n\t6658:  0x82E1,\n\t6659:  0x82E3,\n\t6660:  0x82DF,\n\t6661:  0x82D2,\n\t6662:  0x82F4,\n\t6663:  0x82F3,\n\t6664:  0x82FA,\n\t6665:  0x8393,\n\t6666:  0x8303,\n\t6667:  0x82FB,\n\t6668:  0x82F9,\n\t6669:  0x82DE,\n\t6670:  0x8306,\n\t6671:  0x82DC,\n\t6672:  0x8309,\n\t6673:  0x82D9,\n\t6674:  0x8335,\n\t6675:  0x8334,\n\t6676:  0x8316,\n\t6677:  0x8332,\n\t6678:  0x8331,\n\t6679:  0x8340,\n\t6680:  0x8339,\n\t6681:  0x8350,\n\t6682:  0x8345,\n\t6683:  0x832F,\n\t6684:  0x832B,\n\t6685:  0x8317,\n\t6686:  0x8318,\n\t6687:  0x8385,\n\t6688:  0x839A,\n\t6689:  0x83AA,\n\t6690:  0x839F,\n\t6691:  0x83A2,\n\t6692:  0x8396,\n\t6693:  0x8323,\n\t6694:  0x838E,\n\t6695:  0x8387,\n\t6696:  0x838A,\n\t6697:  0x837C,\n\t6698:  0x83B5,\n\t6699:  0x8373,\n\t6700:  0x8375,\n\t6701:  0x83A0,\n\t6702:  0x8389,\n\t6703:  0x83A8,\n\t6704:  0x83F4,\n\t6705:  0x8413,\n\t6706:  0x83EB,\n\t6707:  0x83CE,\n\t6708:  0x83FD,\n\t6709:  0x8403,\n\t6710:  0x83D8,\n\t6711:  0x840B,\n\t6712:  0x83C1,\n\t6713:  0x83F7,\n\t6714:  0x8407,\n\t6715:  0x83E0,\n\t6716:  0x83F2,\n\t6717:  0x840D,\n\t6718:  0x8422,\n\t6719:  0x8420,\n\t6720:  0x83BD,\n\t6721:  0x8438,\n\t6722:  0x8506,\n\t6723:  0x83FB,\n\t6724:  0x846D,\n\t6725:  0x842A,\n\t6726:  0x843C,\n\t6727:  0x855A,\n\t6728:  0x8484,\n\t6729:  0x8477,\n\t6730:  0x846B,\n\t6731:  0x84AD,\n\t6732:  0x846E,\n\t6733:  0x8482,\n\t6734:  0x8469,\n\t6735:  0x8446,\n\t6736:  0x842C,\n\t6737:  0x846F,\n\t6738:  0x8479,\n\t6739:  0x8435,\n\t6740:  0x84CA,\n\t6741:  0x8462,\n\t6742:  0x84B9,\n\t6743:  0x84BF,\n\t6744:  0x849F,\n\t6745:  0x84D9,\n\t6746:  0x84CD,\n\t6747:  0x84BB,\n\t6748:  0x84DA,\n\t6749:  0x84D0,\n\t6750:  0x84C1,\n\t6751:  0x84C6,\n\t6752:  0x84D6,\n\t6753:  0x84A1,\n\t6754:  0x8521,\n\t6755:  0x84FF,\n\t6756:  0x84F4,\n\t6757:  0x8517,\n\t6758:  0x8518,\n\t6759:  0x852C,\n\t6760:  0x851F,\n\t6761:  0x8515,\n\t6762:  0x8514,\n\t6763:  0x84FC,\n\t6764:  0x8540,\n\t6765:  0x8563,\n\t6766:  0x8558,\n\t6767:  0x8548,\n\t6768:  0x8541,\n\t6769:  0x8602,\n\t6770:  0x854B,\n\t6771:  0x8555,\n\t6772:  0x8580,\n\t6773:  0x85A4,\n\t6774:  0x8588,\n\t6775:  0x8591,\n\t6776:  0x858A,\n\t6777:  0x85A8,\n\t6778:  0x856D,\n\t6779:  0x8594,\n\t6780:  0x859B,\n\t6781:  0x85EA,\n\t6782:  0x8587,\n\t6783:  0x859C,\n\t6784:  0x8577,\n\t6785:  0x857E,\n\t6786:  0x8590,\n\t6787:  0x85C9,\n\t6788:  0x85BA,\n\t6789:  0x85CF,\n\t6790:  0x85B9,\n\t6791:  0x85D0,\n\t6792:  0x85D5,\n\t6793:  0x85DD,\n\t6794:  0x85E5,\n\t6795:  0x85DC,\n\t6796:  0x85F9,\n\t6797:  0x860A,\n\t6798:  0x8613,\n\t6799:  0x860B,\n\t6800:  0x85FE,\n\t6801:  0x85FA,\n\t6802:  0x8606,\n\t6803:  0x8622,\n\t6804:  0x861A,\n\t6805:  0x8630,\n\t6806:  0x863F,\n\t6807:  0x864D,\n\t6808:  0x4E55,\n\t6809:  0x8654,\n\t6810:  0x865F,\n\t6811:  0x8667,\n\t6812:  0x8671,\n\t6813:  0x8693,\n\t6814:  0x86A3,\n\t6815:  0x86A9,\n\t6816:  0x86AA,\n\t6817:  0x868B,\n\t6818:  0x868C,\n\t6819:  0x86B6,\n\t6820:  0x86AF,\n\t6821:  0x86C4,\n\t6822:  0x86C6,\n\t6823:  0x86B0,\n\t6824:  0x86C9,\n\t6825:  0x8823,\n\t6826:  0x86AB,\n\t6827:  0x86D4,\n\t6828:  0x86DE,\n\t6829:  0x86E9,\n\t6830:  0x86EC,\n\t6831:  0x86DF,\n\t6832:  0x86DB,\n\t6833:  0x86EF,\n\t6834:  0x8712,\n\t6835:  0x8706,\n\t6836:  0x8708,\n\t6837:  0x8700,\n\t6838:  0x8703,\n\t6839:  0x86FB,\n\t6840:  0x8711,\n\t6841:  0x8709,\n\t6842:  0x870D,\n\t6843:  0x86F9,\n\t6844:  0x870A,\n\t6845:  0x8734,\n\t6846:  0x873F,\n\t6847:  0x8737,\n\t6848:  0x873B,\n\t6849:  0x8725,\n\t6850:  0x8729,\n\t6851:  0x871A,\n\t6852:  0x8760,\n\t6853:  0x875F,\n\t6854:  0x8778,\n\t6855:  0x874C,\n\t6856:  0x874E,\n\t6857:  0x8774,\n\t6858:  0x8757,\n\t6859:  0x8768,\n\t6860:  0x876E,\n\t6861:  0x8759,\n\t6862:  0x8753,\n\t6863:  0x8763,\n\t6864:  0x876A,\n\t6865:  0x8805,\n\t6866:  0x87A2,\n\t6867:  0x879F,\n\t6868:  0x8782,\n\t6869:  0x87AF,\n\t6870:  0x87CB,\n\t6871:  0x87BD,\n\t6872:  0x87C0,\n\t6873:  0x87D0,\n\t6874:  0x96D6,\n\t6875:  0x87AB,\n\t6876:  0x87C4,\n\t6877:  0x87B3,\n\t6878:  0x87C7,\n\t6879:  0x87C6,\n\t6880:  0x87BB,\n\t6881:  0x87EF,\n\t6882:  0x87F2,\n\t6883:  0x87E0,\n\t6884:  0x880F,\n\t6885:  0x880D,\n\t6886:  0x87FE,\n\t6887:  0x87F6,\n\t6888:  0x87F7,\n\t6889:  0x880E,\n\t6890:  0x87D2,\n\t6891:  0x8811,\n\t6892:  0x8816,\n\t6893:  0x8815,\n\t6894:  0x8822,\n\t6895:  0x8821,\n\t6896:  0x8831,\n\t6897:  0x8836,\n\t6898:  0x8839,\n\t6899:  0x8827,\n\t6900:  0x883B,\n\t6901:  0x8844,\n\t6902:  0x8842,\n\t6903:  0x8852,\n\t6904:  0x8859,\n\t6905:  0x885E,\n\t6906:  0x8862,\n\t6907:  0x886B,\n\t6908:  0x8881,\n\t6909:  0x887E,\n\t6910:  0x889E,\n\t6911:  0x8875,\n\t6912:  0x887D,\n\t6913:  0x88B5,\n\t6914:  0x8872,\n\t6915:  0x8882,\n\t6916:  0x8897,\n\t6917:  0x8892,\n\t6918:  0x88AE,\n\t6919:  0x8899,\n\t6920:  0x88A2,\n\t6921:  0x888D,\n\t6922:  0x88A4,\n\t6923:  0x88B0,\n\t6924:  0x88BF,\n\t6925:  0x88B1,\n\t6926:  0x88C3,\n\t6927:  0x88C4,\n\t6928:  0x88D4,\n\t6929:  0x88D8,\n\t6930:  0x88D9,\n\t6931:  0x88DD,\n\t6932:  0x88F9,\n\t6933:  0x8902,\n\t6934:  0x88FC,\n\t6935:  0x88F4,\n\t6936:  0x88E8,\n\t6937:  0x88F2,\n\t6938:  0x8904,\n\t6939:  0x890C,\n\t6940:  0x890A,\n\t6941:  0x8913,\n\t6942:  0x8943,\n\t6943:  0x891E,\n\t6944:  0x8925,\n\t6945:  0x892A,\n\t6946:  0x892B,\n\t6947:  0x8941,\n\t6948:  0x8944,\n\t6949:  0x893B,\n\t6950:  0x8936,\n\t6951:  0x8938,\n\t6952:  0x894C,\n\t6953:  0x891D,\n\t6954:  0x8960,\n\t6955:  0x895E,\n\t6956:  0x8966,\n\t6957:  0x8964,\n\t6958:  0x896D,\n\t6959:  0x896A,\n\t6960:  0x896F,\n\t6961:  0x8974,\n\t6962:  0x8977,\n\t6963:  0x897E,\n\t6964:  0x8983,\n\t6965:  0x8988,\n\t6966:  0x898A,\n\t6967:  0x8993,\n\t6968:  0x8998,\n\t6969:  0x89A1,\n\t6970:  0x89A9,\n\t6971:  0x89A6,\n\t6972:  0x89AC,\n\t6973:  0x89AF,\n\t6974:  0x89B2,\n\t6975:  0x89BA,\n\t6976:  0x89BD,\n\t6977:  0x89BF,\n\t6978:  0x89C0,\n\t6979:  0x89DA,\n\t6980:  0x89DC,\n\t6981:  0x89DD,\n\t6982:  0x89E7,\n\t6983:  0x89F4,\n\t6984:  0x89F8,\n\t6985:  0x8A03,\n\t6986:  0x8A16,\n\t6987:  0x8A10,\n\t6988:  0x8A0C,\n\t6989:  0x8A1B,\n\t6990:  0x8A1D,\n\t6991:  0x8A25,\n\t6992:  0x8A36,\n\t6993:  0x8A41,\n\t6994:  0x8A5B,\n\t6995:  0x8A52,\n\t6996:  0x8A46,\n\t6997:  0x8A48,\n\t6998:  0x8A7C,\n\t6999:  0x8A6D,\n\t7000:  0x8A6C,\n\t7001:  0x8A62,\n\t7002:  0x8A85,\n\t7003:  0x8A82,\n\t7004:  0x8A84,\n\t7005:  0x8AA8,\n\t7006:  0x8AA1,\n\t7007:  0x8A91,\n\t7008:  0x8AA5,\n\t7009:  0x8AA6,\n\t7010:  0x8A9A,\n\t7011:  0x8AA3,\n\t7012:  0x8AC4,\n\t7013:  0x8ACD,\n\t7014:  0x8AC2,\n\t7015:  0x8ADA,\n\t7016:  0x8AEB,\n\t7017:  0x8AF3,\n\t7018:  0x8AE7,\n\t7019:  0x8AE4,\n\t7020:  0x8AF1,\n\t7021:  0x8B14,\n\t7022:  0x8AE0,\n\t7023:  0x8AE2,\n\t7024:  0x8AF7,\n\t7025:  0x8ADE,\n\t7026:  0x8ADB,\n\t7027:  0x8B0C,\n\t7028:  0x8B07,\n\t7029:  0x8B1A,\n\t7030:  0x8AE1,\n\t7031:  0x8B16,\n\t7032:  0x8B10,\n\t7033:  0x8B17,\n\t7034:  0x8B20,\n\t7035:  0x8B33,\n\t7036:  0x97AB,\n\t7037:  0x8B26,\n\t7038:  0x8B2B,\n\t7039:  0x8B3E,\n\t7040:  0x8B28,\n\t7041:  0x8B41,\n\t7042:  0x8B4C,\n\t7043:  0x8B4F,\n\t7044:  0x8B4E,\n\t7045:  0x8B49,\n\t7046:  0x8B56,\n\t7047:  0x8B5B,\n\t7048:  0x8B5A,\n\t7049:  0x8B6B,\n\t7050:  0x8B5F,\n\t7051:  0x8B6C,\n\t7052:  0x8B6F,\n\t7053:  0x8B74,\n\t7054:  0x8B7D,\n\t7055:  0x8B80,\n\t7056:  0x8B8C,\n\t7057:  0x8B8E,\n\t7058:  0x8B92,\n\t7059:  0x8B93,\n\t7060:  0x8B96,\n\t7061:  0x8B99,\n\t7062:  0x8B9A,\n\t7063:  0x8C3A,\n\t7064:  0x8C41,\n\t7065:  0x8C3F,\n\t7066:  0x8C48,\n\t7067:  0x8C4C,\n\t7068:  0x8C4E,\n\t7069:  0x8C50,\n\t7070:  0x8C55,\n\t7071:  0x8C62,\n\t7072:  0x8C6C,\n\t7073:  0x8C78,\n\t7074:  0x8C7A,\n\t7075:  0x8C82,\n\t7076:  0x8C89,\n\t7077:  0x8C85,\n\t7078:  0x8C8A,\n\t7079:  0x8C8D,\n\t7080:  0x8C8E,\n\t7081:  0x8C94,\n\t7082:  0x8C7C,\n\t7083:  0x8C98,\n\t7084:  0x621D,\n\t7085:  0x8CAD,\n\t7086:  0x8CAA,\n\t7087:  0x8CBD,\n\t7088:  0x8CB2,\n\t7089:  0x8CB3,\n\t7090:  0x8CAE,\n\t7091:  0x8CB6,\n\t7092:  0x8CC8,\n\t7093:  0x8CC1,\n\t7094:  0x8CE4,\n\t7095:  0x8CE3,\n\t7096:  0x8CDA,\n\t7097:  0x8CFD,\n\t7098:  0x8CFA,\n\t7099:  0x8CFB,\n\t7100:  0x8D04,\n\t7101:  0x8D05,\n\t7102:  0x8D0A,\n\t7103:  0x8D07,\n\t7104:  0x8D0F,\n\t7105:  0x8D0D,\n\t7106:  0x8D10,\n\t7107:  0x9F4E,\n\t7108:  0x8D13,\n\t7109:  0x8CCD,\n\t7110:  0x8D14,\n\t7111:  0x8D16,\n\t7112:  0x8D67,\n\t7113:  0x8D6D,\n\t7114:  0x8D71,\n\t7115:  0x8D73,\n\t7116:  0x8D81,\n\t7117:  0x8D99,\n\t7118:  0x8DC2,\n\t7119:  0x8DBE,\n\t7120:  0x8DBA,\n\t7121:  0x8DCF,\n\t7122:  0x8DDA,\n\t7123:  0x8DD6,\n\t7124:  0x8DCC,\n\t7125:  0x8DDB,\n\t7126:  0x8DCB,\n\t7127:  0x8DEA,\n\t7128:  0x8DEB,\n\t7129:  0x8DDF,\n\t7130:  0x8DE3,\n\t7131:  0x8DFC,\n\t7132:  0x8E08,\n\t7133:  0x8E09,\n\t7134:  0x8DFF,\n\t7135:  0x8E1D,\n\t7136:  0x8E1E,\n\t7137:  0x8E10,\n\t7138:  0x8E1F,\n\t7139:  0x8E42,\n\t7140:  0x8E35,\n\t7141:  0x8E30,\n\t7142:  0x8E34,\n\t7143:  0x8E4A,\n\t7144:  0x8E47,\n\t7145:  0x8E49,\n\t7146:  0x8E4C,\n\t7147:  0x8E50,\n\t7148:  0x8E48,\n\t7149:  0x8E59,\n\t7150:  0x8E64,\n\t7151:  0x8E60,\n\t7152:  0x8E2A,\n\t7153:  0x8E63,\n\t7154:  0x8E55,\n\t7155:  0x8E76,\n\t7156:  0x8E72,\n\t7157:  0x8E7C,\n\t7158:  0x8E81,\n\t7159:  0x8E87,\n\t7160:  0x8E85,\n\t7161:  0x8E84,\n\t7162:  0x8E8B,\n\t7163:  0x8E8A,\n\t7164:  0x8E93,\n\t7165:  0x8E91,\n\t7166:  0x8E94,\n\t7167:  0x8E99,\n\t7168:  0x8EAA,\n\t7169:  0x8EA1,\n\t7170:  0x8EAC,\n\t7171:  0x8EB0,\n\t7172:  0x8EC6,\n\t7173:  0x8EB1,\n\t7174:  0x8EBE,\n\t7175:  0x8EC5,\n\t7176:  0x8EC8,\n\t7177:  0x8ECB,\n\t7178:  0x8EDB,\n\t7179:  0x8EE3,\n\t7180:  0x8EFC,\n\t7181:  0x8EFB,\n\t7182:  0x8EEB,\n\t7183:  0x8EFE,\n\t7184:  0x8F0A,\n\t7185:  0x8F05,\n\t7186:  0x8F15,\n\t7187:  0x8F12,\n\t7188:  0x8F19,\n\t7189:  0x8F13,\n\t7190:  0x8F1C,\n\t7191:  0x8F1F,\n\t7192:  0x8F1B,\n\t7193:  0x8F0C,\n\t7194:  0x8F26,\n\t7195:  0x8F33,\n\t7196:  0x8F3B,\n\t7197:  0x8F39,\n\t7198:  0x8F45,\n\t7199:  0x8F42,\n\t7200:  0x8F3E,\n\t7201:  0x8F4C,\n\t7202:  0x8F49,\n\t7203:  0x8F46,\n\t7204:  0x8F4E,\n\t7205:  0x8F57,\n\t7206:  0x8F5C,\n\t7207:  0x8F62,\n\t7208:  0x8F63,\n\t7209:  0x8F64,\n\t7210:  0x8F9C,\n\t7211:  0x8F9F,\n\t7212:  0x8FA3,\n\t7213:  0x8FAD,\n\t7214:  0x8FAF,\n\t7215:  0x8FB7,\n\t7216:  0x8FDA,\n\t7217:  0x8FE5,\n\t7218:  0x8FE2,\n\t7219:  0x8FEA,\n\t7220:  0x8FEF,\n\t7221:  0x9087,\n\t7222:  0x8FF4,\n\t7223:  0x9005,\n\t7224:  0x8FF9,\n\t7225:  0x8FFA,\n\t7226:  0x9011,\n\t7227:  0x9015,\n\t7228:  0x9021,\n\t7229:  0x900D,\n\t7230:  0x901E,\n\t7231:  0x9016,\n\t7232:  0x900B,\n\t7233:  0x9027,\n\t7234:  0x9036,\n\t7235:  0x9035,\n\t7236:  0x9039,\n\t7237:  0x8FF8,\n\t7238:  0x904F,\n\t7239:  0x9050,\n\t7240:  0x9051,\n\t7241:  0x9052,\n\t7242:  0x900E,\n\t7243:  0x9049,\n\t7244:  0x903E,\n\t7245:  0x9056,\n\t7246:  0x9058,\n\t7247:  0x905E,\n\t7248:  0x9068,\n\t7249:  0x906F,\n\t7250:  0x9076,\n\t7251:  0x96A8,\n\t7252:  0x9072,\n\t7253:  0x9082,\n\t7254:  0x907D,\n\t7255:  0x9081,\n\t7256:  0x9080,\n\t7257:  0x908A,\n\t7258:  0x9089,\n\t7259:  0x908F,\n\t7260:  0x90A8,\n\t7261:  0x90AF,\n\t7262:  0x90B1,\n\t7263:  0x90B5,\n\t7264:  0x90E2,\n\t7265:  0x90E4,\n\t7266:  0x6248,\n\t7267:  0x90DB,\n\t7268:  0x9102,\n\t7269:  0x9112,\n\t7270:  0x9119,\n\t7271:  0x9132,\n\t7272:  0x9130,\n\t7273:  0x914A,\n\t7274:  0x9156,\n\t7275:  0x9158,\n\t7276:  0x9163,\n\t7277:  0x9165,\n\t7278:  0x9169,\n\t7279:  0x9173,\n\t7280:  0x9172,\n\t7281:  0x918B,\n\t7282:  0x9189,\n\t7283:  0x9182,\n\t7284:  0x91A2,\n\t7285:  0x91AB,\n\t7286:  0x91AF,\n\t7287:  0x91AA,\n\t7288:  0x91B5,\n\t7289:  0x91B4,\n\t7290:  0x91BA,\n\t7291:  0x91C0,\n\t7292:  0x91C1,\n\t7293:  0x91C9,\n\t7294:  0x91CB,\n\t7295:  0x91D0,\n\t7296:  0x91D6,\n\t7297:  0x91DF,\n\t7298:  0x91E1,\n\t7299:  0x91DB,\n\t7300:  0x91FC,\n\t7301:  0x91F5,\n\t7302:  0x91F6,\n\t7303:  0x921E,\n\t7304:  0x91FF,\n\t7305:  0x9214,\n\t7306:  0x922C,\n\t7307:  0x9215,\n\t7308:  0x9211,\n\t7309:  0x925E,\n\t7310:  0x9257,\n\t7311:  0x9245,\n\t7312:  0x9249,\n\t7313:  0x9264,\n\t7314:  0x9248,\n\t7315:  0x9295,\n\t7316:  0x923F,\n\t7317:  0x924B,\n\t7318:  0x9250,\n\t7319:  0x929C,\n\t7320:  0x9296,\n\t7321:  0x9293,\n\t7322:  0x929B,\n\t7323:  0x925A,\n\t7324:  0x92CF,\n\t7325:  0x92B9,\n\t7326:  0x92B7,\n\t7327:  0x92E9,\n\t7328:  0x930F,\n\t7329:  0x92FA,\n\t7330:  0x9344,\n\t7331:  0x932E,\n\t7332:  0x9319,\n\t7333:  0x9322,\n\t7334:  0x931A,\n\t7335:  0x9323,\n\t7336:  0x933A,\n\t7337:  0x9335,\n\t7338:  0x933B,\n\t7339:  0x935C,\n\t7340:  0x9360,\n\t7341:  0x937C,\n\t7342:  0x936E,\n\t7343:  0x9356,\n\t7344:  0x93B0,\n\t7345:  0x93AC,\n\t7346:  0x93AD,\n\t7347:  0x9394,\n\t7348:  0x93B9,\n\t7349:  0x93D6,\n\t7350:  0x93D7,\n\t7351:  0x93E8,\n\t7352:  0x93E5,\n\t7353:  0x93D8,\n\t7354:  0x93C3,\n\t7355:  0x93DD,\n\t7356:  0x93D0,\n\t7357:  0x93C8,\n\t7358:  0x93E4,\n\t7359:  0x941A,\n\t7360:  0x9414,\n\t7361:  0x9413,\n\t7362:  0x9403,\n\t7363:  0x9407,\n\t7364:  0x9410,\n\t7365:  0x9436,\n\t7366:  0x942B,\n\t7367:  0x9435,\n\t7368:  0x9421,\n\t7369:  0x943A,\n\t7370:  0x9441,\n\t7371:  0x9452,\n\t7372:  0x9444,\n\t7373:  0x945B,\n\t7374:  0x9460,\n\t7375:  0x9462,\n\t7376:  0x945E,\n\t7377:  0x946A,\n\t7378:  0x9229,\n\t7379:  0x9470,\n\t7380:  0x9475,\n\t7381:  0x9477,\n\t7382:  0x947D,\n\t7383:  0x945A,\n\t7384:  0x947C,\n\t7385:  0x947E,\n\t7386:  0x9481,\n\t7387:  0x947F,\n\t7388:  0x9582,\n\t7389:  0x9587,\n\t7390:  0x958A,\n\t7391:  0x9594,\n\t7392:  0x9596,\n\t7393:  0x9598,\n\t7394:  0x9599,\n\t7395:  0x95A0,\n\t7396:  0x95A8,\n\t7397:  0x95A7,\n\t7398:  0x95AD,\n\t7399:  0x95BC,\n\t7400:  0x95BB,\n\t7401:  0x95B9,\n\t7402:  0x95BE,\n\t7403:  0x95CA,\n\t7404:  0x6FF6,\n\t7405:  0x95C3,\n\t7406:  0x95CD,\n\t7407:  0x95CC,\n\t7408:  0x95D5,\n\t7409:  0x95D4,\n\t7410:  0x95D6,\n\t7411:  0x95DC,\n\t7412:  0x95E1,\n\t7413:  0x95E5,\n\t7414:  0x95E2,\n\t7415:  0x9621,\n\t7416:  0x9628,\n\t7417:  0x962E,\n\t7418:  0x962F,\n\t7419:  0x9642,\n\t7420:  0x964C,\n\t7421:  0x964F,\n\t7422:  0x964B,\n\t7423:  0x9677,\n\t7424:  0x965C,\n\t7425:  0x965E,\n\t7426:  0x965D,\n\t7427:  0x965F,\n\t7428:  0x9666,\n\t7429:  0x9672,\n\t7430:  0x966C,\n\t7431:  0x968D,\n\t7432:  0x9698,\n\t7433:  0x9695,\n\t7434:  0x9697,\n\t7435:  0x96AA,\n\t7436:  0x96A7,\n\t7437:  0x96B1,\n\t7438:  0x96B2,\n\t7439:  0x96B0,\n\t7440:  0x96B4,\n\t7441:  0x96B6,\n\t7442:  0x96B8,\n\t7443:  0x96B9,\n\t7444:  0x96CE,\n\t7445:  0x96CB,\n\t7446:  0x96C9,\n\t7447:  0x96CD,\n\t7448:  0x894D,\n\t7449:  0x96DC,\n\t7450:  0x970D,\n\t7451:  0x96D5,\n\t7452:  0x96F9,\n\t7453:  0x9704,\n\t7454:  0x9706,\n\t7455:  0x9708,\n\t7456:  0x9713,\n\t7457:  0x970E,\n\t7458:  0x9711,\n\t7459:  0x970F,\n\t7460:  0x9716,\n\t7461:  0x9719,\n\t7462:  0x9724,\n\t7463:  0x972A,\n\t7464:  0x9730,\n\t7465:  0x9739,\n\t7466:  0x973D,\n\t7467:  0x973E,\n\t7468:  0x9744,\n\t7469:  0x9746,\n\t7470:  0x9748,\n\t7471:  0x9742,\n\t7472:  0x9749,\n\t7473:  0x975C,\n\t7474:  0x9760,\n\t7475:  0x9764,\n\t7476:  0x9766,\n\t7477:  0x9768,\n\t7478:  0x52D2,\n\t7479:  0x976B,\n\t7480:  0x9771,\n\t7481:  0x9779,\n\t7482:  0x9785,\n\t7483:  0x977C,\n\t7484:  0x9781,\n\t7485:  0x977A,\n\t7486:  0x9786,\n\t7487:  0x978B,\n\t7488:  0x978F,\n\t7489:  0x9790,\n\t7490:  0x979C,\n\t7491:  0x97A8,\n\t7492:  0x97A6,\n\t7493:  0x97A3,\n\t7494:  0x97B3,\n\t7495:  0x97B4,\n\t7496:  0x97C3,\n\t7497:  0x97C6,\n\t7498:  0x97C8,\n\t7499:  0x97CB,\n\t7500:  0x97DC,\n\t7501:  0x97ED,\n\t7502:  0x9F4F,\n\t7503:  0x97F2,\n\t7504:  0x7ADF,\n\t7505:  0x97F6,\n\t7506:  0x97F5,\n\t7507:  0x980F,\n\t7508:  0x980C,\n\t7509:  0x9838,\n\t7510:  0x9824,\n\t7511:  0x9821,\n\t7512:  0x9837,\n\t7513:  0x983D,\n\t7514:  0x9846,\n\t7515:  0x984F,\n\t7516:  0x984B,\n\t7517:  0x986B,\n\t7518:  0x986F,\n\t7519:  0x9870,\n\t7520:  0x9871,\n\t7521:  0x9874,\n\t7522:  0x9873,\n\t7523:  0x98AA,\n\t7524:  0x98AF,\n\t7525:  0x98B1,\n\t7526:  0x98B6,\n\t7527:  0x98C4,\n\t7528:  0x98C3,\n\t7529:  0x98C6,\n\t7530:  0x98E9,\n\t7531:  0x98EB,\n\t7532:  0x9903,\n\t7533:  0x9909,\n\t7534:  0x9912,\n\t7535:  0x9914,\n\t7536:  0x9918,\n\t7537:  0x9921,\n\t7538:  0x991D,\n\t7539:  0x991E,\n\t7540:  0x9924,\n\t7541:  0x9920,\n\t7542:  0x992C,\n\t7543:  0x992E,\n\t7544:  0x993D,\n\t7545:  0x993E,\n\t7546:  0x9942,\n\t7547:  0x9949,\n\t7548:  0x9945,\n\t7549:  0x9950,\n\t7550:  0x994B,\n\t7551:  0x9951,\n\t7552:  0x9952,\n\t7553:  0x994C,\n\t7554:  0x9955,\n\t7555:  0x9997,\n\t7556:  0x9998,\n\t7557:  0x99A5,\n\t7558:  0x99AD,\n\t7559:  0x99AE,\n\t7560:  0x99BC,\n\t7561:  0x99DF,\n\t7562:  0x99DB,\n\t7563:  0x99DD,\n\t7564:  0x99D8,\n\t7565:  0x99D1,\n\t7566:  0x99ED,\n\t7567:  0x99EE,\n\t7568:  0x99F1,\n\t7569:  0x99F2,\n\t7570:  0x99FB,\n\t7571:  0x99F8,\n\t7572:  0x9A01,\n\t7573:  0x9A0F,\n\t7574:  0x9A05,\n\t7575:  0x99E2,\n\t7576:  0x9A19,\n\t7577:  0x9A2B,\n\t7578:  0x9A37,\n\t7579:  0x9A45,\n\t7580:  0x9A42,\n\t7581:  0x9A40,\n\t7582:  0x9A43,\n\t7583:  0x9A3E,\n\t7584:  0x9A55,\n\t7585:  0x9A4D,\n\t7586:  0x9A5B,\n\t7587:  0x9A57,\n\t7588:  0x9A5F,\n\t7589:  0x9A62,\n\t7590:  0x9A65,\n\t7591:  0x9A64,\n\t7592:  0x9A69,\n\t7593:  0x9A6B,\n\t7594:  0x9A6A,\n\t7595:  0x9AAD,\n\t7596:  0x9AB0,\n\t7597:  0x9ABC,\n\t7598:  0x9AC0,\n\t7599:  0x9ACF,\n\t7600:  0x9AD1,\n\t7601:  0x9AD3,\n\t7602:  0x9AD4,\n\t7603:  0x9ADE,\n\t7604:  0x9ADF,\n\t7605:  0x9AE2,\n\t7606:  0x9AE3,\n\t7607:  0x9AE6,\n\t7608:  0x9AEF,\n\t7609:  0x9AEB,\n\t7610:  0x9AEE,\n\t7611:  0x9AF4,\n\t7612:  0x9AF1,\n\t7613:  0x9AF7,\n\t7614:  0x9AFB,\n\t7615:  0x9B06,\n\t7616:  0x9B18,\n\t7617:  0x9B1A,\n\t7618:  0x9B1F,\n\t7619:  0x9B22,\n\t7620:  0x9B23,\n\t7621:  0x9B25,\n\t7622:  0x9B27,\n\t7623:  0x9B28,\n\t7624:  0x9B29,\n\t7625:  0x9B2A,\n\t7626:  0x9B2E,\n\t7627:  0x9B2F,\n\t7628:  0x9B32,\n\t7629:  0x9B44,\n\t7630:  0x9B43,\n\t7631:  0x9B4F,\n\t7632:  0x9B4D,\n\t7633:  0x9B4E,\n\t7634:  0x9B51,\n\t7635:  0x9B58,\n\t7636:  0x9B74,\n\t7637:  0x9B93,\n\t7638:  0x9B83,\n\t7639:  0x9B91,\n\t7640:  0x9B96,\n\t7641:  0x9B97,\n\t7642:  0x9B9F,\n\t7643:  0x9BA0,\n\t7644:  0x9BA8,\n\t7645:  0x9BB4,\n\t7646:  0x9BC0,\n\t7647:  0x9BCA,\n\t7648:  0x9BB9,\n\t7649:  0x9BC6,\n\t7650:  0x9BCF,\n\t7651:  0x9BD1,\n\t7652:  0x9BD2,\n\t7653:  0x9BE3,\n\t7654:  0x9BE2,\n\t7655:  0x9BE4,\n\t7656:  0x9BD4,\n\t7657:  0x9BE1,\n\t7658:  0x9C3A,\n\t7659:  0x9BF2,\n\t7660:  0x9BF1,\n\t7661:  0x9BF0,\n\t7662:  0x9C15,\n\t7663:  0x9C14,\n\t7664:  0x9C09,\n\t7665:  0x9C13,\n\t7666:  0x9C0C,\n\t7667:  0x9C06,\n\t7668:  0x9C08,\n\t7669:  0x9C12,\n\t7670:  0x9C0A,\n\t7671:  0x9C04,\n\t7672:  0x9C2E,\n\t7673:  0x9C1B,\n\t7674:  0x9C25,\n\t7675:  0x9C24,\n\t7676:  0x9C21,\n\t7677:  0x9C30,\n\t7678:  0x9C47,\n\t7679:  0x9C32,\n\t7680:  0x9C46,\n\t7681:  0x9C3E,\n\t7682:  0x9C5A,\n\t7683:  0x9C60,\n\t7684:  0x9C67,\n\t7685:  0x9C76,\n\t7686:  0x9C78,\n\t7687:  0x9CE7,\n\t7688:  0x9CEC,\n\t7689:  0x9CF0,\n\t7690:  0x9D09,\n\t7691:  0x9D08,\n\t7692:  0x9CEB,\n\t7693:  0x9D03,\n\t7694:  0x9D06,\n\t7695:  0x9D2A,\n\t7696:  0x9D26,\n\t7697:  0x9DAF,\n\t7698:  0x9D23,\n\t7699:  0x9D1F,\n\t7700:  0x9D44,\n\t7701:  0x9D15,\n\t7702:  0x9D12,\n\t7703:  0x9D41,\n\t7704:  0x9D3F,\n\t7705:  0x9D3E,\n\t7706:  0x9D46,\n\t7707:  0x9D48,\n\t7708:  0x9D5D,\n\t7709:  0x9D5E,\n\t7710:  0x9D64,\n\t7711:  0x9D51,\n\t7712:  0x9D50,\n\t7713:  0x9D59,\n\t7714:  0x9D72,\n\t7715:  0x9D89,\n\t7716:  0x9D87,\n\t7717:  0x9DAB,\n\t7718:  0x9D6F,\n\t7719:  0x9D7A,\n\t7720:  0x9D9A,\n\t7721:  0x9DA4,\n\t7722:  0x9DA9,\n\t7723:  0x9DB2,\n\t7724:  0x9DC4,\n\t7725:  0x9DC1,\n\t7726:  0x9DBB,\n\t7727:  0x9DB8,\n\t7728:  0x9DBA,\n\t7729:  0x9DC6,\n\t7730:  0x9DCF,\n\t7731:  0x9DC2,\n\t7732:  0x9DD9,\n\t7733:  0x9DD3,\n\t7734:  0x9DF8,\n\t7735:  0x9DE6,\n\t7736:  0x9DED,\n\t7737:  0x9DEF,\n\t7738:  0x9DFD,\n\t7739:  0x9E1A,\n\t7740:  0x9E1B,\n\t7741:  0x9E1E,\n\t7742:  0x9E75,\n\t7743:  0x9E79,\n\t7744:  0x9E7D,\n\t7745:  0x9E81,\n\t7746:  0x9E88,\n\t7747:  0x9E8B,\n\t7748:  0x9E8C,\n\t7749:  0x9E92,\n\t7750:  0x9E95,\n\t7751:  0x9E91,\n\t7752:  0x9E9D,\n\t7753:  0x9EA5,\n\t7754:  0x9EA9,\n\t7755:  0x9EB8,\n\t7756:  0x9EAA,\n\t7757:  0x9EAD,\n\t7758:  0x9761,\n\t7759:  0x9ECC,\n\t7760:  0x9ECE,\n\t7761:  0x9ECF,\n\t7762:  0x9ED0,\n\t7763:  0x9ED4,\n\t7764:  0x9EDC,\n\t7765:  0x9EDE,\n\t7766:  0x9EDD,\n\t7767:  0x9EE0,\n\t7768:  0x9EE5,\n\t7769:  0x9EE8,\n\t7770:  0x9EEF,\n\t7771:  0x9EF4,\n\t7772:  0x9EF6,\n\t7773:  0x9EF7,\n\t7774:  0x9EF9,\n\t7775:  0x9EFB,\n\t7776:  0x9EFC,\n\t7777:  0x9EFD,\n\t7778:  0x9F07,\n\t7779:  0x9F08,\n\t7780:  0x76B7,\n\t7781:  0x9F15,\n\t7782:  0x9F21,\n\t7783:  0x9F2C,\n\t7784:  0x9F3E,\n\t7785:  0x9F4A,\n\t7786:  0x9F52,\n\t7787:  0x9F54,\n\t7788:  0x9F63,\n\t7789:  0x9F5F,\n\t7790:  0x9F60,\n\t7791:  0x9F61,\n\t7792:  0x9F66,\n\t7793:  0x9F67,\n\t7794:  0x9F6C,\n\t7795:  0x9F6A,\n\t7796:  0x9F77,\n\t7797:  0x9F72,\n\t7798:  0x9F76,\n\t7799:  0x9F95,\n\t7800:  0x9F9C,\n\t7801:  0x9FA0,\n\t7802:  0x582F,\n\t7803:  0x69C7,\n\t7804:  0x9059,\n\t7805:  0x7464,\n\t7806:  0x51DC,\n\t7807:  0x7199,\n\t8272:  0x7E8A,\n\t8273:  0x891C,\n\t8274:  0x9348,\n\t8275:  0x9288,\n\t8276:  0x84DC,\n\t8277:  0x4FC9,\n\t8278:  0x70BB,\n\t8279:  0x6631,\n\t8280:  0x68C8,\n\t8281:  0x92F9,\n\t8282:  0x66FB,\n\t8283:  0x5F45,\n\t8284:  0x4E28,\n\t8285:  0x4EE1,\n\t8286:  0x4EFC,\n\t8287:  0x4F00,\n\t8288:  0x4F03,\n\t8289:  0x4F39,\n\t8290:  0x4F56,\n\t8291:  0x4F92,\n\t8292:  0x4F8A,\n\t8293:  0x4F9A,\n\t8294:  0x4F94,\n\t8295:  0x4FCD,\n\t8296:  0x5040,\n\t8297:  0x5022,\n\t8298:  0x4FFF,\n\t8299:  0x501E,\n\t8300:  0x5046,\n\t8301:  0x5070,\n\t8302:  0x5042,\n\t8303:  0x5094,\n\t8304:  0x50F4,\n\t8305:  0x50D8,\n\t8306:  0x514A,\n\t8307:  0x5164,\n\t8308:  0x519D,\n\t8309:  0x51BE,\n\t8310:  0x51EC,\n\t8311:  0x5215,\n\t8312:  0x529C,\n\t8313:  0x52A6,\n\t8314:  0x52C0,\n\t8315:  0x52DB,\n\t8316:  0x5300,\n\t8317:  0x5307,\n\t8318:  0x5324,\n\t8319:  0x5372,\n\t8320:  0x5393,\n\t8321:  0x53B2,\n\t8322:  0x53DD,\n\t8323:  0xFA0E,\n\t8324:  0x549C,\n\t8325:  0x548A,\n\t8326:  0x54A9,\n\t8327:  0x54FF,\n\t8328:  0x5586,\n\t8329:  0x5759,\n\t8330:  0x5765,\n\t8331:  0x57AC,\n\t8332:  0x57C8,\n\t8333:  0x57C7,\n\t8334:  0xFA0F,\n\t8335:  0xFA10,\n\t8336:  0x589E,\n\t8337:  0x58B2,\n\t8338:  0x590B,\n\t8339:  0x5953,\n\t8340:  0x595B,\n\t8341:  0x595D,\n\t8342:  0x5963,\n\t8343:  0x59A4,\n\t8344:  0x59BA,\n\t8345:  0x5B56,\n\t8346:  0x5BC0,\n\t8347:  0x752F,\n\t8348:  0x5BD8,\n\t8349:  0x5BEC,\n\t8350:  0x5C1E,\n\t8351:  0x5CA6,\n\t8352:  0x5CBA,\n\t8353:  0x5CF5,\n\t8354:  0x5D27,\n\t8355:  0x5D53,\n\t8356:  0xFA11,\n\t8357:  0x5D42,\n\t8358:  0x5D6D,\n\t8359:  0x5DB8,\n\t8360:  0x5DB9,\n\t8361:  0x5DD0,\n\t8362:  0x5F21,\n\t8363:  0x5F34,\n\t8364:  0x5F67,\n\t8365:  0x5FB7,\n\t8366:  0x5FDE,\n\t8367:  0x605D,\n\t8368:  0x6085,\n\t8369:  0x608A,\n\t8370:  0x60DE,\n\t8371:  0x60D5,\n\t8372:  0x6120,\n\t8373:  0x60F2,\n\t8374:  0x6111,\n\t8375:  0x6137,\n\t8376:  0x6130,\n\t8377:  0x6198,\n\t8378:  0x6213,\n\t8379:  0x62A6,\n\t8380:  0x63F5,\n\t8381:  0x6460,\n\t8382:  0x649D,\n\t8383:  0x64CE,\n\t8384:  0x654E,\n\t8385:  0x6600,\n\t8386:  0x6615,\n\t8387:  0x663B,\n\t8388:  0x6609,\n\t8389:  0x662E,\n\t8390:  0x661E,\n\t8391:  0x6624,\n\t8392:  0x6665,\n\t8393:  0x6657,\n\t8394:  0x6659,\n\t8395:  0xFA12,\n\t8396:  0x6673,\n\t8397:  0x6699,\n\t8398:  0x66A0,\n\t8399:  0x66B2,\n\t8400:  0x66BF,\n\t8401:  0x66FA,\n\t8402:  0x670E,\n\t8403:  0xF929,\n\t8404:  0x6766,\n\t8405:  0x67BB,\n\t8406:  0x6852,\n\t8407:  0x67C0,\n\t8408:  0x6801,\n\t8409:  0x6844,\n\t8410:  0x68CF,\n\t8411:  0xFA13,\n\t8412:  0x6968,\n\t8413:  0xFA14,\n\t8414:  0x6998,\n\t8415:  0x69E2,\n\t8416:  0x6A30,\n\t8417:  0x6A6B,\n\t8418:  0x6A46,\n\t8419:  0x6A73,\n\t8420:  0x6A7E,\n\t8421:  0x6AE2,\n\t8422:  0x6AE4,\n\t8423:  0x6BD6,\n\t8424:  0x6C3F,\n\t8425:  0x6C5C,\n\t8426:  0x6C86,\n\t8427:  0x6C6F,\n\t8428:  0x6CDA,\n\t8429:  0x6D04,\n\t8430:  0x6D87,\n\t8431:  0x6D6F,\n\t8432:  0x6D96,\n\t8433:  0x6DAC,\n\t8434:  0x6DCF,\n\t8435:  0x6DF8,\n\t8436:  0x6DF2,\n\t8437:  0x6DFC,\n\t8438:  0x6E39,\n\t8439:  0x6E5C,\n\t8440:  0x6E27,\n\t8441:  0x6E3C,\n\t8442:  0x6EBF,\n\t8443:  0x6F88,\n\t8444:  0x6FB5,\n\t8445:  0x6FF5,\n\t8446:  0x7005,\n\t8447:  0x7007,\n\t8448:  0x7028,\n\t8449:  0x7085,\n\t8450:  0x70AB,\n\t8451:  0x710F,\n\t8452:  0x7104,\n\t8453:  0x715C,\n\t8454:  0x7146,\n\t8455:  0x7147,\n\t8456:  0xFA15,\n\t8457:  0x71C1,\n\t8458:  0x71FE,\n\t8459:  0x72B1,\n\t8460:  0x72BE,\n\t8461:  0x7324,\n\t8462:  0xFA16,\n\t8463:  0x7377,\n\t8464:  0x73BD,\n\t8465:  0x73C9,\n\t8466:  0x73D6,\n\t8467:  0x73E3,\n\t8468:  0x73D2,\n\t8469:  0x7407,\n\t8470:  0x73F5,\n\t8471:  0x7426,\n\t8472:  0x742A,\n\t8473:  0x7429,\n\t8474:  0x742E,\n\t8475:  0x7462,\n\t8476:  0x7489,\n\t8477:  0x749F,\n\t8478:  0x7501,\n\t8479:  0x756F,\n\t8480:  0x7682,\n\t8481:  0x769C,\n\t8482:  0x769E,\n\t8483:  0x769B,\n\t8484:  0x76A6,\n\t8485:  0xFA17,\n\t8486:  0x7746,\n\t8487:  0x52AF,\n\t8488:  0x7821,\n\t8489:  0x784E,\n\t8490:  0x7864,\n\t8491:  0x787A,\n\t8492:  0x7930,\n\t8493:  0xFA18,\n\t8494:  0xFA19,\n\t8495:  0xFA1A,\n\t8496:  0x7994,\n\t8497:  0xFA1B,\n\t8498:  0x799B,\n\t8499:  0x7AD1,\n\t8500:  0x7AE7,\n\t8501:  0xFA1C,\n\t8502:  0x7AEB,\n\t8503:  0x7B9E,\n\t8504:  0xFA1D,\n\t8505:  0x7D48,\n\t8506:  0x7D5C,\n\t8507:  0x7DB7,\n\t8508:  0x7DA0,\n\t8509:  0x7DD6,\n\t8510:  0x7E52,\n\t8511:  0x7F47,\n\t8512:  0x7FA1,\n\t8513:  0xFA1E,\n\t8514:  0x8301,\n\t8515:  0x8362,\n\t8516:  0x837F,\n\t8517:  0x83C7,\n\t8518:  0x83F6,\n\t8519:  0x8448,\n\t8520:  0x84B4,\n\t8521:  0x8553,\n\t8522:  0x8559,\n\t8523:  0x856B,\n\t8524:  0xFA1F,\n\t8525:  0x85B0,\n\t8526:  0xFA20,\n\t8527:  0xFA21,\n\t8528:  0x8807,\n\t8529:  0x88F5,\n\t8530:  0x8A12,\n\t8531:  0x8A37,\n\t8532:  0x8A79,\n\t8533:  0x8AA7,\n\t8534:  0x8ABE,\n\t8535:  0x8ADF,\n\t8536:  0xFA22,\n\t8537:  0x8AF6,\n\t8538:  0x8B53,\n\t8539:  0x8B7F,\n\t8540:  0x8CF0,\n\t8541:  0x8CF4,\n\t8542:  0x8D12,\n\t8543:  0x8D76,\n\t8544:  0xFA23,\n\t8545:  0x8ECF,\n\t8546:  0xFA24,\n\t8547:  0xFA25,\n\t8548:  0x9067,\n\t8549:  0x90DE,\n\t8550:  0xFA26,\n\t8551:  0x9115,\n\t8552:  0x9127,\n\t8553:  0x91DA,\n\t8554:  0x91D7,\n\t8555:  0x91DE,\n\t8556:  0x91ED,\n\t8557:  0x91EE,\n\t8558:  0x91E4,\n\t8559:  0x91E5,\n\t8560:  0x9206,\n\t8561:  0x9210,\n\t8562:  0x920A,\n\t8563:  0x923A,\n\t8564:  0x9240,\n\t8565:  0x923C,\n\t8566:  0x924E,\n\t8567:  0x9259,\n\t8568:  0x9251,\n\t8569:  0x9239,\n\t8570:  0x9267,\n\t8571:  0x92A7,\n\t8572:  0x9277,\n\t8573:  0x9278,\n\t8574:  0x92E7,\n\t8575:  0x92D7,\n\t8576:  0x92D9,\n\t8577:  0x92D0,\n\t8578:  0xFA27,\n\t8579:  0x92D5,\n\t8580:  0x92E0,\n\t8581:  0x92D3,\n\t8582:  0x9325,\n\t8583:  0x9321,\n\t8584:  0x92FB,\n\t8585:  0xFA28,\n\t8586:  0x931E,\n\t8587:  0x92FF,\n\t8588:  0x931D,\n\t8589:  0x9302,\n\t8590:  0x9370,\n\t8591:  0x9357,\n\t8592:  0x93A4,\n\t8593:  0x93C6,\n\t8594:  0x93DE,\n\t8595:  0x93F8,\n\t8596:  0x9431,\n\t8597:  0x9445,\n\t8598:  0x9448,\n\t8599:  0x9592,\n\t8600:  0xF9DC,\n\t8601:  0xFA29,\n\t8602:  0x969D,\n\t8603:  0x96AF,\n\t8604:  0x9733,\n\t8605:  0x973B,\n\t8606:  0x9743,\n\t8607:  0x974D,\n\t8608:  0x974F,\n\t8609:  0x9751,\n\t8610:  0x9755,\n\t8611:  0x9857,\n\t8612:  0x9865,\n\t8613:  0xFA2A,\n\t8614:  0xFA2B,\n\t8615:  0x9927,\n\t8616:  0xFA2C,\n\t8617:  0x999E,\n\t8618:  0x9A4E,\n\t8619:  0x9AD9,\n\t8620:  0x9ADC,\n\t8621:  0x9B75,\n\t8622:  0x9B72,\n\t8623:  0x9B8F,\n\t8624:  0x9BB1,\n\t8625:  0x9BBB,\n\t8626:  0x9C00,\n\t8627:  0x9D70,\n\t8628:  0x9D6B,\n\t8629:  0xFA2D,\n\t8630:  0x9E19,\n\t8631:  0x9ED1,\n\t8634:  0x2170,\n\t8635:  0x2171,\n\t8636:  0x2172,\n\t8637:  0x2173,\n\t8638:  0x2174,\n\t8639:  0x2175,\n\t8640:  0x2176,\n\t8641:  0x2177,\n\t8642:  0x2178,\n\t8643:  0x2179,\n\t8644:  0xFFE2,\n\t8645:  0xFFE4,\n\t8646:  0xFF07,\n\t8647:  0xFF02,\n\t10716: 0x2170,\n\t10717: 0x2171,\n\t10718: 0x2172,\n\t10719: 0x2173,\n\t10720: 0x2174,\n\t10721: 0x2175,\n\t10722: 0x2176,\n\t10723: 0x2177,\n\t10724: 0x2178,\n\t10725: 0x2179,\n\t10726: 0x2160,\n\t10727: 0x2161,\n\t10728: 0x2162,\n\t10729: 0x2163,\n\t10730: 0x2164,\n\t10731: 0x2165,\n\t10732: 0x2166,\n\t10733: 0x2167,\n\t10734: 0x2168,\n\t10735: 0x2169,\n\t10736: 0xFFE2,\n\t10737: 0xFFE4,\n\t10738: 0xFF07,\n\t10739: 0xFF02,\n\t10740: 0x3231,\n\t10741: 0x2116,\n\t10742: 0x2121,\n\t10743: 0x2235,\n\t10744: 0x7E8A,\n\t10745: 0x891C,\n\t10746: 0x9348,\n\t10747: 0x9288,\n\t10748: 0x84DC,\n\t10749: 0x4FC9,\n\t10750: 0x70BB,\n\t10751: 0x6631,\n\t10752: 0x68C8,\n\t10753: 0x92F9,\n\t10754: 0x66FB,\n\t10755: 0x5F45,\n\t10756: 0x4E28,\n\t10757: 0x4EE1,\n\t10758: 0x4EFC,\n\t10759: 0x4F00,\n\t10760: 0x4F03,\n\t10761: 0x4F39,\n\t10762: 0x4F56,\n\t10763: 0x4F92,\n\t10764: 0x4F8A,\n\t10765: 0x4F9A,\n\t10766: 0x4F94,\n\t10767: 0x4FCD,\n\t10768: 0x5040,\n\t10769: 0x5022,\n\t10770: 0x4FFF,\n\t10771: 0x501E,\n\t10772: 0x5046,\n\t10773: 0x5070,\n\t10774: 0x5042,\n\t10775: 0x5094,\n\t10776: 0x50F4,\n\t10777: 0x50D8,\n\t10778: 0x514A,\n\t10779: 0x5164,\n\t10780: 0x519D,\n\t10781: 0x51BE,\n\t10782: 0x51EC,\n\t10783: 0x5215,\n\t10784: 0x529C,\n\t10785: 0x52A6,\n\t10786: 0x52C0,\n\t10787: 0x52DB,\n\t10788: 0x5300,\n\t10789: 0x5307,\n\t10790: 0x5324,\n\t10791: 0x5372,\n\t10792: 0x5393,\n\t10793: 0x53B2,\n\t10794: 0x53DD,\n\t10795: 0xFA0E,\n\t10796: 0x549C,\n\t10797: 0x548A,\n\t10798: 0x54A9,\n\t10799: 0x54FF,\n\t10800: 0x5586,\n\t10801: 0x5759,\n\t10802: 0x5765,\n\t10803: 0x57AC,\n\t10804: 0x57C8,\n\t10805: 0x57C7,\n\t10806: 0xFA0F,\n\t10807: 0xFA10,\n\t10808: 0x589E,\n\t10809: 0x58B2,\n\t10810: 0x590B,\n\t10811: 0x5953,\n\t10812: 0x595B,\n\t10813: 0x595D,\n\t10814: 0x5963,\n\t10815: 0x59A4,\n\t10816: 0x59BA,\n\t10817: 0x5B56,\n\t10818: 0x5BC0,\n\t10819: 0x752F,\n\t10820: 0x5BD8,\n\t10821: 0x5BEC,\n\t10822: 0x5C1E,\n\t10823: 0x5CA6,\n\t10824: 0x5CBA,\n\t10825: 0x5CF5,\n\t10826: 0x5D27,\n\t10827: 0x5D53,\n\t10828: 0xFA11,\n\t10829: 0x5D42,\n\t10830: 0x5D6D,\n\t10831: 0x5DB8,\n\t10832: 0x5DB9,\n\t10833: 0x5DD0,\n\t10834: 0x5F21,\n\t10835: 0x5F34,\n\t10836: 0x5F67,\n\t10837: 0x5FB7,\n\t10838: 0x5FDE,\n\t10839: 0x605D,\n\t10840: 0x6085,\n\t10841: 0x608A,\n\t10842: 0x60DE,\n\t10843: 0x60D5,\n\t10844: 0x6120,\n\t10845: 0x60F2,\n\t10846: 0x6111,\n\t10847: 0x6137,\n\t10848: 0x6130,\n\t10849: 0x6198,\n\t10850: 0x6213,\n\t10851: 0x62A6,\n\t10852: 0x63F5,\n\t10853: 0x6460,\n\t10854: 0x649D,\n\t10855: 0x64CE,\n\t10856: 0x654E,\n\t10857: 0x6600,\n\t10858: 0x6615,\n\t10859: 0x663B,\n\t10860: 0x6609,\n\t10861: 0x662E,\n\t10862: 0x661E,\n\t10863: 0x6624,\n\t10864: 0x6665,\n\t10865: 0x6657,\n\t10866: 0x6659,\n\t10867: 0xFA12,\n\t10868: 0x6673,\n\t10869: 0x6699,\n\t10870: 0x66A0,\n\t10871: 0x66B2,\n\t10872: 0x66BF,\n\t10873: 0x66FA,\n\t10874: 0x670E,\n\t10875: 0xF929,\n\t10876: 0x6766,\n\t10877: 0x67BB,\n\t10878: 0x6852,\n\t10879: 0x67C0,\n\t10880: 0x6801,\n\t10881: 0x6844,\n\t10882: 0x68CF,\n\t10883: 0xFA13,\n\t10884: 0x6968,\n\t10885: 0xFA14,\n\t10886: 0x6998,\n\t10887: 0x69E2,\n\t10888: 0x6A30,\n\t10889: 0x6A6B,\n\t10890: 0x6A46,\n\t10891: 0x6A73,\n\t10892: 0x6A7E,\n\t10893: 0x6AE2,\n\t10894: 0x6AE4,\n\t10895: 0x6BD6,\n\t10896: 0x6C3F,\n\t10897: 0x6C5C,\n\t10898: 0x6C86,\n\t10899: 0x6C6F,\n\t10900: 0x6CDA,\n\t10901: 0x6D04,\n\t10902: 0x6D87,\n\t10903: 0x6D6F,\n\t10904: 0x6D96,\n\t10905: 0x6DAC,\n\t10906: 0x6DCF,\n\t10907: 0x6DF8,\n\t10908: 0x6DF2,\n\t10909: 0x6DFC,\n\t10910: 0x6E39,\n\t10911: 0x6E5C,\n\t10912: 0x6E27,\n\t10913: 0x6E3C,\n\t10914: 0x6EBF,\n\t10915: 0x6F88,\n\t10916: 0x6FB5,\n\t10917: 0x6FF5,\n\t10918: 0x7005,\n\t10919: 0x7007,\n\t10920: 0x7028,\n\t10921: 0x7085,\n\t10922: 0x70AB,\n\t10923: 0x710F,\n\t10924: 0x7104,\n\t10925: 0x715C,\n\t10926: 0x7146,\n\t10927: 0x7147,\n\t10928: 0xFA15,\n\t10929: 0x71C1,\n\t10930: 0x71FE,\n\t10931: 0x72B1,\n\t10932: 0x72BE,\n\t10933: 0x7324,\n\t10934: 0xFA16,\n\t10935: 0x7377,\n\t10936: 0x73BD,\n\t10937: 0x73C9,\n\t10938: 0x73D6,\n\t10939: 0x73E3,\n\t10940: 0x73D2,\n\t10941: 0x7407,\n\t10942: 0x73F5,\n\t10943: 0x7426,\n\t10944: 0x742A,\n\t10945: 0x7429,\n\t10946: 0x742E,\n\t10947: 0x7462,\n\t10948: 0x7489,\n\t10949: 0x749F,\n\t10950: 0x7501,\n\t10951: 0x756F,\n\t10952: 0x7682,\n\t10953: 0x769C,\n\t10954: 0x769E,\n\t10955: 0x769B,\n\t10956: 0x76A6,\n\t10957: 0xFA17,\n\t10958: 0x7746,\n\t10959: 0x52AF,\n\t10960: 0x7821,\n\t10961: 0x784E,\n\t10962: 0x7864,\n\t10963: 0x787A,\n\t10964: 0x7930,\n\t10965: 0xFA18,\n\t10966: 0xFA19,\n\t10967: 0xFA1A,\n\t10968: 0x7994,\n\t10969: 0xFA1B,\n\t10970: 0x799B,\n\t10971: 0x7AD1,\n\t10972: 0x7AE7,\n\t10973: 0xFA1C,\n\t10974: 0x7AEB,\n\t10975: 0x7B9E,\n\t10976: 0xFA1D,\n\t10977: 0x7D48,\n\t10978: 0x7D5C,\n\t10979: 0x7DB7,\n\t10980: 0x7DA0,\n\t10981: 0x7DD6,\n\t10982: 0x7E52,\n\t10983: 0x7F47,\n\t10984: 0x7FA1,\n\t10985: 0xFA1E,\n\t10986: 0x8301,\n\t10987: 0x8362,\n\t10988: 0x837F,\n\t10989: 0x83C7,\n\t10990: 0x83F6,\n\t10991: 0x8448,\n\t10992: 0x84B4,\n\t10993: 0x8553,\n\t10994: 0x8559,\n\t10995: 0x856B,\n\t10996: 0xFA1F,\n\t10997: 0x85B0,\n\t10998: 0xFA20,\n\t10999: 0xFA21,\n\t11000: 0x8807,\n\t11001: 0x88F5,\n\t11002: 0x8A12,\n\t11003: 0x8A37,\n\t11004: 0x8A79,\n\t11005: 0x8AA7,\n\t11006: 0x8ABE,\n\t11007: 0x8ADF,\n\t11008: 0xFA22,\n\t11009: 0x8AF6,\n\t11010: 0x8B53,\n\t11011: 0x8B7F,\n\t11012: 0x8CF0,\n\t11013: 0x8CF4,\n\t11014: 0x8D12,\n\t11015: 0x8D76,\n\t11016: 0xFA23,\n\t11017: 0x8ECF,\n\t11018: 0xFA24,\n\t11019: 0xFA25,\n\t11020: 0x9067,\n\t11021: 0x90DE,\n\t11022: 0xFA26,\n\t11023: 0x9115,\n\t11024: 0x9127,\n\t11025: 0x91DA,\n\t11026: 0x91D7,\n\t11027: 0x91DE,\n\t11028: 0x91ED,\n\t11029: 0x91EE,\n\t11030: 0x91E4,\n\t11031: 0x91E5,\n\t11032: 0x9206,\n\t11033: 0x9210,\n\t11034: 0x920A,\n\t11035: 0x923A,\n\t11036: 0x9240,\n\t11037: 0x923C,\n\t11038: 0x924E,\n\t11039: 0x9259,\n\t11040: 0x9251,\n\t11041: 0x9239,\n\t11042: 0x9267,\n\t11043: 0x92A7,\n\t11044: 0x9277,\n\t11045: 0x9278,\n\t11046: 0x92E7,\n\t11047: 0x92D7,\n\t11048: 0x92D9,\n\t11049: 0x92D0,\n\t11050: 0xFA27,\n\t11051: 0x92D5,\n\t11052: 0x92E0,\n\t11053: 0x92D3,\n\t11054: 0x9325,\n\t11055: 0x9321,\n\t11056: 0x92FB,\n\t11057: 0xFA28,\n\t11058: 0x931E,\n\t11059: 0x92FF,\n\t11060: 0x931D,\n\t11061: 0x9302,\n\t11062: 0x9370,\n\t11063: 0x9357,\n\t11064: 0x93A4,\n\t11065: 0x93C6,\n\t11066: 0x93DE,\n\t11067: 0x93F8,\n\t11068: 0x9431,\n\t11069: 0x9445,\n\t11070: 0x9448,\n\t11071: 0x9592,\n\t11072: 0xF9DC,\n\t11073: 0xFA29,\n\t11074: 0x969D,\n\t11075: 0x96AF,\n\t11076: 0x9733,\n\t11077: 0x973B,\n\t11078: 0x9743,\n\t11079: 0x974D,\n\t11080: 0x974F,\n\t11081: 0x9751,\n\t11082: 0x9755,\n\t11083: 0x9857,\n\t11084: 0x9865,\n\t11085: 0xFA2A,\n\t11086: 0xFA2B,\n\t11087: 0x9927,\n\t11088: 0xFA2C,\n\t11089: 0x999E,\n\t11090: 0x9A4E,\n\t11091: 0x9AD9,\n\t11092: 0x9ADC,\n\t11093: 0x9B75,\n\t11094: 0x9B72,\n\t11095: 0x9B8F,\n\t11096: 0x9BB1,\n\t11097: 0x9BBB,\n\t11098: 0x9C00,\n\t11099: 0x9D70,\n\t11100: 0x9D6B,\n\t11101: 0xFA2D,\n\t11102: 0x9E19,\n\t11103: 0x9ED1,\n}\n\n// jis0212Decode is the decoding table from JIS 0212 code to Unicode.\n// It is defined at http://encoding.spec.whatwg.org/index-jis0212.txt\nvar jis0212Decode = [...]uint16{\n\t108:  0x02D8,\n\t109:  0x02C7,\n\t110:  0x00B8,\n\t111:  0x02D9,\n\t112:  0x02DD,\n\t113:  0x00AF,\n\t114:  0x02DB,\n\t115:  0x02DA,\n\t116:  0xFF5E,\n\t117:  0x0384,\n\t118:  0x0385,\n\t127:  0x00A1,\n\t128:  0x00A6,\n\t129:  0x00BF,\n\t168:  0x00BA,\n\t169:  0x00AA,\n\t170:  0x00A9,\n\t171:  0x00AE,\n\t172:  0x2122,\n\t173:  0x00A4,\n\t174:  0x2116,\n\t534:  0x0386,\n\t535:  0x0388,\n\t536:  0x0389,\n\t537:  0x038A,\n\t538:  0x03AA,\n\t540:  0x038C,\n\t542:  0x038E,\n\t543:  0x03AB,\n\t545:  0x038F,\n\t550:  0x03AC,\n\t551:  0x03AD,\n\t552:  0x03AE,\n\t553:  0x03AF,\n\t554:  0x03CA,\n\t555:  0x0390,\n\t556:  0x03CC,\n\t557:  0x03C2,\n\t558:  0x03CD,\n\t559:  0x03CB,\n\t560:  0x03B0,\n\t561:  0x03CE,\n\t597:  0x0402,\n\t598:  0x0403,\n\t599:  0x0404,\n\t600:  0x0405,\n\t601:  0x0406,\n\t602:  0x0407,\n\t603:  0x0408,\n\t604:  0x0409,\n\t605:  0x040A,\n\t606:  0x040B,\n\t607:  0x040C,\n\t608:  0x040E,\n\t609:  0x040F,\n\t645:  0x0452,\n\t646:  0x0453,\n\t647:  0x0454,\n\t648:  0x0455,\n\t649:  0x0456,\n\t650:  0x0457,\n\t651:  0x0458,\n\t652:  0x0459,\n\t653:  0x045A,\n\t654:  0x045B,\n\t655:  0x045C,\n\t656:  0x045E,\n\t657:  0x045F,\n\t752:  0x00C6,\n\t753:  0x0110,\n\t755:  0x0126,\n\t757:  0x0132,\n\t759:  0x0141,\n\t760:  0x013F,\n\t762:  0x014A,\n\t763:  0x00D8,\n\t764:  0x0152,\n\t766:  0x0166,\n\t767:  0x00DE,\n\t784:  0x00E6,\n\t785:  0x0111,\n\t786:  0x00F0,\n\t787:  0x0127,\n\t788:  0x0131,\n\t789:  0x0133,\n\t790:  0x0138,\n\t791:  0x0142,\n\t792:  0x0140,\n\t793:  0x0149,\n\t794:  0x014B,\n\t795:  0x00F8,\n\t796:  0x0153,\n\t797:  0x00DF,\n\t798:  0x0167,\n\t799:  0x00FE,\n\t846:  0x00C1,\n\t847:  0x00C0,\n\t848:  0x00C4,\n\t849:  0x00C2,\n\t850:  0x0102,\n\t851:  0x01CD,\n\t852:  0x0100,\n\t853:  0x0104,\n\t854:  0x00C5,\n\t855:  0x00C3,\n\t856:  0x0106,\n\t857:  0x0108,\n\t858:  0x010C,\n\t859:  0x00C7,\n\t860:  0x010A,\n\t861:  0x010E,\n\t862:  0x00C9,\n\t863:  0x00C8,\n\t864:  0x00CB,\n\t865:  0x00CA,\n\t866:  0x011A,\n\t867:  0x0116,\n\t868:  0x0112,\n\t869:  0x0118,\n\t871:  0x011C,\n\t872:  0x011E,\n\t873:  0x0122,\n\t874:  0x0120,\n\t875:  0x0124,\n\t876:  0x00CD,\n\t877:  0x00CC,\n\t878:  0x00CF,\n\t879:  0x00CE,\n\t880:  0x01CF,\n\t881:  0x0130,\n\t882:  0x012A,\n\t883:  0x012E,\n\t884:  0x0128,\n\t885:  0x0134,\n\t886:  0x0136,\n\t887:  0x0139,\n\t888:  0x013D,\n\t889:  0x013B,\n\t890:  0x0143,\n\t891:  0x0147,\n\t892:  0x0145,\n\t893:  0x00D1,\n\t894:  0x00D3,\n\t895:  0x00D2,\n\t896:  0x00D6,\n\t897:  0x00D4,\n\t898:  0x01D1,\n\t899:  0x0150,\n\t900:  0x014C,\n\t901:  0x00D5,\n\t902:  0x0154,\n\t903:  0x0158,\n\t904:  0x0156,\n\t905:  0x015A,\n\t906:  0x015C,\n\t907:  0x0160,\n\t908:  0x015E,\n\t909:  0x0164,\n\t910:  0x0162,\n\t911:  0x00DA,\n\t912:  0x00D9,\n\t913:  0x00DC,\n\t914:  0x00DB,\n\t915:  0x016C,\n\t916:  0x01D3,\n\t917:  0x0170,\n\t918:  0x016A,\n\t919:  0x0172,\n\t920:  0x016E,\n\t921:  0x0168,\n\t922:  0x01D7,\n\t923:  0x01DB,\n\t924:  0x01D9,\n\t925:  0x01D5,\n\t926:  0x0174,\n\t927:  0x00DD,\n\t928:  0x0178,\n\t929:  0x0176,\n\t930:  0x0179,\n\t931:  0x017D,\n\t932:  0x017B,\n\t940:  0x00E1,\n\t941:  0x00E0,\n\t942:  0x00E4,\n\t943:  0x00E2,\n\t944:  0x0103,\n\t945:  0x01CE,\n\t946:  0x0101,\n\t947:  0x0105,\n\t948:  0x00E5,\n\t949:  0x00E3,\n\t950:  0x0107,\n\t951:  0x0109,\n\t952:  0x010D,\n\t953:  0x00E7,\n\t954:  0x010B,\n\t955:  0x010F,\n\t956:  0x00E9,\n\t957:  0x00E8,\n\t958:  0x00EB,\n\t959:  0x00EA,\n\t960:  0x011B,\n\t961:  0x0117,\n\t962:  0x0113,\n\t963:  0x0119,\n\t964:  0x01F5,\n\t965:  0x011D,\n\t966:  0x011F,\n\t968:  0x0121,\n\t969:  0x0125,\n\t970:  0x00ED,\n\t971:  0x00EC,\n\t972:  0x00EF,\n\t973:  0x00EE,\n\t974:  0x01D0,\n\t976:  0x012B,\n\t977:  0x012F,\n\t978:  0x0129,\n\t979:  0x0135,\n\t980:  0x0137,\n\t981:  0x013A,\n\t982:  0x013E,\n\t983:  0x013C,\n\t984:  0x0144,\n\t985:  0x0148,\n\t986:  0x0146,\n\t987:  0x00F1,\n\t988:  0x00F3,\n\t989:  0x00F2,\n\t990:  0x00F6,\n\t991:  0x00F4,\n\t992:  0x01D2,\n\t993:  0x0151,\n\t994:  0x014D,\n\t995:  0x00F5,\n\t996:  0x0155,\n\t997:  0x0159,\n\t998:  0x0157,\n\t999:  0x015B,\n\t1000: 0x015D,\n\t1001: 0x0161,\n\t1002: 0x015F,\n\t1003: 0x0165,\n\t1004: 0x0163,\n\t1005: 0x00FA,\n\t1006: 0x00F9,\n\t1007: 0x00FC,\n\t1008: 0x00FB,\n\t1009: 0x016D,\n\t1010: 0x01D4,\n\t1011: 0x0171,\n\t1012: 0x016B,\n\t1013: 0x0173,\n\t1014: 0x016F,\n\t1015: 0x0169,\n\t1016: 0x01D8,\n\t1017: 0x01DC,\n\t1018: 0x01DA,\n\t1019: 0x01D6,\n\t1020: 0x0175,\n\t1021: 0x00FD,\n\t1022: 0x00FF,\n\t1023: 0x0177,\n\t1024: 0x017A,\n\t1025: 0x017E,\n\t1026: 0x017C,\n\t1410: 0x4E02,\n\t1411: 0x4E04,\n\t1412: 0x4E05,\n\t1413: 0x4E0C,\n\t1414: 0x4E12,\n\t1415: 0x4E1F,\n\t1416: 0x4E23,\n\t1417: 0x4E24,\n\t1418: 0x4E28,\n\t1419: 0x4E2B,\n\t1420: 0x4E2E,\n\t1421: 0x4E2F,\n\t1422: 0x4E30,\n\t1423: 0x4E35,\n\t1424: 0x4E40,\n\t1425: 0x4E41,\n\t1426: 0x4E44,\n\t1427: 0x4E47,\n\t1428: 0x4E51,\n\t1429: 0x4E5A,\n\t1430: 0x4E5C,\n\t1431: 0x4E63,\n\t1432: 0x4E68,\n\t1433: 0x4E69,\n\t1434: 0x4E74,\n\t1435: 0x4E75,\n\t1436: 0x4E79,\n\t1437: 0x4E7F,\n\t1438: 0x4E8D,\n\t1439: 0x4E96,\n\t1440: 0x4E97,\n\t1441: 0x4E9D,\n\t1442: 0x4EAF,\n\t1443: 0x4EB9,\n\t1444: 0x4EC3,\n\t1445: 0x4ED0,\n\t1446: 0x4EDA,\n\t1447: 0x4EDB,\n\t1448: 0x4EE0,\n\t1449: 0x4EE1,\n\t1450: 0x4EE2,\n\t1451: 0x4EE8,\n\t1452: 0x4EEF,\n\t1453: 0x4EF1,\n\t1454: 0x4EF3,\n\t1455: 0x4EF5,\n\t1456: 0x4EFD,\n\t1457: 0x4EFE,\n\t1458: 0x4EFF,\n\t1459: 0x4F00,\n\t1460: 0x4F02,\n\t1461: 0x4F03,\n\t1462: 0x4F08,\n\t1463: 0x4F0B,\n\t1464: 0x4F0C,\n\t1465: 0x4F12,\n\t1466: 0x4F15,\n\t1467: 0x4F16,\n\t1468: 0x4F17,\n\t1469: 0x4F19,\n\t1470: 0x4F2E,\n\t1471: 0x4F31,\n\t1472: 0x4F60,\n\t1473: 0x4F33,\n\t1474: 0x4F35,\n\t1475: 0x4F37,\n\t1476: 0x4F39,\n\t1477: 0x4F3B,\n\t1478: 0x4F3E,\n\t1479: 0x4F40,\n\t1480: 0x4F42,\n\t1481: 0x4F48,\n\t1482: 0x4F49,\n\t1483: 0x4F4B,\n\t1484: 0x4F4C,\n\t1485: 0x4F52,\n\t1486: 0x4F54,\n\t1487: 0x4F56,\n\t1488: 0x4F58,\n\t1489: 0x4F5F,\n\t1490: 0x4F63,\n\t1491: 0x4F6A,\n\t1492: 0x4F6C,\n\t1493: 0x4F6E,\n\t1494: 0x4F71,\n\t1495: 0x4F77,\n\t1496: 0x4F78,\n\t1497: 0x4F79,\n\t1498: 0x4F7A,\n\t1499: 0x4F7D,\n\t1500: 0x4F7E,\n\t1501: 0x4F81,\n\t1502: 0x4F82,\n\t1503: 0x4F84,\n\t1504: 0x4F85,\n\t1505: 0x4F89,\n\t1506: 0x4F8A,\n\t1507: 0x4F8C,\n\t1508: 0x4F8E,\n\t1509: 0x4F90,\n\t1510: 0x4F92,\n\t1511: 0x4F93,\n\t1512: 0x4F94,\n\t1513: 0x4F97,\n\t1514: 0x4F99,\n\t1515: 0x4F9A,\n\t1516: 0x4F9E,\n\t1517: 0x4F9F,\n\t1518: 0x4FB2,\n\t1519: 0x4FB7,\n\t1520: 0x4FB9,\n\t1521: 0x4FBB,\n\t1522: 0x4FBC,\n\t1523: 0x4FBD,\n\t1524: 0x4FBE,\n\t1525: 0x4FC0,\n\t1526: 0x4FC1,\n\t1527: 0x4FC5,\n\t1528: 0x4FC6,\n\t1529: 0x4FC8,\n\t1530: 0x4FC9,\n\t1531: 0x4FCB,\n\t1532: 0x4FCC,\n\t1533: 0x4FCD,\n\t1534: 0x4FCF,\n\t1535: 0x4FD2,\n\t1536: 0x4FDC,\n\t1537: 0x4FE0,\n\t1538: 0x4FE2,\n\t1539: 0x4FF0,\n\t1540: 0x4FF2,\n\t1541: 0x4FFC,\n\t1542: 0x4FFD,\n\t1543: 0x4FFF,\n\t1544: 0x5000,\n\t1545: 0x5001,\n\t1546: 0x5004,\n\t1547: 0x5007,\n\t1548: 0x500A,\n\t1549: 0x500C,\n\t1550: 0x500E,\n\t1551: 0x5010,\n\t1552: 0x5013,\n\t1553: 0x5017,\n\t1554: 0x5018,\n\t1555: 0x501B,\n\t1556: 0x501C,\n\t1557: 0x501D,\n\t1558: 0x501E,\n\t1559: 0x5022,\n\t1560: 0x5027,\n\t1561: 0x502E,\n\t1562: 0x5030,\n\t1563: 0x5032,\n\t1564: 0x5033,\n\t1565: 0x5035,\n\t1566: 0x5040,\n\t1567: 0x5041,\n\t1568: 0x5042,\n\t1569: 0x5045,\n\t1570: 0x5046,\n\t1571: 0x504A,\n\t1572: 0x504C,\n\t1573: 0x504E,\n\t1574: 0x5051,\n\t1575: 0x5052,\n\t1576: 0x5053,\n\t1577: 0x5057,\n\t1578: 0x5059,\n\t1579: 0x505F,\n\t1580: 0x5060,\n\t1581: 0x5062,\n\t1582: 0x5063,\n\t1583: 0x5066,\n\t1584: 0x5067,\n\t1585: 0x506A,\n\t1586: 0x506D,\n\t1587: 0x5070,\n\t1588: 0x5071,\n\t1589: 0x503B,\n\t1590: 0x5081,\n\t1591: 0x5083,\n\t1592: 0x5084,\n\t1593: 0x5086,\n\t1594: 0x508A,\n\t1595: 0x508E,\n\t1596: 0x508F,\n\t1597: 0x5090,\n\t1598: 0x5092,\n\t1599: 0x5093,\n\t1600: 0x5094,\n\t1601: 0x5096,\n\t1602: 0x509B,\n\t1603: 0x509C,\n\t1604: 0x509E,\n\t1605: 0x509F,\n\t1606: 0x50A0,\n\t1607: 0x50A1,\n\t1608: 0x50A2,\n\t1609: 0x50AA,\n\t1610: 0x50AF,\n\t1611: 0x50B0,\n\t1612: 0x50B9,\n\t1613: 0x50BA,\n\t1614: 0x50BD,\n\t1615: 0x50C0,\n\t1616: 0x50C3,\n\t1617: 0x50C4,\n\t1618: 0x50C7,\n\t1619: 0x50CC,\n\t1620: 0x50CE,\n\t1621: 0x50D0,\n\t1622: 0x50D3,\n\t1623: 0x50D4,\n\t1624: 0x50D8,\n\t1625: 0x50DC,\n\t1626: 0x50DD,\n\t1627: 0x50DF,\n\t1628: 0x50E2,\n\t1629: 0x50E4,\n\t1630: 0x50E6,\n\t1631: 0x50E8,\n\t1632: 0x50E9,\n\t1633: 0x50EF,\n\t1634: 0x50F1,\n\t1635: 0x50F6,\n\t1636: 0x50FA,\n\t1637: 0x50FE,\n\t1638: 0x5103,\n\t1639: 0x5106,\n\t1640: 0x5107,\n\t1641: 0x5108,\n\t1642: 0x510B,\n\t1643: 0x510C,\n\t1644: 0x510D,\n\t1645: 0x510E,\n\t1646: 0x50F2,\n\t1647: 0x5110,\n\t1648: 0x5117,\n\t1649: 0x5119,\n\t1650: 0x511B,\n\t1651: 0x511C,\n\t1652: 0x511D,\n\t1653: 0x511E,\n\t1654: 0x5123,\n\t1655: 0x5127,\n\t1656: 0x5128,\n\t1657: 0x512C,\n\t1658: 0x512D,\n\t1659: 0x512F,\n\t1660: 0x5131,\n\t1661: 0x5133,\n\t1662: 0x5134,\n\t1663: 0x5135,\n\t1664: 0x5138,\n\t1665: 0x5139,\n\t1666: 0x5142,\n\t1667: 0x514A,\n\t1668: 0x514F,\n\t1669: 0x5153,\n\t1670: 0x5155,\n\t1671: 0x5157,\n\t1672: 0x5158,\n\t1673: 0x515F,\n\t1674: 0x5164,\n\t1675: 0x5166,\n\t1676: 0x517E,\n\t1677: 0x5183,\n\t1678: 0x5184,\n\t1679: 0x518B,\n\t1680: 0x518E,\n\t1681: 0x5198,\n\t1682: 0x519D,\n\t1683: 0x51A1,\n\t1684: 0x51A3,\n\t1685: 0x51AD,\n\t1686: 0x51B8,\n\t1687: 0x51BA,\n\t1688: 0x51BC,\n\t1689: 0x51BE,\n\t1690: 0x51BF,\n\t1691: 0x51C2,\n\t1692: 0x51C8,\n\t1693: 0x51CF,\n\t1694: 0x51D1,\n\t1695: 0x51D2,\n\t1696: 0x51D3,\n\t1697: 0x51D5,\n\t1698: 0x51D8,\n\t1699: 0x51DE,\n\t1700: 0x51E2,\n\t1701: 0x51E5,\n\t1702: 0x51EE,\n\t1703: 0x51F2,\n\t1704: 0x51F3,\n\t1705: 0x51F4,\n\t1706: 0x51F7,\n\t1707: 0x5201,\n\t1708: 0x5202,\n\t1709: 0x5205,\n\t1710: 0x5212,\n\t1711: 0x5213,\n\t1712: 0x5215,\n\t1713: 0x5216,\n\t1714: 0x5218,\n\t1715: 0x5222,\n\t1716: 0x5228,\n\t1717: 0x5231,\n\t1718: 0x5232,\n\t1719: 0x5235,\n\t1720: 0x523C,\n\t1721: 0x5245,\n\t1722: 0x5249,\n\t1723: 0x5255,\n\t1724: 0x5257,\n\t1725: 0x5258,\n\t1726: 0x525A,\n\t1727: 0x525C,\n\t1728: 0x525F,\n\t1729: 0x5260,\n\t1730: 0x5261,\n\t1731: 0x5266,\n\t1732: 0x526E,\n\t1733: 0x5277,\n\t1734: 0x5278,\n\t1735: 0x5279,\n\t1736: 0x5280,\n\t1737: 0x5282,\n\t1738: 0x5285,\n\t1739: 0x528A,\n\t1740: 0x528C,\n\t1741: 0x5293,\n\t1742: 0x5295,\n\t1743: 0x5296,\n\t1744: 0x5297,\n\t1745: 0x5298,\n\t1746: 0x529A,\n\t1747: 0x529C,\n\t1748: 0x52A4,\n\t1749: 0x52A5,\n\t1750: 0x52A6,\n\t1751: 0x52A7,\n\t1752: 0x52AF,\n\t1753: 0x52B0,\n\t1754: 0x52B6,\n\t1755: 0x52B7,\n\t1756: 0x52B8,\n\t1757: 0x52BA,\n\t1758: 0x52BB,\n\t1759: 0x52BD,\n\t1760: 0x52C0,\n\t1761: 0x52C4,\n\t1762: 0x52C6,\n\t1763: 0x52C8,\n\t1764: 0x52CC,\n\t1765: 0x52CF,\n\t1766: 0x52D1,\n\t1767: 0x52D4,\n\t1768: 0x52D6,\n\t1769: 0x52DB,\n\t1770: 0x52DC,\n\t1771: 0x52E1,\n\t1772: 0x52E5,\n\t1773: 0x52E8,\n\t1774: 0x52E9,\n\t1775: 0x52EA,\n\t1776: 0x52EC,\n\t1777: 0x52F0,\n\t1778: 0x52F1,\n\t1779: 0x52F4,\n\t1780: 0x52F6,\n\t1781: 0x52F7,\n\t1782: 0x5300,\n\t1783: 0x5303,\n\t1784: 0x530A,\n\t1785: 0x530B,\n\t1786: 0x530C,\n\t1787: 0x5311,\n\t1788: 0x5313,\n\t1789: 0x5318,\n\t1790: 0x531B,\n\t1791: 0x531C,\n\t1792: 0x531E,\n\t1793: 0x531F,\n\t1794: 0x5325,\n\t1795: 0x5327,\n\t1796: 0x5328,\n\t1797: 0x5329,\n\t1798: 0x532B,\n\t1799: 0x532C,\n\t1800: 0x532D,\n\t1801: 0x5330,\n\t1802: 0x5332,\n\t1803: 0x5335,\n\t1804: 0x533C,\n\t1805: 0x533D,\n\t1806: 0x533E,\n\t1807: 0x5342,\n\t1808: 0x534C,\n\t1809: 0x534B,\n\t1810: 0x5359,\n\t1811: 0x535B,\n\t1812: 0x5361,\n\t1813: 0x5363,\n\t1814: 0x5365,\n\t1815: 0x536C,\n\t1816: 0x536D,\n\t1817: 0x5372,\n\t1818: 0x5379,\n\t1819: 0x537E,\n\t1820: 0x5383,\n\t1821: 0x5387,\n\t1822: 0x5388,\n\t1823: 0x538E,\n\t1824: 0x5393,\n\t1825: 0x5394,\n\t1826: 0x5399,\n\t1827: 0x539D,\n\t1828: 0x53A1,\n\t1829: 0x53A4,\n\t1830: 0x53AA,\n\t1831: 0x53AB,\n\t1832: 0x53AF,\n\t1833: 0x53B2,\n\t1834: 0x53B4,\n\t1835: 0x53B5,\n\t1836: 0x53B7,\n\t1837: 0x53B8,\n\t1838: 0x53BA,\n\t1839: 0x53BD,\n\t1840: 0x53C0,\n\t1841: 0x53C5,\n\t1842: 0x53CF,\n\t1843: 0x53D2,\n\t1844: 0x53D3,\n\t1845: 0x53D5,\n\t1846: 0x53DA,\n\t1847: 0x53DD,\n\t1848: 0x53DE,\n\t1849: 0x53E0,\n\t1850: 0x53E6,\n\t1851: 0x53E7,\n\t1852: 0x53F5,\n\t1853: 0x5402,\n\t1854: 0x5413,\n\t1855: 0x541A,\n\t1856: 0x5421,\n\t1857: 0x5427,\n\t1858: 0x5428,\n\t1859: 0x542A,\n\t1860: 0x542F,\n\t1861: 0x5431,\n\t1862: 0x5434,\n\t1863: 0x5435,\n\t1864: 0x5443,\n\t1865: 0x5444,\n\t1866: 0x5447,\n\t1867: 0x544D,\n\t1868: 0x544F,\n\t1869: 0x545E,\n\t1870: 0x5462,\n\t1871: 0x5464,\n\t1872: 0x5466,\n\t1873: 0x5467,\n\t1874: 0x5469,\n\t1875: 0x546B,\n\t1876: 0x546D,\n\t1877: 0x546E,\n\t1878: 0x5474,\n\t1879: 0x547F,\n\t1880: 0x5481,\n\t1881: 0x5483,\n\t1882: 0x5485,\n\t1883: 0x5488,\n\t1884: 0x5489,\n\t1885: 0x548D,\n\t1886: 0x5491,\n\t1887: 0x5495,\n\t1888: 0x5496,\n\t1889: 0x549C,\n\t1890: 0x549F,\n\t1891: 0x54A1,\n\t1892: 0x54A6,\n\t1893: 0x54A7,\n\t1894: 0x54A9,\n\t1895: 0x54AA,\n\t1896: 0x54AD,\n\t1897: 0x54AE,\n\t1898: 0x54B1,\n\t1899: 0x54B7,\n\t1900: 0x54B9,\n\t1901: 0x54BA,\n\t1902: 0x54BB,\n\t1903: 0x54BF,\n\t1904: 0x54C6,\n\t1905: 0x54CA,\n\t1906: 0x54CD,\n\t1907: 0x54CE,\n\t1908: 0x54E0,\n\t1909: 0x54EA,\n\t1910: 0x54EC,\n\t1911: 0x54EF,\n\t1912: 0x54F6,\n\t1913: 0x54FC,\n\t1914: 0x54FE,\n\t1915: 0x54FF,\n\t1916: 0x5500,\n\t1917: 0x5501,\n\t1918: 0x5505,\n\t1919: 0x5508,\n\t1920: 0x5509,\n\t1921: 0x550C,\n\t1922: 0x550D,\n\t1923: 0x550E,\n\t1924: 0x5515,\n\t1925: 0x552A,\n\t1926: 0x552B,\n\t1927: 0x5532,\n\t1928: 0x5535,\n\t1929: 0x5536,\n\t1930: 0x553B,\n\t1931: 0x553C,\n\t1932: 0x553D,\n\t1933: 0x5541,\n\t1934: 0x5547,\n\t1935: 0x5549,\n\t1936: 0x554A,\n\t1937: 0x554D,\n\t1938: 0x5550,\n\t1939: 0x5551,\n\t1940: 0x5558,\n\t1941: 0x555A,\n\t1942: 0x555B,\n\t1943: 0x555E,\n\t1944: 0x5560,\n\t1945: 0x5561,\n\t1946: 0x5564,\n\t1947: 0x5566,\n\t1948: 0x557F,\n\t1949: 0x5581,\n\t1950: 0x5582,\n\t1951: 0x5586,\n\t1952: 0x5588,\n\t1953: 0x558E,\n\t1954: 0x558F,\n\t1955: 0x5591,\n\t1956: 0x5592,\n\t1957: 0x5593,\n\t1958: 0x5594,\n\t1959: 0x5597,\n\t1960: 0x55A3,\n\t1961: 0x55A4,\n\t1962: 0x55AD,\n\t1963: 0x55B2,\n\t1964: 0x55BF,\n\t1965: 0x55C1,\n\t1966: 0x55C3,\n\t1967: 0x55C6,\n\t1968: 0x55C9,\n\t1969: 0x55CB,\n\t1970: 0x55CC,\n\t1971: 0x55CE,\n\t1972: 0x55D1,\n\t1973: 0x55D2,\n\t1974: 0x55D3,\n\t1975: 0x55D7,\n\t1976: 0x55D8,\n\t1977: 0x55DB,\n\t1978: 0x55DE,\n\t1979: 0x55E2,\n\t1980: 0x55E9,\n\t1981: 0x55F6,\n\t1982: 0x55FF,\n\t1983: 0x5605,\n\t1984: 0x5608,\n\t1985: 0x560A,\n\t1986: 0x560D,\n\t1987: 0x560E,\n\t1988: 0x560F,\n\t1989: 0x5610,\n\t1990: 0x5611,\n\t1991: 0x5612,\n\t1992: 0x5619,\n\t1993: 0x562C,\n\t1994: 0x5630,\n\t1995: 0x5633,\n\t1996: 0x5635,\n\t1997: 0x5637,\n\t1998: 0x5639,\n\t1999: 0x563B,\n\t2000: 0x563C,\n\t2001: 0x563D,\n\t2002: 0x563F,\n\t2003: 0x5640,\n\t2004: 0x5641,\n\t2005: 0x5643,\n\t2006: 0x5644,\n\t2007: 0x5646,\n\t2008: 0x5649,\n\t2009: 0x564B,\n\t2010: 0x564D,\n\t2011: 0x564F,\n\t2012: 0x5654,\n\t2013: 0x565E,\n\t2014: 0x5660,\n\t2015: 0x5661,\n\t2016: 0x5662,\n\t2017: 0x5663,\n\t2018: 0x5666,\n\t2019: 0x5669,\n\t2020: 0x566D,\n\t2021: 0x566F,\n\t2022: 0x5671,\n\t2023: 0x5672,\n\t2024: 0x5675,\n\t2025: 0x5684,\n\t2026: 0x5685,\n\t2027: 0x5688,\n\t2028: 0x568B,\n\t2029: 0x568C,\n\t2030: 0x5695,\n\t2031: 0x5699,\n\t2032: 0x569A,\n\t2033: 0x569D,\n\t2034: 0x569E,\n\t2035: 0x569F,\n\t2036: 0x56A6,\n\t2037: 0x56A7,\n\t2038: 0x56A8,\n\t2039: 0x56A9,\n\t2040: 0x56AB,\n\t2041: 0x56AC,\n\t2042: 0x56AD,\n\t2043: 0x56B1,\n\t2044: 0x56B3,\n\t2045: 0x56B7,\n\t2046: 0x56BE,\n\t2047: 0x56C5,\n\t2048: 0x56C9,\n\t2049: 0x56CA,\n\t2050: 0x56CB,\n\t2051: 0x56CF,\n\t2052: 0x56D0,\n\t2053: 0x56CC,\n\t2054: 0x56CD,\n\t2055: 0x56D9,\n\t2056: 0x56DC,\n\t2057: 0x56DD,\n\t2058: 0x56DF,\n\t2059: 0x56E1,\n\t2060: 0x56E4,\n\t2061: 0x56E5,\n\t2062: 0x56E6,\n\t2063: 0x56E7,\n\t2064: 0x56E8,\n\t2065: 0x56F1,\n\t2066: 0x56EB,\n\t2067: 0x56ED,\n\t2068: 0x56F6,\n\t2069: 0x56F7,\n\t2070: 0x5701,\n\t2071: 0x5702,\n\t2072: 0x5707,\n\t2073: 0x570A,\n\t2074: 0x570C,\n\t2075: 0x5711,\n\t2076: 0x5715,\n\t2077: 0x571A,\n\t2078: 0x571B,\n\t2079: 0x571D,\n\t2080: 0x5720,\n\t2081: 0x5722,\n\t2082: 0x5723,\n\t2083: 0x5724,\n\t2084: 0x5725,\n\t2085: 0x5729,\n\t2086: 0x572A,\n\t2087: 0x572C,\n\t2088: 0x572E,\n\t2089: 0x572F,\n\t2090: 0x5733,\n\t2091: 0x5734,\n\t2092: 0x573D,\n\t2093: 0x573E,\n\t2094: 0x573F,\n\t2095: 0x5745,\n\t2096: 0x5746,\n\t2097: 0x574C,\n\t2098: 0x574D,\n\t2099: 0x5752,\n\t2100: 0x5762,\n\t2101: 0x5765,\n\t2102: 0x5767,\n\t2103: 0x5768,\n\t2104: 0x576B,\n\t2105: 0x576D,\n\t2106: 0x576E,\n\t2107: 0x576F,\n\t2108: 0x5770,\n\t2109: 0x5771,\n\t2110: 0x5773,\n\t2111: 0x5774,\n\t2112: 0x5775,\n\t2113: 0x5777,\n\t2114: 0x5779,\n\t2115: 0x577A,\n\t2116: 0x577B,\n\t2117: 0x577C,\n\t2118: 0x577E,\n\t2119: 0x5781,\n\t2120: 0x5783,\n\t2121: 0x578C,\n\t2122: 0x5794,\n\t2123: 0x5797,\n\t2124: 0x5799,\n\t2125: 0x579A,\n\t2126: 0x579C,\n\t2127: 0x579D,\n\t2128: 0x579E,\n\t2129: 0x579F,\n\t2130: 0x57A1,\n\t2131: 0x5795,\n\t2132: 0x57A7,\n\t2133: 0x57A8,\n\t2134: 0x57A9,\n\t2135: 0x57AC,\n\t2136: 0x57B8,\n\t2137: 0x57BD,\n\t2138: 0x57C7,\n\t2139: 0x57C8,\n\t2140: 0x57CC,\n\t2141: 0x57CF,\n\t2142: 0x57D5,\n\t2143: 0x57DD,\n\t2144: 0x57DE,\n\t2145: 0x57E4,\n\t2146: 0x57E6,\n\t2147: 0x57E7,\n\t2148: 0x57E9,\n\t2149: 0x57ED,\n\t2150: 0x57F0,\n\t2151: 0x57F5,\n\t2152: 0x57F6,\n\t2153: 0x57F8,\n\t2154: 0x57FD,\n\t2155: 0x57FE,\n\t2156: 0x57FF,\n\t2157: 0x5803,\n\t2158: 0x5804,\n\t2159: 0x5808,\n\t2160: 0x5809,\n\t2161: 0x57E1,\n\t2162: 0x580C,\n\t2163: 0x580D,\n\t2164: 0x581B,\n\t2165: 0x581E,\n\t2166: 0x581F,\n\t2167: 0x5820,\n\t2168: 0x5826,\n\t2169: 0x5827,\n\t2170: 0x582D,\n\t2171: 0x5832,\n\t2172: 0x5839,\n\t2173: 0x583F,\n\t2174: 0x5849,\n\t2175: 0x584C,\n\t2176: 0x584D,\n\t2177: 0x584F,\n\t2178: 0x5850,\n\t2179: 0x5855,\n\t2180: 0x585F,\n\t2181: 0x5861,\n\t2182: 0x5864,\n\t2183: 0x5867,\n\t2184: 0x5868,\n\t2185: 0x5878,\n\t2186: 0x587C,\n\t2187: 0x587F,\n\t2188: 0x5880,\n\t2189: 0x5881,\n\t2190: 0x5887,\n\t2191: 0x5888,\n\t2192: 0x5889,\n\t2193: 0x588A,\n\t2194: 0x588C,\n\t2195: 0x588D,\n\t2196: 0x588F,\n\t2197: 0x5890,\n\t2198: 0x5894,\n\t2199: 0x5896,\n\t2200: 0x589D,\n\t2201: 0x58A0,\n\t2202: 0x58A1,\n\t2203: 0x58A2,\n\t2204: 0x58A6,\n\t2205: 0x58A9,\n\t2206: 0x58B1,\n\t2207: 0x58B2,\n\t2208: 0x58C4,\n\t2209: 0x58BC,\n\t2210: 0x58C2,\n\t2211: 0x58C8,\n\t2212: 0x58CD,\n\t2213: 0x58CE,\n\t2214: 0x58D0,\n\t2215: 0x58D2,\n\t2216: 0x58D4,\n\t2217: 0x58D6,\n\t2218: 0x58DA,\n\t2219: 0x58DD,\n\t2220: 0x58E1,\n\t2221: 0x58E2,\n\t2222: 0x58E9,\n\t2223: 0x58F3,\n\t2224: 0x5905,\n\t2225: 0x5906,\n\t2226: 0x590B,\n\t2227: 0x590C,\n\t2228: 0x5912,\n\t2229: 0x5913,\n\t2230: 0x5914,\n\t2231: 0x8641,\n\t2232: 0x591D,\n\t2233: 0x5921,\n\t2234: 0x5923,\n\t2235: 0x5924,\n\t2236: 0x5928,\n\t2237: 0x592F,\n\t2238: 0x5930,\n\t2239: 0x5933,\n\t2240: 0x5935,\n\t2241: 0x5936,\n\t2242: 0x593F,\n\t2243: 0x5943,\n\t2244: 0x5946,\n\t2245: 0x5952,\n\t2246: 0x5953,\n\t2247: 0x5959,\n\t2248: 0x595B,\n\t2249: 0x595D,\n\t2250: 0x595E,\n\t2251: 0x595F,\n\t2252: 0x5961,\n\t2253: 0x5963,\n\t2254: 0x596B,\n\t2255: 0x596D,\n\t2256: 0x596F,\n\t2257: 0x5972,\n\t2258: 0x5975,\n\t2259: 0x5976,\n\t2260: 0x5979,\n\t2261: 0x597B,\n\t2262: 0x597C,\n\t2263: 0x598B,\n\t2264: 0x598C,\n\t2265: 0x598E,\n\t2266: 0x5992,\n\t2267: 0x5995,\n\t2268: 0x5997,\n\t2269: 0x599F,\n\t2270: 0x59A4,\n\t2271: 0x59A7,\n\t2272: 0x59AD,\n\t2273: 0x59AE,\n\t2274: 0x59AF,\n\t2275: 0x59B0,\n\t2276: 0x59B3,\n\t2277: 0x59B7,\n\t2278: 0x59BA,\n\t2279: 0x59BC,\n\t2280: 0x59C1,\n\t2281: 0x59C3,\n\t2282: 0x59C4,\n\t2283: 0x59C8,\n\t2284: 0x59CA,\n\t2285: 0x59CD,\n\t2286: 0x59D2,\n\t2287: 0x59DD,\n\t2288: 0x59DE,\n\t2289: 0x59DF,\n\t2290: 0x59E3,\n\t2291: 0x59E4,\n\t2292: 0x59E7,\n\t2293: 0x59EE,\n\t2294: 0x59EF,\n\t2295: 0x59F1,\n\t2296: 0x59F2,\n\t2297: 0x59F4,\n\t2298: 0x59F7,\n\t2299: 0x5A00,\n\t2300: 0x5A04,\n\t2301: 0x5A0C,\n\t2302: 0x5A0D,\n\t2303: 0x5A0E,\n\t2304: 0x5A12,\n\t2305: 0x5A13,\n\t2306: 0x5A1E,\n\t2307: 0x5A23,\n\t2308: 0x5A24,\n\t2309: 0x5A27,\n\t2310: 0x5A28,\n\t2311: 0x5A2A,\n\t2312: 0x5A2D,\n\t2313: 0x5A30,\n\t2314: 0x5A44,\n\t2315: 0x5A45,\n\t2316: 0x5A47,\n\t2317: 0x5A48,\n\t2318: 0x5A4C,\n\t2319: 0x5A50,\n\t2320: 0x5A55,\n\t2321: 0x5A5E,\n\t2322: 0x5A63,\n\t2323: 0x5A65,\n\t2324: 0x5A67,\n\t2325: 0x5A6D,\n\t2326: 0x5A77,\n\t2327: 0x5A7A,\n\t2328: 0x5A7B,\n\t2329: 0x5A7E,\n\t2330: 0x5A8B,\n\t2331: 0x5A90,\n\t2332: 0x5A93,\n\t2333: 0x5A96,\n\t2334: 0x5A99,\n\t2335: 0x5A9C,\n\t2336: 0x5A9E,\n\t2337: 0x5A9F,\n\t2338: 0x5AA0,\n\t2339: 0x5AA2,\n\t2340: 0x5AA7,\n\t2341: 0x5AAC,\n\t2342: 0x5AB1,\n\t2343: 0x5AB2,\n\t2344: 0x5AB3,\n\t2345: 0x5AB5,\n\t2346: 0x5AB8,\n\t2347: 0x5ABA,\n\t2348: 0x5ABB,\n\t2349: 0x5ABF,\n\t2350: 0x5AC4,\n\t2351: 0x5AC6,\n\t2352: 0x5AC8,\n\t2353: 0x5ACF,\n\t2354: 0x5ADA,\n\t2355: 0x5ADC,\n\t2356: 0x5AE0,\n\t2357: 0x5AE5,\n\t2358: 0x5AEA,\n\t2359: 0x5AEE,\n\t2360: 0x5AF5,\n\t2361: 0x5AF6,\n\t2362: 0x5AFD,\n\t2363: 0x5B00,\n\t2364: 0x5B01,\n\t2365: 0x5B08,\n\t2366: 0x5B17,\n\t2367: 0x5B34,\n\t2368: 0x5B19,\n\t2369: 0x5B1B,\n\t2370: 0x5B1D,\n\t2371: 0x5B21,\n\t2372: 0x5B25,\n\t2373: 0x5B2D,\n\t2374: 0x5B38,\n\t2375: 0x5B41,\n\t2376: 0x5B4B,\n\t2377: 0x5B4C,\n\t2378: 0x5B52,\n\t2379: 0x5B56,\n\t2380: 0x5B5E,\n\t2381: 0x5B68,\n\t2382: 0x5B6E,\n\t2383: 0x5B6F,\n\t2384: 0x5B7C,\n\t2385: 0x5B7D,\n\t2386: 0x5B7E,\n\t2387: 0x5B7F,\n\t2388: 0x5B81,\n\t2389: 0x5B84,\n\t2390: 0x5B86,\n\t2391: 0x5B8A,\n\t2392: 0x5B8E,\n\t2393: 0x5B90,\n\t2394: 0x5B91,\n\t2395: 0x5B93,\n\t2396: 0x5B94,\n\t2397: 0x5B96,\n\t2398: 0x5BA8,\n\t2399: 0x5BA9,\n\t2400: 0x5BAC,\n\t2401: 0x5BAD,\n\t2402: 0x5BAF,\n\t2403: 0x5BB1,\n\t2404: 0x5BB2,\n\t2405: 0x5BB7,\n\t2406: 0x5BBA,\n\t2407: 0x5BBC,\n\t2408: 0x5BC0,\n\t2409: 0x5BC1,\n\t2410: 0x5BCD,\n\t2411: 0x5BCF,\n\t2412: 0x5BD6,\n\t2413: 0x5BD7,\n\t2414: 0x5BD8,\n\t2415: 0x5BD9,\n\t2416: 0x5BDA,\n\t2417: 0x5BE0,\n\t2418: 0x5BEF,\n\t2419: 0x5BF1,\n\t2420: 0x5BF4,\n\t2421: 0x5BFD,\n\t2422: 0x5C0C,\n\t2423: 0x5C17,\n\t2424: 0x5C1E,\n\t2425: 0x5C1F,\n\t2426: 0x5C23,\n\t2427: 0x5C26,\n\t2428: 0x5C29,\n\t2429: 0x5C2B,\n\t2430: 0x5C2C,\n\t2431: 0x5C2E,\n\t2432: 0x5C30,\n\t2433: 0x5C32,\n\t2434: 0x5C35,\n\t2435: 0x5C36,\n\t2436: 0x5C59,\n\t2437: 0x5C5A,\n\t2438: 0x5C5C,\n\t2439: 0x5C62,\n\t2440: 0x5C63,\n\t2441: 0x5C67,\n\t2442: 0x5C68,\n\t2443: 0x5C69,\n\t2444: 0x5C6D,\n\t2445: 0x5C70,\n\t2446: 0x5C74,\n\t2447: 0x5C75,\n\t2448: 0x5C7A,\n\t2449: 0x5C7B,\n\t2450: 0x5C7C,\n\t2451: 0x5C7D,\n\t2452: 0x5C87,\n\t2453: 0x5C88,\n\t2454: 0x5C8A,\n\t2455: 0x5C8F,\n\t2456: 0x5C92,\n\t2457: 0x5C9D,\n\t2458: 0x5C9F,\n\t2459: 0x5CA0,\n\t2460: 0x5CA2,\n\t2461: 0x5CA3,\n\t2462: 0x5CA6,\n\t2463: 0x5CAA,\n\t2464: 0x5CB2,\n\t2465: 0x5CB4,\n\t2466: 0x5CB5,\n\t2467: 0x5CBA,\n\t2468: 0x5CC9,\n\t2469: 0x5CCB,\n\t2470: 0x5CD2,\n\t2471: 0x5CDD,\n\t2472: 0x5CD7,\n\t2473: 0x5CEE,\n\t2474: 0x5CF1,\n\t2475: 0x5CF2,\n\t2476: 0x5CF4,\n\t2477: 0x5D01,\n\t2478: 0x5D06,\n\t2479: 0x5D0D,\n\t2480: 0x5D12,\n\t2481: 0x5D2B,\n\t2482: 0x5D23,\n\t2483: 0x5D24,\n\t2484: 0x5D26,\n\t2485: 0x5D27,\n\t2486: 0x5D31,\n\t2487: 0x5D34,\n\t2488: 0x5D39,\n\t2489: 0x5D3D,\n\t2490: 0x5D3F,\n\t2491: 0x5D42,\n\t2492: 0x5D43,\n\t2493: 0x5D46,\n\t2494: 0x5D48,\n\t2495: 0x5D55,\n\t2496: 0x5D51,\n\t2497: 0x5D59,\n\t2498: 0x5D4A,\n\t2499: 0x5D5F,\n\t2500: 0x5D60,\n\t2501: 0x5D61,\n\t2502: 0x5D62,\n\t2503: 0x5D64,\n\t2504: 0x5D6A,\n\t2505: 0x5D6D,\n\t2506: 0x5D70,\n\t2507: 0x5D79,\n\t2508: 0x5D7A,\n\t2509: 0x5D7E,\n\t2510: 0x5D7F,\n\t2511: 0x5D81,\n\t2512: 0x5D83,\n\t2513: 0x5D88,\n\t2514: 0x5D8A,\n\t2515: 0x5D92,\n\t2516: 0x5D93,\n\t2517: 0x5D94,\n\t2518: 0x5D95,\n\t2519: 0x5D99,\n\t2520: 0x5D9B,\n\t2521: 0x5D9F,\n\t2522: 0x5DA0,\n\t2523: 0x5DA7,\n\t2524: 0x5DAB,\n\t2525: 0x5DB0,\n\t2526: 0x5DB4,\n\t2527: 0x5DB8,\n\t2528: 0x5DB9,\n\t2529: 0x5DC3,\n\t2530: 0x5DC7,\n\t2531: 0x5DCB,\n\t2532: 0x5DD0,\n\t2533: 0x5DCE,\n\t2534: 0x5DD8,\n\t2535: 0x5DD9,\n\t2536: 0x5DE0,\n\t2537: 0x5DE4,\n\t2538: 0x5DE9,\n\t2539: 0x5DF8,\n\t2540: 0x5DF9,\n\t2541: 0x5E00,\n\t2542: 0x5E07,\n\t2543: 0x5E0D,\n\t2544: 0x5E12,\n\t2545: 0x5E14,\n\t2546: 0x5E15,\n\t2547: 0x5E18,\n\t2548: 0x5E1F,\n\t2549: 0x5E20,\n\t2550: 0x5E2E,\n\t2551: 0x5E28,\n\t2552: 0x5E32,\n\t2553: 0x5E35,\n\t2554: 0x5E3E,\n\t2555: 0x5E4B,\n\t2556: 0x5E50,\n\t2557: 0x5E49,\n\t2558: 0x5E51,\n\t2559: 0x5E56,\n\t2560: 0x5E58,\n\t2561: 0x5E5B,\n\t2562: 0x5E5C,\n\t2563: 0x5E5E,\n\t2564: 0x5E68,\n\t2565: 0x5E6A,\n\t2566: 0x5E6B,\n\t2567: 0x5E6C,\n\t2568: 0x5E6D,\n\t2569: 0x5E6E,\n\t2570: 0x5E70,\n\t2571: 0x5E80,\n\t2572: 0x5E8B,\n\t2573: 0x5E8E,\n\t2574: 0x5EA2,\n\t2575: 0x5EA4,\n\t2576: 0x5EA5,\n\t2577: 0x5EA8,\n\t2578: 0x5EAA,\n\t2579: 0x5EAC,\n\t2580: 0x5EB1,\n\t2581: 0x5EB3,\n\t2582: 0x5EBD,\n\t2583: 0x5EBE,\n\t2584: 0x5EBF,\n\t2585: 0x5EC6,\n\t2586: 0x5ECC,\n\t2587: 0x5ECB,\n\t2588: 0x5ECE,\n\t2589: 0x5ED1,\n\t2590: 0x5ED2,\n\t2591: 0x5ED4,\n\t2592: 0x5ED5,\n\t2593: 0x5EDC,\n\t2594: 0x5EDE,\n\t2595: 0x5EE5,\n\t2596: 0x5EEB,\n\t2597: 0x5F02,\n\t2598: 0x5F06,\n\t2599: 0x5F07,\n\t2600: 0x5F08,\n\t2601: 0x5F0E,\n\t2602: 0x5F19,\n\t2603: 0x5F1C,\n\t2604: 0x5F1D,\n\t2605: 0x5F21,\n\t2606: 0x5F22,\n\t2607: 0x5F23,\n\t2608: 0x5F24,\n\t2609: 0x5F28,\n\t2610: 0x5F2B,\n\t2611: 0x5F2C,\n\t2612: 0x5F2E,\n\t2613: 0x5F30,\n\t2614: 0x5F34,\n\t2615: 0x5F36,\n\t2616: 0x5F3B,\n\t2617: 0x5F3D,\n\t2618: 0x5F3F,\n\t2619: 0x5F40,\n\t2620: 0x5F44,\n\t2621: 0x5F45,\n\t2622: 0x5F47,\n\t2623: 0x5F4D,\n\t2624: 0x5F50,\n\t2625: 0x5F54,\n\t2626: 0x5F58,\n\t2627: 0x5F5B,\n\t2628: 0x5F60,\n\t2629: 0x5F63,\n\t2630: 0x5F64,\n\t2631: 0x5F67,\n\t2632: 0x5F6F,\n\t2633: 0x5F72,\n\t2634: 0x5F74,\n\t2635: 0x5F75,\n\t2636: 0x5F78,\n\t2637: 0x5F7A,\n\t2638: 0x5F7D,\n\t2639: 0x5F7E,\n\t2640: 0x5F89,\n\t2641: 0x5F8D,\n\t2642: 0x5F8F,\n\t2643: 0x5F96,\n\t2644: 0x5F9C,\n\t2645: 0x5F9D,\n\t2646: 0x5FA2,\n\t2647: 0x5FA7,\n\t2648: 0x5FAB,\n\t2649: 0x5FA4,\n\t2650: 0x5FAC,\n\t2651: 0x5FAF,\n\t2652: 0x5FB0,\n\t2653: 0x5FB1,\n\t2654: 0x5FB8,\n\t2655: 0x5FC4,\n\t2656: 0x5FC7,\n\t2657: 0x5FC8,\n\t2658: 0x5FC9,\n\t2659: 0x5FCB,\n\t2660: 0x5FD0,\n\t2661: 0x5FD1,\n\t2662: 0x5FD2,\n\t2663: 0x5FD3,\n\t2664: 0x5FD4,\n\t2665: 0x5FDE,\n\t2666: 0x5FE1,\n\t2667: 0x5FE2,\n\t2668: 0x5FE8,\n\t2669: 0x5FE9,\n\t2670: 0x5FEA,\n\t2671: 0x5FEC,\n\t2672: 0x5FED,\n\t2673: 0x5FEE,\n\t2674: 0x5FEF,\n\t2675: 0x5FF2,\n\t2676: 0x5FF3,\n\t2677: 0x5FF6,\n\t2678: 0x5FFA,\n\t2679: 0x5FFC,\n\t2680: 0x6007,\n\t2681: 0x600A,\n\t2682: 0x600D,\n\t2683: 0x6013,\n\t2684: 0x6014,\n\t2685: 0x6017,\n\t2686: 0x6018,\n\t2687: 0x601A,\n\t2688: 0x601F,\n\t2689: 0x6024,\n\t2690: 0x602D,\n\t2691: 0x6033,\n\t2692: 0x6035,\n\t2693: 0x6040,\n\t2694: 0x6047,\n\t2695: 0x6048,\n\t2696: 0x6049,\n\t2697: 0x604C,\n\t2698: 0x6051,\n\t2699: 0x6054,\n\t2700: 0x6056,\n\t2701: 0x6057,\n\t2702: 0x605D,\n\t2703: 0x6061,\n\t2704: 0x6067,\n\t2705: 0x6071,\n\t2706: 0x607E,\n\t2707: 0x607F,\n\t2708: 0x6082,\n\t2709: 0x6086,\n\t2710: 0x6088,\n\t2711: 0x608A,\n\t2712: 0x608E,\n\t2713: 0x6091,\n\t2714: 0x6093,\n\t2715: 0x6095,\n\t2716: 0x6098,\n\t2717: 0x609D,\n\t2718: 0x609E,\n\t2719: 0x60A2,\n\t2720: 0x60A4,\n\t2721: 0x60A5,\n\t2722: 0x60A8,\n\t2723: 0x60B0,\n\t2724: 0x60B1,\n\t2725: 0x60B7,\n\t2726: 0x60BB,\n\t2727: 0x60BE,\n\t2728: 0x60C2,\n\t2729: 0x60C4,\n\t2730: 0x60C8,\n\t2731: 0x60C9,\n\t2732: 0x60CA,\n\t2733: 0x60CB,\n\t2734: 0x60CE,\n\t2735: 0x60CF,\n\t2736: 0x60D4,\n\t2737: 0x60D5,\n\t2738: 0x60D9,\n\t2739: 0x60DB,\n\t2740: 0x60DD,\n\t2741: 0x60DE,\n\t2742: 0x60E2,\n\t2743: 0x60E5,\n\t2744: 0x60F2,\n\t2745: 0x60F5,\n\t2746: 0x60F8,\n\t2747: 0x60FC,\n\t2748: 0x60FD,\n\t2749: 0x6102,\n\t2750: 0x6107,\n\t2751: 0x610A,\n\t2752: 0x610C,\n\t2753: 0x6110,\n\t2754: 0x6111,\n\t2755: 0x6112,\n\t2756: 0x6113,\n\t2757: 0x6114,\n\t2758: 0x6116,\n\t2759: 0x6117,\n\t2760: 0x6119,\n\t2761: 0x611C,\n\t2762: 0x611E,\n\t2763: 0x6122,\n\t2764: 0x612A,\n\t2765: 0x612B,\n\t2766: 0x6130,\n\t2767: 0x6131,\n\t2768: 0x6135,\n\t2769: 0x6136,\n\t2770: 0x6137,\n\t2771: 0x6139,\n\t2772: 0x6141,\n\t2773: 0x6145,\n\t2774: 0x6146,\n\t2775: 0x6149,\n\t2776: 0x615E,\n\t2777: 0x6160,\n\t2778: 0x616C,\n\t2779: 0x6172,\n\t2780: 0x6178,\n\t2781: 0x617B,\n\t2782: 0x617C,\n\t2783: 0x617F,\n\t2784: 0x6180,\n\t2785: 0x6181,\n\t2786: 0x6183,\n\t2787: 0x6184,\n\t2788: 0x618B,\n\t2789: 0x618D,\n\t2790: 0x6192,\n\t2791: 0x6193,\n\t2792: 0x6197,\n\t2793: 0x6198,\n\t2794: 0x619C,\n\t2795: 0x619D,\n\t2796: 0x619F,\n\t2797: 0x61A0,\n\t2798: 0x61A5,\n\t2799: 0x61A8,\n\t2800: 0x61AA,\n\t2801: 0x61AD,\n\t2802: 0x61B8,\n\t2803: 0x61B9,\n\t2804: 0x61BC,\n\t2805: 0x61C0,\n\t2806: 0x61C1,\n\t2807: 0x61C2,\n\t2808: 0x61CE,\n\t2809: 0x61CF,\n\t2810: 0x61D5,\n\t2811: 0x61DC,\n\t2812: 0x61DD,\n\t2813: 0x61DE,\n\t2814: 0x61DF,\n\t2815: 0x61E1,\n\t2816: 0x61E2,\n\t2817: 0x61E7,\n\t2818: 0x61E9,\n\t2819: 0x61E5,\n\t2820: 0x61EC,\n\t2821: 0x61ED,\n\t2822: 0x61EF,\n\t2823: 0x6201,\n\t2824: 0x6203,\n\t2825: 0x6204,\n\t2826: 0x6207,\n\t2827: 0x6213,\n\t2828: 0x6215,\n\t2829: 0x621C,\n\t2830: 0x6220,\n\t2831: 0x6222,\n\t2832: 0x6223,\n\t2833: 0x6227,\n\t2834: 0x6229,\n\t2835: 0x622B,\n\t2836: 0x6239,\n\t2837: 0x623D,\n\t2838: 0x6242,\n\t2839: 0x6243,\n\t2840: 0x6244,\n\t2841: 0x6246,\n\t2842: 0x624C,\n\t2843: 0x6250,\n\t2844: 0x6251,\n\t2845: 0x6252,\n\t2846: 0x6254,\n\t2847: 0x6256,\n\t2848: 0x625A,\n\t2849: 0x625C,\n\t2850: 0x6264,\n\t2851: 0x626D,\n\t2852: 0x626F,\n\t2853: 0x6273,\n\t2854: 0x627A,\n\t2855: 0x627D,\n\t2856: 0x628D,\n\t2857: 0x628E,\n\t2858: 0x628F,\n\t2859: 0x6290,\n\t2860: 0x62A6,\n\t2861: 0x62A8,\n\t2862: 0x62B3,\n\t2863: 0x62B6,\n\t2864: 0x62B7,\n\t2865: 0x62BA,\n\t2866: 0x62BE,\n\t2867: 0x62BF,\n\t2868: 0x62C4,\n\t2869: 0x62CE,\n\t2870: 0x62D5,\n\t2871: 0x62D6,\n\t2872: 0x62DA,\n\t2873: 0x62EA,\n\t2874: 0x62F2,\n\t2875: 0x62F4,\n\t2876: 0x62FC,\n\t2877: 0x62FD,\n\t2878: 0x6303,\n\t2879: 0x6304,\n\t2880: 0x630A,\n\t2881: 0x630B,\n\t2882: 0x630D,\n\t2883: 0x6310,\n\t2884: 0x6313,\n\t2885: 0x6316,\n\t2886: 0x6318,\n\t2887: 0x6329,\n\t2888: 0x632A,\n\t2889: 0x632D,\n\t2890: 0x6335,\n\t2891: 0x6336,\n\t2892: 0x6339,\n\t2893: 0x633C,\n\t2894: 0x6341,\n\t2895: 0x6342,\n\t2896: 0x6343,\n\t2897: 0x6344,\n\t2898: 0x6346,\n\t2899: 0x634A,\n\t2900: 0x634B,\n\t2901: 0x634E,\n\t2902: 0x6352,\n\t2903: 0x6353,\n\t2904: 0x6354,\n\t2905: 0x6358,\n\t2906: 0x635B,\n\t2907: 0x6365,\n\t2908: 0x6366,\n\t2909: 0x636C,\n\t2910: 0x636D,\n\t2911: 0x6371,\n\t2912: 0x6374,\n\t2913: 0x6375,\n\t2914: 0x6378,\n\t2915: 0x637C,\n\t2916: 0x637D,\n\t2917: 0x637F,\n\t2918: 0x6382,\n\t2919: 0x6384,\n\t2920: 0x6387,\n\t2921: 0x638A,\n\t2922: 0x6390,\n\t2923: 0x6394,\n\t2924: 0x6395,\n\t2925: 0x6399,\n\t2926: 0x639A,\n\t2927: 0x639E,\n\t2928: 0x63A4,\n\t2929: 0x63A6,\n\t2930: 0x63AD,\n\t2931: 0x63AE,\n\t2932: 0x63AF,\n\t2933: 0x63BD,\n\t2934: 0x63C1,\n\t2935: 0x63C5,\n\t2936: 0x63C8,\n\t2937: 0x63CE,\n\t2938: 0x63D1,\n\t2939: 0x63D3,\n\t2940: 0x63D4,\n\t2941: 0x63D5,\n\t2942: 0x63DC,\n\t2943: 0x63E0,\n\t2944: 0x63E5,\n\t2945: 0x63EA,\n\t2946: 0x63EC,\n\t2947: 0x63F2,\n\t2948: 0x63F3,\n\t2949: 0x63F5,\n\t2950: 0x63F8,\n\t2951: 0x63F9,\n\t2952: 0x6409,\n\t2953: 0x640A,\n\t2954: 0x6410,\n\t2955: 0x6412,\n\t2956: 0x6414,\n\t2957: 0x6418,\n\t2958: 0x641E,\n\t2959: 0x6420,\n\t2960: 0x6422,\n\t2961: 0x6424,\n\t2962: 0x6425,\n\t2963: 0x6429,\n\t2964: 0x642A,\n\t2965: 0x642F,\n\t2966: 0x6430,\n\t2967: 0x6435,\n\t2968: 0x643D,\n\t2969: 0x643F,\n\t2970: 0x644B,\n\t2971: 0x644F,\n\t2972: 0x6451,\n\t2973: 0x6452,\n\t2974: 0x6453,\n\t2975: 0x6454,\n\t2976: 0x645A,\n\t2977: 0x645B,\n\t2978: 0x645C,\n\t2979: 0x645D,\n\t2980: 0x645F,\n\t2981: 0x6460,\n\t2982: 0x6461,\n\t2983: 0x6463,\n\t2984: 0x646D,\n\t2985: 0x6473,\n\t2986: 0x6474,\n\t2987: 0x647B,\n\t2988: 0x647D,\n\t2989: 0x6485,\n\t2990: 0x6487,\n\t2991: 0x648F,\n\t2992: 0x6490,\n\t2993: 0x6491,\n\t2994: 0x6498,\n\t2995: 0x6499,\n\t2996: 0x649B,\n\t2997: 0x649D,\n\t2998: 0x649F,\n\t2999: 0x64A1,\n\t3000: 0x64A3,\n\t3001: 0x64A6,\n\t3002: 0x64A8,\n\t3003: 0x64AC,\n\t3004: 0x64B3,\n\t3005: 0x64BD,\n\t3006: 0x64BE,\n\t3007: 0x64BF,\n\t3008: 0x64C4,\n\t3009: 0x64C9,\n\t3010: 0x64CA,\n\t3011: 0x64CB,\n\t3012: 0x64CC,\n\t3013: 0x64CE,\n\t3014: 0x64D0,\n\t3015: 0x64D1,\n\t3016: 0x64D5,\n\t3017: 0x64D7,\n\t3018: 0x64E4,\n\t3019: 0x64E5,\n\t3020: 0x64E9,\n\t3021: 0x64EA,\n\t3022: 0x64ED,\n\t3023: 0x64F0,\n\t3024: 0x64F5,\n\t3025: 0x64F7,\n\t3026: 0x64FB,\n\t3027: 0x64FF,\n\t3028: 0x6501,\n\t3029: 0x6504,\n\t3030: 0x6508,\n\t3031: 0x6509,\n\t3032: 0x650A,\n\t3033: 0x650F,\n\t3034: 0x6513,\n\t3035: 0x6514,\n\t3036: 0x6516,\n\t3037: 0x6519,\n\t3038: 0x651B,\n\t3039: 0x651E,\n\t3040: 0x651F,\n\t3041: 0x6522,\n\t3042: 0x6526,\n\t3043: 0x6529,\n\t3044: 0x652E,\n\t3045: 0x6531,\n\t3046: 0x653A,\n\t3047: 0x653C,\n\t3048: 0x653D,\n\t3049: 0x6543,\n\t3050: 0x6547,\n\t3051: 0x6549,\n\t3052: 0x6550,\n\t3053: 0x6552,\n\t3054: 0x6554,\n\t3055: 0x655F,\n\t3056: 0x6560,\n\t3057: 0x6567,\n\t3058: 0x656B,\n\t3059: 0x657A,\n\t3060: 0x657D,\n\t3061: 0x6581,\n\t3062: 0x6585,\n\t3063: 0x658A,\n\t3064: 0x6592,\n\t3065: 0x6595,\n\t3066: 0x6598,\n\t3067: 0x659D,\n\t3068: 0x65A0,\n\t3069: 0x65A3,\n\t3070: 0x65A6,\n\t3071: 0x65AE,\n\t3072: 0x65B2,\n\t3073: 0x65B3,\n\t3074: 0x65B4,\n\t3075: 0x65BF,\n\t3076: 0x65C2,\n\t3077: 0x65C8,\n\t3078: 0x65C9,\n\t3079: 0x65CE,\n\t3080: 0x65D0,\n\t3081: 0x65D4,\n\t3082: 0x65D6,\n\t3083: 0x65D8,\n\t3084: 0x65DF,\n\t3085: 0x65F0,\n\t3086: 0x65F2,\n\t3087: 0x65F4,\n\t3088: 0x65F5,\n\t3089: 0x65F9,\n\t3090: 0x65FE,\n\t3091: 0x65FF,\n\t3092: 0x6600,\n\t3093: 0x6604,\n\t3094: 0x6608,\n\t3095: 0x6609,\n\t3096: 0x660D,\n\t3097: 0x6611,\n\t3098: 0x6612,\n\t3099: 0x6615,\n\t3100: 0x6616,\n\t3101: 0x661D,\n\t3102: 0x661E,\n\t3103: 0x6621,\n\t3104: 0x6622,\n\t3105: 0x6623,\n\t3106: 0x6624,\n\t3107: 0x6626,\n\t3108: 0x6629,\n\t3109: 0x662A,\n\t3110: 0x662B,\n\t3111: 0x662C,\n\t3112: 0x662E,\n\t3113: 0x6630,\n\t3114: 0x6631,\n\t3115: 0x6633,\n\t3116: 0x6639,\n\t3117: 0x6637,\n\t3118: 0x6640,\n\t3119: 0x6645,\n\t3120: 0x6646,\n\t3121: 0x664A,\n\t3122: 0x664C,\n\t3123: 0x6651,\n\t3124: 0x664E,\n\t3125: 0x6657,\n\t3126: 0x6658,\n\t3127: 0x6659,\n\t3128: 0x665B,\n\t3129: 0x665C,\n\t3130: 0x6660,\n\t3131: 0x6661,\n\t3132: 0x66FB,\n\t3133: 0x666A,\n\t3134: 0x666B,\n\t3135: 0x666C,\n\t3136: 0x667E,\n\t3137: 0x6673,\n\t3138: 0x6675,\n\t3139: 0x667F,\n\t3140: 0x6677,\n\t3141: 0x6678,\n\t3142: 0x6679,\n\t3143: 0x667B,\n\t3144: 0x6680,\n\t3145: 0x667C,\n\t3146: 0x668B,\n\t3147: 0x668C,\n\t3148: 0x668D,\n\t3149: 0x6690,\n\t3150: 0x6692,\n\t3151: 0x6699,\n\t3152: 0x669A,\n\t3153: 0x669B,\n\t3154: 0x669C,\n\t3155: 0x669F,\n\t3156: 0x66A0,\n\t3157: 0x66A4,\n\t3158: 0x66AD,\n\t3159: 0x66B1,\n\t3160: 0x66B2,\n\t3161: 0x66B5,\n\t3162: 0x66BB,\n\t3163: 0x66BF,\n\t3164: 0x66C0,\n\t3165: 0x66C2,\n\t3166: 0x66C3,\n\t3167: 0x66C8,\n\t3168: 0x66CC,\n\t3169: 0x66CE,\n\t3170: 0x66CF,\n\t3171: 0x66D4,\n\t3172: 0x66DB,\n\t3173: 0x66DF,\n\t3174: 0x66E8,\n\t3175: 0x66EB,\n\t3176: 0x66EC,\n\t3177: 0x66EE,\n\t3178: 0x66FA,\n\t3179: 0x6705,\n\t3180: 0x6707,\n\t3181: 0x670E,\n\t3182: 0x6713,\n\t3183: 0x6719,\n\t3184: 0x671C,\n\t3185: 0x6720,\n\t3186: 0x6722,\n\t3187: 0x6733,\n\t3188: 0x673E,\n\t3189: 0x6745,\n\t3190: 0x6747,\n\t3191: 0x6748,\n\t3192: 0x674C,\n\t3193: 0x6754,\n\t3194: 0x6755,\n\t3195: 0x675D,\n\t3196: 0x6766,\n\t3197: 0x676C,\n\t3198: 0x676E,\n\t3199: 0x6774,\n\t3200: 0x6776,\n\t3201: 0x677B,\n\t3202: 0x6781,\n\t3203: 0x6784,\n\t3204: 0x678E,\n\t3205: 0x678F,\n\t3206: 0x6791,\n\t3207: 0x6793,\n\t3208: 0x6796,\n\t3209: 0x6798,\n\t3210: 0x6799,\n\t3211: 0x679B,\n\t3212: 0x67B0,\n\t3213: 0x67B1,\n\t3214: 0x67B2,\n\t3215: 0x67B5,\n\t3216: 0x67BB,\n\t3217: 0x67BC,\n\t3218: 0x67BD,\n\t3219: 0x67F9,\n\t3220: 0x67C0,\n\t3221: 0x67C2,\n\t3222: 0x67C3,\n\t3223: 0x67C5,\n\t3224: 0x67C8,\n\t3225: 0x67C9,\n\t3226: 0x67D2,\n\t3227: 0x67D7,\n\t3228: 0x67D9,\n\t3229: 0x67DC,\n\t3230: 0x67E1,\n\t3231: 0x67E6,\n\t3232: 0x67F0,\n\t3233: 0x67F2,\n\t3234: 0x67F6,\n\t3235: 0x67F7,\n\t3236: 0x6852,\n\t3237: 0x6814,\n\t3238: 0x6819,\n\t3239: 0x681D,\n\t3240: 0x681F,\n\t3241: 0x6828,\n\t3242: 0x6827,\n\t3243: 0x682C,\n\t3244: 0x682D,\n\t3245: 0x682F,\n\t3246: 0x6830,\n\t3247: 0x6831,\n\t3248: 0x6833,\n\t3249: 0x683B,\n\t3250: 0x683F,\n\t3251: 0x6844,\n\t3252: 0x6845,\n\t3253: 0x684A,\n\t3254: 0x684C,\n\t3255: 0x6855,\n\t3256: 0x6857,\n\t3257: 0x6858,\n\t3258: 0x685B,\n\t3259: 0x686B,\n\t3260: 0x686E,\n\t3261: 0x686F,\n\t3262: 0x6870,\n\t3263: 0x6871,\n\t3264: 0x6872,\n\t3265: 0x6875,\n\t3266: 0x6879,\n\t3267: 0x687A,\n\t3268: 0x687B,\n\t3269: 0x687C,\n\t3270: 0x6882,\n\t3271: 0x6884,\n\t3272: 0x6886,\n\t3273: 0x6888,\n\t3274: 0x6896,\n\t3275: 0x6898,\n\t3276: 0x689A,\n\t3277: 0x689C,\n\t3278: 0x68A1,\n\t3279: 0x68A3,\n\t3280: 0x68A5,\n\t3281: 0x68A9,\n\t3282: 0x68AA,\n\t3283: 0x68AE,\n\t3284: 0x68B2,\n\t3285: 0x68BB,\n\t3286: 0x68C5,\n\t3287: 0x68C8,\n\t3288: 0x68CC,\n\t3289: 0x68CF,\n\t3290: 0x68D0,\n\t3291: 0x68D1,\n\t3292: 0x68D3,\n\t3293: 0x68D6,\n\t3294: 0x68D9,\n\t3295: 0x68DC,\n\t3296: 0x68DD,\n\t3297: 0x68E5,\n\t3298: 0x68E8,\n\t3299: 0x68EA,\n\t3300: 0x68EB,\n\t3301: 0x68EC,\n\t3302: 0x68ED,\n\t3303: 0x68F0,\n\t3304: 0x68F1,\n\t3305: 0x68F5,\n\t3306: 0x68F6,\n\t3307: 0x68FB,\n\t3308: 0x68FC,\n\t3309: 0x68FD,\n\t3310: 0x6906,\n\t3311: 0x6909,\n\t3312: 0x690A,\n\t3313: 0x6910,\n\t3314: 0x6911,\n\t3315: 0x6913,\n\t3316: 0x6916,\n\t3317: 0x6917,\n\t3318: 0x6931,\n\t3319: 0x6933,\n\t3320: 0x6935,\n\t3321: 0x6938,\n\t3322: 0x693B,\n\t3323: 0x6942,\n\t3324: 0x6945,\n\t3325: 0x6949,\n\t3326: 0x694E,\n\t3327: 0x6957,\n\t3328: 0x695B,\n\t3329: 0x6963,\n\t3330: 0x6964,\n\t3331: 0x6965,\n\t3332: 0x6966,\n\t3333: 0x6968,\n\t3334: 0x6969,\n\t3335: 0x696C,\n\t3336: 0x6970,\n\t3337: 0x6971,\n\t3338: 0x6972,\n\t3339: 0x697A,\n\t3340: 0x697B,\n\t3341: 0x697F,\n\t3342: 0x6980,\n\t3343: 0x698D,\n\t3344: 0x6992,\n\t3345: 0x6996,\n\t3346: 0x6998,\n\t3347: 0x69A1,\n\t3348: 0x69A5,\n\t3349: 0x69A6,\n\t3350: 0x69A8,\n\t3351: 0x69AB,\n\t3352: 0x69AD,\n\t3353: 0x69AF,\n\t3354: 0x69B7,\n\t3355: 0x69B8,\n\t3356: 0x69BA,\n\t3357: 0x69BC,\n\t3358: 0x69C5,\n\t3359: 0x69C8,\n\t3360: 0x69D1,\n\t3361: 0x69D6,\n\t3362: 0x69D7,\n\t3363: 0x69E2,\n\t3364: 0x69E5,\n\t3365: 0x69EE,\n\t3366: 0x69EF,\n\t3367: 0x69F1,\n\t3368: 0x69F3,\n\t3369: 0x69F5,\n\t3370: 0x69FE,\n\t3371: 0x6A00,\n\t3372: 0x6A01,\n\t3373: 0x6A03,\n\t3374: 0x6A0F,\n\t3375: 0x6A11,\n\t3376: 0x6A15,\n\t3377: 0x6A1A,\n\t3378: 0x6A1D,\n\t3379: 0x6A20,\n\t3380: 0x6A24,\n\t3381: 0x6A28,\n\t3382: 0x6A30,\n\t3383: 0x6A32,\n\t3384: 0x6A34,\n\t3385: 0x6A37,\n\t3386: 0x6A3B,\n\t3387: 0x6A3E,\n\t3388: 0x6A3F,\n\t3389: 0x6A45,\n\t3390: 0x6A46,\n\t3391: 0x6A49,\n\t3392: 0x6A4A,\n\t3393: 0x6A4E,\n\t3394: 0x6A50,\n\t3395: 0x6A51,\n\t3396: 0x6A52,\n\t3397: 0x6A55,\n\t3398: 0x6A56,\n\t3399: 0x6A5B,\n\t3400: 0x6A64,\n\t3401: 0x6A67,\n\t3402: 0x6A6A,\n\t3403: 0x6A71,\n\t3404: 0x6A73,\n\t3405: 0x6A7E,\n\t3406: 0x6A81,\n\t3407: 0x6A83,\n\t3408: 0x6A86,\n\t3409: 0x6A87,\n\t3410: 0x6A89,\n\t3411: 0x6A8B,\n\t3412: 0x6A91,\n\t3413: 0x6A9B,\n\t3414: 0x6A9D,\n\t3415: 0x6A9E,\n\t3416: 0x6A9F,\n\t3417: 0x6AA5,\n\t3418: 0x6AAB,\n\t3419: 0x6AAF,\n\t3420: 0x6AB0,\n\t3421: 0x6AB1,\n\t3422: 0x6AB4,\n\t3423: 0x6ABD,\n\t3424: 0x6ABE,\n\t3425: 0x6ABF,\n\t3426: 0x6AC6,\n\t3427: 0x6AC9,\n\t3428: 0x6AC8,\n\t3429: 0x6ACC,\n\t3430: 0x6AD0,\n\t3431: 0x6AD4,\n\t3432: 0x6AD5,\n\t3433: 0x6AD6,\n\t3434: 0x6ADC,\n\t3435: 0x6ADD,\n\t3436: 0x6AE4,\n\t3437: 0x6AE7,\n\t3438: 0x6AEC,\n\t3439: 0x6AF0,\n\t3440: 0x6AF1,\n\t3441: 0x6AF2,\n\t3442: 0x6AFC,\n\t3443: 0x6AFD,\n\t3444: 0x6B02,\n\t3445: 0x6B03,\n\t3446: 0x6B06,\n\t3447: 0x6B07,\n\t3448: 0x6B09,\n\t3449: 0x6B0F,\n\t3450: 0x6B10,\n\t3451: 0x6B11,\n\t3452: 0x6B17,\n\t3453: 0x6B1B,\n\t3454: 0x6B1E,\n\t3455: 0x6B24,\n\t3456: 0x6B28,\n\t3457: 0x6B2B,\n\t3458: 0x6B2C,\n\t3459: 0x6B2F,\n\t3460: 0x6B35,\n\t3461: 0x6B36,\n\t3462: 0x6B3B,\n\t3463: 0x6B3F,\n\t3464: 0x6B46,\n\t3465: 0x6B4A,\n\t3466: 0x6B4D,\n\t3467: 0x6B52,\n\t3468: 0x6B56,\n\t3469: 0x6B58,\n\t3470: 0x6B5D,\n\t3471: 0x6B60,\n\t3472: 0x6B67,\n\t3473: 0x6B6B,\n\t3474: 0x6B6E,\n\t3475: 0x6B70,\n\t3476: 0x6B75,\n\t3477: 0x6B7D,\n\t3478: 0x6B7E,\n\t3479: 0x6B82,\n\t3480: 0x6B85,\n\t3481: 0x6B97,\n\t3482: 0x6B9B,\n\t3483: 0x6B9F,\n\t3484: 0x6BA0,\n\t3485: 0x6BA2,\n\t3486: 0x6BA3,\n\t3487: 0x6BA8,\n\t3488: 0x6BA9,\n\t3489: 0x6BAC,\n\t3490: 0x6BAD,\n\t3491: 0x6BAE,\n\t3492: 0x6BB0,\n\t3493: 0x6BB8,\n\t3494: 0x6BB9,\n\t3495: 0x6BBD,\n\t3496: 0x6BBE,\n\t3497: 0x6BC3,\n\t3498: 0x6BC4,\n\t3499: 0x6BC9,\n\t3500: 0x6BCC,\n\t3501: 0x6BD6,\n\t3502: 0x6BDA,\n\t3503: 0x6BE1,\n\t3504: 0x6BE3,\n\t3505: 0x6BE6,\n\t3506: 0x6BE7,\n\t3507: 0x6BEE,\n\t3508: 0x6BF1,\n\t3509: 0x6BF7,\n\t3510: 0x6BF9,\n\t3511: 0x6BFF,\n\t3512: 0x6C02,\n\t3513: 0x6C04,\n\t3514: 0x6C05,\n\t3515: 0x6C09,\n\t3516: 0x6C0D,\n\t3517: 0x6C0E,\n\t3518: 0x6C10,\n\t3519: 0x6C12,\n\t3520: 0x6C19,\n\t3521: 0x6C1F,\n\t3522: 0x6C26,\n\t3523: 0x6C27,\n\t3524: 0x6C28,\n\t3525: 0x6C2C,\n\t3526: 0x6C2E,\n\t3527: 0x6C33,\n\t3528: 0x6C35,\n\t3529: 0x6C36,\n\t3530: 0x6C3A,\n\t3531: 0x6C3B,\n\t3532: 0x6C3F,\n\t3533: 0x6C4A,\n\t3534: 0x6C4B,\n\t3535: 0x6C4D,\n\t3536: 0x6C4F,\n\t3537: 0x6C52,\n\t3538: 0x6C54,\n\t3539: 0x6C59,\n\t3540: 0x6C5B,\n\t3541: 0x6C5C,\n\t3542: 0x6C6B,\n\t3543: 0x6C6D,\n\t3544: 0x6C6F,\n\t3545: 0x6C74,\n\t3546: 0x6C76,\n\t3547: 0x6C78,\n\t3548: 0x6C79,\n\t3549: 0x6C7B,\n\t3550: 0x6C85,\n\t3551: 0x6C86,\n\t3552: 0x6C87,\n\t3553: 0x6C89,\n\t3554: 0x6C94,\n\t3555: 0x6C95,\n\t3556: 0x6C97,\n\t3557: 0x6C98,\n\t3558: 0x6C9C,\n\t3559: 0x6C9F,\n\t3560: 0x6CB0,\n\t3561: 0x6CB2,\n\t3562: 0x6CB4,\n\t3563: 0x6CC2,\n\t3564: 0x6CC6,\n\t3565: 0x6CCD,\n\t3566: 0x6CCF,\n\t3567: 0x6CD0,\n\t3568: 0x6CD1,\n\t3569: 0x6CD2,\n\t3570: 0x6CD4,\n\t3571: 0x6CD6,\n\t3572: 0x6CDA,\n\t3573: 0x6CDC,\n\t3574: 0x6CE0,\n\t3575: 0x6CE7,\n\t3576: 0x6CE9,\n\t3577: 0x6CEB,\n\t3578: 0x6CEC,\n\t3579: 0x6CEE,\n\t3580: 0x6CF2,\n\t3581: 0x6CF4,\n\t3582: 0x6D04,\n\t3583: 0x6D07,\n\t3584: 0x6D0A,\n\t3585: 0x6D0E,\n\t3586: 0x6D0F,\n\t3587: 0x6D11,\n\t3588: 0x6D13,\n\t3589: 0x6D1A,\n\t3590: 0x6D26,\n\t3591: 0x6D27,\n\t3592: 0x6D28,\n\t3593: 0x6C67,\n\t3594: 0x6D2E,\n\t3595: 0x6D2F,\n\t3596: 0x6D31,\n\t3597: 0x6D39,\n\t3598: 0x6D3C,\n\t3599: 0x6D3F,\n\t3600: 0x6D57,\n\t3601: 0x6D5E,\n\t3602: 0x6D5F,\n\t3603: 0x6D61,\n\t3604: 0x6D65,\n\t3605: 0x6D67,\n\t3606: 0x6D6F,\n\t3607: 0x6D70,\n\t3608: 0x6D7C,\n\t3609: 0x6D82,\n\t3610: 0x6D87,\n\t3611: 0x6D91,\n\t3612: 0x6D92,\n\t3613: 0x6D94,\n\t3614: 0x6D96,\n\t3615: 0x6D97,\n\t3616: 0x6D98,\n\t3617: 0x6DAA,\n\t3618: 0x6DAC,\n\t3619: 0x6DB4,\n\t3620: 0x6DB7,\n\t3621: 0x6DB9,\n\t3622: 0x6DBD,\n\t3623: 0x6DBF,\n\t3624: 0x6DC4,\n\t3625: 0x6DC8,\n\t3626: 0x6DCA,\n\t3627: 0x6DCE,\n\t3628: 0x6DCF,\n\t3629: 0x6DD6,\n\t3630: 0x6DDB,\n\t3631: 0x6DDD,\n\t3632: 0x6DDF,\n\t3633: 0x6DE0,\n\t3634: 0x6DE2,\n\t3635: 0x6DE5,\n\t3636: 0x6DE9,\n\t3637: 0x6DEF,\n\t3638: 0x6DF0,\n\t3639: 0x6DF4,\n\t3640: 0x6DF6,\n\t3641: 0x6DFC,\n\t3642: 0x6E00,\n\t3643: 0x6E04,\n\t3644: 0x6E1E,\n\t3645: 0x6E22,\n\t3646: 0x6E27,\n\t3647: 0x6E32,\n\t3648: 0x6E36,\n\t3649: 0x6E39,\n\t3650: 0x6E3B,\n\t3651: 0x6E3C,\n\t3652: 0x6E44,\n\t3653: 0x6E45,\n\t3654: 0x6E48,\n\t3655: 0x6E49,\n\t3656: 0x6E4B,\n\t3657: 0x6E4F,\n\t3658: 0x6E51,\n\t3659: 0x6E52,\n\t3660: 0x6E53,\n\t3661: 0x6E54,\n\t3662: 0x6E57,\n\t3663: 0x6E5C,\n\t3664: 0x6E5D,\n\t3665: 0x6E5E,\n\t3666: 0x6E62,\n\t3667: 0x6E63,\n\t3668: 0x6E68,\n\t3669: 0x6E73,\n\t3670: 0x6E7B,\n\t3671: 0x6E7D,\n\t3672: 0x6E8D,\n\t3673: 0x6E93,\n\t3674: 0x6E99,\n\t3675: 0x6EA0,\n\t3676: 0x6EA7,\n\t3677: 0x6EAD,\n\t3678: 0x6EAE,\n\t3679: 0x6EB1,\n\t3680: 0x6EB3,\n\t3681: 0x6EBB,\n\t3682: 0x6EBF,\n\t3683: 0x6EC0,\n\t3684: 0x6EC1,\n\t3685: 0x6EC3,\n\t3686: 0x6EC7,\n\t3687: 0x6EC8,\n\t3688: 0x6ECA,\n\t3689: 0x6ECD,\n\t3690: 0x6ECE,\n\t3691: 0x6ECF,\n\t3692: 0x6EEB,\n\t3693: 0x6EED,\n\t3694: 0x6EEE,\n\t3695: 0x6EF9,\n\t3696: 0x6EFB,\n\t3697: 0x6EFD,\n\t3698: 0x6F04,\n\t3699: 0x6F08,\n\t3700: 0x6F0A,\n\t3701: 0x6F0C,\n\t3702: 0x6F0D,\n\t3703: 0x6F16,\n\t3704: 0x6F18,\n\t3705: 0x6F1A,\n\t3706: 0x6F1B,\n\t3707: 0x6F26,\n\t3708: 0x6F29,\n\t3709: 0x6F2A,\n\t3710: 0x6F2F,\n\t3711: 0x6F30,\n\t3712: 0x6F33,\n\t3713: 0x6F36,\n\t3714: 0x6F3B,\n\t3715: 0x6F3C,\n\t3716: 0x6F2D,\n\t3717: 0x6F4F,\n\t3718: 0x6F51,\n\t3719: 0x6F52,\n\t3720: 0x6F53,\n\t3721: 0x6F57,\n\t3722: 0x6F59,\n\t3723: 0x6F5A,\n\t3724: 0x6F5D,\n\t3725: 0x6F5E,\n\t3726: 0x6F61,\n\t3727: 0x6F62,\n\t3728: 0x6F68,\n\t3729: 0x6F6C,\n\t3730: 0x6F7D,\n\t3731: 0x6F7E,\n\t3732: 0x6F83,\n\t3733: 0x6F87,\n\t3734: 0x6F88,\n\t3735: 0x6F8B,\n\t3736: 0x6F8C,\n\t3737: 0x6F8D,\n\t3738: 0x6F90,\n\t3739: 0x6F92,\n\t3740: 0x6F93,\n\t3741: 0x6F94,\n\t3742: 0x6F96,\n\t3743: 0x6F9A,\n\t3744: 0x6F9F,\n\t3745: 0x6FA0,\n\t3746: 0x6FA5,\n\t3747: 0x6FA6,\n\t3748: 0x6FA7,\n\t3749: 0x6FA8,\n\t3750: 0x6FAE,\n\t3751: 0x6FAF,\n\t3752: 0x6FB0,\n\t3753: 0x6FB5,\n\t3754: 0x6FB6,\n\t3755: 0x6FBC,\n\t3756: 0x6FC5,\n\t3757: 0x6FC7,\n\t3758: 0x6FC8,\n\t3759: 0x6FCA,\n\t3760: 0x6FDA,\n\t3761: 0x6FDE,\n\t3762: 0x6FE8,\n\t3763: 0x6FE9,\n\t3764: 0x6FF0,\n\t3765: 0x6FF5,\n\t3766: 0x6FF9,\n\t3767: 0x6FFC,\n\t3768: 0x6FFD,\n\t3769: 0x7000,\n\t3770: 0x7005,\n\t3771: 0x7006,\n\t3772: 0x7007,\n\t3773: 0x700D,\n\t3774: 0x7017,\n\t3775: 0x7020,\n\t3776: 0x7023,\n\t3777: 0x702F,\n\t3778: 0x7034,\n\t3779: 0x7037,\n\t3780: 0x7039,\n\t3781: 0x703C,\n\t3782: 0x7043,\n\t3783: 0x7044,\n\t3784: 0x7048,\n\t3785: 0x7049,\n\t3786: 0x704A,\n\t3787: 0x704B,\n\t3788: 0x7054,\n\t3789: 0x7055,\n\t3790: 0x705D,\n\t3791: 0x705E,\n\t3792: 0x704E,\n\t3793: 0x7064,\n\t3794: 0x7065,\n\t3795: 0x706C,\n\t3796: 0x706E,\n\t3797: 0x7075,\n\t3798: 0x7076,\n\t3799: 0x707E,\n\t3800: 0x7081,\n\t3801: 0x7085,\n\t3802: 0x7086,\n\t3803: 0x7094,\n\t3804: 0x7095,\n\t3805: 0x7096,\n\t3806: 0x7097,\n\t3807: 0x7098,\n\t3808: 0x709B,\n\t3809: 0x70A4,\n\t3810: 0x70AB,\n\t3811: 0x70B0,\n\t3812: 0x70B1,\n\t3813: 0x70B4,\n\t3814: 0x70B7,\n\t3815: 0x70CA,\n\t3816: 0x70D1,\n\t3817: 0x70D3,\n\t3818: 0x70D4,\n\t3819: 0x70D5,\n\t3820: 0x70D6,\n\t3821: 0x70D8,\n\t3822: 0x70DC,\n\t3823: 0x70E4,\n\t3824: 0x70FA,\n\t3825: 0x7103,\n\t3826: 0x7104,\n\t3827: 0x7105,\n\t3828: 0x7106,\n\t3829: 0x7107,\n\t3830: 0x710B,\n\t3831: 0x710C,\n\t3832: 0x710F,\n\t3833: 0x711E,\n\t3834: 0x7120,\n\t3835: 0x712B,\n\t3836: 0x712D,\n\t3837: 0x712F,\n\t3838: 0x7130,\n\t3839: 0x7131,\n\t3840: 0x7138,\n\t3841: 0x7141,\n\t3842: 0x7145,\n\t3843: 0x7146,\n\t3844: 0x7147,\n\t3845: 0x714A,\n\t3846: 0x714B,\n\t3847: 0x7150,\n\t3848: 0x7152,\n\t3849: 0x7157,\n\t3850: 0x715A,\n\t3851: 0x715C,\n\t3852: 0x715E,\n\t3853: 0x7160,\n\t3854: 0x7168,\n\t3855: 0x7179,\n\t3856: 0x7180,\n\t3857: 0x7185,\n\t3858: 0x7187,\n\t3859: 0x718C,\n\t3860: 0x7192,\n\t3861: 0x719A,\n\t3862: 0x719B,\n\t3863: 0x71A0,\n\t3864: 0x71A2,\n\t3865: 0x71AF,\n\t3866: 0x71B0,\n\t3867: 0x71B2,\n\t3868: 0x71B3,\n\t3869: 0x71BA,\n\t3870: 0x71BF,\n\t3871: 0x71C0,\n\t3872: 0x71C1,\n\t3873: 0x71C4,\n\t3874: 0x71CB,\n\t3875: 0x71CC,\n\t3876: 0x71D3,\n\t3877: 0x71D6,\n\t3878: 0x71D9,\n\t3879: 0x71DA,\n\t3880: 0x71DC,\n\t3881: 0x71F8,\n\t3882: 0x71FE,\n\t3883: 0x7200,\n\t3884: 0x7207,\n\t3885: 0x7208,\n\t3886: 0x7209,\n\t3887: 0x7213,\n\t3888: 0x7217,\n\t3889: 0x721A,\n\t3890: 0x721D,\n\t3891: 0x721F,\n\t3892: 0x7224,\n\t3893: 0x722B,\n\t3894: 0x722F,\n\t3895: 0x7234,\n\t3896: 0x7238,\n\t3897: 0x7239,\n\t3898: 0x7241,\n\t3899: 0x7242,\n\t3900: 0x7243,\n\t3901: 0x7245,\n\t3902: 0x724E,\n\t3903: 0x724F,\n\t3904: 0x7250,\n\t3905: 0x7253,\n\t3906: 0x7255,\n\t3907: 0x7256,\n\t3908: 0x725A,\n\t3909: 0x725C,\n\t3910: 0x725E,\n\t3911: 0x7260,\n\t3912: 0x7263,\n\t3913: 0x7268,\n\t3914: 0x726B,\n\t3915: 0x726E,\n\t3916: 0x726F,\n\t3917: 0x7271,\n\t3918: 0x7277,\n\t3919: 0x7278,\n\t3920: 0x727B,\n\t3921: 0x727C,\n\t3922: 0x727F,\n\t3923: 0x7284,\n\t3924: 0x7289,\n\t3925: 0x728D,\n\t3926: 0x728E,\n\t3927: 0x7293,\n\t3928: 0x729B,\n\t3929: 0x72A8,\n\t3930: 0x72AD,\n\t3931: 0x72AE,\n\t3932: 0x72B1,\n\t3933: 0x72B4,\n\t3934: 0x72BE,\n\t3935: 0x72C1,\n\t3936: 0x72C7,\n\t3937: 0x72C9,\n\t3938: 0x72CC,\n\t3939: 0x72D5,\n\t3940: 0x72D6,\n\t3941: 0x72D8,\n\t3942: 0x72DF,\n\t3943: 0x72E5,\n\t3944: 0x72F3,\n\t3945: 0x72F4,\n\t3946: 0x72FA,\n\t3947: 0x72FB,\n\t3948: 0x72FE,\n\t3949: 0x7302,\n\t3950: 0x7304,\n\t3951: 0x7305,\n\t3952: 0x7307,\n\t3953: 0x730B,\n\t3954: 0x730D,\n\t3955: 0x7312,\n\t3956: 0x7313,\n\t3957: 0x7318,\n\t3958: 0x7319,\n\t3959: 0x731E,\n\t3960: 0x7322,\n\t3961: 0x7324,\n\t3962: 0x7327,\n\t3963: 0x7328,\n\t3964: 0x732C,\n\t3965: 0x7331,\n\t3966: 0x7332,\n\t3967: 0x7335,\n\t3968: 0x733A,\n\t3969: 0x733B,\n\t3970: 0x733D,\n\t3971: 0x7343,\n\t3972: 0x734D,\n\t3973: 0x7350,\n\t3974: 0x7352,\n\t3975: 0x7356,\n\t3976: 0x7358,\n\t3977: 0x735D,\n\t3978: 0x735E,\n\t3979: 0x735F,\n\t3980: 0x7360,\n\t3981: 0x7366,\n\t3982: 0x7367,\n\t3983: 0x7369,\n\t3984: 0x736B,\n\t3985: 0x736C,\n\t3986: 0x736E,\n\t3987: 0x736F,\n\t3988: 0x7371,\n\t3989: 0x7377,\n\t3990: 0x7379,\n\t3991: 0x737C,\n\t3992: 0x7380,\n\t3993: 0x7381,\n\t3994: 0x7383,\n\t3995: 0x7385,\n\t3996: 0x7386,\n\t3997: 0x738E,\n\t3998: 0x7390,\n\t3999: 0x7393,\n\t4000: 0x7395,\n\t4001: 0x7397,\n\t4002: 0x7398,\n\t4003: 0x739C,\n\t4004: 0x739E,\n\t4005: 0x739F,\n\t4006: 0x73A0,\n\t4007: 0x73A2,\n\t4008: 0x73A5,\n\t4009: 0x73A6,\n\t4010: 0x73AA,\n\t4011: 0x73AB,\n\t4012: 0x73AD,\n\t4013: 0x73B5,\n\t4014: 0x73B7,\n\t4015: 0x73B9,\n\t4016: 0x73BC,\n\t4017: 0x73BD,\n\t4018: 0x73BF,\n\t4019: 0x73C5,\n\t4020: 0x73C6,\n\t4021: 0x73C9,\n\t4022: 0x73CB,\n\t4023: 0x73CC,\n\t4024: 0x73CF,\n\t4025: 0x73D2,\n\t4026: 0x73D3,\n\t4027: 0x73D6,\n\t4028: 0x73D9,\n\t4029: 0x73DD,\n\t4030: 0x73E1,\n\t4031: 0x73E3,\n\t4032: 0x73E6,\n\t4033: 0x73E7,\n\t4034: 0x73E9,\n\t4035: 0x73F4,\n\t4036: 0x73F5,\n\t4037: 0x73F7,\n\t4038: 0x73F9,\n\t4039: 0x73FA,\n\t4040: 0x73FB,\n\t4041: 0x73FD,\n\t4042: 0x73FF,\n\t4043: 0x7400,\n\t4044: 0x7401,\n\t4045: 0x7404,\n\t4046: 0x7407,\n\t4047: 0x740A,\n\t4048: 0x7411,\n\t4049: 0x741A,\n\t4050: 0x741B,\n\t4051: 0x7424,\n\t4052: 0x7426,\n\t4053: 0x7428,\n\t4054: 0x7429,\n\t4055: 0x742A,\n\t4056: 0x742B,\n\t4057: 0x742C,\n\t4058: 0x742D,\n\t4059: 0x742E,\n\t4060: 0x742F,\n\t4061: 0x7430,\n\t4062: 0x7431,\n\t4063: 0x7439,\n\t4064: 0x7440,\n\t4065: 0x7443,\n\t4066: 0x7444,\n\t4067: 0x7446,\n\t4068: 0x7447,\n\t4069: 0x744B,\n\t4070: 0x744D,\n\t4071: 0x7451,\n\t4072: 0x7452,\n\t4073: 0x7457,\n\t4074: 0x745D,\n\t4075: 0x7462,\n\t4076: 0x7466,\n\t4077: 0x7467,\n\t4078: 0x7468,\n\t4079: 0x746B,\n\t4080: 0x746D,\n\t4081: 0x746E,\n\t4082: 0x7471,\n\t4083: 0x7472,\n\t4084: 0x7480,\n\t4085: 0x7481,\n\t4086: 0x7485,\n\t4087: 0x7486,\n\t4088: 0x7487,\n\t4089: 0x7489,\n\t4090: 0x748F,\n\t4091: 0x7490,\n\t4092: 0x7491,\n\t4093: 0x7492,\n\t4094: 0x7498,\n\t4095: 0x7499,\n\t4096: 0x749A,\n\t4097: 0x749C,\n\t4098: 0x749F,\n\t4099: 0x74A0,\n\t4100: 0x74A1,\n\t4101: 0x74A3,\n\t4102: 0x74A6,\n\t4103: 0x74A8,\n\t4104: 0x74A9,\n\t4105: 0x74AA,\n\t4106: 0x74AB,\n\t4107: 0x74AE,\n\t4108: 0x74AF,\n\t4109: 0x74B1,\n\t4110: 0x74B2,\n\t4111: 0x74B5,\n\t4112: 0x74B9,\n\t4113: 0x74BB,\n\t4114: 0x74BF,\n\t4115: 0x74C8,\n\t4116: 0x74C9,\n\t4117: 0x74CC,\n\t4118: 0x74D0,\n\t4119: 0x74D3,\n\t4120: 0x74D8,\n\t4121: 0x74DA,\n\t4122: 0x74DB,\n\t4123: 0x74DE,\n\t4124: 0x74DF,\n\t4125: 0x74E4,\n\t4126: 0x74E8,\n\t4127: 0x74EA,\n\t4128: 0x74EB,\n\t4129: 0x74EF,\n\t4130: 0x74F4,\n\t4131: 0x74FA,\n\t4132: 0x74FB,\n\t4133: 0x74FC,\n\t4134: 0x74FF,\n\t4135: 0x7506,\n\t4136: 0x7512,\n\t4137: 0x7516,\n\t4138: 0x7517,\n\t4139: 0x7520,\n\t4140: 0x7521,\n\t4141: 0x7524,\n\t4142: 0x7527,\n\t4143: 0x7529,\n\t4144: 0x752A,\n\t4145: 0x752F,\n\t4146: 0x7536,\n\t4147: 0x7539,\n\t4148: 0x753D,\n\t4149: 0x753E,\n\t4150: 0x753F,\n\t4151: 0x7540,\n\t4152: 0x7543,\n\t4153: 0x7547,\n\t4154: 0x7548,\n\t4155: 0x754E,\n\t4156: 0x7550,\n\t4157: 0x7552,\n\t4158: 0x7557,\n\t4159: 0x755E,\n\t4160: 0x755F,\n\t4161: 0x7561,\n\t4162: 0x756F,\n\t4163: 0x7571,\n\t4164: 0x7579,\n\t4165: 0x757A,\n\t4166: 0x757B,\n\t4167: 0x757C,\n\t4168: 0x757D,\n\t4169: 0x757E,\n\t4170: 0x7581,\n\t4171: 0x7585,\n\t4172: 0x7590,\n\t4173: 0x7592,\n\t4174: 0x7593,\n\t4175: 0x7595,\n\t4176: 0x7599,\n\t4177: 0x759C,\n\t4178: 0x75A2,\n\t4179: 0x75A4,\n\t4180: 0x75B4,\n\t4181: 0x75BA,\n\t4182: 0x75BF,\n\t4183: 0x75C0,\n\t4184: 0x75C1,\n\t4185: 0x75C4,\n\t4186: 0x75C6,\n\t4187: 0x75CC,\n\t4188: 0x75CE,\n\t4189: 0x75CF,\n\t4190: 0x75D7,\n\t4191: 0x75DC,\n\t4192: 0x75DF,\n\t4193: 0x75E0,\n\t4194: 0x75E1,\n\t4195: 0x75E4,\n\t4196: 0x75E7,\n\t4197: 0x75EC,\n\t4198: 0x75EE,\n\t4199: 0x75EF,\n\t4200: 0x75F1,\n\t4201: 0x75F9,\n\t4202: 0x7600,\n\t4203: 0x7602,\n\t4204: 0x7603,\n\t4205: 0x7604,\n\t4206: 0x7607,\n\t4207: 0x7608,\n\t4208: 0x760A,\n\t4209: 0x760C,\n\t4210: 0x760F,\n\t4211: 0x7612,\n\t4212: 0x7613,\n\t4213: 0x7615,\n\t4214: 0x7616,\n\t4215: 0x7619,\n\t4216: 0x761B,\n\t4217: 0x761C,\n\t4218: 0x761D,\n\t4219: 0x761E,\n\t4220: 0x7623,\n\t4221: 0x7625,\n\t4222: 0x7626,\n\t4223: 0x7629,\n\t4224: 0x762D,\n\t4225: 0x7632,\n\t4226: 0x7633,\n\t4227: 0x7635,\n\t4228: 0x7638,\n\t4229: 0x7639,\n\t4230: 0x763A,\n\t4231: 0x763C,\n\t4232: 0x764A,\n\t4233: 0x7640,\n\t4234: 0x7641,\n\t4235: 0x7643,\n\t4236: 0x7644,\n\t4237: 0x7645,\n\t4238: 0x7649,\n\t4239: 0x764B,\n\t4240: 0x7655,\n\t4241: 0x7659,\n\t4242: 0x765F,\n\t4243: 0x7664,\n\t4244: 0x7665,\n\t4245: 0x766D,\n\t4246: 0x766E,\n\t4247: 0x766F,\n\t4248: 0x7671,\n\t4249: 0x7674,\n\t4250: 0x7681,\n\t4251: 0x7685,\n\t4252: 0x768C,\n\t4253: 0x768D,\n\t4254: 0x7695,\n\t4255: 0x769B,\n\t4256: 0x769C,\n\t4257: 0x769D,\n\t4258: 0x769F,\n\t4259: 0x76A0,\n\t4260: 0x76A2,\n\t4261: 0x76A3,\n\t4262: 0x76A4,\n\t4263: 0x76A5,\n\t4264: 0x76A6,\n\t4265: 0x76A7,\n\t4266: 0x76A8,\n\t4267: 0x76AA,\n\t4268: 0x76AD,\n\t4269: 0x76BD,\n\t4270: 0x76C1,\n\t4271: 0x76C5,\n\t4272: 0x76C9,\n\t4273: 0x76CB,\n\t4274: 0x76CC,\n\t4275: 0x76CE,\n\t4276: 0x76D4,\n\t4277: 0x76D9,\n\t4278: 0x76E0,\n\t4279: 0x76E6,\n\t4280: 0x76E8,\n\t4281: 0x76EC,\n\t4282: 0x76F0,\n\t4283: 0x76F1,\n\t4284: 0x76F6,\n\t4285: 0x76F9,\n\t4286: 0x76FC,\n\t4287: 0x7700,\n\t4288: 0x7706,\n\t4289: 0x770A,\n\t4290: 0x770E,\n\t4291: 0x7712,\n\t4292: 0x7714,\n\t4293: 0x7715,\n\t4294: 0x7717,\n\t4295: 0x7719,\n\t4296: 0x771A,\n\t4297: 0x771C,\n\t4298: 0x7722,\n\t4299: 0x7728,\n\t4300: 0x772D,\n\t4301: 0x772E,\n\t4302: 0x772F,\n\t4303: 0x7734,\n\t4304: 0x7735,\n\t4305: 0x7736,\n\t4306: 0x7739,\n\t4307: 0x773D,\n\t4308: 0x773E,\n\t4309: 0x7742,\n\t4310: 0x7745,\n\t4311: 0x7746,\n\t4312: 0x774A,\n\t4313: 0x774D,\n\t4314: 0x774E,\n\t4315: 0x774F,\n\t4316: 0x7752,\n\t4317: 0x7756,\n\t4318: 0x7757,\n\t4319: 0x775C,\n\t4320: 0x775E,\n\t4321: 0x775F,\n\t4322: 0x7760,\n\t4323: 0x7762,\n\t4324: 0x7764,\n\t4325: 0x7767,\n\t4326: 0x776A,\n\t4327: 0x776C,\n\t4328: 0x7770,\n\t4329: 0x7772,\n\t4330: 0x7773,\n\t4331: 0x7774,\n\t4332: 0x777A,\n\t4333: 0x777D,\n\t4334: 0x7780,\n\t4335: 0x7784,\n\t4336: 0x778C,\n\t4337: 0x778D,\n\t4338: 0x7794,\n\t4339: 0x7795,\n\t4340: 0x7796,\n\t4341: 0x779A,\n\t4342: 0x779F,\n\t4343: 0x77A2,\n\t4344: 0x77A7,\n\t4345: 0x77AA,\n\t4346: 0x77AE,\n\t4347: 0x77AF,\n\t4348: 0x77B1,\n\t4349: 0x77B5,\n\t4350: 0x77BE,\n\t4351: 0x77C3,\n\t4352: 0x77C9,\n\t4353: 0x77D1,\n\t4354: 0x77D2,\n\t4355: 0x77D5,\n\t4356: 0x77D9,\n\t4357: 0x77DE,\n\t4358: 0x77DF,\n\t4359: 0x77E0,\n\t4360: 0x77E4,\n\t4361: 0x77E6,\n\t4362: 0x77EA,\n\t4363: 0x77EC,\n\t4364: 0x77F0,\n\t4365: 0x77F1,\n\t4366: 0x77F4,\n\t4367: 0x77F8,\n\t4368: 0x77FB,\n\t4369: 0x7805,\n\t4370: 0x7806,\n\t4371: 0x7809,\n\t4372: 0x780D,\n\t4373: 0x780E,\n\t4374: 0x7811,\n\t4375: 0x781D,\n\t4376: 0x7821,\n\t4377: 0x7822,\n\t4378: 0x7823,\n\t4379: 0x782D,\n\t4380: 0x782E,\n\t4381: 0x7830,\n\t4382: 0x7835,\n\t4383: 0x7837,\n\t4384: 0x7843,\n\t4385: 0x7844,\n\t4386: 0x7847,\n\t4387: 0x7848,\n\t4388: 0x784C,\n\t4389: 0x784E,\n\t4390: 0x7852,\n\t4391: 0x785C,\n\t4392: 0x785E,\n\t4393: 0x7860,\n\t4394: 0x7861,\n\t4395: 0x7863,\n\t4396: 0x7864,\n\t4397: 0x7868,\n\t4398: 0x786A,\n\t4399: 0x786E,\n\t4400: 0x787A,\n\t4401: 0x787E,\n\t4402: 0x788A,\n\t4403: 0x788F,\n\t4404: 0x7894,\n\t4405: 0x7898,\n\t4406: 0x78A1,\n\t4407: 0x789D,\n\t4408: 0x789E,\n\t4409: 0x789F,\n\t4410: 0x78A4,\n\t4411: 0x78A8,\n\t4412: 0x78AC,\n\t4413: 0x78AD,\n\t4414: 0x78B0,\n\t4415: 0x78B1,\n\t4416: 0x78B2,\n\t4417: 0x78B3,\n\t4418: 0x78BB,\n\t4419: 0x78BD,\n\t4420: 0x78BF,\n\t4421: 0x78C7,\n\t4422: 0x78C8,\n\t4423: 0x78C9,\n\t4424: 0x78CC,\n\t4425: 0x78CE,\n\t4426: 0x78D2,\n\t4427: 0x78D3,\n\t4428: 0x78D5,\n\t4429: 0x78D6,\n\t4430: 0x78E4,\n\t4431: 0x78DB,\n\t4432: 0x78DF,\n\t4433: 0x78E0,\n\t4434: 0x78E1,\n\t4435: 0x78E6,\n\t4436: 0x78EA,\n\t4437: 0x78F2,\n\t4438: 0x78F3,\n\t4439: 0x7900,\n\t4440: 0x78F6,\n\t4441: 0x78F7,\n\t4442: 0x78FA,\n\t4443: 0x78FB,\n\t4444: 0x78FF,\n\t4445: 0x7906,\n\t4446: 0x790C,\n\t4447: 0x7910,\n\t4448: 0x791A,\n\t4449: 0x791C,\n\t4450: 0x791E,\n\t4451: 0x791F,\n\t4452: 0x7920,\n\t4453: 0x7925,\n\t4454: 0x7927,\n\t4455: 0x7929,\n\t4456: 0x792D,\n\t4457: 0x7931,\n\t4458: 0x7934,\n\t4459: 0x7935,\n\t4460: 0x793B,\n\t4461: 0x793D,\n\t4462: 0x793F,\n\t4463: 0x7944,\n\t4464: 0x7945,\n\t4465: 0x7946,\n\t4466: 0x794A,\n\t4467: 0x794B,\n\t4468: 0x794F,\n\t4469: 0x7951,\n\t4470: 0x7954,\n\t4471: 0x7958,\n\t4472: 0x795B,\n\t4473: 0x795C,\n\t4474: 0x7967,\n\t4475: 0x7969,\n\t4476: 0x796B,\n\t4477: 0x7972,\n\t4478: 0x7979,\n\t4479: 0x797B,\n\t4480: 0x797C,\n\t4481: 0x797E,\n\t4482: 0x798B,\n\t4483: 0x798C,\n\t4484: 0x7991,\n\t4485: 0x7993,\n\t4486: 0x7994,\n\t4487: 0x7995,\n\t4488: 0x7996,\n\t4489: 0x7998,\n\t4490: 0x799B,\n\t4491: 0x799C,\n\t4492: 0x79A1,\n\t4493: 0x79A8,\n\t4494: 0x79A9,\n\t4495: 0x79AB,\n\t4496: 0x79AF,\n\t4497: 0x79B1,\n\t4498: 0x79B4,\n\t4499: 0x79B8,\n\t4500: 0x79BB,\n\t4501: 0x79C2,\n\t4502: 0x79C4,\n\t4503: 0x79C7,\n\t4504: 0x79C8,\n\t4505: 0x79CA,\n\t4506: 0x79CF,\n\t4507: 0x79D4,\n\t4508: 0x79D6,\n\t4509: 0x79DA,\n\t4510: 0x79DD,\n\t4511: 0x79DE,\n\t4512: 0x79E0,\n\t4513: 0x79E2,\n\t4514: 0x79E5,\n\t4515: 0x79EA,\n\t4516: 0x79EB,\n\t4517: 0x79ED,\n\t4518: 0x79F1,\n\t4519: 0x79F8,\n\t4520: 0x79FC,\n\t4521: 0x7A02,\n\t4522: 0x7A03,\n\t4523: 0x7A07,\n\t4524: 0x7A09,\n\t4525: 0x7A0A,\n\t4526: 0x7A0C,\n\t4527: 0x7A11,\n\t4528: 0x7A15,\n\t4529: 0x7A1B,\n\t4530: 0x7A1E,\n\t4531: 0x7A21,\n\t4532: 0x7A27,\n\t4533: 0x7A2B,\n\t4534: 0x7A2D,\n\t4535: 0x7A2F,\n\t4536: 0x7A30,\n\t4537: 0x7A34,\n\t4538: 0x7A35,\n\t4539: 0x7A38,\n\t4540: 0x7A39,\n\t4541: 0x7A3A,\n\t4542: 0x7A44,\n\t4543: 0x7A45,\n\t4544: 0x7A47,\n\t4545: 0x7A48,\n\t4546: 0x7A4C,\n\t4547: 0x7A55,\n\t4548: 0x7A56,\n\t4549: 0x7A59,\n\t4550: 0x7A5C,\n\t4551: 0x7A5D,\n\t4552: 0x7A5F,\n\t4553: 0x7A60,\n\t4554: 0x7A65,\n\t4555: 0x7A67,\n\t4556: 0x7A6A,\n\t4557: 0x7A6D,\n\t4558: 0x7A75,\n\t4559: 0x7A78,\n\t4560: 0x7A7E,\n\t4561: 0x7A80,\n\t4562: 0x7A82,\n\t4563: 0x7A85,\n\t4564: 0x7A86,\n\t4565: 0x7A8A,\n\t4566: 0x7A8B,\n\t4567: 0x7A90,\n\t4568: 0x7A91,\n\t4569: 0x7A94,\n\t4570: 0x7A9E,\n\t4571: 0x7AA0,\n\t4572: 0x7AA3,\n\t4573: 0x7AAC,\n\t4574: 0x7AB3,\n\t4575: 0x7AB5,\n\t4576: 0x7AB9,\n\t4577: 0x7ABB,\n\t4578: 0x7ABC,\n\t4579: 0x7AC6,\n\t4580: 0x7AC9,\n\t4581: 0x7ACC,\n\t4582: 0x7ACE,\n\t4583: 0x7AD1,\n\t4584: 0x7ADB,\n\t4585: 0x7AE8,\n\t4586: 0x7AE9,\n\t4587: 0x7AEB,\n\t4588: 0x7AEC,\n\t4589: 0x7AF1,\n\t4590: 0x7AF4,\n\t4591: 0x7AFB,\n\t4592: 0x7AFD,\n\t4593: 0x7AFE,\n\t4594: 0x7B07,\n\t4595: 0x7B14,\n\t4596: 0x7B1F,\n\t4597: 0x7B23,\n\t4598: 0x7B27,\n\t4599: 0x7B29,\n\t4600: 0x7B2A,\n\t4601: 0x7B2B,\n\t4602: 0x7B2D,\n\t4603: 0x7B2E,\n\t4604: 0x7B2F,\n\t4605: 0x7B30,\n\t4606: 0x7B31,\n\t4607: 0x7B34,\n\t4608: 0x7B3D,\n\t4609: 0x7B3F,\n\t4610: 0x7B40,\n\t4611: 0x7B41,\n\t4612: 0x7B47,\n\t4613: 0x7B4E,\n\t4614: 0x7B55,\n\t4615: 0x7B60,\n\t4616: 0x7B64,\n\t4617: 0x7B66,\n\t4618: 0x7B69,\n\t4619: 0x7B6A,\n\t4620: 0x7B6D,\n\t4621: 0x7B6F,\n\t4622: 0x7B72,\n\t4623: 0x7B73,\n\t4624: 0x7B77,\n\t4625: 0x7B84,\n\t4626: 0x7B89,\n\t4627: 0x7B8E,\n\t4628: 0x7B90,\n\t4629: 0x7B91,\n\t4630: 0x7B96,\n\t4631: 0x7B9B,\n\t4632: 0x7B9E,\n\t4633: 0x7BA0,\n\t4634: 0x7BA5,\n\t4635: 0x7BAC,\n\t4636: 0x7BAF,\n\t4637: 0x7BB0,\n\t4638: 0x7BB2,\n\t4639: 0x7BB5,\n\t4640: 0x7BB6,\n\t4641: 0x7BBA,\n\t4642: 0x7BBB,\n\t4643: 0x7BBC,\n\t4644: 0x7BBD,\n\t4645: 0x7BC2,\n\t4646: 0x7BC5,\n\t4647: 0x7BC8,\n\t4648: 0x7BCA,\n\t4649: 0x7BD4,\n\t4650: 0x7BD6,\n\t4651: 0x7BD7,\n\t4652: 0x7BD9,\n\t4653: 0x7BDA,\n\t4654: 0x7BDB,\n\t4655: 0x7BE8,\n\t4656: 0x7BEA,\n\t4657: 0x7BF2,\n\t4658: 0x7BF4,\n\t4659: 0x7BF5,\n\t4660: 0x7BF8,\n\t4661: 0x7BF9,\n\t4662: 0x7BFA,\n\t4663: 0x7BFC,\n\t4664: 0x7BFE,\n\t4665: 0x7C01,\n\t4666: 0x7C02,\n\t4667: 0x7C03,\n\t4668: 0x7C04,\n\t4669: 0x7C06,\n\t4670: 0x7C09,\n\t4671: 0x7C0B,\n\t4672: 0x7C0C,\n\t4673: 0x7C0E,\n\t4674: 0x7C0F,\n\t4675: 0x7C19,\n\t4676: 0x7C1B,\n\t4677: 0x7C20,\n\t4678: 0x7C25,\n\t4679: 0x7C26,\n\t4680: 0x7C28,\n\t4681: 0x7C2C,\n\t4682: 0x7C31,\n\t4683: 0x7C33,\n\t4684: 0x7C34,\n\t4685: 0x7C36,\n\t4686: 0x7C39,\n\t4687: 0x7C3A,\n\t4688: 0x7C46,\n\t4689: 0x7C4A,\n\t4690: 0x7C55,\n\t4691: 0x7C51,\n\t4692: 0x7C52,\n\t4693: 0x7C53,\n\t4694: 0x7C59,\n\t4695: 0x7C5A,\n\t4696: 0x7C5B,\n\t4697: 0x7C5C,\n\t4698: 0x7C5D,\n\t4699: 0x7C5E,\n\t4700: 0x7C61,\n\t4701: 0x7C63,\n\t4702: 0x7C67,\n\t4703: 0x7C69,\n\t4704: 0x7C6D,\n\t4705: 0x7C6E,\n\t4706: 0x7C70,\n\t4707: 0x7C72,\n\t4708: 0x7C79,\n\t4709: 0x7C7C,\n\t4710: 0x7C7D,\n\t4711: 0x7C86,\n\t4712: 0x7C87,\n\t4713: 0x7C8F,\n\t4714: 0x7C94,\n\t4715: 0x7C9E,\n\t4716: 0x7CA0,\n\t4717: 0x7CA6,\n\t4718: 0x7CB0,\n\t4719: 0x7CB6,\n\t4720: 0x7CB7,\n\t4721: 0x7CBA,\n\t4722: 0x7CBB,\n\t4723: 0x7CBC,\n\t4724: 0x7CBF,\n\t4725: 0x7CC4,\n\t4726: 0x7CC7,\n\t4727: 0x7CC8,\n\t4728: 0x7CC9,\n\t4729: 0x7CCD,\n\t4730: 0x7CCF,\n\t4731: 0x7CD3,\n\t4732: 0x7CD4,\n\t4733: 0x7CD5,\n\t4734: 0x7CD7,\n\t4735: 0x7CD9,\n\t4736: 0x7CDA,\n\t4737: 0x7CDD,\n\t4738: 0x7CE6,\n\t4739: 0x7CE9,\n\t4740: 0x7CEB,\n\t4741: 0x7CF5,\n\t4742: 0x7D03,\n\t4743: 0x7D07,\n\t4744: 0x7D08,\n\t4745: 0x7D09,\n\t4746: 0x7D0F,\n\t4747: 0x7D11,\n\t4748: 0x7D12,\n\t4749: 0x7D13,\n\t4750: 0x7D16,\n\t4751: 0x7D1D,\n\t4752: 0x7D1E,\n\t4753: 0x7D23,\n\t4754: 0x7D26,\n\t4755: 0x7D2A,\n\t4756: 0x7D2D,\n\t4757: 0x7D31,\n\t4758: 0x7D3C,\n\t4759: 0x7D3D,\n\t4760: 0x7D3E,\n\t4761: 0x7D40,\n\t4762: 0x7D41,\n\t4763: 0x7D47,\n\t4764: 0x7D48,\n\t4765: 0x7D4D,\n\t4766: 0x7D51,\n\t4767: 0x7D53,\n\t4768: 0x7D57,\n\t4769: 0x7D59,\n\t4770: 0x7D5A,\n\t4771: 0x7D5C,\n\t4772: 0x7D5D,\n\t4773: 0x7D65,\n\t4774: 0x7D67,\n\t4775: 0x7D6A,\n\t4776: 0x7D70,\n\t4777: 0x7D78,\n\t4778: 0x7D7A,\n\t4779: 0x7D7B,\n\t4780: 0x7D7F,\n\t4781: 0x7D81,\n\t4782: 0x7D82,\n\t4783: 0x7D83,\n\t4784: 0x7D85,\n\t4785: 0x7D86,\n\t4786: 0x7D88,\n\t4787: 0x7D8B,\n\t4788: 0x7D8C,\n\t4789: 0x7D8D,\n\t4790: 0x7D91,\n\t4791: 0x7D96,\n\t4792: 0x7D97,\n\t4793: 0x7D9D,\n\t4794: 0x7D9E,\n\t4795: 0x7DA6,\n\t4796: 0x7DA7,\n\t4797: 0x7DAA,\n\t4798: 0x7DB3,\n\t4799: 0x7DB6,\n\t4800: 0x7DB7,\n\t4801: 0x7DB9,\n\t4802: 0x7DC2,\n\t4803: 0x7DC3,\n\t4804: 0x7DC4,\n\t4805: 0x7DC5,\n\t4806: 0x7DC6,\n\t4807: 0x7DCC,\n\t4808: 0x7DCD,\n\t4809: 0x7DCE,\n\t4810: 0x7DD7,\n\t4811: 0x7DD9,\n\t4812: 0x7E00,\n\t4813: 0x7DE2,\n\t4814: 0x7DE5,\n\t4815: 0x7DE6,\n\t4816: 0x7DEA,\n\t4817: 0x7DEB,\n\t4818: 0x7DED,\n\t4819: 0x7DF1,\n\t4820: 0x7DF5,\n\t4821: 0x7DF6,\n\t4822: 0x7DF9,\n\t4823: 0x7DFA,\n\t4824: 0x7E08,\n\t4825: 0x7E10,\n\t4826: 0x7E11,\n\t4827: 0x7E15,\n\t4828: 0x7E17,\n\t4829: 0x7E1C,\n\t4830: 0x7E1D,\n\t4831: 0x7E20,\n\t4832: 0x7E27,\n\t4833: 0x7E28,\n\t4834: 0x7E2C,\n\t4835: 0x7E2D,\n\t4836: 0x7E2F,\n\t4837: 0x7E33,\n\t4838: 0x7E36,\n\t4839: 0x7E3F,\n\t4840: 0x7E44,\n\t4841: 0x7E45,\n\t4842: 0x7E47,\n\t4843: 0x7E4E,\n\t4844: 0x7E50,\n\t4845: 0x7E52,\n\t4846: 0x7E58,\n\t4847: 0x7E5F,\n\t4848: 0x7E61,\n\t4849: 0x7E62,\n\t4850: 0x7E65,\n\t4851: 0x7E6B,\n\t4852: 0x7E6E,\n\t4853: 0x7E6F,\n\t4854: 0x7E73,\n\t4855: 0x7E78,\n\t4856: 0x7E7E,\n\t4857: 0x7E81,\n\t4858: 0x7E86,\n\t4859: 0x7E87,\n\t4860: 0x7E8A,\n\t4861: 0x7E8D,\n\t4862: 0x7E91,\n\t4863: 0x7E95,\n\t4864: 0x7E98,\n\t4865: 0x7E9A,\n\t4866: 0x7E9D,\n\t4867: 0x7E9E,\n\t4868: 0x7F3C,\n\t4869: 0x7F3B,\n\t4870: 0x7F3D,\n\t4871: 0x7F3E,\n\t4872: 0x7F3F,\n\t4873: 0x7F43,\n\t4874: 0x7F44,\n\t4875: 0x7F47,\n\t4876: 0x7F4F,\n\t4877: 0x7F52,\n\t4878: 0x7F53,\n\t4879: 0x7F5B,\n\t4880: 0x7F5C,\n\t4881: 0x7F5D,\n\t4882: 0x7F61,\n\t4883: 0x7F63,\n\t4884: 0x7F64,\n\t4885: 0x7F65,\n\t4886: 0x7F66,\n\t4887: 0x7F6D,\n\t4888: 0x7F71,\n\t4889: 0x7F7D,\n\t4890: 0x7F7E,\n\t4891: 0x7F7F,\n\t4892: 0x7F80,\n\t4893: 0x7F8B,\n\t4894: 0x7F8D,\n\t4895: 0x7F8F,\n\t4896: 0x7F90,\n\t4897: 0x7F91,\n\t4898: 0x7F96,\n\t4899: 0x7F97,\n\t4900: 0x7F9C,\n\t4901: 0x7FA1,\n\t4902: 0x7FA2,\n\t4903: 0x7FA6,\n\t4904: 0x7FAA,\n\t4905: 0x7FAD,\n\t4906: 0x7FB4,\n\t4907: 0x7FBC,\n\t4908: 0x7FBF,\n\t4909: 0x7FC0,\n\t4910: 0x7FC3,\n\t4911: 0x7FC8,\n\t4912: 0x7FCE,\n\t4913: 0x7FCF,\n\t4914: 0x7FDB,\n\t4915: 0x7FDF,\n\t4916: 0x7FE3,\n\t4917: 0x7FE5,\n\t4918: 0x7FE8,\n\t4919: 0x7FEC,\n\t4920: 0x7FEE,\n\t4921: 0x7FEF,\n\t4922: 0x7FF2,\n\t4923: 0x7FFA,\n\t4924: 0x7FFD,\n\t4925: 0x7FFE,\n\t4926: 0x7FFF,\n\t4927: 0x8007,\n\t4928: 0x8008,\n\t4929: 0x800A,\n\t4930: 0x800D,\n\t4931: 0x800E,\n\t4932: 0x800F,\n\t4933: 0x8011,\n\t4934: 0x8013,\n\t4935: 0x8014,\n\t4936: 0x8016,\n\t4937: 0x801D,\n\t4938: 0x801E,\n\t4939: 0x801F,\n\t4940: 0x8020,\n\t4941: 0x8024,\n\t4942: 0x8026,\n\t4943: 0x802C,\n\t4944: 0x802E,\n\t4945: 0x8030,\n\t4946: 0x8034,\n\t4947: 0x8035,\n\t4948: 0x8037,\n\t4949: 0x8039,\n\t4950: 0x803A,\n\t4951: 0x803C,\n\t4952: 0x803E,\n\t4953: 0x8040,\n\t4954: 0x8044,\n\t4955: 0x8060,\n\t4956: 0x8064,\n\t4957: 0x8066,\n\t4958: 0x806D,\n\t4959: 0x8071,\n\t4960: 0x8075,\n\t4961: 0x8081,\n\t4962: 0x8088,\n\t4963: 0x808E,\n\t4964: 0x809C,\n\t4965: 0x809E,\n\t4966: 0x80A6,\n\t4967: 0x80A7,\n\t4968: 0x80AB,\n\t4969: 0x80B8,\n\t4970: 0x80B9,\n\t4971: 0x80C8,\n\t4972: 0x80CD,\n\t4973: 0x80CF,\n\t4974: 0x80D2,\n\t4975: 0x80D4,\n\t4976: 0x80D5,\n\t4977: 0x80D7,\n\t4978: 0x80D8,\n\t4979: 0x80E0,\n\t4980: 0x80ED,\n\t4981: 0x80EE,\n\t4982: 0x80F0,\n\t4983: 0x80F2,\n\t4984: 0x80F3,\n\t4985: 0x80F6,\n\t4986: 0x80F9,\n\t4987: 0x80FA,\n\t4988: 0x80FE,\n\t4989: 0x8103,\n\t4990: 0x810B,\n\t4991: 0x8116,\n\t4992: 0x8117,\n\t4993: 0x8118,\n\t4994: 0x811C,\n\t4995: 0x811E,\n\t4996: 0x8120,\n\t4997: 0x8124,\n\t4998: 0x8127,\n\t4999: 0x812C,\n\t5000: 0x8130,\n\t5001: 0x8135,\n\t5002: 0x813A,\n\t5003: 0x813C,\n\t5004: 0x8145,\n\t5005: 0x8147,\n\t5006: 0x814A,\n\t5007: 0x814C,\n\t5008: 0x8152,\n\t5009: 0x8157,\n\t5010: 0x8160,\n\t5011: 0x8161,\n\t5012: 0x8167,\n\t5013: 0x8168,\n\t5014: 0x8169,\n\t5015: 0x816D,\n\t5016: 0x816F,\n\t5017: 0x8177,\n\t5018: 0x8181,\n\t5019: 0x8190,\n\t5020: 0x8184,\n\t5021: 0x8185,\n\t5022: 0x8186,\n\t5023: 0x818B,\n\t5024: 0x818E,\n\t5025: 0x8196,\n\t5026: 0x8198,\n\t5027: 0x819B,\n\t5028: 0x819E,\n\t5029: 0x81A2,\n\t5030: 0x81AE,\n\t5031: 0x81B2,\n\t5032: 0x81B4,\n\t5033: 0x81BB,\n\t5034: 0x81CB,\n\t5035: 0x81C3,\n\t5036: 0x81C5,\n\t5037: 0x81CA,\n\t5038: 0x81CE,\n\t5039: 0x81CF,\n\t5040: 0x81D5,\n\t5041: 0x81D7,\n\t5042: 0x81DB,\n\t5043: 0x81DD,\n\t5044: 0x81DE,\n\t5045: 0x81E1,\n\t5046: 0x81E4,\n\t5047: 0x81EB,\n\t5048: 0x81EC,\n\t5049: 0x81F0,\n\t5050: 0x81F1,\n\t5051: 0x81F2,\n\t5052: 0x81F5,\n\t5053: 0x81F6,\n\t5054: 0x81F8,\n\t5055: 0x81F9,\n\t5056: 0x81FD,\n\t5057: 0x81FF,\n\t5058: 0x8200,\n\t5059: 0x8203,\n\t5060: 0x820F,\n\t5061: 0x8213,\n\t5062: 0x8214,\n\t5063: 0x8219,\n\t5064: 0x821A,\n\t5065: 0x821D,\n\t5066: 0x8221,\n\t5067: 0x8222,\n\t5068: 0x8228,\n\t5069: 0x8232,\n\t5070: 0x8234,\n\t5071: 0x823A,\n\t5072: 0x8243,\n\t5073: 0x8244,\n\t5074: 0x8245,\n\t5075: 0x8246,\n\t5076: 0x824B,\n\t5077: 0x824E,\n\t5078: 0x824F,\n\t5079: 0x8251,\n\t5080: 0x8256,\n\t5081: 0x825C,\n\t5082: 0x8260,\n\t5083: 0x8263,\n\t5084: 0x8267,\n\t5085: 0x826D,\n\t5086: 0x8274,\n\t5087: 0x827B,\n\t5088: 0x827D,\n\t5089: 0x827F,\n\t5090: 0x8280,\n\t5091: 0x8281,\n\t5092: 0x8283,\n\t5093: 0x8284,\n\t5094: 0x8287,\n\t5095: 0x8289,\n\t5096: 0x828A,\n\t5097: 0x828E,\n\t5098: 0x8291,\n\t5099: 0x8294,\n\t5100: 0x8296,\n\t5101: 0x8298,\n\t5102: 0x829A,\n\t5103: 0x829B,\n\t5104: 0x82A0,\n\t5105: 0x82A1,\n\t5106: 0x82A3,\n\t5107: 0x82A4,\n\t5108: 0x82A7,\n\t5109: 0x82A8,\n\t5110: 0x82A9,\n\t5111: 0x82AA,\n\t5112: 0x82AE,\n\t5113: 0x82B0,\n\t5114: 0x82B2,\n\t5115: 0x82B4,\n\t5116: 0x82B7,\n\t5117: 0x82BA,\n\t5118: 0x82BC,\n\t5119: 0x82BE,\n\t5120: 0x82BF,\n\t5121: 0x82C6,\n\t5122: 0x82D0,\n\t5123: 0x82D5,\n\t5124: 0x82DA,\n\t5125: 0x82E0,\n\t5126: 0x82E2,\n\t5127: 0x82E4,\n\t5128: 0x82E8,\n\t5129: 0x82EA,\n\t5130: 0x82ED,\n\t5131: 0x82EF,\n\t5132: 0x82F6,\n\t5133: 0x82F7,\n\t5134: 0x82FD,\n\t5135: 0x82FE,\n\t5136: 0x8300,\n\t5137: 0x8301,\n\t5138: 0x8307,\n\t5139: 0x8308,\n\t5140: 0x830A,\n\t5141: 0x830B,\n\t5142: 0x8354,\n\t5143: 0x831B,\n\t5144: 0x831D,\n\t5145: 0x831E,\n\t5146: 0x831F,\n\t5147: 0x8321,\n\t5148: 0x8322,\n\t5149: 0x832C,\n\t5150: 0x832D,\n\t5151: 0x832E,\n\t5152: 0x8330,\n\t5153: 0x8333,\n\t5154: 0x8337,\n\t5155: 0x833A,\n\t5156: 0x833C,\n\t5157: 0x833D,\n\t5158: 0x8342,\n\t5159: 0x8343,\n\t5160: 0x8344,\n\t5161: 0x8347,\n\t5162: 0x834D,\n\t5163: 0x834E,\n\t5164: 0x8351,\n\t5165: 0x8355,\n\t5166: 0x8356,\n\t5167: 0x8357,\n\t5168: 0x8370,\n\t5169: 0x8378,\n\t5170: 0x837D,\n\t5171: 0x837F,\n\t5172: 0x8380,\n\t5173: 0x8382,\n\t5174: 0x8384,\n\t5175: 0x8386,\n\t5176: 0x838D,\n\t5177: 0x8392,\n\t5178: 0x8394,\n\t5179: 0x8395,\n\t5180: 0x8398,\n\t5181: 0x8399,\n\t5182: 0x839B,\n\t5183: 0x839C,\n\t5184: 0x839D,\n\t5185: 0x83A6,\n\t5186: 0x83A7,\n\t5187: 0x83A9,\n\t5188: 0x83AC,\n\t5189: 0x83BE,\n\t5190: 0x83BF,\n\t5191: 0x83C0,\n\t5192: 0x83C7,\n\t5193: 0x83C9,\n\t5194: 0x83CF,\n\t5195: 0x83D0,\n\t5196: 0x83D1,\n\t5197: 0x83D4,\n\t5198: 0x83DD,\n\t5199: 0x8353,\n\t5200: 0x83E8,\n\t5201: 0x83EA,\n\t5202: 0x83F6,\n\t5203: 0x83F8,\n\t5204: 0x83F9,\n\t5205: 0x83FC,\n\t5206: 0x8401,\n\t5207: 0x8406,\n\t5208: 0x840A,\n\t5209: 0x840F,\n\t5210: 0x8411,\n\t5211: 0x8415,\n\t5212: 0x8419,\n\t5213: 0x83AD,\n\t5214: 0x842F,\n\t5215: 0x8439,\n\t5216: 0x8445,\n\t5217: 0x8447,\n\t5218: 0x8448,\n\t5219: 0x844A,\n\t5220: 0x844D,\n\t5221: 0x844F,\n\t5222: 0x8451,\n\t5223: 0x8452,\n\t5224: 0x8456,\n\t5225: 0x8458,\n\t5226: 0x8459,\n\t5227: 0x845A,\n\t5228: 0x845C,\n\t5229: 0x8460,\n\t5230: 0x8464,\n\t5231: 0x8465,\n\t5232: 0x8467,\n\t5233: 0x846A,\n\t5234: 0x8470,\n\t5235: 0x8473,\n\t5236: 0x8474,\n\t5237: 0x8476,\n\t5238: 0x8478,\n\t5239: 0x847C,\n\t5240: 0x847D,\n\t5241: 0x8481,\n\t5242: 0x8485,\n\t5243: 0x8492,\n\t5244: 0x8493,\n\t5245: 0x8495,\n\t5246: 0x849E,\n\t5247: 0x84A6,\n\t5248: 0x84A8,\n\t5249: 0x84A9,\n\t5250: 0x84AA,\n\t5251: 0x84AF,\n\t5252: 0x84B1,\n\t5253: 0x84B4,\n\t5254: 0x84BA,\n\t5255: 0x84BD,\n\t5256: 0x84BE,\n\t5257: 0x84C0,\n\t5258: 0x84C2,\n\t5259: 0x84C7,\n\t5260: 0x84C8,\n\t5261: 0x84CC,\n\t5262: 0x84CF,\n\t5263: 0x84D3,\n\t5264: 0x84DC,\n\t5265: 0x84E7,\n\t5266: 0x84EA,\n\t5267: 0x84EF,\n\t5268: 0x84F0,\n\t5269: 0x84F1,\n\t5270: 0x84F2,\n\t5271: 0x84F7,\n\t5272: 0x8532,\n\t5273: 0x84FA,\n\t5274: 0x84FB,\n\t5275: 0x84FD,\n\t5276: 0x8502,\n\t5277: 0x8503,\n\t5278: 0x8507,\n\t5279: 0x850C,\n\t5280: 0x850E,\n\t5281: 0x8510,\n\t5282: 0x851C,\n\t5283: 0x851E,\n\t5284: 0x8522,\n\t5285: 0x8523,\n\t5286: 0x8524,\n\t5287: 0x8525,\n\t5288: 0x8527,\n\t5289: 0x852A,\n\t5290: 0x852B,\n\t5291: 0x852F,\n\t5292: 0x8533,\n\t5293: 0x8534,\n\t5294: 0x8536,\n\t5295: 0x853F,\n\t5296: 0x8546,\n\t5297: 0x854F,\n\t5298: 0x8550,\n\t5299: 0x8551,\n\t5300: 0x8552,\n\t5301: 0x8553,\n\t5302: 0x8556,\n\t5303: 0x8559,\n\t5304: 0x855C,\n\t5305: 0x855D,\n\t5306: 0x855E,\n\t5307: 0x855F,\n\t5308: 0x8560,\n\t5309: 0x8561,\n\t5310: 0x8562,\n\t5311: 0x8564,\n\t5312: 0x856B,\n\t5313: 0x856F,\n\t5314: 0x8579,\n\t5315: 0x857A,\n\t5316: 0x857B,\n\t5317: 0x857D,\n\t5318: 0x857F,\n\t5319: 0x8581,\n\t5320: 0x8585,\n\t5321: 0x8586,\n\t5322: 0x8589,\n\t5323: 0x858B,\n\t5324: 0x858C,\n\t5325: 0x858F,\n\t5326: 0x8593,\n\t5327: 0x8598,\n\t5328: 0x859D,\n\t5329: 0x859F,\n\t5330: 0x85A0,\n\t5331: 0x85A2,\n\t5332: 0x85A5,\n\t5333: 0x85A7,\n\t5334: 0x85B4,\n\t5335: 0x85B6,\n\t5336: 0x85B7,\n\t5337: 0x85B8,\n\t5338: 0x85BC,\n\t5339: 0x85BD,\n\t5340: 0x85BE,\n\t5341: 0x85BF,\n\t5342: 0x85C2,\n\t5343: 0x85C7,\n\t5344: 0x85CA,\n\t5345: 0x85CB,\n\t5346: 0x85CE,\n\t5347: 0x85AD,\n\t5348: 0x85D8,\n\t5349: 0x85DA,\n\t5350: 0x85DF,\n\t5351: 0x85E0,\n\t5352: 0x85E6,\n\t5353: 0x85E8,\n\t5354: 0x85ED,\n\t5355: 0x85F3,\n\t5356: 0x85F6,\n\t5357: 0x85FC,\n\t5358: 0x85FF,\n\t5359: 0x8600,\n\t5360: 0x8604,\n\t5361: 0x8605,\n\t5362: 0x860D,\n\t5363: 0x860E,\n\t5364: 0x8610,\n\t5365: 0x8611,\n\t5366: 0x8612,\n\t5367: 0x8618,\n\t5368: 0x8619,\n\t5369: 0x861B,\n\t5370: 0x861E,\n\t5371: 0x8621,\n\t5372: 0x8627,\n\t5373: 0x8629,\n\t5374: 0x8636,\n\t5375: 0x8638,\n\t5376: 0x863A,\n\t5377: 0x863C,\n\t5378: 0x863D,\n\t5379: 0x8640,\n\t5380: 0x8642,\n\t5381: 0x8646,\n\t5382: 0x8652,\n\t5383: 0x8653,\n\t5384: 0x8656,\n\t5385: 0x8657,\n\t5386: 0x8658,\n\t5387: 0x8659,\n\t5388: 0x865D,\n\t5389: 0x8660,\n\t5390: 0x8661,\n\t5391: 0x8662,\n\t5392: 0x8663,\n\t5393: 0x8664,\n\t5394: 0x8669,\n\t5395: 0x866C,\n\t5396: 0x866F,\n\t5397: 0x8675,\n\t5398: 0x8676,\n\t5399: 0x8677,\n\t5400: 0x867A,\n\t5401: 0x868D,\n\t5402: 0x8691,\n\t5403: 0x8696,\n\t5404: 0x8698,\n\t5405: 0x869A,\n\t5406: 0x869C,\n\t5407: 0x86A1,\n\t5408: 0x86A6,\n\t5409: 0x86A7,\n\t5410: 0x86A8,\n\t5411: 0x86AD,\n\t5412: 0x86B1,\n\t5413: 0x86B3,\n\t5414: 0x86B4,\n\t5415: 0x86B5,\n\t5416: 0x86B7,\n\t5417: 0x86B8,\n\t5418: 0x86B9,\n\t5419: 0x86BF,\n\t5420: 0x86C0,\n\t5421: 0x86C1,\n\t5422: 0x86C3,\n\t5423: 0x86C5,\n\t5424: 0x86D1,\n\t5425: 0x86D2,\n\t5426: 0x86D5,\n\t5427: 0x86D7,\n\t5428: 0x86DA,\n\t5429: 0x86DC,\n\t5430: 0x86E0,\n\t5431: 0x86E3,\n\t5432: 0x86E5,\n\t5433: 0x86E7,\n\t5434: 0x8688,\n\t5435: 0x86FA,\n\t5436: 0x86FC,\n\t5437: 0x86FD,\n\t5438: 0x8704,\n\t5439: 0x8705,\n\t5440: 0x8707,\n\t5441: 0x870B,\n\t5442: 0x870E,\n\t5443: 0x870F,\n\t5444: 0x8710,\n\t5445: 0x8713,\n\t5446: 0x8714,\n\t5447: 0x8719,\n\t5448: 0x871E,\n\t5449: 0x871F,\n\t5450: 0x8721,\n\t5451: 0x8723,\n\t5452: 0x8728,\n\t5453: 0x872E,\n\t5454: 0x872F,\n\t5455: 0x8731,\n\t5456: 0x8732,\n\t5457: 0x8739,\n\t5458: 0x873A,\n\t5459: 0x873C,\n\t5460: 0x873D,\n\t5461: 0x873E,\n\t5462: 0x8740,\n\t5463: 0x8743,\n\t5464: 0x8745,\n\t5465: 0x874D,\n\t5466: 0x8758,\n\t5467: 0x875D,\n\t5468: 0x8761,\n\t5469: 0x8764,\n\t5470: 0x8765,\n\t5471: 0x876F,\n\t5472: 0x8771,\n\t5473: 0x8772,\n\t5474: 0x877B,\n\t5475: 0x8783,\n\t5476: 0x8784,\n\t5477: 0x8785,\n\t5478: 0x8786,\n\t5479: 0x8787,\n\t5480: 0x8788,\n\t5481: 0x8789,\n\t5482: 0x878B,\n\t5483: 0x878C,\n\t5484: 0x8790,\n\t5485: 0x8793,\n\t5486: 0x8795,\n\t5487: 0x8797,\n\t5488: 0x8798,\n\t5489: 0x8799,\n\t5490: 0x879E,\n\t5491: 0x87A0,\n\t5492: 0x87A3,\n\t5493: 0x87A7,\n\t5494: 0x87AC,\n\t5495: 0x87AD,\n\t5496: 0x87AE,\n\t5497: 0x87B1,\n\t5498: 0x87B5,\n\t5499: 0x87BE,\n\t5500: 0x87BF,\n\t5501: 0x87C1,\n\t5502: 0x87C8,\n\t5503: 0x87C9,\n\t5504: 0x87CA,\n\t5505: 0x87CE,\n\t5506: 0x87D5,\n\t5507: 0x87D6,\n\t5508: 0x87D9,\n\t5509: 0x87DA,\n\t5510: 0x87DC,\n\t5511: 0x87DF,\n\t5512: 0x87E2,\n\t5513: 0x87E3,\n\t5514: 0x87E4,\n\t5515: 0x87EA,\n\t5516: 0x87EB,\n\t5517: 0x87ED,\n\t5518: 0x87F1,\n\t5519: 0x87F3,\n\t5520: 0x87F8,\n\t5521: 0x87FA,\n\t5522: 0x87FF,\n\t5523: 0x8801,\n\t5524: 0x8803,\n\t5525: 0x8806,\n\t5526: 0x8809,\n\t5527: 0x880A,\n\t5528: 0x880B,\n\t5529: 0x8810,\n\t5530: 0x8819,\n\t5531: 0x8812,\n\t5532: 0x8813,\n\t5533: 0x8814,\n\t5534: 0x8818,\n\t5535: 0x881A,\n\t5536: 0x881B,\n\t5537: 0x881C,\n\t5538: 0x881E,\n\t5539: 0x881F,\n\t5540: 0x8828,\n\t5541: 0x882D,\n\t5542: 0x882E,\n\t5543: 0x8830,\n\t5544: 0x8832,\n\t5545: 0x8835,\n\t5546: 0x883A,\n\t5547: 0x883C,\n\t5548: 0x8841,\n\t5549: 0x8843,\n\t5550: 0x8845,\n\t5551: 0x8848,\n\t5552: 0x8849,\n\t5553: 0x884A,\n\t5554: 0x884B,\n\t5555: 0x884E,\n\t5556: 0x8851,\n\t5557: 0x8855,\n\t5558: 0x8856,\n\t5559: 0x8858,\n\t5560: 0x885A,\n\t5561: 0x885C,\n\t5562: 0x885F,\n\t5563: 0x8860,\n\t5564: 0x8864,\n\t5565: 0x8869,\n\t5566: 0x8871,\n\t5567: 0x8879,\n\t5568: 0x887B,\n\t5569: 0x8880,\n\t5570: 0x8898,\n\t5571: 0x889A,\n\t5572: 0x889B,\n\t5573: 0x889C,\n\t5574: 0x889F,\n\t5575: 0x88A0,\n\t5576: 0x88A8,\n\t5577: 0x88AA,\n\t5578: 0x88BA,\n\t5579: 0x88BD,\n\t5580: 0x88BE,\n\t5581: 0x88C0,\n\t5582: 0x88CA,\n\t5583: 0x88CB,\n\t5584: 0x88CC,\n\t5585: 0x88CD,\n\t5586: 0x88CE,\n\t5587: 0x88D1,\n\t5588: 0x88D2,\n\t5589: 0x88D3,\n\t5590: 0x88DB,\n\t5591: 0x88DE,\n\t5592: 0x88E7,\n\t5593: 0x88EF,\n\t5594: 0x88F0,\n\t5595: 0x88F1,\n\t5596: 0x88F5,\n\t5597: 0x88F7,\n\t5598: 0x8901,\n\t5599: 0x8906,\n\t5600: 0x890D,\n\t5601: 0x890E,\n\t5602: 0x890F,\n\t5603: 0x8915,\n\t5604: 0x8916,\n\t5605: 0x8918,\n\t5606: 0x8919,\n\t5607: 0x891A,\n\t5608: 0x891C,\n\t5609: 0x8920,\n\t5610: 0x8926,\n\t5611: 0x8927,\n\t5612: 0x8928,\n\t5613: 0x8930,\n\t5614: 0x8931,\n\t5615: 0x8932,\n\t5616: 0x8935,\n\t5617: 0x8939,\n\t5618: 0x893A,\n\t5619: 0x893E,\n\t5620: 0x8940,\n\t5621: 0x8942,\n\t5622: 0x8945,\n\t5623: 0x8946,\n\t5624: 0x8949,\n\t5625: 0x894F,\n\t5626: 0x8952,\n\t5627: 0x8957,\n\t5628: 0x895A,\n\t5629: 0x895B,\n\t5630: 0x895C,\n\t5631: 0x8961,\n\t5632: 0x8962,\n\t5633: 0x8963,\n\t5634: 0x896B,\n\t5635: 0x896E,\n\t5636: 0x8970,\n\t5637: 0x8973,\n\t5638: 0x8975,\n\t5639: 0x897A,\n\t5640: 0x897B,\n\t5641: 0x897C,\n\t5642: 0x897D,\n\t5643: 0x8989,\n\t5644: 0x898D,\n\t5645: 0x8990,\n\t5646: 0x8994,\n\t5647: 0x8995,\n\t5648: 0x899B,\n\t5649: 0x899C,\n\t5650: 0x899F,\n\t5651: 0x89A0,\n\t5652: 0x89A5,\n\t5653: 0x89B0,\n\t5654: 0x89B4,\n\t5655: 0x89B5,\n\t5656: 0x89B6,\n\t5657: 0x89B7,\n\t5658: 0x89BC,\n\t5659: 0x89D4,\n\t5660: 0x89D5,\n\t5661: 0x89D6,\n\t5662: 0x89D7,\n\t5663: 0x89D8,\n\t5664: 0x89E5,\n\t5665: 0x89E9,\n\t5666: 0x89EB,\n\t5667: 0x89ED,\n\t5668: 0x89F1,\n\t5669: 0x89F3,\n\t5670: 0x89F6,\n\t5671: 0x89F9,\n\t5672: 0x89FD,\n\t5673: 0x89FF,\n\t5674: 0x8A04,\n\t5675: 0x8A05,\n\t5676: 0x8A07,\n\t5677: 0x8A0F,\n\t5678: 0x8A11,\n\t5679: 0x8A12,\n\t5680: 0x8A14,\n\t5681: 0x8A15,\n\t5682: 0x8A1E,\n\t5683: 0x8A20,\n\t5684: 0x8A22,\n\t5685: 0x8A24,\n\t5686: 0x8A26,\n\t5687: 0x8A2B,\n\t5688: 0x8A2C,\n\t5689: 0x8A2F,\n\t5690: 0x8A35,\n\t5691: 0x8A37,\n\t5692: 0x8A3D,\n\t5693: 0x8A3E,\n\t5694: 0x8A40,\n\t5695: 0x8A43,\n\t5696: 0x8A45,\n\t5697: 0x8A47,\n\t5698: 0x8A49,\n\t5699: 0x8A4D,\n\t5700: 0x8A4E,\n\t5701: 0x8A53,\n\t5702: 0x8A56,\n\t5703: 0x8A57,\n\t5704: 0x8A58,\n\t5705: 0x8A5C,\n\t5706: 0x8A5D,\n\t5707: 0x8A61,\n\t5708: 0x8A65,\n\t5709: 0x8A67,\n\t5710: 0x8A75,\n\t5711: 0x8A76,\n\t5712: 0x8A77,\n\t5713: 0x8A79,\n\t5714: 0x8A7A,\n\t5715: 0x8A7B,\n\t5716: 0x8A7E,\n\t5717: 0x8A7F,\n\t5718: 0x8A80,\n\t5719: 0x8A83,\n\t5720: 0x8A86,\n\t5721: 0x8A8B,\n\t5722: 0x8A8F,\n\t5723: 0x8A90,\n\t5724: 0x8A92,\n\t5725: 0x8A96,\n\t5726: 0x8A97,\n\t5727: 0x8A99,\n\t5728: 0x8A9F,\n\t5729: 0x8AA7,\n\t5730: 0x8AA9,\n\t5731: 0x8AAE,\n\t5732: 0x8AAF,\n\t5733: 0x8AB3,\n\t5734: 0x8AB6,\n\t5735: 0x8AB7,\n\t5736: 0x8ABB,\n\t5737: 0x8ABE,\n\t5738: 0x8AC3,\n\t5739: 0x8AC6,\n\t5740: 0x8AC8,\n\t5741: 0x8AC9,\n\t5742: 0x8ACA,\n\t5743: 0x8AD1,\n\t5744: 0x8AD3,\n\t5745: 0x8AD4,\n\t5746: 0x8AD5,\n\t5747: 0x8AD7,\n\t5748: 0x8ADD,\n\t5749: 0x8ADF,\n\t5750: 0x8AEC,\n\t5751: 0x8AF0,\n\t5752: 0x8AF4,\n\t5753: 0x8AF5,\n\t5754: 0x8AF6,\n\t5755: 0x8AFC,\n\t5756: 0x8AFF,\n\t5757: 0x8B05,\n\t5758: 0x8B06,\n\t5759: 0x8B0B,\n\t5760: 0x8B11,\n\t5761: 0x8B1C,\n\t5762: 0x8B1E,\n\t5763: 0x8B1F,\n\t5764: 0x8B0A,\n\t5765: 0x8B2D,\n\t5766: 0x8B30,\n\t5767: 0x8B37,\n\t5768: 0x8B3C,\n\t5769: 0x8B42,\n\t5770: 0x8B43,\n\t5771: 0x8B44,\n\t5772: 0x8B45,\n\t5773: 0x8B46,\n\t5774: 0x8B48,\n\t5775: 0x8B52,\n\t5776: 0x8B53,\n\t5777: 0x8B54,\n\t5778: 0x8B59,\n\t5779: 0x8B4D,\n\t5780: 0x8B5E,\n\t5781: 0x8B63,\n\t5782: 0x8B6D,\n\t5783: 0x8B76,\n\t5784: 0x8B78,\n\t5785: 0x8B79,\n\t5786: 0x8B7C,\n\t5787: 0x8B7E,\n\t5788: 0x8B81,\n\t5789: 0x8B84,\n\t5790: 0x8B85,\n\t5791: 0x8B8B,\n\t5792: 0x8B8D,\n\t5793: 0x8B8F,\n\t5794: 0x8B94,\n\t5795: 0x8B95,\n\t5796: 0x8B9C,\n\t5797: 0x8B9E,\n\t5798: 0x8B9F,\n\t5799: 0x8C38,\n\t5800: 0x8C39,\n\t5801: 0x8C3D,\n\t5802: 0x8C3E,\n\t5803: 0x8C45,\n\t5804: 0x8C47,\n\t5805: 0x8C49,\n\t5806: 0x8C4B,\n\t5807: 0x8C4F,\n\t5808: 0x8C51,\n\t5809: 0x8C53,\n\t5810: 0x8C54,\n\t5811: 0x8C57,\n\t5812: 0x8C58,\n\t5813: 0x8C5B,\n\t5814: 0x8C5D,\n\t5815: 0x8C59,\n\t5816: 0x8C63,\n\t5817: 0x8C64,\n\t5818: 0x8C66,\n\t5819: 0x8C68,\n\t5820: 0x8C69,\n\t5821: 0x8C6D,\n\t5822: 0x8C73,\n\t5823: 0x8C75,\n\t5824: 0x8C76,\n\t5825: 0x8C7B,\n\t5826: 0x8C7E,\n\t5827: 0x8C86,\n\t5828: 0x8C87,\n\t5829: 0x8C8B,\n\t5830: 0x8C90,\n\t5831: 0x8C92,\n\t5832: 0x8C93,\n\t5833: 0x8C99,\n\t5834: 0x8C9B,\n\t5835: 0x8C9C,\n\t5836: 0x8CA4,\n\t5837: 0x8CB9,\n\t5838: 0x8CBA,\n\t5839: 0x8CC5,\n\t5840: 0x8CC6,\n\t5841: 0x8CC9,\n\t5842: 0x8CCB,\n\t5843: 0x8CCF,\n\t5844: 0x8CD6,\n\t5845: 0x8CD5,\n\t5846: 0x8CD9,\n\t5847: 0x8CDD,\n\t5848: 0x8CE1,\n\t5849: 0x8CE8,\n\t5850: 0x8CEC,\n\t5851: 0x8CEF,\n\t5852: 0x8CF0,\n\t5853: 0x8CF2,\n\t5854: 0x8CF5,\n\t5855: 0x8CF7,\n\t5856: 0x8CF8,\n\t5857: 0x8CFE,\n\t5858: 0x8CFF,\n\t5859: 0x8D01,\n\t5860: 0x8D03,\n\t5861: 0x8D09,\n\t5862: 0x8D12,\n\t5863: 0x8D17,\n\t5864: 0x8D1B,\n\t5865: 0x8D65,\n\t5866: 0x8D69,\n\t5867: 0x8D6C,\n\t5868: 0x8D6E,\n\t5869: 0x8D7F,\n\t5870: 0x8D82,\n\t5871: 0x8D84,\n\t5872: 0x8D88,\n\t5873: 0x8D8D,\n\t5874: 0x8D90,\n\t5875: 0x8D91,\n\t5876: 0x8D95,\n\t5877: 0x8D9E,\n\t5878: 0x8D9F,\n\t5879: 0x8DA0,\n\t5880: 0x8DA6,\n\t5881: 0x8DAB,\n\t5882: 0x8DAC,\n\t5883: 0x8DAF,\n\t5884: 0x8DB2,\n\t5885: 0x8DB5,\n\t5886: 0x8DB7,\n\t5887: 0x8DB9,\n\t5888: 0x8DBB,\n\t5889: 0x8DC0,\n\t5890: 0x8DC5,\n\t5891: 0x8DC6,\n\t5892: 0x8DC7,\n\t5893: 0x8DC8,\n\t5894: 0x8DCA,\n\t5895: 0x8DCE,\n\t5896: 0x8DD1,\n\t5897: 0x8DD4,\n\t5898: 0x8DD5,\n\t5899: 0x8DD7,\n\t5900: 0x8DD9,\n\t5901: 0x8DE4,\n\t5902: 0x8DE5,\n\t5903: 0x8DE7,\n\t5904: 0x8DEC,\n\t5905: 0x8DF0,\n\t5906: 0x8DBC,\n\t5907: 0x8DF1,\n\t5908: 0x8DF2,\n\t5909: 0x8DF4,\n\t5910: 0x8DFD,\n\t5911: 0x8E01,\n\t5912: 0x8E04,\n\t5913: 0x8E05,\n\t5914: 0x8E06,\n\t5915: 0x8E0B,\n\t5916: 0x8E11,\n\t5917: 0x8E14,\n\t5918: 0x8E16,\n\t5919: 0x8E20,\n\t5920: 0x8E21,\n\t5921: 0x8E22,\n\t5922: 0x8E23,\n\t5923: 0x8E26,\n\t5924: 0x8E27,\n\t5925: 0x8E31,\n\t5926: 0x8E33,\n\t5927: 0x8E36,\n\t5928: 0x8E37,\n\t5929: 0x8E38,\n\t5930: 0x8E39,\n\t5931: 0x8E3D,\n\t5932: 0x8E40,\n\t5933: 0x8E41,\n\t5934: 0x8E4B,\n\t5935: 0x8E4D,\n\t5936: 0x8E4E,\n\t5937: 0x8E4F,\n\t5938: 0x8E54,\n\t5939: 0x8E5B,\n\t5940: 0x8E5C,\n\t5941: 0x8E5D,\n\t5942: 0x8E5E,\n\t5943: 0x8E61,\n\t5944: 0x8E62,\n\t5945: 0x8E69,\n\t5946: 0x8E6C,\n\t5947: 0x8E6D,\n\t5948: 0x8E6F,\n\t5949: 0x8E70,\n\t5950: 0x8E71,\n\t5951: 0x8E79,\n\t5952: 0x8E7A,\n\t5953: 0x8E7B,\n\t5954: 0x8E82,\n\t5955: 0x8E83,\n\t5956: 0x8E89,\n\t5957: 0x8E90,\n\t5958: 0x8E92,\n\t5959: 0x8E95,\n\t5960: 0x8E9A,\n\t5961: 0x8E9B,\n\t5962: 0x8E9D,\n\t5963: 0x8E9E,\n\t5964: 0x8EA2,\n\t5965: 0x8EA7,\n\t5966: 0x8EA9,\n\t5967: 0x8EAD,\n\t5968: 0x8EAE,\n\t5969: 0x8EB3,\n\t5970: 0x8EB5,\n\t5971: 0x8EBA,\n\t5972: 0x8EBB,\n\t5973: 0x8EC0,\n\t5974: 0x8EC1,\n\t5975: 0x8EC3,\n\t5976: 0x8EC4,\n\t5977: 0x8EC7,\n\t5978: 0x8ECF,\n\t5979: 0x8ED1,\n\t5980: 0x8ED4,\n\t5981: 0x8EDC,\n\t5982: 0x8EE8,\n\t5983: 0x8EEE,\n\t5984: 0x8EF0,\n\t5985: 0x8EF1,\n\t5986: 0x8EF7,\n\t5987: 0x8EF9,\n\t5988: 0x8EFA,\n\t5989: 0x8EED,\n\t5990: 0x8F00,\n\t5991: 0x8F02,\n\t5992: 0x8F07,\n\t5993: 0x8F08,\n\t5994: 0x8F0F,\n\t5995: 0x8F10,\n\t5996: 0x8F16,\n\t5997: 0x8F17,\n\t5998: 0x8F18,\n\t5999: 0x8F1E,\n\t6000: 0x8F20,\n\t6001: 0x8F21,\n\t6002: 0x8F23,\n\t6003: 0x8F25,\n\t6004: 0x8F27,\n\t6005: 0x8F28,\n\t6006: 0x8F2C,\n\t6007: 0x8F2D,\n\t6008: 0x8F2E,\n\t6009: 0x8F34,\n\t6010: 0x8F35,\n\t6011: 0x8F36,\n\t6012: 0x8F37,\n\t6013: 0x8F3A,\n\t6014: 0x8F40,\n\t6015: 0x8F41,\n\t6016: 0x8F43,\n\t6017: 0x8F47,\n\t6018: 0x8F4F,\n\t6019: 0x8F51,\n\t6020: 0x8F52,\n\t6021: 0x8F53,\n\t6022: 0x8F54,\n\t6023: 0x8F55,\n\t6024: 0x8F58,\n\t6025: 0x8F5D,\n\t6026: 0x8F5E,\n\t6027: 0x8F65,\n\t6028: 0x8F9D,\n\t6029: 0x8FA0,\n\t6030: 0x8FA1,\n\t6031: 0x8FA4,\n\t6032: 0x8FA5,\n\t6033: 0x8FA6,\n\t6034: 0x8FB5,\n\t6035: 0x8FB6,\n\t6036: 0x8FB8,\n\t6037: 0x8FBE,\n\t6038: 0x8FC0,\n\t6039: 0x8FC1,\n\t6040: 0x8FC6,\n\t6041: 0x8FCA,\n\t6042: 0x8FCB,\n\t6043: 0x8FCD,\n\t6044: 0x8FD0,\n\t6045: 0x8FD2,\n\t6046: 0x8FD3,\n\t6047: 0x8FD5,\n\t6048: 0x8FE0,\n\t6049: 0x8FE3,\n\t6050: 0x8FE4,\n\t6051: 0x8FE8,\n\t6052: 0x8FEE,\n\t6053: 0x8FF1,\n\t6054: 0x8FF5,\n\t6055: 0x8FF6,\n\t6056: 0x8FFB,\n\t6057: 0x8FFE,\n\t6058: 0x9002,\n\t6059: 0x9004,\n\t6060: 0x9008,\n\t6061: 0x900C,\n\t6062: 0x9018,\n\t6063: 0x901B,\n\t6064: 0x9028,\n\t6065: 0x9029,\n\t6066: 0x902F,\n\t6067: 0x902A,\n\t6068: 0x902C,\n\t6069: 0x902D,\n\t6070: 0x9033,\n\t6071: 0x9034,\n\t6072: 0x9037,\n\t6073: 0x903F,\n\t6074: 0x9043,\n\t6075: 0x9044,\n\t6076: 0x904C,\n\t6077: 0x905B,\n\t6078: 0x905D,\n\t6079: 0x9062,\n\t6080: 0x9066,\n\t6081: 0x9067,\n\t6082: 0x906C,\n\t6083: 0x9070,\n\t6084: 0x9074,\n\t6085: 0x9079,\n\t6086: 0x9085,\n\t6087: 0x9088,\n\t6088: 0x908B,\n\t6089: 0x908C,\n\t6090: 0x908E,\n\t6091: 0x9090,\n\t6092: 0x9095,\n\t6093: 0x9097,\n\t6094: 0x9098,\n\t6095: 0x9099,\n\t6096: 0x909B,\n\t6097: 0x90A0,\n\t6098: 0x90A1,\n\t6099: 0x90A2,\n\t6100: 0x90A5,\n\t6101: 0x90B0,\n\t6102: 0x90B2,\n\t6103: 0x90B3,\n\t6104: 0x90B4,\n\t6105: 0x90B6,\n\t6106: 0x90BD,\n\t6107: 0x90CC,\n\t6108: 0x90BE,\n\t6109: 0x90C3,\n\t6110: 0x90C4,\n\t6111: 0x90C5,\n\t6112: 0x90C7,\n\t6113: 0x90C8,\n\t6114: 0x90D5,\n\t6115: 0x90D7,\n\t6116: 0x90D8,\n\t6117: 0x90D9,\n\t6118: 0x90DC,\n\t6119: 0x90DD,\n\t6120: 0x90DF,\n\t6121: 0x90E5,\n\t6122: 0x90D2,\n\t6123: 0x90F6,\n\t6124: 0x90EB,\n\t6125: 0x90EF,\n\t6126: 0x90F0,\n\t6127: 0x90F4,\n\t6128: 0x90FE,\n\t6129: 0x90FF,\n\t6130: 0x9100,\n\t6131: 0x9104,\n\t6132: 0x9105,\n\t6133: 0x9106,\n\t6134: 0x9108,\n\t6135: 0x910D,\n\t6136: 0x9110,\n\t6137: 0x9114,\n\t6138: 0x9116,\n\t6139: 0x9117,\n\t6140: 0x9118,\n\t6141: 0x911A,\n\t6142: 0x911C,\n\t6143: 0x911E,\n\t6144: 0x9120,\n\t6145: 0x9125,\n\t6146: 0x9122,\n\t6147: 0x9123,\n\t6148: 0x9127,\n\t6149: 0x9129,\n\t6150: 0x912E,\n\t6151: 0x912F,\n\t6152: 0x9131,\n\t6153: 0x9134,\n\t6154: 0x9136,\n\t6155: 0x9137,\n\t6156: 0x9139,\n\t6157: 0x913A,\n\t6158: 0x913C,\n\t6159: 0x913D,\n\t6160: 0x9143,\n\t6161: 0x9147,\n\t6162: 0x9148,\n\t6163: 0x914F,\n\t6164: 0x9153,\n\t6165: 0x9157,\n\t6166: 0x9159,\n\t6167: 0x915A,\n\t6168: 0x915B,\n\t6169: 0x9161,\n\t6170: 0x9164,\n\t6171: 0x9167,\n\t6172: 0x916D,\n\t6173: 0x9174,\n\t6174: 0x9179,\n\t6175: 0x917A,\n\t6176: 0x917B,\n\t6177: 0x9181,\n\t6178: 0x9183,\n\t6179: 0x9185,\n\t6180: 0x9186,\n\t6181: 0x918A,\n\t6182: 0x918E,\n\t6183: 0x9191,\n\t6184: 0x9193,\n\t6185: 0x9194,\n\t6186: 0x9195,\n\t6187: 0x9198,\n\t6188: 0x919E,\n\t6189: 0x91A1,\n\t6190: 0x91A6,\n\t6191: 0x91A8,\n\t6192: 0x91AC,\n\t6193: 0x91AD,\n\t6194: 0x91AE,\n\t6195: 0x91B0,\n\t6196: 0x91B1,\n\t6197: 0x91B2,\n\t6198: 0x91B3,\n\t6199: 0x91B6,\n\t6200: 0x91BB,\n\t6201: 0x91BC,\n\t6202: 0x91BD,\n\t6203: 0x91BF,\n\t6204: 0x91C2,\n\t6205: 0x91C3,\n\t6206: 0x91C5,\n\t6207: 0x91D3,\n\t6208: 0x91D4,\n\t6209: 0x91D7,\n\t6210: 0x91D9,\n\t6211: 0x91DA,\n\t6212: 0x91DE,\n\t6213: 0x91E4,\n\t6214: 0x91E5,\n\t6215: 0x91E9,\n\t6216: 0x91EA,\n\t6217: 0x91EC,\n\t6218: 0x91ED,\n\t6219: 0x91EE,\n\t6220: 0x91EF,\n\t6221: 0x91F0,\n\t6222: 0x91F1,\n\t6223: 0x91F7,\n\t6224: 0x91F9,\n\t6225: 0x91FB,\n\t6226: 0x91FD,\n\t6227: 0x9200,\n\t6228: 0x9201,\n\t6229: 0x9204,\n\t6230: 0x9205,\n\t6231: 0x9206,\n\t6232: 0x9207,\n\t6233: 0x9209,\n\t6234: 0x920A,\n\t6235: 0x920C,\n\t6236: 0x9210,\n\t6237: 0x9212,\n\t6238: 0x9213,\n\t6239: 0x9216,\n\t6240: 0x9218,\n\t6241: 0x921C,\n\t6242: 0x921D,\n\t6243: 0x9223,\n\t6244: 0x9224,\n\t6245: 0x9225,\n\t6246: 0x9226,\n\t6247: 0x9228,\n\t6248: 0x922E,\n\t6249: 0x922F,\n\t6250: 0x9230,\n\t6251: 0x9233,\n\t6252: 0x9235,\n\t6253: 0x9236,\n\t6254: 0x9238,\n\t6255: 0x9239,\n\t6256: 0x923A,\n\t6257: 0x923C,\n\t6258: 0x923E,\n\t6259: 0x9240,\n\t6260: 0x9242,\n\t6261: 0x9243,\n\t6262: 0x9246,\n\t6263: 0x9247,\n\t6264: 0x924A,\n\t6265: 0x924D,\n\t6266: 0x924E,\n\t6267: 0x924F,\n\t6268: 0x9251,\n\t6269: 0x9258,\n\t6270: 0x9259,\n\t6271: 0x925C,\n\t6272: 0x925D,\n\t6273: 0x9260,\n\t6274: 0x9261,\n\t6275: 0x9265,\n\t6276: 0x9267,\n\t6277: 0x9268,\n\t6278: 0x9269,\n\t6279: 0x926E,\n\t6280: 0x926F,\n\t6281: 0x9270,\n\t6282: 0x9275,\n\t6283: 0x9276,\n\t6284: 0x9277,\n\t6285: 0x9278,\n\t6286: 0x9279,\n\t6287: 0x927B,\n\t6288: 0x927C,\n\t6289: 0x927D,\n\t6290: 0x927F,\n\t6291: 0x9288,\n\t6292: 0x9289,\n\t6293: 0x928A,\n\t6294: 0x928D,\n\t6295: 0x928E,\n\t6296: 0x9292,\n\t6297: 0x9297,\n\t6298: 0x9299,\n\t6299: 0x929F,\n\t6300: 0x92A0,\n\t6301: 0x92A4,\n\t6302: 0x92A5,\n\t6303: 0x92A7,\n\t6304: 0x92A8,\n\t6305: 0x92AB,\n\t6306: 0x92AF,\n\t6307: 0x92B2,\n\t6308: 0x92B6,\n\t6309: 0x92B8,\n\t6310: 0x92BA,\n\t6311: 0x92BB,\n\t6312: 0x92BC,\n\t6313: 0x92BD,\n\t6314: 0x92BF,\n\t6315: 0x92C0,\n\t6316: 0x92C1,\n\t6317: 0x92C2,\n\t6318: 0x92C3,\n\t6319: 0x92C5,\n\t6320: 0x92C6,\n\t6321: 0x92C7,\n\t6322: 0x92C8,\n\t6323: 0x92CB,\n\t6324: 0x92CC,\n\t6325: 0x92CD,\n\t6326: 0x92CE,\n\t6327: 0x92D0,\n\t6328: 0x92D3,\n\t6329: 0x92D5,\n\t6330: 0x92D7,\n\t6331: 0x92D8,\n\t6332: 0x92D9,\n\t6333: 0x92DC,\n\t6334: 0x92DD,\n\t6335: 0x92DF,\n\t6336: 0x92E0,\n\t6337: 0x92E1,\n\t6338: 0x92E3,\n\t6339: 0x92E5,\n\t6340: 0x92E7,\n\t6341: 0x92E8,\n\t6342: 0x92EC,\n\t6343: 0x92EE,\n\t6344: 0x92F0,\n\t6345: 0x92F9,\n\t6346: 0x92FB,\n\t6347: 0x92FF,\n\t6348: 0x9300,\n\t6349: 0x9302,\n\t6350: 0x9308,\n\t6351: 0x930D,\n\t6352: 0x9311,\n\t6353: 0x9314,\n\t6354: 0x9315,\n\t6355: 0x931C,\n\t6356: 0x931D,\n\t6357: 0x931E,\n\t6358: 0x931F,\n\t6359: 0x9321,\n\t6360: 0x9324,\n\t6361: 0x9325,\n\t6362: 0x9327,\n\t6363: 0x9329,\n\t6364: 0x932A,\n\t6365: 0x9333,\n\t6366: 0x9334,\n\t6367: 0x9336,\n\t6368: 0x9337,\n\t6369: 0x9347,\n\t6370: 0x9348,\n\t6371: 0x9349,\n\t6372: 0x9350,\n\t6373: 0x9351,\n\t6374: 0x9352,\n\t6375: 0x9355,\n\t6376: 0x9357,\n\t6377: 0x9358,\n\t6378: 0x935A,\n\t6379: 0x935E,\n\t6380: 0x9364,\n\t6381: 0x9365,\n\t6382: 0x9367,\n\t6383: 0x9369,\n\t6384: 0x936A,\n\t6385: 0x936D,\n\t6386: 0x936F,\n\t6387: 0x9370,\n\t6388: 0x9371,\n\t6389: 0x9373,\n\t6390: 0x9374,\n\t6391: 0x9376,\n\t6392: 0x937A,\n\t6393: 0x937D,\n\t6394: 0x937F,\n\t6395: 0x9380,\n\t6396: 0x9381,\n\t6397: 0x9382,\n\t6398: 0x9388,\n\t6399: 0x938A,\n\t6400: 0x938B,\n\t6401: 0x938D,\n\t6402: 0x938F,\n\t6403: 0x9392,\n\t6404: 0x9395,\n\t6405: 0x9398,\n\t6406: 0x939B,\n\t6407: 0x939E,\n\t6408: 0x93A1,\n\t6409: 0x93A3,\n\t6410: 0x93A4,\n\t6411: 0x93A6,\n\t6412: 0x93A8,\n\t6413: 0x93AB,\n\t6414: 0x93B4,\n\t6415: 0x93B5,\n\t6416: 0x93B6,\n\t6417: 0x93BA,\n\t6418: 0x93A9,\n\t6419: 0x93C1,\n\t6420: 0x93C4,\n\t6421: 0x93C5,\n\t6422: 0x93C6,\n\t6423: 0x93C7,\n\t6424: 0x93C9,\n\t6425: 0x93CA,\n\t6426: 0x93CB,\n\t6427: 0x93CC,\n\t6428: 0x93CD,\n\t6429: 0x93D3,\n\t6430: 0x93D9,\n\t6431: 0x93DC,\n\t6432: 0x93DE,\n\t6433: 0x93DF,\n\t6434: 0x93E2,\n\t6435: 0x93E6,\n\t6436: 0x93E7,\n\t6437: 0x93F9,\n\t6438: 0x93F7,\n\t6439: 0x93F8,\n\t6440: 0x93FA,\n\t6441: 0x93FB,\n\t6442: 0x93FD,\n\t6443: 0x9401,\n\t6444: 0x9402,\n\t6445: 0x9404,\n\t6446: 0x9408,\n\t6447: 0x9409,\n\t6448: 0x940D,\n\t6449: 0x940E,\n\t6450: 0x940F,\n\t6451: 0x9415,\n\t6452: 0x9416,\n\t6453: 0x9417,\n\t6454: 0x941F,\n\t6455: 0x942E,\n\t6456: 0x942F,\n\t6457: 0x9431,\n\t6458: 0x9432,\n\t6459: 0x9433,\n\t6460: 0x9434,\n\t6461: 0x943B,\n\t6462: 0x943F,\n\t6463: 0x943D,\n\t6464: 0x9443,\n\t6465: 0x9445,\n\t6466: 0x9448,\n\t6467: 0x944A,\n\t6468: 0x944C,\n\t6469: 0x9455,\n\t6470: 0x9459,\n\t6471: 0x945C,\n\t6472: 0x945F,\n\t6473: 0x9461,\n\t6474: 0x9463,\n\t6475: 0x9468,\n\t6476: 0x946B,\n\t6477: 0x946D,\n\t6478: 0x946E,\n\t6479: 0x946F,\n\t6480: 0x9471,\n\t6481: 0x9472,\n\t6482: 0x9484,\n\t6483: 0x9483,\n\t6484: 0x9578,\n\t6485: 0x9579,\n\t6486: 0x957E,\n\t6487: 0x9584,\n\t6488: 0x9588,\n\t6489: 0x958C,\n\t6490: 0x958D,\n\t6491: 0x958E,\n\t6492: 0x959D,\n\t6493: 0x959E,\n\t6494: 0x959F,\n\t6495: 0x95A1,\n\t6496: 0x95A6,\n\t6497: 0x95A9,\n\t6498: 0x95AB,\n\t6499: 0x95AC,\n\t6500: 0x95B4,\n\t6501: 0x95B6,\n\t6502: 0x95BA,\n\t6503: 0x95BD,\n\t6504: 0x95BF,\n\t6505: 0x95C6,\n\t6506: 0x95C8,\n\t6507: 0x95C9,\n\t6508: 0x95CB,\n\t6509: 0x95D0,\n\t6510: 0x95D1,\n\t6511: 0x95D2,\n\t6512: 0x95D3,\n\t6513: 0x95D9,\n\t6514: 0x95DA,\n\t6515: 0x95DD,\n\t6516: 0x95DE,\n\t6517: 0x95DF,\n\t6518: 0x95E0,\n\t6519: 0x95E4,\n\t6520: 0x95E6,\n\t6521: 0x961D,\n\t6522: 0x961E,\n\t6523: 0x9622,\n\t6524: 0x9624,\n\t6525: 0x9625,\n\t6526: 0x9626,\n\t6527: 0x962C,\n\t6528: 0x9631,\n\t6529: 0x9633,\n\t6530: 0x9637,\n\t6531: 0x9638,\n\t6532: 0x9639,\n\t6533: 0x963A,\n\t6534: 0x963C,\n\t6535: 0x963D,\n\t6536: 0x9641,\n\t6537: 0x9652,\n\t6538: 0x9654,\n\t6539: 0x9656,\n\t6540: 0x9657,\n\t6541: 0x9658,\n\t6542: 0x9661,\n\t6543: 0x966E,\n\t6544: 0x9674,\n\t6545: 0x967B,\n\t6546: 0x967C,\n\t6547: 0x967E,\n\t6548: 0x967F,\n\t6549: 0x9681,\n\t6550: 0x9682,\n\t6551: 0x9683,\n\t6552: 0x9684,\n\t6553: 0x9689,\n\t6554: 0x9691,\n\t6555: 0x9696,\n\t6556: 0x969A,\n\t6557: 0x969D,\n\t6558: 0x969F,\n\t6559: 0x96A4,\n\t6560: 0x96A5,\n\t6561: 0x96A6,\n\t6562: 0x96A9,\n\t6563: 0x96AE,\n\t6564: 0x96AF,\n\t6565: 0x96B3,\n\t6566: 0x96BA,\n\t6567: 0x96CA,\n\t6568: 0x96D2,\n\t6569: 0x5DB2,\n\t6570: 0x96D8,\n\t6571: 0x96DA,\n\t6572: 0x96DD,\n\t6573: 0x96DE,\n\t6574: 0x96DF,\n\t6575: 0x96E9,\n\t6576: 0x96EF,\n\t6577: 0x96F1,\n\t6578: 0x96FA,\n\t6579: 0x9702,\n\t6580: 0x9703,\n\t6581: 0x9705,\n\t6582: 0x9709,\n\t6583: 0x971A,\n\t6584: 0x971B,\n\t6585: 0x971D,\n\t6586: 0x9721,\n\t6587: 0x9722,\n\t6588: 0x9723,\n\t6589: 0x9728,\n\t6590: 0x9731,\n\t6591: 0x9733,\n\t6592: 0x9741,\n\t6593: 0x9743,\n\t6594: 0x974A,\n\t6595: 0x974E,\n\t6596: 0x974F,\n\t6597: 0x9755,\n\t6598: 0x9757,\n\t6599: 0x9758,\n\t6600: 0x975A,\n\t6601: 0x975B,\n\t6602: 0x9763,\n\t6603: 0x9767,\n\t6604: 0x976A,\n\t6605: 0x976E,\n\t6606: 0x9773,\n\t6607: 0x9776,\n\t6608: 0x9777,\n\t6609: 0x9778,\n\t6610: 0x977B,\n\t6611: 0x977D,\n\t6612: 0x977F,\n\t6613: 0x9780,\n\t6614: 0x9789,\n\t6615: 0x9795,\n\t6616: 0x9796,\n\t6617: 0x9797,\n\t6618: 0x9799,\n\t6619: 0x979A,\n\t6620: 0x979E,\n\t6621: 0x979F,\n\t6622: 0x97A2,\n\t6623: 0x97AC,\n\t6624: 0x97AE,\n\t6625: 0x97B1,\n\t6626: 0x97B2,\n\t6627: 0x97B5,\n\t6628: 0x97B6,\n\t6629: 0x97B8,\n\t6630: 0x97B9,\n\t6631: 0x97BA,\n\t6632: 0x97BC,\n\t6633: 0x97BE,\n\t6634: 0x97BF,\n\t6635: 0x97C1,\n\t6636: 0x97C4,\n\t6637: 0x97C5,\n\t6638: 0x97C7,\n\t6639: 0x97C9,\n\t6640: 0x97CA,\n\t6641: 0x97CC,\n\t6642: 0x97CD,\n\t6643: 0x97CE,\n\t6644: 0x97D0,\n\t6645: 0x97D1,\n\t6646: 0x97D4,\n\t6647: 0x97D7,\n\t6648: 0x97D8,\n\t6649: 0x97D9,\n\t6650: 0x97DD,\n\t6651: 0x97DE,\n\t6652: 0x97E0,\n\t6653: 0x97DB,\n\t6654: 0x97E1,\n\t6655: 0x97E4,\n\t6656: 0x97EF,\n\t6657: 0x97F1,\n\t6658: 0x97F4,\n\t6659: 0x97F7,\n\t6660: 0x97F8,\n\t6661: 0x97FA,\n\t6662: 0x9807,\n\t6663: 0x980A,\n\t6664: 0x9819,\n\t6665: 0x980D,\n\t6666: 0x980E,\n\t6667: 0x9814,\n\t6668: 0x9816,\n\t6669: 0x981C,\n\t6670: 0x981E,\n\t6671: 0x9820,\n\t6672: 0x9823,\n\t6673: 0x9826,\n\t6674: 0x982B,\n\t6675: 0x982E,\n\t6676: 0x982F,\n\t6677: 0x9830,\n\t6678: 0x9832,\n\t6679: 0x9833,\n\t6680: 0x9835,\n\t6681: 0x9825,\n\t6682: 0x983E,\n\t6683: 0x9844,\n\t6684: 0x9847,\n\t6685: 0x984A,\n\t6686: 0x9851,\n\t6687: 0x9852,\n\t6688: 0x9853,\n\t6689: 0x9856,\n\t6690: 0x9857,\n\t6691: 0x9859,\n\t6692: 0x985A,\n\t6693: 0x9862,\n\t6694: 0x9863,\n\t6695: 0x9865,\n\t6696: 0x9866,\n\t6697: 0x986A,\n\t6698: 0x986C,\n\t6699: 0x98AB,\n\t6700: 0x98AD,\n\t6701: 0x98AE,\n\t6702: 0x98B0,\n\t6703: 0x98B4,\n\t6704: 0x98B7,\n\t6705: 0x98B8,\n\t6706: 0x98BA,\n\t6707: 0x98BB,\n\t6708: 0x98BF,\n\t6709: 0x98C2,\n\t6710: 0x98C5,\n\t6711: 0x98C8,\n\t6712: 0x98CC,\n\t6713: 0x98E1,\n\t6714: 0x98E3,\n\t6715: 0x98E5,\n\t6716: 0x98E6,\n\t6717: 0x98E7,\n\t6718: 0x98EA,\n\t6719: 0x98F3,\n\t6720: 0x98F6,\n\t6721: 0x9902,\n\t6722: 0x9907,\n\t6723: 0x9908,\n\t6724: 0x9911,\n\t6725: 0x9915,\n\t6726: 0x9916,\n\t6727: 0x9917,\n\t6728: 0x991A,\n\t6729: 0x991B,\n\t6730: 0x991C,\n\t6731: 0x991F,\n\t6732: 0x9922,\n\t6733: 0x9926,\n\t6734: 0x9927,\n\t6735: 0x992B,\n\t6736: 0x9931,\n\t6737: 0x9932,\n\t6738: 0x9933,\n\t6739: 0x9934,\n\t6740: 0x9935,\n\t6741: 0x9939,\n\t6742: 0x993A,\n\t6743: 0x993B,\n\t6744: 0x993C,\n\t6745: 0x9940,\n\t6746: 0x9941,\n\t6747: 0x9946,\n\t6748: 0x9947,\n\t6749: 0x9948,\n\t6750: 0x994D,\n\t6751: 0x994E,\n\t6752: 0x9954,\n\t6753: 0x9958,\n\t6754: 0x9959,\n\t6755: 0x995B,\n\t6756: 0x995C,\n\t6757: 0x995E,\n\t6758: 0x995F,\n\t6759: 0x9960,\n\t6760: 0x999B,\n\t6761: 0x999D,\n\t6762: 0x999F,\n\t6763: 0x99A6,\n\t6764: 0x99B0,\n\t6765: 0x99B1,\n\t6766: 0x99B2,\n\t6767: 0x99B5,\n\t6768: 0x99B9,\n\t6769: 0x99BA,\n\t6770: 0x99BD,\n\t6771: 0x99BF,\n\t6772: 0x99C3,\n\t6773: 0x99C9,\n\t6774: 0x99D3,\n\t6775: 0x99D4,\n\t6776: 0x99D9,\n\t6777: 0x99DA,\n\t6778: 0x99DC,\n\t6779: 0x99DE,\n\t6780: 0x99E7,\n\t6781: 0x99EA,\n\t6782: 0x99EB,\n\t6783: 0x99EC,\n\t6784: 0x99F0,\n\t6785: 0x99F4,\n\t6786: 0x99F5,\n\t6787: 0x99F9,\n\t6788: 0x99FD,\n\t6789: 0x99FE,\n\t6790: 0x9A02,\n\t6791: 0x9A03,\n\t6792: 0x9A04,\n\t6793: 0x9A0B,\n\t6794: 0x9A0C,\n\t6795: 0x9A10,\n\t6796: 0x9A11,\n\t6797: 0x9A16,\n\t6798: 0x9A1E,\n\t6799: 0x9A20,\n\t6800: 0x9A22,\n\t6801: 0x9A23,\n\t6802: 0x9A24,\n\t6803: 0x9A27,\n\t6804: 0x9A2D,\n\t6805: 0x9A2E,\n\t6806: 0x9A33,\n\t6807: 0x9A35,\n\t6808: 0x9A36,\n\t6809: 0x9A38,\n\t6810: 0x9A47,\n\t6811: 0x9A41,\n\t6812: 0x9A44,\n\t6813: 0x9A4A,\n\t6814: 0x9A4B,\n\t6815: 0x9A4C,\n\t6816: 0x9A4E,\n\t6817: 0x9A51,\n\t6818: 0x9A54,\n\t6819: 0x9A56,\n\t6820: 0x9A5D,\n\t6821: 0x9AAA,\n\t6822: 0x9AAC,\n\t6823: 0x9AAE,\n\t6824: 0x9AAF,\n\t6825: 0x9AB2,\n\t6826: 0x9AB4,\n\t6827: 0x9AB5,\n\t6828: 0x9AB6,\n\t6829: 0x9AB9,\n\t6830: 0x9ABB,\n\t6831: 0x9ABE,\n\t6832: 0x9ABF,\n\t6833: 0x9AC1,\n\t6834: 0x9AC3,\n\t6835: 0x9AC6,\n\t6836: 0x9AC8,\n\t6837: 0x9ACE,\n\t6838: 0x9AD0,\n\t6839: 0x9AD2,\n\t6840: 0x9AD5,\n\t6841: 0x9AD6,\n\t6842: 0x9AD7,\n\t6843: 0x9ADB,\n\t6844: 0x9ADC,\n\t6845: 0x9AE0,\n\t6846: 0x9AE4,\n\t6847: 0x9AE5,\n\t6848: 0x9AE7,\n\t6849: 0x9AE9,\n\t6850: 0x9AEC,\n\t6851: 0x9AF2,\n\t6852: 0x9AF3,\n\t6853: 0x9AF5,\n\t6854: 0x9AF9,\n\t6855: 0x9AFA,\n\t6856: 0x9AFD,\n\t6857: 0x9AFF,\n\t6858: 0x9B00,\n\t6859: 0x9B01,\n\t6860: 0x9B02,\n\t6861: 0x9B03,\n\t6862: 0x9B04,\n\t6863: 0x9B05,\n\t6864: 0x9B08,\n\t6865: 0x9B09,\n\t6866: 0x9B0B,\n\t6867: 0x9B0C,\n\t6868: 0x9B0D,\n\t6869: 0x9B0E,\n\t6870: 0x9B10,\n\t6871: 0x9B12,\n\t6872: 0x9B16,\n\t6873: 0x9B19,\n\t6874: 0x9B1B,\n\t6875: 0x9B1C,\n\t6876: 0x9B20,\n\t6877: 0x9B26,\n\t6878: 0x9B2B,\n\t6879: 0x9B2D,\n\t6880: 0x9B33,\n\t6881: 0x9B34,\n\t6882: 0x9B35,\n\t6883: 0x9B37,\n\t6884: 0x9B39,\n\t6885: 0x9B3A,\n\t6886: 0x9B3D,\n\t6887: 0x9B48,\n\t6888: 0x9B4B,\n\t6889: 0x9B4C,\n\t6890: 0x9B55,\n\t6891: 0x9B56,\n\t6892: 0x9B57,\n\t6893: 0x9B5B,\n\t6894: 0x9B5E,\n\t6895: 0x9B61,\n\t6896: 0x9B63,\n\t6897: 0x9B65,\n\t6898: 0x9B66,\n\t6899: 0x9B68,\n\t6900: 0x9B6A,\n\t6901: 0x9B6B,\n\t6902: 0x9B6C,\n\t6903: 0x9B6D,\n\t6904: 0x9B6E,\n\t6905: 0x9B73,\n\t6906: 0x9B75,\n\t6907: 0x9B77,\n\t6908: 0x9B78,\n\t6909: 0x9B79,\n\t6910: 0x9B7F,\n\t6911: 0x9B80,\n\t6912: 0x9B84,\n\t6913: 0x9B85,\n\t6914: 0x9B86,\n\t6915: 0x9B87,\n\t6916: 0x9B89,\n\t6917: 0x9B8A,\n\t6918: 0x9B8B,\n\t6919: 0x9B8D,\n\t6920: 0x9B8F,\n\t6921: 0x9B90,\n\t6922: 0x9B94,\n\t6923: 0x9B9A,\n\t6924: 0x9B9D,\n\t6925: 0x9B9E,\n\t6926: 0x9BA6,\n\t6927: 0x9BA7,\n\t6928: 0x9BA9,\n\t6929: 0x9BAC,\n\t6930: 0x9BB0,\n\t6931: 0x9BB1,\n\t6932: 0x9BB2,\n\t6933: 0x9BB7,\n\t6934: 0x9BB8,\n\t6935: 0x9BBB,\n\t6936: 0x9BBC,\n\t6937: 0x9BBE,\n\t6938: 0x9BBF,\n\t6939: 0x9BC1,\n\t6940: 0x9BC7,\n\t6941: 0x9BC8,\n\t6942: 0x9BCE,\n\t6943: 0x9BD0,\n\t6944: 0x9BD7,\n\t6945: 0x9BD8,\n\t6946: 0x9BDD,\n\t6947: 0x9BDF,\n\t6948: 0x9BE5,\n\t6949: 0x9BE7,\n\t6950: 0x9BEA,\n\t6951: 0x9BEB,\n\t6952: 0x9BEF,\n\t6953: 0x9BF3,\n\t6954: 0x9BF7,\n\t6955: 0x9BF8,\n\t6956: 0x9BF9,\n\t6957: 0x9BFA,\n\t6958: 0x9BFD,\n\t6959: 0x9BFF,\n\t6960: 0x9C00,\n\t6961: 0x9C02,\n\t6962: 0x9C0B,\n\t6963: 0x9C0F,\n\t6964: 0x9C11,\n\t6965: 0x9C16,\n\t6966: 0x9C18,\n\t6967: 0x9C19,\n\t6968: 0x9C1A,\n\t6969: 0x9C1C,\n\t6970: 0x9C1E,\n\t6971: 0x9C22,\n\t6972: 0x9C23,\n\t6973: 0x9C26,\n\t6974: 0x9C27,\n\t6975: 0x9C28,\n\t6976: 0x9C29,\n\t6977: 0x9C2A,\n\t6978: 0x9C31,\n\t6979: 0x9C35,\n\t6980: 0x9C36,\n\t6981: 0x9C37,\n\t6982: 0x9C3D,\n\t6983: 0x9C41,\n\t6984: 0x9C43,\n\t6985: 0x9C44,\n\t6986: 0x9C45,\n\t6987: 0x9C49,\n\t6988: 0x9C4A,\n\t6989: 0x9C4E,\n\t6990: 0x9C4F,\n\t6991: 0x9C50,\n\t6992: 0x9C53,\n\t6993: 0x9C54,\n\t6994: 0x9C56,\n\t6995: 0x9C58,\n\t6996: 0x9C5B,\n\t6997: 0x9C5D,\n\t6998: 0x9C5E,\n\t6999: 0x9C5F,\n\t7000: 0x9C63,\n\t7001: 0x9C69,\n\t7002: 0x9C6A,\n\t7003: 0x9C5C,\n\t7004: 0x9C6B,\n\t7005: 0x9C68,\n\t7006: 0x9C6E,\n\t7007: 0x9C70,\n\t7008: 0x9C72,\n\t7009: 0x9C75,\n\t7010: 0x9C77,\n\t7011: 0x9C7B,\n\t7012: 0x9CE6,\n\t7013: 0x9CF2,\n\t7014: 0x9CF7,\n\t7015: 0x9CF9,\n\t7016: 0x9D0B,\n\t7017: 0x9D02,\n\t7018: 0x9D11,\n\t7019: 0x9D17,\n\t7020: 0x9D18,\n\t7021: 0x9D1C,\n\t7022: 0x9D1D,\n\t7023: 0x9D1E,\n\t7024: 0x9D2F,\n\t7025: 0x9D30,\n\t7026: 0x9D32,\n\t7027: 0x9D33,\n\t7028: 0x9D34,\n\t7029: 0x9D3A,\n\t7030: 0x9D3C,\n\t7031: 0x9D45,\n\t7032: 0x9D3D,\n\t7033: 0x9D42,\n\t7034: 0x9D43,\n\t7035: 0x9D47,\n\t7036: 0x9D4A,\n\t7037: 0x9D53,\n\t7038: 0x9D54,\n\t7039: 0x9D5F,\n\t7040: 0x9D63,\n\t7041: 0x9D62,\n\t7042: 0x9D65,\n\t7043: 0x9D69,\n\t7044: 0x9D6A,\n\t7045: 0x9D6B,\n\t7046: 0x9D70,\n\t7047: 0x9D76,\n\t7048: 0x9D77,\n\t7049: 0x9D7B,\n\t7050: 0x9D7C,\n\t7051: 0x9D7E,\n\t7052: 0x9D83,\n\t7053: 0x9D84,\n\t7054: 0x9D86,\n\t7055: 0x9D8A,\n\t7056: 0x9D8D,\n\t7057: 0x9D8E,\n\t7058: 0x9D92,\n\t7059: 0x9D93,\n\t7060: 0x9D95,\n\t7061: 0x9D96,\n\t7062: 0x9D97,\n\t7063: 0x9D98,\n\t7064: 0x9DA1,\n\t7065: 0x9DAA,\n\t7066: 0x9DAC,\n\t7067: 0x9DAE,\n\t7068: 0x9DB1,\n\t7069: 0x9DB5,\n\t7070: 0x9DB9,\n\t7071: 0x9DBC,\n\t7072: 0x9DBF,\n\t7073: 0x9DC3,\n\t7074: 0x9DC7,\n\t7075: 0x9DC9,\n\t7076: 0x9DCA,\n\t7077: 0x9DD4,\n\t7078: 0x9DD5,\n\t7079: 0x9DD6,\n\t7080: 0x9DD7,\n\t7081: 0x9DDA,\n\t7082: 0x9DDE,\n\t7083: 0x9DDF,\n\t7084: 0x9DE0,\n\t7085: 0x9DE5,\n\t7086: 0x9DE7,\n\t7087: 0x9DE9,\n\t7088: 0x9DEB,\n\t7089: 0x9DEE,\n\t7090: 0x9DF0,\n\t7091: 0x9DF3,\n\t7092: 0x9DF4,\n\t7093: 0x9DFE,\n\t7094: 0x9E0A,\n\t7095: 0x9E02,\n\t7096: 0x9E07,\n\t7097: 0x9E0E,\n\t7098: 0x9E10,\n\t7099: 0x9E11,\n\t7100: 0x9E12,\n\t7101: 0x9E15,\n\t7102: 0x9E16,\n\t7103: 0x9E19,\n\t7104: 0x9E1C,\n\t7105: 0x9E1D,\n\t7106: 0x9E7A,\n\t7107: 0x9E7B,\n\t7108: 0x9E7C,\n\t7109: 0x9E80,\n\t7110: 0x9E82,\n\t7111: 0x9E83,\n\t7112: 0x9E84,\n\t7113: 0x9E85,\n\t7114: 0x9E87,\n\t7115: 0x9E8E,\n\t7116: 0x9E8F,\n\t7117: 0x9E96,\n\t7118: 0x9E98,\n\t7119: 0x9E9B,\n\t7120: 0x9E9E,\n\t7121: 0x9EA4,\n\t7122: 0x9EA8,\n\t7123: 0x9EAC,\n\t7124: 0x9EAE,\n\t7125: 0x9EAF,\n\t7126: 0x9EB0,\n\t7127: 0x9EB3,\n\t7128: 0x9EB4,\n\t7129: 0x9EB5,\n\t7130: 0x9EC6,\n\t7131: 0x9EC8,\n\t7132: 0x9ECB,\n\t7133: 0x9ED5,\n\t7134: 0x9EDF,\n\t7135: 0x9EE4,\n\t7136: 0x9EE7,\n\t7137: 0x9EEC,\n\t7138: 0x9EED,\n\t7139: 0x9EEE,\n\t7140: 0x9EF0,\n\t7141: 0x9EF1,\n\t7142: 0x9EF2,\n\t7143: 0x9EF5,\n\t7144: 0x9EF8,\n\t7145: 0x9EFF,\n\t7146: 0x9F02,\n\t7147: 0x9F03,\n\t7148: 0x9F09,\n\t7149: 0x9F0F,\n\t7150: 0x9F10,\n\t7151: 0x9F11,\n\t7152: 0x9F12,\n\t7153: 0x9F14,\n\t7154: 0x9F16,\n\t7155: 0x9F17,\n\t7156: 0x9F19,\n\t7157: 0x9F1A,\n\t7158: 0x9F1B,\n\t7159: 0x9F1F,\n\t7160: 0x9F22,\n\t7161: 0x9F26,\n\t7162: 0x9F2A,\n\t7163: 0x9F2B,\n\t7164: 0x9F2F,\n\t7165: 0x9F31,\n\t7166: 0x9F32,\n\t7167: 0x9F34,\n\t7168: 0x9F37,\n\t7169: 0x9F39,\n\t7170: 0x9F3A,\n\t7171: 0x9F3C,\n\t7172: 0x9F3D,\n\t7173: 0x9F3F,\n\t7174: 0x9F41,\n\t7175: 0x9F43,\n\t7176: 0x9F44,\n\t7177: 0x9F45,\n\t7178: 0x9F46,\n\t7179: 0x9F47,\n\t7180: 0x9F53,\n\t7181: 0x9F55,\n\t7182: 0x9F56,\n\t7183: 0x9F57,\n\t7184: 0x9F58,\n\t7185: 0x9F5A,\n\t7186: 0x9F5D,\n\t7187: 0x9F5E,\n\t7188: 0x9F68,\n\t7189: 0x9F69,\n\t7190: 0x9F6D,\n\t7191: 0x9F6E,\n\t7192: 0x9F6F,\n\t7193: 0x9F70,\n\t7194: 0x9F71,\n\t7195: 0x9F73,\n\t7196: 0x9F75,\n\t7197: 0x9F7A,\n\t7198: 0x9F7D,\n\t7199: 0x9F8F,\n\t7200: 0x9F90,\n\t7201: 0x9F91,\n\t7202: 0x9F92,\n\t7203: 0x9F94,\n\t7204: 0x9F96,\n\t7205: 0x9F97,\n\t7206: 0x9F9E,\n\t7207: 0x9FA1,\n\t7208: 0x9FA2,\n\t7209: 0x9FA3,\n\t7210: 0x9FA5,\n}\n\nconst (\n\tjis0208    = 1\n\tjis0212    = 2\n\tcodeMask   = 0x7f\n\tcodeShift  = 7\n\ttableShift = 14\n)\n\nconst numEncodeTables = 6\n\n// encodeX are the encoding tables from Unicode to JIS code,\n// sorted by decreasing length.\n// encode0: 20902 entries for runes in [19968, 40870).\n// encode1:  1632 entries for runes in [ 8208,  9840).\n// encode2:   974 entries for runes in [12288, 13262).\n// encode3:   959 entries for runes in [  161,  1120).\n// encode4:   261 entries for runes in [63785, 64046).\n// encode5:   229 entries for runes in [65281, 65510).\n//\n// The high two bits of the value record whether the JIS code comes from the\n// JIS0208 table (high bits == 1) or the JIS0212 table (high bits == 2).\n// The low 14 bits are two 7-bit unsigned integers j1 and j2 that form the\n// JIS code (94*j1 + j2) within that table.\n\nconst encode0Low, encode0High = 19968, 40870\n\nvar encode0 = [...]uint16{\n\t19968 - 19968: jis0208<<14 | 0x0F<<7 | 0x4B,\n\t19969 - 19968: jis0208<<14 | 0x22<<7 | 0x59,\n\t19970 - 19968: jis0212<<14 | 0x0F<<7 | 0x00,\n\t19971 - 19968: jis0208<<14 | 0x1B<<7 | 0x16,\n\t19972 - 19968: jis0212<<14 | 0x0F<<7 | 0x01,\n\t19973 - 19968: jis0212<<14 | 0x0F<<7 | 0x02,\n\t19975 - 19968: jis0208<<14 | 0x2A<<7 | 0x5B,\n\t19976 - 19968: jis0208<<14 | 0x1D<<7 | 0x45,\n\t19977 - 19968: jis0208<<14 | 0x1A<<7 | 0x0F,\n\t19978 - 19968: jis0208<<14 | 0x1D<<7 | 0x44,\n\t19979 - 19968: jis0208<<14 | 0x11<<7 | 0x1B,\n\t19980 - 19968: jis0212<<14 | 0x0F<<7 | 0x03,\n\t19981 - 19968: jis0208<<14 | 0x28<<7 | 0x33,\n\t19982 - 19968: jis0208<<14 | 0x2C<<7 | 0x1E,\n\t19984 - 19968: jis0208<<14 | 0x2F<<7 | 0x01,\n\t19985 - 19968: jis0208<<14 | 0x10<<7 | 0x0E,\n\t19986 - 19968: jis0212<<14 | 0x0F<<7 | 0x04,\n\t19988 - 19968: jis0208<<14 | 0x12<<7 | 0x4D,\n\t19989 - 19968: jis0208<<14 | 0x2F<<7 | 0x02,\n\t19990 - 19968: jis0208<<14 | 0x1F<<7 | 0x03,\n\t19991 - 19968: jis0208<<14 | 0x31<<7 | 0x21,\n\t19992 - 19968: jis0208<<14 | 0x14<<7 | 0x35,\n\t19993 - 19968: jis0208<<14 | 0x29<<7 | 0x19,\n\t19998 - 19968: jis0208<<14 | 0x1D<<7 | 0x46,\n\t19999 - 19968: jis0212<<14 | 0x0F<<7 | 0x05,\n\t20001 - 19968: jis0208<<14 | 0x2D<<7 | 0x1D,\n\t20003 - 19968: jis0212<<14 | 0x0F<<7 | 0x06,\n\t20004 - 19968: jis0212<<14 | 0x0F<<7 | 0x07,\n\t20006 - 19968: jis0208<<14 | 0x29<<7 | 0x21,\n\t20008 - 19968: jis0208<<14 | 0x58<<7 | 0x0C,\n\t20010 - 19968: jis0208<<14 | 0x2F<<7 | 0x03,\n\t20011 - 19968: jis0212<<14 | 0x0F<<7 | 0x09,\n\t20013 - 19968: jis0208<<14 | 0x22<<7 | 0x45,\n\t20014 - 19968: jis0212<<14 | 0x0F<<7 | 0x0A,\n\t20015 - 19968: jis0212<<14 | 0x0F<<7 | 0x0B,\n\t20016 - 19968: jis0212<<14 | 0x0F<<7 | 0x0C,\n\t20017 - 19968: jis0208<<14 | 0x2F<<7 | 0x04,\n\t20018 - 19968: jis0208<<14 | 0x15<<7 | 0x59,\n\t20021 - 19968: jis0212<<14 | 0x0F<<7 | 0x0D,\n\t20022 - 19968: jis0208<<14 | 0x2F<<7 | 0x05,\n\t20024 - 19968: jis0208<<14 | 0x13<<7 | 0x3C,\n\t20025 - 19968: jis0208<<14 | 0x22<<7 | 0x0F,\n\t20027 - 19968: jis0208<<14 | 0x1B<<7 | 0x46,\n\t20028 - 19968: jis0208<<14 | 0x2F<<7 | 0x06,\n\t20031 - 19968: jis0208<<14 | 0x2F<<7 | 0x07,\n\t20032 - 19968: jis0212<<14 | 0x0F<<7 | 0x0E,\n\t20033 - 19968: jis0212<<14 | 0x0F<<7 | 0x0F,\n\t20034 - 19968: jis0208<<14 | 0x2F<<7 | 0x08,\n\t20035 - 19968: jis0208<<14 | 0x26<<7 | 0x14,\n\t20036 - 19968: jis0212<<14 | 0x0F<<7 | 0x10,\n\t20037 - 19968: jis0208<<14 | 0x14<<7 | 0x36,\n\t20039 - 19968: jis0212<<14 | 0x0F<<7 | 0x11,\n\t20043 - 19968: jis0208<<14 | 0x26<<7 | 0x16,\n\t20045 - 19968: jis0208<<14 | 0x25<<7 | 0x42,\n\t20046 - 19968: jis0208<<14 | 0x17<<7 | 0x22,\n\t20047 - 19968: jis0208<<14 | 0x2A<<7 | 0x12,\n\t20049 - 19968: jis0212<<14 | 0x0F<<7 | 0x12,\n\t20053 - 19968: jis0208<<14 | 0x48<<7 | 0x28,\n\t20054 - 19968: jis0208<<14 | 0x2F<<7 | 0x09,\n\t20055 - 19968: jis0208<<14 | 0x1D<<7 | 0x47,\n\t20056 - 19968: jis0208<<14 | 0x2F<<7 | 0x0A,\n\t20057 - 19968: jis0208<<14 | 0x11<<7 | 0x14,\n\t20058 - 19968: jis0212<<14 | 0x0F<<7 | 0x13,\n\t20060 - 19968: jis0212<<14 | 0x0F<<7 | 0x14,\n\t20061 - 19968: jis0208<<14 | 0x15<<7 | 0x44,\n\t20062 - 19968: jis0208<<14 | 0x17<<7 | 0x4F,\n\t20063 - 19968: jis0208<<14 | 0x2B<<7 | 0x48,\n\t20066 - 19968: jis0208<<14 | 0x35<<7 | 0x05,\n\t20067 - 19968: jis0212<<14 | 0x0F<<7 | 0x15,\n\t20072 - 19968: jis0212<<14 | 0x0F<<7 | 0x16,\n\t20073 - 19968: jis0212<<14 | 0x0F<<7 | 0x17,\n\t20081 - 19968: jis0208<<14 | 0x2C<<7 | 0x4F,\n\t20083 - 19968: jis0208<<14 | 0x25<<7 | 0x5C,\n\t20084 - 19968: jis0212<<14 | 0x0F<<7 | 0x18,\n\t20085 - 19968: jis0212<<14 | 0x0F<<7 | 0x19,\n\t20089 - 19968: jis0212<<14 | 0x0F<<7 | 0x1A,\n\t20094 - 19968: jis0208<<14 | 0x13<<7 | 0x04,\n\t20095 - 19968: jis0212<<14 | 0x0F<<7 | 0x1B,\n\t20096 - 19968: jis0208<<14 | 0x14<<7 | 0x14,\n\t20098 - 19968: jis0208<<14 | 0x2F<<7 | 0x0B,\n\t20101 - 19968: jis0208<<14 | 0x2F<<7 | 0x0C,\n\t20102 - 19968: jis0208<<14 | 0x2D<<7 | 0x1A,\n\t20104 - 19968: jis0208<<14 | 0x2C<<7 | 0x1C,\n\t20105 - 19968: jis0208<<14 | 0x20<<7 | 0x47,\n\t20106 - 19968: jis0208<<14 | 0x2F<<7 | 0x0E,\n\t20107 - 19968: jis0208<<14 | 0x1A<<7 | 0x55,\n\t20108 - 19968: jis0208<<14 | 0x25<<7 | 0x52,\n\t20109 - 19968: jis0212<<14 | 0x0F<<7 | 0x1C,\n\t20110 - 19968: jis0208<<14 | 0x2F<<7 | 0x11,\n\t20113 - 19968: jis0208<<14 | 0x10<<7 | 0x1D,\n\t20114 - 19968: jis0208<<14 | 0x17<<7 | 0x3E,\n\t20116 - 19968: jis0208<<14 | 0x17<<7 | 0x3D,\n\t20117 - 19968: jis0208<<14 | 0x0F<<7 | 0x45,\n\t20118 - 19968: jis0212<<14 | 0x0F<<7 | 0x1D,\n\t20119 - 19968: jis0212<<14 | 0x0F<<7 | 0x1E,\n\t20120 - 19968: jis0208<<14 | 0x2E<<7 | 0x2A,\n\t20121 - 19968: jis0208<<14 | 0x2E<<7 | 0x29,\n\t20123 - 19968: jis0208<<14 | 0x19<<7 | 0x12,\n\t20124 - 19968: jis0208<<14 | 0x0F<<7 | 0x00,\n\t20125 - 19968: jis0212<<14 | 0x0F<<7 | 0x1F,\n\t20126 - 19968: jis0208<<14 | 0x2F<<7 | 0x12,\n\t20127 - 19968: jis0208<<14 | 0x2F<<7 | 0x13,\n\t20128 - 19968: jis0208<<14 | 0x2F<<7 | 0x14,\n\t20129 - 19968: jis0208<<14 | 0x2A<<7 | 0x13,\n\t20130 - 19968: jis0208<<14 | 0x2F<<7 | 0x15,\n\t20132 - 19968: jis0208<<14 | 0x17<<7 | 0x51,\n\t20133 - 19968: jis0208<<14 | 0x0F<<7 | 0x46,\n\t20134 - 19968: jis0208<<14 | 0x2A<<7 | 0x51,\n\t20136 - 19968: jis0208<<14 | 0x14<<7 | 0x5B,\n\t20139 - 19968: jis0208<<14 | 0x14<<7 | 0x5C,\n\t20140 - 19968: jis0208<<14 | 0x14<<7 | 0x5D,\n\t20141 - 19968: jis0208<<14 | 0x23<<7 | 0x41,\n\t20142 - 19968: jis0208<<14 | 0x2D<<7 | 0x1B,\n\t20143 - 19968: jis0212<<14 | 0x0F<<7 | 0x20,\n\t20144 - 19968: jis0208<<14 | 0x2F<<7 | 0x16,\n\t20147 - 19968: jis0208<<14 | 0x2F<<7 | 0x17,\n\t20150 - 19968: jis0208<<14 | 0x2F<<7 | 0x18,\n\t20153 - 19968: jis0212<<14 | 0x0F<<7 | 0x21,\n\t20154 - 19968: jis0208<<14 | 0x1E<<7 | 0x2C,\n\t20160 - 19968: jis0208<<14 | 0x1C<<7 | 0x19,\n\t20161 - 19968: jis0208<<14 | 0x1E<<7 | 0x2D,\n\t20162 - 19968: jis0208<<14 | 0x2F<<7 | 0x1D,\n\t20163 - 19968: jis0212<<14 | 0x0F<<7 | 0x22,\n\t20164 - 19968: jis0208<<14 | 0x2F<<7 | 0x1B,\n\t20166 - 19968: jis0208<<14 | 0x2F<<7 | 0x1C,\n\t20167 - 19968: jis0208<<14 | 0x14<<7 | 0x37,\n\t20170 - 19968: jis0208<<14 | 0x19<<7 | 0x02,\n\t20171 - 19968: jis0208<<14 | 0x11<<7 | 0x4F,\n\t20173 - 19968: jis0208<<14 | 0x2F<<7 | 0x1A,\n\t20174 - 19968: jis0208<<14 | 0x2F<<7 | 0x19,\n\t20175 - 19968: jis0208<<14 | 0x29<<7 | 0x08,\n\t20176 - 19968: jis0212<<14 | 0x0F<<7 | 0x23,\n\t20180 - 19968: jis0208<<14 | 0x1A<<7 | 0x25,\n\t20181 - 19968: jis0208<<14 | 0x1A<<7 | 0x24,\n\t20182 - 19968: jis0208<<14 | 0x21<<7 | 0x1D,\n\t20183 - 19968: jis0208<<14 | 0x2F<<7 | 0x1E,\n\t20184 - 19968: jis0208<<14 | 0x28<<7 | 0x34,\n\t20185 - 19968: jis0208<<14 | 0x1F<<7 | 0x46,\n\t20186 - 19968: jis0212<<14 | 0x0F<<7 | 0x24,\n\t20187 - 19968: jis0212<<14 | 0x0F<<7 | 0x25,\n\t20189 - 19968: jis0208<<14 | 0x00<<7 | 0x17,\n\t20190 - 19968: jis0208<<14 | 0x2F<<7 | 0x1F,\n\t20191 - 19968: jis0208<<14 | 0x2F<<7 | 0x21,\n\t20192 - 19968: jis0212<<14 | 0x0F<<7 | 0x26,\n\t20193 - 19968: jis0208<<14 | 0x58<<7 | 0x0D,\n\t20194 - 19968: jis0212<<14 | 0x0F<<7 | 0x28,\n\t20195 - 19968: jis0208<<14 | 0x21<<7 | 0x44,\n\t20196 - 19968: jis0208<<14 | 0x2D<<7 | 0x40,\n\t20197 - 19968: jis0208<<14 | 0x0F<<7 | 0x29,\n\t20200 - 19968: jis0212<<14 | 0x0F<<7 | 0x29,\n\t20205 - 19968: jis0208<<14 | 0x2F<<7 | 0x20,\n\t20206 - 19968: jis0208<<14 | 0x11<<7 | 0x1D,\n\t20207 - 19968: jis0212<<14 | 0x0F<<7 | 0x2A,\n\t20208 - 19968: jis0208<<14 | 0x15<<7 | 0x23,\n\t20209 - 19968: jis0212<<14 | 0x0F<<7 | 0x2B,\n\t20210 - 19968: jis0208<<14 | 0x22<<7 | 0x46,\n\t20211 - 19968: jis0212<<14 | 0x0F<<7 | 0x2C,\n\t20213 - 19968: jis0212<<14 | 0x0F<<7 | 0x2D,\n\t20214 - 19968: jis0208<<14 | 0x16<<7 | 0x4E,\n\t20215 - 19968: jis0208<<14 | 0x2F<<7 | 0x22,\n\t20219 - 19968: jis0208<<14 | 0x26<<7 | 0x03,\n\t20220 - 19968: jis0208<<14 | 0x58<<7 | 0x0E,\n\t20221 - 19968: jis0212<<14 | 0x0F<<7 | 0x2E,\n\t20222 - 19968: jis0212<<14 | 0x0F<<7 | 0x2F,\n\t20223 - 19968: jis0212<<14 | 0x0F<<7 | 0x30,\n\t20224 - 19968: jis0208<<14 | 0x58<<7 | 0x0F,\n\t20225 - 19968: jis0208<<14 | 0x13<<7 | 0x4A,\n\t20226 - 19968: jis0212<<14 | 0x0F<<7 | 0x32,\n\t20227 - 19968: jis0208<<14 | 0x58<<7 | 0x10,\n\t20232 - 19968: jis0212<<14 | 0x0F<<7 | 0x34,\n\t20233 - 19968: jis0208<<14 | 0x2F<<7 | 0x23,\n\t20234 - 19968: jis0208<<14 | 0x0F<<7 | 0x2A,\n\t20235 - 19968: jis0212<<14 | 0x0F<<7 | 0x35,\n\t20236 - 19968: jis0212<<14 | 0x0F<<7 | 0x36,\n\t20237 - 19968: jis0208<<14 | 0x17<<7 | 0x3F,\n\t20238 - 19968: jis0208<<14 | 0x13<<7 | 0x4B,\n\t20239 - 19968: jis0208<<14 | 0x28<<7 | 0x59,\n\t20240 - 19968: jis0208<<14 | 0x27<<7 | 0x11,\n\t20241 - 19968: jis0208<<14 | 0x14<<7 | 0x38,\n\t20242 - 19968: jis0212<<14 | 0x0F<<7 | 0x37,\n\t20245 - 19968: jis0212<<14 | 0x0F<<7 | 0x38,\n\t20246 - 19968: jis0212<<14 | 0x0F<<7 | 0x39,\n\t20247 - 19968: jis0212<<14 | 0x0F<<7 | 0x3A,\n\t20249 - 19968: jis0212<<14 | 0x0F<<7 | 0x3B,\n\t20250 - 19968: jis0208<<14 | 0x11<<7 | 0x50,\n\t20252 - 19968: jis0208<<14 | 0x2F<<7 | 0x46,\n\t20253 - 19968: jis0208<<14 | 0x24<<7 | 0x20,\n\t20270 - 19968: jis0212<<14 | 0x0F<<7 | 0x3C,\n\t20271 - 19968: jis0208<<14 | 0x26<<7 | 0x4B,\n\t20272 - 19968: jis0208<<14 | 0x2F<<7 | 0x25,\n\t20273 - 19968: jis0212<<14 | 0x0F<<7 | 0x3D,\n\t20275 - 19968: jis0212<<14 | 0x0F<<7 | 0x3F,\n\t20276 - 19968: jis0208<<14 | 0x27<<7 | 0x1B,\n\t20277 - 19968: jis0212<<14 | 0x0F<<7 | 0x40,\n\t20278 - 19968: jis0208<<14 | 0x2D<<7 | 0x41,\n\t20279 - 19968: jis0212<<14 | 0x0F<<7 | 0x41,\n\t20280 - 19968: jis0208<<14 | 0x1E<<7 | 0x0C,\n\t20281 - 19968: jis0208<<14 | 0x58<<7 | 0x11,\n\t20282 - 19968: jis0208<<14 | 0x1A<<7 | 0x26,\n\t20283 - 19968: jis0212<<14 | 0x0F<<7 | 0x43,\n\t20284 - 19968: jis0208<<14 | 0x1A<<7 | 0x56,\n\t20285 - 19968: jis0208<<14 | 0x11<<7 | 0x1F,\n\t20286 - 19968: jis0212<<14 | 0x0F<<7 | 0x44,\n\t20288 - 19968: jis0212<<14 | 0x0F<<7 | 0x45,\n\t20290 - 19968: jis0212<<14 | 0x0F<<7 | 0x46,\n\t20291 - 19968: jis0208<<14 | 0x23<<7 | 0x30,\n\t20294 - 19968: jis0208<<14 | 0x22<<7 | 0x01,\n\t20295 - 19968: jis0208<<14 | 0x2F<<7 | 0x29,\n\t20296 - 19968: jis0212<<14 | 0x0F<<7 | 0x47,\n\t20297 - 19968: jis0212<<14 | 0x0F<<7 | 0x48,\n\t20299 - 19968: jis0212<<14 | 0x0F<<7 | 0x49,\n\t20300 - 19968: jis0212<<14 | 0x0F<<7 | 0x4A,\n\t20301 - 19968: jis0208<<14 | 0x0F<<7 | 0x2B,\n\t20302 - 19968: jis0208<<14 | 0x23<<7 | 0x42,\n\t20303 - 19968: jis0208<<14 | 0x1C<<7 | 0x1A,\n\t20304 - 19968: jis0208<<14 | 0x19<<7 | 0x13,\n\t20305 - 19968: jis0208<<14 | 0x2C<<7 | 0x03,\n\t20306 - 19968: jis0212<<14 | 0x0F<<7 | 0x4B,\n\t20307 - 19968: jis0208<<14 | 0x21<<7 | 0x2D,\n\t20308 - 19968: jis0212<<14 | 0x0F<<7 | 0x4C,\n\t20309 - 19968: jis0208<<14 | 0x11<<7 | 0x1E,\n\t20310 - 19968: jis0208<<14 | 0x58<<7 | 0x12,\n\t20311 - 19968: jis0208<<14 | 0x2F<<7 | 0x28,\n\t20312 - 19968: jis0212<<14 | 0x0F<<7 | 0x4E,\n\t20313 - 19968: jis0208<<14 | 0x2C<<7 | 0x1D,\n\t20314 - 19968: jis0208<<14 | 0x2F<<7 | 0x24,\n\t20315 - 19968: jis0208<<14 | 0x2F<<7 | 0x26,\n\t20316 - 19968: jis0208<<14 | 0x19<<7 | 0x4D,\n\t20317 - 19968: jis0208<<14 | 0x2F<<7 | 0x27,\n\t20318 - 19968: jis0208<<14 | 0x34<<7 | 0x03,\n\t20319 - 19968: jis0212<<14 | 0x0F<<7 | 0x4F,\n\t20320 - 19968: jis0212<<14 | 0x0F<<7 | 0x3E,\n\t20323 - 19968: jis0212<<14 | 0x0F<<7 | 0x50,\n\t20329 - 19968: jis0208<<14 | 0x2F<<7 | 0x2F,\n\t20330 - 19968: jis0212<<14 | 0x0F<<7 | 0x51,\n\t20332 - 19968: jis0212<<14 | 0x0F<<7 | 0x52,\n\t20334 - 19968: jis0212<<14 | 0x0F<<7 | 0x53,\n\t20335 - 19968: jis0208<<14 | 0x2F<<7 | 0x32,\n\t20336 - 19968: jis0208<<14 | 0x2F<<7 | 0x30,\n\t20337 - 19968: jis0212<<14 | 0x0F<<7 | 0x54,\n\t20339 - 19968: jis0208<<14 | 0x11<<7 | 0x21,\n\t20341 - 19968: jis0208<<14 | 0x29<<7 | 0x1A,\n\t20342 - 19968: jis0208<<14 | 0x2F<<7 | 0x2A,\n\t20343 - 19968: jis0212<<14 | 0x0F<<7 | 0x55,\n\t20344 - 19968: jis0212<<14 | 0x0F<<7 | 0x56,\n\t20345 - 19968: jis0212<<14 | 0x0F<<7 | 0x57,\n\t20346 - 19968: jis0212<<14 | 0x0F<<7 | 0x58,\n\t20347 - 19968: jis0208<<14 | 0x2F<<7 | 0x2E,\n\t20348 - 19968: jis0208<<14 | 0x17<<7 | 0x52,\n\t20349 - 19968: jis0212<<14 | 0x0F<<7 | 0x59,\n\t20350 - 19968: jis0212<<14 | 0x0F<<7 | 0x5A,\n\t20351 - 19968: jis0208<<14 | 0x1A<<7 | 0x27,\n\t20353 - 19968: jis0212<<14 | 0x0F<<7 | 0x5B,\n\t20354 - 19968: jis0212<<14 | 0x0F<<7 | 0x5C,\n\t20355 - 19968: jis0208<<14 | 0x13<<7 | 0x05,\n\t20356 - 19968: jis0212<<14 | 0x0F<<7 | 0x5D,\n\t20357 - 19968: jis0212<<14 | 0x10<<7 | 0x00,\n\t20358 - 19968: jis0208<<14 | 0x2F<<7 | 0x33,\n\t20360 - 19968: jis0208<<14 | 0x2F<<7 | 0x2B,\n\t20361 - 19968: jis0212<<14 | 0x10<<7 | 0x01,\n\t20362 - 19968: jis0208<<14 | 0x58<<7 | 0x14,\n\t20363 - 19968: jis0208<<14 | 0x2D<<7 | 0x42,\n\t20364 - 19968: jis0212<<14 | 0x10<<7 | 0x03,\n\t20365 - 19968: jis0208<<14 | 0x1A<<7 | 0x57,\n\t20366 - 19968: jis0212<<14 | 0x10<<7 | 0x04,\n\t20367 - 19968: jis0208<<14 | 0x2F<<7 | 0x2C,\n\t20368 - 19968: jis0212<<14 | 0x10<<7 | 0x05,\n\t20369 - 19968: jis0208<<14 | 0x2F<<7 | 0x31,\n\t20370 - 19968: jis0208<<14 | 0x58<<7 | 0x13,\n\t20371 - 19968: jis0212<<14 | 0x10<<7 | 0x07,\n\t20372 - 19968: jis0208<<14 | 0x58<<7 | 0x16,\n\t20374 - 19968: jis0208<<14 | 0x2F<<7 | 0x34,\n\t20375 - 19968: jis0212<<14 | 0x10<<7 | 0x09,\n\t20376 - 19968: jis0208<<14 | 0x2F<<7 | 0x2D,\n\t20377 - 19968: jis0212<<14 | 0x10<<7 | 0x0A,\n\t20378 - 19968: jis0208<<14 | 0x58<<7 | 0x15,\n\t20379 - 19968: jis0208<<14 | 0x15<<7 | 0x00,\n\t20381 - 19968: jis0208<<14 | 0x0F<<7 | 0x2C,\n\t20382 - 19968: jis0212<<14 | 0x10<<7 | 0x0C,\n\t20383 - 19968: jis0212<<14 | 0x10<<7 | 0x0D,\n\t20384 - 19968: jis0208<<14 | 0x15<<7 | 0x01,\n\t20385 - 19968: jis0208<<14 | 0x11<<7 | 0x20,\n\t20395 - 19968: jis0208<<14 | 0x34<<7 | 0x04,\n\t20397 - 19968: jis0208<<14 | 0x2A<<7 | 0x58,\n\t20398 - 19968: jis0208<<14 | 0x28<<7 | 0x4D,\n\t20399 - 19968: jis0208<<14 | 0x17<<7 | 0x53,\n\t20402 - 19968: jis0212<<14 | 0x10<<7 | 0x0E,\n\t20405 - 19968: jis0208<<14 | 0x1E<<7 | 0x0E,\n\t20406 - 19968: jis0208<<14 | 0x2D<<7 | 0x16,\n\t20407 - 19968: jis0212<<14 | 0x10<<7 | 0x0F,\n\t20409 - 19968: jis0212<<14 | 0x10<<7 | 0x10,\n\t20411 - 19968: jis0212<<14 | 0x10<<7 | 0x11,\n\t20412 - 19968: jis0212<<14 | 0x10<<7 | 0x12,\n\t20413 - 19968: jis0212<<14 | 0x10<<7 | 0x13,\n\t20414 - 19968: jis0212<<14 | 0x10<<7 | 0x14,\n\t20415 - 19968: jis0208<<14 | 0x29<<7 | 0x37,\n\t20416 - 19968: jis0212<<14 | 0x10<<7 | 0x15,\n\t20417 - 19968: jis0212<<14 | 0x10<<7 | 0x16,\n\t20418 - 19968: jis0208<<14 | 0x16<<7 | 0x17,\n\t20419 - 19968: jis0208<<14 | 0x21<<7 | 0x04,\n\t20420 - 19968: jis0208<<14 | 0x11<<7 | 0x43,\n\t20421 - 19968: jis0212<<14 | 0x10<<7 | 0x17,\n\t20422 - 19968: jis0212<<14 | 0x10<<7 | 0x18,\n\t20424 - 19968: jis0212<<14 | 0x10<<7 | 0x19,\n\t20425 - 19968: jis0208<<14 | 0x58<<7 | 0x05,\n\t20426 - 19968: jis0208<<14 | 0x1C<<7 | 0x32,\n\t20427 - 19968: jis0212<<14 | 0x10<<7 | 0x1B,\n\t20428 - 19968: jis0212<<14 | 0x10<<7 | 0x1C,\n\t20429 - 19968: jis0208<<14 | 0x58<<7 | 0x17,\n\t20430 - 19968: jis0208<<14 | 0x2F<<7 | 0x38,\n\t20431 - 19968: jis0212<<14 | 0x10<<7 | 0x1E,\n\t20432 - 19968: jis0208<<14 | 0x2F<<7 | 0x3D,\n\t20433 - 19968: jis0208<<14 | 0x2F<<7 | 0x3B,\n\t20434 - 19968: jis0212<<14 | 0x10<<7 | 0x1F,\n\t20436 - 19968: jis0208<<14 | 0x2F<<7 | 0x36,\n\t20439 - 19968: jis0208<<14 | 0x21<<7 | 0x0E,\n\t20440 - 19968: jis0208<<14 | 0x2F<<7 | 0x39,\n\t20442 - 19968: jis0208<<14 | 0x2F<<7 | 0x3C,\n\t20443 - 19968: jis0208<<14 | 0x2F<<7 | 0x3A,\n\t20444 - 19968: jis0212<<14 | 0x10<<7 | 0x20,\n\t20445 - 19968: jis0208<<14 | 0x29<<7 | 0x3C,\n\t20447 - 19968: jis0208<<14 | 0x2F<<7 | 0x37,\n\t20448 - 19968: jis0212<<14 | 0x10<<7 | 0x21,\n\t20449 - 19968: jis0208<<14 | 0x1E<<7 | 0x0D,\n\t20450 - 19968: jis0212<<14 | 0x10<<7 | 0x22,\n\t20451 - 19968: jis0208<<14 | 0x2A<<7 | 0x52,\n\t20452 - 19968: jis0208<<14 | 0x2F<<7 | 0x3E,\n\t20453 - 19968: jis0208<<14 | 0x2F<<7 | 0x3F,\n\t20462 - 19968: jis0208<<14 | 0x1C<<7 | 0x03,\n\t20463 - 19968: jis0208<<14 | 0x2F<<7 | 0x4C,\n\t20464 - 19968: jis0212<<14 | 0x10<<7 | 0x23,\n\t20466 - 19968: jis0212<<14 | 0x10<<7 | 0x24,\n\t20467 - 19968: jis0208<<14 | 0x26<<7 | 0x2F,\n\t20469 - 19968: jis0208<<14 | 0x28<<7 | 0x15,\n\t20470 - 19968: jis0208<<14 | 0x2F<<7 | 0x47,\n\t20472 - 19968: jis0208<<14 | 0x29<<7 | 0x4F,\n\t20474 - 19968: jis0208<<14 | 0x11<<7 | 0x15,\n\t20476 - 19968: jis0212<<14 | 0x10<<7 | 0x25,\n\t20477 - 19968: jis0212<<14 | 0x10<<7 | 0x26,\n\t20478 - 19968: jis0208<<14 | 0x2F<<7 | 0x4B,\n\t20479 - 19968: jis0208<<14 | 0x58<<7 | 0x1A,\n\t20480 - 19968: jis0212<<14 | 0x10<<7 | 0x28,\n\t20481 - 19968: jis0212<<14 | 0x10<<7 | 0x29,\n\t20484 - 19968: jis0212<<14 | 0x10<<7 | 0x2A,\n\t20485 - 19968: jis0208<<14 | 0x2F<<7 | 0x45,\n\t20486 - 19968: jis0208<<14 | 0x2F<<7 | 0x4E,\n\t20487 - 19968: jis0212<<14 | 0x10<<7 | 0x2B,\n\t20489 - 19968: jis0208<<14 | 0x20<<7 | 0x31,\n\t20490 - 19968: jis0212<<14 | 0x10<<7 | 0x2C,\n\t20491 - 19968: jis0208<<14 | 0x17<<7 | 0x23,\n\t20492 - 19968: jis0212<<14 | 0x10<<7 | 0x2D,\n\t20493 - 19968: jis0208<<14 | 0x26<<7 | 0x3B,\n\t20494 - 19968: jis0212<<14 | 0x10<<7 | 0x2E,\n\t20495 - 19968: jis0208<<14 | 0x3F<<7 | 0x26,\n\t20496 - 19968: jis0212<<14 | 0x10<<7 | 0x2F,\n\t20497 - 19968: jis0208<<14 | 0x2F<<7 | 0x4D,\n\t20498 - 19968: jis0208<<14 | 0x24<<7 | 0x3C,\n\t20499 - 19968: jis0212<<14 | 0x10<<7 | 0x30,\n\t20500 - 19968: jis0208<<14 | 0x2F<<7 | 0x42,\n\t20502 - 19968: jis0208<<14 | 0x17<<7 | 0x55,\n\t20503 - 19968: jis0212<<14 | 0x10<<7 | 0x31,\n\t20504 - 19968: jis0212<<14 | 0x10<<7 | 0x32,\n\t20505 - 19968: jis0208<<14 | 0x17<<7 | 0x54,\n\t20506 - 19968: jis0208<<14 | 0x2F<<7 | 0x40,\n\t20507 - 19968: jis0212<<14 | 0x10<<7 | 0x33,\n\t20508 - 19968: jis0212<<14 | 0x10<<7 | 0x34,\n\t20509 - 19968: jis0212<<14 | 0x10<<7 | 0x35,\n\t20510 - 19968: jis0208<<14 | 0x58<<7 | 0x1B,\n\t20511 - 19968: jis0208<<14 | 0x1B<<7 | 0x39,\n\t20513 - 19968: jis0208<<14 | 0x2F<<7 | 0x48,\n\t20514 - 19968: jis0208<<14 | 0x58<<7 | 0x19,\n\t20515 - 19968: jis0208<<14 | 0x29<<7 | 0x4E,\n\t20516 - 19968: jis0208<<14 | 0x22<<7 | 0x2C,\n\t20517 - 19968: jis0208<<14 | 0x2F<<7 | 0x44,\n\t20518 - 19968: jis0208<<14 | 0x16<<7 | 0x50,\n\t20519 - 19968: jis0212<<14 | 0x10<<7 | 0x38,\n\t20520 - 19968: jis0208<<14 | 0x2F<<7 | 0x41,\n\t20521 - 19968: jis0208<<14 | 0x2F<<7 | 0x49,\n\t20522 - 19968: jis0208<<14 | 0x2F<<7 | 0x43,\n\t20523 - 19968: jis0208<<14 | 0x2D<<7 | 0x30,\n\t20524 - 19968: jis0208<<14 | 0x2F<<7 | 0x4A,\n\t20525 - 19968: jis0208<<14 | 0x2E<<7 | 0x20,\n\t20526 - 19968: jis0212<<14 | 0x10<<7 | 0x39,\n\t20528 - 19968: jis0212<<14 | 0x10<<7 | 0x3A,\n\t20530 - 19968: jis0212<<14 | 0x10<<7 | 0x3B,\n\t20531 - 19968: jis0212<<14 | 0x10<<7 | 0x3C,\n\t20533 - 19968: jis0212<<14 | 0x10<<7 | 0x3D,\n\t20534 - 19968: jis0208<<14 | 0x15<<7 | 0x45,\n\t20537 - 19968: jis0208<<14 | 0x16<<7 | 0x4F,\n\t20539 - 19968: jis0212<<14 | 0x10<<7 | 0x55,\n\t20544 - 19968: jis0208<<14 | 0x58<<7 | 0x18,\n\t20545 - 19968: jis0212<<14 | 0x10<<7 | 0x3F,\n\t20546 - 19968: jis0208<<14 | 0x58<<7 | 0x1E,\n\t20547 - 19968: jis0208<<14 | 0x2F<<7 | 0x4F,\n\t20549 - 19968: jis0212<<14 | 0x10<<7 | 0x41,\n\t20550 - 19968: jis0208<<14 | 0x58<<7 | 0x1C,\n\t20551 - 19968: jis0208<<14 | 0x2F<<7 | 0x50,\n\t20552 - 19968: jis0208<<14 | 0x2F<<7 | 0x54,\n\t20553 - 19968: jis0208<<14 | 0x0F<<7 | 0x2D,\n\t20554 - 19968: jis0212<<14 | 0x10<<7 | 0x43,\n\t20556 - 19968: jis0212<<14 | 0x10<<7 | 0x44,\n\t20558 - 19968: jis0212<<14 | 0x10<<7 | 0x45,\n\t20559 - 19968: jis0208<<14 | 0x29<<7 | 0x2F,\n\t20560 - 19968: jis0208<<14 | 0x2F<<7 | 0x53,\n\t20561 - 19968: jis0212<<14 | 0x10<<7 | 0x46,\n\t20562 - 19968: jis0212<<14 | 0x10<<7 | 0x47,\n\t20563 - 19968: jis0212<<14 | 0x10<<7 | 0x48,\n\t20565 - 19968: jis0208<<14 | 0x2F<<7 | 0x52,\n\t20566 - 19968: jis0208<<14 | 0x2F<<7 | 0x56,\n\t20567 - 19968: jis0212<<14 | 0x10<<7 | 0x49,\n\t20569 - 19968: jis0212<<14 | 0x10<<7 | 0x4A,\n\t20570 - 19968: jis0208<<14 | 0x2F<<7 | 0x55,\n\t20572 - 19968: jis0208<<14 | 0x23<<7 | 0x43,\n\t20575 - 19968: jis0212<<14 | 0x10<<7 | 0x4B,\n\t20576 - 19968: jis0212<<14 | 0x10<<7 | 0x4C,\n\t20578 - 19968: jis0212<<14 | 0x10<<7 | 0x4D,\n\t20579 - 19968: jis0212<<14 | 0x10<<7 | 0x4E,\n\t20581 - 19968: jis0208<<14 | 0x16<<7 | 0x51,\n\t20582 - 19968: jis0212<<14 | 0x10<<7 | 0x4F,\n\t20583 - 19968: jis0212<<14 | 0x10<<7 | 0x50,\n\t20586 - 19968: jis0212<<14 | 0x10<<7 | 0x51,\n\t20588 - 19968: jis0208<<14 | 0x2F<<7 | 0x57,\n\t20589 - 19968: jis0212<<14 | 0x10<<7 | 0x52,\n\t20592 - 19968: jis0208<<14 | 0x58<<7 | 0x1D,\n\t20593 - 19968: jis0212<<14 | 0x10<<7 | 0x54,\n\t20594 - 19968: jis0208<<14 | 0x1B<<7 | 0x24,\n\t20596 - 19968: jis0208<<14 | 0x21<<7 | 0x05,\n\t20597 - 19968: jis0208<<14 | 0x23<<7 | 0x44,\n\t20598 - 19968: jis0208<<14 | 0x15<<7 | 0x55,\n\t20600 - 19968: jis0208<<14 | 0x2F<<7 | 0x58,\n\t20605 - 19968: jis0208<<14 | 0x14<<7 | 0x15,\n\t20608 - 19968: jis0208<<14 | 0x2F<<7 | 0x59,\n\t20609 - 19968: jis0212<<14 | 0x10<<7 | 0x56,\n\t20611 - 19968: jis0212<<14 | 0x10<<7 | 0x57,\n\t20612 - 19968: jis0212<<14 | 0x10<<7 | 0x58,\n\t20613 - 19968: jis0208<<14 | 0x2F<<7 | 0x5B,\n\t20614 - 19968: jis0212<<14 | 0x10<<7 | 0x59,\n\t20618 - 19968: jis0212<<14 | 0x10<<7 | 0x5A,\n\t20621 - 19968: jis0208<<14 | 0x2A<<7 | 0x14,\n\t20622 - 19968: jis0212<<14 | 0x10<<7 | 0x5B,\n\t20623 - 19968: jis0212<<14 | 0x10<<7 | 0x5C,\n\t20624 - 19968: jis0212<<14 | 0x10<<7 | 0x5D,\n\t20625 - 19968: jis0208<<14 | 0x16<<7 | 0x45,\n\t20626 - 19968: jis0212<<14 | 0x11<<7 | 0x00,\n\t20627 - 19968: jis0212<<14 | 0x11<<7 | 0x01,\n\t20628 - 19968: jis0208<<14 | 0x58<<7 | 0x1F,\n\t20630 - 19968: jis0212<<14 | 0x11<<7 | 0x03,\n\t20632 - 19968: jis0208<<14 | 0x1A<<7 | 0x10,\n\t20633 - 19968: jis0208<<14 | 0x27<<7 | 0x56,\n\t20634 - 19968: jis0208<<14 | 0x2F<<7 | 0x5A,\n\t20635 - 19968: jis0212<<14 | 0x11<<7 | 0x04,\n\t20636 - 19968: jis0212<<14 | 0x11<<7 | 0x05,\n\t20638 - 19968: jis0212<<14 | 0x11<<7 | 0x06,\n\t20639 - 19968: jis0212<<14 | 0x11<<7 | 0x07,\n\t20640 - 19968: jis0212<<14 | 0x11<<7 | 0x08,\n\t20641 - 19968: jis0212<<14 | 0x11<<7 | 0x09,\n\t20642 - 19968: jis0212<<14 | 0x11<<7 | 0x0A,\n\t20650 - 19968: jis0212<<14 | 0x11<<7 | 0x0B,\n\t20652 - 19968: jis0208<<14 | 0x19<<7 | 0x24,\n\t20653 - 19968: jis0208<<14 | 0x2C<<7 | 0x22,\n\t20655 - 19968: jis0212<<14 | 0x11<<7 | 0x0C,\n\t20656 - 19968: jis0212<<14 | 0x11<<7 | 0x0D,\n\t20658 - 19968: jis0208<<14 | 0x2F<<7 | 0x5D,\n\t20659 - 19968: jis0208<<14 | 0x30<<7 | 0x02,\n\t20660 - 19968: jis0208<<14 | 0x2F<<7 | 0x5C,\n\t20661 - 19968: jis0208<<14 | 0x19<<7 | 0x23,\n\t20663 - 19968: jis0208<<14 | 0x1C<<7 | 0x5C,\n\t20665 - 19968: jis0212<<14 | 0x11<<7 | 0x0E,\n\t20666 - 19968: jis0212<<14 | 0x11<<7 | 0x0F,\n\t20669 - 19968: jis0212<<14 | 0x11<<7 | 0x10,\n\t20670 - 19968: jis0208<<14 | 0x16<<7 | 0x18,\n\t20672 - 19968: jis0212<<14 | 0x11<<7 | 0x11,\n\t20674 - 19968: jis0208<<14 | 0x30<<7 | 0x03,\n\t20675 - 19968: jis0212<<14 | 0x11<<7 | 0x12,\n\t20676 - 19968: jis0212<<14 | 0x11<<7 | 0x13,\n\t20677 - 19968: jis0208<<14 | 0x15<<7 | 0x2E,\n\t20679 - 19968: jis0212<<14 | 0x11<<7 | 0x14,\n\t20681 - 19968: jis0208<<14 | 0x30<<7 | 0x00,\n\t20682 - 19968: jis0208<<14 | 0x30<<7 | 0x01,\n\t20684 - 19968: jis0212<<14 | 0x11<<7 | 0x15,\n\t20685 - 19968: jis0208<<14 | 0x25<<7 | 0x0E,\n\t20686 - 19968: jis0212<<14 | 0x11<<7 | 0x16,\n\t20687 - 19968: jis0208<<14 | 0x20<<7 | 0x5B,\n\t20688 - 19968: jis0212<<14 | 0x11<<7 | 0x17,\n\t20689 - 19968: jis0208<<14 | 0x15<<7 | 0x02,\n\t20691 - 19968: jis0212<<14 | 0x11<<7 | 0x18,\n\t20692 - 19968: jis0212<<14 | 0x11<<7 | 0x19,\n\t20693 - 19968: jis0208<<14 | 0x2A<<7 | 0x2C,\n\t20694 - 19968: jis0208<<14 | 0x30<<7 | 0x04,\n\t20696 - 19968: jis0208<<14 | 0x58<<7 | 0x21,\n\t20698 - 19968: jis0208<<14 | 0x2D<<7 | 0x1C,\n\t20700 - 19968: jis0212<<14 | 0x11<<7 | 0x1B,\n\t20701 - 19968: jis0212<<14 | 0x11<<7 | 0x1C,\n\t20702 - 19968: jis0208<<14 | 0x30<<7 | 0x05,\n\t20703 - 19968: jis0212<<14 | 0x11<<7 | 0x1D,\n\t20706 - 19968: jis0212<<14 | 0x11<<7 | 0x1E,\n\t20707 - 19968: jis0208<<14 | 0x30<<7 | 0x08,\n\t20708 - 19968: jis0212<<14 | 0x11<<7 | 0x1F,\n\t20709 - 19968: jis0208<<14 | 0x30<<7 | 0x06,\n\t20710 - 19968: jis0212<<14 | 0x11<<7 | 0x20,\n\t20711 - 19968: jis0208<<14 | 0x20<<7 | 0x2D,\n\t20712 - 19968: jis0212<<14 | 0x11<<7 | 0x21,\n\t20713 - 19968: jis0212<<14 | 0x11<<7 | 0x22,\n\t20717 - 19968: jis0208<<14 | 0x30<<7 | 0x07,\n\t20718 - 19968: jis0208<<14 | 0x30<<7 | 0x09,\n\t20719 - 19968: jis0212<<14 | 0x11<<7 | 0x23,\n\t20721 - 19968: jis0212<<14 | 0x11<<7 | 0x24,\n\t20722 - 19968: jis0212<<14 | 0x11<<7 | 0x30,\n\t20724 - 19968: jis0208<<14 | 0x58<<7 | 0x20,\n\t20725 - 19968: jis0208<<14 | 0x30<<7 | 0x0B,\n\t20726 - 19968: jis0212<<14 | 0x11<<7 | 0x25,\n\t20729 - 19968: jis0208<<14 | 0x30<<7 | 0x0A,\n\t20730 - 19968: jis0212<<14 | 0x11<<7 | 0x26,\n\t20731 - 19968: jis0208<<14 | 0x29<<7 | 0x27,\n\t20734 - 19968: jis0212<<14 | 0x11<<7 | 0x27,\n\t20736 - 19968: jis0208<<14 | 0x14<<7 | 0x16,\n\t20737 - 19968: jis0208<<14 | 0x30<<7 | 0x0D,\n\t20738 - 19968: jis0208<<14 | 0x30<<7 | 0x0E,\n\t20739 - 19968: jis0212<<14 | 0x11<<7 | 0x28,\n\t20740 - 19968: jis0208<<14 | 0x11<<7 | 0x0E,\n\t20742 - 19968: jis0212<<14 | 0x11<<7 | 0x29,\n\t20743 - 19968: jis0212<<14 | 0x11<<7 | 0x2A,\n\t20744 - 19968: jis0212<<14 | 0x11<<7 | 0x2B,\n\t20745 - 19968: jis0208<<14 | 0x30<<7 | 0x0C,\n\t20747 - 19968: jis0212<<14 | 0x11<<7 | 0x2C,\n\t20748 - 19968: jis0212<<14 | 0x11<<7 | 0x2D,\n\t20749 - 19968: jis0212<<14 | 0x11<<7 | 0x2E,\n\t20750 - 19968: jis0212<<14 | 0x11<<7 | 0x2F,\n\t20752 - 19968: jis0212<<14 | 0x11<<7 | 0x31,\n\t20754 - 19968: jis0208<<14 | 0x1B<<7 | 0x53,\n\t20756 - 19968: jis0208<<14 | 0x30<<7 | 0x11,\n\t20757 - 19968: jis0208<<14 | 0x30<<7 | 0x10,\n\t20758 - 19968: jis0208<<14 | 0x30<<7 | 0x0F,\n\t20759 - 19968: jis0212<<14 | 0x11<<7 | 0x32,\n\t20760 - 19968: jis0208<<14 | 0x2F<<7 | 0x35,\n\t20761 - 19968: jis0212<<14 | 0x11<<7 | 0x33,\n\t20762 - 19968: jis0208<<14 | 0x30<<7 | 0x12,\n\t20763 - 19968: jis0212<<14 | 0x11<<7 | 0x34,\n\t20764 - 19968: jis0212<<14 | 0x11<<7 | 0x35,\n\t20765 - 19968: jis0212<<14 | 0x11<<7 | 0x36,\n\t20766 - 19968: jis0212<<14 | 0x11<<7 | 0x37,\n\t20767 - 19968: jis0208<<14 | 0x1C<<7 | 0x5D,\n\t20769 - 19968: jis0208<<14 | 0x30<<7 | 0x13,\n\t20771 - 19968: jis0212<<14 | 0x11<<7 | 0x38,\n\t20775 - 19968: jis0212<<14 | 0x11<<7 | 0x39,\n\t20776 - 19968: jis0212<<14 | 0x11<<7 | 0x3A,\n\t20778 - 19968: jis0208<<14 | 0x2C<<7 | 0x04,\n\t20780 - 19968: jis0212<<14 | 0x11<<7 | 0x3B,\n\t20781 - 19968: jis0212<<14 | 0x11<<7 | 0x3C,\n\t20783 - 19968: jis0212<<14 | 0x11<<7 | 0x3D,\n\t20785 - 19968: jis0212<<14 | 0x11<<7 | 0x3E,\n\t20786 - 19968: jis0208<<14 | 0x2B<<7 | 0x38,\n\t20787 - 19968: jis0212<<14 | 0x11<<7 | 0x3F,\n\t20788 - 19968: jis0212<<14 | 0x11<<7 | 0x40,\n\t20789 - 19968: jis0212<<14 | 0x11<<7 | 0x41,\n\t20791 - 19968: jis0208<<14 | 0x30<<7 | 0x15,\n\t20792 - 19968: jis0212<<14 | 0x11<<7 | 0x42,\n\t20793 - 19968: jis0212<<14 | 0x11<<7 | 0x43,\n\t20794 - 19968: jis0208<<14 | 0x30<<7 | 0x14,\n\t20795 - 19968: jis0208<<14 | 0x30<<7 | 0x17,\n\t20796 - 19968: jis0208<<14 | 0x30<<7 | 0x16,\n\t20799 - 19968: jis0208<<14 | 0x30<<7 | 0x18,\n\t20800 - 19968: jis0208<<14 | 0x30<<7 | 0x19,\n\t20801 - 19968: jis0208<<14 | 0x0F<<7 | 0x53,\n\t20802 - 19968: jis0212<<14 | 0x11<<7 | 0x44,\n\t20803 - 19968: jis0208<<14 | 0x17<<7 | 0x14,\n\t20804 - 19968: jis0208<<14 | 0x16<<7 | 0x1A,\n\t20805 - 19968: jis0208<<14 | 0x1C<<7 | 0x1B,\n\t20806 - 19968: jis0208<<14 | 0x22<<7 | 0x5A,\n\t20807 - 19968: jis0208<<14 | 0x15<<7 | 0x03,\n\t20808 - 19968: jis0208<<14 | 0x1F<<7 | 0x47,\n\t20809 - 19968: jis0208<<14 | 0x17<<7 | 0x56,\n\t20810 - 19968: jis0208<<14 | 0x58<<7 | 0x22,\n\t20811 - 19968: jis0208<<14 | 0x18<<7 | 0x4D,\n\t20812 - 19968: jis0208<<14 | 0x30<<7 | 0x1B,\n\t20813 - 19968: jis0208<<14 | 0x2B<<7 | 0x27,\n\t20814 - 19968: jis0208<<14 | 0x24<<7 | 0x25,\n\t20815 - 19968: jis0212<<14 | 0x11<<7 | 0x46,\n\t20816 - 19968: jis0208<<14 | 0x1A<<7 | 0x58,\n\t20818 - 19968: jis0208<<14 | 0x30<<7 | 0x1A,\n\t20819 - 19968: jis0212<<14 | 0x11<<7 | 0x47,\n\t20820 - 19968: jis0208<<14 | 0x30<<7 | 0x1C,\n\t20821 - 19968: jis0212<<14 | 0x11<<7 | 0x48,\n\t20823 - 19968: jis0212<<14 | 0x11<<7 | 0x49,\n\t20824 - 19968: jis0212<<14 | 0x11<<7 | 0x4A,\n\t20826 - 19968: jis0208<<14 | 0x24<<7 | 0x3D,\n\t20828 - 19968: jis0208<<14 | 0x12<<7 | 0x54,\n\t20831 - 19968: jis0212<<14 | 0x11<<7 | 0x4B,\n\t20834 - 19968: jis0208<<14 | 0x30<<7 | 0x1D,\n\t20836 - 19968: jis0208<<14 | 0x58<<7 | 0x23,\n\t20837 - 19968: jis0208<<14 | 0x25<<7 | 0x5D,\n\t20838 - 19968: jis0212<<14 | 0x11<<7 | 0x4D,\n\t20840 - 19968: jis0208<<14 | 0x20<<7 | 0x13,\n\t20841 - 19968: jis0208<<14 | 0x30<<7 | 0x1F,\n\t20842 - 19968: jis0208<<14 | 0x30<<7 | 0x20,\n\t20843 - 19968: jis0208<<14 | 0x27<<7 | 0x0B,\n\t20844 - 19968: jis0208<<14 | 0x17<<7 | 0x57,\n\t20845 - 19968: jis0208<<14 | 0x2E<<7 | 0x1A,\n\t20846 - 19968: jis0208<<14 | 0x30<<7 | 0x21,\n\t20849 - 19968: jis0208<<14 | 0x15<<7 | 0x05,\n\t20853 - 19968: jis0208<<14 | 0x29<<7 | 0x1B,\n\t20854 - 19968: jis0208<<14 | 0x21<<7 | 0x15,\n\t20855 - 19968: jis0208<<14 | 0x15<<7 | 0x50,\n\t20856 - 19968: jis0208<<14 | 0x24<<7 | 0x14,\n\t20860 - 19968: jis0208<<14 | 0x16<<7 | 0x52,\n\t20862 - 19968: jis0212<<14 | 0x11<<7 | 0x4E,\n\t20864 - 19968: jis0208<<14 | 0x30<<7 | 0x22,\n\t20866 - 19968: jis0208<<14 | 0x30<<7 | 0x23,\n\t20867 - 19968: jis0212<<14 | 0x11<<7 | 0x4F,\n\t20868 - 19968: jis0212<<14 | 0x11<<7 | 0x50,\n\t20869 - 19968: jis0208<<14 | 0x25<<7 | 0x41,\n\t20870 - 19968: jis0208<<14 | 0x10<<7 | 0x3E,\n\t20873 - 19968: jis0208<<14 | 0x30<<7 | 0x26,\n\t20874 - 19968: jis0208<<14 | 0x19<<7 | 0x5C,\n\t20875 - 19968: jis0212<<14 | 0x11<<7 | 0x51,\n\t20876 - 19968: jis0208<<14 | 0x30<<7 | 0x25,\n\t20877 - 19968: jis0208<<14 | 0x19<<7 | 0x25,\n\t20878 - 19968: jis0212<<14 | 0x11<<7 | 0x52,\n\t20879 - 19968: jis0208<<14 | 0x30<<7 | 0x27,\n\t20880 - 19968: jis0208<<14 | 0x45<<7 | 0x4D,\n\t20881 - 19968: jis0208<<14 | 0x30<<7 | 0x28,\n\t20882 - 19968: jis0208<<14 | 0x2A<<7 | 0x20,\n\t20883 - 19968: jis0208<<14 | 0x30<<7 | 0x29,\n\t20885 - 19968: jis0208<<14 | 0x30<<7 | 0x2A,\n\t20886 - 19968: jis0208<<14 | 0x30<<7 | 0x2B,\n\t20887 - 19968: jis0208<<14 | 0x1D<<7 | 0x48,\n\t20888 - 19968: jis0212<<14 | 0x11<<7 | 0x53,\n\t20889 - 19968: jis0208<<14 | 0x1B<<7 | 0x2B,\n\t20893 - 19968: jis0208<<14 | 0x58<<7 | 0x24,\n\t20896 - 19968: jis0208<<14 | 0x13<<7 | 0x06,\n\t20897 - 19968: jis0212<<14 | 0x11<<7 | 0x55,\n\t20898 - 19968: jis0208<<14 | 0x30<<7 | 0x2E,\n\t20899 - 19968: jis0212<<14 | 0x11<<7 | 0x56,\n\t20900 - 19968: jis0208<<14 | 0x30<<7 | 0x2C,\n\t20901 - 19968: jis0208<<14 | 0x2B<<7 | 0x1C,\n\t20902 - 19968: jis0208<<14 | 0x30<<7 | 0x2D,\n\t20904 - 19968: jis0208<<14 | 0x28<<7 | 0x39,\n\t20905 - 19968: jis0208<<14 | 0x30<<7 | 0x2F,\n\t20906 - 19968: jis0208<<14 | 0x30<<7 | 0x30,\n\t20907 - 19968: jis0208<<14 | 0x30<<7 | 0x31,\n\t20908 - 19968: jis0208<<14 | 0x24<<7 | 0x3E,\n\t20909 - 19968: jis0212<<14 | 0x11<<7 | 0x57,\n\t20912 - 19968: jis0208<<14 | 0x30<<7 | 0x35,\n\t20913 - 19968: jis0208<<14 | 0x30<<7 | 0x33,\n\t20914 - 19968: jis0208<<14 | 0x30<<7 | 0x34,\n\t20915 - 19968: jis0208<<14 | 0x30<<7 | 0x32,\n\t20916 - 19968: jis0208<<14 | 0x19<<7 | 0x42,\n\t20917 - 19968: jis0208<<14 | 0x30<<7 | 0x36,\n\t20918 - 19968: jis0208<<14 | 0x2B<<7 | 0x49,\n\t20919 - 19968: jis0208<<14 | 0x2D<<7 | 0x43,\n\t20920 - 19968: jis0212<<14 | 0x11<<7 | 0x58,\n\t20922 - 19968: jis0212<<14 | 0x11<<7 | 0x59,\n\t20924 - 19968: jis0212<<14 | 0x11<<7 | 0x5A,\n\t20925 - 19968: jis0208<<14 | 0x30<<7 | 0x37,\n\t20926 - 19968: jis0208<<14 | 0x58<<7 | 0x25,\n\t20927 - 19968: jis0212<<14 | 0x11<<7 | 0x5C,\n\t20930 - 19968: jis0212<<14 | 0x11<<7 | 0x5D,\n\t20932 - 19968: jis0208<<14 | 0x1F<<7 | 0x07,\n\t20933 - 19968: jis0208<<14 | 0x30<<7 | 0x38,\n\t20934 - 19968: jis0208<<14 | 0x1C<<7 | 0x39,\n\t20936 - 19968: jis0212<<14 | 0x12<<7 | 0x00,\n\t20937 - 19968: jis0208<<14 | 0x30<<7 | 0x39,\n\t20939 - 19968: jis0208<<14 | 0x22<<7 | 0x5B,\n\t20940 - 19968: jis0208<<14 | 0x2D<<7 | 0x1E,\n\t20941 - 19968: jis0208<<14 | 0x24<<7 | 0x3F,\n\t20943 - 19968: jis0212<<14 | 0x12<<7 | 0x01,\n\t20945 - 19968: jis0212<<14 | 0x12<<7 | 0x02,\n\t20946 - 19968: jis0212<<14 | 0x12<<7 | 0x03,\n\t20947 - 19968: jis0212<<14 | 0x12<<7 | 0x04,\n\t20949 - 19968: jis0212<<14 | 0x12<<7 | 0x05,\n\t20950 - 19968: jis0208<<14 | 0x31<<7 | 0x24,\n\t20952 - 19968: jis0212<<14 | 0x12<<7 | 0x06,\n\t20955 - 19968: jis0208<<14 | 0x30<<7 | 0x3A,\n\t20956 - 19968: jis0208<<14 | 0x53<<7 | 0x04,\n\t20957 - 19968: jis0208<<14 | 0x15<<7 | 0x24,\n\t20958 - 19968: jis0212<<14 | 0x12<<7 | 0x07,\n\t20960 - 19968: jis0208<<14 | 0x30<<7 | 0x3B,\n\t20961 - 19968: jis0208<<14 | 0x2A<<7 | 0x3D,\n\t20962 - 19968: jis0212<<14 | 0x12<<7 | 0x08,\n\t20965 - 19968: jis0212<<14 | 0x12<<7 | 0x09,\n\t20966 - 19968: jis0208<<14 | 0x1C<<7 | 0x47,\n\t20967 - 19968: jis0208<<14 | 0x21<<7 | 0x5B,\n\t20969 - 19968: jis0208<<14 | 0x30<<7 | 0x3D,\n\t20970 - 19968: jis0208<<14 | 0x25<<7 | 0x43,\n\t20972 - 19968: jis0208<<14 | 0x58<<7 | 0x26,\n\t20973 - 19968: jis0208<<14 | 0x30<<7 | 0x3E,\n\t20974 - 19968: jis0212<<14 | 0x12<<7 | 0x0A,\n\t20976 - 19968: jis0208<<14 | 0x30<<7 | 0x3F,\n\t20977 - 19968: jis0208<<14 | 0x12<<7 | 0x0D,\n\t20978 - 19968: jis0212<<14 | 0x12<<7 | 0x0B,\n\t20979 - 19968: jis0212<<14 | 0x12<<7 | 0x0C,\n\t20980 - 19968: jis0212<<14 | 0x12<<7 | 0x0D,\n\t20981 - 19968: jis0208<<14 | 0x30<<7 | 0x40,\n\t20982 - 19968: jis0208<<14 | 0x15<<7 | 0x06,\n\t20983 - 19968: jis0212<<14 | 0x12<<7 | 0x0E,\n\t20984 - 19968: jis0208<<14 | 0x25<<7 | 0x2B,\n\t20985 - 19968: jis0208<<14 | 0x10<<7 | 0x59,\n\t20986 - 19968: jis0208<<14 | 0x1C<<7 | 0x2F,\n\t20989 - 19968: jis0208<<14 | 0x27<<7 | 0x00,\n\t20990 - 19968: jis0208<<14 | 0x30<<7 | 0x41,\n\t20992 - 19968: jis0208<<14 | 0x24<<7 | 0x40,\n\t20993 - 19968: jis0212<<14 | 0x12<<7 | 0x0F,\n\t20994 - 19968: jis0212<<14 | 0x12<<7 | 0x10,\n\t20995 - 19968: jis0208<<14 | 0x1E<<7 | 0x2E,\n\t20996 - 19968: jis0208<<14 | 0x30<<7 | 0x42,\n\t20997 - 19968: jis0212<<14 | 0x12<<7 | 0x11,\n\t20998 - 19968: jis0208<<14 | 0x29<<7 | 0x0B,\n\t20999 - 19968: jis0208<<14 | 0x1F<<7 | 0x39,\n\t21000 - 19968: jis0208<<14 | 0x13<<7 | 0x01,\n\t21002 - 19968: jis0208<<14 | 0x13<<7 | 0x08,\n\t21003 - 19968: jis0208<<14 | 0x30<<7 | 0x43,\n\t21006 - 19968: jis0208<<14 | 0x30<<7 | 0x45,\n\t21009 - 19968: jis0208<<14 | 0x16<<7 | 0x19,\n\t21010 - 19968: jis0212<<14 | 0x12<<7 | 0x12,\n\t21011 - 19968: jis0212<<14 | 0x12<<7 | 0x13,\n\t21012 - 19968: jis0208<<14 | 0x30<<7 | 0x44,\n\t21013 - 19968: jis0208<<14 | 0x58<<7 | 0x27,\n\t21014 - 19968: jis0212<<14 | 0x12<<7 | 0x15,\n\t21015 - 19968: jis0208<<14 | 0x2D<<7 | 0x52,\n\t21016 - 19968: jis0212<<14 | 0x12<<7 | 0x16,\n\t21021 - 19968: jis0208<<14 | 0x1C<<7 | 0x48,\n\t21026 - 19968: jis0212<<14 | 0x12<<7 | 0x17,\n\t21028 - 19968: jis0208<<14 | 0x27<<7 | 0x1C,\n\t21029 - 19968: jis0208<<14 | 0x29<<7 | 0x2B,\n\t21031 - 19968: jis0208<<14 | 0x30<<7 | 0x46,\n\t21032 - 19968: jis0212<<14 | 0x12<<7 | 0x18,\n\t21033 - 19968: jis0208<<14 | 0x2C<<7 | 0x57,\n\t21034 - 19968: jis0208<<14 | 0x30<<7 | 0x47,\n\t21038 - 19968: jis0208<<14 | 0x30<<7 | 0x48,\n\t21040 - 19968: jis0208<<14 | 0x24<<7 | 0x5D,\n\t21041 - 19968: jis0212<<14 | 0x12<<7 | 0x19,\n\t21042 - 19968: jis0212<<14 | 0x12<<7 | 0x1A,\n\t21043 - 19968: jis0208<<14 | 0x30<<7 | 0x49,\n\t21045 - 19968: jis0212<<14 | 0x12<<7 | 0x1B,\n\t21046 - 19968: jis0208<<14 | 0x1F<<7 | 0x08,\n\t21047 - 19968: jis0208<<14 | 0x19<<7 | 0x5D,\n\t21048 - 19968: jis0208<<14 | 0x16<<7 | 0x53,\n\t21049 - 19968: jis0208<<14 | 0x30<<7 | 0x4A,\n\t21050 - 19968: jis0208<<14 | 0x1A<<7 | 0x28,\n\t21051 - 19968: jis0208<<14 | 0x18<<7 | 0x4E,\n\t21052 - 19968: jis0212<<14 | 0x12<<7 | 0x1C,\n\t21059 - 19968: jis0208<<14 | 0x23<<7 | 0x45,\n\t21060 - 19968: jis0208<<14 | 0x30<<7 | 0x4C,\n\t21061 - 19968: jis0212<<14 | 0x12<<7 | 0x1D,\n\t21063 - 19968: jis0208<<14 | 0x21<<7 | 0x06,\n\t21065 - 19968: jis0212<<14 | 0x12<<7 | 0x1E,\n\t21066 - 19968: jis0208<<14 | 0x19<<7 | 0x4E,\n\t21067 - 19968: jis0208<<14 | 0x30<<7 | 0x4D,\n\t21068 - 19968: jis0208<<14 | 0x30<<7 | 0x4E,\n\t21069 - 19968: jis0208<<14 | 0x20<<7 | 0x0F,\n\t21071 - 19968: jis0208<<14 | 0x30<<7 | 0x4B,\n\t21076 - 19968: jis0208<<14 | 0x30<<7 | 0x50,\n\t21077 - 19968: jis0212<<14 | 0x12<<7 | 0x1F,\n\t21078 - 19968: jis0208<<14 | 0x2A<<7 | 0x15,\n\t21079 - 19968: jis0212<<14 | 0x12<<7 | 0x20,\n\t21080 - 19968: jis0212<<14 | 0x12<<7 | 0x21,\n\t21082 - 19968: jis0212<<14 | 0x12<<7 | 0x22,\n\t21083 - 19968: jis0208<<14 | 0x18<<7 | 0x43,\n\t21084 - 19968: jis0212<<14 | 0x12<<7 | 0x23,\n\t21086 - 19968: jis0208<<14 | 0x30<<7 | 0x4F,\n\t21087 - 19968: jis0212<<14 | 0x12<<7 | 0x24,\n\t21088 - 19968: jis0212<<14 | 0x12<<7 | 0x25,\n\t21089 - 19968: jis0212<<14 | 0x12<<7 | 0x26,\n\t21091 - 19968: jis0208<<14 | 0x16<<7 | 0x54,\n\t21092 - 19968: jis0208<<14 | 0x19<<7 | 0x3D,\n\t21093 - 19968: jis0208<<14 | 0x26<<7 | 0x4C,\n\t21094 - 19968: jis0212<<14 | 0x12<<7 | 0x27,\n\t21097 - 19968: jis0208<<14 | 0x30<<7 | 0x53,\n\t21098 - 19968: jis0208<<14 | 0x30<<7 | 0x51,\n\t21102 - 19968: jis0212<<14 | 0x12<<7 | 0x28,\n\t21103 - 19968: jis0208<<14 | 0x28<<7 | 0x5A,\n\t21104 - 19968: jis0208<<14 | 0x1D<<7 | 0x49,\n\t21105 - 19968: jis0208<<14 | 0x30<<7 | 0x5A,\n\t21106 - 19968: jis0208<<14 | 0x12<<7 | 0x43,\n\t21107 - 19968: jis0208<<14 | 0x30<<7 | 0x54,\n\t21108 - 19968: jis0208<<14 | 0x30<<7 | 0x52,\n\t21109 - 19968: jis0208<<14 | 0x20<<7 | 0x2E,\n\t21111 - 19968: jis0212<<14 | 0x12<<7 | 0x29,\n\t21112 - 19968: jis0212<<14 | 0x12<<7 | 0x2A,\n\t21113 - 19968: jis0212<<14 | 0x12<<7 | 0x2B,\n\t21117 - 19968: jis0208<<14 | 0x30<<7 | 0x56,\n\t21119 - 19968: jis0208<<14 | 0x30<<7 | 0x55,\n\t21120 - 19968: jis0212<<14 | 0x12<<7 | 0x2C,\n\t21122 - 19968: jis0212<<14 | 0x12<<7 | 0x2D,\n\t21123 - 19968: jis0208<<14 | 0x12<<7 | 0x23,\n\t21125 - 19968: jis0212<<14 | 0x12<<7 | 0x2E,\n\t21127 - 19968: jis0208<<14 | 0x16<<7 | 0x3F,\n\t21128 - 19968: jis0208<<14 | 0x30<<7 | 0x5B,\n\t21129 - 19968: jis0208<<14 | 0x2D<<7 | 0x0C,\n\t21130 - 19968: jis0212<<14 | 0x12<<7 | 0x2F,\n\t21132 - 19968: jis0212<<14 | 0x12<<7 | 0x30,\n\t21133 - 19968: jis0208<<14 | 0x30<<7 | 0x57,\n\t21137 - 19968: jis0208<<14 | 0x30<<7 | 0x5C,\n\t21138 - 19968: jis0208<<14 | 0x30<<7 | 0x59,\n\t21139 - 19968: jis0212<<14 | 0x12<<7 | 0x31,\n\t21140 - 19968: jis0208<<14 | 0x30<<7 | 0x58,\n\t21141 - 19968: jis0212<<14 | 0x12<<7 | 0x32,\n\t21142 - 19968: jis0212<<14 | 0x12<<7 | 0x33,\n\t21143 - 19968: jis0212<<14 | 0x12<<7 | 0x34,\n\t21144 - 19968: jis0212<<14 | 0x12<<7 | 0x35,\n\t21146 - 19968: jis0212<<14 | 0x12<<7 | 0x36,\n\t21147 - 19968: jis0208<<14 | 0x2D<<7 | 0x2E,\n\t21148 - 19968: jis0208<<14 | 0x58<<7 | 0x28,\n\t21151 - 19968: jis0208<<14 | 0x17<<7 | 0x58,\n\t21152 - 19968: jis0208<<14 | 0x11<<7 | 0x22,\n\t21155 - 19968: jis0208<<14 | 0x2D<<7 | 0x53,\n\t21156 - 19968: jis0212<<14 | 0x12<<7 | 0x38,\n\t21157 - 19968: jis0212<<14 | 0x12<<7 | 0x39,\n\t21158 - 19968: jis0208<<14 | 0x58<<7 | 0x29,\n\t21159 - 19968: jis0212<<14 | 0x12<<7 | 0x3B,\n\t21161 - 19968: jis0208<<14 | 0x1C<<7 | 0x54,\n\t21162 - 19968: jis0208<<14 | 0x24<<7 | 0x37,\n\t21163 - 19968: jis0208<<14 | 0x18<<7 | 0x44,\n\t21164 - 19968: jis0208<<14 | 0x31<<7 | 0x01,\n\t21165 - 19968: jis0208<<14 | 0x31<<7 | 0x02,\n\t21167 - 19968: jis0208<<14 | 0x5A<<7 | 0x1B,\n\t21168 - 19968: jis0212<<14 | 0x12<<7 | 0x3D,\n\t21169 - 19968: jis0208<<14 | 0x2D<<7 | 0x44,\n\t21172 - 19968: jis0208<<14 | 0x2E<<7 | 0x0A,\n\t21173 - 19968: jis0208<<14 | 0x31<<7 | 0x04,\n\t21174 - 19968: jis0212<<14 | 0x12<<7 | 0x3E,\n\t21175 - 19968: jis0212<<14 | 0x12<<7 | 0x3F,\n\t21176 - 19968: jis0212<<14 | 0x12<<7 | 0x40,\n\t21177 - 19968: jis0208<<14 | 0x17<<7 | 0x59,\n\t21178 - 19968: jis0212<<14 | 0x12<<7 | 0x41,\n\t21179 - 19968: jis0212<<14 | 0x12<<7 | 0x42,\n\t21180 - 19968: jis0208<<14 | 0x31<<7 | 0x03,\n\t21181 - 19968: jis0212<<14 | 0x12<<7 | 0x43,\n\t21182 - 19968: jis0208<<14 | 0x12<<7 | 0x0E,\n\t21184 - 19968: jis0208<<14 | 0x58<<7 | 0x2A,\n\t21185 - 19968: jis0208<<14 | 0x31<<7 | 0x05,\n\t21187 - 19968: jis0208<<14 | 0x2A<<7 | 0x35,\n\t21188 - 19968: jis0212<<14 | 0x12<<7 | 0x45,\n\t21189 - 19968: jis0208<<14 | 0x23<<7 | 0x1B,\n\t21190 - 19968: jis0212<<14 | 0x12<<7 | 0x46,\n\t21191 - 19968: jis0208<<14 | 0x2C<<7 | 0x05,\n\t21192 - 19968: jis0212<<14 | 0x12<<7 | 0x47,\n\t21193 - 19968: jis0208<<14 | 0x29<<7 | 0x38,\n\t21196 - 19968: jis0212<<14 | 0x12<<7 | 0x48,\n\t21197 - 19968: jis0208<<14 | 0x31<<7 | 0x06,\n\t21199 - 19968: jis0212<<14 | 0x12<<7 | 0x49,\n\t21201 - 19968: jis0212<<14 | 0x12<<7 | 0x4A,\n\t21202 - 19968: jis0208<<14 | 0x4F<<7 | 0x34,\n\t21204 - 19968: jis0212<<14 | 0x12<<7 | 0x4B,\n\t21205 - 19968: jis0208<<14 | 0x25<<7 | 0x0F,\n\t21206 - 19968: jis0212<<14 | 0x12<<7 | 0x4C,\n\t21207 - 19968: jis0208<<14 | 0x31<<7 | 0x07,\n\t21208 - 19968: jis0208<<14 | 0x13<<7 | 0x09,\n\t21209 - 19968: jis0208<<14 | 0x2B<<7 | 0x12,\n\t21211 - 19968: jis0208<<14 | 0x58<<7 | 0x2B,\n\t21212 - 19968: jis0212<<14 | 0x12<<7 | 0x4E,\n\t21213 - 19968: jis0208<<14 | 0x1D<<7 | 0x00,\n\t21214 - 19968: jis0208<<14 | 0x31<<7 | 0x08,\n\t21215 - 19968: jis0208<<14 | 0x29<<7 | 0x46,\n\t21216 - 19968: jis0208<<14 | 0x31<<7 | 0x0C,\n\t21217 - 19968: jis0212<<14 | 0x12<<7 | 0x4F,\n\t21218 - 19968: jis0208<<14 | 0x1F<<7 | 0x09,\n\t21219 - 19968: jis0208<<14 | 0x31<<7 | 0x09,\n\t21220 - 19968: jis0208<<14 | 0x15<<7 | 0x2F,\n\t21221 - 19968: jis0212<<14 | 0x12<<7 | 0x50,\n\t21222 - 19968: jis0208<<14 | 0x31<<7 | 0x0A,\n\t21223 - 19968: jis0208<<14 | 0x13<<7 | 0x0A,\n\t21224 - 19968: jis0212<<14 | 0x12<<7 | 0x51,\n\t21225 - 19968: jis0212<<14 | 0x12<<7 | 0x52,\n\t21226 - 19968: jis0212<<14 | 0x12<<7 | 0x53,\n\t21228 - 19968: jis0212<<14 | 0x12<<7 | 0x54,\n\t21232 - 19968: jis0212<<14 | 0x12<<7 | 0x55,\n\t21233 - 19968: jis0212<<14 | 0x12<<7 | 0x56,\n\t21234 - 19968: jis0208<<14 | 0x16<<7 | 0x0D,\n\t21235 - 19968: jis0208<<14 | 0x31<<7 | 0x0D,\n\t21236 - 19968: jis0212<<14 | 0x12<<7 | 0x57,\n\t21237 - 19968: jis0208<<14 | 0x31<<7 | 0x0E,\n\t21238 - 19968: jis0212<<14 | 0x12<<7 | 0x58,\n\t21239 - 19968: jis0212<<14 | 0x12<<7 | 0x59,\n\t21240 - 19968: jis0208<<14 | 0x31<<7 | 0x0F,\n\t21241 - 19968: jis0208<<14 | 0x31<<7 | 0x10,\n\t21242 - 19968: jis0208<<14 | 0x1B<<7 | 0x3A,\n\t21246 - 19968: jis0208<<14 | 0x17<<7 | 0x5A,\n\t21247 - 19968: jis0208<<14 | 0x2B<<7 | 0x3D,\n\t21248 - 19968: jis0208<<14 | 0x58<<7 | 0x2C,\n\t21249 - 19968: jis0208<<14 | 0x2B<<7 | 0x47,\n\t21250 - 19968: jis0208<<14 | 0x25<<7 | 0x56,\n\t21251 - 19968: jis0212<<14 | 0x12<<7 | 0x5B,\n\t21253 - 19968: jis0208<<14 | 0x29<<7 | 0x50,\n\t21254 - 19968: jis0208<<14 | 0x31<<7 | 0x11,\n\t21255 - 19968: jis0208<<14 | 0x58<<7 | 0x2D,\n\t21256 - 19968: jis0208<<14 | 0x31<<7 | 0x12,\n\t21258 - 19968: jis0212<<14 | 0x12<<7 | 0x5C,\n\t21259 - 19968: jis0212<<14 | 0x12<<7 | 0x5D,\n\t21260 - 19968: jis0212<<14 | 0x13<<7 | 0x00,\n\t21261 - 19968: jis0208<<14 | 0x31<<7 | 0x14,\n\t21263 - 19968: jis0208<<14 | 0x31<<7 | 0x16,\n\t21264 - 19968: jis0208<<14 | 0x31<<7 | 0x15,\n\t21265 - 19968: jis0212<<14 | 0x13<<7 | 0x01,\n\t21267 - 19968: jis0212<<14 | 0x13<<7 | 0x02,\n\t21269 - 19968: jis0208<<14 | 0x31<<7 | 0x17,\n\t21270 - 19968: jis0208<<14 | 0x11<<7 | 0x1C,\n\t21271 - 19968: jis0208<<14 | 0x2A<<7 | 0x2B,\n\t21272 - 19968: jis0212<<14 | 0x13<<7 | 0x03,\n\t21273 - 19968: jis0208<<14 | 0x19<<7 | 0x5B,\n\t21274 - 19968: jis0208<<14 | 0x31<<7 | 0x18,\n\t21275 - 19968: jis0212<<14 | 0x13<<7 | 0x04,\n\t21276 - 19968: jis0212<<14 | 0x13<<7 | 0x05,\n\t21277 - 19968: jis0208<<14 | 0x20<<7 | 0x38,\n\t21278 - 19968: jis0212<<14 | 0x13<<7 | 0x06,\n\t21279 - 19968: jis0212<<14 | 0x13<<7 | 0x07,\n\t21280 - 19968: jis0208<<14 | 0x1D<<7 | 0x01,\n\t21281 - 19968: jis0208<<14 | 0x15<<7 | 0x08,\n\t21283 - 19968: jis0208<<14 | 0x31<<7 | 0x19,\n\t21284 - 19968: jis0208<<14 | 0x58<<7 | 0x2E,\n\t21285 - 19968: jis0212<<14 | 0x13<<7 | 0x08,\n\t21287 - 19968: jis0212<<14 | 0x13<<7 | 0x09,\n\t21288 - 19968: jis0212<<14 | 0x13<<7 | 0x0A,\n\t21289 - 19968: jis0212<<14 | 0x13<<7 | 0x0B,\n\t21290 - 19968: jis0208<<14 | 0x27<<7 | 0x3A,\n\t21291 - 19968: jis0212<<14 | 0x13<<7 | 0x0C,\n\t21292 - 19968: jis0212<<14 | 0x13<<7 | 0x0D,\n\t21293 - 19968: jis0212<<14 | 0x13<<7 | 0x0E,\n\t21295 - 19968: jis0208<<14 | 0x31<<7 | 0x1A,\n\t21296 - 19968: jis0212<<14 | 0x13<<7 | 0x0F,\n\t21297 - 19968: jis0208<<14 | 0x31<<7 | 0x1B,\n\t21298 - 19968: jis0212<<14 | 0x13<<7 | 0x10,\n\t21299 - 19968: jis0208<<14 | 0x31<<7 | 0x1C,\n\t21301 - 19968: jis0212<<14 | 0x13<<7 | 0x11,\n\t21304 - 19968: jis0208<<14 | 0x31<<7 | 0x1D,\n\t21305 - 19968: jis0208<<14 | 0x28<<7 | 0x03,\n\t21306 - 19968: jis0208<<14 | 0x15<<7 | 0x47,\n\t21307 - 19968: jis0208<<14 | 0x0F<<7 | 0x44,\n\t21308 - 19968: jis0212<<14 | 0x13<<7 | 0x12,\n\t21309 - 19968: jis0212<<14 | 0x13<<7 | 0x13,\n\t21310 - 19968: jis0212<<14 | 0x13<<7 | 0x14,\n\t21311 - 19968: jis0208<<14 | 0x25<<7 | 0x1E,\n\t21312 - 19968: jis0208<<14 | 0x31<<7 | 0x1E,\n\t21313 - 19968: jis0208<<14 | 0x1C<<7 | 0x1C,\n\t21314 - 19968: jis0212<<14 | 0x13<<7 | 0x15,\n\t21315 - 19968: jis0208<<14 | 0x1F<<7 | 0x48,\n\t21317 - 19968: jis0208<<14 | 0x31<<7 | 0x20,\n\t21318 - 19968: jis0208<<14 | 0x31<<7 | 0x1F,\n\t21319 - 19968: jis0208<<14 | 0x1D<<7 | 0x02,\n\t21320 - 19968: jis0208<<14 | 0x17<<7 | 0x40,\n\t21321 - 19968: jis0208<<14 | 0x31<<7 | 0x22,\n\t21322 - 19968: jis0208<<14 | 0x27<<7 | 0x1D,\n\t21323 - 19968: jis0212<<14 | 0x13<<7 | 0x17,\n\t21324 - 19968: jis0212<<14 | 0x13<<7 | 0x16,\n\t21325 - 19968: jis0208<<14 | 0x31<<7 | 0x23,\n\t21329 - 19968: jis0208<<14 | 0x27<<7 | 0x3B,\n\t21330 - 19968: jis0208<<14 | 0x21<<7 | 0x13,\n\t21331 - 19968: jis0208<<14 | 0x21<<7 | 0x4D,\n\t21332 - 19968: jis0208<<14 | 0x15<<7 | 0x07,\n\t21335 - 19968: jis0208<<14 | 0x25<<7 | 0x4D,\n\t21336 - 19968: jis0208<<14 | 0x22<<7 | 0x10,\n\t21337 - 19968: jis0212<<14 | 0x13<<7 | 0x18,\n\t21338 - 19968: jis0208<<14 | 0x26<<7 | 0x4D,\n\t21339 - 19968: jis0212<<14 | 0x13<<7 | 0x19,\n\t21340 - 19968: jis0208<<14 | 0x2A<<7 | 0x2D,\n\t21342 - 19968: jis0208<<14 | 0x31<<7 | 0x25,\n\t21344 - 19968: jis0208<<14 | 0x1F<<7 | 0x49,\n\t21345 - 19968: jis0212<<14 | 0x13<<7 | 0x1A,\n\t21347 - 19968: jis0212<<14 | 0x13<<7 | 0x1B,\n\t21349 - 19968: jis0212<<14 | 0x13<<7 | 0x1C,\n\t21350 - 19968: jis0208<<14 | 0x16<<7 | 0x14,\n\t21353 - 19968: jis0208<<14 | 0x31<<7 | 0x26,\n\t21356 - 19968: jis0212<<14 | 0x13<<7 | 0x1D,\n\t21357 - 19968: jis0212<<14 | 0x13<<7 | 0x1E,\n\t21358 - 19968: jis0208<<14 | 0x31<<7 | 0x27,\n\t21359 - 19968: jis0208<<14 | 0x10<<7 | 0x0B,\n\t21360 - 19968: jis0208<<14 | 0x0F<<7 | 0x54,\n\t21361 - 19968: jis0208<<14 | 0x13<<7 | 0x4C,\n\t21362 - 19968: jis0208<<14 | 0x58<<7 | 0x2F,\n\t21363 - 19968: jis0208<<14 | 0x21<<7 | 0x07,\n\t21364 - 19968: jis0208<<14 | 0x14<<7 | 0x30,\n\t21365 - 19968: jis0208<<14 | 0x2C<<7 | 0x50,\n\t21367 - 19968: jis0208<<14 | 0x31<<7 | 0x2A,\n\t21368 - 19968: jis0208<<14 | 0x11<<7 | 0x16,\n\t21369 - 19968: jis0212<<14 | 0x13<<7 | 0x20,\n\t21371 - 19968: jis0208<<14 | 0x31<<7 | 0x29,\n\t21374 - 19968: jis0212<<14 | 0x13<<7 | 0x21,\n\t21375 - 19968: jis0208<<14 | 0x15<<7 | 0x09,\n\t21378 - 19968: jis0208<<14 | 0x31<<7 | 0x2B,\n\t21379 - 19968: jis0212<<14 | 0x13<<7 | 0x22,\n\t21380 - 19968: jis0208<<14 | 0x2B<<7 | 0x50,\n\t21383 - 19968: jis0212<<14 | 0x13<<7 | 0x23,\n\t21384 - 19968: jis0212<<14 | 0x13<<7 | 0x24,\n\t21390 - 19968: jis0212<<14 | 0x13<<7 | 0x25,\n\t21395 - 19968: jis0208<<14 | 0x58<<7 | 0x30,\n\t21396 - 19968: jis0212<<14 | 0x13<<7 | 0x27,\n\t21398 - 19968: jis0208<<14 | 0x31<<7 | 0x2C,\n\t21400 - 19968: jis0208<<14 | 0x2D<<7 | 0x31,\n\t21401 - 19968: jis0212<<14 | 0x13<<7 | 0x28,\n\t21402 - 19968: jis0208<<14 | 0x17<<7 | 0x5B,\n\t21405 - 19968: jis0212<<14 | 0x13<<7 | 0x29,\n\t21407 - 19968: jis0208<<14 | 0x17<<7 | 0x15,\n\t21408 - 19968: jis0208<<14 | 0x31<<7 | 0x2D,\n\t21409 - 19968: jis0212<<14 | 0x13<<7 | 0x2A,\n\t21412 - 19968: jis0212<<14 | 0x13<<7 | 0x2B,\n\t21413 - 19968: jis0208<<14 | 0x31<<7 | 0x2F,\n\t21414 - 19968: jis0208<<14 | 0x31<<7 | 0x2E,\n\t21416 - 19968: jis0208<<14 | 0x1E<<7 | 0x3E,\n\t21417 - 19968: jis0208<<14 | 0x10<<7 | 0x18,\n\t21418 - 19968: jis0212<<14 | 0x13<<7 | 0x2C,\n\t21419 - 19968: jis0212<<14 | 0x13<<7 | 0x2D,\n\t21421 - 19968: jis0208<<14 | 0x10<<7 | 0x3D,\n\t21422 - 19968: jis0208<<14 | 0x31<<7 | 0x30,\n\t21423 - 19968: jis0212<<14 | 0x13<<7 | 0x2E,\n\t21424 - 19968: jis0208<<14 | 0x31<<7 | 0x31,\n\t21426 - 19968: jis0208<<14 | 0x58<<7 | 0x31,\n\t21427 - 19968: jis0208<<14 | 0x17<<7 | 0x16,\n\t21428 - 19968: jis0212<<14 | 0x13<<7 | 0x30,\n\t21429 - 19968: jis0212<<14 | 0x13<<7 | 0x31,\n\t21430 - 19968: jis0208<<14 | 0x31<<7 | 0x32,\n\t21431 - 19968: jis0212<<14 | 0x13<<7 | 0x32,\n\t21432 - 19968: jis0212<<14 | 0x13<<7 | 0x33,\n\t21434 - 19968: jis0212<<14 | 0x13<<7 | 0x34,\n\t21435 - 19968: jis0208<<14 | 0x14<<7 | 0x4D,\n\t21437 - 19968: jis0212<<14 | 0x13<<7 | 0x35,\n\t21440 - 19968: jis0212<<14 | 0x13<<7 | 0x36,\n\t21442 - 19968: jis0208<<14 | 0x1A<<7 | 0x11,\n\t21443 - 19968: jis0208<<14 | 0x31<<7 | 0x33,\n\t21445 - 19968: jis0212<<14 | 0x13<<7 | 0x37,\n\t21448 - 19968: jis0208<<14 | 0x2A<<7 | 0x53,\n\t21449 - 19968: jis0208<<14 | 0x19<<7 | 0x14,\n\t21450 - 19968: jis0208<<14 | 0x14<<7 | 0x39,\n\t21451 - 19968: jis0208<<14 | 0x2C<<7 | 0x06,\n\t21452 - 19968: jis0208<<14 | 0x20<<7 | 0x2F,\n\t21453 - 19968: jis0208<<14 | 0x27<<7 | 0x1E,\n\t21454 - 19968: jis0208<<14 | 0x1B<<7 | 0x5C,\n\t21455 - 19968: jis0212<<14 | 0x13<<7 | 0x38,\n\t21458 - 19968: jis0212<<14 | 0x13<<7 | 0x39,\n\t21459 - 19968: jis0212<<14 | 0x13<<7 | 0x3A,\n\t21460 - 19968: jis0208<<14 | 0x1C<<7 | 0x26,\n\t21461 - 19968: jis0212<<14 | 0x13<<7 | 0x3B,\n\t21462 - 19968: jis0208<<14 | 0x1B<<7 | 0x47,\n\t21463 - 19968: jis0208<<14 | 0x1B<<7 | 0x54,\n\t21465 - 19968: jis0208<<14 | 0x1C<<7 | 0x55,\n\t21466 - 19968: jis0212<<14 | 0x13<<7 | 0x3C,\n\t21467 - 19968: jis0208<<14 | 0x27<<7 | 0x1F,\n\t21469 - 19968: jis0208<<14 | 0x58<<7 | 0x32,\n\t21470 - 19968: jis0212<<14 | 0x13<<7 | 0x3E,\n\t21471 - 19968: jis0208<<14 | 0x31<<7 | 0x36,\n\t21472 - 19968: jis0212<<14 | 0x13<<7 | 0x3F,\n\t21473 - 19968: jis0208<<14 | 0x10<<7 | 0x22,\n\t21474 - 19968: jis0208<<14 | 0x20<<7 | 0x30,\n\t21475 - 19968: jis0208<<14 | 0x17<<7 | 0x5C,\n\t21476 - 19968: jis0208<<14 | 0x17<<7 | 0x24,\n\t21477 - 19968: jis0208<<14 | 0x15<<7 | 0x46,\n\t21478 - 19968: jis0212<<14 | 0x13<<7 | 0x40,\n\t21479 - 19968: jis0212<<14 | 0x13<<7 | 0x41,\n\t21480 - 19968: jis0208<<14 | 0x31<<7 | 0x3A,\n\t21481 - 19968: jis0208<<14 | 0x22<<7 | 0x00,\n\t21482 - 19968: jis0208<<14 | 0x21<<7 | 0x5D,\n\t21483 - 19968: jis0208<<14 | 0x15<<7 | 0x0A,\n\t21484 - 19968: jis0208<<14 | 0x1D<<7 | 0x03,\n\t21485 - 19968: jis0208<<14 | 0x31<<7 | 0x3B,\n\t21486 - 19968: jis0208<<14 | 0x31<<7 | 0x39,\n\t21487 - 19968: jis0208<<14 | 0x11<<7 | 0x23,\n\t21488 - 19968: jis0208<<14 | 0x21<<7 | 0x45,\n\t21489 - 19968: jis0208<<14 | 0x1B<<7 | 0x17,\n\t21490 - 19968: jis0208<<14 | 0x1A<<7 | 0x2A,\n\t21491 - 19968: jis0208<<14 | 0x10<<7 | 0x05,\n\t21493 - 19968: jis0212<<14 | 0x13<<7 | 0x42,\n\t21494 - 19968: jis0208<<14 | 0x12<<7 | 0x4F,\n\t21495 - 19968: jis0208<<14 | 0x18<<7 | 0x45,\n\t21496 - 19968: jis0208<<14 | 0x1A<<7 | 0x29,\n\t21498 - 19968: jis0208<<14 | 0x31<<7 | 0x3C,\n\t21505 - 19968: jis0208<<14 | 0x31<<7 | 0x3D,\n\t21506 - 19968: jis0212<<14 | 0x13<<7 | 0x43,\n\t21507 - 19968: jis0208<<14 | 0x14<<7 | 0x28,\n\t21508 - 19968: jis0208<<14 | 0x12<<7 | 0x25,\n\t21512 - 19968: jis0208<<14 | 0x18<<7 | 0x46,\n\t21513 - 19968: jis0208<<14 | 0x14<<7 | 0x27,\n\t21514 - 19968: jis0208<<14 | 0x23<<7 | 0x3E,\n\t21515 - 19968: jis0208<<14 | 0x10<<7 | 0x04,\n\t21516 - 19968: jis0208<<14 | 0x25<<7 | 0x10,\n\t21517 - 19968: jis0208<<14 | 0x2B<<7 | 0x1D,\n\t21518 - 19968: jis0208<<14 | 0x18<<7 | 0x00,\n\t21519 - 19968: jis0208<<14 | 0x2C<<7 | 0x58,\n\t21520 - 19968: jis0208<<14 | 0x24<<7 | 0x26,\n\t21521 - 19968: jis0208<<14 | 0x17<<7 | 0x5D,\n\t21523 - 19968: jis0212<<14 | 0x13<<7 | 0x44,\n\t21530 - 19968: jis0212<<14 | 0x13<<7 | 0x45,\n\t21531 - 19968: jis0208<<14 | 0x16<<7 | 0x0E,\n\t21533 - 19968: jis0208<<14 | 0x31<<7 | 0x46,\n\t21535 - 19968: jis0208<<14 | 0x15<<7 | 0x42,\n\t21536 - 19968: jis0208<<14 | 0x2A<<7 | 0x29,\n\t21537 - 19968: jis0212<<14 | 0x13<<7 | 0x46,\n\t21542 - 19968: jis0208<<14 | 0x27<<7 | 0x3C,\n\t21543 - 19968: jis0212<<14 | 0x13<<7 | 0x47,\n\t21544 - 19968: jis0212<<14 | 0x13<<7 | 0x48,\n\t21545 - 19968: jis0208<<14 | 0x31<<7 | 0x45,\n\t21546 - 19968: jis0212<<14 | 0x13<<7 | 0x49,\n\t21547 - 19968: jis0208<<14 | 0x13<<7 | 0x3D,\n\t21548 - 19968: jis0208<<14 | 0x31<<7 | 0x40,\n\t21549 - 19968: jis0208<<14 | 0x31<<7 | 0x41,\n\t21550 - 19968: jis0208<<14 | 0x31<<7 | 0x43,\n\t21551 - 19968: jis0212<<14 | 0x13<<7 | 0x4A,\n\t21553 - 19968: jis0212<<14 | 0x13<<7 | 0x4B,\n\t21556 - 19968: jis0212<<14 | 0x13<<7 | 0x4C,\n\t21557 - 19968: jis0212<<14 | 0x13<<7 | 0x4D,\n\t21558 - 19968: jis0208<<14 | 0x31<<7 | 0x44,\n\t21560 - 19968: jis0208<<14 | 0x14<<7 | 0x3A,\n\t21561 - 19968: jis0208<<14 | 0x1E<<7 | 0x40,\n\t21563 - 19968: jis0208<<14 | 0x29<<7 | 0x0C,\n\t21564 - 19968: jis0208<<14 | 0x31<<7 | 0x42,\n\t21565 - 19968: jis0208<<14 | 0x31<<7 | 0x3E,\n\t21566 - 19968: jis0208<<14 | 0x17<<7 | 0x42,\n\t21568 - 19968: jis0208<<14 | 0x31<<7 | 0x3F,\n\t21570 - 19968: jis0208<<14 | 0x2E<<7 | 0x03,\n\t21571 - 19968: jis0212<<14 | 0x13<<7 | 0x4E,\n\t21572 - 19968: jis0212<<14 | 0x13<<7 | 0x4F,\n\t21574 - 19968: jis0208<<14 | 0x29<<7 | 0x51,\n\t21575 - 19968: jis0212<<14 | 0x13<<7 | 0x50,\n\t21576 - 19968: jis0208<<14 | 0x23<<7 | 0x47,\n\t21577 - 19968: jis0208<<14 | 0x17<<7 | 0x41,\n\t21578 - 19968: jis0208<<14 | 0x18<<7 | 0x4F,\n\t21581 - 19968: jis0212<<14 | 0x13<<7 | 0x51,\n\t21582 - 19968: jis0208<<14 | 0x31<<7 | 0x47,\n\t21583 - 19968: jis0212<<14 | 0x13<<7 | 0x52,\n\t21585 - 19968: jis0208<<14 | 0x25<<7 | 0x3C,\n\t21598 - 19968: jis0212<<14 | 0x13<<7 | 0x53,\n\t21599 - 19968: jis0208<<14 | 0x31<<7 | 0x4B,\n\t21602 - 19968: jis0212<<14 | 0x13<<7 | 0x54,\n\t21604 - 19968: jis0212<<14 | 0x13<<7 | 0x55,\n\t21606 - 19968: jis0212<<14 | 0x13<<7 | 0x56,\n\t21607 - 19968: jis0212<<14 | 0x13<<7 | 0x57,\n\t21608 - 19968: jis0208<<14 | 0x1B<<7 | 0x5D,\n\t21609 - 19968: jis0212<<14 | 0x13<<7 | 0x58,\n\t21610 - 19968: jis0208<<14 | 0x1B<<7 | 0x55,\n\t21611 - 19968: jis0212<<14 | 0x13<<7 | 0x59,\n\t21613 - 19968: jis0212<<14 | 0x13<<7 | 0x5A,\n\t21614 - 19968: jis0212<<14 | 0x13<<7 | 0x5B,\n\t21616 - 19968: jis0208<<14 | 0x31<<7 | 0x4E,\n\t21617 - 19968: jis0208<<14 | 0x31<<7 | 0x4C,\n\t21619 - 19968: jis0208<<14 | 0x2B<<7 | 0x02,\n\t21620 - 19968: jis0212<<14 | 0x13<<7 | 0x5C,\n\t21621 - 19968: jis0208<<14 | 0x31<<7 | 0x49,\n\t21622 - 19968: jis0208<<14 | 0x31<<7 | 0x52,\n\t21623 - 19968: jis0208<<14 | 0x31<<7 | 0x4D,\n\t21627 - 19968: jis0208<<14 | 0x31<<7 | 0x50,\n\t21628 - 19968: jis0208<<14 | 0x17<<7 | 0x25,\n\t21629 - 19968: jis0208<<14 | 0x2B<<7 | 0x1E,\n\t21631 - 19968: jis0212<<14 | 0x13<<7 | 0x5D,\n\t21632 - 19968: jis0208<<14 | 0x31<<7 | 0x51,\n\t21633 - 19968: jis0212<<14 | 0x14<<7 | 0x00,\n\t21635 - 19968: jis0212<<14 | 0x14<<7 | 0x01,\n\t21636 - 19968: jis0208<<14 | 0x31<<7 | 0x53,\n\t21637 - 19968: jis0212<<14 | 0x14<<7 | 0x02,\n\t21638 - 19968: jis0208<<14 | 0x31<<7 | 0x55,\n\t21640 - 19968: jis0212<<14 | 0x14<<7 | 0x03,\n\t21641 - 19968: jis0212<<14 | 0x14<<7 | 0x04,\n\t21642 - 19968: jis0208<<14 | 0x58<<7 | 0x35,\n\t21643 - 19968: jis0208<<14 | 0x19<<7 | 0x4F,\n\t21644 - 19968: jis0208<<14 | 0x2E<<7 | 0x21,\n\t21645 - 19968: jis0212<<14 | 0x14<<7 | 0x05,\n\t21646 - 19968: jis0208<<14 | 0x31<<7 | 0x4A,\n\t21647 - 19968: jis0208<<14 | 0x31<<7 | 0x48,\n\t21648 - 19968: jis0208<<14 | 0x31<<7 | 0x54,\n\t21649 - 19968: jis0212<<14 | 0x14<<7 | 0x06,\n\t21650 - 19968: jis0208<<14 | 0x31<<7 | 0x4F,\n\t21653 - 19968: jis0212<<14 | 0x14<<7 | 0x07,\n\t21654 - 19968: jis0212<<14 | 0x14<<7 | 0x08,\n\t21660 - 19968: jis0208<<14 | 0x58<<7 | 0x34,\n\t21663 - 19968: jis0212<<14 | 0x14<<7 | 0x0A,\n\t21665 - 19968: jis0212<<14 | 0x14<<7 | 0x0B,\n\t21666 - 19968: jis0208<<14 | 0x31<<7 | 0x57,\n\t21668 - 19968: jis0208<<14 | 0x32<<7 | 0x02,\n\t21669 - 19968: jis0208<<14 | 0x31<<7 | 0x59,\n\t21670 - 19968: jis0212<<14 | 0x14<<7 | 0x0C,\n\t21671 - 19968: jis0212<<14 | 0x14<<7 | 0x0D,\n\t21672 - 19968: jis0208<<14 | 0x31<<7 | 0x5D,\n\t21673 - 19968: jis0208<<14 | 0x58<<7 | 0x36,\n\t21674 - 19968: jis0212<<14 | 0x14<<7 | 0x0F,\n\t21675 - 19968: jis0208<<14 | 0x32<<7 | 0x00,\n\t21676 - 19968: jis0208<<14 | 0x31<<7 | 0x5A,\n\t21677 - 19968: jis0212<<14 | 0x14<<7 | 0x10,\n\t21678 - 19968: jis0212<<14 | 0x14<<7 | 0x11,\n\t21679 - 19968: jis0208<<14 | 0x32<<7 | 0x1D,\n\t21681 - 19968: jis0212<<14 | 0x14<<7 | 0x12,\n\t21682 - 19968: jis0208<<14 | 0x19<<7 | 0x48,\n\t21683 - 19968: jis0208<<14 | 0x12<<7 | 0x10,\n\t21687 - 19968: jis0212<<14 | 0x14<<7 | 0x13,\n\t21688 - 19968: jis0208<<14 | 0x31<<7 | 0x58,\n\t21689 - 19968: jis0212<<14 | 0x14<<7 | 0x14,\n\t21690 - 19968: jis0212<<14 | 0x14<<7 | 0x15,\n\t21691 - 19968: jis0212<<14 | 0x14<<7 | 0x16,\n\t21692 - 19968: jis0208<<14 | 0x32<<7 | 0x04,\n\t21693 - 19968: jis0208<<14 | 0x0F<<7 | 0x55,\n\t21694 - 19968: jis0208<<14 | 0x32<<7 | 0x03,\n\t21695 - 19968: jis0212<<14 | 0x14<<7 | 0x17,\n\t21696 - 19968: jis0208<<14 | 0x0F<<7 | 0x04,\n\t21697 - 19968: jis0208<<14 | 0x28<<7 | 0x29,\n\t21698 - 19968: jis0208<<14 | 0x32<<7 | 0x01,\n\t21700 - 19968: jis0208<<14 | 0x31<<7 | 0x5B,\n\t21702 - 19968: jis0212<<14 | 0x14<<7 | 0x18,\n\t21703 - 19968: jis0208<<14 | 0x31<<7 | 0x56,\n\t21704 - 19968: jis0208<<14 | 0x31<<7 | 0x5C,\n\t21705 - 19968: jis0208<<14 | 0x19<<7 | 0x27,\n\t21706 - 19968: jis0212<<14 | 0x14<<7 | 0x19,\n\t21709 - 19968: jis0212<<14 | 0x14<<7 | 0x1A,\n\t21710 - 19968: jis0212<<14 | 0x14<<7 | 0x1B,\n\t21720 - 19968: jis0208<<14 | 0x32<<7 | 0x05,\n\t21728 - 19968: jis0212<<14 | 0x14<<7 | 0x1C,\n\t21729 - 19968: jis0208<<14 | 0x0F<<7 | 0x56,\n\t21730 - 19968: jis0208<<14 | 0x32<<7 | 0x0E,\n\t21733 - 19968: jis0208<<14 | 0x32<<7 | 0x06,\n\t21734 - 19968: jis0208<<14 | 0x32<<7 | 0x07,\n\t21736 - 19968: jis0208<<14 | 0x1D<<7 | 0x04,\n\t21737 - 19968: jis0208<<14 | 0x2A<<7 | 0x48,\n\t21738 - 19968: jis0212<<14 | 0x14<<7 | 0x1D,\n\t21740 - 19968: jis0212<<14 | 0x14<<7 | 0x1E,\n\t21741 - 19968: jis0208<<14 | 0x32<<7 | 0x0C,\n\t21742 - 19968: jis0208<<14 | 0x32<<7 | 0x0B,\n\t21743 - 19968: jis0212<<14 | 0x14<<7 | 0x1F,\n\t21746 - 19968: jis0208<<14 | 0x24<<7 | 0x0E,\n\t21750 - 19968: jis0212<<14 | 0x14<<7 | 0x20,\n\t21754 - 19968: jis0208<<14 | 0x32<<7 | 0x0D,\n\t21756 - 19968: jis0212<<14 | 0x14<<7 | 0x21,\n\t21757 - 19968: jis0208<<14 | 0x32<<7 | 0x0A,\n\t21758 - 19968: jis0212<<14 | 0x14<<7 | 0x22,\n\t21759 - 19968: jis0208<<14 | 0x58<<7 | 0x37,\n\t21760 - 19968: jis0212<<14 | 0x14<<7 | 0x24,\n\t21761 - 19968: jis0212<<14 | 0x14<<7 | 0x25,\n\t21764 - 19968: jis0208<<14 | 0x10<<7 | 0x13,\n\t21765 - 19968: jis0212<<14 | 0x14<<7 | 0x26,\n\t21766 - 19968: jis0208<<14 | 0x19<<7 | 0x15,\n\t21767 - 19968: jis0208<<14 | 0x1E<<7 | 0x0F,\n\t21768 - 19968: jis0212<<14 | 0x14<<7 | 0x27,\n\t21769 - 19968: jis0212<<14 | 0x14<<7 | 0x28,\n\t21772 - 19968: jis0212<<14 | 0x14<<7 | 0x29,\n\t21773 - 19968: jis0212<<14 | 0x14<<7 | 0x2A,\n\t21774 - 19968: jis0212<<14 | 0x14<<7 | 0x2B,\n\t21775 - 19968: jis0208<<14 | 0x32<<7 | 0x08,\n\t21776 - 19968: jis0208<<14 | 0x24<<7 | 0x41,\n\t21780 - 19968: jis0208<<14 | 0x32<<7 | 0x09,\n\t21781 - 19968: jis0212<<14 | 0x14<<7 | 0x2C,\n\t21782 - 19968: jis0208<<14 | 0x0F<<7 | 0x01,\n\t21802 - 19968: jis0212<<14 | 0x14<<7 | 0x2D,\n\t21803 - 19968: jis0212<<14 | 0x14<<7 | 0x2E,\n\t21806 - 19968: jis0208<<14 | 0x32<<7 | 0x13,\n\t21807 - 19968: jis0208<<14 | 0x2C<<7 | 0x02,\n\t21809 - 19968: jis0208<<14 | 0x1D<<7 | 0x06,\n\t21810 - 19968: jis0212<<14 | 0x14<<7 | 0x2F,\n\t21811 - 19968: jis0208<<14 | 0x32<<7 | 0x19,\n\t21813 - 19968: jis0212<<14 | 0x14<<7 | 0x30,\n\t21814 - 19968: jis0212<<14 | 0x14<<7 | 0x31,\n\t21816 - 19968: jis0208<<14 | 0x32<<7 | 0x18,\n\t21817 - 19968: jis0208<<14 | 0x32<<7 | 0x0F,\n\t21819 - 19968: jis0212<<14 | 0x14<<7 | 0x32,\n\t21820 - 19968: jis0212<<14 | 0x14<<7 | 0x33,\n\t21821 - 19968: jis0212<<14 | 0x14<<7 | 0x34,\n\t21822 - 19968: jis0208<<14 | 0x21<<7 | 0x22,\n\t21824 - 19968: jis0208<<14 | 0x32<<7 | 0x10,\n\t21825 - 19968: jis0212<<14 | 0x14<<7 | 0x35,\n\t21828 - 19968: jis0208<<14 | 0x21<<7 | 0x4E,\n\t21829 - 19968: jis0208<<14 | 0x32<<7 | 0x15,\n\t21830 - 19968: jis0208<<14 | 0x1D<<7 | 0x05,\n\t21831 - 19968: jis0212<<14 | 0x14<<7 | 0x36,\n\t21833 - 19968: jis0212<<14 | 0x14<<7 | 0x37,\n\t21834 - 19968: jis0212<<14 | 0x14<<7 | 0x38,\n\t21836 - 19968: jis0208<<14 | 0x32<<7 | 0x12,\n\t21837 - 19968: jis0212<<14 | 0x14<<7 | 0x39,\n\t21839 - 19968: jis0208<<14 | 0x2B<<7 | 0x43,\n\t21840 - 19968: jis0212<<14 | 0x14<<7 | 0x3A,\n\t21841 - 19968: jis0212<<14 | 0x14<<7 | 0x3B,\n\t21843 - 19968: jis0208<<14 | 0x16<<7 | 0x1B,\n\t21846 - 19968: jis0208<<14 | 0x32<<7 | 0x16,\n\t21847 - 19968: jis0208<<14 | 0x32<<7 | 0x17,\n\t21848 - 19968: jis0212<<14 | 0x14<<7 | 0x3C,\n\t21850 - 19968: jis0212<<14 | 0x14<<7 | 0x3D,\n\t21851 - 19968: jis0212<<14 | 0x14<<7 | 0x3E,\n\t21852 - 19968: jis0208<<14 | 0x32<<7 | 0x14,\n\t21853 - 19968: jis0208<<14 | 0x32<<7 | 0x1A,\n\t21854 - 19968: jis0212<<14 | 0x14<<7 | 0x3F,\n\t21856 - 19968: jis0212<<14 | 0x14<<7 | 0x40,\n\t21857 - 19968: jis0212<<14 | 0x14<<7 | 0x41,\n\t21859 - 19968: jis0208<<14 | 0x32<<7 | 0x11,\n\t21860 - 19968: jis0212<<14 | 0x14<<7 | 0x42,\n\t21862 - 19968: jis0212<<14 | 0x14<<7 | 0x43,\n\t21883 - 19968: jis0208<<14 | 0x32<<7 | 0x20,\n\t21884 - 19968: jis0208<<14 | 0x32<<7 | 0x25,\n\t21886 - 19968: jis0208<<14 | 0x32<<7 | 0x21,\n\t21887 - 19968: jis0212<<14 | 0x14<<7 | 0x44,\n\t21888 - 19968: jis0208<<14 | 0x32<<7 | 0x1C,\n\t21889 - 19968: jis0212<<14 | 0x14<<7 | 0x45,\n\t21890 - 19968: jis0212<<14 | 0x14<<7 | 0x46,\n\t21891 - 19968: jis0208<<14 | 0x32<<7 | 0x26,\n\t21892 - 19968: jis0208<<14 | 0x20<<7 | 0x10,\n\t21894 - 19968: jis0208<<14 | 0x58<<7 | 0x38,\n\t21895 - 19968: jis0208<<14 | 0x32<<7 | 0x28,\n\t21896 - 19968: jis0212<<14 | 0x14<<7 | 0x48,\n\t21897 - 19968: jis0208<<14 | 0x18<<7 | 0x01,\n\t21898 - 19968: jis0208<<14 | 0x32<<7 | 0x1E,\n\t21899 - 19968: jis0208<<14 | 0x22<<7 | 0x5C,\n\t21902 - 19968: jis0212<<14 | 0x14<<7 | 0x49,\n\t21903 - 19968: jis0212<<14 | 0x14<<7 | 0x4A,\n\t21905 - 19968: jis0212<<14 | 0x14<<7 | 0x4B,\n\t21906 - 19968: jis0212<<14 | 0x14<<7 | 0x4C,\n\t21907 - 19968: jis0212<<14 | 0x14<<7 | 0x4D,\n\t21908 - 19968: jis0212<<14 | 0x14<<7 | 0x4E,\n\t21911 - 19968: jis0212<<14 | 0x14<<7 | 0x4F,\n\t21912 - 19968: jis0208<<14 | 0x32<<7 | 0x22,\n\t21913 - 19968: jis0208<<14 | 0x32<<7 | 0x1B,\n\t21914 - 19968: jis0208<<14 | 0x13<<7 | 0x0C,\n\t21916 - 19968: jis0208<<14 | 0x13<<7 | 0x4D,\n\t21917 - 19968: jis0208<<14 | 0x12<<7 | 0x44,\n\t21918 - 19968: jis0208<<14 | 0x32<<7 | 0x23,\n\t21919 - 19968: jis0208<<14 | 0x32<<7 | 0x1F,\n\t21923 - 19968: jis0212<<14 | 0x14<<7 | 0x50,\n\t21924 - 19968: jis0212<<14 | 0x14<<7 | 0x51,\n\t21927 - 19968: jis0208<<14 | 0x16<<7 | 0x55,\n\t21928 - 19968: jis0208<<14 | 0x32<<7 | 0x29,\n\t21929 - 19968: jis0208<<14 | 0x32<<7 | 0x27,\n\t21930 - 19968: jis0208<<14 | 0x20<<7 | 0x32,\n\t21931 - 19968: jis0208<<14 | 0x14<<7 | 0x29,\n\t21932 - 19968: jis0208<<14 | 0x15<<7 | 0x0B,\n\t21933 - 19968: jis0212<<14 | 0x14<<7 | 0x52,\n\t21934 - 19968: jis0208<<14 | 0x32<<7 | 0x24,\n\t21936 - 19968: jis0208<<14 | 0x15<<7 | 0x53,\n\t21938 - 19968: jis0212<<14 | 0x14<<7 | 0x53,\n\t21942 - 19968: jis0208<<14 | 0x10<<7 | 0x23,\n\t21951 - 19968: jis0212<<14 | 0x14<<7 | 0x54,\n\t21953 - 19968: jis0212<<14 | 0x14<<7 | 0x55,\n\t21955 - 19968: jis0212<<14 | 0x14<<7 | 0x56,\n\t21956 - 19968: jis0208<<14 | 0x32<<7 | 0x2D,\n\t21957 - 19968: jis0208<<14 | 0x32<<7 | 0x2B,\n\t21958 - 19968: jis0212<<14 | 0x14<<7 | 0x57,\n\t21959 - 19968: jis0208<<14 | 0x33<<7 | 0x06,\n\t21961 - 19968: jis0212<<14 | 0x14<<7 | 0x58,\n\t21963 - 19968: jis0212<<14 | 0x14<<7 | 0x59,\n\t21964 - 19968: jis0212<<14 | 0x14<<7 | 0x5A,\n\t21966 - 19968: jis0212<<14 | 0x14<<7 | 0x5B,\n\t21969 - 19968: jis0212<<14 | 0x14<<7 | 0x5C,\n\t21970 - 19968: jis0212<<14 | 0x14<<7 | 0x5D,\n\t21971 - 19968: jis0212<<14 | 0x15<<7 | 0x00,\n\t21972 - 19968: jis0208<<14 | 0x32<<7 | 0x30,\n\t21975 - 19968: jis0212<<14 | 0x15<<7 | 0x01,\n\t21976 - 19968: jis0212<<14 | 0x15<<7 | 0x02,\n\t21978 - 19968: jis0208<<14 | 0x32<<7 | 0x2A,\n\t21979 - 19968: jis0212<<14 | 0x15<<7 | 0x03,\n\t21980 - 19968: jis0208<<14 | 0x32<<7 | 0x2E,\n\t21982 - 19968: jis0212<<14 | 0x15<<7 | 0x04,\n\t21983 - 19968: jis0208<<14 | 0x32<<7 | 0x2C,\n\t21986 - 19968: jis0212<<14 | 0x15<<7 | 0x05,\n\t21987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2B,\n\t21988 - 19968: jis0208<<14 | 0x32<<7 | 0x2F,\n\t21993 - 19968: jis0212<<14 | 0x15<<7 | 0x06,\n\t22006 - 19968: jis0212<<14 | 0x15<<7 | 0x07,\n\t22007 - 19968: jis0208<<14 | 0x32<<7 | 0x32,\n\t22009 - 19968: jis0208<<14 | 0x32<<7 | 0x37,\n\t22013 - 19968: jis0208<<14 | 0x32<<7 | 0x35,\n\t22014 - 19968: jis0208<<14 | 0x32<<7 | 0x34,\n\t22015 - 19968: jis0212<<14 | 0x15<<7 | 0x08,\n\t22021 - 19968: jis0212<<14 | 0x15<<7 | 0x09,\n\t22022 - 19968: jis0208<<14 | 0x22<<7 | 0x11,\n\t22024 - 19968: jis0212<<14 | 0x15<<7 | 0x0A,\n\t22025 - 19968: jis0208<<14 | 0x11<<7 | 0x24,\n\t22026 - 19968: jis0212<<14 | 0x15<<7 | 0x0B,\n\t22029 - 19968: jis0212<<14 | 0x15<<7 | 0x0C,\n\t22030 - 19968: jis0212<<14 | 0x15<<7 | 0x0D,\n\t22031 - 19968: jis0212<<14 | 0x15<<7 | 0x0E,\n\t22032 - 19968: jis0212<<14 | 0x15<<7 | 0x0F,\n\t22033 - 19968: jis0212<<14 | 0x15<<7 | 0x10,\n\t22034 - 19968: jis0212<<14 | 0x15<<7 | 0x11,\n\t22036 - 19968: jis0208<<14 | 0x32<<7 | 0x31,\n\t22038 - 19968: jis0208<<14 | 0x32<<7 | 0x33,\n\t22039 - 19968: jis0208<<14 | 0x1D<<7 | 0x07,\n\t22040 - 19968: jis0208<<14 | 0x10<<7 | 0x12,\n\t22041 - 19968: jis0212<<14 | 0x15<<7 | 0x12,\n\t22043 - 19968: jis0208<<14 | 0x32<<7 | 0x36,\n\t22057 - 19968: jis0208<<14 | 0x11<<7 | 0x3D,\n\t22060 - 19968: jis0212<<14 | 0x15<<7 | 0x13,\n\t22063 - 19968: jis0208<<14 | 0x32<<7 | 0x41,\n\t22064 - 19968: jis0212<<14 | 0x15<<7 | 0x14,\n\t22065 - 19968: jis0208<<14 | 0x1D<<7 | 0x5B,\n\t22066 - 19968: jis0208<<14 | 0x32<<7 | 0x3D,\n\t22067 - 19968: jis0212<<14 | 0x15<<7 | 0x15,\n\t22068 - 19968: jis0208<<14 | 0x32<<7 | 0x3B,\n\t22069 - 19968: jis0212<<14 | 0x15<<7 | 0x16,\n\t22070 - 19968: jis0208<<14 | 0x32<<7 | 0x3C,\n\t22071 - 19968: jis0212<<14 | 0x15<<7 | 0x17,\n\t22072 - 19968: jis0208<<14 | 0x32<<7 | 0x3E,\n\t22073 - 19968: jis0212<<14 | 0x15<<7 | 0x18,\n\t22075 - 19968: jis0212<<14 | 0x15<<7 | 0x19,\n\t22076 - 19968: jis0212<<14 | 0x15<<7 | 0x1A,\n\t22077 - 19968: jis0212<<14 | 0x15<<7 | 0x1B,\n\t22079 - 19968: jis0212<<14 | 0x15<<7 | 0x1C,\n\t22080 - 19968: jis0212<<14 | 0x15<<7 | 0x1D,\n\t22081 - 19968: jis0212<<14 | 0x15<<7 | 0x1E,\n\t22082 - 19968: jis0208<<14 | 0x10<<7 | 0x1C,\n\t22083 - 19968: jis0212<<14 | 0x15<<7 | 0x1F,\n\t22084 - 19968: jis0212<<14 | 0x15<<7 | 0x20,\n\t22086 - 19968: jis0212<<14 | 0x15<<7 | 0x21,\n\t22089 - 19968: jis0212<<14 | 0x15<<7 | 0x22,\n\t22091 - 19968: jis0212<<14 | 0x15<<7 | 0x23,\n\t22092 - 19968: jis0208<<14 | 0x20<<7 | 0x18,\n\t22093 - 19968: jis0212<<14 | 0x15<<7 | 0x24,\n\t22094 - 19968: jis0208<<14 | 0x32<<7 | 0x38,\n\t22095 - 19968: jis0212<<14 | 0x15<<7 | 0x25,\n\t22096 - 19968: jis0208<<14 | 0x32<<7 | 0x39,\n\t22100 - 19968: jis0212<<14 | 0x15<<7 | 0x26,\n\t22107 - 19968: jis0208<<14 | 0x12<<7 | 0x59,\n\t22110 - 19968: jis0212<<14 | 0x15<<7 | 0x27,\n\t22112 - 19968: jis0212<<14 | 0x15<<7 | 0x28,\n\t22113 - 19968: jis0212<<14 | 0x15<<7 | 0x29,\n\t22114 - 19968: jis0212<<14 | 0x15<<7 | 0x2A,\n\t22115 - 19968: jis0212<<14 | 0x15<<7 | 0x2B,\n\t22116 - 19968: jis0208<<14 | 0x32<<7 | 0x40,\n\t22118 - 19968: jis0212<<14 | 0x15<<7 | 0x2C,\n\t22120 - 19968: jis0208<<14 | 0x13<<7 | 0x4E,\n\t22121 - 19968: jis0212<<14 | 0x15<<7 | 0x2D,\n\t22122 - 19968: jis0208<<14 | 0x32<<7 | 0x43,\n\t22123 - 19968: jis0208<<14 | 0x32<<7 | 0x3F,\n\t22124 - 19968: jis0208<<14 | 0x32<<7 | 0x42,\n\t22125 - 19968: jis0212<<14 | 0x15<<7 | 0x2E,\n\t22127 - 19968: jis0212<<14 | 0x15<<7 | 0x2F,\n\t22129 - 19968: jis0212<<14 | 0x15<<7 | 0x30,\n\t22130 - 19968: jis0212<<14 | 0x15<<7 | 0x31,\n\t22132 - 19968: jis0208<<14 | 0x29<<7 | 0x0D,\n\t22133 - 19968: jis0212<<14 | 0x15<<7 | 0x32,\n\t22136 - 19968: jis0208<<14 | 0x25<<7 | 0x34,\n\t22138 - 19968: jis0208<<14 | 0x27<<7 | 0x17,\n\t22144 - 19968: jis0208<<14 | 0x32<<7 | 0x45,\n\t22148 - 19968: jis0212<<14 | 0x15<<7 | 0x33,\n\t22149 - 19968: jis0212<<14 | 0x15<<7 | 0x34,\n\t22150 - 19968: jis0208<<14 | 0x32<<7 | 0x44,\n\t22151 - 19968: jis0208<<14 | 0x12<<7 | 0x24,\n\t22152 - 19968: jis0212<<14 | 0x15<<7 | 0x35,\n\t22154 - 19968: jis0208<<14 | 0x32<<7 | 0x46,\n\t22155 - 19968: jis0212<<14 | 0x15<<7 | 0x36,\n\t22156 - 19968: jis0212<<14 | 0x15<<7 | 0x37,\n\t22159 - 19968: jis0208<<14 | 0x32<<7 | 0x49,\n\t22164 - 19968: jis0208<<14 | 0x32<<7 | 0x48,\n\t22165 - 19968: jis0212<<14 | 0x15<<7 | 0x38,\n\t22169 - 19968: jis0212<<14 | 0x15<<7 | 0x39,\n\t22170 - 19968: jis0212<<14 | 0x15<<7 | 0x3A,\n\t22173 - 19968: jis0212<<14 | 0x15<<7 | 0x3B,\n\t22174 - 19968: jis0212<<14 | 0x15<<7 | 0x3C,\n\t22175 - 19968: jis0212<<14 | 0x15<<7 | 0x3D,\n\t22176 - 19968: jis0208<<14 | 0x32<<7 | 0x47,\n\t22178 - 19968: jis0208<<14 | 0x26<<7 | 0x18,\n\t22181 - 19968: jis0208<<14 | 0x32<<7 | 0x4A,\n\t22182 - 19968: jis0212<<14 | 0x15<<7 | 0x3E,\n\t22183 - 19968: jis0212<<14 | 0x15<<7 | 0x3F,\n\t22184 - 19968: jis0212<<14 | 0x15<<7 | 0x40,\n\t22185 - 19968: jis0212<<14 | 0x15<<7 | 0x41,\n\t22187 - 19968: jis0212<<14 | 0x15<<7 | 0x42,\n\t22188 - 19968: jis0212<<14 | 0x15<<7 | 0x43,\n\t22189 - 19968: jis0212<<14 | 0x15<<7 | 0x44,\n\t22190 - 19968: jis0208<<14 | 0x32<<7 | 0x4B,\n\t22193 - 19968: jis0212<<14 | 0x15<<7 | 0x45,\n\t22195 - 19968: jis0212<<14 | 0x15<<7 | 0x46,\n\t22196 - 19968: jis0208<<14 | 0x32<<7 | 0x4D,\n\t22198 - 19968: jis0208<<14 | 0x32<<7 | 0x4C,\n\t22199 - 19968: jis0212<<14 | 0x15<<7 | 0x47,\n\t22204 - 19968: jis0208<<14 | 0x32<<7 | 0x4F,\n\t22206 - 19968: jis0212<<14 | 0x15<<7 | 0x48,\n\t22208 - 19968: jis0208<<14 | 0x32<<7 | 0x52,\n\t22209 - 19968: jis0208<<14 | 0x32<<7 | 0x50,\n\t22210 - 19968: jis0208<<14 | 0x32<<7 | 0x4E,\n\t22211 - 19968: jis0208<<14 | 0x32<<7 | 0x51,\n\t22213 - 19968: jis0212<<14 | 0x15<<7 | 0x49,\n\t22216 - 19968: jis0208<<14 | 0x32<<7 | 0x53,\n\t22217 - 19968: jis0212<<14 | 0x15<<7 | 0x4A,\n\t22218 - 19968: jis0212<<14 | 0x15<<7 | 0x4B,\n\t22219 - 19968: jis0212<<14 | 0x15<<7 | 0x4C,\n\t22220 - 19968: jis0212<<14 | 0x15<<7 | 0x4F,\n\t22221 - 19968: jis0212<<14 | 0x15<<7 | 0x50,\n\t22222 - 19968: jis0208<<14 | 0x32<<7 | 0x54,\n\t22223 - 19968: jis0212<<14 | 0x15<<7 | 0x4D,\n\t22224 - 19968: jis0212<<14 | 0x15<<7 | 0x4E,\n\t22225 - 19968: jis0208<<14 | 0x32<<7 | 0x55,\n\t22227 - 19968: jis0208<<14 | 0x32<<7 | 0x56,\n\t22231 - 19968: jis0208<<14 | 0x32<<7 | 0x57,\n\t22232 - 19968: jis0208<<14 | 0x30<<7 | 0x24,\n\t22233 - 19968: jis0212<<14 | 0x15<<7 | 0x51,\n\t22234 - 19968: jis0208<<14 | 0x1B<<7 | 0x5B,\n\t22235 - 19968: jis0208<<14 | 0x1A<<7 | 0x2C,\n\t22236 - 19968: jis0212<<14 | 0x15<<7 | 0x52,\n\t22237 - 19968: jis0212<<14 | 0x15<<7 | 0x53,\n\t22238 - 19968: jis0208<<14 | 0x11<<7 | 0x52,\n\t22239 - 19968: jis0212<<14 | 0x15<<7 | 0x54,\n\t22240 - 19968: jis0208<<14 | 0x0F<<7 | 0x57,\n\t22241 - 19968: jis0212<<14 | 0x15<<7 | 0x55,\n\t22243 - 19968: jis0208<<14 | 0x22<<7 | 0x23,\n\t22244 - 19968: jis0212<<14 | 0x15<<7 | 0x56,\n\t22245 - 19968: jis0212<<14 | 0x15<<7 | 0x57,\n\t22246 - 19968: jis0212<<14 | 0x15<<7 | 0x58,\n\t22247 - 19968: jis0212<<14 | 0x15<<7 | 0x59,\n\t22248 - 19968: jis0212<<14 | 0x15<<7 | 0x5A,\n\t22251 - 19968: jis0212<<14 | 0x15<<7 | 0x5C,\n\t22253 - 19968: jis0212<<14 | 0x15<<7 | 0x5D,\n\t22254 - 19968: jis0208<<14 | 0x32<<7 | 0x58,\n\t22256 - 19968: jis0208<<14 | 0x19<<7 | 0x03,\n\t22257 - 19968: jis0212<<14 | 0x15<<7 | 0x5B,\n\t22258 - 19968: jis0208<<14 | 0x0F<<7 | 0x2E,\n\t22259 - 19968: jis0208<<14 | 0x1E<<7 | 0x3D,\n\t22262 - 19968: jis0212<<14 | 0x16<<7 | 0x00,\n\t22263 - 19968: jis0212<<14 | 0x16<<7 | 0x01,\n\t22265 - 19968: jis0208<<14 | 0x32<<7 | 0x59,\n\t22266 - 19968: jis0208<<14 | 0x17<<7 | 0x26,\n\t22269 - 19968: jis0208<<14 | 0x18<<7 | 0x50,\n\t22271 - 19968: jis0208<<14 | 0x32<<7 | 0x5B,\n\t22272 - 19968: jis0208<<14 | 0x32<<7 | 0x5A,\n\t22273 - 19968: jis0212<<14 | 0x16<<7 | 0x02,\n\t22274 - 19968: jis0212<<14 | 0x16<<7 | 0x03,\n\t22275 - 19968: jis0208<<14 | 0x29<<7 | 0x3F,\n\t22276 - 19968: jis0208<<14 | 0x32<<7 | 0x5C,\n\t22279 - 19968: jis0212<<14 | 0x16<<7 | 0x04,\n\t22280 - 19968: jis0208<<14 | 0x33<<7 | 0x00,\n\t22281 - 19968: jis0208<<14 | 0x32<<7 | 0x5D,\n\t22282 - 19968: jis0212<<14 | 0x16<<7 | 0x05,\n\t22283 - 19968: jis0208<<14 | 0x33<<7 | 0x01,\n\t22284 - 19968: jis0212<<14 | 0x16<<7 | 0x06,\n\t22285 - 19968: jis0208<<14 | 0x33<<7 | 0x02,\n\t22287 - 19968: jis0208<<14 | 0x16<<7 | 0x56,\n\t22289 - 19968: jis0212<<14 | 0x16<<7 | 0x07,\n\t22290 - 19968: jis0208<<14 | 0x10<<7 | 0x3F,\n\t22291 - 19968: jis0208<<14 | 0x33<<7 | 0x03,\n\t22293 - 19968: jis0212<<14 | 0x16<<7 | 0x08,\n\t22294 - 19968: jis0208<<14 | 0x33<<7 | 0x05,\n\t22296 - 19968: jis0208<<14 | 0x33<<7 | 0x04,\n\t22298 - 19968: jis0212<<14 | 0x16<<7 | 0x09,\n\t22299 - 19968: jis0212<<14 | 0x16<<7 | 0x0A,\n\t22300 - 19968: jis0208<<14 | 0x33<<7 | 0x07,\n\t22301 - 19968: jis0212<<14 | 0x16<<7 | 0x0B,\n\t22303 - 19968: jis0208<<14 | 0x24<<7 | 0x39,\n\t22304 - 19968: jis0212<<14 | 0x16<<7 | 0x0C,\n\t22306 - 19968: jis0212<<14 | 0x16<<7 | 0x0D,\n\t22307 - 19968: jis0212<<14 | 0x16<<7 | 0x0E,\n\t22308 - 19968: jis0212<<14 | 0x16<<7 | 0x0F,\n\t22309 - 19968: jis0212<<14 | 0x16<<7 | 0x10,\n\t22310 - 19968: jis0208<<14 | 0x33<<7 | 0x08,\n\t22311 - 19968: jis0208<<14 | 0x0F<<7 | 0x14,\n\t22312 - 19968: jis0208<<14 | 0x19<<7 | 0x3E,\n\t22313 - 19968: jis0212<<14 | 0x16<<7 | 0x11,\n\t22314 - 19968: jis0212<<14 | 0x16<<7 | 0x12,\n\t22316 - 19968: jis0212<<14 | 0x16<<7 | 0x13,\n\t22317 - 19968: jis0208<<14 | 0x16<<7 | 0x1C,\n\t22318 - 19968: jis0212<<14 | 0x16<<7 | 0x14,\n\t22319 - 19968: jis0212<<14 | 0x16<<7 | 0x15,\n\t22320 - 19968: jis0208<<14 | 0x22<<7 | 0x2E,\n\t22323 - 19968: jis0212<<14 | 0x16<<7 | 0x16,\n\t22324 - 19968: jis0212<<14 | 0x16<<7 | 0x17,\n\t22327 - 19968: jis0208<<14 | 0x33<<7 | 0x09,\n\t22328 - 19968: jis0208<<14 | 0x33<<7 | 0x0A,\n\t22331 - 19968: jis0208<<14 | 0x33<<7 | 0x0C,\n\t22333 - 19968: jis0212<<14 | 0x16<<7 | 0x18,\n\t22334 - 19968: jis0212<<14 | 0x16<<7 | 0x19,\n\t22335 - 19968: jis0212<<14 | 0x16<<7 | 0x1A,\n\t22336 - 19968: jis0208<<14 | 0x33<<7 | 0x0D,\n\t22338 - 19968: jis0208<<14 | 0x19<<7 | 0x43,\n\t22341 - 19968: jis0212<<14 | 0x16<<7 | 0x1B,\n\t22342 - 19968: jis0212<<14 | 0x16<<7 | 0x1C,\n\t22343 - 19968: jis0208<<14 | 0x15<<7 | 0x30,\n\t22346 - 19968: jis0208<<14 | 0x2A<<7 | 0x16,\n\t22348 - 19968: jis0212<<14 | 0x16<<7 | 0x1D,\n\t22349 - 19968: jis0212<<14 | 0x16<<7 | 0x1E,\n\t22350 - 19968: jis0208<<14 | 0x33<<7 | 0x0B,\n\t22351 - 19968: jis0208<<14 | 0x33<<7 | 0x0E,\n\t22352 - 19968: jis0208<<14 | 0x19<<7 | 0x20,\n\t22353 - 19968: jis0208<<14 | 0x18<<7 | 0x02,\n\t22354 - 19968: jis0212<<14 | 0x16<<7 | 0x1F,\n\t22361 - 19968: jis0208<<14 | 0x58<<7 | 0x39,\n\t22369 - 19968: jis0208<<14 | 0x33<<7 | 0x12,\n\t22370 - 19968: jis0212<<14 | 0x16<<7 | 0x20,\n\t22372 - 19968: jis0208<<14 | 0x19<<7 | 0x04,\n\t22373 - 19968: jis0208<<14 | 0x58<<7 | 0x3A,\n\t22374 - 19968: jis0208<<14 | 0x22<<7 | 0x12,\n\t22375 - 19968: jis0212<<14 | 0x16<<7 | 0x22,\n\t22376 - 19968: jis0212<<14 | 0x16<<7 | 0x23,\n\t22377 - 19968: jis0208<<14 | 0x33<<7 | 0x0F,\n\t22378 - 19968: jis0208<<14 | 0x23<<7 | 0x39,\n\t22379 - 19968: jis0212<<14 | 0x16<<7 | 0x24,\n\t22381 - 19968: jis0212<<14 | 0x16<<7 | 0x25,\n\t22382 - 19968: jis0212<<14 | 0x16<<7 | 0x26,\n\t22383 - 19968: jis0212<<14 | 0x16<<7 | 0x27,\n\t22384 - 19968: jis0212<<14 | 0x16<<7 | 0x28,\n\t22385 - 19968: jis0212<<14 | 0x16<<7 | 0x29,\n\t22387 - 19968: jis0212<<14 | 0x16<<7 | 0x2A,\n\t22388 - 19968: jis0212<<14 | 0x16<<7 | 0x2B,\n\t22389 - 19968: jis0212<<14 | 0x16<<7 | 0x2C,\n\t22391 - 19968: jis0212<<14 | 0x16<<7 | 0x2D,\n\t22393 - 19968: jis0212<<14 | 0x16<<7 | 0x2E,\n\t22394 - 19968: jis0212<<14 | 0x16<<7 | 0x2F,\n\t22395 - 19968: jis0212<<14 | 0x16<<7 | 0x30,\n\t22396 - 19968: jis0212<<14 | 0x16<<7 | 0x31,\n\t22398 - 19968: jis0212<<14 | 0x16<<7 | 0x32,\n\t22399 - 19968: jis0208<<14 | 0x33<<7 | 0x13,\n\t22401 - 19968: jis0212<<14 | 0x16<<7 | 0x33,\n\t22402 - 19968: jis0208<<14 | 0x1E<<7 | 0x41,\n\t22403 - 19968: jis0212<<14 | 0x16<<7 | 0x34,\n\t22408 - 19968: jis0208<<14 | 0x33<<7 | 0x11,\n\t22409 - 19968: jis0208<<14 | 0x33<<7 | 0x14,\n\t22411 - 19968: jis0208<<14 | 0x16<<7 | 0x1E,\n\t22412 - 19968: jis0212<<14 | 0x16<<7 | 0x35,\n\t22419 - 19968: jis0208<<14 | 0x33<<7 | 0x15,\n\t22420 - 19968: jis0212<<14 | 0x16<<7 | 0x36,\n\t22421 - 19968: jis0212<<14 | 0x16<<7 | 0x3F,\n\t22423 - 19968: jis0212<<14 | 0x16<<7 | 0x37,\n\t22425 - 19968: jis0212<<14 | 0x16<<7 | 0x38,\n\t22426 - 19968: jis0212<<14 | 0x16<<7 | 0x39,\n\t22428 - 19968: jis0212<<14 | 0x16<<7 | 0x3A,\n\t22429 - 19968: jis0212<<14 | 0x16<<7 | 0x3B,\n\t22430 - 19968: jis0212<<14 | 0x16<<7 | 0x3C,\n\t22431 - 19968: jis0212<<14 | 0x16<<7 | 0x3D,\n\t22432 - 19968: jis0208<<14 | 0x33<<7 | 0x16,\n\t22433 - 19968: jis0212<<14 | 0x16<<7 | 0x3E,\n\t22434 - 19968: jis0208<<14 | 0x18<<7 | 0x03,\n\t22435 - 19968: jis0208<<14 | 0x12<<7 | 0x1F,\n\t22436 - 19968: jis0208<<14 | 0x33<<7 | 0x18,\n\t22439 - 19968: jis0212<<14 | 0x16<<7 | 0x40,\n\t22440 - 19968: jis0212<<14 | 0x16<<7 | 0x41,\n\t22441 - 19968: jis0212<<14 | 0x16<<7 | 0x42,\n\t22442 - 19968: jis0208<<14 | 0x33<<7 | 0x19,\n\t22444 - 19968: jis0208<<14 | 0x58<<7 | 0x3B,\n\t22448 - 19968: jis0208<<14 | 0x33<<7 | 0x1A,\n\t22451 - 19968: jis0208<<14 | 0x33<<7 | 0x17,\n\t22456 - 19968: jis0212<<14 | 0x16<<7 | 0x44,\n\t22461 - 19968: jis0212<<14 | 0x16<<7 | 0x45,\n\t22464 - 19968: jis0208<<14 | 0x33<<7 | 0x10,\n\t22467 - 19968: jis0208<<14 | 0x33<<7 | 0x1B,\n\t22470 - 19968: jis0208<<14 | 0x33<<7 | 0x1C,\n\t22471 - 19968: jis0208<<14 | 0x58<<7 | 0x3D,\n\t22472 - 19968: jis0208<<14 | 0x58<<7 | 0x3C,\n\t22475 - 19968: jis0208<<14 | 0x2A<<7 | 0x43,\n\t22476 - 19968: jis0212<<14 | 0x16<<7 | 0x48,\n\t22478 - 19968: jis0208<<14 | 0x1D<<7 | 0x4A,\n\t22479 - 19968: jis0212<<14 | 0x16<<7 | 0x49,\n\t22482 - 19968: jis0208<<14 | 0x33<<7 | 0x1E,\n\t22483 - 19968: jis0208<<14 | 0x33<<7 | 0x1F,\n\t22484 - 19968: jis0208<<14 | 0x33<<7 | 0x1D,\n\t22485 - 19968: jis0212<<14 | 0x16<<7 | 0x4A,\n\t22486 - 19968: jis0208<<14 | 0x33<<7 | 0x21,\n\t22492 - 19968: jis0208<<14 | 0x26<<7 | 0x17,\n\t22493 - 19968: jis0212<<14 | 0x16<<7 | 0x4B,\n\t22494 - 19968: jis0212<<14 | 0x16<<7 | 0x4C,\n\t22495 - 19968: jis0208<<14 | 0x0F<<7 | 0x47,\n\t22496 - 19968: jis0208<<14 | 0x28<<7 | 0x35,\n\t22497 - 19968: jis0212<<14 | 0x16<<7 | 0x5D,\n\t22499 - 19968: jis0208<<14 | 0x33<<7 | 0x22,\n\t22500 - 19968: jis0212<<14 | 0x16<<7 | 0x4D,\n\t22502 - 19968: jis0212<<14 | 0x16<<7 | 0x4E,\n\t22503 - 19968: jis0212<<14 | 0x16<<7 | 0x4F,\n\t22505 - 19968: jis0212<<14 | 0x16<<7 | 0x50,\n\t22509 - 19968: jis0212<<14 | 0x16<<7 | 0x51,\n\t22512 - 19968: jis0212<<14 | 0x16<<7 | 0x52,\n\t22516 - 19968: jis0208<<14 | 0x1D<<7 | 0x5C,\n\t22517 - 19968: jis0212<<14 | 0x16<<7 | 0x53,\n\t22518 - 19968: jis0212<<14 | 0x16<<7 | 0x54,\n\t22519 - 19968: jis0208<<14 | 0x1B<<7 | 0x18,\n\t22520 - 19968: jis0212<<14 | 0x16<<7 | 0x55,\n\t22521 - 19968: jis0208<<14 | 0x26<<7 | 0x3C,\n\t22522 - 19968: jis0208<<14 | 0x13<<7 | 0x4F,\n\t22524 - 19968: jis0208<<14 | 0x19<<7 | 0x4A,\n\t22525 - 19968: jis0212<<14 | 0x16<<7 | 0x56,\n\t22526 - 19968: jis0212<<14 | 0x16<<7 | 0x57,\n\t22527 - 19968: jis0212<<14 | 0x16<<7 | 0x58,\n\t22528 - 19968: jis0208<<14 | 0x2A<<7 | 0x38,\n\t22530 - 19968: jis0208<<14 | 0x25<<7 | 0x11,\n\t22531 - 19968: jis0212<<14 | 0x16<<7 | 0x59,\n\t22532 - 19968: jis0212<<14 | 0x16<<7 | 0x5A,\n\t22533 - 19968: jis0208<<14 | 0x16<<7 | 0x57,\n\t22534 - 19968: jis0208<<14 | 0x21<<7 | 0x2E,\n\t22536 - 19968: jis0212<<14 | 0x16<<7 | 0x5B,\n\t22537 - 19968: jis0212<<14 | 0x16<<7 | 0x5C,\n\t22538 - 19968: jis0208<<14 | 0x33<<7 | 0x20,\n\t22539 - 19968: jis0208<<14 | 0x33<<7 | 0x23,\n\t22540 - 19968: jis0212<<14 | 0x17<<7 | 0x00,\n\t22541 - 19968: jis0212<<14 | 0x17<<7 | 0x01,\n\t22549 - 19968: jis0208<<14 | 0x21<<7 | 0x23,\n\t22553 - 19968: jis0208<<14 | 0x33<<7 | 0x24,\n\t22555 - 19968: jis0212<<14 | 0x17<<7 | 0x02,\n\t22557 - 19968: jis0208<<14 | 0x33<<7 | 0x25,\n\t22558 - 19968: jis0212<<14 | 0x17<<7 | 0x03,\n\t22559 - 19968: jis0212<<14 | 0x17<<7 | 0x04,\n\t22560 - 19968: jis0212<<14 | 0x17<<7 | 0x05,\n\t22561 - 19968: jis0208<<14 | 0x33<<7 | 0x27,\n\t22564 - 19968: jis0208<<14 | 0x23<<7 | 0x48,\n\t22566 - 19968: jis0212<<14 | 0x17<<7 | 0x06,\n\t22567 - 19968: jis0212<<14 | 0x17<<7 | 0x07,\n\t22570 - 19968: jis0208<<14 | 0x13<<7 | 0x0D,\n\t22573 - 19968: jis0212<<14 | 0x17<<7 | 0x08,\n\t22575 - 19968: jis0208<<14 | 0x53<<7 | 0x00,\n\t22576 - 19968: jis0208<<14 | 0x10<<7 | 0x40,\n\t22577 - 19968: jis0208<<14 | 0x29<<7 | 0x52,\n\t22578 - 19968: jis0212<<14 | 0x17<<7 | 0x09,\n\t22580 - 19968: jis0208<<14 | 0x1D<<7 | 0x4B,\n\t22581 - 19968: jis0208<<14 | 0x24<<7 | 0x27,\n\t22585 - 19968: jis0212<<14 | 0x17<<7 | 0x0A,\n\t22586 - 19968: jis0208<<14 | 0x19<<7 | 0x45,\n\t22589 - 19968: jis0208<<14 | 0x33<<7 | 0x2D,\n\t22591 - 19968: jis0212<<14 | 0x17<<7 | 0x0B,\n\t22592 - 19968: jis0208<<14 | 0x29<<7 | 0x1C,\n\t22593 - 19968: jis0208<<14 | 0x2D<<7 | 0x3C,\n\t22601 - 19968: jis0212<<14 | 0x17<<7 | 0x0C,\n\t22602 - 19968: jis0208<<14 | 0x11<<7 | 0x53,\n\t22603 - 19968: jis0208<<14 | 0x33<<7 | 0x29,\n\t22604 - 19968: jis0212<<14 | 0x17<<7 | 0x0D,\n\t22605 - 19968: jis0212<<14 | 0x17<<7 | 0x0E,\n\t22607 - 19968: jis0212<<14 | 0x17<<7 | 0x0F,\n\t22608 - 19968: jis0212<<14 | 0x17<<7 | 0x10,\n\t22609 - 19968: jis0208<<14 | 0x20<<7 | 0x19,\n\t22610 - 19968: jis0208<<14 | 0x33<<7 | 0x2C,\n\t22612 - 19968: jis0208<<14 | 0x24<<7 | 0x42,\n\t22613 - 19968: jis0212<<14 | 0x17<<7 | 0x11,\n\t22615 - 19968: jis0208<<14 | 0x24<<7 | 0x28,\n\t22616 - 19968: jis0208<<14 | 0x24<<7 | 0x43,\n\t22617 - 19968: jis0208<<14 | 0x27<<7 | 0x18,\n\t22618 - 19968: jis0208<<14 | 0x23<<7 | 0x2C,\n\t22622 - 19968: jis0208<<14 | 0x19<<7 | 0x28,\n\t22623 - 19968: jis0212<<14 | 0x17<<7 | 0x12,\n\t22625 - 19968: jis0212<<14 | 0x17<<7 | 0x13,\n\t22626 - 19968: jis0208<<14 | 0x33<<7 | 0x28,\n\t22628 - 19968: jis0212<<14 | 0x17<<7 | 0x14,\n\t22631 - 19968: jis0212<<14 | 0x17<<7 | 0x15,\n\t22632 - 19968: jis0212<<14 | 0x17<<7 | 0x16,\n\t22633 - 19968: jis0208<<14 | 0x10<<7 | 0x55,\n\t22635 - 19968: jis0208<<14 | 0x24<<7 | 0x15,\n\t22640 - 19968: jis0208<<14 | 0x33<<7 | 0x2A,\n\t22642 - 19968: jis0208<<14 | 0x33<<7 | 0x26,\n\t22645 - 19968: jis0208<<14 | 0x1E<<7 | 0x2F,\n\t22648 - 19968: jis0212<<14 | 0x17<<7 | 0x17,\n\t22649 - 19968: jis0208<<14 | 0x33<<7 | 0x2E,\n\t22652 - 19968: jis0212<<14 | 0x17<<7 | 0x18,\n\t22654 - 19968: jis0208<<14 | 0x1C<<7 | 0x2D,\n\t22655 - 19968: jis0212<<14 | 0x17<<7 | 0x19,\n\t22656 - 19968: jis0212<<14 | 0x17<<7 | 0x1A,\n\t22657 - 19968: jis0212<<14 | 0x17<<7 | 0x1B,\n\t22659 - 19968: jis0208<<14 | 0x15<<7 | 0x0C,\n\t22661 - 19968: jis0208<<14 | 0x33<<7 | 0x2F,\n\t22663 - 19968: jis0212<<14 | 0x17<<7 | 0x1C,\n\t22664 - 19968: jis0212<<14 | 0x17<<7 | 0x1D,\n\t22665 - 19968: jis0212<<14 | 0x17<<7 | 0x1E,\n\t22666 - 19968: jis0212<<14 | 0x17<<7 | 0x1F,\n\t22668 - 19968: jis0212<<14 | 0x17<<7 | 0x20,\n\t22669 - 19968: jis0212<<14 | 0x17<<7 | 0x21,\n\t22671 - 19968: jis0212<<14 | 0x17<<7 | 0x22,\n\t22672 - 19968: jis0212<<14 | 0x17<<7 | 0x23,\n\t22675 - 19968: jis0208<<14 | 0x29<<7 | 0x47,\n\t22676 - 19968: jis0212<<14 | 0x17<<7 | 0x24,\n\t22678 - 19968: jis0212<<14 | 0x17<<7 | 0x25,\n\t22679 - 19968: jis0208<<14 | 0x20<<7 | 0x5C,\n\t22684 - 19968: jis0208<<14 | 0x23<<7 | 0x25,\n\t22685 - 19968: jis0212<<14 | 0x17<<7 | 0x26,\n\t22686 - 19968: jis0208<<14 | 0x58<<7 | 0x40,\n\t22687 - 19968: jis0208<<14 | 0x33<<7 | 0x31,\n\t22688 - 19968: jis0212<<14 | 0x17<<7 | 0x27,\n\t22689 - 19968: jis0212<<14 | 0x17<<7 | 0x28,\n\t22690 - 19968: jis0212<<14 | 0x17<<7 | 0x29,\n\t22694 - 19968: jis0212<<14 | 0x17<<7 | 0x2A,\n\t22696 - 19968: jis0208<<14 | 0x2A<<7 | 0x2E,\n\t22697 - 19968: jis0212<<14 | 0x17<<7 | 0x2B,\n\t22699 - 19968: jis0208<<14 | 0x33<<7 | 0x32,\n\t22702 - 19968: jis0208<<14 | 0x33<<7 | 0x37,\n\t22705 - 19968: jis0212<<14 | 0x17<<7 | 0x2C,\n\t22706 - 19968: jis0208<<14 | 0x58<<7 | 0x41,\n\t22707 - 19968: jis0208<<14 | 0x29<<7 | 0x0E,\n\t22712 - 19968: jis0208<<14 | 0x33<<7 | 0x36,\n\t22713 - 19968: jis0208<<14 | 0x33<<7 | 0x30,\n\t22714 - 19968: jis0208<<14 | 0x33<<7 | 0x33,\n\t22715 - 19968: jis0208<<14 | 0x33<<7 | 0x35,\n\t22716 - 19968: jis0212<<14 | 0x17<<7 | 0x2F,\n\t22718 - 19968: jis0208<<14 | 0x19<<7 | 0x05,\n\t22721 - 19968: jis0208<<14 | 0x29<<7 | 0x28,\n\t22722 - 19968: jis0212<<14 | 0x17<<7 | 0x30,\n\t22724 - 19968: jis0212<<14 | 0x17<<7 | 0x2E,\n\t22725 - 19968: jis0208<<14 | 0x33<<7 | 0x38,\n\t22727 - 19968: jis0208<<14 | 0x22<<7 | 0x24,\n\t22728 - 19968: jis0212<<14 | 0x17<<7 | 0x31,\n\t22730 - 19968: jis0208<<14 | 0x11<<7 | 0x54,\n\t22732 - 19968: jis0208<<14 | 0x1D<<7 | 0x4C,\n\t22733 - 19968: jis0212<<14 | 0x17<<7 | 0x32,\n\t22734 - 19968: jis0212<<14 | 0x17<<7 | 0x33,\n\t22736 - 19968: jis0212<<14 | 0x17<<7 | 0x34,\n\t22737 - 19968: jis0208<<14 | 0x33<<7 | 0x3A,\n\t22738 - 19968: jis0212<<14 | 0x17<<7 | 0x35,\n\t22739 - 19968: jis0208<<14 | 0x33<<7 | 0x39,\n\t22740 - 19968: jis0212<<14 | 0x17<<7 | 0x36,\n\t22741 - 19968: jis0208<<14 | 0x18<<7 | 0x47,\n\t22742 - 19968: jis0212<<14 | 0x17<<7 | 0x37,\n\t22743 - 19968: jis0208<<14 | 0x33<<7 | 0x3B,\n\t22744 - 19968: jis0208<<14 | 0x33<<7 | 0x3D,\n\t22745 - 19968: jis0208<<14 | 0x33<<7 | 0x3C,\n\t22746 - 19968: jis0212<<14 | 0x17<<7 | 0x38,\n\t22748 - 19968: jis0208<<14 | 0x33<<7 | 0x3F,\n\t22749 - 19968: jis0212<<14 | 0x17<<7 | 0x39,\n\t22750 - 19968: jis0208<<14 | 0x33<<7 | 0x34,\n\t22751 - 19968: jis0208<<14 | 0x33<<7 | 0x41,\n\t22753 - 19968: jis0212<<14 | 0x17<<7 | 0x3A,\n\t22754 - 19968: jis0212<<14 | 0x17<<7 | 0x3B,\n\t22756 - 19968: jis0208<<14 | 0x33<<7 | 0x40,\n\t22757 - 19968: jis0208<<14 | 0x33<<7 | 0x3E,\n\t22761 - 19968: jis0212<<14 | 0x17<<7 | 0x3C,\n\t22763 - 19968: jis0208<<14 | 0x1A<<7 | 0x2D,\n\t22764 - 19968: jis0208<<14 | 0x1E<<7 | 0x30,\n\t22766 - 19968: jis0208<<14 | 0x20<<7 | 0x33,\n\t22767 - 19968: jis0208<<14 | 0x33<<7 | 0x42,\n\t22768 - 19968: jis0208<<14 | 0x1F<<7 | 0x1B,\n\t22769 - 19968: jis0208<<14 | 0x0F<<7 | 0x4C,\n\t22770 - 19968: jis0208<<14 | 0x26<<7 | 0x43,\n\t22771 - 19968: jis0212<<14 | 0x17<<7 | 0x3D,\n\t22775 - 19968: jis0208<<14 | 0x23<<7 | 0x3A,\n\t22777 - 19968: jis0208<<14 | 0x33<<7 | 0x44,\n\t22778 - 19968: jis0208<<14 | 0x33<<7 | 0x43,\n\t22779 - 19968: jis0208<<14 | 0x33<<7 | 0x45,\n\t22780 - 19968: jis0208<<14 | 0x33<<7 | 0x46,\n\t22781 - 19968: jis0208<<14 | 0x33<<7 | 0x47,\n\t22786 - 19968: jis0208<<14 | 0x33<<7 | 0x48,\n\t22789 - 19968: jis0212<<14 | 0x17<<7 | 0x3E,\n\t22790 - 19968: jis0212<<14 | 0x17<<7 | 0x3F,\n\t22793 - 19968: jis0208<<14 | 0x29<<7 | 0x30,\n\t22794 - 19968: jis0208<<14 | 0x33<<7 | 0x49,\n\t22795 - 19968: jis0208<<14 | 0x58<<7 | 0x42,\n\t22796 - 19968: jis0212<<14 | 0x17<<7 | 0x41,\n\t22799 - 19968: jis0208<<14 | 0x11<<7 | 0x25,\n\t22800 - 19968: jis0208<<14 | 0x33<<7 | 0x4A,\n\t22802 - 19968: jis0212<<14 | 0x17<<7 | 0x42,\n\t22803 - 19968: jis0212<<14 | 0x17<<7 | 0x43,\n\t22804 - 19968: jis0212<<14 | 0x17<<7 | 0x44,\n\t22805 - 19968: jis0208<<14 | 0x2C<<7 | 0x1B,\n\t22806 - 19968: jis0208<<14 | 0x12<<7 | 0x0F,\n\t22808 - 19968: jis0208<<14 | 0x31<<7 | 0x28,\n\t22809 - 19968: jis0208<<14 | 0x1C<<7 | 0x27,\n\t22810 - 19968: jis0208<<14 | 0x21<<7 | 0x1E,\n\t22811 - 19968: jis0208<<14 | 0x33<<7 | 0x4B,\n\t22812 - 19968: jis0208<<14 | 0x2B<<7 | 0x4A,\n\t22813 - 19968: jis0212<<14 | 0x17<<7 | 0x46,\n\t22817 - 19968: jis0212<<14 | 0x17<<7 | 0x47,\n\t22818 - 19968: jis0208<<14 | 0x2B<<7 | 0x13,\n\t22819 - 19968: jis0212<<14 | 0x17<<7 | 0x48,\n\t22820 - 19968: jis0212<<14 | 0x17<<7 | 0x49,\n\t22821 - 19968: jis0208<<14 | 0x33<<7 | 0x4D,\n\t22823 - 19968: jis0208<<14 | 0x21<<7 | 0x46,\n\t22824 - 19968: jis0212<<14 | 0x17<<7 | 0x4A,\n\t22825 - 19968: jis0208<<14 | 0x24<<7 | 0x16,\n\t22826 - 19968: jis0208<<14 | 0x21<<7 | 0x1F,\n\t22827 - 19968: jis0208<<14 | 0x28<<7 | 0x36,\n\t22828 - 19968: jis0208<<14 | 0x33<<7 | 0x4E,\n\t22829 - 19968: jis0208<<14 | 0x33<<7 | 0x4F,\n\t22830 - 19968: jis0208<<14 | 0x10<<7 | 0x5A,\n\t22831 - 19968: jis0212<<14 | 0x17<<7 | 0x4B,\n\t22832 - 19968: jis0212<<14 | 0x17<<7 | 0x4C,\n\t22833 - 19968: jis0208<<14 | 0x1B<<7 | 0x19,\n\t22834 - 19968: jis0208<<14 | 0x33<<7 | 0x50,\n\t22835 - 19968: jis0212<<14 | 0x17<<7 | 0x4D,\n\t22837 - 19968: jis0212<<14 | 0x17<<7 | 0x4E,\n\t22838 - 19968: jis0212<<14 | 0x17<<7 | 0x4F,\n\t22839 - 19968: jis0208<<14 | 0x0F<<7 | 0x2F,\n\t22840 - 19968: jis0208<<14 | 0x33<<7 | 0x51,\n\t22846 - 19968: jis0208<<14 | 0x33<<7 | 0x52,\n\t22847 - 19968: jis0212<<14 | 0x17<<7 | 0x50,\n\t22851 - 19968: jis0212<<14 | 0x17<<7 | 0x51,\n\t22852 - 19968: jis0208<<14 | 0x10<<7 | 0x41,\n\t22854 - 19968: jis0212<<14 | 0x17<<7 | 0x52,\n\t22855 - 19968: jis0208<<14 | 0x13<<7 | 0x50,\n\t22856 - 19968: jis0208<<14 | 0x25<<7 | 0x3F,\n\t22857 - 19968: jis0208<<14 | 0x29<<7 | 0x53,\n\t22862 - 19968: jis0208<<14 | 0x33<<7 | 0x56,\n\t22863 - 19968: jis0208<<14 | 0x20<<7 | 0x34,\n\t22864 - 19968: jis0208<<14 | 0x33<<7 | 0x55,\n\t22865 - 19968: jis0208<<14 | 0x16<<7 | 0x1F,\n\t22866 - 19968: jis0212<<14 | 0x17<<7 | 0x53,\n\t22867 - 19968: jis0208<<14 | 0x58<<7 | 0x43,\n\t22868 - 19968: jis0208<<14 | 0x2A<<7 | 0x3A,\n\t22869 - 19968: jis0208<<14 | 0x33<<7 | 0x54,\n\t22871 - 19968: jis0208<<14 | 0x24<<7 | 0x44,\n\t22872 - 19968: jis0208<<14 | 0x33<<7 | 0x58,\n\t22873 - 19968: jis0212<<14 | 0x17<<7 | 0x55,\n\t22874 - 19968: jis0208<<14 | 0x33<<7 | 0x57,\n\t22875 - 19968: jis0208<<14 | 0x58<<7 | 0x44,\n\t22877 - 19968: jis0208<<14 | 0x58<<7 | 0x45,\n\t22878 - 19968: jis0212<<14 | 0x17<<7 | 0x58,\n\t22879 - 19968: jis0212<<14 | 0x17<<7 | 0x59,\n\t22880 - 19968: jis0208<<14 | 0x33<<7 | 0x5A,\n\t22881 - 19968: jis0212<<14 | 0x17<<7 | 0x5A,\n\t22882 - 19968: jis0208<<14 | 0x33<<7 | 0x59,\n\t22883 - 19968: jis0208<<14 | 0x58<<7 | 0x46,\n\t22885 - 19968: jis0208<<14 | 0x10<<7 | 0x5B,\n\t22887 - 19968: jis0208<<14 | 0x33<<7 | 0x5B,\n\t22888 - 19968: jis0208<<14 | 0x1D<<7 | 0x08,\n\t22889 - 19968: jis0208<<14 | 0x33<<7 | 0x5D,\n\t22890 - 19968: jis0208<<14 | 0x22<<7 | 0x04,\n\t22891 - 19968: jis0212<<14 | 0x17<<7 | 0x5C,\n\t22892 - 19968: jis0208<<14 | 0x33<<7 | 0x5C,\n\t22893 - 19968: jis0212<<14 | 0x17<<7 | 0x5D,\n\t22894 - 19968: jis0208<<14 | 0x29<<7 | 0x12,\n\t22895 - 19968: jis0212<<14 | 0x18<<7 | 0x00,\n\t22898 - 19968: jis0212<<14 | 0x18<<7 | 0x01,\n\t22899 - 19968: jis0208<<14 | 0x1C<<7 | 0x56,\n\t22900 - 19968: jis0208<<14 | 0x24<<7 | 0x3A,\n\t22901 - 19968: jis0212<<14 | 0x18<<7 | 0x02,\n\t22902 - 19968: jis0212<<14 | 0x18<<7 | 0x03,\n\t22904 - 19968: jis0208<<14 | 0x34<<7 | 0x00,\n\t22905 - 19968: jis0212<<14 | 0x18<<7 | 0x04,\n\t22907 - 19968: jis0212<<14 | 0x18<<7 | 0x05,\n\t22908 - 19968: jis0212<<14 | 0x18<<7 | 0x06,\n\t22909 - 19968: jis0208<<14 | 0x18<<7 | 0x04,\n\t22913 - 19968: jis0208<<14 | 0x34<<7 | 0x01,\n\t22914 - 19968: jis0208<<14 | 0x26<<7 | 0x00,\n\t22915 - 19968: jis0208<<14 | 0x27<<7 | 0x3D,\n\t22916 - 19968: jis0208<<14 | 0x2B<<7 | 0x30,\n\t22922 - 19968: jis0208<<14 | 0x26<<7 | 0x04,\n\t22923 - 19968: jis0212<<14 | 0x18<<7 | 0x07,\n\t22924 - 19968: jis0212<<14 | 0x18<<7 | 0x08,\n\t22925 - 19968: jis0208<<14 | 0x34<<7 | 0x0A,\n\t22926 - 19968: jis0212<<14 | 0x18<<7 | 0x09,\n\t22930 - 19968: jis0212<<14 | 0x18<<7 | 0x0A,\n\t22931 - 19968: jis0208<<14 | 0x14<<7 | 0x17,\n\t22933 - 19968: jis0212<<14 | 0x18<<7 | 0x0B,\n\t22934 - 19968: jis0208<<14 | 0x2C<<7 | 0x24,\n\t22935 - 19968: jis0212<<14 | 0x18<<7 | 0x0C,\n\t22937 - 19968: jis0208<<14 | 0x2B<<7 | 0x0E,\n\t22939 - 19968: jis0208<<14 | 0x35<<7 | 0x0B,\n\t22941 - 19968: jis0208<<14 | 0x34<<7 | 0x02,\n\t22943 - 19968: jis0212<<14 | 0x18<<7 | 0x0D,\n\t22947 - 19968: jis0208<<14 | 0x34<<7 | 0x05,\n\t22948 - 19968: jis0208<<14 | 0x58<<7 | 0x47,\n\t22949 - 19968: jis0208<<14 | 0x21<<7 | 0x24,\n\t22951 - 19968: jis0212<<14 | 0x18<<7 | 0x0F,\n\t22952 - 19968: jis0208<<14 | 0x2A<<7 | 0x17,\n\t22956 - 19968: jis0208<<14 | 0x24<<7 | 0x29,\n\t22957 - 19968: jis0212<<14 | 0x18<<7 | 0x10,\n\t22958 - 19968: jis0212<<14 | 0x18<<7 | 0x11,\n\t22959 - 19968: jis0212<<14 | 0x18<<7 | 0x12,\n\t22960 - 19968: jis0212<<14 | 0x18<<7 | 0x13,\n\t22962 - 19968: jis0208<<14 | 0x34<<7 | 0x06,\n\t22963 - 19968: jis0212<<14 | 0x18<<7 | 0x14,\n\t22967 - 19968: jis0212<<14 | 0x18<<7 | 0x15,\n\t22969 - 19968: jis0208<<14 | 0x2A<<7 | 0x44,\n\t22970 - 19968: jis0208<<14 | 0x58<<7 | 0x48,\n\t22971 - 19968: jis0208<<14 | 0x19<<7 | 0x29,\n\t22972 - 19968: jis0212<<14 | 0x18<<7 | 0x17,\n\t22974 - 19968: jis0208<<14 | 0x1D<<7 | 0x09,\n\t22977 - 19968: jis0212<<14 | 0x18<<7 | 0x18,\n\t22979 - 19968: jis0212<<14 | 0x18<<7 | 0x19,\n\t22980 - 19968: jis0212<<14 | 0x18<<7 | 0x1A,\n\t22982 - 19968: jis0208<<14 | 0x34<<7 | 0x07,\n\t22984 - 19968: jis0212<<14 | 0x18<<7 | 0x1B,\n\t22985 - 19968: jis0208<<14 | 0x1A<<7 | 0x2F,\n\t22986 - 19968: jis0212<<14 | 0x18<<7 | 0x1C,\n\t22987 - 19968: jis0208<<14 | 0x1A<<7 | 0x2E,\n\t22989 - 19968: jis0212<<14 | 0x18<<7 | 0x1D,\n\t22992 - 19968: jis0208<<14 | 0x0F<<7 | 0x18,\n\t22993 - 19968: jis0208<<14 | 0x17<<7 | 0x27,\n\t22994 - 19968: jis0212<<14 | 0x18<<7 | 0x1E,\n\t22995 - 19968: jis0208<<14 | 0x1F<<7 | 0x0A,\n\t22996 - 19968: jis0208<<14 | 0x0F<<7 | 0x30,\n\t23001 - 19968: jis0208<<14 | 0x34<<7 | 0x0B,\n\t23002 - 19968: jis0208<<14 | 0x34<<7 | 0x0C,\n\t23004 - 19968: jis0208<<14 | 0x34<<7 | 0x09,\n\t23005 - 19968: jis0212<<14 | 0x18<<7 | 0x1F,\n\t23006 - 19968: jis0212<<14 | 0x18<<7 | 0x20,\n\t23007 - 19968: jis0212<<14 | 0x18<<7 | 0x21,\n\t23011 - 19968: jis0212<<14 | 0x18<<7 | 0x22,\n\t23012 - 19968: jis0212<<14 | 0x18<<7 | 0x23,\n\t23013 - 19968: jis0208<<14 | 0x10<<7 | 0x17,\n\t23014 - 19968: jis0208<<14 | 0x13<<7 | 0x0E,\n\t23015 - 19968: jis0212<<14 | 0x18<<7 | 0x24,\n\t23016 - 19968: jis0208<<14 | 0x34<<7 | 0x08,\n\t23018 - 19968: jis0208<<14 | 0x2B<<7 | 0x24,\n\t23019 - 19968: jis0208<<14 | 0x28<<7 | 0x10,\n\t23022 - 19968: jis0212<<14 | 0x18<<7 | 0x25,\n\t23023 - 19968: jis0212<<14 | 0x18<<7 | 0x26,\n\t23025 - 19968: jis0212<<14 | 0x18<<7 | 0x27,\n\t23026 - 19968: jis0212<<14 | 0x18<<7 | 0x28,\n\t23028 - 19968: jis0212<<14 | 0x18<<7 | 0x29,\n\t23030 - 19968: jis0208<<14 | 0x0F<<7 | 0x07,\n\t23031 - 19968: jis0212<<14 | 0x18<<7 | 0x2A,\n\t23035 - 19968: jis0208<<14 | 0x0F<<7 | 0x58,\n\t23039 - 19968: jis0208<<14 | 0x1A<<7 | 0x30,\n\t23040 - 19968: jis0212<<14 | 0x18<<7 | 0x2B,\n\t23041 - 19968: jis0208<<14 | 0x0F<<7 | 0x31,\n\t23043 - 19968: jis0208<<14 | 0x0F<<7 | 0x02,\n\t23044 - 19968: jis0212<<14 | 0x18<<7 | 0x2C,\n\t23049 - 19968: jis0208<<14 | 0x34<<7 | 0x11,\n\t23052 - 19968: jis0212<<14 | 0x18<<7 | 0x2D,\n\t23053 - 19968: jis0212<<14 | 0x18<<7 | 0x2E,\n\t23054 - 19968: jis0212<<14 | 0x18<<7 | 0x2F,\n\t23057 - 19968: jis0208<<14 | 0x34<<7 | 0x0F,\n\t23058 - 19968: jis0212<<14 | 0x18<<7 | 0x30,\n\t23059 - 19968: jis0212<<14 | 0x18<<7 | 0x31,\n\t23064 - 19968: jis0208<<14 | 0x2B<<7 | 0x1B,\n\t23066 - 19968: jis0208<<14 | 0x34<<7 | 0x12,\n\t23068 - 19968: jis0208<<14 | 0x34<<7 | 0x10,\n\t23070 - 19968: jis0212<<14 | 0x18<<7 | 0x32,\n\t23071 - 19968: jis0208<<14 | 0x34<<7 | 0x0E,\n\t23072 - 19968: jis0208<<14 | 0x1E<<7 | 0x10,\n\t23075 - 19968: jis0212<<14 | 0x18<<7 | 0x33,\n\t23076 - 19968: jis0212<<14 | 0x18<<7 | 0x34,\n\t23077 - 19968: jis0208<<14 | 0x34<<7 | 0x0D,\n\t23079 - 19968: jis0212<<14 | 0x18<<7 | 0x35,\n\t23080 - 19968: jis0212<<14 | 0x18<<7 | 0x36,\n\t23081 - 19968: jis0208<<14 | 0x29<<7 | 0x39,\n\t23082 - 19968: jis0212<<14 | 0x18<<7 | 0x37,\n\t23085 - 19968: jis0212<<14 | 0x18<<7 | 0x38,\n\t23087 - 19968: jis0208<<14 | 0x17<<7 | 0x43,\n\t23088 - 19968: jis0212<<14 | 0x18<<7 | 0x39,\n\t23093 - 19968: jis0208<<14 | 0x34<<7 | 0x16,\n\t23094 - 19968: jis0208<<14 | 0x34<<7 | 0x17,\n\t23100 - 19968: jis0208<<14 | 0x1D<<7 | 0x0A,\n\t23104 - 19968: jis0208<<14 | 0x34<<7 | 0x13,\n\t23105 - 19968: jis0208<<14 | 0x2E<<7 | 0x0B,\n\t23108 - 19968: jis0212<<14 | 0x18<<7 | 0x3A,\n\t23109 - 19968: jis0212<<14 | 0x18<<7 | 0x3B,\n\t23110 - 19968: jis0208<<14 | 0x26<<7 | 0x2B,\n\t23111 - 19968: jis0212<<14 | 0x18<<7 | 0x3C,\n\t23112 - 19968: jis0212<<14 | 0x18<<7 | 0x3D,\n\t23113 - 19968: jis0208<<14 | 0x34<<7 | 0x15,\n\t23116 - 19968: jis0212<<14 | 0x18<<7 | 0x3E,\n\t23120 - 19968: jis0212<<14 | 0x18<<7 | 0x3F,\n\t23125 - 19968: jis0212<<14 | 0x18<<7 | 0x40,\n\t23130 - 19968: jis0208<<14 | 0x19<<7 | 0x06,\n\t23134 - 19968: jis0212<<14 | 0x18<<7 | 0x41,\n\t23138 - 19968: jis0208<<14 | 0x34<<7 | 0x18,\n\t23139 - 19968: jis0212<<14 | 0x18<<7 | 0x42,\n\t23141 - 19968: jis0212<<14 | 0x18<<7 | 0x43,\n\t23142 - 19968: jis0208<<14 | 0x28<<7 | 0x37,\n\t23143 - 19968: jis0212<<14 | 0x18<<7 | 0x44,\n\t23146 - 19968: jis0208<<14 | 0x34<<7 | 0x19,\n\t23148 - 19968: jis0208<<14 | 0x34<<7 | 0x14,\n\t23149 - 19968: jis0212<<14 | 0x18<<7 | 0x45,\n\t23159 - 19968: jis0212<<14 | 0x18<<7 | 0x46,\n\t23162 - 19968: jis0212<<14 | 0x18<<7 | 0x47,\n\t23163 - 19968: jis0212<<14 | 0x18<<7 | 0x48,\n\t23166 - 19968: jis0212<<14 | 0x18<<7 | 0x49,\n\t23167 - 19968: jis0208<<14 | 0x2B<<7 | 0x1A,\n\t23179 - 19968: jis0212<<14 | 0x18<<7 | 0x4A,\n\t23184 - 19968: jis0212<<14 | 0x18<<7 | 0x4B,\n\t23186 - 19968: jis0208<<14 | 0x26<<7 | 0x3D,\n\t23187 - 19968: jis0212<<14 | 0x18<<7 | 0x4C,\n\t23190 - 19968: jis0212<<14 | 0x18<<7 | 0x4D,\n\t23193 - 19968: jis0212<<14 | 0x18<<7 | 0x4E,\n\t23194 - 19968: jis0208<<14 | 0x34<<7 | 0x1A,\n\t23195 - 19968: jis0208<<14 | 0x28<<7 | 0x11,\n\t23196 - 19968: jis0212<<14 | 0x18<<7 | 0x4F,\n\t23198 - 19968: jis0212<<14 | 0x18<<7 | 0x50,\n\t23199 - 19968: jis0212<<14 | 0x18<<7 | 0x51,\n\t23200 - 19968: jis0212<<14 | 0x18<<7 | 0x52,\n\t23202 - 19968: jis0212<<14 | 0x18<<7 | 0x53,\n\t23207 - 19968: jis0212<<14 | 0x18<<7 | 0x54,\n\t23212 - 19968: jis0212<<14 | 0x18<<7 | 0x55,\n\t23217 - 19968: jis0212<<14 | 0x18<<7 | 0x56,\n\t23218 - 19968: jis0212<<14 | 0x18<<7 | 0x57,\n\t23219 - 19968: jis0212<<14 | 0x18<<7 | 0x58,\n\t23221 - 19968: jis0212<<14 | 0x18<<7 | 0x59,\n\t23224 - 19968: jis0212<<14 | 0x18<<7 | 0x5A,\n\t23226 - 19968: jis0212<<14 | 0x18<<7 | 0x5B,\n\t23227 - 19968: jis0212<<14 | 0x18<<7 | 0x5C,\n\t23228 - 19968: jis0208<<14 | 0x34<<7 | 0x1B,\n\t23229 - 19968: jis0208<<14 | 0x34<<7 | 0x1F,\n\t23230 - 19968: jis0208<<14 | 0x34<<7 | 0x1C,\n\t23231 - 19968: jis0212<<14 | 0x18<<7 | 0x5D,\n\t23233 - 19968: jis0208<<14 | 0x11<<7 | 0x26,\n\t23234 - 19968: jis0208<<14 | 0x34<<7 | 0x1E,\n\t23236 - 19968: jis0212<<14 | 0x19<<7 | 0x00,\n\t23238 - 19968: jis0212<<14 | 0x19<<7 | 0x01,\n\t23240 - 19968: jis0212<<14 | 0x19<<7 | 0x02,\n\t23241 - 19968: jis0208<<14 | 0x1B<<7 | 0x1A,\n\t23243 - 19968: jis0208<<14 | 0x34<<7 | 0x1D,\n\t23244 - 19968: jis0208<<14 | 0x16<<7 | 0x58,\n\t23247 - 19968: jis0212<<14 | 0x19<<7 | 0x03,\n\t23248 - 19968: jis0208<<14 | 0x34<<7 | 0x2B,\n\t23254 - 19968: jis0208<<14 | 0x34<<7 | 0x24,\n\t23255 - 19968: jis0208<<14 | 0x34<<7 | 0x21,\n\t23258 - 19968: jis0212<<14 | 0x19<<7 | 0x04,\n\t23260 - 19968: jis0212<<14 | 0x19<<7 | 0x05,\n\t23264 - 19968: jis0212<<14 | 0x19<<7 | 0x06,\n\t23265 - 19968: jis0208<<14 | 0x22<<7 | 0x43,\n\t23267 - 19968: jis0208<<14 | 0x34<<7 | 0x20,\n\t23269 - 19968: jis0212<<14 | 0x19<<7 | 0x07,\n\t23270 - 19968: jis0208<<14 | 0x34<<7 | 0x22,\n\t23273 - 19968: jis0208<<14 | 0x34<<7 | 0x23,\n\t23274 - 19968: jis0212<<14 | 0x19<<7 | 0x08,\n\t23278 - 19968: jis0212<<14 | 0x19<<7 | 0x09,\n\t23285 - 19968: jis0212<<14 | 0x19<<7 | 0x0A,\n\t23286 - 19968: jis0212<<14 | 0x19<<7 | 0x0B,\n\t23290 - 19968: jis0208<<14 | 0x34<<7 | 0x25,\n\t23291 - 19968: jis0208<<14 | 0x34<<7 | 0x26,\n\t23293 - 19968: jis0212<<14 | 0x19<<7 | 0x0C,\n\t23296 - 19968: jis0212<<14 | 0x19<<7 | 0x0D,\n\t23297 - 19968: jis0212<<14 | 0x19<<7 | 0x0E,\n\t23304 - 19968: jis0212<<14 | 0x19<<7 | 0x0F,\n\t23305 - 19968: jis0208<<14 | 0x13<<7 | 0x51,\n\t23307 - 19968: jis0208<<14 | 0x34<<7 | 0x28,\n\t23308 - 19968: jis0208<<14 | 0x34<<7 | 0x27,\n\t23318 - 19968: jis0208<<14 | 0x34<<7 | 0x29,\n\t23319 - 19968: jis0212<<14 | 0x19<<7 | 0x10,\n\t23321 - 19968: jis0212<<14 | 0x19<<7 | 0x12,\n\t23323 - 19968: jis0212<<14 | 0x19<<7 | 0x13,\n\t23325 - 19968: jis0212<<14 | 0x19<<7 | 0x14,\n\t23329 - 19968: jis0212<<14 | 0x19<<7 | 0x15,\n\t23330 - 19968: jis0208<<14 | 0x1D<<7 | 0x4D,\n\t23333 - 19968: jis0212<<14 | 0x19<<7 | 0x16,\n\t23338 - 19968: jis0208<<14 | 0x34<<7 | 0x2C,\n\t23340 - 19968: jis0208<<14 | 0x23<<7 | 0x3B,\n\t23341 - 19968: jis0212<<14 | 0x19<<7 | 0x17,\n\t23344 - 19968: jis0208<<14 | 0x10<<7 | 0x24,\n\t23346 - 19968: jis0208<<14 | 0x34<<7 | 0x2A,\n\t23348 - 19968: jis0212<<14 | 0x19<<7 | 0x11,\n\t23350 - 19968: jis0208<<14 | 0x34<<7 | 0x2D,\n\t23352 - 19968: jis0212<<14 | 0x19<<7 | 0x18,\n\t23358 - 19968: jis0208<<14 | 0x34<<7 | 0x2E,\n\t23360 - 19968: jis0208<<14 | 0x34<<7 | 0x31,\n\t23361 - 19968: jis0212<<14 | 0x19<<7 | 0x19,\n\t23363 - 19968: jis0208<<14 | 0x34<<7 | 0x2F,\n\t23365 - 19968: jis0208<<14 | 0x34<<7 | 0x30,\n\t23371 - 19968: jis0212<<14 | 0x19<<7 | 0x1A,\n\t23372 - 19968: jis0212<<14 | 0x19<<7 | 0x1B,\n\t23376 - 19968: jis0208<<14 | 0x1A<<7 | 0x31,\n\t23377 - 19968: jis0208<<14 | 0x34<<7 | 0x32,\n\t23378 - 19968: jis0212<<14 | 0x19<<7 | 0x1C,\n\t23380 - 19968: jis0208<<14 | 0x18<<7 | 0x05,\n\t23381 - 19968: jis0208<<14 | 0x34<<7 | 0x33,\n\t23382 - 19968: jis0208<<14 | 0x58<<7 | 0x49,\n\t23383 - 19968: jis0208<<14 | 0x1A<<7 | 0x59,\n\t23384 - 19968: jis0208<<14 | 0x21<<7 | 0x17,\n\t23386 - 19968: jis0208<<14 | 0x34<<7 | 0x34,\n\t23387 - 19968: jis0208<<14 | 0x34<<7 | 0x35,\n\t23388 - 19968: jis0208<<14 | 0x1A<<7 | 0x39,\n\t23389 - 19968: jis0208<<14 | 0x18<<7 | 0x06,\n\t23390 - 19968: jis0212<<14 | 0x19<<7 | 0x1E,\n\t23391 - 19968: jis0208<<14 | 0x2B<<7 | 0x31,\n\t23395 - 19968: jis0208<<14 | 0x14<<7 | 0x07,\n\t23396 - 19968: jis0208<<14 | 0x17<<7 | 0x28,\n\t23397 - 19968: jis0208<<14 | 0x34<<7 | 0x36,\n\t23398 - 19968: jis0208<<14 | 0x12<<7 | 0x37,\n\t23400 - 19968: jis0212<<14 | 0x19<<7 | 0x1F,\n\t23401 - 19968: jis0208<<14 | 0x34<<7 | 0x37,\n\t23403 - 19968: jis0208<<14 | 0x21<<7 | 0x18,\n\t23406 - 19968: jis0212<<14 | 0x19<<7 | 0x20,\n\t23407 - 19968: jis0212<<14 | 0x19<<7 | 0x21,\n\t23408 - 19968: jis0208<<14 | 0x34<<7 | 0x38,\n\t23409 - 19968: jis0208<<14 | 0x35<<7 | 0x02,\n\t23411 - 19968: jis0208<<14 | 0x34<<7 | 0x39,\n\t23413 - 19968: jis0208<<14 | 0x34<<7 | 0x3A,\n\t23416 - 19968: jis0208<<14 | 0x34<<7 | 0x3B,\n\t23418 - 19968: jis0208<<14 | 0x34<<7 | 0x3D,\n\t23420 - 19968: jis0212<<14 | 0x19<<7 | 0x22,\n\t23421 - 19968: jis0212<<14 | 0x19<<7 | 0x23,\n\t23422 - 19968: jis0212<<14 | 0x19<<7 | 0x24,\n\t23423 - 19968: jis0212<<14 | 0x19<<7 | 0x25,\n\t23424 - 19968: jis0208<<14 | 0x34<<7 | 0x3E,\n\t23425 - 19968: jis0212<<14 | 0x19<<7 | 0x26,\n\t23427 - 19968: jis0208<<14 | 0x34<<7 | 0x3F,\n\t23428 - 19968: jis0212<<14 | 0x19<<7 | 0x27,\n\t23429 - 19968: jis0208<<14 | 0x21<<7 | 0x4F,\n\t23430 - 19968: jis0212<<14 | 0x19<<7 | 0x28,\n\t23431 - 19968: jis0208<<14 | 0x10<<7 | 0x06,\n\t23432 - 19968: jis0208<<14 | 0x1B<<7 | 0x48,\n\t23433 - 19968: jis0208<<14 | 0x0F<<7 | 0x21,\n\t23434 - 19968: jis0212<<14 | 0x19<<7 | 0x29,\n\t23435 - 19968: jis0208<<14 | 0x20<<7 | 0x36,\n\t23436 - 19968: jis0208<<14 | 0x13<<7 | 0x0F,\n\t23437 - 19968: jis0208<<14 | 0x1B<<7 | 0x14,\n\t23438 - 19968: jis0212<<14 | 0x19<<7 | 0x2A,\n\t23439 - 19968: jis0208<<14 | 0x18<<7 | 0x07,\n\t23440 - 19968: jis0212<<14 | 0x19<<7 | 0x2B,\n\t23441 - 19968: jis0212<<14 | 0x19<<7 | 0x2C,\n\t23443 - 19968: jis0212<<14 | 0x19<<7 | 0x2D,\n\t23444 - 19968: jis0212<<14 | 0x19<<7 | 0x2E,\n\t23445 - 19968: jis0208<<14 | 0x24<<7 | 0x45,\n\t23446 - 19968: jis0212<<14 | 0x19<<7 | 0x2F,\n\t23447 - 19968: jis0208<<14 | 0x1C<<7 | 0x00,\n\t23448 - 19968: jis0208<<14 | 0x13<<7 | 0x10,\n\t23449 - 19968: jis0208<<14 | 0x22<<7 | 0x47,\n\t23450 - 19968: jis0208<<14 | 0x23<<7 | 0x49,\n\t23451 - 19968: jis0208<<14 | 0x0F<<7 | 0x17,\n\t23452 - 19968: jis0208<<14 | 0x14<<7 | 0x18,\n\t23453 - 19968: jis0208<<14 | 0x29<<7 | 0x54,\n\t23455 - 19968: jis0208<<14 | 0x1B<<7 | 0x21,\n\t23458 - 19968: jis0208<<14 | 0x14<<7 | 0x31,\n\t23459 - 19968: jis0208<<14 | 0x1F<<7 | 0x4A,\n\t23460 - 19968: jis0208<<14 | 0x1B<<7 | 0x1B,\n\t23461 - 19968: jis0208<<14 | 0x2C<<7 | 0x07,\n\t23462 - 19968: jis0208<<14 | 0x34<<7 | 0x40,\n\t23464 - 19968: jis0212<<14 | 0x19<<7 | 0x30,\n\t23465 - 19968: jis0212<<14 | 0x19<<7 | 0x31,\n\t23468 - 19968: jis0212<<14 | 0x19<<7 | 0x32,\n\t23469 - 19968: jis0212<<14 | 0x19<<7 | 0x33,\n\t23470 - 19968: jis0208<<14 | 0x14<<7 | 0x3B,\n\t23471 - 19968: jis0212<<14 | 0x19<<7 | 0x34,\n\t23472 - 19968: jis0208<<14 | 0x19<<7 | 0x2A,\n\t23473 - 19968: jis0212<<14 | 0x19<<7 | 0x35,\n\t23474 - 19968: jis0212<<14 | 0x19<<7 | 0x36,\n\t23475 - 19968: jis0208<<14 | 0x12<<7 | 0x11,\n\t23476 - 19968: jis0208<<14 | 0x10<<7 | 0x42,\n\t23477 - 19968: jis0208<<14 | 0x1D<<7 | 0x0B,\n\t23478 - 19968: jis0208<<14 | 0x11<<7 | 0x27,\n\t23479 - 19968: jis0212<<14 | 0x19<<7 | 0x37,\n\t23480 - 19968: jis0208<<14 | 0x34<<7 | 0x41,\n\t23481 - 19968: jis0208<<14 | 0x2C<<7 | 0x25,\n\t23482 - 19968: jis0212<<14 | 0x19<<7 | 0x38,\n\t23484 - 19968: jis0212<<14 | 0x19<<7 | 0x39,\n\t23487 - 19968: jis0208<<14 | 0x1C<<7 | 0x28,\n\t23488 - 19968: jis0208<<14 | 0x58<<7 | 0x4A,\n\t23489 - 19968: jis0212<<14 | 0x19<<7 | 0x3B,\n\t23490 - 19968: jis0208<<14 | 0x1B<<7 | 0x43,\n\t23491 - 19968: jis0208<<14 | 0x34<<7 | 0x42,\n\t23492 - 19968: jis0208<<14 | 0x13<<7 | 0x52,\n\t23493 - 19968: jis0208<<14 | 0x25<<7 | 0x31,\n\t23494 - 19968: jis0208<<14 | 0x2B<<7 | 0x08,\n\t23495 - 19968: jis0208<<14 | 0x34<<7 | 0x43,\n\t23497 - 19968: jis0208<<14 | 0x34<<7 | 0x44,\n\t23500 - 19968: jis0208<<14 | 0x28<<7 | 0x38,\n\t23501 - 19968: jis0212<<14 | 0x19<<7 | 0x3C,\n\t23503 - 19968: jis0212<<14 | 0x19<<7 | 0x3D,\n\t23504 - 19968: jis0208<<14 | 0x34<<7 | 0x46,\n\t23506 - 19968: jis0208<<14 | 0x13<<7 | 0x07,\n\t23507 - 19968: jis0208<<14 | 0x15<<7 | 0x56,\n\t23508 - 19968: jis0208<<14 | 0x34<<7 | 0x45,\n\t23510 - 19968: jis0212<<14 | 0x19<<7 | 0x3E,\n\t23511 - 19968: jis0212<<14 | 0x19<<7 | 0x3F,\n\t23512 - 19968: jis0208<<14 | 0x58<<7 | 0x4C,\n\t23513 - 19968: jis0212<<14 | 0x19<<7 | 0x41,\n\t23514 - 19968: jis0212<<14 | 0x19<<7 | 0x42,\n\t23515 - 19968: jis0208<<14 | 0x13<<7 | 0x11,\n\t23517 - 19968: jis0208<<14 | 0x1E<<7 | 0x11,\n\t23518 - 19968: jis0208<<14 | 0x34<<7 | 0x4A,\n\t23519 - 19968: jis0208<<14 | 0x1A<<7 | 0x00,\n\t23520 - 19968: jis0212<<14 | 0x19<<7 | 0x43,\n\t23521 - 19968: jis0208<<14 | 0x11<<7 | 0x28,\n\t23522 - 19968: jis0208<<14 | 0x34<<7 | 0x49,\n\t23524 - 19968: jis0208<<14 | 0x34<<7 | 0x47,\n\t23525 - 19968: jis0208<<14 | 0x34<<7 | 0x4B,\n\t23526 - 19968: jis0208<<14 | 0x34<<7 | 0x48,\n\t23527 - 19968: jis0208<<14 | 0x26<<7 | 0x0A,\n\t23528 - 19968: jis0208<<14 | 0x3B<<7 | 0x2C,\n\t23529 - 19968: jis0208<<14 | 0x1E<<7 | 0x12,\n\t23531 - 19968: jis0208<<14 | 0x34<<7 | 0x4C,\n\t23532 - 19968: jis0208<<14 | 0x58<<7 | 0x4D,\n\t23534 - 19968: jis0208<<14 | 0x2D<<7 | 0x1F,\n\t23535 - 19968: jis0212<<14 | 0x19<<7 | 0x44,\n\t23536 - 19968: jis0208<<14 | 0x34<<7 | 0x4D,\n\t23537 - 19968: jis0212<<14 | 0x19<<7 | 0x45,\n\t23539 - 19968: jis0208<<14 | 0x34<<7 | 0x4F,\n\t23540 - 19968: jis0212<<14 | 0x19<<7 | 0x46,\n\t23541 - 19968: jis0208<<14 | 0x22<<7 | 0x5D,\n\t23542 - 19968: jis0208<<14 | 0x34<<7 | 0x4E,\n\t23544 - 19968: jis0208<<14 | 0x1F<<7 | 0x02,\n\t23546 - 19968: jis0208<<14 | 0x1A<<7 | 0x5A,\n\t23549 - 19968: jis0212<<14 | 0x19<<7 | 0x47,\n\t23550 - 19968: jis0208<<14 | 0x21<<7 | 0x2F,\n\t23551 - 19968: jis0208<<14 | 0x1B<<7 | 0x56,\n\t23553 - 19968: jis0208<<14 | 0x28<<7 | 0x54,\n\t23554 - 19968: jis0208<<14 | 0x1F<<7 | 0x4B,\n\t23556 - 19968: jis0208<<14 | 0x1B<<7 | 0x2C,\n\t23557 - 19968: jis0208<<14 | 0x34<<7 | 0x50,\n\t23558 - 19968: jis0208<<14 | 0x1D<<7 | 0x0C,\n\t23559 - 19968: jis0208<<14 | 0x34<<7 | 0x51,\n\t23560 - 19968: jis0208<<14 | 0x34<<7 | 0x52,\n\t23561 - 19968: jis0208<<14 | 0x0F<<7 | 0x32,\n\t23562 - 19968: jis0208<<14 | 0x21<<7 | 0x19,\n\t23563 - 19968: jis0208<<14 | 0x1E<<7 | 0x31,\n\t23564 - 19968: jis0212<<14 | 0x19<<7 | 0x48,\n\t23565 - 19968: jis0208<<14 | 0x34<<7 | 0x53,\n\t23566 - 19968: jis0208<<14 | 0x25<<7 | 0x12,\n\t23567 - 19968: jis0208<<14 | 0x1D<<7 | 0x0D,\n\t23569 - 19968: jis0208<<14 | 0x1D<<7 | 0x0E,\n\t23571 - 19968: jis0208<<14 | 0x34<<7 | 0x54,\n\t23574 - 19968: jis0208<<14 | 0x1F<<7 | 0x4C,\n\t23575 - 19968: jis0212<<14 | 0x19<<7 | 0x49,\n\t23578 - 19968: jis0208<<14 | 0x1D<<7 | 0x0F,\n\t23582 - 19968: jis0208<<14 | 0x58<<7 | 0x4E,\n\t23583 - 19968: jis0212<<14 | 0x19<<7 | 0x4B,\n\t23584 - 19968: jis0208<<14 | 0x34<<7 | 0x55,\n\t23586 - 19968: jis0208<<14 | 0x34<<7 | 0x56,\n\t23587 - 19968: jis0212<<14 | 0x19<<7 | 0x4C,\n\t23588 - 19968: jis0208<<14 | 0x2B<<7 | 0x3F,\n\t23590 - 19968: jis0212<<14 | 0x19<<7 | 0x4D,\n\t23592 - 19968: jis0208<<14 | 0x34<<7 | 0x57,\n\t23593 - 19968: jis0212<<14 | 0x19<<7 | 0x4E,\n\t23595 - 19968: jis0212<<14 | 0x19<<7 | 0x4F,\n\t23596 - 19968: jis0212<<14 | 0x19<<7 | 0x50,\n\t23597 - 19968: jis0208<<14 | 0x15<<7 | 0x25,\n\t23598 - 19968: jis0212<<14 | 0x19<<7 | 0x51,\n\t23600 - 19968: jis0212<<14 | 0x19<<7 | 0x52,\n\t23601 - 19968: jis0208<<14 | 0x1C<<7 | 0x01,\n\t23602 - 19968: jis0212<<14 | 0x19<<7 | 0x53,\n\t23605 - 19968: jis0212<<14 | 0x19<<7 | 0x54,\n\t23606 - 19968: jis0212<<14 | 0x19<<7 | 0x55,\n\t23608 - 19968: jis0208<<14 | 0x34<<7 | 0x58,\n\t23609 - 19968: jis0208<<14 | 0x34<<7 | 0x59,\n\t23610 - 19968: jis0208<<14 | 0x1B<<7 | 0x3B,\n\t23611 - 19968: jis0208<<14 | 0x1E<<7 | 0x0B,\n\t23612 - 19968: jis0208<<14 | 0x25<<7 | 0x53,\n\t23613 - 19968: jis0208<<14 | 0x1E<<7 | 0x33,\n\t23614 - 19968: jis0208<<14 | 0x27<<7 | 0x57,\n\t23615 - 19968: jis0208<<14 | 0x26<<7 | 0x01,\n\t23616 - 19968: jis0208<<14 | 0x15<<7 | 0x28,\n\t23617 - 19968: jis0208<<14 | 0x34<<7 | 0x5A,\n\t23621 - 19968: jis0208<<14 | 0x14<<7 | 0x4E,\n\t23622 - 19968: jis0208<<14 | 0x34<<7 | 0x5B,\n\t23624 - 19968: jis0208<<14 | 0x15<<7 | 0x5D,\n\t23626 - 19968: jis0208<<14 | 0x25<<7 | 0x2E,\n\t23627 - 19968: jis0208<<14 | 0x11<<7 | 0x0F,\n\t23629 - 19968: jis0208<<14 | 0x1A<<7 | 0x32,\n\t23630 - 19968: jis0208<<14 | 0x34<<7 | 0x5C,\n\t23631 - 19968: jis0208<<14 | 0x35<<7 | 0x01,\n\t23632 - 19968: jis0208<<14 | 0x35<<7 | 0x00,\n\t23633 - 19968: jis0208<<14 | 0x15<<7 | 0x5C,\n\t23635 - 19968: jis0208<<14 | 0x34<<7 | 0x5D,\n\t23637 - 19968: jis0208<<14 | 0x24<<7 | 0x17,\n\t23641 - 19968: jis0212<<14 | 0x19<<7 | 0x56,\n\t23642 - 19968: jis0212<<14 | 0x19<<7 | 0x57,\n\t23644 - 19968: jis0212<<14 | 0x19<<7 | 0x58,\n\t23646 - 19968: jis0208<<14 | 0x21<<7 | 0x0F,\n\t23648 - 19968: jis0208<<14 | 0x24<<7 | 0x2A,\n\t23649 - 19968: jis0208<<14 | 0x1B<<7 | 0x27,\n\t23650 - 19968: jis0212<<14 | 0x19<<7 | 0x59,\n\t23651 - 19968: jis0212<<14 | 0x19<<7 | 0x5A,\n\t23652 - 19968: jis0208<<14 | 0x20<<7 | 0x37,\n\t23653 - 19968: jis0208<<14 | 0x2C<<7 | 0x59,\n\t23655 - 19968: jis0212<<14 | 0x19<<7 | 0x5B,\n\t23656 - 19968: jis0212<<14 | 0x19<<7 | 0x5C,\n\t23657 - 19968: jis0212<<14 | 0x19<<7 | 0x5D,\n\t23660 - 19968: jis0208<<14 | 0x35<<7 | 0x03,\n\t23661 - 19968: jis0212<<14 | 0x1A<<7 | 0x00,\n\t23662 - 19968: jis0208<<14 | 0x35<<7 | 0x04,\n\t23663 - 19968: jis0208<<14 | 0x25<<7 | 0x35,\n\t23664 - 19968: jis0212<<14 | 0x1A<<7 | 0x01,\n\t23665 - 19968: jis0208<<14 | 0x1A<<7 | 0x12,\n\t23668 - 19968: jis0212<<14 | 0x1A<<7 | 0x02,\n\t23669 - 19968: jis0212<<14 | 0x1A<<7 | 0x03,\n\t23670 - 19968: jis0208<<14 | 0x35<<7 | 0x06,\n\t23673 - 19968: jis0208<<14 | 0x35<<7 | 0x07,\n\t23674 - 19968: jis0212<<14 | 0x1A<<7 | 0x04,\n\t23675 - 19968: jis0212<<14 | 0x1A<<7 | 0x05,\n\t23676 - 19968: jis0212<<14 | 0x1A<<7 | 0x06,\n\t23677 - 19968: jis0212<<14 | 0x1A<<7 | 0x07,\n\t23687 - 19968: jis0212<<14 | 0x1A<<7 | 0x08,\n\t23688 - 19968: jis0212<<14 | 0x1A<<7 | 0x09,\n\t23690 - 19968: jis0212<<14 | 0x1A<<7 | 0x0A,\n\t23692 - 19968: jis0208<<14 | 0x35<<7 | 0x08,\n\t23695 - 19968: jis0212<<14 | 0x1A<<7 | 0x0B,\n\t23696 - 19968: jis0208<<14 | 0x13<<7 | 0x53,\n\t23697 - 19968: jis0208<<14 | 0x35<<7 | 0x09,\n\t23698 - 19968: jis0212<<14 | 0x1A<<7 | 0x0C,\n\t23700 - 19968: jis0208<<14 | 0x35<<7 | 0x0A,\n\t23709 - 19968: jis0212<<14 | 0x1A<<7 | 0x0D,\n\t23711 - 19968: jis0212<<14 | 0x1A<<7 | 0x0E,\n\t23712 - 19968: jis0212<<14 | 0x1A<<7 | 0x0F,\n\t23713 - 19968: jis0208<<14 | 0x11<<7 | 0x0B,\n\t23714 - 19968: jis0212<<14 | 0x1A<<7 | 0x10,\n\t23715 - 19968: jis0212<<14 | 0x1A<<7 | 0x11,\n\t23718 - 19968: jis0208<<14 | 0x58<<7 | 0x4F,\n\t23720 - 19968: jis0208<<14 | 0x20<<7 | 0x1A,\n\t23721 - 19968: jis0208<<14 | 0x13<<7 | 0x43,\n\t23722 - 19968: jis0212<<14 | 0x1A<<7 | 0x13,\n\t23723 - 19968: jis0208<<14 | 0x35<<7 | 0x0C,\n\t23724 - 19968: jis0208<<14 | 0x2B<<7 | 0x07,\n\t23729 - 19968: jis0208<<14 | 0x21<<7 | 0x31,\n\t23730 - 19968: jis0212<<14 | 0x1A<<7 | 0x14,\n\t23731 - 19968: jis0208<<14 | 0x12<<7 | 0x38,\n\t23732 - 19968: jis0212<<14 | 0x1A<<7 | 0x15,\n\t23733 - 19968: jis0212<<14 | 0x1A<<7 | 0x16,\n\t23734 - 19968: jis0208<<14 | 0x35<<7 | 0x0E,\n\t23735 - 19968: jis0208<<14 | 0x35<<7 | 0x10,\n\t23736 - 19968: jis0208<<14 | 0x13<<7 | 0x3E,\n\t23738 - 19968: jis0208<<14 | 0x58<<7 | 0x50,\n\t23739 - 19968: jis0208<<14 | 0x35<<7 | 0x0D,\n\t23740 - 19968: jis0208<<14 | 0x35<<7 | 0x0F,\n\t23742 - 19968: jis0208<<14 | 0x35<<7 | 0x12,\n\t23749 - 19968: jis0208<<14 | 0x35<<7 | 0x11,\n\t23751 - 19968: jis0208<<14 | 0x35<<7 | 0x13,\n\t23753 - 19968: jis0212<<14 | 0x1A<<7 | 0x18,\n\t23755 - 19968: jis0212<<14 | 0x1A<<7 | 0x19,\n\t23762 - 19968: jis0212<<14 | 0x1A<<7 | 0x1A,\n\t23767 - 19968: jis0212<<14 | 0x1A<<7 | 0x1C,\n\t23769 - 19968: jis0208<<14 | 0x35<<7 | 0x14,\n\t23773 - 19968: jis0212<<14 | 0x1A<<7 | 0x1B,\n\t23776 - 19968: jis0208<<14 | 0x25<<7 | 0x1C,\n\t23777 - 19968: jis0208<<14 | 0x15<<7 | 0x0D,\n\t23784 - 19968: jis0208<<14 | 0x11<<7 | 0x44,\n\t23785 - 19968: jis0208<<14 | 0x35<<7 | 0x15,\n\t23786 - 19968: jis0208<<14 | 0x35<<7 | 0x1A,\n\t23789 - 19968: jis0208<<14 | 0x35<<7 | 0x18,\n\t23790 - 19968: jis0212<<14 | 0x1A<<7 | 0x1D,\n\t23791 - 19968: jis0208<<14 | 0x29<<7 | 0x56,\n\t23792 - 19968: jis0208<<14 | 0x29<<7 | 0x55,\n\t23793 - 19968: jis0212<<14 | 0x1A<<7 | 0x1E,\n\t23794 - 19968: jis0212<<14 | 0x1A<<7 | 0x1F,\n\t23796 - 19968: jis0212<<14 | 0x1A<<7 | 0x20,\n\t23797 - 19968: jis0208<<14 | 0x58<<7 | 0x51,\n\t23798 - 19968: jis0208<<14 | 0x24<<7 | 0x46,\n\t23802 - 19968: jis0208<<14 | 0x35<<7 | 0x17,\n\t23803 - 19968: jis0208<<14 | 0x1C<<7 | 0x33,\n\t23805 - 19968: jis0208<<14 | 0x35<<7 | 0x16,\n\t23809 - 19968: jis0212<<14 | 0x1A<<7 | 0x21,\n\t23814 - 19968: jis0212<<14 | 0x1A<<7 | 0x22,\n\t23815 - 19968: jis0208<<14 | 0x1E<<7 | 0x51,\n\t23819 - 19968: jis0208<<14 | 0x35<<7 | 0x1B,\n\t23821 - 19968: jis0212<<14 | 0x1A<<7 | 0x23,\n\t23822 - 19968: jis0208<<14 | 0x19<<7 | 0x49,\n\t23825 - 19968: jis0208<<14 | 0x35<<7 | 0x21,\n\t23826 - 19968: jis0212<<14 | 0x1A<<7 | 0x24,\n\t23828 - 19968: jis0208<<14 | 0x35<<7 | 0x22,\n\t23829 - 19968: jis0208<<14 | 0x35<<7 | 0x1C,\n\t23830 - 19968: jis0208<<14 | 0x12<<7 | 0x12,\n\t23831 - 19968: jis0208<<14 | 0x35<<7 | 0x1D,\n\t23832 - 19968: jis0208<<14 | 0x35<<7 | 0x26,\n\t23833 - 19968: jis0208<<14 | 0x35<<7 | 0x25,\n\t23834 - 19968: jis0208<<14 | 0x35<<7 | 0x24,\n\t23835 - 19968: jis0208<<14 | 0x35<<7 | 0x20,\n\t23839 - 19968: jis0208<<14 | 0x35<<7 | 0x1F,\n\t23842 - 19968: jis0208<<14 | 0x35<<7 | 0x23,\n\t23843 - 19968: jis0212<<14 | 0x1A<<7 | 0x26,\n\t23844 - 19968: jis0212<<14 | 0x1A<<7 | 0x27,\n\t23846 - 19968: jis0212<<14 | 0x1A<<7 | 0x28,\n\t23847 - 19968: jis0208<<14 | 0x58<<7 | 0x52,\n\t23849 - 19968: jis0208<<14 | 0x29<<7 | 0x57,\n\t23851 - 19968: jis0212<<14 | 0x1A<<7 | 0x25,\n\t23857 - 19968: jis0212<<14 | 0x1A<<7 | 0x2A,\n\t23860 - 19968: jis0212<<14 | 0x1A<<7 | 0x2B,\n\t23865 - 19968: jis0212<<14 | 0x1A<<7 | 0x2C,\n\t23869 - 19968: jis0212<<14 | 0x1A<<7 | 0x2D,\n\t23871 - 19968: jis0212<<14 | 0x1A<<7 | 0x2E,\n\t23874 - 19968: jis0208<<14 | 0x58<<7 | 0x55,\n\t23875 - 19968: jis0212<<14 | 0x1A<<7 | 0x30,\n\t23878 - 19968: jis0212<<14 | 0x1A<<7 | 0x31,\n\t23880 - 19968: jis0212<<14 | 0x1A<<7 | 0x32,\n\t23882 - 19968: jis0212<<14 | 0x1A<<7 | 0x36,\n\t23883 - 19968: jis0208<<14 | 0x35<<7 | 0x2A,\n\t23884 - 19968: jis0208<<14 | 0x35<<7 | 0x27,\n\t23886 - 19968: jis0208<<14 | 0x35<<7 | 0x29,\n\t23888 - 19968: jis0208<<14 | 0x2C<<7 | 0x51,\n\t23889 - 19968: jis0212<<14 | 0x1A<<7 | 0x34,\n\t23890 - 19968: jis0208<<14 | 0x35<<7 | 0x28,\n\t23891 - 19968: jis0208<<14 | 0x58<<7 | 0x53,\n\t23893 - 19968: jis0212<<14 | 0x1A<<7 | 0x33,\n\t23897 - 19968: jis0212<<14 | 0x1A<<7 | 0x35,\n\t23900 - 19968: jis0208<<14 | 0x35<<7 | 0x1E,\n\t23903 - 19968: jis0212<<14 | 0x1A<<7 | 0x37,\n\t23904 - 19968: jis0212<<14 | 0x1A<<7 | 0x38,\n\t23905 - 19968: jis0212<<14 | 0x1A<<7 | 0x39,\n\t23906 - 19968: jis0212<<14 | 0x1A<<7 | 0x3A,\n\t23908 - 19968: jis0212<<14 | 0x1A<<7 | 0x3B,\n\t23913 - 19968: jis0208<<14 | 0x1E<<7 | 0x52,\n\t23914 - 19968: jis0212<<14 | 0x1A<<7 | 0x3C,\n\t23916 - 19968: jis0208<<14 | 0x35<<7 | 0x2B,\n\t23917 - 19968: jis0208<<14 | 0x58<<7 | 0x56,\n\t23919 - 19968: jis0208<<14 | 0x19<<7 | 0x16,\n\t23920 - 19968: jis0212<<14 | 0x1A<<7 | 0x3E,\n\t23923 - 19968: jis0208<<14 | 0x35<<7 | 0x2C,\n\t23926 - 19968: jis0208<<14 | 0x35<<7 | 0x2D,\n\t23929 - 19968: jis0212<<14 | 0x1A<<7 | 0x3F,\n\t23930 - 19968: jis0212<<14 | 0x1A<<7 | 0x40,\n\t23934 - 19968: jis0212<<14 | 0x1A<<7 | 0x41,\n\t23935 - 19968: jis0212<<14 | 0x1A<<7 | 0x42,\n\t23937 - 19968: jis0212<<14 | 0x1A<<7 | 0x43,\n\t23938 - 19968: jis0208<<14 | 0x35<<7 | 0x30,\n\t23939 - 19968: jis0212<<14 | 0x1A<<7 | 0x44,\n\t23940 - 19968: jis0208<<14 | 0x35<<7 | 0x2F,\n\t23943 - 19968: jis0208<<14 | 0x35<<7 | 0x2E,\n\t23944 - 19968: jis0212<<14 | 0x1A<<7 | 0x45,\n\t23946 - 19968: jis0212<<14 | 0x1A<<7 | 0x46,\n\t23947 - 19968: jis0208<<14 | 0x24<<7 | 0x47,\n\t23948 - 19968: jis0208<<14 | 0x35<<7 | 0x19,\n\t23952 - 19968: jis0208<<14 | 0x35<<7 | 0x36,\n\t23954 - 19968: jis0212<<14 | 0x1A<<7 | 0x47,\n\t23955 - 19968: jis0212<<14 | 0x1A<<7 | 0x48,\n\t23956 - 19968: jis0212<<14 | 0x1A<<7 | 0x49,\n\t23957 - 19968: jis0212<<14 | 0x1A<<7 | 0x4A,\n\t23961 - 19968: jis0212<<14 | 0x1A<<7 | 0x4B,\n\t23963 - 19968: jis0212<<14 | 0x1A<<7 | 0x4C,\n\t23965 - 19968: jis0208<<14 | 0x35<<7 | 0x32,\n\t23967 - 19968: jis0212<<14 | 0x1A<<7 | 0x4D,\n\t23968 - 19968: jis0212<<14 | 0x1A<<7 | 0x4E,\n\t23970 - 19968: jis0208<<14 | 0x35<<7 | 0x31,\n\t23975 - 19968: jis0212<<14 | 0x1A<<7 | 0x4F,\n\t23979 - 19968: jis0212<<14 | 0x1A<<7 | 0x50,\n\t23980 - 19968: jis0208<<14 | 0x35<<7 | 0x33,\n\t23982 - 19968: jis0208<<14 | 0x35<<7 | 0x34,\n\t23984 - 19968: jis0212<<14 | 0x1A<<7 | 0x51,\n\t23986 - 19968: jis0212<<14 | 0x45<<7 | 0x53,\n\t23988 - 19968: jis0212<<14 | 0x1A<<7 | 0x52,\n\t23991 - 19968: jis0208<<14 | 0x35<<7 | 0x37,\n\t23992 - 19968: jis0208<<14 | 0x58<<7 | 0x57,\n\t23993 - 19968: jis0208<<14 | 0x58<<7 | 0x58,\n\t23994 - 19968: jis0208<<14 | 0x2D<<7 | 0x45,\n\t23996 - 19968: jis0208<<14 | 0x35<<7 | 0x38,\n\t23997 - 19968: jis0208<<14 | 0x35<<7 | 0x35,\n\t24003 - 19968: jis0212<<14 | 0x1A<<7 | 0x55,\n\t24007 - 19968: jis0212<<14 | 0x1A<<7 | 0x56,\n\t24009 - 19968: jis0208<<14 | 0x35<<7 | 0x39,\n\t24011 - 19968: jis0212<<14 | 0x1A<<7 | 0x57,\n\t24012 - 19968: jis0208<<14 | 0x13<<7 | 0x3F,\n\t24013 - 19968: jis0208<<14 | 0x35<<7 | 0x3A,\n\t24014 - 19968: jis0212<<14 | 0x1A<<7 | 0x59,\n\t24016 - 19968: jis0208<<14 | 0x58<<7 | 0x59,\n\t24018 - 19968: jis0208<<14 | 0x35<<7 | 0x3C,\n\t24019 - 19968: jis0208<<14 | 0x35<<7 | 0x3B,\n\t24022 - 19968: jis0208<<14 | 0x35<<7 | 0x3D,\n\t24024 - 19968: jis0212<<14 | 0x1A<<7 | 0x5A,\n\t24025 - 19968: jis0212<<14 | 0x1A<<7 | 0x5B,\n\t24027 - 19968: jis0208<<14 | 0x35<<7 | 0x3E,\n\t24029 - 19968: jis0208<<14 | 0x1F<<7 | 0x4D,\n\t24030 - 19968: jis0208<<14 | 0x1C<<7 | 0x02,\n\t24032 - 19968: jis0212<<14 | 0x1A<<7 | 0x5C,\n\t24033 - 19968: jis0208<<14 | 0x1C<<7 | 0x43,\n\t24035 - 19968: jis0208<<14 | 0x20<<7 | 0x42,\n\t24036 - 19968: jis0212<<14 | 0x1A<<7 | 0x5D,\n\t24037 - 19968: jis0208<<14 | 0x18<<7 | 0x08,\n\t24038 - 19968: jis0208<<14 | 0x19<<7 | 0x17,\n\t24039 - 19968: jis0208<<14 | 0x18<<7 | 0x09,\n\t24040 - 19968: jis0208<<14 | 0x14<<7 | 0x4F,\n\t24041 - 19968: jis0212<<14 | 0x1B<<7 | 0x00,\n\t24043 - 19968: jis0208<<14 | 0x35<<7 | 0x3F,\n\t24046 - 19968: jis0208<<14 | 0x19<<7 | 0x18,\n\t24049 - 19968: jis0208<<14 | 0x17<<7 | 0x29,\n\t24050 - 19968: jis0208<<14 | 0x35<<7 | 0x40,\n\t24051 - 19968: jis0208<<14 | 0x2B<<7 | 0x05,\n\t24052 - 19968: jis0208<<14 | 0x26<<7 | 0x22,\n\t24053 - 19968: jis0208<<14 | 0x35<<7 | 0x41,\n\t24055 - 19968: jis0208<<14 | 0x18<<7 | 0x0A,\n\t24056 - 19968: jis0212<<14 | 0x1B<<7 | 0x01,\n\t24057 - 19968: jis0212<<14 | 0x1B<<7 | 0x02,\n\t24059 - 19968: jis0208<<14 | 0x13<<7 | 0x0B,\n\t24061 - 19968: jis0208<<14 | 0x22<<7 | 0x06,\n\t24062 - 19968: jis0208<<14 | 0x15<<7 | 0x31,\n\t24064 - 19968: jis0212<<14 | 0x1B<<7 | 0x03,\n\t24066 - 19968: jis0208<<14 | 0x1A<<7 | 0x33,\n\t24067 - 19968: jis0208<<14 | 0x28<<7 | 0x3A,\n\t24070 - 19968: jis0208<<14 | 0x27<<7 | 0x20,\n\t24071 - 19968: jis0212<<14 | 0x1B<<7 | 0x04,\n\t24075 - 19968: jis0208<<14 | 0x35<<7 | 0x42,\n\t24076 - 19968: jis0208<<14 | 0x13<<7 | 0x54,\n\t24077 - 19968: jis0212<<14 | 0x1B<<7 | 0x05,\n\t24081 - 19968: jis0208<<14 | 0x35<<7 | 0x45,\n\t24082 - 19968: jis0212<<14 | 0x1B<<7 | 0x06,\n\t24084 - 19968: jis0212<<14 | 0x1B<<7 | 0x07,\n\t24085 - 19968: jis0212<<14 | 0x1B<<7 | 0x08,\n\t24086 - 19968: jis0208<<14 | 0x23<<7 | 0x00,\n\t24088 - 19968: jis0212<<14 | 0x1B<<7 | 0x09,\n\t24089 - 19968: jis0208<<14 | 0x35<<7 | 0x44,\n\t24090 - 19968: jis0208<<14 | 0x35<<7 | 0x43,\n\t24091 - 19968: jis0208<<14 | 0x35<<7 | 0x46,\n\t24093 - 19968: jis0208<<14 | 0x23<<7 | 0x4A,\n\t24095 - 19968: jis0212<<14 | 0x1B<<7 | 0x0A,\n\t24096 - 19968: jis0212<<14 | 0x1B<<7 | 0x0B,\n\t24101 - 19968: jis0208<<14 | 0x1E<<7 | 0x42,\n\t24104 - 19968: jis0212<<14 | 0x1B<<7 | 0x0D,\n\t24107 - 19968: jis0208<<14 | 0x1A<<7 | 0x34,\n\t24109 - 19968: jis0208<<14 | 0x1F<<7 | 0x29,\n\t24110 - 19968: jis0212<<14 | 0x1B<<7 | 0x0C,\n\t24111 - 19968: jis0208<<14 | 0x21<<7 | 0x32,\n\t24112 - 19968: jis0208<<14 | 0x14<<7 | 0x01,\n\t24114 - 19968: jis0212<<14 | 0x1B<<7 | 0x0E,\n\t24115 - 19968: jis0208<<14 | 0x23<<7 | 0x01,\n\t24117 - 19968: jis0212<<14 | 0x1B<<7 | 0x0F,\n\t24118 - 19968: jis0208<<14 | 0x35<<7 | 0x47,\n\t24119 - 19968: jis0208<<14 | 0x35<<7 | 0x48,\n\t24120 - 19968: jis0208<<14 | 0x1D<<7 | 0x4E,\n\t24125 - 19968: jis0208<<14 | 0x2A<<7 | 0x18,\n\t24126 - 19968: jis0212<<14 | 0x1B<<7 | 0x10,\n\t24128 - 19968: jis0208<<14 | 0x35<<7 | 0x4B,\n\t24131 - 19968: jis0208<<14 | 0x35<<7 | 0x4A,\n\t24132 - 19968: jis0208<<14 | 0x35<<7 | 0x49,\n\t24133 - 19968: jis0208<<14 | 0x28<<7 | 0x5C,\n\t24135 - 19968: jis0208<<14 | 0x35<<7 | 0x52,\n\t24137 - 19968: jis0212<<14 | 0x1B<<7 | 0x13,\n\t24139 - 19968: jis0212<<14 | 0x1B<<7 | 0x11,\n\t24140 - 19968: jis0208<<14 | 0x2A<<7 | 0x39,\n\t24142 - 19968: jis0208<<14 | 0x35<<7 | 0x4C,\n\t24144 - 19968: jis0212<<14 | 0x1B<<7 | 0x12,\n\t24145 - 19968: jis0212<<14 | 0x1B<<7 | 0x14,\n\t24148 - 19968: jis0208<<14 | 0x35<<7 | 0x4E,\n\t24149 - 19968: jis0208<<14 | 0x2A<<7 | 0x4A,\n\t24150 - 19968: jis0212<<14 | 0x1B<<7 | 0x15,\n\t24151 - 19968: jis0208<<14 | 0x35<<7 | 0x4D,\n\t24152 - 19968: jis0212<<14 | 0x1B<<7 | 0x16,\n\t24155 - 19968: jis0212<<14 | 0x1B<<7 | 0x17,\n\t24156 - 19968: jis0212<<14 | 0x1B<<7 | 0x18,\n\t24158 - 19968: jis0212<<14 | 0x1B<<7 | 0x19,\n\t24159 - 19968: jis0208<<14 | 0x35<<7 | 0x4F,\n\t24161 - 19968: jis0208<<14 | 0x27<<7 | 0x07,\n\t24162 - 19968: jis0208<<14 | 0x35<<7 | 0x50,\n\t24163 - 19968: jis0208<<14 | 0x29<<7 | 0x1D,\n\t24164 - 19968: jis0208<<14 | 0x35<<7 | 0x51,\n\t24168 - 19968: jis0212<<14 | 0x1B<<7 | 0x1A,\n\t24170 - 19968: jis0212<<14 | 0x1B<<7 | 0x1B,\n\t24171 - 19968: jis0212<<14 | 0x1B<<7 | 0x1C,\n\t24172 - 19968: jis0212<<14 | 0x1B<<7 | 0x1D,\n\t24173 - 19968: jis0212<<14 | 0x1B<<7 | 0x1E,\n\t24174 - 19968: jis0212<<14 | 0x1B<<7 | 0x1F,\n\t24176 - 19968: jis0212<<14 | 0x1B<<7 | 0x20,\n\t24178 - 19968: jis0208<<14 | 0x13<<7 | 0x12,\n\t24179 - 19968: jis0208<<14 | 0x29<<7 | 0x1E,\n\t24180 - 19968: jis0208<<14 | 0x26<<7 | 0x0E,\n\t24181 - 19968: jis0208<<14 | 0x35<<7 | 0x53,\n\t24182 - 19968: jis0208<<14 | 0x35<<7 | 0x54,\n\t24184 - 19968: jis0208<<14 | 0x18<<7 | 0x0B,\n\t24185 - 19968: jis0208<<14 | 0x13<<7 | 0x13,\n\t24186 - 19968: jis0208<<14 | 0x35<<7 | 0x55,\n\t24187 - 19968: jis0208<<14 | 0x17<<7 | 0x17,\n\t24188 - 19968: jis0208<<14 | 0x2C<<7 | 0x23,\n\t24189 - 19968: jis0208<<14 | 0x2C<<7 | 0x08,\n\t24190 - 19968: jis0208<<14 | 0x13<<7 | 0x55,\n\t24191 - 19968: jis0208<<14 | 0x35<<7 | 0x57,\n\t24192 - 19968: jis0212<<14 | 0x1B<<7 | 0x21,\n\t24193 - 19968: jis0208<<14 | 0x23<<7 | 0x02,\n\t24195 - 19968: jis0208<<14 | 0x18<<7 | 0x0C,\n\t24196 - 19968: jis0208<<14 | 0x1D<<7 | 0x10,\n\t24199 - 19968: jis0208<<14 | 0x27<<7 | 0x3E,\n\t24202 - 19968: jis0208<<14 | 0x1D<<7 | 0x11,\n\t24203 - 19968: jis0212<<14 | 0x1B<<7 | 0x22,\n\t24206 - 19968: jis0212<<14 | 0x1B<<7 | 0x23,\n\t24207 - 19968: jis0208<<14 | 0x1C<<7 | 0x57,\n\t24213 - 19968: jis0208<<14 | 0x23<<7 | 0x4B,\n\t24214 - 19968: jis0208<<14 | 0x29<<7 | 0x58,\n\t24215 - 19968: jis0208<<14 | 0x24<<7 | 0x18,\n\t24218 - 19968: jis0208<<14 | 0x18<<7 | 0x0D,\n\t24220 - 19968: jis0208<<14 | 0x28<<7 | 0x3B,\n\t24224 - 19968: jis0208<<14 | 0x35<<7 | 0x58,\n\t24226 - 19968: jis0212<<14 | 0x1B<<7 | 0x24,\n\t24228 - 19968: jis0212<<14 | 0x1B<<7 | 0x25,\n\t24229 - 19968: jis0212<<14 | 0x1B<<7 | 0x26,\n\t24230 - 19968: jis0208<<14 | 0x24<<7 | 0x38,\n\t24231 - 19968: jis0208<<14 | 0x19<<7 | 0x21,\n\t24232 - 19968: jis0212<<14 | 0x1B<<7 | 0x27,\n\t24234 - 19968: jis0212<<14 | 0x1B<<7 | 0x28,\n\t24235 - 19968: jis0208<<14 | 0x17<<7 | 0x2A,\n\t24236 - 19968: jis0212<<14 | 0x1B<<7 | 0x29,\n\t24237 - 19968: jis0208<<14 | 0x23<<7 | 0x4C,\n\t24241 - 19968: jis0212<<14 | 0x1B<<7 | 0x2A,\n\t24243 - 19968: jis0212<<14 | 0x1B<<7 | 0x2B,\n\t24245 - 19968: jis0208<<14 | 0x0F<<7 | 0x22,\n\t24246 - 19968: jis0208<<14 | 0x1C<<7 | 0x4D,\n\t24247 - 19968: jis0208<<14 | 0x18<<7 | 0x0E,\n\t24248 - 19968: jis0208<<14 | 0x2C<<7 | 0x26,\n\t24253 - 19968: jis0212<<14 | 0x1B<<7 | 0x2C,\n\t24254 - 19968: jis0212<<14 | 0x1B<<7 | 0x2D,\n\t24255 - 19968: jis0212<<14 | 0x1B<<7 | 0x2E,\n\t24257 - 19968: jis0208<<14 | 0x35<<7 | 0x59,\n\t24258 - 19968: jis0208<<14 | 0x35<<7 | 0x5A,\n\t24259 - 19968: jis0208<<14 | 0x26<<7 | 0x30,\n\t24262 - 19968: jis0212<<14 | 0x1B<<7 | 0x2F,\n\t24264 - 19968: jis0208<<14 | 0x35<<7 | 0x5B,\n\t24265 - 19968: jis0208<<14 | 0x2D<<7 | 0x56,\n\t24266 - 19968: jis0208<<14 | 0x2E<<7 | 0x0C,\n\t24267 - 19968: jis0212<<14 | 0x1B<<7 | 0x31,\n\t24268 - 19968: jis0212<<14 | 0x1B<<7 | 0x30,\n\t24270 - 19968: jis0212<<14 | 0x1B<<7 | 0x32,\n\t24271 - 19968: jis0208<<14 | 0x35<<7 | 0x5D,\n\t24272 - 19968: jis0208<<14 | 0x35<<7 | 0x5C,\n\t24273 - 19968: jis0212<<14 | 0x1B<<7 | 0x33,\n\t24274 - 19968: jis0212<<14 | 0x1B<<7 | 0x34,\n\t24275 - 19968: jis0208<<14 | 0x12<<7 | 0x26,\n\t24276 - 19968: jis0212<<14 | 0x1B<<7 | 0x35,\n\t24277 - 19968: jis0212<<14 | 0x1B<<7 | 0x36,\n\t24278 - 19968: jis0208<<14 | 0x36<<7 | 0x00,\n\t24282 - 19968: jis0208<<14 | 0x36<<7 | 0x03,\n\t24283 - 19968: jis0208<<14 | 0x36<<7 | 0x04,\n\t24284 - 19968: jis0212<<14 | 0x1B<<7 | 0x37,\n\t24285 - 19968: jis0208<<14 | 0x36<<7 | 0x02,\n\t24286 - 19968: jis0212<<14 | 0x1B<<7 | 0x38,\n\t24287 - 19968: jis0208<<14 | 0x28<<7 | 0x1F,\n\t24288 - 19968: jis0208<<14 | 0x1D<<7 | 0x12,\n\t24289 - 19968: jis0208<<14 | 0x36<<7 | 0x06,\n\t24290 - 19968: jis0208<<14 | 0x36<<7 | 0x05,\n\t24291 - 19968: jis0208<<14 | 0x36<<7 | 0x01,\n\t24293 - 19968: jis0212<<14 | 0x1B<<7 | 0x39,\n\t24296 - 19968: jis0208<<14 | 0x36<<7 | 0x07,\n\t24297 - 19968: jis0208<<14 | 0x36<<7 | 0x08,\n\t24299 - 19968: jis0212<<14 | 0x1B<<7 | 0x3A,\n\t24300 - 19968: jis0208<<14 | 0x36<<7 | 0x09,\n\t24304 - 19968: jis0208<<14 | 0x36<<7 | 0x0C,\n\t24305 - 19968: jis0208<<14 | 0x36<<7 | 0x0A,\n\t24307 - 19968: jis0208<<14 | 0x36<<7 | 0x0B,\n\t24308 - 19968: jis0208<<14 | 0x36<<7 | 0x0D,\n\t24310 - 19968: jis0208<<14 | 0x10<<7 | 0x43,\n\t24311 - 19968: jis0208<<14 | 0x23<<7 | 0x4D,\n\t24312 - 19968: jis0208<<14 | 0x36<<7 | 0x0E,\n\t24314 - 19968: jis0208<<14 | 0x16<<7 | 0x59,\n\t24315 - 19968: jis0208<<14 | 0x11<<7 | 0x55,\n\t24316 - 19968: jis0208<<14 | 0x26<<7 | 0x15,\n\t24318 - 19968: jis0208<<14 | 0x36<<7 | 0x0F,\n\t24319 - 19968: jis0208<<14 | 0x25<<7 | 0x5A,\n\t24321 - 19968: jis0208<<14 | 0x29<<7 | 0x3A,\n\t24322 - 19968: jis0212<<14 | 0x1B<<7 | 0x3B,\n\t24323 - 19968: jis0208<<14 | 0x36<<7 | 0x10,\n\t24324 - 19968: jis0208<<14 | 0x2E<<7 | 0x0D,\n\t24326 - 19968: jis0212<<14 | 0x1B<<7 | 0x3C,\n\t24327 - 19968: jis0212<<14 | 0x1B<<7 | 0x3D,\n\t24328 - 19968: jis0212<<14 | 0x1B<<7 | 0x3E,\n\t24329 - 19968: jis0208<<14 | 0x36<<7 | 0x11,\n\t24330 - 19968: jis0208<<14 | 0x29<<7 | 0x1F,\n\t24331 - 19968: jis0208<<14 | 0x36<<7 | 0x14,\n\t24332 - 19968: jis0208<<14 | 0x2F<<7 | 0x00,\n\t24333 - 19968: jis0208<<14 | 0x2F<<7 | 0x10,\n\t24334 - 19968: jis0212<<14 | 0x1B<<7 | 0x3F,\n\t24335 - 19968: jis0208<<14 | 0x1B<<7 | 0x0F,\n\t24336 - 19968: jis0208<<14 | 0x25<<7 | 0x54,\n\t24337 - 19968: jis0208<<14 | 0x36<<7 | 0x15,\n\t24339 - 19968: jis0208<<14 | 0x14<<7 | 0x3C,\n\t24340 - 19968: jis0208<<14 | 0x23<<7 | 0x03,\n\t24341 - 19968: jis0208<<14 | 0x0F<<7 | 0x59,\n\t24342 - 19968: jis0208<<14 | 0x36<<7 | 0x16,\n\t24343 - 19968: jis0208<<14 | 0x29<<7 | 0x05,\n\t24344 - 19968: jis0208<<14 | 0x18<<7 | 0x0F,\n\t24345 - 19968: jis0212<<14 | 0x1B<<7 | 0x40,\n\t24347 - 19968: jis0208<<14 | 0x22<<7 | 0x2F,\n\t24348 - 19968: jis0212<<14 | 0x1B<<7 | 0x41,\n\t24349 - 19968: jis0212<<14 | 0x1B<<7 | 0x42,\n\t24351 - 19968: jis0208<<14 | 0x23<<7 | 0x4E,\n\t24353 - 19968: jis0208<<14 | 0x58<<7 | 0x5A,\n\t24354 - 19968: jis0212<<14 | 0x1B<<7 | 0x44,\n\t24355 - 19968: jis0212<<14 | 0x1B<<7 | 0x45,\n\t24356 - 19968: jis0212<<14 | 0x1B<<7 | 0x46,\n\t24357 - 19968: jis0208<<14 | 0x2B<<7 | 0x4E,\n\t24358 - 19968: jis0208<<14 | 0x17<<7 | 0x18,\n\t24359 - 19968: jis0208<<14 | 0x17<<7 | 0x2B,\n\t24360 - 19968: jis0212<<14 | 0x1B<<7 | 0x47,\n\t24361 - 19968: jis0208<<14 | 0x36<<7 | 0x17,\n\t24363 - 19968: jis0212<<14 | 0x1B<<7 | 0x48,\n\t24364 - 19968: jis0212<<14 | 0x1B<<7 | 0x49,\n\t24365 - 19968: jis0208<<14 | 0x36<<7 | 0x18,\n\t24366 - 19968: jis0212<<14 | 0x1B<<7 | 0x4A,\n\t24367 - 19968: jis0208<<14 | 0x36<<7 | 0x1E,\n\t24368 - 19968: jis0212<<14 | 0x1B<<7 | 0x4B,\n\t24369 - 19968: jis0208<<14 | 0x1B<<7 | 0x44,\n\t24372 - 19968: jis0208<<14 | 0x58<<7 | 0x5B,\n\t24373 - 19968: jis0208<<14 | 0x23<<7 | 0x04,\n\t24374 - 19968: jis0212<<14 | 0x1B<<7 | 0x4D,\n\t24375 - 19968: jis0208<<14 | 0x15<<7 | 0x0E,\n\t24376 - 19968: jis0208<<14 | 0x36<<7 | 0x19,\n\t24379 - 19968: jis0212<<14 | 0x1B<<7 | 0x4E,\n\t24380 - 19968: jis0208<<14 | 0x28<<7 | 0x0A,\n\t24381 - 19968: jis0212<<14 | 0x1B<<7 | 0x4F,\n\t24382 - 19968: jis0208<<14 | 0x22<<7 | 0x25,\n\t24383 - 19968: jis0212<<14 | 0x1B<<7 | 0x50,\n\t24384 - 19968: jis0212<<14 | 0x1B<<7 | 0x51,\n\t24385 - 19968: jis0208<<14 | 0x36<<7 | 0x1A,\n\t24388 - 19968: jis0212<<14 | 0x1B<<7 | 0x52,\n\t24389 - 19968: jis0208<<14 | 0x58<<7 | 0x0B,\n\t24391 - 19968: jis0212<<14 | 0x1B<<7 | 0x54,\n\t24392 - 19968: jis0208<<14 | 0x36<<7 | 0x1B,\n\t24394 - 19968: jis0208<<14 | 0x15<<7 | 0x0F,\n\t24396 - 19968: jis0208<<14 | 0x36<<7 | 0x1C,\n\t24397 - 19968: jis0212<<14 | 0x1B<<7 | 0x55,\n\t24398 - 19968: jis0208<<14 | 0x36<<7 | 0x1D,\n\t24400 - 19968: jis0212<<14 | 0x1B<<7 | 0x56,\n\t24401 - 19968: jis0208<<14 | 0x36<<7 | 0x1F,\n\t24403 - 19968: jis0208<<14 | 0x24<<7 | 0x55,\n\t24404 - 19968: jis0212<<14 | 0x1B<<7 | 0x57,\n\t24406 - 19968: jis0208<<14 | 0x36<<7 | 0x20,\n\t24407 - 19968: jis0208<<14 | 0x36<<7 | 0x21,\n\t24408 - 19968: jis0212<<14 | 0x1B<<7 | 0x58,\n\t24409 - 19968: jis0208<<14 | 0x36<<7 | 0x22,\n\t24411 - 19968: jis0212<<14 | 0x1B<<7 | 0x59,\n\t24412 - 19968: jis0208<<14 | 0x36<<7 | 0x13,\n\t24413 - 19968: jis0208<<14 | 0x36<<7 | 0x12,\n\t24416 - 19968: jis0212<<14 | 0x1B<<7 | 0x5A,\n\t24417 - 19968: jis0208<<14 | 0x36<<7 | 0x23,\n\t24418 - 19968: jis0208<<14 | 0x16<<7 | 0x20,\n\t24419 - 19968: jis0212<<14 | 0x1B<<7 | 0x5B,\n\t24420 - 19968: jis0212<<14 | 0x1B<<7 | 0x5C,\n\t24422 - 19968: jis0208<<14 | 0x28<<7 | 0x06,\n\t24423 - 19968: jis0208<<14 | 0x58<<7 | 0x5C,\n\t24425 - 19968: jis0208<<14 | 0x19<<7 | 0x2B,\n\t24426 - 19968: jis0208<<14 | 0x28<<7 | 0x16,\n\t24427 - 19968: jis0208<<14 | 0x23<<7 | 0x05,\n\t24428 - 19968: jis0208<<14 | 0x28<<7 | 0x2A,\n\t24429 - 19968: jis0208<<14 | 0x36<<7 | 0x24,\n\t24431 - 19968: jis0212<<14 | 0x1C<<7 | 0x00,\n\t24432 - 19968: jis0208<<14 | 0x1D<<7 | 0x13,\n\t24433 - 19968: jis0208<<14 | 0x10<<7 | 0x25,\n\t24434 - 19968: jis0212<<14 | 0x1C<<7 | 0x01,\n\t24435 - 19968: jis0208<<14 | 0x36<<7 | 0x25,\n\t24436 - 19968: jis0212<<14 | 0x1C<<7 | 0x02,\n\t24437 - 19968: jis0212<<14 | 0x1C<<7 | 0x03,\n\t24439 - 19968: jis0208<<14 | 0x36<<7 | 0x26,\n\t24440 - 19968: jis0212<<14 | 0x1C<<7 | 0x04,\n\t24441 - 19968: jis0208<<14 | 0x2B<<7 | 0x51,\n\t24442 - 19968: jis0212<<14 | 0x1C<<7 | 0x05,\n\t24444 - 19968: jis0208<<14 | 0x27<<7 | 0x3F,\n\t24445 - 19968: jis0212<<14 | 0x1C<<7 | 0x06,\n\t24446 - 19968: jis0212<<14 | 0x1C<<7 | 0x07,\n\t24447 - 19968: jis0208<<14 | 0x36<<7 | 0x29,\n\t24448 - 19968: jis0208<<14 | 0x10<<7 | 0x5C,\n\t24449 - 19968: jis0208<<14 | 0x1F<<7 | 0x0B,\n\t24450 - 19968: jis0208<<14 | 0x36<<7 | 0x28,\n\t24451 - 19968: jis0208<<14 | 0x36<<7 | 0x27,\n\t24452 - 19968: jis0208<<14 | 0x16<<7 | 0x21,\n\t24453 - 19968: jis0208<<14 | 0x21<<7 | 0x33,\n\t24455 - 19968: jis0208<<14 | 0x36<<7 | 0x2D,\n\t24456 - 19968: jis0208<<14 | 0x36<<7 | 0x2B,\n\t24457 - 19968: jis0212<<14 | 0x1C<<7 | 0x08,\n\t24458 - 19968: jis0208<<14 | 0x36<<7 | 0x2A,\n\t24459 - 19968: jis0208<<14 | 0x2D<<7 | 0x06,\n\t24460 - 19968: jis0208<<14 | 0x17<<7 | 0x44,\n\t24461 - 19968: jis0212<<14 | 0x1C<<7 | 0x09,\n\t24463 - 19968: jis0212<<14 | 0x1C<<7 | 0x0A,\n\t24464 - 19968: jis0208<<14 | 0x1C<<7 | 0x58,\n\t24465 - 19968: jis0208<<14 | 0x36<<7 | 0x2C,\n\t24466 - 19968: jis0208<<14 | 0x24<<7 | 0x2B,\n\t24467 - 19968: jis0208<<14 | 0x1C<<7 | 0x1D,\n\t24470 - 19968: jis0212<<14 | 0x1C<<7 | 0x0B,\n\t24471 - 19968: jis0208<<14 | 0x25<<7 | 0x1F,\n\t24472 - 19968: jis0208<<14 | 0x36<<7 | 0x30,\n\t24473 - 19968: jis0208<<14 | 0x36<<7 | 0x2F,\n\t24476 - 19968: jis0212<<14 | 0x1C<<7 | 0x0C,\n\t24477 - 19968: jis0212<<14 | 0x1C<<7 | 0x0D,\n\t24478 - 19968: jis0208<<14 | 0x36<<7 | 0x2E,\n\t24480 - 19968: jis0208<<14 | 0x36<<7 | 0x31,\n\t24481 - 19968: jis0208<<14 | 0x17<<7 | 0x45,\n\t24482 - 19968: jis0212<<14 | 0x1C<<7 | 0x0E,\n\t24484 - 19968: jis0212<<14 | 0x1C<<7 | 0x11,\n\t24487 - 19968: jis0212<<14 | 0x1C<<7 | 0x0F,\n\t24488 - 19968: jis0208<<14 | 0x36<<7 | 0x32,\n\t24489 - 19968: jis0208<<14 | 0x28<<7 | 0x5B,\n\t24490 - 19968: jis0208<<14 | 0x1C<<7 | 0x3A,\n\t24491 - 19968: jis0212<<14 | 0x1C<<7 | 0x10,\n\t24492 - 19968: jis0212<<14 | 0x1C<<7 | 0x12,\n\t24493 - 19968: jis0208<<14 | 0x36<<7 | 0x33,\n\t24494 - 19968: jis0208<<14 | 0x27<<7 | 0x58,\n\t24495 - 19968: jis0212<<14 | 0x1C<<7 | 0x13,\n\t24496 - 19968: jis0212<<14 | 0x1C<<7 | 0x14,\n\t24497 - 19968: jis0212<<14 | 0x1C<<7 | 0x15,\n\t24499 - 19968: jis0208<<14 | 0x25<<7 | 0x20,\n\t24500 - 19968: jis0208<<14 | 0x23<<7 | 0x06,\n\t24503 - 19968: jis0208<<14 | 0x58<<7 | 0x5D,\n\t24504 - 19968: jis0212<<14 | 0x1C<<7 | 0x16,\n\t24505 - 19968: jis0208<<14 | 0x24<<7 | 0x0F,\n\t24508 - 19968: jis0208<<14 | 0x36<<7 | 0x34,\n\t24509 - 19968: jis0208<<14 | 0x14<<7 | 0x0A,\n\t24515 - 19968: jis0208<<14 | 0x1E<<7 | 0x13,\n\t24516 - 19968: jis0212<<14 | 0x1C<<7 | 0x17,\n\t24517 - 19968: jis0208<<14 | 0x28<<7 | 0x0B,\n\t24519 - 19968: jis0212<<14 | 0x1C<<7 | 0x18,\n\t24520 - 19968: jis0212<<14 | 0x1C<<7 | 0x19,\n\t24521 - 19968: jis0212<<14 | 0x1C<<7 | 0x1A,\n\t24523 - 19968: jis0212<<14 | 0x1C<<7 | 0x1B,\n\t24524 - 19968: jis0208<<14 | 0x13<<7 | 0x56,\n\t24525 - 19968: jis0208<<14 | 0x26<<7 | 0x05,\n\t24528 - 19968: jis0212<<14 | 0x1C<<7 | 0x1C,\n\t24529 - 19968: jis0212<<14 | 0x1C<<7 | 0x1D,\n\t24530 - 19968: jis0212<<14 | 0x1C<<7 | 0x1E,\n\t24531 - 19968: jis0212<<14 | 0x1C<<7 | 0x1F,\n\t24532 - 19968: jis0212<<14 | 0x1C<<7 | 0x20,\n\t24534 - 19968: jis0208<<14 | 0x36<<7 | 0x35,\n\t24535 - 19968: jis0208<<14 | 0x1A<<7 | 0x35,\n\t24536 - 19968: jis0208<<14 | 0x2A<<7 | 0x19,\n\t24537 - 19968: jis0208<<14 | 0x2A<<7 | 0x1A,\n\t24540 - 19968: jis0208<<14 | 0x10<<7 | 0x5D,\n\t24541 - 19968: jis0208<<14 | 0x36<<7 | 0x3A,\n\t24542 - 19968: jis0208<<14 | 0x59<<7 | 0x00,\n\t24544 - 19968: jis0208<<14 | 0x22<<7 | 0x48,\n\t24545 - 19968: jis0212<<14 | 0x1C<<7 | 0x22,\n\t24546 - 19968: jis0212<<14 | 0x1C<<7 | 0x23,\n\t24548 - 19968: jis0208<<14 | 0x36<<7 | 0x37,\n\t24552 - 19968: jis0212<<14 | 0x1C<<7 | 0x24,\n\t24553 - 19968: jis0212<<14 | 0x1C<<7 | 0x25,\n\t24554 - 19968: jis0212<<14 | 0x1C<<7 | 0x26,\n\t24555 - 19968: jis0208<<14 | 0x11<<7 | 0x56,\n\t24556 - 19968: jis0212<<14 | 0x1C<<7 | 0x27,\n\t24557 - 19968: jis0212<<14 | 0x1C<<7 | 0x28,\n\t24558 - 19968: jis0212<<14 | 0x1C<<7 | 0x29,\n\t24559 - 19968: jis0212<<14 | 0x1C<<7 | 0x2A,\n\t24560 - 19968: jis0208<<14 | 0x37<<7 | 0x0C,\n\t24561 - 19968: jis0208<<14 | 0x36<<7 | 0x39,\n\t24562 - 19968: jis0212<<14 | 0x1C<<7 | 0x2B,\n\t24563 - 19968: jis0212<<14 | 0x1C<<7 | 0x2C,\n\t24565 - 19968: jis0208<<14 | 0x26<<7 | 0x0F,\n\t24566 - 19968: jis0212<<14 | 0x1C<<7 | 0x2D,\n\t24568 - 19968: jis0208<<14 | 0x36<<7 | 0x38,\n\t24570 - 19968: jis0212<<14 | 0x1C<<7 | 0x2E,\n\t24571 - 19968: jis0208<<14 | 0x36<<7 | 0x36,\n\t24572 - 19968: jis0212<<14 | 0x1C<<7 | 0x2F,\n\t24573 - 19968: jis0208<<14 | 0x18<<7 | 0x59,\n\t24575 - 19968: jis0208<<14 | 0x36<<7 | 0x3C,\n\t24583 - 19968: jis0212<<14 | 0x1C<<7 | 0x30,\n\t24586 - 19968: jis0212<<14 | 0x1C<<7 | 0x31,\n\t24589 - 19968: jis0212<<14 | 0x1C<<7 | 0x32,\n\t24590 - 19968: jis0208<<14 | 0x36<<7 | 0x42,\n\t24591 - 19968: jis0208<<14 | 0x36<<7 | 0x48,\n\t24592 - 19968: jis0208<<14 | 0x36<<7 | 0x40,\n\t24594 - 19968: jis0208<<14 | 0x24<<7 | 0x3B,\n\t24595 - 19968: jis0212<<14 | 0x1C<<7 | 0x33,\n\t24596 - 19968: jis0212<<14 | 0x1C<<7 | 0x34,\n\t24597 - 19968: jis0208<<14 | 0x36<<7 | 0x45,\n\t24598 - 19968: jis0208<<14 | 0x28<<7 | 0x3C,\n\t24599 - 19968: jis0212<<14 | 0x1C<<7 | 0x35,\n\t24600 - 19968: jis0212<<14 | 0x1C<<7 | 0x36,\n\t24601 - 19968: jis0208<<14 | 0x36<<7 | 0x3F,\n\t24602 - 19968: jis0212<<14 | 0x1C<<7 | 0x37,\n\t24603 - 19968: jis0208<<14 | 0x36<<7 | 0x44,\n\t24604 - 19968: jis0208<<14 | 0x2D<<7 | 0x46,\n\t24605 - 19968: jis0208<<14 | 0x1A<<7 | 0x36,\n\t24607 - 19968: jis0212<<14 | 0x1C<<7 | 0x38,\n\t24608 - 19968: jis0208<<14 | 0x21<<7 | 0x34,\n\t24609 - 19968: jis0208<<14 | 0x36<<7 | 0x3D,\n\t24612 - 19968: jis0212<<14 | 0x1C<<7 | 0x39,\n\t24613 - 19968: jis0208<<14 | 0x14<<7 | 0x3D,\n\t24614 - 19968: jis0208<<14 | 0x36<<7 | 0x47,\n\t24615 - 19968: jis0208<<14 | 0x1F<<7 | 0x0C,\n\t24616 - 19968: jis0208<<14 | 0x10<<7 | 0x44,\n\t24617 - 19968: jis0208<<14 | 0x36<<7 | 0x41,\n\t24618 - 19968: jis0208<<14 | 0x11<<7 | 0x57,\n\t24619 - 19968: jis0208<<14 | 0x36<<7 | 0x46,\n\t24621 - 19968: jis0212<<14 | 0x1C<<7 | 0x3A,\n\t24623 - 19968: jis0208<<14 | 0x15<<7 | 0x10,\n\t24625 - 19968: jis0208<<14 | 0x36<<7 | 0x43,\n\t24627 - 19968: jis0212<<14 | 0x1C<<7 | 0x3B,\n\t24629 - 19968: jis0212<<14 | 0x1C<<7 | 0x3C,\n\t24634 - 19968: jis0208<<14 | 0x36<<7 | 0x49,\n\t24640 - 19968: jis0212<<14 | 0x1C<<7 | 0x3D,\n\t24641 - 19968: jis0208<<14 | 0x36<<7 | 0x4B,\n\t24642 - 19968: jis0208<<14 | 0x36<<7 | 0x55,\n\t24643 - 19968: jis0208<<14 | 0x36<<7 | 0x53,\n\t24646 - 19968: jis0208<<14 | 0x36<<7 | 0x50,\n\t24647 - 19968: jis0212<<14 | 0x1C<<7 | 0x3E,\n\t24648 - 19968: jis0212<<14 | 0x1C<<7 | 0x3F,\n\t24649 - 19968: jis0212<<14 | 0x1C<<7 | 0x40,\n\t24650 - 19968: jis0208<<14 | 0x36<<7 | 0x4F,\n\t24651 - 19968: jis0208<<14 | 0x2D<<7 | 0x57,\n\t24652 - 19968: jis0212<<14 | 0x1C<<7 | 0x41,\n\t24653 - 19968: jis0208<<14 | 0x36<<7 | 0x51,\n\t24656 - 19968: jis0208<<14 | 0x15<<7 | 0x11,\n\t24657 - 19968: jis0212<<14 | 0x1C<<7 | 0x42,\n\t24658 - 19968: jis0208<<14 | 0x18<<7 | 0x10,\n\t24660 - 19968: jis0212<<14 | 0x1C<<7 | 0x43,\n\t24661 - 19968: jis0208<<14 | 0x1C<<7 | 0x59,\n\t24662 - 19968: jis0212<<14 | 0x1C<<7 | 0x44,\n\t24663 - 19968: jis0212<<14 | 0x1C<<7 | 0x45,\n\t24665 - 19968: jis0208<<14 | 0x36<<7 | 0x58,\n\t24666 - 19968: jis0208<<14 | 0x36<<7 | 0x4A,\n\t24669 - 19968: jis0208<<14 | 0x59<<7 | 0x01,\n\t24671 - 19968: jis0208<<14 | 0x36<<7 | 0x4E,\n\t24672 - 19968: jis0208<<14 | 0x36<<7 | 0x3E,\n\t24673 - 19968: jis0212<<14 | 0x1C<<7 | 0x47,\n\t24674 - 19968: jis0208<<14 | 0x11<<7 | 0x59,\n\t24675 - 19968: jis0208<<14 | 0x36<<7 | 0x52,\n\t24676 - 19968: jis0208<<14 | 0x36<<7 | 0x54,\n\t24677 - 19968: jis0208<<14 | 0x22<<7 | 0x30,\n\t24679 - 19968: jis0212<<14 | 0x1C<<7 | 0x48,\n\t24680 - 19968: jis0208<<14 | 0x19<<7 | 0x07,\n\t24681 - 19968: jis0208<<14 | 0x11<<7 | 0x17,\n\t24682 - 19968: jis0208<<14 | 0x36<<7 | 0x4C,\n\t24683 - 19968: jis0208<<14 | 0x36<<7 | 0x57,\n\t24684 - 19968: jis0208<<14 | 0x36<<7 | 0x56,\n\t24685 - 19968: jis0208<<14 | 0x15<<7 | 0x12,\n\t24687 - 19968: jis0208<<14 | 0x21<<7 | 0x08,\n\t24688 - 19968: jis0208<<14 | 0x12<<7 | 0x45,\n\t24689 - 19968: jis0212<<14 | 0x1C<<7 | 0x49,\n\t24693 - 19968: jis0208<<14 | 0x16<<7 | 0x22,\n\t24695 - 19968: jis0208<<14 | 0x36<<7 | 0x4D,\n\t24702 - 19968: jis0212<<14 | 0x1C<<7 | 0x4A,\n\t24703 - 19968: jis0212<<14 | 0x1C<<7 | 0x4B,\n\t24705 - 19968: jis0208<<14 | 0x36<<7 | 0x59,\n\t24706 - 19968: jis0212<<14 | 0x1C<<7 | 0x4C,\n\t24707 - 19968: jis0208<<14 | 0x36<<7 | 0x5C,\n\t24708 - 19968: jis0208<<14 | 0x37<<7 | 0x00,\n\t24709 - 19968: jis0208<<14 | 0x59<<7 | 0x02,\n\t24710 - 19968: jis0212<<14 | 0x1C<<7 | 0x4D,\n\t24712 - 19968: jis0212<<14 | 0x1C<<7 | 0x4E,\n\t24713 - 19968: jis0208<<14 | 0x1B<<7 | 0x1C,\n\t24714 - 19968: jis0208<<14 | 0x59<<7 | 0x03,\n\t24715 - 19968: jis0208<<14 | 0x37<<7 | 0x06,\n\t24716 - 19968: jis0208<<14 | 0x23<<7 | 0x4F,\n\t24717 - 19968: jis0208<<14 | 0x36<<7 | 0x5A,\n\t24718 - 19968: jis0212<<14 | 0x1C<<7 | 0x50,\n\t24721 - 19968: jis0212<<14 | 0x1C<<7 | 0x51,\n\t24722 - 19968: jis0208<<14 | 0x37<<7 | 0x04,\n\t24723 - 19968: jis0212<<14 | 0x1C<<7 | 0x52,\n\t24724 - 19968: jis0208<<14 | 0x11<<7 | 0x58,\n\t24725 - 19968: jis0212<<14 | 0x1C<<7 | 0x53,\n\t24726 - 19968: jis0208<<14 | 0x37<<7 | 0x02,\n\t24727 - 19968: jis0208<<14 | 0x37<<7 | 0x03,\n\t24728 - 19968: jis0212<<14 | 0x1C<<7 | 0x54,\n\t24730 - 19968: jis0208<<14 | 0x36<<7 | 0x5D,\n\t24731 - 19968: jis0208<<14 | 0x37<<7 | 0x01,\n\t24733 - 19968: jis0212<<14 | 0x1C<<7 | 0x55,\n\t24734 - 19968: jis0212<<14 | 0x1C<<7 | 0x56,\n\t24735 - 19968: jis0208<<14 | 0x17<<7 | 0x46,\n\t24736 - 19968: jis0208<<14 | 0x2C<<7 | 0x09,\n\t24738 - 19968: jis0212<<14 | 0x1C<<7 | 0x57,\n\t24739 - 19968: jis0208<<14 | 0x13<<7 | 0x14,\n\t24740 - 19968: jis0212<<14 | 0x1C<<7 | 0x58,\n\t24741 - 19968: jis0212<<14 | 0x1C<<7 | 0x59,\n\t24742 - 19968: jis0208<<14 | 0x10<<7 | 0x38,\n\t24743 - 19968: jis0208<<14 | 0x37<<7 | 0x05,\n\t24744 - 19968: jis0212<<14 | 0x1C<<7 | 0x5A,\n\t24745 - 19968: jis0208<<14 | 0x26<<7 | 0x19,\n\t24746 - 19968: jis0208<<14 | 0x0F<<7 | 0x0C,\n\t24752 - 19968: jis0212<<14 | 0x1C<<7 | 0x5B,\n\t24753 - 19968: jis0212<<14 | 0x1C<<7 | 0x5C,\n\t24754 - 19968: jis0208<<14 | 0x27<<7 | 0x40,\n\t24755 - 19968: jis0208<<14 | 0x36<<7 | 0x3B,\n\t24756 - 19968: jis0208<<14 | 0x37<<7 | 0x0B,\n\t24757 - 19968: jis0208<<14 | 0x37<<7 | 0x0F,\n\t24758 - 19968: jis0208<<14 | 0x2B<<7 | 0x44,\n\t24759 - 19968: jis0212<<14 | 0x1C<<7 | 0x5D,\n\t24760 - 19968: jis0208<<14 | 0x37<<7 | 0x08,\n\t24763 - 19968: jis0212<<14 | 0x1D<<7 | 0x00,\n\t24764 - 19968: jis0208<<14 | 0x24<<7 | 0x48,\n\t24765 - 19968: jis0208<<14 | 0x37<<7 | 0x0D,\n\t24766 - 19968: jis0212<<14 | 0x1D<<7 | 0x01,\n\t24770 - 19968: jis0212<<14 | 0x1D<<7 | 0x02,\n\t24772 - 19968: jis0212<<14 | 0x1D<<7 | 0x03,\n\t24773 - 19968: jis0208<<14 | 0x1D<<7 | 0x4F,\n\t24774 - 19968: jis0208<<14 | 0x37<<7 | 0x0E,\n\t24775 - 19968: jis0208<<14 | 0x25<<7 | 0x36,\n\t24776 - 19968: jis0212<<14 | 0x1D<<7 | 0x04,\n\t24777 - 19968: jis0212<<14 | 0x1D<<7 | 0x05,\n\t24778 - 19968: jis0212<<14 | 0x1D<<7 | 0x06,\n\t24779 - 19968: jis0212<<14 | 0x1D<<7 | 0x07,\n\t24782 - 19968: jis0212<<14 | 0x1D<<7 | 0x08,\n\t24783 - 19968: jis0212<<14 | 0x1D<<7 | 0x09,\n\t24785 - 19968: jis0208<<14 | 0x2E<<7 | 0x26,\n\t24787 - 19968: jis0208<<14 | 0x37<<7 | 0x0A,\n\t24788 - 19968: jis0212<<14 | 0x1D<<7 | 0x0A,\n\t24789 - 19968: jis0208<<14 | 0x59<<7 | 0x05,\n\t24792 - 19968: jis0208<<14 | 0x37<<7 | 0x10,\n\t24793 - 19968: jis0212<<14 | 0x1D<<7 | 0x0C,\n\t24794 - 19968: jis0208<<14 | 0x18<<7 | 0x5A,\n\t24795 - 19968: jis0212<<14 | 0x1D<<7 | 0x0D,\n\t24796 - 19968: jis0208<<14 | 0x1F<<7 | 0x2A,\n\t24797 - 19968: jis0212<<14 | 0x1D<<7 | 0x0E,\n\t24798 - 19968: jis0208<<14 | 0x59<<7 | 0x04,\n\t24799 - 19968: jis0208<<14 | 0x0F<<7 | 0x33,\n\t24800 - 19968: jis0208<<14 | 0x37<<7 | 0x09,\n\t24801 - 19968: jis0208<<14 | 0x37<<7 | 0x07,\n\t24802 - 19968: jis0212<<14 | 0x1D<<7 | 0x10,\n\t24803 - 19968: jis0208<<14 | 0x20<<7 | 0x39,\n\t24805 - 19968: jis0212<<14 | 0x1D<<7 | 0x11,\n\t24807 - 19968: jis0208<<14 | 0x36<<7 | 0x5B,\n\t24808 - 19968: jis0208<<14 | 0x1A<<7 | 0x13,\n\t24816 - 19968: jis0208<<14 | 0x21<<7 | 0x25,\n\t24817 - 19968: jis0208<<14 | 0x37<<7 | 0x1C,\n\t24818 - 19968: jis0208<<14 | 0x59<<7 | 0x07,\n\t24819 - 19968: jis0208<<14 | 0x20<<7 | 0x3A,\n\t24820 - 19968: jis0208<<14 | 0x37<<7 | 0x17,\n\t24821 - 19968: jis0212<<14 | 0x1D<<7 | 0x13,\n\t24822 - 19968: jis0208<<14 | 0x37<<7 | 0x14,\n\t24823 - 19968: jis0208<<14 | 0x37<<7 | 0x15,\n\t24824 - 19968: jis0212<<14 | 0x1D<<7 | 0x14,\n\t24825 - 19968: jis0208<<14 | 0x1B<<7 | 0x45,\n\t24826 - 19968: jis0208<<14 | 0x37<<7 | 0x18,\n\t24827 - 19968: jis0208<<14 | 0x37<<7 | 0x1B,\n\t24828 - 19968: jis0212<<14 | 0x1D<<7 | 0x15,\n\t24829 - 19968: jis0212<<14 | 0x1D<<7 | 0x16,\n\t24832 - 19968: jis0208<<14 | 0x37<<7 | 0x16,\n\t24833 - 19968: jis0208<<14 | 0x1C<<7 | 0x04,\n\t24834 - 19968: jis0212<<14 | 0x1D<<7 | 0x17,\n\t24835 - 19968: jis0208<<14 | 0x37<<7 | 0x19,\n\t24838 - 19968: jis0208<<14 | 0x37<<7 | 0x13,\n\t24839 - 19968: jis0212<<14 | 0x1D<<7 | 0x18,\n\t24840 - 19968: jis0208<<14 | 0x2B<<7 | 0x5B,\n\t24841 - 19968: jis0208<<14 | 0x2B<<7 | 0x5A,\n\t24842 - 19968: jis0212<<14 | 0x1D<<7 | 0x19,\n\t24844 - 19968: jis0212<<14 | 0x1D<<7 | 0x1A,\n\t24845 - 19968: jis0208<<14 | 0x37<<7 | 0x1D,\n\t24846 - 19968: jis0208<<14 | 0x37<<7 | 0x1E,\n\t24847 - 19968: jis0208<<14 | 0x0F<<7 | 0x34,\n\t24848 - 19968: jis0212<<14 | 0x1D<<7 | 0x1B,\n\t24849 - 19968: jis0208<<14 | 0x59<<7 | 0x08,\n\t24850 - 19968: jis0212<<14 | 0x1D<<7 | 0x1D,\n\t24851 - 19968: jis0212<<14 | 0x1D<<7 | 0x1E,\n\t24852 - 19968: jis0212<<14 | 0x1D<<7 | 0x1F,\n\t24853 - 19968: jis0208<<14 | 0x37<<7 | 0x12,\n\t24854 - 19968: jis0212<<14 | 0x1D<<7 | 0x20,\n\t24855 - 19968: jis0212<<14 | 0x1D<<7 | 0x21,\n\t24857 - 19968: jis0212<<14 | 0x1D<<7 | 0x22,\n\t24858 - 19968: jis0208<<14 | 0x15<<7 | 0x51,\n\t24859 - 19968: jis0208<<14 | 0x0F<<7 | 0x05,\n\t24860 - 19968: jis0212<<14 | 0x1D<<7 | 0x23,\n\t24862 - 19968: jis0212<<14 | 0x1D<<7 | 0x24,\n\t24863 - 19968: jis0208<<14 | 0x13<<7 | 0x15,\n\t24864 - 19968: jis0208<<14 | 0x59<<7 | 0x06,\n\t24865 - 19968: jis0208<<14 | 0x37<<7 | 0x1A,\n\t24866 - 19968: jis0212<<14 | 0x1D<<7 | 0x25,\n\t24871 - 19968: jis0208<<14 | 0x37<<7 | 0x22,\n\t24872 - 19968: jis0208<<14 | 0x37<<7 | 0x21,\n\t24874 - 19968: jis0212<<14 | 0x1D<<7 | 0x26,\n\t24875 - 19968: jis0212<<14 | 0x1D<<7 | 0x27,\n\t24876 - 19968: jis0208<<14 | 0x37<<7 | 0x26,\n\t24880 - 19968: jis0208<<14 | 0x59<<7 | 0x0A,\n\t24881 - 19968: jis0212<<14 | 0x1D<<7 | 0x29,\n\t24884 - 19968: jis0208<<14 | 0x37<<7 | 0x27,\n\t24885 - 19968: jis0212<<14 | 0x1D<<7 | 0x2A,\n\t24886 - 19968: jis0212<<14 | 0x1D<<7 | 0x2B,\n\t24887 - 19968: jis0208<<14 | 0x59<<7 | 0x09,\n\t24889 - 19968: jis0212<<14 | 0x1D<<7 | 0x2D,\n\t24892 - 19968: jis0208<<14 | 0x37<<7 | 0x25,\n\t24893 - 19968: jis0208<<14 | 0x37<<7 | 0x28,\n\t24894 - 19968: jis0208<<14 | 0x37<<7 | 0x20,\n\t24895 - 19968: jis0208<<14 | 0x37<<7 | 0x24,\n\t24897 - 19968: jis0212<<14 | 0x1D<<7 | 0x2E,\n\t24898 - 19968: jis0208<<14 | 0x37<<7 | 0x29,\n\t24900 - 19968: jis0208<<14 | 0x37<<7 | 0x2A,\n\t24901 - 19968: jis0212<<14 | 0x1D<<7 | 0x2F,\n\t24902 - 19968: jis0212<<14 | 0x1D<<7 | 0x30,\n\t24903 - 19968: jis0208<<14 | 0x37<<7 | 0x1F,\n\t24904 - 19968: jis0208<<14 | 0x1A<<7 | 0x5B,\n\t24905 - 19968: jis0212<<14 | 0x1D<<7 | 0x31,\n\t24906 - 19968: jis0208<<14 | 0x37<<7 | 0x23,\n\t24907 - 19968: jis0208<<14 | 0x21<<7 | 0x35,\n\t24908 - 19968: jis0208<<14 | 0x18<<7 | 0x11,\n\t24909 - 19968: jis0208<<14 | 0x37<<7 | 0x11,\n\t24910 - 19968: jis0208<<14 | 0x1E<<7 | 0x14,\n\t24915 - 19968: jis0208<<14 | 0x37<<7 | 0x37,\n\t24917 - 19968: jis0208<<14 | 0x29<<7 | 0x48,\n\t24920 - 19968: jis0208<<14 | 0x37<<7 | 0x2D,\n\t24921 - 19968: jis0208<<14 | 0x37<<7 | 0x2E,\n\t24922 - 19968: jis0208<<14 | 0x37<<7 | 0x2F,\n\t24925 - 19968: jis0208<<14 | 0x37<<7 | 0x36,\n\t24926 - 19968: jis0212<<14 | 0x1D<<7 | 0x32,\n\t24927 - 19968: jis0208<<14 | 0x37<<7 | 0x35,\n\t24928 - 19968: jis0212<<14 | 0x1D<<7 | 0x33,\n\t24930 - 19968: jis0208<<14 | 0x2A<<7 | 0x5C,\n\t24931 - 19968: jis0208<<14 | 0x13<<7 | 0x16,\n\t24933 - 19968: jis0208<<14 | 0x37<<7 | 0x33,\n\t24935 - 19968: jis0208<<14 | 0x16<<7 | 0x24,\n\t24936 - 19968: jis0208<<14 | 0x12<<7 | 0x13,\n\t24939 - 19968: jis0208<<14 | 0x37<<7 | 0x30,\n\t24940 - 19968: jis0212<<14 | 0x1D<<7 | 0x34,\n\t24942 - 19968: jis0208<<14 | 0x2D<<7 | 0x17,\n\t24943 - 19968: jis0208<<14 | 0x37<<7 | 0x32,\n\t24944 - 19968: jis0208<<14 | 0x0F<<7 | 0x35,\n\t24945 - 19968: jis0208<<14 | 0x37<<7 | 0x34,\n\t24946 - 19968: jis0212<<14 | 0x1D<<7 | 0x35,\n\t24947 - 19968: jis0208<<14 | 0x37<<7 | 0x2B,\n\t24948 - 19968: jis0208<<14 | 0x37<<7 | 0x31,\n\t24949 - 19968: jis0208<<14 | 0x37<<7 | 0x38,\n\t24950 - 19968: jis0208<<14 | 0x16<<7 | 0x23,\n\t24951 - 19968: jis0208<<14 | 0x37<<7 | 0x2C,\n\t24952 - 19968: jis0212<<14 | 0x1D<<7 | 0x36,\n\t24955 - 19968: jis0212<<14 | 0x1D<<7 | 0x37,\n\t24956 - 19968: jis0212<<14 | 0x1D<<7 | 0x38,\n\t24958 - 19968: jis0208<<14 | 0x2C<<7 | 0x3C,\n\t24959 - 19968: jis0212<<14 | 0x1D<<7 | 0x39,\n\t24960 - 19968: jis0212<<14 | 0x1D<<7 | 0x3A,\n\t24961 - 19968: jis0212<<14 | 0x1D<<7 | 0x3B,\n\t24962 - 19968: jis0208<<14 | 0x2C<<7 | 0x0A,\n\t24963 - 19968: jis0212<<14 | 0x1D<<7 | 0x3C,\n\t24964 - 19968: jis0212<<14 | 0x1D<<7 | 0x3D,\n\t24967 - 19968: jis0208<<14 | 0x37<<7 | 0x3B,\n\t24970 - 19968: jis0208<<14 | 0x37<<7 | 0x3F,\n\t24971 - 19968: jis0212<<14 | 0x1D<<7 | 0x3E,\n\t24973 - 19968: jis0212<<14 | 0x1D<<7 | 0x3F,\n\t24974 - 19968: jis0208<<14 | 0x20<<7 | 0x5D,\n\t24976 - 19968: jis0208<<14 | 0x2D<<7 | 0x58,\n\t24977 - 19968: jis0208<<14 | 0x37<<7 | 0x40,\n\t24978 - 19968: jis0212<<14 | 0x1D<<7 | 0x40,\n\t24979 - 19968: jis0212<<14 | 0x1D<<7 | 0x41,\n\t24980 - 19968: jis0208<<14 | 0x37<<7 | 0x3D,\n\t24982 - 19968: jis0208<<14 | 0x37<<7 | 0x3A,\n\t24983 - 19968: jis0212<<14 | 0x1D<<7 | 0x42,\n\t24984 - 19968: jis0208<<14 | 0x59<<7 | 0x0B,\n\t24985 - 19968: jis0208<<14 | 0x37<<7 | 0x39,\n\t24986 - 19968: jis0208<<14 | 0x37<<7 | 0x3E,\n\t24988 - 19968: jis0212<<14 | 0x1D<<7 | 0x44,\n\t24989 - 19968: jis0212<<14 | 0x1D<<7 | 0x45,\n\t24991 - 19968: jis0212<<14 | 0x1D<<7 | 0x46,\n\t24992 - 19968: jis0212<<14 | 0x1D<<7 | 0x47,\n\t24996 - 19968: jis0208<<14 | 0x29<<7 | 0x0F,\n\t24997 - 19968: jis0212<<14 | 0x1D<<7 | 0x48,\n\t24999 - 19968: jis0208<<14 | 0x25<<7 | 0x13,\n\t25000 - 19968: jis0212<<14 | 0x1D<<7 | 0x49,\n\t25001 - 19968: jis0208<<14 | 0x16<<7 | 0x25,\n\t25002 - 19968: jis0212<<14 | 0x1D<<7 | 0x4A,\n\t25003 - 19968: jis0208<<14 | 0x37<<7 | 0x41,\n\t25004 - 19968: jis0208<<14 | 0x37<<7 | 0x3C,\n\t25005 - 19968: jis0212<<14 | 0x1D<<7 | 0x4B,\n\t25006 - 19968: jis0208<<14 | 0x37<<7 | 0x42,\n\t25010 - 19968: jis0208<<14 | 0x16<<7 | 0x5A,\n\t25014 - 19968: jis0208<<14 | 0x11<<7 | 0x10,\n\t25016 - 19968: jis0212<<14 | 0x1D<<7 | 0x4C,\n\t25017 - 19968: jis0212<<14 | 0x1D<<7 | 0x4D,\n\t25018 - 19968: jis0208<<14 | 0x37<<7 | 0x4A,\n\t25020 - 19968: jis0212<<14 | 0x1D<<7 | 0x4E,\n\t25022 - 19968: jis0208<<14 | 0x13<<7 | 0x17,\n\t25024 - 19968: jis0212<<14 | 0x1D<<7 | 0x4F,\n\t25025 - 19968: jis0212<<14 | 0x1D<<7 | 0x50,\n\t25026 - 19968: jis0212<<14 | 0x1D<<7 | 0x51,\n\t25027 - 19968: jis0208<<14 | 0x37<<7 | 0x48,\n\t25030 - 19968: jis0208<<14 | 0x37<<7 | 0x49,\n\t25031 - 19968: jis0208<<14 | 0x19<<7 | 0x08,\n\t25032 - 19968: jis0208<<14 | 0x37<<7 | 0x47,\n\t25033 - 19968: jis0208<<14 | 0x37<<7 | 0x45,\n\t25034 - 19968: jis0208<<14 | 0x37<<7 | 0x44,\n\t25035 - 19968: jis0208<<14 | 0x37<<7 | 0x4B,\n\t25036 - 19968: jis0208<<14 | 0x37<<7 | 0x43,\n\t25037 - 19968: jis0208<<14 | 0x37<<7 | 0x4D,\n\t25038 - 19968: jis0212<<14 | 0x1D<<7 | 0x52,\n\t25039 - 19968: jis0212<<14 | 0x1D<<7 | 0x53,\n\t25040 - 19968: jis0208<<14 | 0x11<<7 | 0x5A,\n\t25045 - 19968: jis0212<<14 | 0x1D<<7 | 0x54,\n\t25052 - 19968: jis0212<<14 | 0x1D<<7 | 0x55,\n\t25053 - 19968: jis0212<<14 | 0x1D<<7 | 0x56,\n\t25054 - 19968: jis0212<<14 | 0x1D<<7 | 0x57,\n\t25055 - 19968: jis0212<<14 | 0x1D<<7 | 0x58,\n\t25057 - 19968: jis0212<<14 | 0x1D<<7 | 0x59,\n\t25058 - 19968: jis0212<<14 | 0x1D<<7 | 0x5A,\n\t25059 - 19968: jis0208<<14 | 0x37<<7 | 0x4F,\n\t25061 - 19968: jis0212<<14 | 0x1D<<7 | 0x5D,\n\t25062 - 19968: jis0208<<14 | 0x37<<7 | 0x4E,\n\t25063 - 19968: jis0212<<14 | 0x1D<<7 | 0x5B,\n\t25065 - 19968: jis0212<<14 | 0x1D<<7 | 0x5C,\n\t25068 - 19968: jis0212<<14 | 0x1E<<7 | 0x00,\n\t25069 - 19968: jis0212<<14 | 0x1E<<7 | 0x01,\n\t25071 - 19968: jis0212<<14 | 0x1E<<7 | 0x02,\n\t25074 - 19968: jis0208<<14 | 0x23<<7 | 0x07,\n\t25076 - 19968: jis0208<<14 | 0x37<<7 | 0x52,\n\t25078 - 19968: jis0208<<14 | 0x37<<7 | 0x50,\n\t25079 - 19968: jis0208<<14 | 0x37<<7 | 0x46,\n\t25080 - 19968: jis0208<<14 | 0x16<<7 | 0x5B,\n\t25082 - 19968: jis0208<<14 | 0x37<<7 | 0x51,\n\t25084 - 19968: jis0208<<14 | 0x37<<7 | 0x55,\n\t25085 - 19968: jis0208<<14 | 0x37<<7 | 0x54,\n\t25086 - 19968: jis0208<<14 | 0x37<<7 | 0x56,\n\t25087 - 19968: jis0208<<14 | 0x37<<7 | 0x53,\n\t25088 - 19968: jis0208<<14 | 0x37<<7 | 0x57,\n\t25089 - 19968: jis0212<<14 | 0x1E<<7 | 0x03,\n\t25091 - 19968: jis0212<<14 | 0x1E<<7 | 0x04,\n\t25092 - 19968: jis0212<<14 | 0x1E<<7 | 0x05,\n\t25095 - 19968: jis0212<<14 | 0x1E<<7 | 0x06,\n\t25096 - 19968: jis0208<<14 | 0x37<<7 | 0x58,\n\t25097 - 19968: jis0208<<14 | 0x37<<7 | 0x59,\n\t25098 - 19968: jis0208<<14 | 0x29<<7 | 0x49,\n\t25100 - 19968: jis0208<<14 | 0x37<<7 | 0x5B,\n\t25101 - 19968: jis0208<<14 | 0x37<<7 | 0x5A,\n\t25102 - 19968: jis0208<<14 | 0x1C<<7 | 0x1E,\n\t25104 - 19968: jis0208<<14 | 0x1F<<7 | 0x0D,\n\t25105 - 19968: jis0208<<14 | 0x11<<7 | 0x45,\n\t25106 - 19968: jis0208<<14 | 0x11<<7 | 0x5B,\n\t25107 - 19968: jis0208<<14 | 0x59<<7 | 0x0C,\n\t25108 - 19968: jis0208<<14 | 0x37<<7 | 0x5C,\n\t25109 - 19968: jis0212<<14 | 0x1E<<7 | 0x08,\n\t25110 - 19968: jis0208<<14 | 0x0F<<7 | 0x1E,\n\t25114 - 19968: jis0208<<14 | 0x1F<<7 | 0x2B,\n\t25115 - 19968: jis0208<<14 | 0x37<<7 | 0x5D,\n\t25116 - 19968: jis0212<<14 | 0x1E<<7 | 0x09,\n\t25117 - 19968: jis0208<<14 | 0x4B<<7 | 0x22,\n\t25118 - 19968: jis0208<<14 | 0x38<<7 | 0x00,\n\t25119 - 19968: jis0208<<14 | 0x16<<7 | 0x40,\n\t25120 - 19968: jis0212<<14 | 0x1E<<7 | 0x0A,\n\t25121 - 19968: jis0208<<14 | 0x38<<7 | 0x01,\n\t25122 - 19968: jis0212<<14 | 0x1E<<7 | 0x0B,\n\t25123 - 19968: jis0212<<14 | 0x1E<<7 | 0x0C,\n\t25126 - 19968: jis0208<<14 | 0x1F<<7 | 0x4E,\n\t25127 - 19968: jis0212<<14 | 0x1E<<7 | 0x0D,\n\t25129 - 19968: jis0212<<14 | 0x1E<<7 | 0x0E,\n\t25130 - 19968: jis0208<<14 | 0x38<<7 | 0x02,\n\t25131 - 19968: jis0212<<14 | 0x1E<<7 | 0x0F,\n\t25134 - 19968: jis0208<<14 | 0x38<<7 | 0x03,\n\t25135 - 19968: jis0208<<14 | 0x14<<7 | 0x19,\n\t25136 - 19968: jis0208<<14 | 0x38<<7 | 0x04,\n\t25138 - 19968: jis0208<<14 | 0x38<<7 | 0x05,\n\t25139 - 19968: jis0208<<14 | 0x38<<7 | 0x06,\n\t25140 - 19968: jis0208<<14 | 0x21<<7 | 0x36,\n\t25144 - 19968: jis0208<<14 | 0x17<<7 | 0x2C,\n\t25145 - 19968: jis0212<<14 | 0x1E<<7 | 0x10,\n\t25147 - 19968: jis0208<<14 | 0x2B<<7 | 0x40,\n\t25149 - 19968: jis0212<<14 | 0x1E<<7 | 0x11,\n\t25151 - 19968: jis0208<<14 | 0x2A<<7 | 0x1B,\n\t25152 - 19968: jis0208<<14 | 0x1C<<7 | 0x49,\n\t25153 - 19968: jis0208<<14 | 0x38<<7 | 0x07,\n\t25154 - 19968: jis0212<<14 | 0x1E<<7 | 0x12,\n\t25155 - 19968: jis0212<<14 | 0x1E<<7 | 0x13,\n\t25156 - 19968: jis0212<<14 | 0x1E<<7 | 0x14,\n\t25158 - 19968: jis0212<<14 | 0x1E<<7 | 0x15,\n\t25159 - 19968: jis0208<<14 | 0x1F<<7 | 0x4F,\n\t25160 - 19968: jis0208<<14 | 0x4D<<7 | 0x1C,\n\t25161 - 19968: jis0208<<14 | 0x27<<7 | 0x41,\n\t25163 - 19968: jis0208<<14 | 0x1B<<7 | 0x49,\n\t25164 - 19968: jis0212<<14 | 0x1E<<7 | 0x16,\n\t25165 - 19968: jis0208<<14 | 0x19<<7 | 0x2C,\n\t25166 - 19968: jis0208<<14 | 0x38<<7 | 0x08,\n\t25168 - 19968: jis0212<<14 | 0x1E<<7 | 0x17,\n\t25169 - 19968: jis0212<<14 | 0x1E<<7 | 0x18,\n\t25170 - 19968: jis0212<<14 | 0x1E<<7 | 0x19,\n\t25171 - 19968: jis0208<<14 | 0x21<<7 | 0x26,\n\t25172 - 19968: jis0212<<14 | 0x1E<<7 | 0x1A,\n\t25173 - 19968: jis0208<<14 | 0x29<<7 | 0x06,\n\t25174 - 19968: jis0212<<14 | 0x1E<<7 | 0x1B,\n\t25176 - 19968: jis0208<<14 | 0x21<<7 | 0x50,\n\t25178 - 19968: jis0212<<14 | 0x1E<<7 | 0x1C,\n\t25179 - 19968: jis0208<<14 | 0x38<<7 | 0x0B,\n\t25180 - 19968: jis0212<<14 | 0x1E<<7 | 0x1D,\n\t25182 - 19968: jis0208<<14 | 0x38<<7 | 0x09,\n\t25184 - 19968: jis0208<<14 | 0x38<<7 | 0x0C,\n\t25187 - 19968: jis0208<<14 | 0x38<<7 | 0x0A,\n\t25188 - 19968: jis0212<<14 | 0x1E<<7 | 0x1E,\n\t25192 - 19968: jis0208<<14 | 0x38<<7 | 0x0D,\n\t25197 - 19968: jis0212<<14 | 0x1E<<7 | 0x1F,\n\t25198 - 19968: jis0208<<14 | 0x29<<7 | 0x10,\n\t25199 - 19968: jis0212<<14 | 0x1E<<7 | 0x20,\n\t25201 - 19968: jis0208<<14 | 0x0F<<7 | 0x16,\n\t25203 - 19968: jis0212<<14 | 0x1E<<7 | 0x21,\n\t25206 - 19968: jis0208<<14 | 0x28<<7 | 0x3D,\n\t25209 - 19968: jis0208<<14 | 0x27<<7 | 0x42,\n\t25210 - 19968: jis0212<<14 | 0x1E<<7 | 0x22,\n\t25212 - 19968: jis0208<<14 | 0x38<<7 | 0x0E,\n\t25213 - 19968: jis0212<<14 | 0x1E<<7 | 0x23,\n\t25214 - 19968: jis0208<<14 | 0x38<<7 | 0x11,\n\t25215 - 19968: jis0208<<14 | 0x1D<<7 | 0x14,\n\t25216 - 19968: jis0208<<14 | 0x14<<7 | 0x1A,\n\t25218 - 19968: jis0208<<14 | 0x38<<7 | 0x0F,\n\t25219 - 19968: jis0208<<14 | 0x38<<7 | 0x16,\n\t25220 - 19968: jis0208<<14 | 0x1D<<7 | 0x15,\n\t25225 - 19968: jis0208<<14 | 0x38<<7 | 0x10,\n\t25226 - 19968: jis0208<<14 | 0x26<<7 | 0x23,\n\t25229 - 19968: jis0212<<14 | 0x1E<<7 | 0x24,\n\t25230 - 19968: jis0212<<14 | 0x1E<<7 | 0x25,\n\t25231 - 19968: jis0212<<14 | 0x1E<<7 | 0x26,\n\t25232 - 19968: jis0212<<14 | 0x1E<<7 | 0x27,\n\t25233 - 19968: jis0208<<14 | 0x2C<<7 | 0x3D,\n\t25234 - 19968: jis0208<<14 | 0x38<<7 | 0x12,\n\t25235 - 19968: jis0208<<14 | 0x38<<7 | 0x13,\n\t25236 - 19968: jis0208<<14 | 0x38<<7 | 0x17,\n\t25237 - 19968: jis0208<<14 | 0x24<<7 | 0x49,\n\t25238 - 19968: jis0208<<14 | 0x38<<7 | 0x14,\n\t25239 - 19968: jis0208<<14 | 0x18<<7 | 0x12,\n\t25240 - 19968: jis0208<<14 | 0x1F<<7 | 0x3D,\n\t25243 - 19968: jis0208<<14 | 0x38<<7 | 0x25,\n\t25244 - 19968: jis0208<<14 | 0x27<<7 | 0x13,\n\t25246 - 19968: jis0208<<14 | 0x21<<7 | 0x51,\n\t25254 - 19968: jis0208<<14 | 0x59<<7 | 0x0D,\n\t25256 - 19968: jis0212<<14 | 0x1E<<7 | 0x29,\n\t25259 - 19968: jis0208<<14 | 0x27<<7 | 0x43,\n\t25260 - 19968: jis0208<<14 | 0x39<<7 | 0x0C,\n\t25265 - 19968: jis0208<<14 | 0x29<<7 | 0x59,\n\t25267 - 19968: jis0212<<14 | 0x1E<<7 | 0x2A,\n\t25269 - 19968: jis0208<<14 | 0x23<<7 | 0x50,\n\t25270 - 19968: jis0212<<14 | 0x1E<<7 | 0x2B,\n\t25271 - 19968: jis0212<<14 | 0x1E<<7 | 0x2C,\n\t25273 - 19968: jis0208<<14 | 0x2A<<7 | 0x54,\n\t25274 - 19968: jis0212<<14 | 0x1E<<7 | 0x2D,\n\t25275 - 19968: jis0208<<14 | 0x38<<7 | 0x1A,\n\t25276 - 19968: jis0208<<14 | 0x11<<7 | 0x00,\n\t25277 - 19968: jis0208<<14 | 0x22<<7 | 0x49,\n\t25278 - 19968: jis0212<<14 | 0x1E<<7 | 0x2E,\n\t25279 - 19968: jis0212<<14 | 0x1E<<7 | 0x2F,\n\t25282 - 19968: jis0208<<14 | 0x38<<7 | 0x23,\n\t25284 - 19968: jis0212<<14 | 0x1E<<7 | 0x30,\n\t25285 - 19968: jis0208<<14 | 0x22<<7 | 0x13,\n\t25286 - 19968: jis0208<<14 | 0x38<<7 | 0x1D,\n\t25287 - 19968: jis0208<<14 | 0x38<<7 | 0x24,\n\t25288 - 19968: jis0208<<14 | 0x38<<7 | 0x1F,\n\t25289 - 19968: jis0208<<14 | 0x38<<7 | 0x26,\n\t25290 - 19968: jis0208<<14 | 0x38<<7 | 0x22,\n\t25292 - 19968: jis0208<<14 | 0x38<<7 | 0x21,\n\t25293 - 19968: jis0208<<14 | 0x26<<7 | 0x4E,\n\t25294 - 19968: jis0212<<14 | 0x1E<<7 | 0x31,\n\t25295 - 19968: jis0208<<14 | 0x38<<7 | 0x1B,\n\t25296 - 19968: jis0208<<14 | 0x11<<7 | 0x5C,\n\t25297 - 19968: jis0208<<14 | 0x38<<7 | 0x19,\n\t25298 - 19968: jis0208<<14 | 0x14<<7 | 0x50,\n\t25299 - 19968: jis0208<<14 | 0x21<<7 | 0x52,\n\t25300 - 19968: jis0208<<14 | 0x38<<7 | 0x15,\n\t25301 - 19968: jis0212<<14 | 0x1E<<7 | 0x32,\n\t25302 - 19968: jis0212<<14 | 0x1E<<7 | 0x33,\n\t25303 - 19968: jis0208<<14 | 0x38<<7 | 0x18,\n\t25304 - 19968: jis0208<<14 | 0x18<<7 | 0x13,\n\t25305 - 19968: jis0208<<14 | 0x1F<<7 | 0x3A,\n\t25306 - 19968: jis0212<<14 | 0x1E<<7 | 0x34,\n\t25307 - 19968: jis0208<<14 | 0x1D<<7 | 0x16,\n\t25308 - 19968: jis0208<<14 | 0x38<<7 | 0x20,\n\t25309 - 19968: jis0208<<14 | 0x26<<7 | 0x31,\n\t25312 - 19968: jis0208<<14 | 0x14<<7 | 0x51,\n\t25313 - 19968: jis0208<<14 | 0x12<<7 | 0x27,\n\t25322 - 19968: jis0212<<14 | 0x1E<<7 | 0x35,\n\t25324 - 19968: jis0208<<14 | 0x12<<7 | 0x46,\n\t25325 - 19968: jis0208<<14 | 0x1E<<7 | 0x00,\n\t25326 - 19968: jis0208<<14 | 0x38<<7 | 0x28,\n\t25327 - 19968: jis0208<<14 | 0x38<<7 | 0x2D,\n\t25329 - 19968: jis0208<<14 | 0x38<<7 | 0x29,\n\t25330 - 19968: jis0212<<14 | 0x1E<<7 | 0x36,\n\t25331 - 19968: jis0208<<14 | 0x16<<7 | 0x5C,\n\t25332 - 19968: jis0212<<14 | 0x1E<<7 | 0x37,\n\t25333 - 19968: jis0208<<14 | 0x38<<7 | 0x2E,\n\t25334 - 19968: jis0208<<14 | 0x1A<<7 | 0x01,\n\t25335 - 19968: jis0208<<14 | 0x18<<7 | 0x48,\n\t25340 - 19968: jis0212<<14 | 0x1E<<7 | 0x38,\n\t25341 - 19968: jis0212<<14 | 0x1E<<7 | 0x39,\n\t25342 - 19968: jis0208<<14 | 0x1C<<7 | 0x05,\n\t25343 - 19968: jis0208<<14 | 0x38<<7 | 0x1C,\n\t25345 - 19968: jis0208<<14 | 0x1A<<7 | 0x5C,\n\t25346 - 19968: jis0208<<14 | 0x38<<7 | 0x2B,\n\t25347 - 19968: jis0212<<14 | 0x1E<<7 | 0x3A,\n\t25348 - 19968: jis0212<<14 | 0x1E<<7 | 0x3B,\n\t25351 - 19968: jis0208<<14 | 0x1A<<7 | 0x37,\n\t25352 - 19968: jis0208<<14 | 0x38<<7 | 0x2C,\n\t25353 - 19968: jis0208<<14 | 0x0F<<7 | 0x23,\n\t25354 - 19968: jis0212<<14 | 0x1E<<7 | 0x3C,\n\t25355 - 19968: jis0212<<14 | 0x1E<<7 | 0x3D,\n\t25356 - 19968: jis0208<<14 | 0x38<<7 | 0x27,\n\t25357 - 19968: jis0212<<14 | 0x1E<<7 | 0x3E,\n\t25360 - 19968: jis0212<<14 | 0x1E<<7 | 0x3F,\n\t25361 - 19968: jis0208<<14 | 0x23<<7 | 0x08,\n\t25363 - 19968: jis0212<<14 | 0x1E<<7 | 0x40,\n\t25366 - 19968: jis0212<<14 | 0x1E<<7 | 0x41,\n\t25368 - 19968: jis0212<<14 | 0x1E<<7 | 0x42,\n\t25369 - 19968: jis0208<<14 | 0x14<<7 | 0x52,\n\t25375 - 19968: jis0208<<14 | 0x15<<7 | 0x13,\n\t25383 - 19968: jis0208<<14 | 0x38<<7 | 0x2A,\n\t25384 - 19968: jis0208<<14 | 0x0F<<7 | 0x06,\n\t25385 - 19968: jis0212<<14 | 0x1E<<7 | 0x43,\n\t25386 - 19968: jis0212<<14 | 0x1E<<7 | 0x44,\n\t25387 - 19968: jis0208<<14 | 0x19<<7 | 0x22,\n\t25389 - 19968: jis0212<<14 | 0x1E<<7 | 0x45,\n\t25391 - 19968: jis0208<<14 | 0x1E<<7 | 0x15,\n\t25397 - 19968: jis0212<<14 | 0x1E<<7 | 0x46,\n\t25398 - 19968: jis0212<<14 | 0x1E<<7 | 0x47,\n\t25401 - 19968: jis0212<<14 | 0x1E<<7 | 0x48,\n\t25402 - 19968: jis0208<<14 | 0x23<<7 | 0x51,\n\t25404 - 19968: jis0212<<14 | 0x1E<<7 | 0x49,\n\t25405 - 19968: jis0208<<14 | 0x27<<7 | 0x33,\n\t25406 - 19968: jis0208<<14 | 0x38<<7 | 0x30,\n\t25407 - 19968: jis0208<<14 | 0x20<<7 | 0x3D,\n\t25409 - 19968: jis0212<<14 | 0x1E<<7 | 0x4A,\n\t25410 - 19968: jis0212<<14 | 0x1E<<7 | 0x4B,\n\t25411 - 19968: jis0212<<14 | 0x1E<<7 | 0x4C,\n\t25412 - 19968: jis0212<<14 | 0x1E<<7 | 0x4D,\n\t25414 - 19968: jis0212<<14 | 0x1E<<7 | 0x4E,\n\t25417 - 19968: jis0208<<14 | 0x21<<7 | 0x09,\n\t25418 - 19968: jis0212<<14 | 0x1E<<7 | 0x4F,\n\t25419 - 19968: jis0212<<14 | 0x1E<<7 | 0x50,\n\t25420 - 19968: jis0208<<14 | 0x1A<<7 | 0x0A,\n\t25421 - 19968: jis0208<<14 | 0x38<<7 | 0x31,\n\t25422 - 19968: jis0212<<14 | 0x1E<<7 | 0x51,\n\t25423 - 19968: jis0208<<14 | 0x38<<7 | 0x33,\n\t25424 - 19968: jis0208<<14 | 0x38<<7 | 0x2F,\n\t25426 - 19968: jis0212<<14 | 0x1E<<7 | 0x52,\n\t25427 - 19968: jis0212<<14 | 0x1E<<7 | 0x53,\n\t25428 - 19968: jis0212<<14 | 0x1E<<7 | 0x54,\n\t25429 - 19968: jis0208<<14 | 0x29<<7 | 0x40,\n\t25431 - 19968: jis0208<<14 | 0x23<<7 | 0x1C,\n\t25432 - 19968: jis0212<<14 | 0x1E<<7 | 0x55,\n\t25435 - 19968: jis0212<<14 | 0x1E<<7 | 0x56,\n\t25436 - 19968: jis0208<<14 | 0x20<<7 | 0x3B,\n\t25445 - 19968: jis0212<<14 | 0x1E<<7 | 0x57,\n\t25446 - 19968: jis0212<<14 | 0x1E<<7 | 0x58,\n\t25447 - 19968: jis0208<<14 | 0x29<<7 | 0x5A,\n\t25448 - 19968: jis0208<<14 | 0x1B<<7 | 0x2D,\n\t25449 - 19968: jis0208<<14 | 0x38<<7 | 0x3F,\n\t25451 - 19968: jis0208<<14 | 0x38<<7 | 0x3E,\n\t25452 - 19968: jis0212<<14 | 0x1E<<7 | 0x59,\n\t25453 - 19968: jis0212<<14 | 0x1E<<7 | 0x5A,\n\t25454 - 19968: jis0208<<14 | 0x1E<<7 | 0x57,\n\t25457 - 19968: jis0212<<14 | 0x1E<<7 | 0x5B,\n\t25458 - 19968: jis0208<<14 | 0x16<<7 | 0x5D,\n\t25460 - 19968: jis0212<<14 | 0x1E<<7 | 0x5C,\n\t25461 - 19968: jis0212<<14 | 0x1E<<7 | 0x5D,\n\t25462 - 19968: jis0208<<14 | 0x38<<7 | 0x38,\n\t25463 - 19968: jis0208<<14 | 0x1D<<7 | 0x18,\n\t25464 - 19968: jis0212<<14 | 0x1F<<7 | 0x00,\n\t25466 - 19968: jis0208<<14 | 0x25<<7 | 0x47,\n\t25467 - 19968: jis0208<<14 | 0x26<<7 | 0x10,\n\t25468 - 19968: jis0212<<14 | 0x1F<<7 | 0x01,\n\t25469 - 19968: jis0212<<14 | 0x1F<<7 | 0x02,\n\t25471 - 19968: jis0212<<14 | 0x1F<<7 | 0x03,\n\t25472 - 19968: jis0208<<14 | 0x38<<7 | 0x36,\n\t25474 - 19968: jis0212<<14 | 0x1F<<7 | 0x04,\n\t25475 - 19968: jis0208<<14 | 0x20<<7 | 0x3C,\n\t25476 - 19968: jis0212<<14 | 0x1F<<7 | 0x05,\n\t25479 - 19968: jis0212<<14 | 0x1F<<7 | 0x06,\n\t25480 - 19968: jis0208<<14 | 0x1B<<7 | 0x57,\n\t25481 - 19968: jis0208<<14 | 0x38<<7 | 0x3B,\n\t25482 - 19968: jis0212<<14 | 0x1F<<7 | 0x07,\n\t25484 - 19968: jis0208<<14 | 0x1D<<7 | 0x17,\n\t25486 - 19968: jis0208<<14 | 0x38<<7 | 0x35,\n\t25487 - 19968: jis0208<<14 | 0x38<<7 | 0x3A,\n\t25488 - 19968: jis0212<<14 | 0x1F<<7 | 0x08,\n\t25490 - 19968: jis0208<<14 | 0x26<<7 | 0x32,\n\t25492 - 19968: jis0212<<14 | 0x1F<<7 | 0x09,\n\t25493 - 19968: jis0212<<14 | 0x1F<<7 | 0x0A,\n\t25494 - 19968: jis0208<<14 | 0x38<<7 | 0x34,\n\t25496 - 19968: jis0208<<14 | 0x16<<7 | 0x00,\n\t25497 - 19968: jis0212<<14 | 0x1F<<7 | 0x0B,\n\t25498 - 19968: jis0212<<14 | 0x1F<<7 | 0x0C,\n\t25499 - 19968: jis0208<<14 | 0x12<<7 | 0x3C,\n\t25502 - 19968: jis0212<<14 | 0x1F<<7 | 0x0D,\n\t25503 - 19968: jis0208<<14 | 0x38<<7 | 0x3C,\n\t25504 - 19968: jis0208<<14 | 0x2D<<7 | 0x0A,\n\t25505 - 19968: jis0208<<14 | 0x19<<7 | 0x2D,\n\t25506 - 19968: jis0208<<14 | 0x22<<7 | 0x14,\n\t25507 - 19968: jis0208<<14 | 0x38<<7 | 0x39,\n\t25508 - 19968: jis0212<<14 | 0x1F<<7 | 0x0E,\n\t25509 - 19968: jis0208<<14 | 0x1F<<7 | 0x3B,\n\t25510 - 19968: jis0212<<14 | 0x1F<<7 | 0x0F,\n\t25511 - 19968: jis0208<<14 | 0x18<<7 | 0x14,\n\t25512 - 19968: jis0208<<14 | 0x1E<<7 | 0x43,\n\t25513 - 19968: jis0208<<14 | 0x10<<7 | 0x45,\n\t25514 - 19968: jis0208<<14 | 0x20<<7 | 0x1B,\n\t25515 - 19968: jis0208<<14 | 0x38<<7 | 0x37,\n\t25516 - 19968: jis0208<<14 | 0x14<<7 | 0x24,\n\t25517 - 19968: jis0212<<14 | 0x1F<<7 | 0x10,\n\t25518 - 19968: jis0212<<14 | 0x1F<<7 | 0x11,\n\t25519 - 19968: jis0212<<14 | 0x1F<<7 | 0x12,\n\t25522 - 19968: jis0208<<14 | 0x16<<7 | 0x26,\n\t25524 - 19968: jis0208<<14 | 0x23<<7 | 0x2E,\n\t25525 - 19968: jis0208<<14 | 0x38<<7 | 0x3D,\n\t25531 - 19968: jis0208<<14 | 0x20<<7 | 0x3E,\n\t25533 - 19968: jis0212<<14 | 0x1F<<7 | 0x13,\n\t25534 - 19968: jis0208<<14 | 0x38<<7 | 0x40,\n\t25536 - 19968: jis0208<<14 | 0x38<<7 | 0x42,\n\t25537 - 19968: jis0212<<14 | 0x1F<<7 | 0x14,\n\t25539 - 19968: jis0208<<14 | 0x21<<7 | 0x16,\n\t25540 - 19968: jis0208<<14 | 0x38<<7 | 0x48,\n\t25541 - 19968: jis0212<<14 | 0x1F<<7 | 0x15,\n\t25542 - 19968: jis0208<<14 | 0x38<<7 | 0x43,\n\t25544 - 19968: jis0212<<14 | 0x1F<<7 | 0x16,\n\t25545 - 19968: jis0208<<14 | 0x38<<7 | 0x45,\n\t25550 - 19968: jis0212<<14 | 0x1F<<7 | 0x17,\n\t25551 - 19968: jis0208<<14 | 0x28<<7 | 0x20,\n\t25552 - 19968: jis0208<<14 | 0x23<<7 | 0x52,\n\t25553 - 19968: jis0212<<14 | 0x1F<<7 | 0x18,\n\t25554 - 19968: jis0208<<14 | 0x38<<7 | 0x46,\n\t25555 - 19968: jis0212<<14 | 0x1F<<7 | 0x19,\n\t25556 - 19968: jis0212<<14 | 0x1F<<7 | 0x1A,\n\t25557 - 19968: jis0212<<14 | 0x1F<<7 | 0x1B,\n\t25558 - 19968: jis0208<<14 | 0x2C<<7 | 0x0B,\n\t25562 - 19968: jis0208<<14 | 0x2C<<7 | 0x27,\n\t25563 - 19968: jis0208<<14 | 0x13<<7 | 0x18,\n\t25564 - 19968: jis0212<<14 | 0x1F<<7 | 0x1C,\n\t25568 - 19968: jis0212<<14 | 0x1F<<7 | 0x1D,\n\t25569 - 19968: jis0208<<14 | 0x0F<<7 | 0x0D,\n\t25571 - 19968: jis0208<<14 | 0x38<<7 | 0x44,\n\t25573 - 19968: jis0212<<14 | 0x1F<<7 | 0x1E,\n\t25577 - 19968: jis0208<<14 | 0x38<<7 | 0x41,\n\t25578 - 19968: jis0212<<14 | 0x1F<<7 | 0x1F,\n\t25580 - 19968: jis0212<<14 | 0x1F<<7 | 0x20,\n\t25582 - 19968: jis0208<<14 | 0x13<<7 | 0x57,\n\t25586 - 19968: jis0212<<14 | 0x1F<<7 | 0x21,\n\t25587 - 19968: jis0212<<14 | 0x1F<<7 | 0x22,\n\t25588 - 19968: jis0208<<14 | 0x10<<7 | 0x46,\n\t25589 - 19968: jis0208<<14 | 0x59<<7 | 0x0E,\n\t25590 - 19968: jis0208<<14 | 0x38<<7 | 0x47,\n\t25592 - 19968: jis0212<<14 | 0x1F<<7 | 0x24,\n\t25593 - 19968: jis0212<<14 | 0x1F<<7 | 0x25,\n\t25594 - 19968: jis0208<<14 | 0x2C<<7 | 0x28,\n\t25606 - 19968: jis0208<<14 | 0x38<<7 | 0x4B,\n\t25609 - 19968: jis0212<<14 | 0x1F<<7 | 0x26,\n\t25610 - 19968: jis0212<<14 | 0x1F<<7 | 0x27,\n\t25613 - 19968: jis0208<<14 | 0x21<<7 | 0x1A,\n\t25615 - 19968: jis0208<<14 | 0x38<<7 | 0x52,\n\t25616 - 19968: jis0212<<14 | 0x1F<<7 | 0x28,\n\t25618 - 19968: jis0212<<14 | 0x1F<<7 | 0x29,\n\t25619 - 19968: jis0208<<14 | 0x38<<7 | 0x4C,\n\t25620 - 19968: jis0212<<14 | 0x1F<<7 | 0x2A,\n\t25622 - 19968: jis0208<<14 | 0x38<<7 | 0x49,\n\t25623 - 19968: jis0208<<14 | 0x38<<7 | 0x50,\n\t25624 - 19968: jis0212<<14 | 0x1F<<7 | 0x2B,\n\t25628 - 19968: jis0208<<14 | 0x38<<7 | 0x32,\n\t25630 - 19968: jis0212<<14 | 0x1F<<7 | 0x2C,\n\t25632 - 19968: jis0212<<14 | 0x1F<<7 | 0x2D,\n\t25634 - 19968: jis0212<<14 | 0x1F<<7 | 0x2E,\n\t25636 - 19968: jis0212<<14 | 0x1F<<7 | 0x2F,\n\t25637 - 19968: jis0212<<14 | 0x1F<<7 | 0x30,\n\t25638 - 19968: jis0208<<14 | 0x38<<7 | 0x4D,\n\t25640 - 19968: jis0208<<14 | 0x38<<7 | 0x51,\n\t25641 - 19968: jis0212<<14 | 0x1F<<7 | 0x31,\n\t25642 - 19968: jis0212<<14 | 0x1F<<7 | 0x32,\n\t25644 - 19968: jis0208<<14 | 0x27<<7 | 0x21,\n\t25645 - 19968: jis0208<<14 | 0x24<<7 | 0x4A,\n\t25647 - 19968: jis0212<<14 | 0x1F<<7 | 0x33,\n\t25648 - 19968: jis0212<<14 | 0x1F<<7 | 0x34,\n\t25652 - 19968: jis0208<<14 | 0x38<<7 | 0x4A,\n\t25653 - 19968: jis0212<<14 | 0x1F<<7 | 0x35,\n\t25654 - 19968: jis0208<<14 | 0x38<<7 | 0x4E,\n\t25658 - 19968: jis0208<<14 | 0x16<<7 | 0x27,\n\t25661 - 19968: jis0212<<14 | 0x1F<<7 | 0x36,\n\t25662 - 19968: jis0208<<14 | 0x19<<7 | 0x50,\n\t25663 - 19968: jis0212<<14 | 0x1F<<7 | 0x37,\n\t25666 - 19968: jis0208<<14 | 0x1F<<7 | 0x3C,\n\t25675 - 19968: jis0212<<14 | 0x1F<<7 | 0x38,\n\t25678 - 19968: jis0208<<14 | 0x38<<7 | 0x56,\n\t25679 - 19968: jis0212<<14 | 0x1F<<7 | 0x39,\n\t25681 - 19968: jis0212<<14 | 0x1F<<7 | 0x3A,\n\t25682 - 19968: jis0212<<14 | 0x1F<<7 | 0x3B,\n\t25683 - 19968: jis0212<<14 | 0x1F<<7 | 0x3C,\n\t25684 - 19968: jis0212<<14 | 0x1F<<7 | 0x3D,\n\t25688 - 19968: jis0208<<14 | 0x24<<7 | 0x05,\n\t25690 - 19968: jis0212<<14 | 0x1F<<7 | 0x3E,\n\t25691 - 19968: jis0212<<14 | 0x1F<<7 | 0x3F,\n\t25692 - 19968: jis0212<<14 | 0x1F<<7 | 0x40,\n\t25693 - 19968: jis0212<<14 | 0x1F<<7 | 0x41,\n\t25695 - 19968: jis0212<<14 | 0x1F<<7 | 0x42,\n\t25696 - 19968: jis0208<<14 | 0x59<<7 | 0x0F,\n\t25697 - 19968: jis0212<<14 | 0x1F<<7 | 0x44,\n\t25699 - 19968: jis0212<<14 | 0x1F<<7 | 0x45,\n\t25703 - 19968: jis0208<<14 | 0x38<<7 | 0x53,\n\t25705 - 19968: jis0208<<14 | 0x2A<<7 | 0x3F,\n\t25709 - 19968: jis0212<<14 | 0x1F<<7 | 0x46,\n\t25711 - 19968: jis0208<<14 | 0x38<<7 | 0x54,\n\t25715 - 19968: jis0212<<14 | 0x1F<<7 | 0x47,\n\t25716 - 19968: jis0212<<14 | 0x1F<<7 | 0x48,\n\t25718 - 19968: jis0208<<14 | 0x38<<7 | 0x55,\n\t25720 - 19968: jis0208<<14 | 0x2B<<7 | 0x2D,\n\t25722 - 19968: jis0208<<14 | 0x1F<<7 | 0x01,\n\t25723 - 19968: jis0212<<14 | 0x1F<<7 | 0x49,\n\t25725 - 19968: jis0212<<14 | 0x1F<<7 | 0x4A,\n\t25731 - 19968: jis0208<<14 | 0x16<<7 | 0x41,\n\t25733 - 19968: jis0212<<14 | 0x1F<<7 | 0x4B,\n\t25735 - 19968: jis0212<<14 | 0x1F<<7 | 0x4C,\n\t25736 - 19968: jis0208<<14 | 0x38<<7 | 0x5C,\n\t25743 - 19968: jis0212<<14 | 0x1F<<7 | 0x4D,\n\t25744 - 19968: jis0212<<14 | 0x1F<<7 | 0x4E,\n\t25745 - 19968: jis0212<<14 | 0x1F<<7 | 0x4F,\n\t25746 - 19968: jis0208<<14 | 0x1A<<7 | 0x14,\n\t25747 - 19968: jis0208<<14 | 0x38<<7 | 0x59,\n\t25749 - 19968: jis0208<<14 | 0x38<<7 | 0x58,\n\t25752 - 19968: jis0212<<14 | 0x1F<<7 | 0x50,\n\t25753 - 19968: jis0212<<14 | 0x1F<<7 | 0x51,\n\t25754 - 19968: jis0208<<14 | 0x26<<7 | 0x11,\n\t25755 - 19968: jis0212<<14 | 0x1F<<7 | 0x52,\n\t25757 - 19968: jis0208<<14 | 0x59<<7 | 0x10,\n\t25758 - 19968: jis0208<<14 | 0x25<<7 | 0x14,\n\t25759 - 19968: jis0212<<14 | 0x1F<<7 | 0x54,\n\t25761 - 19968: jis0212<<14 | 0x1F<<7 | 0x55,\n\t25763 - 19968: jis0212<<14 | 0x1F<<7 | 0x56,\n\t25764 - 19968: jis0208<<14 | 0x24<<7 | 0x10,\n\t25765 - 19968: jis0208<<14 | 0x38<<7 | 0x5A,\n\t25766 - 19968: jis0212<<14 | 0x1F<<7 | 0x57,\n\t25768 - 19968: jis0212<<14 | 0x1F<<7 | 0x58,\n\t25769 - 19968: jis0208<<14 | 0x38<<7 | 0x5B,\n\t25771 - 19968: jis0208<<14 | 0x28<<7 | 0x4E,\n\t25772 - 19968: jis0212<<14 | 0x1F<<7 | 0x59,\n\t25773 - 19968: jis0208<<14 | 0x26<<7 | 0x24,\n\t25774 - 19968: jis0208<<14 | 0x1A<<7 | 0x02,\n\t25776 - 19968: jis0208<<14 | 0x1F<<7 | 0x50,\n\t25778 - 19968: jis0208<<14 | 0x2A<<7 | 0x2F,\n\t25779 - 19968: jis0212<<14 | 0x1F<<7 | 0x5A,\n\t25785 - 19968: jis0208<<14 | 0x12<<7 | 0x28,\n\t25787 - 19968: jis0208<<14 | 0x39<<7 | 0x04,\n\t25788 - 19968: jis0208<<14 | 0x38<<7 | 0x5D,\n\t25789 - 19968: jis0212<<14 | 0x1F<<7 | 0x5B,\n\t25790 - 19968: jis0212<<14 | 0x1F<<7 | 0x5C,\n\t25791 - 19968: jis0212<<14 | 0x1F<<7 | 0x5D,\n\t25793 - 19968: jis0208<<14 | 0x2C<<7 | 0x29,\n\t25794 - 19968: jis0208<<14 | 0x39<<7 | 0x06,\n\t25796 - 19968: jis0212<<14 | 0x20<<7 | 0x00,\n\t25797 - 19968: jis0208<<14 | 0x39<<7 | 0x02,\n\t25799 - 19968: jis0208<<14 | 0x39<<7 | 0x03,\n\t25801 - 19968: jis0212<<14 | 0x20<<7 | 0x01,\n\t25802 - 19968: jis0212<<14 | 0x20<<7 | 0x02,\n\t25803 - 19968: jis0212<<14 | 0x20<<7 | 0x03,\n\t25804 - 19968: jis0212<<14 | 0x20<<7 | 0x04,\n\t25805 - 19968: jis0208<<14 | 0x20<<7 | 0x3F,\n\t25806 - 19968: jis0208<<14 | 0x59<<7 | 0x11,\n\t25808 - 19968: jis0212<<14 | 0x20<<7 | 0x06,\n\t25809 - 19968: jis0212<<14 | 0x20<<7 | 0x07,\n\t25810 - 19968: jis0208<<14 | 0x39<<7 | 0x01,\n\t25812 - 19968: jis0208<<14 | 0x38<<7 | 0x1E,\n\t25813 - 19968: jis0212<<14 | 0x20<<7 | 0x08,\n\t25815 - 19968: jis0212<<14 | 0x20<<7 | 0x09,\n\t25816 - 19968: jis0208<<14 | 0x39<<7 | 0x05,\n\t25818 - 19968: jis0208<<14 | 0x39<<7 | 0x00,\n\t25824 - 19968: jis0208<<14 | 0x39<<7 | 0x0A,\n\t25825 - 19968: jis0208<<14 | 0x39<<7 | 0x0B,\n\t25826 - 19968: jis0208<<14 | 0x24<<7 | 0x06,\n\t25827 - 19968: jis0208<<14 | 0x39<<7 | 0x0D,\n\t25828 - 19968: jis0212<<14 | 0x20<<7 | 0x0A,\n\t25829 - 19968: jis0212<<14 | 0x20<<7 | 0x0B,\n\t25830 - 19968: jis0208<<14 | 0x1A<<7 | 0x03,\n\t25831 - 19968: jis0208<<14 | 0x39<<7 | 0x08,\n\t25833 - 19968: jis0212<<14 | 0x20<<7 | 0x0C,\n\t25834 - 19968: jis0212<<14 | 0x20<<7 | 0x0D,\n\t25836 - 19968: jis0208<<14 | 0x14<<7 | 0x1B,\n\t25837 - 19968: jis0212<<14 | 0x20<<7 | 0x0E,\n\t25839 - 19968: jis0208<<14 | 0x39<<7 | 0x0E,\n\t25840 - 19968: jis0212<<14 | 0x20<<7 | 0x0F,\n\t25841 - 19968: jis0208<<14 | 0x39<<7 | 0x07,\n\t25842 - 19968: jis0208<<14 | 0x39<<7 | 0x12,\n\t25844 - 19968: jis0208<<14 | 0x39<<7 | 0x11,\n\t25845 - 19968: jis0212<<14 | 0x20<<7 | 0x10,\n\t25846 - 19968: jis0208<<14 | 0x39<<7 | 0x10,\n\t25847 - 19968: jis0212<<14 | 0x20<<7 | 0x11,\n\t25850 - 19968: jis0208<<14 | 0x39<<7 | 0x13,\n\t25851 - 19968: jis0212<<14 | 0x20<<7 | 0x12,\n\t25853 - 19968: jis0208<<14 | 0x39<<7 | 0x15,\n\t25854 - 19968: jis0208<<14 | 0x1D<<7 | 0x50,\n\t25855 - 19968: jis0212<<14 | 0x20<<7 | 0x13,\n\t25856 - 19968: jis0208<<14 | 0x39<<7 | 0x14,\n\t25857 - 19968: jis0212<<14 | 0x20<<7 | 0x14,\n\t25860 - 19968: jis0212<<14 | 0x20<<7 | 0x15,\n\t25861 - 19968: jis0208<<14 | 0x39<<7 | 0x18,\n\t25864 - 19968: jis0212<<14 | 0x20<<7 | 0x16,\n\t25865 - 19968: jis0212<<14 | 0x20<<7 | 0x17,\n\t25866 - 19968: jis0212<<14 | 0x20<<7 | 0x18,\n\t25871 - 19968: jis0212<<14 | 0x20<<7 | 0x19,\n\t25875 - 19968: jis0212<<14 | 0x20<<7 | 0x1A,\n\t25876 - 19968: jis0212<<14 | 0x20<<7 | 0x1B,\n\t25878 - 19968: jis0212<<14 | 0x20<<7 | 0x1C,\n\t25880 - 19968: jis0208<<14 | 0x39<<7 | 0x16,\n\t25881 - 19968: jis0212<<14 | 0x20<<7 | 0x1D,\n\t25883 - 19968: jis0212<<14 | 0x20<<7 | 0x1E,\n\t25884 - 19968: jis0208<<14 | 0x39<<7 | 0x17,\n\t25885 - 19968: jis0208<<14 | 0x38<<7 | 0x4F,\n\t25886 - 19968: jis0212<<14 | 0x20<<7 | 0x1F,\n\t25887 - 19968: jis0212<<14 | 0x20<<7 | 0x20,\n\t25890 - 19968: jis0212<<14 | 0x20<<7 | 0x21,\n\t25891 - 19968: jis0208<<14 | 0x39<<7 | 0x1A,\n\t25892 - 19968: jis0208<<14 | 0x39<<7 | 0x19,\n\t25894 - 19968: jis0212<<14 | 0x20<<7 | 0x22,\n\t25897 - 19968: jis0212<<14 | 0x20<<7 | 0x23,\n\t25898 - 19968: jis0208<<14 | 0x38<<7 | 0x57,\n\t25899 - 19968: jis0208<<14 | 0x39<<7 | 0x1B,\n\t25900 - 19968: jis0208<<14 | 0x39<<7 | 0x0F,\n\t25902 - 19968: jis0212<<14 | 0x20<<7 | 0x24,\n\t25903 - 19968: jis0208<<14 | 0x1A<<7 | 0x38,\n\t25905 - 19968: jis0212<<14 | 0x20<<7 | 0x25,\n\t25908 - 19968: jis0208<<14 | 0x39<<7 | 0x1C,\n\t25909 - 19968: jis0208<<14 | 0x39<<7 | 0x1D,\n\t25910 - 19968: jis0208<<14 | 0x39<<7 | 0x1F,\n\t25911 - 19968: jis0208<<14 | 0x39<<7 | 0x1E,\n\t25912 - 19968: jis0208<<14 | 0x39<<7 | 0x20,\n\t25913 - 19968: jis0208<<14 | 0x11<<7 | 0x5D,\n\t25914 - 19968: jis0212<<14 | 0x20<<7 | 0x26,\n\t25915 - 19968: jis0208<<14 | 0x18<<7 | 0x15,\n\t25916 - 19968: jis0212<<14 | 0x20<<7 | 0x27,\n\t25917 - 19968: jis0212<<14 | 0x20<<7 | 0x28,\n\t25918 - 19968: jis0208<<14 | 0x29<<7 | 0x5B,\n\t25919 - 19968: jis0208<<14 | 0x1F<<7 | 0x0E,\n\t25923 - 19968: jis0212<<14 | 0x20<<7 | 0x29,\n\t25925 - 19968: jis0208<<14 | 0x17<<7 | 0x2D,\n\t25927 - 19968: jis0212<<14 | 0x20<<7 | 0x2A,\n\t25928 - 19968: jis0208<<14 | 0x39<<7 | 0x22,\n\t25929 - 19968: jis0212<<14 | 0x20<<7 | 0x2B,\n\t25933 - 19968: jis0208<<14 | 0x39<<7 | 0x25,\n\t25934 - 19968: jis0208<<14 | 0x59<<7 | 0x12,\n\t25935 - 19968: jis0208<<14 | 0x28<<7 | 0x31,\n\t25936 - 19968: jis0212<<14 | 0x20<<7 | 0x2C,\n\t25937 - 19968: jis0208<<14 | 0x14<<7 | 0x3E,\n\t25938 - 19968: jis0212<<14 | 0x20<<7 | 0x2D,\n\t25940 - 19968: jis0212<<14 | 0x20<<7 | 0x2E,\n\t25941 - 19968: jis0208<<14 | 0x39<<7 | 0x24,\n\t25942 - 19968: jis0208<<14 | 0x39<<7 | 0x23,\n\t25943 - 19968: jis0208<<14 | 0x26<<7 | 0x33,\n\t25944 - 19968: jis0208<<14 | 0x39<<7 | 0x26,\n\t25945 - 19968: jis0208<<14 | 0x15<<7 | 0x14,\n\t25949 - 19968: jis0208<<14 | 0x39<<7 | 0x28,\n\t25950 - 19968: jis0208<<14 | 0x39<<7 | 0x27,\n\t25951 - 19968: jis0212<<14 | 0x20<<7 | 0x2F,\n\t25952 - 19968: jis0212<<14 | 0x20<<7 | 0x30,\n\t25954 - 19968: jis0208<<14 | 0x13<<7 | 0x19,\n\t25955 - 19968: jis0208<<14 | 0x1A<<7 | 0x15,\n\t25958 - 19968: jis0208<<14 | 0x25<<7 | 0x37,\n\t25959 - 19968: jis0212<<14 | 0x20<<7 | 0x31,\n\t25963 - 19968: jis0212<<14 | 0x20<<7 | 0x32,\n\t25964 - 19968: jis0208<<14 | 0x16<<7 | 0x28,\n\t25968 - 19968: jis0208<<14 | 0x1E<<7 | 0x53,\n\t25970 - 19968: jis0208<<14 | 0x39<<7 | 0x29,\n\t25972 - 19968: jis0208<<14 | 0x1F<<7 | 0x0F,\n\t25973 - 19968: jis0208<<14 | 0x24<<7 | 0x07,\n\t25975 - 19968: jis0208<<14 | 0x28<<7 | 0x3E,\n\t25976 - 19968: jis0208<<14 | 0x39<<7 | 0x2A,\n\t25978 - 19968: jis0212<<14 | 0x20<<7 | 0x33,\n\t25981 - 19968: jis0212<<14 | 0x20<<7 | 0x34,\n\t25985 - 19968: jis0212<<14 | 0x20<<7 | 0x35,\n\t25986 - 19968: jis0208<<14 | 0x39<<7 | 0x2B,\n\t25987 - 19968: jis0208<<14 | 0x39<<7 | 0x2C,\n\t25989 - 19968: jis0212<<14 | 0x20<<7 | 0x36,\n\t25991 - 19968: jis0208<<14 | 0x29<<7 | 0x17,\n\t25992 - 19968: jis0208<<14 | 0x34<<7 | 0x3C,\n\t25993 - 19968: jis0208<<14 | 0x1F<<7 | 0x25,\n\t25994 - 19968: jis0212<<14 | 0x20<<7 | 0x37,\n\t25996 - 19968: jis0208<<14 | 0x28<<7 | 0x2B,\n\t25998 - 19968: jis0208<<14 | 0x19<<7 | 0x37,\n\t26000 - 19968: jis0208<<14 | 0x27<<7 | 0x44,\n\t26001 - 19968: jis0208<<14 | 0x27<<7 | 0x22,\n\t26002 - 19968: jis0212<<14 | 0x20<<7 | 0x38,\n\t26005 - 19968: jis0212<<14 | 0x20<<7 | 0x39,\n\t26007 - 19968: jis0208<<14 | 0x24<<7 | 0x2C,\n\t26008 - 19968: jis0212<<14 | 0x20<<7 | 0x3A,\n\t26009 - 19968: jis0208<<14 | 0x2D<<7 | 0x20,\n\t26011 - 19968: jis0208<<14 | 0x39<<7 | 0x2E,\n\t26012 - 19968: jis0208<<14 | 0x1B<<7 | 0x2F,\n\t26013 - 19968: jis0212<<14 | 0x20<<7 | 0x3B,\n\t26015 - 19968: jis0208<<14 | 0x39<<7 | 0x2F,\n\t26016 - 19968: jis0212<<14 | 0x20<<7 | 0x3C,\n\t26017 - 19968: jis0208<<14 | 0x0F<<7 | 0x15,\n\t26019 - 19968: jis0212<<14 | 0x20<<7 | 0x3D,\n\t26020 - 19968: jis0208<<14 | 0x15<<7 | 0x33,\n\t26021 - 19968: jis0208<<14 | 0x1F<<7 | 0x2C,\n\t26022 - 19968: jis0212<<14 | 0x20<<7 | 0x3E,\n\t26023 - 19968: jis0208<<14 | 0x28<<7 | 0x3F,\n\t26027 - 19968: jis0208<<14 | 0x39<<7 | 0x30,\n\t26028 - 19968: jis0208<<14 | 0x1A<<7 | 0x21,\n\t26029 - 19968: jis0208<<14 | 0x22<<7 | 0x26,\n\t26030 - 19968: jis0212<<14 | 0x20<<7 | 0x3F,\n\t26031 - 19968: jis0208<<14 | 0x1A<<7 | 0x3A,\n\t26032 - 19968: jis0208<<14 | 0x1E<<7 | 0x16,\n\t26034 - 19968: jis0212<<14 | 0x20<<7 | 0x40,\n\t26035 - 19968: jis0212<<14 | 0x20<<7 | 0x41,\n\t26036 - 19968: jis0212<<14 | 0x20<<7 | 0x42,\n\t26039 - 19968: jis0208<<14 | 0x39<<7 | 0x31,\n\t26041 - 19968: jis0208<<14 | 0x29<<7 | 0x5C,\n\t26044 - 19968: jis0208<<14 | 0x10<<7 | 0x56,\n\t26045 - 19968: jis0208<<14 | 0x1A<<7 | 0x3B,\n\t26047 - 19968: jis0212<<14 | 0x20<<7 | 0x43,\n\t26049 - 19968: jis0208<<14 | 0x39<<7 | 0x34,\n\t26050 - 19968: jis0212<<14 | 0x20<<7 | 0x44,\n\t26051 - 19968: jis0208<<14 | 0x39<<7 | 0x32,\n\t26052 - 19968: jis0208<<14 | 0x39<<7 | 0x35,\n\t26053 - 19968: jis0208<<14 | 0x2D<<7 | 0x18,\n\t26054 - 19968: jis0208<<14 | 0x39<<7 | 0x33,\n\t26056 - 19968: jis0212<<14 | 0x20<<7 | 0x45,\n\t26057 - 19968: jis0212<<14 | 0x20<<7 | 0x46,\n\t26059 - 19968: jis0208<<14 | 0x1F<<7 | 0x5A,\n\t26060 - 19968: jis0208<<14 | 0x39<<7 | 0x36,\n\t26062 - 19968: jis0212<<14 | 0x20<<7 | 0x47,\n\t26063 - 19968: jis0208<<14 | 0x21<<7 | 0x11,\n\t26064 - 19968: jis0212<<14 | 0x20<<7 | 0x48,\n\t26066 - 19968: jis0208<<14 | 0x39<<7 | 0x37,\n\t26068 - 19968: jis0212<<14 | 0x20<<7 | 0x49,\n\t26070 - 19968: jis0212<<14 | 0x20<<7 | 0x4A,\n\t26071 - 19968: jis0208<<14 | 0x13<<7 | 0x59,\n\t26072 - 19968: jis0212<<14 | 0x20<<7 | 0x4B,\n\t26073 - 19968: jis0208<<14 | 0x39<<7 | 0x39,\n\t26075 - 19968: jis0208<<14 | 0x39<<7 | 0x38,\n\t26079 - 19968: jis0212<<14 | 0x20<<7 | 0x4C,\n\t26080 - 19968: jis0208<<14 | 0x39<<7 | 0x3A,\n\t26081 - 19968: jis0208<<14 | 0x39<<7 | 0x3B,\n\t26082 - 19968: jis0208<<14 | 0x13<<7 | 0x5A,\n\t26085 - 19968: jis0208<<14 | 0x25<<7 | 0x5B,\n\t26086 - 19968: jis0208<<14 | 0x22<<7 | 0x15,\n\t26087 - 19968: jis0208<<14 | 0x14<<7 | 0x4B,\n\t26088 - 19968: jis0208<<14 | 0x1A<<7 | 0x3C,\n\t26089 - 19968: jis0208<<14 | 0x20<<7 | 0x40,\n\t26092 - 19968: jis0208<<14 | 0x1C<<7 | 0x3B,\n\t26093 - 19968: jis0208<<14 | 0x0F<<7 | 0x0F,\n\t26096 - 19968: jis0212<<14 | 0x20<<7 | 0x4D,\n\t26097 - 19968: jis0208<<14 | 0x39<<7 | 0x3C,\n\t26098 - 19968: jis0212<<14 | 0x20<<7 | 0x4E,\n\t26100 - 19968: jis0212<<14 | 0x20<<7 | 0x4F,\n\t26101 - 19968: jis0212<<14 | 0x20<<7 | 0x50,\n\t26105 - 19968: jis0212<<14 | 0x20<<7 | 0x51,\n\t26106 - 19968: jis0208<<14 | 0x11<<7 | 0x01,\n\t26107 - 19968: jis0208<<14 | 0x39<<7 | 0x40,\n\t26110 - 19968: jis0212<<14 | 0x20<<7 | 0x52,\n\t26111 - 19968: jis0212<<14 | 0x20<<7 | 0x53,\n\t26112 - 19968: jis0208<<14 | 0x59<<7 | 0x13,\n\t26114 - 19968: jis0208<<14 | 0x18<<7 | 0x16,\n\t26115 - 19968: jis0208<<14 | 0x39<<7 | 0x3F,\n\t26116 - 19968: jis0212<<14 | 0x20<<7 | 0x55,\n\t26118 - 19968: jis0208<<14 | 0x19<<7 | 0x0A,\n\t26119 - 19968: jis0208<<14 | 0x1D<<7 | 0x19,\n\t26120 - 19968: jis0212<<14 | 0x20<<7 | 0x56,\n\t26121 - 19968: jis0208<<14 | 0x59<<7 | 0x16,\n\t26122 - 19968: jis0208<<14 | 0x39<<7 | 0x3E,\n\t26124 - 19968: jis0208<<14 | 0x1D<<7 | 0x1A,\n\t26125 - 19968: jis0212<<14 | 0x20<<7 | 0x58,\n\t26126 - 19968: jis0208<<14 | 0x2B<<7 | 0x1F,\n\t26127 - 19968: jis0208<<14 | 0x19<<7 | 0x09,\n\t26129 - 19968: jis0212<<14 | 0x20<<7 | 0x59,\n\t26130 - 19968: jis0212<<14 | 0x20<<7 | 0x5A,\n\t26131 - 19968: jis0208<<14 | 0x0F<<7 | 0x36,\n\t26132 - 19968: jis0208<<14 | 0x1F<<7 | 0x2D,\n\t26133 - 19968: jis0208<<14 | 0x59<<7 | 0x14,\n\t26134 - 19968: jis0212<<14 | 0x20<<7 | 0x5C,\n\t26140 - 19968: jis0208<<14 | 0x39<<7 | 0x45,\n\t26141 - 19968: jis0212<<14 | 0x20<<7 | 0x5D,\n\t26142 - 19968: jis0208<<14 | 0x59<<7 | 0x18,\n\t26143 - 19968: jis0208<<14 | 0x1F<<7 | 0x10,\n\t26144 - 19968: jis0208<<14 | 0x10<<7 | 0x26,\n\t26145 - 19968: jis0212<<14 | 0x21<<7 | 0x01,\n\t26146 - 19968: jis0212<<14 | 0x21<<7 | 0x02,\n\t26147 - 19968: jis0212<<14 | 0x21<<7 | 0x03,\n\t26148 - 19968: jis0208<<14 | 0x59<<7 | 0x19,\n\t26149 - 19968: jis0208<<14 | 0x1C<<7 | 0x34,\n\t26150 - 19968: jis0212<<14 | 0x21<<7 | 0x05,\n\t26151 - 19968: jis0208<<14 | 0x2A<<7 | 0x45,\n\t26152 - 19968: jis0208<<14 | 0x19<<7 | 0x51,\n\t26153 - 19968: jis0212<<14 | 0x21<<7 | 0x06,\n\t26154 - 19968: jis0212<<14 | 0x21<<7 | 0x07,\n\t26155 - 19968: jis0212<<14 | 0x21<<7 | 0x08,\n\t26156 - 19968: jis0212<<14 | 0x21<<7 | 0x09,\n\t26157 - 19968: jis0208<<14 | 0x1D<<7 | 0x1B,\n\t26158 - 19968: jis0208<<14 | 0x59<<7 | 0x17,\n\t26159 - 19968: jis0208<<14 | 0x1F<<7 | 0x06,\n\t26160 - 19968: jis0212<<14 | 0x21<<7 | 0x0B,\n\t26161 - 19968: jis0208<<14 | 0x58<<7 | 0x07,\n\t26163 - 19968: jis0212<<14 | 0x21<<7 | 0x0D,\n\t26164 - 19968: jis0208<<14 | 0x39<<7 | 0x44,\n\t26165 - 19968: jis0208<<14 | 0x39<<7 | 0x42,\n\t26166 - 19968: jis0208<<14 | 0x39<<7 | 0x43,\n\t26167 - 19968: jis0212<<14 | 0x21<<7 | 0x0F,\n\t26169 - 19968: jis0212<<14 | 0x21<<7 | 0x0E,\n\t26171 - 19968: jis0208<<14 | 0x59<<7 | 0x15,\n\t26172 - 19968: jis0208<<14 | 0x22<<7 | 0x4A,\n\t26175 - 19968: jis0208<<14 | 0x3A<<7 | 0x05,\n\t26176 - 19968: jis0212<<14 | 0x21<<7 | 0x10,\n\t26177 - 19968: jis0208<<14 | 0x39<<7 | 0x49,\n\t26178 - 19968: jis0208<<14 | 0x1A<<7 | 0x5D,\n\t26179 - 19968: jis0208<<14 | 0x18<<7 | 0x17,\n\t26180 - 19968: jis0208<<14 | 0x39<<7 | 0x47,\n\t26181 - 19968: jis0212<<14 | 0x21<<7 | 0x11,\n\t26182 - 19968: jis0212<<14 | 0x21<<7 | 0x12,\n\t26185 - 19968: jis0208<<14 | 0x39<<7 | 0x48,\n\t26186 - 19968: jis0212<<14 | 0x21<<7 | 0x13,\n\t26187 - 19968: jis0208<<14 | 0x1E<<7 | 0x17,\n\t26188 - 19968: jis0212<<14 | 0x21<<7 | 0x14,\n\t26190 - 19968: jis0212<<14 | 0x21<<7 | 0x16,\n\t26191 - 19968: jis0208<<14 | 0x39<<7 | 0x46,\n\t26193 - 19968: jis0212<<14 | 0x21<<7 | 0x15,\n\t26194 - 19968: jis0208<<14 | 0x1A<<7 | 0x0E,\n\t26199 - 19968: jis0208<<14 | 0x59<<7 | 0x1B,\n\t26200 - 19968: jis0212<<14 | 0x21<<7 | 0x18,\n\t26201 - 19968: jis0208<<14 | 0x59<<7 | 0x1C,\n\t26203 - 19968: jis0212<<14 | 0x21<<7 | 0x1A,\n\t26204 - 19968: jis0212<<14 | 0x21<<7 | 0x1B,\n\t26205 - 19968: jis0208<<14 | 0x39<<7 | 0x4B,\n\t26206 - 19968: jis0208<<14 | 0x39<<7 | 0x4A,\n\t26207 - 19968: jis0208<<14 | 0x39<<7 | 0x4F,\n\t26208 - 19968: jis0212<<14 | 0x21<<7 | 0x1C,\n\t26209 - 19968: jis0212<<14 | 0x21<<7 | 0x1D,\n\t26210 - 19968: jis0208<<14 | 0x39<<7 | 0x50,\n\t26212 - 19968: jis0208<<14 | 0x39<<7 | 0x4C,\n\t26213 - 19968: jis0208<<14 | 0x59<<7 | 0x1A,\n\t26214 - 19968: jis0208<<14 | 0x12<<7 | 0x01,\n\t26215 - 19968: jis0208<<14 | 0x39<<7 | 0x4D,\n\t26216 - 19968: jis0208<<14 | 0x39<<7 | 0x4E,\n\t26217 - 19968: jis0208<<14 | 0x27<<7 | 0x34,\n\t26218 - 19968: jis0212<<14 | 0x21<<7 | 0x1F,\n\t26219 - 19968: jis0212<<14 | 0x21<<7 | 0x20,\n\t26220 - 19968: jis0212<<14 | 0x21<<7 | 0x21,\n\t26222 - 19968: jis0208<<14 | 0x28<<7 | 0x40,\n\t26223 - 19968: jis0208<<14 | 0x16<<7 | 0x29,\n\t26224 - 19968: jis0208<<14 | 0x39<<7 | 0x51,\n\t26227 - 19968: jis0208<<14 | 0x59<<7 | 0x1E,\n\t26228 - 19968: jis0208<<14 | 0x1F<<7 | 0x11,\n\t26229 - 19968: jis0212<<14 | 0x21<<7 | 0x24,\n\t26230 - 19968: jis0208<<14 | 0x1D<<7 | 0x1C,\n\t26231 - 19968: jis0212<<14 | 0x21<<7 | 0x26,\n\t26232 - 19968: jis0212<<14 | 0x21<<7 | 0x27,\n\t26233 - 19968: jis0212<<14 | 0x21<<7 | 0x28,\n\t26234 - 19968: jis0208<<14 | 0x22<<7 | 0x31,\n\t26235 - 19968: jis0212<<14 | 0x21<<7 | 0x29,\n\t26236 - 19968: jis0212<<14 | 0x21<<7 | 0x2B,\n\t26238 - 19968: jis0212<<14 | 0x21<<7 | 0x22,\n\t26239 - 19968: jis0212<<14 | 0x21<<7 | 0x25,\n\t26240 - 19968: jis0212<<14 | 0x21<<7 | 0x2A,\n\t26241 - 19968: jis0208<<14 | 0x15<<7 | 0x26,\n\t26243 - 19968: jis0208<<14 | 0x39<<7 | 0x52,\n\t26244 - 19968: jis0208<<14 | 0x39<<7 | 0x56,\n\t26247 - 19968: jis0208<<14 | 0x11<<7 | 0x2A,\n\t26248 - 19968: jis0208<<14 | 0x39<<7 | 0x53,\n\t26249 - 19968: jis0208<<14 | 0x39<<7 | 0x55,\n\t26251 - 19968: jis0212<<14 | 0x21<<7 | 0x2C,\n\t26252 - 19968: jis0212<<14 | 0x21<<7 | 0x2D,\n\t26253 - 19968: jis0212<<14 | 0x21<<7 | 0x2E,\n\t26254 - 19968: jis0208<<14 | 0x39<<7 | 0x54,\n\t26256 - 19968: jis0212<<14 | 0x21<<7 | 0x2F,\n\t26257 - 19968: jis0208<<14 | 0x1C<<7 | 0x4A,\n\t26258 - 19968: jis0212<<14 | 0x21<<7 | 0x30,\n\t26262 - 19968: jis0208<<14 | 0x22<<7 | 0x27,\n\t26263 - 19968: jis0208<<14 | 0x0F<<7 | 0x24,\n\t26264 - 19968: jis0208<<14 | 0x39<<7 | 0x57,\n\t26265 - 19968: jis0208<<14 | 0x59<<7 | 0x1F,\n\t26266 - 19968: jis0212<<14 | 0x21<<7 | 0x32,\n\t26267 - 19968: jis0212<<14 | 0x21<<7 | 0x33,\n\t26268 - 19968: jis0212<<14 | 0x21<<7 | 0x34,\n\t26269 - 19968: jis0208<<14 | 0x39<<7 | 0x58,\n\t26271 - 19968: jis0212<<14 | 0x21<<7 | 0x35,\n\t26272 - 19968: jis0208<<14 | 0x59<<7 | 0x20,\n\t26274 - 19968: jis0208<<14 | 0x23<<7 | 0x09,\n\t26276 - 19968: jis0212<<14 | 0x21<<7 | 0x37,\n\t26278 - 19968: jis0208<<14 | 0x2D<<7 | 0x50,\n\t26283 - 19968: jis0208<<14 | 0x1A<<7 | 0x22,\n\t26285 - 19968: jis0212<<14 | 0x21<<7 | 0x38,\n\t26286 - 19968: jis0208<<14 | 0x29<<7 | 0x4A,\n\t26289 - 19968: jis0212<<14 | 0x21<<7 | 0x39,\n\t26290 - 19968: jis0208<<14 | 0x59<<7 | 0x21,\n\t26292 - 19968: jis0208<<14 | 0x2A<<7 | 0x1C,\n\t26293 - 19968: jis0212<<14 | 0x21<<7 | 0x3B,\n\t26296 - 19968: jis0208<<14 | 0x3A<<7 | 0x01,\n\t26297 - 19968: jis0208<<14 | 0x39<<7 | 0x5A,\n\t26299 - 19968: jis0212<<14 | 0x21<<7 | 0x3C,\n\t26300 - 19968: jis0208<<14 | 0x39<<7 | 0x5D,\n\t26302 - 19968: jis0208<<14 | 0x39<<7 | 0x5C,\n\t26303 - 19968: jis0208<<14 | 0x59<<7 | 0x22,\n\t26304 - 19968: jis0212<<14 | 0x21<<7 | 0x3E,\n\t26305 - 19968: jis0208<<14 | 0x39<<7 | 0x59,\n\t26306 - 19968: jis0212<<14 | 0x21<<7 | 0x3F,\n\t26307 - 19968: jis0212<<14 | 0x21<<7 | 0x40,\n\t26308 - 19968: jis0208<<14 | 0x3A<<7 | 0x00,\n\t26311 - 19968: jis0208<<14 | 0x25<<7 | 0x3D,\n\t26312 - 19968: jis0212<<14 | 0x21<<7 | 0x41,\n\t26313 - 19968: jis0208<<14 | 0x39<<7 | 0x5B,\n\t26316 - 19968: jis0212<<14 | 0x21<<7 | 0x42,\n\t26318 - 19968: jis0212<<14 | 0x21<<7 | 0x43,\n\t26319 - 19968: jis0212<<14 | 0x21<<7 | 0x44,\n\t26324 - 19968: jis0212<<14 | 0x21<<7 | 0x45,\n\t26326 - 19968: jis0208<<14 | 0x3A<<7 | 0x02,\n\t26329 - 19968: jis0208<<14 | 0x1C<<7 | 0x4B,\n\t26330 - 19968: jis0208<<14 | 0x3A<<7 | 0x03,\n\t26331 - 19968: jis0212<<14 | 0x21<<7 | 0x46,\n\t26332 - 19968: jis0208<<14 | 0x2C<<7 | 0x2A,\n\t26333 - 19968: jis0208<<14 | 0x26<<7 | 0x57,\n\t26335 - 19968: jis0212<<14 | 0x21<<7 | 0x47,\n\t26336 - 19968: jis0208<<14 | 0x3A<<7 | 0x04,\n\t26342 - 19968: jis0208<<14 | 0x3A<<7 | 0x06,\n\t26344 - 19968: jis0212<<14 | 0x21<<7 | 0x48,\n\t26345 - 19968: jis0208<<14 | 0x3A<<7 | 0x07,\n\t26347 - 19968: jis0212<<14 | 0x21<<7 | 0x49,\n\t26348 - 19968: jis0212<<14 | 0x21<<7 | 0x4A,\n\t26350 - 19968: jis0212<<14 | 0x21<<7 | 0x4B,\n\t26352 - 19968: jis0208<<14 | 0x3A<<7 | 0x08,\n\t26354 - 19968: jis0208<<14 | 0x15<<7 | 0x29,\n\t26355 - 19968: jis0208<<14 | 0x10<<7 | 0x27,\n\t26356 - 19968: jis0208<<14 | 0x18<<7 | 0x18,\n\t26357 - 19968: jis0208<<14 | 0x3A<<7 | 0x09,\n\t26359 - 19968: jis0208<<14 | 0x3A<<7 | 0x0A,\n\t26360 - 19968: jis0208<<14 | 0x1C<<7 | 0x50,\n\t26361 - 19968: jis0208<<14 | 0x20<<7 | 0x41,\n\t26362 - 19968: jis0208<<14 | 0x59<<7 | 0x23,\n\t26363 - 19968: jis0208<<14 | 0x58<<7 | 0x0A,\n\t26364 - 19968: jis0208<<14 | 0x31<<7 | 0x37,\n\t26365 - 19968: jis0208<<14 | 0x20<<7 | 0x1D,\n\t26366 - 19968: jis0208<<14 | 0x20<<7 | 0x1C,\n\t26367 - 19968: jis0208<<14 | 0x21<<7 | 0x37,\n\t26368 - 19968: jis0208<<14 | 0x19<<7 | 0x26,\n\t26371 - 19968: jis0208<<14 | 0x2F<<7 | 0x51,\n\t26373 - 19968: jis0212<<14 | 0x21<<7 | 0x4D,\n\t26375 - 19968: jis0212<<14 | 0x21<<7 | 0x4E,\n\t26376 - 19968: jis0208<<14 | 0x16<<7 | 0x4D,\n\t26377 - 19968: jis0208<<14 | 0x2C<<7 | 0x0C,\n\t26379 - 19968: jis0208<<14 | 0x29<<7 | 0x5D,\n\t26381 - 19968: jis0208<<14 | 0x28<<7 | 0x5D,\n\t26382 - 19968: jis0208<<14 | 0x59<<7 | 0x24,\n\t26383 - 19968: jis0208<<14 | 0x3A<<7 | 0x0B,\n\t26387 - 19968: jis0212<<14 | 0x21<<7 | 0x50,\n\t26388 - 19968: jis0208<<14 | 0x19<<7 | 0x52,\n\t26389 - 19968: jis0208<<14 | 0x23<<7 | 0x1E,\n\t26390 - 19968: jis0208<<14 | 0x3A<<7 | 0x0C,\n\t26391 - 19968: jis0208<<14 | 0x2E<<7 | 0x0E,\n\t26393 - 19968: jis0212<<14 | 0x21<<7 | 0x51,\n\t26395 - 19968: jis0208<<14 | 0x2A<<7 | 0x1D,\n\t26396 - 19968: jis0212<<14 | 0x21<<7 | 0x52,\n\t26397 - 19968: jis0208<<14 | 0x23<<7 | 0x0A,\n\t26398 - 19968: jis0208<<14 | 0x3A<<7 | 0x0D,\n\t26399 - 19968: jis0208<<14 | 0x13<<7 | 0x5B,\n\t26400 - 19968: jis0212<<14 | 0x21<<7 | 0x53,\n\t26402 - 19968: jis0212<<14 | 0x21<<7 | 0x54,\n\t26406 - 19968: jis0208<<14 | 0x3A<<7 | 0x0E,\n\t26407 - 19968: jis0208<<14 | 0x3A<<7 | 0x0F,\n\t26408 - 19968: jis0208<<14 | 0x2B<<7 | 0x39,\n\t26410 - 19968: jis0208<<14 | 0x2B<<7 | 0x03,\n\t26411 - 19968: jis0208<<14 | 0x2A<<7 | 0x55,\n\t26412 - 19968: jis0208<<14 | 0x2A<<7 | 0x3B,\n\t26413 - 19968: jis0208<<14 | 0x1A<<7 | 0x04,\n\t26414 - 19968: jis0208<<14 | 0x3A<<7 | 0x11,\n\t26417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4A,\n\t26419 - 19968: jis0212<<14 | 0x21<<7 | 0x55,\n\t26420 - 19968: jis0208<<14 | 0x2A<<7 | 0x30,\n\t26422 - 19968: jis0208<<14 | 0x3A<<7 | 0x13,\n\t26423 - 19968: jis0208<<14 | 0x3A<<7 | 0x16,\n\t26424 - 19968: jis0208<<14 | 0x3A<<7 | 0x15,\n\t26426 - 19968: jis0208<<14 | 0x13<<7 | 0x58,\n\t26429 - 19968: jis0208<<14 | 0x14<<7 | 0x3F,\n\t26430 - 19968: jis0212<<14 | 0x21<<7 | 0x56,\n\t26431 - 19968: jis0208<<14 | 0x3A<<7 | 0x12,\n\t26433 - 19968: jis0208<<14 | 0x3A<<7 | 0x14,\n\t26437 - 19968: jis0212<<14 | 0x21<<7 | 0x57,\n\t26438 - 19968: jis0208<<14 | 0x3A<<7 | 0x17,\n\t26439 - 19968: jis0212<<14 | 0x21<<7 | 0x58,\n\t26440 - 19968: jis0212<<14 | 0x21<<7 | 0x59,\n\t26441 - 19968: jis0208<<14 | 0x1E<<7 | 0x58,\n\t26444 - 19968: jis0212<<14 | 0x21<<7 | 0x5A,\n\t26446 - 19968: jis0208<<14 | 0x2C<<7 | 0x5A,\n\t26447 - 19968: jis0208<<14 | 0x0F<<7 | 0x28,\n\t26448 - 19968: jis0208<<14 | 0x19<<7 | 0x3F,\n\t26449 - 19968: jis0208<<14 | 0x21<<7 | 0x1B,\n\t26451 - 19968: jis0208<<14 | 0x1B<<7 | 0x3C,\n\t26452 - 19968: jis0212<<14 | 0x21<<7 | 0x5B,\n\t26453 - 19968: jis0212<<14 | 0x21<<7 | 0x5C,\n\t26454 - 19968: jis0208<<14 | 0x1D<<7 | 0x52,\n\t26457 - 19968: jis0208<<14 | 0x3A<<7 | 0x1A,\n\t26460 - 19968: jis0208<<14 | 0x24<<7 | 0x2D,\n\t26461 - 19968: jis0212<<14 | 0x21<<7 | 0x5D,\n\t26462 - 19968: jis0208<<14 | 0x3A<<7 | 0x18,\n\t26463 - 19968: jis0208<<14 | 0x21<<7 | 0x0A,\n\t26464 - 19968: jis0208<<14 | 0x3A<<7 | 0x19,\n\t26465 - 19968: jis0208<<14 | 0x1D<<7 | 0x51,\n\t26466 - 19968: jis0208<<14 | 0x2B<<7 | 0x3C,\n\t26467 - 19968: jis0208<<14 | 0x3A<<7 | 0x1B,\n\t26468 - 19968: jis0208<<14 | 0x3A<<7 | 0x1C,\n\t26469 - 19968: jis0208<<14 | 0x2C<<7 | 0x47,\n\t26470 - 19968: jis0208<<14 | 0x59<<7 | 0x26,\n\t26474 - 19968: jis0208<<14 | 0x3A<<7 | 0x21,\n\t26476 - 19968: jis0212<<14 | 0x22<<7 | 0x01,\n\t26477 - 19968: jis0208<<14 | 0x18<<7 | 0x19,\n\t26478 - 19968: jis0212<<14 | 0x22<<7 | 0x02,\n\t26479 - 19968: jis0208<<14 | 0x26<<7 | 0x34,\n\t26480 - 19968: jis0208<<14 | 0x3A<<7 | 0x1E,\n\t26481 - 19968: jis0208<<14 | 0x24<<7 | 0x4B,\n\t26482 - 19968: jis0208<<14 | 0x39<<7 | 0x3D,\n\t26483 - 19968: jis0208<<14 | 0x39<<7 | 0x41,\n\t26484 - 19968: jis0212<<14 | 0x22<<7 | 0x03,\n\t26485 - 19968: jis0208<<14 | 0x14<<7 | 0x2E,\n\t26486 - 19968: jis0212<<14 | 0x22<<7 | 0x04,\n\t26487 - 19968: jis0208<<14 | 0x26<<7 | 0x26,\n\t26491 - 19968: jis0212<<14 | 0x22<<7 | 0x05,\n\t26492 - 19968: jis0208<<14 | 0x3A<<7 | 0x20,\n\t26494 - 19968: jis0208<<14 | 0x1D<<7 | 0x1D,\n\t26495 - 19968: jis0208<<14 | 0x27<<7 | 0x23,\n\t26497 - 19968: jis0212<<14 | 0x22<<7 | 0x06,\n\t26500 - 19968: jis0212<<14 | 0x22<<7 | 0x07,\n\t26501 - 19968: jis0208<<14 | 0x3A<<7 | 0x26,\n\t26503 - 19968: jis0208<<14 | 0x27<<7 | 0x59,\n\t26505 - 19968: jis0208<<14 | 0x3A<<7 | 0x1D,\n\t26507 - 19968: jis0208<<14 | 0x3A<<7 | 0x23,\n\t26508 - 19968: jis0208<<14 | 0x3A<<7 | 0x22,\n\t26510 - 19968: jis0212<<14 | 0x22<<7 | 0x08,\n\t26511 - 19968: jis0212<<14 | 0x22<<7 | 0x09,\n\t26512 - 19968: jis0208<<14 | 0x1F<<7 | 0x2E,\n\t26513 - 19968: jis0212<<14 | 0x22<<7 | 0x0A,\n\t26515 - 19968: jis0212<<14 | 0x22<<7 | 0x0B,\n\t26517 - 19968: jis0208<<14 | 0x2A<<7 | 0x4C,\n\t26518 - 19968: jis0212<<14 | 0x22<<7 | 0x0C,\n\t26519 - 19968: jis0208<<14 | 0x2D<<7 | 0x32,\n\t26520 - 19968: jis0212<<14 | 0x22<<7 | 0x0D,\n\t26521 - 19968: jis0212<<14 | 0x22<<7 | 0x0E,\n\t26522 - 19968: jis0208<<14 | 0x2A<<7 | 0x46,\n\t26523 - 19968: jis0212<<14 | 0x22<<7 | 0x0F,\n\t26524 - 19968: jis0208<<14 | 0x11<<7 | 0x2B,\n\t26525 - 19968: jis0208<<14 | 0x1A<<7 | 0x3D,\n\t26528 - 19968: jis0208<<14 | 0x2E<<7 | 0x27,\n\t26529 - 19968: jis0208<<14 | 0x3A<<7 | 0x25,\n\t26530 - 19968: jis0208<<14 | 0x1E<<7 | 0x54,\n\t26534 - 19968: jis0208<<14 | 0x3A<<7 | 0x24,\n\t26537 - 19968: jis0208<<14 | 0x3A<<7 | 0x1F,\n\t26543 - 19968: jis0208<<14 | 0x17<<7 | 0x2E,\n\t26544 - 19968: jis0212<<14 | 0x22<<7 | 0x10,\n\t26545 - 19968: jis0212<<14 | 0x22<<7 | 0x11,\n\t26546 - 19968: jis0212<<14 | 0x22<<7 | 0x12,\n\t26547 - 19968: jis0208<<14 | 0x3A<<7 | 0x2B,\n\t26548 - 19968: jis0208<<14 | 0x3A<<7 | 0x29,\n\t26549 - 19968: jis0212<<14 | 0x22<<7 | 0x13,\n\t26550 - 19968: jis0208<<14 | 0x11<<7 | 0x2C,\n\t26551 - 19968: jis0208<<14 | 0x3A<<7 | 0x27,\n\t26552 - 19968: jis0208<<14 | 0x3A<<7 | 0x2D,\n\t26553 - 19968: jis0208<<14 | 0x3A<<7 | 0x33,\n\t26555 - 19968: jis0208<<14 | 0x59<<7 | 0x27,\n\t26556 - 19968: jis0212<<14 | 0x22<<7 | 0x15,\n\t26557 - 19968: jis0212<<14 | 0x22<<7 | 0x16,\n\t26560 - 19968: jis0208<<14 | 0x59<<7 | 0x29,\n\t26561 - 19968: jis0208<<14 | 0x21<<7 | 0x27,\n\t26562 - 19968: jis0212<<14 | 0x22<<7 | 0x19,\n\t26563 - 19968: jis0212<<14 | 0x22<<7 | 0x1A,\n\t26564 - 19968: jis0208<<14 | 0x29<<7 | 0x20,\n\t26565 - 19968: jis0212<<14 | 0x22<<7 | 0x1B,\n\t26566 - 19968: jis0208<<14 | 0x3A<<7 | 0x35,\n\t26568 - 19968: jis0212<<14 | 0x22<<7 | 0x1C,\n\t26569 - 19968: jis0212<<14 | 0x22<<7 | 0x1D,\n\t26570 - 19968: jis0208<<14 | 0x28<<7 | 0x01,\n\t26574 - 19968: jis0208<<14 | 0x3A<<7 | 0x34,\n\t26575 - 19968: jis0208<<14 | 0x26<<7 | 0x4F,\n\t26576 - 19968: jis0208<<14 | 0x2A<<7 | 0x1E,\n\t26577 - 19968: jis0208<<14 | 0x13<<7 | 0x1A,\n\t26578 - 19968: jis0212<<14 | 0x22<<7 | 0x1E,\n\t26579 - 19968: jis0208<<14 | 0x1F<<7 | 0x56,\n\t26580 - 19968: jis0208<<14 | 0x1C<<7 | 0x1F,\n\t26583 - 19968: jis0212<<14 | 0x22<<7 | 0x1F,\n\t26584 - 19968: jis0208<<14 | 0x23<<7 | 0x32,\n\t26585 - 19968: jis0212<<14 | 0x22<<7 | 0x20,\n\t26586 - 19968: jis0208<<14 | 0x2C<<7 | 0x0D,\n\t26588 - 19968: jis0212<<14 | 0x22<<7 | 0x21,\n\t26589 - 19968: jis0208<<14 | 0x3A<<7 | 0x30,\n\t26590 - 19968: jis0208<<14 | 0x3A<<7 | 0x2F,\n\t26593 - 19968: jis0212<<14 | 0x22<<7 | 0x22,\n\t26594 - 19968: jis0208<<14 | 0x3A<<7 | 0x31,\n\t26596 - 19968: jis0208<<14 | 0x3A<<7 | 0x2E,\n\t26598 - 19968: jis0212<<14 | 0x22<<7 | 0x23,\n\t26599 - 19968: jis0208<<14 | 0x3A<<7 | 0x36,\n\t26601 - 19968: jis0208<<14 | 0x3A<<7 | 0x2C,\n\t26604 - 19968: jis0208<<14 | 0x3A<<7 | 0x2A,\n\t26606 - 19968: jis0208<<14 | 0x3A<<7 | 0x32,\n\t26607 - 19968: jis0208<<14 | 0x3A<<7 | 0x28,\n\t26608 - 19968: jis0212<<14 | 0x22<<7 | 0x24,\n\t26609 - 19968: jis0208<<14 | 0x22<<7 | 0x4B,\n\t26610 - 19968: jis0212<<14 | 0x22<<7 | 0x25,\n\t26611 - 19968: jis0208<<14 | 0x2B<<7 | 0x57,\n\t26612 - 19968: jis0208<<14 | 0x1B<<7 | 0x25,\n\t26613 - 19968: jis0208<<14 | 0x19<<7 | 0x53,\n\t26614 - 19968: jis0212<<14 | 0x22<<7 | 0x26,\n\t26615 - 19968: jis0212<<14 | 0x22<<7 | 0x27,\n\t26617 - 19968: jis0212<<14 | 0x22<<7 | 0x17,\n\t26619 - 19968: jis0208<<14 | 0x19<<7 | 0x19,\n\t26622 - 19968: jis0208<<14 | 0x2A<<7 | 0x4E,\n\t26623 - 19968: jis0208<<14 | 0x12<<7 | 0x20,\n\t26625 - 19968: jis0208<<14 | 0x59<<7 | 0x2A,\n\t26626 - 19968: jis0208<<14 | 0x23<<7 | 0x2D,\n\t26627 - 19968: jis0208<<14 | 0x25<<7 | 0x29,\n\t26628 - 19968: jis0208<<14 | 0x10<<7 | 0x28,\n\t26643 - 19968: jis0208<<14 | 0x1F<<7 | 0x51,\n\t26644 - 19968: jis0212<<14 | 0x22<<7 | 0x29,\n\t26646 - 19968: jis0208<<14 | 0x1F<<7 | 0x13,\n\t26647 - 19968: jis0208<<14 | 0x16<<7 | 0x09,\n\t26649 - 19968: jis0212<<14 | 0x22<<7 | 0x2A,\n\t26653 - 19968: jis0212<<14 | 0x22<<7 | 0x2B,\n\t26654 - 19968: jis0208<<14 | 0x3A<<7 | 0x38,\n\t26655 - 19968: jis0212<<14 | 0x22<<7 | 0x2C,\n\t26657 - 19968: jis0208<<14 | 0x18<<7 | 0x1A,\n\t26658 - 19968: jis0208<<14 | 0x12<<7 | 0x5B,\n\t26663 - 19968: jis0212<<14 | 0x22<<7 | 0x2E,\n\t26664 - 19968: jis0212<<14 | 0x22<<7 | 0x2D,\n\t26665 - 19968: jis0208<<14 | 0x3A<<7 | 0x3A,\n\t26666 - 19968: jis0208<<14 | 0x12<<7 | 0x53,\n\t26667 - 19968: jis0208<<14 | 0x3A<<7 | 0x40,\n\t26668 - 19968: jis0212<<14 | 0x22<<7 | 0x2F,\n\t26669 - 19968: jis0212<<14 | 0x22<<7 | 0x30,\n\t26671 - 19968: jis0212<<14 | 0x22<<7 | 0x31,\n\t26672 - 19968: jis0212<<14 | 0x22<<7 | 0x32,\n\t26673 - 19968: jis0212<<14 | 0x22<<7 | 0x33,\n\t26674 - 19968: jis0208<<14 | 0x3A<<7 | 0x3D,\n\t26675 - 19968: jis0212<<14 | 0x22<<7 | 0x34,\n\t26676 - 19968: jis0208<<14 | 0x1F<<7 | 0x52,\n\t26680 - 19968: jis0208<<14 | 0x12<<7 | 0x2A,\n\t26681 - 19968: jis0208<<14 | 0x19<<7 | 0x0B,\n\t26683 - 19968: jis0212<<14 | 0x22<<7 | 0x35,\n\t26684 - 19968: jis0208<<14 | 0x12<<7 | 0x29,\n\t26685 - 19968: jis0208<<14 | 0x19<<7 | 0x2E,\n\t26687 - 19968: jis0212<<14 | 0x22<<7 | 0x36,\n\t26688 - 19968: jis0208<<14 | 0x3A<<7 | 0x3B,\n\t26689 - 19968: jis0208<<14 | 0x16<<7 | 0x44,\n\t26690 - 19968: jis0208<<14 | 0x16<<7 | 0x2A,\n\t26691 - 19968: jis0208<<14 | 0x24<<7 | 0x4C,\n\t26692 - 19968: jis0208<<14 | 0x59<<7 | 0x2B,\n\t26693 - 19968: jis0212<<14 | 0x22<<7 | 0x38,\n\t26694 - 19968: jis0208<<14 | 0x3A<<7 | 0x39,\n\t26696 - 19968: jis0208<<14 | 0x0F<<7 | 0x25,\n\t26698 - 19968: jis0212<<14 | 0x22<<7 | 0x39,\n\t26700 - 19968: jis0212<<14 | 0x22<<7 | 0x3A,\n\t26701 - 19968: jis0208<<14 | 0x3A<<7 | 0x3C,\n\t26702 - 19968: jis0208<<14 | 0x3A<<7 | 0x3E,\n\t26704 - 19968: jis0208<<14 | 0x15<<7 | 0x2C,\n\t26705 - 19968: jis0208<<14 | 0x16<<7 | 0x0B,\n\t26706 - 19968: jis0208<<14 | 0x59<<7 | 0x28,\n\t26707 - 19968: jis0208<<14 | 0x13<<7 | 0x1B,\n\t26708 - 19968: jis0208<<14 | 0x14<<7 | 0x2A,\n\t26709 - 19968: jis0212<<14 | 0x22<<7 | 0x3B,\n\t26711 - 19968: jis0212<<14 | 0x22<<7 | 0x3C,\n\t26712 - 19968: jis0212<<14 | 0x22<<7 | 0x3D,\n\t26713 - 19968: jis0208<<14 | 0x3A<<7 | 0x41,\n\t26715 - 19968: jis0212<<14 | 0x22<<7 | 0x3E,\n\t26716 - 19968: jis0208<<14 | 0x19<<7 | 0x58,\n\t26717 - 19968: jis0208<<14 | 0x2A<<7 | 0x50,\n\t26719 - 19968: jis0208<<14 | 0x1A<<7 | 0x16,\n\t26723 - 19968: jis0208<<14 | 0x3A<<7 | 0x42,\n\t26727 - 19968: jis0208<<14 | 0x28<<7 | 0x0F,\n\t26731 - 19968: jis0212<<14 | 0x22<<7 | 0x3F,\n\t26734 - 19968: jis0212<<14 | 0x22<<7 | 0x40,\n\t26735 - 19968: jis0212<<14 | 0x22<<7 | 0x41,\n\t26736 - 19968: jis0212<<14 | 0x22<<7 | 0x42,\n\t26737 - 19968: jis0212<<14 | 0x22<<7 | 0x43,\n\t26738 - 19968: jis0212<<14 | 0x22<<7 | 0x44,\n\t26740 - 19968: jis0208<<14 | 0x3A<<7 | 0x4E,\n\t26741 - 19968: jis0212<<14 | 0x22<<7 | 0x45,\n\t26742 - 19968: jis0208<<14 | 0x11<<7 | 0x12,\n\t26743 - 19968: jis0208<<14 | 0x3A<<7 | 0x43,\n\t26745 - 19968: jis0212<<14 | 0x22<<7 | 0x46,\n\t26746 - 19968: jis0212<<14 | 0x22<<7 | 0x47,\n\t26747 - 19968: jis0212<<14 | 0x22<<7 | 0x48,\n\t26748 - 19968: jis0212<<14 | 0x22<<7 | 0x49,\n\t26750 - 19968: jis0208<<14 | 0x3A<<7 | 0x54,\n\t26751 - 19968: jis0208<<14 | 0x3A<<7 | 0x44,\n\t26753 - 19968: jis0208<<14 | 0x2D<<7 | 0x21,\n\t26754 - 19968: jis0212<<14 | 0x22<<7 | 0x4A,\n\t26755 - 19968: jis0208<<14 | 0x3A<<7 | 0x4B,\n\t26756 - 19968: jis0212<<14 | 0x22<<7 | 0x4B,\n\t26757 - 19968: jis0208<<14 | 0x26<<7 | 0x3E,\n\t26758 - 19968: jis0212<<14 | 0x22<<7 | 0x4C,\n\t26760 - 19968: jis0212<<14 | 0x22<<7 | 0x4D,\n\t26765 - 19968: jis0208<<14 | 0x3A<<7 | 0x53,\n\t26767 - 19968: jis0208<<14 | 0x3A<<7 | 0x46,\n\t26771 - 19968: jis0208<<14 | 0x0F<<7 | 0x13,\n\t26772 - 19968: jis0208<<14 | 0x3A<<7 | 0x48,\n\t26774 - 19968: jis0212<<14 | 0x22<<7 | 0x4E,\n\t26775 - 19968: jis0208<<14 | 0x18<<7 | 0x1B,\n\t26776 - 19968: jis0212<<14 | 0x22<<7 | 0x4F,\n\t26778 - 19968: jis0212<<14 | 0x22<<7 | 0x50,\n\t26779 - 19968: jis0208<<14 | 0x3A<<7 | 0x4A,\n\t26780 - 19968: jis0212<<14 | 0x22<<7 | 0x51,\n\t26781 - 19968: jis0208<<14 | 0x3A<<7 | 0x49,\n\t26783 - 19968: jis0208<<14 | 0x3A<<7 | 0x45,\n\t26784 - 19968: jis0208<<14 | 0x3A<<7 | 0x50,\n\t26785 - 19968: jis0212<<14 | 0x22<<7 | 0x52,\n\t26786 - 19968: jis0208<<14 | 0x1D<<7 | 0x1E,\n\t26787 - 19968: jis0212<<14 | 0x22<<7 | 0x53,\n\t26789 - 19968: jis0212<<14 | 0x22<<7 | 0x54,\n\t26790 - 19968: jis0208<<14 | 0x33<<7 | 0x4C,\n\t26791 - 19968: jis0208<<14 | 0x17<<7 | 0x47,\n\t26792 - 19968: jis0208<<14 | 0x2C<<7 | 0x5B,\n\t26793 - 19968: jis0212<<14 | 0x22<<7 | 0x55,\n\t26794 - 19968: jis0212<<14 | 0x22<<7 | 0x56,\n\t26797 - 19968: jis0208<<14 | 0x3A<<7 | 0x47,\n\t26798 - 19968: jis0212<<14 | 0x22<<7 | 0x57,\n\t26799 - 19968: jis0208<<14 | 0x23<<7 | 0x53,\n\t26800 - 19968: jis0208<<14 | 0x12<<7 | 0x02,\n\t26801 - 19968: jis0208<<14 | 0x19<<7 | 0x0C,\n\t26802 - 19968: jis0212<<14 | 0x22<<7 | 0x58,\n\t26803 - 19968: jis0208<<14 | 0x3A<<7 | 0x3F,\n\t26805 - 19968: jis0208<<14 | 0x3A<<7 | 0x4F,\n\t26806 - 19968: jis0208<<14 | 0x12<<7 | 0x40,\n\t26809 - 19968: jis0208<<14 | 0x3A<<7 | 0x4D,\n\t26810 - 19968: jis0208<<14 | 0x3A<<7 | 0x51,\n\t26811 - 19968: jis0212<<14 | 0x22<<7 | 0x59,\n\t26812 - 19968: jis0208<<14 | 0x24<<7 | 0x4D,\n\t26820 - 19968: jis0208<<14 | 0x13<<7 | 0x5D,\n\t26821 - 19968: jis0212<<14 | 0x22<<7 | 0x5A,\n\t26822 - 19968: jis0208<<14 | 0x3B<<7 | 0x11,\n\t26824 - 19968: jis0208<<14 | 0x58<<7 | 0x08,\n\t26825 - 19968: jis0208<<14 | 0x2B<<7 | 0x28,\n\t26826 - 19968: jis0208<<14 | 0x3A<<7 | 0x56,\n\t26827 - 19968: jis0208<<14 | 0x13<<7 | 0x5C,\n\t26828 - 19968: jis0212<<14 | 0x22<<7 | 0x5C,\n\t26829 - 19968: jis0208<<14 | 0x3A<<7 | 0x5D,\n\t26831 - 19968: jis0208<<14 | 0x59<<7 | 0x2C,\n\t26832 - 19968: jis0212<<14 | 0x23<<7 | 0x00,\n\t26833 - 19968: jis0212<<14 | 0x23<<7 | 0x01,\n\t26834 - 19968: jis0208<<14 | 0x2A<<7 | 0x1F,\n\t26835 - 19968: jis0212<<14 | 0x23<<7 | 0x02,\n\t26836 - 19968: jis0208<<14 | 0x3B<<7 | 0x00,\n\t26837 - 19968: jis0208<<14 | 0x3B<<7 | 0x02,\n\t26838 - 19968: jis0212<<14 | 0x23<<7 | 0x03,\n\t26839 - 19968: jis0208<<14 | 0x3B<<7 | 0x06,\n\t26840 - 19968: jis0208<<14 | 0x3A<<7 | 0x58,\n\t26841 - 19968: jis0212<<14 | 0x23<<7 | 0x04,\n\t26842 - 19968: jis0208<<14 | 0x22<<7 | 0x09,\n\t26844 - 19968: jis0212<<14 | 0x23<<7 | 0x05,\n\t26845 - 19968: jis0212<<14 | 0x23<<7 | 0x06,\n\t26847 - 19968: jis0208<<14 | 0x24<<7 | 0x4E,\n\t26848 - 19968: jis0208<<14 | 0x3B<<7 | 0x0A,\n\t26849 - 19968: jis0208<<14 | 0x3A<<7 | 0x5B,\n\t26851 - 19968: jis0208<<14 | 0x3B<<7 | 0x07,\n\t26853 - 19968: jis0212<<14 | 0x23<<7 | 0x07,\n\t26855 - 19968: jis0208<<14 | 0x3B<<7 | 0x01,\n\t26856 - 19968: jis0212<<14 | 0x23<<7 | 0x08,\n\t26858 - 19968: jis0212<<14 | 0x23<<7 | 0x09,\n\t26859 - 19968: jis0212<<14 | 0x23<<7 | 0x0A,\n\t26860 - 19968: jis0212<<14 | 0x23<<7 | 0x0B,\n\t26861 - 19968: jis0212<<14 | 0x23<<7 | 0x0C,\n\t26862 - 19968: jis0208<<14 | 0x1E<<7 | 0x18,\n\t26863 - 19968: jis0208<<14 | 0x3B<<7 | 0x0B,\n\t26864 - 19968: jis0212<<14 | 0x23<<7 | 0x0D,\n\t26865 - 19968: jis0212<<14 | 0x23<<7 | 0x0E,\n\t26866 - 19968: jis0208<<14 | 0x1F<<7 | 0x12,\n\t26869 - 19968: jis0212<<14 | 0x23<<7 | 0x0F,\n\t26870 - 19968: jis0212<<14 | 0x23<<7 | 0x10,\n\t26873 - 19968: jis0208<<14 | 0x3B<<7 | 0x09,\n\t26874 - 19968: jis0208<<14 | 0x13<<7 | 0x1C,\n\t26875 - 19968: jis0212<<14 | 0x23<<7 | 0x11,\n\t26876 - 19968: jis0212<<14 | 0x23<<7 | 0x12,\n\t26877 - 19968: jis0212<<14 | 0x23<<7 | 0x13,\n\t26880 - 19968: jis0208<<14 | 0x2E<<7 | 0x2F,\n\t26881 - 19968: jis0208<<14 | 0x3A<<7 | 0x55,\n\t26884 - 19968: jis0208<<14 | 0x3B<<7 | 0x05,\n\t26885 - 19968: jis0208<<14 | 0x0F<<7 | 0x37,\n\t26886 - 19968: jis0212<<14 | 0x23<<7 | 0x14,\n\t26888 - 19968: jis0208<<14 | 0x3A<<7 | 0x57,\n\t26889 - 19968: jis0212<<14 | 0x23<<7 | 0x15,\n\t26890 - 19968: jis0212<<14 | 0x23<<7 | 0x16,\n\t26891 - 19968: jis0208<<14 | 0x2B<<7 | 0x19,\n\t26892 - 19968: jis0208<<14 | 0x3A<<7 | 0x5C,\n\t26893 - 19968: jis0208<<14 | 0x1E<<7 | 0x01,\n\t26894 - 19968: jis0208<<14 | 0x23<<7 | 0x26,\n\t26895 - 19968: jis0208<<14 | 0x3A<<7 | 0x52,\n\t26896 - 19968: jis0212<<14 | 0x23<<7 | 0x17,\n\t26897 - 19968: jis0212<<14 | 0x23<<7 | 0x18,\n\t26898 - 19968: jis0208<<14 | 0x3B<<7 | 0x04,\n\t26899 - 19968: jis0212<<14 | 0x23<<7 | 0x19,\n\t26902 - 19968: jis0212<<14 | 0x23<<7 | 0x1A,\n\t26903 - 19968: jis0212<<14 | 0x23<<7 | 0x1B,\n\t26905 - 19968: jis0208<<14 | 0x1E<<7 | 0x59,\n\t26906 - 19968: jis0208<<14 | 0x3B<<7 | 0x0E,\n\t26907 - 19968: jis0208<<14 | 0x12<<7 | 0x50,\n\t26908 - 19968: jis0208<<14 | 0x17<<7 | 0x00,\n\t26913 - 19968: jis0208<<14 | 0x3B<<7 | 0x10,\n\t26914 - 19968: jis0208<<14 | 0x3A<<7 | 0x59,\n\t26915 - 19968: jis0208<<14 | 0x3B<<7 | 0x0F,\n\t26917 - 19968: jis0208<<14 | 0x3B<<7 | 0x08,\n\t26918 - 19968: jis0208<<14 | 0x3A<<7 | 0x5A,\n\t26920 - 19968: jis0208<<14 | 0x3B<<7 | 0x0C,\n\t26922 - 19968: jis0208<<14 | 0x3B<<7 | 0x0D,\n\t26928 - 19968: jis0208<<14 | 0x3B<<7 | 0x1E,\n\t26929 - 19968: jis0212<<14 | 0x23<<7 | 0x1C,\n\t26931 - 19968: jis0212<<14 | 0x23<<7 | 0x1D,\n\t26932 - 19968: jis0208<<14 | 0x25<<7 | 0x2D,\n\t26933 - 19968: jis0212<<14 | 0x23<<7 | 0x1E,\n\t26934 - 19968: jis0208<<14 | 0x3B<<7 | 0x03,\n\t26936 - 19968: jis0212<<14 | 0x23<<7 | 0x1F,\n\t26937 - 19968: jis0208<<14 | 0x3B<<7 | 0x1A,\n\t26939 - 19968: jis0212<<14 | 0x23<<7 | 0x20,\n\t26941 - 19968: jis0208<<14 | 0x3B<<7 | 0x1C,\n\t26943 - 19968: jis0208<<14 | 0x23<<7 | 0x37,\n\t26946 - 19968: jis0212<<14 | 0x23<<7 | 0x21,\n\t26949 - 19968: jis0212<<14 | 0x23<<7 | 0x22,\n\t26953 - 19968: jis0212<<14 | 0x23<<7 | 0x23,\n\t26954 - 19968: jis0208<<14 | 0x2C<<7 | 0x2B,\n\t26958 - 19968: jis0212<<14 | 0x23<<7 | 0x24,\n\t26963 - 19968: jis0208<<14 | 0x28<<7 | 0x55,\n\t26964 - 19968: jis0208<<14 | 0x3B<<7 | 0x17,\n\t26965 - 19968: jis0208<<14 | 0x21<<7 | 0x29,\n\t26967 - 19968: jis0212<<14 | 0x23<<7 | 0x25,\n\t26969 - 19968: jis0208<<14 | 0x3B<<7 | 0x1D,\n\t26970 - 19968: jis0208<<14 | 0x20<<7 | 0x1E,\n\t26971 - 19968: jis0212<<14 | 0x23<<7 | 0x26,\n\t26972 - 19968: jis0208<<14 | 0x3B<<7 | 0x14,\n\t26973 - 19968: jis0208<<14 | 0x3B<<7 | 0x21,\n\t26974 - 19968: jis0208<<14 | 0x3B<<7 | 0x20,\n\t26976 - 19968: jis0208<<14 | 0x25<<7 | 0x4E,\n\t26977 - 19968: jis0208<<14 | 0x3B<<7 | 0x1F,\n\t26978 - 19968: jis0208<<14 | 0x25<<7 | 0x49,\n\t26979 - 19968: jis0212<<14 | 0x23<<7 | 0x27,\n\t26980 - 19968: jis0212<<14 | 0x23<<7 | 0x28,\n\t26981 - 19968: jis0212<<14 | 0x23<<7 | 0x29,\n\t26982 - 19968: jis0212<<14 | 0x23<<7 | 0x2A,\n\t26984 - 19968: jis0208<<14 | 0x59<<7 | 0x2E,\n\t26985 - 19968: jis0212<<14 | 0x23<<7 | 0x2C,\n\t26986 - 19968: jis0208<<14 | 0x3B<<7 | 0x23,\n\t26987 - 19968: jis0208<<14 | 0x3B<<7 | 0x16,\n\t26988 - 19968: jis0212<<14 | 0x23<<7 | 0x2D,\n\t26989 - 19968: jis0208<<14 | 0x15<<7 | 0x27,\n\t26990 - 19968: jis0208<<14 | 0x3B<<7 | 0x19,\n\t26991 - 19968: jis0208<<14 | 0x1C<<7 | 0x3C,\n\t26992 - 19968: jis0212<<14 | 0x23<<7 | 0x2E,\n\t26993 - 19968: jis0212<<14 | 0x23<<7 | 0x2F,\n\t26994 - 19968: jis0212<<14 | 0x23<<7 | 0x30,\n\t26995 - 19968: jis0208<<14 | 0x26<<7 | 0x3F,\n\t26996 - 19968: jis0208<<14 | 0x3B<<7 | 0x1B,\n\t26997 - 19968: jis0208<<14 | 0x15<<7 | 0x2A,\n\t26999 - 19968: jis0208<<14 | 0x3B<<7 | 0x13,\n\t27000 - 19968: jis0208<<14 | 0x3B<<7 | 0x15,\n\t27001 - 19968: jis0208<<14 | 0x3B<<7 | 0x12,\n\t27002 - 19968: jis0212<<14 | 0x23<<7 | 0x31,\n\t27003 - 19968: jis0212<<14 | 0x23<<7 | 0x32,\n\t27004 - 19968: jis0208<<14 | 0x2E<<7 | 0x0F,\n\t27005 - 19968: jis0208<<14 | 0x12<<7 | 0x39,\n\t27006 - 19968: jis0208<<14 | 0x3B<<7 | 0x18,\n\t27007 - 19968: jis0212<<14 | 0x23<<7 | 0x33,\n\t27008 - 19968: jis0212<<14 | 0x23<<7 | 0x34,\n\t27009 - 19968: jis0208<<14 | 0x3B<<7 | 0x22,\n\t27010 - 19968: jis0208<<14 | 0x12<<7 | 0x14,\n\t27018 - 19968: jis0208<<14 | 0x19<<7 | 0x46,\n\t27021 - 19968: jis0212<<14 | 0x23<<7 | 0x35,\n\t27022 - 19968: jis0208<<14 | 0x10<<7 | 0x3C,\n\t27025 - 19968: jis0208<<14 | 0x3B<<7 | 0x33,\n\t27026 - 19968: jis0212<<14 | 0x23<<7 | 0x36,\n\t27028 - 19968: jis0208<<14 | 0x2E<<7 | 0x10,\n\t27029 - 19968: jis0208<<14 | 0x3B<<7 | 0x36,\n\t27030 - 19968: jis0212<<14 | 0x23<<7 | 0x37,\n\t27032 - 19968: jis0208<<14 | 0x59<<7 | 0x30,\n\t27035 - 19968: jis0208<<14 | 0x1E<<7 | 0x19,\n\t27036 - 19968: jis0208<<14 | 0x3B<<7 | 0x35,\n\t27040 - 19968: jis0208<<14 | 0x3B<<7 | 0x34,\n\t27041 - 19968: jis0212<<14 | 0x23<<7 | 0x39,\n\t27045 - 19968: jis0212<<14 | 0x23<<7 | 0x3A,\n\t27046 - 19968: jis0212<<14 | 0x23<<7 | 0x3B,\n\t27047 - 19968: jis0208<<14 | 0x3B<<7 | 0x31,\n\t27048 - 19968: jis0212<<14 | 0x23<<7 | 0x3C,\n\t27051 - 19968: jis0212<<14 | 0x23<<7 | 0x3D,\n\t27053 - 19968: jis0212<<14 | 0x23<<7 | 0x3E,\n\t27054 - 19968: jis0208<<14 | 0x3B<<7 | 0x25,\n\t27055 - 19968: jis0212<<14 | 0x23<<7 | 0x3F,\n\t27057 - 19968: jis0208<<14 | 0x3B<<7 | 0x42,\n\t27058 - 19968: jis0208<<14 | 0x3B<<7 | 0x24,\n\t27060 - 19968: jis0208<<14 | 0x3B<<7 | 0x37,\n\t27063 - 19968: jis0212<<14 | 0x23<<7 | 0x40,\n\t27064 - 19968: jis0212<<14 | 0x23<<7 | 0x41,\n\t27066 - 19968: jis0212<<14 | 0x23<<7 | 0x42,\n\t27067 - 19968: jis0208<<14 | 0x3B<<7 | 0x2F,\n\t27068 - 19968: jis0212<<14 | 0x23<<7 | 0x43,\n\t27070 - 19968: jis0208<<14 | 0x3B<<7 | 0x2A,\n\t27071 - 19968: jis0208<<14 | 0x3B<<7 | 0x27,\n\t27073 - 19968: jis0208<<14 | 0x3B<<7 | 0x28,\n\t27075 - 19968: jis0208<<14 | 0x3B<<7 | 0x30,\n\t27077 - 19968: jis0212<<14 | 0x23<<7 | 0x44,\n\t27079 - 19968: jis0208<<14 | 0x53<<7 | 0x01,\n\t27080 - 19968: jis0212<<14 | 0x23<<7 | 0x45,\n\t27082 - 19968: jis0208<<14 | 0x3B<<7 | 0x2D,\n\t27083 - 19968: jis0208<<14 | 0x18<<7 | 0x1C,\n\t27084 - 19968: jis0208<<14 | 0x23<<7 | 0x27,\n\t27085 - 19968: jis0208<<14 | 0x20<<7 | 0x43,\n\t27086 - 19968: jis0208<<14 | 0x3B<<7 | 0x2B,\n\t27088 - 19968: jis0208<<14 | 0x3B<<7 | 0x26,\n\t27089 - 19968: jis0212<<14 | 0x23<<7 | 0x46,\n\t27091 - 19968: jis0208<<14 | 0x3B<<7 | 0x29,\n\t27094 - 19968: jis0212<<14 | 0x23<<7 | 0x47,\n\t27095 - 19968: jis0212<<14 | 0x23<<7 | 0x48,\n\t27096 - 19968: jis0208<<14 | 0x2C<<7 | 0x2C,\n\t27097 - 19968: jis0208<<14 | 0x2A<<7 | 0x49,\n\t27101 - 19968: jis0208<<14 | 0x3B<<7 | 0x2E,\n\t27102 - 19968: jis0208<<14 | 0x3B<<7 | 0x38,\n\t27106 - 19968: jis0208<<14 | 0x59<<7 | 0x31,\n\t27109 - 19968: jis0212<<14 | 0x23<<7 | 0x4A,\n\t27111 - 19968: jis0208<<14 | 0x3B<<7 | 0x40,\n\t27112 - 19968: jis0208<<14 | 0x3B<<7 | 0x39,\n\t27115 - 19968: jis0208<<14 | 0x3B<<7 | 0x46,\n\t27117 - 19968: jis0208<<14 | 0x3B<<7 | 0x44,\n\t27118 - 19968: jis0212<<14 | 0x23<<7 | 0x4B,\n\t27119 - 19968: jis0212<<14 | 0x23<<7 | 0x4C,\n\t27121 - 19968: jis0212<<14 | 0x23<<7 | 0x4D,\n\t27122 - 19968: jis0208<<14 | 0x3B<<7 | 0x3F,\n\t27123 - 19968: jis0212<<14 | 0x23<<7 | 0x4E,\n\t27125 - 19968: jis0212<<14 | 0x23<<7 | 0x4F,\n\t27129 - 19968: jis0208<<14 | 0x3B<<7 | 0x3E,\n\t27131 - 19968: jis0208<<14 | 0x23<<7 | 0x2F,\n\t27133 - 19968: jis0208<<14 | 0x20<<7 | 0x44,\n\t27134 - 19968: jis0212<<14 | 0x23<<7 | 0x50,\n\t27135 - 19968: jis0208<<14 | 0x3B<<7 | 0x3C,\n\t27136 - 19968: jis0212<<14 | 0x23<<7 | 0x51,\n\t27137 - 19968: jis0212<<14 | 0x23<<7 | 0x52,\n\t27138 - 19968: jis0208<<14 | 0x3B<<7 | 0x3A,\n\t27139 - 19968: jis0212<<14 | 0x23<<7 | 0x53,\n\t27141 - 19968: jis0208<<14 | 0x3B<<7 | 0x41,\n\t27146 - 19968: jis0208<<14 | 0x3B<<7 | 0x47,\n\t27147 - 19968: jis0208<<14 | 0x27<<7 | 0x54,\n\t27148 - 19968: jis0208<<14 | 0x3B<<7 | 0x4D,\n\t27151 - 19968: jis0212<<14 | 0x23<<7 | 0x54,\n\t27153 - 19968: jis0212<<14 | 0x23<<7 | 0x55,\n\t27154 - 19968: jis0208<<14 | 0x3B<<7 | 0x48,\n\t27155 - 19968: jis0208<<14 | 0x3B<<7 | 0x4B,\n\t27156 - 19968: jis0208<<14 | 0x3B<<7 | 0x45,\n\t27157 - 19968: jis0212<<14 | 0x23<<7 | 0x56,\n\t27159 - 19968: jis0208<<14 | 0x22<<7 | 0x53,\n\t27161 - 19968: jis0208<<14 | 0x28<<7 | 0x17,\n\t27162 - 19968: jis0212<<14 | 0x23<<7 | 0x57,\n\t27163 - 19968: jis0208<<14 | 0x3B<<7 | 0x3B,\n\t27165 - 19968: jis0212<<14 | 0x23<<7 | 0x58,\n\t27166 - 19968: jis0208<<14 | 0x3B<<7 | 0x43,\n\t27167 - 19968: jis0208<<14 | 0x1D<<7 | 0x1F,\n\t27168 - 19968: jis0212<<14 | 0x23<<7 | 0x59,\n\t27169 - 19968: jis0208<<14 | 0x2B<<7 | 0x2E,\n\t27170 - 19968: jis0208<<14 | 0x3B<<7 | 0x57,\n\t27171 - 19968: jis0208<<14 | 0x3B<<7 | 0x4A,\n\t27172 - 19968: jis0212<<14 | 0x23<<7 | 0x5A,\n\t27176 - 19968: jis0212<<14 | 0x23<<7 | 0x5B,\n\t27177 - 19968: jis0208<<14 | 0x17<<7 | 0x01,\n\t27178 - 19968: jis0208<<14 | 0x11<<7 | 0x02,\n\t27179 - 19968: jis0208<<14 | 0x12<<7 | 0x3E,\n\t27182 - 19968: jis0208<<14 | 0x3B<<7 | 0x32,\n\t27184 - 19968: jis0208<<14 | 0x59<<7 | 0x32,\n\t27186 - 19968: jis0212<<14 | 0x23<<7 | 0x5D,\n\t27188 - 19968: jis0212<<14 | 0x24<<7 | 0x00,\n\t27189 - 19968: jis0208<<14 | 0x1D<<7 | 0x20,\n\t27190 - 19968: jis0208<<14 | 0x3B<<7 | 0x4F,\n\t27191 - 19968: jis0212<<14 | 0x24<<7 | 0x01,\n\t27192 - 19968: jis0208<<14 | 0x3B<<7 | 0x56,\n\t27193 - 19968: jis0208<<14 | 0x1B<<7 | 0x58,\n\t27194 - 19968: jis0208<<14 | 0x12<<7 | 0x51,\n\t27195 - 19968: jis0212<<14 | 0x24<<7 | 0x02,\n\t27197 - 19968: jis0208<<14 | 0x22<<7 | 0x0D,\n\t27198 - 19968: jis0212<<14 | 0x24<<7 | 0x03,\n\t27199 - 19968: jis0212<<14 | 0x24<<7 | 0x04,\n\t27204 - 19968: jis0208<<14 | 0x3B<<7 | 0x4C,\n\t27205 - 19968: jis0212<<14 | 0x24<<7 | 0x05,\n\t27206 - 19968: jis0208<<14 | 0x59<<7 | 0x34,\n\t27207 - 19968: jis0208<<14 | 0x3B<<7 | 0x51,\n\t27208 - 19968: jis0208<<14 | 0x3B<<7 | 0x55,\n\t27209 - 19968: jis0212<<14 | 0x24<<7 | 0x07,\n\t27210 - 19968: jis0212<<14 | 0x24<<7 | 0x08,\n\t27211 - 19968: jis0208<<14 | 0x15<<7 | 0x15,\n\t27214 - 19968: jis0212<<14 | 0x24<<7 | 0x09,\n\t27216 - 19968: jis0212<<14 | 0x24<<7 | 0x0A,\n\t27217 - 19968: jis0212<<14 | 0x24<<7 | 0x0B,\n\t27218 - 19968: jis0212<<14 | 0x24<<7 | 0x0C,\n\t27221 - 19968: jis0212<<14 | 0x24<<7 | 0x0D,\n\t27222 - 19968: jis0212<<14 | 0x24<<7 | 0x0E,\n\t27224 - 19968: jis0208<<14 | 0x14<<7 | 0x2B,\n\t27225 - 19968: jis0208<<14 | 0x3B<<7 | 0x53,\n\t27227 - 19968: jis0212<<14 | 0x24<<7 | 0x0F,\n\t27231 - 19968: jis0208<<14 | 0x14<<7 | 0x00,\n\t27233 - 19968: jis0208<<14 | 0x25<<7 | 0x2A,\n\t27234 - 19968: jis0208<<14 | 0x3B<<7 | 0x52,\n\t27236 - 19968: jis0212<<14 | 0x24<<7 | 0x10,\n\t27238 - 19968: jis0208<<14 | 0x3B<<7 | 0x54,\n\t27239 - 19968: jis0212<<14 | 0x24<<7 | 0x11,\n\t27242 - 19968: jis0212<<14 | 0x24<<7 | 0x12,\n\t27243 - 19968: jis0208<<14 | 0x59<<7 | 0x33,\n\t27249 - 19968: jis0212<<14 | 0x24<<7 | 0x13,\n\t27250 - 19968: jis0208<<14 | 0x3B<<7 | 0x4E,\n\t27251 - 19968: jis0208<<14 | 0x59<<7 | 0x35,\n\t27256 - 19968: jis0208<<14 | 0x3B<<7 | 0x50,\n\t27262 - 19968: jis0208<<14 | 0x59<<7 | 0x36,\n\t27263 - 19968: jis0208<<14 | 0x12<<7 | 0x3F,\n\t27264 - 19968: jis0208<<14 | 0x22<<7 | 0x28,\n\t27265 - 19968: jis0212<<14 | 0x24<<7 | 0x16,\n\t27267 - 19968: jis0212<<14 | 0x24<<7 | 0x17,\n\t27268 - 19968: jis0208<<14 | 0x3B<<7 | 0x5B,\n\t27270 - 19968: jis0212<<14 | 0x24<<7 | 0x18,\n\t27271 - 19968: jis0212<<14 | 0x24<<7 | 0x19,\n\t27273 - 19968: jis0212<<14 | 0x24<<7 | 0x1A,\n\t27275 - 19968: jis0212<<14 | 0x24<<7 | 0x1B,\n\t27277 - 19968: jis0208<<14 | 0x3B<<7 | 0x59,\n\t27278 - 19968: jis0208<<14 | 0x17<<7 | 0x48,\n\t27280 - 19968: jis0208<<14 | 0x3B<<7 | 0x58,\n\t27281 - 19968: jis0212<<14 | 0x24<<7 | 0x1C,\n\t27287 - 19968: jis0208<<14 | 0x3C<<7 | 0x00,\n\t27291 - 19968: jis0212<<14 | 0x24<<7 | 0x1D,\n\t27292 - 19968: jis0208<<14 | 0x3A<<7 | 0x37,\n\t27293 - 19968: jis0212<<14 | 0x24<<7 | 0x1E,\n\t27294 - 19968: jis0212<<14 | 0x24<<7 | 0x1F,\n\t27295 - 19968: jis0212<<14 | 0x24<<7 | 0x20,\n\t27296 - 19968: jis0208<<14 | 0x3B<<7 | 0x5A,\n\t27298 - 19968: jis0208<<14 | 0x3B<<7 | 0x5C,\n\t27299 - 19968: jis0208<<14 | 0x3B<<7 | 0x5D,\n\t27301 - 19968: jis0212<<14 | 0x24<<7 | 0x21,\n\t27306 - 19968: jis0208<<14 | 0x3C<<7 | 0x0B,\n\t27307 - 19968: jis0212<<14 | 0x24<<7 | 0x22,\n\t27308 - 19968: jis0208<<14 | 0x3C<<7 | 0x07,\n\t27310 - 19968: jis0208<<14 | 0x3A<<7 | 0x4C,\n\t27311 - 19968: jis0212<<14 | 0x24<<7 | 0x23,\n\t27312 - 19968: jis0212<<14 | 0x24<<7 | 0x24,\n\t27313 - 19968: jis0212<<14 | 0x24<<7 | 0x25,\n\t27315 - 19968: jis0208<<14 | 0x3C<<7 | 0x06,\n\t27316 - 19968: jis0212<<14 | 0x24<<7 | 0x26,\n\t27320 - 19968: jis0208<<14 | 0x3C<<7 | 0x05,\n\t27323 - 19968: jis0208<<14 | 0x3C<<7 | 0x02,\n\t27325 - 19968: jis0212<<14 | 0x24<<7 | 0x27,\n\t27326 - 19968: jis0212<<14 | 0x24<<7 | 0x28,\n\t27327 - 19968: jis0212<<14 | 0x24<<7 | 0x29,\n\t27329 - 19968: jis0208<<14 | 0x3B<<7 | 0x49,\n\t27330 - 19968: jis0208<<14 | 0x3C<<7 | 0x04,\n\t27331 - 19968: jis0208<<14 | 0x3C<<7 | 0x03,\n\t27334 - 19968: jis0212<<14 | 0x24<<7 | 0x2A,\n\t27336 - 19968: jis0212<<14 | 0x24<<7 | 0x2C,\n\t27337 - 19968: jis0212<<14 | 0x24<<7 | 0x2B,\n\t27340 - 19968: jis0212<<14 | 0x24<<7 | 0x2D,\n\t27344 - 19968: jis0212<<14 | 0x24<<7 | 0x2E,\n\t27345 - 19968: jis0208<<14 | 0x3C<<7 | 0x09,\n\t27347 - 19968: jis0208<<14 | 0x2E<<7 | 0x05,\n\t27348 - 19968: jis0212<<14 | 0x24<<7 | 0x2F,\n\t27349 - 19968: jis0212<<14 | 0x24<<7 | 0x30,\n\t27350 - 19968: jis0212<<14 | 0x24<<7 | 0x31,\n\t27354 - 19968: jis0208<<14 | 0x3C<<7 | 0x0C,\n\t27355 - 19968: jis0208<<14 | 0x15<<7 | 0x5A,\n\t27356 - 19968: jis0212<<14 | 0x24<<7 | 0x32,\n\t27357 - 19968: jis0212<<14 | 0x24<<7 | 0x33,\n\t27358 - 19968: jis0208<<14 | 0x3C<<7 | 0x08,\n\t27359 - 19968: jis0208<<14 | 0x3C<<7 | 0x0A,\n\t27362 - 19968: jis0208<<14 | 0x59<<7 | 0x37,\n\t27364 - 19968: jis0208<<14 | 0x59<<7 | 0x38,\n\t27367 - 19968: jis0212<<14 | 0x24<<7 | 0x35,\n\t27368 - 19968: jis0208<<14 | 0x27<<7 | 0x06,\n\t27370 - 19968: jis0208<<14 | 0x3C<<7 | 0x0D,\n\t27372 - 19968: jis0212<<14 | 0x24<<7 | 0x36,\n\t27376 - 19968: jis0212<<14 | 0x24<<7 | 0x37,\n\t27377 - 19968: jis0212<<14 | 0x24<<7 | 0x38,\n\t27378 - 19968: jis0212<<14 | 0x24<<7 | 0x39,\n\t27386 - 19968: jis0208<<14 | 0x3C<<7 | 0x11,\n\t27387 - 19968: jis0208<<14 | 0x3C<<7 | 0x0E,\n\t27388 - 19968: jis0212<<14 | 0x24<<7 | 0x3A,\n\t27389 - 19968: jis0212<<14 | 0x24<<7 | 0x3B,\n\t27394 - 19968: jis0212<<14 | 0x24<<7 | 0x3C,\n\t27395 - 19968: jis0212<<14 | 0x24<<7 | 0x3D,\n\t27396 - 19968: jis0208<<14 | 0x2C<<7 | 0x52,\n\t27397 - 19968: jis0208<<14 | 0x3C<<7 | 0x0F,\n\t27398 - 19968: jis0212<<14 | 0x24<<7 | 0x3E,\n\t27399 - 19968: jis0212<<14 | 0x24<<7 | 0x3F,\n\t27401 - 19968: jis0212<<14 | 0x24<<7 | 0x40,\n\t27402 - 19968: jis0208<<14 | 0x3B<<7 | 0x3D,\n\t27407 - 19968: jis0212<<14 | 0x24<<7 | 0x41,\n\t27408 - 19968: jis0212<<14 | 0x24<<7 | 0x42,\n\t27409 - 19968: jis0212<<14 | 0x24<<7 | 0x43,\n\t27410 - 19968: jis0208<<14 | 0x3C<<7 | 0x12,\n\t27414 - 19968: jis0208<<14 | 0x3C<<7 | 0x13,\n\t27415 - 19968: jis0212<<14 | 0x24<<7 | 0x44,\n\t27419 - 19968: jis0212<<14 | 0x24<<7 | 0x45,\n\t27421 - 19968: jis0208<<14 | 0x10<<7 | 0x14,\n\t27422 - 19968: jis0212<<14 | 0x24<<7 | 0x46,\n\t27423 - 19968: jis0208<<14 | 0x3C<<7 | 0x15,\n\t27424 - 19968: jis0208<<14 | 0x16<<7 | 0x46,\n\t27425 - 19968: jis0208<<14 | 0x1B<<7 | 0x00,\n\t27427 - 19968: jis0208<<14 | 0x15<<7 | 0x34,\n\t27428 - 19968: jis0212<<14 | 0x24<<7 | 0x47,\n\t27431 - 19968: jis0208<<14 | 0x11<<7 | 0x03,\n\t27432 - 19968: jis0212<<14 | 0x24<<7 | 0x48,\n\t27435 - 19968: jis0212<<14 | 0x24<<7 | 0x49,\n\t27436 - 19968: jis0212<<14 | 0x24<<7 | 0x4A,\n\t27439 - 19968: jis0212<<14 | 0x24<<7 | 0x4B,\n\t27442 - 19968: jis0208<<14 | 0x2C<<7 | 0x3E,\n\t27445 - 19968: jis0212<<14 | 0x24<<7 | 0x4C,\n\t27446 - 19968: jis0212<<14 | 0x24<<7 | 0x4D,\n\t27447 - 19968: jis0208<<14 | 0x3C<<7 | 0x17,\n\t27448 - 19968: jis0208<<14 | 0x3C<<7 | 0x16,\n\t27449 - 19968: jis0208<<14 | 0x3C<<7 | 0x19,\n\t27450 - 19968: jis0208<<14 | 0x14<<7 | 0x1C,\n\t27451 - 19968: jis0212<<14 | 0x24<<7 | 0x4E,\n\t27453 - 19968: jis0208<<14 | 0x15<<7 | 0x35,\n\t27454 - 19968: jis0208<<14 | 0x13<<7 | 0x1D,\n\t27455 - 19968: jis0212<<14 | 0x24<<7 | 0x4F,\n\t27459 - 19968: jis0208<<14 | 0x3C<<7 | 0x1C,\n\t27462 - 19968: jis0212<<14 | 0x24<<7 | 0x50,\n\t27463 - 19968: jis0208<<14 | 0x3C<<7 | 0x1B,\n\t27465 - 19968: jis0208<<14 | 0x3C<<7 | 0x1D,\n\t27466 - 19968: jis0212<<14 | 0x24<<7 | 0x51,\n\t27468 - 19968: jis0208<<14 | 0x11<<7 | 0x2D,\n\t27469 - 19968: jis0212<<14 | 0x24<<7 | 0x52,\n\t27470 - 19968: jis0208<<14 | 0x22<<7 | 0x16,\n\t27472 - 19968: jis0208<<14 | 0x3C<<7 | 0x1E,\n\t27474 - 19968: jis0212<<14 | 0x24<<7 | 0x53,\n\t27475 - 19968: jis0208<<14 | 0x13<<7 | 0x1E,\n\t27476 - 19968: jis0208<<14 | 0x3C<<7 | 0x20,\n\t27478 - 19968: jis0212<<14 | 0x24<<7 | 0x54,\n\t27480 - 19968: jis0212<<14 | 0x24<<7 | 0x55,\n\t27481 - 19968: jis0208<<14 | 0x3C<<7 | 0x1F,\n\t27483 - 19968: jis0208<<14 | 0x3C<<7 | 0x21,\n\t27485 - 19968: jis0212<<14 | 0x24<<7 | 0x56,\n\t27487 - 19968: jis0208<<14 | 0x3C<<7 | 0x22,\n\t27488 - 19968: jis0212<<14 | 0x24<<7 | 0x57,\n\t27489 - 19968: jis0208<<14 | 0x3C<<7 | 0x23,\n\t27490 - 19968: jis0208<<14 | 0x1A<<7 | 0x3E,\n\t27491 - 19968: jis0208<<14 | 0x1F<<7 | 0x14,\n\t27492 - 19968: jis0208<<14 | 0x19<<7 | 0x00,\n\t27494 - 19968: jis0208<<14 | 0x28<<7 | 0x4F,\n\t27495 - 19968: jis0212<<14 | 0x24<<7 | 0x58,\n\t27497 - 19968: jis0208<<14 | 0x29<<7 | 0x41,\n\t27498 - 19968: jis0208<<14 | 0x2E<<7 | 0x23,\n\t27499 - 19968: jis0212<<14 | 0x24<<7 | 0x59,\n\t27502 - 19968: jis0212<<14 | 0x24<<7 | 0x5A,\n\t27503 - 19968: jis0208<<14 | 0x1A<<7 | 0x54,\n\t27504 - 19968: jis0212<<14 | 0x24<<7 | 0x5B,\n\t27507 - 19968: jis0208<<14 | 0x19<<7 | 0x2F,\n\t27508 - 19968: jis0208<<14 | 0x2D<<7 | 0x51,\n\t27509 - 19968: jis0212<<14 | 0x24<<7 | 0x5C,\n\t27512 - 19968: jis0208<<14 | 0x3C<<7 | 0x24,\n\t27513 - 19968: jis0208<<14 | 0x3C<<7 | 0x25,\n\t27515 - 19968: jis0208<<14 | 0x1A<<7 | 0x3F,\n\t27517 - 19968: jis0212<<14 | 0x24<<7 | 0x5D,\n\t27518 - 19968: jis0212<<14 | 0x25<<7 | 0x00,\n\t27519 - 19968: jis0208<<14 | 0x3C<<7 | 0x26,\n\t27520 - 19968: jis0208<<14 | 0x3C<<7 | 0x27,\n\t27522 - 19968: jis0212<<14 | 0x25<<7 | 0x01,\n\t27523 - 19968: jis0208<<14 | 0x3C<<7 | 0x29,\n\t27524 - 19968: jis0208<<14 | 0x3C<<7 | 0x28,\n\t27525 - 19968: jis0212<<14 | 0x25<<7 | 0x02,\n\t27526 - 19968: jis0208<<14 | 0x2A<<7 | 0x37,\n\t27529 - 19968: jis0208<<14 | 0x1C<<7 | 0x3D,\n\t27530 - 19968: jis0208<<14 | 0x1B<<7 | 0x4B,\n\t27531 - 19968: jis0208<<14 | 0x1A<<7 | 0x23,\n\t27533 - 19968: jis0208<<14 | 0x3C<<7 | 0x2A,\n\t27541 - 19968: jis0208<<14 | 0x3C<<7 | 0x2C,\n\t27542 - 19968: jis0208<<14 | 0x1E<<7 | 0x02,\n\t27543 - 19968: jis0212<<14 | 0x25<<7 | 0x03,\n\t27544 - 19968: jis0208<<14 | 0x3C<<7 | 0x2B,\n\t27547 - 19968: jis0212<<14 | 0x25<<7 | 0x04,\n\t27550 - 19968: jis0208<<14 | 0x3C<<7 | 0x2D,\n\t27551 - 19968: jis0212<<14 | 0x25<<7 | 0x05,\n\t27552 - 19968: jis0212<<14 | 0x25<<7 | 0x06,\n\t27554 - 19968: jis0212<<14 | 0x25<<7 | 0x07,\n\t27555 - 19968: jis0212<<14 | 0x25<<7 | 0x08,\n\t27556 - 19968: jis0208<<14 | 0x3C<<7 | 0x2E,\n\t27560 - 19968: jis0212<<14 | 0x25<<7 | 0x09,\n\t27561 - 19968: jis0212<<14 | 0x25<<7 | 0x0A,\n\t27562 - 19968: jis0208<<14 | 0x3C<<7 | 0x2F,\n\t27563 - 19968: jis0208<<14 | 0x3C<<7 | 0x30,\n\t27564 - 19968: jis0212<<14 | 0x25<<7 | 0x0B,\n\t27565 - 19968: jis0212<<14 | 0x25<<7 | 0x0C,\n\t27566 - 19968: jis0212<<14 | 0x25<<7 | 0x0D,\n\t27567 - 19968: jis0208<<14 | 0x3C<<7 | 0x31,\n\t27568 - 19968: jis0212<<14 | 0x25<<7 | 0x0E,\n\t27569 - 19968: jis0208<<14 | 0x3C<<7 | 0x33,\n\t27570 - 19968: jis0208<<14 | 0x3C<<7 | 0x32,\n\t27571 - 19968: jis0208<<14 | 0x3C<<7 | 0x34,\n\t27572 - 19968: jis0208<<14 | 0x11<<7 | 0x04,\n\t27573 - 19968: jis0208<<14 | 0x22<<7 | 0x29,\n\t27575 - 19968: jis0208<<14 | 0x3C<<7 | 0x35,\n\t27576 - 19968: jis0212<<14 | 0x25<<7 | 0x0F,\n\t27577 - 19968: jis0212<<14 | 0x25<<7 | 0x10,\n\t27578 - 19968: jis0208<<14 | 0x1A<<7 | 0x05,\n\t27579 - 19968: jis0208<<14 | 0x12<<7 | 0x2B,\n\t27580 - 19968: jis0208<<14 | 0x3C<<7 | 0x36,\n\t27581 - 19968: jis0212<<14 | 0x25<<7 | 0x11,\n\t27582 - 19968: jis0212<<14 | 0x25<<7 | 0x12,\n\t27583 - 19968: jis0208<<14 | 0x24<<7 | 0x21,\n\t27584 - 19968: jis0208<<14 | 0x33<<7 | 0x2B,\n\t27587 - 19968: jis0212<<14 | 0x25<<7 | 0x13,\n\t27588 - 19968: jis0212<<14 | 0x25<<7 | 0x14,\n\t27589 - 19968: jis0208<<14 | 0x14<<7 | 0x02,\n\t27590 - 19968: jis0208<<14 | 0x3C<<7 | 0x37,\n\t27593 - 19968: jis0212<<14 | 0x25<<7 | 0x15,\n\t27595 - 19968: jis0208<<14 | 0x3C<<7 | 0x38,\n\t27596 - 19968: jis0212<<14 | 0x25<<7 | 0x16,\n\t27597 - 19968: jis0208<<14 | 0x29<<7 | 0x4B,\n\t27598 - 19968: jis0208<<14 | 0x2A<<7 | 0x47,\n\t27602 - 19968: jis0208<<14 | 0x25<<7 | 0x26,\n\t27603 - 19968: jis0208<<14 | 0x3C<<7 | 0x39,\n\t27604 - 19968: jis0208<<14 | 0x27<<7 | 0x45,\n\t27606 - 19968: jis0208<<14 | 0x59<<7 | 0x39,\n\t27608 - 19968: jis0208<<14 | 0x27<<7 | 0x5A,\n\t27610 - 19968: jis0212<<14 | 0x25<<7 | 0x18,\n\t27611 - 19968: jis0208<<14 | 0x2B<<7 | 0x32,\n\t27615 - 19968: jis0208<<14 | 0x3C<<7 | 0x3A,\n\t27617 - 19968: jis0212<<14 | 0x25<<7 | 0x19,\n\t27619 - 19968: jis0212<<14 | 0x25<<7 | 0x1A,\n\t27622 - 19968: jis0212<<14 | 0x25<<7 | 0x1B,\n\t27623 - 19968: jis0212<<14 | 0x25<<7 | 0x1C,\n\t27627 - 19968: jis0208<<14 | 0x3C<<7 | 0x3C,\n\t27628 - 19968: jis0208<<14 | 0x3C<<7 | 0x3B,\n\t27630 - 19968: jis0212<<14 | 0x25<<7 | 0x1D,\n\t27631 - 19968: jis0208<<14 | 0x3C<<7 | 0x3E,\n\t27633 - 19968: jis0212<<14 | 0x25<<7 | 0x1E,\n\t27635 - 19968: jis0208<<14 | 0x3C<<7 | 0x3D,\n\t27639 - 19968: jis0212<<14 | 0x25<<7 | 0x1F,\n\t27641 - 19968: jis0212<<14 | 0x25<<7 | 0x20,\n\t27647 - 19968: jis0212<<14 | 0x25<<7 | 0x21,\n\t27650 - 19968: jis0212<<14 | 0x25<<7 | 0x22,\n\t27652 - 19968: jis0212<<14 | 0x25<<7 | 0x23,\n\t27653 - 19968: jis0212<<14 | 0x25<<7 | 0x24,\n\t27656 - 19968: jis0208<<14 | 0x3C<<7 | 0x40,\n\t27657 - 19968: jis0212<<14 | 0x25<<7 | 0x25,\n\t27661 - 19968: jis0212<<14 | 0x25<<7 | 0x26,\n\t27662 - 19968: jis0212<<14 | 0x25<<7 | 0x27,\n\t27663 - 19968: jis0208<<14 | 0x1A<<7 | 0x40,\n\t27664 - 19968: jis0212<<14 | 0x25<<7 | 0x28,\n\t27665 - 19968: jis0208<<14 | 0x2B<<7 | 0x10,\n\t27666 - 19968: jis0212<<14 | 0x25<<7 | 0x29,\n\t27667 - 19968: jis0208<<14 | 0x3C<<7 | 0x41,\n\t27668 - 19968: jis0208<<14 | 0x3C<<7 | 0x42,\n\t27671 - 19968: jis0208<<14 | 0x14<<7 | 0x03,\n\t27673 - 19968: jis0212<<14 | 0x25<<7 | 0x2A,\n\t27675 - 19968: jis0208<<14 | 0x3C<<7 | 0x43,\n\t27679 - 19968: jis0212<<14 | 0x25<<7 | 0x2B,\n\t27683 - 19968: jis0208<<14 | 0x3C<<7 | 0x45,\n\t27684 - 19968: jis0208<<14 | 0x3C<<7 | 0x44,\n\t27686 - 19968: jis0212<<14 | 0x25<<7 | 0x2C,\n\t27687 - 19968: jis0212<<14 | 0x25<<7 | 0x2D,\n\t27688 - 19968: jis0212<<14 | 0x25<<7 | 0x2E,\n\t27692 - 19968: jis0212<<14 | 0x25<<7 | 0x2F,\n\t27694 - 19968: jis0212<<14 | 0x25<<7 | 0x30,\n\t27699 - 19968: jis0212<<14 | 0x25<<7 | 0x31,\n\t27700 - 19968: jis0208<<14 | 0x1E<<7 | 0x44,\n\t27701 - 19968: jis0212<<14 | 0x25<<7 | 0x32,\n\t27702 - 19968: jis0212<<14 | 0x25<<7 | 0x33,\n\t27703 - 19968: jis0208<<14 | 0x28<<7 | 0x18,\n\t27704 - 19968: jis0208<<14 | 0x10<<7 | 0x29,\n\t27706 - 19968: jis0212<<14 | 0x25<<7 | 0x34,\n\t27707 - 19968: jis0212<<14 | 0x25<<7 | 0x35,\n\t27710 - 19968: jis0208<<14 | 0x27<<7 | 0x24,\n\t27711 - 19968: jis0208<<14 | 0x59<<7 | 0x3A,\n\t27712 - 19968: jis0208<<14 | 0x23<<7 | 0x54,\n\t27713 - 19968: jis0208<<14 | 0x1C<<7 | 0x20,\n\t27714 - 19968: jis0208<<14 | 0x14<<7 | 0x40,\n\t27722 - 19968: jis0212<<14 | 0x25<<7 | 0x37,\n\t27723 - 19968: jis0212<<14 | 0x25<<7 | 0x38,\n\t27725 - 19968: jis0212<<14 | 0x25<<7 | 0x39,\n\t27726 - 19968: jis0208<<14 | 0x27<<7 | 0x25,\n\t27727 - 19968: jis0212<<14 | 0x25<<7 | 0x3A,\n\t27728 - 19968: jis0208<<14 | 0x1B<<7 | 0x0D,\n\t27730 - 19968: jis0212<<14 | 0x25<<7 | 0x3B,\n\t27732 - 19968: jis0212<<14 | 0x25<<7 | 0x3C,\n\t27733 - 19968: jis0208<<14 | 0x3C<<7 | 0x47,\n\t27735 - 19968: jis0208<<14 | 0x13<<7 | 0x1F,\n\t27737 - 19968: jis0212<<14 | 0x25<<7 | 0x3D,\n\t27738 - 19968: jis0208<<14 | 0x10<<7 | 0x57,\n\t27739 - 19968: jis0212<<14 | 0x25<<7 | 0x3E,\n\t27740 - 19968: jis0208<<14 | 0x59<<7 | 0x3B,\n\t27741 - 19968: jis0208<<14 | 0x25<<7 | 0x51,\n\t27742 - 19968: jis0208<<14 | 0x3C<<7 | 0x46,\n\t27743 - 19968: jis0208<<14 | 0x18<<7 | 0x1D,\n\t27744 - 19968: jis0208<<14 | 0x22<<7 | 0x32,\n\t27746 - 19968: jis0208<<14 | 0x3C<<7 | 0x48,\n\t27751 - 19968: jis0212<<14 | 0x26<<7 | 0x15,\n\t27752 - 19968: jis0208<<14 | 0x3C<<7 | 0x50,\n\t27754 - 19968: jis0208<<14 | 0x3C<<7 | 0x49,\n\t27755 - 19968: jis0212<<14 | 0x25<<7 | 0x40,\n\t27757 - 19968: jis0212<<14 | 0x25<<7 | 0x41,\n\t27759 - 19968: jis0208<<14 | 0x59<<7 | 0x3D,\n\t27760 - 19968: jis0208<<14 | 0x21<<7 | 0x20,\n\t27762 - 19968: jis0208<<14 | 0x14<<7 | 0x41,\n\t27763 - 19968: jis0208<<14 | 0x3C<<7 | 0x51,\n\t27764 - 19968: jis0212<<14 | 0x25<<7 | 0x43,\n\t27766 - 19968: jis0212<<14 | 0x25<<7 | 0x44,\n\t27768 - 19968: jis0212<<14 | 0x25<<7 | 0x45,\n\t27769 - 19968: jis0212<<14 | 0x25<<7 | 0x46,\n\t27770 - 19968: jis0208<<14 | 0x16<<7 | 0x47,\n\t27771 - 19968: jis0212<<14 | 0x25<<7 | 0x47,\n\t27773 - 19968: jis0208<<14 | 0x14<<7 | 0x04,\n\t27774 - 19968: jis0208<<14 | 0x3C<<7 | 0x4F,\n\t27777 - 19968: jis0208<<14 | 0x3C<<7 | 0x4D,\n\t27778 - 19968: jis0208<<14 | 0x3C<<7 | 0x4A,\n\t27779 - 19968: jis0208<<14 | 0x2C<<7 | 0x3F,\n\t27781 - 19968: jis0212<<14 | 0x25<<7 | 0x48,\n\t27782 - 19968: jis0208<<14 | 0x59<<7 | 0x3C,\n\t27783 - 19968: jis0212<<14 | 0x25<<7 | 0x4A,\n\t27784 - 19968: jis0208<<14 | 0x23<<7 | 0x1F,\n\t27785 - 19968: jis0212<<14 | 0x25<<7 | 0x4B,\n\t27788 - 19968: jis0208<<14 | 0x25<<7 | 0x38,\n\t27789 - 19968: jis0208<<14 | 0x3C<<7 | 0x4B,\n\t27792 - 19968: jis0208<<14 | 0x3C<<7 | 0x53,\n\t27794 - 19968: jis0208<<14 | 0x3C<<7 | 0x52,\n\t27795 - 19968: jis0208<<14 | 0x16<<7 | 0x02,\n\t27796 - 19968: jis0212<<14 | 0x25<<7 | 0x4C,\n\t27797 - 19968: jis0212<<14 | 0x25<<7 | 0x4D,\n\t27798 - 19968: jis0208<<14 | 0x11<<7 | 0x0C,\n\t27799 - 19968: jis0212<<14 | 0x25<<7 | 0x4E,\n\t27800 - 19968: jis0212<<14 | 0x25<<7 | 0x4F,\n\t27801 - 19968: jis0208<<14 | 0x19<<7 | 0x1A,\n\t27802 - 19968: jis0208<<14 | 0x3C<<7 | 0x4C,\n\t27803 - 19968: jis0208<<14 | 0x3C<<7 | 0x4E,\n\t27804 - 19968: jis0212<<14 | 0x25<<7 | 0x50,\n\t27807 - 19968: jis0212<<14 | 0x25<<7 | 0x51,\n\t27809 - 19968: jis0208<<14 | 0x2A<<7 | 0x36,\n\t27810 - 19968: jis0208<<14 | 0x21<<7 | 0x53,\n\t27819 - 19968: jis0208<<14 | 0x2A<<7 | 0x56,\n\t27822 - 19968: jis0208<<14 | 0x3C<<7 | 0x5B,\n\t27824 - 19968: jis0212<<14 | 0x25<<7 | 0x52,\n\t27825 - 19968: jis0208<<14 | 0x3C<<7 | 0x5C,\n\t27826 - 19968: jis0212<<14 | 0x25<<7 | 0x53,\n\t27827 - 19968: jis0208<<14 | 0x11<<7 | 0x2E,\n\t27828 - 19968: jis0212<<14 | 0x25<<7 | 0x54,\n\t27832 - 19968: jis0208<<14 | 0x29<<7 | 0x07,\n\t27833 - 19968: jis0208<<14 | 0x2B<<7 | 0x5C,\n\t27834 - 19968: jis0208<<14 | 0x3D<<7 | 0x00,\n\t27835 - 19968: jis0208<<14 | 0x1B<<7 | 0x02,\n\t27836 - 19968: jis0208<<14 | 0x1D<<7 | 0x21,\n\t27837 - 19968: jis0208<<14 | 0x3C<<7 | 0x57,\n\t27838 - 19968: jis0208<<14 | 0x3C<<7 | 0x5D,\n\t27839 - 19968: jis0208<<14 | 0x10<<7 | 0x47,\n\t27841 - 19968: jis0208<<14 | 0x15<<7 | 0x16,\n\t27842 - 19968: jis0212<<14 | 0x25<<7 | 0x55,\n\t27844 - 19968: jis0208<<14 | 0x3C<<7 | 0x54,\n\t27845 - 19968: jis0208<<14 | 0x3C<<7 | 0x59,\n\t27846 - 19968: jis0212<<14 | 0x25<<7 | 0x56,\n\t27849 - 19968: jis0208<<14 | 0x1F<<7 | 0x53,\n\t27850 - 19968: jis0208<<14 | 0x26<<7 | 0x50,\n\t27852 - 19968: jis0208<<14 | 0x27<<7 | 0x46,\n\t27853 - 19968: jis0212<<14 | 0x25<<7 | 0x57,\n\t27855 - 19968: jis0212<<14 | 0x25<<7 | 0x58,\n\t27856 - 19968: jis0212<<14 | 0x25<<7 | 0x59,\n\t27857 - 19968: jis0212<<14 | 0x25<<7 | 0x5A,\n\t27858 - 19968: jis0212<<14 | 0x25<<7 | 0x5B,\n\t27859 - 19968: jis0208<<14 | 0x3C<<7 | 0x56,\n\t27860 - 19968: jis0212<<14 | 0x25<<7 | 0x5C,\n\t27861 - 19968: jis0208<<14 | 0x2A<<7 | 0x00,\n\t27862 - 19968: jis0212<<14 | 0x25<<7 | 0x5D,\n\t27863 - 19968: jis0208<<14 | 0x3C<<7 | 0x58,\n\t27865 - 19968: jis0208<<14 | 0x3D<<7 | 0x03,\n\t27866 - 19968: jis0208<<14 | 0x59<<7 | 0x3E,\n\t27867 - 19968: jis0208<<14 | 0x3D<<7 | 0x01,\n\t27868 - 19968: jis0212<<14 | 0x26<<7 | 0x01,\n\t27869 - 19968: jis0208<<14 | 0x3C<<7 | 0x5A,\n\t27872 - 19968: jis0212<<14 | 0x26<<7 | 0x02,\n\t27873 - 19968: jis0208<<14 | 0x2A<<7 | 0x01,\n\t27874 - 19968: jis0208<<14 | 0x26<<7 | 0x27,\n\t27875 - 19968: jis0208<<14 | 0x14<<7 | 0x42,\n\t27877 - 19968: jis0208<<14 | 0x24<<7 | 0x04,\n\t27879 - 19968: jis0212<<14 | 0x26<<7 | 0x03,\n\t27880 - 19968: jis0208<<14 | 0x22<<7 | 0x4C,\n\t27881 - 19968: jis0212<<14 | 0x26<<7 | 0x04,\n\t27882 - 19968: jis0208<<14 | 0x3D<<7 | 0x04,\n\t27883 - 19968: jis0212<<14 | 0x26<<7 | 0x05,\n\t27884 - 19968: jis0212<<14 | 0x26<<7 | 0x06,\n\t27886 - 19968: jis0212<<14 | 0x26<<7 | 0x07,\n\t27887 - 19968: jis0208<<14 | 0x3D<<7 | 0x02,\n\t27888 - 19968: jis0208<<14 | 0x21<<7 | 0x38,\n\t27889 - 19968: jis0208<<14 | 0x3C<<7 | 0x55,\n\t27890 - 19968: jis0212<<14 | 0x26<<7 | 0x08,\n\t27891 - 19968: jis0208<<14 | 0x10<<7 | 0x2A,\n\t27892 - 19968: jis0212<<14 | 0x26<<7 | 0x09,\n\t27908 - 19968: jis0208<<14 | 0x59<<7 | 0x3F,\n\t27911 - 19968: jis0212<<14 | 0x26<<7 | 0x0B,\n\t27914 - 19968: jis0212<<14 | 0x26<<7 | 0x0C,\n\t27915 - 19968: jis0208<<14 | 0x2C<<7 | 0x2D,\n\t27916 - 19968: jis0208<<14 | 0x3D<<7 | 0x0F,\n\t27918 - 19968: jis0212<<14 | 0x26<<7 | 0x0D,\n\t27919 - 19968: jis0212<<14 | 0x26<<7 | 0x0E,\n\t27921 - 19968: jis0212<<14 | 0x26<<7 | 0x0F,\n\t27922 - 19968: jis0208<<14 | 0x3D<<7 | 0x0E,\n\t27923 - 19968: jis0212<<14 | 0x26<<7 | 0x10,\n\t27927 - 19968: jis0208<<14 | 0x1F<<7 | 0x55,\n\t27929 - 19968: jis0208<<14 | 0x3D<<7 | 0x0B,\n\t27930 - 19968: jis0212<<14 | 0x26<<7 | 0x11,\n\t27931 - 19968: jis0208<<14 | 0x2C<<7 | 0x4B,\n\t27934 - 19968: jis0208<<14 | 0x25<<7 | 0x15,\n\t27935 - 19968: jis0208<<14 | 0x3D<<7 | 0x05,\n\t27941 - 19968: jis0208<<14 | 0x23<<7 | 0x24,\n\t27942 - 19968: jis0212<<14 | 0x26<<7 | 0x12,\n\t27943 - 19968: jis0212<<14 | 0x26<<7 | 0x13,\n\t27944 - 19968: jis0212<<14 | 0x26<<7 | 0x14,\n\t27945 - 19968: jis0208<<14 | 0x10<<7 | 0x2B,\n\t27946 - 19968: jis0208<<14 | 0x18<<7 | 0x1E,\n\t27947 - 19968: jis0208<<14 | 0x3D<<7 | 0x08,\n\t27950 - 19968: jis0212<<14 | 0x26<<7 | 0x16,\n\t27951 - 19968: jis0212<<14 | 0x26<<7 | 0x17,\n\t27953 - 19968: jis0212<<14 | 0x26<<7 | 0x18,\n\t27954 - 19968: jis0208<<14 | 0x1C<<7 | 0x06,\n\t27955 - 19968: jis0208<<14 | 0x3D<<7 | 0x0D,\n\t27957 - 19968: jis0208<<14 | 0x3D<<7 | 0x0C,\n\t27958 - 19968: jis0208<<14 | 0x3D<<7 | 0x07,\n\t27960 - 19968: jis0208<<14 | 0x3D<<7 | 0x0A,\n\t27961 - 19968: jis0212<<14 | 0x26<<7 | 0x19,\n\t27963 - 19968: jis0208<<14 | 0x12<<7 | 0x47,\n\t27964 - 19968: jis0212<<14 | 0x26<<7 | 0x1A,\n\t27965 - 19968: jis0208<<14 | 0x3D<<7 | 0x09,\n\t27966 - 19968: jis0208<<14 | 0x26<<7 | 0x28,\n\t27967 - 19968: jis0212<<14 | 0x26<<7 | 0x1B,\n\t27969 - 19968: jis0208<<14 | 0x2D<<7 | 0x0D,\n\t27972 - 19968: jis0208<<14 | 0x1D<<7 | 0x53,\n\t27973 - 19968: jis0208<<14 | 0x1F<<7 | 0x54,\n\t27991 - 19968: jis0212<<14 | 0x26<<7 | 0x1C,\n\t27993 - 19968: jis0208<<14 | 0x3D<<7 | 0x15,\n\t27994 - 19968: jis0208<<14 | 0x3D<<7 | 0x13,\n\t27996 - 19968: jis0208<<14 | 0x28<<7 | 0x2C,\n\t27998 - 19968: jis0212<<14 | 0x26<<7 | 0x1D,\n\t27999 - 19968: jis0212<<14 | 0x26<<7 | 0x1E,\n\t28001 - 19968: jis0212<<14 | 0x26<<7 | 0x1F,\n\t28003 - 19968: jis0208<<14 | 0x3D<<7 | 0x10,\n\t28004 - 19968: jis0208<<14 | 0x3D<<7 | 0x12,\n\t28005 - 19968: jis0212<<14 | 0x26<<7 | 0x20,\n\t28006 - 19968: jis0208<<14 | 0x10<<7 | 0x19,\n\t28007 - 19968: jis0212<<14 | 0x26<<7 | 0x21,\n\t28009 - 19968: jis0208<<14 | 0x18<<7 | 0x1F,\n\t28010 - 19968: jis0208<<14 | 0x2E<<7 | 0x11,\n\t28012 - 19968: jis0208<<14 | 0x12<<7 | 0x1C,\n\t28014 - 19968: jis0208<<14 | 0x28<<7 | 0x41,\n\t28015 - 19968: jis0208<<14 | 0x59<<7 | 0x41,\n\t28016 - 19968: jis0212<<14 | 0x26<<7 | 0x23,\n\t28020 - 19968: jis0208<<14 | 0x2C<<7 | 0x40,\n\t28023 - 19968: jis0208<<14 | 0x12<<7 | 0x03,\n\t28024 - 19968: jis0208<<14 | 0x1E<<7 | 0x1A,\n\t28025 - 19968: jis0208<<14 | 0x3D<<7 | 0x14,\n\t28028 - 19968: jis0212<<14 | 0x26<<7 | 0x24,\n\t28034 - 19968: jis0212<<14 | 0x26<<7 | 0x25,\n\t28037 - 19968: jis0208<<14 | 0x3D<<7 | 0x19,\n\t28039 - 19968: jis0208<<14 | 0x59<<7 | 0x40,\n\t28040 - 19968: jis0208<<14 | 0x1D<<7 | 0x22,\n\t28044 - 19968: jis0208<<14 | 0x2C<<7 | 0x0F,\n\t28046 - 19968: jis0208<<14 | 0x3D<<7 | 0x16,\n\t28049 - 19968: jis0212<<14 | 0x26<<7 | 0x27,\n\t28050 - 19968: jis0212<<14 | 0x26<<7 | 0x28,\n\t28051 - 19968: jis0208<<14 | 0x3D<<7 | 0x11,\n\t28052 - 19968: jis0212<<14 | 0x26<<7 | 0x29,\n\t28053 - 19968: jis0208<<14 | 0x3D<<7 | 0x17,\n\t28054 - 19968: jis0208<<14 | 0x59<<7 | 0x42,\n\t28055 - 19968: jis0212<<14 | 0x26<<7 | 0x2B,\n\t28056 - 19968: jis0212<<14 | 0x26<<7 | 0x2C,\n\t28057 - 19968: jis0208<<14 | 0x2D<<7 | 0x3D,\n\t28059 - 19968: jis0208<<14 | 0x24<<7 | 0x52,\n\t28060 - 19968: jis0208<<14 | 0x25<<7 | 0x21,\n\t28074 - 19968: jis0212<<14 | 0x26<<7 | 0x2D,\n\t28076 - 19968: jis0208<<14 | 0x59<<7 | 0x43,\n\t28079 - 19968: jis0208<<14 | 0x12<<7 | 0x15,\n\t28082 - 19968: jis0208<<14 | 0x10<<7 | 0x34,\n\t28084 - 19968: jis0212<<14 | 0x26<<7 | 0x2F,\n\t28085 - 19968: jis0208<<14 | 0x3D<<7 | 0x1D,\n\t28087 - 19968: jis0212<<14 | 0x26<<7 | 0x30,\n\t28088 - 19968: jis0208<<14 | 0x3D<<7 | 0x20,\n\t28089 - 19968: jis0212<<14 | 0x26<<7 | 0x31,\n\t28092 - 19968: jis0208<<14 | 0x2D<<7 | 0x22,\n\t28093 - 19968: jis0212<<14 | 0x26<<7 | 0x32,\n\t28095 - 19968: jis0212<<14 | 0x26<<7 | 0x33,\n\t28096 - 19968: jis0208<<14 | 0x2C<<7 | 0x43,\n\t28100 - 19968: jis0212<<14 | 0x26<<7 | 0x34,\n\t28101 - 19968: jis0208<<14 | 0x3D<<7 | 0x27,\n\t28102 - 19968: jis0208<<14 | 0x3D<<7 | 0x21,\n\t28103 - 19968: jis0208<<14 | 0x3D<<7 | 0x1E,\n\t28104 - 19968: jis0212<<14 | 0x26<<7 | 0x35,\n\t28106 - 19968: jis0212<<14 | 0x26<<7 | 0x36,\n\t28107 - 19968: jis0208<<14 | 0x2D<<7 | 0x33,\n\t28108 - 19968: jis0208<<14 | 0x3D<<7 | 0x24,\n\t28110 - 19968: jis0212<<14 | 0x26<<7 | 0x37,\n\t28111 - 19968: jis0208<<14 | 0x59<<7 | 0x44,\n\t28113 - 19968: jis0208<<14 | 0x1C<<7 | 0x29,\n\t28114 - 19968: jis0208<<14 | 0x3D<<7 | 0x26,\n\t28117 - 19968: jis0208<<14 | 0x3D<<7 | 0x2B,\n\t28118 - 19968: jis0212<<14 | 0x26<<7 | 0x39,\n\t28120 - 19968: jis0208<<14 | 0x24<<7 | 0x50,\n\t28121 - 19968: jis0208<<14 | 0x3D<<7 | 0x29,\n\t28123 - 19968: jis0212<<14 | 0x26<<7 | 0x3A,\n\t28125 - 19968: jis0212<<14 | 0x26<<7 | 0x3B,\n\t28126 - 19968: jis0208<<14 | 0x3D<<7 | 0x23,\n\t28127 - 19968: jis0212<<14 | 0x26<<7 | 0x3C,\n\t28128 - 19968: jis0212<<14 | 0x26<<7 | 0x3D,\n\t28129 - 19968: jis0208<<14 | 0x22<<7 | 0x17,\n\t28130 - 19968: jis0212<<14 | 0x26<<7 | 0x3E,\n\t28132 - 19968: jis0208<<14 | 0x3D<<7 | 0x2A,\n\t28133 - 19968: jis0212<<14 | 0x26<<7 | 0x3F,\n\t28134 - 19968: jis0208<<14 | 0x3D<<7 | 0x1F,\n\t28136 - 19968: jis0208<<14 | 0x3D<<7 | 0x25,\n\t28137 - 19968: jis0212<<14 | 0x26<<7 | 0x40,\n\t28138 - 19968: jis0208<<14 | 0x3D<<7 | 0x2C,\n\t28139 - 19968: jis0208<<14 | 0x0F<<7 | 0x5B,\n\t28140 - 19968: jis0208<<14 | 0x3D<<7 | 0x22,\n\t28142 - 19968: jis0208<<14 | 0x3D<<7 | 0x2D,\n\t28143 - 19968: jis0212<<14 | 0x26<<7 | 0x41,\n\t28144 - 19968: jis0212<<14 | 0x26<<7 | 0x42,\n\t28145 - 19968: jis0208<<14 | 0x1E<<7 | 0x1B,\n\t28146 - 19968: jis0208<<14 | 0x59<<7 | 0x46,\n\t28147 - 19968: jis0208<<14 | 0x1C<<7 | 0x3E,\n\t28148 - 19968: jis0212<<14 | 0x26<<7 | 0x43,\n\t28149 - 19968: jis0208<<14 | 0x29<<7 | 0x04,\n\t28150 - 19968: jis0212<<14 | 0x26<<7 | 0x44,\n\t28151 - 19968: jis0208<<14 | 0x19<<7 | 0x0D,\n\t28152 - 19968: jis0208<<14 | 0x59<<7 | 0x45,\n\t28153 - 19968: jis0208<<14 | 0x3D<<7 | 0x1A,\n\t28154 - 19968: jis0208<<14 | 0x3D<<7 | 0x28,\n\t28155 - 19968: jis0208<<14 | 0x24<<7 | 0x19,\n\t28156 - 19968: jis0208<<14 | 0x59<<7 | 0x47,\n\t28160 - 19968: jis0212<<14 | 0x26<<7 | 0x46,\n\t28164 - 19968: jis0212<<14 | 0x26<<7 | 0x47,\n\t28165 - 19968: jis0208<<14 | 0x1F<<7 | 0x15,\n\t28167 - 19968: jis0208<<14 | 0x12<<7 | 0x48,\n\t28168 - 19968: jis0208<<14 | 0x19<<7 | 0x30,\n\t28169 - 19968: jis0208<<14 | 0x1D<<7 | 0x23,\n\t28170 - 19968: jis0208<<14 | 0x3D<<7 | 0x1C,\n\t28171 - 19968: jis0208<<14 | 0x1C<<7 | 0x21,\n\t28179 - 19968: jis0208<<14 | 0x16<<7 | 0x2B,\n\t28181 - 19968: jis0208<<14 | 0x3D<<7 | 0x1B,\n\t28185 - 19968: jis0208<<14 | 0x3D<<7 | 0x31,\n\t28186 - 19968: jis0208<<14 | 0x1C<<7 | 0x4C,\n\t28187 - 19968: jis0208<<14 | 0x17<<7 | 0x19,\n\t28189 - 19968: jis0208<<14 | 0x3D<<7 | 0x40,\n\t28190 - 19968: jis0212<<14 | 0x26<<7 | 0x48,\n\t28191 - 19968: jis0208<<14 | 0x3D<<7 | 0x3A,\n\t28192 - 19968: jis0208<<14 | 0x14<<7 | 0x53,\n\t28193 - 19968: jis0208<<14 | 0x24<<7 | 0x2E,\n\t28194 - 19968: jis0212<<14 | 0x26<<7 | 0x49,\n\t28195 - 19968: jis0208<<14 | 0x3D<<7 | 0x35,\n\t28196 - 19968: jis0208<<14 | 0x3D<<7 | 0x3E,\n\t28197 - 19968: jis0208<<14 | 0x0F<<7 | 0x0E,\n\t28198 - 19968: jis0208<<14 | 0x10<<7 | 0x11,\n\t28199 - 19968: jis0208<<14 | 0x59<<7 | 0x4A,\n\t28201 - 19968: jis0208<<14 | 0x11<<7 | 0x18,\n\t28203 - 19968: jis0208<<14 | 0x3D<<7 | 0x37,\n\t28204 - 19968: jis0208<<14 | 0x21<<7 | 0x0B,\n\t28205 - 19968: jis0208<<14 | 0x3D<<7 | 0x2E,\n\t28206 - 19968: jis0208<<14 | 0x3D<<7 | 0x30,\n\t28207 - 19968: jis0208<<14 | 0x18<<7 | 0x20,\n\t28210 - 19968: jis0212<<14 | 0x26<<7 | 0x4B,\n\t28214 - 19968: jis0212<<14 | 0x26<<7 | 0x4C,\n\t28216 - 19968: jis0208<<14 | 0x3D<<7 | 0x41,\n\t28217 - 19968: jis0208<<14 | 0x59<<7 | 0x48,\n\t28218 - 19968: jis0208<<14 | 0x3D<<7 | 0x3C,\n\t28219 - 19968: jis0212<<14 | 0x26<<7 | 0x4E,\n\t28220 - 19968: jis0208<<14 | 0x59<<7 | 0x4B,\n\t28222 - 19968: jis0208<<14 | 0x3D<<7 | 0x34,\n\t28227 - 19968: jis0208<<14 | 0x3D<<7 | 0x3B,\n\t28228 - 19968: jis0212<<14 | 0x26<<7 | 0x50,\n\t28229 - 19968: jis0212<<14 | 0x26<<7 | 0x51,\n\t28232 - 19968: jis0212<<14 | 0x26<<7 | 0x52,\n\t28233 - 19968: jis0212<<14 | 0x26<<7 | 0x53,\n\t28234 - 19968: jis0208<<14 | 0x2B<<7 | 0x0A,\n\t28235 - 19968: jis0212<<14 | 0x26<<7 | 0x54,\n\t28237 - 19968: jis0208<<14 | 0x3D<<7 | 0x39,\n\t28238 - 19968: jis0208<<14 | 0x3D<<7 | 0x3D,\n\t28239 - 19968: jis0212<<14 | 0x26<<7 | 0x55,\n\t28241 - 19968: jis0212<<14 | 0x26<<7 | 0x56,\n\t28242 - 19968: jis0212<<14 | 0x26<<7 | 0x57,\n\t28243 - 19968: jis0212<<14 | 0x26<<7 | 0x58,\n\t28244 - 19968: jis0212<<14 | 0x26<<7 | 0x59,\n\t28246 - 19968: jis0208<<14 | 0x17<<7 | 0x2F,\n\t28247 - 19968: jis0212<<14 | 0x26<<7 | 0x5A,\n\t28248 - 19968: jis0208<<14 | 0x1D<<7 | 0x24,\n\t28251 - 19968: jis0208<<14 | 0x22<<7 | 0x18,\n\t28252 - 19968: jis0208<<14 | 0x59<<7 | 0x49,\n\t28253 - 19968: jis0212<<14 | 0x26<<7 | 0x5C,\n\t28254 - 19968: jis0212<<14 | 0x26<<7 | 0x5D,\n\t28255 - 19968: jis0208<<14 | 0x3D<<7 | 0x33,\n\t28258 - 19968: jis0212<<14 | 0x27<<7 | 0x00,\n\t28259 - 19968: jis0212<<14 | 0x27<<7 | 0x01,\n\t28263 - 19968: jis0208<<14 | 0x2C<<7 | 0x0E,\n\t28264 - 19968: jis0212<<14 | 0x27<<7 | 0x02,\n\t28267 - 19968: jis0208<<14 | 0x3D<<7 | 0x36,\n\t28270 - 19968: jis0208<<14 | 0x3D<<7 | 0x2F,\n\t28271 - 19968: jis0208<<14 | 0x24<<7 | 0x51,\n\t28274 - 19968: jis0208<<14 | 0x3D<<7 | 0x32,\n\t28275 - 19968: jis0212<<14 | 0x27<<7 | 0x03,\n\t28278 - 19968: jis0208<<14 | 0x3D<<7 | 0x38,\n\t28283 - 19968: jis0212<<14 | 0x27<<7 | 0x04,\n\t28285 - 19968: jis0212<<14 | 0x27<<7 | 0x05,\n\t28286 - 19968: jis0208<<14 | 0x2E<<7 | 0x30,\n\t28287 - 19968: jis0208<<14 | 0x1B<<7 | 0x1D,\n\t28288 - 19968: jis0208<<14 | 0x2A<<7 | 0x5D,\n\t28290 - 19968: jis0208<<14 | 0x3D<<7 | 0x42,\n\t28300 - 19968: jis0208<<14 | 0x27<<7 | 0x0D,\n\t28301 - 19968: jis0212<<14 | 0x27<<7 | 0x06,\n\t28303 - 19968: jis0208<<14 | 0x3D<<7 | 0x4E,\n\t28304 - 19968: jis0208<<14 | 0x17<<7 | 0x1A,\n\t28307 - 19968: jis0212<<14 | 0x27<<7 | 0x07,\n\t28310 - 19968: jis0208<<14 | 0x1C<<7 | 0x3F,\n\t28312 - 19968: jis0208<<14 | 0x3D<<7 | 0x44,\n\t28313 - 19968: jis0212<<14 | 0x27<<7 | 0x08,\n\t28316 - 19968: jis0208<<14 | 0x2D<<7 | 0x0E,\n\t28317 - 19968: jis0208<<14 | 0x18<<7 | 0x21,\n\t28319 - 19968: jis0208<<14 | 0x3D<<7 | 0x51,\n\t28320 - 19968: jis0212<<14 | 0x27<<7 | 0x09,\n\t28322 - 19968: jis0208<<14 | 0x0F<<7 | 0x4D,\n\t28325 - 19968: jis0208<<14 | 0x3D<<7 | 0x4F,\n\t28327 - 19968: jis0212<<14 | 0x27<<7 | 0x0A,\n\t28330 - 19968: jis0208<<14 | 0x3D<<7 | 0x43,\n\t28333 - 19968: jis0212<<14 | 0x27<<7 | 0x0B,\n\t28334 - 19968: jis0212<<14 | 0x27<<7 | 0x0C,\n\t28335 - 19968: jis0208<<14 | 0x3D<<7 | 0x49,\n\t28337 - 19968: jis0212<<14 | 0x27<<7 | 0x0D,\n\t28338 - 19968: jis0208<<14 | 0x3D<<7 | 0x4B,\n\t28339 - 19968: jis0212<<14 | 0x27<<7 | 0x0E,\n\t28342 - 19968: jis0208<<14 | 0x2C<<7 | 0x2E,\n\t28343 - 19968: jis0208<<14 | 0x3D<<7 | 0x46,\n\t28346 - 19968: jis0208<<14 | 0x24<<7 | 0x0D,\n\t28347 - 19968: jis0212<<14 | 0x27<<7 | 0x0F,\n\t28349 - 19968: jis0208<<14 | 0x3D<<7 | 0x48,\n\t28351 - 19968: jis0208<<14 | 0x59<<7 | 0x4C,\n\t28352 - 19968: jis0212<<14 | 0x27<<7 | 0x11,\n\t28353 - 19968: jis0212<<14 | 0x27<<7 | 0x12,\n\t28354 - 19968: jis0208<<14 | 0x3D<<7 | 0x50,\n\t28355 - 19968: jis0212<<14 | 0x27<<7 | 0x13,\n\t28356 - 19968: jis0208<<14 | 0x3D<<7 | 0x4A,\n\t28357 - 19968: jis0208<<14 | 0x2B<<7 | 0x26,\n\t28359 - 19968: jis0212<<14 | 0x27<<7 | 0x14,\n\t28360 - 19968: jis0212<<14 | 0x27<<7 | 0x15,\n\t28361 - 19968: jis0208<<14 | 0x3D<<7 | 0x45,\n\t28362 - 19968: jis0212<<14 | 0x27<<7 | 0x16,\n\t28363 - 19968: jis0208<<14 | 0x1B<<7 | 0x01,\n\t28364 - 19968: jis0208<<14 | 0x3D<<7 | 0x5D,\n\t28365 - 19968: jis0212<<14 | 0x27<<7 | 0x17,\n\t28366 - 19968: jis0212<<14 | 0x27<<7 | 0x18,\n\t28367 - 19968: jis0212<<14 | 0x27<<7 | 0x19,\n\t28369 - 19968: jis0208<<14 | 0x12<<7 | 0x49,\n\t28371 - 19968: jis0208<<14 | 0x3D<<7 | 0x47,\n\t28372 - 19968: jis0208<<14 | 0x3D<<7 | 0x4C,\n\t28373 - 19968: jis0208<<14 | 0x3D<<7 | 0x4D,\n\t28381 - 19968: jis0208<<14 | 0x21<<7 | 0x4B,\n\t28382 - 19968: jis0208<<14 | 0x21<<7 | 0x39,\n\t28395 - 19968: jis0212<<14 | 0x27<<7 | 0x1A,\n\t28396 - 19968: jis0208<<14 | 0x3D<<7 | 0x55,\n\t28397 - 19968: jis0212<<14 | 0x27<<7 | 0x1B,\n\t28398 - 19968: jis0212<<14 | 0x27<<7 | 0x1C,\n\t28399 - 19968: jis0208<<14 | 0x3D<<7 | 0x5B,\n\t28402 - 19968: jis0208<<14 | 0x3D<<7 | 0x59,\n\t28404 - 19968: jis0208<<14 | 0x24<<7 | 0x08,\n\t28407 - 19968: jis0208<<14 | 0x3E<<7 | 0x02,\n\t28408 - 19968: jis0208<<14 | 0x3D<<7 | 0x56,\n\t28409 - 19968: jis0212<<14 | 0x27<<7 | 0x1D,\n\t28411 - 19968: jis0212<<14 | 0x27<<7 | 0x1E,\n\t28413 - 19968: jis0212<<14 | 0x27<<7 | 0x1F,\n\t28414 - 19968: jis0208<<14 | 0x3D<<7 | 0x57,\n\t28415 - 19968: jis0208<<14 | 0x3D<<7 | 0x3F,\n\t28417 - 19968: jis0208<<14 | 0x14<<7 | 0x58,\n\t28418 - 19968: jis0208<<14 | 0x28<<7 | 0x19,\n\t28420 - 19968: jis0212<<14 | 0x27<<7 | 0x20,\n\t28422 - 19968: jis0208<<14 | 0x1B<<7 | 0x1E,\n\t28424 - 19968: jis0212<<14 | 0x27<<7 | 0x21,\n\t28425 - 19968: jis0208<<14 | 0x18<<7 | 0x56,\n\t28426 - 19968: jis0212<<14 | 0x27<<7 | 0x22,\n\t28428 - 19968: jis0212<<14 | 0x27<<7 | 0x23,\n\t28429 - 19968: jis0212<<14 | 0x27<<7 | 0x24,\n\t28431 - 19968: jis0208<<14 | 0x2E<<7 | 0x12,\n\t28433 - 19968: jis0208<<14 | 0x3D<<7 | 0x53,\n\t28435 - 19968: jis0208<<14 | 0x3E<<7 | 0x01,\n\t28436 - 19968: jis0208<<14 | 0x10<<7 | 0x48,\n\t28437 - 19968: jis0208<<14 | 0x20<<7 | 0x45,\n\t28438 - 19968: jis0212<<14 | 0x27<<7 | 0x25,\n\t28440 - 19968: jis0212<<14 | 0x27<<7 | 0x26,\n\t28442 - 19968: jis0212<<14 | 0x27<<7 | 0x27,\n\t28443 - 19968: jis0212<<14 | 0x27<<7 | 0x28,\n\t28448 - 19968: jis0208<<14 | 0x26<<7 | 0x58,\n\t28450 - 19968: jis0208<<14 | 0x13<<7 | 0x20,\n\t28451 - 19968: jis0208<<14 | 0x2D<<7 | 0x59,\n\t28454 - 19968: jis0212<<14 | 0x27<<7 | 0x29,\n\t28457 - 19968: jis0212<<14 | 0x27<<7 | 0x2A,\n\t28458 - 19968: jis0212<<14 | 0x27<<7 | 0x2B,\n\t28459 - 19968: jis0208<<14 | 0x2B<<7 | 0x00,\n\t28460 - 19968: jis0208<<14 | 0x23<<7 | 0x31,\n\t28461 - 19968: jis0212<<14 | 0x27<<7 | 0x32,\n\t28463 - 19968: jis0212<<14 | 0x27<<7 | 0x2C,\n\t28464 - 19968: jis0212<<14 | 0x27<<7 | 0x2D,\n\t28465 - 19968: jis0208<<14 | 0x3D<<7 | 0x5A,\n\t28466 - 19968: jis0208<<14 | 0x3D<<7 | 0x5C,\n\t28467 - 19968: jis0212<<14 | 0x27<<7 | 0x2E,\n\t28470 - 19968: jis0212<<14 | 0x27<<7 | 0x2F,\n\t28472 - 19968: jis0208<<14 | 0x20<<7 | 0x11,\n\t28475 - 19968: jis0212<<14 | 0x27<<7 | 0x30,\n\t28476 - 19968: jis0212<<14 | 0x27<<7 | 0x31,\n\t28478 - 19968: jis0208<<14 | 0x3E<<7 | 0x00,\n\t28479 - 19968: jis0208<<14 | 0x3D<<7 | 0x58,\n\t28481 - 19968: jis0208<<14 | 0x3D<<7 | 0x52,\n\t28485 - 19968: jis0208<<14 | 0x13<<7 | 0x22,\n\t28495 - 19968: jis0212<<14 | 0x27<<7 | 0x33,\n\t28497 - 19968: jis0212<<14 | 0x27<<7 | 0x34,\n\t28498 - 19968: jis0212<<14 | 0x27<<7 | 0x35,\n\t28499 - 19968: jis0212<<14 | 0x27<<7 | 0x36,\n\t28500 - 19968: jis0208<<14 | 0x16<<7 | 0x48,\n\t28503 - 19968: jis0212<<14 | 0x27<<7 | 0x37,\n\t28504 - 19968: jis0208<<14 | 0x3E<<7 | 0x0E,\n\t28505 - 19968: jis0212<<14 | 0x27<<7 | 0x38,\n\t28506 - 19968: jis0212<<14 | 0x27<<7 | 0x39,\n\t28507 - 19968: jis0208<<14 | 0x3E<<7 | 0x09,\n\t28508 - 19968: jis0208<<14 | 0x1F<<7 | 0x57,\n\t28509 - 19968: jis0212<<14 | 0x27<<7 | 0x3A,\n\t28510 - 19968: jis0212<<14 | 0x27<<7 | 0x3B,\n\t28511 - 19968: jis0208<<14 | 0x12<<7 | 0x42,\n\t28513 - 19968: jis0212<<14 | 0x27<<7 | 0x3C,\n\t28514 - 19968: jis0212<<14 | 0x27<<7 | 0x3D,\n\t28516 - 19968: jis0208<<14 | 0x1C<<7 | 0x40,\n\t28518 - 19968: jis0208<<14 | 0x3E<<7 | 0x12,\n\t28520 - 19968: jis0212<<14 | 0x27<<7 | 0x3E,\n\t28524 - 19968: jis0212<<14 | 0x27<<7 | 0x3F,\n\t28525 - 19968: jis0208<<14 | 0x3E<<7 | 0x0B,\n\t28526 - 19968: jis0208<<14 | 0x23<<7 | 0x0B,\n\t28527 - 19968: jis0208<<14 | 0x3E<<7 | 0x08,\n\t28528 - 19968: jis0208<<14 | 0x23<<7 | 0x38,\n\t28532 - 19968: jis0208<<14 | 0x3E<<7 | 0x2B,\n\t28536 - 19968: jis0208<<14 | 0x3E<<7 | 0x05,\n\t28538 - 19968: jis0208<<14 | 0x3E<<7 | 0x04,\n\t28540 - 19968: jis0208<<14 | 0x3E<<7 | 0x0D,\n\t28541 - 19968: jis0212<<14 | 0x27<<7 | 0x40,\n\t28542 - 19968: jis0212<<14 | 0x27<<7 | 0x41,\n\t28544 - 19968: jis0208<<14 | 0x3E<<7 | 0x07,\n\t28545 - 19968: jis0208<<14 | 0x3E<<7 | 0x06,\n\t28546 - 19968: jis0208<<14 | 0x3E<<7 | 0x0C,\n\t28547 - 19968: jis0212<<14 | 0x27<<7 | 0x42,\n\t28548 - 19968: jis0208<<14 | 0x1F<<7 | 0x00,\n\t28550 - 19968: jis0208<<14 | 0x3E<<7 | 0x03,\n\t28551 - 19968: jis0212<<14 | 0x27<<7 | 0x43,\n\t28552 - 19968: jis0208<<14 | 0x59<<7 | 0x4D,\n\t28555 - 19968: jis0212<<14 | 0x27<<7 | 0x45,\n\t28556 - 19968: jis0212<<14 | 0x27<<7 | 0x46,\n\t28557 - 19968: jis0212<<14 | 0x27<<7 | 0x47,\n\t28558 - 19968: jis0208<<14 | 0x3E<<7 | 0x0F,\n\t28560 - 19968: jis0212<<14 | 0x27<<7 | 0x48,\n\t28561 - 19968: jis0208<<14 | 0x3E<<7 | 0x10,\n\t28562 - 19968: jis0212<<14 | 0x27<<7 | 0x49,\n\t28563 - 19968: jis0212<<14 | 0x27<<7 | 0x4A,\n\t28564 - 19968: jis0212<<14 | 0x27<<7 | 0x4B,\n\t28566 - 19968: jis0212<<14 | 0x27<<7 | 0x4C,\n\t28567 - 19968: jis0208<<14 | 0x13<<7 | 0x21,\n\t28570 - 19968: jis0212<<14 | 0x27<<7 | 0x4D,\n\t28575 - 19968: jis0212<<14 | 0x27<<7 | 0x4E,\n\t28576 - 19968: jis0212<<14 | 0x27<<7 | 0x4F,\n\t28577 - 19968: jis0208<<14 | 0x3E<<7 | 0x15,\n\t28579 - 19968: jis0208<<14 | 0x3E<<7 | 0x14,\n\t28580 - 19968: jis0208<<14 | 0x3E<<7 | 0x16,\n\t28581 - 19968: jis0212<<14 | 0x27<<7 | 0x50,\n\t28582 - 19968: jis0212<<14 | 0x27<<7 | 0x51,\n\t28583 - 19968: jis0212<<14 | 0x27<<7 | 0x52,\n\t28584 - 19968: jis0212<<14 | 0x27<<7 | 0x53,\n\t28586 - 19968: jis0208<<14 | 0x3E<<7 | 0x19,\n\t28590 - 19968: jis0212<<14 | 0x27<<7 | 0x54,\n\t28591 - 19968: jis0212<<14 | 0x27<<7 | 0x55,\n\t28592 - 19968: jis0212<<14 | 0x27<<7 | 0x56,\n\t28593 - 19968: jis0208<<14 | 0x24<<7 | 0x22,\n\t28595 - 19968: jis0208<<14 | 0x3E<<7 | 0x13,\n\t28597 - 19968: jis0208<<14 | 0x59<<7 | 0x4E,\n\t28598 - 19968: jis0212<<14 | 0x27<<7 | 0x58,\n\t28601 - 19968: jis0208<<14 | 0x3E<<7 | 0x17,\n\t28604 - 19968: jis0212<<14 | 0x27<<7 | 0x59,\n\t28608 - 19968: jis0208<<14 | 0x16<<7 | 0x42,\n\t28609 - 19968: jis0208<<14 | 0x21<<7 | 0x58,\n\t28610 - 19968: jis0208<<14 | 0x3E<<7 | 0x11,\n\t28611 - 19968: jis0208<<14 | 0x26<<7 | 0x1A,\n\t28613 - 19968: jis0212<<14 | 0x27<<7 | 0x5A,\n\t28614 - 19968: jis0208<<14 | 0x3E<<7 | 0x18,\n\t28615 - 19968: jis0212<<14 | 0x27<<7 | 0x5B,\n\t28616 - 19968: jis0212<<14 | 0x27<<7 | 0x5C,\n\t28618 - 19968: jis0212<<14 | 0x27<<7 | 0x5D,\n\t28628 - 19968: jis0208<<14 | 0x3E<<7 | 0x1D,\n\t28629 - 19968: jis0208<<14 | 0x3E<<7 | 0x1B,\n\t28632 - 19968: jis0208<<14 | 0x3E<<7 | 0x1E,\n\t28634 - 19968: jis0212<<14 | 0x28<<7 | 0x00,\n\t28635 - 19968: jis0208<<14 | 0x3E<<7 | 0x21,\n\t28638 - 19968: jis0212<<14 | 0x28<<7 | 0x01,\n\t28639 - 19968: jis0208<<14 | 0x3E<<7 | 0x1A,\n\t28640 - 19968: jis0208<<14 | 0x18<<7 | 0x49,\n\t28641 - 19968: jis0208<<14 | 0x26<<7 | 0x07,\n\t28644 - 19968: jis0208<<14 | 0x3D<<7 | 0x18,\n\t28648 - 19968: jis0212<<14 | 0x28<<7 | 0x02,\n\t28649 - 19968: jis0212<<14 | 0x28<<7 | 0x03,\n\t28651 - 19968: jis0208<<14 | 0x2C<<7 | 0x53,\n\t28652 - 19968: jis0208<<14 | 0x3E<<7 | 0x1C,\n\t28654 - 19968: jis0208<<14 | 0x3E<<7 | 0x20,\n\t28655 - 19968: jis0208<<14 | 0x21<<7 | 0x54,\n\t28656 - 19968: jis0212<<14 | 0x28<<7 | 0x04,\n\t28657 - 19968: jis0208<<14 | 0x3E<<7 | 0x1F,\n\t28659 - 19968: jis0208<<14 | 0x3E<<7 | 0x0A,\n\t28661 - 19968: jis0208<<14 | 0x59<<7 | 0x4F,\n\t28662 - 19968: jis0208<<14 | 0x4E<<7 | 0x48,\n\t28665 - 19968: jis0212<<14 | 0x28<<7 | 0x06,\n\t28666 - 19968: jis0208<<14 | 0x3E<<7 | 0x24,\n\t28668 - 19968: jis0212<<14 | 0x28<<7 | 0x07,\n\t28669 - 19968: jis0212<<14 | 0x28<<7 | 0x08,\n\t28670 - 19968: jis0208<<14 | 0x3E<<7 | 0x28,\n\t28672 - 19968: jis0212<<14 | 0x28<<7 | 0x09,\n\t28673 - 19968: jis0208<<14 | 0x3E<<7 | 0x26,\n\t28677 - 19968: jis0208<<14 | 0x59<<7 | 0x50,\n\t28678 - 19968: jis0212<<14 | 0x28<<7 | 0x0B,\n\t28679 - 19968: jis0208<<14 | 0x59<<7 | 0x51,\n\t28681 - 19968: jis0208<<14 | 0x3E<<7 | 0x22,\n\t28683 - 19968: jis0208<<14 | 0x3E<<7 | 0x23,\n\t28685 - 19968: jis0212<<14 | 0x28<<7 | 0x0D,\n\t28687 - 19968: jis0208<<14 | 0x3E<<7 | 0x27,\n\t28689 - 19968: jis0208<<14 | 0x3E<<7 | 0x25,\n\t28693 - 19968: jis0208<<14 | 0x28<<7 | 0x2D,\n\t28695 - 19968: jis0212<<14 | 0x28<<7 | 0x0E,\n\t28696 - 19968: jis0208<<14 | 0x3E<<7 | 0x2D,\n\t28698 - 19968: jis0208<<14 | 0x3E<<7 | 0x2A,\n\t28699 - 19968: jis0208<<14 | 0x3E<<7 | 0x29,\n\t28701 - 19968: jis0208<<14 | 0x3E<<7 | 0x2C,\n\t28702 - 19968: jis0208<<14 | 0x25<<7 | 0x33,\n\t28703 - 19968: jis0208<<14 | 0x3E<<7 | 0x2E,\n\t28704 - 19968: jis0212<<14 | 0x28<<7 | 0x0F,\n\t28707 - 19968: jis0212<<14 | 0x28<<7 | 0x10,\n\t28710 - 19968: jis0208<<14 | 0x22<<7 | 0x54,\n\t28711 - 19968: jis0208<<14 | 0x21<<7 | 0x4C,\n\t28712 - 19968: jis0208<<14 | 0x59<<7 | 0x52,\n\t28716 - 19968: jis0208<<14 | 0x1F<<7 | 0x04,\n\t28719 - 19968: jis0212<<14 | 0x28<<7 | 0x11,\n\t28720 - 19968: jis0208<<14 | 0x3E<<7 | 0x2F,\n\t28722 - 19968: jis0208<<14 | 0x3E<<7 | 0x31,\n\t28724 - 19968: jis0212<<14 | 0x28<<7 | 0x12,\n\t28727 - 19968: jis0212<<14 | 0x28<<7 | 0x13,\n\t28729 - 19968: jis0212<<14 | 0x28<<7 | 0x14,\n\t28732 - 19968: jis0212<<14 | 0x28<<7 | 0x15,\n\t28734 - 19968: jis0208<<14 | 0x3E<<7 | 0x30,\n\t28739 - 19968: jis0212<<14 | 0x28<<7 | 0x16,\n\t28740 - 19968: jis0212<<14 | 0x28<<7 | 0x17,\n\t28744 - 19968: jis0212<<14 | 0x28<<7 | 0x18,\n\t28745 - 19968: jis0212<<14 | 0x28<<7 | 0x19,\n\t28746 - 19968: jis0212<<14 | 0x28<<7 | 0x1A,\n\t28747 - 19968: jis0212<<14 | 0x28<<7 | 0x1B,\n\t28748 - 19968: jis0208<<14 | 0x3D<<7 | 0x54,\n\t28750 - 19968: jis0212<<14 | 0x28<<7 | 0x20,\n\t28753 - 19968: jis0208<<14 | 0x3E<<7 | 0x32,\n\t28756 - 19968: jis0212<<14 | 0x28<<7 | 0x1C,\n\t28757 - 19968: jis0212<<14 | 0x28<<7 | 0x1D,\n\t28760 - 19968: jis0208<<14 | 0x25<<7 | 0x46,\n\t28765 - 19968: jis0212<<14 | 0x28<<7 | 0x1E,\n\t28766 - 19968: jis0212<<14 | 0x28<<7 | 0x1F,\n\t28771 - 19968: jis0208<<14 | 0x3E<<7 | 0x33,\n\t28772 - 19968: jis0212<<14 | 0x28<<7 | 0x21,\n\t28773 - 19968: jis0212<<14 | 0x28<<7 | 0x22,\n\t28779 - 19968: jis0208<<14 | 0x11<<7 | 0x2F,\n\t28780 - 19968: jis0212<<14 | 0x28<<7 | 0x23,\n\t28782 - 19968: jis0212<<14 | 0x28<<7 | 0x24,\n\t28783 - 19968: jis0208<<14 | 0x24<<7 | 0x53,\n\t28784 - 19968: jis0208<<14 | 0x12<<7 | 0x04,\n\t28789 - 19968: jis0212<<14 | 0x28<<7 | 0x25,\n\t28790 - 19968: jis0212<<14 | 0x28<<7 | 0x26,\n\t28792 - 19968: jis0208<<14 | 0x14<<7 | 0x43,\n\t28796 - 19968: jis0208<<14 | 0x1B<<7 | 0x3D,\n\t28797 - 19968: jis0208<<14 | 0x19<<7 | 0x31,\n\t28798 - 19968: jis0212<<14 | 0x28<<7 | 0x27,\n\t28801 - 19968: jis0212<<14 | 0x28<<7 | 0x28,\n\t28805 - 19968: jis0208<<14 | 0x59<<7 | 0x53,\n\t28806 - 19968: jis0212<<14 | 0x28<<7 | 0x2A,\n\t28809 - 19968: jis0208<<14 | 0x2E<<7 | 0x06,\n\t28810 - 19968: jis0208<<14 | 0x1E<<7 | 0x45,\n\t28814 - 19968: jis0208<<14 | 0x10<<7 | 0x49,\n\t28818 - 19968: jis0208<<14 | 0x3E<<7 | 0x35,\n\t28820 - 19968: jis0212<<14 | 0x28<<7 | 0x2B,\n\t28821 - 19968: jis0212<<14 | 0x28<<7 | 0x2C,\n\t28822 - 19968: jis0212<<14 | 0x28<<7 | 0x2D,\n\t28823 - 19968: jis0212<<14 | 0x28<<7 | 0x2E,\n\t28824 - 19968: jis0212<<14 | 0x28<<7 | 0x2F,\n\t28825 - 19968: jis0208<<14 | 0x3E<<7 | 0x34,\n\t28827 - 19968: jis0212<<14 | 0x28<<7 | 0x30,\n\t28836 - 19968: jis0212<<14 | 0x28<<7 | 0x31,\n\t28843 - 19968: jis0208<<14 | 0x59<<7 | 0x54,\n\t28844 - 19968: jis0208<<14 | 0x3E<<7 | 0x38,\n\t28845 - 19968: jis0208<<14 | 0x22<<7 | 0x19,\n\t28846 - 19968: jis0208<<14 | 0x3E<<7 | 0x3B,\n\t28847 - 19968: jis0208<<14 | 0x3E<<7 | 0x36,\n\t28848 - 19968: jis0212<<14 | 0x28<<7 | 0x33,\n\t28849 - 19968: jis0212<<14 | 0x28<<7 | 0x34,\n\t28851 - 19968: jis0208<<14 | 0x3E<<7 | 0x3A,\n\t28852 - 19968: jis0212<<14 | 0x28<<7 | 0x35,\n\t28855 - 19968: jis0212<<14 | 0x28<<7 | 0x36,\n\t28856 - 19968: jis0208<<14 | 0x3E<<7 | 0x39,\n\t28857 - 19968: jis0208<<14 | 0x24<<7 | 0x1F,\n\t28858 - 19968: jis0208<<14 | 0x0F<<7 | 0x38,\n\t28859 - 19968: jis0208<<14 | 0x58<<7 | 0x06,\n\t28872 - 19968: jis0208<<14 | 0x2D<<7 | 0x54,\n\t28874 - 19968: jis0212<<14 | 0x28<<7 | 0x37,\n\t28875 - 19968: jis0208<<14 | 0x3E<<7 | 0x3D,\n\t28879 - 19968: jis0208<<14 | 0x10<<7 | 0x07,\n\t28881 - 19968: jis0212<<14 | 0x28<<7 | 0x38,\n\t28883 - 19968: jis0212<<14 | 0x28<<7 | 0x39,\n\t28884 - 19968: jis0212<<14 | 0x28<<7 | 0x3A,\n\t28885 - 19968: jis0212<<14 | 0x28<<7 | 0x3B,\n\t28886 - 19968: jis0212<<14 | 0x28<<7 | 0x3C,\n\t28888 - 19968: jis0212<<14 | 0x28<<7 | 0x3D,\n\t28889 - 19968: jis0208<<14 | 0x3E<<7 | 0x3F,\n\t28892 - 19968: jis0212<<14 | 0x28<<7 | 0x3E,\n\t28893 - 19968: jis0208<<14 | 0x3E<<7 | 0x3E,\n\t28895 - 19968: jis0208<<14 | 0x3E<<7 | 0x3C,\n\t28900 - 19968: jis0212<<14 | 0x28<<7 | 0x3F,\n\t28913 - 19968: jis0208<<14 | 0x3E<<7 | 0x37,\n\t28921 - 19968: jis0208<<14 | 0x2A<<7 | 0x02,\n\t28922 - 19968: jis0212<<14 | 0x28<<7 | 0x40,\n\t28925 - 19968: jis0208<<14 | 0x3E<<7 | 0x41,\n\t28931 - 19968: jis0212<<14 | 0x28<<7 | 0x41,\n\t28932 - 19968: jis0208<<14 | 0x59<<7 | 0x56,\n\t28933 - 19968: jis0212<<14 | 0x28<<7 | 0x43,\n\t28934 - 19968: jis0212<<14 | 0x28<<7 | 0x44,\n\t28935 - 19968: jis0212<<14 | 0x28<<7 | 0x45,\n\t28937 - 19968: jis0208<<14 | 0x3E<<7 | 0x40,\n\t28939 - 19968: jis0212<<14 | 0x28<<7 | 0x46,\n\t28940 - 19968: jis0212<<14 | 0x28<<7 | 0x47,\n\t28943 - 19968: jis0208<<14 | 0x59<<7 | 0x55,\n\t28948 - 19968: jis0208<<14 | 0x10<<7 | 0x4A,\n\t28953 - 19968: jis0208<<14 | 0x3E<<7 | 0x43,\n\t28954 - 19968: jis0208<<14 | 0x29<<7 | 0x11,\n\t28956 - 19968: jis0208<<14 | 0x3E<<7 | 0x42,\n\t28958 - 19968: jis0212<<14 | 0x28<<7 | 0x49,\n\t28960 - 19968: jis0212<<14 | 0x28<<7 | 0x4A,\n\t28961 - 19968: jis0208<<14 | 0x2B<<7 | 0x14,\n\t28966 - 19968: jis0208<<14 | 0x1D<<7 | 0x26,\n\t28971 - 19968: jis0212<<14 | 0x28<<7 | 0x4B,\n\t28973 - 19968: jis0212<<14 | 0x28<<7 | 0x4C,\n\t28975 - 19968: jis0212<<14 | 0x28<<7 | 0x4D,\n\t28976 - 19968: jis0212<<14 | 0x28<<7 | 0x4E,\n\t28977 - 19968: jis0212<<14 | 0x28<<7 | 0x4F,\n\t28982 - 19968: jis0208<<14 | 0x20<<7 | 0x12,\n\t28984 - 19968: jis0212<<14 | 0x28<<7 | 0x50,\n\t28988 - 19968: jis0208<<14 | 0x1D<<7 | 0x25,\n\t28993 - 19968: jis0212<<14 | 0x28<<7 | 0x51,\n\t28997 - 19968: jis0212<<14 | 0x28<<7 | 0x52,\n\t28998 - 19968: jis0208<<14 | 0x59<<7 | 0x58,\n\t28999 - 19968: jis0208<<14 | 0x59<<7 | 0x59,\n\t29001 - 19968: jis0208<<14 | 0x2D<<7 | 0x5A,\n\t29002 - 19968: jis0212<<14 | 0x28<<7 | 0x55,\n\t29003 - 19968: jis0212<<14 | 0x28<<7 | 0x56,\n\t29004 - 19968: jis0208<<14 | 0x3E<<7 | 0x49,\n\t29006 - 19968: jis0208<<14 | 0x1F<<7 | 0x58,\n\t29008 - 19968: jis0212<<14 | 0x28<<7 | 0x57,\n\t29010 - 19968: jis0212<<14 | 0x28<<7 | 0x58,\n\t29013 - 19968: jis0208<<14 | 0x3E<<7 | 0x45,\n\t29014 - 19968: jis0208<<14 | 0x3E<<7 | 0x4A,\n\t29015 - 19968: jis0212<<14 | 0x28<<7 | 0x59,\n\t29017 - 19968: jis0208<<14 | 0x10<<7 | 0x4B,\n\t29018 - 19968: jis0212<<14 | 0x28<<7 | 0x5A,\n\t29020 - 19968: jis0208<<14 | 0x59<<7 | 0x57,\n\t29022 - 19968: jis0212<<14 | 0x28<<7 | 0x5C,\n\t29024 - 19968: jis0212<<14 | 0x28<<7 | 0x5D,\n\t29026 - 19968: jis0208<<14 | 0x3E<<7 | 0x48,\n\t29028 - 19968: jis0208<<14 | 0x26<<7 | 0x40,\n\t29029 - 19968: jis0208<<14 | 0x3E<<7 | 0x44,\n\t29030 - 19968: jis0208<<14 | 0x3E<<7 | 0x47,\n\t29031 - 19968: jis0208<<14 | 0x1D<<7 | 0x27,\n\t29032 - 19968: jis0212<<14 | 0x29<<7 | 0x00,\n\t29033 - 19968: jis0208<<14 | 0x27<<7 | 0x30,\n\t29036 - 19968: jis0208<<14 | 0x3E<<7 | 0x4B,\n\t29038 - 19968: jis0208<<14 | 0x1B<<7 | 0x30,\n\t29049 - 19968: jis0212<<14 | 0x29<<7 | 0x01,\n\t29053 - 19968: jis0208<<14 | 0x1F<<7 | 0x59,\n\t29056 - 19968: jis0212<<14 | 0x29<<7 | 0x02,\n\t29060 - 19968: jis0208<<14 | 0x3E<<7 | 0x4E,\n\t29061 - 19968: jis0212<<14 | 0x29<<7 | 0x03,\n\t29063 - 19968: jis0212<<14 | 0x29<<7 | 0x04,\n\t29064 - 19968: jis0208<<14 | 0x3E<<7 | 0x46,\n\t29066 - 19968: jis0208<<14 | 0x16<<7 | 0x06,\n\t29068 - 19968: jis0212<<14 | 0x29<<7 | 0x05,\n\t29071 - 19968: jis0208<<14 | 0x3E<<7 | 0x4C,\n\t29074 - 19968: jis0212<<14 | 0x29<<7 | 0x06,\n\t29076 - 19968: jis0208<<14 | 0x2C<<7 | 0x2F,\n\t29077 - 19968: jis0208<<14 | 0x3E<<7 | 0x4F,\n\t29081 - 19968: jis0208<<14 | 0x53<<7 | 0x05,\n\t29082 - 19968: jis0212<<14 | 0x29<<7 | 0x07,\n\t29083 - 19968: jis0212<<14 | 0x29<<7 | 0x08,\n\t29087 - 19968: jis0208<<14 | 0x1C<<7 | 0x2E,\n\t29088 - 19968: jis0212<<14 | 0x29<<7 | 0x09,\n\t29090 - 19968: jis0212<<14 | 0x29<<7 | 0x0A,\n\t29096 - 19968: jis0208<<14 | 0x3E<<7 | 0x50,\n\t29100 - 19968: jis0208<<14 | 0x3E<<7 | 0x51,\n\t29103 - 19968: jis0212<<14 | 0x29<<7 | 0x0B,\n\t29104 - 19968: jis0212<<14 | 0x29<<7 | 0x0C,\n\t29105 - 19968: jis0208<<14 | 0x26<<7 | 0x0D,\n\t29106 - 19968: jis0212<<14 | 0x29<<7 | 0x0D,\n\t29107 - 19968: jis0212<<14 | 0x29<<7 | 0x0E,\n\t29113 - 19968: jis0208<<14 | 0x3E<<7 | 0x53,\n\t29114 - 19968: jis0212<<14 | 0x29<<7 | 0x0F,\n\t29118 - 19968: jis0208<<14 | 0x3E<<7 | 0x54,\n\t29119 - 19968: jis0212<<14 | 0x29<<7 | 0x10,\n\t29120 - 19968: jis0212<<14 | 0x29<<7 | 0x11,\n\t29121 - 19968: jis0208<<14 | 0x59<<7 | 0x5B,\n\t29123 - 19968: jis0208<<14 | 0x26<<7 | 0x12,\n\t29124 - 19968: jis0212<<14 | 0x29<<7 | 0x13,\n\t29128 - 19968: jis0208<<14 | 0x24<<7 | 0x54,\n\t29129 - 19968: jis0208<<14 | 0x3E<<7 | 0x56,\n\t29131 - 19968: jis0212<<14 | 0x29<<7 | 0x14,\n\t29132 - 19968: jis0212<<14 | 0x29<<7 | 0x15,\n\t29134 - 19968: jis0208<<14 | 0x3E<<7 | 0x58,\n\t29136 - 19968: jis0208<<14 | 0x2D<<7 | 0x34,\n\t29138 - 19968: jis0208<<14 | 0x3E<<7 | 0x55,\n\t29139 - 19968: jis0212<<14 | 0x29<<7 | 0x16,\n\t29140 - 19968: jis0208<<14 | 0x3E<<7 | 0x57,\n\t29141 - 19968: jis0208<<14 | 0x10<<7 | 0x4C,\n\t29142 - 19968: jis0212<<14 | 0x29<<7 | 0x17,\n\t29143 - 19968: jis0208<<14 | 0x3E<<7 | 0x52,\n\t29145 - 19968: jis0212<<14 | 0x29<<7 | 0x18,\n\t29146 - 19968: jis0212<<14 | 0x29<<7 | 0x19,\n\t29148 - 19968: jis0212<<14 | 0x29<<7 | 0x1A,\n\t29151 - 19968: jis0208<<14 | 0x32<<7 | 0x3A,\n\t29152 - 19968: jis0208<<14 | 0x3E<<7 | 0x59,\n\t29157 - 19968: jis0208<<14 | 0x20<<7 | 0x46,\n\t29158 - 19968: jis0208<<14 | 0x1A<<7 | 0x17,\n\t29159 - 19968: jis0208<<14 | 0x3E<<7 | 0x5B,\n\t29164 - 19968: jis0208<<14 | 0x3E<<7 | 0x5A,\n\t29165 - 19968: jis0208<<14 | 0x1E<<7 | 0x03,\n\t29166 - 19968: jis0208<<14 | 0x31<<7 | 0x38,\n\t29173 - 19968: jis0208<<14 | 0x3E<<7 | 0x5C,\n\t29176 - 19968: jis0212<<14 | 0x29<<7 | 0x1B,\n\t29177 - 19968: jis0208<<14 | 0x3F<<7 | 0x00,\n\t29179 - 19968: jis0208<<14 | 0x3E<<7 | 0x4D,\n\t29180 - 19968: jis0208<<14 | 0x3E<<7 | 0x5D,\n\t29182 - 19968: jis0208<<14 | 0x59<<7 | 0x5C,\n\t29183 - 19968: jis0208<<14 | 0x3F<<7 | 0x01,\n\t29184 - 19968: jis0212<<14 | 0x29<<7 | 0x1D,\n\t29190 - 19968: jis0208<<14 | 0x26<<7 | 0x59,\n\t29191 - 19968: jis0212<<14 | 0x29<<7 | 0x1E,\n\t29192 - 19968: jis0212<<14 | 0x29<<7 | 0x1F,\n\t29193 - 19968: jis0212<<14 | 0x29<<7 | 0x20,\n\t29197 - 19968: jis0208<<14 | 0x3F<<7 | 0x02,\n\t29200 - 19968: jis0208<<14 | 0x3F<<7 | 0x03,\n\t29203 - 19968: jis0212<<14 | 0x29<<7 | 0x21,\n\t29207 - 19968: jis0212<<14 | 0x29<<7 | 0x22,\n\t29210 - 19968: jis0212<<14 | 0x29<<7 | 0x23,\n\t29211 - 19968: jis0208<<14 | 0x3F<<7 | 0x04,\n\t29213 - 19968: jis0212<<14 | 0x29<<7 | 0x24,\n\t29215 - 19968: jis0212<<14 | 0x29<<7 | 0x25,\n\t29220 - 19968: jis0212<<14 | 0x29<<7 | 0x26,\n\t29224 - 19968: jis0208<<14 | 0x3F<<7 | 0x05,\n\t29226 - 19968: jis0208<<14 | 0x23<<7 | 0x3D,\n\t29227 - 19968: jis0212<<14 | 0x29<<7 | 0x27,\n\t29228 - 19968: jis0208<<14 | 0x3F<<7 | 0x07,\n\t29229 - 19968: jis0208<<14 | 0x3F<<7 | 0x06,\n\t29231 - 19968: jis0212<<14 | 0x29<<7 | 0x28,\n\t29232 - 19968: jis0208<<14 | 0x3F<<7 | 0x08,\n\t29234 - 19968: jis0208<<14 | 0x3F<<7 | 0x09,\n\t29236 - 19968: jis0212<<14 | 0x29<<7 | 0x29,\n\t29237 - 19968: jis0208<<14 | 0x1B<<7 | 0x3E,\n\t29238 - 19968: jis0208<<14 | 0x28<<7 | 0x42,\n\t29240 - 19968: jis0212<<14 | 0x29<<7 | 0x2A,\n\t29241 - 19968: jis0212<<14 | 0x29<<7 | 0x2B,\n\t29242 - 19968: jis0208<<14 | 0x2B<<7 | 0x4B,\n\t29243 - 19968: jis0208<<14 | 0x3F<<7 | 0x0A,\n\t29244 - 19968: jis0208<<14 | 0x3F<<7 | 0x0B,\n\t29245 - 19968: jis0208<<14 | 0x20<<7 | 0x35,\n\t29246 - 19968: jis0208<<14 | 0x1B<<7 | 0x03,\n\t29247 - 19968: jis0208<<14 | 0x3F<<7 | 0x0C,\n\t29248 - 19968: jis0208<<14 | 0x3F<<7 | 0x0D,\n\t29249 - 19968: jis0212<<14 | 0x29<<7 | 0x2C,\n\t29250 - 19968: jis0212<<14 | 0x29<<7 | 0x2D,\n\t29251 - 19968: jis0212<<14 | 0x29<<7 | 0x2E,\n\t29253 - 19968: jis0212<<14 | 0x29<<7 | 0x2F,\n\t29254 - 19968: jis0208<<14 | 0x3F<<7 | 0x0E,\n\t29255 - 19968: jis0208<<14 | 0x29<<7 | 0x31,\n\t29256 - 19968: jis0208<<14 | 0x27<<7 | 0x26,\n\t29259 - 19968: jis0208<<14 | 0x3F<<7 | 0x0F,\n\t29260 - 19968: jis0208<<14 | 0x26<<7 | 0x36,\n\t29262 - 19968: jis0212<<14 | 0x29<<7 | 0x30,\n\t29263 - 19968: jis0212<<14 | 0x29<<7 | 0x31,\n\t29264 - 19968: jis0212<<14 | 0x29<<7 | 0x32,\n\t29266 - 19968: jis0208<<14 | 0x23<<7 | 0x0C,\n\t29267 - 19968: jis0212<<14 | 0x29<<7 | 0x33,\n\t29269 - 19968: jis0212<<14 | 0x29<<7 | 0x34,\n\t29270 - 19968: jis0212<<14 | 0x29<<7 | 0x35,\n\t29272 - 19968: jis0208<<14 | 0x3F<<7 | 0x10,\n\t29273 - 19968: jis0208<<14 | 0x11<<7 | 0x46,\n\t29274 - 19968: jis0212<<14 | 0x29<<7 | 0x36,\n\t29275 - 19968: jis0208<<14 | 0x14<<7 | 0x4C,\n\t29276 - 19968: jis0212<<14 | 0x29<<7 | 0x37,\n\t29277 - 19968: jis0208<<14 | 0x2B<<7 | 0x25,\n\t29278 - 19968: jis0212<<14 | 0x29<<7 | 0x38,\n\t29279 - 19968: jis0208<<14 | 0x2B<<7 | 0x15,\n\t29280 - 19968: jis0212<<14 | 0x29<<7 | 0x39,\n\t29281 - 19968: jis0208<<14 | 0x11<<7 | 0x13,\n\t29282 - 19968: jis0208<<14 | 0x2E<<7 | 0x13,\n\t29283 - 19968: jis0212<<14 | 0x29<<7 | 0x3A,\n\t29287 - 19968: jis0208<<14 | 0x2A<<7 | 0x31,\n\t29288 - 19968: jis0212<<14 | 0x29<<7 | 0x3B,\n\t29289 - 19968: jis0208<<14 | 0x29<<7 | 0x09,\n\t29291 - 19968: jis0212<<14 | 0x29<<7 | 0x3C,\n\t29294 - 19968: jis0212<<14 | 0x29<<7 | 0x3D,\n\t29295 - 19968: jis0212<<14 | 0x29<<7 | 0x3E,\n\t29297 - 19968: jis0212<<14 | 0x29<<7 | 0x3F,\n\t29298 - 19968: jis0208<<14 | 0x1F<<7 | 0x16,\n\t29300 - 19968: jis0208<<14 | 0x3F<<7 | 0x11,\n\t29303 - 19968: jis0212<<14 | 0x29<<7 | 0x40,\n\t29304 - 19968: jis0212<<14 | 0x29<<7 | 0x41,\n\t29305 - 19968: jis0208<<14 | 0x25<<7 | 0x22,\n\t29307 - 19968: jis0212<<14 | 0x29<<7 | 0x42,\n\t29308 - 19968: jis0212<<14 | 0x29<<7 | 0x43,\n\t29309 - 19968: jis0208<<14 | 0x17<<7 | 0x02,\n\t29310 - 19968: jis0208<<14 | 0x3F<<7 | 0x12,\n\t29311 - 19968: jis0212<<14 | 0x29<<7 | 0x44,\n\t29312 - 19968: jis0208<<14 | 0x19<<7 | 0x33,\n\t29313 - 19968: jis0208<<14 | 0x3F<<7 | 0x14,\n\t29314 - 19968: jis0208<<14 | 0x3F<<7 | 0x13,\n\t29316 - 19968: jis0212<<14 | 0x29<<7 | 0x45,\n\t29319 - 19968: jis0208<<14 | 0x3F<<7 | 0x15,\n\t29321 - 19968: jis0212<<14 | 0x29<<7 | 0x46,\n\t29325 - 19968: jis0212<<14 | 0x29<<7 | 0x47,\n\t29326 - 19968: jis0212<<14 | 0x29<<7 | 0x48,\n\t29330 - 19968: jis0208<<14 | 0x3F<<7 | 0x16,\n\t29331 - 19968: jis0212<<14 | 0x29<<7 | 0x49,\n\t29334 - 19968: jis0208<<14 | 0x3F<<7 | 0x17,\n\t29339 - 19968: jis0212<<14 | 0x29<<7 | 0x4A,\n\t29344 - 19968: jis0208<<14 | 0x14<<7 | 0x1D,\n\t29346 - 19968: jis0208<<14 | 0x3F<<7 | 0x18,\n\t29351 - 19968: jis0208<<14 | 0x3F<<7 | 0x19,\n\t29352 - 19968: jis0212<<14 | 0x29<<7 | 0x4B,\n\t29356 - 19968: jis0208<<14 | 0x17<<7 | 0x03,\n\t29357 - 19968: jis0212<<14 | 0x29<<7 | 0x4C,\n\t29358 - 19968: jis0212<<14 | 0x29<<7 | 0x4D,\n\t29359 - 19968: jis0208<<14 | 0x27<<7 | 0x27,\n\t29361 - 19968: jis0208<<14 | 0x59<<7 | 0x5D,\n\t29362 - 19968: jis0208<<14 | 0x3F<<7 | 0x1B,\n\t29364 - 19968: jis0212<<14 | 0x29<<7 | 0x4F,\n\t29366 - 19968: jis0208<<14 | 0x1D<<7 | 0x54,\n\t29369 - 19968: jis0208<<14 | 0x3F<<7 | 0x1A,\n\t29374 - 19968: jis0208<<14 | 0x5A<<7 | 0x00,\n\t29377 - 19968: jis0212<<14 | 0x29<<7 | 0x51,\n\t29378 - 19968: jis0208<<14 | 0x15<<7 | 0x17,\n\t29379 - 19968: jis0208<<14 | 0x3F<<7 | 0x1C,\n\t29380 - 19968: jis0208<<14 | 0x3F<<7 | 0x1E,\n\t29382 - 19968: jis0208<<14 | 0x3F<<7 | 0x1D,\n\t29383 - 19968: jis0212<<14 | 0x29<<7 | 0x52,\n\t29385 - 19968: jis0212<<14 | 0x29<<7 | 0x53,\n\t29388 - 19968: jis0212<<14 | 0x29<<7 | 0x54,\n\t29390 - 19968: jis0208<<14 | 0x3F<<7 | 0x1F,\n\t29392 - 19968: jis0208<<14 | 0x17<<7 | 0x30,\n\t29394 - 19968: jis0208<<14 | 0x3F<<7 | 0x20,\n\t29397 - 19968: jis0212<<14 | 0x29<<7 | 0x55,\n\t29398 - 19968: jis0212<<14 | 0x29<<7 | 0x56,\n\t29399 - 19968: jis0208<<14 | 0x15<<7 | 0x48,\n\t29400 - 19968: jis0212<<14 | 0x29<<7 | 0x57,\n\t29401 - 19968: jis0208<<14 | 0x20<<7 | 0x1F,\n\t29403 - 19968: jis0208<<14 | 0x18<<7 | 0x5C,\n\t29407 - 19968: jis0212<<14 | 0x29<<7 | 0x58,\n\t29408 - 19968: jis0208<<14 | 0x3F<<7 | 0x22,\n\t29409 - 19968: jis0208<<14 | 0x3F<<7 | 0x23,\n\t29410 - 19968: jis0208<<14 | 0x3F<<7 | 0x21,\n\t29413 - 19968: jis0212<<14 | 0x29<<7 | 0x59,\n\t29417 - 19968: jis0208<<14 | 0x1B<<7 | 0x4C,\n\t29420 - 19968: jis0208<<14 | 0x25<<7 | 0x27,\n\t29421 - 19968: jis0208<<14 | 0x15<<7 | 0x18,\n\t29427 - 19968: jis0212<<14 | 0x29<<7 | 0x5A,\n\t29428 - 19968: jis0212<<14 | 0x29<<7 | 0x5B,\n\t29431 - 19968: jis0208<<14 | 0x3F<<7 | 0x25,\n\t29432 - 19968: jis0208<<14 | 0x22<<7 | 0x0B,\n\t29433 - 19968: jis0208<<14 | 0x3F<<7 | 0x24,\n\t29434 - 19968: jis0212<<14 | 0x29<<7 | 0x5C,\n\t29435 - 19968: jis0212<<14 | 0x29<<7 | 0x5D,\n\t29436 - 19968: jis0208<<14 | 0x2E<<7 | 0x14,\n\t29437 - 19968: jis0208<<14 | 0x26<<7 | 0x41,\n\t29438 - 19968: jis0212<<14 | 0x2A<<7 | 0x00,\n\t29442 - 19968: jis0212<<14 | 0x2A<<7 | 0x01,\n\t29444 - 19968: jis0212<<14 | 0x2A<<7 | 0x02,\n\t29445 - 19968: jis0212<<14 | 0x2A<<7 | 0x03,\n\t29447 - 19968: jis0212<<14 | 0x2A<<7 | 0x04,\n\t29450 - 19968: jis0208<<14 | 0x3F<<7 | 0x28,\n\t29451 - 19968: jis0212<<14 | 0x2A<<7 | 0x05,\n\t29453 - 19968: jis0212<<14 | 0x2A<<7 | 0x06,\n\t29458 - 19968: jis0212<<14 | 0x2A<<7 | 0x07,\n\t29459 - 19968: jis0212<<14 | 0x2A<<7 | 0x08,\n\t29462 - 19968: jis0208<<14 | 0x3F<<7 | 0x2A,\n\t29463 - 19968: jis0208<<14 | 0x3F<<7 | 0x27,\n\t29464 - 19968: jis0212<<14 | 0x2A<<7 | 0x09,\n\t29465 - 19968: jis0212<<14 | 0x2A<<7 | 0x0A,\n\t29467 - 19968: jis0208<<14 | 0x2B<<7 | 0x33,\n\t29468 - 19968: jis0208<<14 | 0x3F<<7 | 0x29,\n\t29469 - 19968: jis0208<<14 | 0x3F<<7 | 0x2B,\n\t29470 - 19968: jis0212<<14 | 0x2A<<7 | 0x0B,\n\t29471 - 19968: jis0208<<14 | 0x2D<<7 | 0x23,\n\t29474 - 19968: jis0212<<14 | 0x2A<<7 | 0x0C,\n\t29476 - 19968: jis0208<<14 | 0x5A<<7 | 0x01,\n\t29477 - 19968: jis0208<<14 | 0x3F<<7 | 0x2F,\n\t29479 - 19968: jis0212<<14 | 0x2A<<7 | 0x0E,\n\t29480 - 19968: jis0212<<14 | 0x2A<<7 | 0x0F,\n\t29481 - 19968: jis0208<<14 | 0x3F<<7 | 0x2E,\n\t29482 - 19968: jis0208<<14 | 0x22<<7 | 0x55,\n\t29483 - 19968: jis0208<<14 | 0x26<<7 | 0x0C,\n\t29484 - 19968: jis0212<<14 | 0x2A<<7 | 0x10,\n\t29486 - 19968: jis0208<<14 | 0x17<<7 | 0x04,\n\t29487 - 19968: jis0208<<14 | 0x3F<<7 | 0x2D,\n\t29489 - 19968: jis0212<<14 | 0x2A<<7 | 0x11,\n\t29490 - 19968: jis0212<<14 | 0x2A<<7 | 0x12,\n\t29492 - 19968: jis0208<<14 | 0x3F<<7 | 0x2C,\n\t29493 - 19968: jis0212<<14 | 0x2A<<7 | 0x13,\n\t29494 - 19968: jis0208<<14 | 0x2C<<7 | 0x10,\n\t29495 - 19968: jis0208<<14 | 0x2C<<7 | 0x11,\n\t29498 - 19968: jis0212<<14 | 0x2A<<7 | 0x14,\n\t29499 - 19968: jis0212<<14 | 0x2A<<7 | 0x15,\n\t29501 - 19968: jis0212<<14 | 0x2A<<7 | 0x16,\n\t29502 - 19968: jis0208<<14 | 0x3F<<7 | 0x30,\n\t29503 - 19968: jis0208<<14 | 0x10<<7 | 0x4D,\n\t29507 - 19968: jis0212<<14 | 0x2A<<7 | 0x17,\n\t29508 - 19968: jis0208<<14 | 0x18<<7 | 0x55,\n\t29509 - 19968: jis0208<<14 | 0x1A<<7 | 0x41,\n\t29517 - 19968: jis0212<<14 | 0x2A<<7 | 0x18,\n\t29518 - 19968: jis0208<<14 | 0x3F<<7 | 0x31,\n\t29519 - 19968: jis0208<<14 | 0x3F<<7 | 0x32,\n\t29520 - 19968: jis0212<<14 | 0x2A<<7 | 0x19,\n\t29522 - 19968: jis0212<<14 | 0x2A<<7 | 0x1A,\n\t29526 - 19968: jis0212<<14 | 0x2A<<7 | 0x1B,\n\t29527 - 19968: jis0208<<14 | 0x3F<<7 | 0x34,\n\t29528 - 19968: jis0212<<14 | 0x2A<<7 | 0x1C,\n\t29533 - 19968: jis0212<<14 | 0x2A<<7 | 0x1D,\n\t29534 - 19968: jis0212<<14 | 0x2A<<7 | 0x1E,\n\t29535 - 19968: jis0212<<14 | 0x2A<<7 | 0x1F,\n\t29536 - 19968: jis0212<<14 | 0x2A<<7 | 0x20,\n\t29539 - 19968: jis0208<<14 | 0x1C<<7 | 0x22,\n\t29542 - 19968: jis0212<<14 | 0x2A<<7 | 0x21,\n\t29543 - 19968: jis0212<<14 | 0x2A<<7 | 0x22,\n\t29544 - 19968: jis0208<<14 | 0x3F<<7 | 0x36,\n\t29545 - 19968: jis0212<<14 | 0x2A<<7 | 0x23,\n\t29546 - 19968: jis0208<<14 | 0x3F<<7 | 0x35,\n\t29547 - 19968: jis0212<<14 | 0x2A<<7 | 0x24,\n\t29548 - 19968: jis0212<<14 | 0x2A<<7 | 0x25,\n\t29550 - 19968: jis0212<<14 | 0x2A<<7 | 0x26,\n\t29551 - 19968: jis0212<<14 | 0x2A<<7 | 0x27,\n\t29552 - 19968: jis0208<<14 | 0x3F<<7 | 0x37,\n\t29553 - 19968: jis0212<<14 | 0x2A<<7 | 0x28,\n\t29554 - 19968: jis0208<<14 | 0x12<<7 | 0x2C,\n\t29557 - 19968: jis0208<<14 | 0x3F<<7 | 0x39,\n\t29559 - 19968: jis0208<<14 | 0x5A<<7 | 0x03,\n\t29560 - 19968: jis0208<<14 | 0x3F<<7 | 0x38,\n\t29561 - 19968: jis0212<<14 | 0x2A<<7 | 0x2A,\n\t29562 - 19968: jis0208<<14 | 0x3F<<7 | 0x3B,\n\t29563 - 19968: jis0208<<14 | 0x3F<<7 | 0x3A,\n\t29564 - 19968: jis0212<<14 | 0x2A<<7 | 0x2B,\n\t29568 - 19968: jis0212<<14 | 0x2A<<7 | 0x2C,\n\t29569 - 19968: jis0212<<14 | 0x2A<<7 | 0x2D,\n\t29571 - 19968: jis0212<<14 | 0x2A<<7 | 0x2E,\n\t29572 - 19968: jis0208<<14 | 0x17<<7 | 0x1B,\n\t29573 - 19968: jis0212<<14 | 0x2A<<7 | 0x2F,\n\t29574 - 19968: jis0212<<14 | 0x2A<<7 | 0x30,\n\t29575 - 19968: jis0208<<14 | 0x2D<<7 | 0x07,\n\t29577 - 19968: jis0208<<14 | 0x15<<7 | 0x2B,\n\t29579 - 19968: jis0208<<14 | 0x11<<7 | 0x05,\n\t29582 - 19968: jis0212<<14 | 0x2A<<7 | 0x31,\n\t29584 - 19968: jis0212<<14 | 0x2A<<7 | 0x32,\n\t29587 - 19968: jis0212<<14 | 0x2A<<7 | 0x33,\n\t29589 - 19968: jis0212<<14 | 0x2A<<7 | 0x34,\n\t29590 - 19968: jis0208<<14 | 0x15<<7 | 0x49,\n\t29591 - 19968: jis0212<<14 | 0x2A<<7 | 0x35,\n\t29592 - 19968: jis0212<<14 | 0x2A<<7 | 0x36,\n\t29596 - 19968: jis0212<<14 | 0x2A<<7 | 0x37,\n\t29598 - 19968: jis0212<<14 | 0x2A<<7 | 0x38,\n\t29599 - 19968: jis0212<<14 | 0x2A<<7 | 0x39,\n\t29600 - 19968: jis0212<<14 | 0x2A<<7 | 0x3A,\n\t29602 - 19968: jis0212<<14 | 0x2A<<7 | 0x3B,\n\t29605 - 19968: jis0212<<14 | 0x2A<<7 | 0x3C,\n\t29606 - 19968: jis0212<<14 | 0x2A<<7 | 0x3D,\n\t29609 - 19968: jis0208<<14 | 0x13<<7 | 0x40,\n\t29610 - 19968: jis0212<<14 | 0x2A<<7 | 0x3E,\n\t29611 - 19968: jis0212<<14 | 0x2A<<7 | 0x3F,\n\t29613 - 19968: jis0212<<14 | 0x2A<<7 | 0x40,\n\t29618 - 19968: jis0208<<14 | 0x2D<<7 | 0x47,\n\t29619 - 19968: jis0208<<14 | 0x3F<<7 | 0x3D,\n\t29621 - 19968: jis0212<<14 | 0x2A<<7 | 0x41,\n\t29623 - 19968: jis0212<<14 | 0x2A<<7 | 0x42,\n\t29625 - 19968: jis0212<<14 | 0x2A<<7 | 0x43,\n\t29627 - 19968: jis0208<<14 | 0x3F<<7 | 0x3F,\n\t29628 - 19968: jis0212<<14 | 0x2A<<7 | 0x44,\n\t29629 - 19968: jis0208<<14 | 0x5A<<7 | 0x04,\n\t29631 - 19968: jis0212<<14 | 0x2A<<7 | 0x46,\n\t29632 - 19968: jis0208<<14 | 0x3F<<7 | 0x40,\n\t29634 - 19968: jis0208<<14 | 0x11<<7 | 0x30,\n\t29637 - 19968: jis0212<<14 | 0x2A<<7 | 0x47,\n\t29638 - 19968: jis0212<<14 | 0x2A<<7 | 0x48,\n\t29640 - 19968: jis0208<<14 | 0x3F<<7 | 0x3C,\n\t29641 - 19968: jis0208<<14 | 0x5A<<7 | 0x05,\n\t29642 - 19968: jis0208<<14 | 0x1A<<7 | 0x18,\n\t29643 - 19968: jis0212<<14 | 0x2A<<7 | 0x4A,\n\t29644 - 19968: jis0212<<14 | 0x2A<<7 | 0x4B,\n\t29645 - 19968: jis0208<<14 | 0x23<<7 | 0x20,\n\t29646 - 19968: jis0208<<14 | 0x3F<<7 | 0x3E,\n\t29647 - 19968: jis0212<<14 | 0x2A<<7 | 0x4C,\n\t29650 - 19968: jis0208<<14 | 0x5A<<7 | 0x08,\n\t29651 - 19968: jis0212<<14 | 0x2A<<7 | 0x4E,\n\t29654 - 19968: jis0208<<14 | 0x5A<<7 | 0x06,\n\t29657 - 19968: jis0212<<14 | 0x2A<<7 | 0x50,\n\t29661 - 19968: jis0212<<14 | 0x2A<<7 | 0x51,\n\t29662 - 19968: jis0208<<14 | 0x3F<<7 | 0x43,\n\t29664 - 19968: jis0208<<14 | 0x1B<<7 | 0x4D,\n\t29665 - 19968: jis0212<<14 | 0x2A<<7 | 0x52,\n\t29667 - 19968: jis0208<<14 | 0x5A<<7 | 0x07,\n\t29669 - 19968: jis0208<<14 | 0x3F<<7 | 0x41,\n\t29670 - 19968: jis0212<<14 | 0x2A<<7 | 0x54,\n\t29671 - 19968: jis0212<<14 | 0x2A<<7 | 0x55,\n\t29673 - 19968: jis0212<<14 | 0x2A<<7 | 0x56,\n\t29674 - 19968: jis0208<<14 | 0x16<<7 | 0x1D,\n\t29677 - 19968: jis0208<<14 | 0x27<<7 | 0x28,\n\t29678 - 19968: jis0208<<14 | 0x3F<<7 | 0x42,\n\t29681 - 19968: jis0208<<14 | 0x3F<<7 | 0x5D,\n\t29684 - 19968: jis0212<<14 | 0x2A<<7 | 0x57,\n\t29685 - 19968: jis0208<<14 | 0x5A<<7 | 0x0A,\n\t29687 - 19968: jis0212<<14 | 0x2A<<7 | 0x59,\n\t29688 - 19968: jis0208<<14 | 0x3F<<7 | 0x48,\n\t29689 - 19968: jis0212<<14 | 0x2A<<7 | 0x5A,\n\t29690 - 19968: jis0212<<14 | 0x2A<<7 | 0x5B,\n\t29691 - 19968: jis0212<<14 | 0x2A<<7 | 0x5C,\n\t29693 - 19968: jis0212<<14 | 0x2A<<7 | 0x5D,\n\t29694 - 19968: jis0208<<14 | 0x17<<7 | 0x1C,\n\t29695 - 19968: jis0212<<14 | 0x2B<<7 | 0x00,\n\t29696 - 19968: jis0212<<14 | 0x2B<<7 | 0x01,\n\t29697 - 19968: jis0212<<14 | 0x2B<<7 | 0x02,\n\t29699 - 19968: jis0208<<14 | 0x14<<7 | 0x44,\n\t29700 - 19968: jis0212<<14 | 0x2B<<7 | 0x03,\n\t29701 - 19968: jis0208<<14 | 0x3F<<7 | 0x45,\n\t29702 - 19968: jis0208<<14 | 0x2C<<7 | 0x5C,\n\t29703 - 19968: jis0208<<14 | 0x5A<<7 | 0x09,\n\t29705 - 19968: jis0208<<14 | 0x2D<<7 | 0x0F,\n\t29706 - 19968: jis0212<<14 | 0x2B<<7 | 0x05,\n\t29713 - 19968: jis0212<<14 | 0x2B<<7 | 0x06,\n\t29722 - 19968: jis0212<<14 | 0x2B<<7 | 0x07,\n\t29723 - 19968: jis0212<<14 | 0x2B<<7 | 0x08,\n\t29730 - 19968: jis0208<<14 | 0x21<<7 | 0x55,\n\t29732 - 19968: jis0212<<14 | 0x2B<<7 | 0x09,\n\t29733 - 19968: jis0208<<14 | 0x3F<<7 | 0x47,\n\t29734 - 19968: jis0208<<14 | 0x5A<<7 | 0x0B,\n\t29736 - 19968: jis0212<<14 | 0x2B<<7 | 0x0B,\n\t29737 - 19968: jis0208<<14 | 0x5A<<7 | 0x0D,\n\t29738 - 19968: jis0208<<14 | 0x5A<<7 | 0x0C,\n\t29739 - 19968: jis0212<<14 | 0x2B<<7 | 0x0E,\n\t29740 - 19968: jis0212<<14 | 0x2B<<7 | 0x0F,\n\t29741 - 19968: jis0212<<14 | 0x2B<<7 | 0x10,\n\t29742 - 19968: jis0208<<14 | 0x5A<<7 | 0x0E,\n\t29743 - 19968: jis0212<<14 | 0x2B<<7 | 0x12,\n\t29744 - 19968: jis0212<<14 | 0x2B<<7 | 0x13,\n\t29745 - 19968: jis0212<<14 | 0x2B<<7 | 0x14,\n\t29746 - 19968: jis0208<<14 | 0x3F<<7 | 0x49,\n\t29747 - 19968: jis0208<<14 | 0x2D<<7 | 0x35,\n\t29748 - 19968: jis0208<<14 | 0x15<<7 | 0x36,\n\t29749 - 19968: jis0208<<14 | 0x27<<7 | 0x5B,\n\t29750 - 19968: jis0208<<14 | 0x26<<7 | 0x29,\n\t29753 - 19968: jis0212<<14 | 0x2B<<7 | 0x15,\n\t29754 - 19968: jis0208<<14 | 0x3F<<7 | 0x4A,\n\t29759 - 19968: jis0208<<14 | 0x3F<<7 | 0x4C,\n\t29760 - 19968: jis0212<<14 | 0x2B<<7 | 0x16,\n\t29761 - 19968: jis0208<<14 | 0x3F<<7 | 0x4F,\n\t29763 - 19968: jis0212<<14 | 0x2B<<7 | 0x17,\n\t29764 - 19968: jis0212<<14 | 0x2B<<7 | 0x18,\n\t29766 - 19968: jis0212<<14 | 0x2B<<7 | 0x19,\n\t29767 - 19968: jis0212<<14 | 0x2B<<7 | 0x1A,\n\t29771 - 19968: jis0212<<14 | 0x2B<<7 | 0x1B,\n\t29773 - 19968: jis0212<<14 | 0x2B<<7 | 0x1C,\n\t29777 - 19968: jis0212<<14 | 0x2B<<7 | 0x1D,\n\t29778 - 19968: jis0212<<14 | 0x2B<<7 | 0x1E,\n\t29781 - 19968: jis0208<<14 | 0x3F<<7 | 0x4B,\n\t29783 - 19968: jis0212<<14 | 0x2B<<7 | 0x1F,\n\t29785 - 19968: jis0208<<14 | 0x3F<<7 | 0x4E,\n\t29786 - 19968: jis0208<<14 | 0x17<<7 | 0x49,\n\t29787 - 19968: jis0208<<14 | 0x10<<7 | 0x2C,\n\t29788 - 19968: jis0208<<14 | 0x3F<<7 | 0x50,\n\t29789 - 19968: jis0212<<14 | 0x2B<<7 | 0x20,\n\t29790 - 19968: jis0208<<14 | 0x1E<<7 | 0x4F,\n\t29791 - 19968: jis0208<<14 | 0x3F<<7 | 0x4D,\n\t29792 - 19968: jis0208<<14 | 0x2D<<7 | 0x3B,\n\t29794 - 19968: jis0208<<14 | 0x5A<<7 | 0x0F,\n\t29795 - 19968: jis0208<<14 | 0x3F<<7 | 0x53,\n\t29796 - 19968: jis0208<<14 | 0x53<<7 | 0x03,\n\t29798 - 19968: jis0212<<14 | 0x2B<<7 | 0x22,\n\t29799 - 19968: jis0212<<14 | 0x2B<<7 | 0x23,\n\t29800 - 19968: jis0212<<14 | 0x2B<<7 | 0x24,\n\t29801 - 19968: jis0208<<14 | 0x3F<<7 | 0x51,\n\t29802 - 19968: jis0208<<14 | 0x3F<<7 | 0x54,\n\t29803 - 19968: jis0212<<14 | 0x2B<<7 | 0x25,\n\t29805 - 19968: jis0212<<14 | 0x2B<<7 | 0x26,\n\t29806 - 19968: jis0212<<14 | 0x2B<<7 | 0x27,\n\t29807 - 19968: jis0208<<14 | 0x3F<<7 | 0x46,\n\t29808 - 19968: jis0208<<14 | 0x3F<<7 | 0x52,\n\t29809 - 19968: jis0212<<14 | 0x2B<<7 | 0x28,\n\t29810 - 19968: jis0212<<14 | 0x2B<<7 | 0x29,\n\t29811 - 19968: jis0208<<14 | 0x19<<7 | 0x1B,\n\t29814 - 19968: jis0208<<14 | 0x3F<<7 | 0x55,\n\t29822 - 19968: jis0208<<14 | 0x3F<<7 | 0x56,\n\t29824 - 19968: jis0212<<14 | 0x2B<<7 | 0x2A,\n\t29825 - 19968: jis0212<<14 | 0x2B<<7 | 0x2B,\n\t29827 - 19968: jis0208<<14 | 0x2C<<7 | 0x5D,\n\t29829 - 19968: jis0212<<14 | 0x2B<<7 | 0x2C,\n\t29830 - 19968: jis0212<<14 | 0x2B<<7 | 0x2D,\n\t29831 - 19968: jis0212<<14 | 0x2B<<7 | 0x2E,\n\t29833 - 19968: jis0208<<14 | 0x5A<<7 | 0x10,\n\t29835 - 19968: jis0208<<14 | 0x3F<<7 | 0x57,\n\t29839 - 19968: jis0212<<14 | 0x2B<<7 | 0x30,\n\t29840 - 19968: jis0212<<14 | 0x2B<<7 | 0x31,\n\t29841 - 19968: jis0212<<14 | 0x2B<<7 | 0x32,\n\t29842 - 19968: jis0212<<14 | 0x2B<<7 | 0x33,\n\t29848 - 19968: jis0212<<14 | 0x2B<<7 | 0x34,\n\t29849 - 19968: jis0212<<14 | 0x2B<<7 | 0x35,\n\t29850 - 19968: jis0212<<14 | 0x2B<<7 | 0x36,\n\t29852 - 19968: jis0212<<14 | 0x2B<<7 | 0x37,\n\t29854 - 19968: jis0208<<14 | 0x3F<<7 | 0x58,\n\t29855 - 19968: jis0208<<14 | 0x5A<<7 | 0x11,\n\t29856 - 19968: jis0212<<14 | 0x2B<<7 | 0x39,\n\t29857 - 19968: jis0212<<14 | 0x2B<<7 | 0x3A,\n\t29858 - 19968: jis0208<<14 | 0x3F<<7 | 0x44,\n\t29859 - 19968: jis0212<<14 | 0x2B<<7 | 0x3B,\n\t29862 - 19968: jis0212<<14 | 0x2B<<7 | 0x3C,\n\t29863 - 19968: jis0208<<14 | 0x3F<<7 | 0x59,\n\t29864 - 19968: jis0212<<14 | 0x2B<<7 | 0x3D,\n\t29865 - 19968: jis0212<<14 | 0x2B<<7 | 0x3E,\n\t29866 - 19968: jis0212<<14 | 0x2B<<7 | 0x3F,\n\t29867 - 19968: jis0212<<14 | 0x2B<<7 | 0x40,\n\t29870 - 19968: jis0212<<14 | 0x2B<<7 | 0x41,\n\t29871 - 19968: jis0212<<14 | 0x2B<<7 | 0x42,\n\t29872 - 19968: jis0208<<14 | 0x13<<7 | 0x23,\n\t29873 - 19968: jis0212<<14 | 0x2B<<7 | 0x43,\n\t29874 - 19968: jis0212<<14 | 0x2B<<7 | 0x44,\n\t29877 - 19968: jis0212<<14 | 0x2B<<7 | 0x45,\n\t29881 - 19968: jis0212<<14 | 0x2B<<7 | 0x46,\n\t29883 - 19968: jis0212<<14 | 0x2B<<7 | 0x47,\n\t29885 - 19968: jis0208<<14 | 0x1B<<7 | 0x04,\n\t29887 - 19968: jis0212<<14 | 0x2B<<7 | 0x48,\n\t29896 - 19968: jis0212<<14 | 0x2B<<7 | 0x49,\n\t29897 - 19968: jis0212<<14 | 0x2B<<7 | 0x4A,\n\t29898 - 19968: jis0208<<14 | 0x3F<<7 | 0x5A,\n\t29900 - 19968: jis0212<<14 | 0x2B<<7 | 0x4B,\n\t29903 - 19968: jis0208<<14 | 0x3F<<7 | 0x5B,\n\t29904 - 19968: jis0212<<14 | 0x2B<<7 | 0x4C,\n\t29907 - 19968: jis0212<<14 | 0x2B<<7 | 0x4D,\n\t29908 - 19968: jis0208<<14 | 0x3F<<7 | 0x5C,\n\t29912 - 19968: jis0212<<14 | 0x2B<<7 | 0x4E,\n\t29914 - 19968: jis0212<<14 | 0x2B<<7 | 0x4F,\n\t29915 - 19968: jis0212<<14 | 0x2B<<7 | 0x50,\n\t29916 - 19968: jis0208<<14 | 0x10<<7 | 0x1A,\n\t29918 - 19968: jis0212<<14 | 0x2B<<7 | 0x51,\n\t29919 - 19968: jis0212<<14 | 0x2B<<7 | 0x52,\n\t29920 - 19968: jis0208<<14 | 0x40<<7 | 0x00,\n\t29922 - 19968: jis0208<<14 | 0x28<<7 | 0x1A,\n\t29923 - 19968: jis0208<<14 | 0x40<<7 | 0x01,\n\t29924 - 19968: jis0212<<14 | 0x2B<<7 | 0x53,\n\t29926 - 19968: jis0208<<14 | 0x13<<7 | 0x03,\n\t29927 - 19968: jis0208<<14 | 0x40<<7 | 0x02,\n\t29928 - 19968: jis0212<<14 | 0x2B<<7 | 0x54,\n\t29929 - 19968: jis0208<<14 | 0x40<<7 | 0x03,\n\t29930 - 19968: jis0212<<14 | 0x2B<<7 | 0x55,\n\t29931 - 19968: jis0212<<14 | 0x2B<<7 | 0x56,\n\t29934 - 19968: jis0208<<14 | 0x40<<7 | 0x04,\n\t29935 - 19968: jis0212<<14 | 0x2B<<7 | 0x57,\n\t29936 - 19968: jis0208<<14 | 0x40<<7 | 0x06,\n\t29937 - 19968: jis0208<<14 | 0x40<<7 | 0x07,\n\t29938 - 19968: jis0208<<14 | 0x40<<7 | 0x05,\n\t29940 - 19968: jis0212<<14 | 0x2B<<7 | 0x58,\n\t29942 - 19968: jis0208<<14 | 0x28<<7 | 0x32,\n\t29943 - 19968: jis0208<<14 | 0x40<<7 | 0x09,\n\t29944 - 19968: jis0208<<14 | 0x40<<7 | 0x08,\n\t29946 - 19968: jis0212<<14 | 0x2B<<7 | 0x59,\n\t29947 - 19968: jis0212<<14 | 0x2B<<7 | 0x5A,\n\t29948 - 19968: jis0212<<14 | 0x2B<<7 | 0x5B,\n\t29951 - 19968: jis0212<<14 | 0x2B<<7 | 0x5C,\n\t29953 - 19968: jis0208<<14 | 0x5A<<7 | 0x12,\n\t29955 - 19968: jis0208<<14 | 0x40<<7 | 0x0B,\n\t29956 - 19968: jis0208<<14 | 0x40<<7 | 0x0A,\n\t29957 - 19968: jis0208<<14 | 0x40<<7 | 0x0C,\n\t29958 - 19968: jis0212<<14 | 0x2B<<7 | 0x5D,\n\t29964 - 19968: jis0208<<14 | 0x40<<7 | 0x0D,\n\t29965 - 19968: jis0208<<14 | 0x40<<7 | 0x0F,\n\t29966 - 19968: jis0208<<14 | 0x40<<7 | 0x0E,\n\t29969 - 19968: jis0208<<14 | 0x18<<7 | 0x58,\n\t29970 - 19968: jis0212<<14 | 0x2C<<7 | 0x00,\n\t29971 - 19968: jis0208<<14 | 0x40<<7 | 0x11,\n\t29973 - 19968: jis0208<<14 | 0x40<<7 | 0x10,\n\t29974 - 19968: jis0212<<14 | 0x2C<<7 | 0x01,\n\t29975 - 19968: jis0212<<14 | 0x2C<<7 | 0x02,\n\t29976 - 19968: jis0208<<14 | 0x13<<7 | 0x24,\n\t29978 - 19968: jis0208<<14 | 0x1E<<7 | 0x32,\n\t29980 - 19968: jis0208<<14 | 0x24<<7 | 0x1B,\n\t29982 - 19968: jis0208<<14 | 0x40<<7 | 0x12,\n\t29983 - 19968: jis0208<<14 | 0x1F<<7 | 0x17,\n\t29984 - 19968: jis0212<<14 | 0x2C<<7 | 0x03,\n\t29985 - 19968: jis0212<<14 | 0x2C<<7 | 0x04,\n\t29987 - 19968: jis0208<<14 | 0x1A<<7 | 0x19,\n\t29988 - 19968: jis0212<<14 | 0x2C<<7 | 0x05,\n\t29989 - 19968: jis0208<<14 | 0x10<<7 | 0x58,\n\t29990 - 19968: jis0208<<14 | 0x40<<7 | 0x13,\n\t29991 - 19968: jis0212<<14 | 0x2C<<7 | 0x06,\n\t29992 - 19968: jis0208<<14 | 0x2C<<7 | 0x30,\n\t29993 - 19968: jis0212<<14 | 0x2C<<7 | 0x07,\n\t29994 - 19968: jis0212<<14 | 0x2C<<7 | 0x08,\n\t29995 - 19968: jis0208<<14 | 0x29<<7 | 0x42,\n\t29996 - 19968: jis0208<<14 | 0x40<<7 | 0x14,\n\t29999 - 19968: jis0208<<14 | 0x58<<7 | 0x4B,\n\t30000 - 19968: jis0208<<14 | 0x24<<7 | 0x23,\n\t30001 - 19968: jis0208<<14 | 0x2C<<7 | 0x12,\n\t30002 - 19968: jis0208<<14 | 0x18<<7 | 0x22,\n\t30003 - 19968: jis0208<<14 | 0x1E<<7 | 0x1C,\n\t30006 - 19968: jis0212<<14 | 0x2C<<7 | 0x0A,\n\t30007 - 19968: jis0208<<14 | 0x22<<7 | 0x2A,\n\t30008 - 19968: jis0208<<14 | 0x31<<7 | 0x13,\n\t30009 - 19968: jis0212<<14 | 0x2C<<7 | 0x0B,\n\t30010 - 19968: jis0208<<14 | 0x23<<7 | 0x0D,\n\t30011 - 19968: jis0208<<14 | 0x11<<7 | 0x47,\n\t30012 - 19968: jis0208<<14 | 0x40<<7 | 0x15,\n\t30013 - 19968: jis0212<<14 | 0x2C<<7 | 0x0C,\n\t30014 - 19968: jis0212<<14 | 0x2C<<7 | 0x0D,\n\t30015 - 19968: jis0212<<14 | 0x2C<<7 | 0x0E,\n\t30016 - 19968: jis0212<<14 | 0x2C<<7 | 0x0F,\n\t30019 - 19968: jis0212<<14 | 0x2C<<7 | 0x10,\n\t30020 - 19968: jis0208<<14 | 0x40<<7 | 0x16,\n\t30022 - 19968: jis0208<<14 | 0x40<<7 | 0x1B,\n\t30023 - 19968: jis0212<<14 | 0x2C<<7 | 0x11,\n\t30024 - 19968: jis0212<<14 | 0x2C<<7 | 0x12,\n\t30025 - 19968: jis0208<<14 | 0x40<<7 | 0x19,\n\t30026 - 19968: jis0208<<14 | 0x40<<7 | 0x18,\n\t30027 - 19968: jis0208<<14 | 0x39<<7 | 0x21,\n\t30028 - 19968: jis0208<<14 | 0x12<<7 | 0x05,\n\t30029 - 19968: jis0208<<14 | 0x40<<7 | 0x17,\n\t30030 - 19968: jis0212<<14 | 0x2C<<7 | 0x13,\n\t30031 - 19968: jis0208<<14 | 0x0F<<7 | 0x39,\n\t30032 - 19968: jis0212<<14 | 0x2C<<7 | 0x14,\n\t30033 - 19968: jis0208<<14 | 0x27<<7 | 0x09,\n\t30034 - 19968: jis0212<<14 | 0x2C<<7 | 0x15,\n\t30036 - 19968: jis0208<<14 | 0x27<<7 | 0x29,\n\t30039 - 19968: jis0212<<14 | 0x2C<<7 | 0x16,\n\t30041 - 19968: jis0208<<14 | 0x2D<<7 | 0x10,\n\t30042 - 19968: jis0208<<14 | 0x40<<7 | 0x1C,\n\t30043 - 19968: jis0208<<14 | 0x40<<7 | 0x1A,\n\t30044 - 19968: jis0208<<14 | 0x22<<7 | 0x3B,\n\t30045 - 19968: jis0208<<14 | 0x1F<<7 | 0x05,\n\t30046 - 19968: jis0212<<14 | 0x2C<<7 | 0x17,\n\t30047 - 19968: jis0212<<14 | 0x2C<<7 | 0x18,\n\t30048 - 19968: jis0208<<14 | 0x27<<7 | 0x0A,\n\t30049 - 19968: jis0212<<14 | 0x2C<<7 | 0x19,\n\t30050 - 19968: jis0208<<14 | 0x28<<7 | 0x0C,\n\t30052 - 19968: jis0208<<14 | 0x40<<7 | 0x1E,\n\t30053 - 19968: jis0208<<14 | 0x2D<<7 | 0x0B,\n\t30054 - 19968: jis0208<<14 | 0x16<<7 | 0x2C,\n\t30055 - 19968: jis0208<<14 | 0x40<<7 | 0x1F,\n\t30057 - 19968: jis0208<<14 | 0x40<<7 | 0x1D,\n\t30058 - 19968: jis0208<<14 | 0x27<<7 | 0x35,\n\t30059 - 19968: jis0208<<14 | 0x40<<7 | 0x20,\n\t30061 - 19968: jis0208<<14 | 0x40<<7 | 0x21,\n\t30063 - 19968: jis0208<<14 | 0x5A<<7 | 0x13,\n\t30064 - 19968: jis0208<<14 | 0x0F<<7 | 0x3A,\n\t30065 - 19968: jis0212<<14 | 0x2C<<7 | 0x1B,\n\t30067 - 19968: jis0208<<14 | 0x1D<<7 | 0x55,\n\t30068 - 19968: jis0208<<14 | 0x40<<7 | 0x26,\n\t30070 - 19968: jis0208<<14 | 0x40<<7 | 0x23,\n\t30071 - 19968: jis0208<<14 | 0x25<<7 | 0x4C,\n\t30072 - 19968: jis0208<<14 | 0x40<<7 | 0x22,\n\t30073 - 19968: jis0212<<14 | 0x2C<<7 | 0x1C,\n\t30074 - 19968: jis0212<<14 | 0x2C<<7 | 0x1D,\n\t30075 - 19968: jis0212<<14 | 0x2C<<7 | 0x1E,\n\t30076 - 19968: jis0212<<14 | 0x2C<<7 | 0x1F,\n\t30077 - 19968: jis0212<<14 | 0x2C<<7 | 0x20,\n\t30078 - 19968: jis0212<<14 | 0x2C<<7 | 0x21,\n\t30079 - 19968: jis0208<<14 | 0x14<<7 | 0x05,\n\t30081 - 19968: jis0212<<14 | 0x2C<<7 | 0x22,\n\t30082 - 19968: jis0208<<14 | 0x40<<7 | 0x29,\n\t30085 - 19968: jis0212<<14 | 0x2C<<7 | 0x23,\n\t30086 - 19968: jis0208<<14 | 0x40<<7 | 0x24,\n\t30087 - 19968: jis0208<<14 | 0x40<<7 | 0x25,\n\t30089 - 19968: jis0208<<14 | 0x40<<7 | 0x28,\n\t30090 - 19968: jis0208<<14 | 0x40<<7 | 0x27,\n\t30091 - 19968: jis0208<<14 | 0x28<<7 | 0x04,\n\t30094 - 19968: jis0208<<14 | 0x20<<7 | 0x21,\n\t30095 - 19968: jis0208<<14 | 0x20<<7 | 0x20,\n\t30096 - 19968: jis0212<<14 | 0x2C<<7 | 0x24,\n\t30097 - 19968: jis0208<<14 | 0x14<<7 | 0x1E,\n\t30098 - 19968: jis0212<<14 | 0x2C<<7 | 0x25,\n\t30099 - 19968: jis0212<<14 | 0x2C<<7 | 0x26,\n\t30100 - 19968: jis0208<<14 | 0x40<<7 | 0x2A,\n\t30101 - 19968: jis0212<<14 | 0x2C<<7 | 0x27,\n\t30105 - 19968: jis0212<<14 | 0x2C<<7 | 0x28,\n\t30106 - 19968: jis0208<<14 | 0x40<<7 | 0x2B,\n\t30108 - 19968: jis0212<<14 | 0x2C<<7 | 0x29,\n\t30109 - 19968: jis0208<<14 | 0x40<<7 | 0x2C,\n\t30114 - 19968: jis0212<<14 | 0x2C<<7 | 0x2A,\n\t30115 - 19968: jis0208<<14 | 0x40<<7 | 0x2E,\n\t30116 - 19968: jis0212<<14 | 0x2C<<7 | 0x2B,\n\t30117 - 19968: jis0208<<14 | 0x40<<7 | 0x2D,\n\t30123 - 19968: jis0208<<14 | 0x10<<7 | 0x35,\n\t30129 - 19968: jis0208<<14 | 0x40<<7 | 0x36,\n\t30130 - 19968: jis0208<<14 | 0x27<<7 | 0x47,\n\t30131 - 19968: jis0208<<14 | 0x40<<7 | 0x30,\n\t30132 - 19968: jis0212<<14 | 0x2C<<7 | 0x2C,\n\t30133 - 19968: jis0208<<14 | 0x40<<7 | 0x32,\n\t30136 - 19968: jis0208<<14 | 0x40<<7 | 0x34,\n\t30137 - 19968: jis0208<<14 | 0x1E<<7 | 0x1D,\n\t30138 - 19968: jis0212<<14 | 0x2C<<7 | 0x2D,\n\t30140 - 19968: jis0208<<14 | 0x40<<7 | 0x35,\n\t30141 - 19968: jis0208<<14 | 0x40<<7 | 0x33,\n\t30142 - 19968: jis0208<<14 | 0x1B<<7 | 0x1F,\n\t30143 - 19968: jis0212<<14 | 0x2C<<7 | 0x2E,\n\t30144 - 19968: jis0212<<14 | 0x2C<<7 | 0x2F,\n\t30145 - 19968: jis0212<<14 | 0x2C<<7 | 0x30,\n\t30146 - 19968: jis0208<<14 | 0x40<<7 | 0x2F,\n\t30147 - 19968: jis0208<<14 | 0x40<<7 | 0x31,\n\t30148 - 19968: jis0212<<14 | 0x2C<<7 | 0x31,\n\t30149 - 19968: jis0208<<14 | 0x28<<7 | 0x21,\n\t30150 - 19968: jis0212<<14 | 0x2C<<7 | 0x32,\n\t30151 - 19968: jis0208<<14 | 0x1D<<7 | 0x28,\n\t30154 - 19968: jis0208<<14 | 0x40<<7 | 0x38,\n\t30156 - 19968: jis0212<<14 | 0x2C<<7 | 0x33,\n\t30157 - 19968: jis0208<<14 | 0x40<<7 | 0x37,\n\t30158 - 19968: jis0212<<14 | 0x2C<<7 | 0x34,\n\t30159 - 19968: jis0212<<14 | 0x2C<<7 | 0x35,\n\t30162 - 19968: jis0208<<14 | 0x40<<7 | 0x39,\n\t30164 - 19968: jis0208<<14 | 0x1B<<7 | 0x05,\n\t30165 - 19968: jis0208<<14 | 0x19<<7 | 0x0E,\n\t30167 - 19968: jis0212<<14 | 0x2C<<7 | 0x36,\n\t30168 - 19968: jis0208<<14 | 0x24<<7 | 0x56,\n\t30169 - 19968: jis0208<<14 | 0x40<<7 | 0x3A,\n\t30171 - 19968: jis0208<<14 | 0x23<<7 | 0x2A,\n\t30172 - 19968: jis0212<<14 | 0x2C<<7 | 0x37,\n\t30174 - 19968: jis0208<<14 | 0x40<<7 | 0x3C,\n\t30175 - 19968: jis0212<<14 | 0x2C<<7 | 0x38,\n\t30176 - 19968: jis0212<<14 | 0x2C<<7 | 0x39,\n\t30177 - 19968: jis0212<<14 | 0x2C<<7 | 0x3A,\n\t30178 - 19968: jis0208<<14 | 0x2D<<7 | 0x00,\n\t30179 - 19968: jis0208<<14 | 0x40<<7 | 0x3B,\n\t30180 - 19968: jis0212<<14 | 0x2C<<7 | 0x3B,\n\t30183 - 19968: jis0212<<14 | 0x2C<<7 | 0x3C,\n\t30185 - 19968: jis0208<<14 | 0x20<<7 | 0x48,\n\t30188 - 19968: jis0212<<14 | 0x2C<<7 | 0x3D,\n\t30190 - 19968: jis0212<<14 | 0x2C<<7 | 0x3E,\n\t30191 - 19968: jis0212<<14 | 0x2C<<7 | 0x3F,\n\t30192 - 19968: jis0208<<14 | 0x40<<7 | 0x41,\n\t30193 - 19968: jis0212<<14 | 0x2C<<7 | 0x40,\n\t30194 - 19968: jis0208<<14 | 0x40<<7 | 0x43,\n\t30195 - 19968: jis0208<<14 | 0x40<<7 | 0x44,\n\t30196 - 19968: jis0208<<14 | 0x22<<7 | 0x33,\n\t30201 - 19968: jis0212<<14 | 0x2C<<7 | 0x41,\n\t30202 - 19968: jis0208<<14 | 0x40<<7 | 0x42,\n\t30204 - 19968: jis0208<<14 | 0x40<<7 | 0x3F,\n\t30206 - 19968: jis0208<<14 | 0x40<<7 | 0x3D,\n\t30207 - 19968: jis0208<<14 | 0x40<<7 | 0x3E,\n\t30208 - 19968: jis0212<<14 | 0x2C<<7 | 0x42,\n\t30209 - 19968: jis0208<<14 | 0x40<<7 | 0x40,\n\t30210 - 19968: jis0212<<14 | 0x2C<<7 | 0x43,\n\t30211 - 19968: jis0212<<14 | 0x2C<<7 | 0x44,\n\t30212 - 19968: jis0212<<14 | 0x2C<<7 | 0x45,\n\t30215 - 19968: jis0212<<14 | 0x2C<<7 | 0x46,\n\t30216 - 19968: jis0212<<14 | 0x2C<<7 | 0x47,\n\t30217 - 19968: jis0208<<14 | 0x40<<7 | 0x47,\n\t30218 - 19968: jis0212<<14 | 0x2C<<7 | 0x48,\n\t30219 - 19968: jis0208<<14 | 0x40<<7 | 0x45,\n\t30220 - 19968: jis0212<<14 | 0x2C<<7 | 0x49,\n\t30221 - 19968: jis0208<<14 | 0x40<<7 | 0x46,\n\t30223 - 19968: jis0212<<14 | 0x2C<<7 | 0x4A,\n\t30226 - 19968: jis0212<<14 | 0x2C<<7 | 0x4B,\n\t30227 - 19968: jis0212<<14 | 0x2C<<7 | 0x4C,\n\t30229 - 19968: jis0212<<14 | 0x2C<<7 | 0x4D,\n\t30230 - 19968: jis0212<<14 | 0x2C<<7 | 0x4E,\n\t30233 - 19968: jis0212<<14 | 0x2C<<7 | 0x4F,\n\t30235 - 19968: jis0212<<14 | 0x2C<<7 | 0x50,\n\t30236 - 19968: jis0212<<14 | 0x2C<<7 | 0x51,\n\t30237 - 19968: jis0212<<14 | 0x2C<<7 | 0x52,\n\t30238 - 19968: jis0212<<14 | 0x2C<<7 | 0x53,\n\t30239 - 19968: jis0208<<14 | 0x40<<7 | 0x48,\n\t30240 - 19968: jis0208<<14 | 0x40<<7 | 0x4A,\n\t30241 - 19968: jis0208<<14 | 0x40<<7 | 0x4B,\n\t30242 - 19968: jis0208<<14 | 0x40<<7 | 0x4C,\n\t30243 - 19968: jis0212<<14 | 0x2C<<7 | 0x54,\n\t30244 - 19968: jis0208<<14 | 0x40<<7 | 0x4D,\n\t30245 - 19968: jis0212<<14 | 0x2C<<7 | 0x55,\n\t30246 - 19968: jis0212<<14 | 0x2C<<7 | 0x56,\n\t30247 - 19968: jis0208<<14 | 0x40<<7 | 0x49,\n\t30249 - 19968: jis0212<<14 | 0x2C<<7 | 0x57,\n\t30253 - 19968: jis0212<<14 | 0x2C<<7 | 0x58,\n\t30256 - 19968: jis0208<<14 | 0x40<<7 | 0x4F,\n\t30258 - 19968: jis0212<<14 | 0x2C<<7 | 0x59,\n\t30259 - 19968: jis0212<<14 | 0x2C<<7 | 0x5A,\n\t30260 - 19968: jis0208<<14 | 0x40<<7 | 0x4E,\n\t30261 - 19968: jis0212<<14 | 0x2C<<7 | 0x5B,\n\t30264 - 19968: jis0212<<14 | 0x2C<<7 | 0x5C,\n\t30265 - 19968: jis0212<<14 | 0x2C<<7 | 0x5D,\n\t30266 - 19968: jis0212<<14 | 0x2D<<7 | 0x00,\n\t30267 - 19968: jis0208<<14 | 0x40<<7 | 0x50,\n\t30268 - 19968: jis0212<<14 | 0x2D<<7 | 0x01,\n\t30272 - 19968: jis0212<<14 | 0x2D<<7 | 0x03,\n\t30273 - 19968: jis0212<<14 | 0x2D<<7 | 0x04,\n\t30274 - 19968: jis0208<<14 | 0x2D<<7 | 0x24,\n\t30275 - 19968: jis0212<<14 | 0x2D<<7 | 0x05,\n\t30276 - 19968: jis0212<<14 | 0x2D<<7 | 0x06,\n\t30277 - 19968: jis0212<<14 | 0x2D<<7 | 0x07,\n\t30278 - 19968: jis0208<<14 | 0x40<<7 | 0x53,\n\t30279 - 19968: jis0208<<14 | 0x40<<7 | 0x51,\n\t30280 - 19968: jis0208<<14 | 0x40<<7 | 0x52,\n\t30281 - 19968: jis0212<<14 | 0x2D<<7 | 0x08,\n\t30282 - 19968: jis0212<<14 | 0x2D<<7 | 0x02,\n\t30283 - 19968: jis0212<<14 | 0x2D<<7 | 0x09,\n\t30284 - 19968: jis0208<<14 | 0x13<<7 | 0x41,\n\t30290 - 19968: jis0208<<14 | 0x2B<<7 | 0x5D,\n\t30293 - 19968: jis0212<<14 | 0x2D<<7 | 0x0A,\n\t30294 - 19968: jis0208<<14 | 0x29<<7 | 0x29,\n\t30296 - 19968: jis0208<<14 | 0x40<<7 | 0x55,\n\t30297 - 19968: jis0212<<14 | 0x2D<<7 | 0x0B,\n\t30300 - 19968: jis0208<<14 | 0x40<<7 | 0x54,\n\t30303 - 19968: jis0212<<14 | 0x2D<<7 | 0x0C,\n\t30305 - 19968: jis0208<<14 | 0x40<<7 | 0x56,\n\t30306 - 19968: jis0208<<14 | 0x40<<7 | 0x57,\n\t30308 - 19968: jis0212<<14 | 0x2D<<7 | 0x0D,\n\t30309 - 19968: jis0212<<14 | 0x2D<<7 | 0x0E,\n\t30311 - 19968: jis0208<<14 | 0x40<<7 | 0x5B,\n\t30312 - 19968: jis0208<<14 | 0x40<<7 | 0x58,\n\t30313 - 19968: jis0208<<14 | 0x40<<7 | 0x59,\n\t30314 - 19968: jis0208<<14 | 0x40<<7 | 0x5A,\n\t30316 - 19968: jis0208<<14 | 0x40<<7 | 0x5C,\n\t30317 - 19968: jis0212<<14 | 0x2D<<7 | 0x0F,\n\t30318 - 19968: jis0212<<14 | 0x2D<<7 | 0x10,\n\t30319 - 19968: jis0212<<14 | 0x2D<<7 | 0x11,\n\t30320 - 19968: jis0208<<14 | 0x40<<7 | 0x5D,\n\t30321 - 19968: jis0212<<14 | 0x2D<<7 | 0x12,\n\t30322 - 19968: jis0208<<14 | 0x41<<7 | 0x00,\n\t30324 - 19968: jis0212<<14 | 0x2D<<7 | 0x13,\n\t30326 - 19968: jis0208<<14 | 0x41<<7 | 0x01,\n\t30328 - 19968: jis0208<<14 | 0x41<<7 | 0x02,\n\t30330 - 19968: jis0208<<14 | 0x27<<7 | 0x0E,\n\t30331 - 19968: jis0208<<14 | 0x24<<7 | 0x2F,\n\t30332 - 19968: jis0208<<14 | 0x41<<7 | 0x03,\n\t30333 - 19968: jis0208<<14 | 0x26<<7 | 0x51,\n\t30334 - 19968: jis0208<<14 | 0x28<<7 | 0x13,\n\t30336 - 19968: jis0208<<14 | 0x41<<7 | 0x04,\n\t30337 - 19968: jis0212<<14 | 0x2D<<7 | 0x14,\n\t30338 - 19968: jis0208<<14 | 0x5A<<7 | 0x14,\n\t30339 - 19968: jis0208<<14 | 0x41<<7 | 0x05,\n\t30340 - 19968: jis0208<<14 | 0x24<<7 | 0x09,\n\t30341 - 19968: jis0212<<14 | 0x2D<<7 | 0x15,\n\t30342 - 19968: jis0208<<14 | 0x12<<7 | 0x06,\n\t30343 - 19968: jis0208<<14 | 0x18<<7 | 0x23,\n\t30344 - 19968: jis0208<<14 | 0x41<<7 | 0x06,\n\t30347 - 19968: jis0208<<14 | 0x41<<7 | 0x07,\n\t30348 - 19968: jis0212<<14 | 0x2D<<7 | 0x16,\n\t30349 - 19968: jis0212<<14 | 0x2D<<7 | 0x17,\n\t30350 - 19968: jis0208<<14 | 0x41<<7 | 0x08,\n\t30352 - 19968: jis0208<<14 | 0x1A<<7 | 0x08,\n\t30355 - 19968: jis0208<<14 | 0x41<<7 | 0x0A,\n\t30357 - 19968: jis0212<<14 | 0x2D<<7 | 0x18,\n\t30358 - 19968: jis0208<<14 | 0x41<<7 | 0x09,\n\t30361 - 19968: jis0208<<14 | 0x41<<7 | 0x0B,\n\t30362 - 19968: jis0208<<14 | 0x41<<7 | 0x0C,\n\t30363 - 19968: jis0208<<14 | 0x5A<<7 | 0x17,\n\t30364 - 19968: jis0208<<14 | 0x5A<<7 | 0x15,\n\t30365 - 19968: jis0212<<14 | 0x2D<<7 | 0x1B,\n\t30366 - 19968: jis0208<<14 | 0x5A<<7 | 0x16,\n\t30367 - 19968: jis0212<<14 | 0x2D<<7 | 0x1C,\n\t30368 - 19968: jis0212<<14 | 0x2D<<7 | 0x1D,\n\t30370 - 19968: jis0212<<14 | 0x2D<<7 | 0x1E,\n\t30371 - 19968: jis0212<<14 | 0x2D<<7 | 0x1F,\n\t30372 - 19968: jis0212<<14 | 0x2D<<7 | 0x20,\n\t30373 - 19968: jis0212<<14 | 0x2D<<7 | 0x21,\n\t30374 - 19968: jis0208<<14 | 0x5A<<7 | 0x18,\n\t30375 - 19968: jis0212<<14 | 0x2D<<7 | 0x23,\n\t30376 - 19968: jis0212<<14 | 0x2D<<7 | 0x24,\n\t30378 - 19968: jis0212<<14 | 0x2D<<7 | 0x25,\n\t30381 - 19968: jis0212<<14 | 0x2D<<7 | 0x26,\n\t30382 - 19968: jis0208<<14 | 0x27<<7 | 0x48,\n\t30384 - 19968: jis0208<<14 | 0x41<<7 | 0x0D,\n\t30388 - 19968: jis0208<<14 | 0x41<<7 | 0x0E,\n\t30391 - 19968: jis0208<<14 | 0x52<<7 | 0x48,\n\t30392 - 19968: jis0208<<14 | 0x41<<7 | 0x0F,\n\t30393 - 19968: jis0208<<14 | 0x41<<7 | 0x10,\n\t30394 - 19968: jis0208<<14 | 0x41<<7 | 0x11,\n\t30397 - 19968: jis0212<<14 | 0x2D<<7 | 0x27,\n\t30399 - 19968: jis0208<<14 | 0x1A<<7 | 0x0D,\n\t30401 - 19968: jis0212<<14 | 0x2D<<7 | 0x28,\n\t30402 - 19968: jis0208<<14 | 0x41<<7 | 0x12,\n\t30403 - 19968: jis0208<<14 | 0x26<<7 | 0x35,\n\t30405 - 19968: jis0212<<14 | 0x2D<<7 | 0x29,\n\t30406 - 19968: jis0208<<14 | 0x2A<<7 | 0x3E,\n\t30408 - 19968: jis0208<<14 | 0x10<<7 | 0x2D,\n\t30409 - 19968: jis0212<<14 | 0x2D<<7 | 0x2A,\n\t30410 - 19968: jis0208<<14 | 0x10<<7 | 0x36,\n\t30411 - 19968: jis0212<<14 | 0x2D<<7 | 0x2B,\n\t30412 - 19968: jis0212<<14 | 0x2D<<7 | 0x2C,\n\t30413 - 19968: jis0208<<14 | 0x41<<7 | 0x13,\n\t30414 - 19968: jis0212<<14 | 0x2D<<7 | 0x2D,\n\t30418 - 19968: jis0208<<14 | 0x41<<7 | 0x15,\n\t30420 - 19968: jis0212<<14 | 0x2D<<7 | 0x2E,\n\t30422 - 19968: jis0208<<14 | 0x41<<7 | 0x14,\n\t30423 - 19968: jis0208<<14 | 0x24<<7 | 0x4F,\n\t30425 - 19968: jis0212<<14 | 0x2D<<7 | 0x2F,\n\t30427 - 19968: jis0208<<14 | 0x1F<<7 | 0x18,\n\t30428 - 19968: jis0208<<14 | 0x3C<<7 | 0x18,\n\t30430 - 19968: jis0208<<14 | 0x41<<7 | 0x16,\n\t30431 - 19968: jis0208<<14 | 0x2B<<7 | 0x20,\n\t30432 - 19968: jis0212<<14 | 0x2D<<7 | 0x30,\n\t30433 - 19968: jis0208<<14 | 0x41<<7 | 0x17,\n\t30435 - 19968: jis0208<<14 | 0x13<<7 | 0x25,\n\t30436 - 19968: jis0208<<14 | 0x27<<7 | 0x36,\n\t30437 - 19968: jis0208<<14 | 0x41<<7 | 0x18,\n\t30438 - 19968: jis0212<<14 | 0x2D<<7 | 0x31,\n\t30439 - 19968: jis0208<<14 | 0x41<<7 | 0x19,\n\t30440 - 19968: jis0212<<14 | 0x2D<<7 | 0x32,\n\t30442 - 19968: jis0208<<14 | 0x41<<7 | 0x1A,\n\t30444 - 19968: jis0212<<14 | 0x2D<<7 | 0x33,\n\t30446 - 19968: jis0208<<14 | 0x2B<<7 | 0x3B,\n\t30448 - 19968: jis0212<<14 | 0x2D<<7 | 0x34,\n\t30449 - 19968: jis0212<<14 | 0x2D<<7 | 0x35,\n\t30450 - 19968: jis0208<<14 | 0x2B<<7 | 0x34,\n\t30452 - 19968: jis0208<<14 | 0x23<<7 | 0x1D,\n\t30454 - 19968: jis0212<<14 | 0x2D<<7 | 0x36,\n\t30456 - 19968: jis0208<<14 | 0x20<<7 | 0x49,\n\t30457 - 19968: jis0212<<14 | 0x2D<<7 | 0x37,\n\t30459 - 19968: jis0208<<14 | 0x41<<7 | 0x1C,\n\t30460 - 19968: jis0212<<14 | 0x2D<<7 | 0x38,\n\t30462 - 19968: jis0208<<14 | 0x1C<<7 | 0x41,\n\t30464 - 19968: jis0212<<14 | 0x2D<<7 | 0x39,\n\t30465 - 19968: jis0208<<14 | 0x1D<<7 | 0x29,\n\t30468 - 19968: jis0208<<14 | 0x41<<7 | 0x1F,\n\t30470 - 19968: jis0212<<14 | 0x2D<<7 | 0x3A,\n\t30471 - 19968: jis0208<<14 | 0x41<<7 | 0x1E,\n\t30472 - 19968: jis0208<<14 | 0x41<<7 | 0x1D,\n\t30473 - 19968: jis0208<<14 | 0x27<<7 | 0x5C,\n\t30474 - 19968: jis0212<<14 | 0x2D<<7 | 0x3B,\n\t30475 - 19968: jis0208<<14 | 0x13<<7 | 0x26,\n\t30476 - 19968: jis0208<<14 | 0x17<<7 | 0x08,\n\t30478 - 19968: jis0212<<14 | 0x2D<<7 | 0x3C,\n\t30482 - 19968: jis0212<<14 | 0x2D<<7 | 0x3D,\n\t30484 - 19968: jis0212<<14 | 0x2D<<7 | 0x3E,\n\t30485 - 19968: jis0212<<14 | 0x2D<<7 | 0x3F,\n\t30487 - 19968: jis0212<<14 | 0x2D<<7 | 0x40,\n\t30489 - 19968: jis0212<<14 | 0x2D<<7 | 0x41,\n\t30490 - 19968: jis0212<<14 | 0x2D<<7 | 0x42,\n\t30491 - 19968: jis0208<<14 | 0x41<<7 | 0x25,\n\t30492 - 19968: jis0212<<14 | 0x2D<<7 | 0x43,\n\t30494 - 19968: jis0208<<14 | 0x41<<7 | 0x22,\n\t30495 - 19968: jis0208<<14 | 0x1E<<7 | 0x1E,\n\t30496 - 19968: jis0208<<14 | 0x2B<<7 | 0x11,\n\t30498 - 19968: jis0212<<14 | 0x2D<<7 | 0x44,\n\t30500 - 19968: jis0208<<14 | 0x41<<7 | 0x21,\n\t30501 - 19968: jis0208<<14 | 0x41<<7 | 0x23,\n\t30502 - 19968: jis0208<<14 | 0x41<<7 | 0x24,\n\t30504 - 19968: jis0212<<14 | 0x2D<<7 | 0x45,\n\t30505 - 19968: jis0208<<14 | 0x41<<7 | 0x20,\n\t30509 - 19968: jis0212<<14 | 0x2D<<7 | 0x46,\n\t30510 - 19968: jis0212<<14 | 0x2D<<7 | 0x47,\n\t30511 - 19968: jis0212<<14 | 0x2D<<7 | 0x48,\n\t30516 - 19968: jis0212<<14 | 0x2D<<7 | 0x49,\n\t30517 - 19968: jis0212<<14 | 0x2D<<7 | 0x4A,\n\t30518 - 19968: jis0212<<14 | 0x2D<<7 | 0x4B,\n\t30519 - 19968: jis0208<<14 | 0x41<<7 | 0x26,\n\t30520 - 19968: jis0208<<14 | 0x41<<7 | 0x27,\n\t30521 - 19968: jis0212<<14 | 0x2D<<7 | 0x4C,\n\t30522 - 19968: jis0208<<14 | 0x23<<7 | 0x0E,\n\t30524 - 19968: jis0208<<14 | 0x13<<7 | 0x42,\n\t30525 - 19968: jis0212<<14 | 0x2D<<7 | 0x4D,\n\t30526 - 19968: jis0212<<14 | 0x2D<<7 | 0x4E,\n\t30528 - 19968: jis0208<<14 | 0x22<<7 | 0x44,\n\t30530 - 19968: jis0212<<14 | 0x2D<<7 | 0x4F,\n\t30533 - 19968: jis0212<<14 | 0x2D<<7 | 0x50,\n\t30534 - 19968: jis0208<<14 | 0x5A<<7 | 0x1A,\n\t30535 - 19968: jis0208<<14 | 0x41<<7 | 0x28,\n\t30538 - 19968: jis0212<<14 | 0x2D<<7 | 0x52,\n\t30541 - 19968: jis0212<<14 | 0x2D<<7 | 0x53,\n\t30542 - 19968: jis0212<<14 | 0x2D<<7 | 0x54,\n\t30543 - 19968: jis0212<<14 | 0x2D<<7 | 0x55,\n\t30546 - 19968: jis0212<<14 | 0x2D<<7 | 0x56,\n\t30550 - 19968: jis0212<<14 | 0x2D<<7 | 0x57,\n\t30551 - 19968: jis0212<<14 | 0x2D<<7 | 0x58,\n\t30554 - 19968: jis0208<<14 | 0x41<<7 | 0x29,\n\t30555 - 19968: jis0208<<14 | 0x41<<7 | 0x2C,\n\t30556 - 19968: jis0212<<14 | 0x2D<<7 | 0x59,\n\t30558 - 19968: jis0212<<14 | 0x2D<<7 | 0x5A,\n\t30559 - 19968: jis0212<<14 | 0x2D<<7 | 0x5B,\n\t30560 - 19968: jis0212<<14 | 0x2D<<7 | 0x5C,\n\t30561 - 19968: jis0208<<14 | 0x1E<<7 | 0x46,\n\t30562 - 19968: jis0212<<14 | 0x2D<<7 | 0x5D,\n\t30563 - 19968: jis0208<<14 | 0x25<<7 | 0x23,\n\t30564 - 19968: jis0212<<14 | 0x2E<<7 | 0x00,\n\t30565 - 19968: jis0208<<14 | 0x41<<7 | 0x2D,\n\t30566 - 19968: jis0208<<14 | 0x2A<<7 | 0x32,\n\t30567 - 19968: jis0212<<14 | 0x2E<<7 | 0x01,\n\t30568 - 19968: jis0208<<14 | 0x41<<7 | 0x2A,\n\t30570 - 19968: jis0212<<14 | 0x2E<<7 | 0x02,\n\t30571 - 19968: jis0208<<14 | 0x41<<7 | 0x2B,\n\t30572 - 19968: jis0212<<14 | 0x2E<<7 | 0x03,\n\t30576 - 19968: jis0212<<14 | 0x2E<<7 | 0x04,\n\t30578 - 19968: jis0212<<14 | 0x2E<<7 | 0x05,\n\t30579 - 19968: jis0212<<14 | 0x2E<<7 | 0x06,\n\t30580 - 19968: jis0212<<14 | 0x2E<<7 | 0x07,\n\t30585 - 19968: jis0208<<14 | 0x41<<7 | 0x30,\n\t30586 - 19968: jis0212<<14 | 0x2E<<7 | 0x08,\n\t30589 - 19968: jis0212<<14 | 0x2E<<7 | 0x09,\n\t30590 - 19968: jis0208<<14 | 0x41<<7 | 0x2F,\n\t30591 - 19968: jis0208<<14 | 0x41<<7 | 0x2E,\n\t30592 - 19968: jis0212<<14 | 0x2E<<7 | 0x0A,\n\t30596 - 19968: jis0212<<14 | 0x2E<<7 | 0x0B,\n\t30603 - 19968: jis0208<<14 | 0x41<<7 | 0x32,\n\t30604 - 19968: jis0212<<14 | 0x2E<<7 | 0x0C,\n\t30605 - 19968: jis0212<<14 | 0x2E<<7 | 0x0D,\n\t30606 - 19968: jis0208<<14 | 0x41<<7 | 0x31,\n\t30609 - 19968: jis0208<<14 | 0x41<<7 | 0x33,\n\t30612 - 19968: jis0212<<14 | 0x2E<<7 | 0x0E,\n\t30613 - 19968: jis0212<<14 | 0x2E<<7 | 0x0F,\n\t30614 - 19968: jis0212<<14 | 0x2E<<7 | 0x10,\n\t30618 - 19968: jis0212<<14 | 0x2E<<7 | 0x11,\n\t30622 - 19968: jis0208<<14 | 0x41<<7 | 0x35,\n\t30623 - 19968: jis0212<<14 | 0x2E<<7 | 0x12,\n\t30624 - 19968: jis0208<<14 | 0x41<<7 | 0x34,\n\t30626 - 19968: jis0212<<14 | 0x2E<<7 | 0x13,\n\t30629 - 19968: jis0208<<14 | 0x29<<7 | 0x2C,\n\t30631 - 19968: jis0212<<14 | 0x2E<<7 | 0x14,\n\t30634 - 19968: jis0212<<14 | 0x2E<<7 | 0x15,\n\t30636 - 19968: jis0208<<14 | 0x1C<<7 | 0x35,\n\t30637 - 19968: jis0208<<14 | 0x2D<<7 | 0x25,\n\t30638 - 19968: jis0212<<14 | 0x2E<<7 | 0x16,\n\t30639 - 19968: jis0212<<14 | 0x2E<<7 | 0x17,\n\t30640 - 19968: jis0208<<14 | 0x41<<7 | 0x36,\n\t30641 - 19968: jis0212<<14 | 0x2E<<7 | 0x18,\n\t30643 - 19968: jis0208<<14 | 0x25<<7 | 0x16,\n\t30645 - 19968: jis0212<<14 | 0x2E<<7 | 0x19,\n\t30646 - 19968: jis0208<<14 | 0x41<<7 | 0x37,\n\t30649 - 19968: jis0208<<14 | 0x41<<7 | 0x38,\n\t30651 - 19968: jis0208<<14 | 0x41<<7 | 0x3C,\n\t30652 - 19968: jis0208<<14 | 0x41<<7 | 0x3A,\n\t30653 - 19968: jis0208<<14 | 0x41<<7 | 0x3B,\n\t30654 - 19968: jis0212<<14 | 0x2E<<7 | 0x1A,\n\t30655 - 19968: jis0208<<14 | 0x41<<7 | 0x39,\n\t30659 - 19968: jis0212<<14 | 0x2E<<7 | 0x1B,\n\t30663 - 19968: jis0208<<14 | 0x41<<7 | 0x3D,\n\t30665 - 19968: jis0212<<14 | 0x2E<<7 | 0x1C,\n\t30669 - 19968: jis0208<<14 | 0x41<<7 | 0x3E,\n\t30673 - 19968: jis0212<<14 | 0x2E<<7 | 0x1D,\n\t30674 - 19968: jis0212<<14 | 0x2E<<7 | 0x1E,\n\t30677 - 19968: jis0212<<14 | 0x2E<<7 | 0x1F,\n\t30679 - 19968: jis0208<<14 | 0x41<<7 | 0x3F,\n\t30681 - 19968: jis0212<<14 | 0x2E<<7 | 0x20,\n\t30682 - 19968: jis0208<<14 | 0x41<<7 | 0x40,\n\t30683 - 19968: jis0208<<14 | 0x2B<<7 | 0x16,\n\t30684 - 19968: jis0208<<14 | 0x41<<7 | 0x41,\n\t30686 - 19968: jis0212<<14 | 0x2E<<7 | 0x21,\n\t30687 - 19968: jis0212<<14 | 0x2E<<7 | 0x22,\n\t30688 - 19968: jis0212<<14 | 0x2E<<7 | 0x23,\n\t30690 - 19968: jis0208<<14 | 0x2B<<7 | 0x4F,\n\t30691 - 19968: jis0208<<14 | 0x41<<7 | 0x42,\n\t30692 - 19968: jis0212<<14 | 0x2E<<7 | 0x24,\n\t30693 - 19968: jis0208<<14 | 0x22<<7 | 0x2D,\n\t30694 - 19968: jis0212<<14 | 0x2E<<7 | 0x25,\n\t30695 - 19968: jis0208<<14 | 0x26<<7 | 0x49,\n\t30697 - 19968: jis0208<<14 | 0x15<<7 | 0x4A,\n\t30698 - 19968: jis0212<<14 | 0x2E<<7 | 0x26,\n\t30700 - 19968: jis0212<<14 | 0x2E<<7 | 0x27,\n\t30701 - 19968: jis0208<<14 | 0x22<<7 | 0x1A,\n\t30702 - 19968: jis0208<<14 | 0x41<<7 | 0x43,\n\t30703 - 19968: jis0208<<14 | 0x15<<7 | 0x19,\n\t30704 - 19968: jis0212<<14 | 0x2E<<7 | 0x28,\n\t30705 - 19968: jis0212<<14 | 0x2E<<7 | 0x29,\n\t30707 - 19968: jis0208<<14 | 0x1F<<7 | 0x2F,\n\t30708 - 19968: jis0212<<14 | 0x2E<<7 | 0x2A,\n\t30712 - 19968: jis0212<<14 | 0x2E<<7 | 0x2B,\n\t30715 - 19968: jis0212<<14 | 0x2E<<7 | 0x2C,\n\t30716 - 19968: jis0208<<14 | 0x41<<7 | 0x44,\n\t30722 - 19968: jis0208<<14 | 0x19<<7 | 0x1C,\n\t30725 - 19968: jis0212<<14 | 0x2E<<7 | 0x2D,\n\t30726 - 19968: jis0212<<14 | 0x2E<<7 | 0x2E,\n\t30729 - 19968: jis0212<<14 | 0x2E<<7 | 0x2F,\n\t30732 - 19968: jis0208<<14 | 0x41<<7 | 0x45,\n\t30733 - 19968: jis0212<<14 | 0x2E<<7 | 0x30,\n\t30734 - 19968: jis0212<<14 | 0x2E<<7 | 0x31,\n\t30737 - 19968: jis0212<<14 | 0x2E<<7 | 0x32,\n\t30738 - 19968: jis0208<<14 | 0x41<<7 | 0x46,\n\t30740 - 19968: jis0208<<14 | 0x17<<7 | 0x05,\n\t30741 - 19968: jis0208<<14 | 0x19<<7 | 0x34,\n\t30749 - 19968: jis0212<<14 | 0x2E<<7 | 0x33,\n\t30752 - 19968: jis0208<<14 | 0x41<<7 | 0x48,\n\t30753 - 19968: jis0208<<14 | 0x5A<<7 | 0x1C,\n\t30754 - 19968: jis0212<<14 | 0x2E<<7 | 0x35,\n\t30755 - 19968: jis0212<<14 | 0x2E<<7 | 0x36,\n\t30757 - 19968: jis0208<<14 | 0x24<<7 | 0x35,\n\t30758 - 19968: jis0208<<14 | 0x19<<7 | 0x35,\n\t30759 - 19968: jis0208<<14 | 0x14<<7 | 0x2D,\n\t30765 - 19968: jis0212<<14 | 0x2E<<7 | 0x37,\n\t30766 - 19968: jis0212<<14 | 0x2E<<7 | 0x38,\n\t30768 - 19968: jis0212<<14 | 0x2E<<7 | 0x39,\n\t30770 - 19968: jis0208<<14 | 0x2A<<7 | 0x03,\n\t30772 - 19968: jis0208<<14 | 0x26<<7 | 0x2A,\n\t30773 - 19968: jis0212<<14 | 0x2E<<7 | 0x3A,\n\t30775 - 19968: jis0212<<14 | 0x2E<<7 | 0x3B,\n\t30778 - 19968: jis0208<<14 | 0x24<<7 | 0x36,\n\t30783 - 19968: jis0208<<14 | 0x18<<7 | 0x3B,\n\t30787 - 19968: jis0212<<14 | 0x2E<<7 | 0x3C,\n\t30788 - 19968: jis0212<<14 | 0x2E<<7 | 0x3D,\n\t30789 - 19968: jis0208<<14 | 0x41<<7 | 0x4A,\n\t30791 - 19968: jis0212<<14 | 0x2E<<7 | 0x3E,\n\t30792 - 19968: jis0212<<14 | 0x2E<<7 | 0x3F,\n\t30796 - 19968: jis0212<<14 | 0x2E<<7 | 0x40,\n\t30798 - 19968: jis0208<<14 | 0x5A<<7 | 0x1D,\n\t30802 - 19968: jis0212<<14 | 0x2E<<7 | 0x42,\n\t30812 - 19968: jis0212<<14 | 0x2E<<7 | 0x43,\n\t30813 - 19968: jis0208<<14 | 0x1D<<7 | 0x2A,\n\t30814 - 19968: jis0212<<14 | 0x2E<<7 | 0x44,\n\t30816 - 19968: jis0212<<14 | 0x2E<<7 | 0x45,\n\t30817 - 19968: jis0212<<14 | 0x2E<<7 | 0x46,\n\t30819 - 19968: jis0212<<14 | 0x2E<<7 | 0x47,\n\t30820 - 19968: jis0208<<14 | 0x5A<<7 | 0x1E,\n\t30824 - 19968: jis0212<<14 | 0x2E<<7 | 0x49,\n\t30826 - 19968: jis0212<<14 | 0x2E<<7 | 0x4A,\n\t30827 - 19968: jis0208<<14 | 0x2D<<7 | 0x11,\n\t30828 - 19968: jis0208<<14 | 0x18<<7 | 0x24,\n\t30830 - 19968: jis0212<<14 | 0x2E<<7 | 0x4B,\n\t30831 - 19968: jis0208<<14 | 0x17<<7 | 0x06,\n\t30834 - 19968: jis0208<<14 | 0x27<<7 | 0x02,\n\t30836 - 19968: jis0208<<14 | 0x41<<7 | 0x4C,\n\t30842 - 19968: jis0208<<14 | 0x5A<<7 | 0x1F,\n\t30844 - 19968: jis0208<<14 | 0x41<<7 | 0x4E,\n\t30846 - 19968: jis0212<<14 | 0x2E<<7 | 0x4D,\n\t30849 - 19968: jis0208<<14 | 0x17<<7 | 0x4A,\n\t30854 - 19968: jis0208<<14 | 0x41<<7 | 0x4D,\n\t30855 - 19968: jis0208<<14 | 0x23<<7 | 0x55,\n\t30858 - 19968: jis0212<<14 | 0x2E<<7 | 0x4E,\n\t30860 - 19968: jis0208<<14 | 0x41<<7 | 0x50,\n\t30861 - 19968: jis0208<<14 | 0x12<<7 | 0x16,\n\t30862 - 19968: jis0208<<14 | 0x41<<7 | 0x4B,\n\t30863 - 19968: jis0212<<14 | 0x2E<<7 | 0x4F,\n\t30865 - 19968: jis0208<<14 | 0x27<<7 | 0x49,\n\t30867 - 19968: jis0208<<14 | 0x10<<7 | 0x0F,\n\t30868 - 19968: jis0212<<14 | 0x2E<<7 | 0x50,\n\t30869 - 19968: jis0208<<14 | 0x19<<7 | 0x4B,\n\t30871 - 19968: jis0208<<14 | 0x2E<<7 | 0x31,\n\t30872 - 19968: jis0212<<14 | 0x2E<<7 | 0x51,\n\t30874 - 19968: jis0208<<14 | 0x41<<7 | 0x4F,\n\t30877 - 19968: jis0212<<14 | 0x2E<<7 | 0x53,\n\t30878 - 19968: jis0212<<14 | 0x2E<<7 | 0x54,\n\t30879 - 19968: jis0212<<14 | 0x2E<<7 | 0x55,\n\t30881 - 19968: jis0212<<14 | 0x2E<<7 | 0x52,\n\t30883 - 19968: jis0208<<14 | 0x41<<7 | 0x51,\n\t30884 - 19968: jis0212<<14 | 0x2E<<7 | 0x56,\n\t30887 - 19968: jis0208<<14 | 0x29<<7 | 0x2A,\n\t30888 - 19968: jis0212<<14 | 0x2E<<7 | 0x57,\n\t30889 - 19968: jis0208<<14 | 0x1F<<7 | 0x38,\n\t30890 - 19968: jis0208<<14 | 0x41<<7 | 0x53,\n\t30892 - 19968: jis0212<<14 | 0x2E<<7 | 0x58,\n\t30893 - 19968: jis0212<<14 | 0x2E<<7 | 0x59,\n\t30895 - 19968: jis0208<<14 | 0x41<<7 | 0x54,\n\t30896 - 19968: jis0212<<14 | 0x2E<<7 | 0x5A,\n\t30897 - 19968: jis0212<<14 | 0x2E<<7 | 0x5B,\n\t30898 - 19968: jis0212<<14 | 0x2E<<7 | 0x5C,\n\t30899 - 19968: jis0212<<14 | 0x2E<<7 | 0x5D,\n\t30901 - 19968: jis0208<<14 | 0x41<<7 | 0x52,\n\t30906 - 19968: jis0208<<14 | 0x12<<7 | 0x2D,\n\t30907 - 19968: jis0212<<14 | 0x2F<<7 | 0x00,\n\t30908 - 19968: jis0208<<14 | 0x41<<7 | 0x5A,\n\t30909 - 19968: jis0212<<14 | 0x2F<<7 | 0x01,\n\t30910 - 19968: jis0208<<14 | 0x41<<7 | 0x59,\n\t30911 - 19968: jis0212<<14 | 0x2F<<7 | 0x02,\n\t30913 - 19968: jis0208<<14 | 0x1B<<7 | 0x06,\n\t30917 - 19968: jis0208<<14 | 0x41<<7 | 0x5B,\n\t30918 - 19968: jis0208<<14 | 0x41<<7 | 0x56,\n\t30919 - 19968: jis0212<<14 | 0x2F<<7 | 0x03,\n\t30920 - 19968: jis0212<<14 | 0x2F<<7 | 0x04,\n\t30921 - 19968: jis0212<<14 | 0x2F<<7 | 0x05,\n\t30922 - 19968: jis0208<<14 | 0x41<<7 | 0x5C,\n\t30923 - 19968: jis0208<<14 | 0x41<<7 | 0x57,\n\t30924 - 19968: jis0212<<14 | 0x2F<<7 | 0x06,\n\t30926 - 19968: jis0212<<14 | 0x2F<<7 | 0x07,\n\t30928 - 19968: jis0208<<14 | 0x27<<7 | 0x37,\n\t30929 - 19968: jis0208<<14 | 0x41<<7 | 0x55,\n\t30930 - 19968: jis0212<<14 | 0x2F<<7 | 0x08,\n\t30931 - 19968: jis0212<<14 | 0x2F<<7 | 0x09,\n\t30932 - 19968: jis0208<<14 | 0x41<<7 | 0x58,\n\t30933 - 19968: jis0212<<14 | 0x2F<<7 | 0x0A,\n\t30934 - 19968: jis0212<<14 | 0x2F<<7 | 0x0B,\n\t30938 - 19968: jis0208<<14 | 0x42<<7 | 0x01,\n\t30939 - 19968: jis0212<<14 | 0x2F<<7 | 0x0D,\n\t30943 - 19968: jis0212<<14 | 0x2F<<7 | 0x0E,\n\t30944 - 19968: jis0212<<14 | 0x2F<<7 | 0x0F,\n\t30945 - 19968: jis0212<<14 | 0x2F<<7 | 0x10,\n\t30948 - 19968: jis0212<<14 | 0x2F<<7 | 0x0C,\n\t30950 - 19968: jis0212<<14 | 0x2F<<7 | 0x11,\n\t30951 - 19968: jis0208<<14 | 0x42<<7 | 0x00,\n\t30952 - 19968: jis0208<<14 | 0x2A<<7 | 0x40,\n\t30954 - 19968: jis0212<<14 | 0x2F<<7 | 0x12,\n\t30956 - 19968: jis0208<<14 | 0x41<<7 | 0x5D,\n\t30959 - 19968: jis0208<<14 | 0x0F<<7 | 0x4A,\n\t30962 - 19968: jis0212<<14 | 0x2F<<7 | 0x13,\n\t30963 - 19968: jis0212<<14 | 0x2F<<7 | 0x14,\n\t30964 - 19968: jis0208<<14 | 0x42<<7 | 0x03,\n\t30966 - 19968: jis0212<<14 | 0x2F<<7 | 0x16,\n\t30967 - 19968: jis0212<<14 | 0x2F<<7 | 0x17,\n\t30970 - 19968: jis0212<<14 | 0x2F<<7 | 0x18,\n\t30971 - 19968: jis0212<<14 | 0x2F<<7 | 0x19,\n\t30973 - 19968: jis0208<<14 | 0x42<<7 | 0x02,\n\t30975 - 19968: jis0212<<14 | 0x2F<<7 | 0x1A,\n\t30976 - 19968: jis0212<<14 | 0x2F<<7 | 0x15,\n\t30977 - 19968: jis0208<<14 | 0x1D<<7 | 0x2B,\n\t30982 - 19968: jis0212<<14 | 0x2F<<7 | 0x1B,\n\t30983 - 19968: jis0208<<14 | 0x42<<7 | 0x04,\n\t30988 - 19968: jis0212<<14 | 0x2F<<7 | 0x1C,\n\t30990 - 19968: jis0208<<14 | 0x20<<7 | 0x22,\n\t30992 - 19968: jis0212<<14 | 0x2F<<7 | 0x1D,\n\t30993 - 19968: jis0208<<14 | 0x42<<7 | 0x06,\n\t30994 - 19968: jis0208<<14 | 0x42<<7 | 0x05,\n\t31001 - 19968: jis0208<<14 | 0x42<<7 | 0x07,\n\t31002 - 19968: jis0212<<14 | 0x2F<<7 | 0x1E,\n\t31004 - 19968: jis0212<<14 | 0x2F<<7 | 0x1F,\n\t31006 - 19968: jis0212<<14 | 0x2F<<7 | 0x20,\n\t31007 - 19968: jis0212<<14 | 0x2F<<7 | 0x21,\n\t31008 - 19968: jis0212<<14 | 0x2F<<7 | 0x22,\n\t31013 - 19968: jis0212<<14 | 0x2F<<7 | 0x23,\n\t31014 - 19968: jis0208<<14 | 0x41<<7 | 0x47,\n\t31015 - 19968: jis0212<<14 | 0x2F<<7 | 0x24,\n\t31017 - 19968: jis0212<<14 | 0x2F<<7 | 0x25,\n\t31018 - 19968: jis0208<<14 | 0x41<<7 | 0x49,\n\t31019 - 19968: jis0208<<14 | 0x42<<7 | 0x09,\n\t31020 - 19968: jis0208<<14 | 0x42<<7 | 0x08,\n\t31021 - 19968: jis0212<<14 | 0x2F<<7 | 0x26,\n\t31024 - 19968: jis0208<<14 | 0x5A<<7 | 0x20,\n\t31025 - 19968: jis0212<<14 | 0x2F<<7 | 0x27,\n\t31028 - 19968: jis0212<<14 | 0x2F<<7 | 0x28,\n\t31029 - 19968: jis0212<<14 | 0x2F<<7 | 0x29,\n\t31034 - 19968: jis0208<<14 | 0x1B<<7 | 0x07,\n\t31035 - 19968: jis0212<<14 | 0x2F<<7 | 0x2A,\n\t31036 - 19968: jis0208<<14 | 0x2D<<7 | 0x48,\n\t31037 - 19968: jis0212<<14 | 0x2F<<7 | 0x2B,\n\t31038 - 19968: jis0208<<14 | 0x1B<<7 | 0x31,\n\t31039 - 19968: jis0212<<14 | 0x2F<<7 | 0x2C,\n\t31040 - 19968: jis0208<<14 | 0x42<<7 | 0x0A,\n\t31041 - 19968: jis0208<<14 | 0x16<<7 | 0x16,\n\t31044 - 19968: jis0212<<14 | 0x2F<<7 | 0x2D,\n\t31045 - 19968: jis0212<<14 | 0x2F<<7 | 0x2E,\n\t31046 - 19968: jis0212<<14 | 0x2F<<7 | 0x2F,\n\t31047 - 19968: jis0208<<14 | 0x14<<7 | 0x1F,\n\t31048 - 19968: jis0208<<14 | 0x14<<7 | 0x06,\n\t31049 - 19968: jis0208<<14 | 0x1A<<7 | 0x42,\n\t31050 - 19968: jis0212<<14 | 0x2F<<7 | 0x30,\n\t31051 - 19968: jis0212<<14 | 0x2F<<7 | 0x31,\n\t31055 - 19968: jis0212<<14 | 0x2F<<7 | 0x32,\n\t31056 - 19968: jis0208<<14 | 0x2C<<7 | 0x13,\n\t31057 - 19968: jis0212<<14 | 0x2F<<7 | 0x33,\n\t31059 - 19968: jis0208<<14 | 0x42<<7 | 0x10,\n\t31060 - 19968: jis0212<<14 | 0x2F<<7 | 0x34,\n\t31061 - 19968: jis0208<<14 | 0x42<<7 | 0x0F,\n\t31062 - 19968: jis0208<<14 | 0x20<<7 | 0x23,\n\t31063 - 19968: jis0208<<14 | 0x42<<7 | 0x0C,\n\t31064 - 19968: jis0212<<14 | 0x2F<<7 | 0x35,\n\t31066 - 19968: jis0208<<14 | 0x42<<7 | 0x0E,\n\t31067 - 19968: jis0212<<14 | 0x2F<<7 | 0x36,\n\t31068 - 19968: jis0212<<14 | 0x2F<<7 | 0x37,\n\t31069 - 19968: jis0208<<14 | 0x1C<<7 | 0x2A,\n\t31070 - 19968: jis0208<<14 | 0x1E<<7 | 0x1F,\n\t31071 - 19968: jis0208<<14 | 0x42<<7 | 0x0D,\n\t31072 - 19968: jis0208<<14 | 0x42<<7 | 0x0B,\n\t31074 - 19968: jis0208<<14 | 0x26<<7 | 0x09,\n\t31077 - 19968: jis0208<<14 | 0x1D<<7 | 0x2C,\n\t31079 - 19968: jis0212<<14 | 0x2F<<7 | 0x38,\n\t31080 - 19968: jis0208<<14 | 0x28<<7 | 0x1B,\n\t31081 - 19968: jis0212<<14 | 0x2F<<7 | 0x39,\n\t31083 - 19968: jis0212<<14 | 0x2F<<7 | 0x3A,\n\t31085 - 19968: jis0208<<14 | 0x19<<7 | 0x36,\n\t31090 - 19968: jis0212<<14 | 0x2F<<7 | 0x3B,\n\t31095 - 19968: jis0208<<14 | 0x24<<7 | 0x57,\n\t31097 - 19968: jis0212<<14 | 0x2F<<7 | 0x3C,\n\t31098 - 19968: jis0208<<14 | 0x42<<7 | 0x11,\n\t31099 - 19968: jis0212<<14 | 0x2F<<7 | 0x3D,\n\t31100 - 19968: jis0212<<14 | 0x2F<<7 | 0x3E,\n\t31102 - 19968: jis0212<<14 | 0x2F<<7 | 0x3F,\n\t31103 - 19968: jis0208<<14 | 0x42<<7 | 0x12,\n\t31104 - 19968: jis0208<<14 | 0x42<<7 | 0x28,\n\t31105 - 19968: jis0208<<14 | 0x15<<7 | 0x37,\n\t31108 - 19968: jis0208<<14 | 0x2E<<7 | 0x1C,\n\t31109 - 19968: jis0208<<14 | 0x20<<7 | 0x14,\n\t31114 - 19968: jis0208<<14 | 0x42<<7 | 0x13,\n\t31115 - 19968: jis0212<<14 | 0x2F<<7 | 0x40,\n\t31116 - 19968: jis0212<<14 | 0x2F<<7 | 0x41,\n\t31117 - 19968: jis0208<<14 | 0x11<<7 | 0x31,\n\t31118 - 19968: jis0208<<14 | 0x23<<7 | 0x56,\n\t31119 - 19968: jis0208<<14 | 0x29<<7 | 0x00,\n\t31121 - 19968: jis0212<<14 | 0x2F<<7 | 0x42,\n\t31123 - 19968: jis0212<<14 | 0x2F<<7 | 0x43,\n\t31124 - 19968: jis0208<<14 | 0x5A<<7 | 0x24,\n\t31125 - 19968: jis0212<<14 | 0x2F<<7 | 0x45,\n\t31126 - 19968: jis0212<<14 | 0x2F<<7 | 0x46,\n\t31128 - 19968: jis0212<<14 | 0x2F<<7 | 0x47,\n\t31131 - 19968: jis0208<<14 | 0x5A<<7 | 0x26,\n\t31132 - 19968: jis0212<<14 | 0x2F<<7 | 0x49,\n\t31133 - 19968: jis0208<<14 | 0x42<<7 | 0x14,\n\t31137 - 19968: jis0212<<14 | 0x2F<<7 | 0x4A,\n\t31142 - 19968: jis0208<<14 | 0x14<<7 | 0x59,\n\t31143 - 19968: jis0208<<14 | 0x42<<7 | 0x15,\n\t31144 - 19968: jis0212<<14 | 0x2F<<7 | 0x4B,\n\t31145 - 19968: jis0212<<14 | 0x2F<<7 | 0x4C,\n\t31146 - 19968: jis0208<<14 | 0x42<<7 | 0x17,\n\t31147 - 19968: jis0212<<14 | 0x2F<<7 | 0x4D,\n\t31150 - 19968: jis0208<<14 | 0x42<<7 | 0x18,\n\t31151 - 19968: jis0212<<14 | 0x2F<<7 | 0x4E,\n\t31152 - 19968: jis0208<<14 | 0x26<<7 | 0x08,\n\t31153 - 19968: jis0212<<14 | 0x2F<<7 | 0x4F,\n\t31155 - 19968: jis0208<<14 | 0x42<<7 | 0x19,\n\t31156 - 19968: jis0212<<14 | 0x2F<<7 | 0x50,\n\t31160 - 19968: jis0212<<14 | 0x2F<<7 | 0x51,\n\t31161 - 19968: jis0208<<14 | 0x42<<7 | 0x1A,\n\t31162 - 19968: jis0208<<14 | 0x42<<7 | 0x1B,\n\t31163 - 19968: jis0212<<14 | 0x2F<<7 | 0x52,\n\t31165 - 19968: jis0208<<14 | 0x15<<7 | 0x38,\n\t31166 - 19968: jis0208<<14 | 0x11<<7 | 0x32,\n\t31167 - 19968: jis0208<<14 | 0x25<<7 | 0x24,\n\t31168 - 19968: jis0208<<14 | 0x1C<<7 | 0x07,\n\t31169 - 19968: jis0208<<14 | 0x1A<<7 | 0x43,\n\t31170 - 19968: jis0212<<14 | 0x2F<<7 | 0x53,\n\t31172 - 19968: jis0212<<14 | 0x2F<<7 | 0x54,\n\t31175 - 19968: jis0212<<14 | 0x2F<<7 | 0x55,\n\t31176 - 19968: jis0212<<14 | 0x2F<<7 | 0x56,\n\t31177 - 19968: jis0208<<14 | 0x42<<7 | 0x1C,\n\t31178 - 19968: jis0212<<14 | 0x2F<<7 | 0x57,\n\t31179 - 19968: jis0208<<14 | 0x1C<<7 | 0x08,\n\t31183 - 19968: jis0212<<14 | 0x2F<<7 | 0x58,\n\t31185 - 19968: jis0208<<14 | 0x11<<7 | 0x29,\n\t31186 - 19968: jis0208<<14 | 0x28<<7 | 0x22,\n\t31188 - 19968: jis0212<<14 | 0x2F<<7 | 0x59,\n\t31189 - 19968: jis0208<<14 | 0x42<<7 | 0x1D,\n\t31190 - 19968: jis0212<<14 | 0x2F<<7 | 0x5A,\n\t31192 - 19968: jis0208<<14 | 0x27<<7 | 0x4A,\n\t31194 - 19968: jis0212<<14 | 0x2F<<7 | 0x5B,\n\t31197 - 19968: jis0212<<14 | 0x2F<<7 | 0x5C,\n\t31198 - 19968: jis0212<<14 | 0x2F<<7 | 0x5D,\n\t31199 - 19968: jis0208<<14 | 0x20<<7 | 0x24,\n\t31200 - 19968: jis0212<<14 | 0x30<<7 | 0x00,\n\t31201 - 19968: jis0208<<14 | 0x42<<7 | 0x20,\n\t31202 - 19968: jis0212<<14 | 0x30<<7 | 0x01,\n\t31203 - 19968: jis0208<<14 | 0x42<<7 | 0x21,\n\t31204 - 19968: jis0208<<14 | 0x26<<7 | 0x48,\n\t31205 - 19968: jis0212<<14 | 0x30<<7 | 0x02,\n\t31206 - 19968: jis0208<<14 | 0x1E<<7 | 0x20,\n\t31207 - 19968: jis0208<<14 | 0x42<<7 | 0x1E,\n\t31209 - 19968: jis0208<<14 | 0x22<<7 | 0x40,\n\t31210 - 19968: jis0212<<14 | 0x30<<7 | 0x03,\n\t31211 - 19968: jis0212<<14 | 0x30<<7 | 0x04,\n\t31212 - 19968: jis0208<<14 | 0x42<<7 | 0x1F,\n\t31213 - 19968: jis0212<<14 | 0x30<<7 | 0x05,\n\t31216 - 19968: jis0208<<14 | 0x1D<<7 | 0x2D,\n\t31217 - 19968: jis0212<<14 | 0x30<<7 | 0x06,\n\t31224 - 19968: jis0212<<14 | 0x30<<7 | 0x07,\n\t31227 - 19968: jis0208<<14 | 0x0F<<7 | 0x3B,\n\t31228 - 19968: jis0212<<14 | 0x30<<7 | 0x08,\n\t31232 - 19968: jis0208<<14 | 0x14<<7 | 0x08,\n\t31234 - 19968: jis0212<<14 | 0x30<<7 | 0x09,\n\t31235 - 19968: jis0212<<14 | 0x30<<7 | 0x0A,\n\t31239 - 19968: jis0212<<14 | 0x30<<7 | 0x0B,\n\t31240 - 19968: jis0208<<14 | 0x42<<7 | 0x22,\n\t31241 - 19968: jis0212<<14 | 0x30<<7 | 0x0C,\n\t31242 - 19968: jis0212<<14 | 0x30<<7 | 0x0D,\n\t31243 - 19968: jis0208<<14 | 0x23<<7 | 0x57,\n\t31244 - 19968: jis0212<<14 | 0x30<<7 | 0x0E,\n\t31245 - 19968: jis0208<<14 | 0x42<<7 | 0x23,\n\t31246 - 19968: jis0208<<14 | 0x1F<<7 | 0x26,\n\t31249 - 19968: jis0212<<14 | 0x30<<7 | 0x0F,\n\t31252 - 19968: jis0208<<14 | 0x2B<<7 | 0x0C,\n\t31253 - 19968: jis0212<<14 | 0x30<<7 | 0x10,\n\t31255 - 19968: jis0208<<14 | 0x28<<7 | 0x02,\n\t31256 - 19968: jis0208<<14 | 0x42<<7 | 0x24,\n\t31257 - 19968: jis0208<<14 | 0x42<<7 | 0x25,\n\t31258 - 19968: jis0208<<14 | 0x22<<7 | 0x34,\n\t31259 - 19968: jis0212<<14 | 0x30<<7 | 0x11,\n\t31260 - 19968: jis0208<<14 | 0x2D<<7 | 0x26,\n\t31262 - 19968: jis0212<<14 | 0x30<<7 | 0x12,\n\t31263 - 19968: jis0208<<14 | 0x42<<7 | 0x27,\n\t31264 - 19968: jis0208<<14 | 0x42<<7 | 0x26,\n\t31265 - 19968: jis0212<<14 | 0x30<<7 | 0x13,\n\t31271 - 19968: jis0212<<14 | 0x30<<7 | 0x14,\n\t31275 - 19968: jis0212<<14 | 0x30<<7 | 0x15,\n\t31277 - 19968: jis0212<<14 | 0x30<<7 | 0x16,\n\t31278 - 19968: jis0208<<14 | 0x1B<<7 | 0x4E,\n\t31279 - 19968: jis0212<<14 | 0x30<<7 | 0x17,\n\t31280 - 19968: jis0212<<14 | 0x30<<7 | 0x18,\n\t31281 - 19968: jis0208<<14 | 0x42<<7 | 0x29,\n\t31282 - 19968: jis0208<<14 | 0x0F<<7 | 0x4F,\n\t31284 - 19968: jis0212<<14 | 0x30<<7 | 0x19,\n\t31285 - 19968: jis0212<<14 | 0x30<<7 | 0x1A,\n\t31287 - 19968: jis0208<<14 | 0x42<<7 | 0x2C,\n\t31288 - 19968: jis0212<<14 | 0x30<<7 | 0x1B,\n\t31289 - 19968: jis0212<<14 | 0x30<<7 | 0x1C,\n\t31290 - 19968: jis0212<<14 | 0x30<<7 | 0x1D,\n\t31291 - 19968: jis0208<<14 | 0x42<<7 | 0x2A,\n\t31292 - 19968: jis0208<<14 | 0x11<<7 | 0x33,\n\t31293 - 19968: jis0208<<14 | 0x16<<7 | 0x2D,\n\t31294 - 19968: jis0208<<14 | 0x42<<7 | 0x2B,\n\t31295 - 19968: jis0208<<14 | 0x18<<7 | 0x25,\n\t31296 - 19968: jis0208<<14 | 0x18<<7 | 0x51,\n\t31298 - 19968: jis0208<<14 | 0x29<<7 | 0x45,\n\t31299 - 19968: jis0208<<14 | 0x42<<7 | 0x2D,\n\t31300 - 19968: jis0212<<14 | 0x30<<7 | 0x1E,\n\t31301 - 19968: jis0212<<14 | 0x30<<7 | 0x1F,\n\t31302 - 19968: jis0208<<14 | 0x2A<<7 | 0x33,\n\t31303 - 19968: jis0212<<14 | 0x30<<7 | 0x20,\n\t31304 - 19968: jis0212<<14 | 0x30<<7 | 0x21,\n\t31305 - 19968: jis0208<<14 | 0x42<<7 | 0x2F,\n\t31308 - 19968: jis0212<<14 | 0x30<<7 | 0x22,\n\t31309 - 19968: jis0208<<14 | 0x1F<<7 | 0x30,\n\t31310 - 19968: jis0208<<14 | 0x10<<7 | 0x2E,\n\t31311 - 19968: jis0208<<14 | 0x11<<7 | 0x19,\n\t31312 - 19968: jis0208<<14 | 0x0F<<7 | 0x0B,\n\t31317 - 19968: jis0212<<14 | 0x30<<7 | 0x23,\n\t31318 - 19968: jis0212<<14 | 0x30<<7 | 0x24,\n\t31319 - 19968: jis0208<<14 | 0x42<<7 | 0x2E,\n\t31321 - 19968: jis0212<<14 | 0x30<<7 | 0x25,\n\t31324 - 19968: jis0212<<14 | 0x30<<7 | 0x26,\n\t31325 - 19968: jis0212<<14 | 0x30<<7 | 0x27,\n\t31327 - 19968: jis0212<<14 | 0x30<<7 | 0x28,\n\t31328 - 19968: jis0212<<14 | 0x30<<7 | 0x29,\n\t31329 - 19968: jis0208<<14 | 0x42<<7 | 0x30,\n\t31330 - 19968: jis0208<<14 | 0x42<<7 | 0x31,\n\t31331 - 19968: jis0208<<14 | 0x1D<<7 | 0x56,\n\t31333 - 19968: jis0212<<14 | 0x30<<7 | 0x2A,\n\t31335 - 19968: jis0212<<14 | 0x30<<7 | 0x2B,\n\t31337 - 19968: jis0208<<14 | 0x42<<7 | 0x32,\n\t31338 - 19968: jis0212<<14 | 0x30<<7 | 0x2C,\n\t31339 - 19968: jis0208<<14 | 0x12<<7 | 0x2E,\n\t31341 - 19968: jis0212<<14 | 0x30<<7 | 0x2D,\n\t31344 - 19968: jis0208<<14 | 0x42<<7 | 0x34,\n\t31348 - 19968: jis0208<<14 | 0x16<<7 | 0x49,\n\t31349 - 19968: jis0212<<14 | 0x30<<7 | 0x2E,\n\t31350 - 19968: jis0208<<14 | 0x14<<7 | 0x45,\n\t31352 - 19968: jis0212<<14 | 0x30<<7 | 0x2F,\n\t31353 - 19968: jis0208<<14 | 0x42<<7 | 0x35,\n\t31354 - 19968: jis0208<<14 | 0x15<<7 | 0x54,\n\t31357 - 19968: jis0208<<14 | 0x42<<7 | 0x36,\n\t31358 - 19968: jis0212<<14 | 0x30<<7 | 0x30,\n\t31359 - 19968: jis0208<<14 | 0x1F<<7 | 0x5B,\n\t31360 - 19968: jis0212<<14 | 0x30<<7 | 0x31,\n\t31361 - 19968: jis0208<<14 | 0x25<<7 | 0x2C,\n\t31362 - 19968: jis0212<<14 | 0x30<<7 | 0x32,\n\t31363 - 19968: jis0208<<14 | 0x1F<<7 | 0x3F,\n\t31364 - 19968: jis0208<<14 | 0x19<<7 | 0x54,\n\t31365 - 19968: jis0212<<14 | 0x30<<7 | 0x33,\n\t31366 - 19968: jis0212<<14 | 0x30<<7 | 0x34,\n\t31368 - 19968: jis0208<<14 | 0x42<<7 | 0x37,\n\t31370 - 19968: jis0212<<14 | 0x30<<7 | 0x35,\n\t31371 - 19968: jis0212<<14 | 0x30<<7 | 0x36,\n\t31376 - 19968: jis0212<<14 | 0x30<<7 | 0x37,\n\t31377 - 19968: jis0212<<14 | 0x30<<7 | 0x38,\n\t31378 - 19968: jis0208<<14 | 0x22<<7 | 0x41,\n\t31379 - 19968: jis0208<<14 | 0x20<<7 | 0x4A,\n\t31380 - 19968: jis0212<<14 | 0x30<<7 | 0x39,\n\t31381 - 19968: jis0208<<14 | 0x42<<7 | 0x39,\n\t31382 - 19968: jis0208<<14 | 0x42<<7 | 0x3B,\n\t31383 - 19968: jis0208<<14 | 0x42<<7 | 0x38,\n\t31384 - 19968: jis0208<<14 | 0x42<<7 | 0x3A,\n\t31390 - 19968: jis0212<<14 | 0x30<<7 | 0x3A,\n\t31391 - 19968: jis0208<<14 | 0x16<<7 | 0x01,\n\t31392 - 19968: jis0212<<14 | 0x30<<7 | 0x3B,\n\t31395 - 19968: jis0212<<14 | 0x30<<7 | 0x3C,\n\t31401 - 19968: jis0208<<14 | 0x42<<7 | 0x3C,\n\t31402 - 19968: jis0208<<14 | 0x16<<7 | 0x05,\n\t31404 - 19968: jis0212<<14 | 0x30<<7 | 0x3D,\n\t31406 - 19968: jis0208<<14 | 0x14<<7 | 0x46,\n\t31407 - 19968: jis0208<<14 | 0x2C<<7 | 0x31,\n\t31408 - 19968: jis0208<<14 | 0x42<<7 | 0x3E,\n\t31411 - 19968: jis0212<<14 | 0x30<<7 | 0x3E,\n\t31413 - 19968: jis0212<<14 | 0x30<<7 | 0x3F,\n\t31414 - 19968: jis0208<<14 | 0x42<<7 | 0x3F,\n\t31417 - 19968: jis0212<<14 | 0x30<<7 | 0x40,\n\t31418 - 19968: jis0208<<14 | 0x10<<7 | 0x0D,\n\t31419 - 19968: jis0212<<14 | 0x30<<7 | 0x41,\n\t31420 - 19968: jis0212<<14 | 0x30<<7 | 0x42,\n\t31423 - 19968: jis0208<<14 | 0x42<<7 | 0x42,\n\t31427 - 19968: jis0208<<14 | 0x12<<7 | 0x55,\n\t31428 - 19968: jis0208<<14 | 0x42<<7 | 0x41,\n\t31429 - 19968: jis0208<<14 | 0x42<<7 | 0x40,\n\t31430 - 19968: jis0212<<14 | 0x30<<7 | 0x43,\n\t31431 - 19968: jis0208<<14 | 0x42<<7 | 0x44,\n\t31432 - 19968: jis0208<<14 | 0x42<<7 | 0x3D,\n\t31433 - 19968: jis0212<<14 | 0x30<<7 | 0x44,\n\t31434 - 19968: jis0208<<14 | 0x42<<7 | 0x45,\n\t31435 - 19968: jis0208<<14 | 0x2D<<7 | 0x08,\n\t31436 - 19968: jis0212<<14 | 0x30<<7 | 0x45,\n\t31437 - 19968: jis0208<<14 | 0x42<<7 | 0x46,\n\t31438 - 19968: jis0212<<14 | 0x30<<7 | 0x46,\n\t31439 - 19968: jis0208<<14 | 0x42<<7 | 0x47,\n\t31441 - 19968: jis0208<<14 | 0x5A<<7 | 0x27,\n\t31442 - 19968: jis0208<<14 | 0x33<<7 | 0x53,\n\t31443 - 19968: jis0208<<14 | 0x42<<7 | 0x49,\n\t31445 - 19968: jis0208<<14 | 0x42<<7 | 0x48,\n\t31449 - 19968: jis0208<<14 | 0x42<<7 | 0x4A,\n\t31450 - 19968: jis0208<<14 | 0x42<<7 | 0x4B,\n\t31451 - 19968: jis0212<<14 | 0x30<<7 | 0x48,\n\t31452 - 19968: jis0208<<14 | 0x2D<<7 | 0x14,\n\t31453 - 19968: jis0208<<14 | 0x42<<7 | 0x4C,\n\t31455 - 19968: jis0208<<14 | 0x4F<<7 | 0x4E,\n\t31456 - 19968: jis0208<<14 | 0x1D<<7 | 0x2E,\n\t31457 - 19968: jis0208<<14 | 0x42<<7 | 0x4D,\n\t31458 - 19968: jis0208<<14 | 0x42<<7 | 0x4E,\n\t31459 - 19968: jis0208<<14 | 0x1C<<7 | 0x36,\n\t31461 - 19968: jis0208<<14 | 0x25<<7 | 0x17,\n\t31462 - 19968: jis0208<<14 | 0x42<<7 | 0x4F,\n\t31463 - 19968: jis0208<<14 | 0x5A<<7 | 0x28,\n\t31464 - 19968: jis0212<<14 | 0x30<<7 | 0x49,\n\t31465 - 19968: jis0212<<14 | 0x30<<7 | 0x4A,\n\t31466 - 19968: jis0208<<14 | 0x22<<7 | 0x07,\n\t31467 - 19968: jis0208<<14 | 0x5A<<7 | 0x2A,\n\t31468 - 19968: jis0212<<14 | 0x30<<7 | 0x4C,\n\t31469 - 19968: jis0208<<14 | 0x42<<7 | 0x50,\n\t31471 - 19968: jis0208<<14 | 0x22<<7 | 0x1B,\n\t31472 - 19968: jis0208<<14 | 0x42<<7 | 0x51,\n\t31473 - 19968: jis0212<<14 | 0x30<<7 | 0x4D,\n\t31476 - 19968: jis0212<<14 | 0x30<<7 | 0x4E,\n\t31478 - 19968: jis0208<<14 | 0x15<<7 | 0x04,\n\t31480 - 19968: jis0208<<14 | 0x30<<7 | 0x1E,\n\t31481 - 19968: jis0208<<14 | 0x22<<7 | 0x3C,\n\t31482 - 19968: jis0208<<14 | 0x1B<<7 | 0x12,\n\t31483 - 19968: jis0212<<14 | 0x30<<7 | 0x4F,\n\t31485 - 19968: jis0212<<14 | 0x30<<7 | 0x50,\n\t31486 - 19968: jis0212<<14 | 0x30<<7 | 0x51,\n\t31487 - 19968: jis0208<<14 | 0x13<<7 | 0x27,\n\t31490 - 19968: jis0208<<14 | 0x42<<7 | 0x52,\n\t31492 - 19968: jis0208<<14 | 0x43<<7 | 0x01,\n\t31494 - 19968: jis0208<<14 | 0x42<<7 | 0x55,\n\t31495 - 19968: jis0212<<14 | 0x30<<7 | 0x52,\n\t31496 - 19968: jis0208<<14 | 0x14<<7 | 0x47,\n\t31498 - 19968: jis0208<<14 | 0x42<<7 | 0x54,\n\t31499 - 19968: jis0208<<14 | 0x43<<7 | 0x03,\n\t31503 - 19968: jis0208<<14 | 0x42<<7 | 0x53,\n\t31505 - 19968: jis0208<<14 | 0x1D<<7 | 0x2F,\n\t31508 - 19968: jis0212<<14 | 0x30<<7 | 0x53,\n\t31512 - 19968: jis0208<<14 | 0x42<<7 | 0x57,\n\t31513 - 19968: jis0208<<14 | 0x42<<7 | 0x58,\n\t31515 - 19968: jis0208<<14 | 0x24<<7 | 0x0A,\n\t31518 - 19968: jis0208<<14 | 0x42<<7 | 0x59,\n\t31519 - 19968: jis0212<<14 | 0x30<<7 | 0x54,\n\t31520 - 19968: jis0208<<14 | 0x12<<7 | 0x3D,\n\t31523 - 19968: jis0212<<14 | 0x30<<7 | 0x55,\n\t31525 - 19968: jis0208<<14 | 0x1E<<7 | 0x39,\n\t31526 - 19968: jis0208<<14 | 0x28<<7 | 0x43,\n\t31527 - 19968: jis0212<<14 | 0x30<<7 | 0x56,\n\t31528 - 19968: jis0208<<14 | 0x42<<7 | 0x5B,\n\t31529 - 19968: jis0212<<14 | 0x30<<7 | 0x57,\n\t31530 - 19968: jis0212<<14 | 0x30<<7 | 0x58,\n\t31531 - 19968: jis0212<<14 | 0x30<<7 | 0x59,\n\t31532 - 19968: jis0208<<14 | 0x21<<7 | 0x47,\n\t31533 - 19968: jis0212<<14 | 0x30<<7 | 0x5A,\n\t31534 - 19968: jis0212<<14 | 0x30<<7 | 0x5B,\n\t31535 - 19968: jis0212<<14 | 0x30<<7 | 0x5C,\n\t31536 - 19968: jis0212<<14 | 0x30<<7 | 0x5D,\n\t31537 - 19968: jis0212<<14 | 0x31<<7 | 0x00,\n\t31539 - 19968: jis0208<<14 | 0x42<<7 | 0x56,\n\t31540 - 19968: jis0212<<14 | 0x31<<7 | 0x01,\n\t31541 - 19968: jis0208<<14 | 0x42<<7 | 0x5A,\n\t31542 - 19968: jis0208<<14 | 0x42<<7 | 0x5C,\n\t31545 - 19968: jis0208<<14 | 0x19<<7 | 0x5A,\n\t31549 - 19968: jis0212<<14 | 0x31<<7 | 0x02,\n\t31551 - 19968: jis0212<<14 | 0x31<<7 | 0x03,\n\t31552 - 19968: jis0212<<14 | 0x31<<7 | 0x04,\n\t31553 - 19968: jis0212<<14 | 0x31<<7 | 0x05,\n\t31557 - 19968: jis0208<<14 | 0x43<<7 | 0x05,\n\t31558 - 19968: jis0208<<14 | 0x28<<7 | 0x0D,\n\t31559 - 19968: jis0212<<14 | 0x31<<7 | 0x06,\n\t31560 - 19968: jis0208<<14 | 0x27<<7 | 0x05,\n\t31561 - 19968: jis0208<<14 | 0x24<<7 | 0x58,\n\t31563 - 19968: jis0208<<14 | 0x15<<7 | 0x39,\n\t31564 - 19968: jis0208<<14 | 0x43<<7 | 0x04,\n\t31565 - 19968: jis0208<<14 | 0x43<<7 | 0x02,\n\t31566 - 19968: jis0212<<14 | 0x31<<7 | 0x07,\n\t31567 - 19968: jis0208<<14 | 0x27<<7 | 0x14,\n\t31568 - 19968: jis0208<<14 | 0x42<<7 | 0x5D,\n\t31569 - 19968: jis0208<<14 | 0x22<<7 | 0x3D,\n\t31570 - 19968: jis0208<<14 | 0x24<<7 | 0x5A,\n\t31572 - 19968: jis0208<<14 | 0x24<<7 | 0x59,\n\t31573 - 19968: jis0212<<14 | 0x31<<7 | 0x08,\n\t31574 - 19968: jis0208<<14 | 0x19<<7 | 0x55,\n\t31581 - 19968: jis0208<<14 | 0x43<<7 | 0x17,\n\t31584 - 19968: jis0212<<14 | 0x31<<7 | 0x09,\n\t31588 - 19968: jis0212<<14 | 0x31<<7 | 0x0A,\n\t31589 - 19968: jis0208<<14 | 0x43<<7 | 0x07,\n\t31590 - 19968: jis0212<<14 | 0x31<<7 | 0x0B,\n\t31591 - 19968: jis0208<<14 | 0x43<<7 | 0x09,\n\t31593 - 19968: jis0212<<14 | 0x31<<7 | 0x0C,\n\t31594 - 19968: jis0212<<14 | 0x31<<7 | 0x0D,\n\t31596 - 19968: jis0208<<14 | 0x43<<7 | 0x0C,\n\t31597 - 19968: jis0212<<14 | 0x31<<7 | 0x0E,\n\t31598 - 19968: jis0208<<14 | 0x43<<7 | 0x0D,\n\t31599 - 19968: jis0212<<14 | 0x31<<7 | 0x0F,\n\t31600 - 19968: jis0208<<14 | 0x43<<7 | 0x0A,\n\t31601 - 19968: jis0208<<14 | 0x43<<7 | 0x0B,\n\t31602 - 19968: jis0212<<14 | 0x31<<7 | 0x10,\n\t31603 - 19968: jis0212<<14 | 0x31<<7 | 0x11,\n\t31604 - 19968: jis0208<<14 | 0x43<<7 | 0x08,\n\t31605 - 19968: jis0208<<14 | 0x43<<7 | 0x06,\n\t31607 - 19968: jis0212<<14 | 0x31<<7 | 0x12,\n\t31610 - 19968: jis0208<<14 | 0x43<<7 | 0x00,\n\t31620 - 19968: jis0212<<14 | 0x31<<7 | 0x13,\n\t31622 - 19968: jis0208<<14 | 0x29<<7 | 0x2E,\n\t31623 - 19968: jis0208<<14 | 0x11<<7 | 0x34,\n\t31625 - 19968: jis0212<<14 | 0x31<<7 | 0x14,\n\t31627 - 19968: jis0208<<14 | 0x43<<7 | 0x14,\n\t31629 - 19968: jis0208<<14 | 0x43<<7 | 0x11,\n\t31630 - 19968: jis0212<<14 | 0x31<<7 | 0x15,\n\t31631 - 19968: jis0208<<14 | 0x43<<7 | 0x16,\n\t31632 - 19968: jis0212<<14 | 0x31<<7 | 0x16,\n\t31633 - 19968: jis0212<<14 | 0x31<<7 | 0x17,\n\t31634 - 19968: jis0208<<14 | 0x43<<7 | 0x15,\n\t31636 - 19968: jis0208<<14 | 0x26<<7 | 0x52,\n\t31637 - 19968: jis0208<<14 | 0x2B<<7 | 0x06,\n\t31638 - 19968: jis0212<<14 | 0x31<<7 | 0x18,\n\t31639 - 19968: jis0208<<14 | 0x1A<<7 | 0x1A,\n\t31640 - 19968: jis0208<<14 | 0x43<<7 | 0x0F,\n\t31641 - 19968: jis0208<<14 | 0x43<<7 | 0x18,\n\t31642 - 19968: jis0208<<14 | 0x43<<7 | 0x13,\n\t31643 - 19968: jis0212<<14 | 0x31<<7 | 0x19,\n\t31644 - 19968: jis0208<<14 | 0x43<<7 | 0x12,\n\t31645 - 19968: jis0208<<14 | 0x43<<7 | 0x0E,\n\t31646 - 19968: jis0208<<14 | 0x5A<<7 | 0x2B,\n\t31647 - 19968: jis0208<<14 | 0x43<<7 | 0x10,\n\t31648 - 19968: jis0212<<14 | 0x31<<7 | 0x1B,\n\t31649 - 19968: jis0208<<14 | 0x13<<7 | 0x28,\n\t31653 - 19968: jis0212<<14 | 0x31<<7 | 0x1C,\n\t31658 - 19968: jis0208<<14 | 0x22<<7 | 0x1C,\n\t31660 - 19968: jis0212<<14 | 0x31<<7 | 0x1D,\n\t31661 - 19968: jis0208<<14 | 0x1F<<7 | 0x5C,\n\t31663 - 19968: jis0212<<14 | 0x31<<7 | 0x1E,\n\t31664 - 19968: jis0212<<14 | 0x31<<7 | 0x1F,\n\t31665 - 19968: jis0208<<14 | 0x27<<7 | 0x01,\n\t31666 - 19968: jis0212<<14 | 0x31<<7 | 0x20,\n\t31668 - 19968: jis0208<<14 | 0x43<<7 | 0x1D,\n\t31669 - 19968: jis0212<<14 | 0x31<<7 | 0x21,\n\t31670 - 19968: jis0212<<14 | 0x31<<7 | 0x22,\n\t31672 - 19968: jis0208<<14 | 0x27<<7 | 0x03,\n\t31674 - 19968: jis0212<<14 | 0x31<<7 | 0x23,\n\t31675 - 19968: jis0212<<14 | 0x31<<7 | 0x24,\n\t31676 - 19968: jis0212<<14 | 0x31<<7 | 0x25,\n\t31677 - 19968: jis0212<<14 | 0x31<<7 | 0x26,\n\t31680 - 19968: jis0208<<14 | 0x1F<<7 | 0x40,\n\t31681 - 19968: jis0208<<14 | 0x43<<7 | 0x1A,\n\t31682 - 19968: jis0212<<14 | 0x31<<7 | 0x27,\n\t31684 - 19968: jis0208<<14 | 0x27<<7 | 0x2E,\n\t31685 - 19968: jis0212<<14 | 0x31<<7 | 0x28,\n\t31686 - 19968: jis0208<<14 | 0x43<<7 | 0x1E,\n\t31687 - 19968: jis0208<<14 | 0x29<<7 | 0x32,\n\t31688 - 19968: jis0212<<14 | 0x31<<7 | 0x29,\n\t31689 - 19968: jis0208<<14 | 0x22<<7 | 0x3A,\n\t31690 - 19968: jis0212<<14 | 0x31<<7 | 0x2A,\n\t31691 - 19968: jis0208<<14 | 0x43<<7 | 0x19,\n\t31692 - 19968: jis0208<<14 | 0x43<<7 | 0x1B,\n\t31695 - 19968: jis0208<<14 | 0x43<<7 | 0x1C,\n\t31700 - 19968: jis0212<<14 | 0x31<<7 | 0x2B,\n\t31702 - 19968: jis0212<<14 | 0x31<<7 | 0x2C,\n\t31703 - 19968: jis0212<<14 | 0x31<<7 | 0x2D,\n\t31705 - 19968: jis0212<<14 | 0x31<<7 | 0x2E,\n\t31706 - 19968: jis0212<<14 | 0x31<<7 | 0x2F,\n\t31707 - 19968: jis0212<<14 | 0x31<<7 | 0x30,\n\t31709 - 19968: jis0208<<14 | 0x43<<7 | 0x1F,\n\t31712 - 19968: jis0208<<14 | 0x1B<<7 | 0x23,\n\t31716 - 19968: jis0208<<14 | 0x25<<7 | 0x25,\n\t31717 - 19968: jis0208<<14 | 0x43<<7 | 0x24,\n\t31718 - 19968: jis0208<<14 | 0x43<<7 | 0x23,\n\t31720 - 19968: jis0212<<14 | 0x31<<7 | 0x31,\n\t31721 - 19968: jis0208<<14 | 0x43<<7 | 0x20,\n\t31722 - 19968: jis0212<<14 | 0x31<<7 | 0x32,\n\t31725 - 19968: jis0208<<14 | 0x2E<<7 | 0x15,\n\t31730 - 19968: jis0212<<14 | 0x31<<7 | 0x33,\n\t31731 - 19968: jis0208<<14 | 0x43<<7 | 0x29,\n\t31732 - 19968: jis0212<<14 | 0x31<<7 | 0x34,\n\t31733 - 19968: jis0212<<14 | 0x31<<7 | 0x35,\n\t31734 - 19968: jis0208<<14 | 0x43<<7 | 0x2D,\n\t31735 - 19968: jis0208<<14 | 0x43<<7 | 0x2A,\n\t31736 - 19968: jis0212<<14 | 0x31<<7 | 0x36,\n\t31737 - 19968: jis0212<<14 | 0x31<<7 | 0x37,\n\t31738 - 19968: jis0212<<14 | 0x31<<7 | 0x38,\n\t31740 - 19968: jis0212<<14 | 0x31<<7 | 0x39,\n\t31742 - 19968: jis0212<<14 | 0x31<<7 | 0x3A,\n\t31744 - 19968: jis0208<<14 | 0x43<<7 | 0x26,\n\t31745 - 19968: jis0212<<14 | 0x31<<7 | 0x3B,\n\t31746 - 19968: jis0212<<14 | 0x31<<7 | 0x3C,\n\t31747 - 19968: jis0212<<14 | 0x31<<7 | 0x3D,\n\t31748 - 19968: jis0212<<14 | 0x31<<7 | 0x3E,\n\t31750 - 19968: jis0212<<14 | 0x31<<7 | 0x3F,\n\t31751 - 19968: jis0208<<14 | 0x43<<7 | 0x27,\n\t31753 - 19968: jis0212<<14 | 0x31<<7 | 0x40,\n\t31755 - 19968: jis0212<<14 | 0x31<<7 | 0x41,\n\t31756 - 19968: jis0212<<14 | 0x31<<7 | 0x42,\n\t31757 - 19968: jis0208<<14 | 0x43<<7 | 0x2C,\n\t31758 - 19968: jis0212<<14 | 0x31<<7 | 0x43,\n\t31759 - 19968: jis0212<<14 | 0x31<<7 | 0x44,\n\t31761 - 19968: jis0208<<14 | 0x43<<7 | 0x21,\n\t31762 - 19968: jis0208<<14 | 0x31<<7 | 0x34,\n\t31763 - 19968: jis0208<<14 | 0x43<<7 | 0x28,\n\t31764 - 19968: jis0208<<14 | 0x43<<7 | 0x22,\n\t31767 - 19968: jis0208<<14 | 0x43<<7 | 0x2B,\n\t31769 - 19968: jis0212<<14 | 0x31<<7 | 0x45,\n\t31771 - 19968: jis0212<<14 | 0x31<<7 | 0x46,\n\t31775 - 19968: jis0208<<14 | 0x43<<7 | 0x31,\n\t31776 - 19968: jis0212<<14 | 0x31<<7 | 0x47,\n\t31777 - 19968: jis0208<<14 | 0x13<<7 | 0x29,\n\t31779 - 19968: jis0208<<14 | 0x43<<7 | 0x2E,\n\t31781 - 19968: jis0212<<14 | 0x31<<7 | 0x48,\n\t31782 - 19968: jis0212<<14 | 0x31<<7 | 0x49,\n\t31783 - 19968: jis0208<<14 | 0x43<<7 | 0x2F,\n\t31784 - 19968: jis0212<<14 | 0x31<<7 | 0x4A,\n\t31786 - 19968: jis0208<<14 | 0x43<<7 | 0x30,\n\t31787 - 19968: jis0208<<14 | 0x43<<7 | 0x33,\n\t31788 - 19968: jis0212<<14 | 0x31<<7 | 0x4B,\n\t31793 - 19968: jis0212<<14 | 0x31<<7 | 0x4C,\n\t31795 - 19968: jis0212<<14 | 0x31<<7 | 0x4D,\n\t31796 - 19968: jis0212<<14 | 0x31<<7 | 0x4E,\n\t31798 - 19968: jis0212<<14 | 0x31<<7 | 0x4F,\n\t31799 - 19968: jis0208<<14 | 0x43<<7 | 0x32,\n\t31800 - 19968: jis0208<<14 | 0x27<<7 | 0x55,\n\t31801 - 19968: jis0212<<14 | 0x31<<7 | 0x50,\n\t31802 - 19968: jis0212<<14 | 0x31<<7 | 0x51,\n\t31805 - 19968: jis0208<<14 | 0x43<<7 | 0x34,\n\t31806 - 19968: jis0208<<14 | 0x2D<<7 | 0x5B,\n\t31807 - 19968: jis0208<<14 | 0x29<<7 | 0x4C,\n\t31808 - 19968: jis0208<<14 | 0x43<<7 | 0x39,\n\t31811 - 19968: jis0208<<14 | 0x43<<7 | 0x36,\n\t31814 - 19968: jis0212<<14 | 0x31<<7 | 0x52,\n\t31818 - 19968: jis0212<<14 | 0x31<<7 | 0x53,\n\t31820 - 19968: jis0208<<14 | 0x43<<7 | 0x35,\n\t31821 - 19968: jis0208<<14 | 0x1F<<7 | 0x31,\n\t31823 - 19968: jis0208<<14 | 0x43<<7 | 0x38,\n\t31824 - 19968: jis0208<<14 | 0x43<<7 | 0x3A,\n\t31825 - 19968: jis0212<<14 | 0x31<<7 | 0x55,\n\t31826 - 19968: jis0212<<14 | 0x31<<7 | 0x56,\n\t31827 - 19968: jis0212<<14 | 0x31<<7 | 0x57,\n\t31828 - 19968: jis0208<<14 | 0x43<<7 | 0x37,\n\t31829 - 19968: jis0212<<14 | 0x31<<7 | 0x54,\n\t31830 - 19968: jis0208<<14 | 0x43<<7 | 0x3E,\n\t31832 - 19968: jis0208<<14 | 0x43<<7 | 0x3B,\n\t31833 - 19968: jis0212<<14 | 0x31<<7 | 0x58,\n\t31834 - 19968: jis0212<<14 | 0x31<<7 | 0x59,\n\t31835 - 19968: jis0212<<14 | 0x31<<7 | 0x5A,\n\t31836 - 19968: jis0212<<14 | 0x31<<7 | 0x5B,\n\t31837 - 19968: jis0212<<14 | 0x31<<7 | 0x5C,\n\t31838 - 19968: jis0212<<14 | 0x31<<7 | 0x5D,\n\t31839 - 19968: jis0208<<14 | 0x43<<7 | 0x3C,\n\t31840 - 19968: jis0208<<14 | 0x43<<7 | 0x25,\n\t31841 - 19968: jis0212<<14 | 0x32<<7 | 0x00,\n\t31843 - 19968: jis0212<<14 | 0x32<<7 | 0x01,\n\t31844 - 19968: jis0208<<14 | 0x43<<7 | 0x3D,\n\t31845 - 19968: jis0208<<14 | 0x43<<7 | 0x3F,\n\t31847 - 19968: jis0212<<14 | 0x32<<7 | 0x02,\n\t31849 - 19968: jis0212<<14 | 0x32<<7 | 0x03,\n\t31852 - 19968: jis0208<<14 | 0x43<<7 | 0x40,\n\t31853 - 19968: jis0212<<14 | 0x32<<7 | 0x04,\n\t31854 - 19968: jis0212<<14 | 0x32<<7 | 0x05,\n\t31856 - 19968: jis0212<<14 | 0x32<<7 | 0x06,\n\t31858 - 19968: jis0212<<14 | 0x32<<7 | 0x07,\n\t31859 - 19968: jis0208<<14 | 0x29<<7 | 0x25,\n\t31861 - 19968: jis0208<<14 | 0x43<<7 | 0x41,\n\t31865 - 19968: jis0212<<14 | 0x32<<7 | 0x08,\n\t31868 - 19968: jis0212<<14 | 0x32<<7 | 0x09,\n\t31869 - 19968: jis0212<<14 | 0x32<<7 | 0x0A,\n\t31870 - 19968: jis0208<<14 | 0x2B<<7 | 0x41,\n\t31873 - 19968: jis0208<<14 | 0x15<<7 | 0x2D,\n\t31874 - 19968: jis0208<<14 | 0x16<<7 | 0x08,\n\t31875 - 19968: jis0208<<14 | 0x43<<7 | 0x42,\n\t31878 - 19968: jis0212<<14 | 0x32<<7 | 0x0B,\n\t31879 - 19968: jis0212<<14 | 0x32<<7 | 0x0C,\n\t31881 - 19968: jis0208<<14 | 0x29<<7 | 0x13,\n\t31883 - 19968: jis0208<<14 | 0x1E<<7 | 0x47,\n\t31885 - 19968: jis0208<<14 | 0x2B<<7 | 0x0F,\n\t31887 - 19968: jis0212<<14 | 0x32<<7 | 0x0D,\n\t31888 - 19968: jis0208<<14 | 0x43<<7 | 0x43,\n\t31890 - 19968: jis0208<<14 | 0x2D<<7 | 0x12,\n\t31892 - 19968: jis0212<<14 | 0x32<<7 | 0x0E,\n\t31893 - 19968: jis0208<<14 | 0x26<<7 | 0x53,\n\t31895 - 19968: jis0208<<14 | 0x20<<7 | 0x25,\n\t31896 - 19968: jis0208<<14 | 0x26<<7 | 0x13,\n\t31899 - 19968: jis0208<<14 | 0x1C<<7 | 0x2C,\n\t31902 - 19968: jis0212<<14 | 0x32<<7 | 0x0F,\n\t31903 - 19968: jis0208<<14 | 0x0F<<7 | 0x1F,\n\t31904 - 19968: jis0212<<14 | 0x32<<7 | 0x10,\n\t31905 - 19968: jis0208<<14 | 0x43<<7 | 0x48,\n\t31906 - 19968: jis0208<<14 | 0x43<<7 | 0x46,\n\t31908 - 19968: jis0208<<14 | 0x43<<7 | 0x44,\n\t31909 - 19968: jis0208<<14 | 0x13<<7 | 0x00,\n\t31910 - 19968: jis0212<<14 | 0x32<<7 | 0x11,\n\t31911 - 19968: jis0208<<14 | 0x1D<<7 | 0x30,\n\t31912 - 19968: jis0208<<14 | 0x43<<7 | 0x49,\n\t31915 - 19968: jis0208<<14 | 0x43<<7 | 0x47,\n\t31917 - 19968: jis0208<<14 | 0x43<<7 | 0x45,\n\t31918 - 19968: jis0208<<14 | 0x43<<7 | 0x4D,\n\t31920 - 19968: jis0212<<14 | 0x32<<7 | 0x12,\n\t31921 - 19968: jis0208<<14 | 0x43<<7 | 0x4C,\n\t31922 - 19968: jis0208<<14 | 0x43<<7 | 0x4B,\n\t31923 - 19968: jis0208<<14 | 0x43<<7 | 0x4A,\n\t31926 - 19968: jis0212<<14 | 0x32<<7 | 0x13,\n\t31927 - 19968: jis0212<<14 | 0x32<<7 | 0x14,\n\t31929 - 19968: jis0208<<14 | 0x43<<7 | 0x4E,\n\t31930 - 19968: jis0212<<14 | 0x32<<7 | 0x15,\n\t31931 - 19968: jis0212<<14 | 0x32<<7 | 0x16,\n\t31932 - 19968: jis0212<<14 | 0x32<<7 | 0x17,\n\t31933 - 19968: jis0208<<14 | 0x43<<7 | 0x4F,\n\t31934 - 19968: jis0208<<14 | 0x1F<<7 | 0x19,\n\t31935 - 19968: jis0212<<14 | 0x32<<7 | 0x18,\n\t31936 - 19968: jis0208<<14 | 0x43<<7 | 0x50,\n\t31938 - 19968: jis0208<<14 | 0x43<<7 | 0x52,\n\t31940 - 19968: jis0212<<14 | 0x32<<7 | 0x19,\n\t31941 - 19968: jis0208<<14 | 0x43<<7 | 0x51,\n\t31943 - 19968: jis0212<<14 | 0x32<<7 | 0x1A,\n\t31944 - 19968: jis0212<<14 | 0x32<<7 | 0x1B,\n\t31945 - 19968: jis0212<<14 | 0x32<<7 | 0x1C,\n\t31946 - 19968: jis0208<<14 | 0x17<<7 | 0x31,\n\t31949 - 19968: jis0212<<14 | 0x32<<7 | 0x1D,\n\t31950 - 19968: jis0208<<14 | 0x20<<7 | 0x17,\n\t31951 - 19968: jis0212<<14 | 0x32<<7 | 0x1E,\n\t31954 - 19968: jis0208<<14 | 0x43<<7 | 0x54,\n\t31955 - 19968: jis0212<<14 | 0x32<<7 | 0x1F,\n\t31956 - 19968: jis0212<<14 | 0x32<<7 | 0x20,\n\t31957 - 19968: jis0212<<14 | 0x32<<7 | 0x21,\n\t31958 - 19968: jis0208<<14 | 0x24<<7 | 0x5B,\n\t31959 - 19968: jis0212<<14 | 0x32<<7 | 0x22,\n\t31960 - 19968: jis0208<<14 | 0x43<<7 | 0x53,\n\t31961 - 19968: jis0212<<14 | 0x32<<7 | 0x23,\n\t31962 - 19968: jis0212<<14 | 0x32<<7 | 0x24,\n\t31964 - 19968: jis0208<<14 | 0x43<<7 | 0x55,\n\t31965 - 19968: jis0212<<14 | 0x32<<7 | 0x25,\n\t31966 - 19968: jis0208<<14 | 0x29<<7 | 0x14,\n\t31967 - 19968: jis0208<<14 | 0x20<<7 | 0x4B,\n\t31968 - 19968: jis0208<<14 | 0x18<<7 | 0x26,\n\t31970 - 19968: jis0208<<14 | 0x43<<7 | 0x56,\n\t31974 - 19968: jis0212<<14 | 0x32<<7 | 0x26,\n\t31975 - 19968: jis0208<<14 | 0x2D<<7 | 0x27,\n\t31977 - 19968: jis0212<<14 | 0x32<<7 | 0x27,\n\t31979 - 19968: jis0212<<14 | 0x32<<7 | 0x28,\n\t31983 - 19968: jis0208<<14 | 0x43<<7 | 0x58,\n\t31986 - 19968: jis0208<<14 | 0x43<<7 | 0x59,\n\t31988 - 19968: jis0208<<14 | 0x43<<7 | 0x5A,\n\t31989 - 19968: jis0212<<14 | 0x32<<7 | 0x29,\n\t31990 - 19968: jis0208<<14 | 0x43<<7 | 0x5B,\n\t31992 - 19968: jis0208<<14 | 0x1A<<7 | 0x44,\n\t31994 - 19968: jis0208<<14 | 0x43<<7 | 0x5C,\n\t31995 - 19968: jis0208<<14 | 0x16<<7 | 0x2E,\n\t31998 - 19968: jis0208<<14 | 0x14<<7 | 0x49,\n\t32000 - 19968: jis0208<<14 | 0x14<<7 | 0x09,\n\t32002 - 19968: jis0208<<14 | 0x44<<7 | 0x00,\n\t32003 - 19968: jis0212<<14 | 0x32<<7 | 0x2A,\n\t32004 - 19968: jis0208<<14 | 0x2B<<7 | 0x52,\n\t32005 - 19968: jis0208<<14 | 0x18<<7 | 0x27,\n\t32006 - 19968: jis0208<<14 | 0x43<<7 | 0x5D,\n\t32007 - 19968: jis0212<<14 | 0x32<<7 | 0x2B,\n\t32008 - 19968: jis0212<<14 | 0x32<<7 | 0x2C,\n\t32009 - 19968: jis0212<<14 | 0x32<<7 | 0x2D,\n\t32010 - 19968: jis0208<<14 | 0x44<<7 | 0x03,\n\t32011 - 19968: jis0208<<14 | 0x2B<<7 | 0x45,\n\t32013 - 19968: jis0208<<14 | 0x26<<7 | 0x1B,\n\t32015 - 19968: jis0212<<14 | 0x32<<7 | 0x2E,\n\t32016 - 19968: jis0208<<14 | 0x28<<7 | 0x12,\n\t32017 - 19968: jis0212<<14 | 0x32<<7 | 0x2F,\n\t32018 - 19968: jis0212<<14 | 0x32<<7 | 0x30,\n\t32019 - 19968: jis0212<<14 | 0x32<<7 | 0x31,\n\t32020 - 19968: jis0208<<14 | 0x1C<<7 | 0x42,\n\t32021 - 19968: jis0208<<14 | 0x44<<7 | 0x02,\n\t32022 - 19968: jis0212<<14 | 0x32<<7 | 0x32,\n\t32023 - 19968: jis0208<<14 | 0x1B<<7 | 0x32,\n\t32024 - 19968: jis0208<<14 | 0x18<<7 | 0x28,\n\t32025 - 19968: jis0208<<14 | 0x1A<<7 | 0x45,\n\t32026 - 19968: jis0208<<14 | 0x14<<7 | 0x48,\n\t32027 - 19968: jis0208<<14 | 0x29<<7 | 0x15,\n\t32028 - 19968: jis0208<<14 | 0x44<<7 | 0x01,\n\t32029 - 19968: jis0212<<14 | 0x32<<7 | 0x33,\n\t32030 - 19968: jis0212<<14 | 0x32<<7 | 0x34,\n\t32032 - 19968: jis0208<<14 | 0x20<<7 | 0x26,\n\t32033 - 19968: jis0208<<14 | 0x2A<<7 | 0x21,\n\t32034 - 19968: jis0208<<14 | 0x19<<7 | 0x56,\n\t32035 - 19968: jis0212<<14 | 0x32<<7 | 0x35,\n\t32038 - 19968: jis0212<<14 | 0x32<<7 | 0x36,\n\t32042 - 19968: jis0212<<14 | 0x32<<7 | 0x37,\n\t32043 - 19968: jis0208<<14 | 0x1A<<7 | 0x46,\n\t32044 - 19968: jis0208<<14 | 0x23<<7 | 0x3C,\n\t32045 - 19968: jis0212<<14 | 0x32<<7 | 0x38,\n\t32046 - 19968: jis0208<<14 | 0x44<<7 | 0x06,\n\t32047 - 19968: jis0208<<14 | 0x2D<<7 | 0x3E,\n\t32048 - 19968: jis0208<<14 | 0x19<<7 | 0x38,\n\t32049 - 19968: jis0212<<14 | 0x32<<7 | 0x39,\n\t32050 - 19968: jis0208<<14 | 0x44<<7 | 0x07,\n\t32051 - 19968: jis0208<<14 | 0x1E<<7 | 0x21,\n\t32053 - 19968: jis0208<<14 | 0x44<<7 | 0x09,\n\t32057 - 19968: jis0208<<14 | 0x1D<<7 | 0x31,\n\t32058 - 19968: jis0208<<14 | 0x19<<7 | 0x0F,\n\t32060 - 19968: jis0212<<14 | 0x32<<7 | 0x3A,\n\t32061 - 19968: jis0212<<14 | 0x32<<7 | 0x3B,\n\t32062 - 19968: jis0212<<14 | 0x32<<7 | 0x3C,\n\t32063 - 19968: jis0208<<14 | 0x44<<7 | 0x08,\n\t32064 - 19968: jis0212<<14 | 0x32<<7 | 0x3D,\n\t32065 - 19968: jis0212<<14 | 0x32<<7 | 0x3E,\n\t32066 - 19968: jis0208<<14 | 0x1C<<7 | 0x09,\n\t32067 - 19968: jis0208<<14 | 0x17<<7 | 0x1D,\n\t32068 - 19968: jis0208<<14 | 0x20<<7 | 0x27,\n\t32069 - 19968: jis0208<<14 | 0x44<<7 | 0x04,\n\t32070 - 19968: jis0208<<14 | 0x44<<7 | 0x0A,\n\t32071 - 19968: jis0212<<14 | 0x32<<7 | 0x3F,\n\t32072 - 19968: jis0208<<14 | 0x5A<<7 | 0x2D,\n\t32075 - 19968: jis0208<<14 | 0x44<<7 | 0x05,\n\t32076 - 19968: jis0208<<14 | 0x16<<7 | 0x2F,\n\t32077 - 19968: jis0212<<14 | 0x32<<7 | 0x41,\n\t32078 - 19968: jis0208<<14 | 0x44<<7 | 0x0D,\n\t32079 - 19968: jis0208<<14 | 0x44<<7 | 0x11,\n\t32080 - 19968: jis0208<<14 | 0x16<<7 | 0x4A,\n\t32081 - 19968: jis0212<<14 | 0x32<<7 | 0x42,\n\t32083 - 19968: jis0212<<14 | 0x32<<7 | 0x43,\n\t32086 - 19968: jis0208<<14 | 0x44<<7 | 0x0C,\n\t32087 - 19968: jis0212<<14 | 0x32<<7 | 0x44,\n\t32089 - 19968: jis0212<<14 | 0x32<<7 | 0x45,\n\t32090 - 19968: jis0212<<14 | 0x32<<7 | 0x46,\n\t32091 - 19968: jis0208<<14 | 0x44<<7 | 0x15,\n\t32092 - 19968: jis0208<<14 | 0x5A<<7 | 0x2E,\n\t32093 - 19968: jis0212<<14 | 0x32<<7 | 0x48,\n\t32094 - 19968: jis0208<<14 | 0x18<<7 | 0x29,\n\t32097 - 19968: jis0208<<14 | 0x2C<<7 | 0x4C,\n\t32098 - 19968: jis0208<<14 | 0x0F<<7 | 0x1B,\n\t32099 - 19968: jis0208<<14 | 0x44<<7 | 0x12,\n\t32101 - 19968: jis0212<<14 | 0x32<<7 | 0x49,\n\t32102 - 19968: jis0208<<14 | 0x14<<7 | 0x4A,\n\t32103 - 19968: jis0212<<14 | 0x32<<7 | 0x4A,\n\t32104 - 19968: jis0208<<14 | 0x44<<7 | 0x0F,\n\t32106 - 19968: jis0212<<14 | 0x32<<7 | 0x4B,\n\t32110 - 19968: jis0208<<14 | 0x44<<7 | 0x10,\n\t32112 - 19968: jis0212<<14 | 0x32<<7 | 0x4C,\n\t32113 - 19968: jis0208<<14 | 0x24<<7 | 0x5C,\n\t32114 - 19968: jis0208<<14 | 0x44<<7 | 0x0E,\n\t32115 - 19968: jis0208<<14 | 0x44<<7 | 0x0B,\n\t32117 - 19968: jis0208<<14 | 0x12<<7 | 0x07,\n\t32118 - 19968: jis0208<<14 | 0x1F<<7 | 0x43,\n\t32120 - 19968: jis0212<<14 | 0x32<<7 | 0x4D,\n\t32121 - 19968: jis0208<<14 | 0x17<<7 | 0x07,\n\t32122 - 19968: jis0212<<14 | 0x32<<7 | 0x4E,\n\t32123 - 19968: jis0212<<14 | 0x32<<7 | 0x4F,\n\t32125 - 19968: jis0208<<14 | 0x44<<7 | 0x17,\n\t32127 - 19968: jis0212<<14 | 0x32<<7 | 0x50,\n\t32129 - 19968: jis0212<<14 | 0x32<<7 | 0x51,\n\t32130 - 19968: jis0212<<14 | 0x32<<7 | 0x52,\n\t32131 - 19968: jis0212<<14 | 0x32<<7 | 0x53,\n\t32133 - 19968: jis0212<<14 | 0x32<<7 | 0x54,\n\t32134 - 19968: jis0212<<14 | 0x32<<7 | 0x55,\n\t32136 - 19968: jis0212<<14 | 0x32<<7 | 0x56,\n\t32137 - 19968: jis0208<<14 | 0x44<<7 | 0x14,\n\t32139 - 19968: jis0212<<14 | 0x32<<7 | 0x57,\n\t32140 - 19968: jis0212<<14 | 0x32<<7 | 0x58,\n\t32141 - 19968: jis0212<<14 | 0x32<<7 | 0x59,\n\t32143 - 19968: jis0208<<14 | 0x44<<7 | 0x16,\n\t32145 - 19968: jis0212<<14 | 0x32<<7 | 0x5A,\n\t32147 - 19968: jis0208<<14 | 0x44<<7 | 0x13,\n\t32150 - 19968: jis0212<<14 | 0x32<<7 | 0x5B,\n\t32151 - 19968: jis0212<<14 | 0x32<<7 | 0x5C,\n\t32153 - 19968: jis0208<<14 | 0x16<<7 | 0x30,\n\t32154 - 19968: jis0208<<14 | 0x21<<7 | 0x12,\n\t32155 - 19968: jis0208<<14 | 0x44<<7 | 0x18,\n\t32156 - 19968: jis0208<<14 | 0x20<<7 | 0x4D,\n\t32157 - 19968: jis0212<<14 | 0x32<<7 | 0x5D,\n\t32158 - 19968: jis0212<<14 | 0x33<<7 | 0x00,\n\t32159 - 19968: jis0208<<14 | 0x44<<7 | 0x25,\n\t32160 - 19968: jis0208<<14 | 0x5A<<7 | 0x30,\n\t32162 - 19968: jis0208<<14 | 0x44<<7 | 0x21,\n\t32163 - 19968: jis0208<<14 | 0x44<<7 | 0x1B,\n\t32166 - 19968: jis0212<<14 | 0x33<<7 | 0x01,\n\t32167 - 19968: jis0212<<14 | 0x33<<7 | 0x02,\n\t32170 - 19968: jis0212<<14 | 0x33<<7 | 0x03,\n\t32171 - 19968: jis0208<<14 | 0x44<<7 | 0x1F,\n\t32172 - 19968: jis0208<<14 | 0x1B<<7 | 0x59,\n\t32173 - 19968: jis0208<<14 | 0x0F<<7 | 0x3C,\n\t32174 - 19968: jis0208<<14 | 0x44<<7 | 0x1A,\n\t32175 - 19968: jis0208<<14 | 0x44<<7 | 0x22,\n\t32176 - 19968: jis0208<<14 | 0x44<<7 | 0x26,\n\t32177 - 19968: jis0208<<14 | 0x18<<7 | 0x2A,\n\t32178 - 19968: jis0208<<14 | 0x2B<<7 | 0x35,\n\t32179 - 19968: jis0212<<14 | 0x33<<7 | 0x04,\n\t32180 - 19968: jis0208<<14 | 0x23<<7 | 0x35,\n\t32181 - 19968: jis0208<<14 | 0x44<<7 | 0x1C,\n\t32182 - 19968: jis0212<<14 | 0x33<<7 | 0x05,\n\t32183 - 19968: jis0208<<14 | 0x5A<<7 | 0x2F,\n\t32184 - 19968: jis0208<<14 | 0x44<<7 | 0x24,\n\t32185 - 19968: jis0212<<14 | 0x33<<7 | 0x07,\n\t32186 - 19968: jis0208<<14 | 0x44<<7 | 0x19,\n\t32187 - 19968: jis0208<<14 | 0x22<<7 | 0x1D,\n\t32189 - 19968: jis0208<<14 | 0x44<<7 | 0x1E,\n\t32190 - 19968: jis0208<<14 | 0x0F<<7 | 0x1C,\n\t32191 - 19968: jis0208<<14 | 0x2B<<7 | 0x29,\n\t32194 - 19968: jis0212<<14 | 0x33<<7 | 0x08,\n\t32195 - 19968: jis0212<<14 | 0x33<<7 | 0x09,\n\t32196 - 19968: jis0212<<14 | 0x33<<7 | 0x0A,\n\t32197 - 19968: jis0212<<14 | 0x33<<7 | 0x0B,\n\t32198 - 19968: jis0212<<14 | 0x33<<7 | 0x0C,\n\t32199 - 19968: jis0208<<14 | 0x44<<7 | 0x1D,\n\t32202 - 19968: jis0208<<14 | 0x15<<7 | 0x3A,\n\t32203 - 19968: jis0208<<14 | 0x27<<7 | 0x4B,\n\t32204 - 19968: jis0212<<14 | 0x33<<7 | 0x0D,\n\t32205 - 19968: jis0212<<14 | 0x33<<7 | 0x0E,\n\t32206 - 19968: jis0212<<14 | 0x33<<7 | 0x0F,\n\t32207 - 19968: jis0208<<14 | 0x20<<7 | 0x4C,\n\t32209 - 19968: jis0208<<14 | 0x2D<<7 | 0x2F,\n\t32210 - 19968: jis0208<<14 | 0x1C<<7 | 0x4E,\n\t32213 - 19968: jis0208<<14 | 0x44<<7 | 0x4D,\n\t32214 - 19968: jis0208<<14 | 0x5A<<7 | 0x31,\n\t32215 - 19968: jis0212<<14 | 0x33<<7 | 0x10,\n\t32216 - 19968: jis0208<<14 | 0x44<<7 | 0x27,\n\t32217 - 19968: jis0212<<14 | 0x33<<7 | 0x11,\n\t32218 - 19968: jis0208<<14 | 0x1F<<7 | 0x5D,\n\t32220 - 19968: jis0208<<14 | 0x44<<7 | 0x23,\n\t32221 - 19968: jis0208<<14 | 0x44<<7 | 0x28,\n\t32222 - 19968: jis0208<<14 | 0x44<<7 | 0x2A,\n\t32224 - 19968: jis0208<<14 | 0x23<<7 | 0x58,\n\t32225 - 19968: jis0208<<14 | 0x44<<7 | 0x2D,\n\t32226 - 19968: jis0212<<14 | 0x33<<7 | 0x13,\n\t32228 - 19968: jis0208<<14 | 0x44<<7 | 0x29,\n\t32229 - 19968: jis0212<<14 | 0x33<<7 | 0x14,\n\t32230 - 19968: jis0212<<14 | 0x33<<7 | 0x15,\n\t32232 - 19968: jis0208<<14 | 0x29<<7 | 0x33,\n\t32233 - 19968: jis0208<<14 | 0x13<<7 | 0x2A,\n\t32234 - 19968: jis0212<<14 | 0x33<<7 | 0x16,\n\t32235 - 19968: jis0212<<14 | 0x33<<7 | 0x17,\n\t32236 - 19968: jis0208<<14 | 0x2B<<7 | 0x2A,\n\t32237 - 19968: jis0212<<14 | 0x33<<7 | 0x18,\n\t32239 - 19968: jis0208<<14 | 0x0F<<7 | 0x3D,\n\t32241 - 19968: jis0212<<14 | 0x33<<7 | 0x19,\n\t32242 - 19968: jis0208<<14 | 0x44<<7 | 0x2C,\n\t32244 - 19968: jis0208<<14 | 0x2D<<7 | 0x5C,\n\t32245 - 19968: jis0212<<14 | 0x33<<7 | 0x1A,\n\t32246 - 19968: jis0212<<14 | 0x33<<7 | 0x1B,\n\t32249 - 19968: jis0212<<14 | 0x33<<7 | 0x1C,\n\t32250 - 19968: jis0212<<14 | 0x33<<7 | 0x1D,\n\t32251 - 19968: jis0208<<14 | 0x44<<7 | 0x2B,\n\t32256 - 19968: jis0212<<14 | 0x33<<7 | 0x12,\n\t32257 - 19968: jis0208<<14 | 0x10<<7 | 0x4E,\n\t32260 - 19968: jis0208<<14 | 0x25<<7 | 0x4B,\n\t32261 - 19968: jis0208<<14 | 0x44<<7 | 0x2E,\n\t32264 - 19968: jis0212<<14 | 0x33<<7 | 0x1E,\n\t32265 - 19968: jis0208<<14 | 0x44<<7 | 0x35,\n\t32266 - 19968: jis0208<<14 | 0x44<<7 | 0x2F,\n\t32267 - 19968: jis0208<<14 | 0x44<<7 | 0x36,\n\t32272 - 19968: jis0212<<14 | 0x33<<7 | 0x1F,\n\t32273 - 19968: jis0212<<14 | 0x33<<7 | 0x20,\n\t32274 - 19968: jis0208<<14 | 0x44<<7 | 0x32,\n\t32277 - 19968: jis0212<<14 | 0x33<<7 | 0x21,\n\t32279 - 19968: jis0212<<14 | 0x33<<7 | 0x22,\n\t32283 - 19968: jis0208<<14 | 0x26<<7 | 0x5A,\n\t32284 - 19968: jis0212<<14 | 0x33<<7 | 0x23,\n\t32285 - 19968: jis0212<<14 | 0x33<<7 | 0x24,\n\t32286 - 19968: jis0208<<14 | 0x1B<<7 | 0x29,\n\t32287 - 19968: jis0208<<14 | 0x44<<7 | 0x34,\n\t32288 - 19968: jis0212<<14 | 0x33<<7 | 0x25,\n\t32289 - 19968: jis0208<<14 | 0x44<<7 | 0x31,\n\t32290 - 19968: jis0208<<14 | 0x44<<7 | 0x37,\n\t32291 - 19968: jis0208<<14 | 0x44<<7 | 0x30,\n\t32294 - 19968: jis0208<<14 | 0x1C<<7 | 0x23,\n\t32295 - 19968: jis0212<<14 | 0x33<<7 | 0x26,\n\t32296 - 19968: jis0212<<14 | 0x33<<7 | 0x27,\n\t32299 - 19968: jis0208<<14 | 0x2A<<7 | 0x04,\n\t32300 - 19968: jis0212<<14 | 0x33<<7 | 0x28,\n\t32301 - 19968: jis0212<<14 | 0x33<<7 | 0x29,\n\t32302 - 19968: jis0208<<14 | 0x1C<<7 | 0x2B,\n\t32303 - 19968: jis0212<<14 | 0x33<<7 | 0x2A,\n\t32305 - 19968: jis0208<<14 | 0x44<<7 | 0x33,\n\t32306 - 19968: jis0208<<14 | 0x44<<7 | 0x3F,\n\t32307 - 19968: jis0212<<14 | 0x33<<7 | 0x2B,\n\t32309 - 19968: jis0208<<14 | 0x44<<7 | 0x3B,\n\t32310 - 19968: jis0212<<14 | 0x33<<7 | 0x2C,\n\t32311 - 19968: jis0208<<14 | 0x44<<7 | 0x3E,\n\t32313 - 19968: jis0208<<14 | 0x44<<7 | 0x3C,\n\t32314 - 19968: jis0208<<14 | 0x44<<7 | 0x40,\n\t32315 - 19968: jis0208<<14 | 0x44<<7 | 0x3A,\n\t32317 - 19968: jis0208<<14 | 0x44<<7 | 0x20,\n\t32318 - 19968: jis0208<<14 | 0x1F<<7 | 0x32,\n\t32319 - 19968: jis0212<<14 | 0x33<<7 | 0x2D,\n\t32321 - 19968: jis0208<<14 | 0x27<<7 | 0x2A,\n\t32323 - 19968: jis0208<<14 | 0x44<<7 | 0x3D,\n\t32324 - 19968: jis0212<<14 | 0x33<<7 | 0x2E,\n\t32325 - 19968: jis0212<<14 | 0x33<<7 | 0x2F,\n\t32326 - 19968: jis0208<<14 | 0x44<<7 | 0x38,\n\t32327 - 19968: jis0212<<14 | 0x33<<7 | 0x30,\n\t32330 - 19968: jis0208<<14 | 0x20<<7 | 0x00,\n\t32331 - 19968: jis0208<<14 | 0x16<<7 | 0x31,\n\t32333 - 19968: jis0208<<14 | 0x1C<<7 | 0x0A,\n\t32334 - 19968: jis0212<<14 | 0x33<<7 | 0x31,\n\t32336 - 19968: jis0212<<14 | 0x33<<7 | 0x32,\n\t32338 - 19968: jis0208<<14 | 0x5A<<7 | 0x32,\n\t32340 - 19968: jis0208<<14 | 0x1E<<7 | 0x04,\n\t32341 - 19968: jis0208<<14 | 0x20<<7 | 0x15,\n\t32342 - 19968: jis0208<<14 | 0x44<<7 | 0x43,\n\t32344 - 19968: jis0212<<14 | 0x33<<7 | 0x34,\n\t32345 - 19968: jis0208<<14 | 0x44<<7 | 0x45,\n\t32346 - 19968: jis0208<<14 | 0x44<<7 | 0x46,\n\t32349 - 19968: jis0208<<14 | 0x44<<7 | 0x42,\n\t32350 - 19968: jis0208<<14 | 0x44<<7 | 0x44,\n\t32351 - 19968: jis0212<<14 | 0x33<<7 | 0x35,\n\t32353 - 19968: jis0212<<14 | 0x33<<7 | 0x36,\n\t32354 - 19968: jis0212<<14 | 0x33<<7 | 0x37,\n\t32357 - 19968: jis0212<<14 | 0x33<<7 | 0x38,\n\t32358 - 19968: jis0208<<14 | 0x44<<7 | 0x39,\n\t32359 - 19968: jis0208<<14 | 0x44<<7 | 0x41,\n\t32361 - 19968: jis0208<<14 | 0x44<<7 | 0x49,\n\t32362 - 19968: jis0208<<14 | 0x44<<7 | 0x48,\n\t32363 - 19968: jis0212<<14 | 0x33<<7 | 0x39,\n\t32365 - 19968: jis0208<<14 | 0x2A<<7 | 0x59,\n\t32366 - 19968: jis0212<<14 | 0x33<<7 | 0x3A,\n\t32367 - 19968: jis0212<<14 | 0x33<<7 | 0x3B,\n\t32368 - 19968: jis0208<<14 | 0x16<<7 | 0x0A,\n\t32371 - 19968: jis0212<<14 | 0x33<<7 | 0x3C,\n\t32376 - 19968: jis0212<<14 | 0x33<<7 | 0x3D,\n\t32377 - 19968: jis0208<<14 | 0x44<<7 | 0x47,\n\t32379 - 19968: jis0208<<14 | 0x44<<7 | 0x4B,\n\t32380 - 19968: jis0208<<14 | 0x44<<7 | 0x4A,\n\t32381 - 19968: jis0208<<14 | 0x44<<7 | 0x4E,\n\t32382 - 19968: jis0212<<14 | 0x33<<7 | 0x3E,\n\t32383 - 19968: jis0208<<14 | 0x44<<7 | 0x50,\n\t32385 - 19968: jis0212<<14 | 0x33<<7 | 0x3F,\n\t32386 - 19968: jis0208<<14 | 0x1A<<7 | 0x1B,\n\t32387 - 19968: jis0208<<14 | 0x44<<7 | 0x4C,\n\t32390 - 19968: jis0212<<14 | 0x33<<7 | 0x40,\n\t32391 - 19968: jis0212<<14 | 0x33<<7 | 0x41,\n\t32392 - 19968: jis0208<<14 | 0x44<<7 | 0x51,\n\t32393 - 19968: jis0208<<14 | 0x44<<7 | 0x52,\n\t32394 - 19968: jis0208<<14 | 0x58<<7 | 0x00,\n\t32396 - 19968: jis0208<<14 | 0x44<<7 | 0x53,\n\t32397 - 19968: jis0212<<14 | 0x33<<7 | 0x43,\n\t32398 - 19968: jis0208<<14 | 0x44<<7 | 0x59,\n\t32399 - 19968: jis0208<<14 | 0x24<<7 | 0x1A,\n\t32400 - 19968: jis0208<<14 | 0x44<<7 | 0x55,\n\t32401 - 19968: jis0212<<14 | 0x33<<7 | 0x44,\n\t32402 - 19968: jis0208<<14 | 0x44<<7 | 0x54,\n\t32403 - 19968: jis0208<<14 | 0x44<<7 | 0x56,\n\t32404 - 19968: jis0208<<14 | 0x44<<7 | 0x57,\n\t32405 - 19968: jis0212<<14 | 0x33<<7 | 0x45,\n\t32406 - 19968: jis0208<<14 | 0x44<<7 | 0x58,\n\t32408 - 19968: jis0212<<14 | 0x33<<7 | 0x46,\n\t32410 - 19968: jis0212<<14 | 0x33<<7 | 0x47,\n\t32411 - 19968: jis0208<<14 | 0x44<<7 | 0x5A,\n\t32412 - 19968: jis0208<<14 | 0x44<<7 | 0x5B,\n\t32413 - 19968: jis0212<<14 | 0x33<<7 | 0x48,\n\t32414 - 19968: jis0212<<14 | 0x33<<7 | 0x49,\n\t32566 - 19968: jis0208<<14 | 0x13<<7 | 0x2B,\n\t32568 - 19968: jis0208<<14 | 0x44<<7 | 0x5C,\n\t32570 - 19968: jis0208<<14 | 0x44<<7 | 0x5D,\n\t32571 - 19968: jis0212<<14 | 0x33<<7 | 0x4B,\n\t32572 - 19968: jis0212<<14 | 0x33<<7 | 0x4A,\n\t32573 - 19968: jis0212<<14 | 0x33<<7 | 0x4C,\n\t32574 - 19968: jis0212<<14 | 0x33<<7 | 0x4D,\n\t32575 - 19968: jis0212<<14 | 0x33<<7 | 0x4E,\n\t32579 - 19968: jis0212<<14 | 0x33<<7 | 0x4F,\n\t32580 - 19968: jis0212<<14 | 0x33<<7 | 0x50,\n\t32581 - 19968: jis0208<<14 | 0x45<<7 | 0x00,\n\t32583 - 19968: jis0208<<14 | 0x5A<<7 | 0x33,\n\t32588 - 19968: jis0208<<14 | 0x45<<7 | 0x01,\n\t32589 - 19968: jis0208<<14 | 0x45<<7 | 0x02,\n\t32590 - 19968: jis0208<<14 | 0x45<<7 | 0x03,\n\t32591 - 19968: jis0212<<14 | 0x33<<7 | 0x52,\n\t32592 - 19968: jis0208<<14 | 0x45<<7 | 0x04,\n\t32593 - 19968: jis0208<<14 | 0x45<<7 | 0x05,\n\t32594 - 19968: jis0212<<14 | 0x33<<7 | 0x53,\n\t32595 - 19968: jis0212<<14 | 0x33<<7 | 0x54,\n\t32596 - 19968: jis0208<<14 | 0x45<<7 | 0x07,\n\t32597 - 19968: jis0208<<14 | 0x45<<7 | 0x06,\n\t32600 - 19968: jis0208<<14 | 0x45<<7 | 0x08,\n\t32603 - 19968: jis0212<<14 | 0x33<<7 | 0x55,\n\t32604 - 19968: jis0212<<14 | 0x33<<7 | 0x56,\n\t32605 - 19968: jis0212<<14 | 0x33<<7 | 0x57,\n\t32607 - 19968: jis0208<<14 | 0x45<<7 | 0x09,\n\t32608 - 19968: jis0208<<14 | 0x45<<7 | 0x0A,\n\t32609 - 19968: jis0212<<14 | 0x33<<7 | 0x58,\n\t32611 - 19968: jis0212<<14 | 0x33<<7 | 0x59,\n\t32612 - 19968: jis0212<<14 | 0x33<<7 | 0x5A,\n\t32613 - 19968: jis0212<<14 | 0x33<<7 | 0x5B,\n\t32614 - 19968: jis0212<<14 | 0x33<<7 | 0x5C,\n\t32615 - 19968: jis0208<<14 | 0x45<<7 | 0x0D,\n\t32616 - 19968: jis0208<<14 | 0x45<<7 | 0x0B,\n\t32617 - 19968: jis0208<<14 | 0x45<<7 | 0x0C,\n\t32618 - 19968: jis0208<<14 | 0x19<<7 | 0x40,\n\t32619 - 19968: jis0208<<14 | 0x16<<7 | 0x32,\n\t32621 - 19968: jis0212<<14 | 0x33<<7 | 0x5D,\n\t32622 - 19968: jis0208<<14 | 0x22<<7 | 0x35,\n\t32624 - 19968: jis0208<<14 | 0x27<<7 | 0x12,\n\t32625 - 19968: jis0212<<14 | 0x34<<7 | 0x00,\n\t32626 - 19968: jis0208<<14 | 0x1C<<7 | 0x4F,\n\t32629 - 19968: jis0208<<14 | 0x26<<7 | 0x2C,\n\t32631 - 19968: jis0208<<14 | 0x27<<7 | 0x4C,\n\t32632 - 19968: jis0208<<14 | 0x45<<7 | 0x0E,\n\t32633 - 19968: jis0208<<14 | 0x37<<7 | 0x4C,\n\t32637 - 19968: jis0212<<14 | 0x34<<7 | 0x01,\n\t32638 - 19968: jis0212<<14 | 0x34<<7 | 0x02,\n\t32639 - 19968: jis0212<<14 | 0x34<<7 | 0x03,\n\t32640 - 19968: jis0212<<14 | 0x34<<7 | 0x04,\n\t32642 - 19968: jis0208<<14 | 0x45<<7 | 0x0F,\n\t32643 - 19968: jis0208<<14 | 0x45<<7 | 0x11,\n\t32645 - 19968: jis0208<<14 | 0x2C<<7 | 0x44,\n\t32646 - 19968: jis0208<<14 | 0x45<<7 | 0x10,\n\t32647 - 19968: jis0208<<14 | 0x45<<7 | 0x13,\n\t32648 - 19968: jis0208<<14 | 0x45<<7 | 0x12,\n\t32650 - 19968: jis0208<<14 | 0x2C<<7 | 0x32,\n\t32651 - 19968: jis0212<<14 | 0x34<<7 | 0x05,\n\t32652 - 19968: jis0208<<14 | 0x45<<7 | 0x14,\n\t32653 - 19968: jis0212<<14 | 0x34<<7 | 0x06,\n\t32654 - 19968: jis0208<<14 | 0x27<<7 | 0x5D,\n\t32655 - 19968: jis0212<<14 | 0x34<<7 | 0x07,\n\t32656 - 19968: jis0212<<14 | 0x34<<7 | 0x08,\n\t32657 - 19968: jis0212<<14 | 0x34<<7 | 0x09,\n\t32660 - 19968: jis0208<<14 | 0x45<<7 | 0x15,\n\t32662 - 19968: jis0212<<14 | 0x34<<7 | 0x0A,\n\t32663 - 19968: jis0212<<14 | 0x34<<7 | 0x0B,\n\t32666 - 19968: jis0208<<14 | 0x45<<7 | 0x18,\n\t32668 - 19968: jis0212<<14 | 0x34<<7 | 0x0C,\n\t32669 - 19968: jis0208<<14 | 0x45<<7 | 0x17,\n\t32670 - 19968: jis0208<<14 | 0x45<<7 | 0x16,\n\t32673 - 19968: jis0208<<14 | 0x5A<<7 | 0x34,\n\t32674 - 19968: jis0212<<14 | 0x34<<7 | 0x0E,\n\t32675 - 19968: jis0208<<14 | 0x45<<7 | 0x19,\n\t32676 - 19968: jis0208<<14 | 0x16<<7 | 0x11,\n\t32678 - 19968: jis0212<<14 | 0x34<<7 | 0x0F,\n\t32680 - 19968: jis0208<<14 | 0x20<<7 | 0x01,\n\t32681 - 19968: jis0208<<14 | 0x14<<7 | 0x20,\n\t32682 - 19968: jis0212<<14 | 0x34<<7 | 0x10,\n\t32685 - 19968: jis0212<<14 | 0x34<<7 | 0x11,\n\t32686 - 19968: jis0208<<14 | 0x45<<7 | 0x1D,\n\t32687 - 19968: jis0208<<14 | 0x45<<7 | 0x1A,\n\t32690 - 19968: jis0208<<14 | 0x45<<7 | 0x1B,\n\t32692 - 19968: jis0212<<14 | 0x34<<7 | 0x12,\n\t32694 - 19968: jis0208<<14 | 0x45<<7 | 0x1E,\n\t32696 - 19968: jis0208<<14 | 0x45<<7 | 0x1F,\n\t32697 - 19968: jis0208<<14 | 0x45<<7 | 0x1C,\n\t32700 - 19968: jis0212<<14 | 0x34<<7 | 0x13,\n\t32701 - 19968: jis0208<<14 | 0x10<<7 | 0x08,\n\t32703 - 19968: jis0212<<14 | 0x34<<7 | 0x14,\n\t32704 - 19968: jis0212<<14 | 0x34<<7 | 0x15,\n\t32705 - 19968: jis0208<<14 | 0x11<<7 | 0x06,\n\t32707 - 19968: jis0212<<14 | 0x34<<7 | 0x16,\n\t32709 - 19968: jis0208<<14 | 0x45<<7 | 0x21,\n\t32710 - 19968: jis0208<<14 | 0x45<<7 | 0x22,\n\t32712 - 19968: jis0212<<14 | 0x34<<7 | 0x17,\n\t32714 - 19968: jis0208<<14 | 0x45<<7 | 0x23,\n\t32716 - 19968: jis0208<<14 | 0x2C<<7 | 0x41,\n\t32718 - 19968: jis0212<<14 | 0x34<<7 | 0x18,\n\t32719 - 19968: jis0212<<14 | 0x34<<7 | 0x19,\n\t32722 - 19968: jis0208<<14 | 0x1C<<7 | 0x0B,\n\t32724 - 19968: jis0208<<14 | 0x45<<7 | 0x25,\n\t32725 - 19968: jis0208<<14 | 0x45<<7 | 0x24,\n\t32731 - 19968: jis0212<<14 | 0x34<<7 | 0x1A,\n\t32735 - 19968: jis0212<<14 | 0x34<<7 | 0x1B,\n\t32736 - 19968: jis0208<<14 | 0x1E<<7 | 0x48,\n\t32737 - 19968: jis0208<<14 | 0x45<<7 | 0x26,\n\t32739 - 19968: jis0212<<14 | 0x34<<7 | 0x1C,\n\t32741 - 19968: jis0212<<14 | 0x34<<7 | 0x1D,\n\t32742 - 19968: jis0208<<14 | 0x45<<7 | 0x27,\n\t32744 - 19968: jis0212<<14 | 0x34<<7 | 0x1E,\n\t32745 - 19968: jis0208<<14 | 0x45<<7 | 0x28,\n\t32747 - 19968: jis0208<<14 | 0x13<<7 | 0x44,\n\t32748 - 19968: jis0212<<14 | 0x34<<7 | 0x1F,\n\t32750 - 19968: jis0212<<14 | 0x34<<7 | 0x20,\n\t32751 - 19968: jis0212<<14 | 0x34<<7 | 0x21,\n\t32752 - 19968: jis0208<<14 | 0x13<<7 | 0x2C,\n\t32754 - 19968: jis0212<<14 | 0x34<<7 | 0x22,\n\t32755 - 19968: jis0208<<14 | 0x45<<7 | 0x29,\n\t32761 - 19968: jis0208<<14 | 0x45<<7 | 0x2A,\n\t32762 - 19968: jis0212<<14 | 0x34<<7 | 0x23,\n\t32763 - 19968: jis0208<<14 | 0x2A<<7 | 0x3C,\n\t32764 - 19968: jis0208<<14 | 0x2C<<7 | 0x42,\n\t32765 - 19968: jis0212<<14 | 0x34<<7 | 0x24,\n\t32766 - 19968: jis0212<<14 | 0x34<<7 | 0x25,\n\t32767 - 19968: jis0212<<14 | 0x34<<7 | 0x26,\n\t32768 - 19968: jis0208<<14 | 0x2C<<7 | 0x33,\n\t32769 - 19968: jis0208<<14 | 0x2E<<7 | 0x16,\n\t32771 - 19968: jis0208<<14 | 0x18<<7 | 0x2C,\n\t32772 - 19968: jis0208<<14 | 0x45<<7 | 0x2D,\n\t32773 - 19968: jis0208<<14 | 0x1B<<7 | 0x33,\n\t32774 - 19968: jis0208<<14 | 0x45<<7 | 0x2C,\n\t32775 - 19968: jis0212<<14 | 0x34<<7 | 0x27,\n\t32776 - 19968: jis0212<<14 | 0x34<<7 | 0x28,\n\t32778 - 19968: jis0212<<14 | 0x34<<7 | 0x29,\n\t32779 - 19968: jis0208<<14 | 0x45<<7 | 0x2E,\n\t32780 - 19968: jis0208<<14 | 0x1B<<7 | 0x08,\n\t32781 - 19968: jis0212<<14 | 0x34<<7 | 0x2A,\n\t32782 - 19968: jis0212<<14 | 0x34<<7 | 0x2B,\n\t32783 - 19968: jis0212<<14 | 0x34<<7 | 0x2C,\n\t32784 - 19968: jis0208<<14 | 0x21<<7 | 0x30,\n\t32785 - 19968: jis0212<<14 | 0x34<<7 | 0x2D,\n\t32786 - 19968: jis0208<<14 | 0x45<<7 | 0x2F,\n\t32787 - 19968: jis0212<<14 | 0x34<<7 | 0x2E,\n\t32788 - 19968: jis0212<<14 | 0x34<<7 | 0x2F,\n\t32789 - 19968: jis0208<<14 | 0x18<<7 | 0x2B,\n\t32790 - 19968: jis0212<<14 | 0x34<<7 | 0x30,\n\t32791 - 19968: jis0208<<14 | 0x2B<<7 | 0x36,\n\t32792 - 19968: jis0208<<14 | 0x45<<7 | 0x30,\n\t32793 - 19968: jis0208<<14 | 0x45<<7 | 0x31,\n\t32796 - 19968: jis0208<<14 | 0x45<<7 | 0x32,\n\t32797 - 19968: jis0212<<14 | 0x34<<7 | 0x31,\n\t32798 - 19968: jis0212<<14 | 0x34<<7 | 0x32,\n\t32799 - 19968: jis0212<<14 | 0x34<<7 | 0x33,\n\t32800 - 19968: jis0212<<14 | 0x34<<7 | 0x34,\n\t32801 - 19968: jis0208<<14 | 0x45<<7 | 0x33,\n\t32804 - 19968: jis0212<<14 | 0x34<<7 | 0x35,\n\t32806 - 19968: jis0212<<14 | 0x34<<7 | 0x36,\n\t32808 - 19968: jis0208<<14 | 0x45<<7 | 0x34,\n\t32812 - 19968: jis0212<<14 | 0x34<<7 | 0x37,\n\t32814 - 19968: jis0212<<14 | 0x34<<7 | 0x38,\n\t32816 - 19968: jis0212<<14 | 0x34<<7 | 0x39,\n\t32819 - 19968: jis0208<<14 | 0x1B<<7 | 0x09,\n\t32820 - 19968: jis0212<<14 | 0x34<<7 | 0x3A,\n\t32821 - 19968: jis0212<<14 | 0x34<<7 | 0x3B,\n\t32822 - 19968: jis0208<<14 | 0x2B<<7 | 0x4C,\n\t32823 - 19968: jis0212<<14 | 0x34<<7 | 0x3C,\n\t32825 - 19968: jis0212<<14 | 0x34<<7 | 0x3D,\n\t32826 - 19968: jis0212<<14 | 0x34<<7 | 0x3E,\n\t32827 - 19968: jis0208<<14 | 0x45<<7 | 0x36,\n\t32828 - 19968: jis0212<<14 | 0x34<<7 | 0x3F,\n\t32829 - 19968: jis0208<<14 | 0x22<<7 | 0x1E,\n\t32830 - 19968: jis0212<<14 | 0x34<<7 | 0x40,\n\t32831 - 19968: jis0208<<14 | 0x45<<7 | 0x35,\n\t32832 - 19968: jis0212<<14 | 0x34<<7 | 0x41,\n\t32836 - 19968: jis0212<<14 | 0x34<<7 | 0x42,\n\t32838 - 19968: jis0208<<14 | 0x45<<7 | 0x38,\n\t32842 - 19968: jis0208<<14 | 0x45<<7 | 0x37,\n\t32850 - 19968: jis0208<<14 | 0x45<<7 | 0x39,\n\t32854 - 19968: jis0208<<14 | 0x1F<<7 | 0x1A,\n\t32856 - 19968: jis0208<<14 | 0x45<<7 | 0x3A,\n\t32858 - 19968: jis0208<<14 | 0x45<<7 | 0x3B,\n\t32862 - 19968: jis0208<<14 | 0x29<<7 | 0x18,\n\t32863 - 19968: jis0208<<14 | 0x45<<7 | 0x3C,\n\t32864 - 19968: jis0212<<14 | 0x34<<7 | 0x43,\n\t32865 - 19968: jis0208<<14 | 0x20<<7 | 0x4E,\n\t32866 - 19968: jis0208<<14 | 0x45<<7 | 0x3D,\n\t32868 - 19968: jis0212<<14 | 0x34<<7 | 0x44,\n\t32870 - 19968: jis0212<<14 | 0x34<<7 | 0x45,\n\t32872 - 19968: jis0208<<14 | 0x45<<7 | 0x3E,\n\t32877 - 19968: jis0212<<14 | 0x34<<7 | 0x46,\n\t32879 - 19968: jis0208<<14 | 0x2D<<7 | 0x5D,\n\t32880 - 19968: jis0208<<14 | 0x45<<7 | 0x41,\n\t32881 - 19968: jis0212<<14 | 0x34<<7 | 0x47,\n\t32882 - 19968: jis0208<<14 | 0x45<<7 | 0x40,\n\t32883 - 19968: jis0208<<14 | 0x45<<7 | 0x3F,\n\t32884 - 19968: jis0208<<14 | 0x23<<7 | 0x0F,\n\t32885 - 19968: jis0212<<14 | 0x34<<7 | 0x48,\n\t32886 - 19968: jis0208<<14 | 0x45<<7 | 0x42,\n\t32887 - 19968: jis0208<<14 | 0x1E<<7 | 0x05,\n\t32889 - 19968: jis0208<<14 | 0x45<<7 | 0x43,\n\t32893 - 19968: jis0208<<14 | 0x45<<7 | 0x44,\n\t32894 - 19968: jis0208<<14 | 0x2E<<7 | 0x17,\n\t32895 - 19968: jis0208<<14 | 0x45<<7 | 0x45,\n\t32897 - 19968: jis0212<<14 | 0x34<<7 | 0x49,\n\t32900 - 19968: jis0208<<14 | 0x45<<7 | 0x46,\n\t32901 - 19968: jis0208<<14 | 0x45<<7 | 0x48,\n\t32902 - 19968: jis0208<<14 | 0x45<<7 | 0x47,\n\t32903 - 19968: jis0208<<14 | 0x27<<7 | 0x04,\n\t32904 - 19968: jis0212<<14 | 0x34<<7 | 0x4A,\n\t32905 - 19968: jis0208<<14 | 0x25<<7 | 0x58,\n\t32907 - 19968: jis0208<<14 | 0x2E<<7 | 0x1D,\n\t32908 - 19968: jis0208<<14 | 0x27<<7 | 0x08,\n\t32910 - 19968: jis0212<<14 | 0x34<<7 | 0x4B,\n\t32915 - 19968: jis0208<<14 | 0x45<<7 | 0x4A,\n\t32918 - 19968: jis0208<<14 | 0x1D<<7 | 0x32,\n\t32920 - 19968: jis0208<<14 | 0x28<<7 | 0x09,\n\t32922 - 19968: jis0208<<14 | 0x45<<7 | 0x4B,\n\t32923 - 19968: jis0208<<14 | 0x45<<7 | 0x49,\n\t32924 - 19968: jis0212<<14 | 0x34<<7 | 0x4C,\n\t32925 - 19968: jis0208<<14 | 0x13<<7 | 0x2D,\n\t32926 - 19968: jis0212<<14 | 0x34<<7 | 0x4D,\n\t32929 - 19968: jis0208<<14 | 0x17<<7 | 0x33,\n\t32930 - 19968: jis0208<<14 | 0x1A<<7 | 0x47,\n\t32933 - 19968: jis0208<<14 | 0x27<<7 | 0x4D,\n\t32934 - 19968: jis0212<<14 | 0x34<<7 | 0x4E,\n\t32935 - 19968: jis0212<<14 | 0x34<<7 | 0x4F,\n\t32937 - 19968: jis0208<<14 | 0x17<<7 | 0x09,\n\t32938 - 19968: jis0208<<14 | 0x2A<<7 | 0x22,\n\t32939 - 19968: jis0212<<14 | 0x34<<7 | 0x50,\n\t32940 - 19968: jis0208<<14 | 0x45<<7 | 0x4E,\n\t32941 - 19968: jis0208<<14 | 0x45<<7 | 0x4C,\n\t32943 - 19968: jis0208<<14 | 0x18<<7 | 0x2D,\n\t32945 - 19968: jis0208<<14 | 0x18<<7 | 0x2E,\n\t32946 - 19968: jis0208<<14 | 0x0F<<7 | 0x48,\n\t32948 - 19968: jis0208<<14 | 0x19<<7 | 0x47,\n\t32952 - 19968: jis0212<<14 | 0x34<<7 | 0x51,\n\t32953 - 19968: jis0212<<14 | 0x34<<7 | 0x52,\n\t32954 - 19968: jis0208<<14 | 0x26<<7 | 0x38,\n\t32963 - 19968: jis0208<<14 | 0x0F<<7 | 0x3E,\n\t32964 - 19968: jis0208<<14 | 0x45<<7 | 0x53,\n\t32966 - 19968: jis0208<<14 | 0x22<<7 | 0x1F,\n\t32968 - 19968: jis0212<<14 | 0x34<<7 | 0x53,\n\t32972 - 19968: jis0208<<14 | 0x26<<7 | 0x37,\n\t32973 - 19968: jis0212<<14 | 0x34<<7 | 0x54,\n\t32974 - 19968: jis0208<<14 | 0x21<<7 | 0x3A,\n\t32975 - 19968: jis0212<<14 | 0x34<<7 | 0x55,\n\t32978 - 19968: jis0212<<14 | 0x34<<7 | 0x56,\n\t32980 - 19968: jis0212<<14 | 0x34<<7 | 0x57,\n\t32981 - 19968: jis0212<<14 | 0x34<<7 | 0x58,\n\t32982 - 19968: jis0208<<14 | 0x45<<7 | 0x55,\n\t32983 - 19968: jis0212<<14 | 0x34<<7 | 0x59,\n\t32984 - 19968: jis0212<<14 | 0x34<<7 | 0x5A,\n\t32985 - 19968: jis0208<<14 | 0x45<<7 | 0x51,\n\t32986 - 19968: jis0208<<14 | 0x45<<7 | 0x54,\n\t32987 - 19968: jis0208<<14 | 0x45<<7 | 0x4F,\n\t32989 - 19968: jis0208<<14 | 0x45<<7 | 0x52,\n\t32990 - 19968: jis0208<<14 | 0x2A<<7 | 0x05,\n\t32992 - 19968: jis0212<<14 | 0x34<<7 | 0x5B,\n\t32993 - 19968: jis0208<<14 | 0x17<<7 | 0x34,\n\t32996 - 19968: jis0208<<14 | 0x0F<<7 | 0x5C,\n\t32997 - 19968: jis0208<<14 | 0x45<<7 | 0x50,\n\t33005 - 19968: jis0212<<14 | 0x34<<7 | 0x5C,\n\t33006 - 19968: jis0212<<14 | 0x34<<7 | 0x5D,\n\t33007 - 19968: jis0208<<14 | 0x45<<7 | 0x57,\n\t33008 - 19968: jis0212<<14 | 0x35<<7 | 0x00,\n\t33009 - 19968: jis0208<<14 | 0x45<<7 | 0x58,\n\t33010 - 19968: jis0212<<14 | 0x35<<7 | 0x01,\n\t33011 - 19968: jis0212<<14 | 0x35<<7 | 0x02,\n\t33012 - 19968: jis0208<<14 | 0x25<<7 | 0x18,\n\t33014 - 19968: jis0212<<14 | 0x35<<7 | 0x03,\n\t33016 - 19968: jis0208<<14 | 0x15<<7 | 0x1A,\n\t33017 - 19968: jis0212<<14 | 0x35<<7 | 0x04,\n\t33018 - 19968: jis0212<<14 | 0x35<<7 | 0x05,\n\t33020 - 19968: jis0208<<14 | 0x46<<7 | 0x05,\n\t33021 - 19968: jis0208<<14 | 0x26<<7 | 0x1C,\n\t33022 - 19968: jis0212<<14 | 0x35<<7 | 0x06,\n\t33026 - 19968: jis0208<<14 | 0x1A<<7 | 0x48,\n\t33027 - 19968: jis0212<<14 | 0x35<<7 | 0x07,\n\t33029 - 19968: jis0208<<14 | 0x15<<7 | 0x1B,\n\t33030 - 19968: jis0208<<14 | 0x1F<<7 | 0x27,\n\t33031 - 19968: jis0208<<14 | 0x2E<<7 | 0x25,\n\t33032 - 19968: jis0208<<14 | 0x2B<<7 | 0x0D,\n\t33033 - 19968: jis0208<<14 | 0x45<<7 | 0x56,\n\t33034 - 19968: jis0208<<14 | 0x1F<<7 | 0x33,\n\t33035 - 19968: jis0212<<14 | 0x35<<7 | 0x08,\n\t33046 - 19968: jis0212<<14 | 0x35<<7 | 0x09,\n\t33047 - 19968: jis0212<<14 | 0x35<<7 | 0x0A,\n\t33048 - 19968: jis0212<<14 | 0x35<<7 | 0x0B,\n\t33050 - 19968: jis0208<<14 | 0x14<<7 | 0x32,\n\t33051 - 19968: jis0208<<14 | 0x45<<7 | 0x59,\n\t33052 - 19968: jis0212<<14 | 0x35<<7 | 0x0C,\n\t33054 - 19968: jis0212<<14 | 0x35<<7 | 0x0D,\n\t33056 - 19968: jis0212<<14 | 0x35<<7 | 0x0E,\n\t33059 - 19968: jis0208<<14 | 0x45<<7 | 0x5B,\n\t33060 - 19968: jis0212<<14 | 0x35<<7 | 0x0F,\n\t33063 - 19968: jis0212<<14 | 0x35<<7 | 0x10,\n\t33065 - 19968: jis0208<<14 | 0x45<<7 | 0x5A,\n\t33068 - 19968: jis0212<<14 | 0x35<<7 | 0x11,\n\t33071 - 19968: jis0208<<14 | 0x45<<7 | 0x5C,\n\t33072 - 19968: jis0212<<14 | 0x35<<7 | 0x12,\n\t33073 - 19968: jis0208<<14 | 0x22<<7 | 0x05,\n\t33075 - 19968: jis0208<<14 | 0x26<<7 | 0x1D,\n\t33077 - 19968: jis0212<<14 | 0x35<<7 | 0x13,\n\t33081 - 19968: jis0208<<14 | 0x23<<7 | 0x10,\n\t33082 - 19968: jis0212<<14 | 0x35<<7 | 0x14,\n\t33084 - 19968: jis0212<<14 | 0x35<<7 | 0x15,\n\t33086 - 19968: jis0208<<14 | 0x46<<7 | 0x02,\n\t33093 - 19968: jis0212<<14 | 0x35<<7 | 0x16,\n\t33094 - 19968: jis0208<<14 | 0x46<<7 | 0x01,\n\t33095 - 19968: jis0212<<14 | 0x35<<7 | 0x17,\n\t33098 - 19968: jis0212<<14 | 0x35<<7 | 0x18,\n\t33099 - 19968: jis0208<<14 | 0x45<<7 | 0x5D,\n\t33100 - 19968: jis0212<<14 | 0x35<<7 | 0x19,\n\t33102 - 19968: jis0208<<14 | 0x1E<<7 | 0x34,\n\t33104 - 19968: jis0208<<14 | 0x28<<7 | 0x44,\n\t33105 - 19968: jis0208<<14 | 0x46<<7 | 0x04,\n\t33106 - 19968: jis0212<<14 | 0x35<<7 | 0x1A,\n\t33107 - 19968: jis0208<<14 | 0x46<<7 | 0x03,\n\t33108 - 19968: jis0208<<14 | 0x18<<7 | 0x2F,\n\t33109 - 19968: jis0208<<14 | 0x2E<<7 | 0x32,\n\t33111 - 19968: jis0212<<14 | 0x35<<7 | 0x1B,\n\t33119 - 19968: jis0208<<14 | 0x46<<7 | 0x14,\n\t33120 - 19968: jis0212<<14 | 0x35<<7 | 0x1C,\n\t33121 - 19968: jis0212<<14 | 0x35<<7 | 0x1D,\n\t33125 - 19968: jis0208<<14 | 0x46<<7 | 0x08,\n\t33126 - 19968: jis0208<<14 | 0x46<<7 | 0x09,\n\t33127 - 19968: jis0212<<14 | 0x35<<7 | 0x1E,\n\t33128 - 19968: jis0212<<14 | 0x35<<7 | 0x1F,\n\t33129 - 19968: jis0212<<14 | 0x35<<7 | 0x20,\n\t33131 - 19968: jis0208<<14 | 0x1B<<7 | 0x4F,\n\t33133 - 19968: jis0212<<14 | 0x35<<7 | 0x21,\n\t33134 - 19968: jis0208<<14 | 0x46<<7 | 0x07,\n\t33135 - 19968: jis0212<<14 | 0x35<<7 | 0x22,\n\t33136 - 19968: jis0208<<14 | 0x18<<7 | 0x57,\n\t33137 - 19968: jis0208<<14 | 0x46<<7 | 0x06,\n\t33140 - 19968: jis0208<<14 | 0x46<<7 | 0x0A,\n\t33143 - 19968: jis0212<<14 | 0x35<<7 | 0x23,\n\t33144 - 19968: jis0208<<14 | 0x23<<7 | 0x11,\n\t33145 - 19968: jis0208<<14 | 0x29<<7 | 0x01,\n\t33146 - 19968: jis0208<<14 | 0x20<<7 | 0x02,\n\t33151 - 19968: jis0208<<14 | 0x21<<7 | 0x3B,\n\t33152 - 19968: jis0208<<14 | 0x46<<7 | 0x0E,\n\t33153 - 19968: jis0212<<14 | 0x35<<7 | 0x24,\n\t33154 - 19968: jis0208<<14 | 0x46<<7 | 0x0F,\n\t33155 - 19968: jis0208<<14 | 0x46<<7 | 0x0B,\n\t33156 - 19968: jis0212<<14 | 0x35<<7 | 0x26,\n\t33157 - 19968: jis0212<<14 | 0x35<<7 | 0x27,\n\t33158 - 19968: jis0212<<14 | 0x35<<7 | 0x28,\n\t33160 - 19968: jis0208<<14 | 0x46<<7 | 0x0C,\n\t33162 - 19968: jis0208<<14 | 0x46<<7 | 0x0D,\n\t33163 - 19968: jis0212<<14 | 0x35<<7 | 0x29,\n\t33166 - 19968: jis0212<<14 | 0x35<<7 | 0x2A,\n\t33167 - 19968: jis0208<<14 | 0x18<<7 | 0x30,\n\t33168 - 19968: jis0212<<14 | 0x35<<7 | 0x25,\n\t33171 - 19968: jis0208<<14 | 0x46<<7 | 0x15,\n\t33173 - 19968: jis0208<<14 | 0x46<<7 | 0x11,\n\t33174 - 19968: jis0212<<14 | 0x35<<7 | 0x2B,\n\t33176 - 19968: jis0212<<14 | 0x35<<7 | 0x2C,\n\t33178 - 19968: jis0208<<14 | 0x28<<7 | 0x45,\n\t33179 - 19968: jis0212<<14 | 0x35<<7 | 0x2D,\n\t33180 - 19968: jis0208<<14 | 0x2A<<7 | 0x4B,\n\t33181 - 19968: jis0208<<14 | 0x28<<7 | 0x07,\n\t33182 - 19968: jis0212<<14 | 0x35<<7 | 0x2E,\n\t33184 - 19968: jis0208<<14 | 0x46<<7 | 0x10,\n\t33186 - 19968: jis0212<<14 | 0x35<<7 | 0x2F,\n\t33187 - 19968: jis0208<<14 | 0x46<<7 | 0x13,\n\t33188 - 19968: jis0208<<14 | 0x46<<7 | 0x12,\n\t33192 - 19968: jis0208<<14 | 0x2A<<7 | 0x23,\n\t33193 - 19968: jis0208<<14 | 0x46<<7 | 0x16,\n\t33198 - 19968: jis0212<<14 | 0x35<<7 | 0x30,\n\t33200 - 19968: jis0208<<14 | 0x46<<7 | 0x17,\n\t33202 - 19968: jis0212<<14 | 0x35<<7 | 0x31,\n\t33203 - 19968: jis0208<<14 | 0x20<<7 | 0x16,\n\t33204 - 19968: jis0212<<14 | 0x35<<7 | 0x32,\n\t33205 - 19968: jis0208<<14 | 0x46<<7 | 0x18,\n\t33208 - 19968: jis0208<<14 | 0x46<<7 | 0x1A,\n\t33210 - 19968: jis0208<<14 | 0x46<<7 | 0x1E,\n\t33211 - 19968: jis0212<<14 | 0x35<<7 | 0x33,\n\t33213 - 19968: jis0208<<14 | 0x46<<7 | 0x1B,\n\t33214 - 19968: jis0208<<14 | 0x46<<7 | 0x19,\n\t33215 - 19968: jis0208<<14 | 0x26<<7 | 0x1E,\n\t33216 - 19968: jis0208<<14 | 0x46<<7 | 0x1C,\n\t33218 - 19968: jis0208<<14 | 0x46<<7 | 0x1D,\n\t33219 - 19968: jis0212<<14 | 0x35<<7 | 0x35,\n\t33221 - 19968: jis0212<<14 | 0x35<<7 | 0x36,\n\t33222 - 19968: jis0208<<14 | 0x11<<7 | 0x11,\n\t33224 - 19968: jis0208<<14 | 0x46<<7 | 0x24,\n\t33225 - 19968: jis0208<<14 | 0x46<<7 | 0x1F,\n\t33226 - 19968: jis0212<<14 | 0x35<<7 | 0x37,\n\t33227 - 19968: jis0212<<14 | 0x35<<7 | 0x34,\n\t33229 - 19968: jis0208<<14 | 0x46<<7 | 0x20,\n\t33230 - 19968: jis0212<<14 | 0x35<<7 | 0x38,\n\t33231 - 19968: jis0212<<14 | 0x35<<7 | 0x39,\n\t33233 - 19968: jis0208<<14 | 0x46<<7 | 0x21,\n\t33235 - 19968: jis0208<<14 | 0x21<<7 | 0x00,\n\t33237 - 19968: jis0212<<14 | 0x35<<7 | 0x3A,\n\t33239 - 19968: jis0212<<14 | 0x35<<7 | 0x3B,\n\t33240 - 19968: jis0208<<14 | 0x46<<7 | 0x23,\n\t33241 - 19968: jis0208<<14 | 0x46<<7 | 0x22,\n\t33242 - 19968: jis0208<<14 | 0x46<<7 | 0x25,\n\t33243 - 19968: jis0212<<14 | 0x35<<7 | 0x3C,\n\t33245 - 19968: jis0212<<14 | 0x35<<7 | 0x3D,\n\t33246 - 19968: jis0212<<14 | 0x35<<7 | 0x3E,\n\t33247 - 19968: jis0208<<14 | 0x46<<7 | 0x26,\n\t33248 - 19968: jis0208<<14 | 0x46<<7 | 0x27,\n\t33249 - 19968: jis0212<<14 | 0x35<<7 | 0x3F,\n\t33251 - 19968: jis0208<<14 | 0x1E<<7 | 0x22,\n\t33252 - 19968: jis0212<<14 | 0x35<<7 | 0x40,\n\t33253 - 19968: jis0208<<14 | 0x11<<7 | 0x48,\n\t33255 - 19968: jis0208<<14 | 0x46<<7 | 0x28,\n\t33256 - 19968: jis0208<<14 | 0x2D<<7 | 0x36,\n\t33258 - 19968: jis0208<<14 | 0x1B<<7 | 0x0A,\n\t33259 - 19968: jis0212<<14 | 0x35<<7 | 0x41,\n\t33260 - 19968: jis0212<<14 | 0x35<<7 | 0x42,\n\t33261 - 19968: jis0208<<14 | 0x1C<<7 | 0x0C,\n\t33264 - 19968: jis0212<<14 | 0x35<<7 | 0x43,\n\t33265 - 19968: jis0212<<14 | 0x35<<7 | 0x44,\n\t33266 - 19968: jis0212<<14 | 0x35<<7 | 0x45,\n\t33267 - 19968: jis0208<<14 | 0x1A<<7 | 0x49,\n\t33268 - 19968: jis0208<<14 | 0x22<<7 | 0x36,\n\t33269 - 19968: jis0212<<14 | 0x35<<7 | 0x46,\n\t33270 - 19968: jis0212<<14 | 0x35<<7 | 0x47,\n\t33272 - 19968: jis0212<<14 | 0x35<<7 | 0x48,\n\t33273 - 19968: jis0212<<14 | 0x35<<7 | 0x49,\n\t33274 - 19968: jis0208<<14 | 0x46<<7 | 0x29,\n\t33275 - 19968: jis0208<<14 | 0x46<<7 | 0x2A,\n\t33276 - 19968: jis0208<<14 | 0x10<<7 | 0x10,\n\t33277 - 19968: jis0212<<14 | 0x35<<7 | 0x4A,\n\t33278 - 19968: jis0208<<14 | 0x46<<7 | 0x2B,\n\t33279 - 19968: jis0212<<14 | 0x35<<7 | 0x4B,\n\t33280 - 19968: jis0212<<14 | 0x35<<7 | 0x4C,\n\t33281 - 19968: jis0208<<14 | 0x46<<7 | 0x2C,\n\t33282 - 19968: jis0208<<14 | 0x46<<7 | 0x2D,\n\t33283 - 19968: jis0212<<14 | 0x35<<7 | 0x4D,\n\t33285 - 19968: jis0208<<14 | 0x46<<7 | 0x2E,\n\t33287 - 19968: jis0208<<14 | 0x46<<7 | 0x2F,\n\t33288 - 19968: jis0208<<14 | 0x15<<7 | 0x1C,\n\t33289 - 19968: jis0208<<14 | 0x39<<7 | 0x09,\n\t33290 - 19968: jis0208<<14 | 0x46<<7 | 0x30,\n\t33292 - 19968: jis0208<<14 | 0x1F<<7 | 0x44,\n\t33293 - 19968: jis0208<<14 | 0x46<<7 | 0x31,\n\t33294 - 19968: jis0208<<14 | 0x1B<<7 | 0x2A,\n\t33295 - 19968: jis0212<<14 | 0x35<<7 | 0x4E,\n\t33296 - 19968: jis0208<<14 | 0x46<<7 | 0x32,\n\t33298 - 19968: jis0208<<14 | 0x2F<<7 | 0x0F,\n\t33299 - 19968: jis0212<<14 | 0x35<<7 | 0x4F,\n\t33300 - 19968: jis0212<<14 | 0x35<<7 | 0x50,\n\t33302 - 19968: jis0208<<14 | 0x46<<7 | 0x33,\n\t33303 - 19968: jis0208<<14 | 0x29<<7 | 0x3D,\n\t33304 - 19968: jis0208<<14 | 0x13<<7 | 0x3B,\n\t33305 - 19968: jis0212<<14 | 0x35<<7 | 0x51,\n\t33306 - 19968: jis0212<<14 | 0x35<<7 | 0x52,\n\t33307 - 19968: jis0208<<14 | 0x20<<7 | 0x03,\n\t33308 - 19968: jis0208<<14 | 0x1C<<7 | 0x37,\n\t33309 - 19968: jis0212<<14 | 0x35<<7 | 0x53,\n\t33310 - 19968: jis0208<<14 | 0x28<<7 | 0x50,\n\t33311 - 19968: jis0208<<14 | 0x1C<<7 | 0x0D,\n\t33313 - 19968: jis0212<<14 | 0x35<<7 | 0x54,\n\t33314 - 19968: jis0212<<14 | 0x35<<7 | 0x55,\n\t33320 - 19968: jis0212<<14 | 0x35<<7 | 0x56,\n\t33321 - 19968: jis0208<<14 | 0x46<<7 | 0x34,\n\t33322 - 19968: jis0208<<14 | 0x18<<7 | 0x31,\n\t33323 - 19968: jis0208<<14 | 0x46<<7 | 0x35,\n\t33324 - 19968: jis0208<<14 | 0x27<<7 | 0x2B,\n\t33326 - 19968: jis0208<<14 | 0x46<<7 | 0x43,\n\t33330 - 19968: jis0212<<14 | 0x35<<7 | 0x57,\n\t33331 - 19968: jis0208<<14 | 0x46<<7 | 0x37,\n\t33332 - 19968: jis0212<<14 | 0x35<<7 | 0x58,\n\t33333 - 19968: jis0208<<14 | 0x21<<7 | 0x28,\n\t33334 - 19968: jis0208<<14 | 0x26<<7 | 0x54,\n\t33335 - 19968: jis0208<<14 | 0x17<<7 | 0x1E,\n\t33336 - 19968: jis0208<<14 | 0x46<<7 | 0x36,\n\t33337 - 19968: jis0208<<14 | 0x20<<7 | 0x04,\n\t33338 - 19968: jis0212<<14 | 0x35<<7 | 0x59,\n\t33344 - 19968: jis0208<<14 | 0x46<<7 | 0x38,\n\t33347 - 19968: jis0212<<14 | 0x35<<7 | 0x5A,\n\t33348 - 19968: jis0212<<14 | 0x35<<7 | 0x5B,\n\t33349 - 19968: jis0212<<14 | 0x35<<7 | 0x5C,\n\t33350 - 19968: jis0212<<14 | 0x35<<7 | 0x5D,\n\t33351 - 19968: jis0208<<14 | 0x23<<7 | 0x59,\n\t33355 - 19968: jis0212<<14 | 0x36<<7 | 0x00,\n\t33358 - 19968: jis0212<<14 | 0x36<<7 | 0x01,\n\t33359 - 19968: jis0212<<14 | 0x36<<7 | 0x02,\n\t33361 - 19968: jis0212<<14 | 0x36<<7 | 0x03,\n\t33366 - 19968: jis0212<<14 | 0x36<<7 | 0x04,\n\t33368 - 19968: jis0208<<14 | 0x46<<7 | 0x3A,\n\t33369 - 19968: jis0208<<14 | 0x46<<7 | 0x39,\n\t33370 - 19968: jis0208<<14 | 0x46<<7 | 0x3C,\n\t33372 - 19968: jis0212<<14 | 0x36<<7 | 0x05,\n\t33373 - 19968: jis0208<<14 | 0x46<<7 | 0x3B,\n\t33375 - 19968: jis0208<<14 | 0x46<<7 | 0x3D,\n\t33376 - 19968: jis0212<<14 | 0x36<<7 | 0x06,\n\t33378 - 19968: jis0208<<14 | 0x46<<7 | 0x3F,\n\t33379 - 19968: jis0212<<14 | 0x36<<7 | 0x07,\n\t33380 - 19968: jis0208<<14 | 0x46<<7 | 0x3E,\n\t33382 - 19968: jis0208<<14 | 0x13<<7 | 0x2E,\n\t33383 - 19968: jis0212<<14 | 0x36<<7 | 0x08,\n\t33384 - 19968: jis0208<<14 | 0x46<<7 | 0x40,\n\t33386 - 19968: jis0208<<14 | 0x46<<7 | 0x41,\n\t33387 - 19968: jis0208<<14 | 0x46<<7 | 0x42,\n\t33389 - 19968: jis0212<<14 | 0x36<<7 | 0x09,\n\t33390 - 19968: jis0208<<14 | 0x19<<7 | 0x10,\n\t33391 - 19968: jis0208<<14 | 0x2D<<7 | 0x28,\n\t33393 - 19968: jis0208<<14 | 0x46<<7 | 0x44,\n\t33394 - 19968: jis0208<<14 | 0x1E<<7 | 0x06,\n\t33396 - 19968: jis0212<<14 | 0x36<<7 | 0x0A,\n\t33398 - 19968: jis0208<<14 | 0x10<<7 | 0x4F,\n\t33399 - 19968: jis0208<<14 | 0x46<<7 | 0x45,\n\t33400 - 19968: jis0208<<14 | 0x46<<7 | 0x46,\n\t33403 - 19968: jis0212<<14 | 0x36<<7 | 0x0B,\n\t33405 - 19968: jis0212<<14 | 0x36<<7 | 0x0C,\n\t33406 - 19968: jis0208<<14 | 0x46<<7 | 0x47,\n\t33407 - 19968: jis0212<<14 | 0x36<<7 | 0x0D,\n\t33408 - 19968: jis0212<<14 | 0x36<<7 | 0x0E,\n\t33409 - 19968: jis0212<<14 | 0x36<<7 | 0x0F,\n\t33411 - 19968: jis0212<<14 | 0x36<<7 | 0x10,\n\t33412 - 19968: jis0212<<14 | 0x36<<7 | 0x11,\n\t33415 - 19968: jis0212<<14 | 0x36<<7 | 0x12,\n\t33417 - 19968: jis0212<<14 | 0x36<<7 | 0x13,\n\t33418 - 19968: jis0212<<14 | 0x36<<7 | 0x14,\n\t33419 - 19968: jis0208<<14 | 0x0F<<7 | 0x51,\n\t33421 - 19968: jis0208<<14 | 0x46<<7 | 0x48,\n\t33422 - 19968: jis0212<<14 | 0x36<<7 | 0x15,\n\t33425 - 19968: jis0212<<14 | 0x36<<7 | 0x16,\n\t33426 - 19968: jis0208<<14 | 0x46<<7 | 0x49,\n\t33428 - 19968: jis0212<<14 | 0x36<<7 | 0x17,\n\t33430 - 19968: jis0212<<14 | 0x36<<7 | 0x18,\n\t33432 - 19968: jis0212<<14 | 0x36<<7 | 0x19,\n\t33433 - 19968: jis0208<<14 | 0x28<<7 | 0x46,\n\t33434 - 19968: jis0212<<14 | 0x36<<7 | 0x1A,\n\t33435 - 19968: jis0212<<14 | 0x36<<7 | 0x1B,\n\t33437 - 19968: jis0208<<14 | 0x1B<<7 | 0x26,\n\t33439 - 19968: jis0208<<14 | 0x46<<7 | 0x4B,\n\t33440 - 19968: jis0212<<14 | 0x36<<7 | 0x1C,\n\t33441 - 19968: jis0212<<14 | 0x36<<7 | 0x1D,\n\t33443 - 19968: jis0212<<14 | 0x36<<7 | 0x1E,\n\t33444 - 19968: jis0212<<14 | 0x36<<7 | 0x1F,\n\t33445 - 19968: jis0208<<14 | 0x12<<7 | 0x08,\n\t33446 - 19968: jis0208<<14 | 0x0F<<7 | 0x11,\n\t33447 - 19968: jis0212<<14 | 0x36<<7 | 0x20,\n\t33448 - 19968: jis0212<<14 | 0x36<<7 | 0x21,\n\t33449 - 19968: jis0212<<14 | 0x36<<7 | 0x22,\n\t33450 - 19968: jis0212<<14 | 0x36<<7 | 0x23,\n\t33451 - 19968: jis0208<<14 | 0x46<<7 | 0x4A,\n\t33452 - 19968: jis0208<<14 | 0x46<<7 | 0x4D,\n\t33453 - 19968: jis0208<<14 | 0x26<<7 | 0x2D,\n\t33454 - 19968: jis0212<<14 | 0x36<<7 | 0x24,\n\t33455 - 19968: jis0208<<14 | 0x1E<<7 | 0x23,\n\t33456 - 19968: jis0212<<14 | 0x36<<7 | 0x25,\n\t33457 - 19968: jis0208<<14 | 0x11<<7 | 0x35,\n\t33458 - 19968: jis0212<<14 | 0x36<<7 | 0x26,\n\t33459 - 19968: jis0208<<14 | 0x2A<<7 | 0x06,\n\t33460 - 19968: jis0212<<14 | 0x36<<7 | 0x27,\n\t33463 - 19968: jis0212<<14 | 0x36<<7 | 0x28,\n\t33464 - 19968: jis0208<<14 | 0x16<<7 | 0x3C,\n\t33465 - 19968: jis0208<<14 | 0x15<<7 | 0x3B,\n\t33466 - 19968: jis0212<<14 | 0x36<<7 | 0x29,\n\t33467 - 19968: jis0208<<14 | 0x46<<7 | 0x4C,\n\t33468 - 19968: jis0212<<14 | 0x36<<7 | 0x2A,\n\t33469 - 19968: jis0208<<14 | 0x11<<7 | 0x49,\n\t33470 - 19968: jis0212<<14 | 0x36<<7 | 0x2B,\n\t33471 - 19968: jis0212<<14 | 0x36<<7 | 0x2C,\n\t33477 - 19968: jis0208<<14 | 0x13<<7 | 0x02,\n\t33478 - 19968: jis0212<<14 | 0x36<<7 | 0x2D,\n\t33488 - 19968: jis0212<<14 | 0x36<<7 | 0x2E,\n\t33489 - 19968: jis0208<<14 | 0x10<<7 | 0x50,\n\t33490 - 19968: jis0208<<14 | 0x46<<7 | 0x51,\n\t33491 - 19968: jis0208<<14 | 0x2D<<7 | 0x49,\n\t33492 - 19968: jis0208<<14 | 0x21<<7 | 0x3C,\n\t33493 - 19968: jis0212<<14 | 0x36<<7 | 0x2F,\n\t33495 - 19968: jis0208<<14 | 0x28<<7 | 0x23,\n\t33497 - 19968: jis0208<<14 | 0x46<<7 | 0x5D,\n\t33498 - 19968: jis0212<<14 | 0x36<<7 | 0x30,\n\t33499 - 19968: jis0208<<14 | 0x11<<7 | 0x36,\n\t33500 - 19968: jis0208<<14 | 0x46<<7 | 0x5B,\n\t33502 - 19968: jis0208<<14 | 0x46<<7 | 0x59,\n\t33503 - 19968: jis0208<<14 | 0x46<<7 | 0x50,\n\t33504 - 19968: jis0212<<14 | 0x36<<7 | 0x31,\n\t33505 - 19968: jis0208<<14 | 0x46<<7 | 0x4E,\n\t33506 - 19968: jis0212<<14 | 0x36<<7 | 0x32,\n\t33507 - 19968: jis0208<<14 | 0x46<<7 | 0x4F,\n\t33508 - 19968: jis0212<<14 | 0x36<<7 | 0x33,\n\t33509 - 19968: jis0208<<14 | 0x1B<<7 | 0x42,\n\t33510 - 19968: jis0208<<14 | 0x15<<7 | 0x4B,\n\t33511 - 19968: jis0208<<14 | 0x22<<7 | 0x56,\n\t33512 - 19968: jis0212<<14 | 0x36<<7 | 0x34,\n\t33514 - 19968: jis0212<<14 | 0x36<<7 | 0x35,\n\t33515 - 19968: jis0208<<14 | 0x25<<7 | 0x30,\n\t33517 - 19968: jis0212<<14 | 0x36<<7 | 0x36,\n\t33519 - 19968: jis0212<<14 | 0x36<<7 | 0x37,\n\t33521 - 19968: jis0208<<14 | 0x10<<7 | 0x30,\n\t33523 - 19968: jis0208<<14 | 0x46<<7 | 0x53,\n\t33524 - 19968: jis0208<<14 | 0x46<<7 | 0x52,\n\t33526 - 19968: jis0212<<14 | 0x36<<7 | 0x38,\n\t33527 - 19968: jis0212<<14 | 0x36<<7 | 0x39,\n\t33529 - 19968: jis0208<<14 | 0x46<<7 | 0x58,\n\t33530 - 19968: jis0208<<14 | 0x46<<7 | 0x54,\n\t33531 - 19968: jis0208<<14 | 0x46<<7 | 0x57,\n\t33533 - 19968: jis0212<<14 | 0x36<<7 | 0x3A,\n\t33534 - 19968: jis0212<<14 | 0x36<<7 | 0x3B,\n\t33536 - 19968: jis0212<<14 | 0x36<<7 | 0x3C,\n\t33537 - 19968: jis0208<<14 | 0x5A<<7 | 0x36,\n\t33538 - 19968: jis0208<<14 | 0x2B<<7 | 0x2F,\n\t33539 - 19968: jis0208<<14 | 0x46<<7 | 0x56,\n\t33540 - 19968: jis0208<<14 | 0x11<<7 | 0x37,\n\t33541 - 19968: jis0208<<14 | 0x12<<7 | 0x5C,\n\t33542 - 19968: jis0208<<14 | 0x46<<7 | 0x5A,\n\t33543 - 19968: jis0212<<14 | 0x36<<7 | 0x3E,\n\t33544 - 19968: jis0212<<14 | 0x36<<7 | 0x3F,\n\t33545 - 19968: jis0208<<14 | 0x46<<7 | 0x5C,\n\t33546 - 19968: jis0212<<14 | 0x36<<7 | 0x40,\n\t33547 - 19968: jis0212<<14 | 0x36<<7 | 0x41,\n\t33550 - 19968: jis0208<<14 | 0x16<<7 | 0x33,\n\t33558 - 19968: jis0208<<14 | 0x47<<7 | 0x02,\n\t33559 - 19968: jis0208<<14 | 0x47<<7 | 0x0B,\n\t33560 - 19968: jis0208<<14 | 0x47<<7 | 0x0C,\n\t33563 - 19968: jis0212<<14 | 0x36<<7 | 0x43,\n\t33564 - 19968: jis0208<<14 | 0x0F<<7 | 0x0A,\n\t33565 - 19968: jis0212<<14 | 0x36<<7 | 0x44,\n\t33566 - 19968: jis0212<<14 | 0x36<<7 | 0x45,\n\t33567 - 19968: jis0212<<14 | 0x36<<7 | 0x46,\n\t33569 - 19968: jis0212<<14 | 0x36<<7 | 0x47,\n\t33570 - 19968: jis0212<<14 | 0x36<<7 | 0x48,\n\t33571 - 19968: jis0208<<14 | 0x47<<7 | 0x13,\n\t33576 - 19968: jis0208<<14 | 0x0F<<7 | 0x50,\n\t33579 - 19968: jis0208<<14 | 0x47<<7 | 0x0A,\n\t33580 - 19968: jis0212<<14 | 0x36<<7 | 0x49,\n\t33581 - 19968: jis0212<<14 | 0x36<<7 | 0x4A,\n\t33582 - 19968: jis0212<<14 | 0x36<<7 | 0x4B,\n\t33583 - 19968: jis0208<<14 | 0x47<<7 | 0x09,\n\t33584 - 19968: jis0212<<14 | 0x36<<7 | 0x4C,\n\t33585 - 19968: jis0208<<14 | 0x47<<7 | 0x04,\n\t33586 - 19968: jis0208<<14 | 0x47<<7 | 0x03,\n\t33587 - 19968: jis0212<<14 | 0x36<<7 | 0x4D,\n\t33588 - 19968: jis0208<<14 | 0x47<<7 | 0x01,\n\t33589 - 19968: jis0208<<14 | 0x47<<7 | 0x00,\n\t33590 - 19968: jis0208<<14 | 0x22<<7 | 0x42,\n\t33591 - 19968: jis0212<<14 | 0x36<<7 | 0x4E,\n\t33592 - 19968: jis0208<<14 | 0x21<<7 | 0x5A,\n\t33593 - 19968: jis0208<<14 | 0x47<<7 | 0x06,\n\t33594 - 19968: jis0212<<14 | 0x36<<7 | 0x4F,\n\t33596 - 19968: jis0212<<14 | 0x36<<7 | 0x50,\n\t33597 - 19968: jis0212<<14 | 0x36<<7 | 0x51,\n\t33600 - 19968: jis0208<<14 | 0x47<<7 | 0x05,\n\t33602 - 19968: jis0212<<14 | 0x36<<7 | 0x52,\n\t33603 - 19968: jis0212<<14 | 0x36<<7 | 0x53,\n\t33604 - 19968: jis0212<<14 | 0x36<<7 | 0x54,\n\t33605 - 19968: jis0208<<14 | 0x47<<7 | 0x08,\n\t33607 - 19968: jis0212<<14 | 0x36<<7 | 0x55,\n\t33609 - 19968: jis0208<<14 | 0x20<<7 | 0x4F,\n\t33610 - 19968: jis0208<<14 | 0x16<<7 | 0x34,\n\t33613 - 19968: jis0212<<14 | 0x36<<7 | 0x56,\n\t33614 - 19968: jis0212<<14 | 0x36<<7 | 0x57,\n\t33615 - 19968: jis0208<<14 | 0x10<<7 | 0x20,\n\t33616 - 19968: jis0208<<14 | 0x47<<7 | 0x07,\n\t33617 - 19968: jis0212<<14 | 0x36<<7 | 0x58,\n\t33618 - 19968: jis0208<<14 | 0x18<<7 | 0x32,\n\t33619 - 19968: jis0212<<14 | 0x37<<7 | 0x1D,\n\t33620 - 19968: jis0212<<14 | 0x36<<7 | 0x42,\n\t33621 - 19968: jis0212<<14 | 0x36<<7 | 0x59,\n\t33622 - 19968: jis0212<<14 | 0x36<<7 | 0x5A,\n\t33623 - 19968: jis0212<<14 | 0x36<<7 | 0x5B,\n\t33624 - 19968: jis0208<<14 | 0x20<<7 | 0x50,\n\t33634 - 19968: jis0208<<14 | 0x5A<<7 | 0x37,\n\t33648 - 19968: jis0212<<14 | 0x36<<7 | 0x5C,\n\t33651 - 19968: jis0208<<14 | 0x47<<7 | 0x19,\n\t33653 - 19968: jis0208<<14 | 0x47<<7 | 0x1A,\n\t33655 - 19968: jis0208<<14 | 0x11<<7 | 0x38,\n\t33656 - 19968: jis0212<<14 | 0x36<<7 | 0x5D,\n\t33659 - 19968: jis0208<<14 | 0x11<<7 | 0x0D,\n\t33660 - 19968: jis0208<<14 | 0x47<<7 | 0x17,\n\t33661 - 19968: jis0212<<14 | 0x37<<7 | 0x00,\n\t33663 - 19968: jis0208<<14 | 0x5A<<7 | 0x38,\n\t33664 - 19968: jis0212<<14 | 0x37<<7 | 0x02,\n\t33666 - 19968: jis0212<<14 | 0x37<<7 | 0x03,\n\t33668 - 19968: jis0212<<14 | 0x37<<7 | 0x04,\n\t33669 - 19968: jis0208<<14 | 0x47<<7 | 0x0D,\n\t33670 - 19968: jis0212<<14 | 0x37<<7 | 0x05,\n\t33671 - 19968: jis0208<<14 | 0x47<<7 | 0x15,\n\t33673 - 19968: jis0208<<14 | 0x47<<7 | 0x1C,\n\t33674 - 19968: jis0208<<14 | 0x47<<7 | 0x16,\n\t33677 - 19968: jis0212<<14 | 0x37<<7 | 0x06,\n\t33678 - 19968: jis0208<<14 | 0x47<<7 | 0x14,\n\t33682 - 19968: jis0212<<14 | 0x37<<7 | 0x07,\n\t33683 - 19968: jis0208<<14 | 0x46<<7 | 0x55,\n\t33684 - 19968: jis0212<<14 | 0x37<<7 | 0x08,\n\t33685 - 19968: jis0212<<14 | 0x37<<7 | 0x09,\n\t33686 - 19968: jis0208<<14 | 0x47<<7 | 0x12,\n\t33688 - 19968: jis0212<<14 | 0x37<<7 | 0x0A,\n\t33689 - 19968: jis0212<<14 | 0x37<<7 | 0x0B,\n\t33690 - 19968: jis0208<<14 | 0x47<<7 | 0x0E,\n\t33691 - 19968: jis0212<<14 | 0x37<<7 | 0x0C,\n\t33692 - 19968: jis0212<<14 | 0x37<<7 | 0x0D,\n\t33693 - 19968: jis0212<<14 | 0x37<<7 | 0x0E,\n\t33694 - 19968: jis0208<<14 | 0x13<<7 | 0x2F,\n\t33695 - 19968: jis0208<<14 | 0x47<<7 | 0x10,\n\t33696 - 19968: jis0208<<14 | 0x47<<7 | 0x1B,\n\t33698 - 19968: jis0208<<14 | 0x47<<7 | 0x11,\n\t33702 - 19968: jis0212<<14 | 0x37<<7 | 0x0F,\n\t33703 - 19968: jis0212<<14 | 0x37<<7 | 0x10,\n\t33704 - 19968: jis0208<<14 | 0x47<<7 | 0x1D,\n\t33705 - 19968: jis0212<<14 | 0x37<<7 | 0x11,\n\t33706 - 19968: jis0208<<14 | 0x47<<7 | 0x0F,\n\t33707 - 19968: jis0208<<14 | 0x26<<7 | 0x5B,\n\t33708 - 19968: jis0212<<14 | 0x37<<7 | 0x12,\n\t33709 - 19968: jis0212<<14 | 0x37<<7 | 0x2B,\n\t33713 - 19968: jis0208<<14 | 0x2C<<7 | 0x48,\n\t33717 - 19968: jis0208<<14 | 0x47<<7 | 0x18,\n\t33725 - 19968: jis0208<<14 | 0x47<<7 | 0x2E,\n\t33726 - 19968: jis0212<<14 | 0x37<<7 | 0x13,\n\t33727 - 19968: jis0212<<14 | 0x37<<7 | 0x14,\n\t33728 - 19968: jis0212<<14 | 0x37<<7 | 0x15,\n\t33729 - 19968: jis0208<<14 | 0x47<<7 | 0x26,\n\t33733 - 19968: jis0208<<14 | 0x1E<<7 | 0x5A,\n\t33735 - 19968: jis0208<<14 | 0x5A<<7 | 0x39,\n\t33737 - 19968: jis0212<<14 | 0x37<<7 | 0x17,\n\t33738 - 19968: jis0208<<14 | 0x14<<7 | 0x25,\n\t33740 - 19968: jis0208<<14 | 0x15<<7 | 0x3C,\n\t33742 - 19968: jis0208<<14 | 0x47<<7 | 0x21,\n\t33743 - 19968: jis0212<<14 | 0x37<<7 | 0x18,\n\t33744 - 19968: jis0212<<14 | 0x37<<7 | 0x19,\n\t33745 - 19968: jis0212<<14 | 0x37<<7 | 0x1A,\n\t33747 - 19968: jis0208<<14 | 0x11<<7 | 0x3A,\n\t33748 - 19968: jis0212<<14 | 0x37<<7 | 0x1B,\n\t33750 - 19968: jis0208<<14 | 0x1D<<7 | 0x33,\n\t33752 - 19968: jis0208<<14 | 0x47<<7 | 0x24,\n\t33756 - 19968: jis0208<<14 | 0x19<<7 | 0x39,\n\t33757 - 19968: jis0212<<14 | 0x37<<7 | 0x1C,\n\t33759 - 19968: jis0208<<14 | 0x24<<7 | 0x30,\n\t33760 - 19968: jis0208<<14 | 0x47<<7 | 0x29,\n\t33768 - 19968: jis0212<<14 | 0x37<<7 | 0x1E,\n\t33769 - 19968: jis0208<<14 | 0x29<<7 | 0x4D,\n\t33770 - 19968: jis0212<<14 | 0x37<<7 | 0x1F,\n\t33771 - 19968: jis0208<<14 | 0x47<<7 | 0x20,\n\t33775 - 19968: jis0208<<14 | 0x11<<7 | 0x39,\n\t33776 - 19968: jis0208<<14 | 0x17<<7 | 0x35,\n\t33777 - 19968: jis0208<<14 | 0x28<<7 | 0x08,\n\t33778 - 19968: jis0208<<14 | 0x47<<7 | 0x2A,\n\t33780 - 19968: jis0208<<14 | 0x47<<7 | 0x1E,\n\t33782 - 19968: jis0208<<14 | 0x5A<<7 | 0x3A,\n\t33783 - 19968: jis0208<<14 | 0x47<<7 | 0x27,\n\t33784 - 19968: jis0212<<14 | 0x37<<7 | 0x21,\n\t33785 - 19968: jis0212<<14 | 0x37<<7 | 0x22,\n\t33787 - 19968: jis0208<<14 | 0x47<<7 | 0x31,\n\t33788 - 19968: jis0212<<14 | 0x37<<7 | 0x23,\n\t33789 - 19968: jis0208<<14 | 0x47<<7 | 0x22,\n\t33793 - 19968: jis0212<<14 | 0x37<<7 | 0x24,\n\t33795 - 19968: jis0208<<14 | 0x47<<7 | 0x23,\n\t33796 - 19968: jis0208<<14 | 0x25<<7 | 0x19,\n\t33798 - 19968: jis0212<<14 | 0x37<<7 | 0x25,\n\t33799 - 19968: jis0208<<14 | 0x47<<7 | 0x28,\n\t33802 - 19968: jis0212<<14 | 0x37<<7 | 0x26,\n\t33803 - 19968: jis0208<<14 | 0x47<<7 | 0x25,\n\t33804 - 19968: jis0208<<14 | 0x2A<<7 | 0x07,\n\t33805 - 19968: jis0208<<14 | 0x47<<7 | 0x2B,\n\t33806 - 19968: jis0208<<14 | 0x0F<<7 | 0x3F,\n\t33807 - 19968: jis0212<<14 | 0x37<<7 | 0x27,\n\t33809 - 19968: jis0212<<14 | 0x37<<7 | 0x28,\n\t33811 - 19968: jis0208<<14 | 0x47<<7 | 0x1F,\n\t33813 - 19968: jis0212<<14 | 0x37<<7 | 0x29,\n\t33817 - 19968: jis0212<<14 | 0x37<<7 | 0x2A,\n\t33824 - 19968: jis0208<<14 | 0x47<<7 | 0x2D,\n\t33826 - 19968: jis0208<<14 | 0x47<<7 | 0x2C,\n\t33833 - 19968: jis0208<<14 | 0x26<<7 | 0x4A,\n\t33834 - 19968: jis0208<<14 | 0x47<<7 | 0x33,\n\t33836 - 19968: jis0208<<14 | 0x47<<7 | 0x3E,\n\t33839 - 19968: jis0212<<14 | 0x37<<7 | 0x2C,\n\t33841 - 19968: jis0208<<14 | 0x12<<7 | 0x5D,\n\t33845 - 19968: jis0208<<14 | 0x47<<7 | 0x41,\n\t33848 - 19968: jis0208<<14 | 0x47<<7 | 0x2F,\n\t33849 - 19968: jis0212<<14 | 0x37<<7 | 0x2D,\n\t33852 - 19968: jis0208<<14 | 0x47<<7 | 0x34,\n\t33853 - 19968: jis0208<<14 | 0x2C<<7 | 0x4D,\n\t33861 - 19968: jis0212<<14 | 0x37<<7 | 0x2E,\n\t33862 - 19968: jis0208<<14 | 0x47<<7 | 0x3D,\n\t33863 - 19968: jis0212<<14 | 0x37<<7 | 0x2F,\n\t33864 - 19968: jis0208<<14 | 0x5A<<7 | 0x3B,\n\t33865 - 19968: jis0208<<14 | 0x2C<<7 | 0x34,\n\t33866 - 19968: jis0212<<14 | 0x37<<7 | 0x31,\n\t33869 - 19968: jis0212<<14 | 0x37<<7 | 0x32,\n\t33870 - 19968: jis0208<<14 | 0x2D<<7 | 0x09,\n\t33871 - 19968: jis0212<<14 | 0x37<<7 | 0x33,\n\t33873 - 19968: jis0212<<14 | 0x37<<7 | 0x34,\n\t33874 - 19968: jis0212<<14 | 0x37<<7 | 0x35,\n\t33878 - 19968: jis0212<<14 | 0x37<<7 | 0x36,\n\t33879 - 19968: jis0208<<14 | 0x22<<7 | 0x57,\n\t33880 - 19968: jis0212<<14 | 0x37<<7 | 0x37,\n\t33881 - 19968: jis0212<<14 | 0x37<<7 | 0x38,\n\t33882 - 19968: jis0212<<14 | 0x37<<7 | 0x39,\n\t33883 - 19968: jis0208<<14 | 0x12<<7 | 0x4A,\n\t33884 - 19968: jis0212<<14 | 0x37<<7 | 0x3A,\n\t33888 - 19968: jis0212<<14 | 0x37<<7 | 0x3B,\n\t33889 - 19968: jis0208<<14 | 0x28<<7 | 0x51,\n\t33890 - 19968: jis0208<<14 | 0x47<<7 | 0x43,\n\t33891 - 19968: jis0208<<14 | 0x25<<7 | 0x00,\n\t33892 - 19968: jis0212<<14 | 0x37<<7 | 0x3C,\n\t33893 - 19968: jis0212<<14 | 0x37<<7 | 0x3D,\n\t33894 - 19968: jis0208<<14 | 0x0F<<7 | 0x10,\n\t33895 - 19968: jis0212<<14 | 0x37<<7 | 0x3E,\n\t33897 - 19968: jis0208<<14 | 0x47<<7 | 0x3C,\n\t33898 - 19968: jis0212<<14 | 0x37<<7 | 0x3F,\n\t33899 - 19968: jis0208<<14 | 0x47<<7 | 0x38,\n\t33900 - 19968: jis0208<<14 | 0x20<<7 | 0x51,\n\t33901 - 19968: jis0208<<14 | 0x47<<7 | 0x32,\n\t33902 - 19968: jis0208<<14 | 0x47<<7 | 0x3A,\n\t33903 - 19968: jis0208<<14 | 0x47<<7 | 0x3F,\n\t33904 - 19968: jis0212<<14 | 0x37<<7 | 0x40,\n\t33905 - 19968: jis0208<<14 | 0x26<<7 | 0x0B,\n\t33907 - 19968: jis0212<<14 | 0x37<<7 | 0x41,\n\t33908 - 19968: jis0212<<14 | 0x37<<7 | 0x42,\n\t33909 - 19968: jis0208<<14 | 0x0F<<7 | 0x09,\n\t33910 - 19968: jis0212<<14 | 0x37<<7 | 0x43,\n\t33911 - 19968: jis0208<<14 | 0x47<<7 | 0x37,\n\t33912 - 19968: jis0212<<14 | 0x37<<7 | 0x44,\n\t33913 - 19968: jis0208<<14 | 0x47<<7 | 0x40,\n\t33914 - 19968: jis0208<<14 | 0x28<<7 | 0x57,\n\t33916 - 19968: jis0212<<14 | 0x37<<7 | 0x45,\n\t33917 - 19968: jis0212<<14 | 0x37<<7 | 0x46,\n\t33921 - 19968: jis0212<<14 | 0x37<<7 | 0x47,\n\t33922 - 19968: jis0208<<14 | 0x47<<7 | 0x3B,\n\t33924 - 19968: jis0208<<14 | 0x47<<7 | 0x36,\n\t33925 - 19968: jis0212<<14 | 0x37<<7 | 0x48,\n\t33931 - 19968: jis0208<<14 | 0x1D<<7 | 0x34,\n\t33936 - 19968: jis0208<<14 | 0x1C<<7 | 0x0E,\n\t33938 - 19968: jis0212<<14 | 0x37<<7 | 0x49,\n\t33939 - 19968: jis0212<<14 | 0x37<<7 | 0x4A,\n\t33940 - 19968: jis0208<<14 | 0x1B<<7 | 0x0B,\n\t33941 - 19968: jis0212<<14 | 0x37<<7 | 0x4B,\n\t33945 - 19968: jis0208<<14 | 0x2B<<7 | 0x37,\n\t33948 - 19968: jis0208<<14 | 0x28<<7 | 0x26,\n\t33950 - 19968: jis0212<<14 | 0x37<<7 | 0x4C,\n\t33951 - 19968: jis0208<<14 | 0x47<<7 | 0x46,\n\t33953 - 19968: jis0208<<14 | 0x47<<7 | 0x4F,\n\t33958 - 19968: jis0212<<14 | 0x37<<7 | 0x4D,\n\t33960 - 19968: jis0212<<14 | 0x37<<7 | 0x4E,\n\t33961 - 19968: jis0212<<14 | 0x37<<7 | 0x4F,\n\t33962 - 19968: jis0212<<14 | 0x37<<7 | 0x50,\n\t33965 - 19968: jis0208<<14 | 0x47<<7 | 0x39,\n\t33967 - 19968: jis0212<<14 | 0x37<<7 | 0x51,\n\t33969 - 19968: jis0212<<14 | 0x37<<7 | 0x52,\n\t33970 - 19968: jis0208<<14 | 0x12<<7 | 0x56,\n\t33972 - 19968: jis0208<<14 | 0x5A<<7 | 0x3C,\n\t33976 - 19968: jis0208<<14 | 0x1D<<7 | 0x57,\n\t33977 - 19968: jis0208<<14 | 0x47<<7 | 0x44,\n\t33978 - 19968: jis0212<<14 | 0x37<<7 | 0x54,\n\t33979 - 19968: jis0208<<14 | 0x47<<7 | 0x49,\n\t33980 - 19968: jis0208<<14 | 0x20<<7 | 0x52,\n\t33981 - 19968: jis0212<<14 | 0x37<<7 | 0x55,\n\t33982 - 19968: jis0212<<14 | 0x37<<7 | 0x56,\n\t33983 - 19968: jis0208<<14 | 0x47<<7 | 0x45,\n\t33984 - 19968: jis0212<<14 | 0x37<<7 | 0x57,\n\t33985 - 19968: jis0208<<14 | 0x47<<7 | 0x4C,\n\t33986 - 19968: jis0212<<14 | 0x37<<7 | 0x58,\n\t33988 - 19968: jis0208<<14 | 0x22<<7 | 0x3E,\n\t33990 - 19968: jis0208<<14 | 0x47<<7 | 0x4D,\n\t33991 - 19968: jis0212<<14 | 0x37<<7 | 0x59,\n\t33992 - 19968: jis0212<<14 | 0x37<<7 | 0x5A,\n\t33993 - 19968: jis0208<<14 | 0x2C<<7 | 0x35,\n\t33994 - 19968: jis0208<<14 | 0x47<<7 | 0x42,\n\t33995 - 19968: jis0208<<14 | 0x12<<7 | 0x17,\n\t33996 - 19968: jis0212<<14 | 0x37<<7 | 0x5B,\n\t33997 - 19968: jis0208<<14 | 0x47<<7 | 0x48,\n\t33999 - 19968: jis0212<<14 | 0x37<<7 | 0x5C,\n\t34000 - 19968: jis0208<<14 | 0x47<<7 | 0x4B,\n\t34001 - 19968: jis0208<<14 | 0x2B<<7 | 0x0B,\n\t34003 - 19968: jis0212<<14 | 0x37<<7 | 0x5D,\n\t34006 - 19968: jis0208<<14 | 0x47<<7 | 0x4E,\n\t34009 - 19968: jis0208<<14 | 0x47<<7 | 0x47,\n\t34010 - 19968: jis0208<<14 | 0x47<<7 | 0x4A,\n\t34012 - 19968: jis0208<<14 | 0x58<<7 | 0x04,\n\t34023 - 19968: jis0212<<14 | 0x38<<7 | 0x01,\n\t34026 - 19968: jis0212<<14 | 0x38<<7 | 0x02,\n\t34028 - 19968: jis0208<<14 | 0x2A<<7 | 0x08,\n\t34030 - 19968: jis0208<<14 | 0x2E<<7 | 0x00,\n\t34031 - 19968: jis0212<<14 | 0x38<<7 | 0x03,\n\t34032 - 19968: jis0212<<14 | 0x38<<7 | 0x04,\n\t34033 - 19968: jis0212<<14 | 0x38<<7 | 0x05,\n\t34034 - 19968: jis0212<<14 | 0x38<<7 | 0x06,\n\t34036 - 19968: jis0208<<14 | 0x47<<7 | 0x52,\n\t34039 - 19968: jis0212<<14 | 0x38<<7 | 0x07,\n\t34042 - 19968: jis0212<<14 | 0x38<<7 | 0x09,\n\t34043 - 19968: jis0212<<14 | 0x38<<7 | 0x0A,\n\t34044 - 19968: jis0208<<14 | 0x47<<7 | 0x59,\n\t34045 - 19968: jis0212<<14 | 0x38<<7 | 0x0B,\n\t34047 - 19968: jis0208<<14 | 0x47<<7 | 0x51,\n\t34048 - 19968: jis0208<<14 | 0x1B<<7 | 0x22,\n\t34050 - 19968: jis0212<<14 | 0x38<<7 | 0x0C,\n\t34051 - 19968: jis0212<<14 | 0x38<<7 | 0x0D,\n\t34054 - 19968: jis0208<<14 | 0x47<<7 | 0x30,\n\t34055 - 19968: jis0212<<14 | 0x38<<7 | 0x0E,\n\t34060 - 19968: jis0212<<14 | 0x38<<7 | 0x0F,\n\t34062 - 19968: jis0212<<14 | 0x38<<7 | 0x10,\n\t34064 - 19968: jis0212<<14 | 0x38<<7 | 0x11,\n\t34065 - 19968: jis0208<<14 | 0x29<<7 | 0x2D,\n\t34067 - 19968: jis0208<<14 | 0x2B<<7 | 0x01,\n\t34068 - 19968: jis0208<<14 | 0x47<<7 | 0x58,\n\t34069 - 19968: jis0208<<14 | 0x47<<7 | 0x57,\n\t34071 - 19968: jis0208<<14 | 0x47<<7 | 0x53,\n\t34072 - 19968: jis0208<<14 | 0x47<<7 | 0x54,\n\t34074 - 19968: jis0208<<14 | 0x10<<7 | 0x15,\n\t34076 - 19968: jis0212<<14 | 0x38<<7 | 0x12,\n\t34078 - 19968: jis0212<<14 | 0x38<<7 | 0x13,\n\t34079 - 19968: jis0208<<14 | 0x47<<7 | 0x56,\n\t34081 - 19968: jis0208<<14 | 0x47<<7 | 0x50,\n\t34082 - 19968: jis0212<<14 | 0x38<<7 | 0x14,\n\t34083 - 19968: jis0212<<14 | 0x38<<7 | 0x15,\n\t34084 - 19968: jis0212<<14 | 0x38<<7 | 0x16,\n\t34085 - 19968: jis0212<<14 | 0x38<<7 | 0x17,\n\t34086 - 19968: jis0208<<14 | 0x23<<7 | 0x34,\n\t34087 - 19968: jis0212<<14 | 0x38<<7 | 0x18,\n\t34090 - 19968: jis0212<<14 | 0x38<<7 | 0x19,\n\t34091 - 19968: jis0212<<14 | 0x38<<7 | 0x1A,\n\t34092 - 19968: jis0208<<14 | 0x47<<7 | 0x55,\n\t34093 - 19968: jis0208<<14 | 0x0F<<7 | 0x5D,\n\t34095 - 19968: jis0212<<14 | 0x38<<7 | 0x1B,\n\t34098 - 19968: jis0212<<14 | 0x38<<7 | 0x08,\n\t34099 - 19968: jis0212<<14 | 0x38<<7 | 0x1C,\n\t34100 - 19968: jis0212<<14 | 0x38<<7 | 0x1D,\n\t34101 - 19968: jis0208<<14 | 0x21<<7 | 0x01,\n\t34102 - 19968: jis0212<<14 | 0x38<<7 | 0x1E,\n\t34109 - 19968: jis0208<<14 | 0x29<<7 | 0x22,\n\t34111 - 19968: jis0212<<14 | 0x38<<7 | 0x1F,\n\t34112 - 19968: jis0208<<14 | 0x47<<7 | 0x5A,\n\t34113 - 19968: jis0208<<14 | 0x48<<7 | 0x00,\n\t34115 - 19968: jis0208<<14 | 0x27<<7 | 0x38,\n\t34118 - 19968: jis0212<<14 | 0x38<<7 | 0x20,\n\t34120 - 19968: jis0208<<14 | 0x47<<7 | 0x5D,\n\t34121 - 19968: jis0208<<14 | 0x1D<<7 | 0x35,\n\t34122 - 19968: jis0208<<14 | 0x1B<<7 | 0x28,\n\t34123 - 19968: jis0208<<14 | 0x48<<7 | 0x02,\n\t34126 - 19968: jis0208<<14 | 0x15<<7 | 0x1D,\n\t34127 - 19968: jis0212<<14 | 0x38<<7 | 0x21,\n\t34128 - 19968: jis0212<<14 | 0x38<<7 | 0x22,\n\t34129 - 19968: jis0212<<14 | 0x38<<7 | 0x23,\n\t34130 - 19968: jis0212<<14 | 0x38<<7 | 0x24,\n\t34131 - 19968: jis0208<<14 | 0x5A<<7 | 0x3D,\n\t34133 - 19968: jis0208<<14 | 0x48<<7 | 0x03,\n\t34134 - 19968: jis0212<<14 | 0x38<<7 | 0x26,\n\t34135 - 19968: jis0208<<14 | 0x28<<7 | 0x58,\n\t34136 - 19968: jis0208<<14 | 0x47<<7 | 0x5C,\n\t34137 - 19968: jis0208<<14 | 0x5A<<7 | 0x3E,\n\t34138 - 19968: jis0208<<14 | 0x47<<7 | 0x35,\n\t34140 - 19968: jis0212<<14 | 0x38<<7 | 0x28,\n\t34141 - 19968: jis0212<<14 | 0x38<<7 | 0x29,\n\t34142 - 19968: jis0212<<14 | 0x38<<7 | 0x2A,\n\t34143 - 19968: jis0212<<14 | 0x38<<7 | 0x2B,\n\t34144 - 19968: jis0212<<14 | 0x38<<7 | 0x2C,\n\t34145 - 19968: jis0212<<14 | 0x38<<7 | 0x2D,\n\t34146 - 19968: jis0212<<14 | 0x38<<7 | 0x2E,\n\t34147 - 19968: jis0208<<14 | 0x47<<7 | 0x5B,\n\t34148 - 19968: jis0212<<14 | 0x38<<7 | 0x2F,\n\t34152 - 19968: jis0208<<14 | 0x2E<<7 | 0x2E,\n\t34153 - 19968: jis0208<<14 | 0x25<<7 | 0x01,\n\t34154 - 19968: jis0208<<14 | 0x28<<7 | 0x52,\n\t34155 - 19968: jis0208<<14 | 0x5A<<7 | 0x3F,\n\t34157 - 19968: jis0208<<14 | 0x48<<7 | 0x0A,\n\t34159 - 19968: jis0212<<14 | 0x38<<7 | 0x31,\n\t34167 - 19968: jis0208<<14 | 0x48<<7 | 0x10,\n\t34169 - 19968: jis0212<<14 | 0x38<<7 | 0x32,\n\t34170 - 19968: jis0212<<14 | 0x38<<7 | 0x33,\n\t34171 - 19968: jis0212<<14 | 0x38<<7 | 0x34,\n\t34173 - 19968: jis0212<<14 | 0x38<<7 | 0x35,\n\t34174 - 19968: jis0208<<14 | 0x48<<7 | 0x11,\n\t34175 - 19968: jis0212<<14 | 0x38<<7 | 0x36,\n\t34176 - 19968: jis0208<<14 | 0x48<<7 | 0x04,\n\t34177 - 19968: jis0212<<14 | 0x38<<7 | 0x37,\n\t34180 - 19968: jis0208<<14 | 0x26<<7 | 0x55,\n\t34181 - 19968: jis0212<<14 | 0x38<<7 | 0x38,\n\t34182 - 19968: jis0212<<14 | 0x38<<7 | 0x39,\n\t34183 - 19968: jis0208<<14 | 0x48<<7 | 0x0E,\n\t34184 - 19968: jis0208<<14 | 0x48<<7 | 0x06,\n\t34185 - 19968: jis0212<<14 | 0x38<<7 | 0x3A,\n\t34186 - 19968: jis0208<<14 | 0x48<<7 | 0x08,\n\t34187 - 19968: jis0212<<14 | 0x38<<7 | 0x3B,\n\t34188 - 19968: jis0212<<14 | 0x38<<7 | 0x3C,\n\t34191 - 19968: jis0212<<14 | 0x38<<7 | 0x3D,\n\t34192 - 19968: jis0208<<14 | 0x48<<7 | 0x12,\n\t34193 - 19968: jis0208<<14 | 0x48<<7 | 0x07,\n\t34195 - 19968: jis0212<<14 | 0x38<<7 | 0x3E,\n\t34196 - 19968: jis0208<<14 | 0x48<<7 | 0x0B,\n\t34199 - 19968: jis0208<<14 | 0x10<<7 | 0x51,\n\t34200 - 19968: jis0212<<14 | 0x38<<7 | 0x3F,\n\t34201 - 19968: jis0208<<14 | 0x25<<7 | 0x44,\n\t34203 - 19968: jis0208<<14 | 0x48<<7 | 0x0C,\n\t34204 - 19968: jis0208<<14 | 0x48<<7 | 0x0F,\n\t34205 - 19968: jis0212<<14 | 0x38<<7 | 0x40,\n\t34207 - 19968: jis0212<<14 | 0x38<<7 | 0x41,\n\t34208 - 19968: jis0212<<14 | 0x38<<7 | 0x42,\n\t34210 - 19968: jis0212<<14 | 0x38<<7 | 0x43,\n\t34212 - 19968: jis0208<<14 | 0x48<<7 | 0x05,\n\t34213 - 19968: jis0212<<14 | 0x38<<7 | 0x44,\n\t34214 - 19968: jis0208<<14 | 0x20<<7 | 0x05,\n\t34215 - 19968: jis0212<<14 | 0x38<<7 | 0x45,\n\t34216 - 19968: jis0208<<14 | 0x48<<7 | 0x09,\n\t34217 - 19968: jis0208<<14 | 0x1A<<7 | 0x06,\n\t34218 - 19968: jis0208<<14 | 0x1E<<7 | 0x24,\n\t34219 - 19968: jis0208<<14 | 0x16<<7 | 0x0F,\n\t34220 - 19968: jis0208<<14 | 0x2B<<7 | 0x53,\n\t34221 - 19968: jis0212<<14 | 0x38<<7 | 0x53,\n\t34222 - 19968: jis0208<<14 | 0x2B<<7 | 0x58,\n\t34223 - 19968: jis0208<<14 | 0x1C<<7 | 0x51,\n\t34224 - 19968: jis0208<<14 | 0x5A<<7 | 0x41,\n\t34228 - 19968: jis0212<<14 | 0x38<<7 | 0x46,\n\t34230 - 19968: jis0212<<14 | 0x38<<7 | 0x47,\n\t34231 - 19968: jis0212<<14 | 0x38<<7 | 0x48,\n\t34232 - 19968: jis0212<<14 | 0x38<<7 | 0x49,\n\t34233 - 19968: jis0208<<14 | 0x48<<7 | 0x16,\n\t34234 - 19968: jis0208<<14 | 0x48<<7 | 0x14,\n\t34236 - 19968: jis0212<<14 | 0x38<<7 | 0x4A,\n\t34237 - 19968: jis0212<<14 | 0x38<<7 | 0x4B,\n\t34238 - 19968: jis0212<<14 | 0x38<<7 | 0x4C,\n\t34239 - 19968: jis0212<<14 | 0x38<<7 | 0x4D,\n\t34241 - 19968: jis0208<<14 | 0x2E<<7 | 0x2D,\n\t34242 - 19968: jis0212<<14 | 0x38<<7 | 0x4E,\n\t34247 - 19968: jis0212<<14 | 0x38<<7 | 0x4F,\n\t34249 - 19968: jis0208<<14 | 0x48<<7 | 0x13,\n\t34250 - 19968: jis0212<<14 | 0x38<<7 | 0x50,\n\t34251 - 19968: jis0212<<14 | 0x38<<7 | 0x51,\n\t34253 - 19968: jis0208<<14 | 0x2C<<7 | 0x54,\n\t34254 - 19968: jis0212<<14 | 0x38<<7 | 0x52,\n\t34255 - 19968: jis0208<<14 | 0x48<<7 | 0x15,\n\t34256 - 19968: jis0208<<14 | 0x48<<7 | 0x17,\n\t34261 - 19968: jis0208<<14 | 0x48<<7 | 0x18,\n\t34264 - 19968: jis0212<<14 | 0x38<<7 | 0x54,\n\t34266 - 19968: jis0212<<14 | 0x38<<7 | 0x55,\n\t34268 - 19968: jis0208<<14 | 0x48<<7 | 0x1B,\n\t34269 - 19968: jis0208<<14 | 0x48<<7 | 0x19,\n\t34271 - 19968: jis0212<<14 | 0x38<<7 | 0x56,\n\t34272 - 19968: jis0212<<14 | 0x38<<7 | 0x57,\n\t34276 - 19968: jis0208<<14 | 0x25<<7 | 0x02,\n\t34277 - 19968: jis0208<<14 | 0x48<<7 | 0x1A,\n\t34278 - 19968: jis0212<<14 | 0x38<<7 | 0x58,\n\t34280 - 19968: jis0212<<14 | 0x38<<7 | 0x59,\n\t34281 - 19968: jis0208<<14 | 0x27<<7 | 0x2C,\n\t34282 - 19968: jis0208<<14 | 0x48<<7 | 0x0D,\n\t34285 - 19968: jis0212<<14 | 0x38<<7 | 0x5A,\n\t34291 - 19968: jis0212<<14 | 0x38<<7 | 0x5B,\n\t34294 - 19968: jis0212<<14 | 0x38<<7 | 0x5C,\n\t34295 - 19968: jis0208<<14 | 0x1C<<7 | 0x52,\n\t34297 - 19968: jis0208<<14 | 0x48<<7 | 0x1C,\n\t34298 - 19968: jis0208<<14 | 0x48<<7 | 0x21,\n\t34299 - 19968: jis0208<<14 | 0x20<<7 | 0x53,\n\t34300 - 19968: jis0212<<14 | 0x38<<7 | 0x5D,\n\t34302 - 19968: jis0208<<14 | 0x48<<7 | 0x20,\n\t34303 - 19968: jis0212<<14 | 0x39<<7 | 0x00,\n\t34304 - 19968: jis0212<<14 | 0x39<<7 | 0x01,\n\t34306 - 19968: jis0208<<14 | 0x48<<7 | 0x01,\n\t34308 - 19968: jis0212<<14 | 0x39<<7 | 0x02,\n\t34309 - 19968: jis0212<<14 | 0x39<<7 | 0x03,\n\t34310 - 19968: jis0208<<14 | 0x48<<7 | 0x22,\n\t34311 - 19968: jis0208<<14 | 0x20<<7 | 0x28,\n\t34314 - 19968: jis0208<<14 | 0x48<<7 | 0x1D,\n\t34315 - 19968: jis0208<<14 | 0x48<<7 | 0x1F,\n\t34317 - 19968: jis0212<<14 | 0x39<<7 | 0x04,\n\t34318 - 19968: jis0212<<14 | 0x39<<7 | 0x05,\n\t34320 - 19968: jis0212<<14 | 0x39<<7 | 0x06,\n\t34321 - 19968: jis0212<<14 | 0x39<<7 | 0x07,\n\t34322 - 19968: jis0212<<14 | 0x39<<7 | 0x08,\n\t34323 - 19968: jis0208<<14 | 0x48<<7 | 0x1E,\n\t34326 - 19968: jis0208<<14 | 0x3C<<7 | 0x10,\n\t34327 - 19968: jis0208<<14 | 0x3C<<7 | 0x01,\n\t34328 - 19968: jis0212<<14 | 0x39<<7 | 0x09,\n\t34329 - 19968: jis0212<<14 | 0x39<<7 | 0x0A,\n\t34330 - 19968: jis0208<<14 | 0x48<<7 | 0x24,\n\t34331 - 19968: jis0212<<14 | 0x39<<7 | 0x0B,\n\t34334 - 19968: jis0212<<14 | 0x39<<7 | 0x0C,\n\t34337 - 19968: jis0212<<14 | 0x39<<7 | 0x0D,\n\t34338 - 19968: jis0208<<14 | 0x48<<7 | 0x23,\n\t34343 - 19968: jis0212<<14 | 0x39<<7 | 0x0E,\n\t34345 - 19968: jis0212<<14 | 0x39<<7 | 0x0F,\n\t34349 - 19968: jis0208<<14 | 0x2C<<7 | 0x55,\n\t34351 - 19968: jis0208<<14 | 0x41<<7 | 0x1B,\n\t34352 - 19968: jis0208<<14 | 0x48<<7 | 0x25,\n\t34358 - 19968: jis0212<<14 | 0x39<<7 | 0x10,\n\t34360 - 19968: jis0212<<14 | 0x39<<7 | 0x11,\n\t34362 - 19968: jis0212<<14 | 0x39<<7 | 0x12,\n\t34364 - 19968: jis0212<<14 | 0x39<<7 | 0x13,\n\t34365 - 19968: jis0212<<14 | 0x39<<7 | 0x14,\n\t34367 - 19968: jis0208<<14 | 0x48<<7 | 0x26,\n\t34368 - 19968: jis0212<<14 | 0x39<<7 | 0x15,\n\t34369 - 19968: jis0212<<14 | 0x17<<7 | 0x45,\n\t34370 - 19968: jis0212<<14 | 0x39<<7 | 0x16,\n\t34374 - 19968: jis0212<<14 | 0x39<<7 | 0x17,\n\t34381 - 19968: jis0208<<14 | 0x48<<7 | 0x27,\n\t34382 - 19968: jis0208<<14 | 0x17<<7 | 0x36,\n\t34384 - 19968: jis0208<<14 | 0x14<<7 | 0x33,\n\t34386 - 19968: jis0212<<14 | 0x39<<7 | 0x18,\n\t34387 - 19968: jis0212<<14 | 0x39<<7 | 0x19,\n\t34388 - 19968: jis0208<<14 | 0x48<<7 | 0x29,\n\t34389 - 19968: jis0208<<14 | 0x30<<7 | 0x3C,\n\t34390 - 19968: jis0212<<14 | 0x39<<7 | 0x1A,\n\t34391 - 19968: jis0212<<14 | 0x39<<7 | 0x1B,\n\t34392 - 19968: jis0212<<14 | 0x39<<7 | 0x1C,\n\t34393 - 19968: jis0212<<14 | 0x39<<7 | 0x1D,\n\t34394 - 19968: jis0208<<14 | 0x14<<7 | 0x54,\n\t34396 - 19968: jis0208<<14 | 0x2D<<7 | 0x19,\n\t34397 - 19968: jis0212<<14 | 0x39<<7 | 0x1E,\n\t34398 - 19968: jis0208<<14 | 0x15<<7 | 0x52,\n\t34399 - 19968: jis0208<<14 | 0x48<<7 | 0x2A,\n\t34400 - 19968: jis0212<<14 | 0x39<<7 | 0x1F,\n\t34401 - 19968: jis0212<<14 | 0x39<<7 | 0x20,\n\t34402 - 19968: jis0212<<14 | 0x39<<7 | 0x21,\n\t34403 - 19968: jis0212<<14 | 0x39<<7 | 0x22,\n\t34404 - 19968: jis0212<<14 | 0x39<<7 | 0x23,\n\t34407 - 19968: jis0208<<14 | 0x48<<7 | 0x2B,\n\t34409 - 19968: jis0212<<14 | 0x39<<7 | 0x24,\n\t34411 - 19968: jis0208<<14 | 0x22<<7 | 0x4D,\n\t34412 - 19968: jis0212<<14 | 0x39<<7 | 0x25,\n\t34415 - 19968: jis0212<<14 | 0x39<<7 | 0x26,\n\t34417 - 19968: jis0208<<14 | 0x48<<7 | 0x2C,\n\t34421 - 19968: jis0212<<14 | 0x39<<7 | 0x27,\n\t34422 - 19968: jis0212<<14 | 0x39<<7 | 0x28,\n\t34423 - 19968: jis0212<<14 | 0x39<<7 | 0x29,\n\t34425 - 19968: jis0208<<14 | 0x25<<7 | 0x59,\n\t34426 - 19968: jis0212<<14 | 0x39<<7 | 0x2A,\n\t34427 - 19968: jis0208<<14 | 0x0F<<7 | 0x19,\n\t34440 - 19968: jis0212<<14 | 0x39<<7 | 0x4C,\n\t34442 - 19968: jis0208<<14 | 0x11<<7 | 0x42,\n\t34443 - 19968: jis0208<<14 | 0x48<<7 | 0x31,\n\t34444 - 19968: jis0208<<14 | 0x48<<7 | 0x32,\n\t34445 - 19968: jis0212<<14 | 0x39<<7 | 0x2B,\n\t34449 - 19968: jis0212<<14 | 0x39<<7 | 0x2C,\n\t34451 - 19968: jis0208<<14 | 0x48<<7 | 0x2D,\n\t34453 - 19968: jis0208<<14 | 0x1A<<7 | 0x1C,\n\t34454 - 19968: jis0212<<14 | 0x39<<7 | 0x2D,\n\t34456 - 19968: jis0212<<14 | 0x39<<7 | 0x2E,\n\t34458 - 19968: jis0212<<14 | 0x39<<7 | 0x2F,\n\t34460 - 19968: jis0212<<14 | 0x39<<7 | 0x30,\n\t34465 - 19968: jis0212<<14 | 0x39<<7 | 0x31,\n\t34467 - 19968: jis0208<<14 | 0x48<<7 | 0x2E,\n\t34468 - 19968: jis0208<<14 | 0x26<<7 | 0x21,\n\t34470 - 19968: jis0212<<14 | 0x39<<7 | 0x32,\n\t34471 - 19968: jis0212<<14 | 0x39<<7 | 0x33,\n\t34472 - 19968: jis0212<<14 | 0x39<<7 | 0x34,\n\t34473 - 19968: jis0208<<14 | 0x48<<7 | 0x2F,\n\t34474 - 19968: jis0208<<14 | 0x48<<7 | 0x30,\n\t34475 - 19968: jis0208<<14 | 0x48<<7 | 0x3A,\n\t34477 - 19968: jis0212<<14 | 0x39<<7 | 0x35,\n\t34479 - 19968: jis0208<<14 | 0x48<<7 | 0x34,\n\t34480 - 19968: jis0208<<14 | 0x48<<7 | 0x37,\n\t34481 - 19968: jis0212<<14 | 0x39<<7 | 0x36,\n\t34483 - 19968: jis0212<<14 | 0x39<<7 | 0x37,\n\t34484 - 19968: jis0212<<14 | 0x39<<7 | 0x38,\n\t34485 - 19968: jis0212<<14 | 0x39<<7 | 0x39,\n\t34486 - 19968: jis0208<<14 | 0x48<<7 | 0x33,\n\t34487 - 19968: jis0212<<14 | 0x39<<7 | 0x3A,\n\t34488 - 19968: jis0212<<14 | 0x39<<7 | 0x3B,\n\t34489 - 19968: jis0212<<14 | 0x39<<7 | 0x3C,\n\t34495 - 19968: jis0212<<14 | 0x39<<7 | 0x3D,\n\t34496 - 19968: jis0212<<14 | 0x39<<7 | 0x3E,\n\t34497 - 19968: jis0212<<14 | 0x39<<7 | 0x3F,\n\t34499 - 19968: jis0212<<14 | 0x39<<7 | 0x40,\n\t34500 - 19968: jis0208<<14 | 0x48<<7 | 0x35,\n\t34501 - 19968: jis0212<<14 | 0x39<<7 | 0x41,\n\t34502 - 19968: jis0208<<14 | 0x48<<7 | 0x36,\n\t34503 - 19968: jis0208<<14 | 0x1B<<7 | 0x37,\n\t34505 - 19968: jis0208<<14 | 0x48<<7 | 0x38,\n\t34507 - 19968: jis0208<<14 | 0x22<<7 | 0x20,\n\t34509 - 19968: jis0208<<14 | 0x16<<7 | 0x35,\n\t34510 - 19968: jis0208<<14 | 0x12<<7 | 0x21,\n\t34513 - 19968: jis0212<<14 | 0x39<<7 | 0x42,\n\t34514 - 19968: jis0212<<14 | 0x39<<7 | 0x43,\n\t34516 - 19968: jis0208<<14 | 0x48<<7 | 0x3B,\n\t34517 - 19968: jis0212<<14 | 0x39<<7 | 0x44,\n\t34519 - 19968: jis0212<<14 | 0x39<<7 | 0x45,\n\t34521 - 19968: jis0208<<14 | 0x12<<7 | 0x1E,\n\t34522 - 19968: jis0212<<14 | 0x39<<7 | 0x46,\n\t34523 - 19968: jis0208<<14 | 0x48<<7 | 0x40,\n\t34524 - 19968: jis0212<<14 | 0x39<<7 | 0x47,\n\t34526 - 19968: jis0208<<14 | 0x48<<7 | 0x3C,\n\t34527 - 19968: jis0208<<14 | 0x48<<7 | 0x3F,\n\t34528 - 19968: jis0212<<14 | 0x39<<7 | 0x48,\n\t34531 - 19968: jis0212<<14 | 0x39<<7 | 0x49,\n\t34532 - 19968: jis0208<<14 | 0x27<<7 | 0x19,\n\t34533 - 19968: jis0212<<14 | 0x39<<7 | 0x4A,\n\t34535 - 19968: jis0212<<14 | 0x39<<7 | 0x4B,\n\t34537 - 19968: jis0208<<14 | 0x48<<7 | 0x3D,\n\t34540 - 19968: jis0208<<14 | 0x48<<7 | 0x3E,\n\t34541 - 19968: jis0208<<14 | 0x28<<7 | 0x27,\n\t34542 - 19968: jis0208<<14 | 0x27<<7 | 0x39,\n\t34543 - 19968: jis0208<<14 | 0x48<<7 | 0x41,\n\t34552 - 19968: jis0208<<14 | 0x21<<7 | 0x5C,\n\t34553 - 19968: jis0208<<14 | 0x48<<7 | 0x4B,\n\t34554 - 19968: jis0212<<14 | 0x39<<7 | 0x4D,\n\t34555 - 19968: jis0208<<14 | 0x48<<7 | 0x47,\n\t34556 - 19968: jis0212<<14 | 0x39<<7 | 0x4E,\n\t34557 - 19968: jis0212<<14 | 0x39<<7 | 0x4F,\n\t34558 - 19968: jis0208<<14 | 0x11<<7 | 0x4A,\n\t34560 - 19968: jis0208<<14 | 0x48<<7 | 0x45,\n\t34562 - 19968: jis0208<<14 | 0x2A<<7 | 0x09,\n\t34563 - 19968: jis0208<<14 | 0x48<<7 | 0x46,\n\t34564 - 19968: jis0212<<14 | 0x39<<7 | 0x50,\n\t34565 - 19968: jis0212<<14 | 0x39<<7 | 0x51,\n\t34566 - 19968: jis0208<<14 | 0x48<<7 | 0x43,\n\t34567 - 19968: jis0212<<14 | 0x39<<7 | 0x52,\n\t34568 - 19968: jis0208<<14 | 0x48<<7 | 0x44,\n\t34569 - 19968: jis0208<<14 | 0x48<<7 | 0x49,\n\t34570 - 19968: jis0208<<14 | 0x48<<7 | 0x4C,\n\t34571 - 19968: jis0212<<14 | 0x39<<7 | 0x53,\n\t34573 - 19968: jis0208<<14 | 0x48<<7 | 0x4A,\n\t34574 - 19968: jis0212<<14 | 0x39<<7 | 0x54,\n\t34575 - 19968: jis0212<<14 | 0x39<<7 | 0x55,\n\t34576 - 19968: jis0212<<14 | 0x39<<7 | 0x56,\n\t34577 - 19968: jis0208<<14 | 0x48<<7 | 0x48,\n\t34578 - 19968: jis0208<<14 | 0x48<<7 | 0x42,\n\t34579 - 19968: jis0212<<14 | 0x39<<7 | 0x57,\n\t34580 - 19968: jis0212<<14 | 0x39<<7 | 0x58,\n\t34584 - 19968: jis0208<<14 | 0x22<<7 | 0x37,\n\t34585 - 19968: jis0212<<14 | 0x39<<7 | 0x59,\n\t34586 - 19968: jis0208<<14 | 0x48<<7 | 0x53,\n\t34588 - 19968: jis0208<<14 | 0x2B<<7 | 0x09,\n\t34590 - 19968: jis0212<<14 | 0x39<<7 | 0x5A,\n\t34591 - 19968: jis0212<<14 | 0x39<<7 | 0x5B,\n\t34593 - 19968: jis0212<<14 | 0x39<<7 | 0x5C,\n\t34595 - 19968: jis0212<<14 | 0x39<<7 | 0x5D,\n\t34597 - 19968: jis0208<<14 | 0x48<<7 | 0x51,\n\t34600 - 19968: jis0212<<14 | 0x3A<<7 | 0x00,\n\t34601 - 19968: jis0208<<14 | 0x48<<7 | 0x52,\n\t34606 - 19968: jis0212<<14 | 0x3A<<7 | 0x01,\n\t34607 - 19968: jis0212<<14 | 0x3A<<7 | 0x02,\n\t34609 - 19968: jis0212<<14 | 0x3A<<7 | 0x03,\n\t34610 - 19968: jis0212<<14 | 0x3A<<7 | 0x04,\n\t34612 - 19968: jis0208<<14 | 0x48<<7 | 0x4D,\n\t34615 - 19968: jis0208<<14 | 0x48<<7 | 0x4F,\n\t34617 - 19968: jis0212<<14 | 0x3A<<7 | 0x05,\n\t34618 - 19968: jis0212<<14 | 0x3A<<7 | 0x06,\n\t34619 - 19968: jis0208<<14 | 0x48<<7 | 0x50,\n\t34620 - 19968: jis0212<<14 | 0x3A<<7 | 0x07,\n\t34621 - 19968: jis0212<<14 | 0x3A<<7 | 0x08,\n\t34622 - 19968: jis0212<<14 | 0x3A<<7 | 0x09,\n\t34623 - 19968: jis0208<<14 | 0x48<<7 | 0x4E,\n\t34624 - 19968: jis0212<<14 | 0x3A<<7 | 0x0A,\n\t34627 - 19968: jis0212<<14 | 0x3A<<7 | 0x0B,\n\t34629 - 19968: jis0212<<14 | 0x3A<<7 | 0x0C,\n\t34633 - 19968: jis0208<<14 | 0x1F<<7 | 0x45,\n\t34635 - 19968: jis0208<<14 | 0x2E<<7 | 0x18,\n\t34636 - 19968: jis0208<<14 | 0x48<<7 | 0x57,\n\t34637 - 19968: jis0212<<14 | 0x3A<<7 | 0x0D,\n\t34638 - 19968: jis0208<<14 | 0x48<<7 | 0x58,\n\t34643 - 19968: jis0208<<14 | 0x49<<7 | 0x00,\n\t34645 - 19968: jis0208<<14 | 0x1E<<7 | 0x09,\n\t34647 - 19968: jis0208<<14 | 0x48<<7 | 0x5A,\n\t34648 - 19968: jis0212<<14 | 0x3A<<7 | 0x0E,\n\t34649 - 19968: jis0208<<14 | 0x48<<7 | 0x5D,\n\t34653 - 19968: jis0212<<14 | 0x3A<<7 | 0x0F,\n\t34655 - 19968: jis0208<<14 | 0x48<<7 | 0x55,\n\t34656 - 19968: jis0208<<14 | 0x48<<7 | 0x54,\n\t34657 - 19968: jis0212<<14 | 0x3A<<7 | 0x10,\n\t34659 - 19968: jis0208<<14 | 0x49<<7 | 0x01,\n\t34660 - 19968: jis0212<<14 | 0x3A<<7 | 0x11,\n\t34661 - 19968: jis0212<<14 | 0x3A<<7 | 0x12,\n\t34662 - 19968: jis0208<<14 | 0x11<<7 | 0x3B,\n\t34664 - 19968: jis0208<<14 | 0x48<<7 | 0x5B,\n\t34666 - 19968: jis0208<<14 | 0x49<<7 | 0x02,\n\t34670 - 19968: jis0208<<14 | 0x48<<7 | 0x5C,\n\t34671 - 19968: jis0212<<14 | 0x3A<<7 | 0x13,\n\t34673 - 19968: jis0212<<14 | 0x3A<<7 | 0x14,\n\t34674 - 19968: jis0212<<14 | 0x3A<<7 | 0x15,\n\t34676 - 19968: jis0208<<14 | 0x48<<7 | 0x59,\n\t34678 - 19968: jis0208<<14 | 0x23<<7 | 0x12,\n\t34680 - 19968: jis0208<<14 | 0x48<<7 | 0x56,\n\t34683 - 19968: jis0212<<14 | 0x3A<<7 | 0x16,\n\t34687 - 19968: jis0208<<14 | 0x26<<7 | 0x47,\n\t34690 - 19968: jis0208<<14 | 0x49<<7 | 0x06,\n\t34691 - 19968: jis0212<<14 | 0x3A<<7 | 0x17,\n\t34692 - 19968: jis0212<<14 | 0x3A<<7 | 0x18,\n\t34693 - 19968: jis0212<<14 | 0x3A<<7 | 0x19,\n\t34694 - 19968: jis0212<<14 | 0x3A<<7 | 0x1A,\n\t34695 - 19968: jis0212<<14 | 0x3A<<7 | 0x1B,\n\t34696 - 19968: jis0212<<14 | 0x3A<<7 | 0x1C,\n\t34697 - 19968: jis0212<<14 | 0x3A<<7 | 0x1D,\n\t34699 - 19968: jis0212<<14 | 0x3A<<7 | 0x1E,\n\t34700 - 19968: jis0212<<14 | 0x3A<<7 | 0x1F,\n\t34701 - 19968: jis0208<<14 | 0x2C<<7 | 0x1A,\n\t34704 - 19968: jis0212<<14 | 0x3A<<7 | 0x20,\n\t34707 - 19968: jis0212<<14 | 0x3A<<7 | 0x21,\n\t34709 - 19968: jis0212<<14 | 0x3A<<7 | 0x22,\n\t34711 - 19968: jis0212<<14 | 0x3A<<7 | 0x23,\n\t34712 - 19968: jis0212<<14 | 0x3A<<7 | 0x24,\n\t34713 - 19968: jis0212<<14 | 0x3A<<7 | 0x25,\n\t34718 - 19968: jis0212<<14 | 0x3A<<7 | 0x26,\n\t34719 - 19968: jis0208<<14 | 0x49<<7 | 0x05,\n\t34720 - 19968: jis0212<<14 | 0x3A<<7 | 0x27,\n\t34722 - 19968: jis0208<<14 | 0x49<<7 | 0x04,\n\t34723 - 19968: jis0212<<14 | 0x3A<<7 | 0x28,\n\t34727 - 19968: jis0212<<14 | 0x3A<<7 | 0x29,\n\t34731 - 19968: jis0208<<14 | 0x49<<7 | 0x0D,\n\t34732 - 19968: jis0212<<14 | 0x3A<<7 | 0x2A,\n\t34733 - 19968: jis0212<<14 | 0x3A<<7 | 0x2B,\n\t34734 - 19968: jis0212<<14 | 0x3A<<7 | 0x2C,\n\t34735 - 19968: jis0208<<14 | 0x49<<7 | 0x07,\n\t34737 - 19968: jis0212<<14 | 0x3A<<7 | 0x2D,\n\t34739 - 19968: jis0208<<14 | 0x49<<7 | 0x0F,\n\t34741 - 19968: jis0212<<14 | 0x3A<<7 | 0x2E,\n\t34746 - 19968: jis0208<<14 | 0x2C<<7 | 0x45,\n\t34747 - 19968: jis0208<<14 | 0x49<<7 | 0x12,\n\t34749 - 19968: jis0208<<14 | 0x49<<7 | 0x09,\n\t34750 - 19968: jis0212<<14 | 0x3A<<7 | 0x2F,\n\t34751 - 19968: jis0212<<14 | 0x3A<<7 | 0x30,\n\t34752 - 19968: jis0208<<14 | 0x49<<7 | 0x0A,\n\t34753 - 19968: jis0212<<14 | 0x3A<<7 | 0x31,\n\t34756 - 19968: jis0208<<14 | 0x49<<7 | 0x0E,\n\t34758 - 19968: jis0208<<14 | 0x49<<7 | 0x11,\n\t34759 - 19968: jis0208<<14 | 0x49<<7 | 0x10,\n\t34760 - 19968: jis0212<<14 | 0x3A<<7 | 0x32,\n\t34761 - 19968: jis0212<<14 | 0x3A<<7 | 0x33,\n\t34762 - 19968: jis0212<<14 | 0x3A<<7 | 0x34,\n\t34763 - 19968: jis0208<<14 | 0x49<<7 | 0x08,\n\t34766 - 19968: jis0212<<14 | 0x3A<<7 | 0x35,\n\t34768 - 19968: jis0208<<14 | 0x49<<7 | 0x0B,\n\t34770 - 19968: jis0208<<14 | 0x49<<7 | 0x1C,\n\t34773 - 19968: jis0212<<14 | 0x3A<<7 | 0x36,\n\t34774 - 19968: jis0212<<14 | 0x3A<<7 | 0x37,\n\t34777 - 19968: jis0212<<14 | 0x3A<<7 | 0x38,\n\t34778 - 19968: jis0212<<14 | 0x3A<<7 | 0x39,\n\t34780 - 19968: jis0212<<14 | 0x3A<<7 | 0x3A,\n\t34783 - 19968: jis0212<<14 | 0x3A<<7 | 0x3B,\n\t34784 - 19968: jis0208<<14 | 0x49<<7 | 0x15,\n\t34786 - 19968: jis0212<<14 | 0x3A<<7 | 0x3C,\n\t34787 - 19968: jis0212<<14 | 0x3A<<7 | 0x3D,\n\t34788 - 19968: jis0212<<14 | 0x3A<<7 | 0x3E,\n\t34794 - 19968: jis0212<<14 | 0x3A<<7 | 0x3F,\n\t34795 - 19968: jis0212<<14 | 0x3A<<7 | 0x40,\n\t34797 - 19968: jis0212<<14 | 0x3A<<7 | 0x41,\n\t34799 - 19968: jis0208<<14 | 0x49<<7 | 0x13,\n\t34801 - 19968: jis0212<<14 | 0x3A<<7 | 0x42,\n\t34802 - 19968: jis0208<<14 | 0x49<<7 | 0x14,\n\t34803 - 19968: jis0212<<14 | 0x3A<<7 | 0x43,\n\t34806 - 19968: jis0208<<14 | 0x49<<7 | 0x19,\n\t34807 - 19968: jis0208<<14 | 0x49<<7 | 0x1A,\n\t34808 - 19968: jis0212<<14 | 0x3A<<7 | 0x44,\n\t34809 - 19968: jis0208<<14 | 0x12<<7 | 0x09,\n\t34810 - 19968: jis0212<<14 | 0x3A<<7 | 0x45,\n\t34811 - 19968: jis0208<<14 | 0x14<<7 | 0x21,\n\t34814 - 19968: jis0208<<14 | 0x49<<7 | 0x18,\n\t34815 - 19968: jis0212<<14 | 0x3A<<7 | 0x46,\n\t34817 - 19968: jis0212<<14 | 0x3A<<7 | 0x47,\n\t34819 - 19968: jis0212<<14 | 0x3A<<7 | 0x48,\n\t34821 - 19968: jis0208<<14 | 0x49<<7 | 0x03,\n\t34822 - 19968: jis0212<<14 | 0x3A<<7 | 0x49,\n\t34823 - 19968: jis0208<<14 | 0x5A<<7 | 0x44,\n\t34825 - 19968: jis0212<<14 | 0x3A<<7 | 0x4A,\n\t34826 - 19968: jis0212<<14 | 0x3A<<7 | 0x4B,\n\t34827 - 19968: jis0212<<14 | 0x3A<<7 | 0x4C,\n\t34829 - 19968: jis0208<<14 | 0x49<<7 | 0x17,\n\t34830 - 19968: jis0208<<14 | 0x49<<7 | 0x1B,\n\t34831 - 19968: jis0208<<14 | 0x49<<7 | 0x16,\n\t34832 - 19968: jis0212<<14 | 0x3A<<7 | 0x4D,\n\t34833 - 19968: jis0208<<14 | 0x49<<7 | 0x1D,\n\t34834 - 19968: jis0212<<14 | 0x3A<<7 | 0x4F,\n\t34835 - 19968: jis0212<<14 | 0x3A<<7 | 0x50,\n\t34836 - 19968: jis0212<<14 | 0x3A<<7 | 0x51,\n\t34837 - 19968: jis0208<<14 | 0x49<<7 | 0x1F,\n\t34838 - 19968: jis0208<<14 | 0x49<<7 | 0x1E,\n\t34840 - 19968: jis0212<<14 | 0x3A<<7 | 0x52,\n\t34841 - 19968: jis0212<<14 | 0x3A<<7 | 0x4E,\n\t34842 - 19968: jis0212<<14 | 0x3A<<7 | 0x53,\n\t34843 - 19968: jis0212<<14 | 0x3A<<7 | 0x54,\n\t34844 - 19968: jis0212<<14 | 0x3A<<7 | 0x55,\n\t34846 - 19968: jis0212<<14 | 0x3A<<7 | 0x56,\n\t34847 - 19968: jis0212<<14 | 0x3A<<7 | 0x57,\n\t34849 - 19968: jis0208<<14 | 0x49<<7 | 0x21,\n\t34850 - 19968: jis0208<<14 | 0x49<<7 | 0x20,\n\t34851 - 19968: jis0208<<14 | 0x48<<7 | 0x39,\n\t34855 - 19968: jis0208<<14 | 0x49<<7 | 0x25,\n\t34856 - 19968: jis0212<<14 | 0x3A<<7 | 0x58,\n\t34861 - 19968: jis0212<<14 | 0x3A<<7 | 0x59,\n\t34862 - 19968: jis0212<<14 | 0x3A<<7 | 0x5A,\n\t34864 - 19968: jis0212<<14 | 0x3A<<7 | 0x5B,\n\t34865 - 19968: jis0208<<14 | 0x49<<7 | 0x22,\n\t34866 - 19968: jis0212<<14 | 0x3A<<7 | 0x5C,\n\t34869 - 19968: jis0212<<14 | 0x3A<<7 | 0x5D,\n\t34870 - 19968: jis0208<<14 | 0x49<<7 | 0x23,\n\t34873 - 19968: jis0208<<14 | 0x49<<7 | 0x24,\n\t34874 - 19968: jis0212<<14 | 0x3B<<7 | 0x00,\n\t34875 - 19968: jis0208<<14 | 0x49<<7 | 0x26,\n\t34876 - 19968: jis0212<<14 | 0x3B<<7 | 0x01,\n\t34880 - 19968: jis0208<<14 | 0x16<<7 | 0x4B,\n\t34881 - 19968: jis0212<<14 | 0x3B<<7 | 0x02,\n\t34882 - 19968: jis0208<<14 | 0x49<<7 | 0x28,\n\t34883 - 19968: jis0212<<14 | 0x3B<<7 | 0x03,\n\t34884 - 19968: jis0208<<14 | 0x49<<7 | 0x27,\n\t34885 - 19968: jis0212<<14 | 0x3B<<7 | 0x04,\n\t34886 - 19968: jis0208<<14 | 0x1C<<7 | 0x0F,\n\t34888 - 19968: jis0212<<14 | 0x3B<<7 | 0x05,\n\t34889 - 19968: jis0212<<14 | 0x3B<<7 | 0x06,\n\t34890 - 19968: jis0212<<14 | 0x3B<<7 | 0x07,\n\t34891 - 19968: jis0212<<14 | 0x3B<<7 | 0x08,\n\t34892 - 19968: jis0208<<14 | 0x18<<7 | 0x33,\n\t34893 - 19968: jis0208<<14 | 0x3D<<7 | 0x06,\n\t34894 - 19968: jis0212<<14 | 0x3B<<7 | 0x09,\n\t34897 - 19968: jis0212<<14 | 0x3B<<7 | 0x0A,\n\t34898 - 19968: jis0208<<14 | 0x49<<7 | 0x29,\n\t34899 - 19968: jis0208<<14 | 0x1C<<7 | 0x30,\n\t34901 - 19968: jis0212<<14 | 0x3B<<7 | 0x0B,\n\t34902 - 19968: jis0212<<14 | 0x3B<<7 | 0x0C,\n\t34903 - 19968: jis0208<<14 | 0x12<<7 | 0x18,\n\t34904 - 19968: jis0212<<14 | 0x3B<<7 | 0x0D,\n\t34905 - 19968: jis0208<<14 | 0x49<<7 | 0x2A,\n\t34906 - 19968: jis0212<<14 | 0x3B<<7 | 0x0E,\n\t34907 - 19968: jis0208<<14 | 0x10<<7 | 0x31,\n\t34908 - 19968: jis0212<<14 | 0x3B<<7 | 0x0F,\n\t34909 - 19968: jis0208<<14 | 0x1D<<7 | 0x36,\n\t34910 - 19968: jis0208<<14 | 0x49<<7 | 0x2B,\n\t34911 - 19968: jis0212<<14 | 0x3B<<7 | 0x10,\n\t34912 - 19968: jis0212<<14 | 0x3B<<7 | 0x11,\n\t34913 - 19968: jis0208<<14 | 0x18<<7 | 0x34,\n\t34914 - 19968: jis0208<<14 | 0x49<<7 | 0x2C,\n\t34915 - 19968: jis0208<<14 | 0x0F<<7 | 0x40,\n\t34916 - 19968: jis0212<<14 | 0x3B<<7 | 0x12,\n\t34920 - 19968: jis0208<<14 | 0x28<<7 | 0x1C,\n\t34921 - 19968: jis0212<<14 | 0x3B<<7 | 0x13,\n\t34923 - 19968: jis0208<<14 | 0x49<<7 | 0x2D,\n\t34928 - 19968: jis0208<<14 | 0x1E<<7 | 0x49,\n\t34929 - 19968: jis0212<<14 | 0x3B<<7 | 0x14,\n\t34930 - 19968: jis0208<<14 | 0x49<<7 | 0x34,\n\t34933 - 19968: jis0208<<14 | 0x49<<7 | 0x31,\n\t34935 - 19968: jis0208<<14 | 0x22<<7 | 0x4E,\n\t34937 - 19968: jis0212<<14 | 0x3B<<7 | 0x15,\n\t34939 - 19968: jis0212<<14 | 0x3B<<7 | 0x16,\n\t34941 - 19968: jis0208<<14 | 0x49<<7 | 0x32,\n\t34942 - 19968: jis0208<<14 | 0x49<<7 | 0x2F,\n\t34943 - 19968: jis0208<<14 | 0x15<<7 | 0x3D,\n\t34944 - 19968: jis0212<<14 | 0x3B<<7 | 0x17,\n\t34945 - 19968: jis0208<<14 | 0x49<<7 | 0x2E,\n\t34946 - 19968: jis0208<<14 | 0x49<<7 | 0x35,\n\t34952 - 19968: jis0208<<14 | 0x16<<7 | 0x15,\n\t34955 - 19968: jis0208<<14 | 0x21<<7 | 0x3D,\n\t34957 - 19968: jis0208<<14 | 0x49<<7 | 0x3B,\n\t34962 - 19968: jis0208<<14 | 0x49<<7 | 0x37,\n\t34966 - 19968: jis0208<<14 | 0x21<<7 | 0x14,\n\t34967 - 19968: jis0208<<14 | 0x49<<7 | 0x36,\n\t34968 - 19968: jis0212<<14 | 0x3B<<7 | 0x18,\n\t34969 - 19968: jis0208<<14 | 0x49<<7 | 0x39,\n\t34970 - 19968: jis0212<<14 | 0x3B<<7 | 0x19,\n\t34971 - 19968: jis0212<<14 | 0x3B<<7 | 0x1A,\n\t34972 - 19968: jis0212<<14 | 0x3B<<7 | 0x1B,\n\t34974 - 19968: jis0208<<14 | 0x49<<7 | 0x30,\n\t34975 - 19968: jis0212<<14 | 0x3B<<7 | 0x1C,\n\t34976 - 19968: jis0212<<14 | 0x3B<<7 | 0x1D,\n\t34978 - 19968: jis0208<<14 | 0x49<<7 | 0x3A,\n\t34980 - 19968: jis0208<<14 | 0x49<<7 | 0x3C,\n\t34984 - 19968: jis0212<<14 | 0x3B<<7 | 0x1E,\n\t34986 - 19968: jis0212<<14 | 0x3B<<7 | 0x1F,\n\t34987 - 19968: jis0208<<14 | 0x27<<7 | 0x4E,\n\t34990 - 19968: jis0208<<14 | 0x49<<7 | 0x38,\n\t34992 - 19968: jis0208<<14 | 0x49<<7 | 0x3D,\n\t34993 - 19968: jis0208<<14 | 0x49<<7 | 0x3F,\n\t34996 - 19968: jis0208<<14 | 0x17<<7 | 0x32,\n\t34997 - 19968: jis0208<<14 | 0x49<<7 | 0x33,\n\t34999 - 19968: jis0208<<14 | 0x0F<<7 | 0x20,\n\t35002 - 19968: jis0212<<14 | 0x3B<<7 | 0x20,\n\t35005 - 19968: jis0212<<14 | 0x3B<<7 | 0x21,\n\t35006 - 19968: jis0212<<14 | 0x3B<<7 | 0x22,\n\t35007 - 19968: jis0208<<14 | 0x49<<7 | 0x3E,\n\t35008 - 19968: jis0212<<14 | 0x3B<<7 | 0x23,\n\t35009 - 19968: jis0208<<14 | 0x19<<7 | 0x3A,\n\t35010 - 19968: jis0208<<14 | 0x2D<<7 | 0x55,\n\t35011 - 19968: jis0208<<14 | 0x49<<7 | 0x40,\n\t35012 - 19968: jis0208<<14 | 0x49<<7 | 0x41,\n\t35013 - 19968: jis0208<<14 | 0x20<<7 | 0x54,\n\t35018 - 19968: jis0212<<14 | 0x3B<<7 | 0x24,\n\t35019 - 19968: jis0212<<14 | 0x3B<<7 | 0x25,\n\t35020 - 19968: jis0212<<14 | 0x3B<<7 | 0x26,\n\t35021 - 19968: jis0212<<14 | 0x3B<<7 | 0x27,\n\t35022 - 19968: jis0212<<14 | 0x3B<<7 | 0x28,\n\t35023 - 19968: jis0208<<14 | 0x2D<<7 | 0x01,\n\t35025 - 19968: jis0212<<14 | 0x3B<<7 | 0x29,\n\t35026 - 19968: jis0212<<14 | 0x3B<<7 | 0x2A,\n\t35027 - 19968: jis0212<<14 | 0x3B<<7 | 0x2B,\n\t35028 - 19968: jis0208<<14 | 0x49<<7 | 0x42,\n\t35029 - 19968: jis0208<<14 | 0x2C<<7 | 0x14,\n\t35032 - 19968: jis0208<<14 | 0x49<<7 | 0x43,\n\t35033 - 19968: jis0208<<14 | 0x49<<7 | 0x44,\n\t35035 - 19968: jis0212<<14 | 0x3B<<7 | 0x2C,\n\t35036 - 19968: jis0208<<14 | 0x29<<7 | 0x43,\n\t35037 - 19968: jis0208<<14 | 0x49<<7 | 0x45,\n\t35038 - 19968: jis0212<<14 | 0x3B<<7 | 0x2D,\n\t35039 - 19968: jis0208<<14 | 0x19<<7 | 0x1F,\n\t35041 - 19968: jis0208<<14 | 0x2D<<7 | 0x02,\n\t35047 - 19968: jis0212<<14 | 0x3B<<7 | 0x2E,\n\t35048 - 19968: jis0208<<14 | 0x49<<7 | 0x4A,\n\t35055 - 19968: jis0212<<14 | 0x3B<<7 | 0x2F,\n\t35056 - 19968: jis0212<<14 | 0x3B<<7 | 0x30,\n\t35057 - 19968: jis0212<<14 | 0x3B<<7 | 0x31,\n\t35058 - 19968: jis0208<<14 | 0x49<<7 | 0x4B,\n\t35059 - 19968: jis0208<<14 | 0x1D<<7 | 0x37,\n\t35060 - 19968: jis0208<<14 | 0x49<<7 | 0x49,\n\t35061 - 19968: jis0208<<14 | 0x5A<<7 | 0x45,\n\t35063 - 19968: jis0212<<14 | 0x3B<<7 | 0x33,\n\t35064 - 19968: jis0208<<14 | 0x2C<<7 | 0x46,\n\t35065 - 19968: jis0208<<14 | 0x49<<7 | 0x46,\n\t35068 - 19968: jis0208<<14 | 0x49<<7 | 0x48,\n\t35069 - 19968: jis0208<<14 | 0x1F<<7 | 0x1C,\n\t35070 - 19968: jis0208<<14 | 0x1E<<7 | 0x5D,\n\t35073 - 19968: jis0212<<14 | 0x3B<<7 | 0x34,\n\t35074 - 19968: jis0208<<14 | 0x49<<7 | 0x47,\n\t35076 - 19968: jis0208<<14 | 0x49<<7 | 0x4C,\n\t35078 - 19968: jis0212<<14 | 0x3B<<7 | 0x35,\n\t35079 - 19968: jis0208<<14 | 0x29<<7 | 0x02,\n\t35082 - 19968: jis0208<<14 | 0x49<<7 | 0x4E,\n\t35084 - 19968: jis0208<<14 | 0x49<<7 | 0x4D,\n\t35085 - 19968: jis0212<<14 | 0x3B<<7 | 0x36,\n\t35086 - 19968: jis0212<<14 | 0x3B<<7 | 0x37,\n\t35087 - 19968: jis0212<<14 | 0x3B<<7 | 0x38,\n\t35088 - 19968: jis0208<<14 | 0x12<<7 | 0x4B,\n\t35090 - 19968: jis0208<<14 | 0x2A<<7 | 0x0A,\n\t35091 - 19968: jis0208<<14 | 0x49<<7 | 0x4F,\n\t35093 - 19968: jis0212<<14 | 0x3B<<7 | 0x39,\n\t35094 - 19968: jis0212<<14 | 0x3B<<7 | 0x3A,\n\t35096 - 19968: jis0212<<14 | 0x3B<<7 | 0x3B,\n\t35097 - 19968: jis0212<<14 | 0x3B<<7 | 0x3C,\n\t35098 - 19968: jis0212<<14 | 0x3B<<7 | 0x3D,\n\t35100 - 19968: jis0208<<14 | 0x58<<7 | 0x01,\n\t35101 - 19968: jis0208<<14 | 0x49<<7 | 0x5B,\n\t35102 - 19968: jis0208<<14 | 0x49<<7 | 0x51,\n\t35104 - 19968: jis0212<<14 | 0x3B<<7 | 0x3F,\n\t35109 - 19968: jis0208<<14 | 0x49<<7 | 0x52,\n\t35110 - 19968: jis0212<<14 | 0x3B<<7 | 0x40,\n\t35111 - 19968: jis0212<<14 | 0x3B<<7 | 0x41,\n\t35112 - 19968: jis0212<<14 | 0x3B<<7 | 0x42,\n\t35114 - 19968: jis0208<<14 | 0x49<<7 | 0x53,\n\t35115 - 19968: jis0208<<14 | 0x49<<7 | 0x54,\n\t35120 - 19968: jis0212<<14 | 0x3B<<7 | 0x43,\n\t35121 - 19968: jis0212<<14 | 0x3B<<7 | 0x44,\n\t35122 - 19968: jis0212<<14 | 0x3B<<7 | 0x45,\n\t35125 - 19968: jis0212<<14 | 0x3B<<7 | 0x46,\n\t35126 - 19968: jis0208<<14 | 0x49<<7 | 0x58,\n\t35128 - 19968: jis0208<<14 | 0x49<<7 | 0x59,\n\t35129 - 19968: jis0212<<14 | 0x3B<<7 | 0x47,\n\t35130 - 19968: jis0212<<14 | 0x3B<<7 | 0x48,\n\t35131 - 19968: jis0208<<14 | 0x49<<7 | 0x57,\n\t35134 - 19968: jis0212<<14 | 0x3B<<7 | 0x49,\n\t35136 - 19968: jis0212<<14 | 0x3B<<7 | 0x4A,\n\t35137 - 19968: jis0208<<14 | 0x49<<7 | 0x55,\n\t35138 - 19968: jis0212<<14 | 0x3B<<7 | 0x4B,\n\t35139 - 19968: jis0208<<14 | 0x49<<7 | 0x50,\n\t35140 - 19968: jis0208<<14 | 0x49<<7 | 0x56,\n\t35141 - 19968: jis0212<<14 | 0x3B<<7 | 0x4C,\n\t35142 - 19968: jis0212<<14 | 0x3B<<7 | 0x4D,\n\t35145 - 19968: jis0212<<14 | 0x3B<<7 | 0x4E,\n\t35148 - 19968: jis0208<<14 | 0x49<<7 | 0x5A,\n\t35149 - 19968: jis0208<<14 | 0x4F<<7 | 0x16,\n\t35151 - 19968: jis0212<<14 | 0x3B<<7 | 0x4F,\n\t35154 - 19968: jis0212<<14 | 0x3B<<7 | 0x50,\n\t35158 - 19968: jis0208<<14 | 0x11<<7 | 0x07,\n\t35159 - 19968: jis0212<<14 | 0x3B<<7 | 0x51,\n\t35162 - 19968: jis0212<<14 | 0x3B<<7 | 0x52,\n\t35163 - 19968: jis0212<<14 | 0x3B<<7 | 0x53,\n\t35164 - 19968: jis0212<<14 | 0x3B<<7 | 0x54,\n\t35166 - 19968: jis0208<<14 | 0x49<<7 | 0x5D,\n\t35167 - 19968: jis0208<<14 | 0x15<<7 | 0x3E,\n\t35168 - 19968: jis0208<<14 | 0x49<<7 | 0x5C,\n\t35169 - 19968: jis0212<<14 | 0x3B<<7 | 0x55,\n\t35170 - 19968: jis0212<<14 | 0x3B<<7 | 0x56,\n\t35171 - 19968: jis0212<<14 | 0x3B<<7 | 0x57,\n\t35172 - 19968: jis0208<<14 | 0x4A<<7 | 0x01,\n\t35174 - 19968: jis0208<<14 | 0x4A<<7 | 0x00,\n\t35178 - 19968: jis0208<<14 | 0x4A<<7 | 0x03,\n\t35179 - 19968: jis0212<<14 | 0x3B<<7 | 0x58,\n\t35181 - 19968: jis0208<<14 | 0x4A<<7 | 0x02,\n\t35182 - 19968: jis0212<<14 | 0x3B<<7 | 0x59,\n\t35183 - 19968: jis0208<<14 | 0x4A<<7 | 0x04,\n\t35184 - 19968: jis0212<<14 | 0x3B<<7 | 0x5A,\n\t35186 - 19968: jis0208<<14 | 0x1C<<7 | 0x10,\n\t35187 - 19968: jis0212<<14 | 0x3B<<7 | 0x5B,\n\t35188 - 19968: jis0208<<14 | 0x4A<<7 | 0x05,\n\t35189 - 19968: jis0212<<14 | 0x3B<<7 | 0x5C,\n\t35191 - 19968: jis0208<<14 | 0x4A<<7 | 0x06,\n\t35194 - 19968: jis0212<<14 | 0x3B<<7 | 0x5D,\n\t35195 - 19968: jis0212<<14 | 0x3C<<7 | 0x00,\n\t35196 - 19968: jis0212<<14 | 0x3C<<7 | 0x01,\n\t35197 - 19968: jis0212<<14 | 0x3C<<7 | 0x02,\n\t35198 - 19968: jis0208<<14 | 0x4A<<7 | 0x07,\n\t35199 - 19968: jis0208<<14 | 0x1F<<7 | 0x1D,\n\t35201 - 19968: jis0208<<14 | 0x2C<<7 | 0x36,\n\t35203 - 19968: jis0208<<14 | 0x4A<<7 | 0x08,\n\t35206 - 19968: jis0208<<14 | 0x29<<7 | 0x03,\n\t35207 - 19968: jis0208<<14 | 0x26<<7 | 0x25,\n\t35208 - 19968: jis0208<<14 | 0x4A<<7 | 0x09,\n\t35209 - 19968: jis0212<<14 | 0x3C<<7 | 0x03,\n\t35210 - 19968: jis0208<<14 | 0x4A<<7 | 0x0A,\n\t35211 - 19968: jis0208<<14 | 0x17<<7 | 0x0A,\n\t35213 - 19968: jis0212<<14 | 0x3C<<7 | 0x04,\n\t35215 - 19968: jis0208<<14 | 0x14<<7 | 0x0B,\n\t35216 - 19968: jis0212<<14 | 0x3C<<7 | 0x05,\n\t35219 - 19968: jis0208<<14 | 0x4A<<7 | 0x0B,\n\t35220 - 19968: jis0212<<14 | 0x3C<<7 | 0x06,\n\t35221 - 19968: jis0212<<14 | 0x3C<<7 | 0x07,\n\t35222 - 19968: jis0208<<14 | 0x1A<<7 | 0x4A,\n\t35223 - 19968: jis0208<<14 | 0x26<<7 | 0x20,\n\t35224 - 19968: jis0208<<14 | 0x4A<<7 | 0x0C,\n\t35226 - 19968: jis0208<<14 | 0x12<<7 | 0x2F,\n\t35227 - 19968: jis0212<<14 | 0x3C<<7 | 0x08,\n\t35228 - 19968: jis0212<<14 | 0x3C<<7 | 0x09,\n\t35231 - 19968: jis0212<<14 | 0x3C<<7 | 0x0A,\n\t35232 - 19968: jis0212<<14 | 0x3C<<7 | 0x0B,\n\t35233 - 19968: jis0208<<14 | 0x4A<<7 | 0x0D,\n\t35237 - 19968: jis0212<<14 | 0x3C<<7 | 0x0C,\n\t35238 - 19968: jis0208<<14 | 0x4A<<7 | 0x0F,\n\t35239 - 19968: jis0208<<14 | 0x2C<<7 | 0x56,\n\t35241 - 19968: jis0208<<14 | 0x4A<<7 | 0x0E,\n\t35242 - 19968: jis0208<<14 | 0x1E<<7 | 0x25,\n\t35244 - 19968: jis0208<<14 | 0x4A<<7 | 0x10,\n\t35247 - 19968: jis0208<<14 | 0x4A<<7 | 0x11,\n\t35248 - 19968: jis0212<<14 | 0x3C<<7 | 0x0D,\n\t35250 - 19968: jis0208<<14 | 0x4A<<7 | 0x12,\n\t35251 - 19968: jis0208<<14 | 0x13<<7 | 0x30,\n\t35252 - 19968: jis0212<<14 | 0x3C<<7 | 0x0E,\n\t35253 - 19968: jis0212<<14 | 0x3C<<7 | 0x0F,\n\t35254 - 19968: jis0212<<14 | 0x3C<<7 | 0x10,\n\t35255 - 19968: jis0212<<14 | 0x3C<<7 | 0x11,\n\t35258 - 19968: jis0208<<14 | 0x4A<<7 | 0x13,\n\t35260 - 19968: jis0212<<14 | 0x3C<<7 | 0x12,\n\t35261 - 19968: jis0208<<14 | 0x4A<<7 | 0x14,\n\t35263 - 19968: jis0208<<14 | 0x4A<<7 | 0x15,\n\t35264 - 19968: jis0208<<14 | 0x4A<<7 | 0x16,\n\t35282 - 19968: jis0208<<14 | 0x12<<7 | 0x30,\n\t35284 - 19968: jis0212<<14 | 0x3C<<7 | 0x13,\n\t35285 - 19968: jis0212<<14 | 0x3C<<7 | 0x14,\n\t35286 - 19968: jis0212<<14 | 0x3C<<7 | 0x15,\n\t35287 - 19968: jis0212<<14 | 0x3C<<7 | 0x16,\n\t35288 - 19968: jis0212<<14 | 0x3C<<7 | 0x17,\n\t35290 - 19968: jis0208<<14 | 0x4A<<7 | 0x17,\n\t35292 - 19968: jis0208<<14 | 0x4A<<7 | 0x18,\n\t35293 - 19968: jis0208<<14 | 0x4A<<7 | 0x19,\n\t35299 - 19968: jis0208<<14 | 0x11<<7 | 0x51,\n\t35301 - 19968: jis0212<<14 | 0x3C<<7 | 0x18,\n\t35302 - 19968: jis0208<<14 | 0x1E<<7 | 0x07,\n\t35303 - 19968: jis0208<<14 | 0x4A<<7 | 0x1A,\n\t35305 - 19968: jis0212<<14 | 0x3C<<7 | 0x19,\n\t35307 - 19968: jis0212<<14 | 0x3C<<7 | 0x1A,\n\t35309 - 19968: jis0212<<14 | 0x3C<<7 | 0x1B,\n\t35313 - 19968: jis0212<<14 | 0x3C<<7 | 0x1C,\n\t35315 - 19968: jis0212<<14 | 0x3C<<7 | 0x1D,\n\t35316 - 19968: jis0208<<14 | 0x4A<<7 | 0x1B,\n\t35318 - 19968: jis0212<<14 | 0x3C<<7 | 0x1E,\n\t35320 - 19968: jis0208<<14 | 0x4A<<7 | 0x1C,\n\t35321 - 19968: jis0212<<14 | 0x3C<<7 | 0x1F,\n\t35325 - 19968: jis0212<<14 | 0x3C<<7 | 0x20,\n\t35327 - 19968: jis0212<<14 | 0x3C<<7 | 0x21,\n\t35328 - 19968: jis0208<<14 | 0x17<<7 | 0x1F,\n\t35330 - 19968: jis0208<<14 | 0x23<<7 | 0x5A,\n\t35331 - 19968: jis0208<<14 | 0x4A<<7 | 0x1D,\n\t35332 - 19968: jis0212<<14 | 0x3C<<7 | 0x22,\n\t35333 - 19968: jis0212<<14 | 0x3C<<7 | 0x23,\n\t35335 - 19968: jis0212<<14 | 0x3C<<7 | 0x24,\n\t35336 - 19968: jis0208<<14 | 0x16<<7 | 0x36,\n\t35338 - 19968: jis0208<<14 | 0x1E<<7 | 0x35,\n\t35340 - 19968: jis0208<<14 | 0x4A<<7 | 0x20,\n\t35342 - 19968: jis0208<<14 | 0x25<<7 | 0x03,\n\t35343 - 19968: jis0212<<14 | 0x3C<<7 | 0x25,\n\t35344 - 19968: jis0208<<14 | 0x4A<<7 | 0x1F,\n\t35345 - 19968: jis0212<<14 | 0x3C<<7 | 0x26,\n\t35346 - 19968: jis0208<<14 | 0x5A<<7 | 0x46,\n\t35347 - 19968: jis0208<<14 | 0x16<<7 | 0x10,\n\t35348 - 19968: jis0212<<14 | 0x3C<<7 | 0x28,\n\t35349 - 19968: jis0212<<14 | 0x3C<<7 | 0x29,\n\t35350 - 19968: jis0208<<14 | 0x4A<<7 | 0x1E,\n\t35351 - 19968: jis0208<<14 | 0x21<<7 | 0x56,\n\t35352 - 19968: jis0208<<14 | 0x14<<7 | 0x0C,\n\t35355 - 19968: jis0208<<14 | 0x4A<<7 | 0x21,\n\t35357 - 19968: jis0208<<14 | 0x4A<<7 | 0x22,\n\t35358 - 19968: jis0212<<14 | 0x3C<<7 | 0x2A,\n\t35359 - 19968: jis0208<<14 | 0x1D<<7 | 0x38,\n\t35360 - 19968: jis0212<<14 | 0x3C<<7 | 0x2B,\n\t35362 - 19968: jis0212<<14 | 0x3C<<7 | 0x2C,\n\t35363 - 19968: jis0208<<14 | 0x16<<7 | 0x4C,\n\t35364 - 19968: jis0212<<14 | 0x3C<<7 | 0x2D,\n\t35365 - 19968: jis0208<<14 | 0x4A<<7 | 0x23,\n\t35366 - 19968: jis0212<<14 | 0x3C<<7 | 0x2E,\n\t35370 - 19968: jis0208<<14 | 0x2A<<7 | 0x0B,\n\t35371 - 19968: jis0212<<14 | 0x3C<<7 | 0x2F,\n\t35372 - 19968: jis0212<<14 | 0x3C<<7 | 0x30,\n\t35373 - 19968: jis0208<<14 | 0x1F<<7 | 0x3E,\n\t35375 - 19968: jis0212<<14 | 0x3C<<7 | 0x31,\n\t35377 - 19968: jis0208<<14 | 0x14<<7 | 0x55,\n\t35379 - 19968: jis0208<<14 | 0x2B<<7 | 0x54,\n\t35380 - 19968: jis0208<<14 | 0x20<<7 | 0x29,\n\t35381 - 19968: jis0212<<14 | 0x3C<<7 | 0x32,\n\t35382 - 19968: jis0208<<14 | 0x4A<<7 | 0x24,\n\t35383 - 19968: jis0208<<14 | 0x5A<<7 | 0x47,\n\t35386 - 19968: jis0208<<14 | 0x1E<<7 | 0x26,\n\t35387 - 19968: jis0208<<14 | 0x22<<7 | 0x4F,\n\t35388 - 19968: jis0208<<14 | 0x1D<<7 | 0x39,\n\t35389 - 19968: jis0212<<14 | 0x3C<<7 | 0x34,\n\t35390 - 19968: jis0212<<14 | 0x3C<<7 | 0x35,\n\t35392 - 19968: jis0212<<14 | 0x3C<<7 | 0x36,\n\t35393 - 19968: jis0208<<14 | 0x4A<<7 | 0x25,\n\t35395 - 19968: jis0212<<14 | 0x3C<<7 | 0x37,\n\t35397 - 19968: jis0212<<14 | 0x3C<<7 | 0x38,\n\t35398 - 19968: jis0208<<14 | 0x4A<<7 | 0x28,\n\t35399 - 19968: jis0212<<14 | 0x3C<<7 | 0x39,\n\t35400 - 19968: jis0208<<14 | 0x4A<<7 | 0x29,\n\t35401 - 19968: jis0212<<14 | 0x3C<<7 | 0x3A,\n\t35405 - 19968: jis0212<<14 | 0x3C<<7 | 0x3B,\n\t35406 - 19968: jis0212<<14 | 0x3C<<7 | 0x3C,\n\t35408 - 19968: jis0208<<14 | 0x19<<7 | 0x1D,\n\t35409 - 19968: jis0208<<14 | 0x21<<7 | 0x21,\n\t35410 - 19968: jis0208<<14 | 0x4A<<7 | 0x27,\n\t35411 - 19968: jis0212<<14 | 0x3C<<7 | 0x3D,\n\t35412 - 19968: jis0208<<14 | 0x1D<<7 | 0x3A,\n\t35413 - 19968: jis0208<<14 | 0x28<<7 | 0x1D,\n\t35414 - 19968: jis0212<<14 | 0x3C<<7 | 0x3E,\n\t35415 - 19968: jis0212<<14 | 0x3C<<7 | 0x3F,\n\t35416 - 19968: jis0212<<14 | 0x3C<<7 | 0x40,\n\t35419 - 19968: jis0208<<14 | 0x4A<<7 | 0x26,\n\t35420 - 19968: jis0212<<14 | 0x3C<<7 | 0x41,\n\t35421 - 19968: jis0212<<14 | 0x3C<<7 | 0x42,\n\t35422 - 19968: jis0208<<14 | 0x1A<<7 | 0x4B,\n\t35424 - 19968: jis0208<<14 | 0x10<<7 | 0x32,\n\t35425 - 19968: jis0212<<14 | 0x3C<<7 | 0x43,\n\t35426 - 19968: jis0208<<14 | 0x4A<<7 | 0x2D,\n\t35427 - 19968: jis0208<<14 | 0x16<<7 | 0x37,\n\t35429 - 19968: jis0212<<14 | 0x3C<<7 | 0x44,\n\t35430 - 19968: jis0208<<14 | 0x1A<<7 | 0x4D,\n\t35431 - 19968: jis0212<<14 | 0x3C<<7 | 0x45,\n\t35433 - 19968: jis0208<<14 | 0x1A<<7 | 0x4C,\n\t35435 - 19968: jis0208<<14 | 0x2E<<7 | 0x2C,\n\t35436 - 19968: jis0208<<14 | 0x4A<<7 | 0x2C,\n\t35437 - 19968: jis0208<<14 | 0x4A<<7 | 0x2B,\n\t35438 - 19968: jis0208<<14 | 0x20<<7 | 0x06,\n\t35440 - 19968: jis0208<<14 | 0x14<<7 | 0x2C,\n\t35441 - 19968: jis0208<<14 | 0x2E<<7 | 0x22,\n\t35442 - 19968: jis0208<<14 | 0x12<<7 | 0x19,\n\t35443 - 19968: jis0208<<14 | 0x1D<<7 | 0x3B,\n\t35445 - 19968: jis0212<<14 | 0x3C<<7 | 0x46,\n\t35446 - 19968: jis0212<<14 | 0x3C<<7 | 0x47,\n\t35447 - 19968: jis0212<<14 | 0x3C<<7 | 0x48,\n\t35449 - 19968: jis0208<<14 | 0x5A<<7 | 0x48,\n\t35450 - 19968: jis0212<<14 | 0x3C<<7 | 0x4A,\n\t35451 - 19968: jis0212<<14 | 0x3C<<7 | 0x4B,\n\t35452 - 19968: jis0208<<14 | 0x4A<<7 | 0x2A,\n\t35454 - 19968: jis0212<<14 | 0x3C<<7 | 0x4C,\n\t35455 - 19968: jis0212<<14 | 0x3C<<7 | 0x4D,\n\t35456 - 19968: jis0212<<14 | 0x3C<<7 | 0x4E,\n\t35458 - 19968: jis0208<<14 | 0x4A<<7 | 0x2F,\n\t35459 - 19968: jis0212<<14 | 0x3C<<7 | 0x4F,\n\t35460 - 19968: jis0208<<14 | 0x4A<<7 | 0x30,\n\t35461 - 19968: jis0208<<14 | 0x4A<<7 | 0x2E,\n\t35462 - 19968: jis0212<<14 | 0x3C<<7 | 0x50,\n\t35463 - 19968: jis0208<<14 | 0x17<<7 | 0x37,\n\t35465 - 19968: jis0208<<14 | 0x2C<<7 | 0x1F,\n\t35467 - 19968: jis0212<<14 | 0x3C<<7 | 0x51,\n\t35468 - 19968: jis0208<<14 | 0x1A<<7 | 0x4E,\n\t35469 - 19968: jis0208<<14 | 0x26<<7 | 0x06,\n\t35471 - 19968: jis0212<<14 | 0x3C<<7 | 0x52,\n\t35472 - 19968: jis0212<<14 | 0x3C<<7 | 0x53,\n\t35473 - 19968: jis0208<<14 | 0x4A<<7 | 0x33,\n\t35474 - 19968: jis0212<<14 | 0x3C<<7 | 0x54,\n\t35475 - 19968: jis0208<<14 | 0x1F<<7 | 0x1F,\n\t35477 - 19968: jis0208<<14 | 0x22<<7 | 0x21,\n\t35478 - 19968: jis0212<<14 | 0x3C<<7 | 0x55,\n\t35479 - 19968: jis0212<<14 | 0x3C<<7 | 0x56,\n\t35480 - 19968: jis0208<<14 | 0x2C<<7 | 0x15,\n\t35481 - 19968: jis0212<<14 | 0x3C<<7 | 0x57,\n\t35482 - 19968: jis0208<<14 | 0x4A<<7 | 0x36,\n\t35486 - 19968: jis0208<<14 | 0x17<<7 | 0x4B,\n\t35487 - 19968: jis0212<<14 | 0x3C<<7 | 0x58,\n\t35488 - 19968: jis0208<<14 | 0x1F<<7 | 0x1E,\n\t35489 - 19968: jis0208<<14 | 0x4A<<7 | 0x32,\n\t35491 - 19968: jis0208<<14 | 0x4A<<7 | 0x37,\n\t35492 - 19968: jis0208<<14 | 0x17<<7 | 0x4C,\n\t35493 - 19968: jis0208<<14 | 0x4A<<7 | 0x34,\n\t35494 - 19968: jis0208<<14 | 0x4A<<7 | 0x35,\n\t35495 - 19968: jis0208<<14 | 0x5A<<7 | 0x49,\n\t35496 - 19968: jis0208<<14 | 0x4A<<7 | 0x31,\n\t35497 - 19968: jis0212<<14 | 0x3C<<7 | 0x5A,\n\t35500 - 19968: jis0208<<14 | 0x1F<<7 | 0x41,\n\t35501 - 19968: jis0208<<14 | 0x25<<7 | 0x28,\n\t35502 - 19968: jis0212<<14 | 0x3C<<7 | 0x5B,\n\t35503 - 19968: jis0212<<14 | 0x3C<<7 | 0x5C,\n\t35504 - 19968: jis0208<<14 | 0x22<<7 | 0x0E,\n\t35506 - 19968: jis0208<<14 | 0x11<<7 | 0x3C,\n\t35507 - 19968: jis0212<<14 | 0x3C<<7 | 0x5D,\n\t35510 - 19968: jis0212<<14 | 0x3D<<7 | 0x00,\n\t35511 - 19968: jis0212<<14 | 0x3D<<7 | 0x01,\n\t35513 - 19968: jis0208<<14 | 0x27<<7 | 0x4F,\n\t35515 - 19968: jis0212<<14 | 0x3D<<7 | 0x02,\n\t35516 - 19968: jis0208<<14 | 0x14<<7 | 0x22,\n\t35518 - 19968: jis0208<<14 | 0x5A<<7 | 0x4A,\n\t35519 - 19968: jis0208<<14 | 0x23<<7 | 0x13,\n\t35522 - 19968: jis0208<<14 | 0x4A<<7 | 0x3A,\n\t35523 - 19968: jis0212<<14 | 0x3D<<7 | 0x04,\n\t35524 - 19968: jis0208<<14 | 0x4A<<7 | 0x38,\n\t35526 - 19968: jis0212<<14 | 0x3D<<7 | 0x05,\n\t35527 - 19968: jis0208<<14 | 0x22<<7 | 0x2B,\n\t35528 - 19968: jis0212<<14 | 0x3D<<7 | 0x06,\n\t35529 - 19968: jis0212<<14 | 0x3D<<7 | 0x07,\n\t35530 - 19968: jis0212<<14 | 0x3D<<7 | 0x08,\n\t35531 - 19968: jis0208<<14 | 0x1F<<7 | 0x20,\n\t35532 - 19968: jis0208<<14 | 0x13<<7 | 0x31,\n\t35533 - 19968: jis0208<<14 | 0x4A<<7 | 0x39,\n\t35535 - 19968: jis0208<<14 | 0x1E<<7 | 0x3A,\n\t35537 - 19968: jis0212<<14 | 0x3D<<7 | 0x09,\n\t35538 - 19968: jis0208<<14 | 0x2D<<7 | 0x29,\n\t35539 - 19968: jis0212<<14 | 0x3D<<7 | 0x0A,\n\t35540 - 19968: jis0212<<14 | 0x3D<<7 | 0x0B,\n\t35541 - 19968: jis0212<<14 | 0x3D<<7 | 0x0C,\n\t35542 - 19968: jis0208<<14 | 0x2E<<7 | 0x1F,\n\t35543 - 19968: jis0212<<14 | 0x3D<<7 | 0x0D,\n\t35546 - 19968: jis0208<<14 | 0x4A<<7 | 0x3B,\n\t35547 - 19968: jis0208<<14 | 0x4A<<7 | 0x46,\n\t35548 - 19968: jis0208<<14 | 0x23<<7 | 0x14,\n\t35549 - 19968: jis0212<<14 | 0x3D<<7 | 0x0E,\n\t35550 - 19968: jis0208<<14 | 0x4A<<7 | 0x45,\n\t35551 - 19968: jis0208<<14 | 0x5A<<7 | 0x4B,\n\t35552 - 19968: jis0208<<14 | 0x4A<<7 | 0x42,\n\t35553 - 19968: jis0208<<14 | 0x4A<<7 | 0x4A,\n\t35554 - 19968: jis0208<<14 | 0x4A<<7 | 0x43,\n\t35556 - 19968: jis0208<<14 | 0x4A<<7 | 0x3F,\n\t35558 - 19968: jis0208<<14 | 0x23<<7 | 0x5B,\n\t35559 - 19968: jis0208<<14 | 0x4A<<7 | 0x3E,\n\t35563 - 19968: jis0208<<14 | 0x4A<<7 | 0x3C,\n\t35564 - 19968: jis0212<<14 | 0x3D<<7 | 0x10,\n\t35565 - 19968: jis0208<<14 | 0x2C<<7 | 0x00,\n\t35566 - 19968: jis0208<<14 | 0x1A<<7 | 0x4F,\n\t35568 - 19968: jis0212<<14 | 0x3D<<7 | 0x11,\n\t35569 - 19968: jis0208<<14 | 0x4A<<7 | 0x40,\n\t35571 - 19968: jis0208<<14 | 0x4A<<7 | 0x3D,\n\t35572 - 19968: jis0212<<14 | 0x3D<<7 | 0x12,\n\t35573 - 19968: jis0212<<14 | 0x3D<<7 | 0x13,\n\t35574 - 19968: jis0208<<14 | 0x5A<<7 | 0x4D,\n\t35575 - 19968: jis0208<<14 | 0x4A<<7 | 0x44,\n\t35576 - 19968: jis0208<<14 | 0x1C<<7 | 0x53,\n\t35578 - 19968: jis0208<<14 | 0x17<<7 | 0x20,\n\t35580 - 19968: jis0212<<14 | 0x3D<<7 | 0x15,\n\t35582 - 19968: jis0208<<14 | 0x21<<7 | 0x59,\n\t35583 - 19968: jis0212<<14 | 0x3D<<7 | 0x16,\n\t35584 - 19968: jis0208<<14 | 0x2A<<7 | 0x24,\n\t35585 - 19968: jis0208<<14 | 0x10<<7 | 0x39,\n\t35586 - 19968: jis0208<<14 | 0x0F<<7 | 0x41,\n\t35588 - 19968: jis0208<<14 | 0x25<<7 | 0x04,\n\t35589 - 19968: jis0212<<14 | 0x3D<<7 | 0x17,\n\t35590 - 19968: jis0212<<14 | 0x3D<<7 | 0x18,\n\t35591 - 19968: jis0208<<14 | 0x4A<<7 | 0x48,\n\t35594 - 19968: jis0212<<14 | 0x3D<<7 | 0x1E,\n\t35595 - 19968: jis0212<<14 | 0x3D<<7 | 0x19,\n\t35596 - 19968: jis0208<<14 | 0x4A<<7 | 0x47,\n\t35598 - 19968: jis0208<<14 | 0x25<<7 | 0x45,\n\t35600 - 19968: jis0208<<14 | 0x4A<<7 | 0x4C,\n\t35601 - 19968: jis0212<<14 | 0x3D<<7 | 0x1A,\n\t35604 - 19968: jis0208<<14 | 0x4A<<7 | 0x41,\n\t35606 - 19968: jis0208<<14 | 0x4A<<7 | 0x4B,\n\t35607 - 19968: jis0208<<14 | 0x4A<<7 | 0x4D,\n\t35609 - 19968: jis0208<<14 | 0x17<<7 | 0x0B,\n\t35610 - 19968: jis0208<<14 | 0x4A<<7 | 0x49,\n\t35611 - 19968: jis0208<<14 | 0x18<<7 | 0x35,\n\t35612 - 19968: jis0212<<14 | 0x3D<<7 | 0x1B,\n\t35613 - 19968: jis0208<<14 | 0x1B<<7 | 0x34,\n\t35614 - 19968: jis0212<<14 | 0x3D<<7 | 0x1C,\n\t35615 - 19968: jis0212<<14 | 0x3D<<7 | 0x1D,\n\t35616 - 19968: jis0208<<14 | 0x4A<<7 | 0x4E,\n\t35617 - 19968: jis0208<<14 | 0x2C<<7 | 0x37,\n\t35622 - 19968: jis0208<<14 | 0x4A<<7 | 0x51,\n\t35624 - 19968: jis0208<<14 | 0x4A<<7 | 0x54,\n\t35627 - 19968: jis0208<<14 | 0x4A<<7 | 0x52,\n\t35628 - 19968: jis0208<<14 | 0x28<<7 | 0x14,\n\t35629 - 19968: jis0212<<14 | 0x3D<<7 | 0x1F,\n\t35632 - 19968: jis0212<<14 | 0x3D<<7 | 0x20,\n\t35635 - 19968: jis0208<<14 | 0x4A<<7 | 0x4F,\n\t35639 - 19968: jis0212<<14 | 0x3D<<7 | 0x21,\n\t35641 - 19968: jis0208<<14 | 0x15<<7 | 0x3F,\n\t35644 - 19968: jis0212<<14 | 0x3D<<7 | 0x22,\n\t35646 - 19968: jis0208<<14 | 0x4A<<7 | 0x53,\n\t35649 - 19968: jis0208<<14 | 0x4A<<7 | 0x55,\n\t35650 - 19968: jis0212<<14 | 0x3D<<7 | 0x23,\n\t35651 - 19968: jis0212<<14 | 0x3D<<7 | 0x24,\n\t35652 - 19968: jis0212<<14 | 0x3D<<7 | 0x25,\n\t35653 - 19968: jis0212<<14 | 0x3D<<7 | 0x26,\n\t35654 - 19968: jis0212<<14 | 0x3D<<7 | 0x27,\n\t35656 - 19968: jis0212<<14 | 0x3D<<7 | 0x28,\n\t35657 - 19968: jis0208<<14 | 0x4A<<7 | 0x59,\n\t35660 - 19968: jis0208<<14 | 0x4A<<7 | 0x56,\n\t35661 - 19968: jis0212<<14 | 0x3D<<7 | 0x2D,\n\t35662 - 19968: jis0208<<14 | 0x4A<<7 | 0x58,\n\t35663 - 19968: jis0208<<14 | 0x4A<<7 | 0x57,\n\t35666 - 19968: jis0212<<14 | 0x3D<<7 | 0x29,\n\t35667 - 19968: jis0208<<14 | 0x5A<<7 | 0x4E,\n\t35668 - 19968: jis0212<<14 | 0x3D<<7 | 0x2B,\n\t35670 - 19968: jis0208<<14 | 0x4A<<7 | 0x5A,\n\t35672 - 19968: jis0208<<14 | 0x1B<<7 | 0x10,\n\t35673 - 19968: jis0212<<14 | 0x3D<<7 | 0x2C,\n\t35674 - 19968: jis0208<<14 | 0x4A<<7 | 0x5C,\n\t35675 - 19968: jis0208<<14 | 0x4A<<7 | 0x5B,\n\t35676 - 19968: jis0208<<14 | 0x28<<7 | 0x47,\n\t35678 - 19968: jis0212<<14 | 0x3D<<7 | 0x2E,\n\t35679 - 19968: jis0208<<14 | 0x4B<<7 | 0x00,\n\t35683 - 19968: jis0212<<14 | 0x3D<<7 | 0x2F,\n\t35686 - 19968: jis0208<<14 | 0x16<<7 | 0x38,\n\t35691 - 19968: jis0208<<14 | 0x4A<<7 | 0x5D,\n\t35692 - 19968: jis0208<<14 | 0x4B<<7 | 0x01,\n\t35693 - 19968: jis0212<<14 | 0x3D<<7 | 0x30,\n\t35695 - 19968: jis0208<<14 | 0x4B<<7 | 0x02,\n\t35696 - 19968: jis0208<<14 | 0x14<<7 | 0x23,\n\t35697 - 19968: jis0208<<14 | 0x45<<7 | 0x20,\n\t35698 - 19968: jis0208<<14 | 0x1D<<7 | 0x58,\n\t35700 - 19968: jis0208<<14 | 0x4B<<7 | 0x03,\n\t35702 - 19968: jis0212<<14 | 0x3D<<7 | 0x31,\n\t35703 - 19968: jis0208<<14 | 0x17<<7 | 0x4D,\n\t35704 - 19968: jis0212<<14 | 0x3D<<7 | 0x32,\n\t35705 - 19968: jis0212<<14 | 0x3D<<7 | 0x33,\n\t35708 - 19968: jis0212<<14 | 0x3D<<7 | 0x34,\n\t35709 - 19968: jis0208<<14 | 0x4B<<7 | 0x04,\n\t35710 - 19968: jis0212<<14 | 0x3D<<7 | 0x35,\n\t35711 - 19968: jis0208<<14 | 0x5A<<7 | 0x4F,\n\t35712 - 19968: jis0208<<14 | 0x4B<<7 | 0x05,\n\t35713 - 19968: jis0212<<14 | 0x3D<<7 | 0x36,\n\t35715 - 19968: jis0208<<14 | 0x1A<<7 | 0x1D,\n\t35716 - 19968: jis0212<<14 | 0x3D<<7 | 0x37,\n\t35717 - 19968: jis0212<<14 | 0x3D<<7 | 0x38,\n\t35722 - 19968: jis0208<<14 | 0x39<<7 | 0x2D,\n\t35723 - 19968: jis0212<<14 | 0x3D<<7 | 0x39,\n\t35724 - 19968: jis0208<<14 | 0x4B<<7 | 0x06,\n\t35725 - 19968: jis0212<<14 | 0x3D<<7 | 0x3A,\n\t35726 - 19968: jis0208<<14 | 0x4B<<7 | 0x07,\n\t35727 - 19968: jis0212<<14 | 0x3D<<7 | 0x3B,\n\t35728 - 19968: jis0208<<14 | 0x1C<<7 | 0x11,\n\t35730 - 19968: jis0208<<14 | 0x4B<<7 | 0x08,\n\t35731 - 19968: jis0208<<14 | 0x4B<<7 | 0x09,\n\t35732 - 19968: jis0212<<14 | 0x3D<<7 | 0x3C,\n\t35733 - 19968: jis0212<<14 | 0x3D<<7 | 0x3D,\n\t35734 - 19968: jis0208<<14 | 0x4B<<7 | 0x0A,\n\t35737 - 19968: jis0208<<14 | 0x4B<<7 | 0x0B,\n\t35738 - 19968: jis0208<<14 | 0x4B<<7 | 0x0C,\n\t35740 - 19968: jis0212<<14 | 0x3D<<7 | 0x3E,\n\t35742 - 19968: jis0212<<14 | 0x3D<<7 | 0x3F,\n\t35743 - 19968: jis0212<<14 | 0x3D<<7 | 0x40,\n\t35895 - 19968: jis0208<<14 | 0x22<<7 | 0x0A,\n\t35896 - 19968: jis0212<<14 | 0x3D<<7 | 0x41,\n\t35897 - 19968: jis0212<<14 | 0x3D<<7 | 0x42,\n\t35898 - 19968: jis0208<<14 | 0x4B<<7 | 0x0D,\n\t35901 - 19968: jis0212<<14 | 0x3D<<7 | 0x43,\n\t35902 - 19968: jis0212<<14 | 0x3D<<7 | 0x44,\n\t35903 - 19968: jis0208<<14 | 0x4B<<7 | 0x0F,\n\t35905 - 19968: jis0208<<14 | 0x4B<<7 | 0x0E,\n\t35909 - 19968: jis0212<<14 | 0x3D<<7 | 0x45,\n\t35910 - 19968: jis0208<<14 | 0x25<<7 | 0x05,\n\t35911 - 19968: jis0212<<14 | 0x3D<<7 | 0x46,\n\t35912 - 19968: jis0208<<14 | 0x4B<<7 | 0x10,\n\t35913 - 19968: jis0212<<14 | 0x3D<<7 | 0x47,\n\t35914 - 19968: jis0208<<14 | 0x2A<<7 | 0x0C,\n\t35915 - 19968: jis0212<<14 | 0x3D<<7 | 0x48,\n\t35916 - 19968: jis0208<<14 | 0x4B<<7 | 0x11,\n\t35918 - 19968: jis0208<<14 | 0x4B<<7 | 0x12,\n\t35919 - 19968: jis0212<<14 | 0x3D<<7 | 0x49,\n\t35920 - 19968: jis0208<<14 | 0x4B<<7 | 0x13,\n\t35921 - 19968: jis0212<<14 | 0x3D<<7 | 0x4A,\n\t35923 - 19968: jis0212<<14 | 0x3D<<7 | 0x4B,\n\t35924 - 19968: jis0212<<14 | 0x3D<<7 | 0x4C,\n\t35925 - 19968: jis0208<<14 | 0x4B<<7 | 0x14,\n\t35927 - 19968: jis0212<<14 | 0x3D<<7 | 0x4D,\n\t35928 - 19968: jis0212<<14 | 0x3D<<7 | 0x4E,\n\t35929 - 19968: jis0212<<14 | 0x3D<<7 | 0x51,\n\t35930 - 19968: jis0208<<14 | 0x25<<7 | 0x39,\n\t35931 - 19968: jis0212<<14 | 0x3D<<7 | 0x4F,\n\t35933 - 19968: jis0212<<14 | 0x3D<<7 | 0x50,\n\t35937 - 19968: jis0208<<14 | 0x1D<<7 | 0x3C,\n\t35938 - 19968: jis0208<<14 | 0x4B<<7 | 0x15,\n\t35939 - 19968: jis0212<<14 | 0x3D<<7 | 0x52,\n\t35940 - 19968: jis0212<<14 | 0x3D<<7 | 0x53,\n\t35942 - 19968: jis0212<<14 | 0x3D<<7 | 0x54,\n\t35944 - 19968: jis0212<<14 | 0x3D<<7 | 0x55,\n\t35945 - 19968: jis0212<<14 | 0x3D<<7 | 0x56,\n\t35946 - 19968: jis0208<<14 | 0x18<<7 | 0x4A,\n\t35947 - 19968: jis0208<<14 | 0x2F<<7 | 0x0D,\n\t35948 - 19968: jis0208<<14 | 0x4B<<7 | 0x16,\n\t35949 - 19968: jis0212<<14 | 0x3D<<7 | 0x57,\n\t35955 - 19968: jis0212<<14 | 0x3D<<7 | 0x58,\n\t35957 - 19968: jis0212<<14 | 0x3D<<7 | 0x59,\n\t35958 - 19968: jis0212<<14 | 0x3D<<7 | 0x5A,\n\t35960 - 19968: jis0208<<14 | 0x4B<<7 | 0x17,\n\t35961 - 19968: jis0208<<14 | 0x28<<7 | 0x1E,\n\t35962 - 19968: jis0208<<14 | 0x4B<<7 | 0x18,\n\t35963 - 19968: jis0212<<14 | 0x3D<<7 | 0x5B,\n\t35964 - 19968: jis0208<<14 | 0x4B<<7 | 0x20,\n\t35966 - 19968: jis0212<<14 | 0x3D<<7 | 0x5C,\n\t35970 - 19968: jis0208<<14 | 0x4B<<7 | 0x19,\n\t35973 - 19968: jis0208<<14 | 0x4B<<7 | 0x1B,\n\t35974 - 19968: jis0212<<14 | 0x3D<<7 | 0x5D,\n\t35975 - 19968: jis0212<<14 | 0x3E<<7 | 0x00,\n\t35977 - 19968: jis0208<<14 | 0x4B<<7 | 0x1A,\n\t35978 - 19968: jis0208<<14 | 0x4B<<7 | 0x1C,\n\t35979 - 19968: jis0212<<14 | 0x3E<<7 | 0x01,\n\t35980 - 19968: jis0208<<14 | 0x2A<<7 | 0x25,\n\t35981 - 19968: jis0208<<14 | 0x4B<<7 | 0x1D,\n\t35982 - 19968: jis0208<<14 | 0x4B<<7 | 0x1E,\n\t35984 - 19968: jis0212<<14 | 0x3E<<7 | 0x02,\n\t35986 - 19968: jis0212<<14 | 0x3E<<7 | 0x03,\n\t35987 - 19968: jis0212<<14 | 0x3E<<7 | 0x04,\n\t35988 - 19968: jis0208<<14 | 0x4B<<7 | 0x1F,\n\t35992 - 19968: jis0208<<14 | 0x4B<<7 | 0x21,\n\t35993 - 19968: jis0212<<14 | 0x3E<<7 | 0x05,\n\t35995 - 19968: jis0212<<14 | 0x3E<<7 | 0x06,\n\t35996 - 19968: jis0212<<14 | 0x3E<<7 | 0x07,\n\t35997 - 19968: jis0208<<14 | 0x12<<7 | 0x0C,\n\t35998 - 19968: jis0208<<14 | 0x23<<7 | 0x46,\n\t36000 - 19968: jis0208<<14 | 0x28<<7 | 0x48,\n\t36001 - 19968: jis0208<<14 | 0x19<<7 | 0x41,\n\t36002 - 19968: jis0208<<14 | 0x18<<7 | 0x36,\n\t36004 - 19968: jis0212<<14 | 0x3E<<7 | 0x08,\n\t36007 - 19968: jis0208<<14 | 0x28<<7 | 0x2E,\n\t36008 - 19968: jis0208<<14 | 0x11<<7 | 0x3E,\n\t36009 - 19968: jis0208<<14 | 0x27<<7 | 0x2D,\n\t36010 - 19968: jis0208<<14 | 0x4B<<7 | 0x24,\n\t36011 - 19968: jis0208<<14 | 0x13<<7 | 0x32,\n\t36012 - 19968: jis0208<<14 | 0x1F<<7 | 0x34,\n\t36013 - 19968: jis0208<<14 | 0x4B<<7 | 0x23,\n\t36014 - 19968: jis0208<<14 | 0x4B<<7 | 0x28,\n\t36015 - 19968: jis0208<<14 | 0x22<<7 | 0x58,\n\t36016 - 19968: jis0208<<14 | 0x2B<<7 | 0x42,\n\t36018 - 19968: jis0208<<14 | 0x4B<<7 | 0x26,\n\t36019 - 19968: jis0208<<14 | 0x4B<<7 | 0x27,\n\t36020 - 19968: jis0208<<14 | 0x14<<7 | 0x0D,\n\t36022 - 19968: jis0208<<14 | 0x4B<<7 | 0x29,\n\t36023 - 19968: jis0208<<14 | 0x26<<7 | 0x42,\n\t36024 - 19968: jis0208<<14 | 0x21<<7 | 0x3E,\n\t36025 - 19968: jis0212<<14 | 0x3E<<7 | 0x09,\n\t36026 - 19968: jis0212<<14 | 0x3E<<7 | 0x0A,\n\t36027 - 19968: jis0208<<14 | 0x27<<7 | 0x50,\n\t36028 - 19968: jis0208<<14 | 0x24<<7 | 0x1C,\n\t36029 - 19968: jis0208<<14 | 0x4B<<7 | 0x25,\n\t36031 - 19968: jis0208<<14 | 0x2A<<7 | 0x26,\n\t36032 - 19968: jis0208<<14 | 0x11<<7 | 0x4B,\n\t36033 - 19968: jis0208<<14 | 0x4B<<7 | 0x2B,\n\t36034 - 19968: jis0208<<14 | 0x2E<<7 | 0x07,\n\t36035 - 19968: jis0208<<14 | 0x23<<7 | 0x21,\n\t36036 - 19968: jis0208<<14 | 0x2E<<7 | 0x24,\n\t36037 - 19968: jis0212<<14 | 0x3E<<7 | 0x0B,\n\t36038 - 19968: jis0212<<14 | 0x3E<<7 | 0x0C,\n\t36039 - 19968: jis0208<<14 | 0x1A<<7 | 0x50,\n\t36040 - 19968: jis0208<<14 | 0x4B<<7 | 0x2A,\n\t36041 - 19968: jis0212<<14 | 0x3E<<7 | 0x0D,\n\t36042 - 19968: jis0208<<14 | 0x21<<7 | 0x10,\n\t36043 - 19968: jis0212<<14 | 0x3E<<7 | 0x0E,\n\t36045 - 19968: jis0208<<14 | 0x4B<<7 | 0x3B,\n\t36046 - 19968: jis0208<<14 | 0x20<<7 | 0x07,\n\t36047 - 19968: jis0212<<14 | 0x3E<<7 | 0x0F,\n\t36049 - 19968: jis0208<<14 | 0x25<<7 | 0x57,\n\t36051 - 19968: jis0208<<14 | 0x28<<7 | 0x2F,\n\t36053 - 19968: jis0212<<14 | 0x3E<<7 | 0x11,\n\t36054 - 19968: jis0212<<14 | 0x3E<<7 | 0x10,\n\t36057 - 19968: jis0212<<14 | 0x3E<<7 | 0x12,\n\t36058 - 19968: jis0208<<14 | 0x4B<<7 | 0x2E,\n\t36059 - 19968: jis0208<<14 | 0x1A<<7 | 0x1E,\n\t36060 - 19968: jis0208<<14 | 0x1A<<7 | 0x51,\n\t36061 - 19968: jis0212<<14 | 0x3E<<7 | 0x13,\n\t36062 - 19968: jis0208<<14 | 0x1D<<7 | 0x3D,\n\t36064 - 19968: jis0208<<14 | 0x26<<7 | 0x44,\n\t36065 - 19968: jis0212<<14 | 0x3E<<7 | 0x14,\n\t36066 - 19968: jis0208<<14 | 0x17<<7 | 0x0C,\n\t36067 - 19968: jis0208<<14 | 0x4B<<7 | 0x2D,\n\t36068 - 19968: jis0208<<14 | 0x4B<<7 | 0x2C,\n\t36070 - 19968: jis0208<<14 | 0x28<<7 | 0x49,\n\t36072 - 19968: jis0212<<14 | 0x3E<<7 | 0x15,\n\t36074 - 19968: jis0208<<14 | 0x1B<<7 | 0x20,\n\t36076 - 19968: jis0212<<14 | 0x3E<<7 | 0x16,\n\t36077 - 19968: jis0208<<14 | 0x24<<7 | 0x31,\n\t36079 - 19968: jis0212<<14 | 0x3E<<7 | 0x17,\n\t36080 - 19968: jis0208<<14 | 0x5A<<7 | 0x50,\n\t36082 - 19968: jis0212<<14 | 0x3E<<7 | 0x19,\n\t36084 - 19968: jis0208<<14 | 0x5A<<7 | 0x51,\n\t36085 - 19968: jis0212<<14 | 0x3E<<7 | 0x1A,\n\t36087 - 19968: jis0212<<14 | 0x3E<<7 | 0x1B,\n\t36088 - 19968: jis0212<<14 | 0x3E<<7 | 0x1C,\n\t36090 - 19968: jis0208<<14 | 0x4B<<7 | 0x30,\n\t36091 - 19968: jis0208<<14 | 0x4B<<7 | 0x31,\n\t36092 - 19968: jis0208<<14 | 0x18<<7 | 0x37,\n\t36093 - 19968: jis0208<<14 | 0x4B<<7 | 0x2F,\n\t36094 - 19968: jis0212<<14 | 0x3E<<7 | 0x1D,\n\t36095 - 19968: jis0212<<14 | 0x3E<<7 | 0x1E,\n\t36097 - 19968: jis0212<<14 | 0x3E<<7 | 0x1F,\n\t36099 - 19968: jis0212<<14 | 0x3E<<7 | 0x20,\n\t36100 - 19968: jis0208<<14 | 0x4B<<7 | 0x32,\n\t36101 - 19968: jis0208<<14 | 0x4B<<7 | 0x33,\n\t36103 - 19968: jis0208<<14 | 0x4B<<7 | 0x35,\n\t36104 - 19968: jis0208<<14 | 0x21<<7 | 0x02,\n\t36105 - 19968: jis0212<<14 | 0x3E<<7 | 0x21,\n\t36106 - 19968: jis0208<<14 | 0x4B<<7 | 0x34,\n\t36107 - 19968: jis0208<<14 | 0x13<<7 | 0x45,\n\t36109 - 19968: jis0208<<14 | 0x4B<<7 | 0x37,\n\t36111 - 19968: jis0208<<14 | 0x4B<<7 | 0x36,\n\t36112 - 19968: jis0208<<14 | 0x4B<<7 | 0x38,\n\t36114 - 19968: jis0208<<14 | 0x5A<<7 | 0x52,\n\t36115 - 19968: jis0208<<14 | 0x4B<<7 | 0x3A,\n\t36116 - 19968: jis0208<<14 | 0x4B<<7 | 0x3C,\n\t36118 - 19968: jis0208<<14 | 0x4B<<7 | 0x3D,\n\t36119 - 19968: jis0212<<14 | 0x3E<<7 | 0x23,\n\t36123 - 19968: jis0212<<14 | 0x3E<<7 | 0x24,\n\t36196 - 19968: jis0208<<14 | 0x1F<<7 | 0x35,\n\t36197 - 19968: jis0212<<14 | 0x3E<<7 | 0x25,\n\t36198 - 19968: jis0208<<14 | 0x1B<<7 | 0x2E,\n\t36199 - 19968: jis0208<<14 | 0x4B<<7 | 0x3E,\n\t36201 - 19968: jis0212<<14 | 0x3E<<7 | 0x26,\n\t36203 - 19968: jis0208<<14 | 0x12<<7 | 0x31,\n\t36204 - 19968: jis0212<<14 | 0x3E<<7 | 0x27,\n\t36205 - 19968: jis0208<<14 | 0x4B<<7 | 0x3F,\n\t36206 - 19968: jis0212<<14 | 0x3E<<7 | 0x28,\n\t36208 - 19968: jis0208<<14 | 0x20<<7 | 0x55,\n\t36209 - 19968: jis0208<<14 | 0x4B<<7 | 0x40,\n\t36211 - 19968: jis0208<<14 | 0x4B<<7 | 0x41,\n\t36212 - 19968: jis0208<<14 | 0x28<<7 | 0x4A,\n\t36214 - 19968: jis0208<<14 | 0x5A<<7 | 0x53,\n\t36215 - 19968: jis0208<<14 | 0x14<<7 | 0x0E,\n\t36223 - 19968: jis0212<<14 | 0x3E<<7 | 0x29,\n\t36225 - 19968: jis0208<<14 | 0x4B<<7 | 0x42,\n\t36226 - 19968: jis0212<<14 | 0x3E<<7 | 0x2A,\n\t36228 - 19968: jis0212<<14 | 0x3E<<7 | 0x2B,\n\t36229 - 19968: jis0208<<14 | 0x23<<7 | 0x15,\n\t36232 - 19968: jis0212<<14 | 0x3E<<7 | 0x2C,\n\t36234 - 19968: jis0208<<14 | 0x10<<7 | 0x3A,\n\t36237 - 19968: jis0212<<14 | 0x3E<<7 | 0x2D,\n\t36240 - 19968: jis0212<<14 | 0x3E<<7 | 0x2E,\n\t36241 - 19968: jis0212<<14 | 0x3E<<7 | 0x2F,\n\t36245 - 19968: jis0212<<14 | 0x3E<<7 | 0x30,\n\t36249 - 19968: jis0208<<14 | 0x4B<<7 | 0x43,\n\t36254 - 19968: jis0212<<14 | 0x3E<<7 | 0x31,\n\t36255 - 19968: jis0212<<14 | 0x3E<<7 | 0x32,\n\t36256 - 19968: jis0212<<14 | 0x3E<<7 | 0x33,\n\t36259 - 19968: jis0208<<14 | 0x1B<<7 | 0x50,\n\t36262 - 19968: jis0212<<14 | 0x3E<<7 | 0x34,\n\t36264 - 19968: jis0208<<14 | 0x1E<<7 | 0x55,\n\t36267 - 19968: jis0212<<14 | 0x3E<<7 | 0x35,\n\t36268 - 19968: jis0212<<14 | 0x3E<<7 | 0x36,\n\t36271 - 19968: jis0212<<14 | 0x3E<<7 | 0x37,\n\t36274 - 19968: jis0212<<14 | 0x3E<<7 | 0x38,\n\t36275 - 19968: jis0208<<14 | 0x21<<7 | 0x0C,\n\t36277 - 19968: jis0212<<14 | 0x3E<<7 | 0x39,\n\t36279 - 19968: jis0212<<14 | 0x3E<<7 | 0x3A,\n\t36281 - 19968: jis0212<<14 | 0x3E<<7 | 0x3B,\n\t36282 - 19968: jis0208<<14 | 0x4B<<7 | 0x46,\n\t36283 - 19968: jis0212<<14 | 0x3E<<7 | 0x3C,\n\t36284 - 19968: jis0212<<14 | 0x3E<<7 | 0x4E,\n\t36286 - 19968: jis0208<<14 | 0x4B<<7 | 0x45,\n\t36288 - 19968: jis0212<<14 | 0x3E<<7 | 0x3D,\n\t36290 - 19968: jis0208<<14 | 0x4B<<7 | 0x44,\n\t36293 - 19968: jis0212<<14 | 0x3E<<7 | 0x3E,\n\t36294 - 19968: jis0212<<14 | 0x3E<<7 | 0x3F,\n\t36295 - 19968: jis0212<<14 | 0x3E<<7 | 0x40,\n\t36296 - 19968: jis0212<<14 | 0x3E<<7 | 0x41,\n\t36298 - 19968: jis0212<<14 | 0x3E<<7 | 0x42,\n\t36299 - 19968: jis0208<<14 | 0x4B<<7 | 0x4C,\n\t36300 - 19968: jis0208<<14 | 0x4B<<7 | 0x4A,\n\t36302 - 19968: jis0212<<14 | 0x3E<<7 | 0x43,\n\t36303 - 19968: jis0208<<14 | 0x4B<<7 | 0x47,\n\t36305 - 19968: jis0212<<14 | 0x3E<<7 | 0x44,\n\t36308 - 19968: jis0212<<14 | 0x3E<<7 | 0x45,\n\t36309 - 19968: jis0212<<14 | 0x3E<<7 | 0x46,\n\t36310 - 19968: jis0208<<14 | 0x4B<<7 | 0x49,\n\t36311 - 19968: jis0212<<14 | 0x3E<<7 | 0x47,\n\t36313 - 19968: jis0212<<14 | 0x3E<<7 | 0x48,\n\t36314 - 19968: jis0208<<14 | 0x4B<<7 | 0x48,\n\t36315 - 19968: jis0208<<14 | 0x4B<<7 | 0x4B,\n\t36317 - 19968: jis0208<<14 | 0x14<<7 | 0x56,\n\t36319 - 19968: jis0208<<14 | 0x4B<<7 | 0x4F,\n\t36321 - 19968: jis0208<<14 | 0x1F<<7 | 0x36,\n\t36323 - 19968: jis0208<<14 | 0x4B<<7 | 0x50,\n\t36324 - 19968: jis0212<<14 | 0x3E<<7 | 0x49,\n\t36325 - 19968: jis0212<<14 | 0x3E<<7 | 0x4A,\n\t36327 - 19968: jis0212<<14 | 0x3E<<7 | 0x4B,\n\t36328 - 19968: jis0208<<14 | 0x17<<7 | 0x38,\n\t36330 - 19968: jis0208<<14 | 0x4B<<7 | 0x4D,\n\t36331 - 19968: jis0208<<14 | 0x4B<<7 | 0x4E,\n\t36332 - 19968: jis0212<<14 | 0x3E<<7 | 0x4C,\n\t36335 - 19968: jis0208<<14 | 0x2E<<7 | 0x08,\n\t36336 - 19968: jis0212<<14 | 0x3E<<7 | 0x4D,\n\t36337 - 19968: jis0212<<14 | 0x3E<<7 | 0x4F,\n\t36338 - 19968: jis0212<<14 | 0x3E<<7 | 0x50,\n\t36339 - 19968: jis0208<<14 | 0x23<<7 | 0x16,\n\t36340 - 19968: jis0212<<14 | 0x3E<<7 | 0x51,\n\t36341 - 19968: jis0208<<14 | 0x20<<7 | 0x08,\n\t36348 - 19968: jis0208<<14 | 0x4B<<7 | 0x51,\n\t36349 - 19968: jis0212<<14 | 0x3E<<7 | 0x52,\n\t36351 - 19968: jis0208<<14 | 0x4B<<7 | 0x54,\n\t36353 - 19968: jis0212<<14 | 0x3E<<7 | 0x53,\n\t36356 - 19968: jis0212<<14 | 0x3E<<7 | 0x54,\n\t36357 - 19968: jis0212<<14 | 0x3E<<7 | 0x55,\n\t36358 - 19968: jis0212<<14 | 0x3E<<7 | 0x56,\n\t36360 - 19968: jis0208<<14 | 0x4B<<7 | 0x52,\n\t36361 - 19968: jis0208<<14 | 0x4B<<7 | 0x53,\n\t36362 - 19968: jis0208<<14 | 0x2C<<7 | 0x38,\n\t36363 - 19968: jis0212<<14 | 0x3E<<7 | 0x57,\n\t36367 - 19968: jis0208<<14 | 0x25<<7 | 0x06,\n\t36368 - 19968: jis0208<<14 | 0x4B<<7 | 0x57,\n\t36369 - 19968: jis0212<<14 | 0x3E<<7 | 0x58,\n\t36372 - 19968: jis0212<<14 | 0x3E<<7 | 0x59,\n\t36374 - 19968: jis0212<<14 | 0x3E<<7 | 0x5A,\n\t36381 - 19968: jis0208<<14 | 0x4B<<7 | 0x55,\n\t36382 - 19968: jis0208<<14 | 0x4B<<7 | 0x56,\n\t36383 - 19968: jis0208<<14 | 0x4B<<7 | 0x58,\n\t36384 - 19968: jis0212<<14 | 0x3E<<7 | 0x5B,\n\t36385 - 19968: jis0212<<14 | 0x3E<<7 | 0x5C,\n\t36386 - 19968: jis0212<<14 | 0x3E<<7 | 0x5D,\n\t36387 - 19968: jis0212<<14 | 0x3F<<7 | 0x00,\n\t36390 - 19968: jis0212<<14 | 0x3F<<7 | 0x01,\n\t36391 - 19968: jis0212<<14 | 0x3F<<7 | 0x02,\n\t36394 - 19968: jis0208<<14 | 0x4C<<7 | 0x08,\n\t36400 - 19968: jis0208<<14 | 0x4B<<7 | 0x5B,\n\t36401 - 19968: jis0212<<14 | 0x3F<<7 | 0x03,\n\t36403 - 19968: jis0212<<14 | 0x3F<<7 | 0x04,\n\t36404 - 19968: jis0208<<14 | 0x4B<<7 | 0x5C,\n\t36405 - 19968: jis0208<<14 | 0x4B<<7 | 0x5A,\n\t36406 - 19968: jis0212<<14 | 0x3F<<7 | 0x05,\n\t36407 - 19968: jis0212<<14 | 0x3F<<7 | 0x06,\n\t36408 - 19968: jis0212<<14 | 0x3F<<7 | 0x07,\n\t36409 - 19968: jis0212<<14 | 0x3F<<7 | 0x08,\n\t36413 - 19968: jis0212<<14 | 0x3F<<7 | 0x09,\n\t36416 - 19968: jis0212<<14 | 0x3F<<7 | 0x0A,\n\t36417 - 19968: jis0212<<14 | 0x3F<<7 | 0x0B,\n\t36418 - 19968: jis0208<<14 | 0x4B<<7 | 0x59,\n\t36420 - 19968: jis0208<<14 | 0x23<<7 | 0x5C,\n\t36423 - 19968: jis0208<<14 | 0x4C<<7 | 0x00,\n\t36424 - 19968: jis0208<<14 | 0x4C<<7 | 0x04,\n\t36425 - 19968: jis0208<<14 | 0x4C<<7 | 0x01,\n\t36426 - 19968: jis0208<<14 | 0x4B<<7 | 0x5D,\n\t36427 - 19968: jis0212<<14 | 0x3F<<7 | 0x0C,\n\t36428 - 19968: jis0208<<14 | 0x4C<<7 | 0x02,\n\t36429 - 19968: jis0212<<14 | 0x3F<<7 | 0x0D,\n\t36430 - 19968: jis0212<<14 | 0x3F<<7 | 0x0E,\n\t36431 - 19968: jis0212<<14 | 0x3F<<7 | 0x0F,\n\t36432 - 19968: jis0208<<14 | 0x4C<<7 | 0x03,\n\t36436 - 19968: jis0212<<14 | 0x3F<<7 | 0x10,\n\t36437 - 19968: jis0208<<14 | 0x4C<<7 | 0x0A,\n\t36441 - 19968: jis0208<<14 | 0x4C<<7 | 0x05,\n\t36443 - 19968: jis0212<<14 | 0x3F<<7 | 0x11,\n\t36444 - 19968: jis0212<<14 | 0x3F<<7 | 0x12,\n\t36445 - 19968: jis0212<<14 | 0x3F<<7 | 0x13,\n\t36446 - 19968: jis0212<<14 | 0x3F<<7 | 0x14,\n\t36447 - 19968: jis0208<<14 | 0x1F<<7 | 0x37,\n\t36448 - 19968: jis0208<<14 | 0x4C<<7 | 0x07,\n\t36449 - 19968: jis0212<<14 | 0x3F<<7 | 0x15,\n\t36450 - 19968: jis0212<<14 | 0x3F<<7 | 0x16,\n\t36451 - 19968: jis0208<<14 | 0x4C<<7 | 0x09,\n\t36452 - 19968: jis0208<<14 | 0x4C<<7 | 0x06,\n\t36457 - 19968: jis0212<<14 | 0x3F<<7 | 0x17,\n\t36460 - 19968: jis0212<<14 | 0x3F<<7 | 0x18,\n\t36461 - 19968: jis0212<<14 | 0x3F<<7 | 0x19,\n\t36463 - 19968: jis0212<<14 | 0x3F<<7 | 0x1A,\n\t36464 - 19968: jis0212<<14 | 0x3F<<7 | 0x1B,\n\t36465 - 19968: jis0212<<14 | 0x3F<<7 | 0x1C,\n\t36466 - 19968: jis0208<<14 | 0x4C<<7 | 0x0C,\n\t36468 - 19968: jis0208<<14 | 0x1C<<7 | 0x12,\n\t36470 - 19968: jis0208<<14 | 0x4C<<7 | 0x0B,\n\t36473 - 19968: jis0212<<14 | 0x3F<<7 | 0x1D,\n\t36474 - 19968: jis0212<<14 | 0x3F<<7 | 0x1E,\n\t36475 - 19968: jis0212<<14 | 0x3F<<7 | 0x1F,\n\t36476 - 19968: jis0208<<14 | 0x4C<<7 | 0x0D,\n\t36481 - 19968: jis0208<<14 | 0x4C<<7 | 0x0E,\n\t36482 - 19968: jis0212<<14 | 0x3F<<7 | 0x20,\n\t36483 - 19968: jis0212<<14 | 0x3F<<7 | 0x21,\n\t36484 - 19968: jis0208<<14 | 0x4C<<7 | 0x11,\n\t36485 - 19968: jis0208<<14 | 0x4C<<7 | 0x10,\n\t36487 - 19968: jis0208<<14 | 0x4C<<7 | 0x0F,\n\t36489 - 19968: jis0212<<14 | 0x3F<<7 | 0x22,\n\t36490 - 19968: jis0208<<14 | 0x4C<<7 | 0x13,\n\t36491 - 19968: jis0208<<14 | 0x4C<<7 | 0x12,\n\t36493 - 19968: jis0208<<14 | 0x2B<<7 | 0x55,\n\t36496 - 19968: jis0212<<14 | 0x3F<<7 | 0x23,\n\t36497 - 19968: jis0208<<14 | 0x4C<<7 | 0x15,\n\t36498 - 19968: jis0212<<14 | 0x3F<<7 | 0x24,\n\t36499 - 19968: jis0208<<14 | 0x4C<<7 | 0x14,\n\t36500 - 19968: jis0208<<14 | 0x4C<<7 | 0x16,\n\t36501 - 19968: jis0212<<14 | 0x3F<<7 | 0x25,\n\t36505 - 19968: jis0208<<14 | 0x4C<<7 | 0x17,\n\t36506 - 19968: jis0212<<14 | 0x3F<<7 | 0x26,\n\t36507 - 19968: jis0212<<14 | 0x3F<<7 | 0x27,\n\t36509 - 19968: jis0212<<14 | 0x3F<<7 | 0x28,\n\t36510 - 19968: jis0212<<14 | 0x3F<<7 | 0x29,\n\t36513 - 19968: jis0208<<14 | 0x4C<<7 | 0x19,\n\t36514 - 19968: jis0212<<14 | 0x3F<<7 | 0x2A,\n\t36519 - 19968: jis0212<<14 | 0x3F<<7 | 0x2B,\n\t36521 - 19968: jis0212<<14 | 0x3F<<7 | 0x2C,\n\t36522 - 19968: jis0208<<14 | 0x4C<<7 | 0x18,\n\t36523 - 19968: jis0208<<14 | 0x1E<<7 | 0x27,\n\t36524 - 19968: jis0208<<14 | 0x4C<<7 | 0x1A,\n\t36525 - 19968: jis0212<<14 | 0x3F<<7 | 0x2D,\n\t36526 - 19968: jis0212<<14 | 0x3F<<7 | 0x2E,\n\t36527 - 19968: jis0208<<14 | 0x15<<7 | 0x4C,\n\t36528 - 19968: jis0208<<14 | 0x4C<<7 | 0x1B,\n\t36529 - 19968: jis0208<<14 | 0x4C<<7 | 0x1D,\n\t36531 - 19968: jis0212<<14 | 0x3F<<7 | 0x2F,\n\t36533 - 19968: jis0212<<14 | 0x3F<<7 | 0x30,\n\t36538 - 19968: jis0212<<14 | 0x3F<<7 | 0x31,\n\t36539 - 19968: jis0212<<14 | 0x3F<<7 | 0x32,\n\t36542 - 19968: jis0208<<14 | 0x4C<<7 | 0x1E,\n\t36544 - 19968: jis0212<<14 | 0x3F<<7 | 0x33,\n\t36545 - 19968: jis0212<<14 | 0x3F<<7 | 0x34,\n\t36547 - 19968: jis0212<<14 | 0x3F<<7 | 0x35,\n\t36548 - 19968: jis0212<<14 | 0x3F<<7 | 0x36,\n\t36549 - 19968: jis0208<<14 | 0x4C<<7 | 0x1F,\n\t36550 - 19968: jis0208<<14 | 0x4C<<7 | 0x1C,\n\t36551 - 19968: jis0212<<14 | 0x3F<<7 | 0x37,\n\t36552 - 19968: jis0208<<14 | 0x4C<<7 | 0x20,\n\t36554 - 19968: jis0208<<14 | 0x1B<<7 | 0x35,\n\t36555 - 19968: jis0208<<14 | 0x4C<<7 | 0x21,\n\t36556 - 19968: jis0208<<14 | 0x14<<7 | 0x0F,\n\t36557 - 19968: jis0208<<14 | 0x16<<7 | 0x12,\n\t36559 - 19968: jis0208<<14 | 0x5A<<7 | 0x55,\n\t36561 - 19968: jis0212<<14 | 0x3F<<7 | 0x39,\n\t36562 - 19968: jis0208<<14 | 0x17<<7 | 0x0D,\n\t36564 - 19968: jis0212<<14 | 0x3F<<7 | 0x3A,\n\t36571 - 19968: jis0208<<14 | 0x4C<<7 | 0x22,\n\t36572 - 19968: jis0212<<14 | 0x3F<<7 | 0x3B,\n\t36575 - 19968: jis0208<<14 | 0x25<<7 | 0x4F,\n\t36578 - 19968: jis0208<<14 | 0x24<<7 | 0x1D,\n\t36579 - 19968: jis0208<<14 | 0x4C<<7 | 0x23,\n\t36584 - 19968: jis0212<<14 | 0x3F<<7 | 0x3C,\n\t36587 - 19968: jis0208<<14 | 0x4C<<7 | 0x26,\n\t36589 - 19968: jis0212<<14 | 0x3F<<7 | 0x43,\n\t36590 - 19968: jis0212<<14 | 0x3F<<7 | 0x3D,\n\t36592 - 19968: jis0212<<14 | 0x3F<<7 | 0x3E,\n\t36593 - 19968: jis0212<<14 | 0x3F<<7 | 0x3F,\n\t36599 - 19968: jis0212<<14 | 0x3F<<7 | 0x40,\n\t36600 - 19968: jis0208<<14 | 0x1B<<7 | 0x13,\n\t36601 - 19968: jis0212<<14 | 0x3F<<7 | 0x41,\n\t36602 - 19968: jis0212<<14 | 0x3F<<7 | 0x42,\n\t36603 - 19968: jis0208<<14 | 0x4C<<7 | 0x25,\n\t36604 - 19968: jis0208<<14 | 0x4C<<7 | 0x24,\n\t36605 - 19968: jis0208<<14 | 0x16<<7 | 0x39,\n\t36606 - 19968: jis0208<<14 | 0x4C<<7 | 0x27,\n\t36608 - 19968: jis0212<<14 | 0x3F<<7 | 0x44,\n\t36610 - 19968: jis0212<<14 | 0x3F<<7 | 0x45,\n\t36611 - 19968: jis0208<<14 | 0x12<<7 | 0x32,\n\t36613 - 19968: jis0208<<14 | 0x4C<<7 | 0x29,\n\t36615 - 19968: jis0212<<14 | 0x3F<<7 | 0x46,\n\t36616 - 19968: jis0212<<14 | 0x3F<<7 | 0x47,\n\t36617 - 19968: jis0208<<14 | 0x19<<7 | 0x3B,\n\t36618 - 19968: jis0208<<14 | 0x4C<<7 | 0x28,\n\t36620 - 19968: jis0208<<14 | 0x4C<<7 | 0x31,\n\t36623 - 19968: jis0212<<14 | 0x3F<<7 | 0x48,\n\t36624 - 19968: jis0212<<14 | 0x3F<<7 | 0x49,\n\t36626 - 19968: jis0208<<14 | 0x4C<<7 | 0x2B,\n\t36627 - 19968: jis0208<<14 | 0x4C<<7 | 0x2D,\n\t36628 - 19968: jis0208<<14 | 0x29<<7 | 0x44,\n\t36629 - 19968: jis0208<<14 | 0x4C<<7 | 0x2A,\n\t36630 - 19968: jis0212<<14 | 0x3F<<7 | 0x4A,\n\t36631 - 19968: jis0212<<14 | 0x3F<<7 | 0x4B,\n\t36632 - 19968: jis0212<<14 | 0x3F<<7 | 0x4C,\n\t36633 - 19968: jis0208<<14 | 0x4C<<7 | 0x2C,\n\t36635 - 19968: jis0208<<14 | 0x4C<<7 | 0x30,\n\t36636 - 19968: jis0208<<14 | 0x4C<<7 | 0x2E,\n\t36637 - 19968: jis0208<<14 | 0x14<<7 | 0x10,\n\t36638 - 19968: jis0212<<14 | 0x3F<<7 | 0x4D,\n\t36639 - 19968: jis0208<<14 | 0x4C<<7 | 0x2F,\n\t36640 - 19968: jis0212<<14 | 0x3F<<7 | 0x4E,\n\t36641 - 19968: jis0212<<14 | 0x3F<<7 | 0x4F,\n\t36643 - 19968: jis0212<<14 | 0x3F<<7 | 0x50,\n\t36645 - 19968: jis0212<<14 | 0x3F<<7 | 0x51,\n\t36646 - 19968: jis0208<<14 | 0x4C<<7 | 0x32,\n\t36647 - 19968: jis0212<<14 | 0x3F<<7 | 0x52,\n\t36648 - 19968: jis0212<<14 | 0x3F<<7 | 0x53,\n\t36649 - 19968: jis0208<<14 | 0x26<<7 | 0x39,\n\t36650 - 19968: jis0208<<14 | 0x2D<<7 | 0x37,\n\t36652 - 19968: jis0212<<14 | 0x3F<<7 | 0x54,\n\t36653 - 19968: jis0212<<14 | 0x3F<<7 | 0x55,\n\t36654 - 19968: jis0212<<14 | 0x3F<<7 | 0x56,\n\t36655 - 19968: jis0208<<14 | 0x1C<<7 | 0x13,\n\t36659 - 19968: jis0208<<14 | 0x4C<<7 | 0x33,\n\t36660 - 19968: jis0212<<14 | 0x3F<<7 | 0x57,\n\t36661 - 19968: jis0212<<14 | 0x3F<<7 | 0x58,\n\t36662 - 19968: jis0212<<14 | 0x3F<<7 | 0x59,\n\t36663 - 19968: jis0212<<14 | 0x3F<<7 | 0x5A,\n\t36664 - 19968: jis0208<<14 | 0x2C<<7 | 0x01,\n\t36665 - 19968: jis0208<<14 | 0x4C<<7 | 0x35,\n\t36666 - 19968: jis0212<<14 | 0x3F<<7 | 0x5B,\n\t36667 - 19968: jis0208<<14 | 0x4C<<7 | 0x34,\n\t36670 - 19968: jis0208<<14 | 0x4C<<7 | 0x38,\n\t36671 - 19968: jis0208<<14 | 0x2C<<7 | 0x20,\n\t36672 - 19968: jis0212<<14 | 0x3F<<7 | 0x5C,\n\t36673 - 19968: jis0212<<14 | 0x3F<<7 | 0x5D,\n\t36674 - 19968: jis0208<<14 | 0x4C<<7 | 0x37,\n\t36675 - 19968: jis0212<<14 | 0x40<<7 | 0x00,\n\t36676 - 19968: jis0208<<14 | 0x12<<7 | 0x4C,\n\t36677 - 19968: jis0208<<14 | 0x4C<<7 | 0x36,\n\t36678 - 19968: jis0208<<14 | 0x4C<<7 | 0x3B,\n\t36679 - 19968: jis0212<<14 | 0x40<<7 | 0x01,\n\t36681 - 19968: jis0208<<14 | 0x4C<<7 | 0x3A,\n\t36684 - 19968: jis0208<<14 | 0x4C<<7 | 0x39,\n\t36685 - 19968: jis0208<<14 | 0x24<<7 | 0x11,\n\t36686 - 19968: jis0208<<14 | 0x4C<<7 | 0x3C,\n\t36687 - 19968: jis0212<<14 | 0x40<<7 | 0x02,\n\t36689 - 19968: jis0212<<14 | 0x40<<7 | 0x03,\n\t36690 - 19968: jis0212<<14 | 0x40<<7 | 0x04,\n\t36691 - 19968: jis0212<<14 | 0x40<<7 | 0x05,\n\t36692 - 19968: jis0212<<14 | 0x40<<7 | 0x06,\n\t36693 - 19968: jis0212<<14 | 0x40<<7 | 0x07,\n\t36695 - 19968: jis0208<<14 | 0x4C<<7 | 0x3D,\n\t36696 - 19968: jis0212<<14 | 0x40<<7 | 0x08,\n\t36700 - 19968: jis0208<<14 | 0x4C<<7 | 0x3E,\n\t36701 - 19968: jis0212<<14 | 0x40<<7 | 0x09,\n\t36702 - 19968: jis0212<<14 | 0x40<<7 | 0x0A,\n\t36703 - 19968: jis0208<<14 | 0x18<<7 | 0x4B,\n\t36705 - 19968: jis0208<<14 | 0x16<<7 | 0x04,\n\t36706 - 19968: jis0208<<14 | 0x4C<<7 | 0x3F,\n\t36707 - 19968: jis0208<<14 | 0x4C<<7 | 0x40,\n\t36708 - 19968: jis0208<<14 | 0x4C<<7 | 0x41,\n\t36709 - 19968: jis0212<<14 | 0x40<<7 | 0x0B,\n\t36763 - 19968: jis0208<<14 | 0x1E<<7 | 0x28,\n\t36764 - 19968: jis0208<<14 | 0x4C<<7 | 0x42,\n\t36765 - 19968: jis0212<<14 | 0x40<<7 | 0x0C,\n\t36766 - 19968: jis0208<<14 | 0x1B<<7 | 0x0C,\n\t36767 - 19968: jis0208<<14 | 0x4C<<7 | 0x43,\n\t36768 - 19968: jis0212<<14 | 0x40<<7 | 0x0D,\n\t36769 - 19968: jis0212<<14 | 0x40<<7 | 0x0E,\n\t36771 - 19968: jis0208<<14 | 0x4C<<7 | 0x44,\n\t36772 - 19968: jis0212<<14 | 0x40<<7 | 0x0F,\n\t36773 - 19968: jis0212<<14 | 0x40<<7 | 0x10,\n\t36774 - 19968: jis0212<<14 | 0x40<<7 | 0x11,\n\t36775 - 19968: jis0208<<14 | 0x31<<7 | 0x00,\n\t36776 - 19968: jis0208<<14 | 0x30<<7 | 0x5D,\n\t36781 - 19968: jis0208<<14 | 0x4C<<7 | 0x45,\n\t36782 - 19968: jis0208<<14 | 0x44<<7 | 0x4F,\n\t36783 - 19968: jis0208<<14 | 0x4C<<7 | 0x46,\n\t36784 - 19968: jis0208<<14 | 0x22<<7 | 0x03,\n\t36785 - 19968: jis0208<<14 | 0x1E<<7 | 0x0A,\n\t36786 - 19968: jis0208<<14 | 0x26<<7 | 0x1F,\n\t36789 - 19968: jis0212<<14 | 0x40<<7 | 0x12,\n\t36790 - 19968: jis0212<<14 | 0x40<<7 | 0x13,\n\t36791 - 19968: jis0208<<14 | 0x4C<<7 | 0x47,\n\t36792 - 19968: jis0212<<14 | 0x40<<7 | 0x14,\n\t36794 - 19968: jis0208<<14 | 0x29<<7 | 0x34,\n\t36795 - 19968: jis0208<<14 | 0x23<<7 | 0x33,\n\t36796 - 19968: jis0208<<14 | 0x18<<7 | 0x5D,\n\t36798 - 19968: jis0212<<14 | 0x40<<7 | 0x15,\n\t36799 - 19968: jis0208<<14 | 0x22<<7 | 0x08,\n\t36800 - 19968: jis0212<<14 | 0x40<<7 | 0x16,\n\t36801 - 19968: jis0212<<14 | 0x40<<7 | 0x17,\n\t36802 - 19968: jis0208<<14 | 0x10<<7 | 0x09,\n\t36804 - 19968: jis0208<<14 | 0x2A<<7 | 0x57,\n\t36805 - 19968: jis0208<<14 | 0x1E<<7 | 0x36,\n\t36806 - 19968: jis0212<<14 | 0x40<<7 | 0x18,\n\t36810 - 19968: jis0212<<14 | 0x40<<7 | 0x19,\n\t36811 - 19968: jis0212<<14 | 0x40<<7 | 0x1A,\n\t36813 - 19968: jis0212<<14 | 0x40<<7 | 0x1B,\n\t36814 - 19968: jis0208<<14 | 0x16<<7 | 0x3D,\n\t36816 - 19968: jis0212<<14 | 0x40<<7 | 0x1C,\n\t36817 - 19968: jis0208<<14 | 0x15<<7 | 0x40,\n\t36818 - 19968: jis0212<<14 | 0x40<<7 | 0x1D,\n\t36819 - 19968: jis0212<<14 | 0x40<<7 | 0x1E,\n\t36820 - 19968: jis0208<<14 | 0x29<<7 | 0x35,\n\t36821 - 19968: jis0212<<14 | 0x40<<7 | 0x1F,\n\t36826 - 19968: jis0208<<14 | 0x4C<<7 | 0x48,\n\t36832 - 19968: jis0212<<14 | 0x40<<7 | 0x20,\n\t36834 - 19968: jis0208<<14 | 0x4C<<7 | 0x4A,\n\t36835 - 19968: jis0212<<14 | 0x40<<7 | 0x21,\n\t36836 - 19968: jis0212<<14 | 0x40<<7 | 0x22,\n\t36837 - 19968: jis0208<<14 | 0x4C<<7 | 0x49,\n\t36838 - 19968: jis0208<<14 | 0x11<<7 | 0x3F,\n\t36840 - 19968: jis0212<<14 | 0x40<<7 | 0x23,\n\t36841 - 19968: jis0208<<14 | 0x25<<7 | 0x55,\n\t36842 - 19968: jis0208<<14 | 0x4C<<7 | 0x4B,\n\t36843 - 19968: jis0208<<14 | 0x26<<7 | 0x56,\n\t36845 - 19968: jis0208<<14 | 0x24<<7 | 0x12,\n\t36846 - 19968: jis0212<<14 | 0x40<<7 | 0x24,\n\t36847 - 19968: jis0208<<14 | 0x4C<<7 | 0x4C,\n\t36848 - 19968: jis0208<<14 | 0x1C<<7 | 0x31,\n\t36849 - 19968: jis0212<<14 | 0x40<<7 | 0x25,\n\t36852 - 19968: jis0208<<14 | 0x4C<<7 | 0x4E,\n\t36853 - 19968: jis0212<<14 | 0x40<<7 | 0x26,\n\t36854 - 19968: jis0212<<14 | 0x40<<7 | 0x27,\n\t36855 - 19968: jis0208<<14 | 0x2B<<7 | 0x21,\n\t36856 - 19968: jis0208<<14 | 0x4C<<7 | 0x5D,\n\t36857 - 19968: jis0208<<14 | 0x4C<<7 | 0x50,\n\t36858 - 19968: jis0208<<14 | 0x4C<<7 | 0x51,\n\t36859 - 19968: jis0212<<14 | 0x40<<7 | 0x28,\n\t36861 - 19968: jis0208<<14 | 0x23<<7 | 0x28,\n\t36862 - 19968: jis0212<<14 | 0x40<<7 | 0x29,\n\t36864 - 19968: jis0208<<14 | 0x21<<7 | 0x3F,\n\t36865 - 19968: jis0208<<14 | 0x20<<7 | 0x56,\n\t36866 - 19968: jis0212<<14 | 0x40<<7 | 0x2A,\n\t36867 - 19968: jis0208<<14 | 0x25<<7 | 0x07,\n\t36868 - 19968: jis0212<<14 | 0x40<<7 | 0x2B,\n\t36869 - 19968: jis0208<<14 | 0x4C<<7 | 0x4F,\n\t36870 - 19968: jis0208<<14 | 0x14<<7 | 0x34,\n\t36872 - 19968: jis0212<<14 | 0x40<<7 | 0x2C,\n\t36875 - 19968: jis0208<<14 | 0x4C<<7 | 0x58,\n\t36876 - 19968: jis0212<<14 | 0x40<<7 | 0x2D,\n\t36877 - 19968: jis0208<<14 | 0x4C<<7 | 0x55,\n\t36878 - 19968: jis0208<<14 | 0x4D<<7 | 0x04,\n\t36879 - 19968: jis0208<<14 | 0x25<<7 | 0x08,\n\t36880 - 19968: jis0208<<14 | 0x22<<7 | 0x3F,\n\t36881 - 19968: jis0208<<14 | 0x4C<<7 | 0x52,\n\t36883 - 19968: jis0208<<14 | 0x23<<7 | 0x5D,\n\t36884 - 19968: jis0208<<14 | 0x24<<7 | 0x32,\n\t36885 - 19968: jis0208<<14 | 0x4C<<7 | 0x53,\n\t36886 - 19968: jis0208<<14 | 0x4C<<7 | 0x57,\n\t36887 - 19968: jis0208<<14 | 0x1E<<7 | 0x3F,\n\t36888 - 19968: jis0212<<14 | 0x40<<7 | 0x2E,\n\t36889 - 19968: jis0208<<14 | 0x26<<7 | 0x46,\n\t36890 - 19968: jis0208<<14 | 0x23<<7 | 0x2B,\n\t36891 - 19968: jis0212<<14 | 0x40<<7 | 0x2F,\n\t36893 - 19968: jis0208<<14 | 0x1F<<7 | 0x21,\n\t36894 - 19968: jis0208<<14 | 0x4C<<7 | 0x56,\n\t36895 - 19968: jis0208<<14 | 0x21<<7 | 0x0D,\n\t36896 - 19968: jis0208<<14 | 0x21<<7 | 0x03,\n\t36897 - 19968: jis0208<<14 | 0x4C<<7 | 0x54,\n\t36898 - 19968: jis0208<<14 | 0x0F<<7 | 0x08,\n\t36899 - 19968: jis0208<<14 | 0x2E<<7 | 0x01,\n\t36903 - 19968: jis0208<<14 | 0x4C<<7 | 0x59,\n\t36904 - 19968: jis0212<<14 | 0x40<<7 | 0x30,\n\t36905 - 19968: jis0212<<14 | 0x40<<7 | 0x31,\n\t36906 - 19968: jis0212<<14 | 0x40<<7 | 0x33,\n\t36908 - 19968: jis0212<<14 | 0x40<<7 | 0x34,\n\t36909 - 19968: jis0212<<14 | 0x40<<7 | 0x35,\n\t36910 - 19968: jis0208<<14 | 0x21<<7 | 0x40,\n\t36911 - 19968: jis0212<<14 | 0x40<<7 | 0x32,\n\t36913 - 19968: jis0208<<14 | 0x1C<<7 | 0x14,\n\t36914 - 19968: jis0208<<14 | 0x1E<<7 | 0x29,\n\t36915 - 19968: jis0212<<14 | 0x40<<7 | 0x36,\n\t36916 - 19968: jis0212<<14 | 0x40<<7 | 0x37,\n\t36917 - 19968: jis0208<<14 | 0x4C<<7 | 0x5B,\n\t36918 - 19968: jis0208<<14 | 0x4C<<7 | 0x5A,\n\t36919 - 19968: jis0212<<14 | 0x40<<7 | 0x38,\n\t36920 - 19968: jis0208<<14 | 0x0F<<7 | 0x4E,\n\t36921 - 19968: jis0208<<14 | 0x4C<<7 | 0x5C,\n\t36924 - 19968: jis0208<<14 | 0x28<<7 | 0x0E,\n\t36926 - 19968: jis0208<<14 | 0x4D<<7 | 0x06,\n\t36927 - 19968: jis0212<<14 | 0x40<<7 | 0x39,\n\t36929 - 19968: jis0208<<14 | 0x25<<7 | 0x3A,\n\t36930 - 19968: jis0208<<14 | 0x1E<<7 | 0x4A,\n\t36931 - 19968: jis0212<<14 | 0x40<<7 | 0x3A,\n\t36932 - 19968: jis0212<<14 | 0x40<<7 | 0x3B,\n\t36933 - 19968: jis0208<<14 | 0x22<<7 | 0x38,\n\t36935 - 19968: jis0208<<14 | 0x15<<7 | 0x57,\n\t36937 - 19968: jis0208<<14 | 0x4D<<7 | 0x05,\n\t36938 - 19968: jis0208<<14 | 0x2C<<7 | 0x16,\n\t36939 - 19968: jis0208<<14 | 0x10<<7 | 0x1E,\n\t36940 - 19968: jis0212<<14 | 0x40<<7 | 0x3C,\n\t36941 - 19968: jis0208<<14 | 0x29<<7 | 0x36,\n\t36942 - 19968: jis0208<<14 | 0x11<<7 | 0x40,\n\t36943 - 19968: jis0208<<14 | 0x4D<<7 | 0x00,\n\t36944 - 19968: jis0208<<14 | 0x4D<<7 | 0x01,\n\t36945 - 19968: jis0208<<14 | 0x4D<<7 | 0x02,\n\t36946 - 19968: jis0208<<14 | 0x4D<<7 | 0x03,\n\t36947 - 19968: jis0208<<14 | 0x25<<7 | 0x1A,\n\t36948 - 19968: jis0208<<14 | 0x22<<7 | 0x02,\n\t36949 - 19968: jis0208<<14 | 0x0F<<7 | 0x42,\n\t36950 - 19968: jis0208<<14 | 0x4D<<7 | 0x07,\n\t36952 - 19968: jis0208<<14 | 0x4D<<7 | 0x08,\n\t36953 - 19968: jis0208<<14 | 0x53<<7 | 0x02,\n\t36955 - 19968: jis0212<<14 | 0x40<<7 | 0x3D,\n\t36956 - 19968: jis0208<<14 | 0x21<<7 | 0x1C,\n\t36957 - 19968: jis0212<<14 | 0x40<<7 | 0x3E,\n\t36958 - 19968: jis0208<<14 | 0x4D<<7 | 0x09,\n\t36960 - 19968: jis0208<<14 | 0x10<<7 | 0x52,\n\t36961 - 19968: jis0208<<14 | 0x20<<7 | 0x2B,\n\t36962 - 19968: jis0212<<14 | 0x40<<7 | 0x3F,\n\t36963 - 19968: jis0208<<14 | 0x17<<7 | 0x0E,\n\t36965 - 19968: jis0208<<14 | 0x2C<<7 | 0x39,\n\t36966 - 19968: jis0212<<14 | 0x40<<7 | 0x40,\n\t36967 - 19968: jis0208<<14 | 0x5A<<7 | 0x58,\n\t36968 - 19968: jis0208<<14 | 0x4D<<7 | 0x0A,\n\t36969 - 19968: jis0208<<14 | 0x24<<7 | 0x0B,\n\t36972 - 19968: jis0212<<14 | 0x40<<7 | 0x42,\n\t36973 - 19968: jis0208<<14 | 0x20<<7 | 0x57,\n\t36974 - 19968: jis0208<<14 | 0x1B<<7 | 0x36,\n\t36975 - 19968: jis0208<<14 | 0x4D<<7 | 0x0B,\n\t36976 - 19968: jis0212<<14 | 0x40<<7 | 0x43,\n\t36978 - 19968: jis0208<<14 | 0x4D<<7 | 0x0E,\n\t36980 - 19968: jis0212<<14 | 0x40<<7 | 0x44,\n\t36981 - 19968: jis0208<<14 | 0x1C<<7 | 0x44,\n\t36982 - 19968: jis0208<<14 | 0x4D<<7 | 0x0C,\n\t36983 - 19968: jis0208<<14 | 0x20<<7 | 0x0A,\n\t36984 - 19968: jis0208<<14 | 0x20<<7 | 0x09,\n\t36985 - 19968: jis0212<<14 | 0x40<<7 | 0x45,\n\t36986 - 19968: jis0208<<14 | 0x0F<<7 | 0x43,\n\t36988 - 19968: jis0208<<14 | 0x2D<<7 | 0x2A,\n\t36989 - 19968: jis0208<<14 | 0x4D<<7 | 0x10,\n\t36991 - 19968: jis0208<<14 | 0x27<<7 | 0x51,\n\t36992 - 19968: jis0208<<14 | 0x4D<<7 | 0x12,\n\t36993 - 19968: jis0208<<14 | 0x4D<<7 | 0x11,\n\t36994 - 19968: jis0208<<14 | 0x4D<<7 | 0x0F,\n\t36995 - 19968: jis0208<<14 | 0x42<<7 | 0x43,\n\t36996 - 19968: jis0208<<14 | 0x13<<7 | 0x33,\n\t36997 - 19968: jis0212<<14 | 0x40<<7 | 0x46,\n\t36999 - 19968: jis0208<<14 | 0x4C<<7 | 0x4D,\n\t37000 - 19968: jis0212<<14 | 0x40<<7 | 0x47,\n\t37001 - 19968: jis0208<<14 | 0x4D<<7 | 0x14,\n\t37002 - 19968: jis0208<<14 | 0x4D<<7 | 0x13,\n\t37003 - 19968: jis0212<<14 | 0x40<<7 | 0x48,\n\t37004 - 19968: jis0212<<14 | 0x40<<7 | 0x49,\n\t37006 - 19968: jis0212<<14 | 0x40<<7 | 0x4A,\n\t37007 - 19968: jis0208<<14 | 0x4D<<7 | 0x15,\n\t37008 - 19968: jis0212<<14 | 0x40<<7 | 0x4B,\n\t37009 - 19968: jis0208<<14 | 0x2C<<7 | 0x17,\n\t37013 - 19968: jis0212<<14 | 0x40<<7 | 0x4C,\n\t37015 - 19968: jis0212<<14 | 0x40<<7 | 0x4D,\n\t37016 - 19968: jis0212<<14 | 0x40<<7 | 0x4E,\n\t37017 - 19968: jis0212<<14 | 0x40<<7 | 0x4F,\n\t37019 - 19968: jis0212<<14 | 0x40<<7 | 0x50,\n\t37024 - 19968: jis0212<<14 | 0x40<<7 | 0x51,\n\t37025 - 19968: jis0212<<14 | 0x40<<7 | 0x52,\n\t37026 - 19968: jis0212<<14 | 0x40<<7 | 0x53,\n\t37027 - 19968: jis0208<<14 | 0x25<<7 | 0x40,\n\t37029 - 19968: jis0212<<14 | 0x40<<7 | 0x54,\n\t37030 - 19968: jis0208<<14 | 0x2A<<7 | 0x0D,\n\t37032 - 19968: jis0208<<14 | 0x4D<<7 | 0x16,\n\t37034 - 19968: jis0208<<14 | 0x1B<<7 | 0x38,\n\t37039 - 19968: jis0208<<14 | 0x4D<<7 | 0x17,\n\t37040 - 19968: jis0212<<14 | 0x40<<7 | 0x55,\n\t37041 - 19968: jis0208<<14 | 0x4D<<7 | 0x18,\n\t37042 - 19968: jis0212<<14 | 0x40<<7 | 0x56,\n\t37043 - 19968: jis0212<<14 | 0x40<<7 | 0x57,\n\t37044 - 19968: jis0212<<14 | 0x40<<7 | 0x58,\n\t37045 - 19968: jis0208<<14 | 0x4D<<7 | 0x19,\n\t37046 - 19968: jis0212<<14 | 0x40<<7 | 0x59,\n\t37048 - 19968: jis0208<<14 | 0x24<<7 | 0x00,\n\t37053 - 19968: jis0212<<14 | 0x40<<7 | 0x5A,\n\t37054 - 19968: jis0212<<14 | 0x40<<7 | 0x5C,\n\t37057 - 19968: jis0208<<14 | 0x0F<<7 | 0x49,\n\t37059 - 19968: jis0212<<14 | 0x40<<7 | 0x5D,\n\t37060 - 19968: jis0212<<14 | 0x41<<7 | 0x00,\n\t37061 - 19968: jis0212<<14 | 0x41<<7 | 0x01,\n\t37063 - 19968: jis0212<<14 | 0x41<<7 | 0x02,\n\t37064 - 19968: jis0212<<14 | 0x41<<7 | 0x03,\n\t37066 - 19968: jis0208<<14 | 0x18<<7 | 0x38,\n\t37068 - 19968: jis0212<<14 | 0x40<<7 | 0x5B,\n\t37070 - 19968: jis0208<<14 | 0x2E<<7 | 0x19,\n\t37074 - 19968: jis0212<<14 | 0x41<<7 | 0x0C,\n\t37077 - 19968: jis0212<<14 | 0x41<<7 | 0x04,\n\t37079 - 19968: jis0212<<14 | 0x41<<7 | 0x05,\n\t37080 - 19968: jis0212<<14 | 0x41<<7 | 0x06,\n\t37081 - 19968: jis0212<<14 | 0x41<<7 | 0x07,\n\t37083 - 19968: jis0208<<14 | 0x4D<<7 | 0x1D,\n\t37084 - 19968: jis0212<<14 | 0x41<<7 | 0x08,\n\t37085 - 19968: jis0212<<14 | 0x41<<7 | 0x09,\n\t37086 - 19968: jis0208<<14 | 0x5A<<7 | 0x59,\n\t37087 - 19968: jis0212<<14 | 0x41<<7 | 0x0A,\n\t37089 - 19968: jis0208<<14 | 0x16<<7 | 0x13,\n\t37090 - 19968: jis0208<<14 | 0x4D<<7 | 0x1A,\n\t37092 - 19968: jis0208<<14 | 0x4D<<7 | 0x1B,\n\t37093 - 19968: jis0212<<14 | 0x41<<7 | 0x0B,\n\t37096 - 19968: jis0208<<14 | 0x28<<7 | 0x53,\n\t37099 - 19968: jis0212<<14 | 0x41<<7 | 0x0E,\n\t37101 - 19968: jis0208<<14 | 0x12<<7 | 0x33,\n\t37103 - 19968: jis0212<<14 | 0x41<<7 | 0x0F,\n\t37104 - 19968: jis0212<<14 | 0x41<<7 | 0x10,\n\t37108 - 19968: jis0212<<14 | 0x41<<7 | 0x11,\n\t37109 - 19968: jis0208<<14 | 0x2C<<7 | 0x18,\n\t37110 - 19968: jis0212<<14 | 0x41<<7 | 0x0D,\n\t37111 - 19968: jis0208<<14 | 0x15<<7 | 0x1E,\n\t37117 - 19968: jis0208<<14 | 0x24<<7 | 0x33,\n\t37118 - 19968: jis0212<<14 | 0x41<<7 | 0x12,\n\t37119 - 19968: jis0212<<14 | 0x41<<7 | 0x13,\n\t37120 - 19968: jis0212<<14 | 0x41<<7 | 0x14,\n\t37122 - 19968: jis0208<<14 | 0x4D<<7 | 0x1E,\n\t37124 - 19968: jis0212<<14 | 0x41<<7 | 0x15,\n\t37125 - 19968: jis0212<<14 | 0x41<<7 | 0x16,\n\t37126 - 19968: jis0212<<14 | 0x41<<7 | 0x17,\n\t37128 - 19968: jis0212<<14 | 0x41<<7 | 0x18,\n\t37133 - 19968: jis0212<<14 | 0x41<<7 | 0x19,\n\t37136 - 19968: jis0212<<14 | 0x41<<7 | 0x1A,\n\t37138 - 19968: jis0208<<14 | 0x4D<<7 | 0x1F,\n\t37140 - 19968: jis0212<<14 | 0x41<<7 | 0x1B,\n\t37141 - 19968: jis0208<<14 | 0x5A<<7 | 0x5B,\n\t37142 - 19968: jis0212<<14 | 0x41<<7 | 0x1C,\n\t37143 - 19968: jis0212<<14 | 0x41<<7 | 0x1D,\n\t37144 - 19968: jis0212<<14 | 0x41<<7 | 0x1E,\n\t37145 - 19968: jis0208<<14 | 0x4D<<7 | 0x20,\n\t37146 - 19968: jis0212<<14 | 0x41<<7 | 0x1F,\n\t37148 - 19968: jis0212<<14 | 0x41<<7 | 0x20,\n\t37150 - 19968: jis0212<<14 | 0x41<<7 | 0x21,\n\t37152 - 19968: jis0212<<14 | 0x41<<7 | 0x22,\n\t37154 - 19968: jis0212<<14 | 0x41<<7 | 0x24,\n\t37155 - 19968: jis0212<<14 | 0x41<<7 | 0x25,\n\t37157 - 19968: jis0212<<14 | 0x41<<7 | 0x23,\n\t37159 - 19968: jis0208<<14 | 0x5A<<7 | 0x5C,\n\t37161 - 19968: jis0212<<14 | 0x41<<7 | 0x27,\n\t37165 - 19968: jis0208<<14 | 0x24<<7 | 0x01,\n\t37166 - 19968: jis0212<<14 | 0x41<<7 | 0x28,\n\t37167 - 19968: jis0212<<14 | 0x41<<7 | 0x29,\n\t37168 - 19968: jis0208<<14 | 0x4D<<7 | 0x22,\n\t37169 - 19968: jis0212<<14 | 0x41<<7 | 0x2A,\n\t37170 - 19968: jis0208<<14 | 0x4D<<7 | 0x21,\n\t37172 - 19968: jis0212<<14 | 0x41<<7 | 0x2B,\n\t37174 - 19968: jis0212<<14 | 0x41<<7 | 0x2C,\n\t37175 - 19968: jis0212<<14 | 0x41<<7 | 0x2D,\n\t37177 - 19968: jis0212<<14 | 0x41<<7 | 0x2E,\n\t37178 - 19968: jis0212<<14 | 0x41<<7 | 0x2F,\n\t37180 - 19968: jis0212<<14 | 0x41<<7 | 0x30,\n\t37181 - 19968: jis0212<<14 | 0x41<<7 | 0x31,\n\t37187 - 19968: jis0212<<14 | 0x41<<7 | 0x32,\n\t37191 - 19968: jis0212<<14 | 0x41<<7 | 0x33,\n\t37192 - 19968: jis0212<<14 | 0x41<<7 | 0x34,\n\t37193 - 19968: jis0208<<14 | 0x25<<7 | 0x32,\n\t37194 - 19968: jis0208<<14 | 0x4D<<7 | 0x23,\n\t37195 - 19968: jis0208<<14 | 0x1C<<7 | 0x15,\n\t37196 - 19968: jis0208<<14 | 0x1B<<7 | 0x3F,\n\t37197 - 19968: jis0208<<14 | 0x26<<7 | 0x3A,\n\t37198 - 19968: jis0208<<14 | 0x22<<7 | 0x50,\n\t37199 - 19968: jis0212<<14 | 0x41<<7 | 0x35,\n\t37202 - 19968: jis0208<<14 | 0x1B<<7 | 0x51,\n\t37203 - 19968: jis0212<<14 | 0x41<<7 | 0x36,\n\t37204 - 19968: jis0208<<14 | 0x1E<<7 | 0x4B,\n\t37206 - 19968: jis0208<<14 | 0x4D<<7 | 0x24,\n\t37207 - 19968: jis0212<<14 | 0x41<<7 | 0x37,\n\t37208 - 19968: jis0208<<14 | 0x4D<<7 | 0x25,\n\t37209 - 19968: jis0212<<14 | 0x41<<7 | 0x38,\n\t37210 - 19968: jis0212<<14 | 0x41<<7 | 0x39,\n\t37211 - 19968: jis0212<<14 | 0x41<<7 | 0x3A,\n\t37217 - 19968: jis0212<<14 | 0x41<<7 | 0x3B,\n\t37218 - 19968: jis0208<<14 | 0x1E<<7 | 0x3C,\n\t37219 - 19968: jis0208<<14 | 0x4D<<7 | 0x26,\n\t37220 - 19968: jis0212<<14 | 0x41<<7 | 0x3C,\n\t37221 - 19968: jis0208<<14 | 0x4D<<7 | 0x27,\n\t37223 - 19968: jis0212<<14 | 0x41<<7 | 0x3D,\n\t37225 - 19968: jis0208<<14 | 0x4D<<7 | 0x28,\n\t37226 - 19968: jis0208<<14 | 0x2C<<7 | 0x4E,\n\t37228 - 19968: jis0208<<14 | 0x1C<<7 | 0x16,\n\t37229 - 19968: jis0212<<14 | 0x41<<7 | 0x3E,\n\t37234 - 19968: jis0208<<14 | 0x4D<<7 | 0x2A,\n\t37235 - 19968: jis0208<<14 | 0x4D<<7 | 0x29,\n\t37236 - 19968: jis0212<<14 | 0x41<<7 | 0x3F,\n\t37237 - 19968: jis0208<<14 | 0x18<<7 | 0x39,\n\t37239 - 19968: jis0208<<14 | 0x18<<7 | 0x52,\n\t37240 - 19968: jis0208<<14 | 0x1A<<7 | 0x1F,\n\t37241 - 19968: jis0212<<14 | 0x41<<7 | 0x40,\n\t37242 - 19968: jis0212<<14 | 0x41<<7 | 0x41,\n\t37243 - 19968: jis0212<<14 | 0x41<<7 | 0x42,\n\t37249 - 19968: jis0212<<14 | 0x41<<7 | 0x43,\n\t37250 - 19968: jis0208<<14 | 0x4D<<7 | 0x2D,\n\t37251 - 19968: jis0212<<14 | 0x41<<7 | 0x44,\n\t37253 - 19968: jis0212<<14 | 0x41<<7 | 0x45,\n\t37254 - 19968: jis0212<<14 | 0x41<<7 | 0x46,\n\t37255 - 19968: jis0208<<14 | 0x1C<<7 | 0x45,\n\t37257 - 19968: jis0208<<14 | 0x4D<<7 | 0x2C,\n\t37258 - 19968: jis0212<<14 | 0x41<<7 | 0x47,\n\t37259 - 19968: jis0208<<14 | 0x4D<<7 | 0x2B,\n\t37261 - 19968: jis0208<<14 | 0x21<<7 | 0x48,\n\t37262 - 19968: jis0212<<14 | 0x41<<7 | 0x48,\n\t37264 - 19968: jis0208<<14 | 0x17<<7 | 0x4E,\n\t37265 - 19968: jis0212<<14 | 0x41<<7 | 0x49,\n\t37266 - 19968: jis0208<<14 | 0x1F<<7 | 0x22,\n\t37267 - 19968: jis0212<<14 | 0x41<<7 | 0x4A,\n\t37268 - 19968: jis0212<<14 | 0x41<<7 | 0x4B,\n\t37269 - 19968: jis0212<<14 | 0x41<<7 | 0x4C,\n\t37271 - 19968: jis0208<<14 | 0x27<<7 | 0x0F,\n\t37272 - 19968: jis0212<<14 | 0x41<<7 | 0x4D,\n\t37276 - 19968: jis0208<<14 | 0x1C<<7 | 0x18,\n\t37278 - 19968: jis0212<<14 | 0x41<<7 | 0x4E,\n\t37281 - 19968: jis0212<<14 | 0x41<<7 | 0x4F,\n\t37282 - 19968: jis0208<<14 | 0x4D<<7 | 0x2E,\n\t37284 - 19968: jis0208<<14 | 0x1D<<7 | 0x3E,\n\t37286 - 19968: jis0212<<14 | 0x41<<7 | 0x50,\n\t37288 - 19968: jis0212<<14 | 0x41<<7 | 0x51,\n\t37290 - 19968: jis0208<<14 | 0x4D<<7 | 0x31,\n\t37291 - 19968: jis0208<<14 | 0x4D<<7 | 0x2F,\n\t37292 - 19968: jis0212<<14 | 0x41<<7 | 0x52,\n\t37293 - 19968: jis0212<<14 | 0x41<<7 | 0x53,\n\t37294 - 19968: jis0212<<14 | 0x41<<7 | 0x54,\n\t37295 - 19968: jis0208<<14 | 0x4D<<7 | 0x30,\n\t37296 - 19968: jis0212<<14 | 0x41<<7 | 0x55,\n\t37297 - 19968: jis0212<<14 | 0x41<<7 | 0x56,\n\t37298 - 19968: jis0212<<14 | 0x41<<7 | 0x57,\n\t37299 - 19968: jis0212<<14 | 0x41<<7 | 0x58,\n\t37300 - 19968: jis0208<<14 | 0x4D<<7 | 0x33,\n\t37301 - 19968: jis0208<<14 | 0x4D<<7 | 0x32,\n\t37302 - 19968: jis0212<<14 | 0x41<<7 | 0x59,\n\t37304 - 19968: jis0208<<14 | 0x1D<<7 | 0x59,\n\t37306 - 19968: jis0208<<14 | 0x4D<<7 | 0x34,\n\t37307 - 19968: jis0212<<14 | 0x41<<7 | 0x5A,\n\t37308 - 19968: jis0212<<14 | 0x41<<7 | 0x5B,\n\t37309 - 19968: jis0212<<14 | 0x41<<7 | 0x5C,\n\t37311 - 19968: jis0212<<14 | 0x41<<7 | 0x5D,\n\t37312 - 19968: jis0208<<14 | 0x4D<<7 | 0x35,\n\t37313 - 19968: jis0208<<14 | 0x4D<<7 | 0x36,\n\t37314 - 19968: jis0212<<14 | 0x42<<7 | 0x00,\n\t37315 - 19968: jis0212<<14 | 0x42<<7 | 0x01,\n\t37317 - 19968: jis0212<<14 | 0x42<<7 | 0x02,\n\t37318 - 19968: jis0208<<14 | 0x27<<7 | 0x2F,\n\t37319 - 19968: jis0208<<14 | 0x19<<7 | 0x32,\n\t37320 - 19968: jis0208<<14 | 0x1B<<7 | 0x40,\n\t37321 - 19968: jis0208<<14 | 0x4D<<7 | 0x37,\n\t37323 - 19968: jis0208<<14 | 0x4D<<7 | 0x38,\n\t37324 - 19968: jis0208<<14 | 0x2D<<7 | 0x03,\n\t37325 - 19968: jis0208<<14 | 0x1C<<7 | 0x24,\n\t37326 - 19968: jis0208<<14 | 0x2B<<7 | 0x4D,\n\t37327 - 19968: jis0208<<14 | 0x2D<<7 | 0x2B,\n\t37328 - 19968: jis0208<<14 | 0x4D<<7 | 0x39,\n\t37329 - 19968: jis0208<<14 | 0x15<<7 | 0x41,\n\t37331 - 19968: jis0212<<14 | 0x42<<7 | 0x03,\n\t37332 - 19968: jis0212<<14 | 0x42<<7 | 0x04,\n\t37334 - 19968: jis0208<<14 | 0x4D<<7 | 0x3A,\n\t37335 - 19968: jis0208<<14 | 0x5B<<7 | 0x00,\n\t37336 - 19968: jis0208<<14 | 0x24<<7 | 0x02,\n\t37337 - 19968: jis0212<<14 | 0x42<<7 | 0x06,\n\t37338 - 19968: jis0208<<14 | 0x5A<<7 | 0x5D,\n\t37339 - 19968: jis0208<<14 | 0x4D<<7 | 0x3D,\n\t37340 - 19968: jis0208<<14 | 0x12<<7 | 0x57,\n\t37341 - 19968: jis0208<<14 | 0x1E<<7 | 0x2A,\n\t37342 - 19968: jis0208<<14 | 0x5B<<7 | 0x01,\n\t37343 - 19968: jis0208<<14 | 0x4D<<7 | 0x3B,\n\t37345 - 19968: jis0208<<14 | 0x4D<<7 | 0x3C,\n\t37347 - 19968: jis0208<<14 | 0x23<<7 | 0x3F,\n\t37348 - 19968: jis0208<<14 | 0x5B<<7 | 0x04,\n\t37349 - 19968: jis0208<<14 | 0x5B<<7 | 0x05,\n\t37350 - 19968: jis0208<<14 | 0x2A<<7 | 0x34,\n\t37351 - 19968: jis0208<<14 | 0x15<<7 | 0x5B,\n\t37353 - 19968: jis0212<<14 | 0x42<<7 | 0x0B,\n\t37354 - 19968: jis0212<<14 | 0x42<<7 | 0x0C,\n\t37356 - 19968: jis0212<<14 | 0x42<<7 | 0x0D,\n\t37357 - 19968: jis0208<<14 | 0x5B<<7 | 0x02,\n\t37358 - 19968: jis0208<<14 | 0x5B<<7 | 0x03,\n\t37359 - 19968: jis0212<<14 | 0x42<<7 | 0x10,\n\t37360 - 19968: jis0212<<14 | 0x42<<7 | 0x11,\n\t37361 - 19968: jis0212<<14 | 0x42<<7 | 0x12,\n\t37365 - 19968: jis0208<<14 | 0x4D<<7 | 0x3F,\n\t37366 - 19968: jis0208<<14 | 0x4D<<7 | 0x40,\n\t37367 - 19968: jis0212<<14 | 0x42<<7 | 0x13,\n\t37369 - 19968: jis0212<<14 | 0x42<<7 | 0x14,\n\t37371 - 19968: jis0212<<14 | 0x42<<7 | 0x15,\n\t37372 - 19968: jis0208<<14 | 0x4D<<7 | 0x3E,\n\t37373 - 19968: jis0212<<14 | 0x42<<7 | 0x16,\n\t37375 - 19968: jis0208<<14 | 0x4D<<7 | 0x42,\n\t37376 - 19968: jis0212<<14 | 0x42<<7 | 0x17,\n\t37377 - 19968: jis0212<<14 | 0x42<<7 | 0x18,\n\t37380 - 19968: jis0212<<14 | 0x42<<7 | 0x19,\n\t37381 - 19968: jis0212<<14 | 0x42<<7 | 0x1A,\n\t37382 - 19968: jis0208<<14 | 0x5B<<7 | 0x06,\n\t37383 - 19968: jis0212<<14 | 0x42<<7 | 0x1C,\n\t37385 - 19968: jis0212<<14 | 0x42<<7 | 0x1D,\n\t37386 - 19968: jis0208<<14 | 0x5B<<7 | 0x08,\n\t37388 - 19968: jis0212<<14 | 0x42<<7 | 0x1F,\n\t37389 - 19968: jis0208<<14 | 0x25<<7 | 0x3E,\n\t37390 - 19968: jis0208<<14 | 0x12<<7 | 0x22,\n\t37392 - 19968: jis0208<<14 | 0x5B<<7 | 0x07,\n\t37393 - 19968: jis0208<<14 | 0x4D<<7 | 0x46,\n\t37394 - 19968: jis0212<<14 | 0x42<<7 | 0x21,\n\t37395 - 19968: jis0212<<14 | 0x42<<7 | 0x22,\n\t37396 - 19968: jis0208<<14 | 0x4D<<7 | 0x43,\n\t37397 - 19968: jis0208<<14 | 0x4D<<7 | 0x45,\n\t37398 - 19968: jis0212<<14 | 0x42<<7 | 0x23,\n\t37400 - 19968: jis0212<<14 | 0x42<<7 | 0x24,\n\t37404 - 19968: jis0212<<14 | 0x42<<7 | 0x25,\n\t37405 - 19968: jis0212<<14 | 0x42<<7 | 0x26,\n\t37406 - 19968: jis0208<<14 | 0x4D<<7 | 0x41,\n\t37411 - 19968: jis0212<<14 | 0x42<<7 | 0x27,\n\t37412 - 19968: jis0212<<14 | 0x42<<7 | 0x28,\n\t37413 - 19968: jis0212<<14 | 0x42<<7 | 0x29,\n\t37414 - 19968: jis0212<<14 | 0x42<<7 | 0x2A,\n\t37416 - 19968: jis0212<<14 | 0x42<<7 | 0x2B,\n\t37417 - 19968: jis0208<<14 | 0x4E<<7 | 0x2E,\n\t37420 - 19968: jis0208<<14 | 0x4D<<7 | 0x44,\n\t37422 - 19968: jis0212<<14 | 0x42<<7 | 0x2C,\n\t37423 - 19968: jis0212<<14 | 0x42<<7 | 0x2D,\n\t37424 - 19968: jis0212<<14 | 0x42<<7 | 0x2E,\n\t37427 - 19968: jis0212<<14 | 0x42<<7 | 0x2F,\n\t37428 - 19968: jis0208<<14 | 0x2D<<7 | 0x4A,\n\t37429 - 19968: jis0212<<14 | 0x42<<7 | 0x30,\n\t37430 - 19968: jis0212<<14 | 0x42<<7 | 0x31,\n\t37431 - 19968: jis0208<<14 | 0x17<<7 | 0x39,\n\t37432 - 19968: jis0212<<14 | 0x42<<7 | 0x32,\n\t37433 - 19968: jis0208<<14 | 0x5B<<7 | 0x0F,\n\t37434 - 19968: jis0208<<14 | 0x5B<<7 | 0x09,\n\t37436 - 19968: jis0208<<14 | 0x5B<<7 | 0x0B,\n\t37438 - 19968: jis0212<<14 | 0x42<<7 | 0x36,\n\t37439 - 19968: jis0208<<14 | 0x4D<<7 | 0x4E,\n\t37440 - 19968: jis0208<<14 | 0x5B<<7 | 0x0A,\n\t37442 - 19968: jis0212<<14 | 0x42<<7 | 0x38,\n\t37443 - 19968: jis0212<<14 | 0x42<<7 | 0x39,\n\t37444 - 19968: jis0208<<14 | 0x24<<7 | 0x13,\n\t37445 - 19968: jis0208<<14 | 0x4D<<7 | 0x49,\n\t37446 - 19968: jis0212<<14 | 0x42<<7 | 0x3A,\n\t37447 - 19968: jis0212<<14 | 0x42<<7 | 0x3B,\n\t37448 - 19968: jis0208<<14 | 0x4D<<7 | 0x4C,\n\t37449 - 19968: jis0208<<14 | 0x4D<<7 | 0x4A,\n\t37450 - 19968: jis0212<<14 | 0x42<<7 | 0x3C,\n\t37451 - 19968: jis0208<<14 | 0x4D<<7 | 0x4F,\n\t37453 - 19968: jis0212<<14 | 0x42<<7 | 0x3D,\n\t37454 - 19968: jis0208<<14 | 0x5B<<7 | 0x0C,\n\t37455 - 19968: jis0212<<14 | 0x42<<7 | 0x3F,\n\t37456 - 19968: jis0208<<14 | 0x4D<<7 | 0x50,\n\t37457 - 19968: jis0208<<14 | 0x5B<<7 | 0x0E,\n\t37463 - 19968: jis0208<<14 | 0x4D<<7 | 0x48,\n\t37464 - 19968: jis0212<<14 | 0x42<<7 | 0x41,\n\t37465 - 19968: jis0208<<14 | 0x5B<<7 | 0x0D,\n\t37466 - 19968: jis0208<<14 | 0x4D<<7 | 0x55,\n\t37467 - 19968: jis0208<<14 | 0x10<<7 | 0x53,\n\t37468 - 19968: jis0212<<14 | 0x42<<7 | 0x43,\n\t37469 - 19968: jis0212<<14 | 0x42<<7 | 0x44,\n\t37470 - 19968: jis0208<<14 | 0x4D<<7 | 0x47,\n\t37472 - 19968: jis0212<<14 | 0x42<<7 | 0x45,\n\t37473 - 19968: jis0212<<14 | 0x42<<7 | 0x46,\n\t37474 - 19968: jis0208<<14 | 0x27<<7 | 0x0C,\n\t37476 - 19968: jis0208<<14 | 0x4D<<7 | 0x4B,\n\t37477 - 19968: jis0212<<14 | 0x42<<7 | 0x47,\n\t37478 - 19968: jis0208<<14 | 0x1D<<7 | 0x3F,\n\t37479 - 19968: jis0208<<14 | 0x5B<<7 | 0x10,\n\t37480 - 19968: jis0212<<14 | 0x42<<7 | 0x49,\n\t37481 - 19968: jis0212<<14 | 0x42<<7 | 0x4A,\n\t37486 - 19968: jis0212<<14 | 0x42<<7 | 0x4B,\n\t37487 - 19968: jis0212<<14 | 0x42<<7 | 0x4C,\n\t37488 - 19968: jis0212<<14 | 0x42<<7 | 0x4D,\n\t37489 - 19968: jis0208<<14 | 0x18<<7 | 0x3A,\n\t37493 - 19968: jis0212<<14 | 0x42<<7 | 0x4E,\n\t37494 - 19968: jis0212<<14 | 0x42<<7 | 0x4F,\n\t37495 - 19968: jis0208<<14 | 0x5B<<7 | 0x12,\n\t37496 - 19968: jis0208<<14 | 0x5B<<7 | 0x13,\n\t37497 - 19968: jis0212<<14 | 0x42<<7 | 0x52,\n\t37499 - 19968: jis0212<<14 | 0x42<<7 | 0x53,\n\t37500 - 19968: jis0212<<14 | 0x42<<7 | 0x54,\n\t37501 - 19968: jis0212<<14 | 0x42<<7 | 0x55,\n\t37502 - 19968: jis0208<<14 | 0x2A<<7 | 0x27,\n\t37503 - 19968: jis0212<<14 | 0x42<<7 | 0x56,\n\t37504 - 19968: jis0208<<14 | 0x15<<7 | 0x43,\n\t37507 - 19968: jis0208<<14 | 0x1C<<7 | 0x25,\n\t37509 - 19968: jis0208<<14 | 0x25<<7 | 0x1B,\n\t37512 - 19968: jis0208<<14 | 0x58<<7 | 0x03,\n\t37513 - 19968: jis0212<<14 | 0x42<<7 | 0x58,\n\t37514 - 19968: jis0212<<14 | 0x42<<7 | 0x59,\n\t37517 - 19968: jis0212<<14 | 0x42<<7 | 0x5A,\n\t37518 - 19968: jis0212<<14 | 0x42<<7 | 0x5B,\n\t37521 - 19968: jis0208<<14 | 0x20<<7 | 0x0C,\n\t37522 - 19968: jis0212<<14 | 0x42<<7 | 0x5C,\n\t37523 - 19968: jis0208<<14 | 0x4D<<7 | 0x53,\n\t37525 - 19968: jis0208<<14 | 0x4D<<7 | 0x4D,\n\t37526 - 19968: jis0208<<14 | 0x4D<<7 | 0x52,\n\t37527 - 19968: jis0212<<14 | 0x42<<7 | 0x5D,\n\t37528 - 19968: jis0208<<14 | 0x2B<<7 | 0x22,\n\t37529 - 19968: jis0212<<14 | 0x43<<7 | 0x00,\n\t37530 - 19968: jis0208<<14 | 0x23<<7 | 0x17,\n\t37531 - 19968: jis0208<<14 | 0x4D<<7 | 0x54,\n\t37532 - 19968: jis0208<<14 | 0x4D<<7 | 0x51,\n\t37535 - 19968: jis0212<<14 | 0x43<<7 | 0x01,\n\t37536 - 19968: jis0212<<14 | 0x43<<7 | 0x02,\n\t37540 - 19968: jis0212<<14 | 0x43<<7 | 0x03,\n\t37541 - 19968: jis0212<<14 | 0x43<<7 | 0x04,\n\t37543 - 19968: jis0208<<14 | 0x5B<<7 | 0x11,\n\t37544 - 19968: jis0212<<14 | 0x43<<7 | 0x06,\n\t37547 - 19968: jis0212<<14 | 0x43<<7 | 0x07,\n\t37549 - 19968: jis0208<<14 | 0x20<<7 | 0x0B,\n\t37551 - 19968: jis0212<<14 | 0x43<<7 | 0x08,\n\t37554 - 19968: jis0212<<14 | 0x43<<7 | 0x09,\n\t37558 - 19968: jis0212<<14 | 0x43<<7 | 0x0A,\n\t37559 - 19968: jis0208<<14 | 0x4D<<7 | 0x58,\n\t37560 - 19968: jis0212<<14 | 0x43<<7 | 0x0B,\n\t37561 - 19968: jis0208<<14 | 0x4D<<7 | 0x57,\n\t37562 - 19968: jis0212<<14 | 0x43<<7 | 0x0C,\n\t37563 - 19968: jis0212<<14 | 0x43<<7 | 0x0D,\n\t37564 - 19968: jis0212<<14 | 0x43<<7 | 0x0E,\n\t37565 - 19968: jis0212<<14 | 0x43<<7 | 0x0F,\n\t37567 - 19968: jis0212<<14 | 0x43<<7 | 0x10,\n\t37568 - 19968: jis0212<<14 | 0x43<<7 | 0x11,\n\t37569 - 19968: jis0212<<14 | 0x43<<7 | 0x12,\n\t37570 - 19968: jis0212<<14 | 0x43<<7 | 0x13,\n\t37571 - 19968: jis0212<<14 | 0x43<<7 | 0x14,\n\t37573 - 19968: jis0212<<14 | 0x43<<7 | 0x15,\n\t37574 - 19968: jis0212<<14 | 0x43<<7 | 0x16,\n\t37575 - 19968: jis0212<<14 | 0x43<<7 | 0x17,\n\t37576 - 19968: jis0212<<14 | 0x43<<7 | 0x18,\n\t37579 - 19968: jis0212<<14 | 0x43<<7 | 0x19,\n\t37580 - 19968: jis0212<<14 | 0x43<<7 | 0x1A,\n\t37581 - 19968: jis0212<<14 | 0x43<<7 | 0x1B,\n\t37582 - 19968: jis0212<<14 | 0x43<<7 | 0x1C,\n\t37583 - 19968: jis0208<<14 | 0x4D<<7 | 0x56,\n\t37584 - 19968: jis0208<<14 | 0x5B<<7 | 0x17,\n\t37586 - 19968: jis0208<<14 | 0x2A<<7 | 0x0E,\n\t37587 - 19968: jis0208<<14 | 0x5B<<7 | 0x1B,\n\t37589 - 19968: jis0208<<14 | 0x5B<<7 | 0x19,\n\t37591 - 19968: jis0208<<14 | 0x5B<<7 | 0x15,\n\t37592 - 19968: jis0212<<14 | 0x43<<7 | 0x21,\n\t37593 - 19968: jis0208<<14 | 0x5B<<7 | 0x16,\n\t37596 - 19968: jis0212<<14 | 0x43<<7 | 0x23,\n\t37597 - 19968: jis0212<<14 | 0x43<<7 | 0x24,\n\t37599 - 19968: jis0212<<14 | 0x43<<7 | 0x25,\n\t37600 - 19968: jis0208<<14 | 0x5B<<7 | 0x1A,\n\t37601 - 19968: jis0212<<14 | 0x43<<7 | 0x27,\n\t37603 - 19968: jis0212<<14 | 0x43<<7 | 0x28,\n\t37604 - 19968: jis0208<<14 | 0x1C<<7 | 0x5A,\n\t37605 - 19968: jis0212<<14 | 0x43<<7 | 0x29,\n\t37607 - 19968: jis0208<<14 | 0x5B<<7 | 0x14,\n\t37608 - 19968: jis0212<<14 | 0x43<<7 | 0x2B,\n\t37609 - 19968: jis0208<<14 | 0x4D<<7 | 0x59,\n\t37610 - 19968: jis0208<<14 | 0x29<<7 | 0x3E,\n\t37612 - 19968: jis0212<<14 | 0x43<<7 | 0x2C,\n\t37613 - 19968: jis0208<<14 | 0x10<<7 | 0x33,\n\t37614 - 19968: jis0212<<14 | 0x43<<7 | 0x2D,\n\t37616 - 19968: jis0212<<14 | 0x43<<7 | 0x2E,\n\t37618 - 19968: jis0208<<14 | 0x28<<7 | 0x25,\n\t37619 - 19968: jis0208<<14 | 0x22<<7 | 0x51,\n\t37624 - 19968: jis0208<<14 | 0x14<<7 | 0x57,\n\t37625 - 19968: jis0208<<14 | 0x58<<7 | 0x09,\n\t37626 - 19968: jis0208<<14 | 0x4D<<7 | 0x5B,\n\t37627 - 19968: jis0208<<14 | 0x5B<<7 | 0x1E,\n\t37628 - 19968: jis0208<<14 | 0x18<<7 | 0x3C,\n\t37631 - 19968: jis0208<<14 | 0x5B<<7 | 0x21,\n\t37632 - 19968: jis0212<<14 | 0x43<<7 | 0x32,\n\t37634 - 19968: jis0208<<14 | 0x5B<<7 | 0x23,\n\t37638 - 19968: jis0208<<14 | 0x1A<<7 | 0x0B,\n\t37640 - 19968: jis0212<<14 | 0x43<<7 | 0x34,\n\t37645 - 19968: jis0212<<14 | 0x43<<7 | 0x35,\n\t37647 - 19968: jis0208<<14 | 0x4D<<7 | 0x5A,\n\t37648 - 19968: jis0208<<14 | 0x1E<<7 | 0x4C,\n\t37649 - 19968: jis0212<<14 | 0x43<<7 | 0x36,\n\t37652 - 19968: jis0212<<14 | 0x43<<7 | 0x37,\n\t37653 - 19968: jis0212<<14 | 0x43<<7 | 0x38,\n\t37656 - 19968: jis0208<<14 | 0x1E<<7 | 0x4D,\n\t37657 - 19968: jis0208<<14 | 0x4E<<7 | 0x00,\n\t37658 - 19968: jis0208<<14 | 0x4E<<7 | 0x02,\n\t37660 - 19968: jis0212<<14 | 0x43<<7 | 0x39,\n\t37661 - 19968: jis0208<<14 | 0x5B<<7 | 0x22,\n\t37662 - 19968: jis0208<<14 | 0x5B<<7 | 0x20,\n\t37663 - 19968: jis0212<<14 | 0x43<<7 | 0x3C,\n\t37664 - 19968: jis0208<<14 | 0x1D<<7 | 0x5A,\n\t37665 - 19968: jis0208<<14 | 0x5B<<7 | 0x1D,\n\t37666 - 19968: jis0208<<14 | 0x4E<<7 | 0x01,\n\t37667 - 19968: jis0208<<14 | 0x4E<<7 | 0x03,\n\t37668 - 19968: jis0212<<14 | 0x43<<7 | 0x3E,\n\t37669 - 19968: jis0208<<14 | 0x5B<<7 | 0x1C,\n\t37670 - 19968: jis0208<<14 | 0x15<<7 | 0x32,\n\t37671 - 19968: jis0212<<14 | 0x43<<7 | 0x40,\n\t37672 - 19968: jis0208<<14 | 0x28<<7 | 0x24,\n\t37673 - 19968: jis0212<<14 | 0x43<<7 | 0x41,\n\t37674 - 19968: jis0212<<14 | 0x43<<7 | 0x42,\n\t37675 - 19968: jis0208<<14 | 0x1B<<7 | 0x41,\n\t37676 - 19968: jis0208<<14 | 0x2E<<7 | 0x02,\n\t37678 - 19968: jis0208<<14 | 0x4D<<7 | 0x5D,\n\t37679 - 19968: jis0208<<14 | 0x19<<7 | 0x57,\n\t37682 - 19968: jis0208<<14 | 0x2E<<7 | 0x1E,\n\t37683 - 19968: jis0212<<14 | 0x43<<7 | 0x43,\n\t37684 - 19968: jis0212<<14 | 0x43<<7 | 0x44,\n\t37685 - 19968: jis0208<<14 | 0x4E<<7 | 0x05,\n\t37686 - 19968: jis0212<<14 | 0x43<<7 | 0x45,\n\t37687 - 19968: jis0212<<14 | 0x43<<7 | 0x46,\n\t37690 - 19968: jis0208<<14 | 0x4E<<7 | 0x04,\n\t37691 - 19968: jis0208<<14 | 0x4E<<7 | 0x06,\n\t37700 - 19968: jis0208<<14 | 0x4D<<7 | 0x5C,\n\t37703 - 19968: jis0212<<14 | 0x43<<7 | 0x47,\n\t37704 - 19968: jis0208<<14 | 0x58<<7 | 0x02,\n\t37705 - 19968: jis0212<<14 | 0x43<<7 | 0x49,\n\t37707 - 19968: jis0208<<14 | 0x25<<7 | 0x48,\n\t37709 - 19968: jis0208<<14 | 0x24<<7 | 0x34,\n\t37712 - 19968: jis0212<<14 | 0x43<<7 | 0x4A,\n\t37713 - 19968: jis0212<<14 | 0x43<<7 | 0x4B,\n\t37714 - 19968: jis0212<<14 | 0x43<<7 | 0x4C,\n\t37716 - 19968: jis0208<<14 | 0x23<<7 | 0x36,\n\t37717 - 19968: jis0212<<14 | 0x43<<7 | 0x4D,\n\t37718 - 19968: jis0208<<14 | 0x4E<<7 | 0x0B,\n\t37719 - 19968: jis0208<<14 | 0x5B<<7 | 0x25,\n\t37720 - 19968: jis0212<<14 | 0x43<<7 | 0x4F,\n\t37722 - 19968: jis0212<<14 | 0x43<<7 | 0x50,\n\t37723 - 19968: jis0208<<14 | 0x22<<7 | 0x22,\n\t37724 - 19968: jis0208<<14 | 0x4E<<7 | 0x07,\n\t37726 - 19968: jis0212<<14 | 0x43<<7 | 0x51,\n\t37728 - 19968: jis0208<<14 | 0x4E<<7 | 0x08,\n\t37732 - 19968: jis0212<<14 | 0x43<<7 | 0x52,\n\t37733 - 19968: jis0212<<14 | 0x43<<7 | 0x53,\n\t37735 - 19968: jis0212<<14 | 0x43<<7 | 0x54,\n\t37737 - 19968: jis0212<<14 | 0x43<<7 | 0x55,\n\t37738 - 19968: jis0212<<14 | 0x43<<7 | 0x56,\n\t37740 - 19968: jis0208<<14 | 0x16<<7 | 0x0C,\n\t37741 - 19968: jis0212<<14 | 0x43<<7 | 0x57,\n\t37742 - 19968: jis0208<<14 | 0x4E<<7 | 0x0A,\n\t37743 - 19968: jis0212<<14 | 0x43<<7 | 0x58,\n\t37744 - 19968: jis0208<<14 | 0x5B<<7 | 0x24,\n\t37745 - 19968: jis0212<<14 | 0x43<<7 | 0x5A,\n\t37747 - 19968: jis0212<<14 | 0x43<<7 | 0x5B,\n\t37748 - 19968: jis0212<<14 | 0x43<<7 | 0x5C,\n\t37749 - 19968: jis0208<<14 | 0x17<<7 | 0x0F,\n\t37750 - 19968: jis0212<<14 | 0x43<<7 | 0x5D,\n\t37754 - 19968: jis0212<<14 | 0x44<<7 | 0x00,\n\t37756 - 19968: jis0208<<14 | 0x4E<<7 | 0x09,\n\t37757 - 19968: jis0212<<14 | 0x44<<7 | 0x01,\n\t37758 - 19968: jis0208<<14 | 0x1D<<7 | 0x40,\n\t37759 - 19968: jis0212<<14 | 0x44<<7 | 0x02,\n\t37760 - 19968: jis0212<<14 | 0x44<<7 | 0x03,\n\t37761 - 19968: jis0212<<14 | 0x44<<7 | 0x04,\n\t37762 - 19968: jis0212<<14 | 0x44<<7 | 0x05,\n\t37768 - 19968: jis0212<<14 | 0x44<<7 | 0x06,\n\t37770 - 19968: jis0212<<14 | 0x44<<7 | 0x07,\n\t37771 - 19968: jis0212<<14 | 0x44<<7 | 0x08,\n\t37772 - 19968: jis0208<<14 | 0x12<<7 | 0x58,\n\t37773 - 19968: jis0212<<14 | 0x44<<7 | 0x09,\n\t37775 - 19968: jis0212<<14 | 0x44<<7 | 0x0A,\n\t37778 - 19968: jis0212<<14 | 0x44<<7 | 0x0B,\n\t37780 - 19968: jis0208<<14 | 0x4E<<7 | 0x0F,\n\t37781 - 19968: jis0212<<14 | 0x44<<7 | 0x0C,\n\t37782 - 19968: jis0208<<14 | 0x19<<7 | 0x1E,\n\t37783 - 19968: jis0208<<14 | 0x20<<7 | 0x58,\n\t37784 - 19968: jis0212<<14 | 0x44<<7 | 0x0D,\n\t37786 - 19968: jis0208<<14 | 0x23<<7 | 0x29,\n\t37787 - 19968: jis0212<<14 | 0x44<<7 | 0x0E,\n\t37790 - 19968: jis0212<<14 | 0x44<<7 | 0x0F,\n\t37793 - 19968: jis0212<<14 | 0x44<<7 | 0x10,\n\t37795 - 19968: jis0212<<14 | 0x44<<7 | 0x11,\n\t37796 - 19968: jis0208<<14 | 0x5B<<7 | 0x26,\n\t37798 - 19968: jis0212<<14 | 0x44<<7 | 0x13,\n\t37799 - 19968: jis0208<<14 | 0x12<<7 | 0x1A,\n\t37800 - 19968: jis0212<<14 | 0x44<<7 | 0x14,\n\t37801 - 19968: jis0212<<14 | 0x44<<7 | 0x1A,\n\t37803 - 19968: jis0212<<14 | 0x44<<7 | 0x15,\n\t37804 - 19968: jis0208<<14 | 0x4E<<7 | 0x0D,\n\t37805 - 19968: jis0208<<14 | 0x4E<<7 | 0x0E,\n\t37806 - 19968: jis0208<<14 | 0x23<<7 | 0x22,\n\t37808 - 19968: jis0208<<14 | 0x4E<<7 | 0x0C,\n\t37812 - 19968: jis0212<<14 | 0x44<<7 | 0x16,\n\t37813 - 19968: jis0212<<14 | 0x44<<7 | 0x17,\n\t37814 - 19968: jis0212<<14 | 0x44<<7 | 0x18,\n\t37817 - 19968: jis0208<<14 | 0x4E<<7 | 0x10,\n\t37818 - 19968: jis0212<<14 | 0x44<<7 | 0x19,\n\t37825 - 19968: jis0212<<14 | 0x44<<7 | 0x1B,\n\t37827 - 19968: jis0208<<14 | 0x4E<<7 | 0x16,\n\t37828 - 19968: jis0212<<14 | 0x44<<7 | 0x1C,\n\t37829 - 19968: jis0212<<14 | 0x44<<7 | 0x1D,\n\t37830 - 19968: jis0208<<14 | 0x5B<<7 | 0x27,\n\t37831 - 19968: jis0212<<14 | 0x44<<7 | 0x1F,\n\t37832 - 19968: jis0208<<14 | 0x4E<<7 | 0x19,\n\t37833 - 19968: jis0212<<14 | 0x44<<7 | 0x20,\n\t37834 - 19968: jis0212<<14 | 0x44<<7 | 0x21,\n\t37835 - 19968: jis0212<<14 | 0x44<<7 | 0x22,\n\t37836 - 19968: jis0212<<14 | 0x44<<7 | 0x23,\n\t37837 - 19968: jis0212<<14 | 0x44<<7 | 0x24,\n\t37840 - 19968: jis0208<<14 | 0x4E<<7 | 0x18,\n\t37841 - 19968: jis0208<<14 | 0x24<<7 | 0x0C,\n\t37843 - 19968: jis0212<<14 | 0x44<<7 | 0x25,\n\t37846 - 19968: jis0208<<14 | 0x4E<<7 | 0x11,\n\t37847 - 19968: jis0208<<14 | 0x4E<<7 | 0x12,\n\t37848 - 19968: jis0208<<14 | 0x4E<<7 | 0x15,\n\t37849 - 19968: jis0212<<14 | 0x44<<7 | 0x26,\n\t37852 - 19968: jis0212<<14 | 0x44<<7 | 0x27,\n\t37853 - 19968: jis0208<<14 | 0x4E<<7 | 0x17,\n\t37854 - 19968: jis0208<<14 | 0x5B<<7 | 0x28,\n\t37855 - 19968: jis0212<<14 | 0x44<<7 | 0x29,\n\t37857 - 19968: jis0208<<14 | 0x15<<7 | 0x1F,\n\t37858 - 19968: jis0212<<14 | 0x44<<7 | 0x2A,\n\t37860 - 19968: jis0208<<14 | 0x4E<<7 | 0x1A,\n\t37861 - 19968: jis0208<<14 | 0x4E<<7 | 0x14,\n\t37862 - 19968: jis0212<<14 | 0x44<<7 | 0x2B,\n\t37863 - 19968: jis0212<<14 | 0x44<<7 | 0x2C,\n\t37864 - 19968: jis0208<<14 | 0x4E<<7 | 0x13,\n\t37879 - 19968: jis0212<<14 | 0x44<<7 | 0x2E,\n\t37880 - 19968: jis0208<<14 | 0x5B<<7 | 0x29,\n\t37881 - 19968: jis0212<<14 | 0x44<<7 | 0x2D,\n\t37882 - 19968: jis0212<<14 | 0x44<<7 | 0x30,\n\t37883 - 19968: jis0212<<14 | 0x44<<7 | 0x31,\n\t37885 - 19968: jis0212<<14 | 0x44<<7 | 0x32,\n\t37889 - 19968: jis0212<<14 | 0x44<<7 | 0x33,\n\t37890 - 19968: jis0212<<14 | 0x44<<7 | 0x34,\n\t37891 - 19968: jis0208<<14 | 0x4E<<7 | 0x1E,\n\t37892 - 19968: jis0212<<14 | 0x44<<7 | 0x35,\n\t37895 - 19968: jis0208<<14 | 0x4E<<7 | 0x1F,\n\t37896 - 19968: jis0212<<14 | 0x44<<7 | 0x36,\n\t37897 - 19968: jis0212<<14 | 0x44<<7 | 0x37,\n\t37901 - 19968: jis0212<<14 | 0x44<<7 | 0x38,\n\t37902 - 19968: jis0212<<14 | 0x44<<7 | 0x39,\n\t37903 - 19968: jis0212<<14 | 0x44<<7 | 0x3A,\n\t37904 - 19968: jis0208<<14 | 0x4E<<7 | 0x20,\n\t37907 - 19968: jis0208<<14 | 0x4E<<7 | 0x1D,\n\t37908 - 19968: jis0208<<14 | 0x4E<<7 | 0x1C,\n\t37909 - 19968: jis0212<<14 | 0x44<<7 | 0x3B,\n\t37910 - 19968: jis0212<<14 | 0x44<<7 | 0x3C,\n\t37911 - 19968: jis0212<<14 | 0x44<<7 | 0x3D,\n\t37912 - 19968: jis0208<<14 | 0x1D<<7 | 0x41,\n\t37913 - 19968: jis0208<<14 | 0x25<<7 | 0x09,\n\t37914 - 19968: jis0208<<14 | 0x4E<<7 | 0x1B,\n\t37919 - 19968: jis0212<<14 | 0x44<<7 | 0x3E,\n\t37921 - 19968: jis0208<<14 | 0x4E<<7 | 0x24,\n\t37931 - 19968: jis0208<<14 | 0x4E<<7 | 0x22,\n\t37934 - 19968: jis0212<<14 | 0x44<<7 | 0x3F,\n\t37935 - 19968: jis0212<<14 | 0x44<<7 | 0x40,\n\t37937 - 19968: jis0208<<14 | 0x5B<<7 | 0x2A,\n\t37938 - 19968: jis0212<<14 | 0x44<<7 | 0x42,\n\t37939 - 19968: jis0212<<14 | 0x44<<7 | 0x43,\n\t37940 - 19968: jis0212<<14 | 0x44<<7 | 0x44,\n\t37941 - 19968: jis0208<<14 | 0x4E<<7 | 0x23,\n\t37942 - 19968: jis0208<<14 | 0x4E<<7 | 0x21,\n\t37944 - 19968: jis0208<<14 | 0x21<<7 | 0x57,\n\t37946 - 19968: jis0208<<14 | 0x4E<<7 | 0x25,\n\t37947 - 19968: jis0212<<14 | 0x44<<7 | 0x45,\n\t37949 - 19968: jis0212<<14 | 0x44<<7 | 0x47,\n\t37951 - 19968: jis0212<<14 | 0x44<<7 | 0x46,\n\t37953 - 19968: jis0208<<14 | 0x4E<<7 | 0x26,\n\t37955 - 19968: jis0212<<14 | 0x44<<7 | 0x48,\n\t37956 - 19968: jis0208<<14 | 0x4E<<7 | 0x28,\n\t37957 - 19968: jis0208<<14 | 0x5B<<7 | 0x2B,\n\t37960 - 19968: jis0208<<14 | 0x5B<<7 | 0x2C,\n\t37962 - 19968: jis0212<<14 | 0x44<<7 | 0x4B,\n\t37964 - 19968: jis0212<<14 | 0x44<<7 | 0x4C,\n\t37969 - 19968: jis0208<<14 | 0x13<<7 | 0x34,\n\t37970 - 19968: jis0208<<14 | 0x4E<<7 | 0x27,\n\t37971 - 19968: jis0208<<14 | 0x2B<<7 | 0x59,\n\t37973 - 19968: jis0212<<14 | 0x44<<7 | 0x4D,\n\t37977 - 19968: jis0212<<14 | 0x44<<7 | 0x4E,\n\t37978 - 19968: jis0208<<14 | 0x4E<<7 | 0x33,\n\t37979 - 19968: jis0208<<14 | 0x4E<<7 | 0x29,\n\t37980 - 19968: jis0212<<14 | 0x44<<7 | 0x4F,\n\t37982 - 19968: jis0208<<14 | 0x4E<<7 | 0x2C,\n\t37983 - 19968: jis0212<<14 | 0x44<<7 | 0x50,\n\t37984 - 19968: jis0208<<14 | 0x4E<<7 | 0x2A,\n\t37985 - 19968: jis0212<<14 | 0x44<<7 | 0x51,\n\t37986 - 19968: jis0208<<14 | 0x4E<<7 | 0x2B,\n\t37987 - 19968: jis0212<<14 | 0x44<<7 | 0x52,\n\t37992 - 19968: jis0212<<14 | 0x44<<7 | 0x53,\n\t37994 - 19968: jis0208<<14 | 0x4E<<7 | 0x2D,\n\t37995 - 19968: jis0212<<14 | 0x44<<7 | 0x54,\n\t37997 - 19968: jis0212<<14 | 0x44<<7 | 0x55,\n\t37998 - 19968: jis0212<<14 | 0x44<<7 | 0x56,\n\t37999 - 19968: jis0212<<14 | 0x44<<7 | 0x57,\n\t38000 - 19968: jis0208<<14 | 0x4E<<7 | 0x2F,\n\t38001 - 19968: jis0212<<14 | 0x44<<7 | 0x58,\n\t38002 - 19968: jis0212<<14 | 0x44<<7 | 0x59,\n\t38005 - 19968: jis0208<<14 | 0x4E<<7 | 0x30,\n\t38007 - 19968: jis0208<<14 | 0x4E<<7 | 0x31,\n\t38012 - 19968: jis0208<<14 | 0x4E<<7 | 0x34,\n\t38013 - 19968: jis0208<<14 | 0x4E<<7 | 0x32,\n\t38014 - 19968: jis0208<<14 | 0x4E<<7 | 0x35,\n\t38015 - 19968: jis0208<<14 | 0x4E<<7 | 0x37,\n\t38017 - 19968: jis0208<<14 | 0x4E<<7 | 0x36,\n\t38019 - 19968: jis0212<<14 | 0x44<<7 | 0x5B,\n\t38020 - 19968: jis0212<<14 | 0x44<<7 | 0x5A,\n\t38263 - 19968: jis0208<<14 | 0x23<<7 | 0x18,\n\t38264 - 19968: jis0212<<14 | 0x44<<7 | 0x5C,\n\t38265 - 19968: jis0212<<14 | 0x44<<7 | 0x5D,\n\t38270 - 19968: jis0212<<14 | 0x45<<7 | 0x00,\n\t38272 - 19968: jis0208<<14 | 0x2B<<7 | 0x46,\n\t38274 - 19968: jis0208<<14 | 0x4E<<7 | 0x38,\n\t38275 - 19968: jis0208<<14 | 0x20<<7 | 0x0D,\n\t38276 - 19968: jis0212<<14 | 0x45<<7 | 0x01,\n\t38279 - 19968: jis0208<<14 | 0x4E<<7 | 0x39,\n\t38280 - 19968: jis0212<<14 | 0x45<<7 | 0x02,\n\t38281 - 19968: jis0208<<14 | 0x29<<7 | 0x23,\n\t38282 - 19968: jis0208<<14 | 0x4E<<7 | 0x3A,\n\t38283 - 19968: jis0208<<14 | 0x12<<7 | 0x0A,\n\t38284 - 19968: jis0212<<14 | 0x45<<7 | 0x03,\n\t38285 - 19968: jis0212<<14 | 0x45<<7 | 0x04,\n\t38286 - 19968: jis0212<<14 | 0x45<<7 | 0x05,\n\t38287 - 19968: jis0208<<14 | 0x10<<7 | 0x1B,\n\t38289 - 19968: jis0208<<14 | 0x13<<7 | 0x36,\n\t38290 - 19968: jis0208<<14 | 0x5B<<7 | 0x2D,\n\t38291 - 19968: jis0208<<14 | 0x13<<7 | 0x35,\n\t38292 - 19968: jis0208<<14 | 0x4E<<7 | 0x3B,\n\t38294 - 19968: jis0208<<14 | 0x4E<<7 | 0x3C,\n\t38296 - 19968: jis0208<<14 | 0x4E<<7 | 0x3D,\n\t38297 - 19968: jis0208<<14 | 0x4E<<7 | 0x3E,\n\t38301 - 19968: jis0212<<14 | 0x45<<7 | 0x06,\n\t38302 - 19968: jis0212<<14 | 0x45<<7 | 0x07,\n\t38303 - 19968: jis0212<<14 | 0x45<<7 | 0x08,\n\t38304 - 19968: jis0208<<14 | 0x4E<<7 | 0x3F,\n\t38305 - 19968: jis0212<<14 | 0x45<<7 | 0x09,\n\t38306 - 19968: jis0208<<14 | 0x13<<7 | 0x37,\n\t38307 - 19968: jis0208<<14 | 0x12<<7 | 0x34,\n\t38308 - 19968: jis0208<<14 | 0x18<<7 | 0x3D,\n\t38309 - 19968: jis0208<<14 | 0x27<<7 | 0x15,\n\t38310 - 19968: jis0212<<14 | 0x45<<7 | 0x0A,\n\t38311 - 19968: jis0208<<14 | 0x4E<<7 | 0x41,\n\t38312 - 19968: jis0208<<14 | 0x4E<<7 | 0x40,\n\t38313 - 19968: jis0212<<14 | 0x45<<7 | 0x0B,\n\t38315 - 19968: jis0212<<14 | 0x45<<7 | 0x0C,\n\t38316 - 19968: jis0212<<14 | 0x45<<7 | 0x0D,\n\t38317 - 19968: jis0208<<14 | 0x4E<<7 | 0x42,\n\t38322 - 19968: jis0208<<14 | 0x10<<7 | 0x3B,\n\t38324 - 19968: jis0212<<14 | 0x45<<7 | 0x0E,\n\t38326 - 19968: jis0212<<14 | 0x45<<7 | 0x0F,\n\t38329 - 19968: jis0208<<14 | 0x4E<<7 | 0x45,\n\t38330 - 19968: jis0212<<14 | 0x45<<7 | 0x10,\n\t38331 - 19968: jis0208<<14 | 0x4E<<7 | 0x44,\n\t38332 - 19968: jis0208<<14 | 0x4E<<7 | 0x43,\n\t38333 - 19968: jis0212<<14 | 0x45<<7 | 0x11,\n\t38334 - 19968: jis0208<<14 | 0x4E<<7 | 0x46,\n\t38335 - 19968: jis0212<<14 | 0x45<<7 | 0x12,\n\t38339 - 19968: jis0208<<14 | 0x4E<<7 | 0x49,\n\t38342 - 19968: jis0212<<14 | 0x45<<7 | 0x13,\n\t38343 - 19968: jis0208<<14 | 0x0F<<7 | 0x26,\n\t38344 - 19968: jis0212<<14 | 0x45<<7 | 0x14,\n\t38345 - 19968: jis0212<<14 | 0x45<<7 | 0x15,\n\t38346 - 19968: jis0208<<14 | 0x4E<<7 | 0x47,\n\t38347 - 19968: jis0212<<14 | 0x45<<7 | 0x16,\n\t38348 - 19968: jis0208<<14 | 0x4E<<7 | 0x4B,\n\t38349 - 19968: jis0208<<14 | 0x4E<<7 | 0x4A,\n\t38352 - 19968: jis0212<<14 | 0x45<<7 | 0x17,\n\t38353 - 19968: jis0212<<14 | 0x45<<7 | 0x18,\n\t38354 - 19968: jis0212<<14 | 0x45<<7 | 0x19,\n\t38355 - 19968: jis0212<<14 | 0x45<<7 | 0x1A,\n\t38356 - 19968: jis0208<<14 | 0x4E<<7 | 0x4D,\n\t38357 - 19968: jis0208<<14 | 0x4E<<7 | 0x4C,\n\t38358 - 19968: jis0208<<14 | 0x4E<<7 | 0x4E,\n\t38360 - 19968: jis0208<<14 | 0x25<<7 | 0x0D,\n\t38361 - 19968: jis0212<<14 | 0x45<<7 | 0x1B,\n\t38362 - 19968: jis0212<<14 | 0x45<<7 | 0x1C,\n\t38364 - 19968: jis0208<<14 | 0x4E<<7 | 0x4F,\n\t38365 - 19968: jis0212<<14 | 0x45<<7 | 0x1D,\n\t38366 - 19968: jis0212<<14 | 0x45<<7 | 0x1E,\n\t38367 - 19968: jis0212<<14 | 0x45<<7 | 0x1F,\n\t38368 - 19968: jis0212<<14 | 0x45<<7 | 0x20,\n\t38369 - 19968: jis0208<<14 | 0x4E<<7 | 0x50,\n\t38370 - 19968: jis0208<<14 | 0x4E<<7 | 0x52,\n\t38372 - 19968: jis0212<<14 | 0x45<<7 | 0x21,\n\t38373 - 19968: jis0208<<14 | 0x4E<<7 | 0x51,\n\t38374 - 19968: jis0212<<14 | 0x45<<7 | 0x22,\n\t38428 - 19968: jis0208<<14 | 0x28<<7 | 0x4B,\n\t38429 - 19968: jis0212<<14 | 0x45<<7 | 0x23,\n\t38430 - 19968: jis0212<<14 | 0x45<<7 | 0x24,\n\t38433 - 19968: jis0208<<14 | 0x4E<<7 | 0x53,\n\t38434 - 19968: jis0212<<14 | 0x45<<7 | 0x25,\n\t38436 - 19968: jis0212<<14 | 0x45<<7 | 0x26,\n\t38437 - 19968: jis0212<<14 | 0x45<<7 | 0x27,\n\t38438 - 19968: jis0212<<14 | 0x45<<7 | 0x28,\n\t38440 - 19968: jis0208<<14 | 0x4E<<7 | 0x54,\n\t38442 - 19968: jis0208<<14 | 0x19<<7 | 0x44,\n\t38444 - 19968: jis0212<<14 | 0x45<<7 | 0x29,\n\t38446 - 19968: jis0208<<14 | 0x4E<<7 | 0x55,\n\t38447 - 19968: jis0208<<14 | 0x4E<<7 | 0x56,\n\t38449 - 19968: jis0212<<14 | 0x45<<7 | 0x2A,\n\t38450 - 19968: jis0208<<14 | 0x2A<<7 | 0x28,\n\t38451 - 19968: jis0212<<14 | 0x45<<7 | 0x2B,\n\t38455 - 19968: jis0212<<14 | 0x45<<7 | 0x2C,\n\t38456 - 19968: jis0212<<14 | 0x45<<7 | 0x2D,\n\t38457 - 19968: jis0212<<14 | 0x45<<7 | 0x2E,\n\t38458 - 19968: jis0212<<14 | 0x45<<7 | 0x2F,\n\t38459 - 19968: jis0208<<14 | 0x20<<7 | 0x2A,\n\t38460 - 19968: jis0212<<14 | 0x45<<7 | 0x30,\n\t38461 - 19968: jis0212<<14 | 0x45<<7 | 0x31,\n\t38463 - 19968: jis0208<<14 | 0x0F<<7 | 0x03,\n\t38464 - 19968: jis0208<<14 | 0x21<<7 | 0x2A,\n\t38465 - 19968: jis0212<<14 | 0x45<<7 | 0x32,\n\t38466 - 19968: jis0208<<14 | 0x4E<<7 | 0x57,\n\t38468 - 19968: jis0208<<14 | 0x28<<7 | 0x4C,\n\t38475 - 19968: jis0208<<14 | 0x4E<<7 | 0x5A,\n\t38476 - 19968: jis0208<<14 | 0x4E<<7 | 0x58,\n\t38477 - 19968: jis0208<<14 | 0x18<<7 | 0x3E,\n\t38479 - 19968: jis0208<<14 | 0x4E<<7 | 0x59,\n\t38480 - 19968: jis0208<<14 | 0x17<<7 | 0x21,\n\t38482 - 19968: jis0212<<14 | 0x45<<7 | 0x33,\n\t38484 - 19968: jis0212<<14 | 0x45<<7 | 0x34,\n\t38486 - 19968: jis0212<<14 | 0x45<<7 | 0x35,\n\t38487 - 19968: jis0212<<14 | 0x45<<7 | 0x36,\n\t38488 - 19968: jis0212<<14 | 0x45<<7 | 0x37,\n\t38491 - 19968: jis0208<<14 | 0x29<<7 | 0x24,\n\t38492 - 19968: jis0208<<14 | 0x4E<<7 | 0x5C,\n\t38493 - 19968: jis0208<<14 | 0x4F<<7 | 0x00,\n\t38494 - 19968: jis0208<<14 | 0x4E<<7 | 0x5D,\n\t38495 - 19968: jis0208<<14 | 0x4F<<7 | 0x01,\n\t38497 - 19968: jis0212<<14 | 0x45<<7 | 0x38,\n\t38498 - 19968: jis0208<<14 | 0x10<<7 | 0x00,\n\t38499 - 19968: jis0208<<14 | 0x1E<<7 | 0x37,\n\t38500 - 19968: jis0208<<14 | 0x1C<<7 | 0x5B,\n\t38501 - 19968: jis0208<<14 | 0x13<<7 | 0x38,\n\t38502 - 19968: jis0208<<14 | 0x4F<<7 | 0x02,\n\t38506 - 19968: jis0208<<14 | 0x26<<7 | 0x45,\n\t38508 - 19968: jis0208<<14 | 0x4F<<7 | 0x04,\n\t38510 - 19968: jis0212<<14 | 0x45<<7 | 0x39,\n\t38512 - 19968: jis0208<<14 | 0x10<<7 | 0x01,\n\t38514 - 19968: jis0208<<14 | 0x4F<<7 | 0x03,\n\t38515 - 19968: jis0208<<14 | 0x23<<7 | 0x23,\n\t38516 - 19968: jis0212<<14 | 0x45<<7 | 0x3A,\n\t38517 - 19968: jis0208<<14 | 0x2D<<7 | 0x2C,\n\t38518 - 19968: jis0208<<14 | 0x25<<7 | 0x0A,\n\t38519 - 19968: jis0208<<14 | 0x4E<<7 | 0x5B,\n\t38520 - 19968: jis0208<<14 | 0x2D<<7 | 0x05,\n\t38522 - 19968: jis0208<<14 | 0x17<<7 | 0x10,\n\t38523 - 19968: jis0212<<14 | 0x45<<7 | 0x3B,\n\t38524 - 19968: jis0212<<14 | 0x45<<7 | 0x3C,\n\t38525 - 19968: jis0208<<14 | 0x2C<<7 | 0x3A,\n\t38526 - 19968: jis0212<<14 | 0x45<<7 | 0x3D,\n\t38527 - 19968: jis0212<<14 | 0x45<<7 | 0x3E,\n\t38529 - 19968: jis0212<<14 | 0x45<<7 | 0x3F,\n\t38530 - 19968: jis0212<<14 | 0x45<<7 | 0x40,\n\t38531 - 19968: jis0212<<14 | 0x45<<7 | 0x41,\n\t38532 - 19968: jis0212<<14 | 0x45<<7 | 0x42,\n\t38533 - 19968: jis0208<<14 | 0x15<<7 | 0x58,\n\t38534 - 19968: jis0208<<14 | 0x2D<<7 | 0x13,\n\t38536 - 19968: jis0208<<14 | 0x16<<7 | 0x07,\n\t38537 - 19968: jis0212<<14 | 0x45<<7 | 0x43,\n\t38538 - 19968: jis0208<<14 | 0x21<<7 | 0x41,\n\t38539 - 19968: jis0208<<14 | 0x46<<7 | 0x00,\n\t38541 - 19968: jis0208<<14 | 0x4F<<7 | 0x05,\n\t38542 - 19968: jis0208<<14 | 0x12<<7 | 0x0B,\n\t38543 - 19968: jis0208<<14 | 0x1E<<7 | 0x4E,\n\t38545 - 19968: jis0212<<14 | 0x45<<7 | 0x44,\n\t38548 - 19968: jis0208<<14 | 0x12<<7 | 0x35,\n\t38549 - 19968: jis0208<<14 | 0x4F<<7 | 0x07,\n\t38550 - 19968: jis0212<<14 | 0x45<<7 | 0x45,\n\t38551 - 19968: jis0208<<14 | 0x4F<<7 | 0x08,\n\t38552 - 19968: jis0208<<14 | 0x4F<<7 | 0x06,\n\t38553 - 19968: jis0208<<14 | 0x16<<7 | 0x43,\n\t38554 - 19968: jis0212<<14 | 0x45<<7 | 0x46,\n\t38555 - 19968: jis0208<<14 | 0x19<<7 | 0x3C,\n\t38556 - 19968: jis0208<<14 | 0x1D<<7 | 0x42,\n\t38557 - 19968: jis0208<<14 | 0x5B<<7 | 0x30,\n\t38559 - 19968: jis0212<<14 | 0x45<<7 | 0x48,\n\t38560 - 19968: jis0208<<14 | 0x10<<7 | 0x02,\n\t38563 - 19968: jis0208<<14 | 0x2D<<7 | 0x38,\n\t38564 - 19968: jis0212<<14 | 0x45<<7 | 0x49,\n\t38565 - 19968: jis0212<<14 | 0x45<<7 | 0x4A,\n\t38566 - 19968: jis0212<<14 | 0x45<<7 | 0x4B,\n\t38567 - 19968: jis0208<<14 | 0x4F<<7 | 0x0A,\n\t38568 - 19968: jis0208<<14 | 0x4D<<7 | 0x0D,\n\t38569 - 19968: jis0212<<14 | 0x45<<7 | 0x4C,\n\t38570 - 19968: jis0208<<14 | 0x4F<<7 | 0x09,\n\t38574 - 19968: jis0212<<14 | 0x45<<7 | 0x4D,\n\t38575 - 19968: jis0208<<14 | 0x5B<<7 | 0x31,\n\t38576 - 19968: jis0208<<14 | 0x4F<<7 | 0x0D,\n\t38577 - 19968: jis0208<<14 | 0x4F<<7 | 0x0B,\n\t38578 - 19968: jis0208<<14 | 0x4F<<7 | 0x0C,\n\t38579 - 19968: jis0212<<14 | 0x45<<7 | 0x4F,\n\t38580 - 19968: jis0208<<14 | 0x4F<<7 | 0x0E,\n\t38582 - 19968: jis0208<<14 | 0x4F<<7 | 0x0F,\n\t38583 - 19968: jis0208<<14 | 0x2D<<7 | 0x4B,\n\t38584 - 19968: jis0208<<14 | 0x4F<<7 | 0x10,\n\t38585 - 19968: jis0208<<14 | 0x4F<<7 | 0x11,\n\t38586 - 19968: jis0212<<14 | 0x45<<7 | 0x50,\n\t38587 - 19968: jis0208<<14 | 0x1F<<7 | 0x28,\n\t38588 - 19968: jis0208<<14 | 0x27<<7 | 0x1A,\n\t38592 - 19968: jis0208<<14 | 0x1E<<7 | 0x5C,\n\t38593 - 19968: jis0208<<14 | 0x13<<7 | 0x46,\n\t38596 - 19968: jis0208<<14 | 0x2C<<7 | 0x19,\n\t38597 - 19968: jis0208<<14 | 0x11<<7 | 0x4C,\n\t38598 - 19968: jis0208<<14 | 0x1C<<7 | 0x17,\n\t38599 - 19968: jis0208<<14 | 0x17<<7 | 0x3A,\n\t38601 - 19968: jis0208<<14 | 0x4F<<7 | 0x14,\n\t38602 - 19968: jis0212<<14 | 0x45<<7 | 0x51,\n\t38603 - 19968: jis0208<<14 | 0x4F<<7 | 0x13,\n\t38604 - 19968: jis0208<<14 | 0x1A<<7 | 0x52,\n\t38605 - 19968: jis0208<<14 | 0x4F<<7 | 0x15,\n\t38606 - 19968: jis0208<<14 | 0x4F<<7 | 0x12,\n\t38609 - 19968: jis0208<<14 | 0x1A<<7 | 0x07,\n\t38610 - 19968: jis0212<<14 | 0x45<<7 | 0x52,\n\t38613 - 19968: jis0208<<14 | 0x4F<<7 | 0x19,\n\t38614 - 19968: jis0208<<14 | 0x49<<7 | 0x0C,\n\t38616 - 19968: jis0212<<14 | 0x45<<7 | 0x54,\n\t38617 - 19968: jis0208<<14 | 0x31<<7 | 0x35,\n\t38618 - 19968: jis0212<<14 | 0x45<<7 | 0x55,\n\t38619 - 19968: jis0208<<14 | 0x1E<<7 | 0x56,\n\t38620 - 19968: jis0208<<14 | 0x4F<<7 | 0x17,\n\t38621 - 19968: jis0212<<14 | 0x45<<7 | 0x56,\n\t38622 - 19968: jis0212<<14 | 0x45<<7 | 0x57,\n\t38623 - 19968: jis0212<<14 | 0x45<<7 | 0x58,\n\t38626 - 19968: jis0208<<14 | 0x2D<<7 | 0x04,\n\t38627 - 19968: jis0208<<14 | 0x25<<7 | 0x50,\n\t38632 - 19968: jis0208<<14 | 0x10<<7 | 0x0A,\n\t38633 - 19968: jis0212<<14 | 0x45<<7 | 0x59,\n\t38634 - 19968: jis0208<<14 | 0x1F<<7 | 0x42,\n\t38635 - 19968: jis0208<<14 | 0x1B<<7 | 0x15,\n\t38639 - 19968: jis0212<<14 | 0x45<<7 | 0x5A,\n\t38640 - 19968: jis0208<<14 | 0x29<<7 | 0x16,\n\t38641 - 19968: jis0212<<14 | 0x45<<7 | 0x5B,\n\t38642 - 19968: jis0208<<14 | 0x10<<7 | 0x1F,\n\t38646 - 19968: jis0208<<14 | 0x2D<<7 | 0x4C,\n\t38647 - 19968: jis0208<<14 | 0x2C<<7 | 0x4A,\n\t38649 - 19968: jis0208<<14 | 0x4F<<7 | 0x1A,\n\t38650 - 19968: jis0212<<14 | 0x45<<7 | 0x5C,\n\t38651 - 19968: jis0208<<14 | 0x24<<7 | 0x24,\n\t38656 - 19968: jis0208<<14 | 0x1B<<7 | 0x5A,\n\t38658 - 19968: jis0212<<14 | 0x45<<7 | 0x5D,\n\t38659 - 19968: jis0212<<14 | 0x46<<7 | 0x00,\n\t38660 - 19968: jis0208<<14 | 0x4F<<7 | 0x1B,\n\t38661 - 19968: jis0212<<14 | 0x46<<7 | 0x01,\n\t38662 - 19968: jis0208<<14 | 0x4F<<7 | 0x1C,\n\t38663 - 19968: jis0208<<14 | 0x1E<<7 | 0x2B,\n\t38664 - 19968: jis0208<<14 | 0x4F<<7 | 0x1D,\n\t38665 - 19968: jis0212<<14 | 0x46<<7 | 0x02,\n\t38666 - 19968: jis0208<<14 | 0x2D<<7 | 0x4D,\n\t38669 - 19968: jis0208<<14 | 0x4F<<7 | 0x18,\n\t38670 - 19968: jis0208<<14 | 0x4F<<7 | 0x1F,\n\t38671 - 19968: jis0208<<14 | 0x4F<<7 | 0x21,\n\t38673 - 19968: jis0208<<14 | 0x4F<<7 | 0x20,\n\t38675 - 19968: jis0208<<14 | 0x4F<<7 | 0x1E,\n\t38678 - 19968: jis0208<<14 | 0x4F<<7 | 0x22,\n\t38681 - 19968: jis0208<<14 | 0x4F<<7 | 0x23,\n\t38682 - 19968: jis0212<<14 | 0x46<<7 | 0x03,\n\t38683 - 19968: jis0212<<14 | 0x46<<7 | 0x04,\n\t38684 - 19968: jis0208<<14 | 0x20<<7 | 0x59,\n\t38685 - 19968: jis0212<<14 | 0x46<<7 | 0x05,\n\t38686 - 19968: jis0208<<14 | 0x11<<7 | 0x41,\n\t38689 - 19968: jis0212<<14 | 0x46<<7 | 0x06,\n\t38690 - 19968: jis0212<<14 | 0x46<<7 | 0x07,\n\t38691 - 19968: jis0212<<14 | 0x46<<7 | 0x08,\n\t38692 - 19968: jis0208<<14 | 0x4F<<7 | 0x24,\n\t38695 - 19968: jis0208<<14 | 0x2B<<7 | 0x17,\n\t38696 - 19968: jis0212<<14 | 0x46<<7 | 0x09,\n\t38698 - 19968: jis0208<<14 | 0x4F<<7 | 0x25,\n\t38704 - 19968: jis0208<<14 | 0x4F<<7 | 0x26,\n\t38705 - 19968: jis0212<<14 | 0x46<<7 | 0x0A,\n\t38706 - 19968: jis0208<<14 | 0x2E<<7 | 0x09,\n\t38707 - 19968: jis0208<<14 | 0x5B<<7 | 0x32,\n\t38712 - 19968: jis0208<<14 | 0x3A<<7 | 0x10,\n\t38713 - 19968: jis0208<<14 | 0x4F<<7 | 0x27,\n\t38715 - 19968: jis0208<<14 | 0x5B<<7 | 0x33,\n\t38717 - 19968: jis0208<<14 | 0x4F<<7 | 0x28,\n\t38718 - 19968: jis0208<<14 | 0x4F<<7 | 0x29,\n\t38721 - 19968: jis0212<<14 | 0x46<<7 | 0x0C,\n\t38722 - 19968: jis0208<<14 | 0x4F<<7 | 0x2D,\n\t38723 - 19968: jis0208<<14 | 0x5B<<7 | 0x34,\n\t38724 - 19968: jis0208<<14 | 0x4F<<7 | 0x2A,\n\t38726 - 19968: jis0208<<14 | 0x4F<<7 | 0x2B,\n\t38728 - 19968: jis0208<<14 | 0x4F<<7 | 0x2C,\n\t38729 - 19968: jis0208<<14 | 0x4F<<7 | 0x2E,\n\t38730 - 19968: jis0212<<14 | 0x46<<7 | 0x0E,\n\t38733 - 19968: jis0208<<14 | 0x5B<<7 | 0x35,\n\t38734 - 19968: jis0212<<14 | 0x46<<7 | 0x0F,\n\t38735 - 19968: jis0208<<14 | 0x5B<<7 | 0x36,\n\t38737 - 19968: jis0208<<14 | 0x5B<<7 | 0x37,\n\t38738 - 19968: jis0208<<14 | 0x1F<<7 | 0x23,\n\t38741 - 19968: jis0208<<14 | 0x5B<<7 | 0x38,\n\t38742 - 19968: jis0208<<14 | 0x2B<<7 | 0x56,\n\t38743 - 19968: jis0212<<14 | 0x46<<7 | 0x12,\n\t38744 - 19968: jis0212<<14 | 0x46<<7 | 0x13,\n\t38745 - 19968: jis0208<<14 | 0x1F<<7 | 0x24,\n\t38746 - 19968: jis0212<<14 | 0x46<<7 | 0x14,\n\t38747 - 19968: jis0212<<14 | 0x46<<7 | 0x15,\n\t38748 - 19968: jis0208<<14 | 0x4F<<7 | 0x2F,\n\t38750 - 19968: jis0208<<14 | 0x27<<7 | 0x52,\n\t38752 - 19968: jis0208<<14 | 0x4F<<7 | 0x30,\n\t38753 - 19968: jis0208<<14 | 0x52<<7 | 0x32,\n\t38754 - 19968: jis0208<<14 | 0x2B<<7 | 0x2B,\n\t38755 - 19968: jis0212<<14 | 0x46<<7 | 0x16,\n\t38756 - 19968: jis0208<<14 | 0x4F<<7 | 0x31,\n\t38758 - 19968: jis0208<<14 | 0x4F<<7 | 0x32,\n\t38759 - 19968: jis0212<<14 | 0x46<<7 | 0x17,\n\t38760 - 19968: jis0208<<14 | 0x4F<<7 | 0x33,\n\t38761 - 19968: jis0208<<14 | 0x12<<7 | 0x36,\n\t38762 - 19968: jis0212<<14 | 0x46<<7 | 0x18,\n\t38763 - 19968: jis0208<<14 | 0x4F<<7 | 0x35,\n\t38765 - 19968: jis0208<<14 | 0x1E<<7 | 0x38,\n\t38766 - 19968: jis0212<<14 | 0x46<<7 | 0x19,\n\t38769 - 19968: jis0208<<14 | 0x4F<<7 | 0x36,\n\t38771 - 19968: jis0212<<14 | 0x46<<7 | 0x1A,\n\t38772 - 19968: jis0208<<14 | 0x16<<7 | 0x03,\n\t38774 - 19968: jis0212<<14 | 0x46<<7 | 0x1B,\n\t38775 - 19968: jis0212<<14 | 0x46<<7 | 0x1C,\n\t38776 - 19968: jis0212<<14 | 0x46<<7 | 0x1D,\n\t38777 - 19968: jis0208<<14 | 0x4F<<7 | 0x37,\n\t38778 - 19968: jis0208<<14 | 0x4F<<7 | 0x3B,\n\t38779 - 19968: jis0212<<14 | 0x46<<7 | 0x1E,\n\t38780 - 19968: jis0208<<14 | 0x4F<<7 | 0x39,\n\t38781 - 19968: jis0212<<14 | 0x46<<7 | 0x1F,\n\t38783 - 19968: jis0212<<14 | 0x46<<7 | 0x20,\n\t38784 - 19968: jis0212<<14 | 0x46<<7 | 0x21,\n\t38785 - 19968: jis0208<<14 | 0x4F<<7 | 0x3A,\n\t38788 - 19968: jis0208<<14 | 0x12<<7 | 0x52,\n\t38789 - 19968: jis0208<<14 | 0x4F<<7 | 0x38,\n\t38790 - 19968: jis0208<<14 | 0x4F<<7 | 0x3C,\n\t38793 - 19968: jis0212<<14 | 0x46<<7 | 0x22,\n\t38795 - 19968: jis0208<<14 | 0x4F<<7 | 0x3D,\n\t38797 - 19968: jis0208<<14 | 0x0F<<7 | 0x27,\n\t38799 - 19968: jis0208<<14 | 0x4F<<7 | 0x3E,\n\t38800 - 19968: jis0208<<14 | 0x4F<<7 | 0x3F,\n\t38805 - 19968: jis0212<<14 | 0x46<<7 | 0x23,\n\t38806 - 19968: jis0212<<14 | 0x46<<7 | 0x24,\n\t38807 - 19968: jis0212<<14 | 0x46<<7 | 0x25,\n\t38808 - 19968: jis0208<<14 | 0x1D<<7 | 0x43,\n\t38809 - 19968: jis0212<<14 | 0x46<<7 | 0x26,\n\t38810 - 19968: jis0212<<14 | 0x46<<7 | 0x27,\n\t38812 - 19968: jis0208<<14 | 0x4F<<7 | 0x40,\n\t38814 - 19968: jis0212<<14 | 0x46<<7 | 0x28,\n\t38815 - 19968: jis0212<<14 | 0x46<<7 | 0x29,\n\t38816 - 19968: jis0208<<14 | 0x14<<7 | 0x26,\n\t38818 - 19968: jis0212<<14 | 0x46<<7 | 0x2A,\n\t38819 - 19968: jis0208<<14 | 0x4F<<7 | 0x43,\n\t38822 - 19968: jis0208<<14 | 0x4F<<7 | 0x42,\n\t38824 - 19968: jis0208<<14 | 0x4F<<7 | 0x41,\n\t38827 - 19968: jis0208<<14 | 0x4A<<7 | 0x50,\n\t38828 - 19968: jis0212<<14 | 0x46<<7 | 0x2B,\n\t38829 - 19968: jis0208<<14 | 0x29<<7 | 0x3B,\n\t38830 - 19968: jis0212<<14 | 0x46<<7 | 0x2C,\n\t38833 - 19968: jis0212<<14 | 0x46<<7 | 0x2D,\n\t38834 - 19968: jis0212<<14 | 0x46<<7 | 0x2E,\n\t38835 - 19968: jis0208<<14 | 0x4F<<7 | 0x44,\n\t38836 - 19968: jis0208<<14 | 0x4F<<7 | 0x45,\n\t38837 - 19968: jis0212<<14 | 0x46<<7 | 0x2F,\n\t38838 - 19968: jis0212<<14 | 0x46<<7 | 0x30,\n\t38840 - 19968: jis0212<<14 | 0x46<<7 | 0x31,\n\t38841 - 19968: jis0212<<14 | 0x46<<7 | 0x32,\n\t38842 - 19968: jis0212<<14 | 0x46<<7 | 0x33,\n\t38844 - 19968: jis0212<<14 | 0x46<<7 | 0x34,\n\t38846 - 19968: jis0212<<14 | 0x46<<7 | 0x35,\n\t38847 - 19968: jis0212<<14 | 0x46<<7 | 0x36,\n\t38849 - 19968: jis0212<<14 | 0x46<<7 | 0x37,\n\t38851 - 19968: jis0208<<14 | 0x4F<<7 | 0x46,\n\t38852 - 19968: jis0212<<14 | 0x46<<7 | 0x38,\n\t38853 - 19968: jis0212<<14 | 0x46<<7 | 0x39,\n\t38854 - 19968: jis0208<<14 | 0x4F<<7 | 0x47,\n\t38855 - 19968: jis0212<<14 | 0x46<<7 | 0x3A,\n\t38856 - 19968: jis0208<<14 | 0x4F<<7 | 0x48,\n\t38857 - 19968: jis0212<<14 | 0x46<<7 | 0x3B,\n\t38858 - 19968: jis0212<<14 | 0x46<<7 | 0x3C,\n\t38859 - 19968: jis0208<<14 | 0x4F<<7 | 0x49,\n\t38860 - 19968: jis0212<<14 | 0x46<<7 | 0x3D,\n\t38861 - 19968: jis0212<<14 | 0x46<<7 | 0x3E,\n\t38862 - 19968: jis0212<<14 | 0x46<<7 | 0x3F,\n\t38864 - 19968: jis0212<<14 | 0x46<<7 | 0x40,\n\t38865 - 19968: jis0212<<14 | 0x46<<7 | 0x41,\n\t38867 - 19968: jis0208<<14 | 0x13<<7 | 0x39,\n\t38868 - 19968: jis0212<<14 | 0x46<<7 | 0x42,\n\t38871 - 19968: jis0212<<14 | 0x46<<7 | 0x43,\n\t38872 - 19968: jis0212<<14 | 0x46<<7 | 0x44,\n\t38873 - 19968: jis0212<<14 | 0x46<<7 | 0x45,\n\t38875 - 19968: jis0212<<14 | 0x46<<7 | 0x49,\n\t38876 - 19968: jis0208<<14 | 0x4F<<7 | 0x4A,\n\t38877 - 19968: jis0212<<14 | 0x46<<7 | 0x46,\n\t38878 - 19968: jis0212<<14 | 0x46<<7 | 0x47,\n\t38880 - 19968: jis0212<<14 | 0x46<<7 | 0x48,\n\t38881 - 19968: jis0212<<14 | 0x46<<7 | 0x4A,\n\t38884 - 19968: jis0212<<14 | 0x46<<7 | 0x4B,\n\t38893 - 19968: jis0208<<14 | 0x4F<<7 | 0x4B,\n\t38894 - 19968: jis0208<<14 | 0x26<<7 | 0x02,\n\t38895 - 19968: jis0212<<14 | 0x46<<7 | 0x4C,\n\t38897 - 19968: jis0212<<14 | 0x46<<7 | 0x4D,\n\t38898 - 19968: jis0208<<14 | 0x4F<<7 | 0x4D,\n\t38899 - 19968: jis0208<<14 | 0x11<<7 | 0x1A,\n\t38900 - 19968: jis0212<<14 | 0x46<<7 | 0x4E,\n\t38901 - 19968: jis0208<<14 | 0x4F<<7 | 0x50,\n\t38902 - 19968: jis0208<<14 | 0x4F<<7 | 0x4F,\n\t38903 - 19968: jis0212<<14 | 0x46<<7 | 0x4F,\n\t38904 - 19968: jis0212<<14 | 0x46<<7 | 0x50,\n\t38906 - 19968: jis0212<<14 | 0x46<<7 | 0x51,\n\t38907 - 19968: jis0208<<14 | 0x10<<7 | 0x03,\n\t38911 - 19968: jis0208<<14 | 0x15<<7 | 0x20,\n\t38913 - 19968: jis0208<<14 | 0x29<<7 | 0x26,\n\t38914 - 19968: jis0208<<14 | 0x23<<7 | 0x19,\n\t38915 - 19968: jis0208<<14 | 0x19<<7 | 0x01,\n\t38917 - 19968: jis0208<<14 | 0x18<<7 | 0x3F,\n\t38918 - 19968: jis0208<<14 | 0x1C<<7 | 0x46,\n\t38919 - 19968: jis0212<<14 | 0x46<<7 | 0x52,\n\t38920 - 19968: jis0208<<14 | 0x1E<<7 | 0x3B,\n\t38922 - 19968: jis0212<<14 | 0x46<<7 | 0x53,\n\t38924 - 19968: jis0208<<14 | 0x4F<<7 | 0x52,\n\t38925 - 19968: jis0212<<14 | 0x46<<7 | 0x55,\n\t38926 - 19968: jis0212<<14 | 0x46<<7 | 0x56,\n\t38927 - 19968: jis0208<<14 | 0x4F<<7 | 0x51,\n\t38928 - 19968: jis0208<<14 | 0x2C<<7 | 0x21,\n\t38929 - 19968: jis0208<<14 | 0x13<<7 | 0x47,\n\t38930 - 19968: jis0208<<14 | 0x27<<7 | 0x31,\n\t38931 - 19968: jis0208<<14 | 0x25<<7 | 0x3B,\n\t38932 - 19968: jis0212<<14 | 0x46<<7 | 0x57,\n\t38934 - 19968: jis0212<<14 | 0x46<<7 | 0x58,\n\t38935 - 19968: jis0208<<14 | 0x1E<<7 | 0x5B,\n\t38936 - 19968: jis0208<<14 | 0x2D<<7 | 0x2D,\n\t38937 - 19968: jis0212<<14 | 0x46<<7 | 0x54,\n\t38938 - 19968: jis0208<<14 | 0x16<<7 | 0x3A,\n\t38940 - 19968: jis0212<<14 | 0x46<<7 | 0x59,\n\t38942 - 19968: jis0212<<14 | 0x46<<7 | 0x5A,\n\t38944 - 19968: jis0212<<14 | 0x46<<7 | 0x5B,\n\t38945 - 19968: jis0208<<14 | 0x4F<<7 | 0x55,\n\t38947 - 19968: jis0212<<14 | 0x46<<7 | 0x5C,\n\t38948 - 19968: jis0208<<14 | 0x4F<<7 | 0x54,\n\t38949 - 19968: jis0212<<14 | 0x47<<7 | 0x07,\n\t38950 - 19968: jis0212<<14 | 0x46<<7 | 0x5D,\n\t38955 - 19968: jis0212<<14 | 0x47<<7 | 0x00,\n\t38956 - 19968: jis0208<<14 | 0x2A<<7 | 0x2A,\n\t38957 - 19968: jis0208<<14 | 0x25<<7 | 0x0B,\n\t38958 - 19968: jis0212<<14 | 0x47<<7 | 0x01,\n\t38959 - 19968: jis0212<<14 | 0x47<<7 | 0x02,\n\t38960 - 19968: jis0212<<14 | 0x47<<7 | 0x03,\n\t38962 - 19968: jis0212<<14 | 0x47<<7 | 0x04,\n\t38963 - 19968: jis0212<<14 | 0x47<<7 | 0x05,\n\t38964 - 19968: jis0208<<14 | 0x10<<7 | 0x2F,\n\t38965 - 19968: jis0212<<14 | 0x47<<7 | 0x06,\n\t38967 - 19968: jis0208<<14 | 0x4F<<7 | 0x56,\n\t38968 - 19968: jis0208<<14 | 0x4F<<7 | 0x53,\n\t38971 - 19968: jis0208<<14 | 0x28<<7 | 0x30,\n\t38972 - 19968: jis0208<<14 | 0x2C<<7 | 0x49,\n\t38973 - 19968: jis0208<<14 | 0x4F<<7 | 0x57,\n\t38974 - 19968: jis0212<<14 | 0x47<<7 | 0x08,\n\t38980 - 19968: jis0212<<14 | 0x47<<7 | 0x09,\n\t38982 - 19968: jis0208<<14 | 0x4F<<7 | 0x58,\n\t38983 - 19968: jis0212<<14 | 0x47<<7 | 0x0A,\n\t38986 - 19968: jis0212<<14 | 0x47<<7 | 0x0B,\n\t38987 - 19968: jis0208<<14 | 0x4F<<7 | 0x5A,\n\t38988 - 19968: jis0208<<14 | 0x21<<7 | 0x49,\n\t38989 - 19968: jis0208<<14 | 0x12<<7 | 0x3A,\n\t38990 - 19968: jis0208<<14 | 0x12<<7 | 0x3B,\n\t38991 - 19968: jis0208<<14 | 0x4F<<7 | 0x59,\n\t38993 - 19968: jis0212<<14 | 0x47<<7 | 0x0C,\n\t38994 - 19968: jis0212<<14 | 0x47<<7 | 0x0D,\n\t38995 - 19968: jis0212<<14 | 0x47<<7 | 0x0E,\n\t38996 - 19968: jis0208<<14 | 0x13<<7 | 0x48,\n\t38997 - 19968: jis0208<<14 | 0x17<<7 | 0x11,\n\t38998 - 19968: jis0212<<14 | 0x47<<7 | 0x0F,\n\t38999 - 19968: jis0208<<14 | 0x5B<<7 | 0x39,\n\t39000 - 19968: jis0208<<14 | 0x13<<7 | 0x49,\n\t39001 - 19968: jis0212<<14 | 0x47<<7 | 0x11,\n\t39002 - 19968: jis0212<<14 | 0x47<<7 | 0x12,\n\t39003 - 19968: jis0208<<14 | 0x24<<7 | 0x1E,\n\t39006 - 19968: jis0208<<14 | 0x2D<<7 | 0x3F,\n\t39010 - 19968: jis0212<<14 | 0x47<<7 | 0x13,\n\t39011 - 19968: jis0212<<14 | 0x47<<7 | 0x14,\n\t39013 - 19968: jis0208<<14 | 0x5B<<7 | 0x3A,\n\t39014 - 19968: jis0212<<14 | 0x47<<7 | 0x16,\n\t39015 - 19968: jis0208<<14 | 0x17<<7 | 0x3B,\n\t39018 - 19968: jis0212<<14 | 0x47<<7 | 0x17,\n\t39019 - 19968: jis0208<<14 | 0x4F<<7 | 0x5B,\n\t39020 - 19968: jis0212<<14 | 0x47<<7 | 0x18,\n\t39023 - 19968: jis0208<<14 | 0x4F<<7 | 0x5C,\n\t39024 - 19968: jis0208<<14 | 0x4F<<7 | 0x5D,\n\t39025 - 19968: jis0208<<14 | 0x50<<7 | 0x00,\n\t39027 - 19968: jis0208<<14 | 0x50<<7 | 0x02,\n\t39028 - 19968: jis0208<<14 | 0x50<<7 | 0x01,\n\t39080 - 19968: jis0208<<14 | 0x28<<7 | 0x56,\n\t39082 - 19968: jis0208<<14 | 0x50<<7 | 0x03,\n\t39083 - 19968: jis0212<<14 | 0x47<<7 | 0x19,\n\t39085 - 19968: jis0212<<14 | 0x47<<7 | 0x1A,\n\t39086 - 19968: jis0212<<14 | 0x47<<7 | 0x1B,\n\t39087 - 19968: jis0208<<14 | 0x50<<7 | 0x04,\n\t39088 - 19968: jis0212<<14 | 0x47<<7 | 0x1C,\n\t39089 - 19968: jis0208<<14 | 0x50<<7 | 0x05,\n\t39092 - 19968: jis0212<<14 | 0x47<<7 | 0x1D,\n\t39094 - 19968: jis0208<<14 | 0x50<<7 | 0x06,\n\t39095 - 19968: jis0212<<14 | 0x47<<7 | 0x1E,\n\t39096 - 19968: jis0212<<14 | 0x47<<7 | 0x1F,\n\t39098 - 19968: jis0212<<14 | 0x47<<7 | 0x20,\n\t39099 - 19968: jis0212<<14 | 0x47<<7 | 0x21,\n\t39103 - 19968: jis0212<<14 | 0x47<<7 | 0x22,\n\t39106 - 19968: jis0212<<14 | 0x47<<7 | 0x23,\n\t39107 - 19968: jis0208<<14 | 0x50<<7 | 0x08,\n\t39108 - 19968: jis0208<<14 | 0x50<<7 | 0x07,\n\t39109 - 19968: jis0212<<14 | 0x47<<7 | 0x24,\n\t39110 - 19968: jis0208<<14 | 0x50<<7 | 0x09,\n\t39112 - 19968: jis0212<<14 | 0x47<<7 | 0x25,\n\t39116 - 19968: jis0212<<14 | 0x47<<7 | 0x26,\n\t39131 - 19968: jis0208<<14 | 0x27<<7 | 0x53,\n\t39132 - 19968: jis0208<<14 | 0x45<<7 | 0x2B,\n\t39135 - 19968: jis0208<<14 | 0x1E<<7 | 0x08,\n\t39137 - 19968: jis0212<<14 | 0x47<<7 | 0x27,\n\t39138 - 19968: jis0208<<14 | 0x14<<7 | 0x11,\n\t39139 - 19968: jis0212<<14 | 0x47<<7 | 0x28,\n\t39141 - 19968: jis0212<<14 | 0x47<<7 | 0x29,\n\t39142 - 19968: jis0212<<14 | 0x47<<7 | 0x2A,\n\t39143 - 19968: jis0212<<14 | 0x47<<7 | 0x2B,\n\t39145 - 19968: jis0208<<14 | 0x50<<7 | 0x0A,\n\t39146 - 19968: jis0212<<14 | 0x47<<7 | 0x2C,\n\t39147 - 19968: jis0208<<14 | 0x50<<7 | 0x0B,\n\t39149 - 19968: jis0208<<14 | 0x31<<7 | 0x0B,\n\t39150 - 19968: jis0208<<14 | 0x3C<<7 | 0x1A,\n\t39151 - 19968: jis0208<<14 | 0x27<<7 | 0x32,\n\t39154 - 19968: jis0208<<14 | 0x0F<<7 | 0x5A,\n\t39155 - 19968: jis0212<<14 | 0x47<<7 | 0x2D,\n\t39156 - 19968: jis0208<<14 | 0x0F<<7 | 0x1A,\n\t39158 - 19968: jis0212<<14 | 0x47<<7 | 0x2E,\n\t39164 - 19968: jis0208<<14 | 0x1A<<7 | 0x53,\n\t39165 - 19968: jis0208<<14 | 0x2A<<7 | 0x0F,\n\t39166 - 19968: jis0208<<14 | 0x1D<<7 | 0x5D,\n\t39170 - 19968: jis0212<<14 | 0x47<<7 | 0x2F,\n\t39171 - 19968: jis0208<<14 | 0x50<<7 | 0x0C,\n\t39173 - 19968: jis0208<<14 | 0x2B<<7 | 0x3E,\n\t39175 - 19968: jis0212<<14 | 0x47<<7 | 0x30,\n\t39176 - 19968: jis0212<<14 | 0x47<<7 | 0x31,\n\t39177 - 19968: jis0208<<14 | 0x50<<7 | 0x0D,\n\t39178 - 19968: jis0208<<14 | 0x2C<<7 | 0x3B,\n\t39180 - 19968: jis0208<<14 | 0x10<<7 | 0x21,\n\t39184 - 19968: jis0208<<14 | 0x1A<<7 | 0x20,\n\t39185 - 19968: jis0212<<14 | 0x47<<7 | 0x32,\n\t39186 - 19968: jis0208<<14 | 0x50<<7 | 0x0E,\n\t39187 - 19968: jis0208<<14 | 0x11<<7 | 0x4D,\n\t39188 - 19968: jis0208<<14 | 0x50<<7 | 0x0F,\n\t39189 - 19968: jis0212<<14 | 0x47<<7 | 0x33,\n\t39190 - 19968: jis0212<<14 | 0x47<<7 | 0x34,\n\t39191 - 19968: jis0212<<14 | 0x47<<7 | 0x35,\n\t39192 - 19968: jis0208<<14 | 0x50<<7 | 0x10,\n\t39194 - 19968: jis0212<<14 | 0x47<<7 | 0x36,\n\t39195 - 19968: jis0212<<14 | 0x47<<7 | 0x37,\n\t39196 - 19968: jis0212<<14 | 0x47<<7 | 0x38,\n\t39197 - 19968: jis0208<<14 | 0x50<<7 | 0x12,\n\t39198 - 19968: jis0208<<14 | 0x50<<7 | 0x13,\n\t39199 - 19968: jis0212<<14 | 0x47<<7 | 0x39,\n\t39200 - 19968: jis0208<<14 | 0x50<<7 | 0x15,\n\t39201 - 19968: jis0208<<14 | 0x50<<7 | 0x11,\n\t39202 - 19968: jis0212<<14 | 0x47<<7 | 0x3A,\n\t39204 - 19968: jis0208<<14 | 0x50<<7 | 0x14,\n\t39206 - 19968: jis0212<<14 | 0x47<<7 | 0x3B,\n\t39207 - 19968: jis0208<<14 | 0x5B<<7 | 0x3D,\n\t39208 - 19968: jis0208<<14 | 0x13<<7 | 0x3A,\n\t39211 - 19968: jis0212<<14 | 0x47<<7 | 0x3D,\n\t39212 - 19968: jis0208<<14 | 0x50<<7 | 0x16,\n\t39214 - 19968: jis0208<<14 | 0x50<<7 | 0x17,\n\t39217 - 19968: jis0212<<14 | 0x47<<7 | 0x3E,\n\t39218 - 19968: jis0212<<14 | 0x47<<7 | 0x3F,\n\t39219 - 19968: jis0212<<14 | 0x47<<7 | 0x40,\n\t39220 - 19968: jis0212<<14 | 0x47<<7 | 0x41,\n\t39221 - 19968: jis0212<<14 | 0x47<<7 | 0x42,\n\t39225 - 19968: jis0212<<14 | 0x47<<7 | 0x43,\n\t39226 - 19968: jis0212<<14 | 0x47<<7 | 0x44,\n\t39227 - 19968: jis0212<<14 | 0x47<<7 | 0x45,\n\t39228 - 19968: jis0212<<14 | 0x47<<7 | 0x46,\n\t39229 - 19968: jis0208<<14 | 0x50<<7 | 0x18,\n\t39230 - 19968: jis0208<<14 | 0x50<<7 | 0x19,\n\t39232 - 19968: jis0212<<14 | 0x47<<7 | 0x47,\n\t39233 - 19968: jis0212<<14 | 0x47<<7 | 0x48,\n\t39234 - 19968: jis0208<<14 | 0x50<<7 | 0x1A,\n\t39237 - 19968: jis0208<<14 | 0x50<<7 | 0x1C,\n\t39238 - 19968: jis0212<<14 | 0x47<<7 | 0x49,\n\t39239 - 19968: jis0212<<14 | 0x47<<7 | 0x4A,\n\t39240 - 19968: jis0212<<14 | 0x47<<7 | 0x4B,\n\t39241 - 19968: jis0208<<14 | 0x50<<7 | 0x1B,\n\t39243 - 19968: jis0208<<14 | 0x50<<7 | 0x1E,\n\t39244 - 19968: jis0208<<14 | 0x50<<7 | 0x21,\n\t39245 - 19968: jis0212<<14 | 0x47<<7 | 0x4C,\n\t39246 - 19968: jis0212<<14 | 0x47<<7 | 0x4D,\n\t39248 - 19968: jis0208<<14 | 0x50<<7 | 0x1D,\n\t39249 - 19968: jis0208<<14 | 0x50<<7 | 0x1F,\n\t39250 - 19968: jis0208<<14 | 0x50<<7 | 0x20,\n\t39252 - 19968: jis0212<<14 | 0x47<<7 | 0x4E,\n\t39253 - 19968: jis0208<<14 | 0x50<<7 | 0x22,\n\t39255 - 19968: jis0208<<14 | 0x15<<7 | 0x21,\n\t39256 - 19968: jis0212<<14 | 0x47<<7 | 0x4F,\n\t39257 - 19968: jis0212<<14 | 0x47<<7 | 0x50,\n\t39259 - 19968: jis0212<<14 | 0x47<<7 | 0x51,\n\t39260 - 19968: jis0212<<14 | 0x47<<7 | 0x52,\n\t39262 - 19968: jis0212<<14 | 0x47<<7 | 0x53,\n\t39263 - 19968: jis0212<<14 | 0x47<<7 | 0x54,\n\t39264 - 19968: jis0212<<14 | 0x47<<7 | 0x55,\n\t39318 - 19968: jis0208<<14 | 0x1B<<7 | 0x52,\n\t39319 - 19968: jis0208<<14 | 0x50<<7 | 0x23,\n\t39320 - 19968: jis0208<<14 | 0x50<<7 | 0x24,\n\t39321 - 19968: jis0208<<14 | 0x18<<7 | 0x40,\n\t39323 - 19968: jis0212<<14 | 0x47<<7 | 0x56,\n\t39325 - 19968: jis0212<<14 | 0x47<<7 | 0x57,\n\t39326 - 19968: jis0208<<14 | 0x5B<<7 | 0x3F,\n\t39327 - 19968: jis0212<<14 | 0x47<<7 | 0x58,\n\t39333 - 19968: jis0208<<14 | 0x50<<7 | 0x25,\n\t39334 - 19968: jis0212<<14 | 0x47<<7 | 0x59,\n\t39336 - 19968: jis0208<<14 | 0x12<<7 | 0x1D,\n\t39340 - 19968: jis0208<<14 | 0x26<<7 | 0x2E,\n\t39341 - 19968: jis0208<<14 | 0x50<<7 | 0x26,\n\t39342 - 19968: jis0208<<14 | 0x50<<7 | 0x27,\n\t39344 - 19968: jis0212<<14 | 0x47<<7 | 0x5A,\n\t39345 - 19968: jis0212<<14 | 0x47<<7 | 0x5B,\n\t39346 - 19968: jis0212<<14 | 0x47<<7 | 0x5C,\n\t39347 - 19968: jis0208<<14 | 0x22<<7 | 0x39,\n\t39348 - 19968: jis0208<<14 | 0x25<<7 | 0x4A,\n\t39349 - 19968: jis0212<<14 | 0x47<<7 | 0x5D,\n\t39353 - 19968: jis0212<<14 | 0x48<<7 | 0x00,\n\t39354 - 19968: jis0212<<14 | 0x48<<7 | 0x01,\n\t39356 - 19968: jis0208<<14 | 0x50<<7 | 0x28,\n\t39357 - 19968: jis0212<<14 | 0x48<<7 | 0x02,\n\t39359 - 19968: jis0212<<14 | 0x48<<7 | 0x03,\n\t39361 - 19968: jis0208<<14 | 0x26<<7 | 0x5C,\n\t39363 - 19968: jis0212<<14 | 0x48<<7 | 0x04,\n\t39364 - 19968: jis0208<<14 | 0x21<<7 | 0x2B,\n\t39365 - 19968: jis0208<<14 | 0x10<<7 | 0x37,\n\t39366 - 19968: jis0208<<14 | 0x15<<7 | 0x4D,\n\t39368 - 19968: jis0208<<14 | 0x15<<7 | 0x4E,\n\t39369 - 19968: jis0212<<14 | 0x48<<7 | 0x05,\n\t39376 - 19968: jis0208<<14 | 0x22<<7 | 0x52,\n\t39377 - 19968: jis0208<<14 | 0x50<<7 | 0x2D,\n\t39378 - 19968: jis0208<<14 | 0x15<<7 | 0x4F,\n\t39379 - 19968: jis0212<<14 | 0x48<<7 | 0x06,\n\t39380 - 19968: jis0212<<14 | 0x48<<7 | 0x07,\n\t39381 - 19968: jis0208<<14 | 0x11<<7 | 0x4E,\n\t39384 - 19968: jis0208<<14 | 0x50<<7 | 0x2C,\n\t39385 - 19968: jis0212<<14 | 0x48<<7 | 0x08,\n\t39386 - 19968: jis0212<<14 | 0x48<<7 | 0x09,\n\t39387 - 19968: jis0208<<14 | 0x50<<7 | 0x2A,\n\t39388 - 19968: jis0212<<14 | 0x48<<7 | 0x0A,\n\t39389 - 19968: jis0208<<14 | 0x50<<7 | 0x2B,\n\t39390 - 19968: jis0212<<14 | 0x48<<7 | 0x0B,\n\t39391 - 19968: jis0208<<14 | 0x50<<7 | 0x29,\n\t39394 - 19968: jis0208<<14 | 0x50<<7 | 0x37,\n\t39399 - 19968: jis0212<<14 | 0x48<<7 | 0x0C,\n\t39402 - 19968: jis0212<<14 | 0x48<<7 | 0x0D,\n\t39403 - 19968: jis0212<<14 | 0x48<<7 | 0x0E,\n\t39404 - 19968: jis0212<<14 | 0x48<<7 | 0x0F,\n\t39405 - 19968: jis0208<<14 | 0x50<<7 | 0x2E,\n\t39406 - 19968: jis0208<<14 | 0x50<<7 | 0x2F,\n\t39408 - 19968: jis0212<<14 | 0x48<<7 | 0x10,\n\t39409 - 19968: jis0208<<14 | 0x50<<7 | 0x30,\n\t39410 - 19968: jis0208<<14 | 0x50<<7 | 0x31,\n\t39412 - 19968: jis0212<<14 | 0x48<<7 | 0x11,\n\t39413 - 19968: jis0212<<14 | 0x48<<7 | 0x12,\n\t39416 - 19968: jis0208<<14 | 0x50<<7 | 0x33,\n\t39417 - 19968: jis0212<<14 | 0x48<<7 | 0x13,\n\t39419 - 19968: jis0208<<14 | 0x50<<7 | 0x32,\n\t39421 - 19968: jis0212<<14 | 0x48<<7 | 0x14,\n\t39422 - 19968: jis0212<<14 | 0x48<<7 | 0x15,\n\t39423 - 19968: jis0208<<14 | 0x1C<<7 | 0x38,\n\t39425 - 19968: jis0208<<14 | 0x50<<7 | 0x34,\n\t39426 - 19968: jis0212<<14 | 0x48<<7 | 0x16,\n\t39427 - 19968: jis0212<<14 | 0x48<<7 | 0x17,\n\t39428 - 19968: jis0212<<14 | 0x48<<7 | 0x18,\n\t39429 - 19968: jis0208<<14 | 0x50<<7 | 0x36,\n\t39435 - 19968: jis0212<<14 | 0x48<<7 | 0x19,\n\t39436 - 19968: jis0212<<14 | 0x48<<7 | 0x1A,\n\t39438 - 19968: jis0208<<14 | 0x14<<7 | 0x12,\n\t39439 - 19968: jis0208<<14 | 0x50<<7 | 0x35,\n\t39440 - 19968: jis0212<<14 | 0x48<<7 | 0x1B,\n\t39441 - 19968: jis0212<<14 | 0x48<<7 | 0x1C,\n\t39442 - 19968: jis0208<<14 | 0x20<<7 | 0x5A,\n\t39443 - 19968: jis0208<<14 | 0x17<<7 | 0x12,\n\t39446 - 19968: jis0212<<14 | 0x48<<7 | 0x1D,\n\t39449 - 19968: jis0208<<14 | 0x50<<7 | 0x38,\n\t39454 - 19968: jis0212<<14 | 0x48<<7 | 0x1E,\n\t39456 - 19968: jis0212<<14 | 0x48<<7 | 0x1F,\n\t39458 - 19968: jis0212<<14 | 0x48<<7 | 0x20,\n\t39459 - 19968: jis0212<<14 | 0x48<<7 | 0x21,\n\t39460 - 19968: jis0212<<14 | 0x48<<7 | 0x22,\n\t39463 - 19968: jis0212<<14 | 0x48<<7 | 0x23,\n\t39464 - 19968: jis0208<<14 | 0x21<<7 | 0x2C,\n\t39467 - 19968: jis0208<<14 | 0x50<<7 | 0x39,\n\t39469 - 19968: jis0212<<14 | 0x48<<7 | 0x24,\n\t39470 - 19968: jis0212<<14 | 0x48<<7 | 0x25,\n\t39472 - 19968: jis0208<<14 | 0x25<<7 | 0x0C,\n\t39475 - 19968: jis0212<<14 | 0x48<<7 | 0x26,\n\t39477 - 19968: jis0212<<14 | 0x48<<7 | 0x27,\n\t39478 - 19968: jis0212<<14 | 0x48<<7 | 0x28,\n\t39479 - 19968: jis0208<<14 | 0x50<<7 | 0x3A,\n\t39480 - 19968: jis0212<<14 | 0x48<<7 | 0x29,\n\t39486 - 19968: jis0208<<14 | 0x50<<7 | 0x3F,\n\t39488 - 19968: jis0208<<14 | 0x50<<7 | 0x3D,\n\t39489 - 19968: jis0212<<14 | 0x48<<7 | 0x2B,\n\t39490 - 19968: jis0208<<14 | 0x50<<7 | 0x3C,\n\t39491 - 19968: jis0208<<14 | 0x50<<7 | 0x3E,\n\t39492 - 19968: jis0212<<14 | 0x48<<7 | 0x2C,\n\t39493 - 19968: jis0208<<14 | 0x50<<7 | 0x3B,\n\t39495 - 19968: jis0212<<14 | 0x48<<7 | 0x2A,\n\t39498 - 19968: jis0212<<14 | 0x48<<7 | 0x2D,\n\t39499 - 19968: jis0212<<14 | 0x48<<7 | 0x2E,\n\t39500 - 19968: jis0212<<14 | 0x48<<7 | 0x2F,\n\t39501 - 19968: jis0208<<14 | 0x50<<7 | 0x41,\n\t39502 - 19968: jis0208<<14 | 0x5B<<7 | 0x40,\n\t39505 - 19968: jis0212<<14 | 0x48<<7 | 0x31,\n\t39508 - 19968: jis0212<<14 | 0x48<<7 | 0x32,\n\t39509 - 19968: jis0208<<14 | 0x50<<7 | 0x40,\n\t39510 - 19968: jis0212<<14 | 0x48<<7 | 0x33,\n\t39511 - 19968: jis0208<<14 | 0x50<<7 | 0x43,\n\t39514 - 19968: jis0208<<14 | 0x15<<7 | 0x22,\n\t39515 - 19968: jis0208<<14 | 0x50<<7 | 0x42,\n\t39517 - 19968: jis0212<<14 | 0x48<<7 | 0x34,\n\t39519 - 19968: jis0208<<14 | 0x50<<7 | 0x44,\n\t39522 - 19968: jis0208<<14 | 0x50<<7 | 0x45,\n\t39524 - 19968: jis0208<<14 | 0x50<<7 | 0x47,\n\t39525 - 19968: jis0208<<14 | 0x50<<7 | 0x46,\n\t39529 - 19968: jis0208<<14 | 0x50<<7 | 0x48,\n\t39530 - 19968: jis0208<<14 | 0x50<<7 | 0x4A,\n\t39531 - 19968: jis0208<<14 | 0x50<<7 | 0x49,\n\t39592 - 19968: jis0208<<14 | 0x18<<7 | 0x5B,\n\t39594 - 19968: jis0212<<14 | 0x48<<7 | 0x35,\n\t39596 - 19968: jis0212<<14 | 0x48<<7 | 0x36,\n\t39597 - 19968: jis0208<<14 | 0x50<<7 | 0x4B,\n\t39598 - 19968: jis0212<<14 | 0x48<<7 | 0x37,\n\t39599 - 19968: jis0212<<14 | 0x48<<7 | 0x38,\n\t39600 - 19968: jis0208<<14 | 0x50<<7 | 0x4C,\n\t39602 - 19968: jis0212<<14 | 0x48<<7 | 0x39,\n\t39604 - 19968: jis0212<<14 | 0x48<<7 | 0x3A,\n\t39605 - 19968: jis0212<<14 | 0x48<<7 | 0x3B,\n\t39606 - 19968: jis0212<<14 | 0x48<<7 | 0x3C,\n\t39608 - 19968: jis0208<<14 | 0x12<<7 | 0x1B,\n\t39609 - 19968: jis0212<<14 | 0x48<<7 | 0x3D,\n\t39611 - 19968: jis0212<<14 | 0x48<<7 | 0x3E,\n\t39612 - 19968: jis0208<<14 | 0x50<<7 | 0x4D,\n\t39614 - 19968: jis0212<<14 | 0x48<<7 | 0x3F,\n\t39615 - 19968: jis0212<<14 | 0x48<<7 | 0x40,\n\t39616 - 19968: jis0208<<14 | 0x50<<7 | 0x4E,\n\t39617 - 19968: jis0212<<14 | 0x48<<7 | 0x41,\n\t39619 - 19968: jis0212<<14 | 0x48<<7 | 0x42,\n\t39620 - 19968: jis0208<<14 | 0x1E<<7 | 0x50,\n\t39622 - 19968: jis0212<<14 | 0x48<<7 | 0x43,\n\t39624 - 19968: jis0212<<14 | 0x48<<7 | 0x44,\n\t39630 - 19968: jis0212<<14 | 0x48<<7 | 0x45,\n\t39631 - 19968: jis0208<<14 | 0x50<<7 | 0x4F,\n\t39632 - 19968: jis0212<<14 | 0x48<<7 | 0x46,\n\t39633 - 19968: jis0208<<14 | 0x50<<7 | 0x50,\n\t39634 - 19968: jis0212<<14 | 0x48<<7 | 0x47,\n\t39635 - 19968: jis0208<<14 | 0x50<<7 | 0x51,\n\t39636 - 19968: jis0208<<14 | 0x50<<7 | 0x52,\n\t39637 - 19968: jis0212<<14 | 0x48<<7 | 0x48,\n\t39638 - 19968: jis0212<<14 | 0x48<<7 | 0x49,\n\t39639 - 19968: jis0212<<14 | 0x48<<7 | 0x4A,\n\t39640 - 19968: jis0208<<14 | 0x18<<7 | 0x41,\n\t39641 - 19968: jis0208<<14 | 0x5B<<7 | 0x41,\n\t39643 - 19968: jis0212<<14 | 0x48<<7 | 0x4B,\n\t39644 - 19968: jis0208<<14 | 0x5B<<7 | 0x42,\n\t39646 - 19968: jis0208<<14 | 0x50<<7 | 0x53,\n\t39647 - 19968: jis0208<<14 | 0x50<<7 | 0x54,\n\t39648 - 19968: jis0212<<14 | 0x48<<7 | 0x4D,\n\t39650 - 19968: jis0208<<14 | 0x50<<7 | 0x55,\n\t39651 - 19968: jis0208<<14 | 0x50<<7 | 0x56,\n\t39652 - 19968: jis0212<<14 | 0x48<<7 | 0x4E,\n\t39653 - 19968: jis0212<<14 | 0x48<<7 | 0x4F,\n\t39654 - 19968: jis0208<<14 | 0x50<<7 | 0x57,\n\t39655 - 19968: jis0212<<14 | 0x48<<7 | 0x50,\n\t39657 - 19968: jis0212<<14 | 0x48<<7 | 0x51,\n\t39658 - 19968: jis0208<<14 | 0x27<<7 | 0x10,\n\t39659 - 19968: jis0208<<14 | 0x50<<7 | 0x59,\n\t39660 - 19968: jis0212<<14 | 0x48<<7 | 0x52,\n\t39661 - 19968: jis0208<<14 | 0x28<<7 | 0x05,\n\t39662 - 19968: jis0208<<14 | 0x50<<7 | 0x5A,\n\t39663 - 19968: jis0208<<14 | 0x50<<7 | 0x58,\n\t39665 - 19968: jis0208<<14 | 0x50<<7 | 0x5C,\n\t39666 - 19968: jis0212<<14 | 0x48<<7 | 0x53,\n\t39667 - 19968: jis0212<<14 | 0x48<<7 | 0x54,\n\t39668 - 19968: jis0208<<14 | 0x50<<7 | 0x5B,\n\t39669 - 19968: jis0212<<14 | 0x48<<7 | 0x55,\n\t39671 - 19968: jis0208<<14 | 0x50<<7 | 0x5D,\n\t39673 - 19968: jis0212<<14 | 0x48<<7 | 0x56,\n\t39674 - 19968: jis0212<<14 | 0x48<<7 | 0x57,\n\t39675 - 19968: jis0208<<14 | 0x51<<7 | 0x00,\n\t39677 - 19968: jis0212<<14 | 0x48<<7 | 0x58,\n\t39679 - 19968: jis0212<<14 | 0x48<<7 | 0x59,\n\t39680 - 19968: jis0212<<14 | 0x48<<7 | 0x5A,\n\t39681 - 19968: jis0212<<14 | 0x48<<7 | 0x5B,\n\t39682 - 19968: jis0212<<14 | 0x48<<7 | 0x5C,\n\t39683 - 19968: jis0212<<14 | 0x48<<7 | 0x5D,\n\t39684 - 19968: jis0212<<14 | 0x49<<7 | 0x00,\n\t39685 - 19968: jis0212<<14 | 0x49<<7 | 0x01,\n\t39686 - 19968: jis0208<<14 | 0x51<<7 | 0x01,\n\t39688 - 19968: jis0212<<14 | 0x49<<7 | 0x02,\n\t39689 - 19968: jis0212<<14 | 0x49<<7 | 0x03,\n\t39691 - 19968: jis0212<<14 | 0x49<<7 | 0x04,\n\t39692 - 19968: jis0212<<14 | 0x49<<7 | 0x05,\n\t39693 - 19968: jis0212<<14 | 0x49<<7 | 0x06,\n\t39694 - 19968: jis0212<<14 | 0x49<<7 | 0x07,\n\t39696 - 19968: jis0212<<14 | 0x49<<7 | 0x08,\n\t39698 - 19968: jis0212<<14 | 0x49<<7 | 0x09,\n\t39702 - 19968: jis0212<<14 | 0x49<<7 | 0x0A,\n\t39704 - 19968: jis0208<<14 | 0x51<<7 | 0x02,\n\t39705 - 19968: jis0212<<14 | 0x49<<7 | 0x0B,\n\t39706 - 19968: jis0208<<14 | 0x51<<7 | 0x03,\n\t39707 - 19968: jis0212<<14 | 0x49<<7 | 0x0C,\n\t39708 - 19968: jis0212<<14 | 0x49<<7 | 0x0D,\n\t39711 - 19968: jis0208<<14 | 0x51<<7 | 0x04,\n\t39712 - 19968: jis0212<<14 | 0x49<<7 | 0x0E,\n\t39714 - 19968: jis0208<<14 | 0x51<<7 | 0x05,\n\t39715 - 19968: jis0208<<14 | 0x51<<7 | 0x06,\n\t39717 - 19968: jis0208<<14 | 0x51<<7 | 0x07,\n\t39718 - 19968: jis0212<<14 | 0x49<<7 | 0x0F,\n\t39719 - 19968: jis0208<<14 | 0x51<<7 | 0x08,\n\t39720 - 19968: jis0208<<14 | 0x51<<7 | 0x09,\n\t39721 - 19968: jis0208<<14 | 0x51<<7 | 0x0A,\n\t39722 - 19968: jis0208<<14 | 0x51<<7 | 0x0B,\n\t39723 - 19968: jis0212<<14 | 0x49<<7 | 0x10,\n\t39725 - 19968: jis0212<<14 | 0x49<<7 | 0x11,\n\t39726 - 19968: jis0208<<14 | 0x51<<7 | 0x0C,\n\t39727 - 19968: jis0208<<14 | 0x51<<7 | 0x0D,\n\t39729 - 19968: jis0208<<14 | 0x3C<<7 | 0x14,\n\t39730 - 19968: jis0208<<14 | 0x51<<7 | 0x0E,\n\t39731 - 19968: jis0212<<14 | 0x49<<7 | 0x12,\n\t39732 - 19968: jis0212<<14 | 0x49<<7 | 0x13,\n\t39733 - 19968: jis0212<<14 | 0x49<<7 | 0x14,\n\t39735 - 19968: jis0212<<14 | 0x49<<7 | 0x15,\n\t39737 - 19968: jis0212<<14 | 0x49<<7 | 0x16,\n\t39738 - 19968: jis0212<<14 | 0x49<<7 | 0x17,\n\t39739 - 19968: jis0208<<14 | 0x43<<7 | 0x57,\n\t39740 - 19968: jis0208<<14 | 0x14<<7 | 0x13,\n\t39741 - 19968: jis0212<<14 | 0x49<<7 | 0x18,\n\t39745 - 19968: jis0208<<14 | 0x12<<7 | 0x00,\n\t39746 - 19968: jis0208<<14 | 0x19<<7 | 0x11,\n\t39747 - 19968: jis0208<<14 | 0x51<<7 | 0x10,\n\t39748 - 19968: jis0208<<14 | 0x51<<7 | 0x0F,\n\t39749 - 19968: jis0208<<14 | 0x2B<<7 | 0x04,\n\t39752 - 19968: jis0212<<14 | 0x49<<7 | 0x19,\n\t39755 - 19968: jis0212<<14 | 0x49<<7 | 0x1A,\n\t39756 - 19968: jis0212<<14 | 0x49<<7 | 0x1B,\n\t39757 - 19968: jis0208<<14 | 0x51<<7 | 0x12,\n\t39758 - 19968: jis0208<<14 | 0x51<<7 | 0x13,\n\t39759 - 19968: jis0208<<14 | 0x51<<7 | 0x11,\n\t39761 - 19968: jis0208<<14 | 0x51<<7 | 0x14,\n\t39764 - 19968: jis0208<<14 | 0x2A<<7 | 0x41,\n\t39765 - 19968: jis0212<<14 | 0x49<<7 | 0x1C,\n\t39766 - 19968: jis0212<<14 | 0x49<<7 | 0x1D,\n\t39767 - 19968: jis0212<<14 | 0x49<<7 | 0x1E,\n\t39768 - 19968: jis0208<<14 | 0x51<<7 | 0x15,\n\t39770 - 19968: jis0208<<14 | 0x14<<7 | 0x5A,\n\t39771 - 19968: jis0212<<14 | 0x49<<7 | 0x1F,\n\t39774 - 19968: jis0212<<14 | 0x49<<7 | 0x20,\n\t39777 - 19968: jis0212<<14 | 0x49<<7 | 0x21,\n\t39779 - 19968: jis0212<<14 | 0x49<<7 | 0x22,\n\t39781 - 19968: jis0212<<14 | 0x49<<7 | 0x23,\n\t39782 - 19968: jis0212<<14 | 0x49<<7 | 0x24,\n\t39784 - 19968: jis0212<<14 | 0x49<<7 | 0x25,\n\t39786 - 19968: jis0212<<14 | 0x49<<7 | 0x26,\n\t39787 - 19968: jis0212<<14 | 0x49<<7 | 0x27,\n\t39788 - 19968: jis0212<<14 | 0x49<<7 | 0x28,\n\t39789 - 19968: jis0212<<14 | 0x49<<7 | 0x29,\n\t39790 - 19968: jis0212<<14 | 0x49<<7 | 0x2A,\n\t39791 - 19968: jis0208<<14 | 0x2E<<7 | 0x04,\n\t39794 - 19968: jis0208<<14 | 0x5B<<7 | 0x44,\n\t39795 - 19968: jis0212<<14 | 0x49<<7 | 0x2B,\n\t39796 - 19968: jis0208<<14 | 0x51<<7 | 0x16,\n\t39797 - 19968: jis0208<<14 | 0x5B<<7 | 0x43,\n\t39799 - 19968: jis0212<<14 | 0x49<<7 | 0x2D,\n\t39800 - 19968: jis0212<<14 | 0x49<<7 | 0x2E,\n\t39801 - 19968: jis0212<<14 | 0x49<<7 | 0x2F,\n\t39807 - 19968: jis0212<<14 | 0x49<<7 | 0x30,\n\t39808 - 19968: jis0212<<14 | 0x49<<7 | 0x31,\n\t39811 - 19968: jis0208<<14 | 0x51<<7 | 0x18,\n\t39812 - 19968: jis0212<<14 | 0x49<<7 | 0x32,\n\t39813 - 19968: jis0212<<14 | 0x49<<7 | 0x33,\n\t39814 - 19968: jis0212<<14 | 0x49<<7 | 0x34,\n\t39815 - 19968: jis0212<<14 | 0x49<<7 | 0x35,\n\t39817 - 19968: jis0212<<14 | 0x49<<7 | 0x36,\n\t39818 - 19968: jis0212<<14 | 0x49<<7 | 0x37,\n\t39819 - 19968: jis0212<<14 | 0x49<<7 | 0x38,\n\t39821 - 19968: jis0212<<14 | 0x49<<7 | 0x39,\n\t39822 - 19968: jis0208<<14 | 0x0F<<7 | 0x1D,\n\t39823 - 19968: jis0208<<14 | 0x5B<<7 | 0x45,\n\t39824 - 19968: jis0212<<14 | 0x49<<7 | 0x3B,\n\t39825 - 19968: jis0208<<14 | 0x51<<7 | 0x19,\n\t39826 - 19968: jis0208<<14 | 0x29<<7 | 0x0A,\n\t39827 - 19968: jis0208<<14 | 0x51<<7 | 0x17,\n\t39828 - 19968: jis0212<<14 | 0x49<<7 | 0x3C,\n\t39830 - 19968: jis0208<<14 | 0x51<<7 | 0x1A,\n\t39831 - 19968: jis0208<<14 | 0x51<<7 | 0x1B,\n\t39834 - 19968: jis0212<<14 | 0x49<<7 | 0x3D,\n\t39837 - 19968: jis0212<<14 | 0x49<<7 | 0x3E,\n\t39838 - 19968: jis0212<<14 | 0x49<<7 | 0x3F,\n\t39839 - 19968: jis0208<<14 | 0x51<<7 | 0x1C,\n\t39840 - 19968: jis0208<<14 | 0x51<<7 | 0x1D,\n\t39846 - 19968: jis0212<<14 | 0x49<<7 | 0x40,\n\t39847 - 19968: jis0212<<14 | 0x49<<7 | 0x41,\n\t39848 - 19968: jis0208<<14 | 0x51<<7 | 0x1E,\n\t39849 - 19968: jis0212<<14 | 0x49<<7 | 0x42,\n\t39850 - 19968: jis0208<<14 | 0x2A<<7 | 0x4D,\n\t39851 - 19968: jis0208<<14 | 0x1A<<7 | 0x0C,\n\t39852 - 19968: jis0212<<14 | 0x49<<7 | 0x43,\n\t39853 - 19968: jis0208<<14 | 0x19<<7 | 0x59,\n\t39854 - 19968: jis0208<<14 | 0x20<<7 | 0x0E,\n\t39856 - 19968: jis0212<<14 | 0x49<<7 | 0x44,\n\t39857 - 19968: jis0208<<14 | 0x5B<<7 | 0x46,\n\t39858 - 19968: jis0212<<14 | 0x49<<7 | 0x46,\n\t39860 - 19968: jis0208<<14 | 0x51<<7 | 0x1F,\n\t39863 - 19968: jis0212<<14 | 0x49<<7 | 0x47,\n\t39864 - 19968: jis0212<<14 | 0x49<<7 | 0x48,\n\t39865 - 19968: jis0208<<14 | 0x51<<7 | 0x22,\n\t39867 - 19968: jis0208<<14 | 0x5B<<7 | 0x47,\n\t39868 - 19968: jis0212<<14 | 0x49<<7 | 0x4A,\n\t39870 - 19968: jis0212<<14 | 0x49<<7 | 0x4B,\n\t39871 - 19968: jis0212<<14 | 0x49<<7 | 0x4C,\n\t39872 - 19968: jis0208<<14 | 0x51<<7 | 0x20,\n\t39873 - 19968: jis0212<<14 | 0x49<<7 | 0x4D,\n\t39878 - 19968: jis0208<<14 | 0x51<<7 | 0x23,\n\t39879 - 19968: jis0212<<14 | 0x49<<7 | 0x4E,\n\t39880 - 19968: jis0212<<14 | 0x49<<7 | 0x4F,\n\t39881 - 19968: jis0208<<14 | 0x17<<7 | 0x50,\n\t39882 - 19968: jis0208<<14 | 0x51<<7 | 0x21,\n\t39886 - 19968: jis0212<<14 | 0x49<<7 | 0x50,\n\t39887 - 19968: jis0208<<14 | 0x51<<7 | 0x24,\n\t39888 - 19968: jis0212<<14 | 0x49<<7 | 0x51,\n\t39889 - 19968: jis0208<<14 | 0x51<<7 | 0x25,\n\t39890 - 19968: jis0208<<14 | 0x51<<7 | 0x26,\n\t39892 - 19968: jis0208<<14 | 0x51<<7 | 0x2A,\n\t39894 - 19968: jis0208<<14 | 0x1A<<7 | 0x09,\n\t39895 - 19968: jis0212<<14 | 0x49<<7 | 0x52,\n\t39896 - 19968: jis0212<<14 | 0x49<<7 | 0x53,\n\t39899 - 19968: jis0208<<14 | 0x21<<7 | 0x43,\n\t39901 - 19968: jis0212<<14 | 0x49<<7 | 0x54,\n\t39903 - 19968: jis0212<<14 | 0x49<<7 | 0x55,\n\t39905 - 19968: jis0208<<14 | 0x51<<7 | 0x2B,\n\t39906 - 19968: jis0208<<14 | 0x51<<7 | 0x28,\n\t39907 - 19968: jis0208<<14 | 0x51<<7 | 0x27,\n\t39908 - 19968: jis0208<<14 | 0x51<<7 | 0x29,\n\t39909 - 19968: jis0212<<14 | 0x49<<7 | 0x56,\n\t39911 - 19968: jis0212<<14 | 0x49<<7 | 0x57,\n\t39912 - 19968: jis0208<<14 | 0x16<<7 | 0x3E,\n\t39914 - 19968: jis0212<<14 | 0x49<<7 | 0x58,\n\t39915 - 19968: jis0212<<14 | 0x49<<7 | 0x59,\n\t39919 - 19968: jis0212<<14 | 0x49<<7 | 0x5A,\n\t39920 - 19968: jis0208<<14 | 0x51<<7 | 0x2F,\n\t39921 - 19968: jis0208<<14 | 0x51<<7 | 0x2E,\n\t39922 - 19968: jis0208<<14 | 0x51<<7 | 0x2D,\n\t39923 - 19968: jis0212<<14 | 0x49<<7 | 0x5B,\n\t39925 - 19968: jis0208<<14 | 0x0F<<7 | 0x12,\n\t39927 - 19968: jis0212<<14 | 0x49<<7 | 0x5C,\n\t39928 - 19968: jis0212<<14 | 0x49<<7 | 0x5D,\n\t39929 - 19968: jis0212<<14 | 0x4A<<7 | 0x00,\n\t39930 - 19968: jis0212<<14 | 0x4A<<7 | 0x01,\n\t39933 - 19968: jis0212<<14 | 0x4A<<7 | 0x02,\n\t39935 - 19968: jis0212<<14 | 0x4A<<7 | 0x03,\n\t39936 - 19968: jis0208<<14 | 0x5B<<7 | 0x48,\n\t39938 - 19968: jis0212<<14 | 0x4A<<7 | 0x05,\n\t39940 - 19968: jis0208<<14 | 0x51<<7 | 0x39,\n\t39942 - 19968: jis0208<<14 | 0x51<<7 | 0x35,\n\t39944 - 19968: jis0208<<14 | 0x51<<7 | 0x36,\n\t39945 - 19968: jis0208<<14 | 0x51<<7 | 0x32,\n\t39946 - 19968: jis0208<<14 | 0x51<<7 | 0x38,\n\t39947 - 19968: jis0212<<14 | 0x4A<<7 | 0x06,\n\t39948 - 19968: jis0208<<14 | 0x51<<7 | 0x34,\n\t39949 - 19968: jis0208<<14 | 0x12<<7 | 0x41,\n\t39951 - 19968: jis0212<<14 | 0x4A<<7 | 0x07,\n\t39952 - 19968: jis0208<<14 | 0x2E<<7 | 0x2B,\n\t39953 - 19968: jis0212<<14 | 0x4A<<7 | 0x08,\n\t39954 - 19968: jis0208<<14 | 0x51<<7 | 0x37,\n\t39955 - 19968: jis0208<<14 | 0x51<<7 | 0x33,\n\t39956 - 19968: jis0208<<14 | 0x51<<7 | 0x31,\n\t39957 - 19968: jis0208<<14 | 0x51<<7 | 0x30,\n\t39958 - 19968: jis0212<<14 | 0x4A<<7 | 0x09,\n\t39960 - 19968: jis0212<<14 | 0x4A<<7 | 0x0A,\n\t39961 - 19968: jis0212<<14 | 0x4A<<7 | 0x0B,\n\t39962 - 19968: jis0212<<14 | 0x4A<<7 | 0x0C,\n\t39963 - 19968: jis0208<<14 | 0x51<<7 | 0x3B,\n\t39964 - 19968: jis0212<<14 | 0x4A<<7 | 0x0D,\n\t39966 - 19968: jis0212<<14 | 0x4A<<7 | 0x0E,\n\t39969 - 19968: jis0208<<14 | 0x51<<7 | 0x3E,\n\t39970 - 19968: jis0212<<14 | 0x4A<<7 | 0x0F,\n\t39971 - 19968: jis0212<<14 | 0x4A<<7 | 0x10,\n\t39972 - 19968: jis0208<<14 | 0x51<<7 | 0x3D,\n\t39973 - 19968: jis0208<<14 | 0x51<<7 | 0x3C,\n\t39974 - 19968: jis0212<<14 | 0x4A<<7 | 0x11,\n\t39975 - 19968: jis0212<<14 | 0x4A<<7 | 0x12,\n\t39976 - 19968: jis0212<<14 | 0x4A<<7 | 0x13,\n\t39977 - 19968: jis0212<<14 | 0x4A<<7 | 0x14,\n\t39978 - 19968: jis0212<<14 | 0x4A<<7 | 0x15,\n\t39981 - 19968: jis0208<<14 | 0x28<<7 | 0x28,\n\t39982 - 19968: jis0208<<14 | 0x51<<7 | 0x3A,\n\t39983 - 19968: jis0208<<14 | 0x0F<<7 | 0x52,\n\t39984 - 19968: jis0208<<14 | 0x51<<7 | 0x3F,\n\t39985 - 19968: jis0212<<14 | 0x4A<<7 | 0x16,\n\t39986 - 19968: jis0208<<14 | 0x51<<7 | 0x41,\n\t39989 - 19968: jis0212<<14 | 0x4A<<7 | 0x17,\n\t39990 - 19968: jis0212<<14 | 0x4A<<7 | 0x18,\n\t39991 - 19968: jis0212<<14 | 0x4A<<7 | 0x19,\n\t39993 - 19968: jis0208<<14 | 0x12<<7 | 0x4E,\n\t39994 - 19968: jis0208<<14 | 0x51<<7 | 0x2C,\n\t39995 - 19968: jis0208<<14 | 0x10<<7 | 0x16,\n\t39997 - 19968: jis0212<<14 | 0x4A<<7 | 0x1A,\n\t39998 - 19968: jis0208<<14 | 0x51<<7 | 0x43,\n\t40001 - 19968: jis0212<<14 | 0x4A<<7 | 0x1B,\n\t40003 - 19968: jis0212<<14 | 0x4A<<7 | 0x1C,\n\t40004 - 19968: jis0212<<14 | 0x4A<<7 | 0x1D,\n\t40005 - 19968: jis0212<<14 | 0x4A<<7 | 0x1E,\n\t40006 - 19968: jis0208<<14 | 0x51<<7 | 0x42,\n\t40007 - 19968: jis0208<<14 | 0x51<<7 | 0x40,\n\t40008 - 19968: jis0208<<14 | 0x22<<7 | 0x0C,\n\t40009 - 19968: jis0212<<14 | 0x4A<<7 | 0x1F,\n\t40010 - 19968: jis0212<<14 | 0x4A<<7 | 0x20,\n\t40014 - 19968: jis0212<<14 | 0x4A<<7 | 0x21,\n\t40015 - 19968: jis0212<<14 | 0x4A<<7 | 0x22,\n\t40016 - 19968: jis0212<<14 | 0x4A<<7 | 0x23,\n\t40018 - 19968: jis0208<<14 | 0x2A<<7 | 0x4F,\n\t40019 - 19968: jis0212<<14 | 0x4A<<7 | 0x24,\n\t40020 - 19968: jis0212<<14 | 0x4A<<7 | 0x25,\n\t40022 - 19968: jis0212<<14 | 0x4A<<7 | 0x26,\n\t40023 - 19968: jis0208<<14 | 0x2D<<7 | 0x39,\n\t40024 - 19968: jis0212<<14 | 0x4A<<7 | 0x27,\n\t40026 - 19968: jis0208<<14 | 0x51<<7 | 0x44,\n\t40027 - 19968: jis0212<<14 | 0x4A<<7 | 0x28,\n\t40028 - 19968: jis0212<<14 | 0x4A<<7 | 0x2F,\n\t40029 - 19968: jis0212<<14 | 0x4A<<7 | 0x29,\n\t40030 - 19968: jis0212<<14 | 0x4A<<7 | 0x2A,\n\t40031 - 19968: jis0212<<14 | 0x4A<<7 | 0x2B,\n\t40032 - 19968: jis0208<<14 | 0x51<<7 | 0x45,\n\t40035 - 19968: jis0212<<14 | 0x4A<<7 | 0x2C,\n\t40039 - 19968: jis0208<<14 | 0x51<<7 | 0x46,\n\t40040 - 19968: jis0212<<14 | 0x4A<<7 | 0x31,\n\t40041 - 19968: jis0212<<14 | 0x4A<<7 | 0x2D,\n\t40042 - 19968: jis0212<<14 | 0x4A<<7 | 0x2E,\n\t40043 - 19968: jis0212<<14 | 0x4A<<7 | 0x30,\n\t40046 - 19968: jis0212<<14 | 0x4A<<7 | 0x32,\n\t40048 - 19968: jis0212<<14 | 0x4A<<7 | 0x33,\n\t40050 - 19968: jis0212<<14 | 0x4A<<7 | 0x34,\n\t40053 - 19968: jis0212<<14 | 0x4A<<7 | 0x35,\n\t40054 - 19968: jis0208<<14 | 0x51<<7 | 0x47,\n\t40055 - 19968: jis0212<<14 | 0x4A<<7 | 0x36,\n\t40056 - 19968: jis0208<<14 | 0x51<<7 | 0x48,\n\t40059 - 19968: jis0212<<14 | 0x4A<<7 | 0x37,\n\t40165 - 19968: jis0208<<14 | 0x23<<7 | 0x1A,\n\t40166 - 19968: jis0212<<14 | 0x4A<<7 | 0x38,\n\t40167 - 19968: jis0208<<14 | 0x51<<7 | 0x49,\n\t40169 - 19968: jis0208<<14 | 0x27<<7 | 0x16,\n\t40171 - 19968: jis0208<<14 | 0x51<<7 | 0x4E,\n\t40172 - 19968: jis0208<<14 | 0x51<<7 | 0x4A,\n\t40176 - 19968: jis0208<<14 | 0x51<<7 | 0x4B,\n\t40178 - 19968: jis0212<<14 | 0x4A<<7 | 0x39,\n\t40179 - 19968: jis0208<<14 | 0x2A<<7 | 0x10,\n\t40180 - 19968: jis0208<<14 | 0x2B<<7 | 0x23,\n\t40182 - 19968: jis0208<<14 | 0x25<<7 | 0x2F,\n\t40183 - 19968: jis0212<<14 | 0x4A<<7 | 0x3A,\n\t40185 - 19968: jis0212<<14 | 0x4A<<7 | 0x3B,\n\t40194 - 19968: jis0212<<14 | 0x4A<<7 | 0x3D,\n\t40195 - 19968: jis0208<<14 | 0x51<<7 | 0x4F,\n\t40198 - 19968: jis0208<<14 | 0x51<<7 | 0x50,\n\t40199 - 19968: jis0208<<14 | 0x25<<7 | 0x1D,\n\t40200 - 19968: jis0208<<14 | 0x51<<7 | 0x4D,\n\t40201 - 19968: jis0208<<14 | 0x51<<7 | 0x4C,\n\t40203 - 19968: jis0212<<14 | 0x4A<<7 | 0x3C,\n\t40206 - 19968: jis0208<<14 | 0x11<<7 | 0x09,\n\t40209 - 19968: jis0212<<14 | 0x4A<<7 | 0x3E,\n\t40210 - 19968: jis0208<<14 | 0x51<<7 | 0x58,\n\t40213 - 19968: jis0208<<14 | 0x51<<7 | 0x57,\n\t40215 - 19968: jis0212<<14 | 0x4A<<7 | 0x3F,\n\t40216 - 19968: jis0212<<14 | 0x4A<<7 | 0x40,\n\t40219 - 19968: jis0208<<14 | 0x10<<7 | 0x54,\n\t40220 - 19968: jis0212<<14 | 0x4A<<7 | 0x41,\n\t40221 - 19968: jis0212<<14 | 0x4A<<7 | 0x42,\n\t40222 - 19968: jis0212<<14 | 0x4A<<7 | 0x43,\n\t40223 - 19968: jis0208<<14 | 0x51<<7 | 0x55,\n\t40227 - 19968: jis0208<<14 | 0x51<<7 | 0x54,\n\t40230 - 19968: jis0208<<14 | 0x51<<7 | 0x52,\n\t40232 - 19968: jis0208<<14 | 0x12<<7 | 0x5A,\n\t40234 - 19968: jis0208<<14 | 0x51<<7 | 0x51,\n\t40235 - 19968: jis0208<<14 | 0x1B<<7 | 0x11,\n\t40236 - 19968: jis0208<<14 | 0x11<<7 | 0x08,\n\t40239 - 19968: jis0212<<14 | 0x4A<<7 | 0x44,\n\t40240 - 19968: jis0212<<14 | 0x4A<<7 | 0x45,\n\t40242 - 19968: jis0212<<14 | 0x4A<<7 | 0x46,\n\t40243 - 19968: jis0212<<14 | 0x4A<<7 | 0x47,\n\t40244 - 19968: jis0212<<14 | 0x4A<<7 | 0x48,\n\t40250 - 19968: jis0212<<14 | 0x4A<<7 | 0x49,\n\t40251 - 19968: jis0208<<14 | 0x18<<7 | 0x42,\n\t40252 - 19968: jis0212<<14 | 0x4A<<7 | 0x4A,\n\t40253 - 19968: jis0212<<14 | 0x4A<<7 | 0x4C,\n\t40254 - 19968: jis0208<<14 | 0x51<<7 | 0x5B,\n\t40255 - 19968: jis0208<<14 | 0x51<<7 | 0x5A,\n\t40257 - 19968: jis0208<<14 | 0x51<<7 | 0x59,\n\t40258 - 19968: jis0212<<14 | 0x4A<<7 | 0x4D,\n\t40259 - 19968: jis0212<<14 | 0x4A<<7 | 0x4E,\n\t40260 - 19968: jis0208<<14 | 0x51<<7 | 0x56,\n\t40261 - 19968: jis0212<<14 | 0x4A<<7 | 0x4B,\n\t40262 - 19968: jis0208<<14 | 0x51<<7 | 0x5C,\n\t40263 - 19968: jis0212<<14 | 0x4A<<7 | 0x4F,\n\t40264 - 19968: jis0208<<14 | 0x51<<7 | 0x5D,\n\t40266 - 19968: jis0212<<14 | 0x4A<<7 | 0x50,\n\t40272 - 19968: jis0208<<14 | 0x52<<7 | 0x04,\n\t40273 - 19968: jis0208<<14 | 0x52<<7 | 0x03,\n\t40275 - 19968: jis0212<<14 | 0x4A<<7 | 0x51,\n\t40276 - 19968: jis0212<<14 | 0x4A<<7 | 0x52,\n\t40281 - 19968: jis0208<<14 | 0x52<<7 | 0x05,\n\t40284 - 19968: jis0208<<14 | 0x10<<7 | 0x0C,\n\t40285 - 19968: jis0208<<14 | 0x52<<7 | 0x00,\n\t40286 - 19968: jis0208<<14 | 0x52<<7 | 0x01,\n\t40287 - 19968: jis0212<<14 | 0x4A<<7 | 0x53,\n\t40288 - 19968: jis0208<<14 | 0x18<<7 | 0x53,\n\t40289 - 19968: jis0208<<14 | 0x2B<<7 | 0x18,\n\t40290 - 19968: jis0212<<14 | 0x4A<<7 | 0x55,\n\t40291 - 19968: jis0212<<14 | 0x4A<<7 | 0x54,\n\t40292 - 19968: jis0208<<14 | 0x52<<7 | 0x02,\n\t40293 - 19968: jis0212<<14 | 0x4A<<7 | 0x56,\n\t40297 - 19968: jis0212<<14 | 0x4A<<7 | 0x57,\n\t40298 - 19968: jis0212<<14 | 0x4A<<7 | 0x58,\n\t40299 - 19968: jis0208<<14 | 0x5B<<7 | 0x4A,\n\t40300 - 19968: jis0208<<14 | 0x2A<<7 | 0x11,\n\t40303 - 19968: jis0208<<14 | 0x52<<7 | 0x0A,\n\t40304 - 19968: jis0208<<14 | 0x5B<<7 | 0x49,\n\t40306 - 19968: jis0208<<14 | 0x52<<7 | 0x06,\n\t40310 - 19968: jis0212<<14 | 0x4A<<7 | 0x5B,\n\t40311 - 19968: jis0212<<14 | 0x4A<<7 | 0x5C,\n\t40314 - 19968: jis0208<<14 | 0x52<<7 | 0x0B,\n\t40315 - 19968: jis0212<<14 | 0x4A<<7 | 0x5D,\n\t40316 - 19968: jis0212<<14 | 0x4B<<7 | 0x00,\n\t40318 - 19968: jis0212<<14 | 0x4B<<7 | 0x01,\n\t40323 - 19968: jis0212<<14 | 0x4B<<7 | 0x02,\n\t40324 - 19968: jis0212<<14 | 0x4B<<7 | 0x03,\n\t40326 - 19968: jis0212<<14 | 0x4B<<7 | 0x04,\n\t40327 - 19968: jis0208<<14 | 0x52<<7 | 0x08,\n\t40329 - 19968: jis0208<<14 | 0x52<<7 | 0x07,\n\t40330 - 19968: jis0212<<14 | 0x4B<<7 | 0x05,\n\t40333 - 19968: jis0212<<14 | 0x4B<<7 | 0x06,\n\t40334 - 19968: jis0212<<14 | 0x4B<<7 | 0x07,\n\t40335 - 19968: jis0208<<14 | 0x16<<7 | 0x3B,\n\t40338 - 19968: jis0212<<14 | 0x4B<<7 | 0x08,\n\t40339 - 19968: jis0212<<14 | 0x4B<<7 | 0x09,\n\t40341 - 19968: jis0212<<14 | 0x4B<<7 | 0x0A,\n\t40342 - 19968: jis0212<<14 | 0x4B<<7 | 0x0B,\n\t40343 - 19968: jis0212<<14 | 0x4B<<7 | 0x0C,\n\t40344 - 19968: jis0212<<14 | 0x4B<<7 | 0x0D,\n\t40346 - 19968: jis0208<<14 | 0x52<<7 | 0x0C,\n\t40353 - 19968: jis0212<<14 | 0x4B<<7 | 0x0E,\n\t40356 - 19968: jis0208<<14 | 0x52<<7 | 0x0D,\n\t40361 - 19968: jis0208<<14 | 0x52<<7 | 0x0E,\n\t40362 - 19968: jis0212<<14 | 0x4B<<7 | 0x0F,\n\t40363 - 19968: jis0208<<14 | 0x52<<7 | 0x09,\n\t40364 - 19968: jis0212<<14 | 0x4B<<7 | 0x10,\n\t40366 - 19968: jis0212<<14 | 0x4B<<7 | 0x11,\n\t40367 - 19968: jis0208<<14 | 0x51<<7 | 0x53,\n\t40369 - 19968: jis0212<<14 | 0x4B<<7 | 0x12,\n\t40370 - 19968: jis0208<<14 | 0x52<<7 | 0x0F,\n\t40372 - 19968: jis0208<<14 | 0x23<<7 | 0x40,\n\t40373 - 19968: jis0212<<14 | 0x4B<<7 | 0x13,\n\t40376 - 19968: jis0208<<14 | 0x52<<7 | 0x13,\n\t40377 - 19968: jis0212<<14 | 0x4B<<7 | 0x14,\n\t40378 - 19968: jis0208<<14 | 0x52<<7 | 0x14,\n\t40379 - 19968: jis0208<<14 | 0x52<<7 | 0x12,\n\t40380 - 19968: jis0212<<14 | 0x4B<<7 | 0x15,\n\t40383 - 19968: jis0212<<14 | 0x4B<<7 | 0x16,\n\t40385 - 19968: jis0208<<14 | 0x52<<7 | 0x11,\n\t40386 - 19968: jis0208<<14 | 0x52<<7 | 0x17,\n\t40387 - 19968: jis0212<<14 | 0x4B<<7 | 0x17,\n\t40388 - 19968: jis0208<<14 | 0x52<<7 | 0x10,\n\t40390 - 19968: jis0208<<14 | 0x52<<7 | 0x15,\n\t40391 - 19968: jis0212<<14 | 0x4B<<7 | 0x18,\n\t40393 - 19968: jis0212<<14 | 0x4B<<7 | 0x19,\n\t40394 - 19968: jis0212<<14 | 0x4B<<7 | 0x1A,\n\t40399 - 19968: jis0208<<14 | 0x52<<7 | 0x16,\n\t40403 - 19968: jis0208<<14 | 0x52<<7 | 0x19,\n\t40404 - 19968: jis0212<<14 | 0x4B<<7 | 0x1B,\n\t40405 - 19968: jis0212<<14 | 0x4B<<7 | 0x1C,\n\t40406 - 19968: jis0212<<14 | 0x4B<<7 | 0x1D,\n\t40407 - 19968: jis0212<<14 | 0x4B<<7 | 0x1E,\n\t40409 - 19968: jis0208<<14 | 0x52<<7 | 0x18,\n\t40410 - 19968: jis0212<<14 | 0x4B<<7 | 0x1F,\n\t40414 - 19968: jis0212<<14 | 0x4B<<7 | 0x20,\n\t40415 - 19968: jis0212<<14 | 0x4B<<7 | 0x21,\n\t40416 - 19968: jis0212<<14 | 0x4B<<7 | 0x22,\n\t40421 - 19968: jis0212<<14 | 0x4B<<7 | 0x23,\n\t40422 - 19968: jis0208<<14 | 0x52<<7 | 0x1B,\n\t40423 - 19968: jis0212<<14 | 0x4B<<7 | 0x24,\n\t40425 - 19968: jis0212<<14 | 0x4B<<7 | 0x25,\n\t40427 - 19968: jis0212<<14 | 0x4B<<7 | 0x26,\n\t40429 - 19968: jis0208<<14 | 0x52<<7 | 0x1C,\n\t40430 - 19968: jis0212<<14 | 0x4B<<7 | 0x27,\n\t40431 - 19968: jis0208<<14 | 0x52<<7 | 0x1D,\n\t40432 - 19968: jis0212<<14 | 0x4B<<7 | 0x28,\n\t40434 - 19968: jis0208<<14 | 0x2E<<7 | 0x28,\n\t40435 - 19968: jis0212<<14 | 0x4B<<7 | 0x29,\n\t40436 - 19968: jis0212<<14 | 0x4B<<7 | 0x2A,\n\t40440 - 19968: jis0208<<14 | 0x52<<7 | 0x1A,\n\t40441 - 19968: jis0208<<14 | 0x21<<7 | 0x4A,\n\t40442 - 19968: jis0208<<14 | 0x19<<7 | 0x4C,\n\t40445 - 19968: jis0208<<14 | 0x52<<7 | 0x1E,\n\t40446 - 19968: jis0212<<14 | 0x4B<<7 | 0x2B,\n\t40450 - 19968: jis0212<<14 | 0x4B<<7 | 0x2D,\n\t40455 - 19968: jis0212<<14 | 0x4B<<7 | 0x2E,\n\t40458 - 19968: jis0212<<14 | 0x4B<<7 | 0x2C,\n\t40462 - 19968: jis0212<<14 | 0x4B<<7 | 0x2F,\n\t40464 - 19968: jis0212<<14 | 0x4B<<7 | 0x30,\n\t40465 - 19968: jis0212<<14 | 0x4B<<7 | 0x31,\n\t40466 - 19968: jis0212<<14 | 0x4B<<7 | 0x32,\n\t40469 - 19968: jis0212<<14 | 0x4B<<7 | 0x33,\n\t40470 - 19968: jis0212<<14 | 0x4B<<7 | 0x34,\n\t40473 - 19968: jis0208<<14 | 0x5B<<7 | 0x4C,\n\t40474 - 19968: jis0208<<14 | 0x52<<7 | 0x1F,\n\t40475 - 19968: jis0208<<14 | 0x52<<7 | 0x20,\n\t40476 - 19968: jis0212<<14 | 0x4B<<7 | 0x36,\n\t40477 - 19968: jis0212<<14 | 0x4B<<7 | 0x37,\n\t40478 - 19968: jis0208<<14 | 0x52<<7 | 0x21,\n\t40565 - 19968: jis0208<<14 | 0x52<<7 | 0x22,\n\t40568 - 19968: jis0208<<14 | 0x17<<7 | 0x13,\n\t40569 - 19968: jis0208<<14 | 0x52<<7 | 0x23,\n\t40570 - 19968: jis0212<<14 | 0x4B<<7 | 0x38,\n\t40571 - 19968: jis0212<<14 | 0x4B<<7 | 0x39,\n\t40572 - 19968: jis0212<<14 | 0x4B<<7 | 0x3A,\n\t40573 - 19968: jis0208<<14 | 0x52<<7 | 0x24,\n\t40575 - 19968: jis0208<<14 | 0x1B<<7 | 0x0E,\n\t40576 - 19968: jis0212<<14 | 0x4B<<7 | 0x3B,\n\t40577 - 19968: jis0208<<14 | 0x52<<7 | 0x25,\n\t40578 - 19968: jis0212<<14 | 0x4B<<7 | 0x3C,\n\t40579 - 19968: jis0212<<14 | 0x4B<<7 | 0x3D,\n\t40580 - 19968: jis0212<<14 | 0x4B<<7 | 0x3E,\n\t40581 - 19968: jis0212<<14 | 0x4B<<7 | 0x3F,\n\t40583 - 19968: jis0212<<14 | 0x4B<<7 | 0x40,\n\t40584 - 19968: jis0208<<14 | 0x52<<7 | 0x26,\n\t40587 - 19968: jis0208<<14 | 0x52<<7 | 0x27,\n\t40588 - 19968: jis0208<<14 | 0x52<<7 | 0x28,\n\t40590 - 19968: jis0212<<14 | 0x4B<<7 | 0x41,\n\t40591 - 19968: jis0212<<14 | 0x4B<<7 | 0x42,\n\t40593 - 19968: jis0208<<14 | 0x52<<7 | 0x2B,\n\t40594 - 19968: jis0208<<14 | 0x52<<7 | 0x29,\n\t40595 - 19968: jis0208<<14 | 0x2E<<7 | 0x1B,\n\t40597 - 19968: jis0208<<14 | 0x52<<7 | 0x2A,\n\t40598 - 19968: jis0212<<14 | 0x4B<<7 | 0x43,\n\t40599 - 19968: jis0208<<14 | 0x2D<<7 | 0x4E,\n\t40600 - 19968: jis0212<<14 | 0x4B<<7 | 0x44,\n\t40603 - 19968: jis0212<<14 | 0x4B<<7 | 0x45,\n\t40605 - 19968: jis0208<<14 | 0x52<<7 | 0x2C,\n\t40606 - 19968: jis0212<<14 | 0x4B<<7 | 0x46,\n\t40607 - 19968: jis0208<<14 | 0x2D<<7 | 0x3A,\n\t40612 - 19968: jis0212<<14 | 0x4B<<7 | 0x47,\n\t40613 - 19968: jis0208<<14 | 0x52<<7 | 0x2D,\n\t40614 - 19968: jis0208<<14 | 0x26<<7 | 0x5D,\n\t40616 - 19968: jis0212<<14 | 0x4B<<7 | 0x48,\n\t40617 - 19968: jis0208<<14 | 0x52<<7 | 0x2E,\n\t40618 - 19968: jis0208<<14 | 0x52<<7 | 0x30,\n\t40620 - 19968: jis0212<<14 | 0x4B<<7 | 0x49,\n\t40621 - 19968: jis0208<<14 | 0x52<<7 | 0x31,\n\t40622 - 19968: jis0212<<14 | 0x4B<<7 | 0x4A,\n\t40623 - 19968: jis0212<<14 | 0x4B<<7 | 0x4B,\n\t40624 - 19968: jis0212<<14 | 0x4B<<7 | 0x4C,\n\t40627 - 19968: jis0212<<14 | 0x4B<<7 | 0x4D,\n\t40628 - 19968: jis0212<<14 | 0x4B<<7 | 0x4E,\n\t40629 - 19968: jis0212<<14 | 0x4B<<7 | 0x4F,\n\t40632 - 19968: jis0208<<14 | 0x52<<7 | 0x2F,\n\t40633 - 19968: jis0208<<14 | 0x18<<7 | 0x4C,\n\t40634 - 19968: jis0208<<14 | 0x2B<<7 | 0x2C,\n\t40635 - 19968: jis0208<<14 | 0x2A<<7 | 0x42,\n\t40636 - 19968: jis0208<<14 | 0x35<<7 | 0x56,\n\t40638 - 19968: jis0208<<14 | 0x3C<<7 | 0x3F,\n\t40639 - 19968: jis0208<<14 | 0x2A<<7 | 0x5A,\n\t40644 - 19968: jis0208<<14 | 0x11<<7 | 0x0A,\n\t40646 - 19968: jis0212<<14 | 0x4B<<7 | 0x50,\n\t40648 - 19968: jis0212<<14 | 0x4B<<7 | 0x51,\n\t40651 - 19968: jis0212<<14 | 0x4B<<7 | 0x52,\n\t40652 - 19968: jis0208<<14 | 0x52<<7 | 0x33,\n\t40653 - 19968: jis0208<<14 | 0x14<<7 | 0x2F,\n\t40654 - 19968: jis0208<<14 | 0x52<<7 | 0x34,\n\t40655 - 19968: jis0208<<14 | 0x52<<7 | 0x35,\n\t40656 - 19968: jis0208<<14 | 0x52<<7 | 0x36,\n\t40657 - 19968: jis0208<<14 | 0x5B<<7 | 0x4D,\n\t40658 - 19968: jis0208<<14 | 0x18<<7 | 0x54,\n\t40660 - 19968: jis0208<<14 | 0x52<<7 | 0x37,\n\t40661 - 19968: jis0212<<14 | 0x4B<<7 | 0x53,\n\t40664 - 19968: jis0208<<14 | 0x3F<<7 | 0x33,\n\t40665 - 19968: jis0208<<14 | 0x2B<<7 | 0x3A,\n\t40667 - 19968: jis0208<<14 | 0x21<<7 | 0x42,\n\t40668 - 19968: jis0208<<14 | 0x52<<7 | 0x38,\n\t40669 - 19968: jis0208<<14 | 0x52<<7 | 0x3A,\n\t40670 - 19968: jis0208<<14 | 0x52<<7 | 0x39,\n\t40671 - 19968: jis0212<<14 | 0x4B<<7 | 0x54,\n\t40672 - 19968: jis0208<<14 | 0x52<<7 | 0x3B,\n\t40676 - 19968: jis0212<<14 | 0x4B<<7 | 0x55,\n\t40677 - 19968: jis0208<<14 | 0x52<<7 | 0x3C,\n\t40679 - 19968: jis0212<<14 | 0x4B<<7 | 0x56,\n\t40680 - 19968: jis0208<<14 | 0x52<<7 | 0x3D,\n\t40684 - 19968: jis0212<<14 | 0x4B<<7 | 0x57,\n\t40685 - 19968: jis0212<<14 | 0x4B<<7 | 0x58,\n\t40686 - 19968: jis0212<<14 | 0x4B<<7 | 0x59,\n\t40687 - 19968: jis0208<<14 | 0x52<<7 | 0x3E,\n\t40688 - 19968: jis0212<<14 | 0x4B<<7 | 0x5A,\n\t40689 - 19968: jis0212<<14 | 0x4B<<7 | 0x5B,\n\t40690 - 19968: jis0212<<14 | 0x4B<<7 | 0x5C,\n\t40692 - 19968: jis0208<<14 | 0x52<<7 | 0x3F,\n\t40693 - 19968: jis0212<<14 | 0x4B<<7 | 0x5D,\n\t40694 - 19968: jis0208<<14 | 0x52<<7 | 0x40,\n\t40695 - 19968: jis0208<<14 | 0x52<<7 | 0x41,\n\t40696 - 19968: jis0212<<14 | 0x4C<<7 | 0x00,\n\t40697 - 19968: jis0208<<14 | 0x52<<7 | 0x42,\n\t40699 - 19968: jis0208<<14 | 0x52<<7 | 0x43,\n\t40700 - 19968: jis0208<<14 | 0x52<<7 | 0x44,\n\t40701 - 19968: jis0208<<14 | 0x52<<7 | 0x45,\n\t40703 - 19968: jis0212<<14 | 0x4C<<7 | 0x01,\n\t40706 - 19968: jis0212<<14 | 0x4C<<7 | 0x02,\n\t40707 - 19968: jis0212<<14 | 0x4C<<7 | 0x03,\n\t40711 - 19968: jis0208<<14 | 0x52<<7 | 0x46,\n\t40712 - 19968: jis0208<<14 | 0x52<<7 | 0x47,\n\t40713 - 19968: jis0212<<14 | 0x4C<<7 | 0x04,\n\t40718 - 19968: jis0208<<14 | 0x24<<7 | 0x03,\n\t40719 - 19968: jis0212<<14 | 0x4C<<7 | 0x05,\n\t40720 - 19968: jis0212<<14 | 0x4C<<7 | 0x06,\n\t40721 - 19968: jis0212<<14 | 0x4C<<7 | 0x07,\n\t40722 - 19968: jis0212<<14 | 0x4C<<7 | 0x08,\n\t40723 - 19968: jis0208<<14 | 0x17<<7 | 0x3C,\n\t40724 - 19968: jis0212<<14 | 0x4C<<7 | 0x09,\n\t40725 - 19968: jis0208<<14 | 0x52<<7 | 0x49,\n\t40726 - 19968: jis0212<<14 | 0x4C<<7 | 0x0A,\n\t40727 - 19968: jis0212<<14 | 0x4C<<7 | 0x0B,\n\t40729 - 19968: jis0212<<14 | 0x4C<<7 | 0x0C,\n\t40730 - 19968: jis0212<<14 | 0x4C<<7 | 0x0D,\n\t40731 - 19968: jis0212<<14 | 0x4C<<7 | 0x0E,\n\t40735 - 19968: jis0212<<14 | 0x4C<<7 | 0x0F,\n\t40736 - 19968: jis0208<<14 | 0x20<<7 | 0x2C,\n\t40737 - 19968: jis0208<<14 | 0x52<<7 | 0x4A,\n\t40738 - 19968: jis0212<<14 | 0x4C<<7 | 0x10,\n\t40742 - 19968: jis0212<<14 | 0x4C<<7 | 0x11,\n\t40746 - 19968: jis0212<<14 | 0x4C<<7 | 0x12,\n\t40747 - 19968: jis0212<<14 | 0x4C<<7 | 0x13,\n\t40748 - 19968: jis0208<<14 | 0x52<<7 | 0x4B,\n\t40751 - 19968: jis0212<<14 | 0x4C<<7 | 0x14,\n\t40753 - 19968: jis0212<<14 | 0x4C<<7 | 0x15,\n\t40754 - 19968: jis0212<<14 | 0x4C<<7 | 0x16,\n\t40756 - 19968: jis0212<<14 | 0x4C<<7 | 0x17,\n\t40759 - 19968: jis0212<<14 | 0x4C<<7 | 0x18,\n\t40761 - 19968: jis0212<<14 | 0x4C<<7 | 0x19,\n\t40762 - 19968: jis0212<<14 | 0x4C<<7 | 0x1A,\n\t40763 - 19968: jis0208<<14 | 0x28<<7 | 0x00,\n\t40764 - 19968: jis0212<<14 | 0x4C<<7 | 0x1B,\n\t40765 - 19968: jis0212<<14 | 0x4C<<7 | 0x1C,\n\t40766 - 19968: jis0208<<14 | 0x52<<7 | 0x4C,\n\t40767 - 19968: jis0212<<14 | 0x4C<<7 | 0x1D,\n\t40769 - 19968: jis0212<<14 | 0x4C<<7 | 0x1E,\n\t40771 - 19968: jis0212<<14 | 0x4C<<7 | 0x1F,\n\t40772 - 19968: jis0212<<14 | 0x4C<<7 | 0x20,\n\t40773 - 19968: jis0212<<14 | 0x4C<<7 | 0x21,\n\t40774 - 19968: jis0212<<14 | 0x4C<<7 | 0x22,\n\t40775 - 19968: jis0212<<14 | 0x4C<<7 | 0x23,\n\t40778 - 19968: jis0208<<14 | 0x52<<7 | 0x4D,\n\t40779 - 19968: jis0208<<14 | 0x42<<7 | 0x16,\n\t40782 - 19968: jis0208<<14 | 0x4B<<7 | 0x39,\n\t40783 - 19968: jis0208<<14 | 0x4F<<7 | 0x4C,\n\t40786 - 19968: jis0208<<14 | 0x52<<7 | 0x4E,\n\t40787 - 19968: jis0212<<14 | 0x4C<<7 | 0x24,\n\t40788 - 19968: jis0208<<14 | 0x52<<7 | 0x4F,\n\t40789 - 19968: jis0212<<14 | 0x4C<<7 | 0x25,\n\t40790 - 19968: jis0212<<14 | 0x4C<<7 | 0x26,\n\t40791 - 19968: jis0212<<14 | 0x4C<<7 | 0x27,\n\t40792 - 19968: jis0212<<14 | 0x4C<<7 | 0x28,\n\t40794 - 19968: jis0212<<14 | 0x4C<<7 | 0x29,\n\t40797 - 19968: jis0212<<14 | 0x4C<<7 | 0x2A,\n\t40798 - 19968: jis0212<<14 | 0x4C<<7 | 0x2B,\n\t40799 - 19968: jis0208<<14 | 0x52<<7 | 0x51,\n\t40800 - 19968: jis0208<<14 | 0x52<<7 | 0x52,\n\t40801 - 19968: jis0208<<14 | 0x52<<7 | 0x53,\n\t40802 - 19968: jis0208<<14 | 0x2D<<7 | 0x4F,\n\t40803 - 19968: jis0208<<14 | 0x52<<7 | 0x50,\n\t40806 - 19968: jis0208<<14 | 0x52<<7 | 0x54,\n\t40807 - 19968: jis0208<<14 | 0x52<<7 | 0x55,\n\t40808 - 19968: jis0212<<14 | 0x4C<<7 | 0x2C,\n\t40809 - 19968: jis0212<<14 | 0x4C<<7 | 0x2D,\n\t40810 - 19968: jis0208<<14 | 0x52<<7 | 0x57,\n\t40812 - 19968: jis0208<<14 | 0x52<<7 | 0x56,\n\t40813 - 19968: jis0212<<14 | 0x4C<<7 | 0x2E,\n\t40814 - 19968: jis0212<<14 | 0x4C<<7 | 0x2F,\n\t40815 - 19968: jis0212<<14 | 0x4C<<7 | 0x30,\n\t40816 - 19968: jis0212<<14 | 0x4C<<7 | 0x31,\n\t40817 - 19968: jis0212<<14 | 0x4C<<7 | 0x32,\n\t40818 - 19968: jis0208<<14 | 0x52<<7 | 0x59,\n\t40819 - 19968: jis0212<<14 | 0x4C<<7 | 0x33,\n\t40821 - 19968: jis0212<<14 | 0x4C<<7 | 0x34,\n\t40822 - 19968: jis0208<<14 | 0x52<<7 | 0x5A,\n\t40823 - 19968: jis0208<<14 | 0x52<<7 | 0x58,\n\t40826 - 19968: jis0212<<14 | 0x4C<<7 | 0x35,\n\t40829 - 19968: jis0212<<14 | 0x4C<<7 | 0x36,\n\t40845 - 19968: jis0208<<14 | 0x2D<<7 | 0x15,\n\t40847 - 19968: jis0212<<14 | 0x4C<<7 | 0x37,\n\t40848 - 19968: jis0212<<14 | 0x4C<<7 | 0x38,\n\t40849 - 19968: jis0212<<14 | 0x4C<<7 | 0x39,\n\t40850 - 19968: jis0212<<14 | 0x4C<<7 | 0x3A,\n\t40852 - 19968: jis0212<<14 | 0x4C<<7 | 0x3B,\n\t40853 - 19968: jis0208<<14 | 0x52<<7 | 0x5B,\n\t40854 - 19968: jis0212<<14 | 0x4C<<7 | 0x3C,\n\t40855 - 19968: jis0212<<14 | 0x4C<<7 | 0x3D,\n\t40860 - 19968: jis0208<<14 | 0x52<<7 | 0x5C,\n\t40861 - 19968: jis0208<<14 | 0x42<<7 | 0x33,\n\t40862 - 19968: jis0212<<14 | 0x4C<<7 | 0x3E,\n\t40864 - 19968: jis0208<<14 | 0x52<<7 | 0x5D,\n\t40865 - 19968: jis0212<<14 | 0x4C<<7 | 0x3F,\n\t40866 - 19968: jis0212<<14 | 0x4C<<7 | 0x40,\n\t40867 - 19968: jis0212<<14 | 0x4C<<7 | 0x41,\n\t40869 - 19968: jis0212<<14 | 0x4C<<7 | 0x42,\n}\n\nconst encode1Low, encode1High = 8208, 9840\n\nvar encode1 = [...]uint16{\n\t8208 - 8208: jis0208<<14 | 0x00<<7 | 0x1D,\n\t8213 - 8208: jis0208<<14 | 0x00<<7 | 0x1C,\n\t8216 - 8208: jis0208<<14 | 0x00<<7 | 0x25,\n\t8217 - 8208: jis0208<<14 | 0x00<<7 | 0x26,\n\t8220 - 8208: jis0208<<14 | 0x00<<7 | 0x27,\n\t8221 - 8208: jis0208<<14 | 0x00<<7 | 0x28,\n\t8224 - 8208: jis0208<<14 | 0x01<<7 | 0x56,\n\t8225 - 8208: jis0208<<14 | 0x01<<7 | 0x57,\n\t8229 - 8208: jis0208<<14 | 0x00<<7 | 0x24,\n\t8230 - 8208: jis0208<<14 | 0x00<<7 | 0x23,\n\t8240 - 8208: jis0208<<14 | 0x01<<7 | 0x52,\n\t8242 - 8208: jis0208<<14 | 0x00<<7 | 0x4B,\n\t8243 - 8208: jis0208<<14 | 0x00<<7 | 0x4C,\n\t8251 - 8208: jis0208<<14 | 0x01<<7 | 0x07,\n\t8451 - 8208: jis0208<<14 | 0x00<<7 | 0x4D,\n\t8470 - 8208: jis0208<<14 | 0x0C<<7 | 0x41,\n\t8481 - 8208: jis0208<<14 | 0x0C<<7 | 0x43,\n\t8482 - 8208: jis0212<<14 | 0x01<<7 | 0x4E,\n\t8491 - 8208: jis0208<<14 | 0x01<<7 | 0x51,\n\t8544 - 8208: jis0208<<14 | 0x0C<<7 | 0x14,\n\t8545 - 8208: jis0208<<14 | 0x0C<<7 | 0x15,\n\t8546 - 8208: jis0208<<14 | 0x0C<<7 | 0x16,\n\t8547 - 8208: jis0208<<14 | 0x0C<<7 | 0x17,\n\t8548 - 8208: jis0208<<14 | 0x0C<<7 | 0x18,\n\t8549 - 8208: jis0208<<14 | 0x0C<<7 | 0x19,\n\t8550 - 8208: jis0208<<14 | 0x0C<<7 | 0x1A,\n\t8551 - 8208: jis0208<<14 | 0x0C<<7 | 0x1B,\n\t8552 - 8208: jis0208<<14 | 0x0C<<7 | 0x1C,\n\t8553 - 8208: jis0208<<14 | 0x0C<<7 | 0x1D,\n\t8560 - 8208: jis0208<<14 | 0x5B<<7 | 0x50,\n\t8561 - 8208: jis0208<<14 | 0x5B<<7 | 0x51,\n\t8562 - 8208: jis0208<<14 | 0x5B<<7 | 0x52,\n\t8563 - 8208: jis0208<<14 | 0x5B<<7 | 0x53,\n\t8564 - 8208: jis0208<<14 | 0x5B<<7 | 0x54,\n\t8565 - 8208: jis0208<<14 | 0x5B<<7 | 0x55,\n\t8566 - 8208: jis0208<<14 | 0x5B<<7 | 0x56,\n\t8567 - 8208: jis0208<<14 | 0x5B<<7 | 0x57,\n\t8568 - 8208: jis0208<<14 | 0x5B<<7 | 0x58,\n\t8569 - 8208: jis0208<<14 | 0x5B<<7 | 0x59,\n\t8592 - 8208: jis0208<<14 | 0x01<<7 | 0x0A,\n\t8593 - 8208: jis0208<<14 | 0x01<<7 | 0x0B,\n\t8594 - 8208: jis0208<<14 | 0x01<<7 | 0x09,\n\t8595 - 8208: jis0208<<14 | 0x01<<7 | 0x0C,\n\t8658 - 8208: jis0208<<14 | 0x01<<7 | 0x2C,\n\t8660 - 8208: jis0208<<14 | 0x01<<7 | 0x2D,\n\t8704 - 8208: jis0208<<14 | 0x01<<7 | 0x2E,\n\t8706 - 8208: jis0208<<14 | 0x01<<7 | 0x3E,\n\t8707 - 8208: jis0208<<14 | 0x01<<7 | 0x2F,\n\t8711 - 8208: jis0208<<14 | 0x01<<7 | 0x3F,\n\t8712 - 8208: jis0208<<14 | 0x01<<7 | 0x19,\n\t8715 - 8208: jis0208<<14 | 0x01<<7 | 0x1A,\n\t8721 - 8208: jis0208<<14 | 0x0C<<7 | 0x53,\n\t8730 - 8208: jis0208<<14 | 0x01<<7 | 0x44,\n\t8733 - 8208: jis0208<<14 | 0x01<<7 | 0x46,\n\t8734 - 8208: jis0208<<14 | 0x00<<7 | 0x46,\n\t8735 - 8208: jis0208<<14 | 0x0C<<7 | 0x57,\n\t8736 - 8208: jis0208<<14 | 0x01<<7 | 0x3B,\n\t8741 - 8208: jis0208<<14 | 0x00<<7 | 0x21,\n\t8743 - 8208: jis0208<<14 | 0x01<<7 | 0x29,\n\t8744 - 8208: jis0208<<14 | 0x01<<7 | 0x2A,\n\t8745 - 8208: jis0208<<14 | 0x01<<7 | 0x20,\n\t8746 - 8208: jis0208<<14 | 0x01<<7 | 0x1F,\n\t8747 - 8208: jis0208<<14 | 0x01<<7 | 0x48,\n\t8748 - 8208: jis0208<<14 | 0x01<<7 | 0x49,\n\t8750 - 8208: jis0208<<14 | 0x0C<<7 | 0x52,\n\t8756 - 8208: jis0208<<14 | 0x00<<7 | 0x47,\n\t8757 - 8208: jis0208<<14 | 0x01<<7 | 0x47,\n\t8765 - 8208: jis0208<<14 | 0x01<<7 | 0x45,\n\t8786 - 8208: jis0208<<14 | 0x01<<7 | 0x41,\n\t8800 - 8208: jis0208<<14 | 0x00<<7 | 0x41,\n\t8801 - 8208: jis0208<<14 | 0x01<<7 | 0x40,\n\t8806 - 8208: jis0208<<14 | 0x00<<7 | 0x44,\n\t8807 - 8208: jis0208<<14 | 0x00<<7 | 0x45,\n\t8810 - 8208: jis0208<<14 | 0x01<<7 | 0x42,\n\t8811 - 8208: jis0208<<14 | 0x01<<7 | 0x43,\n\t8834 - 8208: jis0208<<14 | 0x01<<7 | 0x1D,\n\t8835 - 8208: jis0208<<14 | 0x01<<7 | 0x1E,\n\t8838 - 8208: jis0208<<14 | 0x01<<7 | 0x1B,\n\t8839 - 8208: jis0208<<14 | 0x01<<7 | 0x1C,\n\t8869 - 8208: jis0208<<14 | 0x01<<7 | 0x3C,\n\t8895 - 8208: jis0208<<14 | 0x0C<<7 | 0x58,\n\t8978 - 8208: jis0208<<14 | 0x01<<7 | 0x3D,\n\t9312 - 8208: jis0208<<14 | 0x0C<<7 | 0x00,\n\t9313 - 8208: jis0208<<14 | 0x0C<<7 | 0x01,\n\t9314 - 8208: jis0208<<14 | 0x0C<<7 | 0x02,\n\t9315 - 8208: jis0208<<14 | 0x0C<<7 | 0x03,\n\t9316 - 8208: jis0208<<14 | 0x0C<<7 | 0x04,\n\t9317 - 8208: jis0208<<14 | 0x0C<<7 | 0x05,\n\t9318 - 8208: jis0208<<14 | 0x0C<<7 | 0x06,\n\t9319 - 8208: jis0208<<14 | 0x0C<<7 | 0x07,\n\t9320 - 8208: jis0208<<14 | 0x0C<<7 | 0x08,\n\t9321 - 8208: jis0208<<14 | 0x0C<<7 | 0x09,\n\t9322 - 8208: jis0208<<14 | 0x0C<<7 | 0x0A,\n\t9323 - 8208: jis0208<<14 | 0x0C<<7 | 0x0B,\n\t9324 - 8208: jis0208<<14 | 0x0C<<7 | 0x0C,\n\t9325 - 8208: jis0208<<14 | 0x0C<<7 | 0x0D,\n\t9326 - 8208: jis0208<<14 | 0x0C<<7 | 0x0E,\n\t9327 - 8208: jis0208<<14 | 0x0C<<7 | 0x0F,\n\t9328 - 8208: jis0208<<14 | 0x0C<<7 | 0x10,\n\t9329 - 8208: jis0208<<14 | 0x0C<<7 | 0x11,\n\t9330 - 8208: jis0208<<14 | 0x0C<<7 | 0x12,\n\t9331 - 8208: jis0208<<14 | 0x0C<<7 | 0x13,\n\t9472 - 8208: jis0208<<14 | 0x07<<7 | 0x00,\n\t9473 - 8208: jis0208<<14 | 0x07<<7 | 0x0B,\n\t9474 - 8208: jis0208<<14 | 0x07<<7 | 0x01,\n\t9475 - 8208: jis0208<<14 | 0x07<<7 | 0x0C,\n\t9484 - 8208: jis0208<<14 | 0x07<<7 | 0x02,\n\t9487 - 8208: jis0208<<14 | 0x07<<7 | 0x0D,\n\t9488 - 8208: jis0208<<14 | 0x07<<7 | 0x03,\n\t9491 - 8208: jis0208<<14 | 0x07<<7 | 0x0E,\n\t9492 - 8208: jis0208<<14 | 0x07<<7 | 0x05,\n\t9495 - 8208: jis0208<<14 | 0x07<<7 | 0x10,\n\t9496 - 8208: jis0208<<14 | 0x07<<7 | 0x04,\n\t9499 - 8208: jis0208<<14 | 0x07<<7 | 0x0F,\n\t9500 - 8208: jis0208<<14 | 0x07<<7 | 0x06,\n\t9501 - 8208: jis0208<<14 | 0x07<<7 | 0x1B,\n\t9504 - 8208: jis0208<<14 | 0x07<<7 | 0x16,\n\t9507 - 8208: jis0208<<14 | 0x07<<7 | 0x11,\n\t9508 - 8208: jis0208<<14 | 0x07<<7 | 0x08,\n\t9509 - 8208: jis0208<<14 | 0x07<<7 | 0x1D,\n\t9512 - 8208: jis0208<<14 | 0x07<<7 | 0x18,\n\t9515 - 8208: jis0208<<14 | 0x07<<7 | 0x13,\n\t9516 - 8208: jis0208<<14 | 0x07<<7 | 0x07,\n\t9519 - 8208: jis0208<<14 | 0x07<<7 | 0x17,\n\t9520 - 8208: jis0208<<14 | 0x07<<7 | 0x1C,\n\t9523 - 8208: jis0208<<14 | 0x07<<7 | 0x12,\n\t9524 - 8208: jis0208<<14 | 0x07<<7 | 0x09,\n\t9527 - 8208: jis0208<<14 | 0x07<<7 | 0x19,\n\t9528 - 8208: jis0208<<14 | 0x07<<7 | 0x1E,\n\t9531 - 8208: jis0208<<14 | 0x07<<7 | 0x14,\n\t9532 - 8208: jis0208<<14 | 0x07<<7 | 0x0A,\n\t9535 - 8208: jis0208<<14 | 0x07<<7 | 0x1A,\n\t9538 - 8208: jis0208<<14 | 0x07<<7 | 0x1F,\n\t9547 - 8208: jis0208<<14 | 0x07<<7 | 0x15,\n\t9632 - 8208: jis0208<<14 | 0x01<<7 | 0x02,\n\t9633 - 8208: jis0208<<14 | 0x01<<7 | 0x01,\n\t9650 - 8208: jis0208<<14 | 0x01<<7 | 0x04,\n\t9651 - 8208: jis0208<<14 | 0x01<<7 | 0x03,\n\t9660 - 8208: jis0208<<14 | 0x01<<7 | 0x06,\n\t9661 - 8208: jis0208<<14 | 0x01<<7 | 0x05,\n\t9670 - 8208: jis0208<<14 | 0x01<<7 | 0x00,\n\t9671 - 8208: jis0208<<14 | 0x00<<7 | 0x5D,\n\t9675 - 8208: jis0208<<14 | 0x00<<7 | 0x5A,\n\t9678 - 8208: jis0208<<14 | 0x00<<7 | 0x5C,\n\t9679 - 8208: jis0208<<14 | 0x00<<7 | 0x5B,\n\t9711 - 8208: jis0208<<14 | 0x01<<7 | 0x5D,\n\t9733 - 8208: jis0208<<14 | 0x00<<7 | 0x59,\n\t9734 - 8208: jis0208<<14 | 0x00<<7 | 0x58,\n\t9792 - 8208: jis0208<<14 | 0x00<<7 | 0x49,\n\t9794 - 8208: jis0208<<14 | 0x00<<7 | 0x48,\n\t9834 - 8208: jis0208<<14 | 0x01<<7 | 0x55,\n\t9837 - 8208: jis0208<<14 | 0x01<<7 | 0x54,\n\t9839 - 8208: jis0208<<14 | 0x01<<7 | 0x53,\n}\n\nconst encode2Low, encode2High = 12288, 13262\n\nvar encode2 = [...]uint16{\n\t12288 - 12288: jis0208<<14 | 0x00<<7 | 0x00,\n\t12289 - 12288: jis0208<<14 | 0x00<<7 | 0x01,\n\t12290 - 12288: jis0208<<14 | 0x00<<7 | 0x02,\n\t12291 - 12288: jis0208<<14 | 0x00<<7 | 0x16,\n\t12293 - 12288: jis0208<<14 | 0x00<<7 | 0x18,\n\t12294 - 12288: jis0208<<14 | 0x00<<7 | 0x19,\n\t12295 - 12288: jis0208<<14 | 0x00<<7 | 0x1A,\n\t12296 - 12288: jis0208<<14 | 0x00<<7 | 0x31,\n\t12297 - 12288: jis0208<<14 | 0x00<<7 | 0x32,\n\t12298 - 12288: jis0208<<14 | 0x00<<7 | 0x33,\n\t12299 - 12288: jis0208<<14 | 0x00<<7 | 0x34,\n\t12300 - 12288: jis0208<<14 | 0x00<<7 | 0x35,\n\t12301 - 12288: jis0208<<14 | 0x00<<7 | 0x36,\n\t12302 - 12288: jis0208<<14 | 0x00<<7 | 0x37,\n\t12303 - 12288: jis0208<<14 | 0x00<<7 | 0x38,\n\t12304 - 12288: jis0208<<14 | 0x00<<7 | 0x39,\n\t12305 - 12288: jis0208<<14 | 0x00<<7 | 0x3A,\n\t12306 - 12288: jis0208<<14 | 0x01<<7 | 0x08,\n\t12307 - 12288: jis0208<<14 | 0x01<<7 | 0x0D,\n\t12308 - 12288: jis0208<<14 | 0x00<<7 | 0x2B,\n\t12309 - 12288: jis0208<<14 | 0x00<<7 | 0x2C,\n\t12317 - 12288: jis0208<<14 | 0x0C<<7 | 0x3F,\n\t12319 - 12288: jis0208<<14 | 0x0C<<7 | 0x40,\n\t12353 - 12288: jis0208<<14 | 0x03<<7 | 0x00,\n\t12354 - 12288: jis0208<<14 | 0x03<<7 | 0x01,\n\t12355 - 12288: jis0208<<14 | 0x03<<7 | 0x02,\n\t12356 - 12288: jis0208<<14 | 0x03<<7 | 0x03,\n\t12357 - 12288: jis0208<<14 | 0x03<<7 | 0x04,\n\t12358 - 12288: jis0208<<14 | 0x03<<7 | 0x05,\n\t12359 - 12288: jis0208<<14 | 0x03<<7 | 0x06,\n\t12360 - 12288: jis0208<<14 | 0x03<<7 | 0x07,\n\t12361 - 12288: jis0208<<14 | 0x03<<7 | 0x08,\n\t12362 - 12288: jis0208<<14 | 0x03<<7 | 0x09,\n\t12363 - 12288: jis0208<<14 | 0x03<<7 | 0x0A,\n\t12364 - 12288: jis0208<<14 | 0x03<<7 | 0x0B,\n\t12365 - 12288: jis0208<<14 | 0x03<<7 | 0x0C,\n\t12366 - 12288: jis0208<<14 | 0x03<<7 | 0x0D,\n\t12367 - 12288: jis0208<<14 | 0x03<<7 | 0x0E,\n\t12368 - 12288: jis0208<<14 | 0x03<<7 | 0x0F,\n\t12369 - 12288: jis0208<<14 | 0x03<<7 | 0x10,\n\t12370 - 12288: jis0208<<14 | 0x03<<7 | 0x11,\n\t12371 - 12288: jis0208<<14 | 0x03<<7 | 0x12,\n\t12372 - 12288: jis0208<<14 | 0x03<<7 | 0x13,\n\t12373 - 12288: jis0208<<14 | 0x03<<7 | 0x14,\n\t12374 - 12288: jis0208<<14 | 0x03<<7 | 0x15,\n\t12375 - 12288: jis0208<<14 | 0x03<<7 | 0x16,\n\t12376 - 12288: jis0208<<14 | 0x03<<7 | 0x17,\n\t12377 - 12288: jis0208<<14 | 0x03<<7 | 0x18,\n\t12378 - 12288: jis0208<<14 | 0x03<<7 | 0x19,\n\t12379 - 12288: jis0208<<14 | 0x03<<7 | 0x1A,\n\t12380 - 12288: jis0208<<14 | 0x03<<7 | 0x1B,\n\t12381 - 12288: jis0208<<14 | 0x03<<7 | 0x1C,\n\t12382 - 12288: jis0208<<14 | 0x03<<7 | 0x1D,\n\t12383 - 12288: jis0208<<14 | 0x03<<7 | 0x1E,\n\t12384 - 12288: jis0208<<14 | 0x03<<7 | 0x1F,\n\t12385 - 12288: jis0208<<14 | 0x03<<7 | 0x20,\n\t12386 - 12288: jis0208<<14 | 0x03<<7 | 0x21,\n\t12387 - 12288: jis0208<<14 | 0x03<<7 | 0x22,\n\t12388 - 12288: jis0208<<14 | 0x03<<7 | 0x23,\n\t12389 - 12288: jis0208<<14 | 0x03<<7 | 0x24,\n\t12390 - 12288: jis0208<<14 | 0x03<<7 | 0x25,\n\t12391 - 12288: jis0208<<14 | 0x03<<7 | 0x26,\n\t12392 - 12288: jis0208<<14 | 0x03<<7 | 0x27,\n\t12393 - 12288: jis0208<<14 | 0x03<<7 | 0x28,\n\t12394 - 12288: jis0208<<14 | 0x03<<7 | 0x29,\n\t12395 - 12288: jis0208<<14 | 0x03<<7 | 0x2A,\n\t12396 - 12288: jis0208<<14 | 0x03<<7 | 0x2B,\n\t12397 - 12288: jis0208<<14 | 0x03<<7 | 0x2C,\n\t12398 - 12288: jis0208<<14 | 0x03<<7 | 0x2D,\n\t12399 - 12288: jis0208<<14 | 0x03<<7 | 0x2E,\n\t12400 - 12288: jis0208<<14 | 0x03<<7 | 0x2F,\n\t12401 - 12288: jis0208<<14 | 0x03<<7 | 0x30,\n\t12402 - 12288: jis0208<<14 | 0x03<<7 | 0x31,\n\t12403 - 12288: jis0208<<14 | 0x03<<7 | 0x32,\n\t12404 - 12288: jis0208<<14 | 0x03<<7 | 0x33,\n\t12405 - 12288: jis0208<<14 | 0x03<<7 | 0x34,\n\t12406 - 12288: jis0208<<14 | 0x03<<7 | 0x35,\n\t12407 - 12288: jis0208<<14 | 0x03<<7 | 0x36,\n\t12408 - 12288: jis0208<<14 | 0x03<<7 | 0x37,\n\t12409 - 12288: jis0208<<14 | 0x03<<7 | 0x38,\n\t12410 - 12288: jis0208<<14 | 0x03<<7 | 0x39,\n\t12411 - 12288: jis0208<<14 | 0x03<<7 | 0x3A,\n\t12412 - 12288: jis0208<<14 | 0x03<<7 | 0x3B,\n\t12413 - 12288: jis0208<<14 | 0x03<<7 | 0x3C,\n\t12414 - 12288: jis0208<<14 | 0x03<<7 | 0x3D,\n\t12415 - 12288: jis0208<<14 | 0x03<<7 | 0x3E,\n\t12416 - 12288: jis0208<<14 | 0x03<<7 | 0x3F,\n\t12417 - 12288: jis0208<<14 | 0x03<<7 | 0x40,\n\t12418 - 12288: jis0208<<14 | 0x03<<7 | 0x41,\n\t12419 - 12288: jis0208<<14 | 0x03<<7 | 0x42,\n\t12420 - 12288: jis0208<<14 | 0x03<<7 | 0x43,\n\t12421 - 12288: jis0208<<14 | 0x03<<7 | 0x44,\n\t12422 - 12288: jis0208<<14 | 0x03<<7 | 0x45,\n\t12423 - 12288: jis0208<<14 | 0x03<<7 | 0x46,\n\t12424 - 12288: jis0208<<14 | 0x03<<7 | 0x47,\n\t12425 - 12288: jis0208<<14 | 0x03<<7 | 0x48,\n\t12426 - 12288: jis0208<<14 | 0x03<<7 | 0x49,\n\t12427 - 12288: jis0208<<14 | 0x03<<7 | 0x4A,\n\t12428 - 12288: jis0208<<14 | 0x03<<7 | 0x4B,\n\t12429 - 12288: jis0208<<14 | 0x03<<7 | 0x4C,\n\t12430 - 12288: jis0208<<14 | 0x03<<7 | 0x4D,\n\t12431 - 12288: jis0208<<14 | 0x03<<7 | 0x4E,\n\t12432 - 12288: jis0208<<14 | 0x03<<7 | 0x4F,\n\t12433 - 12288: jis0208<<14 | 0x03<<7 | 0x50,\n\t12434 - 12288: jis0208<<14 | 0x03<<7 | 0x51,\n\t12435 - 12288: jis0208<<14 | 0x03<<7 | 0x52,\n\t12443 - 12288: jis0208<<14 | 0x00<<7 | 0x0A,\n\t12444 - 12288: jis0208<<14 | 0x00<<7 | 0x0B,\n\t12445 - 12288: jis0208<<14 | 0x00<<7 | 0x14,\n\t12446 - 12288: jis0208<<14 | 0x00<<7 | 0x15,\n\t12449 - 12288: jis0208<<14 | 0x04<<7 | 0x00,\n\t12450 - 12288: jis0208<<14 | 0x04<<7 | 0x01,\n\t12451 - 12288: jis0208<<14 | 0x04<<7 | 0x02,\n\t12452 - 12288: jis0208<<14 | 0x04<<7 | 0x03,\n\t12453 - 12288: jis0208<<14 | 0x04<<7 | 0x04,\n\t12454 - 12288: jis0208<<14 | 0x04<<7 | 0x05,\n\t12455 - 12288: jis0208<<14 | 0x04<<7 | 0x06,\n\t12456 - 12288: jis0208<<14 | 0x04<<7 | 0x07,\n\t12457 - 12288: jis0208<<14 | 0x04<<7 | 0x08,\n\t12458 - 12288: jis0208<<14 | 0x04<<7 | 0x09,\n\t12459 - 12288: jis0208<<14 | 0x04<<7 | 0x0A,\n\t12460 - 12288: jis0208<<14 | 0x04<<7 | 0x0B,\n\t12461 - 12288: jis0208<<14 | 0x04<<7 | 0x0C,\n\t12462 - 12288: jis0208<<14 | 0x04<<7 | 0x0D,\n\t12463 - 12288: jis0208<<14 | 0x04<<7 | 0x0E,\n\t12464 - 12288: jis0208<<14 | 0x04<<7 | 0x0F,\n\t12465 - 12288: jis0208<<14 | 0x04<<7 | 0x10,\n\t12466 - 12288: jis0208<<14 | 0x04<<7 | 0x11,\n\t12467 - 12288: jis0208<<14 | 0x04<<7 | 0x12,\n\t12468 - 12288: jis0208<<14 | 0x04<<7 | 0x13,\n\t12469 - 12288: jis0208<<14 | 0x04<<7 | 0x14,\n\t12470 - 12288: jis0208<<14 | 0x04<<7 | 0x15,\n\t12471 - 12288: jis0208<<14 | 0x04<<7 | 0x16,\n\t12472 - 12288: jis0208<<14 | 0x04<<7 | 0x17,\n\t12473 - 12288: jis0208<<14 | 0x04<<7 | 0x18,\n\t12474 - 12288: jis0208<<14 | 0x04<<7 | 0x19,\n\t12475 - 12288: jis0208<<14 | 0x04<<7 | 0x1A,\n\t12476 - 12288: jis0208<<14 | 0x04<<7 | 0x1B,\n\t12477 - 12288: jis0208<<14 | 0x04<<7 | 0x1C,\n\t12478 - 12288: jis0208<<14 | 0x04<<7 | 0x1D,\n\t12479 - 12288: jis0208<<14 | 0x04<<7 | 0x1E,\n\t12480 - 12288: jis0208<<14 | 0x04<<7 | 0x1F,\n\t12481 - 12288: jis0208<<14 | 0x04<<7 | 0x20,\n\t12482 - 12288: jis0208<<14 | 0x04<<7 | 0x21,\n\t12483 - 12288: jis0208<<14 | 0x04<<7 | 0x22,\n\t12484 - 12288: jis0208<<14 | 0x04<<7 | 0x23,\n\t12485 - 12288: jis0208<<14 | 0x04<<7 | 0x24,\n\t12486 - 12288: jis0208<<14 | 0x04<<7 | 0x25,\n\t12487 - 12288: jis0208<<14 | 0x04<<7 | 0x26,\n\t12488 - 12288: jis0208<<14 | 0x04<<7 | 0x27,\n\t12489 - 12288: jis0208<<14 | 0x04<<7 | 0x28,\n\t12490 - 12288: jis0208<<14 | 0x04<<7 | 0x29,\n\t12491 - 12288: jis0208<<14 | 0x04<<7 | 0x2A,\n\t12492 - 12288: jis0208<<14 | 0x04<<7 | 0x2B,\n\t12493 - 12288: jis0208<<14 | 0x04<<7 | 0x2C,\n\t12494 - 12288: jis0208<<14 | 0x04<<7 | 0x2D,\n\t12495 - 12288: jis0208<<14 | 0x04<<7 | 0x2E,\n\t12496 - 12288: jis0208<<14 | 0x04<<7 | 0x2F,\n\t12497 - 12288: jis0208<<14 | 0x04<<7 | 0x30,\n\t12498 - 12288: jis0208<<14 | 0x04<<7 | 0x31,\n\t12499 - 12288: jis0208<<14 | 0x04<<7 | 0x32,\n\t12500 - 12288: jis0208<<14 | 0x04<<7 | 0x33,\n\t12501 - 12288: jis0208<<14 | 0x04<<7 | 0x34,\n\t12502 - 12288: jis0208<<14 | 0x04<<7 | 0x35,\n\t12503 - 12288: jis0208<<14 | 0x04<<7 | 0x36,\n\t12504 - 12288: jis0208<<14 | 0x04<<7 | 0x37,\n\t12505 - 12288: jis0208<<14 | 0x04<<7 | 0x38,\n\t12506 - 12288: jis0208<<14 | 0x04<<7 | 0x39,\n\t12507 - 12288: jis0208<<14 | 0x04<<7 | 0x3A,\n\t12508 - 12288: jis0208<<14 | 0x04<<7 | 0x3B,\n\t12509 - 12288: jis0208<<14 | 0x04<<7 | 0x3C,\n\t12510 - 12288: jis0208<<14 | 0x04<<7 | 0x3D,\n\t12511 - 12288: jis0208<<14 | 0x04<<7 | 0x3E,\n\t12512 - 12288: jis0208<<14 | 0x04<<7 | 0x3F,\n\t12513 - 12288: jis0208<<14 | 0x04<<7 | 0x40,\n\t12514 - 12288: jis0208<<14 | 0x04<<7 | 0x41,\n\t12515 - 12288: jis0208<<14 | 0x04<<7 | 0x42,\n\t12516 - 12288: jis0208<<14 | 0x04<<7 | 0x43,\n\t12517 - 12288: jis0208<<14 | 0x04<<7 | 0x44,\n\t12518 - 12288: jis0208<<14 | 0x04<<7 | 0x45,\n\t12519 - 12288: jis0208<<14 | 0x04<<7 | 0x46,\n\t12520 - 12288: jis0208<<14 | 0x04<<7 | 0x47,\n\t12521 - 12288: jis0208<<14 | 0x04<<7 | 0x48,\n\t12522 - 12288: jis0208<<14 | 0x04<<7 | 0x49,\n\t12523 - 12288: jis0208<<14 | 0x04<<7 | 0x4A,\n\t12524 - 12288: jis0208<<14 | 0x04<<7 | 0x4B,\n\t12525 - 12288: jis0208<<14 | 0x04<<7 | 0x4C,\n\t12526 - 12288: jis0208<<14 | 0x04<<7 | 0x4D,\n\t12527 - 12288: jis0208<<14 | 0x04<<7 | 0x4E,\n\t12528 - 12288: jis0208<<14 | 0x04<<7 | 0x4F,\n\t12529 - 12288: jis0208<<14 | 0x04<<7 | 0x50,\n\t12530 - 12288: jis0208<<14 | 0x04<<7 | 0x51,\n\t12531 - 12288: jis0208<<14 | 0x04<<7 | 0x52,\n\t12532 - 12288: jis0208<<14 | 0x04<<7 | 0x53,\n\t12533 - 12288: jis0208<<14 | 0x04<<7 | 0x54,\n\t12534 - 12288: jis0208<<14 | 0x04<<7 | 0x55,\n\t12539 - 12288: jis0208<<14 | 0x00<<7 | 0x05,\n\t12540 - 12288: jis0208<<14 | 0x00<<7 | 0x1B,\n\t12541 - 12288: jis0208<<14 | 0x00<<7 | 0x12,\n\t12542 - 12288: jis0208<<14 | 0x00<<7 | 0x13,\n\t12849 - 12288: jis0208<<14 | 0x0C<<7 | 0x49,\n\t12850 - 12288: jis0208<<14 | 0x0C<<7 | 0x4A,\n\t12857 - 12288: jis0208<<14 | 0x0C<<7 | 0x4B,\n\t12964 - 12288: jis0208<<14 | 0x0C<<7 | 0x44,\n\t12965 - 12288: jis0208<<14 | 0x0C<<7 | 0x45,\n\t12966 - 12288: jis0208<<14 | 0x0C<<7 | 0x46,\n\t12967 - 12288: jis0208<<14 | 0x0C<<7 | 0x47,\n\t12968 - 12288: jis0208<<14 | 0x0C<<7 | 0x48,\n\t13059 - 12288: jis0208<<14 | 0x0C<<7 | 0x25,\n\t13069 - 12288: jis0208<<14 | 0x0C<<7 | 0x29,\n\t13076 - 12288: jis0208<<14 | 0x0C<<7 | 0x20,\n\t13080 - 12288: jis0208<<14 | 0x0C<<7 | 0x23,\n\t13090 - 12288: jis0208<<14 | 0x0C<<7 | 0x21,\n\t13091 - 12288: jis0208<<14 | 0x0C<<7 | 0x2B,\n\t13094 - 12288: jis0208<<14 | 0x0C<<7 | 0x2A,\n\t13095 - 12288: jis0208<<14 | 0x0C<<7 | 0x24,\n\t13099 - 12288: jis0208<<14 | 0x0C<<7 | 0x2C,\n\t13110 - 12288: jis0208<<14 | 0x0C<<7 | 0x26,\n\t13115 - 12288: jis0208<<14 | 0x0C<<7 | 0x2E,\n\t13129 - 12288: jis0208<<14 | 0x0C<<7 | 0x1F,\n\t13130 - 12288: jis0208<<14 | 0x0C<<7 | 0x2D,\n\t13133 - 12288: jis0208<<14 | 0x0C<<7 | 0x22,\n\t13137 - 12288: jis0208<<14 | 0x0C<<7 | 0x27,\n\t13143 - 12288: jis0208<<14 | 0x0C<<7 | 0x28,\n\t13179 - 12288: jis0208<<14 | 0x0C<<7 | 0x3E,\n\t13180 - 12288: jis0208<<14 | 0x0C<<7 | 0x4E,\n\t13181 - 12288: jis0208<<14 | 0x0C<<7 | 0x4D,\n\t13182 - 12288: jis0208<<14 | 0x0C<<7 | 0x4C,\n\t13198 - 12288: jis0208<<14 | 0x0C<<7 | 0x32,\n\t13199 - 12288: jis0208<<14 | 0x0C<<7 | 0x33,\n\t13212 - 12288: jis0208<<14 | 0x0C<<7 | 0x2F,\n\t13213 - 12288: jis0208<<14 | 0x0C<<7 | 0x30,\n\t13214 - 12288: jis0208<<14 | 0x0C<<7 | 0x31,\n\t13217 - 12288: jis0208<<14 | 0x0C<<7 | 0x35,\n\t13252 - 12288: jis0208<<14 | 0x0C<<7 | 0x34,\n\t13261 - 12288: jis0208<<14 | 0x0C<<7 | 0x42,\n}\n\nconst encode3Low, encode3High = 161, 1120\n\nvar encode3 = [...]uint16{\n\t161 - 161:  jis0212<<14 | 0x01<<7 | 0x21,\n\t164 - 161:  jis0212<<14 | 0x01<<7 | 0x4F,\n\t166 - 161:  jis0212<<14 | 0x01<<7 | 0x22,\n\t167 - 161:  jis0208<<14 | 0x00<<7 | 0x57,\n\t168 - 161:  jis0208<<14 | 0x00<<7 | 0x0E,\n\t169 - 161:  jis0212<<14 | 0x01<<7 | 0x4C,\n\t170 - 161:  jis0212<<14 | 0x01<<7 | 0x4B,\n\t174 - 161:  jis0212<<14 | 0x01<<7 | 0x4D,\n\t175 - 161:  jis0212<<14 | 0x01<<7 | 0x13,\n\t176 - 161:  jis0208<<14 | 0x00<<7 | 0x4A,\n\t177 - 161:  jis0208<<14 | 0x00<<7 | 0x3D,\n\t180 - 161:  jis0208<<14 | 0x00<<7 | 0x0C,\n\t182 - 161:  jis0208<<14 | 0x01<<7 | 0x58,\n\t184 - 161:  jis0212<<14 | 0x01<<7 | 0x10,\n\t186 - 161:  jis0212<<14 | 0x01<<7 | 0x4A,\n\t191 - 161:  jis0212<<14 | 0x01<<7 | 0x23,\n\t192 - 161:  jis0212<<14 | 0x09<<7 | 0x01,\n\t193 - 161:  jis0212<<14 | 0x09<<7 | 0x00,\n\t194 - 161:  jis0212<<14 | 0x09<<7 | 0x03,\n\t195 - 161:  jis0212<<14 | 0x09<<7 | 0x09,\n\t196 - 161:  jis0212<<14 | 0x09<<7 | 0x02,\n\t197 - 161:  jis0212<<14 | 0x09<<7 | 0x08,\n\t198 - 161:  jis0212<<14 | 0x08<<7 | 0x00,\n\t199 - 161:  jis0212<<14 | 0x09<<7 | 0x0D,\n\t200 - 161:  jis0212<<14 | 0x09<<7 | 0x11,\n\t201 - 161:  jis0212<<14 | 0x09<<7 | 0x10,\n\t202 - 161:  jis0212<<14 | 0x09<<7 | 0x13,\n\t203 - 161:  jis0212<<14 | 0x09<<7 | 0x12,\n\t204 - 161:  jis0212<<14 | 0x09<<7 | 0x1F,\n\t205 - 161:  jis0212<<14 | 0x09<<7 | 0x1E,\n\t206 - 161:  jis0212<<14 | 0x09<<7 | 0x21,\n\t207 - 161:  jis0212<<14 | 0x09<<7 | 0x20,\n\t209 - 161:  jis0212<<14 | 0x09<<7 | 0x2F,\n\t210 - 161:  jis0212<<14 | 0x09<<7 | 0x31,\n\t211 - 161:  jis0212<<14 | 0x09<<7 | 0x30,\n\t212 - 161:  jis0212<<14 | 0x09<<7 | 0x33,\n\t213 - 161:  jis0212<<14 | 0x09<<7 | 0x37,\n\t214 - 161:  jis0212<<14 | 0x09<<7 | 0x32,\n\t215 - 161:  jis0208<<14 | 0x00<<7 | 0x3E,\n\t216 - 161:  jis0212<<14 | 0x08<<7 | 0x0B,\n\t217 - 161:  jis0212<<14 | 0x09<<7 | 0x42,\n\t218 - 161:  jis0212<<14 | 0x09<<7 | 0x41,\n\t219 - 161:  jis0212<<14 | 0x09<<7 | 0x44,\n\t220 - 161:  jis0212<<14 | 0x09<<7 | 0x43,\n\t221 - 161:  jis0212<<14 | 0x09<<7 | 0x51,\n\t222 - 161:  jis0212<<14 | 0x08<<7 | 0x0F,\n\t223 - 161:  jis0212<<14 | 0x08<<7 | 0x2D,\n\t224 - 161:  jis0212<<14 | 0x0A<<7 | 0x01,\n\t225 - 161:  jis0212<<14 | 0x0A<<7 | 0x00,\n\t226 - 161:  jis0212<<14 | 0x0A<<7 | 0x03,\n\t227 - 161:  jis0212<<14 | 0x0A<<7 | 0x09,\n\t228 - 161:  jis0212<<14 | 0x0A<<7 | 0x02,\n\t229 - 161:  jis0212<<14 | 0x0A<<7 | 0x08,\n\t230 - 161:  jis0212<<14 | 0x08<<7 | 0x20,\n\t231 - 161:  jis0212<<14 | 0x0A<<7 | 0x0D,\n\t232 - 161:  jis0212<<14 | 0x0A<<7 | 0x11,\n\t233 - 161:  jis0212<<14 | 0x0A<<7 | 0x10,\n\t234 - 161:  jis0212<<14 | 0x0A<<7 | 0x13,\n\t235 - 161:  jis0212<<14 | 0x0A<<7 | 0x12,\n\t236 - 161:  jis0212<<14 | 0x0A<<7 | 0x1F,\n\t237 - 161:  jis0212<<14 | 0x0A<<7 | 0x1E,\n\t238 - 161:  jis0212<<14 | 0x0A<<7 | 0x21,\n\t239 - 161:  jis0212<<14 | 0x0A<<7 | 0x20,\n\t240 - 161:  jis0212<<14 | 0x08<<7 | 0x22,\n\t241 - 161:  jis0212<<14 | 0x0A<<7 | 0x2F,\n\t242 - 161:  jis0212<<14 | 0x0A<<7 | 0x31,\n\t243 - 161:  jis0212<<14 | 0x0A<<7 | 0x30,\n\t244 - 161:  jis0212<<14 | 0x0A<<7 | 0x33,\n\t245 - 161:  jis0212<<14 | 0x0A<<7 | 0x37,\n\t246 - 161:  jis0212<<14 | 0x0A<<7 | 0x32,\n\t247 - 161:  jis0208<<14 | 0x00<<7 | 0x3F,\n\t248 - 161:  jis0212<<14 | 0x08<<7 | 0x2B,\n\t249 - 161:  jis0212<<14 | 0x0A<<7 | 0x42,\n\t250 - 161:  jis0212<<14 | 0x0A<<7 | 0x41,\n\t251 - 161:  jis0212<<14 | 0x0A<<7 | 0x44,\n\t252 - 161:  jis0212<<14 | 0x0A<<7 | 0x43,\n\t253 - 161:  jis0212<<14 | 0x0A<<7 | 0x51,\n\t254 - 161:  jis0212<<14 | 0x08<<7 | 0x2F,\n\t255 - 161:  jis0212<<14 | 0x0A<<7 | 0x52,\n\t256 - 161:  jis0212<<14 | 0x09<<7 | 0x06,\n\t257 - 161:  jis0212<<14 | 0x0A<<7 | 0x06,\n\t258 - 161:  jis0212<<14 | 0x09<<7 | 0x04,\n\t259 - 161:  jis0212<<14 | 0x0A<<7 | 0x04,\n\t260 - 161:  jis0212<<14 | 0x09<<7 | 0x07,\n\t261 - 161:  jis0212<<14 | 0x0A<<7 | 0x07,\n\t262 - 161:  jis0212<<14 | 0x09<<7 | 0x0A,\n\t263 - 161:  jis0212<<14 | 0x0A<<7 | 0x0A,\n\t264 - 161:  jis0212<<14 | 0x09<<7 | 0x0B,\n\t265 - 161:  jis0212<<14 | 0x0A<<7 | 0x0B,\n\t266 - 161:  jis0212<<14 | 0x09<<7 | 0x0E,\n\t267 - 161:  jis0212<<14 | 0x0A<<7 | 0x0E,\n\t268 - 161:  jis0212<<14 | 0x09<<7 | 0x0C,\n\t269 - 161:  jis0212<<14 | 0x0A<<7 | 0x0C,\n\t270 - 161:  jis0212<<14 | 0x09<<7 | 0x0F,\n\t271 - 161:  jis0212<<14 | 0x0A<<7 | 0x0F,\n\t272 - 161:  jis0212<<14 | 0x08<<7 | 0x01,\n\t273 - 161:  jis0212<<14 | 0x08<<7 | 0x21,\n\t274 - 161:  jis0212<<14 | 0x09<<7 | 0x16,\n\t275 - 161:  jis0212<<14 | 0x0A<<7 | 0x16,\n\t278 - 161:  jis0212<<14 | 0x09<<7 | 0x15,\n\t279 - 161:  jis0212<<14 | 0x0A<<7 | 0x15,\n\t280 - 161:  jis0212<<14 | 0x09<<7 | 0x17,\n\t281 - 161:  jis0212<<14 | 0x0A<<7 | 0x17,\n\t282 - 161:  jis0212<<14 | 0x09<<7 | 0x14,\n\t283 - 161:  jis0212<<14 | 0x0A<<7 | 0x14,\n\t284 - 161:  jis0212<<14 | 0x09<<7 | 0x19,\n\t285 - 161:  jis0212<<14 | 0x0A<<7 | 0x19,\n\t286 - 161:  jis0212<<14 | 0x09<<7 | 0x1A,\n\t287 - 161:  jis0212<<14 | 0x0A<<7 | 0x1A,\n\t288 - 161:  jis0212<<14 | 0x09<<7 | 0x1C,\n\t289 - 161:  jis0212<<14 | 0x0A<<7 | 0x1C,\n\t290 - 161:  jis0212<<14 | 0x09<<7 | 0x1B,\n\t292 - 161:  jis0212<<14 | 0x09<<7 | 0x1D,\n\t293 - 161:  jis0212<<14 | 0x0A<<7 | 0x1D,\n\t294 - 161:  jis0212<<14 | 0x08<<7 | 0x03,\n\t295 - 161:  jis0212<<14 | 0x08<<7 | 0x23,\n\t296 - 161:  jis0212<<14 | 0x09<<7 | 0x26,\n\t297 - 161:  jis0212<<14 | 0x0A<<7 | 0x26,\n\t298 - 161:  jis0212<<14 | 0x09<<7 | 0x24,\n\t299 - 161:  jis0212<<14 | 0x0A<<7 | 0x24,\n\t302 - 161:  jis0212<<14 | 0x09<<7 | 0x25,\n\t303 - 161:  jis0212<<14 | 0x0A<<7 | 0x25,\n\t304 - 161:  jis0212<<14 | 0x09<<7 | 0x23,\n\t305 - 161:  jis0212<<14 | 0x08<<7 | 0x24,\n\t306 - 161:  jis0212<<14 | 0x08<<7 | 0x05,\n\t307 - 161:  jis0212<<14 | 0x08<<7 | 0x25,\n\t308 - 161:  jis0212<<14 | 0x09<<7 | 0x27,\n\t309 - 161:  jis0212<<14 | 0x0A<<7 | 0x27,\n\t310 - 161:  jis0212<<14 | 0x09<<7 | 0x28,\n\t311 - 161:  jis0212<<14 | 0x0A<<7 | 0x28,\n\t312 - 161:  jis0212<<14 | 0x08<<7 | 0x26,\n\t313 - 161:  jis0212<<14 | 0x09<<7 | 0x29,\n\t314 - 161:  jis0212<<14 | 0x0A<<7 | 0x29,\n\t315 - 161:  jis0212<<14 | 0x09<<7 | 0x2B,\n\t316 - 161:  jis0212<<14 | 0x0A<<7 | 0x2B,\n\t317 - 161:  jis0212<<14 | 0x09<<7 | 0x2A,\n\t318 - 161:  jis0212<<14 | 0x0A<<7 | 0x2A,\n\t319 - 161:  jis0212<<14 | 0x08<<7 | 0x08,\n\t320 - 161:  jis0212<<14 | 0x08<<7 | 0x28,\n\t321 - 161:  jis0212<<14 | 0x08<<7 | 0x07,\n\t322 - 161:  jis0212<<14 | 0x08<<7 | 0x27,\n\t323 - 161:  jis0212<<14 | 0x09<<7 | 0x2C,\n\t324 - 161:  jis0212<<14 | 0x0A<<7 | 0x2C,\n\t325 - 161:  jis0212<<14 | 0x09<<7 | 0x2E,\n\t326 - 161:  jis0212<<14 | 0x0A<<7 | 0x2E,\n\t327 - 161:  jis0212<<14 | 0x09<<7 | 0x2D,\n\t328 - 161:  jis0212<<14 | 0x0A<<7 | 0x2D,\n\t329 - 161:  jis0212<<14 | 0x08<<7 | 0x29,\n\t330 - 161:  jis0212<<14 | 0x08<<7 | 0x0A,\n\t331 - 161:  jis0212<<14 | 0x08<<7 | 0x2A,\n\t332 - 161:  jis0212<<14 | 0x09<<7 | 0x36,\n\t333 - 161:  jis0212<<14 | 0x0A<<7 | 0x36,\n\t336 - 161:  jis0212<<14 | 0x09<<7 | 0x35,\n\t337 - 161:  jis0212<<14 | 0x0A<<7 | 0x35,\n\t338 - 161:  jis0212<<14 | 0x08<<7 | 0x0C,\n\t339 - 161:  jis0212<<14 | 0x08<<7 | 0x2C,\n\t340 - 161:  jis0212<<14 | 0x09<<7 | 0x38,\n\t341 - 161:  jis0212<<14 | 0x0A<<7 | 0x38,\n\t342 - 161:  jis0212<<14 | 0x09<<7 | 0x3A,\n\t343 - 161:  jis0212<<14 | 0x0A<<7 | 0x3A,\n\t344 - 161:  jis0212<<14 | 0x09<<7 | 0x39,\n\t345 - 161:  jis0212<<14 | 0x0A<<7 | 0x39,\n\t346 - 161:  jis0212<<14 | 0x09<<7 | 0x3B,\n\t347 - 161:  jis0212<<14 | 0x0A<<7 | 0x3B,\n\t348 - 161:  jis0212<<14 | 0x09<<7 | 0x3C,\n\t349 - 161:  jis0212<<14 | 0x0A<<7 | 0x3C,\n\t350 - 161:  jis0212<<14 | 0x09<<7 | 0x3E,\n\t351 - 161:  jis0212<<14 | 0x0A<<7 | 0x3E,\n\t352 - 161:  jis0212<<14 | 0x09<<7 | 0x3D,\n\t353 - 161:  jis0212<<14 | 0x0A<<7 | 0x3D,\n\t354 - 161:  jis0212<<14 | 0x09<<7 | 0x40,\n\t355 - 161:  jis0212<<14 | 0x0A<<7 | 0x40,\n\t356 - 161:  jis0212<<14 | 0x09<<7 | 0x3F,\n\t357 - 161:  jis0212<<14 | 0x0A<<7 | 0x3F,\n\t358 - 161:  jis0212<<14 | 0x08<<7 | 0x0E,\n\t359 - 161:  jis0212<<14 | 0x08<<7 | 0x2E,\n\t360 - 161:  jis0212<<14 | 0x09<<7 | 0x4B,\n\t361 - 161:  jis0212<<14 | 0x0A<<7 | 0x4B,\n\t362 - 161:  jis0212<<14 | 0x09<<7 | 0x48,\n\t363 - 161:  jis0212<<14 | 0x0A<<7 | 0x48,\n\t364 - 161:  jis0212<<14 | 0x09<<7 | 0x45,\n\t365 - 161:  jis0212<<14 | 0x0A<<7 | 0x45,\n\t366 - 161:  jis0212<<14 | 0x09<<7 | 0x4A,\n\t367 - 161:  jis0212<<14 | 0x0A<<7 | 0x4A,\n\t368 - 161:  jis0212<<14 | 0x09<<7 | 0x47,\n\t369 - 161:  jis0212<<14 | 0x0A<<7 | 0x47,\n\t370 - 161:  jis0212<<14 | 0x09<<7 | 0x49,\n\t371 - 161:  jis0212<<14 | 0x0A<<7 | 0x49,\n\t372 - 161:  jis0212<<14 | 0x09<<7 | 0x50,\n\t373 - 161:  jis0212<<14 | 0x0A<<7 | 0x50,\n\t374 - 161:  jis0212<<14 | 0x09<<7 | 0x53,\n\t375 - 161:  jis0212<<14 | 0x0A<<7 | 0x53,\n\t376 - 161:  jis0212<<14 | 0x09<<7 | 0x52,\n\t377 - 161:  jis0212<<14 | 0x09<<7 | 0x54,\n\t378 - 161:  jis0212<<14 | 0x0A<<7 | 0x54,\n\t379 - 161:  jis0212<<14 | 0x09<<7 | 0x56,\n\t380 - 161:  jis0212<<14 | 0x0A<<7 | 0x56,\n\t381 - 161:  jis0212<<14 | 0x09<<7 | 0x55,\n\t382 - 161:  jis0212<<14 | 0x0A<<7 | 0x55,\n\t461 - 161:  jis0212<<14 | 0x09<<7 | 0x05,\n\t462 - 161:  jis0212<<14 | 0x0A<<7 | 0x05,\n\t463 - 161:  jis0212<<14 | 0x09<<7 | 0x22,\n\t464 - 161:  jis0212<<14 | 0x0A<<7 | 0x22,\n\t465 - 161:  jis0212<<14 | 0x09<<7 | 0x34,\n\t466 - 161:  jis0212<<14 | 0x0A<<7 | 0x34,\n\t467 - 161:  jis0212<<14 | 0x09<<7 | 0x46,\n\t468 - 161:  jis0212<<14 | 0x0A<<7 | 0x46,\n\t469 - 161:  jis0212<<14 | 0x09<<7 | 0x4F,\n\t470 - 161:  jis0212<<14 | 0x0A<<7 | 0x4F,\n\t471 - 161:  jis0212<<14 | 0x09<<7 | 0x4C,\n\t472 - 161:  jis0212<<14 | 0x0A<<7 | 0x4C,\n\t473 - 161:  jis0212<<14 | 0x09<<7 | 0x4E,\n\t474 - 161:  jis0212<<14 | 0x0A<<7 | 0x4E,\n\t475 - 161:  jis0212<<14 | 0x09<<7 | 0x4D,\n\t476 - 161:  jis0212<<14 | 0x0A<<7 | 0x4D,\n\t501 - 161:  jis0212<<14 | 0x0A<<7 | 0x18,\n\t711 - 161:  jis0212<<14 | 0x01<<7 | 0x0F,\n\t728 - 161:  jis0212<<14 | 0x01<<7 | 0x0E,\n\t729 - 161:  jis0212<<14 | 0x01<<7 | 0x11,\n\t730 - 161:  jis0212<<14 | 0x01<<7 | 0x15,\n\t731 - 161:  jis0212<<14 | 0x01<<7 | 0x14,\n\t733 - 161:  jis0212<<14 | 0x01<<7 | 0x12,\n\t900 - 161:  jis0212<<14 | 0x01<<7 | 0x17,\n\t901 - 161:  jis0212<<14 | 0x01<<7 | 0x18,\n\t902 - 161:  jis0212<<14 | 0x05<<7 | 0x40,\n\t904 - 161:  jis0212<<14 | 0x05<<7 | 0x41,\n\t905 - 161:  jis0212<<14 | 0x05<<7 | 0x42,\n\t906 - 161:  jis0212<<14 | 0x05<<7 | 0x43,\n\t908 - 161:  jis0212<<14 | 0x05<<7 | 0x46,\n\t910 - 161:  jis0212<<14 | 0x05<<7 | 0x48,\n\t911 - 161:  jis0212<<14 | 0x05<<7 | 0x4B,\n\t912 - 161:  jis0212<<14 | 0x05<<7 | 0x55,\n\t913 - 161:  jis0208<<14 | 0x05<<7 | 0x00,\n\t914 - 161:  jis0208<<14 | 0x05<<7 | 0x01,\n\t915 - 161:  jis0208<<14 | 0x05<<7 | 0x02,\n\t916 - 161:  jis0208<<14 | 0x05<<7 | 0x03,\n\t917 - 161:  jis0208<<14 | 0x05<<7 | 0x04,\n\t918 - 161:  jis0208<<14 | 0x05<<7 | 0x05,\n\t919 - 161:  jis0208<<14 | 0x05<<7 | 0x06,\n\t920 - 161:  jis0208<<14 | 0x05<<7 | 0x07,\n\t921 - 161:  jis0208<<14 | 0x05<<7 | 0x08,\n\t922 - 161:  jis0208<<14 | 0x05<<7 | 0x09,\n\t923 - 161:  jis0208<<14 | 0x05<<7 | 0x0A,\n\t924 - 161:  jis0208<<14 | 0x05<<7 | 0x0B,\n\t925 - 161:  jis0208<<14 | 0x05<<7 | 0x0C,\n\t926 - 161:  jis0208<<14 | 0x05<<7 | 0x0D,\n\t927 - 161:  jis0208<<14 | 0x05<<7 | 0x0E,\n\t928 - 161:  jis0208<<14 | 0x05<<7 | 0x0F,\n\t929 - 161:  jis0208<<14 | 0x05<<7 | 0x10,\n\t931 - 161:  jis0208<<14 | 0x05<<7 | 0x11,\n\t932 - 161:  jis0208<<14 | 0x05<<7 | 0x12,\n\t933 - 161:  jis0208<<14 | 0x05<<7 | 0x13,\n\t934 - 161:  jis0208<<14 | 0x05<<7 | 0x14,\n\t935 - 161:  jis0208<<14 | 0x05<<7 | 0x15,\n\t936 - 161:  jis0208<<14 | 0x05<<7 | 0x16,\n\t937 - 161:  jis0208<<14 | 0x05<<7 | 0x17,\n\t938 - 161:  jis0212<<14 | 0x05<<7 | 0x44,\n\t939 - 161:  jis0212<<14 | 0x05<<7 | 0x49,\n\t940 - 161:  jis0212<<14 | 0x05<<7 | 0x50,\n\t941 - 161:  jis0212<<14 | 0x05<<7 | 0x51,\n\t942 - 161:  jis0212<<14 | 0x05<<7 | 0x52,\n\t943 - 161:  jis0212<<14 | 0x05<<7 | 0x53,\n\t944 - 161:  jis0212<<14 | 0x05<<7 | 0x5A,\n\t945 - 161:  jis0208<<14 | 0x05<<7 | 0x20,\n\t946 - 161:  jis0208<<14 | 0x05<<7 | 0x21,\n\t947 - 161:  jis0208<<14 | 0x05<<7 | 0x22,\n\t948 - 161:  jis0208<<14 | 0x05<<7 | 0x23,\n\t949 - 161:  jis0208<<14 | 0x05<<7 | 0x24,\n\t950 - 161:  jis0208<<14 | 0x05<<7 | 0x25,\n\t951 - 161:  jis0208<<14 | 0x05<<7 | 0x26,\n\t952 - 161:  jis0208<<14 | 0x05<<7 | 0x27,\n\t953 - 161:  jis0208<<14 | 0x05<<7 | 0x28,\n\t954 - 161:  jis0208<<14 | 0x05<<7 | 0x29,\n\t955 - 161:  jis0208<<14 | 0x05<<7 | 0x2A,\n\t956 - 161:  jis0208<<14 | 0x05<<7 | 0x2B,\n\t957 - 161:  jis0208<<14 | 0x05<<7 | 0x2C,\n\t958 - 161:  jis0208<<14 | 0x05<<7 | 0x2D,\n\t959 - 161:  jis0208<<14 | 0x05<<7 | 0x2E,\n\t960 - 161:  jis0208<<14 | 0x05<<7 | 0x2F,\n\t961 - 161:  jis0208<<14 | 0x05<<7 | 0x30,\n\t962 - 161:  jis0212<<14 | 0x05<<7 | 0x57,\n\t963 - 161:  jis0208<<14 | 0x05<<7 | 0x31,\n\t964 - 161:  jis0208<<14 | 0x05<<7 | 0x32,\n\t965 - 161:  jis0208<<14 | 0x05<<7 | 0x33,\n\t966 - 161:  jis0208<<14 | 0x05<<7 | 0x34,\n\t967 - 161:  jis0208<<14 | 0x05<<7 | 0x35,\n\t968 - 161:  jis0208<<14 | 0x05<<7 | 0x36,\n\t969 - 161:  jis0208<<14 | 0x05<<7 | 0x37,\n\t970 - 161:  jis0212<<14 | 0x05<<7 | 0x54,\n\t971 - 161:  jis0212<<14 | 0x05<<7 | 0x59,\n\t972 - 161:  jis0212<<14 | 0x05<<7 | 0x56,\n\t973 - 161:  jis0212<<14 | 0x05<<7 | 0x58,\n\t974 - 161:  jis0212<<14 | 0x05<<7 | 0x5B,\n\t1025 - 161: jis0208<<14 | 0x06<<7 | 0x06,\n\t1026 - 161: jis0212<<14 | 0x06<<7 | 0x21,\n\t1027 - 161: jis0212<<14 | 0x06<<7 | 0x22,\n\t1028 - 161: jis0212<<14 | 0x06<<7 | 0x23,\n\t1029 - 161: jis0212<<14 | 0x06<<7 | 0x24,\n\t1030 - 161: jis0212<<14 | 0x06<<7 | 0x25,\n\t1031 - 161: jis0212<<14 | 0x06<<7 | 0x26,\n\t1032 - 161: jis0212<<14 | 0x06<<7 | 0x27,\n\t1033 - 161: jis0212<<14 | 0x06<<7 | 0x28,\n\t1034 - 161: jis0212<<14 | 0x06<<7 | 0x29,\n\t1035 - 161: jis0212<<14 | 0x06<<7 | 0x2A,\n\t1036 - 161: jis0212<<14 | 0x06<<7 | 0x2B,\n\t1038 - 161: jis0212<<14 | 0x06<<7 | 0x2C,\n\t1039 - 161: jis0212<<14 | 0x06<<7 | 0x2D,\n\t1040 - 161: jis0208<<14 | 0x06<<7 | 0x00,\n\t1041 - 161: jis0208<<14 | 0x06<<7 | 0x01,\n\t1042 - 161: jis0208<<14 | 0x06<<7 | 0x02,\n\t1043 - 161: jis0208<<14 | 0x06<<7 | 0x03,\n\t1044 - 161: jis0208<<14 | 0x06<<7 | 0x04,\n\t1045 - 161: jis0208<<14 | 0x06<<7 | 0x05,\n\t1046 - 161: jis0208<<14 | 0x06<<7 | 0x07,\n\t1047 - 161: jis0208<<14 | 0x06<<7 | 0x08,\n\t1048 - 161: jis0208<<14 | 0x06<<7 | 0x09,\n\t1049 - 161: jis0208<<14 | 0x06<<7 | 0x0A,\n\t1050 - 161: jis0208<<14 | 0x06<<7 | 0x0B,\n\t1051 - 161: jis0208<<14 | 0x06<<7 | 0x0C,\n\t1052 - 161: jis0208<<14 | 0x06<<7 | 0x0D,\n\t1053 - 161: jis0208<<14 | 0x06<<7 | 0x0E,\n\t1054 - 161: jis0208<<14 | 0x06<<7 | 0x0F,\n\t1055 - 161: jis0208<<14 | 0x06<<7 | 0x10,\n\t1056 - 161: jis0208<<14 | 0x06<<7 | 0x11,\n\t1057 - 161: jis0208<<14 | 0x06<<7 | 0x12,\n\t1058 - 161: jis0208<<14 | 0x06<<7 | 0x13,\n\t1059 - 161: jis0208<<14 | 0x06<<7 | 0x14,\n\t1060 - 161: jis0208<<14 | 0x06<<7 | 0x15,\n\t1061 - 161: jis0208<<14 | 0x06<<7 | 0x16,\n\t1062 - 161: jis0208<<14 | 0x06<<7 | 0x17,\n\t1063 - 161: jis0208<<14 | 0x06<<7 | 0x18,\n\t1064 - 161: jis0208<<14 | 0x06<<7 | 0x19,\n\t1065 - 161: jis0208<<14 | 0x06<<7 | 0x1A,\n\t1066 - 161: jis0208<<14 | 0x06<<7 | 0x1B,\n\t1067 - 161: jis0208<<14 | 0x06<<7 | 0x1C,\n\t1068 - 161: jis0208<<14 | 0x06<<7 | 0x1D,\n\t1069 - 161: jis0208<<14 | 0x06<<7 | 0x1E,\n\t1070 - 161: jis0208<<14 | 0x06<<7 | 0x1F,\n\t1071 - 161: jis0208<<14 | 0x06<<7 | 0x20,\n\t1072 - 161: jis0208<<14 | 0x06<<7 | 0x30,\n\t1073 - 161: jis0208<<14 | 0x06<<7 | 0x31,\n\t1074 - 161: jis0208<<14 | 0x06<<7 | 0x32,\n\t1075 - 161: jis0208<<14 | 0x06<<7 | 0x33,\n\t1076 - 161: jis0208<<14 | 0x06<<7 | 0x34,\n\t1077 - 161: jis0208<<14 | 0x06<<7 | 0x35,\n\t1078 - 161: jis0208<<14 | 0x06<<7 | 0x37,\n\t1079 - 161: jis0208<<14 | 0x06<<7 | 0x38,\n\t1080 - 161: jis0208<<14 | 0x06<<7 | 0x39,\n\t1081 - 161: jis0208<<14 | 0x06<<7 | 0x3A,\n\t1082 - 161: jis0208<<14 | 0x06<<7 | 0x3B,\n\t1083 - 161: jis0208<<14 | 0x06<<7 | 0x3C,\n\t1084 - 161: jis0208<<14 | 0x06<<7 | 0x3D,\n\t1085 - 161: jis0208<<14 | 0x06<<7 | 0x3E,\n\t1086 - 161: jis0208<<14 | 0x06<<7 | 0x3F,\n\t1087 - 161: jis0208<<14 | 0x06<<7 | 0x40,\n\t1088 - 161: jis0208<<14 | 0x06<<7 | 0x41,\n\t1089 - 161: jis0208<<14 | 0x06<<7 | 0x42,\n\t1090 - 161: jis0208<<14 | 0x06<<7 | 0x43,\n\t1091 - 161: jis0208<<14 | 0x06<<7 | 0x44,\n\t1092 - 161: jis0208<<14 | 0x06<<7 | 0x45,\n\t1093 - 161: jis0208<<14 | 0x06<<7 | 0x46,\n\t1094 - 161: jis0208<<14 | 0x06<<7 | 0x47,\n\t1095 - 161: jis0208<<14 | 0x06<<7 | 0x48,\n\t1096 - 161: jis0208<<14 | 0x06<<7 | 0x49,\n\t1097 - 161: jis0208<<14 | 0x06<<7 | 0x4A,\n\t1098 - 161: jis0208<<14 | 0x06<<7 | 0x4B,\n\t1099 - 161: jis0208<<14 | 0x06<<7 | 0x4C,\n\t1100 - 161: jis0208<<14 | 0x06<<7 | 0x4D,\n\t1101 - 161: jis0208<<14 | 0x06<<7 | 0x4E,\n\t1102 - 161: jis0208<<14 | 0x06<<7 | 0x4F,\n\t1103 - 161: jis0208<<14 | 0x06<<7 | 0x50,\n\t1105 - 161: jis0208<<14 | 0x06<<7 | 0x36,\n\t1106 - 161: jis0212<<14 | 0x06<<7 | 0x51,\n\t1107 - 161: jis0212<<14 | 0x06<<7 | 0x52,\n\t1108 - 161: jis0212<<14 | 0x06<<7 | 0x53,\n\t1109 - 161: jis0212<<14 | 0x06<<7 | 0x54,\n\t1110 - 161: jis0212<<14 | 0x06<<7 | 0x55,\n\t1111 - 161: jis0212<<14 | 0x06<<7 | 0x56,\n\t1112 - 161: jis0212<<14 | 0x06<<7 | 0x57,\n\t1113 - 161: jis0212<<14 | 0x06<<7 | 0x58,\n\t1114 - 161: jis0212<<14 | 0x06<<7 | 0x59,\n\t1115 - 161: jis0212<<14 | 0x06<<7 | 0x5A,\n\t1116 - 161: jis0212<<14 | 0x06<<7 | 0x5B,\n\t1118 - 161: jis0212<<14 | 0x06<<7 | 0x5C,\n\t1119 - 161: jis0212<<14 | 0x06<<7 | 0x5D,\n}\n\nconst encode4Low, encode4High = 63785, 64046\n\nvar encode4 = [...]uint16{\n\t63785 - 63785: jis0208<<14 | 0x59<<7 | 0x25,\n\t63964 - 63785: jis0208<<14 | 0x5B<<7 | 0x2E,\n\t64014 - 63785: jis0208<<14 | 0x58<<7 | 0x33,\n\t64015 - 63785: jis0208<<14 | 0x58<<7 | 0x3E,\n\t64016 - 63785: jis0208<<14 | 0x58<<7 | 0x3F,\n\t64017 - 63785: jis0208<<14 | 0x58<<7 | 0x54,\n\t64018 - 63785: jis0208<<14 | 0x59<<7 | 0x1D,\n\t64019 - 63785: jis0208<<14 | 0x59<<7 | 0x2D,\n\t64020 - 63785: jis0208<<14 | 0x59<<7 | 0x2F,\n\t64021 - 63785: jis0208<<14 | 0x59<<7 | 0x5A,\n\t64022 - 63785: jis0208<<14 | 0x5A<<7 | 0x02,\n\t64023 - 63785: jis0208<<14 | 0x5A<<7 | 0x19,\n\t64024 - 63785: jis0208<<14 | 0x5A<<7 | 0x21,\n\t64025 - 63785: jis0208<<14 | 0x5A<<7 | 0x22,\n\t64026 - 63785: jis0208<<14 | 0x5A<<7 | 0x23,\n\t64027 - 63785: jis0208<<14 | 0x5A<<7 | 0x25,\n\t64028 - 63785: jis0208<<14 | 0x5A<<7 | 0x29,\n\t64029 - 63785: jis0208<<14 | 0x5A<<7 | 0x2C,\n\t64030 - 63785: jis0208<<14 | 0x5A<<7 | 0x35,\n\t64031 - 63785: jis0208<<14 | 0x5A<<7 | 0x40,\n\t64032 - 63785: jis0208<<14 | 0x5A<<7 | 0x42,\n\t64033 - 63785: jis0208<<14 | 0x5A<<7 | 0x43,\n\t64034 - 63785: jis0208<<14 | 0x5A<<7 | 0x4C,\n\t64035 - 63785: jis0208<<14 | 0x5A<<7 | 0x54,\n\t64036 - 63785: jis0208<<14 | 0x5A<<7 | 0x56,\n\t64037 - 63785: jis0208<<14 | 0x5A<<7 | 0x57,\n\t64038 - 63785: jis0208<<14 | 0x5A<<7 | 0x5A,\n\t64039 - 63785: jis0208<<14 | 0x5B<<7 | 0x18,\n\t64040 - 63785: jis0208<<14 | 0x5B<<7 | 0x1F,\n\t64041 - 63785: jis0208<<14 | 0x5B<<7 | 0x2F,\n\t64042 - 63785: jis0208<<14 | 0x5B<<7 | 0x3B,\n\t64043 - 63785: jis0208<<14 | 0x5B<<7 | 0x3C,\n\t64044 - 63785: jis0208<<14 | 0x5B<<7 | 0x3E,\n\t64045 - 63785: jis0208<<14 | 0x5B<<7 | 0x4B,\n}\n\nconst encode5Low, encode5High = 65281, 65510\n\nvar encode5 = [...]uint16{\n\t65281 - 65281: jis0208<<14 | 0x00<<7 | 0x09,\n\t65282 - 65281: jis0208<<14 | 0x5B<<7 | 0x5D,\n\t65283 - 65281: jis0208<<14 | 0x00<<7 | 0x53,\n\t65284 - 65281: jis0208<<14 | 0x00<<7 | 0x4F,\n\t65285 - 65281: jis0208<<14 | 0x00<<7 | 0x52,\n\t65286 - 65281: jis0208<<14 | 0x00<<7 | 0x54,\n\t65287 - 65281: jis0208<<14 | 0x5B<<7 | 0x5C,\n\t65288 - 65281: jis0208<<14 | 0x00<<7 | 0x29,\n\t65289 - 65281: jis0208<<14 | 0x00<<7 | 0x2A,\n\t65290 - 65281: jis0208<<14 | 0x00<<7 | 0x55,\n\t65291 - 65281: jis0208<<14 | 0x00<<7 | 0x3B,\n\t65292 - 65281: jis0208<<14 | 0x00<<7 | 0x03,\n\t65293 - 65281: jis0208<<14 | 0x00<<7 | 0x3C,\n\t65294 - 65281: jis0208<<14 | 0x00<<7 | 0x04,\n\t65295 - 65281: jis0208<<14 | 0x00<<7 | 0x1E,\n\t65296 - 65281: jis0208<<14 | 0x02<<7 | 0x0F,\n\t65297 - 65281: jis0208<<14 | 0x02<<7 | 0x10,\n\t65298 - 65281: jis0208<<14 | 0x02<<7 | 0x11,\n\t65299 - 65281: jis0208<<14 | 0x02<<7 | 0x12,\n\t65300 - 65281: jis0208<<14 | 0x02<<7 | 0x13,\n\t65301 - 65281: jis0208<<14 | 0x02<<7 | 0x14,\n\t65302 - 65281: jis0208<<14 | 0x02<<7 | 0x15,\n\t65303 - 65281: jis0208<<14 | 0x02<<7 | 0x16,\n\t65304 - 65281: jis0208<<14 | 0x02<<7 | 0x17,\n\t65305 - 65281: jis0208<<14 | 0x02<<7 | 0x18,\n\t65306 - 65281: jis0208<<14 | 0x00<<7 | 0x06,\n\t65307 - 65281: jis0208<<14 | 0x00<<7 | 0x07,\n\t65308 - 65281: jis0208<<14 | 0x00<<7 | 0x42,\n\t65309 - 65281: jis0208<<14 | 0x00<<7 | 0x40,\n\t65310 - 65281: jis0208<<14 | 0x00<<7 | 0x43,\n\t65311 - 65281: jis0208<<14 | 0x00<<7 | 0x08,\n\t65312 - 65281: jis0208<<14 | 0x00<<7 | 0x56,\n\t65313 - 65281: jis0208<<14 | 0x02<<7 | 0x20,\n\t65314 - 65281: jis0208<<14 | 0x02<<7 | 0x21,\n\t65315 - 65281: jis0208<<14 | 0x02<<7 | 0x22,\n\t65316 - 65281: jis0208<<14 | 0x02<<7 | 0x23,\n\t65317 - 65281: jis0208<<14 | 0x02<<7 | 0x24,\n\t65318 - 65281: jis0208<<14 | 0x02<<7 | 0x25,\n\t65319 - 65281: jis0208<<14 | 0x02<<7 | 0x26,\n\t65320 - 65281: jis0208<<14 | 0x02<<7 | 0x27,\n\t65321 - 65281: jis0208<<14 | 0x02<<7 | 0x28,\n\t65322 - 65281: jis0208<<14 | 0x02<<7 | 0x29,\n\t65323 - 65281: jis0208<<14 | 0x02<<7 | 0x2A,\n\t65324 - 65281: jis0208<<14 | 0x02<<7 | 0x2B,\n\t65325 - 65281: jis0208<<14 | 0x02<<7 | 0x2C,\n\t65326 - 65281: jis0208<<14 | 0x02<<7 | 0x2D,\n\t65327 - 65281: jis0208<<14 | 0x02<<7 | 0x2E,\n\t65328 - 65281: jis0208<<14 | 0x02<<7 | 0x2F,\n\t65329 - 65281: jis0208<<14 | 0x02<<7 | 0x30,\n\t65330 - 65281: jis0208<<14 | 0x02<<7 | 0x31,\n\t65331 - 65281: jis0208<<14 | 0x02<<7 | 0x32,\n\t65332 - 65281: jis0208<<14 | 0x02<<7 | 0x33,\n\t65333 - 65281: jis0208<<14 | 0x02<<7 | 0x34,\n\t65334 - 65281: jis0208<<14 | 0x02<<7 | 0x35,\n\t65335 - 65281: jis0208<<14 | 0x02<<7 | 0x36,\n\t65336 - 65281: jis0208<<14 | 0x02<<7 | 0x37,\n\t65337 - 65281: jis0208<<14 | 0x02<<7 | 0x38,\n\t65338 - 65281: jis0208<<14 | 0x02<<7 | 0x39,\n\t65339 - 65281: jis0208<<14 | 0x00<<7 | 0x2D,\n\t65340 - 65281: jis0208<<14 | 0x00<<7 | 0x1F,\n\t65341 - 65281: jis0208<<14 | 0x00<<7 | 0x2E,\n\t65342 - 65281: jis0208<<14 | 0x00<<7 | 0x0F,\n\t65343 - 65281: jis0208<<14 | 0x00<<7 | 0x11,\n\t65344 - 65281: jis0208<<14 | 0x00<<7 | 0x0D,\n\t65345 - 65281: jis0208<<14 | 0x02<<7 | 0x40,\n\t65346 - 65281: jis0208<<14 | 0x02<<7 | 0x41,\n\t65347 - 65281: jis0208<<14 | 0x02<<7 | 0x42,\n\t65348 - 65281: jis0208<<14 | 0x02<<7 | 0x43,\n\t65349 - 65281: jis0208<<14 | 0x02<<7 | 0x44,\n\t65350 - 65281: jis0208<<14 | 0x02<<7 | 0x45,\n\t65351 - 65281: jis0208<<14 | 0x02<<7 | 0x46,\n\t65352 - 65281: jis0208<<14 | 0x02<<7 | 0x47,\n\t65353 - 65281: jis0208<<14 | 0x02<<7 | 0x48,\n\t65354 - 65281: jis0208<<14 | 0x02<<7 | 0x49,\n\t65355 - 65281: jis0208<<14 | 0x02<<7 | 0x4A,\n\t65356 - 65281: jis0208<<14 | 0x02<<7 | 0x4B,\n\t65357 - 65281: jis0208<<14 | 0x02<<7 | 0x4C,\n\t65358 - 65281: jis0208<<14 | 0x02<<7 | 0x4D,\n\t65359 - 65281: jis0208<<14 | 0x02<<7 | 0x4E,\n\t65360 - 65281: jis0208<<14 | 0x02<<7 | 0x4F,\n\t65361 - 65281: jis0208<<14 | 0x02<<7 | 0x50,\n\t65362 - 65281: jis0208<<14 | 0x02<<7 | 0x51,\n\t65363 - 65281: jis0208<<14 | 0x02<<7 | 0x52,\n\t65364 - 65281: jis0208<<14 | 0x02<<7 | 0x53,\n\t65365 - 65281: jis0208<<14 | 0x02<<7 | 0x54,\n\t65366 - 65281: jis0208<<14 | 0x02<<7 | 0x55,\n\t65367 - 65281: jis0208<<14 | 0x02<<7 | 0x56,\n\t65368 - 65281: jis0208<<14 | 0x02<<7 | 0x57,\n\t65369 - 65281: jis0208<<14 | 0x02<<7 | 0x58,\n\t65370 - 65281: jis0208<<14 | 0x02<<7 | 0x59,\n\t65371 - 65281: jis0208<<14 | 0x00<<7 | 0x2F,\n\t65372 - 65281: jis0208<<14 | 0x00<<7 | 0x22,\n\t65373 - 65281: jis0208<<14 | 0x00<<7 | 0x30,\n\t65374 - 65281: jis0208<<14 | 0x00<<7 | 0x20,\n\t65504 - 65281: jis0208<<14 | 0x00<<7 | 0x50,\n\t65505 - 65281: jis0208<<14 | 0x00<<7 | 0x51,\n\t65506 - 65281: jis0208<<14 | 0x01<<7 | 0x2B,\n\t65507 - 65281: jis0208<<14 | 0x00<<7 | 0x10,\n\t65508 - 65281: jis0208<<14 | 0x5B<<7 | 0x5B,\n\t65509 - 65281: jis0208<<14 | 0x00<<7 | 0x4E,\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/korean/euckr.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage korean\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// All is a list of all defined encodings in this package.\nvar All = []encoding.Encoding{EUCKR}\n\n// EUCKR is the EUC-KR encoding, also known as Code Page 949.\nvar EUCKR encoding.Encoding = &eucKR\n\nvar eucKR = internal.Encoding{\n\t&internal.SimpleEncoding{eucKRDecoder{}, eucKREncoder{}},\n\t\"EUC-KR\",\n\tidentifier.EUCKR,\n}\n\nvar errInvalidEUCKR = errors.New(\"korean: invalid EUC-KR encoding\")\n\ntype eucKRDecoder struct{ transform.NopResetter }\n\nfunc (eucKRDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tswitch c0 := src[nSrc]; {\n\t\tcase c0 < utf8.RuneSelf:\n\t\t\tr, size = rune(c0), 1\n\n\t\tcase 0x81 <= c0 && c0 < 0xff:\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tif c0 < 0xc7 {\n\t\t\t\tr = 178 * rune(c0-0x81)\n\t\t\t\tswitch {\n\t\t\t\tcase 0x41 <= c1 && c1 < 0x5b:\n\t\t\t\t\tr += rune(c1) - (0x41 - 0*26)\n\t\t\t\tcase 0x61 <= c1 && c1 < 0x7b:\n\t\t\t\t\tr += rune(c1) - (0x61 - 1*26)\n\t\t\t\tcase 0x81 <= c1 && c1 < 0xff:\n\t\t\t\t\tr += rune(c1) - (0x81 - 2*26)\n\t\t\t\tdefault:\n\t\t\t\t\terr = errInvalidEUCKR\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t} else if 0xa1 <= c1 && c1 < 0xff {\n\t\t\t\tr = 178*(0xc7-0x81) + rune(c0-0xc7)*94 + rune(c1-0xa1)\n\t\t\t} else {\n\t\t\t\terr = errInvalidEUCKR\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tif int(r) < len(decode) {\n\t\t\t\tr = rune(decode[r])\n\t\t\t\tif r == 0 {\n\t\t\t\t\tr = '\\ufffd'\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tr = '\\ufffd'\n\t\t\t}\n\t\t\tsize = 2\n\n\t\tdefault:\n\t\t\terr = errInvalidEUCKR\n\t\t\tbreak loop\n\t\t}\n\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t}\n\tif atEOF && err == transform.ErrShortSrc {\n\t\terr = errInvalidEUCKR\n\t}\n\treturn nDst, nSrc, err\n}\n\ntype eucKREncoder struct{ transform.NopResetter }\n\nfunc (eucKREncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\n\t\t\tif nDst >= len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst] = uint8(r)\n\t\t\tnDst++\n\t\t\tcontinue\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// func init checks that the switch covers all tables.\n\t\t\tswitch {\n\t\t\tcase encode0Low <= r && r < encode0High:\n\t\t\t\tif r = rune(encode0[r-encode0Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode1Low <= r && r < encode1High:\n\t\t\t\tif r = rune(encode1[r-encode1Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode2Low <= r && r < encode2High:\n\t\t\t\tif r = rune(encode2[r-encode2Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode3Low <= r && r < encode3High:\n\t\t\t\tif r = rune(encode3[r-encode3Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode4Low <= r && r < encode4High:\n\t\t\t\tif r = rune(encode4[r-encode4Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode5Low <= r && r < encode5High:\n\t\t\t\tif r = rune(encode5[r-encode5Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode6Low <= r && r < encode6High:\n\t\t\t\tif r = rune(encode6[r-encode6Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\t}\n\t\t\terr = internal.ErrASCIIReplacement\n\t\t\tbreak\n\t\t}\n\n\twrite2:\n\t\tif nDst+2 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+0] = uint8(r >> 8)\n\t\tdst[nDst+1] = uint8(r)\n\t\tnDst += 2\n\t\tcontinue\n\t}\n\treturn nDst, nSrc, err\n}\n\nfunc init() {\n\t// Check that the hard-coded encode switch covers all tables.\n\tif numEncodeTables != 7 {\n\t\tpanic(\"bad numEncodeTables\")\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/korean/maketables.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\n// This program generates tables.go:\n//\tgo run maketables.go | gofmt > tables.go\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"sort\"\n\t\"strings\"\n)\n\nfunc main() {\n\tfmt.Printf(\"// generated by go run maketables.go; DO NOT EDIT\\n\\n\")\n\tfmt.Printf(\"// Package korean provides Korean encodings such as EUC-KR.\\n\")\n\tfmt.Printf(`package korean // import \"golang.org/x/text/encoding/korean\"` + \"\\n\\n\")\n\n\tres, err := http.Get(\"http://encoding.spec.whatwg.org/index-euc-kr.txt\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Get: %v\", err)\n\t}\n\tdefer res.Body.Close()\n\n\tmapping := [65536]uint16{}\n\treverse := [65536]uint16{}\n\n\tscanner := bufio.NewScanner(res.Body)\n\tfor scanner.Scan() {\n\t\ts := strings.TrimSpace(scanner.Text())\n\t\tif s == \"\" || s[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\tx, y := uint16(0), uint16(0)\n\t\tif _, err := fmt.Sscanf(s, \"%d 0x%x\", &x, &y); err != nil {\n\t\t\tlog.Fatalf(\"could not parse %q\", s)\n\t\t}\n\t\tif x < 0 || 178*(0xc7-0x81)+(0xfe-0xc7)*94+(0xff-0xa1) <= x {\n\t\t\tlog.Fatalf(\"EUC-KR code %d is out of range\", x)\n\t\t}\n\t\tmapping[x] = y\n\t\tif reverse[y] == 0 {\n\t\t\tc0, c1 := uint16(0), uint16(0)\n\t\t\tif x < 178*(0xc7-0x81) {\n\t\t\t\tc0 = uint16(x/178) + 0x81\n\t\t\t\tc1 = uint16(x % 178)\n\t\t\t\tswitch {\n\t\t\t\tcase c1 < 1*26:\n\t\t\t\t\tc1 += 0x41\n\t\t\t\tcase c1 < 2*26:\n\t\t\t\t\tc1 += 0x47\n\t\t\t\tdefault:\n\t\t\t\t\tc1 += 0x4d\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tx -= 178 * (0xc7 - 0x81)\n\t\t\t\tc0 = uint16(x/94) + 0xc7\n\t\t\t\tc1 = uint16(x%94) + 0xa1\n\t\t\t}\n\t\t\treverse[y] = c0<<8 | c1\n\t\t}\n\t}\n\tif err := scanner.Err(); err != nil {\n\t\tlog.Fatalf(\"scanner error: %v\", err)\n\t}\n\n\tfmt.Printf(\"// decode is the decoding table from EUC-KR code to Unicode.\\n\")\n\tfmt.Printf(\"// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt\\n\")\n\tfmt.Printf(\"var decode = [...]uint16{\\n\")\n\tfor i, v := range mapping {\n\t\tif v != 0 {\n\t\t\tfmt.Printf(\"\\t%d: 0x%04X,\\n\", i, v)\n\t\t}\n\t}\n\tfmt.Printf(\"}\\n\\n\")\n\n\t// Any run of at least separation continuous zero entries in the reverse map will\n\t// be a separate encode table.\n\tconst separation = 1024\n\n\tintervals := []interval(nil)\n\tlow, high := -1, -1\n\tfor i, v := range reverse {\n\t\tif v == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tif low < 0 {\n\t\t\tlow = i\n\t\t} else if i-high >= separation {\n\t\t\tif high >= 0 {\n\t\t\t\tintervals = append(intervals, interval{low, high})\n\t\t\t}\n\t\t\tlow = i\n\t\t}\n\t\thigh = i + 1\n\t}\n\tif high >= 0 {\n\t\tintervals = append(intervals, interval{low, high})\n\t}\n\tsort.Sort(byDecreasingLength(intervals))\n\n\tfmt.Printf(\"const numEncodeTables = %d\\n\\n\", len(intervals))\n\tfmt.Printf(\"// encodeX are the encoding tables from Unicode to EUC-KR code,\\n\")\n\tfmt.Printf(\"// sorted by decreasing length.\\n\")\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"// encode%d: %5d entries for runes in [%5d, %5d).\\n\", i, v.len(), v.low, v.high)\n\t}\n\tfmt.Printf(\"\\n\")\n\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"const encode%dLow, encode%dHigh = %d, %d\\n\\n\", i, i, v.low, v.high)\n\t\tfmt.Printf(\"var encode%d = [...]uint16{\\n\", i)\n\t\tfor j := v.low; j < v.high; j++ {\n\t\t\tx := reverse[j]\n\t\t\tif x == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfmt.Printf(\"\\t%d-%d: 0x%04X,\\n\", j, v.low, x)\n\t\t}\n\t\tfmt.Printf(\"}\\n\\n\")\n\t}\n}\n\n// interval is a half-open interval [low, high).\ntype interval struct {\n\tlow, high int\n}\n\nfunc (i interval) len() int { return i.high - i.low }\n\n// byDecreasingLength sorts intervals by decreasing length.\ntype byDecreasingLength []interval\n\nfunc (b byDecreasingLength) Len() int           { return len(b) }\nfunc (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }\nfunc (b byDecreasingLength) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/korean/tables.go",
    "content": "// generated by go run maketables.go; DO NOT EDIT\n\n// Package korean provides Korean encodings such as EUC-KR.\npackage korean // import \"golang.org/x/text/encoding/korean\"\n\n// decode is the decoding table from EUC-KR code to Unicode.\n// It is defined at http://encoding.spec.whatwg.org/index-euc-kr.txt\nvar decode = [...]uint16{\n\t0:     0xAC02,\n\t1:     0xAC03,\n\t2:     0xAC05,\n\t3:     0xAC06,\n\t4:     0xAC0B,\n\t5:     0xAC0C,\n\t6:     0xAC0D,\n\t7:     0xAC0E,\n\t8:     0xAC0F,\n\t9:     0xAC18,\n\t10:    0xAC1E,\n\t11:    0xAC1F,\n\t12:    0xAC21,\n\t13:    0xAC22,\n\t14:    0xAC23,\n\t15:    0xAC25,\n\t16:    0xAC26,\n\t17:    0xAC27,\n\t18:    0xAC28,\n\t19:    0xAC29,\n\t20:    0xAC2A,\n\t21:    0xAC2B,\n\t22:    0xAC2E,\n\t23:    0xAC32,\n\t24:    0xAC33,\n\t25:    0xAC34,\n\t26:    0xAC35,\n\t27:    0xAC36,\n\t28:    0xAC37,\n\t29:    0xAC3A,\n\t30:    0xAC3B,\n\t31:    0xAC3D,\n\t32:    0xAC3E,\n\t33:    0xAC3F,\n\t34:    0xAC41,\n\t35:    0xAC42,\n\t36:    0xAC43,\n\t37:    0xAC44,\n\t38:    0xAC45,\n\t39:    0xAC46,\n\t40:    0xAC47,\n\t41:    0xAC48,\n\t42:    0xAC49,\n\t43:    0xAC4A,\n\t44:    0xAC4C,\n\t45:    0xAC4E,\n\t46:    0xAC4F,\n\t47:    0xAC50,\n\t48:    0xAC51,\n\t49:    0xAC52,\n\t50:    0xAC53,\n\t51:    0xAC55,\n\t52:    0xAC56,\n\t53:    0xAC57,\n\t54:    0xAC59,\n\t55:    0xAC5A,\n\t56:    0xAC5B,\n\t57:    0xAC5D,\n\t58:    0xAC5E,\n\t59:    0xAC5F,\n\t60:    0xAC60,\n\t61:    0xAC61,\n\t62:    0xAC62,\n\t63:    0xAC63,\n\t64:    0xAC64,\n\t65:    0xAC65,\n\t66:    0xAC66,\n\t67:    0xAC67,\n\t68:    0xAC68,\n\t69:    0xAC69,\n\t70:    0xAC6A,\n\t71:    0xAC6B,\n\t72:    0xAC6C,\n\t73:    0xAC6D,\n\t74:    0xAC6E,\n\t75:    0xAC6F,\n\t76:    0xAC72,\n\t77:    0xAC73,\n\t78:    0xAC75,\n\t79:    0xAC76,\n\t80:    0xAC79,\n\t81:    0xAC7B,\n\t82:    0xAC7C,\n\t83:    0xAC7D,\n\t84:    0xAC7E,\n\t85:    0xAC7F,\n\t86:    0xAC82,\n\t87:    0xAC87,\n\t88:    0xAC88,\n\t89:    0xAC8D,\n\t90:    0xAC8E,\n\t91:    0xAC8F,\n\t92:    0xAC91,\n\t93:    0xAC92,\n\t94:    0xAC93,\n\t95:    0xAC95,\n\t96:    0xAC96,\n\t97:    0xAC97,\n\t98:    0xAC98,\n\t99:    0xAC99,\n\t100:   0xAC9A,\n\t101:   0xAC9B,\n\t102:   0xAC9E,\n\t103:   0xACA2,\n\t104:   0xACA3,\n\t105:   0xACA4,\n\t106:   0xACA5,\n\t107:   0xACA6,\n\t108:   0xACA7,\n\t109:   0xACAB,\n\t110:   0xACAD,\n\t111:   0xACAE,\n\t112:   0xACB1,\n\t113:   0xACB2,\n\t114:   0xACB3,\n\t115:   0xACB4,\n\t116:   0xACB5,\n\t117:   0xACB6,\n\t118:   0xACB7,\n\t119:   0xACBA,\n\t120:   0xACBE,\n\t121:   0xACBF,\n\t122:   0xACC0,\n\t123:   0xACC2,\n\t124:   0xACC3,\n\t125:   0xACC5,\n\t126:   0xACC6,\n\t127:   0xACC7,\n\t128:   0xACC9,\n\t129:   0xACCA,\n\t130:   0xACCB,\n\t131:   0xACCD,\n\t132:   0xACCE,\n\t133:   0xACCF,\n\t134:   0xACD0,\n\t135:   0xACD1,\n\t136:   0xACD2,\n\t137:   0xACD3,\n\t138:   0xACD4,\n\t139:   0xACD6,\n\t140:   0xACD8,\n\t141:   0xACD9,\n\t142:   0xACDA,\n\t143:   0xACDB,\n\t144:   0xACDC,\n\t145:   0xACDD,\n\t146:   0xACDE,\n\t147:   0xACDF,\n\t148:   0xACE2,\n\t149:   0xACE3,\n\t150:   0xACE5,\n\t151:   0xACE6,\n\t152:   0xACE9,\n\t153:   0xACEB,\n\t154:   0xACED,\n\t155:   0xACEE,\n\t156:   0xACF2,\n\t157:   0xACF4,\n\t158:   0xACF7,\n\t159:   0xACF8,\n\t160:   0xACF9,\n\t161:   0xACFA,\n\t162:   0xACFB,\n\t163:   0xACFE,\n\t164:   0xACFF,\n\t165:   0xAD01,\n\t166:   0xAD02,\n\t167:   0xAD03,\n\t168:   0xAD05,\n\t169:   0xAD07,\n\t170:   0xAD08,\n\t171:   0xAD09,\n\t172:   0xAD0A,\n\t173:   0xAD0B,\n\t174:   0xAD0E,\n\t175:   0xAD10,\n\t176:   0xAD12,\n\t177:   0xAD13,\n\t178:   0xAD14,\n\t179:   0xAD15,\n\t180:   0xAD16,\n\t181:   0xAD17,\n\t182:   0xAD19,\n\t183:   0xAD1A,\n\t184:   0xAD1B,\n\t185:   0xAD1D,\n\t186:   0xAD1E,\n\t187:   0xAD1F,\n\t188:   0xAD21,\n\t189:   0xAD22,\n\t190:   0xAD23,\n\t191:   0xAD24,\n\t192:   0xAD25,\n\t193:   0xAD26,\n\t194:   0xAD27,\n\t195:   0xAD28,\n\t196:   0xAD2A,\n\t197:   0xAD2B,\n\t198:   0xAD2E,\n\t199:   0xAD2F,\n\t200:   0xAD30,\n\t201:   0xAD31,\n\t202:   0xAD32,\n\t203:   0xAD33,\n\t204:   0xAD36,\n\t205:   0xAD37,\n\t206:   0xAD39,\n\t207:   0xAD3A,\n\t208:   0xAD3B,\n\t209:   0xAD3D,\n\t210:   0xAD3E,\n\t211:   0xAD3F,\n\t212:   0xAD40,\n\t213:   0xAD41,\n\t214:   0xAD42,\n\t215:   0xAD43,\n\t216:   0xAD46,\n\t217:   0xAD48,\n\t218:   0xAD4A,\n\t219:   0xAD4B,\n\t220:   0xAD4C,\n\t221:   0xAD4D,\n\t222:   0xAD4E,\n\t223:   0xAD4F,\n\t224:   0xAD51,\n\t225:   0xAD52,\n\t226:   0xAD53,\n\t227:   0xAD55,\n\t228:   0xAD56,\n\t229:   0xAD57,\n\t230:   0xAD59,\n\t231:   0xAD5A,\n\t232:   0xAD5B,\n\t233:   0xAD5C,\n\t234:   0xAD5D,\n\t235:   0xAD5E,\n\t236:   0xAD5F,\n\t237:   0xAD60,\n\t238:   0xAD62,\n\t239:   0xAD64,\n\t240:   0xAD65,\n\t241:   0xAD66,\n\t242:   0xAD67,\n\t243:   0xAD68,\n\t244:   0xAD69,\n\t245:   0xAD6A,\n\t246:   0xAD6B,\n\t247:   0xAD6E,\n\t248:   0xAD6F,\n\t249:   0xAD71,\n\t250:   0xAD72,\n\t251:   0xAD77,\n\t252:   0xAD78,\n\t253:   0xAD79,\n\t254:   0xAD7A,\n\t255:   0xAD7E,\n\t256:   0xAD80,\n\t257:   0xAD83,\n\t258:   0xAD84,\n\t259:   0xAD85,\n\t260:   0xAD86,\n\t261:   0xAD87,\n\t262:   0xAD8A,\n\t263:   0xAD8B,\n\t264:   0xAD8D,\n\t265:   0xAD8E,\n\t266:   0xAD8F,\n\t267:   0xAD91,\n\t268:   0xAD92,\n\t269:   0xAD93,\n\t270:   0xAD94,\n\t271:   0xAD95,\n\t272:   0xAD96,\n\t273:   0xAD97,\n\t274:   0xAD98,\n\t275:   0xAD99,\n\t276:   0xAD9A,\n\t277:   0xAD9B,\n\t278:   0xAD9E,\n\t279:   0xAD9F,\n\t280:   0xADA0,\n\t281:   0xADA1,\n\t282:   0xADA2,\n\t283:   0xADA3,\n\t284:   0xADA5,\n\t285:   0xADA6,\n\t286:   0xADA7,\n\t287:   0xADA8,\n\t288:   0xADA9,\n\t289:   0xADAA,\n\t290:   0xADAB,\n\t291:   0xADAC,\n\t292:   0xADAD,\n\t293:   0xADAE,\n\t294:   0xADAF,\n\t295:   0xADB0,\n\t296:   0xADB1,\n\t297:   0xADB2,\n\t298:   0xADB3,\n\t299:   0xADB4,\n\t300:   0xADB5,\n\t301:   0xADB6,\n\t302:   0xADB8,\n\t303:   0xADB9,\n\t304:   0xADBA,\n\t305:   0xADBB,\n\t306:   0xADBC,\n\t307:   0xADBD,\n\t308:   0xADBE,\n\t309:   0xADBF,\n\t310:   0xADC2,\n\t311:   0xADC3,\n\t312:   0xADC5,\n\t313:   0xADC6,\n\t314:   0xADC7,\n\t315:   0xADC9,\n\t316:   0xADCA,\n\t317:   0xADCB,\n\t318:   0xADCC,\n\t319:   0xADCD,\n\t320:   0xADCE,\n\t321:   0xADCF,\n\t322:   0xADD2,\n\t323:   0xADD4,\n\t324:   0xADD5,\n\t325:   0xADD6,\n\t326:   0xADD7,\n\t327:   0xADD8,\n\t328:   0xADD9,\n\t329:   0xADDA,\n\t330:   0xADDB,\n\t331:   0xADDD,\n\t332:   0xADDE,\n\t333:   0xADDF,\n\t334:   0xADE1,\n\t335:   0xADE2,\n\t336:   0xADE3,\n\t337:   0xADE5,\n\t338:   0xADE6,\n\t339:   0xADE7,\n\t340:   0xADE8,\n\t341:   0xADE9,\n\t342:   0xADEA,\n\t343:   0xADEB,\n\t344:   0xADEC,\n\t345:   0xADED,\n\t346:   0xADEE,\n\t347:   0xADEF,\n\t348:   0xADF0,\n\t349:   0xADF1,\n\t350:   0xADF2,\n\t351:   0xADF3,\n\t352:   0xADF4,\n\t353:   0xADF5,\n\t354:   0xADF6,\n\t355:   0xADF7,\n\t356:   0xADFA,\n\t357:   0xADFB,\n\t358:   0xADFD,\n\t359:   0xADFE,\n\t360:   0xAE02,\n\t361:   0xAE03,\n\t362:   0xAE04,\n\t363:   0xAE05,\n\t364:   0xAE06,\n\t365:   0xAE07,\n\t366:   0xAE0A,\n\t367:   0xAE0C,\n\t368:   0xAE0E,\n\t369:   0xAE0F,\n\t370:   0xAE10,\n\t371:   0xAE11,\n\t372:   0xAE12,\n\t373:   0xAE13,\n\t374:   0xAE15,\n\t375:   0xAE16,\n\t376:   0xAE17,\n\t377:   0xAE18,\n\t378:   0xAE19,\n\t379:   0xAE1A,\n\t380:   0xAE1B,\n\t381:   0xAE1C,\n\t382:   0xAE1D,\n\t383:   0xAE1E,\n\t384:   0xAE1F,\n\t385:   0xAE20,\n\t386:   0xAE21,\n\t387:   0xAE22,\n\t388:   0xAE23,\n\t389:   0xAE24,\n\t390:   0xAE25,\n\t391:   0xAE26,\n\t392:   0xAE27,\n\t393:   0xAE28,\n\t394:   0xAE29,\n\t395:   0xAE2A,\n\t396:   0xAE2B,\n\t397:   0xAE2C,\n\t398:   0xAE2D,\n\t399:   0xAE2E,\n\t400:   0xAE2F,\n\t401:   0xAE32,\n\t402:   0xAE33,\n\t403:   0xAE35,\n\t404:   0xAE36,\n\t405:   0xAE39,\n\t406:   0xAE3B,\n\t407:   0xAE3C,\n\t408:   0xAE3D,\n\t409:   0xAE3E,\n\t410:   0xAE3F,\n\t411:   0xAE42,\n\t412:   0xAE44,\n\t413:   0xAE47,\n\t414:   0xAE48,\n\t415:   0xAE49,\n\t416:   0xAE4B,\n\t417:   0xAE4F,\n\t418:   0xAE51,\n\t419:   0xAE52,\n\t420:   0xAE53,\n\t421:   0xAE55,\n\t422:   0xAE57,\n\t423:   0xAE58,\n\t424:   0xAE59,\n\t425:   0xAE5A,\n\t426:   0xAE5B,\n\t427:   0xAE5E,\n\t428:   0xAE62,\n\t429:   0xAE63,\n\t430:   0xAE64,\n\t431:   0xAE66,\n\t432:   0xAE67,\n\t433:   0xAE6A,\n\t434:   0xAE6B,\n\t435:   0xAE6D,\n\t436:   0xAE6E,\n\t437:   0xAE6F,\n\t438:   0xAE71,\n\t439:   0xAE72,\n\t440:   0xAE73,\n\t441:   0xAE74,\n\t442:   0xAE75,\n\t443:   0xAE76,\n\t444:   0xAE77,\n\t445:   0xAE7A,\n\t446:   0xAE7E,\n\t447:   0xAE7F,\n\t448:   0xAE80,\n\t449:   0xAE81,\n\t450:   0xAE82,\n\t451:   0xAE83,\n\t452:   0xAE86,\n\t453:   0xAE87,\n\t454:   0xAE88,\n\t455:   0xAE89,\n\t456:   0xAE8A,\n\t457:   0xAE8B,\n\t458:   0xAE8D,\n\t459:   0xAE8E,\n\t460:   0xAE8F,\n\t461:   0xAE90,\n\t462:   0xAE91,\n\t463:   0xAE92,\n\t464:   0xAE93,\n\t465:   0xAE94,\n\t466:   0xAE95,\n\t467:   0xAE96,\n\t468:   0xAE97,\n\t469:   0xAE98,\n\t470:   0xAE99,\n\t471:   0xAE9A,\n\t472:   0xAE9B,\n\t473:   0xAE9C,\n\t474:   0xAE9D,\n\t475:   0xAE9E,\n\t476:   0xAE9F,\n\t477:   0xAEA0,\n\t478:   0xAEA1,\n\t479:   0xAEA2,\n\t480:   0xAEA3,\n\t481:   0xAEA4,\n\t482:   0xAEA5,\n\t483:   0xAEA6,\n\t484:   0xAEA7,\n\t485:   0xAEA8,\n\t486:   0xAEA9,\n\t487:   0xAEAA,\n\t488:   0xAEAB,\n\t489:   0xAEAC,\n\t490:   0xAEAD,\n\t491:   0xAEAE,\n\t492:   0xAEAF,\n\t493:   0xAEB0,\n\t494:   0xAEB1,\n\t495:   0xAEB2,\n\t496:   0xAEB3,\n\t497:   0xAEB4,\n\t498:   0xAEB5,\n\t499:   0xAEB6,\n\t500:   0xAEB7,\n\t501:   0xAEB8,\n\t502:   0xAEB9,\n\t503:   0xAEBA,\n\t504:   0xAEBB,\n\t505:   0xAEBF,\n\t506:   0xAEC1,\n\t507:   0xAEC2,\n\t508:   0xAEC3,\n\t509:   0xAEC5,\n\t510:   0xAEC6,\n\t511:   0xAEC7,\n\t512:   0xAEC8,\n\t513:   0xAEC9,\n\t514:   0xAECA,\n\t515:   0xAECB,\n\t516:   0xAECE,\n\t517:   0xAED2,\n\t518:   0xAED3,\n\t519:   0xAED4,\n\t520:   0xAED5,\n\t521:   0xAED6,\n\t522:   0xAED7,\n\t523:   0xAEDA,\n\t524:   0xAEDB,\n\t525:   0xAEDD,\n\t526:   0xAEDE,\n\t527:   0xAEDF,\n\t528:   0xAEE0,\n\t529:   0xAEE1,\n\t530:   0xAEE2,\n\t531:   0xAEE3,\n\t532:   0xAEE4,\n\t533:   0xAEE5,\n\t534:   0xAEE6,\n\t535:   0xAEE7,\n\t536:   0xAEE9,\n\t537:   0xAEEA,\n\t538:   0xAEEC,\n\t539:   0xAEEE,\n\t540:   0xAEEF,\n\t541:   0xAEF0,\n\t542:   0xAEF1,\n\t543:   0xAEF2,\n\t544:   0xAEF3,\n\t545:   0xAEF5,\n\t546:   0xAEF6,\n\t547:   0xAEF7,\n\t548:   0xAEF9,\n\t549:   0xAEFA,\n\t550:   0xAEFB,\n\t551:   0xAEFD,\n\t552:   0xAEFE,\n\t553:   0xAEFF,\n\t554:   0xAF00,\n\t555:   0xAF01,\n\t556:   0xAF02,\n\t557:   0xAF03,\n\t558:   0xAF04,\n\t559:   0xAF05,\n\t560:   0xAF06,\n\t561:   0xAF09,\n\t562:   0xAF0A,\n\t563:   0xAF0B,\n\t564:   0xAF0C,\n\t565:   0xAF0E,\n\t566:   0xAF0F,\n\t567:   0xAF11,\n\t568:   0xAF12,\n\t569:   0xAF13,\n\t570:   0xAF14,\n\t571:   0xAF15,\n\t572:   0xAF16,\n\t573:   0xAF17,\n\t574:   0xAF18,\n\t575:   0xAF19,\n\t576:   0xAF1A,\n\t577:   0xAF1B,\n\t578:   0xAF1C,\n\t579:   0xAF1D,\n\t580:   0xAF1E,\n\t581:   0xAF1F,\n\t582:   0xAF20,\n\t583:   0xAF21,\n\t584:   0xAF22,\n\t585:   0xAF23,\n\t586:   0xAF24,\n\t587:   0xAF25,\n\t588:   0xAF26,\n\t589:   0xAF27,\n\t590:   0xAF28,\n\t591:   0xAF29,\n\t592:   0xAF2A,\n\t593:   0xAF2B,\n\t594:   0xAF2E,\n\t595:   0xAF2F,\n\t596:   0xAF31,\n\t597:   0xAF33,\n\t598:   0xAF35,\n\t599:   0xAF36,\n\t600:   0xAF37,\n\t601:   0xAF38,\n\t602:   0xAF39,\n\t603:   0xAF3A,\n\t604:   0xAF3B,\n\t605:   0xAF3E,\n\t606:   0xAF40,\n\t607:   0xAF44,\n\t608:   0xAF45,\n\t609:   0xAF46,\n\t610:   0xAF47,\n\t611:   0xAF4A,\n\t612:   0xAF4B,\n\t613:   0xAF4C,\n\t614:   0xAF4D,\n\t615:   0xAF4E,\n\t616:   0xAF4F,\n\t617:   0xAF51,\n\t618:   0xAF52,\n\t619:   0xAF53,\n\t620:   0xAF54,\n\t621:   0xAF55,\n\t622:   0xAF56,\n\t623:   0xAF57,\n\t624:   0xAF58,\n\t625:   0xAF59,\n\t626:   0xAF5A,\n\t627:   0xAF5B,\n\t628:   0xAF5E,\n\t629:   0xAF5F,\n\t630:   0xAF60,\n\t631:   0xAF61,\n\t632:   0xAF62,\n\t633:   0xAF63,\n\t634:   0xAF66,\n\t635:   0xAF67,\n\t636:   0xAF68,\n\t637:   0xAF69,\n\t638:   0xAF6A,\n\t639:   0xAF6B,\n\t640:   0xAF6C,\n\t641:   0xAF6D,\n\t642:   0xAF6E,\n\t643:   0xAF6F,\n\t644:   0xAF70,\n\t645:   0xAF71,\n\t646:   0xAF72,\n\t647:   0xAF73,\n\t648:   0xAF74,\n\t649:   0xAF75,\n\t650:   0xAF76,\n\t651:   0xAF77,\n\t652:   0xAF78,\n\t653:   0xAF7A,\n\t654:   0xAF7B,\n\t655:   0xAF7C,\n\t656:   0xAF7D,\n\t657:   0xAF7E,\n\t658:   0xAF7F,\n\t659:   0xAF81,\n\t660:   0xAF82,\n\t661:   0xAF83,\n\t662:   0xAF85,\n\t663:   0xAF86,\n\t664:   0xAF87,\n\t665:   0xAF89,\n\t666:   0xAF8A,\n\t667:   0xAF8B,\n\t668:   0xAF8C,\n\t669:   0xAF8D,\n\t670:   0xAF8E,\n\t671:   0xAF8F,\n\t672:   0xAF92,\n\t673:   0xAF93,\n\t674:   0xAF94,\n\t675:   0xAF96,\n\t676:   0xAF97,\n\t677:   0xAF98,\n\t678:   0xAF99,\n\t679:   0xAF9A,\n\t680:   0xAF9B,\n\t681:   0xAF9D,\n\t682:   0xAF9E,\n\t683:   0xAF9F,\n\t684:   0xAFA0,\n\t685:   0xAFA1,\n\t686:   0xAFA2,\n\t687:   0xAFA3,\n\t688:   0xAFA4,\n\t689:   0xAFA5,\n\t690:   0xAFA6,\n\t691:   0xAFA7,\n\t692:   0xAFA8,\n\t693:   0xAFA9,\n\t694:   0xAFAA,\n\t695:   0xAFAB,\n\t696:   0xAFAC,\n\t697:   0xAFAD,\n\t698:   0xAFAE,\n\t699:   0xAFAF,\n\t700:   0xAFB0,\n\t701:   0xAFB1,\n\t702:   0xAFB2,\n\t703:   0xAFB3,\n\t704:   0xAFB4,\n\t705:   0xAFB5,\n\t706:   0xAFB6,\n\t707:   0xAFB7,\n\t708:   0xAFBA,\n\t709:   0xAFBB,\n\t710:   0xAFBD,\n\t711:   0xAFBE,\n\t712:   0xAFBF,\n\t713:   0xAFC1,\n\t714:   0xAFC2,\n\t715:   0xAFC3,\n\t716:   0xAFC4,\n\t717:   0xAFC5,\n\t718:   0xAFC6,\n\t719:   0xAFCA,\n\t720:   0xAFCC,\n\t721:   0xAFCF,\n\t722:   0xAFD0,\n\t723:   0xAFD1,\n\t724:   0xAFD2,\n\t725:   0xAFD3,\n\t726:   0xAFD5,\n\t727:   0xAFD6,\n\t728:   0xAFD7,\n\t729:   0xAFD8,\n\t730:   0xAFD9,\n\t731:   0xAFDA,\n\t732:   0xAFDB,\n\t733:   0xAFDD,\n\t734:   0xAFDE,\n\t735:   0xAFDF,\n\t736:   0xAFE0,\n\t737:   0xAFE1,\n\t738:   0xAFE2,\n\t739:   0xAFE3,\n\t740:   0xAFE4,\n\t741:   0xAFE5,\n\t742:   0xAFE6,\n\t743:   0xAFE7,\n\t744:   0xAFEA,\n\t745:   0xAFEB,\n\t746:   0xAFEC,\n\t747:   0xAFED,\n\t748:   0xAFEE,\n\t749:   0xAFEF,\n\t750:   0xAFF2,\n\t751:   0xAFF3,\n\t752:   0xAFF5,\n\t753:   0xAFF6,\n\t754:   0xAFF7,\n\t755:   0xAFF9,\n\t756:   0xAFFA,\n\t757:   0xAFFB,\n\t758:   0xAFFC,\n\t759:   0xAFFD,\n\t760:   0xAFFE,\n\t761:   0xAFFF,\n\t762:   0xB002,\n\t763:   0xB003,\n\t764:   0xB005,\n\t765:   0xB006,\n\t766:   0xB007,\n\t767:   0xB008,\n\t768:   0xB009,\n\t769:   0xB00A,\n\t770:   0xB00B,\n\t771:   0xB00D,\n\t772:   0xB00E,\n\t773:   0xB00F,\n\t774:   0xB011,\n\t775:   0xB012,\n\t776:   0xB013,\n\t777:   0xB015,\n\t778:   0xB016,\n\t779:   0xB017,\n\t780:   0xB018,\n\t781:   0xB019,\n\t782:   0xB01A,\n\t783:   0xB01B,\n\t784:   0xB01E,\n\t785:   0xB01F,\n\t786:   0xB020,\n\t787:   0xB021,\n\t788:   0xB022,\n\t789:   0xB023,\n\t790:   0xB024,\n\t791:   0xB025,\n\t792:   0xB026,\n\t793:   0xB027,\n\t794:   0xB029,\n\t795:   0xB02A,\n\t796:   0xB02B,\n\t797:   0xB02C,\n\t798:   0xB02D,\n\t799:   0xB02E,\n\t800:   0xB02F,\n\t801:   0xB030,\n\t802:   0xB031,\n\t803:   0xB032,\n\t804:   0xB033,\n\t805:   0xB034,\n\t806:   0xB035,\n\t807:   0xB036,\n\t808:   0xB037,\n\t809:   0xB038,\n\t810:   0xB039,\n\t811:   0xB03A,\n\t812:   0xB03B,\n\t813:   0xB03C,\n\t814:   0xB03D,\n\t815:   0xB03E,\n\t816:   0xB03F,\n\t817:   0xB040,\n\t818:   0xB041,\n\t819:   0xB042,\n\t820:   0xB043,\n\t821:   0xB046,\n\t822:   0xB047,\n\t823:   0xB049,\n\t824:   0xB04B,\n\t825:   0xB04D,\n\t826:   0xB04F,\n\t827:   0xB050,\n\t828:   0xB051,\n\t829:   0xB052,\n\t830:   0xB056,\n\t831:   0xB058,\n\t832:   0xB05A,\n\t833:   0xB05B,\n\t834:   0xB05C,\n\t835:   0xB05E,\n\t836:   0xB05F,\n\t837:   0xB060,\n\t838:   0xB061,\n\t839:   0xB062,\n\t840:   0xB063,\n\t841:   0xB064,\n\t842:   0xB065,\n\t843:   0xB066,\n\t844:   0xB067,\n\t845:   0xB068,\n\t846:   0xB069,\n\t847:   0xB06A,\n\t848:   0xB06B,\n\t849:   0xB06C,\n\t850:   0xB06D,\n\t851:   0xB06E,\n\t852:   0xB06F,\n\t853:   0xB070,\n\t854:   0xB071,\n\t855:   0xB072,\n\t856:   0xB073,\n\t857:   0xB074,\n\t858:   0xB075,\n\t859:   0xB076,\n\t860:   0xB077,\n\t861:   0xB078,\n\t862:   0xB079,\n\t863:   0xB07A,\n\t864:   0xB07B,\n\t865:   0xB07E,\n\t866:   0xB07F,\n\t867:   0xB081,\n\t868:   0xB082,\n\t869:   0xB083,\n\t870:   0xB085,\n\t871:   0xB086,\n\t872:   0xB087,\n\t873:   0xB088,\n\t874:   0xB089,\n\t875:   0xB08A,\n\t876:   0xB08B,\n\t877:   0xB08E,\n\t878:   0xB090,\n\t879:   0xB092,\n\t880:   0xB093,\n\t881:   0xB094,\n\t882:   0xB095,\n\t883:   0xB096,\n\t884:   0xB097,\n\t885:   0xB09B,\n\t886:   0xB09D,\n\t887:   0xB09E,\n\t888:   0xB0A3,\n\t889:   0xB0A4,\n\t890:   0xB0A5,\n\t891:   0xB0A6,\n\t892:   0xB0A7,\n\t893:   0xB0AA,\n\t894:   0xB0B0,\n\t895:   0xB0B2,\n\t896:   0xB0B6,\n\t897:   0xB0B7,\n\t898:   0xB0B9,\n\t899:   0xB0BA,\n\t900:   0xB0BB,\n\t901:   0xB0BD,\n\t902:   0xB0BE,\n\t903:   0xB0BF,\n\t904:   0xB0C0,\n\t905:   0xB0C1,\n\t906:   0xB0C2,\n\t907:   0xB0C3,\n\t908:   0xB0C6,\n\t909:   0xB0CA,\n\t910:   0xB0CB,\n\t911:   0xB0CC,\n\t912:   0xB0CD,\n\t913:   0xB0CE,\n\t914:   0xB0CF,\n\t915:   0xB0D2,\n\t916:   0xB0D3,\n\t917:   0xB0D5,\n\t918:   0xB0D6,\n\t919:   0xB0D7,\n\t920:   0xB0D9,\n\t921:   0xB0DA,\n\t922:   0xB0DB,\n\t923:   0xB0DC,\n\t924:   0xB0DD,\n\t925:   0xB0DE,\n\t926:   0xB0DF,\n\t927:   0xB0E1,\n\t928:   0xB0E2,\n\t929:   0xB0E3,\n\t930:   0xB0E4,\n\t931:   0xB0E6,\n\t932:   0xB0E7,\n\t933:   0xB0E8,\n\t934:   0xB0E9,\n\t935:   0xB0EA,\n\t936:   0xB0EB,\n\t937:   0xB0EC,\n\t938:   0xB0ED,\n\t939:   0xB0EE,\n\t940:   0xB0EF,\n\t941:   0xB0F0,\n\t942:   0xB0F1,\n\t943:   0xB0F2,\n\t944:   0xB0F3,\n\t945:   0xB0F4,\n\t946:   0xB0F5,\n\t947:   0xB0F6,\n\t948:   0xB0F7,\n\t949:   0xB0F8,\n\t950:   0xB0F9,\n\t951:   0xB0FA,\n\t952:   0xB0FB,\n\t953:   0xB0FC,\n\t954:   0xB0FD,\n\t955:   0xB0FE,\n\t956:   0xB0FF,\n\t957:   0xB100,\n\t958:   0xB101,\n\t959:   0xB102,\n\t960:   0xB103,\n\t961:   0xB104,\n\t962:   0xB105,\n\t963:   0xB106,\n\t964:   0xB107,\n\t965:   0xB10A,\n\t966:   0xB10D,\n\t967:   0xB10E,\n\t968:   0xB10F,\n\t969:   0xB111,\n\t970:   0xB114,\n\t971:   0xB115,\n\t972:   0xB116,\n\t973:   0xB117,\n\t974:   0xB11A,\n\t975:   0xB11E,\n\t976:   0xB11F,\n\t977:   0xB120,\n\t978:   0xB121,\n\t979:   0xB122,\n\t980:   0xB126,\n\t981:   0xB127,\n\t982:   0xB129,\n\t983:   0xB12A,\n\t984:   0xB12B,\n\t985:   0xB12D,\n\t986:   0xB12E,\n\t987:   0xB12F,\n\t988:   0xB130,\n\t989:   0xB131,\n\t990:   0xB132,\n\t991:   0xB133,\n\t992:   0xB136,\n\t993:   0xB13A,\n\t994:   0xB13B,\n\t995:   0xB13C,\n\t996:   0xB13D,\n\t997:   0xB13E,\n\t998:   0xB13F,\n\t999:   0xB142,\n\t1000:  0xB143,\n\t1001:  0xB145,\n\t1002:  0xB146,\n\t1003:  0xB147,\n\t1004:  0xB149,\n\t1005:  0xB14A,\n\t1006:  0xB14B,\n\t1007:  0xB14C,\n\t1008:  0xB14D,\n\t1009:  0xB14E,\n\t1010:  0xB14F,\n\t1011:  0xB152,\n\t1012:  0xB153,\n\t1013:  0xB156,\n\t1014:  0xB157,\n\t1015:  0xB159,\n\t1016:  0xB15A,\n\t1017:  0xB15B,\n\t1018:  0xB15D,\n\t1019:  0xB15E,\n\t1020:  0xB15F,\n\t1021:  0xB161,\n\t1022:  0xB162,\n\t1023:  0xB163,\n\t1024:  0xB164,\n\t1025:  0xB165,\n\t1026:  0xB166,\n\t1027:  0xB167,\n\t1028:  0xB168,\n\t1029:  0xB169,\n\t1030:  0xB16A,\n\t1031:  0xB16B,\n\t1032:  0xB16C,\n\t1033:  0xB16D,\n\t1034:  0xB16E,\n\t1035:  0xB16F,\n\t1036:  0xB170,\n\t1037:  0xB171,\n\t1038:  0xB172,\n\t1039:  0xB173,\n\t1040:  0xB174,\n\t1041:  0xB175,\n\t1042:  0xB176,\n\t1043:  0xB177,\n\t1044:  0xB17A,\n\t1045:  0xB17B,\n\t1046:  0xB17D,\n\t1047:  0xB17E,\n\t1048:  0xB17F,\n\t1049:  0xB181,\n\t1050:  0xB183,\n\t1051:  0xB184,\n\t1052:  0xB185,\n\t1053:  0xB186,\n\t1054:  0xB187,\n\t1055:  0xB18A,\n\t1056:  0xB18C,\n\t1057:  0xB18E,\n\t1058:  0xB18F,\n\t1059:  0xB190,\n\t1060:  0xB191,\n\t1061:  0xB195,\n\t1062:  0xB196,\n\t1063:  0xB197,\n\t1064:  0xB199,\n\t1065:  0xB19A,\n\t1066:  0xB19B,\n\t1067:  0xB19D,\n\t1068:  0xB19E,\n\t1069:  0xB19F,\n\t1070:  0xB1A0,\n\t1071:  0xB1A1,\n\t1072:  0xB1A2,\n\t1073:  0xB1A3,\n\t1074:  0xB1A4,\n\t1075:  0xB1A5,\n\t1076:  0xB1A6,\n\t1077:  0xB1A7,\n\t1078:  0xB1A9,\n\t1079:  0xB1AA,\n\t1080:  0xB1AB,\n\t1081:  0xB1AC,\n\t1082:  0xB1AD,\n\t1083:  0xB1AE,\n\t1084:  0xB1AF,\n\t1085:  0xB1B0,\n\t1086:  0xB1B1,\n\t1087:  0xB1B2,\n\t1088:  0xB1B3,\n\t1089:  0xB1B4,\n\t1090:  0xB1B5,\n\t1091:  0xB1B6,\n\t1092:  0xB1B7,\n\t1093:  0xB1B8,\n\t1094:  0xB1B9,\n\t1095:  0xB1BA,\n\t1096:  0xB1BB,\n\t1097:  0xB1BC,\n\t1098:  0xB1BD,\n\t1099:  0xB1BE,\n\t1100:  0xB1BF,\n\t1101:  0xB1C0,\n\t1102:  0xB1C1,\n\t1103:  0xB1C2,\n\t1104:  0xB1C3,\n\t1105:  0xB1C4,\n\t1106:  0xB1C5,\n\t1107:  0xB1C6,\n\t1108:  0xB1C7,\n\t1109:  0xB1C8,\n\t1110:  0xB1C9,\n\t1111:  0xB1CA,\n\t1112:  0xB1CB,\n\t1113:  0xB1CD,\n\t1114:  0xB1CE,\n\t1115:  0xB1CF,\n\t1116:  0xB1D1,\n\t1117:  0xB1D2,\n\t1118:  0xB1D3,\n\t1119:  0xB1D5,\n\t1120:  0xB1D6,\n\t1121:  0xB1D7,\n\t1122:  0xB1D8,\n\t1123:  0xB1D9,\n\t1124:  0xB1DA,\n\t1125:  0xB1DB,\n\t1126:  0xB1DE,\n\t1127:  0xB1E0,\n\t1128:  0xB1E1,\n\t1129:  0xB1E2,\n\t1130:  0xB1E3,\n\t1131:  0xB1E4,\n\t1132:  0xB1E5,\n\t1133:  0xB1E6,\n\t1134:  0xB1E7,\n\t1135:  0xB1EA,\n\t1136:  0xB1EB,\n\t1137:  0xB1ED,\n\t1138:  0xB1EE,\n\t1139:  0xB1EF,\n\t1140:  0xB1F1,\n\t1141:  0xB1F2,\n\t1142:  0xB1F3,\n\t1143:  0xB1F4,\n\t1144:  0xB1F5,\n\t1145:  0xB1F6,\n\t1146:  0xB1F7,\n\t1147:  0xB1F8,\n\t1148:  0xB1FA,\n\t1149:  0xB1FC,\n\t1150:  0xB1FE,\n\t1151:  0xB1FF,\n\t1152:  0xB200,\n\t1153:  0xB201,\n\t1154:  0xB202,\n\t1155:  0xB203,\n\t1156:  0xB206,\n\t1157:  0xB207,\n\t1158:  0xB209,\n\t1159:  0xB20A,\n\t1160:  0xB20D,\n\t1161:  0xB20E,\n\t1162:  0xB20F,\n\t1163:  0xB210,\n\t1164:  0xB211,\n\t1165:  0xB212,\n\t1166:  0xB213,\n\t1167:  0xB216,\n\t1168:  0xB218,\n\t1169:  0xB21A,\n\t1170:  0xB21B,\n\t1171:  0xB21C,\n\t1172:  0xB21D,\n\t1173:  0xB21E,\n\t1174:  0xB21F,\n\t1175:  0xB221,\n\t1176:  0xB222,\n\t1177:  0xB223,\n\t1178:  0xB224,\n\t1179:  0xB225,\n\t1180:  0xB226,\n\t1181:  0xB227,\n\t1182:  0xB228,\n\t1183:  0xB229,\n\t1184:  0xB22A,\n\t1185:  0xB22B,\n\t1186:  0xB22C,\n\t1187:  0xB22D,\n\t1188:  0xB22E,\n\t1189:  0xB22F,\n\t1190:  0xB230,\n\t1191:  0xB231,\n\t1192:  0xB232,\n\t1193:  0xB233,\n\t1194:  0xB235,\n\t1195:  0xB236,\n\t1196:  0xB237,\n\t1197:  0xB238,\n\t1198:  0xB239,\n\t1199:  0xB23A,\n\t1200:  0xB23B,\n\t1201:  0xB23D,\n\t1202:  0xB23E,\n\t1203:  0xB23F,\n\t1204:  0xB240,\n\t1205:  0xB241,\n\t1206:  0xB242,\n\t1207:  0xB243,\n\t1208:  0xB244,\n\t1209:  0xB245,\n\t1210:  0xB246,\n\t1211:  0xB247,\n\t1212:  0xB248,\n\t1213:  0xB249,\n\t1214:  0xB24A,\n\t1215:  0xB24B,\n\t1216:  0xB24C,\n\t1217:  0xB24D,\n\t1218:  0xB24E,\n\t1219:  0xB24F,\n\t1220:  0xB250,\n\t1221:  0xB251,\n\t1222:  0xB252,\n\t1223:  0xB253,\n\t1224:  0xB254,\n\t1225:  0xB255,\n\t1226:  0xB256,\n\t1227:  0xB257,\n\t1228:  0xB259,\n\t1229:  0xB25A,\n\t1230:  0xB25B,\n\t1231:  0xB25D,\n\t1232:  0xB25E,\n\t1233:  0xB25F,\n\t1234:  0xB261,\n\t1235:  0xB262,\n\t1236:  0xB263,\n\t1237:  0xB264,\n\t1238:  0xB265,\n\t1239:  0xB266,\n\t1240:  0xB267,\n\t1241:  0xB26A,\n\t1242:  0xB26B,\n\t1243:  0xB26C,\n\t1244:  0xB26D,\n\t1245:  0xB26E,\n\t1246:  0xB26F,\n\t1247:  0xB270,\n\t1248:  0xB271,\n\t1249:  0xB272,\n\t1250:  0xB273,\n\t1251:  0xB276,\n\t1252:  0xB277,\n\t1253:  0xB278,\n\t1254:  0xB279,\n\t1255:  0xB27A,\n\t1256:  0xB27B,\n\t1257:  0xB27D,\n\t1258:  0xB27E,\n\t1259:  0xB27F,\n\t1260:  0xB280,\n\t1261:  0xB281,\n\t1262:  0xB282,\n\t1263:  0xB283,\n\t1264:  0xB286,\n\t1265:  0xB287,\n\t1266:  0xB288,\n\t1267:  0xB28A,\n\t1268:  0xB28B,\n\t1269:  0xB28C,\n\t1270:  0xB28D,\n\t1271:  0xB28E,\n\t1272:  0xB28F,\n\t1273:  0xB292,\n\t1274:  0xB293,\n\t1275:  0xB295,\n\t1276:  0xB296,\n\t1277:  0xB297,\n\t1278:  0xB29B,\n\t1279:  0xB29C,\n\t1280:  0xB29D,\n\t1281:  0xB29E,\n\t1282:  0xB29F,\n\t1283:  0xB2A2,\n\t1284:  0xB2A4,\n\t1285:  0xB2A7,\n\t1286:  0xB2A8,\n\t1287:  0xB2A9,\n\t1288:  0xB2AB,\n\t1289:  0xB2AD,\n\t1290:  0xB2AE,\n\t1291:  0xB2AF,\n\t1292:  0xB2B1,\n\t1293:  0xB2B2,\n\t1294:  0xB2B3,\n\t1295:  0xB2B5,\n\t1296:  0xB2B6,\n\t1297:  0xB2B7,\n\t1298:  0xB2B8,\n\t1299:  0xB2B9,\n\t1300:  0xB2BA,\n\t1301:  0xB2BB,\n\t1302:  0xB2BC,\n\t1303:  0xB2BD,\n\t1304:  0xB2BE,\n\t1305:  0xB2BF,\n\t1306:  0xB2C0,\n\t1307:  0xB2C1,\n\t1308:  0xB2C2,\n\t1309:  0xB2C3,\n\t1310:  0xB2C4,\n\t1311:  0xB2C5,\n\t1312:  0xB2C6,\n\t1313:  0xB2C7,\n\t1314:  0xB2CA,\n\t1315:  0xB2CB,\n\t1316:  0xB2CD,\n\t1317:  0xB2CE,\n\t1318:  0xB2CF,\n\t1319:  0xB2D1,\n\t1320:  0xB2D3,\n\t1321:  0xB2D4,\n\t1322:  0xB2D5,\n\t1323:  0xB2D6,\n\t1324:  0xB2D7,\n\t1325:  0xB2DA,\n\t1326:  0xB2DC,\n\t1327:  0xB2DE,\n\t1328:  0xB2DF,\n\t1329:  0xB2E0,\n\t1330:  0xB2E1,\n\t1331:  0xB2E3,\n\t1332:  0xB2E7,\n\t1333:  0xB2E9,\n\t1334:  0xB2EA,\n\t1335:  0xB2F0,\n\t1336:  0xB2F1,\n\t1337:  0xB2F2,\n\t1338:  0xB2F6,\n\t1339:  0xB2FC,\n\t1340:  0xB2FD,\n\t1341:  0xB2FE,\n\t1342:  0xB302,\n\t1343:  0xB303,\n\t1344:  0xB305,\n\t1345:  0xB306,\n\t1346:  0xB307,\n\t1347:  0xB309,\n\t1348:  0xB30A,\n\t1349:  0xB30B,\n\t1350:  0xB30C,\n\t1351:  0xB30D,\n\t1352:  0xB30E,\n\t1353:  0xB30F,\n\t1354:  0xB312,\n\t1355:  0xB316,\n\t1356:  0xB317,\n\t1357:  0xB318,\n\t1358:  0xB319,\n\t1359:  0xB31A,\n\t1360:  0xB31B,\n\t1361:  0xB31D,\n\t1362:  0xB31E,\n\t1363:  0xB31F,\n\t1364:  0xB320,\n\t1365:  0xB321,\n\t1366:  0xB322,\n\t1367:  0xB323,\n\t1368:  0xB324,\n\t1369:  0xB325,\n\t1370:  0xB326,\n\t1371:  0xB327,\n\t1372:  0xB328,\n\t1373:  0xB329,\n\t1374:  0xB32A,\n\t1375:  0xB32B,\n\t1376:  0xB32C,\n\t1377:  0xB32D,\n\t1378:  0xB32E,\n\t1379:  0xB32F,\n\t1380:  0xB330,\n\t1381:  0xB331,\n\t1382:  0xB332,\n\t1383:  0xB333,\n\t1384:  0xB334,\n\t1385:  0xB335,\n\t1386:  0xB336,\n\t1387:  0xB337,\n\t1388:  0xB338,\n\t1389:  0xB339,\n\t1390:  0xB33A,\n\t1391:  0xB33B,\n\t1392:  0xB33C,\n\t1393:  0xB33D,\n\t1394:  0xB33E,\n\t1395:  0xB33F,\n\t1396:  0xB340,\n\t1397:  0xB341,\n\t1398:  0xB342,\n\t1399:  0xB343,\n\t1400:  0xB344,\n\t1401:  0xB345,\n\t1402:  0xB346,\n\t1403:  0xB347,\n\t1404:  0xB348,\n\t1405:  0xB349,\n\t1406:  0xB34A,\n\t1407:  0xB34B,\n\t1408:  0xB34C,\n\t1409:  0xB34D,\n\t1410:  0xB34E,\n\t1411:  0xB34F,\n\t1412:  0xB350,\n\t1413:  0xB351,\n\t1414:  0xB352,\n\t1415:  0xB353,\n\t1416:  0xB357,\n\t1417:  0xB359,\n\t1418:  0xB35A,\n\t1419:  0xB35D,\n\t1420:  0xB360,\n\t1421:  0xB361,\n\t1422:  0xB362,\n\t1423:  0xB363,\n\t1424:  0xB366,\n\t1425:  0xB368,\n\t1426:  0xB36A,\n\t1427:  0xB36C,\n\t1428:  0xB36D,\n\t1429:  0xB36F,\n\t1430:  0xB372,\n\t1431:  0xB373,\n\t1432:  0xB375,\n\t1433:  0xB376,\n\t1434:  0xB377,\n\t1435:  0xB379,\n\t1436:  0xB37A,\n\t1437:  0xB37B,\n\t1438:  0xB37C,\n\t1439:  0xB37D,\n\t1440:  0xB37E,\n\t1441:  0xB37F,\n\t1442:  0xB382,\n\t1443:  0xB386,\n\t1444:  0xB387,\n\t1445:  0xB388,\n\t1446:  0xB389,\n\t1447:  0xB38A,\n\t1448:  0xB38B,\n\t1449:  0xB38D,\n\t1450:  0xB38E,\n\t1451:  0xB38F,\n\t1452:  0xB391,\n\t1453:  0xB392,\n\t1454:  0xB393,\n\t1455:  0xB395,\n\t1456:  0xB396,\n\t1457:  0xB397,\n\t1458:  0xB398,\n\t1459:  0xB399,\n\t1460:  0xB39A,\n\t1461:  0xB39B,\n\t1462:  0xB39C,\n\t1463:  0xB39D,\n\t1464:  0xB39E,\n\t1465:  0xB39F,\n\t1466:  0xB3A2,\n\t1467:  0xB3A3,\n\t1468:  0xB3A4,\n\t1469:  0xB3A5,\n\t1470:  0xB3A6,\n\t1471:  0xB3A7,\n\t1472:  0xB3A9,\n\t1473:  0xB3AA,\n\t1474:  0xB3AB,\n\t1475:  0xB3AD,\n\t1476:  0xB3AE,\n\t1477:  0xB3AF,\n\t1478:  0xB3B0,\n\t1479:  0xB3B1,\n\t1480:  0xB3B2,\n\t1481:  0xB3B3,\n\t1482:  0xB3B4,\n\t1483:  0xB3B5,\n\t1484:  0xB3B6,\n\t1485:  0xB3B7,\n\t1486:  0xB3B8,\n\t1487:  0xB3B9,\n\t1488:  0xB3BA,\n\t1489:  0xB3BB,\n\t1490:  0xB3BC,\n\t1491:  0xB3BD,\n\t1492:  0xB3BE,\n\t1493:  0xB3BF,\n\t1494:  0xB3C0,\n\t1495:  0xB3C1,\n\t1496:  0xB3C2,\n\t1497:  0xB3C3,\n\t1498:  0xB3C6,\n\t1499:  0xB3C7,\n\t1500:  0xB3C9,\n\t1501:  0xB3CA,\n\t1502:  0xB3CD,\n\t1503:  0xB3CF,\n\t1504:  0xB3D1,\n\t1505:  0xB3D2,\n\t1506:  0xB3D3,\n\t1507:  0xB3D6,\n\t1508:  0xB3D8,\n\t1509:  0xB3DA,\n\t1510:  0xB3DC,\n\t1511:  0xB3DE,\n\t1512:  0xB3DF,\n\t1513:  0xB3E1,\n\t1514:  0xB3E2,\n\t1515:  0xB3E3,\n\t1516:  0xB3E5,\n\t1517:  0xB3E6,\n\t1518:  0xB3E7,\n\t1519:  0xB3E9,\n\t1520:  0xB3EA,\n\t1521:  0xB3EB,\n\t1522:  0xB3EC,\n\t1523:  0xB3ED,\n\t1524:  0xB3EE,\n\t1525:  0xB3EF,\n\t1526:  0xB3F0,\n\t1527:  0xB3F1,\n\t1528:  0xB3F2,\n\t1529:  0xB3F3,\n\t1530:  0xB3F4,\n\t1531:  0xB3F5,\n\t1532:  0xB3F6,\n\t1533:  0xB3F7,\n\t1534:  0xB3F8,\n\t1535:  0xB3F9,\n\t1536:  0xB3FA,\n\t1537:  0xB3FB,\n\t1538:  0xB3FD,\n\t1539:  0xB3FE,\n\t1540:  0xB3FF,\n\t1541:  0xB400,\n\t1542:  0xB401,\n\t1543:  0xB402,\n\t1544:  0xB403,\n\t1545:  0xB404,\n\t1546:  0xB405,\n\t1547:  0xB406,\n\t1548:  0xB407,\n\t1549:  0xB408,\n\t1550:  0xB409,\n\t1551:  0xB40A,\n\t1552:  0xB40B,\n\t1553:  0xB40C,\n\t1554:  0xB40D,\n\t1555:  0xB40E,\n\t1556:  0xB40F,\n\t1557:  0xB411,\n\t1558:  0xB412,\n\t1559:  0xB413,\n\t1560:  0xB414,\n\t1561:  0xB415,\n\t1562:  0xB416,\n\t1563:  0xB417,\n\t1564:  0xB419,\n\t1565:  0xB41A,\n\t1566:  0xB41B,\n\t1567:  0xB41D,\n\t1568:  0xB41E,\n\t1569:  0xB41F,\n\t1570:  0xB421,\n\t1571:  0xB422,\n\t1572:  0xB423,\n\t1573:  0xB424,\n\t1574:  0xB425,\n\t1575:  0xB426,\n\t1576:  0xB427,\n\t1577:  0xB42A,\n\t1578:  0xB42C,\n\t1579:  0xB42D,\n\t1580:  0xB42E,\n\t1581:  0xB42F,\n\t1582:  0xB430,\n\t1583:  0xB431,\n\t1584:  0xB432,\n\t1585:  0xB433,\n\t1586:  0xB435,\n\t1587:  0xB436,\n\t1588:  0xB437,\n\t1589:  0xB438,\n\t1590:  0xB439,\n\t1591:  0xB43A,\n\t1592:  0xB43B,\n\t1593:  0xB43C,\n\t1594:  0xB43D,\n\t1595:  0xB43E,\n\t1596:  0xB43F,\n\t1597:  0xB440,\n\t1598:  0xB441,\n\t1599:  0xB442,\n\t1600:  0xB443,\n\t1601:  0xB444,\n\t1602:  0xB445,\n\t1603:  0xB446,\n\t1604:  0xB447,\n\t1605:  0xB448,\n\t1606:  0xB449,\n\t1607:  0xB44A,\n\t1608:  0xB44B,\n\t1609:  0xB44C,\n\t1610:  0xB44D,\n\t1611:  0xB44E,\n\t1612:  0xB44F,\n\t1613:  0xB452,\n\t1614:  0xB453,\n\t1615:  0xB455,\n\t1616:  0xB456,\n\t1617:  0xB457,\n\t1618:  0xB459,\n\t1619:  0xB45A,\n\t1620:  0xB45B,\n\t1621:  0xB45C,\n\t1622:  0xB45D,\n\t1623:  0xB45E,\n\t1624:  0xB45F,\n\t1625:  0xB462,\n\t1626:  0xB464,\n\t1627:  0xB466,\n\t1628:  0xB467,\n\t1629:  0xB468,\n\t1630:  0xB469,\n\t1631:  0xB46A,\n\t1632:  0xB46B,\n\t1633:  0xB46D,\n\t1634:  0xB46E,\n\t1635:  0xB46F,\n\t1636:  0xB470,\n\t1637:  0xB471,\n\t1638:  0xB472,\n\t1639:  0xB473,\n\t1640:  0xB474,\n\t1641:  0xB475,\n\t1642:  0xB476,\n\t1643:  0xB477,\n\t1644:  0xB478,\n\t1645:  0xB479,\n\t1646:  0xB47A,\n\t1647:  0xB47B,\n\t1648:  0xB47C,\n\t1649:  0xB47D,\n\t1650:  0xB47E,\n\t1651:  0xB47F,\n\t1652:  0xB481,\n\t1653:  0xB482,\n\t1654:  0xB483,\n\t1655:  0xB484,\n\t1656:  0xB485,\n\t1657:  0xB486,\n\t1658:  0xB487,\n\t1659:  0xB489,\n\t1660:  0xB48A,\n\t1661:  0xB48B,\n\t1662:  0xB48C,\n\t1663:  0xB48D,\n\t1664:  0xB48E,\n\t1665:  0xB48F,\n\t1666:  0xB490,\n\t1667:  0xB491,\n\t1668:  0xB492,\n\t1669:  0xB493,\n\t1670:  0xB494,\n\t1671:  0xB495,\n\t1672:  0xB496,\n\t1673:  0xB497,\n\t1674:  0xB498,\n\t1675:  0xB499,\n\t1676:  0xB49A,\n\t1677:  0xB49B,\n\t1678:  0xB49C,\n\t1679:  0xB49E,\n\t1680:  0xB49F,\n\t1681:  0xB4A0,\n\t1682:  0xB4A1,\n\t1683:  0xB4A2,\n\t1684:  0xB4A3,\n\t1685:  0xB4A5,\n\t1686:  0xB4A6,\n\t1687:  0xB4A7,\n\t1688:  0xB4A9,\n\t1689:  0xB4AA,\n\t1690:  0xB4AB,\n\t1691:  0xB4AD,\n\t1692:  0xB4AE,\n\t1693:  0xB4AF,\n\t1694:  0xB4B0,\n\t1695:  0xB4B1,\n\t1696:  0xB4B2,\n\t1697:  0xB4B3,\n\t1698:  0xB4B4,\n\t1699:  0xB4B6,\n\t1700:  0xB4B8,\n\t1701:  0xB4BA,\n\t1702:  0xB4BB,\n\t1703:  0xB4BC,\n\t1704:  0xB4BD,\n\t1705:  0xB4BE,\n\t1706:  0xB4BF,\n\t1707:  0xB4C1,\n\t1708:  0xB4C2,\n\t1709:  0xB4C3,\n\t1710:  0xB4C5,\n\t1711:  0xB4C6,\n\t1712:  0xB4C7,\n\t1713:  0xB4C9,\n\t1714:  0xB4CA,\n\t1715:  0xB4CB,\n\t1716:  0xB4CC,\n\t1717:  0xB4CD,\n\t1718:  0xB4CE,\n\t1719:  0xB4CF,\n\t1720:  0xB4D1,\n\t1721:  0xB4D2,\n\t1722:  0xB4D3,\n\t1723:  0xB4D4,\n\t1724:  0xB4D6,\n\t1725:  0xB4D7,\n\t1726:  0xB4D8,\n\t1727:  0xB4D9,\n\t1728:  0xB4DA,\n\t1729:  0xB4DB,\n\t1730:  0xB4DE,\n\t1731:  0xB4DF,\n\t1732:  0xB4E1,\n\t1733:  0xB4E2,\n\t1734:  0xB4E5,\n\t1735:  0xB4E7,\n\t1736:  0xB4E8,\n\t1737:  0xB4E9,\n\t1738:  0xB4EA,\n\t1739:  0xB4EB,\n\t1740:  0xB4EE,\n\t1741:  0xB4F0,\n\t1742:  0xB4F2,\n\t1743:  0xB4F3,\n\t1744:  0xB4F4,\n\t1745:  0xB4F5,\n\t1746:  0xB4F6,\n\t1747:  0xB4F7,\n\t1748:  0xB4F9,\n\t1749:  0xB4FA,\n\t1750:  0xB4FB,\n\t1751:  0xB4FC,\n\t1752:  0xB4FD,\n\t1753:  0xB4FE,\n\t1754:  0xB4FF,\n\t1755:  0xB500,\n\t1756:  0xB501,\n\t1757:  0xB502,\n\t1758:  0xB503,\n\t1759:  0xB504,\n\t1760:  0xB505,\n\t1761:  0xB506,\n\t1762:  0xB507,\n\t1763:  0xB508,\n\t1764:  0xB509,\n\t1765:  0xB50A,\n\t1766:  0xB50B,\n\t1767:  0xB50C,\n\t1768:  0xB50D,\n\t1769:  0xB50E,\n\t1770:  0xB50F,\n\t1771:  0xB510,\n\t1772:  0xB511,\n\t1773:  0xB512,\n\t1774:  0xB513,\n\t1775:  0xB516,\n\t1776:  0xB517,\n\t1777:  0xB519,\n\t1778:  0xB51A,\n\t1779:  0xB51D,\n\t1780:  0xB51E,\n\t1781:  0xB51F,\n\t1782:  0xB520,\n\t1783:  0xB521,\n\t1784:  0xB522,\n\t1785:  0xB523,\n\t1786:  0xB526,\n\t1787:  0xB52B,\n\t1788:  0xB52C,\n\t1789:  0xB52D,\n\t1790:  0xB52E,\n\t1791:  0xB52F,\n\t1792:  0xB532,\n\t1793:  0xB533,\n\t1794:  0xB535,\n\t1795:  0xB536,\n\t1796:  0xB537,\n\t1797:  0xB539,\n\t1798:  0xB53A,\n\t1799:  0xB53B,\n\t1800:  0xB53C,\n\t1801:  0xB53D,\n\t1802:  0xB53E,\n\t1803:  0xB53F,\n\t1804:  0xB542,\n\t1805:  0xB546,\n\t1806:  0xB547,\n\t1807:  0xB548,\n\t1808:  0xB549,\n\t1809:  0xB54A,\n\t1810:  0xB54E,\n\t1811:  0xB54F,\n\t1812:  0xB551,\n\t1813:  0xB552,\n\t1814:  0xB553,\n\t1815:  0xB555,\n\t1816:  0xB556,\n\t1817:  0xB557,\n\t1818:  0xB558,\n\t1819:  0xB559,\n\t1820:  0xB55A,\n\t1821:  0xB55B,\n\t1822:  0xB55E,\n\t1823:  0xB562,\n\t1824:  0xB563,\n\t1825:  0xB564,\n\t1826:  0xB565,\n\t1827:  0xB566,\n\t1828:  0xB567,\n\t1829:  0xB568,\n\t1830:  0xB569,\n\t1831:  0xB56A,\n\t1832:  0xB56B,\n\t1833:  0xB56C,\n\t1834:  0xB56D,\n\t1835:  0xB56E,\n\t1836:  0xB56F,\n\t1837:  0xB570,\n\t1838:  0xB571,\n\t1839:  0xB572,\n\t1840:  0xB573,\n\t1841:  0xB574,\n\t1842:  0xB575,\n\t1843:  0xB576,\n\t1844:  0xB577,\n\t1845:  0xB578,\n\t1846:  0xB579,\n\t1847:  0xB57A,\n\t1848:  0xB57B,\n\t1849:  0xB57C,\n\t1850:  0xB57D,\n\t1851:  0xB57E,\n\t1852:  0xB57F,\n\t1853:  0xB580,\n\t1854:  0xB581,\n\t1855:  0xB582,\n\t1856:  0xB583,\n\t1857:  0xB584,\n\t1858:  0xB585,\n\t1859:  0xB586,\n\t1860:  0xB587,\n\t1861:  0xB588,\n\t1862:  0xB589,\n\t1863:  0xB58A,\n\t1864:  0xB58B,\n\t1865:  0xB58C,\n\t1866:  0xB58D,\n\t1867:  0xB58E,\n\t1868:  0xB58F,\n\t1869:  0xB590,\n\t1870:  0xB591,\n\t1871:  0xB592,\n\t1872:  0xB593,\n\t1873:  0xB594,\n\t1874:  0xB595,\n\t1875:  0xB596,\n\t1876:  0xB597,\n\t1877:  0xB598,\n\t1878:  0xB599,\n\t1879:  0xB59A,\n\t1880:  0xB59B,\n\t1881:  0xB59C,\n\t1882:  0xB59D,\n\t1883:  0xB59E,\n\t1884:  0xB59F,\n\t1885:  0xB5A2,\n\t1886:  0xB5A3,\n\t1887:  0xB5A5,\n\t1888:  0xB5A6,\n\t1889:  0xB5A7,\n\t1890:  0xB5A9,\n\t1891:  0xB5AC,\n\t1892:  0xB5AD,\n\t1893:  0xB5AE,\n\t1894:  0xB5AF,\n\t1895:  0xB5B2,\n\t1896:  0xB5B6,\n\t1897:  0xB5B7,\n\t1898:  0xB5B8,\n\t1899:  0xB5B9,\n\t1900:  0xB5BA,\n\t1901:  0xB5BE,\n\t1902:  0xB5BF,\n\t1903:  0xB5C1,\n\t1904:  0xB5C2,\n\t1905:  0xB5C3,\n\t1906:  0xB5C5,\n\t1907:  0xB5C6,\n\t1908:  0xB5C7,\n\t1909:  0xB5C8,\n\t1910:  0xB5C9,\n\t1911:  0xB5CA,\n\t1912:  0xB5CB,\n\t1913:  0xB5CE,\n\t1914:  0xB5D2,\n\t1915:  0xB5D3,\n\t1916:  0xB5D4,\n\t1917:  0xB5D5,\n\t1918:  0xB5D6,\n\t1919:  0xB5D7,\n\t1920:  0xB5D9,\n\t1921:  0xB5DA,\n\t1922:  0xB5DB,\n\t1923:  0xB5DC,\n\t1924:  0xB5DD,\n\t1925:  0xB5DE,\n\t1926:  0xB5DF,\n\t1927:  0xB5E0,\n\t1928:  0xB5E1,\n\t1929:  0xB5E2,\n\t1930:  0xB5E3,\n\t1931:  0xB5E4,\n\t1932:  0xB5E5,\n\t1933:  0xB5E6,\n\t1934:  0xB5E7,\n\t1935:  0xB5E8,\n\t1936:  0xB5E9,\n\t1937:  0xB5EA,\n\t1938:  0xB5EB,\n\t1939:  0xB5ED,\n\t1940:  0xB5EE,\n\t1941:  0xB5EF,\n\t1942:  0xB5F0,\n\t1943:  0xB5F1,\n\t1944:  0xB5F2,\n\t1945:  0xB5F3,\n\t1946:  0xB5F4,\n\t1947:  0xB5F5,\n\t1948:  0xB5F6,\n\t1949:  0xB5F7,\n\t1950:  0xB5F8,\n\t1951:  0xB5F9,\n\t1952:  0xB5FA,\n\t1953:  0xB5FB,\n\t1954:  0xB5FC,\n\t1955:  0xB5FD,\n\t1956:  0xB5FE,\n\t1957:  0xB5FF,\n\t1958:  0xB600,\n\t1959:  0xB601,\n\t1960:  0xB602,\n\t1961:  0xB603,\n\t1962:  0xB604,\n\t1963:  0xB605,\n\t1964:  0xB606,\n\t1965:  0xB607,\n\t1966:  0xB608,\n\t1967:  0xB609,\n\t1968:  0xB60A,\n\t1969:  0xB60B,\n\t1970:  0xB60C,\n\t1971:  0xB60D,\n\t1972:  0xB60E,\n\t1973:  0xB60F,\n\t1974:  0xB612,\n\t1975:  0xB613,\n\t1976:  0xB615,\n\t1977:  0xB616,\n\t1978:  0xB617,\n\t1979:  0xB619,\n\t1980:  0xB61A,\n\t1981:  0xB61B,\n\t1982:  0xB61C,\n\t1983:  0xB61D,\n\t1984:  0xB61E,\n\t1985:  0xB61F,\n\t1986:  0xB620,\n\t1987:  0xB621,\n\t1988:  0xB622,\n\t1989:  0xB623,\n\t1990:  0xB624,\n\t1991:  0xB626,\n\t1992:  0xB627,\n\t1993:  0xB628,\n\t1994:  0xB629,\n\t1995:  0xB62A,\n\t1996:  0xB62B,\n\t1997:  0xB62D,\n\t1998:  0xB62E,\n\t1999:  0xB62F,\n\t2000:  0xB630,\n\t2001:  0xB631,\n\t2002:  0xB632,\n\t2003:  0xB633,\n\t2004:  0xB635,\n\t2005:  0xB636,\n\t2006:  0xB637,\n\t2007:  0xB638,\n\t2008:  0xB639,\n\t2009:  0xB63A,\n\t2010:  0xB63B,\n\t2011:  0xB63C,\n\t2012:  0xB63D,\n\t2013:  0xB63E,\n\t2014:  0xB63F,\n\t2015:  0xB640,\n\t2016:  0xB641,\n\t2017:  0xB642,\n\t2018:  0xB643,\n\t2019:  0xB644,\n\t2020:  0xB645,\n\t2021:  0xB646,\n\t2022:  0xB647,\n\t2023:  0xB649,\n\t2024:  0xB64A,\n\t2025:  0xB64B,\n\t2026:  0xB64C,\n\t2027:  0xB64D,\n\t2028:  0xB64E,\n\t2029:  0xB64F,\n\t2030:  0xB650,\n\t2031:  0xB651,\n\t2032:  0xB652,\n\t2033:  0xB653,\n\t2034:  0xB654,\n\t2035:  0xB655,\n\t2036:  0xB656,\n\t2037:  0xB657,\n\t2038:  0xB658,\n\t2039:  0xB659,\n\t2040:  0xB65A,\n\t2041:  0xB65B,\n\t2042:  0xB65C,\n\t2043:  0xB65D,\n\t2044:  0xB65E,\n\t2045:  0xB65F,\n\t2046:  0xB660,\n\t2047:  0xB661,\n\t2048:  0xB662,\n\t2049:  0xB663,\n\t2050:  0xB665,\n\t2051:  0xB666,\n\t2052:  0xB667,\n\t2053:  0xB669,\n\t2054:  0xB66A,\n\t2055:  0xB66B,\n\t2056:  0xB66C,\n\t2057:  0xB66D,\n\t2058:  0xB66E,\n\t2059:  0xB66F,\n\t2060:  0xB670,\n\t2061:  0xB671,\n\t2062:  0xB672,\n\t2063:  0xB673,\n\t2064:  0xB674,\n\t2065:  0xB675,\n\t2066:  0xB676,\n\t2067:  0xB677,\n\t2068:  0xB678,\n\t2069:  0xB679,\n\t2070:  0xB67A,\n\t2071:  0xB67B,\n\t2072:  0xB67C,\n\t2073:  0xB67D,\n\t2074:  0xB67E,\n\t2075:  0xB67F,\n\t2076:  0xB680,\n\t2077:  0xB681,\n\t2078:  0xB682,\n\t2079:  0xB683,\n\t2080:  0xB684,\n\t2081:  0xB685,\n\t2082:  0xB686,\n\t2083:  0xB687,\n\t2084:  0xB688,\n\t2085:  0xB689,\n\t2086:  0xB68A,\n\t2087:  0xB68B,\n\t2088:  0xB68C,\n\t2089:  0xB68D,\n\t2090:  0xB68E,\n\t2091:  0xB68F,\n\t2092:  0xB690,\n\t2093:  0xB691,\n\t2094:  0xB692,\n\t2095:  0xB693,\n\t2096:  0xB694,\n\t2097:  0xB695,\n\t2098:  0xB696,\n\t2099:  0xB697,\n\t2100:  0xB698,\n\t2101:  0xB699,\n\t2102:  0xB69A,\n\t2103:  0xB69B,\n\t2104:  0xB69E,\n\t2105:  0xB69F,\n\t2106:  0xB6A1,\n\t2107:  0xB6A2,\n\t2108:  0xB6A3,\n\t2109:  0xB6A5,\n\t2110:  0xB6A6,\n\t2111:  0xB6A7,\n\t2112:  0xB6A8,\n\t2113:  0xB6A9,\n\t2114:  0xB6AA,\n\t2115:  0xB6AD,\n\t2116:  0xB6AE,\n\t2117:  0xB6AF,\n\t2118:  0xB6B0,\n\t2119:  0xB6B2,\n\t2120:  0xB6B3,\n\t2121:  0xB6B4,\n\t2122:  0xB6B5,\n\t2123:  0xB6B6,\n\t2124:  0xB6B7,\n\t2125:  0xB6B8,\n\t2126:  0xB6B9,\n\t2127:  0xB6BA,\n\t2128:  0xB6BB,\n\t2129:  0xB6BC,\n\t2130:  0xB6BD,\n\t2131:  0xB6BE,\n\t2132:  0xB6BF,\n\t2133:  0xB6C0,\n\t2134:  0xB6C1,\n\t2135:  0xB6C2,\n\t2136:  0xB6C3,\n\t2137:  0xB6C4,\n\t2138:  0xB6C5,\n\t2139:  0xB6C6,\n\t2140:  0xB6C7,\n\t2141:  0xB6C8,\n\t2142:  0xB6C9,\n\t2143:  0xB6CA,\n\t2144:  0xB6CB,\n\t2145:  0xB6CC,\n\t2146:  0xB6CD,\n\t2147:  0xB6CE,\n\t2148:  0xB6CF,\n\t2149:  0xB6D0,\n\t2150:  0xB6D1,\n\t2151:  0xB6D2,\n\t2152:  0xB6D3,\n\t2153:  0xB6D5,\n\t2154:  0xB6D6,\n\t2155:  0xB6D7,\n\t2156:  0xB6D8,\n\t2157:  0xB6D9,\n\t2158:  0xB6DA,\n\t2159:  0xB6DB,\n\t2160:  0xB6DC,\n\t2161:  0xB6DD,\n\t2162:  0xB6DE,\n\t2163:  0xB6DF,\n\t2164:  0xB6E0,\n\t2165:  0xB6E1,\n\t2166:  0xB6E2,\n\t2167:  0xB6E3,\n\t2168:  0xB6E4,\n\t2169:  0xB6E5,\n\t2170:  0xB6E6,\n\t2171:  0xB6E7,\n\t2172:  0xB6E8,\n\t2173:  0xB6E9,\n\t2174:  0xB6EA,\n\t2175:  0xB6EB,\n\t2176:  0xB6EC,\n\t2177:  0xB6ED,\n\t2178:  0xB6EE,\n\t2179:  0xB6EF,\n\t2180:  0xB6F1,\n\t2181:  0xB6F2,\n\t2182:  0xB6F3,\n\t2183:  0xB6F5,\n\t2184:  0xB6F6,\n\t2185:  0xB6F7,\n\t2186:  0xB6F9,\n\t2187:  0xB6FA,\n\t2188:  0xB6FB,\n\t2189:  0xB6FC,\n\t2190:  0xB6FD,\n\t2191:  0xB6FE,\n\t2192:  0xB6FF,\n\t2193:  0xB702,\n\t2194:  0xB703,\n\t2195:  0xB704,\n\t2196:  0xB706,\n\t2197:  0xB707,\n\t2198:  0xB708,\n\t2199:  0xB709,\n\t2200:  0xB70A,\n\t2201:  0xB70B,\n\t2202:  0xB70C,\n\t2203:  0xB70D,\n\t2204:  0xB70E,\n\t2205:  0xB70F,\n\t2206:  0xB710,\n\t2207:  0xB711,\n\t2208:  0xB712,\n\t2209:  0xB713,\n\t2210:  0xB714,\n\t2211:  0xB715,\n\t2212:  0xB716,\n\t2213:  0xB717,\n\t2214:  0xB718,\n\t2215:  0xB719,\n\t2216:  0xB71A,\n\t2217:  0xB71B,\n\t2218:  0xB71C,\n\t2219:  0xB71D,\n\t2220:  0xB71E,\n\t2221:  0xB71F,\n\t2222:  0xB720,\n\t2223:  0xB721,\n\t2224:  0xB722,\n\t2225:  0xB723,\n\t2226:  0xB724,\n\t2227:  0xB725,\n\t2228:  0xB726,\n\t2229:  0xB727,\n\t2230:  0xB72A,\n\t2231:  0xB72B,\n\t2232:  0xB72D,\n\t2233:  0xB72E,\n\t2234:  0xB731,\n\t2235:  0xB732,\n\t2236:  0xB733,\n\t2237:  0xB734,\n\t2238:  0xB735,\n\t2239:  0xB736,\n\t2240:  0xB737,\n\t2241:  0xB73A,\n\t2242:  0xB73C,\n\t2243:  0xB73D,\n\t2244:  0xB73E,\n\t2245:  0xB73F,\n\t2246:  0xB740,\n\t2247:  0xB741,\n\t2248:  0xB742,\n\t2249:  0xB743,\n\t2250:  0xB745,\n\t2251:  0xB746,\n\t2252:  0xB747,\n\t2253:  0xB749,\n\t2254:  0xB74A,\n\t2255:  0xB74B,\n\t2256:  0xB74D,\n\t2257:  0xB74E,\n\t2258:  0xB74F,\n\t2259:  0xB750,\n\t2260:  0xB751,\n\t2261:  0xB752,\n\t2262:  0xB753,\n\t2263:  0xB756,\n\t2264:  0xB757,\n\t2265:  0xB758,\n\t2266:  0xB759,\n\t2267:  0xB75A,\n\t2268:  0xB75B,\n\t2269:  0xB75C,\n\t2270:  0xB75D,\n\t2271:  0xB75E,\n\t2272:  0xB75F,\n\t2273:  0xB761,\n\t2274:  0xB762,\n\t2275:  0xB763,\n\t2276:  0xB765,\n\t2277:  0xB766,\n\t2278:  0xB767,\n\t2279:  0xB769,\n\t2280:  0xB76A,\n\t2281:  0xB76B,\n\t2282:  0xB76C,\n\t2283:  0xB76D,\n\t2284:  0xB76E,\n\t2285:  0xB76F,\n\t2286:  0xB772,\n\t2287:  0xB774,\n\t2288:  0xB776,\n\t2289:  0xB777,\n\t2290:  0xB778,\n\t2291:  0xB779,\n\t2292:  0xB77A,\n\t2293:  0xB77B,\n\t2294:  0xB77E,\n\t2295:  0xB77F,\n\t2296:  0xB781,\n\t2297:  0xB782,\n\t2298:  0xB783,\n\t2299:  0xB785,\n\t2300:  0xB786,\n\t2301:  0xB787,\n\t2302:  0xB788,\n\t2303:  0xB789,\n\t2304:  0xB78A,\n\t2305:  0xB78B,\n\t2306:  0xB78E,\n\t2307:  0xB793,\n\t2308:  0xB794,\n\t2309:  0xB795,\n\t2310:  0xB79A,\n\t2311:  0xB79B,\n\t2312:  0xB79D,\n\t2313:  0xB79E,\n\t2314:  0xB79F,\n\t2315:  0xB7A1,\n\t2316:  0xB7A2,\n\t2317:  0xB7A3,\n\t2318:  0xB7A4,\n\t2319:  0xB7A5,\n\t2320:  0xB7A6,\n\t2321:  0xB7A7,\n\t2322:  0xB7AA,\n\t2323:  0xB7AE,\n\t2324:  0xB7AF,\n\t2325:  0xB7B0,\n\t2326:  0xB7B1,\n\t2327:  0xB7B2,\n\t2328:  0xB7B3,\n\t2329:  0xB7B6,\n\t2330:  0xB7B7,\n\t2331:  0xB7B9,\n\t2332:  0xB7BA,\n\t2333:  0xB7BB,\n\t2334:  0xB7BC,\n\t2335:  0xB7BD,\n\t2336:  0xB7BE,\n\t2337:  0xB7BF,\n\t2338:  0xB7C0,\n\t2339:  0xB7C1,\n\t2340:  0xB7C2,\n\t2341:  0xB7C3,\n\t2342:  0xB7C4,\n\t2343:  0xB7C5,\n\t2344:  0xB7C6,\n\t2345:  0xB7C8,\n\t2346:  0xB7CA,\n\t2347:  0xB7CB,\n\t2348:  0xB7CC,\n\t2349:  0xB7CD,\n\t2350:  0xB7CE,\n\t2351:  0xB7CF,\n\t2352:  0xB7D0,\n\t2353:  0xB7D1,\n\t2354:  0xB7D2,\n\t2355:  0xB7D3,\n\t2356:  0xB7D4,\n\t2357:  0xB7D5,\n\t2358:  0xB7D6,\n\t2359:  0xB7D7,\n\t2360:  0xB7D8,\n\t2361:  0xB7D9,\n\t2362:  0xB7DA,\n\t2363:  0xB7DB,\n\t2364:  0xB7DC,\n\t2365:  0xB7DD,\n\t2366:  0xB7DE,\n\t2367:  0xB7DF,\n\t2368:  0xB7E0,\n\t2369:  0xB7E1,\n\t2370:  0xB7E2,\n\t2371:  0xB7E3,\n\t2372:  0xB7E4,\n\t2373:  0xB7E5,\n\t2374:  0xB7E6,\n\t2375:  0xB7E7,\n\t2376:  0xB7E8,\n\t2377:  0xB7E9,\n\t2378:  0xB7EA,\n\t2379:  0xB7EB,\n\t2380:  0xB7EE,\n\t2381:  0xB7EF,\n\t2382:  0xB7F1,\n\t2383:  0xB7F2,\n\t2384:  0xB7F3,\n\t2385:  0xB7F5,\n\t2386:  0xB7F6,\n\t2387:  0xB7F7,\n\t2388:  0xB7F8,\n\t2389:  0xB7F9,\n\t2390:  0xB7FA,\n\t2391:  0xB7FB,\n\t2392:  0xB7FE,\n\t2393:  0xB802,\n\t2394:  0xB803,\n\t2395:  0xB804,\n\t2396:  0xB805,\n\t2397:  0xB806,\n\t2398:  0xB80A,\n\t2399:  0xB80B,\n\t2400:  0xB80D,\n\t2401:  0xB80E,\n\t2402:  0xB80F,\n\t2403:  0xB811,\n\t2404:  0xB812,\n\t2405:  0xB813,\n\t2406:  0xB814,\n\t2407:  0xB815,\n\t2408:  0xB816,\n\t2409:  0xB817,\n\t2410:  0xB81A,\n\t2411:  0xB81C,\n\t2412:  0xB81E,\n\t2413:  0xB81F,\n\t2414:  0xB820,\n\t2415:  0xB821,\n\t2416:  0xB822,\n\t2417:  0xB823,\n\t2418:  0xB826,\n\t2419:  0xB827,\n\t2420:  0xB829,\n\t2421:  0xB82A,\n\t2422:  0xB82B,\n\t2423:  0xB82D,\n\t2424:  0xB82E,\n\t2425:  0xB82F,\n\t2426:  0xB830,\n\t2427:  0xB831,\n\t2428:  0xB832,\n\t2429:  0xB833,\n\t2430:  0xB836,\n\t2431:  0xB83A,\n\t2432:  0xB83B,\n\t2433:  0xB83C,\n\t2434:  0xB83D,\n\t2435:  0xB83E,\n\t2436:  0xB83F,\n\t2437:  0xB841,\n\t2438:  0xB842,\n\t2439:  0xB843,\n\t2440:  0xB845,\n\t2441:  0xB846,\n\t2442:  0xB847,\n\t2443:  0xB848,\n\t2444:  0xB849,\n\t2445:  0xB84A,\n\t2446:  0xB84B,\n\t2447:  0xB84C,\n\t2448:  0xB84D,\n\t2449:  0xB84E,\n\t2450:  0xB84F,\n\t2451:  0xB850,\n\t2452:  0xB852,\n\t2453:  0xB854,\n\t2454:  0xB855,\n\t2455:  0xB856,\n\t2456:  0xB857,\n\t2457:  0xB858,\n\t2458:  0xB859,\n\t2459:  0xB85A,\n\t2460:  0xB85B,\n\t2461:  0xB85E,\n\t2462:  0xB85F,\n\t2463:  0xB861,\n\t2464:  0xB862,\n\t2465:  0xB863,\n\t2466:  0xB865,\n\t2467:  0xB866,\n\t2468:  0xB867,\n\t2469:  0xB868,\n\t2470:  0xB869,\n\t2471:  0xB86A,\n\t2472:  0xB86B,\n\t2473:  0xB86E,\n\t2474:  0xB870,\n\t2475:  0xB872,\n\t2476:  0xB873,\n\t2477:  0xB874,\n\t2478:  0xB875,\n\t2479:  0xB876,\n\t2480:  0xB877,\n\t2481:  0xB879,\n\t2482:  0xB87A,\n\t2483:  0xB87B,\n\t2484:  0xB87D,\n\t2485:  0xB87E,\n\t2486:  0xB87F,\n\t2487:  0xB880,\n\t2488:  0xB881,\n\t2489:  0xB882,\n\t2490:  0xB883,\n\t2491:  0xB884,\n\t2492:  0xB885,\n\t2493:  0xB886,\n\t2494:  0xB887,\n\t2495:  0xB888,\n\t2496:  0xB889,\n\t2497:  0xB88A,\n\t2498:  0xB88B,\n\t2499:  0xB88C,\n\t2500:  0xB88E,\n\t2501:  0xB88F,\n\t2502:  0xB890,\n\t2503:  0xB891,\n\t2504:  0xB892,\n\t2505:  0xB893,\n\t2506:  0xB894,\n\t2507:  0xB895,\n\t2508:  0xB896,\n\t2509:  0xB897,\n\t2510:  0xB898,\n\t2511:  0xB899,\n\t2512:  0xB89A,\n\t2513:  0xB89B,\n\t2514:  0xB89C,\n\t2515:  0xB89D,\n\t2516:  0xB89E,\n\t2517:  0xB89F,\n\t2518:  0xB8A0,\n\t2519:  0xB8A1,\n\t2520:  0xB8A2,\n\t2521:  0xB8A3,\n\t2522:  0xB8A4,\n\t2523:  0xB8A5,\n\t2524:  0xB8A6,\n\t2525:  0xB8A7,\n\t2526:  0xB8A9,\n\t2527:  0xB8AA,\n\t2528:  0xB8AB,\n\t2529:  0xB8AC,\n\t2530:  0xB8AD,\n\t2531:  0xB8AE,\n\t2532:  0xB8AF,\n\t2533:  0xB8B1,\n\t2534:  0xB8B2,\n\t2535:  0xB8B3,\n\t2536:  0xB8B5,\n\t2537:  0xB8B6,\n\t2538:  0xB8B7,\n\t2539:  0xB8B9,\n\t2540:  0xB8BA,\n\t2541:  0xB8BB,\n\t2542:  0xB8BC,\n\t2543:  0xB8BD,\n\t2544:  0xB8BE,\n\t2545:  0xB8BF,\n\t2546:  0xB8C2,\n\t2547:  0xB8C4,\n\t2548:  0xB8C6,\n\t2549:  0xB8C7,\n\t2550:  0xB8C8,\n\t2551:  0xB8C9,\n\t2552:  0xB8CA,\n\t2553:  0xB8CB,\n\t2554:  0xB8CD,\n\t2555:  0xB8CE,\n\t2556:  0xB8CF,\n\t2557:  0xB8D1,\n\t2558:  0xB8D2,\n\t2559:  0xB8D3,\n\t2560:  0xB8D5,\n\t2561:  0xB8D6,\n\t2562:  0xB8D7,\n\t2563:  0xB8D8,\n\t2564:  0xB8D9,\n\t2565:  0xB8DA,\n\t2566:  0xB8DB,\n\t2567:  0xB8DC,\n\t2568:  0xB8DE,\n\t2569:  0xB8E0,\n\t2570:  0xB8E2,\n\t2571:  0xB8E3,\n\t2572:  0xB8E4,\n\t2573:  0xB8E5,\n\t2574:  0xB8E6,\n\t2575:  0xB8E7,\n\t2576:  0xB8EA,\n\t2577:  0xB8EB,\n\t2578:  0xB8ED,\n\t2579:  0xB8EE,\n\t2580:  0xB8EF,\n\t2581:  0xB8F1,\n\t2582:  0xB8F2,\n\t2583:  0xB8F3,\n\t2584:  0xB8F4,\n\t2585:  0xB8F5,\n\t2586:  0xB8F6,\n\t2587:  0xB8F7,\n\t2588:  0xB8FA,\n\t2589:  0xB8FC,\n\t2590:  0xB8FE,\n\t2591:  0xB8FF,\n\t2592:  0xB900,\n\t2593:  0xB901,\n\t2594:  0xB902,\n\t2595:  0xB903,\n\t2596:  0xB905,\n\t2597:  0xB906,\n\t2598:  0xB907,\n\t2599:  0xB908,\n\t2600:  0xB909,\n\t2601:  0xB90A,\n\t2602:  0xB90B,\n\t2603:  0xB90C,\n\t2604:  0xB90D,\n\t2605:  0xB90E,\n\t2606:  0xB90F,\n\t2607:  0xB910,\n\t2608:  0xB911,\n\t2609:  0xB912,\n\t2610:  0xB913,\n\t2611:  0xB914,\n\t2612:  0xB915,\n\t2613:  0xB916,\n\t2614:  0xB917,\n\t2615:  0xB919,\n\t2616:  0xB91A,\n\t2617:  0xB91B,\n\t2618:  0xB91C,\n\t2619:  0xB91D,\n\t2620:  0xB91E,\n\t2621:  0xB91F,\n\t2622:  0xB921,\n\t2623:  0xB922,\n\t2624:  0xB923,\n\t2625:  0xB924,\n\t2626:  0xB925,\n\t2627:  0xB926,\n\t2628:  0xB927,\n\t2629:  0xB928,\n\t2630:  0xB929,\n\t2631:  0xB92A,\n\t2632:  0xB92B,\n\t2633:  0xB92C,\n\t2634:  0xB92D,\n\t2635:  0xB92E,\n\t2636:  0xB92F,\n\t2637:  0xB930,\n\t2638:  0xB931,\n\t2639:  0xB932,\n\t2640:  0xB933,\n\t2641:  0xB934,\n\t2642:  0xB935,\n\t2643:  0xB936,\n\t2644:  0xB937,\n\t2645:  0xB938,\n\t2646:  0xB939,\n\t2647:  0xB93A,\n\t2648:  0xB93B,\n\t2649:  0xB93E,\n\t2650:  0xB93F,\n\t2651:  0xB941,\n\t2652:  0xB942,\n\t2653:  0xB943,\n\t2654:  0xB945,\n\t2655:  0xB946,\n\t2656:  0xB947,\n\t2657:  0xB948,\n\t2658:  0xB949,\n\t2659:  0xB94A,\n\t2660:  0xB94B,\n\t2661:  0xB94D,\n\t2662:  0xB94E,\n\t2663:  0xB950,\n\t2664:  0xB952,\n\t2665:  0xB953,\n\t2666:  0xB954,\n\t2667:  0xB955,\n\t2668:  0xB956,\n\t2669:  0xB957,\n\t2670:  0xB95A,\n\t2671:  0xB95B,\n\t2672:  0xB95D,\n\t2673:  0xB95E,\n\t2674:  0xB95F,\n\t2675:  0xB961,\n\t2676:  0xB962,\n\t2677:  0xB963,\n\t2678:  0xB964,\n\t2679:  0xB965,\n\t2680:  0xB966,\n\t2681:  0xB967,\n\t2682:  0xB96A,\n\t2683:  0xB96C,\n\t2684:  0xB96E,\n\t2685:  0xB96F,\n\t2686:  0xB970,\n\t2687:  0xB971,\n\t2688:  0xB972,\n\t2689:  0xB973,\n\t2690:  0xB976,\n\t2691:  0xB977,\n\t2692:  0xB979,\n\t2693:  0xB97A,\n\t2694:  0xB97B,\n\t2695:  0xB97D,\n\t2696:  0xB97E,\n\t2697:  0xB97F,\n\t2698:  0xB980,\n\t2699:  0xB981,\n\t2700:  0xB982,\n\t2701:  0xB983,\n\t2702:  0xB986,\n\t2703:  0xB988,\n\t2704:  0xB98B,\n\t2705:  0xB98C,\n\t2706:  0xB98F,\n\t2707:  0xB990,\n\t2708:  0xB991,\n\t2709:  0xB992,\n\t2710:  0xB993,\n\t2711:  0xB994,\n\t2712:  0xB995,\n\t2713:  0xB996,\n\t2714:  0xB997,\n\t2715:  0xB998,\n\t2716:  0xB999,\n\t2717:  0xB99A,\n\t2718:  0xB99B,\n\t2719:  0xB99C,\n\t2720:  0xB99D,\n\t2721:  0xB99E,\n\t2722:  0xB99F,\n\t2723:  0xB9A0,\n\t2724:  0xB9A1,\n\t2725:  0xB9A2,\n\t2726:  0xB9A3,\n\t2727:  0xB9A4,\n\t2728:  0xB9A5,\n\t2729:  0xB9A6,\n\t2730:  0xB9A7,\n\t2731:  0xB9A8,\n\t2732:  0xB9A9,\n\t2733:  0xB9AA,\n\t2734:  0xB9AB,\n\t2735:  0xB9AE,\n\t2736:  0xB9AF,\n\t2737:  0xB9B1,\n\t2738:  0xB9B2,\n\t2739:  0xB9B3,\n\t2740:  0xB9B5,\n\t2741:  0xB9B6,\n\t2742:  0xB9B7,\n\t2743:  0xB9B8,\n\t2744:  0xB9B9,\n\t2745:  0xB9BA,\n\t2746:  0xB9BB,\n\t2747:  0xB9BE,\n\t2748:  0xB9C0,\n\t2749:  0xB9C2,\n\t2750:  0xB9C3,\n\t2751:  0xB9C4,\n\t2752:  0xB9C5,\n\t2753:  0xB9C6,\n\t2754:  0xB9C7,\n\t2755:  0xB9CA,\n\t2756:  0xB9CB,\n\t2757:  0xB9CD,\n\t2758:  0xB9D3,\n\t2759:  0xB9D4,\n\t2760:  0xB9D5,\n\t2761:  0xB9D6,\n\t2762:  0xB9D7,\n\t2763:  0xB9DA,\n\t2764:  0xB9DC,\n\t2765:  0xB9DF,\n\t2766:  0xB9E0,\n\t2767:  0xB9E2,\n\t2768:  0xB9E6,\n\t2769:  0xB9E7,\n\t2770:  0xB9E9,\n\t2771:  0xB9EA,\n\t2772:  0xB9EB,\n\t2773:  0xB9ED,\n\t2774:  0xB9EE,\n\t2775:  0xB9EF,\n\t2776:  0xB9F0,\n\t2777:  0xB9F1,\n\t2778:  0xB9F2,\n\t2779:  0xB9F3,\n\t2780:  0xB9F6,\n\t2781:  0xB9FB,\n\t2782:  0xB9FC,\n\t2783:  0xB9FD,\n\t2784:  0xB9FE,\n\t2785:  0xB9FF,\n\t2786:  0xBA02,\n\t2787:  0xBA03,\n\t2788:  0xBA04,\n\t2789:  0xBA05,\n\t2790:  0xBA06,\n\t2791:  0xBA07,\n\t2792:  0xBA09,\n\t2793:  0xBA0A,\n\t2794:  0xBA0B,\n\t2795:  0xBA0C,\n\t2796:  0xBA0D,\n\t2797:  0xBA0E,\n\t2798:  0xBA0F,\n\t2799:  0xBA10,\n\t2800:  0xBA11,\n\t2801:  0xBA12,\n\t2802:  0xBA13,\n\t2803:  0xBA14,\n\t2804:  0xBA16,\n\t2805:  0xBA17,\n\t2806:  0xBA18,\n\t2807:  0xBA19,\n\t2808:  0xBA1A,\n\t2809:  0xBA1B,\n\t2810:  0xBA1C,\n\t2811:  0xBA1D,\n\t2812:  0xBA1E,\n\t2813:  0xBA1F,\n\t2814:  0xBA20,\n\t2815:  0xBA21,\n\t2816:  0xBA22,\n\t2817:  0xBA23,\n\t2818:  0xBA24,\n\t2819:  0xBA25,\n\t2820:  0xBA26,\n\t2821:  0xBA27,\n\t2822:  0xBA28,\n\t2823:  0xBA29,\n\t2824:  0xBA2A,\n\t2825:  0xBA2B,\n\t2826:  0xBA2C,\n\t2827:  0xBA2D,\n\t2828:  0xBA2E,\n\t2829:  0xBA2F,\n\t2830:  0xBA30,\n\t2831:  0xBA31,\n\t2832:  0xBA32,\n\t2833:  0xBA33,\n\t2834:  0xBA34,\n\t2835:  0xBA35,\n\t2836:  0xBA36,\n\t2837:  0xBA37,\n\t2838:  0xBA3A,\n\t2839:  0xBA3B,\n\t2840:  0xBA3D,\n\t2841:  0xBA3E,\n\t2842:  0xBA3F,\n\t2843:  0xBA41,\n\t2844:  0xBA43,\n\t2845:  0xBA44,\n\t2846:  0xBA45,\n\t2847:  0xBA46,\n\t2848:  0xBA47,\n\t2849:  0xBA4A,\n\t2850:  0xBA4C,\n\t2851:  0xBA4F,\n\t2852:  0xBA50,\n\t2853:  0xBA51,\n\t2854:  0xBA52,\n\t2855:  0xBA56,\n\t2856:  0xBA57,\n\t2857:  0xBA59,\n\t2858:  0xBA5A,\n\t2859:  0xBA5B,\n\t2860:  0xBA5D,\n\t2861:  0xBA5E,\n\t2862:  0xBA5F,\n\t2863:  0xBA60,\n\t2864:  0xBA61,\n\t2865:  0xBA62,\n\t2866:  0xBA63,\n\t2867:  0xBA66,\n\t2868:  0xBA6A,\n\t2869:  0xBA6B,\n\t2870:  0xBA6C,\n\t2871:  0xBA6D,\n\t2872:  0xBA6E,\n\t2873:  0xBA6F,\n\t2874:  0xBA72,\n\t2875:  0xBA73,\n\t2876:  0xBA75,\n\t2877:  0xBA76,\n\t2878:  0xBA77,\n\t2879:  0xBA79,\n\t2880:  0xBA7A,\n\t2881:  0xBA7B,\n\t2882:  0xBA7C,\n\t2883:  0xBA7D,\n\t2884:  0xBA7E,\n\t2885:  0xBA7F,\n\t2886:  0xBA80,\n\t2887:  0xBA81,\n\t2888:  0xBA82,\n\t2889:  0xBA86,\n\t2890:  0xBA88,\n\t2891:  0xBA89,\n\t2892:  0xBA8A,\n\t2893:  0xBA8B,\n\t2894:  0xBA8D,\n\t2895:  0xBA8E,\n\t2896:  0xBA8F,\n\t2897:  0xBA90,\n\t2898:  0xBA91,\n\t2899:  0xBA92,\n\t2900:  0xBA93,\n\t2901:  0xBA94,\n\t2902:  0xBA95,\n\t2903:  0xBA96,\n\t2904:  0xBA97,\n\t2905:  0xBA98,\n\t2906:  0xBA99,\n\t2907:  0xBA9A,\n\t2908:  0xBA9B,\n\t2909:  0xBA9C,\n\t2910:  0xBA9D,\n\t2911:  0xBA9E,\n\t2912:  0xBA9F,\n\t2913:  0xBAA0,\n\t2914:  0xBAA1,\n\t2915:  0xBAA2,\n\t2916:  0xBAA3,\n\t2917:  0xBAA4,\n\t2918:  0xBAA5,\n\t2919:  0xBAA6,\n\t2920:  0xBAA7,\n\t2921:  0xBAAA,\n\t2922:  0xBAAD,\n\t2923:  0xBAAE,\n\t2924:  0xBAAF,\n\t2925:  0xBAB1,\n\t2926:  0xBAB3,\n\t2927:  0xBAB4,\n\t2928:  0xBAB5,\n\t2929:  0xBAB6,\n\t2930:  0xBAB7,\n\t2931:  0xBABA,\n\t2932:  0xBABC,\n\t2933:  0xBABE,\n\t2934:  0xBABF,\n\t2935:  0xBAC0,\n\t2936:  0xBAC1,\n\t2937:  0xBAC2,\n\t2938:  0xBAC3,\n\t2939:  0xBAC5,\n\t2940:  0xBAC6,\n\t2941:  0xBAC7,\n\t2942:  0xBAC9,\n\t2943:  0xBACA,\n\t2944:  0xBACB,\n\t2945:  0xBACC,\n\t2946:  0xBACD,\n\t2947:  0xBACE,\n\t2948:  0xBACF,\n\t2949:  0xBAD0,\n\t2950:  0xBAD1,\n\t2951:  0xBAD2,\n\t2952:  0xBAD3,\n\t2953:  0xBAD4,\n\t2954:  0xBAD5,\n\t2955:  0xBAD6,\n\t2956:  0xBAD7,\n\t2957:  0xBADA,\n\t2958:  0xBADB,\n\t2959:  0xBADC,\n\t2960:  0xBADD,\n\t2961:  0xBADE,\n\t2962:  0xBADF,\n\t2963:  0xBAE0,\n\t2964:  0xBAE1,\n\t2965:  0xBAE2,\n\t2966:  0xBAE3,\n\t2967:  0xBAE4,\n\t2968:  0xBAE5,\n\t2969:  0xBAE6,\n\t2970:  0xBAE7,\n\t2971:  0xBAE8,\n\t2972:  0xBAE9,\n\t2973:  0xBAEA,\n\t2974:  0xBAEB,\n\t2975:  0xBAEC,\n\t2976:  0xBAED,\n\t2977:  0xBAEE,\n\t2978:  0xBAEF,\n\t2979:  0xBAF0,\n\t2980:  0xBAF1,\n\t2981:  0xBAF2,\n\t2982:  0xBAF3,\n\t2983:  0xBAF4,\n\t2984:  0xBAF5,\n\t2985:  0xBAF6,\n\t2986:  0xBAF7,\n\t2987:  0xBAF8,\n\t2988:  0xBAF9,\n\t2989:  0xBAFA,\n\t2990:  0xBAFB,\n\t2991:  0xBAFD,\n\t2992:  0xBAFE,\n\t2993:  0xBAFF,\n\t2994:  0xBB01,\n\t2995:  0xBB02,\n\t2996:  0xBB03,\n\t2997:  0xBB05,\n\t2998:  0xBB06,\n\t2999:  0xBB07,\n\t3000:  0xBB08,\n\t3001:  0xBB09,\n\t3002:  0xBB0A,\n\t3003:  0xBB0B,\n\t3004:  0xBB0C,\n\t3005:  0xBB0E,\n\t3006:  0xBB10,\n\t3007:  0xBB12,\n\t3008:  0xBB13,\n\t3009:  0xBB14,\n\t3010:  0xBB15,\n\t3011:  0xBB16,\n\t3012:  0xBB17,\n\t3013:  0xBB19,\n\t3014:  0xBB1A,\n\t3015:  0xBB1B,\n\t3016:  0xBB1D,\n\t3017:  0xBB1E,\n\t3018:  0xBB1F,\n\t3019:  0xBB21,\n\t3020:  0xBB22,\n\t3021:  0xBB23,\n\t3022:  0xBB24,\n\t3023:  0xBB25,\n\t3024:  0xBB26,\n\t3025:  0xBB27,\n\t3026:  0xBB28,\n\t3027:  0xBB2A,\n\t3028:  0xBB2C,\n\t3029:  0xBB2D,\n\t3030:  0xBB2E,\n\t3031:  0xBB2F,\n\t3032:  0xBB30,\n\t3033:  0xBB31,\n\t3034:  0xBB32,\n\t3035:  0xBB33,\n\t3036:  0xBB37,\n\t3037:  0xBB39,\n\t3038:  0xBB3A,\n\t3039:  0xBB3F,\n\t3040:  0xBB40,\n\t3041:  0xBB41,\n\t3042:  0xBB42,\n\t3043:  0xBB43,\n\t3044:  0xBB46,\n\t3045:  0xBB48,\n\t3046:  0xBB4A,\n\t3047:  0xBB4B,\n\t3048:  0xBB4C,\n\t3049:  0xBB4E,\n\t3050:  0xBB51,\n\t3051:  0xBB52,\n\t3052:  0xBB53,\n\t3053:  0xBB55,\n\t3054:  0xBB56,\n\t3055:  0xBB57,\n\t3056:  0xBB59,\n\t3057:  0xBB5A,\n\t3058:  0xBB5B,\n\t3059:  0xBB5C,\n\t3060:  0xBB5D,\n\t3061:  0xBB5E,\n\t3062:  0xBB5F,\n\t3063:  0xBB60,\n\t3064:  0xBB62,\n\t3065:  0xBB64,\n\t3066:  0xBB65,\n\t3067:  0xBB66,\n\t3068:  0xBB67,\n\t3069:  0xBB68,\n\t3070:  0xBB69,\n\t3071:  0xBB6A,\n\t3072:  0xBB6B,\n\t3073:  0xBB6D,\n\t3074:  0xBB6E,\n\t3075:  0xBB6F,\n\t3076:  0xBB70,\n\t3077:  0xBB71,\n\t3078:  0xBB72,\n\t3079:  0xBB73,\n\t3080:  0xBB74,\n\t3081:  0xBB75,\n\t3082:  0xBB76,\n\t3083:  0xBB77,\n\t3084:  0xBB78,\n\t3085:  0xBB79,\n\t3086:  0xBB7A,\n\t3087:  0xBB7B,\n\t3088:  0xBB7C,\n\t3089:  0xBB7D,\n\t3090:  0xBB7E,\n\t3091:  0xBB7F,\n\t3092:  0xBB80,\n\t3093:  0xBB81,\n\t3094:  0xBB82,\n\t3095:  0xBB83,\n\t3096:  0xBB84,\n\t3097:  0xBB85,\n\t3098:  0xBB86,\n\t3099:  0xBB87,\n\t3100:  0xBB89,\n\t3101:  0xBB8A,\n\t3102:  0xBB8B,\n\t3103:  0xBB8D,\n\t3104:  0xBB8E,\n\t3105:  0xBB8F,\n\t3106:  0xBB91,\n\t3107:  0xBB92,\n\t3108:  0xBB93,\n\t3109:  0xBB94,\n\t3110:  0xBB95,\n\t3111:  0xBB96,\n\t3112:  0xBB97,\n\t3113:  0xBB98,\n\t3114:  0xBB99,\n\t3115:  0xBB9A,\n\t3116:  0xBB9B,\n\t3117:  0xBB9C,\n\t3118:  0xBB9D,\n\t3119:  0xBB9E,\n\t3120:  0xBB9F,\n\t3121:  0xBBA0,\n\t3122:  0xBBA1,\n\t3123:  0xBBA2,\n\t3124:  0xBBA3,\n\t3125:  0xBBA5,\n\t3126:  0xBBA6,\n\t3127:  0xBBA7,\n\t3128:  0xBBA9,\n\t3129:  0xBBAA,\n\t3130:  0xBBAB,\n\t3131:  0xBBAD,\n\t3132:  0xBBAE,\n\t3133:  0xBBAF,\n\t3134:  0xBBB0,\n\t3135:  0xBBB1,\n\t3136:  0xBBB2,\n\t3137:  0xBBB3,\n\t3138:  0xBBB5,\n\t3139:  0xBBB6,\n\t3140:  0xBBB8,\n\t3141:  0xBBB9,\n\t3142:  0xBBBA,\n\t3143:  0xBBBB,\n\t3144:  0xBBBC,\n\t3145:  0xBBBD,\n\t3146:  0xBBBE,\n\t3147:  0xBBBF,\n\t3148:  0xBBC1,\n\t3149:  0xBBC2,\n\t3150:  0xBBC3,\n\t3151:  0xBBC5,\n\t3152:  0xBBC6,\n\t3153:  0xBBC7,\n\t3154:  0xBBC9,\n\t3155:  0xBBCA,\n\t3156:  0xBBCB,\n\t3157:  0xBBCC,\n\t3158:  0xBBCD,\n\t3159:  0xBBCE,\n\t3160:  0xBBCF,\n\t3161:  0xBBD1,\n\t3162:  0xBBD2,\n\t3163:  0xBBD4,\n\t3164:  0xBBD5,\n\t3165:  0xBBD6,\n\t3166:  0xBBD7,\n\t3167:  0xBBD8,\n\t3168:  0xBBD9,\n\t3169:  0xBBDA,\n\t3170:  0xBBDB,\n\t3171:  0xBBDC,\n\t3172:  0xBBDD,\n\t3173:  0xBBDE,\n\t3174:  0xBBDF,\n\t3175:  0xBBE0,\n\t3176:  0xBBE1,\n\t3177:  0xBBE2,\n\t3178:  0xBBE3,\n\t3179:  0xBBE4,\n\t3180:  0xBBE5,\n\t3181:  0xBBE6,\n\t3182:  0xBBE7,\n\t3183:  0xBBE8,\n\t3184:  0xBBE9,\n\t3185:  0xBBEA,\n\t3186:  0xBBEB,\n\t3187:  0xBBEC,\n\t3188:  0xBBED,\n\t3189:  0xBBEE,\n\t3190:  0xBBEF,\n\t3191:  0xBBF0,\n\t3192:  0xBBF1,\n\t3193:  0xBBF2,\n\t3194:  0xBBF3,\n\t3195:  0xBBF4,\n\t3196:  0xBBF5,\n\t3197:  0xBBF6,\n\t3198:  0xBBF7,\n\t3199:  0xBBFA,\n\t3200:  0xBBFB,\n\t3201:  0xBBFD,\n\t3202:  0xBBFE,\n\t3203:  0xBC01,\n\t3204:  0xBC03,\n\t3205:  0xBC04,\n\t3206:  0xBC05,\n\t3207:  0xBC06,\n\t3208:  0xBC07,\n\t3209:  0xBC0A,\n\t3210:  0xBC0E,\n\t3211:  0xBC10,\n\t3212:  0xBC12,\n\t3213:  0xBC13,\n\t3214:  0xBC19,\n\t3215:  0xBC1A,\n\t3216:  0xBC20,\n\t3217:  0xBC21,\n\t3218:  0xBC22,\n\t3219:  0xBC23,\n\t3220:  0xBC26,\n\t3221:  0xBC28,\n\t3222:  0xBC2A,\n\t3223:  0xBC2B,\n\t3224:  0xBC2C,\n\t3225:  0xBC2E,\n\t3226:  0xBC2F,\n\t3227:  0xBC32,\n\t3228:  0xBC33,\n\t3229:  0xBC35,\n\t3230:  0xBC36,\n\t3231:  0xBC37,\n\t3232:  0xBC39,\n\t3233:  0xBC3A,\n\t3234:  0xBC3B,\n\t3235:  0xBC3C,\n\t3236:  0xBC3D,\n\t3237:  0xBC3E,\n\t3238:  0xBC3F,\n\t3239:  0xBC42,\n\t3240:  0xBC46,\n\t3241:  0xBC47,\n\t3242:  0xBC48,\n\t3243:  0xBC4A,\n\t3244:  0xBC4B,\n\t3245:  0xBC4E,\n\t3246:  0xBC4F,\n\t3247:  0xBC51,\n\t3248:  0xBC52,\n\t3249:  0xBC53,\n\t3250:  0xBC54,\n\t3251:  0xBC55,\n\t3252:  0xBC56,\n\t3253:  0xBC57,\n\t3254:  0xBC58,\n\t3255:  0xBC59,\n\t3256:  0xBC5A,\n\t3257:  0xBC5B,\n\t3258:  0xBC5C,\n\t3259:  0xBC5E,\n\t3260:  0xBC5F,\n\t3261:  0xBC60,\n\t3262:  0xBC61,\n\t3263:  0xBC62,\n\t3264:  0xBC63,\n\t3265:  0xBC64,\n\t3266:  0xBC65,\n\t3267:  0xBC66,\n\t3268:  0xBC67,\n\t3269:  0xBC68,\n\t3270:  0xBC69,\n\t3271:  0xBC6A,\n\t3272:  0xBC6B,\n\t3273:  0xBC6C,\n\t3274:  0xBC6D,\n\t3275:  0xBC6E,\n\t3276:  0xBC6F,\n\t3277:  0xBC70,\n\t3278:  0xBC71,\n\t3279:  0xBC72,\n\t3280:  0xBC73,\n\t3281:  0xBC74,\n\t3282:  0xBC75,\n\t3283:  0xBC76,\n\t3284:  0xBC77,\n\t3285:  0xBC78,\n\t3286:  0xBC79,\n\t3287:  0xBC7A,\n\t3288:  0xBC7B,\n\t3289:  0xBC7C,\n\t3290:  0xBC7D,\n\t3291:  0xBC7E,\n\t3292:  0xBC7F,\n\t3293:  0xBC80,\n\t3294:  0xBC81,\n\t3295:  0xBC82,\n\t3296:  0xBC83,\n\t3297:  0xBC86,\n\t3298:  0xBC87,\n\t3299:  0xBC89,\n\t3300:  0xBC8A,\n\t3301:  0xBC8D,\n\t3302:  0xBC8F,\n\t3303:  0xBC90,\n\t3304:  0xBC91,\n\t3305:  0xBC92,\n\t3306:  0xBC93,\n\t3307:  0xBC96,\n\t3308:  0xBC98,\n\t3309:  0xBC9B,\n\t3310:  0xBC9C,\n\t3311:  0xBC9D,\n\t3312:  0xBC9E,\n\t3313:  0xBC9F,\n\t3314:  0xBCA2,\n\t3315:  0xBCA3,\n\t3316:  0xBCA5,\n\t3317:  0xBCA6,\n\t3318:  0xBCA9,\n\t3319:  0xBCAA,\n\t3320:  0xBCAB,\n\t3321:  0xBCAC,\n\t3322:  0xBCAD,\n\t3323:  0xBCAE,\n\t3324:  0xBCAF,\n\t3325:  0xBCB2,\n\t3326:  0xBCB6,\n\t3327:  0xBCB7,\n\t3328:  0xBCB8,\n\t3329:  0xBCB9,\n\t3330:  0xBCBA,\n\t3331:  0xBCBB,\n\t3332:  0xBCBE,\n\t3333:  0xBCBF,\n\t3334:  0xBCC1,\n\t3335:  0xBCC2,\n\t3336:  0xBCC3,\n\t3337:  0xBCC5,\n\t3338:  0xBCC6,\n\t3339:  0xBCC7,\n\t3340:  0xBCC8,\n\t3341:  0xBCC9,\n\t3342:  0xBCCA,\n\t3343:  0xBCCB,\n\t3344:  0xBCCC,\n\t3345:  0xBCCE,\n\t3346:  0xBCD2,\n\t3347:  0xBCD3,\n\t3348:  0xBCD4,\n\t3349:  0xBCD6,\n\t3350:  0xBCD7,\n\t3351:  0xBCD9,\n\t3352:  0xBCDA,\n\t3353:  0xBCDB,\n\t3354:  0xBCDD,\n\t3355:  0xBCDE,\n\t3356:  0xBCDF,\n\t3357:  0xBCE0,\n\t3358:  0xBCE1,\n\t3359:  0xBCE2,\n\t3360:  0xBCE3,\n\t3361:  0xBCE4,\n\t3362:  0xBCE5,\n\t3363:  0xBCE6,\n\t3364:  0xBCE7,\n\t3365:  0xBCE8,\n\t3366:  0xBCE9,\n\t3367:  0xBCEA,\n\t3368:  0xBCEB,\n\t3369:  0xBCEC,\n\t3370:  0xBCED,\n\t3371:  0xBCEE,\n\t3372:  0xBCEF,\n\t3373:  0xBCF0,\n\t3374:  0xBCF1,\n\t3375:  0xBCF2,\n\t3376:  0xBCF3,\n\t3377:  0xBCF7,\n\t3378:  0xBCF9,\n\t3379:  0xBCFA,\n\t3380:  0xBCFB,\n\t3381:  0xBCFD,\n\t3382:  0xBCFE,\n\t3383:  0xBCFF,\n\t3384:  0xBD00,\n\t3385:  0xBD01,\n\t3386:  0xBD02,\n\t3387:  0xBD03,\n\t3388:  0xBD06,\n\t3389:  0xBD08,\n\t3390:  0xBD0A,\n\t3391:  0xBD0B,\n\t3392:  0xBD0C,\n\t3393:  0xBD0D,\n\t3394:  0xBD0E,\n\t3395:  0xBD0F,\n\t3396:  0xBD11,\n\t3397:  0xBD12,\n\t3398:  0xBD13,\n\t3399:  0xBD15,\n\t3400:  0xBD16,\n\t3401:  0xBD17,\n\t3402:  0xBD18,\n\t3403:  0xBD19,\n\t3404:  0xBD1A,\n\t3405:  0xBD1B,\n\t3406:  0xBD1C,\n\t3407:  0xBD1D,\n\t3408:  0xBD1E,\n\t3409:  0xBD1F,\n\t3410:  0xBD20,\n\t3411:  0xBD21,\n\t3412:  0xBD22,\n\t3413:  0xBD23,\n\t3414:  0xBD25,\n\t3415:  0xBD26,\n\t3416:  0xBD27,\n\t3417:  0xBD28,\n\t3418:  0xBD29,\n\t3419:  0xBD2A,\n\t3420:  0xBD2B,\n\t3421:  0xBD2D,\n\t3422:  0xBD2E,\n\t3423:  0xBD2F,\n\t3424:  0xBD30,\n\t3425:  0xBD31,\n\t3426:  0xBD32,\n\t3427:  0xBD33,\n\t3428:  0xBD34,\n\t3429:  0xBD35,\n\t3430:  0xBD36,\n\t3431:  0xBD37,\n\t3432:  0xBD38,\n\t3433:  0xBD39,\n\t3434:  0xBD3A,\n\t3435:  0xBD3B,\n\t3436:  0xBD3C,\n\t3437:  0xBD3D,\n\t3438:  0xBD3E,\n\t3439:  0xBD3F,\n\t3440:  0xBD41,\n\t3441:  0xBD42,\n\t3442:  0xBD43,\n\t3443:  0xBD44,\n\t3444:  0xBD45,\n\t3445:  0xBD46,\n\t3446:  0xBD47,\n\t3447:  0xBD4A,\n\t3448:  0xBD4B,\n\t3449:  0xBD4D,\n\t3450:  0xBD4E,\n\t3451:  0xBD4F,\n\t3452:  0xBD51,\n\t3453:  0xBD52,\n\t3454:  0xBD53,\n\t3455:  0xBD54,\n\t3456:  0xBD55,\n\t3457:  0xBD56,\n\t3458:  0xBD57,\n\t3459:  0xBD5A,\n\t3460:  0xBD5B,\n\t3461:  0xBD5C,\n\t3462:  0xBD5D,\n\t3463:  0xBD5E,\n\t3464:  0xBD5F,\n\t3465:  0xBD60,\n\t3466:  0xBD61,\n\t3467:  0xBD62,\n\t3468:  0xBD63,\n\t3469:  0xBD65,\n\t3470:  0xBD66,\n\t3471:  0xBD67,\n\t3472:  0xBD69,\n\t3473:  0xBD6A,\n\t3474:  0xBD6B,\n\t3475:  0xBD6C,\n\t3476:  0xBD6D,\n\t3477:  0xBD6E,\n\t3478:  0xBD6F,\n\t3479:  0xBD70,\n\t3480:  0xBD71,\n\t3481:  0xBD72,\n\t3482:  0xBD73,\n\t3483:  0xBD74,\n\t3484:  0xBD75,\n\t3485:  0xBD76,\n\t3486:  0xBD77,\n\t3487:  0xBD78,\n\t3488:  0xBD79,\n\t3489:  0xBD7A,\n\t3490:  0xBD7B,\n\t3491:  0xBD7C,\n\t3492:  0xBD7D,\n\t3493:  0xBD7E,\n\t3494:  0xBD7F,\n\t3495:  0xBD82,\n\t3496:  0xBD83,\n\t3497:  0xBD85,\n\t3498:  0xBD86,\n\t3499:  0xBD8B,\n\t3500:  0xBD8C,\n\t3501:  0xBD8D,\n\t3502:  0xBD8E,\n\t3503:  0xBD8F,\n\t3504:  0xBD92,\n\t3505:  0xBD94,\n\t3506:  0xBD96,\n\t3507:  0xBD97,\n\t3508:  0xBD98,\n\t3509:  0xBD9B,\n\t3510:  0xBD9D,\n\t3511:  0xBD9E,\n\t3512:  0xBD9F,\n\t3513:  0xBDA0,\n\t3514:  0xBDA1,\n\t3515:  0xBDA2,\n\t3516:  0xBDA3,\n\t3517:  0xBDA5,\n\t3518:  0xBDA6,\n\t3519:  0xBDA7,\n\t3520:  0xBDA8,\n\t3521:  0xBDA9,\n\t3522:  0xBDAA,\n\t3523:  0xBDAB,\n\t3524:  0xBDAC,\n\t3525:  0xBDAD,\n\t3526:  0xBDAE,\n\t3527:  0xBDAF,\n\t3528:  0xBDB1,\n\t3529:  0xBDB2,\n\t3530:  0xBDB3,\n\t3531:  0xBDB4,\n\t3532:  0xBDB5,\n\t3533:  0xBDB6,\n\t3534:  0xBDB7,\n\t3535:  0xBDB9,\n\t3536:  0xBDBA,\n\t3537:  0xBDBB,\n\t3538:  0xBDBC,\n\t3539:  0xBDBD,\n\t3540:  0xBDBE,\n\t3541:  0xBDBF,\n\t3542:  0xBDC0,\n\t3543:  0xBDC1,\n\t3544:  0xBDC2,\n\t3545:  0xBDC3,\n\t3546:  0xBDC4,\n\t3547:  0xBDC5,\n\t3548:  0xBDC6,\n\t3549:  0xBDC7,\n\t3550:  0xBDC8,\n\t3551:  0xBDC9,\n\t3552:  0xBDCA,\n\t3553:  0xBDCB,\n\t3554:  0xBDCC,\n\t3555:  0xBDCD,\n\t3556:  0xBDCE,\n\t3557:  0xBDCF,\n\t3558:  0xBDD0,\n\t3559:  0xBDD1,\n\t3560:  0xBDD2,\n\t3561:  0xBDD3,\n\t3562:  0xBDD6,\n\t3563:  0xBDD7,\n\t3564:  0xBDD9,\n\t3565:  0xBDDA,\n\t3566:  0xBDDB,\n\t3567:  0xBDDD,\n\t3568:  0xBDDE,\n\t3569:  0xBDDF,\n\t3570:  0xBDE0,\n\t3571:  0xBDE1,\n\t3572:  0xBDE2,\n\t3573:  0xBDE3,\n\t3574:  0xBDE4,\n\t3575:  0xBDE5,\n\t3576:  0xBDE6,\n\t3577:  0xBDE7,\n\t3578:  0xBDE8,\n\t3579:  0xBDEA,\n\t3580:  0xBDEB,\n\t3581:  0xBDEC,\n\t3582:  0xBDED,\n\t3583:  0xBDEE,\n\t3584:  0xBDEF,\n\t3585:  0xBDF1,\n\t3586:  0xBDF2,\n\t3587:  0xBDF3,\n\t3588:  0xBDF5,\n\t3589:  0xBDF6,\n\t3590:  0xBDF7,\n\t3591:  0xBDF9,\n\t3592:  0xBDFA,\n\t3593:  0xBDFB,\n\t3594:  0xBDFC,\n\t3595:  0xBDFD,\n\t3596:  0xBDFE,\n\t3597:  0xBDFF,\n\t3598:  0xBE01,\n\t3599:  0xBE02,\n\t3600:  0xBE04,\n\t3601:  0xBE06,\n\t3602:  0xBE07,\n\t3603:  0xBE08,\n\t3604:  0xBE09,\n\t3605:  0xBE0A,\n\t3606:  0xBE0B,\n\t3607:  0xBE0E,\n\t3608:  0xBE0F,\n\t3609:  0xBE11,\n\t3610:  0xBE12,\n\t3611:  0xBE13,\n\t3612:  0xBE15,\n\t3613:  0xBE16,\n\t3614:  0xBE17,\n\t3615:  0xBE18,\n\t3616:  0xBE19,\n\t3617:  0xBE1A,\n\t3618:  0xBE1B,\n\t3619:  0xBE1E,\n\t3620:  0xBE20,\n\t3621:  0xBE21,\n\t3622:  0xBE22,\n\t3623:  0xBE23,\n\t3624:  0xBE24,\n\t3625:  0xBE25,\n\t3626:  0xBE26,\n\t3627:  0xBE27,\n\t3628:  0xBE28,\n\t3629:  0xBE29,\n\t3630:  0xBE2A,\n\t3631:  0xBE2B,\n\t3632:  0xBE2C,\n\t3633:  0xBE2D,\n\t3634:  0xBE2E,\n\t3635:  0xBE2F,\n\t3636:  0xBE30,\n\t3637:  0xBE31,\n\t3638:  0xBE32,\n\t3639:  0xBE33,\n\t3640:  0xBE34,\n\t3641:  0xBE35,\n\t3642:  0xBE36,\n\t3643:  0xBE37,\n\t3644:  0xBE38,\n\t3645:  0xBE39,\n\t3646:  0xBE3A,\n\t3647:  0xBE3B,\n\t3648:  0xBE3C,\n\t3649:  0xBE3D,\n\t3650:  0xBE3E,\n\t3651:  0xBE3F,\n\t3652:  0xBE40,\n\t3653:  0xBE41,\n\t3654:  0xBE42,\n\t3655:  0xBE43,\n\t3656:  0xBE46,\n\t3657:  0xBE47,\n\t3658:  0xBE49,\n\t3659:  0xBE4A,\n\t3660:  0xBE4B,\n\t3661:  0xBE4D,\n\t3662:  0xBE4F,\n\t3663:  0xBE50,\n\t3664:  0xBE51,\n\t3665:  0xBE52,\n\t3666:  0xBE53,\n\t3667:  0xBE56,\n\t3668:  0xBE58,\n\t3669:  0xBE5C,\n\t3670:  0xBE5D,\n\t3671:  0xBE5E,\n\t3672:  0xBE5F,\n\t3673:  0xBE62,\n\t3674:  0xBE63,\n\t3675:  0xBE65,\n\t3676:  0xBE66,\n\t3677:  0xBE67,\n\t3678:  0xBE69,\n\t3679:  0xBE6B,\n\t3680:  0xBE6C,\n\t3681:  0xBE6D,\n\t3682:  0xBE6E,\n\t3683:  0xBE6F,\n\t3684:  0xBE72,\n\t3685:  0xBE76,\n\t3686:  0xBE77,\n\t3687:  0xBE78,\n\t3688:  0xBE79,\n\t3689:  0xBE7A,\n\t3690:  0xBE7E,\n\t3691:  0xBE7F,\n\t3692:  0xBE81,\n\t3693:  0xBE82,\n\t3694:  0xBE83,\n\t3695:  0xBE85,\n\t3696:  0xBE86,\n\t3697:  0xBE87,\n\t3698:  0xBE88,\n\t3699:  0xBE89,\n\t3700:  0xBE8A,\n\t3701:  0xBE8B,\n\t3702:  0xBE8E,\n\t3703:  0xBE92,\n\t3704:  0xBE93,\n\t3705:  0xBE94,\n\t3706:  0xBE95,\n\t3707:  0xBE96,\n\t3708:  0xBE97,\n\t3709:  0xBE9A,\n\t3710:  0xBE9B,\n\t3711:  0xBE9C,\n\t3712:  0xBE9D,\n\t3713:  0xBE9E,\n\t3714:  0xBE9F,\n\t3715:  0xBEA0,\n\t3716:  0xBEA1,\n\t3717:  0xBEA2,\n\t3718:  0xBEA3,\n\t3719:  0xBEA4,\n\t3720:  0xBEA5,\n\t3721:  0xBEA6,\n\t3722:  0xBEA7,\n\t3723:  0xBEA9,\n\t3724:  0xBEAA,\n\t3725:  0xBEAB,\n\t3726:  0xBEAC,\n\t3727:  0xBEAD,\n\t3728:  0xBEAE,\n\t3729:  0xBEAF,\n\t3730:  0xBEB0,\n\t3731:  0xBEB1,\n\t3732:  0xBEB2,\n\t3733:  0xBEB3,\n\t3734:  0xBEB4,\n\t3735:  0xBEB5,\n\t3736:  0xBEB6,\n\t3737:  0xBEB7,\n\t3738:  0xBEB8,\n\t3739:  0xBEB9,\n\t3740:  0xBEBA,\n\t3741:  0xBEBB,\n\t3742:  0xBEBC,\n\t3743:  0xBEBD,\n\t3744:  0xBEBE,\n\t3745:  0xBEBF,\n\t3746:  0xBEC0,\n\t3747:  0xBEC1,\n\t3748:  0xBEC2,\n\t3749:  0xBEC3,\n\t3750:  0xBEC4,\n\t3751:  0xBEC5,\n\t3752:  0xBEC6,\n\t3753:  0xBEC7,\n\t3754:  0xBEC8,\n\t3755:  0xBEC9,\n\t3756:  0xBECA,\n\t3757:  0xBECB,\n\t3758:  0xBECC,\n\t3759:  0xBECD,\n\t3760:  0xBECE,\n\t3761:  0xBECF,\n\t3762:  0xBED2,\n\t3763:  0xBED3,\n\t3764:  0xBED5,\n\t3765:  0xBED6,\n\t3766:  0xBED9,\n\t3767:  0xBEDA,\n\t3768:  0xBEDB,\n\t3769:  0xBEDC,\n\t3770:  0xBEDD,\n\t3771:  0xBEDE,\n\t3772:  0xBEDF,\n\t3773:  0xBEE1,\n\t3774:  0xBEE2,\n\t3775:  0xBEE6,\n\t3776:  0xBEE7,\n\t3777:  0xBEE8,\n\t3778:  0xBEE9,\n\t3779:  0xBEEA,\n\t3780:  0xBEEB,\n\t3781:  0xBEED,\n\t3782:  0xBEEE,\n\t3783:  0xBEEF,\n\t3784:  0xBEF0,\n\t3785:  0xBEF1,\n\t3786:  0xBEF2,\n\t3787:  0xBEF3,\n\t3788:  0xBEF4,\n\t3789:  0xBEF5,\n\t3790:  0xBEF6,\n\t3791:  0xBEF7,\n\t3792:  0xBEF8,\n\t3793:  0xBEF9,\n\t3794:  0xBEFA,\n\t3795:  0xBEFB,\n\t3796:  0xBEFC,\n\t3797:  0xBEFD,\n\t3798:  0xBEFE,\n\t3799:  0xBEFF,\n\t3800:  0xBF00,\n\t3801:  0xBF02,\n\t3802:  0xBF03,\n\t3803:  0xBF04,\n\t3804:  0xBF05,\n\t3805:  0xBF06,\n\t3806:  0xBF07,\n\t3807:  0xBF0A,\n\t3808:  0xBF0B,\n\t3809:  0xBF0C,\n\t3810:  0xBF0D,\n\t3811:  0xBF0E,\n\t3812:  0xBF0F,\n\t3813:  0xBF10,\n\t3814:  0xBF11,\n\t3815:  0xBF12,\n\t3816:  0xBF13,\n\t3817:  0xBF14,\n\t3818:  0xBF15,\n\t3819:  0xBF16,\n\t3820:  0xBF17,\n\t3821:  0xBF1A,\n\t3822:  0xBF1E,\n\t3823:  0xBF1F,\n\t3824:  0xBF20,\n\t3825:  0xBF21,\n\t3826:  0xBF22,\n\t3827:  0xBF23,\n\t3828:  0xBF24,\n\t3829:  0xBF25,\n\t3830:  0xBF26,\n\t3831:  0xBF27,\n\t3832:  0xBF28,\n\t3833:  0xBF29,\n\t3834:  0xBF2A,\n\t3835:  0xBF2B,\n\t3836:  0xBF2C,\n\t3837:  0xBF2D,\n\t3838:  0xBF2E,\n\t3839:  0xBF2F,\n\t3840:  0xBF30,\n\t3841:  0xBF31,\n\t3842:  0xBF32,\n\t3843:  0xBF33,\n\t3844:  0xBF34,\n\t3845:  0xBF35,\n\t3846:  0xBF36,\n\t3847:  0xBF37,\n\t3848:  0xBF38,\n\t3849:  0xBF39,\n\t3850:  0xBF3A,\n\t3851:  0xBF3B,\n\t3852:  0xBF3C,\n\t3853:  0xBF3D,\n\t3854:  0xBF3E,\n\t3855:  0xBF3F,\n\t3856:  0xBF42,\n\t3857:  0xBF43,\n\t3858:  0xBF45,\n\t3859:  0xBF46,\n\t3860:  0xBF47,\n\t3861:  0xBF49,\n\t3862:  0xBF4A,\n\t3863:  0xBF4B,\n\t3864:  0xBF4C,\n\t3865:  0xBF4D,\n\t3866:  0xBF4E,\n\t3867:  0xBF4F,\n\t3868:  0xBF52,\n\t3869:  0xBF53,\n\t3870:  0xBF54,\n\t3871:  0xBF56,\n\t3872:  0xBF57,\n\t3873:  0xBF58,\n\t3874:  0xBF59,\n\t3875:  0xBF5A,\n\t3876:  0xBF5B,\n\t3877:  0xBF5C,\n\t3878:  0xBF5D,\n\t3879:  0xBF5E,\n\t3880:  0xBF5F,\n\t3881:  0xBF60,\n\t3882:  0xBF61,\n\t3883:  0xBF62,\n\t3884:  0xBF63,\n\t3885:  0xBF64,\n\t3886:  0xBF65,\n\t3887:  0xBF66,\n\t3888:  0xBF67,\n\t3889:  0xBF68,\n\t3890:  0xBF69,\n\t3891:  0xBF6A,\n\t3892:  0xBF6B,\n\t3893:  0xBF6C,\n\t3894:  0xBF6D,\n\t3895:  0xBF6E,\n\t3896:  0xBF6F,\n\t3897:  0xBF70,\n\t3898:  0xBF71,\n\t3899:  0xBF72,\n\t3900:  0xBF73,\n\t3901:  0xBF74,\n\t3902:  0xBF75,\n\t3903:  0xBF76,\n\t3904:  0xBF77,\n\t3905:  0xBF78,\n\t3906:  0xBF79,\n\t3907:  0xBF7A,\n\t3908:  0xBF7B,\n\t3909:  0xBF7C,\n\t3910:  0xBF7D,\n\t3911:  0xBF7E,\n\t3912:  0xBF7F,\n\t3913:  0xBF80,\n\t3914:  0xBF81,\n\t3915:  0xBF82,\n\t3916:  0xBF83,\n\t3917:  0xBF84,\n\t3918:  0xBF85,\n\t3919:  0xBF86,\n\t3920:  0xBF87,\n\t3921:  0xBF88,\n\t3922:  0xBF89,\n\t3923:  0xBF8A,\n\t3924:  0xBF8B,\n\t3925:  0xBF8C,\n\t3926:  0xBF8D,\n\t3927:  0xBF8E,\n\t3928:  0xBF8F,\n\t3929:  0xBF90,\n\t3930:  0xBF91,\n\t3931:  0xBF92,\n\t3932:  0xBF93,\n\t3933:  0xBF95,\n\t3934:  0xBF96,\n\t3935:  0xBF97,\n\t3936:  0xBF98,\n\t3937:  0xBF99,\n\t3938:  0xBF9A,\n\t3939:  0xBF9B,\n\t3940:  0xBF9C,\n\t3941:  0xBF9D,\n\t3942:  0xBF9E,\n\t3943:  0xBF9F,\n\t3944:  0xBFA0,\n\t3945:  0xBFA1,\n\t3946:  0xBFA2,\n\t3947:  0xBFA3,\n\t3948:  0xBFA4,\n\t3949:  0xBFA5,\n\t3950:  0xBFA6,\n\t3951:  0xBFA7,\n\t3952:  0xBFA8,\n\t3953:  0xBFA9,\n\t3954:  0xBFAA,\n\t3955:  0xBFAB,\n\t3956:  0xBFAC,\n\t3957:  0xBFAD,\n\t3958:  0xBFAE,\n\t3959:  0xBFAF,\n\t3960:  0xBFB1,\n\t3961:  0xBFB2,\n\t3962:  0xBFB3,\n\t3963:  0xBFB4,\n\t3964:  0xBFB5,\n\t3965:  0xBFB6,\n\t3966:  0xBFB7,\n\t3967:  0xBFB8,\n\t3968:  0xBFB9,\n\t3969:  0xBFBA,\n\t3970:  0xBFBB,\n\t3971:  0xBFBC,\n\t3972:  0xBFBD,\n\t3973:  0xBFBE,\n\t3974:  0xBFBF,\n\t3975:  0xBFC0,\n\t3976:  0xBFC1,\n\t3977:  0xBFC2,\n\t3978:  0xBFC3,\n\t3979:  0xBFC4,\n\t3980:  0xBFC6,\n\t3981:  0xBFC7,\n\t3982:  0xBFC8,\n\t3983:  0xBFC9,\n\t3984:  0xBFCA,\n\t3985:  0xBFCB,\n\t3986:  0xBFCE,\n\t3987:  0xBFCF,\n\t3988:  0xBFD1,\n\t3989:  0xBFD2,\n\t3990:  0xBFD3,\n\t3991:  0xBFD5,\n\t3992:  0xBFD6,\n\t3993:  0xBFD7,\n\t3994:  0xBFD8,\n\t3995:  0xBFD9,\n\t3996:  0xBFDA,\n\t3997:  0xBFDB,\n\t3998:  0xBFDD,\n\t3999:  0xBFDE,\n\t4000:  0xBFE0,\n\t4001:  0xBFE2,\n\t4002:  0xBFE3,\n\t4003:  0xBFE4,\n\t4004:  0xBFE5,\n\t4005:  0xBFE6,\n\t4006:  0xBFE7,\n\t4007:  0xBFE8,\n\t4008:  0xBFE9,\n\t4009:  0xBFEA,\n\t4010:  0xBFEB,\n\t4011:  0xBFEC,\n\t4012:  0xBFED,\n\t4013:  0xBFEE,\n\t4014:  0xBFEF,\n\t4015:  0xBFF0,\n\t4016:  0xBFF1,\n\t4017:  0xBFF2,\n\t4018:  0xBFF3,\n\t4019:  0xBFF4,\n\t4020:  0xBFF5,\n\t4021:  0xBFF6,\n\t4022:  0xBFF7,\n\t4023:  0xBFF8,\n\t4024:  0xBFF9,\n\t4025:  0xBFFA,\n\t4026:  0xBFFB,\n\t4027:  0xBFFC,\n\t4028:  0xBFFD,\n\t4029:  0xBFFE,\n\t4030:  0xBFFF,\n\t4031:  0xC000,\n\t4032:  0xC001,\n\t4033:  0xC002,\n\t4034:  0xC003,\n\t4035:  0xC004,\n\t4036:  0xC005,\n\t4037:  0xC006,\n\t4038:  0xC007,\n\t4039:  0xC008,\n\t4040:  0xC009,\n\t4041:  0xC00A,\n\t4042:  0xC00B,\n\t4043:  0xC00C,\n\t4044:  0xC00D,\n\t4045:  0xC00E,\n\t4046:  0xC00F,\n\t4047:  0xC010,\n\t4048:  0xC011,\n\t4049:  0xC012,\n\t4050:  0xC013,\n\t4051:  0xC014,\n\t4052:  0xC015,\n\t4053:  0xC016,\n\t4054:  0xC017,\n\t4055:  0xC018,\n\t4056:  0xC019,\n\t4057:  0xC01A,\n\t4058:  0xC01B,\n\t4059:  0xC01C,\n\t4060:  0xC01D,\n\t4061:  0xC01E,\n\t4062:  0xC01F,\n\t4063:  0xC020,\n\t4064:  0xC021,\n\t4065:  0xC022,\n\t4066:  0xC023,\n\t4067:  0xC024,\n\t4068:  0xC025,\n\t4069:  0xC026,\n\t4070:  0xC027,\n\t4071:  0xC028,\n\t4072:  0xC029,\n\t4073:  0xC02A,\n\t4074:  0xC02B,\n\t4075:  0xC02C,\n\t4076:  0xC02D,\n\t4077:  0xC02E,\n\t4078:  0xC02F,\n\t4079:  0xC030,\n\t4080:  0xC031,\n\t4081:  0xC032,\n\t4082:  0xC033,\n\t4083:  0xC034,\n\t4084:  0xC035,\n\t4085:  0xC036,\n\t4086:  0xC037,\n\t4087:  0xC038,\n\t4088:  0xC039,\n\t4089:  0xC03A,\n\t4090:  0xC03B,\n\t4091:  0xC03D,\n\t4092:  0xC03E,\n\t4093:  0xC03F,\n\t4094:  0xC040,\n\t4095:  0xC041,\n\t4096:  0xC042,\n\t4097:  0xC043,\n\t4098:  0xC044,\n\t4099:  0xC045,\n\t4100:  0xC046,\n\t4101:  0xC047,\n\t4102:  0xC048,\n\t4103:  0xC049,\n\t4104:  0xC04A,\n\t4105:  0xC04B,\n\t4106:  0xC04C,\n\t4107:  0xC04D,\n\t4108:  0xC04E,\n\t4109:  0xC04F,\n\t4110:  0xC050,\n\t4111:  0xC052,\n\t4112:  0xC053,\n\t4113:  0xC054,\n\t4114:  0xC055,\n\t4115:  0xC056,\n\t4116:  0xC057,\n\t4117:  0xC059,\n\t4118:  0xC05A,\n\t4119:  0xC05B,\n\t4120:  0xC05D,\n\t4121:  0xC05E,\n\t4122:  0xC05F,\n\t4123:  0xC061,\n\t4124:  0xC062,\n\t4125:  0xC063,\n\t4126:  0xC064,\n\t4127:  0xC065,\n\t4128:  0xC066,\n\t4129:  0xC067,\n\t4130:  0xC06A,\n\t4131:  0xC06B,\n\t4132:  0xC06C,\n\t4133:  0xC06D,\n\t4134:  0xC06E,\n\t4135:  0xC06F,\n\t4136:  0xC070,\n\t4137:  0xC071,\n\t4138:  0xC072,\n\t4139:  0xC073,\n\t4140:  0xC074,\n\t4141:  0xC075,\n\t4142:  0xC076,\n\t4143:  0xC077,\n\t4144:  0xC078,\n\t4145:  0xC079,\n\t4146:  0xC07A,\n\t4147:  0xC07B,\n\t4148:  0xC07C,\n\t4149:  0xC07D,\n\t4150:  0xC07E,\n\t4151:  0xC07F,\n\t4152:  0xC080,\n\t4153:  0xC081,\n\t4154:  0xC082,\n\t4155:  0xC083,\n\t4156:  0xC084,\n\t4157:  0xC085,\n\t4158:  0xC086,\n\t4159:  0xC087,\n\t4160:  0xC088,\n\t4161:  0xC089,\n\t4162:  0xC08A,\n\t4163:  0xC08B,\n\t4164:  0xC08C,\n\t4165:  0xC08D,\n\t4166:  0xC08E,\n\t4167:  0xC08F,\n\t4168:  0xC092,\n\t4169:  0xC093,\n\t4170:  0xC095,\n\t4171:  0xC096,\n\t4172:  0xC097,\n\t4173:  0xC099,\n\t4174:  0xC09A,\n\t4175:  0xC09B,\n\t4176:  0xC09C,\n\t4177:  0xC09D,\n\t4178:  0xC09E,\n\t4179:  0xC09F,\n\t4180:  0xC0A2,\n\t4181:  0xC0A4,\n\t4182:  0xC0A6,\n\t4183:  0xC0A7,\n\t4184:  0xC0A8,\n\t4185:  0xC0A9,\n\t4186:  0xC0AA,\n\t4187:  0xC0AB,\n\t4188:  0xC0AE,\n\t4189:  0xC0B1,\n\t4190:  0xC0B2,\n\t4191:  0xC0B7,\n\t4192:  0xC0B8,\n\t4193:  0xC0B9,\n\t4194:  0xC0BA,\n\t4195:  0xC0BB,\n\t4196:  0xC0BE,\n\t4197:  0xC0C2,\n\t4198:  0xC0C3,\n\t4199:  0xC0C4,\n\t4200:  0xC0C6,\n\t4201:  0xC0C7,\n\t4202:  0xC0CA,\n\t4203:  0xC0CB,\n\t4204:  0xC0CD,\n\t4205:  0xC0CE,\n\t4206:  0xC0CF,\n\t4207:  0xC0D1,\n\t4208:  0xC0D2,\n\t4209:  0xC0D3,\n\t4210:  0xC0D4,\n\t4211:  0xC0D5,\n\t4212:  0xC0D6,\n\t4213:  0xC0D7,\n\t4214:  0xC0DA,\n\t4215:  0xC0DE,\n\t4216:  0xC0DF,\n\t4217:  0xC0E0,\n\t4218:  0xC0E1,\n\t4219:  0xC0E2,\n\t4220:  0xC0E3,\n\t4221:  0xC0E6,\n\t4222:  0xC0E7,\n\t4223:  0xC0E9,\n\t4224:  0xC0EA,\n\t4225:  0xC0EB,\n\t4226:  0xC0ED,\n\t4227:  0xC0EE,\n\t4228:  0xC0EF,\n\t4229:  0xC0F0,\n\t4230:  0xC0F1,\n\t4231:  0xC0F2,\n\t4232:  0xC0F3,\n\t4233:  0xC0F6,\n\t4234:  0xC0F8,\n\t4235:  0xC0FA,\n\t4236:  0xC0FB,\n\t4237:  0xC0FC,\n\t4238:  0xC0FD,\n\t4239:  0xC0FE,\n\t4240:  0xC0FF,\n\t4241:  0xC101,\n\t4242:  0xC102,\n\t4243:  0xC103,\n\t4244:  0xC105,\n\t4245:  0xC106,\n\t4246:  0xC107,\n\t4247:  0xC109,\n\t4248:  0xC10A,\n\t4249:  0xC10B,\n\t4250:  0xC10C,\n\t4251:  0xC10D,\n\t4252:  0xC10E,\n\t4253:  0xC10F,\n\t4254:  0xC111,\n\t4255:  0xC112,\n\t4256:  0xC113,\n\t4257:  0xC114,\n\t4258:  0xC116,\n\t4259:  0xC117,\n\t4260:  0xC118,\n\t4261:  0xC119,\n\t4262:  0xC11A,\n\t4263:  0xC11B,\n\t4264:  0xC121,\n\t4265:  0xC122,\n\t4266:  0xC125,\n\t4267:  0xC128,\n\t4268:  0xC129,\n\t4269:  0xC12A,\n\t4270:  0xC12B,\n\t4271:  0xC12E,\n\t4272:  0xC132,\n\t4273:  0xC133,\n\t4274:  0xC134,\n\t4275:  0xC135,\n\t4276:  0xC137,\n\t4277:  0xC13A,\n\t4278:  0xC13B,\n\t4279:  0xC13D,\n\t4280:  0xC13E,\n\t4281:  0xC13F,\n\t4282:  0xC141,\n\t4283:  0xC142,\n\t4284:  0xC143,\n\t4285:  0xC144,\n\t4286:  0xC145,\n\t4287:  0xC146,\n\t4288:  0xC147,\n\t4289:  0xC14A,\n\t4290:  0xC14E,\n\t4291:  0xC14F,\n\t4292:  0xC150,\n\t4293:  0xC151,\n\t4294:  0xC152,\n\t4295:  0xC153,\n\t4296:  0xC156,\n\t4297:  0xC157,\n\t4298:  0xC159,\n\t4299:  0xC15A,\n\t4300:  0xC15B,\n\t4301:  0xC15D,\n\t4302:  0xC15E,\n\t4303:  0xC15F,\n\t4304:  0xC160,\n\t4305:  0xC161,\n\t4306:  0xC162,\n\t4307:  0xC163,\n\t4308:  0xC166,\n\t4309:  0xC16A,\n\t4310:  0xC16B,\n\t4311:  0xC16C,\n\t4312:  0xC16D,\n\t4313:  0xC16E,\n\t4314:  0xC16F,\n\t4315:  0xC171,\n\t4316:  0xC172,\n\t4317:  0xC173,\n\t4318:  0xC175,\n\t4319:  0xC176,\n\t4320:  0xC177,\n\t4321:  0xC179,\n\t4322:  0xC17A,\n\t4323:  0xC17B,\n\t4324:  0xC17C,\n\t4325:  0xC17D,\n\t4326:  0xC17E,\n\t4327:  0xC17F,\n\t4328:  0xC180,\n\t4329:  0xC181,\n\t4330:  0xC182,\n\t4331:  0xC183,\n\t4332:  0xC184,\n\t4333:  0xC186,\n\t4334:  0xC187,\n\t4335:  0xC188,\n\t4336:  0xC189,\n\t4337:  0xC18A,\n\t4338:  0xC18B,\n\t4339:  0xC18F,\n\t4340:  0xC191,\n\t4341:  0xC192,\n\t4342:  0xC193,\n\t4343:  0xC195,\n\t4344:  0xC197,\n\t4345:  0xC198,\n\t4346:  0xC199,\n\t4347:  0xC19A,\n\t4348:  0xC19B,\n\t4349:  0xC19E,\n\t4350:  0xC1A0,\n\t4351:  0xC1A2,\n\t4352:  0xC1A3,\n\t4353:  0xC1A4,\n\t4354:  0xC1A6,\n\t4355:  0xC1A7,\n\t4356:  0xC1AA,\n\t4357:  0xC1AB,\n\t4358:  0xC1AD,\n\t4359:  0xC1AE,\n\t4360:  0xC1AF,\n\t4361:  0xC1B1,\n\t4362:  0xC1B2,\n\t4363:  0xC1B3,\n\t4364:  0xC1B4,\n\t4365:  0xC1B5,\n\t4366:  0xC1B6,\n\t4367:  0xC1B7,\n\t4368:  0xC1B8,\n\t4369:  0xC1B9,\n\t4370:  0xC1BA,\n\t4371:  0xC1BB,\n\t4372:  0xC1BC,\n\t4373:  0xC1BE,\n\t4374:  0xC1BF,\n\t4375:  0xC1C0,\n\t4376:  0xC1C1,\n\t4377:  0xC1C2,\n\t4378:  0xC1C3,\n\t4379:  0xC1C5,\n\t4380:  0xC1C6,\n\t4381:  0xC1C7,\n\t4382:  0xC1C9,\n\t4383:  0xC1CA,\n\t4384:  0xC1CB,\n\t4385:  0xC1CD,\n\t4386:  0xC1CE,\n\t4387:  0xC1CF,\n\t4388:  0xC1D0,\n\t4389:  0xC1D1,\n\t4390:  0xC1D2,\n\t4391:  0xC1D3,\n\t4392:  0xC1D5,\n\t4393:  0xC1D6,\n\t4394:  0xC1D9,\n\t4395:  0xC1DA,\n\t4396:  0xC1DB,\n\t4397:  0xC1DC,\n\t4398:  0xC1DD,\n\t4399:  0xC1DE,\n\t4400:  0xC1DF,\n\t4401:  0xC1E1,\n\t4402:  0xC1E2,\n\t4403:  0xC1E3,\n\t4404:  0xC1E5,\n\t4405:  0xC1E6,\n\t4406:  0xC1E7,\n\t4407:  0xC1E9,\n\t4408:  0xC1EA,\n\t4409:  0xC1EB,\n\t4410:  0xC1EC,\n\t4411:  0xC1ED,\n\t4412:  0xC1EE,\n\t4413:  0xC1EF,\n\t4414:  0xC1F2,\n\t4415:  0xC1F4,\n\t4416:  0xC1F5,\n\t4417:  0xC1F6,\n\t4418:  0xC1F7,\n\t4419:  0xC1F8,\n\t4420:  0xC1F9,\n\t4421:  0xC1FA,\n\t4422:  0xC1FB,\n\t4423:  0xC1FE,\n\t4424:  0xC1FF,\n\t4425:  0xC201,\n\t4426:  0xC202,\n\t4427:  0xC203,\n\t4428:  0xC205,\n\t4429:  0xC206,\n\t4430:  0xC207,\n\t4431:  0xC208,\n\t4432:  0xC209,\n\t4433:  0xC20A,\n\t4434:  0xC20B,\n\t4435:  0xC20E,\n\t4436:  0xC210,\n\t4437:  0xC212,\n\t4438:  0xC213,\n\t4439:  0xC214,\n\t4440:  0xC215,\n\t4441:  0xC216,\n\t4442:  0xC217,\n\t4443:  0xC21A,\n\t4444:  0xC21B,\n\t4445:  0xC21D,\n\t4446:  0xC21E,\n\t4447:  0xC221,\n\t4448:  0xC222,\n\t4449:  0xC223,\n\t4450:  0xC224,\n\t4451:  0xC225,\n\t4452:  0xC226,\n\t4453:  0xC227,\n\t4454:  0xC22A,\n\t4455:  0xC22C,\n\t4456:  0xC22E,\n\t4457:  0xC230,\n\t4458:  0xC233,\n\t4459:  0xC235,\n\t4460:  0xC236,\n\t4461:  0xC237,\n\t4462:  0xC238,\n\t4463:  0xC239,\n\t4464:  0xC23A,\n\t4465:  0xC23B,\n\t4466:  0xC23C,\n\t4467:  0xC23D,\n\t4468:  0xC23E,\n\t4469:  0xC23F,\n\t4470:  0xC240,\n\t4471:  0xC241,\n\t4472:  0xC242,\n\t4473:  0xC243,\n\t4474:  0xC244,\n\t4475:  0xC245,\n\t4476:  0xC246,\n\t4477:  0xC247,\n\t4478:  0xC249,\n\t4479:  0xC24A,\n\t4480:  0xC24B,\n\t4481:  0xC24C,\n\t4482:  0xC24D,\n\t4483:  0xC24E,\n\t4484:  0xC24F,\n\t4485:  0xC252,\n\t4486:  0xC253,\n\t4487:  0xC255,\n\t4488:  0xC256,\n\t4489:  0xC257,\n\t4490:  0xC259,\n\t4491:  0xC25A,\n\t4492:  0xC25B,\n\t4493:  0xC25C,\n\t4494:  0xC25D,\n\t4495:  0xC25E,\n\t4496:  0xC25F,\n\t4497:  0xC261,\n\t4498:  0xC262,\n\t4499:  0xC263,\n\t4500:  0xC264,\n\t4501:  0xC266,\n\t4502:  0xC267,\n\t4503:  0xC268,\n\t4504:  0xC269,\n\t4505:  0xC26A,\n\t4506:  0xC26B,\n\t4507:  0xC26E,\n\t4508:  0xC26F,\n\t4509:  0xC271,\n\t4510:  0xC272,\n\t4511:  0xC273,\n\t4512:  0xC275,\n\t4513:  0xC276,\n\t4514:  0xC277,\n\t4515:  0xC278,\n\t4516:  0xC279,\n\t4517:  0xC27A,\n\t4518:  0xC27B,\n\t4519:  0xC27E,\n\t4520:  0xC280,\n\t4521:  0xC282,\n\t4522:  0xC283,\n\t4523:  0xC284,\n\t4524:  0xC285,\n\t4525:  0xC286,\n\t4526:  0xC287,\n\t4527:  0xC28A,\n\t4528:  0xC28B,\n\t4529:  0xC28C,\n\t4530:  0xC28D,\n\t4531:  0xC28E,\n\t4532:  0xC28F,\n\t4533:  0xC291,\n\t4534:  0xC292,\n\t4535:  0xC293,\n\t4536:  0xC294,\n\t4537:  0xC295,\n\t4538:  0xC296,\n\t4539:  0xC297,\n\t4540:  0xC299,\n\t4541:  0xC29A,\n\t4542:  0xC29C,\n\t4543:  0xC29E,\n\t4544:  0xC29F,\n\t4545:  0xC2A0,\n\t4546:  0xC2A1,\n\t4547:  0xC2A2,\n\t4548:  0xC2A3,\n\t4549:  0xC2A6,\n\t4550:  0xC2A7,\n\t4551:  0xC2A9,\n\t4552:  0xC2AA,\n\t4553:  0xC2AB,\n\t4554:  0xC2AE,\n\t4555:  0xC2AF,\n\t4556:  0xC2B0,\n\t4557:  0xC2B1,\n\t4558:  0xC2B2,\n\t4559:  0xC2B3,\n\t4560:  0xC2B6,\n\t4561:  0xC2B8,\n\t4562:  0xC2BA,\n\t4563:  0xC2BB,\n\t4564:  0xC2BC,\n\t4565:  0xC2BD,\n\t4566:  0xC2BE,\n\t4567:  0xC2BF,\n\t4568:  0xC2C0,\n\t4569:  0xC2C1,\n\t4570:  0xC2C2,\n\t4571:  0xC2C3,\n\t4572:  0xC2C4,\n\t4573:  0xC2C5,\n\t4574:  0xC2C6,\n\t4575:  0xC2C7,\n\t4576:  0xC2C8,\n\t4577:  0xC2C9,\n\t4578:  0xC2CA,\n\t4579:  0xC2CB,\n\t4580:  0xC2CC,\n\t4581:  0xC2CD,\n\t4582:  0xC2CE,\n\t4583:  0xC2CF,\n\t4584:  0xC2D0,\n\t4585:  0xC2D1,\n\t4586:  0xC2D2,\n\t4587:  0xC2D3,\n\t4588:  0xC2D4,\n\t4589:  0xC2D5,\n\t4590:  0xC2D6,\n\t4591:  0xC2D7,\n\t4592:  0xC2D8,\n\t4593:  0xC2D9,\n\t4594:  0xC2DA,\n\t4595:  0xC2DB,\n\t4596:  0xC2DE,\n\t4597:  0xC2DF,\n\t4598:  0xC2E1,\n\t4599:  0xC2E2,\n\t4600:  0xC2E5,\n\t4601:  0xC2E6,\n\t4602:  0xC2E7,\n\t4603:  0xC2E8,\n\t4604:  0xC2E9,\n\t4605:  0xC2EA,\n\t4606:  0xC2EE,\n\t4607:  0xC2F0,\n\t4608:  0xC2F2,\n\t4609:  0xC2F3,\n\t4610:  0xC2F4,\n\t4611:  0xC2F5,\n\t4612:  0xC2F7,\n\t4613:  0xC2FA,\n\t4614:  0xC2FD,\n\t4615:  0xC2FE,\n\t4616:  0xC2FF,\n\t4617:  0xC301,\n\t4618:  0xC302,\n\t4619:  0xC303,\n\t4620:  0xC304,\n\t4621:  0xC305,\n\t4622:  0xC306,\n\t4623:  0xC307,\n\t4624:  0xC30A,\n\t4625:  0xC30B,\n\t4626:  0xC30E,\n\t4627:  0xC30F,\n\t4628:  0xC310,\n\t4629:  0xC311,\n\t4630:  0xC312,\n\t4631:  0xC316,\n\t4632:  0xC317,\n\t4633:  0xC319,\n\t4634:  0xC31A,\n\t4635:  0xC31B,\n\t4636:  0xC31D,\n\t4637:  0xC31E,\n\t4638:  0xC31F,\n\t4639:  0xC320,\n\t4640:  0xC321,\n\t4641:  0xC322,\n\t4642:  0xC323,\n\t4643:  0xC326,\n\t4644:  0xC327,\n\t4645:  0xC32A,\n\t4646:  0xC32B,\n\t4647:  0xC32C,\n\t4648:  0xC32D,\n\t4649:  0xC32E,\n\t4650:  0xC32F,\n\t4651:  0xC330,\n\t4652:  0xC331,\n\t4653:  0xC332,\n\t4654:  0xC333,\n\t4655:  0xC334,\n\t4656:  0xC335,\n\t4657:  0xC336,\n\t4658:  0xC337,\n\t4659:  0xC338,\n\t4660:  0xC339,\n\t4661:  0xC33A,\n\t4662:  0xC33B,\n\t4663:  0xC33C,\n\t4664:  0xC33D,\n\t4665:  0xC33E,\n\t4666:  0xC33F,\n\t4667:  0xC340,\n\t4668:  0xC341,\n\t4669:  0xC342,\n\t4670:  0xC343,\n\t4671:  0xC344,\n\t4672:  0xC346,\n\t4673:  0xC347,\n\t4674:  0xC348,\n\t4675:  0xC349,\n\t4676:  0xC34A,\n\t4677:  0xC34B,\n\t4678:  0xC34C,\n\t4679:  0xC34D,\n\t4680:  0xC34E,\n\t4681:  0xC34F,\n\t4682:  0xC350,\n\t4683:  0xC351,\n\t4684:  0xC352,\n\t4685:  0xC353,\n\t4686:  0xC354,\n\t4687:  0xC355,\n\t4688:  0xC356,\n\t4689:  0xC357,\n\t4690:  0xC358,\n\t4691:  0xC359,\n\t4692:  0xC35A,\n\t4693:  0xC35B,\n\t4694:  0xC35C,\n\t4695:  0xC35D,\n\t4696:  0xC35E,\n\t4697:  0xC35F,\n\t4698:  0xC360,\n\t4699:  0xC361,\n\t4700:  0xC362,\n\t4701:  0xC363,\n\t4702:  0xC364,\n\t4703:  0xC365,\n\t4704:  0xC366,\n\t4705:  0xC367,\n\t4706:  0xC36A,\n\t4707:  0xC36B,\n\t4708:  0xC36D,\n\t4709:  0xC36E,\n\t4710:  0xC36F,\n\t4711:  0xC371,\n\t4712:  0xC373,\n\t4713:  0xC374,\n\t4714:  0xC375,\n\t4715:  0xC376,\n\t4716:  0xC377,\n\t4717:  0xC37A,\n\t4718:  0xC37B,\n\t4719:  0xC37E,\n\t4720:  0xC37F,\n\t4721:  0xC380,\n\t4722:  0xC381,\n\t4723:  0xC382,\n\t4724:  0xC383,\n\t4725:  0xC385,\n\t4726:  0xC386,\n\t4727:  0xC387,\n\t4728:  0xC389,\n\t4729:  0xC38A,\n\t4730:  0xC38B,\n\t4731:  0xC38D,\n\t4732:  0xC38E,\n\t4733:  0xC38F,\n\t4734:  0xC390,\n\t4735:  0xC391,\n\t4736:  0xC392,\n\t4737:  0xC393,\n\t4738:  0xC394,\n\t4739:  0xC395,\n\t4740:  0xC396,\n\t4741:  0xC397,\n\t4742:  0xC398,\n\t4743:  0xC399,\n\t4744:  0xC39A,\n\t4745:  0xC39B,\n\t4746:  0xC39C,\n\t4747:  0xC39D,\n\t4748:  0xC39E,\n\t4749:  0xC39F,\n\t4750:  0xC3A0,\n\t4751:  0xC3A1,\n\t4752:  0xC3A2,\n\t4753:  0xC3A3,\n\t4754:  0xC3A4,\n\t4755:  0xC3A5,\n\t4756:  0xC3A6,\n\t4757:  0xC3A7,\n\t4758:  0xC3A8,\n\t4759:  0xC3A9,\n\t4760:  0xC3AA,\n\t4761:  0xC3AB,\n\t4762:  0xC3AC,\n\t4763:  0xC3AD,\n\t4764:  0xC3AE,\n\t4765:  0xC3AF,\n\t4766:  0xC3B0,\n\t4767:  0xC3B1,\n\t4768:  0xC3B2,\n\t4769:  0xC3B3,\n\t4770:  0xC3B4,\n\t4771:  0xC3B5,\n\t4772:  0xC3B6,\n\t4773:  0xC3B7,\n\t4774:  0xC3B8,\n\t4775:  0xC3B9,\n\t4776:  0xC3BA,\n\t4777:  0xC3BB,\n\t4778:  0xC3BC,\n\t4779:  0xC3BD,\n\t4780:  0xC3BE,\n\t4781:  0xC3BF,\n\t4782:  0xC3C1,\n\t4783:  0xC3C2,\n\t4784:  0xC3C3,\n\t4785:  0xC3C4,\n\t4786:  0xC3C5,\n\t4787:  0xC3C6,\n\t4788:  0xC3C7,\n\t4789:  0xC3C8,\n\t4790:  0xC3C9,\n\t4791:  0xC3CA,\n\t4792:  0xC3CB,\n\t4793:  0xC3CC,\n\t4794:  0xC3CD,\n\t4795:  0xC3CE,\n\t4796:  0xC3CF,\n\t4797:  0xC3D0,\n\t4798:  0xC3D1,\n\t4799:  0xC3D2,\n\t4800:  0xC3D3,\n\t4801:  0xC3D4,\n\t4802:  0xC3D5,\n\t4803:  0xC3D6,\n\t4804:  0xC3D7,\n\t4805:  0xC3DA,\n\t4806:  0xC3DB,\n\t4807:  0xC3DD,\n\t4808:  0xC3DE,\n\t4809:  0xC3E1,\n\t4810:  0xC3E3,\n\t4811:  0xC3E4,\n\t4812:  0xC3E5,\n\t4813:  0xC3E6,\n\t4814:  0xC3E7,\n\t4815:  0xC3EA,\n\t4816:  0xC3EB,\n\t4817:  0xC3EC,\n\t4818:  0xC3EE,\n\t4819:  0xC3EF,\n\t4820:  0xC3F0,\n\t4821:  0xC3F1,\n\t4822:  0xC3F2,\n\t4823:  0xC3F3,\n\t4824:  0xC3F6,\n\t4825:  0xC3F7,\n\t4826:  0xC3F9,\n\t4827:  0xC3FA,\n\t4828:  0xC3FB,\n\t4829:  0xC3FC,\n\t4830:  0xC3FD,\n\t4831:  0xC3FE,\n\t4832:  0xC3FF,\n\t4833:  0xC400,\n\t4834:  0xC401,\n\t4835:  0xC402,\n\t4836:  0xC403,\n\t4837:  0xC404,\n\t4838:  0xC405,\n\t4839:  0xC406,\n\t4840:  0xC407,\n\t4841:  0xC409,\n\t4842:  0xC40A,\n\t4843:  0xC40B,\n\t4844:  0xC40C,\n\t4845:  0xC40D,\n\t4846:  0xC40E,\n\t4847:  0xC40F,\n\t4848:  0xC411,\n\t4849:  0xC412,\n\t4850:  0xC413,\n\t4851:  0xC414,\n\t4852:  0xC415,\n\t4853:  0xC416,\n\t4854:  0xC417,\n\t4855:  0xC418,\n\t4856:  0xC419,\n\t4857:  0xC41A,\n\t4858:  0xC41B,\n\t4859:  0xC41C,\n\t4860:  0xC41D,\n\t4861:  0xC41E,\n\t4862:  0xC41F,\n\t4863:  0xC420,\n\t4864:  0xC421,\n\t4865:  0xC422,\n\t4866:  0xC423,\n\t4867:  0xC425,\n\t4868:  0xC426,\n\t4869:  0xC427,\n\t4870:  0xC428,\n\t4871:  0xC429,\n\t4872:  0xC42A,\n\t4873:  0xC42B,\n\t4874:  0xC42D,\n\t4875:  0xC42E,\n\t4876:  0xC42F,\n\t4877:  0xC431,\n\t4878:  0xC432,\n\t4879:  0xC433,\n\t4880:  0xC435,\n\t4881:  0xC436,\n\t4882:  0xC437,\n\t4883:  0xC438,\n\t4884:  0xC439,\n\t4885:  0xC43A,\n\t4886:  0xC43B,\n\t4887:  0xC43E,\n\t4888:  0xC43F,\n\t4889:  0xC440,\n\t4890:  0xC441,\n\t4891:  0xC442,\n\t4892:  0xC443,\n\t4893:  0xC444,\n\t4894:  0xC445,\n\t4895:  0xC446,\n\t4896:  0xC447,\n\t4897:  0xC449,\n\t4898:  0xC44A,\n\t4899:  0xC44B,\n\t4900:  0xC44C,\n\t4901:  0xC44D,\n\t4902:  0xC44E,\n\t4903:  0xC44F,\n\t4904:  0xC450,\n\t4905:  0xC451,\n\t4906:  0xC452,\n\t4907:  0xC453,\n\t4908:  0xC454,\n\t4909:  0xC455,\n\t4910:  0xC456,\n\t4911:  0xC457,\n\t4912:  0xC458,\n\t4913:  0xC459,\n\t4914:  0xC45A,\n\t4915:  0xC45B,\n\t4916:  0xC45C,\n\t4917:  0xC45D,\n\t4918:  0xC45E,\n\t4919:  0xC45F,\n\t4920:  0xC460,\n\t4921:  0xC461,\n\t4922:  0xC462,\n\t4923:  0xC463,\n\t4924:  0xC466,\n\t4925:  0xC467,\n\t4926:  0xC469,\n\t4927:  0xC46A,\n\t4928:  0xC46B,\n\t4929:  0xC46D,\n\t4930:  0xC46E,\n\t4931:  0xC46F,\n\t4932:  0xC470,\n\t4933:  0xC471,\n\t4934:  0xC472,\n\t4935:  0xC473,\n\t4936:  0xC476,\n\t4937:  0xC477,\n\t4938:  0xC478,\n\t4939:  0xC47A,\n\t4940:  0xC47B,\n\t4941:  0xC47C,\n\t4942:  0xC47D,\n\t4943:  0xC47E,\n\t4944:  0xC47F,\n\t4945:  0xC481,\n\t4946:  0xC482,\n\t4947:  0xC483,\n\t4948:  0xC484,\n\t4949:  0xC485,\n\t4950:  0xC486,\n\t4951:  0xC487,\n\t4952:  0xC488,\n\t4953:  0xC489,\n\t4954:  0xC48A,\n\t4955:  0xC48B,\n\t4956:  0xC48C,\n\t4957:  0xC48D,\n\t4958:  0xC48E,\n\t4959:  0xC48F,\n\t4960:  0xC490,\n\t4961:  0xC491,\n\t4962:  0xC492,\n\t4963:  0xC493,\n\t4964:  0xC495,\n\t4965:  0xC496,\n\t4966:  0xC497,\n\t4967:  0xC498,\n\t4968:  0xC499,\n\t4969:  0xC49A,\n\t4970:  0xC49B,\n\t4971:  0xC49D,\n\t4972:  0xC49E,\n\t4973:  0xC49F,\n\t4974:  0xC4A0,\n\t4975:  0xC4A1,\n\t4976:  0xC4A2,\n\t4977:  0xC4A3,\n\t4978:  0xC4A4,\n\t4979:  0xC4A5,\n\t4980:  0xC4A6,\n\t4981:  0xC4A7,\n\t4982:  0xC4A8,\n\t4983:  0xC4A9,\n\t4984:  0xC4AA,\n\t4985:  0xC4AB,\n\t4986:  0xC4AC,\n\t4987:  0xC4AD,\n\t4988:  0xC4AE,\n\t4989:  0xC4AF,\n\t4990:  0xC4B0,\n\t4991:  0xC4B1,\n\t4992:  0xC4B2,\n\t4993:  0xC4B3,\n\t4994:  0xC4B4,\n\t4995:  0xC4B5,\n\t4996:  0xC4B6,\n\t4997:  0xC4B7,\n\t4998:  0xC4B9,\n\t4999:  0xC4BA,\n\t5000:  0xC4BB,\n\t5001:  0xC4BD,\n\t5002:  0xC4BE,\n\t5003:  0xC4BF,\n\t5004:  0xC4C0,\n\t5005:  0xC4C1,\n\t5006:  0xC4C2,\n\t5007:  0xC4C3,\n\t5008:  0xC4C4,\n\t5009:  0xC4C5,\n\t5010:  0xC4C6,\n\t5011:  0xC4C7,\n\t5012:  0xC4C8,\n\t5013:  0xC4C9,\n\t5014:  0xC4CA,\n\t5015:  0xC4CB,\n\t5016:  0xC4CC,\n\t5017:  0xC4CD,\n\t5018:  0xC4CE,\n\t5019:  0xC4CF,\n\t5020:  0xC4D0,\n\t5021:  0xC4D1,\n\t5022:  0xC4D2,\n\t5023:  0xC4D3,\n\t5024:  0xC4D4,\n\t5025:  0xC4D5,\n\t5026:  0xC4D6,\n\t5027:  0xC4D7,\n\t5028:  0xC4D8,\n\t5029:  0xC4D9,\n\t5030:  0xC4DA,\n\t5031:  0xC4DB,\n\t5032:  0xC4DC,\n\t5033:  0xC4DD,\n\t5034:  0xC4DE,\n\t5035:  0xC4DF,\n\t5036:  0xC4E0,\n\t5037:  0xC4E1,\n\t5038:  0xC4E2,\n\t5039:  0xC4E3,\n\t5040:  0xC4E4,\n\t5041:  0xC4E5,\n\t5042:  0xC4E6,\n\t5043:  0xC4E7,\n\t5044:  0xC4E8,\n\t5045:  0xC4EA,\n\t5046:  0xC4EB,\n\t5047:  0xC4EC,\n\t5048:  0xC4ED,\n\t5049:  0xC4EE,\n\t5050:  0xC4EF,\n\t5051:  0xC4F2,\n\t5052:  0xC4F3,\n\t5053:  0xC4F5,\n\t5054:  0xC4F6,\n\t5055:  0xC4F7,\n\t5056:  0xC4F9,\n\t5057:  0xC4FB,\n\t5058:  0xC4FC,\n\t5059:  0xC4FD,\n\t5060:  0xC4FE,\n\t5061:  0xC502,\n\t5062:  0xC503,\n\t5063:  0xC504,\n\t5064:  0xC505,\n\t5065:  0xC506,\n\t5066:  0xC507,\n\t5067:  0xC508,\n\t5068:  0xC509,\n\t5069:  0xC50A,\n\t5070:  0xC50B,\n\t5071:  0xC50D,\n\t5072:  0xC50E,\n\t5073:  0xC50F,\n\t5074:  0xC511,\n\t5075:  0xC512,\n\t5076:  0xC513,\n\t5077:  0xC515,\n\t5078:  0xC516,\n\t5079:  0xC517,\n\t5080:  0xC518,\n\t5081:  0xC519,\n\t5082:  0xC51A,\n\t5083:  0xC51B,\n\t5084:  0xC51D,\n\t5085:  0xC51E,\n\t5086:  0xC51F,\n\t5087:  0xC520,\n\t5088:  0xC521,\n\t5089:  0xC522,\n\t5090:  0xC523,\n\t5091:  0xC524,\n\t5092:  0xC525,\n\t5093:  0xC526,\n\t5094:  0xC527,\n\t5095:  0xC52A,\n\t5096:  0xC52B,\n\t5097:  0xC52D,\n\t5098:  0xC52E,\n\t5099:  0xC52F,\n\t5100:  0xC531,\n\t5101:  0xC532,\n\t5102:  0xC533,\n\t5103:  0xC534,\n\t5104:  0xC535,\n\t5105:  0xC536,\n\t5106:  0xC537,\n\t5107:  0xC53A,\n\t5108:  0xC53C,\n\t5109:  0xC53E,\n\t5110:  0xC53F,\n\t5111:  0xC540,\n\t5112:  0xC541,\n\t5113:  0xC542,\n\t5114:  0xC543,\n\t5115:  0xC546,\n\t5116:  0xC547,\n\t5117:  0xC54B,\n\t5118:  0xC54F,\n\t5119:  0xC550,\n\t5120:  0xC551,\n\t5121:  0xC552,\n\t5122:  0xC556,\n\t5123:  0xC55A,\n\t5124:  0xC55B,\n\t5125:  0xC55C,\n\t5126:  0xC55F,\n\t5127:  0xC562,\n\t5128:  0xC563,\n\t5129:  0xC565,\n\t5130:  0xC566,\n\t5131:  0xC567,\n\t5132:  0xC569,\n\t5133:  0xC56A,\n\t5134:  0xC56B,\n\t5135:  0xC56C,\n\t5136:  0xC56D,\n\t5137:  0xC56E,\n\t5138:  0xC56F,\n\t5139:  0xC572,\n\t5140:  0xC576,\n\t5141:  0xC577,\n\t5142:  0xC578,\n\t5143:  0xC579,\n\t5144:  0xC57A,\n\t5145:  0xC57B,\n\t5146:  0xC57E,\n\t5147:  0xC57F,\n\t5148:  0xC581,\n\t5149:  0xC582,\n\t5150:  0xC583,\n\t5151:  0xC585,\n\t5152:  0xC586,\n\t5153:  0xC588,\n\t5154:  0xC589,\n\t5155:  0xC58A,\n\t5156:  0xC58B,\n\t5157:  0xC58E,\n\t5158:  0xC590,\n\t5159:  0xC592,\n\t5160:  0xC593,\n\t5161:  0xC594,\n\t5162:  0xC596,\n\t5163:  0xC599,\n\t5164:  0xC59A,\n\t5165:  0xC59B,\n\t5166:  0xC59D,\n\t5167:  0xC59E,\n\t5168:  0xC59F,\n\t5169:  0xC5A1,\n\t5170:  0xC5A2,\n\t5171:  0xC5A3,\n\t5172:  0xC5A4,\n\t5173:  0xC5A5,\n\t5174:  0xC5A6,\n\t5175:  0xC5A7,\n\t5176:  0xC5A8,\n\t5177:  0xC5AA,\n\t5178:  0xC5AB,\n\t5179:  0xC5AC,\n\t5180:  0xC5AD,\n\t5181:  0xC5AE,\n\t5182:  0xC5AF,\n\t5183:  0xC5B0,\n\t5184:  0xC5B1,\n\t5185:  0xC5B2,\n\t5186:  0xC5B3,\n\t5187:  0xC5B6,\n\t5188:  0xC5B7,\n\t5189:  0xC5BA,\n\t5190:  0xC5BF,\n\t5191:  0xC5C0,\n\t5192:  0xC5C1,\n\t5193:  0xC5C2,\n\t5194:  0xC5C3,\n\t5195:  0xC5CB,\n\t5196:  0xC5CD,\n\t5197:  0xC5CF,\n\t5198:  0xC5D2,\n\t5199:  0xC5D3,\n\t5200:  0xC5D5,\n\t5201:  0xC5D6,\n\t5202:  0xC5D7,\n\t5203:  0xC5D9,\n\t5204:  0xC5DA,\n\t5205:  0xC5DB,\n\t5206:  0xC5DC,\n\t5207:  0xC5DD,\n\t5208:  0xC5DE,\n\t5209:  0xC5DF,\n\t5210:  0xC5E2,\n\t5211:  0xC5E4,\n\t5212:  0xC5E6,\n\t5213:  0xC5E7,\n\t5214:  0xC5E8,\n\t5215:  0xC5E9,\n\t5216:  0xC5EA,\n\t5217:  0xC5EB,\n\t5218:  0xC5EF,\n\t5219:  0xC5F1,\n\t5220:  0xC5F2,\n\t5221:  0xC5F3,\n\t5222:  0xC5F5,\n\t5223:  0xC5F8,\n\t5224:  0xC5F9,\n\t5225:  0xC5FA,\n\t5226:  0xC5FB,\n\t5227:  0xC602,\n\t5228:  0xC603,\n\t5229:  0xC604,\n\t5230:  0xC609,\n\t5231:  0xC60A,\n\t5232:  0xC60B,\n\t5233:  0xC60D,\n\t5234:  0xC60E,\n\t5235:  0xC60F,\n\t5236:  0xC611,\n\t5237:  0xC612,\n\t5238:  0xC613,\n\t5239:  0xC614,\n\t5240:  0xC615,\n\t5241:  0xC616,\n\t5242:  0xC617,\n\t5243:  0xC61A,\n\t5244:  0xC61D,\n\t5245:  0xC61E,\n\t5246:  0xC61F,\n\t5247:  0xC620,\n\t5248:  0xC621,\n\t5249:  0xC622,\n\t5250:  0xC623,\n\t5251:  0xC626,\n\t5252:  0xC627,\n\t5253:  0xC629,\n\t5254:  0xC62A,\n\t5255:  0xC62B,\n\t5256:  0xC62F,\n\t5257:  0xC631,\n\t5258:  0xC632,\n\t5259:  0xC636,\n\t5260:  0xC638,\n\t5261:  0xC63A,\n\t5262:  0xC63C,\n\t5263:  0xC63D,\n\t5264:  0xC63E,\n\t5265:  0xC63F,\n\t5266:  0xC642,\n\t5267:  0xC643,\n\t5268:  0xC645,\n\t5269:  0xC646,\n\t5270:  0xC647,\n\t5271:  0xC649,\n\t5272:  0xC64A,\n\t5273:  0xC64B,\n\t5274:  0xC64C,\n\t5275:  0xC64D,\n\t5276:  0xC64E,\n\t5277:  0xC64F,\n\t5278:  0xC652,\n\t5279:  0xC656,\n\t5280:  0xC657,\n\t5281:  0xC658,\n\t5282:  0xC659,\n\t5283:  0xC65A,\n\t5284:  0xC65B,\n\t5285:  0xC65E,\n\t5286:  0xC65F,\n\t5287:  0xC661,\n\t5288:  0xC662,\n\t5289:  0xC663,\n\t5290:  0xC664,\n\t5291:  0xC665,\n\t5292:  0xC666,\n\t5293:  0xC667,\n\t5294:  0xC668,\n\t5295:  0xC669,\n\t5296:  0xC66A,\n\t5297:  0xC66B,\n\t5298:  0xC66D,\n\t5299:  0xC66E,\n\t5300:  0xC670,\n\t5301:  0xC672,\n\t5302:  0xC673,\n\t5303:  0xC674,\n\t5304:  0xC675,\n\t5305:  0xC676,\n\t5306:  0xC677,\n\t5307:  0xC67A,\n\t5308:  0xC67B,\n\t5309:  0xC67D,\n\t5310:  0xC67E,\n\t5311:  0xC67F,\n\t5312:  0xC681,\n\t5313:  0xC682,\n\t5314:  0xC683,\n\t5315:  0xC684,\n\t5316:  0xC685,\n\t5317:  0xC686,\n\t5318:  0xC687,\n\t5319:  0xC68A,\n\t5320:  0xC68C,\n\t5321:  0xC68E,\n\t5322:  0xC68F,\n\t5323:  0xC690,\n\t5324:  0xC691,\n\t5325:  0xC692,\n\t5326:  0xC693,\n\t5327:  0xC696,\n\t5328:  0xC697,\n\t5329:  0xC699,\n\t5330:  0xC69A,\n\t5331:  0xC69B,\n\t5332:  0xC69D,\n\t5333:  0xC69E,\n\t5334:  0xC69F,\n\t5335:  0xC6A0,\n\t5336:  0xC6A1,\n\t5337:  0xC6A2,\n\t5338:  0xC6A3,\n\t5339:  0xC6A6,\n\t5340:  0xC6A8,\n\t5341:  0xC6AA,\n\t5342:  0xC6AB,\n\t5343:  0xC6AC,\n\t5344:  0xC6AD,\n\t5345:  0xC6AE,\n\t5346:  0xC6AF,\n\t5347:  0xC6B2,\n\t5348:  0xC6B3,\n\t5349:  0xC6B5,\n\t5350:  0xC6B6,\n\t5351:  0xC6B7,\n\t5352:  0xC6BB,\n\t5353:  0xC6BC,\n\t5354:  0xC6BD,\n\t5355:  0xC6BE,\n\t5356:  0xC6BF,\n\t5357:  0xC6C2,\n\t5358:  0xC6C4,\n\t5359:  0xC6C6,\n\t5360:  0xC6C7,\n\t5361:  0xC6C8,\n\t5362:  0xC6C9,\n\t5363:  0xC6CA,\n\t5364:  0xC6CB,\n\t5365:  0xC6CE,\n\t5366:  0xC6CF,\n\t5367:  0xC6D1,\n\t5368:  0xC6D2,\n\t5369:  0xC6D3,\n\t5370:  0xC6D5,\n\t5371:  0xC6D6,\n\t5372:  0xC6D7,\n\t5373:  0xC6D8,\n\t5374:  0xC6D9,\n\t5375:  0xC6DA,\n\t5376:  0xC6DB,\n\t5377:  0xC6DE,\n\t5378:  0xC6DF,\n\t5379:  0xC6E2,\n\t5380:  0xC6E3,\n\t5381:  0xC6E4,\n\t5382:  0xC6E5,\n\t5383:  0xC6E6,\n\t5384:  0xC6E7,\n\t5385:  0xC6EA,\n\t5386:  0xC6EB,\n\t5387:  0xC6ED,\n\t5388:  0xC6EE,\n\t5389:  0xC6EF,\n\t5390:  0xC6F1,\n\t5391:  0xC6F2,\n\t5392:  0xC6F3,\n\t5393:  0xC6F4,\n\t5394:  0xC6F5,\n\t5395:  0xC6F6,\n\t5396:  0xC6F7,\n\t5397:  0xC6FA,\n\t5398:  0xC6FB,\n\t5399:  0xC6FC,\n\t5400:  0xC6FE,\n\t5401:  0xC6FF,\n\t5402:  0xC700,\n\t5403:  0xC701,\n\t5404:  0xC702,\n\t5405:  0xC703,\n\t5406:  0xC706,\n\t5407:  0xC707,\n\t5408:  0xC709,\n\t5409:  0xC70A,\n\t5410:  0xC70B,\n\t5411:  0xC70D,\n\t5412:  0xC70E,\n\t5413:  0xC70F,\n\t5414:  0xC710,\n\t5415:  0xC711,\n\t5416:  0xC712,\n\t5417:  0xC713,\n\t5418:  0xC716,\n\t5419:  0xC718,\n\t5420:  0xC71A,\n\t5421:  0xC71B,\n\t5422:  0xC71C,\n\t5423:  0xC71D,\n\t5424:  0xC71E,\n\t5425:  0xC71F,\n\t5426:  0xC722,\n\t5427:  0xC723,\n\t5428:  0xC725,\n\t5429:  0xC726,\n\t5430:  0xC727,\n\t5431:  0xC729,\n\t5432:  0xC72A,\n\t5433:  0xC72B,\n\t5434:  0xC72C,\n\t5435:  0xC72D,\n\t5436:  0xC72E,\n\t5437:  0xC72F,\n\t5438:  0xC732,\n\t5439:  0xC734,\n\t5440:  0xC736,\n\t5441:  0xC738,\n\t5442:  0xC739,\n\t5443:  0xC73A,\n\t5444:  0xC73B,\n\t5445:  0xC73E,\n\t5446:  0xC73F,\n\t5447:  0xC741,\n\t5448:  0xC742,\n\t5449:  0xC743,\n\t5450:  0xC745,\n\t5451:  0xC746,\n\t5452:  0xC747,\n\t5453:  0xC748,\n\t5454:  0xC749,\n\t5455:  0xC74B,\n\t5456:  0xC74E,\n\t5457:  0xC750,\n\t5458:  0xC759,\n\t5459:  0xC75A,\n\t5460:  0xC75B,\n\t5461:  0xC75D,\n\t5462:  0xC75E,\n\t5463:  0xC75F,\n\t5464:  0xC761,\n\t5465:  0xC762,\n\t5466:  0xC763,\n\t5467:  0xC764,\n\t5468:  0xC765,\n\t5469:  0xC766,\n\t5470:  0xC767,\n\t5471:  0xC769,\n\t5472:  0xC76A,\n\t5473:  0xC76C,\n\t5474:  0xC76D,\n\t5475:  0xC76E,\n\t5476:  0xC76F,\n\t5477:  0xC770,\n\t5478:  0xC771,\n\t5479:  0xC772,\n\t5480:  0xC773,\n\t5481:  0xC776,\n\t5482:  0xC777,\n\t5483:  0xC779,\n\t5484:  0xC77A,\n\t5485:  0xC77B,\n\t5486:  0xC77F,\n\t5487:  0xC780,\n\t5488:  0xC781,\n\t5489:  0xC782,\n\t5490:  0xC786,\n\t5491:  0xC78B,\n\t5492:  0xC78C,\n\t5493:  0xC78D,\n\t5494:  0xC78F,\n\t5495:  0xC792,\n\t5496:  0xC793,\n\t5497:  0xC795,\n\t5498:  0xC799,\n\t5499:  0xC79B,\n\t5500:  0xC79C,\n\t5501:  0xC79D,\n\t5502:  0xC79E,\n\t5503:  0xC79F,\n\t5504:  0xC7A2,\n\t5505:  0xC7A7,\n\t5506:  0xC7A8,\n\t5507:  0xC7A9,\n\t5508:  0xC7AA,\n\t5509:  0xC7AB,\n\t5510:  0xC7AE,\n\t5511:  0xC7AF,\n\t5512:  0xC7B1,\n\t5513:  0xC7B2,\n\t5514:  0xC7B3,\n\t5515:  0xC7B5,\n\t5516:  0xC7B6,\n\t5517:  0xC7B7,\n\t5518:  0xC7B8,\n\t5519:  0xC7B9,\n\t5520:  0xC7BA,\n\t5521:  0xC7BB,\n\t5522:  0xC7BE,\n\t5523:  0xC7C2,\n\t5524:  0xC7C3,\n\t5525:  0xC7C4,\n\t5526:  0xC7C5,\n\t5527:  0xC7C6,\n\t5528:  0xC7C7,\n\t5529:  0xC7CA,\n\t5530:  0xC7CB,\n\t5531:  0xC7CD,\n\t5532:  0xC7CF,\n\t5533:  0xC7D1,\n\t5534:  0xC7D2,\n\t5535:  0xC7D3,\n\t5536:  0xC7D4,\n\t5537:  0xC7D5,\n\t5538:  0xC7D6,\n\t5539:  0xC7D7,\n\t5540:  0xC7D9,\n\t5541:  0xC7DA,\n\t5542:  0xC7DB,\n\t5543:  0xC7DC,\n\t5544:  0xC7DE,\n\t5545:  0xC7DF,\n\t5546:  0xC7E0,\n\t5547:  0xC7E1,\n\t5548:  0xC7E2,\n\t5549:  0xC7E3,\n\t5550:  0xC7E5,\n\t5551:  0xC7E6,\n\t5552:  0xC7E7,\n\t5553:  0xC7E9,\n\t5554:  0xC7EA,\n\t5555:  0xC7EB,\n\t5556:  0xC7ED,\n\t5557:  0xC7EE,\n\t5558:  0xC7EF,\n\t5559:  0xC7F0,\n\t5560:  0xC7F1,\n\t5561:  0xC7F2,\n\t5562:  0xC7F3,\n\t5563:  0xC7F4,\n\t5564:  0xC7F5,\n\t5565:  0xC7F6,\n\t5566:  0xC7F7,\n\t5567:  0xC7F8,\n\t5568:  0xC7F9,\n\t5569:  0xC7FA,\n\t5570:  0xC7FB,\n\t5571:  0xC7FC,\n\t5572:  0xC7FD,\n\t5573:  0xC7FE,\n\t5574:  0xC7FF,\n\t5575:  0xC802,\n\t5576:  0xC803,\n\t5577:  0xC805,\n\t5578:  0xC806,\n\t5579:  0xC807,\n\t5580:  0xC809,\n\t5581:  0xC80B,\n\t5582:  0xC80C,\n\t5583:  0xC80D,\n\t5584:  0xC80E,\n\t5585:  0xC80F,\n\t5586:  0xC812,\n\t5587:  0xC814,\n\t5588:  0xC817,\n\t5589:  0xC818,\n\t5590:  0xC819,\n\t5591:  0xC81A,\n\t5592:  0xC81B,\n\t5593:  0xC81E,\n\t5594:  0xC81F,\n\t5595:  0xC821,\n\t5596:  0xC822,\n\t5597:  0xC823,\n\t5598:  0xC825,\n\t5599:  0xC826,\n\t5600:  0xC827,\n\t5601:  0xC828,\n\t5602:  0xC829,\n\t5603:  0xC82A,\n\t5604:  0xC82B,\n\t5605:  0xC82E,\n\t5606:  0xC830,\n\t5607:  0xC832,\n\t5608:  0xC833,\n\t5609:  0xC834,\n\t5610:  0xC835,\n\t5611:  0xC836,\n\t5612:  0xC837,\n\t5613:  0xC839,\n\t5614:  0xC83A,\n\t5615:  0xC83B,\n\t5616:  0xC83D,\n\t5617:  0xC83E,\n\t5618:  0xC83F,\n\t5619:  0xC841,\n\t5620:  0xC842,\n\t5621:  0xC843,\n\t5622:  0xC844,\n\t5623:  0xC845,\n\t5624:  0xC846,\n\t5625:  0xC847,\n\t5626:  0xC84A,\n\t5627:  0xC84B,\n\t5628:  0xC84E,\n\t5629:  0xC84F,\n\t5630:  0xC850,\n\t5631:  0xC851,\n\t5632:  0xC852,\n\t5633:  0xC853,\n\t5634:  0xC855,\n\t5635:  0xC856,\n\t5636:  0xC857,\n\t5637:  0xC858,\n\t5638:  0xC859,\n\t5639:  0xC85A,\n\t5640:  0xC85B,\n\t5641:  0xC85C,\n\t5642:  0xC85D,\n\t5643:  0xC85E,\n\t5644:  0xC85F,\n\t5645:  0xC860,\n\t5646:  0xC861,\n\t5647:  0xC862,\n\t5648:  0xC863,\n\t5649:  0xC864,\n\t5650:  0xC865,\n\t5651:  0xC866,\n\t5652:  0xC867,\n\t5653:  0xC868,\n\t5654:  0xC869,\n\t5655:  0xC86A,\n\t5656:  0xC86B,\n\t5657:  0xC86C,\n\t5658:  0xC86D,\n\t5659:  0xC86E,\n\t5660:  0xC86F,\n\t5661:  0xC872,\n\t5662:  0xC873,\n\t5663:  0xC875,\n\t5664:  0xC876,\n\t5665:  0xC877,\n\t5666:  0xC879,\n\t5667:  0xC87B,\n\t5668:  0xC87C,\n\t5669:  0xC87D,\n\t5670:  0xC87E,\n\t5671:  0xC87F,\n\t5672:  0xC882,\n\t5673:  0xC884,\n\t5674:  0xC888,\n\t5675:  0xC889,\n\t5676:  0xC88A,\n\t5677:  0xC88E,\n\t5678:  0xC88F,\n\t5679:  0xC890,\n\t5680:  0xC891,\n\t5681:  0xC892,\n\t5682:  0xC893,\n\t5683:  0xC895,\n\t5684:  0xC896,\n\t5685:  0xC897,\n\t5686:  0xC898,\n\t5687:  0xC899,\n\t5688:  0xC89A,\n\t5689:  0xC89B,\n\t5690:  0xC89C,\n\t5691:  0xC89E,\n\t5692:  0xC8A0,\n\t5693:  0xC8A2,\n\t5694:  0xC8A3,\n\t5695:  0xC8A4,\n\t5696:  0xC8A5,\n\t5697:  0xC8A6,\n\t5698:  0xC8A7,\n\t5699:  0xC8A9,\n\t5700:  0xC8AA,\n\t5701:  0xC8AB,\n\t5702:  0xC8AC,\n\t5703:  0xC8AD,\n\t5704:  0xC8AE,\n\t5705:  0xC8AF,\n\t5706:  0xC8B0,\n\t5707:  0xC8B1,\n\t5708:  0xC8B2,\n\t5709:  0xC8B3,\n\t5710:  0xC8B4,\n\t5711:  0xC8B5,\n\t5712:  0xC8B6,\n\t5713:  0xC8B7,\n\t5714:  0xC8B8,\n\t5715:  0xC8B9,\n\t5716:  0xC8BA,\n\t5717:  0xC8BB,\n\t5718:  0xC8BE,\n\t5719:  0xC8BF,\n\t5720:  0xC8C0,\n\t5721:  0xC8C1,\n\t5722:  0xC8C2,\n\t5723:  0xC8C3,\n\t5724:  0xC8C5,\n\t5725:  0xC8C6,\n\t5726:  0xC8C7,\n\t5727:  0xC8C9,\n\t5728:  0xC8CA,\n\t5729:  0xC8CB,\n\t5730:  0xC8CD,\n\t5731:  0xC8CE,\n\t5732:  0xC8CF,\n\t5733:  0xC8D0,\n\t5734:  0xC8D1,\n\t5735:  0xC8D2,\n\t5736:  0xC8D3,\n\t5737:  0xC8D6,\n\t5738:  0xC8D8,\n\t5739:  0xC8DA,\n\t5740:  0xC8DB,\n\t5741:  0xC8DC,\n\t5742:  0xC8DD,\n\t5743:  0xC8DE,\n\t5744:  0xC8DF,\n\t5745:  0xC8E2,\n\t5746:  0xC8E3,\n\t5747:  0xC8E5,\n\t5748:  0xC8E6,\n\t5749:  0xC8E7,\n\t5750:  0xC8E8,\n\t5751:  0xC8E9,\n\t5752:  0xC8EA,\n\t5753:  0xC8EB,\n\t5754:  0xC8EC,\n\t5755:  0xC8ED,\n\t5756:  0xC8EE,\n\t5757:  0xC8EF,\n\t5758:  0xC8F0,\n\t5759:  0xC8F1,\n\t5760:  0xC8F2,\n\t5761:  0xC8F3,\n\t5762:  0xC8F4,\n\t5763:  0xC8F6,\n\t5764:  0xC8F7,\n\t5765:  0xC8F8,\n\t5766:  0xC8F9,\n\t5767:  0xC8FA,\n\t5768:  0xC8FB,\n\t5769:  0xC8FE,\n\t5770:  0xC8FF,\n\t5771:  0xC901,\n\t5772:  0xC902,\n\t5773:  0xC903,\n\t5774:  0xC907,\n\t5775:  0xC908,\n\t5776:  0xC909,\n\t5777:  0xC90A,\n\t5778:  0xC90B,\n\t5779:  0xC90E,\n\t5780:  0x3000,\n\t5781:  0x3001,\n\t5782:  0x3002,\n\t5783:  0x00B7,\n\t5784:  0x2025,\n\t5785:  0x2026,\n\t5786:  0x00A8,\n\t5787:  0x3003,\n\t5788:  0x00AD,\n\t5789:  0x2015,\n\t5790:  0x2225,\n\t5791:  0xFF3C,\n\t5792:  0x223C,\n\t5793:  0x2018,\n\t5794:  0x2019,\n\t5795:  0x201C,\n\t5796:  0x201D,\n\t5797:  0x3014,\n\t5798:  0x3015,\n\t5799:  0x3008,\n\t5800:  0x3009,\n\t5801:  0x300A,\n\t5802:  0x300B,\n\t5803:  0x300C,\n\t5804:  0x300D,\n\t5805:  0x300E,\n\t5806:  0x300F,\n\t5807:  0x3010,\n\t5808:  0x3011,\n\t5809:  0x00B1,\n\t5810:  0x00D7,\n\t5811:  0x00F7,\n\t5812:  0x2260,\n\t5813:  0x2264,\n\t5814:  0x2265,\n\t5815:  0x221E,\n\t5816:  0x2234,\n\t5817:  0x00B0,\n\t5818:  0x2032,\n\t5819:  0x2033,\n\t5820:  0x2103,\n\t5821:  0x212B,\n\t5822:  0xFFE0,\n\t5823:  0xFFE1,\n\t5824:  0xFFE5,\n\t5825:  0x2642,\n\t5826:  0x2640,\n\t5827:  0x2220,\n\t5828:  0x22A5,\n\t5829:  0x2312,\n\t5830:  0x2202,\n\t5831:  0x2207,\n\t5832:  0x2261,\n\t5833:  0x2252,\n\t5834:  0x00A7,\n\t5835:  0x203B,\n\t5836:  0x2606,\n\t5837:  0x2605,\n\t5838:  0x25CB,\n\t5839:  0x25CF,\n\t5840:  0x25CE,\n\t5841:  0x25C7,\n\t5842:  0x25C6,\n\t5843:  0x25A1,\n\t5844:  0x25A0,\n\t5845:  0x25B3,\n\t5846:  0x25B2,\n\t5847:  0x25BD,\n\t5848:  0x25BC,\n\t5849:  0x2192,\n\t5850:  0x2190,\n\t5851:  0x2191,\n\t5852:  0x2193,\n\t5853:  0x2194,\n\t5854:  0x3013,\n\t5855:  0x226A,\n\t5856:  0x226B,\n\t5857:  0x221A,\n\t5858:  0x223D,\n\t5859:  0x221D,\n\t5860:  0x2235,\n\t5861:  0x222B,\n\t5862:  0x222C,\n\t5863:  0x2208,\n\t5864:  0x220B,\n\t5865:  0x2286,\n\t5866:  0x2287,\n\t5867:  0x2282,\n\t5868:  0x2283,\n\t5869:  0x222A,\n\t5870:  0x2229,\n\t5871:  0x2227,\n\t5872:  0x2228,\n\t5873:  0xFFE2,\n\t5874:  0xC910,\n\t5875:  0xC912,\n\t5876:  0xC913,\n\t5877:  0xC914,\n\t5878:  0xC915,\n\t5879:  0xC916,\n\t5880:  0xC917,\n\t5881:  0xC919,\n\t5882:  0xC91A,\n\t5883:  0xC91B,\n\t5884:  0xC91C,\n\t5885:  0xC91D,\n\t5886:  0xC91E,\n\t5887:  0xC91F,\n\t5888:  0xC920,\n\t5889:  0xC921,\n\t5890:  0xC922,\n\t5891:  0xC923,\n\t5892:  0xC924,\n\t5893:  0xC925,\n\t5894:  0xC926,\n\t5895:  0xC927,\n\t5896:  0xC928,\n\t5897:  0xC929,\n\t5898:  0xC92A,\n\t5899:  0xC92B,\n\t5900:  0xC92D,\n\t5901:  0xC92E,\n\t5902:  0xC92F,\n\t5903:  0xC930,\n\t5904:  0xC931,\n\t5905:  0xC932,\n\t5906:  0xC933,\n\t5907:  0xC935,\n\t5908:  0xC936,\n\t5909:  0xC937,\n\t5910:  0xC938,\n\t5911:  0xC939,\n\t5912:  0xC93A,\n\t5913:  0xC93B,\n\t5914:  0xC93C,\n\t5915:  0xC93D,\n\t5916:  0xC93E,\n\t5917:  0xC93F,\n\t5918:  0xC940,\n\t5919:  0xC941,\n\t5920:  0xC942,\n\t5921:  0xC943,\n\t5922:  0xC944,\n\t5923:  0xC945,\n\t5924:  0xC946,\n\t5925:  0xC947,\n\t5926:  0xC948,\n\t5927:  0xC949,\n\t5928:  0xC94A,\n\t5929:  0xC94B,\n\t5930:  0xC94C,\n\t5931:  0xC94D,\n\t5932:  0xC94E,\n\t5933:  0xC94F,\n\t5934:  0xC952,\n\t5935:  0xC953,\n\t5936:  0xC955,\n\t5937:  0xC956,\n\t5938:  0xC957,\n\t5939:  0xC959,\n\t5940:  0xC95A,\n\t5941:  0xC95B,\n\t5942:  0xC95C,\n\t5943:  0xC95D,\n\t5944:  0xC95E,\n\t5945:  0xC95F,\n\t5946:  0xC962,\n\t5947:  0xC964,\n\t5948:  0xC965,\n\t5949:  0xC966,\n\t5950:  0xC967,\n\t5951:  0xC968,\n\t5952:  0xC969,\n\t5953:  0xC96A,\n\t5954:  0xC96B,\n\t5955:  0xC96D,\n\t5956:  0xC96E,\n\t5957:  0xC96F,\n\t5958:  0x21D2,\n\t5959:  0x21D4,\n\t5960:  0x2200,\n\t5961:  0x2203,\n\t5962:  0x00B4,\n\t5963:  0xFF5E,\n\t5964:  0x02C7,\n\t5965:  0x02D8,\n\t5966:  0x02DD,\n\t5967:  0x02DA,\n\t5968:  0x02D9,\n\t5969:  0x00B8,\n\t5970:  0x02DB,\n\t5971:  0x00A1,\n\t5972:  0x00BF,\n\t5973:  0x02D0,\n\t5974:  0x222E,\n\t5975:  0x2211,\n\t5976:  0x220F,\n\t5977:  0x00A4,\n\t5978:  0x2109,\n\t5979:  0x2030,\n\t5980:  0x25C1,\n\t5981:  0x25C0,\n\t5982:  0x25B7,\n\t5983:  0x25B6,\n\t5984:  0x2664,\n\t5985:  0x2660,\n\t5986:  0x2661,\n\t5987:  0x2665,\n\t5988:  0x2667,\n\t5989:  0x2663,\n\t5990:  0x2299,\n\t5991:  0x25C8,\n\t5992:  0x25A3,\n\t5993:  0x25D0,\n\t5994:  0x25D1,\n\t5995:  0x2592,\n\t5996:  0x25A4,\n\t5997:  0x25A5,\n\t5998:  0x25A8,\n\t5999:  0x25A7,\n\t6000:  0x25A6,\n\t6001:  0x25A9,\n\t6002:  0x2668,\n\t6003:  0x260F,\n\t6004:  0x260E,\n\t6005:  0x261C,\n\t6006:  0x261E,\n\t6007:  0x00B6,\n\t6008:  0x2020,\n\t6009:  0x2021,\n\t6010:  0x2195,\n\t6011:  0x2197,\n\t6012:  0x2199,\n\t6013:  0x2196,\n\t6014:  0x2198,\n\t6015:  0x266D,\n\t6016:  0x2669,\n\t6017:  0x266A,\n\t6018:  0x266C,\n\t6019:  0x327F,\n\t6020:  0x321C,\n\t6021:  0x2116,\n\t6022:  0x33C7,\n\t6023:  0x2122,\n\t6024:  0x33C2,\n\t6025:  0x33D8,\n\t6026:  0x2121,\n\t6027:  0x20AC,\n\t6028:  0x00AE,\n\t6052:  0xC971,\n\t6053:  0xC972,\n\t6054:  0xC973,\n\t6055:  0xC975,\n\t6056:  0xC976,\n\t6057:  0xC977,\n\t6058:  0xC978,\n\t6059:  0xC979,\n\t6060:  0xC97A,\n\t6061:  0xC97B,\n\t6062:  0xC97D,\n\t6063:  0xC97E,\n\t6064:  0xC97F,\n\t6065:  0xC980,\n\t6066:  0xC981,\n\t6067:  0xC982,\n\t6068:  0xC983,\n\t6069:  0xC984,\n\t6070:  0xC985,\n\t6071:  0xC986,\n\t6072:  0xC987,\n\t6073:  0xC98A,\n\t6074:  0xC98B,\n\t6075:  0xC98D,\n\t6076:  0xC98E,\n\t6077:  0xC98F,\n\t6078:  0xC991,\n\t6079:  0xC992,\n\t6080:  0xC993,\n\t6081:  0xC994,\n\t6082:  0xC995,\n\t6083:  0xC996,\n\t6084:  0xC997,\n\t6085:  0xC99A,\n\t6086:  0xC99C,\n\t6087:  0xC99E,\n\t6088:  0xC99F,\n\t6089:  0xC9A0,\n\t6090:  0xC9A1,\n\t6091:  0xC9A2,\n\t6092:  0xC9A3,\n\t6093:  0xC9A4,\n\t6094:  0xC9A5,\n\t6095:  0xC9A6,\n\t6096:  0xC9A7,\n\t6097:  0xC9A8,\n\t6098:  0xC9A9,\n\t6099:  0xC9AA,\n\t6100:  0xC9AB,\n\t6101:  0xC9AC,\n\t6102:  0xC9AD,\n\t6103:  0xC9AE,\n\t6104:  0xC9AF,\n\t6105:  0xC9B0,\n\t6106:  0xC9B1,\n\t6107:  0xC9B2,\n\t6108:  0xC9B3,\n\t6109:  0xC9B4,\n\t6110:  0xC9B5,\n\t6111:  0xC9B6,\n\t6112:  0xC9B7,\n\t6113:  0xC9B8,\n\t6114:  0xC9B9,\n\t6115:  0xC9BA,\n\t6116:  0xC9BB,\n\t6117:  0xC9BC,\n\t6118:  0xC9BD,\n\t6119:  0xC9BE,\n\t6120:  0xC9BF,\n\t6121:  0xC9C2,\n\t6122:  0xC9C3,\n\t6123:  0xC9C5,\n\t6124:  0xC9C6,\n\t6125:  0xC9C9,\n\t6126:  0xC9CB,\n\t6127:  0xC9CC,\n\t6128:  0xC9CD,\n\t6129:  0xC9CE,\n\t6130:  0xC9CF,\n\t6131:  0xC9D2,\n\t6132:  0xC9D4,\n\t6133:  0xC9D7,\n\t6134:  0xC9D8,\n\t6135:  0xC9DB,\n\t6136:  0xFF01,\n\t6137:  0xFF02,\n\t6138:  0xFF03,\n\t6139:  0xFF04,\n\t6140:  0xFF05,\n\t6141:  0xFF06,\n\t6142:  0xFF07,\n\t6143:  0xFF08,\n\t6144:  0xFF09,\n\t6145:  0xFF0A,\n\t6146:  0xFF0B,\n\t6147:  0xFF0C,\n\t6148:  0xFF0D,\n\t6149:  0xFF0E,\n\t6150:  0xFF0F,\n\t6151:  0xFF10,\n\t6152:  0xFF11,\n\t6153:  0xFF12,\n\t6154:  0xFF13,\n\t6155:  0xFF14,\n\t6156:  0xFF15,\n\t6157:  0xFF16,\n\t6158:  0xFF17,\n\t6159:  0xFF18,\n\t6160:  0xFF19,\n\t6161:  0xFF1A,\n\t6162:  0xFF1B,\n\t6163:  0xFF1C,\n\t6164:  0xFF1D,\n\t6165:  0xFF1E,\n\t6166:  0xFF1F,\n\t6167:  0xFF20,\n\t6168:  0xFF21,\n\t6169:  0xFF22,\n\t6170:  0xFF23,\n\t6171:  0xFF24,\n\t6172:  0xFF25,\n\t6173:  0xFF26,\n\t6174:  0xFF27,\n\t6175:  0xFF28,\n\t6176:  0xFF29,\n\t6177:  0xFF2A,\n\t6178:  0xFF2B,\n\t6179:  0xFF2C,\n\t6180:  0xFF2D,\n\t6181:  0xFF2E,\n\t6182:  0xFF2F,\n\t6183:  0xFF30,\n\t6184:  0xFF31,\n\t6185:  0xFF32,\n\t6186:  0xFF33,\n\t6187:  0xFF34,\n\t6188:  0xFF35,\n\t6189:  0xFF36,\n\t6190:  0xFF37,\n\t6191:  0xFF38,\n\t6192:  0xFF39,\n\t6193:  0xFF3A,\n\t6194:  0xFF3B,\n\t6195:  0xFFE6,\n\t6196:  0xFF3D,\n\t6197:  0xFF3E,\n\t6198:  0xFF3F,\n\t6199:  0xFF40,\n\t6200:  0xFF41,\n\t6201:  0xFF42,\n\t6202:  0xFF43,\n\t6203:  0xFF44,\n\t6204:  0xFF45,\n\t6205:  0xFF46,\n\t6206:  0xFF47,\n\t6207:  0xFF48,\n\t6208:  0xFF49,\n\t6209:  0xFF4A,\n\t6210:  0xFF4B,\n\t6211:  0xFF4C,\n\t6212:  0xFF4D,\n\t6213:  0xFF4E,\n\t6214:  0xFF4F,\n\t6215:  0xFF50,\n\t6216:  0xFF51,\n\t6217:  0xFF52,\n\t6218:  0xFF53,\n\t6219:  0xFF54,\n\t6220:  0xFF55,\n\t6221:  0xFF56,\n\t6222:  0xFF57,\n\t6223:  0xFF58,\n\t6224:  0xFF59,\n\t6225:  0xFF5A,\n\t6226:  0xFF5B,\n\t6227:  0xFF5C,\n\t6228:  0xFF5D,\n\t6229:  0xFFE3,\n\t6230:  0xC9DE,\n\t6231:  0xC9DF,\n\t6232:  0xC9E1,\n\t6233:  0xC9E3,\n\t6234:  0xC9E5,\n\t6235:  0xC9E6,\n\t6236:  0xC9E8,\n\t6237:  0xC9E9,\n\t6238:  0xC9EA,\n\t6239:  0xC9EB,\n\t6240:  0xC9EE,\n\t6241:  0xC9F2,\n\t6242:  0xC9F3,\n\t6243:  0xC9F4,\n\t6244:  0xC9F5,\n\t6245:  0xC9F6,\n\t6246:  0xC9F7,\n\t6247:  0xC9FA,\n\t6248:  0xC9FB,\n\t6249:  0xC9FD,\n\t6250:  0xC9FE,\n\t6251:  0xC9FF,\n\t6252:  0xCA01,\n\t6253:  0xCA02,\n\t6254:  0xCA03,\n\t6255:  0xCA04,\n\t6256:  0xCA05,\n\t6257:  0xCA06,\n\t6258:  0xCA07,\n\t6259:  0xCA0A,\n\t6260:  0xCA0E,\n\t6261:  0xCA0F,\n\t6262:  0xCA10,\n\t6263:  0xCA11,\n\t6264:  0xCA12,\n\t6265:  0xCA13,\n\t6266:  0xCA15,\n\t6267:  0xCA16,\n\t6268:  0xCA17,\n\t6269:  0xCA19,\n\t6270:  0xCA1A,\n\t6271:  0xCA1B,\n\t6272:  0xCA1C,\n\t6273:  0xCA1D,\n\t6274:  0xCA1E,\n\t6275:  0xCA1F,\n\t6276:  0xCA20,\n\t6277:  0xCA21,\n\t6278:  0xCA22,\n\t6279:  0xCA23,\n\t6280:  0xCA24,\n\t6281:  0xCA25,\n\t6282:  0xCA26,\n\t6283:  0xCA27,\n\t6284:  0xCA28,\n\t6285:  0xCA2A,\n\t6286:  0xCA2B,\n\t6287:  0xCA2C,\n\t6288:  0xCA2D,\n\t6289:  0xCA2E,\n\t6290:  0xCA2F,\n\t6291:  0xCA30,\n\t6292:  0xCA31,\n\t6293:  0xCA32,\n\t6294:  0xCA33,\n\t6295:  0xCA34,\n\t6296:  0xCA35,\n\t6297:  0xCA36,\n\t6298:  0xCA37,\n\t6299:  0xCA38,\n\t6300:  0xCA39,\n\t6301:  0xCA3A,\n\t6302:  0xCA3B,\n\t6303:  0xCA3C,\n\t6304:  0xCA3D,\n\t6305:  0xCA3E,\n\t6306:  0xCA3F,\n\t6307:  0xCA40,\n\t6308:  0xCA41,\n\t6309:  0xCA42,\n\t6310:  0xCA43,\n\t6311:  0xCA44,\n\t6312:  0xCA45,\n\t6313:  0xCA46,\n\t6314:  0x3131,\n\t6315:  0x3132,\n\t6316:  0x3133,\n\t6317:  0x3134,\n\t6318:  0x3135,\n\t6319:  0x3136,\n\t6320:  0x3137,\n\t6321:  0x3138,\n\t6322:  0x3139,\n\t6323:  0x313A,\n\t6324:  0x313B,\n\t6325:  0x313C,\n\t6326:  0x313D,\n\t6327:  0x313E,\n\t6328:  0x313F,\n\t6329:  0x3140,\n\t6330:  0x3141,\n\t6331:  0x3142,\n\t6332:  0x3143,\n\t6333:  0x3144,\n\t6334:  0x3145,\n\t6335:  0x3146,\n\t6336:  0x3147,\n\t6337:  0x3148,\n\t6338:  0x3149,\n\t6339:  0x314A,\n\t6340:  0x314B,\n\t6341:  0x314C,\n\t6342:  0x314D,\n\t6343:  0x314E,\n\t6344:  0x314F,\n\t6345:  0x3150,\n\t6346:  0x3151,\n\t6347:  0x3152,\n\t6348:  0x3153,\n\t6349:  0x3154,\n\t6350:  0x3155,\n\t6351:  0x3156,\n\t6352:  0x3157,\n\t6353:  0x3158,\n\t6354:  0x3159,\n\t6355:  0x315A,\n\t6356:  0x315B,\n\t6357:  0x315C,\n\t6358:  0x315D,\n\t6359:  0x315E,\n\t6360:  0x315F,\n\t6361:  0x3160,\n\t6362:  0x3161,\n\t6363:  0x3162,\n\t6364:  0x3163,\n\t6365:  0x3164,\n\t6366:  0x3165,\n\t6367:  0x3166,\n\t6368:  0x3167,\n\t6369:  0x3168,\n\t6370:  0x3169,\n\t6371:  0x316A,\n\t6372:  0x316B,\n\t6373:  0x316C,\n\t6374:  0x316D,\n\t6375:  0x316E,\n\t6376:  0x316F,\n\t6377:  0x3170,\n\t6378:  0x3171,\n\t6379:  0x3172,\n\t6380:  0x3173,\n\t6381:  0x3174,\n\t6382:  0x3175,\n\t6383:  0x3176,\n\t6384:  0x3177,\n\t6385:  0x3178,\n\t6386:  0x3179,\n\t6387:  0x317A,\n\t6388:  0x317B,\n\t6389:  0x317C,\n\t6390:  0x317D,\n\t6391:  0x317E,\n\t6392:  0x317F,\n\t6393:  0x3180,\n\t6394:  0x3181,\n\t6395:  0x3182,\n\t6396:  0x3183,\n\t6397:  0x3184,\n\t6398:  0x3185,\n\t6399:  0x3186,\n\t6400:  0x3187,\n\t6401:  0x3188,\n\t6402:  0x3189,\n\t6403:  0x318A,\n\t6404:  0x318B,\n\t6405:  0x318C,\n\t6406:  0x318D,\n\t6407:  0x318E,\n\t6408:  0xCA47,\n\t6409:  0xCA48,\n\t6410:  0xCA49,\n\t6411:  0xCA4A,\n\t6412:  0xCA4B,\n\t6413:  0xCA4E,\n\t6414:  0xCA4F,\n\t6415:  0xCA51,\n\t6416:  0xCA52,\n\t6417:  0xCA53,\n\t6418:  0xCA55,\n\t6419:  0xCA56,\n\t6420:  0xCA57,\n\t6421:  0xCA58,\n\t6422:  0xCA59,\n\t6423:  0xCA5A,\n\t6424:  0xCA5B,\n\t6425:  0xCA5E,\n\t6426:  0xCA62,\n\t6427:  0xCA63,\n\t6428:  0xCA64,\n\t6429:  0xCA65,\n\t6430:  0xCA66,\n\t6431:  0xCA67,\n\t6432:  0xCA69,\n\t6433:  0xCA6A,\n\t6434:  0xCA6B,\n\t6435:  0xCA6C,\n\t6436:  0xCA6D,\n\t6437:  0xCA6E,\n\t6438:  0xCA6F,\n\t6439:  0xCA70,\n\t6440:  0xCA71,\n\t6441:  0xCA72,\n\t6442:  0xCA73,\n\t6443:  0xCA74,\n\t6444:  0xCA75,\n\t6445:  0xCA76,\n\t6446:  0xCA77,\n\t6447:  0xCA78,\n\t6448:  0xCA79,\n\t6449:  0xCA7A,\n\t6450:  0xCA7B,\n\t6451:  0xCA7C,\n\t6452:  0xCA7E,\n\t6453:  0xCA7F,\n\t6454:  0xCA80,\n\t6455:  0xCA81,\n\t6456:  0xCA82,\n\t6457:  0xCA83,\n\t6458:  0xCA85,\n\t6459:  0xCA86,\n\t6460:  0xCA87,\n\t6461:  0xCA88,\n\t6462:  0xCA89,\n\t6463:  0xCA8A,\n\t6464:  0xCA8B,\n\t6465:  0xCA8C,\n\t6466:  0xCA8D,\n\t6467:  0xCA8E,\n\t6468:  0xCA8F,\n\t6469:  0xCA90,\n\t6470:  0xCA91,\n\t6471:  0xCA92,\n\t6472:  0xCA93,\n\t6473:  0xCA94,\n\t6474:  0xCA95,\n\t6475:  0xCA96,\n\t6476:  0xCA97,\n\t6477:  0xCA99,\n\t6478:  0xCA9A,\n\t6479:  0xCA9B,\n\t6480:  0xCA9C,\n\t6481:  0xCA9D,\n\t6482:  0xCA9E,\n\t6483:  0xCA9F,\n\t6484:  0xCAA0,\n\t6485:  0xCAA1,\n\t6486:  0xCAA2,\n\t6487:  0xCAA3,\n\t6488:  0xCAA4,\n\t6489:  0xCAA5,\n\t6490:  0xCAA6,\n\t6491:  0xCAA7,\n\t6492:  0x2170,\n\t6493:  0x2171,\n\t6494:  0x2172,\n\t6495:  0x2173,\n\t6496:  0x2174,\n\t6497:  0x2175,\n\t6498:  0x2176,\n\t6499:  0x2177,\n\t6500:  0x2178,\n\t6501:  0x2179,\n\t6507:  0x2160,\n\t6508:  0x2161,\n\t6509:  0x2162,\n\t6510:  0x2163,\n\t6511:  0x2164,\n\t6512:  0x2165,\n\t6513:  0x2166,\n\t6514:  0x2167,\n\t6515:  0x2168,\n\t6516:  0x2169,\n\t6524:  0x0391,\n\t6525:  0x0392,\n\t6526:  0x0393,\n\t6527:  0x0394,\n\t6528:  0x0395,\n\t6529:  0x0396,\n\t6530:  0x0397,\n\t6531:  0x0398,\n\t6532:  0x0399,\n\t6533:  0x039A,\n\t6534:  0x039B,\n\t6535:  0x039C,\n\t6536:  0x039D,\n\t6537:  0x039E,\n\t6538:  0x039F,\n\t6539:  0x03A0,\n\t6540:  0x03A1,\n\t6541:  0x03A3,\n\t6542:  0x03A4,\n\t6543:  0x03A5,\n\t6544:  0x03A6,\n\t6545:  0x03A7,\n\t6546:  0x03A8,\n\t6547:  0x03A9,\n\t6556:  0x03B1,\n\t6557:  0x03B2,\n\t6558:  0x03B3,\n\t6559:  0x03B4,\n\t6560:  0x03B5,\n\t6561:  0x03B6,\n\t6562:  0x03B7,\n\t6563:  0x03B8,\n\t6564:  0x03B9,\n\t6565:  0x03BA,\n\t6566:  0x03BB,\n\t6567:  0x03BC,\n\t6568:  0x03BD,\n\t6569:  0x03BE,\n\t6570:  0x03BF,\n\t6571:  0x03C0,\n\t6572:  0x03C1,\n\t6573:  0x03C3,\n\t6574:  0x03C4,\n\t6575:  0x03C5,\n\t6576:  0x03C6,\n\t6577:  0x03C7,\n\t6578:  0x03C8,\n\t6579:  0x03C9,\n\t6586:  0xCAA8,\n\t6587:  0xCAA9,\n\t6588:  0xCAAA,\n\t6589:  0xCAAB,\n\t6590:  0xCAAC,\n\t6591:  0xCAAD,\n\t6592:  0xCAAE,\n\t6593:  0xCAAF,\n\t6594:  0xCAB0,\n\t6595:  0xCAB1,\n\t6596:  0xCAB2,\n\t6597:  0xCAB3,\n\t6598:  0xCAB4,\n\t6599:  0xCAB5,\n\t6600:  0xCAB6,\n\t6601:  0xCAB7,\n\t6602:  0xCAB8,\n\t6603:  0xCAB9,\n\t6604:  0xCABA,\n\t6605:  0xCABB,\n\t6606:  0xCABE,\n\t6607:  0xCABF,\n\t6608:  0xCAC1,\n\t6609:  0xCAC2,\n\t6610:  0xCAC3,\n\t6611:  0xCAC5,\n\t6612:  0xCAC6,\n\t6613:  0xCAC7,\n\t6614:  0xCAC8,\n\t6615:  0xCAC9,\n\t6616:  0xCACA,\n\t6617:  0xCACB,\n\t6618:  0xCACE,\n\t6619:  0xCAD0,\n\t6620:  0xCAD2,\n\t6621:  0xCAD4,\n\t6622:  0xCAD5,\n\t6623:  0xCAD6,\n\t6624:  0xCAD7,\n\t6625:  0xCADA,\n\t6626:  0xCADB,\n\t6627:  0xCADC,\n\t6628:  0xCADD,\n\t6629:  0xCADE,\n\t6630:  0xCADF,\n\t6631:  0xCAE1,\n\t6632:  0xCAE2,\n\t6633:  0xCAE3,\n\t6634:  0xCAE4,\n\t6635:  0xCAE5,\n\t6636:  0xCAE6,\n\t6637:  0xCAE7,\n\t6638:  0xCAE8,\n\t6639:  0xCAE9,\n\t6640:  0xCAEA,\n\t6641:  0xCAEB,\n\t6642:  0xCAED,\n\t6643:  0xCAEE,\n\t6644:  0xCAEF,\n\t6645:  0xCAF0,\n\t6646:  0xCAF1,\n\t6647:  0xCAF2,\n\t6648:  0xCAF3,\n\t6649:  0xCAF5,\n\t6650:  0xCAF6,\n\t6651:  0xCAF7,\n\t6652:  0xCAF8,\n\t6653:  0xCAF9,\n\t6654:  0xCAFA,\n\t6655:  0xCAFB,\n\t6656:  0xCAFC,\n\t6657:  0xCAFD,\n\t6658:  0xCAFE,\n\t6659:  0xCAFF,\n\t6660:  0xCB00,\n\t6661:  0xCB01,\n\t6662:  0xCB02,\n\t6663:  0xCB03,\n\t6664:  0xCB04,\n\t6665:  0xCB05,\n\t6666:  0xCB06,\n\t6667:  0xCB07,\n\t6668:  0xCB09,\n\t6669:  0xCB0A,\n\t6670:  0x2500,\n\t6671:  0x2502,\n\t6672:  0x250C,\n\t6673:  0x2510,\n\t6674:  0x2518,\n\t6675:  0x2514,\n\t6676:  0x251C,\n\t6677:  0x252C,\n\t6678:  0x2524,\n\t6679:  0x2534,\n\t6680:  0x253C,\n\t6681:  0x2501,\n\t6682:  0x2503,\n\t6683:  0x250F,\n\t6684:  0x2513,\n\t6685:  0x251B,\n\t6686:  0x2517,\n\t6687:  0x2523,\n\t6688:  0x2533,\n\t6689:  0x252B,\n\t6690:  0x253B,\n\t6691:  0x254B,\n\t6692:  0x2520,\n\t6693:  0x252F,\n\t6694:  0x2528,\n\t6695:  0x2537,\n\t6696:  0x253F,\n\t6697:  0x251D,\n\t6698:  0x2530,\n\t6699:  0x2525,\n\t6700:  0x2538,\n\t6701:  0x2542,\n\t6702:  0x2512,\n\t6703:  0x2511,\n\t6704:  0x251A,\n\t6705:  0x2519,\n\t6706:  0x2516,\n\t6707:  0x2515,\n\t6708:  0x250E,\n\t6709:  0x250D,\n\t6710:  0x251E,\n\t6711:  0x251F,\n\t6712:  0x2521,\n\t6713:  0x2522,\n\t6714:  0x2526,\n\t6715:  0x2527,\n\t6716:  0x2529,\n\t6717:  0x252A,\n\t6718:  0x252D,\n\t6719:  0x252E,\n\t6720:  0x2531,\n\t6721:  0x2532,\n\t6722:  0x2535,\n\t6723:  0x2536,\n\t6724:  0x2539,\n\t6725:  0x253A,\n\t6726:  0x253D,\n\t6727:  0x253E,\n\t6728:  0x2540,\n\t6729:  0x2541,\n\t6730:  0x2543,\n\t6731:  0x2544,\n\t6732:  0x2545,\n\t6733:  0x2546,\n\t6734:  0x2547,\n\t6735:  0x2548,\n\t6736:  0x2549,\n\t6737:  0x254A,\n\t6764:  0xCB0B,\n\t6765:  0xCB0C,\n\t6766:  0xCB0D,\n\t6767:  0xCB0E,\n\t6768:  0xCB0F,\n\t6769:  0xCB11,\n\t6770:  0xCB12,\n\t6771:  0xCB13,\n\t6772:  0xCB15,\n\t6773:  0xCB16,\n\t6774:  0xCB17,\n\t6775:  0xCB19,\n\t6776:  0xCB1A,\n\t6777:  0xCB1B,\n\t6778:  0xCB1C,\n\t6779:  0xCB1D,\n\t6780:  0xCB1E,\n\t6781:  0xCB1F,\n\t6782:  0xCB22,\n\t6783:  0xCB23,\n\t6784:  0xCB24,\n\t6785:  0xCB25,\n\t6786:  0xCB26,\n\t6787:  0xCB27,\n\t6788:  0xCB28,\n\t6789:  0xCB29,\n\t6790:  0xCB2A,\n\t6791:  0xCB2B,\n\t6792:  0xCB2C,\n\t6793:  0xCB2D,\n\t6794:  0xCB2E,\n\t6795:  0xCB2F,\n\t6796:  0xCB30,\n\t6797:  0xCB31,\n\t6798:  0xCB32,\n\t6799:  0xCB33,\n\t6800:  0xCB34,\n\t6801:  0xCB35,\n\t6802:  0xCB36,\n\t6803:  0xCB37,\n\t6804:  0xCB38,\n\t6805:  0xCB39,\n\t6806:  0xCB3A,\n\t6807:  0xCB3B,\n\t6808:  0xCB3C,\n\t6809:  0xCB3D,\n\t6810:  0xCB3E,\n\t6811:  0xCB3F,\n\t6812:  0xCB40,\n\t6813:  0xCB42,\n\t6814:  0xCB43,\n\t6815:  0xCB44,\n\t6816:  0xCB45,\n\t6817:  0xCB46,\n\t6818:  0xCB47,\n\t6819:  0xCB4A,\n\t6820:  0xCB4B,\n\t6821:  0xCB4D,\n\t6822:  0xCB4E,\n\t6823:  0xCB4F,\n\t6824:  0xCB51,\n\t6825:  0xCB52,\n\t6826:  0xCB53,\n\t6827:  0xCB54,\n\t6828:  0xCB55,\n\t6829:  0xCB56,\n\t6830:  0xCB57,\n\t6831:  0xCB5A,\n\t6832:  0xCB5B,\n\t6833:  0xCB5C,\n\t6834:  0xCB5E,\n\t6835:  0xCB5F,\n\t6836:  0xCB60,\n\t6837:  0xCB61,\n\t6838:  0xCB62,\n\t6839:  0xCB63,\n\t6840:  0xCB65,\n\t6841:  0xCB66,\n\t6842:  0xCB67,\n\t6843:  0xCB68,\n\t6844:  0xCB69,\n\t6845:  0xCB6A,\n\t6846:  0xCB6B,\n\t6847:  0xCB6C,\n\t6848:  0x3395,\n\t6849:  0x3396,\n\t6850:  0x3397,\n\t6851:  0x2113,\n\t6852:  0x3398,\n\t6853:  0x33C4,\n\t6854:  0x33A3,\n\t6855:  0x33A4,\n\t6856:  0x33A5,\n\t6857:  0x33A6,\n\t6858:  0x3399,\n\t6859:  0x339A,\n\t6860:  0x339B,\n\t6861:  0x339C,\n\t6862:  0x339D,\n\t6863:  0x339E,\n\t6864:  0x339F,\n\t6865:  0x33A0,\n\t6866:  0x33A1,\n\t6867:  0x33A2,\n\t6868:  0x33CA,\n\t6869:  0x338D,\n\t6870:  0x338E,\n\t6871:  0x338F,\n\t6872:  0x33CF,\n\t6873:  0x3388,\n\t6874:  0x3389,\n\t6875:  0x33C8,\n\t6876:  0x33A7,\n\t6877:  0x33A8,\n\t6878:  0x33B0,\n\t6879:  0x33B1,\n\t6880:  0x33B2,\n\t6881:  0x33B3,\n\t6882:  0x33B4,\n\t6883:  0x33B5,\n\t6884:  0x33B6,\n\t6885:  0x33B7,\n\t6886:  0x33B8,\n\t6887:  0x33B9,\n\t6888:  0x3380,\n\t6889:  0x3381,\n\t6890:  0x3382,\n\t6891:  0x3383,\n\t6892:  0x3384,\n\t6893:  0x33BA,\n\t6894:  0x33BB,\n\t6895:  0x33BC,\n\t6896:  0x33BD,\n\t6897:  0x33BE,\n\t6898:  0x33BF,\n\t6899:  0x3390,\n\t6900:  0x3391,\n\t6901:  0x3392,\n\t6902:  0x3393,\n\t6903:  0x3394,\n\t6904:  0x2126,\n\t6905:  0x33C0,\n\t6906:  0x33C1,\n\t6907:  0x338A,\n\t6908:  0x338B,\n\t6909:  0x338C,\n\t6910:  0x33D6,\n\t6911:  0x33C5,\n\t6912:  0x33AD,\n\t6913:  0x33AE,\n\t6914:  0x33AF,\n\t6915:  0x33DB,\n\t6916:  0x33A9,\n\t6917:  0x33AA,\n\t6918:  0x33AB,\n\t6919:  0x33AC,\n\t6920:  0x33DD,\n\t6921:  0x33D0,\n\t6922:  0x33D3,\n\t6923:  0x33C3,\n\t6924:  0x33C9,\n\t6925:  0x33DC,\n\t6926:  0x33C6,\n\t6942:  0xCB6D,\n\t6943:  0xCB6E,\n\t6944:  0xCB6F,\n\t6945:  0xCB70,\n\t6946:  0xCB71,\n\t6947:  0xCB72,\n\t6948:  0xCB73,\n\t6949:  0xCB74,\n\t6950:  0xCB75,\n\t6951:  0xCB76,\n\t6952:  0xCB77,\n\t6953:  0xCB7A,\n\t6954:  0xCB7B,\n\t6955:  0xCB7C,\n\t6956:  0xCB7D,\n\t6957:  0xCB7E,\n\t6958:  0xCB7F,\n\t6959:  0xCB80,\n\t6960:  0xCB81,\n\t6961:  0xCB82,\n\t6962:  0xCB83,\n\t6963:  0xCB84,\n\t6964:  0xCB85,\n\t6965:  0xCB86,\n\t6966:  0xCB87,\n\t6967:  0xCB88,\n\t6968:  0xCB89,\n\t6969:  0xCB8A,\n\t6970:  0xCB8B,\n\t6971:  0xCB8C,\n\t6972:  0xCB8D,\n\t6973:  0xCB8E,\n\t6974:  0xCB8F,\n\t6975:  0xCB90,\n\t6976:  0xCB91,\n\t6977:  0xCB92,\n\t6978:  0xCB93,\n\t6979:  0xCB94,\n\t6980:  0xCB95,\n\t6981:  0xCB96,\n\t6982:  0xCB97,\n\t6983:  0xCB98,\n\t6984:  0xCB99,\n\t6985:  0xCB9A,\n\t6986:  0xCB9B,\n\t6987:  0xCB9D,\n\t6988:  0xCB9E,\n\t6989:  0xCB9F,\n\t6990:  0xCBA0,\n\t6991:  0xCBA1,\n\t6992:  0xCBA2,\n\t6993:  0xCBA3,\n\t6994:  0xCBA4,\n\t6995:  0xCBA5,\n\t6996:  0xCBA6,\n\t6997:  0xCBA7,\n\t6998:  0xCBA8,\n\t6999:  0xCBA9,\n\t7000:  0xCBAA,\n\t7001:  0xCBAB,\n\t7002:  0xCBAC,\n\t7003:  0xCBAD,\n\t7004:  0xCBAE,\n\t7005:  0xCBAF,\n\t7006:  0xCBB0,\n\t7007:  0xCBB1,\n\t7008:  0xCBB2,\n\t7009:  0xCBB3,\n\t7010:  0xCBB4,\n\t7011:  0xCBB5,\n\t7012:  0xCBB6,\n\t7013:  0xCBB7,\n\t7014:  0xCBB9,\n\t7015:  0xCBBA,\n\t7016:  0xCBBB,\n\t7017:  0xCBBC,\n\t7018:  0xCBBD,\n\t7019:  0xCBBE,\n\t7020:  0xCBBF,\n\t7021:  0xCBC0,\n\t7022:  0xCBC1,\n\t7023:  0xCBC2,\n\t7024:  0xCBC3,\n\t7025:  0xCBC4,\n\t7026:  0x00C6,\n\t7027:  0x00D0,\n\t7028:  0x00AA,\n\t7029:  0x0126,\n\t7031:  0x0132,\n\t7033:  0x013F,\n\t7034:  0x0141,\n\t7035:  0x00D8,\n\t7036:  0x0152,\n\t7037:  0x00BA,\n\t7038:  0x00DE,\n\t7039:  0x0166,\n\t7040:  0x014A,\n\t7042:  0x3260,\n\t7043:  0x3261,\n\t7044:  0x3262,\n\t7045:  0x3263,\n\t7046:  0x3264,\n\t7047:  0x3265,\n\t7048:  0x3266,\n\t7049:  0x3267,\n\t7050:  0x3268,\n\t7051:  0x3269,\n\t7052:  0x326A,\n\t7053:  0x326B,\n\t7054:  0x326C,\n\t7055:  0x326D,\n\t7056:  0x326E,\n\t7057:  0x326F,\n\t7058:  0x3270,\n\t7059:  0x3271,\n\t7060:  0x3272,\n\t7061:  0x3273,\n\t7062:  0x3274,\n\t7063:  0x3275,\n\t7064:  0x3276,\n\t7065:  0x3277,\n\t7066:  0x3278,\n\t7067:  0x3279,\n\t7068:  0x327A,\n\t7069:  0x327B,\n\t7070:  0x24D0,\n\t7071:  0x24D1,\n\t7072:  0x24D2,\n\t7073:  0x24D3,\n\t7074:  0x24D4,\n\t7075:  0x24D5,\n\t7076:  0x24D6,\n\t7077:  0x24D7,\n\t7078:  0x24D8,\n\t7079:  0x24D9,\n\t7080:  0x24DA,\n\t7081:  0x24DB,\n\t7082:  0x24DC,\n\t7083:  0x24DD,\n\t7084:  0x24DE,\n\t7085:  0x24DF,\n\t7086:  0x24E0,\n\t7087:  0x24E1,\n\t7088:  0x24E2,\n\t7089:  0x24E3,\n\t7090:  0x24E4,\n\t7091:  0x24E5,\n\t7092:  0x24E6,\n\t7093:  0x24E7,\n\t7094:  0x24E8,\n\t7095:  0x24E9,\n\t7096:  0x2460,\n\t7097:  0x2461,\n\t7098:  0x2462,\n\t7099:  0x2463,\n\t7100:  0x2464,\n\t7101:  0x2465,\n\t7102:  0x2466,\n\t7103:  0x2467,\n\t7104:  0x2468,\n\t7105:  0x2469,\n\t7106:  0x246A,\n\t7107:  0x246B,\n\t7108:  0x246C,\n\t7109:  0x246D,\n\t7110:  0x246E,\n\t7111:  0x00BD,\n\t7112:  0x2153,\n\t7113:  0x2154,\n\t7114:  0x00BC,\n\t7115:  0x00BE,\n\t7116:  0x215B,\n\t7117:  0x215C,\n\t7118:  0x215D,\n\t7119:  0x215E,\n\t7120:  0xCBC5,\n\t7121:  0xCBC6,\n\t7122:  0xCBC7,\n\t7123:  0xCBC8,\n\t7124:  0xCBC9,\n\t7125:  0xCBCA,\n\t7126:  0xCBCB,\n\t7127:  0xCBCC,\n\t7128:  0xCBCD,\n\t7129:  0xCBCE,\n\t7130:  0xCBCF,\n\t7131:  0xCBD0,\n\t7132:  0xCBD1,\n\t7133:  0xCBD2,\n\t7134:  0xCBD3,\n\t7135:  0xCBD5,\n\t7136:  0xCBD6,\n\t7137:  0xCBD7,\n\t7138:  0xCBD8,\n\t7139:  0xCBD9,\n\t7140:  0xCBDA,\n\t7141:  0xCBDB,\n\t7142:  0xCBDC,\n\t7143:  0xCBDD,\n\t7144:  0xCBDE,\n\t7145:  0xCBDF,\n\t7146:  0xCBE0,\n\t7147:  0xCBE1,\n\t7148:  0xCBE2,\n\t7149:  0xCBE3,\n\t7150:  0xCBE5,\n\t7151:  0xCBE6,\n\t7152:  0xCBE8,\n\t7153:  0xCBEA,\n\t7154:  0xCBEB,\n\t7155:  0xCBEC,\n\t7156:  0xCBED,\n\t7157:  0xCBEE,\n\t7158:  0xCBEF,\n\t7159:  0xCBF0,\n\t7160:  0xCBF1,\n\t7161:  0xCBF2,\n\t7162:  0xCBF3,\n\t7163:  0xCBF4,\n\t7164:  0xCBF5,\n\t7165:  0xCBF6,\n\t7166:  0xCBF7,\n\t7167:  0xCBF8,\n\t7168:  0xCBF9,\n\t7169:  0xCBFA,\n\t7170:  0xCBFB,\n\t7171:  0xCBFC,\n\t7172:  0xCBFD,\n\t7173:  0xCBFE,\n\t7174:  0xCBFF,\n\t7175:  0xCC00,\n\t7176:  0xCC01,\n\t7177:  0xCC02,\n\t7178:  0xCC03,\n\t7179:  0xCC04,\n\t7180:  0xCC05,\n\t7181:  0xCC06,\n\t7182:  0xCC07,\n\t7183:  0xCC08,\n\t7184:  0xCC09,\n\t7185:  0xCC0A,\n\t7186:  0xCC0B,\n\t7187:  0xCC0E,\n\t7188:  0xCC0F,\n\t7189:  0xCC11,\n\t7190:  0xCC12,\n\t7191:  0xCC13,\n\t7192:  0xCC15,\n\t7193:  0xCC16,\n\t7194:  0xCC17,\n\t7195:  0xCC18,\n\t7196:  0xCC19,\n\t7197:  0xCC1A,\n\t7198:  0xCC1B,\n\t7199:  0xCC1E,\n\t7200:  0xCC1F,\n\t7201:  0xCC20,\n\t7202:  0xCC23,\n\t7203:  0xCC24,\n\t7204:  0x00E6,\n\t7205:  0x0111,\n\t7206:  0x00F0,\n\t7207:  0x0127,\n\t7208:  0x0131,\n\t7209:  0x0133,\n\t7210:  0x0138,\n\t7211:  0x0140,\n\t7212:  0x0142,\n\t7213:  0x00F8,\n\t7214:  0x0153,\n\t7215:  0x00DF,\n\t7216:  0x00FE,\n\t7217:  0x0167,\n\t7218:  0x014B,\n\t7219:  0x0149,\n\t7220:  0x3200,\n\t7221:  0x3201,\n\t7222:  0x3202,\n\t7223:  0x3203,\n\t7224:  0x3204,\n\t7225:  0x3205,\n\t7226:  0x3206,\n\t7227:  0x3207,\n\t7228:  0x3208,\n\t7229:  0x3209,\n\t7230:  0x320A,\n\t7231:  0x320B,\n\t7232:  0x320C,\n\t7233:  0x320D,\n\t7234:  0x320E,\n\t7235:  0x320F,\n\t7236:  0x3210,\n\t7237:  0x3211,\n\t7238:  0x3212,\n\t7239:  0x3213,\n\t7240:  0x3214,\n\t7241:  0x3215,\n\t7242:  0x3216,\n\t7243:  0x3217,\n\t7244:  0x3218,\n\t7245:  0x3219,\n\t7246:  0x321A,\n\t7247:  0x321B,\n\t7248:  0x249C,\n\t7249:  0x249D,\n\t7250:  0x249E,\n\t7251:  0x249F,\n\t7252:  0x24A0,\n\t7253:  0x24A1,\n\t7254:  0x24A2,\n\t7255:  0x24A3,\n\t7256:  0x24A4,\n\t7257:  0x24A5,\n\t7258:  0x24A6,\n\t7259:  0x24A7,\n\t7260:  0x24A8,\n\t7261:  0x24A9,\n\t7262:  0x24AA,\n\t7263:  0x24AB,\n\t7264:  0x24AC,\n\t7265:  0x24AD,\n\t7266:  0x24AE,\n\t7267:  0x24AF,\n\t7268:  0x24B0,\n\t7269:  0x24B1,\n\t7270:  0x24B2,\n\t7271:  0x24B3,\n\t7272:  0x24B4,\n\t7273:  0x24B5,\n\t7274:  0x2474,\n\t7275:  0x2475,\n\t7276:  0x2476,\n\t7277:  0x2477,\n\t7278:  0x2478,\n\t7279:  0x2479,\n\t7280:  0x247A,\n\t7281:  0x247B,\n\t7282:  0x247C,\n\t7283:  0x247D,\n\t7284:  0x247E,\n\t7285:  0x247F,\n\t7286:  0x2480,\n\t7287:  0x2481,\n\t7288:  0x2482,\n\t7289:  0x00B9,\n\t7290:  0x00B2,\n\t7291:  0x00B3,\n\t7292:  0x2074,\n\t7293:  0x207F,\n\t7294:  0x2081,\n\t7295:  0x2082,\n\t7296:  0x2083,\n\t7297:  0x2084,\n\t7298:  0xCC25,\n\t7299:  0xCC26,\n\t7300:  0xCC2A,\n\t7301:  0xCC2B,\n\t7302:  0xCC2D,\n\t7303:  0xCC2F,\n\t7304:  0xCC31,\n\t7305:  0xCC32,\n\t7306:  0xCC33,\n\t7307:  0xCC34,\n\t7308:  0xCC35,\n\t7309:  0xCC36,\n\t7310:  0xCC37,\n\t7311:  0xCC3A,\n\t7312:  0xCC3F,\n\t7313:  0xCC40,\n\t7314:  0xCC41,\n\t7315:  0xCC42,\n\t7316:  0xCC43,\n\t7317:  0xCC46,\n\t7318:  0xCC47,\n\t7319:  0xCC49,\n\t7320:  0xCC4A,\n\t7321:  0xCC4B,\n\t7322:  0xCC4D,\n\t7323:  0xCC4E,\n\t7324:  0xCC4F,\n\t7325:  0xCC50,\n\t7326:  0xCC51,\n\t7327:  0xCC52,\n\t7328:  0xCC53,\n\t7329:  0xCC56,\n\t7330:  0xCC5A,\n\t7331:  0xCC5B,\n\t7332:  0xCC5C,\n\t7333:  0xCC5D,\n\t7334:  0xCC5E,\n\t7335:  0xCC5F,\n\t7336:  0xCC61,\n\t7337:  0xCC62,\n\t7338:  0xCC63,\n\t7339:  0xCC65,\n\t7340:  0xCC67,\n\t7341:  0xCC69,\n\t7342:  0xCC6A,\n\t7343:  0xCC6B,\n\t7344:  0xCC6C,\n\t7345:  0xCC6D,\n\t7346:  0xCC6E,\n\t7347:  0xCC6F,\n\t7348:  0xCC71,\n\t7349:  0xCC72,\n\t7350:  0xCC73,\n\t7351:  0xCC74,\n\t7352:  0xCC76,\n\t7353:  0xCC77,\n\t7354:  0xCC78,\n\t7355:  0xCC79,\n\t7356:  0xCC7A,\n\t7357:  0xCC7B,\n\t7358:  0xCC7C,\n\t7359:  0xCC7D,\n\t7360:  0xCC7E,\n\t7361:  0xCC7F,\n\t7362:  0xCC80,\n\t7363:  0xCC81,\n\t7364:  0xCC82,\n\t7365:  0xCC83,\n\t7366:  0xCC84,\n\t7367:  0xCC85,\n\t7368:  0xCC86,\n\t7369:  0xCC87,\n\t7370:  0xCC88,\n\t7371:  0xCC89,\n\t7372:  0xCC8A,\n\t7373:  0xCC8B,\n\t7374:  0xCC8C,\n\t7375:  0xCC8D,\n\t7376:  0xCC8E,\n\t7377:  0xCC8F,\n\t7378:  0xCC90,\n\t7379:  0xCC91,\n\t7380:  0xCC92,\n\t7381:  0xCC93,\n\t7382:  0x3041,\n\t7383:  0x3042,\n\t7384:  0x3043,\n\t7385:  0x3044,\n\t7386:  0x3045,\n\t7387:  0x3046,\n\t7388:  0x3047,\n\t7389:  0x3048,\n\t7390:  0x3049,\n\t7391:  0x304A,\n\t7392:  0x304B,\n\t7393:  0x304C,\n\t7394:  0x304D,\n\t7395:  0x304E,\n\t7396:  0x304F,\n\t7397:  0x3050,\n\t7398:  0x3051,\n\t7399:  0x3052,\n\t7400:  0x3053,\n\t7401:  0x3054,\n\t7402:  0x3055,\n\t7403:  0x3056,\n\t7404:  0x3057,\n\t7405:  0x3058,\n\t7406:  0x3059,\n\t7407:  0x305A,\n\t7408:  0x305B,\n\t7409:  0x305C,\n\t7410:  0x305D,\n\t7411:  0x305E,\n\t7412:  0x305F,\n\t7413:  0x3060,\n\t7414:  0x3061,\n\t7415:  0x3062,\n\t7416:  0x3063,\n\t7417:  0x3064,\n\t7418:  0x3065,\n\t7419:  0x3066,\n\t7420:  0x3067,\n\t7421:  0x3068,\n\t7422:  0x3069,\n\t7423:  0x306A,\n\t7424:  0x306B,\n\t7425:  0x306C,\n\t7426:  0x306D,\n\t7427:  0x306E,\n\t7428:  0x306F,\n\t7429:  0x3070,\n\t7430:  0x3071,\n\t7431:  0x3072,\n\t7432:  0x3073,\n\t7433:  0x3074,\n\t7434:  0x3075,\n\t7435:  0x3076,\n\t7436:  0x3077,\n\t7437:  0x3078,\n\t7438:  0x3079,\n\t7439:  0x307A,\n\t7440:  0x307B,\n\t7441:  0x307C,\n\t7442:  0x307D,\n\t7443:  0x307E,\n\t7444:  0x307F,\n\t7445:  0x3080,\n\t7446:  0x3081,\n\t7447:  0x3082,\n\t7448:  0x3083,\n\t7449:  0x3084,\n\t7450:  0x3085,\n\t7451:  0x3086,\n\t7452:  0x3087,\n\t7453:  0x3088,\n\t7454:  0x3089,\n\t7455:  0x308A,\n\t7456:  0x308B,\n\t7457:  0x308C,\n\t7458:  0x308D,\n\t7459:  0x308E,\n\t7460:  0x308F,\n\t7461:  0x3090,\n\t7462:  0x3091,\n\t7463:  0x3092,\n\t7464:  0x3093,\n\t7476:  0xCC94,\n\t7477:  0xCC95,\n\t7478:  0xCC96,\n\t7479:  0xCC97,\n\t7480:  0xCC9A,\n\t7481:  0xCC9B,\n\t7482:  0xCC9D,\n\t7483:  0xCC9E,\n\t7484:  0xCC9F,\n\t7485:  0xCCA1,\n\t7486:  0xCCA2,\n\t7487:  0xCCA3,\n\t7488:  0xCCA4,\n\t7489:  0xCCA5,\n\t7490:  0xCCA6,\n\t7491:  0xCCA7,\n\t7492:  0xCCAA,\n\t7493:  0xCCAE,\n\t7494:  0xCCAF,\n\t7495:  0xCCB0,\n\t7496:  0xCCB1,\n\t7497:  0xCCB2,\n\t7498:  0xCCB3,\n\t7499:  0xCCB6,\n\t7500:  0xCCB7,\n\t7501:  0xCCB9,\n\t7502:  0xCCBA,\n\t7503:  0xCCBB,\n\t7504:  0xCCBD,\n\t7505:  0xCCBE,\n\t7506:  0xCCBF,\n\t7507:  0xCCC0,\n\t7508:  0xCCC1,\n\t7509:  0xCCC2,\n\t7510:  0xCCC3,\n\t7511:  0xCCC6,\n\t7512:  0xCCC8,\n\t7513:  0xCCCA,\n\t7514:  0xCCCB,\n\t7515:  0xCCCC,\n\t7516:  0xCCCD,\n\t7517:  0xCCCE,\n\t7518:  0xCCCF,\n\t7519:  0xCCD1,\n\t7520:  0xCCD2,\n\t7521:  0xCCD3,\n\t7522:  0xCCD5,\n\t7523:  0xCCD6,\n\t7524:  0xCCD7,\n\t7525:  0xCCD8,\n\t7526:  0xCCD9,\n\t7527:  0xCCDA,\n\t7528:  0xCCDB,\n\t7529:  0xCCDC,\n\t7530:  0xCCDD,\n\t7531:  0xCCDE,\n\t7532:  0xCCDF,\n\t7533:  0xCCE0,\n\t7534:  0xCCE1,\n\t7535:  0xCCE2,\n\t7536:  0xCCE3,\n\t7537:  0xCCE5,\n\t7538:  0xCCE6,\n\t7539:  0xCCE7,\n\t7540:  0xCCE8,\n\t7541:  0xCCE9,\n\t7542:  0xCCEA,\n\t7543:  0xCCEB,\n\t7544:  0xCCED,\n\t7545:  0xCCEE,\n\t7546:  0xCCEF,\n\t7547:  0xCCF1,\n\t7548:  0xCCF2,\n\t7549:  0xCCF3,\n\t7550:  0xCCF4,\n\t7551:  0xCCF5,\n\t7552:  0xCCF6,\n\t7553:  0xCCF7,\n\t7554:  0xCCF8,\n\t7555:  0xCCF9,\n\t7556:  0xCCFA,\n\t7557:  0xCCFB,\n\t7558:  0xCCFC,\n\t7559:  0xCCFD,\n\t7560:  0x30A1,\n\t7561:  0x30A2,\n\t7562:  0x30A3,\n\t7563:  0x30A4,\n\t7564:  0x30A5,\n\t7565:  0x30A6,\n\t7566:  0x30A7,\n\t7567:  0x30A8,\n\t7568:  0x30A9,\n\t7569:  0x30AA,\n\t7570:  0x30AB,\n\t7571:  0x30AC,\n\t7572:  0x30AD,\n\t7573:  0x30AE,\n\t7574:  0x30AF,\n\t7575:  0x30B0,\n\t7576:  0x30B1,\n\t7577:  0x30B2,\n\t7578:  0x30B3,\n\t7579:  0x30B4,\n\t7580:  0x30B5,\n\t7581:  0x30B6,\n\t7582:  0x30B7,\n\t7583:  0x30B8,\n\t7584:  0x30B9,\n\t7585:  0x30BA,\n\t7586:  0x30BB,\n\t7587:  0x30BC,\n\t7588:  0x30BD,\n\t7589:  0x30BE,\n\t7590:  0x30BF,\n\t7591:  0x30C0,\n\t7592:  0x30C1,\n\t7593:  0x30C2,\n\t7594:  0x30C3,\n\t7595:  0x30C4,\n\t7596:  0x30C5,\n\t7597:  0x30C6,\n\t7598:  0x30C7,\n\t7599:  0x30C8,\n\t7600:  0x30C9,\n\t7601:  0x30CA,\n\t7602:  0x30CB,\n\t7603:  0x30CC,\n\t7604:  0x30CD,\n\t7605:  0x30CE,\n\t7606:  0x30CF,\n\t7607:  0x30D0,\n\t7608:  0x30D1,\n\t7609:  0x30D2,\n\t7610:  0x30D3,\n\t7611:  0x30D4,\n\t7612:  0x30D5,\n\t7613:  0x30D6,\n\t7614:  0x30D7,\n\t7615:  0x30D8,\n\t7616:  0x30D9,\n\t7617:  0x30DA,\n\t7618:  0x30DB,\n\t7619:  0x30DC,\n\t7620:  0x30DD,\n\t7621:  0x30DE,\n\t7622:  0x30DF,\n\t7623:  0x30E0,\n\t7624:  0x30E1,\n\t7625:  0x30E2,\n\t7626:  0x30E3,\n\t7627:  0x30E4,\n\t7628:  0x30E5,\n\t7629:  0x30E6,\n\t7630:  0x30E7,\n\t7631:  0x30E8,\n\t7632:  0x30E9,\n\t7633:  0x30EA,\n\t7634:  0x30EB,\n\t7635:  0x30EC,\n\t7636:  0x30ED,\n\t7637:  0x30EE,\n\t7638:  0x30EF,\n\t7639:  0x30F0,\n\t7640:  0x30F1,\n\t7641:  0x30F2,\n\t7642:  0x30F3,\n\t7643:  0x30F4,\n\t7644:  0x30F5,\n\t7645:  0x30F6,\n\t7654:  0xCCFE,\n\t7655:  0xCCFF,\n\t7656:  0xCD00,\n\t7657:  0xCD02,\n\t7658:  0xCD03,\n\t7659:  0xCD04,\n\t7660:  0xCD05,\n\t7661:  0xCD06,\n\t7662:  0xCD07,\n\t7663:  0xCD0A,\n\t7664:  0xCD0B,\n\t7665:  0xCD0D,\n\t7666:  0xCD0E,\n\t7667:  0xCD0F,\n\t7668:  0xCD11,\n\t7669:  0xCD12,\n\t7670:  0xCD13,\n\t7671:  0xCD14,\n\t7672:  0xCD15,\n\t7673:  0xCD16,\n\t7674:  0xCD17,\n\t7675:  0xCD1A,\n\t7676:  0xCD1C,\n\t7677:  0xCD1E,\n\t7678:  0xCD1F,\n\t7679:  0xCD20,\n\t7680:  0xCD21,\n\t7681:  0xCD22,\n\t7682:  0xCD23,\n\t7683:  0xCD25,\n\t7684:  0xCD26,\n\t7685:  0xCD27,\n\t7686:  0xCD29,\n\t7687:  0xCD2A,\n\t7688:  0xCD2B,\n\t7689:  0xCD2D,\n\t7690:  0xCD2E,\n\t7691:  0xCD2F,\n\t7692:  0xCD30,\n\t7693:  0xCD31,\n\t7694:  0xCD32,\n\t7695:  0xCD33,\n\t7696:  0xCD34,\n\t7697:  0xCD35,\n\t7698:  0xCD36,\n\t7699:  0xCD37,\n\t7700:  0xCD38,\n\t7701:  0xCD3A,\n\t7702:  0xCD3B,\n\t7703:  0xCD3C,\n\t7704:  0xCD3D,\n\t7705:  0xCD3E,\n\t7706:  0xCD3F,\n\t7707:  0xCD40,\n\t7708:  0xCD41,\n\t7709:  0xCD42,\n\t7710:  0xCD43,\n\t7711:  0xCD44,\n\t7712:  0xCD45,\n\t7713:  0xCD46,\n\t7714:  0xCD47,\n\t7715:  0xCD48,\n\t7716:  0xCD49,\n\t7717:  0xCD4A,\n\t7718:  0xCD4B,\n\t7719:  0xCD4C,\n\t7720:  0xCD4D,\n\t7721:  0xCD4E,\n\t7722:  0xCD4F,\n\t7723:  0xCD50,\n\t7724:  0xCD51,\n\t7725:  0xCD52,\n\t7726:  0xCD53,\n\t7727:  0xCD54,\n\t7728:  0xCD55,\n\t7729:  0xCD56,\n\t7730:  0xCD57,\n\t7731:  0xCD58,\n\t7732:  0xCD59,\n\t7733:  0xCD5A,\n\t7734:  0xCD5B,\n\t7735:  0xCD5D,\n\t7736:  0xCD5E,\n\t7737:  0xCD5F,\n\t7738:  0x0410,\n\t7739:  0x0411,\n\t7740:  0x0412,\n\t7741:  0x0413,\n\t7742:  0x0414,\n\t7743:  0x0415,\n\t7744:  0x0401,\n\t7745:  0x0416,\n\t7746:  0x0417,\n\t7747:  0x0418,\n\t7748:  0x0419,\n\t7749:  0x041A,\n\t7750:  0x041B,\n\t7751:  0x041C,\n\t7752:  0x041D,\n\t7753:  0x041E,\n\t7754:  0x041F,\n\t7755:  0x0420,\n\t7756:  0x0421,\n\t7757:  0x0422,\n\t7758:  0x0423,\n\t7759:  0x0424,\n\t7760:  0x0425,\n\t7761:  0x0426,\n\t7762:  0x0427,\n\t7763:  0x0428,\n\t7764:  0x0429,\n\t7765:  0x042A,\n\t7766:  0x042B,\n\t7767:  0x042C,\n\t7768:  0x042D,\n\t7769:  0x042E,\n\t7770:  0x042F,\n\t7786:  0x0430,\n\t7787:  0x0431,\n\t7788:  0x0432,\n\t7789:  0x0433,\n\t7790:  0x0434,\n\t7791:  0x0435,\n\t7792:  0x0451,\n\t7793:  0x0436,\n\t7794:  0x0437,\n\t7795:  0x0438,\n\t7796:  0x0439,\n\t7797:  0x043A,\n\t7798:  0x043B,\n\t7799:  0x043C,\n\t7800:  0x043D,\n\t7801:  0x043E,\n\t7802:  0x043F,\n\t7803:  0x0440,\n\t7804:  0x0441,\n\t7805:  0x0442,\n\t7806:  0x0443,\n\t7807:  0x0444,\n\t7808:  0x0445,\n\t7809:  0x0446,\n\t7810:  0x0447,\n\t7811:  0x0448,\n\t7812:  0x0449,\n\t7813:  0x044A,\n\t7814:  0x044B,\n\t7815:  0x044C,\n\t7816:  0x044D,\n\t7817:  0x044E,\n\t7818:  0x044F,\n\t7832:  0xCD61,\n\t7833:  0xCD62,\n\t7834:  0xCD63,\n\t7835:  0xCD65,\n\t7836:  0xCD66,\n\t7837:  0xCD67,\n\t7838:  0xCD68,\n\t7839:  0xCD69,\n\t7840:  0xCD6A,\n\t7841:  0xCD6B,\n\t7842:  0xCD6E,\n\t7843:  0xCD70,\n\t7844:  0xCD72,\n\t7845:  0xCD73,\n\t7846:  0xCD74,\n\t7847:  0xCD75,\n\t7848:  0xCD76,\n\t7849:  0xCD77,\n\t7850:  0xCD79,\n\t7851:  0xCD7A,\n\t7852:  0xCD7B,\n\t7853:  0xCD7C,\n\t7854:  0xCD7D,\n\t7855:  0xCD7E,\n\t7856:  0xCD7F,\n\t7857:  0xCD80,\n\t7858:  0xCD81,\n\t7859:  0xCD82,\n\t7860:  0xCD83,\n\t7861:  0xCD84,\n\t7862:  0xCD85,\n\t7863:  0xCD86,\n\t7864:  0xCD87,\n\t7865:  0xCD89,\n\t7866:  0xCD8A,\n\t7867:  0xCD8B,\n\t7868:  0xCD8C,\n\t7869:  0xCD8D,\n\t7870:  0xCD8E,\n\t7871:  0xCD8F,\n\t7872:  0xCD90,\n\t7873:  0xCD91,\n\t7874:  0xCD92,\n\t7875:  0xCD93,\n\t7876:  0xCD96,\n\t7877:  0xCD97,\n\t7878:  0xCD99,\n\t7879:  0xCD9A,\n\t7880:  0xCD9B,\n\t7881:  0xCD9D,\n\t7882:  0xCD9E,\n\t7883:  0xCD9F,\n\t7884:  0xCDA0,\n\t7885:  0xCDA1,\n\t7886:  0xCDA2,\n\t7887:  0xCDA3,\n\t7888:  0xCDA6,\n\t7889:  0xCDA8,\n\t7890:  0xCDAA,\n\t7891:  0xCDAB,\n\t7892:  0xCDAC,\n\t7893:  0xCDAD,\n\t7894:  0xCDAE,\n\t7895:  0xCDAF,\n\t7896:  0xCDB1,\n\t7897:  0xCDB2,\n\t7898:  0xCDB3,\n\t7899:  0xCDB4,\n\t7900:  0xCDB5,\n\t7901:  0xCDB6,\n\t7902:  0xCDB7,\n\t7903:  0xCDB8,\n\t7904:  0xCDB9,\n\t7905:  0xCDBA,\n\t7906:  0xCDBB,\n\t7907:  0xCDBC,\n\t7908:  0xCDBD,\n\t7909:  0xCDBE,\n\t7910:  0xCDBF,\n\t7911:  0xCDC0,\n\t7912:  0xCDC1,\n\t7913:  0xCDC2,\n\t7914:  0xCDC3,\n\t7915:  0xCDC5,\n\t8010:  0xCDC6,\n\t8011:  0xCDC7,\n\t8012:  0xCDC8,\n\t8013:  0xCDC9,\n\t8014:  0xCDCA,\n\t8015:  0xCDCB,\n\t8016:  0xCDCD,\n\t8017:  0xCDCE,\n\t8018:  0xCDCF,\n\t8019:  0xCDD1,\n\t8020:  0xCDD2,\n\t8021:  0xCDD3,\n\t8022:  0xCDD4,\n\t8023:  0xCDD5,\n\t8024:  0xCDD6,\n\t8025:  0xCDD7,\n\t8026:  0xCDD8,\n\t8027:  0xCDD9,\n\t8028:  0xCDDA,\n\t8029:  0xCDDB,\n\t8030:  0xCDDC,\n\t8031:  0xCDDD,\n\t8032:  0xCDDE,\n\t8033:  0xCDDF,\n\t8034:  0xCDE0,\n\t8035:  0xCDE1,\n\t8036:  0xCDE2,\n\t8037:  0xCDE3,\n\t8038:  0xCDE4,\n\t8039:  0xCDE5,\n\t8040:  0xCDE6,\n\t8041:  0xCDE7,\n\t8042:  0xCDE9,\n\t8043:  0xCDEA,\n\t8044:  0xCDEB,\n\t8045:  0xCDED,\n\t8046:  0xCDEE,\n\t8047:  0xCDEF,\n\t8048:  0xCDF1,\n\t8049:  0xCDF2,\n\t8050:  0xCDF3,\n\t8051:  0xCDF4,\n\t8052:  0xCDF5,\n\t8053:  0xCDF6,\n\t8054:  0xCDF7,\n\t8055:  0xCDFA,\n\t8056:  0xCDFC,\n\t8057:  0xCDFE,\n\t8058:  0xCDFF,\n\t8059:  0xCE00,\n\t8060:  0xCE01,\n\t8061:  0xCE02,\n\t8062:  0xCE03,\n\t8063:  0xCE05,\n\t8064:  0xCE06,\n\t8065:  0xCE07,\n\t8066:  0xCE09,\n\t8067:  0xCE0A,\n\t8068:  0xCE0B,\n\t8069:  0xCE0D,\n\t8070:  0xCE0E,\n\t8071:  0xCE0F,\n\t8072:  0xCE10,\n\t8073:  0xCE11,\n\t8074:  0xCE12,\n\t8075:  0xCE13,\n\t8076:  0xCE15,\n\t8077:  0xCE16,\n\t8078:  0xCE17,\n\t8079:  0xCE18,\n\t8080:  0xCE1A,\n\t8081:  0xCE1B,\n\t8082:  0xCE1C,\n\t8083:  0xCE1D,\n\t8084:  0xCE1E,\n\t8085:  0xCE1F,\n\t8086:  0xCE22,\n\t8087:  0xCE23,\n\t8088:  0xCE25,\n\t8089:  0xCE26,\n\t8090:  0xCE27,\n\t8091:  0xCE29,\n\t8092:  0xCE2A,\n\t8093:  0xCE2B,\n\t8188:  0xCE2C,\n\t8189:  0xCE2D,\n\t8190:  0xCE2E,\n\t8191:  0xCE2F,\n\t8192:  0xCE32,\n\t8193:  0xCE34,\n\t8194:  0xCE36,\n\t8195:  0xCE37,\n\t8196:  0xCE38,\n\t8197:  0xCE39,\n\t8198:  0xCE3A,\n\t8199:  0xCE3B,\n\t8200:  0xCE3C,\n\t8201:  0xCE3D,\n\t8202:  0xCE3E,\n\t8203:  0xCE3F,\n\t8204:  0xCE40,\n\t8205:  0xCE41,\n\t8206:  0xCE42,\n\t8207:  0xCE43,\n\t8208:  0xCE44,\n\t8209:  0xCE45,\n\t8210:  0xCE46,\n\t8211:  0xCE47,\n\t8212:  0xCE48,\n\t8213:  0xCE49,\n\t8214:  0xCE4A,\n\t8215:  0xCE4B,\n\t8216:  0xCE4C,\n\t8217:  0xCE4D,\n\t8218:  0xCE4E,\n\t8219:  0xCE4F,\n\t8220:  0xCE50,\n\t8221:  0xCE51,\n\t8222:  0xCE52,\n\t8223:  0xCE53,\n\t8224:  0xCE54,\n\t8225:  0xCE55,\n\t8226:  0xCE56,\n\t8227:  0xCE57,\n\t8228:  0xCE5A,\n\t8229:  0xCE5B,\n\t8230:  0xCE5D,\n\t8231:  0xCE5E,\n\t8232:  0xCE62,\n\t8233:  0xCE63,\n\t8234:  0xCE64,\n\t8235:  0xCE65,\n\t8236:  0xCE66,\n\t8237:  0xCE67,\n\t8238:  0xCE6A,\n\t8239:  0xCE6C,\n\t8240:  0xCE6E,\n\t8241:  0xCE6F,\n\t8242:  0xCE70,\n\t8243:  0xCE71,\n\t8244:  0xCE72,\n\t8245:  0xCE73,\n\t8246:  0xCE76,\n\t8247:  0xCE77,\n\t8248:  0xCE79,\n\t8249:  0xCE7A,\n\t8250:  0xCE7B,\n\t8251:  0xCE7D,\n\t8252:  0xCE7E,\n\t8253:  0xCE7F,\n\t8254:  0xCE80,\n\t8255:  0xCE81,\n\t8256:  0xCE82,\n\t8257:  0xCE83,\n\t8258:  0xCE86,\n\t8259:  0xCE88,\n\t8260:  0xCE8A,\n\t8261:  0xCE8B,\n\t8262:  0xCE8C,\n\t8263:  0xCE8D,\n\t8264:  0xCE8E,\n\t8265:  0xCE8F,\n\t8266:  0xCE92,\n\t8267:  0xCE93,\n\t8268:  0xCE95,\n\t8269:  0xCE96,\n\t8270:  0xCE97,\n\t8271:  0xCE99,\n\t8366:  0xCE9A,\n\t8367:  0xCE9B,\n\t8368:  0xCE9C,\n\t8369:  0xCE9D,\n\t8370:  0xCE9E,\n\t8371:  0xCE9F,\n\t8372:  0xCEA2,\n\t8373:  0xCEA6,\n\t8374:  0xCEA7,\n\t8375:  0xCEA8,\n\t8376:  0xCEA9,\n\t8377:  0xCEAA,\n\t8378:  0xCEAB,\n\t8379:  0xCEAE,\n\t8380:  0xCEAF,\n\t8381:  0xCEB0,\n\t8382:  0xCEB1,\n\t8383:  0xCEB2,\n\t8384:  0xCEB3,\n\t8385:  0xCEB4,\n\t8386:  0xCEB5,\n\t8387:  0xCEB6,\n\t8388:  0xCEB7,\n\t8389:  0xCEB8,\n\t8390:  0xCEB9,\n\t8391:  0xCEBA,\n\t8392:  0xCEBB,\n\t8393:  0xCEBC,\n\t8394:  0xCEBD,\n\t8395:  0xCEBE,\n\t8396:  0xCEBF,\n\t8397:  0xCEC0,\n\t8398:  0xCEC2,\n\t8399:  0xCEC3,\n\t8400:  0xCEC4,\n\t8401:  0xCEC5,\n\t8402:  0xCEC6,\n\t8403:  0xCEC7,\n\t8404:  0xCEC8,\n\t8405:  0xCEC9,\n\t8406:  0xCECA,\n\t8407:  0xCECB,\n\t8408:  0xCECC,\n\t8409:  0xCECD,\n\t8410:  0xCECE,\n\t8411:  0xCECF,\n\t8412:  0xCED0,\n\t8413:  0xCED1,\n\t8414:  0xCED2,\n\t8415:  0xCED3,\n\t8416:  0xCED4,\n\t8417:  0xCED5,\n\t8418:  0xCED6,\n\t8419:  0xCED7,\n\t8420:  0xCED8,\n\t8421:  0xCED9,\n\t8422:  0xCEDA,\n\t8423:  0xCEDB,\n\t8424:  0xCEDC,\n\t8425:  0xCEDD,\n\t8426:  0xCEDE,\n\t8427:  0xCEDF,\n\t8428:  0xCEE0,\n\t8429:  0xCEE1,\n\t8430:  0xCEE2,\n\t8431:  0xCEE3,\n\t8432:  0xCEE6,\n\t8433:  0xCEE7,\n\t8434:  0xCEE9,\n\t8435:  0xCEEA,\n\t8436:  0xCEED,\n\t8437:  0xCEEE,\n\t8438:  0xCEEF,\n\t8439:  0xCEF0,\n\t8440:  0xCEF1,\n\t8441:  0xCEF2,\n\t8442:  0xCEF3,\n\t8443:  0xCEF6,\n\t8444:  0xCEFA,\n\t8445:  0xCEFB,\n\t8446:  0xCEFC,\n\t8447:  0xCEFD,\n\t8448:  0xCEFE,\n\t8449:  0xCEFF,\n\t8450:  0xAC00,\n\t8451:  0xAC01,\n\t8452:  0xAC04,\n\t8453:  0xAC07,\n\t8454:  0xAC08,\n\t8455:  0xAC09,\n\t8456:  0xAC0A,\n\t8457:  0xAC10,\n\t8458:  0xAC11,\n\t8459:  0xAC12,\n\t8460:  0xAC13,\n\t8461:  0xAC14,\n\t8462:  0xAC15,\n\t8463:  0xAC16,\n\t8464:  0xAC17,\n\t8465:  0xAC19,\n\t8466:  0xAC1A,\n\t8467:  0xAC1B,\n\t8468:  0xAC1C,\n\t8469:  0xAC1D,\n\t8470:  0xAC20,\n\t8471:  0xAC24,\n\t8472:  0xAC2C,\n\t8473:  0xAC2D,\n\t8474:  0xAC2F,\n\t8475:  0xAC30,\n\t8476:  0xAC31,\n\t8477:  0xAC38,\n\t8478:  0xAC39,\n\t8479:  0xAC3C,\n\t8480:  0xAC40,\n\t8481:  0xAC4B,\n\t8482:  0xAC4D,\n\t8483:  0xAC54,\n\t8484:  0xAC58,\n\t8485:  0xAC5C,\n\t8486:  0xAC70,\n\t8487:  0xAC71,\n\t8488:  0xAC74,\n\t8489:  0xAC77,\n\t8490:  0xAC78,\n\t8491:  0xAC7A,\n\t8492:  0xAC80,\n\t8493:  0xAC81,\n\t8494:  0xAC83,\n\t8495:  0xAC84,\n\t8496:  0xAC85,\n\t8497:  0xAC86,\n\t8498:  0xAC89,\n\t8499:  0xAC8A,\n\t8500:  0xAC8B,\n\t8501:  0xAC8C,\n\t8502:  0xAC90,\n\t8503:  0xAC94,\n\t8504:  0xAC9C,\n\t8505:  0xAC9D,\n\t8506:  0xAC9F,\n\t8507:  0xACA0,\n\t8508:  0xACA1,\n\t8509:  0xACA8,\n\t8510:  0xACA9,\n\t8511:  0xACAA,\n\t8512:  0xACAC,\n\t8513:  0xACAF,\n\t8514:  0xACB0,\n\t8515:  0xACB8,\n\t8516:  0xACB9,\n\t8517:  0xACBB,\n\t8518:  0xACBC,\n\t8519:  0xACBD,\n\t8520:  0xACC1,\n\t8521:  0xACC4,\n\t8522:  0xACC8,\n\t8523:  0xACCC,\n\t8524:  0xACD5,\n\t8525:  0xACD7,\n\t8526:  0xACE0,\n\t8527:  0xACE1,\n\t8528:  0xACE4,\n\t8529:  0xACE7,\n\t8530:  0xACE8,\n\t8531:  0xACEA,\n\t8532:  0xACEC,\n\t8533:  0xACEF,\n\t8534:  0xACF0,\n\t8535:  0xACF1,\n\t8536:  0xACF3,\n\t8537:  0xACF5,\n\t8538:  0xACF6,\n\t8539:  0xACFC,\n\t8540:  0xACFD,\n\t8541:  0xAD00,\n\t8542:  0xAD04,\n\t8543:  0xAD06,\n\t8544:  0xCF02,\n\t8545:  0xCF03,\n\t8546:  0xCF05,\n\t8547:  0xCF06,\n\t8548:  0xCF07,\n\t8549:  0xCF09,\n\t8550:  0xCF0A,\n\t8551:  0xCF0B,\n\t8552:  0xCF0C,\n\t8553:  0xCF0D,\n\t8554:  0xCF0E,\n\t8555:  0xCF0F,\n\t8556:  0xCF12,\n\t8557:  0xCF14,\n\t8558:  0xCF16,\n\t8559:  0xCF17,\n\t8560:  0xCF18,\n\t8561:  0xCF19,\n\t8562:  0xCF1A,\n\t8563:  0xCF1B,\n\t8564:  0xCF1D,\n\t8565:  0xCF1E,\n\t8566:  0xCF1F,\n\t8567:  0xCF21,\n\t8568:  0xCF22,\n\t8569:  0xCF23,\n\t8570:  0xCF25,\n\t8571:  0xCF26,\n\t8572:  0xCF27,\n\t8573:  0xCF28,\n\t8574:  0xCF29,\n\t8575:  0xCF2A,\n\t8576:  0xCF2B,\n\t8577:  0xCF2E,\n\t8578:  0xCF32,\n\t8579:  0xCF33,\n\t8580:  0xCF34,\n\t8581:  0xCF35,\n\t8582:  0xCF36,\n\t8583:  0xCF37,\n\t8584:  0xCF39,\n\t8585:  0xCF3A,\n\t8586:  0xCF3B,\n\t8587:  0xCF3C,\n\t8588:  0xCF3D,\n\t8589:  0xCF3E,\n\t8590:  0xCF3F,\n\t8591:  0xCF40,\n\t8592:  0xCF41,\n\t8593:  0xCF42,\n\t8594:  0xCF43,\n\t8595:  0xCF44,\n\t8596:  0xCF45,\n\t8597:  0xCF46,\n\t8598:  0xCF47,\n\t8599:  0xCF48,\n\t8600:  0xCF49,\n\t8601:  0xCF4A,\n\t8602:  0xCF4B,\n\t8603:  0xCF4C,\n\t8604:  0xCF4D,\n\t8605:  0xCF4E,\n\t8606:  0xCF4F,\n\t8607:  0xCF50,\n\t8608:  0xCF51,\n\t8609:  0xCF52,\n\t8610:  0xCF53,\n\t8611:  0xCF56,\n\t8612:  0xCF57,\n\t8613:  0xCF59,\n\t8614:  0xCF5A,\n\t8615:  0xCF5B,\n\t8616:  0xCF5D,\n\t8617:  0xCF5E,\n\t8618:  0xCF5F,\n\t8619:  0xCF60,\n\t8620:  0xCF61,\n\t8621:  0xCF62,\n\t8622:  0xCF63,\n\t8623:  0xCF66,\n\t8624:  0xCF68,\n\t8625:  0xCF6A,\n\t8626:  0xCF6B,\n\t8627:  0xCF6C,\n\t8628:  0xAD0C,\n\t8629:  0xAD0D,\n\t8630:  0xAD0F,\n\t8631:  0xAD11,\n\t8632:  0xAD18,\n\t8633:  0xAD1C,\n\t8634:  0xAD20,\n\t8635:  0xAD29,\n\t8636:  0xAD2C,\n\t8637:  0xAD2D,\n\t8638:  0xAD34,\n\t8639:  0xAD35,\n\t8640:  0xAD38,\n\t8641:  0xAD3C,\n\t8642:  0xAD44,\n\t8643:  0xAD45,\n\t8644:  0xAD47,\n\t8645:  0xAD49,\n\t8646:  0xAD50,\n\t8647:  0xAD54,\n\t8648:  0xAD58,\n\t8649:  0xAD61,\n\t8650:  0xAD63,\n\t8651:  0xAD6C,\n\t8652:  0xAD6D,\n\t8653:  0xAD70,\n\t8654:  0xAD73,\n\t8655:  0xAD74,\n\t8656:  0xAD75,\n\t8657:  0xAD76,\n\t8658:  0xAD7B,\n\t8659:  0xAD7C,\n\t8660:  0xAD7D,\n\t8661:  0xAD7F,\n\t8662:  0xAD81,\n\t8663:  0xAD82,\n\t8664:  0xAD88,\n\t8665:  0xAD89,\n\t8666:  0xAD8C,\n\t8667:  0xAD90,\n\t8668:  0xAD9C,\n\t8669:  0xAD9D,\n\t8670:  0xADA4,\n\t8671:  0xADB7,\n\t8672:  0xADC0,\n\t8673:  0xADC1,\n\t8674:  0xADC4,\n\t8675:  0xADC8,\n\t8676:  0xADD0,\n\t8677:  0xADD1,\n\t8678:  0xADD3,\n\t8679:  0xADDC,\n\t8680:  0xADE0,\n\t8681:  0xADE4,\n\t8682:  0xADF8,\n\t8683:  0xADF9,\n\t8684:  0xADFC,\n\t8685:  0xADFF,\n\t8686:  0xAE00,\n\t8687:  0xAE01,\n\t8688:  0xAE08,\n\t8689:  0xAE09,\n\t8690:  0xAE0B,\n\t8691:  0xAE0D,\n\t8692:  0xAE14,\n\t8693:  0xAE30,\n\t8694:  0xAE31,\n\t8695:  0xAE34,\n\t8696:  0xAE37,\n\t8697:  0xAE38,\n\t8698:  0xAE3A,\n\t8699:  0xAE40,\n\t8700:  0xAE41,\n\t8701:  0xAE43,\n\t8702:  0xAE45,\n\t8703:  0xAE46,\n\t8704:  0xAE4A,\n\t8705:  0xAE4C,\n\t8706:  0xAE4D,\n\t8707:  0xAE4E,\n\t8708:  0xAE50,\n\t8709:  0xAE54,\n\t8710:  0xAE56,\n\t8711:  0xAE5C,\n\t8712:  0xAE5D,\n\t8713:  0xAE5F,\n\t8714:  0xAE60,\n\t8715:  0xAE61,\n\t8716:  0xAE65,\n\t8717:  0xAE68,\n\t8718:  0xAE69,\n\t8719:  0xAE6C,\n\t8720:  0xAE70,\n\t8721:  0xAE78,\n\t8722:  0xCF6D,\n\t8723:  0xCF6E,\n\t8724:  0xCF6F,\n\t8725:  0xCF72,\n\t8726:  0xCF73,\n\t8727:  0xCF75,\n\t8728:  0xCF76,\n\t8729:  0xCF77,\n\t8730:  0xCF79,\n\t8731:  0xCF7A,\n\t8732:  0xCF7B,\n\t8733:  0xCF7C,\n\t8734:  0xCF7D,\n\t8735:  0xCF7E,\n\t8736:  0xCF7F,\n\t8737:  0xCF81,\n\t8738:  0xCF82,\n\t8739:  0xCF83,\n\t8740:  0xCF84,\n\t8741:  0xCF86,\n\t8742:  0xCF87,\n\t8743:  0xCF88,\n\t8744:  0xCF89,\n\t8745:  0xCF8A,\n\t8746:  0xCF8B,\n\t8747:  0xCF8D,\n\t8748:  0xCF8E,\n\t8749:  0xCF8F,\n\t8750:  0xCF90,\n\t8751:  0xCF91,\n\t8752:  0xCF92,\n\t8753:  0xCF93,\n\t8754:  0xCF94,\n\t8755:  0xCF95,\n\t8756:  0xCF96,\n\t8757:  0xCF97,\n\t8758:  0xCF98,\n\t8759:  0xCF99,\n\t8760:  0xCF9A,\n\t8761:  0xCF9B,\n\t8762:  0xCF9C,\n\t8763:  0xCF9D,\n\t8764:  0xCF9E,\n\t8765:  0xCF9F,\n\t8766:  0xCFA0,\n\t8767:  0xCFA2,\n\t8768:  0xCFA3,\n\t8769:  0xCFA4,\n\t8770:  0xCFA5,\n\t8771:  0xCFA6,\n\t8772:  0xCFA7,\n\t8773:  0xCFA9,\n\t8774:  0xCFAA,\n\t8775:  0xCFAB,\n\t8776:  0xCFAC,\n\t8777:  0xCFAD,\n\t8778:  0xCFAE,\n\t8779:  0xCFAF,\n\t8780:  0xCFB1,\n\t8781:  0xCFB2,\n\t8782:  0xCFB3,\n\t8783:  0xCFB4,\n\t8784:  0xCFB5,\n\t8785:  0xCFB6,\n\t8786:  0xCFB7,\n\t8787:  0xCFB8,\n\t8788:  0xCFB9,\n\t8789:  0xCFBA,\n\t8790:  0xCFBB,\n\t8791:  0xCFBC,\n\t8792:  0xCFBD,\n\t8793:  0xCFBE,\n\t8794:  0xCFBF,\n\t8795:  0xCFC0,\n\t8796:  0xCFC1,\n\t8797:  0xCFC2,\n\t8798:  0xCFC3,\n\t8799:  0xCFC5,\n\t8800:  0xCFC6,\n\t8801:  0xCFC7,\n\t8802:  0xCFC8,\n\t8803:  0xCFC9,\n\t8804:  0xCFCA,\n\t8805:  0xCFCB,\n\t8806:  0xAE79,\n\t8807:  0xAE7B,\n\t8808:  0xAE7C,\n\t8809:  0xAE7D,\n\t8810:  0xAE84,\n\t8811:  0xAE85,\n\t8812:  0xAE8C,\n\t8813:  0xAEBC,\n\t8814:  0xAEBD,\n\t8815:  0xAEBE,\n\t8816:  0xAEC0,\n\t8817:  0xAEC4,\n\t8818:  0xAECC,\n\t8819:  0xAECD,\n\t8820:  0xAECF,\n\t8821:  0xAED0,\n\t8822:  0xAED1,\n\t8823:  0xAED8,\n\t8824:  0xAED9,\n\t8825:  0xAEDC,\n\t8826:  0xAEE8,\n\t8827:  0xAEEB,\n\t8828:  0xAEED,\n\t8829:  0xAEF4,\n\t8830:  0xAEF8,\n\t8831:  0xAEFC,\n\t8832:  0xAF07,\n\t8833:  0xAF08,\n\t8834:  0xAF0D,\n\t8835:  0xAF10,\n\t8836:  0xAF2C,\n\t8837:  0xAF2D,\n\t8838:  0xAF30,\n\t8839:  0xAF32,\n\t8840:  0xAF34,\n\t8841:  0xAF3C,\n\t8842:  0xAF3D,\n\t8843:  0xAF3F,\n\t8844:  0xAF41,\n\t8845:  0xAF42,\n\t8846:  0xAF43,\n\t8847:  0xAF48,\n\t8848:  0xAF49,\n\t8849:  0xAF50,\n\t8850:  0xAF5C,\n\t8851:  0xAF5D,\n\t8852:  0xAF64,\n\t8853:  0xAF65,\n\t8854:  0xAF79,\n\t8855:  0xAF80,\n\t8856:  0xAF84,\n\t8857:  0xAF88,\n\t8858:  0xAF90,\n\t8859:  0xAF91,\n\t8860:  0xAF95,\n\t8861:  0xAF9C,\n\t8862:  0xAFB8,\n\t8863:  0xAFB9,\n\t8864:  0xAFBC,\n\t8865:  0xAFC0,\n\t8866:  0xAFC7,\n\t8867:  0xAFC8,\n\t8868:  0xAFC9,\n\t8869:  0xAFCB,\n\t8870:  0xAFCD,\n\t8871:  0xAFCE,\n\t8872:  0xAFD4,\n\t8873:  0xAFDC,\n\t8874:  0xAFE8,\n\t8875:  0xAFE9,\n\t8876:  0xAFF0,\n\t8877:  0xAFF1,\n\t8878:  0xAFF4,\n\t8879:  0xAFF8,\n\t8880:  0xB000,\n\t8881:  0xB001,\n\t8882:  0xB004,\n\t8883:  0xB00C,\n\t8884:  0xB010,\n\t8885:  0xB014,\n\t8886:  0xB01C,\n\t8887:  0xB01D,\n\t8888:  0xB028,\n\t8889:  0xB044,\n\t8890:  0xB045,\n\t8891:  0xB048,\n\t8892:  0xB04A,\n\t8893:  0xB04C,\n\t8894:  0xB04E,\n\t8895:  0xB053,\n\t8896:  0xB054,\n\t8897:  0xB055,\n\t8898:  0xB057,\n\t8899:  0xB059,\n\t8900:  0xCFCC,\n\t8901:  0xCFCD,\n\t8902:  0xCFCE,\n\t8903:  0xCFCF,\n\t8904:  0xCFD0,\n\t8905:  0xCFD1,\n\t8906:  0xCFD2,\n\t8907:  0xCFD3,\n\t8908:  0xCFD4,\n\t8909:  0xCFD5,\n\t8910:  0xCFD6,\n\t8911:  0xCFD7,\n\t8912:  0xCFD8,\n\t8913:  0xCFD9,\n\t8914:  0xCFDA,\n\t8915:  0xCFDB,\n\t8916:  0xCFDC,\n\t8917:  0xCFDD,\n\t8918:  0xCFDE,\n\t8919:  0xCFDF,\n\t8920:  0xCFE2,\n\t8921:  0xCFE3,\n\t8922:  0xCFE5,\n\t8923:  0xCFE6,\n\t8924:  0xCFE7,\n\t8925:  0xCFE9,\n\t8926:  0xCFEA,\n\t8927:  0xCFEB,\n\t8928:  0xCFEC,\n\t8929:  0xCFED,\n\t8930:  0xCFEE,\n\t8931:  0xCFEF,\n\t8932:  0xCFF2,\n\t8933:  0xCFF4,\n\t8934:  0xCFF6,\n\t8935:  0xCFF7,\n\t8936:  0xCFF8,\n\t8937:  0xCFF9,\n\t8938:  0xCFFA,\n\t8939:  0xCFFB,\n\t8940:  0xCFFD,\n\t8941:  0xCFFE,\n\t8942:  0xCFFF,\n\t8943:  0xD001,\n\t8944:  0xD002,\n\t8945:  0xD003,\n\t8946:  0xD005,\n\t8947:  0xD006,\n\t8948:  0xD007,\n\t8949:  0xD008,\n\t8950:  0xD009,\n\t8951:  0xD00A,\n\t8952:  0xD00B,\n\t8953:  0xD00C,\n\t8954:  0xD00D,\n\t8955:  0xD00E,\n\t8956:  0xD00F,\n\t8957:  0xD010,\n\t8958:  0xD012,\n\t8959:  0xD013,\n\t8960:  0xD014,\n\t8961:  0xD015,\n\t8962:  0xD016,\n\t8963:  0xD017,\n\t8964:  0xD019,\n\t8965:  0xD01A,\n\t8966:  0xD01B,\n\t8967:  0xD01C,\n\t8968:  0xD01D,\n\t8969:  0xD01E,\n\t8970:  0xD01F,\n\t8971:  0xD020,\n\t8972:  0xD021,\n\t8973:  0xD022,\n\t8974:  0xD023,\n\t8975:  0xD024,\n\t8976:  0xD025,\n\t8977:  0xD026,\n\t8978:  0xD027,\n\t8979:  0xD028,\n\t8980:  0xD029,\n\t8981:  0xD02A,\n\t8982:  0xD02B,\n\t8983:  0xD02C,\n\t8984:  0xB05D,\n\t8985:  0xB07C,\n\t8986:  0xB07D,\n\t8987:  0xB080,\n\t8988:  0xB084,\n\t8989:  0xB08C,\n\t8990:  0xB08D,\n\t8991:  0xB08F,\n\t8992:  0xB091,\n\t8993:  0xB098,\n\t8994:  0xB099,\n\t8995:  0xB09A,\n\t8996:  0xB09C,\n\t8997:  0xB09F,\n\t8998:  0xB0A0,\n\t8999:  0xB0A1,\n\t9000:  0xB0A2,\n\t9001:  0xB0A8,\n\t9002:  0xB0A9,\n\t9003:  0xB0AB,\n\t9004:  0xB0AC,\n\t9005:  0xB0AD,\n\t9006:  0xB0AE,\n\t9007:  0xB0AF,\n\t9008:  0xB0B1,\n\t9009:  0xB0B3,\n\t9010:  0xB0B4,\n\t9011:  0xB0B5,\n\t9012:  0xB0B8,\n\t9013:  0xB0BC,\n\t9014:  0xB0C4,\n\t9015:  0xB0C5,\n\t9016:  0xB0C7,\n\t9017:  0xB0C8,\n\t9018:  0xB0C9,\n\t9019:  0xB0D0,\n\t9020:  0xB0D1,\n\t9021:  0xB0D4,\n\t9022:  0xB0D8,\n\t9023:  0xB0E0,\n\t9024:  0xB0E5,\n\t9025:  0xB108,\n\t9026:  0xB109,\n\t9027:  0xB10B,\n\t9028:  0xB10C,\n\t9029:  0xB110,\n\t9030:  0xB112,\n\t9031:  0xB113,\n\t9032:  0xB118,\n\t9033:  0xB119,\n\t9034:  0xB11B,\n\t9035:  0xB11C,\n\t9036:  0xB11D,\n\t9037:  0xB123,\n\t9038:  0xB124,\n\t9039:  0xB125,\n\t9040:  0xB128,\n\t9041:  0xB12C,\n\t9042:  0xB134,\n\t9043:  0xB135,\n\t9044:  0xB137,\n\t9045:  0xB138,\n\t9046:  0xB139,\n\t9047:  0xB140,\n\t9048:  0xB141,\n\t9049:  0xB144,\n\t9050:  0xB148,\n\t9051:  0xB150,\n\t9052:  0xB151,\n\t9053:  0xB154,\n\t9054:  0xB155,\n\t9055:  0xB158,\n\t9056:  0xB15C,\n\t9057:  0xB160,\n\t9058:  0xB178,\n\t9059:  0xB179,\n\t9060:  0xB17C,\n\t9061:  0xB180,\n\t9062:  0xB182,\n\t9063:  0xB188,\n\t9064:  0xB189,\n\t9065:  0xB18B,\n\t9066:  0xB18D,\n\t9067:  0xB192,\n\t9068:  0xB193,\n\t9069:  0xB194,\n\t9070:  0xB198,\n\t9071:  0xB19C,\n\t9072:  0xB1A8,\n\t9073:  0xB1CC,\n\t9074:  0xB1D0,\n\t9075:  0xB1D4,\n\t9076:  0xB1DC,\n\t9077:  0xB1DD,\n\t9078:  0xD02E,\n\t9079:  0xD02F,\n\t9080:  0xD030,\n\t9081:  0xD031,\n\t9082:  0xD032,\n\t9083:  0xD033,\n\t9084:  0xD036,\n\t9085:  0xD037,\n\t9086:  0xD039,\n\t9087:  0xD03A,\n\t9088:  0xD03B,\n\t9089:  0xD03D,\n\t9090:  0xD03E,\n\t9091:  0xD03F,\n\t9092:  0xD040,\n\t9093:  0xD041,\n\t9094:  0xD042,\n\t9095:  0xD043,\n\t9096:  0xD046,\n\t9097:  0xD048,\n\t9098:  0xD04A,\n\t9099:  0xD04B,\n\t9100:  0xD04C,\n\t9101:  0xD04D,\n\t9102:  0xD04E,\n\t9103:  0xD04F,\n\t9104:  0xD051,\n\t9105:  0xD052,\n\t9106:  0xD053,\n\t9107:  0xD055,\n\t9108:  0xD056,\n\t9109:  0xD057,\n\t9110:  0xD059,\n\t9111:  0xD05A,\n\t9112:  0xD05B,\n\t9113:  0xD05C,\n\t9114:  0xD05D,\n\t9115:  0xD05E,\n\t9116:  0xD05F,\n\t9117:  0xD061,\n\t9118:  0xD062,\n\t9119:  0xD063,\n\t9120:  0xD064,\n\t9121:  0xD065,\n\t9122:  0xD066,\n\t9123:  0xD067,\n\t9124:  0xD068,\n\t9125:  0xD069,\n\t9126:  0xD06A,\n\t9127:  0xD06B,\n\t9128:  0xD06E,\n\t9129:  0xD06F,\n\t9130:  0xD071,\n\t9131:  0xD072,\n\t9132:  0xD073,\n\t9133:  0xD075,\n\t9134:  0xD076,\n\t9135:  0xD077,\n\t9136:  0xD078,\n\t9137:  0xD079,\n\t9138:  0xD07A,\n\t9139:  0xD07B,\n\t9140:  0xD07E,\n\t9141:  0xD07F,\n\t9142:  0xD080,\n\t9143:  0xD082,\n\t9144:  0xD083,\n\t9145:  0xD084,\n\t9146:  0xD085,\n\t9147:  0xD086,\n\t9148:  0xD087,\n\t9149:  0xD088,\n\t9150:  0xD089,\n\t9151:  0xD08A,\n\t9152:  0xD08B,\n\t9153:  0xD08C,\n\t9154:  0xD08D,\n\t9155:  0xD08E,\n\t9156:  0xD08F,\n\t9157:  0xD090,\n\t9158:  0xD091,\n\t9159:  0xD092,\n\t9160:  0xD093,\n\t9161:  0xD094,\n\t9162:  0xB1DF,\n\t9163:  0xB1E8,\n\t9164:  0xB1E9,\n\t9165:  0xB1EC,\n\t9166:  0xB1F0,\n\t9167:  0xB1F9,\n\t9168:  0xB1FB,\n\t9169:  0xB1FD,\n\t9170:  0xB204,\n\t9171:  0xB205,\n\t9172:  0xB208,\n\t9173:  0xB20B,\n\t9174:  0xB20C,\n\t9175:  0xB214,\n\t9176:  0xB215,\n\t9177:  0xB217,\n\t9178:  0xB219,\n\t9179:  0xB220,\n\t9180:  0xB234,\n\t9181:  0xB23C,\n\t9182:  0xB258,\n\t9183:  0xB25C,\n\t9184:  0xB260,\n\t9185:  0xB268,\n\t9186:  0xB269,\n\t9187:  0xB274,\n\t9188:  0xB275,\n\t9189:  0xB27C,\n\t9190:  0xB284,\n\t9191:  0xB285,\n\t9192:  0xB289,\n\t9193:  0xB290,\n\t9194:  0xB291,\n\t9195:  0xB294,\n\t9196:  0xB298,\n\t9197:  0xB299,\n\t9198:  0xB29A,\n\t9199:  0xB2A0,\n\t9200:  0xB2A1,\n\t9201:  0xB2A3,\n\t9202:  0xB2A5,\n\t9203:  0xB2A6,\n\t9204:  0xB2AA,\n\t9205:  0xB2AC,\n\t9206:  0xB2B0,\n\t9207:  0xB2B4,\n\t9208:  0xB2C8,\n\t9209:  0xB2C9,\n\t9210:  0xB2CC,\n\t9211:  0xB2D0,\n\t9212:  0xB2D2,\n\t9213:  0xB2D8,\n\t9214:  0xB2D9,\n\t9215:  0xB2DB,\n\t9216:  0xB2DD,\n\t9217:  0xB2E2,\n\t9218:  0xB2E4,\n\t9219:  0xB2E5,\n\t9220:  0xB2E6,\n\t9221:  0xB2E8,\n\t9222:  0xB2EB,\n\t9223:  0xB2EC,\n\t9224:  0xB2ED,\n\t9225:  0xB2EE,\n\t9226:  0xB2EF,\n\t9227:  0xB2F3,\n\t9228:  0xB2F4,\n\t9229:  0xB2F5,\n\t9230:  0xB2F7,\n\t9231:  0xB2F8,\n\t9232:  0xB2F9,\n\t9233:  0xB2FA,\n\t9234:  0xB2FB,\n\t9235:  0xB2FF,\n\t9236:  0xB300,\n\t9237:  0xB301,\n\t9238:  0xB304,\n\t9239:  0xB308,\n\t9240:  0xB310,\n\t9241:  0xB311,\n\t9242:  0xB313,\n\t9243:  0xB314,\n\t9244:  0xB315,\n\t9245:  0xB31C,\n\t9246:  0xB354,\n\t9247:  0xB355,\n\t9248:  0xB356,\n\t9249:  0xB358,\n\t9250:  0xB35B,\n\t9251:  0xB35C,\n\t9252:  0xB35E,\n\t9253:  0xB35F,\n\t9254:  0xB364,\n\t9255:  0xB365,\n\t9256:  0xD095,\n\t9257:  0xD096,\n\t9258:  0xD097,\n\t9259:  0xD098,\n\t9260:  0xD099,\n\t9261:  0xD09A,\n\t9262:  0xD09B,\n\t9263:  0xD09C,\n\t9264:  0xD09D,\n\t9265:  0xD09E,\n\t9266:  0xD09F,\n\t9267:  0xD0A0,\n\t9268:  0xD0A1,\n\t9269:  0xD0A2,\n\t9270:  0xD0A3,\n\t9271:  0xD0A6,\n\t9272:  0xD0A7,\n\t9273:  0xD0A9,\n\t9274:  0xD0AA,\n\t9275:  0xD0AB,\n\t9276:  0xD0AD,\n\t9277:  0xD0AE,\n\t9278:  0xD0AF,\n\t9279:  0xD0B0,\n\t9280:  0xD0B1,\n\t9281:  0xD0B2,\n\t9282:  0xD0B3,\n\t9283:  0xD0B6,\n\t9284:  0xD0B8,\n\t9285:  0xD0BA,\n\t9286:  0xD0BB,\n\t9287:  0xD0BC,\n\t9288:  0xD0BD,\n\t9289:  0xD0BE,\n\t9290:  0xD0BF,\n\t9291:  0xD0C2,\n\t9292:  0xD0C3,\n\t9293:  0xD0C5,\n\t9294:  0xD0C6,\n\t9295:  0xD0C7,\n\t9296:  0xD0CA,\n\t9297:  0xD0CB,\n\t9298:  0xD0CC,\n\t9299:  0xD0CD,\n\t9300:  0xD0CE,\n\t9301:  0xD0CF,\n\t9302:  0xD0D2,\n\t9303:  0xD0D6,\n\t9304:  0xD0D7,\n\t9305:  0xD0D8,\n\t9306:  0xD0D9,\n\t9307:  0xD0DA,\n\t9308:  0xD0DB,\n\t9309:  0xD0DE,\n\t9310:  0xD0DF,\n\t9311:  0xD0E1,\n\t9312:  0xD0E2,\n\t9313:  0xD0E3,\n\t9314:  0xD0E5,\n\t9315:  0xD0E6,\n\t9316:  0xD0E7,\n\t9317:  0xD0E8,\n\t9318:  0xD0E9,\n\t9319:  0xD0EA,\n\t9320:  0xD0EB,\n\t9321:  0xD0EE,\n\t9322:  0xD0F2,\n\t9323:  0xD0F3,\n\t9324:  0xD0F4,\n\t9325:  0xD0F5,\n\t9326:  0xD0F6,\n\t9327:  0xD0F7,\n\t9328:  0xD0F9,\n\t9329:  0xD0FA,\n\t9330:  0xD0FB,\n\t9331:  0xD0FC,\n\t9332:  0xD0FD,\n\t9333:  0xD0FE,\n\t9334:  0xD0FF,\n\t9335:  0xD100,\n\t9336:  0xD101,\n\t9337:  0xD102,\n\t9338:  0xD103,\n\t9339:  0xD104,\n\t9340:  0xB367,\n\t9341:  0xB369,\n\t9342:  0xB36B,\n\t9343:  0xB36E,\n\t9344:  0xB370,\n\t9345:  0xB371,\n\t9346:  0xB374,\n\t9347:  0xB378,\n\t9348:  0xB380,\n\t9349:  0xB381,\n\t9350:  0xB383,\n\t9351:  0xB384,\n\t9352:  0xB385,\n\t9353:  0xB38C,\n\t9354:  0xB390,\n\t9355:  0xB394,\n\t9356:  0xB3A0,\n\t9357:  0xB3A1,\n\t9358:  0xB3A8,\n\t9359:  0xB3AC,\n\t9360:  0xB3C4,\n\t9361:  0xB3C5,\n\t9362:  0xB3C8,\n\t9363:  0xB3CB,\n\t9364:  0xB3CC,\n\t9365:  0xB3CE,\n\t9366:  0xB3D0,\n\t9367:  0xB3D4,\n\t9368:  0xB3D5,\n\t9369:  0xB3D7,\n\t9370:  0xB3D9,\n\t9371:  0xB3DB,\n\t9372:  0xB3DD,\n\t9373:  0xB3E0,\n\t9374:  0xB3E4,\n\t9375:  0xB3E8,\n\t9376:  0xB3FC,\n\t9377:  0xB410,\n\t9378:  0xB418,\n\t9379:  0xB41C,\n\t9380:  0xB420,\n\t9381:  0xB428,\n\t9382:  0xB429,\n\t9383:  0xB42B,\n\t9384:  0xB434,\n\t9385:  0xB450,\n\t9386:  0xB451,\n\t9387:  0xB454,\n\t9388:  0xB458,\n\t9389:  0xB460,\n\t9390:  0xB461,\n\t9391:  0xB463,\n\t9392:  0xB465,\n\t9393:  0xB46C,\n\t9394:  0xB480,\n\t9395:  0xB488,\n\t9396:  0xB49D,\n\t9397:  0xB4A4,\n\t9398:  0xB4A8,\n\t9399:  0xB4AC,\n\t9400:  0xB4B5,\n\t9401:  0xB4B7,\n\t9402:  0xB4B9,\n\t9403:  0xB4C0,\n\t9404:  0xB4C4,\n\t9405:  0xB4C8,\n\t9406:  0xB4D0,\n\t9407:  0xB4D5,\n\t9408:  0xB4DC,\n\t9409:  0xB4DD,\n\t9410:  0xB4E0,\n\t9411:  0xB4E3,\n\t9412:  0xB4E4,\n\t9413:  0xB4E6,\n\t9414:  0xB4EC,\n\t9415:  0xB4ED,\n\t9416:  0xB4EF,\n\t9417:  0xB4F1,\n\t9418:  0xB4F8,\n\t9419:  0xB514,\n\t9420:  0xB515,\n\t9421:  0xB518,\n\t9422:  0xB51B,\n\t9423:  0xB51C,\n\t9424:  0xB524,\n\t9425:  0xB525,\n\t9426:  0xB527,\n\t9427:  0xB528,\n\t9428:  0xB529,\n\t9429:  0xB52A,\n\t9430:  0xB530,\n\t9431:  0xB531,\n\t9432:  0xB534,\n\t9433:  0xB538,\n\t9434:  0xD105,\n\t9435:  0xD106,\n\t9436:  0xD107,\n\t9437:  0xD108,\n\t9438:  0xD109,\n\t9439:  0xD10A,\n\t9440:  0xD10B,\n\t9441:  0xD10C,\n\t9442:  0xD10E,\n\t9443:  0xD10F,\n\t9444:  0xD110,\n\t9445:  0xD111,\n\t9446:  0xD112,\n\t9447:  0xD113,\n\t9448:  0xD114,\n\t9449:  0xD115,\n\t9450:  0xD116,\n\t9451:  0xD117,\n\t9452:  0xD118,\n\t9453:  0xD119,\n\t9454:  0xD11A,\n\t9455:  0xD11B,\n\t9456:  0xD11C,\n\t9457:  0xD11D,\n\t9458:  0xD11E,\n\t9459:  0xD11F,\n\t9460:  0xD120,\n\t9461:  0xD121,\n\t9462:  0xD122,\n\t9463:  0xD123,\n\t9464:  0xD124,\n\t9465:  0xD125,\n\t9466:  0xD126,\n\t9467:  0xD127,\n\t9468:  0xD128,\n\t9469:  0xD129,\n\t9470:  0xD12A,\n\t9471:  0xD12B,\n\t9472:  0xD12C,\n\t9473:  0xD12D,\n\t9474:  0xD12E,\n\t9475:  0xD12F,\n\t9476:  0xD132,\n\t9477:  0xD133,\n\t9478:  0xD135,\n\t9479:  0xD136,\n\t9480:  0xD137,\n\t9481:  0xD139,\n\t9482:  0xD13B,\n\t9483:  0xD13C,\n\t9484:  0xD13D,\n\t9485:  0xD13E,\n\t9486:  0xD13F,\n\t9487:  0xD142,\n\t9488:  0xD146,\n\t9489:  0xD147,\n\t9490:  0xD148,\n\t9491:  0xD149,\n\t9492:  0xD14A,\n\t9493:  0xD14B,\n\t9494:  0xD14E,\n\t9495:  0xD14F,\n\t9496:  0xD151,\n\t9497:  0xD152,\n\t9498:  0xD153,\n\t9499:  0xD155,\n\t9500:  0xD156,\n\t9501:  0xD157,\n\t9502:  0xD158,\n\t9503:  0xD159,\n\t9504:  0xD15A,\n\t9505:  0xD15B,\n\t9506:  0xD15E,\n\t9507:  0xD160,\n\t9508:  0xD162,\n\t9509:  0xD163,\n\t9510:  0xD164,\n\t9511:  0xD165,\n\t9512:  0xD166,\n\t9513:  0xD167,\n\t9514:  0xD169,\n\t9515:  0xD16A,\n\t9516:  0xD16B,\n\t9517:  0xD16D,\n\t9518:  0xB540,\n\t9519:  0xB541,\n\t9520:  0xB543,\n\t9521:  0xB544,\n\t9522:  0xB545,\n\t9523:  0xB54B,\n\t9524:  0xB54C,\n\t9525:  0xB54D,\n\t9526:  0xB550,\n\t9527:  0xB554,\n\t9528:  0xB55C,\n\t9529:  0xB55D,\n\t9530:  0xB55F,\n\t9531:  0xB560,\n\t9532:  0xB561,\n\t9533:  0xB5A0,\n\t9534:  0xB5A1,\n\t9535:  0xB5A4,\n\t9536:  0xB5A8,\n\t9537:  0xB5AA,\n\t9538:  0xB5AB,\n\t9539:  0xB5B0,\n\t9540:  0xB5B1,\n\t9541:  0xB5B3,\n\t9542:  0xB5B4,\n\t9543:  0xB5B5,\n\t9544:  0xB5BB,\n\t9545:  0xB5BC,\n\t9546:  0xB5BD,\n\t9547:  0xB5C0,\n\t9548:  0xB5C4,\n\t9549:  0xB5CC,\n\t9550:  0xB5CD,\n\t9551:  0xB5CF,\n\t9552:  0xB5D0,\n\t9553:  0xB5D1,\n\t9554:  0xB5D8,\n\t9555:  0xB5EC,\n\t9556:  0xB610,\n\t9557:  0xB611,\n\t9558:  0xB614,\n\t9559:  0xB618,\n\t9560:  0xB625,\n\t9561:  0xB62C,\n\t9562:  0xB634,\n\t9563:  0xB648,\n\t9564:  0xB664,\n\t9565:  0xB668,\n\t9566:  0xB69C,\n\t9567:  0xB69D,\n\t9568:  0xB6A0,\n\t9569:  0xB6A4,\n\t9570:  0xB6AB,\n\t9571:  0xB6AC,\n\t9572:  0xB6B1,\n\t9573:  0xB6D4,\n\t9574:  0xB6F0,\n\t9575:  0xB6F4,\n\t9576:  0xB6F8,\n\t9577:  0xB700,\n\t9578:  0xB701,\n\t9579:  0xB705,\n\t9580:  0xB728,\n\t9581:  0xB729,\n\t9582:  0xB72C,\n\t9583:  0xB72F,\n\t9584:  0xB730,\n\t9585:  0xB738,\n\t9586:  0xB739,\n\t9587:  0xB73B,\n\t9588:  0xB744,\n\t9589:  0xB748,\n\t9590:  0xB74C,\n\t9591:  0xB754,\n\t9592:  0xB755,\n\t9593:  0xB760,\n\t9594:  0xB764,\n\t9595:  0xB768,\n\t9596:  0xB770,\n\t9597:  0xB771,\n\t9598:  0xB773,\n\t9599:  0xB775,\n\t9600:  0xB77C,\n\t9601:  0xB77D,\n\t9602:  0xB780,\n\t9603:  0xB784,\n\t9604:  0xB78C,\n\t9605:  0xB78D,\n\t9606:  0xB78F,\n\t9607:  0xB790,\n\t9608:  0xB791,\n\t9609:  0xB792,\n\t9610:  0xB796,\n\t9611:  0xB797,\n\t9612:  0xD16E,\n\t9613:  0xD16F,\n\t9614:  0xD170,\n\t9615:  0xD171,\n\t9616:  0xD172,\n\t9617:  0xD173,\n\t9618:  0xD174,\n\t9619:  0xD175,\n\t9620:  0xD176,\n\t9621:  0xD177,\n\t9622:  0xD178,\n\t9623:  0xD179,\n\t9624:  0xD17A,\n\t9625:  0xD17B,\n\t9626:  0xD17D,\n\t9627:  0xD17E,\n\t9628:  0xD17F,\n\t9629:  0xD180,\n\t9630:  0xD181,\n\t9631:  0xD182,\n\t9632:  0xD183,\n\t9633:  0xD185,\n\t9634:  0xD186,\n\t9635:  0xD187,\n\t9636:  0xD189,\n\t9637:  0xD18A,\n\t9638:  0xD18B,\n\t9639:  0xD18C,\n\t9640:  0xD18D,\n\t9641:  0xD18E,\n\t9642:  0xD18F,\n\t9643:  0xD190,\n\t9644:  0xD191,\n\t9645:  0xD192,\n\t9646:  0xD193,\n\t9647:  0xD194,\n\t9648:  0xD195,\n\t9649:  0xD196,\n\t9650:  0xD197,\n\t9651:  0xD198,\n\t9652:  0xD199,\n\t9653:  0xD19A,\n\t9654:  0xD19B,\n\t9655:  0xD19C,\n\t9656:  0xD19D,\n\t9657:  0xD19E,\n\t9658:  0xD19F,\n\t9659:  0xD1A2,\n\t9660:  0xD1A3,\n\t9661:  0xD1A5,\n\t9662:  0xD1A6,\n\t9663:  0xD1A7,\n\t9664:  0xD1A9,\n\t9665:  0xD1AA,\n\t9666:  0xD1AB,\n\t9667:  0xD1AC,\n\t9668:  0xD1AD,\n\t9669:  0xD1AE,\n\t9670:  0xD1AF,\n\t9671:  0xD1B2,\n\t9672:  0xD1B4,\n\t9673:  0xD1B6,\n\t9674:  0xD1B7,\n\t9675:  0xD1B8,\n\t9676:  0xD1B9,\n\t9677:  0xD1BB,\n\t9678:  0xD1BD,\n\t9679:  0xD1BE,\n\t9680:  0xD1BF,\n\t9681:  0xD1C1,\n\t9682:  0xD1C2,\n\t9683:  0xD1C3,\n\t9684:  0xD1C4,\n\t9685:  0xD1C5,\n\t9686:  0xD1C6,\n\t9687:  0xD1C7,\n\t9688:  0xD1C8,\n\t9689:  0xD1C9,\n\t9690:  0xD1CA,\n\t9691:  0xD1CB,\n\t9692:  0xD1CC,\n\t9693:  0xD1CD,\n\t9694:  0xD1CE,\n\t9695:  0xD1CF,\n\t9696:  0xB798,\n\t9697:  0xB799,\n\t9698:  0xB79C,\n\t9699:  0xB7A0,\n\t9700:  0xB7A8,\n\t9701:  0xB7A9,\n\t9702:  0xB7AB,\n\t9703:  0xB7AC,\n\t9704:  0xB7AD,\n\t9705:  0xB7B4,\n\t9706:  0xB7B5,\n\t9707:  0xB7B8,\n\t9708:  0xB7C7,\n\t9709:  0xB7C9,\n\t9710:  0xB7EC,\n\t9711:  0xB7ED,\n\t9712:  0xB7F0,\n\t9713:  0xB7F4,\n\t9714:  0xB7FC,\n\t9715:  0xB7FD,\n\t9716:  0xB7FF,\n\t9717:  0xB800,\n\t9718:  0xB801,\n\t9719:  0xB807,\n\t9720:  0xB808,\n\t9721:  0xB809,\n\t9722:  0xB80C,\n\t9723:  0xB810,\n\t9724:  0xB818,\n\t9725:  0xB819,\n\t9726:  0xB81B,\n\t9727:  0xB81D,\n\t9728:  0xB824,\n\t9729:  0xB825,\n\t9730:  0xB828,\n\t9731:  0xB82C,\n\t9732:  0xB834,\n\t9733:  0xB835,\n\t9734:  0xB837,\n\t9735:  0xB838,\n\t9736:  0xB839,\n\t9737:  0xB840,\n\t9738:  0xB844,\n\t9739:  0xB851,\n\t9740:  0xB853,\n\t9741:  0xB85C,\n\t9742:  0xB85D,\n\t9743:  0xB860,\n\t9744:  0xB864,\n\t9745:  0xB86C,\n\t9746:  0xB86D,\n\t9747:  0xB86F,\n\t9748:  0xB871,\n\t9749:  0xB878,\n\t9750:  0xB87C,\n\t9751:  0xB88D,\n\t9752:  0xB8A8,\n\t9753:  0xB8B0,\n\t9754:  0xB8B4,\n\t9755:  0xB8B8,\n\t9756:  0xB8C0,\n\t9757:  0xB8C1,\n\t9758:  0xB8C3,\n\t9759:  0xB8C5,\n\t9760:  0xB8CC,\n\t9761:  0xB8D0,\n\t9762:  0xB8D4,\n\t9763:  0xB8DD,\n\t9764:  0xB8DF,\n\t9765:  0xB8E1,\n\t9766:  0xB8E8,\n\t9767:  0xB8E9,\n\t9768:  0xB8EC,\n\t9769:  0xB8F0,\n\t9770:  0xB8F8,\n\t9771:  0xB8F9,\n\t9772:  0xB8FB,\n\t9773:  0xB8FD,\n\t9774:  0xB904,\n\t9775:  0xB918,\n\t9776:  0xB920,\n\t9777:  0xB93C,\n\t9778:  0xB93D,\n\t9779:  0xB940,\n\t9780:  0xB944,\n\t9781:  0xB94C,\n\t9782:  0xB94F,\n\t9783:  0xB951,\n\t9784:  0xB958,\n\t9785:  0xB959,\n\t9786:  0xB95C,\n\t9787:  0xB960,\n\t9788:  0xB968,\n\t9789:  0xB969,\n\t9790:  0xD1D0,\n\t9791:  0xD1D1,\n\t9792:  0xD1D2,\n\t9793:  0xD1D3,\n\t9794:  0xD1D4,\n\t9795:  0xD1D5,\n\t9796:  0xD1D6,\n\t9797:  0xD1D7,\n\t9798:  0xD1D9,\n\t9799:  0xD1DA,\n\t9800:  0xD1DB,\n\t9801:  0xD1DC,\n\t9802:  0xD1DD,\n\t9803:  0xD1DE,\n\t9804:  0xD1DF,\n\t9805:  0xD1E0,\n\t9806:  0xD1E1,\n\t9807:  0xD1E2,\n\t9808:  0xD1E3,\n\t9809:  0xD1E4,\n\t9810:  0xD1E5,\n\t9811:  0xD1E6,\n\t9812:  0xD1E7,\n\t9813:  0xD1E8,\n\t9814:  0xD1E9,\n\t9815:  0xD1EA,\n\t9816:  0xD1EB,\n\t9817:  0xD1EC,\n\t9818:  0xD1ED,\n\t9819:  0xD1EE,\n\t9820:  0xD1EF,\n\t9821:  0xD1F0,\n\t9822:  0xD1F1,\n\t9823:  0xD1F2,\n\t9824:  0xD1F3,\n\t9825:  0xD1F5,\n\t9826:  0xD1F6,\n\t9827:  0xD1F7,\n\t9828:  0xD1F9,\n\t9829:  0xD1FA,\n\t9830:  0xD1FB,\n\t9831:  0xD1FC,\n\t9832:  0xD1FD,\n\t9833:  0xD1FE,\n\t9834:  0xD1FF,\n\t9835:  0xD200,\n\t9836:  0xD201,\n\t9837:  0xD202,\n\t9838:  0xD203,\n\t9839:  0xD204,\n\t9840:  0xD205,\n\t9841:  0xD206,\n\t9842:  0xD208,\n\t9843:  0xD20A,\n\t9844:  0xD20B,\n\t9845:  0xD20C,\n\t9846:  0xD20D,\n\t9847:  0xD20E,\n\t9848:  0xD20F,\n\t9849:  0xD211,\n\t9850:  0xD212,\n\t9851:  0xD213,\n\t9852:  0xD214,\n\t9853:  0xD215,\n\t9854:  0xD216,\n\t9855:  0xD217,\n\t9856:  0xD218,\n\t9857:  0xD219,\n\t9858:  0xD21A,\n\t9859:  0xD21B,\n\t9860:  0xD21C,\n\t9861:  0xD21D,\n\t9862:  0xD21E,\n\t9863:  0xD21F,\n\t9864:  0xD220,\n\t9865:  0xD221,\n\t9866:  0xD222,\n\t9867:  0xD223,\n\t9868:  0xD224,\n\t9869:  0xD225,\n\t9870:  0xD226,\n\t9871:  0xD227,\n\t9872:  0xD228,\n\t9873:  0xD229,\n\t9874:  0xB96B,\n\t9875:  0xB96D,\n\t9876:  0xB974,\n\t9877:  0xB975,\n\t9878:  0xB978,\n\t9879:  0xB97C,\n\t9880:  0xB984,\n\t9881:  0xB985,\n\t9882:  0xB987,\n\t9883:  0xB989,\n\t9884:  0xB98A,\n\t9885:  0xB98D,\n\t9886:  0xB98E,\n\t9887:  0xB9AC,\n\t9888:  0xB9AD,\n\t9889:  0xB9B0,\n\t9890:  0xB9B4,\n\t9891:  0xB9BC,\n\t9892:  0xB9BD,\n\t9893:  0xB9BF,\n\t9894:  0xB9C1,\n\t9895:  0xB9C8,\n\t9896:  0xB9C9,\n\t9897:  0xB9CC,\n\t9898:  0xB9CE,\n\t9899:  0xB9CF,\n\t9900:  0xB9D0,\n\t9901:  0xB9D1,\n\t9902:  0xB9D2,\n\t9903:  0xB9D8,\n\t9904:  0xB9D9,\n\t9905:  0xB9DB,\n\t9906:  0xB9DD,\n\t9907:  0xB9DE,\n\t9908:  0xB9E1,\n\t9909:  0xB9E3,\n\t9910:  0xB9E4,\n\t9911:  0xB9E5,\n\t9912:  0xB9E8,\n\t9913:  0xB9EC,\n\t9914:  0xB9F4,\n\t9915:  0xB9F5,\n\t9916:  0xB9F7,\n\t9917:  0xB9F8,\n\t9918:  0xB9F9,\n\t9919:  0xB9FA,\n\t9920:  0xBA00,\n\t9921:  0xBA01,\n\t9922:  0xBA08,\n\t9923:  0xBA15,\n\t9924:  0xBA38,\n\t9925:  0xBA39,\n\t9926:  0xBA3C,\n\t9927:  0xBA40,\n\t9928:  0xBA42,\n\t9929:  0xBA48,\n\t9930:  0xBA49,\n\t9931:  0xBA4B,\n\t9932:  0xBA4D,\n\t9933:  0xBA4E,\n\t9934:  0xBA53,\n\t9935:  0xBA54,\n\t9936:  0xBA55,\n\t9937:  0xBA58,\n\t9938:  0xBA5C,\n\t9939:  0xBA64,\n\t9940:  0xBA65,\n\t9941:  0xBA67,\n\t9942:  0xBA68,\n\t9943:  0xBA69,\n\t9944:  0xBA70,\n\t9945:  0xBA71,\n\t9946:  0xBA74,\n\t9947:  0xBA78,\n\t9948:  0xBA83,\n\t9949:  0xBA84,\n\t9950:  0xBA85,\n\t9951:  0xBA87,\n\t9952:  0xBA8C,\n\t9953:  0xBAA8,\n\t9954:  0xBAA9,\n\t9955:  0xBAAB,\n\t9956:  0xBAAC,\n\t9957:  0xBAB0,\n\t9958:  0xBAB2,\n\t9959:  0xBAB8,\n\t9960:  0xBAB9,\n\t9961:  0xBABB,\n\t9962:  0xBABD,\n\t9963:  0xBAC4,\n\t9964:  0xBAC8,\n\t9965:  0xBAD8,\n\t9966:  0xBAD9,\n\t9967:  0xBAFC,\n\t9968:  0xD22A,\n\t9969:  0xD22B,\n\t9970:  0xD22E,\n\t9971:  0xD22F,\n\t9972:  0xD231,\n\t9973:  0xD232,\n\t9974:  0xD233,\n\t9975:  0xD235,\n\t9976:  0xD236,\n\t9977:  0xD237,\n\t9978:  0xD238,\n\t9979:  0xD239,\n\t9980:  0xD23A,\n\t9981:  0xD23B,\n\t9982:  0xD23E,\n\t9983:  0xD240,\n\t9984:  0xD242,\n\t9985:  0xD243,\n\t9986:  0xD244,\n\t9987:  0xD245,\n\t9988:  0xD246,\n\t9989:  0xD247,\n\t9990:  0xD249,\n\t9991:  0xD24A,\n\t9992:  0xD24B,\n\t9993:  0xD24C,\n\t9994:  0xD24D,\n\t9995:  0xD24E,\n\t9996:  0xD24F,\n\t9997:  0xD250,\n\t9998:  0xD251,\n\t9999:  0xD252,\n\t10000: 0xD253,\n\t10001: 0xD254,\n\t10002: 0xD255,\n\t10003: 0xD256,\n\t10004: 0xD257,\n\t10005: 0xD258,\n\t10006: 0xD259,\n\t10007: 0xD25A,\n\t10008: 0xD25B,\n\t10009: 0xD25D,\n\t10010: 0xD25E,\n\t10011: 0xD25F,\n\t10012: 0xD260,\n\t10013: 0xD261,\n\t10014: 0xD262,\n\t10015: 0xD263,\n\t10016: 0xD265,\n\t10017: 0xD266,\n\t10018: 0xD267,\n\t10019: 0xD268,\n\t10020: 0xD269,\n\t10021: 0xD26A,\n\t10022: 0xD26B,\n\t10023: 0xD26C,\n\t10024: 0xD26D,\n\t10025: 0xD26E,\n\t10026: 0xD26F,\n\t10027: 0xD270,\n\t10028: 0xD271,\n\t10029: 0xD272,\n\t10030: 0xD273,\n\t10031: 0xD274,\n\t10032: 0xD275,\n\t10033: 0xD276,\n\t10034: 0xD277,\n\t10035: 0xD278,\n\t10036: 0xD279,\n\t10037: 0xD27A,\n\t10038: 0xD27B,\n\t10039: 0xD27C,\n\t10040: 0xD27D,\n\t10041: 0xD27E,\n\t10042: 0xD27F,\n\t10043: 0xD282,\n\t10044: 0xD283,\n\t10045: 0xD285,\n\t10046: 0xD286,\n\t10047: 0xD287,\n\t10048: 0xD289,\n\t10049: 0xD28A,\n\t10050: 0xD28B,\n\t10051: 0xD28C,\n\t10052: 0xBB00,\n\t10053: 0xBB04,\n\t10054: 0xBB0D,\n\t10055: 0xBB0F,\n\t10056: 0xBB11,\n\t10057: 0xBB18,\n\t10058: 0xBB1C,\n\t10059: 0xBB20,\n\t10060: 0xBB29,\n\t10061: 0xBB2B,\n\t10062: 0xBB34,\n\t10063: 0xBB35,\n\t10064: 0xBB36,\n\t10065: 0xBB38,\n\t10066: 0xBB3B,\n\t10067: 0xBB3C,\n\t10068: 0xBB3D,\n\t10069: 0xBB3E,\n\t10070: 0xBB44,\n\t10071: 0xBB45,\n\t10072: 0xBB47,\n\t10073: 0xBB49,\n\t10074: 0xBB4D,\n\t10075: 0xBB4F,\n\t10076: 0xBB50,\n\t10077: 0xBB54,\n\t10078: 0xBB58,\n\t10079: 0xBB61,\n\t10080: 0xBB63,\n\t10081: 0xBB6C,\n\t10082: 0xBB88,\n\t10083: 0xBB8C,\n\t10084: 0xBB90,\n\t10085: 0xBBA4,\n\t10086: 0xBBA8,\n\t10087: 0xBBAC,\n\t10088: 0xBBB4,\n\t10089: 0xBBB7,\n\t10090: 0xBBC0,\n\t10091: 0xBBC4,\n\t10092: 0xBBC8,\n\t10093: 0xBBD0,\n\t10094: 0xBBD3,\n\t10095: 0xBBF8,\n\t10096: 0xBBF9,\n\t10097: 0xBBFC,\n\t10098: 0xBBFF,\n\t10099: 0xBC00,\n\t10100: 0xBC02,\n\t10101: 0xBC08,\n\t10102: 0xBC09,\n\t10103: 0xBC0B,\n\t10104: 0xBC0C,\n\t10105: 0xBC0D,\n\t10106: 0xBC0F,\n\t10107: 0xBC11,\n\t10108: 0xBC14,\n\t10109: 0xBC15,\n\t10110: 0xBC16,\n\t10111: 0xBC17,\n\t10112: 0xBC18,\n\t10113: 0xBC1B,\n\t10114: 0xBC1C,\n\t10115: 0xBC1D,\n\t10116: 0xBC1E,\n\t10117: 0xBC1F,\n\t10118: 0xBC24,\n\t10119: 0xBC25,\n\t10120: 0xBC27,\n\t10121: 0xBC29,\n\t10122: 0xBC2D,\n\t10123: 0xBC30,\n\t10124: 0xBC31,\n\t10125: 0xBC34,\n\t10126: 0xBC38,\n\t10127: 0xBC40,\n\t10128: 0xBC41,\n\t10129: 0xBC43,\n\t10130: 0xBC44,\n\t10131: 0xBC45,\n\t10132: 0xBC49,\n\t10133: 0xBC4C,\n\t10134: 0xBC4D,\n\t10135: 0xBC50,\n\t10136: 0xBC5D,\n\t10137: 0xBC84,\n\t10138: 0xBC85,\n\t10139: 0xBC88,\n\t10140: 0xBC8B,\n\t10141: 0xBC8C,\n\t10142: 0xBC8E,\n\t10143: 0xBC94,\n\t10144: 0xBC95,\n\t10145: 0xBC97,\n\t10146: 0xD28D,\n\t10147: 0xD28E,\n\t10148: 0xD28F,\n\t10149: 0xD292,\n\t10150: 0xD293,\n\t10151: 0xD294,\n\t10152: 0xD296,\n\t10153: 0xD297,\n\t10154: 0xD298,\n\t10155: 0xD299,\n\t10156: 0xD29A,\n\t10157: 0xD29B,\n\t10158: 0xD29D,\n\t10159: 0xD29E,\n\t10160: 0xD29F,\n\t10161: 0xD2A1,\n\t10162: 0xD2A2,\n\t10163: 0xD2A3,\n\t10164: 0xD2A5,\n\t10165: 0xD2A6,\n\t10166: 0xD2A7,\n\t10167: 0xD2A8,\n\t10168: 0xD2A9,\n\t10169: 0xD2AA,\n\t10170: 0xD2AB,\n\t10171: 0xD2AD,\n\t10172: 0xD2AE,\n\t10173: 0xD2AF,\n\t10174: 0xD2B0,\n\t10175: 0xD2B2,\n\t10176: 0xD2B3,\n\t10177: 0xD2B4,\n\t10178: 0xD2B5,\n\t10179: 0xD2B6,\n\t10180: 0xD2B7,\n\t10181: 0xD2BA,\n\t10182: 0xD2BB,\n\t10183: 0xD2BD,\n\t10184: 0xD2BE,\n\t10185: 0xD2C1,\n\t10186: 0xD2C3,\n\t10187: 0xD2C4,\n\t10188: 0xD2C5,\n\t10189: 0xD2C6,\n\t10190: 0xD2C7,\n\t10191: 0xD2CA,\n\t10192: 0xD2CC,\n\t10193: 0xD2CD,\n\t10194: 0xD2CE,\n\t10195: 0xD2CF,\n\t10196: 0xD2D0,\n\t10197: 0xD2D1,\n\t10198: 0xD2D2,\n\t10199: 0xD2D3,\n\t10200: 0xD2D5,\n\t10201: 0xD2D6,\n\t10202: 0xD2D7,\n\t10203: 0xD2D9,\n\t10204: 0xD2DA,\n\t10205: 0xD2DB,\n\t10206: 0xD2DD,\n\t10207: 0xD2DE,\n\t10208: 0xD2DF,\n\t10209: 0xD2E0,\n\t10210: 0xD2E1,\n\t10211: 0xD2E2,\n\t10212: 0xD2E3,\n\t10213: 0xD2E6,\n\t10214: 0xD2E7,\n\t10215: 0xD2E8,\n\t10216: 0xD2E9,\n\t10217: 0xD2EA,\n\t10218: 0xD2EB,\n\t10219: 0xD2EC,\n\t10220: 0xD2ED,\n\t10221: 0xD2EE,\n\t10222: 0xD2EF,\n\t10223: 0xD2F2,\n\t10224: 0xD2F3,\n\t10225: 0xD2F5,\n\t10226: 0xD2F6,\n\t10227: 0xD2F7,\n\t10228: 0xD2F9,\n\t10229: 0xD2FA,\n\t10230: 0xBC99,\n\t10231: 0xBC9A,\n\t10232: 0xBCA0,\n\t10233: 0xBCA1,\n\t10234: 0xBCA4,\n\t10235: 0xBCA7,\n\t10236: 0xBCA8,\n\t10237: 0xBCB0,\n\t10238: 0xBCB1,\n\t10239: 0xBCB3,\n\t10240: 0xBCB4,\n\t10241: 0xBCB5,\n\t10242: 0xBCBC,\n\t10243: 0xBCBD,\n\t10244: 0xBCC0,\n\t10245: 0xBCC4,\n\t10246: 0xBCCD,\n\t10247: 0xBCCF,\n\t10248: 0xBCD0,\n\t10249: 0xBCD1,\n\t10250: 0xBCD5,\n\t10251: 0xBCD8,\n\t10252: 0xBCDC,\n\t10253: 0xBCF4,\n\t10254: 0xBCF5,\n\t10255: 0xBCF6,\n\t10256: 0xBCF8,\n\t10257: 0xBCFC,\n\t10258: 0xBD04,\n\t10259: 0xBD05,\n\t10260: 0xBD07,\n\t10261: 0xBD09,\n\t10262: 0xBD10,\n\t10263: 0xBD14,\n\t10264: 0xBD24,\n\t10265: 0xBD2C,\n\t10266: 0xBD40,\n\t10267: 0xBD48,\n\t10268: 0xBD49,\n\t10269: 0xBD4C,\n\t10270: 0xBD50,\n\t10271: 0xBD58,\n\t10272: 0xBD59,\n\t10273: 0xBD64,\n\t10274: 0xBD68,\n\t10275: 0xBD80,\n\t10276: 0xBD81,\n\t10277: 0xBD84,\n\t10278: 0xBD87,\n\t10279: 0xBD88,\n\t10280: 0xBD89,\n\t10281: 0xBD8A,\n\t10282: 0xBD90,\n\t10283: 0xBD91,\n\t10284: 0xBD93,\n\t10285: 0xBD95,\n\t10286: 0xBD99,\n\t10287: 0xBD9A,\n\t10288: 0xBD9C,\n\t10289: 0xBDA4,\n\t10290: 0xBDB0,\n\t10291: 0xBDB8,\n\t10292: 0xBDD4,\n\t10293: 0xBDD5,\n\t10294: 0xBDD8,\n\t10295: 0xBDDC,\n\t10296: 0xBDE9,\n\t10297: 0xBDF0,\n\t10298: 0xBDF4,\n\t10299: 0xBDF8,\n\t10300: 0xBE00,\n\t10301: 0xBE03,\n\t10302: 0xBE05,\n\t10303: 0xBE0C,\n\t10304: 0xBE0D,\n\t10305: 0xBE10,\n\t10306: 0xBE14,\n\t10307: 0xBE1C,\n\t10308: 0xBE1D,\n\t10309: 0xBE1F,\n\t10310: 0xBE44,\n\t10311: 0xBE45,\n\t10312: 0xBE48,\n\t10313: 0xBE4C,\n\t10314: 0xBE4E,\n\t10315: 0xBE54,\n\t10316: 0xBE55,\n\t10317: 0xBE57,\n\t10318: 0xBE59,\n\t10319: 0xBE5A,\n\t10320: 0xBE5B,\n\t10321: 0xBE60,\n\t10322: 0xBE61,\n\t10323: 0xBE64,\n\t10324: 0xD2FB,\n\t10325: 0xD2FC,\n\t10326: 0xD2FD,\n\t10327: 0xD2FE,\n\t10328: 0xD2FF,\n\t10329: 0xD302,\n\t10330: 0xD304,\n\t10331: 0xD306,\n\t10332: 0xD307,\n\t10333: 0xD308,\n\t10334: 0xD309,\n\t10335: 0xD30A,\n\t10336: 0xD30B,\n\t10337: 0xD30F,\n\t10338: 0xD311,\n\t10339: 0xD312,\n\t10340: 0xD313,\n\t10341: 0xD315,\n\t10342: 0xD317,\n\t10343: 0xD318,\n\t10344: 0xD319,\n\t10345: 0xD31A,\n\t10346: 0xD31B,\n\t10347: 0xD31E,\n\t10348: 0xD322,\n\t10349: 0xD323,\n\t10350: 0xD324,\n\t10351: 0xD326,\n\t10352: 0xD327,\n\t10353: 0xD32A,\n\t10354: 0xD32B,\n\t10355: 0xD32D,\n\t10356: 0xD32E,\n\t10357: 0xD32F,\n\t10358: 0xD331,\n\t10359: 0xD332,\n\t10360: 0xD333,\n\t10361: 0xD334,\n\t10362: 0xD335,\n\t10363: 0xD336,\n\t10364: 0xD337,\n\t10365: 0xD33A,\n\t10366: 0xD33E,\n\t10367: 0xD33F,\n\t10368: 0xD340,\n\t10369: 0xD341,\n\t10370: 0xD342,\n\t10371: 0xD343,\n\t10372: 0xD346,\n\t10373: 0xD347,\n\t10374: 0xD348,\n\t10375: 0xD349,\n\t10376: 0xD34A,\n\t10377: 0xD34B,\n\t10378: 0xD34C,\n\t10379: 0xD34D,\n\t10380: 0xD34E,\n\t10381: 0xD34F,\n\t10382: 0xD350,\n\t10383: 0xD351,\n\t10384: 0xD352,\n\t10385: 0xD353,\n\t10386: 0xD354,\n\t10387: 0xD355,\n\t10388: 0xD356,\n\t10389: 0xD357,\n\t10390: 0xD358,\n\t10391: 0xD359,\n\t10392: 0xD35A,\n\t10393: 0xD35B,\n\t10394: 0xD35C,\n\t10395: 0xD35D,\n\t10396: 0xD35E,\n\t10397: 0xD35F,\n\t10398: 0xD360,\n\t10399: 0xD361,\n\t10400: 0xD362,\n\t10401: 0xD363,\n\t10402: 0xD364,\n\t10403: 0xD365,\n\t10404: 0xD366,\n\t10405: 0xD367,\n\t10406: 0xD368,\n\t10407: 0xD369,\n\t10408: 0xBE68,\n\t10409: 0xBE6A,\n\t10410: 0xBE70,\n\t10411: 0xBE71,\n\t10412: 0xBE73,\n\t10413: 0xBE74,\n\t10414: 0xBE75,\n\t10415: 0xBE7B,\n\t10416: 0xBE7C,\n\t10417: 0xBE7D,\n\t10418: 0xBE80,\n\t10419: 0xBE84,\n\t10420: 0xBE8C,\n\t10421: 0xBE8D,\n\t10422: 0xBE8F,\n\t10423: 0xBE90,\n\t10424: 0xBE91,\n\t10425: 0xBE98,\n\t10426: 0xBE99,\n\t10427: 0xBEA8,\n\t10428: 0xBED0,\n\t10429: 0xBED1,\n\t10430: 0xBED4,\n\t10431: 0xBED7,\n\t10432: 0xBED8,\n\t10433: 0xBEE0,\n\t10434: 0xBEE3,\n\t10435: 0xBEE4,\n\t10436: 0xBEE5,\n\t10437: 0xBEEC,\n\t10438: 0xBF01,\n\t10439: 0xBF08,\n\t10440: 0xBF09,\n\t10441: 0xBF18,\n\t10442: 0xBF19,\n\t10443: 0xBF1B,\n\t10444: 0xBF1C,\n\t10445: 0xBF1D,\n\t10446: 0xBF40,\n\t10447: 0xBF41,\n\t10448: 0xBF44,\n\t10449: 0xBF48,\n\t10450: 0xBF50,\n\t10451: 0xBF51,\n\t10452: 0xBF55,\n\t10453: 0xBF94,\n\t10454: 0xBFB0,\n\t10455: 0xBFC5,\n\t10456: 0xBFCC,\n\t10457: 0xBFCD,\n\t10458: 0xBFD0,\n\t10459: 0xBFD4,\n\t10460: 0xBFDC,\n\t10461: 0xBFDF,\n\t10462: 0xBFE1,\n\t10463: 0xC03C,\n\t10464: 0xC051,\n\t10465: 0xC058,\n\t10466: 0xC05C,\n\t10467: 0xC060,\n\t10468: 0xC068,\n\t10469: 0xC069,\n\t10470: 0xC090,\n\t10471: 0xC091,\n\t10472: 0xC094,\n\t10473: 0xC098,\n\t10474: 0xC0A0,\n\t10475: 0xC0A1,\n\t10476: 0xC0A3,\n\t10477: 0xC0A5,\n\t10478: 0xC0AC,\n\t10479: 0xC0AD,\n\t10480: 0xC0AF,\n\t10481: 0xC0B0,\n\t10482: 0xC0B3,\n\t10483: 0xC0B4,\n\t10484: 0xC0B5,\n\t10485: 0xC0B6,\n\t10486: 0xC0BC,\n\t10487: 0xC0BD,\n\t10488: 0xC0BF,\n\t10489: 0xC0C0,\n\t10490: 0xC0C1,\n\t10491: 0xC0C5,\n\t10492: 0xC0C8,\n\t10493: 0xC0C9,\n\t10494: 0xC0CC,\n\t10495: 0xC0D0,\n\t10496: 0xC0D8,\n\t10497: 0xC0D9,\n\t10498: 0xC0DB,\n\t10499: 0xC0DC,\n\t10500: 0xC0DD,\n\t10501: 0xC0E4,\n\t10502: 0xD36A,\n\t10503: 0xD36B,\n\t10504: 0xD36C,\n\t10505: 0xD36D,\n\t10506: 0xD36E,\n\t10507: 0xD36F,\n\t10508: 0xD370,\n\t10509: 0xD371,\n\t10510: 0xD372,\n\t10511: 0xD373,\n\t10512: 0xD374,\n\t10513: 0xD375,\n\t10514: 0xD376,\n\t10515: 0xD377,\n\t10516: 0xD378,\n\t10517: 0xD379,\n\t10518: 0xD37A,\n\t10519: 0xD37B,\n\t10520: 0xD37E,\n\t10521: 0xD37F,\n\t10522: 0xD381,\n\t10523: 0xD382,\n\t10524: 0xD383,\n\t10525: 0xD385,\n\t10526: 0xD386,\n\t10527: 0xD387,\n\t10528: 0xD388,\n\t10529: 0xD389,\n\t10530: 0xD38A,\n\t10531: 0xD38B,\n\t10532: 0xD38E,\n\t10533: 0xD392,\n\t10534: 0xD393,\n\t10535: 0xD394,\n\t10536: 0xD395,\n\t10537: 0xD396,\n\t10538: 0xD397,\n\t10539: 0xD39A,\n\t10540: 0xD39B,\n\t10541: 0xD39D,\n\t10542: 0xD39E,\n\t10543: 0xD39F,\n\t10544: 0xD3A1,\n\t10545: 0xD3A2,\n\t10546: 0xD3A3,\n\t10547: 0xD3A4,\n\t10548: 0xD3A5,\n\t10549: 0xD3A6,\n\t10550: 0xD3A7,\n\t10551: 0xD3AA,\n\t10552: 0xD3AC,\n\t10553: 0xD3AE,\n\t10554: 0xD3AF,\n\t10555: 0xD3B0,\n\t10556: 0xD3B1,\n\t10557: 0xD3B2,\n\t10558: 0xD3B3,\n\t10559: 0xD3B5,\n\t10560: 0xD3B6,\n\t10561: 0xD3B7,\n\t10562: 0xD3B9,\n\t10563: 0xD3BA,\n\t10564: 0xD3BB,\n\t10565: 0xD3BD,\n\t10566: 0xD3BE,\n\t10567: 0xD3BF,\n\t10568: 0xD3C0,\n\t10569: 0xD3C1,\n\t10570: 0xD3C2,\n\t10571: 0xD3C3,\n\t10572: 0xD3C6,\n\t10573: 0xD3C7,\n\t10574: 0xD3CA,\n\t10575: 0xD3CB,\n\t10576: 0xD3CC,\n\t10577: 0xD3CD,\n\t10578: 0xD3CE,\n\t10579: 0xD3CF,\n\t10580: 0xD3D1,\n\t10581: 0xD3D2,\n\t10582: 0xD3D3,\n\t10583: 0xD3D4,\n\t10584: 0xD3D5,\n\t10585: 0xD3D6,\n\t10586: 0xC0E5,\n\t10587: 0xC0E8,\n\t10588: 0xC0EC,\n\t10589: 0xC0F4,\n\t10590: 0xC0F5,\n\t10591: 0xC0F7,\n\t10592: 0xC0F9,\n\t10593: 0xC100,\n\t10594: 0xC104,\n\t10595: 0xC108,\n\t10596: 0xC110,\n\t10597: 0xC115,\n\t10598: 0xC11C,\n\t10599: 0xC11D,\n\t10600: 0xC11E,\n\t10601: 0xC11F,\n\t10602: 0xC120,\n\t10603: 0xC123,\n\t10604: 0xC124,\n\t10605: 0xC126,\n\t10606: 0xC127,\n\t10607: 0xC12C,\n\t10608: 0xC12D,\n\t10609: 0xC12F,\n\t10610: 0xC130,\n\t10611: 0xC131,\n\t10612: 0xC136,\n\t10613: 0xC138,\n\t10614: 0xC139,\n\t10615: 0xC13C,\n\t10616: 0xC140,\n\t10617: 0xC148,\n\t10618: 0xC149,\n\t10619: 0xC14B,\n\t10620: 0xC14C,\n\t10621: 0xC14D,\n\t10622: 0xC154,\n\t10623: 0xC155,\n\t10624: 0xC158,\n\t10625: 0xC15C,\n\t10626: 0xC164,\n\t10627: 0xC165,\n\t10628: 0xC167,\n\t10629: 0xC168,\n\t10630: 0xC169,\n\t10631: 0xC170,\n\t10632: 0xC174,\n\t10633: 0xC178,\n\t10634: 0xC185,\n\t10635: 0xC18C,\n\t10636: 0xC18D,\n\t10637: 0xC18E,\n\t10638: 0xC190,\n\t10639: 0xC194,\n\t10640: 0xC196,\n\t10641: 0xC19C,\n\t10642: 0xC19D,\n\t10643: 0xC19F,\n\t10644: 0xC1A1,\n\t10645: 0xC1A5,\n\t10646: 0xC1A8,\n\t10647: 0xC1A9,\n\t10648: 0xC1AC,\n\t10649: 0xC1B0,\n\t10650: 0xC1BD,\n\t10651: 0xC1C4,\n\t10652: 0xC1C8,\n\t10653: 0xC1CC,\n\t10654: 0xC1D4,\n\t10655: 0xC1D7,\n\t10656: 0xC1D8,\n\t10657: 0xC1E0,\n\t10658: 0xC1E4,\n\t10659: 0xC1E8,\n\t10660: 0xC1F0,\n\t10661: 0xC1F1,\n\t10662: 0xC1F3,\n\t10663: 0xC1FC,\n\t10664: 0xC1FD,\n\t10665: 0xC200,\n\t10666: 0xC204,\n\t10667: 0xC20C,\n\t10668: 0xC20D,\n\t10669: 0xC20F,\n\t10670: 0xC211,\n\t10671: 0xC218,\n\t10672: 0xC219,\n\t10673: 0xC21C,\n\t10674: 0xC21F,\n\t10675: 0xC220,\n\t10676: 0xC228,\n\t10677: 0xC229,\n\t10678: 0xC22B,\n\t10679: 0xC22D,\n\t10680: 0xD3D7,\n\t10681: 0xD3D9,\n\t10682: 0xD3DA,\n\t10683: 0xD3DB,\n\t10684: 0xD3DC,\n\t10685: 0xD3DD,\n\t10686: 0xD3DE,\n\t10687: 0xD3DF,\n\t10688: 0xD3E0,\n\t10689: 0xD3E2,\n\t10690: 0xD3E4,\n\t10691: 0xD3E5,\n\t10692: 0xD3E6,\n\t10693: 0xD3E7,\n\t10694: 0xD3E8,\n\t10695: 0xD3E9,\n\t10696: 0xD3EA,\n\t10697: 0xD3EB,\n\t10698: 0xD3EE,\n\t10699: 0xD3EF,\n\t10700: 0xD3F1,\n\t10701: 0xD3F2,\n\t10702: 0xD3F3,\n\t10703: 0xD3F5,\n\t10704: 0xD3F6,\n\t10705: 0xD3F7,\n\t10706: 0xD3F8,\n\t10707: 0xD3F9,\n\t10708: 0xD3FA,\n\t10709: 0xD3FB,\n\t10710: 0xD3FE,\n\t10711: 0xD400,\n\t10712: 0xD402,\n\t10713: 0xD403,\n\t10714: 0xD404,\n\t10715: 0xD405,\n\t10716: 0xD406,\n\t10717: 0xD407,\n\t10718: 0xD409,\n\t10719: 0xD40A,\n\t10720: 0xD40B,\n\t10721: 0xD40C,\n\t10722: 0xD40D,\n\t10723: 0xD40E,\n\t10724: 0xD40F,\n\t10725: 0xD410,\n\t10726: 0xD411,\n\t10727: 0xD412,\n\t10728: 0xD413,\n\t10729: 0xD414,\n\t10730: 0xD415,\n\t10731: 0xD416,\n\t10732: 0xD417,\n\t10733: 0xD418,\n\t10734: 0xD419,\n\t10735: 0xD41A,\n\t10736: 0xD41B,\n\t10737: 0xD41C,\n\t10738: 0xD41E,\n\t10739: 0xD41F,\n\t10740: 0xD420,\n\t10741: 0xD421,\n\t10742: 0xD422,\n\t10743: 0xD423,\n\t10744: 0xD424,\n\t10745: 0xD425,\n\t10746: 0xD426,\n\t10747: 0xD427,\n\t10748: 0xD428,\n\t10749: 0xD429,\n\t10750: 0xD42A,\n\t10751: 0xD42B,\n\t10752: 0xD42C,\n\t10753: 0xD42D,\n\t10754: 0xD42E,\n\t10755: 0xD42F,\n\t10756: 0xD430,\n\t10757: 0xD431,\n\t10758: 0xD432,\n\t10759: 0xD433,\n\t10760: 0xD434,\n\t10761: 0xD435,\n\t10762: 0xD436,\n\t10763: 0xD437,\n\t10764: 0xC22F,\n\t10765: 0xC231,\n\t10766: 0xC232,\n\t10767: 0xC234,\n\t10768: 0xC248,\n\t10769: 0xC250,\n\t10770: 0xC251,\n\t10771: 0xC254,\n\t10772: 0xC258,\n\t10773: 0xC260,\n\t10774: 0xC265,\n\t10775: 0xC26C,\n\t10776: 0xC26D,\n\t10777: 0xC270,\n\t10778: 0xC274,\n\t10779: 0xC27C,\n\t10780: 0xC27D,\n\t10781: 0xC27F,\n\t10782: 0xC281,\n\t10783: 0xC288,\n\t10784: 0xC289,\n\t10785: 0xC290,\n\t10786: 0xC298,\n\t10787: 0xC29B,\n\t10788: 0xC29D,\n\t10789: 0xC2A4,\n\t10790: 0xC2A5,\n\t10791: 0xC2A8,\n\t10792: 0xC2AC,\n\t10793: 0xC2AD,\n\t10794: 0xC2B4,\n\t10795: 0xC2B5,\n\t10796: 0xC2B7,\n\t10797: 0xC2B9,\n\t10798: 0xC2DC,\n\t10799: 0xC2DD,\n\t10800: 0xC2E0,\n\t10801: 0xC2E3,\n\t10802: 0xC2E4,\n\t10803: 0xC2EB,\n\t10804: 0xC2EC,\n\t10805: 0xC2ED,\n\t10806: 0xC2EF,\n\t10807: 0xC2F1,\n\t10808: 0xC2F6,\n\t10809: 0xC2F8,\n\t10810: 0xC2F9,\n\t10811: 0xC2FB,\n\t10812: 0xC2FC,\n\t10813: 0xC300,\n\t10814: 0xC308,\n\t10815: 0xC309,\n\t10816: 0xC30C,\n\t10817: 0xC30D,\n\t10818: 0xC313,\n\t10819: 0xC314,\n\t10820: 0xC315,\n\t10821: 0xC318,\n\t10822: 0xC31C,\n\t10823: 0xC324,\n\t10824: 0xC325,\n\t10825: 0xC328,\n\t10826: 0xC329,\n\t10827: 0xC345,\n\t10828: 0xC368,\n\t10829: 0xC369,\n\t10830: 0xC36C,\n\t10831: 0xC370,\n\t10832: 0xC372,\n\t10833: 0xC378,\n\t10834: 0xC379,\n\t10835: 0xC37C,\n\t10836: 0xC37D,\n\t10837: 0xC384,\n\t10838: 0xC388,\n\t10839: 0xC38C,\n\t10840: 0xC3C0,\n\t10841: 0xC3D8,\n\t10842: 0xC3D9,\n\t10843: 0xC3DC,\n\t10844: 0xC3DF,\n\t10845: 0xC3E0,\n\t10846: 0xC3E2,\n\t10847: 0xC3E8,\n\t10848: 0xC3E9,\n\t10849: 0xC3ED,\n\t10850: 0xC3F4,\n\t10851: 0xC3F5,\n\t10852: 0xC3F8,\n\t10853: 0xC408,\n\t10854: 0xC410,\n\t10855: 0xC424,\n\t10856: 0xC42C,\n\t10857: 0xC430,\n\t10858: 0xD438,\n\t10859: 0xD439,\n\t10860: 0xD43A,\n\t10861: 0xD43B,\n\t10862: 0xD43C,\n\t10863: 0xD43D,\n\t10864: 0xD43E,\n\t10865: 0xD43F,\n\t10866: 0xD441,\n\t10867: 0xD442,\n\t10868: 0xD443,\n\t10869: 0xD445,\n\t10870: 0xD446,\n\t10871: 0xD447,\n\t10872: 0xD448,\n\t10873: 0xD449,\n\t10874: 0xD44A,\n\t10875: 0xD44B,\n\t10876: 0xD44C,\n\t10877: 0xD44D,\n\t10878: 0xD44E,\n\t10879: 0xD44F,\n\t10880: 0xD450,\n\t10881: 0xD451,\n\t10882: 0xD452,\n\t10883: 0xD453,\n\t10884: 0xD454,\n\t10885: 0xD455,\n\t10886: 0xD456,\n\t10887: 0xD457,\n\t10888: 0xD458,\n\t10889: 0xD459,\n\t10890: 0xD45A,\n\t10891: 0xD45B,\n\t10892: 0xD45D,\n\t10893: 0xD45E,\n\t10894: 0xD45F,\n\t10895: 0xD461,\n\t10896: 0xD462,\n\t10897: 0xD463,\n\t10898: 0xD465,\n\t10899: 0xD466,\n\t10900: 0xD467,\n\t10901: 0xD468,\n\t10902: 0xD469,\n\t10903: 0xD46A,\n\t10904: 0xD46B,\n\t10905: 0xD46C,\n\t10906: 0xD46E,\n\t10907: 0xD470,\n\t10908: 0xD471,\n\t10909: 0xD472,\n\t10910: 0xD473,\n\t10911: 0xD474,\n\t10912: 0xD475,\n\t10913: 0xD476,\n\t10914: 0xD477,\n\t10915: 0xD47A,\n\t10916: 0xD47B,\n\t10917: 0xD47D,\n\t10918: 0xD47E,\n\t10919: 0xD481,\n\t10920: 0xD483,\n\t10921: 0xD484,\n\t10922: 0xD485,\n\t10923: 0xD486,\n\t10924: 0xD487,\n\t10925: 0xD48A,\n\t10926: 0xD48C,\n\t10927: 0xD48E,\n\t10928: 0xD48F,\n\t10929: 0xD490,\n\t10930: 0xD491,\n\t10931: 0xD492,\n\t10932: 0xD493,\n\t10933: 0xD495,\n\t10934: 0xD496,\n\t10935: 0xD497,\n\t10936: 0xD498,\n\t10937: 0xD499,\n\t10938: 0xD49A,\n\t10939: 0xD49B,\n\t10940: 0xD49C,\n\t10941: 0xD49D,\n\t10942: 0xC434,\n\t10943: 0xC43C,\n\t10944: 0xC43D,\n\t10945: 0xC448,\n\t10946: 0xC464,\n\t10947: 0xC465,\n\t10948: 0xC468,\n\t10949: 0xC46C,\n\t10950: 0xC474,\n\t10951: 0xC475,\n\t10952: 0xC479,\n\t10953: 0xC480,\n\t10954: 0xC494,\n\t10955: 0xC49C,\n\t10956: 0xC4B8,\n\t10957: 0xC4BC,\n\t10958: 0xC4E9,\n\t10959: 0xC4F0,\n\t10960: 0xC4F1,\n\t10961: 0xC4F4,\n\t10962: 0xC4F8,\n\t10963: 0xC4FA,\n\t10964: 0xC4FF,\n\t10965: 0xC500,\n\t10966: 0xC501,\n\t10967: 0xC50C,\n\t10968: 0xC510,\n\t10969: 0xC514,\n\t10970: 0xC51C,\n\t10971: 0xC528,\n\t10972: 0xC529,\n\t10973: 0xC52C,\n\t10974: 0xC530,\n\t10975: 0xC538,\n\t10976: 0xC539,\n\t10977: 0xC53B,\n\t10978: 0xC53D,\n\t10979: 0xC544,\n\t10980: 0xC545,\n\t10981: 0xC548,\n\t10982: 0xC549,\n\t10983: 0xC54A,\n\t10984: 0xC54C,\n\t10985: 0xC54D,\n\t10986: 0xC54E,\n\t10987: 0xC553,\n\t10988: 0xC554,\n\t10989: 0xC555,\n\t10990: 0xC557,\n\t10991: 0xC558,\n\t10992: 0xC559,\n\t10993: 0xC55D,\n\t10994: 0xC55E,\n\t10995: 0xC560,\n\t10996: 0xC561,\n\t10997: 0xC564,\n\t10998: 0xC568,\n\t10999: 0xC570,\n\t11000: 0xC571,\n\t11001: 0xC573,\n\t11002: 0xC574,\n\t11003: 0xC575,\n\t11004: 0xC57C,\n\t11005: 0xC57D,\n\t11006: 0xC580,\n\t11007: 0xC584,\n\t11008: 0xC587,\n\t11009: 0xC58C,\n\t11010: 0xC58D,\n\t11011: 0xC58F,\n\t11012: 0xC591,\n\t11013: 0xC595,\n\t11014: 0xC597,\n\t11015: 0xC598,\n\t11016: 0xC59C,\n\t11017: 0xC5A0,\n\t11018: 0xC5A9,\n\t11019: 0xC5B4,\n\t11020: 0xC5B5,\n\t11021: 0xC5B8,\n\t11022: 0xC5B9,\n\t11023: 0xC5BB,\n\t11024: 0xC5BC,\n\t11025: 0xC5BD,\n\t11026: 0xC5BE,\n\t11027: 0xC5C4,\n\t11028: 0xC5C5,\n\t11029: 0xC5C6,\n\t11030: 0xC5C7,\n\t11031: 0xC5C8,\n\t11032: 0xC5C9,\n\t11033: 0xC5CA,\n\t11034: 0xC5CC,\n\t11035: 0xC5CE,\n\t11036: 0xD49E,\n\t11037: 0xD49F,\n\t11038: 0xD4A0,\n\t11039: 0xD4A1,\n\t11040: 0xD4A2,\n\t11041: 0xD4A3,\n\t11042: 0xD4A4,\n\t11043: 0xD4A5,\n\t11044: 0xD4A6,\n\t11045: 0xD4A7,\n\t11046: 0xD4A8,\n\t11047: 0xD4AA,\n\t11048: 0xD4AB,\n\t11049: 0xD4AC,\n\t11050: 0xD4AD,\n\t11051: 0xD4AE,\n\t11052: 0xD4AF,\n\t11053: 0xD4B0,\n\t11054: 0xD4B1,\n\t11055: 0xD4B2,\n\t11056: 0xD4B3,\n\t11057: 0xD4B4,\n\t11058: 0xD4B5,\n\t11059: 0xD4B6,\n\t11060: 0xD4B7,\n\t11061: 0xD4B8,\n\t11062: 0xD4B9,\n\t11063: 0xD4BA,\n\t11064: 0xD4BB,\n\t11065: 0xD4BC,\n\t11066: 0xD4BD,\n\t11067: 0xD4BE,\n\t11068: 0xD4BF,\n\t11069: 0xD4C0,\n\t11070: 0xD4C1,\n\t11071: 0xD4C2,\n\t11072: 0xD4C3,\n\t11073: 0xD4C4,\n\t11074: 0xD4C5,\n\t11075: 0xD4C6,\n\t11076: 0xD4C7,\n\t11077: 0xD4C8,\n\t11078: 0xD4C9,\n\t11079: 0xD4CA,\n\t11080: 0xD4CB,\n\t11081: 0xD4CD,\n\t11082: 0xD4CE,\n\t11083: 0xD4CF,\n\t11084: 0xD4D1,\n\t11085: 0xD4D2,\n\t11086: 0xD4D3,\n\t11087: 0xD4D5,\n\t11088: 0xD4D6,\n\t11089: 0xD4D7,\n\t11090: 0xD4D8,\n\t11091: 0xD4D9,\n\t11092: 0xD4DA,\n\t11093: 0xD4DB,\n\t11094: 0xD4DD,\n\t11095: 0xD4DE,\n\t11096: 0xD4E0,\n\t11097: 0xD4E1,\n\t11098: 0xD4E2,\n\t11099: 0xD4E3,\n\t11100: 0xD4E4,\n\t11101: 0xD4E5,\n\t11102: 0xD4E6,\n\t11103: 0xD4E7,\n\t11104: 0xD4E9,\n\t11105: 0xD4EA,\n\t11106: 0xD4EB,\n\t11107: 0xD4ED,\n\t11108: 0xD4EE,\n\t11109: 0xD4EF,\n\t11110: 0xD4F1,\n\t11111: 0xD4F2,\n\t11112: 0xD4F3,\n\t11113: 0xD4F4,\n\t11114: 0xD4F5,\n\t11115: 0xD4F6,\n\t11116: 0xD4F7,\n\t11117: 0xD4F9,\n\t11118: 0xD4FA,\n\t11119: 0xD4FC,\n\t11120: 0xC5D0,\n\t11121: 0xC5D1,\n\t11122: 0xC5D4,\n\t11123: 0xC5D8,\n\t11124: 0xC5E0,\n\t11125: 0xC5E1,\n\t11126: 0xC5E3,\n\t11127: 0xC5E5,\n\t11128: 0xC5EC,\n\t11129: 0xC5ED,\n\t11130: 0xC5EE,\n\t11131: 0xC5F0,\n\t11132: 0xC5F4,\n\t11133: 0xC5F6,\n\t11134: 0xC5F7,\n\t11135: 0xC5FC,\n\t11136: 0xC5FD,\n\t11137: 0xC5FE,\n\t11138: 0xC5FF,\n\t11139: 0xC600,\n\t11140: 0xC601,\n\t11141: 0xC605,\n\t11142: 0xC606,\n\t11143: 0xC607,\n\t11144: 0xC608,\n\t11145: 0xC60C,\n\t11146: 0xC610,\n\t11147: 0xC618,\n\t11148: 0xC619,\n\t11149: 0xC61B,\n\t11150: 0xC61C,\n\t11151: 0xC624,\n\t11152: 0xC625,\n\t11153: 0xC628,\n\t11154: 0xC62C,\n\t11155: 0xC62D,\n\t11156: 0xC62E,\n\t11157: 0xC630,\n\t11158: 0xC633,\n\t11159: 0xC634,\n\t11160: 0xC635,\n\t11161: 0xC637,\n\t11162: 0xC639,\n\t11163: 0xC63B,\n\t11164: 0xC640,\n\t11165: 0xC641,\n\t11166: 0xC644,\n\t11167: 0xC648,\n\t11168: 0xC650,\n\t11169: 0xC651,\n\t11170: 0xC653,\n\t11171: 0xC654,\n\t11172: 0xC655,\n\t11173: 0xC65C,\n\t11174: 0xC65D,\n\t11175: 0xC660,\n\t11176: 0xC66C,\n\t11177: 0xC66F,\n\t11178: 0xC671,\n\t11179: 0xC678,\n\t11180: 0xC679,\n\t11181: 0xC67C,\n\t11182: 0xC680,\n\t11183: 0xC688,\n\t11184: 0xC689,\n\t11185: 0xC68B,\n\t11186: 0xC68D,\n\t11187: 0xC694,\n\t11188: 0xC695,\n\t11189: 0xC698,\n\t11190: 0xC69C,\n\t11191: 0xC6A4,\n\t11192: 0xC6A5,\n\t11193: 0xC6A7,\n\t11194: 0xC6A9,\n\t11195: 0xC6B0,\n\t11196: 0xC6B1,\n\t11197: 0xC6B4,\n\t11198: 0xC6B8,\n\t11199: 0xC6B9,\n\t11200: 0xC6BA,\n\t11201: 0xC6C0,\n\t11202: 0xC6C1,\n\t11203: 0xC6C3,\n\t11204: 0xC6C5,\n\t11205: 0xC6CC,\n\t11206: 0xC6CD,\n\t11207: 0xC6D0,\n\t11208: 0xC6D4,\n\t11209: 0xC6DC,\n\t11210: 0xC6DD,\n\t11211: 0xC6E0,\n\t11212: 0xC6E1,\n\t11213: 0xC6E8,\n\t11214: 0xD4FE,\n\t11215: 0xD4FF,\n\t11216: 0xD500,\n\t11217: 0xD501,\n\t11218: 0xD502,\n\t11219: 0xD503,\n\t11220: 0xD505,\n\t11221: 0xD506,\n\t11222: 0xD507,\n\t11223: 0xD509,\n\t11224: 0xD50A,\n\t11225: 0xD50B,\n\t11226: 0xD50D,\n\t11227: 0xD50E,\n\t11228: 0xD50F,\n\t11229: 0xD510,\n\t11230: 0xD511,\n\t11231: 0xD512,\n\t11232: 0xD513,\n\t11233: 0xD516,\n\t11234: 0xD518,\n\t11235: 0xD519,\n\t11236: 0xD51A,\n\t11237: 0xD51B,\n\t11238: 0xD51C,\n\t11239: 0xD51D,\n\t11240: 0xD51E,\n\t11241: 0xD51F,\n\t11242: 0xD520,\n\t11243: 0xD521,\n\t11244: 0xD522,\n\t11245: 0xD523,\n\t11246: 0xD524,\n\t11247: 0xD525,\n\t11248: 0xD526,\n\t11249: 0xD527,\n\t11250: 0xD528,\n\t11251: 0xD529,\n\t11252: 0xD52A,\n\t11253: 0xD52B,\n\t11254: 0xD52C,\n\t11255: 0xD52D,\n\t11256: 0xD52E,\n\t11257: 0xD52F,\n\t11258: 0xD530,\n\t11259: 0xD531,\n\t11260: 0xD532,\n\t11261: 0xD533,\n\t11262: 0xD534,\n\t11263: 0xD535,\n\t11264: 0xD536,\n\t11265: 0xD537,\n\t11266: 0xD538,\n\t11267: 0xD539,\n\t11268: 0xD53A,\n\t11269: 0xD53B,\n\t11270: 0xD53E,\n\t11271: 0xD53F,\n\t11272: 0xD541,\n\t11273: 0xD542,\n\t11274: 0xD543,\n\t11275: 0xD545,\n\t11276: 0xD546,\n\t11277: 0xD547,\n\t11278: 0xD548,\n\t11279: 0xD549,\n\t11280: 0xD54A,\n\t11281: 0xD54B,\n\t11282: 0xD54E,\n\t11283: 0xD550,\n\t11284: 0xD552,\n\t11285: 0xD553,\n\t11286: 0xD554,\n\t11287: 0xD555,\n\t11288: 0xD556,\n\t11289: 0xD557,\n\t11290: 0xD55A,\n\t11291: 0xD55B,\n\t11292: 0xD55D,\n\t11293: 0xD55E,\n\t11294: 0xD55F,\n\t11295: 0xD561,\n\t11296: 0xD562,\n\t11297: 0xD563,\n\t11298: 0xC6E9,\n\t11299: 0xC6EC,\n\t11300: 0xC6F0,\n\t11301: 0xC6F8,\n\t11302: 0xC6F9,\n\t11303: 0xC6FD,\n\t11304: 0xC704,\n\t11305: 0xC705,\n\t11306: 0xC708,\n\t11307: 0xC70C,\n\t11308: 0xC714,\n\t11309: 0xC715,\n\t11310: 0xC717,\n\t11311: 0xC719,\n\t11312: 0xC720,\n\t11313: 0xC721,\n\t11314: 0xC724,\n\t11315: 0xC728,\n\t11316: 0xC730,\n\t11317: 0xC731,\n\t11318: 0xC733,\n\t11319: 0xC735,\n\t11320: 0xC737,\n\t11321: 0xC73C,\n\t11322: 0xC73D,\n\t11323: 0xC740,\n\t11324: 0xC744,\n\t11325: 0xC74A,\n\t11326: 0xC74C,\n\t11327: 0xC74D,\n\t11328: 0xC74F,\n\t11329: 0xC751,\n\t11330: 0xC752,\n\t11331: 0xC753,\n\t11332: 0xC754,\n\t11333: 0xC755,\n\t11334: 0xC756,\n\t11335: 0xC757,\n\t11336: 0xC758,\n\t11337: 0xC75C,\n\t11338: 0xC760,\n\t11339: 0xC768,\n\t11340: 0xC76B,\n\t11341: 0xC774,\n\t11342: 0xC775,\n\t11343: 0xC778,\n\t11344: 0xC77C,\n\t11345: 0xC77D,\n\t11346: 0xC77E,\n\t11347: 0xC783,\n\t11348: 0xC784,\n\t11349: 0xC785,\n\t11350: 0xC787,\n\t11351: 0xC788,\n\t11352: 0xC789,\n\t11353: 0xC78A,\n\t11354: 0xC78E,\n\t11355: 0xC790,\n\t11356: 0xC791,\n\t11357: 0xC794,\n\t11358: 0xC796,\n\t11359: 0xC797,\n\t11360: 0xC798,\n\t11361: 0xC79A,\n\t11362: 0xC7A0,\n\t11363: 0xC7A1,\n\t11364: 0xC7A3,\n\t11365: 0xC7A4,\n\t11366: 0xC7A5,\n\t11367: 0xC7A6,\n\t11368: 0xC7AC,\n\t11369: 0xC7AD,\n\t11370: 0xC7B0,\n\t11371: 0xC7B4,\n\t11372: 0xC7BC,\n\t11373: 0xC7BD,\n\t11374: 0xC7BF,\n\t11375: 0xC7C0,\n\t11376: 0xC7C1,\n\t11377: 0xC7C8,\n\t11378: 0xC7C9,\n\t11379: 0xC7CC,\n\t11380: 0xC7CE,\n\t11381: 0xC7D0,\n\t11382: 0xC7D8,\n\t11383: 0xC7DD,\n\t11384: 0xC7E4,\n\t11385: 0xC7E8,\n\t11386: 0xC7EC,\n\t11387: 0xC800,\n\t11388: 0xC801,\n\t11389: 0xC804,\n\t11390: 0xC808,\n\t11391: 0xC80A,\n\t11392: 0xD564,\n\t11393: 0xD566,\n\t11394: 0xD567,\n\t11395: 0xD56A,\n\t11396: 0xD56C,\n\t11397: 0xD56E,\n\t11398: 0xD56F,\n\t11399: 0xD570,\n\t11400: 0xD571,\n\t11401: 0xD572,\n\t11402: 0xD573,\n\t11403: 0xD576,\n\t11404: 0xD577,\n\t11405: 0xD579,\n\t11406: 0xD57A,\n\t11407: 0xD57B,\n\t11408: 0xD57D,\n\t11409: 0xD57E,\n\t11410: 0xD57F,\n\t11411: 0xD580,\n\t11412: 0xD581,\n\t11413: 0xD582,\n\t11414: 0xD583,\n\t11415: 0xD586,\n\t11416: 0xD58A,\n\t11417: 0xD58B,\n\t11418: 0xD58C,\n\t11419: 0xD58D,\n\t11420: 0xD58E,\n\t11421: 0xD58F,\n\t11422: 0xD591,\n\t11423: 0xD592,\n\t11424: 0xD593,\n\t11425: 0xD594,\n\t11426: 0xD595,\n\t11427: 0xD596,\n\t11428: 0xD597,\n\t11429: 0xD598,\n\t11430: 0xD599,\n\t11431: 0xD59A,\n\t11432: 0xD59B,\n\t11433: 0xD59C,\n\t11434: 0xD59D,\n\t11435: 0xD59E,\n\t11436: 0xD59F,\n\t11437: 0xD5A0,\n\t11438: 0xD5A1,\n\t11439: 0xD5A2,\n\t11440: 0xD5A3,\n\t11441: 0xD5A4,\n\t11442: 0xD5A6,\n\t11443: 0xD5A7,\n\t11444: 0xD5A8,\n\t11445: 0xD5A9,\n\t11446: 0xD5AA,\n\t11447: 0xD5AB,\n\t11448: 0xD5AC,\n\t11449: 0xD5AD,\n\t11450: 0xD5AE,\n\t11451: 0xD5AF,\n\t11452: 0xD5B0,\n\t11453: 0xD5B1,\n\t11454: 0xD5B2,\n\t11455: 0xD5B3,\n\t11456: 0xD5B4,\n\t11457: 0xD5B5,\n\t11458: 0xD5B6,\n\t11459: 0xD5B7,\n\t11460: 0xD5B8,\n\t11461: 0xD5B9,\n\t11462: 0xD5BA,\n\t11463: 0xD5BB,\n\t11464: 0xD5BC,\n\t11465: 0xD5BD,\n\t11466: 0xD5BE,\n\t11467: 0xD5BF,\n\t11468: 0xD5C0,\n\t11469: 0xD5C1,\n\t11470: 0xD5C2,\n\t11471: 0xD5C3,\n\t11472: 0xD5C4,\n\t11473: 0xD5C5,\n\t11474: 0xD5C6,\n\t11475: 0xD5C7,\n\t11476: 0xC810,\n\t11477: 0xC811,\n\t11478: 0xC813,\n\t11479: 0xC815,\n\t11480: 0xC816,\n\t11481: 0xC81C,\n\t11482: 0xC81D,\n\t11483: 0xC820,\n\t11484: 0xC824,\n\t11485: 0xC82C,\n\t11486: 0xC82D,\n\t11487: 0xC82F,\n\t11488: 0xC831,\n\t11489: 0xC838,\n\t11490: 0xC83C,\n\t11491: 0xC840,\n\t11492: 0xC848,\n\t11493: 0xC849,\n\t11494: 0xC84C,\n\t11495: 0xC84D,\n\t11496: 0xC854,\n\t11497: 0xC870,\n\t11498: 0xC871,\n\t11499: 0xC874,\n\t11500: 0xC878,\n\t11501: 0xC87A,\n\t11502: 0xC880,\n\t11503: 0xC881,\n\t11504: 0xC883,\n\t11505: 0xC885,\n\t11506: 0xC886,\n\t11507: 0xC887,\n\t11508: 0xC88B,\n\t11509: 0xC88C,\n\t11510: 0xC88D,\n\t11511: 0xC894,\n\t11512: 0xC89D,\n\t11513: 0xC89F,\n\t11514: 0xC8A1,\n\t11515: 0xC8A8,\n\t11516: 0xC8BC,\n\t11517: 0xC8BD,\n\t11518: 0xC8C4,\n\t11519: 0xC8C8,\n\t11520: 0xC8CC,\n\t11521: 0xC8D4,\n\t11522: 0xC8D5,\n\t11523: 0xC8D7,\n\t11524: 0xC8D9,\n\t11525: 0xC8E0,\n\t11526: 0xC8E1,\n\t11527: 0xC8E4,\n\t11528: 0xC8F5,\n\t11529: 0xC8FC,\n\t11530: 0xC8FD,\n\t11531: 0xC900,\n\t11532: 0xC904,\n\t11533: 0xC905,\n\t11534: 0xC906,\n\t11535: 0xC90C,\n\t11536: 0xC90D,\n\t11537: 0xC90F,\n\t11538: 0xC911,\n\t11539: 0xC918,\n\t11540: 0xC92C,\n\t11541: 0xC934,\n\t11542: 0xC950,\n\t11543: 0xC951,\n\t11544: 0xC954,\n\t11545: 0xC958,\n\t11546: 0xC960,\n\t11547: 0xC961,\n\t11548: 0xC963,\n\t11549: 0xC96C,\n\t11550: 0xC970,\n\t11551: 0xC974,\n\t11552: 0xC97C,\n\t11553: 0xC988,\n\t11554: 0xC989,\n\t11555: 0xC98C,\n\t11556: 0xC990,\n\t11557: 0xC998,\n\t11558: 0xC999,\n\t11559: 0xC99B,\n\t11560: 0xC99D,\n\t11561: 0xC9C0,\n\t11562: 0xC9C1,\n\t11563: 0xC9C4,\n\t11564: 0xC9C7,\n\t11565: 0xC9C8,\n\t11566: 0xC9CA,\n\t11567: 0xC9D0,\n\t11568: 0xC9D1,\n\t11569: 0xC9D3,\n\t11570: 0xD5CA,\n\t11571: 0xD5CB,\n\t11572: 0xD5CD,\n\t11573: 0xD5CE,\n\t11574: 0xD5CF,\n\t11575: 0xD5D1,\n\t11576: 0xD5D3,\n\t11577: 0xD5D4,\n\t11578: 0xD5D5,\n\t11579: 0xD5D6,\n\t11580: 0xD5D7,\n\t11581: 0xD5DA,\n\t11582: 0xD5DC,\n\t11583: 0xD5DE,\n\t11584: 0xD5DF,\n\t11585: 0xD5E0,\n\t11586: 0xD5E1,\n\t11587: 0xD5E2,\n\t11588: 0xD5E3,\n\t11589: 0xD5E6,\n\t11590: 0xD5E7,\n\t11591: 0xD5E9,\n\t11592: 0xD5EA,\n\t11593: 0xD5EB,\n\t11594: 0xD5ED,\n\t11595: 0xD5EE,\n\t11596: 0xD5EF,\n\t11597: 0xD5F0,\n\t11598: 0xD5F1,\n\t11599: 0xD5F2,\n\t11600: 0xD5F3,\n\t11601: 0xD5F6,\n\t11602: 0xD5F8,\n\t11603: 0xD5FA,\n\t11604: 0xD5FB,\n\t11605: 0xD5FC,\n\t11606: 0xD5FD,\n\t11607: 0xD5FE,\n\t11608: 0xD5FF,\n\t11609: 0xD602,\n\t11610: 0xD603,\n\t11611: 0xD605,\n\t11612: 0xD606,\n\t11613: 0xD607,\n\t11614: 0xD609,\n\t11615: 0xD60A,\n\t11616: 0xD60B,\n\t11617: 0xD60C,\n\t11618: 0xD60D,\n\t11619: 0xD60E,\n\t11620: 0xD60F,\n\t11621: 0xD612,\n\t11622: 0xD616,\n\t11623: 0xD617,\n\t11624: 0xD618,\n\t11625: 0xD619,\n\t11626: 0xD61A,\n\t11627: 0xD61B,\n\t11628: 0xD61D,\n\t11629: 0xD61E,\n\t11630: 0xD61F,\n\t11631: 0xD621,\n\t11632: 0xD622,\n\t11633: 0xD623,\n\t11634: 0xD625,\n\t11635: 0xD626,\n\t11636: 0xD627,\n\t11637: 0xD628,\n\t11638: 0xD629,\n\t11639: 0xD62A,\n\t11640: 0xD62B,\n\t11641: 0xD62C,\n\t11642: 0xD62E,\n\t11643: 0xD62F,\n\t11644: 0xD630,\n\t11645: 0xD631,\n\t11646: 0xD632,\n\t11647: 0xD633,\n\t11648: 0xD634,\n\t11649: 0xD635,\n\t11650: 0xD636,\n\t11651: 0xD637,\n\t11652: 0xD63A,\n\t11653: 0xD63B,\n\t11654: 0xC9D5,\n\t11655: 0xC9D6,\n\t11656: 0xC9D9,\n\t11657: 0xC9DA,\n\t11658: 0xC9DC,\n\t11659: 0xC9DD,\n\t11660: 0xC9E0,\n\t11661: 0xC9E2,\n\t11662: 0xC9E4,\n\t11663: 0xC9E7,\n\t11664: 0xC9EC,\n\t11665: 0xC9ED,\n\t11666: 0xC9EF,\n\t11667: 0xC9F0,\n\t11668: 0xC9F1,\n\t11669: 0xC9F8,\n\t11670: 0xC9F9,\n\t11671: 0xC9FC,\n\t11672: 0xCA00,\n\t11673: 0xCA08,\n\t11674: 0xCA09,\n\t11675: 0xCA0B,\n\t11676: 0xCA0C,\n\t11677: 0xCA0D,\n\t11678: 0xCA14,\n\t11679: 0xCA18,\n\t11680: 0xCA29,\n\t11681: 0xCA4C,\n\t11682: 0xCA4D,\n\t11683: 0xCA50,\n\t11684: 0xCA54,\n\t11685: 0xCA5C,\n\t11686: 0xCA5D,\n\t11687: 0xCA5F,\n\t11688: 0xCA60,\n\t11689: 0xCA61,\n\t11690: 0xCA68,\n\t11691: 0xCA7D,\n\t11692: 0xCA84,\n\t11693: 0xCA98,\n\t11694: 0xCABC,\n\t11695: 0xCABD,\n\t11696: 0xCAC0,\n\t11697: 0xCAC4,\n\t11698: 0xCACC,\n\t11699: 0xCACD,\n\t11700: 0xCACF,\n\t11701: 0xCAD1,\n\t11702: 0xCAD3,\n\t11703: 0xCAD8,\n\t11704: 0xCAD9,\n\t11705: 0xCAE0,\n\t11706: 0xCAEC,\n\t11707: 0xCAF4,\n\t11708: 0xCB08,\n\t11709: 0xCB10,\n\t11710: 0xCB14,\n\t11711: 0xCB18,\n\t11712: 0xCB20,\n\t11713: 0xCB21,\n\t11714: 0xCB41,\n\t11715: 0xCB48,\n\t11716: 0xCB49,\n\t11717: 0xCB4C,\n\t11718: 0xCB50,\n\t11719: 0xCB58,\n\t11720: 0xCB59,\n\t11721: 0xCB5D,\n\t11722: 0xCB64,\n\t11723: 0xCB78,\n\t11724: 0xCB79,\n\t11725: 0xCB9C,\n\t11726: 0xCBB8,\n\t11727: 0xCBD4,\n\t11728: 0xCBE4,\n\t11729: 0xCBE7,\n\t11730: 0xCBE9,\n\t11731: 0xCC0C,\n\t11732: 0xCC0D,\n\t11733: 0xCC10,\n\t11734: 0xCC14,\n\t11735: 0xCC1C,\n\t11736: 0xCC1D,\n\t11737: 0xCC21,\n\t11738: 0xCC22,\n\t11739: 0xCC27,\n\t11740: 0xCC28,\n\t11741: 0xCC29,\n\t11742: 0xCC2C,\n\t11743: 0xCC2E,\n\t11744: 0xCC30,\n\t11745: 0xCC38,\n\t11746: 0xCC39,\n\t11747: 0xCC3B,\n\t11748: 0xD63D,\n\t11749: 0xD63E,\n\t11750: 0xD63F,\n\t11751: 0xD641,\n\t11752: 0xD642,\n\t11753: 0xD643,\n\t11754: 0xD644,\n\t11755: 0xD646,\n\t11756: 0xD647,\n\t11757: 0xD64A,\n\t11758: 0xD64C,\n\t11759: 0xD64E,\n\t11760: 0xD64F,\n\t11761: 0xD650,\n\t11762: 0xD652,\n\t11763: 0xD653,\n\t11764: 0xD656,\n\t11765: 0xD657,\n\t11766: 0xD659,\n\t11767: 0xD65A,\n\t11768: 0xD65B,\n\t11769: 0xD65D,\n\t11770: 0xD65E,\n\t11771: 0xD65F,\n\t11772: 0xD660,\n\t11773: 0xD661,\n\t11774: 0xD662,\n\t11775: 0xD663,\n\t11776: 0xD664,\n\t11777: 0xD665,\n\t11778: 0xD666,\n\t11779: 0xD668,\n\t11780: 0xD66A,\n\t11781: 0xD66B,\n\t11782: 0xD66C,\n\t11783: 0xD66D,\n\t11784: 0xD66E,\n\t11785: 0xD66F,\n\t11786: 0xD672,\n\t11787: 0xD673,\n\t11788: 0xD675,\n\t11789: 0xD676,\n\t11790: 0xD677,\n\t11791: 0xD678,\n\t11792: 0xD679,\n\t11793: 0xD67A,\n\t11794: 0xD67B,\n\t11795: 0xD67C,\n\t11796: 0xD67D,\n\t11797: 0xD67E,\n\t11798: 0xD67F,\n\t11799: 0xD680,\n\t11800: 0xD681,\n\t11801: 0xD682,\n\t11802: 0xD684,\n\t11803: 0xD686,\n\t11804: 0xD687,\n\t11805: 0xD688,\n\t11806: 0xD689,\n\t11807: 0xD68A,\n\t11808: 0xD68B,\n\t11809: 0xD68E,\n\t11810: 0xD68F,\n\t11811: 0xD691,\n\t11812: 0xD692,\n\t11813: 0xD693,\n\t11814: 0xD695,\n\t11815: 0xD696,\n\t11816: 0xD697,\n\t11817: 0xD698,\n\t11818: 0xD699,\n\t11819: 0xD69A,\n\t11820: 0xD69B,\n\t11821: 0xD69C,\n\t11822: 0xD69E,\n\t11823: 0xD6A0,\n\t11824: 0xD6A2,\n\t11825: 0xD6A3,\n\t11826: 0xD6A4,\n\t11827: 0xD6A5,\n\t11828: 0xD6A6,\n\t11829: 0xD6A7,\n\t11830: 0xD6A9,\n\t11831: 0xD6AA,\n\t11832: 0xCC3C,\n\t11833: 0xCC3D,\n\t11834: 0xCC3E,\n\t11835: 0xCC44,\n\t11836: 0xCC45,\n\t11837: 0xCC48,\n\t11838: 0xCC4C,\n\t11839: 0xCC54,\n\t11840: 0xCC55,\n\t11841: 0xCC57,\n\t11842: 0xCC58,\n\t11843: 0xCC59,\n\t11844: 0xCC60,\n\t11845: 0xCC64,\n\t11846: 0xCC66,\n\t11847: 0xCC68,\n\t11848: 0xCC70,\n\t11849: 0xCC75,\n\t11850: 0xCC98,\n\t11851: 0xCC99,\n\t11852: 0xCC9C,\n\t11853: 0xCCA0,\n\t11854: 0xCCA8,\n\t11855: 0xCCA9,\n\t11856: 0xCCAB,\n\t11857: 0xCCAC,\n\t11858: 0xCCAD,\n\t11859: 0xCCB4,\n\t11860: 0xCCB5,\n\t11861: 0xCCB8,\n\t11862: 0xCCBC,\n\t11863: 0xCCC4,\n\t11864: 0xCCC5,\n\t11865: 0xCCC7,\n\t11866: 0xCCC9,\n\t11867: 0xCCD0,\n\t11868: 0xCCD4,\n\t11869: 0xCCE4,\n\t11870: 0xCCEC,\n\t11871: 0xCCF0,\n\t11872: 0xCD01,\n\t11873: 0xCD08,\n\t11874: 0xCD09,\n\t11875: 0xCD0C,\n\t11876: 0xCD10,\n\t11877: 0xCD18,\n\t11878: 0xCD19,\n\t11879: 0xCD1B,\n\t11880: 0xCD1D,\n\t11881: 0xCD24,\n\t11882: 0xCD28,\n\t11883: 0xCD2C,\n\t11884: 0xCD39,\n\t11885: 0xCD5C,\n\t11886: 0xCD60,\n\t11887: 0xCD64,\n\t11888: 0xCD6C,\n\t11889: 0xCD6D,\n\t11890: 0xCD6F,\n\t11891: 0xCD71,\n\t11892: 0xCD78,\n\t11893: 0xCD88,\n\t11894: 0xCD94,\n\t11895: 0xCD95,\n\t11896: 0xCD98,\n\t11897: 0xCD9C,\n\t11898: 0xCDA4,\n\t11899: 0xCDA5,\n\t11900: 0xCDA7,\n\t11901: 0xCDA9,\n\t11902: 0xCDB0,\n\t11903: 0xCDC4,\n\t11904: 0xCDCC,\n\t11905: 0xCDD0,\n\t11906: 0xCDE8,\n\t11907: 0xCDEC,\n\t11908: 0xCDF0,\n\t11909: 0xCDF8,\n\t11910: 0xCDF9,\n\t11911: 0xCDFB,\n\t11912: 0xCDFD,\n\t11913: 0xCE04,\n\t11914: 0xCE08,\n\t11915: 0xCE0C,\n\t11916: 0xCE14,\n\t11917: 0xCE19,\n\t11918: 0xCE20,\n\t11919: 0xCE21,\n\t11920: 0xCE24,\n\t11921: 0xCE28,\n\t11922: 0xCE30,\n\t11923: 0xCE31,\n\t11924: 0xCE33,\n\t11925: 0xCE35,\n\t11926: 0xD6AB,\n\t11927: 0xD6AD,\n\t11928: 0xD6AE,\n\t11929: 0xD6AF,\n\t11930: 0xD6B1,\n\t11931: 0xD6B2,\n\t11932: 0xD6B3,\n\t11933: 0xD6B4,\n\t11934: 0xD6B5,\n\t11935: 0xD6B6,\n\t11936: 0xD6B7,\n\t11937: 0xD6B8,\n\t11938: 0xD6BA,\n\t11939: 0xD6BC,\n\t11940: 0xD6BD,\n\t11941: 0xD6BE,\n\t11942: 0xD6BF,\n\t11943: 0xD6C0,\n\t11944: 0xD6C1,\n\t11945: 0xD6C2,\n\t11946: 0xD6C3,\n\t11947: 0xD6C6,\n\t11948: 0xD6C7,\n\t11949: 0xD6C9,\n\t11950: 0xD6CA,\n\t11951: 0xD6CB,\n\t11952: 0xD6CD,\n\t11953: 0xD6CE,\n\t11954: 0xD6CF,\n\t11955: 0xD6D0,\n\t11956: 0xD6D2,\n\t11957: 0xD6D3,\n\t11958: 0xD6D5,\n\t11959: 0xD6D6,\n\t11960: 0xD6D8,\n\t11961: 0xD6DA,\n\t11962: 0xD6DB,\n\t11963: 0xD6DC,\n\t11964: 0xD6DD,\n\t11965: 0xD6DE,\n\t11966: 0xD6DF,\n\t11967: 0xD6E1,\n\t11968: 0xD6E2,\n\t11969: 0xD6E3,\n\t11970: 0xD6E5,\n\t11971: 0xD6E6,\n\t11972: 0xD6E7,\n\t11973: 0xD6E9,\n\t11974: 0xD6EA,\n\t11975: 0xD6EB,\n\t11976: 0xD6EC,\n\t11977: 0xD6ED,\n\t11978: 0xD6EE,\n\t11979: 0xD6EF,\n\t11980: 0xD6F1,\n\t11981: 0xD6F2,\n\t11982: 0xD6F3,\n\t11983: 0xD6F4,\n\t11984: 0xD6F6,\n\t11985: 0xD6F7,\n\t11986: 0xD6F8,\n\t11987: 0xD6F9,\n\t11988: 0xD6FA,\n\t11989: 0xD6FB,\n\t11990: 0xD6FE,\n\t11991: 0xD6FF,\n\t11992: 0xD701,\n\t11993: 0xD702,\n\t11994: 0xD703,\n\t11995: 0xD705,\n\t11996: 0xD706,\n\t11997: 0xD707,\n\t11998: 0xD708,\n\t11999: 0xD709,\n\t12000: 0xD70A,\n\t12001: 0xD70B,\n\t12002: 0xD70C,\n\t12003: 0xD70D,\n\t12004: 0xD70E,\n\t12005: 0xD70F,\n\t12006: 0xD710,\n\t12007: 0xD712,\n\t12008: 0xD713,\n\t12009: 0xD714,\n\t12010: 0xCE58,\n\t12011: 0xCE59,\n\t12012: 0xCE5C,\n\t12013: 0xCE5F,\n\t12014: 0xCE60,\n\t12015: 0xCE61,\n\t12016: 0xCE68,\n\t12017: 0xCE69,\n\t12018: 0xCE6B,\n\t12019: 0xCE6D,\n\t12020: 0xCE74,\n\t12021: 0xCE75,\n\t12022: 0xCE78,\n\t12023: 0xCE7C,\n\t12024: 0xCE84,\n\t12025: 0xCE85,\n\t12026: 0xCE87,\n\t12027: 0xCE89,\n\t12028: 0xCE90,\n\t12029: 0xCE91,\n\t12030: 0xCE94,\n\t12031: 0xCE98,\n\t12032: 0xCEA0,\n\t12033: 0xCEA1,\n\t12034: 0xCEA3,\n\t12035: 0xCEA4,\n\t12036: 0xCEA5,\n\t12037: 0xCEAC,\n\t12038: 0xCEAD,\n\t12039: 0xCEC1,\n\t12040: 0xCEE4,\n\t12041: 0xCEE5,\n\t12042: 0xCEE8,\n\t12043: 0xCEEB,\n\t12044: 0xCEEC,\n\t12045: 0xCEF4,\n\t12046: 0xCEF5,\n\t12047: 0xCEF7,\n\t12048: 0xCEF8,\n\t12049: 0xCEF9,\n\t12050: 0xCF00,\n\t12051: 0xCF01,\n\t12052: 0xCF04,\n\t12053: 0xCF08,\n\t12054: 0xCF10,\n\t12055: 0xCF11,\n\t12056: 0xCF13,\n\t12057: 0xCF15,\n\t12058: 0xCF1C,\n\t12059: 0xCF20,\n\t12060: 0xCF24,\n\t12061: 0xCF2C,\n\t12062: 0xCF2D,\n\t12063: 0xCF2F,\n\t12064: 0xCF30,\n\t12065: 0xCF31,\n\t12066: 0xCF38,\n\t12067: 0xCF54,\n\t12068: 0xCF55,\n\t12069: 0xCF58,\n\t12070: 0xCF5C,\n\t12071: 0xCF64,\n\t12072: 0xCF65,\n\t12073: 0xCF67,\n\t12074: 0xCF69,\n\t12075: 0xCF70,\n\t12076: 0xCF71,\n\t12077: 0xCF74,\n\t12078: 0xCF78,\n\t12079: 0xCF80,\n\t12080: 0xCF85,\n\t12081: 0xCF8C,\n\t12082: 0xCFA1,\n\t12083: 0xCFA8,\n\t12084: 0xCFB0,\n\t12085: 0xCFC4,\n\t12086: 0xCFE0,\n\t12087: 0xCFE1,\n\t12088: 0xCFE4,\n\t12089: 0xCFE8,\n\t12090: 0xCFF0,\n\t12091: 0xCFF1,\n\t12092: 0xCFF3,\n\t12093: 0xCFF5,\n\t12094: 0xCFFC,\n\t12095: 0xD000,\n\t12096: 0xD004,\n\t12097: 0xD011,\n\t12098: 0xD018,\n\t12099: 0xD02D,\n\t12100: 0xD034,\n\t12101: 0xD035,\n\t12102: 0xD038,\n\t12103: 0xD03C,\n\t12104: 0xD715,\n\t12105: 0xD716,\n\t12106: 0xD717,\n\t12107: 0xD71A,\n\t12108: 0xD71B,\n\t12109: 0xD71D,\n\t12110: 0xD71E,\n\t12111: 0xD71F,\n\t12112: 0xD721,\n\t12113: 0xD722,\n\t12114: 0xD723,\n\t12115: 0xD724,\n\t12116: 0xD725,\n\t12117: 0xD726,\n\t12118: 0xD727,\n\t12119: 0xD72A,\n\t12120: 0xD72C,\n\t12121: 0xD72E,\n\t12122: 0xD72F,\n\t12123: 0xD730,\n\t12124: 0xD731,\n\t12125: 0xD732,\n\t12126: 0xD733,\n\t12127: 0xD736,\n\t12128: 0xD737,\n\t12129: 0xD739,\n\t12130: 0xD73A,\n\t12131: 0xD73B,\n\t12132: 0xD73D,\n\t12133: 0xD73E,\n\t12134: 0xD73F,\n\t12135: 0xD740,\n\t12136: 0xD741,\n\t12137: 0xD742,\n\t12138: 0xD743,\n\t12139: 0xD745,\n\t12140: 0xD746,\n\t12141: 0xD748,\n\t12142: 0xD74A,\n\t12143: 0xD74B,\n\t12144: 0xD74C,\n\t12145: 0xD74D,\n\t12146: 0xD74E,\n\t12147: 0xD74F,\n\t12148: 0xD752,\n\t12149: 0xD753,\n\t12150: 0xD755,\n\t12151: 0xD75A,\n\t12152: 0xD75B,\n\t12153: 0xD75C,\n\t12154: 0xD75D,\n\t12155: 0xD75E,\n\t12156: 0xD75F,\n\t12157: 0xD762,\n\t12158: 0xD764,\n\t12159: 0xD766,\n\t12160: 0xD767,\n\t12161: 0xD768,\n\t12162: 0xD76A,\n\t12163: 0xD76B,\n\t12164: 0xD76D,\n\t12165: 0xD76E,\n\t12166: 0xD76F,\n\t12167: 0xD771,\n\t12168: 0xD772,\n\t12169: 0xD773,\n\t12170: 0xD775,\n\t12171: 0xD776,\n\t12172: 0xD777,\n\t12173: 0xD778,\n\t12174: 0xD779,\n\t12175: 0xD77A,\n\t12176: 0xD77B,\n\t12177: 0xD77E,\n\t12178: 0xD77F,\n\t12179: 0xD780,\n\t12180: 0xD782,\n\t12181: 0xD783,\n\t12182: 0xD784,\n\t12183: 0xD785,\n\t12184: 0xD786,\n\t12185: 0xD787,\n\t12186: 0xD78A,\n\t12187: 0xD78B,\n\t12188: 0xD044,\n\t12189: 0xD045,\n\t12190: 0xD047,\n\t12191: 0xD049,\n\t12192: 0xD050,\n\t12193: 0xD054,\n\t12194: 0xD058,\n\t12195: 0xD060,\n\t12196: 0xD06C,\n\t12197: 0xD06D,\n\t12198: 0xD070,\n\t12199: 0xD074,\n\t12200: 0xD07C,\n\t12201: 0xD07D,\n\t12202: 0xD081,\n\t12203: 0xD0A4,\n\t12204: 0xD0A5,\n\t12205: 0xD0A8,\n\t12206: 0xD0AC,\n\t12207: 0xD0B4,\n\t12208: 0xD0B5,\n\t12209: 0xD0B7,\n\t12210: 0xD0B9,\n\t12211: 0xD0C0,\n\t12212: 0xD0C1,\n\t12213: 0xD0C4,\n\t12214: 0xD0C8,\n\t12215: 0xD0C9,\n\t12216: 0xD0D0,\n\t12217: 0xD0D1,\n\t12218: 0xD0D3,\n\t12219: 0xD0D4,\n\t12220: 0xD0D5,\n\t12221: 0xD0DC,\n\t12222: 0xD0DD,\n\t12223: 0xD0E0,\n\t12224: 0xD0E4,\n\t12225: 0xD0EC,\n\t12226: 0xD0ED,\n\t12227: 0xD0EF,\n\t12228: 0xD0F0,\n\t12229: 0xD0F1,\n\t12230: 0xD0F8,\n\t12231: 0xD10D,\n\t12232: 0xD130,\n\t12233: 0xD131,\n\t12234: 0xD134,\n\t12235: 0xD138,\n\t12236: 0xD13A,\n\t12237: 0xD140,\n\t12238: 0xD141,\n\t12239: 0xD143,\n\t12240: 0xD144,\n\t12241: 0xD145,\n\t12242: 0xD14C,\n\t12243: 0xD14D,\n\t12244: 0xD150,\n\t12245: 0xD154,\n\t12246: 0xD15C,\n\t12247: 0xD15D,\n\t12248: 0xD15F,\n\t12249: 0xD161,\n\t12250: 0xD168,\n\t12251: 0xD16C,\n\t12252: 0xD17C,\n\t12253: 0xD184,\n\t12254: 0xD188,\n\t12255: 0xD1A0,\n\t12256: 0xD1A1,\n\t12257: 0xD1A4,\n\t12258: 0xD1A8,\n\t12259: 0xD1B0,\n\t12260: 0xD1B1,\n\t12261: 0xD1B3,\n\t12262: 0xD1B5,\n\t12263: 0xD1BA,\n\t12264: 0xD1BC,\n\t12265: 0xD1C0,\n\t12266: 0xD1D8,\n\t12267: 0xD1F4,\n\t12268: 0xD1F8,\n\t12269: 0xD207,\n\t12270: 0xD209,\n\t12271: 0xD210,\n\t12272: 0xD22C,\n\t12273: 0xD22D,\n\t12274: 0xD230,\n\t12275: 0xD234,\n\t12276: 0xD23C,\n\t12277: 0xD23D,\n\t12278: 0xD23F,\n\t12279: 0xD241,\n\t12280: 0xD248,\n\t12281: 0xD25C,\n\t12282: 0xD78D,\n\t12283: 0xD78E,\n\t12284: 0xD78F,\n\t12285: 0xD791,\n\t12286: 0xD792,\n\t12287: 0xD793,\n\t12288: 0xD794,\n\t12289: 0xD795,\n\t12290: 0xD796,\n\t12291: 0xD797,\n\t12292: 0xD79A,\n\t12293: 0xD79C,\n\t12294: 0xD79E,\n\t12295: 0xD79F,\n\t12296: 0xD7A0,\n\t12297: 0xD7A1,\n\t12298: 0xD7A2,\n\t12299: 0xD7A3,\n\t12366: 0xD264,\n\t12367: 0xD280,\n\t12368: 0xD281,\n\t12369: 0xD284,\n\t12370: 0xD288,\n\t12371: 0xD290,\n\t12372: 0xD291,\n\t12373: 0xD295,\n\t12374: 0xD29C,\n\t12375: 0xD2A0,\n\t12376: 0xD2A4,\n\t12377: 0xD2AC,\n\t12378: 0xD2B1,\n\t12379: 0xD2B8,\n\t12380: 0xD2B9,\n\t12381: 0xD2BC,\n\t12382: 0xD2BF,\n\t12383: 0xD2C0,\n\t12384: 0xD2C2,\n\t12385: 0xD2C8,\n\t12386: 0xD2C9,\n\t12387: 0xD2CB,\n\t12388: 0xD2D4,\n\t12389: 0xD2D8,\n\t12390: 0xD2DC,\n\t12391: 0xD2E4,\n\t12392: 0xD2E5,\n\t12393: 0xD2F0,\n\t12394: 0xD2F1,\n\t12395: 0xD2F4,\n\t12396: 0xD2F8,\n\t12397: 0xD300,\n\t12398: 0xD301,\n\t12399: 0xD303,\n\t12400: 0xD305,\n\t12401: 0xD30C,\n\t12402: 0xD30D,\n\t12403: 0xD30E,\n\t12404: 0xD310,\n\t12405: 0xD314,\n\t12406: 0xD316,\n\t12407: 0xD31C,\n\t12408: 0xD31D,\n\t12409: 0xD31F,\n\t12410: 0xD320,\n\t12411: 0xD321,\n\t12412: 0xD325,\n\t12413: 0xD328,\n\t12414: 0xD329,\n\t12415: 0xD32C,\n\t12416: 0xD330,\n\t12417: 0xD338,\n\t12418: 0xD339,\n\t12419: 0xD33B,\n\t12420: 0xD33C,\n\t12421: 0xD33D,\n\t12422: 0xD344,\n\t12423: 0xD345,\n\t12424: 0xD37C,\n\t12425: 0xD37D,\n\t12426: 0xD380,\n\t12427: 0xD384,\n\t12428: 0xD38C,\n\t12429: 0xD38D,\n\t12430: 0xD38F,\n\t12431: 0xD390,\n\t12432: 0xD391,\n\t12433: 0xD398,\n\t12434: 0xD399,\n\t12435: 0xD39C,\n\t12436: 0xD3A0,\n\t12437: 0xD3A8,\n\t12438: 0xD3A9,\n\t12439: 0xD3AB,\n\t12440: 0xD3AD,\n\t12441: 0xD3B4,\n\t12442: 0xD3B8,\n\t12443: 0xD3BC,\n\t12444: 0xD3C4,\n\t12445: 0xD3C5,\n\t12446: 0xD3C8,\n\t12447: 0xD3C9,\n\t12448: 0xD3D0,\n\t12449: 0xD3D8,\n\t12450: 0xD3E1,\n\t12451: 0xD3E3,\n\t12452: 0xD3EC,\n\t12453: 0xD3ED,\n\t12454: 0xD3F0,\n\t12455: 0xD3F4,\n\t12456: 0xD3FC,\n\t12457: 0xD3FD,\n\t12458: 0xD3FF,\n\t12459: 0xD401,\n\t12460: 0xD408,\n\t12461: 0xD41D,\n\t12462: 0xD440,\n\t12463: 0xD444,\n\t12464: 0xD45C,\n\t12465: 0xD460,\n\t12466: 0xD464,\n\t12467: 0xD46D,\n\t12468: 0xD46F,\n\t12469: 0xD478,\n\t12470: 0xD479,\n\t12471: 0xD47C,\n\t12472: 0xD47F,\n\t12473: 0xD480,\n\t12474: 0xD482,\n\t12475: 0xD488,\n\t12476: 0xD489,\n\t12477: 0xD48B,\n\t12478: 0xD48D,\n\t12479: 0xD494,\n\t12480: 0xD4A9,\n\t12481: 0xD4CC,\n\t12482: 0xD4D0,\n\t12483: 0xD4D4,\n\t12484: 0xD4DC,\n\t12485: 0xD4DF,\n\t12486: 0xD4E8,\n\t12487: 0xD4EC,\n\t12488: 0xD4F0,\n\t12489: 0xD4F8,\n\t12490: 0xD4FB,\n\t12491: 0xD4FD,\n\t12492: 0xD504,\n\t12493: 0xD508,\n\t12494: 0xD50C,\n\t12495: 0xD514,\n\t12496: 0xD515,\n\t12497: 0xD517,\n\t12498: 0xD53C,\n\t12499: 0xD53D,\n\t12500: 0xD540,\n\t12501: 0xD544,\n\t12502: 0xD54C,\n\t12503: 0xD54D,\n\t12504: 0xD54F,\n\t12505: 0xD551,\n\t12506: 0xD558,\n\t12507: 0xD559,\n\t12508: 0xD55C,\n\t12509: 0xD560,\n\t12510: 0xD565,\n\t12511: 0xD568,\n\t12512: 0xD569,\n\t12513: 0xD56B,\n\t12514: 0xD56D,\n\t12515: 0xD574,\n\t12516: 0xD575,\n\t12517: 0xD578,\n\t12518: 0xD57C,\n\t12519: 0xD584,\n\t12520: 0xD585,\n\t12521: 0xD587,\n\t12522: 0xD588,\n\t12523: 0xD589,\n\t12524: 0xD590,\n\t12525: 0xD5A5,\n\t12526: 0xD5C8,\n\t12527: 0xD5C9,\n\t12528: 0xD5CC,\n\t12529: 0xD5D0,\n\t12530: 0xD5D2,\n\t12531: 0xD5D8,\n\t12532: 0xD5D9,\n\t12533: 0xD5DB,\n\t12534: 0xD5DD,\n\t12535: 0xD5E4,\n\t12536: 0xD5E5,\n\t12537: 0xD5E8,\n\t12538: 0xD5EC,\n\t12539: 0xD5F4,\n\t12540: 0xD5F5,\n\t12541: 0xD5F7,\n\t12542: 0xD5F9,\n\t12543: 0xD600,\n\t12544: 0xD601,\n\t12545: 0xD604,\n\t12546: 0xD608,\n\t12547: 0xD610,\n\t12548: 0xD611,\n\t12549: 0xD613,\n\t12550: 0xD614,\n\t12551: 0xD615,\n\t12552: 0xD61C,\n\t12553: 0xD620,\n\t12554: 0xD624,\n\t12555: 0xD62D,\n\t12556: 0xD638,\n\t12557: 0xD639,\n\t12558: 0xD63C,\n\t12559: 0xD640,\n\t12560: 0xD645,\n\t12561: 0xD648,\n\t12562: 0xD649,\n\t12563: 0xD64B,\n\t12564: 0xD64D,\n\t12565: 0xD651,\n\t12566: 0xD654,\n\t12567: 0xD655,\n\t12568: 0xD658,\n\t12569: 0xD65C,\n\t12570: 0xD667,\n\t12571: 0xD669,\n\t12572: 0xD670,\n\t12573: 0xD671,\n\t12574: 0xD674,\n\t12575: 0xD683,\n\t12576: 0xD685,\n\t12577: 0xD68C,\n\t12578: 0xD68D,\n\t12579: 0xD690,\n\t12580: 0xD694,\n\t12581: 0xD69D,\n\t12582: 0xD69F,\n\t12583: 0xD6A1,\n\t12584: 0xD6A8,\n\t12585: 0xD6AC,\n\t12586: 0xD6B0,\n\t12587: 0xD6B9,\n\t12588: 0xD6BB,\n\t12589: 0xD6C4,\n\t12590: 0xD6C5,\n\t12591: 0xD6C8,\n\t12592: 0xD6CC,\n\t12593: 0xD6D1,\n\t12594: 0xD6D4,\n\t12595: 0xD6D7,\n\t12596: 0xD6D9,\n\t12597: 0xD6E0,\n\t12598: 0xD6E4,\n\t12599: 0xD6E8,\n\t12600: 0xD6F0,\n\t12601: 0xD6F5,\n\t12602: 0xD6FC,\n\t12603: 0xD6FD,\n\t12604: 0xD700,\n\t12605: 0xD704,\n\t12606: 0xD711,\n\t12607: 0xD718,\n\t12608: 0xD719,\n\t12609: 0xD71C,\n\t12610: 0xD720,\n\t12611: 0xD728,\n\t12612: 0xD729,\n\t12613: 0xD72B,\n\t12614: 0xD72D,\n\t12615: 0xD734,\n\t12616: 0xD735,\n\t12617: 0xD738,\n\t12618: 0xD73C,\n\t12619: 0xD744,\n\t12620: 0xD747,\n\t12621: 0xD749,\n\t12622: 0xD750,\n\t12623: 0xD751,\n\t12624: 0xD754,\n\t12625: 0xD756,\n\t12626: 0xD757,\n\t12627: 0xD758,\n\t12628: 0xD759,\n\t12629: 0xD760,\n\t12630: 0xD761,\n\t12631: 0xD763,\n\t12632: 0xD765,\n\t12633: 0xD769,\n\t12634: 0xD76C,\n\t12635: 0xD770,\n\t12636: 0xD774,\n\t12637: 0xD77C,\n\t12638: 0xD77D,\n\t12639: 0xD781,\n\t12640: 0xD788,\n\t12641: 0xD789,\n\t12642: 0xD78C,\n\t12643: 0xD790,\n\t12644: 0xD798,\n\t12645: 0xD799,\n\t12646: 0xD79B,\n\t12647: 0xD79D,\n\t12742: 0x4F3D,\n\t12743: 0x4F73,\n\t12744: 0x5047,\n\t12745: 0x50F9,\n\t12746: 0x52A0,\n\t12747: 0x53EF,\n\t12748: 0x5475,\n\t12749: 0x54E5,\n\t12750: 0x5609,\n\t12751: 0x5AC1,\n\t12752: 0x5BB6,\n\t12753: 0x6687,\n\t12754: 0x67B6,\n\t12755: 0x67B7,\n\t12756: 0x67EF,\n\t12757: 0x6B4C,\n\t12758: 0x73C2,\n\t12759: 0x75C2,\n\t12760: 0x7A3C,\n\t12761: 0x82DB,\n\t12762: 0x8304,\n\t12763: 0x8857,\n\t12764: 0x8888,\n\t12765: 0x8A36,\n\t12766: 0x8CC8,\n\t12767: 0x8DCF,\n\t12768: 0x8EFB,\n\t12769: 0x8FE6,\n\t12770: 0x99D5,\n\t12771: 0x523B,\n\t12772: 0x5374,\n\t12773: 0x5404,\n\t12774: 0x606A,\n\t12775: 0x6164,\n\t12776: 0x6BBC,\n\t12777: 0x73CF,\n\t12778: 0x811A,\n\t12779: 0x89BA,\n\t12780: 0x89D2,\n\t12781: 0x95A3,\n\t12782: 0x4F83,\n\t12783: 0x520A,\n\t12784: 0x58BE,\n\t12785: 0x5978,\n\t12786: 0x59E6,\n\t12787: 0x5E72,\n\t12788: 0x5E79,\n\t12789: 0x61C7,\n\t12790: 0x63C0,\n\t12791: 0x6746,\n\t12792: 0x67EC,\n\t12793: 0x687F,\n\t12794: 0x6F97,\n\t12795: 0x764E,\n\t12796: 0x770B,\n\t12797: 0x78F5,\n\t12798: 0x7A08,\n\t12799: 0x7AFF,\n\t12800: 0x7C21,\n\t12801: 0x809D,\n\t12802: 0x826E,\n\t12803: 0x8271,\n\t12804: 0x8AEB,\n\t12805: 0x9593,\n\t12806: 0x4E6B,\n\t12807: 0x559D,\n\t12808: 0x66F7,\n\t12809: 0x6E34,\n\t12810: 0x78A3,\n\t12811: 0x7AED,\n\t12812: 0x845B,\n\t12813: 0x8910,\n\t12814: 0x874E,\n\t12815: 0x97A8,\n\t12816: 0x52D8,\n\t12817: 0x574E,\n\t12818: 0x582A,\n\t12819: 0x5D4C,\n\t12820: 0x611F,\n\t12821: 0x61BE,\n\t12822: 0x6221,\n\t12823: 0x6562,\n\t12824: 0x67D1,\n\t12825: 0x6A44,\n\t12826: 0x6E1B,\n\t12827: 0x7518,\n\t12828: 0x75B3,\n\t12829: 0x76E3,\n\t12830: 0x77B0,\n\t12831: 0x7D3A,\n\t12832: 0x90AF,\n\t12833: 0x9451,\n\t12834: 0x9452,\n\t12835: 0x9F95,\n\t12836: 0x5323,\n\t12837: 0x5CAC,\n\t12838: 0x7532,\n\t12839: 0x80DB,\n\t12840: 0x9240,\n\t12841: 0x9598,\n\t12842: 0x525B,\n\t12843: 0x5808,\n\t12844: 0x59DC,\n\t12845: 0x5CA1,\n\t12846: 0x5D17,\n\t12847: 0x5EB7,\n\t12848: 0x5F3A,\n\t12849: 0x5F4A,\n\t12850: 0x6177,\n\t12851: 0x6C5F,\n\t12852: 0x757A,\n\t12853: 0x7586,\n\t12854: 0x7CE0,\n\t12855: 0x7D73,\n\t12856: 0x7DB1,\n\t12857: 0x7F8C,\n\t12858: 0x8154,\n\t12859: 0x8221,\n\t12860: 0x8591,\n\t12861: 0x8941,\n\t12862: 0x8B1B,\n\t12863: 0x92FC,\n\t12864: 0x964D,\n\t12865: 0x9C47,\n\t12866: 0x4ECB,\n\t12867: 0x4EF7,\n\t12868: 0x500B,\n\t12869: 0x51F1,\n\t12870: 0x584F,\n\t12871: 0x6137,\n\t12872: 0x613E,\n\t12873: 0x6168,\n\t12874: 0x6539,\n\t12875: 0x69EA,\n\t12876: 0x6F11,\n\t12877: 0x75A5,\n\t12878: 0x7686,\n\t12879: 0x76D6,\n\t12880: 0x7B87,\n\t12881: 0x82A5,\n\t12882: 0x84CB,\n\t12883: 0xF900,\n\t12884: 0x93A7,\n\t12885: 0x958B,\n\t12886: 0x5580,\n\t12887: 0x5BA2,\n\t12888: 0x5751,\n\t12889: 0xF901,\n\t12890: 0x7CB3,\n\t12891: 0x7FB9,\n\t12892: 0x91B5,\n\t12893: 0x5028,\n\t12894: 0x53BB,\n\t12895: 0x5C45,\n\t12896: 0x5DE8,\n\t12897: 0x62D2,\n\t12898: 0x636E,\n\t12899: 0x64DA,\n\t12900: 0x64E7,\n\t12901: 0x6E20,\n\t12902: 0x70AC,\n\t12903: 0x795B,\n\t12904: 0x8DDD,\n\t12905: 0x8E1E,\n\t12906: 0xF902,\n\t12907: 0x907D,\n\t12908: 0x9245,\n\t12909: 0x92F8,\n\t12910: 0x4E7E,\n\t12911: 0x4EF6,\n\t12912: 0x5065,\n\t12913: 0x5DFE,\n\t12914: 0x5EFA,\n\t12915: 0x6106,\n\t12916: 0x6957,\n\t12917: 0x8171,\n\t12918: 0x8654,\n\t12919: 0x8E47,\n\t12920: 0x9375,\n\t12921: 0x9A2B,\n\t12922: 0x4E5E,\n\t12923: 0x5091,\n\t12924: 0x6770,\n\t12925: 0x6840,\n\t12926: 0x5109,\n\t12927: 0x528D,\n\t12928: 0x5292,\n\t12929: 0x6AA2,\n\t12930: 0x77BC,\n\t12931: 0x9210,\n\t12932: 0x9ED4,\n\t12933: 0x52AB,\n\t12934: 0x602F,\n\t12935: 0x8FF2,\n\t12936: 0x5048,\n\t12937: 0x61A9,\n\t12938: 0x63ED,\n\t12939: 0x64CA,\n\t12940: 0x683C,\n\t12941: 0x6A84,\n\t12942: 0x6FC0,\n\t12943: 0x8188,\n\t12944: 0x89A1,\n\t12945: 0x9694,\n\t12946: 0x5805,\n\t12947: 0x727D,\n\t12948: 0x72AC,\n\t12949: 0x7504,\n\t12950: 0x7D79,\n\t12951: 0x7E6D,\n\t12952: 0x80A9,\n\t12953: 0x898B,\n\t12954: 0x8B74,\n\t12955: 0x9063,\n\t12956: 0x9D51,\n\t12957: 0x6289,\n\t12958: 0x6C7A,\n\t12959: 0x6F54,\n\t12960: 0x7D50,\n\t12961: 0x7F3A,\n\t12962: 0x8A23,\n\t12963: 0x517C,\n\t12964: 0x614A,\n\t12965: 0x7B9D,\n\t12966: 0x8B19,\n\t12967: 0x9257,\n\t12968: 0x938C,\n\t12969: 0x4EAC,\n\t12970: 0x4FD3,\n\t12971: 0x501E,\n\t12972: 0x50BE,\n\t12973: 0x5106,\n\t12974: 0x52C1,\n\t12975: 0x52CD,\n\t12976: 0x537F,\n\t12977: 0x5770,\n\t12978: 0x5883,\n\t12979: 0x5E9A,\n\t12980: 0x5F91,\n\t12981: 0x6176,\n\t12982: 0x61AC,\n\t12983: 0x64CE,\n\t12984: 0x656C,\n\t12985: 0x666F,\n\t12986: 0x66BB,\n\t12987: 0x66F4,\n\t12988: 0x6897,\n\t12989: 0x6D87,\n\t12990: 0x7085,\n\t12991: 0x70F1,\n\t12992: 0x749F,\n\t12993: 0x74A5,\n\t12994: 0x74CA,\n\t12995: 0x75D9,\n\t12996: 0x786C,\n\t12997: 0x78EC,\n\t12998: 0x7ADF,\n\t12999: 0x7AF6,\n\t13000: 0x7D45,\n\t13001: 0x7D93,\n\t13002: 0x8015,\n\t13003: 0x803F,\n\t13004: 0x811B,\n\t13005: 0x8396,\n\t13006: 0x8B66,\n\t13007: 0x8F15,\n\t13008: 0x9015,\n\t13009: 0x93E1,\n\t13010: 0x9803,\n\t13011: 0x9838,\n\t13012: 0x9A5A,\n\t13013: 0x9BE8,\n\t13014: 0x4FC2,\n\t13015: 0x5553,\n\t13016: 0x583A,\n\t13017: 0x5951,\n\t13018: 0x5B63,\n\t13019: 0x5C46,\n\t13020: 0x60B8,\n\t13021: 0x6212,\n\t13022: 0x6842,\n\t13023: 0x68B0,\n\t13024: 0x68E8,\n\t13025: 0x6EAA,\n\t13026: 0x754C,\n\t13027: 0x7678,\n\t13028: 0x78CE,\n\t13029: 0x7A3D,\n\t13030: 0x7CFB,\n\t13031: 0x7E6B,\n\t13032: 0x7E7C,\n\t13033: 0x8A08,\n\t13034: 0x8AA1,\n\t13035: 0x8C3F,\n\t13036: 0x968E,\n\t13037: 0x9DC4,\n\t13038: 0x53E4,\n\t13039: 0x53E9,\n\t13040: 0x544A,\n\t13041: 0x5471,\n\t13042: 0x56FA,\n\t13043: 0x59D1,\n\t13044: 0x5B64,\n\t13045: 0x5C3B,\n\t13046: 0x5EAB,\n\t13047: 0x62F7,\n\t13048: 0x6537,\n\t13049: 0x6545,\n\t13050: 0x6572,\n\t13051: 0x66A0,\n\t13052: 0x67AF,\n\t13053: 0x69C1,\n\t13054: 0x6CBD,\n\t13055: 0x75FC,\n\t13056: 0x7690,\n\t13057: 0x777E,\n\t13058: 0x7A3F,\n\t13059: 0x7F94,\n\t13060: 0x8003,\n\t13061: 0x80A1,\n\t13062: 0x818F,\n\t13063: 0x82E6,\n\t13064: 0x82FD,\n\t13065: 0x83F0,\n\t13066: 0x85C1,\n\t13067: 0x8831,\n\t13068: 0x88B4,\n\t13069: 0x8AA5,\n\t13070: 0xF903,\n\t13071: 0x8F9C,\n\t13072: 0x932E,\n\t13073: 0x96C7,\n\t13074: 0x9867,\n\t13075: 0x9AD8,\n\t13076: 0x9F13,\n\t13077: 0x54ED,\n\t13078: 0x659B,\n\t13079: 0x66F2,\n\t13080: 0x688F,\n\t13081: 0x7A40,\n\t13082: 0x8C37,\n\t13083: 0x9D60,\n\t13084: 0x56F0,\n\t13085: 0x5764,\n\t13086: 0x5D11,\n\t13087: 0x6606,\n\t13088: 0x68B1,\n\t13089: 0x68CD,\n\t13090: 0x6EFE,\n\t13091: 0x7428,\n\t13092: 0x889E,\n\t13093: 0x9BE4,\n\t13094: 0x6C68,\n\t13095: 0xF904,\n\t13096: 0x9AA8,\n\t13097: 0x4F9B,\n\t13098: 0x516C,\n\t13099: 0x5171,\n\t13100: 0x529F,\n\t13101: 0x5B54,\n\t13102: 0x5DE5,\n\t13103: 0x6050,\n\t13104: 0x606D,\n\t13105: 0x62F1,\n\t13106: 0x63A7,\n\t13107: 0x653B,\n\t13108: 0x73D9,\n\t13109: 0x7A7A,\n\t13110: 0x86A3,\n\t13111: 0x8CA2,\n\t13112: 0x978F,\n\t13113: 0x4E32,\n\t13114: 0x5BE1,\n\t13115: 0x6208,\n\t13116: 0x679C,\n\t13117: 0x74DC,\n\t13118: 0x79D1,\n\t13119: 0x83D3,\n\t13120: 0x8A87,\n\t13121: 0x8AB2,\n\t13122: 0x8DE8,\n\t13123: 0x904E,\n\t13124: 0x934B,\n\t13125: 0x9846,\n\t13126: 0x5ED3,\n\t13127: 0x69E8,\n\t13128: 0x85FF,\n\t13129: 0x90ED,\n\t13130: 0xF905,\n\t13131: 0x51A0,\n\t13132: 0x5B98,\n\t13133: 0x5BEC,\n\t13134: 0x6163,\n\t13135: 0x68FA,\n\t13136: 0x6B3E,\n\t13137: 0x704C,\n\t13138: 0x742F,\n\t13139: 0x74D8,\n\t13140: 0x7BA1,\n\t13141: 0x7F50,\n\t13142: 0x83C5,\n\t13143: 0x89C0,\n\t13144: 0x8CAB,\n\t13145: 0x95DC,\n\t13146: 0x9928,\n\t13147: 0x522E,\n\t13148: 0x605D,\n\t13149: 0x62EC,\n\t13150: 0x9002,\n\t13151: 0x4F8A,\n\t13152: 0x5149,\n\t13153: 0x5321,\n\t13154: 0x58D9,\n\t13155: 0x5EE3,\n\t13156: 0x66E0,\n\t13157: 0x6D38,\n\t13158: 0x709A,\n\t13159: 0x72C2,\n\t13160: 0x73D6,\n\t13161: 0x7B50,\n\t13162: 0x80F1,\n\t13163: 0x945B,\n\t13164: 0x5366,\n\t13165: 0x639B,\n\t13166: 0x7F6B,\n\t13167: 0x4E56,\n\t13168: 0x5080,\n\t13169: 0x584A,\n\t13170: 0x58DE,\n\t13171: 0x602A,\n\t13172: 0x6127,\n\t13173: 0x62D0,\n\t13174: 0x69D0,\n\t13175: 0x9B41,\n\t13176: 0x5B8F,\n\t13177: 0x7D18,\n\t13178: 0x80B1,\n\t13179: 0x8F5F,\n\t13180: 0x4EA4,\n\t13181: 0x50D1,\n\t13182: 0x54AC,\n\t13183: 0x55AC,\n\t13184: 0x5B0C,\n\t13185: 0x5DA0,\n\t13186: 0x5DE7,\n\t13187: 0x652A,\n\t13188: 0x654E,\n\t13189: 0x6821,\n\t13190: 0x6A4B,\n\t13191: 0x72E1,\n\t13192: 0x768E,\n\t13193: 0x77EF,\n\t13194: 0x7D5E,\n\t13195: 0x7FF9,\n\t13196: 0x81A0,\n\t13197: 0x854E,\n\t13198: 0x86DF,\n\t13199: 0x8F03,\n\t13200: 0x8F4E,\n\t13201: 0x90CA,\n\t13202: 0x9903,\n\t13203: 0x9A55,\n\t13204: 0x9BAB,\n\t13205: 0x4E18,\n\t13206: 0x4E45,\n\t13207: 0x4E5D,\n\t13208: 0x4EC7,\n\t13209: 0x4FF1,\n\t13210: 0x5177,\n\t13211: 0x52FE,\n\t13212: 0x5340,\n\t13213: 0x53E3,\n\t13214: 0x53E5,\n\t13215: 0x548E,\n\t13216: 0x5614,\n\t13217: 0x5775,\n\t13218: 0x57A2,\n\t13219: 0x5BC7,\n\t13220: 0x5D87,\n\t13221: 0x5ED0,\n\t13222: 0x61FC,\n\t13223: 0x62D8,\n\t13224: 0x6551,\n\t13225: 0x67B8,\n\t13226: 0x67E9,\n\t13227: 0x69CB,\n\t13228: 0x6B50,\n\t13229: 0x6BC6,\n\t13230: 0x6BEC,\n\t13231: 0x6C42,\n\t13232: 0x6E9D,\n\t13233: 0x7078,\n\t13234: 0x72D7,\n\t13235: 0x7396,\n\t13236: 0x7403,\n\t13237: 0x77BF,\n\t13238: 0x77E9,\n\t13239: 0x7A76,\n\t13240: 0x7D7F,\n\t13241: 0x8009,\n\t13242: 0x81FC,\n\t13243: 0x8205,\n\t13244: 0x820A,\n\t13245: 0x82DF,\n\t13246: 0x8862,\n\t13247: 0x8B33,\n\t13248: 0x8CFC,\n\t13249: 0x8EC0,\n\t13250: 0x9011,\n\t13251: 0x90B1,\n\t13252: 0x9264,\n\t13253: 0x92B6,\n\t13254: 0x99D2,\n\t13255: 0x9A45,\n\t13256: 0x9CE9,\n\t13257: 0x9DD7,\n\t13258: 0x9F9C,\n\t13259: 0x570B,\n\t13260: 0x5C40,\n\t13261: 0x83CA,\n\t13262: 0x97A0,\n\t13263: 0x97AB,\n\t13264: 0x9EB4,\n\t13265: 0x541B,\n\t13266: 0x7A98,\n\t13267: 0x7FA4,\n\t13268: 0x88D9,\n\t13269: 0x8ECD,\n\t13270: 0x90E1,\n\t13271: 0x5800,\n\t13272: 0x5C48,\n\t13273: 0x6398,\n\t13274: 0x7A9F,\n\t13275: 0x5BAE,\n\t13276: 0x5F13,\n\t13277: 0x7A79,\n\t13278: 0x7AAE,\n\t13279: 0x828E,\n\t13280: 0x8EAC,\n\t13281: 0x5026,\n\t13282: 0x5238,\n\t13283: 0x52F8,\n\t13284: 0x5377,\n\t13285: 0x5708,\n\t13286: 0x62F3,\n\t13287: 0x6372,\n\t13288: 0x6B0A,\n\t13289: 0x6DC3,\n\t13290: 0x7737,\n\t13291: 0x53A5,\n\t13292: 0x7357,\n\t13293: 0x8568,\n\t13294: 0x8E76,\n\t13295: 0x95D5,\n\t13296: 0x673A,\n\t13297: 0x6AC3,\n\t13298: 0x6F70,\n\t13299: 0x8A6D,\n\t13300: 0x8ECC,\n\t13301: 0x994B,\n\t13302: 0xF906,\n\t13303: 0x6677,\n\t13304: 0x6B78,\n\t13305: 0x8CB4,\n\t13306: 0x9B3C,\n\t13307: 0xF907,\n\t13308: 0x53EB,\n\t13309: 0x572D,\n\t13310: 0x594E,\n\t13311: 0x63C6,\n\t13312: 0x69FB,\n\t13313: 0x73EA,\n\t13314: 0x7845,\n\t13315: 0x7ABA,\n\t13316: 0x7AC5,\n\t13317: 0x7CFE,\n\t13318: 0x8475,\n\t13319: 0x898F,\n\t13320: 0x8D73,\n\t13321: 0x9035,\n\t13322: 0x95A8,\n\t13323: 0x52FB,\n\t13324: 0x5747,\n\t13325: 0x7547,\n\t13326: 0x7B60,\n\t13327: 0x83CC,\n\t13328: 0x921E,\n\t13329: 0xF908,\n\t13330: 0x6A58,\n\t13331: 0x514B,\n\t13332: 0x524B,\n\t13333: 0x5287,\n\t13334: 0x621F,\n\t13335: 0x68D8,\n\t13336: 0x6975,\n\t13337: 0x9699,\n\t13338: 0x50C5,\n\t13339: 0x52A4,\n\t13340: 0x52E4,\n\t13341: 0x61C3,\n\t13342: 0x65A4,\n\t13343: 0x6839,\n\t13344: 0x69FF,\n\t13345: 0x747E,\n\t13346: 0x7B4B,\n\t13347: 0x82B9,\n\t13348: 0x83EB,\n\t13349: 0x89B2,\n\t13350: 0x8B39,\n\t13351: 0x8FD1,\n\t13352: 0x9949,\n\t13353: 0xF909,\n\t13354: 0x4ECA,\n\t13355: 0x5997,\n\t13356: 0x64D2,\n\t13357: 0x6611,\n\t13358: 0x6A8E,\n\t13359: 0x7434,\n\t13360: 0x7981,\n\t13361: 0x79BD,\n\t13362: 0x82A9,\n\t13363: 0x887E,\n\t13364: 0x887F,\n\t13365: 0x895F,\n\t13366: 0xF90A,\n\t13367: 0x9326,\n\t13368: 0x4F0B,\n\t13369: 0x53CA,\n\t13370: 0x6025,\n\t13371: 0x6271,\n\t13372: 0x6C72,\n\t13373: 0x7D1A,\n\t13374: 0x7D66,\n\t13375: 0x4E98,\n\t13376: 0x5162,\n\t13377: 0x77DC,\n\t13378: 0x80AF,\n\t13379: 0x4F01,\n\t13380: 0x4F0E,\n\t13381: 0x5176,\n\t13382: 0x5180,\n\t13383: 0x55DC,\n\t13384: 0x5668,\n\t13385: 0x573B,\n\t13386: 0x57FA,\n\t13387: 0x57FC,\n\t13388: 0x5914,\n\t13389: 0x5947,\n\t13390: 0x5993,\n\t13391: 0x5BC4,\n\t13392: 0x5C90,\n\t13393: 0x5D0E,\n\t13394: 0x5DF1,\n\t13395: 0x5E7E,\n\t13396: 0x5FCC,\n\t13397: 0x6280,\n\t13398: 0x65D7,\n\t13399: 0x65E3,\n\t13400: 0x671E,\n\t13401: 0x671F,\n\t13402: 0x675E,\n\t13403: 0x68CB,\n\t13404: 0x68C4,\n\t13405: 0x6A5F,\n\t13406: 0x6B3A,\n\t13407: 0x6C23,\n\t13408: 0x6C7D,\n\t13409: 0x6C82,\n\t13410: 0x6DC7,\n\t13411: 0x7398,\n\t13412: 0x7426,\n\t13413: 0x742A,\n\t13414: 0x7482,\n\t13415: 0x74A3,\n\t13416: 0x7578,\n\t13417: 0x757F,\n\t13418: 0x7881,\n\t13419: 0x78EF,\n\t13420: 0x7941,\n\t13421: 0x7947,\n\t13422: 0x7948,\n\t13423: 0x797A,\n\t13424: 0x7B95,\n\t13425: 0x7D00,\n\t13426: 0x7DBA,\n\t13427: 0x7F88,\n\t13428: 0x8006,\n\t13429: 0x802D,\n\t13430: 0x808C,\n\t13431: 0x8A18,\n\t13432: 0x8B4F,\n\t13433: 0x8C48,\n\t13434: 0x8D77,\n\t13435: 0x9321,\n\t13436: 0x9324,\n\t13437: 0x98E2,\n\t13438: 0x9951,\n\t13439: 0x9A0E,\n\t13440: 0x9A0F,\n\t13441: 0x9A65,\n\t13442: 0x9E92,\n\t13443: 0x7DCA,\n\t13444: 0x4F76,\n\t13445: 0x5409,\n\t13446: 0x62EE,\n\t13447: 0x6854,\n\t13448: 0x91D1,\n\t13449: 0x55AB,\n\t13450: 0x513A,\n\t13451: 0xF90B,\n\t13452: 0xF90C,\n\t13453: 0x5A1C,\n\t13454: 0x61E6,\n\t13455: 0xF90D,\n\t13456: 0x62CF,\n\t13457: 0x62FF,\n\t13458: 0xF90E,\n\t13459: 0xF90F,\n\t13460: 0xF910,\n\t13461: 0xF911,\n\t13462: 0xF912,\n\t13463: 0xF913,\n\t13464: 0x90A3,\n\t13465: 0xF914,\n\t13466: 0xF915,\n\t13467: 0xF916,\n\t13468: 0xF917,\n\t13469: 0xF918,\n\t13470: 0x8AFE,\n\t13471: 0xF919,\n\t13472: 0xF91A,\n\t13473: 0xF91B,\n\t13474: 0xF91C,\n\t13475: 0x6696,\n\t13476: 0xF91D,\n\t13477: 0x7156,\n\t13478: 0xF91E,\n\t13479: 0xF91F,\n\t13480: 0x96E3,\n\t13481: 0xF920,\n\t13482: 0x634F,\n\t13483: 0x637A,\n\t13484: 0x5357,\n\t13485: 0xF921,\n\t13486: 0x678F,\n\t13487: 0x6960,\n\t13488: 0x6E73,\n\t13489: 0xF922,\n\t13490: 0x7537,\n\t13491: 0xF923,\n\t13492: 0xF924,\n\t13493: 0xF925,\n\t13494: 0x7D0D,\n\t13495: 0xF926,\n\t13496: 0xF927,\n\t13497: 0x8872,\n\t13498: 0x56CA,\n\t13499: 0x5A18,\n\t13500: 0xF928,\n\t13501: 0xF929,\n\t13502: 0xF92A,\n\t13503: 0xF92B,\n\t13504: 0xF92C,\n\t13505: 0x4E43,\n\t13506: 0xF92D,\n\t13507: 0x5167,\n\t13508: 0x5948,\n\t13509: 0x67F0,\n\t13510: 0x8010,\n\t13511: 0xF92E,\n\t13512: 0x5973,\n\t13513: 0x5E74,\n\t13514: 0x649A,\n\t13515: 0x79CA,\n\t13516: 0x5FF5,\n\t13517: 0x606C,\n\t13518: 0x62C8,\n\t13519: 0x637B,\n\t13520: 0x5BE7,\n\t13521: 0x5BD7,\n\t13522: 0x52AA,\n\t13523: 0xF92F,\n\t13524: 0x5974,\n\t13525: 0x5F29,\n\t13526: 0x6012,\n\t13527: 0xF930,\n\t13528: 0xF931,\n\t13529: 0xF932,\n\t13530: 0x7459,\n\t13531: 0xF933,\n\t13532: 0xF934,\n\t13533: 0xF935,\n\t13534: 0xF936,\n\t13535: 0xF937,\n\t13536: 0xF938,\n\t13537: 0x99D1,\n\t13538: 0xF939,\n\t13539: 0xF93A,\n\t13540: 0xF93B,\n\t13541: 0xF93C,\n\t13542: 0xF93D,\n\t13543: 0xF93E,\n\t13544: 0xF93F,\n\t13545: 0xF940,\n\t13546: 0xF941,\n\t13547: 0xF942,\n\t13548: 0xF943,\n\t13549: 0x6FC3,\n\t13550: 0xF944,\n\t13551: 0xF945,\n\t13552: 0x81BF,\n\t13553: 0x8FB2,\n\t13554: 0x60F1,\n\t13555: 0xF946,\n\t13556: 0xF947,\n\t13557: 0x8166,\n\t13558: 0xF948,\n\t13559: 0xF949,\n\t13560: 0x5C3F,\n\t13561: 0xF94A,\n\t13562: 0xF94B,\n\t13563: 0xF94C,\n\t13564: 0xF94D,\n\t13565: 0xF94E,\n\t13566: 0xF94F,\n\t13567: 0xF950,\n\t13568: 0xF951,\n\t13569: 0x5AE9,\n\t13570: 0x8A25,\n\t13571: 0x677B,\n\t13572: 0x7D10,\n\t13573: 0xF952,\n\t13574: 0xF953,\n\t13575: 0xF954,\n\t13576: 0xF955,\n\t13577: 0xF956,\n\t13578: 0xF957,\n\t13579: 0x80FD,\n\t13580: 0xF958,\n\t13581: 0xF959,\n\t13582: 0x5C3C,\n\t13583: 0x6CE5,\n\t13584: 0x533F,\n\t13585: 0x6EBA,\n\t13586: 0x591A,\n\t13587: 0x8336,\n\t13588: 0x4E39,\n\t13589: 0x4EB6,\n\t13590: 0x4F46,\n\t13591: 0x55AE,\n\t13592: 0x5718,\n\t13593: 0x58C7,\n\t13594: 0x5F56,\n\t13595: 0x65B7,\n\t13596: 0x65E6,\n\t13597: 0x6A80,\n\t13598: 0x6BB5,\n\t13599: 0x6E4D,\n\t13600: 0x77ED,\n\t13601: 0x7AEF,\n\t13602: 0x7C1E,\n\t13603: 0x7DDE,\n\t13604: 0x86CB,\n\t13605: 0x8892,\n\t13606: 0x9132,\n\t13607: 0x935B,\n\t13608: 0x64BB,\n\t13609: 0x6FBE,\n\t13610: 0x737A,\n\t13611: 0x75B8,\n\t13612: 0x9054,\n\t13613: 0x5556,\n\t13614: 0x574D,\n\t13615: 0x61BA,\n\t13616: 0x64D4,\n\t13617: 0x66C7,\n\t13618: 0x6DE1,\n\t13619: 0x6E5B,\n\t13620: 0x6F6D,\n\t13621: 0x6FB9,\n\t13622: 0x75F0,\n\t13623: 0x8043,\n\t13624: 0x81BD,\n\t13625: 0x8541,\n\t13626: 0x8983,\n\t13627: 0x8AC7,\n\t13628: 0x8B5A,\n\t13629: 0x931F,\n\t13630: 0x6C93,\n\t13631: 0x7553,\n\t13632: 0x7B54,\n\t13633: 0x8E0F,\n\t13634: 0x905D,\n\t13635: 0x5510,\n\t13636: 0x5802,\n\t13637: 0x5858,\n\t13638: 0x5E62,\n\t13639: 0x6207,\n\t13640: 0x649E,\n\t13641: 0x68E0,\n\t13642: 0x7576,\n\t13643: 0x7CD6,\n\t13644: 0x87B3,\n\t13645: 0x9EE8,\n\t13646: 0x4EE3,\n\t13647: 0x5788,\n\t13648: 0x576E,\n\t13649: 0x5927,\n\t13650: 0x5C0D,\n\t13651: 0x5CB1,\n\t13652: 0x5E36,\n\t13653: 0x5F85,\n\t13654: 0x6234,\n\t13655: 0x64E1,\n\t13656: 0x73B3,\n\t13657: 0x81FA,\n\t13658: 0x888B,\n\t13659: 0x8CB8,\n\t13660: 0x968A,\n\t13661: 0x9EDB,\n\t13662: 0x5B85,\n\t13663: 0x5FB7,\n\t13664: 0x60B3,\n\t13665: 0x5012,\n\t13666: 0x5200,\n\t13667: 0x5230,\n\t13668: 0x5716,\n\t13669: 0x5835,\n\t13670: 0x5857,\n\t13671: 0x5C0E,\n\t13672: 0x5C60,\n\t13673: 0x5CF6,\n\t13674: 0x5D8B,\n\t13675: 0x5EA6,\n\t13676: 0x5F92,\n\t13677: 0x60BC,\n\t13678: 0x6311,\n\t13679: 0x6389,\n\t13680: 0x6417,\n\t13681: 0x6843,\n\t13682: 0x68F9,\n\t13683: 0x6AC2,\n\t13684: 0x6DD8,\n\t13685: 0x6E21,\n\t13686: 0x6ED4,\n\t13687: 0x6FE4,\n\t13688: 0x71FE,\n\t13689: 0x76DC,\n\t13690: 0x7779,\n\t13691: 0x79B1,\n\t13692: 0x7A3B,\n\t13693: 0x8404,\n\t13694: 0x89A9,\n\t13695: 0x8CED,\n\t13696: 0x8DF3,\n\t13697: 0x8E48,\n\t13698: 0x9003,\n\t13699: 0x9014,\n\t13700: 0x9053,\n\t13701: 0x90FD,\n\t13702: 0x934D,\n\t13703: 0x9676,\n\t13704: 0x97DC,\n\t13705: 0x6BD2,\n\t13706: 0x7006,\n\t13707: 0x7258,\n\t13708: 0x72A2,\n\t13709: 0x7368,\n\t13710: 0x7763,\n\t13711: 0x79BF,\n\t13712: 0x7BE4,\n\t13713: 0x7E9B,\n\t13714: 0x8B80,\n\t13715: 0x58A9,\n\t13716: 0x60C7,\n\t13717: 0x6566,\n\t13718: 0x65FD,\n\t13719: 0x66BE,\n\t13720: 0x6C8C,\n\t13721: 0x711E,\n\t13722: 0x71C9,\n\t13723: 0x8C5A,\n\t13724: 0x9813,\n\t13725: 0x4E6D,\n\t13726: 0x7A81,\n\t13727: 0x4EDD,\n\t13728: 0x51AC,\n\t13729: 0x51CD,\n\t13730: 0x52D5,\n\t13731: 0x540C,\n\t13732: 0x61A7,\n\t13733: 0x6771,\n\t13734: 0x6850,\n\t13735: 0x68DF,\n\t13736: 0x6D1E,\n\t13737: 0x6F7C,\n\t13738: 0x75BC,\n\t13739: 0x77B3,\n\t13740: 0x7AE5,\n\t13741: 0x80F4,\n\t13742: 0x8463,\n\t13743: 0x9285,\n\t13744: 0x515C,\n\t13745: 0x6597,\n\t13746: 0x675C,\n\t13747: 0x6793,\n\t13748: 0x75D8,\n\t13749: 0x7AC7,\n\t13750: 0x8373,\n\t13751: 0xF95A,\n\t13752: 0x8C46,\n\t13753: 0x9017,\n\t13754: 0x982D,\n\t13755: 0x5C6F,\n\t13756: 0x81C0,\n\t13757: 0x829A,\n\t13758: 0x9041,\n\t13759: 0x906F,\n\t13760: 0x920D,\n\t13761: 0x5F97,\n\t13762: 0x5D9D,\n\t13763: 0x6A59,\n\t13764: 0x71C8,\n\t13765: 0x767B,\n\t13766: 0x7B49,\n\t13767: 0x85E4,\n\t13768: 0x8B04,\n\t13769: 0x9127,\n\t13770: 0x9A30,\n\t13771: 0x5587,\n\t13772: 0x61F6,\n\t13773: 0xF95B,\n\t13774: 0x7669,\n\t13775: 0x7F85,\n\t13776: 0x863F,\n\t13777: 0x87BA,\n\t13778: 0x88F8,\n\t13779: 0x908F,\n\t13780: 0xF95C,\n\t13781: 0x6D1B,\n\t13782: 0x70D9,\n\t13783: 0x73DE,\n\t13784: 0x7D61,\n\t13785: 0x843D,\n\t13786: 0xF95D,\n\t13787: 0x916A,\n\t13788: 0x99F1,\n\t13789: 0xF95E,\n\t13790: 0x4E82,\n\t13791: 0x5375,\n\t13792: 0x6B04,\n\t13793: 0x6B12,\n\t13794: 0x703E,\n\t13795: 0x721B,\n\t13796: 0x862D,\n\t13797: 0x9E1E,\n\t13798: 0x524C,\n\t13799: 0x8FA3,\n\t13800: 0x5D50,\n\t13801: 0x64E5,\n\t13802: 0x652C,\n\t13803: 0x6B16,\n\t13804: 0x6FEB,\n\t13805: 0x7C43,\n\t13806: 0x7E9C,\n\t13807: 0x85CD,\n\t13808: 0x8964,\n\t13809: 0x89BD,\n\t13810: 0x62C9,\n\t13811: 0x81D8,\n\t13812: 0x881F,\n\t13813: 0x5ECA,\n\t13814: 0x6717,\n\t13815: 0x6D6A,\n\t13816: 0x72FC,\n\t13817: 0x7405,\n\t13818: 0x746F,\n\t13819: 0x8782,\n\t13820: 0x90DE,\n\t13821: 0x4F86,\n\t13822: 0x5D0D,\n\t13823: 0x5FA0,\n\t13824: 0x840A,\n\t13825: 0x51B7,\n\t13826: 0x63A0,\n\t13827: 0x7565,\n\t13828: 0x4EAE,\n\t13829: 0x5006,\n\t13830: 0x5169,\n\t13831: 0x51C9,\n\t13832: 0x6881,\n\t13833: 0x6A11,\n\t13834: 0x7CAE,\n\t13835: 0x7CB1,\n\t13836: 0x7CE7,\n\t13837: 0x826F,\n\t13838: 0x8AD2,\n\t13839: 0x8F1B,\n\t13840: 0x91CF,\n\t13841: 0x4FB6,\n\t13842: 0x5137,\n\t13843: 0x52F5,\n\t13844: 0x5442,\n\t13845: 0x5EEC,\n\t13846: 0x616E,\n\t13847: 0x623E,\n\t13848: 0x65C5,\n\t13849: 0x6ADA,\n\t13850: 0x6FFE,\n\t13851: 0x792A,\n\t13852: 0x85DC,\n\t13853: 0x8823,\n\t13854: 0x95AD,\n\t13855: 0x9A62,\n\t13856: 0x9A6A,\n\t13857: 0x9E97,\n\t13858: 0x9ECE,\n\t13859: 0x529B,\n\t13860: 0x66C6,\n\t13861: 0x6B77,\n\t13862: 0x701D,\n\t13863: 0x792B,\n\t13864: 0x8F62,\n\t13865: 0x9742,\n\t13866: 0x6190,\n\t13867: 0x6200,\n\t13868: 0x6523,\n\t13869: 0x6F23,\n\t13870: 0x7149,\n\t13871: 0x7489,\n\t13872: 0x7DF4,\n\t13873: 0x806F,\n\t13874: 0x84EE,\n\t13875: 0x8F26,\n\t13876: 0x9023,\n\t13877: 0x934A,\n\t13878: 0x51BD,\n\t13879: 0x5217,\n\t13880: 0x52A3,\n\t13881: 0x6D0C,\n\t13882: 0x70C8,\n\t13883: 0x88C2,\n\t13884: 0x5EC9,\n\t13885: 0x6582,\n\t13886: 0x6BAE,\n\t13887: 0x6FC2,\n\t13888: 0x7C3E,\n\t13889: 0x7375,\n\t13890: 0x4EE4,\n\t13891: 0x4F36,\n\t13892: 0x56F9,\n\t13893: 0xF95F,\n\t13894: 0x5CBA,\n\t13895: 0x5DBA,\n\t13896: 0x601C,\n\t13897: 0x73B2,\n\t13898: 0x7B2D,\n\t13899: 0x7F9A,\n\t13900: 0x7FCE,\n\t13901: 0x8046,\n\t13902: 0x901E,\n\t13903: 0x9234,\n\t13904: 0x96F6,\n\t13905: 0x9748,\n\t13906: 0x9818,\n\t13907: 0x9F61,\n\t13908: 0x4F8B,\n\t13909: 0x6FA7,\n\t13910: 0x79AE,\n\t13911: 0x91B4,\n\t13912: 0x96B7,\n\t13913: 0x52DE,\n\t13914: 0xF960,\n\t13915: 0x6488,\n\t13916: 0x64C4,\n\t13917: 0x6AD3,\n\t13918: 0x6F5E,\n\t13919: 0x7018,\n\t13920: 0x7210,\n\t13921: 0x76E7,\n\t13922: 0x8001,\n\t13923: 0x8606,\n\t13924: 0x865C,\n\t13925: 0x8DEF,\n\t13926: 0x8F05,\n\t13927: 0x9732,\n\t13928: 0x9B6F,\n\t13929: 0x9DFA,\n\t13930: 0x9E75,\n\t13931: 0x788C,\n\t13932: 0x797F,\n\t13933: 0x7DA0,\n\t13934: 0x83C9,\n\t13935: 0x9304,\n\t13936: 0x9E7F,\n\t13937: 0x9E93,\n\t13938: 0x8AD6,\n\t13939: 0x58DF,\n\t13940: 0x5F04,\n\t13941: 0x6727,\n\t13942: 0x7027,\n\t13943: 0x74CF,\n\t13944: 0x7C60,\n\t13945: 0x807E,\n\t13946: 0x5121,\n\t13947: 0x7028,\n\t13948: 0x7262,\n\t13949: 0x78CA,\n\t13950: 0x8CC2,\n\t13951: 0x8CDA,\n\t13952: 0x8CF4,\n\t13953: 0x96F7,\n\t13954: 0x4E86,\n\t13955: 0x50DA,\n\t13956: 0x5BEE,\n\t13957: 0x5ED6,\n\t13958: 0x6599,\n\t13959: 0x71CE,\n\t13960: 0x7642,\n\t13961: 0x77AD,\n\t13962: 0x804A,\n\t13963: 0x84FC,\n\t13964: 0x907C,\n\t13965: 0x9B27,\n\t13966: 0x9F8D,\n\t13967: 0x58D8,\n\t13968: 0x5A41,\n\t13969: 0x5C62,\n\t13970: 0x6A13,\n\t13971: 0x6DDA,\n\t13972: 0x6F0F,\n\t13973: 0x763B,\n\t13974: 0x7D2F,\n\t13975: 0x7E37,\n\t13976: 0x851E,\n\t13977: 0x8938,\n\t13978: 0x93E4,\n\t13979: 0x964B,\n\t13980: 0x5289,\n\t13981: 0x65D2,\n\t13982: 0x67F3,\n\t13983: 0x69B4,\n\t13984: 0x6D41,\n\t13985: 0x6E9C,\n\t13986: 0x700F,\n\t13987: 0x7409,\n\t13988: 0x7460,\n\t13989: 0x7559,\n\t13990: 0x7624,\n\t13991: 0x786B,\n\t13992: 0x8B2C,\n\t13993: 0x985E,\n\t13994: 0x516D,\n\t13995: 0x622E,\n\t13996: 0x9678,\n\t13997: 0x4F96,\n\t13998: 0x502B,\n\t13999: 0x5D19,\n\t14000: 0x6DEA,\n\t14001: 0x7DB8,\n\t14002: 0x8F2A,\n\t14003: 0x5F8B,\n\t14004: 0x6144,\n\t14005: 0x6817,\n\t14006: 0xF961,\n\t14007: 0x9686,\n\t14008: 0x52D2,\n\t14009: 0x808B,\n\t14010: 0x51DC,\n\t14011: 0x51CC,\n\t14012: 0x695E,\n\t14013: 0x7A1C,\n\t14014: 0x7DBE,\n\t14015: 0x83F1,\n\t14016: 0x9675,\n\t14017: 0x4FDA,\n\t14018: 0x5229,\n\t14019: 0x5398,\n\t14020: 0x540F,\n\t14021: 0x550E,\n\t14022: 0x5C65,\n\t14023: 0x60A7,\n\t14024: 0x674E,\n\t14025: 0x68A8,\n\t14026: 0x6D6C,\n\t14027: 0x7281,\n\t14028: 0x72F8,\n\t14029: 0x7406,\n\t14030: 0x7483,\n\t14031: 0xF962,\n\t14032: 0x75E2,\n\t14033: 0x7C6C,\n\t14034: 0x7F79,\n\t14035: 0x7FB8,\n\t14036: 0x8389,\n\t14037: 0x88CF,\n\t14038: 0x88E1,\n\t14039: 0x91CC,\n\t14040: 0x91D0,\n\t14041: 0x96E2,\n\t14042: 0x9BC9,\n\t14043: 0x541D,\n\t14044: 0x6F7E,\n\t14045: 0x71D0,\n\t14046: 0x7498,\n\t14047: 0x85FA,\n\t14048: 0x8EAA,\n\t14049: 0x96A3,\n\t14050: 0x9C57,\n\t14051: 0x9E9F,\n\t14052: 0x6797,\n\t14053: 0x6DCB,\n\t14054: 0x7433,\n\t14055: 0x81E8,\n\t14056: 0x9716,\n\t14057: 0x782C,\n\t14058: 0x7ACB,\n\t14059: 0x7B20,\n\t14060: 0x7C92,\n\t14061: 0x6469,\n\t14062: 0x746A,\n\t14063: 0x75F2,\n\t14064: 0x78BC,\n\t14065: 0x78E8,\n\t14066: 0x99AC,\n\t14067: 0x9B54,\n\t14068: 0x9EBB,\n\t14069: 0x5BDE,\n\t14070: 0x5E55,\n\t14071: 0x6F20,\n\t14072: 0x819C,\n\t14073: 0x83AB,\n\t14074: 0x9088,\n\t14075: 0x4E07,\n\t14076: 0x534D,\n\t14077: 0x5A29,\n\t14078: 0x5DD2,\n\t14079: 0x5F4E,\n\t14080: 0x6162,\n\t14081: 0x633D,\n\t14082: 0x6669,\n\t14083: 0x66FC,\n\t14084: 0x6EFF,\n\t14085: 0x6F2B,\n\t14086: 0x7063,\n\t14087: 0x779E,\n\t14088: 0x842C,\n\t14089: 0x8513,\n\t14090: 0x883B,\n\t14091: 0x8F13,\n\t14092: 0x9945,\n\t14093: 0x9C3B,\n\t14094: 0x551C,\n\t14095: 0x62B9,\n\t14096: 0x672B,\n\t14097: 0x6CAB,\n\t14098: 0x8309,\n\t14099: 0x896A,\n\t14100: 0x977A,\n\t14101: 0x4EA1,\n\t14102: 0x5984,\n\t14103: 0x5FD8,\n\t14104: 0x5FD9,\n\t14105: 0x671B,\n\t14106: 0x7DB2,\n\t14107: 0x7F54,\n\t14108: 0x8292,\n\t14109: 0x832B,\n\t14110: 0x83BD,\n\t14111: 0x8F1E,\n\t14112: 0x9099,\n\t14113: 0x57CB,\n\t14114: 0x59B9,\n\t14115: 0x5A92,\n\t14116: 0x5BD0,\n\t14117: 0x6627,\n\t14118: 0x679A,\n\t14119: 0x6885,\n\t14120: 0x6BCF,\n\t14121: 0x7164,\n\t14122: 0x7F75,\n\t14123: 0x8CB7,\n\t14124: 0x8CE3,\n\t14125: 0x9081,\n\t14126: 0x9B45,\n\t14127: 0x8108,\n\t14128: 0x8C8A,\n\t14129: 0x964C,\n\t14130: 0x9A40,\n\t14131: 0x9EA5,\n\t14132: 0x5B5F,\n\t14133: 0x6C13,\n\t14134: 0x731B,\n\t14135: 0x76F2,\n\t14136: 0x76DF,\n\t14137: 0x840C,\n\t14138: 0x51AA,\n\t14139: 0x8993,\n\t14140: 0x514D,\n\t14141: 0x5195,\n\t14142: 0x52C9,\n\t14143: 0x68C9,\n\t14144: 0x6C94,\n\t14145: 0x7704,\n\t14146: 0x7720,\n\t14147: 0x7DBF,\n\t14148: 0x7DEC,\n\t14149: 0x9762,\n\t14150: 0x9EB5,\n\t14151: 0x6EC5,\n\t14152: 0x8511,\n\t14153: 0x51A5,\n\t14154: 0x540D,\n\t14155: 0x547D,\n\t14156: 0x660E,\n\t14157: 0x669D,\n\t14158: 0x6927,\n\t14159: 0x6E9F,\n\t14160: 0x76BF,\n\t14161: 0x7791,\n\t14162: 0x8317,\n\t14163: 0x84C2,\n\t14164: 0x879F,\n\t14165: 0x9169,\n\t14166: 0x9298,\n\t14167: 0x9CF4,\n\t14168: 0x8882,\n\t14169: 0x4FAE,\n\t14170: 0x5192,\n\t14171: 0x52DF,\n\t14172: 0x59C6,\n\t14173: 0x5E3D,\n\t14174: 0x6155,\n\t14175: 0x6478,\n\t14176: 0x6479,\n\t14177: 0x66AE,\n\t14178: 0x67D0,\n\t14179: 0x6A21,\n\t14180: 0x6BCD,\n\t14181: 0x6BDB,\n\t14182: 0x725F,\n\t14183: 0x7261,\n\t14184: 0x7441,\n\t14185: 0x7738,\n\t14186: 0x77DB,\n\t14187: 0x8017,\n\t14188: 0x82BC,\n\t14189: 0x8305,\n\t14190: 0x8B00,\n\t14191: 0x8B28,\n\t14192: 0x8C8C,\n\t14193: 0x6728,\n\t14194: 0x6C90,\n\t14195: 0x7267,\n\t14196: 0x76EE,\n\t14197: 0x7766,\n\t14198: 0x7A46,\n\t14199: 0x9DA9,\n\t14200: 0x6B7F,\n\t14201: 0x6C92,\n\t14202: 0x5922,\n\t14203: 0x6726,\n\t14204: 0x8499,\n\t14205: 0x536F,\n\t14206: 0x5893,\n\t14207: 0x5999,\n\t14208: 0x5EDF,\n\t14209: 0x63CF,\n\t14210: 0x6634,\n\t14211: 0x6773,\n\t14212: 0x6E3A,\n\t14213: 0x732B,\n\t14214: 0x7AD7,\n\t14215: 0x82D7,\n\t14216: 0x9328,\n\t14217: 0x52D9,\n\t14218: 0x5DEB,\n\t14219: 0x61AE,\n\t14220: 0x61CB,\n\t14221: 0x620A,\n\t14222: 0x62C7,\n\t14223: 0x64AB,\n\t14224: 0x65E0,\n\t14225: 0x6959,\n\t14226: 0x6B66,\n\t14227: 0x6BCB,\n\t14228: 0x7121,\n\t14229: 0x73F7,\n\t14230: 0x755D,\n\t14231: 0x7E46,\n\t14232: 0x821E,\n\t14233: 0x8302,\n\t14234: 0x856A,\n\t14235: 0x8AA3,\n\t14236: 0x8CBF,\n\t14237: 0x9727,\n\t14238: 0x9D61,\n\t14239: 0x58A8,\n\t14240: 0x9ED8,\n\t14241: 0x5011,\n\t14242: 0x520E,\n\t14243: 0x543B,\n\t14244: 0x554F,\n\t14245: 0x6587,\n\t14246: 0x6C76,\n\t14247: 0x7D0A,\n\t14248: 0x7D0B,\n\t14249: 0x805E,\n\t14250: 0x868A,\n\t14251: 0x9580,\n\t14252: 0x96EF,\n\t14253: 0x52FF,\n\t14254: 0x6C95,\n\t14255: 0x7269,\n\t14256: 0x5473,\n\t14257: 0x5A9A,\n\t14258: 0x5C3E,\n\t14259: 0x5D4B,\n\t14260: 0x5F4C,\n\t14261: 0x5FAE,\n\t14262: 0x672A,\n\t14263: 0x68B6,\n\t14264: 0x6963,\n\t14265: 0x6E3C,\n\t14266: 0x6E44,\n\t14267: 0x7709,\n\t14268: 0x7C73,\n\t14269: 0x7F8E,\n\t14270: 0x8587,\n\t14271: 0x8B0E,\n\t14272: 0x8FF7,\n\t14273: 0x9761,\n\t14274: 0x9EF4,\n\t14275: 0x5CB7,\n\t14276: 0x60B6,\n\t14277: 0x610D,\n\t14278: 0x61AB,\n\t14279: 0x654F,\n\t14280: 0x65FB,\n\t14281: 0x65FC,\n\t14282: 0x6C11,\n\t14283: 0x6CEF,\n\t14284: 0x739F,\n\t14285: 0x73C9,\n\t14286: 0x7DE1,\n\t14287: 0x9594,\n\t14288: 0x5BC6,\n\t14289: 0x871C,\n\t14290: 0x8B10,\n\t14291: 0x525D,\n\t14292: 0x535A,\n\t14293: 0x62CD,\n\t14294: 0x640F,\n\t14295: 0x64B2,\n\t14296: 0x6734,\n\t14297: 0x6A38,\n\t14298: 0x6CCA,\n\t14299: 0x73C0,\n\t14300: 0x749E,\n\t14301: 0x7B94,\n\t14302: 0x7C95,\n\t14303: 0x7E1B,\n\t14304: 0x818A,\n\t14305: 0x8236,\n\t14306: 0x8584,\n\t14307: 0x8FEB,\n\t14308: 0x96F9,\n\t14309: 0x99C1,\n\t14310: 0x4F34,\n\t14311: 0x534A,\n\t14312: 0x53CD,\n\t14313: 0x53DB,\n\t14314: 0x62CC,\n\t14315: 0x642C,\n\t14316: 0x6500,\n\t14317: 0x6591,\n\t14318: 0x69C3,\n\t14319: 0x6CEE,\n\t14320: 0x6F58,\n\t14321: 0x73ED,\n\t14322: 0x7554,\n\t14323: 0x7622,\n\t14324: 0x76E4,\n\t14325: 0x76FC,\n\t14326: 0x78D0,\n\t14327: 0x78FB,\n\t14328: 0x792C,\n\t14329: 0x7D46,\n\t14330: 0x822C,\n\t14331: 0x87E0,\n\t14332: 0x8FD4,\n\t14333: 0x9812,\n\t14334: 0x98EF,\n\t14335: 0x52C3,\n\t14336: 0x62D4,\n\t14337: 0x64A5,\n\t14338: 0x6E24,\n\t14339: 0x6F51,\n\t14340: 0x767C,\n\t14341: 0x8DCB,\n\t14342: 0x91B1,\n\t14343: 0x9262,\n\t14344: 0x9AEE,\n\t14345: 0x9B43,\n\t14346: 0x5023,\n\t14347: 0x508D,\n\t14348: 0x574A,\n\t14349: 0x59A8,\n\t14350: 0x5C28,\n\t14351: 0x5E47,\n\t14352: 0x5F77,\n\t14353: 0x623F,\n\t14354: 0x653E,\n\t14355: 0x65B9,\n\t14356: 0x65C1,\n\t14357: 0x6609,\n\t14358: 0x678B,\n\t14359: 0x699C,\n\t14360: 0x6EC2,\n\t14361: 0x78C5,\n\t14362: 0x7D21,\n\t14363: 0x80AA,\n\t14364: 0x8180,\n\t14365: 0x822B,\n\t14366: 0x82B3,\n\t14367: 0x84A1,\n\t14368: 0x868C,\n\t14369: 0x8A2A,\n\t14370: 0x8B17,\n\t14371: 0x90A6,\n\t14372: 0x9632,\n\t14373: 0x9F90,\n\t14374: 0x500D,\n\t14375: 0x4FF3,\n\t14376: 0xF963,\n\t14377: 0x57F9,\n\t14378: 0x5F98,\n\t14379: 0x62DC,\n\t14380: 0x6392,\n\t14381: 0x676F,\n\t14382: 0x6E43,\n\t14383: 0x7119,\n\t14384: 0x76C3,\n\t14385: 0x80CC,\n\t14386: 0x80DA,\n\t14387: 0x88F4,\n\t14388: 0x88F5,\n\t14389: 0x8919,\n\t14390: 0x8CE0,\n\t14391: 0x8F29,\n\t14392: 0x914D,\n\t14393: 0x966A,\n\t14394: 0x4F2F,\n\t14395: 0x4F70,\n\t14396: 0x5E1B,\n\t14397: 0x67CF,\n\t14398: 0x6822,\n\t14399: 0x767D,\n\t14400: 0x767E,\n\t14401: 0x9B44,\n\t14402: 0x5E61,\n\t14403: 0x6A0A,\n\t14404: 0x7169,\n\t14405: 0x71D4,\n\t14406: 0x756A,\n\t14407: 0xF964,\n\t14408: 0x7E41,\n\t14409: 0x8543,\n\t14410: 0x85E9,\n\t14411: 0x98DC,\n\t14412: 0x4F10,\n\t14413: 0x7B4F,\n\t14414: 0x7F70,\n\t14415: 0x95A5,\n\t14416: 0x51E1,\n\t14417: 0x5E06,\n\t14418: 0x68B5,\n\t14419: 0x6C3E,\n\t14420: 0x6C4E,\n\t14421: 0x6CDB,\n\t14422: 0x72AF,\n\t14423: 0x7BC4,\n\t14424: 0x8303,\n\t14425: 0x6CD5,\n\t14426: 0x743A,\n\t14427: 0x50FB,\n\t14428: 0x5288,\n\t14429: 0x58C1,\n\t14430: 0x64D8,\n\t14431: 0x6A97,\n\t14432: 0x74A7,\n\t14433: 0x7656,\n\t14434: 0x78A7,\n\t14435: 0x8617,\n\t14436: 0x95E2,\n\t14437: 0x9739,\n\t14438: 0xF965,\n\t14439: 0x535E,\n\t14440: 0x5F01,\n\t14441: 0x8B8A,\n\t14442: 0x8FA8,\n\t14443: 0x8FAF,\n\t14444: 0x908A,\n\t14445: 0x5225,\n\t14446: 0x77A5,\n\t14447: 0x9C49,\n\t14448: 0x9F08,\n\t14449: 0x4E19,\n\t14450: 0x5002,\n\t14451: 0x5175,\n\t14452: 0x5C5B,\n\t14453: 0x5E77,\n\t14454: 0x661E,\n\t14455: 0x663A,\n\t14456: 0x67C4,\n\t14457: 0x68C5,\n\t14458: 0x70B3,\n\t14459: 0x7501,\n\t14460: 0x75C5,\n\t14461: 0x79C9,\n\t14462: 0x7ADD,\n\t14463: 0x8F27,\n\t14464: 0x9920,\n\t14465: 0x9A08,\n\t14466: 0x4FDD,\n\t14467: 0x5821,\n\t14468: 0x5831,\n\t14469: 0x5BF6,\n\t14470: 0x666E,\n\t14471: 0x6B65,\n\t14472: 0x6D11,\n\t14473: 0x6E7A,\n\t14474: 0x6F7D,\n\t14475: 0x73E4,\n\t14476: 0x752B,\n\t14477: 0x83E9,\n\t14478: 0x88DC,\n\t14479: 0x8913,\n\t14480: 0x8B5C,\n\t14481: 0x8F14,\n\t14482: 0x4F0F,\n\t14483: 0x50D5,\n\t14484: 0x5310,\n\t14485: 0x535C,\n\t14486: 0x5B93,\n\t14487: 0x5FA9,\n\t14488: 0x670D,\n\t14489: 0x798F,\n\t14490: 0x8179,\n\t14491: 0x832F,\n\t14492: 0x8514,\n\t14493: 0x8907,\n\t14494: 0x8986,\n\t14495: 0x8F39,\n\t14496: 0x8F3B,\n\t14497: 0x99A5,\n\t14498: 0x9C12,\n\t14499: 0x672C,\n\t14500: 0x4E76,\n\t14501: 0x4FF8,\n\t14502: 0x5949,\n\t14503: 0x5C01,\n\t14504: 0x5CEF,\n\t14505: 0x5CF0,\n\t14506: 0x6367,\n\t14507: 0x68D2,\n\t14508: 0x70FD,\n\t14509: 0x71A2,\n\t14510: 0x742B,\n\t14511: 0x7E2B,\n\t14512: 0x84EC,\n\t14513: 0x8702,\n\t14514: 0x9022,\n\t14515: 0x92D2,\n\t14516: 0x9CF3,\n\t14517: 0x4E0D,\n\t14518: 0x4ED8,\n\t14519: 0x4FEF,\n\t14520: 0x5085,\n\t14521: 0x5256,\n\t14522: 0x526F,\n\t14523: 0x5426,\n\t14524: 0x5490,\n\t14525: 0x57E0,\n\t14526: 0x592B,\n\t14527: 0x5A66,\n\t14528: 0x5B5A,\n\t14529: 0x5B75,\n\t14530: 0x5BCC,\n\t14531: 0x5E9C,\n\t14532: 0xF966,\n\t14533: 0x6276,\n\t14534: 0x6577,\n\t14535: 0x65A7,\n\t14536: 0x6D6E,\n\t14537: 0x6EA5,\n\t14538: 0x7236,\n\t14539: 0x7B26,\n\t14540: 0x7C3F,\n\t14541: 0x7F36,\n\t14542: 0x8150,\n\t14543: 0x8151,\n\t14544: 0x819A,\n\t14545: 0x8240,\n\t14546: 0x8299,\n\t14547: 0x83A9,\n\t14548: 0x8A03,\n\t14549: 0x8CA0,\n\t14550: 0x8CE6,\n\t14551: 0x8CFB,\n\t14552: 0x8D74,\n\t14553: 0x8DBA,\n\t14554: 0x90E8,\n\t14555: 0x91DC,\n\t14556: 0x961C,\n\t14557: 0x9644,\n\t14558: 0x99D9,\n\t14559: 0x9CE7,\n\t14560: 0x5317,\n\t14561: 0x5206,\n\t14562: 0x5429,\n\t14563: 0x5674,\n\t14564: 0x58B3,\n\t14565: 0x5954,\n\t14566: 0x596E,\n\t14567: 0x5FFF,\n\t14568: 0x61A4,\n\t14569: 0x626E,\n\t14570: 0x6610,\n\t14571: 0x6C7E,\n\t14572: 0x711A,\n\t14573: 0x76C6,\n\t14574: 0x7C89,\n\t14575: 0x7CDE,\n\t14576: 0x7D1B,\n\t14577: 0x82AC,\n\t14578: 0x8CC1,\n\t14579: 0x96F0,\n\t14580: 0xF967,\n\t14581: 0x4F5B,\n\t14582: 0x5F17,\n\t14583: 0x5F7F,\n\t14584: 0x62C2,\n\t14585: 0x5D29,\n\t14586: 0x670B,\n\t14587: 0x68DA,\n\t14588: 0x787C,\n\t14589: 0x7E43,\n\t14590: 0x9D6C,\n\t14591: 0x4E15,\n\t14592: 0x5099,\n\t14593: 0x5315,\n\t14594: 0x532A,\n\t14595: 0x5351,\n\t14596: 0x5983,\n\t14597: 0x5A62,\n\t14598: 0x5E87,\n\t14599: 0x60B2,\n\t14600: 0x618A,\n\t14601: 0x6249,\n\t14602: 0x6279,\n\t14603: 0x6590,\n\t14604: 0x6787,\n\t14605: 0x69A7,\n\t14606: 0x6BD4,\n\t14607: 0x6BD6,\n\t14608: 0x6BD7,\n\t14609: 0x6BD8,\n\t14610: 0x6CB8,\n\t14611: 0xF968,\n\t14612: 0x7435,\n\t14613: 0x75FA,\n\t14614: 0x7812,\n\t14615: 0x7891,\n\t14616: 0x79D5,\n\t14617: 0x79D8,\n\t14618: 0x7C83,\n\t14619: 0x7DCB,\n\t14620: 0x7FE1,\n\t14621: 0x80A5,\n\t14622: 0x813E,\n\t14623: 0x81C2,\n\t14624: 0x83F2,\n\t14625: 0x871A,\n\t14626: 0x88E8,\n\t14627: 0x8AB9,\n\t14628: 0x8B6C,\n\t14629: 0x8CBB,\n\t14630: 0x9119,\n\t14631: 0x975E,\n\t14632: 0x98DB,\n\t14633: 0x9F3B,\n\t14634: 0x56AC,\n\t14635: 0x5B2A,\n\t14636: 0x5F6C,\n\t14637: 0x658C,\n\t14638: 0x6AB3,\n\t14639: 0x6BAF,\n\t14640: 0x6D5C,\n\t14641: 0x6FF1,\n\t14642: 0x7015,\n\t14643: 0x725D,\n\t14644: 0x73AD,\n\t14645: 0x8CA7,\n\t14646: 0x8CD3,\n\t14647: 0x983B,\n\t14648: 0x6191,\n\t14649: 0x6C37,\n\t14650: 0x8058,\n\t14651: 0x9A01,\n\t14652: 0x4E4D,\n\t14653: 0x4E8B,\n\t14654: 0x4E9B,\n\t14655: 0x4ED5,\n\t14656: 0x4F3A,\n\t14657: 0x4F3C,\n\t14658: 0x4F7F,\n\t14659: 0x4FDF,\n\t14660: 0x50FF,\n\t14661: 0x53F2,\n\t14662: 0x53F8,\n\t14663: 0x5506,\n\t14664: 0x55E3,\n\t14665: 0x56DB,\n\t14666: 0x58EB,\n\t14667: 0x5962,\n\t14668: 0x5A11,\n\t14669: 0x5BEB,\n\t14670: 0x5BFA,\n\t14671: 0x5C04,\n\t14672: 0x5DF3,\n\t14673: 0x5E2B,\n\t14674: 0x5F99,\n\t14675: 0x601D,\n\t14676: 0x6368,\n\t14677: 0x659C,\n\t14678: 0x65AF,\n\t14679: 0x67F6,\n\t14680: 0x67FB,\n\t14681: 0x68AD,\n\t14682: 0x6B7B,\n\t14683: 0x6C99,\n\t14684: 0x6CD7,\n\t14685: 0x6E23,\n\t14686: 0x7009,\n\t14687: 0x7345,\n\t14688: 0x7802,\n\t14689: 0x793E,\n\t14690: 0x7940,\n\t14691: 0x7960,\n\t14692: 0x79C1,\n\t14693: 0x7BE9,\n\t14694: 0x7D17,\n\t14695: 0x7D72,\n\t14696: 0x8086,\n\t14697: 0x820D,\n\t14698: 0x838E,\n\t14699: 0x84D1,\n\t14700: 0x86C7,\n\t14701: 0x88DF,\n\t14702: 0x8A50,\n\t14703: 0x8A5E,\n\t14704: 0x8B1D,\n\t14705: 0x8CDC,\n\t14706: 0x8D66,\n\t14707: 0x8FAD,\n\t14708: 0x90AA,\n\t14709: 0x98FC,\n\t14710: 0x99DF,\n\t14711: 0x9E9D,\n\t14712: 0x524A,\n\t14713: 0xF969,\n\t14714: 0x6714,\n\t14715: 0xF96A,\n\t14716: 0x5098,\n\t14717: 0x522A,\n\t14718: 0x5C71,\n\t14719: 0x6563,\n\t14720: 0x6C55,\n\t14721: 0x73CA,\n\t14722: 0x7523,\n\t14723: 0x759D,\n\t14724: 0x7B97,\n\t14725: 0x849C,\n\t14726: 0x9178,\n\t14727: 0x9730,\n\t14728: 0x4E77,\n\t14729: 0x6492,\n\t14730: 0x6BBA,\n\t14731: 0x715E,\n\t14732: 0x85A9,\n\t14733: 0x4E09,\n\t14734: 0xF96B,\n\t14735: 0x6749,\n\t14736: 0x68EE,\n\t14737: 0x6E17,\n\t14738: 0x829F,\n\t14739: 0x8518,\n\t14740: 0x886B,\n\t14741: 0x63F7,\n\t14742: 0x6F81,\n\t14743: 0x9212,\n\t14744: 0x98AF,\n\t14745: 0x4E0A,\n\t14746: 0x50B7,\n\t14747: 0x50CF,\n\t14748: 0x511F,\n\t14749: 0x5546,\n\t14750: 0x55AA,\n\t14751: 0x5617,\n\t14752: 0x5B40,\n\t14753: 0x5C19,\n\t14754: 0x5CE0,\n\t14755: 0x5E38,\n\t14756: 0x5E8A,\n\t14757: 0x5EA0,\n\t14758: 0x5EC2,\n\t14759: 0x60F3,\n\t14760: 0x6851,\n\t14761: 0x6A61,\n\t14762: 0x6E58,\n\t14763: 0x723D,\n\t14764: 0x7240,\n\t14765: 0x72C0,\n\t14766: 0x76F8,\n\t14767: 0x7965,\n\t14768: 0x7BB1,\n\t14769: 0x7FD4,\n\t14770: 0x88F3,\n\t14771: 0x89F4,\n\t14772: 0x8A73,\n\t14773: 0x8C61,\n\t14774: 0x8CDE,\n\t14775: 0x971C,\n\t14776: 0x585E,\n\t14777: 0x74BD,\n\t14778: 0x8CFD,\n\t14779: 0x55C7,\n\t14780: 0xF96C,\n\t14781: 0x7A61,\n\t14782: 0x7D22,\n\t14783: 0x8272,\n\t14784: 0x7272,\n\t14785: 0x751F,\n\t14786: 0x7525,\n\t14787: 0xF96D,\n\t14788: 0x7B19,\n\t14789: 0x5885,\n\t14790: 0x58FB,\n\t14791: 0x5DBC,\n\t14792: 0x5E8F,\n\t14793: 0x5EB6,\n\t14794: 0x5F90,\n\t14795: 0x6055,\n\t14796: 0x6292,\n\t14797: 0x637F,\n\t14798: 0x654D,\n\t14799: 0x6691,\n\t14800: 0x66D9,\n\t14801: 0x66F8,\n\t14802: 0x6816,\n\t14803: 0x68F2,\n\t14804: 0x7280,\n\t14805: 0x745E,\n\t14806: 0x7B6E,\n\t14807: 0x7D6E,\n\t14808: 0x7DD6,\n\t14809: 0x7F72,\n\t14810: 0x80E5,\n\t14811: 0x8212,\n\t14812: 0x85AF,\n\t14813: 0x897F,\n\t14814: 0x8A93,\n\t14815: 0x901D,\n\t14816: 0x92E4,\n\t14817: 0x9ECD,\n\t14818: 0x9F20,\n\t14819: 0x5915,\n\t14820: 0x596D,\n\t14821: 0x5E2D,\n\t14822: 0x60DC,\n\t14823: 0x6614,\n\t14824: 0x6673,\n\t14825: 0x6790,\n\t14826: 0x6C50,\n\t14827: 0x6DC5,\n\t14828: 0x6F5F,\n\t14829: 0x77F3,\n\t14830: 0x78A9,\n\t14831: 0x84C6,\n\t14832: 0x91CB,\n\t14833: 0x932B,\n\t14834: 0x4ED9,\n\t14835: 0x50CA,\n\t14836: 0x5148,\n\t14837: 0x5584,\n\t14838: 0x5B0B,\n\t14839: 0x5BA3,\n\t14840: 0x6247,\n\t14841: 0x657E,\n\t14842: 0x65CB,\n\t14843: 0x6E32,\n\t14844: 0x717D,\n\t14845: 0x7401,\n\t14846: 0x7444,\n\t14847: 0x7487,\n\t14848: 0x74BF,\n\t14849: 0x766C,\n\t14850: 0x79AA,\n\t14851: 0x7DDA,\n\t14852: 0x7E55,\n\t14853: 0x7FA8,\n\t14854: 0x817A,\n\t14855: 0x81B3,\n\t14856: 0x8239,\n\t14857: 0x861A,\n\t14858: 0x87EC,\n\t14859: 0x8A75,\n\t14860: 0x8DE3,\n\t14861: 0x9078,\n\t14862: 0x9291,\n\t14863: 0x9425,\n\t14864: 0x994D,\n\t14865: 0x9BAE,\n\t14866: 0x5368,\n\t14867: 0x5C51,\n\t14868: 0x6954,\n\t14869: 0x6CC4,\n\t14870: 0x6D29,\n\t14871: 0x6E2B,\n\t14872: 0x820C,\n\t14873: 0x859B,\n\t14874: 0x893B,\n\t14875: 0x8A2D,\n\t14876: 0x8AAA,\n\t14877: 0x96EA,\n\t14878: 0x9F67,\n\t14879: 0x5261,\n\t14880: 0x66B9,\n\t14881: 0x6BB2,\n\t14882: 0x7E96,\n\t14883: 0x87FE,\n\t14884: 0x8D0D,\n\t14885: 0x9583,\n\t14886: 0x965D,\n\t14887: 0x651D,\n\t14888: 0x6D89,\n\t14889: 0x71EE,\n\t14890: 0xF96E,\n\t14891: 0x57CE,\n\t14892: 0x59D3,\n\t14893: 0x5BAC,\n\t14894: 0x6027,\n\t14895: 0x60FA,\n\t14896: 0x6210,\n\t14897: 0x661F,\n\t14898: 0x665F,\n\t14899: 0x7329,\n\t14900: 0x73F9,\n\t14901: 0x76DB,\n\t14902: 0x7701,\n\t14903: 0x7B6C,\n\t14904: 0x8056,\n\t14905: 0x8072,\n\t14906: 0x8165,\n\t14907: 0x8AA0,\n\t14908: 0x9192,\n\t14909: 0x4E16,\n\t14910: 0x52E2,\n\t14911: 0x6B72,\n\t14912: 0x6D17,\n\t14913: 0x7A05,\n\t14914: 0x7B39,\n\t14915: 0x7D30,\n\t14916: 0xF96F,\n\t14917: 0x8CB0,\n\t14918: 0x53EC,\n\t14919: 0x562F,\n\t14920: 0x5851,\n\t14921: 0x5BB5,\n\t14922: 0x5C0F,\n\t14923: 0x5C11,\n\t14924: 0x5DE2,\n\t14925: 0x6240,\n\t14926: 0x6383,\n\t14927: 0x6414,\n\t14928: 0x662D,\n\t14929: 0x68B3,\n\t14930: 0x6CBC,\n\t14931: 0x6D88,\n\t14932: 0x6EAF,\n\t14933: 0x701F,\n\t14934: 0x70A4,\n\t14935: 0x71D2,\n\t14936: 0x7526,\n\t14937: 0x758F,\n\t14938: 0x758E,\n\t14939: 0x7619,\n\t14940: 0x7B11,\n\t14941: 0x7BE0,\n\t14942: 0x7C2B,\n\t14943: 0x7D20,\n\t14944: 0x7D39,\n\t14945: 0x852C,\n\t14946: 0x856D,\n\t14947: 0x8607,\n\t14948: 0x8A34,\n\t14949: 0x900D,\n\t14950: 0x9061,\n\t14951: 0x90B5,\n\t14952: 0x92B7,\n\t14953: 0x97F6,\n\t14954: 0x9A37,\n\t14955: 0x4FD7,\n\t14956: 0x5C6C,\n\t14957: 0x675F,\n\t14958: 0x6D91,\n\t14959: 0x7C9F,\n\t14960: 0x7E8C,\n\t14961: 0x8B16,\n\t14962: 0x8D16,\n\t14963: 0x901F,\n\t14964: 0x5B6B,\n\t14965: 0x5DFD,\n\t14966: 0x640D,\n\t14967: 0x84C0,\n\t14968: 0x905C,\n\t14969: 0x98E1,\n\t14970: 0x7387,\n\t14971: 0x5B8B,\n\t14972: 0x609A,\n\t14973: 0x677E,\n\t14974: 0x6DDE,\n\t14975: 0x8A1F,\n\t14976: 0x8AA6,\n\t14977: 0x9001,\n\t14978: 0x980C,\n\t14979: 0x5237,\n\t14980: 0xF970,\n\t14981: 0x7051,\n\t14982: 0x788E,\n\t14983: 0x9396,\n\t14984: 0x8870,\n\t14985: 0x91D7,\n\t14986: 0x4FEE,\n\t14987: 0x53D7,\n\t14988: 0x55FD,\n\t14989: 0x56DA,\n\t14990: 0x5782,\n\t14991: 0x58FD,\n\t14992: 0x5AC2,\n\t14993: 0x5B88,\n\t14994: 0x5CAB,\n\t14995: 0x5CC0,\n\t14996: 0x5E25,\n\t14997: 0x6101,\n\t14998: 0x620D,\n\t14999: 0x624B,\n\t15000: 0x6388,\n\t15001: 0x641C,\n\t15002: 0x6536,\n\t15003: 0x6578,\n\t15004: 0x6A39,\n\t15005: 0x6B8A,\n\t15006: 0x6C34,\n\t15007: 0x6D19,\n\t15008: 0x6F31,\n\t15009: 0x71E7,\n\t15010: 0x72E9,\n\t15011: 0x7378,\n\t15012: 0x7407,\n\t15013: 0x74B2,\n\t15014: 0x7626,\n\t15015: 0x7761,\n\t15016: 0x79C0,\n\t15017: 0x7A57,\n\t15018: 0x7AEA,\n\t15019: 0x7CB9,\n\t15020: 0x7D8F,\n\t15021: 0x7DAC,\n\t15022: 0x7E61,\n\t15023: 0x7F9E,\n\t15024: 0x8129,\n\t15025: 0x8331,\n\t15026: 0x8490,\n\t15027: 0x84DA,\n\t15028: 0x85EA,\n\t15029: 0x8896,\n\t15030: 0x8AB0,\n\t15031: 0x8B90,\n\t15032: 0x8F38,\n\t15033: 0x9042,\n\t15034: 0x9083,\n\t15035: 0x916C,\n\t15036: 0x9296,\n\t15037: 0x92B9,\n\t15038: 0x968B,\n\t15039: 0x96A7,\n\t15040: 0x96A8,\n\t15041: 0x96D6,\n\t15042: 0x9700,\n\t15043: 0x9808,\n\t15044: 0x9996,\n\t15045: 0x9AD3,\n\t15046: 0x9B1A,\n\t15047: 0x53D4,\n\t15048: 0x587E,\n\t15049: 0x5919,\n\t15050: 0x5B70,\n\t15051: 0x5BBF,\n\t15052: 0x6DD1,\n\t15053: 0x6F5A,\n\t15054: 0x719F,\n\t15055: 0x7421,\n\t15056: 0x74B9,\n\t15057: 0x8085,\n\t15058: 0x83FD,\n\t15059: 0x5DE1,\n\t15060: 0x5F87,\n\t15061: 0x5FAA,\n\t15062: 0x6042,\n\t15063: 0x65EC,\n\t15064: 0x6812,\n\t15065: 0x696F,\n\t15066: 0x6A53,\n\t15067: 0x6B89,\n\t15068: 0x6D35,\n\t15069: 0x6DF3,\n\t15070: 0x73E3,\n\t15071: 0x76FE,\n\t15072: 0x77AC,\n\t15073: 0x7B4D,\n\t15074: 0x7D14,\n\t15075: 0x8123,\n\t15076: 0x821C,\n\t15077: 0x8340,\n\t15078: 0x84F4,\n\t15079: 0x8563,\n\t15080: 0x8A62,\n\t15081: 0x8AC4,\n\t15082: 0x9187,\n\t15083: 0x931E,\n\t15084: 0x9806,\n\t15085: 0x99B4,\n\t15086: 0x620C,\n\t15087: 0x8853,\n\t15088: 0x8FF0,\n\t15089: 0x9265,\n\t15090: 0x5D07,\n\t15091: 0x5D27,\n\t15092: 0x5D69,\n\t15093: 0x745F,\n\t15094: 0x819D,\n\t15095: 0x8768,\n\t15096: 0x6FD5,\n\t15097: 0x62FE,\n\t15098: 0x7FD2,\n\t15099: 0x8936,\n\t15100: 0x8972,\n\t15101: 0x4E1E,\n\t15102: 0x4E58,\n\t15103: 0x50E7,\n\t15104: 0x52DD,\n\t15105: 0x5347,\n\t15106: 0x627F,\n\t15107: 0x6607,\n\t15108: 0x7E69,\n\t15109: 0x8805,\n\t15110: 0x965E,\n\t15111: 0x4F8D,\n\t15112: 0x5319,\n\t15113: 0x5636,\n\t15114: 0x59CB,\n\t15115: 0x5AA4,\n\t15116: 0x5C38,\n\t15117: 0x5C4E,\n\t15118: 0x5C4D,\n\t15119: 0x5E02,\n\t15120: 0x5F11,\n\t15121: 0x6043,\n\t15122: 0x65BD,\n\t15123: 0x662F,\n\t15124: 0x6642,\n\t15125: 0x67BE,\n\t15126: 0x67F4,\n\t15127: 0x731C,\n\t15128: 0x77E2,\n\t15129: 0x793A,\n\t15130: 0x7FC5,\n\t15131: 0x8494,\n\t15132: 0x84CD,\n\t15133: 0x8996,\n\t15134: 0x8A66,\n\t15135: 0x8A69,\n\t15136: 0x8AE1,\n\t15137: 0x8C55,\n\t15138: 0x8C7A,\n\t15139: 0x57F4,\n\t15140: 0x5BD4,\n\t15141: 0x5F0F,\n\t15142: 0x606F,\n\t15143: 0x62ED,\n\t15144: 0x690D,\n\t15145: 0x6B96,\n\t15146: 0x6E5C,\n\t15147: 0x7184,\n\t15148: 0x7BD2,\n\t15149: 0x8755,\n\t15150: 0x8B58,\n\t15151: 0x8EFE,\n\t15152: 0x98DF,\n\t15153: 0x98FE,\n\t15154: 0x4F38,\n\t15155: 0x4F81,\n\t15156: 0x4FE1,\n\t15157: 0x547B,\n\t15158: 0x5A20,\n\t15159: 0x5BB8,\n\t15160: 0x613C,\n\t15161: 0x65B0,\n\t15162: 0x6668,\n\t15163: 0x71FC,\n\t15164: 0x7533,\n\t15165: 0x795E,\n\t15166: 0x7D33,\n\t15167: 0x814E,\n\t15168: 0x81E3,\n\t15169: 0x8398,\n\t15170: 0x85AA,\n\t15171: 0x85CE,\n\t15172: 0x8703,\n\t15173: 0x8A0A,\n\t15174: 0x8EAB,\n\t15175: 0x8F9B,\n\t15176: 0xF971,\n\t15177: 0x8FC5,\n\t15178: 0x5931,\n\t15179: 0x5BA4,\n\t15180: 0x5BE6,\n\t15181: 0x6089,\n\t15182: 0x5BE9,\n\t15183: 0x5C0B,\n\t15184: 0x5FC3,\n\t15185: 0x6C81,\n\t15186: 0xF972,\n\t15187: 0x6DF1,\n\t15188: 0x700B,\n\t15189: 0x751A,\n\t15190: 0x82AF,\n\t15191: 0x8AF6,\n\t15192: 0x4EC0,\n\t15193: 0x5341,\n\t15194: 0xF973,\n\t15195: 0x96D9,\n\t15196: 0x6C0F,\n\t15197: 0x4E9E,\n\t15198: 0x4FC4,\n\t15199: 0x5152,\n\t15200: 0x555E,\n\t15201: 0x5A25,\n\t15202: 0x5CE8,\n\t15203: 0x6211,\n\t15204: 0x7259,\n\t15205: 0x82BD,\n\t15206: 0x83AA,\n\t15207: 0x86FE,\n\t15208: 0x8859,\n\t15209: 0x8A1D,\n\t15210: 0x963F,\n\t15211: 0x96C5,\n\t15212: 0x9913,\n\t15213: 0x9D09,\n\t15214: 0x9D5D,\n\t15215: 0x580A,\n\t15216: 0x5CB3,\n\t15217: 0x5DBD,\n\t15218: 0x5E44,\n\t15219: 0x60E1,\n\t15220: 0x6115,\n\t15221: 0x63E1,\n\t15222: 0x6A02,\n\t15223: 0x6E25,\n\t15224: 0x9102,\n\t15225: 0x9354,\n\t15226: 0x984E,\n\t15227: 0x9C10,\n\t15228: 0x9F77,\n\t15229: 0x5B89,\n\t15230: 0x5CB8,\n\t15231: 0x6309,\n\t15232: 0x664F,\n\t15233: 0x6848,\n\t15234: 0x773C,\n\t15235: 0x96C1,\n\t15236: 0x978D,\n\t15237: 0x9854,\n\t15238: 0x9B9F,\n\t15239: 0x65A1,\n\t15240: 0x8B01,\n\t15241: 0x8ECB,\n\t15242: 0x95BC,\n\t15243: 0x5535,\n\t15244: 0x5CA9,\n\t15245: 0x5DD6,\n\t15246: 0x5EB5,\n\t15247: 0x6697,\n\t15248: 0x764C,\n\t15249: 0x83F4,\n\t15250: 0x95C7,\n\t15251: 0x58D3,\n\t15252: 0x62BC,\n\t15253: 0x72CE,\n\t15254: 0x9D28,\n\t15255: 0x4EF0,\n\t15256: 0x592E,\n\t15257: 0x600F,\n\t15258: 0x663B,\n\t15259: 0x6B83,\n\t15260: 0x79E7,\n\t15261: 0x9D26,\n\t15262: 0x5393,\n\t15263: 0x54C0,\n\t15264: 0x57C3,\n\t15265: 0x5D16,\n\t15266: 0x611B,\n\t15267: 0x66D6,\n\t15268: 0x6DAF,\n\t15269: 0x788D,\n\t15270: 0x827E,\n\t15271: 0x9698,\n\t15272: 0x9744,\n\t15273: 0x5384,\n\t15274: 0x627C,\n\t15275: 0x6396,\n\t15276: 0x6DB2,\n\t15277: 0x7E0A,\n\t15278: 0x814B,\n\t15279: 0x984D,\n\t15280: 0x6AFB,\n\t15281: 0x7F4C,\n\t15282: 0x9DAF,\n\t15283: 0x9E1A,\n\t15284: 0x4E5F,\n\t15285: 0x503B,\n\t15286: 0x51B6,\n\t15287: 0x591C,\n\t15288: 0x60F9,\n\t15289: 0x63F6,\n\t15290: 0x6930,\n\t15291: 0x723A,\n\t15292: 0x8036,\n\t15293: 0xF974,\n\t15294: 0x91CE,\n\t15295: 0x5F31,\n\t15296: 0xF975,\n\t15297: 0xF976,\n\t15298: 0x7D04,\n\t15299: 0x82E5,\n\t15300: 0x846F,\n\t15301: 0x84BB,\n\t15302: 0x85E5,\n\t15303: 0x8E8D,\n\t15304: 0xF977,\n\t15305: 0x4F6F,\n\t15306: 0xF978,\n\t15307: 0xF979,\n\t15308: 0x58E4,\n\t15309: 0x5B43,\n\t15310: 0x6059,\n\t15311: 0x63DA,\n\t15312: 0x6518,\n\t15313: 0x656D,\n\t15314: 0x6698,\n\t15315: 0xF97A,\n\t15316: 0x694A,\n\t15317: 0x6A23,\n\t15318: 0x6D0B,\n\t15319: 0x7001,\n\t15320: 0x716C,\n\t15321: 0x75D2,\n\t15322: 0x760D,\n\t15323: 0x79B3,\n\t15324: 0x7A70,\n\t15325: 0xF97B,\n\t15326: 0x7F8A,\n\t15327: 0xF97C,\n\t15328: 0x8944,\n\t15329: 0xF97D,\n\t15330: 0x8B93,\n\t15331: 0x91C0,\n\t15332: 0x967D,\n\t15333: 0xF97E,\n\t15334: 0x990A,\n\t15335: 0x5704,\n\t15336: 0x5FA1,\n\t15337: 0x65BC,\n\t15338: 0x6F01,\n\t15339: 0x7600,\n\t15340: 0x79A6,\n\t15341: 0x8A9E,\n\t15342: 0x99AD,\n\t15343: 0x9B5A,\n\t15344: 0x9F6C,\n\t15345: 0x5104,\n\t15346: 0x61B6,\n\t15347: 0x6291,\n\t15348: 0x6A8D,\n\t15349: 0x81C6,\n\t15350: 0x5043,\n\t15351: 0x5830,\n\t15352: 0x5F66,\n\t15353: 0x7109,\n\t15354: 0x8A00,\n\t15355: 0x8AFA,\n\t15356: 0x5B7C,\n\t15357: 0x8616,\n\t15358: 0x4FFA,\n\t15359: 0x513C,\n\t15360: 0x56B4,\n\t15361: 0x5944,\n\t15362: 0x63A9,\n\t15363: 0x6DF9,\n\t15364: 0x5DAA,\n\t15365: 0x696D,\n\t15366: 0x5186,\n\t15367: 0x4E88,\n\t15368: 0x4F59,\n\t15369: 0xF97F,\n\t15370: 0xF980,\n\t15371: 0xF981,\n\t15372: 0x5982,\n\t15373: 0xF982,\n\t15374: 0xF983,\n\t15375: 0x6B5F,\n\t15376: 0x6C5D,\n\t15377: 0xF984,\n\t15378: 0x74B5,\n\t15379: 0x7916,\n\t15380: 0xF985,\n\t15381: 0x8207,\n\t15382: 0x8245,\n\t15383: 0x8339,\n\t15384: 0x8F3F,\n\t15385: 0x8F5D,\n\t15386: 0xF986,\n\t15387: 0x9918,\n\t15388: 0xF987,\n\t15389: 0xF988,\n\t15390: 0xF989,\n\t15391: 0x4EA6,\n\t15392: 0xF98A,\n\t15393: 0x57DF,\n\t15394: 0x5F79,\n\t15395: 0x6613,\n\t15396: 0xF98B,\n\t15397: 0xF98C,\n\t15398: 0x75AB,\n\t15399: 0x7E79,\n\t15400: 0x8B6F,\n\t15401: 0xF98D,\n\t15402: 0x9006,\n\t15403: 0x9A5B,\n\t15404: 0x56A5,\n\t15405: 0x5827,\n\t15406: 0x59F8,\n\t15407: 0x5A1F,\n\t15408: 0x5BB4,\n\t15409: 0xF98E,\n\t15410: 0x5EF6,\n\t15411: 0xF98F,\n\t15412: 0xF990,\n\t15413: 0x6350,\n\t15414: 0x633B,\n\t15415: 0xF991,\n\t15416: 0x693D,\n\t15417: 0x6C87,\n\t15418: 0x6CBF,\n\t15419: 0x6D8E,\n\t15420: 0x6D93,\n\t15421: 0x6DF5,\n\t15422: 0x6F14,\n\t15423: 0xF992,\n\t15424: 0x70DF,\n\t15425: 0x7136,\n\t15426: 0x7159,\n\t15427: 0xF993,\n\t15428: 0x71C3,\n\t15429: 0x71D5,\n\t15430: 0xF994,\n\t15431: 0x784F,\n\t15432: 0x786F,\n\t15433: 0xF995,\n\t15434: 0x7B75,\n\t15435: 0x7DE3,\n\t15436: 0xF996,\n\t15437: 0x7E2F,\n\t15438: 0xF997,\n\t15439: 0x884D,\n\t15440: 0x8EDF,\n\t15441: 0xF998,\n\t15442: 0xF999,\n\t15443: 0xF99A,\n\t15444: 0x925B,\n\t15445: 0xF99B,\n\t15446: 0x9CF6,\n\t15447: 0xF99C,\n\t15448: 0xF99D,\n\t15449: 0xF99E,\n\t15450: 0x6085,\n\t15451: 0x6D85,\n\t15452: 0xF99F,\n\t15453: 0x71B1,\n\t15454: 0xF9A0,\n\t15455: 0xF9A1,\n\t15456: 0x95B1,\n\t15457: 0x53AD,\n\t15458: 0xF9A2,\n\t15459: 0xF9A3,\n\t15460: 0xF9A4,\n\t15461: 0x67D3,\n\t15462: 0xF9A5,\n\t15463: 0x708E,\n\t15464: 0x7130,\n\t15465: 0x7430,\n\t15466: 0x8276,\n\t15467: 0x82D2,\n\t15468: 0xF9A6,\n\t15469: 0x95BB,\n\t15470: 0x9AE5,\n\t15471: 0x9E7D,\n\t15472: 0x66C4,\n\t15473: 0xF9A7,\n\t15474: 0x71C1,\n\t15475: 0x8449,\n\t15476: 0xF9A8,\n\t15477: 0xF9A9,\n\t15478: 0x584B,\n\t15479: 0xF9AA,\n\t15480: 0xF9AB,\n\t15481: 0x5DB8,\n\t15482: 0x5F71,\n\t15483: 0xF9AC,\n\t15484: 0x6620,\n\t15485: 0x668E,\n\t15486: 0x6979,\n\t15487: 0x69AE,\n\t15488: 0x6C38,\n\t15489: 0x6CF3,\n\t15490: 0x6E36,\n\t15491: 0x6F41,\n\t15492: 0x6FDA,\n\t15493: 0x701B,\n\t15494: 0x702F,\n\t15495: 0x7150,\n\t15496: 0x71DF,\n\t15497: 0x7370,\n\t15498: 0xF9AD,\n\t15499: 0x745B,\n\t15500: 0xF9AE,\n\t15501: 0x74D4,\n\t15502: 0x76C8,\n\t15503: 0x7A4E,\n\t15504: 0x7E93,\n\t15505: 0xF9AF,\n\t15506: 0xF9B0,\n\t15507: 0x82F1,\n\t15508: 0x8A60,\n\t15509: 0x8FCE,\n\t15510: 0xF9B1,\n\t15511: 0x9348,\n\t15512: 0xF9B2,\n\t15513: 0x9719,\n\t15514: 0xF9B3,\n\t15515: 0xF9B4,\n\t15516: 0x4E42,\n\t15517: 0x502A,\n\t15518: 0xF9B5,\n\t15519: 0x5208,\n\t15520: 0x53E1,\n\t15521: 0x66F3,\n\t15522: 0x6C6D,\n\t15523: 0x6FCA,\n\t15524: 0x730A,\n\t15525: 0x777F,\n\t15526: 0x7A62,\n\t15527: 0x82AE,\n\t15528: 0x85DD,\n\t15529: 0x8602,\n\t15530: 0xF9B6,\n\t15531: 0x88D4,\n\t15532: 0x8A63,\n\t15533: 0x8B7D,\n\t15534: 0x8C6B,\n\t15535: 0xF9B7,\n\t15536: 0x92B3,\n\t15537: 0xF9B8,\n\t15538: 0x9713,\n\t15539: 0x9810,\n\t15540: 0x4E94,\n\t15541: 0x4F0D,\n\t15542: 0x4FC9,\n\t15543: 0x50B2,\n\t15544: 0x5348,\n\t15545: 0x543E,\n\t15546: 0x5433,\n\t15547: 0x55DA,\n\t15548: 0x5862,\n\t15549: 0x58BA,\n\t15550: 0x5967,\n\t15551: 0x5A1B,\n\t15552: 0x5BE4,\n\t15553: 0x609F,\n\t15554: 0xF9B9,\n\t15555: 0x61CA,\n\t15556: 0x6556,\n\t15557: 0x65FF,\n\t15558: 0x6664,\n\t15559: 0x68A7,\n\t15560: 0x6C5A,\n\t15561: 0x6FB3,\n\t15562: 0x70CF,\n\t15563: 0x71AC,\n\t15564: 0x7352,\n\t15565: 0x7B7D,\n\t15566: 0x8708,\n\t15567: 0x8AA4,\n\t15568: 0x9C32,\n\t15569: 0x9F07,\n\t15570: 0x5C4B,\n\t15571: 0x6C83,\n\t15572: 0x7344,\n\t15573: 0x7389,\n\t15574: 0x923A,\n\t15575: 0x6EAB,\n\t15576: 0x7465,\n\t15577: 0x761F,\n\t15578: 0x7A69,\n\t15579: 0x7E15,\n\t15580: 0x860A,\n\t15581: 0x5140,\n\t15582: 0x58C5,\n\t15583: 0x64C1,\n\t15584: 0x74EE,\n\t15585: 0x7515,\n\t15586: 0x7670,\n\t15587: 0x7FC1,\n\t15588: 0x9095,\n\t15589: 0x96CD,\n\t15590: 0x9954,\n\t15591: 0x6E26,\n\t15592: 0x74E6,\n\t15593: 0x7AA9,\n\t15594: 0x7AAA,\n\t15595: 0x81E5,\n\t15596: 0x86D9,\n\t15597: 0x8778,\n\t15598: 0x8A1B,\n\t15599: 0x5A49,\n\t15600: 0x5B8C,\n\t15601: 0x5B9B,\n\t15602: 0x68A1,\n\t15603: 0x6900,\n\t15604: 0x6D63,\n\t15605: 0x73A9,\n\t15606: 0x7413,\n\t15607: 0x742C,\n\t15608: 0x7897,\n\t15609: 0x7DE9,\n\t15610: 0x7FEB,\n\t15611: 0x8118,\n\t15612: 0x8155,\n\t15613: 0x839E,\n\t15614: 0x8C4C,\n\t15615: 0x962E,\n\t15616: 0x9811,\n\t15617: 0x66F0,\n\t15618: 0x5F80,\n\t15619: 0x65FA,\n\t15620: 0x6789,\n\t15621: 0x6C6A,\n\t15622: 0x738B,\n\t15623: 0x502D,\n\t15624: 0x5A03,\n\t15625: 0x6B6A,\n\t15626: 0x77EE,\n\t15627: 0x5916,\n\t15628: 0x5D6C,\n\t15629: 0x5DCD,\n\t15630: 0x7325,\n\t15631: 0x754F,\n\t15632: 0xF9BA,\n\t15633: 0xF9BB,\n\t15634: 0x50E5,\n\t15635: 0x51F9,\n\t15636: 0x582F,\n\t15637: 0x592D,\n\t15638: 0x5996,\n\t15639: 0x59DA,\n\t15640: 0x5BE5,\n\t15641: 0xF9BC,\n\t15642: 0xF9BD,\n\t15643: 0x5DA2,\n\t15644: 0x62D7,\n\t15645: 0x6416,\n\t15646: 0x6493,\n\t15647: 0x64FE,\n\t15648: 0xF9BE,\n\t15649: 0x66DC,\n\t15650: 0xF9BF,\n\t15651: 0x6A48,\n\t15652: 0xF9C0,\n\t15653: 0x71FF,\n\t15654: 0x7464,\n\t15655: 0xF9C1,\n\t15656: 0x7A88,\n\t15657: 0x7AAF,\n\t15658: 0x7E47,\n\t15659: 0x7E5E,\n\t15660: 0x8000,\n\t15661: 0x8170,\n\t15662: 0xF9C2,\n\t15663: 0x87EF,\n\t15664: 0x8981,\n\t15665: 0x8B20,\n\t15666: 0x9059,\n\t15667: 0xF9C3,\n\t15668: 0x9080,\n\t15669: 0x9952,\n\t15670: 0x617E,\n\t15671: 0x6B32,\n\t15672: 0x6D74,\n\t15673: 0x7E1F,\n\t15674: 0x8925,\n\t15675: 0x8FB1,\n\t15676: 0x4FD1,\n\t15677: 0x50AD,\n\t15678: 0x5197,\n\t15679: 0x52C7,\n\t15680: 0x57C7,\n\t15681: 0x5889,\n\t15682: 0x5BB9,\n\t15683: 0x5EB8,\n\t15684: 0x6142,\n\t15685: 0x6995,\n\t15686: 0x6D8C,\n\t15687: 0x6E67,\n\t15688: 0x6EB6,\n\t15689: 0x7194,\n\t15690: 0x7462,\n\t15691: 0x7528,\n\t15692: 0x752C,\n\t15693: 0x8073,\n\t15694: 0x8338,\n\t15695: 0x84C9,\n\t15696: 0x8E0A,\n\t15697: 0x9394,\n\t15698: 0x93DE,\n\t15699: 0xF9C4,\n\t15700: 0x4E8E,\n\t15701: 0x4F51,\n\t15702: 0x5076,\n\t15703: 0x512A,\n\t15704: 0x53C8,\n\t15705: 0x53CB,\n\t15706: 0x53F3,\n\t15707: 0x5B87,\n\t15708: 0x5BD3,\n\t15709: 0x5C24,\n\t15710: 0x611A,\n\t15711: 0x6182,\n\t15712: 0x65F4,\n\t15713: 0x725B,\n\t15714: 0x7397,\n\t15715: 0x7440,\n\t15716: 0x76C2,\n\t15717: 0x7950,\n\t15718: 0x7991,\n\t15719: 0x79B9,\n\t15720: 0x7D06,\n\t15721: 0x7FBD,\n\t15722: 0x828B,\n\t15723: 0x85D5,\n\t15724: 0x865E,\n\t15725: 0x8FC2,\n\t15726: 0x9047,\n\t15727: 0x90F5,\n\t15728: 0x91EA,\n\t15729: 0x9685,\n\t15730: 0x96E8,\n\t15731: 0x96E9,\n\t15732: 0x52D6,\n\t15733: 0x5F67,\n\t15734: 0x65ED,\n\t15735: 0x6631,\n\t15736: 0x682F,\n\t15737: 0x715C,\n\t15738: 0x7A36,\n\t15739: 0x90C1,\n\t15740: 0x980A,\n\t15741: 0x4E91,\n\t15742: 0xF9C5,\n\t15743: 0x6A52,\n\t15744: 0x6B9E,\n\t15745: 0x6F90,\n\t15746: 0x7189,\n\t15747: 0x8018,\n\t15748: 0x82B8,\n\t15749: 0x8553,\n\t15750: 0x904B,\n\t15751: 0x9695,\n\t15752: 0x96F2,\n\t15753: 0x97FB,\n\t15754: 0x851A,\n\t15755: 0x9B31,\n\t15756: 0x4E90,\n\t15757: 0x718A,\n\t15758: 0x96C4,\n\t15759: 0x5143,\n\t15760: 0x539F,\n\t15761: 0x54E1,\n\t15762: 0x5713,\n\t15763: 0x5712,\n\t15764: 0x57A3,\n\t15765: 0x5A9B,\n\t15766: 0x5AC4,\n\t15767: 0x5BC3,\n\t15768: 0x6028,\n\t15769: 0x613F,\n\t15770: 0x63F4,\n\t15771: 0x6C85,\n\t15772: 0x6D39,\n\t15773: 0x6E72,\n\t15774: 0x6E90,\n\t15775: 0x7230,\n\t15776: 0x733F,\n\t15777: 0x7457,\n\t15778: 0x82D1,\n\t15779: 0x8881,\n\t15780: 0x8F45,\n\t15781: 0x9060,\n\t15782: 0xF9C6,\n\t15783: 0x9662,\n\t15784: 0x9858,\n\t15785: 0x9D1B,\n\t15786: 0x6708,\n\t15787: 0x8D8A,\n\t15788: 0x925E,\n\t15789: 0x4F4D,\n\t15790: 0x5049,\n\t15791: 0x50DE,\n\t15792: 0x5371,\n\t15793: 0x570D,\n\t15794: 0x59D4,\n\t15795: 0x5A01,\n\t15796: 0x5C09,\n\t15797: 0x6170,\n\t15798: 0x6690,\n\t15799: 0x6E2D,\n\t15800: 0x7232,\n\t15801: 0x744B,\n\t15802: 0x7DEF,\n\t15803: 0x80C3,\n\t15804: 0x840E,\n\t15805: 0x8466,\n\t15806: 0x853F,\n\t15807: 0x875F,\n\t15808: 0x885B,\n\t15809: 0x8918,\n\t15810: 0x8B02,\n\t15811: 0x9055,\n\t15812: 0x97CB,\n\t15813: 0x9B4F,\n\t15814: 0x4E73,\n\t15815: 0x4F91,\n\t15816: 0x5112,\n\t15817: 0x516A,\n\t15818: 0xF9C7,\n\t15819: 0x552F,\n\t15820: 0x55A9,\n\t15821: 0x5B7A,\n\t15822: 0x5BA5,\n\t15823: 0x5E7C,\n\t15824: 0x5E7D,\n\t15825: 0x5EBE,\n\t15826: 0x60A0,\n\t15827: 0x60DF,\n\t15828: 0x6108,\n\t15829: 0x6109,\n\t15830: 0x63C4,\n\t15831: 0x6538,\n\t15832: 0x6709,\n\t15833: 0xF9C8,\n\t15834: 0x67D4,\n\t15835: 0x67DA,\n\t15836: 0xF9C9,\n\t15837: 0x6961,\n\t15838: 0x6962,\n\t15839: 0x6CB9,\n\t15840: 0x6D27,\n\t15841: 0xF9CA,\n\t15842: 0x6E38,\n\t15843: 0xF9CB,\n\t15844: 0x6FE1,\n\t15845: 0x7336,\n\t15846: 0x7337,\n\t15847: 0xF9CC,\n\t15848: 0x745C,\n\t15849: 0x7531,\n\t15850: 0xF9CD,\n\t15851: 0x7652,\n\t15852: 0xF9CE,\n\t15853: 0xF9CF,\n\t15854: 0x7DAD,\n\t15855: 0x81FE,\n\t15856: 0x8438,\n\t15857: 0x88D5,\n\t15858: 0x8A98,\n\t15859: 0x8ADB,\n\t15860: 0x8AED,\n\t15861: 0x8E30,\n\t15862: 0x8E42,\n\t15863: 0x904A,\n\t15864: 0x903E,\n\t15865: 0x907A,\n\t15866: 0x9149,\n\t15867: 0x91C9,\n\t15868: 0x936E,\n\t15869: 0xF9D0,\n\t15870: 0xF9D1,\n\t15871: 0x5809,\n\t15872: 0xF9D2,\n\t15873: 0x6BD3,\n\t15874: 0x8089,\n\t15875: 0x80B2,\n\t15876: 0xF9D3,\n\t15877: 0xF9D4,\n\t15878: 0x5141,\n\t15879: 0x596B,\n\t15880: 0x5C39,\n\t15881: 0xF9D5,\n\t15882: 0xF9D6,\n\t15883: 0x6F64,\n\t15884: 0x73A7,\n\t15885: 0x80E4,\n\t15886: 0x8D07,\n\t15887: 0xF9D7,\n\t15888: 0x9217,\n\t15889: 0x958F,\n\t15890: 0xF9D8,\n\t15891: 0xF9D9,\n\t15892: 0xF9DA,\n\t15893: 0xF9DB,\n\t15894: 0x807F,\n\t15895: 0x620E,\n\t15896: 0x701C,\n\t15897: 0x7D68,\n\t15898: 0x878D,\n\t15899: 0xF9DC,\n\t15900: 0x57A0,\n\t15901: 0x6069,\n\t15902: 0x6147,\n\t15903: 0x6BB7,\n\t15904: 0x8ABE,\n\t15905: 0x9280,\n\t15906: 0x96B1,\n\t15907: 0x4E59,\n\t15908: 0x541F,\n\t15909: 0x6DEB,\n\t15910: 0x852D,\n\t15911: 0x9670,\n\t15912: 0x97F3,\n\t15913: 0x98EE,\n\t15914: 0x63D6,\n\t15915: 0x6CE3,\n\t15916: 0x9091,\n\t15917: 0x51DD,\n\t15918: 0x61C9,\n\t15919: 0x81BA,\n\t15920: 0x9DF9,\n\t15921: 0x4F9D,\n\t15922: 0x501A,\n\t15923: 0x5100,\n\t15924: 0x5B9C,\n\t15925: 0x610F,\n\t15926: 0x61FF,\n\t15927: 0x64EC,\n\t15928: 0x6905,\n\t15929: 0x6BC5,\n\t15930: 0x7591,\n\t15931: 0x77E3,\n\t15932: 0x7FA9,\n\t15933: 0x8264,\n\t15934: 0x858F,\n\t15935: 0x87FB,\n\t15936: 0x8863,\n\t15937: 0x8ABC,\n\t15938: 0x8B70,\n\t15939: 0x91AB,\n\t15940: 0x4E8C,\n\t15941: 0x4EE5,\n\t15942: 0x4F0A,\n\t15943: 0xF9DD,\n\t15944: 0xF9DE,\n\t15945: 0x5937,\n\t15946: 0x59E8,\n\t15947: 0xF9DF,\n\t15948: 0x5DF2,\n\t15949: 0x5F1B,\n\t15950: 0x5F5B,\n\t15951: 0x6021,\n\t15952: 0xF9E0,\n\t15953: 0xF9E1,\n\t15954: 0xF9E2,\n\t15955: 0xF9E3,\n\t15956: 0x723E,\n\t15957: 0x73E5,\n\t15958: 0xF9E4,\n\t15959: 0x7570,\n\t15960: 0x75CD,\n\t15961: 0xF9E5,\n\t15962: 0x79FB,\n\t15963: 0xF9E6,\n\t15964: 0x800C,\n\t15965: 0x8033,\n\t15966: 0x8084,\n\t15967: 0x82E1,\n\t15968: 0x8351,\n\t15969: 0xF9E7,\n\t15970: 0xF9E8,\n\t15971: 0x8CBD,\n\t15972: 0x8CB3,\n\t15973: 0x9087,\n\t15974: 0xF9E9,\n\t15975: 0xF9EA,\n\t15976: 0x98F4,\n\t15977: 0x990C,\n\t15978: 0xF9EB,\n\t15979: 0xF9EC,\n\t15980: 0x7037,\n\t15981: 0x76CA,\n\t15982: 0x7FCA,\n\t15983: 0x7FCC,\n\t15984: 0x7FFC,\n\t15985: 0x8B1A,\n\t15986: 0x4EBA,\n\t15987: 0x4EC1,\n\t15988: 0x5203,\n\t15989: 0x5370,\n\t15990: 0xF9ED,\n\t15991: 0x54BD,\n\t15992: 0x56E0,\n\t15993: 0x59FB,\n\t15994: 0x5BC5,\n\t15995: 0x5F15,\n\t15996: 0x5FCD,\n\t15997: 0x6E6E,\n\t15998: 0xF9EE,\n\t15999: 0xF9EF,\n\t16000: 0x7D6A,\n\t16001: 0x8335,\n\t16002: 0xF9F0,\n\t16003: 0x8693,\n\t16004: 0x8A8D,\n\t16005: 0xF9F1,\n\t16006: 0x976D,\n\t16007: 0x9777,\n\t16008: 0xF9F2,\n\t16009: 0xF9F3,\n\t16010: 0x4E00,\n\t16011: 0x4F5A,\n\t16012: 0x4F7E,\n\t16013: 0x58F9,\n\t16014: 0x65E5,\n\t16015: 0x6EA2,\n\t16016: 0x9038,\n\t16017: 0x93B0,\n\t16018: 0x99B9,\n\t16019: 0x4EFB,\n\t16020: 0x58EC,\n\t16021: 0x598A,\n\t16022: 0x59D9,\n\t16023: 0x6041,\n\t16024: 0xF9F4,\n\t16025: 0xF9F5,\n\t16026: 0x7A14,\n\t16027: 0xF9F6,\n\t16028: 0x834F,\n\t16029: 0x8CC3,\n\t16030: 0x5165,\n\t16031: 0x5344,\n\t16032: 0xF9F7,\n\t16033: 0xF9F8,\n\t16034: 0xF9F9,\n\t16035: 0x4ECD,\n\t16036: 0x5269,\n\t16037: 0x5B55,\n\t16038: 0x82BF,\n\t16039: 0x4ED4,\n\t16040: 0x523A,\n\t16041: 0x54A8,\n\t16042: 0x59C9,\n\t16043: 0x59FF,\n\t16044: 0x5B50,\n\t16045: 0x5B57,\n\t16046: 0x5B5C,\n\t16047: 0x6063,\n\t16048: 0x6148,\n\t16049: 0x6ECB,\n\t16050: 0x7099,\n\t16051: 0x716E,\n\t16052: 0x7386,\n\t16053: 0x74F7,\n\t16054: 0x75B5,\n\t16055: 0x78C1,\n\t16056: 0x7D2B,\n\t16057: 0x8005,\n\t16058: 0x81EA,\n\t16059: 0x8328,\n\t16060: 0x8517,\n\t16061: 0x85C9,\n\t16062: 0x8AEE,\n\t16063: 0x8CC7,\n\t16064: 0x96CC,\n\t16065: 0x4F5C,\n\t16066: 0x52FA,\n\t16067: 0x56BC,\n\t16068: 0x65AB,\n\t16069: 0x6628,\n\t16070: 0x707C,\n\t16071: 0x70B8,\n\t16072: 0x7235,\n\t16073: 0x7DBD,\n\t16074: 0x828D,\n\t16075: 0x914C,\n\t16076: 0x96C0,\n\t16077: 0x9D72,\n\t16078: 0x5B71,\n\t16079: 0x68E7,\n\t16080: 0x6B98,\n\t16081: 0x6F7A,\n\t16082: 0x76DE,\n\t16083: 0x5C91,\n\t16084: 0x66AB,\n\t16085: 0x6F5B,\n\t16086: 0x7BB4,\n\t16087: 0x7C2A,\n\t16088: 0x8836,\n\t16089: 0x96DC,\n\t16090: 0x4E08,\n\t16091: 0x4ED7,\n\t16092: 0x5320,\n\t16093: 0x5834,\n\t16094: 0x58BB,\n\t16095: 0x58EF,\n\t16096: 0x596C,\n\t16097: 0x5C07,\n\t16098: 0x5E33,\n\t16099: 0x5E84,\n\t16100: 0x5F35,\n\t16101: 0x638C,\n\t16102: 0x66B2,\n\t16103: 0x6756,\n\t16104: 0x6A1F,\n\t16105: 0x6AA3,\n\t16106: 0x6B0C,\n\t16107: 0x6F3F,\n\t16108: 0x7246,\n\t16109: 0xF9FA,\n\t16110: 0x7350,\n\t16111: 0x748B,\n\t16112: 0x7AE0,\n\t16113: 0x7CA7,\n\t16114: 0x8178,\n\t16115: 0x81DF,\n\t16116: 0x81E7,\n\t16117: 0x838A,\n\t16118: 0x846C,\n\t16119: 0x8523,\n\t16120: 0x8594,\n\t16121: 0x85CF,\n\t16122: 0x88DD,\n\t16123: 0x8D13,\n\t16124: 0x91AC,\n\t16125: 0x9577,\n\t16126: 0x969C,\n\t16127: 0x518D,\n\t16128: 0x54C9,\n\t16129: 0x5728,\n\t16130: 0x5BB0,\n\t16131: 0x624D,\n\t16132: 0x6750,\n\t16133: 0x683D,\n\t16134: 0x6893,\n\t16135: 0x6E3D,\n\t16136: 0x6ED3,\n\t16137: 0x707D,\n\t16138: 0x7E21,\n\t16139: 0x88C1,\n\t16140: 0x8CA1,\n\t16141: 0x8F09,\n\t16142: 0x9F4B,\n\t16143: 0x9F4E,\n\t16144: 0x722D,\n\t16145: 0x7B8F,\n\t16146: 0x8ACD,\n\t16147: 0x931A,\n\t16148: 0x4F47,\n\t16149: 0x4F4E,\n\t16150: 0x5132,\n\t16151: 0x5480,\n\t16152: 0x59D0,\n\t16153: 0x5E95,\n\t16154: 0x62B5,\n\t16155: 0x6775,\n\t16156: 0x696E,\n\t16157: 0x6A17,\n\t16158: 0x6CAE,\n\t16159: 0x6E1A,\n\t16160: 0x72D9,\n\t16161: 0x732A,\n\t16162: 0x75BD,\n\t16163: 0x7BB8,\n\t16164: 0x7D35,\n\t16165: 0x82E7,\n\t16166: 0x83F9,\n\t16167: 0x8457,\n\t16168: 0x85F7,\n\t16169: 0x8A5B,\n\t16170: 0x8CAF,\n\t16171: 0x8E87,\n\t16172: 0x9019,\n\t16173: 0x90B8,\n\t16174: 0x96CE,\n\t16175: 0x9F5F,\n\t16176: 0x52E3,\n\t16177: 0x540A,\n\t16178: 0x5AE1,\n\t16179: 0x5BC2,\n\t16180: 0x6458,\n\t16181: 0x6575,\n\t16182: 0x6EF4,\n\t16183: 0x72C4,\n\t16184: 0xF9FB,\n\t16185: 0x7684,\n\t16186: 0x7A4D,\n\t16187: 0x7B1B,\n\t16188: 0x7C4D,\n\t16189: 0x7E3E,\n\t16190: 0x7FDF,\n\t16191: 0x837B,\n\t16192: 0x8B2B,\n\t16193: 0x8CCA,\n\t16194: 0x8D64,\n\t16195: 0x8DE1,\n\t16196: 0x8E5F,\n\t16197: 0x8FEA,\n\t16198: 0x8FF9,\n\t16199: 0x9069,\n\t16200: 0x93D1,\n\t16201: 0x4F43,\n\t16202: 0x4F7A,\n\t16203: 0x50B3,\n\t16204: 0x5168,\n\t16205: 0x5178,\n\t16206: 0x524D,\n\t16207: 0x526A,\n\t16208: 0x5861,\n\t16209: 0x587C,\n\t16210: 0x5960,\n\t16211: 0x5C08,\n\t16212: 0x5C55,\n\t16213: 0x5EDB,\n\t16214: 0x609B,\n\t16215: 0x6230,\n\t16216: 0x6813,\n\t16217: 0x6BBF,\n\t16218: 0x6C08,\n\t16219: 0x6FB1,\n\t16220: 0x714E,\n\t16221: 0x7420,\n\t16222: 0x7530,\n\t16223: 0x7538,\n\t16224: 0x7551,\n\t16225: 0x7672,\n\t16226: 0x7B4C,\n\t16227: 0x7B8B,\n\t16228: 0x7BAD,\n\t16229: 0x7BC6,\n\t16230: 0x7E8F,\n\t16231: 0x8A6E,\n\t16232: 0x8F3E,\n\t16233: 0x8F49,\n\t16234: 0x923F,\n\t16235: 0x9293,\n\t16236: 0x9322,\n\t16237: 0x942B,\n\t16238: 0x96FB,\n\t16239: 0x985A,\n\t16240: 0x986B,\n\t16241: 0x991E,\n\t16242: 0x5207,\n\t16243: 0x622A,\n\t16244: 0x6298,\n\t16245: 0x6D59,\n\t16246: 0x7664,\n\t16247: 0x7ACA,\n\t16248: 0x7BC0,\n\t16249: 0x7D76,\n\t16250: 0x5360,\n\t16251: 0x5CBE,\n\t16252: 0x5E97,\n\t16253: 0x6F38,\n\t16254: 0x70B9,\n\t16255: 0x7C98,\n\t16256: 0x9711,\n\t16257: 0x9B8E,\n\t16258: 0x9EDE,\n\t16259: 0x63A5,\n\t16260: 0x647A,\n\t16261: 0x8776,\n\t16262: 0x4E01,\n\t16263: 0x4E95,\n\t16264: 0x4EAD,\n\t16265: 0x505C,\n\t16266: 0x5075,\n\t16267: 0x5448,\n\t16268: 0x59C3,\n\t16269: 0x5B9A,\n\t16270: 0x5E40,\n\t16271: 0x5EAD,\n\t16272: 0x5EF7,\n\t16273: 0x5F81,\n\t16274: 0x60C5,\n\t16275: 0x633A,\n\t16276: 0x653F,\n\t16277: 0x6574,\n\t16278: 0x65CC,\n\t16279: 0x6676,\n\t16280: 0x6678,\n\t16281: 0x67FE,\n\t16282: 0x6968,\n\t16283: 0x6A89,\n\t16284: 0x6B63,\n\t16285: 0x6C40,\n\t16286: 0x6DC0,\n\t16287: 0x6DE8,\n\t16288: 0x6E1F,\n\t16289: 0x6E5E,\n\t16290: 0x701E,\n\t16291: 0x70A1,\n\t16292: 0x738E,\n\t16293: 0x73FD,\n\t16294: 0x753A,\n\t16295: 0x775B,\n\t16296: 0x7887,\n\t16297: 0x798E,\n\t16298: 0x7A0B,\n\t16299: 0x7A7D,\n\t16300: 0x7CBE,\n\t16301: 0x7D8E,\n\t16302: 0x8247,\n\t16303: 0x8A02,\n\t16304: 0x8AEA,\n\t16305: 0x8C9E,\n\t16306: 0x912D,\n\t16307: 0x914A,\n\t16308: 0x91D8,\n\t16309: 0x9266,\n\t16310: 0x92CC,\n\t16311: 0x9320,\n\t16312: 0x9706,\n\t16313: 0x9756,\n\t16314: 0x975C,\n\t16315: 0x9802,\n\t16316: 0x9F0E,\n\t16317: 0x5236,\n\t16318: 0x5291,\n\t16319: 0x557C,\n\t16320: 0x5824,\n\t16321: 0x5E1D,\n\t16322: 0x5F1F,\n\t16323: 0x608C,\n\t16324: 0x63D0,\n\t16325: 0x68AF,\n\t16326: 0x6FDF,\n\t16327: 0x796D,\n\t16328: 0x7B2C,\n\t16329: 0x81CD,\n\t16330: 0x85BA,\n\t16331: 0x88FD,\n\t16332: 0x8AF8,\n\t16333: 0x8E44,\n\t16334: 0x918D,\n\t16335: 0x9664,\n\t16336: 0x969B,\n\t16337: 0x973D,\n\t16338: 0x984C,\n\t16339: 0x9F4A,\n\t16340: 0x4FCE,\n\t16341: 0x5146,\n\t16342: 0x51CB,\n\t16343: 0x52A9,\n\t16344: 0x5632,\n\t16345: 0x5F14,\n\t16346: 0x5F6B,\n\t16347: 0x63AA,\n\t16348: 0x64CD,\n\t16349: 0x65E9,\n\t16350: 0x6641,\n\t16351: 0x66FA,\n\t16352: 0x66F9,\n\t16353: 0x671D,\n\t16354: 0x689D,\n\t16355: 0x68D7,\n\t16356: 0x69FD,\n\t16357: 0x6F15,\n\t16358: 0x6F6E,\n\t16359: 0x7167,\n\t16360: 0x71E5,\n\t16361: 0x722A,\n\t16362: 0x74AA,\n\t16363: 0x773A,\n\t16364: 0x7956,\n\t16365: 0x795A,\n\t16366: 0x79DF,\n\t16367: 0x7A20,\n\t16368: 0x7A95,\n\t16369: 0x7C97,\n\t16370: 0x7CDF,\n\t16371: 0x7D44,\n\t16372: 0x7E70,\n\t16373: 0x8087,\n\t16374: 0x85FB,\n\t16375: 0x86A4,\n\t16376: 0x8A54,\n\t16377: 0x8ABF,\n\t16378: 0x8D99,\n\t16379: 0x8E81,\n\t16380: 0x9020,\n\t16381: 0x906D,\n\t16382: 0x91E3,\n\t16383: 0x963B,\n\t16384: 0x96D5,\n\t16385: 0x9CE5,\n\t16386: 0x65CF,\n\t16387: 0x7C07,\n\t16388: 0x8DB3,\n\t16389: 0x93C3,\n\t16390: 0x5B58,\n\t16391: 0x5C0A,\n\t16392: 0x5352,\n\t16393: 0x62D9,\n\t16394: 0x731D,\n\t16395: 0x5027,\n\t16396: 0x5B97,\n\t16397: 0x5F9E,\n\t16398: 0x60B0,\n\t16399: 0x616B,\n\t16400: 0x68D5,\n\t16401: 0x6DD9,\n\t16402: 0x742E,\n\t16403: 0x7A2E,\n\t16404: 0x7D42,\n\t16405: 0x7D9C,\n\t16406: 0x7E31,\n\t16407: 0x816B,\n\t16408: 0x8E2A,\n\t16409: 0x8E35,\n\t16410: 0x937E,\n\t16411: 0x9418,\n\t16412: 0x4F50,\n\t16413: 0x5750,\n\t16414: 0x5DE6,\n\t16415: 0x5EA7,\n\t16416: 0x632B,\n\t16417: 0x7F6A,\n\t16418: 0x4E3B,\n\t16419: 0x4F4F,\n\t16420: 0x4F8F,\n\t16421: 0x505A,\n\t16422: 0x59DD,\n\t16423: 0x80C4,\n\t16424: 0x546A,\n\t16425: 0x5468,\n\t16426: 0x55FE,\n\t16427: 0x594F,\n\t16428: 0x5B99,\n\t16429: 0x5DDE,\n\t16430: 0x5EDA,\n\t16431: 0x665D,\n\t16432: 0x6731,\n\t16433: 0x67F1,\n\t16434: 0x682A,\n\t16435: 0x6CE8,\n\t16436: 0x6D32,\n\t16437: 0x6E4A,\n\t16438: 0x6F8D,\n\t16439: 0x70B7,\n\t16440: 0x73E0,\n\t16441: 0x7587,\n\t16442: 0x7C4C,\n\t16443: 0x7D02,\n\t16444: 0x7D2C,\n\t16445: 0x7DA2,\n\t16446: 0x821F,\n\t16447: 0x86DB,\n\t16448: 0x8A3B,\n\t16449: 0x8A85,\n\t16450: 0x8D70,\n\t16451: 0x8E8A,\n\t16452: 0x8F33,\n\t16453: 0x9031,\n\t16454: 0x914E,\n\t16455: 0x9152,\n\t16456: 0x9444,\n\t16457: 0x99D0,\n\t16458: 0x7AF9,\n\t16459: 0x7CA5,\n\t16460: 0x4FCA,\n\t16461: 0x5101,\n\t16462: 0x51C6,\n\t16463: 0x57C8,\n\t16464: 0x5BEF,\n\t16465: 0x5CFB,\n\t16466: 0x6659,\n\t16467: 0x6A3D,\n\t16468: 0x6D5A,\n\t16469: 0x6E96,\n\t16470: 0x6FEC,\n\t16471: 0x710C,\n\t16472: 0x756F,\n\t16473: 0x7AE3,\n\t16474: 0x8822,\n\t16475: 0x9021,\n\t16476: 0x9075,\n\t16477: 0x96CB,\n\t16478: 0x99FF,\n\t16479: 0x8301,\n\t16480: 0x4E2D,\n\t16481: 0x4EF2,\n\t16482: 0x8846,\n\t16483: 0x91CD,\n\t16484: 0x537D,\n\t16485: 0x6ADB,\n\t16486: 0x696B,\n\t16487: 0x6C41,\n\t16488: 0x847A,\n\t16489: 0x589E,\n\t16490: 0x618E,\n\t16491: 0x66FE,\n\t16492: 0x62EF,\n\t16493: 0x70DD,\n\t16494: 0x7511,\n\t16495: 0x75C7,\n\t16496: 0x7E52,\n\t16497: 0x84B8,\n\t16498: 0x8B49,\n\t16499: 0x8D08,\n\t16500: 0x4E4B,\n\t16501: 0x53EA,\n\t16502: 0x54AB,\n\t16503: 0x5730,\n\t16504: 0x5740,\n\t16505: 0x5FD7,\n\t16506: 0x6301,\n\t16507: 0x6307,\n\t16508: 0x646F,\n\t16509: 0x652F,\n\t16510: 0x65E8,\n\t16511: 0x667A,\n\t16512: 0x679D,\n\t16513: 0x67B3,\n\t16514: 0x6B62,\n\t16515: 0x6C60,\n\t16516: 0x6C9A,\n\t16517: 0x6F2C,\n\t16518: 0x77E5,\n\t16519: 0x7825,\n\t16520: 0x7949,\n\t16521: 0x7957,\n\t16522: 0x7D19,\n\t16523: 0x80A2,\n\t16524: 0x8102,\n\t16525: 0x81F3,\n\t16526: 0x829D,\n\t16527: 0x82B7,\n\t16528: 0x8718,\n\t16529: 0x8A8C,\n\t16530: 0xF9FC,\n\t16531: 0x8D04,\n\t16532: 0x8DBE,\n\t16533: 0x9072,\n\t16534: 0x76F4,\n\t16535: 0x7A19,\n\t16536: 0x7A37,\n\t16537: 0x7E54,\n\t16538: 0x8077,\n\t16539: 0x5507,\n\t16540: 0x55D4,\n\t16541: 0x5875,\n\t16542: 0x632F,\n\t16543: 0x6422,\n\t16544: 0x6649,\n\t16545: 0x664B,\n\t16546: 0x686D,\n\t16547: 0x699B,\n\t16548: 0x6B84,\n\t16549: 0x6D25,\n\t16550: 0x6EB1,\n\t16551: 0x73CD,\n\t16552: 0x7468,\n\t16553: 0x74A1,\n\t16554: 0x755B,\n\t16555: 0x75B9,\n\t16556: 0x76E1,\n\t16557: 0x771E,\n\t16558: 0x778B,\n\t16559: 0x79E6,\n\t16560: 0x7E09,\n\t16561: 0x7E1D,\n\t16562: 0x81FB,\n\t16563: 0x852F,\n\t16564: 0x8897,\n\t16565: 0x8A3A,\n\t16566: 0x8CD1,\n\t16567: 0x8EEB,\n\t16568: 0x8FB0,\n\t16569: 0x9032,\n\t16570: 0x93AD,\n\t16571: 0x9663,\n\t16572: 0x9673,\n\t16573: 0x9707,\n\t16574: 0x4F84,\n\t16575: 0x53F1,\n\t16576: 0x59EA,\n\t16577: 0x5AC9,\n\t16578: 0x5E19,\n\t16579: 0x684E,\n\t16580: 0x74C6,\n\t16581: 0x75BE,\n\t16582: 0x79E9,\n\t16583: 0x7A92,\n\t16584: 0x81A3,\n\t16585: 0x86ED,\n\t16586: 0x8CEA,\n\t16587: 0x8DCC,\n\t16588: 0x8FED,\n\t16589: 0x659F,\n\t16590: 0x6715,\n\t16591: 0xF9FD,\n\t16592: 0x57F7,\n\t16593: 0x6F57,\n\t16594: 0x7DDD,\n\t16595: 0x8F2F,\n\t16596: 0x93F6,\n\t16597: 0x96C6,\n\t16598: 0x5FB5,\n\t16599: 0x61F2,\n\t16600: 0x6F84,\n\t16601: 0x4E14,\n\t16602: 0x4F98,\n\t16603: 0x501F,\n\t16604: 0x53C9,\n\t16605: 0x55DF,\n\t16606: 0x5D6F,\n\t16607: 0x5DEE,\n\t16608: 0x6B21,\n\t16609: 0x6B64,\n\t16610: 0x78CB,\n\t16611: 0x7B9A,\n\t16612: 0xF9FE,\n\t16613: 0x8E49,\n\t16614: 0x8ECA,\n\t16615: 0x906E,\n\t16616: 0x6349,\n\t16617: 0x643E,\n\t16618: 0x7740,\n\t16619: 0x7A84,\n\t16620: 0x932F,\n\t16621: 0x947F,\n\t16622: 0x9F6A,\n\t16623: 0x64B0,\n\t16624: 0x6FAF,\n\t16625: 0x71E6,\n\t16626: 0x74A8,\n\t16627: 0x74DA,\n\t16628: 0x7AC4,\n\t16629: 0x7C12,\n\t16630: 0x7E82,\n\t16631: 0x7CB2,\n\t16632: 0x7E98,\n\t16633: 0x8B9A,\n\t16634: 0x8D0A,\n\t16635: 0x947D,\n\t16636: 0x9910,\n\t16637: 0x994C,\n\t16638: 0x5239,\n\t16639: 0x5BDF,\n\t16640: 0x64E6,\n\t16641: 0x672D,\n\t16642: 0x7D2E,\n\t16643: 0x50ED,\n\t16644: 0x53C3,\n\t16645: 0x5879,\n\t16646: 0x6158,\n\t16647: 0x6159,\n\t16648: 0x61FA,\n\t16649: 0x65AC,\n\t16650: 0x7AD9,\n\t16651: 0x8B92,\n\t16652: 0x8B96,\n\t16653: 0x5009,\n\t16654: 0x5021,\n\t16655: 0x5275,\n\t16656: 0x5531,\n\t16657: 0x5A3C,\n\t16658: 0x5EE0,\n\t16659: 0x5F70,\n\t16660: 0x6134,\n\t16661: 0x655E,\n\t16662: 0x660C,\n\t16663: 0x6636,\n\t16664: 0x66A2,\n\t16665: 0x69CD,\n\t16666: 0x6EC4,\n\t16667: 0x6F32,\n\t16668: 0x7316,\n\t16669: 0x7621,\n\t16670: 0x7A93,\n\t16671: 0x8139,\n\t16672: 0x8259,\n\t16673: 0x83D6,\n\t16674: 0x84BC,\n\t16675: 0x50B5,\n\t16676: 0x57F0,\n\t16677: 0x5BC0,\n\t16678: 0x5BE8,\n\t16679: 0x5F69,\n\t16680: 0x63A1,\n\t16681: 0x7826,\n\t16682: 0x7DB5,\n\t16683: 0x83DC,\n\t16684: 0x8521,\n\t16685: 0x91C7,\n\t16686: 0x91F5,\n\t16687: 0x518A,\n\t16688: 0x67F5,\n\t16689: 0x7B56,\n\t16690: 0x8CAC,\n\t16691: 0x51C4,\n\t16692: 0x59BB,\n\t16693: 0x60BD,\n\t16694: 0x8655,\n\t16695: 0x501C,\n\t16696: 0xF9FF,\n\t16697: 0x5254,\n\t16698: 0x5C3A,\n\t16699: 0x617D,\n\t16700: 0x621A,\n\t16701: 0x62D3,\n\t16702: 0x64F2,\n\t16703: 0x65A5,\n\t16704: 0x6ECC,\n\t16705: 0x7620,\n\t16706: 0x810A,\n\t16707: 0x8E60,\n\t16708: 0x965F,\n\t16709: 0x96BB,\n\t16710: 0x4EDF,\n\t16711: 0x5343,\n\t16712: 0x5598,\n\t16713: 0x5929,\n\t16714: 0x5DDD,\n\t16715: 0x64C5,\n\t16716: 0x6CC9,\n\t16717: 0x6DFA,\n\t16718: 0x7394,\n\t16719: 0x7A7F,\n\t16720: 0x821B,\n\t16721: 0x85A6,\n\t16722: 0x8CE4,\n\t16723: 0x8E10,\n\t16724: 0x9077,\n\t16725: 0x91E7,\n\t16726: 0x95E1,\n\t16727: 0x9621,\n\t16728: 0x97C6,\n\t16729: 0x51F8,\n\t16730: 0x54F2,\n\t16731: 0x5586,\n\t16732: 0x5FB9,\n\t16733: 0x64A4,\n\t16734: 0x6F88,\n\t16735: 0x7DB4,\n\t16736: 0x8F1F,\n\t16737: 0x8F4D,\n\t16738: 0x9435,\n\t16739: 0x50C9,\n\t16740: 0x5C16,\n\t16741: 0x6CBE,\n\t16742: 0x6DFB,\n\t16743: 0x751B,\n\t16744: 0x77BB,\n\t16745: 0x7C3D,\n\t16746: 0x7C64,\n\t16747: 0x8A79,\n\t16748: 0x8AC2,\n\t16749: 0x581E,\n\t16750: 0x59BE,\n\t16751: 0x5E16,\n\t16752: 0x6377,\n\t16753: 0x7252,\n\t16754: 0x758A,\n\t16755: 0x776B,\n\t16756: 0x8ADC,\n\t16757: 0x8CBC,\n\t16758: 0x8F12,\n\t16759: 0x5EF3,\n\t16760: 0x6674,\n\t16761: 0x6DF8,\n\t16762: 0x807D,\n\t16763: 0x83C1,\n\t16764: 0x8ACB,\n\t16765: 0x9751,\n\t16766: 0x9BD6,\n\t16767: 0xFA00,\n\t16768: 0x5243,\n\t16769: 0x66FF,\n\t16770: 0x6D95,\n\t16771: 0x6EEF,\n\t16772: 0x7DE0,\n\t16773: 0x8AE6,\n\t16774: 0x902E,\n\t16775: 0x905E,\n\t16776: 0x9AD4,\n\t16777: 0x521D,\n\t16778: 0x527F,\n\t16779: 0x54E8,\n\t16780: 0x6194,\n\t16781: 0x6284,\n\t16782: 0x62DB,\n\t16783: 0x68A2,\n\t16784: 0x6912,\n\t16785: 0x695A,\n\t16786: 0x6A35,\n\t16787: 0x7092,\n\t16788: 0x7126,\n\t16789: 0x785D,\n\t16790: 0x7901,\n\t16791: 0x790E,\n\t16792: 0x79D2,\n\t16793: 0x7A0D,\n\t16794: 0x8096,\n\t16795: 0x8278,\n\t16796: 0x82D5,\n\t16797: 0x8349,\n\t16798: 0x8549,\n\t16799: 0x8C82,\n\t16800: 0x8D85,\n\t16801: 0x9162,\n\t16802: 0x918B,\n\t16803: 0x91AE,\n\t16804: 0x4FC3,\n\t16805: 0x56D1,\n\t16806: 0x71ED,\n\t16807: 0x77D7,\n\t16808: 0x8700,\n\t16809: 0x89F8,\n\t16810: 0x5BF8,\n\t16811: 0x5FD6,\n\t16812: 0x6751,\n\t16813: 0x90A8,\n\t16814: 0x53E2,\n\t16815: 0x585A,\n\t16816: 0x5BF5,\n\t16817: 0x60A4,\n\t16818: 0x6181,\n\t16819: 0x6460,\n\t16820: 0x7E3D,\n\t16821: 0x8070,\n\t16822: 0x8525,\n\t16823: 0x9283,\n\t16824: 0x64AE,\n\t16825: 0x50AC,\n\t16826: 0x5D14,\n\t16827: 0x6700,\n\t16828: 0x589C,\n\t16829: 0x62BD,\n\t16830: 0x63A8,\n\t16831: 0x690E,\n\t16832: 0x6978,\n\t16833: 0x6A1E,\n\t16834: 0x6E6B,\n\t16835: 0x76BA,\n\t16836: 0x79CB,\n\t16837: 0x82BB,\n\t16838: 0x8429,\n\t16839: 0x8ACF,\n\t16840: 0x8DA8,\n\t16841: 0x8FFD,\n\t16842: 0x9112,\n\t16843: 0x914B,\n\t16844: 0x919C,\n\t16845: 0x9310,\n\t16846: 0x9318,\n\t16847: 0x939A,\n\t16848: 0x96DB,\n\t16849: 0x9A36,\n\t16850: 0x9C0D,\n\t16851: 0x4E11,\n\t16852: 0x755C,\n\t16853: 0x795D,\n\t16854: 0x7AFA,\n\t16855: 0x7B51,\n\t16856: 0x7BC9,\n\t16857: 0x7E2E,\n\t16858: 0x84C4,\n\t16859: 0x8E59,\n\t16860: 0x8E74,\n\t16861: 0x8EF8,\n\t16862: 0x9010,\n\t16863: 0x6625,\n\t16864: 0x693F,\n\t16865: 0x7443,\n\t16866: 0x51FA,\n\t16867: 0x672E,\n\t16868: 0x9EDC,\n\t16869: 0x5145,\n\t16870: 0x5FE0,\n\t16871: 0x6C96,\n\t16872: 0x87F2,\n\t16873: 0x885D,\n\t16874: 0x8877,\n\t16875: 0x60B4,\n\t16876: 0x81B5,\n\t16877: 0x8403,\n\t16878: 0x8D05,\n\t16879: 0x53D6,\n\t16880: 0x5439,\n\t16881: 0x5634,\n\t16882: 0x5A36,\n\t16883: 0x5C31,\n\t16884: 0x708A,\n\t16885: 0x7FE0,\n\t16886: 0x805A,\n\t16887: 0x8106,\n\t16888: 0x81ED,\n\t16889: 0x8DA3,\n\t16890: 0x9189,\n\t16891: 0x9A5F,\n\t16892: 0x9DF2,\n\t16893: 0x5074,\n\t16894: 0x4EC4,\n\t16895: 0x53A0,\n\t16896: 0x60FB,\n\t16897: 0x6E2C,\n\t16898: 0x5C64,\n\t16899: 0x4F88,\n\t16900: 0x5024,\n\t16901: 0x55E4,\n\t16902: 0x5CD9,\n\t16903: 0x5E5F,\n\t16904: 0x6065,\n\t16905: 0x6894,\n\t16906: 0x6CBB,\n\t16907: 0x6DC4,\n\t16908: 0x71BE,\n\t16909: 0x75D4,\n\t16910: 0x75F4,\n\t16911: 0x7661,\n\t16912: 0x7A1A,\n\t16913: 0x7A49,\n\t16914: 0x7DC7,\n\t16915: 0x7DFB,\n\t16916: 0x7F6E,\n\t16917: 0x81F4,\n\t16918: 0x86A9,\n\t16919: 0x8F1C,\n\t16920: 0x96C9,\n\t16921: 0x99B3,\n\t16922: 0x9F52,\n\t16923: 0x5247,\n\t16924: 0x52C5,\n\t16925: 0x98ED,\n\t16926: 0x89AA,\n\t16927: 0x4E03,\n\t16928: 0x67D2,\n\t16929: 0x6F06,\n\t16930: 0x4FB5,\n\t16931: 0x5BE2,\n\t16932: 0x6795,\n\t16933: 0x6C88,\n\t16934: 0x6D78,\n\t16935: 0x741B,\n\t16936: 0x7827,\n\t16937: 0x91DD,\n\t16938: 0x937C,\n\t16939: 0x87C4,\n\t16940: 0x79E4,\n\t16941: 0x7A31,\n\t16942: 0x5FEB,\n\t16943: 0x4ED6,\n\t16944: 0x54A4,\n\t16945: 0x553E,\n\t16946: 0x58AE,\n\t16947: 0x59A5,\n\t16948: 0x60F0,\n\t16949: 0x6253,\n\t16950: 0x62D6,\n\t16951: 0x6736,\n\t16952: 0x6955,\n\t16953: 0x8235,\n\t16954: 0x9640,\n\t16955: 0x99B1,\n\t16956: 0x99DD,\n\t16957: 0x502C,\n\t16958: 0x5353,\n\t16959: 0x5544,\n\t16960: 0x577C,\n\t16961: 0xFA01,\n\t16962: 0x6258,\n\t16963: 0xFA02,\n\t16964: 0x64E2,\n\t16965: 0x666B,\n\t16966: 0x67DD,\n\t16967: 0x6FC1,\n\t16968: 0x6FEF,\n\t16969: 0x7422,\n\t16970: 0x7438,\n\t16971: 0x8A17,\n\t16972: 0x9438,\n\t16973: 0x5451,\n\t16974: 0x5606,\n\t16975: 0x5766,\n\t16976: 0x5F48,\n\t16977: 0x619A,\n\t16978: 0x6B4E,\n\t16979: 0x7058,\n\t16980: 0x70AD,\n\t16981: 0x7DBB,\n\t16982: 0x8A95,\n\t16983: 0x596A,\n\t16984: 0x812B,\n\t16985: 0x63A2,\n\t16986: 0x7708,\n\t16987: 0x803D,\n\t16988: 0x8CAA,\n\t16989: 0x5854,\n\t16990: 0x642D,\n\t16991: 0x69BB,\n\t16992: 0x5B95,\n\t16993: 0x5E11,\n\t16994: 0x6E6F,\n\t16995: 0xFA03,\n\t16996: 0x8569,\n\t16997: 0x514C,\n\t16998: 0x53F0,\n\t16999: 0x592A,\n\t17000: 0x6020,\n\t17001: 0x614B,\n\t17002: 0x6B86,\n\t17003: 0x6C70,\n\t17004: 0x6CF0,\n\t17005: 0x7B1E,\n\t17006: 0x80CE,\n\t17007: 0x82D4,\n\t17008: 0x8DC6,\n\t17009: 0x90B0,\n\t17010: 0x98B1,\n\t17011: 0xFA04,\n\t17012: 0x64C7,\n\t17013: 0x6FA4,\n\t17014: 0x6491,\n\t17015: 0x6504,\n\t17016: 0x514E,\n\t17017: 0x5410,\n\t17018: 0x571F,\n\t17019: 0x8A0E,\n\t17020: 0x615F,\n\t17021: 0x6876,\n\t17022: 0xFA05,\n\t17023: 0x75DB,\n\t17024: 0x7B52,\n\t17025: 0x7D71,\n\t17026: 0x901A,\n\t17027: 0x5806,\n\t17028: 0x69CC,\n\t17029: 0x817F,\n\t17030: 0x892A,\n\t17031: 0x9000,\n\t17032: 0x9839,\n\t17033: 0x5078,\n\t17034: 0x5957,\n\t17035: 0x59AC,\n\t17036: 0x6295,\n\t17037: 0x900F,\n\t17038: 0x9B2A,\n\t17039: 0x615D,\n\t17040: 0x7279,\n\t17041: 0x95D6,\n\t17042: 0x5761,\n\t17043: 0x5A46,\n\t17044: 0x5DF4,\n\t17045: 0x628A,\n\t17046: 0x64AD,\n\t17047: 0x64FA,\n\t17048: 0x6777,\n\t17049: 0x6CE2,\n\t17050: 0x6D3E,\n\t17051: 0x722C,\n\t17052: 0x7436,\n\t17053: 0x7834,\n\t17054: 0x7F77,\n\t17055: 0x82AD,\n\t17056: 0x8DDB,\n\t17057: 0x9817,\n\t17058: 0x5224,\n\t17059: 0x5742,\n\t17060: 0x677F,\n\t17061: 0x7248,\n\t17062: 0x74E3,\n\t17063: 0x8CA9,\n\t17064: 0x8FA6,\n\t17065: 0x9211,\n\t17066: 0x962A,\n\t17067: 0x516B,\n\t17068: 0x53ED,\n\t17069: 0x634C,\n\t17070: 0x4F69,\n\t17071: 0x5504,\n\t17072: 0x6096,\n\t17073: 0x6557,\n\t17074: 0x6C9B,\n\t17075: 0x6D7F,\n\t17076: 0x724C,\n\t17077: 0x72FD,\n\t17078: 0x7A17,\n\t17079: 0x8987,\n\t17080: 0x8C9D,\n\t17081: 0x5F6D,\n\t17082: 0x6F8E,\n\t17083: 0x70F9,\n\t17084: 0x81A8,\n\t17085: 0x610E,\n\t17086: 0x4FBF,\n\t17087: 0x504F,\n\t17088: 0x6241,\n\t17089: 0x7247,\n\t17090: 0x7BC7,\n\t17091: 0x7DE8,\n\t17092: 0x7FE9,\n\t17093: 0x904D,\n\t17094: 0x97AD,\n\t17095: 0x9A19,\n\t17096: 0x8CB6,\n\t17097: 0x576A,\n\t17098: 0x5E73,\n\t17099: 0x67B0,\n\t17100: 0x840D,\n\t17101: 0x8A55,\n\t17102: 0x5420,\n\t17103: 0x5B16,\n\t17104: 0x5E63,\n\t17105: 0x5EE2,\n\t17106: 0x5F0A,\n\t17107: 0x6583,\n\t17108: 0x80BA,\n\t17109: 0x853D,\n\t17110: 0x9589,\n\t17111: 0x965B,\n\t17112: 0x4F48,\n\t17113: 0x5305,\n\t17114: 0x530D,\n\t17115: 0x530F,\n\t17116: 0x5486,\n\t17117: 0x54FA,\n\t17118: 0x5703,\n\t17119: 0x5E03,\n\t17120: 0x6016,\n\t17121: 0x629B,\n\t17122: 0x62B1,\n\t17123: 0x6355,\n\t17124: 0xFA06,\n\t17125: 0x6CE1,\n\t17126: 0x6D66,\n\t17127: 0x75B1,\n\t17128: 0x7832,\n\t17129: 0x80DE,\n\t17130: 0x812F,\n\t17131: 0x82DE,\n\t17132: 0x8461,\n\t17133: 0x84B2,\n\t17134: 0x888D,\n\t17135: 0x8912,\n\t17136: 0x900B,\n\t17137: 0x92EA,\n\t17138: 0x98FD,\n\t17139: 0x9B91,\n\t17140: 0x5E45,\n\t17141: 0x66B4,\n\t17142: 0x66DD,\n\t17143: 0x7011,\n\t17144: 0x7206,\n\t17145: 0xFA07,\n\t17146: 0x4FF5,\n\t17147: 0x527D,\n\t17148: 0x5F6A,\n\t17149: 0x6153,\n\t17150: 0x6753,\n\t17151: 0x6A19,\n\t17152: 0x6F02,\n\t17153: 0x74E2,\n\t17154: 0x7968,\n\t17155: 0x8868,\n\t17156: 0x8C79,\n\t17157: 0x98C7,\n\t17158: 0x98C4,\n\t17159: 0x9A43,\n\t17160: 0x54C1,\n\t17161: 0x7A1F,\n\t17162: 0x6953,\n\t17163: 0x8AF7,\n\t17164: 0x8C4A,\n\t17165: 0x98A8,\n\t17166: 0x99AE,\n\t17167: 0x5F7C,\n\t17168: 0x62AB,\n\t17169: 0x75B2,\n\t17170: 0x76AE,\n\t17171: 0x88AB,\n\t17172: 0x907F,\n\t17173: 0x9642,\n\t17174: 0x5339,\n\t17175: 0x5F3C,\n\t17176: 0x5FC5,\n\t17177: 0x6CCC,\n\t17178: 0x73CC,\n\t17179: 0x7562,\n\t17180: 0x758B,\n\t17181: 0x7B46,\n\t17182: 0x82FE,\n\t17183: 0x999D,\n\t17184: 0x4E4F,\n\t17185: 0x903C,\n\t17186: 0x4E0B,\n\t17187: 0x4F55,\n\t17188: 0x53A6,\n\t17189: 0x590F,\n\t17190: 0x5EC8,\n\t17191: 0x6630,\n\t17192: 0x6CB3,\n\t17193: 0x7455,\n\t17194: 0x8377,\n\t17195: 0x8766,\n\t17196: 0x8CC0,\n\t17197: 0x9050,\n\t17198: 0x971E,\n\t17199: 0x9C15,\n\t17200: 0x58D1,\n\t17201: 0x5B78,\n\t17202: 0x8650,\n\t17203: 0x8B14,\n\t17204: 0x9DB4,\n\t17205: 0x5BD2,\n\t17206: 0x6068,\n\t17207: 0x608D,\n\t17208: 0x65F1,\n\t17209: 0x6C57,\n\t17210: 0x6F22,\n\t17211: 0x6FA3,\n\t17212: 0x701A,\n\t17213: 0x7F55,\n\t17214: 0x7FF0,\n\t17215: 0x9591,\n\t17216: 0x9592,\n\t17217: 0x9650,\n\t17218: 0x97D3,\n\t17219: 0x5272,\n\t17220: 0x8F44,\n\t17221: 0x51FD,\n\t17222: 0x542B,\n\t17223: 0x54B8,\n\t17224: 0x5563,\n\t17225: 0x558A,\n\t17226: 0x6ABB,\n\t17227: 0x6DB5,\n\t17228: 0x7DD8,\n\t17229: 0x8266,\n\t17230: 0x929C,\n\t17231: 0x9677,\n\t17232: 0x9E79,\n\t17233: 0x5408,\n\t17234: 0x54C8,\n\t17235: 0x76D2,\n\t17236: 0x86E4,\n\t17237: 0x95A4,\n\t17238: 0x95D4,\n\t17239: 0x965C,\n\t17240: 0x4EA2,\n\t17241: 0x4F09,\n\t17242: 0x59EE,\n\t17243: 0x5AE6,\n\t17244: 0x5DF7,\n\t17245: 0x6052,\n\t17246: 0x6297,\n\t17247: 0x676D,\n\t17248: 0x6841,\n\t17249: 0x6C86,\n\t17250: 0x6E2F,\n\t17251: 0x7F38,\n\t17252: 0x809B,\n\t17253: 0x822A,\n\t17254: 0xFA08,\n\t17255: 0xFA09,\n\t17256: 0x9805,\n\t17257: 0x4EA5,\n\t17258: 0x5055,\n\t17259: 0x54B3,\n\t17260: 0x5793,\n\t17261: 0x595A,\n\t17262: 0x5B69,\n\t17263: 0x5BB3,\n\t17264: 0x61C8,\n\t17265: 0x6977,\n\t17266: 0x6D77,\n\t17267: 0x7023,\n\t17268: 0x87F9,\n\t17269: 0x89E3,\n\t17270: 0x8A72,\n\t17271: 0x8AE7,\n\t17272: 0x9082,\n\t17273: 0x99ED,\n\t17274: 0x9AB8,\n\t17275: 0x52BE,\n\t17276: 0x6838,\n\t17277: 0x5016,\n\t17278: 0x5E78,\n\t17279: 0x674F,\n\t17280: 0x8347,\n\t17281: 0x884C,\n\t17282: 0x4EAB,\n\t17283: 0x5411,\n\t17284: 0x56AE,\n\t17285: 0x73E6,\n\t17286: 0x9115,\n\t17287: 0x97FF,\n\t17288: 0x9909,\n\t17289: 0x9957,\n\t17290: 0x9999,\n\t17291: 0x5653,\n\t17292: 0x589F,\n\t17293: 0x865B,\n\t17294: 0x8A31,\n\t17295: 0x61B2,\n\t17296: 0x6AF6,\n\t17297: 0x737B,\n\t17298: 0x8ED2,\n\t17299: 0x6B47,\n\t17300: 0x96AA,\n\t17301: 0x9A57,\n\t17302: 0x5955,\n\t17303: 0x7200,\n\t17304: 0x8D6B,\n\t17305: 0x9769,\n\t17306: 0x4FD4,\n\t17307: 0x5CF4,\n\t17308: 0x5F26,\n\t17309: 0x61F8,\n\t17310: 0x665B,\n\t17311: 0x6CEB,\n\t17312: 0x70AB,\n\t17313: 0x7384,\n\t17314: 0x73B9,\n\t17315: 0x73FE,\n\t17316: 0x7729,\n\t17317: 0x774D,\n\t17318: 0x7D43,\n\t17319: 0x7D62,\n\t17320: 0x7E23,\n\t17321: 0x8237,\n\t17322: 0x8852,\n\t17323: 0xFA0A,\n\t17324: 0x8CE2,\n\t17325: 0x9249,\n\t17326: 0x986F,\n\t17327: 0x5B51,\n\t17328: 0x7A74,\n\t17329: 0x8840,\n\t17330: 0x9801,\n\t17331: 0x5ACC,\n\t17332: 0x4FE0,\n\t17333: 0x5354,\n\t17334: 0x593E,\n\t17335: 0x5CFD,\n\t17336: 0x633E,\n\t17337: 0x6D79,\n\t17338: 0x72F9,\n\t17339: 0x8105,\n\t17340: 0x8107,\n\t17341: 0x83A2,\n\t17342: 0x92CF,\n\t17343: 0x9830,\n\t17344: 0x4EA8,\n\t17345: 0x5144,\n\t17346: 0x5211,\n\t17347: 0x578B,\n\t17348: 0x5F62,\n\t17349: 0x6CC2,\n\t17350: 0x6ECE,\n\t17351: 0x7005,\n\t17352: 0x7050,\n\t17353: 0x70AF,\n\t17354: 0x7192,\n\t17355: 0x73E9,\n\t17356: 0x7469,\n\t17357: 0x834A,\n\t17358: 0x87A2,\n\t17359: 0x8861,\n\t17360: 0x9008,\n\t17361: 0x90A2,\n\t17362: 0x93A3,\n\t17363: 0x99A8,\n\t17364: 0x516E,\n\t17365: 0x5F57,\n\t17366: 0x60E0,\n\t17367: 0x6167,\n\t17368: 0x66B3,\n\t17369: 0x8559,\n\t17370: 0x8E4A,\n\t17371: 0x91AF,\n\t17372: 0x978B,\n\t17373: 0x4E4E,\n\t17374: 0x4E92,\n\t17375: 0x547C,\n\t17376: 0x58D5,\n\t17377: 0x58FA,\n\t17378: 0x597D,\n\t17379: 0x5CB5,\n\t17380: 0x5F27,\n\t17381: 0x6236,\n\t17382: 0x6248,\n\t17383: 0x660A,\n\t17384: 0x6667,\n\t17385: 0x6BEB,\n\t17386: 0x6D69,\n\t17387: 0x6DCF,\n\t17388: 0x6E56,\n\t17389: 0x6EF8,\n\t17390: 0x6F94,\n\t17391: 0x6FE0,\n\t17392: 0x6FE9,\n\t17393: 0x705D,\n\t17394: 0x72D0,\n\t17395: 0x7425,\n\t17396: 0x745A,\n\t17397: 0x74E0,\n\t17398: 0x7693,\n\t17399: 0x795C,\n\t17400: 0x7CCA,\n\t17401: 0x7E1E,\n\t17402: 0x80E1,\n\t17403: 0x82A6,\n\t17404: 0x846B,\n\t17405: 0x84BF,\n\t17406: 0x864E,\n\t17407: 0x865F,\n\t17408: 0x8774,\n\t17409: 0x8B77,\n\t17410: 0x8C6A,\n\t17411: 0x93AC,\n\t17412: 0x9800,\n\t17413: 0x9865,\n\t17414: 0x60D1,\n\t17415: 0x6216,\n\t17416: 0x9177,\n\t17417: 0x5A5A,\n\t17418: 0x660F,\n\t17419: 0x6DF7,\n\t17420: 0x6E3E,\n\t17421: 0x743F,\n\t17422: 0x9B42,\n\t17423: 0x5FFD,\n\t17424: 0x60DA,\n\t17425: 0x7B0F,\n\t17426: 0x54C4,\n\t17427: 0x5F18,\n\t17428: 0x6C5E,\n\t17429: 0x6CD3,\n\t17430: 0x6D2A,\n\t17431: 0x70D8,\n\t17432: 0x7D05,\n\t17433: 0x8679,\n\t17434: 0x8A0C,\n\t17435: 0x9D3B,\n\t17436: 0x5316,\n\t17437: 0x548C,\n\t17438: 0x5B05,\n\t17439: 0x6A3A,\n\t17440: 0x706B,\n\t17441: 0x7575,\n\t17442: 0x798D,\n\t17443: 0x79BE,\n\t17444: 0x82B1,\n\t17445: 0x83EF,\n\t17446: 0x8A71,\n\t17447: 0x8B41,\n\t17448: 0x8CA8,\n\t17449: 0x9774,\n\t17450: 0xFA0B,\n\t17451: 0x64F4,\n\t17452: 0x652B,\n\t17453: 0x78BA,\n\t17454: 0x78BB,\n\t17455: 0x7A6B,\n\t17456: 0x4E38,\n\t17457: 0x559A,\n\t17458: 0x5950,\n\t17459: 0x5BA6,\n\t17460: 0x5E7B,\n\t17461: 0x60A3,\n\t17462: 0x63DB,\n\t17463: 0x6B61,\n\t17464: 0x6665,\n\t17465: 0x6853,\n\t17466: 0x6E19,\n\t17467: 0x7165,\n\t17468: 0x74B0,\n\t17469: 0x7D08,\n\t17470: 0x9084,\n\t17471: 0x9A69,\n\t17472: 0x9C25,\n\t17473: 0x6D3B,\n\t17474: 0x6ED1,\n\t17475: 0x733E,\n\t17476: 0x8C41,\n\t17477: 0x95CA,\n\t17478: 0x51F0,\n\t17479: 0x5E4C,\n\t17480: 0x5FA8,\n\t17481: 0x604D,\n\t17482: 0x60F6,\n\t17483: 0x6130,\n\t17484: 0x614C,\n\t17485: 0x6643,\n\t17486: 0x6644,\n\t17487: 0x69A5,\n\t17488: 0x6CC1,\n\t17489: 0x6E5F,\n\t17490: 0x6EC9,\n\t17491: 0x6F62,\n\t17492: 0x714C,\n\t17493: 0x749C,\n\t17494: 0x7687,\n\t17495: 0x7BC1,\n\t17496: 0x7C27,\n\t17497: 0x8352,\n\t17498: 0x8757,\n\t17499: 0x9051,\n\t17500: 0x968D,\n\t17501: 0x9EC3,\n\t17502: 0x532F,\n\t17503: 0x56DE,\n\t17504: 0x5EFB,\n\t17505: 0x5F8A,\n\t17506: 0x6062,\n\t17507: 0x6094,\n\t17508: 0x61F7,\n\t17509: 0x6666,\n\t17510: 0x6703,\n\t17511: 0x6A9C,\n\t17512: 0x6DEE,\n\t17513: 0x6FAE,\n\t17514: 0x7070,\n\t17515: 0x736A,\n\t17516: 0x7E6A,\n\t17517: 0x81BE,\n\t17518: 0x8334,\n\t17519: 0x86D4,\n\t17520: 0x8AA8,\n\t17521: 0x8CC4,\n\t17522: 0x5283,\n\t17523: 0x7372,\n\t17524: 0x5B96,\n\t17525: 0x6A6B,\n\t17526: 0x9404,\n\t17527: 0x54EE,\n\t17528: 0x5686,\n\t17529: 0x5B5D,\n\t17530: 0x6548,\n\t17531: 0x6585,\n\t17532: 0x66C9,\n\t17533: 0x689F,\n\t17534: 0x6D8D,\n\t17535: 0x6DC6,\n\t17536: 0x723B,\n\t17537: 0x80B4,\n\t17538: 0x9175,\n\t17539: 0x9A4D,\n\t17540: 0x4FAF,\n\t17541: 0x5019,\n\t17542: 0x539A,\n\t17543: 0x540E,\n\t17544: 0x543C,\n\t17545: 0x5589,\n\t17546: 0x55C5,\n\t17547: 0x5E3F,\n\t17548: 0x5F8C,\n\t17549: 0x673D,\n\t17550: 0x7166,\n\t17551: 0x73DD,\n\t17552: 0x9005,\n\t17553: 0x52DB,\n\t17554: 0x52F3,\n\t17555: 0x5864,\n\t17556: 0x58CE,\n\t17557: 0x7104,\n\t17558: 0x718F,\n\t17559: 0x71FB,\n\t17560: 0x85B0,\n\t17561: 0x8A13,\n\t17562: 0x6688,\n\t17563: 0x85A8,\n\t17564: 0x55A7,\n\t17565: 0x6684,\n\t17566: 0x714A,\n\t17567: 0x8431,\n\t17568: 0x5349,\n\t17569: 0x5599,\n\t17570: 0x6BC1,\n\t17571: 0x5F59,\n\t17572: 0x5FBD,\n\t17573: 0x63EE,\n\t17574: 0x6689,\n\t17575: 0x7147,\n\t17576: 0x8AF1,\n\t17577: 0x8F1D,\n\t17578: 0x9EBE,\n\t17579: 0x4F11,\n\t17580: 0x643A,\n\t17581: 0x70CB,\n\t17582: 0x7566,\n\t17583: 0x8667,\n\t17584: 0x6064,\n\t17585: 0x8B4E,\n\t17586: 0x9DF8,\n\t17587: 0x5147,\n\t17588: 0x51F6,\n\t17589: 0x5308,\n\t17590: 0x6D36,\n\t17591: 0x80F8,\n\t17592: 0x9ED1,\n\t17593: 0x6615,\n\t17594: 0x6B23,\n\t17595: 0x7098,\n\t17596: 0x75D5,\n\t17597: 0x5403,\n\t17598: 0x5C79,\n\t17599: 0x7D07,\n\t17600: 0x8A16,\n\t17601: 0x6B20,\n\t17602: 0x6B3D,\n\t17603: 0x6B46,\n\t17604: 0x5438,\n\t17605: 0x6070,\n\t17606: 0x6D3D,\n\t17607: 0x7FD5,\n\t17608: 0x8208,\n\t17609: 0x50D6,\n\t17610: 0x51DE,\n\t17611: 0x559C,\n\t17612: 0x566B,\n\t17613: 0x56CD,\n\t17614: 0x59EC,\n\t17615: 0x5B09,\n\t17616: 0x5E0C,\n\t17617: 0x6199,\n\t17618: 0x6198,\n\t17619: 0x6231,\n\t17620: 0x665E,\n\t17621: 0x66E6,\n\t17622: 0x7199,\n\t17623: 0x71B9,\n\t17624: 0x71BA,\n\t17625: 0x72A7,\n\t17626: 0x79A7,\n\t17627: 0x7A00,\n\t17628: 0x7FB2,\n\t17629: 0x8A70,\n}\n\nconst numEncodeTables = 7\n\n// encodeX are the encoding tables from Unicode to EUC-KR code,\n// sorted by decreasing length.\n// encode0: 20893 entries for runes in [19968, 40861).\n// encode1: 11172 entries for runes in [44032, 55204).\n// encode2:  1625 entries for runes in [ 8213,  9838).\n// encode3:   990 entries for runes in [12288, 13278).\n// encode4:   945 entries for runes in [  161,  1106).\n// encode5:   268 entries for runes in [63744, 64012).\n// encode6:   230 entries for runes in [65281, 65511).\n\nconst encode0Low, encode0High = 19968, 40861\n\nvar encode0 = [...]uint16{\n\t19968 - 19968: 0xECE9,\n\t19969 - 19968: 0xEFCB,\n\t19971 - 19968: 0xF6D2,\n\t19975 - 19968: 0xD8B2,\n\t19976 - 19968: 0xEDDB,\n\t19977 - 19968: 0xDFB2,\n\t19978 - 19968: 0xDFBE,\n\t19979 - 19968: 0xF9BB,\n\t19981 - 19968: 0xDCF4,\n\t19985 - 19968: 0xF5E4,\n\t19988 - 19968: 0xF3A6,\n\t19989 - 19968: 0xDDE0,\n\t19990 - 19968: 0xE1A6,\n\t19992 - 19968: 0xCEF8,\n\t19993 - 19968: 0xDCB0,\n\t19998 - 19968: 0xE3AA,\n\t20013 - 19968: 0xF1E9,\n\t20018 - 19968: 0xCDFA,\n\t20024 - 19968: 0xFCAF,\n\t20025 - 19968: 0xD3A1,\n\t20027 - 19968: 0xF1AB,\n\t20034 - 19968: 0xE7D1,\n\t20035 - 19968: 0xD2AC,\n\t20037 - 19968: 0xCEF9,\n\t20043 - 19968: 0xF1FD,\n\t20045 - 19968: 0xDEBF,\n\t20046 - 19968: 0xFBBA,\n\t20047 - 19968: 0xF9B9,\n\t20054 - 19968: 0xCED2,\n\t20056 - 19968: 0xE3AB,\n\t20057 - 19968: 0xEBE0,\n\t20061 - 19968: 0xCEFA,\n\t20062 - 19968: 0xCBF7,\n\t20063 - 19968: 0xE5A5,\n\t20075 - 19968: 0xCAE1,\n\t20077 - 19968: 0xD4CC,\n\t20083 - 19968: 0xEAE1,\n\t20086 - 19968: 0xDCE3,\n\t20087 - 19968: 0xDFAD,\n\t20094 - 19968: 0xCBEB,\n\t20098 - 19968: 0xD5AF,\n\t20102 - 19968: 0xD6F5,\n\t20104 - 19968: 0xE5F8,\n\t20107 - 19968: 0xDEC0,\n\t20108 - 19968: 0xECA3,\n\t20110 - 19968: 0xE9CD,\n\t20112 - 19968: 0xEAA7,\n\t20113 - 19968: 0xE9F6,\n\t20114 - 19968: 0xFBBB,\n\t20116 - 19968: 0xE7E9,\n\t20117 - 19968: 0xEFCC,\n\t20120 - 19968: 0xD0E6,\n\t20123 - 19968: 0xDEC1,\n\t20126 - 19968: 0xE4AC,\n\t20129 - 19968: 0xD8CC,\n\t20130 - 19968: 0xF9F1,\n\t20132 - 19968: 0xCEDF,\n\t20133 - 19968: 0xFAA4,\n\t20134 - 19968: 0xE6B2,\n\t20136 - 19968: 0xFAFB,\n\t20139 - 19968: 0xFABD,\n\t20140 - 19968: 0xCCC8,\n\t20141 - 19968: 0xEFCD,\n\t20142 - 19968: 0xD5D5,\n\t20150 - 19968: 0xD3A2,\n\t20154 - 19968: 0xECD1,\n\t20160 - 19968: 0xE4A7,\n\t20161 - 19968: 0xECD2,\n\t20164 - 19968: 0xF6B1,\n\t20167 - 19968: 0xCEFB,\n\t20170 - 19968: 0xD0D1,\n\t20171 - 19968: 0xCBBF,\n\t20173 - 19968: 0xEDA4,\n\t20180 - 19968: 0xEDA8,\n\t20181 - 19968: 0xDEC2,\n\t20182 - 19968: 0xF6E2,\n\t20183 - 19968: 0xEDDC,\n\t20184 - 19968: 0xDCF5,\n\t20185 - 19968: 0xE0B9,\n\t20189 - 19968: 0xD4CE,\n\t20191 - 19968: 0xF4B5,\n\t20195 - 19968: 0xD3DB,\n\t20196 - 19968: 0xD6B5,\n\t20197 - 19968: 0xECA4,\n\t20208 - 19968: 0xE4E6,\n\t20210 - 19968: 0xF1EA,\n\t20214 - 19968: 0xCBEC,\n\t20215 - 19968: 0xCBC0,\n\t20219 - 19968: 0xECF2,\n\t20225 - 19968: 0xD0EA,\n\t20233 - 19968: 0xF9F2,\n\t20234 - 19968: 0xECA5,\n\t20235 - 19968: 0xD0DF,\n\t20237 - 19968: 0xE7EA,\n\t20238 - 19968: 0xD0EB,\n\t20239 - 19968: 0xDCD1,\n\t20240 - 19968: 0xDBE9,\n\t20241 - 19968: 0xFDCC,\n\t20271 - 19968: 0xDBD7,\n\t20276 - 19968: 0xDAE1,\n\t20278 - 19968: 0xD6B6,\n\t20280 - 19968: 0xE3DF,\n\t20282 - 19968: 0xDEC3,\n\t20284 - 19968: 0xDEC4,\n\t20285 - 19968: 0xCAA1,\n\t20291 - 19968: 0xEEEC,\n\t20294 - 19968: 0xD3A3,\n\t20295 - 19968: 0xEEB7,\n\t20296 - 19968: 0xF8CF,\n\t20301 - 19968: 0xEAC8,\n\t20302 - 19968: 0xEEB8,\n\t20303 - 19968: 0xF1AC,\n\t20304 - 19968: 0xF1A5,\n\t20305 - 19968: 0xE9CE,\n\t20309 - 19968: 0xF9BC,\n\t20313 - 19968: 0xE5F9,\n\t20314 - 19968: 0xECEA,\n\t20315 - 19968: 0xDDD6,\n\t20316 - 19968: 0xEDC2,\n\t20329 - 19968: 0xF8A5,\n\t20335 - 19968: 0xE5BA,\n\t20336 - 19968: 0xDBD8,\n\t20339 - 19968: 0xCAA2,\n\t20342 - 19968: 0xD1CD,\n\t20346 - 19968: 0xEEED,\n\t20350 - 19968: 0xECEB,\n\t20351 - 19968: 0xDEC5,\n\t20353 - 19968: 0xE3E0,\n\t20355 - 19968: 0xCAC9,\n\t20356 - 19968: 0xF2E9,\n\t20358 - 19968: 0xD5CE,\n\t20360 - 19968: 0xF6B6,\n\t20362 - 19968: 0xCEC2,\n\t20363 - 19968: 0xD6C7,\n\t20365 - 19968: 0xE3B4,\n\t20367 - 19968: 0xF1AD,\n\t20369 - 19968: 0xEAE2,\n\t20374 - 19968: 0xD7C2,\n\t20376 - 19968: 0xF3A7,\n\t20379 - 19968: 0xCDEA,\n\t20381 - 19968: 0xEBEE,\n\t20398 - 19968: 0xD9B2,\n\t20399 - 19968: 0xFDA5,\n\t20405 - 19968: 0xF6D5,\n\t20406 - 19968: 0xD5E2,\n\t20415 - 19968: 0xF8B5,\n\t20418 - 19968: 0xCCF5,\n\t20419 - 19968: 0xF5B5,\n\t20420 - 19968: 0xE4AD,\n\t20425 - 19968: 0xE7EB,\n\t20426 - 19968: 0xF1D5,\n\t20430 - 19968: 0xF0BB,\n\t20433 - 19968: 0xE9B5,\n\t20435 - 19968: 0xCCC9,\n\t20436 - 19968: 0xFAD5,\n\t20439 - 19968: 0xE1D4,\n\t20442 - 19968: 0xD7D6,\n\t20445 - 19968: 0xDCC1,\n\t20447 - 19968: 0xDEC6,\n\t20448 - 19968: 0xFAEF,\n\t20449 - 19968: 0xE3E1,\n\t20462 - 19968: 0xE1F3,\n\t20463 - 19968: 0xDCF6,\n\t20465 - 19968: 0xCEFC,\n\t20467 - 19968: 0xDBC4,\n\t20469 - 19968: 0xF8F1,\n\t20472 - 19968: 0xDCE4,\n\t20474 - 19968: 0xE5EF,\n\t20482 - 19968: 0xDCB1,\n\t20486 - 19968: 0xD5D6,\n\t20489 - 19968: 0xF3DA,\n\t20491 - 19968: 0xCBC1,\n\t20493 - 19968: 0xDBC3,\n\t20497 - 19968: 0xD9FA,\n\t20498 - 19968: 0xD3EE,\n\t20502 - 19968: 0xFAB8,\n\t20505 - 19968: 0xFDA6,\n\t20506 - 19968: 0xEBEF,\n\t20508 - 19968: 0xF4A6,\n\t20510 - 19968: 0xCCCA,\n\t20511 - 19968: 0xF3A8,\n\t20513 - 19968: 0xF3DB,\n\t20515 - 19968: 0xDBA7,\n\t20516 - 19968: 0xF6B7,\n\t20518 - 19968: 0xCFE6,\n\t20519 - 19968: 0xF0F2,\n\t20520 - 19968: 0xCBDA,\n\t20522 - 19968: 0xE7D2,\n\t20523 - 19968: 0xD7C3,\n\t20524 - 19968: 0xF6F0,\n\t20525 - 19968: 0xE8DE,\n\t20539 - 19968: 0xE5A6,\n\t20547 - 19968: 0xE5E7,\n\t20551 - 19968: 0xCAA3,\n\t20552 - 19968: 0xCCA7,\n\t20553 - 19968: 0xEAC9,\n\t20559 - 19968: 0xF8B6,\n\t20565 - 19968: 0xFAA5,\n\t20570 - 19968: 0xF1AE,\n\t20572 - 19968: 0xEFCE,\n\t20581 - 19968: 0xCBED,\n\t20596 - 19968: 0xF6B0,\n\t20597 - 19968: 0xEFCF,\n\t20598 - 19968: 0xE9CF,\n\t20600 - 19968: 0xF7DE,\n\t20608 - 19968: 0xCED3,\n\t20613 - 19968: 0xDCF7,\n\t20621 - 19968: 0xDBA8,\n\t20625 - 19968: 0xCBF8,\n\t20632 - 19968: 0xDFA1,\n\t20633 - 19968: 0xDDE1,\n\t20652 - 19968: 0xF5CA,\n\t20653 - 19968: 0xE9B6,\n\t20658 - 19968: 0xE7EC,\n\t20659 - 19968: 0xEEEE,\n\t20661 - 19968: 0xF3F0,\n\t20663 - 19968: 0xDFBF,\n\t20670 - 19968: 0xCCCB,\n\t20677 - 19968: 0xD0C1,\n\t20681 - 19968: 0xF4D2,\n\t20682 - 19968: 0xE0BA,\n\t20687 - 19968: 0xDFC0,\n\t20689 - 19968: 0xCEE0,\n\t20693 - 19968: 0xDCD2,\n\t20694 - 19968: 0xFDEA,\n\t20698 - 19968: 0xD6F6,\n\t20702 - 19968: 0xEACA,\n\t20709 - 19968: 0xE8E9,\n\t20711 - 19968: 0xE3AC,\n\t20717 - 19968: 0xF3D0,\n\t20729 - 19968: 0xCAA4,\n\t20731 - 19968: 0xDBF8,\n\t20735 - 19968: 0xDEC7,\n\t20736 - 19968: 0xEBF0,\n\t20737 - 19968: 0xF1D6,\n\t20740 - 19968: 0xE5E2,\n\t20742 - 19968: 0xCCCC,\n\t20745 - 19968: 0xCBFB,\n\t20754 - 19968: 0xEAE3,\n\t20767 - 19968: 0xDFC1,\n\t20769 - 19968: 0xD6ED,\n\t20778 - 19968: 0xE9D0,\n\t20786 - 19968: 0xEEB9,\n\t20791 - 19968: 0xD5E3,\n\t20794 - 19968: 0xD1D3,\n\t20796 - 19968: 0xE5F0,\n\t20800 - 19968: 0xE8B4,\n\t20801 - 19968: 0xEBC3,\n\t20803 - 19968: 0xEAAA,\n\t20804 - 19968: 0xFAFC,\n\t20805 - 19968: 0xF5F6,\n\t20806 - 19968: 0xF0BC,\n\t20807 - 19968: 0xFDD4,\n\t20808 - 19968: 0xE0BB,\n\t20809 - 19968: 0xCEC3,\n\t20811 - 19968: 0xD0BA,\n\t20812 - 19968: 0xF7BA,\n\t20813 - 19968: 0xD8F3,\n\t20814 - 19968: 0xF7CD,\n\t20818 - 19968: 0xE4AE,\n\t20828 - 19968: 0xD4DF,\n\t20834 - 19968: 0xD0E7,\n\t20837 - 19968: 0xECFD,\n\t20839 - 19968: 0xD2AE,\n\t20840 - 19968: 0xEEEF,\n\t20841 - 19968: 0xD5D7,\n\t20842 - 19968: 0xEAE4,\n\t20843 - 19968: 0xF8A2,\n\t20844 - 19968: 0xCDEB,\n\t20845 - 19968: 0xD7BF,\n\t20846 - 19968: 0xFBB1,\n\t20849 - 19968: 0xCDEC,\n\t20853 - 19968: 0xDCB2,\n\t20854 - 19968: 0xD0EC,\n\t20855 - 19968: 0xCEFD,\n\t20856 - 19968: 0xEEF0,\n\t20860 - 19968: 0xCCC2,\n\t20864 - 19968: 0xD0ED,\n\t20870 - 19968: 0xE5F7,\n\t20874 - 19968: 0xF3FC,\n\t20877 - 19968: 0xEEA2,\n\t20882 - 19968: 0xD9B3,\n\t20885 - 19968: 0xD8F4,\n\t20887 - 19968: 0xE9B7,\n\t20896 - 19968: 0xCEAE,\n\t20901 - 19968: 0xD9A2,\n\t20906 - 19968: 0xD8F1,\n\t20908 - 19968: 0xD4CF,\n\t20918 - 19968: 0xE5A7,\n\t20919 - 19968: 0xD5D2,\n\t20925 - 19968: 0xD6A9,\n\t20932 - 19968: 0xF4A2,\n\t20934 - 19968: 0xF1D7,\n\t20937 - 19968: 0xD5D8,\n\t20939 - 19968: 0xF0BD,\n\t20940 - 19968: 0xD7D0,\n\t20941 - 19968: 0xD4D0,\n\t20956 - 19968: 0xD7CF,\n\t20957 - 19968: 0xEBEA,\n\t20958 - 19968: 0xFDEB,\n\t20961 - 19968: 0xDBED,\n\t20976 - 19968: 0xFCC5,\n\t20977 - 19968: 0xCBC2,\n\t20982 - 19968: 0xFDD5,\n\t20984 - 19968: 0xF4C8,\n\t20985 - 19968: 0xE8EA,\n\t20986 - 19968: 0xF5F3,\n\t20989 - 19968: 0xF9DE,\n\t20992 - 19968: 0xD3EF,\n\t20995 - 19968: 0xECD3,\n\t20998 - 19968: 0xDDC2,\n\t20999 - 19968: 0xEFB7,\n\t21000 - 19968: 0xE7D4,\n\t21002 - 19968: 0xCACA,\n\t21006 - 19968: 0xD9FB,\n\t21009 - 19968: 0xFAFD,\n\t21015 - 19968: 0xD6AA,\n\t21021 - 19968: 0xF4F8,\n\t21028 - 19968: 0xF7F7,\n\t21029 - 19968: 0xDCAC,\n\t21033 - 19968: 0xD7D7,\n\t21034 - 19968: 0xDFA2,\n\t21038 - 19968: 0xCEBE,\n\t21040 - 19968: 0xD3F0,\n\t21046 - 19968: 0xF0A4,\n\t21047 - 19968: 0xE1EC,\n\t21048 - 19968: 0xCFE7,\n\t21049 - 19968: 0xF3CB,\n\t21050 - 19968: 0xEDA9,\n\t21051 - 19968: 0xCABE,\n\t21059 - 19968: 0xF4EF,\n\t21063 - 19968: 0xF6CE,\n\t21066 - 19968: 0xDEFB,\n\t21067 - 19968: 0xD0BB,\n\t21068 - 19968: 0xD5B7,\n\t21069 - 19968: 0xEEF1,\n\t21076 - 19968: 0xF4A8,\n\t21078 - 19968: 0xDCF8,\n\t21083 - 19968: 0xCBA7,\n\t21085 - 19968: 0xDACE,\n\t21089 - 19968: 0xE0E6,\n\t21097 - 19968: 0xEDA5,\n\t21098 - 19968: 0xEEF2,\n\t21103 - 19968: 0xDCF9,\n\t21106 - 19968: 0xF9DC,\n\t21109 - 19968: 0xF3DC,\n\t21117 - 19968: 0xF8F2,\n\t21119 - 19968: 0xF4F9,\n\t21123 - 19968: 0xFCF1,\n\t21127 - 19968: 0xD0BC,\n\t21128 - 19968: 0xDBF9,\n\t21129 - 19968: 0xD7B1,\n\t21133 - 19968: 0xCBFC,\n\t21137 - 19968: 0xF0A5,\n\t21138 - 19968: 0xCBFD,\n\t21147 - 19968: 0xD5F4,\n\t21151 - 19968: 0xCDED,\n\t21152 - 19968: 0xCAA5,\n\t21155 - 19968: 0xD6AB,\n\t21156 - 19968: 0xD0C2,\n\t21161 - 19968: 0xF0BE,\n\t21162 - 19968: 0xD2BD,\n\t21163 - 19968: 0xCCA4,\n\t21182 - 19968: 0xFAB6,\n\t21185 - 19968: 0xCCCD,\n\t21187 - 19968: 0xDAFA,\n\t21189 - 19968: 0xF6CF,\n\t21191 - 19968: 0xE9B8,\n\t21193 - 19968: 0xD8F5,\n\t21197 - 19968: 0xCCCE,\n\t21202 - 19968: 0xD7CD,\n\t21205 - 19968: 0xD4D1,\n\t21206 - 19968: 0xE9ED,\n\t21208 - 19968: 0xCAEB,\n\t21209 - 19968: 0xD9E2,\n\t21211 - 19968: 0xFDB2,\n\t21213 - 19968: 0xE3AD,\n\t21214 - 19968: 0xD6CC,\n\t21215 - 19968: 0xD9B4,\n\t21218 - 19968: 0xE1A7,\n\t21219 - 19968: 0xEED3,\n\t21220 - 19968: 0xD0C3,\n\t21235 - 19968: 0xFDB3,\n\t21237 - 19968: 0xD5E4,\n\t21240 - 19968: 0xCFE8,\n\t21242 - 19968: 0xEDC3,\n\t21243 - 19968: 0xD0B2,\n\t21246 - 19968: 0xCEFE,\n\t21247 - 19968: 0xDAA8,\n\t21253 - 19968: 0xF8D0,\n\t21256 - 19968: 0xFDD6,\n\t21261 - 19968: 0xF8D1,\n\t21263 - 19968: 0xF8D2,\n\t21264 - 19968: 0xDCD3,\n\t21269 - 19968: 0xDDE2,\n\t21270 - 19968: 0xFBF9,\n\t21271 - 19968: 0xDDC1,\n\t21273 - 19968: 0xE3B5,\n\t21280 - 19968: 0xEDDD,\n\t21281 - 19968: 0xCEC4,\n\t21283 - 19968: 0xCBA1,\n\t21290 - 19968: 0xDDE3,\n\t21295 - 19968: 0xFCDD,\n\t21305 - 19968: 0xF9AF,\n\t21311 - 19968: 0xD2FB,\n\t21312 - 19968: 0xCFA1,\n\t21313 - 19968: 0xE4A8,\n\t21315 - 19968: 0xF4B6,\n\t21316 - 19968: 0xECFE,\n\t21319 - 19968: 0xE3AE,\n\t21320 - 19968: 0xE7ED,\n\t21321 - 19968: 0xFDC1,\n\t21322 - 19968: 0xDAE2,\n\t21325 - 19968: 0xD8B3,\n\t21329 - 19968: 0xDDE4,\n\t21330 - 19968: 0xF0EF,\n\t21331 - 19968: 0xF6F1,\n\t21332 - 19968: 0xFAF0,\n\t21335 - 19968: 0xD1F5,\n\t21338 - 19968: 0xDACF,\n\t21340 - 19968: 0xDCD4,\n\t21342 - 19968: 0xDCA6,\n\t21344 - 19968: 0xEFBF,\n\t21350 - 19968: 0xCECF,\n\t21352 - 19968: 0xE0D9,\n\t21359 - 19968: 0xD9D6,\n\t21360 - 19968: 0xECD4,\n\t21361 - 19968: 0xEACB,\n\t21364 - 19968: 0xCABF,\n\t21365 - 19968: 0xD5B0,\n\t21367 - 19968: 0xCFE9,\n\t21373 - 19968: 0xF1ED,\n\t21375 - 19968: 0xCCCF,\n\t21380 - 19968: 0xE4F8,\n\t21395 - 19968: 0xE4ED,\n\t21400 - 19968: 0xD7D8,\n\t21402 - 19968: 0xFDA7,\n\t21407 - 19968: 0xEAAB,\n\t21408 - 19968: 0xF6B2,\n\t21413 - 19968: 0xCFF0,\n\t21414 - 19968: 0xF9BD,\n\t21421 - 19968: 0xE6F4,\n\t21435 - 19968: 0xCBDB,\n\t21443 - 19968: 0xF3D1,\n\t21448 - 19968: 0xE9D1,\n\t21449 - 19968: 0xF3A9,\n\t21450 - 19968: 0xD0E0,\n\t21451 - 19968: 0xE9D2,\n\t21453 - 19968: 0xDAE3,\n\t21460 - 19968: 0xE2D2,\n\t21462 - 19968: 0xF6A2,\n\t21463 - 19968: 0xE1F4,\n\t21467 - 19968: 0xDAE4,\n\t21473 - 19968: 0xE7D5,\n\t21474 - 19968: 0xF5BF,\n\t21475 - 19968: 0xCFA2,\n\t21476 - 19968: 0xCDAF,\n\t21477 - 19968: 0xCFA3,\n\t21481 - 19968: 0xCDB0,\n\t21482 - 19968: 0xF1FE,\n\t21483 - 19968: 0xD0A3,\n\t21484 - 19968: 0xE1AF,\n\t21485 - 19968: 0xF8A3,\n\t21487 - 19968: 0xCAA6,\n\t21488 - 19968: 0xF7BB,\n\t21489 - 19968: 0xF2EA,\n\t21490 - 19968: 0xDEC8,\n\t21491 - 19968: 0xE9D3,\n\t21496 - 19968: 0xDEC9,\n\t21507 - 19968: 0xFDDE,\n\t21508 - 19968: 0xCAC0,\n\t21512 - 19968: 0xF9EA,\n\t21513 - 19968: 0xD1CE,\n\t21514 - 19968: 0xEED4,\n\t21516 - 19968: 0xD4D2,\n\t21517 - 19968: 0xD9A3,\n\t21518 - 19968: 0xFDA8,\n\t21519 - 19968: 0xD7D9,\n\t21520 - 19968: 0xF7CE,\n\t21521 - 19968: 0xFABE,\n\t21531 - 19968: 0xCFD6,\n\t21533 - 19968: 0xD7F0,\n\t21535 - 19968: 0xEBE1,\n\t21536 - 19968: 0xF8C5,\n\t21542 - 19968: 0xDCFA,\n\t21545 - 19968: 0xDDC3,\n\t21547 - 19968: 0xF9DF,\n\t21555 - 19968: 0xE7EF,\n\t21560 - 19968: 0xFDE5,\n\t21561 - 19968: 0xF6A3,\n\t21563 - 19968: 0xD9FC,\n\t21564 - 19968: 0xFDA9,\n\t21566 - 19968: 0xE7EE,\n\t21570 - 19968: 0xD5E5,\n\t21576 - 19968: 0xEFD0,\n\t21578 - 19968: 0xCDB1,\n\t21585 - 19968: 0xF7A2,\n\t21608 - 19968: 0xF1B2,\n\t21610 - 19968: 0xF1B1,\n\t21617 - 19968: 0xCDB2,\n\t21619 - 19968: 0xDAAB,\n\t21621 - 19968: 0xCAA7,\n\t21627 - 19968: 0xE3E2,\n\t21628 - 19968: 0xFBBC,\n\t21629 - 19968: 0xD9A4,\n\t21632 - 19968: 0xEEBA,\n\t21638 - 19968: 0xF8D3,\n\t21644 - 19968: 0xFBFA,\n\t21646 - 19968: 0xCFA4,\n\t21648 - 19968: 0xDCFB,\n\t21668 - 19968: 0xF6E3,\n\t21672 - 19968: 0xEDAA,\n\t21675 - 19968: 0xF2A1,\n\t21676 - 19968: 0xCEE1,\n\t21683 - 19968: 0xFAA6,\n\t21688 - 19968: 0xF9E0,\n\t21693 - 19968: 0xECD6,\n\t21696 - 19968: 0xE4EE,\n\t21697 - 19968: 0xF9A1,\n\t21700 - 19968: 0xFBEF,\n\t21704 - 19968: 0xF9EB,\n\t21705 - 19968: 0xEEA3,\n\t21729 - 19968: 0xEAAC,\n\t21733 - 19968: 0xCAA8,\n\t21736 - 19968: 0xF4FA,\n\t21741 - 19968: 0xCDD6,\n\t21742 - 19968: 0xFCF6,\n\t21746 - 19968: 0xF4C9,\n\t21754 - 19968: 0xF8D4,\n\t21764 - 19968: 0xF8A6,\n\t21766 - 19968: 0xDECA,\n\t21767 - 19968: 0xF2C6,\n\t21774 - 19968: 0xD7DA,\n\t21776 - 19968: 0xD3D0,\n\t21788 - 19968: 0xD8C5,\n\t21807 - 19968: 0xEAE6,\n\t21809 - 19968: 0xF3DD,\n\t21813 - 19968: 0xE4DA,\n\t21822 - 19968: 0xF6E4,\n\t21828 - 19968: 0xF6F2,\n\t21830 - 19968: 0xDFC2,\n\t21839 - 19968: 0xD9FD,\n\t21843 - 19968: 0xCCF6,\n\t21846 - 19968: 0xD3BA,\n\t21854 - 19968: 0xE4AF,\n\t21859 - 19968: 0xF9E1,\n\t21884 - 19968: 0xF0A6,\n\t21888 - 19968: 0xCBD3,\n\t21892 - 19968: 0xE0BC,\n\t21894 - 19968: 0xF4CA,\n\t21895 - 19968: 0xD4FA,\n\t21897 - 19968: 0xFDAA,\n\t21898 - 19968: 0xF9E2,\n\t21912 - 19968: 0xF4B7,\n\t21913 - 19968: 0xFDC2,\n\t21914 - 19968: 0xFCB0,\n\t21916 - 19968: 0xFDEC,\n\t21917 - 19968: 0xCAE2,\n\t21927 - 19968: 0xFDBD,\n\t21929 - 19968: 0xEAE7,\n\t21930 - 19968: 0xDFC3,\n\t21931 - 19968: 0xD1D2,\n\t21932 - 19968: 0xCEE2,\n\t21934 - 19968: 0xD3A4,\n\t21957 - 19968: 0xFDAB,\n\t21959 - 19968: 0xDFE0,\n\t21972 - 19968: 0xF2C7,\n\t21978 - 19968: 0xE7F0,\n\t21980 - 19968: 0xD0EE,\n\t21983 - 19968: 0xF3AA,\n\t21987 - 19968: 0xDECB,\n\t21988 - 19968: 0xF6B8,\n\t22013 - 19968: 0xE1F5,\n\t22014 - 19968: 0xF1B3,\n\t22022 - 19968: 0xF7A3,\n\t22025 - 19968: 0xCAA9,\n\t22036 - 19968: 0xCFA5,\n\t22039 - 19968: 0xDFC4,\n\t22063 - 19968: 0xE1B0,\n\t22066 - 19968: 0xF0BF,\n\t22068 - 19968: 0xF6A4,\n\t22070 - 19968: 0xE3B6,\n\t22099 - 19968: 0xFAC6,\n\t22120 - 19968: 0xD0EF,\n\t22123 - 19968: 0xFDED,\n\t22132 - 19968: 0xDDC4,\n\t22150 - 19968: 0xFCF7,\n\t22181 - 19968: 0xE6BF,\n\t22188 - 19968: 0xDEAD,\n\t22190 - 19968: 0xFABF,\n\t22196 - 19968: 0xE5F1,\n\t22204 - 19968: 0xEDC4,\n\t22218 - 19968: 0xD2A5,\n\t22221 - 19968: 0xFDEE,\n\t22225 - 19968: 0xF5B6,\n\t22234 - 19968: 0xE1F6,\n\t22235 - 19968: 0xDECC,\n\t22238 - 19968: 0xFCDE,\n\t22240 - 19968: 0xECD7,\n\t22256 - 19968: 0xCDDD,\n\t22265 - 19968: 0xD6B7,\n\t22266 - 19968: 0xCDB3,\n\t22275 - 19968: 0xF8D5,\n\t22276 - 19968: 0xE5D8,\n\t22280 - 19968: 0xCFEA,\n\t22283 - 19968: 0xCFD0,\n\t22285 - 19968: 0xEACC,\n\t22290 - 19968: 0xEAAE,\n\t22291 - 19968: 0xEAAD,\n\t22294 - 19968: 0xD3F1,\n\t22296 - 19968: 0xD3A5,\n\t22303 - 19968: 0xF7CF,\n\t22312 - 19968: 0xEEA4,\n\t22317 - 19968: 0xD0A4,\n\t22320 - 19968: 0xF2A2,\n\t22331 - 19968: 0xD0F0,\n\t22336 - 19968: 0xF2A3,\n\t22338 - 19968: 0xF7F8,\n\t22343 - 19968: 0xD0B3,\n\t22346 - 19968: 0xDBA9,\n\t22349 - 19968: 0xD3BB,\n\t22350 - 19968: 0xCAEC,\n\t22352 - 19968: 0xF1A6,\n\t22353 - 19968: 0xCBD5,\n\t22369 - 19968: 0xF7E7,\n\t22372 - 19968: 0xCDDE,\n\t22374 - 19968: 0xF7A4,\n\t22378 - 19968: 0xF8C0,\n\t22382 - 19968: 0xD3DD,\n\t22384 - 19968: 0xCCD0,\n\t22389 - 19968: 0xCFA6,\n\t22396 - 19968: 0xF6F3,\n\t22402 - 19968: 0xE1F7,\n\t22408 - 19968: 0xD3DC,\n\t22411 - 19968: 0xFAFE,\n\t22419 - 19968: 0xFAA7,\n\t22432 - 19968: 0xEBD9,\n\t22434 - 19968: 0xCFA7,\n\t22435 - 19968: 0xEAAF,\n\t22467 - 19968: 0xE4EF,\n\t22471 - 19968: 0xE9B9,\n\t22472 - 19968: 0xF1D8,\n\t22475 - 19968: 0xD8D8,\n\t22478 - 19968: 0xE0F2,\n\t22495 - 19968: 0xE6B4,\n\t22496 - 19968: 0xDCFC,\n\t22512 - 19968: 0xF3F1,\n\t22516 - 19968: 0xE3D0,\n\t22519 - 19968: 0xF2FB,\n\t22521 - 19968: 0xDBC6,\n\t22522 - 19968: 0xD0F1,\n\t22524 - 19968: 0xD0F2,\n\t22528 - 19968: 0xCFDC,\n\t22530 - 19968: 0xD3D1,\n\t22533 - 19968: 0xCCB1,\n\t22534 - 19968: 0xF7D8,\n\t22536 - 19968: 0xCBA8,\n\t22537 - 19968: 0xEBBC,\n\t22538 - 19968: 0xE4BE,\n\t22558 - 19968: 0xF4DC,\n\t22561 - 19968: 0xDCC2,\n\t22564 - 19968: 0xF0A7,\n\t22567 - 19968: 0xE6C0,\n\t22570 - 19968: 0xCAED,\n\t22575 - 19968: 0xE8EB,\n\t22576 - 19968: 0xE5E8,\n\t22577 - 19968: 0xDCC3,\n\t22580 - 19968: 0xEDDE,\n\t22581 - 19968: 0xD3F2,\n\t22586 - 19968: 0xCCF7,\n\t22602 - 19968: 0xCED4,\n\t22603 - 19968: 0xE7AB,\n\t22607 - 19968: 0xCBC3,\n\t22609 - 19968: 0xE1B1,\n\t22612 - 19968: 0xF7B2,\n\t22615 - 19968: 0xD3F3,\n\t22616 - 19968: 0xD3D2,\n\t22618 - 19968: 0xF5C0,\n\t22622 - 19968: 0xDFDD,\n\t22625 - 19968: 0xEEF3,\n\t22626 - 19968: 0xE7F1,\n\t22628 - 19968: 0xFDB4,\n\t22645 - 19968: 0xF2C8,\n\t22649 - 19968: 0xF3D2,\n\t22652 - 19968: 0xEEF4,\n\t22654 - 19968: 0xE2D3,\n\t22659 - 19968: 0xCCD1,\n\t22661 - 19968: 0xDFEA,\n\t22665 - 19968: 0xE9BA,\n\t22675 - 19968: 0xD9D7,\n\t22684 - 19968: 0xF5CD,\n\t22686 - 19968: 0xF1F2,\n\t22687 - 19968: 0xFAC7,\n\t22696 - 19968: 0xD9F8,\n\t22697 - 19968: 0xD4C2,\n\t22702 - 19968: 0xF6E5,\n\t22707 - 19968: 0xDDC5,\n\t22714 - 19968: 0xE7F2,\n\t22715 - 19968: 0xEDDF,\n\t22718 - 19968: 0xCACB,\n\t22721 - 19968: 0xDBFA,\n\t22725 - 19968: 0xE8B5,\n\t22727 - 19968: 0xD3A6,\n\t22734 - 19968: 0xFDB5,\n\t22737 - 19968: 0xF9C9,\n\t22739 - 19968: 0xE4E2,\n\t22741 - 19968: 0xFBBD,\n\t22744 - 19968: 0xD7A4,\n\t22745 - 19968: 0xCEC5,\n\t22750 - 19968: 0xCED5,\n\t22751 - 19968: 0xD6E6,\n\t22756 - 19968: 0xE5BD,\n\t22763 - 19968: 0xDECD,\n\t22764 - 19968: 0xECF3,\n\t22767 - 19968: 0xEDE0,\n\t22777 - 19968: 0xECEC,\n\t22778 - 19968: 0xFBBE,\n\t22779 - 19968: 0xDFEB,\n\t22781 - 19968: 0xE1F8,\n\t22799 - 19968: 0xF9BE,\n\t22804 - 19968: 0xD0F3,\n\t22805 - 19968: 0xE0AA,\n\t22806 - 19968: 0xE8E2,\n\t22809 - 19968: 0xE2D4,\n\t22810 - 19968: 0xD2FD,\n\t22812 - 19968: 0xE5A8,\n\t22818 - 19968: 0xD9D3,\n\t22823 - 19968: 0xD3DE,\n\t22825 - 19968: 0xF4B8,\n\t22826 - 19968: 0xF7BC,\n\t22827 - 19968: 0xDCFD,\n\t22829 - 19968: 0xE8EC,\n\t22830 - 19968: 0xE4E7,\n\t22833 - 19968: 0xE3F7,\n\t22839 - 19968: 0xECA8,\n\t22846 - 19968: 0xFAF1,\n\t22852 - 19968: 0xE5F2,\n\t22855 - 19968: 0xD0F4,\n\t22856 - 19968: 0xD2AF,\n\t22857 - 19968: 0xDCE5,\n\t22862 - 19968: 0xD0A5,\n\t22863 - 19968: 0xF1B4,\n\t22864 - 19968: 0xFCB1,\n\t22865 - 19968: 0xCCF8,\n\t22868 - 19968: 0xDDC6,\n\t22869 - 19968: 0xFAD1,\n\t22871 - 19968: 0xF7DF,\n\t22874 - 19968: 0xFAA8,\n\t22880 - 19968: 0xEEF5,\n\t22882 - 19968: 0xDECE,\n\t22887 - 19968: 0xE7F3,\n\t22890 - 19968: 0xF7AC,\n\t22891 - 19968: 0xEBC4,\n\t22892 - 19968: 0xEDE1,\n\t22893 - 19968: 0xE0AB,\n\t22894 - 19968: 0xDDC7,\n\t22899 - 19968: 0xD2B3,\n\t22900 - 19968: 0xD2BF,\n\t22904 - 19968: 0xCACC,\n\t22909 - 19968: 0xFBBF,\n\t22914 - 19968: 0xE5FD,\n\t22915 - 19968: 0xDDE5,\n\t22916 - 19968: 0xD8CD,\n\t22922 - 19968: 0xECF4,\n\t22931 - 19968: 0xD0F5,\n\t22934 - 19968: 0xE8ED,\n\t22935 - 19968: 0xD0D2,\n\t22937 - 19968: 0xD9D8,\n\t22949 - 19968: 0xF6E6,\n\t22952 - 19968: 0xDBAA,\n\t22956 - 19968: 0xF7E0,\n\t22969 - 19968: 0xD8D9,\n\t22971 - 19968: 0xF4A3,\n\t22974 - 19968: 0xF4DD,\n\t22979 - 19968: 0xEFD1,\n\t22982 - 19968: 0xD9B5,\n\t22985 - 19968: 0xEDAB,\n\t22987 - 19968: 0xE3B7,\n\t22992 - 19968: 0xEEBB,\n\t22993 - 19968: 0xCDB4,\n\t22995 - 19968: 0xE0F3,\n\t22996 - 19968: 0xEACD,\n\t23001 - 19968: 0xECF5,\n\t23002 - 19968: 0xE8EE,\n\t23004 - 19968: 0xCBA9,\n\t23005 - 19968: 0xF1AF,\n\t23014 - 19968: 0xCACD,\n\t23016 - 19968: 0xECA9,\n\t23018 - 19968: 0xF2EB,\n\t23020 - 19968: 0xFDEF,\n\t23022 - 19968: 0xF9F3,\n\t23032 - 19968: 0xE6C1,\n\t23035 - 19968: 0xECD8,\n\t23039 - 19968: 0xEDAC,\n\t23041 - 19968: 0xEACE,\n\t23043 - 19968: 0xE8DF,\n\t23057 - 19968: 0xDECF,\n\t23064 - 19968: 0xD2A6,\n\t23067 - 19968: 0xE7F4,\n\t23068 - 19968: 0xD1D6,\n\t23071 - 19968: 0xE6C2,\n\t23072 - 19968: 0xE3E3,\n\t23077 - 19968: 0xE4B0,\n\t23081 - 19968: 0xD8B4,\n\t23094 - 19968: 0xF6A5,\n\t23100 - 19968: 0xF3DE,\n\t23105 - 19968: 0xD7A5,\n\t23110 - 19968: 0xF7E8,\n\t23113 - 19968: 0xE8C6,\n\t23130 - 19968: 0xFBE6,\n\t23138 - 19968: 0xDDE6,\n\t23142 - 19968: 0xDCFE,\n\t23186 - 19968: 0xD8DA,\n\t23194 - 19968: 0xDAAC,\n\t23195 - 19968: 0xEAB0,\n\t23204 - 19968: 0xE3B8,\n\t23233 - 19968: 0xCAAA,\n\t23234 - 19968: 0xE1F9,\n\t23236 - 19968: 0xEAB1,\n\t23241 - 19968: 0xF2EC,\n\t23244 - 19968: 0xFAEE,\n\t23265 - 19968: 0xEED5,\n\t23270 - 19968: 0xF9F4,\n\t23273 - 19968: 0xD2EC,\n\t23301 - 19968: 0xFBFB,\n\t23305 - 19968: 0xFDF0,\n\t23307 - 19968: 0xE0BD,\n\t23308 - 19968: 0xCEE3,\n\t23318 - 19968: 0xF8C6,\n\t23338 - 19968: 0xDEAE,\n\t23360 - 19968: 0xDFC5,\n\t23363 - 19968: 0xE5BE,\n\t23376 - 19968: 0xEDAD,\n\t23377 - 19968: 0xFAEA,\n\t23380 - 19968: 0xCDEE,\n\t23381 - 19968: 0xEDA6,\n\t23383 - 19968: 0xEDAE,\n\t23384 - 19968: 0xF0ED,\n\t23386 - 19968: 0xDDA1,\n\t23388 - 19968: 0xEDAF,\n\t23389 - 19968: 0xFCF8,\n\t23391 - 19968: 0xD8EB,\n\t23395 - 19968: 0xCCF9,\n\t23396 - 19968: 0xCDB5,\n\t23401 - 19968: 0xFAA9,\n\t23403 - 19968: 0xE1DD,\n\t23408 - 19968: 0xE2D5,\n\t23409 - 19968: 0xEDCF,\n\t23413 - 19968: 0xDDA2,\n\t23416 - 19968: 0xF9CA,\n\t23418 - 19968: 0xEAE8,\n\t23420 - 19968: 0xE5ED,\n\t23429 - 19968: 0xD3EB,\n\t23431 - 19968: 0xE9D4,\n\t23432 - 19968: 0xE1FA,\n\t23433 - 19968: 0xE4CC,\n\t23435 - 19968: 0xE1E4,\n\t23436 - 19968: 0xE8C7,\n\t23439 - 19968: 0xCEDB,\n\t23443 - 19968: 0xDCD5,\n\t23445 - 19968: 0xF7B5,\n\t23446 - 19968: 0xFCF3,\n\t23447 - 19968: 0xF0F3,\n\t23448 - 19968: 0xCEAF,\n\t23449 - 19968: 0xF1B5,\n\t23450 - 19968: 0xEFD2,\n\t23451 - 19968: 0xE8C8,\n\t23452 - 19968: 0xEBF1,\n\t23458 - 19968: 0xCBD4,\n\t23459 - 19968: 0xE0BE,\n\t23460 - 19968: 0xE3F8,\n\t23461 - 19968: 0xEAE9,\n\t23462 - 19968: 0xFCB2,\n\t23468 - 19968: 0xE0F4,\n\t23470 - 19968: 0xCFE0,\n\t23472 - 19968: 0xEEA5,\n\t23475 - 19968: 0xFAAA,\n\t23476 - 19968: 0xE6C3,\n\t23477 - 19968: 0xE1B2,\n\t23478 - 19968: 0xCAAB,\n\t23480 - 19968: 0xE3E4,\n\t23481 - 19968: 0xE9BB,\n\t23487 - 19968: 0xE2D6,\n\t23488 - 19968: 0xF3F2,\n\t23490 - 19968: 0xEED6,\n\t23491 - 19968: 0xEAB2,\n\t23492 - 19968: 0xD0F6,\n\t23493 - 19968: 0xECD9,\n\t23494 - 19968: 0xDACB,\n\t23495 - 19968: 0xCFA8,\n\t23500 - 19968: 0xDDA3,\n\t23504 - 19968: 0xD8DB,\n\t23506 - 19968: 0xF9CE,\n\t23507 - 19968: 0xE9D5,\n\t23508 - 19968: 0xE3D1,\n\t23511 - 19968: 0xD2BC,\n\t23518 - 19968: 0xD8AC,\n\t23519 - 19968: 0xF3CC,\n\t23521 - 19968: 0xCDFB,\n\t23522 - 19968: 0xF6D6,\n\t23524 - 19968: 0xE7F5,\n\t23525 - 19968: 0xE8EF,\n\t23526 - 19968: 0xE3F9,\n\t23527 - 19968: 0xD2BB,\n\t23528 - 19968: 0xF3F3,\n\t23529 - 19968: 0xE3FB,\n\t23531 - 19968: 0xDED0,\n\t23532 - 19968: 0xCEB0,\n\t23534 - 19968: 0xD6F7,\n\t23535 - 19968: 0xF1D9,\n\t23541 - 19968: 0xF5C1,\n\t23542 - 19968: 0xDCC4,\n\t23544 - 19968: 0xF5BB,\n\t23546 - 19968: 0xDED1,\n\t23553 - 19968: 0xDCE6,\n\t23556 - 19968: 0xDED2,\n\t23559 - 19968: 0xEDE2,\n\t23560 - 19968: 0xEEF6,\n\t23561 - 19968: 0xEACF,\n\t23562 - 19968: 0xF0EE,\n\t23563 - 19968: 0xE3FC,\n\t23565 - 19968: 0xD3DF,\n\t23566 - 19968: 0xD3F4,\n\t23567 - 19968: 0xE1B3,\n\t23569 - 19968: 0xE1B4,\n\t23574 - 19968: 0xF4D3,\n\t23577 - 19968: 0xDFC6,\n\t23588 - 19968: 0xE9D6,\n\t23592 - 19968: 0xDBAB,\n\t23601 - 19968: 0xF6A6,\n\t23608 - 19968: 0xE3B9,\n\t23609 - 19968: 0xEBC5,\n\t23610 - 19968: 0xF4A9,\n\t23611 - 19968: 0xCDB6,\n\t23612 - 19968: 0xD2F9,\n\t23614 - 19968: 0xDAAD,\n\t23615 - 19968: 0xD2E3,\n\t23616 - 19968: 0xCFD1,\n\t23621 - 19968: 0xCBDC,\n\t23622 - 19968: 0xCCFA,\n\t23624 - 19968: 0xCFDD,\n\t23627 - 19968: 0xE8A9,\n\t23629 - 19968: 0xE3BB,\n\t23630 - 19968: 0xE3BA,\n\t23633 - 19968: 0xE0DA,\n\t23637 - 19968: 0xEEF7,\n\t23643 - 19968: 0xDCB3,\n\t23648 - 19968: 0xD3F5,\n\t23650 - 19968: 0xD7A6,\n\t23652 - 19968: 0xF6B5,\n\t23653 - 19968: 0xD7DB,\n\t23660 - 19968: 0xE1D5,\n\t23663 - 19968: 0xD4EA,\n\t23665 - 19968: 0xDFA3,\n\t23673 - 19968: 0xFDDF,\n\t23696 - 19968: 0xD0F7,\n\t23697 - 19968: 0xEDD4,\n\t23713 - 19968: 0xCBAA,\n\t23721 - 19968: 0xE4DB,\n\t23723 - 19968: 0xE1FB,\n\t23724 - 19968: 0xCBA2,\n\t23729 - 19968: 0xD3E0,\n\t23731 - 19968: 0xE4BF,\n\t23733 - 19968: 0xFBC0,\n\t23735 - 19968: 0xDABE,\n\t23736 - 19968: 0xE4CD,\n\t23738 - 19968: 0xD6B9,\n\t23742 - 19968: 0xEFC0,\n\t23744 - 19968: 0xE1FC,\n\t23769 - 19968: 0xF6B9,\n\t23776 - 19968: 0xDFC7,\n\t23784 - 19968: 0xE4B1,\n\t23791 - 19968: 0xDCE7,\n\t23792 - 19968: 0xDCE8,\n\t23796 - 19968: 0xFAD6,\n\t23798 - 19968: 0xD3F6,\n\t23803 - 19968: 0xF1DA,\n\t23805 - 19968: 0xFAF2,\n\t23815 - 19968: 0xE2FD,\n\t23821 - 19968: 0xD5CF,\n\t23822 - 19968: 0xD0F8,\n\t23825 - 19968: 0xCDDF,\n\t23828 - 19968: 0xF5CB,\n\t23830 - 19968: 0xE4F0,\n\t23831 - 19968: 0xCBAB,\n\t23833 - 19968: 0xD7C4,\n\t23847 - 19968: 0xE2FE,\n\t23849 - 19968: 0xDDDA,\n\t23883 - 19968: 0xDAAE,\n\t23884 - 19968: 0xCAEE,\n\t23888 - 19968: 0xD5B9,\n\t23913 - 19968: 0xE3A1,\n\t23916 - 19968: 0xE8E3,\n\t23919 - 19968: 0xF3AB,\n\t23943 - 19968: 0xCFA9,\n\t23947 - 19968: 0xD3F7,\n\t23965 - 19968: 0xD4F1,\n\t23968 - 19968: 0xCEE4,\n\t23970 - 19968: 0xE8F2,\n\t23978 - 19968: 0xE5F5,\n\t23992 - 19968: 0xE7AE,\n\t23994 - 19968: 0xD6BA,\n\t23996 - 19968: 0xDFEC,\n\t23997 - 19968: 0xE4C0,\n\t24013 - 19968: 0xE8E4,\n\t24018 - 19968: 0xD8B5,\n\t24022 - 19968: 0xE4DC,\n\t24029 - 19968: 0xF4B9,\n\t24030 - 19968: 0xF1B6,\n\t24033 - 19968: 0xE2DE,\n\t24034 - 19968: 0xE1B5,\n\t24037 - 19968: 0xCDEF,\n\t24038 - 19968: 0xF1A7,\n\t24039 - 19968: 0xCEE5,\n\t24040 - 19968: 0xCBDD,\n\t24043 - 19968: 0xD9E3,\n\t24046 - 19968: 0xF3AC,\n\t24049 - 19968: 0xD0F9,\n\t24050 - 19968: 0xECAB,\n\t24051 - 19968: 0xDED3,\n\t24052 - 19968: 0xF7E9,\n\t24055 - 19968: 0xF9F5,\n\t24061 - 19968: 0xE1DE,\n\t24062 - 19968: 0xCBEE,\n\t24066 - 19968: 0xE3BC,\n\t24067 - 19968: 0xF8D6,\n\t24070 - 19968: 0xDBEE,\n\t24076 - 19968: 0xFDF1,\n\t24081 - 19968: 0xF7B6,\n\t24086 - 19968: 0xF4DE,\n\t24089 - 19968: 0xF2ED,\n\t24091 - 19968: 0xDBD9,\n\t24093 - 19968: 0xF0A8,\n\t24101 - 19968: 0xE1FD,\n\t24107 - 19968: 0xDED4,\n\t24109 - 19968: 0xE0AC,\n\t24115 - 19968: 0xEDE3,\n\t24118 - 19968: 0xD3E1,\n\t24120 - 19968: 0xDFC8,\n\t24125 - 19968: 0xD9B6,\n\t24127 - 19968: 0xFDAC,\n\t24128 - 19968: 0xEFD3,\n\t24132 - 19968: 0xE4C1,\n\t24133 - 19968: 0xF8EB,\n\t24135 - 19968: 0xDBAC,\n\t24140 - 19968: 0xFCC6,\n\t24149 - 19968: 0xD8AD,\n\t24159 - 19968: 0xF6BA,\n\t24161 - 19968: 0xDBDF,\n\t24162 - 19968: 0xD3D3,\n\t24163 - 19968: 0xF8C7,\n\t24178 - 19968: 0xCACE,\n\t24179 - 19968: 0xF8C1,\n\t24180 - 19968: 0xD2B4,\n\t24183 - 19968: 0xDCB4,\n\t24184 - 19968: 0xFAB9,\n\t24185 - 19968: 0xCACF,\n\t24187 - 19968: 0xFCB3,\n\t24188 - 19968: 0xEAEA,\n\t24189 - 19968: 0xEAEB,\n\t24190 - 19968: 0xD0FA,\n\t24196 - 19968: 0xEDE4,\n\t24199 - 19968: 0xDDE7,\n\t24202 - 19968: 0xDFC9,\n\t24207 - 19968: 0xDFED,\n\t24213 - 19968: 0xEEBC,\n\t24215 - 19968: 0xEFC1,\n\t24218 - 19968: 0xCCD2,\n\t24220 - 19968: 0xDDA4,\n\t24224 - 19968: 0xDFCA,\n\t24230 - 19968: 0xD3F8,\n\t24231 - 19968: 0xF1A8,\n\t24235 - 19968: 0xCDB7,\n\t24237 - 19968: 0xEFD4,\n\t24245 - 19968: 0xE4DD,\n\t24246 - 19968: 0xDFEE,\n\t24247 - 19968: 0xCBAC,\n\t24248 - 19968: 0xE9BC,\n\t24254 - 19968: 0xEAEC,\n\t24258 - 19968: 0xDFCB,\n\t24264 - 19968: 0xF9BF,\n\t24265 - 19968: 0xD6AF,\n\t24266 - 19968: 0xD5C6,\n\t24272 - 19968: 0xCFAA,\n\t24275 - 19968: 0xCEA9,\n\t24278 - 19968: 0xD6F8,\n\t24282 - 19968: 0xF1B7,\n\t24283 - 19968: 0xEEF8,\n\t24287 - 19968: 0xD9D9,\n\t24288 - 19968: 0xF3DF,\n\t24290 - 19968: 0xF8C8,\n\t24291 - 19968: 0xCEC6,\n\t24300 - 19968: 0xD5E6,\n\t24307 - 19968: 0xF4E6,\n\t24310 - 19968: 0xE6C5,\n\t24311 - 19968: 0xEFD5,\n\t24314 - 19968: 0xCBEF,\n\t24315 - 19968: 0xFCDF,\n\t24321 - 19968: 0xDCA7,\n\t24324 - 19968: 0xD6E7,\n\t24330 - 19968: 0xF8C9,\n\t24335 - 19968: 0xE3D2,\n\t24337 - 19968: 0xE3BD,\n\t24339 - 19968: 0xCFE1,\n\t24340 - 19968: 0xF0C0,\n\t24341 - 19968: 0xECDA,\n\t24343 - 19968: 0xDDD7,\n\t24344 - 19968: 0xFBF0,\n\t24347 - 19968: 0xECAC,\n\t24351 - 19968: 0xF0A9,\n\t24358 - 19968: 0xFAD7,\n\t24359 - 19968: 0xFBC1,\n\t24361 - 19968: 0xD2C0,\n\t24369 - 19968: 0xE5B0,\n\t24373 - 19968: 0xEDE5,\n\t24378 - 19968: 0xCBAD,\n\t24380 - 19968: 0xF9B0,\n\t24392 - 19968: 0xF7A5,\n\t24394 - 19968: 0xCBAE,\n\t24396 - 19968: 0xDAAF,\n\t24398 - 19968: 0xD8B6,\n\t24406 - 19968: 0xD3A7,\n\t24407 - 19968: 0xFBB2,\n\t24409 - 19968: 0xFDC4,\n\t24411 - 19968: 0xECAD,\n\t24418 - 19968: 0xFBA1,\n\t24422 - 19968: 0xE5E9,\n\t24423 - 19968: 0xE9EE,\n\t24425 - 19968: 0xF3F4,\n\t24426 - 19968: 0xF8F3,\n\t24427 - 19968: 0xF0C1,\n\t24428 - 19968: 0xDEAF,\n\t24429 - 19968: 0xF8B0,\n\t24432 - 19968: 0xF3E0,\n\t24433 - 19968: 0xE7AF,\n\t24439 - 19968: 0xDBAD,\n\t24441 - 19968: 0xE6B5,\n\t24444 - 19968: 0xF9A8,\n\t24447 - 19968: 0xDDD8,\n\t24448 - 19968: 0xE8D9,\n\t24449 - 19968: 0xEFD6,\n\t24453 - 19968: 0xD3E2,\n\t24455 - 19968: 0xE2DF,\n\t24458 - 19968: 0xFCE0,\n\t24459 - 19968: 0xD7C8,\n\t24460 - 19968: 0xFDAD,\n\t24464 - 19968: 0xDFEF,\n\t24465 - 19968: 0xCCD3,\n\t24466 - 19968: 0xD3F9,\n\t24471 - 19968: 0xD4F0,\n\t24472 - 19968: 0xDBC7,\n\t24473 - 19968: 0xDED5,\n\t24478 - 19968: 0xF0F4,\n\t24480 - 19968: 0xD5D0,\n\t24481 - 19968: 0xE5D9,\n\t24488 - 19968: 0xFCC7,\n\t24489 - 19968: 0xDCD6,\n\t24490 - 19968: 0xE2E0,\n\t24494 - 19968: 0xDAB0,\n\t24501 - 19968: 0xF3A3,\n\t24503 - 19968: 0xD3EC,\n\t24505 - 19968: 0xF4CB,\n\t24509 - 19968: 0xFDC5,\n\t24515 - 19968: 0xE3FD,\n\t24517 - 19968: 0xF9B1,\n\t24524 - 19968: 0xD0FB,\n\t24525 - 19968: 0xECDB,\n\t24534 - 19968: 0xF5BC,\n\t24535 - 19968: 0xF2A4,\n\t24536 - 19968: 0xD8CE,\n\t24537 - 19968: 0xD8CF,\n\t24544 - 19968: 0xF5F7,\n\t24555 - 19968: 0xF6E1,\n\t24565 - 19968: 0xD2B7,\n\t24573 - 19968: 0xFBEC,\n\t24575 - 19968: 0xDDC8,\n\t24591 - 19968: 0xE4E8,\n\t24594 - 19968: 0xD2C1,\n\t24598 - 19968: 0xF8D7,\n\t24604 - 19968: 0xD6BB,\n\t24605 - 19968: 0xDED6,\n\t24608 - 19968: 0xF7BD,\n\t24609 - 19968: 0xECAE,\n\t24613 - 19968: 0xD0E1,\n\t24615 - 19968: 0xE0F5,\n\t24616 - 19968: 0xEAB3,\n\t24618 - 19968: 0xCED6,\n\t24623 - 19968: 0xCCA5,\n\t24641 - 19968: 0xECF6,\n\t24642 - 19968: 0xE2E1,\n\t24643 - 19968: 0xE3BE,\n\t24653 - 19968: 0xFCC8,\n\t24656 - 19968: 0xCDF0,\n\t24658 - 19968: 0xF9F6,\n\t24661 - 19968: 0xDFF0,\n\t24665 - 19968: 0xE5BF,\n\t24669 - 19968: 0xCEBF,\n\t24674 - 19968: 0xFCE1,\n\t24675 - 19968: 0xEDB0,\n\t24676 - 19968: 0xFDD1,\n\t24677 - 19968: 0xF6BB,\n\t24680 - 19968: 0xF9CF,\n\t24681 - 19968: 0xEBDA,\n\t24682 - 19968: 0xCAC1,\n\t24684 - 19968: 0xD2B8,\n\t24685 - 19968: 0xCDF1,\n\t24687 - 19968: 0xE3D3,\n\t24688 - 19968: 0xFDE6,\n\t24709 - 19968: 0xE6ED,\n\t24713 - 19968: 0xE3FA,\n\t24716 - 19968: 0xF0AA,\n\t24717 - 19968: 0xF9D0,\n\t24724 - 19968: 0xFCE2,\n\t24726 - 19968: 0xF8A7,\n\t24730 - 19968: 0xE1E5,\n\t24731 - 19968: 0xEEF9,\n\t24735 - 19968: 0xE7F6,\n\t24736 - 19968: 0xEAED,\n\t24739 - 19968: 0xFCB4,\n\t24740 - 19968: 0xF5C2,\n\t24743 - 19968: 0xD7DC,\n\t24752 - 19968: 0xF0F5,\n\t24754 - 19968: 0xDDE8,\n\t24755 - 19968: 0xD3ED,\n\t24756 - 19968: 0xF5FC,\n\t24758 - 19968: 0xDABF,\n\t24760 - 19968: 0xCCFB,\n\t24764 - 19968: 0xD3FA,\n\t24765 - 19968: 0xF4A4,\n\t24773 - 19968: 0xEFD7,\n\t24775 - 19968: 0xD4C3,\n\t24785 - 19968: 0xFBE3,\n\t24794 - 19968: 0xFBED,\n\t24796 - 19968: 0xE0AD,\n\t24799 - 19968: 0xEAEE,\n\t24800 - 19968: 0xFBB3,\n\t24801 - 19968: 0xE4C2,\n\t24816 - 19968: 0xF6E7,\n\t24817 - 19968: 0xD2DD,\n\t24819 - 19968: 0xDFCC,\n\t24822 - 19968: 0xFCC9,\n\t24825 - 19968: 0xE5A9,\n\t24826 - 19968: 0xE0F6,\n\t24827 - 19968: 0xF6B3,\n\t24833 - 19968: 0xE1FE,\n\t24838 - 19968: 0xCBF0,\n\t24840 - 19968: 0xEAEF,\n\t24841 - 19968: 0xEAF0,\n\t24845 - 19968: 0xDAC0,\n\t24846 - 19968: 0xF8B4,\n\t24847 - 19968: 0xEBF2,\n\t24853 - 19968: 0xE4C3,\n\t24858 - 19968: 0xE9D7,\n\t24859 - 19968: 0xE4F1,\n\t24863 - 19968: 0xCAEF,\n\t24871 - 19968: 0xCED7,\n\t24880 - 19968: 0xFCCA,\n\t24884 - 19968: 0xF3E1,\n\t24887 - 19968: 0xCBC4,\n\t24892 - 19968: 0xE3E5,\n\t24894 - 19968: 0xCBC5,\n\t24895 - 19968: 0xEAB4,\n\t24898 - 19968: 0xE9BD,\n\t24900 - 19968: 0xD7C9,\n\t24903 - 19968: 0xEBDB,\n\t24904 - 19968: 0xEDB1,\n\t24906 - 19968: 0xCCC3,\n\t24907 - 19968: 0xF7BE,\n\t24908 - 19968: 0xFCCB,\n\t24915 - 19968: 0xF8F4,\n\t24917 - 19968: 0xD9B7,\n\t24920 - 19968: 0xF3D3,\n\t24921 - 19968: 0xF3D4,\n\t24925 - 19968: 0xF7E4,\n\t24927 - 19968: 0xF7D1,\n\t24930 - 19968: 0xD8B7,\n\t24931 - 19968: 0xCEB1,\n\t24932 - 19968: 0xCAC2,\n\t24935 - 19968: 0xFBB4,\n\t24936 - 19968: 0xCBC6,\n\t24939 - 19968: 0xF0F6,\n\t24942 - 19968: 0xD5E7,\n\t24944 - 19968: 0xEAD0,\n\t24950 - 19968: 0xCCD4,\n\t24951 - 19968: 0xCBAF,\n\t24957 - 19968: 0xF4AA,\n\t24958 - 19968: 0xE9AF,\n\t24961 - 19968: 0xF5C3,\n\t24962 - 19968: 0xE9D8,\n\t24970 - 19968: 0xDDE9,\n\t24974 - 19968: 0xF1F3,\n\t24976 - 19968: 0xD5FB,\n\t24977 - 19968: 0xDEBB,\n\t24980 - 19968: 0xF4FB,\n\t24984 - 19968: 0xFDF3,\n\t24985 - 19968: 0xFDF2,\n\t24986 - 19968: 0xF7A6,\n\t24996 - 19968: 0xDDC9,\n\t24999 - 19968: 0xD4D3,\n\t25001 - 19968: 0xCCA8,\n\t25003 - 19968: 0xDAC1,\n\t25004 - 19968: 0xCCD5,\n\t25006 - 19968: 0xD9E4,\n\t25010 - 19968: 0xFACA,\n\t25014 - 19968: 0xE5E3,\n\t25018 - 19968: 0xD3BC,\n\t25022 - 19968: 0xCAF0,\n\t25027 - 19968: 0xD0C4,\n\t25031 - 19968: 0xCAD0,\n\t25032 - 19968: 0xFAAB,\n\t25033 - 19968: 0xEBEB,\n\t25034 - 19968: 0xE7F8,\n\t25035 - 19968: 0xD9E5,\n\t25062 - 19968: 0xD1D7,\n\t25074 - 19968: 0xF3A4,\n\t25078 - 19968: 0xD4FB,\n\t25079 - 19968: 0xFCE3,\n\t25080 - 19968: 0xFAD8,\n\t25082 - 19968: 0xF3D5,\n\t25084 - 19968: 0xCFAB,\n\t25087 - 19968: 0xEBF3,\n\t25088 - 19968: 0xD5FC,\n\t25095 - 19968: 0xD3D4,\n\t25096 - 19968: 0xCDFC,\n\t25098 - 19968: 0xD9E6,\n\t25100 - 19968: 0xE2F9,\n\t25101 - 19968: 0xE2A1,\n\t25102 - 19968: 0xEBD4,\n\t25104 - 19968: 0xE0F7,\n\t25105 - 19968: 0xE4B2,\n\t25106 - 19968: 0xCCFC,\n\t25110 - 19968: 0xFBE4,\n\t25114 - 19968: 0xF4AB,\n\t25119 - 19968: 0xD0BD,\n\t25121 - 19968: 0xCAF1,\n\t25130 - 19968: 0xEFB8,\n\t25134 - 19968: 0xD7C0,\n\t25136 - 19968: 0xEEFA,\n\t25137 - 19968: 0xFDF4,\n\t25140 - 19968: 0xD3E3,\n\t25142 - 19968: 0xFBC2,\n\t25150 - 19968: 0xD5E8,\n\t25151 - 19968: 0xDBAE,\n\t25152 - 19968: 0xE1B6,\n\t25153 - 19968: 0xF8B7,\n\t25159 - 19968: 0xE0BF,\n\t25160 - 19968: 0xFBC3,\n\t25161 - 19968: 0xDDEA,\n\t25163 - 19968: 0xE2A2,\n\t25165 - 19968: 0xEEA6,\n\t25171 - 19968: 0xF6E8,\n\t25176 - 19968: 0xF6F5,\n\t25198 - 19968: 0xDDCA,\n\t25201 - 19968: 0xD0E2,\n\t25206 - 19968: 0xDDA6,\n\t25209 - 19968: 0xDDEB,\n\t25212 - 19968: 0xE4F9,\n\t25215 - 19968: 0xE3AF,\n\t25216 - 19968: 0xD0FC,\n\t25220 - 19968: 0xF4FC,\n\t25225 - 19968: 0xCCBC,\n\t25226 - 19968: 0xF7EA,\n\t25233 - 19968: 0xE5E4,\n\t25234 - 19968: 0xDFF1,\n\t25237 - 19968: 0xF7E1,\n\t25239 - 19968: 0xF9F7,\n\t25240 - 19968: 0xEFB9,\n\t25243 - 19968: 0xF8D8,\n\t25259 - 19968: 0xF9A9,\n\t25265 - 19968: 0xF8D9,\n\t25269 - 19968: 0xEEBD,\n\t25273 - 19968: 0xD8C6,\n\t25276 - 19968: 0xE4E3,\n\t25277 - 19968: 0xF5CE,\n\t25282 - 19968: 0xDDD9,\n\t25287 - 19968: 0xD9E7,\n\t25288 - 19968: 0xD2B9,\n\t25289 - 19968: 0xD5C3,\n\t25292 - 19968: 0xDAE5,\n\t25293 - 19968: 0xDAD0,\n\t25295 - 19968: 0xD1D9,\n\t25296 - 19968: 0xCED8,\n\t25298 - 19968: 0xCBDE,\n\t25299 - 19968: 0xF4AC,\n\t25300 - 19968: 0xDAFB,\n\t25302 - 19968: 0xF6E9,\n\t25303 - 19968: 0xE8F3,\n\t25304 - 19968: 0xCFAC,\n\t25305 - 19968: 0xF0F0,\n\t25307 - 19968: 0xF4FD,\n\t25308 - 19968: 0xDBC8,\n\t25324 - 19968: 0xCEC0,\n\t25325 - 19968: 0xE3D4,\n\t25326 - 19968: 0xD1CF,\n\t25327 - 19968: 0xF1F5,\n\t25329 - 19968: 0xCDF2,\n\t25331 - 19968: 0xCFEB,\n\t25335 - 19968: 0xCDB8,\n\t25342 - 19968: 0xE3A6,\n\t25343 - 19968: 0xD1DA,\n\t25345 - 19968: 0xF2A5,\n\t25351 - 19968: 0xF2A6,\n\t25353 - 19968: 0xE4CE,\n\t25361 - 19968: 0xD3FB,\n\t25387 - 19968: 0xF1A9,\n\t25391 - 19968: 0xF2C9,\n\t25402 - 19968: 0xEFD8,\n\t25403 - 19968: 0xE6C9,\n\t25405 - 19968: 0xD8B8,\n\t25406 - 19968: 0xFAF3,\n\t25417 - 19968: 0xF3B5,\n\t25420 - 19968: 0xF8A4,\n\t25423 - 19968: 0xD1F3,\n\t25424 - 19968: 0xE6C8,\n\t25429 - 19968: 0xF8DA,\n\t25447 - 19968: 0xDCE9,\n\t25448 - 19968: 0xDED7,\n\t25454 - 19968: 0xCBDF,\n\t25458 - 19968: 0xCFEC,\n\t25463 - 19968: 0xF4DF,\n\t25466 - 19968: 0xD1F4,\n\t25467 - 19968: 0xD2BA,\n\t25471 - 19968: 0xDFF2,\n\t25475 - 19968: 0xE1B7,\n\t25480 - 19968: 0xE2A3,\n\t25481 - 19968: 0xD3FC,\n\t25484 - 19968: 0xEDE6,\n\t25490 - 19968: 0xDBC9,\n\t25494 - 19968: 0xE4FA,\n\t25496 - 19968: 0xCFDE,\n\t25499 - 19968: 0xCED0,\n\t25504 - 19968: 0xD5D3,\n\t25505 - 19968: 0xF3F5,\n\t25506 - 19968: 0xF7AE,\n\t25509 - 19968: 0xEFC8,\n\t25511 - 19968: 0xCDF3,\n\t25512 - 19968: 0xF5CF,\n\t25513 - 19968: 0xE5F3,\n\t25514 - 19968: 0xF0C2,\n\t25536 - 19968: 0xCAD1,\n\t25540 - 19968: 0xEAF1,\n\t25542 - 19968: 0xD0A6,\n\t25551 - 19968: 0xD9DA,\n\t25552 - 19968: 0xF0AB,\n\t25558 - 19968: 0xEBE7,\n\t25562 - 19968: 0xE5C0,\n\t25563 - 19968: 0xFCB5,\n\t25569 - 19968: 0xE4C4,\n\t25581 - 19968: 0xCCA9,\n\t25582 - 19968: 0xFDC6,\n\t25588 - 19968: 0xEAB5,\n\t25590 - 19968: 0xE5AA,\n\t25591 - 19968: 0xDFBA,\n\t25613 - 19968: 0xE1DF,\n\t25615 - 19968: 0xDAD1,\n\t25620 - 19968: 0xE1B8,\n\t25622 - 19968: 0xE8F4,\n\t25623 - 19968: 0xD3FD,\n\t25628 - 19968: 0xE2A4,\n\t25634 - 19968: 0xF2CA,\n\t25644 - 19968: 0xDAE6,\n\t25645 - 19968: 0xF7B3,\n\t25658 - 19968: 0xFDCD,\n\t25662 - 19968: 0xF3B6,\n\t25688 - 19968: 0xEED7,\n\t25696 - 19968: 0xF5C4,\n\t25705 - 19968: 0xD8A4,\n\t25711 - 19968: 0xF2A7,\n\t25720 - 19968: 0xD9B8,\n\t25721 - 19968: 0xD9B9,\n\t25722 - 19968: 0xEFC9,\n\t25736 - 19968: 0xD6CE,\n\t25745 - 19968: 0xF7CB,\n\t25746 - 19968: 0xDFAE,\n\t25747 - 19968: 0xE8F5,\n\t25754 - 19968: 0xD2B5,\n\t25758 - 19968: 0xD3D5,\n\t25764 - 19968: 0xF4CC,\n\t25765 - 19968: 0xDAFC,\n\t25771 - 19968: 0xD9E8,\n\t25773 - 19968: 0xF7EB,\n\t25774 - 19968: 0xF5C9,\n\t25776 - 19968: 0xF3BC,\n\t25778 - 19968: 0xDAD2,\n\t25787 - 19968: 0xD3B5,\n\t25793 - 19968: 0xE8B6,\n\t25796 - 19968: 0xD6CF,\n\t25797 - 19968: 0xF4BA,\n\t25799 - 19968: 0xF7C9,\n\t25802 - 19968: 0xCCAA,\n\t25805 - 19968: 0xF0C3,\n\t25806 - 19968: 0xCCD6,\n\t25810 - 19968: 0xD0D3,\n\t25812 - 19968: 0xD3BD,\n\t25816 - 19968: 0xDBFB,\n\t25818 - 19968: 0xCBE0,\n\t25825 - 19968: 0xD3E4,\n\t25826 - 19968: 0xF6F7,\n\t25829 - 19968: 0xD5BA,\n\t25830 - 19968: 0xF3CD,\n\t25831 - 19968: 0xCBE1,\n\t25836 - 19968: 0xEBF4,\n\t25842 - 19968: 0xF4AD,\n\t25844 - 19968: 0xFCAA,\n\t25850 - 19968: 0xF7EC,\n\t25854 - 19968: 0xE8F6,\n\t25856 - 19968: 0xDAE7,\n\t25860 - 19968: 0xF7CC,\n\t25880 - 19968: 0xE5C1,\n\t25885 - 19968: 0xE0EE,\n\t25891 - 19968: 0xD5FD,\n\t25898 - 19968: 0xCEE6,\n\t25899 - 19968: 0xFCAB,\n\t25900 - 19968: 0xD5BB,\n\t25903 - 19968: 0xF2A8,\n\t25910 - 19968: 0xE2A5,\n\t25911 - 19968: 0xCDB9,\n\t25912 - 19968: 0xEAF2,\n\t25913 - 19968: 0xCBC7,\n\t25915 - 19968: 0xCDF4,\n\t25918 - 19968: 0xDBAF,\n\t25919 - 19968: 0xEFD9,\n\t25925 - 19968: 0xCDBA,\n\t25928 - 19968: 0xFCF9,\n\t25933 - 19968: 0xDFF3,\n\t25934 - 19968: 0xCEE7,\n\t25935 - 19968: 0xDAC2,\n\t25937 - 19968: 0xCFAD,\n\t25942 - 19968: 0xE7F9,\n\t25943 - 19968: 0xF8A8,\n\t25950 - 19968: 0xF3E2,\n\t25954 - 19968: 0xCAF2,\n\t25955 - 19968: 0xDFA4,\n\t25958 - 19968: 0xD4C4,\n\t25964 - 19968: 0xCCD7,\n\t25965 - 19968: 0xE5C2,\n\t25970 - 19968: 0xCDBB,\n\t25972 - 19968: 0xEFDA,\n\t25973 - 19968: 0xEED8,\n\t25975 - 19968: 0xDDA7,\n\t25976 - 19968: 0xE2A6,\n\t25982 - 19968: 0xE0C0,\n\t25986 - 19968: 0xD6B0,\n\t25987 - 19968: 0xF8CA,\n\t25989 - 19968: 0xFCFA,\n\t25991 - 19968: 0xD9FE,\n\t25996 - 19968: 0xDEB0,\n\t26000 - 19968: 0xDDEC,\n\t26001 - 19968: 0xDAE8,\n\t26007 - 19968: 0xD4E0,\n\t26009 - 19968: 0xD6F9,\n\t26011 - 19968: 0xCDD7,\n\t26012 - 19968: 0xDED8,\n\t26015 - 19968: 0xF2F8,\n\t26017 - 19968: 0xE4D6,\n\t26020 - 19968: 0xD0C5,\n\t26021 - 19968: 0xF4AE,\n\t26023 - 19968: 0xDDA8,\n\t26027 - 19968: 0xEDC5,\n\t26028 - 19968: 0xF3D6,\n\t26031 - 19968: 0xDED9,\n\t26032 - 19968: 0xE3E6,\n\t26039 - 19968: 0xD3A8,\n\t26041 - 19968: 0xDBB0,\n\t26044 - 19968: 0xE5DA,\n\t26045 - 19968: 0xE3BF,\n\t26049 - 19968: 0xDBB1,\n\t26053 - 19968: 0xD5E9,\n\t26059 - 19968: 0xE0C1,\n\t26060 - 19968: 0xEFDB,\n\t26063 - 19968: 0xF0E9,\n\t26066 - 19968: 0xD7B2,\n\t26071 - 19968: 0xD0FD,\n\t26080 - 19968: 0xD9E9,\n\t26083 - 19968: 0xD0FE,\n\t26085 - 19968: 0xECED,\n\t26086 - 19968: 0xD3A9,\n\t26088 - 19968: 0xF2A9,\n\t26089 - 19968: 0xF0C4,\n\t26092 - 19968: 0xE2E2,\n\t26093 - 19968: 0xE9EF,\n\t26097 - 19968: 0xF9D1,\n\t26100 - 19968: 0xE9D9,\n\t26106 - 19968: 0xE8DA,\n\t26107 - 19968: 0xDAC3,\n\t26108 - 19968: 0xDAC4,\n\t26109 - 19968: 0xD4C5,\n\t26111 - 19968: 0xE7FA,\n\t26118 - 19968: 0xCDE0,\n\t26119 - 19968: 0xE3B0,\n\t26121 - 19968: 0xDBB2,\n\t26122 - 19968: 0xFBC4,\n\t26124 - 19968: 0xF3E3,\n\t26126 - 19968: 0xD9A5,\n\t26127 - 19968: 0xFBE7,\n\t26128 - 19968: 0xDDCB,\n\t26129 - 19968: 0xD0D4,\n\t26131 - 19968: 0xE6B6,\n\t26132 - 19968: 0xE0AE,\n\t26133 - 19968: 0xFDDA,\n\t26142 - 19968: 0xDCB5,\n\t26143 - 19968: 0xE0F8,\n\t26144 - 19968: 0xE7B1,\n\t26149 - 19968: 0xF5F0,\n\t26151 - 19968: 0xD8DC,\n\t26152 - 19968: 0xEDC6,\n\t26157 - 19968: 0xE1B9,\n\t26159 - 19968: 0xE3C0,\n\t26160 - 19968: 0xF9C0,\n\t26161 - 19968: 0xE9F0,\n\t26164 - 19968: 0xD9DB,\n\t26166 - 19968: 0xF3E4,\n\t26170 - 19968: 0xDCB6,\n\t26171 - 19968: 0xE4E9,\n\t26177 - 19968: 0xF0C5,\n\t26178 - 19968: 0xE3C1,\n\t26179 - 19968: 0xFCCC,\n\t26180 - 19968: 0xFCCD,\n\t26185 - 19968: 0xF2CB,\n\t26187 - 19968: 0xF2CC,\n\t26191 - 19968: 0xE4CF,\n\t26201 - 19968: 0xF1DB,\n\t26203 - 19968: 0xFAD9,\n\t26205 - 19968: 0xF1B8,\n\t26206 - 19968: 0xFDF5,\n\t26207 - 19968: 0xE0F9,\n\t26212 - 19968: 0xE7FB,\n\t26213 - 19968: 0xFCB7,\n\t26214 - 19968: 0xFCE4,\n\t26215 - 19968: 0xFBC5,\n\t26216 - 19968: 0xE3E7,\n\t26217 - 19968: 0xD8B9,\n\t26219 - 19968: 0xF6F8,\n\t26222 - 19968: 0xDCC5,\n\t26223 - 19968: 0xCCD8,\n\t26227 - 19968: 0xE0AF,\n\t26228 - 19968: 0xF4E7,\n\t26230 - 19968: 0xEFDC,\n\t26231 - 19968: 0xCFFC,\n\t26232 - 19968: 0xEFDD,\n\t26234 - 19968: 0xF2AA,\n\t26244 - 19968: 0xFDBE,\n\t26247 - 19968: 0xCAAC,\n\t26248 - 19968: 0xFDBB,\n\t26249 - 19968: 0xFDC7,\n\t26254 - 19968: 0xE7B2,\n\t26256 - 19968: 0xEAD1,\n\t26257 - 19968: 0xDFF4,\n\t26262 - 19968: 0xD1EC,\n\t26263 - 19968: 0xE4DE,\n\t26264 - 19968: 0xE5C3,\n\t26269 - 19968: 0xD9A6,\n\t26272 - 19968: 0xCDBC,\n\t26274 - 19968: 0xF3E5,\n\t26283 - 19968: 0xEDD5,\n\t26286 - 19968: 0xD9BA,\n\t26290 - 19968: 0xEDE7,\n\t26291 - 19968: 0xFBB5,\n\t26292 - 19968: 0xF8EC,\n\t26297 - 19968: 0xE0E7,\n\t26299 - 19968: 0xCCD9,\n\t26302 - 19968: 0xD4C6,\n\t26308 - 19968: 0xE7A5,\n\t26310 - 19968: 0xD5F5,\n\t26311 - 19968: 0xD3BE,\n\t26313 - 19968: 0xFCFB,\n\t26326 - 19968: 0xE4F2,\n\t26329 - 19968: 0xDFF5,\n\t26332 - 19968: 0xE8F8,\n\t26333 - 19968: 0xF8ED,\n\t26336 - 19968: 0xCEC7,\n\t26342 - 19968: 0xFDF6,\n\t26352 - 19968: 0xE8D8,\n\t26354 - 19968: 0xCDD8,\n\t26355 - 19968: 0xE7D6,\n\t26356 - 19968: 0xCCDA,\n\t26359 - 19968: 0xCAE3,\n\t26360 - 19968: 0xDFF6,\n\t26361 - 19968: 0xF0C7,\n\t26362 - 19968: 0xF0C6,\n\t26364 - 19968: 0xD8BA,\n\t26366 - 19968: 0xF1F4,\n\t26367 - 19968: 0xF4F0,\n\t26368 - 19968: 0xF5CC,\n\t26371 - 19968: 0xFCE5,\n\t26376 - 19968: 0xEAC5,\n\t26377 - 19968: 0xEAF3,\n\t26379 - 19968: 0xDDDB,\n\t26381 - 19968: 0xDCD7,\n\t26388 - 19968: 0xDEFD,\n\t26389 - 19968: 0xF2F9,\n\t26391 - 19968: 0xD5C7,\n\t26395 - 19968: 0xD8D0,\n\t26397 - 19968: 0xF0C8,\n\t26398 - 19968: 0xD1A1,\n\t26399 - 19968: 0xD1A2,\n\t26406 - 19968: 0xD9D4,\n\t26407 - 19968: 0xD6E8,\n\t26408 - 19968: 0xD9CA,\n\t26410 - 19968: 0xDAB1,\n\t26411 - 19968: 0xD8C7,\n\t26412 - 19968: 0xDCE2,\n\t26413 - 19968: 0xF3CE,\n\t26414 - 19968: 0xF5F4,\n\t26417 - 19968: 0xF1B9,\n\t26420 - 19968: 0xDAD3,\n\t26422 - 19968: 0xF6EA,\n\t26426 - 19968: 0xCFF5,\n\t26429 - 19968: 0xFDAE,\n\t26438 - 19968: 0xCAD2,\n\t26441 - 19968: 0xDFB4,\n\t26446 - 19968: 0xD7DD,\n\t26447 - 19968: 0xFABA,\n\t26448 - 19968: 0xEEA7,\n\t26449 - 19968: 0xF5BD,\n\t26451 - 19968: 0xF8F5,\n\t26454 - 19968: 0xEDE8,\n\t26460 - 19968: 0xD4E1,\n\t26462 - 19968: 0xD1A3,\n\t26463 - 19968: 0xE1D6,\n\t26477 - 19968: 0xF9F8,\n\t26479 - 19968: 0xDBCA,\n\t26480 - 19968: 0xCBF9,\n\t26481 - 19968: 0xD4D4,\n\t26483 - 19968: 0xD9DC,\n\t26485 - 19968: 0xEEBE,\n\t26487 - 19968: 0xF7ED,\n\t26491 - 19968: 0xD2EE,\n\t26494 - 19968: 0xE1E6,\n\t26495 - 19968: 0xF7F9,\n\t26503 - 19968: 0xDDED,\n\t26505 - 19968: 0xE8DB,\n\t26507 - 19968: 0xDBB3,\n\t26511 - 19968: 0xD1F7,\n\t26512 - 19968: 0xE0B0,\n\t26515 - 19968: 0xD4E2,\n\t26517 - 19968: 0xF6D7,\n\t26519 - 19968: 0xD7F9,\n\t26522 - 19968: 0xD8DD,\n\t26524 - 19968: 0xCDFD,\n\t26525 - 19968: 0xF2AB,\n\t26543 - 19968: 0xCDBD,\n\t26544 - 19968: 0xF8C2,\n\t26547 - 19968: 0xF2AC,\n\t26550 - 19968: 0xCAAD,\n\t26551 - 19968: 0xCAAE,\n\t26552 - 19968: 0xCFAE,\n\t26558 - 19968: 0xE3C2,\n\t26564 - 19968: 0xDCB7,\n\t26575 - 19968: 0xDBDA,\n\t26576 - 19968: 0xD9BB,\n\t26577 - 19968: 0xCAF3,\n\t26578 - 19968: 0xF6D3,\n\t26579 - 19968: 0xE6F8,\n\t26580 - 19968: 0xEAF5,\n\t26586 - 19968: 0xEAF6,\n\t26589 - 19968: 0xF6F9,\n\t26601 - 19968: 0xCFAF,\n\t26604 - 19968: 0xCAD3,\n\t26607 - 19968: 0xCAAF,\n\t26608 - 19968: 0xD2B0,\n\t26609 - 19968: 0xF1BA,\n\t26611 - 19968: 0xD7B3,\n\t26612 - 19968: 0xE3C3,\n\t26613 - 19968: 0xF3FD,\n\t26614 - 19968: 0xDEDA,\n\t26619 - 19968: 0xDEDB,\n\t26622 - 19968: 0xEFDE,\n\t26642 - 19968: 0xE2E3,\n\t26643 - 19968: 0xEEFB,\n\t26646 - 19968: 0xDFF7,\n\t26647 - 19968: 0xD7CA,\n\t26657 - 19968: 0xCEE8,\n\t26658 - 19968: 0xDBDB,\n\t26666 - 19968: 0xF1BB,\n\t26671 - 19968: 0xE9F1,\n\t26680 - 19968: 0xFAB7,\n\t26681 - 19968: 0xD0C6,\n\t26684 - 19968: 0xCCAB,\n\t26685 - 19968: 0xEEA8,\n\t26688 - 19968: 0xCBFA,\n\t26689 - 19968: 0xF9F9,\n\t26690 - 19968: 0xCCFD,\n\t26691 - 19968: 0xD3FE,\n\t26696 - 19968: 0xE4D0,\n\t26702 - 19968: 0xF2EE,\n\t26704 - 19968: 0xD4D5,\n\t26705 - 19968: 0xDFCD,\n\t26707 - 19968: 0xFCB8,\n\t26708 - 19968: 0xD1D0,\n\t26733 - 19968: 0xF2CD,\n\t26742 - 19968: 0xF7D2,\n\t26751 - 19968: 0xCAD4,\n\t26753 - 19968: 0xD5D9,\n\t26757 - 19968: 0xD8DE,\n\t26767 - 19968: 0xCDD9,\n\t26771 - 19968: 0xEEA9,\n\t26772 - 19968: 0xF6BC,\n\t26775 - 19968: 0xCCDB,\n\t26781 - 19968: 0xF0C9,\n\t26783 - 19968: 0xFCFC,\n\t26785 - 19968: 0xE8C9,\n\t26786 - 19968: 0xF4FE,\n\t26791 - 19968: 0xE7FC,\n\t26792 - 19968: 0xD7DE,\n\t26797 - 19968: 0xDEDC,\n\t26799 - 19968: 0xF0AC,\n\t26800 - 19968: 0xCCFE,\n\t26801 - 19968: 0xCDE1,\n\t26803 - 19968: 0xE1BA,\n\t26805 - 19968: 0xDBEF,\n\t26806 - 19968: 0xDAB2,\n\t26820 - 19968: 0xD1A5,\n\t26821 - 19968: 0xDCB8,\n\t26825 - 19968: 0xD8F6,\n\t26827 - 19968: 0xD1A4,\n\t26829 - 19968: 0xCDE2,\n\t26834 - 19968: 0xDCEA,\n\t26837 - 19968: 0xF0F7,\n\t26839 - 19968: 0xF0CA,\n\t26840 - 19968: 0xD0BE,\n\t26842 - 19968: 0xDDDC,\n\t26847 - 19968: 0xD4D6,\n\t26848 - 19968: 0xD3D6,\n\t26855 - 19968: 0xEDD0,\n\t26856 - 19968: 0xCDA1,\n\t26862 - 19968: 0xDFB5,\n\t26866 - 19968: 0xDFF8,\n\t26873 - 19968: 0xD4A1,\n\t26874 - 19968: 0xCEB2,\n\t26880 - 19968: 0xE8CA,\n\t26885 - 19968: 0xEBF5,\n\t26893 - 19968: 0xE3D5,\n\t26894 - 19968: 0xF5D0,\n\t26898 - 19968: 0xF5A1,\n\t26919 - 19968: 0xD9A7,\n\t26928 - 19968: 0xE5AB,\n\t26941 - 19968: 0xE6CB,\n\t26943 - 19968: 0xF5F1,\n\t26954 - 19968: 0xE5C5,\n\t26963 - 19968: 0xF9A3,\n\t26964 - 19968: 0xE0DB,\n\t26965 - 19968: 0xF6EB,\n\t26967 - 19968: 0xCBF1,\n\t26969 - 19968: 0xD9EA,\n\t26970 - 19968: 0xF5A2,\n\t26974 - 19968: 0xD7D1,\n\t26976 - 19968: 0xD1F8,\n\t26977 - 19968: 0xEAF8,\n\t26978 - 19968: 0xEAF9,\n\t26979 - 19968: 0xDAB3,\n\t26984 - 19968: 0xEFDF,\n\t26987 - 19968: 0xF1EF,\n\t26989 - 19968: 0xE5F6,\n\t26990 - 19968: 0xEEBF,\n\t26991 - 19968: 0xE2E4,\n\t26997 - 19968: 0xD0BF,\n\t26999 - 19968: 0xFAAC,\n\t27000 - 19968: 0xF5D1,\n\t27001 - 19968: 0xE7B3,\n\t27029 - 19968: 0xE9BE,\n\t27035 - 19968: 0xF2CE,\n\t27036 - 19968: 0xDBB4,\n\t27045 - 19968: 0xFCCE,\n\t27047 - 19968: 0xDDEE,\n\t27054 - 19968: 0xE7B4,\n\t27060 - 19968: 0xD7B4,\n\t27067 - 19968: 0xF7B4,\n\t27073 - 19968: 0xCDBE,\n\t27075 - 19968: 0xDAE9,\n\t27083 - 19968: 0xCFB0,\n\t27084 - 19968: 0xF7D9,\n\t27085 - 19968: 0xF3E6,\n\t27088 - 19968: 0xCED9,\n\t27112 - 19968: 0xCEAA,\n\t27114 - 19968: 0xCBC8,\n\t27131 - 19968: 0xD0A7,\n\t27133 - 19968: 0xF0CB,\n\t27135 - 19968: 0xD0C7,\n\t27138 - 19968: 0xE4C5,\n\t27146 - 19968: 0xDBE0,\n\t27153 - 19968: 0xD5DA,\n\t27155 - 19968: 0xD7A7,\n\t27159 - 19968: 0xEEC0,\n\t27161 - 19968: 0xF8F6,\n\t27166 - 19968: 0xF5D2,\n\t27167 - 19968: 0xEDE9,\n\t27169 - 19968: 0xD9BC,\n\t27171 - 19968: 0xE5C6,\n\t27189 - 19968: 0xF5A3,\n\t27192 - 19968: 0xDAD4,\n\t27193 - 19968: 0xE2A7,\n\t27194 - 19968: 0xFBFC,\n\t27197 - 19968: 0xF1DC,\n\t27204 - 19968: 0xCAF4,\n\t27208 - 19968: 0xE8FA,\n\t27211 - 19968: 0xCEE9,\n\t27218 - 19968: 0xE9F8,\n\t27219 - 19968: 0xE2E5,\n\t27224 - 19968: 0xD0B9,\n\t27225 - 19968: 0xD4F2,\n\t27231 - 19968: 0xD1A6,\n\t27233 - 19968: 0xDFCE,\n\t27243 - 19968: 0xFCF4,\n\t27264 - 19968: 0xD3AA,\n\t27268 - 19968: 0xCCAC,\n\t27273 - 19968: 0xEFE0,\n\t27277 - 19968: 0xE5E5,\n\t27278 - 19968: 0xD0D5,\n\t27287 - 19968: 0xDBFC,\n\t27292 - 19968: 0xFCE6,\n\t27298 - 19968: 0xCBFE,\n\t27299 - 19968: 0xEDEA,\n\t27315 - 19968: 0xDEB1,\n\t27323 - 19968: 0xF9E3,\n\t27330 - 19968: 0xD4A2,\n\t27331 - 19968: 0xCFF6,\n\t27347 - 19968: 0xD6D0,\n\t27354 - 19968: 0xD5EA,\n\t27355 - 19968: 0xF1EE,\n\t27382 - 19968: 0xFACB,\n\t27387 - 19968: 0xE5A1,\n\t27396 - 19968: 0xD5B1,\n\t27402 - 19968: 0xCFED,\n\t27404 - 19968: 0xEDEB,\n\t27410 - 19968: 0xD5B2,\n\t27414 - 19968: 0xD5BC,\n\t27424 - 19968: 0xFDE2,\n\t27425 - 19968: 0xF3AD,\n\t27427 - 19968: 0xFDDB,\n\t27442 - 19968: 0xE9B0,\n\t27450 - 19968: 0xD1A7,\n\t27453 - 19968: 0xFDE3,\n\t27454 - 19968: 0xCEB3,\n\t27462 - 19968: 0xFDE4,\n\t27463 - 19968: 0xFACE,\n\t27468 - 19968: 0xCAB0,\n\t27470 - 19968: 0xF7A7,\n\t27472 - 19968: 0xCFB1,\n\t27487 - 19968: 0xE6A2,\n\t27489 - 19968: 0xFCB6,\n\t27490 - 19968: 0xF2AD,\n\t27491 - 19968: 0xEFE1,\n\t27492 - 19968: 0xF3AE,\n\t27493 - 19968: 0xDCC6,\n\t27494 - 19968: 0xD9EB,\n\t27498 - 19968: 0xE8E0,\n\t27506 - 19968: 0xE1A8,\n\t27511 - 19968: 0xD5F6,\n\t27512 - 19968: 0xCFFD,\n\t27515 - 19968: 0xDEDD,\n\t27519 - 19968: 0xD9D1,\n\t27523 - 19968: 0xE4EA,\n\t27524 - 19968: 0xF2CF,\n\t27526 - 19968: 0xF7BF,\n\t27529 - 19968: 0xE2E6,\n\t27530 - 19968: 0xE2A8,\n\t27542 - 19968: 0xE3D6,\n\t27544 - 19968: 0xEDD1,\n\t27550 - 19968: 0xE9F9,\n\t27566 - 19968: 0xD6B1,\n\t27567 - 19968: 0xDEB2,\n\t27570 - 19968: 0xE0E8,\n\t27573 - 19968: 0xD3AB,\n\t27575 - 19968: 0xEBDC,\n\t27578 - 19968: 0xDFAF,\n\t27580 - 19968: 0xCAC3,\n\t27583 - 19968: 0xEEFC,\n\t27585 - 19968: 0xFDC3,\n\t27589 - 19968: 0xEBF6,\n\t27590 - 19968: 0xCFB2,\n\t27595 - 19968: 0xD9EC,\n\t27597 - 19968: 0xD9BD,\n\t27599 - 19968: 0xD8DF,\n\t27602 - 19968: 0xD4B8,\n\t27603 - 19968: 0xEBBE,\n\t27604 - 19968: 0xDDEF,\n\t27606 - 19968: 0xDDF0,\n\t27607 - 19968: 0xDDF1,\n\t27608 - 19968: 0xDDF2,\n\t27611 - 19968: 0xD9BE,\n\t27627 - 19968: 0xFBC6,\n\t27628 - 19968: 0xCFB3,\n\t27656 - 19968: 0xEEFD,\n\t27663 - 19968: 0xE4AB,\n\t27665 - 19968: 0xDAC5,\n\t27667 - 19968: 0xD8EC,\n\t27683 - 19968: 0xD1A8,\n\t27700 - 19968: 0xE2A9,\n\t27703 - 19968: 0xDEBC,\n\t27704 - 19968: 0xE7B5,\n\t27710 - 19968: 0xDBF0,\n\t27712 - 19968: 0xEFE2,\n\t27713 - 19968: 0xF1F0,\n\t27714 - 19968: 0xCFB4,\n\t27726 - 19968: 0xDBF1,\n\t27728 - 19968: 0xE0B1,\n\t27733 - 19968: 0xDFA5,\n\t27735 - 19968: 0xF9D2,\n\t27738 - 19968: 0xE7FD,\n\t27741 - 19968: 0xE6A3,\n\t27742 - 19968: 0xFBF1,\n\t27743 - 19968: 0xCBB0,\n\t27744 - 19968: 0xF2AE,\n\t27752 - 19968: 0xCDE7,\n\t27754 - 19968: 0xE8DC,\n\t27757 - 19968: 0xE7D7,\n\t27760 - 19968: 0xF7C0,\n\t27762 - 19968: 0xD0E3,\n\t27766 - 19968: 0xDAA1,\n\t27770 - 19968: 0xCCBD,\n\t27773 - 19968: 0xD1A9,\n\t27774 - 19968: 0xDDCC,\n\t27777 - 19968: 0xE3FE,\n\t27778 - 19968: 0xD1AA,\n\t27779 - 19968: 0xE8AA,\n\t27781 - 19968: 0xEAB6,\n\t27782 - 19968: 0xF9FA,\n\t27783 - 19968: 0xE6CC,\n\t27784 - 19968: 0xF6D8,\n\t27788 - 19968: 0xD4C7,\n\t27792 - 19968: 0xD9CB,\n\t27794 - 19968: 0xD9D2,\n\t27795 - 19968: 0xD3CB,\n\t27796 - 19968: 0xD8F7,\n\t27797 - 19968: 0xDAA9,\n\t27798 - 19968: 0xF5F8,\n\t27801 - 19968: 0xDEDE,\n\t27802 - 19968: 0xF2AF,\n\t27803 - 19968: 0xF8A9,\n\t27819 - 19968: 0xD8C8,\n\t27822 - 19968: 0xEEC1,\n\t27827 - 19968: 0xF9C1,\n\t27832 - 19968: 0xDDF3,\n\t27833 - 19968: 0xEAFA,\n\t27835 - 19968: 0xF6BD,\n\t27836 - 19968: 0xE1BB,\n\t27837 - 19968: 0xCDBF,\n\t27838 - 19968: 0xF4D4,\n\t27839 - 19968: 0xE6CD,\n\t27841 - 19968: 0xFCCF,\n\t27842 - 19968: 0xFBA2,\n\t27844 - 19968: 0xE0DC,\n\t27849 - 19968: 0xF4BB,\n\t27850 - 19968: 0xDAD5,\n\t27852 - 19968: 0xF9B2,\n\t27859 - 19968: 0xFBF2,\n\t27861 - 19968: 0xDBF6,\n\t27863 - 19968: 0xDEDF,\n\t27867 - 19968: 0xDBF2,\n\t27873 - 19968: 0xF8DC,\n\t27874 - 19968: 0xF7EE,\n\t27875 - 19968: 0xEBE8,\n\t27877 - 19968: 0xD2FA,\n\t27880 - 19968: 0xF1BC,\n\t27883 - 19968: 0xFADA,\n\t27886 - 19968: 0xDAEA,\n\t27887 - 19968: 0xDAC6,\n\t27888 - 19968: 0xF7C1,\n\t27891 - 19968: 0xE7B6,\n\t27915 - 19968: 0xE5C7,\n\t27916 - 19968: 0xD6AC,\n\t27921 - 19968: 0xDCC7,\n\t27927 - 19968: 0xE1A9,\n\t27929 - 19968: 0xE2AA,\n\t27931 - 19968: 0xD5A6,\n\t27934 - 19968: 0xD4D7,\n\t27941 - 19968: 0xF2D0,\n\t27943 - 19968: 0xEAFB,\n\t27945 - 19968: 0xE0DD,\n\t27946 - 19968: 0xFBF3,\n\t27954 - 19968: 0xF1BD,\n\t27957 - 19968: 0xE2E7,\n\t27958 - 19968: 0xFDD7,\n\t27960 - 19968: 0xCEC8,\n\t27961 - 19968: 0xEAB7,\n\t27963 - 19968: 0xFCC0,\n\t27965 - 19968: 0xFDE7,\n\t27966 - 19968: 0xF7EF,\n\t27969 - 19968: 0xD7B5,\n\t27993 - 19968: 0xEFBA,\n\t27994 - 19968: 0xF1DD,\n\t27996 - 19968: 0xDEB3,\n\t28003 - 19968: 0xE8CB,\n\t28006 - 19968: 0xF8DD,\n\t28009 - 19968: 0xFBC7,\n\t28010 - 19968: 0xD5C8,\n\t28012 - 19968: 0xD7DF,\n\t28014 - 19968: 0xDDA9,\n\t28020 - 19968: 0xE9B1,\n\t28023 - 19968: 0xFAAD,\n\t28024 - 19968: 0xF6D9,\n\t28025 - 19968: 0xFAF4,\n\t28031 - 19968: 0xF8AA,\n\t28037 - 19968: 0xE6EE,\n\t28039 - 19968: 0xCCDC,\n\t28040 - 19968: 0xE1BC,\n\t28041 - 19968: 0xE0EF,\n\t28044 - 19968: 0xE9BF,\n\t28045 - 19968: 0xFCFD,\n\t28046 - 19968: 0xE6CE,\n\t28049 - 19968: 0xE1D7,\n\t28051 - 19968: 0xE6CF,\n\t28053 - 19968: 0xF4F1,\n\t28079 - 19968: 0xE4F3,\n\t28082 - 19968: 0xE4FB,\n\t28085 - 19968: 0xF9E4,\n\t28096 - 19968: 0xEFE3,\n\t28099 - 19968: 0xCFEE,\n\t28100 - 19968: 0xF6BE,\n\t28101 - 19968: 0xE0B2,\n\t28102 - 19968: 0xFCFE,\n\t28103 - 19968: 0xD1AB,\n\t28107 - 19968: 0xD7FA,\n\t28111 - 19968: 0xFBC8,\n\t28113 - 19968: 0xE2D7,\n\t28120 - 19968: 0xD4A3,\n\t28121 - 19968: 0xF0F8,\n\t28122 - 19968: 0xD7A8,\n\t28126 - 19968: 0xE1E7,\n\t28129 - 19968: 0xD3BF,\n\t28136 - 19968: 0xEFE4,\n\t28138 - 19968: 0xD7C5,\n\t28139 - 19968: 0xEBE2,\n\t28142 - 19968: 0xFCE7,\n\t28145 - 19968: 0xE4A2,\n\t28147 - 19968: 0xE2E8,\n\t28149 - 19968: 0xE6D0,\n\t28151 - 19968: 0xFBE8,\n\t28152 - 19968: 0xF4E8,\n\t28153 - 19968: 0xE5F4,\n\t28154 - 19968: 0xF4BC,\n\t28155 - 19968: 0xF4D5,\n\t28183 - 19968: 0xDFB6,\n\t28185 - 19968: 0xFCB9,\n\t28186 - 19968: 0xEEC2,\n\t28187 - 19968: 0xCAF5,\n\t28191 - 19968: 0xEFE5,\n\t28192 - 19968: 0xCBE2,\n\t28193 - 19968: 0xD4A4,\n\t28195 - 19968: 0xDEE0,\n\t28196 - 19968: 0xDAFD,\n\t28197 - 19968: 0xE4C6,\n\t28198 - 19968: 0xE8BE,\n\t28203 - 19968: 0xE0DE,\n\t28204 - 19968: 0xF6B4,\n\t28205 - 19968: 0xEAD2,\n\t28207 - 19968: 0xF9FB,\n\t28210 - 19968: 0xE0C2,\n\t28212 - 19968: 0xCAE4,\n\t28214 - 19968: 0xE7B7,\n\t28216 - 19968: 0xEAFD,\n\t28218 - 19968: 0xD9DD,\n\t28220 - 19968: 0xDAB4,\n\t28221 - 19968: 0xEEAA,\n\t28222 - 19968: 0xFBE9,\n\t28227 - 19968: 0xDBCB,\n\t28228 - 19968: 0xDAB5,\n\t28234 - 19968: 0xF1BE,\n\t28237 - 19968: 0xD3AC,\n\t28246 - 19968: 0xFBC9,\n\t28248 - 19968: 0xDFCF,\n\t28251 - 19968: 0xD3C0,\n\t28252 - 19968: 0xE3D7,\n\t28254 - 19968: 0xEFE6,\n\t28255 - 19968: 0xFCD0,\n\t28263 - 19968: 0xE9C0,\n\t28267 - 19968: 0xF5D3,\n\t28270 - 19968: 0xECDC,\n\t28271 - 19968: 0xF7B7,\n\t28274 - 19968: 0xEAB8,\n\t28275 - 19968: 0xD1F9,\n\t28282 - 19968: 0xDCC8,\n\t28304 - 19968: 0xEAB9,\n\t28310 - 19968: 0xF1DE,\n\t28316 - 19968: 0xD7B6,\n\t28317 - 19968: 0xCFB5,\n\t28319 - 19968: 0xD9A8,\n\t28322 - 19968: 0xECEE,\n\t28325 - 19968: 0xDDAA,\n\t28330 - 19968: 0xCDA2,\n\t28331 - 19968: 0xE8AE,\n\t28335 - 19968: 0xE1BD,\n\t28337 - 19968: 0xF2D1,\n\t28342 - 19968: 0xE9C1,\n\t28346 - 19968: 0xD2FC,\n\t28354 - 19968: 0xDBB5,\n\t28356 - 19968: 0xF3E7,\n\t28357 - 19968: 0xD8FE,\n\t28361 - 19968: 0xFCD1,\n\t28363 - 19968: 0xEDB2,\n\t28364 - 19968: 0xF4AF,\n\t28366 - 19968: 0xFBA3,\n\t28369 - 19968: 0xFCC1,\n\t28371 - 19968: 0xEEAB,\n\t28372 - 19968: 0xD4A5,\n\t28399 - 19968: 0xF4F2,\n\t28404 - 19968: 0xEED9,\n\t28408 - 19968: 0xFBCA,\n\t28414 - 19968: 0xCDE3,\n\t28415 - 19968: 0xD8BB,\n\t28417 - 19968: 0xE5DB,\n\t28418 - 19968: 0xF8F7,\n\t28422 - 19968: 0xF6D4,\n\t28431 - 19968: 0xD7A9,\n\t28433 - 19968: 0xCBC9,\n\t28436 - 19968: 0xE6D1,\n\t28437 - 19968: 0xF0CC,\n\t28448 - 19968: 0xD8AE,\n\t28450 - 19968: 0xF9D3,\n\t28451 - 19968: 0xD5FE,\n\t28459 - 19968: 0xD8BC,\n\t28460 - 19968: 0xF2B0,\n\t28465 - 19968: 0xE2AB,\n\t28466 - 19968: 0xF3E8,\n\t28472 - 19968: 0xEFC2,\n\t28479 - 19968: 0xEDEC,\n\t28481 - 19968: 0xE7B8,\n\t28497 - 19968: 0xDAFE,\n\t28500 - 19968: 0xCCBE,\n\t28503 - 19968: 0xF2FC,\n\t28504 - 19968: 0xDAEB,\n\t28506 - 19968: 0xE2D8,\n\t28507 - 19968: 0xEDD6,\n\t28510 - 19968: 0xD6D1,\n\t28511 - 19968: 0xE0B3,\n\t28514 - 19968: 0xFCD2,\n\t28516 - 19968: 0xEBC8,\n\t28525 - 19968: 0xD3C1,\n\t28526 - 19968: 0xF0CD,\n\t28528 - 19968: 0xCFF7,\n\t28538 - 19968: 0xEDD2,\n\t28540 - 19968: 0xD4D8,\n\t28541 - 19968: 0xDCC9,\n\t28542 - 19968: 0xD7F1,\n\t28545 - 19968: 0xDFBB,\n\t28548 - 19968: 0xF3A5,\n\t28552 - 19968: 0xF4CD,\n\t28557 - 19968: 0xF1BF,\n\t28558 - 19968: 0xF8B1,\n\t28560 - 19968: 0xE9FA,\n\t28564 - 19968: 0xFBCB,\n\t28567 - 19968: 0xCAD5,\n\t28579 - 19968: 0xF9D4,\n\t28580 - 19968: 0xF7CA,\n\t28583 - 19968: 0xD6C8,\n\t28590 - 19968: 0xFCE8,\n\t28591 - 19968: 0xF3BD,\n\t28593 - 19968: 0xEEFE,\n\t28595 - 19968: 0xE7FE,\n\t28601 - 19968: 0xD3C2,\n\t28606 - 19968: 0xD3B6,\n\t28608 - 19968: 0xCCAD,\n\t28609 - 19968: 0xF6FA,\n\t28610 - 19968: 0xD6B2,\n\t28611 - 19968: 0xD2D8,\n\t28618 - 19968: 0xE7D8,\n\t28629 - 19968: 0xE3A5,\n\t28634 - 19968: 0xE7B9,\n\t28639 - 19968: 0xF0AD,\n\t28640 - 19968: 0xFBCC,\n\t28641 - 19968: 0xEBA1,\n\t28644 - 19968: 0xD4A6,\n\t28649 - 19968: 0xFBCD,\n\t28651 - 19968: 0xD5BD,\n\t28652 - 19968: 0xF1DF,\n\t28655 - 19968: 0xF6FB,\n\t28657 - 19968: 0xDEB4,\n\t28670 - 19968: 0xD5EB,\n\t28673 - 19968: 0xE5C8,\n\t28677 - 19968: 0xFBA4,\n\t28678 - 19968: 0xD4B9,\n\t28681 - 19968: 0xDEE1,\n\t28683 - 19968: 0xE4A3,\n\t28687 - 19968: 0xD7B7,\n\t28689 - 19968: 0xF8EE,\n\t28693 - 19968: 0xDEB5,\n\t28696 - 19968: 0xD6D2,\n\t28698 - 19968: 0xF9D5,\n\t28699 - 19968: 0xE7BA,\n\t28700 - 19968: 0xEBD5,\n\t28701 - 19968: 0xD5F7,\n\t28702 - 19968: 0xEFE7,\n\t28703 - 19968: 0xE1BE,\n\t28707 - 19968: 0xFAAE,\n\t28711 - 19968: 0xD6E9,\n\t28712 - 19968: 0xD6EE,\n\t28719 - 19968: 0xE7BB,\n\t28727 - 19968: 0xECCB,\n\t28734 - 19968: 0xD5B3,\n\t28748 - 19968: 0xCEB4,\n\t28752 - 19968: 0xFBA5,\n\t28753 - 19968: 0xE1EE,\n\t28760 - 19968: 0xF7A8,\n\t28765 - 19968: 0xFBCE,\n\t28771 - 19968: 0xD8BD,\n\t28779 - 19968: 0xFBFD,\n\t28784 - 19968: 0xFCE9,\n\t28792 - 19968: 0xCFB6,\n\t28796 - 19968: 0xEDC7,\n\t28797 - 19968: 0xEEAC,\n\t28805 - 19968: 0xCCDD,\n\t28810 - 19968: 0xF6A7,\n\t28814 - 19968: 0xE6FA,\n\t28818 - 19968: 0xF5A4,\n\t28824 - 19968: 0xFDDC,\n\t28825 - 19968: 0xEDB3,\n\t28826 - 19968: 0xCEC9,\n\t28833 - 19968: 0xEFE8,\n\t28836 - 19968: 0xE1BF,\n\t28843 - 19968: 0xFADB,\n\t28844 - 19968: 0xCBE3,\n\t28845 - 19968: 0xF7A9,\n\t28847 - 19968: 0xFBA6,\n\t28851 - 19968: 0xDCB9,\n\t28855 - 19968: 0xF1C0,\n\t28856 - 19968: 0xEDC8,\n\t28857 - 19968: 0xEFC3,\n\t28872 - 19968: 0xD6AD,\n\t28875 - 19968: 0xFDCE,\n\t28879 - 19968: 0xE8A1,\n\t28888 - 19968: 0xFBF4,\n\t28889 - 19968: 0xD5A7,\n\t28893 - 19968: 0xF1F6,\n\t28895 - 19968: 0xE6D3,\n\t28913 - 19968: 0xCCDE,\n\t28921 - 19968: 0xF8B2,\n\t28925 - 19968: 0xDCEB,\n\t28932 - 19968: 0xFDB6,\n\t28937 - 19968: 0xE5EA,\n\t28940 - 19968: 0xF1E0,\n\t28953 - 19968: 0xDBCC,\n\t28954 - 19968: 0xDDCD,\n\t28958 - 19968: 0xD4C8,\n\t28961 - 19968: 0xD9ED,\n\t28966 - 19968: 0xF5A5,\n\t28976 - 19968: 0xE6FB,\n\t28982 - 19968: 0xE6D4,\n\t28999 - 19968: 0xFDC8,\n\t29001 - 19968: 0xD6A1,\n\t29002 - 19968: 0xFDBF,\n\t29004 - 19968: 0xFCD3,\n\t29006 - 19968: 0xEFA1,\n\t29008 - 19968: 0xE7BC,\n\t29014 - 19968: 0xD1EE,\n\t29017 - 19968: 0xE6D5,\n\t29020 - 19968: 0xE9F2,\n\t29022 - 19968: 0xDFB0,\n\t29028 - 19968: 0xD8E0,\n\t29029 - 19968: 0xFCBA,\n\t29030 - 19968: 0xFDAF,\n\t29031 - 19968: 0xF0CE,\n\t29033 - 19968: 0xDBE1,\n\t29036 - 19968: 0xE5C9,\n\t29038 - 19968: 0xEDB4,\n\t29053 - 19968: 0xE0C3,\n\t29060 - 19968: 0xE3D8,\n\t29065 - 19968: 0xE9FB,\n\t29066 - 19968: 0xEAA8,\n\t29071 - 19968: 0xFDB7,\n\t29074 - 19968: 0xFBA7,\n\t29076 - 19968: 0xE9C2,\n\t29081 - 19968: 0xFDF7,\n\t29087 - 19968: 0xE2D9,\n\t29090 - 19968: 0xDCEC,\n\t29100 - 19968: 0xE8A2,\n\t29105 - 19968: 0xE6F0,\n\t29113 - 19968: 0xFDF8,\n\t29114 - 19968: 0xFDF9,\n\t29118 - 19968: 0xF6BF,\n\t29121 - 19968: 0xE7A7,\n\t29123 - 19968: 0xE6D7,\n\t29128 - 19968: 0xD4F3,\n\t29129 - 19968: 0xD4C9,\n\t29134 - 19968: 0xD6FA,\n\t29136 - 19968: 0xD7F2,\n\t29138 - 19968: 0xE1C0,\n\t29140 - 19968: 0xDBE2,\n\t29141 - 19968: 0xE6D8,\n\t29151 - 19968: 0xE7BD,\n\t29157 - 19968: 0xF0CF,\n\t29158 - 19968: 0xF3BE,\n\t29159 - 19968: 0xE2AC,\n\t29165 - 19968: 0xF5B7,\n\t29166 - 19968: 0xE0F0,\n\t29179 - 19968: 0xFDB8,\n\t29180 - 19968: 0xE3E8,\n\t29182 - 19968: 0xD4A7,\n\t29183 - 19968: 0xE8FC,\n\t29184 - 19968: 0xFAD2,\n\t29190 - 19968: 0xF8EF,\n\t29200 - 19968: 0xD6D3,\n\t29211 - 19968: 0xD5B4,\n\t29226 - 19968: 0xF0D0,\n\t29228 - 19968: 0xF7F0,\n\t29229 - 19968: 0xEEB3,\n\t29232 - 19968: 0xEABA,\n\t29234 - 19968: 0xEAD3,\n\t29237 - 19968: 0xEDC9,\n\t29238 - 19968: 0xDDAB,\n\t29242 - 19968: 0xE5AC,\n\t29243 - 19968: 0xFDA1,\n\t29245 - 19968: 0xDFD0,\n\t29246 - 19968: 0xECB3,\n\t29248 - 19968: 0xDFD1,\n\t29254 - 19968: 0xEDED,\n\t29255 - 19968: 0xF8B8,\n\t29256 - 19968: 0xF7FA,\n\t29260 - 19968: 0xF8AB,\n\t29266 - 19968: 0xF4E0,\n\t29272 - 19968: 0xD4BA,\n\t29273 - 19968: 0xE4B3,\n\t29275 - 19968: 0xE9DA,\n\t29277 - 19968: 0xDEB6,\n\t29279 - 19968: 0xD9BF,\n\t29281 - 19968: 0xD9C0,\n\t29282 - 19968: 0xD6EF,\n\t29287 - 19968: 0xD9CC,\n\t29289 - 19968: 0xDAAA,\n\t29298 - 19968: 0xDFE5,\n\t29305 - 19968: 0xF7E5,\n\t29309 - 19968: 0xCCB2,\n\t29312 - 19968: 0xDFF9,\n\t29313 - 19968: 0xD7E0,\n\t29346 - 19968: 0xD4BB,\n\t29351 - 19968: 0xFDFA,\n\t29356 - 19968: 0xCCB3,\n\t29359 - 19968: 0xDBF3,\n\t29376 - 19968: 0xDFD2,\n\t29378 - 19968: 0xCECA,\n\t29380 - 19968: 0xEEDA,\n\t29390 - 19968: 0xE4E4,\n\t29392 - 19968: 0xFBCF,\n\t29399 - 19968: 0xCFB7,\n\t29401 - 19968: 0xEEC3,\n\t29409 - 19968: 0xCEEA,\n\t29417 - 19968: 0xE2AD,\n\t29432 - 19968: 0xD7E1,\n\t29433 - 19968: 0xFAF5,\n\t29436 - 19968: 0xD5C9,\n\t29437 - 19968: 0xF8AC,\n\t29450 - 19968: 0xE7D9,\n\t29462 - 19968: 0xF3E9,\n\t29467 - 19968: 0xD8ED,\n\t29468 - 19968: 0xE3C4,\n\t29469 - 19968: 0xF0F1,\n\t29477 - 19968: 0xE8E5,\n\t29481 - 19968: 0xE0FA,\n\t29482 - 19968: 0xEEC4,\n\t29483 - 19968: 0xD9DE,\n\t29494 - 19968: 0xEBA2,\n\t29495 - 19968: 0xEBA3,\n\t29502 - 19968: 0xFCC2,\n\t29503 - 19968: 0xEABB,\n\t29508 - 19968: 0xE8AB,\n\t29509 - 19968: 0xDEE2,\n\t29520 - 19968: 0xEDEF,\n\t29522 - 19968: 0xE8A3,\n\t29527 - 19968: 0xCFF1,\n\t29544 - 19968: 0xD4BC,\n\t29546 - 19968: 0xFCEA,\n\t29552 - 19968: 0xE7BE,\n\t29554 - 19968: 0xFCF2,\n\t29557 - 19968: 0xD6B4,\n\t29560 - 19968: 0xE2AE,\n\t29562 - 19968: 0xD3B7,\n\t29563 - 19968: 0xFACC,\n\t29572 - 19968: 0xFADC,\n\t29574 - 19968: 0xEDB5,\n\t29575 - 19968: 0xE1E3,\n\t29577 - 19968: 0xE8AC,\n\t29579 - 19968: 0xE8DD,\n\t29582 - 19968: 0xEFE9,\n\t29588 - 19968: 0xF4BD,\n\t29590 - 19968: 0xCFB8,\n\t29591 - 19968: 0xE9DB,\n\t29592 - 19968: 0xD1AC,\n\t29599 - 19968: 0xDAC7,\n\t29607 - 19968: 0xEBC9,\n\t29609 - 19968: 0xE8CC,\n\t29613 - 19968: 0xDEB7,\n\t29618 - 19968: 0xD6BC,\n\t29619 - 19968: 0xD3E5,\n\t29625 - 19968: 0xFADD,\n\t29632 - 19968: 0xDAD6,\n\t29634 - 19968: 0xCAB1,\n\t29641 - 19968: 0xDAC8,\n\t29642 - 19968: 0xDFA6,\n\t29644 - 19968: 0xF9B3,\n\t29645 - 19968: 0xF2D2,\n\t29647 - 19968: 0xCAC4,\n\t29654 - 19968: 0xCECB,\n\t29657 - 19968: 0xCDF5,\n\t29661 - 19968: 0xFDB0,\n\t29662 - 19968: 0xD5A8,\n\t29664 - 19968: 0xF1C1,\n\t29667 - 19968: 0xE2E9,\n\t29668 - 19968: 0xDCCA,\n\t29669 - 19968: 0xECB4,\n\t29670 - 19968: 0xFAC0,\n\t29673 - 19968: 0xFBA8,\n\t29674 - 19968: 0xD0A8,\n\t29677 - 19968: 0xDAEC,\n\t29687 - 19968: 0xD9EE,\n\t29689 - 19968: 0xE0FB,\n\t29693 - 19968: 0xEFEA,\n\t29694 - 19968: 0xFADE,\n\t29697 - 19968: 0xE0C4,\n\t29699 - 19968: 0xCFB9,\n\t29701 - 19968: 0xD5CA,\n\t29702 - 19968: 0xD7E2,\n\t29703 - 19968: 0xE2AF,\n\t29705 - 19968: 0xD7B8,\n\t29715 - 19968: 0xE8CD,\n\t29723 - 19968: 0xF6DA,\n\t29728 - 19968: 0xEFA2,\n\t29729 - 19968: 0xE2DA,\n\t29730 - 19968: 0xF6FC,\n\t29733 - 19968: 0xFBD0,\n\t29734 - 19968: 0xD1AD,\n\t29736 - 19968: 0xCDE4,\n\t29738 - 19968: 0xD1AE,\n\t29739 - 19968: 0xDCED,\n\t29740 - 19968: 0xE8CE,\n\t29742 - 19968: 0xF0F9,\n\t29743 - 19968: 0xCEB5,\n\t29744 - 19968: 0xE6FC,\n\t29747 - 19968: 0xD7FB,\n\t29748 - 19968: 0xD0D6,\n\t29749 - 19968: 0xDDF5,\n\t29750 - 19968: 0xF7F1,\n\t29752 - 19968: 0xF6FD,\n\t29754 - 19968: 0xDBF7,\n\t29759 - 19968: 0xFBEA,\n\t29760 - 19968: 0xE9DC,\n\t29761 - 19968: 0xD9C1,\n\t29763 - 19968: 0xF5F2,\n\t29764 - 19968: 0xE0C5,\n\t29771 - 19968: 0xEAD4,\n\t29781 - 19968: 0xF9C2,\n\t29783 - 19968: 0xEABC,\n\t29785 - 19968: 0xD2C5,\n\t29786 - 19968: 0xFBD1,\n\t29787 - 19968: 0xE7C0,\n\t29788 - 19968: 0xEBA5,\n\t29790 - 19968: 0xDFFA,\n\t29791 - 19968: 0xE3A2,\n\t29792 - 19968: 0xD7B9,\n\t29794 - 19968: 0xE9C3,\n\t29796 - 19968: 0xE8FD,\n\t29797 - 19968: 0xE8AF,\n\t29800 - 19968: 0xF2D3,\n\t29801 - 19968: 0xFBA9,\n\t29802 - 19968: 0xD8A5,\n\t29807 - 19968: 0xD5CB,\n\t29822 - 19968: 0xD0C8,\n\t29826 - 19968: 0xD1AF,\n\t29827 - 19968: 0xD7E3,\n\t29831 - 19968: 0xE0C6,\n\t29833 - 19968: 0xD6A2,\n\t29835 - 19968: 0xEDF0,\n\t29848 - 19968: 0xD7F3,\n\t29852 - 19968: 0xFCD4,\n\t29854 - 19968: 0xDAD7,\n\t29855 - 19968: 0xCCDF,\n\t29857 - 19968: 0xF2D4,\n\t29859 - 19968: 0xD1B0,\n\t29861 - 19968: 0xCCE0,\n\t29863 - 19968: 0xDBFD,\n\t29864 - 19968: 0xF3BF,\n\t29866 - 19968: 0xF0D1,\n\t29872 - 19968: 0xFCBB,\n\t29874 - 19968: 0xE2B0,\n\t29877 - 19968: 0xE6A5,\n\t29881 - 19968: 0xE2DB,\n\t29885 - 19968: 0xDFDE,\n\t29887 - 19968: 0xE0C7,\n\t29894 - 19968: 0xF2EF,\n\t29898 - 19968: 0xCCE1,\n\t29903 - 19968: 0xD6EA,\n\t29908 - 19968: 0xE7C2,\n\t29912 - 19968: 0xCEB6,\n\t29914 - 19968: 0xF3C0,\n\t29916 - 19968: 0xCDFE,\n\t29920 - 19968: 0xFBD2,\n\t29922 - 19968: 0xF8F8,\n\t29923 - 19968: 0xF7FB,\n\t29926 - 19968: 0xE8BF,\n\t29934 - 19968: 0xE8B7,\n\t29943 - 19968: 0xEDB6,\n\t29953 - 19968: 0xDCBA,\n\t29956 - 19968: 0xCCB4,\n\t29969 - 19968: 0xF1F7,\n\t29973 - 19968: 0xE8B8,\n\t29976 - 19968: 0xCAF6,\n\t29978 - 19968: 0xE4A4,\n\t29979 - 19968: 0xF4D6,\n\t29983 - 19968: 0xDFE6,\n\t29987 - 19968: 0xDFA7,\n\t29989 - 19968: 0xDFE7,\n\t29990 - 19968: 0xE1C1,\n\t29992 - 19968: 0xE9C4,\n\t29995 - 19968: 0xDCCB,\n\t29996 - 19968: 0xE9C5,\n\t30000 - 19968: 0xEFA3,\n\t30001 - 19968: 0xEBA6,\n\t30002 - 19968: 0xCBA3,\n\t30003 - 19968: 0xE3E9,\n\t30007 - 19968: 0xD1FB,\n\t30008 - 19968: 0xEFA4,\n\t30010 - 19968: 0xEFEB,\n\t30023 - 19968: 0xD0B4,\n\t30028 - 19968: 0xCDA3,\n\t30031 - 19968: 0xE8E6,\n\t30033 - 19968: 0xEFA5,\n\t30035 - 19968: 0xD3CC,\n\t30036 - 19968: 0xDAED,\n\t30041 - 19968: 0xD7BA,\n\t30043 - 19968: 0xF2D5,\n\t30044 - 19968: 0xF5E5,\n\t30045 - 19968: 0xD9EF,\n\t30050 - 19968: 0xF9B4,\n\t30053 - 19968: 0xD5D4,\n\t30054 - 19968: 0xFDCF,\n\t30058 - 19968: 0xDBE3,\n\t30063 - 19968: 0xF1E1,\n\t30064 - 19968: 0xECB6,\n\t30069 - 19968: 0xFBFE,\n\t30070 - 19968: 0xD3D7,\n\t30072 - 19968: 0xD1B1,\n\t30074 - 19968: 0xCBB1,\n\t30079 - 19968: 0xD1B2,\n\t30086 - 19968: 0xCBB2,\n\t30087 - 19968: 0xF1C2,\n\t30090 - 19968: 0xF4E1,\n\t30091 - 19968: 0xF9B5,\n\t30094 - 19968: 0xE1C3,\n\t30095 - 19968: 0xE1C2,\n\t30097 - 19968: 0xEBF7,\n\t30109 - 19968: 0xDFA8,\n\t30117 - 19968: 0xCBCA,\n\t30123 - 19968: 0xE6B9,\n\t30129 - 19968: 0xF8DE,\n\t30130 - 19968: 0xF9AA,\n\t30131 - 19968: 0xCAF7,\n\t30133 - 19968: 0xEDB7,\n\t30136 - 19968: 0xD3B8,\n\t30137 - 19968: 0xF2D6,\n\t30140 - 19968: 0xD4D9,\n\t30141 - 19968: 0xEEC5,\n\t30142 - 19968: 0xF2F0,\n\t30146 - 19968: 0xCAB2,\n\t30149 - 19968: 0xDCBB,\n\t30151 - 19968: 0xF1F8,\n\t30157 - 19968: 0xECB7,\n\t30162 - 19968: 0xE5CA,\n\t30164 - 19968: 0xF6C0,\n\t30165 - 19968: 0xFDDD,\n\t30168 - 19968: 0xD4E3,\n\t30169 - 19968: 0xCCE2,\n\t30171 - 19968: 0xF7D4,\n\t30178 - 19968: 0xD7E5,\n\t30192 - 19968: 0xD3C3,\n\t30194 - 19968: 0xD8A6,\n\t30196 - 19968: 0xF6C1,\n\t30202 - 19968: 0xDDF6,\n\t30204 - 19968: 0xCDC0,\n\t30208 - 19968: 0xE5DC,\n\t30221 - 19968: 0xE5CB,\n\t30233 - 19968: 0xE1C4,\n\t30239 - 19968: 0xE8B0,\n\t30240 - 19968: 0xF4B0,\n\t30241 - 19968: 0xF3EA,\n\t30242 - 19968: 0xDAEE,\n\t30244 - 19968: 0xD7BB,\n\t30246 - 19968: 0xE2B1,\n\t30267 - 19968: 0xD7AA,\n\t30274 - 19968: 0xD6FB,\n\t30284 - 19968: 0xE4DF,\n\t30286 - 19968: 0xCAD6,\n\t30290 - 19968: 0xEBA8,\n\t30294 - 19968: 0xDBFE,\n\t30305 - 19968: 0xF6C2,\n\t30308 - 19968: 0xEFBB,\n\t30313 - 19968: 0xD4FD,\n\t30316 - 19968: 0xE0C8,\n\t30320 - 19968: 0xE8B9,\n\t30322 - 19968: 0xEFA6,\n\t30328 - 19968: 0xCDA4,\n\t30331 - 19968: 0xD4F4,\n\t30332 - 19968: 0xDBA1,\n\t30333 - 19968: 0xDBDC,\n\t30334 - 19968: 0xDBDD,\n\t30340 - 19968: 0xEEDC,\n\t30342 - 19968: 0xCBCB,\n\t30343 - 19968: 0xFCD5,\n\t30350 - 19968: 0xCEEB,\n\t30352 - 19968: 0xCDC1,\n\t30355 - 19968: 0xFBD3,\n\t30382 - 19968: 0xF9AB,\n\t30394 - 19968: 0xF5D4,\n\t30399 - 19968: 0xD9A9,\n\t30402 - 19968: 0xE9DD,\n\t30403 - 19968: 0xDBCD,\n\t30406 - 19968: 0xDDCE,\n\t30408 - 19968: 0xE7C3,\n\t30410 - 19968: 0xECCC,\n\t30418 - 19968: 0xF9EC,\n\t30422 - 19968: 0xCBCC,\n\t30427 - 19968: 0xE0FC,\n\t30428 - 19968: 0xD4A8,\n\t30430 - 19968: 0xEDD3,\n\t30431 - 19968: 0xD8EF,\n\t30433 - 19968: 0xF2D7,\n\t30435 - 19968: 0xCAF8,\n\t30436 - 19968: 0xDAEF,\n\t30439 - 19968: 0xD6D4,\n\t30446 - 19968: 0xD9CD,\n\t30450 - 19968: 0xD8EE,\n\t30452 - 19968: 0xF2C1,\n\t30456 - 19968: 0xDFD3,\n\t30460 - 19968: 0xDAF0,\n\t30462 - 19968: 0xE2EA,\n\t30465 - 19968: 0xE0FD,\n\t30468 - 19968: 0xD8F8,\n\t30472 - 19968: 0xF7AF,\n\t30473 - 19968: 0xDAB6,\n\t30475 - 19968: 0xCAD7,\n\t30494 - 19968: 0xF2D8,\n\t30496 - 19968: 0xD8F9,\n\t30505 - 19968: 0xFADF,\n\t30519 - 19968: 0xCFEF,\n\t30520 - 19968: 0xD9C2,\n\t30522 - 19968: 0xF0D2,\n\t30524 - 19968: 0xE4D1,\n\t30528 - 19968: 0xF3B7,\n\t30541 - 19968: 0xFAE0,\n\t30555 - 19968: 0xEFEC,\n\t30561 - 19968: 0xE2B2,\n\t30563 - 19968: 0xD4BD,\n\t30566 - 19968: 0xD9CE,\n\t30571 - 19968: 0xF4E2,\n\t30585 - 19968: 0xD4A9,\n\t30590 - 19968: 0xCDC2,\n\t30591 - 19968: 0xE7DA,\n\t30603 - 19968: 0xF2D9,\n\t30609 - 19968: 0xD9AA,\n\t30622 - 19968: 0xD8BE,\n\t30629 - 19968: 0xDCAD,\n\t30636 - 19968: 0xE2EB,\n\t30637 - 19968: 0xD6FC,\n\t30640 - 19968: 0xCAF9,\n\t30643 - 19968: 0xD4DA,\n\t30651 - 19968: 0xF4D7,\n\t30652 - 19968: 0xCCA1,\n\t30655 - 19968: 0xCFBA,\n\t30679 - 19968: 0xF5B8,\n\t30683 - 19968: 0xD9C3,\n\t30684 - 19968: 0xD0E8,\n\t30690 - 19968: 0xE3C5,\n\t30691 - 19968: 0xEBF8,\n\t30693 - 19968: 0xF2B1,\n\t30697 - 19968: 0xCFBB,\n\t30701 - 19968: 0xD3AD,\n\t30702 - 19968: 0xE8E1,\n\t30703 - 19968: 0xCEEC,\n\t30707 - 19968: 0xE0B4,\n\t30722 - 19968: 0xDEE3,\n\t30738 - 19968: 0xDDF7,\n\t30757 - 19968: 0xF2B2,\n\t30758 - 19968: 0xF3F6,\n\t30759 - 19968: 0xF6DB,\n\t30764 - 19968: 0xD7FE,\n\t30770 - 19968: 0xF8DF,\n\t30772 - 19968: 0xF7F2,\n\t30789 - 19968: 0xD0A9,\n\t30799 - 19968: 0xE6DA,\n\t30813 - 19968: 0xF5A6,\n\t30827 - 19968: 0xD7BC,\n\t30828 - 19968: 0xCCE3,\n\t30831 - 19968: 0xE6DB,\n\t30844 - 19968: 0xDDDD,\n\t30849 - 19968: 0xD1B3,\n\t30855 - 19968: 0xEFED,\n\t30860 - 19968: 0xD6DE,\n\t30861 - 19968: 0xE4F4,\n\t30862 - 19968: 0xE1EF,\n\t30865 - 19968: 0xDDF8,\n\t30871 - 19968: 0xE8CF,\n\t30883 - 19968: 0xCAE5,\n\t30887 - 19968: 0xDCA1,\n\t30889 - 19968: 0xE0B5,\n\t30906 - 19968: 0xFCAC,\n\t30907 - 19968: 0xFCAD,\n\t30908 - 19968: 0xD8A7,\n\t30913 - 19968: 0xEDB8,\n\t30917 - 19968: 0xDBB6,\n\t30922 - 19968: 0xD6F0,\n\t30923 - 19968: 0xF3AF,\n\t30926 - 19968: 0xCDA5,\n\t30928 - 19968: 0xDAF1,\n\t30952 - 19968: 0xD8A8,\n\t30956 - 19968: 0xCCE4,\n\t30959 - 19968: 0xD1B4,\n\t30965 - 19968: 0xCAD8,\n\t30971 - 19968: 0xDAF2,\n\t30977 - 19968: 0xF5A7,\n\t30990 - 19968: 0xF5A8,\n\t30998 - 19968: 0xE6A6,\n\t31018 - 19968: 0xD5EC,\n\t31019 - 19968: 0xD5F8,\n\t31020 - 19968: 0xDAF3,\n\t31034 - 19968: 0xE3C6,\n\t31038 - 19968: 0xDEE4,\n\t31040 - 19968: 0xDEE5,\n\t31041 - 19968: 0xD1B5,\n\t31047 - 19968: 0xD1B6,\n\t31048 - 19968: 0xD1B7,\n\t31049 - 19968: 0xF2B3,\n\t31056 - 19968: 0xE9DE,\n\t31062 - 19968: 0xF0D3,\n\t31063 - 19968: 0xF2B4,\n\t31066 - 19968: 0xF0D4,\n\t31067 - 19968: 0xCBE4,\n\t31068 - 19968: 0xFBD4,\n\t31069 - 19968: 0xF5E6,\n\t31070 - 19968: 0xE3EA,\n\t31072 - 19968: 0xDEE6,\n\t31077 - 19968: 0xDFD4,\n\t31080 - 19968: 0xF8F9,\n\t31085 - 19968: 0xF0AE,\n\t31098 - 19968: 0xD1B8,\n\t31103 - 19968: 0xD6DF,\n\t31105 - 19968: 0xD0D7,\n\t31117 - 19968: 0xFCA1,\n\t31118 - 19968: 0xEFEE,\n\t31119 - 19968: 0xDCD8,\n\t31121 - 19968: 0xE9DF,\n\t31142 - 19968: 0xE5DD,\n\t31143 - 19968: 0xFDFB,\n\t31146 - 19968: 0xE0C9,\n\t31150 - 19968: 0xD6C9,\n\t31153 - 19968: 0xD4AA,\n\t31155 - 19968: 0xE5CC,\n\t31161 - 19968: 0xE9E0,\n\t31165 - 19968: 0xD0D8,\n\t31166 - 19968: 0xFCA2,\n\t31167 - 19968: 0xD4BE,\n\t31168 - 19968: 0xE2B3,\n\t31169 - 19968: 0xDEE7,\n\t31177 - 19968: 0xDCBC,\n\t31178 - 19968: 0xD2B6,\n\t31179 - 19968: 0xF5D5,\n\t31185 - 19968: 0xCEA1,\n\t31186 - 19968: 0xF5A9,\n\t31189 - 19968: 0xDDF9,\n\t31192 - 19968: 0xDDFA,\n\t31199 - 19968: 0xF0D5,\n\t31204 - 19968: 0xF6DF,\n\t31206 - 19968: 0xF2DA,\n\t31207 - 19968: 0xE4EB,\n\t31209 - 19968: 0xF2F1,\n\t31227 - 19968: 0xECB9,\n\t31232 - 19968: 0xFDFC,\n\t31237 - 19968: 0xE1AA,\n\t31240 - 19968: 0xCAD9,\n\t31243 - 19968: 0xEFEF,\n\t31245 - 19968: 0xF5AA,\n\t31252 - 19968: 0xECF9,\n\t31255 - 19968: 0xF8AD,\n\t31257 - 19968: 0xF2C2,\n\t31258 - 19968: 0xF6C3,\n\t31260 - 19968: 0xD7D2,\n\t31263 - 19968: 0xF9A2,\n\t31264 - 19968: 0xF0D6,\n\t31278 - 19968: 0xF0FA,\n\t31281 - 19968: 0xF6E0,\n\t31286 - 19968: 0xE9F3,\n\t31287 - 19968: 0xF2C3,\n\t31291 - 19968: 0xD4AB,\n\t31292 - 19968: 0xCAB3,\n\t31293 - 19968: 0xCDA6,\n\t31295 - 19968: 0xCDC3,\n\t31296 - 19968: 0xCDDA,\n\t31302 - 19968: 0xD9CF,\n\t31305 - 19968: 0xF6C4,\n\t31309 - 19968: 0xEEDD,\n\t31310 - 19968: 0xE7C4,\n\t31319 - 19968: 0xE2B4,\n\t31329 - 19968: 0xDFE2,\n\t31330 - 19968: 0xE7DB,\n\t31337 - 19968: 0xE8B1,\n\t31339 - 19968: 0xFCAE,\n\t31344 - 19968: 0xE5CD,\n\t31348 - 19968: 0xFAEB,\n\t31350 - 19968: 0xCFBC,\n\t31353 - 19968: 0xCFE2,\n\t31354 - 19968: 0xCDF6,\n\t31357 - 19968: 0xEFF0,\n\t31359 - 19968: 0xF4BE,\n\t31361 - 19968: 0xD4CD,\n\t31364 - 19968: 0xF3B8,\n\t31368 - 19968: 0xE9A1,\n\t31378 - 19968: 0xF2F2,\n\t31379 - 19968: 0xF3EB,\n\t31381 - 19968: 0xF0D7,\n\t31384 - 19968: 0xCFD7,\n\t31391 - 19968: 0xCFDF,\n\t31401 - 19968: 0xE8C0,\n\t31402 - 19968: 0xE8C1,\n\t31406 - 19968: 0xCFE3,\n\t31407 - 19968: 0xE9A2,\n\t31418 - 19968: 0xD0AA,\n\t31428 - 19968: 0xF3C1,\n\t31429 - 19968: 0xD0AB,\n\t31431 - 19968: 0xD4E4,\n\t31434 - 19968: 0xEFBC,\n\t31435 - 19968: 0xD8A1,\n\t31447 - 19968: 0xD9DF,\n\t31449 - 19968: 0xF3D7,\n\t31453 - 19968: 0xDCBD,\n\t31455 - 19968: 0xCCE5,\n\t31456 - 19968: 0xEDF1,\n\t31459 - 19968: 0xF1E2,\n\t31461 - 19968: 0xD4DB,\n\t31466 - 19968: 0xE2B5,\n\t31469 - 19968: 0xCAE6,\n\t31471 - 19968: 0xD3AE,\n\t31478 - 19968: 0xCCE6,\n\t31481 - 19968: 0xF1D3,\n\t31482 - 19968: 0xF5E7,\n\t31487 - 19968: 0xCADA,\n\t31503 - 19968: 0xFBEE,\n\t31505 - 19968: 0xE1C5,\n\t31513 - 19968: 0xDFE9,\n\t31515 - 19968: 0xEEDE,\n\t31518 - 19968: 0xF7C2,\n\t31520 - 19968: 0xD8A2,\n\t31526 - 19968: 0xDDAC,\n\t31532 - 19968: 0xF0AF,\n\t31533 - 19968: 0xD6BD,\n\t31545 - 19968: 0xE1AB,\n\t31558 - 19968: 0xF9B6,\n\t31561 - 19968: 0xD4F5,\n\t31563 - 19968: 0xD0C9,\n\t31564 - 19968: 0xEFA7,\n\t31565 - 19968: 0xE2EC,\n\t31567 - 19968: 0xDBEA,\n\t31568 - 19968: 0xCECC,\n\t31569 - 19968: 0xF5E8,\n\t31570 - 19968: 0xF7D5,\n\t31572 - 19968: 0xD3CD,\n\t31574 - 19968: 0xF3FE,\n\t31584 - 19968: 0xD0B5,\n\t31596 - 19968: 0xE0FE,\n\t31598 - 19968: 0xDFFB,\n\t31605 - 19968: 0xE6DD,\n\t31613 - 19968: 0xE8A4,\n\t31623 - 19968: 0xCBCD,\n\t31627 - 19968: 0xEFA8,\n\t31631 - 19968: 0xEEB4,\n\t31636 - 19968: 0xDAD8,\n\t31637 - 19968: 0xD1B9,\n\t31639 - 19968: 0xDFA9,\n\t31642 - 19968: 0xF3B0,\n\t31645 - 19968: 0xCCC4,\n\t31649 - 19968: 0xCEB7,\n\t31661 - 19968: 0xEFA9,\n\t31665 - 19968: 0xDFD5,\n\t31668 - 19968: 0xEDD7,\n\t31672 - 19968: 0xEEC6,\n\t31680 - 19968: 0xEFBD,\n\t31681 - 19968: 0xFCD6,\n\t31684 - 19968: 0xDBF4,\n\t31686 - 19968: 0xEFAA,\n\t31687 - 19968: 0xF8B9,\n\t31689 - 19968: 0xF5E9,\n\t31698 - 19968: 0xE3D9,\n\t31712 - 19968: 0xE1C6,\n\t31716 - 19968: 0xD4BF,\n\t31721 - 19968: 0xDEE8,\n\t31751 - 19968: 0xF0EA,\n\t31762 - 19968: 0xF3C2,\n\t31774 - 19968: 0xD3AF,\n\t31777 - 19968: 0xCADB,\n\t31783 - 19968: 0xFCD7,\n\t31786 - 19968: 0xEDD8,\n\t31787 - 19968: 0xE1C7,\n\t31805 - 19968: 0xF4D8,\n\t31806 - 19968: 0xD6B3,\n\t31807 - 19968: 0xDDAD,\n\t31811 - 19968: 0xD5BE,\n\t31820 - 19968: 0xF1C3,\n\t31821 - 19968: 0xEEDF,\n\t31840 - 19968: 0xD6EB,\n\t31844 - 19968: 0xF4D9,\n\t31852 - 19968: 0xD7E6,\n\t31859 - 19968: 0xDAB7,\n\t31875 - 19968: 0xDDFB,\n\t31881 - 19968: 0xDDCF,\n\t31890 - 19968: 0xD8A3,\n\t31893 - 19968: 0xDAD9,\n\t31895 - 19968: 0xF0D8,\n\t31896 - 19968: 0xEFC4,\n\t31903 - 19968: 0xE1D8,\n\t31909 - 19968: 0xF1D4,\n\t31911 - 19968: 0xEDF2,\n\t31918 - 19968: 0xD5DB,\n\t31921 - 19968: 0xD5DC,\n\t31922 - 19968: 0xF3C4,\n\t31923 - 19968: 0xCBD7,\n\t31929 - 19968: 0xE2B6,\n\t31934 - 19968: 0xEFF1,\n\t31946 - 19968: 0xFBD5,\n\t31958 - 19968: 0xD3D8,\n\t31966 - 19968: 0xDDD0,\n\t31967 - 19968: 0xF0D9,\n\t31968 - 19968: 0xCBB3,\n\t31975 - 19968: 0xD5DD,\n\t31995 - 19968: 0xCDA7,\n\t31998 - 19968: 0xD0AC,\n\t32000 - 19968: 0xD1BA,\n\t32002 - 19968: 0xF1C4,\n\t32004 - 19968: 0xE5B3,\n\t32005 - 19968: 0xFBF5,\n\t32006 - 19968: 0xE9E1,\n\t32007 - 19968: 0xFDE0,\n\t32008 - 19968: 0xFCBC,\n\t32010 - 19968: 0xDAA2,\n\t32011 - 19968: 0xDAA3,\n\t32013 - 19968: 0xD2A1,\n\t32016 - 19968: 0xD2EF,\n\t32020 - 19968: 0xE2ED,\n\t32023 - 19968: 0xDEE9,\n\t32024 - 19968: 0xCEDC,\n\t32025 - 19968: 0xF2B5,\n\t32026 - 19968: 0xD0E4,\n\t32027 - 19968: 0xDDD1,\n\t32032 - 19968: 0xE1C8,\n\t32033 - 19968: 0xDBB7,\n\t32034 - 19968: 0xDFE3,\n\t32043 - 19968: 0xEDB9,\n\t32044 - 19968: 0xF1C5,\n\t32046 - 19968: 0xF3CF,\n\t32047 - 19968: 0xD7AB,\n\t32048 - 19968: 0xE1AC,\n\t32051 - 19968: 0xE3EB,\n\t32053 - 19968: 0xEEC7,\n\t32057 - 19968: 0xE1C9,\n\t32058 - 19968: 0xCAFA,\n\t32066 - 19968: 0xF0FB,\n\t32067 - 19968: 0xFAE1,\n\t32068 - 19968: 0xF0DA,\n\t32069 - 19968: 0xCCE7,\n\t32070 - 19968: 0xDAF4,\n\t32080 - 19968: 0xCCBF,\n\t32094 - 19968: 0xCEED,\n\t32097 - 19968: 0xD5A9,\n\t32098 - 19968: 0xFAE2,\n\t32102 - 19968: 0xD0E5,\n\t32104 - 19968: 0xEBD6,\n\t32106 - 19968: 0xECDF,\n\t32110 - 19968: 0xDFFC,\n\t32113 - 19968: 0xF7D6,\n\t32114 - 19968: 0xDEEA,\n\t32115 - 19968: 0xCBB4,\n\t32118 - 19968: 0xEFBE,\n\t32121 - 19968: 0xCCB5,\n\t32127 - 19968: 0xCFBD,\n\t32142 - 19968: 0xEFF2,\n\t32143 - 19968: 0xE2B7,\n\t32147 - 19968: 0xCCE8,\n\t32156 - 19968: 0xF0FC,\n\t32160 - 19968: 0xD6E0,\n\t32162 - 19968: 0xF1C6,\n\t32172 - 19968: 0xE2B8,\n\t32173 - 19968: 0xEBAB,\n\t32177 - 19968: 0xCBB5,\n\t32178 - 19968: 0xD8D1,\n\t32180 - 19968: 0xF4CE,\n\t32181 - 19968: 0xF3F7,\n\t32184 - 19968: 0xD7C6,\n\t32186 - 19968: 0xD1BB,\n\t32187 - 19968: 0xF7AA,\n\t32189 - 19968: 0xEDCA,\n\t32190 - 19968: 0xD7D3,\n\t32191 - 19968: 0xD8FA,\n\t32199 - 19968: 0xF6C5,\n\t32202 - 19968: 0xD1CC,\n\t32203 - 19968: 0xDDFC,\n\t32214 - 19968: 0xDFFD,\n\t32216 - 19968: 0xF9E5,\n\t32218 - 19968: 0xE0CA,\n\t32221 - 19968: 0xF2FD,\n\t32222 - 19968: 0xD3B0,\n\t32224 - 19968: 0xF4F3,\n\t32225 - 19968: 0xDAC9,\n\t32227 - 19968: 0xE6DE,\n\t32232 - 19968: 0xF8BA,\n\t32233 - 19968: 0xE8D0,\n\t32236 - 19968: 0xD8FB,\n\t32239 - 19968: 0xEAD5,\n\t32244 - 19968: 0xD6A3,\n\t32251 - 19968: 0xF6C6,\n\t32265 - 19968: 0xF2DB,\n\t32266 - 19968: 0xE4FC,\n\t32277 - 19968: 0xE8B2,\n\t32283 - 19968: 0xDADA,\n\t32285 - 19968: 0xF2DC,\n\t32286 - 19968: 0xFBD6,\n\t32287 - 19968: 0xE9B2,\n\t32289 - 19968: 0xEEAD,\n\t32291 - 19968: 0xFAE3,\n\t32299 - 19968: 0xDCEE,\n\t32302 - 19968: 0xF5EA,\n\t32303 - 19968: 0xE6E0,\n\t32305 - 19968: 0xF0FD,\n\t32311 - 19968: 0xD7AC,\n\t32317 - 19968: 0xF5C5,\n\t32318 - 19968: 0xEEE0,\n\t32321 - 19968: 0xDBE5,\n\t32323 - 19968: 0xDDDE,\n\t32326 - 19968: 0xD9F0,\n\t32327 - 19968: 0xE9A3,\n\t32338 - 19968: 0xF1F9,\n\t32340 - 19968: 0xF2C4,\n\t32341 - 19968: 0xE0CB,\n\t32350 - 19968: 0xE9A4,\n\t32353 - 19968: 0xE2B9,\n\t32361 - 19968: 0xE3B1,\n\t32362 - 19968: 0xFCEB,\n\t32363 - 19968: 0xCDA8,\n\t32365 - 19968: 0xCCB6,\n\t32368 - 19968: 0xF0DB,\n\t32377 - 19968: 0xE6BA,\n\t32380 - 19968: 0xCDA9,\n\t32386 - 19968: 0xF3C3,\n\t32396 - 19968: 0xE1D9,\n\t32399 - 19968: 0xEFAB,\n\t32403 - 19968: 0xE7C5,\n\t32406 - 19968: 0xE0E9,\n\t32408 - 19968: 0xF3C5,\n\t32411 - 19968: 0xD4C0,\n\t32412 - 19968: 0xD5BF,\n\t32566 - 19968: 0xDDAE,\n\t32568 - 19968: 0xF9FC,\n\t32570 - 19968: 0xCCC0,\n\t32588 - 19968: 0xE5A2,\n\t32592 - 19968: 0xCEB8,\n\t32596 - 19968: 0xD8D2,\n\t32597 - 19968: 0xF9D6,\n\t32618 - 19968: 0xF1AA,\n\t32619 - 19968: 0xCED1,\n\t32622 - 19968: 0xF6C7,\n\t32624 - 19968: 0xDBEB,\n\t32626 - 19968: 0xDFFE,\n\t32629 - 19968: 0xD8E1,\n\t32631 - 19968: 0xF7F3,\n\t32633 - 19968: 0xD7E7,\n\t32645 - 19968: 0xD4FE,\n\t32648 - 19968: 0xD1BC,\n\t32650 - 19968: 0xE5CF,\n\t32652 - 19968: 0xCBB6,\n\t32654 - 19968: 0xDAB8,\n\t32660 - 19968: 0xCDC4,\n\t32666 - 19968: 0xD6BE,\n\t32670 - 19968: 0xE2BA,\n\t32676 - 19968: 0xCFD8,\n\t32680 - 19968: 0xE0CC,\n\t32681 - 19968: 0xEBF9,\n\t32690 - 19968: 0xFDFD,\n\t32696 - 19968: 0xD7E8,\n\t32697 - 19968: 0xCBD8,\n\t32701 - 19968: 0xE9E2,\n\t32705 - 19968: 0xE8BA,\n\t32709 - 19968: 0xE3C7,\n\t32714 - 19968: 0xECCD,\n\t32716 - 19968: 0xECCE,\n\t32718 - 19968: 0xD6BF,\n\t32722 - 19968: 0xE3A7,\n\t32724 - 19968: 0xDFD6,\n\t32725 - 19968: 0xFDE8,\n\t32735 - 19968: 0xEEE1,\n\t32736 - 19968: 0xF6A8,\n\t32737 - 19968: 0xDDFD,\n\t32745 - 19968: 0xF8BB,\n\t32747 - 19968: 0xE8D1,\n\t32752 - 19968: 0xF9D7,\n\t32761 - 19968: 0xCEEE,\n\t32764 - 19968: 0xECCF,\n\t32768 - 19968: 0xE9A5,\n\t32769 - 19968: 0xD6D5,\n\t32771 - 19968: 0xCDC5,\n\t32773 - 19968: 0xEDBA,\n\t32774 - 19968: 0xD1BD,\n\t32777 - 19968: 0xCFBE,\n\t32780 - 19968: 0xECBB,\n\t32784 - 19968: 0xD2B1,\n\t32789 - 19968: 0xCCE9,\n\t32791 - 19968: 0xD9C4,\n\t32792 - 19968: 0xE9FC,\n\t32813 - 19968: 0xD1BE,\n\t32819 - 19968: 0xECBC,\n\t32822 - 19968: 0xE5AD,\n\t32829 - 19968: 0xF7B0,\n\t32831 - 19968: 0xCCEA,\n\t32835 - 19968: 0xD3C4,\n\t32838 - 19968: 0xD6C0,\n\t32842 - 19968: 0xD6FD,\n\t32854 - 19968: 0xE1A1,\n\t32856 - 19968: 0xDEBD,\n\t32858 - 19968: 0xF6A9,\n\t32862 - 19968: 0xDAA4,\n\t32879 - 19968: 0xD6A4,\n\t32880 - 19968: 0xF5C6,\n\t32882 - 19968: 0xE1A2,\n\t32883 - 19968: 0xE9C6,\n\t32887 - 19968: 0xF2C5,\n\t32893 - 19968: 0xF4E9,\n\t32894 - 19968: 0xD6EC,\n\t32895 - 19968: 0xEBD3,\n\t32900 - 19968: 0xECBD,\n\t32901 - 19968: 0xE2DC,\n\t32902 - 19968: 0xDEEB,\n\t32903 - 19968: 0xF0DC,\n\t32905 - 19968: 0xEBBF,\n\t32907 - 19968: 0xD7CE,\n\t32908 - 19968: 0xD1BF,\n\t32918 - 19968: 0xF5AB,\n\t32923 - 19968: 0xF9FD,\n\t32925 - 19968: 0xCADC,\n\t32929 - 19968: 0xCDC6,\n\t32930 - 19968: 0xF2B6,\n\t32933 - 19968: 0xDDFE,\n\t32937 - 19968: 0xCCB7,\n\t32938 - 19968: 0xDBB8,\n\t32943 - 19968: 0xD0E9,\n\t32945 - 19968: 0xCEDD,\n\t32946 - 19968: 0xEBC0,\n\t32948 - 19968: 0xFDA2,\n\t32954 - 19968: 0xF8CB,\n\t32963 - 19968: 0xEAD6,\n\t32964 - 19968: 0xF1B0,\n\t32972 - 19968: 0xDBCE,\n\t32974 - 19968: 0xF7C3,\n\t32986 - 19968: 0xDBCF,\n\t32987 - 19968: 0xCBA4,\n\t32990 - 19968: 0xF8E0,\n\t32993 - 19968: 0xFBD7,\n\t32996 - 19968: 0xEBCA,\n\t32997 - 19968: 0xE0A1,\n\t33009 - 19968: 0xCECD,\n\t33012 - 19968: 0xD4DC,\n\t33016 - 19968: 0xFDD8,\n\t33021 - 19968: 0xD2F6,\n\t33026 - 19968: 0xF2B7,\n\t33029 - 19968: 0xFAF6,\n\t33030 - 19968: 0xF6AA,\n\t33031 - 19968: 0xFAF7,\n\t33032 - 19968: 0xD8E6,\n\t33034 - 19968: 0xF4B1,\n\t33048 - 19968: 0xE8D2,\n\t33050 - 19968: 0xCAC5,\n\t33051 - 19968: 0xCCEB,\n\t33059 - 19968: 0xE2EE,\n\t33065 - 19968: 0xE2BB,\n\t33067 - 19968: 0xF7AD,\n\t33071 - 19968: 0xF8E1,\n\t33081 - 19968: 0xF3EC,\n\t33086 - 19968: 0xDEA1,\n\t33099 - 19968: 0xE4FD,\n\t33102 - 19968: 0xE3EC,\n\t33104 - 19968: 0xDDAF,\n\t33105 - 19968: 0xDDB0,\n\t33108 - 19968: 0xCBB7,\n\t33109 - 19968: 0xE8D3,\n\t33125 - 19968: 0xE1A3,\n\t33126 - 19968: 0xD2E0,\n\t33131 - 19968: 0xF0FE,\n\t33136 - 19968: 0xE9A6,\n\t33137 - 19968: 0xCBF2,\n\t33144 - 19968: 0xEDF3,\n\t33145 - 19968: 0xDCD9,\n\t33146 - 19968: 0xE0CD,\n\t33151 - 19968: 0xF7DA,\n\t33152 - 19968: 0xDBB9,\n\t33160 - 19968: 0xCCAE,\n\t33162 - 19968: 0xDADB,\n\t33167 - 19968: 0xCDC7,\n\t33178 - 19968: 0xDDB1,\n\t33180 - 19968: 0xD8AF,\n\t33181 - 19968: 0xE3A3,\n\t33184 - 19968: 0xCEEF,\n\t33187 - 19968: 0xF2F3,\n\t33192 - 19968: 0xF8B3,\n\t33203 - 19968: 0xE0CE,\n\t33205 - 19968: 0xF5FD,\n\t33210 - 19968: 0xEBEC,\n\t33213 - 19968: 0xD3C5,\n\t33214 - 19968: 0xFCEC,\n\t33215 - 19968: 0xD2DB,\n\t33216 - 19968: 0xD4EB,\n\t33218 - 19968: 0xDEA2,\n\t33222 - 19968: 0xE5E6,\n\t33229 - 19968: 0xF0B0,\n\t33240 - 19968: 0xD5C4,\n\t33247 - 19968: 0xEDF4,\n\t33251 - 19968: 0xE3ED,\n\t33253 - 19968: 0xE8C2,\n\t33255 - 19968: 0xEDF5,\n\t33256 - 19968: 0xD7FC,\n\t33258 - 19968: 0xEDBB,\n\t33261 - 19968: 0xF6AB,\n\t33267 - 19968: 0xF2B8,\n\t33268 - 19968: 0xF6C8,\n\t33274 - 19968: 0xD3E6,\n\t33275 - 19968: 0xF2DD,\n\t33276 - 19968: 0xCFBF,\n\t33278 - 19968: 0xEBAC,\n\t33285 - 19968: 0xCFC0,\n\t33287 - 19968: 0xE6A8,\n\t33288 - 19968: 0xFDE9,\n\t33290 - 19968: 0xCFC1,\n\t33292 - 19968: 0xE0DF,\n\t33293 - 19968: 0xDEEC,\n\t33298 - 19968: 0xE0A2,\n\t33307 - 19968: 0xF4BF,\n\t33308 - 19968: 0xE2EF,\n\t33310 - 19968: 0xD9F1,\n\t33311 - 19968: 0xF1C7,\n\t33313 - 19968: 0xCBB8,\n\t33322 - 19968: 0xF9FE,\n\t33323 - 19968: 0xDBBA,\n\t33324 - 19968: 0xDAF5,\n\t33333 - 19968: 0xF6EC,\n\t33334 - 19968: 0xDADC,\n\t33335 - 19968: 0xFAE4,\n\t33337 - 19968: 0xE0CF,\n\t33344 - 19968: 0xDDB2,\n\t33349 - 19968: 0xE6A9,\n\t33351 - 19968: 0xEFF3,\n\t33369 - 19968: 0xF3ED,\n\t33380 - 19968: 0xEBFA,\n\t33382 - 19968: 0xF9E6,\n\t33390 - 19968: 0xCADD,\n\t33391 - 19968: 0xD5DE,\n\t33393 - 19968: 0xCADE,\n\t33394 - 19968: 0xDFE4,\n\t33398 - 19968: 0xE6FD,\n\t33400 - 19968: 0xF5AC,\n\t33406 - 19968: 0xE4F5,\n\t33419 - 19968: 0xE9E3,\n\t33421 - 19968: 0xEDCB,\n\t33422 - 19968: 0xCFE4,\n\t33426 - 19968: 0xD8D3,\n\t33433 - 19968: 0xDDB3,\n\t33434 - 19968: 0xD4EC,\n\t33437 - 19968: 0xF2B9,\n\t33439 - 19968: 0xDFB7,\n\t33445 - 19968: 0xCBCE,\n\t33446 - 19968: 0xFBD8,\n\t33449 - 19968: 0xD0D9,\n\t33452 - 19968: 0xDDD2,\n\t33453 - 19968: 0xF7F4,\n\t33454 - 19968: 0xE7DC,\n\t33455 - 19968: 0xE4A5,\n\t33457 - 19968: 0xFCA3,\n\t33459 - 19968: 0xDBBB,\n\t33463 - 19968: 0xF2BA,\n\t33464 - 19968: 0xE9FD,\n\t33465 - 19968: 0xD0CA,\n\t33467 - 19968: 0xF5D6,\n\t33468 - 19968: 0xD9C5,\n\t33469 - 19968: 0xE4B4,\n\t33471 - 19968: 0xEDA7,\n\t33489 - 19968: 0xEABD,\n\t33490 - 19968: 0xE6FE,\n\t33492 - 19968: 0xF7C4,\n\t33493 - 19968: 0xF5AD,\n\t33495 - 19968: 0xD9E0,\n\t33499 - 19968: 0xCAB4,\n\t33502 - 19968: 0xF8E2,\n\t33503 - 19968: 0xCFC2,\n\t33505 - 19968: 0xECBE,\n\t33509 - 19968: 0xE5B4,\n\t33510 - 19968: 0xCDC8,\n\t33511 - 19968: 0xEEC8,\n\t33521 - 19968: 0xE7C8,\n\t33533 - 19968: 0xCDC9,\n\t33534 - 19968: 0xF9B7,\n\t33537 - 19968: 0xF1E8,\n\t33538 - 19968: 0xD9F2,\n\t33539 - 19968: 0xDBF5,\n\t33540 - 19968: 0xCAB5,\n\t33541 - 19968: 0xD9C6,\n\t33545 - 19968: 0xD8C9,\n\t33559 - 19968: 0xD9AB,\n\t33576 - 19968: 0xEDBC,\n\t33579 - 19968: 0xD8D4,\n\t33583 - 19968: 0xDCDA,\n\t33585 - 19968: 0xE2BC,\n\t33588 - 19968: 0xFCED,\n\t33589 - 19968: 0xECE0,\n\t33590 - 19968: 0xD2FE,\n\t33592 - 19968: 0xE9C7,\n\t33593 - 19968: 0xE6AA,\n\t33600 - 19968: 0xE2F0,\n\t33607 - 19968: 0xFABB,\n\t33609 - 19968: 0xF5AE,\n\t33610 - 19968: 0xFBAA,\n\t33615 - 19968: 0xECFB,\n\t33617 - 19968: 0xECBF,\n\t33618 - 19968: 0xFCD8,\n\t33651 - 19968: 0xD4E5,\n\t33655 - 19968: 0xF9C3,\n\t33659 - 19968: 0xEEE2,\n\t33673 - 19968: 0xD7E9,\n\t33674 - 19968: 0xEDF6,\n\t33678 - 19968: 0xDEED,\n\t33686 - 19968: 0xCCEC,\n\t33688 - 19968: 0xE3EE,\n\t33694 - 19968: 0xE8D4,\n\t33698 - 19968: 0xFAF8,\n\t33705 - 19968: 0xDDB4,\n\t33706 - 19968: 0xE4B5,\n\t33707 - 19968: 0xD8B0,\n\t33725 - 19968: 0xD8D5,\n\t33729 - 19968: 0xF4EA,\n\t33733 - 19968: 0xCEB9,\n\t33737 - 19968: 0xD6E1,\n\t33738 - 19968: 0xCFD2,\n\t33740 - 19968: 0xD0B6,\n\t33747 - 19968: 0xCEA2,\n\t33750 - 19968: 0xF3EE,\n\t33756 - 19968: 0xF3F8,\n\t33769 - 19968: 0xDCCC,\n\t33771 - 19968: 0xD0CB,\n\t33775 - 19968: 0xFCA4,\n\t33776 - 19968: 0xCDCA,\n\t33777 - 19968: 0xD7D4,\n\t33778 - 19968: 0xDEA3,\n\t33780 - 19968: 0xE4E0,\n\t33785 - 19968: 0xEEC9,\n\t33789 - 19968: 0xE2DD,\n\t33795 - 19968: 0xF5FE,\n\t33796 - 19968: 0xD4AC,\n\t33802 - 19968: 0xD5D1,\n\t33804 - 19968: 0xD8F0,\n\t33805 - 19968: 0xF8C3,\n\t33806 - 19968: 0xEAD7,\n\t33833 - 19968: 0xF5D7,\n\t33836 - 19968: 0xD8BF,\n\t33841 - 19968: 0xFDC0,\n\t33848 - 19968: 0xEBAD,\n\t33853 - 19968: 0xD5AA,\n\t33865 - 19968: 0xE7A8,\n\t33879 - 19968: 0xEECA,\n\t33883 - 19968: 0xCAE7,\n\t33889 - 19968: 0xF8E3,\n\t33891 - 19968: 0xD4DD,\n\t33894 - 19968: 0xEAD8,\n\t33899 - 19968: 0xFBD9,\n\t33900 - 19968: 0xEDF7,\n\t33903 - 19968: 0xE5B5,\n\t33909 - 19968: 0xD0AD,\n\t33914 - 19968: 0xF1F1,\n\t33936 - 19968: 0xE2BD,\n\t33940 - 19968: 0xE3C8,\n\t33945 - 19968: 0xD9D5,\n\t33948 - 19968: 0xDFAA,\n\t33953 - 19968: 0xDBBC,\n\t33970 - 19968: 0xF8E4,\n\t33976 - 19968: 0xF1FA,\n\t33979 - 19968: 0xE5B6,\n\t33980 - 19968: 0xF3EF,\n\t33983 - 19968: 0xFBDA,\n\t33984 - 19968: 0xE1E0,\n\t33986 - 19968: 0xD9AC,\n\t33988 - 19968: 0xF5EB,\n\t33990 - 19968: 0xE0B6,\n\t33993 - 19968: 0xE9C8,\n\t33995 - 19968: 0xCBCF,\n\t33997 - 19968: 0xE3C9,\n\t34001 - 19968: 0xDEEE,\n\t34010 - 19968: 0xE2BE,\n\t34028 - 19968: 0xDCEF,\n\t34030 - 19968: 0xD6A5,\n\t34036 - 19968: 0xE2F1,\n\t34044 - 19968: 0xD6FE,\n\t34065 - 19968: 0xD9A1,\n\t34067 - 19968: 0xD8C0,\n\t34068 - 19968: 0xDCDB,\n\t34071 - 19968: 0xEDBD,\n\t34072 - 19968: 0xDFB8,\n\t34074 - 19968: 0xEAA5,\n\t34078 - 19968: 0xD7AD,\n\t34081 - 19968: 0xF3F9,\n\t34083 - 19968: 0xEDF8,\n\t34085 - 19968: 0xF5C7,\n\t34092 - 19968: 0xE1CA,\n\t34093 - 19968: 0xEBE3,\n\t34095 - 19968: 0xF2DE,\n\t34109 - 19968: 0xF8CC,\n\t34111 - 19968: 0xEAD9,\n\t34113 - 19968: 0xD3C6,\n\t34115 - 19968: 0xDBE6,\n\t34121 - 19968: 0xF5AF,\n\t34126 - 19968: 0xCEF0,\n\t34131 - 19968: 0xE9FE,\n\t34137 - 19968: 0xFBB6,\n\t34147 - 19968: 0xE2F2,\n\t34152 - 19968: 0xCFF2,\n\t34153 - 19968: 0xF7B9,\n\t34154 - 19968: 0xD9F3,\n\t34157 - 19968: 0xE1CB,\n\t34180 - 19968: 0xDADD,\n\t34183 - 19968: 0xDAB9,\n\t34191 - 19968: 0xEBFB,\n\t34193 - 19968: 0xCBB9,\n\t34196 - 19968: 0xEDF9,\n\t34203 - 19968: 0xE0E0,\n\t34214 - 19968: 0xF4C0,\n\t34216 - 19968: 0xFDBC,\n\t34217 - 19968: 0xDFB1,\n\t34218 - 19968: 0xE3EF,\n\t34223 - 19968: 0xE0A3,\n\t34224 - 19968: 0xFDB9,\n\t34234 - 19968: 0xF0B1,\n\t34241 - 19968: 0xCDCB,\n\t34249 - 19968: 0xEDBE,\n\t34253 - 19968: 0xD5C0,\n\t34254 - 19968: 0xE3F0,\n\t34255 - 19968: 0xEDFA,\n\t34261 - 19968: 0xE9E4,\n\t34268 - 19968: 0xD5ED,\n\t34269 - 19968: 0xE7DD,\n\t34276 - 19968: 0xD4F6,\n\t34277 - 19968: 0xE5B7,\n\t34281 - 19968: 0xDBE7,\n\t34282 - 19968: 0xE2BF,\n\t34295 - 19968: 0xEECB,\n\t34298 - 19968: 0xD7F4,\n\t34299 - 19968: 0xF0DD,\n\t34303 - 19968: 0xCEAB,\n\t34306 - 19968: 0xE7DE,\n\t34310 - 19968: 0xD6D6,\n\t34311 - 19968: 0xE1CC,\n\t34314 - 19968: 0xE8B3,\n\t34326 - 19968: 0xE5EE,\n\t34327 - 19968: 0xDCA2,\n\t34330 - 19968: 0xE0D0,\n\t34349 - 19968: 0xD5B5,\n\t34367 - 19968: 0xD5A1,\n\t34382 - 19968: 0xFBDB,\n\t34384 - 19968: 0xF9CB,\n\t34388 - 19968: 0xCBF3,\n\t34389 - 19968: 0xF4A5,\n\t34395 - 19968: 0xFAC8,\n\t34396 - 19968: 0xD6D7,\n\t34398 - 19968: 0xE9E5,\n\t34399 - 19968: 0xFBDC,\n\t34407 - 19968: 0xFDD0,\n\t34425 - 19968: 0xFBF6,\n\t34442 - 19968: 0xDAA5,\n\t34444 - 19968: 0xDBBD,\n\t34451 - 19968: 0xECE2,\n\t34467 - 19968: 0xCDF7,\n\t34468 - 19968: 0xF0DE,\n\t34473 - 19968: 0xF6C9,\n\t34503 - 19968: 0xDEEF,\n\t34507 - 19968: 0xD3B1,\n\t34516 - 19968: 0xFCEE,\n\t34521 - 19968: 0xE8C3,\n\t34523 - 19968: 0xF1C8,\n\t34527 - 19968: 0xCEF1,\n\t34532 - 19968: 0xF9ED,\n\t34541 - 19968: 0xF2F4,\n\t34558 - 19968: 0xE4B6,\n\t34560 - 19968: 0xF5B9,\n\t34562 - 19968: 0xDCF0,\n\t34563 - 19968: 0xE3F1,\n\t34568 - 19968: 0xE8A5,\n\t34584 - 19968: 0xF2BB,\n\t34586 - 19968: 0xDEA4,\n\t34588 - 19968: 0xDACC,\n\t34638 - 19968: 0xCAE9,\n\t34645 - 19968: 0xE3DA,\n\t34647 - 19968: 0xFCD9,\n\t34655 - 19968: 0xEADA,\n\t34662 - 19968: 0xF9C4,\n\t34664 - 19968: 0xE3A4,\n\t34676 - 19968: 0xFBDD,\n\t34678 - 19968: 0xEFCA,\n\t34680 - 19968: 0xE8C4,\n\t34690 - 19968: 0xD5CC,\n\t34701 - 19968: 0xEBD7,\n\t34719 - 19968: 0xD9AD,\n\t34722 - 19968: 0xFBAB,\n\t34739 - 19968: 0xD3D9,\n\t34746 - 19968: 0xD5A2,\n\t34756 - 19968: 0xF6DE,\n\t34784 - 19968: 0xDAF6,\n\t34796 - 19968: 0xE0D1,\n\t34799 - 19968: 0xE9A8,\n\t34802 - 19968: 0xF5F9,\n\t34809 - 19968: 0xFAAF,\n\t34811 - 19968: 0xEBFC,\n\t34814 - 19968: 0xE0EA,\n\t34821 - 19968: 0xE3B2,\n\t34847 - 19968: 0xD5C5,\n\t34850 - 19968: 0xF1E3,\n\t34851 - 19968: 0xD5EE,\n\t34865 - 19968: 0xCDCC,\n\t34870 - 19968: 0xEDD9,\n\t34875 - 19968: 0xD8C1,\n\t34880 - 19968: 0xFAEC,\n\t34886 - 19968: 0xF1EB,\n\t34892 - 19968: 0xFABC,\n\t34893 - 19968: 0xE6E2,\n\t34898 - 19968: 0xFAE5,\n\t34899 - 19968: 0xE2FA,\n\t34903 - 19968: 0xCAB6,\n\t34905 - 19968: 0xE4B7,\n\t34907 - 19968: 0xEADB,\n\t34909 - 19968: 0xF5FA,\n\t34913 - 19968: 0xFBAC,\n\t34914 - 19968: 0xCFC3,\n\t34915 - 19968: 0xEBFD,\n\t34920 - 19968: 0xF8FA,\n\t34923 - 19968: 0xDFB9,\n\t34928 - 19968: 0xE1F1,\n\t34930 - 19968: 0xD2A4,\n\t34935 - 19968: 0xF5FB,\n\t34942 - 19968: 0xD0DA,\n\t34943 - 19968: 0xD0DB,\n\t34945 - 19968: 0xEABE,\n\t34946 - 19968: 0xD9B1,\n\t34952 - 19968: 0xCAB7,\n\t34955 - 19968: 0xD3E7,\n\t34957 - 19968: 0xF8E5,\n\t34962 - 19968: 0xD3B2,\n\t34966 - 19968: 0xE2C0,\n\t34967 - 19968: 0xF2DF,\n\t34974 - 19968: 0xCDE5,\n\t34987 - 19968: 0xF9AC,\n\t34996 - 19968: 0xCDCD,\n\t35009 - 19968: 0xEEAE,\n\t35010 - 19968: 0xD6AE,\n\t35023 - 19968: 0xD7EA,\n\t35028 - 19968: 0xE7E0,\n\t35029 - 19968: 0xEBAE,\n\t35033 - 19968: 0xCFD9,\n\t35036 - 19968: 0xDCCD,\n\t35037 - 19968: 0xEDFB,\n\t35039 - 19968: 0xDEF0,\n\t35041 - 19968: 0xD7EB,\n\t35048 - 19968: 0xDEA5,\n\t35059 - 19968: 0xDFD7,\n\t35060 - 19968: 0xDBD0,\n\t35061 - 19968: 0xDBD1,\n\t35064 - 19968: 0xD5A3,\n\t35069 - 19968: 0xF0B2,\n\t35079 - 19968: 0xDCDC,\n\t35088 - 19968: 0xCAE8,\n\t35090 - 19968: 0xF8E6,\n\t35091 - 19968: 0xDCCE,\n\t35096 - 19968: 0xEADC,\n\t35097 - 19968: 0xDBD2,\n\t35109 - 19968: 0xE9B3,\n\t35114 - 19968: 0xF7DB,\n\t35126 - 19968: 0xE3A8,\n\t35128 - 19968: 0xD7AE,\n\t35131 - 19968: 0xE0E1,\n\t35137 - 19968: 0xCBBA,\n\t35140 - 19968: 0xE5D1,\n\t35167 - 19968: 0xD0DC,\n\t35172 - 19968: 0xD5C1,\n\t35178 - 19968: 0xD8CA,\n\t35186 - 19968: 0xE3A9,\n\t35199 - 19968: 0xE0A4,\n\t35201 - 19968: 0xE9A9,\n\t35203 - 19968: 0xD3C7,\n\t35206 - 19968: 0xDCDD,\n\t35207 - 19968: 0xF8AE,\n\t35211 - 19968: 0xCCB8,\n\t35215 - 19968: 0xD0AE,\n\t35219 - 19968: 0xD8F2,\n\t35222 - 19968: 0xE3CA,\n\t35233 - 19968: 0xCCAF,\n\t35241 - 19968: 0xD4AD,\n\t35242 - 19968: 0xF6D1,\n\t35250 - 19968: 0xD0CC,\n\t35258 - 19968: 0xCAC6,\n\t35261 - 19968: 0xD5C2,\n\t35264 - 19968: 0xCEBA,\n\t35282 - 19968: 0xCAC7,\n\t35299 - 19968: 0xFAB0,\n\t35316 - 19968: 0xDFD8,\n\t35320 - 19968: 0xF5BA,\n\t35328 - 19968: 0xE5EB,\n\t35330 - 19968: 0xEFF4,\n\t35331 - 19968: 0xDDB5,\n\t35336 - 19968: 0xCDAA,\n\t35338 - 19968: 0xE3F2,\n\t35340 - 19968: 0xFBF7,\n\t35342 - 19968: 0xF7D0,\n\t35347 - 19968: 0xFDBA,\n\t35350 - 19968: 0xFDE1,\n\t35351 - 19968: 0xF6FE,\n\t35352 - 19968: 0xD1C0,\n\t35355 - 19968: 0xE8C5,\n\t35357 - 19968: 0xE4B8,\n\t35359 - 19968: 0xE1E8,\n\t35363 - 19968: 0xCCC1,\n\t35365 - 19968: 0xD2ED,\n\t35370 - 19968: 0xDBBE,\n\t35373 - 19968: 0xE0E2,\n\t35377 - 19968: 0xFAC9,\n\t35380 - 19968: 0xE1CD,\n\t35382 - 19968: 0xCAB8,\n\t35386 - 19968: 0xF2E0,\n\t35387 - 19968: 0xF1C9,\n\t35408 - 19968: 0xDEF1,\n\t35412 - 19968: 0xF0DF,\n\t35413 - 19968: 0xF8C4,\n\t35419 - 19968: 0xEECC,\n\t35422 - 19968: 0xDEF2,\n\t35424 - 19968: 0xE7C9,\n\t35426 - 19968: 0xE2F3,\n\t35427 - 19968: 0xE7E1,\n\t35430 - 19968: 0xE3CB,\n\t35433 - 19968: 0xE3CC,\n\t35437 - 19968: 0xCFF8,\n\t35438 - 19968: 0xEFAC,\n\t35440 - 19968: 0xFDFE,\n\t35441 - 19968: 0xFCA5,\n\t35442 - 19968: 0xFAB1,\n\t35443 - 19968: 0xDFD9,\n\t35445 - 19968: 0xE0D2,\n\t35449 - 19968: 0xF4DA,\n\t35461 - 19968: 0xF1CA,\n\t35463 - 19968: 0xCEA3,\n\t35468 - 19968: 0xF2BC,\n\t35469 - 19968: 0xECE3,\n\t35475 - 19968: 0xE0A5,\n\t35477 - 19968: 0xF7AB,\n\t35480 - 19968: 0xEBAF,\n\t35486 - 19968: 0xE5DE,\n\t35488 - 19968: 0xE1A4,\n\t35489 - 19968: 0xCDAB,\n\t35491 - 19968: 0xD9F4,\n\t35492 - 19968: 0xE8A6,\n\t35493 - 19968: 0xCDCE,\n\t35494 - 19968: 0xE1E9,\n\t35496 - 19968: 0xFCEF,\n\t35498 - 19968: 0xE0E3,\n\t35504 - 19968: 0xE2C1,\n\t35506 - 19968: 0xCEA4,\n\t35513 - 19968: 0xDEA6,\n\t35516 - 19968: 0xEBFE,\n\t35518 - 19968: 0xEBDD,\n\t35519 - 19968: 0xF0E0,\n\t35522 - 19968: 0xF4DB,\n\t35524 - 19968: 0xE2F4,\n\t35527 - 19968: 0xD3C8,\n\t35531 - 19968: 0xF4EB,\n\t35533 - 19968: 0xEEB5,\n\t35535 - 19968: 0xF5D8,\n\t35538 - 19968: 0xD5DF,\n\t35542 - 19968: 0xD6E5,\n\t35547 - 19968: 0xEBB0,\n\t35548 - 19968: 0xF4E3,\n\t35553 - 19968: 0xE3CD,\n\t35558 - 19968: 0xF4F4,\n\t35559 - 19968: 0xFAB2,\n\t35562 - 19968: 0xEFF5,\n\t35563 - 19968: 0xCADF,\n\t35565 - 19968: 0xEBB1,\n\t35566 - 19968: 0xEDBF,\n\t35569 - 19968: 0xFDC9,\n\t35574 - 19968: 0xE4A6,\n\t35575 - 19968: 0xF9A4,\n\t35576 - 19968: 0xF0B3,\n\t35578 - 19968: 0xE5EC,\n\t35582 - 19968: 0xD1E7,\n\t35584 - 19968: 0xD9C7,\n\t35585 - 19968: 0xE4D7,\n\t35586 - 19968: 0xEADD,\n\t35588 - 19968: 0xD4F7,\n\t35598 - 19968: 0xDABA,\n\t35600 - 19968: 0xDACD,\n\t35604 - 19968: 0xF9CC,\n\t35606 - 19968: 0xE1DA,\n\t35607 - 19968: 0xDBBF,\n\t35609 - 19968: 0xCCC5,\n\t35610 - 19968: 0xECD0,\n\t35611 - 19968: 0xCBBB,\n\t35613 - 19968: 0xDEF3,\n\t35616 - 19968: 0xE9AA,\n\t35624 - 19968: 0xD9C8,\n\t35627 - 19968: 0xEEE3,\n\t35628 - 19968: 0xD7BD,\n\t35635 - 19968: 0xCFC4,\n\t35641 - 19968: 0xD0CD,\n\t35649 - 19968: 0xFCA6,\n\t35657 - 19968: 0xF1FB,\n\t35662 - 19968: 0xFDD2,\n\t35663 - 19968: 0xD1C1,\n\t35672 - 19968: 0xE3DB,\n\t35674 - 19968: 0xD3C9,\n\t35676 - 19968: 0xDCCF,\n\t35686 - 19968: 0xCCED,\n\t35692 - 19968: 0xDEA7,\n\t35695 - 19968: 0xE6BB,\n\t35696 - 19968: 0xECA1,\n\t35700 - 19968: 0xCCB9,\n\t35703 - 19968: 0xFBDE,\n\t35709 - 19968: 0xE7E2,\n\t35712 - 19968: 0xD4C1,\n\t35722 - 19968: 0xDCA8,\n\t35728 - 19968: 0xE2C2,\n\t35730 - 19968: 0xF3D8,\n\t35731 - 19968: 0xE5D3,\n\t35734 - 19968: 0xF3D9,\n\t35738 - 19968: 0xF3C6,\n\t35895 - 19968: 0xCDDB,\n\t35903 - 19968: 0xCDAC,\n\t35905 - 19968: 0xFCC3,\n\t35910 - 19968: 0xD4E7,\n\t35912 - 19968: 0xD1C2,\n\t35914 - 19968: 0xF9A5,\n\t35916 - 19968: 0xE8D5,\n\t35925 - 19968: 0xE3CE,\n\t35930 - 19968: 0xD4CA,\n\t35937 - 19968: 0xDFDA,\n\t35946 - 19968: 0xFBDF,\n\t35947 - 19968: 0xE7E3,\n\t35961 - 19968: 0xF8FB,\n\t35962 - 19968: 0xE3CF,\n\t35970 - 19968: 0xF5B0,\n\t35978 - 19968: 0xD8E7,\n\t35980 - 19968: 0xD9C9,\n\t35997 - 19968: 0xF8AF,\n\t35998 - 19968: 0xEFF6,\n\t36000 - 19968: 0xDDB6,\n\t36001 - 19968: 0xEEAF,\n\t36002 - 19968: 0xCDF8,\n\t36007 - 19968: 0xDEB8,\n\t36008 - 19968: 0xFCA7,\n\t36009 - 19968: 0xF7FC,\n\t36010 - 19968: 0xF7B1,\n\t36011 - 19968: 0xCEBB,\n\t36012 - 19968: 0xF4A1,\n\t36015 - 19968: 0xEECD,\n\t36016 - 19968: 0xE1AE,\n\t36019 - 19968: 0xECC3,\n\t36020 - 19968: 0xCFFE,\n\t36022 - 19968: 0xF8BF,\n\t36023 - 19968: 0xD8E2,\n\t36024 - 19968: 0xD3E8,\n\t36027 - 19968: 0xDEA8,\n\t36028 - 19968: 0xF4E4,\n\t36029 - 19968: 0xECC2,\n\t36031 - 19968: 0xD9F5,\n\t36032 - 19968: 0xF9C5,\n\t36033 - 19968: 0xDDD3,\n\t36034 - 19968: 0xD6F1,\n\t36035 - 19968: 0xECFC,\n\t36036 - 19968: 0xFCF0,\n\t36039 - 19968: 0xEDC0,\n\t36040 - 19968: 0xCAB9,\n\t36042 - 19968: 0xEEE4,\n\t36049 - 19968: 0xF2E1,\n\t36051 - 19968: 0xDEB9,\n\t36058 - 19968: 0xD6F2,\n\t36060 - 19968: 0xDEF4,\n\t36062 - 19968: 0xDFDB,\n\t36064 - 19968: 0xDBD3,\n\t36066 - 19968: 0xFAE7,\n\t36067 - 19968: 0xD8E3,\n\t36068 - 19968: 0xF4C1,\n\t36070 - 19968: 0xDDB7,\n\t36074 - 19968: 0xF2F5,\n\t36077 - 19968: 0xD4AE,\n\t36084 - 19968: 0xD6F3,\n\t36091 - 19968: 0xDDB8,\n\t36092 - 19968: 0xCFC5,\n\t36093 - 19968: 0xDFDF,\n\t36100 - 19968: 0xF2BE,\n\t36101 - 19968: 0xF6A1,\n\t36103 - 19968: 0xEBCB,\n\t36104 - 19968: 0xF1FC,\n\t36106 - 19968: 0xF3C7,\n\t36109 - 19968: 0xE0EB,\n\t36115 - 19968: 0xEDFC,\n\t36118 - 19968: 0xE1DB,\n\t36196 - 19968: 0xEEE5,\n\t36198 - 19968: 0xDEF5,\n\t36203 - 19968: 0xFAD3,\n\t36208 - 19968: 0xF1CB,\n\t36211 - 19968: 0xD0AF,\n\t36212 - 19968: 0xDDB9,\n\t36215 - 19968: 0xD1C3,\n\t36229 - 19968: 0xF5B1,\n\t36234 - 19968: 0xEAC6,\n\t36249 - 19968: 0xF0E1,\n\t36259 - 19968: 0xF6AC,\n\t36264 - 19968: 0xF5D9,\n\t36275 - 19968: 0xF0EB,\n\t36282 - 19968: 0xDDBA,\n\t36286 - 19968: 0xF2BF,\n\t36294 - 19968: 0xF7C5,\n\t36299 - 19968: 0xDBA2,\n\t36300 - 19968: 0xF2F6,\n\t36303 - 19968: 0xCABA,\n\t36315 - 19968: 0xF7F5,\n\t36317 - 19968: 0xCBE5,\n\t36321 - 19968: 0xEEE6,\n\t36323 - 19968: 0xE0D3,\n\t36328 - 19968: 0xCEA5,\n\t36335 - 19968: 0xD6D8,\n\t36339 - 19968: 0xD4AF,\n\t36362 - 19968: 0xE9C9,\n\t36367 - 19968: 0xD3CE,\n\t36368 - 19968: 0xF4C2,\n\t36382 - 19968: 0xCBE6,\n\t36394 - 19968: 0xF1A1,\n\t36400 - 19968: 0xEBB2,\n\t36405 - 19968: 0xF1A2,\n\t36418 - 19968: 0xEBB3,\n\t36420 - 19968: 0xF0B4,\n\t36423 - 19968: 0xCBF4,\n\t36424 - 19968: 0xD4B0,\n\t36425 - 19968: 0xF3B2,\n\t36426 - 19968: 0xFBB7,\n\t36441 - 19968: 0xF5EC,\n\t36447 - 19968: 0xEEE7,\n\t36448 - 19968: 0xF4B2,\n\t36468 - 19968: 0xF5ED,\n\t36470 - 19968: 0xCFF3,\n\t36481 - 19968: 0xF0E2,\n\t36487 - 19968: 0xEECE,\n\t36490 - 19968: 0xF1CC,\n\t36493 - 19968: 0xE5B8,\n\t36522 - 19968: 0xD7F5,\n\t36523 - 19968: 0xE3F3,\n\t36524 - 19968: 0xCFE5,\n\t36544 - 19968: 0xCFC6,\n\t36554 - 19968: 0xF3B3,\n\t36555 - 19968: 0xE4D8,\n\t36556 - 19968: 0xCFF9,\n\t36557 - 19968: 0xCFDA,\n\t36562 - 19968: 0xFACD,\n\t36575 - 19968: 0xE6E3,\n\t36587 - 19968: 0xF2E2,\n\t36600 - 19968: 0xF5EE,\n\t36603 - 19968: 0xCABB,\n\t36606 - 19968: 0xE3DC,\n\t36611 - 19968: 0xCEF2,\n\t36613 - 19968: 0xD6D9,\n\t36617 - 19968: 0xEEB0,\n\t36626 - 19968: 0xF4E5,\n\t36627 - 19968: 0xD8C2,\n\t36628 - 19968: 0xDCD0,\n\t36629 - 19968: 0xCCEE,\n\t36635 - 19968: 0xD5E0,\n\t36636 - 19968: 0xF6CA,\n\t36637 - 19968: 0xFDCA,\n\t36638 - 19968: 0xD8D6,\n\t36639 - 19968: 0xF4CF,\n\t36646 - 19968: 0xD6A6,\n\t36647 - 19968: 0xDCBE,\n\t36649 - 19968: 0xDBD4,\n\t36650 - 19968: 0xD7C7,\n\t36655 - 19968: 0xF2FE,\n\t36659 - 19968: 0xF1CD,\n\t36664 - 19968: 0xE2C3,\n\t36665 - 19968: 0xDCDE,\n\t36667 - 19968: 0xDCDF,\n\t36670 - 19968: 0xEFAD,\n\t36671 - 19968: 0xE6AB,\n\t36676 - 19968: 0xF9DD,\n\t36677 - 19968: 0xEABF,\n\t36681 - 19968: 0xEFAE,\n\t36685 - 19968: 0xF4D0,\n\t36686 - 19968: 0xCEF3,\n\t36701 - 19968: 0xE6AC,\n\t36703 - 19968: 0xCEDE,\n\t36706 - 19968: 0xD5F9,\n\t36763 - 19968: 0xE3F4,\n\t36764 - 19968: 0xCDD0,\n\t36771 - 19968: 0xD5B8,\n\t36774 - 19968: 0xF7FD,\n\t36776 - 19968: 0xDCA9,\n\t36781 - 19968: 0xDEF6,\n\t36783 - 19968: 0xDCAA,\n\t36784 - 19968: 0xF2E3,\n\t36785 - 19968: 0xE9B4,\n\t36786 - 19968: 0xD2DC,\n\t36802 - 19968: 0xE9E6,\n\t36805 - 19968: 0xE3F6,\n\t36814 - 19968: 0xE7CA,\n\t36817 - 19968: 0xD0CE,\n\t36820 - 19968: 0xDAF7,\n\t36838 - 19968: 0xCABC,\n\t36842 - 19968: 0xEEE8,\n\t36843 - 19968: 0xDADE,\n\t36845 - 19968: 0xF2F7,\n\t36848 - 19968: 0xE2FB,\n\t36850 - 19968: 0xCCA6,\n\t36855 - 19968: 0xDABB,\n\t36857 - 19968: 0xEEE9,\n\t36861 - 19968: 0xF5DA,\n\t36864 - 19968: 0xF7DC,\n\t36865 - 19968: 0xE1EA,\n\t36866 - 19968: 0xCEC1,\n\t36867 - 19968: 0xD4B1,\n\t36869 - 19968: 0xFDB1,\n\t36870 - 19968: 0xE6BD,\n\t36872 - 19968: 0xFBAD,\n\t36875 - 19968: 0xF8E7,\n\t36877 - 19968: 0xE1CE,\n\t36879 - 19968: 0xF7E2,\n\t36880 - 19968: 0xF5EF,\n\t36881 - 19968: 0xCFC7,\n\t36884 - 19968: 0xD4B2,\n\t36885 - 19968: 0xCCEF,\n\t36887 - 19968: 0xD4E8,\n\t36889 - 19968: 0xEECF,\n\t36890 - 19968: 0xF7D7,\n\t36893 - 19968: 0xE0A6,\n\t36894 - 19968: 0xD6C1,\n\t36895 - 19968: 0xE1DC,\n\t36896 - 19968: 0xF0E3,\n\t36897 - 19968: 0xF1E4,\n\t36898 - 19968: 0xDCF1,\n\t36899 - 19968: 0xD6A7,\n\t36910 - 19968: 0xF4F5,\n\t36913 - 19968: 0xF1CE,\n\t36914 - 19968: 0xF2E4,\n\t36917 - 19968: 0xD0B0,\n\t36920 - 19968: 0xECEF,\n\t36924 - 19968: 0xF9BA,\n\t36926 - 19968: 0xEBB5,\n\t36929 - 19968: 0xD4ED,\n\t36930 - 19968: 0xE2C4,\n\t36935 - 19968: 0xE9E7,\n\t36938 - 19968: 0xEBB4,\n\t36939 - 19968: 0xEAA1,\n\t36941 - 19968: 0xF8BC,\n\t36942 - 19968: 0xCEA6,\n\t36944 - 19968: 0xF9C6,\n\t36945 - 19968: 0xFCDA,\n\t36947 - 19968: 0xD4B3,\n\t36948 - 19968: 0xD3B9,\n\t36949 - 19968: 0xEADE,\n\t36953 - 19968: 0xE9AB,\n\t36956 - 19968: 0xE1E1,\n\t36957 - 19968: 0xD3CF,\n\t36958 - 19968: 0xF4F6,\n\t36960 - 19968: 0xEAC0,\n\t36961 - 19968: 0xE1CF,\n\t36963 - 19968: 0xCCBA,\n\t36969 - 19968: 0xEEEA,\n\t36973 - 19968: 0xF0E4,\n\t36974 - 19968: 0xF3B4,\n\t36975 - 19968: 0xD4EE,\n\t36978 - 19968: 0xF2C0,\n\t36981 - 19968: 0xF1E5,\n\t36983 - 19968: 0xF4C3,\n\t36984 - 19968: 0xE0D4,\n\t36986 - 19968: 0xEBB6,\n\t36988 - 19968: 0xD7A1,\n\t36989 - 19968: 0xCBE8,\n\t36991 - 19968: 0xF9AD,\n\t36992 - 19968: 0xE9AD,\n\t36993 - 19968: 0xD8E4,\n\t36994 - 19968: 0xFAB3,\n\t36995 - 19968: 0xE2C5,\n\t36996 - 19968: 0xFCBD,\n\t36999 - 19968: 0xECC4,\n\t37000 - 19968: 0xD8B1,\n\t37002 - 19968: 0xDCAB,\n\t37007 - 19968: 0xD5A4,\n\t37009 - 19968: 0xEBE9,\n\t37013 - 19968: 0xE8BB,\n\t37017 - 19968: 0xD8D7,\n\t37026 - 19968: 0xFBAE,\n\t37027 - 19968: 0xD1E1,\n\t37030 - 19968: 0xDBC0,\n\t37032 - 19968: 0xF5BE,\n\t37034 - 19968: 0xDEF7,\n\t37039 - 19968: 0xCAFB,\n\t37040 - 19968: 0xF7C6,\n\t37041 - 19968: 0xCFC8,\n\t37045 - 19968: 0xE1D0,\n\t37048 - 19968: 0xEED0,\n\t37057 - 19968: 0xE9F4,\n\t37066 - 19968: 0xCEF4,\n\t37086 - 19968: 0xD5CD,\n\t37089 - 19968: 0xCFDB,\n\t37096 - 19968: 0xDDBB,\n\t37101 - 19968: 0xCEAC,\n\t37109 - 19968: 0xE9E8,\n\t37117 - 19968: 0xD4B4,\n\t37122 - 19968: 0xE4C7,\n\t37138 - 19968: 0xF5DB,\n\t37141 - 19968: 0xFAC1,\n\t37145 - 19968: 0xDEA9,\n\t37159 - 19968: 0xD4F8,\n\t37165 - 19968: 0xEFF7,\n\t37170 - 19968: 0xD3B3,\n\t37193 - 19968: 0xEBB7,\n\t37194 - 19968: 0xEFF8,\n\t37195 - 19968: 0xF5DC,\n\t37196 - 19968: 0xEDCC,\n\t37197 - 19968: 0xDBD5,\n\t37198 - 19968: 0xF1CF,\n\t37202 - 19968: 0xF1D0,\n\t37218 - 19968: 0xF5B2,\n\t37225 - 19968: 0xD9AE,\n\t37226 - 19968: 0xD5AC,\n\t37228 - 19968: 0xE2C6,\n\t37237 - 19968: 0xFDA3,\n\t37239 - 19968: 0xFBE5,\n\t37240 - 19968: 0xDFAB,\n\t37255 - 19968: 0xE2F5,\n\t37257 - 19968: 0xF6AD,\n\t37259 - 19968: 0xF5B3,\n\t37261 - 19968: 0xF0B5,\n\t37266 - 19968: 0xE1A5,\n\t37276 - 19968: 0xF5DD,\n\t37291 - 19968: 0xECA2,\n\t37292 - 19968: 0xEDFD,\n\t37294 - 19968: 0xF5B4,\n\t37295 - 19968: 0xFBB8,\n\t37297 - 19968: 0xDBA3,\n\t37300 - 19968: 0xD6CA,\n\t37301 - 19968: 0xCBD9,\n\t37312 - 19968: 0xE5D4,\n\t37319 - 19968: 0xF3FA,\n\t37321 - 19968: 0xEBB8,\n\t37323 - 19968: 0xE0B7,\n\t37324 - 19968: 0xD7EC,\n\t37325 - 19968: 0xF1EC,\n\t37326 - 19968: 0xE5AF,\n\t37327 - 19968: 0xD5E1,\n\t37328 - 19968: 0xD7ED,\n\t37329 - 19968: 0xD1D1,\n\t37335 - 19968: 0xE1F2,\n\t37336 - 19968: 0xEFF9,\n\t37340 - 19968: 0xDDBC,\n\t37341 - 19968: 0xF6DC,\n\t37347 - 19968: 0xF0E5,\n\t37351 - 19968: 0xF4C4,\n\t37354 - 19968: 0xE9E9,\n\t37365 - 19968: 0xF3FB,\n\t37389 - 19968: 0xD4EF,\n\t37392 - 19968: 0xCCA2,\n\t37393 - 19968: 0xF7FE,\n\t37394 - 19968: 0xDFBC,\n\t37399 - 19968: 0xEBCD,\n\t37406 - 19968: 0xD0B7,\n\t37428 - 19968: 0xD6C2,\n\t37434 - 19968: 0xE8AD,\n\t37439 - 19968: 0xEFAF,\n\t37440 - 19968: 0xCBA5,\n\t37445 - 19968: 0xCBE9,\n\t37449 - 19968: 0xFAE8,\n\t37463 - 19968: 0xCCC6,\n\t37467 - 19968: 0xE6E7,\n\t37470 - 19968: 0xEAC7,\n\t37474 - 19968: 0xDBA4,\n\t37476 - 19968: 0xCFC9,\n\t37477 - 19968: 0xE2FC,\n\t37478 - 19968: 0xEFFA,\n\t37504 - 19968: 0xEBDE,\n\t37507 - 19968: 0xF5C8,\n\t37509 - 19968: 0xD4DE,\n\t37521 - 19968: 0xE0D5,\n\t37523 - 19968: 0xEFB0,\n\t37526 - 19968: 0xE2C7,\n\t37528 - 19968: 0xD9AF,\n\t37532 - 19968: 0xF9E7,\n\t37555 - 19968: 0xE7E5,\n\t37558 - 19968: 0xCFCA,\n\t37559 - 19968: 0xE1D1,\n\t37561 - 19968: 0xE2C8,\n\t37580 - 19968: 0xEFFB,\n\t37583 - 19968: 0xFAF9,\n\t37586 - 19968: 0xDCF2,\n\t37604 - 19968: 0xE0A7,\n\t37610 - 19968: 0xF8E8,\n\t37624 - 19968: 0xCBEA,\n\t37628 - 19968: 0xCBBC,\n\t37636 - 19968: 0xD6E2,\n\t37648 - 19968: 0xF5DE,\n\t37656 - 19968: 0xF5DF,\n\t37658 - 19968: 0xEEB6,\n\t37662 - 19968: 0xE2F6,\n\t37663 - 19968: 0xD3CA,\n\t37664 - 19968: 0xEFFC,\n\t37665 - 19968: 0xD1C4,\n\t37666 - 19968: 0xEFB1,\n\t37668 - 19968: 0xD1C5,\n\t37670 - 19968: 0xD0DE,\n\t37672 - 19968: 0xD9E1,\n\t37675 - 19968: 0xE0B8,\n\t37678 - 19968: 0xCDD1,\n\t37679 - 19968: 0xF3B9,\n\t37704 - 19968: 0xE7CC,\n\t37706 - 19968: 0xD6A8,\n\t37707 - 19968: 0xCEA7,\n\t37709 - 19968: 0xD4B5,\n\t37716 - 19968: 0xE4C8,\n\t37723 - 19968: 0xD3B4,\n\t37742 - 19968: 0xEBB9,\n\t37749 - 19968: 0xCBF5,\n\t37756 - 19968: 0xF6DD,\n\t37758 - 19968: 0xF1A3,\n\t37772 - 19968: 0xCCC7,\n\t37780 - 19968: 0xE9CA,\n\t37782 - 19968: 0xE1F0,\n\t37786 - 19968: 0xF5E0,\n\t37795 - 19968: 0xFBAF,\n\t37799 - 19968: 0xCBD1,\n\t37804 - 19968: 0xFBE0,\n\t37805 - 19968: 0xF2E5,\n\t37808 - 19968: 0xECF0,\n\t37827 - 19968: 0xF0EC,\n\t37841 - 19968: 0xEEEB,\n\t37854 - 19968: 0xE9CB,\n\t37857 - 19968: 0xCCF0,\n\t37860 - 19968: 0xD7AF,\n\t37878 - 19968: 0xF3A1,\n\t37892 - 19968: 0xFCF5,\n\t37912 - 19968: 0xF1A4,\n\t37925 - 19968: 0xE0D6,\n\t37931 - 19968: 0xEFB2,\n\t37941 - 19968: 0xF4D1,\n\t37944 - 19968: 0xF7A1,\n\t37956 - 19968: 0xF1D1,\n\t37969 - 19968: 0xCAFC,\n\t37970 - 19968: 0xCAFD,\n\t37979 - 19968: 0xCECE,\n\t38013 - 19968: 0xF3C8,\n\t38015 - 19968: 0xF3BA,\n\t38263 - 19968: 0xEDFE,\n\t38272 - 19968: 0xDAA6,\n\t38275 - 19968: 0xE0EC,\n\t38281 - 19968: 0xF8CD,\n\t38283 - 19968: 0xCBD2,\n\t38287 - 19968: 0xEBCE,\n\t38289 - 19968: 0xF9D8,\n\t38290 - 19968: 0xF9D9,\n\t38291 - 19968: 0xCAE0,\n\t38292 - 19968: 0xDACA,\n\t38296 - 19968: 0xCBA6,\n\t38307 - 19968: 0xCAC8,\n\t38308 - 19968: 0xF9EE,\n\t38309 - 19968: 0xDBEC,\n\t38312 - 19968: 0xD0B1,\n\t38317 - 19968: 0xD5EF,\n\t38321 - 19968: 0xE6F3,\n\t38331 - 19968: 0xE7A2,\n\t38332 - 19968: 0xE4D9,\n\t38343 - 19968: 0xE4E1,\n\t38346 - 19968: 0xFCC4,\n\t38356 - 19968: 0xF9EF,\n\t38357 - 19968: 0xCFF4,\n\t38358 - 19968: 0xF7E6,\n\t38364 - 19968: 0xCEBC,\n\t38369 - 19968: 0xF4C5,\n\t38370 - 19968: 0xDCA3,\n\t38428 - 19968: 0xDDBD,\n\t38433 - 19968: 0xF4C6,\n\t38442 - 19968: 0xF8A1,\n\t38446 - 19968: 0xE8D6,\n\t38450 - 19968: 0xDBC1,\n\t38459 - 19968: 0xF0E6,\n\t38463 - 19968: 0xE4B9,\n\t38464 - 19968: 0xF6ED,\n\t38466 - 19968: 0xF9AE,\n\t38468 - 19968: 0xDDBE,\n\t38475 - 19968: 0xD7B0,\n\t38476 - 19968: 0xD8E8,\n\t38477 - 19968: 0xCBBD,\n\t38480 - 19968: 0xF9DA,\n\t38491 - 19968: 0xF8CE,\n\t38492 - 19968: 0xF9F0,\n\t38493 - 19968: 0xE0ED,\n\t38494 - 19968: 0xE3B3,\n\t38495 - 19968: 0xF4B3,\n\t38498 - 19968: 0xEAC2,\n\t38499 - 19968: 0xF2E6,\n\t38500 - 19968: 0xF0B6,\n\t38506 - 19968: 0xDBD6,\n\t38512 - 19968: 0xEBE4,\n\t38515 - 19968: 0xF2E7,\n\t38517 - 19968: 0xD7D5,\n\t38518 - 19968: 0xD4B6,\n\t38519 - 19968: 0xF9E8,\n\t38520 - 19968: 0xD7C1,\n\t38525 - 19968: 0xE5D5,\n\t38533 - 19968: 0xE9EA,\n\t38534 - 19968: 0xD7CC,\n\t38538 - 19968: 0xD3E9,\n\t38539 - 19968: 0xE2C9,\n\t38541 - 19968: 0xFCDB,\n\t38542 - 19968: 0xCDAD,\n\t38548 - 19968: 0xCCB0,\n\t38549 - 19968: 0xEAA2,\n\t38552 - 19968: 0xE4F6,\n\t38553 - 19968: 0xD0C0,\n\t38555 - 19968: 0xF0B7,\n\t38556 - 19968: 0xEEA1,\n\t38563 - 19968: 0xD7F6,\n\t38567 - 19968: 0xE2CA,\n\t38568 - 19968: 0xE2CB,\n\t38570 - 19968: 0xFACF,\n\t38577 - 19968: 0xEBDF,\n\t38583 - 19968: 0xD6CB,\n\t38587 - 19968: 0xF4B4,\n\t38592 - 19968: 0xEDCD,\n\t38593 - 19968: 0xE4D2,\n\t38596 - 19968: 0xEAA9,\n\t38597 - 19968: 0xE4BA,\n\t38598 - 19968: 0xF3A2,\n\t38599 - 19968: 0xCDD2,\n\t38601 - 19968: 0xF6CB,\n\t38603 - 19968: 0xF1E6,\n\t38604 - 19968: 0xEDC1,\n\t38605 - 19968: 0xE8BC,\n\t38606 - 19968: 0xEED1,\n\t38613 - 19968: 0xF0E7,\n\t38614 - 19968: 0xE2CC,\n\t38617 - 19968: 0xE4AA,\n\t38619 - 19968: 0xF5E1,\n\t38620 - 19968: 0xEDDA,\n\t38626 - 19968: 0xD7EE,\n\t38627 - 19968: 0xD1F1,\n\t38632 - 19968: 0xE9EB,\n\t38633 - 19968: 0xE9EC,\n\t38634 - 19968: 0xE0E4,\n\t38639 - 19968: 0xDAA7,\n\t38640 - 19968: 0xDDD4,\n\t38642 - 19968: 0xEAA3,\n\t38646 - 19968: 0xD6C3,\n\t38647 - 19968: 0xD6F4,\n\t38649 - 19968: 0xDADF,\n\t38651 - 19968: 0xEFB3,\n\t38656 - 19968: 0xE2CD,\n\t38662 - 19968: 0xEFFD,\n\t38663 - 19968: 0xF2E8,\n\t38673 - 19968: 0xEFC5,\n\t38675 - 19968: 0xE7E7,\n\t38678 - 19968: 0xD7FD,\n\t38681 - 19968: 0xE7CE,\n\t38684 - 19968: 0xDFDC,\n\t38686 - 19968: 0xF9C7,\n\t38695 - 19968: 0xD9F6,\n\t38704 - 19968: 0xDFAC,\n\t38706 - 19968: 0xD6DA,\n\t38713 - 19968: 0xDCA4,\n\t38717 - 19968: 0xF0B8,\n\t38722 - 19968: 0xD5FA,\n\t38724 - 19968: 0xE4F7,\n\t38728 - 19968: 0xD6C4,\n\t38737 - 19968: 0xF4EC,\n\t38742 - 19968: 0xEFFE,\n\t38748 - 19968: 0xF0A1,\n\t38750 - 19968: 0xDEAA,\n\t38753 - 19968: 0xDABC,\n\t38754 - 19968: 0xD8FC,\n\t38761 - 19968: 0xFAD4,\n\t38765 - 19968: 0xECE5,\n\t38772 - 19968: 0xFCA8,\n\t38775 - 19968: 0xECE6,\n\t38778 - 19968: 0xD8CB,\n\t38795 - 19968: 0xFBB9,\n\t38797 - 19968: 0xE4D3,\n\t38799 - 19968: 0xCDF9,\n\t38816 - 19968: 0xCFD3,\n\t38824 - 19968: 0xCAEA,\n\t38827 - 19968: 0xCFD4,\n\t38829 - 19968: 0xF8BD,\n\t38854 - 19968: 0xF4C7,\n\t38859 - 19968: 0xEADF,\n\t38867 - 19968: 0xF9DB,\n\t38876 - 19968: 0xD4B7,\n\t38899 - 19968: 0xEBE5,\n\t38902 - 19968: 0xE1D2,\n\t38907 - 19968: 0xEAA4,\n\t38911 - 19968: 0xFAC2,\n\t38912 - 19968: 0xFBE1,\n\t38913 - 19968: 0xFAED,\n\t38914 - 19968: 0xF0A2,\n\t38915 - 19968: 0xCCF1,\n\t38917 - 19968: 0xFAA3,\n\t38918 - 19968: 0xE2F7,\n\t38920 - 19968: 0xE2CE,\n\t38922 - 19968: 0xE9F5,\n\t38924 - 19968: 0xE1EB,\n\t38928 - 19968: 0xE7E8,\n\t38929 - 19968: 0xE8D7,\n\t38930 - 19968: 0xDAF8,\n\t38931 - 19968: 0xD4CB,\n\t38935 - 19968: 0xF7F6,\n\t38936 - 19968: 0xD6C5,\n\t38957 - 19968: 0xD4E9,\n\t38960 - 19968: 0xFAFA,\n\t38968 - 19968: 0xCCF2,\n\t38969 - 19968: 0xF7DD,\n\t38971 - 19968: 0xDEBA,\n\t38982 - 19968: 0xCEA8,\n\t38988 - 19968: 0xF0B9,\n\t38989 - 19968: 0xE4FE,\n\t38990 - 19968: 0xE4C9,\n\t38996 - 19968: 0xE4D4,\n\t39000 - 19968: 0xEAC3,\n\t39002 - 19968: 0xEFB4,\n\t39006 - 19968: 0xD7BE,\n\t39013 - 19968: 0xFBE2,\n\t39015 - 19968: 0xCDD3,\n\t39019 - 19968: 0xEFB5,\n\t39023 - 19968: 0xFAE9,\n\t39080 - 19968: 0xF9A6,\n\t39087 - 19968: 0xDFBD,\n\t39089 - 19968: 0xF7C7,\n\t39108 - 19968: 0xF8FD,\n\t39111 - 19968: 0xF8FC,\n\t39131 - 19968: 0xDEAB,\n\t39132 - 19968: 0xDBE8,\n\t39135 - 19968: 0xE3DD,\n\t39137 - 19968: 0xE1E2,\n\t39138 - 19968: 0xD1C6,\n\t39149 - 19968: 0xF6D0,\n\t39150 - 19968: 0xEBE6,\n\t39151 - 19968: 0xDAF9,\n\t39156 - 19968: 0xECC7,\n\t39164 - 19968: 0xDEF8,\n\t39165 - 19968: 0xF8E9,\n\t39166 - 19968: 0xE3DE,\n\t39171 - 19968: 0xCEF5,\n\t39177 - 19968: 0xFAC3,\n\t39178 - 19968: 0xE5D7,\n\t39180 - 19968: 0xECC8,\n\t39184 - 19968: 0xF3C9,\n\t39187 - 19968: 0xE4BB,\n\t39192 - 19968: 0xE6AE,\n\t39198 - 19968: 0xEFB6,\n\t39200 - 19968: 0xDCBF,\n\t39208 - 19968: 0xCEBD,\n\t39237 - 19968: 0xD8C3,\n\t39241 - 19968: 0xD0CF,\n\t39243 - 19968: 0xCFFA,\n\t39244 - 19968: 0xF3CA,\n\t39245 - 19968: 0xE0D7,\n\t39249 - 19968: 0xD1C7,\n\t39250 - 19968: 0xE9AE,\n\t39252 - 19968: 0xE8BD,\n\t39255 - 19968: 0xFAC4,\n\t39318 - 19968: 0xE2CF,\n\t39321 - 19968: 0xFAC5,\n\t39325 - 19968: 0xF9B8,\n\t39333 - 19968: 0xDCE0,\n\t39336 - 19968: 0xFBB0,\n\t39340 - 19968: 0xD8A9,\n\t39341 - 19968: 0xE5DF,\n\t39342 - 19968: 0xF9A7,\n\t39345 - 19968: 0xF6EE,\n\t39347 - 19968: 0xF6CC,\n\t39348 - 19968: 0xE2F8,\n\t39353 - 19968: 0xECF1,\n\t39361 - 19968: 0xDAE0,\n\t39376 - 19968: 0xF1D2,\n\t39377 - 19968: 0xD2CC,\n\t39378 - 19968: 0xCFCB,\n\t39381 - 19968: 0xCABD,\n\t39385 - 19968: 0xDDBF,\n\t39389 - 19968: 0xF6EF,\n\t39391 - 19968: 0xDEF9,\n\t39405 - 19968: 0xFAB4,\n\t39409 - 19968: 0xD5AD,\n\t39423 - 19968: 0xF1E7,\n\t39425 - 19968: 0xDEBE,\n\t39432 - 19968: 0xDCC0,\n\t39438 - 19968: 0xD1C8,\n\t39439 - 19968: 0xD1C9,\n\t39449 - 19968: 0xF8BE,\n\t39467 - 19968: 0xCBF6,\n\t39472 - 19968: 0xD4F9,\n\t39478 - 19968: 0xF5E2,\n\t39479 - 19968: 0xE1D3,\n\t39488 - 19968: 0xD8E9,\n\t39491 - 19968: 0xF8FE,\n\t39493 - 19968: 0xCFCC,\n\t39501 - 19968: 0xFDA4,\n\t39509 - 19968: 0xCEF6,\n\t39511 - 19968: 0xFAD0,\n\t39514 - 19968: 0xCCF3,\n\t39515 - 19968: 0xE6BE,\n\t39519 - 19968: 0xF6AE,\n\t39522 - 19968: 0xD5F0,\n\t39525 - 19968: 0xD1CA,\n\t39529 - 19968: 0xFCBE,\n\t39530 - 19968: 0xD5F1,\n\t39592 - 19968: 0xCDE9,\n\t39608 - 19968: 0xFAB5,\n\t39635 - 19968: 0xE2D0,\n\t39636 - 19968: 0xF4F7,\n\t39640 - 19968: 0xCDD4,\n\t39653 - 19968: 0xE7A3,\n\t39662 - 19968: 0xDBA5,\n\t39706 - 19968: 0xE2D1,\n\t39719 - 19968: 0xD7A2,\n\t39722 - 19968: 0xF7E3,\n\t39729 - 19968: 0xEAA6,\n\t39740 - 19968: 0xD0A1,\n\t39745 - 19968: 0xCEDA,\n\t39746 - 19968: 0xFBEB,\n\t39747 - 19968: 0xDBA6,\n\t39748 - 19968: 0xDBDE,\n\t39749 - 19968: 0xD8E5,\n\t39759 - 19968: 0xEAE0,\n\t39764 - 19968: 0xD8AA,\n\t39770 - 19968: 0xE5E0,\n\t39791 - 19968: 0xD6DB,\n\t39822 - 19968: 0xEFC6,\n\t39825 - 19968: 0xF8EA,\n\t39839 - 19968: 0xE4D5,\n\t39851 - 19968: 0xCEF7,\n\t39854 - 19968: 0xE0D8,\n\t39881 - 19968: 0xD7EF,\n\t39894 - 19968: 0xF4ED,\n\t39908 - 19968: 0xCDE6,\n\t39912 - 19968: 0xCCF4,\n\t39949 - 19968: 0xF5E3,\n\t39952 - 19968: 0xE4CA,\n\t39954 - 19968: 0xDCE1,\n\t39957 - 19968: 0xF9C8,\n\t39973 - 19968: 0xFCBF,\n\t39986 - 19968: 0xE8A7,\n\t39995 - 19968: 0xD8C4,\n\t40007 - 19968: 0xCBBE,\n\t40009 - 19968: 0xDCAE,\n\t40023 - 19968: 0xD7F7,\n\t40165 - 19968: 0xF0E8,\n\t40167 - 19968: 0xDDC0,\n\t40169 - 19968: 0xCFCD,\n\t40179 - 19968: 0xDCF3,\n\t40180 - 19968: 0xD9B0,\n\t40182 - 19968: 0xE6E9,\n\t40201 - 19968: 0xE4BC,\n\t40219 - 19968: 0xEAC4,\n\t40230 - 19968: 0xE4EC,\n\t40232 - 19968: 0xE4E5,\n\t40251 - 19968: 0xFBF8,\n\t40273 - 19968: 0xCCBB,\n\t40285 - 19968: 0xE4BD,\n\t40288 - 19968: 0xCDDC,\n\t40289 - 19968: 0xD9F7,\n\t40300 - 19968: 0xDDDF,\n\t40306 - 19968: 0xEDCE,\n\t40361 - 19968: 0xD9D0,\n\t40367 - 19968: 0xE5A3,\n\t40372 - 19968: 0xF9CD,\n\t40388 - 19968: 0xCDAE,\n\t40407 - 19968: 0xCFCE,\n\t40434 - 19968: 0xF6AF,\n\t40440 - 19968: 0xFDD3,\n\t40441 - 19968: 0xEBED,\n\t40442 - 19968: 0xD6DC,\n\t40474 - 19968: 0xE5A4,\n\t40478 - 19968: 0xD5B6,\n\t40565 - 19968: 0xD6DD,\n\t40569 - 19968: 0xF9E9,\n\t40573 - 19968: 0xE7A4,\n\t40575 - 19968: 0xD6E3,\n\t40594 - 19968: 0xD1CB,\n\t40595 - 19968: 0xD6E4,\n\t40599 - 19968: 0xD5F2,\n\t40605 - 19968: 0xDEFA,\n\t40607 - 19968: 0xD7F8,\n\t40613 - 19968: 0xD8EA,\n\t40628 - 19968: 0xCFD5,\n\t40629 - 19968: 0xD8FD,\n\t40635 - 19968: 0xD8AB,\n\t40638 - 19968: 0xFDCB,\n\t40643 - 19968: 0xFCDC,\n\t40653 - 19968: 0xE0A8,\n\t40654 - 19968: 0xD5F3,\n\t40657 - 19968: 0xFDD9,\n\t40660 - 19968: 0xCCA3,\n\t40664 - 19968: 0xD9F9,\n\t40667 - 19968: 0xD3EA,\n\t40668 - 19968: 0xF5F5,\n\t40670 - 19968: 0xEFC7,\n\t40680 - 19968: 0xD3DA,\n\t40692 - 19968: 0xDABD,\n\t40711 - 19968: 0xE8A8,\n\t40712 - 19968: 0xDCAF,\n\t40718 - 19968: 0xF0A3,\n\t40723 - 19968: 0xCDD5,\n\t40736 - 19968: 0xE0A9,\n\t40763 - 19968: 0xDEAC,\n\t40778 - 19968: 0xF0BA,\n\t40779 - 19968: 0xEEB1,\n\t40782 - 19968: 0xEEB2,\n\t40786 - 19968: 0xF6CD,\n\t40799 - 19968: 0xEED2,\n\t40801 - 19968: 0xD6C6,\n\t40807 - 19968: 0xE0E5,\n\t40810 - 19968: 0xF3BB,\n\t40812 - 19968: 0xE5E1,\n\t40823 - 19968: 0xE4CB,\n\t40845 - 19968: 0xD7A3,\n\t40848 - 19968: 0xDBC2,\n\t40853 - 19968: 0xCAFE,\n\t40860 - 19968: 0xCFCF,\n}\n\nconst encode1Low, encode1High = 44032, 55204\n\nvar encode1 = [...]uint16{\n\t44032 - 44032: 0xB0A1,\n\t44033 - 44032: 0xB0A2,\n\t44034 - 44032: 0x8141,\n\t44035 - 44032: 0x8142,\n\t44036 - 44032: 0xB0A3,\n\t44037 - 44032: 0x8143,\n\t44038 - 44032: 0x8144,\n\t44039 - 44032: 0xB0A4,\n\t44040 - 44032: 0xB0A5,\n\t44041 - 44032: 0xB0A6,\n\t44042 - 44032: 0xB0A7,\n\t44043 - 44032: 0x8145,\n\t44044 - 44032: 0x8146,\n\t44045 - 44032: 0x8147,\n\t44046 - 44032: 0x8148,\n\t44047 - 44032: 0x8149,\n\t44048 - 44032: 0xB0A8,\n\t44049 - 44032: 0xB0A9,\n\t44050 - 44032: 0xB0AA,\n\t44051 - 44032: 0xB0AB,\n\t44052 - 44032: 0xB0AC,\n\t44053 - 44032: 0xB0AD,\n\t44054 - 44032: 0xB0AE,\n\t44055 - 44032: 0xB0AF,\n\t44056 - 44032: 0x814A,\n\t44057 - 44032: 0xB0B0,\n\t44058 - 44032: 0xB0B1,\n\t44059 - 44032: 0xB0B2,\n\t44060 - 44032: 0xB0B3,\n\t44061 - 44032: 0xB0B4,\n\t44062 - 44032: 0x814B,\n\t44063 - 44032: 0x814C,\n\t44064 - 44032: 0xB0B5,\n\t44065 - 44032: 0x814D,\n\t44066 - 44032: 0x814E,\n\t44067 - 44032: 0x814F,\n\t44068 - 44032: 0xB0B6,\n\t44069 - 44032: 0x8150,\n\t44070 - 44032: 0x8151,\n\t44071 - 44032: 0x8152,\n\t44072 - 44032: 0x8153,\n\t44073 - 44032: 0x8154,\n\t44074 - 44032: 0x8155,\n\t44075 - 44032: 0x8156,\n\t44076 - 44032: 0xB0B7,\n\t44077 - 44032: 0xB0B8,\n\t44078 - 44032: 0x8157,\n\t44079 - 44032: 0xB0B9,\n\t44080 - 44032: 0xB0BA,\n\t44081 - 44032: 0xB0BB,\n\t44082 - 44032: 0x8158,\n\t44083 - 44032: 0x8159,\n\t44084 - 44032: 0x815A,\n\t44085 - 44032: 0x8161,\n\t44086 - 44032: 0x8162,\n\t44087 - 44032: 0x8163,\n\t44088 - 44032: 0xB0BC,\n\t44089 - 44032: 0xB0BD,\n\t44090 - 44032: 0x8164,\n\t44091 - 44032: 0x8165,\n\t44092 - 44032: 0xB0BE,\n\t44093 - 44032: 0x8166,\n\t44094 - 44032: 0x8167,\n\t44095 - 44032: 0x8168,\n\t44096 - 44032: 0xB0BF,\n\t44097 - 44032: 0x8169,\n\t44098 - 44032: 0x816A,\n\t44099 - 44032: 0x816B,\n\t44100 - 44032: 0x816C,\n\t44101 - 44032: 0x816D,\n\t44102 - 44032: 0x816E,\n\t44103 - 44032: 0x816F,\n\t44104 - 44032: 0x8170,\n\t44105 - 44032: 0x8171,\n\t44106 - 44032: 0x8172,\n\t44107 - 44032: 0xB0C0,\n\t44108 - 44032: 0x8173,\n\t44109 - 44032: 0xB0C1,\n\t44110 - 44032: 0x8174,\n\t44111 - 44032: 0x8175,\n\t44112 - 44032: 0x8176,\n\t44113 - 44032: 0x8177,\n\t44114 - 44032: 0x8178,\n\t44115 - 44032: 0x8179,\n\t44116 - 44032: 0xB0C2,\n\t44117 - 44032: 0x817A,\n\t44118 - 44032: 0x8181,\n\t44119 - 44032: 0x8182,\n\t44120 - 44032: 0xB0C3,\n\t44121 - 44032: 0x8183,\n\t44122 - 44032: 0x8184,\n\t44123 - 44032: 0x8185,\n\t44124 - 44032: 0xB0C4,\n\t44125 - 44032: 0x8186,\n\t44126 - 44032: 0x8187,\n\t44127 - 44032: 0x8188,\n\t44128 - 44032: 0x8189,\n\t44129 - 44032: 0x818A,\n\t44130 - 44032: 0x818B,\n\t44131 - 44032: 0x818C,\n\t44132 - 44032: 0x818D,\n\t44133 - 44032: 0x818E,\n\t44134 - 44032: 0x818F,\n\t44135 - 44032: 0x8190,\n\t44136 - 44032: 0x8191,\n\t44137 - 44032: 0x8192,\n\t44138 - 44032: 0x8193,\n\t44139 - 44032: 0x8194,\n\t44140 - 44032: 0x8195,\n\t44141 - 44032: 0x8196,\n\t44142 - 44032: 0x8197,\n\t44143 - 44032: 0x8198,\n\t44144 - 44032: 0xB0C5,\n\t44145 - 44032: 0xB0C6,\n\t44146 - 44032: 0x8199,\n\t44147 - 44032: 0x819A,\n\t44148 - 44032: 0xB0C7,\n\t44149 - 44032: 0x819B,\n\t44150 - 44032: 0x819C,\n\t44151 - 44032: 0xB0C8,\n\t44152 - 44032: 0xB0C9,\n\t44153 - 44032: 0x819D,\n\t44154 - 44032: 0xB0CA,\n\t44155 - 44032: 0x819E,\n\t44156 - 44032: 0x819F,\n\t44157 - 44032: 0x81A0,\n\t44158 - 44032: 0x81A1,\n\t44159 - 44032: 0x81A2,\n\t44160 - 44032: 0xB0CB,\n\t44161 - 44032: 0xB0CC,\n\t44162 - 44032: 0x81A3,\n\t44163 - 44032: 0xB0CD,\n\t44164 - 44032: 0xB0CE,\n\t44165 - 44032: 0xB0CF,\n\t44166 - 44032: 0xB0D0,\n\t44167 - 44032: 0x81A4,\n\t44168 - 44032: 0x81A5,\n\t44169 - 44032: 0xB0D1,\n\t44170 - 44032: 0xB0D2,\n\t44171 - 44032: 0xB0D3,\n\t44172 - 44032: 0xB0D4,\n\t44173 - 44032: 0x81A6,\n\t44174 - 44032: 0x81A7,\n\t44175 - 44032: 0x81A8,\n\t44176 - 44032: 0xB0D5,\n\t44177 - 44032: 0x81A9,\n\t44178 - 44032: 0x81AA,\n\t44179 - 44032: 0x81AB,\n\t44180 - 44032: 0xB0D6,\n\t44181 - 44032: 0x81AC,\n\t44182 - 44032: 0x81AD,\n\t44183 - 44032: 0x81AE,\n\t44184 - 44032: 0x81AF,\n\t44185 - 44032: 0x81B0,\n\t44186 - 44032: 0x81B1,\n\t44187 - 44032: 0x81B2,\n\t44188 - 44032: 0xB0D7,\n\t44189 - 44032: 0xB0D8,\n\t44190 - 44032: 0x81B3,\n\t44191 - 44032: 0xB0D9,\n\t44192 - 44032: 0xB0DA,\n\t44193 - 44032: 0xB0DB,\n\t44194 - 44032: 0x81B4,\n\t44195 - 44032: 0x81B5,\n\t44196 - 44032: 0x81B6,\n\t44197 - 44032: 0x81B7,\n\t44198 - 44032: 0x81B8,\n\t44199 - 44032: 0x81B9,\n\t44200 - 44032: 0xB0DC,\n\t44201 - 44032: 0xB0DD,\n\t44202 - 44032: 0xB0DE,\n\t44203 - 44032: 0x81BA,\n\t44204 - 44032: 0xB0DF,\n\t44205 - 44032: 0x81BB,\n\t44206 - 44032: 0x81BC,\n\t44207 - 44032: 0xB0E0,\n\t44208 - 44032: 0xB0E1,\n\t44209 - 44032: 0x81BD,\n\t44210 - 44032: 0x81BE,\n\t44211 - 44032: 0x81BF,\n\t44212 - 44032: 0x81C0,\n\t44213 - 44032: 0x81C1,\n\t44214 - 44032: 0x81C2,\n\t44215 - 44032: 0x81C3,\n\t44216 - 44032: 0xB0E2,\n\t44217 - 44032: 0xB0E3,\n\t44218 - 44032: 0x81C4,\n\t44219 - 44032: 0xB0E4,\n\t44220 - 44032: 0xB0E5,\n\t44221 - 44032: 0xB0E6,\n\t44222 - 44032: 0x81C5,\n\t44223 - 44032: 0x81C6,\n\t44224 - 44032: 0x81C7,\n\t44225 - 44032: 0xB0E7,\n\t44226 - 44032: 0x81C8,\n\t44227 - 44032: 0x81C9,\n\t44228 - 44032: 0xB0E8,\n\t44229 - 44032: 0x81CA,\n\t44230 - 44032: 0x81CB,\n\t44231 - 44032: 0x81CC,\n\t44232 - 44032: 0xB0E9,\n\t44233 - 44032: 0x81CD,\n\t44234 - 44032: 0x81CE,\n\t44235 - 44032: 0x81CF,\n\t44236 - 44032: 0xB0EA,\n\t44237 - 44032: 0x81D0,\n\t44238 - 44032: 0x81D1,\n\t44239 - 44032: 0x81D2,\n\t44240 - 44032: 0x81D3,\n\t44241 - 44032: 0x81D4,\n\t44242 - 44032: 0x81D5,\n\t44243 - 44032: 0x81D6,\n\t44244 - 44032: 0x81D7,\n\t44245 - 44032: 0xB0EB,\n\t44246 - 44032: 0x81D8,\n\t44247 - 44032: 0xB0EC,\n\t44248 - 44032: 0x81D9,\n\t44249 - 44032: 0x81DA,\n\t44250 - 44032: 0x81DB,\n\t44251 - 44032: 0x81DC,\n\t44252 - 44032: 0x81DD,\n\t44253 - 44032: 0x81DE,\n\t44254 - 44032: 0x81DF,\n\t44255 - 44032: 0x81E0,\n\t44256 - 44032: 0xB0ED,\n\t44257 - 44032: 0xB0EE,\n\t44258 - 44032: 0x81E1,\n\t44259 - 44032: 0x81E2,\n\t44260 - 44032: 0xB0EF,\n\t44261 - 44032: 0x81E3,\n\t44262 - 44032: 0x81E4,\n\t44263 - 44032: 0xB0F0,\n\t44264 - 44032: 0xB0F1,\n\t44265 - 44032: 0x81E5,\n\t44266 - 44032: 0xB0F2,\n\t44267 - 44032: 0x81E6,\n\t44268 - 44032: 0xB0F3,\n\t44269 - 44032: 0x81E7,\n\t44270 - 44032: 0x81E8,\n\t44271 - 44032: 0xB0F4,\n\t44272 - 44032: 0xB0F5,\n\t44273 - 44032: 0xB0F6,\n\t44274 - 44032: 0x81E9,\n\t44275 - 44032: 0xB0F7,\n\t44276 - 44032: 0x81EA,\n\t44277 - 44032: 0xB0F8,\n\t44278 - 44032: 0xB0F9,\n\t44279 - 44032: 0x81EB,\n\t44280 - 44032: 0x81EC,\n\t44281 - 44032: 0x81ED,\n\t44282 - 44032: 0x81EE,\n\t44283 - 44032: 0x81EF,\n\t44284 - 44032: 0xB0FA,\n\t44285 - 44032: 0xB0FB,\n\t44286 - 44032: 0x81F0,\n\t44287 - 44032: 0x81F1,\n\t44288 - 44032: 0xB0FC,\n\t44289 - 44032: 0x81F2,\n\t44290 - 44032: 0x81F3,\n\t44291 - 44032: 0x81F4,\n\t44292 - 44032: 0xB0FD,\n\t44293 - 44032: 0x81F5,\n\t44294 - 44032: 0xB0FE,\n\t44295 - 44032: 0x81F6,\n\t44296 - 44032: 0x81F7,\n\t44297 - 44032: 0x81F8,\n\t44298 - 44032: 0x81F9,\n\t44299 - 44032: 0x81FA,\n\t44300 - 44032: 0xB1A1,\n\t44301 - 44032: 0xB1A2,\n\t44302 - 44032: 0x81FB,\n\t44303 - 44032: 0xB1A3,\n\t44304 - 44032: 0x81FC,\n\t44305 - 44032: 0xB1A4,\n\t44306 - 44032: 0x81FD,\n\t44307 - 44032: 0x81FE,\n\t44308 - 44032: 0x8241,\n\t44309 - 44032: 0x8242,\n\t44310 - 44032: 0x8243,\n\t44311 - 44032: 0x8244,\n\t44312 - 44032: 0xB1A5,\n\t44313 - 44032: 0x8245,\n\t44314 - 44032: 0x8246,\n\t44315 - 44032: 0x8247,\n\t44316 - 44032: 0xB1A6,\n\t44317 - 44032: 0x8248,\n\t44318 - 44032: 0x8249,\n\t44319 - 44032: 0x824A,\n\t44320 - 44032: 0xB1A7,\n\t44321 - 44032: 0x824B,\n\t44322 - 44032: 0x824C,\n\t44323 - 44032: 0x824D,\n\t44324 - 44032: 0x824E,\n\t44325 - 44032: 0x824F,\n\t44326 - 44032: 0x8250,\n\t44327 - 44032: 0x8251,\n\t44328 - 44032: 0x8252,\n\t44329 - 44032: 0xB1A8,\n\t44330 - 44032: 0x8253,\n\t44331 - 44032: 0x8254,\n\t44332 - 44032: 0xB1A9,\n\t44333 - 44032: 0xB1AA,\n\t44334 - 44032: 0x8255,\n\t44335 - 44032: 0x8256,\n\t44336 - 44032: 0x8257,\n\t44337 - 44032: 0x8258,\n\t44338 - 44032: 0x8259,\n\t44339 - 44032: 0x825A,\n\t44340 - 44032: 0xB1AB,\n\t44341 - 44032: 0xB1AC,\n\t44342 - 44032: 0x8261,\n\t44343 - 44032: 0x8262,\n\t44344 - 44032: 0xB1AD,\n\t44345 - 44032: 0x8263,\n\t44346 - 44032: 0x8264,\n\t44347 - 44032: 0x8265,\n\t44348 - 44032: 0xB1AE,\n\t44349 - 44032: 0x8266,\n\t44350 - 44032: 0x8267,\n\t44351 - 44032: 0x8268,\n\t44352 - 44032: 0x8269,\n\t44353 - 44032: 0x826A,\n\t44354 - 44032: 0x826B,\n\t44355 - 44032: 0x826C,\n\t44356 - 44032: 0xB1AF,\n\t44357 - 44032: 0xB1B0,\n\t44358 - 44032: 0x826D,\n\t44359 - 44032: 0xB1B1,\n\t44360 - 44032: 0x826E,\n\t44361 - 44032: 0xB1B2,\n\t44362 - 44032: 0x826F,\n\t44363 - 44032: 0x8270,\n\t44364 - 44032: 0x8271,\n\t44365 - 44032: 0x8272,\n\t44366 - 44032: 0x8273,\n\t44367 - 44032: 0x8274,\n\t44368 - 44032: 0xB1B3,\n\t44369 - 44032: 0x8275,\n\t44370 - 44032: 0x8276,\n\t44371 - 44032: 0x8277,\n\t44372 - 44032: 0xB1B4,\n\t44373 - 44032: 0x8278,\n\t44374 - 44032: 0x8279,\n\t44375 - 44032: 0x827A,\n\t44376 - 44032: 0xB1B5,\n\t44377 - 44032: 0x8281,\n\t44378 - 44032: 0x8282,\n\t44379 - 44032: 0x8283,\n\t44380 - 44032: 0x8284,\n\t44381 - 44032: 0x8285,\n\t44382 - 44032: 0x8286,\n\t44383 - 44032: 0x8287,\n\t44384 - 44032: 0x8288,\n\t44385 - 44032: 0xB1B6,\n\t44386 - 44032: 0x8289,\n\t44387 - 44032: 0xB1B7,\n\t44388 - 44032: 0x828A,\n\t44389 - 44032: 0x828B,\n\t44390 - 44032: 0x828C,\n\t44391 - 44032: 0x828D,\n\t44392 - 44032: 0x828E,\n\t44393 - 44032: 0x828F,\n\t44394 - 44032: 0x8290,\n\t44395 - 44032: 0x8291,\n\t44396 - 44032: 0xB1B8,\n\t44397 - 44032: 0xB1B9,\n\t44398 - 44032: 0x8292,\n\t44399 - 44032: 0x8293,\n\t44400 - 44032: 0xB1BA,\n\t44401 - 44032: 0x8294,\n\t44402 - 44032: 0x8295,\n\t44403 - 44032: 0xB1BB,\n\t44404 - 44032: 0xB1BC,\n\t44405 - 44032: 0xB1BD,\n\t44406 - 44032: 0xB1BE,\n\t44407 - 44032: 0x8296,\n\t44408 - 44032: 0x8297,\n\t44409 - 44032: 0x8298,\n\t44410 - 44032: 0x8299,\n\t44411 - 44032: 0xB1BF,\n\t44412 - 44032: 0xB1C0,\n\t44413 - 44032: 0xB1C1,\n\t44414 - 44032: 0x829A,\n\t44415 - 44032: 0xB1C2,\n\t44416 - 44032: 0x829B,\n\t44417 - 44032: 0xB1C3,\n\t44418 - 44032: 0xB1C4,\n\t44419 - 44032: 0x829C,\n\t44420 - 44032: 0x829D,\n\t44421 - 44032: 0x829E,\n\t44422 - 44032: 0x829F,\n\t44423 - 44032: 0x82A0,\n\t44424 - 44032: 0xB1C5,\n\t44425 - 44032: 0xB1C6,\n\t44426 - 44032: 0x82A1,\n\t44427 - 44032: 0x82A2,\n\t44428 - 44032: 0xB1C7,\n\t44429 - 44032: 0x82A3,\n\t44430 - 44032: 0x82A4,\n\t44431 - 44032: 0x82A5,\n\t44432 - 44032: 0xB1C8,\n\t44433 - 44032: 0x82A6,\n\t44434 - 44032: 0x82A7,\n\t44435 - 44032: 0x82A8,\n\t44436 - 44032: 0x82A9,\n\t44437 - 44032: 0x82AA,\n\t44438 - 44032: 0x82AB,\n\t44439 - 44032: 0x82AC,\n\t44440 - 44032: 0x82AD,\n\t44441 - 44032: 0x82AE,\n\t44442 - 44032: 0x82AF,\n\t44443 - 44032: 0x82B0,\n\t44444 - 44032: 0xB1C9,\n\t44445 - 44032: 0xB1CA,\n\t44446 - 44032: 0x82B1,\n\t44447 - 44032: 0x82B2,\n\t44448 - 44032: 0x82B3,\n\t44449 - 44032: 0x82B4,\n\t44450 - 44032: 0x82B5,\n\t44451 - 44032: 0x82B6,\n\t44452 - 44032: 0xB1CB,\n\t44453 - 44032: 0x82B7,\n\t44454 - 44032: 0x82B8,\n\t44455 - 44032: 0x82B9,\n\t44456 - 44032: 0x82BA,\n\t44457 - 44032: 0x82BB,\n\t44458 - 44032: 0x82BC,\n\t44459 - 44032: 0x82BD,\n\t44460 - 44032: 0x82BE,\n\t44461 - 44032: 0x82BF,\n\t44462 - 44032: 0x82C0,\n\t44463 - 44032: 0x82C1,\n\t44464 - 44032: 0x82C2,\n\t44465 - 44032: 0x82C3,\n\t44466 - 44032: 0x82C4,\n\t44467 - 44032: 0x82C5,\n\t44468 - 44032: 0x82C6,\n\t44469 - 44032: 0x82C7,\n\t44470 - 44032: 0x82C8,\n\t44471 - 44032: 0xB1CC,\n\t44472 - 44032: 0x82C9,\n\t44473 - 44032: 0x82CA,\n\t44474 - 44032: 0x82CB,\n\t44475 - 44032: 0x82CC,\n\t44476 - 44032: 0x82CD,\n\t44477 - 44032: 0x82CE,\n\t44478 - 44032: 0x82CF,\n\t44479 - 44032: 0x82D0,\n\t44480 - 44032: 0xB1CD,\n\t44481 - 44032: 0xB1CE,\n\t44482 - 44032: 0x82D1,\n\t44483 - 44032: 0x82D2,\n\t44484 - 44032: 0xB1CF,\n\t44485 - 44032: 0x82D3,\n\t44486 - 44032: 0x82D4,\n\t44487 - 44032: 0x82D5,\n\t44488 - 44032: 0xB1D0,\n\t44489 - 44032: 0x82D6,\n\t44490 - 44032: 0x82D7,\n\t44491 - 44032: 0x82D8,\n\t44492 - 44032: 0x82D9,\n\t44493 - 44032: 0x82DA,\n\t44494 - 44032: 0x82DB,\n\t44495 - 44032: 0x82DC,\n\t44496 - 44032: 0xB1D1,\n\t44497 - 44032: 0xB1D2,\n\t44498 - 44032: 0x82DD,\n\t44499 - 44032: 0xB1D3,\n\t44500 - 44032: 0x82DE,\n\t44501 - 44032: 0x82DF,\n\t44502 - 44032: 0x82E0,\n\t44503 - 44032: 0x82E1,\n\t44504 - 44032: 0x82E2,\n\t44505 - 44032: 0x82E3,\n\t44506 - 44032: 0x82E4,\n\t44507 - 44032: 0x82E5,\n\t44508 - 44032: 0xB1D4,\n\t44509 - 44032: 0x82E6,\n\t44510 - 44032: 0x82E7,\n\t44511 - 44032: 0x82E8,\n\t44512 - 44032: 0xB1D5,\n\t44513 - 44032: 0x82E9,\n\t44514 - 44032: 0x82EA,\n\t44515 - 44032: 0x82EB,\n\t44516 - 44032: 0xB1D6,\n\t44517 - 44032: 0x82EC,\n\t44518 - 44032: 0x82ED,\n\t44519 - 44032: 0x82EE,\n\t44520 - 44032: 0x82EF,\n\t44521 - 44032: 0x82F0,\n\t44522 - 44032: 0x82F1,\n\t44523 - 44032: 0x82F2,\n\t44524 - 44032: 0x82F3,\n\t44525 - 44032: 0x82F4,\n\t44526 - 44032: 0x82F5,\n\t44527 - 44032: 0x82F6,\n\t44528 - 44032: 0x82F7,\n\t44529 - 44032: 0x82F8,\n\t44530 - 44032: 0x82F9,\n\t44531 - 44032: 0x82FA,\n\t44532 - 44032: 0x82FB,\n\t44533 - 44032: 0x82FC,\n\t44534 - 44032: 0x82FD,\n\t44535 - 44032: 0x82FE,\n\t44536 - 44032: 0xB1D7,\n\t44537 - 44032: 0xB1D8,\n\t44538 - 44032: 0x8341,\n\t44539 - 44032: 0x8342,\n\t44540 - 44032: 0xB1D9,\n\t44541 - 44032: 0x8343,\n\t44542 - 44032: 0x8344,\n\t44543 - 44032: 0xB1DA,\n\t44544 - 44032: 0xB1DB,\n\t44545 - 44032: 0xB1DC,\n\t44546 - 44032: 0x8345,\n\t44547 - 44032: 0x8346,\n\t44548 - 44032: 0x8347,\n\t44549 - 44032: 0x8348,\n\t44550 - 44032: 0x8349,\n\t44551 - 44032: 0x834A,\n\t44552 - 44032: 0xB1DD,\n\t44553 - 44032: 0xB1DE,\n\t44554 - 44032: 0x834B,\n\t44555 - 44032: 0xB1DF,\n\t44556 - 44032: 0x834C,\n\t44557 - 44032: 0xB1E0,\n\t44558 - 44032: 0x834D,\n\t44559 - 44032: 0x834E,\n\t44560 - 44032: 0x834F,\n\t44561 - 44032: 0x8350,\n\t44562 - 44032: 0x8351,\n\t44563 - 44032: 0x8352,\n\t44564 - 44032: 0xB1E1,\n\t44565 - 44032: 0x8353,\n\t44566 - 44032: 0x8354,\n\t44567 - 44032: 0x8355,\n\t44568 - 44032: 0x8356,\n\t44569 - 44032: 0x8357,\n\t44570 - 44032: 0x8358,\n\t44571 - 44032: 0x8359,\n\t44572 - 44032: 0x835A,\n\t44573 - 44032: 0x8361,\n\t44574 - 44032: 0x8362,\n\t44575 - 44032: 0x8363,\n\t44576 - 44032: 0x8364,\n\t44577 - 44032: 0x8365,\n\t44578 - 44032: 0x8366,\n\t44579 - 44032: 0x8367,\n\t44580 - 44032: 0x8368,\n\t44581 - 44032: 0x8369,\n\t44582 - 44032: 0x836A,\n\t44583 - 44032: 0x836B,\n\t44584 - 44032: 0x836C,\n\t44585 - 44032: 0x836D,\n\t44586 - 44032: 0x836E,\n\t44587 - 44032: 0x836F,\n\t44588 - 44032: 0x8370,\n\t44589 - 44032: 0x8371,\n\t44590 - 44032: 0x8372,\n\t44591 - 44032: 0x8373,\n\t44592 - 44032: 0xB1E2,\n\t44593 - 44032: 0xB1E3,\n\t44594 - 44032: 0x8374,\n\t44595 - 44032: 0x8375,\n\t44596 - 44032: 0xB1E4,\n\t44597 - 44032: 0x8376,\n\t44598 - 44032: 0x8377,\n\t44599 - 44032: 0xB1E5,\n\t44600 - 44032: 0xB1E6,\n\t44601 - 44032: 0x8378,\n\t44602 - 44032: 0xB1E7,\n\t44603 - 44032: 0x8379,\n\t44604 - 44032: 0x837A,\n\t44605 - 44032: 0x8381,\n\t44606 - 44032: 0x8382,\n\t44607 - 44032: 0x8383,\n\t44608 - 44032: 0xB1E8,\n\t44609 - 44032: 0xB1E9,\n\t44610 - 44032: 0x8384,\n\t44611 - 44032: 0xB1EA,\n\t44612 - 44032: 0x8385,\n\t44613 - 44032: 0xB1EB,\n\t44614 - 44032: 0xB1EC,\n\t44615 - 44032: 0x8386,\n\t44616 - 44032: 0x8387,\n\t44617 - 44032: 0x8388,\n\t44618 - 44032: 0xB1ED,\n\t44619 - 44032: 0x8389,\n\t44620 - 44032: 0xB1EE,\n\t44621 - 44032: 0xB1EF,\n\t44622 - 44032: 0xB1F0,\n\t44623 - 44032: 0x838A,\n\t44624 - 44032: 0xB1F1,\n\t44625 - 44032: 0x838B,\n\t44626 - 44032: 0x838C,\n\t44627 - 44032: 0x838D,\n\t44628 - 44032: 0xB1F2,\n\t44629 - 44032: 0x838E,\n\t44630 - 44032: 0xB1F3,\n\t44631 - 44032: 0x838F,\n\t44632 - 44032: 0x8390,\n\t44633 - 44032: 0x8391,\n\t44634 - 44032: 0x8392,\n\t44635 - 44032: 0x8393,\n\t44636 - 44032: 0xB1F4,\n\t44637 - 44032: 0xB1F5,\n\t44638 - 44032: 0x8394,\n\t44639 - 44032: 0xB1F6,\n\t44640 - 44032: 0xB1F7,\n\t44641 - 44032: 0xB1F8,\n\t44642 - 44032: 0x8395,\n\t44643 - 44032: 0x8396,\n\t44644 - 44032: 0x8397,\n\t44645 - 44032: 0xB1F9,\n\t44646 - 44032: 0x8398,\n\t44647 - 44032: 0x8399,\n\t44648 - 44032: 0xB1FA,\n\t44649 - 44032: 0xB1FB,\n\t44650 - 44032: 0x839A,\n\t44651 - 44032: 0x839B,\n\t44652 - 44032: 0xB1FC,\n\t44653 - 44032: 0x839C,\n\t44654 - 44032: 0x839D,\n\t44655 - 44032: 0x839E,\n\t44656 - 44032: 0xB1FD,\n\t44657 - 44032: 0x839F,\n\t44658 - 44032: 0x83A0,\n\t44659 - 44032: 0x83A1,\n\t44660 - 44032: 0x83A2,\n\t44661 - 44032: 0x83A3,\n\t44662 - 44032: 0x83A4,\n\t44663 - 44032: 0x83A5,\n\t44664 - 44032: 0xB1FE,\n\t44665 - 44032: 0xB2A1,\n\t44666 - 44032: 0x83A6,\n\t44667 - 44032: 0xB2A2,\n\t44668 - 44032: 0xB2A3,\n\t44669 - 44032: 0xB2A4,\n\t44670 - 44032: 0x83A7,\n\t44671 - 44032: 0x83A8,\n\t44672 - 44032: 0x83A9,\n\t44673 - 44032: 0x83AA,\n\t44674 - 44032: 0x83AB,\n\t44675 - 44032: 0x83AC,\n\t44676 - 44032: 0xB2A5,\n\t44677 - 44032: 0xB2A6,\n\t44678 - 44032: 0x83AD,\n\t44679 - 44032: 0x83AE,\n\t44680 - 44032: 0x83AF,\n\t44681 - 44032: 0x83B0,\n\t44682 - 44032: 0x83B1,\n\t44683 - 44032: 0x83B2,\n\t44684 - 44032: 0xB2A7,\n\t44685 - 44032: 0x83B3,\n\t44686 - 44032: 0x83B4,\n\t44687 - 44032: 0x83B5,\n\t44688 - 44032: 0x83B6,\n\t44689 - 44032: 0x83B7,\n\t44690 - 44032: 0x83B8,\n\t44691 - 44032: 0x83B9,\n\t44692 - 44032: 0x83BA,\n\t44693 - 44032: 0x83BB,\n\t44694 - 44032: 0x83BC,\n\t44695 - 44032: 0x83BD,\n\t44696 - 44032: 0x83BE,\n\t44697 - 44032: 0x83BF,\n\t44698 - 44032: 0x83C0,\n\t44699 - 44032: 0x83C1,\n\t44700 - 44032: 0x83C2,\n\t44701 - 44032: 0x83C3,\n\t44702 - 44032: 0x83C4,\n\t44703 - 44032: 0x83C5,\n\t44704 - 44032: 0x83C6,\n\t44705 - 44032: 0x83C7,\n\t44706 - 44032: 0x83C8,\n\t44707 - 44032: 0x83C9,\n\t44708 - 44032: 0x83CA,\n\t44709 - 44032: 0x83CB,\n\t44710 - 44032: 0x83CC,\n\t44711 - 44032: 0x83CD,\n\t44712 - 44032: 0x83CE,\n\t44713 - 44032: 0x83CF,\n\t44714 - 44032: 0x83D0,\n\t44715 - 44032: 0x83D1,\n\t44716 - 44032: 0x83D2,\n\t44717 - 44032: 0x83D3,\n\t44718 - 44032: 0x83D4,\n\t44719 - 44032: 0x83D5,\n\t44720 - 44032: 0x83D6,\n\t44721 - 44032: 0x83D7,\n\t44722 - 44032: 0x83D8,\n\t44723 - 44032: 0x83D9,\n\t44724 - 44032: 0x83DA,\n\t44725 - 44032: 0x83DB,\n\t44726 - 44032: 0x83DC,\n\t44727 - 44032: 0x83DD,\n\t44728 - 44032: 0x83DE,\n\t44729 - 44032: 0x83DF,\n\t44730 - 44032: 0x83E0,\n\t44731 - 44032: 0x83E1,\n\t44732 - 44032: 0xB2A8,\n\t44733 - 44032: 0xB2A9,\n\t44734 - 44032: 0xB2AA,\n\t44735 - 44032: 0x83E2,\n\t44736 - 44032: 0xB2AB,\n\t44737 - 44032: 0x83E3,\n\t44738 - 44032: 0x83E4,\n\t44739 - 44032: 0x83E5,\n\t44740 - 44032: 0xB2AC,\n\t44741 - 44032: 0x83E6,\n\t44742 - 44032: 0x83E7,\n\t44743 - 44032: 0x83E8,\n\t44744 - 44032: 0x83E9,\n\t44745 - 44032: 0x83EA,\n\t44746 - 44032: 0x83EB,\n\t44747 - 44032: 0x83EC,\n\t44748 - 44032: 0xB2AD,\n\t44749 - 44032: 0xB2AE,\n\t44750 - 44032: 0x83ED,\n\t44751 - 44032: 0xB2AF,\n\t44752 - 44032: 0xB2B0,\n\t44753 - 44032: 0xB2B1,\n\t44754 - 44032: 0x83EE,\n\t44755 - 44032: 0x83EF,\n\t44756 - 44032: 0x83F0,\n\t44757 - 44032: 0x83F1,\n\t44758 - 44032: 0x83F2,\n\t44759 - 44032: 0x83F3,\n\t44760 - 44032: 0xB2B2,\n\t44761 - 44032: 0xB2B3,\n\t44762 - 44032: 0x83F4,\n\t44763 - 44032: 0x83F5,\n\t44764 - 44032: 0xB2B4,\n\t44765 - 44032: 0x83F6,\n\t44766 - 44032: 0x83F7,\n\t44767 - 44032: 0x83F8,\n\t44768 - 44032: 0x83F9,\n\t44769 - 44032: 0x83FA,\n\t44770 - 44032: 0x83FB,\n\t44771 - 44032: 0x83FC,\n\t44772 - 44032: 0x83FD,\n\t44773 - 44032: 0x83FE,\n\t44774 - 44032: 0x8441,\n\t44775 - 44032: 0x8442,\n\t44776 - 44032: 0xB2B5,\n\t44777 - 44032: 0x8443,\n\t44778 - 44032: 0x8444,\n\t44779 - 44032: 0xB2B6,\n\t44780 - 44032: 0x8445,\n\t44781 - 44032: 0xB2B7,\n\t44782 - 44032: 0x8446,\n\t44783 - 44032: 0x8447,\n\t44784 - 44032: 0x8448,\n\t44785 - 44032: 0x8449,\n\t44786 - 44032: 0x844A,\n\t44787 - 44032: 0x844B,\n\t44788 - 44032: 0xB2B8,\n\t44789 - 44032: 0x844C,\n\t44790 - 44032: 0x844D,\n\t44791 - 44032: 0x844E,\n\t44792 - 44032: 0xB2B9,\n\t44793 - 44032: 0x844F,\n\t44794 - 44032: 0x8450,\n\t44795 - 44032: 0x8451,\n\t44796 - 44032: 0xB2BA,\n\t44797 - 44032: 0x8452,\n\t44798 - 44032: 0x8453,\n\t44799 - 44032: 0x8454,\n\t44800 - 44032: 0x8455,\n\t44801 - 44032: 0x8456,\n\t44802 - 44032: 0x8457,\n\t44803 - 44032: 0x8458,\n\t44804 - 44032: 0x8459,\n\t44805 - 44032: 0x845A,\n\t44806 - 44032: 0x8461,\n\t44807 - 44032: 0xB2BB,\n\t44808 - 44032: 0xB2BC,\n\t44809 - 44032: 0x8462,\n\t44810 - 44032: 0x8463,\n\t44811 - 44032: 0x8464,\n\t44812 - 44032: 0x8465,\n\t44813 - 44032: 0xB2BD,\n\t44814 - 44032: 0x8466,\n\t44815 - 44032: 0x8467,\n\t44816 - 44032: 0xB2BE,\n\t44817 - 44032: 0x8468,\n\t44818 - 44032: 0x8469,\n\t44819 - 44032: 0x846A,\n\t44820 - 44032: 0x846B,\n\t44821 - 44032: 0x846C,\n\t44822 - 44032: 0x846D,\n\t44823 - 44032: 0x846E,\n\t44824 - 44032: 0x846F,\n\t44825 - 44032: 0x8470,\n\t44826 - 44032: 0x8471,\n\t44827 - 44032: 0x8472,\n\t44828 - 44032: 0x8473,\n\t44829 - 44032: 0x8474,\n\t44830 - 44032: 0x8475,\n\t44831 - 44032: 0x8476,\n\t44832 - 44032: 0x8477,\n\t44833 - 44032: 0x8478,\n\t44834 - 44032: 0x8479,\n\t44835 - 44032: 0x847A,\n\t44836 - 44032: 0x8481,\n\t44837 - 44032: 0x8482,\n\t44838 - 44032: 0x8483,\n\t44839 - 44032: 0x8484,\n\t44840 - 44032: 0x8485,\n\t44841 - 44032: 0x8486,\n\t44842 - 44032: 0x8487,\n\t44843 - 44032: 0x8488,\n\t44844 - 44032: 0xB2BF,\n\t44845 - 44032: 0xB2C0,\n\t44846 - 44032: 0x8489,\n\t44847 - 44032: 0x848A,\n\t44848 - 44032: 0xB2C1,\n\t44849 - 44032: 0x848B,\n\t44850 - 44032: 0xB2C2,\n\t44851 - 44032: 0x848C,\n\t44852 - 44032: 0xB2C3,\n\t44853 - 44032: 0x848D,\n\t44854 - 44032: 0x848E,\n\t44855 - 44032: 0x848F,\n\t44856 - 44032: 0x8490,\n\t44857 - 44032: 0x8491,\n\t44858 - 44032: 0x8492,\n\t44859 - 44032: 0x8493,\n\t44860 - 44032: 0xB2C4,\n\t44861 - 44032: 0xB2C5,\n\t44862 - 44032: 0x8494,\n\t44863 - 44032: 0xB2C6,\n\t44864 - 44032: 0x8495,\n\t44865 - 44032: 0xB2C7,\n\t44866 - 44032: 0xB2C8,\n\t44867 - 44032: 0xB2C9,\n\t44868 - 44032: 0x8496,\n\t44869 - 44032: 0x8497,\n\t44870 - 44032: 0x8498,\n\t44871 - 44032: 0x8499,\n\t44872 - 44032: 0xB2CA,\n\t44873 - 44032: 0xB2CB,\n\t44874 - 44032: 0x849A,\n\t44875 - 44032: 0x849B,\n\t44876 - 44032: 0x849C,\n\t44877 - 44032: 0x849D,\n\t44878 - 44032: 0x849E,\n\t44879 - 44032: 0x849F,\n\t44880 - 44032: 0xB2CC,\n\t44881 - 44032: 0x84A0,\n\t44882 - 44032: 0x84A1,\n\t44883 - 44032: 0x84A2,\n\t44884 - 44032: 0x84A3,\n\t44885 - 44032: 0x84A4,\n\t44886 - 44032: 0x84A5,\n\t44887 - 44032: 0x84A6,\n\t44888 - 44032: 0x84A7,\n\t44889 - 44032: 0x84A8,\n\t44890 - 44032: 0x84A9,\n\t44891 - 44032: 0x84AA,\n\t44892 - 44032: 0xB2CD,\n\t44893 - 44032: 0xB2CE,\n\t44894 - 44032: 0x84AB,\n\t44895 - 44032: 0x84AC,\n\t44896 - 44032: 0x84AD,\n\t44897 - 44032: 0x84AE,\n\t44898 - 44032: 0x84AF,\n\t44899 - 44032: 0x84B0,\n\t44900 - 44032: 0xB2CF,\n\t44901 - 44032: 0xB2D0,\n\t44902 - 44032: 0x84B1,\n\t44903 - 44032: 0x84B2,\n\t44904 - 44032: 0x84B3,\n\t44905 - 44032: 0x84B4,\n\t44906 - 44032: 0x84B5,\n\t44907 - 44032: 0x84B6,\n\t44908 - 44032: 0x84B7,\n\t44909 - 44032: 0x84B8,\n\t44910 - 44032: 0x84B9,\n\t44911 - 44032: 0x84BA,\n\t44912 - 44032: 0x84BB,\n\t44913 - 44032: 0x84BC,\n\t44914 - 44032: 0x84BD,\n\t44915 - 44032: 0x84BE,\n\t44916 - 44032: 0x84BF,\n\t44917 - 44032: 0x84C0,\n\t44918 - 44032: 0x84C1,\n\t44919 - 44032: 0x84C2,\n\t44920 - 44032: 0x84C3,\n\t44921 - 44032: 0xB2D1,\n\t44922 - 44032: 0x84C4,\n\t44923 - 44032: 0x84C5,\n\t44924 - 44032: 0x84C6,\n\t44925 - 44032: 0x84C7,\n\t44926 - 44032: 0x84C8,\n\t44927 - 44032: 0x84C9,\n\t44928 - 44032: 0xB2D2,\n\t44929 - 44032: 0x84CA,\n\t44930 - 44032: 0x84CB,\n\t44931 - 44032: 0x84CC,\n\t44932 - 44032: 0xB2D3,\n\t44933 - 44032: 0x84CD,\n\t44934 - 44032: 0x84CE,\n\t44935 - 44032: 0x84CF,\n\t44936 - 44032: 0xB2D4,\n\t44937 - 44032: 0x84D0,\n\t44938 - 44032: 0x84D1,\n\t44939 - 44032: 0x84D2,\n\t44940 - 44032: 0x84D3,\n\t44941 - 44032: 0x84D4,\n\t44942 - 44032: 0x84D5,\n\t44943 - 44032: 0x84D6,\n\t44944 - 44032: 0xB2D5,\n\t44945 - 44032: 0xB2D6,\n\t44946 - 44032: 0x84D7,\n\t44947 - 44032: 0x84D8,\n\t44948 - 44032: 0x84D9,\n\t44949 - 44032: 0xB2D7,\n\t44950 - 44032: 0x84DA,\n\t44951 - 44032: 0x84DB,\n\t44952 - 44032: 0x84DC,\n\t44953 - 44032: 0x84DD,\n\t44954 - 44032: 0x84DE,\n\t44955 - 44032: 0x84DF,\n\t44956 - 44032: 0xB2D8,\n\t44957 - 44032: 0x84E0,\n\t44958 - 44032: 0x84E1,\n\t44959 - 44032: 0x84E2,\n\t44960 - 44032: 0x84E3,\n\t44961 - 44032: 0x84E4,\n\t44962 - 44032: 0x84E5,\n\t44963 - 44032: 0x84E6,\n\t44964 - 44032: 0x84E7,\n\t44965 - 44032: 0x84E8,\n\t44966 - 44032: 0x84E9,\n\t44967 - 44032: 0x84EA,\n\t44968 - 44032: 0x84EB,\n\t44969 - 44032: 0x84EC,\n\t44970 - 44032: 0x84ED,\n\t44971 - 44032: 0x84EE,\n\t44972 - 44032: 0x84EF,\n\t44973 - 44032: 0x84F0,\n\t44974 - 44032: 0x84F1,\n\t44975 - 44032: 0x84F2,\n\t44976 - 44032: 0x84F3,\n\t44977 - 44032: 0x84F4,\n\t44978 - 44032: 0x84F5,\n\t44979 - 44032: 0x84F6,\n\t44980 - 44032: 0x84F7,\n\t44981 - 44032: 0x84F8,\n\t44982 - 44032: 0x84F9,\n\t44983 - 44032: 0x84FA,\n\t44984 - 44032: 0xB2D9,\n\t44985 - 44032: 0xB2DA,\n\t44986 - 44032: 0x84FB,\n\t44987 - 44032: 0x84FC,\n\t44988 - 44032: 0xB2DB,\n\t44989 - 44032: 0x84FD,\n\t44990 - 44032: 0x84FE,\n\t44991 - 44032: 0x8541,\n\t44992 - 44032: 0xB2DC,\n\t44993 - 44032: 0x8542,\n\t44994 - 44032: 0x8543,\n\t44995 - 44032: 0x8544,\n\t44996 - 44032: 0x8545,\n\t44997 - 44032: 0x8546,\n\t44998 - 44032: 0x8547,\n\t44999 - 44032: 0xB2DD,\n\t45000 - 44032: 0xB2DE,\n\t45001 - 44032: 0xB2DF,\n\t45002 - 44032: 0x8548,\n\t45003 - 44032: 0xB2E0,\n\t45004 - 44032: 0x8549,\n\t45005 - 44032: 0xB2E1,\n\t45006 - 44032: 0xB2E2,\n\t45007 - 44032: 0x854A,\n\t45008 - 44032: 0x854B,\n\t45009 - 44032: 0x854C,\n\t45010 - 44032: 0x854D,\n\t45011 - 44032: 0x854E,\n\t45012 - 44032: 0xB2E3,\n\t45013 - 44032: 0x854F,\n\t45014 - 44032: 0x8550,\n\t45015 - 44032: 0x8551,\n\t45016 - 44032: 0x8552,\n\t45017 - 44032: 0x8553,\n\t45018 - 44032: 0x8554,\n\t45019 - 44032: 0x8555,\n\t45020 - 44032: 0xB2E4,\n\t45021 - 44032: 0x8556,\n\t45022 - 44032: 0x8557,\n\t45023 - 44032: 0x8558,\n\t45024 - 44032: 0x8559,\n\t45025 - 44032: 0x855A,\n\t45026 - 44032: 0x8561,\n\t45027 - 44032: 0x8562,\n\t45028 - 44032: 0x8563,\n\t45029 - 44032: 0x8564,\n\t45030 - 44032: 0x8565,\n\t45031 - 44032: 0x8566,\n\t45032 - 44032: 0xB2E5,\n\t45033 - 44032: 0xB2E6,\n\t45034 - 44032: 0x8567,\n\t45035 - 44032: 0x8568,\n\t45036 - 44032: 0x8569,\n\t45037 - 44032: 0x856A,\n\t45038 - 44032: 0x856B,\n\t45039 - 44032: 0x856C,\n\t45040 - 44032: 0xB2E7,\n\t45041 - 44032: 0xB2E8,\n\t45042 - 44032: 0x856D,\n\t45043 - 44032: 0x856E,\n\t45044 - 44032: 0xB2E9,\n\t45045 - 44032: 0x856F,\n\t45046 - 44032: 0x8570,\n\t45047 - 44032: 0x8571,\n\t45048 - 44032: 0xB2EA,\n\t45049 - 44032: 0x8572,\n\t45050 - 44032: 0x8573,\n\t45051 - 44032: 0x8574,\n\t45052 - 44032: 0x8575,\n\t45053 - 44032: 0x8576,\n\t45054 - 44032: 0x8577,\n\t45055 - 44032: 0x8578,\n\t45056 - 44032: 0xB2EB,\n\t45057 - 44032: 0xB2EC,\n\t45058 - 44032: 0x8579,\n\t45059 - 44032: 0x857A,\n\t45060 - 44032: 0xB2ED,\n\t45061 - 44032: 0x8581,\n\t45062 - 44032: 0x8582,\n\t45063 - 44032: 0x8583,\n\t45064 - 44032: 0x8584,\n\t45065 - 44032: 0x8585,\n\t45066 - 44032: 0x8586,\n\t45067 - 44032: 0x8587,\n\t45068 - 44032: 0xB2EE,\n\t45069 - 44032: 0x8588,\n\t45070 - 44032: 0x8589,\n\t45071 - 44032: 0x858A,\n\t45072 - 44032: 0xB2EF,\n\t45073 - 44032: 0x858B,\n\t45074 - 44032: 0x858C,\n\t45075 - 44032: 0x858D,\n\t45076 - 44032: 0xB2F0,\n\t45077 - 44032: 0x858E,\n\t45078 - 44032: 0x858F,\n\t45079 - 44032: 0x8590,\n\t45080 - 44032: 0x8591,\n\t45081 - 44032: 0x8592,\n\t45082 - 44032: 0x8593,\n\t45083 - 44032: 0x8594,\n\t45084 - 44032: 0xB2F1,\n\t45085 - 44032: 0xB2F2,\n\t45086 - 44032: 0x8595,\n\t45087 - 44032: 0x8596,\n\t45088 - 44032: 0x8597,\n\t45089 - 44032: 0x8598,\n\t45090 - 44032: 0x8599,\n\t45091 - 44032: 0x859A,\n\t45092 - 44032: 0x859B,\n\t45093 - 44032: 0x859C,\n\t45094 - 44032: 0x859D,\n\t45095 - 44032: 0x859E,\n\t45096 - 44032: 0xB2F3,\n\t45097 - 44032: 0x859F,\n\t45098 - 44032: 0x85A0,\n\t45099 - 44032: 0x85A1,\n\t45100 - 44032: 0x85A2,\n\t45101 - 44032: 0x85A3,\n\t45102 - 44032: 0x85A4,\n\t45103 - 44032: 0x85A5,\n\t45104 - 44032: 0x85A6,\n\t45105 - 44032: 0x85A7,\n\t45106 - 44032: 0x85A8,\n\t45107 - 44032: 0x85A9,\n\t45108 - 44032: 0x85AA,\n\t45109 - 44032: 0x85AB,\n\t45110 - 44032: 0x85AC,\n\t45111 - 44032: 0x85AD,\n\t45112 - 44032: 0x85AE,\n\t45113 - 44032: 0x85AF,\n\t45114 - 44032: 0x85B0,\n\t45115 - 44032: 0x85B1,\n\t45116 - 44032: 0x85B2,\n\t45117 - 44032: 0x85B3,\n\t45118 - 44032: 0x85B4,\n\t45119 - 44032: 0x85B5,\n\t45120 - 44032: 0x85B6,\n\t45121 - 44032: 0x85B7,\n\t45122 - 44032: 0x85B8,\n\t45123 - 44032: 0x85B9,\n\t45124 - 44032: 0xB2F4,\n\t45125 - 44032: 0xB2F5,\n\t45126 - 44032: 0x85BA,\n\t45127 - 44032: 0x85BB,\n\t45128 - 44032: 0xB2F6,\n\t45129 - 44032: 0x85BC,\n\t45130 - 44032: 0xB2F7,\n\t45131 - 44032: 0x85BD,\n\t45132 - 44032: 0xB2F8,\n\t45133 - 44032: 0x85BE,\n\t45134 - 44032: 0xB2F9,\n\t45135 - 44032: 0x85BF,\n\t45136 - 44032: 0x85C0,\n\t45137 - 44032: 0x85C1,\n\t45138 - 44032: 0x85C2,\n\t45139 - 44032: 0xB2FA,\n\t45140 - 44032: 0xB2FB,\n\t45141 - 44032: 0xB2FC,\n\t45142 - 44032: 0x85C3,\n\t45143 - 44032: 0xB2FD,\n\t45144 - 44032: 0x85C4,\n\t45145 - 44032: 0xB2FE,\n\t45146 - 44032: 0x85C5,\n\t45147 - 44032: 0x85C6,\n\t45148 - 44032: 0x85C7,\n\t45149 - 44032: 0xB3A1,\n\t45150 - 44032: 0x85C8,\n\t45151 - 44032: 0x85C9,\n\t45152 - 44032: 0x85CA,\n\t45153 - 44032: 0x85CB,\n\t45154 - 44032: 0x85CC,\n\t45155 - 44032: 0x85CD,\n\t45156 - 44032: 0x85CE,\n\t45157 - 44032: 0x85CF,\n\t45158 - 44032: 0x85D0,\n\t45159 - 44032: 0x85D1,\n\t45160 - 44032: 0x85D2,\n\t45161 - 44032: 0x85D3,\n\t45162 - 44032: 0x85D4,\n\t45163 - 44032: 0x85D5,\n\t45164 - 44032: 0x85D6,\n\t45165 - 44032: 0x85D7,\n\t45166 - 44032: 0x85D8,\n\t45167 - 44032: 0x85D9,\n\t45168 - 44032: 0x85DA,\n\t45169 - 44032: 0x85DB,\n\t45170 - 44032: 0x85DC,\n\t45171 - 44032: 0x85DD,\n\t45172 - 44032: 0x85DE,\n\t45173 - 44032: 0x85DF,\n\t45174 - 44032: 0x85E0,\n\t45175 - 44032: 0x85E1,\n\t45176 - 44032: 0x85E2,\n\t45177 - 44032: 0x85E3,\n\t45178 - 44032: 0x85E4,\n\t45179 - 44032: 0x85E5,\n\t45180 - 44032: 0xB3A2,\n\t45181 - 44032: 0xB3A3,\n\t45182 - 44032: 0x85E6,\n\t45183 - 44032: 0x85E7,\n\t45184 - 44032: 0xB3A4,\n\t45185 - 44032: 0x85E8,\n\t45186 - 44032: 0x85E9,\n\t45187 - 44032: 0x85EA,\n\t45188 - 44032: 0xB3A5,\n\t45189 - 44032: 0x85EB,\n\t45190 - 44032: 0x85EC,\n\t45191 - 44032: 0x85ED,\n\t45192 - 44032: 0x85EE,\n\t45193 - 44032: 0x85EF,\n\t45194 - 44032: 0x85F0,\n\t45195 - 44032: 0x85F1,\n\t45196 - 44032: 0xB3A6,\n\t45197 - 44032: 0xB3A7,\n\t45198 - 44032: 0x85F2,\n\t45199 - 44032: 0xB3A8,\n\t45200 - 44032: 0x85F3,\n\t45201 - 44032: 0xB3A9,\n\t45202 - 44032: 0x85F4,\n\t45203 - 44032: 0x85F5,\n\t45204 - 44032: 0x85F6,\n\t45205 - 44032: 0x85F7,\n\t45206 - 44032: 0x85F8,\n\t45207 - 44032: 0x85F9,\n\t45208 - 44032: 0xB3AA,\n\t45209 - 44032: 0xB3AB,\n\t45210 - 44032: 0xB3AC,\n\t45211 - 44032: 0x85FA,\n\t45212 - 44032: 0xB3AD,\n\t45213 - 44032: 0x85FB,\n\t45214 - 44032: 0x85FC,\n\t45215 - 44032: 0xB3AE,\n\t45216 - 44032: 0xB3AF,\n\t45217 - 44032: 0xB3B0,\n\t45218 - 44032: 0xB3B1,\n\t45219 - 44032: 0x85FD,\n\t45220 - 44032: 0x85FE,\n\t45221 - 44032: 0x8641,\n\t45222 - 44032: 0x8642,\n\t45223 - 44032: 0x8643,\n\t45224 - 44032: 0xB3B2,\n\t45225 - 44032: 0xB3B3,\n\t45226 - 44032: 0x8644,\n\t45227 - 44032: 0xB3B4,\n\t45228 - 44032: 0xB3B5,\n\t45229 - 44032: 0xB3B6,\n\t45230 - 44032: 0xB3B7,\n\t45231 - 44032: 0xB3B8,\n\t45232 - 44032: 0x8645,\n\t45233 - 44032: 0xB3B9,\n\t45234 - 44032: 0x8646,\n\t45235 - 44032: 0xB3BA,\n\t45236 - 44032: 0xB3BB,\n\t45237 - 44032: 0xB3BC,\n\t45238 - 44032: 0x8647,\n\t45239 - 44032: 0x8648,\n\t45240 - 44032: 0xB3BD,\n\t45241 - 44032: 0x8649,\n\t45242 - 44032: 0x864A,\n\t45243 - 44032: 0x864B,\n\t45244 - 44032: 0xB3BE,\n\t45245 - 44032: 0x864C,\n\t45246 - 44032: 0x864D,\n\t45247 - 44032: 0x864E,\n\t45248 - 44032: 0x864F,\n\t45249 - 44032: 0x8650,\n\t45250 - 44032: 0x8651,\n\t45251 - 44032: 0x8652,\n\t45252 - 44032: 0xB3BF,\n\t45253 - 44032: 0xB3C0,\n\t45254 - 44032: 0x8653,\n\t45255 - 44032: 0xB3C1,\n\t45256 - 44032: 0xB3C2,\n\t45257 - 44032: 0xB3C3,\n\t45258 - 44032: 0x8654,\n\t45259 - 44032: 0x8655,\n\t45260 - 44032: 0x8656,\n\t45261 - 44032: 0x8657,\n\t45262 - 44032: 0x8658,\n\t45263 - 44032: 0x8659,\n\t45264 - 44032: 0xB3C4,\n\t45265 - 44032: 0xB3C5,\n\t45266 - 44032: 0x865A,\n\t45267 - 44032: 0x8661,\n\t45268 - 44032: 0xB3C6,\n\t45269 - 44032: 0x8662,\n\t45270 - 44032: 0x8663,\n\t45271 - 44032: 0x8664,\n\t45272 - 44032: 0xB3C7,\n\t45273 - 44032: 0x8665,\n\t45274 - 44032: 0x8666,\n\t45275 - 44032: 0x8667,\n\t45276 - 44032: 0x8668,\n\t45277 - 44032: 0x8669,\n\t45278 - 44032: 0x866A,\n\t45279 - 44032: 0x866B,\n\t45280 - 44032: 0xB3C8,\n\t45281 - 44032: 0x866C,\n\t45282 - 44032: 0x866D,\n\t45283 - 44032: 0x866E,\n\t45284 - 44032: 0x866F,\n\t45285 - 44032: 0xB3C9,\n\t45286 - 44032: 0x8670,\n\t45287 - 44032: 0x8671,\n\t45288 - 44032: 0x8672,\n\t45289 - 44032: 0x8673,\n\t45290 - 44032: 0x8674,\n\t45291 - 44032: 0x8675,\n\t45292 - 44032: 0x8676,\n\t45293 - 44032: 0x8677,\n\t45294 - 44032: 0x8678,\n\t45295 - 44032: 0x8679,\n\t45296 - 44032: 0x867A,\n\t45297 - 44032: 0x8681,\n\t45298 - 44032: 0x8682,\n\t45299 - 44032: 0x8683,\n\t45300 - 44032: 0x8684,\n\t45301 - 44032: 0x8685,\n\t45302 - 44032: 0x8686,\n\t45303 - 44032: 0x8687,\n\t45304 - 44032: 0x8688,\n\t45305 - 44032: 0x8689,\n\t45306 - 44032: 0x868A,\n\t45307 - 44032: 0x868B,\n\t45308 - 44032: 0x868C,\n\t45309 - 44032: 0x868D,\n\t45310 - 44032: 0x868E,\n\t45311 - 44032: 0x868F,\n\t45312 - 44032: 0x8690,\n\t45313 - 44032: 0x8691,\n\t45314 - 44032: 0x8692,\n\t45315 - 44032: 0x8693,\n\t45316 - 44032: 0x8694,\n\t45317 - 44032: 0x8695,\n\t45318 - 44032: 0x8696,\n\t45319 - 44032: 0x8697,\n\t45320 - 44032: 0xB3CA,\n\t45321 - 44032: 0xB3CB,\n\t45322 - 44032: 0x8698,\n\t45323 - 44032: 0xB3CC,\n\t45324 - 44032: 0xB3CD,\n\t45325 - 44032: 0x8699,\n\t45326 - 44032: 0x869A,\n\t45327 - 44032: 0x869B,\n\t45328 - 44032: 0xB3CE,\n\t45329 - 44032: 0x869C,\n\t45330 - 44032: 0xB3CF,\n\t45331 - 44032: 0xB3D0,\n\t45332 - 44032: 0x869D,\n\t45333 - 44032: 0x869E,\n\t45334 - 44032: 0x869F,\n\t45335 - 44032: 0x86A0,\n\t45336 - 44032: 0xB3D1,\n\t45337 - 44032: 0xB3D2,\n\t45338 - 44032: 0x86A1,\n\t45339 - 44032: 0xB3D3,\n\t45340 - 44032: 0xB3D4,\n\t45341 - 44032: 0xB3D5,\n\t45342 - 44032: 0x86A2,\n\t45343 - 44032: 0x86A3,\n\t45344 - 44032: 0x86A4,\n\t45345 - 44032: 0x86A5,\n\t45346 - 44032: 0x86A6,\n\t45347 - 44032: 0xB3D6,\n\t45348 - 44032: 0xB3D7,\n\t45349 - 44032: 0xB3D8,\n\t45350 - 44032: 0x86A7,\n\t45351 - 44032: 0x86A8,\n\t45352 - 44032: 0xB3D9,\n\t45353 - 44032: 0x86A9,\n\t45354 - 44032: 0x86AA,\n\t45355 - 44032: 0x86AB,\n\t45356 - 44032: 0xB3DA,\n\t45357 - 44032: 0x86AC,\n\t45358 - 44032: 0x86AD,\n\t45359 - 44032: 0x86AE,\n\t45360 - 44032: 0x86AF,\n\t45361 - 44032: 0x86B0,\n\t45362 - 44032: 0x86B1,\n\t45363 - 44032: 0x86B2,\n\t45364 - 44032: 0xB3DB,\n\t45365 - 44032: 0xB3DC,\n\t45366 - 44032: 0x86B3,\n\t45367 - 44032: 0xB3DD,\n\t45368 - 44032: 0xB3DE,\n\t45369 - 44032: 0xB3DF,\n\t45370 - 44032: 0x86B4,\n\t45371 - 44032: 0x86B5,\n\t45372 - 44032: 0x86B6,\n\t45373 - 44032: 0x86B7,\n\t45374 - 44032: 0x86B8,\n\t45375 - 44032: 0x86B9,\n\t45376 - 44032: 0xB3E0,\n\t45377 - 44032: 0xB3E1,\n\t45378 - 44032: 0x86BA,\n\t45379 - 44032: 0x86BB,\n\t45380 - 44032: 0xB3E2,\n\t45381 - 44032: 0x86BC,\n\t45382 - 44032: 0x86BD,\n\t45383 - 44032: 0x86BE,\n\t45384 - 44032: 0xB3E3,\n\t45385 - 44032: 0x86BF,\n\t45386 - 44032: 0x86C0,\n\t45387 - 44032: 0x86C1,\n\t45388 - 44032: 0x86C2,\n\t45389 - 44032: 0x86C3,\n\t45390 - 44032: 0x86C4,\n\t45391 - 44032: 0x86C5,\n\t45392 - 44032: 0xB3E4,\n\t45393 - 44032: 0xB3E5,\n\t45394 - 44032: 0x86C6,\n\t45395 - 44032: 0x86C7,\n\t45396 - 44032: 0xB3E6,\n\t45397 - 44032: 0xB3E7,\n\t45398 - 44032: 0x86C8,\n\t45399 - 44032: 0x86C9,\n\t45400 - 44032: 0xB3E8,\n\t45401 - 44032: 0x86CA,\n\t45402 - 44032: 0x86CB,\n\t45403 - 44032: 0x86CC,\n\t45404 - 44032: 0xB3E9,\n\t45405 - 44032: 0x86CD,\n\t45406 - 44032: 0x86CE,\n\t45407 - 44032: 0x86CF,\n\t45408 - 44032: 0xB3EA,\n\t45409 - 44032: 0x86D0,\n\t45410 - 44032: 0x86D1,\n\t45411 - 44032: 0x86D2,\n\t45412 - 44032: 0x86D3,\n\t45413 - 44032: 0x86D4,\n\t45414 - 44032: 0x86D5,\n\t45415 - 44032: 0x86D6,\n\t45416 - 44032: 0x86D7,\n\t45417 - 44032: 0x86D8,\n\t45418 - 44032: 0x86D9,\n\t45419 - 44032: 0x86DA,\n\t45420 - 44032: 0x86DB,\n\t45421 - 44032: 0x86DC,\n\t45422 - 44032: 0x86DD,\n\t45423 - 44032: 0x86DE,\n\t45424 - 44032: 0x86DF,\n\t45425 - 44032: 0x86E0,\n\t45426 - 44032: 0x86E1,\n\t45427 - 44032: 0x86E2,\n\t45428 - 44032: 0x86E3,\n\t45429 - 44032: 0x86E4,\n\t45430 - 44032: 0x86E5,\n\t45431 - 44032: 0x86E6,\n\t45432 - 44032: 0xB3EB,\n\t45433 - 44032: 0xB3EC,\n\t45434 - 44032: 0x86E7,\n\t45435 - 44032: 0x86E8,\n\t45436 - 44032: 0xB3ED,\n\t45437 - 44032: 0x86E9,\n\t45438 - 44032: 0x86EA,\n\t45439 - 44032: 0x86EB,\n\t45440 - 44032: 0xB3EE,\n\t45441 - 44032: 0x86EC,\n\t45442 - 44032: 0xB3EF,\n\t45443 - 44032: 0x86ED,\n\t45444 - 44032: 0x86EE,\n\t45445 - 44032: 0x86EF,\n\t45446 - 44032: 0x86F0,\n\t45447 - 44032: 0x86F1,\n\t45448 - 44032: 0xB3F0,\n\t45449 - 44032: 0xB3F1,\n\t45450 - 44032: 0x86F2,\n\t45451 - 44032: 0xB3F2,\n\t45452 - 44032: 0x86F3,\n\t45453 - 44032: 0xB3F3,\n\t45454 - 44032: 0x86F4,\n\t45455 - 44032: 0x86F5,\n\t45456 - 44032: 0x86F6,\n\t45457 - 44032: 0x86F7,\n\t45458 - 44032: 0xB3F4,\n\t45459 - 44032: 0xB3F5,\n\t45460 - 44032: 0xB3F6,\n\t45461 - 44032: 0x86F8,\n\t45462 - 44032: 0x86F9,\n\t45463 - 44032: 0x86FA,\n\t45464 - 44032: 0xB3F7,\n\t45465 - 44032: 0x86FB,\n\t45466 - 44032: 0x86FC,\n\t45467 - 44032: 0x86FD,\n\t45468 - 44032: 0xB3F8,\n\t45469 - 44032: 0x86FE,\n\t45470 - 44032: 0x8741,\n\t45471 - 44032: 0x8742,\n\t45472 - 44032: 0x8743,\n\t45473 - 44032: 0x8744,\n\t45474 - 44032: 0x8745,\n\t45475 - 44032: 0x8746,\n\t45476 - 44032: 0x8747,\n\t45477 - 44032: 0x8748,\n\t45478 - 44032: 0x8749,\n\t45479 - 44032: 0x874A,\n\t45480 - 44032: 0xB3F9,\n\t45481 - 44032: 0x874B,\n\t45482 - 44032: 0x874C,\n\t45483 - 44032: 0x874D,\n\t45484 - 44032: 0x874E,\n\t45485 - 44032: 0x874F,\n\t45486 - 44032: 0x8750,\n\t45487 - 44032: 0x8751,\n\t45488 - 44032: 0x8752,\n\t45489 - 44032: 0x8753,\n\t45490 - 44032: 0x8754,\n\t45491 - 44032: 0x8755,\n\t45492 - 44032: 0x8756,\n\t45493 - 44032: 0x8757,\n\t45494 - 44032: 0x8758,\n\t45495 - 44032: 0x8759,\n\t45496 - 44032: 0x875A,\n\t45497 - 44032: 0x8761,\n\t45498 - 44032: 0x8762,\n\t45499 - 44032: 0x8763,\n\t45500 - 44032: 0x8764,\n\t45501 - 44032: 0x8765,\n\t45502 - 44032: 0x8766,\n\t45503 - 44032: 0x8767,\n\t45504 - 44032: 0x8768,\n\t45505 - 44032: 0x8769,\n\t45506 - 44032: 0x876A,\n\t45507 - 44032: 0x876B,\n\t45508 - 44032: 0x876C,\n\t45509 - 44032: 0x876D,\n\t45510 - 44032: 0x876E,\n\t45511 - 44032: 0x876F,\n\t45512 - 44032: 0x8770,\n\t45513 - 44032: 0x8771,\n\t45514 - 44032: 0x8772,\n\t45515 - 44032: 0x8773,\n\t45516 - 44032: 0xB3FA,\n\t45517 - 44032: 0x8774,\n\t45518 - 44032: 0x8775,\n\t45519 - 44032: 0x8776,\n\t45520 - 44032: 0xB3FB,\n\t45521 - 44032: 0x8777,\n\t45522 - 44032: 0x8778,\n\t45523 - 44032: 0x8779,\n\t45524 - 44032: 0xB3FC,\n\t45525 - 44032: 0x877A,\n\t45526 - 44032: 0x8781,\n\t45527 - 44032: 0x8782,\n\t45528 - 44032: 0x8783,\n\t45529 - 44032: 0x8784,\n\t45530 - 44032: 0x8785,\n\t45531 - 44032: 0x8786,\n\t45532 - 44032: 0xB3FD,\n\t45533 - 44032: 0xB3FE,\n\t45534 - 44032: 0x8787,\n\t45535 - 44032: 0xB4A1,\n\t45536 - 44032: 0x8788,\n\t45537 - 44032: 0x8789,\n\t45538 - 44032: 0x878A,\n\t45539 - 44032: 0x878B,\n\t45540 - 44032: 0x878C,\n\t45541 - 44032: 0x878D,\n\t45542 - 44032: 0x878E,\n\t45543 - 44032: 0x878F,\n\t45544 - 44032: 0xB4A2,\n\t45545 - 44032: 0xB4A3,\n\t45546 - 44032: 0x8790,\n\t45547 - 44032: 0x8791,\n\t45548 - 44032: 0xB4A4,\n\t45549 - 44032: 0x8792,\n\t45550 - 44032: 0x8793,\n\t45551 - 44032: 0x8794,\n\t45552 - 44032: 0xB4A5,\n\t45553 - 44032: 0x8795,\n\t45554 - 44032: 0x8796,\n\t45555 - 44032: 0x8797,\n\t45556 - 44032: 0x8798,\n\t45557 - 44032: 0x8799,\n\t45558 - 44032: 0x879A,\n\t45559 - 44032: 0x879B,\n\t45560 - 44032: 0x879C,\n\t45561 - 44032: 0xB4A6,\n\t45562 - 44032: 0x879D,\n\t45563 - 44032: 0xB4A7,\n\t45564 - 44032: 0x879E,\n\t45565 - 44032: 0xB4A8,\n\t45566 - 44032: 0x879F,\n\t45567 - 44032: 0x87A0,\n\t45568 - 44032: 0x87A1,\n\t45569 - 44032: 0x87A2,\n\t45570 - 44032: 0x87A3,\n\t45571 - 44032: 0x87A4,\n\t45572 - 44032: 0xB4A9,\n\t45573 - 44032: 0xB4AA,\n\t45574 - 44032: 0x87A5,\n\t45575 - 44032: 0x87A6,\n\t45576 - 44032: 0xB4AB,\n\t45577 - 44032: 0x87A7,\n\t45578 - 44032: 0x87A8,\n\t45579 - 44032: 0xB4AC,\n\t45580 - 44032: 0xB4AD,\n\t45581 - 44032: 0x87A9,\n\t45582 - 44032: 0x87AA,\n\t45583 - 44032: 0x87AB,\n\t45584 - 44032: 0x87AC,\n\t45585 - 44032: 0x87AD,\n\t45586 - 44032: 0x87AE,\n\t45587 - 44032: 0x87AF,\n\t45588 - 44032: 0xB4AE,\n\t45589 - 44032: 0xB4AF,\n\t45590 - 44032: 0x87B0,\n\t45591 - 44032: 0xB4B0,\n\t45592 - 44032: 0x87B1,\n\t45593 - 44032: 0xB4B1,\n\t45594 - 44032: 0x87B2,\n\t45595 - 44032: 0x87B3,\n\t45596 - 44032: 0x87B4,\n\t45597 - 44032: 0x87B5,\n\t45598 - 44032: 0x87B6,\n\t45599 - 44032: 0x87B7,\n\t45600 - 44032: 0xB4B2,\n\t45601 - 44032: 0x87B8,\n\t45602 - 44032: 0x87B9,\n\t45603 - 44032: 0x87BA,\n\t45604 - 44032: 0x87BB,\n\t45605 - 44032: 0x87BC,\n\t45606 - 44032: 0x87BD,\n\t45607 - 44032: 0x87BE,\n\t45608 - 44032: 0x87BF,\n\t45609 - 44032: 0x87C0,\n\t45610 - 44032: 0x87C1,\n\t45611 - 44032: 0x87C2,\n\t45612 - 44032: 0x87C3,\n\t45613 - 44032: 0x87C4,\n\t45614 - 44032: 0x87C5,\n\t45615 - 44032: 0x87C6,\n\t45616 - 44032: 0x87C7,\n\t45617 - 44032: 0x87C8,\n\t45618 - 44032: 0x87C9,\n\t45619 - 44032: 0x87CA,\n\t45620 - 44032: 0xB4B3,\n\t45621 - 44032: 0x87CB,\n\t45622 - 44032: 0x87CC,\n\t45623 - 44032: 0x87CD,\n\t45624 - 44032: 0x87CE,\n\t45625 - 44032: 0x87CF,\n\t45626 - 44032: 0x87D0,\n\t45627 - 44032: 0x87D1,\n\t45628 - 44032: 0xB4B4,\n\t45629 - 44032: 0x87D2,\n\t45630 - 44032: 0x87D3,\n\t45631 - 44032: 0x87D4,\n\t45632 - 44032: 0x87D5,\n\t45633 - 44032: 0x87D6,\n\t45634 - 44032: 0x87D7,\n\t45635 - 44032: 0x87D8,\n\t45636 - 44032: 0x87D9,\n\t45637 - 44032: 0x87DA,\n\t45638 - 44032: 0x87DB,\n\t45639 - 44032: 0x87DC,\n\t45640 - 44032: 0x87DD,\n\t45641 - 44032: 0x87DE,\n\t45642 - 44032: 0x87DF,\n\t45643 - 44032: 0x87E0,\n\t45644 - 44032: 0x87E1,\n\t45645 - 44032: 0x87E2,\n\t45646 - 44032: 0x87E3,\n\t45647 - 44032: 0x87E4,\n\t45648 - 44032: 0x87E5,\n\t45649 - 44032: 0x87E6,\n\t45650 - 44032: 0x87E7,\n\t45651 - 44032: 0x87E8,\n\t45652 - 44032: 0x87E9,\n\t45653 - 44032: 0x87EA,\n\t45654 - 44032: 0x87EB,\n\t45655 - 44032: 0x87EC,\n\t45656 - 44032: 0xB4B5,\n\t45657 - 44032: 0x87ED,\n\t45658 - 44032: 0x87EE,\n\t45659 - 44032: 0x87EF,\n\t45660 - 44032: 0xB4B6,\n\t45661 - 44032: 0x87F0,\n\t45662 - 44032: 0x87F1,\n\t45663 - 44032: 0x87F2,\n\t45664 - 44032: 0xB4B7,\n\t45665 - 44032: 0x87F3,\n\t45666 - 44032: 0x87F4,\n\t45667 - 44032: 0x87F5,\n\t45668 - 44032: 0x87F6,\n\t45669 - 44032: 0x87F7,\n\t45670 - 44032: 0x87F8,\n\t45671 - 44032: 0x87F9,\n\t45672 - 44032: 0xB4B8,\n\t45673 - 44032: 0xB4B9,\n\t45674 - 44032: 0x87FA,\n\t45675 - 44032: 0x87FB,\n\t45676 - 44032: 0x87FC,\n\t45677 - 44032: 0x87FD,\n\t45678 - 44032: 0x87FE,\n\t45679 - 44032: 0x8841,\n\t45680 - 44032: 0x8842,\n\t45681 - 44032: 0x8843,\n\t45682 - 44032: 0x8844,\n\t45683 - 44032: 0x8845,\n\t45684 - 44032: 0xB4BA,\n\t45685 - 44032: 0xB4BB,\n\t45686 - 44032: 0x8846,\n\t45687 - 44032: 0x8847,\n\t45688 - 44032: 0x8848,\n\t45689 - 44032: 0x8849,\n\t45690 - 44032: 0x884A,\n\t45691 - 44032: 0x884B,\n\t45692 - 44032: 0xB4BC,\n\t45693 - 44032: 0x884C,\n\t45694 - 44032: 0x884D,\n\t45695 - 44032: 0x884E,\n\t45696 - 44032: 0x884F,\n\t45697 - 44032: 0x8850,\n\t45698 - 44032: 0x8851,\n\t45699 - 44032: 0x8852,\n\t45700 - 44032: 0xB4BD,\n\t45701 - 44032: 0xB4BE,\n\t45702 - 44032: 0x8853,\n\t45703 - 44032: 0x8854,\n\t45704 - 44032: 0x8855,\n\t45705 - 44032: 0xB4BF,\n\t45706 - 44032: 0x8856,\n\t45707 - 44032: 0x8857,\n\t45708 - 44032: 0x8858,\n\t45709 - 44032: 0x8859,\n\t45710 - 44032: 0x885A,\n\t45711 - 44032: 0x8861,\n\t45712 - 44032: 0xB4C0,\n\t45713 - 44032: 0xB4C1,\n\t45714 - 44032: 0x8862,\n\t45715 - 44032: 0x8863,\n\t45716 - 44032: 0xB4C2,\n\t45717 - 44032: 0x8864,\n\t45718 - 44032: 0x8865,\n\t45719 - 44032: 0x8866,\n\t45720 - 44032: 0xB4C3,\n\t45721 - 44032: 0xB4C4,\n\t45722 - 44032: 0xB4C5,\n\t45723 - 44032: 0x8867,\n\t45724 - 44032: 0x8868,\n\t45725 - 44032: 0x8869,\n\t45726 - 44032: 0x886A,\n\t45727 - 44032: 0x886B,\n\t45728 - 44032: 0xB4C6,\n\t45729 - 44032: 0xB4C7,\n\t45730 - 44032: 0x886C,\n\t45731 - 44032: 0xB4C8,\n\t45732 - 44032: 0x886D,\n\t45733 - 44032: 0xB4C9,\n\t45734 - 44032: 0xB4CA,\n\t45735 - 44032: 0x886E,\n\t45736 - 44032: 0x886F,\n\t45737 - 44032: 0x8870,\n\t45738 - 44032: 0xB4CB,\n\t45739 - 44032: 0x8871,\n\t45740 - 44032: 0xB4CC,\n\t45741 - 44032: 0x8872,\n\t45742 - 44032: 0x8873,\n\t45743 - 44032: 0x8874,\n\t45744 - 44032: 0xB4CD,\n\t45745 - 44032: 0x8875,\n\t45746 - 44032: 0x8876,\n\t45747 - 44032: 0x8877,\n\t45748 - 44032: 0xB4CE,\n\t45749 - 44032: 0x8878,\n\t45750 - 44032: 0x8879,\n\t45751 - 44032: 0x887A,\n\t45752 - 44032: 0x8881,\n\t45753 - 44032: 0x8882,\n\t45754 - 44032: 0x8883,\n\t45755 - 44032: 0x8884,\n\t45756 - 44032: 0x8885,\n\t45757 - 44032: 0x8886,\n\t45758 - 44032: 0x8887,\n\t45759 - 44032: 0x8888,\n\t45760 - 44032: 0x8889,\n\t45761 - 44032: 0x888A,\n\t45762 - 44032: 0x888B,\n\t45763 - 44032: 0x888C,\n\t45764 - 44032: 0x888D,\n\t45765 - 44032: 0x888E,\n\t45766 - 44032: 0x888F,\n\t45767 - 44032: 0x8890,\n\t45768 - 44032: 0xB4CF,\n\t45769 - 44032: 0xB4D0,\n\t45770 - 44032: 0x8891,\n\t45771 - 44032: 0x8892,\n\t45772 - 44032: 0xB4D1,\n\t45773 - 44032: 0x8893,\n\t45774 - 44032: 0x8894,\n\t45775 - 44032: 0x8895,\n\t45776 - 44032: 0xB4D2,\n\t45777 - 44032: 0x8896,\n\t45778 - 44032: 0xB4D3,\n\t45779 - 44032: 0x8897,\n\t45780 - 44032: 0x8898,\n\t45781 - 44032: 0x8899,\n\t45782 - 44032: 0x889A,\n\t45783 - 44032: 0x889B,\n\t45784 - 44032: 0xB4D4,\n\t45785 - 44032: 0xB4D5,\n\t45786 - 44032: 0x889C,\n\t45787 - 44032: 0xB4D6,\n\t45788 - 44032: 0x889D,\n\t45789 - 44032: 0xB4D7,\n\t45790 - 44032: 0x889E,\n\t45791 - 44032: 0x889F,\n\t45792 - 44032: 0x88A0,\n\t45793 - 44032: 0x88A1,\n\t45794 - 44032: 0xB4D8,\n\t45795 - 44032: 0x88A2,\n\t45796 - 44032: 0xB4D9,\n\t45797 - 44032: 0xB4DA,\n\t45798 - 44032: 0xB4DB,\n\t45799 - 44032: 0x88A3,\n\t45800 - 44032: 0xB4DC,\n\t45801 - 44032: 0x88A4,\n\t45802 - 44032: 0x88A5,\n\t45803 - 44032: 0xB4DD,\n\t45804 - 44032: 0xB4DE,\n\t45805 - 44032: 0xB4DF,\n\t45806 - 44032: 0xB4E0,\n\t45807 - 44032: 0xB4E1,\n\t45808 - 44032: 0x88A6,\n\t45809 - 44032: 0x88A7,\n\t45810 - 44032: 0x88A8,\n\t45811 - 44032: 0xB4E2,\n\t45812 - 44032: 0xB4E3,\n\t45813 - 44032: 0xB4E4,\n\t45814 - 44032: 0x88A9,\n\t45815 - 44032: 0xB4E5,\n\t45816 - 44032: 0xB4E6,\n\t45817 - 44032: 0xB4E7,\n\t45818 - 44032: 0xB4E8,\n\t45819 - 44032: 0xB4E9,\n\t45820 - 44032: 0x88AA,\n\t45821 - 44032: 0x88AB,\n\t45822 - 44032: 0x88AC,\n\t45823 - 44032: 0xB4EA,\n\t45824 - 44032: 0xB4EB,\n\t45825 - 44032: 0xB4EC,\n\t45826 - 44032: 0x88AD,\n\t45827 - 44032: 0x88AE,\n\t45828 - 44032: 0xB4ED,\n\t45829 - 44032: 0x88AF,\n\t45830 - 44032: 0x88B0,\n\t45831 - 44032: 0x88B1,\n\t45832 - 44032: 0xB4EE,\n\t45833 - 44032: 0x88B2,\n\t45834 - 44032: 0x88B3,\n\t45835 - 44032: 0x88B4,\n\t45836 - 44032: 0x88B5,\n\t45837 - 44032: 0x88B6,\n\t45838 - 44032: 0x88B7,\n\t45839 - 44032: 0x88B8,\n\t45840 - 44032: 0xB4EF,\n\t45841 - 44032: 0xB4F0,\n\t45842 - 44032: 0x88B9,\n\t45843 - 44032: 0xB4F1,\n\t45844 - 44032: 0xB4F2,\n\t45845 - 44032: 0xB4F3,\n\t45846 - 44032: 0x88BA,\n\t45847 - 44032: 0x88BB,\n\t45848 - 44032: 0x88BC,\n\t45849 - 44032: 0x88BD,\n\t45850 - 44032: 0x88BE,\n\t45851 - 44032: 0x88BF,\n\t45852 - 44032: 0xB4F4,\n\t45853 - 44032: 0x88C0,\n\t45854 - 44032: 0x88C1,\n\t45855 - 44032: 0x88C2,\n\t45856 - 44032: 0x88C3,\n\t45857 - 44032: 0x88C4,\n\t45858 - 44032: 0x88C5,\n\t45859 - 44032: 0x88C6,\n\t45860 - 44032: 0x88C7,\n\t45861 - 44032: 0x88C8,\n\t45862 - 44032: 0x88C9,\n\t45863 - 44032: 0x88CA,\n\t45864 - 44032: 0x88CB,\n\t45865 - 44032: 0x88CC,\n\t45866 - 44032: 0x88CD,\n\t45867 - 44032: 0x88CE,\n\t45868 - 44032: 0x88CF,\n\t45869 - 44032: 0x88D0,\n\t45870 - 44032: 0x88D1,\n\t45871 - 44032: 0x88D2,\n\t45872 - 44032: 0x88D3,\n\t45873 - 44032: 0x88D4,\n\t45874 - 44032: 0x88D5,\n\t45875 - 44032: 0x88D6,\n\t45876 - 44032: 0x88D7,\n\t45877 - 44032: 0x88D8,\n\t45878 - 44032: 0x88D9,\n\t45879 - 44032: 0x88DA,\n\t45880 - 44032: 0x88DB,\n\t45881 - 44032: 0x88DC,\n\t45882 - 44032: 0x88DD,\n\t45883 - 44032: 0x88DE,\n\t45884 - 44032: 0x88DF,\n\t45885 - 44032: 0x88E0,\n\t45886 - 44032: 0x88E1,\n\t45887 - 44032: 0x88E2,\n\t45888 - 44032: 0x88E3,\n\t45889 - 44032: 0x88E4,\n\t45890 - 44032: 0x88E5,\n\t45891 - 44032: 0x88E6,\n\t45892 - 44032: 0x88E7,\n\t45893 - 44032: 0x88E8,\n\t45894 - 44032: 0x88E9,\n\t45895 - 44032: 0x88EA,\n\t45896 - 44032: 0x88EB,\n\t45897 - 44032: 0x88EC,\n\t45898 - 44032: 0x88ED,\n\t45899 - 44032: 0x88EE,\n\t45900 - 44032: 0x88EF,\n\t45901 - 44032: 0x88F0,\n\t45902 - 44032: 0x88F1,\n\t45903 - 44032: 0x88F2,\n\t45904 - 44032: 0x88F3,\n\t45905 - 44032: 0x88F4,\n\t45906 - 44032: 0x88F5,\n\t45907 - 44032: 0x88F6,\n\t45908 - 44032: 0xB4F5,\n\t45909 - 44032: 0xB4F6,\n\t45910 - 44032: 0xB4F7,\n\t45911 - 44032: 0x88F7,\n\t45912 - 44032: 0xB4F8,\n\t45913 - 44032: 0x88F8,\n\t45914 - 44032: 0x88F9,\n\t45915 - 44032: 0xB4F9,\n\t45916 - 44032: 0xB4FA,\n\t45917 - 44032: 0x88FA,\n\t45918 - 44032: 0xB4FB,\n\t45919 - 44032: 0xB4FC,\n\t45920 - 44032: 0x88FB,\n\t45921 - 44032: 0x88FC,\n\t45922 - 44032: 0x88FD,\n\t45923 - 44032: 0x88FE,\n\t45924 - 44032: 0xB4FD,\n\t45925 - 44032: 0xB4FE,\n\t45926 - 44032: 0x8941,\n\t45927 - 44032: 0xB5A1,\n\t45928 - 44032: 0x8942,\n\t45929 - 44032: 0xB5A2,\n\t45930 - 44032: 0x8943,\n\t45931 - 44032: 0xB5A3,\n\t45932 - 44032: 0x8944,\n\t45933 - 44032: 0x8945,\n\t45934 - 44032: 0xB5A4,\n\t45935 - 44032: 0x8946,\n\t45936 - 44032: 0xB5A5,\n\t45937 - 44032: 0xB5A6,\n\t45938 - 44032: 0x8947,\n\t45939 - 44032: 0x8948,\n\t45940 - 44032: 0xB5A7,\n\t45941 - 44032: 0x8949,\n\t45942 - 44032: 0x894A,\n\t45943 - 44032: 0x894B,\n\t45944 - 44032: 0xB5A8,\n\t45945 - 44032: 0x894C,\n\t45946 - 44032: 0x894D,\n\t45947 - 44032: 0x894E,\n\t45948 - 44032: 0x894F,\n\t45949 - 44032: 0x8950,\n\t45950 - 44032: 0x8951,\n\t45951 - 44032: 0x8952,\n\t45952 - 44032: 0xB5A9,\n\t45953 - 44032: 0xB5AA,\n\t45954 - 44032: 0x8953,\n\t45955 - 44032: 0xB5AB,\n\t45956 - 44032: 0xB5AC,\n\t45957 - 44032: 0xB5AD,\n\t45958 - 44032: 0x8954,\n\t45959 - 44032: 0x8955,\n\t45960 - 44032: 0x8956,\n\t45961 - 44032: 0x8957,\n\t45962 - 44032: 0x8958,\n\t45963 - 44032: 0x8959,\n\t45964 - 44032: 0xB5AE,\n\t45965 - 44032: 0x895A,\n\t45966 - 44032: 0x8961,\n\t45967 - 44032: 0x8962,\n\t45968 - 44032: 0xB5AF,\n\t45969 - 44032: 0x8963,\n\t45970 - 44032: 0x8964,\n\t45971 - 44032: 0x8965,\n\t45972 - 44032: 0xB5B0,\n\t45973 - 44032: 0x8966,\n\t45974 - 44032: 0x8967,\n\t45975 - 44032: 0x8968,\n\t45976 - 44032: 0x8969,\n\t45977 - 44032: 0x896A,\n\t45978 - 44032: 0x896B,\n\t45979 - 44032: 0x896C,\n\t45980 - 44032: 0x896D,\n\t45981 - 44032: 0x896E,\n\t45982 - 44032: 0x896F,\n\t45983 - 44032: 0x8970,\n\t45984 - 44032: 0xB5B1,\n\t45985 - 44032: 0xB5B2,\n\t45986 - 44032: 0x8971,\n\t45987 - 44032: 0x8972,\n\t45988 - 44032: 0x8973,\n\t45989 - 44032: 0x8974,\n\t45990 - 44032: 0x8975,\n\t45991 - 44032: 0x8976,\n\t45992 - 44032: 0xB5B3,\n\t45993 - 44032: 0x8977,\n\t45994 - 44032: 0x8978,\n\t45995 - 44032: 0x8979,\n\t45996 - 44032: 0xB5B4,\n\t45997 - 44032: 0x897A,\n\t45998 - 44032: 0x8981,\n\t45999 - 44032: 0x8982,\n\t46000 - 44032: 0x8983,\n\t46001 - 44032: 0x8984,\n\t46002 - 44032: 0x8985,\n\t46003 - 44032: 0x8986,\n\t46004 - 44032: 0x8987,\n\t46005 - 44032: 0x8988,\n\t46006 - 44032: 0x8989,\n\t46007 - 44032: 0x898A,\n\t46008 - 44032: 0x898B,\n\t46009 - 44032: 0x898C,\n\t46010 - 44032: 0x898D,\n\t46011 - 44032: 0x898E,\n\t46012 - 44032: 0x898F,\n\t46013 - 44032: 0x8990,\n\t46014 - 44032: 0x8991,\n\t46015 - 44032: 0x8992,\n\t46016 - 44032: 0x8993,\n\t46017 - 44032: 0x8994,\n\t46018 - 44032: 0x8995,\n\t46019 - 44032: 0x8996,\n\t46020 - 44032: 0xB5B5,\n\t46021 - 44032: 0xB5B6,\n\t46022 - 44032: 0x8997,\n\t46023 - 44032: 0x8998,\n\t46024 - 44032: 0xB5B7,\n\t46025 - 44032: 0x8999,\n\t46026 - 44032: 0x899A,\n\t46027 - 44032: 0xB5B8,\n\t46028 - 44032: 0xB5B9,\n\t46029 - 44032: 0x899B,\n\t46030 - 44032: 0xB5BA,\n\t46031 - 44032: 0x899C,\n\t46032 - 44032: 0xB5BB,\n\t46033 - 44032: 0x899D,\n\t46034 - 44032: 0x899E,\n\t46035 - 44032: 0x899F,\n\t46036 - 44032: 0xB5BC,\n\t46037 - 44032: 0xB5BD,\n\t46038 - 44032: 0x89A0,\n\t46039 - 44032: 0xB5BE,\n\t46040 - 44032: 0x89A1,\n\t46041 - 44032: 0xB5BF,\n\t46042 - 44032: 0x89A2,\n\t46043 - 44032: 0xB5C0,\n\t46044 - 44032: 0x89A3,\n\t46045 - 44032: 0xB5C1,\n\t46046 - 44032: 0x89A4,\n\t46047 - 44032: 0x89A5,\n\t46048 - 44032: 0xB5C2,\n\t46049 - 44032: 0x89A6,\n\t46050 - 44032: 0x89A7,\n\t46051 - 44032: 0x89A8,\n\t46052 - 44032: 0xB5C3,\n\t46053 - 44032: 0x89A9,\n\t46054 - 44032: 0x89AA,\n\t46055 - 44032: 0x89AB,\n\t46056 - 44032: 0xB5C4,\n\t46057 - 44032: 0x89AC,\n\t46058 - 44032: 0x89AD,\n\t46059 - 44032: 0x89AE,\n\t46060 - 44032: 0x89AF,\n\t46061 - 44032: 0x89B0,\n\t46062 - 44032: 0x89B1,\n\t46063 - 44032: 0x89B2,\n\t46064 - 44032: 0x89B3,\n\t46065 - 44032: 0x89B4,\n\t46066 - 44032: 0x89B5,\n\t46067 - 44032: 0x89B6,\n\t46068 - 44032: 0x89B7,\n\t46069 - 44032: 0x89B8,\n\t46070 - 44032: 0x89B9,\n\t46071 - 44032: 0x89BA,\n\t46072 - 44032: 0x89BB,\n\t46073 - 44032: 0x89BC,\n\t46074 - 44032: 0x89BD,\n\t46075 - 44032: 0x89BE,\n\t46076 - 44032: 0xB5C5,\n\t46077 - 44032: 0x89BF,\n\t46078 - 44032: 0x89C0,\n\t46079 - 44032: 0x89C1,\n\t46080 - 44032: 0x89C2,\n\t46081 - 44032: 0x89C3,\n\t46082 - 44032: 0x89C4,\n\t46083 - 44032: 0x89C5,\n\t46084 - 44032: 0x89C6,\n\t46085 - 44032: 0x89C7,\n\t46086 - 44032: 0x89C8,\n\t46087 - 44032: 0x89C9,\n\t46088 - 44032: 0x89CA,\n\t46089 - 44032: 0x89CB,\n\t46090 - 44032: 0x89CC,\n\t46091 - 44032: 0x89CD,\n\t46092 - 44032: 0x89CE,\n\t46093 - 44032: 0x89CF,\n\t46094 - 44032: 0x89D0,\n\t46095 - 44032: 0x89D1,\n\t46096 - 44032: 0xB5C6,\n\t46097 - 44032: 0x89D2,\n\t46098 - 44032: 0x89D3,\n\t46099 - 44032: 0x89D4,\n\t46100 - 44032: 0x89D5,\n\t46101 - 44032: 0x89D6,\n\t46102 - 44032: 0x89D7,\n\t46103 - 44032: 0x89D8,\n\t46104 - 44032: 0xB5C7,\n\t46105 - 44032: 0x89D9,\n\t46106 - 44032: 0x89DA,\n\t46107 - 44032: 0x89DB,\n\t46108 - 44032: 0xB5C8,\n\t46109 - 44032: 0x89DC,\n\t46110 - 44032: 0x89DD,\n\t46111 - 44032: 0x89DE,\n\t46112 - 44032: 0xB5C9,\n\t46113 - 44032: 0x89DF,\n\t46114 - 44032: 0x89E0,\n\t46115 - 44032: 0x89E1,\n\t46116 - 44032: 0x89E2,\n\t46117 - 44032: 0x89E3,\n\t46118 - 44032: 0x89E4,\n\t46119 - 44032: 0x89E5,\n\t46120 - 44032: 0xB5CA,\n\t46121 - 44032: 0xB5CB,\n\t46122 - 44032: 0x89E6,\n\t46123 - 44032: 0xB5CC,\n\t46124 - 44032: 0x89E7,\n\t46125 - 44032: 0x89E8,\n\t46126 - 44032: 0x89E9,\n\t46127 - 44032: 0x89EA,\n\t46128 - 44032: 0x89EB,\n\t46129 - 44032: 0x89EC,\n\t46130 - 44032: 0x89ED,\n\t46131 - 44032: 0x89EE,\n\t46132 - 44032: 0xB5CD,\n\t46133 - 44032: 0x89EF,\n\t46134 - 44032: 0x89F0,\n\t46135 - 44032: 0x89F1,\n\t46136 - 44032: 0x89F2,\n\t46137 - 44032: 0x89F3,\n\t46138 - 44032: 0x89F4,\n\t46139 - 44032: 0x89F5,\n\t46140 - 44032: 0x89F6,\n\t46141 - 44032: 0x89F7,\n\t46142 - 44032: 0x89F8,\n\t46143 - 44032: 0x89F9,\n\t46144 - 44032: 0x89FA,\n\t46145 - 44032: 0x89FB,\n\t46146 - 44032: 0x89FC,\n\t46147 - 44032: 0x89FD,\n\t46148 - 44032: 0x89FE,\n\t46149 - 44032: 0x8A41,\n\t46150 - 44032: 0x8A42,\n\t46151 - 44032: 0x8A43,\n\t46152 - 44032: 0x8A44,\n\t46153 - 44032: 0x8A45,\n\t46154 - 44032: 0x8A46,\n\t46155 - 44032: 0x8A47,\n\t46156 - 44032: 0x8A48,\n\t46157 - 44032: 0x8A49,\n\t46158 - 44032: 0x8A4A,\n\t46159 - 44032: 0x8A4B,\n\t46160 - 44032: 0xB5CE,\n\t46161 - 44032: 0xB5CF,\n\t46162 - 44032: 0x8A4C,\n\t46163 - 44032: 0x8A4D,\n\t46164 - 44032: 0xB5D0,\n\t46165 - 44032: 0x8A4E,\n\t46166 - 44032: 0x8A4F,\n\t46167 - 44032: 0x8A50,\n\t46168 - 44032: 0xB5D1,\n\t46169 - 44032: 0x8A51,\n\t46170 - 44032: 0x8A52,\n\t46171 - 44032: 0x8A53,\n\t46172 - 44032: 0x8A54,\n\t46173 - 44032: 0x8A55,\n\t46174 - 44032: 0x8A56,\n\t46175 - 44032: 0x8A57,\n\t46176 - 44032: 0xB5D2,\n\t46177 - 44032: 0xB5D3,\n\t46178 - 44032: 0x8A58,\n\t46179 - 44032: 0xB5D4,\n\t46180 - 44032: 0x8A59,\n\t46181 - 44032: 0xB5D5,\n\t46182 - 44032: 0x8A5A,\n\t46183 - 44032: 0x8A61,\n\t46184 - 44032: 0x8A62,\n\t46185 - 44032: 0x8A63,\n\t46186 - 44032: 0x8A64,\n\t46187 - 44032: 0x8A65,\n\t46188 - 44032: 0xB5D6,\n\t46189 - 44032: 0x8A66,\n\t46190 - 44032: 0x8A67,\n\t46191 - 44032: 0x8A68,\n\t46192 - 44032: 0x8A69,\n\t46193 - 44032: 0x8A6A,\n\t46194 - 44032: 0x8A6B,\n\t46195 - 44032: 0x8A6C,\n\t46196 - 44032: 0x8A6D,\n\t46197 - 44032: 0x8A6E,\n\t46198 - 44032: 0x8A6F,\n\t46199 - 44032: 0x8A70,\n\t46200 - 44032: 0x8A71,\n\t46201 - 44032: 0x8A72,\n\t46202 - 44032: 0x8A73,\n\t46203 - 44032: 0x8A74,\n\t46204 - 44032: 0x8A75,\n\t46205 - 44032: 0x8A76,\n\t46206 - 44032: 0x8A77,\n\t46207 - 44032: 0x8A78,\n\t46208 - 44032: 0xB5D7,\n\t46209 - 44032: 0x8A79,\n\t46210 - 44032: 0x8A7A,\n\t46211 - 44032: 0x8A81,\n\t46212 - 44032: 0x8A82,\n\t46213 - 44032: 0x8A83,\n\t46214 - 44032: 0x8A84,\n\t46215 - 44032: 0x8A85,\n\t46216 - 44032: 0xB5D8,\n\t46217 - 44032: 0x8A86,\n\t46218 - 44032: 0x8A87,\n\t46219 - 44032: 0x8A88,\n\t46220 - 44032: 0x8A89,\n\t46221 - 44032: 0x8A8A,\n\t46222 - 44032: 0x8A8B,\n\t46223 - 44032: 0x8A8C,\n\t46224 - 44032: 0x8A8D,\n\t46225 - 44032: 0x8A8E,\n\t46226 - 44032: 0x8A8F,\n\t46227 - 44032: 0x8A90,\n\t46228 - 44032: 0x8A91,\n\t46229 - 44032: 0x8A92,\n\t46230 - 44032: 0x8A93,\n\t46231 - 44032: 0x8A94,\n\t46232 - 44032: 0x8A95,\n\t46233 - 44032: 0x8A96,\n\t46234 - 44032: 0x8A97,\n\t46235 - 44032: 0x8A98,\n\t46236 - 44032: 0x8A99,\n\t46237 - 44032: 0xB5D9,\n\t46238 - 44032: 0x8A9A,\n\t46239 - 44032: 0x8A9B,\n\t46240 - 44032: 0x8A9C,\n\t46241 - 44032: 0x8A9D,\n\t46242 - 44032: 0x8A9E,\n\t46243 - 44032: 0x8A9F,\n\t46244 - 44032: 0xB5DA,\n\t46245 - 44032: 0x8AA0,\n\t46246 - 44032: 0x8AA1,\n\t46247 - 44032: 0x8AA2,\n\t46248 - 44032: 0xB5DB,\n\t46249 - 44032: 0x8AA3,\n\t46250 - 44032: 0x8AA4,\n\t46251 - 44032: 0x8AA5,\n\t46252 - 44032: 0xB5DC,\n\t46253 - 44032: 0x8AA6,\n\t46254 - 44032: 0x8AA7,\n\t46255 - 44032: 0x8AA8,\n\t46256 - 44032: 0x8AA9,\n\t46257 - 44032: 0x8AAA,\n\t46258 - 44032: 0x8AAB,\n\t46259 - 44032: 0x8AAC,\n\t46260 - 44032: 0x8AAD,\n\t46261 - 44032: 0xB5DD,\n\t46262 - 44032: 0x8AAE,\n\t46263 - 44032: 0xB5DE,\n\t46264 - 44032: 0x8AAF,\n\t46265 - 44032: 0xB5DF,\n\t46266 - 44032: 0x8AB0,\n\t46267 - 44032: 0x8AB1,\n\t46268 - 44032: 0x8AB2,\n\t46269 - 44032: 0x8AB3,\n\t46270 - 44032: 0x8AB4,\n\t46271 - 44032: 0x8AB5,\n\t46272 - 44032: 0xB5E0,\n\t46273 - 44032: 0x8AB6,\n\t46274 - 44032: 0x8AB7,\n\t46275 - 44032: 0x8AB8,\n\t46276 - 44032: 0xB5E1,\n\t46277 - 44032: 0x8AB9,\n\t46278 - 44032: 0x8ABA,\n\t46279 - 44032: 0x8ABB,\n\t46280 - 44032: 0xB5E2,\n\t46281 - 44032: 0x8ABC,\n\t46282 - 44032: 0x8ABD,\n\t46283 - 44032: 0x8ABE,\n\t46284 - 44032: 0x8ABF,\n\t46285 - 44032: 0x8AC0,\n\t46286 - 44032: 0x8AC1,\n\t46287 - 44032: 0x8AC2,\n\t46288 - 44032: 0xB5E3,\n\t46289 - 44032: 0x8AC3,\n\t46290 - 44032: 0x8AC4,\n\t46291 - 44032: 0x8AC5,\n\t46292 - 44032: 0x8AC6,\n\t46293 - 44032: 0xB5E4,\n\t46294 - 44032: 0x8AC7,\n\t46295 - 44032: 0x8AC8,\n\t46296 - 44032: 0x8AC9,\n\t46297 - 44032: 0x8ACA,\n\t46298 - 44032: 0x8ACB,\n\t46299 - 44032: 0x8ACC,\n\t46300 - 44032: 0xB5E5,\n\t46301 - 44032: 0xB5E6,\n\t46302 - 44032: 0x8ACD,\n\t46303 - 44032: 0x8ACE,\n\t46304 - 44032: 0xB5E7,\n\t46305 - 44032: 0x8ACF,\n\t46306 - 44032: 0x8AD0,\n\t46307 - 44032: 0xB5E8,\n\t46308 - 44032: 0xB5E9,\n\t46309 - 44032: 0x8AD1,\n\t46310 - 44032: 0xB5EA,\n\t46311 - 44032: 0x8AD2,\n\t46312 - 44032: 0x8AD3,\n\t46313 - 44032: 0x8AD4,\n\t46314 - 44032: 0x8AD5,\n\t46315 - 44032: 0x8AD6,\n\t46316 - 44032: 0xB5EB,\n\t46317 - 44032: 0xB5EC,\n\t46318 - 44032: 0x8AD7,\n\t46319 - 44032: 0xB5ED,\n\t46320 - 44032: 0x8AD8,\n\t46321 - 44032: 0xB5EE,\n\t46322 - 44032: 0x8AD9,\n\t46323 - 44032: 0x8ADA,\n\t46324 - 44032: 0x8ADB,\n\t46325 - 44032: 0x8ADC,\n\t46326 - 44032: 0x8ADD,\n\t46327 - 44032: 0x8ADE,\n\t46328 - 44032: 0xB5EF,\n\t46329 - 44032: 0x8ADF,\n\t46330 - 44032: 0x8AE0,\n\t46331 - 44032: 0x8AE1,\n\t46332 - 44032: 0x8AE2,\n\t46333 - 44032: 0x8AE3,\n\t46334 - 44032: 0x8AE4,\n\t46335 - 44032: 0x8AE5,\n\t46336 - 44032: 0x8AE6,\n\t46337 - 44032: 0x8AE7,\n\t46338 - 44032: 0x8AE8,\n\t46339 - 44032: 0x8AE9,\n\t46340 - 44032: 0x8AEA,\n\t46341 - 44032: 0x8AEB,\n\t46342 - 44032: 0x8AEC,\n\t46343 - 44032: 0x8AED,\n\t46344 - 44032: 0x8AEE,\n\t46345 - 44032: 0x8AEF,\n\t46346 - 44032: 0x8AF0,\n\t46347 - 44032: 0x8AF1,\n\t46348 - 44032: 0x8AF2,\n\t46349 - 44032: 0x8AF3,\n\t46350 - 44032: 0x8AF4,\n\t46351 - 44032: 0x8AF5,\n\t46352 - 44032: 0x8AF6,\n\t46353 - 44032: 0x8AF7,\n\t46354 - 44032: 0x8AF8,\n\t46355 - 44032: 0x8AF9,\n\t46356 - 44032: 0xB5F0,\n\t46357 - 44032: 0xB5F1,\n\t46358 - 44032: 0x8AFA,\n\t46359 - 44032: 0x8AFB,\n\t46360 - 44032: 0xB5F2,\n\t46361 - 44032: 0x8AFC,\n\t46362 - 44032: 0x8AFD,\n\t46363 - 44032: 0xB5F3,\n\t46364 - 44032: 0xB5F4,\n\t46365 - 44032: 0x8AFE,\n\t46366 - 44032: 0x8B41,\n\t46367 - 44032: 0x8B42,\n\t46368 - 44032: 0x8B43,\n\t46369 - 44032: 0x8B44,\n\t46370 - 44032: 0x8B45,\n\t46371 - 44032: 0x8B46,\n\t46372 - 44032: 0xB5F5,\n\t46373 - 44032: 0xB5F6,\n\t46374 - 44032: 0x8B47,\n\t46375 - 44032: 0xB5F7,\n\t46376 - 44032: 0xB5F8,\n\t46377 - 44032: 0xB5F9,\n\t46378 - 44032: 0xB5FA,\n\t46379 - 44032: 0x8B48,\n\t46380 - 44032: 0x8B49,\n\t46381 - 44032: 0x8B4A,\n\t46382 - 44032: 0x8B4B,\n\t46383 - 44032: 0x8B4C,\n\t46384 - 44032: 0xB5FB,\n\t46385 - 44032: 0xB5FC,\n\t46386 - 44032: 0x8B4D,\n\t46387 - 44032: 0x8B4E,\n\t46388 - 44032: 0xB5FD,\n\t46389 - 44032: 0x8B4F,\n\t46390 - 44032: 0x8B50,\n\t46391 - 44032: 0x8B51,\n\t46392 - 44032: 0xB5FE,\n\t46393 - 44032: 0x8B52,\n\t46394 - 44032: 0x8B53,\n\t46395 - 44032: 0x8B54,\n\t46396 - 44032: 0x8B55,\n\t46397 - 44032: 0x8B56,\n\t46398 - 44032: 0x8B57,\n\t46399 - 44032: 0x8B58,\n\t46400 - 44032: 0xB6A1,\n\t46401 - 44032: 0xB6A2,\n\t46402 - 44032: 0x8B59,\n\t46403 - 44032: 0xB6A3,\n\t46404 - 44032: 0xB6A4,\n\t46405 - 44032: 0xB6A5,\n\t46406 - 44032: 0x8B5A,\n\t46407 - 44032: 0x8B61,\n\t46408 - 44032: 0x8B62,\n\t46409 - 44032: 0x8B63,\n\t46410 - 44032: 0x8B64,\n\t46411 - 44032: 0xB6A6,\n\t46412 - 44032: 0xB6A7,\n\t46413 - 44032: 0xB6A8,\n\t46414 - 44032: 0x8B65,\n\t46415 - 44032: 0x8B66,\n\t46416 - 44032: 0xB6A9,\n\t46417 - 44032: 0x8B67,\n\t46418 - 44032: 0x8B68,\n\t46419 - 44032: 0x8B69,\n\t46420 - 44032: 0xB6AA,\n\t46421 - 44032: 0x8B6A,\n\t46422 - 44032: 0x8B6B,\n\t46423 - 44032: 0x8B6C,\n\t46424 - 44032: 0x8B6D,\n\t46425 - 44032: 0x8B6E,\n\t46426 - 44032: 0x8B6F,\n\t46427 - 44032: 0x8B70,\n\t46428 - 44032: 0xB6AB,\n\t46429 - 44032: 0xB6AC,\n\t46430 - 44032: 0x8B71,\n\t46431 - 44032: 0xB6AD,\n\t46432 - 44032: 0xB6AE,\n\t46433 - 44032: 0xB6AF,\n\t46434 - 44032: 0x8B72,\n\t46435 - 44032: 0x8B73,\n\t46436 - 44032: 0x8B74,\n\t46437 - 44032: 0x8B75,\n\t46438 - 44032: 0x8B76,\n\t46439 - 44032: 0x8B77,\n\t46440 - 44032: 0x8B78,\n\t46441 - 44032: 0x8B79,\n\t46442 - 44032: 0x8B7A,\n\t46443 - 44032: 0x8B81,\n\t46444 - 44032: 0x8B82,\n\t46445 - 44032: 0x8B83,\n\t46446 - 44032: 0x8B84,\n\t46447 - 44032: 0x8B85,\n\t46448 - 44032: 0x8B86,\n\t46449 - 44032: 0x8B87,\n\t46450 - 44032: 0x8B88,\n\t46451 - 44032: 0x8B89,\n\t46452 - 44032: 0x8B8A,\n\t46453 - 44032: 0x8B8B,\n\t46454 - 44032: 0x8B8C,\n\t46455 - 44032: 0x8B8D,\n\t46456 - 44032: 0x8B8E,\n\t46457 - 44032: 0x8B8F,\n\t46458 - 44032: 0x8B90,\n\t46459 - 44032: 0x8B91,\n\t46460 - 44032: 0x8B92,\n\t46461 - 44032: 0x8B93,\n\t46462 - 44032: 0x8B94,\n\t46463 - 44032: 0x8B95,\n\t46464 - 44032: 0x8B96,\n\t46465 - 44032: 0x8B97,\n\t46466 - 44032: 0x8B98,\n\t46467 - 44032: 0x8B99,\n\t46468 - 44032: 0x8B9A,\n\t46469 - 44032: 0x8B9B,\n\t46470 - 44032: 0x8B9C,\n\t46471 - 44032: 0x8B9D,\n\t46472 - 44032: 0x8B9E,\n\t46473 - 44032: 0x8B9F,\n\t46474 - 44032: 0x8BA0,\n\t46475 - 44032: 0x8BA1,\n\t46476 - 44032: 0x8BA2,\n\t46477 - 44032: 0x8BA3,\n\t46478 - 44032: 0x8BA4,\n\t46479 - 44032: 0x8BA5,\n\t46480 - 44032: 0x8BA6,\n\t46481 - 44032: 0x8BA7,\n\t46482 - 44032: 0x8BA8,\n\t46483 - 44032: 0x8BA9,\n\t46484 - 44032: 0x8BAA,\n\t46485 - 44032: 0x8BAB,\n\t46486 - 44032: 0x8BAC,\n\t46487 - 44032: 0x8BAD,\n\t46488 - 44032: 0x8BAE,\n\t46489 - 44032: 0x8BAF,\n\t46490 - 44032: 0x8BB0,\n\t46491 - 44032: 0x8BB1,\n\t46492 - 44032: 0x8BB2,\n\t46493 - 44032: 0x8BB3,\n\t46494 - 44032: 0x8BB4,\n\t46495 - 44032: 0x8BB5,\n\t46496 - 44032: 0xB6B0,\n\t46497 - 44032: 0xB6B1,\n\t46498 - 44032: 0x8BB6,\n\t46499 - 44032: 0x8BB7,\n\t46500 - 44032: 0xB6B2,\n\t46501 - 44032: 0x8BB8,\n\t46502 - 44032: 0x8BB9,\n\t46503 - 44032: 0x8BBA,\n\t46504 - 44032: 0xB6B3,\n\t46505 - 44032: 0x8BBB,\n\t46506 - 44032: 0xB6B4,\n\t46507 - 44032: 0xB6B5,\n\t46508 - 44032: 0x8BBC,\n\t46509 - 44032: 0x8BBD,\n\t46510 - 44032: 0x8BBE,\n\t46511 - 44032: 0x8BBF,\n\t46512 - 44032: 0xB6B6,\n\t46513 - 44032: 0xB6B7,\n\t46514 - 44032: 0x8BC0,\n\t46515 - 44032: 0xB6B8,\n\t46516 - 44032: 0xB6B9,\n\t46517 - 44032: 0xB6BA,\n\t46518 - 44032: 0x8BC1,\n\t46519 - 44032: 0x8BC2,\n\t46520 - 44032: 0x8BC3,\n\t46521 - 44032: 0x8BC4,\n\t46522 - 44032: 0x8BC5,\n\t46523 - 44032: 0xB6BB,\n\t46524 - 44032: 0xB6BC,\n\t46525 - 44032: 0xB6BD,\n\t46526 - 44032: 0x8BC6,\n\t46527 - 44032: 0x8BC7,\n\t46528 - 44032: 0xB6BE,\n\t46529 - 44032: 0x8BC8,\n\t46530 - 44032: 0x8BC9,\n\t46531 - 44032: 0x8BCA,\n\t46532 - 44032: 0xB6BF,\n\t46533 - 44032: 0x8BCB,\n\t46534 - 44032: 0x8BCC,\n\t46535 - 44032: 0x8BCD,\n\t46536 - 44032: 0x8BCE,\n\t46537 - 44032: 0x8BCF,\n\t46538 - 44032: 0x8BD0,\n\t46539 - 44032: 0x8BD1,\n\t46540 - 44032: 0xB6C0,\n\t46541 - 44032: 0xB6C1,\n\t46542 - 44032: 0x8BD2,\n\t46543 - 44032: 0xB6C2,\n\t46544 - 44032: 0xB6C3,\n\t46545 - 44032: 0xB6C4,\n\t46546 - 44032: 0x8BD3,\n\t46547 - 44032: 0x8BD4,\n\t46548 - 44032: 0x8BD5,\n\t46549 - 44032: 0x8BD6,\n\t46550 - 44032: 0x8BD7,\n\t46551 - 44032: 0x8BD8,\n\t46552 - 44032: 0xB6C5,\n\t46553 - 44032: 0x8BD9,\n\t46554 - 44032: 0x8BDA,\n\t46555 - 44032: 0x8BDB,\n\t46556 - 44032: 0x8BDC,\n\t46557 - 44032: 0x8BDD,\n\t46558 - 44032: 0x8BDE,\n\t46559 - 44032: 0x8BDF,\n\t46560 - 44032: 0x8BE0,\n\t46561 - 44032: 0x8BE1,\n\t46562 - 44032: 0x8BE2,\n\t46563 - 44032: 0x8BE3,\n\t46564 - 44032: 0x8BE4,\n\t46565 - 44032: 0x8BE5,\n\t46566 - 44032: 0x8BE6,\n\t46567 - 44032: 0x8BE7,\n\t46568 - 44032: 0x8BE8,\n\t46569 - 44032: 0x8BE9,\n\t46570 - 44032: 0x8BEA,\n\t46571 - 44032: 0x8BEB,\n\t46572 - 44032: 0xB6C6,\n\t46573 - 44032: 0x8BEC,\n\t46574 - 44032: 0x8BED,\n\t46575 - 44032: 0x8BEE,\n\t46576 - 44032: 0x8BEF,\n\t46577 - 44032: 0x8BF0,\n\t46578 - 44032: 0x8BF1,\n\t46579 - 44032: 0x8BF2,\n\t46580 - 44032: 0x8BF3,\n\t46581 - 44032: 0x8BF4,\n\t46582 - 44032: 0x8BF5,\n\t46583 - 44032: 0x8BF6,\n\t46584 - 44032: 0x8BF7,\n\t46585 - 44032: 0x8BF8,\n\t46586 - 44032: 0x8BF9,\n\t46587 - 44032: 0x8BFA,\n\t46588 - 44032: 0x8BFB,\n\t46589 - 44032: 0x8BFC,\n\t46590 - 44032: 0x8BFD,\n\t46591 - 44032: 0x8BFE,\n\t46592 - 44032: 0x8C41,\n\t46593 - 44032: 0x8C42,\n\t46594 - 44032: 0x8C43,\n\t46595 - 44032: 0x8C44,\n\t46596 - 44032: 0x8C45,\n\t46597 - 44032: 0x8C46,\n\t46598 - 44032: 0x8C47,\n\t46599 - 44032: 0x8C48,\n\t46600 - 44032: 0x8C49,\n\t46601 - 44032: 0x8C4A,\n\t46602 - 44032: 0x8C4B,\n\t46603 - 44032: 0x8C4C,\n\t46604 - 44032: 0x8C4D,\n\t46605 - 44032: 0x8C4E,\n\t46606 - 44032: 0x8C4F,\n\t46607 - 44032: 0x8C50,\n\t46608 - 44032: 0xB6C7,\n\t46609 - 44032: 0xB6C8,\n\t46610 - 44032: 0x8C51,\n\t46611 - 44032: 0x8C52,\n\t46612 - 44032: 0xB6C9,\n\t46613 - 44032: 0x8C53,\n\t46614 - 44032: 0x8C54,\n\t46615 - 44032: 0x8C55,\n\t46616 - 44032: 0xB6CA,\n\t46617 - 44032: 0x8C56,\n\t46618 - 44032: 0x8C57,\n\t46619 - 44032: 0x8C58,\n\t46620 - 44032: 0x8C59,\n\t46621 - 44032: 0x8C5A,\n\t46622 - 44032: 0x8C61,\n\t46623 - 44032: 0x8C62,\n\t46624 - 44032: 0x8C63,\n\t46625 - 44032: 0x8C64,\n\t46626 - 44032: 0x8C65,\n\t46627 - 44032: 0x8C66,\n\t46628 - 44032: 0x8C67,\n\t46629 - 44032: 0xB6CB,\n\t46630 - 44032: 0x8C68,\n\t46631 - 44032: 0x8C69,\n\t46632 - 44032: 0x8C6A,\n\t46633 - 44032: 0x8C6B,\n\t46634 - 44032: 0x8C6C,\n\t46635 - 44032: 0x8C6D,\n\t46636 - 44032: 0xB6CC,\n\t46637 - 44032: 0x8C6E,\n\t46638 - 44032: 0x8C6F,\n\t46639 - 44032: 0x8C70,\n\t46640 - 44032: 0x8C71,\n\t46641 - 44032: 0x8C72,\n\t46642 - 44032: 0x8C73,\n\t46643 - 44032: 0x8C74,\n\t46644 - 44032: 0xB6CD,\n\t46645 - 44032: 0x8C75,\n\t46646 - 44032: 0x8C76,\n\t46647 - 44032: 0x8C77,\n\t46648 - 44032: 0x8C78,\n\t46649 - 44032: 0x8C79,\n\t46650 - 44032: 0x8C7A,\n\t46651 - 44032: 0x8C81,\n\t46652 - 44032: 0x8C82,\n\t46653 - 44032: 0x8C83,\n\t46654 - 44032: 0x8C84,\n\t46655 - 44032: 0x8C85,\n\t46656 - 44032: 0x8C86,\n\t46657 - 44032: 0x8C87,\n\t46658 - 44032: 0x8C88,\n\t46659 - 44032: 0x8C89,\n\t46660 - 44032: 0x8C8A,\n\t46661 - 44032: 0x8C8B,\n\t46662 - 44032: 0x8C8C,\n\t46663 - 44032: 0x8C8D,\n\t46664 - 44032: 0xB6CE,\n\t46665 - 44032: 0x8C8E,\n\t46666 - 44032: 0x8C8F,\n\t46667 - 44032: 0x8C90,\n\t46668 - 44032: 0x8C91,\n\t46669 - 44032: 0x8C92,\n\t46670 - 44032: 0x8C93,\n\t46671 - 44032: 0x8C94,\n\t46672 - 44032: 0x8C95,\n\t46673 - 44032: 0x8C96,\n\t46674 - 44032: 0x8C97,\n\t46675 - 44032: 0x8C98,\n\t46676 - 44032: 0x8C99,\n\t46677 - 44032: 0x8C9A,\n\t46678 - 44032: 0x8C9B,\n\t46679 - 44032: 0x8C9C,\n\t46680 - 44032: 0x8C9D,\n\t46681 - 44032: 0x8C9E,\n\t46682 - 44032: 0x8C9F,\n\t46683 - 44032: 0x8CA0,\n\t46684 - 44032: 0x8CA1,\n\t46685 - 44032: 0x8CA2,\n\t46686 - 44032: 0x8CA3,\n\t46687 - 44032: 0x8CA4,\n\t46688 - 44032: 0x8CA5,\n\t46689 - 44032: 0x8CA6,\n\t46690 - 44032: 0x8CA7,\n\t46691 - 44032: 0x8CA8,\n\t46692 - 44032: 0xB6CF,\n\t46693 - 44032: 0x8CA9,\n\t46694 - 44032: 0x8CAA,\n\t46695 - 44032: 0x8CAB,\n\t46696 - 44032: 0xB6D0,\n\t46697 - 44032: 0x8CAC,\n\t46698 - 44032: 0x8CAD,\n\t46699 - 44032: 0x8CAE,\n\t46700 - 44032: 0x8CAF,\n\t46701 - 44032: 0x8CB0,\n\t46702 - 44032: 0x8CB1,\n\t46703 - 44032: 0x8CB2,\n\t46704 - 44032: 0x8CB3,\n\t46705 - 44032: 0x8CB4,\n\t46706 - 44032: 0x8CB5,\n\t46707 - 44032: 0x8CB6,\n\t46708 - 44032: 0x8CB7,\n\t46709 - 44032: 0x8CB8,\n\t46710 - 44032: 0x8CB9,\n\t46711 - 44032: 0x8CBA,\n\t46712 - 44032: 0x8CBB,\n\t46713 - 44032: 0x8CBC,\n\t46714 - 44032: 0x8CBD,\n\t46715 - 44032: 0x8CBE,\n\t46716 - 44032: 0x8CBF,\n\t46717 - 44032: 0x8CC0,\n\t46718 - 44032: 0x8CC1,\n\t46719 - 44032: 0x8CC2,\n\t46720 - 44032: 0x8CC3,\n\t46721 - 44032: 0x8CC4,\n\t46722 - 44032: 0x8CC5,\n\t46723 - 44032: 0x8CC6,\n\t46724 - 44032: 0x8CC7,\n\t46725 - 44032: 0x8CC8,\n\t46726 - 44032: 0x8CC9,\n\t46727 - 44032: 0x8CCA,\n\t46728 - 44032: 0x8CCB,\n\t46729 - 44032: 0x8CCC,\n\t46730 - 44032: 0x8CCD,\n\t46731 - 44032: 0x8CCE,\n\t46732 - 44032: 0x8CCF,\n\t46733 - 44032: 0x8CD0,\n\t46734 - 44032: 0x8CD1,\n\t46735 - 44032: 0x8CD2,\n\t46736 - 44032: 0x8CD3,\n\t46737 - 44032: 0x8CD4,\n\t46738 - 44032: 0x8CD5,\n\t46739 - 44032: 0x8CD6,\n\t46740 - 44032: 0x8CD7,\n\t46741 - 44032: 0x8CD8,\n\t46742 - 44032: 0x8CD9,\n\t46743 - 44032: 0x8CDA,\n\t46744 - 44032: 0x8CDB,\n\t46745 - 44032: 0x8CDC,\n\t46746 - 44032: 0x8CDD,\n\t46747 - 44032: 0x8CDE,\n\t46748 - 44032: 0xB6D1,\n\t46749 - 44032: 0xB6D2,\n\t46750 - 44032: 0x8CDF,\n\t46751 - 44032: 0x8CE0,\n\t46752 - 44032: 0xB6D3,\n\t46753 - 44032: 0x8CE1,\n\t46754 - 44032: 0x8CE2,\n\t46755 - 44032: 0x8CE3,\n\t46756 - 44032: 0xB6D4,\n\t46757 - 44032: 0x8CE4,\n\t46758 - 44032: 0x8CE5,\n\t46759 - 44032: 0x8CE6,\n\t46760 - 44032: 0x8CE7,\n\t46761 - 44032: 0x8CE8,\n\t46762 - 44032: 0x8CE9,\n\t46763 - 44032: 0xB6D5,\n\t46764 - 44032: 0xB6D6,\n\t46765 - 44032: 0x8CEA,\n\t46766 - 44032: 0x8CEB,\n\t46767 - 44032: 0x8CEC,\n\t46768 - 44032: 0x8CED,\n\t46769 - 44032: 0xB6D7,\n\t46770 - 44032: 0x8CEE,\n\t46771 - 44032: 0x8CEF,\n\t46772 - 44032: 0x8CF0,\n\t46773 - 44032: 0x8CF1,\n\t46774 - 44032: 0x8CF2,\n\t46775 - 44032: 0x8CF3,\n\t46776 - 44032: 0x8CF4,\n\t46777 - 44032: 0x8CF5,\n\t46778 - 44032: 0x8CF6,\n\t46779 - 44032: 0x8CF7,\n\t46780 - 44032: 0x8CF8,\n\t46781 - 44032: 0x8CF9,\n\t46782 - 44032: 0x8CFA,\n\t46783 - 44032: 0x8CFB,\n\t46784 - 44032: 0x8CFC,\n\t46785 - 44032: 0x8CFD,\n\t46786 - 44032: 0x8CFE,\n\t46787 - 44032: 0x8D41,\n\t46788 - 44032: 0x8D42,\n\t46789 - 44032: 0x8D43,\n\t46790 - 44032: 0x8D44,\n\t46791 - 44032: 0x8D45,\n\t46792 - 44032: 0x8D46,\n\t46793 - 44032: 0x8D47,\n\t46794 - 44032: 0x8D48,\n\t46795 - 44032: 0x8D49,\n\t46796 - 44032: 0x8D4A,\n\t46797 - 44032: 0x8D4B,\n\t46798 - 44032: 0x8D4C,\n\t46799 - 44032: 0x8D4D,\n\t46800 - 44032: 0x8D4E,\n\t46801 - 44032: 0x8D4F,\n\t46802 - 44032: 0x8D50,\n\t46803 - 44032: 0x8D51,\n\t46804 - 44032: 0xB6D8,\n\t46805 - 44032: 0x8D52,\n\t46806 - 44032: 0x8D53,\n\t46807 - 44032: 0x8D54,\n\t46808 - 44032: 0x8D55,\n\t46809 - 44032: 0x8D56,\n\t46810 - 44032: 0x8D57,\n\t46811 - 44032: 0x8D58,\n\t46812 - 44032: 0x8D59,\n\t46813 - 44032: 0x8D5A,\n\t46814 - 44032: 0x8D61,\n\t46815 - 44032: 0x8D62,\n\t46816 - 44032: 0x8D63,\n\t46817 - 44032: 0x8D64,\n\t46818 - 44032: 0x8D65,\n\t46819 - 44032: 0x8D66,\n\t46820 - 44032: 0x8D67,\n\t46821 - 44032: 0x8D68,\n\t46822 - 44032: 0x8D69,\n\t46823 - 44032: 0x8D6A,\n\t46824 - 44032: 0x8D6B,\n\t46825 - 44032: 0x8D6C,\n\t46826 - 44032: 0x8D6D,\n\t46827 - 44032: 0x8D6E,\n\t46828 - 44032: 0x8D6F,\n\t46829 - 44032: 0x8D70,\n\t46830 - 44032: 0x8D71,\n\t46831 - 44032: 0x8D72,\n\t46832 - 44032: 0xB6D9,\n\t46833 - 44032: 0x8D73,\n\t46834 - 44032: 0x8D74,\n\t46835 - 44032: 0x8D75,\n\t46836 - 44032: 0xB6DA,\n\t46837 - 44032: 0x8D76,\n\t46838 - 44032: 0x8D77,\n\t46839 - 44032: 0x8D78,\n\t46840 - 44032: 0xB6DB,\n\t46841 - 44032: 0x8D79,\n\t46842 - 44032: 0x8D7A,\n\t46843 - 44032: 0x8D81,\n\t46844 - 44032: 0x8D82,\n\t46845 - 44032: 0x8D83,\n\t46846 - 44032: 0x8D84,\n\t46847 - 44032: 0x8D85,\n\t46848 - 44032: 0xB6DC,\n\t46849 - 44032: 0xB6DD,\n\t46850 - 44032: 0x8D86,\n\t46851 - 44032: 0x8D87,\n\t46852 - 44032: 0x8D88,\n\t46853 - 44032: 0xB6DE,\n\t46854 - 44032: 0x8D89,\n\t46855 - 44032: 0x8D8A,\n\t46856 - 44032: 0x8D8B,\n\t46857 - 44032: 0x8D8C,\n\t46858 - 44032: 0x8D8D,\n\t46859 - 44032: 0x8D8E,\n\t46860 - 44032: 0x8D8F,\n\t46861 - 44032: 0x8D90,\n\t46862 - 44032: 0x8D91,\n\t46863 - 44032: 0x8D92,\n\t46864 - 44032: 0x8D93,\n\t46865 - 44032: 0x8D94,\n\t46866 - 44032: 0x8D95,\n\t46867 - 44032: 0x8D96,\n\t46868 - 44032: 0x8D97,\n\t46869 - 44032: 0x8D98,\n\t46870 - 44032: 0x8D99,\n\t46871 - 44032: 0x8D9A,\n\t46872 - 44032: 0x8D9B,\n\t46873 - 44032: 0x8D9C,\n\t46874 - 44032: 0x8D9D,\n\t46875 - 44032: 0x8D9E,\n\t46876 - 44032: 0x8D9F,\n\t46877 - 44032: 0x8DA0,\n\t46878 - 44032: 0x8DA1,\n\t46879 - 44032: 0x8DA2,\n\t46880 - 44032: 0x8DA3,\n\t46881 - 44032: 0x8DA4,\n\t46882 - 44032: 0x8DA5,\n\t46883 - 44032: 0x8DA6,\n\t46884 - 44032: 0x8DA7,\n\t46885 - 44032: 0x8DA8,\n\t46886 - 44032: 0x8DA9,\n\t46887 - 44032: 0x8DAA,\n\t46888 - 44032: 0xB6DF,\n\t46889 - 44032: 0xB6E0,\n\t46890 - 44032: 0x8DAB,\n\t46891 - 44032: 0x8DAC,\n\t46892 - 44032: 0xB6E1,\n\t46893 - 44032: 0x8DAD,\n\t46894 - 44032: 0x8DAE,\n\t46895 - 44032: 0xB6E2,\n\t46896 - 44032: 0xB6E3,\n\t46897 - 44032: 0x8DAF,\n\t46898 - 44032: 0x8DB0,\n\t46899 - 44032: 0x8DB1,\n\t46900 - 44032: 0x8DB2,\n\t46901 - 44032: 0x8DB3,\n\t46902 - 44032: 0x8DB4,\n\t46903 - 44032: 0x8DB5,\n\t46904 - 44032: 0xB6E4,\n\t46905 - 44032: 0xB6E5,\n\t46906 - 44032: 0x8DB6,\n\t46907 - 44032: 0xB6E6,\n\t46908 - 44032: 0x8DB7,\n\t46909 - 44032: 0x8DB8,\n\t46910 - 44032: 0x8DB9,\n\t46911 - 44032: 0x8DBA,\n\t46912 - 44032: 0x8DBB,\n\t46913 - 44032: 0x8DBC,\n\t46914 - 44032: 0x8DBD,\n\t46915 - 44032: 0x8DBE,\n\t46916 - 44032: 0xB6E7,\n\t46917 - 44032: 0x8DBF,\n\t46918 - 44032: 0x8DC0,\n\t46919 - 44032: 0x8DC1,\n\t46920 - 44032: 0xB6E8,\n\t46921 - 44032: 0x8DC2,\n\t46922 - 44032: 0x8DC3,\n\t46923 - 44032: 0x8DC4,\n\t46924 - 44032: 0xB6E9,\n\t46925 - 44032: 0x8DC5,\n\t46926 - 44032: 0x8DC6,\n\t46927 - 44032: 0x8DC7,\n\t46928 - 44032: 0x8DC8,\n\t46929 - 44032: 0x8DC9,\n\t46930 - 44032: 0x8DCA,\n\t46931 - 44032: 0x8DCB,\n\t46932 - 44032: 0xB6EA,\n\t46933 - 44032: 0xB6EB,\n\t46934 - 44032: 0x8DCC,\n\t46935 - 44032: 0x8DCD,\n\t46936 - 44032: 0x8DCE,\n\t46937 - 44032: 0x8DCF,\n\t46938 - 44032: 0x8DD0,\n\t46939 - 44032: 0x8DD1,\n\t46940 - 44032: 0x8DD2,\n\t46941 - 44032: 0x8DD3,\n\t46942 - 44032: 0x8DD4,\n\t46943 - 44032: 0x8DD5,\n\t46944 - 44032: 0xB6EC,\n\t46945 - 44032: 0x8DD6,\n\t46946 - 44032: 0x8DD7,\n\t46947 - 44032: 0x8DD8,\n\t46948 - 44032: 0xB6ED,\n\t46949 - 44032: 0x8DD9,\n\t46950 - 44032: 0x8DDA,\n\t46951 - 44032: 0x8DDB,\n\t46952 - 44032: 0xB6EE,\n\t46953 - 44032: 0x8DDC,\n\t46954 - 44032: 0x8DDD,\n\t46955 - 44032: 0x8DDE,\n\t46956 - 44032: 0x8DDF,\n\t46957 - 44032: 0x8DE0,\n\t46958 - 44032: 0x8DE1,\n\t46959 - 44032: 0x8DE2,\n\t46960 - 44032: 0xB6EF,\n\t46961 - 44032: 0xB6F0,\n\t46962 - 44032: 0x8DE3,\n\t46963 - 44032: 0xB6F1,\n\t46964 - 44032: 0x8DE4,\n\t46965 - 44032: 0xB6F2,\n\t46966 - 44032: 0x8DE5,\n\t46967 - 44032: 0x8DE6,\n\t46968 - 44032: 0x8DE7,\n\t46969 - 44032: 0x8DE8,\n\t46970 - 44032: 0x8DE9,\n\t46971 - 44032: 0x8DEA,\n\t46972 - 44032: 0xB6F3,\n\t46973 - 44032: 0xB6F4,\n\t46974 - 44032: 0x8DEB,\n\t46975 - 44032: 0x8DEC,\n\t46976 - 44032: 0xB6F5,\n\t46977 - 44032: 0x8DED,\n\t46978 - 44032: 0x8DEE,\n\t46979 - 44032: 0x8DEF,\n\t46980 - 44032: 0xB6F6,\n\t46981 - 44032: 0x8DF0,\n\t46982 - 44032: 0x8DF1,\n\t46983 - 44032: 0x8DF2,\n\t46984 - 44032: 0x8DF3,\n\t46985 - 44032: 0x8DF4,\n\t46986 - 44032: 0x8DF5,\n\t46987 - 44032: 0x8DF6,\n\t46988 - 44032: 0xB6F7,\n\t46989 - 44032: 0xB6F8,\n\t46990 - 44032: 0x8DF7,\n\t46991 - 44032: 0xB6F9,\n\t46992 - 44032: 0xB6FA,\n\t46993 - 44032: 0xB6FB,\n\t46994 - 44032: 0xB6FC,\n\t46995 - 44032: 0x8DF8,\n\t46996 - 44032: 0x8DF9,\n\t46997 - 44032: 0x8DFA,\n\t46998 - 44032: 0xB6FD,\n\t46999 - 44032: 0xB6FE,\n\t47000 - 44032: 0xB7A1,\n\t47001 - 44032: 0xB7A2,\n\t47002 - 44032: 0x8DFB,\n\t47003 - 44032: 0x8DFC,\n\t47004 - 44032: 0xB7A3,\n\t47005 - 44032: 0x8DFD,\n\t47006 - 44032: 0x8DFE,\n\t47007 - 44032: 0x8E41,\n\t47008 - 44032: 0xB7A4,\n\t47009 - 44032: 0x8E42,\n\t47010 - 44032: 0x8E43,\n\t47011 - 44032: 0x8E44,\n\t47012 - 44032: 0x8E45,\n\t47013 - 44032: 0x8E46,\n\t47014 - 44032: 0x8E47,\n\t47015 - 44032: 0x8E48,\n\t47016 - 44032: 0xB7A5,\n\t47017 - 44032: 0xB7A6,\n\t47018 - 44032: 0x8E49,\n\t47019 - 44032: 0xB7A7,\n\t47020 - 44032: 0xB7A8,\n\t47021 - 44032: 0xB7A9,\n\t47022 - 44032: 0x8E4A,\n\t47023 - 44032: 0x8E4B,\n\t47024 - 44032: 0x8E4C,\n\t47025 - 44032: 0x8E4D,\n\t47026 - 44032: 0x8E4E,\n\t47027 - 44032: 0x8E4F,\n\t47028 - 44032: 0xB7AA,\n\t47029 - 44032: 0xB7AB,\n\t47030 - 44032: 0x8E50,\n\t47031 - 44032: 0x8E51,\n\t47032 - 44032: 0xB7AC,\n\t47033 - 44032: 0x8E52,\n\t47034 - 44032: 0x8E53,\n\t47035 - 44032: 0x8E54,\n\t47036 - 44032: 0x8E55,\n\t47037 - 44032: 0x8E56,\n\t47038 - 44032: 0x8E57,\n\t47039 - 44032: 0x8E58,\n\t47040 - 44032: 0x8E59,\n\t47041 - 44032: 0x8E5A,\n\t47042 - 44032: 0x8E61,\n\t47043 - 44032: 0x8E62,\n\t47044 - 44032: 0x8E63,\n\t47045 - 44032: 0x8E64,\n\t47046 - 44032: 0x8E65,\n\t47047 - 44032: 0xB7AD,\n\t47048 - 44032: 0x8E66,\n\t47049 - 44032: 0xB7AE,\n\t47050 - 44032: 0x8E67,\n\t47051 - 44032: 0x8E68,\n\t47052 - 44032: 0x8E69,\n\t47053 - 44032: 0x8E6A,\n\t47054 - 44032: 0x8E6B,\n\t47055 - 44032: 0x8E6C,\n\t47056 - 44032: 0x8E6D,\n\t47057 - 44032: 0x8E6E,\n\t47058 - 44032: 0x8E6F,\n\t47059 - 44032: 0x8E70,\n\t47060 - 44032: 0x8E71,\n\t47061 - 44032: 0x8E72,\n\t47062 - 44032: 0x8E73,\n\t47063 - 44032: 0x8E74,\n\t47064 - 44032: 0x8E75,\n\t47065 - 44032: 0x8E76,\n\t47066 - 44032: 0x8E77,\n\t47067 - 44032: 0x8E78,\n\t47068 - 44032: 0x8E79,\n\t47069 - 44032: 0x8E7A,\n\t47070 - 44032: 0x8E81,\n\t47071 - 44032: 0x8E82,\n\t47072 - 44032: 0x8E83,\n\t47073 - 44032: 0x8E84,\n\t47074 - 44032: 0x8E85,\n\t47075 - 44032: 0x8E86,\n\t47076 - 44032: 0x8E87,\n\t47077 - 44032: 0x8E88,\n\t47078 - 44032: 0x8E89,\n\t47079 - 44032: 0x8E8A,\n\t47080 - 44032: 0x8E8B,\n\t47081 - 44032: 0x8E8C,\n\t47082 - 44032: 0x8E8D,\n\t47083 - 44032: 0x8E8E,\n\t47084 - 44032: 0xB7AF,\n\t47085 - 44032: 0xB7B0,\n\t47086 - 44032: 0x8E8F,\n\t47087 - 44032: 0x8E90,\n\t47088 - 44032: 0xB7B1,\n\t47089 - 44032: 0x8E91,\n\t47090 - 44032: 0x8E92,\n\t47091 - 44032: 0x8E93,\n\t47092 - 44032: 0xB7B2,\n\t47093 - 44032: 0x8E94,\n\t47094 - 44032: 0x8E95,\n\t47095 - 44032: 0x8E96,\n\t47096 - 44032: 0x8E97,\n\t47097 - 44032: 0x8E98,\n\t47098 - 44032: 0x8E99,\n\t47099 - 44032: 0x8E9A,\n\t47100 - 44032: 0xB7B3,\n\t47101 - 44032: 0xB7B4,\n\t47102 - 44032: 0x8E9B,\n\t47103 - 44032: 0xB7B5,\n\t47104 - 44032: 0xB7B6,\n\t47105 - 44032: 0xB7B7,\n\t47106 - 44032: 0x8E9C,\n\t47107 - 44032: 0x8E9D,\n\t47108 - 44032: 0x8E9E,\n\t47109 - 44032: 0x8E9F,\n\t47110 - 44032: 0x8EA0,\n\t47111 - 44032: 0xB7B8,\n\t47112 - 44032: 0xB7B9,\n\t47113 - 44032: 0xB7BA,\n\t47114 - 44032: 0x8EA1,\n\t47115 - 44032: 0x8EA2,\n\t47116 - 44032: 0xB7BB,\n\t47117 - 44032: 0x8EA3,\n\t47118 - 44032: 0x8EA4,\n\t47119 - 44032: 0x8EA5,\n\t47120 - 44032: 0xB7BC,\n\t47121 - 44032: 0x8EA6,\n\t47122 - 44032: 0x8EA7,\n\t47123 - 44032: 0x8EA8,\n\t47124 - 44032: 0x8EA9,\n\t47125 - 44032: 0x8EAA,\n\t47126 - 44032: 0x8EAB,\n\t47127 - 44032: 0x8EAC,\n\t47128 - 44032: 0xB7BD,\n\t47129 - 44032: 0xB7BE,\n\t47130 - 44032: 0x8EAD,\n\t47131 - 44032: 0xB7BF,\n\t47132 - 44032: 0x8EAE,\n\t47133 - 44032: 0xB7C0,\n\t47134 - 44032: 0x8EAF,\n\t47135 - 44032: 0x8EB0,\n\t47136 - 44032: 0x8EB1,\n\t47137 - 44032: 0x8EB2,\n\t47138 - 44032: 0x8EB3,\n\t47139 - 44032: 0x8EB4,\n\t47140 - 44032: 0xB7C1,\n\t47141 - 44032: 0xB7C2,\n\t47142 - 44032: 0x8EB5,\n\t47143 - 44032: 0x8EB6,\n\t47144 - 44032: 0xB7C3,\n\t47145 - 44032: 0x8EB7,\n\t47146 - 44032: 0x8EB8,\n\t47147 - 44032: 0x8EB9,\n\t47148 - 44032: 0xB7C4,\n\t47149 - 44032: 0x8EBA,\n\t47150 - 44032: 0x8EBB,\n\t47151 - 44032: 0x8EBC,\n\t47152 - 44032: 0x8EBD,\n\t47153 - 44032: 0x8EBE,\n\t47154 - 44032: 0x8EBF,\n\t47155 - 44032: 0x8EC0,\n\t47156 - 44032: 0xB7C5,\n\t47157 - 44032: 0xB7C6,\n\t47158 - 44032: 0x8EC1,\n\t47159 - 44032: 0xB7C7,\n\t47160 - 44032: 0xB7C8,\n\t47161 - 44032: 0xB7C9,\n\t47162 - 44032: 0x8EC2,\n\t47163 - 44032: 0x8EC3,\n\t47164 - 44032: 0x8EC4,\n\t47165 - 44032: 0x8EC5,\n\t47166 - 44032: 0x8EC6,\n\t47167 - 44032: 0x8EC7,\n\t47168 - 44032: 0xB7CA,\n\t47169 - 44032: 0x8EC8,\n\t47170 - 44032: 0x8EC9,\n\t47171 - 44032: 0x8ECA,\n\t47172 - 44032: 0xB7CB,\n\t47173 - 44032: 0x8ECB,\n\t47174 - 44032: 0x8ECC,\n\t47175 - 44032: 0x8ECD,\n\t47176 - 44032: 0x8ECE,\n\t47177 - 44032: 0x8ECF,\n\t47178 - 44032: 0x8ED0,\n\t47179 - 44032: 0x8ED1,\n\t47180 - 44032: 0x8ED2,\n\t47181 - 44032: 0x8ED3,\n\t47182 - 44032: 0x8ED4,\n\t47183 - 44032: 0x8ED5,\n\t47184 - 44032: 0x8ED6,\n\t47185 - 44032: 0xB7CC,\n\t47186 - 44032: 0x8ED7,\n\t47187 - 44032: 0xB7CD,\n\t47188 - 44032: 0x8ED8,\n\t47189 - 44032: 0x8ED9,\n\t47190 - 44032: 0x8EDA,\n\t47191 - 44032: 0x8EDB,\n\t47192 - 44032: 0x8EDC,\n\t47193 - 44032: 0x8EDD,\n\t47194 - 44032: 0x8EDE,\n\t47195 - 44032: 0x8EDF,\n\t47196 - 44032: 0xB7CE,\n\t47197 - 44032: 0xB7CF,\n\t47198 - 44032: 0x8EE0,\n\t47199 - 44032: 0x8EE1,\n\t47200 - 44032: 0xB7D0,\n\t47201 - 44032: 0x8EE2,\n\t47202 - 44032: 0x8EE3,\n\t47203 - 44032: 0x8EE4,\n\t47204 - 44032: 0xB7D1,\n\t47205 - 44032: 0x8EE5,\n\t47206 - 44032: 0x8EE6,\n\t47207 - 44032: 0x8EE7,\n\t47208 - 44032: 0x8EE8,\n\t47209 - 44032: 0x8EE9,\n\t47210 - 44032: 0x8EEA,\n\t47211 - 44032: 0x8EEB,\n\t47212 - 44032: 0xB7D2,\n\t47213 - 44032: 0xB7D3,\n\t47214 - 44032: 0x8EEC,\n\t47215 - 44032: 0xB7D4,\n\t47216 - 44032: 0x8EED,\n\t47217 - 44032: 0xB7D5,\n\t47218 - 44032: 0x8EEE,\n\t47219 - 44032: 0x8EEF,\n\t47220 - 44032: 0x8EF0,\n\t47221 - 44032: 0x8EF1,\n\t47222 - 44032: 0x8EF2,\n\t47223 - 44032: 0x8EF3,\n\t47224 - 44032: 0xB7D6,\n\t47225 - 44032: 0x8EF4,\n\t47226 - 44032: 0x8EF5,\n\t47227 - 44032: 0x8EF6,\n\t47228 - 44032: 0xB7D7,\n\t47229 - 44032: 0x8EF7,\n\t47230 - 44032: 0x8EF8,\n\t47231 - 44032: 0x8EF9,\n\t47232 - 44032: 0x8EFA,\n\t47233 - 44032: 0x8EFB,\n\t47234 - 44032: 0x8EFC,\n\t47235 - 44032: 0x8EFD,\n\t47236 - 44032: 0x8EFE,\n\t47237 - 44032: 0x8F41,\n\t47238 - 44032: 0x8F42,\n\t47239 - 44032: 0x8F43,\n\t47240 - 44032: 0x8F44,\n\t47241 - 44032: 0x8F45,\n\t47242 - 44032: 0x8F46,\n\t47243 - 44032: 0x8F47,\n\t47244 - 44032: 0x8F48,\n\t47245 - 44032: 0xB7D8,\n\t47246 - 44032: 0x8F49,\n\t47247 - 44032: 0x8F4A,\n\t47248 - 44032: 0x8F4B,\n\t47249 - 44032: 0x8F4C,\n\t47250 - 44032: 0x8F4D,\n\t47251 - 44032: 0x8F4E,\n\t47252 - 44032: 0x8F4F,\n\t47253 - 44032: 0x8F50,\n\t47254 - 44032: 0x8F51,\n\t47255 - 44032: 0x8F52,\n\t47256 - 44032: 0x8F53,\n\t47257 - 44032: 0x8F54,\n\t47258 - 44032: 0x8F55,\n\t47259 - 44032: 0x8F56,\n\t47260 - 44032: 0x8F57,\n\t47261 - 44032: 0x8F58,\n\t47262 - 44032: 0x8F59,\n\t47263 - 44032: 0x8F5A,\n\t47264 - 44032: 0x8F61,\n\t47265 - 44032: 0x8F62,\n\t47266 - 44032: 0x8F63,\n\t47267 - 44032: 0x8F64,\n\t47268 - 44032: 0x8F65,\n\t47269 - 44032: 0x8F66,\n\t47270 - 44032: 0x8F67,\n\t47271 - 44032: 0x8F68,\n\t47272 - 44032: 0xB7D9,\n\t47273 - 44032: 0x8F69,\n\t47274 - 44032: 0x8F6A,\n\t47275 - 44032: 0x8F6B,\n\t47276 - 44032: 0x8F6C,\n\t47277 - 44032: 0x8F6D,\n\t47278 - 44032: 0x8F6E,\n\t47279 - 44032: 0x8F6F,\n\t47280 - 44032: 0xB7DA,\n\t47281 - 44032: 0x8F70,\n\t47282 - 44032: 0x8F71,\n\t47283 - 44032: 0x8F72,\n\t47284 - 44032: 0xB7DB,\n\t47285 - 44032: 0x8F73,\n\t47286 - 44032: 0x8F74,\n\t47287 - 44032: 0x8F75,\n\t47288 - 44032: 0xB7DC,\n\t47289 - 44032: 0x8F76,\n\t47290 - 44032: 0x8F77,\n\t47291 - 44032: 0x8F78,\n\t47292 - 44032: 0x8F79,\n\t47293 - 44032: 0x8F7A,\n\t47294 - 44032: 0x8F81,\n\t47295 - 44032: 0x8F82,\n\t47296 - 44032: 0xB7DD,\n\t47297 - 44032: 0xB7DE,\n\t47298 - 44032: 0x8F83,\n\t47299 - 44032: 0xB7DF,\n\t47300 - 44032: 0x8F84,\n\t47301 - 44032: 0xB7E0,\n\t47302 - 44032: 0x8F85,\n\t47303 - 44032: 0x8F86,\n\t47304 - 44032: 0x8F87,\n\t47305 - 44032: 0x8F88,\n\t47306 - 44032: 0x8F89,\n\t47307 - 44032: 0x8F8A,\n\t47308 - 44032: 0xB7E1,\n\t47309 - 44032: 0x8F8B,\n\t47310 - 44032: 0x8F8C,\n\t47311 - 44032: 0x8F8D,\n\t47312 - 44032: 0xB7E2,\n\t47313 - 44032: 0x8F8E,\n\t47314 - 44032: 0x8F8F,\n\t47315 - 44032: 0x8F90,\n\t47316 - 44032: 0xB7E3,\n\t47317 - 44032: 0x8F91,\n\t47318 - 44032: 0x8F92,\n\t47319 - 44032: 0x8F93,\n\t47320 - 44032: 0x8F94,\n\t47321 - 44032: 0x8F95,\n\t47322 - 44032: 0x8F96,\n\t47323 - 44032: 0x8F97,\n\t47324 - 44032: 0x8F98,\n\t47325 - 44032: 0xB7E4,\n\t47326 - 44032: 0x8F99,\n\t47327 - 44032: 0xB7E5,\n\t47328 - 44032: 0x8F9A,\n\t47329 - 44032: 0xB7E6,\n\t47330 - 44032: 0x8F9B,\n\t47331 - 44032: 0x8F9C,\n\t47332 - 44032: 0x8F9D,\n\t47333 - 44032: 0x8F9E,\n\t47334 - 44032: 0x8F9F,\n\t47335 - 44032: 0x8FA0,\n\t47336 - 44032: 0xB7E7,\n\t47337 - 44032: 0xB7E8,\n\t47338 - 44032: 0x8FA1,\n\t47339 - 44032: 0x8FA2,\n\t47340 - 44032: 0xB7E9,\n\t47341 - 44032: 0x8FA3,\n\t47342 - 44032: 0x8FA4,\n\t47343 - 44032: 0x8FA5,\n\t47344 - 44032: 0xB7EA,\n\t47345 - 44032: 0x8FA6,\n\t47346 - 44032: 0x8FA7,\n\t47347 - 44032: 0x8FA8,\n\t47348 - 44032: 0x8FA9,\n\t47349 - 44032: 0x8FAA,\n\t47350 - 44032: 0x8FAB,\n\t47351 - 44032: 0x8FAC,\n\t47352 - 44032: 0xB7EB,\n\t47353 - 44032: 0xB7EC,\n\t47354 - 44032: 0x8FAD,\n\t47355 - 44032: 0xB7ED,\n\t47356 - 44032: 0x8FAE,\n\t47357 - 44032: 0xB7EE,\n\t47358 - 44032: 0x8FAF,\n\t47359 - 44032: 0x8FB0,\n\t47360 - 44032: 0x8FB1,\n\t47361 - 44032: 0x8FB2,\n\t47362 - 44032: 0x8FB3,\n\t47363 - 44032: 0x8FB4,\n\t47364 - 44032: 0xB7EF,\n\t47365 - 44032: 0x8FB5,\n\t47366 - 44032: 0x8FB6,\n\t47367 - 44032: 0x8FB7,\n\t47368 - 44032: 0x8FB8,\n\t47369 - 44032: 0x8FB9,\n\t47370 - 44032: 0x8FBA,\n\t47371 - 44032: 0x8FBB,\n\t47372 - 44032: 0x8FBC,\n\t47373 - 44032: 0x8FBD,\n\t47374 - 44032: 0x8FBE,\n\t47375 - 44032: 0x8FBF,\n\t47376 - 44032: 0x8FC0,\n\t47377 - 44032: 0x8FC1,\n\t47378 - 44032: 0x8FC2,\n\t47379 - 44032: 0x8FC3,\n\t47380 - 44032: 0x8FC4,\n\t47381 - 44032: 0x8FC5,\n\t47382 - 44032: 0x8FC6,\n\t47383 - 44032: 0x8FC7,\n\t47384 - 44032: 0xB7F0,\n\t47385 - 44032: 0x8FC8,\n\t47386 - 44032: 0x8FC9,\n\t47387 - 44032: 0x8FCA,\n\t47388 - 44032: 0x8FCB,\n\t47389 - 44032: 0x8FCC,\n\t47390 - 44032: 0x8FCD,\n\t47391 - 44032: 0x8FCE,\n\t47392 - 44032: 0xB7F1,\n\t47393 - 44032: 0x8FCF,\n\t47394 - 44032: 0x8FD0,\n\t47395 - 44032: 0x8FD1,\n\t47396 - 44032: 0x8FD2,\n\t47397 - 44032: 0x8FD3,\n\t47398 - 44032: 0x8FD4,\n\t47399 - 44032: 0x8FD5,\n\t47400 - 44032: 0x8FD6,\n\t47401 - 44032: 0x8FD7,\n\t47402 - 44032: 0x8FD8,\n\t47403 - 44032: 0x8FD9,\n\t47404 - 44032: 0x8FDA,\n\t47405 - 44032: 0x8FDB,\n\t47406 - 44032: 0x8FDC,\n\t47407 - 44032: 0x8FDD,\n\t47408 - 44032: 0x8FDE,\n\t47409 - 44032: 0x8FDF,\n\t47410 - 44032: 0x8FE0,\n\t47411 - 44032: 0x8FE1,\n\t47412 - 44032: 0x8FE2,\n\t47413 - 44032: 0x8FE3,\n\t47414 - 44032: 0x8FE4,\n\t47415 - 44032: 0x8FE5,\n\t47416 - 44032: 0x8FE6,\n\t47417 - 44032: 0x8FE7,\n\t47418 - 44032: 0x8FE8,\n\t47419 - 44032: 0x8FE9,\n\t47420 - 44032: 0xB7F2,\n\t47421 - 44032: 0xB7F3,\n\t47422 - 44032: 0x8FEA,\n\t47423 - 44032: 0x8FEB,\n\t47424 - 44032: 0xB7F4,\n\t47425 - 44032: 0x8FEC,\n\t47426 - 44032: 0x8FED,\n\t47427 - 44032: 0x8FEE,\n\t47428 - 44032: 0xB7F5,\n\t47429 - 44032: 0x8FEF,\n\t47430 - 44032: 0x8FF0,\n\t47431 - 44032: 0x8FF1,\n\t47432 - 44032: 0x8FF2,\n\t47433 - 44032: 0x8FF3,\n\t47434 - 44032: 0x8FF4,\n\t47435 - 44032: 0x8FF5,\n\t47436 - 44032: 0xB7F6,\n\t47437 - 44032: 0x8FF6,\n\t47438 - 44032: 0x8FF7,\n\t47439 - 44032: 0xB7F7,\n\t47440 - 44032: 0x8FF8,\n\t47441 - 44032: 0xB7F8,\n\t47442 - 44032: 0x8FF9,\n\t47443 - 44032: 0x8FFA,\n\t47444 - 44032: 0x8FFB,\n\t47445 - 44032: 0x8FFC,\n\t47446 - 44032: 0x8FFD,\n\t47447 - 44032: 0x8FFE,\n\t47448 - 44032: 0xB7F9,\n\t47449 - 44032: 0xB7FA,\n\t47450 - 44032: 0x9041,\n\t47451 - 44032: 0x9042,\n\t47452 - 44032: 0xB7FB,\n\t47453 - 44032: 0x9043,\n\t47454 - 44032: 0x9044,\n\t47455 - 44032: 0x9045,\n\t47456 - 44032: 0xB7FC,\n\t47457 - 44032: 0x9046,\n\t47458 - 44032: 0x9047,\n\t47459 - 44032: 0x9048,\n\t47460 - 44032: 0x9049,\n\t47461 - 44032: 0x904A,\n\t47462 - 44032: 0x904B,\n\t47463 - 44032: 0x904C,\n\t47464 - 44032: 0xB7FD,\n\t47465 - 44032: 0xB7FE,\n\t47466 - 44032: 0x904D,\n\t47467 - 44032: 0xB8A1,\n\t47468 - 44032: 0x904E,\n\t47469 - 44032: 0xB8A2,\n\t47470 - 44032: 0x904F,\n\t47471 - 44032: 0x9050,\n\t47472 - 44032: 0x9051,\n\t47473 - 44032: 0x9052,\n\t47474 - 44032: 0x9053,\n\t47475 - 44032: 0x9054,\n\t47476 - 44032: 0xB8A3,\n\t47477 - 44032: 0xB8A4,\n\t47478 - 44032: 0x9055,\n\t47479 - 44032: 0x9056,\n\t47480 - 44032: 0xB8A5,\n\t47481 - 44032: 0x9057,\n\t47482 - 44032: 0x9058,\n\t47483 - 44032: 0x9059,\n\t47484 - 44032: 0xB8A6,\n\t47485 - 44032: 0x905A,\n\t47486 - 44032: 0x9061,\n\t47487 - 44032: 0x9062,\n\t47488 - 44032: 0x9063,\n\t47489 - 44032: 0x9064,\n\t47490 - 44032: 0x9065,\n\t47491 - 44032: 0x9066,\n\t47492 - 44032: 0xB8A7,\n\t47493 - 44032: 0xB8A8,\n\t47494 - 44032: 0x9067,\n\t47495 - 44032: 0xB8A9,\n\t47496 - 44032: 0x9068,\n\t47497 - 44032: 0xB8AA,\n\t47498 - 44032: 0xB8AB,\n\t47499 - 44032: 0x9069,\n\t47500 - 44032: 0x906A,\n\t47501 - 44032: 0xB8AC,\n\t47502 - 44032: 0xB8AD,\n\t47503 - 44032: 0x906B,\n\t47504 - 44032: 0x906C,\n\t47505 - 44032: 0x906D,\n\t47506 - 44032: 0x906E,\n\t47507 - 44032: 0x906F,\n\t47508 - 44032: 0x9070,\n\t47509 - 44032: 0x9071,\n\t47510 - 44032: 0x9072,\n\t47511 - 44032: 0x9073,\n\t47512 - 44032: 0x9074,\n\t47513 - 44032: 0x9075,\n\t47514 - 44032: 0x9076,\n\t47515 - 44032: 0x9077,\n\t47516 - 44032: 0x9078,\n\t47517 - 44032: 0x9079,\n\t47518 - 44032: 0x907A,\n\t47519 - 44032: 0x9081,\n\t47520 - 44032: 0x9082,\n\t47521 - 44032: 0x9083,\n\t47522 - 44032: 0x9084,\n\t47523 - 44032: 0x9085,\n\t47524 - 44032: 0x9086,\n\t47525 - 44032: 0x9087,\n\t47526 - 44032: 0x9088,\n\t47527 - 44032: 0x9089,\n\t47528 - 44032: 0x908A,\n\t47529 - 44032: 0x908B,\n\t47530 - 44032: 0x908C,\n\t47531 - 44032: 0x908D,\n\t47532 - 44032: 0xB8AE,\n\t47533 - 44032: 0xB8AF,\n\t47534 - 44032: 0x908E,\n\t47535 - 44032: 0x908F,\n\t47536 - 44032: 0xB8B0,\n\t47537 - 44032: 0x9090,\n\t47538 - 44032: 0x9091,\n\t47539 - 44032: 0x9092,\n\t47540 - 44032: 0xB8B1,\n\t47541 - 44032: 0x9093,\n\t47542 - 44032: 0x9094,\n\t47543 - 44032: 0x9095,\n\t47544 - 44032: 0x9096,\n\t47545 - 44032: 0x9097,\n\t47546 - 44032: 0x9098,\n\t47547 - 44032: 0x9099,\n\t47548 - 44032: 0xB8B2,\n\t47549 - 44032: 0xB8B3,\n\t47550 - 44032: 0x909A,\n\t47551 - 44032: 0xB8B4,\n\t47552 - 44032: 0x909B,\n\t47553 - 44032: 0xB8B5,\n\t47554 - 44032: 0x909C,\n\t47555 - 44032: 0x909D,\n\t47556 - 44032: 0x909E,\n\t47557 - 44032: 0x909F,\n\t47558 - 44032: 0x90A0,\n\t47559 - 44032: 0x90A1,\n\t47560 - 44032: 0xB8B6,\n\t47561 - 44032: 0xB8B7,\n\t47562 - 44032: 0x90A2,\n\t47563 - 44032: 0x90A3,\n\t47564 - 44032: 0xB8B8,\n\t47565 - 44032: 0x90A4,\n\t47566 - 44032: 0xB8B9,\n\t47567 - 44032: 0xB8BA,\n\t47568 - 44032: 0xB8BB,\n\t47569 - 44032: 0xB8BC,\n\t47570 - 44032: 0xB8BD,\n\t47571 - 44032: 0x90A5,\n\t47572 - 44032: 0x90A6,\n\t47573 - 44032: 0x90A7,\n\t47574 - 44032: 0x90A8,\n\t47575 - 44032: 0x90A9,\n\t47576 - 44032: 0xB8BE,\n\t47577 - 44032: 0xB8BF,\n\t47578 - 44032: 0x90AA,\n\t47579 - 44032: 0xB8C0,\n\t47580 - 44032: 0x90AB,\n\t47581 - 44032: 0xB8C1,\n\t47582 - 44032: 0xB8C2,\n\t47583 - 44032: 0x90AC,\n\t47584 - 44032: 0x90AD,\n\t47585 - 44032: 0xB8C3,\n\t47586 - 44032: 0x90AE,\n\t47587 - 44032: 0xB8C4,\n\t47588 - 44032: 0xB8C5,\n\t47589 - 44032: 0xB8C6,\n\t47590 - 44032: 0x90AF,\n\t47591 - 44032: 0x90B0,\n\t47592 - 44032: 0xB8C7,\n\t47593 - 44032: 0x90B1,\n\t47594 - 44032: 0x90B2,\n\t47595 - 44032: 0x90B3,\n\t47596 - 44032: 0xB8C8,\n\t47597 - 44032: 0x90B4,\n\t47598 - 44032: 0x90B5,\n\t47599 - 44032: 0x90B6,\n\t47600 - 44032: 0x90B7,\n\t47601 - 44032: 0x90B8,\n\t47602 - 44032: 0x90B9,\n\t47603 - 44032: 0x90BA,\n\t47604 - 44032: 0xB8C9,\n\t47605 - 44032: 0xB8CA,\n\t47606 - 44032: 0x90BB,\n\t47607 - 44032: 0xB8CB,\n\t47608 - 44032: 0xB8CC,\n\t47609 - 44032: 0xB8CD,\n\t47610 - 44032: 0xB8CE,\n\t47611 - 44032: 0x90BC,\n\t47612 - 44032: 0x90BD,\n\t47613 - 44032: 0x90BE,\n\t47614 - 44032: 0x90BF,\n\t47615 - 44032: 0x90C0,\n\t47616 - 44032: 0xB8CF,\n\t47617 - 44032: 0xB8D0,\n\t47618 - 44032: 0x90C1,\n\t47619 - 44032: 0x90C2,\n\t47620 - 44032: 0x90C3,\n\t47621 - 44032: 0x90C4,\n\t47622 - 44032: 0x90C5,\n\t47623 - 44032: 0x90C6,\n\t47624 - 44032: 0xB8D1,\n\t47625 - 44032: 0x90C7,\n\t47626 - 44032: 0x90C8,\n\t47627 - 44032: 0x90C9,\n\t47628 - 44032: 0x90CA,\n\t47629 - 44032: 0x90CB,\n\t47630 - 44032: 0x90CC,\n\t47631 - 44032: 0x90CD,\n\t47632 - 44032: 0x90CE,\n\t47633 - 44032: 0x90CF,\n\t47634 - 44032: 0x90D0,\n\t47635 - 44032: 0x90D1,\n\t47636 - 44032: 0x90D2,\n\t47637 - 44032: 0xB8D2,\n\t47638 - 44032: 0x90D3,\n\t47639 - 44032: 0x90D4,\n\t47640 - 44032: 0x90D5,\n\t47641 - 44032: 0x90D6,\n\t47642 - 44032: 0x90D7,\n\t47643 - 44032: 0x90D8,\n\t47644 - 44032: 0x90D9,\n\t47645 - 44032: 0x90DA,\n\t47646 - 44032: 0x90DB,\n\t47647 - 44032: 0x90DC,\n\t47648 - 44032: 0x90DD,\n\t47649 - 44032: 0x90DE,\n\t47650 - 44032: 0x90DF,\n\t47651 - 44032: 0x90E0,\n\t47652 - 44032: 0x90E1,\n\t47653 - 44032: 0x90E2,\n\t47654 - 44032: 0x90E3,\n\t47655 - 44032: 0x90E4,\n\t47656 - 44032: 0x90E5,\n\t47657 - 44032: 0x90E6,\n\t47658 - 44032: 0x90E7,\n\t47659 - 44032: 0x90E8,\n\t47660 - 44032: 0x90E9,\n\t47661 - 44032: 0x90EA,\n\t47662 - 44032: 0x90EB,\n\t47663 - 44032: 0x90EC,\n\t47664 - 44032: 0x90ED,\n\t47665 - 44032: 0x90EE,\n\t47666 - 44032: 0x90EF,\n\t47667 - 44032: 0x90F0,\n\t47668 - 44032: 0x90F1,\n\t47669 - 44032: 0x90F2,\n\t47670 - 44032: 0x90F3,\n\t47671 - 44032: 0x90F4,\n\t47672 - 44032: 0xB8D3,\n\t47673 - 44032: 0xB8D4,\n\t47674 - 44032: 0x90F5,\n\t47675 - 44032: 0x90F6,\n\t47676 - 44032: 0xB8D5,\n\t47677 - 44032: 0x90F7,\n\t47678 - 44032: 0x90F8,\n\t47679 - 44032: 0x90F9,\n\t47680 - 44032: 0xB8D6,\n\t47681 - 44032: 0x90FA,\n\t47682 - 44032: 0xB8D7,\n\t47683 - 44032: 0x90FB,\n\t47684 - 44032: 0x90FC,\n\t47685 - 44032: 0x90FD,\n\t47686 - 44032: 0x90FE,\n\t47687 - 44032: 0x9141,\n\t47688 - 44032: 0xB8D8,\n\t47689 - 44032: 0xB8D9,\n\t47690 - 44032: 0x9142,\n\t47691 - 44032: 0xB8DA,\n\t47692 - 44032: 0x9143,\n\t47693 - 44032: 0xB8DB,\n\t47694 - 44032: 0xB8DC,\n\t47695 - 44032: 0x9144,\n\t47696 - 44032: 0x9145,\n\t47697 - 44032: 0x9146,\n\t47698 - 44032: 0x9147,\n\t47699 - 44032: 0xB8DD,\n\t47700 - 44032: 0xB8DE,\n\t47701 - 44032: 0xB8DF,\n\t47702 - 44032: 0x9148,\n\t47703 - 44032: 0x9149,\n\t47704 - 44032: 0xB8E0,\n\t47705 - 44032: 0x914A,\n\t47706 - 44032: 0x914B,\n\t47707 - 44032: 0x914C,\n\t47708 - 44032: 0xB8E1,\n\t47709 - 44032: 0x914D,\n\t47710 - 44032: 0x914E,\n\t47711 - 44032: 0x914F,\n\t47712 - 44032: 0x9150,\n\t47713 - 44032: 0x9151,\n\t47714 - 44032: 0x9152,\n\t47715 - 44032: 0x9153,\n\t47716 - 44032: 0xB8E2,\n\t47717 - 44032: 0xB8E3,\n\t47718 - 44032: 0x9154,\n\t47719 - 44032: 0xB8E4,\n\t47720 - 44032: 0xB8E5,\n\t47721 - 44032: 0xB8E6,\n\t47722 - 44032: 0x9155,\n\t47723 - 44032: 0x9156,\n\t47724 - 44032: 0x9157,\n\t47725 - 44032: 0x9158,\n\t47726 - 44032: 0x9159,\n\t47727 - 44032: 0x915A,\n\t47728 - 44032: 0xB8E7,\n\t47729 - 44032: 0xB8E8,\n\t47730 - 44032: 0x9161,\n\t47731 - 44032: 0x9162,\n\t47732 - 44032: 0xB8E9,\n\t47733 - 44032: 0x9163,\n\t47734 - 44032: 0x9164,\n\t47735 - 44032: 0x9165,\n\t47736 - 44032: 0xB8EA,\n\t47737 - 44032: 0x9166,\n\t47738 - 44032: 0x9167,\n\t47739 - 44032: 0x9168,\n\t47740 - 44032: 0x9169,\n\t47741 - 44032: 0x916A,\n\t47742 - 44032: 0x916B,\n\t47743 - 44032: 0x916C,\n\t47744 - 44032: 0x916D,\n\t47745 - 44032: 0x916E,\n\t47746 - 44032: 0x916F,\n\t47747 - 44032: 0xB8EB,\n\t47748 - 44032: 0xB8EC,\n\t47749 - 44032: 0xB8ED,\n\t47750 - 44032: 0x9170,\n\t47751 - 44032: 0xB8EE,\n\t47752 - 44032: 0x9171,\n\t47753 - 44032: 0x9172,\n\t47754 - 44032: 0x9173,\n\t47755 - 44032: 0x9174,\n\t47756 - 44032: 0xB8EF,\n\t47757 - 44032: 0x9175,\n\t47758 - 44032: 0x9176,\n\t47759 - 44032: 0x9177,\n\t47760 - 44032: 0x9178,\n\t47761 - 44032: 0x9179,\n\t47762 - 44032: 0x917A,\n\t47763 - 44032: 0x9181,\n\t47764 - 44032: 0x9182,\n\t47765 - 44032: 0x9183,\n\t47766 - 44032: 0x9184,\n\t47767 - 44032: 0x9185,\n\t47768 - 44032: 0x9186,\n\t47769 - 44032: 0x9187,\n\t47770 - 44032: 0x9188,\n\t47771 - 44032: 0x9189,\n\t47772 - 44032: 0x918A,\n\t47773 - 44032: 0x918B,\n\t47774 - 44032: 0x918C,\n\t47775 - 44032: 0x918D,\n\t47776 - 44032: 0x918E,\n\t47777 - 44032: 0x918F,\n\t47778 - 44032: 0x9190,\n\t47779 - 44032: 0x9191,\n\t47780 - 44032: 0x9192,\n\t47781 - 44032: 0x9193,\n\t47782 - 44032: 0x9194,\n\t47783 - 44032: 0x9195,\n\t47784 - 44032: 0xB8F0,\n\t47785 - 44032: 0xB8F1,\n\t47786 - 44032: 0x9196,\n\t47787 - 44032: 0xB8F2,\n\t47788 - 44032: 0xB8F3,\n\t47789 - 44032: 0x9197,\n\t47790 - 44032: 0x9198,\n\t47791 - 44032: 0x9199,\n\t47792 - 44032: 0xB8F4,\n\t47793 - 44032: 0x919A,\n\t47794 - 44032: 0xB8F5,\n\t47795 - 44032: 0x919B,\n\t47796 - 44032: 0x919C,\n\t47797 - 44032: 0x919D,\n\t47798 - 44032: 0x919E,\n\t47799 - 44032: 0x919F,\n\t47800 - 44032: 0xB8F6,\n\t47801 - 44032: 0xB8F7,\n\t47802 - 44032: 0x91A0,\n\t47803 - 44032: 0xB8F8,\n\t47804 - 44032: 0x91A1,\n\t47805 - 44032: 0xB8F9,\n\t47806 - 44032: 0x91A2,\n\t47807 - 44032: 0x91A3,\n\t47808 - 44032: 0x91A4,\n\t47809 - 44032: 0x91A5,\n\t47810 - 44032: 0x91A6,\n\t47811 - 44032: 0x91A7,\n\t47812 - 44032: 0xB8FA,\n\t47813 - 44032: 0x91A8,\n\t47814 - 44032: 0x91A9,\n\t47815 - 44032: 0x91AA,\n\t47816 - 44032: 0xB8FB,\n\t47817 - 44032: 0x91AB,\n\t47818 - 44032: 0x91AC,\n\t47819 - 44032: 0x91AD,\n\t47820 - 44032: 0x91AE,\n\t47821 - 44032: 0x91AF,\n\t47822 - 44032: 0x91B0,\n\t47823 - 44032: 0x91B1,\n\t47824 - 44032: 0x91B2,\n\t47825 - 44032: 0x91B3,\n\t47826 - 44032: 0x91B4,\n\t47827 - 44032: 0x91B5,\n\t47828 - 44032: 0x91B6,\n\t47829 - 44032: 0x91B7,\n\t47830 - 44032: 0x91B8,\n\t47831 - 44032: 0x91B9,\n\t47832 - 44032: 0xB8FC,\n\t47833 - 44032: 0xB8FD,\n\t47834 - 44032: 0x91BA,\n\t47835 - 44032: 0x91BB,\n\t47836 - 44032: 0x91BC,\n\t47837 - 44032: 0x91BD,\n\t47838 - 44032: 0x91BE,\n\t47839 - 44032: 0x91BF,\n\t47840 - 44032: 0x91C0,\n\t47841 - 44032: 0x91C1,\n\t47842 - 44032: 0x91C2,\n\t47843 - 44032: 0x91C3,\n\t47844 - 44032: 0x91C4,\n\t47845 - 44032: 0x91C5,\n\t47846 - 44032: 0x91C6,\n\t47847 - 44032: 0x91C7,\n\t47848 - 44032: 0x91C8,\n\t47849 - 44032: 0x91C9,\n\t47850 - 44032: 0x91CA,\n\t47851 - 44032: 0x91CB,\n\t47852 - 44032: 0x91CC,\n\t47853 - 44032: 0x91CD,\n\t47854 - 44032: 0x91CE,\n\t47855 - 44032: 0x91CF,\n\t47856 - 44032: 0x91D0,\n\t47857 - 44032: 0x91D1,\n\t47858 - 44032: 0x91D2,\n\t47859 - 44032: 0x91D3,\n\t47860 - 44032: 0x91D4,\n\t47861 - 44032: 0x91D5,\n\t47862 - 44032: 0x91D6,\n\t47863 - 44032: 0x91D7,\n\t47864 - 44032: 0x91D8,\n\t47865 - 44032: 0x91D9,\n\t47866 - 44032: 0x91DA,\n\t47867 - 44032: 0x91DB,\n\t47868 - 44032: 0xB8FE,\n\t47869 - 44032: 0x91DC,\n\t47870 - 44032: 0x91DD,\n\t47871 - 44032: 0x91DE,\n\t47872 - 44032: 0xB9A1,\n\t47873 - 44032: 0x91DF,\n\t47874 - 44032: 0x91E0,\n\t47875 - 44032: 0x91E1,\n\t47876 - 44032: 0xB9A2,\n\t47877 - 44032: 0x91E2,\n\t47878 - 44032: 0x91E3,\n\t47879 - 44032: 0x91E4,\n\t47880 - 44032: 0x91E5,\n\t47881 - 44032: 0x91E6,\n\t47882 - 44032: 0x91E7,\n\t47883 - 44032: 0x91E8,\n\t47884 - 44032: 0x91E9,\n\t47885 - 44032: 0xB9A3,\n\t47886 - 44032: 0x91EA,\n\t47887 - 44032: 0xB9A4,\n\t47888 - 44032: 0x91EB,\n\t47889 - 44032: 0xB9A5,\n\t47890 - 44032: 0x91EC,\n\t47891 - 44032: 0x91ED,\n\t47892 - 44032: 0x91EE,\n\t47893 - 44032: 0x91EF,\n\t47894 - 44032: 0x91F0,\n\t47895 - 44032: 0x91F1,\n\t47896 - 44032: 0xB9A6,\n\t47897 - 44032: 0x91F2,\n\t47898 - 44032: 0x91F3,\n\t47899 - 44032: 0x91F4,\n\t47900 - 44032: 0xB9A7,\n\t47901 - 44032: 0x91F5,\n\t47902 - 44032: 0x91F6,\n\t47903 - 44032: 0x91F7,\n\t47904 - 44032: 0xB9A8,\n\t47905 - 44032: 0x91F8,\n\t47906 - 44032: 0x91F9,\n\t47907 - 44032: 0x91FA,\n\t47908 - 44032: 0x91FB,\n\t47909 - 44032: 0x91FC,\n\t47910 - 44032: 0x91FD,\n\t47911 - 44032: 0x91FE,\n\t47912 - 44032: 0x9241,\n\t47913 - 44032: 0xB9A9,\n\t47914 - 44032: 0x9242,\n\t47915 - 44032: 0xB9AA,\n\t47916 - 44032: 0x9243,\n\t47917 - 44032: 0x9244,\n\t47918 - 44032: 0x9245,\n\t47919 - 44032: 0x9246,\n\t47920 - 44032: 0x9247,\n\t47921 - 44032: 0x9248,\n\t47922 - 44032: 0x9249,\n\t47923 - 44032: 0x924A,\n\t47924 - 44032: 0xB9AB,\n\t47925 - 44032: 0xB9AC,\n\t47926 - 44032: 0xB9AD,\n\t47927 - 44032: 0x924B,\n\t47928 - 44032: 0xB9AE,\n\t47929 - 44032: 0x924C,\n\t47930 - 44032: 0x924D,\n\t47931 - 44032: 0xB9AF,\n\t47932 - 44032: 0xB9B0,\n\t47933 - 44032: 0xB9B1,\n\t47934 - 44032: 0xB9B2,\n\t47935 - 44032: 0x924E,\n\t47936 - 44032: 0x924F,\n\t47937 - 44032: 0x9250,\n\t47938 - 44032: 0x9251,\n\t47939 - 44032: 0x9252,\n\t47940 - 44032: 0xB9B3,\n\t47941 - 44032: 0xB9B4,\n\t47942 - 44032: 0x9253,\n\t47943 - 44032: 0xB9B5,\n\t47944 - 44032: 0x9254,\n\t47945 - 44032: 0xB9B6,\n\t47946 - 44032: 0x9255,\n\t47947 - 44032: 0x9256,\n\t47948 - 44032: 0x9257,\n\t47949 - 44032: 0xB9B7,\n\t47950 - 44032: 0x9258,\n\t47951 - 44032: 0xB9B8,\n\t47952 - 44032: 0xB9B9,\n\t47953 - 44032: 0x9259,\n\t47954 - 44032: 0x925A,\n\t47955 - 44032: 0x9261,\n\t47956 - 44032: 0xB9BA,\n\t47957 - 44032: 0x9262,\n\t47958 - 44032: 0x9263,\n\t47959 - 44032: 0x9264,\n\t47960 - 44032: 0xB9BB,\n\t47961 - 44032: 0x9265,\n\t47962 - 44032: 0x9266,\n\t47963 - 44032: 0x9267,\n\t47964 - 44032: 0x9268,\n\t47965 - 44032: 0x9269,\n\t47966 - 44032: 0x926A,\n\t47967 - 44032: 0x926B,\n\t47968 - 44032: 0x926C,\n\t47969 - 44032: 0xB9BC,\n\t47970 - 44032: 0x926D,\n\t47971 - 44032: 0xB9BD,\n\t47972 - 44032: 0x926E,\n\t47973 - 44032: 0x926F,\n\t47974 - 44032: 0x9270,\n\t47975 - 44032: 0x9271,\n\t47976 - 44032: 0x9272,\n\t47977 - 44032: 0x9273,\n\t47978 - 44032: 0x9274,\n\t47979 - 44032: 0x9275,\n\t47980 - 44032: 0xB9BE,\n\t47981 - 44032: 0x9276,\n\t47982 - 44032: 0x9277,\n\t47983 - 44032: 0x9278,\n\t47984 - 44032: 0x9279,\n\t47985 - 44032: 0x927A,\n\t47986 - 44032: 0x9281,\n\t47987 - 44032: 0x9282,\n\t47988 - 44032: 0x9283,\n\t47989 - 44032: 0x9284,\n\t47990 - 44032: 0x9285,\n\t47991 - 44032: 0x9286,\n\t47992 - 44032: 0x9287,\n\t47993 - 44032: 0x9288,\n\t47994 - 44032: 0x9289,\n\t47995 - 44032: 0x928A,\n\t47996 - 44032: 0x928B,\n\t47997 - 44032: 0x928C,\n\t47998 - 44032: 0x928D,\n\t47999 - 44032: 0x928E,\n\t48000 - 44032: 0x928F,\n\t48001 - 44032: 0x9290,\n\t48002 - 44032: 0x9291,\n\t48003 - 44032: 0x9292,\n\t48004 - 44032: 0x9293,\n\t48005 - 44032: 0x9294,\n\t48006 - 44032: 0x9295,\n\t48007 - 44032: 0x9296,\n\t48008 - 44032: 0xB9BF,\n\t48009 - 44032: 0x9297,\n\t48010 - 44032: 0x9298,\n\t48011 - 44032: 0x9299,\n\t48012 - 44032: 0xB9C0,\n\t48013 - 44032: 0x929A,\n\t48014 - 44032: 0x929B,\n\t48015 - 44032: 0x929C,\n\t48016 - 44032: 0xB9C1,\n\t48017 - 44032: 0x929D,\n\t48018 - 44032: 0x929E,\n\t48019 - 44032: 0x929F,\n\t48020 - 44032: 0x92A0,\n\t48021 - 44032: 0x92A1,\n\t48022 - 44032: 0x92A2,\n\t48023 - 44032: 0x92A3,\n\t48024 - 44032: 0x92A4,\n\t48025 - 44032: 0x92A5,\n\t48026 - 44032: 0x92A6,\n\t48027 - 44032: 0x92A7,\n\t48028 - 44032: 0x92A8,\n\t48029 - 44032: 0x92A9,\n\t48030 - 44032: 0x92AA,\n\t48031 - 44032: 0x92AB,\n\t48032 - 44032: 0x92AC,\n\t48033 - 44032: 0x92AD,\n\t48034 - 44032: 0x92AE,\n\t48035 - 44032: 0x92AF,\n\t48036 - 44032: 0xB9C2,\n\t48037 - 44032: 0x92B0,\n\t48038 - 44032: 0x92B1,\n\t48039 - 44032: 0x92B2,\n\t48040 - 44032: 0xB9C3,\n\t48041 - 44032: 0x92B3,\n\t48042 - 44032: 0x92B4,\n\t48043 - 44032: 0x92B5,\n\t48044 - 44032: 0xB9C4,\n\t48045 - 44032: 0x92B6,\n\t48046 - 44032: 0x92B7,\n\t48047 - 44032: 0x92B8,\n\t48048 - 44032: 0x92B9,\n\t48049 - 44032: 0x92BA,\n\t48050 - 44032: 0x92BB,\n\t48051 - 44032: 0x92BC,\n\t48052 - 44032: 0xB9C5,\n\t48053 - 44032: 0x92BD,\n\t48054 - 44032: 0x92BE,\n\t48055 - 44032: 0xB9C6,\n\t48056 - 44032: 0x92BF,\n\t48057 - 44032: 0x92C0,\n\t48058 - 44032: 0x92C1,\n\t48059 - 44032: 0x92C2,\n\t48060 - 44032: 0x92C3,\n\t48061 - 44032: 0x92C4,\n\t48062 - 44032: 0x92C5,\n\t48063 - 44032: 0x92C6,\n\t48064 - 44032: 0xB9C7,\n\t48065 - 44032: 0x92C7,\n\t48066 - 44032: 0x92C8,\n\t48067 - 44032: 0x92C9,\n\t48068 - 44032: 0xB9C8,\n\t48069 - 44032: 0x92CA,\n\t48070 - 44032: 0x92CB,\n\t48071 - 44032: 0x92CC,\n\t48072 - 44032: 0xB9C9,\n\t48073 - 44032: 0x92CD,\n\t48074 - 44032: 0x92CE,\n\t48075 - 44032: 0x92CF,\n\t48076 - 44032: 0x92D0,\n\t48077 - 44032: 0x92D1,\n\t48078 - 44032: 0x92D2,\n\t48079 - 44032: 0x92D3,\n\t48080 - 44032: 0xB9CA,\n\t48081 - 44032: 0x92D4,\n\t48082 - 44032: 0x92D5,\n\t48083 - 44032: 0xB9CB,\n\t48084 - 44032: 0x92D6,\n\t48085 - 44032: 0x92D7,\n\t48086 - 44032: 0x92D8,\n\t48087 - 44032: 0x92D9,\n\t48088 - 44032: 0x92DA,\n\t48089 - 44032: 0x92DB,\n\t48090 - 44032: 0x92DC,\n\t48091 - 44032: 0x92DD,\n\t48092 - 44032: 0x92DE,\n\t48093 - 44032: 0x92DF,\n\t48094 - 44032: 0x92E0,\n\t48095 - 44032: 0x92E1,\n\t48096 - 44032: 0x92E2,\n\t48097 - 44032: 0x92E3,\n\t48098 - 44032: 0x92E4,\n\t48099 - 44032: 0x92E5,\n\t48100 - 44032: 0x92E6,\n\t48101 - 44032: 0x92E7,\n\t48102 - 44032: 0x92E8,\n\t48103 - 44032: 0x92E9,\n\t48104 - 44032: 0x92EA,\n\t48105 - 44032: 0x92EB,\n\t48106 - 44032: 0x92EC,\n\t48107 - 44032: 0x92ED,\n\t48108 - 44032: 0x92EE,\n\t48109 - 44032: 0x92EF,\n\t48110 - 44032: 0x92F0,\n\t48111 - 44032: 0x92F1,\n\t48112 - 44032: 0x92F2,\n\t48113 - 44032: 0x92F3,\n\t48114 - 44032: 0x92F4,\n\t48115 - 44032: 0x92F5,\n\t48116 - 44032: 0x92F6,\n\t48117 - 44032: 0x92F7,\n\t48118 - 44032: 0x92F8,\n\t48119 - 44032: 0x92F9,\n\t48120 - 44032: 0xB9CC,\n\t48121 - 44032: 0xB9CD,\n\t48122 - 44032: 0x92FA,\n\t48123 - 44032: 0x92FB,\n\t48124 - 44032: 0xB9CE,\n\t48125 - 44032: 0x92FC,\n\t48126 - 44032: 0x92FD,\n\t48127 - 44032: 0xB9CF,\n\t48128 - 44032: 0xB9D0,\n\t48129 - 44032: 0x92FE,\n\t48130 - 44032: 0xB9D1,\n\t48131 - 44032: 0x9341,\n\t48132 - 44032: 0x9342,\n\t48133 - 44032: 0x9343,\n\t48134 - 44032: 0x9344,\n\t48135 - 44032: 0x9345,\n\t48136 - 44032: 0xB9D2,\n\t48137 - 44032: 0xB9D3,\n\t48138 - 44032: 0x9346,\n\t48139 - 44032: 0xB9D4,\n\t48140 - 44032: 0xB9D5,\n\t48141 - 44032: 0xB9D6,\n\t48142 - 44032: 0x9347,\n\t48143 - 44032: 0xB9D7,\n\t48144 - 44032: 0x9348,\n\t48145 - 44032: 0xB9D8,\n\t48146 - 44032: 0x9349,\n\t48147 - 44032: 0x934A,\n\t48148 - 44032: 0xB9D9,\n\t48149 - 44032: 0xB9DA,\n\t48150 - 44032: 0xB9DB,\n\t48151 - 44032: 0xB9DC,\n\t48152 - 44032: 0xB9DD,\n\t48153 - 44032: 0x934B,\n\t48154 - 44032: 0x934C,\n\t48155 - 44032: 0xB9DE,\n\t48156 - 44032: 0xB9DF,\n\t48157 - 44032: 0xB9E0,\n\t48158 - 44032: 0xB9E1,\n\t48159 - 44032: 0xB9E2,\n\t48160 - 44032: 0x934D,\n\t48161 - 44032: 0x934E,\n\t48162 - 44032: 0x934F,\n\t48163 - 44032: 0x9350,\n\t48164 - 44032: 0xB9E3,\n\t48165 - 44032: 0xB9E4,\n\t48166 - 44032: 0x9351,\n\t48167 - 44032: 0xB9E5,\n\t48168 - 44032: 0x9352,\n\t48169 - 44032: 0xB9E6,\n\t48170 - 44032: 0x9353,\n\t48171 - 44032: 0x9354,\n\t48172 - 44032: 0x9355,\n\t48173 - 44032: 0xB9E7,\n\t48174 - 44032: 0x9356,\n\t48175 - 44032: 0x9357,\n\t48176 - 44032: 0xB9E8,\n\t48177 - 44032: 0xB9E9,\n\t48178 - 44032: 0x9358,\n\t48179 - 44032: 0x9359,\n\t48180 - 44032: 0xB9EA,\n\t48181 - 44032: 0x935A,\n\t48182 - 44032: 0x9361,\n\t48183 - 44032: 0x9362,\n\t48184 - 44032: 0xB9EB,\n\t48185 - 44032: 0x9363,\n\t48186 - 44032: 0x9364,\n\t48187 - 44032: 0x9365,\n\t48188 - 44032: 0x9366,\n\t48189 - 44032: 0x9367,\n\t48190 - 44032: 0x9368,\n\t48191 - 44032: 0x9369,\n\t48192 - 44032: 0xB9EC,\n\t48193 - 44032: 0xB9ED,\n\t48194 - 44032: 0x936A,\n\t48195 - 44032: 0xB9EE,\n\t48196 - 44032: 0xB9EF,\n\t48197 - 44032: 0xB9F0,\n\t48198 - 44032: 0x936B,\n\t48199 - 44032: 0x936C,\n\t48200 - 44032: 0x936D,\n\t48201 - 44032: 0xB9F1,\n\t48202 - 44032: 0x936E,\n\t48203 - 44032: 0x936F,\n\t48204 - 44032: 0xB9F2,\n\t48205 - 44032: 0xB9F3,\n\t48206 - 44032: 0x9370,\n\t48207 - 44032: 0x9371,\n\t48208 - 44032: 0xB9F4,\n\t48209 - 44032: 0x9372,\n\t48210 - 44032: 0x9373,\n\t48211 - 44032: 0x9374,\n\t48212 - 44032: 0x9375,\n\t48213 - 44032: 0x9376,\n\t48214 - 44032: 0x9377,\n\t48215 - 44032: 0x9378,\n\t48216 - 44032: 0x9379,\n\t48217 - 44032: 0x937A,\n\t48218 - 44032: 0x9381,\n\t48219 - 44032: 0x9382,\n\t48220 - 44032: 0x9383,\n\t48221 - 44032: 0xB9F5,\n\t48222 - 44032: 0x9384,\n\t48223 - 44032: 0x9385,\n\t48224 - 44032: 0x9386,\n\t48225 - 44032: 0x9387,\n\t48226 - 44032: 0x9388,\n\t48227 - 44032: 0x9389,\n\t48228 - 44032: 0x938A,\n\t48229 - 44032: 0x938B,\n\t48230 - 44032: 0x938C,\n\t48231 - 44032: 0x938D,\n\t48232 - 44032: 0x938E,\n\t48233 - 44032: 0x938F,\n\t48234 - 44032: 0x9390,\n\t48235 - 44032: 0x9391,\n\t48236 - 44032: 0x9392,\n\t48237 - 44032: 0x9393,\n\t48238 - 44032: 0x9394,\n\t48239 - 44032: 0x9395,\n\t48240 - 44032: 0x9396,\n\t48241 - 44032: 0x9397,\n\t48242 - 44032: 0x9398,\n\t48243 - 44032: 0x9399,\n\t48244 - 44032: 0x939A,\n\t48245 - 44032: 0x939B,\n\t48246 - 44032: 0x939C,\n\t48247 - 44032: 0x939D,\n\t48248 - 44032: 0x939E,\n\t48249 - 44032: 0x939F,\n\t48250 - 44032: 0x93A0,\n\t48251 - 44032: 0x93A1,\n\t48252 - 44032: 0x93A2,\n\t48253 - 44032: 0x93A3,\n\t48254 - 44032: 0x93A4,\n\t48255 - 44032: 0x93A5,\n\t48256 - 44032: 0x93A6,\n\t48257 - 44032: 0x93A7,\n\t48258 - 44032: 0x93A8,\n\t48259 - 44032: 0x93A9,\n\t48260 - 44032: 0xB9F6,\n\t48261 - 44032: 0xB9F7,\n\t48262 - 44032: 0x93AA,\n\t48263 - 44032: 0x93AB,\n\t48264 - 44032: 0xB9F8,\n\t48265 - 44032: 0x93AC,\n\t48266 - 44032: 0x93AD,\n\t48267 - 44032: 0xB9F9,\n\t48268 - 44032: 0xB9FA,\n\t48269 - 44032: 0x93AE,\n\t48270 - 44032: 0xB9FB,\n\t48271 - 44032: 0x93AF,\n\t48272 - 44032: 0x93B0,\n\t48273 - 44032: 0x93B1,\n\t48274 - 44032: 0x93B2,\n\t48275 - 44032: 0x93B3,\n\t48276 - 44032: 0xB9FC,\n\t48277 - 44032: 0xB9FD,\n\t48278 - 44032: 0x93B4,\n\t48279 - 44032: 0xB9FE,\n\t48280 - 44032: 0x93B5,\n\t48281 - 44032: 0xBAA1,\n\t48282 - 44032: 0xBAA2,\n\t48283 - 44032: 0x93B6,\n\t48284 - 44032: 0x93B7,\n\t48285 - 44032: 0x93B8,\n\t48286 - 44032: 0x93B9,\n\t48287 - 44032: 0x93BA,\n\t48288 - 44032: 0xBAA3,\n\t48289 - 44032: 0xBAA4,\n\t48290 - 44032: 0x93BB,\n\t48291 - 44032: 0x93BC,\n\t48292 - 44032: 0xBAA5,\n\t48293 - 44032: 0x93BD,\n\t48294 - 44032: 0x93BE,\n\t48295 - 44032: 0xBAA6,\n\t48296 - 44032: 0xBAA7,\n\t48297 - 44032: 0x93BF,\n\t48298 - 44032: 0x93C0,\n\t48299 - 44032: 0x93C1,\n\t48300 - 44032: 0x93C2,\n\t48301 - 44032: 0x93C3,\n\t48302 - 44032: 0x93C4,\n\t48303 - 44032: 0x93C5,\n\t48304 - 44032: 0xBAA8,\n\t48305 - 44032: 0xBAA9,\n\t48306 - 44032: 0x93C6,\n\t48307 - 44032: 0xBAAA,\n\t48308 - 44032: 0xBAAB,\n\t48309 - 44032: 0xBAAC,\n\t48310 - 44032: 0x93C7,\n\t48311 - 44032: 0x93C8,\n\t48312 - 44032: 0x93C9,\n\t48313 - 44032: 0x93CA,\n\t48314 - 44032: 0x93CB,\n\t48315 - 44032: 0x93CC,\n\t48316 - 44032: 0xBAAD,\n\t48317 - 44032: 0xBAAE,\n\t48318 - 44032: 0x93CD,\n\t48319 - 44032: 0x93CE,\n\t48320 - 44032: 0xBAAF,\n\t48321 - 44032: 0x93CF,\n\t48322 - 44032: 0x93D0,\n\t48323 - 44032: 0x93D1,\n\t48324 - 44032: 0xBAB0,\n\t48325 - 44032: 0x93D2,\n\t48326 - 44032: 0x93D3,\n\t48327 - 44032: 0x93D4,\n\t48328 - 44032: 0x93D5,\n\t48329 - 44032: 0x93D6,\n\t48330 - 44032: 0x93D7,\n\t48331 - 44032: 0x93D8,\n\t48332 - 44032: 0x93D9,\n\t48333 - 44032: 0xBAB1,\n\t48334 - 44032: 0x93DA,\n\t48335 - 44032: 0xBAB2,\n\t48336 - 44032: 0xBAB3,\n\t48337 - 44032: 0xBAB4,\n\t48338 - 44032: 0x93DB,\n\t48339 - 44032: 0x93DC,\n\t48340 - 44032: 0x93DD,\n\t48341 - 44032: 0xBAB5,\n\t48342 - 44032: 0x93DE,\n\t48343 - 44032: 0x93DF,\n\t48344 - 44032: 0xBAB6,\n\t48345 - 44032: 0x93E0,\n\t48346 - 44032: 0x93E1,\n\t48347 - 44032: 0x93E2,\n\t48348 - 44032: 0xBAB7,\n\t48349 - 44032: 0x93E3,\n\t48350 - 44032: 0x93E4,\n\t48351 - 44032: 0x93E5,\n\t48352 - 44032: 0x93E6,\n\t48353 - 44032: 0x93E7,\n\t48354 - 44032: 0x93E8,\n\t48355 - 44032: 0x93E9,\n\t48356 - 44032: 0x93EA,\n\t48357 - 44032: 0x93EB,\n\t48358 - 44032: 0x93EC,\n\t48359 - 44032: 0x93ED,\n\t48360 - 44032: 0x93EE,\n\t48361 - 44032: 0x93EF,\n\t48362 - 44032: 0x93F0,\n\t48363 - 44032: 0x93F1,\n\t48364 - 44032: 0x93F2,\n\t48365 - 44032: 0x93F3,\n\t48366 - 44032: 0x93F4,\n\t48367 - 44032: 0x93F5,\n\t48368 - 44032: 0x93F6,\n\t48369 - 44032: 0x93F7,\n\t48370 - 44032: 0x93F8,\n\t48371 - 44032: 0x93F9,\n\t48372 - 44032: 0xBAB8,\n\t48373 - 44032: 0xBAB9,\n\t48374 - 44032: 0xBABA,\n\t48375 - 44032: 0x93FA,\n\t48376 - 44032: 0xBABB,\n\t48377 - 44032: 0x93FB,\n\t48378 - 44032: 0x93FC,\n\t48379 - 44032: 0x93FD,\n\t48380 - 44032: 0xBABC,\n\t48381 - 44032: 0x93FE,\n\t48382 - 44032: 0x9441,\n\t48383 - 44032: 0x9442,\n\t48384 - 44032: 0x9443,\n\t48385 - 44032: 0x9444,\n\t48386 - 44032: 0x9445,\n\t48387 - 44032: 0x9446,\n\t48388 - 44032: 0xBABD,\n\t48389 - 44032: 0xBABE,\n\t48390 - 44032: 0x9447,\n\t48391 - 44032: 0xBABF,\n\t48392 - 44032: 0x9448,\n\t48393 - 44032: 0xBAC0,\n\t48394 - 44032: 0x9449,\n\t48395 - 44032: 0x944A,\n\t48396 - 44032: 0x944B,\n\t48397 - 44032: 0x944C,\n\t48398 - 44032: 0x944D,\n\t48399 - 44032: 0x944E,\n\t48400 - 44032: 0xBAC1,\n\t48401 - 44032: 0x944F,\n\t48402 - 44032: 0x9450,\n\t48403 - 44032: 0x9451,\n\t48404 - 44032: 0xBAC2,\n\t48405 - 44032: 0x9452,\n\t48406 - 44032: 0x9453,\n\t48407 - 44032: 0x9454,\n\t48408 - 44032: 0x9455,\n\t48409 - 44032: 0x9456,\n\t48410 - 44032: 0x9457,\n\t48411 - 44032: 0x9458,\n\t48412 - 44032: 0x9459,\n\t48413 - 44032: 0x945A,\n\t48414 - 44032: 0x9461,\n\t48415 - 44032: 0x9462,\n\t48416 - 44032: 0x9463,\n\t48417 - 44032: 0x9464,\n\t48418 - 44032: 0x9465,\n\t48419 - 44032: 0x9466,\n\t48420 - 44032: 0xBAC3,\n\t48421 - 44032: 0x9467,\n\t48422 - 44032: 0x9468,\n\t48423 - 44032: 0x9469,\n\t48424 - 44032: 0x946A,\n\t48425 - 44032: 0x946B,\n\t48426 - 44032: 0x946C,\n\t48427 - 44032: 0x946D,\n\t48428 - 44032: 0xBAC4,\n\t48429 - 44032: 0x946E,\n\t48430 - 44032: 0x946F,\n\t48431 - 44032: 0x9470,\n\t48432 - 44032: 0x9471,\n\t48433 - 44032: 0x9472,\n\t48434 - 44032: 0x9473,\n\t48435 - 44032: 0x9474,\n\t48436 - 44032: 0x9475,\n\t48437 - 44032: 0x9476,\n\t48438 - 44032: 0x9477,\n\t48439 - 44032: 0x9478,\n\t48440 - 44032: 0x9479,\n\t48441 - 44032: 0x947A,\n\t48442 - 44032: 0x9481,\n\t48443 - 44032: 0x9482,\n\t48444 - 44032: 0x9483,\n\t48445 - 44032: 0x9484,\n\t48446 - 44032: 0x9485,\n\t48447 - 44032: 0x9486,\n\t48448 - 44032: 0xBAC5,\n\t48449 - 44032: 0x9487,\n\t48450 - 44032: 0x9488,\n\t48451 - 44032: 0x9489,\n\t48452 - 44032: 0x948A,\n\t48453 - 44032: 0x948B,\n\t48454 - 44032: 0x948C,\n\t48455 - 44032: 0x948D,\n\t48456 - 44032: 0xBAC6,\n\t48457 - 44032: 0xBAC7,\n\t48458 - 44032: 0x948E,\n\t48459 - 44032: 0x948F,\n\t48460 - 44032: 0xBAC8,\n\t48461 - 44032: 0x9490,\n\t48462 - 44032: 0x9491,\n\t48463 - 44032: 0x9492,\n\t48464 - 44032: 0xBAC9,\n\t48465 - 44032: 0x9493,\n\t48466 - 44032: 0x9494,\n\t48467 - 44032: 0x9495,\n\t48468 - 44032: 0x9496,\n\t48469 - 44032: 0x9497,\n\t48470 - 44032: 0x9498,\n\t48471 - 44032: 0x9499,\n\t48472 - 44032: 0xBACA,\n\t48473 - 44032: 0xBACB,\n\t48474 - 44032: 0x949A,\n\t48475 - 44032: 0x949B,\n\t48476 - 44032: 0x949C,\n\t48477 - 44032: 0x949D,\n\t48478 - 44032: 0x949E,\n\t48479 - 44032: 0x949F,\n\t48480 - 44032: 0x94A0,\n\t48481 - 44032: 0x94A1,\n\t48482 - 44032: 0x94A2,\n\t48483 - 44032: 0x94A3,\n\t48484 - 44032: 0xBACC,\n\t48485 - 44032: 0x94A4,\n\t48486 - 44032: 0x94A5,\n\t48487 - 44032: 0x94A6,\n\t48488 - 44032: 0xBACD,\n\t48489 - 44032: 0x94A7,\n\t48490 - 44032: 0x94A8,\n\t48491 - 44032: 0x94A9,\n\t48492 - 44032: 0x94AA,\n\t48493 - 44032: 0x94AB,\n\t48494 - 44032: 0x94AC,\n\t48495 - 44032: 0x94AD,\n\t48496 - 44032: 0x94AE,\n\t48497 - 44032: 0x94AF,\n\t48498 - 44032: 0x94B0,\n\t48499 - 44032: 0x94B1,\n\t48500 - 44032: 0x94B2,\n\t48501 - 44032: 0x94B3,\n\t48502 - 44032: 0x94B4,\n\t48503 - 44032: 0x94B5,\n\t48504 - 44032: 0x94B6,\n\t48505 - 44032: 0x94B7,\n\t48506 - 44032: 0x94B8,\n\t48507 - 44032: 0x94B9,\n\t48508 - 44032: 0x94BA,\n\t48509 - 44032: 0x94BB,\n\t48510 - 44032: 0x94BC,\n\t48511 - 44032: 0x94BD,\n\t48512 - 44032: 0xBACE,\n\t48513 - 44032: 0xBACF,\n\t48514 - 44032: 0x94BE,\n\t48515 - 44032: 0x94BF,\n\t48516 - 44032: 0xBAD0,\n\t48517 - 44032: 0x94C0,\n\t48518 - 44032: 0x94C1,\n\t48519 - 44032: 0xBAD1,\n\t48520 - 44032: 0xBAD2,\n\t48521 - 44032: 0xBAD3,\n\t48522 - 44032: 0xBAD4,\n\t48523 - 44032: 0x94C2,\n\t48524 - 44032: 0x94C3,\n\t48525 - 44032: 0x94C4,\n\t48526 - 44032: 0x94C5,\n\t48527 - 44032: 0x94C6,\n\t48528 - 44032: 0xBAD5,\n\t48529 - 44032: 0xBAD6,\n\t48530 - 44032: 0x94C7,\n\t48531 - 44032: 0xBAD7,\n\t48532 - 44032: 0x94C8,\n\t48533 - 44032: 0xBAD8,\n\t48534 - 44032: 0x94C9,\n\t48535 - 44032: 0x94CA,\n\t48536 - 44032: 0x94CB,\n\t48537 - 44032: 0xBAD9,\n\t48538 - 44032: 0xBADA,\n\t48539 - 44032: 0x94CC,\n\t48540 - 44032: 0xBADB,\n\t48541 - 44032: 0x94CD,\n\t48542 - 44032: 0x94CE,\n\t48543 - 44032: 0x94CF,\n\t48544 - 44032: 0x94D0,\n\t48545 - 44032: 0x94D1,\n\t48546 - 44032: 0x94D2,\n\t48547 - 44032: 0x94D3,\n\t48548 - 44032: 0xBADC,\n\t48549 - 44032: 0x94D4,\n\t48550 - 44032: 0x94D5,\n\t48551 - 44032: 0x94D6,\n\t48552 - 44032: 0x94D7,\n\t48553 - 44032: 0x94D8,\n\t48554 - 44032: 0x94D9,\n\t48555 - 44032: 0x94DA,\n\t48556 - 44032: 0x94DB,\n\t48557 - 44032: 0x94DC,\n\t48558 - 44032: 0x94DD,\n\t48559 - 44032: 0x94DE,\n\t48560 - 44032: 0xBADD,\n\t48561 - 44032: 0x94DF,\n\t48562 - 44032: 0x94E0,\n\t48563 - 44032: 0x94E1,\n\t48564 - 44032: 0x94E2,\n\t48565 - 44032: 0x94E3,\n\t48566 - 44032: 0x94E4,\n\t48567 - 44032: 0x94E5,\n\t48568 - 44032: 0xBADE,\n\t48569 - 44032: 0x94E6,\n\t48570 - 44032: 0x94E7,\n\t48571 - 44032: 0x94E8,\n\t48572 - 44032: 0x94E9,\n\t48573 - 44032: 0x94EA,\n\t48574 - 44032: 0x94EB,\n\t48575 - 44032: 0x94EC,\n\t48576 - 44032: 0x94ED,\n\t48577 - 44032: 0x94EE,\n\t48578 - 44032: 0x94EF,\n\t48579 - 44032: 0x94F0,\n\t48580 - 44032: 0x94F1,\n\t48581 - 44032: 0x94F2,\n\t48582 - 44032: 0x94F3,\n\t48583 - 44032: 0x94F4,\n\t48584 - 44032: 0x94F5,\n\t48585 - 44032: 0x94F6,\n\t48586 - 44032: 0x94F7,\n\t48587 - 44032: 0x94F8,\n\t48588 - 44032: 0x94F9,\n\t48589 - 44032: 0x94FA,\n\t48590 - 44032: 0x94FB,\n\t48591 - 44032: 0x94FC,\n\t48592 - 44032: 0x94FD,\n\t48593 - 44032: 0x94FE,\n\t48594 - 44032: 0x9541,\n\t48595 - 44032: 0x9542,\n\t48596 - 44032: 0xBADF,\n\t48597 - 44032: 0xBAE0,\n\t48598 - 44032: 0x9543,\n\t48599 - 44032: 0x9544,\n\t48600 - 44032: 0xBAE1,\n\t48601 - 44032: 0x9545,\n\t48602 - 44032: 0x9546,\n\t48603 - 44032: 0x9547,\n\t48604 - 44032: 0xBAE2,\n\t48605 - 44032: 0x9548,\n\t48606 - 44032: 0x9549,\n\t48607 - 44032: 0x954A,\n\t48608 - 44032: 0x954B,\n\t48609 - 44032: 0x954C,\n\t48610 - 44032: 0x954D,\n\t48611 - 44032: 0x954E,\n\t48612 - 44032: 0x954F,\n\t48613 - 44032: 0x9550,\n\t48614 - 44032: 0x9551,\n\t48615 - 44032: 0x9552,\n\t48616 - 44032: 0x9553,\n\t48617 - 44032: 0xBAE3,\n\t48618 - 44032: 0x9554,\n\t48619 - 44032: 0x9555,\n\t48620 - 44032: 0x9556,\n\t48621 - 44032: 0x9557,\n\t48622 - 44032: 0x9558,\n\t48623 - 44032: 0x9559,\n\t48624 - 44032: 0xBAE4,\n\t48625 - 44032: 0x955A,\n\t48626 - 44032: 0x9561,\n\t48627 - 44032: 0x9562,\n\t48628 - 44032: 0xBAE5,\n\t48629 - 44032: 0x9563,\n\t48630 - 44032: 0x9564,\n\t48631 - 44032: 0x9565,\n\t48632 - 44032: 0xBAE6,\n\t48633 - 44032: 0x9566,\n\t48634 - 44032: 0x9567,\n\t48635 - 44032: 0x9568,\n\t48636 - 44032: 0x9569,\n\t48637 - 44032: 0x956A,\n\t48638 - 44032: 0x956B,\n\t48639 - 44032: 0x956C,\n\t48640 - 44032: 0xBAE7,\n\t48641 - 44032: 0x956D,\n\t48642 - 44032: 0x956E,\n\t48643 - 44032: 0xBAE8,\n\t48644 - 44032: 0x956F,\n\t48645 - 44032: 0xBAE9,\n\t48646 - 44032: 0x9570,\n\t48647 - 44032: 0x9571,\n\t48648 - 44032: 0x9572,\n\t48649 - 44032: 0x9573,\n\t48650 - 44032: 0x9574,\n\t48651 - 44032: 0x9575,\n\t48652 - 44032: 0xBAEA,\n\t48653 - 44032: 0xBAEB,\n\t48654 - 44032: 0x9576,\n\t48655 - 44032: 0x9577,\n\t48656 - 44032: 0xBAEC,\n\t48657 - 44032: 0x9578,\n\t48658 - 44032: 0x9579,\n\t48659 - 44032: 0x957A,\n\t48660 - 44032: 0xBAED,\n\t48661 - 44032: 0x9581,\n\t48662 - 44032: 0x9582,\n\t48663 - 44032: 0x9583,\n\t48664 - 44032: 0x9584,\n\t48665 - 44032: 0x9585,\n\t48666 - 44032: 0x9586,\n\t48667 - 44032: 0x9587,\n\t48668 - 44032: 0xBAEE,\n\t48669 - 44032: 0xBAEF,\n\t48670 - 44032: 0x9588,\n\t48671 - 44032: 0xBAF0,\n\t48672 - 44032: 0x9589,\n\t48673 - 44032: 0x958A,\n\t48674 - 44032: 0x958B,\n\t48675 - 44032: 0x958C,\n\t48676 - 44032: 0x958D,\n\t48677 - 44032: 0x958E,\n\t48678 - 44032: 0x958F,\n\t48679 - 44032: 0x9590,\n\t48680 - 44032: 0x9591,\n\t48681 - 44032: 0x9592,\n\t48682 - 44032: 0x9593,\n\t48683 - 44032: 0x9594,\n\t48684 - 44032: 0x9595,\n\t48685 - 44032: 0x9596,\n\t48686 - 44032: 0x9597,\n\t48687 - 44032: 0x9598,\n\t48688 - 44032: 0x9599,\n\t48689 - 44032: 0x959A,\n\t48690 - 44032: 0x959B,\n\t48691 - 44032: 0x959C,\n\t48692 - 44032: 0x959D,\n\t48693 - 44032: 0x959E,\n\t48694 - 44032: 0x959F,\n\t48695 - 44032: 0x95A0,\n\t48696 - 44032: 0x95A1,\n\t48697 - 44032: 0x95A2,\n\t48698 - 44032: 0x95A3,\n\t48699 - 44032: 0x95A4,\n\t48700 - 44032: 0x95A5,\n\t48701 - 44032: 0x95A6,\n\t48702 - 44032: 0x95A7,\n\t48703 - 44032: 0x95A8,\n\t48704 - 44032: 0x95A9,\n\t48705 - 44032: 0x95AA,\n\t48706 - 44032: 0x95AB,\n\t48707 - 44032: 0x95AC,\n\t48708 - 44032: 0xBAF1,\n\t48709 - 44032: 0xBAF2,\n\t48710 - 44032: 0x95AD,\n\t48711 - 44032: 0x95AE,\n\t48712 - 44032: 0xBAF3,\n\t48713 - 44032: 0x95AF,\n\t48714 - 44032: 0x95B0,\n\t48715 - 44032: 0x95B1,\n\t48716 - 44032: 0xBAF4,\n\t48717 - 44032: 0x95B2,\n\t48718 - 44032: 0xBAF5,\n\t48719 - 44032: 0x95B3,\n\t48720 - 44032: 0x95B4,\n\t48721 - 44032: 0x95B5,\n\t48722 - 44032: 0x95B6,\n\t48723 - 44032: 0x95B7,\n\t48724 - 44032: 0xBAF6,\n\t48725 - 44032: 0xBAF7,\n\t48726 - 44032: 0x95B8,\n\t48727 - 44032: 0xBAF8,\n\t48728 - 44032: 0x95B9,\n\t48729 - 44032: 0xBAF9,\n\t48730 - 44032: 0xBAFA,\n\t48731 - 44032: 0xBAFB,\n\t48732 - 44032: 0x95BA,\n\t48733 - 44032: 0x95BB,\n\t48734 - 44032: 0x95BC,\n\t48735 - 44032: 0x95BD,\n\t48736 - 44032: 0xBAFC,\n\t48737 - 44032: 0xBAFD,\n\t48738 - 44032: 0x95BE,\n\t48739 - 44032: 0x95BF,\n\t48740 - 44032: 0xBAFE,\n\t48741 - 44032: 0x95C0,\n\t48742 - 44032: 0x95C1,\n\t48743 - 44032: 0x95C2,\n\t48744 - 44032: 0xBBA1,\n\t48745 - 44032: 0x95C3,\n\t48746 - 44032: 0xBBA2,\n\t48747 - 44032: 0x95C4,\n\t48748 - 44032: 0x95C5,\n\t48749 - 44032: 0x95C6,\n\t48750 - 44032: 0x95C7,\n\t48751 - 44032: 0x95C8,\n\t48752 - 44032: 0xBBA3,\n\t48753 - 44032: 0xBBA4,\n\t48754 - 44032: 0x95C9,\n\t48755 - 44032: 0xBBA5,\n\t48756 - 44032: 0xBBA6,\n\t48757 - 44032: 0xBBA7,\n\t48758 - 44032: 0x95CA,\n\t48759 - 44032: 0x95CB,\n\t48760 - 44032: 0x95CC,\n\t48761 - 44032: 0x95CD,\n\t48762 - 44032: 0x95CE,\n\t48763 - 44032: 0xBBA8,\n\t48764 - 44032: 0xBBA9,\n\t48765 - 44032: 0xBBAA,\n\t48766 - 44032: 0x95CF,\n\t48767 - 44032: 0x95D0,\n\t48768 - 44032: 0xBBAB,\n\t48769 - 44032: 0x95D1,\n\t48770 - 44032: 0x95D2,\n\t48771 - 44032: 0x95D3,\n\t48772 - 44032: 0xBBAC,\n\t48773 - 44032: 0x95D4,\n\t48774 - 44032: 0x95D5,\n\t48775 - 44032: 0x95D6,\n\t48776 - 44032: 0x95D7,\n\t48777 - 44032: 0x95D8,\n\t48778 - 44032: 0x95D9,\n\t48779 - 44032: 0x95DA,\n\t48780 - 44032: 0xBBAD,\n\t48781 - 44032: 0xBBAE,\n\t48782 - 44032: 0x95DB,\n\t48783 - 44032: 0xBBAF,\n\t48784 - 44032: 0xBBB0,\n\t48785 - 44032: 0xBBB1,\n\t48786 - 44032: 0x95DC,\n\t48787 - 44032: 0x95DD,\n\t48788 - 44032: 0x95DE,\n\t48789 - 44032: 0x95DF,\n\t48790 - 44032: 0x95E0,\n\t48791 - 44032: 0x95E1,\n\t48792 - 44032: 0xBBB2,\n\t48793 - 44032: 0xBBB3,\n\t48794 - 44032: 0x95E2,\n\t48795 - 44032: 0x95E3,\n\t48796 - 44032: 0x95E4,\n\t48797 - 44032: 0x95E5,\n\t48798 - 44032: 0x95E6,\n\t48799 - 44032: 0x95E7,\n\t48800 - 44032: 0x95E8,\n\t48801 - 44032: 0x95E9,\n\t48802 - 44032: 0x95EA,\n\t48803 - 44032: 0x95EB,\n\t48804 - 44032: 0x95EC,\n\t48805 - 44032: 0x95ED,\n\t48806 - 44032: 0x95EE,\n\t48807 - 44032: 0x95EF,\n\t48808 - 44032: 0xBBB4,\n\t48809 - 44032: 0x95F0,\n\t48810 - 44032: 0x95F1,\n\t48811 - 44032: 0x95F2,\n\t48812 - 44032: 0x95F3,\n\t48813 - 44032: 0x95F4,\n\t48814 - 44032: 0x95F5,\n\t48815 - 44032: 0x95F6,\n\t48816 - 44032: 0x95F7,\n\t48817 - 44032: 0x95F8,\n\t48818 - 44032: 0x95F9,\n\t48819 - 44032: 0x95FA,\n\t48820 - 44032: 0x95FB,\n\t48821 - 44032: 0x95FC,\n\t48822 - 44032: 0x95FD,\n\t48823 - 44032: 0x95FE,\n\t48824 - 44032: 0x9641,\n\t48825 - 44032: 0x9642,\n\t48826 - 44032: 0x9643,\n\t48827 - 44032: 0x9644,\n\t48828 - 44032: 0x9645,\n\t48829 - 44032: 0x9646,\n\t48830 - 44032: 0x9647,\n\t48831 - 44032: 0x9648,\n\t48832 - 44032: 0x9649,\n\t48833 - 44032: 0x964A,\n\t48834 - 44032: 0x964B,\n\t48835 - 44032: 0x964C,\n\t48836 - 44032: 0x964D,\n\t48837 - 44032: 0x964E,\n\t48838 - 44032: 0x964F,\n\t48839 - 44032: 0x9650,\n\t48840 - 44032: 0x9651,\n\t48841 - 44032: 0x9652,\n\t48842 - 44032: 0x9653,\n\t48843 - 44032: 0x9654,\n\t48844 - 44032: 0x9655,\n\t48845 - 44032: 0x9656,\n\t48846 - 44032: 0x9657,\n\t48847 - 44032: 0x9658,\n\t48848 - 44032: 0xBBB5,\n\t48849 - 44032: 0xBBB6,\n\t48850 - 44032: 0x9659,\n\t48851 - 44032: 0x965A,\n\t48852 - 44032: 0xBBB7,\n\t48853 - 44032: 0x9661,\n\t48854 - 44032: 0x9662,\n\t48855 - 44032: 0xBBB8,\n\t48856 - 44032: 0xBBB9,\n\t48857 - 44032: 0x9663,\n\t48858 - 44032: 0x9664,\n\t48859 - 44032: 0x9665,\n\t48860 - 44032: 0x9666,\n\t48861 - 44032: 0x9667,\n\t48862 - 44032: 0x9668,\n\t48863 - 44032: 0x9669,\n\t48864 - 44032: 0xBBBA,\n\t48865 - 44032: 0x966A,\n\t48866 - 44032: 0x966B,\n\t48867 - 44032: 0xBBBB,\n\t48868 - 44032: 0xBBBC,\n\t48869 - 44032: 0xBBBD,\n\t48870 - 44032: 0x966C,\n\t48871 - 44032: 0x966D,\n\t48872 - 44032: 0x966E,\n\t48873 - 44032: 0x966F,\n\t48874 - 44032: 0x9670,\n\t48875 - 44032: 0x9671,\n\t48876 - 44032: 0xBBBE,\n\t48877 - 44032: 0x9672,\n\t48878 - 44032: 0x9673,\n\t48879 - 44032: 0x9674,\n\t48880 - 44032: 0x9675,\n\t48881 - 44032: 0x9676,\n\t48882 - 44032: 0x9677,\n\t48883 - 44032: 0x9678,\n\t48884 - 44032: 0x9679,\n\t48885 - 44032: 0x967A,\n\t48886 - 44032: 0x9681,\n\t48887 - 44032: 0x9682,\n\t48888 - 44032: 0x9683,\n\t48889 - 44032: 0x9684,\n\t48890 - 44032: 0x9685,\n\t48891 - 44032: 0x9686,\n\t48892 - 44032: 0x9687,\n\t48893 - 44032: 0x9688,\n\t48894 - 44032: 0x9689,\n\t48895 - 44032: 0x968A,\n\t48896 - 44032: 0x968B,\n\t48897 - 44032: 0xBBBF,\n\t48898 - 44032: 0x968C,\n\t48899 - 44032: 0x968D,\n\t48900 - 44032: 0x968E,\n\t48901 - 44032: 0x968F,\n\t48902 - 44032: 0x9690,\n\t48903 - 44032: 0x9691,\n\t48904 - 44032: 0xBBC0,\n\t48905 - 44032: 0xBBC1,\n\t48906 - 44032: 0x9692,\n\t48907 - 44032: 0x9693,\n\t48908 - 44032: 0x9694,\n\t48909 - 44032: 0x9695,\n\t48910 - 44032: 0x9696,\n\t48911 - 44032: 0x9697,\n\t48912 - 44032: 0x9698,\n\t48913 - 44032: 0x9699,\n\t48914 - 44032: 0x969A,\n\t48915 - 44032: 0x969B,\n\t48916 - 44032: 0x969C,\n\t48917 - 44032: 0x969D,\n\t48918 - 44032: 0x969E,\n\t48919 - 44032: 0x969F,\n\t48920 - 44032: 0xBBC2,\n\t48921 - 44032: 0xBBC3,\n\t48922 - 44032: 0x96A0,\n\t48923 - 44032: 0xBBC4,\n\t48924 - 44032: 0xBBC5,\n\t48925 - 44032: 0xBBC6,\n\t48926 - 44032: 0x96A1,\n\t48927 - 44032: 0x96A2,\n\t48928 - 44032: 0x96A3,\n\t48929 - 44032: 0x96A4,\n\t48930 - 44032: 0x96A5,\n\t48931 - 44032: 0x96A6,\n\t48932 - 44032: 0x96A7,\n\t48933 - 44032: 0x96A8,\n\t48934 - 44032: 0x96A9,\n\t48935 - 44032: 0x96AA,\n\t48936 - 44032: 0x96AB,\n\t48937 - 44032: 0x96AC,\n\t48938 - 44032: 0x96AD,\n\t48939 - 44032: 0x96AE,\n\t48940 - 44032: 0x96AF,\n\t48941 - 44032: 0x96B0,\n\t48942 - 44032: 0x96B1,\n\t48943 - 44032: 0x96B2,\n\t48944 - 44032: 0x96B3,\n\t48945 - 44032: 0x96B4,\n\t48946 - 44032: 0x96B5,\n\t48947 - 44032: 0x96B6,\n\t48948 - 44032: 0x96B7,\n\t48949 - 44032: 0x96B8,\n\t48950 - 44032: 0x96B9,\n\t48951 - 44032: 0x96BA,\n\t48952 - 44032: 0x96BB,\n\t48953 - 44032: 0x96BC,\n\t48954 - 44032: 0x96BD,\n\t48955 - 44032: 0x96BE,\n\t48956 - 44032: 0x96BF,\n\t48957 - 44032: 0x96C0,\n\t48958 - 44032: 0x96C1,\n\t48959 - 44032: 0x96C2,\n\t48960 - 44032: 0xBBC7,\n\t48961 - 44032: 0xBBC8,\n\t48962 - 44032: 0x96C3,\n\t48963 - 44032: 0x96C4,\n\t48964 - 44032: 0xBBC9,\n\t48965 - 44032: 0x96C5,\n\t48966 - 44032: 0x96C6,\n\t48967 - 44032: 0x96C7,\n\t48968 - 44032: 0xBBCA,\n\t48969 - 44032: 0x96C8,\n\t48970 - 44032: 0x96C9,\n\t48971 - 44032: 0x96CA,\n\t48972 - 44032: 0x96CB,\n\t48973 - 44032: 0x96CC,\n\t48974 - 44032: 0x96CD,\n\t48975 - 44032: 0x96CE,\n\t48976 - 44032: 0xBBCB,\n\t48977 - 44032: 0xBBCC,\n\t48978 - 44032: 0x96CF,\n\t48979 - 44032: 0x96D0,\n\t48980 - 44032: 0x96D1,\n\t48981 - 44032: 0xBBCD,\n\t48982 - 44032: 0x96D2,\n\t48983 - 44032: 0x96D3,\n\t48984 - 44032: 0x96D4,\n\t48985 - 44032: 0x96D5,\n\t48986 - 44032: 0x96D6,\n\t48987 - 44032: 0x96D7,\n\t48988 - 44032: 0x96D8,\n\t48989 - 44032: 0x96D9,\n\t48990 - 44032: 0x96DA,\n\t48991 - 44032: 0x96DB,\n\t48992 - 44032: 0x96DC,\n\t48993 - 44032: 0x96DD,\n\t48994 - 44032: 0x96DE,\n\t48995 - 44032: 0x96DF,\n\t48996 - 44032: 0x96E0,\n\t48997 - 44032: 0x96E1,\n\t48998 - 44032: 0x96E2,\n\t48999 - 44032: 0x96E3,\n\t49000 - 44032: 0x96E4,\n\t49001 - 44032: 0x96E5,\n\t49002 - 44032: 0x96E6,\n\t49003 - 44032: 0x96E7,\n\t49004 - 44032: 0x96E8,\n\t49005 - 44032: 0x96E9,\n\t49006 - 44032: 0x96EA,\n\t49007 - 44032: 0x96EB,\n\t49008 - 44032: 0x96EC,\n\t49009 - 44032: 0x96ED,\n\t49010 - 44032: 0x96EE,\n\t49011 - 44032: 0x96EF,\n\t49012 - 44032: 0x96F0,\n\t49013 - 44032: 0x96F1,\n\t49014 - 44032: 0x96F2,\n\t49015 - 44032: 0x96F3,\n\t49016 - 44032: 0x96F4,\n\t49017 - 44032: 0x96F5,\n\t49018 - 44032: 0x96F6,\n\t49019 - 44032: 0x96F7,\n\t49020 - 44032: 0x96F8,\n\t49021 - 44032: 0x96F9,\n\t49022 - 44032: 0x96FA,\n\t49023 - 44032: 0x96FB,\n\t49024 - 44032: 0x96FC,\n\t49025 - 44032: 0x96FD,\n\t49026 - 44032: 0x96FE,\n\t49027 - 44032: 0x9741,\n\t49028 - 44032: 0x9742,\n\t49029 - 44032: 0x9743,\n\t49030 - 44032: 0x9744,\n\t49031 - 44032: 0x9745,\n\t49032 - 44032: 0x9746,\n\t49033 - 44032: 0x9747,\n\t49034 - 44032: 0x9748,\n\t49035 - 44032: 0x9749,\n\t49036 - 44032: 0x974A,\n\t49037 - 44032: 0x974B,\n\t49038 - 44032: 0x974C,\n\t49039 - 44032: 0x974D,\n\t49040 - 44032: 0x974E,\n\t49041 - 44032: 0x974F,\n\t49042 - 44032: 0x9750,\n\t49043 - 44032: 0x9751,\n\t49044 - 44032: 0xBBCE,\n\t49045 - 44032: 0x9752,\n\t49046 - 44032: 0x9753,\n\t49047 - 44032: 0x9754,\n\t49048 - 44032: 0x9755,\n\t49049 - 44032: 0x9756,\n\t49050 - 44032: 0x9757,\n\t49051 - 44032: 0x9758,\n\t49052 - 44032: 0x9759,\n\t49053 - 44032: 0x975A,\n\t49054 - 44032: 0x9761,\n\t49055 - 44032: 0x9762,\n\t49056 - 44032: 0x9763,\n\t49057 - 44032: 0x9764,\n\t49058 - 44032: 0x9765,\n\t49059 - 44032: 0x9766,\n\t49060 - 44032: 0x9767,\n\t49061 - 44032: 0x9768,\n\t49062 - 44032: 0x9769,\n\t49063 - 44032: 0x976A,\n\t49064 - 44032: 0x976B,\n\t49065 - 44032: 0x976C,\n\t49066 - 44032: 0x976D,\n\t49067 - 44032: 0x976E,\n\t49068 - 44032: 0x976F,\n\t49069 - 44032: 0x9770,\n\t49070 - 44032: 0x9771,\n\t49071 - 44032: 0x9772,\n\t49072 - 44032: 0xBBCF,\n\t49073 - 44032: 0x9773,\n\t49074 - 44032: 0x9774,\n\t49075 - 44032: 0x9775,\n\t49076 - 44032: 0x9776,\n\t49077 - 44032: 0x9777,\n\t49078 - 44032: 0x9778,\n\t49079 - 44032: 0x9779,\n\t49080 - 44032: 0x977A,\n\t49081 - 44032: 0x9781,\n\t49082 - 44032: 0x9782,\n\t49083 - 44032: 0x9783,\n\t49084 - 44032: 0x9784,\n\t49085 - 44032: 0x9785,\n\t49086 - 44032: 0x9786,\n\t49087 - 44032: 0x9787,\n\t49088 - 44032: 0x9788,\n\t49089 - 44032: 0x9789,\n\t49090 - 44032: 0x978A,\n\t49091 - 44032: 0x978B,\n\t49092 - 44032: 0x978C,\n\t49093 - 44032: 0xBBD0,\n\t49094 - 44032: 0x978D,\n\t49095 - 44032: 0x978E,\n\t49096 - 44032: 0x978F,\n\t49097 - 44032: 0x9790,\n\t49098 - 44032: 0x9791,\n\t49099 - 44032: 0x9792,\n\t49100 - 44032: 0xBBD1,\n\t49101 - 44032: 0xBBD2,\n\t49102 - 44032: 0x9793,\n\t49103 - 44032: 0x9794,\n\t49104 - 44032: 0xBBD3,\n\t49105 - 44032: 0x9795,\n\t49106 - 44032: 0x9796,\n\t49107 - 44032: 0x9797,\n\t49108 - 44032: 0xBBD4,\n\t49109 - 44032: 0x9798,\n\t49110 - 44032: 0x9799,\n\t49111 - 44032: 0x979A,\n\t49112 - 44032: 0x979B,\n\t49113 - 44032: 0x979C,\n\t49114 - 44032: 0x979D,\n\t49115 - 44032: 0x979E,\n\t49116 - 44032: 0xBBD5,\n\t49117 - 44032: 0x979F,\n\t49118 - 44032: 0x97A0,\n\t49119 - 44032: 0xBBD6,\n\t49120 - 44032: 0x97A1,\n\t49121 - 44032: 0xBBD7,\n\t49122 - 44032: 0x97A2,\n\t49123 - 44032: 0x97A3,\n\t49124 - 44032: 0x97A4,\n\t49125 - 44032: 0x97A5,\n\t49126 - 44032: 0x97A6,\n\t49127 - 44032: 0x97A7,\n\t49128 - 44032: 0x97A8,\n\t49129 - 44032: 0x97A9,\n\t49130 - 44032: 0x97AA,\n\t49131 - 44032: 0x97AB,\n\t49132 - 44032: 0x97AC,\n\t49133 - 44032: 0x97AD,\n\t49134 - 44032: 0x97AE,\n\t49135 - 44032: 0x97AF,\n\t49136 - 44032: 0x97B0,\n\t49137 - 44032: 0x97B1,\n\t49138 - 44032: 0x97B2,\n\t49139 - 44032: 0x97B3,\n\t49140 - 44032: 0x97B4,\n\t49141 - 44032: 0x97B5,\n\t49142 - 44032: 0x97B6,\n\t49143 - 44032: 0x97B7,\n\t49144 - 44032: 0x97B8,\n\t49145 - 44032: 0x97B9,\n\t49146 - 44032: 0x97BA,\n\t49147 - 44032: 0x97BB,\n\t49148 - 44032: 0x97BC,\n\t49149 - 44032: 0x97BD,\n\t49150 - 44032: 0x97BE,\n\t49151 - 44032: 0x97BF,\n\t49152 - 44032: 0x97C0,\n\t49153 - 44032: 0x97C1,\n\t49154 - 44032: 0x97C2,\n\t49155 - 44032: 0x97C3,\n\t49156 - 44032: 0x97C4,\n\t49157 - 44032: 0x97C5,\n\t49158 - 44032: 0x97C6,\n\t49159 - 44032: 0x97C7,\n\t49160 - 44032: 0x97C8,\n\t49161 - 44032: 0x97C9,\n\t49162 - 44032: 0x97CA,\n\t49163 - 44032: 0x97CB,\n\t49164 - 44032: 0x97CC,\n\t49165 - 44032: 0x97CD,\n\t49166 - 44032: 0x97CE,\n\t49167 - 44032: 0x97CF,\n\t49168 - 44032: 0x97D0,\n\t49169 - 44032: 0x97D1,\n\t49170 - 44032: 0x97D2,\n\t49171 - 44032: 0x97D3,\n\t49172 - 44032: 0x97D4,\n\t49173 - 44032: 0x97D5,\n\t49174 - 44032: 0x97D6,\n\t49175 - 44032: 0x97D7,\n\t49176 - 44032: 0x97D8,\n\t49177 - 44032: 0x97D9,\n\t49178 - 44032: 0x97DA,\n\t49179 - 44032: 0x97DB,\n\t49180 - 44032: 0x97DC,\n\t49181 - 44032: 0x97DD,\n\t49182 - 44032: 0x97DE,\n\t49183 - 44032: 0x97DF,\n\t49184 - 44032: 0x97E0,\n\t49185 - 44032: 0x97E1,\n\t49186 - 44032: 0x97E2,\n\t49187 - 44032: 0x97E3,\n\t49188 - 44032: 0x97E4,\n\t49189 - 44032: 0x97E5,\n\t49190 - 44032: 0x97E6,\n\t49191 - 44032: 0x97E7,\n\t49192 - 44032: 0x97E8,\n\t49193 - 44032: 0x97E9,\n\t49194 - 44032: 0x97EA,\n\t49195 - 44032: 0x97EB,\n\t49196 - 44032: 0x97EC,\n\t49197 - 44032: 0x97ED,\n\t49198 - 44032: 0x97EE,\n\t49199 - 44032: 0x97EF,\n\t49200 - 44032: 0x97F0,\n\t49201 - 44032: 0x97F1,\n\t49202 - 44032: 0x97F2,\n\t49203 - 44032: 0x97F3,\n\t49204 - 44032: 0x97F4,\n\t49205 - 44032: 0x97F5,\n\t49206 - 44032: 0x97F6,\n\t49207 - 44032: 0x97F7,\n\t49208 - 44032: 0x97F8,\n\t49209 - 44032: 0x97F9,\n\t49210 - 44032: 0x97FA,\n\t49211 - 44032: 0x97FB,\n\t49212 - 44032: 0xBBD8,\n\t49213 - 44032: 0x97FC,\n\t49214 - 44032: 0x97FD,\n\t49215 - 44032: 0x97FE,\n\t49216 - 44032: 0x9841,\n\t49217 - 44032: 0x9842,\n\t49218 - 44032: 0x9843,\n\t49219 - 44032: 0x9844,\n\t49220 - 44032: 0x9845,\n\t49221 - 44032: 0x9846,\n\t49222 - 44032: 0x9847,\n\t49223 - 44032: 0x9848,\n\t49224 - 44032: 0x9849,\n\t49225 - 44032: 0x984A,\n\t49226 - 44032: 0x984B,\n\t49227 - 44032: 0x984C,\n\t49228 - 44032: 0x984D,\n\t49229 - 44032: 0x984E,\n\t49230 - 44032: 0x984F,\n\t49231 - 44032: 0x9850,\n\t49232 - 44032: 0x9851,\n\t49233 - 44032: 0xBBD9,\n\t49234 - 44032: 0x9852,\n\t49235 - 44032: 0x9853,\n\t49236 - 44032: 0x9854,\n\t49237 - 44032: 0x9855,\n\t49238 - 44032: 0x9856,\n\t49239 - 44032: 0x9857,\n\t49240 - 44032: 0xBBDA,\n\t49241 - 44032: 0x9858,\n\t49242 - 44032: 0x9859,\n\t49243 - 44032: 0x985A,\n\t49244 - 44032: 0xBBDB,\n\t49245 - 44032: 0x9861,\n\t49246 - 44032: 0x9862,\n\t49247 - 44032: 0x9863,\n\t49248 - 44032: 0xBBDC,\n\t49249 - 44032: 0x9864,\n\t49250 - 44032: 0x9865,\n\t49251 - 44032: 0x9866,\n\t49252 - 44032: 0x9867,\n\t49253 - 44032: 0x9868,\n\t49254 - 44032: 0x9869,\n\t49255 - 44032: 0x986A,\n\t49256 - 44032: 0xBBDD,\n\t49257 - 44032: 0xBBDE,\n\t49258 - 44032: 0x986B,\n\t49259 - 44032: 0x986C,\n\t49260 - 44032: 0x986D,\n\t49261 - 44032: 0x986E,\n\t49262 - 44032: 0x986F,\n\t49263 - 44032: 0x9870,\n\t49264 - 44032: 0x9871,\n\t49265 - 44032: 0x9872,\n\t49266 - 44032: 0x9873,\n\t49267 - 44032: 0x9874,\n\t49268 - 44032: 0x9875,\n\t49269 - 44032: 0x9876,\n\t49270 - 44032: 0x9877,\n\t49271 - 44032: 0x9878,\n\t49272 - 44032: 0x9879,\n\t49273 - 44032: 0x987A,\n\t49274 - 44032: 0x9881,\n\t49275 - 44032: 0x9882,\n\t49276 - 44032: 0x9883,\n\t49277 - 44032: 0x9884,\n\t49278 - 44032: 0x9885,\n\t49279 - 44032: 0x9886,\n\t49280 - 44032: 0x9887,\n\t49281 - 44032: 0x9888,\n\t49282 - 44032: 0x9889,\n\t49283 - 44032: 0x988A,\n\t49284 - 44032: 0x988B,\n\t49285 - 44032: 0x988C,\n\t49286 - 44032: 0x988D,\n\t49287 - 44032: 0x988E,\n\t49288 - 44032: 0x988F,\n\t49289 - 44032: 0x9890,\n\t49290 - 44032: 0x9891,\n\t49291 - 44032: 0x9892,\n\t49292 - 44032: 0x9893,\n\t49293 - 44032: 0x9894,\n\t49294 - 44032: 0x9895,\n\t49295 - 44032: 0x9896,\n\t49296 - 44032: 0xBBDF,\n\t49297 - 44032: 0xBBE0,\n\t49298 - 44032: 0x9897,\n\t49299 - 44032: 0x9898,\n\t49300 - 44032: 0xBBE1,\n\t49301 - 44032: 0x9899,\n\t49302 - 44032: 0x989A,\n\t49303 - 44032: 0x989B,\n\t49304 - 44032: 0xBBE2,\n\t49305 - 44032: 0x989C,\n\t49306 - 44032: 0x989D,\n\t49307 - 44032: 0x989E,\n\t49308 - 44032: 0x989F,\n\t49309 - 44032: 0x98A0,\n\t49310 - 44032: 0x98A1,\n\t49311 - 44032: 0x98A2,\n\t49312 - 44032: 0xBBE3,\n\t49313 - 44032: 0xBBE4,\n\t49314 - 44032: 0x98A3,\n\t49315 - 44032: 0xBBE5,\n\t49316 - 44032: 0x98A4,\n\t49317 - 44032: 0xBBE6,\n\t49318 - 44032: 0x98A5,\n\t49319 - 44032: 0x98A6,\n\t49320 - 44032: 0x98A7,\n\t49321 - 44032: 0x98A8,\n\t49322 - 44032: 0x98A9,\n\t49323 - 44032: 0x98AA,\n\t49324 - 44032: 0xBBE7,\n\t49325 - 44032: 0xBBE8,\n\t49326 - 44032: 0x98AB,\n\t49327 - 44032: 0xBBE9,\n\t49328 - 44032: 0xBBEA,\n\t49329 - 44032: 0x98AC,\n\t49330 - 44032: 0x98AD,\n\t49331 - 44032: 0xBBEB,\n\t49332 - 44032: 0xBBEC,\n\t49333 - 44032: 0xBBED,\n\t49334 - 44032: 0xBBEE,\n\t49335 - 44032: 0x98AE,\n\t49336 - 44032: 0x98AF,\n\t49337 - 44032: 0x98B0,\n\t49338 - 44032: 0x98B1,\n\t49339 - 44032: 0x98B2,\n\t49340 - 44032: 0xBBEF,\n\t49341 - 44032: 0xBBF0,\n\t49342 - 44032: 0x98B3,\n\t49343 - 44032: 0xBBF1,\n\t49344 - 44032: 0xBBF2,\n\t49345 - 44032: 0xBBF3,\n\t49346 - 44032: 0x98B4,\n\t49347 - 44032: 0x98B5,\n\t49348 - 44032: 0x98B6,\n\t49349 - 44032: 0xBBF4,\n\t49350 - 44032: 0x98B7,\n\t49351 - 44032: 0x98B8,\n\t49352 - 44032: 0xBBF5,\n\t49353 - 44032: 0xBBF6,\n\t49354 - 44032: 0x98B9,\n\t49355 - 44032: 0x98BA,\n\t49356 - 44032: 0xBBF7,\n\t49357 - 44032: 0x98BB,\n\t49358 - 44032: 0x98BC,\n\t49359 - 44032: 0x98BD,\n\t49360 - 44032: 0xBBF8,\n\t49361 - 44032: 0x98BE,\n\t49362 - 44032: 0x98BF,\n\t49363 - 44032: 0x98C0,\n\t49364 - 44032: 0x98C1,\n\t49365 - 44032: 0x98C2,\n\t49366 - 44032: 0x98C3,\n\t49367 - 44032: 0x98C4,\n\t49368 - 44032: 0xBBF9,\n\t49369 - 44032: 0xBBFA,\n\t49370 - 44032: 0x98C5,\n\t49371 - 44032: 0xBBFB,\n\t49372 - 44032: 0xBBFC,\n\t49373 - 44032: 0xBBFD,\n\t49374 - 44032: 0x98C6,\n\t49375 - 44032: 0x98C7,\n\t49376 - 44032: 0x98C8,\n\t49377 - 44032: 0x98C9,\n\t49378 - 44032: 0x98CA,\n\t49379 - 44032: 0x98CB,\n\t49380 - 44032: 0xBBFE,\n\t49381 - 44032: 0xBCA1,\n\t49382 - 44032: 0x98CC,\n\t49383 - 44032: 0x98CD,\n\t49384 - 44032: 0xBCA2,\n\t49385 - 44032: 0x98CE,\n\t49386 - 44032: 0x98CF,\n\t49387 - 44032: 0x98D0,\n\t49388 - 44032: 0xBCA3,\n\t49389 - 44032: 0x98D1,\n\t49390 - 44032: 0x98D2,\n\t49391 - 44032: 0x98D3,\n\t49392 - 44032: 0x98D4,\n\t49393 - 44032: 0x98D5,\n\t49394 - 44032: 0x98D6,\n\t49395 - 44032: 0x98D7,\n\t49396 - 44032: 0xBCA4,\n\t49397 - 44032: 0xBCA5,\n\t49398 - 44032: 0x98D8,\n\t49399 - 44032: 0xBCA6,\n\t49400 - 44032: 0x98D9,\n\t49401 - 44032: 0xBCA7,\n\t49402 - 44032: 0x98DA,\n\t49403 - 44032: 0x98DB,\n\t49404 - 44032: 0x98DC,\n\t49405 - 44032: 0x98DD,\n\t49406 - 44032: 0x98DE,\n\t49407 - 44032: 0x98DF,\n\t49408 - 44032: 0xBCA8,\n\t49409 - 44032: 0x98E0,\n\t49410 - 44032: 0x98E1,\n\t49411 - 44032: 0x98E2,\n\t49412 - 44032: 0xBCA9,\n\t49413 - 44032: 0x98E3,\n\t49414 - 44032: 0x98E4,\n\t49415 - 44032: 0x98E5,\n\t49416 - 44032: 0xBCAA,\n\t49417 - 44032: 0x98E6,\n\t49418 - 44032: 0x98E7,\n\t49419 - 44032: 0x98E8,\n\t49420 - 44032: 0x98E9,\n\t49421 - 44032: 0x98EA,\n\t49422 - 44032: 0x98EB,\n\t49423 - 44032: 0x98EC,\n\t49424 - 44032: 0xBCAB,\n\t49425 - 44032: 0x98ED,\n\t49426 - 44032: 0x98EE,\n\t49427 - 44032: 0x98EF,\n\t49428 - 44032: 0x98F0,\n\t49429 - 44032: 0xBCAC,\n\t49430 - 44032: 0x98F1,\n\t49431 - 44032: 0x98F2,\n\t49432 - 44032: 0x98F3,\n\t49433 - 44032: 0x98F4,\n\t49434 - 44032: 0x98F5,\n\t49435 - 44032: 0x98F6,\n\t49436 - 44032: 0xBCAD,\n\t49437 - 44032: 0xBCAE,\n\t49438 - 44032: 0xBCAF,\n\t49439 - 44032: 0xBCB0,\n\t49440 - 44032: 0xBCB1,\n\t49441 - 44032: 0x98F7,\n\t49442 - 44032: 0x98F8,\n\t49443 - 44032: 0xBCB2,\n\t49444 - 44032: 0xBCB3,\n\t49445 - 44032: 0x98F9,\n\t49446 - 44032: 0xBCB4,\n\t49447 - 44032: 0xBCB5,\n\t49448 - 44032: 0x98FA,\n\t49449 - 44032: 0x98FB,\n\t49450 - 44032: 0x98FC,\n\t49451 - 44032: 0x98FD,\n\t49452 - 44032: 0xBCB6,\n\t49453 - 44032: 0xBCB7,\n\t49454 - 44032: 0x98FE,\n\t49455 - 44032: 0xBCB8,\n\t49456 - 44032: 0xBCB9,\n\t49457 - 44032: 0xBCBA,\n\t49458 - 44032: 0x9941,\n\t49459 - 44032: 0x9942,\n\t49460 - 44032: 0x9943,\n\t49461 - 44032: 0x9944,\n\t49462 - 44032: 0xBCBB,\n\t49463 - 44032: 0x9945,\n\t49464 - 44032: 0xBCBC,\n\t49465 - 44032: 0xBCBD,\n\t49466 - 44032: 0x9946,\n\t49467 - 44032: 0x9947,\n\t49468 - 44032: 0xBCBE,\n\t49469 - 44032: 0x9948,\n\t49470 - 44032: 0x9949,\n\t49471 - 44032: 0x994A,\n\t49472 - 44032: 0xBCBF,\n\t49473 - 44032: 0x994B,\n\t49474 - 44032: 0x994C,\n\t49475 - 44032: 0x994D,\n\t49476 - 44032: 0x994E,\n\t49477 - 44032: 0x994F,\n\t49478 - 44032: 0x9950,\n\t49479 - 44032: 0x9951,\n\t49480 - 44032: 0xBCC0,\n\t49481 - 44032: 0xBCC1,\n\t49482 - 44032: 0x9952,\n\t49483 - 44032: 0xBCC2,\n\t49484 - 44032: 0xBCC3,\n\t49485 - 44032: 0xBCC4,\n\t49486 - 44032: 0x9953,\n\t49487 - 44032: 0x9954,\n\t49488 - 44032: 0x9955,\n\t49489 - 44032: 0x9956,\n\t49490 - 44032: 0x9957,\n\t49491 - 44032: 0x9958,\n\t49492 - 44032: 0xBCC5,\n\t49493 - 44032: 0xBCC6,\n\t49494 - 44032: 0x9959,\n\t49495 - 44032: 0x995A,\n\t49496 - 44032: 0xBCC7,\n\t49497 - 44032: 0x9961,\n\t49498 - 44032: 0x9962,\n\t49499 - 44032: 0x9963,\n\t49500 - 44032: 0xBCC8,\n\t49501 - 44032: 0x9964,\n\t49502 - 44032: 0x9965,\n\t49503 - 44032: 0x9966,\n\t49504 - 44032: 0x9967,\n\t49505 - 44032: 0x9968,\n\t49506 - 44032: 0x9969,\n\t49507 - 44032: 0x996A,\n\t49508 - 44032: 0xBCC9,\n\t49509 - 44032: 0xBCCA,\n\t49510 - 44032: 0x996B,\n\t49511 - 44032: 0xBCCB,\n\t49512 - 44032: 0xBCCC,\n\t49513 - 44032: 0xBCCD,\n\t49514 - 44032: 0x996C,\n\t49515 - 44032: 0x996D,\n\t49516 - 44032: 0x996E,\n\t49517 - 44032: 0x996F,\n\t49518 - 44032: 0x9970,\n\t49519 - 44032: 0x9971,\n\t49520 - 44032: 0xBCCE,\n\t49521 - 44032: 0x9972,\n\t49522 - 44032: 0x9973,\n\t49523 - 44032: 0x9974,\n\t49524 - 44032: 0xBCCF,\n\t49525 - 44032: 0x9975,\n\t49526 - 44032: 0x9976,\n\t49527 - 44032: 0x9977,\n\t49528 - 44032: 0xBCD0,\n\t49529 - 44032: 0x9978,\n\t49530 - 44032: 0x9979,\n\t49531 - 44032: 0x997A,\n\t49532 - 44032: 0x9981,\n\t49533 - 44032: 0x9982,\n\t49534 - 44032: 0x9983,\n\t49535 - 44032: 0x9984,\n\t49536 - 44032: 0x9985,\n\t49537 - 44032: 0x9986,\n\t49538 - 44032: 0x9987,\n\t49539 - 44032: 0x9988,\n\t49540 - 44032: 0x9989,\n\t49541 - 44032: 0xBCD1,\n\t49542 - 44032: 0x998A,\n\t49543 - 44032: 0x998B,\n\t49544 - 44032: 0x998C,\n\t49545 - 44032: 0x998D,\n\t49546 - 44032: 0x998E,\n\t49547 - 44032: 0x998F,\n\t49548 - 44032: 0xBCD2,\n\t49549 - 44032: 0xBCD3,\n\t49550 - 44032: 0xBCD4,\n\t49551 - 44032: 0x9990,\n\t49552 - 44032: 0xBCD5,\n\t49553 - 44032: 0x9991,\n\t49554 - 44032: 0x9992,\n\t49555 - 44032: 0x9993,\n\t49556 - 44032: 0xBCD6,\n\t49557 - 44032: 0x9994,\n\t49558 - 44032: 0xBCD7,\n\t49559 - 44032: 0x9995,\n\t49560 - 44032: 0x9996,\n\t49561 - 44032: 0x9997,\n\t49562 - 44032: 0x9998,\n\t49563 - 44032: 0x9999,\n\t49564 - 44032: 0xBCD8,\n\t49565 - 44032: 0xBCD9,\n\t49566 - 44032: 0x999A,\n\t49567 - 44032: 0xBCDA,\n\t49568 - 44032: 0x999B,\n\t49569 - 44032: 0xBCDB,\n\t49570 - 44032: 0x999C,\n\t49571 - 44032: 0x999D,\n\t49572 - 44032: 0x999E,\n\t49573 - 44032: 0xBCDC,\n\t49574 - 44032: 0x999F,\n\t49575 - 44032: 0x99A0,\n\t49576 - 44032: 0xBCDD,\n\t49577 - 44032: 0xBCDE,\n\t49578 - 44032: 0x99A1,\n\t49579 - 44032: 0x99A2,\n\t49580 - 44032: 0xBCDF,\n\t49581 - 44032: 0x99A3,\n\t49582 - 44032: 0x99A4,\n\t49583 - 44032: 0x99A5,\n\t49584 - 44032: 0xBCE0,\n\t49585 - 44032: 0x99A6,\n\t49586 - 44032: 0x99A7,\n\t49587 - 44032: 0x99A8,\n\t49588 - 44032: 0x99A9,\n\t49589 - 44032: 0x99AA,\n\t49590 - 44032: 0x99AB,\n\t49591 - 44032: 0x99AC,\n\t49592 - 44032: 0x99AD,\n\t49593 - 44032: 0x99AE,\n\t49594 - 44032: 0x99AF,\n\t49595 - 44032: 0x99B0,\n\t49596 - 44032: 0x99B1,\n\t49597 - 44032: 0xBCE1,\n\t49598 - 44032: 0x99B2,\n\t49599 - 44032: 0x99B3,\n\t49600 - 44032: 0x99B4,\n\t49601 - 44032: 0x99B5,\n\t49602 - 44032: 0x99B6,\n\t49603 - 44032: 0x99B7,\n\t49604 - 44032: 0xBCE2,\n\t49605 - 44032: 0x99B8,\n\t49606 - 44032: 0x99B9,\n\t49607 - 44032: 0x99BA,\n\t49608 - 44032: 0xBCE3,\n\t49609 - 44032: 0x99BB,\n\t49610 - 44032: 0x99BC,\n\t49611 - 44032: 0x99BD,\n\t49612 - 44032: 0xBCE4,\n\t49613 - 44032: 0x99BE,\n\t49614 - 44032: 0x99BF,\n\t49615 - 44032: 0x99C0,\n\t49616 - 44032: 0x99C1,\n\t49617 - 44032: 0x99C2,\n\t49618 - 44032: 0x99C3,\n\t49619 - 44032: 0x99C4,\n\t49620 - 44032: 0xBCE5,\n\t49621 - 44032: 0x99C5,\n\t49622 - 44032: 0x99C6,\n\t49623 - 44032: 0xBCE6,\n\t49624 - 44032: 0xBCE7,\n\t49625 - 44032: 0x99C7,\n\t49626 - 44032: 0x99C8,\n\t49627 - 44032: 0x99C9,\n\t49628 - 44032: 0x99CA,\n\t49629 - 44032: 0x99CB,\n\t49630 - 44032: 0x99CC,\n\t49631 - 44032: 0x99CD,\n\t49632 - 44032: 0xBCE8,\n\t49633 - 44032: 0x99CE,\n\t49634 - 44032: 0x99CF,\n\t49635 - 44032: 0x99D0,\n\t49636 - 44032: 0xBCE9,\n\t49637 - 44032: 0x99D1,\n\t49638 - 44032: 0x99D2,\n\t49639 - 44032: 0x99D3,\n\t49640 - 44032: 0xBCEA,\n\t49641 - 44032: 0x99D4,\n\t49642 - 44032: 0x99D5,\n\t49643 - 44032: 0x99D6,\n\t49644 - 44032: 0x99D7,\n\t49645 - 44032: 0x99D8,\n\t49646 - 44032: 0x99D9,\n\t49647 - 44032: 0x99DA,\n\t49648 - 44032: 0xBCEB,\n\t49649 - 44032: 0xBCEC,\n\t49650 - 44032: 0x99DB,\n\t49651 - 44032: 0xBCED,\n\t49652 - 44032: 0x99DC,\n\t49653 - 44032: 0x99DD,\n\t49654 - 44032: 0x99DE,\n\t49655 - 44032: 0x99DF,\n\t49656 - 44032: 0x99E0,\n\t49657 - 44032: 0x99E1,\n\t49658 - 44032: 0x99E2,\n\t49659 - 44032: 0x99E3,\n\t49660 - 44032: 0xBCEE,\n\t49661 - 44032: 0xBCEF,\n\t49662 - 44032: 0x99E4,\n\t49663 - 44032: 0x99E5,\n\t49664 - 44032: 0xBCF0,\n\t49665 - 44032: 0x99E6,\n\t49666 - 44032: 0x99E7,\n\t49667 - 44032: 0x99E8,\n\t49668 - 44032: 0xBCF1,\n\t49669 - 44032: 0x99E9,\n\t49670 - 44032: 0x99EA,\n\t49671 - 44032: 0x99EB,\n\t49672 - 44032: 0x99EC,\n\t49673 - 44032: 0x99ED,\n\t49674 - 44032: 0x99EE,\n\t49675 - 44032: 0x99EF,\n\t49676 - 44032: 0xBCF2,\n\t49677 - 44032: 0xBCF3,\n\t49678 - 44032: 0x99F0,\n\t49679 - 44032: 0xBCF4,\n\t49680 - 44032: 0x99F1,\n\t49681 - 44032: 0xBCF5,\n\t49682 - 44032: 0x99F2,\n\t49683 - 44032: 0x99F3,\n\t49684 - 44032: 0x99F4,\n\t49685 - 44032: 0x99F5,\n\t49686 - 44032: 0x99F6,\n\t49687 - 44032: 0x99F7,\n\t49688 - 44032: 0xBCF6,\n\t49689 - 44032: 0xBCF7,\n\t49690 - 44032: 0x99F8,\n\t49691 - 44032: 0x99F9,\n\t49692 - 44032: 0xBCF8,\n\t49693 - 44032: 0x99FA,\n\t49694 - 44032: 0x99FB,\n\t49695 - 44032: 0xBCF9,\n\t49696 - 44032: 0xBCFA,\n\t49697 - 44032: 0x99FC,\n\t49698 - 44032: 0x99FD,\n\t49699 - 44032: 0x99FE,\n\t49700 - 44032: 0x9A41,\n\t49701 - 44032: 0x9A42,\n\t49702 - 44032: 0x9A43,\n\t49703 - 44032: 0x9A44,\n\t49704 - 44032: 0xBCFB,\n\t49705 - 44032: 0xBCFC,\n\t49706 - 44032: 0x9A45,\n\t49707 - 44032: 0xBCFD,\n\t49708 - 44032: 0x9A46,\n\t49709 - 44032: 0xBCFE,\n\t49710 - 44032: 0x9A47,\n\t49711 - 44032: 0xBDA1,\n\t49712 - 44032: 0x9A48,\n\t49713 - 44032: 0xBDA2,\n\t49714 - 44032: 0xBDA3,\n\t49715 - 44032: 0x9A49,\n\t49716 - 44032: 0xBDA4,\n\t49717 - 44032: 0x9A4A,\n\t49718 - 44032: 0x9A4B,\n\t49719 - 44032: 0x9A4C,\n\t49720 - 44032: 0x9A4D,\n\t49721 - 44032: 0x9A4E,\n\t49722 - 44032: 0x9A4F,\n\t49723 - 44032: 0x9A50,\n\t49724 - 44032: 0x9A51,\n\t49725 - 44032: 0x9A52,\n\t49726 - 44032: 0x9A53,\n\t49727 - 44032: 0x9A54,\n\t49728 - 44032: 0x9A55,\n\t49729 - 44032: 0x9A56,\n\t49730 - 44032: 0x9A57,\n\t49731 - 44032: 0x9A58,\n\t49732 - 44032: 0x9A59,\n\t49733 - 44032: 0x9A5A,\n\t49734 - 44032: 0x9A61,\n\t49735 - 44032: 0x9A62,\n\t49736 - 44032: 0xBDA5,\n\t49737 - 44032: 0x9A63,\n\t49738 - 44032: 0x9A64,\n\t49739 - 44032: 0x9A65,\n\t49740 - 44032: 0x9A66,\n\t49741 - 44032: 0x9A67,\n\t49742 - 44032: 0x9A68,\n\t49743 - 44032: 0x9A69,\n\t49744 - 44032: 0xBDA6,\n\t49745 - 44032: 0xBDA7,\n\t49746 - 44032: 0x9A6A,\n\t49747 - 44032: 0x9A6B,\n\t49748 - 44032: 0xBDA8,\n\t49749 - 44032: 0x9A6C,\n\t49750 - 44032: 0x9A6D,\n\t49751 - 44032: 0x9A6E,\n\t49752 - 44032: 0xBDA9,\n\t49753 - 44032: 0x9A6F,\n\t49754 - 44032: 0x9A70,\n\t49755 - 44032: 0x9A71,\n\t49756 - 44032: 0x9A72,\n\t49757 - 44032: 0x9A73,\n\t49758 - 44032: 0x9A74,\n\t49759 - 44032: 0x9A75,\n\t49760 - 44032: 0xBDAA,\n\t49761 - 44032: 0x9A76,\n\t49762 - 44032: 0x9A77,\n\t49763 - 44032: 0x9A78,\n\t49764 - 44032: 0x9A79,\n\t49765 - 44032: 0xBDAB,\n\t49766 - 44032: 0x9A7A,\n\t49767 - 44032: 0x9A81,\n\t49768 - 44032: 0x9A82,\n\t49769 - 44032: 0x9A83,\n\t49770 - 44032: 0x9A84,\n\t49771 - 44032: 0x9A85,\n\t49772 - 44032: 0xBDAC,\n\t49773 - 44032: 0xBDAD,\n\t49774 - 44032: 0x9A86,\n\t49775 - 44032: 0x9A87,\n\t49776 - 44032: 0xBDAE,\n\t49777 - 44032: 0x9A88,\n\t49778 - 44032: 0x9A89,\n\t49779 - 44032: 0x9A8A,\n\t49780 - 44032: 0xBDAF,\n\t49781 - 44032: 0x9A8B,\n\t49782 - 44032: 0x9A8C,\n\t49783 - 44032: 0x9A8D,\n\t49784 - 44032: 0x9A8E,\n\t49785 - 44032: 0x9A8F,\n\t49786 - 44032: 0x9A90,\n\t49787 - 44032: 0x9A91,\n\t49788 - 44032: 0xBDB0,\n\t49789 - 44032: 0xBDB1,\n\t49790 - 44032: 0x9A92,\n\t49791 - 44032: 0xBDB2,\n\t49792 - 44032: 0x9A93,\n\t49793 - 44032: 0xBDB3,\n\t49794 - 44032: 0x9A94,\n\t49795 - 44032: 0x9A95,\n\t49796 - 44032: 0x9A96,\n\t49797 - 44032: 0x9A97,\n\t49798 - 44032: 0x9A98,\n\t49799 - 44032: 0x9A99,\n\t49800 - 44032: 0xBDB4,\n\t49801 - 44032: 0xBDB5,\n\t49802 - 44032: 0x9A9A,\n\t49803 - 44032: 0x9A9B,\n\t49804 - 44032: 0x9A9C,\n\t49805 - 44032: 0x9A9D,\n\t49806 - 44032: 0x9A9E,\n\t49807 - 44032: 0x9A9F,\n\t49808 - 44032: 0xBDB6,\n\t49809 - 44032: 0x9AA0,\n\t49810 - 44032: 0x9AA1,\n\t49811 - 44032: 0x9AA2,\n\t49812 - 44032: 0x9AA3,\n\t49813 - 44032: 0x9AA4,\n\t49814 - 44032: 0x9AA5,\n\t49815 - 44032: 0x9AA6,\n\t49816 - 44032: 0xBDB7,\n\t49817 - 44032: 0x9AA7,\n\t49818 - 44032: 0x9AA8,\n\t49819 - 44032: 0xBDB8,\n\t49820 - 44032: 0x9AA9,\n\t49821 - 44032: 0xBDB9,\n\t49822 - 44032: 0x9AAA,\n\t49823 - 44032: 0x9AAB,\n\t49824 - 44032: 0x9AAC,\n\t49825 - 44032: 0x9AAD,\n\t49826 - 44032: 0x9AAE,\n\t49827 - 44032: 0x9AAF,\n\t49828 - 44032: 0xBDBA,\n\t49829 - 44032: 0xBDBB,\n\t49830 - 44032: 0x9AB0,\n\t49831 - 44032: 0x9AB1,\n\t49832 - 44032: 0xBDBC,\n\t49833 - 44032: 0x9AB2,\n\t49834 - 44032: 0x9AB3,\n\t49835 - 44032: 0x9AB4,\n\t49836 - 44032: 0xBDBD,\n\t49837 - 44032: 0xBDBE,\n\t49838 - 44032: 0x9AB5,\n\t49839 - 44032: 0x9AB6,\n\t49840 - 44032: 0x9AB7,\n\t49841 - 44032: 0x9AB8,\n\t49842 - 44032: 0x9AB9,\n\t49843 - 44032: 0x9ABA,\n\t49844 - 44032: 0xBDBF,\n\t49845 - 44032: 0xBDC0,\n\t49846 - 44032: 0x9ABB,\n\t49847 - 44032: 0xBDC1,\n\t49848 - 44032: 0x9ABC,\n\t49849 - 44032: 0xBDC2,\n\t49850 - 44032: 0x9ABD,\n\t49851 - 44032: 0x9ABE,\n\t49852 - 44032: 0x9ABF,\n\t49853 - 44032: 0x9AC0,\n\t49854 - 44032: 0x9AC1,\n\t49855 - 44032: 0x9AC2,\n\t49856 - 44032: 0x9AC3,\n\t49857 - 44032: 0x9AC4,\n\t49858 - 44032: 0x9AC5,\n\t49859 - 44032: 0x9AC6,\n\t49860 - 44032: 0x9AC7,\n\t49861 - 44032: 0x9AC8,\n\t49862 - 44032: 0x9AC9,\n\t49863 - 44032: 0x9ACA,\n\t49864 - 44032: 0x9ACB,\n\t49865 - 44032: 0x9ACC,\n\t49866 - 44032: 0x9ACD,\n\t49867 - 44032: 0x9ACE,\n\t49868 - 44032: 0x9ACF,\n\t49869 - 44032: 0x9AD0,\n\t49870 - 44032: 0x9AD1,\n\t49871 - 44032: 0x9AD2,\n\t49872 - 44032: 0x9AD3,\n\t49873 - 44032: 0x9AD4,\n\t49874 - 44032: 0x9AD5,\n\t49875 - 44032: 0x9AD6,\n\t49876 - 44032: 0x9AD7,\n\t49877 - 44032: 0x9AD8,\n\t49878 - 44032: 0x9AD9,\n\t49879 - 44032: 0x9ADA,\n\t49880 - 44032: 0x9ADB,\n\t49881 - 44032: 0x9ADC,\n\t49882 - 44032: 0x9ADD,\n\t49883 - 44032: 0x9ADE,\n\t49884 - 44032: 0xBDC3,\n\t49885 - 44032: 0xBDC4,\n\t49886 - 44032: 0x9ADF,\n\t49887 - 44032: 0x9AE0,\n\t49888 - 44032: 0xBDC5,\n\t49889 - 44032: 0x9AE1,\n\t49890 - 44032: 0x9AE2,\n\t49891 - 44032: 0xBDC6,\n\t49892 - 44032: 0xBDC7,\n\t49893 - 44032: 0x9AE3,\n\t49894 - 44032: 0x9AE4,\n\t49895 - 44032: 0x9AE5,\n\t49896 - 44032: 0x9AE6,\n\t49897 - 44032: 0x9AE7,\n\t49898 - 44032: 0x9AE8,\n\t49899 - 44032: 0xBDC8,\n\t49900 - 44032: 0xBDC9,\n\t49901 - 44032: 0xBDCA,\n\t49902 - 44032: 0x9AE9,\n\t49903 - 44032: 0xBDCB,\n\t49904 - 44032: 0x9AEA,\n\t49905 - 44032: 0xBDCC,\n\t49906 - 44032: 0x9AEB,\n\t49907 - 44032: 0x9AEC,\n\t49908 - 44032: 0x9AED,\n\t49909 - 44032: 0x9AEE,\n\t49910 - 44032: 0xBDCD,\n\t49911 - 44032: 0x9AEF,\n\t49912 - 44032: 0xBDCE,\n\t49913 - 44032: 0xBDCF,\n\t49914 - 44032: 0x9AF0,\n\t49915 - 44032: 0xBDD0,\n\t49916 - 44032: 0xBDD1,\n\t49917 - 44032: 0x9AF1,\n\t49918 - 44032: 0x9AF2,\n\t49919 - 44032: 0x9AF3,\n\t49920 - 44032: 0xBDD2,\n\t49921 - 44032: 0x9AF4,\n\t49922 - 44032: 0x9AF5,\n\t49923 - 44032: 0x9AF6,\n\t49924 - 44032: 0x9AF7,\n\t49925 - 44032: 0x9AF8,\n\t49926 - 44032: 0x9AF9,\n\t49927 - 44032: 0x9AFA,\n\t49928 - 44032: 0xBDD3,\n\t49929 - 44032: 0xBDD4,\n\t49930 - 44032: 0x9AFB,\n\t49931 - 44032: 0x9AFC,\n\t49932 - 44032: 0xBDD5,\n\t49933 - 44032: 0xBDD6,\n\t49934 - 44032: 0x9AFD,\n\t49935 - 44032: 0x9AFE,\n\t49936 - 44032: 0x9B41,\n\t49937 - 44032: 0x9B42,\n\t49938 - 44032: 0x9B43,\n\t49939 - 44032: 0xBDD7,\n\t49940 - 44032: 0xBDD8,\n\t49941 - 44032: 0xBDD9,\n\t49942 - 44032: 0x9B44,\n\t49943 - 44032: 0x9B45,\n\t49944 - 44032: 0xBDDA,\n\t49945 - 44032: 0x9B46,\n\t49946 - 44032: 0x9B47,\n\t49947 - 44032: 0x9B48,\n\t49948 - 44032: 0xBDDB,\n\t49949 - 44032: 0x9B49,\n\t49950 - 44032: 0x9B4A,\n\t49951 - 44032: 0x9B4B,\n\t49952 - 44032: 0x9B4C,\n\t49953 - 44032: 0x9B4D,\n\t49954 - 44032: 0x9B4E,\n\t49955 - 44032: 0x9B4F,\n\t49956 - 44032: 0xBDDC,\n\t49957 - 44032: 0xBDDD,\n\t49958 - 44032: 0x9B50,\n\t49959 - 44032: 0x9B51,\n\t49960 - 44032: 0xBDDE,\n\t49961 - 44032: 0xBDDF,\n\t49962 - 44032: 0x9B52,\n\t49963 - 44032: 0x9B53,\n\t49964 - 44032: 0x9B54,\n\t49965 - 44032: 0x9B55,\n\t49966 - 44032: 0x9B56,\n\t49967 - 44032: 0x9B57,\n\t49968 - 44032: 0x9B58,\n\t49969 - 44032: 0x9B59,\n\t49970 - 44032: 0x9B5A,\n\t49971 - 44032: 0x9B61,\n\t49972 - 44032: 0x9B62,\n\t49973 - 44032: 0x9B63,\n\t49974 - 44032: 0x9B64,\n\t49975 - 44032: 0x9B65,\n\t49976 - 44032: 0x9B66,\n\t49977 - 44032: 0x9B67,\n\t49978 - 44032: 0x9B68,\n\t49979 - 44032: 0x9B69,\n\t49980 - 44032: 0x9B6A,\n\t49981 - 44032: 0x9B6B,\n\t49982 - 44032: 0x9B6C,\n\t49983 - 44032: 0x9B6D,\n\t49984 - 44032: 0x9B6E,\n\t49985 - 44032: 0x9B6F,\n\t49986 - 44032: 0x9B70,\n\t49987 - 44032: 0x9B71,\n\t49988 - 44032: 0x9B72,\n\t49989 - 44032: 0xBDE0,\n\t49990 - 44032: 0x9B73,\n\t49991 - 44032: 0x9B74,\n\t49992 - 44032: 0x9B75,\n\t49993 - 44032: 0x9B76,\n\t49994 - 44032: 0x9B77,\n\t49995 - 44032: 0x9B78,\n\t49996 - 44032: 0x9B79,\n\t49997 - 44032: 0x9B7A,\n\t49998 - 44032: 0x9B81,\n\t49999 - 44032: 0x9B82,\n\t50000 - 44032: 0x9B83,\n\t50001 - 44032: 0x9B84,\n\t50002 - 44032: 0x9B85,\n\t50003 - 44032: 0x9B86,\n\t50004 - 44032: 0x9B87,\n\t50005 - 44032: 0x9B88,\n\t50006 - 44032: 0x9B89,\n\t50007 - 44032: 0x9B8A,\n\t50008 - 44032: 0x9B8B,\n\t50009 - 44032: 0x9B8C,\n\t50010 - 44032: 0x9B8D,\n\t50011 - 44032: 0x9B8E,\n\t50012 - 44032: 0x9B8F,\n\t50013 - 44032: 0x9B90,\n\t50014 - 44032: 0x9B91,\n\t50015 - 44032: 0x9B92,\n\t50016 - 44032: 0x9B93,\n\t50017 - 44032: 0x9B94,\n\t50018 - 44032: 0x9B95,\n\t50019 - 44032: 0x9B96,\n\t50020 - 44032: 0x9B97,\n\t50021 - 44032: 0x9B98,\n\t50022 - 44032: 0x9B99,\n\t50023 - 44032: 0x9B9A,\n\t50024 - 44032: 0xBDE1,\n\t50025 - 44032: 0xBDE2,\n\t50026 - 44032: 0x9B9B,\n\t50027 - 44032: 0x9B9C,\n\t50028 - 44032: 0xBDE3,\n\t50029 - 44032: 0x9B9D,\n\t50030 - 44032: 0x9B9E,\n\t50031 - 44032: 0x9B9F,\n\t50032 - 44032: 0xBDE4,\n\t50033 - 44032: 0x9BA0,\n\t50034 - 44032: 0xBDE5,\n\t50035 - 44032: 0x9BA1,\n\t50036 - 44032: 0x9BA2,\n\t50037 - 44032: 0x9BA3,\n\t50038 - 44032: 0x9BA4,\n\t50039 - 44032: 0x9BA5,\n\t50040 - 44032: 0xBDE6,\n\t50041 - 44032: 0xBDE7,\n\t50042 - 44032: 0x9BA6,\n\t50043 - 44032: 0x9BA7,\n\t50044 - 44032: 0xBDE8,\n\t50045 - 44032: 0xBDE9,\n\t50046 - 44032: 0x9BA8,\n\t50047 - 44032: 0x9BA9,\n\t50048 - 44032: 0x9BAA,\n\t50049 - 44032: 0x9BAB,\n\t50050 - 44032: 0x9BAC,\n\t50051 - 44032: 0x9BAD,\n\t50052 - 44032: 0xBDEA,\n\t50053 - 44032: 0x9BAE,\n\t50054 - 44032: 0x9BAF,\n\t50055 - 44032: 0x9BB0,\n\t50056 - 44032: 0xBDEB,\n\t50057 - 44032: 0x9BB1,\n\t50058 - 44032: 0x9BB2,\n\t50059 - 44032: 0x9BB3,\n\t50060 - 44032: 0xBDEC,\n\t50061 - 44032: 0x9BB4,\n\t50062 - 44032: 0x9BB5,\n\t50063 - 44032: 0x9BB6,\n\t50064 - 44032: 0x9BB7,\n\t50065 - 44032: 0x9BB8,\n\t50066 - 44032: 0x9BB9,\n\t50067 - 44032: 0x9BBA,\n\t50068 - 44032: 0x9BBB,\n\t50069 - 44032: 0x9BBC,\n\t50070 - 44032: 0x9BBD,\n\t50071 - 44032: 0x9BBE,\n\t50072 - 44032: 0x9BBF,\n\t50073 - 44032: 0x9BC0,\n\t50074 - 44032: 0x9BC1,\n\t50075 - 44032: 0x9BC2,\n\t50076 - 44032: 0x9BC3,\n\t50077 - 44032: 0x9BC4,\n\t50078 - 44032: 0x9BC5,\n\t50079 - 44032: 0x9BC6,\n\t50080 - 44032: 0x9BC7,\n\t50081 - 44032: 0x9BC8,\n\t50082 - 44032: 0x9BC9,\n\t50083 - 44032: 0x9BCA,\n\t50084 - 44032: 0x9BCB,\n\t50085 - 44032: 0x9BCC,\n\t50086 - 44032: 0x9BCD,\n\t50087 - 44032: 0x9BCE,\n\t50088 - 44032: 0x9BCF,\n\t50089 - 44032: 0x9BD0,\n\t50090 - 44032: 0x9BD1,\n\t50091 - 44032: 0x9BD2,\n\t50092 - 44032: 0x9BD3,\n\t50093 - 44032: 0x9BD4,\n\t50094 - 44032: 0x9BD5,\n\t50095 - 44032: 0x9BD6,\n\t50096 - 44032: 0x9BD7,\n\t50097 - 44032: 0x9BD8,\n\t50098 - 44032: 0x9BD9,\n\t50099 - 44032: 0x9BDA,\n\t50100 - 44032: 0x9BDB,\n\t50101 - 44032: 0x9BDC,\n\t50102 - 44032: 0x9BDD,\n\t50103 - 44032: 0x9BDE,\n\t50104 - 44032: 0x9BDF,\n\t50105 - 44032: 0x9BE0,\n\t50106 - 44032: 0x9BE1,\n\t50107 - 44032: 0x9BE2,\n\t50108 - 44032: 0x9BE3,\n\t50109 - 44032: 0x9BE4,\n\t50110 - 44032: 0x9BE5,\n\t50111 - 44032: 0x9BE6,\n\t50112 - 44032: 0xBDED,\n\t50113 - 44032: 0x9BE7,\n\t50114 - 44032: 0x9BE8,\n\t50115 - 44032: 0x9BE9,\n\t50116 - 44032: 0x9BEA,\n\t50117 - 44032: 0x9BEB,\n\t50118 - 44032: 0x9BEC,\n\t50119 - 44032: 0x9BED,\n\t50120 - 44032: 0x9BEE,\n\t50121 - 44032: 0x9BEF,\n\t50122 - 44032: 0x9BF0,\n\t50123 - 44032: 0x9BF1,\n\t50124 - 44032: 0x9BF2,\n\t50125 - 44032: 0x9BF3,\n\t50126 - 44032: 0x9BF4,\n\t50127 - 44032: 0x9BF5,\n\t50128 - 44032: 0x9BF6,\n\t50129 - 44032: 0x9BF7,\n\t50130 - 44032: 0x9BF8,\n\t50131 - 44032: 0x9BF9,\n\t50132 - 44032: 0x9BFA,\n\t50133 - 44032: 0x9BFB,\n\t50134 - 44032: 0x9BFC,\n\t50135 - 44032: 0x9BFD,\n\t50136 - 44032: 0xBDEE,\n\t50137 - 44032: 0xBDEF,\n\t50138 - 44032: 0x9BFE,\n\t50139 - 44032: 0x9C41,\n\t50140 - 44032: 0xBDF0,\n\t50141 - 44032: 0x9C42,\n\t50142 - 44032: 0x9C43,\n\t50143 - 44032: 0xBDF1,\n\t50144 - 44032: 0xBDF2,\n\t50145 - 44032: 0x9C44,\n\t50146 - 44032: 0xBDF3,\n\t50147 - 44032: 0x9C45,\n\t50148 - 44032: 0x9C46,\n\t50149 - 44032: 0x9C47,\n\t50150 - 44032: 0x9C48,\n\t50151 - 44032: 0x9C49,\n\t50152 - 44032: 0xBDF4,\n\t50153 - 44032: 0xBDF5,\n\t50154 - 44032: 0x9C4A,\n\t50155 - 44032: 0x9C4B,\n\t50156 - 44032: 0x9C4C,\n\t50157 - 44032: 0xBDF6,\n\t50158 - 44032: 0x9C4D,\n\t50159 - 44032: 0x9C4E,\n\t50160 - 44032: 0x9C4F,\n\t50161 - 44032: 0x9C50,\n\t50162 - 44032: 0x9C51,\n\t50163 - 44032: 0x9C52,\n\t50164 - 44032: 0xBDF7,\n\t50165 - 44032: 0xBDF8,\n\t50166 - 44032: 0x9C53,\n\t50167 - 44032: 0x9C54,\n\t50168 - 44032: 0xBDF9,\n\t50169 - 44032: 0x9C55,\n\t50170 - 44032: 0x9C56,\n\t50171 - 44032: 0x9C57,\n\t50172 - 44032: 0x9C58,\n\t50173 - 44032: 0x9C59,\n\t50174 - 44032: 0x9C5A,\n\t50175 - 44032: 0x9C61,\n\t50176 - 44032: 0x9C62,\n\t50177 - 44032: 0x9C63,\n\t50178 - 44032: 0x9C64,\n\t50179 - 44032: 0x9C65,\n\t50180 - 44032: 0x9C66,\n\t50181 - 44032: 0x9C67,\n\t50182 - 44032: 0x9C68,\n\t50183 - 44032: 0x9C69,\n\t50184 - 44032: 0xBDFA,\n\t50185 - 44032: 0x9C6A,\n\t50186 - 44032: 0x9C6B,\n\t50187 - 44032: 0x9C6C,\n\t50188 - 44032: 0x9C6D,\n\t50189 - 44032: 0x9C6E,\n\t50190 - 44032: 0x9C6F,\n\t50191 - 44032: 0x9C70,\n\t50192 - 44032: 0xBDFB,\n\t50193 - 44032: 0x9C71,\n\t50194 - 44032: 0x9C72,\n\t50195 - 44032: 0x9C73,\n\t50196 - 44032: 0x9C74,\n\t50197 - 44032: 0x9C75,\n\t50198 - 44032: 0x9C76,\n\t50199 - 44032: 0x9C77,\n\t50200 - 44032: 0x9C78,\n\t50201 - 44032: 0x9C79,\n\t50202 - 44032: 0x9C7A,\n\t50203 - 44032: 0x9C81,\n\t50204 - 44032: 0x9C82,\n\t50205 - 44032: 0x9C83,\n\t50206 - 44032: 0x9C84,\n\t50207 - 44032: 0x9C85,\n\t50208 - 44032: 0x9C86,\n\t50209 - 44032: 0x9C87,\n\t50210 - 44032: 0x9C88,\n\t50211 - 44032: 0x9C89,\n\t50212 - 44032: 0xBDFC,\n\t50213 - 44032: 0x9C8A,\n\t50214 - 44032: 0x9C8B,\n\t50215 - 44032: 0x9C8C,\n\t50216 - 44032: 0x9C8D,\n\t50217 - 44032: 0x9C8E,\n\t50218 - 44032: 0x9C8F,\n\t50219 - 44032: 0x9C90,\n\t50220 - 44032: 0xBDFD,\n\t50221 - 44032: 0x9C91,\n\t50222 - 44032: 0x9C92,\n\t50223 - 44032: 0x9C93,\n\t50224 - 44032: 0xBDFE,\n\t50225 - 44032: 0x9C94,\n\t50226 - 44032: 0x9C95,\n\t50227 - 44032: 0x9C96,\n\t50228 - 44032: 0xBEA1,\n\t50229 - 44032: 0x9C97,\n\t50230 - 44032: 0x9C98,\n\t50231 - 44032: 0x9C99,\n\t50232 - 44032: 0x9C9A,\n\t50233 - 44032: 0x9C9B,\n\t50234 - 44032: 0x9C9C,\n\t50235 - 44032: 0x9C9D,\n\t50236 - 44032: 0xBEA2,\n\t50237 - 44032: 0xBEA3,\n\t50238 - 44032: 0x9C9E,\n\t50239 - 44032: 0x9C9F,\n\t50240 - 44032: 0x9CA0,\n\t50241 - 44032: 0x9CA1,\n\t50242 - 44032: 0x9CA2,\n\t50243 - 44032: 0x9CA3,\n\t50244 - 44032: 0x9CA4,\n\t50245 - 44032: 0x9CA5,\n\t50246 - 44032: 0x9CA6,\n\t50247 - 44032: 0x9CA7,\n\t50248 - 44032: 0xBEA4,\n\t50249 - 44032: 0x9CA8,\n\t50250 - 44032: 0x9CA9,\n\t50251 - 44032: 0x9CAA,\n\t50252 - 44032: 0x9CAB,\n\t50253 - 44032: 0x9CAC,\n\t50254 - 44032: 0x9CAD,\n\t50255 - 44032: 0x9CAE,\n\t50256 - 44032: 0x9CAF,\n\t50257 - 44032: 0x9CB0,\n\t50258 - 44032: 0x9CB1,\n\t50259 - 44032: 0x9CB2,\n\t50260 - 44032: 0x9CB3,\n\t50261 - 44032: 0x9CB4,\n\t50262 - 44032: 0x9CB5,\n\t50263 - 44032: 0x9CB6,\n\t50264 - 44032: 0x9CB7,\n\t50265 - 44032: 0x9CB8,\n\t50266 - 44032: 0x9CB9,\n\t50267 - 44032: 0x9CBA,\n\t50268 - 44032: 0x9CBB,\n\t50269 - 44032: 0x9CBC,\n\t50270 - 44032: 0x9CBD,\n\t50271 - 44032: 0x9CBE,\n\t50272 - 44032: 0x9CBF,\n\t50273 - 44032: 0x9CC0,\n\t50274 - 44032: 0x9CC1,\n\t50275 - 44032: 0x9CC2,\n\t50276 - 44032: 0xBEA5,\n\t50277 - 44032: 0xBEA6,\n\t50278 - 44032: 0x9CC3,\n\t50279 - 44032: 0x9CC4,\n\t50280 - 44032: 0xBEA7,\n\t50281 - 44032: 0x9CC5,\n\t50282 - 44032: 0x9CC6,\n\t50283 - 44032: 0x9CC7,\n\t50284 - 44032: 0xBEA8,\n\t50285 - 44032: 0x9CC8,\n\t50286 - 44032: 0x9CC9,\n\t50287 - 44032: 0x9CCA,\n\t50288 - 44032: 0x9CCB,\n\t50289 - 44032: 0x9CCC,\n\t50290 - 44032: 0x9CCD,\n\t50291 - 44032: 0x9CCE,\n\t50292 - 44032: 0xBEA9,\n\t50293 - 44032: 0xBEAA,\n\t50294 - 44032: 0x9CCF,\n\t50295 - 44032: 0x9CD0,\n\t50296 - 44032: 0x9CD1,\n\t50297 - 44032: 0xBEAB,\n\t50298 - 44032: 0x9CD2,\n\t50299 - 44032: 0x9CD3,\n\t50300 - 44032: 0x9CD4,\n\t50301 - 44032: 0x9CD5,\n\t50302 - 44032: 0x9CD6,\n\t50303 - 44032: 0x9CD7,\n\t50304 - 44032: 0xBEAC,\n\t50305 - 44032: 0x9CD8,\n\t50306 - 44032: 0x9CD9,\n\t50307 - 44032: 0x9CDA,\n\t50308 - 44032: 0x9CDB,\n\t50309 - 44032: 0x9CDC,\n\t50310 - 44032: 0x9CDD,\n\t50311 - 44032: 0x9CDE,\n\t50312 - 44032: 0x9CDF,\n\t50313 - 44032: 0x9CE0,\n\t50314 - 44032: 0x9CE1,\n\t50315 - 44032: 0x9CE2,\n\t50316 - 44032: 0x9CE3,\n\t50317 - 44032: 0x9CE4,\n\t50318 - 44032: 0x9CE5,\n\t50319 - 44032: 0x9CE6,\n\t50320 - 44032: 0x9CE7,\n\t50321 - 44032: 0x9CE8,\n\t50322 - 44032: 0x9CE9,\n\t50323 - 44032: 0x9CEA,\n\t50324 - 44032: 0xBEAD,\n\t50325 - 44032: 0x9CEB,\n\t50326 - 44032: 0x9CEC,\n\t50327 - 44032: 0x9CED,\n\t50328 - 44032: 0x9CEE,\n\t50329 - 44032: 0x9CEF,\n\t50330 - 44032: 0x9CF0,\n\t50331 - 44032: 0x9CF1,\n\t50332 - 44032: 0xBEAE,\n\t50333 - 44032: 0x9CF2,\n\t50334 - 44032: 0x9CF3,\n\t50335 - 44032: 0x9CF4,\n\t50336 - 44032: 0x9CF5,\n\t50337 - 44032: 0x9CF6,\n\t50338 - 44032: 0x9CF7,\n\t50339 - 44032: 0x9CF8,\n\t50340 - 44032: 0x9CF9,\n\t50341 - 44032: 0x9CFA,\n\t50342 - 44032: 0x9CFB,\n\t50343 - 44032: 0x9CFC,\n\t50344 - 44032: 0x9CFD,\n\t50345 - 44032: 0x9CFE,\n\t50346 - 44032: 0x9D41,\n\t50347 - 44032: 0x9D42,\n\t50348 - 44032: 0x9D43,\n\t50349 - 44032: 0x9D44,\n\t50350 - 44032: 0x9D45,\n\t50351 - 44032: 0x9D46,\n\t50352 - 44032: 0x9D47,\n\t50353 - 44032: 0x9D48,\n\t50354 - 44032: 0x9D49,\n\t50355 - 44032: 0x9D4A,\n\t50356 - 44032: 0x9D4B,\n\t50357 - 44032: 0x9D4C,\n\t50358 - 44032: 0x9D4D,\n\t50359 - 44032: 0x9D4E,\n\t50360 - 44032: 0xBEAF,\n\t50361 - 44032: 0x9D4F,\n\t50362 - 44032: 0x9D50,\n\t50363 - 44032: 0x9D51,\n\t50364 - 44032: 0xBEB0,\n\t50365 - 44032: 0x9D52,\n\t50366 - 44032: 0x9D53,\n\t50367 - 44032: 0x9D54,\n\t50368 - 44032: 0x9D55,\n\t50369 - 44032: 0x9D56,\n\t50370 - 44032: 0x9D57,\n\t50371 - 44032: 0x9D58,\n\t50372 - 44032: 0x9D59,\n\t50373 - 44032: 0x9D5A,\n\t50374 - 44032: 0x9D61,\n\t50375 - 44032: 0x9D62,\n\t50376 - 44032: 0x9D63,\n\t50377 - 44032: 0x9D64,\n\t50378 - 44032: 0x9D65,\n\t50379 - 44032: 0x9D66,\n\t50380 - 44032: 0x9D67,\n\t50381 - 44032: 0x9D68,\n\t50382 - 44032: 0x9D69,\n\t50383 - 44032: 0x9D6A,\n\t50384 - 44032: 0x9D6B,\n\t50385 - 44032: 0x9D6C,\n\t50386 - 44032: 0x9D6D,\n\t50387 - 44032: 0x9D6E,\n\t50388 - 44032: 0x9D6F,\n\t50389 - 44032: 0x9D70,\n\t50390 - 44032: 0x9D71,\n\t50391 - 44032: 0x9D72,\n\t50392 - 44032: 0x9D73,\n\t50393 - 44032: 0x9D74,\n\t50394 - 44032: 0x9D75,\n\t50395 - 44032: 0x9D76,\n\t50396 - 44032: 0x9D77,\n\t50397 - 44032: 0x9D78,\n\t50398 - 44032: 0x9D79,\n\t50399 - 44032: 0x9D7A,\n\t50400 - 44032: 0x9D81,\n\t50401 - 44032: 0x9D82,\n\t50402 - 44032: 0x9D83,\n\t50403 - 44032: 0x9D84,\n\t50404 - 44032: 0x9D85,\n\t50405 - 44032: 0x9D86,\n\t50406 - 44032: 0x9D87,\n\t50407 - 44032: 0x9D88,\n\t50408 - 44032: 0x9D89,\n\t50409 - 44032: 0xBEB1,\n\t50410 - 44032: 0x9D8A,\n\t50411 - 44032: 0x9D8B,\n\t50412 - 44032: 0x9D8C,\n\t50413 - 44032: 0x9D8D,\n\t50414 - 44032: 0x9D8E,\n\t50415 - 44032: 0x9D8F,\n\t50416 - 44032: 0xBEB2,\n\t50417 - 44032: 0xBEB3,\n\t50418 - 44032: 0x9D90,\n\t50419 - 44032: 0x9D91,\n\t50420 - 44032: 0xBEB4,\n\t50421 - 44032: 0x9D92,\n\t50422 - 44032: 0x9D93,\n\t50423 - 44032: 0x9D94,\n\t50424 - 44032: 0xBEB5,\n\t50425 - 44032: 0x9D95,\n\t50426 - 44032: 0xBEB6,\n\t50427 - 44032: 0x9D96,\n\t50428 - 44032: 0x9D97,\n\t50429 - 44032: 0x9D98,\n\t50430 - 44032: 0x9D99,\n\t50431 - 44032: 0xBEB7,\n\t50432 - 44032: 0xBEB8,\n\t50433 - 44032: 0xBEB9,\n\t50434 - 44032: 0x9D9A,\n\t50435 - 44032: 0x9D9B,\n\t50436 - 44032: 0x9D9C,\n\t50437 - 44032: 0x9D9D,\n\t50438 - 44032: 0x9D9E,\n\t50439 - 44032: 0x9D9F,\n\t50440 - 44032: 0x9DA0,\n\t50441 - 44032: 0x9DA1,\n\t50442 - 44032: 0x9DA2,\n\t50443 - 44032: 0x9DA3,\n\t50444 - 44032: 0xBEBA,\n\t50445 - 44032: 0x9DA4,\n\t50446 - 44032: 0x9DA5,\n\t50447 - 44032: 0x9DA6,\n\t50448 - 44032: 0xBEBB,\n\t50449 - 44032: 0x9DA7,\n\t50450 - 44032: 0x9DA8,\n\t50451 - 44032: 0x9DA9,\n\t50452 - 44032: 0xBEBC,\n\t50453 - 44032: 0x9DAA,\n\t50454 - 44032: 0x9DAB,\n\t50455 - 44032: 0x9DAC,\n\t50456 - 44032: 0x9DAD,\n\t50457 - 44032: 0x9DAE,\n\t50458 - 44032: 0x9DAF,\n\t50459 - 44032: 0x9DB0,\n\t50460 - 44032: 0xBEBD,\n\t50461 - 44032: 0x9DB1,\n\t50462 - 44032: 0x9DB2,\n\t50463 - 44032: 0x9DB3,\n\t50464 - 44032: 0x9DB4,\n\t50465 - 44032: 0x9DB5,\n\t50466 - 44032: 0x9DB6,\n\t50467 - 44032: 0x9DB7,\n\t50468 - 44032: 0x9DB8,\n\t50469 - 44032: 0x9DB9,\n\t50470 - 44032: 0x9DBA,\n\t50471 - 44032: 0x9DBB,\n\t50472 - 44032: 0xBEBE,\n\t50473 - 44032: 0xBEBF,\n\t50474 - 44032: 0x9DBC,\n\t50475 - 44032: 0x9DBD,\n\t50476 - 44032: 0xBEC0,\n\t50477 - 44032: 0x9DBE,\n\t50478 - 44032: 0x9DBF,\n\t50479 - 44032: 0x9DC0,\n\t50480 - 44032: 0xBEC1,\n\t50481 - 44032: 0x9DC1,\n\t50482 - 44032: 0x9DC2,\n\t50483 - 44032: 0x9DC3,\n\t50484 - 44032: 0x9DC4,\n\t50485 - 44032: 0x9DC5,\n\t50486 - 44032: 0x9DC6,\n\t50487 - 44032: 0x9DC7,\n\t50488 - 44032: 0xBEC2,\n\t50489 - 44032: 0xBEC3,\n\t50490 - 44032: 0x9DC8,\n\t50491 - 44032: 0xBEC4,\n\t50492 - 44032: 0x9DC9,\n\t50493 - 44032: 0xBEC5,\n\t50494 - 44032: 0x9DCA,\n\t50495 - 44032: 0x9DCB,\n\t50496 - 44032: 0x9DCC,\n\t50497 - 44032: 0x9DCD,\n\t50498 - 44032: 0x9DCE,\n\t50499 - 44032: 0x9DCF,\n\t50500 - 44032: 0xBEC6,\n\t50501 - 44032: 0xBEC7,\n\t50502 - 44032: 0x9DD0,\n\t50503 - 44032: 0x9DD1,\n\t50504 - 44032: 0xBEC8,\n\t50505 - 44032: 0xBEC9,\n\t50506 - 44032: 0xBECA,\n\t50507 - 44032: 0x9DD2,\n\t50508 - 44032: 0xBECB,\n\t50509 - 44032: 0xBECC,\n\t50510 - 44032: 0xBECD,\n\t50511 - 44032: 0x9DD3,\n\t50512 - 44032: 0x9DD4,\n\t50513 - 44032: 0x9DD5,\n\t50514 - 44032: 0x9DD6,\n\t50515 - 44032: 0xBECE,\n\t50516 - 44032: 0xBECF,\n\t50517 - 44032: 0xBED0,\n\t50518 - 44032: 0x9DD7,\n\t50519 - 44032: 0xBED1,\n\t50520 - 44032: 0xBED2,\n\t50521 - 44032: 0xBED3,\n\t50522 - 44032: 0x9DD8,\n\t50523 - 44032: 0x9DD9,\n\t50524 - 44032: 0x9DDA,\n\t50525 - 44032: 0xBED4,\n\t50526 - 44032: 0xBED5,\n\t50527 - 44032: 0x9DDB,\n\t50528 - 44032: 0xBED6,\n\t50529 - 44032: 0xBED7,\n\t50530 - 44032: 0x9DDC,\n\t50531 - 44032: 0x9DDD,\n\t50532 - 44032: 0xBED8,\n\t50533 - 44032: 0x9DDE,\n\t50534 - 44032: 0x9DDF,\n\t50535 - 44032: 0x9DE0,\n\t50536 - 44032: 0xBED9,\n\t50537 - 44032: 0x9DE1,\n\t50538 - 44032: 0x9DE2,\n\t50539 - 44032: 0x9DE3,\n\t50540 - 44032: 0x9DE4,\n\t50541 - 44032: 0x9DE5,\n\t50542 - 44032: 0x9DE6,\n\t50543 - 44032: 0x9DE7,\n\t50544 - 44032: 0xBEDA,\n\t50545 - 44032: 0xBEDB,\n\t50546 - 44032: 0x9DE8,\n\t50547 - 44032: 0xBEDC,\n\t50548 - 44032: 0xBEDD,\n\t50549 - 44032: 0xBEDE,\n\t50550 - 44032: 0x9DE9,\n\t50551 - 44032: 0x9DEA,\n\t50552 - 44032: 0x9DEB,\n\t50553 - 44032: 0x9DEC,\n\t50554 - 44032: 0x9DED,\n\t50555 - 44032: 0x9DEE,\n\t50556 - 44032: 0xBEDF,\n\t50557 - 44032: 0xBEE0,\n\t50558 - 44032: 0x9DEF,\n\t50559 - 44032: 0x9DF0,\n\t50560 - 44032: 0xBEE1,\n\t50561 - 44032: 0x9DF1,\n\t50562 - 44032: 0x9DF2,\n\t50563 - 44032: 0x9DF3,\n\t50564 - 44032: 0xBEE2,\n\t50565 - 44032: 0x9DF4,\n\t50566 - 44032: 0x9DF5,\n\t50567 - 44032: 0xBEE3,\n\t50568 - 44032: 0x9DF6,\n\t50569 - 44032: 0x9DF7,\n\t50570 - 44032: 0x9DF8,\n\t50571 - 44032: 0x9DF9,\n\t50572 - 44032: 0xBEE4,\n\t50573 - 44032: 0xBEE5,\n\t50574 - 44032: 0x9DFA,\n\t50575 - 44032: 0xBEE6,\n\t50576 - 44032: 0x9DFB,\n\t50577 - 44032: 0xBEE7,\n\t50578 - 44032: 0x9DFC,\n\t50579 - 44032: 0x9DFD,\n\t50580 - 44032: 0x9DFE,\n\t50581 - 44032: 0xBEE8,\n\t50582 - 44032: 0x9E41,\n\t50583 - 44032: 0xBEE9,\n\t50584 - 44032: 0xBEEA,\n\t50585 - 44032: 0x9E42,\n\t50586 - 44032: 0x9E43,\n\t50587 - 44032: 0x9E44,\n\t50588 - 44032: 0xBEEB,\n\t50589 - 44032: 0x9E45,\n\t50590 - 44032: 0x9E46,\n\t50591 - 44032: 0x9E47,\n\t50592 - 44032: 0xBEEC,\n\t50593 - 44032: 0x9E48,\n\t50594 - 44032: 0x9E49,\n\t50595 - 44032: 0x9E4A,\n\t50596 - 44032: 0x9E4B,\n\t50597 - 44032: 0x9E4C,\n\t50598 - 44032: 0x9E4D,\n\t50599 - 44032: 0x9E4E,\n\t50600 - 44032: 0x9E4F,\n\t50601 - 44032: 0xBEED,\n\t50602 - 44032: 0x9E50,\n\t50603 - 44032: 0x9E51,\n\t50604 - 44032: 0x9E52,\n\t50605 - 44032: 0x9E53,\n\t50606 - 44032: 0x9E54,\n\t50607 - 44032: 0x9E55,\n\t50608 - 44032: 0x9E56,\n\t50609 - 44032: 0x9E57,\n\t50610 - 44032: 0x9E58,\n\t50611 - 44032: 0x9E59,\n\t50612 - 44032: 0xBEEE,\n\t50613 - 44032: 0xBEEF,\n\t50614 - 44032: 0x9E5A,\n\t50615 - 44032: 0x9E61,\n\t50616 - 44032: 0xBEF0,\n\t50617 - 44032: 0xBEF1,\n\t50618 - 44032: 0x9E62,\n\t50619 - 44032: 0xBEF2,\n\t50620 - 44032: 0xBEF3,\n\t50621 - 44032: 0xBEF4,\n\t50622 - 44032: 0xBEF5,\n\t50623 - 44032: 0x9E63,\n\t50624 - 44032: 0x9E64,\n\t50625 - 44032: 0x9E65,\n\t50626 - 44032: 0x9E66,\n\t50627 - 44032: 0x9E67,\n\t50628 - 44032: 0xBEF6,\n\t50629 - 44032: 0xBEF7,\n\t50630 - 44032: 0xBEF8,\n\t50631 - 44032: 0xBEF9,\n\t50632 - 44032: 0xBEFA,\n\t50633 - 44032: 0xBEFB,\n\t50634 - 44032: 0xBEFC,\n\t50635 - 44032: 0x9E68,\n\t50636 - 44032: 0xBEFD,\n\t50637 - 44032: 0x9E69,\n\t50638 - 44032: 0xBEFE,\n\t50639 - 44032: 0x9E6A,\n\t50640 - 44032: 0xBFA1,\n\t50641 - 44032: 0xBFA2,\n\t50642 - 44032: 0x9E6B,\n\t50643 - 44032: 0x9E6C,\n\t50644 - 44032: 0xBFA3,\n\t50645 - 44032: 0x9E6D,\n\t50646 - 44032: 0x9E6E,\n\t50647 - 44032: 0x9E6F,\n\t50648 - 44032: 0xBFA4,\n\t50649 - 44032: 0x9E70,\n\t50650 - 44032: 0x9E71,\n\t50651 - 44032: 0x9E72,\n\t50652 - 44032: 0x9E73,\n\t50653 - 44032: 0x9E74,\n\t50654 - 44032: 0x9E75,\n\t50655 - 44032: 0x9E76,\n\t50656 - 44032: 0xBFA5,\n\t50657 - 44032: 0xBFA6,\n\t50658 - 44032: 0x9E77,\n\t50659 - 44032: 0xBFA7,\n\t50660 - 44032: 0x9E78,\n\t50661 - 44032: 0xBFA8,\n\t50662 - 44032: 0x9E79,\n\t50663 - 44032: 0x9E7A,\n\t50664 - 44032: 0x9E81,\n\t50665 - 44032: 0x9E82,\n\t50666 - 44032: 0x9E83,\n\t50667 - 44032: 0x9E84,\n\t50668 - 44032: 0xBFA9,\n\t50669 - 44032: 0xBFAA,\n\t50670 - 44032: 0xBFAB,\n\t50671 - 44032: 0x9E85,\n\t50672 - 44032: 0xBFAC,\n\t50673 - 44032: 0x9E86,\n\t50674 - 44032: 0x9E87,\n\t50675 - 44032: 0x9E88,\n\t50676 - 44032: 0xBFAD,\n\t50677 - 44032: 0x9E89,\n\t50678 - 44032: 0xBFAE,\n\t50679 - 44032: 0xBFAF,\n\t50680 - 44032: 0x9E8A,\n\t50681 - 44032: 0x9E8B,\n\t50682 - 44032: 0x9E8C,\n\t50683 - 44032: 0x9E8D,\n\t50684 - 44032: 0xBFB0,\n\t50685 - 44032: 0xBFB1,\n\t50686 - 44032: 0xBFB2,\n\t50687 - 44032: 0xBFB3,\n\t50688 - 44032: 0xBFB4,\n\t50689 - 44032: 0xBFB5,\n\t50690 - 44032: 0x9E8E,\n\t50691 - 44032: 0x9E8F,\n\t50692 - 44032: 0x9E90,\n\t50693 - 44032: 0xBFB6,\n\t50694 - 44032: 0xBFB7,\n\t50695 - 44032: 0xBFB8,\n\t50696 - 44032: 0xBFB9,\n\t50697 - 44032: 0x9E91,\n\t50698 - 44032: 0x9E92,\n\t50699 - 44032: 0x9E93,\n\t50700 - 44032: 0xBFBA,\n\t50701 - 44032: 0x9E94,\n\t50702 - 44032: 0x9E95,\n\t50703 - 44032: 0x9E96,\n\t50704 - 44032: 0xBFBB,\n\t50705 - 44032: 0x9E97,\n\t50706 - 44032: 0x9E98,\n\t50707 - 44032: 0x9E99,\n\t50708 - 44032: 0x9E9A,\n\t50709 - 44032: 0x9E9B,\n\t50710 - 44032: 0x9E9C,\n\t50711 - 44032: 0x9E9D,\n\t50712 - 44032: 0xBFBC,\n\t50713 - 44032: 0xBFBD,\n\t50714 - 44032: 0x9E9E,\n\t50715 - 44032: 0xBFBE,\n\t50716 - 44032: 0xBFBF,\n\t50717 - 44032: 0x9E9F,\n\t50718 - 44032: 0x9EA0,\n\t50719 - 44032: 0x9EA1,\n\t50720 - 44032: 0x9EA2,\n\t50721 - 44032: 0x9EA3,\n\t50722 - 44032: 0x9EA4,\n\t50723 - 44032: 0x9EA5,\n\t50724 - 44032: 0xBFC0,\n\t50725 - 44032: 0xBFC1,\n\t50726 - 44032: 0x9EA6,\n\t50727 - 44032: 0x9EA7,\n\t50728 - 44032: 0xBFC2,\n\t50729 - 44032: 0x9EA8,\n\t50730 - 44032: 0x9EA9,\n\t50731 - 44032: 0x9EAA,\n\t50732 - 44032: 0xBFC3,\n\t50733 - 44032: 0xBFC4,\n\t50734 - 44032: 0xBFC5,\n\t50735 - 44032: 0x9EAB,\n\t50736 - 44032: 0xBFC6,\n\t50737 - 44032: 0x9EAC,\n\t50738 - 44032: 0x9EAD,\n\t50739 - 44032: 0xBFC7,\n\t50740 - 44032: 0xBFC8,\n\t50741 - 44032: 0xBFC9,\n\t50742 - 44032: 0x9EAE,\n\t50743 - 44032: 0xBFCA,\n\t50744 - 44032: 0x9EAF,\n\t50745 - 44032: 0xBFCB,\n\t50746 - 44032: 0x9EB0,\n\t50747 - 44032: 0xBFCC,\n\t50748 - 44032: 0x9EB1,\n\t50749 - 44032: 0x9EB2,\n\t50750 - 44032: 0x9EB3,\n\t50751 - 44032: 0x9EB4,\n\t50752 - 44032: 0xBFCD,\n\t50753 - 44032: 0xBFCE,\n\t50754 - 44032: 0x9EB5,\n\t50755 - 44032: 0x9EB6,\n\t50756 - 44032: 0xBFCF,\n\t50757 - 44032: 0x9EB7,\n\t50758 - 44032: 0x9EB8,\n\t50759 - 44032: 0x9EB9,\n\t50760 - 44032: 0xBFD0,\n\t50761 - 44032: 0x9EBA,\n\t50762 - 44032: 0x9EBB,\n\t50763 - 44032: 0x9EBC,\n\t50764 - 44032: 0x9EBD,\n\t50765 - 44032: 0x9EBE,\n\t50766 - 44032: 0x9EBF,\n\t50767 - 44032: 0x9EC0,\n\t50768 - 44032: 0xBFD1,\n\t50769 - 44032: 0xBFD2,\n\t50770 - 44032: 0x9EC1,\n\t50771 - 44032: 0xBFD3,\n\t50772 - 44032: 0xBFD4,\n\t50773 - 44032: 0xBFD5,\n\t50774 - 44032: 0x9EC2,\n\t50775 - 44032: 0x9EC3,\n\t50776 - 44032: 0x9EC4,\n\t50777 - 44032: 0x9EC5,\n\t50778 - 44032: 0x9EC6,\n\t50779 - 44032: 0x9EC7,\n\t50780 - 44032: 0xBFD6,\n\t50781 - 44032: 0xBFD7,\n\t50782 - 44032: 0x9EC8,\n\t50783 - 44032: 0x9EC9,\n\t50784 - 44032: 0xBFD8,\n\t50785 - 44032: 0x9ECA,\n\t50786 - 44032: 0x9ECB,\n\t50787 - 44032: 0x9ECC,\n\t50788 - 44032: 0x9ECD,\n\t50789 - 44032: 0x9ECE,\n\t50790 - 44032: 0x9ECF,\n\t50791 - 44032: 0x9ED0,\n\t50792 - 44032: 0x9ED1,\n\t50793 - 44032: 0x9ED2,\n\t50794 - 44032: 0x9ED3,\n\t50795 - 44032: 0x9ED4,\n\t50796 - 44032: 0xBFD9,\n\t50797 - 44032: 0x9ED5,\n\t50798 - 44032: 0x9ED6,\n\t50799 - 44032: 0xBFDA,\n\t50800 - 44032: 0x9ED7,\n\t50801 - 44032: 0xBFDB,\n\t50802 - 44032: 0x9ED8,\n\t50803 - 44032: 0x9ED9,\n\t50804 - 44032: 0x9EDA,\n\t50805 - 44032: 0x9EDB,\n\t50806 - 44032: 0x9EDC,\n\t50807 - 44032: 0x9EDD,\n\t50808 - 44032: 0xBFDC,\n\t50809 - 44032: 0xBFDD,\n\t50810 - 44032: 0x9EDE,\n\t50811 - 44032: 0x9EDF,\n\t50812 - 44032: 0xBFDE,\n\t50813 - 44032: 0x9EE0,\n\t50814 - 44032: 0x9EE1,\n\t50815 - 44032: 0x9EE2,\n\t50816 - 44032: 0xBFDF,\n\t50817 - 44032: 0x9EE3,\n\t50818 - 44032: 0x9EE4,\n\t50819 - 44032: 0x9EE5,\n\t50820 - 44032: 0x9EE6,\n\t50821 - 44032: 0x9EE7,\n\t50822 - 44032: 0x9EE8,\n\t50823 - 44032: 0x9EE9,\n\t50824 - 44032: 0xBFE0,\n\t50825 - 44032: 0xBFE1,\n\t50826 - 44032: 0x9EEA,\n\t50827 - 44032: 0xBFE2,\n\t50828 - 44032: 0x9EEB,\n\t50829 - 44032: 0xBFE3,\n\t50830 - 44032: 0x9EEC,\n\t50831 - 44032: 0x9EED,\n\t50832 - 44032: 0x9EEE,\n\t50833 - 44032: 0x9EEF,\n\t50834 - 44032: 0x9EF0,\n\t50835 - 44032: 0x9EF1,\n\t50836 - 44032: 0xBFE4,\n\t50837 - 44032: 0xBFE5,\n\t50838 - 44032: 0x9EF2,\n\t50839 - 44032: 0x9EF3,\n\t50840 - 44032: 0xBFE6,\n\t50841 - 44032: 0x9EF4,\n\t50842 - 44032: 0x9EF5,\n\t50843 - 44032: 0x9EF6,\n\t50844 - 44032: 0xBFE7,\n\t50845 - 44032: 0x9EF7,\n\t50846 - 44032: 0x9EF8,\n\t50847 - 44032: 0x9EF9,\n\t50848 - 44032: 0x9EFA,\n\t50849 - 44032: 0x9EFB,\n\t50850 - 44032: 0x9EFC,\n\t50851 - 44032: 0x9EFD,\n\t50852 - 44032: 0xBFE8,\n\t50853 - 44032: 0xBFE9,\n\t50854 - 44032: 0x9EFE,\n\t50855 - 44032: 0xBFEA,\n\t50856 - 44032: 0x9F41,\n\t50857 - 44032: 0xBFEB,\n\t50858 - 44032: 0x9F42,\n\t50859 - 44032: 0x9F43,\n\t50860 - 44032: 0x9F44,\n\t50861 - 44032: 0x9F45,\n\t50862 - 44032: 0x9F46,\n\t50863 - 44032: 0x9F47,\n\t50864 - 44032: 0xBFEC,\n\t50865 - 44032: 0xBFED,\n\t50866 - 44032: 0x9F48,\n\t50867 - 44032: 0x9F49,\n\t50868 - 44032: 0xBFEE,\n\t50869 - 44032: 0x9F4A,\n\t50870 - 44032: 0x9F4B,\n\t50871 - 44032: 0x9F4C,\n\t50872 - 44032: 0xBFEF,\n\t50873 - 44032: 0xBFF0,\n\t50874 - 44032: 0xBFF1,\n\t50875 - 44032: 0x9F4D,\n\t50876 - 44032: 0x9F4E,\n\t50877 - 44032: 0x9F4F,\n\t50878 - 44032: 0x9F50,\n\t50879 - 44032: 0x9F51,\n\t50880 - 44032: 0xBFF2,\n\t50881 - 44032: 0xBFF3,\n\t50882 - 44032: 0x9F52,\n\t50883 - 44032: 0xBFF4,\n\t50884 - 44032: 0x9F53,\n\t50885 - 44032: 0xBFF5,\n\t50886 - 44032: 0x9F54,\n\t50887 - 44032: 0x9F55,\n\t50888 - 44032: 0x9F56,\n\t50889 - 44032: 0x9F57,\n\t50890 - 44032: 0x9F58,\n\t50891 - 44032: 0x9F59,\n\t50892 - 44032: 0xBFF6,\n\t50893 - 44032: 0xBFF7,\n\t50894 - 44032: 0x9F5A,\n\t50895 - 44032: 0x9F61,\n\t50896 - 44032: 0xBFF8,\n\t50897 - 44032: 0x9F62,\n\t50898 - 44032: 0x9F63,\n\t50899 - 44032: 0x9F64,\n\t50900 - 44032: 0xBFF9,\n\t50901 - 44032: 0x9F65,\n\t50902 - 44032: 0x9F66,\n\t50903 - 44032: 0x9F67,\n\t50904 - 44032: 0x9F68,\n\t50905 - 44032: 0x9F69,\n\t50906 - 44032: 0x9F6A,\n\t50907 - 44032: 0x9F6B,\n\t50908 - 44032: 0xBFFA,\n\t50909 - 44032: 0xBFFB,\n\t50910 - 44032: 0x9F6C,\n\t50911 - 44032: 0x9F6D,\n\t50912 - 44032: 0xBFFC,\n\t50913 - 44032: 0xBFFD,\n\t50914 - 44032: 0x9F6E,\n\t50915 - 44032: 0x9F6F,\n\t50916 - 44032: 0x9F70,\n\t50917 - 44032: 0x9F71,\n\t50918 - 44032: 0x9F72,\n\t50919 - 44032: 0x9F73,\n\t50920 - 44032: 0xBFFE,\n\t50921 - 44032: 0xC0A1,\n\t50922 - 44032: 0x9F74,\n\t50923 - 44032: 0x9F75,\n\t50924 - 44032: 0xC0A2,\n\t50925 - 44032: 0x9F76,\n\t50926 - 44032: 0x9F77,\n\t50927 - 44032: 0x9F78,\n\t50928 - 44032: 0xC0A3,\n\t50929 - 44032: 0x9F79,\n\t50930 - 44032: 0x9F7A,\n\t50931 - 44032: 0x9F81,\n\t50932 - 44032: 0x9F82,\n\t50933 - 44032: 0x9F83,\n\t50934 - 44032: 0x9F84,\n\t50935 - 44032: 0x9F85,\n\t50936 - 44032: 0xC0A4,\n\t50937 - 44032: 0xC0A5,\n\t50938 - 44032: 0x9F86,\n\t50939 - 44032: 0x9F87,\n\t50940 - 44032: 0x9F88,\n\t50941 - 44032: 0xC0A6,\n\t50942 - 44032: 0x9F89,\n\t50943 - 44032: 0x9F8A,\n\t50944 - 44032: 0x9F8B,\n\t50945 - 44032: 0x9F8C,\n\t50946 - 44032: 0x9F8D,\n\t50947 - 44032: 0x9F8E,\n\t50948 - 44032: 0xC0A7,\n\t50949 - 44032: 0xC0A8,\n\t50950 - 44032: 0x9F8F,\n\t50951 - 44032: 0x9F90,\n\t50952 - 44032: 0xC0A9,\n\t50953 - 44032: 0x9F91,\n\t50954 - 44032: 0x9F92,\n\t50955 - 44032: 0x9F93,\n\t50956 - 44032: 0xC0AA,\n\t50957 - 44032: 0x9F94,\n\t50958 - 44032: 0x9F95,\n\t50959 - 44032: 0x9F96,\n\t50960 - 44032: 0x9F97,\n\t50961 - 44032: 0x9F98,\n\t50962 - 44032: 0x9F99,\n\t50963 - 44032: 0x9F9A,\n\t50964 - 44032: 0xC0AB,\n\t50965 - 44032: 0xC0AC,\n\t50966 - 44032: 0x9F9B,\n\t50967 - 44032: 0xC0AD,\n\t50968 - 44032: 0x9F9C,\n\t50969 - 44032: 0xC0AE,\n\t50970 - 44032: 0x9F9D,\n\t50971 - 44032: 0x9F9E,\n\t50972 - 44032: 0x9F9F,\n\t50973 - 44032: 0x9FA0,\n\t50974 - 44032: 0x9FA1,\n\t50975 - 44032: 0x9FA2,\n\t50976 - 44032: 0xC0AF,\n\t50977 - 44032: 0xC0B0,\n\t50978 - 44032: 0x9FA3,\n\t50979 - 44032: 0x9FA4,\n\t50980 - 44032: 0xC0B1,\n\t50981 - 44032: 0x9FA5,\n\t50982 - 44032: 0x9FA6,\n\t50983 - 44032: 0x9FA7,\n\t50984 - 44032: 0xC0B2,\n\t50985 - 44032: 0x9FA8,\n\t50986 - 44032: 0x9FA9,\n\t50987 - 44032: 0x9FAA,\n\t50988 - 44032: 0x9FAB,\n\t50989 - 44032: 0x9FAC,\n\t50990 - 44032: 0x9FAD,\n\t50991 - 44032: 0x9FAE,\n\t50992 - 44032: 0xC0B3,\n\t50993 - 44032: 0xC0B4,\n\t50994 - 44032: 0x9FAF,\n\t50995 - 44032: 0xC0B5,\n\t50996 - 44032: 0x9FB0,\n\t50997 - 44032: 0xC0B6,\n\t50998 - 44032: 0x9FB1,\n\t50999 - 44032: 0xC0B7,\n\t51000 - 44032: 0x9FB2,\n\t51001 - 44032: 0x9FB3,\n\t51002 - 44032: 0x9FB4,\n\t51003 - 44032: 0x9FB5,\n\t51004 - 44032: 0xC0B8,\n\t51005 - 44032: 0xC0B9,\n\t51006 - 44032: 0x9FB6,\n\t51007 - 44032: 0x9FB7,\n\t51008 - 44032: 0xC0BA,\n\t51009 - 44032: 0x9FB8,\n\t51010 - 44032: 0x9FB9,\n\t51011 - 44032: 0x9FBA,\n\t51012 - 44032: 0xC0BB,\n\t51013 - 44032: 0x9FBB,\n\t51014 - 44032: 0x9FBC,\n\t51015 - 44032: 0x9FBD,\n\t51016 - 44032: 0x9FBE,\n\t51017 - 44032: 0x9FBF,\n\t51018 - 44032: 0xC0BC,\n\t51019 - 44032: 0x9FC0,\n\t51020 - 44032: 0xC0BD,\n\t51021 - 44032: 0xC0BE,\n\t51022 - 44032: 0x9FC1,\n\t51023 - 44032: 0xC0BF,\n\t51024 - 44032: 0x9FC2,\n\t51025 - 44032: 0xC0C0,\n\t51026 - 44032: 0xC0C1,\n\t51027 - 44032: 0xC0C2,\n\t51028 - 44032: 0xC0C3,\n\t51029 - 44032: 0xC0C4,\n\t51030 - 44032: 0xC0C5,\n\t51031 - 44032: 0xC0C6,\n\t51032 - 44032: 0xC0C7,\n\t51033 - 44032: 0x9FC3,\n\t51034 - 44032: 0x9FC4,\n\t51035 - 44032: 0x9FC5,\n\t51036 - 44032: 0xC0C8,\n\t51037 - 44032: 0x9FC6,\n\t51038 - 44032: 0x9FC7,\n\t51039 - 44032: 0x9FC8,\n\t51040 - 44032: 0xC0C9,\n\t51041 - 44032: 0x9FC9,\n\t51042 - 44032: 0x9FCA,\n\t51043 - 44032: 0x9FCB,\n\t51044 - 44032: 0x9FCC,\n\t51045 - 44032: 0x9FCD,\n\t51046 - 44032: 0x9FCE,\n\t51047 - 44032: 0x9FCF,\n\t51048 - 44032: 0xC0CA,\n\t51049 - 44032: 0x9FD0,\n\t51050 - 44032: 0x9FD1,\n\t51051 - 44032: 0xC0CB,\n\t51052 - 44032: 0x9FD2,\n\t51053 - 44032: 0x9FD3,\n\t51054 - 44032: 0x9FD4,\n\t51055 - 44032: 0x9FD5,\n\t51056 - 44032: 0x9FD6,\n\t51057 - 44032: 0x9FD7,\n\t51058 - 44032: 0x9FD8,\n\t51059 - 44032: 0x9FD9,\n\t51060 - 44032: 0xC0CC,\n\t51061 - 44032: 0xC0CD,\n\t51062 - 44032: 0x9FDA,\n\t51063 - 44032: 0x9FDB,\n\t51064 - 44032: 0xC0CE,\n\t51065 - 44032: 0x9FDC,\n\t51066 - 44032: 0x9FDD,\n\t51067 - 44032: 0x9FDE,\n\t51068 - 44032: 0xC0CF,\n\t51069 - 44032: 0xC0D0,\n\t51070 - 44032: 0xC0D1,\n\t51071 - 44032: 0x9FDF,\n\t51072 - 44032: 0x9FE0,\n\t51073 - 44032: 0x9FE1,\n\t51074 - 44032: 0x9FE2,\n\t51075 - 44032: 0xC0D2,\n\t51076 - 44032: 0xC0D3,\n\t51077 - 44032: 0xC0D4,\n\t51078 - 44032: 0x9FE3,\n\t51079 - 44032: 0xC0D5,\n\t51080 - 44032: 0xC0D6,\n\t51081 - 44032: 0xC0D7,\n\t51082 - 44032: 0xC0D8,\n\t51083 - 44032: 0x9FE4,\n\t51084 - 44032: 0x9FE5,\n\t51085 - 44032: 0x9FE6,\n\t51086 - 44032: 0xC0D9,\n\t51087 - 44032: 0x9FE7,\n\t51088 - 44032: 0xC0DA,\n\t51089 - 44032: 0xC0DB,\n\t51090 - 44032: 0x9FE8,\n\t51091 - 44032: 0x9FE9,\n\t51092 - 44032: 0xC0DC,\n\t51093 - 44032: 0x9FEA,\n\t51094 - 44032: 0xC0DD,\n\t51095 - 44032: 0xC0DE,\n\t51096 - 44032: 0xC0DF,\n\t51097 - 44032: 0x9FEB,\n\t51098 - 44032: 0xC0E0,\n\t51099 - 44032: 0x9FEC,\n\t51100 - 44032: 0x9FED,\n\t51101 - 44032: 0x9FEE,\n\t51102 - 44032: 0x9FEF,\n\t51103 - 44032: 0x9FF0,\n\t51104 - 44032: 0xC0E1,\n\t51105 - 44032: 0xC0E2,\n\t51106 - 44032: 0x9FF1,\n\t51107 - 44032: 0xC0E3,\n\t51108 - 44032: 0xC0E4,\n\t51109 - 44032: 0xC0E5,\n\t51110 - 44032: 0xC0E6,\n\t51111 - 44032: 0x9FF2,\n\t51112 - 44032: 0x9FF3,\n\t51113 - 44032: 0x9FF4,\n\t51114 - 44032: 0x9FF5,\n\t51115 - 44032: 0x9FF6,\n\t51116 - 44032: 0xC0E7,\n\t51117 - 44032: 0xC0E8,\n\t51118 - 44032: 0x9FF7,\n\t51119 - 44032: 0x9FF8,\n\t51120 - 44032: 0xC0E9,\n\t51121 - 44032: 0x9FF9,\n\t51122 - 44032: 0x9FFA,\n\t51123 - 44032: 0x9FFB,\n\t51124 - 44032: 0xC0EA,\n\t51125 - 44032: 0x9FFC,\n\t51126 - 44032: 0x9FFD,\n\t51127 - 44032: 0x9FFE,\n\t51128 - 44032: 0xA041,\n\t51129 - 44032: 0xA042,\n\t51130 - 44032: 0xA043,\n\t51131 - 44032: 0xA044,\n\t51132 - 44032: 0xC0EB,\n\t51133 - 44032: 0xC0EC,\n\t51134 - 44032: 0xA045,\n\t51135 - 44032: 0xC0ED,\n\t51136 - 44032: 0xC0EE,\n\t51137 - 44032: 0xC0EF,\n\t51138 - 44032: 0xA046,\n\t51139 - 44032: 0xA047,\n\t51140 - 44032: 0xA048,\n\t51141 - 44032: 0xA049,\n\t51142 - 44032: 0xA04A,\n\t51143 - 44032: 0xA04B,\n\t51144 - 44032: 0xC0F0,\n\t51145 - 44032: 0xC0F1,\n\t51146 - 44032: 0xA04C,\n\t51147 - 44032: 0xA04D,\n\t51148 - 44032: 0xC0F2,\n\t51149 - 44032: 0xA04E,\n\t51150 - 44032: 0xC0F3,\n\t51151 - 44032: 0xA04F,\n\t51152 - 44032: 0xC0F4,\n\t51153 - 44032: 0xA050,\n\t51154 - 44032: 0xA051,\n\t51155 - 44032: 0xA052,\n\t51156 - 44032: 0xA053,\n\t51157 - 44032: 0xA054,\n\t51158 - 44032: 0xA055,\n\t51159 - 44032: 0xA056,\n\t51160 - 44032: 0xC0F5,\n\t51161 - 44032: 0xA057,\n\t51162 - 44032: 0xA058,\n\t51163 - 44032: 0xA059,\n\t51164 - 44032: 0xA05A,\n\t51165 - 44032: 0xC0F6,\n\t51166 - 44032: 0xA061,\n\t51167 - 44032: 0xA062,\n\t51168 - 44032: 0xA063,\n\t51169 - 44032: 0xA064,\n\t51170 - 44032: 0xA065,\n\t51171 - 44032: 0xA066,\n\t51172 - 44032: 0xC0F7,\n\t51173 - 44032: 0xA067,\n\t51174 - 44032: 0xA068,\n\t51175 - 44032: 0xA069,\n\t51176 - 44032: 0xC0F8,\n\t51177 - 44032: 0xA06A,\n\t51178 - 44032: 0xA06B,\n\t51179 - 44032: 0xA06C,\n\t51180 - 44032: 0xC0F9,\n\t51181 - 44032: 0xA06D,\n\t51182 - 44032: 0xA06E,\n\t51183 - 44032: 0xA06F,\n\t51184 - 44032: 0xA070,\n\t51185 - 44032: 0xA071,\n\t51186 - 44032: 0xA072,\n\t51187 - 44032: 0xA073,\n\t51188 - 44032: 0xA074,\n\t51189 - 44032: 0xA075,\n\t51190 - 44032: 0xA076,\n\t51191 - 44032: 0xA077,\n\t51192 - 44032: 0xA078,\n\t51193 - 44032: 0xA079,\n\t51194 - 44032: 0xA07A,\n\t51195 - 44032: 0xA081,\n\t51196 - 44032: 0xA082,\n\t51197 - 44032: 0xA083,\n\t51198 - 44032: 0xA084,\n\t51199 - 44032: 0xA085,\n\t51200 - 44032: 0xC0FA,\n\t51201 - 44032: 0xC0FB,\n\t51202 - 44032: 0xA086,\n\t51203 - 44032: 0xA087,\n\t51204 - 44032: 0xC0FC,\n\t51205 - 44032: 0xA088,\n\t51206 - 44032: 0xA089,\n\t51207 - 44032: 0xA08A,\n\t51208 - 44032: 0xC0FD,\n\t51209 - 44032: 0xA08B,\n\t51210 - 44032: 0xC0FE,\n\t51211 - 44032: 0xA08C,\n\t51212 - 44032: 0xA08D,\n\t51213 - 44032: 0xA08E,\n\t51214 - 44032: 0xA08F,\n\t51215 - 44032: 0xA090,\n\t51216 - 44032: 0xC1A1,\n\t51217 - 44032: 0xC1A2,\n\t51218 - 44032: 0xA091,\n\t51219 - 44032: 0xC1A3,\n\t51220 - 44032: 0xA092,\n\t51221 - 44032: 0xC1A4,\n\t51222 - 44032: 0xC1A5,\n\t51223 - 44032: 0xA093,\n\t51224 - 44032: 0xA094,\n\t51225 - 44032: 0xA095,\n\t51226 - 44032: 0xA096,\n\t51227 - 44032: 0xA097,\n\t51228 - 44032: 0xC1A6,\n\t51229 - 44032: 0xC1A7,\n\t51230 - 44032: 0xA098,\n\t51231 - 44032: 0xA099,\n\t51232 - 44032: 0xC1A8,\n\t51233 - 44032: 0xA09A,\n\t51234 - 44032: 0xA09B,\n\t51235 - 44032: 0xA09C,\n\t51236 - 44032: 0xC1A9,\n\t51237 - 44032: 0xA09D,\n\t51238 - 44032: 0xA09E,\n\t51239 - 44032: 0xA09F,\n\t51240 - 44032: 0xA0A0,\n\t51241 - 44032: 0xA0A1,\n\t51242 - 44032: 0xA0A2,\n\t51243 - 44032: 0xA0A3,\n\t51244 - 44032: 0xC1AA,\n\t51245 - 44032: 0xC1AB,\n\t51246 - 44032: 0xA0A4,\n\t51247 - 44032: 0xC1AC,\n\t51248 - 44032: 0xA0A5,\n\t51249 - 44032: 0xC1AD,\n\t51250 - 44032: 0xA0A6,\n\t51251 - 44032: 0xA0A7,\n\t51252 - 44032: 0xA0A8,\n\t51253 - 44032: 0xA0A9,\n\t51254 - 44032: 0xA0AA,\n\t51255 - 44032: 0xA0AB,\n\t51256 - 44032: 0xC1AE,\n\t51257 - 44032: 0xA0AC,\n\t51258 - 44032: 0xA0AD,\n\t51259 - 44032: 0xA0AE,\n\t51260 - 44032: 0xC1AF,\n\t51261 - 44032: 0xA0AF,\n\t51262 - 44032: 0xA0B0,\n\t51263 - 44032: 0xA0B1,\n\t51264 - 44032: 0xC1B0,\n\t51265 - 44032: 0xA0B2,\n\t51266 - 44032: 0xA0B3,\n\t51267 - 44032: 0xA0B4,\n\t51268 - 44032: 0xA0B5,\n\t51269 - 44032: 0xA0B6,\n\t51270 - 44032: 0xA0B7,\n\t51271 - 44032: 0xA0B8,\n\t51272 - 44032: 0xC1B1,\n\t51273 - 44032: 0xC1B2,\n\t51274 - 44032: 0xA0B9,\n\t51275 - 44032: 0xA0BA,\n\t51276 - 44032: 0xC1B3,\n\t51277 - 44032: 0xC1B4,\n\t51278 - 44032: 0xA0BB,\n\t51279 - 44032: 0xA0BC,\n\t51280 - 44032: 0xA0BD,\n\t51281 - 44032: 0xA0BE,\n\t51282 - 44032: 0xA0BF,\n\t51283 - 44032: 0xA0C0,\n\t51284 - 44032: 0xC1B5,\n\t51285 - 44032: 0xA0C1,\n\t51286 - 44032: 0xA0C2,\n\t51287 - 44032: 0xA0C3,\n\t51288 - 44032: 0xA0C4,\n\t51289 - 44032: 0xA0C5,\n\t51290 - 44032: 0xA0C6,\n\t51291 - 44032: 0xA0C7,\n\t51292 - 44032: 0xA0C8,\n\t51293 - 44032: 0xA0C9,\n\t51294 - 44032: 0xA0CA,\n\t51295 - 44032: 0xA0CB,\n\t51296 - 44032: 0xA0CC,\n\t51297 - 44032: 0xA0CD,\n\t51298 - 44032: 0xA0CE,\n\t51299 - 44032: 0xA0CF,\n\t51300 - 44032: 0xA0D0,\n\t51301 - 44032: 0xA0D1,\n\t51302 - 44032: 0xA0D2,\n\t51303 - 44032: 0xA0D3,\n\t51304 - 44032: 0xA0D4,\n\t51305 - 44032: 0xA0D5,\n\t51306 - 44032: 0xA0D6,\n\t51307 - 44032: 0xA0D7,\n\t51308 - 44032: 0xA0D8,\n\t51309 - 44032: 0xA0D9,\n\t51310 - 44032: 0xA0DA,\n\t51311 - 44032: 0xA0DB,\n\t51312 - 44032: 0xC1B6,\n\t51313 - 44032: 0xC1B7,\n\t51314 - 44032: 0xA0DC,\n\t51315 - 44032: 0xA0DD,\n\t51316 - 44032: 0xC1B8,\n\t51317 - 44032: 0xA0DE,\n\t51318 - 44032: 0xA0DF,\n\t51319 - 44032: 0xA0E0,\n\t51320 - 44032: 0xC1B9,\n\t51321 - 44032: 0xA0E1,\n\t51322 - 44032: 0xC1BA,\n\t51323 - 44032: 0xA0E2,\n\t51324 - 44032: 0xA0E3,\n\t51325 - 44032: 0xA0E4,\n\t51326 - 44032: 0xA0E5,\n\t51327 - 44032: 0xA0E6,\n\t51328 - 44032: 0xC1BB,\n\t51329 - 44032: 0xC1BC,\n\t51330 - 44032: 0xA0E7,\n\t51331 - 44032: 0xC1BD,\n\t51332 - 44032: 0xA0E8,\n\t51333 - 44032: 0xC1BE,\n\t51334 - 44032: 0xC1BF,\n\t51335 - 44032: 0xC1C0,\n\t51336 - 44032: 0xA0E9,\n\t51337 - 44032: 0xA0EA,\n\t51338 - 44032: 0xA0EB,\n\t51339 - 44032: 0xC1C1,\n\t51340 - 44032: 0xC1C2,\n\t51341 - 44032: 0xC1C3,\n\t51342 - 44032: 0xA0EC,\n\t51343 - 44032: 0xA0ED,\n\t51344 - 44032: 0xA0EE,\n\t51345 - 44032: 0xA0EF,\n\t51346 - 44032: 0xA0F0,\n\t51347 - 44032: 0xA0F1,\n\t51348 - 44032: 0xC1C4,\n\t51349 - 44032: 0xA0F2,\n\t51350 - 44032: 0xA0F3,\n\t51351 - 44032: 0xA0F4,\n\t51352 - 44032: 0xA0F5,\n\t51353 - 44032: 0xA0F6,\n\t51354 - 44032: 0xA0F7,\n\t51355 - 44032: 0xA0F8,\n\t51356 - 44032: 0xA0F9,\n\t51357 - 44032: 0xC1C5,\n\t51358 - 44032: 0xA0FA,\n\t51359 - 44032: 0xC1C6,\n\t51360 - 44032: 0xA0FB,\n\t51361 - 44032: 0xC1C7,\n\t51362 - 44032: 0xA0FC,\n\t51363 - 44032: 0xA0FD,\n\t51364 - 44032: 0xA0FE,\n\t51365 - 44032: 0xA141,\n\t51366 - 44032: 0xA142,\n\t51367 - 44032: 0xA143,\n\t51368 - 44032: 0xC1C8,\n\t51369 - 44032: 0xA144,\n\t51370 - 44032: 0xA145,\n\t51371 - 44032: 0xA146,\n\t51372 - 44032: 0xA147,\n\t51373 - 44032: 0xA148,\n\t51374 - 44032: 0xA149,\n\t51375 - 44032: 0xA14A,\n\t51376 - 44032: 0xA14B,\n\t51377 - 44032: 0xA14C,\n\t51378 - 44032: 0xA14D,\n\t51379 - 44032: 0xA14E,\n\t51380 - 44032: 0xA14F,\n\t51381 - 44032: 0xA150,\n\t51382 - 44032: 0xA151,\n\t51383 - 44032: 0xA152,\n\t51384 - 44032: 0xA153,\n\t51385 - 44032: 0xA154,\n\t51386 - 44032: 0xA155,\n\t51387 - 44032: 0xA156,\n\t51388 - 44032: 0xC1C9,\n\t51389 - 44032: 0xC1CA,\n\t51390 - 44032: 0xA157,\n\t51391 - 44032: 0xA158,\n\t51392 - 44032: 0xA159,\n\t51393 - 44032: 0xA15A,\n\t51394 - 44032: 0xA161,\n\t51395 - 44032: 0xA162,\n\t51396 - 44032: 0xC1CB,\n\t51397 - 44032: 0xA163,\n\t51398 - 44032: 0xA164,\n\t51399 - 44032: 0xA165,\n\t51400 - 44032: 0xC1CC,\n\t51401 - 44032: 0xA166,\n\t51402 - 44032: 0xA167,\n\t51403 - 44032: 0xA168,\n\t51404 - 44032: 0xC1CD,\n\t51405 - 44032: 0xA169,\n\t51406 - 44032: 0xA16A,\n\t51407 - 44032: 0xA16B,\n\t51408 - 44032: 0xA16C,\n\t51409 - 44032: 0xA16D,\n\t51410 - 44032: 0xA16E,\n\t51411 - 44032: 0xA16F,\n\t51412 - 44032: 0xC1CE,\n\t51413 - 44032: 0xC1CF,\n\t51414 - 44032: 0xA170,\n\t51415 - 44032: 0xC1D0,\n\t51416 - 44032: 0xA171,\n\t51417 - 44032: 0xC1D1,\n\t51418 - 44032: 0xA172,\n\t51419 - 44032: 0xA173,\n\t51420 - 44032: 0xA174,\n\t51421 - 44032: 0xA175,\n\t51422 - 44032: 0xA176,\n\t51423 - 44032: 0xA177,\n\t51424 - 44032: 0xC1D2,\n\t51425 - 44032: 0xC1D3,\n\t51426 - 44032: 0xA178,\n\t51427 - 44032: 0xA179,\n\t51428 - 44032: 0xC1D4,\n\t51429 - 44032: 0xA17A,\n\t51430 - 44032: 0xA181,\n\t51431 - 44032: 0xA182,\n\t51432 - 44032: 0xA183,\n\t51433 - 44032: 0xA184,\n\t51434 - 44032: 0xA185,\n\t51435 - 44032: 0xA186,\n\t51436 - 44032: 0xA187,\n\t51437 - 44032: 0xA188,\n\t51438 - 44032: 0xA189,\n\t51439 - 44032: 0xA18A,\n\t51440 - 44032: 0xA18B,\n\t51441 - 44032: 0xA18C,\n\t51442 - 44032: 0xA18D,\n\t51443 - 44032: 0xA18E,\n\t51444 - 44032: 0xA18F,\n\t51445 - 44032: 0xC1D5,\n\t51446 - 44032: 0xA190,\n\t51447 - 44032: 0xA191,\n\t51448 - 44032: 0xA192,\n\t51449 - 44032: 0xA193,\n\t51450 - 44032: 0xA194,\n\t51451 - 44032: 0xA195,\n\t51452 - 44032: 0xC1D6,\n\t51453 - 44032: 0xC1D7,\n\t51454 - 44032: 0xA196,\n\t51455 - 44032: 0xA197,\n\t51456 - 44032: 0xC1D8,\n\t51457 - 44032: 0xA198,\n\t51458 - 44032: 0xA199,\n\t51459 - 44032: 0xA19A,\n\t51460 - 44032: 0xC1D9,\n\t51461 - 44032: 0xC1DA,\n\t51462 - 44032: 0xC1DB,\n\t51463 - 44032: 0xA19B,\n\t51464 - 44032: 0xA19C,\n\t51465 - 44032: 0xA19D,\n\t51466 - 44032: 0xA19E,\n\t51467 - 44032: 0xA19F,\n\t51468 - 44032: 0xC1DC,\n\t51469 - 44032: 0xC1DD,\n\t51470 - 44032: 0xA1A0,\n\t51471 - 44032: 0xC1DE,\n\t51472 - 44032: 0xA241,\n\t51473 - 44032: 0xC1DF,\n\t51474 - 44032: 0xA242,\n\t51475 - 44032: 0xA243,\n\t51476 - 44032: 0xA244,\n\t51477 - 44032: 0xA245,\n\t51478 - 44032: 0xA246,\n\t51479 - 44032: 0xA247,\n\t51480 - 44032: 0xC1E0,\n\t51481 - 44032: 0xA248,\n\t51482 - 44032: 0xA249,\n\t51483 - 44032: 0xA24A,\n\t51484 - 44032: 0xA24B,\n\t51485 - 44032: 0xA24C,\n\t51486 - 44032: 0xA24D,\n\t51487 - 44032: 0xA24E,\n\t51488 - 44032: 0xA24F,\n\t51489 - 44032: 0xA250,\n\t51490 - 44032: 0xA251,\n\t51491 - 44032: 0xA252,\n\t51492 - 44032: 0xA253,\n\t51493 - 44032: 0xA254,\n\t51494 - 44032: 0xA255,\n\t51495 - 44032: 0xA256,\n\t51496 - 44032: 0xA257,\n\t51497 - 44032: 0xA258,\n\t51498 - 44032: 0xA259,\n\t51499 - 44032: 0xA25A,\n\t51500 - 44032: 0xC1E1,\n\t51501 - 44032: 0xA261,\n\t51502 - 44032: 0xA262,\n\t51503 - 44032: 0xA263,\n\t51504 - 44032: 0xA264,\n\t51505 - 44032: 0xA265,\n\t51506 - 44032: 0xA266,\n\t51507 - 44032: 0xA267,\n\t51508 - 44032: 0xC1E2,\n\t51509 - 44032: 0xA268,\n\t51510 - 44032: 0xA269,\n\t51511 - 44032: 0xA26A,\n\t51512 - 44032: 0xA26B,\n\t51513 - 44032: 0xA26C,\n\t51514 - 44032: 0xA26D,\n\t51515 - 44032: 0xA26E,\n\t51516 - 44032: 0xA26F,\n\t51517 - 44032: 0xA270,\n\t51518 - 44032: 0xA271,\n\t51519 - 44032: 0xA272,\n\t51520 - 44032: 0xA273,\n\t51521 - 44032: 0xA274,\n\t51522 - 44032: 0xA275,\n\t51523 - 44032: 0xA276,\n\t51524 - 44032: 0xA277,\n\t51525 - 44032: 0xA278,\n\t51526 - 44032: 0xA279,\n\t51527 - 44032: 0xA27A,\n\t51528 - 44032: 0xA281,\n\t51529 - 44032: 0xA282,\n\t51530 - 44032: 0xA283,\n\t51531 - 44032: 0xA284,\n\t51532 - 44032: 0xA285,\n\t51533 - 44032: 0xA286,\n\t51534 - 44032: 0xA287,\n\t51535 - 44032: 0xA288,\n\t51536 - 44032: 0xC1E3,\n\t51537 - 44032: 0xC1E4,\n\t51538 - 44032: 0xA289,\n\t51539 - 44032: 0xA28A,\n\t51540 - 44032: 0xC1E5,\n\t51541 - 44032: 0xA28B,\n\t51542 - 44032: 0xA28C,\n\t51543 - 44032: 0xA28D,\n\t51544 - 44032: 0xC1E6,\n\t51545 - 44032: 0xA28E,\n\t51546 - 44032: 0xA28F,\n\t51547 - 44032: 0xA290,\n\t51548 - 44032: 0xA291,\n\t51549 - 44032: 0xA292,\n\t51550 - 44032: 0xA293,\n\t51551 - 44032: 0xA294,\n\t51552 - 44032: 0xC1E7,\n\t51553 - 44032: 0xC1E8,\n\t51554 - 44032: 0xA295,\n\t51555 - 44032: 0xC1E9,\n\t51556 - 44032: 0xA296,\n\t51557 - 44032: 0xA297,\n\t51558 - 44032: 0xA298,\n\t51559 - 44032: 0xA299,\n\t51560 - 44032: 0xA29A,\n\t51561 - 44032: 0xA29B,\n\t51562 - 44032: 0xA29C,\n\t51563 - 44032: 0xA29D,\n\t51564 - 44032: 0xC1EA,\n\t51565 - 44032: 0xA29E,\n\t51566 - 44032: 0xA29F,\n\t51567 - 44032: 0xA2A0,\n\t51568 - 44032: 0xC1EB,\n\t51569 - 44032: 0xA341,\n\t51570 - 44032: 0xA342,\n\t51571 - 44032: 0xA343,\n\t51572 - 44032: 0xC1EC,\n\t51573 - 44032: 0xA344,\n\t51574 - 44032: 0xA345,\n\t51575 - 44032: 0xA346,\n\t51576 - 44032: 0xA347,\n\t51577 - 44032: 0xA348,\n\t51578 - 44032: 0xA349,\n\t51579 - 44032: 0xA34A,\n\t51580 - 44032: 0xC1ED,\n\t51581 - 44032: 0xA34B,\n\t51582 - 44032: 0xA34C,\n\t51583 - 44032: 0xA34D,\n\t51584 - 44032: 0xA34E,\n\t51585 - 44032: 0xA34F,\n\t51586 - 44032: 0xA350,\n\t51587 - 44032: 0xA351,\n\t51588 - 44032: 0xA352,\n\t51589 - 44032: 0xA353,\n\t51590 - 44032: 0xA354,\n\t51591 - 44032: 0xA355,\n\t51592 - 44032: 0xC1EE,\n\t51593 - 44032: 0xC1EF,\n\t51594 - 44032: 0xA356,\n\t51595 - 44032: 0xA357,\n\t51596 - 44032: 0xC1F0,\n\t51597 - 44032: 0xA358,\n\t51598 - 44032: 0xA359,\n\t51599 - 44032: 0xA35A,\n\t51600 - 44032: 0xC1F1,\n\t51601 - 44032: 0xA361,\n\t51602 - 44032: 0xA362,\n\t51603 - 44032: 0xA363,\n\t51604 - 44032: 0xA364,\n\t51605 - 44032: 0xA365,\n\t51606 - 44032: 0xA366,\n\t51607 - 44032: 0xA367,\n\t51608 - 44032: 0xC1F2,\n\t51609 - 44032: 0xC1F3,\n\t51610 - 44032: 0xA368,\n\t51611 - 44032: 0xC1F4,\n\t51612 - 44032: 0xA369,\n\t51613 - 44032: 0xC1F5,\n\t51614 - 44032: 0xA36A,\n\t51615 - 44032: 0xA36B,\n\t51616 - 44032: 0xA36C,\n\t51617 - 44032: 0xA36D,\n\t51618 - 44032: 0xA36E,\n\t51619 - 44032: 0xA36F,\n\t51620 - 44032: 0xA370,\n\t51621 - 44032: 0xA371,\n\t51622 - 44032: 0xA372,\n\t51623 - 44032: 0xA373,\n\t51624 - 44032: 0xA374,\n\t51625 - 44032: 0xA375,\n\t51626 - 44032: 0xA376,\n\t51627 - 44032: 0xA377,\n\t51628 - 44032: 0xA378,\n\t51629 - 44032: 0xA379,\n\t51630 - 44032: 0xA37A,\n\t51631 - 44032: 0xA381,\n\t51632 - 44032: 0xA382,\n\t51633 - 44032: 0xA383,\n\t51634 - 44032: 0xA384,\n\t51635 - 44032: 0xA385,\n\t51636 - 44032: 0xA386,\n\t51637 - 44032: 0xA387,\n\t51638 - 44032: 0xA388,\n\t51639 - 44032: 0xA389,\n\t51640 - 44032: 0xA38A,\n\t51641 - 44032: 0xA38B,\n\t51642 - 44032: 0xA38C,\n\t51643 - 44032: 0xA38D,\n\t51644 - 44032: 0xA38E,\n\t51645 - 44032: 0xA38F,\n\t51646 - 44032: 0xA390,\n\t51647 - 44032: 0xA391,\n\t51648 - 44032: 0xC1F6,\n\t51649 - 44032: 0xC1F7,\n\t51650 - 44032: 0xA392,\n\t51651 - 44032: 0xA393,\n\t51652 - 44032: 0xC1F8,\n\t51653 - 44032: 0xA394,\n\t51654 - 44032: 0xA395,\n\t51655 - 44032: 0xC1F9,\n\t51656 - 44032: 0xC1FA,\n\t51657 - 44032: 0xA396,\n\t51658 - 44032: 0xC1FB,\n\t51659 - 44032: 0xA397,\n\t51660 - 44032: 0xA398,\n\t51661 - 44032: 0xA399,\n\t51662 - 44032: 0xA39A,\n\t51663 - 44032: 0xA39B,\n\t51664 - 44032: 0xC1FC,\n\t51665 - 44032: 0xC1FD,\n\t51666 - 44032: 0xA39C,\n\t51667 - 44032: 0xC1FE,\n\t51668 - 44032: 0xA39D,\n\t51669 - 44032: 0xC2A1,\n\t51670 - 44032: 0xC2A2,\n\t51671 - 44032: 0xA39E,\n\t51672 - 44032: 0xA39F,\n\t51673 - 44032: 0xC2A3,\n\t51674 - 44032: 0xC2A4,\n\t51675 - 44032: 0xA3A0,\n\t51676 - 44032: 0xC2A5,\n\t51677 - 44032: 0xC2A6,\n\t51678 - 44032: 0xA441,\n\t51679 - 44032: 0xA442,\n\t51680 - 44032: 0xC2A7,\n\t51681 - 44032: 0xA443,\n\t51682 - 44032: 0xC2A8,\n\t51683 - 44032: 0xA444,\n\t51684 - 44032: 0xC2A9,\n\t51685 - 44032: 0xA445,\n\t51686 - 44032: 0xA446,\n\t51687 - 44032: 0xC2AA,\n\t51688 - 44032: 0xA447,\n\t51689 - 44032: 0xA448,\n\t51690 - 44032: 0xA449,\n\t51691 - 44032: 0xA44A,\n\t51692 - 44032: 0xC2AB,\n\t51693 - 44032: 0xC2AC,\n\t51694 - 44032: 0xA44B,\n\t51695 - 44032: 0xC2AD,\n\t51696 - 44032: 0xC2AE,\n\t51697 - 44032: 0xC2AF,\n\t51698 - 44032: 0xA44C,\n\t51699 - 44032: 0xA44D,\n\t51700 - 44032: 0xA44E,\n\t51701 - 44032: 0xA44F,\n\t51702 - 44032: 0xA450,\n\t51703 - 44032: 0xA451,\n\t51704 - 44032: 0xC2B0,\n\t51705 - 44032: 0xC2B1,\n\t51706 - 44032: 0xA452,\n\t51707 - 44032: 0xA453,\n\t51708 - 44032: 0xC2B2,\n\t51709 - 44032: 0xA454,\n\t51710 - 44032: 0xA455,\n\t51711 - 44032: 0xA456,\n\t51712 - 44032: 0xC2B3,\n\t51713 - 44032: 0xA457,\n\t51714 - 44032: 0xA458,\n\t51715 - 44032: 0xA459,\n\t51716 - 44032: 0xA45A,\n\t51717 - 44032: 0xA461,\n\t51718 - 44032: 0xA462,\n\t51719 - 44032: 0xA463,\n\t51720 - 44032: 0xC2B4,\n\t51721 - 44032: 0xC2B5,\n\t51722 - 44032: 0xA464,\n\t51723 - 44032: 0xC2B6,\n\t51724 - 44032: 0xC2B7,\n\t51725 - 44032: 0xC2B8,\n\t51726 - 44032: 0xA465,\n\t51727 - 44032: 0xA466,\n\t51728 - 44032: 0xA467,\n\t51729 - 44032: 0xA468,\n\t51730 - 44032: 0xA469,\n\t51731 - 44032: 0xA46A,\n\t51732 - 44032: 0xC2B9,\n\t51733 - 44032: 0xA46B,\n\t51734 - 44032: 0xA46C,\n\t51735 - 44032: 0xA46D,\n\t51736 - 44032: 0xC2BA,\n\t51737 - 44032: 0xA46E,\n\t51738 - 44032: 0xA46F,\n\t51739 - 44032: 0xA470,\n\t51740 - 44032: 0xA471,\n\t51741 - 44032: 0xA472,\n\t51742 - 44032: 0xA473,\n\t51743 - 44032: 0xA474,\n\t51744 - 44032: 0xA475,\n\t51745 - 44032: 0xA476,\n\t51746 - 44032: 0xA477,\n\t51747 - 44032: 0xA478,\n\t51748 - 44032: 0xA479,\n\t51749 - 44032: 0xA47A,\n\t51750 - 44032: 0xA481,\n\t51751 - 44032: 0xA482,\n\t51752 - 44032: 0xA483,\n\t51753 - 44032: 0xC2BB,\n\t51754 - 44032: 0xA484,\n\t51755 - 44032: 0xA485,\n\t51756 - 44032: 0xA486,\n\t51757 - 44032: 0xA487,\n\t51758 - 44032: 0xA488,\n\t51759 - 44032: 0xA489,\n\t51760 - 44032: 0xA48A,\n\t51761 - 44032: 0xA48B,\n\t51762 - 44032: 0xA48C,\n\t51763 - 44032: 0xA48D,\n\t51764 - 44032: 0xA48E,\n\t51765 - 44032: 0xA48F,\n\t51766 - 44032: 0xA490,\n\t51767 - 44032: 0xA491,\n\t51768 - 44032: 0xA492,\n\t51769 - 44032: 0xA493,\n\t51770 - 44032: 0xA494,\n\t51771 - 44032: 0xA495,\n\t51772 - 44032: 0xA496,\n\t51773 - 44032: 0xA497,\n\t51774 - 44032: 0xA498,\n\t51775 - 44032: 0xA499,\n\t51776 - 44032: 0xA49A,\n\t51777 - 44032: 0xA49B,\n\t51778 - 44032: 0xA49C,\n\t51779 - 44032: 0xA49D,\n\t51780 - 44032: 0xA49E,\n\t51781 - 44032: 0xA49F,\n\t51782 - 44032: 0xA4A0,\n\t51783 - 44032: 0xA541,\n\t51784 - 44032: 0xA542,\n\t51785 - 44032: 0xA543,\n\t51786 - 44032: 0xA544,\n\t51787 - 44032: 0xA545,\n\t51788 - 44032: 0xC2BC,\n\t51789 - 44032: 0xC2BD,\n\t51790 - 44032: 0xA546,\n\t51791 - 44032: 0xA547,\n\t51792 - 44032: 0xC2BE,\n\t51793 - 44032: 0xA548,\n\t51794 - 44032: 0xA549,\n\t51795 - 44032: 0xA54A,\n\t51796 - 44032: 0xC2BF,\n\t51797 - 44032: 0xA54B,\n\t51798 - 44032: 0xA54C,\n\t51799 - 44032: 0xA54D,\n\t51800 - 44032: 0xA54E,\n\t51801 - 44032: 0xA54F,\n\t51802 - 44032: 0xA550,\n\t51803 - 44032: 0xA551,\n\t51804 - 44032: 0xC2C0,\n\t51805 - 44032: 0xC2C1,\n\t51806 - 44032: 0xA552,\n\t51807 - 44032: 0xC2C2,\n\t51808 - 44032: 0xC2C3,\n\t51809 - 44032: 0xC2C4,\n\t51810 - 44032: 0xA553,\n\t51811 - 44032: 0xA554,\n\t51812 - 44032: 0xA555,\n\t51813 - 44032: 0xA556,\n\t51814 - 44032: 0xA557,\n\t51815 - 44032: 0xA558,\n\t51816 - 44032: 0xC2C5,\n\t51817 - 44032: 0xA559,\n\t51818 - 44032: 0xA55A,\n\t51819 - 44032: 0xA561,\n\t51820 - 44032: 0xA562,\n\t51821 - 44032: 0xA563,\n\t51822 - 44032: 0xA564,\n\t51823 - 44032: 0xA565,\n\t51824 - 44032: 0xA566,\n\t51825 - 44032: 0xA567,\n\t51826 - 44032: 0xA568,\n\t51827 - 44032: 0xA569,\n\t51828 - 44032: 0xA56A,\n\t51829 - 44032: 0xA56B,\n\t51830 - 44032: 0xA56C,\n\t51831 - 44032: 0xA56D,\n\t51832 - 44032: 0xA56E,\n\t51833 - 44032: 0xA56F,\n\t51834 - 44032: 0xA570,\n\t51835 - 44032: 0xA571,\n\t51836 - 44032: 0xA572,\n\t51837 - 44032: 0xC2C6,\n\t51838 - 44032: 0xA573,\n\t51839 - 44032: 0xA574,\n\t51840 - 44032: 0xA575,\n\t51841 - 44032: 0xA576,\n\t51842 - 44032: 0xA577,\n\t51843 - 44032: 0xA578,\n\t51844 - 44032: 0xC2C7,\n\t51845 - 44032: 0xA579,\n\t51846 - 44032: 0xA57A,\n\t51847 - 44032: 0xA581,\n\t51848 - 44032: 0xA582,\n\t51849 - 44032: 0xA583,\n\t51850 - 44032: 0xA584,\n\t51851 - 44032: 0xA585,\n\t51852 - 44032: 0xA586,\n\t51853 - 44032: 0xA587,\n\t51854 - 44032: 0xA588,\n\t51855 - 44032: 0xA589,\n\t51856 - 44032: 0xA58A,\n\t51857 - 44032: 0xA58B,\n\t51858 - 44032: 0xA58C,\n\t51859 - 44032: 0xA58D,\n\t51860 - 44032: 0xA58E,\n\t51861 - 44032: 0xA58F,\n\t51862 - 44032: 0xA590,\n\t51863 - 44032: 0xA591,\n\t51864 - 44032: 0xC2C8,\n\t51865 - 44032: 0xA592,\n\t51866 - 44032: 0xA593,\n\t51867 - 44032: 0xA594,\n\t51868 - 44032: 0xA595,\n\t51869 - 44032: 0xA596,\n\t51870 - 44032: 0xA597,\n\t51871 - 44032: 0xA598,\n\t51872 - 44032: 0xA599,\n\t51873 - 44032: 0xA59A,\n\t51874 - 44032: 0xA59B,\n\t51875 - 44032: 0xA59C,\n\t51876 - 44032: 0xA59D,\n\t51877 - 44032: 0xA59E,\n\t51878 - 44032: 0xA59F,\n\t51879 - 44032: 0xA5A0,\n\t51880 - 44032: 0xA641,\n\t51881 - 44032: 0xA642,\n\t51882 - 44032: 0xA643,\n\t51883 - 44032: 0xA644,\n\t51884 - 44032: 0xA645,\n\t51885 - 44032: 0xA646,\n\t51886 - 44032: 0xA647,\n\t51887 - 44032: 0xA648,\n\t51888 - 44032: 0xA649,\n\t51889 - 44032: 0xA64A,\n\t51890 - 44032: 0xA64B,\n\t51891 - 44032: 0xA64C,\n\t51892 - 44032: 0xA64D,\n\t51893 - 44032: 0xA64E,\n\t51894 - 44032: 0xA64F,\n\t51895 - 44032: 0xA650,\n\t51896 - 44032: 0xA651,\n\t51897 - 44032: 0xA652,\n\t51898 - 44032: 0xA653,\n\t51899 - 44032: 0xA654,\n\t51900 - 44032: 0xC2C9,\n\t51901 - 44032: 0xC2CA,\n\t51902 - 44032: 0xA655,\n\t51903 - 44032: 0xA656,\n\t51904 - 44032: 0xC2CB,\n\t51905 - 44032: 0xA657,\n\t51906 - 44032: 0xA658,\n\t51907 - 44032: 0xA659,\n\t51908 - 44032: 0xC2CC,\n\t51909 - 44032: 0xA65A,\n\t51910 - 44032: 0xA661,\n\t51911 - 44032: 0xA662,\n\t51912 - 44032: 0xA663,\n\t51913 - 44032: 0xA664,\n\t51914 - 44032: 0xA665,\n\t51915 - 44032: 0xA666,\n\t51916 - 44032: 0xC2CD,\n\t51917 - 44032: 0xC2CE,\n\t51918 - 44032: 0xA667,\n\t51919 - 44032: 0xC2CF,\n\t51920 - 44032: 0xA668,\n\t51921 - 44032: 0xC2D0,\n\t51922 - 44032: 0xA669,\n\t51923 - 44032: 0xC2D1,\n\t51924 - 44032: 0xA66A,\n\t51925 - 44032: 0xA66B,\n\t51926 - 44032: 0xA66C,\n\t51927 - 44032: 0xA66D,\n\t51928 - 44032: 0xC2D2,\n\t51929 - 44032: 0xC2D3,\n\t51930 - 44032: 0xA66E,\n\t51931 - 44032: 0xA66F,\n\t51932 - 44032: 0xA670,\n\t51933 - 44032: 0xA671,\n\t51934 - 44032: 0xA672,\n\t51935 - 44032: 0xA673,\n\t51936 - 44032: 0xC2D4,\n\t51937 - 44032: 0xA674,\n\t51938 - 44032: 0xA675,\n\t51939 - 44032: 0xA676,\n\t51940 - 44032: 0xA677,\n\t51941 - 44032: 0xA678,\n\t51942 - 44032: 0xA679,\n\t51943 - 44032: 0xA67A,\n\t51944 - 44032: 0xA681,\n\t51945 - 44032: 0xA682,\n\t51946 - 44032: 0xA683,\n\t51947 - 44032: 0xA684,\n\t51948 - 44032: 0xC2D5,\n\t51949 - 44032: 0xA685,\n\t51950 - 44032: 0xA686,\n\t51951 - 44032: 0xA687,\n\t51952 - 44032: 0xA688,\n\t51953 - 44032: 0xA689,\n\t51954 - 44032: 0xA68A,\n\t51955 - 44032: 0xA68B,\n\t51956 - 44032: 0xC2D6,\n\t51957 - 44032: 0xA68C,\n\t51958 - 44032: 0xA68D,\n\t51959 - 44032: 0xA68E,\n\t51960 - 44032: 0xA68F,\n\t51961 - 44032: 0xA690,\n\t51962 - 44032: 0xA691,\n\t51963 - 44032: 0xA692,\n\t51964 - 44032: 0xA693,\n\t51965 - 44032: 0xA694,\n\t51966 - 44032: 0xA695,\n\t51967 - 44032: 0xA696,\n\t51968 - 44032: 0xA697,\n\t51969 - 44032: 0xA698,\n\t51970 - 44032: 0xA699,\n\t51971 - 44032: 0xA69A,\n\t51972 - 44032: 0xA69B,\n\t51973 - 44032: 0xA69C,\n\t51974 - 44032: 0xA69D,\n\t51975 - 44032: 0xA69E,\n\t51976 - 44032: 0xC2D7,\n\t51977 - 44032: 0xA69F,\n\t51978 - 44032: 0xA6A0,\n\t51979 - 44032: 0xA741,\n\t51980 - 44032: 0xA742,\n\t51981 - 44032: 0xA743,\n\t51982 - 44032: 0xA744,\n\t51983 - 44032: 0xA745,\n\t51984 - 44032: 0xC2D8,\n\t51985 - 44032: 0xA746,\n\t51986 - 44032: 0xA747,\n\t51987 - 44032: 0xA748,\n\t51988 - 44032: 0xC2D9,\n\t51989 - 44032: 0xA749,\n\t51990 - 44032: 0xA74A,\n\t51991 - 44032: 0xA74B,\n\t51992 - 44032: 0xC2DA,\n\t51993 - 44032: 0xA74C,\n\t51994 - 44032: 0xA74D,\n\t51995 - 44032: 0xA74E,\n\t51996 - 44032: 0xA74F,\n\t51997 - 44032: 0xA750,\n\t51998 - 44032: 0xA751,\n\t51999 - 44032: 0xA752,\n\t52000 - 44032: 0xC2DB,\n\t52001 - 44032: 0xC2DC,\n\t52002 - 44032: 0xA753,\n\t52003 - 44032: 0xA754,\n\t52004 - 44032: 0xA755,\n\t52005 - 44032: 0xA756,\n\t52006 - 44032: 0xA757,\n\t52007 - 44032: 0xA758,\n\t52008 - 44032: 0xA759,\n\t52009 - 44032: 0xA75A,\n\t52010 - 44032: 0xA761,\n\t52011 - 44032: 0xA762,\n\t52012 - 44032: 0xA763,\n\t52013 - 44032: 0xA764,\n\t52014 - 44032: 0xA765,\n\t52015 - 44032: 0xA766,\n\t52016 - 44032: 0xA767,\n\t52017 - 44032: 0xA768,\n\t52018 - 44032: 0xA769,\n\t52019 - 44032: 0xA76A,\n\t52020 - 44032: 0xA76B,\n\t52021 - 44032: 0xA76C,\n\t52022 - 44032: 0xA76D,\n\t52023 - 44032: 0xA76E,\n\t52024 - 44032: 0xA76F,\n\t52025 - 44032: 0xA770,\n\t52026 - 44032: 0xA771,\n\t52027 - 44032: 0xA772,\n\t52028 - 44032: 0xA773,\n\t52029 - 44032: 0xA774,\n\t52030 - 44032: 0xA775,\n\t52031 - 44032: 0xA776,\n\t52032 - 44032: 0xA777,\n\t52033 - 44032: 0xC2DD,\n\t52034 - 44032: 0xA778,\n\t52035 - 44032: 0xA779,\n\t52036 - 44032: 0xA77A,\n\t52037 - 44032: 0xA781,\n\t52038 - 44032: 0xA782,\n\t52039 - 44032: 0xA783,\n\t52040 - 44032: 0xC2DE,\n\t52041 - 44032: 0xC2DF,\n\t52042 - 44032: 0xA784,\n\t52043 - 44032: 0xA785,\n\t52044 - 44032: 0xC2E0,\n\t52045 - 44032: 0xA786,\n\t52046 - 44032: 0xA787,\n\t52047 - 44032: 0xA788,\n\t52048 - 44032: 0xC2E1,\n\t52049 - 44032: 0xA789,\n\t52050 - 44032: 0xA78A,\n\t52051 - 44032: 0xA78B,\n\t52052 - 44032: 0xA78C,\n\t52053 - 44032: 0xA78D,\n\t52054 - 44032: 0xA78E,\n\t52055 - 44032: 0xA78F,\n\t52056 - 44032: 0xC2E2,\n\t52057 - 44032: 0xC2E3,\n\t52058 - 44032: 0xA790,\n\t52059 - 44032: 0xA791,\n\t52060 - 44032: 0xA792,\n\t52061 - 44032: 0xC2E4,\n\t52062 - 44032: 0xA793,\n\t52063 - 44032: 0xA794,\n\t52064 - 44032: 0xA795,\n\t52065 - 44032: 0xA796,\n\t52066 - 44032: 0xA797,\n\t52067 - 44032: 0xA798,\n\t52068 - 44032: 0xC2E5,\n\t52069 - 44032: 0xA799,\n\t52070 - 44032: 0xA79A,\n\t52071 - 44032: 0xA79B,\n\t52072 - 44032: 0xA79C,\n\t52073 - 44032: 0xA79D,\n\t52074 - 44032: 0xA79E,\n\t52075 - 44032: 0xA79F,\n\t52076 - 44032: 0xA7A0,\n\t52077 - 44032: 0xA841,\n\t52078 - 44032: 0xA842,\n\t52079 - 44032: 0xA843,\n\t52080 - 44032: 0xA844,\n\t52081 - 44032: 0xA845,\n\t52082 - 44032: 0xA846,\n\t52083 - 44032: 0xA847,\n\t52084 - 44032: 0xA848,\n\t52085 - 44032: 0xA849,\n\t52086 - 44032: 0xA84A,\n\t52087 - 44032: 0xA84B,\n\t52088 - 44032: 0xC2E6,\n\t52089 - 44032: 0xC2E7,\n\t52090 - 44032: 0xA84C,\n\t52091 - 44032: 0xA84D,\n\t52092 - 44032: 0xA84E,\n\t52093 - 44032: 0xA84F,\n\t52094 - 44032: 0xA850,\n\t52095 - 44032: 0xA851,\n\t52096 - 44032: 0xA852,\n\t52097 - 44032: 0xA853,\n\t52098 - 44032: 0xA854,\n\t52099 - 44032: 0xA855,\n\t52100 - 44032: 0xA856,\n\t52101 - 44032: 0xA857,\n\t52102 - 44032: 0xA858,\n\t52103 - 44032: 0xA859,\n\t52104 - 44032: 0xA85A,\n\t52105 - 44032: 0xA861,\n\t52106 - 44032: 0xA862,\n\t52107 - 44032: 0xA863,\n\t52108 - 44032: 0xA864,\n\t52109 - 44032: 0xA865,\n\t52110 - 44032: 0xA866,\n\t52111 - 44032: 0xA867,\n\t52112 - 44032: 0xA868,\n\t52113 - 44032: 0xA869,\n\t52114 - 44032: 0xA86A,\n\t52115 - 44032: 0xA86B,\n\t52116 - 44032: 0xA86C,\n\t52117 - 44032: 0xA86D,\n\t52118 - 44032: 0xA86E,\n\t52119 - 44032: 0xA86F,\n\t52120 - 44032: 0xA870,\n\t52121 - 44032: 0xA871,\n\t52122 - 44032: 0xA872,\n\t52123 - 44032: 0xA873,\n\t52124 - 44032: 0xC2E8,\n\t52125 - 44032: 0xA874,\n\t52126 - 44032: 0xA875,\n\t52127 - 44032: 0xA876,\n\t52128 - 44032: 0xA877,\n\t52129 - 44032: 0xA878,\n\t52130 - 44032: 0xA879,\n\t52131 - 44032: 0xA87A,\n\t52132 - 44032: 0xA881,\n\t52133 - 44032: 0xA882,\n\t52134 - 44032: 0xA883,\n\t52135 - 44032: 0xA884,\n\t52136 - 44032: 0xA885,\n\t52137 - 44032: 0xA886,\n\t52138 - 44032: 0xA887,\n\t52139 - 44032: 0xA888,\n\t52140 - 44032: 0xA889,\n\t52141 - 44032: 0xA88A,\n\t52142 - 44032: 0xA88B,\n\t52143 - 44032: 0xA88C,\n\t52144 - 44032: 0xA88D,\n\t52145 - 44032: 0xA88E,\n\t52146 - 44032: 0xA88F,\n\t52147 - 44032: 0xA890,\n\t52148 - 44032: 0xA891,\n\t52149 - 44032: 0xA892,\n\t52150 - 44032: 0xA893,\n\t52151 - 44032: 0xA894,\n\t52152 - 44032: 0xC2E9,\n\t52153 - 44032: 0xA895,\n\t52154 - 44032: 0xA896,\n\t52155 - 44032: 0xA897,\n\t52156 - 44032: 0xA898,\n\t52157 - 44032: 0xA899,\n\t52158 - 44032: 0xA89A,\n\t52159 - 44032: 0xA89B,\n\t52160 - 44032: 0xA89C,\n\t52161 - 44032: 0xA89D,\n\t52162 - 44032: 0xA89E,\n\t52163 - 44032: 0xA89F,\n\t52164 - 44032: 0xA8A0,\n\t52165 - 44032: 0xA941,\n\t52166 - 44032: 0xA942,\n\t52167 - 44032: 0xA943,\n\t52168 - 44032: 0xA944,\n\t52169 - 44032: 0xA945,\n\t52170 - 44032: 0xA946,\n\t52171 - 44032: 0xA947,\n\t52172 - 44032: 0xA948,\n\t52173 - 44032: 0xA949,\n\t52174 - 44032: 0xA94A,\n\t52175 - 44032: 0xA94B,\n\t52176 - 44032: 0xA94C,\n\t52177 - 44032: 0xA94D,\n\t52178 - 44032: 0xA94E,\n\t52179 - 44032: 0xA94F,\n\t52180 - 44032: 0xC2EA,\n\t52181 - 44032: 0xA950,\n\t52182 - 44032: 0xA951,\n\t52183 - 44032: 0xA952,\n\t52184 - 44032: 0xA953,\n\t52185 - 44032: 0xA954,\n\t52186 - 44032: 0xA955,\n\t52187 - 44032: 0xA956,\n\t52188 - 44032: 0xA957,\n\t52189 - 44032: 0xA958,\n\t52190 - 44032: 0xA959,\n\t52191 - 44032: 0xA95A,\n\t52192 - 44032: 0xA961,\n\t52193 - 44032: 0xA962,\n\t52194 - 44032: 0xA963,\n\t52195 - 44032: 0xA964,\n\t52196 - 44032: 0xC2EB,\n\t52197 - 44032: 0xA965,\n\t52198 - 44032: 0xA966,\n\t52199 - 44032: 0xC2EC,\n\t52200 - 44032: 0xA967,\n\t52201 - 44032: 0xC2ED,\n\t52202 - 44032: 0xA968,\n\t52203 - 44032: 0xA969,\n\t52204 - 44032: 0xA96A,\n\t52205 - 44032: 0xA96B,\n\t52206 - 44032: 0xA96C,\n\t52207 - 44032: 0xA96D,\n\t52208 - 44032: 0xA96E,\n\t52209 - 44032: 0xA96F,\n\t52210 - 44032: 0xA970,\n\t52211 - 44032: 0xA971,\n\t52212 - 44032: 0xA972,\n\t52213 - 44032: 0xA973,\n\t52214 - 44032: 0xA974,\n\t52215 - 44032: 0xA975,\n\t52216 - 44032: 0xA976,\n\t52217 - 44032: 0xA977,\n\t52218 - 44032: 0xA978,\n\t52219 - 44032: 0xA979,\n\t52220 - 44032: 0xA97A,\n\t52221 - 44032: 0xA981,\n\t52222 - 44032: 0xA982,\n\t52223 - 44032: 0xA983,\n\t52224 - 44032: 0xA984,\n\t52225 - 44032: 0xA985,\n\t52226 - 44032: 0xA986,\n\t52227 - 44032: 0xA987,\n\t52228 - 44032: 0xA988,\n\t52229 - 44032: 0xA989,\n\t52230 - 44032: 0xA98A,\n\t52231 - 44032: 0xA98B,\n\t52232 - 44032: 0xA98C,\n\t52233 - 44032: 0xA98D,\n\t52234 - 44032: 0xA98E,\n\t52235 - 44032: 0xA98F,\n\t52236 - 44032: 0xC2EE,\n\t52237 - 44032: 0xC2EF,\n\t52238 - 44032: 0xA990,\n\t52239 - 44032: 0xA991,\n\t52240 - 44032: 0xC2F0,\n\t52241 - 44032: 0xA992,\n\t52242 - 44032: 0xA993,\n\t52243 - 44032: 0xA994,\n\t52244 - 44032: 0xC2F1,\n\t52245 - 44032: 0xA995,\n\t52246 - 44032: 0xA996,\n\t52247 - 44032: 0xA997,\n\t52248 - 44032: 0xA998,\n\t52249 - 44032: 0xA999,\n\t52250 - 44032: 0xA99A,\n\t52251 - 44032: 0xA99B,\n\t52252 - 44032: 0xC2F2,\n\t52253 - 44032: 0xC2F3,\n\t52254 - 44032: 0xA99C,\n\t52255 - 44032: 0xA99D,\n\t52256 - 44032: 0xA99E,\n\t52257 - 44032: 0xC2F4,\n\t52258 - 44032: 0xC2F5,\n\t52259 - 44032: 0xA99F,\n\t52260 - 44032: 0xA9A0,\n\t52261 - 44032: 0xAA41,\n\t52262 - 44032: 0xAA42,\n\t52263 - 44032: 0xC2F6,\n\t52264 - 44032: 0xC2F7,\n\t52265 - 44032: 0xC2F8,\n\t52266 - 44032: 0xAA43,\n\t52267 - 44032: 0xAA44,\n\t52268 - 44032: 0xC2F9,\n\t52269 - 44032: 0xAA45,\n\t52270 - 44032: 0xC2FA,\n\t52271 - 44032: 0xAA46,\n\t52272 - 44032: 0xC2FB,\n\t52273 - 44032: 0xAA47,\n\t52274 - 44032: 0xAA48,\n\t52275 - 44032: 0xAA49,\n\t52276 - 44032: 0xAA4A,\n\t52277 - 44032: 0xAA4B,\n\t52278 - 44032: 0xAA4C,\n\t52279 - 44032: 0xAA4D,\n\t52280 - 44032: 0xC2FC,\n\t52281 - 44032: 0xC2FD,\n\t52282 - 44032: 0xAA4E,\n\t52283 - 44032: 0xC2FE,\n\t52284 - 44032: 0xC3A1,\n\t52285 - 44032: 0xC3A2,\n\t52286 - 44032: 0xC3A3,\n\t52287 - 44032: 0xAA4F,\n\t52288 - 44032: 0xAA50,\n\t52289 - 44032: 0xAA51,\n\t52290 - 44032: 0xAA52,\n\t52291 - 44032: 0xAA53,\n\t52292 - 44032: 0xC3A4,\n\t52293 - 44032: 0xC3A5,\n\t52294 - 44032: 0xAA54,\n\t52295 - 44032: 0xAA55,\n\t52296 - 44032: 0xC3A6,\n\t52297 - 44032: 0xAA56,\n\t52298 - 44032: 0xAA57,\n\t52299 - 44032: 0xAA58,\n\t52300 - 44032: 0xC3A7,\n\t52301 - 44032: 0xAA59,\n\t52302 - 44032: 0xAA5A,\n\t52303 - 44032: 0xAA61,\n\t52304 - 44032: 0xAA62,\n\t52305 - 44032: 0xAA63,\n\t52306 - 44032: 0xAA64,\n\t52307 - 44032: 0xAA65,\n\t52308 - 44032: 0xC3A8,\n\t52309 - 44032: 0xC3A9,\n\t52310 - 44032: 0xAA66,\n\t52311 - 44032: 0xC3AA,\n\t52312 - 44032: 0xC3AB,\n\t52313 - 44032: 0xC3AC,\n\t52314 - 44032: 0xAA67,\n\t52315 - 44032: 0xAA68,\n\t52316 - 44032: 0xAA69,\n\t52317 - 44032: 0xAA6A,\n\t52318 - 44032: 0xAA6B,\n\t52319 - 44032: 0xAA6C,\n\t52320 - 44032: 0xC3AD,\n\t52321 - 44032: 0xAA6D,\n\t52322 - 44032: 0xAA6E,\n\t52323 - 44032: 0xAA6F,\n\t52324 - 44032: 0xC3AE,\n\t52325 - 44032: 0xAA70,\n\t52326 - 44032: 0xC3AF,\n\t52327 - 44032: 0xAA71,\n\t52328 - 44032: 0xC3B0,\n\t52329 - 44032: 0xAA72,\n\t52330 - 44032: 0xAA73,\n\t52331 - 44032: 0xAA74,\n\t52332 - 44032: 0xAA75,\n\t52333 - 44032: 0xAA76,\n\t52334 - 44032: 0xAA77,\n\t52335 - 44032: 0xAA78,\n\t52336 - 44032: 0xC3B1,\n\t52337 - 44032: 0xAA79,\n\t52338 - 44032: 0xAA7A,\n\t52339 - 44032: 0xAA81,\n\t52340 - 44032: 0xAA82,\n\t52341 - 44032: 0xC3B2,\n\t52342 - 44032: 0xAA83,\n\t52343 - 44032: 0xAA84,\n\t52344 - 44032: 0xAA85,\n\t52345 - 44032: 0xAA86,\n\t52346 - 44032: 0xAA87,\n\t52347 - 44032: 0xAA88,\n\t52348 - 44032: 0xAA89,\n\t52349 - 44032: 0xAA8A,\n\t52350 - 44032: 0xAA8B,\n\t52351 - 44032: 0xAA8C,\n\t52352 - 44032: 0xAA8D,\n\t52353 - 44032: 0xAA8E,\n\t52354 - 44032: 0xAA8F,\n\t52355 - 44032: 0xAA90,\n\t52356 - 44032: 0xAA91,\n\t52357 - 44032: 0xAA92,\n\t52358 - 44032: 0xAA93,\n\t52359 - 44032: 0xAA94,\n\t52360 - 44032: 0xAA95,\n\t52361 - 44032: 0xAA96,\n\t52362 - 44032: 0xAA97,\n\t52363 - 44032: 0xAA98,\n\t52364 - 44032: 0xAA99,\n\t52365 - 44032: 0xAA9A,\n\t52366 - 44032: 0xAA9B,\n\t52367 - 44032: 0xAA9C,\n\t52368 - 44032: 0xAA9D,\n\t52369 - 44032: 0xAA9E,\n\t52370 - 44032: 0xAA9F,\n\t52371 - 44032: 0xAAA0,\n\t52372 - 44032: 0xAB41,\n\t52373 - 44032: 0xAB42,\n\t52374 - 44032: 0xAB43,\n\t52375 - 44032: 0xAB44,\n\t52376 - 44032: 0xC3B3,\n\t52377 - 44032: 0xC3B4,\n\t52378 - 44032: 0xAB45,\n\t52379 - 44032: 0xAB46,\n\t52380 - 44032: 0xC3B5,\n\t52381 - 44032: 0xAB47,\n\t52382 - 44032: 0xAB48,\n\t52383 - 44032: 0xAB49,\n\t52384 - 44032: 0xC3B6,\n\t52385 - 44032: 0xAB4A,\n\t52386 - 44032: 0xAB4B,\n\t52387 - 44032: 0xAB4C,\n\t52388 - 44032: 0xAB4D,\n\t52389 - 44032: 0xAB4E,\n\t52390 - 44032: 0xAB4F,\n\t52391 - 44032: 0xAB50,\n\t52392 - 44032: 0xC3B7,\n\t52393 - 44032: 0xC3B8,\n\t52394 - 44032: 0xAB51,\n\t52395 - 44032: 0xC3B9,\n\t52396 - 44032: 0xC3BA,\n\t52397 - 44032: 0xC3BB,\n\t52398 - 44032: 0xAB52,\n\t52399 - 44032: 0xAB53,\n\t52400 - 44032: 0xAB54,\n\t52401 - 44032: 0xAB55,\n\t52402 - 44032: 0xAB56,\n\t52403 - 44032: 0xAB57,\n\t52404 - 44032: 0xC3BC,\n\t52405 - 44032: 0xC3BD,\n\t52406 - 44032: 0xAB58,\n\t52407 - 44032: 0xAB59,\n\t52408 - 44032: 0xC3BE,\n\t52409 - 44032: 0xAB5A,\n\t52410 - 44032: 0xAB61,\n\t52411 - 44032: 0xAB62,\n\t52412 - 44032: 0xC3BF,\n\t52413 - 44032: 0xAB63,\n\t52414 - 44032: 0xAB64,\n\t52415 - 44032: 0xAB65,\n\t52416 - 44032: 0xAB66,\n\t52417 - 44032: 0xAB67,\n\t52418 - 44032: 0xAB68,\n\t52419 - 44032: 0xAB69,\n\t52420 - 44032: 0xC3C0,\n\t52421 - 44032: 0xC3C1,\n\t52422 - 44032: 0xAB6A,\n\t52423 - 44032: 0xC3C2,\n\t52424 - 44032: 0xAB6B,\n\t52425 - 44032: 0xC3C3,\n\t52426 - 44032: 0xAB6C,\n\t52427 - 44032: 0xAB6D,\n\t52428 - 44032: 0xAB6E,\n\t52429 - 44032: 0xAB6F,\n\t52430 - 44032: 0xAB70,\n\t52431 - 44032: 0xAB71,\n\t52432 - 44032: 0xC3C4,\n\t52433 - 44032: 0xAB72,\n\t52434 - 44032: 0xAB73,\n\t52435 - 44032: 0xAB74,\n\t52436 - 44032: 0xC3C5,\n\t52437 - 44032: 0xAB75,\n\t52438 - 44032: 0xAB76,\n\t52439 - 44032: 0xAB77,\n\t52440 - 44032: 0xAB78,\n\t52441 - 44032: 0xAB79,\n\t52442 - 44032: 0xAB7A,\n\t52443 - 44032: 0xAB81,\n\t52444 - 44032: 0xAB82,\n\t52445 - 44032: 0xAB83,\n\t52446 - 44032: 0xAB84,\n\t52447 - 44032: 0xAB85,\n\t52448 - 44032: 0xAB86,\n\t52449 - 44032: 0xAB87,\n\t52450 - 44032: 0xAB88,\n\t52451 - 44032: 0xAB89,\n\t52452 - 44032: 0xC3C6,\n\t52453 - 44032: 0xAB8A,\n\t52454 - 44032: 0xAB8B,\n\t52455 - 44032: 0xAB8C,\n\t52456 - 44032: 0xAB8D,\n\t52457 - 44032: 0xAB8E,\n\t52458 - 44032: 0xAB8F,\n\t52459 - 44032: 0xAB90,\n\t52460 - 44032: 0xC3C7,\n\t52461 - 44032: 0xAB91,\n\t52462 - 44032: 0xAB92,\n\t52463 - 44032: 0xAB93,\n\t52464 - 44032: 0xC3C8,\n\t52465 - 44032: 0xAB94,\n\t52466 - 44032: 0xAB95,\n\t52467 - 44032: 0xAB96,\n\t52468 - 44032: 0xAB97,\n\t52469 - 44032: 0xAB98,\n\t52470 - 44032: 0xAB99,\n\t52471 - 44032: 0xAB9A,\n\t52472 - 44032: 0xAB9B,\n\t52473 - 44032: 0xAB9C,\n\t52474 - 44032: 0xAB9D,\n\t52475 - 44032: 0xAB9E,\n\t52476 - 44032: 0xAB9F,\n\t52477 - 44032: 0xABA0,\n\t52478 - 44032: 0xAC41,\n\t52479 - 44032: 0xAC42,\n\t52480 - 44032: 0xAC43,\n\t52481 - 44032: 0xC3C9,\n\t52482 - 44032: 0xAC44,\n\t52483 - 44032: 0xAC45,\n\t52484 - 44032: 0xAC46,\n\t52485 - 44032: 0xAC47,\n\t52486 - 44032: 0xAC48,\n\t52487 - 44032: 0xAC49,\n\t52488 - 44032: 0xC3CA,\n\t52489 - 44032: 0xC3CB,\n\t52490 - 44032: 0xAC4A,\n\t52491 - 44032: 0xAC4B,\n\t52492 - 44032: 0xC3CC,\n\t52493 - 44032: 0xAC4C,\n\t52494 - 44032: 0xAC4D,\n\t52495 - 44032: 0xAC4E,\n\t52496 - 44032: 0xC3CD,\n\t52497 - 44032: 0xAC4F,\n\t52498 - 44032: 0xAC50,\n\t52499 - 44032: 0xAC51,\n\t52500 - 44032: 0xAC52,\n\t52501 - 44032: 0xAC53,\n\t52502 - 44032: 0xAC54,\n\t52503 - 44032: 0xAC55,\n\t52504 - 44032: 0xC3CE,\n\t52505 - 44032: 0xC3CF,\n\t52506 - 44032: 0xAC56,\n\t52507 - 44032: 0xC3D0,\n\t52508 - 44032: 0xAC57,\n\t52509 - 44032: 0xC3D1,\n\t52510 - 44032: 0xAC58,\n\t52511 - 44032: 0xAC59,\n\t52512 - 44032: 0xAC5A,\n\t52513 - 44032: 0xAC61,\n\t52514 - 44032: 0xAC62,\n\t52515 - 44032: 0xAC63,\n\t52516 - 44032: 0xC3D2,\n\t52517 - 44032: 0xAC64,\n\t52518 - 44032: 0xAC65,\n\t52519 - 44032: 0xAC66,\n\t52520 - 44032: 0xC3D3,\n\t52521 - 44032: 0xAC67,\n\t52522 - 44032: 0xAC68,\n\t52523 - 44032: 0xAC69,\n\t52524 - 44032: 0xC3D4,\n\t52525 - 44032: 0xAC6A,\n\t52526 - 44032: 0xAC6B,\n\t52527 - 44032: 0xAC6C,\n\t52528 - 44032: 0xAC6D,\n\t52529 - 44032: 0xAC6E,\n\t52530 - 44032: 0xAC6F,\n\t52531 - 44032: 0xAC70,\n\t52532 - 44032: 0xAC71,\n\t52533 - 44032: 0xAC72,\n\t52534 - 44032: 0xAC73,\n\t52535 - 44032: 0xAC74,\n\t52536 - 44032: 0xAC75,\n\t52537 - 44032: 0xC3D5,\n\t52538 - 44032: 0xAC76,\n\t52539 - 44032: 0xAC77,\n\t52540 - 44032: 0xAC78,\n\t52541 - 44032: 0xAC79,\n\t52542 - 44032: 0xAC7A,\n\t52543 - 44032: 0xAC81,\n\t52544 - 44032: 0xAC82,\n\t52545 - 44032: 0xAC83,\n\t52546 - 44032: 0xAC84,\n\t52547 - 44032: 0xAC85,\n\t52548 - 44032: 0xAC86,\n\t52549 - 44032: 0xAC87,\n\t52550 - 44032: 0xAC88,\n\t52551 - 44032: 0xAC89,\n\t52552 - 44032: 0xAC8A,\n\t52553 - 44032: 0xAC8B,\n\t52554 - 44032: 0xAC8C,\n\t52555 - 44032: 0xAC8D,\n\t52556 - 44032: 0xAC8E,\n\t52557 - 44032: 0xAC8F,\n\t52558 - 44032: 0xAC90,\n\t52559 - 44032: 0xAC91,\n\t52560 - 44032: 0xAC92,\n\t52561 - 44032: 0xAC93,\n\t52562 - 44032: 0xAC94,\n\t52563 - 44032: 0xAC95,\n\t52564 - 44032: 0xAC96,\n\t52565 - 44032: 0xAC97,\n\t52566 - 44032: 0xAC98,\n\t52567 - 44032: 0xAC99,\n\t52568 - 44032: 0xAC9A,\n\t52569 - 44032: 0xAC9B,\n\t52570 - 44032: 0xAC9C,\n\t52571 - 44032: 0xAC9D,\n\t52572 - 44032: 0xC3D6,\n\t52573 - 44032: 0xAC9E,\n\t52574 - 44032: 0xAC9F,\n\t52575 - 44032: 0xACA0,\n\t52576 - 44032: 0xC3D7,\n\t52577 - 44032: 0xAD41,\n\t52578 - 44032: 0xAD42,\n\t52579 - 44032: 0xAD43,\n\t52580 - 44032: 0xC3D8,\n\t52581 - 44032: 0xAD44,\n\t52582 - 44032: 0xAD45,\n\t52583 - 44032: 0xAD46,\n\t52584 - 44032: 0xAD47,\n\t52585 - 44032: 0xAD48,\n\t52586 - 44032: 0xAD49,\n\t52587 - 44032: 0xAD4A,\n\t52588 - 44032: 0xC3D9,\n\t52589 - 44032: 0xC3DA,\n\t52590 - 44032: 0xAD4B,\n\t52591 - 44032: 0xC3DB,\n\t52592 - 44032: 0xAD4C,\n\t52593 - 44032: 0xC3DC,\n\t52594 - 44032: 0xAD4D,\n\t52595 - 44032: 0xAD4E,\n\t52596 - 44032: 0xAD4F,\n\t52597 - 44032: 0xAD50,\n\t52598 - 44032: 0xAD51,\n\t52599 - 44032: 0xAD52,\n\t52600 - 44032: 0xC3DD,\n\t52601 - 44032: 0xAD53,\n\t52602 - 44032: 0xAD54,\n\t52603 - 44032: 0xAD55,\n\t52604 - 44032: 0xAD56,\n\t52605 - 44032: 0xAD57,\n\t52606 - 44032: 0xAD58,\n\t52607 - 44032: 0xAD59,\n\t52608 - 44032: 0xAD5A,\n\t52609 - 44032: 0xAD61,\n\t52610 - 44032: 0xAD62,\n\t52611 - 44032: 0xAD63,\n\t52612 - 44032: 0xAD64,\n\t52613 - 44032: 0xAD65,\n\t52614 - 44032: 0xAD66,\n\t52615 - 44032: 0xAD67,\n\t52616 - 44032: 0xC3DE,\n\t52617 - 44032: 0xAD68,\n\t52618 - 44032: 0xAD69,\n\t52619 - 44032: 0xAD6A,\n\t52620 - 44032: 0xAD6B,\n\t52621 - 44032: 0xAD6C,\n\t52622 - 44032: 0xAD6D,\n\t52623 - 44032: 0xAD6E,\n\t52624 - 44032: 0xAD6F,\n\t52625 - 44032: 0xAD70,\n\t52626 - 44032: 0xAD71,\n\t52627 - 44032: 0xAD72,\n\t52628 - 44032: 0xC3DF,\n\t52629 - 44032: 0xC3E0,\n\t52630 - 44032: 0xAD73,\n\t52631 - 44032: 0xAD74,\n\t52632 - 44032: 0xC3E1,\n\t52633 - 44032: 0xAD75,\n\t52634 - 44032: 0xAD76,\n\t52635 - 44032: 0xAD77,\n\t52636 - 44032: 0xC3E2,\n\t52637 - 44032: 0xAD78,\n\t52638 - 44032: 0xAD79,\n\t52639 - 44032: 0xAD7A,\n\t52640 - 44032: 0xAD81,\n\t52641 - 44032: 0xAD82,\n\t52642 - 44032: 0xAD83,\n\t52643 - 44032: 0xAD84,\n\t52644 - 44032: 0xC3E3,\n\t52645 - 44032: 0xC3E4,\n\t52646 - 44032: 0xAD85,\n\t52647 - 44032: 0xC3E5,\n\t52648 - 44032: 0xAD86,\n\t52649 - 44032: 0xC3E6,\n\t52650 - 44032: 0xAD87,\n\t52651 - 44032: 0xAD88,\n\t52652 - 44032: 0xAD89,\n\t52653 - 44032: 0xAD8A,\n\t52654 - 44032: 0xAD8B,\n\t52655 - 44032: 0xAD8C,\n\t52656 - 44032: 0xC3E7,\n\t52657 - 44032: 0xAD8D,\n\t52658 - 44032: 0xAD8E,\n\t52659 - 44032: 0xAD8F,\n\t52660 - 44032: 0xAD90,\n\t52661 - 44032: 0xAD91,\n\t52662 - 44032: 0xAD92,\n\t52663 - 44032: 0xAD93,\n\t52664 - 44032: 0xAD94,\n\t52665 - 44032: 0xAD95,\n\t52666 - 44032: 0xAD96,\n\t52667 - 44032: 0xAD97,\n\t52668 - 44032: 0xAD98,\n\t52669 - 44032: 0xAD99,\n\t52670 - 44032: 0xAD9A,\n\t52671 - 44032: 0xAD9B,\n\t52672 - 44032: 0xAD9C,\n\t52673 - 44032: 0xAD9D,\n\t52674 - 44032: 0xAD9E,\n\t52675 - 44032: 0xAD9F,\n\t52676 - 44032: 0xC3E8,\n\t52677 - 44032: 0xADA0,\n\t52678 - 44032: 0xAE41,\n\t52679 - 44032: 0xAE42,\n\t52680 - 44032: 0xAE43,\n\t52681 - 44032: 0xAE44,\n\t52682 - 44032: 0xAE45,\n\t52683 - 44032: 0xAE46,\n\t52684 - 44032: 0xC3E9,\n\t52685 - 44032: 0xAE47,\n\t52686 - 44032: 0xAE48,\n\t52687 - 44032: 0xAE49,\n\t52688 - 44032: 0xC3EA,\n\t52689 - 44032: 0xAE4A,\n\t52690 - 44032: 0xAE4B,\n\t52691 - 44032: 0xAE4C,\n\t52692 - 44032: 0xAE4D,\n\t52693 - 44032: 0xAE4E,\n\t52694 - 44032: 0xAE4F,\n\t52695 - 44032: 0xAE50,\n\t52696 - 44032: 0xAE51,\n\t52697 - 44032: 0xAE52,\n\t52698 - 44032: 0xAE53,\n\t52699 - 44032: 0xAE54,\n\t52700 - 44032: 0xAE55,\n\t52701 - 44032: 0xAE56,\n\t52702 - 44032: 0xAE57,\n\t52703 - 44032: 0xAE58,\n\t52704 - 44032: 0xAE59,\n\t52705 - 44032: 0xAE5A,\n\t52706 - 44032: 0xAE61,\n\t52707 - 44032: 0xAE62,\n\t52708 - 44032: 0xAE63,\n\t52709 - 44032: 0xAE64,\n\t52710 - 44032: 0xAE65,\n\t52711 - 44032: 0xAE66,\n\t52712 - 44032: 0xC3EB,\n\t52713 - 44032: 0xAE67,\n\t52714 - 44032: 0xAE68,\n\t52715 - 44032: 0xAE69,\n\t52716 - 44032: 0xC3EC,\n\t52717 - 44032: 0xAE6A,\n\t52718 - 44032: 0xAE6B,\n\t52719 - 44032: 0xAE6C,\n\t52720 - 44032: 0xC3ED,\n\t52721 - 44032: 0xAE6D,\n\t52722 - 44032: 0xAE6E,\n\t52723 - 44032: 0xAE6F,\n\t52724 - 44032: 0xAE70,\n\t52725 - 44032: 0xAE71,\n\t52726 - 44032: 0xAE72,\n\t52727 - 44032: 0xAE73,\n\t52728 - 44032: 0xC3EE,\n\t52729 - 44032: 0xC3EF,\n\t52730 - 44032: 0xAE74,\n\t52731 - 44032: 0xC3F0,\n\t52732 - 44032: 0xAE75,\n\t52733 - 44032: 0xC3F1,\n\t52734 - 44032: 0xAE76,\n\t52735 - 44032: 0xAE77,\n\t52736 - 44032: 0xAE78,\n\t52737 - 44032: 0xAE79,\n\t52738 - 44032: 0xAE7A,\n\t52739 - 44032: 0xAE81,\n\t52740 - 44032: 0xC3F2,\n\t52741 - 44032: 0xAE82,\n\t52742 - 44032: 0xAE83,\n\t52743 - 44032: 0xAE84,\n\t52744 - 44032: 0xC3F3,\n\t52745 - 44032: 0xAE85,\n\t52746 - 44032: 0xAE86,\n\t52747 - 44032: 0xAE87,\n\t52748 - 44032: 0xC3F4,\n\t52749 - 44032: 0xAE88,\n\t52750 - 44032: 0xAE89,\n\t52751 - 44032: 0xAE8A,\n\t52752 - 44032: 0xAE8B,\n\t52753 - 44032: 0xAE8C,\n\t52754 - 44032: 0xAE8D,\n\t52755 - 44032: 0xAE8E,\n\t52756 - 44032: 0xC3F5,\n\t52757 - 44032: 0xAE8F,\n\t52758 - 44032: 0xAE90,\n\t52759 - 44032: 0xAE91,\n\t52760 - 44032: 0xAE92,\n\t52761 - 44032: 0xC3F6,\n\t52762 - 44032: 0xAE93,\n\t52763 - 44032: 0xAE94,\n\t52764 - 44032: 0xAE95,\n\t52765 - 44032: 0xAE96,\n\t52766 - 44032: 0xAE97,\n\t52767 - 44032: 0xAE98,\n\t52768 - 44032: 0xC3F7,\n\t52769 - 44032: 0xC3F8,\n\t52770 - 44032: 0xAE99,\n\t52771 - 44032: 0xAE9A,\n\t52772 - 44032: 0xC3F9,\n\t52773 - 44032: 0xAE9B,\n\t52774 - 44032: 0xAE9C,\n\t52775 - 44032: 0xAE9D,\n\t52776 - 44032: 0xC3FA,\n\t52777 - 44032: 0xAE9E,\n\t52778 - 44032: 0xAE9F,\n\t52779 - 44032: 0xAEA0,\n\t52780 - 44032: 0xAF41,\n\t52781 - 44032: 0xAF42,\n\t52782 - 44032: 0xAF43,\n\t52783 - 44032: 0xAF44,\n\t52784 - 44032: 0xC3FB,\n\t52785 - 44032: 0xC3FC,\n\t52786 - 44032: 0xAF45,\n\t52787 - 44032: 0xC3FD,\n\t52788 - 44032: 0xAF46,\n\t52789 - 44032: 0xC3FE,\n\t52790 - 44032: 0xAF47,\n\t52791 - 44032: 0xAF48,\n\t52792 - 44032: 0xAF49,\n\t52793 - 44032: 0xAF4A,\n\t52794 - 44032: 0xAF4B,\n\t52795 - 44032: 0xAF4C,\n\t52796 - 44032: 0xAF4D,\n\t52797 - 44032: 0xAF4E,\n\t52798 - 44032: 0xAF4F,\n\t52799 - 44032: 0xAF50,\n\t52800 - 44032: 0xAF51,\n\t52801 - 44032: 0xAF52,\n\t52802 - 44032: 0xAF53,\n\t52803 - 44032: 0xAF54,\n\t52804 - 44032: 0xAF55,\n\t52805 - 44032: 0xAF56,\n\t52806 - 44032: 0xAF57,\n\t52807 - 44032: 0xAF58,\n\t52808 - 44032: 0xAF59,\n\t52809 - 44032: 0xAF5A,\n\t52810 - 44032: 0xAF61,\n\t52811 - 44032: 0xAF62,\n\t52812 - 44032: 0xAF63,\n\t52813 - 44032: 0xAF64,\n\t52814 - 44032: 0xAF65,\n\t52815 - 44032: 0xAF66,\n\t52816 - 44032: 0xAF67,\n\t52817 - 44032: 0xAF68,\n\t52818 - 44032: 0xAF69,\n\t52819 - 44032: 0xAF6A,\n\t52820 - 44032: 0xAF6B,\n\t52821 - 44032: 0xAF6C,\n\t52822 - 44032: 0xAF6D,\n\t52823 - 44032: 0xAF6E,\n\t52824 - 44032: 0xC4A1,\n\t52825 - 44032: 0xC4A2,\n\t52826 - 44032: 0xAF6F,\n\t52827 - 44032: 0xAF70,\n\t52828 - 44032: 0xC4A3,\n\t52829 - 44032: 0xAF71,\n\t52830 - 44032: 0xAF72,\n\t52831 - 44032: 0xC4A4,\n\t52832 - 44032: 0xC4A5,\n\t52833 - 44032: 0xC4A6,\n\t52834 - 44032: 0xAF73,\n\t52835 - 44032: 0xAF74,\n\t52836 - 44032: 0xAF75,\n\t52837 - 44032: 0xAF76,\n\t52838 - 44032: 0xAF77,\n\t52839 - 44032: 0xAF78,\n\t52840 - 44032: 0xC4A7,\n\t52841 - 44032: 0xC4A8,\n\t52842 - 44032: 0xAF79,\n\t52843 - 44032: 0xC4A9,\n\t52844 - 44032: 0xAF7A,\n\t52845 - 44032: 0xC4AA,\n\t52846 - 44032: 0xAF81,\n\t52847 - 44032: 0xAF82,\n\t52848 - 44032: 0xAF83,\n\t52849 - 44032: 0xAF84,\n\t52850 - 44032: 0xAF85,\n\t52851 - 44032: 0xAF86,\n\t52852 - 44032: 0xC4AB,\n\t52853 - 44032: 0xC4AC,\n\t52854 - 44032: 0xAF87,\n\t52855 - 44032: 0xAF88,\n\t52856 - 44032: 0xC4AD,\n\t52857 - 44032: 0xAF89,\n\t52858 - 44032: 0xAF8A,\n\t52859 - 44032: 0xAF8B,\n\t52860 - 44032: 0xC4AE,\n\t52861 - 44032: 0xAF8C,\n\t52862 - 44032: 0xAF8D,\n\t52863 - 44032: 0xAF8E,\n\t52864 - 44032: 0xAF8F,\n\t52865 - 44032: 0xAF90,\n\t52866 - 44032: 0xAF91,\n\t52867 - 44032: 0xAF92,\n\t52868 - 44032: 0xC4AF,\n\t52869 - 44032: 0xC4B0,\n\t52870 - 44032: 0xAF93,\n\t52871 - 44032: 0xC4B1,\n\t52872 - 44032: 0xAF94,\n\t52873 - 44032: 0xC4B2,\n\t52874 - 44032: 0xAF95,\n\t52875 - 44032: 0xAF96,\n\t52876 - 44032: 0xAF97,\n\t52877 - 44032: 0xAF98,\n\t52878 - 44032: 0xAF99,\n\t52879 - 44032: 0xAF9A,\n\t52880 - 44032: 0xC4B3,\n\t52881 - 44032: 0xC4B4,\n\t52882 - 44032: 0xAF9B,\n\t52883 - 44032: 0xAF9C,\n\t52884 - 44032: 0xC4B5,\n\t52885 - 44032: 0xAF9D,\n\t52886 - 44032: 0xAF9E,\n\t52887 - 44032: 0xAF9F,\n\t52888 - 44032: 0xC4B6,\n\t52889 - 44032: 0xAFA0,\n\t52890 - 44032: 0xB041,\n\t52891 - 44032: 0xB042,\n\t52892 - 44032: 0xB043,\n\t52893 - 44032: 0xB044,\n\t52894 - 44032: 0xB045,\n\t52895 - 44032: 0xB046,\n\t52896 - 44032: 0xC4B7,\n\t52897 - 44032: 0xC4B8,\n\t52898 - 44032: 0xB047,\n\t52899 - 44032: 0xC4B9,\n\t52900 - 44032: 0xC4BA,\n\t52901 - 44032: 0xC4BB,\n\t52902 - 44032: 0xB048,\n\t52903 - 44032: 0xB049,\n\t52904 - 44032: 0xB04A,\n\t52905 - 44032: 0xB04B,\n\t52906 - 44032: 0xB04C,\n\t52907 - 44032: 0xB04D,\n\t52908 - 44032: 0xC4BC,\n\t52909 - 44032: 0xC4BD,\n\t52910 - 44032: 0xB04E,\n\t52911 - 44032: 0xB04F,\n\t52912 - 44032: 0xB050,\n\t52913 - 44032: 0xB051,\n\t52914 - 44032: 0xB052,\n\t52915 - 44032: 0xB053,\n\t52916 - 44032: 0xB054,\n\t52917 - 44032: 0xB055,\n\t52918 - 44032: 0xB056,\n\t52919 - 44032: 0xB057,\n\t52920 - 44032: 0xB058,\n\t52921 - 44032: 0xB059,\n\t52922 - 44032: 0xB05A,\n\t52923 - 44032: 0xB061,\n\t52924 - 44032: 0xB062,\n\t52925 - 44032: 0xB063,\n\t52926 - 44032: 0xB064,\n\t52927 - 44032: 0xB065,\n\t52928 - 44032: 0xB066,\n\t52929 - 44032: 0xC4BE,\n\t52930 - 44032: 0xB067,\n\t52931 - 44032: 0xB068,\n\t52932 - 44032: 0xB069,\n\t52933 - 44032: 0xB06A,\n\t52934 - 44032: 0xB06B,\n\t52935 - 44032: 0xB06C,\n\t52936 - 44032: 0xB06D,\n\t52937 - 44032: 0xB06E,\n\t52938 - 44032: 0xB06F,\n\t52939 - 44032: 0xB070,\n\t52940 - 44032: 0xB071,\n\t52941 - 44032: 0xB072,\n\t52942 - 44032: 0xB073,\n\t52943 - 44032: 0xB074,\n\t52944 - 44032: 0xB075,\n\t52945 - 44032: 0xB076,\n\t52946 - 44032: 0xB077,\n\t52947 - 44032: 0xB078,\n\t52948 - 44032: 0xB079,\n\t52949 - 44032: 0xB07A,\n\t52950 - 44032: 0xB081,\n\t52951 - 44032: 0xB082,\n\t52952 - 44032: 0xB083,\n\t52953 - 44032: 0xB084,\n\t52954 - 44032: 0xB085,\n\t52955 - 44032: 0xB086,\n\t52956 - 44032: 0xB087,\n\t52957 - 44032: 0xB088,\n\t52958 - 44032: 0xB089,\n\t52959 - 44032: 0xB08A,\n\t52960 - 44032: 0xB08B,\n\t52961 - 44032: 0xB08C,\n\t52962 - 44032: 0xB08D,\n\t52963 - 44032: 0xB08E,\n\t52964 - 44032: 0xC4BF,\n\t52965 - 44032: 0xC4C0,\n\t52966 - 44032: 0xB08F,\n\t52967 - 44032: 0xB090,\n\t52968 - 44032: 0xC4C1,\n\t52969 - 44032: 0xB091,\n\t52970 - 44032: 0xB092,\n\t52971 - 44032: 0xC4C2,\n\t52972 - 44032: 0xC4C3,\n\t52973 - 44032: 0xB093,\n\t52974 - 44032: 0xB094,\n\t52975 - 44032: 0xB095,\n\t52976 - 44032: 0xB096,\n\t52977 - 44032: 0xB097,\n\t52978 - 44032: 0xB098,\n\t52979 - 44032: 0xB099,\n\t52980 - 44032: 0xC4C4,\n\t52981 - 44032: 0xC4C5,\n\t52982 - 44032: 0xB09A,\n\t52983 - 44032: 0xC4C6,\n\t52984 - 44032: 0xC4C7,\n\t52985 - 44032: 0xC4C8,\n\t52986 - 44032: 0xB09B,\n\t52987 - 44032: 0xB09C,\n\t52988 - 44032: 0xB09D,\n\t52989 - 44032: 0xB09E,\n\t52990 - 44032: 0xB09F,\n\t52991 - 44032: 0xB0A0,\n\t52992 - 44032: 0xC4C9,\n\t52993 - 44032: 0xC4CA,\n\t52994 - 44032: 0xB141,\n\t52995 - 44032: 0xB142,\n\t52996 - 44032: 0xC4CB,\n\t52997 - 44032: 0xB143,\n\t52998 - 44032: 0xB144,\n\t52999 - 44032: 0xB145,\n\t53000 - 44032: 0xC4CC,\n\t53001 - 44032: 0xB146,\n\t53002 - 44032: 0xB147,\n\t53003 - 44032: 0xB148,\n\t53004 - 44032: 0xB149,\n\t53005 - 44032: 0xB14A,\n\t53006 - 44032: 0xB14B,\n\t53007 - 44032: 0xB14C,\n\t53008 - 44032: 0xC4CD,\n\t53009 - 44032: 0xC4CE,\n\t53010 - 44032: 0xB14D,\n\t53011 - 44032: 0xC4CF,\n\t53012 - 44032: 0xB14E,\n\t53013 - 44032: 0xC4D0,\n\t53014 - 44032: 0xB14F,\n\t53015 - 44032: 0xB150,\n\t53016 - 44032: 0xB151,\n\t53017 - 44032: 0xB152,\n\t53018 - 44032: 0xB153,\n\t53019 - 44032: 0xB154,\n\t53020 - 44032: 0xC4D1,\n\t53021 - 44032: 0xB155,\n\t53022 - 44032: 0xB156,\n\t53023 - 44032: 0xB157,\n\t53024 - 44032: 0xC4D2,\n\t53025 - 44032: 0xB158,\n\t53026 - 44032: 0xB159,\n\t53027 - 44032: 0xB15A,\n\t53028 - 44032: 0xC4D3,\n\t53029 - 44032: 0xB161,\n\t53030 - 44032: 0xB162,\n\t53031 - 44032: 0xB163,\n\t53032 - 44032: 0xB164,\n\t53033 - 44032: 0xB165,\n\t53034 - 44032: 0xB166,\n\t53035 - 44032: 0xB167,\n\t53036 - 44032: 0xC4D4,\n\t53037 - 44032: 0xC4D5,\n\t53038 - 44032: 0xB168,\n\t53039 - 44032: 0xC4D6,\n\t53040 - 44032: 0xC4D7,\n\t53041 - 44032: 0xC4D8,\n\t53042 - 44032: 0xB169,\n\t53043 - 44032: 0xB16A,\n\t53044 - 44032: 0xB16B,\n\t53045 - 44032: 0xB16C,\n\t53046 - 44032: 0xB16D,\n\t53047 - 44032: 0xB16E,\n\t53048 - 44032: 0xC4D9,\n\t53049 - 44032: 0xB16F,\n\t53050 - 44032: 0xB170,\n\t53051 - 44032: 0xB171,\n\t53052 - 44032: 0xB172,\n\t53053 - 44032: 0xB173,\n\t53054 - 44032: 0xB174,\n\t53055 - 44032: 0xB175,\n\t53056 - 44032: 0xB176,\n\t53057 - 44032: 0xB177,\n\t53058 - 44032: 0xB178,\n\t53059 - 44032: 0xB179,\n\t53060 - 44032: 0xB17A,\n\t53061 - 44032: 0xB181,\n\t53062 - 44032: 0xB182,\n\t53063 - 44032: 0xB183,\n\t53064 - 44032: 0xB184,\n\t53065 - 44032: 0xB185,\n\t53066 - 44032: 0xB186,\n\t53067 - 44032: 0xB187,\n\t53068 - 44032: 0xB188,\n\t53069 - 44032: 0xB189,\n\t53070 - 44032: 0xB18A,\n\t53071 - 44032: 0xB18B,\n\t53072 - 44032: 0xB18C,\n\t53073 - 44032: 0xB18D,\n\t53074 - 44032: 0xB18E,\n\t53075 - 44032: 0xB18F,\n\t53076 - 44032: 0xC4DA,\n\t53077 - 44032: 0xC4DB,\n\t53078 - 44032: 0xB190,\n\t53079 - 44032: 0xB191,\n\t53080 - 44032: 0xC4DC,\n\t53081 - 44032: 0xB192,\n\t53082 - 44032: 0xB193,\n\t53083 - 44032: 0xB194,\n\t53084 - 44032: 0xC4DD,\n\t53085 - 44032: 0xB195,\n\t53086 - 44032: 0xB196,\n\t53087 - 44032: 0xB197,\n\t53088 - 44032: 0xB198,\n\t53089 - 44032: 0xB199,\n\t53090 - 44032: 0xB19A,\n\t53091 - 44032: 0xB19B,\n\t53092 - 44032: 0xC4DE,\n\t53093 - 44032: 0xC4DF,\n\t53094 - 44032: 0xB19C,\n\t53095 - 44032: 0xC4E0,\n\t53096 - 44032: 0xB19D,\n\t53097 - 44032: 0xC4E1,\n\t53098 - 44032: 0xB19E,\n\t53099 - 44032: 0xB19F,\n\t53100 - 44032: 0xB1A0,\n\t53101 - 44032: 0xB241,\n\t53102 - 44032: 0xB242,\n\t53103 - 44032: 0xB243,\n\t53104 - 44032: 0xC4E2,\n\t53105 - 44032: 0xC4E3,\n\t53106 - 44032: 0xB244,\n\t53107 - 44032: 0xB245,\n\t53108 - 44032: 0xC4E4,\n\t53109 - 44032: 0xB246,\n\t53110 - 44032: 0xB247,\n\t53111 - 44032: 0xB248,\n\t53112 - 44032: 0xC4E5,\n\t53113 - 44032: 0xB249,\n\t53114 - 44032: 0xB24A,\n\t53115 - 44032: 0xB24B,\n\t53116 - 44032: 0xB24C,\n\t53117 - 44032: 0xB24D,\n\t53118 - 44032: 0xB24E,\n\t53119 - 44032: 0xB24F,\n\t53120 - 44032: 0xC4E6,\n\t53121 - 44032: 0xB250,\n\t53122 - 44032: 0xB251,\n\t53123 - 44032: 0xB252,\n\t53124 - 44032: 0xB253,\n\t53125 - 44032: 0xC4E7,\n\t53126 - 44032: 0xB254,\n\t53127 - 44032: 0xB255,\n\t53128 - 44032: 0xB256,\n\t53129 - 44032: 0xB257,\n\t53130 - 44032: 0xB258,\n\t53131 - 44032: 0xB259,\n\t53132 - 44032: 0xC4E8,\n\t53133 - 44032: 0xB25A,\n\t53134 - 44032: 0xB261,\n\t53135 - 44032: 0xB262,\n\t53136 - 44032: 0xB263,\n\t53137 - 44032: 0xB264,\n\t53138 - 44032: 0xB265,\n\t53139 - 44032: 0xB266,\n\t53140 - 44032: 0xB267,\n\t53141 - 44032: 0xB268,\n\t53142 - 44032: 0xB269,\n\t53143 - 44032: 0xB26A,\n\t53144 - 44032: 0xB26B,\n\t53145 - 44032: 0xB26C,\n\t53146 - 44032: 0xB26D,\n\t53147 - 44032: 0xB26E,\n\t53148 - 44032: 0xB26F,\n\t53149 - 44032: 0xB270,\n\t53150 - 44032: 0xB271,\n\t53151 - 44032: 0xB272,\n\t53152 - 44032: 0xB273,\n\t53153 - 44032: 0xC4E9,\n\t53154 - 44032: 0xB274,\n\t53155 - 44032: 0xB275,\n\t53156 - 44032: 0xB276,\n\t53157 - 44032: 0xB277,\n\t53158 - 44032: 0xB278,\n\t53159 - 44032: 0xB279,\n\t53160 - 44032: 0xC4EA,\n\t53161 - 44032: 0xB27A,\n\t53162 - 44032: 0xB281,\n\t53163 - 44032: 0xB282,\n\t53164 - 44032: 0xB283,\n\t53165 - 44032: 0xB284,\n\t53166 - 44032: 0xB285,\n\t53167 - 44032: 0xB286,\n\t53168 - 44032: 0xC4EB,\n\t53169 - 44032: 0xB287,\n\t53170 - 44032: 0xB288,\n\t53171 - 44032: 0xB289,\n\t53172 - 44032: 0xB28A,\n\t53173 - 44032: 0xB28B,\n\t53174 - 44032: 0xB28C,\n\t53175 - 44032: 0xB28D,\n\t53176 - 44032: 0xB28E,\n\t53177 - 44032: 0xB28F,\n\t53178 - 44032: 0xB290,\n\t53179 - 44032: 0xB291,\n\t53180 - 44032: 0xB292,\n\t53181 - 44032: 0xB293,\n\t53182 - 44032: 0xB294,\n\t53183 - 44032: 0xB295,\n\t53184 - 44032: 0xB296,\n\t53185 - 44032: 0xB297,\n\t53186 - 44032: 0xB298,\n\t53187 - 44032: 0xB299,\n\t53188 - 44032: 0xC4EC,\n\t53189 - 44032: 0xB29A,\n\t53190 - 44032: 0xB29B,\n\t53191 - 44032: 0xB29C,\n\t53192 - 44032: 0xB29D,\n\t53193 - 44032: 0xB29E,\n\t53194 - 44032: 0xB29F,\n\t53195 - 44032: 0xB2A0,\n\t53196 - 44032: 0xB341,\n\t53197 - 44032: 0xB342,\n\t53198 - 44032: 0xB343,\n\t53199 - 44032: 0xB344,\n\t53200 - 44032: 0xB345,\n\t53201 - 44032: 0xB346,\n\t53202 - 44032: 0xB347,\n\t53203 - 44032: 0xB348,\n\t53204 - 44032: 0xB349,\n\t53205 - 44032: 0xB34A,\n\t53206 - 44032: 0xB34B,\n\t53207 - 44032: 0xB34C,\n\t53208 - 44032: 0xB34D,\n\t53209 - 44032: 0xB34E,\n\t53210 - 44032: 0xB34F,\n\t53211 - 44032: 0xB350,\n\t53212 - 44032: 0xB351,\n\t53213 - 44032: 0xB352,\n\t53214 - 44032: 0xB353,\n\t53215 - 44032: 0xB354,\n\t53216 - 44032: 0xC4ED,\n\t53217 - 44032: 0xC4EE,\n\t53218 - 44032: 0xB355,\n\t53219 - 44032: 0xB356,\n\t53220 - 44032: 0xC4EF,\n\t53221 - 44032: 0xB357,\n\t53222 - 44032: 0xB358,\n\t53223 - 44032: 0xB359,\n\t53224 - 44032: 0xC4F0,\n\t53225 - 44032: 0xB35A,\n\t53226 - 44032: 0xB361,\n\t53227 - 44032: 0xB362,\n\t53228 - 44032: 0xB363,\n\t53229 - 44032: 0xB364,\n\t53230 - 44032: 0xB365,\n\t53231 - 44032: 0xB366,\n\t53232 - 44032: 0xC4F1,\n\t53233 - 44032: 0xC4F2,\n\t53234 - 44032: 0xB367,\n\t53235 - 44032: 0xC4F3,\n\t53236 - 44032: 0xB368,\n\t53237 - 44032: 0xC4F4,\n\t53238 - 44032: 0xB369,\n\t53239 - 44032: 0xB36A,\n\t53240 - 44032: 0xB36B,\n\t53241 - 44032: 0xB36C,\n\t53242 - 44032: 0xB36D,\n\t53243 - 44032: 0xB36E,\n\t53244 - 44032: 0xC4F5,\n\t53245 - 44032: 0xB36F,\n\t53246 - 44032: 0xB370,\n\t53247 - 44032: 0xB371,\n\t53248 - 44032: 0xC4F6,\n\t53249 - 44032: 0xB372,\n\t53250 - 44032: 0xB373,\n\t53251 - 44032: 0xB374,\n\t53252 - 44032: 0xC4F7,\n\t53253 - 44032: 0xB375,\n\t53254 - 44032: 0xB376,\n\t53255 - 44032: 0xB377,\n\t53256 - 44032: 0xB378,\n\t53257 - 44032: 0xB379,\n\t53258 - 44032: 0xB37A,\n\t53259 - 44032: 0xB381,\n\t53260 - 44032: 0xB382,\n\t53261 - 44032: 0xB383,\n\t53262 - 44032: 0xB384,\n\t53263 - 44032: 0xB385,\n\t53264 - 44032: 0xB386,\n\t53265 - 44032: 0xC4F8,\n\t53266 - 44032: 0xB387,\n\t53267 - 44032: 0xB388,\n\t53268 - 44032: 0xB389,\n\t53269 - 44032: 0xB38A,\n\t53270 - 44032: 0xB38B,\n\t53271 - 44032: 0xB38C,\n\t53272 - 44032: 0xC4F9,\n\t53273 - 44032: 0xB38D,\n\t53274 - 44032: 0xB38E,\n\t53275 - 44032: 0xB38F,\n\t53276 - 44032: 0xB390,\n\t53277 - 44032: 0xB391,\n\t53278 - 44032: 0xB392,\n\t53279 - 44032: 0xB393,\n\t53280 - 44032: 0xB394,\n\t53281 - 44032: 0xB395,\n\t53282 - 44032: 0xB396,\n\t53283 - 44032: 0xB397,\n\t53284 - 44032: 0xB398,\n\t53285 - 44032: 0xB399,\n\t53286 - 44032: 0xB39A,\n\t53287 - 44032: 0xB39B,\n\t53288 - 44032: 0xB39C,\n\t53289 - 44032: 0xB39D,\n\t53290 - 44032: 0xB39E,\n\t53291 - 44032: 0xB39F,\n\t53292 - 44032: 0xB3A0,\n\t53293 - 44032: 0xC4FA,\n\t53294 - 44032: 0xB441,\n\t53295 - 44032: 0xB442,\n\t53296 - 44032: 0xB443,\n\t53297 - 44032: 0xB444,\n\t53298 - 44032: 0xB445,\n\t53299 - 44032: 0xB446,\n\t53300 - 44032: 0xC4FB,\n\t53301 - 44032: 0xC4FC,\n\t53302 - 44032: 0xB447,\n\t53303 - 44032: 0xB448,\n\t53304 - 44032: 0xC4FD,\n\t53305 - 44032: 0xB449,\n\t53306 - 44032: 0xB44A,\n\t53307 - 44032: 0xB44B,\n\t53308 - 44032: 0xC4FE,\n\t53309 - 44032: 0xB44C,\n\t53310 - 44032: 0xB44D,\n\t53311 - 44032: 0xB44E,\n\t53312 - 44032: 0xB44F,\n\t53313 - 44032: 0xB450,\n\t53314 - 44032: 0xB451,\n\t53315 - 44032: 0xB452,\n\t53316 - 44032: 0xC5A1,\n\t53317 - 44032: 0xC5A2,\n\t53318 - 44032: 0xB453,\n\t53319 - 44032: 0xC5A3,\n\t53320 - 44032: 0xB454,\n\t53321 - 44032: 0xC5A4,\n\t53322 - 44032: 0xB455,\n\t53323 - 44032: 0xB456,\n\t53324 - 44032: 0xB457,\n\t53325 - 44032: 0xB458,\n\t53326 - 44032: 0xB459,\n\t53327 - 44032: 0xB45A,\n\t53328 - 44032: 0xC5A5,\n\t53329 - 44032: 0xB461,\n\t53330 - 44032: 0xB462,\n\t53331 - 44032: 0xB463,\n\t53332 - 44032: 0xC5A6,\n\t53333 - 44032: 0xB464,\n\t53334 - 44032: 0xB465,\n\t53335 - 44032: 0xB466,\n\t53336 - 44032: 0xC5A7,\n\t53337 - 44032: 0xB467,\n\t53338 - 44032: 0xB468,\n\t53339 - 44032: 0xB469,\n\t53340 - 44032: 0xB46A,\n\t53341 - 44032: 0xB46B,\n\t53342 - 44032: 0xB46C,\n\t53343 - 44032: 0xB46D,\n\t53344 - 44032: 0xC5A8,\n\t53345 - 44032: 0xB46E,\n\t53346 - 44032: 0xB46F,\n\t53347 - 44032: 0xB470,\n\t53348 - 44032: 0xB471,\n\t53349 - 44032: 0xB472,\n\t53350 - 44032: 0xB473,\n\t53351 - 44032: 0xB474,\n\t53352 - 44032: 0xB475,\n\t53353 - 44032: 0xB476,\n\t53354 - 44032: 0xB477,\n\t53355 - 44032: 0xB478,\n\t53356 - 44032: 0xC5A9,\n\t53357 - 44032: 0xC5AA,\n\t53358 - 44032: 0xB479,\n\t53359 - 44032: 0xB47A,\n\t53360 - 44032: 0xC5AB,\n\t53361 - 44032: 0xB481,\n\t53362 - 44032: 0xB482,\n\t53363 - 44032: 0xB483,\n\t53364 - 44032: 0xC5AC,\n\t53365 - 44032: 0xB484,\n\t53366 - 44032: 0xB485,\n\t53367 - 44032: 0xB486,\n\t53368 - 44032: 0xB487,\n\t53369 - 44032: 0xB488,\n\t53370 - 44032: 0xB489,\n\t53371 - 44032: 0xB48A,\n\t53372 - 44032: 0xC5AD,\n\t53373 - 44032: 0xC5AE,\n\t53374 - 44032: 0xB48B,\n\t53375 - 44032: 0xB48C,\n\t53376 - 44032: 0xB48D,\n\t53377 - 44032: 0xC5AF,\n\t53378 - 44032: 0xB48E,\n\t53379 - 44032: 0xB48F,\n\t53380 - 44032: 0xB490,\n\t53381 - 44032: 0xB491,\n\t53382 - 44032: 0xB492,\n\t53383 - 44032: 0xB493,\n\t53384 - 44032: 0xB494,\n\t53385 - 44032: 0xB495,\n\t53386 - 44032: 0xB496,\n\t53387 - 44032: 0xB497,\n\t53388 - 44032: 0xB498,\n\t53389 - 44032: 0xB499,\n\t53390 - 44032: 0xB49A,\n\t53391 - 44032: 0xB49B,\n\t53392 - 44032: 0xB49C,\n\t53393 - 44032: 0xB49D,\n\t53394 - 44032: 0xB49E,\n\t53395 - 44032: 0xB49F,\n\t53396 - 44032: 0xB4A0,\n\t53397 - 44032: 0xB541,\n\t53398 - 44032: 0xB542,\n\t53399 - 44032: 0xB543,\n\t53400 - 44032: 0xB544,\n\t53401 - 44032: 0xB545,\n\t53402 - 44032: 0xB546,\n\t53403 - 44032: 0xB547,\n\t53404 - 44032: 0xB548,\n\t53405 - 44032: 0xB549,\n\t53406 - 44032: 0xB54A,\n\t53407 - 44032: 0xB54B,\n\t53408 - 44032: 0xB54C,\n\t53409 - 44032: 0xB54D,\n\t53410 - 44032: 0xB54E,\n\t53411 - 44032: 0xB54F,\n\t53412 - 44032: 0xC5B0,\n\t53413 - 44032: 0xC5B1,\n\t53414 - 44032: 0xB550,\n\t53415 - 44032: 0xB551,\n\t53416 - 44032: 0xC5B2,\n\t53417 - 44032: 0xB552,\n\t53418 - 44032: 0xB553,\n\t53419 - 44032: 0xB554,\n\t53420 - 44032: 0xC5B3,\n\t53421 - 44032: 0xB555,\n\t53422 - 44032: 0xB556,\n\t53423 - 44032: 0xB557,\n\t53424 - 44032: 0xB558,\n\t53425 - 44032: 0xB559,\n\t53426 - 44032: 0xB55A,\n\t53427 - 44032: 0xB561,\n\t53428 - 44032: 0xC5B4,\n\t53429 - 44032: 0xC5B5,\n\t53430 - 44032: 0xB562,\n\t53431 - 44032: 0xC5B6,\n\t53432 - 44032: 0xB563,\n\t53433 - 44032: 0xC5B7,\n\t53434 - 44032: 0xB564,\n\t53435 - 44032: 0xB565,\n\t53436 - 44032: 0xB566,\n\t53437 - 44032: 0xB567,\n\t53438 - 44032: 0xB568,\n\t53439 - 44032: 0xB569,\n\t53440 - 44032: 0xC5B8,\n\t53441 - 44032: 0xC5B9,\n\t53442 - 44032: 0xB56A,\n\t53443 - 44032: 0xB56B,\n\t53444 - 44032: 0xC5BA,\n\t53445 - 44032: 0xB56C,\n\t53446 - 44032: 0xB56D,\n\t53447 - 44032: 0xB56E,\n\t53448 - 44032: 0xC5BB,\n\t53449 - 44032: 0xC5BC,\n\t53450 - 44032: 0xB56F,\n\t53451 - 44032: 0xB570,\n\t53452 - 44032: 0xB571,\n\t53453 - 44032: 0xB572,\n\t53454 - 44032: 0xB573,\n\t53455 - 44032: 0xB574,\n\t53456 - 44032: 0xC5BD,\n\t53457 - 44032: 0xC5BE,\n\t53458 - 44032: 0xB575,\n\t53459 - 44032: 0xC5BF,\n\t53460 - 44032: 0xC5C0,\n\t53461 - 44032: 0xC5C1,\n\t53462 - 44032: 0xB576,\n\t53463 - 44032: 0xB577,\n\t53464 - 44032: 0xB578,\n\t53465 - 44032: 0xB579,\n\t53466 - 44032: 0xB57A,\n\t53467 - 44032: 0xB581,\n\t53468 - 44032: 0xC5C2,\n\t53469 - 44032: 0xC5C3,\n\t53470 - 44032: 0xB582,\n\t53471 - 44032: 0xB583,\n\t53472 - 44032: 0xC5C4,\n\t53473 - 44032: 0xB584,\n\t53474 - 44032: 0xB585,\n\t53475 - 44032: 0xB586,\n\t53476 - 44032: 0xC5C5,\n\t53477 - 44032: 0xB587,\n\t53478 - 44032: 0xB588,\n\t53479 - 44032: 0xB589,\n\t53480 - 44032: 0xB58A,\n\t53481 - 44032: 0xB58B,\n\t53482 - 44032: 0xB58C,\n\t53483 - 44032: 0xB58D,\n\t53484 - 44032: 0xC5C6,\n\t53485 - 44032: 0xC5C7,\n\t53486 - 44032: 0xB58E,\n\t53487 - 44032: 0xC5C8,\n\t53488 - 44032: 0xC5C9,\n\t53489 - 44032: 0xC5CA,\n\t53490 - 44032: 0xB58F,\n\t53491 - 44032: 0xB590,\n\t53492 - 44032: 0xB591,\n\t53493 - 44032: 0xB592,\n\t53494 - 44032: 0xB593,\n\t53495 - 44032: 0xB594,\n\t53496 - 44032: 0xC5CB,\n\t53497 - 44032: 0xB595,\n\t53498 - 44032: 0xB596,\n\t53499 - 44032: 0xB597,\n\t53500 - 44032: 0xB598,\n\t53501 - 44032: 0xB599,\n\t53502 - 44032: 0xB59A,\n\t53503 - 44032: 0xB59B,\n\t53504 - 44032: 0xB59C,\n\t53505 - 44032: 0xB59D,\n\t53506 - 44032: 0xB59E,\n\t53507 - 44032: 0xB59F,\n\t53508 - 44032: 0xB5A0,\n\t53509 - 44032: 0xB641,\n\t53510 - 44032: 0xB642,\n\t53511 - 44032: 0xB643,\n\t53512 - 44032: 0xB644,\n\t53513 - 44032: 0xB645,\n\t53514 - 44032: 0xB646,\n\t53515 - 44032: 0xB647,\n\t53516 - 44032: 0xB648,\n\t53517 - 44032: 0xC5CC,\n\t53518 - 44032: 0xB649,\n\t53519 - 44032: 0xB64A,\n\t53520 - 44032: 0xB64B,\n\t53521 - 44032: 0xB64C,\n\t53522 - 44032: 0xB64D,\n\t53523 - 44032: 0xB64E,\n\t53524 - 44032: 0xB64F,\n\t53525 - 44032: 0xB650,\n\t53526 - 44032: 0xB651,\n\t53527 - 44032: 0xB652,\n\t53528 - 44032: 0xB653,\n\t53529 - 44032: 0xB654,\n\t53530 - 44032: 0xB655,\n\t53531 - 44032: 0xB656,\n\t53532 - 44032: 0xB657,\n\t53533 - 44032: 0xB658,\n\t53534 - 44032: 0xB659,\n\t53535 - 44032: 0xB65A,\n\t53536 - 44032: 0xB661,\n\t53537 - 44032: 0xB662,\n\t53538 - 44032: 0xB663,\n\t53539 - 44032: 0xB664,\n\t53540 - 44032: 0xB665,\n\t53541 - 44032: 0xB666,\n\t53542 - 44032: 0xB667,\n\t53543 - 44032: 0xB668,\n\t53544 - 44032: 0xB669,\n\t53545 - 44032: 0xB66A,\n\t53546 - 44032: 0xB66B,\n\t53547 - 44032: 0xB66C,\n\t53548 - 44032: 0xB66D,\n\t53549 - 44032: 0xB66E,\n\t53550 - 44032: 0xB66F,\n\t53551 - 44032: 0xB670,\n\t53552 - 44032: 0xC5CD,\n\t53553 - 44032: 0xC5CE,\n\t53554 - 44032: 0xB671,\n\t53555 - 44032: 0xB672,\n\t53556 - 44032: 0xC5CF,\n\t53557 - 44032: 0xB673,\n\t53558 - 44032: 0xB674,\n\t53559 - 44032: 0xB675,\n\t53560 - 44032: 0xC5D0,\n\t53561 - 44032: 0xB676,\n\t53562 - 44032: 0xC5D1,\n\t53563 - 44032: 0xB677,\n\t53564 - 44032: 0xB678,\n\t53565 - 44032: 0xB679,\n\t53566 - 44032: 0xB67A,\n\t53567 - 44032: 0xB681,\n\t53568 - 44032: 0xC5D2,\n\t53569 - 44032: 0xC5D3,\n\t53570 - 44032: 0xB682,\n\t53571 - 44032: 0xC5D4,\n\t53572 - 44032: 0xC5D5,\n\t53573 - 44032: 0xC5D6,\n\t53574 - 44032: 0xB683,\n\t53575 - 44032: 0xB684,\n\t53576 - 44032: 0xB685,\n\t53577 - 44032: 0xB686,\n\t53578 - 44032: 0xB687,\n\t53579 - 44032: 0xB688,\n\t53580 - 44032: 0xC5D7,\n\t53581 - 44032: 0xC5D8,\n\t53582 - 44032: 0xB689,\n\t53583 - 44032: 0xB68A,\n\t53584 - 44032: 0xC5D9,\n\t53585 - 44032: 0xB68B,\n\t53586 - 44032: 0xB68C,\n\t53587 - 44032: 0xB68D,\n\t53588 - 44032: 0xC5DA,\n\t53589 - 44032: 0xB68E,\n\t53590 - 44032: 0xB68F,\n\t53591 - 44032: 0xB690,\n\t53592 - 44032: 0xB691,\n\t53593 - 44032: 0xB692,\n\t53594 - 44032: 0xB693,\n\t53595 - 44032: 0xB694,\n\t53596 - 44032: 0xC5DB,\n\t53597 - 44032: 0xC5DC,\n\t53598 - 44032: 0xB695,\n\t53599 - 44032: 0xC5DD,\n\t53600 - 44032: 0xB696,\n\t53601 - 44032: 0xC5DE,\n\t53602 - 44032: 0xB697,\n\t53603 - 44032: 0xB698,\n\t53604 - 44032: 0xB699,\n\t53605 - 44032: 0xB69A,\n\t53606 - 44032: 0xB69B,\n\t53607 - 44032: 0xB69C,\n\t53608 - 44032: 0xC5DF,\n\t53609 - 44032: 0xB69D,\n\t53610 - 44032: 0xB69E,\n\t53611 - 44032: 0xB69F,\n\t53612 - 44032: 0xC5E0,\n\t53613 - 44032: 0xB6A0,\n\t53614 - 44032: 0xB741,\n\t53615 - 44032: 0xB742,\n\t53616 - 44032: 0xB743,\n\t53617 - 44032: 0xB744,\n\t53618 - 44032: 0xB745,\n\t53619 - 44032: 0xB746,\n\t53620 - 44032: 0xB747,\n\t53621 - 44032: 0xB748,\n\t53622 - 44032: 0xB749,\n\t53623 - 44032: 0xB74A,\n\t53624 - 44032: 0xB74B,\n\t53625 - 44032: 0xB74C,\n\t53626 - 44032: 0xB74D,\n\t53627 - 44032: 0xB74E,\n\t53628 - 44032: 0xC5E1,\n\t53629 - 44032: 0xB74F,\n\t53630 - 44032: 0xB750,\n\t53631 - 44032: 0xB751,\n\t53632 - 44032: 0xB752,\n\t53633 - 44032: 0xB753,\n\t53634 - 44032: 0xB754,\n\t53635 - 44032: 0xB755,\n\t53636 - 44032: 0xC5E2,\n\t53637 - 44032: 0xB756,\n\t53638 - 44032: 0xB757,\n\t53639 - 44032: 0xB758,\n\t53640 - 44032: 0xC5E3,\n\t53641 - 44032: 0xB759,\n\t53642 - 44032: 0xB75A,\n\t53643 - 44032: 0xB761,\n\t53644 - 44032: 0xB762,\n\t53645 - 44032: 0xB763,\n\t53646 - 44032: 0xB764,\n\t53647 - 44032: 0xB765,\n\t53648 - 44032: 0xB766,\n\t53649 - 44032: 0xB767,\n\t53650 - 44032: 0xB768,\n\t53651 - 44032: 0xB769,\n\t53652 - 44032: 0xB76A,\n\t53653 - 44032: 0xB76B,\n\t53654 - 44032: 0xB76C,\n\t53655 - 44032: 0xB76D,\n\t53656 - 44032: 0xB76E,\n\t53657 - 44032: 0xB76F,\n\t53658 - 44032: 0xB770,\n\t53659 - 44032: 0xB771,\n\t53660 - 44032: 0xB772,\n\t53661 - 44032: 0xB773,\n\t53662 - 44032: 0xB774,\n\t53663 - 44032: 0xB775,\n\t53664 - 44032: 0xC5E4,\n\t53665 - 44032: 0xC5E5,\n\t53666 - 44032: 0xB776,\n\t53667 - 44032: 0xB777,\n\t53668 - 44032: 0xC5E6,\n\t53669 - 44032: 0xB778,\n\t53670 - 44032: 0xB779,\n\t53671 - 44032: 0xB77A,\n\t53672 - 44032: 0xC5E7,\n\t53673 - 44032: 0xB781,\n\t53674 - 44032: 0xB782,\n\t53675 - 44032: 0xB783,\n\t53676 - 44032: 0xB784,\n\t53677 - 44032: 0xB785,\n\t53678 - 44032: 0xB786,\n\t53679 - 44032: 0xB787,\n\t53680 - 44032: 0xC5E8,\n\t53681 - 44032: 0xC5E9,\n\t53682 - 44032: 0xB788,\n\t53683 - 44032: 0xC5EA,\n\t53684 - 44032: 0xB789,\n\t53685 - 44032: 0xC5EB,\n\t53686 - 44032: 0xB78A,\n\t53687 - 44032: 0xB78B,\n\t53688 - 44032: 0xB78C,\n\t53689 - 44032: 0xB78D,\n\t53690 - 44032: 0xC5EC,\n\t53691 - 44032: 0xB78E,\n\t53692 - 44032: 0xC5ED,\n\t53693 - 44032: 0xB78F,\n\t53694 - 44032: 0xB790,\n\t53695 - 44032: 0xB791,\n\t53696 - 44032: 0xC5EE,\n\t53697 - 44032: 0xB792,\n\t53698 - 44032: 0xB793,\n\t53699 - 44032: 0xB794,\n\t53700 - 44032: 0xB795,\n\t53701 - 44032: 0xB796,\n\t53702 - 44032: 0xB797,\n\t53703 - 44032: 0xB798,\n\t53704 - 44032: 0xB799,\n\t53705 - 44032: 0xB79A,\n\t53706 - 44032: 0xB79B,\n\t53707 - 44032: 0xB79C,\n\t53708 - 44032: 0xB79D,\n\t53709 - 44032: 0xB79E,\n\t53710 - 44032: 0xB79F,\n\t53711 - 44032: 0xB7A0,\n\t53712 - 44032: 0xB841,\n\t53713 - 44032: 0xB842,\n\t53714 - 44032: 0xB843,\n\t53715 - 44032: 0xB844,\n\t53716 - 44032: 0xB845,\n\t53717 - 44032: 0xB846,\n\t53718 - 44032: 0xB847,\n\t53719 - 44032: 0xB848,\n\t53720 - 44032: 0xC5EF,\n\t53721 - 44032: 0xB849,\n\t53722 - 44032: 0xB84A,\n\t53723 - 44032: 0xB84B,\n\t53724 - 44032: 0xB84C,\n\t53725 - 44032: 0xB84D,\n\t53726 - 44032: 0xB84E,\n\t53727 - 44032: 0xB84F,\n\t53728 - 44032: 0xB850,\n\t53729 - 44032: 0xB851,\n\t53730 - 44032: 0xB852,\n\t53731 - 44032: 0xB853,\n\t53732 - 44032: 0xB854,\n\t53733 - 44032: 0xB855,\n\t53734 - 44032: 0xB856,\n\t53735 - 44032: 0xB857,\n\t53736 - 44032: 0xB858,\n\t53737 - 44032: 0xB859,\n\t53738 - 44032: 0xB85A,\n\t53739 - 44032: 0xB861,\n\t53740 - 44032: 0xB862,\n\t53741 - 44032: 0xB863,\n\t53742 - 44032: 0xB864,\n\t53743 - 44032: 0xB865,\n\t53744 - 44032: 0xB866,\n\t53745 - 44032: 0xB867,\n\t53746 - 44032: 0xB868,\n\t53747 - 44032: 0xB869,\n\t53748 - 44032: 0xC5F0,\n\t53749 - 44032: 0xB86A,\n\t53750 - 44032: 0xB86B,\n\t53751 - 44032: 0xB86C,\n\t53752 - 44032: 0xC5F1,\n\t53753 - 44032: 0xB86D,\n\t53754 - 44032: 0xB86E,\n\t53755 - 44032: 0xB86F,\n\t53756 - 44032: 0xB870,\n\t53757 - 44032: 0xB871,\n\t53758 - 44032: 0xB872,\n\t53759 - 44032: 0xB873,\n\t53760 - 44032: 0xB874,\n\t53761 - 44032: 0xB875,\n\t53762 - 44032: 0xB876,\n\t53763 - 44032: 0xB877,\n\t53764 - 44032: 0xB878,\n\t53765 - 44032: 0xB879,\n\t53766 - 44032: 0xB87A,\n\t53767 - 44032: 0xC5F2,\n\t53768 - 44032: 0xB881,\n\t53769 - 44032: 0xC5F3,\n\t53770 - 44032: 0xB882,\n\t53771 - 44032: 0xB883,\n\t53772 - 44032: 0xB884,\n\t53773 - 44032: 0xB885,\n\t53774 - 44032: 0xB886,\n\t53775 - 44032: 0xB887,\n\t53776 - 44032: 0xC5F4,\n\t53777 - 44032: 0xB888,\n\t53778 - 44032: 0xB889,\n\t53779 - 44032: 0xB88A,\n\t53780 - 44032: 0xB88B,\n\t53781 - 44032: 0xB88C,\n\t53782 - 44032: 0xB88D,\n\t53783 - 44032: 0xB88E,\n\t53784 - 44032: 0xB88F,\n\t53785 - 44032: 0xB890,\n\t53786 - 44032: 0xB891,\n\t53787 - 44032: 0xB892,\n\t53788 - 44032: 0xB893,\n\t53789 - 44032: 0xB894,\n\t53790 - 44032: 0xB895,\n\t53791 - 44032: 0xB896,\n\t53792 - 44032: 0xB897,\n\t53793 - 44032: 0xB898,\n\t53794 - 44032: 0xB899,\n\t53795 - 44032: 0xB89A,\n\t53796 - 44032: 0xB89B,\n\t53797 - 44032: 0xB89C,\n\t53798 - 44032: 0xB89D,\n\t53799 - 44032: 0xB89E,\n\t53800 - 44032: 0xB89F,\n\t53801 - 44032: 0xB8A0,\n\t53802 - 44032: 0xB941,\n\t53803 - 44032: 0xB942,\n\t53804 - 44032: 0xC5F5,\n\t53805 - 44032: 0xC5F6,\n\t53806 - 44032: 0xB943,\n\t53807 - 44032: 0xB944,\n\t53808 - 44032: 0xC5F7,\n\t53809 - 44032: 0xB945,\n\t53810 - 44032: 0xB946,\n\t53811 - 44032: 0xB947,\n\t53812 - 44032: 0xC5F8,\n\t53813 - 44032: 0xB948,\n\t53814 - 44032: 0xB949,\n\t53815 - 44032: 0xB94A,\n\t53816 - 44032: 0xB94B,\n\t53817 - 44032: 0xB94C,\n\t53818 - 44032: 0xB94D,\n\t53819 - 44032: 0xB94E,\n\t53820 - 44032: 0xC5F9,\n\t53821 - 44032: 0xC5FA,\n\t53822 - 44032: 0xB94F,\n\t53823 - 44032: 0xC5FB,\n\t53824 - 44032: 0xB950,\n\t53825 - 44032: 0xC5FC,\n\t53826 - 44032: 0xB951,\n\t53827 - 44032: 0xB952,\n\t53828 - 44032: 0xB953,\n\t53829 - 44032: 0xB954,\n\t53830 - 44032: 0xB955,\n\t53831 - 44032: 0xB956,\n\t53832 - 44032: 0xC5FD,\n\t53833 - 44032: 0xB957,\n\t53834 - 44032: 0xB958,\n\t53835 - 44032: 0xB959,\n\t53836 - 44032: 0xB95A,\n\t53837 - 44032: 0xB961,\n\t53838 - 44032: 0xB962,\n\t53839 - 44032: 0xB963,\n\t53840 - 44032: 0xB964,\n\t53841 - 44032: 0xB965,\n\t53842 - 44032: 0xB966,\n\t53843 - 44032: 0xB967,\n\t53844 - 44032: 0xB968,\n\t53845 - 44032: 0xB969,\n\t53846 - 44032: 0xB96A,\n\t53847 - 44032: 0xB96B,\n\t53848 - 44032: 0xB96C,\n\t53849 - 44032: 0xB96D,\n\t53850 - 44032: 0xB96E,\n\t53851 - 44032: 0xB96F,\n\t53852 - 44032: 0xC5FE,\n\t53853 - 44032: 0xB970,\n\t53854 - 44032: 0xB971,\n\t53855 - 44032: 0xB972,\n\t53856 - 44032: 0xB973,\n\t53857 - 44032: 0xB974,\n\t53858 - 44032: 0xB975,\n\t53859 - 44032: 0xB976,\n\t53860 - 44032: 0xC6A1,\n\t53861 - 44032: 0xB977,\n\t53862 - 44032: 0xB978,\n\t53863 - 44032: 0xB979,\n\t53864 - 44032: 0xB97A,\n\t53865 - 44032: 0xB981,\n\t53866 - 44032: 0xB982,\n\t53867 - 44032: 0xB983,\n\t53868 - 44032: 0xB984,\n\t53869 - 44032: 0xB985,\n\t53870 - 44032: 0xB986,\n\t53871 - 44032: 0xB987,\n\t53872 - 44032: 0xB988,\n\t53873 - 44032: 0xB989,\n\t53874 - 44032: 0xB98A,\n\t53875 - 44032: 0xB98B,\n\t53876 - 44032: 0xB98C,\n\t53877 - 44032: 0xB98D,\n\t53878 - 44032: 0xB98E,\n\t53879 - 44032: 0xB98F,\n\t53880 - 44032: 0xB990,\n\t53881 - 44032: 0xB991,\n\t53882 - 44032: 0xB992,\n\t53883 - 44032: 0xB993,\n\t53884 - 44032: 0xB994,\n\t53885 - 44032: 0xB995,\n\t53886 - 44032: 0xB996,\n\t53887 - 44032: 0xB997,\n\t53888 - 44032: 0xC6A2,\n\t53889 - 44032: 0xC6A3,\n\t53890 - 44032: 0xB998,\n\t53891 - 44032: 0xB999,\n\t53892 - 44032: 0xC6A4,\n\t53893 - 44032: 0xB99A,\n\t53894 - 44032: 0xB99B,\n\t53895 - 44032: 0xB99C,\n\t53896 - 44032: 0xC6A5,\n\t53897 - 44032: 0xB99D,\n\t53898 - 44032: 0xB99E,\n\t53899 - 44032: 0xB99F,\n\t53900 - 44032: 0xB9A0,\n\t53901 - 44032: 0xBA41,\n\t53902 - 44032: 0xBA42,\n\t53903 - 44032: 0xBA43,\n\t53904 - 44032: 0xC6A6,\n\t53905 - 44032: 0xC6A7,\n\t53906 - 44032: 0xBA44,\n\t53907 - 44032: 0xBA45,\n\t53908 - 44032: 0xBA46,\n\t53909 - 44032: 0xC6A8,\n\t53910 - 44032: 0xBA47,\n\t53911 - 44032: 0xBA48,\n\t53912 - 44032: 0xBA49,\n\t53913 - 44032: 0xBA4A,\n\t53914 - 44032: 0xBA4B,\n\t53915 - 44032: 0xBA4C,\n\t53916 - 44032: 0xC6A9,\n\t53917 - 44032: 0xBA4D,\n\t53918 - 44032: 0xBA4E,\n\t53919 - 44032: 0xBA4F,\n\t53920 - 44032: 0xC6AA,\n\t53921 - 44032: 0xBA50,\n\t53922 - 44032: 0xBA51,\n\t53923 - 44032: 0xBA52,\n\t53924 - 44032: 0xC6AB,\n\t53925 - 44032: 0xBA53,\n\t53926 - 44032: 0xBA54,\n\t53927 - 44032: 0xBA55,\n\t53928 - 44032: 0xBA56,\n\t53929 - 44032: 0xBA57,\n\t53930 - 44032: 0xBA58,\n\t53931 - 44032: 0xBA59,\n\t53932 - 44032: 0xC6AC,\n\t53933 - 44032: 0xBA5A,\n\t53934 - 44032: 0xBA61,\n\t53935 - 44032: 0xBA62,\n\t53936 - 44032: 0xBA63,\n\t53937 - 44032: 0xC6AD,\n\t53938 - 44032: 0xBA64,\n\t53939 - 44032: 0xBA65,\n\t53940 - 44032: 0xBA66,\n\t53941 - 44032: 0xBA67,\n\t53942 - 44032: 0xBA68,\n\t53943 - 44032: 0xBA69,\n\t53944 - 44032: 0xC6AE,\n\t53945 - 44032: 0xC6AF,\n\t53946 - 44032: 0xBA6A,\n\t53947 - 44032: 0xBA6B,\n\t53948 - 44032: 0xC6B0,\n\t53949 - 44032: 0xBA6C,\n\t53950 - 44032: 0xBA6D,\n\t53951 - 44032: 0xC6B1,\n\t53952 - 44032: 0xC6B2,\n\t53953 - 44032: 0xBA6E,\n\t53954 - 44032: 0xC6B3,\n\t53955 - 44032: 0xBA6F,\n\t53956 - 44032: 0xBA70,\n\t53957 - 44032: 0xBA71,\n\t53958 - 44032: 0xBA72,\n\t53959 - 44032: 0xBA73,\n\t53960 - 44032: 0xC6B4,\n\t53961 - 44032: 0xC6B5,\n\t53962 - 44032: 0xBA74,\n\t53963 - 44032: 0xC6B6,\n\t53964 - 44032: 0xBA75,\n\t53965 - 44032: 0xBA76,\n\t53966 - 44032: 0xBA77,\n\t53967 - 44032: 0xBA78,\n\t53968 - 44032: 0xBA79,\n\t53969 - 44032: 0xBA7A,\n\t53970 - 44032: 0xBA81,\n\t53971 - 44032: 0xBA82,\n\t53972 - 44032: 0xC6B7,\n\t53973 - 44032: 0xBA83,\n\t53974 - 44032: 0xBA84,\n\t53975 - 44032: 0xBA85,\n\t53976 - 44032: 0xC6B8,\n\t53977 - 44032: 0xBA86,\n\t53978 - 44032: 0xBA87,\n\t53979 - 44032: 0xBA88,\n\t53980 - 44032: 0xC6B9,\n\t53981 - 44032: 0xBA89,\n\t53982 - 44032: 0xBA8A,\n\t53983 - 44032: 0xBA8B,\n\t53984 - 44032: 0xBA8C,\n\t53985 - 44032: 0xBA8D,\n\t53986 - 44032: 0xBA8E,\n\t53987 - 44032: 0xBA8F,\n\t53988 - 44032: 0xC6BA,\n\t53989 - 44032: 0xC6BB,\n\t53990 - 44032: 0xBA90,\n\t53991 - 44032: 0xBA91,\n\t53992 - 44032: 0xBA92,\n\t53993 - 44032: 0xBA93,\n\t53994 - 44032: 0xBA94,\n\t53995 - 44032: 0xBA95,\n\t53996 - 44032: 0xBA96,\n\t53997 - 44032: 0xBA97,\n\t53998 - 44032: 0xBA98,\n\t53999 - 44032: 0xBA99,\n\t54000 - 44032: 0xC6BC,\n\t54001 - 44032: 0xC6BD,\n\t54002 - 44032: 0xBA9A,\n\t54003 - 44032: 0xBA9B,\n\t54004 - 44032: 0xC6BE,\n\t54005 - 44032: 0xBA9C,\n\t54006 - 44032: 0xBA9D,\n\t54007 - 44032: 0xBA9E,\n\t54008 - 44032: 0xC6BF,\n\t54009 - 44032: 0xBA9F,\n\t54010 - 44032: 0xBAA0,\n\t54011 - 44032: 0xBB41,\n\t54012 - 44032: 0xBB42,\n\t54013 - 44032: 0xBB43,\n\t54014 - 44032: 0xBB44,\n\t54015 - 44032: 0xBB45,\n\t54016 - 44032: 0xC6C0,\n\t54017 - 44032: 0xC6C1,\n\t54018 - 44032: 0xBB46,\n\t54019 - 44032: 0xC6C2,\n\t54020 - 44032: 0xBB47,\n\t54021 - 44032: 0xC6C3,\n\t54022 - 44032: 0xBB48,\n\t54023 - 44032: 0xBB49,\n\t54024 - 44032: 0xBB4A,\n\t54025 - 44032: 0xBB4B,\n\t54026 - 44032: 0xBB4C,\n\t54027 - 44032: 0xBB4D,\n\t54028 - 44032: 0xC6C4,\n\t54029 - 44032: 0xC6C5,\n\t54030 - 44032: 0xC6C6,\n\t54031 - 44032: 0xBB4E,\n\t54032 - 44032: 0xC6C7,\n\t54033 - 44032: 0xBB4F,\n\t54034 - 44032: 0xBB50,\n\t54035 - 44032: 0xBB51,\n\t54036 - 44032: 0xC6C8,\n\t54037 - 44032: 0xBB52,\n\t54038 - 44032: 0xC6C9,\n\t54039 - 44032: 0xBB53,\n\t54040 - 44032: 0xBB54,\n\t54041 - 44032: 0xBB55,\n\t54042 - 44032: 0xBB56,\n\t54043 - 44032: 0xBB57,\n\t54044 - 44032: 0xC6CA,\n\t54045 - 44032: 0xC6CB,\n\t54046 - 44032: 0xBB58,\n\t54047 - 44032: 0xC6CC,\n\t54048 - 44032: 0xC6CD,\n\t54049 - 44032: 0xC6CE,\n\t54050 - 44032: 0xBB59,\n\t54051 - 44032: 0xBB5A,\n\t54052 - 44032: 0xBB61,\n\t54053 - 44032: 0xC6CF,\n\t54054 - 44032: 0xBB62,\n\t54055 - 44032: 0xBB63,\n\t54056 - 44032: 0xC6D0,\n\t54057 - 44032: 0xC6D1,\n\t54058 - 44032: 0xBB64,\n\t54059 - 44032: 0xBB65,\n\t54060 - 44032: 0xC6D2,\n\t54061 - 44032: 0xBB66,\n\t54062 - 44032: 0xBB67,\n\t54063 - 44032: 0xBB68,\n\t54064 - 44032: 0xC6D3,\n\t54065 - 44032: 0xBB69,\n\t54066 - 44032: 0xBB6A,\n\t54067 - 44032: 0xBB6B,\n\t54068 - 44032: 0xBB6C,\n\t54069 - 44032: 0xBB6D,\n\t54070 - 44032: 0xBB6E,\n\t54071 - 44032: 0xBB6F,\n\t54072 - 44032: 0xC6D4,\n\t54073 - 44032: 0xC6D5,\n\t54074 - 44032: 0xBB70,\n\t54075 - 44032: 0xC6D6,\n\t54076 - 44032: 0xC6D7,\n\t54077 - 44032: 0xC6D8,\n\t54078 - 44032: 0xBB71,\n\t54079 - 44032: 0xBB72,\n\t54080 - 44032: 0xBB73,\n\t54081 - 44032: 0xBB74,\n\t54082 - 44032: 0xBB75,\n\t54083 - 44032: 0xBB76,\n\t54084 - 44032: 0xC6D9,\n\t54085 - 44032: 0xC6DA,\n\t54086 - 44032: 0xBB77,\n\t54087 - 44032: 0xBB78,\n\t54088 - 44032: 0xBB79,\n\t54089 - 44032: 0xBB7A,\n\t54090 - 44032: 0xBB81,\n\t54091 - 44032: 0xBB82,\n\t54092 - 44032: 0xBB83,\n\t54093 - 44032: 0xBB84,\n\t54094 - 44032: 0xBB85,\n\t54095 - 44032: 0xBB86,\n\t54096 - 44032: 0xBB87,\n\t54097 - 44032: 0xBB88,\n\t54098 - 44032: 0xBB89,\n\t54099 - 44032: 0xBB8A,\n\t54100 - 44032: 0xBB8B,\n\t54101 - 44032: 0xBB8C,\n\t54102 - 44032: 0xBB8D,\n\t54103 - 44032: 0xBB8E,\n\t54104 - 44032: 0xBB8F,\n\t54105 - 44032: 0xBB90,\n\t54106 - 44032: 0xBB91,\n\t54107 - 44032: 0xBB92,\n\t54108 - 44032: 0xBB93,\n\t54109 - 44032: 0xBB94,\n\t54110 - 44032: 0xBB95,\n\t54111 - 44032: 0xBB96,\n\t54112 - 44032: 0xBB97,\n\t54113 - 44032: 0xBB98,\n\t54114 - 44032: 0xBB99,\n\t54115 - 44032: 0xBB9A,\n\t54116 - 44032: 0xBB9B,\n\t54117 - 44032: 0xBB9C,\n\t54118 - 44032: 0xBB9D,\n\t54119 - 44032: 0xBB9E,\n\t54120 - 44032: 0xBB9F,\n\t54121 - 44032: 0xBBA0,\n\t54122 - 44032: 0xBC41,\n\t54123 - 44032: 0xBC42,\n\t54124 - 44032: 0xBC43,\n\t54125 - 44032: 0xBC44,\n\t54126 - 44032: 0xBC45,\n\t54127 - 44032: 0xBC46,\n\t54128 - 44032: 0xBC47,\n\t54129 - 44032: 0xBC48,\n\t54130 - 44032: 0xBC49,\n\t54131 - 44032: 0xBC4A,\n\t54132 - 44032: 0xBC4B,\n\t54133 - 44032: 0xBC4C,\n\t54134 - 44032: 0xBC4D,\n\t54135 - 44032: 0xBC4E,\n\t54136 - 44032: 0xBC4F,\n\t54137 - 44032: 0xBC50,\n\t54138 - 44032: 0xBC51,\n\t54139 - 44032: 0xBC52,\n\t54140 - 44032: 0xC6DB,\n\t54141 - 44032: 0xC6DC,\n\t54142 - 44032: 0xBC53,\n\t54143 - 44032: 0xBC54,\n\t54144 - 44032: 0xC6DD,\n\t54145 - 44032: 0xBC55,\n\t54146 - 44032: 0xBC56,\n\t54147 - 44032: 0xBC57,\n\t54148 - 44032: 0xC6DE,\n\t54149 - 44032: 0xBC58,\n\t54150 - 44032: 0xBC59,\n\t54151 - 44032: 0xBC5A,\n\t54152 - 44032: 0xBC61,\n\t54153 - 44032: 0xBC62,\n\t54154 - 44032: 0xBC63,\n\t54155 - 44032: 0xBC64,\n\t54156 - 44032: 0xC6DF,\n\t54157 - 44032: 0xC6E0,\n\t54158 - 44032: 0xBC65,\n\t54159 - 44032: 0xC6E1,\n\t54160 - 44032: 0xC6E2,\n\t54161 - 44032: 0xC6E3,\n\t54162 - 44032: 0xBC66,\n\t54163 - 44032: 0xBC67,\n\t54164 - 44032: 0xBC68,\n\t54165 - 44032: 0xBC69,\n\t54166 - 44032: 0xBC6A,\n\t54167 - 44032: 0xBC6B,\n\t54168 - 44032: 0xC6E4,\n\t54169 - 44032: 0xC6E5,\n\t54170 - 44032: 0xBC6C,\n\t54171 - 44032: 0xBC6D,\n\t54172 - 44032: 0xC6E6,\n\t54173 - 44032: 0xBC6E,\n\t54174 - 44032: 0xBC6F,\n\t54175 - 44032: 0xBC70,\n\t54176 - 44032: 0xC6E7,\n\t54177 - 44032: 0xBC71,\n\t54178 - 44032: 0xBC72,\n\t54179 - 44032: 0xBC73,\n\t54180 - 44032: 0xBC74,\n\t54181 - 44032: 0xBC75,\n\t54182 - 44032: 0xBC76,\n\t54183 - 44032: 0xBC77,\n\t54184 - 44032: 0xC6E8,\n\t54185 - 44032: 0xC6E9,\n\t54186 - 44032: 0xBC78,\n\t54187 - 44032: 0xC6EA,\n\t54188 - 44032: 0xBC79,\n\t54189 - 44032: 0xC6EB,\n\t54190 - 44032: 0xBC7A,\n\t54191 - 44032: 0xBC81,\n\t54192 - 44032: 0xBC82,\n\t54193 - 44032: 0xBC83,\n\t54194 - 44032: 0xBC84,\n\t54195 - 44032: 0xBC85,\n\t54196 - 44032: 0xC6EC,\n\t54197 - 44032: 0xBC86,\n\t54198 - 44032: 0xBC87,\n\t54199 - 44032: 0xBC88,\n\t54200 - 44032: 0xC6ED,\n\t54201 - 44032: 0xBC89,\n\t54202 - 44032: 0xBC8A,\n\t54203 - 44032: 0xBC8B,\n\t54204 - 44032: 0xC6EE,\n\t54205 - 44032: 0xBC8C,\n\t54206 - 44032: 0xBC8D,\n\t54207 - 44032: 0xBC8E,\n\t54208 - 44032: 0xBC8F,\n\t54209 - 44032: 0xBC90,\n\t54210 - 44032: 0xBC91,\n\t54211 - 44032: 0xBC92,\n\t54212 - 44032: 0xC6EF,\n\t54213 - 44032: 0xC6F0,\n\t54214 - 44032: 0xBC93,\n\t54215 - 44032: 0xBC94,\n\t54216 - 44032: 0xC6F1,\n\t54217 - 44032: 0xC6F2,\n\t54218 - 44032: 0xBC95,\n\t54219 - 44032: 0xBC96,\n\t54220 - 44032: 0xBC97,\n\t54221 - 44032: 0xBC98,\n\t54222 - 44032: 0xBC99,\n\t54223 - 44032: 0xBC9A,\n\t54224 - 44032: 0xC6F3,\n\t54225 - 44032: 0xBC9B,\n\t54226 - 44032: 0xBC9C,\n\t54227 - 44032: 0xBC9D,\n\t54228 - 44032: 0xBC9E,\n\t54229 - 44032: 0xBC9F,\n\t54230 - 44032: 0xBCA0,\n\t54231 - 44032: 0xBD41,\n\t54232 - 44032: 0xC6F4,\n\t54233 - 44032: 0xBD42,\n\t54234 - 44032: 0xBD43,\n\t54235 - 44032: 0xBD44,\n\t54236 - 44032: 0xBD45,\n\t54237 - 44032: 0xBD46,\n\t54238 - 44032: 0xBD47,\n\t54239 - 44032: 0xBD48,\n\t54240 - 44032: 0xBD49,\n\t54241 - 44032: 0xC6F5,\n\t54242 - 44032: 0xBD4A,\n\t54243 - 44032: 0xC6F6,\n\t54244 - 44032: 0xBD4B,\n\t54245 - 44032: 0xBD4C,\n\t54246 - 44032: 0xBD4D,\n\t54247 - 44032: 0xBD4E,\n\t54248 - 44032: 0xBD4F,\n\t54249 - 44032: 0xBD50,\n\t54250 - 44032: 0xBD51,\n\t54251 - 44032: 0xBD52,\n\t54252 - 44032: 0xC6F7,\n\t54253 - 44032: 0xC6F8,\n\t54254 - 44032: 0xBD53,\n\t54255 - 44032: 0xBD54,\n\t54256 - 44032: 0xC6F9,\n\t54257 - 44032: 0xBD55,\n\t54258 - 44032: 0xBD56,\n\t54259 - 44032: 0xBD57,\n\t54260 - 44032: 0xC6FA,\n\t54261 - 44032: 0xBD58,\n\t54262 - 44032: 0xBD59,\n\t54263 - 44032: 0xBD5A,\n\t54264 - 44032: 0xBD61,\n\t54265 - 44032: 0xBD62,\n\t54266 - 44032: 0xBD63,\n\t54267 - 44032: 0xBD64,\n\t54268 - 44032: 0xC6FB,\n\t54269 - 44032: 0xC6FC,\n\t54270 - 44032: 0xBD65,\n\t54271 - 44032: 0xC6FD,\n\t54272 - 44032: 0xBD66,\n\t54273 - 44032: 0xC6FE,\n\t54274 - 44032: 0xBD67,\n\t54275 - 44032: 0xBD68,\n\t54276 - 44032: 0xBD69,\n\t54277 - 44032: 0xBD6A,\n\t54278 - 44032: 0xBD6B,\n\t54279 - 44032: 0xBD6C,\n\t54280 - 44032: 0xC7A1,\n\t54281 - 44032: 0xBD6D,\n\t54282 - 44032: 0xBD6E,\n\t54283 - 44032: 0xBD6F,\n\t54284 - 44032: 0xBD70,\n\t54285 - 44032: 0xBD71,\n\t54286 - 44032: 0xBD72,\n\t54287 - 44032: 0xBD73,\n\t54288 - 44032: 0xBD74,\n\t54289 - 44032: 0xBD75,\n\t54290 - 44032: 0xBD76,\n\t54291 - 44032: 0xBD77,\n\t54292 - 44032: 0xBD78,\n\t54293 - 44032: 0xBD79,\n\t54294 - 44032: 0xBD7A,\n\t54295 - 44032: 0xBD81,\n\t54296 - 44032: 0xBD82,\n\t54297 - 44032: 0xBD83,\n\t54298 - 44032: 0xBD84,\n\t54299 - 44032: 0xBD85,\n\t54300 - 44032: 0xBD86,\n\t54301 - 44032: 0xC7A2,\n\t54302 - 44032: 0xBD87,\n\t54303 - 44032: 0xBD88,\n\t54304 - 44032: 0xBD89,\n\t54305 - 44032: 0xBD8A,\n\t54306 - 44032: 0xBD8B,\n\t54307 - 44032: 0xBD8C,\n\t54308 - 44032: 0xBD8D,\n\t54309 - 44032: 0xBD8E,\n\t54310 - 44032: 0xBD8F,\n\t54311 - 44032: 0xBD90,\n\t54312 - 44032: 0xBD91,\n\t54313 - 44032: 0xBD92,\n\t54314 - 44032: 0xBD93,\n\t54315 - 44032: 0xBD94,\n\t54316 - 44032: 0xBD95,\n\t54317 - 44032: 0xBD96,\n\t54318 - 44032: 0xBD97,\n\t54319 - 44032: 0xBD98,\n\t54320 - 44032: 0xBD99,\n\t54321 - 44032: 0xBD9A,\n\t54322 - 44032: 0xBD9B,\n\t54323 - 44032: 0xBD9C,\n\t54324 - 44032: 0xBD9D,\n\t54325 - 44032: 0xBD9E,\n\t54326 - 44032: 0xBD9F,\n\t54327 - 44032: 0xBDA0,\n\t54328 - 44032: 0xBE41,\n\t54329 - 44032: 0xBE42,\n\t54330 - 44032: 0xBE43,\n\t54331 - 44032: 0xBE44,\n\t54332 - 44032: 0xBE45,\n\t54333 - 44032: 0xBE46,\n\t54334 - 44032: 0xBE47,\n\t54335 - 44032: 0xBE48,\n\t54336 - 44032: 0xC7A3,\n\t54337 - 44032: 0xBE49,\n\t54338 - 44032: 0xBE4A,\n\t54339 - 44032: 0xBE4B,\n\t54340 - 44032: 0xC7A4,\n\t54341 - 44032: 0xBE4C,\n\t54342 - 44032: 0xBE4D,\n\t54343 - 44032: 0xBE4E,\n\t54344 - 44032: 0xBE4F,\n\t54345 - 44032: 0xBE50,\n\t54346 - 44032: 0xBE51,\n\t54347 - 44032: 0xBE52,\n\t54348 - 44032: 0xBE53,\n\t54349 - 44032: 0xBE54,\n\t54350 - 44032: 0xBE55,\n\t54351 - 44032: 0xBE56,\n\t54352 - 44032: 0xBE57,\n\t54353 - 44032: 0xBE58,\n\t54354 - 44032: 0xBE59,\n\t54355 - 44032: 0xBE5A,\n\t54356 - 44032: 0xBE61,\n\t54357 - 44032: 0xBE62,\n\t54358 - 44032: 0xBE63,\n\t54359 - 44032: 0xBE64,\n\t54360 - 44032: 0xBE65,\n\t54361 - 44032: 0xBE66,\n\t54362 - 44032: 0xBE67,\n\t54363 - 44032: 0xBE68,\n\t54364 - 44032: 0xC7A5,\n\t54365 - 44032: 0xBE69,\n\t54366 - 44032: 0xBE6A,\n\t54367 - 44032: 0xBE6B,\n\t54368 - 44032: 0xC7A6,\n\t54369 - 44032: 0xBE6C,\n\t54370 - 44032: 0xBE6D,\n\t54371 - 44032: 0xBE6E,\n\t54372 - 44032: 0xC7A7,\n\t54373 - 44032: 0xBE6F,\n\t54374 - 44032: 0xBE70,\n\t54375 - 44032: 0xBE71,\n\t54376 - 44032: 0xBE72,\n\t54377 - 44032: 0xBE73,\n\t54378 - 44032: 0xBE74,\n\t54379 - 44032: 0xBE75,\n\t54380 - 44032: 0xBE76,\n\t54381 - 44032: 0xC7A8,\n\t54382 - 44032: 0xBE77,\n\t54383 - 44032: 0xC7A9,\n\t54384 - 44032: 0xBE78,\n\t54385 - 44032: 0xBE79,\n\t54386 - 44032: 0xBE7A,\n\t54387 - 44032: 0xBE81,\n\t54388 - 44032: 0xBE82,\n\t54389 - 44032: 0xBE83,\n\t54390 - 44032: 0xBE84,\n\t54391 - 44032: 0xBE85,\n\t54392 - 44032: 0xC7AA,\n\t54393 - 44032: 0xC7AB,\n\t54394 - 44032: 0xBE86,\n\t54395 - 44032: 0xBE87,\n\t54396 - 44032: 0xC7AC,\n\t54397 - 44032: 0xBE88,\n\t54398 - 44032: 0xBE89,\n\t54399 - 44032: 0xC7AD,\n\t54400 - 44032: 0xC7AE,\n\t54401 - 44032: 0xBE8A,\n\t54402 - 44032: 0xC7AF,\n\t54403 - 44032: 0xBE8B,\n\t54404 - 44032: 0xBE8C,\n\t54405 - 44032: 0xBE8D,\n\t54406 - 44032: 0xBE8E,\n\t54407 - 44032: 0xBE8F,\n\t54408 - 44032: 0xC7B0,\n\t54409 - 44032: 0xC7B1,\n\t54410 - 44032: 0xBE90,\n\t54411 - 44032: 0xC7B2,\n\t54412 - 44032: 0xBE91,\n\t54413 - 44032: 0xC7B3,\n\t54414 - 44032: 0xBE92,\n\t54415 - 44032: 0xBE93,\n\t54416 - 44032: 0xBE94,\n\t54417 - 44032: 0xBE95,\n\t54418 - 44032: 0xBE96,\n\t54419 - 44032: 0xBE97,\n\t54420 - 44032: 0xC7B4,\n\t54421 - 44032: 0xBE98,\n\t54422 - 44032: 0xBE99,\n\t54423 - 44032: 0xBE9A,\n\t54424 - 44032: 0xBE9B,\n\t54425 - 44032: 0xBE9C,\n\t54426 - 44032: 0xBE9D,\n\t54427 - 44032: 0xBE9E,\n\t54428 - 44032: 0xBE9F,\n\t54429 - 44032: 0xBEA0,\n\t54430 - 44032: 0xBF41,\n\t54431 - 44032: 0xBF42,\n\t54432 - 44032: 0xBF43,\n\t54433 - 44032: 0xBF44,\n\t54434 - 44032: 0xBF45,\n\t54435 - 44032: 0xBF46,\n\t54436 - 44032: 0xBF47,\n\t54437 - 44032: 0xBF48,\n\t54438 - 44032: 0xBF49,\n\t54439 - 44032: 0xBF4A,\n\t54440 - 44032: 0xBF4B,\n\t54441 - 44032: 0xC7B5,\n\t54442 - 44032: 0xBF4C,\n\t54443 - 44032: 0xBF4D,\n\t54444 - 44032: 0xBF4E,\n\t54445 - 44032: 0xBF4F,\n\t54446 - 44032: 0xBF50,\n\t54447 - 44032: 0xBF51,\n\t54448 - 44032: 0xBF52,\n\t54449 - 44032: 0xBF53,\n\t54450 - 44032: 0xBF54,\n\t54451 - 44032: 0xBF55,\n\t54452 - 44032: 0xBF56,\n\t54453 - 44032: 0xBF57,\n\t54454 - 44032: 0xBF58,\n\t54455 - 44032: 0xBF59,\n\t54456 - 44032: 0xBF5A,\n\t54457 - 44032: 0xBF61,\n\t54458 - 44032: 0xBF62,\n\t54459 - 44032: 0xBF63,\n\t54460 - 44032: 0xBF64,\n\t54461 - 44032: 0xBF65,\n\t54462 - 44032: 0xBF66,\n\t54463 - 44032: 0xBF67,\n\t54464 - 44032: 0xBF68,\n\t54465 - 44032: 0xBF69,\n\t54466 - 44032: 0xBF6A,\n\t54467 - 44032: 0xBF6B,\n\t54468 - 44032: 0xBF6C,\n\t54469 - 44032: 0xBF6D,\n\t54470 - 44032: 0xBF6E,\n\t54471 - 44032: 0xBF6F,\n\t54472 - 44032: 0xBF70,\n\t54473 - 44032: 0xBF71,\n\t54474 - 44032: 0xBF72,\n\t54475 - 44032: 0xBF73,\n\t54476 - 44032: 0xC7B6,\n\t54477 - 44032: 0xBF74,\n\t54478 - 44032: 0xBF75,\n\t54479 - 44032: 0xBF76,\n\t54480 - 44032: 0xC7B7,\n\t54481 - 44032: 0xBF77,\n\t54482 - 44032: 0xBF78,\n\t54483 - 44032: 0xBF79,\n\t54484 - 44032: 0xC7B8,\n\t54485 - 44032: 0xBF7A,\n\t54486 - 44032: 0xBF81,\n\t54487 - 44032: 0xBF82,\n\t54488 - 44032: 0xBF83,\n\t54489 - 44032: 0xBF84,\n\t54490 - 44032: 0xBF85,\n\t54491 - 44032: 0xBF86,\n\t54492 - 44032: 0xC7B9,\n\t54493 - 44032: 0xBF87,\n\t54494 - 44032: 0xBF88,\n\t54495 - 44032: 0xC7BA,\n\t54496 - 44032: 0xBF89,\n\t54497 - 44032: 0xBF8A,\n\t54498 - 44032: 0xBF8B,\n\t54499 - 44032: 0xBF8C,\n\t54500 - 44032: 0xBF8D,\n\t54501 - 44032: 0xBF8E,\n\t54502 - 44032: 0xBF8F,\n\t54503 - 44032: 0xBF90,\n\t54504 - 44032: 0xC7BB,\n\t54505 - 44032: 0xBF91,\n\t54506 - 44032: 0xBF92,\n\t54507 - 44032: 0xBF93,\n\t54508 - 44032: 0xC7BC,\n\t54509 - 44032: 0xBF94,\n\t54510 - 44032: 0xBF95,\n\t54511 - 44032: 0xBF96,\n\t54512 - 44032: 0xC7BD,\n\t54513 - 44032: 0xBF97,\n\t54514 - 44032: 0xBF98,\n\t54515 - 44032: 0xBF99,\n\t54516 - 44032: 0xBF9A,\n\t54517 - 44032: 0xBF9B,\n\t54518 - 44032: 0xBF9C,\n\t54519 - 44032: 0xBF9D,\n\t54520 - 44032: 0xC7BE,\n\t54521 - 44032: 0xBF9E,\n\t54522 - 44032: 0xBF9F,\n\t54523 - 44032: 0xC7BF,\n\t54524 - 44032: 0xBFA0,\n\t54525 - 44032: 0xC7C0,\n\t54526 - 44032: 0xC041,\n\t54527 - 44032: 0xC042,\n\t54528 - 44032: 0xC043,\n\t54529 - 44032: 0xC044,\n\t54530 - 44032: 0xC045,\n\t54531 - 44032: 0xC046,\n\t54532 - 44032: 0xC7C1,\n\t54533 - 44032: 0xC047,\n\t54534 - 44032: 0xC048,\n\t54535 - 44032: 0xC049,\n\t54536 - 44032: 0xC7C2,\n\t54537 - 44032: 0xC04A,\n\t54538 - 44032: 0xC04B,\n\t54539 - 44032: 0xC04C,\n\t54540 - 44032: 0xC7C3,\n\t54541 - 44032: 0xC04D,\n\t54542 - 44032: 0xC04E,\n\t54543 - 44032: 0xC04F,\n\t54544 - 44032: 0xC050,\n\t54545 - 44032: 0xC051,\n\t54546 - 44032: 0xC052,\n\t54547 - 44032: 0xC053,\n\t54548 - 44032: 0xC7C4,\n\t54549 - 44032: 0xC7C5,\n\t54550 - 44032: 0xC054,\n\t54551 - 44032: 0xC7C6,\n\t54552 - 44032: 0xC055,\n\t54553 - 44032: 0xC056,\n\t54554 - 44032: 0xC057,\n\t54555 - 44032: 0xC058,\n\t54556 - 44032: 0xC059,\n\t54557 - 44032: 0xC05A,\n\t54558 - 44032: 0xC061,\n\t54559 - 44032: 0xC062,\n\t54560 - 44032: 0xC063,\n\t54561 - 44032: 0xC064,\n\t54562 - 44032: 0xC065,\n\t54563 - 44032: 0xC066,\n\t54564 - 44032: 0xC067,\n\t54565 - 44032: 0xC068,\n\t54566 - 44032: 0xC069,\n\t54567 - 44032: 0xC06A,\n\t54568 - 44032: 0xC06B,\n\t54569 - 44032: 0xC06C,\n\t54570 - 44032: 0xC06D,\n\t54571 - 44032: 0xC06E,\n\t54572 - 44032: 0xC06F,\n\t54573 - 44032: 0xC070,\n\t54574 - 44032: 0xC071,\n\t54575 - 44032: 0xC072,\n\t54576 - 44032: 0xC073,\n\t54577 - 44032: 0xC074,\n\t54578 - 44032: 0xC075,\n\t54579 - 44032: 0xC076,\n\t54580 - 44032: 0xC077,\n\t54581 - 44032: 0xC078,\n\t54582 - 44032: 0xC079,\n\t54583 - 44032: 0xC07A,\n\t54584 - 44032: 0xC081,\n\t54585 - 44032: 0xC082,\n\t54586 - 44032: 0xC083,\n\t54587 - 44032: 0xC084,\n\t54588 - 44032: 0xC7C7,\n\t54589 - 44032: 0xC7C8,\n\t54590 - 44032: 0xC085,\n\t54591 - 44032: 0xC086,\n\t54592 - 44032: 0xC7C9,\n\t54593 - 44032: 0xC087,\n\t54594 - 44032: 0xC088,\n\t54595 - 44032: 0xC089,\n\t54596 - 44032: 0xC7CA,\n\t54597 - 44032: 0xC08A,\n\t54598 - 44032: 0xC08B,\n\t54599 - 44032: 0xC08C,\n\t54600 - 44032: 0xC08D,\n\t54601 - 44032: 0xC08E,\n\t54602 - 44032: 0xC08F,\n\t54603 - 44032: 0xC090,\n\t54604 - 44032: 0xC7CB,\n\t54605 - 44032: 0xC7CC,\n\t54606 - 44032: 0xC091,\n\t54607 - 44032: 0xC7CD,\n\t54608 - 44032: 0xC092,\n\t54609 - 44032: 0xC7CE,\n\t54610 - 44032: 0xC093,\n\t54611 - 44032: 0xC094,\n\t54612 - 44032: 0xC095,\n\t54613 - 44032: 0xC096,\n\t54614 - 44032: 0xC097,\n\t54615 - 44032: 0xC098,\n\t54616 - 44032: 0xC7CF,\n\t54617 - 44032: 0xC7D0,\n\t54618 - 44032: 0xC099,\n\t54619 - 44032: 0xC09A,\n\t54620 - 44032: 0xC7D1,\n\t54621 - 44032: 0xC09B,\n\t54622 - 44032: 0xC09C,\n\t54623 - 44032: 0xC09D,\n\t54624 - 44032: 0xC7D2,\n\t54625 - 44032: 0xC09E,\n\t54626 - 44032: 0xC09F,\n\t54627 - 44032: 0xC0A0,\n\t54628 - 44032: 0xC141,\n\t54629 - 44032: 0xC7D3,\n\t54630 - 44032: 0xC142,\n\t54631 - 44032: 0xC143,\n\t54632 - 44032: 0xC7D4,\n\t54633 - 44032: 0xC7D5,\n\t54634 - 44032: 0xC144,\n\t54635 - 44032: 0xC7D6,\n\t54636 - 44032: 0xC145,\n\t54637 - 44032: 0xC7D7,\n\t54638 - 44032: 0xC146,\n\t54639 - 44032: 0xC147,\n\t54640 - 44032: 0xC148,\n\t54641 - 44032: 0xC149,\n\t54642 - 44032: 0xC14A,\n\t54643 - 44032: 0xC14B,\n\t54644 - 44032: 0xC7D8,\n\t54645 - 44032: 0xC7D9,\n\t54646 - 44032: 0xC14C,\n\t54647 - 44032: 0xC14D,\n\t54648 - 44032: 0xC7DA,\n\t54649 - 44032: 0xC14E,\n\t54650 - 44032: 0xC14F,\n\t54651 - 44032: 0xC150,\n\t54652 - 44032: 0xC7DB,\n\t54653 - 44032: 0xC151,\n\t54654 - 44032: 0xC152,\n\t54655 - 44032: 0xC153,\n\t54656 - 44032: 0xC154,\n\t54657 - 44032: 0xC155,\n\t54658 - 44032: 0xC156,\n\t54659 - 44032: 0xC157,\n\t54660 - 44032: 0xC7DC,\n\t54661 - 44032: 0xC7DD,\n\t54662 - 44032: 0xC158,\n\t54663 - 44032: 0xC7DE,\n\t54664 - 44032: 0xC7DF,\n\t54665 - 44032: 0xC7E0,\n\t54666 - 44032: 0xC159,\n\t54667 - 44032: 0xC15A,\n\t54668 - 44032: 0xC161,\n\t54669 - 44032: 0xC162,\n\t54670 - 44032: 0xC163,\n\t54671 - 44032: 0xC164,\n\t54672 - 44032: 0xC7E1,\n\t54673 - 44032: 0xC165,\n\t54674 - 44032: 0xC166,\n\t54675 - 44032: 0xC167,\n\t54676 - 44032: 0xC168,\n\t54677 - 44032: 0xC169,\n\t54678 - 44032: 0xC16A,\n\t54679 - 44032: 0xC16B,\n\t54680 - 44032: 0xC16C,\n\t54681 - 44032: 0xC16D,\n\t54682 - 44032: 0xC16E,\n\t54683 - 44032: 0xC16F,\n\t54684 - 44032: 0xC170,\n\t54685 - 44032: 0xC171,\n\t54686 - 44032: 0xC172,\n\t54687 - 44032: 0xC173,\n\t54688 - 44032: 0xC174,\n\t54689 - 44032: 0xC175,\n\t54690 - 44032: 0xC176,\n\t54691 - 44032: 0xC177,\n\t54692 - 44032: 0xC178,\n\t54693 - 44032: 0xC7E2,\n\t54694 - 44032: 0xC179,\n\t54695 - 44032: 0xC17A,\n\t54696 - 44032: 0xC181,\n\t54697 - 44032: 0xC182,\n\t54698 - 44032: 0xC183,\n\t54699 - 44032: 0xC184,\n\t54700 - 44032: 0xC185,\n\t54701 - 44032: 0xC186,\n\t54702 - 44032: 0xC187,\n\t54703 - 44032: 0xC188,\n\t54704 - 44032: 0xC189,\n\t54705 - 44032: 0xC18A,\n\t54706 - 44032: 0xC18B,\n\t54707 - 44032: 0xC18C,\n\t54708 - 44032: 0xC18D,\n\t54709 - 44032: 0xC18E,\n\t54710 - 44032: 0xC18F,\n\t54711 - 44032: 0xC190,\n\t54712 - 44032: 0xC191,\n\t54713 - 44032: 0xC192,\n\t54714 - 44032: 0xC193,\n\t54715 - 44032: 0xC194,\n\t54716 - 44032: 0xC195,\n\t54717 - 44032: 0xC196,\n\t54718 - 44032: 0xC197,\n\t54719 - 44032: 0xC198,\n\t54720 - 44032: 0xC199,\n\t54721 - 44032: 0xC19A,\n\t54722 - 44032: 0xC19B,\n\t54723 - 44032: 0xC19C,\n\t54724 - 44032: 0xC19D,\n\t54725 - 44032: 0xC19E,\n\t54726 - 44032: 0xC19F,\n\t54727 - 44032: 0xC1A0,\n\t54728 - 44032: 0xC7E3,\n\t54729 - 44032: 0xC7E4,\n\t54730 - 44032: 0xC241,\n\t54731 - 44032: 0xC242,\n\t54732 - 44032: 0xC7E5,\n\t54733 - 44032: 0xC243,\n\t54734 - 44032: 0xC244,\n\t54735 - 44032: 0xC245,\n\t54736 - 44032: 0xC7E6,\n\t54737 - 44032: 0xC246,\n\t54738 - 44032: 0xC7E7,\n\t54739 - 44032: 0xC247,\n\t54740 - 44032: 0xC248,\n\t54741 - 44032: 0xC249,\n\t54742 - 44032: 0xC24A,\n\t54743 - 44032: 0xC24B,\n\t54744 - 44032: 0xC7E8,\n\t54745 - 44032: 0xC7E9,\n\t54746 - 44032: 0xC24C,\n\t54747 - 44032: 0xC7EA,\n\t54748 - 44032: 0xC24D,\n\t54749 - 44032: 0xC7EB,\n\t54750 - 44032: 0xC24E,\n\t54751 - 44032: 0xC24F,\n\t54752 - 44032: 0xC250,\n\t54753 - 44032: 0xC251,\n\t54754 - 44032: 0xC252,\n\t54755 - 44032: 0xC253,\n\t54756 - 44032: 0xC7EC,\n\t54757 - 44032: 0xC7ED,\n\t54758 - 44032: 0xC254,\n\t54759 - 44032: 0xC255,\n\t54760 - 44032: 0xC7EE,\n\t54761 - 44032: 0xC256,\n\t54762 - 44032: 0xC257,\n\t54763 - 44032: 0xC258,\n\t54764 - 44032: 0xC7EF,\n\t54765 - 44032: 0xC259,\n\t54766 - 44032: 0xC25A,\n\t54767 - 44032: 0xC261,\n\t54768 - 44032: 0xC262,\n\t54769 - 44032: 0xC263,\n\t54770 - 44032: 0xC264,\n\t54771 - 44032: 0xC265,\n\t54772 - 44032: 0xC7F0,\n\t54773 - 44032: 0xC7F1,\n\t54774 - 44032: 0xC266,\n\t54775 - 44032: 0xC7F2,\n\t54776 - 44032: 0xC267,\n\t54777 - 44032: 0xC7F3,\n\t54778 - 44032: 0xC268,\n\t54779 - 44032: 0xC269,\n\t54780 - 44032: 0xC26A,\n\t54781 - 44032: 0xC26B,\n\t54782 - 44032: 0xC26C,\n\t54783 - 44032: 0xC26D,\n\t54784 - 44032: 0xC7F4,\n\t54785 - 44032: 0xC7F5,\n\t54786 - 44032: 0xC26E,\n\t54787 - 44032: 0xC26F,\n\t54788 - 44032: 0xC7F6,\n\t54789 - 44032: 0xC270,\n\t54790 - 44032: 0xC271,\n\t54791 - 44032: 0xC272,\n\t54792 - 44032: 0xC7F7,\n\t54793 - 44032: 0xC273,\n\t54794 - 44032: 0xC274,\n\t54795 - 44032: 0xC275,\n\t54796 - 44032: 0xC276,\n\t54797 - 44032: 0xC277,\n\t54798 - 44032: 0xC278,\n\t54799 - 44032: 0xC279,\n\t54800 - 44032: 0xC7F8,\n\t54801 - 44032: 0xC7F9,\n\t54802 - 44032: 0xC27A,\n\t54803 - 44032: 0xC7FA,\n\t54804 - 44032: 0xC7FB,\n\t54805 - 44032: 0xC7FC,\n\t54806 - 44032: 0xC281,\n\t54807 - 44032: 0xC282,\n\t54808 - 44032: 0xC283,\n\t54809 - 44032: 0xC284,\n\t54810 - 44032: 0xC285,\n\t54811 - 44032: 0xC286,\n\t54812 - 44032: 0xC7FD,\n\t54813 - 44032: 0xC287,\n\t54814 - 44032: 0xC288,\n\t54815 - 44032: 0xC289,\n\t54816 - 44032: 0xC7FE,\n\t54817 - 44032: 0xC28A,\n\t54818 - 44032: 0xC28B,\n\t54819 - 44032: 0xC28C,\n\t54820 - 44032: 0xC8A1,\n\t54821 - 44032: 0xC28D,\n\t54822 - 44032: 0xC28E,\n\t54823 - 44032: 0xC28F,\n\t54824 - 44032: 0xC290,\n\t54825 - 44032: 0xC291,\n\t54826 - 44032: 0xC292,\n\t54827 - 44032: 0xC293,\n\t54828 - 44032: 0xC294,\n\t54829 - 44032: 0xC8A2,\n\t54830 - 44032: 0xC295,\n\t54831 - 44032: 0xC296,\n\t54832 - 44032: 0xC297,\n\t54833 - 44032: 0xC298,\n\t54834 - 44032: 0xC299,\n\t54835 - 44032: 0xC29A,\n\t54836 - 44032: 0xC29B,\n\t54837 - 44032: 0xC29C,\n\t54838 - 44032: 0xC29D,\n\t54839 - 44032: 0xC29E,\n\t54840 - 44032: 0xC8A3,\n\t54841 - 44032: 0xC8A4,\n\t54842 - 44032: 0xC29F,\n\t54843 - 44032: 0xC2A0,\n\t54844 - 44032: 0xC8A5,\n\t54845 - 44032: 0xC341,\n\t54846 - 44032: 0xC342,\n\t54847 - 44032: 0xC343,\n\t54848 - 44032: 0xC8A6,\n\t54849 - 44032: 0xC344,\n\t54850 - 44032: 0xC345,\n\t54851 - 44032: 0xC346,\n\t54852 - 44032: 0xC347,\n\t54853 - 44032: 0xC8A7,\n\t54854 - 44032: 0xC348,\n\t54855 - 44032: 0xC349,\n\t54856 - 44032: 0xC8A8,\n\t54857 - 44032: 0xC8A9,\n\t54858 - 44032: 0xC34A,\n\t54859 - 44032: 0xC8AA,\n\t54860 - 44032: 0xC34B,\n\t54861 - 44032: 0xC8AB,\n\t54862 - 44032: 0xC34C,\n\t54863 - 44032: 0xC34D,\n\t54864 - 44032: 0xC34E,\n\t54865 - 44032: 0xC8AC,\n\t54866 - 44032: 0xC34F,\n\t54867 - 44032: 0xC350,\n\t54868 - 44032: 0xC8AD,\n\t54869 - 44032: 0xC8AE,\n\t54870 - 44032: 0xC351,\n\t54871 - 44032: 0xC352,\n\t54872 - 44032: 0xC8AF,\n\t54873 - 44032: 0xC353,\n\t54874 - 44032: 0xC354,\n\t54875 - 44032: 0xC355,\n\t54876 - 44032: 0xC8B0,\n\t54877 - 44032: 0xC356,\n\t54878 - 44032: 0xC357,\n\t54879 - 44032: 0xC358,\n\t54880 - 44032: 0xC359,\n\t54881 - 44032: 0xC35A,\n\t54882 - 44032: 0xC361,\n\t54883 - 44032: 0xC362,\n\t54884 - 44032: 0xC363,\n\t54885 - 44032: 0xC364,\n\t54886 - 44032: 0xC365,\n\t54887 - 44032: 0xC8B1,\n\t54888 - 44032: 0xC366,\n\t54889 - 44032: 0xC8B2,\n\t54890 - 44032: 0xC367,\n\t54891 - 44032: 0xC368,\n\t54892 - 44032: 0xC369,\n\t54893 - 44032: 0xC36A,\n\t54894 - 44032: 0xC36B,\n\t54895 - 44032: 0xC36C,\n\t54896 - 44032: 0xC8B3,\n\t54897 - 44032: 0xC8B4,\n\t54898 - 44032: 0xC36D,\n\t54899 - 44032: 0xC36E,\n\t54900 - 44032: 0xC8B5,\n\t54901 - 44032: 0xC36F,\n\t54902 - 44032: 0xC370,\n\t54903 - 44032: 0xC371,\n\t54904 - 44032: 0xC372,\n\t54905 - 44032: 0xC373,\n\t54906 - 44032: 0xC374,\n\t54907 - 44032: 0xC375,\n\t54908 - 44032: 0xC376,\n\t54909 - 44032: 0xC377,\n\t54910 - 44032: 0xC378,\n\t54911 - 44032: 0xC379,\n\t54912 - 44032: 0xC37A,\n\t54913 - 44032: 0xC381,\n\t54914 - 44032: 0xC382,\n\t54915 - 44032: 0xC8B6,\n\t54916 - 44032: 0xC383,\n\t54917 - 44032: 0xC8B7,\n\t54918 - 44032: 0xC384,\n\t54919 - 44032: 0xC385,\n\t54920 - 44032: 0xC386,\n\t54921 - 44032: 0xC387,\n\t54922 - 44032: 0xC388,\n\t54923 - 44032: 0xC389,\n\t54924 - 44032: 0xC8B8,\n\t54925 - 44032: 0xC8B9,\n\t54926 - 44032: 0xC38A,\n\t54927 - 44032: 0xC38B,\n\t54928 - 44032: 0xC8BA,\n\t54929 - 44032: 0xC38C,\n\t54930 - 44032: 0xC38D,\n\t54931 - 44032: 0xC38E,\n\t54932 - 44032: 0xC8BB,\n\t54933 - 44032: 0xC38F,\n\t54934 - 44032: 0xC390,\n\t54935 - 44032: 0xC391,\n\t54936 - 44032: 0xC392,\n\t54937 - 44032: 0xC393,\n\t54938 - 44032: 0xC394,\n\t54939 - 44032: 0xC395,\n\t54940 - 44032: 0xC396,\n\t54941 - 44032: 0xC8BC,\n\t54942 - 44032: 0xC397,\n\t54943 - 44032: 0xC8BD,\n\t54944 - 44032: 0xC398,\n\t54945 - 44032: 0xC8BE,\n\t54946 - 44032: 0xC399,\n\t54947 - 44032: 0xC39A,\n\t54948 - 44032: 0xC39B,\n\t54949 - 44032: 0xC39C,\n\t54950 - 44032: 0xC39D,\n\t54951 - 44032: 0xC39E,\n\t54952 - 44032: 0xC8BF,\n\t54953 - 44032: 0xC39F,\n\t54954 - 44032: 0xC3A0,\n\t54955 - 44032: 0xC441,\n\t54956 - 44032: 0xC8C0,\n\t54957 - 44032: 0xC442,\n\t54958 - 44032: 0xC443,\n\t54959 - 44032: 0xC444,\n\t54960 - 44032: 0xC8C1,\n\t54961 - 44032: 0xC445,\n\t54962 - 44032: 0xC446,\n\t54963 - 44032: 0xC447,\n\t54964 - 44032: 0xC448,\n\t54965 - 44032: 0xC449,\n\t54966 - 44032: 0xC44A,\n\t54967 - 44032: 0xC44B,\n\t54968 - 44032: 0xC44C,\n\t54969 - 44032: 0xC8C2,\n\t54970 - 44032: 0xC44D,\n\t54971 - 44032: 0xC8C3,\n\t54972 - 44032: 0xC44E,\n\t54973 - 44032: 0xC44F,\n\t54974 - 44032: 0xC450,\n\t54975 - 44032: 0xC451,\n\t54976 - 44032: 0xC452,\n\t54977 - 44032: 0xC453,\n\t54978 - 44032: 0xC454,\n\t54979 - 44032: 0xC455,\n\t54980 - 44032: 0xC8C4,\n\t54981 - 44032: 0xC8C5,\n\t54982 - 44032: 0xC456,\n\t54983 - 44032: 0xC457,\n\t54984 - 44032: 0xC8C6,\n\t54985 - 44032: 0xC458,\n\t54986 - 44032: 0xC459,\n\t54987 - 44032: 0xC45A,\n\t54988 - 44032: 0xC8C7,\n\t54989 - 44032: 0xC461,\n\t54990 - 44032: 0xC462,\n\t54991 - 44032: 0xC463,\n\t54992 - 44032: 0xC464,\n\t54993 - 44032: 0xC8C8,\n\t54994 - 44032: 0xC465,\n\t54995 - 44032: 0xC466,\n\t54996 - 44032: 0xC8C9,\n\t54997 - 44032: 0xC467,\n\t54998 - 44032: 0xC468,\n\t54999 - 44032: 0xC8CA,\n\t55000 - 44032: 0xC469,\n\t55001 - 44032: 0xC8CB,\n\t55002 - 44032: 0xC46A,\n\t55003 - 44032: 0xC46B,\n\t55004 - 44032: 0xC46C,\n\t55005 - 44032: 0xC46D,\n\t55006 - 44032: 0xC46E,\n\t55007 - 44032: 0xC46F,\n\t55008 - 44032: 0xC8CC,\n\t55009 - 44032: 0xC470,\n\t55010 - 44032: 0xC471,\n\t55011 - 44032: 0xC472,\n\t55012 - 44032: 0xC8CD,\n\t55013 - 44032: 0xC473,\n\t55014 - 44032: 0xC474,\n\t55015 - 44032: 0xC475,\n\t55016 - 44032: 0xC8CE,\n\t55017 - 44032: 0xC476,\n\t55018 - 44032: 0xC477,\n\t55019 - 44032: 0xC478,\n\t55020 - 44032: 0xC479,\n\t55021 - 44032: 0xC47A,\n\t55022 - 44032: 0xC481,\n\t55023 - 44032: 0xC482,\n\t55024 - 44032: 0xC8CF,\n\t55025 - 44032: 0xC483,\n\t55026 - 44032: 0xC484,\n\t55027 - 44032: 0xC485,\n\t55028 - 44032: 0xC486,\n\t55029 - 44032: 0xC8D0,\n\t55030 - 44032: 0xC487,\n\t55031 - 44032: 0xC488,\n\t55032 - 44032: 0xC489,\n\t55033 - 44032: 0xC48A,\n\t55034 - 44032: 0xC48B,\n\t55035 - 44032: 0xC48C,\n\t55036 - 44032: 0xC8D1,\n\t55037 - 44032: 0xC8D2,\n\t55038 - 44032: 0xC48D,\n\t55039 - 44032: 0xC48E,\n\t55040 - 44032: 0xC8D3,\n\t55041 - 44032: 0xC48F,\n\t55042 - 44032: 0xC490,\n\t55043 - 44032: 0xC491,\n\t55044 - 44032: 0xC8D4,\n\t55045 - 44032: 0xC492,\n\t55046 - 44032: 0xC493,\n\t55047 - 44032: 0xC494,\n\t55048 - 44032: 0xC495,\n\t55049 - 44032: 0xC496,\n\t55050 - 44032: 0xC497,\n\t55051 - 44032: 0xC498,\n\t55052 - 44032: 0xC499,\n\t55053 - 44032: 0xC49A,\n\t55054 - 44032: 0xC49B,\n\t55055 - 44032: 0xC49C,\n\t55056 - 44032: 0xC49D,\n\t55057 - 44032: 0xC8D5,\n\t55058 - 44032: 0xC49E,\n\t55059 - 44032: 0xC49F,\n\t55060 - 44032: 0xC4A0,\n\t55061 - 44032: 0xC541,\n\t55062 - 44032: 0xC542,\n\t55063 - 44032: 0xC543,\n\t55064 - 44032: 0xC8D6,\n\t55065 - 44032: 0xC8D7,\n\t55066 - 44032: 0xC544,\n\t55067 - 44032: 0xC545,\n\t55068 - 44032: 0xC8D8,\n\t55069 - 44032: 0xC546,\n\t55070 - 44032: 0xC547,\n\t55071 - 44032: 0xC548,\n\t55072 - 44032: 0xC8D9,\n\t55073 - 44032: 0xC549,\n\t55074 - 44032: 0xC54A,\n\t55075 - 44032: 0xC54B,\n\t55076 - 44032: 0xC54C,\n\t55077 - 44032: 0xC54D,\n\t55078 - 44032: 0xC54E,\n\t55079 - 44032: 0xC54F,\n\t55080 - 44032: 0xC8DA,\n\t55081 - 44032: 0xC8DB,\n\t55082 - 44032: 0xC550,\n\t55083 - 44032: 0xC8DC,\n\t55084 - 44032: 0xC551,\n\t55085 - 44032: 0xC8DD,\n\t55086 - 44032: 0xC552,\n\t55087 - 44032: 0xC553,\n\t55088 - 44032: 0xC554,\n\t55089 - 44032: 0xC555,\n\t55090 - 44032: 0xC556,\n\t55091 - 44032: 0xC557,\n\t55092 - 44032: 0xC8DE,\n\t55093 - 44032: 0xC8DF,\n\t55094 - 44032: 0xC558,\n\t55095 - 44032: 0xC559,\n\t55096 - 44032: 0xC8E0,\n\t55097 - 44032: 0xC55A,\n\t55098 - 44032: 0xC561,\n\t55099 - 44032: 0xC562,\n\t55100 - 44032: 0xC8E1,\n\t55101 - 44032: 0xC563,\n\t55102 - 44032: 0xC564,\n\t55103 - 44032: 0xC565,\n\t55104 - 44032: 0xC566,\n\t55105 - 44032: 0xC567,\n\t55106 - 44032: 0xC568,\n\t55107 - 44032: 0xC569,\n\t55108 - 44032: 0xC8E2,\n\t55109 - 44032: 0xC56A,\n\t55110 - 44032: 0xC56B,\n\t55111 - 44032: 0xC8E3,\n\t55112 - 44032: 0xC56C,\n\t55113 - 44032: 0xC8E4,\n\t55114 - 44032: 0xC56D,\n\t55115 - 44032: 0xC56E,\n\t55116 - 44032: 0xC56F,\n\t55117 - 44032: 0xC570,\n\t55118 - 44032: 0xC571,\n\t55119 - 44032: 0xC572,\n\t55120 - 44032: 0xC8E5,\n\t55121 - 44032: 0xC8E6,\n\t55122 - 44032: 0xC573,\n\t55123 - 44032: 0xC574,\n\t55124 - 44032: 0xC8E7,\n\t55125 - 44032: 0xC575,\n\t55126 - 44032: 0xC8E8,\n\t55127 - 44032: 0xC8E9,\n\t55128 - 44032: 0xC8EA,\n\t55129 - 44032: 0xC8EB,\n\t55130 - 44032: 0xC576,\n\t55131 - 44032: 0xC577,\n\t55132 - 44032: 0xC578,\n\t55133 - 44032: 0xC579,\n\t55134 - 44032: 0xC57A,\n\t55135 - 44032: 0xC581,\n\t55136 - 44032: 0xC8EC,\n\t55137 - 44032: 0xC8ED,\n\t55138 - 44032: 0xC582,\n\t55139 - 44032: 0xC8EE,\n\t55140 - 44032: 0xC583,\n\t55141 - 44032: 0xC8EF,\n\t55142 - 44032: 0xC584,\n\t55143 - 44032: 0xC585,\n\t55144 - 44032: 0xC586,\n\t55145 - 44032: 0xC8F0,\n\t55146 - 44032: 0xC587,\n\t55147 - 44032: 0xC588,\n\t55148 - 44032: 0xC8F1,\n\t55149 - 44032: 0xC589,\n\t55150 - 44032: 0xC58A,\n\t55151 - 44032: 0xC58B,\n\t55152 - 44032: 0xC8F2,\n\t55153 - 44032: 0xC58C,\n\t55154 - 44032: 0xC58D,\n\t55155 - 44032: 0xC58E,\n\t55156 - 44032: 0xC8F3,\n\t55157 - 44032: 0xC58F,\n\t55158 - 44032: 0xC590,\n\t55159 - 44032: 0xC591,\n\t55160 - 44032: 0xC592,\n\t55161 - 44032: 0xC593,\n\t55162 - 44032: 0xC594,\n\t55163 - 44032: 0xC595,\n\t55164 - 44032: 0xC8F4,\n\t55165 - 44032: 0xC8F5,\n\t55166 - 44032: 0xC596,\n\t55167 - 44032: 0xC597,\n\t55168 - 44032: 0xC598,\n\t55169 - 44032: 0xC8F6,\n\t55170 - 44032: 0xC599,\n\t55171 - 44032: 0xC59A,\n\t55172 - 44032: 0xC59B,\n\t55173 - 44032: 0xC59C,\n\t55174 - 44032: 0xC59D,\n\t55175 - 44032: 0xC59E,\n\t55176 - 44032: 0xC8F7,\n\t55177 - 44032: 0xC8F8,\n\t55178 - 44032: 0xC59F,\n\t55179 - 44032: 0xC5A0,\n\t55180 - 44032: 0xC8F9,\n\t55181 - 44032: 0xC641,\n\t55182 - 44032: 0xC642,\n\t55183 - 44032: 0xC643,\n\t55184 - 44032: 0xC8FA,\n\t55185 - 44032: 0xC644,\n\t55186 - 44032: 0xC645,\n\t55187 - 44032: 0xC646,\n\t55188 - 44032: 0xC647,\n\t55189 - 44032: 0xC648,\n\t55190 - 44032: 0xC649,\n\t55191 - 44032: 0xC64A,\n\t55192 - 44032: 0xC8FB,\n\t55193 - 44032: 0xC8FC,\n\t55194 - 44032: 0xC64B,\n\t55195 - 44032: 0xC8FD,\n\t55196 - 44032: 0xC64C,\n\t55197 - 44032: 0xC8FE,\n\t55198 - 44032: 0xC64D,\n\t55199 - 44032: 0xC64E,\n\t55200 - 44032: 0xC64F,\n\t55201 - 44032: 0xC650,\n\t55202 - 44032: 0xC651,\n\t55203 - 44032: 0xC652,\n}\n\nconst encode2Low, encode2High = 8213, 9838\n\nvar encode2 = [...]uint16{\n\t8213 - 8213: 0xA1AA,\n\t8216 - 8213: 0xA1AE,\n\t8217 - 8213: 0xA1AF,\n\t8220 - 8213: 0xA1B0,\n\t8221 - 8213: 0xA1B1,\n\t8224 - 8213: 0xA2D3,\n\t8225 - 8213: 0xA2D4,\n\t8229 - 8213: 0xA1A5,\n\t8230 - 8213: 0xA1A6,\n\t8240 - 8213: 0xA2B6,\n\t8242 - 8213: 0xA1C7,\n\t8243 - 8213: 0xA1C8,\n\t8251 - 8213: 0xA1D8,\n\t8308 - 8213: 0xA9F9,\n\t8319 - 8213: 0xA9FA,\n\t8321 - 8213: 0xA9FB,\n\t8322 - 8213: 0xA9FC,\n\t8323 - 8213: 0xA9FD,\n\t8324 - 8213: 0xA9FE,\n\t8364 - 8213: 0xA2E6,\n\t8451 - 8213: 0xA1C9,\n\t8457 - 8213: 0xA2B5,\n\t8467 - 8213: 0xA7A4,\n\t8470 - 8213: 0xA2E0,\n\t8481 - 8213: 0xA2E5,\n\t8482 - 8213: 0xA2E2,\n\t8486 - 8213: 0xA7D9,\n\t8491 - 8213: 0xA1CA,\n\t8531 - 8213: 0xA8F7,\n\t8532 - 8213: 0xA8F8,\n\t8539 - 8213: 0xA8FB,\n\t8540 - 8213: 0xA8FC,\n\t8541 - 8213: 0xA8FD,\n\t8542 - 8213: 0xA8FE,\n\t8544 - 8213: 0xA5B0,\n\t8545 - 8213: 0xA5B1,\n\t8546 - 8213: 0xA5B2,\n\t8547 - 8213: 0xA5B3,\n\t8548 - 8213: 0xA5B4,\n\t8549 - 8213: 0xA5B5,\n\t8550 - 8213: 0xA5B6,\n\t8551 - 8213: 0xA5B7,\n\t8552 - 8213: 0xA5B8,\n\t8553 - 8213: 0xA5B9,\n\t8560 - 8213: 0xA5A1,\n\t8561 - 8213: 0xA5A2,\n\t8562 - 8213: 0xA5A3,\n\t8563 - 8213: 0xA5A4,\n\t8564 - 8213: 0xA5A5,\n\t8565 - 8213: 0xA5A6,\n\t8566 - 8213: 0xA5A7,\n\t8567 - 8213: 0xA5A8,\n\t8568 - 8213: 0xA5A9,\n\t8569 - 8213: 0xA5AA,\n\t8592 - 8213: 0xA1E7,\n\t8593 - 8213: 0xA1E8,\n\t8594 - 8213: 0xA1E6,\n\t8595 - 8213: 0xA1E9,\n\t8596 - 8213: 0xA1EA,\n\t8597 - 8213: 0xA2D5,\n\t8598 - 8213: 0xA2D8,\n\t8599 - 8213: 0xA2D6,\n\t8600 - 8213: 0xA2D9,\n\t8601 - 8213: 0xA2D7,\n\t8658 - 8213: 0xA2A1,\n\t8660 - 8213: 0xA2A2,\n\t8704 - 8213: 0xA2A3,\n\t8706 - 8213: 0xA1D3,\n\t8707 - 8213: 0xA2A4,\n\t8711 - 8213: 0xA1D4,\n\t8712 - 8213: 0xA1F4,\n\t8715 - 8213: 0xA1F5,\n\t8719 - 8213: 0xA2B3,\n\t8721 - 8213: 0xA2B2,\n\t8730 - 8213: 0xA1EE,\n\t8733 - 8213: 0xA1F0,\n\t8734 - 8213: 0xA1C4,\n\t8736 - 8213: 0xA1D0,\n\t8741 - 8213: 0xA1AB,\n\t8743 - 8213: 0xA1FC,\n\t8744 - 8213: 0xA1FD,\n\t8745 - 8213: 0xA1FB,\n\t8746 - 8213: 0xA1FA,\n\t8747 - 8213: 0xA1F2,\n\t8748 - 8213: 0xA1F3,\n\t8750 - 8213: 0xA2B1,\n\t8756 - 8213: 0xA1C5,\n\t8757 - 8213: 0xA1F1,\n\t8764 - 8213: 0xA1AD,\n\t8765 - 8213: 0xA1EF,\n\t8786 - 8213: 0xA1D6,\n\t8800 - 8213: 0xA1C1,\n\t8801 - 8213: 0xA1D5,\n\t8804 - 8213: 0xA1C2,\n\t8805 - 8213: 0xA1C3,\n\t8810 - 8213: 0xA1EC,\n\t8811 - 8213: 0xA1ED,\n\t8834 - 8213: 0xA1F8,\n\t8835 - 8213: 0xA1F9,\n\t8838 - 8213: 0xA1F6,\n\t8839 - 8213: 0xA1F7,\n\t8857 - 8213: 0xA2C1,\n\t8869 - 8213: 0xA1D1,\n\t8978 - 8213: 0xA1D2,\n\t9312 - 8213: 0xA8E7,\n\t9313 - 8213: 0xA8E8,\n\t9314 - 8213: 0xA8E9,\n\t9315 - 8213: 0xA8EA,\n\t9316 - 8213: 0xA8EB,\n\t9317 - 8213: 0xA8EC,\n\t9318 - 8213: 0xA8ED,\n\t9319 - 8213: 0xA8EE,\n\t9320 - 8213: 0xA8EF,\n\t9321 - 8213: 0xA8F0,\n\t9322 - 8213: 0xA8F1,\n\t9323 - 8213: 0xA8F2,\n\t9324 - 8213: 0xA8F3,\n\t9325 - 8213: 0xA8F4,\n\t9326 - 8213: 0xA8F5,\n\t9332 - 8213: 0xA9E7,\n\t9333 - 8213: 0xA9E8,\n\t9334 - 8213: 0xA9E9,\n\t9335 - 8213: 0xA9EA,\n\t9336 - 8213: 0xA9EB,\n\t9337 - 8213: 0xA9EC,\n\t9338 - 8213: 0xA9ED,\n\t9339 - 8213: 0xA9EE,\n\t9340 - 8213: 0xA9EF,\n\t9341 - 8213: 0xA9F0,\n\t9342 - 8213: 0xA9F1,\n\t9343 - 8213: 0xA9F2,\n\t9344 - 8213: 0xA9F3,\n\t9345 - 8213: 0xA9F4,\n\t9346 - 8213: 0xA9F5,\n\t9372 - 8213: 0xA9CD,\n\t9373 - 8213: 0xA9CE,\n\t9374 - 8213: 0xA9CF,\n\t9375 - 8213: 0xA9D0,\n\t9376 - 8213: 0xA9D1,\n\t9377 - 8213: 0xA9D2,\n\t9378 - 8213: 0xA9D3,\n\t9379 - 8213: 0xA9D4,\n\t9380 - 8213: 0xA9D5,\n\t9381 - 8213: 0xA9D6,\n\t9382 - 8213: 0xA9D7,\n\t9383 - 8213: 0xA9D8,\n\t9384 - 8213: 0xA9D9,\n\t9385 - 8213: 0xA9DA,\n\t9386 - 8213: 0xA9DB,\n\t9387 - 8213: 0xA9DC,\n\t9388 - 8213: 0xA9DD,\n\t9389 - 8213: 0xA9DE,\n\t9390 - 8213: 0xA9DF,\n\t9391 - 8213: 0xA9E0,\n\t9392 - 8213: 0xA9E1,\n\t9393 - 8213: 0xA9E2,\n\t9394 - 8213: 0xA9E3,\n\t9395 - 8213: 0xA9E4,\n\t9396 - 8213: 0xA9E5,\n\t9397 - 8213: 0xA9E6,\n\t9424 - 8213: 0xA8CD,\n\t9425 - 8213: 0xA8CE,\n\t9426 - 8213: 0xA8CF,\n\t9427 - 8213: 0xA8D0,\n\t9428 - 8213: 0xA8D1,\n\t9429 - 8213: 0xA8D2,\n\t9430 - 8213: 0xA8D3,\n\t9431 - 8213: 0xA8D4,\n\t9432 - 8213: 0xA8D5,\n\t9433 - 8213: 0xA8D6,\n\t9434 - 8213: 0xA8D7,\n\t9435 - 8213: 0xA8D8,\n\t9436 - 8213: 0xA8D9,\n\t9437 - 8213: 0xA8DA,\n\t9438 - 8213: 0xA8DB,\n\t9439 - 8213: 0xA8DC,\n\t9440 - 8213: 0xA8DD,\n\t9441 - 8213: 0xA8DE,\n\t9442 - 8213: 0xA8DF,\n\t9443 - 8213: 0xA8E0,\n\t9444 - 8213: 0xA8E1,\n\t9445 - 8213: 0xA8E2,\n\t9446 - 8213: 0xA8E3,\n\t9447 - 8213: 0xA8E4,\n\t9448 - 8213: 0xA8E5,\n\t9449 - 8213: 0xA8E6,\n\t9472 - 8213: 0xA6A1,\n\t9473 - 8213: 0xA6AC,\n\t9474 - 8213: 0xA6A2,\n\t9475 - 8213: 0xA6AD,\n\t9484 - 8213: 0xA6A3,\n\t9485 - 8213: 0xA6C8,\n\t9486 - 8213: 0xA6C7,\n\t9487 - 8213: 0xA6AE,\n\t9488 - 8213: 0xA6A4,\n\t9489 - 8213: 0xA6C2,\n\t9490 - 8213: 0xA6C1,\n\t9491 - 8213: 0xA6AF,\n\t9492 - 8213: 0xA6A6,\n\t9493 - 8213: 0xA6C6,\n\t9494 - 8213: 0xA6C5,\n\t9495 - 8213: 0xA6B1,\n\t9496 - 8213: 0xA6A5,\n\t9497 - 8213: 0xA6C4,\n\t9498 - 8213: 0xA6C3,\n\t9499 - 8213: 0xA6B0,\n\t9500 - 8213: 0xA6A7,\n\t9501 - 8213: 0xA6BC,\n\t9502 - 8213: 0xA6C9,\n\t9503 - 8213: 0xA6CA,\n\t9504 - 8213: 0xA6B7,\n\t9505 - 8213: 0xA6CB,\n\t9506 - 8213: 0xA6CC,\n\t9507 - 8213: 0xA6B2,\n\t9508 - 8213: 0xA6A9,\n\t9509 - 8213: 0xA6BE,\n\t9510 - 8213: 0xA6CD,\n\t9511 - 8213: 0xA6CE,\n\t9512 - 8213: 0xA6B9,\n\t9513 - 8213: 0xA6CF,\n\t9514 - 8213: 0xA6D0,\n\t9515 - 8213: 0xA6B4,\n\t9516 - 8213: 0xA6A8,\n\t9517 - 8213: 0xA6D1,\n\t9518 - 8213: 0xA6D2,\n\t9519 - 8213: 0xA6B8,\n\t9520 - 8213: 0xA6BD,\n\t9521 - 8213: 0xA6D3,\n\t9522 - 8213: 0xA6D4,\n\t9523 - 8213: 0xA6B3,\n\t9524 - 8213: 0xA6AA,\n\t9525 - 8213: 0xA6D5,\n\t9526 - 8213: 0xA6D6,\n\t9527 - 8213: 0xA6BA,\n\t9528 - 8213: 0xA6BF,\n\t9529 - 8213: 0xA6D7,\n\t9530 - 8213: 0xA6D8,\n\t9531 - 8213: 0xA6B5,\n\t9532 - 8213: 0xA6AB,\n\t9533 - 8213: 0xA6D9,\n\t9534 - 8213: 0xA6DA,\n\t9535 - 8213: 0xA6BB,\n\t9536 - 8213: 0xA6DB,\n\t9537 - 8213: 0xA6DC,\n\t9538 - 8213: 0xA6C0,\n\t9539 - 8213: 0xA6DD,\n\t9540 - 8213: 0xA6DE,\n\t9541 - 8213: 0xA6DF,\n\t9542 - 8213: 0xA6E0,\n\t9543 - 8213: 0xA6E1,\n\t9544 - 8213: 0xA6E2,\n\t9545 - 8213: 0xA6E3,\n\t9546 - 8213: 0xA6E4,\n\t9547 - 8213: 0xA6B6,\n\t9618 - 8213: 0xA2C6,\n\t9632 - 8213: 0xA1E1,\n\t9633 - 8213: 0xA1E0,\n\t9635 - 8213: 0xA2C3,\n\t9636 - 8213: 0xA2C7,\n\t9637 - 8213: 0xA2C8,\n\t9638 - 8213: 0xA2CB,\n\t9639 - 8213: 0xA2CA,\n\t9640 - 8213: 0xA2C9,\n\t9641 - 8213: 0xA2CC,\n\t9650 - 8213: 0xA1E3,\n\t9651 - 8213: 0xA1E2,\n\t9654 - 8213: 0xA2BA,\n\t9655 - 8213: 0xA2B9,\n\t9660 - 8213: 0xA1E5,\n\t9661 - 8213: 0xA1E4,\n\t9664 - 8213: 0xA2B8,\n\t9665 - 8213: 0xA2B7,\n\t9670 - 8213: 0xA1DF,\n\t9671 - 8213: 0xA1DE,\n\t9672 - 8213: 0xA2C2,\n\t9675 - 8213: 0xA1DB,\n\t9678 - 8213: 0xA1DD,\n\t9679 - 8213: 0xA1DC,\n\t9680 - 8213: 0xA2C4,\n\t9681 - 8213: 0xA2C5,\n\t9733 - 8213: 0xA1DA,\n\t9734 - 8213: 0xA1D9,\n\t9742 - 8213: 0xA2CF,\n\t9743 - 8213: 0xA2CE,\n\t9756 - 8213: 0xA2D0,\n\t9758 - 8213: 0xA2D1,\n\t9792 - 8213: 0xA1CF,\n\t9794 - 8213: 0xA1CE,\n\t9824 - 8213: 0xA2BC,\n\t9825 - 8213: 0xA2BD,\n\t9827 - 8213: 0xA2C0,\n\t9828 - 8213: 0xA2BB,\n\t9829 - 8213: 0xA2BE,\n\t9831 - 8213: 0xA2BF,\n\t9832 - 8213: 0xA2CD,\n\t9833 - 8213: 0xA2DB,\n\t9834 - 8213: 0xA2DC,\n\t9836 - 8213: 0xA2DD,\n\t9837 - 8213: 0xA2DA,\n}\n\nconst encode3Low, encode3High = 12288, 13278\n\nvar encode3 = [...]uint16{\n\t12288 - 12288: 0xA1A1,\n\t12289 - 12288: 0xA1A2,\n\t12290 - 12288: 0xA1A3,\n\t12291 - 12288: 0xA1A8,\n\t12296 - 12288: 0xA1B4,\n\t12297 - 12288: 0xA1B5,\n\t12298 - 12288: 0xA1B6,\n\t12299 - 12288: 0xA1B7,\n\t12300 - 12288: 0xA1B8,\n\t12301 - 12288: 0xA1B9,\n\t12302 - 12288: 0xA1BA,\n\t12303 - 12288: 0xA1BB,\n\t12304 - 12288: 0xA1BC,\n\t12305 - 12288: 0xA1BD,\n\t12307 - 12288: 0xA1EB,\n\t12308 - 12288: 0xA1B2,\n\t12309 - 12288: 0xA1B3,\n\t12353 - 12288: 0xAAA1,\n\t12354 - 12288: 0xAAA2,\n\t12355 - 12288: 0xAAA3,\n\t12356 - 12288: 0xAAA4,\n\t12357 - 12288: 0xAAA5,\n\t12358 - 12288: 0xAAA6,\n\t12359 - 12288: 0xAAA7,\n\t12360 - 12288: 0xAAA8,\n\t12361 - 12288: 0xAAA9,\n\t12362 - 12288: 0xAAAA,\n\t12363 - 12288: 0xAAAB,\n\t12364 - 12288: 0xAAAC,\n\t12365 - 12288: 0xAAAD,\n\t12366 - 12288: 0xAAAE,\n\t12367 - 12288: 0xAAAF,\n\t12368 - 12288: 0xAAB0,\n\t12369 - 12288: 0xAAB1,\n\t12370 - 12288: 0xAAB2,\n\t12371 - 12288: 0xAAB3,\n\t12372 - 12288: 0xAAB4,\n\t12373 - 12288: 0xAAB5,\n\t12374 - 12288: 0xAAB6,\n\t12375 - 12288: 0xAAB7,\n\t12376 - 12288: 0xAAB8,\n\t12377 - 12288: 0xAAB9,\n\t12378 - 12288: 0xAABA,\n\t12379 - 12288: 0xAABB,\n\t12380 - 12288: 0xAABC,\n\t12381 - 12288: 0xAABD,\n\t12382 - 12288: 0xAABE,\n\t12383 - 12288: 0xAABF,\n\t12384 - 12288: 0xAAC0,\n\t12385 - 12288: 0xAAC1,\n\t12386 - 12288: 0xAAC2,\n\t12387 - 12288: 0xAAC3,\n\t12388 - 12288: 0xAAC4,\n\t12389 - 12288: 0xAAC5,\n\t12390 - 12288: 0xAAC6,\n\t12391 - 12288: 0xAAC7,\n\t12392 - 12288: 0xAAC8,\n\t12393 - 12288: 0xAAC9,\n\t12394 - 12288: 0xAACA,\n\t12395 - 12288: 0xAACB,\n\t12396 - 12288: 0xAACC,\n\t12397 - 12288: 0xAACD,\n\t12398 - 12288: 0xAACE,\n\t12399 - 12288: 0xAACF,\n\t12400 - 12288: 0xAAD0,\n\t12401 - 12288: 0xAAD1,\n\t12402 - 12288: 0xAAD2,\n\t12403 - 12288: 0xAAD3,\n\t12404 - 12288: 0xAAD4,\n\t12405 - 12288: 0xAAD5,\n\t12406 - 12288: 0xAAD6,\n\t12407 - 12288: 0xAAD7,\n\t12408 - 12288: 0xAAD8,\n\t12409 - 12288: 0xAAD9,\n\t12410 - 12288: 0xAADA,\n\t12411 - 12288: 0xAADB,\n\t12412 - 12288: 0xAADC,\n\t12413 - 12288: 0xAADD,\n\t12414 - 12288: 0xAADE,\n\t12415 - 12288: 0xAADF,\n\t12416 - 12288: 0xAAE0,\n\t12417 - 12288: 0xAAE1,\n\t12418 - 12288: 0xAAE2,\n\t12419 - 12288: 0xAAE3,\n\t12420 - 12288: 0xAAE4,\n\t12421 - 12288: 0xAAE5,\n\t12422 - 12288: 0xAAE6,\n\t12423 - 12288: 0xAAE7,\n\t12424 - 12288: 0xAAE8,\n\t12425 - 12288: 0xAAE9,\n\t12426 - 12288: 0xAAEA,\n\t12427 - 12288: 0xAAEB,\n\t12428 - 12288: 0xAAEC,\n\t12429 - 12288: 0xAAED,\n\t12430 - 12288: 0xAAEE,\n\t12431 - 12288: 0xAAEF,\n\t12432 - 12288: 0xAAF0,\n\t12433 - 12288: 0xAAF1,\n\t12434 - 12288: 0xAAF2,\n\t12435 - 12288: 0xAAF3,\n\t12449 - 12288: 0xABA1,\n\t12450 - 12288: 0xABA2,\n\t12451 - 12288: 0xABA3,\n\t12452 - 12288: 0xABA4,\n\t12453 - 12288: 0xABA5,\n\t12454 - 12288: 0xABA6,\n\t12455 - 12288: 0xABA7,\n\t12456 - 12288: 0xABA8,\n\t12457 - 12288: 0xABA9,\n\t12458 - 12288: 0xABAA,\n\t12459 - 12288: 0xABAB,\n\t12460 - 12288: 0xABAC,\n\t12461 - 12288: 0xABAD,\n\t12462 - 12288: 0xABAE,\n\t12463 - 12288: 0xABAF,\n\t12464 - 12288: 0xABB0,\n\t12465 - 12288: 0xABB1,\n\t12466 - 12288: 0xABB2,\n\t12467 - 12288: 0xABB3,\n\t12468 - 12288: 0xABB4,\n\t12469 - 12288: 0xABB5,\n\t12470 - 12288: 0xABB6,\n\t12471 - 12288: 0xABB7,\n\t12472 - 12288: 0xABB8,\n\t12473 - 12288: 0xABB9,\n\t12474 - 12288: 0xABBA,\n\t12475 - 12288: 0xABBB,\n\t12476 - 12288: 0xABBC,\n\t12477 - 12288: 0xABBD,\n\t12478 - 12288: 0xABBE,\n\t12479 - 12288: 0xABBF,\n\t12480 - 12288: 0xABC0,\n\t12481 - 12288: 0xABC1,\n\t12482 - 12288: 0xABC2,\n\t12483 - 12288: 0xABC3,\n\t12484 - 12288: 0xABC4,\n\t12485 - 12288: 0xABC5,\n\t12486 - 12288: 0xABC6,\n\t12487 - 12288: 0xABC7,\n\t12488 - 12288: 0xABC8,\n\t12489 - 12288: 0xABC9,\n\t12490 - 12288: 0xABCA,\n\t12491 - 12288: 0xABCB,\n\t12492 - 12288: 0xABCC,\n\t12493 - 12288: 0xABCD,\n\t12494 - 12288: 0xABCE,\n\t12495 - 12288: 0xABCF,\n\t12496 - 12288: 0xABD0,\n\t12497 - 12288: 0xABD1,\n\t12498 - 12288: 0xABD2,\n\t12499 - 12288: 0xABD3,\n\t12500 - 12288: 0xABD4,\n\t12501 - 12288: 0xABD5,\n\t12502 - 12288: 0xABD6,\n\t12503 - 12288: 0xABD7,\n\t12504 - 12288: 0xABD8,\n\t12505 - 12288: 0xABD9,\n\t12506 - 12288: 0xABDA,\n\t12507 - 12288: 0xABDB,\n\t12508 - 12288: 0xABDC,\n\t12509 - 12288: 0xABDD,\n\t12510 - 12288: 0xABDE,\n\t12511 - 12288: 0xABDF,\n\t12512 - 12288: 0xABE0,\n\t12513 - 12288: 0xABE1,\n\t12514 - 12288: 0xABE2,\n\t12515 - 12288: 0xABE3,\n\t12516 - 12288: 0xABE4,\n\t12517 - 12288: 0xABE5,\n\t12518 - 12288: 0xABE6,\n\t12519 - 12288: 0xABE7,\n\t12520 - 12288: 0xABE8,\n\t12521 - 12288: 0xABE9,\n\t12522 - 12288: 0xABEA,\n\t12523 - 12288: 0xABEB,\n\t12524 - 12288: 0xABEC,\n\t12525 - 12288: 0xABED,\n\t12526 - 12288: 0xABEE,\n\t12527 - 12288: 0xABEF,\n\t12528 - 12288: 0xABF0,\n\t12529 - 12288: 0xABF1,\n\t12530 - 12288: 0xABF2,\n\t12531 - 12288: 0xABF3,\n\t12532 - 12288: 0xABF4,\n\t12533 - 12288: 0xABF5,\n\t12534 - 12288: 0xABF6,\n\t12593 - 12288: 0xA4A1,\n\t12594 - 12288: 0xA4A2,\n\t12595 - 12288: 0xA4A3,\n\t12596 - 12288: 0xA4A4,\n\t12597 - 12288: 0xA4A5,\n\t12598 - 12288: 0xA4A6,\n\t12599 - 12288: 0xA4A7,\n\t12600 - 12288: 0xA4A8,\n\t12601 - 12288: 0xA4A9,\n\t12602 - 12288: 0xA4AA,\n\t12603 - 12288: 0xA4AB,\n\t12604 - 12288: 0xA4AC,\n\t12605 - 12288: 0xA4AD,\n\t12606 - 12288: 0xA4AE,\n\t12607 - 12288: 0xA4AF,\n\t12608 - 12288: 0xA4B0,\n\t12609 - 12288: 0xA4B1,\n\t12610 - 12288: 0xA4B2,\n\t12611 - 12288: 0xA4B3,\n\t12612 - 12288: 0xA4B4,\n\t12613 - 12288: 0xA4B5,\n\t12614 - 12288: 0xA4B6,\n\t12615 - 12288: 0xA4B7,\n\t12616 - 12288: 0xA4B8,\n\t12617 - 12288: 0xA4B9,\n\t12618 - 12288: 0xA4BA,\n\t12619 - 12288: 0xA4BB,\n\t12620 - 12288: 0xA4BC,\n\t12621 - 12288: 0xA4BD,\n\t12622 - 12288: 0xA4BE,\n\t12623 - 12288: 0xA4BF,\n\t12624 - 12288: 0xA4C0,\n\t12625 - 12288: 0xA4C1,\n\t12626 - 12288: 0xA4C2,\n\t12627 - 12288: 0xA4C3,\n\t12628 - 12288: 0xA4C4,\n\t12629 - 12288: 0xA4C5,\n\t12630 - 12288: 0xA4C6,\n\t12631 - 12288: 0xA4C7,\n\t12632 - 12288: 0xA4C8,\n\t12633 - 12288: 0xA4C9,\n\t12634 - 12288: 0xA4CA,\n\t12635 - 12288: 0xA4CB,\n\t12636 - 12288: 0xA4CC,\n\t12637 - 12288: 0xA4CD,\n\t12638 - 12288: 0xA4CE,\n\t12639 - 12288: 0xA4CF,\n\t12640 - 12288: 0xA4D0,\n\t12641 - 12288: 0xA4D1,\n\t12642 - 12288: 0xA4D2,\n\t12643 - 12288: 0xA4D3,\n\t12644 - 12288: 0xA4D4,\n\t12645 - 12288: 0xA4D5,\n\t12646 - 12288: 0xA4D6,\n\t12647 - 12288: 0xA4D7,\n\t12648 - 12288: 0xA4D8,\n\t12649 - 12288: 0xA4D9,\n\t12650 - 12288: 0xA4DA,\n\t12651 - 12288: 0xA4DB,\n\t12652 - 12288: 0xA4DC,\n\t12653 - 12288: 0xA4DD,\n\t12654 - 12288: 0xA4DE,\n\t12655 - 12288: 0xA4DF,\n\t12656 - 12288: 0xA4E0,\n\t12657 - 12288: 0xA4E1,\n\t12658 - 12288: 0xA4E2,\n\t12659 - 12288: 0xA4E3,\n\t12660 - 12288: 0xA4E4,\n\t12661 - 12288: 0xA4E5,\n\t12662 - 12288: 0xA4E6,\n\t12663 - 12288: 0xA4E7,\n\t12664 - 12288: 0xA4E8,\n\t12665 - 12288: 0xA4E9,\n\t12666 - 12288: 0xA4EA,\n\t12667 - 12288: 0xA4EB,\n\t12668 - 12288: 0xA4EC,\n\t12669 - 12288: 0xA4ED,\n\t12670 - 12288: 0xA4EE,\n\t12671 - 12288: 0xA4EF,\n\t12672 - 12288: 0xA4F0,\n\t12673 - 12288: 0xA4F1,\n\t12674 - 12288: 0xA4F2,\n\t12675 - 12288: 0xA4F3,\n\t12676 - 12288: 0xA4F4,\n\t12677 - 12288: 0xA4F5,\n\t12678 - 12288: 0xA4F6,\n\t12679 - 12288: 0xA4F7,\n\t12680 - 12288: 0xA4F8,\n\t12681 - 12288: 0xA4F9,\n\t12682 - 12288: 0xA4FA,\n\t12683 - 12288: 0xA4FB,\n\t12684 - 12288: 0xA4FC,\n\t12685 - 12288: 0xA4FD,\n\t12686 - 12288: 0xA4FE,\n\t12800 - 12288: 0xA9B1,\n\t12801 - 12288: 0xA9B2,\n\t12802 - 12288: 0xA9B3,\n\t12803 - 12288: 0xA9B4,\n\t12804 - 12288: 0xA9B5,\n\t12805 - 12288: 0xA9B6,\n\t12806 - 12288: 0xA9B7,\n\t12807 - 12288: 0xA9B8,\n\t12808 - 12288: 0xA9B9,\n\t12809 - 12288: 0xA9BA,\n\t12810 - 12288: 0xA9BB,\n\t12811 - 12288: 0xA9BC,\n\t12812 - 12288: 0xA9BD,\n\t12813 - 12288: 0xA9BE,\n\t12814 - 12288: 0xA9BF,\n\t12815 - 12288: 0xA9C0,\n\t12816 - 12288: 0xA9C1,\n\t12817 - 12288: 0xA9C2,\n\t12818 - 12288: 0xA9C3,\n\t12819 - 12288: 0xA9C4,\n\t12820 - 12288: 0xA9C5,\n\t12821 - 12288: 0xA9C6,\n\t12822 - 12288: 0xA9C7,\n\t12823 - 12288: 0xA9C8,\n\t12824 - 12288: 0xA9C9,\n\t12825 - 12288: 0xA9CA,\n\t12826 - 12288: 0xA9CB,\n\t12827 - 12288: 0xA9CC,\n\t12828 - 12288: 0xA2DF,\n\t12896 - 12288: 0xA8B1,\n\t12897 - 12288: 0xA8B2,\n\t12898 - 12288: 0xA8B3,\n\t12899 - 12288: 0xA8B4,\n\t12900 - 12288: 0xA8B5,\n\t12901 - 12288: 0xA8B6,\n\t12902 - 12288: 0xA8B7,\n\t12903 - 12288: 0xA8B8,\n\t12904 - 12288: 0xA8B9,\n\t12905 - 12288: 0xA8BA,\n\t12906 - 12288: 0xA8BB,\n\t12907 - 12288: 0xA8BC,\n\t12908 - 12288: 0xA8BD,\n\t12909 - 12288: 0xA8BE,\n\t12910 - 12288: 0xA8BF,\n\t12911 - 12288: 0xA8C0,\n\t12912 - 12288: 0xA8C1,\n\t12913 - 12288: 0xA8C2,\n\t12914 - 12288: 0xA8C3,\n\t12915 - 12288: 0xA8C4,\n\t12916 - 12288: 0xA8C5,\n\t12917 - 12288: 0xA8C6,\n\t12918 - 12288: 0xA8C7,\n\t12919 - 12288: 0xA8C8,\n\t12920 - 12288: 0xA8C9,\n\t12921 - 12288: 0xA8CA,\n\t12922 - 12288: 0xA8CB,\n\t12923 - 12288: 0xA8CC,\n\t12927 - 12288: 0xA2DE,\n\t13184 - 12288: 0xA7C9,\n\t13185 - 12288: 0xA7CA,\n\t13186 - 12288: 0xA7CB,\n\t13187 - 12288: 0xA7CC,\n\t13188 - 12288: 0xA7CD,\n\t13192 - 12288: 0xA7BA,\n\t13193 - 12288: 0xA7BB,\n\t13194 - 12288: 0xA7DC,\n\t13195 - 12288: 0xA7DD,\n\t13196 - 12288: 0xA7DE,\n\t13197 - 12288: 0xA7B6,\n\t13198 - 12288: 0xA7B7,\n\t13199 - 12288: 0xA7B8,\n\t13200 - 12288: 0xA7D4,\n\t13201 - 12288: 0xA7D5,\n\t13202 - 12288: 0xA7D6,\n\t13203 - 12288: 0xA7D7,\n\t13204 - 12288: 0xA7D8,\n\t13205 - 12288: 0xA7A1,\n\t13206 - 12288: 0xA7A2,\n\t13207 - 12288: 0xA7A3,\n\t13208 - 12288: 0xA7A5,\n\t13209 - 12288: 0xA7AB,\n\t13210 - 12288: 0xA7AC,\n\t13211 - 12288: 0xA7AD,\n\t13212 - 12288: 0xA7AE,\n\t13213 - 12288: 0xA7AF,\n\t13214 - 12288: 0xA7B0,\n\t13215 - 12288: 0xA7B1,\n\t13216 - 12288: 0xA7B2,\n\t13217 - 12288: 0xA7B3,\n\t13218 - 12288: 0xA7B4,\n\t13219 - 12288: 0xA7A7,\n\t13220 - 12288: 0xA7A8,\n\t13221 - 12288: 0xA7A9,\n\t13222 - 12288: 0xA7AA,\n\t13223 - 12288: 0xA7BD,\n\t13224 - 12288: 0xA7BE,\n\t13225 - 12288: 0xA7E5,\n\t13226 - 12288: 0xA7E6,\n\t13227 - 12288: 0xA7E7,\n\t13228 - 12288: 0xA7E8,\n\t13229 - 12288: 0xA7E1,\n\t13230 - 12288: 0xA7E2,\n\t13231 - 12288: 0xA7E3,\n\t13232 - 12288: 0xA7BF,\n\t13233 - 12288: 0xA7C0,\n\t13234 - 12288: 0xA7C1,\n\t13235 - 12288: 0xA7C2,\n\t13236 - 12288: 0xA7C3,\n\t13237 - 12288: 0xA7C4,\n\t13238 - 12288: 0xA7C5,\n\t13239 - 12288: 0xA7C6,\n\t13240 - 12288: 0xA7C7,\n\t13241 - 12288: 0xA7C8,\n\t13242 - 12288: 0xA7CE,\n\t13243 - 12288: 0xA7CF,\n\t13244 - 12288: 0xA7D0,\n\t13245 - 12288: 0xA7D1,\n\t13246 - 12288: 0xA7D2,\n\t13247 - 12288: 0xA7D3,\n\t13248 - 12288: 0xA7DA,\n\t13249 - 12288: 0xA7DB,\n\t13250 - 12288: 0xA2E3,\n\t13251 - 12288: 0xA7EC,\n\t13252 - 12288: 0xA7A6,\n\t13253 - 12288: 0xA7E0,\n\t13254 - 12288: 0xA7EF,\n\t13255 - 12288: 0xA2E1,\n\t13256 - 12288: 0xA7BC,\n\t13257 - 12288: 0xA7ED,\n\t13258 - 12288: 0xA7B5,\n\t13263 - 12288: 0xA7B9,\n\t13264 - 12288: 0xA7EA,\n\t13267 - 12288: 0xA7EB,\n\t13270 - 12288: 0xA7DF,\n\t13272 - 12288: 0xA2E4,\n\t13275 - 12288: 0xA7E4,\n\t13276 - 12288: 0xA7EE,\n\t13277 - 12288: 0xA7E9,\n}\n\nconst encode4Low, encode4High = 161, 1106\n\nvar encode4 = [...]uint16{\n\t161 - 161:  0xA2AE,\n\t164 - 161:  0xA2B4,\n\t167 - 161:  0xA1D7,\n\t168 - 161:  0xA1A7,\n\t170 - 161:  0xA8A3,\n\t173 - 161:  0xA1A9,\n\t174 - 161:  0xA2E7,\n\t176 - 161:  0xA1C6,\n\t177 - 161:  0xA1BE,\n\t178 - 161:  0xA9F7,\n\t179 - 161:  0xA9F8,\n\t180 - 161:  0xA2A5,\n\t182 - 161:  0xA2D2,\n\t183 - 161:  0xA1A4,\n\t184 - 161:  0xA2AC,\n\t185 - 161:  0xA9F6,\n\t186 - 161:  0xA8AC,\n\t188 - 161:  0xA8F9,\n\t189 - 161:  0xA8F6,\n\t190 - 161:  0xA8FA,\n\t191 - 161:  0xA2AF,\n\t198 - 161:  0xA8A1,\n\t208 - 161:  0xA8A2,\n\t215 - 161:  0xA1BF,\n\t216 - 161:  0xA8AA,\n\t222 - 161:  0xA8AD,\n\t223 - 161:  0xA9AC,\n\t230 - 161:  0xA9A1,\n\t240 - 161:  0xA9A3,\n\t247 - 161:  0xA1C0,\n\t248 - 161:  0xA9AA,\n\t254 - 161:  0xA9AD,\n\t273 - 161:  0xA9A2,\n\t294 - 161:  0xA8A4,\n\t295 - 161:  0xA9A4,\n\t305 - 161:  0xA9A5,\n\t306 - 161:  0xA8A6,\n\t307 - 161:  0xA9A6,\n\t312 - 161:  0xA9A7,\n\t319 - 161:  0xA8A8,\n\t320 - 161:  0xA9A8,\n\t321 - 161:  0xA8A9,\n\t322 - 161:  0xA9A9,\n\t329 - 161:  0xA9B0,\n\t330 - 161:  0xA8AF,\n\t331 - 161:  0xA9AF,\n\t338 - 161:  0xA8AB,\n\t339 - 161:  0xA9AB,\n\t358 - 161:  0xA8AE,\n\t359 - 161:  0xA9AE,\n\t711 - 161:  0xA2A7,\n\t720 - 161:  0xA2B0,\n\t728 - 161:  0xA2A8,\n\t729 - 161:  0xA2AB,\n\t730 - 161:  0xA2AA,\n\t731 - 161:  0xA2AD,\n\t733 - 161:  0xA2A9,\n\t913 - 161:  0xA5C1,\n\t914 - 161:  0xA5C2,\n\t915 - 161:  0xA5C3,\n\t916 - 161:  0xA5C4,\n\t917 - 161:  0xA5C5,\n\t918 - 161:  0xA5C6,\n\t919 - 161:  0xA5C7,\n\t920 - 161:  0xA5C8,\n\t921 - 161:  0xA5C9,\n\t922 - 161:  0xA5CA,\n\t923 - 161:  0xA5CB,\n\t924 - 161:  0xA5CC,\n\t925 - 161:  0xA5CD,\n\t926 - 161:  0xA5CE,\n\t927 - 161:  0xA5CF,\n\t928 - 161:  0xA5D0,\n\t929 - 161:  0xA5D1,\n\t931 - 161:  0xA5D2,\n\t932 - 161:  0xA5D3,\n\t933 - 161:  0xA5D4,\n\t934 - 161:  0xA5D5,\n\t935 - 161:  0xA5D6,\n\t936 - 161:  0xA5D7,\n\t937 - 161:  0xA5D8,\n\t945 - 161:  0xA5E1,\n\t946 - 161:  0xA5E2,\n\t947 - 161:  0xA5E3,\n\t948 - 161:  0xA5E4,\n\t949 - 161:  0xA5E5,\n\t950 - 161:  0xA5E6,\n\t951 - 161:  0xA5E7,\n\t952 - 161:  0xA5E8,\n\t953 - 161:  0xA5E9,\n\t954 - 161:  0xA5EA,\n\t955 - 161:  0xA5EB,\n\t956 - 161:  0xA5EC,\n\t957 - 161:  0xA5ED,\n\t958 - 161:  0xA5EE,\n\t959 - 161:  0xA5EF,\n\t960 - 161:  0xA5F0,\n\t961 - 161:  0xA5F1,\n\t963 - 161:  0xA5F2,\n\t964 - 161:  0xA5F3,\n\t965 - 161:  0xA5F4,\n\t966 - 161:  0xA5F5,\n\t967 - 161:  0xA5F6,\n\t968 - 161:  0xA5F7,\n\t969 - 161:  0xA5F8,\n\t1025 - 161: 0xACA7,\n\t1040 - 161: 0xACA1,\n\t1041 - 161: 0xACA2,\n\t1042 - 161: 0xACA3,\n\t1043 - 161: 0xACA4,\n\t1044 - 161: 0xACA5,\n\t1045 - 161: 0xACA6,\n\t1046 - 161: 0xACA8,\n\t1047 - 161: 0xACA9,\n\t1048 - 161: 0xACAA,\n\t1049 - 161: 0xACAB,\n\t1050 - 161: 0xACAC,\n\t1051 - 161: 0xACAD,\n\t1052 - 161: 0xACAE,\n\t1053 - 161: 0xACAF,\n\t1054 - 161: 0xACB0,\n\t1055 - 161: 0xACB1,\n\t1056 - 161: 0xACB2,\n\t1057 - 161: 0xACB3,\n\t1058 - 161: 0xACB4,\n\t1059 - 161: 0xACB5,\n\t1060 - 161: 0xACB6,\n\t1061 - 161: 0xACB7,\n\t1062 - 161: 0xACB8,\n\t1063 - 161: 0xACB9,\n\t1064 - 161: 0xACBA,\n\t1065 - 161: 0xACBB,\n\t1066 - 161: 0xACBC,\n\t1067 - 161: 0xACBD,\n\t1068 - 161: 0xACBE,\n\t1069 - 161: 0xACBF,\n\t1070 - 161: 0xACC0,\n\t1071 - 161: 0xACC1,\n\t1072 - 161: 0xACD1,\n\t1073 - 161: 0xACD2,\n\t1074 - 161: 0xACD3,\n\t1075 - 161: 0xACD4,\n\t1076 - 161: 0xACD5,\n\t1077 - 161: 0xACD6,\n\t1078 - 161: 0xACD8,\n\t1079 - 161: 0xACD9,\n\t1080 - 161: 0xACDA,\n\t1081 - 161: 0xACDB,\n\t1082 - 161: 0xACDC,\n\t1083 - 161: 0xACDD,\n\t1084 - 161: 0xACDE,\n\t1085 - 161: 0xACDF,\n\t1086 - 161: 0xACE0,\n\t1087 - 161: 0xACE1,\n\t1088 - 161: 0xACE2,\n\t1089 - 161: 0xACE3,\n\t1090 - 161: 0xACE4,\n\t1091 - 161: 0xACE5,\n\t1092 - 161: 0xACE6,\n\t1093 - 161: 0xACE7,\n\t1094 - 161: 0xACE8,\n\t1095 - 161: 0xACE9,\n\t1096 - 161: 0xACEA,\n\t1097 - 161: 0xACEB,\n\t1098 - 161: 0xACEC,\n\t1099 - 161: 0xACED,\n\t1100 - 161: 0xACEE,\n\t1101 - 161: 0xACEF,\n\t1102 - 161: 0xACF0,\n\t1103 - 161: 0xACF1,\n\t1105 - 161: 0xACD7,\n}\n\nconst encode5Low, encode5High = 63744, 64012\n\nvar encode5 = [...]uint16{\n\t63744 - 63744: 0xCBD0,\n\t63745 - 63744: 0xCBD6,\n\t63746 - 63744: 0xCBE7,\n\t63747 - 63744: 0xCDCF,\n\t63748 - 63744: 0xCDE8,\n\t63749 - 63744: 0xCEAD,\n\t63750 - 63744: 0xCFFB,\n\t63751 - 63744: 0xD0A2,\n\t63752 - 63744: 0xD0B8,\n\t63753 - 63744: 0xD0D0,\n\t63754 - 63744: 0xD0DD,\n\t63755 - 63744: 0xD1D4,\n\t63756 - 63744: 0xD1D5,\n\t63757 - 63744: 0xD1D8,\n\t63758 - 63744: 0xD1DB,\n\t63759 - 63744: 0xD1DC,\n\t63760 - 63744: 0xD1DD,\n\t63761 - 63744: 0xD1DE,\n\t63762 - 63744: 0xD1DF,\n\t63763 - 63744: 0xD1E0,\n\t63764 - 63744: 0xD1E2,\n\t63765 - 63744: 0xD1E3,\n\t63766 - 63744: 0xD1E4,\n\t63767 - 63744: 0xD1E5,\n\t63768 - 63744: 0xD1E6,\n\t63769 - 63744: 0xD1E8,\n\t63770 - 63744: 0xD1E9,\n\t63771 - 63744: 0xD1EA,\n\t63772 - 63744: 0xD1EB,\n\t63773 - 63744: 0xD1ED,\n\t63774 - 63744: 0xD1EF,\n\t63775 - 63744: 0xD1F0,\n\t63776 - 63744: 0xD1F2,\n\t63777 - 63744: 0xD1F6,\n\t63778 - 63744: 0xD1FA,\n\t63779 - 63744: 0xD1FC,\n\t63780 - 63744: 0xD1FD,\n\t63781 - 63744: 0xD1FE,\n\t63782 - 63744: 0xD2A2,\n\t63783 - 63744: 0xD2A3,\n\t63784 - 63744: 0xD2A7,\n\t63785 - 63744: 0xD2A8,\n\t63786 - 63744: 0xD2A9,\n\t63787 - 63744: 0xD2AA,\n\t63788 - 63744: 0xD2AB,\n\t63789 - 63744: 0xD2AD,\n\t63790 - 63744: 0xD2B2,\n\t63791 - 63744: 0xD2BE,\n\t63792 - 63744: 0xD2C2,\n\t63793 - 63744: 0xD2C3,\n\t63794 - 63744: 0xD2C4,\n\t63795 - 63744: 0xD2C6,\n\t63796 - 63744: 0xD2C7,\n\t63797 - 63744: 0xD2C8,\n\t63798 - 63744: 0xD2C9,\n\t63799 - 63744: 0xD2CA,\n\t63800 - 63744: 0xD2CB,\n\t63801 - 63744: 0xD2CD,\n\t63802 - 63744: 0xD2CE,\n\t63803 - 63744: 0xD2CF,\n\t63804 - 63744: 0xD2D0,\n\t63805 - 63744: 0xD2D1,\n\t63806 - 63744: 0xD2D2,\n\t63807 - 63744: 0xD2D3,\n\t63808 - 63744: 0xD2D4,\n\t63809 - 63744: 0xD2D5,\n\t63810 - 63744: 0xD2D6,\n\t63811 - 63744: 0xD2D7,\n\t63812 - 63744: 0xD2D9,\n\t63813 - 63744: 0xD2DA,\n\t63814 - 63744: 0xD2DE,\n\t63815 - 63744: 0xD2DF,\n\t63816 - 63744: 0xD2E1,\n\t63817 - 63744: 0xD2E2,\n\t63818 - 63744: 0xD2E4,\n\t63819 - 63744: 0xD2E5,\n\t63820 - 63744: 0xD2E6,\n\t63821 - 63744: 0xD2E7,\n\t63822 - 63744: 0xD2E8,\n\t63823 - 63744: 0xD2E9,\n\t63824 - 63744: 0xD2EA,\n\t63825 - 63744: 0xD2EB,\n\t63826 - 63744: 0xD2F0,\n\t63827 - 63744: 0xD2F1,\n\t63828 - 63744: 0xD2F2,\n\t63829 - 63744: 0xD2F3,\n\t63830 - 63744: 0xD2F4,\n\t63831 - 63744: 0xD2F5,\n\t63832 - 63744: 0xD2F7,\n\t63833 - 63744: 0xD2F8,\n\t63834 - 63744: 0xD4E6,\n\t63835 - 63744: 0xD4FC,\n\t63836 - 63744: 0xD5A5,\n\t63837 - 63744: 0xD5AB,\n\t63838 - 63744: 0xD5AE,\n\t63839 - 63744: 0xD6B8,\n\t63840 - 63744: 0xD6CD,\n\t63841 - 63744: 0xD7CB,\n\t63842 - 63744: 0xD7E4,\n\t63843 - 63744: 0xDBC5,\n\t63844 - 63744: 0xDBE4,\n\t63845 - 63744: 0xDCA5,\n\t63846 - 63744: 0xDDA5,\n\t63847 - 63744: 0xDDD5,\n\t63848 - 63744: 0xDDF4,\n\t63849 - 63744: 0xDEFC,\n\t63850 - 63744: 0xDEFE,\n\t63851 - 63744: 0xDFB3,\n\t63852 - 63744: 0xDFE1,\n\t63853 - 63744: 0xDFE8,\n\t63854 - 63744: 0xE0F1,\n\t63855 - 63744: 0xE1AD,\n\t63856 - 63744: 0xE1ED,\n\t63857 - 63744: 0xE3F5,\n\t63858 - 63744: 0xE4A1,\n\t63859 - 63744: 0xE4A9,\n\t63860 - 63744: 0xE5AE,\n\t63861 - 63744: 0xE5B1,\n\t63862 - 63744: 0xE5B2,\n\t63863 - 63744: 0xE5B9,\n\t63864 - 63744: 0xE5BB,\n\t63865 - 63744: 0xE5BC,\n\t63866 - 63744: 0xE5C4,\n\t63867 - 63744: 0xE5CE,\n\t63868 - 63744: 0xE5D0,\n\t63869 - 63744: 0xE5D2,\n\t63870 - 63744: 0xE5D6,\n\t63871 - 63744: 0xE5FA,\n\t63872 - 63744: 0xE5FB,\n\t63873 - 63744: 0xE5FC,\n\t63874 - 63744: 0xE5FE,\n\t63875 - 63744: 0xE6A1,\n\t63876 - 63744: 0xE6A4,\n\t63877 - 63744: 0xE6A7,\n\t63878 - 63744: 0xE6AD,\n\t63879 - 63744: 0xE6AF,\n\t63880 - 63744: 0xE6B0,\n\t63881 - 63744: 0xE6B1,\n\t63882 - 63744: 0xE6B3,\n\t63883 - 63744: 0xE6B7,\n\t63884 - 63744: 0xE6B8,\n\t63885 - 63744: 0xE6BC,\n\t63886 - 63744: 0xE6C4,\n\t63887 - 63744: 0xE6C6,\n\t63888 - 63744: 0xE6C7,\n\t63889 - 63744: 0xE6CA,\n\t63890 - 63744: 0xE6D2,\n\t63891 - 63744: 0xE6D6,\n\t63892 - 63744: 0xE6D9,\n\t63893 - 63744: 0xE6DC,\n\t63894 - 63744: 0xE6DF,\n\t63895 - 63744: 0xE6E1,\n\t63896 - 63744: 0xE6E4,\n\t63897 - 63744: 0xE6E5,\n\t63898 - 63744: 0xE6E6,\n\t63899 - 63744: 0xE6E8,\n\t63900 - 63744: 0xE6EA,\n\t63901 - 63744: 0xE6EB,\n\t63902 - 63744: 0xE6EC,\n\t63903 - 63744: 0xE6EF,\n\t63904 - 63744: 0xE6F1,\n\t63905 - 63744: 0xE6F2,\n\t63906 - 63744: 0xE6F5,\n\t63907 - 63744: 0xE6F6,\n\t63908 - 63744: 0xE6F7,\n\t63909 - 63744: 0xE6F9,\n\t63910 - 63744: 0xE7A1,\n\t63911 - 63744: 0xE7A6,\n\t63912 - 63744: 0xE7A9,\n\t63913 - 63744: 0xE7AA,\n\t63914 - 63744: 0xE7AC,\n\t63915 - 63744: 0xE7AD,\n\t63916 - 63744: 0xE7B0,\n\t63917 - 63744: 0xE7BF,\n\t63918 - 63744: 0xE7C1,\n\t63919 - 63744: 0xE7C6,\n\t63920 - 63744: 0xE7C7,\n\t63921 - 63744: 0xE7CB,\n\t63922 - 63744: 0xE7CD,\n\t63923 - 63744: 0xE7CF,\n\t63924 - 63744: 0xE7D0,\n\t63925 - 63744: 0xE7D3,\n\t63926 - 63744: 0xE7DF,\n\t63927 - 63744: 0xE7E4,\n\t63928 - 63744: 0xE7E6,\n\t63929 - 63744: 0xE7F7,\n\t63930 - 63744: 0xE8E7,\n\t63931 - 63744: 0xE8E8,\n\t63932 - 63744: 0xE8F0,\n\t63933 - 63744: 0xE8F1,\n\t63934 - 63744: 0xE8F7,\n\t63935 - 63744: 0xE8F9,\n\t63936 - 63744: 0xE8FB,\n\t63937 - 63744: 0xE8FE,\n\t63938 - 63744: 0xE9A7,\n\t63939 - 63744: 0xE9AC,\n\t63940 - 63744: 0xE9CC,\n\t63941 - 63744: 0xE9F7,\n\t63942 - 63744: 0xEAC1,\n\t63943 - 63744: 0xEAE5,\n\t63944 - 63744: 0xEAF4,\n\t63945 - 63744: 0xEAF7,\n\t63946 - 63744: 0xEAFC,\n\t63947 - 63744: 0xEAFE,\n\t63948 - 63744: 0xEBA4,\n\t63949 - 63744: 0xEBA7,\n\t63950 - 63744: 0xEBA9,\n\t63951 - 63744: 0xEBAA,\n\t63952 - 63744: 0xEBBA,\n\t63953 - 63744: 0xEBBB,\n\t63954 - 63744: 0xEBBD,\n\t63955 - 63744: 0xEBC1,\n\t63956 - 63744: 0xEBC2,\n\t63957 - 63744: 0xEBC6,\n\t63958 - 63744: 0xEBC7,\n\t63959 - 63744: 0xEBCC,\n\t63960 - 63744: 0xEBCF,\n\t63961 - 63744: 0xEBD0,\n\t63962 - 63744: 0xEBD1,\n\t63963 - 63744: 0xEBD2,\n\t63964 - 63744: 0xEBD8,\n\t63965 - 63744: 0xECA6,\n\t63966 - 63744: 0xECA7,\n\t63967 - 63744: 0xECAA,\n\t63968 - 63744: 0xECAF,\n\t63969 - 63744: 0xECB0,\n\t63970 - 63744: 0xECB1,\n\t63971 - 63744: 0xECB2,\n\t63972 - 63744: 0xECB5,\n\t63973 - 63744: 0xECB8,\n\t63974 - 63744: 0xECBA,\n\t63975 - 63744: 0xECC0,\n\t63976 - 63744: 0xECC1,\n\t63977 - 63744: 0xECC5,\n\t63978 - 63744: 0xECC6,\n\t63979 - 63744: 0xECC9,\n\t63980 - 63744: 0xECCA,\n\t63981 - 63744: 0xECD5,\n\t63982 - 63744: 0xECDD,\n\t63983 - 63744: 0xECDE,\n\t63984 - 63744: 0xECE1,\n\t63985 - 63744: 0xECE4,\n\t63986 - 63744: 0xECE7,\n\t63987 - 63744: 0xECE8,\n\t63988 - 63744: 0xECF7,\n\t63989 - 63744: 0xECF8,\n\t63990 - 63744: 0xECFA,\n\t63991 - 63744: 0xEDA1,\n\t63992 - 63744: 0xEDA2,\n\t63993 - 63744: 0xEDA3,\n\t63994 - 63744: 0xEDEE,\n\t63995 - 63744: 0xEEDB,\n\t63996 - 63744: 0xF2BD,\n\t63997 - 63744: 0xF2FA,\n\t63998 - 63744: 0xF3B1,\n\t63999 - 63744: 0xF4A7,\n\t64000 - 63744: 0xF4EE,\n\t64001 - 63744: 0xF6F4,\n\t64002 - 63744: 0xF6F6,\n\t64003 - 63744: 0xF7B8,\n\t64004 - 63744: 0xF7C8,\n\t64005 - 63744: 0xF7D3,\n\t64006 - 63744: 0xF8DB,\n\t64007 - 63744: 0xF8F0,\n\t64008 - 63744: 0xFAA1,\n\t64009 - 63744: 0xFAA2,\n\t64010 - 63744: 0xFAE6,\n\t64011 - 63744: 0xFCA9,\n}\n\nconst encode6Low, encode6High = 65281, 65511\n\nvar encode6 = [...]uint16{\n\t65281 - 65281: 0xA3A1,\n\t65282 - 65281: 0xA3A2,\n\t65283 - 65281: 0xA3A3,\n\t65284 - 65281: 0xA3A4,\n\t65285 - 65281: 0xA3A5,\n\t65286 - 65281: 0xA3A6,\n\t65287 - 65281: 0xA3A7,\n\t65288 - 65281: 0xA3A8,\n\t65289 - 65281: 0xA3A9,\n\t65290 - 65281: 0xA3AA,\n\t65291 - 65281: 0xA3AB,\n\t65292 - 65281: 0xA3AC,\n\t65293 - 65281: 0xA3AD,\n\t65294 - 65281: 0xA3AE,\n\t65295 - 65281: 0xA3AF,\n\t65296 - 65281: 0xA3B0,\n\t65297 - 65281: 0xA3B1,\n\t65298 - 65281: 0xA3B2,\n\t65299 - 65281: 0xA3B3,\n\t65300 - 65281: 0xA3B4,\n\t65301 - 65281: 0xA3B5,\n\t65302 - 65281: 0xA3B6,\n\t65303 - 65281: 0xA3B7,\n\t65304 - 65281: 0xA3B8,\n\t65305 - 65281: 0xA3B9,\n\t65306 - 65281: 0xA3BA,\n\t65307 - 65281: 0xA3BB,\n\t65308 - 65281: 0xA3BC,\n\t65309 - 65281: 0xA3BD,\n\t65310 - 65281: 0xA3BE,\n\t65311 - 65281: 0xA3BF,\n\t65312 - 65281: 0xA3C0,\n\t65313 - 65281: 0xA3C1,\n\t65314 - 65281: 0xA3C2,\n\t65315 - 65281: 0xA3C3,\n\t65316 - 65281: 0xA3C4,\n\t65317 - 65281: 0xA3C5,\n\t65318 - 65281: 0xA3C6,\n\t65319 - 65281: 0xA3C7,\n\t65320 - 65281: 0xA3C8,\n\t65321 - 65281: 0xA3C9,\n\t65322 - 65281: 0xA3CA,\n\t65323 - 65281: 0xA3CB,\n\t65324 - 65281: 0xA3CC,\n\t65325 - 65281: 0xA3CD,\n\t65326 - 65281: 0xA3CE,\n\t65327 - 65281: 0xA3CF,\n\t65328 - 65281: 0xA3D0,\n\t65329 - 65281: 0xA3D1,\n\t65330 - 65281: 0xA3D2,\n\t65331 - 65281: 0xA3D3,\n\t65332 - 65281: 0xA3D4,\n\t65333 - 65281: 0xA3D5,\n\t65334 - 65281: 0xA3D6,\n\t65335 - 65281: 0xA3D7,\n\t65336 - 65281: 0xA3D8,\n\t65337 - 65281: 0xA3D9,\n\t65338 - 65281: 0xA3DA,\n\t65339 - 65281: 0xA3DB,\n\t65340 - 65281: 0xA1AC,\n\t65341 - 65281: 0xA3DD,\n\t65342 - 65281: 0xA3DE,\n\t65343 - 65281: 0xA3DF,\n\t65344 - 65281: 0xA3E0,\n\t65345 - 65281: 0xA3E1,\n\t65346 - 65281: 0xA3E2,\n\t65347 - 65281: 0xA3E3,\n\t65348 - 65281: 0xA3E4,\n\t65349 - 65281: 0xA3E5,\n\t65350 - 65281: 0xA3E6,\n\t65351 - 65281: 0xA3E7,\n\t65352 - 65281: 0xA3E8,\n\t65353 - 65281: 0xA3E9,\n\t65354 - 65281: 0xA3EA,\n\t65355 - 65281: 0xA3EB,\n\t65356 - 65281: 0xA3EC,\n\t65357 - 65281: 0xA3ED,\n\t65358 - 65281: 0xA3EE,\n\t65359 - 65281: 0xA3EF,\n\t65360 - 65281: 0xA3F0,\n\t65361 - 65281: 0xA3F1,\n\t65362 - 65281: 0xA3F2,\n\t65363 - 65281: 0xA3F3,\n\t65364 - 65281: 0xA3F4,\n\t65365 - 65281: 0xA3F5,\n\t65366 - 65281: 0xA3F6,\n\t65367 - 65281: 0xA3F7,\n\t65368 - 65281: 0xA3F8,\n\t65369 - 65281: 0xA3F9,\n\t65370 - 65281: 0xA3FA,\n\t65371 - 65281: 0xA3FB,\n\t65372 - 65281: 0xA3FC,\n\t65373 - 65281: 0xA3FD,\n\t65374 - 65281: 0xA2A6,\n\t65504 - 65281: 0xA1CB,\n\t65505 - 65281: 0xA1CC,\n\t65506 - 65281: 0xA1FE,\n\t65507 - 65281: 0xA3FE,\n\t65509 - 65281: 0xA1CD,\n\t65510 - 65281: 0xA3DC,\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/simplifiedchinese/all.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage simplifiedchinese\n\nimport (\n\t\"golang.org/x/text/encoding\"\n)\n\n// All is a list of all defined encodings in this package.\nvar All = []encoding.Encoding{GB18030, GBK, HZGB2312}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/simplifiedchinese/gbk.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage simplifiedchinese\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\nvar (\n\t// GB18030 is the GB18030 encoding.\n\tGB18030 encoding.Encoding = &gbk18030\n\t// GBK is the GBK encoding. It encodes an extension of the GB2312 character set\n\t// and is also known as Code Page 936.\n\tGBK encoding.Encoding = &gbk\n)\n\nvar gbk = internal.Encoding{\n\t&internal.SimpleEncoding{\n\t\tgbkDecoder{gb18030: false},\n\t\tgbkEncoder{gb18030: false},\n\t},\n\t\"GBK\",\n\tidentifier.GBK,\n}\n\nvar gbk18030 = internal.Encoding{\n\t&internal.SimpleEncoding{\n\t\tgbkDecoder{gb18030: true},\n\t\tgbkEncoder{gb18030: true},\n\t},\n\t\"GB18030\",\n\tidentifier.GB18030,\n}\n\nvar (\n\terrInvalidGB18030 = errors.New(\"simplifiedchinese: invalid GB18030 encoding\")\n\terrInvalidGBK     = errors.New(\"simplifiedchinese: invalid GBK encoding\")\n)\n\ntype gbkDecoder struct {\n\ttransform.NopResetter\n\tgb18030 bool\n}\n\nfunc (d gbkDecoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tswitch c0 := src[nSrc]; {\n\t\tcase c0 < utf8.RuneSelf:\n\t\t\tr, size = rune(c0), 1\n\n\t\t// Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC\n\t\t// as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk\n\t\t// says to treat \"gbk\" as Code Page 936.\n\t\tcase c0 == 0x80:\n\t\t\tr, size = '€', 1\n\n\t\tcase c0 < 0xff:\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tswitch {\n\t\t\tcase 0x40 <= c1 && c1 < 0x7f:\n\t\t\t\tc1 -= 0x40\n\t\t\tcase 0x80 <= c1 && c1 < 0xff:\n\t\t\t\tc1 -= 0x41\n\t\t\tcase d.gb18030 && 0x30 <= c1 && c1 < 0x40:\n\t\t\t\tif nSrc+3 >= len(src) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t\tc2 := src[nSrc+2]\n\t\t\t\tif c2 < 0x81 || 0xff <= c2 {\n\t\t\t\t\terr = errInvalidGB18030\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t\tc3 := src[nSrc+3]\n\t\t\t\tif c3 < 0x30 || 0x3a <= c3 {\n\t\t\t\t\terr = errInvalidGB18030\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t\tsize = 4\n\t\t\t\tr = ((rune(c0-0x81)*10+rune(c1-0x30))*126+rune(c2-0x81))*10 + rune(c3-0x30)\n\t\t\t\tif r < 39420 {\n\t\t\t\t\ti, j := 0, len(gb18030)\n\t\t\t\t\tfor i < j {\n\t\t\t\t\t\th := i + (j-i)/2\n\t\t\t\t\t\tif r >= rune(gb18030[h][0]) {\n\t\t\t\t\t\t\ti = h + 1\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tj = h\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdec := &gb18030[i-1]\n\t\t\t\t\tr += rune(dec[1]) - rune(dec[0])\n\t\t\t\t\tgoto write\n\t\t\t\t}\n\t\t\t\tr -= 189000\n\t\t\t\tif 0 <= r && r < 0x100000 {\n\t\t\t\t\tr += 0x10000\n\t\t\t\t\tgoto write\n\t\t\t\t}\n\t\t\t\terr = errInvalidGB18030\n\t\t\t\tbreak loop\n\t\t\tdefault:\n\t\t\t\tif d.gb18030 {\n\t\t\t\t\terr = errInvalidGB18030\n\t\t\t\t} else {\n\t\t\t\t\terr = errInvalidGBK\n\t\t\t\t}\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tr, size = '\\ufffd', 2\n\t\t\tif i := int(c0-0x81)*190 + int(c1); i < len(decode) {\n\t\t\t\tr = rune(decode[i])\n\t\t\t\tif r == 0 {\n\t\t\t\t\tr = '\\ufffd'\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\tif d.gb18030 {\n\t\t\t\terr = errInvalidGB18030\n\t\t\t} else {\n\t\t\t\terr = errInvalidGBK\n\t\t\t}\n\t\t\tbreak loop\n\t\t}\n\n\twrite:\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t}\n\tif atEOF && err == transform.ErrShortSrc {\n\t\tif d.gb18030 {\n\t\t\terr = errInvalidGB18030\n\t\t} else {\n\t\t\terr = errInvalidGBK\n\t\t}\n\t}\n\treturn nDst, nSrc, err\n}\n\ntype gbkEncoder struct {\n\ttransform.NopResetter\n\tgb18030 bool\n}\n\nfunc (e gbkEncoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, r2, size := rune(0), rune(0), 0\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// func init checks that the switch covers all tables.\n\t\t\tswitch {\n\t\t\tcase encode0Low <= r && r < encode0High:\n\t\t\t\tif r2 = rune(encode0[r-encode0Low]); r2 != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode1Low <= r && r < encode1High:\n\t\t\t\t// Microsoft's Code Page 936 extends GBK 1.0 to encode the euro sign U+20AC\n\t\t\t\t// as 0x80. The HTML5 specification at http://encoding.spec.whatwg.org/#gbk\n\t\t\t\t// says to treat \"gbk\" as Code Page 936.\n\t\t\t\tif r == '€' {\n\t\t\t\t\tr = 0x80\n\t\t\t\t\tgoto write1\n\t\t\t\t}\n\t\t\t\tif r2 = rune(encode1[r-encode1Low]); r2 != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode2Low <= r && r < encode2High:\n\t\t\t\tif r2 = rune(encode2[r-encode2Low]); r2 != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode3Low <= r && r < encode3High:\n\t\t\t\tif r2 = rune(encode3[r-encode3Low]); r2 != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode4Low <= r && r < encode4High:\n\t\t\t\tif r2 = rune(encode4[r-encode4Low]); r2 != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif e.gb18030 {\n\t\t\t\tif r < 0x10000 {\n\t\t\t\t\ti, j := 0, len(gb18030)\n\t\t\t\t\tfor i < j {\n\t\t\t\t\t\th := i + (j-i)/2\n\t\t\t\t\t\tif r >= rune(gb18030[h][1]) {\n\t\t\t\t\t\t\ti = h + 1\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tj = h\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdec := &gb18030[i-1]\n\t\t\t\t\tr += rune(dec[0]) - rune(dec[1])\n\t\t\t\t\tgoto write4\n\t\t\t\t} else if r < 0x110000 {\n\t\t\t\t\tr += 189000 - 0x10000\n\t\t\t\t\tgoto write4\n\t\t\t\t}\n\t\t\t}\n\t\t\terr = internal.ErrASCIIReplacement\n\t\t\tbreak\n\t\t}\n\n\twrite1:\n\t\tif nDst >= len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst] = uint8(r)\n\t\tnDst++\n\t\tcontinue\n\n\twrite2:\n\t\tif nDst+2 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+0] = uint8(r2 >> 8)\n\t\tdst[nDst+1] = uint8(r2)\n\t\tnDst += 2\n\t\tcontinue\n\n\twrite4:\n\t\tif nDst+4 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+3] = uint8(r%10 + 0x30)\n\t\tr /= 10\n\t\tdst[nDst+2] = uint8(r%126 + 0x81)\n\t\tr /= 126\n\t\tdst[nDst+1] = uint8(r%10 + 0x30)\n\t\tr /= 10\n\t\tdst[nDst+0] = uint8(r + 0x81)\n\t\tnDst += 4\n\t\tcontinue\n\t}\n\treturn nDst, nSrc, err\n}\n\nfunc init() {\n\t// Check that the hard-coded encode switch covers all tables.\n\tif numEncodeTables != 5 {\n\t\tpanic(\"bad numEncodeTables\")\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/simplifiedchinese/hzgb2312.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage simplifiedchinese\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// HZGB2312 is the HZ-GB2312 encoding.\nvar HZGB2312 encoding.Encoding = &hzGB2312\n\nvar hzGB2312 = internal.Encoding{\n\tinternal.FuncEncoding{hzGB2312NewDecoder, hzGB2312NewEncoder},\n\t\"HZ-GB2312\",\n\tidentifier.HZGB2312,\n}\n\nfunc hzGB2312NewDecoder() transform.Transformer {\n\treturn new(hzGB2312Decoder)\n}\n\nfunc hzGB2312NewEncoder() transform.Transformer {\n\treturn new(hzGB2312Encoder)\n}\n\nvar errInvalidHZGB2312 = errors.New(\"simplifiedchinese: invalid HZ-GB2312 encoding\")\n\nconst (\n\tasciiState = iota\n\tgbState\n)\n\ntype hzGB2312Decoder int\n\nfunc (d *hzGB2312Decoder) Reset() {\n\t*d = asciiState\n}\n\nfunc (d *hzGB2312Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tc0 := src[nSrc]\n\t\tif c0 >= utf8.RuneSelf {\n\t\t\terr = errInvalidHZGB2312\n\t\t\tbreak loop\n\t\t}\n\n\t\tif c0 == '~' {\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tsize = 2\n\t\t\tswitch src[nSrc+1] {\n\t\t\tcase '{':\n\t\t\t\t*d = gbState\n\t\t\t\tcontinue\n\t\t\tcase '}':\n\t\t\t\t*d = asciiState\n\t\t\t\tcontinue\n\t\t\tcase '~':\n\t\t\t\tif nDst >= len(dst) {\n\t\t\t\t\terr = transform.ErrShortDst\n\t\t\t\t\tbreak loop\n\t\t\t\t}\n\t\t\t\tdst[nDst] = '~'\n\t\t\t\tnDst++\n\t\t\t\tcontinue\n\t\t\tcase '\\n':\n\t\t\t\tcontinue\n\t\t\tdefault:\n\t\t\t\terr = errInvalidHZGB2312\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t}\n\n\t\tif *d == asciiState {\n\t\t\tr, size = rune(c0), 1\n\t\t} else {\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tif c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 {\n\t\t\t\terr = errInvalidHZGB2312\n\t\t\t\tbreak loop\n\t\t\t}\n\n\t\t\tr, size = '\\ufffd', 2\n\t\t\tif i := int(c0-0x01)*190 + int(c1+0x3f); i < len(decode) {\n\t\t\t\tr = rune(decode[i])\n\t\t\t\tif r == 0 {\n\t\t\t\t\tr = '\\ufffd'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t}\n\tif atEOF && err == transform.ErrShortSrc {\n\t\terr = errInvalidHZGB2312\n\t}\n\treturn nDst, nSrc, err\n}\n\ntype hzGB2312Encoder int\n\nfunc (d *hzGB2312Encoder) Reset() {\n\t*d = asciiState\n}\n\nfunc (e *hzGB2312Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\t\t\tif r == '~' {\n\t\t\t\tif nDst+2 > len(dst) {\n\t\t\t\t\terr = transform.ErrShortDst\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tdst[nDst+0] = '~'\n\t\t\t\tdst[nDst+1] = '~'\n\t\t\t\tnDst += 2\n\t\t\t\tcontinue\n\t\t\t} else if *e != asciiState {\n\t\t\t\tif nDst+3 > len(dst) {\n\t\t\t\t\terr = transform.ErrShortDst\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t*e = asciiState\n\t\t\t\tdst[nDst+0] = '~'\n\t\t\t\tdst[nDst+1] = '}'\n\t\t\t\tnDst += 2\n\t\t\t} else if nDst >= len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst] = uint8(r)\n\t\t\tnDst += 1\n\t\t\tcontinue\n\n\t\t}\n\n\t\t// Decode a multi-byte rune.\n\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\tif size == 1 {\n\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t// full character yet.\n\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\t// func init checks that the switch covers all tables.\n\t\tswitch {\n\t\tcase encode0Low <= r && r < encode0High:\n\t\t\tif r = rune(encode0[r-encode0Low]); r != 0 {\n\t\t\t\tgoto writeGB\n\t\t\t}\n\t\tcase encode1Low <= r && r < encode1High:\n\t\t\tif r = rune(encode1[r-encode1Low]); r != 0 {\n\t\t\t\tgoto writeGB\n\t\t\t}\n\t\tcase encode2Low <= r && r < encode2High:\n\t\t\tif r = rune(encode2[r-encode2Low]); r != 0 {\n\t\t\t\tgoto writeGB\n\t\t\t}\n\t\tcase encode3Low <= r && r < encode3High:\n\t\t\tif r = rune(encode3[r-encode3Low]); r != 0 {\n\t\t\t\tgoto writeGB\n\t\t\t}\n\t\tcase encode4Low <= r && r < encode4High:\n\t\t\tif r = rune(encode4[r-encode4Low]); r != 0 {\n\t\t\t\tgoto writeGB\n\t\t\t}\n\t\t}\n\n\tterminateInASCIIState:\n\t\t// Switch back to ASCII state in case of error so that an ASCII\n\t\t// replacement character can be written in the correct state.\n\t\tif *e != asciiState {\n\t\t\tif nDst+2 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst+0] = '~'\n\t\t\tdst[nDst+1] = '}'\n\t\t\tnDst += 2\n\t\t}\n\t\terr = internal.ErrASCIIReplacement\n\t\tbreak\n\n\twriteGB:\n\t\tc0 := uint8(r>>8) - 0x80\n\t\tc1 := uint8(r) - 0x80\n\t\tif c0 < 0x21 || 0x7e <= c0 || c1 < 0x21 || 0x7f <= c1 {\n\t\t\tgoto terminateInASCIIState\n\t\t}\n\t\tif *e == asciiState {\n\t\t\tif nDst+4 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t*e = gbState\n\t\t\tdst[nDst+0] = '~'\n\t\t\tdst[nDst+1] = '{'\n\t\t\tnDst += 2\n\t\t} else if nDst+2 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+0] = c0\n\t\tdst[nDst+1] = c1\n\t\tnDst += 2\n\t\tcontinue\n\t}\n\t// TODO: should one always terminate in ASCII state to make it safe to\n\t// concatenate two HZ-GB2312-encoded strings?\n\treturn nDst, nSrc, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/simplifiedchinese/maketables.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\n// This program generates tables.go:\n//\tgo run maketables.go | gofmt > tables.go\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"sort\"\n\t\"strings\"\n)\n\nfunc main() {\n\tfmt.Printf(\"// generated by go run maketables.go; DO NOT EDIT\\n\\n\")\n\tfmt.Printf(\"// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\\n\")\n\tfmt.Printf(`package simplifiedchinese // import \"golang.org/x/text/encoding/simplifiedchinese\"` + \"\\n\\n\")\n\n\tprintGB18030()\n\tprintGBK()\n}\n\nfunc printGB18030() {\n\tres, err := http.Get(\"http://encoding.spec.whatwg.org/index-gb18030.txt\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Get: %v\", err)\n\t}\n\tdefer res.Body.Close()\n\n\tfmt.Printf(\"// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\\n\")\n\tfmt.Printf(\"var gb18030 = [...][2]uint16{\\n\")\n\tscanner := bufio.NewScanner(res.Body)\n\tfor scanner.Scan() {\n\t\ts := strings.TrimSpace(scanner.Text())\n\t\tif s == \"\" || s[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\tx, y := uint32(0), uint32(0)\n\t\tif _, err := fmt.Sscanf(s, \"%d 0x%x\", &x, &y); err != nil {\n\t\t\tlog.Fatalf(\"could not parse %q\", s)\n\t\t}\n\t\tif x < 0x10000 && y < 0x10000 {\n\t\t\tfmt.Printf(\"\\t{0x%04x, 0x%04x},\\n\", x, y)\n\t\t}\n\t}\n\tfmt.Printf(\"}\\n\\n\")\n}\n\nfunc printGBK() {\n\tres, err := http.Get(\"http://encoding.spec.whatwg.org/index-gbk.txt\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Get: %v\", err)\n\t}\n\tdefer res.Body.Close()\n\n\tmapping := [65536]uint16{}\n\treverse := [65536]uint16{}\n\n\tscanner := bufio.NewScanner(res.Body)\n\tfor scanner.Scan() {\n\t\ts := strings.TrimSpace(scanner.Text())\n\t\tif s == \"\" || s[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\tx, y := uint16(0), uint16(0)\n\t\tif _, err := fmt.Sscanf(s, \"%d 0x%x\", &x, &y); err != nil {\n\t\t\tlog.Fatalf(\"could not parse %q\", s)\n\t\t}\n\t\tif x < 0 || 126*190 <= x {\n\t\t\tlog.Fatalf(\"GBK code %d is out of range\", x)\n\t\t}\n\t\tmapping[x] = y\n\t\tif reverse[y] == 0 {\n\t\t\tc0, c1 := x/190, x%190\n\t\t\tif c1 >= 0x3f {\n\t\t\t\tc1++\n\t\t\t}\n\t\t\treverse[y] = (0x81+c0)<<8 | (0x40 + c1)\n\t\t}\n\t}\n\tif err := scanner.Err(); err != nil {\n\t\tlog.Fatalf(\"scanner error: %v\", err)\n\t}\n\n\tfmt.Printf(\"// decode is the decoding table from GBK code to Unicode.\\n\")\n\tfmt.Printf(\"// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\\n\")\n\tfmt.Printf(\"var decode = [...]uint16{\\n\")\n\tfor i, v := range mapping {\n\t\tif v != 0 {\n\t\t\tfmt.Printf(\"\\t%d: 0x%04X,\\n\", i, v)\n\t\t}\n\t}\n\tfmt.Printf(\"}\\n\\n\")\n\n\t// Any run of at least separation continuous zero entries in the reverse map will\n\t// be a separate encode table.\n\tconst separation = 1024\n\n\tintervals := []interval(nil)\n\tlow, high := -1, -1\n\tfor i, v := range reverse {\n\t\tif v == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tif low < 0 {\n\t\t\tlow = i\n\t\t} else if i-high >= separation {\n\t\t\tif high >= 0 {\n\t\t\t\tintervals = append(intervals, interval{low, high})\n\t\t\t}\n\t\t\tlow = i\n\t\t}\n\t\thigh = i + 1\n\t}\n\tif high >= 0 {\n\t\tintervals = append(intervals, interval{low, high})\n\t}\n\tsort.Sort(byDecreasingLength(intervals))\n\n\tfmt.Printf(\"const numEncodeTables = %d\\n\\n\", len(intervals))\n\tfmt.Printf(\"// encodeX are the encoding tables from Unicode to GBK code,\\n\")\n\tfmt.Printf(\"// sorted by decreasing length.\\n\")\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"// encode%d: %5d entries for runes in [%5d, %5d).\\n\", i, v.len(), v.low, v.high)\n\t}\n\tfmt.Printf(\"\\n\")\n\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"const encode%dLow, encode%dHigh = %d, %d\\n\\n\", i, i, v.low, v.high)\n\t\tfmt.Printf(\"var encode%d = [...]uint16{\\n\", i)\n\t\tfor j := v.low; j < v.high; j++ {\n\t\t\tx := reverse[j]\n\t\t\tif x == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfmt.Printf(\"\\t%d-%d: 0x%04X,\\n\", j, v.low, x)\n\t\t}\n\t\tfmt.Printf(\"}\\n\\n\")\n\t}\n}\n\n// interval is a half-open interval [low, high).\ntype interval struct {\n\tlow, high int\n}\n\nfunc (i interval) len() int { return i.high - i.low }\n\n// byDecreasingLength sorts intervals by decreasing length.\ntype byDecreasingLength []interval\n\nfunc (b byDecreasingLength) Len() int           { return len(b) }\nfunc (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }\nfunc (b byDecreasingLength) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/simplifiedchinese/tables.go",
    "content": "// generated by go run maketables.go; DO NOT EDIT\n\n// Package simplifiedchinese provides Simplified Chinese encodings such as GBK.\npackage simplifiedchinese // import \"golang.org/x/text/encoding/simplifiedchinese\"\n\n// gb18030 is the table from http://encoding.spec.whatwg.org/index-gb18030.txt\nvar gb18030 = [...][2]uint16{\n\t{0x0000, 0x0080},\n\t{0x0024, 0x00a5},\n\t{0x0026, 0x00a9},\n\t{0x002d, 0x00b2},\n\t{0x0032, 0x00b8},\n\t{0x0051, 0x00d8},\n\t{0x0059, 0x00e2},\n\t{0x005f, 0x00eb},\n\t{0x0060, 0x00ee},\n\t{0x0064, 0x00f4},\n\t{0x0067, 0x00f8},\n\t{0x0068, 0x00fb},\n\t{0x0069, 0x00fd},\n\t{0x006d, 0x0102},\n\t{0x007e, 0x0114},\n\t{0x0085, 0x011c},\n\t{0x0094, 0x012c},\n\t{0x00ac, 0x0145},\n\t{0x00af, 0x0149},\n\t{0x00b3, 0x014e},\n\t{0x00d0, 0x016c},\n\t{0x0132, 0x01cf},\n\t{0x0133, 0x01d1},\n\t{0x0134, 0x01d3},\n\t{0x0135, 0x01d5},\n\t{0x0136, 0x01d7},\n\t{0x0137, 0x01d9},\n\t{0x0138, 0x01db},\n\t{0x0139, 0x01dd},\n\t{0x0155, 0x01fa},\n\t{0x01ac, 0x0252},\n\t{0x01bb, 0x0262},\n\t{0x0220, 0x02c8},\n\t{0x0221, 0x02cc},\n\t{0x022e, 0x02da},\n\t{0x02e5, 0x03a2},\n\t{0x02e6, 0x03aa},\n\t{0x02ed, 0x03c2},\n\t{0x02ee, 0x03ca},\n\t{0x0325, 0x0402},\n\t{0x0333, 0x0450},\n\t{0x0334, 0x0452},\n\t{0x1ef2, 0x2011},\n\t{0x1ef4, 0x2017},\n\t{0x1ef5, 0x201a},\n\t{0x1ef7, 0x201e},\n\t{0x1efe, 0x2027},\n\t{0x1f07, 0x2031},\n\t{0x1f08, 0x2034},\n\t{0x1f09, 0x2036},\n\t{0x1f0e, 0x203c},\n\t{0x1f7e, 0x20ad},\n\t{0x1fd4, 0x2104},\n\t{0x1fd5, 0x2106},\n\t{0x1fd8, 0x210a},\n\t{0x1fe4, 0x2117},\n\t{0x1fee, 0x2122},\n\t{0x202c, 0x216c},\n\t{0x2030, 0x217a},\n\t{0x2046, 0x2194},\n\t{0x2048, 0x219a},\n\t{0x20b6, 0x2209},\n\t{0x20bc, 0x2210},\n\t{0x20bd, 0x2212},\n\t{0x20c0, 0x2216},\n\t{0x20c4, 0x221b},\n\t{0x20c6, 0x2221},\n\t{0x20c8, 0x2224},\n\t{0x20c9, 0x2226},\n\t{0x20ca, 0x222c},\n\t{0x20cc, 0x222f},\n\t{0x20d1, 0x2238},\n\t{0x20d6, 0x223e},\n\t{0x20e0, 0x2249},\n\t{0x20e3, 0x224d},\n\t{0x20e8, 0x2253},\n\t{0x20f5, 0x2262},\n\t{0x20f7, 0x2268},\n\t{0x20fd, 0x2270},\n\t{0x2122, 0x2296},\n\t{0x2125, 0x229a},\n\t{0x2130, 0x22a6},\n\t{0x2149, 0x22c0},\n\t{0x219b, 0x2313},\n\t{0x22e8, 0x246a},\n\t{0x22f2, 0x249c},\n\t{0x2356, 0x254c},\n\t{0x235a, 0x2574},\n\t{0x2367, 0x2590},\n\t{0x236a, 0x2596},\n\t{0x2374, 0x25a2},\n\t{0x2384, 0x25b4},\n\t{0x238c, 0x25be},\n\t{0x2394, 0x25c8},\n\t{0x2397, 0x25cc},\n\t{0x2399, 0x25d0},\n\t{0x23ab, 0x25e6},\n\t{0x23ca, 0x2607},\n\t{0x23cc, 0x260a},\n\t{0x2402, 0x2641},\n\t{0x2403, 0x2643},\n\t{0x2c41, 0x2e82},\n\t{0x2c43, 0x2e85},\n\t{0x2c46, 0x2e89},\n\t{0x2c48, 0x2e8d},\n\t{0x2c52, 0x2e98},\n\t{0x2c61, 0x2ea8},\n\t{0x2c63, 0x2eab},\n\t{0x2c66, 0x2eaf},\n\t{0x2c6a, 0x2eb4},\n\t{0x2c6c, 0x2eb8},\n\t{0x2c6f, 0x2ebc},\n\t{0x2c7d, 0x2ecb},\n\t{0x2da2, 0x2ffc},\n\t{0x2da6, 0x3004},\n\t{0x2da7, 0x3018},\n\t{0x2dac, 0x301f},\n\t{0x2dae, 0x302a},\n\t{0x2dc2, 0x303f},\n\t{0x2dc4, 0x3094},\n\t{0x2dcb, 0x309f},\n\t{0x2dcd, 0x30f7},\n\t{0x2dd2, 0x30ff},\n\t{0x2dd8, 0x312a},\n\t{0x2ece, 0x322a},\n\t{0x2ed5, 0x3232},\n\t{0x2f46, 0x32a4},\n\t{0x3030, 0x3390},\n\t{0x303c, 0x339f},\n\t{0x303e, 0x33a2},\n\t{0x3060, 0x33c5},\n\t{0x3069, 0x33cf},\n\t{0x306b, 0x33d3},\n\t{0x306d, 0x33d6},\n\t{0x30de, 0x3448},\n\t{0x3109, 0x3474},\n\t{0x3233, 0x359f},\n\t{0x32a2, 0x360f},\n\t{0x32ad, 0x361b},\n\t{0x35aa, 0x3919},\n\t{0x35ff, 0x396f},\n\t{0x365f, 0x39d1},\n\t{0x366d, 0x39e0},\n\t{0x3700, 0x3a74},\n\t{0x37da, 0x3b4f},\n\t{0x38f9, 0x3c6f},\n\t{0x396a, 0x3ce1},\n\t{0x3cdf, 0x4057},\n\t{0x3de7, 0x4160},\n\t{0x3fbe, 0x4338},\n\t{0x4032, 0x43ad},\n\t{0x4036, 0x43b2},\n\t{0x4061, 0x43de},\n\t{0x4159, 0x44d7},\n\t{0x42ce, 0x464d},\n\t{0x42e2, 0x4662},\n\t{0x43a3, 0x4724},\n\t{0x43a8, 0x472a},\n\t{0x43fa, 0x477d},\n\t{0x440a, 0x478e},\n\t{0x45c3, 0x4948},\n\t{0x45f5, 0x497b},\n\t{0x45f7, 0x497e},\n\t{0x45fb, 0x4984},\n\t{0x45fc, 0x4987},\n\t{0x4610, 0x499c},\n\t{0x4613, 0x49a0},\n\t{0x4629, 0x49b8},\n\t{0x48e8, 0x4c78},\n\t{0x490f, 0x4ca4},\n\t{0x497e, 0x4d1a},\n\t{0x4a12, 0x4daf},\n\t{0x4a63, 0x9fa6},\n\t{0x82bd, 0xe76c},\n\t{0x82be, 0xe7c8},\n\t{0x82bf, 0xe7e7},\n\t{0x82cc, 0xe815},\n\t{0x82cd, 0xe819},\n\t{0x82d2, 0xe81f},\n\t{0x82d9, 0xe827},\n\t{0x82dd, 0xe82d},\n\t{0x82e1, 0xe833},\n\t{0x82e9, 0xe83c},\n\t{0x82f0, 0xe844},\n\t{0x8300, 0xe856},\n\t{0x830e, 0xe865},\n\t{0x93d5, 0xf92d},\n\t{0x9421, 0xf97a},\n\t{0x943c, 0xf996},\n\t{0x948d, 0xf9e8},\n\t{0x9496, 0xf9f2},\n\t{0x94b0, 0xfa10},\n\t{0x94b1, 0xfa12},\n\t{0x94b2, 0xfa15},\n\t{0x94b5, 0xfa19},\n\t{0x94bb, 0xfa22},\n\t{0x94bc, 0xfa25},\n\t{0x94be, 0xfa2a},\n\t{0x98c4, 0xfe32},\n\t{0x98c5, 0xfe45},\n\t{0x98c9, 0xfe53},\n\t{0x98ca, 0xfe58},\n\t{0x98cb, 0xfe67},\n\t{0x98cc, 0xfe6c},\n\t{0x9961, 0xff5f},\n\t{0x99e2, 0xffe6},\n}\n\n// decode is the decoding table from GBK code to Unicode.\n// It is defined at http://encoding.spec.whatwg.org/index-gbk.txt\nvar decode = [...]uint16{\n\t0:     0x4E02,\n\t1:     0x4E04,\n\t2:     0x4E05,\n\t3:     0x4E06,\n\t4:     0x4E0F,\n\t5:     0x4E12,\n\t6:     0x4E17,\n\t7:     0x4E1F,\n\t8:     0x4E20,\n\t9:     0x4E21,\n\t10:    0x4E23,\n\t11:    0x4E26,\n\t12:    0x4E29,\n\t13:    0x4E2E,\n\t14:    0x4E2F,\n\t15:    0x4E31,\n\t16:    0x4E33,\n\t17:    0x4E35,\n\t18:    0x4E37,\n\t19:    0x4E3C,\n\t20:    0x4E40,\n\t21:    0x4E41,\n\t22:    0x4E42,\n\t23:    0x4E44,\n\t24:    0x4E46,\n\t25:    0x4E4A,\n\t26:    0x4E51,\n\t27:    0x4E55,\n\t28:    0x4E57,\n\t29:    0x4E5A,\n\t30:    0x4E5B,\n\t31:    0x4E62,\n\t32:    0x4E63,\n\t33:    0x4E64,\n\t34:    0x4E65,\n\t35:    0x4E67,\n\t36:    0x4E68,\n\t37:    0x4E6A,\n\t38:    0x4E6B,\n\t39:    0x4E6C,\n\t40:    0x4E6D,\n\t41:    0x4E6E,\n\t42:    0x4E6F,\n\t43:    0x4E72,\n\t44:    0x4E74,\n\t45:    0x4E75,\n\t46:    0x4E76,\n\t47:    0x4E77,\n\t48:    0x4E78,\n\t49:    0x4E79,\n\t50:    0x4E7A,\n\t51:    0x4E7B,\n\t52:    0x4E7C,\n\t53:    0x4E7D,\n\t54:    0x4E7F,\n\t55:    0x4E80,\n\t56:    0x4E81,\n\t57:    0x4E82,\n\t58:    0x4E83,\n\t59:    0x4E84,\n\t60:    0x4E85,\n\t61:    0x4E87,\n\t62:    0x4E8A,\n\t63:    0x4E90,\n\t64:    0x4E96,\n\t65:    0x4E97,\n\t66:    0x4E99,\n\t67:    0x4E9C,\n\t68:    0x4E9D,\n\t69:    0x4E9E,\n\t70:    0x4EA3,\n\t71:    0x4EAA,\n\t72:    0x4EAF,\n\t73:    0x4EB0,\n\t74:    0x4EB1,\n\t75:    0x4EB4,\n\t76:    0x4EB6,\n\t77:    0x4EB7,\n\t78:    0x4EB8,\n\t79:    0x4EB9,\n\t80:    0x4EBC,\n\t81:    0x4EBD,\n\t82:    0x4EBE,\n\t83:    0x4EC8,\n\t84:    0x4ECC,\n\t85:    0x4ECF,\n\t86:    0x4ED0,\n\t87:    0x4ED2,\n\t88:    0x4EDA,\n\t89:    0x4EDB,\n\t90:    0x4EDC,\n\t91:    0x4EE0,\n\t92:    0x4EE2,\n\t93:    0x4EE6,\n\t94:    0x4EE7,\n\t95:    0x4EE9,\n\t96:    0x4EED,\n\t97:    0x4EEE,\n\t98:    0x4EEF,\n\t99:    0x4EF1,\n\t100:   0x4EF4,\n\t101:   0x4EF8,\n\t102:   0x4EF9,\n\t103:   0x4EFA,\n\t104:   0x4EFC,\n\t105:   0x4EFE,\n\t106:   0x4F00,\n\t107:   0x4F02,\n\t108:   0x4F03,\n\t109:   0x4F04,\n\t110:   0x4F05,\n\t111:   0x4F06,\n\t112:   0x4F07,\n\t113:   0x4F08,\n\t114:   0x4F0B,\n\t115:   0x4F0C,\n\t116:   0x4F12,\n\t117:   0x4F13,\n\t118:   0x4F14,\n\t119:   0x4F15,\n\t120:   0x4F16,\n\t121:   0x4F1C,\n\t122:   0x4F1D,\n\t123:   0x4F21,\n\t124:   0x4F23,\n\t125:   0x4F28,\n\t126:   0x4F29,\n\t127:   0x4F2C,\n\t128:   0x4F2D,\n\t129:   0x4F2E,\n\t130:   0x4F31,\n\t131:   0x4F33,\n\t132:   0x4F35,\n\t133:   0x4F37,\n\t134:   0x4F39,\n\t135:   0x4F3B,\n\t136:   0x4F3E,\n\t137:   0x4F3F,\n\t138:   0x4F40,\n\t139:   0x4F41,\n\t140:   0x4F42,\n\t141:   0x4F44,\n\t142:   0x4F45,\n\t143:   0x4F47,\n\t144:   0x4F48,\n\t145:   0x4F49,\n\t146:   0x4F4A,\n\t147:   0x4F4B,\n\t148:   0x4F4C,\n\t149:   0x4F52,\n\t150:   0x4F54,\n\t151:   0x4F56,\n\t152:   0x4F61,\n\t153:   0x4F62,\n\t154:   0x4F66,\n\t155:   0x4F68,\n\t156:   0x4F6A,\n\t157:   0x4F6B,\n\t158:   0x4F6D,\n\t159:   0x4F6E,\n\t160:   0x4F71,\n\t161:   0x4F72,\n\t162:   0x4F75,\n\t163:   0x4F77,\n\t164:   0x4F78,\n\t165:   0x4F79,\n\t166:   0x4F7A,\n\t167:   0x4F7D,\n\t168:   0x4F80,\n\t169:   0x4F81,\n\t170:   0x4F82,\n\t171:   0x4F85,\n\t172:   0x4F86,\n\t173:   0x4F87,\n\t174:   0x4F8A,\n\t175:   0x4F8C,\n\t176:   0x4F8E,\n\t177:   0x4F90,\n\t178:   0x4F92,\n\t179:   0x4F93,\n\t180:   0x4F95,\n\t181:   0x4F96,\n\t182:   0x4F98,\n\t183:   0x4F99,\n\t184:   0x4F9A,\n\t185:   0x4F9C,\n\t186:   0x4F9E,\n\t187:   0x4F9F,\n\t188:   0x4FA1,\n\t189:   0x4FA2,\n\t190:   0x4FA4,\n\t191:   0x4FAB,\n\t192:   0x4FAD,\n\t193:   0x4FB0,\n\t194:   0x4FB1,\n\t195:   0x4FB2,\n\t196:   0x4FB3,\n\t197:   0x4FB4,\n\t198:   0x4FB6,\n\t199:   0x4FB7,\n\t200:   0x4FB8,\n\t201:   0x4FB9,\n\t202:   0x4FBA,\n\t203:   0x4FBB,\n\t204:   0x4FBC,\n\t205:   0x4FBD,\n\t206:   0x4FBE,\n\t207:   0x4FC0,\n\t208:   0x4FC1,\n\t209:   0x4FC2,\n\t210:   0x4FC6,\n\t211:   0x4FC7,\n\t212:   0x4FC8,\n\t213:   0x4FC9,\n\t214:   0x4FCB,\n\t215:   0x4FCC,\n\t216:   0x4FCD,\n\t217:   0x4FD2,\n\t218:   0x4FD3,\n\t219:   0x4FD4,\n\t220:   0x4FD5,\n\t221:   0x4FD6,\n\t222:   0x4FD9,\n\t223:   0x4FDB,\n\t224:   0x4FE0,\n\t225:   0x4FE2,\n\t226:   0x4FE4,\n\t227:   0x4FE5,\n\t228:   0x4FE7,\n\t229:   0x4FEB,\n\t230:   0x4FEC,\n\t231:   0x4FF0,\n\t232:   0x4FF2,\n\t233:   0x4FF4,\n\t234:   0x4FF5,\n\t235:   0x4FF6,\n\t236:   0x4FF7,\n\t237:   0x4FF9,\n\t238:   0x4FFB,\n\t239:   0x4FFC,\n\t240:   0x4FFD,\n\t241:   0x4FFF,\n\t242:   0x5000,\n\t243:   0x5001,\n\t244:   0x5002,\n\t245:   0x5003,\n\t246:   0x5004,\n\t247:   0x5005,\n\t248:   0x5006,\n\t249:   0x5007,\n\t250:   0x5008,\n\t251:   0x5009,\n\t252:   0x500A,\n\t253:   0x500B,\n\t254:   0x500E,\n\t255:   0x5010,\n\t256:   0x5011,\n\t257:   0x5013,\n\t258:   0x5015,\n\t259:   0x5016,\n\t260:   0x5017,\n\t261:   0x501B,\n\t262:   0x501D,\n\t263:   0x501E,\n\t264:   0x5020,\n\t265:   0x5022,\n\t266:   0x5023,\n\t267:   0x5024,\n\t268:   0x5027,\n\t269:   0x502B,\n\t270:   0x502F,\n\t271:   0x5030,\n\t272:   0x5031,\n\t273:   0x5032,\n\t274:   0x5033,\n\t275:   0x5034,\n\t276:   0x5035,\n\t277:   0x5036,\n\t278:   0x5037,\n\t279:   0x5038,\n\t280:   0x5039,\n\t281:   0x503B,\n\t282:   0x503D,\n\t283:   0x503F,\n\t284:   0x5040,\n\t285:   0x5041,\n\t286:   0x5042,\n\t287:   0x5044,\n\t288:   0x5045,\n\t289:   0x5046,\n\t290:   0x5049,\n\t291:   0x504A,\n\t292:   0x504B,\n\t293:   0x504D,\n\t294:   0x5050,\n\t295:   0x5051,\n\t296:   0x5052,\n\t297:   0x5053,\n\t298:   0x5054,\n\t299:   0x5056,\n\t300:   0x5057,\n\t301:   0x5058,\n\t302:   0x5059,\n\t303:   0x505B,\n\t304:   0x505D,\n\t305:   0x505E,\n\t306:   0x505F,\n\t307:   0x5060,\n\t308:   0x5061,\n\t309:   0x5062,\n\t310:   0x5063,\n\t311:   0x5064,\n\t312:   0x5066,\n\t313:   0x5067,\n\t314:   0x5068,\n\t315:   0x5069,\n\t316:   0x506A,\n\t317:   0x506B,\n\t318:   0x506D,\n\t319:   0x506E,\n\t320:   0x506F,\n\t321:   0x5070,\n\t322:   0x5071,\n\t323:   0x5072,\n\t324:   0x5073,\n\t325:   0x5074,\n\t326:   0x5075,\n\t327:   0x5078,\n\t328:   0x5079,\n\t329:   0x507A,\n\t330:   0x507C,\n\t331:   0x507D,\n\t332:   0x5081,\n\t333:   0x5082,\n\t334:   0x5083,\n\t335:   0x5084,\n\t336:   0x5086,\n\t337:   0x5087,\n\t338:   0x5089,\n\t339:   0x508A,\n\t340:   0x508B,\n\t341:   0x508C,\n\t342:   0x508E,\n\t343:   0x508F,\n\t344:   0x5090,\n\t345:   0x5091,\n\t346:   0x5092,\n\t347:   0x5093,\n\t348:   0x5094,\n\t349:   0x5095,\n\t350:   0x5096,\n\t351:   0x5097,\n\t352:   0x5098,\n\t353:   0x5099,\n\t354:   0x509A,\n\t355:   0x509B,\n\t356:   0x509C,\n\t357:   0x509D,\n\t358:   0x509E,\n\t359:   0x509F,\n\t360:   0x50A0,\n\t361:   0x50A1,\n\t362:   0x50A2,\n\t363:   0x50A4,\n\t364:   0x50A6,\n\t365:   0x50AA,\n\t366:   0x50AB,\n\t367:   0x50AD,\n\t368:   0x50AE,\n\t369:   0x50AF,\n\t370:   0x50B0,\n\t371:   0x50B1,\n\t372:   0x50B3,\n\t373:   0x50B4,\n\t374:   0x50B5,\n\t375:   0x50B6,\n\t376:   0x50B7,\n\t377:   0x50B8,\n\t378:   0x50B9,\n\t379:   0x50BC,\n\t380:   0x50BD,\n\t381:   0x50BE,\n\t382:   0x50BF,\n\t383:   0x50C0,\n\t384:   0x50C1,\n\t385:   0x50C2,\n\t386:   0x50C3,\n\t387:   0x50C4,\n\t388:   0x50C5,\n\t389:   0x50C6,\n\t390:   0x50C7,\n\t391:   0x50C8,\n\t392:   0x50C9,\n\t393:   0x50CA,\n\t394:   0x50CB,\n\t395:   0x50CC,\n\t396:   0x50CD,\n\t397:   0x50CE,\n\t398:   0x50D0,\n\t399:   0x50D1,\n\t400:   0x50D2,\n\t401:   0x50D3,\n\t402:   0x50D4,\n\t403:   0x50D5,\n\t404:   0x50D7,\n\t405:   0x50D8,\n\t406:   0x50D9,\n\t407:   0x50DB,\n\t408:   0x50DC,\n\t409:   0x50DD,\n\t410:   0x50DE,\n\t411:   0x50DF,\n\t412:   0x50E0,\n\t413:   0x50E1,\n\t414:   0x50E2,\n\t415:   0x50E3,\n\t416:   0x50E4,\n\t417:   0x50E5,\n\t418:   0x50E8,\n\t419:   0x50E9,\n\t420:   0x50EA,\n\t421:   0x50EB,\n\t422:   0x50EF,\n\t423:   0x50F0,\n\t424:   0x50F1,\n\t425:   0x50F2,\n\t426:   0x50F4,\n\t427:   0x50F6,\n\t428:   0x50F7,\n\t429:   0x50F8,\n\t430:   0x50F9,\n\t431:   0x50FA,\n\t432:   0x50FC,\n\t433:   0x50FD,\n\t434:   0x50FE,\n\t435:   0x50FF,\n\t436:   0x5100,\n\t437:   0x5101,\n\t438:   0x5102,\n\t439:   0x5103,\n\t440:   0x5104,\n\t441:   0x5105,\n\t442:   0x5108,\n\t443:   0x5109,\n\t444:   0x510A,\n\t445:   0x510C,\n\t446:   0x510D,\n\t447:   0x510E,\n\t448:   0x510F,\n\t449:   0x5110,\n\t450:   0x5111,\n\t451:   0x5113,\n\t452:   0x5114,\n\t453:   0x5115,\n\t454:   0x5116,\n\t455:   0x5117,\n\t456:   0x5118,\n\t457:   0x5119,\n\t458:   0x511A,\n\t459:   0x511B,\n\t460:   0x511C,\n\t461:   0x511D,\n\t462:   0x511E,\n\t463:   0x511F,\n\t464:   0x5120,\n\t465:   0x5122,\n\t466:   0x5123,\n\t467:   0x5124,\n\t468:   0x5125,\n\t469:   0x5126,\n\t470:   0x5127,\n\t471:   0x5128,\n\t472:   0x5129,\n\t473:   0x512A,\n\t474:   0x512B,\n\t475:   0x512C,\n\t476:   0x512D,\n\t477:   0x512E,\n\t478:   0x512F,\n\t479:   0x5130,\n\t480:   0x5131,\n\t481:   0x5132,\n\t482:   0x5133,\n\t483:   0x5134,\n\t484:   0x5135,\n\t485:   0x5136,\n\t486:   0x5137,\n\t487:   0x5138,\n\t488:   0x5139,\n\t489:   0x513A,\n\t490:   0x513B,\n\t491:   0x513C,\n\t492:   0x513D,\n\t493:   0x513E,\n\t494:   0x5142,\n\t495:   0x5147,\n\t496:   0x514A,\n\t497:   0x514C,\n\t498:   0x514E,\n\t499:   0x514F,\n\t500:   0x5150,\n\t501:   0x5152,\n\t502:   0x5153,\n\t503:   0x5157,\n\t504:   0x5158,\n\t505:   0x5159,\n\t506:   0x515B,\n\t507:   0x515D,\n\t508:   0x515E,\n\t509:   0x515F,\n\t510:   0x5160,\n\t511:   0x5161,\n\t512:   0x5163,\n\t513:   0x5164,\n\t514:   0x5166,\n\t515:   0x5167,\n\t516:   0x5169,\n\t517:   0x516A,\n\t518:   0x516F,\n\t519:   0x5172,\n\t520:   0x517A,\n\t521:   0x517E,\n\t522:   0x517F,\n\t523:   0x5183,\n\t524:   0x5184,\n\t525:   0x5186,\n\t526:   0x5187,\n\t527:   0x518A,\n\t528:   0x518B,\n\t529:   0x518E,\n\t530:   0x518F,\n\t531:   0x5190,\n\t532:   0x5191,\n\t533:   0x5193,\n\t534:   0x5194,\n\t535:   0x5198,\n\t536:   0x519A,\n\t537:   0x519D,\n\t538:   0x519E,\n\t539:   0x519F,\n\t540:   0x51A1,\n\t541:   0x51A3,\n\t542:   0x51A6,\n\t543:   0x51A7,\n\t544:   0x51A8,\n\t545:   0x51A9,\n\t546:   0x51AA,\n\t547:   0x51AD,\n\t548:   0x51AE,\n\t549:   0x51B4,\n\t550:   0x51B8,\n\t551:   0x51B9,\n\t552:   0x51BA,\n\t553:   0x51BE,\n\t554:   0x51BF,\n\t555:   0x51C1,\n\t556:   0x51C2,\n\t557:   0x51C3,\n\t558:   0x51C5,\n\t559:   0x51C8,\n\t560:   0x51CA,\n\t561:   0x51CD,\n\t562:   0x51CE,\n\t563:   0x51D0,\n\t564:   0x51D2,\n\t565:   0x51D3,\n\t566:   0x51D4,\n\t567:   0x51D5,\n\t568:   0x51D6,\n\t569:   0x51D7,\n\t570:   0x51D8,\n\t571:   0x51D9,\n\t572:   0x51DA,\n\t573:   0x51DC,\n\t574:   0x51DE,\n\t575:   0x51DF,\n\t576:   0x51E2,\n\t577:   0x51E3,\n\t578:   0x51E5,\n\t579:   0x51E6,\n\t580:   0x51E7,\n\t581:   0x51E8,\n\t582:   0x51E9,\n\t583:   0x51EA,\n\t584:   0x51EC,\n\t585:   0x51EE,\n\t586:   0x51F1,\n\t587:   0x51F2,\n\t588:   0x51F4,\n\t589:   0x51F7,\n\t590:   0x51FE,\n\t591:   0x5204,\n\t592:   0x5205,\n\t593:   0x5209,\n\t594:   0x520B,\n\t595:   0x520C,\n\t596:   0x520F,\n\t597:   0x5210,\n\t598:   0x5213,\n\t599:   0x5214,\n\t600:   0x5215,\n\t601:   0x521C,\n\t602:   0x521E,\n\t603:   0x521F,\n\t604:   0x5221,\n\t605:   0x5222,\n\t606:   0x5223,\n\t607:   0x5225,\n\t608:   0x5226,\n\t609:   0x5227,\n\t610:   0x522A,\n\t611:   0x522C,\n\t612:   0x522F,\n\t613:   0x5231,\n\t614:   0x5232,\n\t615:   0x5234,\n\t616:   0x5235,\n\t617:   0x523C,\n\t618:   0x523E,\n\t619:   0x5244,\n\t620:   0x5245,\n\t621:   0x5246,\n\t622:   0x5247,\n\t623:   0x5248,\n\t624:   0x5249,\n\t625:   0x524B,\n\t626:   0x524E,\n\t627:   0x524F,\n\t628:   0x5252,\n\t629:   0x5253,\n\t630:   0x5255,\n\t631:   0x5257,\n\t632:   0x5258,\n\t633:   0x5259,\n\t634:   0x525A,\n\t635:   0x525B,\n\t636:   0x525D,\n\t637:   0x525F,\n\t638:   0x5260,\n\t639:   0x5262,\n\t640:   0x5263,\n\t641:   0x5264,\n\t642:   0x5266,\n\t643:   0x5268,\n\t644:   0x526B,\n\t645:   0x526C,\n\t646:   0x526D,\n\t647:   0x526E,\n\t648:   0x5270,\n\t649:   0x5271,\n\t650:   0x5273,\n\t651:   0x5274,\n\t652:   0x5275,\n\t653:   0x5276,\n\t654:   0x5277,\n\t655:   0x5278,\n\t656:   0x5279,\n\t657:   0x527A,\n\t658:   0x527B,\n\t659:   0x527C,\n\t660:   0x527E,\n\t661:   0x5280,\n\t662:   0x5283,\n\t663:   0x5284,\n\t664:   0x5285,\n\t665:   0x5286,\n\t666:   0x5287,\n\t667:   0x5289,\n\t668:   0x528A,\n\t669:   0x528B,\n\t670:   0x528C,\n\t671:   0x528D,\n\t672:   0x528E,\n\t673:   0x528F,\n\t674:   0x5291,\n\t675:   0x5292,\n\t676:   0x5294,\n\t677:   0x5295,\n\t678:   0x5296,\n\t679:   0x5297,\n\t680:   0x5298,\n\t681:   0x5299,\n\t682:   0x529A,\n\t683:   0x529C,\n\t684:   0x52A4,\n\t685:   0x52A5,\n\t686:   0x52A6,\n\t687:   0x52A7,\n\t688:   0x52AE,\n\t689:   0x52AF,\n\t690:   0x52B0,\n\t691:   0x52B4,\n\t692:   0x52B5,\n\t693:   0x52B6,\n\t694:   0x52B7,\n\t695:   0x52B8,\n\t696:   0x52B9,\n\t697:   0x52BA,\n\t698:   0x52BB,\n\t699:   0x52BC,\n\t700:   0x52BD,\n\t701:   0x52C0,\n\t702:   0x52C1,\n\t703:   0x52C2,\n\t704:   0x52C4,\n\t705:   0x52C5,\n\t706:   0x52C6,\n\t707:   0x52C8,\n\t708:   0x52CA,\n\t709:   0x52CC,\n\t710:   0x52CD,\n\t711:   0x52CE,\n\t712:   0x52CF,\n\t713:   0x52D1,\n\t714:   0x52D3,\n\t715:   0x52D4,\n\t716:   0x52D5,\n\t717:   0x52D7,\n\t718:   0x52D9,\n\t719:   0x52DA,\n\t720:   0x52DB,\n\t721:   0x52DC,\n\t722:   0x52DD,\n\t723:   0x52DE,\n\t724:   0x52E0,\n\t725:   0x52E1,\n\t726:   0x52E2,\n\t727:   0x52E3,\n\t728:   0x52E5,\n\t729:   0x52E6,\n\t730:   0x52E7,\n\t731:   0x52E8,\n\t732:   0x52E9,\n\t733:   0x52EA,\n\t734:   0x52EB,\n\t735:   0x52EC,\n\t736:   0x52ED,\n\t737:   0x52EE,\n\t738:   0x52EF,\n\t739:   0x52F1,\n\t740:   0x52F2,\n\t741:   0x52F3,\n\t742:   0x52F4,\n\t743:   0x52F5,\n\t744:   0x52F6,\n\t745:   0x52F7,\n\t746:   0x52F8,\n\t747:   0x52FB,\n\t748:   0x52FC,\n\t749:   0x52FD,\n\t750:   0x5301,\n\t751:   0x5302,\n\t752:   0x5303,\n\t753:   0x5304,\n\t754:   0x5307,\n\t755:   0x5309,\n\t756:   0x530A,\n\t757:   0x530B,\n\t758:   0x530C,\n\t759:   0x530E,\n\t760:   0x5311,\n\t761:   0x5312,\n\t762:   0x5313,\n\t763:   0x5314,\n\t764:   0x5318,\n\t765:   0x531B,\n\t766:   0x531C,\n\t767:   0x531E,\n\t768:   0x531F,\n\t769:   0x5322,\n\t770:   0x5324,\n\t771:   0x5325,\n\t772:   0x5327,\n\t773:   0x5328,\n\t774:   0x5329,\n\t775:   0x532B,\n\t776:   0x532C,\n\t777:   0x532D,\n\t778:   0x532F,\n\t779:   0x5330,\n\t780:   0x5331,\n\t781:   0x5332,\n\t782:   0x5333,\n\t783:   0x5334,\n\t784:   0x5335,\n\t785:   0x5336,\n\t786:   0x5337,\n\t787:   0x5338,\n\t788:   0x533C,\n\t789:   0x533D,\n\t790:   0x5340,\n\t791:   0x5342,\n\t792:   0x5344,\n\t793:   0x5346,\n\t794:   0x534B,\n\t795:   0x534C,\n\t796:   0x534D,\n\t797:   0x5350,\n\t798:   0x5354,\n\t799:   0x5358,\n\t800:   0x5359,\n\t801:   0x535B,\n\t802:   0x535D,\n\t803:   0x5365,\n\t804:   0x5368,\n\t805:   0x536A,\n\t806:   0x536C,\n\t807:   0x536D,\n\t808:   0x5372,\n\t809:   0x5376,\n\t810:   0x5379,\n\t811:   0x537B,\n\t812:   0x537C,\n\t813:   0x537D,\n\t814:   0x537E,\n\t815:   0x5380,\n\t816:   0x5381,\n\t817:   0x5383,\n\t818:   0x5387,\n\t819:   0x5388,\n\t820:   0x538A,\n\t821:   0x538E,\n\t822:   0x538F,\n\t823:   0x5390,\n\t824:   0x5391,\n\t825:   0x5392,\n\t826:   0x5393,\n\t827:   0x5394,\n\t828:   0x5396,\n\t829:   0x5397,\n\t830:   0x5399,\n\t831:   0x539B,\n\t832:   0x539C,\n\t833:   0x539E,\n\t834:   0x53A0,\n\t835:   0x53A1,\n\t836:   0x53A4,\n\t837:   0x53A7,\n\t838:   0x53AA,\n\t839:   0x53AB,\n\t840:   0x53AC,\n\t841:   0x53AD,\n\t842:   0x53AF,\n\t843:   0x53B0,\n\t844:   0x53B1,\n\t845:   0x53B2,\n\t846:   0x53B3,\n\t847:   0x53B4,\n\t848:   0x53B5,\n\t849:   0x53B7,\n\t850:   0x53B8,\n\t851:   0x53B9,\n\t852:   0x53BA,\n\t853:   0x53BC,\n\t854:   0x53BD,\n\t855:   0x53BE,\n\t856:   0x53C0,\n\t857:   0x53C3,\n\t858:   0x53C4,\n\t859:   0x53C5,\n\t860:   0x53C6,\n\t861:   0x53C7,\n\t862:   0x53CE,\n\t863:   0x53CF,\n\t864:   0x53D0,\n\t865:   0x53D2,\n\t866:   0x53D3,\n\t867:   0x53D5,\n\t868:   0x53DA,\n\t869:   0x53DC,\n\t870:   0x53DD,\n\t871:   0x53DE,\n\t872:   0x53E1,\n\t873:   0x53E2,\n\t874:   0x53E7,\n\t875:   0x53F4,\n\t876:   0x53FA,\n\t877:   0x53FE,\n\t878:   0x53FF,\n\t879:   0x5400,\n\t880:   0x5402,\n\t881:   0x5405,\n\t882:   0x5407,\n\t883:   0x540B,\n\t884:   0x5414,\n\t885:   0x5418,\n\t886:   0x5419,\n\t887:   0x541A,\n\t888:   0x541C,\n\t889:   0x5422,\n\t890:   0x5424,\n\t891:   0x5425,\n\t892:   0x542A,\n\t893:   0x5430,\n\t894:   0x5433,\n\t895:   0x5436,\n\t896:   0x5437,\n\t897:   0x543A,\n\t898:   0x543D,\n\t899:   0x543F,\n\t900:   0x5441,\n\t901:   0x5442,\n\t902:   0x5444,\n\t903:   0x5445,\n\t904:   0x5447,\n\t905:   0x5449,\n\t906:   0x544C,\n\t907:   0x544D,\n\t908:   0x544E,\n\t909:   0x544F,\n\t910:   0x5451,\n\t911:   0x545A,\n\t912:   0x545D,\n\t913:   0x545E,\n\t914:   0x545F,\n\t915:   0x5460,\n\t916:   0x5461,\n\t917:   0x5463,\n\t918:   0x5465,\n\t919:   0x5467,\n\t920:   0x5469,\n\t921:   0x546A,\n\t922:   0x546B,\n\t923:   0x546C,\n\t924:   0x546D,\n\t925:   0x546E,\n\t926:   0x546F,\n\t927:   0x5470,\n\t928:   0x5474,\n\t929:   0x5479,\n\t930:   0x547A,\n\t931:   0x547E,\n\t932:   0x547F,\n\t933:   0x5481,\n\t934:   0x5483,\n\t935:   0x5485,\n\t936:   0x5487,\n\t937:   0x5488,\n\t938:   0x5489,\n\t939:   0x548A,\n\t940:   0x548D,\n\t941:   0x5491,\n\t942:   0x5493,\n\t943:   0x5497,\n\t944:   0x5498,\n\t945:   0x549C,\n\t946:   0x549E,\n\t947:   0x549F,\n\t948:   0x54A0,\n\t949:   0x54A1,\n\t950:   0x54A2,\n\t951:   0x54A5,\n\t952:   0x54AE,\n\t953:   0x54B0,\n\t954:   0x54B2,\n\t955:   0x54B5,\n\t956:   0x54B6,\n\t957:   0x54B7,\n\t958:   0x54B9,\n\t959:   0x54BA,\n\t960:   0x54BC,\n\t961:   0x54BE,\n\t962:   0x54C3,\n\t963:   0x54C5,\n\t964:   0x54CA,\n\t965:   0x54CB,\n\t966:   0x54D6,\n\t967:   0x54D8,\n\t968:   0x54DB,\n\t969:   0x54E0,\n\t970:   0x54E1,\n\t971:   0x54E2,\n\t972:   0x54E3,\n\t973:   0x54E4,\n\t974:   0x54EB,\n\t975:   0x54EC,\n\t976:   0x54EF,\n\t977:   0x54F0,\n\t978:   0x54F1,\n\t979:   0x54F4,\n\t980:   0x54F5,\n\t981:   0x54F6,\n\t982:   0x54F7,\n\t983:   0x54F8,\n\t984:   0x54F9,\n\t985:   0x54FB,\n\t986:   0x54FE,\n\t987:   0x5500,\n\t988:   0x5502,\n\t989:   0x5503,\n\t990:   0x5504,\n\t991:   0x5505,\n\t992:   0x5508,\n\t993:   0x550A,\n\t994:   0x550B,\n\t995:   0x550C,\n\t996:   0x550D,\n\t997:   0x550E,\n\t998:   0x5512,\n\t999:   0x5513,\n\t1000:  0x5515,\n\t1001:  0x5516,\n\t1002:  0x5517,\n\t1003:  0x5518,\n\t1004:  0x5519,\n\t1005:  0x551A,\n\t1006:  0x551C,\n\t1007:  0x551D,\n\t1008:  0x551E,\n\t1009:  0x551F,\n\t1010:  0x5521,\n\t1011:  0x5525,\n\t1012:  0x5526,\n\t1013:  0x5528,\n\t1014:  0x5529,\n\t1015:  0x552B,\n\t1016:  0x552D,\n\t1017:  0x5532,\n\t1018:  0x5534,\n\t1019:  0x5535,\n\t1020:  0x5536,\n\t1021:  0x5538,\n\t1022:  0x5539,\n\t1023:  0x553A,\n\t1024:  0x553B,\n\t1025:  0x553D,\n\t1026:  0x5540,\n\t1027:  0x5542,\n\t1028:  0x5545,\n\t1029:  0x5547,\n\t1030:  0x5548,\n\t1031:  0x554B,\n\t1032:  0x554C,\n\t1033:  0x554D,\n\t1034:  0x554E,\n\t1035:  0x554F,\n\t1036:  0x5551,\n\t1037:  0x5552,\n\t1038:  0x5553,\n\t1039:  0x5554,\n\t1040:  0x5557,\n\t1041:  0x5558,\n\t1042:  0x5559,\n\t1043:  0x555A,\n\t1044:  0x555B,\n\t1045:  0x555D,\n\t1046:  0x555E,\n\t1047:  0x555F,\n\t1048:  0x5560,\n\t1049:  0x5562,\n\t1050:  0x5563,\n\t1051:  0x5568,\n\t1052:  0x5569,\n\t1053:  0x556B,\n\t1054:  0x556F,\n\t1055:  0x5570,\n\t1056:  0x5571,\n\t1057:  0x5572,\n\t1058:  0x5573,\n\t1059:  0x5574,\n\t1060:  0x5579,\n\t1061:  0x557A,\n\t1062:  0x557D,\n\t1063:  0x557F,\n\t1064:  0x5585,\n\t1065:  0x5586,\n\t1066:  0x558C,\n\t1067:  0x558D,\n\t1068:  0x558E,\n\t1069:  0x5590,\n\t1070:  0x5592,\n\t1071:  0x5593,\n\t1072:  0x5595,\n\t1073:  0x5596,\n\t1074:  0x5597,\n\t1075:  0x559A,\n\t1076:  0x559B,\n\t1077:  0x559E,\n\t1078:  0x55A0,\n\t1079:  0x55A1,\n\t1080:  0x55A2,\n\t1081:  0x55A3,\n\t1082:  0x55A4,\n\t1083:  0x55A5,\n\t1084:  0x55A6,\n\t1085:  0x55A8,\n\t1086:  0x55A9,\n\t1087:  0x55AA,\n\t1088:  0x55AB,\n\t1089:  0x55AC,\n\t1090:  0x55AD,\n\t1091:  0x55AE,\n\t1092:  0x55AF,\n\t1093:  0x55B0,\n\t1094:  0x55B2,\n\t1095:  0x55B4,\n\t1096:  0x55B6,\n\t1097:  0x55B8,\n\t1098:  0x55BA,\n\t1099:  0x55BC,\n\t1100:  0x55BF,\n\t1101:  0x55C0,\n\t1102:  0x55C1,\n\t1103:  0x55C2,\n\t1104:  0x55C3,\n\t1105:  0x55C6,\n\t1106:  0x55C7,\n\t1107:  0x55C8,\n\t1108:  0x55CA,\n\t1109:  0x55CB,\n\t1110:  0x55CE,\n\t1111:  0x55CF,\n\t1112:  0x55D0,\n\t1113:  0x55D5,\n\t1114:  0x55D7,\n\t1115:  0x55D8,\n\t1116:  0x55D9,\n\t1117:  0x55DA,\n\t1118:  0x55DB,\n\t1119:  0x55DE,\n\t1120:  0x55E0,\n\t1121:  0x55E2,\n\t1122:  0x55E7,\n\t1123:  0x55E9,\n\t1124:  0x55ED,\n\t1125:  0x55EE,\n\t1126:  0x55F0,\n\t1127:  0x55F1,\n\t1128:  0x55F4,\n\t1129:  0x55F6,\n\t1130:  0x55F8,\n\t1131:  0x55F9,\n\t1132:  0x55FA,\n\t1133:  0x55FB,\n\t1134:  0x55FC,\n\t1135:  0x55FF,\n\t1136:  0x5602,\n\t1137:  0x5603,\n\t1138:  0x5604,\n\t1139:  0x5605,\n\t1140:  0x5606,\n\t1141:  0x5607,\n\t1142:  0x560A,\n\t1143:  0x560B,\n\t1144:  0x560D,\n\t1145:  0x5610,\n\t1146:  0x5611,\n\t1147:  0x5612,\n\t1148:  0x5613,\n\t1149:  0x5614,\n\t1150:  0x5615,\n\t1151:  0x5616,\n\t1152:  0x5617,\n\t1153:  0x5619,\n\t1154:  0x561A,\n\t1155:  0x561C,\n\t1156:  0x561D,\n\t1157:  0x5620,\n\t1158:  0x5621,\n\t1159:  0x5622,\n\t1160:  0x5625,\n\t1161:  0x5626,\n\t1162:  0x5628,\n\t1163:  0x5629,\n\t1164:  0x562A,\n\t1165:  0x562B,\n\t1166:  0x562E,\n\t1167:  0x562F,\n\t1168:  0x5630,\n\t1169:  0x5633,\n\t1170:  0x5635,\n\t1171:  0x5637,\n\t1172:  0x5638,\n\t1173:  0x563A,\n\t1174:  0x563C,\n\t1175:  0x563D,\n\t1176:  0x563E,\n\t1177:  0x5640,\n\t1178:  0x5641,\n\t1179:  0x5642,\n\t1180:  0x5643,\n\t1181:  0x5644,\n\t1182:  0x5645,\n\t1183:  0x5646,\n\t1184:  0x5647,\n\t1185:  0x5648,\n\t1186:  0x5649,\n\t1187:  0x564A,\n\t1188:  0x564B,\n\t1189:  0x564F,\n\t1190:  0x5650,\n\t1191:  0x5651,\n\t1192:  0x5652,\n\t1193:  0x5653,\n\t1194:  0x5655,\n\t1195:  0x5656,\n\t1196:  0x565A,\n\t1197:  0x565B,\n\t1198:  0x565D,\n\t1199:  0x565E,\n\t1200:  0x565F,\n\t1201:  0x5660,\n\t1202:  0x5661,\n\t1203:  0x5663,\n\t1204:  0x5665,\n\t1205:  0x5666,\n\t1206:  0x5667,\n\t1207:  0x566D,\n\t1208:  0x566E,\n\t1209:  0x566F,\n\t1210:  0x5670,\n\t1211:  0x5672,\n\t1212:  0x5673,\n\t1213:  0x5674,\n\t1214:  0x5675,\n\t1215:  0x5677,\n\t1216:  0x5678,\n\t1217:  0x5679,\n\t1218:  0x567A,\n\t1219:  0x567D,\n\t1220:  0x567E,\n\t1221:  0x567F,\n\t1222:  0x5680,\n\t1223:  0x5681,\n\t1224:  0x5682,\n\t1225:  0x5683,\n\t1226:  0x5684,\n\t1227:  0x5687,\n\t1228:  0x5688,\n\t1229:  0x5689,\n\t1230:  0x568A,\n\t1231:  0x568B,\n\t1232:  0x568C,\n\t1233:  0x568D,\n\t1234:  0x5690,\n\t1235:  0x5691,\n\t1236:  0x5692,\n\t1237:  0x5694,\n\t1238:  0x5695,\n\t1239:  0x5696,\n\t1240:  0x5697,\n\t1241:  0x5698,\n\t1242:  0x5699,\n\t1243:  0x569A,\n\t1244:  0x569B,\n\t1245:  0x569C,\n\t1246:  0x569D,\n\t1247:  0x569E,\n\t1248:  0x569F,\n\t1249:  0x56A0,\n\t1250:  0x56A1,\n\t1251:  0x56A2,\n\t1252:  0x56A4,\n\t1253:  0x56A5,\n\t1254:  0x56A6,\n\t1255:  0x56A7,\n\t1256:  0x56A8,\n\t1257:  0x56A9,\n\t1258:  0x56AA,\n\t1259:  0x56AB,\n\t1260:  0x56AC,\n\t1261:  0x56AD,\n\t1262:  0x56AE,\n\t1263:  0x56B0,\n\t1264:  0x56B1,\n\t1265:  0x56B2,\n\t1266:  0x56B3,\n\t1267:  0x56B4,\n\t1268:  0x56B5,\n\t1269:  0x56B6,\n\t1270:  0x56B8,\n\t1271:  0x56B9,\n\t1272:  0x56BA,\n\t1273:  0x56BB,\n\t1274:  0x56BD,\n\t1275:  0x56BE,\n\t1276:  0x56BF,\n\t1277:  0x56C0,\n\t1278:  0x56C1,\n\t1279:  0x56C2,\n\t1280:  0x56C3,\n\t1281:  0x56C4,\n\t1282:  0x56C5,\n\t1283:  0x56C6,\n\t1284:  0x56C7,\n\t1285:  0x56C8,\n\t1286:  0x56C9,\n\t1287:  0x56CB,\n\t1288:  0x56CC,\n\t1289:  0x56CD,\n\t1290:  0x56CE,\n\t1291:  0x56CF,\n\t1292:  0x56D0,\n\t1293:  0x56D1,\n\t1294:  0x56D2,\n\t1295:  0x56D3,\n\t1296:  0x56D5,\n\t1297:  0x56D6,\n\t1298:  0x56D8,\n\t1299:  0x56D9,\n\t1300:  0x56DC,\n\t1301:  0x56E3,\n\t1302:  0x56E5,\n\t1303:  0x56E6,\n\t1304:  0x56E7,\n\t1305:  0x56E8,\n\t1306:  0x56E9,\n\t1307:  0x56EA,\n\t1308:  0x56EC,\n\t1309:  0x56EE,\n\t1310:  0x56EF,\n\t1311:  0x56F2,\n\t1312:  0x56F3,\n\t1313:  0x56F6,\n\t1314:  0x56F7,\n\t1315:  0x56F8,\n\t1316:  0x56FB,\n\t1317:  0x56FC,\n\t1318:  0x5700,\n\t1319:  0x5701,\n\t1320:  0x5702,\n\t1321:  0x5705,\n\t1322:  0x5707,\n\t1323:  0x570B,\n\t1324:  0x570C,\n\t1325:  0x570D,\n\t1326:  0x570E,\n\t1327:  0x570F,\n\t1328:  0x5710,\n\t1329:  0x5711,\n\t1330:  0x5712,\n\t1331:  0x5713,\n\t1332:  0x5714,\n\t1333:  0x5715,\n\t1334:  0x5716,\n\t1335:  0x5717,\n\t1336:  0x5718,\n\t1337:  0x5719,\n\t1338:  0x571A,\n\t1339:  0x571B,\n\t1340:  0x571D,\n\t1341:  0x571E,\n\t1342:  0x5720,\n\t1343:  0x5721,\n\t1344:  0x5722,\n\t1345:  0x5724,\n\t1346:  0x5725,\n\t1347:  0x5726,\n\t1348:  0x5727,\n\t1349:  0x572B,\n\t1350:  0x5731,\n\t1351:  0x5732,\n\t1352:  0x5734,\n\t1353:  0x5735,\n\t1354:  0x5736,\n\t1355:  0x5737,\n\t1356:  0x5738,\n\t1357:  0x573C,\n\t1358:  0x573D,\n\t1359:  0x573F,\n\t1360:  0x5741,\n\t1361:  0x5743,\n\t1362:  0x5744,\n\t1363:  0x5745,\n\t1364:  0x5746,\n\t1365:  0x5748,\n\t1366:  0x5749,\n\t1367:  0x574B,\n\t1368:  0x5752,\n\t1369:  0x5753,\n\t1370:  0x5754,\n\t1371:  0x5755,\n\t1372:  0x5756,\n\t1373:  0x5758,\n\t1374:  0x5759,\n\t1375:  0x5762,\n\t1376:  0x5763,\n\t1377:  0x5765,\n\t1378:  0x5767,\n\t1379:  0x576C,\n\t1380:  0x576E,\n\t1381:  0x5770,\n\t1382:  0x5771,\n\t1383:  0x5772,\n\t1384:  0x5774,\n\t1385:  0x5775,\n\t1386:  0x5778,\n\t1387:  0x5779,\n\t1388:  0x577A,\n\t1389:  0x577D,\n\t1390:  0x577E,\n\t1391:  0x577F,\n\t1392:  0x5780,\n\t1393:  0x5781,\n\t1394:  0x5787,\n\t1395:  0x5788,\n\t1396:  0x5789,\n\t1397:  0x578A,\n\t1398:  0x578D,\n\t1399:  0x578E,\n\t1400:  0x578F,\n\t1401:  0x5790,\n\t1402:  0x5791,\n\t1403:  0x5794,\n\t1404:  0x5795,\n\t1405:  0x5796,\n\t1406:  0x5797,\n\t1407:  0x5798,\n\t1408:  0x5799,\n\t1409:  0x579A,\n\t1410:  0x579C,\n\t1411:  0x579D,\n\t1412:  0x579E,\n\t1413:  0x579F,\n\t1414:  0x57A5,\n\t1415:  0x57A8,\n\t1416:  0x57AA,\n\t1417:  0x57AC,\n\t1418:  0x57AF,\n\t1419:  0x57B0,\n\t1420:  0x57B1,\n\t1421:  0x57B3,\n\t1422:  0x57B5,\n\t1423:  0x57B6,\n\t1424:  0x57B7,\n\t1425:  0x57B9,\n\t1426:  0x57BA,\n\t1427:  0x57BB,\n\t1428:  0x57BC,\n\t1429:  0x57BD,\n\t1430:  0x57BE,\n\t1431:  0x57BF,\n\t1432:  0x57C0,\n\t1433:  0x57C1,\n\t1434:  0x57C4,\n\t1435:  0x57C5,\n\t1436:  0x57C6,\n\t1437:  0x57C7,\n\t1438:  0x57C8,\n\t1439:  0x57C9,\n\t1440:  0x57CA,\n\t1441:  0x57CC,\n\t1442:  0x57CD,\n\t1443:  0x57D0,\n\t1444:  0x57D1,\n\t1445:  0x57D3,\n\t1446:  0x57D6,\n\t1447:  0x57D7,\n\t1448:  0x57DB,\n\t1449:  0x57DC,\n\t1450:  0x57DE,\n\t1451:  0x57E1,\n\t1452:  0x57E2,\n\t1453:  0x57E3,\n\t1454:  0x57E5,\n\t1455:  0x57E6,\n\t1456:  0x57E7,\n\t1457:  0x57E8,\n\t1458:  0x57E9,\n\t1459:  0x57EA,\n\t1460:  0x57EB,\n\t1461:  0x57EC,\n\t1462:  0x57EE,\n\t1463:  0x57F0,\n\t1464:  0x57F1,\n\t1465:  0x57F2,\n\t1466:  0x57F3,\n\t1467:  0x57F5,\n\t1468:  0x57F6,\n\t1469:  0x57F7,\n\t1470:  0x57FB,\n\t1471:  0x57FC,\n\t1472:  0x57FE,\n\t1473:  0x57FF,\n\t1474:  0x5801,\n\t1475:  0x5803,\n\t1476:  0x5804,\n\t1477:  0x5805,\n\t1478:  0x5808,\n\t1479:  0x5809,\n\t1480:  0x580A,\n\t1481:  0x580C,\n\t1482:  0x580E,\n\t1483:  0x580F,\n\t1484:  0x5810,\n\t1485:  0x5812,\n\t1486:  0x5813,\n\t1487:  0x5814,\n\t1488:  0x5816,\n\t1489:  0x5817,\n\t1490:  0x5818,\n\t1491:  0x581A,\n\t1492:  0x581B,\n\t1493:  0x581C,\n\t1494:  0x581D,\n\t1495:  0x581F,\n\t1496:  0x5822,\n\t1497:  0x5823,\n\t1498:  0x5825,\n\t1499:  0x5826,\n\t1500:  0x5827,\n\t1501:  0x5828,\n\t1502:  0x5829,\n\t1503:  0x582B,\n\t1504:  0x582C,\n\t1505:  0x582D,\n\t1506:  0x582E,\n\t1507:  0x582F,\n\t1508:  0x5831,\n\t1509:  0x5832,\n\t1510:  0x5833,\n\t1511:  0x5834,\n\t1512:  0x5836,\n\t1513:  0x5837,\n\t1514:  0x5838,\n\t1515:  0x5839,\n\t1516:  0x583A,\n\t1517:  0x583B,\n\t1518:  0x583C,\n\t1519:  0x583D,\n\t1520:  0x583E,\n\t1521:  0x583F,\n\t1522:  0x5840,\n\t1523:  0x5841,\n\t1524:  0x5842,\n\t1525:  0x5843,\n\t1526:  0x5845,\n\t1527:  0x5846,\n\t1528:  0x5847,\n\t1529:  0x5848,\n\t1530:  0x5849,\n\t1531:  0x584A,\n\t1532:  0x584B,\n\t1533:  0x584E,\n\t1534:  0x584F,\n\t1535:  0x5850,\n\t1536:  0x5852,\n\t1537:  0x5853,\n\t1538:  0x5855,\n\t1539:  0x5856,\n\t1540:  0x5857,\n\t1541:  0x5859,\n\t1542:  0x585A,\n\t1543:  0x585B,\n\t1544:  0x585C,\n\t1545:  0x585D,\n\t1546:  0x585F,\n\t1547:  0x5860,\n\t1548:  0x5861,\n\t1549:  0x5862,\n\t1550:  0x5863,\n\t1551:  0x5864,\n\t1552:  0x5866,\n\t1553:  0x5867,\n\t1554:  0x5868,\n\t1555:  0x5869,\n\t1556:  0x586A,\n\t1557:  0x586D,\n\t1558:  0x586E,\n\t1559:  0x586F,\n\t1560:  0x5870,\n\t1561:  0x5871,\n\t1562:  0x5872,\n\t1563:  0x5873,\n\t1564:  0x5874,\n\t1565:  0x5875,\n\t1566:  0x5876,\n\t1567:  0x5877,\n\t1568:  0x5878,\n\t1569:  0x5879,\n\t1570:  0x587A,\n\t1571:  0x587B,\n\t1572:  0x587C,\n\t1573:  0x587D,\n\t1574:  0x587F,\n\t1575:  0x5882,\n\t1576:  0x5884,\n\t1577:  0x5886,\n\t1578:  0x5887,\n\t1579:  0x5888,\n\t1580:  0x588A,\n\t1581:  0x588B,\n\t1582:  0x588C,\n\t1583:  0x588D,\n\t1584:  0x588E,\n\t1585:  0x588F,\n\t1586:  0x5890,\n\t1587:  0x5891,\n\t1588:  0x5894,\n\t1589:  0x5895,\n\t1590:  0x5896,\n\t1591:  0x5897,\n\t1592:  0x5898,\n\t1593:  0x589B,\n\t1594:  0x589C,\n\t1595:  0x589D,\n\t1596:  0x58A0,\n\t1597:  0x58A1,\n\t1598:  0x58A2,\n\t1599:  0x58A3,\n\t1600:  0x58A4,\n\t1601:  0x58A5,\n\t1602:  0x58A6,\n\t1603:  0x58A7,\n\t1604:  0x58AA,\n\t1605:  0x58AB,\n\t1606:  0x58AC,\n\t1607:  0x58AD,\n\t1608:  0x58AE,\n\t1609:  0x58AF,\n\t1610:  0x58B0,\n\t1611:  0x58B1,\n\t1612:  0x58B2,\n\t1613:  0x58B3,\n\t1614:  0x58B4,\n\t1615:  0x58B5,\n\t1616:  0x58B6,\n\t1617:  0x58B7,\n\t1618:  0x58B8,\n\t1619:  0x58B9,\n\t1620:  0x58BA,\n\t1621:  0x58BB,\n\t1622:  0x58BD,\n\t1623:  0x58BE,\n\t1624:  0x58BF,\n\t1625:  0x58C0,\n\t1626:  0x58C2,\n\t1627:  0x58C3,\n\t1628:  0x58C4,\n\t1629:  0x58C6,\n\t1630:  0x58C7,\n\t1631:  0x58C8,\n\t1632:  0x58C9,\n\t1633:  0x58CA,\n\t1634:  0x58CB,\n\t1635:  0x58CC,\n\t1636:  0x58CD,\n\t1637:  0x58CE,\n\t1638:  0x58CF,\n\t1639:  0x58D0,\n\t1640:  0x58D2,\n\t1641:  0x58D3,\n\t1642:  0x58D4,\n\t1643:  0x58D6,\n\t1644:  0x58D7,\n\t1645:  0x58D8,\n\t1646:  0x58D9,\n\t1647:  0x58DA,\n\t1648:  0x58DB,\n\t1649:  0x58DC,\n\t1650:  0x58DD,\n\t1651:  0x58DE,\n\t1652:  0x58DF,\n\t1653:  0x58E0,\n\t1654:  0x58E1,\n\t1655:  0x58E2,\n\t1656:  0x58E3,\n\t1657:  0x58E5,\n\t1658:  0x58E6,\n\t1659:  0x58E7,\n\t1660:  0x58E8,\n\t1661:  0x58E9,\n\t1662:  0x58EA,\n\t1663:  0x58ED,\n\t1664:  0x58EF,\n\t1665:  0x58F1,\n\t1666:  0x58F2,\n\t1667:  0x58F4,\n\t1668:  0x58F5,\n\t1669:  0x58F7,\n\t1670:  0x58F8,\n\t1671:  0x58FA,\n\t1672:  0x58FB,\n\t1673:  0x58FC,\n\t1674:  0x58FD,\n\t1675:  0x58FE,\n\t1676:  0x58FF,\n\t1677:  0x5900,\n\t1678:  0x5901,\n\t1679:  0x5903,\n\t1680:  0x5905,\n\t1681:  0x5906,\n\t1682:  0x5908,\n\t1683:  0x5909,\n\t1684:  0x590A,\n\t1685:  0x590B,\n\t1686:  0x590C,\n\t1687:  0x590E,\n\t1688:  0x5910,\n\t1689:  0x5911,\n\t1690:  0x5912,\n\t1691:  0x5913,\n\t1692:  0x5917,\n\t1693:  0x5918,\n\t1694:  0x591B,\n\t1695:  0x591D,\n\t1696:  0x591E,\n\t1697:  0x5920,\n\t1698:  0x5921,\n\t1699:  0x5922,\n\t1700:  0x5923,\n\t1701:  0x5926,\n\t1702:  0x5928,\n\t1703:  0x592C,\n\t1704:  0x5930,\n\t1705:  0x5932,\n\t1706:  0x5933,\n\t1707:  0x5935,\n\t1708:  0x5936,\n\t1709:  0x593B,\n\t1710:  0x593D,\n\t1711:  0x593E,\n\t1712:  0x593F,\n\t1713:  0x5940,\n\t1714:  0x5943,\n\t1715:  0x5945,\n\t1716:  0x5946,\n\t1717:  0x594A,\n\t1718:  0x594C,\n\t1719:  0x594D,\n\t1720:  0x5950,\n\t1721:  0x5952,\n\t1722:  0x5953,\n\t1723:  0x5959,\n\t1724:  0x595B,\n\t1725:  0x595C,\n\t1726:  0x595D,\n\t1727:  0x595E,\n\t1728:  0x595F,\n\t1729:  0x5961,\n\t1730:  0x5963,\n\t1731:  0x5964,\n\t1732:  0x5966,\n\t1733:  0x5967,\n\t1734:  0x5968,\n\t1735:  0x5969,\n\t1736:  0x596A,\n\t1737:  0x596B,\n\t1738:  0x596C,\n\t1739:  0x596D,\n\t1740:  0x596E,\n\t1741:  0x596F,\n\t1742:  0x5970,\n\t1743:  0x5971,\n\t1744:  0x5972,\n\t1745:  0x5975,\n\t1746:  0x5977,\n\t1747:  0x597A,\n\t1748:  0x597B,\n\t1749:  0x597C,\n\t1750:  0x597E,\n\t1751:  0x597F,\n\t1752:  0x5980,\n\t1753:  0x5985,\n\t1754:  0x5989,\n\t1755:  0x598B,\n\t1756:  0x598C,\n\t1757:  0x598E,\n\t1758:  0x598F,\n\t1759:  0x5990,\n\t1760:  0x5991,\n\t1761:  0x5994,\n\t1762:  0x5995,\n\t1763:  0x5998,\n\t1764:  0x599A,\n\t1765:  0x599B,\n\t1766:  0x599C,\n\t1767:  0x599D,\n\t1768:  0x599F,\n\t1769:  0x59A0,\n\t1770:  0x59A1,\n\t1771:  0x59A2,\n\t1772:  0x59A6,\n\t1773:  0x59A7,\n\t1774:  0x59AC,\n\t1775:  0x59AD,\n\t1776:  0x59B0,\n\t1777:  0x59B1,\n\t1778:  0x59B3,\n\t1779:  0x59B4,\n\t1780:  0x59B5,\n\t1781:  0x59B6,\n\t1782:  0x59B7,\n\t1783:  0x59B8,\n\t1784:  0x59BA,\n\t1785:  0x59BC,\n\t1786:  0x59BD,\n\t1787:  0x59BF,\n\t1788:  0x59C0,\n\t1789:  0x59C1,\n\t1790:  0x59C2,\n\t1791:  0x59C3,\n\t1792:  0x59C4,\n\t1793:  0x59C5,\n\t1794:  0x59C7,\n\t1795:  0x59C8,\n\t1796:  0x59C9,\n\t1797:  0x59CC,\n\t1798:  0x59CD,\n\t1799:  0x59CE,\n\t1800:  0x59CF,\n\t1801:  0x59D5,\n\t1802:  0x59D6,\n\t1803:  0x59D9,\n\t1804:  0x59DB,\n\t1805:  0x59DE,\n\t1806:  0x59DF,\n\t1807:  0x59E0,\n\t1808:  0x59E1,\n\t1809:  0x59E2,\n\t1810:  0x59E4,\n\t1811:  0x59E6,\n\t1812:  0x59E7,\n\t1813:  0x59E9,\n\t1814:  0x59EA,\n\t1815:  0x59EB,\n\t1816:  0x59ED,\n\t1817:  0x59EE,\n\t1818:  0x59EF,\n\t1819:  0x59F0,\n\t1820:  0x59F1,\n\t1821:  0x59F2,\n\t1822:  0x59F3,\n\t1823:  0x59F4,\n\t1824:  0x59F5,\n\t1825:  0x59F6,\n\t1826:  0x59F7,\n\t1827:  0x59F8,\n\t1828:  0x59FA,\n\t1829:  0x59FC,\n\t1830:  0x59FD,\n\t1831:  0x59FE,\n\t1832:  0x5A00,\n\t1833:  0x5A02,\n\t1834:  0x5A0A,\n\t1835:  0x5A0B,\n\t1836:  0x5A0D,\n\t1837:  0x5A0E,\n\t1838:  0x5A0F,\n\t1839:  0x5A10,\n\t1840:  0x5A12,\n\t1841:  0x5A14,\n\t1842:  0x5A15,\n\t1843:  0x5A16,\n\t1844:  0x5A17,\n\t1845:  0x5A19,\n\t1846:  0x5A1A,\n\t1847:  0x5A1B,\n\t1848:  0x5A1D,\n\t1849:  0x5A1E,\n\t1850:  0x5A21,\n\t1851:  0x5A22,\n\t1852:  0x5A24,\n\t1853:  0x5A26,\n\t1854:  0x5A27,\n\t1855:  0x5A28,\n\t1856:  0x5A2A,\n\t1857:  0x5A2B,\n\t1858:  0x5A2C,\n\t1859:  0x5A2D,\n\t1860:  0x5A2E,\n\t1861:  0x5A2F,\n\t1862:  0x5A30,\n\t1863:  0x5A33,\n\t1864:  0x5A35,\n\t1865:  0x5A37,\n\t1866:  0x5A38,\n\t1867:  0x5A39,\n\t1868:  0x5A3A,\n\t1869:  0x5A3B,\n\t1870:  0x5A3D,\n\t1871:  0x5A3E,\n\t1872:  0x5A3F,\n\t1873:  0x5A41,\n\t1874:  0x5A42,\n\t1875:  0x5A43,\n\t1876:  0x5A44,\n\t1877:  0x5A45,\n\t1878:  0x5A47,\n\t1879:  0x5A48,\n\t1880:  0x5A4B,\n\t1881:  0x5A4C,\n\t1882:  0x5A4D,\n\t1883:  0x5A4E,\n\t1884:  0x5A4F,\n\t1885:  0x5A50,\n\t1886:  0x5A51,\n\t1887:  0x5A52,\n\t1888:  0x5A53,\n\t1889:  0x5A54,\n\t1890:  0x5A56,\n\t1891:  0x5A57,\n\t1892:  0x5A58,\n\t1893:  0x5A59,\n\t1894:  0x5A5B,\n\t1895:  0x5A5C,\n\t1896:  0x5A5D,\n\t1897:  0x5A5E,\n\t1898:  0x5A5F,\n\t1899:  0x5A60,\n\t1900:  0x5A61,\n\t1901:  0x5A63,\n\t1902:  0x5A64,\n\t1903:  0x5A65,\n\t1904:  0x5A66,\n\t1905:  0x5A68,\n\t1906:  0x5A69,\n\t1907:  0x5A6B,\n\t1908:  0x5A6C,\n\t1909:  0x5A6D,\n\t1910:  0x5A6E,\n\t1911:  0x5A6F,\n\t1912:  0x5A70,\n\t1913:  0x5A71,\n\t1914:  0x5A72,\n\t1915:  0x5A73,\n\t1916:  0x5A78,\n\t1917:  0x5A79,\n\t1918:  0x5A7B,\n\t1919:  0x5A7C,\n\t1920:  0x5A7D,\n\t1921:  0x5A7E,\n\t1922:  0x5A80,\n\t1923:  0x5A81,\n\t1924:  0x5A82,\n\t1925:  0x5A83,\n\t1926:  0x5A84,\n\t1927:  0x5A85,\n\t1928:  0x5A86,\n\t1929:  0x5A87,\n\t1930:  0x5A88,\n\t1931:  0x5A89,\n\t1932:  0x5A8A,\n\t1933:  0x5A8B,\n\t1934:  0x5A8C,\n\t1935:  0x5A8D,\n\t1936:  0x5A8E,\n\t1937:  0x5A8F,\n\t1938:  0x5A90,\n\t1939:  0x5A91,\n\t1940:  0x5A93,\n\t1941:  0x5A94,\n\t1942:  0x5A95,\n\t1943:  0x5A96,\n\t1944:  0x5A97,\n\t1945:  0x5A98,\n\t1946:  0x5A99,\n\t1947:  0x5A9C,\n\t1948:  0x5A9D,\n\t1949:  0x5A9E,\n\t1950:  0x5A9F,\n\t1951:  0x5AA0,\n\t1952:  0x5AA1,\n\t1953:  0x5AA2,\n\t1954:  0x5AA3,\n\t1955:  0x5AA4,\n\t1956:  0x5AA5,\n\t1957:  0x5AA6,\n\t1958:  0x5AA7,\n\t1959:  0x5AA8,\n\t1960:  0x5AA9,\n\t1961:  0x5AAB,\n\t1962:  0x5AAC,\n\t1963:  0x5AAD,\n\t1964:  0x5AAE,\n\t1965:  0x5AAF,\n\t1966:  0x5AB0,\n\t1967:  0x5AB1,\n\t1968:  0x5AB4,\n\t1969:  0x5AB6,\n\t1970:  0x5AB7,\n\t1971:  0x5AB9,\n\t1972:  0x5ABA,\n\t1973:  0x5ABB,\n\t1974:  0x5ABC,\n\t1975:  0x5ABD,\n\t1976:  0x5ABF,\n\t1977:  0x5AC0,\n\t1978:  0x5AC3,\n\t1979:  0x5AC4,\n\t1980:  0x5AC5,\n\t1981:  0x5AC6,\n\t1982:  0x5AC7,\n\t1983:  0x5AC8,\n\t1984:  0x5ACA,\n\t1985:  0x5ACB,\n\t1986:  0x5ACD,\n\t1987:  0x5ACE,\n\t1988:  0x5ACF,\n\t1989:  0x5AD0,\n\t1990:  0x5AD1,\n\t1991:  0x5AD3,\n\t1992:  0x5AD5,\n\t1993:  0x5AD7,\n\t1994:  0x5AD9,\n\t1995:  0x5ADA,\n\t1996:  0x5ADB,\n\t1997:  0x5ADD,\n\t1998:  0x5ADE,\n\t1999:  0x5ADF,\n\t2000:  0x5AE2,\n\t2001:  0x5AE4,\n\t2002:  0x5AE5,\n\t2003:  0x5AE7,\n\t2004:  0x5AE8,\n\t2005:  0x5AEA,\n\t2006:  0x5AEC,\n\t2007:  0x5AED,\n\t2008:  0x5AEE,\n\t2009:  0x5AEF,\n\t2010:  0x5AF0,\n\t2011:  0x5AF2,\n\t2012:  0x5AF3,\n\t2013:  0x5AF4,\n\t2014:  0x5AF5,\n\t2015:  0x5AF6,\n\t2016:  0x5AF7,\n\t2017:  0x5AF8,\n\t2018:  0x5AF9,\n\t2019:  0x5AFA,\n\t2020:  0x5AFB,\n\t2021:  0x5AFC,\n\t2022:  0x5AFD,\n\t2023:  0x5AFE,\n\t2024:  0x5AFF,\n\t2025:  0x5B00,\n\t2026:  0x5B01,\n\t2027:  0x5B02,\n\t2028:  0x5B03,\n\t2029:  0x5B04,\n\t2030:  0x5B05,\n\t2031:  0x5B06,\n\t2032:  0x5B07,\n\t2033:  0x5B08,\n\t2034:  0x5B0A,\n\t2035:  0x5B0B,\n\t2036:  0x5B0C,\n\t2037:  0x5B0D,\n\t2038:  0x5B0E,\n\t2039:  0x5B0F,\n\t2040:  0x5B10,\n\t2041:  0x5B11,\n\t2042:  0x5B12,\n\t2043:  0x5B13,\n\t2044:  0x5B14,\n\t2045:  0x5B15,\n\t2046:  0x5B18,\n\t2047:  0x5B19,\n\t2048:  0x5B1A,\n\t2049:  0x5B1B,\n\t2050:  0x5B1C,\n\t2051:  0x5B1D,\n\t2052:  0x5B1E,\n\t2053:  0x5B1F,\n\t2054:  0x5B20,\n\t2055:  0x5B21,\n\t2056:  0x5B22,\n\t2057:  0x5B23,\n\t2058:  0x5B24,\n\t2059:  0x5B25,\n\t2060:  0x5B26,\n\t2061:  0x5B27,\n\t2062:  0x5B28,\n\t2063:  0x5B29,\n\t2064:  0x5B2A,\n\t2065:  0x5B2B,\n\t2066:  0x5B2C,\n\t2067:  0x5B2D,\n\t2068:  0x5B2E,\n\t2069:  0x5B2F,\n\t2070:  0x5B30,\n\t2071:  0x5B31,\n\t2072:  0x5B33,\n\t2073:  0x5B35,\n\t2074:  0x5B36,\n\t2075:  0x5B38,\n\t2076:  0x5B39,\n\t2077:  0x5B3A,\n\t2078:  0x5B3B,\n\t2079:  0x5B3C,\n\t2080:  0x5B3D,\n\t2081:  0x5B3E,\n\t2082:  0x5B3F,\n\t2083:  0x5B41,\n\t2084:  0x5B42,\n\t2085:  0x5B43,\n\t2086:  0x5B44,\n\t2087:  0x5B45,\n\t2088:  0x5B46,\n\t2089:  0x5B47,\n\t2090:  0x5B48,\n\t2091:  0x5B49,\n\t2092:  0x5B4A,\n\t2093:  0x5B4B,\n\t2094:  0x5B4C,\n\t2095:  0x5B4D,\n\t2096:  0x5B4E,\n\t2097:  0x5B4F,\n\t2098:  0x5B52,\n\t2099:  0x5B56,\n\t2100:  0x5B5E,\n\t2101:  0x5B60,\n\t2102:  0x5B61,\n\t2103:  0x5B67,\n\t2104:  0x5B68,\n\t2105:  0x5B6B,\n\t2106:  0x5B6D,\n\t2107:  0x5B6E,\n\t2108:  0x5B6F,\n\t2109:  0x5B72,\n\t2110:  0x5B74,\n\t2111:  0x5B76,\n\t2112:  0x5B77,\n\t2113:  0x5B78,\n\t2114:  0x5B79,\n\t2115:  0x5B7B,\n\t2116:  0x5B7C,\n\t2117:  0x5B7E,\n\t2118:  0x5B7F,\n\t2119:  0x5B82,\n\t2120:  0x5B86,\n\t2121:  0x5B8A,\n\t2122:  0x5B8D,\n\t2123:  0x5B8E,\n\t2124:  0x5B90,\n\t2125:  0x5B91,\n\t2126:  0x5B92,\n\t2127:  0x5B94,\n\t2128:  0x5B96,\n\t2129:  0x5B9F,\n\t2130:  0x5BA7,\n\t2131:  0x5BA8,\n\t2132:  0x5BA9,\n\t2133:  0x5BAC,\n\t2134:  0x5BAD,\n\t2135:  0x5BAE,\n\t2136:  0x5BAF,\n\t2137:  0x5BB1,\n\t2138:  0x5BB2,\n\t2139:  0x5BB7,\n\t2140:  0x5BBA,\n\t2141:  0x5BBB,\n\t2142:  0x5BBC,\n\t2143:  0x5BC0,\n\t2144:  0x5BC1,\n\t2145:  0x5BC3,\n\t2146:  0x5BC8,\n\t2147:  0x5BC9,\n\t2148:  0x5BCA,\n\t2149:  0x5BCB,\n\t2150:  0x5BCD,\n\t2151:  0x5BCE,\n\t2152:  0x5BCF,\n\t2153:  0x5BD1,\n\t2154:  0x5BD4,\n\t2155:  0x5BD5,\n\t2156:  0x5BD6,\n\t2157:  0x5BD7,\n\t2158:  0x5BD8,\n\t2159:  0x5BD9,\n\t2160:  0x5BDA,\n\t2161:  0x5BDB,\n\t2162:  0x5BDC,\n\t2163:  0x5BE0,\n\t2164:  0x5BE2,\n\t2165:  0x5BE3,\n\t2166:  0x5BE6,\n\t2167:  0x5BE7,\n\t2168:  0x5BE9,\n\t2169:  0x5BEA,\n\t2170:  0x5BEB,\n\t2171:  0x5BEC,\n\t2172:  0x5BED,\n\t2173:  0x5BEF,\n\t2174:  0x5BF1,\n\t2175:  0x5BF2,\n\t2176:  0x5BF3,\n\t2177:  0x5BF4,\n\t2178:  0x5BF5,\n\t2179:  0x5BF6,\n\t2180:  0x5BF7,\n\t2181:  0x5BFD,\n\t2182:  0x5BFE,\n\t2183:  0x5C00,\n\t2184:  0x5C02,\n\t2185:  0x5C03,\n\t2186:  0x5C05,\n\t2187:  0x5C07,\n\t2188:  0x5C08,\n\t2189:  0x5C0B,\n\t2190:  0x5C0C,\n\t2191:  0x5C0D,\n\t2192:  0x5C0E,\n\t2193:  0x5C10,\n\t2194:  0x5C12,\n\t2195:  0x5C13,\n\t2196:  0x5C17,\n\t2197:  0x5C19,\n\t2198:  0x5C1B,\n\t2199:  0x5C1E,\n\t2200:  0x5C1F,\n\t2201:  0x5C20,\n\t2202:  0x5C21,\n\t2203:  0x5C23,\n\t2204:  0x5C26,\n\t2205:  0x5C28,\n\t2206:  0x5C29,\n\t2207:  0x5C2A,\n\t2208:  0x5C2B,\n\t2209:  0x5C2D,\n\t2210:  0x5C2E,\n\t2211:  0x5C2F,\n\t2212:  0x5C30,\n\t2213:  0x5C32,\n\t2214:  0x5C33,\n\t2215:  0x5C35,\n\t2216:  0x5C36,\n\t2217:  0x5C37,\n\t2218:  0x5C43,\n\t2219:  0x5C44,\n\t2220:  0x5C46,\n\t2221:  0x5C47,\n\t2222:  0x5C4C,\n\t2223:  0x5C4D,\n\t2224:  0x5C52,\n\t2225:  0x5C53,\n\t2226:  0x5C54,\n\t2227:  0x5C56,\n\t2228:  0x5C57,\n\t2229:  0x5C58,\n\t2230:  0x5C5A,\n\t2231:  0x5C5B,\n\t2232:  0x5C5C,\n\t2233:  0x5C5D,\n\t2234:  0x5C5F,\n\t2235:  0x5C62,\n\t2236:  0x5C64,\n\t2237:  0x5C67,\n\t2238:  0x5C68,\n\t2239:  0x5C69,\n\t2240:  0x5C6A,\n\t2241:  0x5C6B,\n\t2242:  0x5C6C,\n\t2243:  0x5C6D,\n\t2244:  0x5C70,\n\t2245:  0x5C72,\n\t2246:  0x5C73,\n\t2247:  0x5C74,\n\t2248:  0x5C75,\n\t2249:  0x5C76,\n\t2250:  0x5C77,\n\t2251:  0x5C78,\n\t2252:  0x5C7B,\n\t2253:  0x5C7C,\n\t2254:  0x5C7D,\n\t2255:  0x5C7E,\n\t2256:  0x5C80,\n\t2257:  0x5C83,\n\t2258:  0x5C84,\n\t2259:  0x5C85,\n\t2260:  0x5C86,\n\t2261:  0x5C87,\n\t2262:  0x5C89,\n\t2263:  0x5C8A,\n\t2264:  0x5C8B,\n\t2265:  0x5C8E,\n\t2266:  0x5C8F,\n\t2267:  0x5C92,\n\t2268:  0x5C93,\n\t2269:  0x5C95,\n\t2270:  0x5C9D,\n\t2271:  0x5C9E,\n\t2272:  0x5C9F,\n\t2273:  0x5CA0,\n\t2274:  0x5CA1,\n\t2275:  0x5CA4,\n\t2276:  0x5CA5,\n\t2277:  0x5CA6,\n\t2278:  0x5CA7,\n\t2279:  0x5CA8,\n\t2280:  0x5CAA,\n\t2281:  0x5CAE,\n\t2282:  0x5CAF,\n\t2283:  0x5CB0,\n\t2284:  0x5CB2,\n\t2285:  0x5CB4,\n\t2286:  0x5CB6,\n\t2287:  0x5CB9,\n\t2288:  0x5CBA,\n\t2289:  0x5CBB,\n\t2290:  0x5CBC,\n\t2291:  0x5CBE,\n\t2292:  0x5CC0,\n\t2293:  0x5CC2,\n\t2294:  0x5CC3,\n\t2295:  0x5CC5,\n\t2296:  0x5CC6,\n\t2297:  0x5CC7,\n\t2298:  0x5CC8,\n\t2299:  0x5CC9,\n\t2300:  0x5CCA,\n\t2301:  0x5CCC,\n\t2302:  0x5CCD,\n\t2303:  0x5CCE,\n\t2304:  0x5CCF,\n\t2305:  0x5CD0,\n\t2306:  0x5CD1,\n\t2307:  0x5CD3,\n\t2308:  0x5CD4,\n\t2309:  0x5CD5,\n\t2310:  0x5CD6,\n\t2311:  0x5CD7,\n\t2312:  0x5CD8,\n\t2313:  0x5CDA,\n\t2314:  0x5CDB,\n\t2315:  0x5CDC,\n\t2316:  0x5CDD,\n\t2317:  0x5CDE,\n\t2318:  0x5CDF,\n\t2319:  0x5CE0,\n\t2320:  0x5CE2,\n\t2321:  0x5CE3,\n\t2322:  0x5CE7,\n\t2323:  0x5CE9,\n\t2324:  0x5CEB,\n\t2325:  0x5CEC,\n\t2326:  0x5CEE,\n\t2327:  0x5CEF,\n\t2328:  0x5CF1,\n\t2329:  0x5CF2,\n\t2330:  0x5CF3,\n\t2331:  0x5CF4,\n\t2332:  0x5CF5,\n\t2333:  0x5CF6,\n\t2334:  0x5CF7,\n\t2335:  0x5CF8,\n\t2336:  0x5CF9,\n\t2337:  0x5CFA,\n\t2338:  0x5CFC,\n\t2339:  0x5CFD,\n\t2340:  0x5CFE,\n\t2341:  0x5CFF,\n\t2342:  0x5D00,\n\t2343:  0x5D01,\n\t2344:  0x5D04,\n\t2345:  0x5D05,\n\t2346:  0x5D08,\n\t2347:  0x5D09,\n\t2348:  0x5D0A,\n\t2349:  0x5D0B,\n\t2350:  0x5D0C,\n\t2351:  0x5D0D,\n\t2352:  0x5D0F,\n\t2353:  0x5D10,\n\t2354:  0x5D11,\n\t2355:  0x5D12,\n\t2356:  0x5D13,\n\t2357:  0x5D15,\n\t2358:  0x5D17,\n\t2359:  0x5D18,\n\t2360:  0x5D19,\n\t2361:  0x5D1A,\n\t2362:  0x5D1C,\n\t2363:  0x5D1D,\n\t2364:  0x5D1F,\n\t2365:  0x5D20,\n\t2366:  0x5D21,\n\t2367:  0x5D22,\n\t2368:  0x5D23,\n\t2369:  0x5D25,\n\t2370:  0x5D28,\n\t2371:  0x5D2A,\n\t2372:  0x5D2B,\n\t2373:  0x5D2C,\n\t2374:  0x5D2F,\n\t2375:  0x5D30,\n\t2376:  0x5D31,\n\t2377:  0x5D32,\n\t2378:  0x5D33,\n\t2379:  0x5D35,\n\t2380:  0x5D36,\n\t2381:  0x5D37,\n\t2382:  0x5D38,\n\t2383:  0x5D39,\n\t2384:  0x5D3A,\n\t2385:  0x5D3B,\n\t2386:  0x5D3C,\n\t2387:  0x5D3F,\n\t2388:  0x5D40,\n\t2389:  0x5D41,\n\t2390:  0x5D42,\n\t2391:  0x5D43,\n\t2392:  0x5D44,\n\t2393:  0x5D45,\n\t2394:  0x5D46,\n\t2395:  0x5D48,\n\t2396:  0x5D49,\n\t2397:  0x5D4D,\n\t2398:  0x5D4E,\n\t2399:  0x5D4F,\n\t2400:  0x5D50,\n\t2401:  0x5D51,\n\t2402:  0x5D52,\n\t2403:  0x5D53,\n\t2404:  0x5D54,\n\t2405:  0x5D55,\n\t2406:  0x5D56,\n\t2407:  0x5D57,\n\t2408:  0x5D59,\n\t2409:  0x5D5A,\n\t2410:  0x5D5C,\n\t2411:  0x5D5E,\n\t2412:  0x5D5F,\n\t2413:  0x5D60,\n\t2414:  0x5D61,\n\t2415:  0x5D62,\n\t2416:  0x5D63,\n\t2417:  0x5D64,\n\t2418:  0x5D65,\n\t2419:  0x5D66,\n\t2420:  0x5D67,\n\t2421:  0x5D68,\n\t2422:  0x5D6A,\n\t2423:  0x5D6D,\n\t2424:  0x5D6E,\n\t2425:  0x5D70,\n\t2426:  0x5D71,\n\t2427:  0x5D72,\n\t2428:  0x5D73,\n\t2429:  0x5D75,\n\t2430:  0x5D76,\n\t2431:  0x5D77,\n\t2432:  0x5D78,\n\t2433:  0x5D79,\n\t2434:  0x5D7A,\n\t2435:  0x5D7B,\n\t2436:  0x5D7C,\n\t2437:  0x5D7D,\n\t2438:  0x5D7E,\n\t2439:  0x5D7F,\n\t2440:  0x5D80,\n\t2441:  0x5D81,\n\t2442:  0x5D83,\n\t2443:  0x5D84,\n\t2444:  0x5D85,\n\t2445:  0x5D86,\n\t2446:  0x5D87,\n\t2447:  0x5D88,\n\t2448:  0x5D89,\n\t2449:  0x5D8A,\n\t2450:  0x5D8B,\n\t2451:  0x5D8C,\n\t2452:  0x5D8D,\n\t2453:  0x5D8E,\n\t2454:  0x5D8F,\n\t2455:  0x5D90,\n\t2456:  0x5D91,\n\t2457:  0x5D92,\n\t2458:  0x5D93,\n\t2459:  0x5D94,\n\t2460:  0x5D95,\n\t2461:  0x5D96,\n\t2462:  0x5D97,\n\t2463:  0x5D98,\n\t2464:  0x5D9A,\n\t2465:  0x5D9B,\n\t2466:  0x5D9C,\n\t2467:  0x5D9E,\n\t2468:  0x5D9F,\n\t2469:  0x5DA0,\n\t2470:  0x5DA1,\n\t2471:  0x5DA2,\n\t2472:  0x5DA3,\n\t2473:  0x5DA4,\n\t2474:  0x5DA5,\n\t2475:  0x5DA6,\n\t2476:  0x5DA7,\n\t2477:  0x5DA8,\n\t2478:  0x5DA9,\n\t2479:  0x5DAA,\n\t2480:  0x5DAB,\n\t2481:  0x5DAC,\n\t2482:  0x5DAD,\n\t2483:  0x5DAE,\n\t2484:  0x5DAF,\n\t2485:  0x5DB0,\n\t2486:  0x5DB1,\n\t2487:  0x5DB2,\n\t2488:  0x5DB3,\n\t2489:  0x5DB4,\n\t2490:  0x5DB5,\n\t2491:  0x5DB6,\n\t2492:  0x5DB8,\n\t2493:  0x5DB9,\n\t2494:  0x5DBA,\n\t2495:  0x5DBB,\n\t2496:  0x5DBC,\n\t2497:  0x5DBD,\n\t2498:  0x5DBE,\n\t2499:  0x5DBF,\n\t2500:  0x5DC0,\n\t2501:  0x5DC1,\n\t2502:  0x5DC2,\n\t2503:  0x5DC3,\n\t2504:  0x5DC4,\n\t2505:  0x5DC6,\n\t2506:  0x5DC7,\n\t2507:  0x5DC8,\n\t2508:  0x5DC9,\n\t2509:  0x5DCA,\n\t2510:  0x5DCB,\n\t2511:  0x5DCC,\n\t2512:  0x5DCE,\n\t2513:  0x5DCF,\n\t2514:  0x5DD0,\n\t2515:  0x5DD1,\n\t2516:  0x5DD2,\n\t2517:  0x5DD3,\n\t2518:  0x5DD4,\n\t2519:  0x5DD5,\n\t2520:  0x5DD6,\n\t2521:  0x5DD7,\n\t2522:  0x5DD8,\n\t2523:  0x5DD9,\n\t2524:  0x5DDA,\n\t2525:  0x5DDC,\n\t2526:  0x5DDF,\n\t2527:  0x5DE0,\n\t2528:  0x5DE3,\n\t2529:  0x5DE4,\n\t2530:  0x5DEA,\n\t2531:  0x5DEC,\n\t2532:  0x5DED,\n\t2533:  0x5DF0,\n\t2534:  0x5DF5,\n\t2535:  0x5DF6,\n\t2536:  0x5DF8,\n\t2537:  0x5DF9,\n\t2538:  0x5DFA,\n\t2539:  0x5DFB,\n\t2540:  0x5DFC,\n\t2541:  0x5DFF,\n\t2542:  0x5E00,\n\t2543:  0x5E04,\n\t2544:  0x5E07,\n\t2545:  0x5E09,\n\t2546:  0x5E0A,\n\t2547:  0x5E0B,\n\t2548:  0x5E0D,\n\t2549:  0x5E0E,\n\t2550:  0x5E12,\n\t2551:  0x5E13,\n\t2552:  0x5E17,\n\t2553:  0x5E1E,\n\t2554:  0x5E1F,\n\t2555:  0x5E20,\n\t2556:  0x5E21,\n\t2557:  0x5E22,\n\t2558:  0x5E23,\n\t2559:  0x5E24,\n\t2560:  0x5E25,\n\t2561:  0x5E28,\n\t2562:  0x5E29,\n\t2563:  0x5E2A,\n\t2564:  0x5E2B,\n\t2565:  0x5E2C,\n\t2566:  0x5E2F,\n\t2567:  0x5E30,\n\t2568:  0x5E32,\n\t2569:  0x5E33,\n\t2570:  0x5E34,\n\t2571:  0x5E35,\n\t2572:  0x5E36,\n\t2573:  0x5E39,\n\t2574:  0x5E3A,\n\t2575:  0x5E3E,\n\t2576:  0x5E3F,\n\t2577:  0x5E40,\n\t2578:  0x5E41,\n\t2579:  0x5E43,\n\t2580:  0x5E46,\n\t2581:  0x5E47,\n\t2582:  0x5E48,\n\t2583:  0x5E49,\n\t2584:  0x5E4A,\n\t2585:  0x5E4B,\n\t2586:  0x5E4D,\n\t2587:  0x5E4E,\n\t2588:  0x5E4F,\n\t2589:  0x5E50,\n\t2590:  0x5E51,\n\t2591:  0x5E52,\n\t2592:  0x5E53,\n\t2593:  0x5E56,\n\t2594:  0x5E57,\n\t2595:  0x5E58,\n\t2596:  0x5E59,\n\t2597:  0x5E5A,\n\t2598:  0x5E5C,\n\t2599:  0x5E5D,\n\t2600:  0x5E5F,\n\t2601:  0x5E60,\n\t2602:  0x5E63,\n\t2603:  0x5E64,\n\t2604:  0x5E65,\n\t2605:  0x5E66,\n\t2606:  0x5E67,\n\t2607:  0x5E68,\n\t2608:  0x5E69,\n\t2609:  0x5E6A,\n\t2610:  0x5E6B,\n\t2611:  0x5E6C,\n\t2612:  0x5E6D,\n\t2613:  0x5E6E,\n\t2614:  0x5E6F,\n\t2615:  0x5E70,\n\t2616:  0x5E71,\n\t2617:  0x5E75,\n\t2618:  0x5E77,\n\t2619:  0x5E79,\n\t2620:  0x5E7E,\n\t2621:  0x5E81,\n\t2622:  0x5E82,\n\t2623:  0x5E83,\n\t2624:  0x5E85,\n\t2625:  0x5E88,\n\t2626:  0x5E89,\n\t2627:  0x5E8C,\n\t2628:  0x5E8D,\n\t2629:  0x5E8E,\n\t2630:  0x5E92,\n\t2631:  0x5E98,\n\t2632:  0x5E9B,\n\t2633:  0x5E9D,\n\t2634:  0x5EA1,\n\t2635:  0x5EA2,\n\t2636:  0x5EA3,\n\t2637:  0x5EA4,\n\t2638:  0x5EA8,\n\t2639:  0x5EA9,\n\t2640:  0x5EAA,\n\t2641:  0x5EAB,\n\t2642:  0x5EAC,\n\t2643:  0x5EAE,\n\t2644:  0x5EAF,\n\t2645:  0x5EB0,\n\t2646:  0x5EB1,\n\t2647:  0x5EB2,\n\t2648:  0x5EB4,\n\t2649:  0x5EBA,\n\t2650:  0x5EBB,\n\t2651:  0x5EBC,\n\t2652:  0x5EBD,\n\t2653:  0x5EBF,\n\t2654:  0x5EC0,\n\t2655:  0x5EC1,\n\t2656:  0x5EC2,\n\t2657:  0x5EC3,\n\t2658:  0x5EC4,\n\t2659:  0x5EC5,\n\t2660:  0x5EC6,\n\t2661:  0x5EC7,\n\t2662:  0x5EC8,\n\t2663:  0x5ECB,\n\t2664:  0x5ECC,\n\t2665:  0x5ECD,\n\t2666:  0x5ECE,\n\t2667:  0x5ECF,\n\t2668:  0x5ED0,\n\t2669:  0x5ED4,\n\t2670:  0x5ED5,\n\t2671:  0x5ED7,\n\t2672:  0x5ED8,\n\t2673:  0x5ED9,\n\t2674:  0x5EDA,\n\t2675:  0x5EDC,\n\t2676:  0x5EDD,\n\t2677:  0x5EDE,\n\t2678:  0x5EDF,\n\t2679:  0x5EE0,\n\t2680:  0x5EE1,\n\t2681:  0x5EE2,\n\t2682:  0x5EE3,\n\t2683:  0x5EE4,\n\t2684:  0x5EE5,\n\t2685:  0x5EE6,\n\t2686:  0x5EE7,\n\t2687:  0x5EE9,\n\t2688:  0x5EEB,\n\t2689:  0x5EEC,\n\t2690:  0x5EED,\n\t2691:  0x5EEE,\n\t2692:  0x5EEF,\n\t2693:  0x5EF0,\n\t2694:  0x5EF1,\n\t2695:  0x5EF2,\n\t2696:  0x5EF3,\n\t2697:  0x5EF5,\n\t2698:  0x5EF8,\n\t2699:  0x5EF9,\n\t2700:  0x5EFB,\n\t2701:  0x5EFC,\n\t2702:  0x5EFD,\n\t2703:  0x5F05,\n\t2704:  0x5F06,\n\t2705:  0x5F07,\n\t2706:  0x5F09,\n\t2707:  0x5F0C,\n\t2708:  0x5F0D,\n\t2709:  0x5F0E,\n\t2710:  0x5F10,\n\t2711:  0x5F12,\n\t2712:  0x5F14,\n\t2713:  0x5F16,\n\t2714:  0x5F19,\n\t2715:  0x5F1A,\n\t2716:  0x5F1C,\n\t2717:  0x5F1D,\n\t2718:  0x5F1E,\n\t2719:  0x5F21,\n\t2720:  0x5F22,\n\t2721:  0x5F23,\n\t2722:  0x5F24,\n\t2723:  0x5F28,\n\t2724:  0x5F2B,\n\t2725:  0x5F2C,\n\t2726:  0x5F2E,\n\t2727:  0x5F30,\n\t2728:  0x5F32,\n\t2729:  0x5F33,\n\t2730:  0x5F34,\n\t2731:  0x5F35,\n\t2732:  0x5F36,\n\t2733:  0x5F37,\n\t2734:  0x5F38,\n\t2735:  0x5F3B,\n\t2736:  0x5F3D,\n\t2737:  0x5F3E,\n\t2738:  0x5F3F,\n\t2739:  0x5F41,\n\t2740:  0x5F42,\n\t2741:  0x5F43,\n\t2742:  0x5F44,\n\t2743:  0x5F45,\n\t2744:  0x5F46,\n\t2745:  0x5F47,\n\t2746:  0x5F48,\n\t2747:  0x5F49,\n\t2748:  0x5F4A,\n\t2749:  0x5F4B,\n\t2750:  0x5F4C,\n\t2751:  0x5F4D,\n\t2752:  0x5F4E,\n\t2753:  0x5F4F,\n\t2754:  0x5F51,\n\t2755:  0x5F54,\n\t2756:  0x5F59,\n\t2757:  0x5F5A,\n\t2758:  0x5F5B,\n\t2759:  0x5F5C,\n\t2760:  0x5F5E,\n\t2761:  0x5F5F,\n\t2762:  0x5F60,\n\t2763:  0x5F63,\n\t2764:  0x5F65,\n\t2765:  0x5F67,\n\t2766:  0x5F68,\n\t2767:  0x5F6B,\n\t2768:  0x5F6E,\n\t2769:  0x5F6F,\n\t2770:  0x5F72,\n\t2771:  0x5F74,\n\t2772:  0x5F75,\n\t2773:  0x5F76,\n\t2774:  0x5F78,\n\t2775:  0x5F7A,\n\t2776:  0x5F7D,\n\t2777:  0x5F7E,\n\t2778:  0x5F7F,\n\t2779:  0x5F83,\n\t2780:  0x5F86,\n\t2781:  0x5F8D,\n\t2782:  0x5F8E,\n\t2783:  0x5F8F,\n\t2784:  0x5F91,\n\t2785:  0x5F93,\n\t2786:  0x5F94,\n\t2787:  0x5F96,\n\t2788:  0x5F9A,\n\t2789:  0x5F9B,\n\t2790:  0x5F9D,\n\t2791:  0x5F9E,\n\t2792:  0x5F9F,\n\t2793:  0x5FA0,\n\t2794:  0x5FA2,\n\t2795:  0x5FA3,\n\t2796:  0x5FA4,\n\t2797:  0x5FA5,\n\t2798:  0x5FA6,\n\t2799:  0x5FA7,\n\t2800:  0x5FA9,\n\t2801:  0x5FAB,\n\t2802:  0x5FAC,\n\t2803:  0x5FAF,\n\t2804:  0x5FB0,\n\t2805:  0x5FB1,\n\t2806:  0x5FB2,\n\t2807:  0x5FB3,\n\t2808:  0x5FB4,\n\t2809:  0x5FB6,\n\t2810:  0x5FB8,\n\t2811:  0x5FB9,\n\t2812:  0x5FBA,\n\t2813:  0x5FBB,\n\t2814:  0x5FBE,\n\t2815:  0x5FBF,\n\t2816:  0x5FC0,\n\t2817:  0x5FC1,\n\t2818:  0x5FC2,\n\t2819:  0x5FC7,\n\t2820:  0x5FC8,\n\t2821:  0x5FCA,\n\t2822:  0x5FCB,\n\t2823:  0x5FCE,\n\t2824:  0x5FD3,\n\t2825:  0x5FD4,\n\t2826:  0x5FD5,\n\t2827:  0x5FDA,\n\t2828:  0x5FDB,\n\t2829:  0x5FDC,\n\t2830:  0x5FDE,\n\t2831:  0x5FDF,\n\t2832:  0x5FE2,\n\t2833:  0x5FE3,\n\t2834:  0x5FE5,\n\t2835:  0x5FE6,\n\t2836:  0x5FE8,\n\t2837:  0x5FE9,\n\t2838:  0x5FEC,\n\t2839:  0x5FEF,\n\t2840:  0x5FF0,\n\t2841:  0x5FF2,\n\t2842:  0x5FF3,\n\t2843:  0x5FF4,\n\t2844:  0x5FF6,\n\t2845:  0x5FF7,\n\t2846:  0x5FF9,\n\t2847:  0x5FFA,\n\t2848:  0x5FFC,\n\t2849:  0x6007,\n\t2850:  0x6008,\n\t2851:  0x6009,\n\t2852:  0x600B,\n\t2853:  0x600C,\n\t2854:  0x6010,\n\t2855:  0x6011,\n\t2856:  0x6013,\n\t2857:  0x6017,\n\t2858:  0x6018,\n\t2859:  0x601A,\n\t2860:  0x601E,\n\t2861:  0x601F,\n\t2862:  0x6022,\n\t2863:  0x6023,\n\t2864:  0x6024,\n\t2865:  0x602C,\n\t2866:  0x602D,\n\t2867:  0x602E,\n\t2868:  0x6030,\n\t2869:  0x6031,\n\t2870:  0x6032,\n\t2871:  0x6033,\n\t2872:  0x6034,\n\t2873:  0x6036,\n\t2874:  0x6037,\n\t2875:  0x6038,\n\t2876:  0x6039,\n\t2877:  0x603A,\n\t2878:  0x603D,\n\t2879:  0x603E,\n\t2880:  0x6040,\n\t2881:  0x6044,\n\t2882:  0x6045,\n\t2883:  0x6046,\n\t2884:  0x6047,\n\t2885:  0x6048,\n\t2886:  0x6049,\n\t2887:  0x604A,\n\t2888:  0x604C,\n\t2889:  0x604E,\n\t2890:  0x604F,\n\t2891:  0x6051,\n\t2892:  0x6053,\n\t2893:  0x6054,\n\t2894:  0x6056,\n\t2895:  0x6057,\n\t2896:  0x6058,\n\t2897:  0x605B,\n\t2898:  0x605C,\n\t2899:  0x605E,\n\t2900:  0x605F,\n\t2901:  0x6060,\n\t2902:  0x6061,\n\t2903:  0x6065,\n\t2904:  0x6066,\n\t2905:  0x606E,\n\t2906:  0x6071,\n\t2907:  0x6072,\n\t2908:  0x6074,\n\t2909:  0x6075,\n\t2910:  0x6077,\n\t2911:  0x607E,\n\t2912:  0x6080,\n\t2913:  0x6081,\n\t2914:  0x6082,\n\t2915:  0x6085,\n\t2916:  0x6086,\n\t2917:  0x6087,\n\t2918:  0x6088,\n\t2919:  0x608A,\n\t2920:  0x608B,\n\t2921:  0x608E,\n\t2922:  0x608F,\n\t2923:  0x6090,\n\t2924:  0x6091,\n\t2925:  0x6093,\n\t2926:  0x6095,\n\t2927:  0x6097,\n\t2928:  0x6098,\n\t2929:  0x6099,\n\t2930:  0x609C,\n\t2931:  0x609E,\n\t2932:  0x60A1,\n\t2933:  0x60A2,\n\t2934:  0x60A4,\n\t2935:  0x60A5,\n\t2936:  0x60A7,\n\t2937:  0x60A9,\n\t2938:  0x60AA,\n\t2939:  0x60AE,\n\t2940:  0x60B0,\n\t2941:  0x60B3,\n\t2942:  0x60B5,\n\t2943:  0x60B6,\n\t2944:  0x60B7,\n\t2945:  0x60B9,\n\t2946:  0x60BA,\n\t2947:  0x60BD,\n\t2948:  0x60BE,\n\t2949:  0x60BF,\n\t2950:  0x60C0,\n\t2951:  0x60C1,\n\t2952:  0x60C2,\n\t2953:  0x60C3,\n\t2954:  0x60C4,\n\t2955:  0x60C7,\n\t2956:  0x60C8,\n\t2957:  0x60C9,\n\t2958:  0x60CC,\n\t2959:  0x60CD,\n\t2960:  0x60CE,\n\t2961:  0x60CF,\n\t2962:  0x60D0,\n\t2963:  0x60D2,\n\t2964:  0x60D3,\n\t2965:  0x60D4,\n\t2966:  0x60D6,\n\t2967:  0x60D7,\n\t2968:  0x60D9,\n\t2969:  0x60DB,\n\t2970:  0x60DE,\n\t2971:  0x60E1,\n\t2972:  0x60E2,\n\t2973:  0x60E3,\n\t2974:  0x60E4,\n\t2975:  0x60E5,\n\t2976:  0x60EA,\n\t2977:  0x60F1,\n\t2978:  0x60F2,\n\t2979:  0x60F5,\n\t2980:  0x60F7,\n\t2981:  0x60F8,\n\t2982:  0x60FB,\n\t2983:  0x60FC,\n\t2984:  0x60FD,\n\t2985:  0x60FE,\n\t2986:  0x60FF,\n\t2987:  0x6102,\n\t2988:  0x6103,\n\t2989:  0x6104,\n\t2990:  0x6105,\n\t2991:  0x6107,\n\t2992:  0x610A,\n\t2993:  0x610B,\n\t2994:  0x610C,\n\t2995:  0x6110,\n\t2996:  0x6111,\n\t2997:  0x6112,\n\t2998:  0x6113,\n\t2999:  0x6114,\n\t3000:  0x6116,\n\t3001:  0x6117,\n\t3002:  0x6118,\n\t3003:  0x6119,\n\t3004:  0x611B,\n\t3005:  0x611C,\n\t3006:  0x611D,\n\t3007:  0x611E,\n\t3008:  0x6121,\n\t3009:  0x6122,\n\t3010:  0x6125,\n\t3011:  0x6128,\n\t3012:  0x6129,\n\t3013:  0x612A,\n\t3014:  0x612C,\n\t3015:  0x612D,\n\t3016:  0x612E,\n\t3017:  0x612F,\n\t3018:  0x6130,\n\t3019:  0x6131,\n\t3020:  0x6132,\n\t3021:  0x6133,\n\t3022:  0x6134,\n\t3023:  0x6135,\n\t3024:  0x6136,\n\t3025:  0x6137,\n\t3026:  0x6138,\n\t3027:  0x6139,\n\t3028:  0x613A,\n\t3029:  0x613B,\n\t3030:  0x613C,\n\t3031:  0x613D,\n\t3032:  0x613E,\n\t3033:  0x6140,\n\t3034:  0x6141,\n\t3035:  0x6142,\n\t3036:  0x6143,\n\t3037:  0x6144,\n\t3038:  0x6145,\n\t3039:  0x6146,\n\t3040:  0x6147,\n\t3041:  0x6149,\n\t3042:  0x614B,\n\t3043:  0x614D,\n\t3044:  0x614F,\n\t3045:  0x6150,\n\t3046:  0x6152,\n\t3047:  0x6153,\n\t3048:  0x6154,\n\t3049:  0x6156,\n\t3050:  0x6157,\n\t3051:  0x6158,\n\t3052:  0x6159,\n\t3053:  0x615A,\n\t3054:  0x615B,\n\t3055:  0x615C,\n\t3056:  0x615E,\n\t3057:  0x615F,\n\t3058:  0x6160,\n\t3059:  0x6161,\n\t3060:  0x6163,\n\t3061:  0x6164,\n\t3062:  0x6165,\n\t3063:  0x6166,\n\t3064:  0x6169,\n\t3065:  0x616A,\n\t3066:  0x616B,\n\t3067:  0x616C,\n\t3068:  0x616D,\n\t3069:  0x616E,\n\t3070:  0x616F,\n\t3071:  0x6171,\n\t3072:  0x6172,\n\t3073:  0x6173,\n\t3074:  0x6174,\n\t3075:  0x6176,\n\t3076:  0x6178,\n\t3077:  0x6179,\n\t3078:  0x617A,\n\t3079:  0x617B,\n\t3080:  0x617C,\n\t3081:  0x617D,\n\t3082:  0x617E,\n\t3083:  0x617F,\n\t3084:  0x6180,\n\t3085:  0x6181,\n\t3086:  0x6182,\n\t3087:  0x6183,\n\t3088:  0x6184,\n\t3089:  0x6185,\n\t3090:  0x6186,\n\t3091:  0x6187,\n\t3092:  0x6188,\n\t3093:  0x6189,\n\t3094:  0x618A,\n\t3095:  0x618C,\n\t3096:  0x618D,\n\t3097:  0x618F,\n\t3098:  0x6190,\n\t3099:  0x6191,\n\t3100:  0x6192,\n\t3101:  0x6193,\n\t3102:  0x6195,\n\t3103:  0x6196,\n\t3104:  0x6197,\n\t3105:  0x6198,\n\t3106:  0x6199,\n\t3107:  0x619A,\n\t3108:  0x619B,\n\t3109:  0x619C,\n\t3110:  0x619E,\n\t3111:  0x619F,\n\t3112:  0x61A0,\n\t3113:  0x61A1,\n\t3114:  0x61A2,\n\t3115:  0x61A3,\n\t3116:  0x61A4,\n\t3117:  0x61A5,\n\t3118:  0x61A6,\n\t3119:  0x61AA,\n\t3120:  0x61AB,\n\t3121:  0x61AD,\n\t3122:  0x61AE,\n\t3123:  0x61AF,\n\t3124:  0x61B0,\n\t3125:  0x61B1,\n\t3126:  0x61B2,\n\t3127:  0x61B3,\n\t3128:  0x61B4,\n\t3129:  0x61B5,\n\t3130:  0x61B6,\n\t3131:  0x61B8,\n\t3132:  0x61B9,\n\t3133:  0x61BA,\n\t3134:  0x61BB,\n\t3135:  0x61BC,\n\t3136:  0x61BD,\n\t3137:  0x61BF,\n\t3138:  0x61C0,\n\t3139:  0x61C1,\n\t3140:  0x61C3,\n\t3141:  0x61C4,\n\t3142:  0x61C5,\n\t3143:  0x61C6,\n\t3144:  0x61C7,\n\t3145:  0x61C9,\n\t3146:  0x61CC,\n\t3147:  0x61CD,\n\t3148:  0x61CE,\n\t3149:  0x61CF,\n\t3150:  0x61D0,\n\t3151:  0x61D3,\n\t3152:  0x61D5,\n\t3153:  0x61D6,\n\t3154:  0x61D7,\n\t3155:  0x61D8,\n\t3156:  0x61D9,\n\t3157:  0x61DA,\n\t3158:  0x61DB,\n\t3159:  0x61DC,\n\t3160:  0x61DD,\n\t3161:  0x61DE,\n\t3162:  0x61DF,\n\t3163:  0x61E0,\n\t3164:  0x61E1,\n\t3165:  0x61E2,\n\t3166:  0x61E3,\n\t3167:  0x61E4,\n\t3168:  0x61E5,\n\t3169:  0x61E7,\n\t3170:  0x61E8,\n\t3171:  0x61E9,\n\t3172:  0x61EA,\n\t3173:  0x61EB,\n\t3174:  0x61EC,\n\t3175:  0x61ED,\n\t3176:  0x61EE,\n\t3177:  0x61EF,\n\t3178:  0x61F0,\n\t3179:  0x61F1,\n\t3180:  0x61F2,\n\t3181:  0x61F3,\n\t3182:  0x61F4,\n\t3183:  0x61F6,\n\t3184:  0x61F7,\n\t3185:  0x61F8,\n\t3186:  0x61F9,\n\t3187:  0x61FA,\n\t3188:  0x61FB,\n\t3189:  0x61FC,\n\t3190:  0x61FD,\n\t3191:  0x61FE,\n\t3192:  0x6200,\n\t3193:  0x6201,\n\t3194:  0x6202,\n\t3195:  0x6203,\n\t3196:  0x6204,\n\t3197:  0x6205,\n\t3198:  0x6207,\n\t3199:  0x6209,\n\t3200:  0x6213,\n\t3201:  0x6214,\n\t3202:  0x6219,\n\t3203:  0x621C,\n\t3204:  0x621D,\n\t3205:  0x621E,\n\t3206:  0x6220,\n\t3207:  0x6223,\n\t3208:  0x6226,\n\t3209:  0x6227,\n\t3210:  0x6228,\n\t3211:  0x6229,\n\t3212:  0x622B,\n\t3213:  0x622D,\n\t3214:  0x622F,\n\t3215:  0x6230,\n\t3216:  0x6231,\n\t3217:  0x6232,\n\t3218:  0x6235,\n\t3219:  0x6236,\n\t3220:  0x6238,\n\t3221:  0x6239,\n\t3222:  0x623A,\n\t3223:  0x623B,\n\t3224:  0x623C,\n\t3225:  0x6242,\n\t3226:  0x6244,\n\t3227:  0x6245,\n\t3228:  0x6246,\n\t3229:  0x624A,\n\t3230:  0x624F,\n\t3231:  0x6250,\n\t3232:  0x6255,\n\t3233:  0x6256,\n\t3234:  0x6257,\n\t3235:  0x6259,\n\t3236:  0x625A,\n\t3237:  0x625C,\n\t3238:  0x625D,\n\t3239:  0x625E,\n\t3240:  0x625F,\n\t3241:  0x6260,\n\t3242:  0x6261,\n\t3243:  0x6262,\n\t3244:  0x6264,\n\t3245:  0x6265,\n\t3246:  0x6268,\n\t3247:  0x6271,\n\t3248:  0x6272,\n\t3249:  0x6274,\n\t3250:  0x6275,\n\t3251:  0x6277,\n\t3252:  0x6278,\n\t3253:  0x627A,\n\t3254:  0x627B,\n\t3255:  0x627D,\n\t3256:  0x6281,\n\t3257:  0x6282,\n\t3258:  0x6283,\n\t3259:  0x6285,\n\t3260:  0x6286,\n\t3261:  0x6287,\n\t3262:  0x6288,\n\t3263:  0x628B,\n\t3264:  0x628C,\n\t3265:  0x628D,\n\t3266:  0x628E,\n\t3267:  0x628F,\n\t3268:  0x6290,\n\t3269:  0x6294,\n\t3270:  0x6299,\n\t3271:  0x629C,\n\t3272:  0x629D,\n\t3273:  0x629E,\n\t3274:  0x62A3,\n\t3275:  0x62A6,\n\t3276:  0x62A7,\n\t3277:  0x62A9,\n\t3278:  0x62AA,\n\t3279:  0x62AD,\n\t3280:  0x62AE,\n\t3281:  0x62AF,\n\t3282:  0x62B0,\n\t3283:  0x62B2,\n\t3284:  0x62B3,\n\t3285:  0x62B4,\n\t3286:  0x62B6,\n\t3287:  0x62B7,\n\t3288:  0x62B8,\n\t3289:  0x62BA,\n\t3290:  0x62BE,\n\t3291:  0x62C0,\n\t3292:  0x62C1,\n\t3293:  0x62C3,\n\t3294:  0x62CB,\n\t3295:  0x62CF,\n\t3296:  0x62D1,\n\t3297:  0x62D5,\n\t3298:  0x62DD,\n\t3299:  0x62DE,\n\t3300:  0x62E0,\n\t3301:  0x62E1,\n\t3302:  0x62E4,\n\t3303:  0x62EA,\n\t3304:  0x62EB,\n\t3305:  0x62F0,\n\t3306:  0x62F2,\n\t3307:  0x62F5,\n\t3308:  0x62F8,\n\t3309:  0x62F9,\n\t3310:  0x62FA,\n\t3311:  0x62FB,\n\t3312:  0x6300,\n\t3313:  0x6303,\n\t3314:  0x6304,\n\t3315:  0x6305,\n\t3316:  0x6306,\n\t3317:  0x630A,\n\t3318:  0x630B,\n\t3319:  0x630C,\n\t3320:  0x630D,\n\t3321:  0x630F,\n\t3322:  0x6310,\n\t3323:  0x6312,\n\t3324:  0x6313,\n\t3325:  0x6314,\n\t3326:  0x6315,\n\t3327:  0x6317,\n\t3328:  0x6318,\n\t3329:  0x6319,\n\t3330:  0x631C,\n\t3331:  0x6326,\n\t3332:  0x6327,\n\t3333:  0x6329,\n\t3334:  0x632C,\n\t3335:  0x632D,\n\t3336:  0x632E,\n\t3337:  0x6330,\n\t3338:  0x6331,\n\t3339:  0x6333,\n\t3340:  0x6334,\n\t3341:  0x6335,\n\t3342:  0x6336,\n\t3343:  0x6337,\n\t3344:  0x6338,\n\t3345:  0x633B,\n\t3346:  0x633C,\n\t3347:  0x633E,\n\t3348:  0x633F,\n\t3349:  0x6340,\n\t3350:  0x6341,\n\t3351:  0x6344,\n\t3352:  0x6347,\n\t3353:  0x6348,\n\t3354:  0x634A,\n\t3355:  0x6351,\n\t3356:  0x6352,\n\t3357:  0x6353,\n\t3358:  0x6354,\n\t3359:  0x6356,\n\t3360:  0x6357,\n\t3361:  0x6358,\n\t3362:  0x6359,\n\t3363:  0x635A,\n\t3364:  0x635B,\n\t3365:  0x635C,\n\t3366:  0x635D,\n\t3367:  0x6360,\n\t3368:  0x6364,\n\t3369:  0x6365,\n\t3370:  0x6366,\n\t3371:  0x6368,\n\t3372:  0x636A,\n\t3373:  0x636B,\n\t3374:  0x636C,\n\t3375:  0x636F,\n\t3376:  0x6370,\n\t3377:  0x6372,\n\t3378:  0x6373,\n\t3379:  0x6374,\n\t3380:  0x6375,\n\t3381:  0x6378,\n\t3382:  0x6379,\n\t3383:  0x637C,\n\t3384:  0x637D,\n\t3385:  0x637E,\n\t3386:  0x637F,\n\t3387:  0x6381,\n\t3388:  0x6383,\n\t3389:  0x6384,\n\t3390:  0x6385,\n\t3391:  0x6386,\n\t3392:  0x638B,\n\t3393:  0x638D,\n\t3394:  0x6391,\n\t3395:  0x6393,\n\t3396:  0x6394,\n\t3397:  0x6395,\n\t3398:  0x6397,\n\t3399:  0x6399,\n\t3400:  0x639A,\n\t3401:  0x639B,\n\t3402:  0x639C,\n\t3403:  0x639D,\n\t3404:  0x639E,\n\t3405:  0x639F,\n\t3406:  0x63A1,\n\t3407:  0x63A4,\n\t3408:  0x63A6,\n\t3409:  0x63AB,\n\t3410:  0x63AF,\n\t3411:  0x63B1,\n\t3412:  0x63B2,\n\t3413:  0x63B5,\n\t3414:  0x63B6,\n\t3415:  0x63B9,\n\t3416:  0x63BB,\n\t3417:  0x63BD,\n\t3418:  0x63BF,\n\t3419:  0x63C0,\n\t3420:  0x63C1,\n\t3421:  0x63C2,\n\t3422:  0x63C3,\n\t3423:  0x63C5,\n\t3424:  0x63C7,\n\t3425:  0x63C8,\n\t3426:  0x63CA,\n\t3427:  0x63CB,\n\t3428:  0x63CC,\n\t3429:  0x63D1,\n\t3430:  0x63D3,\n\t3431:  0x63D4,\n\t3432:  0x63D5,\n\t3433:  0x63D7,\n\t3434:  0x63D8,\n\t3435:  0x63D9,\n\t3436:  0x63DA,\n\t3437:  0x63DB,\n\t3438:  0x63DC,\n\t3439:  0x63DD,\n\t3440:  0x63DF,\n\t3441:  0x63E2,\n\t3442:  0x63E4,\n\t3443:  0x63E5,\n\t3444:  0x63E6,\n\t3445:  0x63E7,\n\t3446:  0x63E8,\n\t3447:  0x63EB,\n\t3448:  0x63EC,\n\t3449:  0x63EE,\n\t3450:  0x63EF,\n\t3451:  0x63F0,\n\t3452:  0x63F1,\n\t3453:  0x63F3,\n\t3454:  0x63F5,\n\t3455:  0x63F7,\n\t3456:  0x63F9,\n\t3457:  0x63FA,\n\t3458:  0x63FB,\n\t3459:  0x63FC,\n\t3460:  0x63FE,\n\t3461:  0x6403,\n\t3462:  0x6404,\n\t3463:  0x6406,\n\t3464:  0x6407,\n\t3465:  0x6408,\n\t3466:  0x6409,\n\t3467:  0x640A,\n\t3468:  0x640D,\n\t3469:  0x640E,\n\t3470:  0x6411,\n\t3471:  0x6412,\n\t3472:  0x6415,\n\t3473:  0x6416,\n\t3474:  0x6417,\n\t3475:  0x6418,\n\t3476:  0x6419,\n\t3477:  0x641A,\n\t3478:  0x641D,\n\t3479:  0x641F,\n\t3480:  0x6422,\n\t3481:  0x6423,\n\t3482:  0x6424,\n\t3483:  0x6425,\n\t3484:  0x6427,\n\t3485:  0x6428,\n\t3486:  0x6429,\n\t3487:  0x642B,\n\t3488:  0x642E,\n\t3489:  0x642F,\n\t3490:  0x6430,\n\t3491:  0x6431,\n\t3492:  0x6432,\n\t3493:  0x6433,\n\t3494:  0x6435,\n\t3495:  0x6436,\n\t3496:  0x6437,\n\t3497:  0x6438,\n\t3498:  0x6439,\n\t3499:  0x643B,\n\t3500:  0x643C,\n\t3501:  0x643E,\n\t3502:  0x6440,\n\t3503:  0x6442,\n\t3504:  0x6443,\n\t3505:  0x6449,\n\t3506:  0x644B,\n\t3507:  0x644C,\n\t3508:  0x644D,\n\t3509:  0x644E,\n\t3510:  0x644F,\n\t3511:  0x6450,\n\t3512:  0x6451,\n\t3513:  0x6453,\n\t3514:  0x6455,\n\t3515:  0x6456,\n\t3516:  0x6457,\n\t3517:  0x6459,\n\t3518:  0x645A,\n\t3519:  0x645B,\n\t3520:  0x645C,\n\t3521:  0x645D,\n\t3522:  0x645F,\n\t3523:  0x6460,\n\t3524:  0x6461,\n\t3525:  0x6462,\n\t3526:  0x6463,\n\t3527:  0x6464,\n\t3528:  0x6465,\n\t3529:  0x6466,\n\t3530:  0x6468,\n\t3531:  0x646A,\n\t3532:  0x646B,\n\t3533:  0x646C,\n\t3534:  0x646E,\n\t3535:  0x646F,\n\t3536:  0x6470,\n\t3537:  0x6471,\n\t3538:  0x6472,\n\t3539:  0x6473,\n\t3540:  0x6474,\n\t3541:  0x6475,\n\t3542:  0x6476,\n\t3543:  0x6477,\n\t3544:  0x647B,\n\t3545:  0x647C,\n\t3546:  0x647D,\n\t3547:  0x647E,\n\t3548:  0x647F,\n\t3549:  0x6480,\n\t3550:  0x6481,\n\t3551:  0x6483,\n\t3552:  0x6486,\n\t3553:  0x6488,\n\t3554:  0x6489,\n\t3555:  0x648A,\n\t3556:  0x648B,\n\t3557:  0x648C,\n\t3558:  0x648D,\n\t3559:  0x648E,\n\t3560:  0x648F,\n\t3561:  0x6490,\n\t3562:  0x6493,\n\t3563:  0x6494,\n\t3564:  0x6497,\n\t3565:  0x6498,\n\t3566:  0x649A,\n\t3567:  0x649B,\n\t3568:  0x649C,\n\t3569:  0x649D,\n\t3570:  0x649F,\n\t3571:  0x64A0,\n\t3572:  0x64A1,\n\t3573:  0x64A2,\n\t3574:  0x64A3,\n\t3575:  0x64A5,\n\t3576:  0x64A6,\n\t3577:  0x64A7,\n\t3578:  0x64A8,\n\t3579:  0x64AA,\n\t3580:  0x64AB,\n\t3581:  0x64AF,\n\t3582:  0x64B1,\n\t3583:  0x64B2,\n\t3584:  0x64B3,\n\t3585:  0x64B4,\n\t3586:  0x64B6,\n\t3587:  0x64B9,\n\t3588:  0x64BB,\n\t3589:  0x64BD,\n\t3590:  0x64BE,\n\t3591:  0x64BF,\n\t3592:  0x64C1,\n\t3593:  0x64C3,\n\t3594:  0x64C4,\n\t3595:  0x64C6,\n\t3596:  0x64C7,\n\t3597:  0x64C8,\n\t3598:  0x64C9,\n\t3599:  0x64CA,\n\t3600:  0x64CB,\n\t3601:  0x64CC,\n\t3602:  0x64CF,\n\t3603:  0x64D1,\n\t3604:  0x64D3,\n\t3605:  0x64D4,\n\t3606:  0x64D5,\n\t3607:  0x64D6,\n\t3608:  0x64D9,\n\t3609:  0x64DA,\n\t3610:  0x64DB,\n\t3611:  0x64DC,\n\t3612:  0x64DD,\n\t3613:  0x64DF,\n\t3614:  0x64E0,\n\t3615:  0x64E1,\n\t3616:  0x64E3,\n\t3617:  0x64E5,\n\t3618:  0x64E7,\n\t3619:  0x64E8,\n\t3620:  0x64E9,\n\t3621:  0x64EA,\n\t3622:  0x64EB,\n\t3623:  0x64EC,\n\t3624:  0x64ED,\n\t3625:  0x64EE,\n\t3626:  0x64EF,\n\t3627:  0x64F0,\n\t3628:  0x64F1,\n\t3629:  0x64F2,\n\t3630:  0x64F3,\n\t3631:  0x64F4,\n\t3632:  0x64F5,\n\t3633:  0x64F6,\n\t3634:  0x64F7,\n\t3635:  0x64F8,\n\t3636:  0x64F9,\n\t3637:  0x64FA,\n\t3638:  0x64FB,\n\t3639:  0x64FC,\n\t3640:  0x64FD,\n\t3641:  0x64FE,\n\t3642:  0x64FF,\n\t3643:  0x6501,\n\t3644:  0x6502,\n\t3645:  0x6503,\n\t3646:  0x6504,\n\t3647:  0x6505,\n\t3648:  0x6506,\n\t3649:  0x6507,\n\t3650:  0x6508,\n\t3651:  0x650A,\n\t3652:  0x650B,\n\t3653:  0x650C,\n\t3654:  0x650D,\n\t3655:  0x650E,\n\t3656:  0x650F,\n\t3657:  0x6510,\n\t3658:  0x6511,\n\t3659:  0x6513,\n\t3660:  0x6514,\n\t3661:  0x6515,\n\t3662:  0x6516,\n\t3663:  0x6517,\n\t3664:  0x6519,\n\t3665:  0x651A,\n\t3666:  0x651B,\n\t3667:  0x651C,\n\t3668:  0x651D,\n\t3669:  0x651E,\n\t3670:  0x651F,\n\t3671:  0x6520,\n\t3672:  0x6521,\n\t3673:  0x6522,\n\t3674:  0x6523,\n\t3675:  0x6524,\n\t3676:  0x6526,\n\t3677:  0x6527,\n\t3678:  0x6528,\n\t3679:  0x6529,\n\t3680:  0x652A,\n\t3681:  0x652C,\n\t3682:  0x652D,\n\t3683:  0x6530,\n\t3684:  0x6531,\n\t3685:  0x6532,\n\t3686:  0x6533,\n\t3687:  0x6537,\n\t3688:  0x653A,\n\t3689:  0x653C,\n\t3690:  0x653D,\n\t3691:  0x6540,\n\t3692:  0x6541,\n\t3693:  0x6542,\n\t3694:  0x6543,\n\t3695:  0x6544,\n\t3696:  0x6546,\n\t3697:  0x6547,\n\t3698:  0x654A,\n\t3699:  0x654B,\n\t3700:  0x654D,\n\t3701:  0x654E,\n\t3702:  0x6550,\n\t3703:  0x6552,\n\t3704:  0x6553,\n\t3705:  0x6554,\n\t3706:  0x6557,\n\t3707:  0x6558,\n\t3708:  0x655A,\n\t3709:  0x655C,\n\t3710:  0x655F,\n\t3711:  0x6560,\n\t3712:  0x6561,\n\t3713:  0x6564,\n\t3714:  0x6565,\n\t3715:  0x6567,\n\t3716:  0x6568,\n\t3717:  0x6569,\n\t3718:  0x656A,\n\t3719:  0x656D,\n\t3720:  0x656E,\n\t3721:  0x656F,\n\t3722:  0x6571,\n\t3723:  0x6573,\n\t3724:  0x6575,\n\t3725:  0x6576,\n\t3726:  0x6578,\n\t3727:  0x6579,\n\t3728:  0x657A,\n\t3729:  0x657B,\n\t3730:  0x657C,\n\t3731:  0x657D,\n\t3732:  0x657E,\n\t3733:  0x657F,\n\t3734:  0x6580,\n\t3735:  0x6581,\n\t3736:  0x6582,\n\t3737:  0x6583,\n\t3738:  0x6584,\n\t3739:  0x6585,\n\t3740:  0x6586,\n\t3741:  0x6588,\n\t3742:  0x6589,\n\t3743:  0x658A,\n\t3744:  0x658D,\n\t3745:  0x658E,\n\t3746:  0x658F,\n\t3747:  0x6592,\n\t3748:  0x6594,\n\t3749:  0x6595,\n\t3750:  0x6596,\n\t3751:  0x6598,\n\t3752:  0x659A,\n\t3753:  0x659D,\n\t3754:  0x659E,\n\t3755:  0x65A0,\n\t3756:  0x65A2,\n\t3757:  0x65A3,\n\t3758:  0x65A6,\n\t3759:  0x65A8,\n\t3760:  0x65AA,\n\t3761:  0x65AC,\n\t3762:  0x65AE,\n\t3763:  0x65B1,\n\t3764:  0x65B2,\n\t3765:  0x65B3,\n\t3766:  0x65B4,\n\t3767:  0x65B5,\n\t3768:  0x65B6,\n\t3769:  0x65B7,\n\t3770:  0x65B8,\n\t3771:  0x65BA,\n\t3772:  0x65BB,\n\t3773:  0x65BE,\n\t3774:  0x65BF,\n\t3775:  0x65C0,\n\t3776:  0x65C2,\n\t3777:  0x65C7,\n\t3778:  0x65C8,\n\t3779:  0x65C9,\n\t3780:  0x65CA,\n\t3781:  0x65CD,\n\t3782:  0x65D0,\n\t3783:  0x65D1,\n\t3784:  0x65D3,\n\t3785:  0x65D4,\n\t3786:  0x65D5,\n\t3787:  0x65D8,\n\t3788:  0x65D9,\n\t3789:  0x65DA,\n\t3790:  0x65DB,\n\t3791:  0x65DC,\n\t3792:  0x65DD,\n\t3793:  0x65DE,\n\t3794:  0x65DF,\n\t3795:  0x65E1,\n\t3796:  0x65E3,\n\t3797:  0x65E4,\n\t3798:  0x65EA,\n\t3799:  0x65EB,\n\t3800:  0x65F2,\n\t3801:  0x65F3,\n\t3802:  0x65F4,\n\t3803:  0x65F5,\n\t3804:  0x65F8,\n\t3805:  0x65F9,\n\t3806:  0x65FB,\n\t3807:  0x65FC,\n\t3808:  0x65FD,\n\t3809:  0x65FE,\n\t3810:  0x65FF,\n\t3811:  0x6601,\n\t3812:  0x6604,\n\t3813:  0x6605,\n\t3814:  0x6607,\n\t3815:  0x6608,\n\t3816:  0x6609,\n\t3817:  0x660B,\n\t3818:  0x660D,\n\t3819:  0x6610,\n\t3820:  0x6611,\n\t3821:  0x6612,\n\t3822:  0x6616,\n\t3823:  0x6617,\n\t3824:  0x6618,\n\t3825:  0x661A,\n\t3826:  0x661B,\n\t3827:  0x661C,\n\t3828:  0x661E,\n\t3829:  0x6621,\n\t3830:  0x6622,\n\t3831:  0x6623,\n\t3832:  0x6624,\n\t3833:  0x6626,\n\t3834:  0x6629,\n\t3835:  0x662A,\n\t3836:  0x662B,\n\t3837:  0x662C,\n\t3838:  0x662E,\n\t3839:  0x6630,\n\t3840:  0x6632,\n\t3841:  0x6633,\n\t3842:  0x6637,\n\t3843:  0x6638,\n\t3844:  0x6639,\n\t3845:  0x663A,\n\t3846:  0x663B,\n\t3847:  0x663D,\n\t3848:  0x663F,\n\t3849:  0x6640,\n\t3850:  0x6642,\n\t3851:  0x6644,\n\t3852:  0x6645,\n\t3853:  0x6646,\n\t3854:  0x6647,\n\t3855:  0x6648,\n\t3856:  0x6649,\n\t3857:  0x664A,\n\t3858:  0x664D,\n\t3859:  0x664E,\n\t3860:  0x6650,\n\t3861:  0x6651,\n\t3862:  0x6658,\n\t3863:  0x6659,\n\t3864:  0x665B,\n\t3865:  0x665C,\n\t3866:  0x665D,\n\t3867:  0x665E,\n\t3868:  0x6660,\n\t3869:  0x6662,\n\t3870:  0x6663,\n\t3871:  0x6665,\n\t3872:  0x6667,\n\t3873:  0x6669,\n\t3874:  0x666A,\n\t3875:  0x666B,\n\t3876:  0x666C,\n\t3877:  0x666D,\n\t3878:  0x6671,\n\t3879:  0x6672,\n\t3880:  0x6673,\n\t3881:  0x6675,\n\t3882:  0x6678,\n\t3883:  0x6679,\n\t3884:  0x667B,\n\t3885:  0x667C,\n\t3886:  0x667D,\n\t3887:  0x667F,\n\t3888:  0x6680,\n\t3889:  0x6681,\n\t3890:  0x6683,\n\t3891:  0x6685,\n\t3892:  0x6686,\n\t3893:  0x6688,\n\t3894:  0x6689,\n\t3895:  0x668A,\n\t3896:  0x668B,\n\t3897:  0x668D,\n\t3898:  0x668E,\n\t3899:  0x668F,\n\t3900:  0x6690,\n\t3901:  0x6692,\n\t3902:  0x6693,\n\t3903:  0x6694,\n\t3904:  0x6695,\n\t3905:  0x6698,\n\t3906:  0x6699,\n\t3907:  0x669A,\n\t3908:  0x669B,\n\t3909:  0x669C,\n\t3910:  0x669E,\n\t3911:  0x669F,\n\t3912:  0x66A0,\n\t3913:  0x66A1,\n\t3914:  0x66A2,\n\t3915:  0x66A3,\n\t3916:  0x66A4,\n\t3917:  0x66A5,\n\t3918:  0x66A6,\n\t3919:  0x66A9,\n\t3920:  0x66AA,\n\t3921:  0x66AB,\n\t3922:  0x66AC,\n\t3923:  0x66AD,\n\t3924:  0x66AF,\n\t3925:  0x66B0,\n\t3926:  0x66B1,\n\t3927:  0x66B2,\n\t3928:  0x66B3,\n\t3929:  0x66B5,\n\t3930:  0x66B6,\n\t3931:  0x66B7,\n\t3932:  0x66B8,\n\t3933:  0x66BA,\n\t3934:  0x66BB,\n\t3935:  0x66BC,\n\t3936:  0x66BD,\n\t3937:  0x66BF,\n\t3938:  0x66C0,\n\t3939:  0x66C1,\n\t3940:  0x66C2,\n\t3941:  0x66C3,\n\t3942:  0x66C4,\n\t3943:  0x66C5,\n\t3944:  0x66C6,\n\t3945:  0x66C7,\n\t3946:  0x66C8,\n\t3947:  0x66C9,\n\t3948:  0x66CA,\n\t3949:  0x66CB,\n\t3950:  0x66CC,\n\t3951:  0x66CD,\n\t3952:  0x66CE,\n\t3953:  0x66CF,\n\t3954:  0x66D0,\n\t3955:  0x66D1,\n\t3956:  0x66D2,\n\t3957:  0x66D3,\n\t3958:  0x66D4,\n\t3959:  0x66D5,\n\t3960:  0x66D6,\n\t3961:  0x66D7,\n\t3962:  0x66D8,\n\t3963:  0x66DA,\n\t3964:  0x66DE,\n\t3965:  0x66DF,\n\t3966:  0x66E0,\n\t3967:  0x66E1,\n\t3968:  0x66E2,\n\t3969:  0x66E3,\n\t3970:  0x66E4,\n\t3971:  0x66E5,\n\t3972:  0x66E7,\n\t3973:  0x66E8,\n\t3974:  0x66EA,\n\t3975:  0x66EB,\n\t3976:  0x66EC,\n\t3977:  0x66ED,\n\t3978:  0x66EE,\n\t3979:  0x66EF,\n\t3980:  0x66F1,\n\t3981:  0x66F5,\n\t3982:  0x66F6,\n\t3983:  0x66F8,\n\t3984:  0x66FA,\n\t3985:  0x66FB,\n\t3986:  0x66FD,\n\t3987:  0x6701,\n\t3988:  0x6702,\n\t3989:  0x6703,\n\t3990:  0x6704,\n\t3991:  0x6705,\n\t3992:  0x6706,\n\t3993:  0x6707,\n\t3994:  0x670C,\n\t3995:  0x670E,\n\t3996:  0x670F,\n\t3997:  0x6711,\n\t3998:  0x6712,\n\t3999:  0x6713,\n\t4000:  0x6716,\n\t4001:  0x6718,\n\t4002:  0x6719,\n\t4003:  0x671A,\n\t4004:  0x671C,\n\t4005:  0x671E,\n\t4006:  0x6720,\n\t4007:  0x6721,\n\t4008:  0x6722,\n\t4009:  0x6723,\n\t4010:  0x6724,\n\t4011:  0x6725,\n\t4012:  0x6727,\n\t4013:  0x6729,\n\t4014:  0x672E,\n\t4015:  0x6730,\n\t4016:  0x6732,\n\t4017:  0x6733,\n\t4018:  0x6736,\n\t4019:  0x6737,\n\t4020:  0x6738,\n\t4021:  0x6739,\n\t4022:  0x673B,\n\t4023:  0x673C,\n\t4024:  0x673E,\n\t4025:  0x673F,\n\t4026:  0x6741,\n\t4027:  0x6744,\n\t4028:  0x6745,\n\t4029:  0x6747,\n\t4030:  0x674A,\n\t4031:  0x674B,\n\t4032:  0x674D,\n\t4033:  0x6752,\n\t4034:  0x6754,\n\t4035:  0x6755,\n\t4036:  0x6757,\n\t4037:  0x6758,\n\t4038:  0x6759,\n\t4039:  0x675A,\n\t4040:  0x675B,\n\t4041:  0x675D,\n\t4042:  0x6762,\n\t4043:  0x6763,\n\t4044:  0x6764,\n\t4045:  0x6766,\n\t4046:  0x6767,\n\t4047:  0x676B,\n\t4048:  0x676C,\n\t4049:  0x676E,\n\t4050:  0x6771,\n\t4051:  0x6774,\n\t4052:  0x6776,\n\t4053:  0x6778,\n\t4054:  0x6779,\n\t4055:  0x677A,\n\t4056:  0x677B,\n\t4057:  0x677D,\n\t4058:  0x6780,\n\t4059:  0x6782,\n\t4060:  0x6783,\n\t4061:  0x6785,\n\t4062:  0x6786,\n\t4063:  0x6788,\n\t4064:  0x678A,\n\t4065:  0x678C,\n\t4066:  0x678D,\n\t4067:  0x678E,\n\t4068:  0x678F,\n\t4069:  0x6791,\n\t4070:  0x6792,\n\t4071:  0x6793,\n\t4072:  0x6794,\n\t4073:  0x6796,\n\t4074:  0x6799,\n\t4075:  0x679B,\n\t4076:  0x679F,\n\t4077:  0x67A0,\n\t4078:  0x67A1,\n\t4079:  0x67A4,\n\t4080:  0x67A6,\n\t4081:  0x67A9,\n\t4082:  0x67AC,\n\t4083:  0x67AE,\n\t4084:  0x67B1,\n\t4085:  0x67B2,\n\t4086:  0x67B4,\n\t4087:  0x67B9,\n\t4088:  0x67BA,\n\t4089:  0x67BB,\n\t4090:  0x67BC,\n\t4091:  0x67BD,\n\t4092:  0x67BE,\n\t4093:  0x67BF,\n\t4094:  0x67C0,\n\t4095:  0x67C2,\n\t4096:  0x67C5,\n\t4097:  0x67C6,\n\t4098:  0x67C7,\n\t4099:  0x67C8,\n\t4100:  0x67C9,\n\t4101:  0x67CA,\n\t4102:  0x67CB,\n\t4103:  0x67CC,\n\t4104:  0x67CD,\n\t4105:  0x67CE,\n\t4106:  0x67D5,\n\t4107:  0x67D6,\n\t4108:  0x67D7,\n\t4109:  0x67DB,\n\t4110:  0x67DF,\n\t4111:  0x67E1,\n\t4112:  0x67E3,\n\t4113:  0x67E4,\n\t4114:  0x67E6,\n\t4115:  0x67E7,\n\t4116:  0x67E8,\n\t4117:  0x67EA,\n\t4118:  0x67EB,\n\t4119:  0x67ED,\n\t4120:  0x67EE,\n\t4121:  0x67F2,\n\t4122:  0x67F5,\n\t4123:  0x67F6,\n\t4124:  0x67F7,\n\t4125:  0x67F8,\n\t4126:  0x67F9,\n\t4127:  0x67FA,\n\t4128:  0x67FB,\n\t4129:  0x67FC,\n\t4130:  0x67FE,\n\t4131:  0x6801,\n\t4132:  0x6802,\n\t4133:  0x6803,\n\t4134:  0x6804,\n\t4135:  0x6806,\n\t4136:  0x680D,\n\t4137:  0x6810,\n\t4138:  0x6812,\n\t4139:  0x6814,\n\t4140:  0x6815,\n\t4141:  0x6818,\n\t4142:  0x6819,\n\t4143:  0x681A,\n\t4144:  0x681B,\n\t4145:  0x681C,\n\t4146:  0x681E,\n\t4147:  0x681F,\n\t4148:  0x6820,\n\t4149:  0x6822,\n\t4150:  0x6823,\n\t4151:  0x6824,\n\t4152:  0x6825,\n\t4153:  0x6826,\n\t4154:  0x6827,\n\t4155:  0x6828,\n\t4156:  0x682B,\n\t4157:  0x682C,\n\t4158:  0x682D,\n\t4159:  0x682E,\n\t4160:  0x682F,\n\t4161:  0x6830,\n\t4162:  0x6831,\n\t4163:  0x6834,\n\t4164:  0x6835,\n\t4165:  0x6836,\n\t4166:  0x683A,\n\t4167:  0x683B,\n\t4168:  0x683F,\n\t4169:  0x6847,\n\t4170:  0x684B,\n\t4171:  0x684D,\n\t4172:  0x684F,\n\t4173:  0x6852,\n\t4174:  0x6856,\n\t4175:  0x6857,\n\t4176:  0x6858,\n\t4177:  0x6859,\n\t4178:  0x685A,\n\t4179:  0x685B,\n\t4180:  0x685C,\n\t4181:  0x685D,\n\t4182:  0x685E,\n\t4183:  0x685F,\n\t4184:  0x686A,\n\t4185:  0x686C,\n\t4186:  0x686D,\n\t4187:  0x686E,\n\t4188:  0x686F,\n\t4189:  0x6870,\n\t4190:  0x6871,\n\t4191:  0x6872,\n\t4192:  0x6873,\n\t4193:  0x6875,\n\t4194:  0x6878,\n\t4195:  0x6879,\n\t4196:  0x687A,\n\t4197:  0x687B,\n\t4198:  0x687C,\n\t4199:  0x687D,\n\t4200:  0x687E,\n\t4201:  0x687F,\n\t4202:  0x6880,\n\t4203:  0x6882,\n\t4204:  0x6884,\n\t4205:  0x6887,\n\t4206:  0x6888,\n\t4207:  0x6889,\n\t4208:  0x688A,\n\t4209:  0x688B,\n\t4210:  0x688C,\n\t4211:  0x688D,\n\t4212:  0x688E,\n\t4213:  0x6890,\n\t4214:  0x6891,\n\t4215:  0x6892,\n\t4216:  0x6894,\n\t4217:  0x6895,\n\t4218:  0x6896,\n\t4219:  0x6898,\n\t4220:  0x6899,\n\t4221:  0x689A,\n\t4222:  0x689B,\n\t4223:  0x689C,\n\t4224:  0x689D,\n\t4225:  0x689E,\n\t4226:  0x689F,\n\t4227:  0x68A0,\n\t4228:  0x68A1,\n\t4229:  0x68A3,\n\t4230:  0x68A4,\n\t4231:  0x68A5,\n\t4232:  0x68A9,\n\t4233:  0x68AA,\n\t4234:  0x68AB,\n\t4235:  0x68AC,\n\t4236:  0x68AE,\n\t4237:  0x68B1,\n\t4238:  0x68B2,\n\t4239:  0x68B4,\n\t4240:  0x68B6,\n\t4241:  0x68B7,\n\t4242:  0x68B8,\n\t4243:  0x68B9,\n\t4244:  0x68BA,\n\t4245:  0x68BB,\n\t4246:  0x68BC,\n\t4247:  0x68BD,\n\t4248:  0x68BE,\n\t4249:  0x68BF,\n\t4250:  0x68C1,\n\t4251:  0x68C3,\n\t4252:  0x68C4,\n\t4253:  0x68C5,\n\t4254:  0x68C6,\n\t4255:  0x68C7,\n\t4256:  0x68C8,\n\t4257:  0x68CA,\n\t4258:  0x68CC,\n\t4259:  0x68CE,\n\t4260:  0x68CF,\n\t4261:  0x68D0,\n\t4262:  0x68D1,\n\t4263:  0x68D3,\n\t4264:  0x68D4,\n\t4265:  0x68D6,\n\t4266:  0x68D7,\n\t4267:  0x68D9,\n\t4268:  0x68DB,\n\t4269:  0x68DC,\n\t4270:  0x68DD,\n\t4271:  0x68DE,\n\t4272:  0x68DF,\n\t4273:  0x68E1,\n\t4274:  0x68E2,\n\t4275:  0x68E4,\n\t4276:  0x68E5,\n\t4277:  0x68E6,\n\t4278:  0x68E7,\n\t4279:  0x68E8,\n\t4280:  0x68E9,\n\t4281:  0x68EA,\n\t4282:  0x68EB,\n\t4283:  0x68EC,\n\t4284:  0x68ED,\n\t4285:  0x68EF,\n\t4286:  0x68F2,\n\t4287:  0x68F3,\n\t4288:  0x68F4,\n\t4289:  0x68F6,\n\t4290:  0x68F7,\n\t4291:  0x68F8,\n\t4292:  0x68FB,\n\t4293:  0x68FD,\n\t4294:  0x68FE,\n\t4295:  0x68FF,\n\t4296:  0x6900,\n\t4297:  0x6902,\n\t4298:  0x6903,\n\t4299:  0x6904,\n\t4300:  0x6906,\n\t4301:  0x6907,\n\t4302:  0x6908,\n\t4303:  0x6909,\n\t4304:  0x690A,\n\t4305:  0x690C,\n\t4306:  0x690F,\n\t4307:  0x6911,\n\t4308:  0x6913,\n\t4309:  0x6914,\n\t4310:  0x6915,\n\t4311:  0x6916,\n\t4312:  0x6917,\n\t4313:  0x6918,\n\t4314:  0x6919,\n\t4315:  0x691A,\n\t4316:  0x691B,\n\t4317:  0x691C,\n\t4318:  0x691D,\n\t4319:  0x691E,\n\t4320:  0x6921,\n\t4321:  0x6922,\n\t4322:  0x6923,\n\t4323:  0x6925,\n\t4324:  0x6926,\n\t4325:  0x6927,\n\t4326:  0x6928,\n\t4327:  0x6929,\n\t4328:  0x692A,\n\t4329:  0x692B,\n\t4330:  0x692C,\n\t4331:  0x692E,\n\t4332:  0x692F,\n\t4333:  0x6931,\n\t4334:  0x6932,\n\t4335:  0x6933,\n\t4336:  0x6935,\n\t4337:  0x6936,\n\t4338:  0x6937,\n\t4339:  0x6938,\n\t4340:  0x693A,\n\t4341:  0x693B,\n\t4342:  0x693C,\n\t4343:  0x693E,\n\t4344:  0x6940,\n\t4345:  0x6941,\n\t4346:  0x6943,\n\t4347:  0x6944,\n\t4348:  0x6945,\n\t4349:  0x6946,\n\t4350:  0x6947,\n\t4351:  0x6948,\n\t4352:  0x6949,\n\t4353:  0x694A,\n\t4354:  0x694B,\n\t4355:  0x694C,\n\t4356:  0x694D,\n\t4357:  0x694E,\n\t4358:  0x694F,\n\t4359:  0x6950,\n\t4360:  0x6951,\n\t4361:  0x6952,\n\t4362:  0x6953,\n\t4363:  0x6955,\n\t4364:  0x6956,\n\t4365:  0x6958,\n\t4366:  0x6959,\n\t4367:  0x695B,\n\t4368:  0x695C,\n\t4369:  0x695F,\n\t4370:  0x6961,\n\t4371:  0x6962,\n\t4372:  0x6964,\n\t4373:  0x6965,\n\t4374:  0x6967,\n\t4375:  0x6968,\n\t4376:  0x6969,\n\t4377:  0x696A,\n\t4378:  0x696C,\n\t4379:  0x696D,\n\t4380:  0x696F,\n\t4381:  0x6970,\n\t4382:  0x6972,\n\t4383:  0x6973,\n\t4384:  0x6974,\n\t4385:  0x6975,\n\t4386:  0x6976,\n\t4387:  0x697A,\n\t4388:  0x697B,\n\t4389:  0x697D,\n\t4390:  0x697E,\n\t4391:  0x697F,\n\t4392:  0x6981,\n\t4393:  0x6983,\n\t4394:  0x6985,\n\t4395:  0x698A,\n\t4396:  0x698B,\n\t4397:  0x698C,\n\t4398:  0x698E,\n\t4399:  0x698F,\n\t4400:  0x6990,\n\t4401:  0x6991,\n\t4402:  0x6992,\n\t4403:  0x6993,\n\t4404:  0x6996,\n\t4405:  0x6997,\n\t4406:  0x6999,\n\t4407:  0x699A,\n\t4408:  0x699D,\n\t4409:  0x699E,\n\t4410:  0x699F,\n\t4411:  0x69A0,\n\t4412:  0x69A1,\n\t4413:  0x69A2,\n\t4414:  0x69A3,\n\t4415:  0x69A4,\n\t4416:  0x69A5,\n\t4417:  0x69A6,\n\t4418:  0x69A9,\n\t4419:  0x69AA,\n\t4420:  0x69AC,\n\t4421:  0x69AE,\n\t4422:  0x69AF,\n\t4423:  0x69B0,\n\t4424:  0x69B2,\n\t4425:  0x69B3,\n\t4426:  0x69B5,\n\t4427:  0x69B6,\n\t4428:  0x69B8,\n\t4429:  0x69B9,\n\t4430:  0x69BA,\n\t4431:  0x69BC,\n\t4432:  0x69BD,\n\t4433:  0x69BE,\n\t4434:  0x69BF,\n\t4435:  0x69C0,\n\t4436:  0x69C2,\n\t4437:  0x69C3,\n\t4438:  0x69C4,\n\t4439:  0x69C5,\n\t4440:  0x69C6,\n\t4441:  0x69C7,\n\t4442:  0x69C8,\n\t4443:  0x69C9,\n\t4444:  0x69CB,\n\t4445:  0x69CD,\n\t4446:  0x69CF,\n\t4447:  0x69D1,\n\t4448:  0x69D2,\n\t4449:  0x69D3,\n\t4450:  0x69D5,\n\t4451:  0x69D6,\n\t4452:  0x69D7,\n\t4453:  0x69D8,\n\t4454:  0x69D9,\n\t4455:  0x69DA,\n\t4456:  0x69DC,\n\t4457:  0x69DD,\n\t4458:  0x69DE,\n\t4459:  0x69E1,\n\t4460:  0x69E2,\n\t4461:  0x69E3,\n\t4462:  0x69E4,\n\t4463:  0x69E5,\n\t4464:  0x69E6,\n\t4465:  0x69E7,\n\t4466:  0x69E8,\n\t4467:  0x69E9,\n\t4468:  0x69EA,\n\t4469:  0x69EB,\n\t4470:  0x69EC,\n\t4471:  0x69EE,\n\t4472:  0x69EF,\n\t4473:  0x69F0,\n\t4474:  0x69F1,\n\t4475:  0x69F3,\n\t4476:  0x69F4,\n\t4477:  0x69F5,\n\t4478:  0x69F6,\n\t4479:  0x69F7,\n\t4480:  0x69F8,\n\t4481:  0x69F9,\n\t4482:  0x69FA,\n\t4483:  0x69FB,\n\t4484:  0x69FC,\n\t4485:  0x69FE,\n\t4486:  0x6A00,\n\t4487:  0x6A01,\n\t4488:  0x6A02,\n\t4489:  0x6A03,\n\t4490:  0x6A04,\n\t4491:  0x6A05,\n\t4492:  0x6A06,\n\t4493:  0x6A07,\n\t4494:  0x6A08,\n\t4495:  0x6A09,\n\t4496:  0x6A0B,\n\t4497:  0x6A0C,\n\t4498:  0x6A0D,\n\t4499:  0x6A0E,\n\t4500:  0x6A0F,\n\t4501:  0x6A10,\n\t4502:  0x6A11,\n\t4503:  0x6A12,\n\t4504:  0x6A13,\n\t4505:  0x6A14,\n\t4506:  0x6A15,\n\t4507:  0x6A16,\n\t4508:  0x6A19,\n\t4509:  0x6A1A,\n\t4510:  0x6A1B,\n\t4511:  0x6A1C,\n\t4512:  0x6A1D,\n\t4513:  0x6A1E,\n\t4514:  0x6A20,\n\t4515:  0x6A22,\n\t4516:  0x6A23,\n\t4517:  0x6A24,\n\t4518:  0x6A25,\n\t4519:  0x6A26,\n\t4520:  0x6A27,\n\t4521:  0x6A29,\n\t4522:  0x6A2B,\n\t4523:  0x6A2C,\n\t4524:  0x6A2D,\n\t4525:  0x6A2E,\n\t4526:  0x6A30,\n\t4527:  0x6A32,\n\t4528:  0x6A33,\n\t4529:  0x6A34,\n\t4530:  0x6A36,\n\t4531:  0x6A37,\n\t4532:  0x6A38,\n\t4533:  0x6A39,\n\t4534:  0x6A3A,\n\t4535:  0x6A3B,\n\t4536:  0x6A3C,\n\t4537:  0x6A3F,\n\t4538:  0x6A40,\n\t4539:  0x6A41,\n\t4540:  0x6A42,\n\t4541:  0x6A43,\n\t4542:  0x6A45,\n\t4543:  0x6A46,\n\t4544:  0x6A48,\n\t4545:  0x6A49,\n\t4546:  0x6A4A,\n\t4547:  0x6A4B,\n\t4548:  0x6A4C,\n\t4549:  0x6A4D,\n\t4550:  0x6A4E,\n\t4551:  0x6A4F,\n\t4552:  0x6A51,\n\t4553:  0x6A52,\n\t4554:  0x6A53,\n\t4555:  0x6A54,\n\t4556:  0x6A55,\n\t4557:  0x6A56,\n\t4558:  0x6A57,\n\t4559:  0x6A5A,\n\t4560:  0x6A5C,\n\t4561:  0x6A5D,\n\t4562:  0x6A5E,\n\t4563:  0x6A5F,\n\t4564:  0x6A60,\n\t4565:  0x6A62,\n\t4566:  0x6A63,\n\t4567:  0x6A64,\n\t4568:  0x6A66,\n\t4569:  0x6A67,\n\t4570:  0x6A68,\n\t4571:  0x6A69,\n\t4572:  0x6A6A,\n\t4573:  0x6A6B,\n\t4574:  0x6A6C,\n\t4575:  0x6A6D,\n\t4576:  0x6A6E,\n\t4577:  0x6A6F,\n\t4578:  0x6A70,\n\t4579:  0x6A72,\n\t4580:  0x6A73,\n\t4581:  0x6A74,\n\t4582:  0x6A75,\n\t4583:  0x6A76,\n\t4584:  0x6A77,\n\t4585:  0x6A78,\n\t4586:  0x6A7A,\n\t4587:  0x6A7B,\n\t4588:  0x6A7D,\n\t4589:  0x6A7E,\n\t4590:  0x6A7F,\n\t4591:  0x6A81,\n\t4592:  0x6A82,\n\t4593:  0x6A83,\n\t4594:  0x6A85,\n\t4595:  0x6A86,\n\t4596:  0x6A87,\n\t4597:  0x6A88,\n\t4598:  0x6A89,\n\t4599:  0x6A8A,\n\t4600:  0x6A8B,\n\t4601:  0x6A8C,\n\t4602:  0x6A8D,\n\t4603:  0x6A8F,\n\t4604:  0x6A92,\n\t4605:  0x6A93,\n\t4606:  0x6A94,\n\t4607:  0x6A95,\n\t4608:  0x6A96,\n\t4609:  0x6A98,\n\t4610:  0x6A99,\n\t4611:  0x6A9A,\n\t4612:  0x6A9B,\n\t4613:  0x6A9C,\n\t4614:  0x6A9D,\n\t4615:  0x6A9E,\n\t4616:  0x6A9F,\n\t4617:  0x6AA1,\n\t4618:  0x6AA2,\n\t4619:  0x6AA3,\n\t4620:  0x6AA4,\n\t4621:  0x6AA5,\n\t4622:  0x6AA6,\n\t4623:  0x6AA7,\n\t4624:  0x6AA8,\n\t4625:  0x6AAA,\n\t4626:  0x6AAD,\n\t4627:  0x6AAE,\n\t4628:  0x6AAF,\n\t4629:  0x6AB0,\n\t4630:  0x6AB1,\n\t4631:  0x6AB2,\n\t4632:  0x6AB3,\n\t4633:  0x6AB4,\n\t4634:  0x6AB5,\n\t4635:  0x6AB6,\n\t4636:  0x6AB7,\n\t4637:  0x6AB8,\n\t4638:  0x6AB9,\n\t4639:  0x6ABA,\n\t4640:  0x6ABB,\n\t4641:  0x6ABC,\n\t4642:  0x6ABD,\n\t4643:  0x6ABE,\n\t4644:  0x6ABF,\n\t4645:  0x6AC0,\n\t4646:  0x6AC1,\n\t4647:  0x6AC2,\n\t4648:  0x6AC3,\n\t4649:  0x6AC4,\n\t4650:  0x6AC5,\n\t4651:  0x6AC6,\n\t4652:  0x6AC7,\n\t4653:  0x6AC8,\n\t4654:  0x6AC9,\n\t4655:  0x6ACA,\n\t4656:  0x6ACB,\n\t4657:  0x6ACC,\n\t4658:  0x6ACD,\n\t4659:  0x6ACE,\n\t4660:  0x6ACF,\n\t4661:  0x6AD0,\n\t4662:  0x6AD1,\n\t4663:  0x6AD2,\n\t4664:  0x6AD3,\n\t4665:  0x6AD4,\n\t4666:  0x6AD5,\n\t4667:  0x6AD6,\n\t4668:  0x6AD7,\n\t4669:  0x6AD8,\n\t4670:  0x6AD9,\n\t4671:  0x6ADA,\n\t4672:  0x6ADB,\n\t4673:  0x6ADC,\n\t4674:  0x6ADD,\n\t4675:  0x6ADE,\n\t4676:  0x6ADF,\n\t4677:  0x6AE0,\n\t4678:  0x6AE1,\n\t4679:  0x6AE2,\n\t4680:  0x6AE3,\n\t4681:  0x6AE4,\n\t4682:  0x6AE5,\n\t4683:  0x6AE6,\n\t4684:  0x6AE7,\n\t4685:  0x6AE8,\n\t4686:  0x6AE9,\n\t4687:  0x6AEA,\n\t4688:  0x6AEB,\n\t4689:  0x6AEC,\n\t4690:  0x6AED,\n\t4691:  0x6AEE,\n\t4692:  0x6AEF,\n\t4693:  0x6AF0,\n\t4694:  0x6AF1,\n\t4695:  0x6AF2,\n\t4696:  0x6AF3,\n\t4697:  0x6AF4,\n\t4698:  0x6AF5,\n\t4699:  0x6AF6,\n\t4700:  0x6AF7,\n\t4701:  0x6AF8,\n\t4702:  0x6AF9,\n\t4703:  0x6AFA,\n\t4704:  0x6AFB,\n\t4705:  0x6AFC,\n\t4706:  0x6AFD,\n\t4707:  0x6AFE,\n\t4708:  0x6AFF,\n\t4709:  0x6B00,\n\t4710:  0x6B01,\n\t4711:  0x6B02,\n\t4712:  0x6B03,\n\t4713:  0x6B04,\n\t4714:  0x6B05,\n\t4715:  0x6B06,\n\t4716:  0x6B07,\n\t4717:  0x6B08,\n\t4718:  0x6B09,\n\t4719:  0x6B0A,\n\t4720:  0x6B0B,\n\t4721:  0x6B0C,\n\t4722:  0x6B0D,\n\t4723:  0x6B0E,\n\t4724:  0x6B0F,\n\t4725:  0x6B10,\n\t4726:  0x6B11,\n\t4727:  0x6B12,\n\t4728:  0x6B13,\n\t4729:  0x6B14,\n\t4730:  0x6B15,\n\t4731:  0x6B16,\n\t4732:  0x6B17,\n\t4733:  0x6B18,\n\t4734:  0x6B19,\n\t4735:  0x6B1A,\n\t4736:  0x6B1B,\n\t4737:  0x6B1C,\n\t4738:  0x6B1D,\n\t4739:  0x6B1E,\n\t4740:  0x6B1F,\n\t4741:  0x6B25,\n\t4742:  0x6B26,\n\t4743:  0x6B28,\n\t4744:  0x6B29,\n\t4745:  0x6B2A,\n\t4746:  0x6B2B,\n\t4747:  0x6B2C,\n\t4748:  0x6B2D,\n\t4749:  0x6B2E,\n\t4750:  0x6B2F,\n\t4751:  0x6B30,\n\t4752:  0x6B31,\n\t4753:  0x6B33,\n\t4754:  0x6B34,\n\t4755:  0x6B35,\n\t4756:  0x6B36,\n\t4757:  0x6B38,\n\t4758:  0x6B3B,\n\t4759:  0x6B3C,\n\t4760:  0x6B3D,\n\t4761:  0x6B3F,\n\t4762:  0x6B40,\n\t4763:  0x6B41,\n\t4764:  0x6B42,\n\t4765:  0x6B44,\n\t4766:  0x6B45,\n\t4767:  0x6B48,\n\t4768:  0x6B4A,\n\t4769:  0x6B4B,\n\t4770:  0x6B4D,\n\t4771:  0x6B4E,\n\t4772:  0x6B4F,\n\t4773:  0x6B50,\n\t4774:  0x6B51,\n\t4775:  0x6B52,\n\t4776:  0x6B53,\n\t4777:  0x6B54,\n\t4778:  0x6B55,\n\t4779:  0x6B56,\n\t4780:  0x6B57,\n\t4781:  0x6B58,\n\t4782:  0x6B5A,\n\t4783:  0x6B5B,\n\t4784:  0x6B5C,\n\t4785:  0x6B5D,\n\t4786:  0x6B5E,\n\t4787:  0x6B5F,\n\t4788:  0x6B60,\n\t4789:  0x6B61,\n\t4790:  0x6B68,\n\t4791:  0x6B69,\n\t4792:  0x6B6B,\n\t4793:  0x6B6C,\n\t4794:  0x6B6D,\n\t4795:  0x6B6E,\n\t4796:  0x6B6F,\n\t4797:  0x6B70,\n\t4798:  0x6B71,\n\t4799:  0x6B72,\n\t4800:  0x6B73,\n\t4801:  0x6B74,\n\t4802:  0x6B75,\n\t4803:  0x6B76,\n\t4804:  0x6B77,\n\t4805:  0x6B78,\n\t4806:  0x6B7A,\n\t4807:  0x6B7D,\n\t4808:  0x6B7E,\n\t4809:  0x6B7F,\n\t4810:  0x6B80,\n\t4811:  0x6B85,\n\t4812:  0x6B88,\n\t4813:  0x6B8C,\n\t4814:  0x6B8E,\n\t4815:  0x6B8F,\n\t4816:  0x6B90,\n\t4817:  0x6B91,\n\t4818:  0x6B94,\n\t4819:  0x6B95,\n\t4820:  0x6B97,\n\t4821:  0x6B98,\n\t4822:  0x6B99,\n\t4823:  0x6B9C,\n\t4824:  0x6B9D,\n\t4825:  0x6B9E,\n\t4826:  0x6B9F,\n\t4827:  0x6BA0,\n\t4828:  0x6BA2,\n\t4829:  0x6BA3,\n\t4830:  0x6BA4,\n\t4831:  0x6BA5,\n\t4832:  0x6BA6,\n\t4833:  0x6BA7,\n\t4834:  0x6BA8,\n\t4835:  0x6BA9,\n\t4836:  0x6BAB,\n\t4837:  0x6BAC,\n\t4838:  0x6BAD,\n\t4839:  0x6BAE,\n\t4840:  0x6BAF,\n\t4841:  0x6BB0,\n\t4842:  0x6BB1,\n\t4843:  0x6BB2,\n\t4844:  0x6BB6,\n\t4845:  0x6BB8,\n\t4846:  0x6BB9,\n\t4847:  0x6BBA,\n\t4848:  0x6BBB,\n\t4849:  0x6BBC,\n\t4850:  0x6BBD,\n\t4851:  0x6BBE,\n\t4852:  0x6BC0,\n\t4853:  0x6BC3,\n\t4854:  0x6BC4,\n\t4855:  0x6BC6,\n\t4856:  0x6BC7,\n\t4857:  0x6BC8,\n\t4858:  0x6BC9,\n\t4859:  0x6BCA,\n\t4860:  0x6BCC,\n\t4861:  0x6BCE,\n\t4862:  0x6BD0,\n\t4863:  0x6BD1,\n\t4864:  0x6BD8,\n\t4865:  0x6BDA,\n\t4866:  0x6BDC,\n\t4867:  0x6BDD,\n\t4868:  0x6BDE,\n\t4869:  0x6BDF,\n\t4870:  0x6BE0,\n\t4871:  0x6BE2,\n\t4872:  0x6BE3,\n\t4873:  0x6BE4,\n\t4874:  0x6BE5,\n\t4875:  0x6BE6,\n\t4876:  0x6BE7,\n\t4877:  0x6BE8,\n\t4878:  0x6BE9,\n\t4879:  0x6BEC,\n\t4880:  0x6BED,\n\t4881:  0x6BEE,\n\t4882:  0x6BF0,\n\t4883:  0x6BF1,\n\t4884:  0x6BF2,\n\t4885:  0x6BF4,\n\t4886:  0x6BF6,\n\t4887:  0x6BF7,\n\t4888:  0x6BF8,\n\t4889:  0x6BFA,\n\t4890:  0x6BFB,\n\t4891:  0x6BFC,\n\t4892:  0x6BFE,\n\t4893:  0x6BFF,\n\t4894:  0x6C00,\n\t4895:  0x6C01,\n\t4896:  0x6C02,\n\t4897:  0x6C03,\n\t4898:  0x6C04,\n\t4899:  0x6C08,\n\t4900:  0x6C09,\n\t4901:  0x6C0A,\n\t4902:  0x6C0B,\n\t4903:  0x6C0C,\n\t4904:  0x6C0E,\n\t4905:  0x6C12,\n\t4906:  0x6C17,\n\t4907:  0x6C1C,\n\t4908:  0x6C1D,\n\t4909:  0x6C1E,\n\t4910:  0x6C20,\n\t4911:  0x6C23,\n\t4912:  0x6C25,\n\t4913:  0x6C2B,\n\t4914:  0x6C2C,\n\t4915:  0x6C2D,\n\t4916:  0x6C31,\n\t4917:  0x6C33,\n\t4918:  0x6C36,\n\t4919:  0x6C37,\n\t4920:  0x6C39,\n\t4921:  0x6C3A,\n\t4922:  0x6C3B,\n\t4923:  0x6C3C,\n\t4924:  0x6C3E,\n\t4925:  0x6C3F,\n\t4926:  0x6C43,\n\t4927:  0x6C44,\n\t4928:  0x6C45,\n\t4929:  0x6C48,\n\t4930:  0x6C4B,\n\t4931:  0x6C4C,\n\t4932:  0x6C4D,\n\t4933:  0x6C4E,\n\t4934:  0x6C4F,\n\t4935:  0x6C51,\n\t4936:  0x6C52,\n\t4937:  0x6C53,\n\t4938:  0x6C56,\n\t4939:  0x6C58,\n\t4940:  0x6C59,\n\t4941:  0x6C5A,\n\t4942:  0x6C62,\n\t4943:  0x6C63,\n\t4944:  0x6C65,\n\t4945:  0x6C66,\n\t4946:  0x6C67,\n\t4947:  0x6C6B,\n\t4948:  0x6C6C,\n\t4949:  0x6C6D,\n\t4950:  0x6C6E,\n\t4951:  0x6C6F,\n\t4952:  0x6C71,\n\t4953:  0x6C73,\n\t4954:  0x6C75,\n\t4955:  0x6C77,\n\t4956:  0x6C78,\n\t4957:  0x6C7A,\n\t4958:  0x6C7B,\n\t4959:  0x6C7C,\n\t4960:  0x6C7F,\n\t4961:  0x6C80,\n\t4962:  0x6C84,\n\t4963:  0x6C87,\n\t4964:  0x6C8A,\n\t4965:  0x6C8B,\n\t4966:  0x6C8D,\n\t4967:  0x6C8E,\n\t4968:  0x6C91,\n\t4969:  0x6C92,\n\t4970:  0x6C95,\n\t4971:  0x6C96,\n\t4972:  0x6C97,\n\t4973:  0x6C98,\n\t4974:  0x6C9A,\n\t4975:  0x6C9C,\n\t4976:  0x6C9D,\n\t4977:  0x6C9E,\n\t4978:  0x6CA0,\n\t4979:  0x6CA2,\n\t4980:  0x6CA8,\n\t4981:  0x6CAC,\n\t4982:  0x6CAF,\n\t4983:  0x6CB0,\n\t4984:  0x6CB4,\n\t4985:  0x6CB5,\n\t4986:  0x6CB6,\n\t4987:  0x6CB7,\n\t4988:  0x6CBA,\n\t4989:  0x6CC0,\n\t4990:  0x6CC1,\n\t4991:  0x6CC2,\n\t4992:  0x6CC3,\n\t4993:  0x6CC6,\n\t4994:  0x6CC7,\n\t4995:  0x6CC8,\n\t4996:  0x6CCB,\n\t4997:  0x6CCD,\n\t4998:  0x6CCE,\n\t4999:  0x6CCF,\n\t5000:  0x6CD1,\n\t5001:  0x6CD2,\n\t5002:  0x6CD8,\n\t5003:  0x6CD9,\n\t5004:  0x6CDA,\n\t5005:  0x6CDC,\n\t5006:  0x6CDD,\n\t5007:  0x6CDF,\n\t5008:  0x6CE4,\n\t5009:  0x6CE6,\n\t5010:  0x6CE7,\n\t5011:  0x6CE9,\n\t5012:  0x6CEC,\n\t5013:  0x6CED,\n\t5014:  0x6CF2,\n\t5015:  0x6CF4,\n\t5016:  0x6CF9,\n\t5017:  0x6CFF,\n\t5018:  0x6D00,\n\t5019:  0x6D02,\n\t5020:  0x6D03,\n\t5021:  0x6D05,\n\t5022:  0x6D06,\n\t5023:  0x6D08,\n\t5024:  0x6D09,\n\t5025:  0x6D0A,\n\t5026:  0x6D0D,\n\t5027:  0x6D0F,\n\t5028:  0x6D10,\n\t5029:  0x6D11,\n\t5030:  0x6D13,\n\t5031:  0x6D14,\n\t5032:  0x6D15,\n\t5033:  0x6D16,\n\t5034:  0x6D18,\n\t5035:  0x6D1C,\n\t5036:  0x6D1D,\n\t5037:  0x6D1F,\n\t5038:  0x6D20,\n\t5039:  0x6D21,\n\t5040:  0x6D22,\n\t5041:  0x6D23,\n\t5042:  0x6D24,\n\t5043:  0x6D26,\n\t5044:  0x6D28,\n\t5045:  0x6D29,\n\t5046:  0x6D2C,\n\t5047:  0x6D2D,\n\t5048:  0x6D2F,\n\t5049:  0x6D30,\n\t5050:  0x6D34,\n\t5051:  0x6D36,\n\t5052:  0x6D37,\n\t5053:  0x6D38,\n\t5054:  0x6D3A,\n\t5055:  0x6D3F,\n\t5056:  0x6D40,\n\t5057:  0x6D42,\n\t5058:  0x6D44,\n\t5059:  0x6D49,\n\t5060:  0x6D4C,\n\t5061:  0x6D50,\n\t5062:  0x6D55,\n\t5063:  0x6D56,\n\t5064:  0x6D57,\n\t5065:  0x6D58,\n\t5066:  0x6D5B,\n\t5067:  0x6D5D,\n\t5068:  0x6D5F,\n\t5069:  0x6D61,\n\t5070:  0x6D62,\n\t5071:  0x6D64,\n\t5072:  0x6D65,\n\t5073:  0x6D67,\n\t5074:  0x6D68,\n\t5075:  0x6D6B,\n\t5076:  0x6D6C,\n\t5077:  0x6D6D,\n\t5078:  0x6D70,\n\t5079:  0x6D71,\n\t5080:  0x6D72,\n\t5081:  0x6D73,\n\t5082:  0x6D75,\n\t5083:  0x6D76,\n\t5084:  0x6D79,\n\t5085:  0x6D7A,\n\t5086:  0x6D7B,\n\t5087:  0x6D7D,\n\t5088:  0x6D7E,\n\t5089:  0x6D7F,\n\t5090:  0x6D80,\n\t5091:  0x6D81,\n\t5092:  0x6D83,\n\t5093:  0x6D84,\n\t5094:  0x6D86,\n\t5095:  0x6D87,\n\t5096:  0x6D8A,\n\t5097:  0x6D8B,\n\t5098:  0x6D8D,\n\t5099:  0x6D8F,\n\t5100:  0x6D90,\n\t5101:  0x6D92,\n\t5102:  0x6D96,\n\t5103:  0x6D97,\n\t5104:  0x6D98,\n\t5105:  0x6D99,\n\t5106:  0x6D9A,\n\t5107:  0x6D9C,\n\t5108:  0x6DA2,\n\t5109:  0x6DA5,\n\t5110:  0x6DAC,\n\t5111:  0x6DAD,\n\t5112:  0x6DB0,\n\t5113:  0x6DB1,\n\t5114:  0x6DB3,\n\t5115:  0x6DB4,\n\t5116:  0x6DB6,\n\t5117:  0x6DB7,\n\t5118:  0x6DB9,\n\t5119:  0x6DBA,\n\t5120:  0x6DBB,\n\t5121:  0x6DBC,\n\t5122:  0x6DBD,\n\t5123:  0x6DBE,\n\t5124:  0x6DC1,\n\t5125:  0x6DC2,\n\t5126:  0x6DC3,\n\t5127:  0x6DC8,\n\t5128:  0x6DC9,\n\t5129:  0x6DCA,\n\t5130:  0x6DCD,\n\t5131:  0x6DCE,\n\t5132:  0x6DCF,\n\t5133:  0x6DD0,\n\t5134:  0x6DD2,\n\t5135:  0x6DD3,\n\t5136:  0x6DD4,\n\t5137:  0x6DD5,\n\t5138:  0x6DD7,\n\t5139:  0x6DDA,\n\t5140:  0x6DDB,\n\t5141:  0x6DDC,\n\t5142:  0x6DDF,\n\t5143:  0x6DE2,\n\t5144:  0x6DE3,\n\t5145:  0x6DE5,\n\t5146:  0x6DE7,\n\t5147:  0x6DE8,\n\t5148:  0x6DE9,\n\t5149:  0x6DEA,\n\t5150:  0x6DED,\n\t5151:  0x6DEF,\n\t5152:  0x6DF0,\n\t5153:  0x6DF2,\n\t5154:  0x6DF4,\n\t5155:  0x6DF5,\n\t5156:  0x6DF6,\n\t5157:  0x6DF8,\n\t5158:  0x6DFA,\n\t5159:  0x6DFD,\n\t5160:  0x6DFE,\n\t5161:  0x6DFF,\n\t5162:  0x6E00,\n\t5163:  0x6E01,\n\t5164:  0x6E02,\n\t5165:  0x6E03,\n\t5166:  0x6E04,\n\t5167:  0x6E06,\n\t5168:  0x6E07,\n\t5169:  0x6E08,\n\t5170:  0x6E09,\n\t5171:  0x6E0B,\n\t5172:  0x6E0F,\n\t5173:  0x6E12,\n\t5174:  0x6E13,\n\t5175:  0x6E15,\n\t5176:  0x6E18,\n\t5177:  0x6E19,\n\t5178:  0x6E1B,\n\t5179:  0x6E1C,\n\t5180:  0x6E1E,\n\t5181:  0x6E1F,\n\t5182:  0x6E22,\n\t5183:  0x6E26,\n\t5184:  0x6E27,\n\t5185:  0x6E28,\n\t5186:  0x6E2A,\n\t5187:  0x6E2C,\n\t5188:  0x6E2E,\n\t5189:  0x6E30,\n\t5190:  0x6E31,\n\t5191:  0x6E33,\n\t5192:  0x6E35,\n\t5193:  0x6E36,\n\t5194:  0x6E37,\n\t5195:  0x6E39,\n\t5196:  0x6E3B,\n\t5197:  0x6E3C,\n\t5198:  0x6E3D,\n\t5199:  0x6E3E,\n\t5200:  0x6E3F,\n\t5201:  0x6E40,\n\t5202:  0x6E41,\n\t5203:  0x6E42,\n\t5204:  0x6E45,\n\t5205:  0x6E46,\n\t5206:  0x6E47,\n\t5207:  0x6E48,\n\t5208:  0x6E49,\n\t5209:  0x6E4A,\n\t5210:  0x6E4B,\n\t5211:  0x6E4C,\n\t5212:  0x6E4F,\n\t5213:  0x6E50,\n\t5214:  0x6E51,\n\t5215:  0x6E52,\n\t5216:  0x6E55,\n\t5217:  0x6E57,\n\t5218:  0x6E59,\n\t5219:  0x6E5A,\n\t5220:  0x6E5C,\n\t5221:  0x6E5D,\n\t5222:  0x6E5E,\n\t5223:  0x6E60,\n\t5224:  0x6E61,\n\t5225:  0x6E62,\n\t5226:  0x6E63,\n\t5227:  0x6E64,\n\t5228:  0x6E65,\n\t5229:  0x6E66,\n\t5230:  0x6E67,\n\t5231:  0x6E68,\n\t5232:  0x6E69,\n\t5233:  0x6E6A,\n\t5234:  0x6E6C,\n\t5235:  0x6E6D,\n\t5236:  0x6E6F,\n\t5237:  0x6E70,\n\t5238:  0x6E71,\n\t5239:  0x6E72,\n\t5240:  0x6E73,\n\t5241:  0x6E74,\n\t5242:  0x6E75,\n\t5243:  0x6E76,\n\t5244:  0x6E77,\n\t5245:  0x6E78,\n\t5246:  0x6E79,\n\t5247:  0x6E7A,\n\t5248:  0x6E7B,\n\t5249:  0x6E7C,\n\t5250:  0x6E7D,\n\t5251:  0x6E80,\n\t5252:  0x6E81,\n\t5253:  0x6E82,\n\t5254:  0x6E84,\n\t5255:  0x6E87,\n\t5256:  0x6E88,\n\t5257:  0x6E8A,\n\t5258:  0x6E8B,\n\t5259:  0x6E8C,\n\t5260:  0x6E8D,\n\t5261:  0x6E8E,\n\t5262:  0x6E91,\n\t5263:  0x6E92,\n\t5264:  0x6E93,\n\t5265:  0x6E94,\n\t5266:  0x6E95,\n\t5267:  0x6E96,\n\t5268:  0x6E97,\n\t5269:  0x6E99,\n\t5270:  0x6E9A,\n\t5271:  0x6E9B,\n\t5272:  0x6E9D,\n\t5273:  0x6E9E,\n\t5274:  0x6EA0,\n\t5275:  0x6EA1,\n\t5276:  0x6EA3,\n\t5277:  0x6EA4,\n\t5278:  0x6EA6,\n\t5279:  0x6EA8,\n\t5280:  0x6EA9,\n\t5281:  0x6EAB,\n\t5282:  0x6EAC,\n\t5283:  0x6EAD,\n\t5284:  0x6EAE,\n\t5285:  0x6EB0,\n\t5286:  0x6EB3,\n\t5287:  0x6EB5,\n\t5288:  0x6EB8,\n\t5289:  0x6EB9,\n\t5290:  0x6EBC,\n\t5291:  0x6EBE,\n\t5292:  0x6EBF,\n\t5293:  0x6EC0,\n\t5294:  0x6EC3,\n\t5295:  0x6EC4,\n\t5296:  0x6EC5,\n\t5297:  0x6EC6,\n\t5298:  0x6EC8,\n\t5299:  0x6EC9,\n\t5300:  0x6ECA,\n\t5301:  0x6ECC,\n\t5302:  0x6ECD,\n\t5303:  0x6ECE,\n\t5304:  0x6ED0,\n\t5305:  0x6ED2,\n\t5306:  0x6ED6,\n\t5307:  0x6ED8,\n\t5308:  0x6ED9,\n\t5309:  0x6EDB,\n\t5310:  0x6EDC,\n\t5311:  0x6EDD,\n\t5312:  0x6EE3,\n\t5313:  0x6EE7,\n\t5314:  0x6EEA,\n\t5315:  0x6EEB,\n\t5316:  0x6EEC,\n\t5317:  0x6EED,\n\t5318:  0x6EEE,\n\t5319:  0x6EEF,\n\t5320:  0x6EF0,\n\t5321:  0x6EF1,\n\t5322:  0x6EF2,\n\t5323:  0x6EF3,\n\t5324:  0x6EF5,\n\t5325:  0x6EF6,\n\t5326:  0x6EF7,\n\t5327:  0x6EF8,\n\t5328:  0x6EFA,\n\t5329:  0x6EFB,\n\t5330:  0x6EFC,\n\t5331:  0x6EFD,\n\t5332:  0x6EFE,\n\t5333:  0x6EFF,\n\t5334:  0x6F00,\n\t5335:  0x6F01,\n\t5336:  0x6F03,\n\t5337:  0x6F04,\n\t5338:  0x6F05,\n\t5339:  0x6F07,\n\t5340:  0x6F08,\n\t5341:  0x6F0A,\n\t5342:  0x6F0B,\n\t5343:  0x6F0C,\n\t5344:  0x6F0D,\n\t5345:  0x6F0E,\n\t5346:  0x6F10,\n\t5347:  0x6F11,\n\t5348:  0x6F12,\n\t5349:  0x6F16,\n\t5350:  0x6F17,\n\t5351:  0x6F18,\n\t5352:  0x6F19,\n\t5353:  0x6F1A,\n\t5354:  0x6F1B,\n\t5355:  0x6F1C,\n\t5356:  0x6F1D,\n\t5357:  0x6F1E,\n\t5358:  0x6F1F,\n\t5359:  0x6F21,\n\t5360:  0x6F22,\n\t5361:  0x6F23,\n\t5362:  0x6F25,\n\t5363:  0x6F26,\n\t5364:  0x6F27,\n\t5365:  0x6F28,\n\t5366:  0x6F2C,\n\t5367:  0x6F2E,\n\t5368:  0x6F30,\n\t5369:  0x6F32,\n\t5370:  0x6F34,\n\t5371:  0x6F35,\n\t5372:  0x6F37,\n\t5373:  0x6F38,\n\t5374:  0x6F39,\n\t5375:  0x6F3A,\n\t5376:  0x6F3B,\n\t5377:  0x6F3C,\n\t5378:  0x6F3D,\n\t5379:  0x6F3F,\n\t5380:  0x6F40,\n\t5381:  0x6F41,\n\t5382:  0x6F42,\n\t5383:  0x6F43,\n\t5384:  0x6F44,\n\t5385:  0x6F45,\n\t5386:  0x6F48,\n\t5387:  0x6F49,\n\t5388:  0x6F4A,\n\t5389:  0x6F4C,\n\t5390:  0x6F4E,\n\t5391:  0x6F4F,\n\t5392:  0x6F50,\n\t5393:  0x6F51,\n\t5394:  0x6F52,\n\t5395:  0x6F53,\n\t5396:  0x6F54,\n\t5397:  0x6F55,\n\t5398:  0x6F56,\n\t5399:  0x6F57,\n\t5400:  0x6F59,\n\t5401:  0x6F5A,\n\t5402:  0x6F5B,\n\t5403:  0x6F5D,\n\t5404:  0x6F5F,\n\t5405:  0x6F60,\n\t5406:  0x6F61,\n\t5407:  0x6F63,\n\t5408:  0x6F64,\n\t5409:  0x6F65,\n\t5410:  0x6F67,\n\t5411:  0x6F68,\n\t5412:  0x6F69,\n\t5413:  0x6F6A,\n\t5414:  0x6F6B,\n\t5415:  0x6F6C,\n\t5416:  0x6F6F,\n\t5417:  0x6F70,\n\t5418:  0x6F71,\n\t5419:  0x6F73,\n\t5420:  0x6F75,\n\t5421:  0x6F76,\n\t5422:  0x6F77,\n\t5423:  0x6F79,\n\t5424:  0x6F7B,\n\t5425:  0x6F7D,\n\t5426:  0x6F7E,\n\t5427:  0x6F7F,\n\t5428:  0x6F80,\n\t5429:  0x6F81,\n\t5430:  0x6F82,\n\t5431:  0x6F83,\n\t5432:  0x6F85,\n\t5433:  0x6F86,\n\t5434:  0x6F87,\n\t5435:  0x6F8A,\n\t5436:  0x6F8B,\n\t5437:  0x6F8F,\n\t5438:  0x6F90,\n\t5439:  0x6F91,\n\t5440:  0x6F92,\n\t5441:  0x6F93,\n\t5442:  0x6F94,\n\t5443:  0x6F95,\n\t5444:  0x6F96,\n\t5445:  0x6F97,\n\t5446:  0x6F98,\n\t5447:  0x6F99,\n\t5448:  0x6F9A,\n\t5449:  0x6F9B,\n\t5450:  0x6F9D,\n\t5451:  0x6F9E,\n\t5452:  0x6F9F,\n\t5453:  0x6FA0,\n\t5454:  0x6FA2,\n\t5455:  0x6FA3,\n\t5456:  0x6FA4,\n\t5457:  0x6FA5,\n\t5458:  0x6FA6,\n\t5459:  0x6FA8,\n\t5460:  0x6FA9,\n\t5461:  0x6FAA,\n\t5462:  0x6FAB,\n\t5463:  0x6FAC,\n\t5464:  0x6FAD,\n\t5465:  0x6FAE,\n\t5466:  0x6FAF,\n\t5467:  0x6FB0,\n\t5468:  0x6FB1,\n\t5469:  0x6FB2,\n\t5470:  0x6FB4,\n\t5471:  0x6FB5,\n\t5472:  0x6FB7,\n\t5473:  0x6FB8,\n\t5474:  0x6FBA,\n\t5475:  0x6FBB,\n\t5476:  0x6FBC,\n\t5477:  0x6FBD,\n\t5478:  0x6FBE,\n\t5479:  0x6FBF,\n\t5480:  0x6FC1,\n\t5481:  0x6FC3,\n\t5482:  0x6FC4,\n\t5483:  0x6FC5,\n\t5484:  0x6FC6,\n\t5485:  0x6FC7,\n\t5486:  0x6FC8,\n\t5487:  0x6FCA,\n\t5488:  0x6FCB,\n\t5489:  0x6FCC,\n\t5490:  0x6FCD,\n\t5491:  0x6FCE,\n\t5492:  0x6FCF,\n\t5493:  0x6FD0,\n\t5494:  0x6FD3,\n\t5495:  0x6FD4,\n\t5496:  0x6FD5,\n\t5497:  0x6FD6,\n\t5498:  0x6FD7,\n\t5499:  0x6FD8,\n\t5500:  0x6FD9,\n\t5501:  0x6FDA,\n\t5502:  0x6FDB,\n\t5503:  0x6FDC,\n\t5504:  0x6FDD,\n\t5505:  0x6FDF,\n\t5506:  0x6FE2,\n\t5507:  0x6FE3,\n\t5508:  0x6FE4,\n\t5509:  0x6FE5,\n\t5510:  0x6FE6,\n\t5511:  0x6FE7,\n\t5512:  0x6FE8,\n\t5513:  0x6FE9,\n\t5514:  0x6FEA,\n\t5515:  0x6FEB,\n\t5516:  0x6FEC,\n\t5517:  0x6FED,\n\t5518:  0x6FF0,\n\t5519:  0x6FF1,\n\t5520:  0x6FF2,\n\t5521:  0x6FF3,\n\t5522:  0x6FF4,\n\t5523:  0x6FF5,\n\t5524:  0x6FF6,\n\t5525:  0x6FF7,\n\t5526:  0x6FF8,\n\t5527:  0x6FF9,\n\t5528:  0x6FFA,\n\t5529:  0x6FFB,\n\t5530:  0x6FFC,\n\t5531:  0x6FFD,\n\t5532:  0x6FFE,\n\t5533:  0x6FFF,\n\t5534:  0x7000,\n\t5535:  0x7001,\n\t5536:  0x7002,\n\t5537:  0x7003,\n\t5538:  0x7004,\n\t5539:  0x7005,\n\t5540:  0x7006,\n\t5541:  0x7007,\n\t5542:  0x7008,\n\t5543:  0x7009,\n\t5544:  0x700A,\n\t5545:  0x700B,\n\t5546:  0x700C,\n\t5547:  0x700D,\n\t5548:  0x700E,\n\t5549:  0x700F,\n\t5550:  0x7010,\n\t5551:  0x7012,\n\t5552:  0x7013,\n\t5553:  0x7014,\n\t5554:  0x7015,\n\t5555:  0x7016,\n\t5556:  0x7017,\n\t5557:  0x7018,\n\t5558:  0x7019,\n\t5559:  0x701C,\n\t5560:  0x701D,\n\t5561:  0x701E,\n\t5562:  0x701F,\n\t5563:  0x7020,\n\t5564:  0x7021,\n\t5565:  0x7022,\n\t5566:  0x7024,\n\t5567:  0x7025,\n\t5568:  0x7026,\n\t5569:  0x7027,\n\t5570:  0x7028,\n\t5571:  0x7029,\n\t5572:  0x702A,\n\t5573:  0x702B,\n\t5574:  0x702C,\n\t5575:  0x702D,\n\t5576:  0x702E,\n\t5577:  0x702F,\n\t5578:  0x7030,\n\t5579:  0x7031,\n\t5580:  0x7032,\n\t5581:  0x7033,\n\t5582:  0x7034,\n\t5583:  0x7036,\n\t5584:  0x7037,\n\t5585:  0x7038,\n\t5586:  0x703A,\n\t5587:  0x703B,\n\t5588:  0x703C,\n\t5589:  0x703D,\n\t5590:  0x703E,\n\t5591:  0x703F,\n\t5592:  0x7040,\n\t5593:  0x7041,\n\t5594:  0x7042,\n\t5595:  0x7043,\n\t5596:  0x7044,\n\t5597:  0x7045,\n\t5598:  0x7046,\n\t5599:  0x7047,\n\t5600:  0x7048,\n\t5601:  0x7049,\n\t5602:  0x704A,\n\t5603:  0x704B,\n\t5604:  0x704D,\n\t5605:  0x704E,\n\t5606:  0x7050,\n\t5607:  0x7051,\n\t5608:  0x7052,\n\t5609:  0x7053,\n\t5610:  0x7054,\n\t5611:  0x7055,\n\t5612:  0x7056,\n\t5613:  0x7057,\n\t5614:  0x7058,\n\t5615:  0x7059,\n\t5616:  0x705A,\n\t5617:  0x705B,\n\t5618:  0x705C,\n\t5619:  0x705D,\n\t5620:  0x705F,\n\t5621:  0x7060,\n\t5622:  0x7061,\n\t5623:  0x7062,\n\t5624:  0x7063,\n\t5625:  0x7064,\n\t5626:  0x7065,\n\t5627:  0x7066,\n\t5628:  0x7067,\n\t5629:  0x7068,\n\t5630:  0x7069,\n\t5631:  0x706A,\n\t5632:  0x706E,\n\t5633:  0x7071,\n\t5634:  0x7072,\n\t5635:  0x7073,\n\t5636:  0x7074,\n\t5637:  0x7077,\n\t5638:  0x7079,\n\t5639:  0x707A,\n\t5640:  0x707B,\n\t5641:  0x707D,\n\t5642:  0x7081,\n\t5643:  0x7082,\n\t5644:  0x7083,\n\t5645:  0x7084,\n\t5646:  0x7086,\n\t5647:  0x7087,\n\t5648:  0x7088,\n\t5649:  0x708B,\n\t5650:  0x708C,\n\t5651:  0x708D,\n\t5652:  0x708F,\n\t5653:  0x7090,\n\t5654:  0x7091,\n\t5655:  0x7093,\n\t5656:  0x7097,\n\t5657:  0x7098,\n\t5658:  0x709A,\n\t5659:  0x709B,\n\t5660:  0x709E,\n\t5661:  0x709F,\n\t5662:  0x70A0,\n\t5663:  0x70A1,\n\t5664:  0x70A2,\n\t5665:  0x70A3,\n\t5666:  0x70A4,\n\t5667:  0x70A5,\n\t5668:  0x70A6,\n\t5669:  0x70A7,\n\t5670:  0x70A8,\n\t5671:  0x70A9,\n\t5672:  0x70AA,\n\t5673:  0x70B0,\n\t5674:  0x70B2,\n\t5675:  0x70B4,\n\t5676:  0x70B5,\n\t5677:  0x70B6,\n\t5678:  0x70BA,\n\t5679:  0x70BE,\n\t5680:  0x70BF,\n\t5681:  0x70C4,\n\t5682:  0x70C5,\n\t5683:  0x70C6,\n\t5684:  0x70C7,\n\t5685:  0x70C9,\n\t5686:  0x70CB,\n\t5687:  0x70CC,\n\t5688:  0x70CD,\n\t5689:  0x70CE,\n\t5690:  0x70CF,\n\t5691:  0x70D0,\n\t5692:  0x70D1,\n\t5693:  0x70D2,\n\t5694:  0x70D3,\n\t5695:  0x70D4,\n\t5696:  0x70D5,\n\t5697:  0x70D6,\n\t5698:  0x70D7,\n\t5699:  0x70DA,\n\t5700:  0x70DC,\n\t5701:  0x70DD,\n\t5702:  0x70DE,\n\t5703:  0x70E0,\n\t5704:  0x70E1,\n\t5705:  0x70E2,\n\t5706:  0x70E3,\n\t5707:  0x70E5,\n\t5708:  0x70EA,\n\t5709:  0x70EE,\n\t5710:  0x70F0,\n\t5711:  0x70F1,\n\t5712:  0x70F2,\n\t5713:  0x70F3,\n\t5714:  0x70F4,\n\t5715:  0x70F5,\n\t5716:  0x70F6,\n\t5717:  0x70F8,\n\t5718:  0x70FA,\n\t5719:  0x70FB,\n\t5720:  0x70FC,\n\t5721:  0x70FE,\n\t5722:  0x70FF,\n\t5723:  0x7100,\n\t5724:  0x7101,\n\t5725:  0x7102,\n\t5726:  0x7103,\n\t5727:  0x7104,\n\t5728:  0x7105,\n\t5729:  0x7106,\n\t5730:  0x7107,\n\t5731:  0x7108,\n\t5732:  0x710B,\n\t5733:  0x710C,\n\t5734:  0x710D,\n\t5735:  0x710E,\n\t5736:  0x710F,\n\t5737:  0x7111,\n\t5738:  0x7112,\n\t5739:  0x7114,\n\t5740:  0x7117,\n\t5741:  0x711B,\n\t5742:  0x711C,\n\t5743:  0x711D,\n\t5744:  0x711E,\n\t5745:  0x711F,\n\t5746:  0x7120,\n\t5747:  0x7121,\n\t5748:  0x7122,\n\t5749:  0x7123,\n\t5750:  0x7124,\n\t5751:  0x7125,\n\t5752:  0x7127,\n\t5753:  0x7128,\n\t5754:  0x7129,\n\t5755:  0x712A,\n\t5756:  0x712B,\n\t5757:  0x712C,\n\t5758:  0x712D,\n\t5759:  0x712E,\n\t5760:  0x7132,\n\t5761:  0x7133,\n\t5762:  0x7134,\n\t5763:  0x7135,\n\t5764:  0x7137,\n\t5765:  0x7138,\n\t5766:  0x7139,\n\t5767:  0x713A,\n\t5768:  0x713B,\n\t5769:  0x713C,\n\t5770:  0x713D,\n\t5771:  0x713E,\n\t5772:  0x713F,\n\t5773:  0x7140,\n\t5774:  0x7141,\n\t5775:  0x7142,\n\t5776:  0x7143,\n\t5777:  0x7144,\n\t5778:  0x7146,\n\t5779:  0x7147,\n\t5780:  0x7148,\n\t5781:  0x7149,\n\t5782:  0x714B,\n\t5783:  0x714D,\n\t5784:  0x714F,\n\t5785:  0x7150,\n\t5786:  0x7151,\n\t5787:  0x7152,\n\t5788:  0x7153,\n\t5789:  0x7154,\n\t5790:  0x7155,\n\t5791:  0x7156,\n\t5792:  0x7157,\n\t5793:  0x7158,\n\t5794:  0x7159,\n\t5795:  0x715A,\n\t5796:  0x715B,\n\t5797:  0x715D,\n\t5798:  0x715F,\n\t5799:  0x7160,\n\t5800:  0x7161,\n\t5801:  0x7162,\n\t5802:  0x7163,\n\t5803:  0x7165,\n\t5804:  0x7169,\n\t5805:  0x716A,\n\t5806:  0x716B,\n\t5807:  0x716C,\n\t5808:  0x716D,\n\t5809:  0x716F,\n\t5810:  0x7170,\n\t5811:  0x7171,\n\t5812:  0x7174,\n\t5813:  0x7175,\n\t5814:  0x7176,\n\t5815:  0x7177,\n\t5816:  0x7179,\n\t5817:  0x717B,\n\t5818:  0x717C,\n\t5819:  0x717E,\n\t5820:  0x717F,\n\t5821:  0x7180,\n\t5822:  0x7181,\n\t5823:  0x7182,\n\t5824:  0x7183,\n\t5825:  0x7185,\n\t5826:  0x7186,\n\t5827:  0x7187,\n\t5828:  0x7188,\n\t5829:  0x7189,\n\t5830:  0x718B,\n\t5831:  0x718C,\n\t5832:  0x718D,\n\t5833:  0x718E,\n\t5834:  0x7190,\n\t5835:  0x7191,\n\t5836:  0x7192,\n\t5837:  0x7193,\n\t5838:  0x7195,\n\t5839:  0x7196,\n\t5840:  0x7197,\n\t5841:  0x719A,\n\t5842:  0x719B,\n\t5843:  0x719C,\n\t5844:  0x719D,\n\t5845:  0x719E,\n\t5846:  0x71A1,\n\t5847:  0x71A2,\n\t5848:  0x71A3,\n\t5849:  0x71A4,\n\t5850:  0x71A5,\n\t5851:  0x71A6,\n\t5852:  0x71A7,\n\t5853:  0x71A9,\n\t5854:  0x71AA,\n\t5855:  0x71AB,\n\t5856:  0x71AD,\n\t5857:  0x71AE,\n\t5858:  0x71AF,\n\t5859:  0x71B0,\n\t5860:  0x71B1,\n\t5861:  0x71B2,\n\t5862:  0x71B4,\n\t5863:  0x71B6,\n\t5864:  0x71B7,\n\t5865:  0x71B8,\n\t5866:  0x71BA,\n\t5867:  0x71BB,\n\t5868:  0x71BC,\n\t5869:  0x71BD,\n\t5870:  0x71BE,\n\t5871:  0x71BF,\n\t5872:  0x71C0,\n\t5873:  0x71C1,\n\t5874:  0x71C2,\n\t5875:  0x71C4,\n\t5876:  0x71C5,\n\t5877:  0x71C6,\n\t5878:  0x71C7,\n\t5879:  0x71C8,\n\t5880:  0x71C9,\n\t5881:  0x71CA,\n\t5882:  0x71CB,\n\t5883:  0x71CC,\n\t5884:  0x71CD,\n\t5885:  0x71CF,\n\t5886:  0x71D0,\n\t5887:  0x71D1,\n\t5888:  0x71D2,\n\t5889:  0x71D3,\n\t5890:  0x71D6,\n\t5891:  0x71D7,\n\t5892:  0x71D8,\n\t5893:  0x71D9,\n\t5894:  0x71DA,\n\t5895:  0x71DB,\n\t5896:  0x71DC,\n\t5897:  0x71DD,\n\t5898:  0x71DE,\n\t5899:  0x71DF,\n\t5900:  0x71E1,\n\t5901:  0x71E2,\n\t5902:  0x71E3,\n\t5903:  0x71E4,\n\t5904:  0x71E6,\n\t5905:  0x71E8,\n\t5906:  0x71E9,\n\t5907:  0x71EA,\n\t5908:  0x71EB,\n\t5909:  0x71EC,\n\t5910:  0x71ED,\n\t5911:  0x71EF,\n\t5912:  0x71F0,\n\t5913:  0x71F1,\n\t5914:  0x71F2,\n\t5915:  0x71F3,\n\t5916:  0x71F4,\n\t5917:  0x71F5,\n\t5918:  0x71F6,\n\t5919:  0x71F7,\n\t5920:  0x71F8,\n\t5921:  0x71FA,\n\t5922:  0x71FB,\n\t5923:  0x71FC,\n\t5924:  0x71FD,\n\t5925:  0x71FE,\n\t5926:  0x71FF,\n\t5927:  0x7200,\n\t5928:  0x7201,\n\t5929:  0x7202,\n\t5930:  0x7203,\n\t5931:  0x7204,\n\t5932:  0x7205,\n\t5933:  0x7207,\n\t5934:  0x7208,\n\t5935:  0x7209,\n\t5936:  0x720A,\n\t5937:  0x720B,\n\t5938:  0x720C,\n\t5939:  0x720D,\n\t5940:  0x720E,\n\t5941:  0x720F,\n\t5942:  0x7210,\n\t5943:  0x7211,\n\t5944:  0x7212,\n\t5945:  0x7213,\n\t5946:  0x7214,\n\t5947:  0x7215,\n\t5948:  0x7216,\n\t5949:  0x7217,\n\t5950:  0x7218,\n\t5951:  0x7219,\n\t5952:  0x721A,\n\t5953:  0x721B,\n\t5954:  0x721C,\n\t5955:  0x721E,\n\t5956:  0x721F,\n\t5957:  0x7220,\n\t5958:  0x7221,\n\t5959:  0x7222,\n\t5960:  0x7223,\n\t5961:  0x7224,\n\t5962:  0x7225,\n\t5963:  0x7226,\n\t5964:  0x7227,\n\t5965:  0x7229,\n\t5966:  0x722B,\n\t5967:  0x722D,\n\t5968:  0x722E,\n\t5969:  0x722F,\n\t5970:  0x7232,\n\t5971:  0x7233,\n\t5972:  0x7234,\n\t5973:  0x723A,\n\t5974:  0x723C,\n\t5975:  0x723E,\n\t5976:  0x7240,\n\t5977:  0x7241,\n\t5978:  0x7242,\n\t5979:  0x7243,\n\t5980:  0x7244,\n\t5981:  0x7245,\n\t5982:  0x7246,\n\t5983:  0x7249,\n\t5984:  0x724A,\n\t5985:  0x724B,\n\t5986:  0x724E,\n\t5987:  0x724F,\n\t5988:  0x7250,\n\t5989:  0x7251,\n\t5990:  0x7253,\n\t5991:  0x7254,\n\t5992:  0x7255,\n\t5993:  0x7257,\n\t5994:  0x7258,\n\t5995:  0x725A,\n\t5996:  0x725C,\n\t5997:  0x725E,\n\t5998:  0x7260,\n\t5999:  0x7263,\n\t6000:  0x7264,\n\t6001:  0x7265,\n\t6002:  0x7268,\n\t6003:  0x726A,\n\t6004:  0x726B,\n\t6005:  0x726C,\n\t6006:  0x726D,\n\t6007:  0x7270,\n\t6008:  0x7271,\n\t6009:  0x7273,\n\t6010:  0x7274,\n\t6011:  0x7276,\n\t6012:  0x7277,\n\t6013:  0x7278,\n\t6014:  0x727B,\n\t6015:  0x727C,\n\t6016:  0x727D,\n\t6017:  0x7282,\n\t6018:  0x7283,\n\t6019:  0x7285,\n\t6020:  0x7286,\n\t6021:  0x7287,\n\t6022:  0x7288,\n\t6023:  0x7289,\n\t6024:  0x728C,\n\t6025:  0x728E,\n\t6026:  0x7290,\n\t6027:  0x7291,\n\t6028:  0x7293,\n\t6029:  0x7294,\n\t6030:  0x7295,\n\t6031:  0x7296,\n\t6032:  0x7297,\n\t6033:  0x7298,\n\t6034:  0x7299,\n\t6035:  0x729A,\n\t6036:  0x729B,\n\t6037:  0x729C,\n\t6038:  0x729D,\n\t6039:  0x729E,\n\t6040:  0x72A0,\n\t6041:  0x72A1,\n\t6042:  0x72A2,\n\t6043:  0x72A3,\n\t6044:  0x72A4,\n\t6045:  0x72A5,\n\t6046:  0x72A6,\n\t6047:  0x72A7,\n\t6048:  0x72A8,\n\t6049:  0x72A9,\n\t6050:  0x72AA,\n\t6051:  0x72AB,\n\t6052:  0x72AE,\n\t6053:  0x72B1,\n\t6054:  0x72B2,\n\t6055:  0x72B3,\n\t6056:  0x72B5,\n\t6057:  0x72BA,\n\t6058:  0x72BB,\n\t6059:  0x72BC,\n\t6060:  0x72BD,\n\t6061:  0x72BE,\n\t6062:  0x72BF,\n\t6063:  0x72C0,\n\t6064:  0x72C5,\n\t6065:  0x72C6,\n\t6066:  0x72C7,\n\t6067:  0x72C9,\n\t6068:  0x72CA,\n\t6069:  0x72CB,\n\t6070:  0x72CC,\n\t6071:  0x72CF,\n\t6072:  0x72D1,\n\t6073:  0x72D3,\n\t6074:  0x72D4,\n\t6075:  0x72D5,\n\t6076:  0x72D6,\n\t6077:  0x72D8,\n\t6078:  0x72DA,\n\t6079:  0x72DB,\n\t6176:  0x3000,\n\t6177:  0x3001,\n\t6178:  0x3002,\n\t6179:  0x00B7,\n\t6180:  0x02C9,\n\t6181:  0x02C7,\n\t6182:  0x00A8,\n\t6183:  0x3003,\n\t6184:  0x3005,\n\t6185:  0x2014,\n\t6186:  0xFF5E,\n\t6187:  0x2016,\n\t6188:  0x2026,\n\t6189:  0x2018,\n\t6190:  0x2019,\n\t6191:  0x201C,\n\t6192:  0x201D,\n\t6193:  0x3014,\n\t6194:  0x3015,\n\t6195:  0x3008,\n\t6196:  0x3009,\n\t6197:  0x300A,\n\t6198:  0x300B,\n\t6199:  0x300C,\n\t6200:  0x300D,\n\t6201:  0x300E,\n\t6202:  0x300F,\n\t6203:  0x3016,\n\t6204:  0x3017,\n\t6205:  0x3010,\n\t6206:  0x3011,\n\t6207:  0x00B1,\n\t6208:  0x00D7,\n\t6209:  0x00F7,\n\t6210:  0x2236,\n\t6211:  0x2227,\n\t6212:  0x2228,\n\t6213:  0x2211,\n\t6214:  0x220F,\n\t6215:  0x222A,\n\t6216:  0x2229,\n\t6217:  0x2208,\n\t6218:  0x2237,\n\t6219:  0x221A,\n\t6220:  0x22A5,\n\t6221:  0x2225,\n\t6222:  0x2220,\n\t6223:  0x2312,\n\t6224:  0x2299,\n\t6225:  0x222B,\n\t6226:  0x222E,\n\t6227:  0x2261,\n\t6228:  0x224C,\n\t6229:  0x2248,\n\t6230:  0x223D,\n\t6231:  0x221D,\n\t6232:  0x2260,\n\t6233:  0x226E,\n\t6234:  0x226F,\n\t6235:  0x2264,\n\t6236:  0x2265,\n\t6237:  0x221E,\n\t6238:  0x2235,\n\t6239:  0x2234,\n\t6240:  0x2642,\n\t6241:  0x2640,\n\t6242:  0x00B0,\n\t6243:  0x2032,\n\t6244:  0x2033,\n\t6245:  0x2103,\n\t6246:  0xFF04,\n\t6247:  0x00A4,\n\t6248:  0xFFE0,\n\t6249:  0xFFE1,\n\t6250:  0x2030,\n\t6251:  0x00A7,\n\t6252:  0x2116,\n\t6253:  0x2606,\n\t6254:  0x2605,\n\t6255:  0x25CB,\n\t6256:  0x25CF,\n\t6257:  0x25CE,\n\t6258:  0x25C7,\n\t6259:  0x25C6,\n\t6260:  0x25A1,\n\t6261:  0x25A0,\n\t6262:  0x25B3,\n\t6263:  0x25B2,\n\t6264:  0x203B,\n\t6265:  0x2192,\n\t6266:  0x2190,\n\t6267:  0x2191,\n\t6268:  0x2193,\n\t6269:  0x3013,\n\t6366:  0x2170,\n\t6367:  0x2171,\n\t6368:  0x2172,\n\t6369:  0x2173,\n\t6370:  0x2174,\n\t6371:  0x2175,\n\t6372:  0x2176,\n\t6373:  0x2177,\n\t6374:  0x2178,\n\t6375:  0x2179,\n\t6382:  0x2488,\n\t6383:  0x2489,\n\t6384:  0x248A,\n\t6385:  0x248B,\n\t6386:  0x248C,\n\t6387:  0x248D,\n\t6388:  0x248E,\n\t6389:  0x248F,\n\t6390:  0x2490,\n\t6391:  0x2491,\n\t6392:  0x2492,\n\t6393:  0x2493,\n\t6394:  0x2494,\n\t6395:  0x2495,\n\t6396:  0x2496,\n\t6397:  0x2497,\n\t6398:  0x2498,\n\t6399:  0x2499,\n\t6400:  0x249A,\n\t6401:  0x249B,\n\t6402:  0x2474,\n\t6403:  0x2475,\n\t6404:  0x2476,\n\t6405:  0x2477,\n\t6406:  0x2478,\n\t6407:  0x2479,\n\t6408:  0x247A,\n\t6409:  0x247B,\n\t6410:  0x247C,\n\t6411:  0x247D,\n\t6412:  0x247E,\n\t6413:  0x247F,\n\t6414:  0x2480,\n\t6415:  0x2481,\n\t6416:  0x2482,\n\t6417:  0x2483,\n\t6418:  0x2484,\n\t6419:  0x2485,\n\t6420:  0x2486,\n\t6421:  0x2487,\n\t6422:  0x2460,\n\t6423:  0x2461,\n\t6424:  0x2462,\n\t6425:  0x2463,\n\t6426:  0x2464,\n\t6427:  0x2465,\n\t6428:  0x2466,\n\t6429:  0x2467,\n\t6430:  0x2468,\n\t6431:  0x2469,\n\t6432:  0x20AC,\n\t6434:  0x3220,\n\t6435:  0x3221,\n\t6436:  0x3222,\n\t6437:  0x3223,\n\t6438:  0x3224,\n\t6439:  0x3225,\n\t6440:  0x3226,\n\t6441:  0x3227,\n\t6442:  0x3228,\n\t6443:  0x3229,\n\t6446:  0x2160,\n\t6447:  0x2161,\n\t6448:  0x2162,\n\t6449:  0x2163,\n\t6450:  0x2164,\n\t6451:  0x2165,\n\t6452:  0x2166,\n\t6453:  0x2167,\n\t6454:  0x2168,\n\t6455:  0x2169,\n\t6456:  0x216A,\n\t6457:  0x216B,\n\t6555:  0x3000,\n\t6556:  0xFF01,\n\t6557:  0xFF02,\n\t6558:  0xFF03,\n\t6559:  0xFFE5,\n\t6560:  0xFF05,\n\t6561:  0xFF06,\n\t6562:  0xFF07,\n\t6563:  0xFF08,\n\t6564:  0xFF09,\n\t6565:  0xFF0A,\n\t6566:  0xFF0B,\n\t6567:  0xFF0C,\n\t6568:  0xFF0D,\n\t6569:  0xFF0E,\n\t6570:  0xFF0F,\n\t6571:  0xFF10,\n\t6572:  0xFF11,\n\t6573:  0xFF12,\n\t6574:  0xFF13,\n\t6575:  0xFF14,\n\t6576:  0xFF15,\n\t6577:  0xFF16,\n\t6578:  0xFF17,\n\t6579:  0xFF18,\n\t6580:  0xFF19,\n\t6581:  0xFF1A,\n\t6582:  0xFF1B,\n\t6583:  0xFF1C,\n\t6584:  0xFF1D,\n\t6585:  0xFF1E,\n\t6586:  0xFF1F,\n\t6587:  0xFF20,\n\t6588:  0xFF21,\n\t6589:  0xFF22,\n\t6590:  0xFF23,\n\t6591:  0xFF24,\n\t6592:  0xFF25,\n\t6593:  0xFF26,\n\t6594:  0xFF27,\n\t6595:  0xFF28,\n\t6596:  0xFF29,\n\t6597:  0xFF2A,\n\t6598:  0xFF2B,\n\t6599:  0xFF2C,\n\t6600:  0xFF2D,\n\t6601:  0xFF2E,\n\t6602:  0xFF2F,\n\t6603:  0xFF30,\n\t6604:  0xFF31,\n\t6605:  0xFF32,\n\t6606:  0xFF33,\n\t6607:  0xFF34,\n\t6608:  0xFF35,\n\t6609:  0xFF36,\n\t6610:  0xFF37,\n\t6611:  0xFF38,\n\t6612:  0xFF39,\n\t6613:  0xFF3A,\n\t6614:  0xFF3B,\n\t6615:  0xFF3C,\n\t6616:  0xFF3D,\n\t6617:  0xFF3E,\n\t6618:  0xFF3F,\n\t6619:  0xFF40,\n\t6620:  0xFF41,\n\t6621:  0xFF42,\n\t6622:  0xFF43,\n\t6623:  0xFF44,\n\t6624:  0xFF45,\n\t6625:  0xFF46,\n\t6626:  0xFF47,\n\t6627:  0xFF48,\n\t6628:  0xFF49,\n\t6629:  0xFF4A,\n\t6630:  0xFF4B,\n\t6631:  0xFF4C,\n\t6632:  0xFF4D,\n\t6633:  0xFF4E,\n\t6634:  0xFF4F,\n\t6635:  0xFF50,\n\t6636:  0xFF51,\n\t6637:  0xFF52,\n\t6638:  0xFF53,\n\t6639:  0xFF54,\n\t6640:  0xFF55,\n\t6641:  0xFF56,\n\t6642:  0xFF57,\n\t6643:  0xFF58,\n\t6644:  0xFF59,\n\t6645:  0xFF5A,\n\t6646:  0xFF5B,\n\t6647:  0xFF5C,\n\t6648:  0xFF5D,\n\t6649:  0xFFE3,\n\t6746:  0x3041,\n\t6747:  0x3042,\n\t6748:  0x3043,\n\t6749:  0x3044,\n\t6750:  0x3045,\n\t6751:  0x3046,\n\t6752:  0x3047,\n\t6753:  0x3048,\n\t6754:  0x3049,\n\t6755:  0x304A,\n\t6756:  0x304B,\n\t6757:  0x304C,\n\t6758:  0x304D,\n\t6759:  0x304E,\n\t6760:  0x304F,\n\t6761:  0x3050,\n\t6762:  0x3051,\n\t6763:  0x3052,\n\t6764:  0x3053,\n\t6765:  0x3054,\n\t6766:  0x3055,\n\t6767:  0x3056,\n\t6768:  0x3057,\n\t6769:  0x3058,\n\t6770:  0x3059,\n\t6771:  0x305A,\n\t6772:  0x305B,\n\t6773:  0x305C,\n\t6774:  0x305D,\n\t6775:  0x305E,\n\t6776:  0x305F,\n\t6777:  0x3060,\n\t6778:  0x3061,\n\t6779:  0x3062,\n\t6780:  0x3063,\n\t6781:  0x3064,\n\t6782:  0x3065,\n\t6783:  0x3066,\n\t6784:  0x3067,\n\t6785:  0x3068,\n\t6786:  0x3069,\n\t6787:  0x306A,\n\t6788:  0x306B,\n\t6789:  0x306C,\n\t6790:  0x306D,\n\t6791:  0x306E,\n\t6792:  0x306F,\n\t6793:  0x3070,\n\t6794:  0x3071,\n\t6795:  0x3072,\n\t6796:  0x3073,\n\t6797:  0x3074,\n\t6798:  0x3075,\n\t6799:  0x3076,\n\t6800:  0x3077,\n\t6801:  0x3078,\n\t6802:  0x3079,\n\t6803:  0x307A,\n\t6804:  0x307B,\n\t6805:  0x307C,\n\t6806:  0x307D,\n\t6807:  0x307E,\n\t6808:  0x307F,\n\t6809:  0x3080,\n\t6810:  0x3081,\n\t6811:  0x3082,\n\t6812:  0x3083,\n\t6813:  0x3084,\n\t6814:  0x3085,\n\t6815:  0x3086,\n\t6816:  0x3087,\n\t6817:  0x3088,\n\t6818:  0x3089,\n\t6819:  0x308A,\n\t6820:  0x308B,\n\t6821:  0x308C,\n\t6822:  0x308D,\n\t6823:  0x308E,\n\t6824:  0x308F,\n\t6825:  0x3090,\n\t6826:  0x3091,\n\t6827:  0x3092,\n\t6828:  0x3093,\n\t6936:  0x30A1,\n\t6937:  0x30A2,\n\t6938:  0x30A3,\n\t6939:  0x30A4,\n\t6940:  0x30A5,\n\t6941:  0x30A6,\n\t6942:  0x30A7,\n\t6943:  0x30A8,\n\t6944:  0x30A9,\n\t6945:  0x30AA,\n\t6946:  0x30AB,\n\t6947:  0x30AC,\n\t6948:  0x30AD,\n\t6949:  0x30AE,\n\t6950:  0x30AF,\n\t6951:  0x30B0,\n\t6952:  0x30B1,\n\t6953:  0x30B2,\n\t6954:  0x30B3,\n\t6955:  0x30B4,\n\t6956:  0x30B5,\n\t6957:  0x30B6,\n\t6958:  0x30B7,\n\t6959:  0x30B8,\n\t6960:  0x30B9,\n\t6961:  0x30BA,\n\t6962:  0x30BB,\n\t6963:  0x30BC,\n\t6964:  0x30BD,\n\t6965:  0x30BE,\n\t6966:  0x30BF,\n\t6967:  0x30C0,\n\t6968:  0x30C1,\n\t6969:  0x30C2,\n\t6970:  0x30C3,\n\t6971:  0x30C4,\n\t6972:  0x30C5,\n\t6973:  0x30C6,\n\t6974:  0x30C7,\n\t6975:  0x30C8,\n\t6976:  0x30C9,\n\t6977:  0x30CA,\n\t6978:  0x30CB,\n\t6979:  0x30CC,\n\t6980:  0x30CD,\n\t6981:  0x30CE,\n\t6982:  0x30CF,\n\t6983:  0x30D0,\n\t6984:  0x30D1,\n\t6985:  0x30D2,\n\t6986:  0x30D3,\n\t6987:  0x30D4,\n\t6988:  0x30D5,\n\t6989:  0x30D6,\n\t6990:  0x30D7,\n\t6991:  0x30D8,\n\t6992:  0x30D9,\n\t6993:  0x30DA,\n\t6994:  0x30DB,\n\t6995:  0x30DC,\n\t6996:  0x30DD,\n\t6997:  0x30DE,\n\t6998:  0x30DF,\n\t6999:  0x30E0,\n\t7000:  0x30E1,\n\t7001:  0x30E2,\n\t7002:  0x30E3,\n\t7003:  0x30E4,\n\t7004:  0x30E5,\n\t7005:  0x30E6,\n\t7006:  0x30E7,\n\t7007:  0x30E8,\n\t7008:  0x30E9,\n\t7009:  0x30EA,\n\t7010:  0x30EB,\n\t7011:  0x30EC,\n\t7012:  0x30ED,\n\t7013:  0x30EE,\n\t7014:  0x30EF,\n\t7015:  0x30F0,\n\t7016:  0x30F1,\n\t7017:  0x30F2,\n\t7018:  0x30F3,\n\t7019:  0x30F4,\n\t7020:  0x30F5,\n\t7021:  0x30F6,\n\t7126:  0x0391,\n\t7127:  0x0392,\n\t7128:  0x0393,\n\t7129:  0x0394,\n\t7130:  0x0395,\n\t7131:  0x0396,\n\t7132:  0x0397,\n\t7133:  0x0398,\n\t7134:  0x0399,\n\t7135:  0x039A,\n\t7136:  0x039B,\n\t7137:  0x039C,\n\t7138:  0x039D,\n\t7139:  0x039E,\n\t7140:  0x039F,\n\t7141:  0x03A0,\n\t7142:  0x03A1,\n\t7143:  0x03A3,\n\t7144:  0x03A4,\n\t7145:  0x03A5,\n\t7146:  0x03A6,\n\t7147:  0x03A7,\n\t7148:  0x03A8,\n\t7149:  0x03A9,\n\t7158:  0x03B1,\n\t7159:  0x03B2,\n\t7160:  0x03B3,\n\t7161:  0x03B4,\n\t7162:  0x03B5,\n\t7163:  0x03B6,\n\t7164:  0x03B7,\n\t7165:  0x03B8,\n\t7166:  0x03B9,\n\t7167:  0x03BA,\n\t7168:  0x03BB,\n\t7169:  0x03BC,\n\t7170:  0x03BD,\n\t7171:  0x03BE,\n\t7172:  0x03BF,\n\t7173:  0x03C0,\n\t7174:  0x03C1,\n\t7175:  0x03C3,\n\t7176:  0x03C4,\n\t7177:  0x03C5,\n\t7178:  0x03C6,\n\t7179:  0x03C7,\n\t7180:  0x03C8,\n\t7181:  0x03C9,\n\t7189:  0xFE35,\n\t7190:  0xFE36,\n\t7191:  0xFE39,\n\t7192:  0xFE3A,\n\t7193:  0xFE3F,\n\t7194:  0xFE40,\n\t7195:  0xFE3D,\n\t7196:  0xFE3E,\n\t7197:  0xFE41,\n\t7198:  0xFE42,\n\t7199:  0xFE43,\n\t7200:  0xFE44,\n\t7203:  0xFE3B,\n\t7204:  0xFE3C,\n\t7205:  0xFE37,\n\t7206:  0xFE38,\n\t7207:  0xFE31,\n\t7209:  0xFE33,\n\t7210:  0xFE34,\n\t7316:  0x0410,\n\t7317:  0x0411,\n\t7318:  0x0412,\n\t7319:  0x0413,\n\t7320:  0x0414,\n\t7321:  0x0415,\n\t7322:  0x0401,\n\t7323:  0x0416,\n\t7324:  0x0417,\n\t7325:  0x0418,\n\t7326:  0x0419,\n\t7327:  0x041A,\n\t7328:  0x041B,\n\t7329:  0x041C,\n\t7330:  0x041D,\n\t7331:  0x041E,\n\t7332:  0x041F,\n\t7333:  0x0420,\n\t7334:  0x0421,\n\t7335:  0x0422,\n\t7336:  0x0423,\n\t7337:  0x0424,\n\t7338:  0x0425,\n\t7339:  0x0426,\n\t7340:  0x0427,\n\t7341:  0x0428,\n\t7342:  0x0429,\n\t7343:  0x042A,\n\t7344:  0x042B,\n\t7345:  0x042C,\n\t7346:  0x042D,\n\t7347:  0x042E,\n\t7348:  0x042F,\n\t7364:  0x0430,\n\t7365:  0x0431,\n\t7366:  0x0432,\n\t7367:  0x0433,\n\t7368:  0x0434,\n\t7369:  0x0435,\n\t7370:  0x0451,\n\t7371:  0x0436,\n\t7372:  0x0437,\n\t7373:  0x0438,\n\t7374:  0x0439,\n\t7375:  0x043A,\n\t7376:  0x043B,\n\t7377:  0x043C,\n\t7378:  0x043D,\n\t7379:  0x043E,\n\t7380:  0x043F,\n\t7381:  0x0440,\n\t7382:  0x0441,\n\t7383:  0x0442,\n\t7384:  0x0443,\n\t7385:  0x0444,\n\t7386:  0x0445,\n\t7387:  0x0446,\n\t7388:  0x0447,\n\t7389:  0x0448,\n\t7390:  0x0449,\n\t7391:  0x044A,\n\t7392:  0x044B,\n\t7393:  0x044C,\n\t7394:  0x044D,\n\t7395:  0x044E,\n\t7396:  0x044F,\n\t7410:  0x02CA,\n\t7411:  0x02CB,\n\t7412:  0x02D9,\n\t7413:  0x2013,\n\t7414:  0x2015,\n\t7415:  0x2025,\n\t7416:  0x2035,\n\t7417:  0x2105,\n\t7418:  0x2109,\n\t7419:  0x2196,\n\t7420:  0x2197,\n\t7421:  0x2198,\n\t7422:  0x2199,\n\t7423:  0x2215,\n\t7424:  0x221F,\n\t7425:  0x2223,\n\t7426:  0x2252,\n\t7427:  0x2266,\n\t7428:  0x2267,\n\t7429:  0x22BF,\n\t7430:  0x2550,\n\t7431:  0x2551,\n\t7432:  0x2552,\n\t7433:  0x2553,\n\t7434:  0x2554,\n\t7435:  0x2555,\n\t7436:  0x2556,\n\t7437:  0x2557,\n\t7438:  0x2558,\n\t7439:  0x2559,\n\t7440:  0x255A,\n\t7441:  0x255B,\n\t7442:  0x255C,\n\t7443:  0x255D,\n\t7444:  0x255E,\n\t7445:  0x255F,\n\t7446:  0x2560,\n\t7447:  0x2561,\n\t7448:  0x2562,\n\t7449:  0x2563,\n\t7450:  0x2564,\n\t7451:  0x2565,\n\t7452:  0x2566,\n\t7453:  0x2567,\n\t7454:  0x2568,\n\t7455:  0x2569,\n\t7456:  0x256A,\n\t7457:  0x256B,\n\t7458:  0x256C,\n\t7459:  0x256D,\n\t7460:  0x256E,\n\t7461:  0x256F,\n\t7462:  0x2570,\n\t7463:  0x2571,\n\t7464:  0x2572,\n\t7465:  0x2573,\n\t7466:  0x2581,\n\t7467:  0x2582,\n\t7468:  0x2583,\n\t7469:  0x2584,\n\t7470:  0x2585,\n\t7471:  0x2586,\n\t7472:  0x2587,\n\t7473:  0x2588,\n\t7474:  0x2589,\n\t7475:  0x258A,\n\t7476:  0x258B,\n\t7477:  0x258C,\n\t7478:  0x258D,\n\t7479:  0x258E,\n\t7480:  0x258F,\n\t7481:  0x2593,\n\t7482:  0x2594,\n\t7483:  0x2595,\n\t7484:  0x25BC,\n\t7485:  0x25BD,\n\t7486:  0x25E2,\n\t7487:  0x25E3,\n\t7488:  0x25E4,\n\t7489:  0x25E5,\n\t7490:  0x2609,\n\t7491:  0x2295,\n\t7492:  0x3012,\n\t7493:  0x301D,\n\t7494:  0x301E,\n\t7506:  0x0101,\n\t7507:  0x00E1,\n\t7508:  0x01CE,\n\t7509:  0x00E0,\n\t7510:  0x0113,\n\t7511:  0x00E9,\n\t7512:  0x011B,\n\t7513:  0x00E8,\n\t7514:  0x012B,\n\t7515:  0x00ED,\n\t7516:  0x01D0,\n\t7517:  0x00EC,\n\t7518:  0x014D,\n\t7519:  0x00F3,\n\t7520:  0x01D2,\n\t7521:  0x00F2,\n\t7522:  0x016B,\n\t7523:  0x00FA,\n\t7524:  0x01D4,\n\t7525:  0x00F9,\n\t7526:  0x01D6,\n\t7527:  0x01D8,\n\t7528:  0x01DA,\n\t7529:  0x01DC,\n\t7530:  0x00FC,\n\t7531:  0x00EA,\n\t7532:  0x0251,\n\t7534:  0x0144,\n\t7535:  0x0148,\n\t7536:  0x01F9,\n\t7537:  0x0261,\n\t7542:  0x3105,\n\t7543:  0x3106,\n\t7544:  0x3107,\n\t7545:  0x3108,\n\t7546:  0x3109,\n\t7547:  0x310A,\n\t7548:  0x310B,\n\t7549:  0x310C,\n\t7550:  0x310D,\n\t7551:  0x310E,\n\t7552:  0x310F,\n\t7553:  0x3110,\n\t7554:  0x3111,\n\t7555:  0x3112,\n\t7556:  0x3113,\n\t7557:  0x3114,\n\t7558:  0x3115,\n\t7559:  0x3116,\n\t7560:  0x3117,\n\t7561:  0x3118,\n\t7562:  0x3119,\n\t7563:  0x311A,\n\t7564:  0x311B,\n\t7565:  0x311C,\n\t7566:  0x311D,\n\t7567:  0x311E,\n\t7568:  0x311F,\n\t7569:  0x3120,\n\t7570:  0x3121,\n\t7571:  0x3122,\n\t7572:  0x3123,\n\t7573:  0x3124,\n\t7574:  0x3125,\n\t7575:  0x3126,\n\t7576:  0x3127,\n\t7577:  0x3128,\n\t7578:  0x3129,\n\t7600:  0x3021,\n\t7601:  0x3022,\n\t7602:  0x3023,\n\t7603:  0x3024,\n\t7604:  0x3025,\n\t7605:  0x3026,\n\t7606:  0x3027,\n\t7607:  0x3028,\n\t7608:  0x3029,\n\t7609:  0x32A3,\n\t7610:  0x338E,\n\t7611:  0x338F,\n\t7612:  0x339C,\n\t7613:  0x339D,\n\t7614:  0x339E,\n\t7615:  0x33A1,\n\t7616:  0x33C4,\n\t7617:  0x33CE,\n\t7618:  0x33D1,\n\t7619:  0x33D2,\n\t7620:  0x33D5,\n\t7621:  0xFE30,\n\t7622:  0xFFE2,\n\t7623:  0xFFE4,\n\t7625:  0x2121,\n\t7626:  0x3231,\n\t7628:  0x2010,\n\t7632:  0x30FC,\n\t7633:  0x309B,\n\t7634:  0x309C,\n\t7635:  0x30FD,\n\t7636:  0x30FE,\n\t7637:  0x3006,\n\t7638:  0x309D,\n\t7639:  0x309E,\n\t7640:  0xFE49,\n\t7641:  0xFE4A,\n\t7642:  0xFE4B,\n\t7643:  0xFE4C,\n\t7644:  0xFE4D,\n\t7645:  0xFE4E,\n\t7646:  0xFE4F,\n\t7647:  0xFE50,\n\t7648:  0xFE51,\n\t7649:  0xFE52,\n\t7650:  0xFE54,\n\t7651:  0xFE55,\n\t7652:  0xFE56,\n\t7653:  0xFE57,\n\t7654:  0xFE59,\n\t7655:  0xFE5A,\n\t7656:  0xFE5B,\n\t7657:  0xFE5C,\n\t7658:  0xFE5D,\n\t7659:  0xFE5E,\n\t7660:  0xFE5F,\n\t7661:  0xFE60,\n\t7662:  0xFE61,\n\t7663:  0xFE62,\n\t7664:  0xFE63,\n\t7665:  0xFE64,\n\t7666:  0xFE65,\n\t7667:  0xFE66,\n\t7668:  0xFE68,\n\t7669:  0xFE69,\n\t7670:  0xFE6A,\n\t7671:  0xFE6B,\n\t7672:  0x303E,\n\t7673:  0x2FF0,\n\t7674:  0x2FF1,\n\t7675:  0x2FF2,\n\t7676:  0x2FF3,\n\t7677:  0x2FF4,\n\t7678:  0x2FF5,\n\t7679:  0x2FF6,\n\t7680:  0x2FF7,\n\t7681:  0x2FF8,\n\t7682:  0x2FF9,\n\t7683:  0x2FFA,\n\t7684:  0x2FFB,\n\t7685:  0x3007,\n\t7699:  0x2500,\n\t7700:  0x2501,\n\t7701:  0x2502,\n\t7702:  0x2503,\n\t7703:  0x2504,\n\t7704:  0x2505,\n\t7705:  0x2506,\n\t7706:  0x2507,\n\t7707:  0x2508,\n\t7708:  0x2509,\n\t7709:  0x250A,\n\t7710:  0x250B,\n\t7711:  0x250C,\n\t7712:  0x250D,\n\t7713:  0x250E,\n\t7714:  0x250F,\n\t7715:  0x2510,\n\t7716:  0x2511,\n\t7717:  0x2512,\n\t7718:  0x2513,\n\t7719:  0x2514,\n\t7720:  0x2515,\n\t7721:  0x2516,\n\t7722:  0x2517,\n\t7723:  0x2518,\n\t7724:  0x2519,\n\t7725:  0x251A,\n\t7726:  0x251B,\n\t7727:  0x251C,\n\t7728:  0x251D,\n\t7729:  0x251E,\n\t7730:  0x251F,\n\t7731:  0x2520,\n\t7732:  0x2521,\n\t7733:  0x2522,\n\t7734:  0x2523,\n\t7735:  0x2524,\n\t7736:  0x2525,\n\t7737:  0x2526,\n\t7738:  0x2527,\n\t7739:  0x2528,\n\t7740:  0x2529,\n\t7741:  0x252A,\n\t7742:  0x252B,\n\t7743:  0x252C,\n\t7744:  0x252D,\n\t7745:  0x252E,\n\t7746:  0x252F,\n\t7747:  0x2530,\n\t7748:  0x2531,\n\t7749:  0x2532,\n\t7750:  0x2533,\n\t7751:  0x2534,\n\t7752:  0x2535,\n\t7753:  0x2536,\n\t7754:  0x2537,\n\t7755:  0x2538,\n\t7756:  0x2539,\n\t7757:  0x253A,\n\t7758:  0x253B,\n\t7759:  0x253C,\n\t7760:  0x253D,\n\t7761:  0x253E,\n\t7762:  0x253F,\n\t7763:  0x2540,\n\t7764:  0x2541,\n\t7765:  0x2542,\n\t7766:  0x2543,\n\t7767:  0x2544,\n\t7768:  0x2545,\n\t7769:  0x2546,\n\t7770:  0x2547,\n\t7771:  0x2548,\n\t7772:  0x2549,\n\t7773:  0x254A,\n\t7774:  0x254B,\n\t7790:  0x72DC,\n\t7791:  0x72DD,\n\t7792:  0x72DF,\n\t7793:  0x72E2,\n\t7794:  0x72E3,\n\t7795:  0x72E4,\n\t7796:  0x72E5,\n\t7797:  0x72E6,\n\t7798:  0x72E7,\n\t7799:  0x72EA,\n\t7800:  0x72EB,\n\t7801:  0x72F5,\n\t7802:  0x72F6,\n\t7803:  0x72F9,\n\t7804:  0x72FD,\n\t7805:  0x72FE,\n\t7806:  0x72FF,\n\t7807:  0x7300,\n\t7808:  0x7302,\n\t7809:  0x7304,\n\t7810:  0x7305,\n\t7811:  0x7306,\n\t7812:  0x7307,\n\t7813:  0x7308,\n\t7814:  0x7309,\n\t7815:  0x730B,\n\t7816:  0x730C,\n\t7817:  0x730D,\n\t7818:  0x730F,\n\t7819:  0x7310,\n\t7820:  0x7311,\n\t7821:  0x7312,\n\t7822:  0x7314,\n\t7823:  0x7318,\n\t7824:  0x7319,\n\t7825:  0x731A,\n\t7826:  0x731F,\n\t7827:  0x7320,\n\t7828:  0x7323,\n\t7829:  0x7324,\n\t7830:  0x7326,\n\t7831:  0x7327,\n\t7832:  0x7328,\n\t7833:  0x732D,\n\t7834:  0x732F,\n\t7835:  0x7330,\n\t7836:  0x7332,\n\t7837:  0x7333,\n\t7838:  0x7335,\n\t7839:  0x7336,\n\t7840:  0x733A,\n\t7841:  0x733B,\n\t7842:  0x733C,\n\t7843:  0x733D,\n\t7844:  0x7340,\n\t7845:  0x7341,\n\t7846:  0x7342,\n\t7847:  0x7343,\n\t7848:  0x7344,\n\t7849:  0x7345,\n\t7850:  0x7346,\n\t7851:  0x7347,\n\t7852:  0x7348,\n\t7853:  0x7349,\n\t7854:  0x734A,\n\t7855:  0x734B,\n\t7856:  0x734C,\n\t7857:  0x734E,\n\t7858:  0x734F,\n\t7859:  0x7351,\n\t7860:  0x7353,\n\t7861:  0x7354,\n\t7862:  0x7355,\n\t7863:  0x7356,\n\t7864:  0x7358,\n\t7865:  0x7359,\n\t7866:  0x735A,\n\t7867:  0x735B,\n\t7868:  0x735C,\n\t7869:  0x735D,\n\t7870:  0x735E,\n\t7871:  0x735F,\n\t7872:  0x7361,\n\t7873:  0x7362,\n\t7874:  0x7363,\n\t7875:  0x7364,\n\t7876:  0x7365,\n\t7877:  0x7366,\n\t7878:  0x7367,\n\t7879:  0x7368,\n\t7880:  0x7369,\n\t7881:  0x736A,\n\t7882:  0x736B,\n\t7883:  0x736E,\n\t7884:  0x7370,\n\t7885:  0x7371,\n\t7980:  0x7372,\n\t7981:  0x7373,\n\t7982:  0x7374,\n\t7983:  0x7375,\n\t7984:  0x7376,\n\t7985:  0x7377,\n\t7986:  0x7378,\n\t7987:  0x7379,\n\t7988:  0x737A,\n\t7989:  0x737B,\n\t7990:  0x737C,\n\t7991:  0x737D,\n\t7992:  0x737F,\n\t7993:  0x7380,\n\t7994:  0x7381,\n\t7995:  0x7382,\n\t7996:  0x7383,\n\t7997:  0x7385,\n\t7998:  0x7386,\n\t7999:  0x7388,\n\t8000:  0x738A,\n\t8001:  0x738C,\n\t8002:  0x738D,\n\t8003:  0x738F,\n\t8004:  0x7390,\n\t8005:  0x7392,\n\t8006:  0x7393,\n\t8007:  0x7394,\n\t8008:  0x7395,\n\t8009:  0x7397,\n\t8010:  0x7398,\n\t8011:  0x7399,\n\t8012:  0x739A,\n\t8013:  0x739C,\n\t8014:  0x739D,\n\t8015:  0x739E,\n\t8016:  0x73A0,\n\t8017:  0x73A1,\n\t8018:  0x73A3,\n\t8019:  0x73A4,\n\t8020:  0x73A5,\n\t8021:  0x73A6,\n\t8022:  0x73A7,\n\t8023:  0x73A8,\n\t8024:  0x73AA,\n\t8025:  0x73AC,\n\t8026:  0x73AD,\n\t8027:  0x73B1,\n\t8028:  0x73B4,\n\t8029:  0x73B5,\n\t8030:  0x73B6,\n\t8031:  0x73B8,\n\t8032:  0x73B9,\n\t8033:  0x73BC,\n\t8034:  0x73BD,\n\t8035:  0x73BE,\n\t8036:  0x73BF,\n\t8037:  0x73C1,\n\t8038:  0x73C3,\n\t8039:  0x73C4,\n\t8040:  0x73C5,\n\t8041:  0x73C6,\n\t8042:  0x73C7,\n\t8043:  0x73CB,\n\t8044:  0x73CC,\n\t8045:  0x73CE,\n\t8046:  0x73D2,\n\t8047:  0x73D3,\n\t8048:  0x73D4,\n\t8049:  0x73D5,\n\t8050:  0x73D6,\n\t8051:  0x73D7,\n\t8052:  0x73D8,\n\t8053:  0x73DA,\n\t8054:  0x73DB,\n\t8055:  0x73DC,\n\t8056:  0x73DD,\n\t8057:  0x73DF,\n\t8058:  0x73E1,\n\t8059:  0x73E2,\n\t8060:  0x73E3,\n\t8061:  0x73E4,\n\t8062:  0x73E6,\n\t8063:  0x73E8,\n\t8064:  0x73EA,\n\t8065:  0x73EB,\n\t8066:  0x73EC,\n\t8067:  0x73EE,\n\t8068:  0x73EF,\n\t8069:  0x73F0,\n\t8070:  0x73F1,\n\t8071:  0x73F3,\n\t8072:  0x73F4,\n\t8073:  0x73F5,\n\t8074:  0x73F6,\n\t8075:  0x73F7,\n\t8170:  0x73F8,\n\t8171:  0x73F9,\n\t8172:  0x73FA,\n\t8173:  0x73FB,\n\t8174:  0x73FC,\n\t8175:  0x73FD,\n\t8176:  0x73FE,\n\t8177:  0x73FF,\n\t8178:  0x7400,\n\t8179:  0x7401,\n\t8180:  0x7402,\n\t8181:  0x7404,\n\t8182:  0x7407,\n\t8183:  0x7408,\n\t8184:  0x740B,\n\t8185:  0x740C,\n\t8186:  0x740D,\n\t8187:  0x740E,\n\t8188:  0x7411,\n\t8189:  0x7412,\n\t8190:  0x7413,\n\t8191:  0x7414,\n\t8192:  0x7415,\n\t8193:  0x7416,\n\t8194:  0x7417,\n\t8195:  0x7418,\n\t8196:  0x7419,\n\t8197:  0x741C,\n\t8198:  0x741D,\n\t8199:  0x741E,\n\t8200:  0x741F,\n\t8201:  0x7420,\n\t8202:  0x7421,\n\t8203:  0x7423,\n\t8204:  0x7424,\n\t8205:  0x7427,\n\t8206:  0x7429,\n\t8207:  0x742B,\n\t8208:  0x742D,\n\t8209:  0x742F,\n\t8210:  0x7431,\n\t8211:  0x7432,\n\t8212:  0x7437,\n\t8213:  0x7438,\n\t8214:  0x7439,\n\t8215:  0x743A,\n\t8216:  0x743B,\n\t8217:  0x743D,\n\t8218:  0x743E,\n\t8219:  0x743F,\n\t8220:  0x7440,\n\t8221:  0x7442,\n\t8222:  0x7443,\n\t8223:  0x7444,\n\t8224:  0x7445,\n\t8225:  0x7446,\n\t8226:  0x7447,\n\t8227:  0x7448,\n\t8228:  0x7449,\n\t8229:  0x744A,\n\t8230:  0x744B,\n\t8231:  0x744C,\n\t8232:  0x744D,\n\t8233:  0x744E,\n\t8234:  0x744F,\n\t8235:  0x7450,\n\t8236:  0x7451,\n\t8237:  0x7452,\n\t8238:  0x7453,\n\t8239:  0x7454,\n\t8240:  0x7456,\n\t8241:  0x7458,\n\t8242:  0x745D,\n\t8243:  0x7460,\n\t8244:  0x7461,\n\t8245:  0x7462,\n\t8246:  0x7463,\n\t8247:  0x7464,\n\t8248:  0x7465,\n\t8249:  0x7466,\n\t8250:  0x7467,\n\t8251:  0x7468,\n\t8252:  0x7469,\n\t8253:  0x746A,\n\t8254:  0x746B,\n\t8255:  0x746C,\n\t8256:  0x746E,\n\t8257:  0x746F,\n\t8258:  0x7471,\n\t8259:  0x7472,\n\t8260:  0x7473,\n\t8261:  0x7474,\n\t8262:  0x7475,\n\t8263:  0x7478,\n\t8264:  0x7479,\n\t8265:  0x747A,\n\t8360:  0x747B,\n\t8361:  0x747C,\n\t8362:  0x747D,\n\t8363:  0x747F,\n\t8364:  0x7482,\n\t8365:  0x7484,\n\t8366:  0x7485,\n\t8367:  0x7486,\n\t8368:  0x7488,\n\t8369:  0x7489,\n\t8370:  0x748A,\n\t8371:  0x748C,\n\t8372:  0x748D,\n\t8373:  0x748F,\n\t8374:  0x7491,\n\t8375:  0x7492,\n\t8376:  0x7493,\n\t8377:  0x7494,\n\t8378:  0x7495,\n\t8379:  0x7496,\n\t8380:  0x7497,\n\t8381:  0x7498,\n\t8382:  0x7499,\n\t8383:  0x749A,\n\t8384:  0x749B,\n\t8385:  0x749D,\n\t8386:  0x749F,\n\t8387:  0x74A0,\n\t8388:  0x74A1,\n\t8389:  0x74A2,\n\t8390:  0x74A3,\n\t8391:  0x74A4,\n\t8392:  0x74A5,\n\t8393:  0x74A6,\n\t8394:  0x74AA,\n\t8395:  0x74AB,\n\t8396:  0x74AC,\n\t8397:  0x74AD,\n\t8398:  0x74AE,\n\t8399:  0x74AF,\n\t8400:  0x74B0,\n\t8401:  0x74B1,\n\t8402:  0x74B2,\n\t8403:  0x74B3,\n\t8404:  0x74B4,\n\t8405:  0x74B5,\n\t8406:  0x74B6,\n\t8407:  0x74B7,\n\t8408:  0x74B8,\n\t8409:  0x74B9,\n\t8410:  0x74BB,\n\t8411:  0x74BC,\n\t8412:  0x74BD,\n\t8413:  0x74BE,\n\t8414:  0x74BF,\n\t8415:  0x74C0,\n\t8416:  0x74C1,\n\t8417:  0x74C2,\n\t8418:  0x74C3,\n\t8419:  0x74C4,\n\t8420:  0x74C5,\n\t8421:  0x74C6,\n\t8422:  0x74C7,\n\t8423:  0x74C8,\n\t8424:  0x74C9,\n\t8425:  0x74CA,\n\t8426:  0x74CB,\n\t8427:  0x74CC,\n\t8428:  0x74CD,\n\t8429:  0x74CE,\n\t8430:  0x74CF,\n\t8431:  0x74D0,\n\t8432:  0x74D1,\n\t8433:  0x74D3,\n\t8434:  0x74D4,\n\t8435:  0x74D5,\n\t8436:  0x74D6,\n\t8437:  0x74D7,\n\t8438:  0x74D8,\n\t8439:  0x74D9,\n\t8440:  0x74DA,\n\t8441:  0x74DB,\n\t8442:  0x74DD,\n\t8443:  0x74DF,\n\t8444:  0x74E1,\n\t8445:  0x74E5,\n\t8446:  0x74E7,\n\t8447:  0x74E8,\n\t8448:  0x74E9,\n\t8449:  0x74EA,\n\t8450:  0x74EB,\n\t8451:  0x74EC,\n\t8452:  0x74ED,\n\t8453:  0x74F0,\n\t8454:  0x74F1,\n\t8455:  0x74F2,\n\t8550:  0x74F3,\n\t8551:  0x74F5,\n\t8552:  0x74F8,\n\t8553:  0x74F9,\n\t8554:  0x74FA,\n\t8555:  0x74FB,\n\t8556:  0x74FC,\n\t8557:  0x74FD,\n\t8558:  0x74FE,\n\t8559:  0x7500,\n\t8560:  0x7501,\n\t8561:  0x7502,\n\t8562:  0x7503,\n\t8563:  0x7505,\n\t8564:  0x7506,\n\t8565:  0x7507,\n\t8566:  0x7508,\n\t8567:  0x7509,\n\t8568:  0x750A,\n\t8569:  0x750B,\n\t8570:  0x750C,\n\t8571:  0x750E,\n\t8572:  0x7510,\n\t8573:  0x7512,\n\t8574:  0x7514,\n\t8575:  0x7515,\n\t8576:  0x7516,\n\t8577:  0x7517,\n\t8578:  0x751B,\n\t8579:  0x751D,\n\t8580:  0x751E,\n\t8581:  0x7520,\n\t8582:  0x7521,\n\t8583:  0x7522,\n\t8584:  0x7523,\n\t8585:  0x7524,\n\t8586:  0x7526,\n\t8587:  0x7527,\n\t8588:  0x752A,\n\t8589:  0x752E,\n\t8590:  0x7534,\n\t8591:  0x7536,\n\t8592:  0x7539,\n\t8593:  0x753C,\n\t8594:  0x753D,\n\t8595:  0x753F,\n\t8596:  0x7541,\n\t8597:  0x7542,\n\t8598:  0x7543,\n\t8599:  0x7544,\n\t8600:  0x7546,\n\t8601:  0x7547,\n\t8602:  0x7549,\n\t8603:  0x754A,\n\t8604:  0x754D,\n\t8605:  0x7550,\n\t8606:  0x7551,\n\t8607:  0x7552,\n\t8608:  0x7553,\n\t8609:  0x7555,\n\t8610:  0x7556,\n\t8611:  0x7557,\n\t8612:  0x7558,\n\t8613:  0x755D,\n\t8614:  0x755E,\n\t8615:  0x755F,\n\t8616:  0x7560,\n\t8617:  0x7561,\n\t8618:  0x7562,\n\t8619:  0x7563,\n\t8620:  0x7564,\n\t8621:  0x7567,\n\t8622:  0x7568,\n\t8623:  0x7569,\n\t8624:  0x756B,\n\t8625:  0x756C,\n\t8626:  0x756D,\n\t8627:  0x756E,\n\t8628:  0x756F,\n\t8629:  0x7570,\n\t8630:  0x7571,\n\t8631:  0x7573,\n\t8632:  0x7575,\n\t8633:  0x7576,\n\t8634:  0x7577,\n\t8635:  0x757A,\n\t8636:  0x757B,\n\t8637:  0x757C,\n\t8638:  0x757D,\n\t8639:  0x757E,\n\t8640:  0x7580,\n\t8641:  0x7581,\n\t8642:  0x7582,\n\t8643:  0x7584,\n\t8644:  0x7585,\n\t8645:  0x7587,\n\t8740:  0x7588,\n\t8741:  0x7589,\n\t8742:  0x758A,\n\t8743:  0x758C,\n\t8744:  0x758D,\n\t8745:  0x758E,\n\t8746:  0x7590,\n\t8747:  0x7593,\n\t8748:  0x7595,\n\t8749:  0x7598,\n\t8750:  0x759B,\n\t8751:  0x759C,\n\t8752:  0x759E,\n\t8753:  0x75A2,\n\t8754:  0x75A6,\n\t8755:  0x75A7,\n\t8756:  0x75A8,\n\t8757:  0x75A9,\n\t8758:  0x75AA,\n\t8759:  0x75AD,\n\t8760:  0x75B6,\n\t8761:  0x75B7,\n\t8762:  0x75BA,\n\t8763:  0x75BB,\n\t8764:  0x75BF,\n\t8765:  0x75C0,\n\t8766:  0x75C1,\n\t8767:  0x75C6,\n\t8768:  0x75CB,\n\t8769:  0x75CC,\n\t8770:  0x75CE,\n\t8771:  0x75CF,\n\t8772:  0x75D0,\n\t8773:  0x75D1,\n\t8774:  0x75D3,\n\t8775:  0x75D7,\n\t8776:  0x75D9,\n\t8777:  0x75DA,\n\t8778:  0x75DC,\n\t8779:  0x75DD,\n\t8780:  0x75DF,\n\t8781:  0x75E0,\n\t8782:  0x75E1,\n\t8783:  0x75E5,\n\t8784:  0x75E9,\n\t8785:  0x75EC,\n\t8786:  0x75ED,\n\t8787:  0x75EE,\n\t8788:  0x75EF,\n\t8789:  0x75F2,\n\t8790:  0x75F3,\n\t8791:  0x75F5,\n\t8792:  0x75F6,\n\t8793:  0x75F7,\n\t8794:  0x75F8,\n\t8795:  0x75FA,\n\t8796:  0x75FB,\n\t8797:  0x75FD,\n\t8798:  0x75FE,\n\t8799:  0x7602,\n\t8800:  0x7604,\n\t8801:  0x7606,\n\t8802:  0x7607,\n\t8803:  0x7608,\n\t8804:  0x7609,\n\t8805:  0x760B,\n\t8806:  0x760D,\n\t8807:  0x760E,\n\t8808:  0x760F,\n\t8809:  0x7611,\n\t8810:  0x7612,\n\t8811:  0x7613,\n\t8812:  0x7614,\n\t8813:  0x7616,\n\t8814:  0x761A,\n\t8815:  0x761C,\n\t8816:  0x761D,\n\t8817:  0x761E,\n\t8818:  0x7621,\n\t8819:  0x7623,\n\t8820:  0x7627,\n\t8821:  0x7628,\n\t8822:  0x762C,\n\t8823:  0x762E,\n\t8824:  0x762F,\n\t8825:  0x7631,\n\t8826:  0x7632,\n\t8827:  0x7636,\n\t8828:  0x7637,\n\t8829:  0x7639,\n\t8830:  0x763A,\n\t8831:  0x763B,\n\t8832:  0x763D,\n\t8833:  0x7641,\n\t8834:  0x7642,\n\t8835:  0x7644,\n\t8930:  0x7645,\n\t8931:  0x7646,\n\t8932:  0x7647,\n\t8933:  0x7648,\n\t8934:  0x7649,\n\t8935:  0x764A,\n\t8936:  0x764B,\n\t8937:  0x764E,\n\t8938:  0x764F,\n\t8939:  0x7650,\n\t8940:  0x7651,\n\t8941:  0x7652,\n\t8942:  0x7653,\n\t8943:  0x7655,\n\t8944:  0x7657,\n\t8945:  0x7658,\n\t8946:  0x7659,\n\t8947:  0x765A,\n\t8948:  0x765B,\n\t8949:  0x765D,\n\t8950:  0x765F,\n\t8951:  0x7660,\n\t8952:  0x7661,\n\t8953:  0x7662,\n\t8954:  0x7664,\n\t8955:  0x7665,\n\t8956:  0x7666,\n\t8957:  0x7667,\n\t8958:  0x7668,\n\t8959:  0x7669,\n\t8960:  0x766A,\n\t8961:  0x766C,\n\t8962:  0x766D,\n\t8963:  0x766E,\n\t8964:  0x7670,\n\t8965:  0x7671,\n\t8966:  0x7672,\n\t8967:  0x7673,\n\t8968:  0x7674,\n\t8969:  0x7675,\n\t8970:  0x7676,\n\t8971:  0x7677,\n\t8972:  0x7679,\n\t8973:  0x767A,\n\t8974:  0x767C,\n\t8975:  0x767F,\n\t8976:  0x7680,\n\t8977:  0x7681,\n\t8978:  0x7683,\n\t8979:  0x7685,\n\t8980:  0x7689,\n\t8981:  0x768A,\n\t8982:  0x768C,\n\t8983:  0x768D,\n\t8984:  0x768F,\n\t8985:  0x7690,\n\t8986:  0x7692,\n\t8987:  0x7694,\n\t8988:  0x7695,\n\t8989:  0x7697,\n\t8990:  0x7698,\n\t8991:  0x769A,\n\t8992:  0x769B,\n\t8993:  0x769C,\n\t8994:  0x769D,\n\t8995:  0x769E,\n\t8996:  0x769F,\n\t8997:  0x76A0,\n\t8998:  0x76A1,\n\t8999:  0x76A2,\n\t9000:  0x76A3,\n\t9001:  0x76A5,\n\t9002:  0x76A6,\n\t9003:  0x76A7,\n\t9004:  0x76A8,\n\t9005:  0x76A9,\n\t9006:  0x76AA,\n\t9007:  0x76AB,\n\t9008:  0x76AC,\n\t9009:  0x76AD,\n\t9010:  0x76AF,\n\t9011:  0x76B0,\n\t9012:  0x76B3,\n\t9013:  0x76B5,\n\t9014:  0x76B6,\n\t9015:  0x76B7,\n\t9016:  0x76B8,\n\t9017:  0x76B9,\n\t9018:  0x76BA,\n\t9019:  0x76BB,\n\t9020:  0x76BC,\n\t9021:  0x76BD,\n\t9022:  0x76BE,\n\t9023:  0x76C0,\n\t9024:  0x76C1,\n\t9025:  0x76C3,\n\t9026:  0x554A,\n\t9027:  0x963F,\n\t9028:  0x57C3,\n\t9029:  0x6328,\n\t9030:  0x54CE,\n\t9031:  0x5509,\n\t9032:  0x54C0,\n\t9033:  0x7691,\n\t9034:  0x764C,\n\t9035:  0x853C,\n\t9036:  0x77EE,\n\t9037:  0x827E,\n\t9038:  0x788D,\n\t9039:  0x7231,\n\t9040:  0x9698,\n\t9041:  0x978D,\n\t9042:  0x6C28,\n\t9043:  0x5B89,\n\t9044:  0x4FFA,\n\t9045:  0x6309,\n\t9046:  0x6697,\n\t9047:  0x5CB8,\n\t9048:  0x80FA,\n\t9049:  0x6848,\n\t9050:  0x80AE,\n\t9051:  0x6602,\n\t9052:  0x76CE,\n\t9053:  0x51F9,\n\t9054:  0x6556,\n\t9055:  0x71AC,\n\t9056:  0x7FF1,\n\t9057:  0x8884,\n\t9058:  0x50B2,\n\t9059:  0x5965,\n\t9060:  0x61CA,\n\t9061:  0x6FB3,\n\t9062:  0x82AD,\n\t9063:  0x634C,\n\t9064:  0x6252,\n\t9065:  0x53ED,\n\t9066:  0x5427,\n\t9067:  0x7B06,\n\t9068:  0x516B,\n\t9069:  0x75A4,\n\t9070:  0x5DF4,\n\t9071:  0x62D4,\n\t9072:  0x8DCB,\n\t9073:  0x9776,\n\t9074:  0x628A,\n\t9075:  0x8019,\n\t9076:  0x575D,\n\t9077:  0x9738,\n\t9078:  0x7F62,\n\t9079:  0x7238,\n\t9080:  0x767D,\n\t9081:  0x67CF,\n\t9082:  0x767E,\n\t9083:  0x6446,\n\t9084:  0x4F70,\n\t9085:  0x8D25,\n\t9086:  0x62DC,\n\t9087:  0x7A17,\n\t9088:  0x6591,\n\t9089:  0x73ED,\n\t9090:  0x642C,\n\t9091:  0x6273,\n\t9092:  0x822C,\n\t9093:  0x9881,\n\t9094:  0x677F,\n\t9095:  0x7248,\n\t9096:  0x626E,\n\t9097:  0x62CC,\n\t9098:  0x4F34,\n\t9099:  0x74E3,\n\t9100:  0x534A,\n\t9101:  0x529E,\n\t9102:  0x7ECA,\n\t9103:  0x90A6,\n\t9104:  0x5E2E,\n\t9105:  0x6886,\n\t9106:  0x699C,\n\t9107:  0x8180,\n\t9108:  0x7ED1,\n\t9109:  0x68D2,\n\t9110:  0x78C5,\n\t9111:  0x868C,\n\t9112:  0x9551,\n\t9113:  0x508D,\n\t9114:  0x8C24,\n\t9115:  0x82DE,\n\t9116:  0x80DE,\n\t9117:  0x5305,\n\t9118:  0x8912,\n\t9119:  0x5265,\n\t9120:  0x76C4,\n\t9121:  0x76C7,\n\t9122:  0x76C9,\n\t9123:  0x76CB,\n\t9124:  0x76CC,\n\t9125:  0x76D3,\n\t9126:  0x76D5,\n\t9127:  0x76D9,\n\t9128:  0x76DA,\n\t9129:  0x76DC,\n\t9130:  0x76DD,\n\t9131:  0x76DE,\n\t9132:  0x76E0,\n\t9133:  0x76E1,\n\t9134:  0x76E2,\n\t9135:  0x76E3,\n\t9136:  0x76E4,\n\t9137:  0x76E6,\n\t9138:  0x76E7,\n\t9139:  0x76E8,\n\t9140:  0x76E9,\n\t9141:  0x76EA,\n\t9142:  0x76EB,\n\t9143:  0x76EC,\n\t9144:  0x76ED,\n\t9145:  0x76F0,\n\t9146:  0x76F3,\n\t9147:  0x76F5,\n\t9148:  0x76F6,\n\t9149:  0x76F7,\n\t9150:  0x76FA,\n\t9151:  0x76FB,\n\t9152:  0x76FD,\n\t9153:  0x76FF,\n\t9154:  0x7700,\n\t9155:  0x7702,\n\t9156:  0x7703,\n\t9157:  0x7705,\n\t9158:  0x7706,\n\t9159:  0x770A,\n\t9160:  0x770C,\n\t9161:  0x770E,\n\t9162:  0x770F,\n\t9163:  0x7710,\n\t9164:  0x7711,\n\t9165:  0x7712,\n\t9166:  0x7713,\n\t9167:  0x7714,\n\t9168:  0x7715,\n\t9169:  0x7716,\n\t9170:  0x7717,\n\t9171:  0x7718,\n\t9172:  0x771B,\n\t9173:  0x771C,\n\t9174:  0x771D,\n\t9175:  0x771E,\n\t9176:  0x7721,\n\t9177:  0x7723,\n\t9178:  0x7724,\n\t9179:  0x7725,\n\t9180:  0x7727,\n\t9181:  0x772A,\n\t9182:  0x772B,\n\t9183:  0x772C,\n\t9184:  0x772E,\n\t9185:  0x7730,\n\t9186:  0x7731,\n\t9187:  0x7732,\n\t9188:  0x7733,\n\t9189:  0x7734,\n\t9190:  0x7739,\n\t9191:  0x773B,\n\t9192:  0x773D,\n\t9193:  0x773E,\n\t9194:  0x773F,\n\t9195:  0x7742,\n\t9196:  0x7744,\n\t9197:  0x7745,\n\t9198:  0x7746,\n\t9199:  0x7748,\n\t9200:  0x7749,\n\t9201:  0x774A,\n\t9202:  0x774B,\n\t9203:  0x774C,\n\t9204:  0x774D,\n\t9205:  0x774E,\n\t9206:  0x774F,\n\t9207:  0x7752,\n\t9208:  0x7753,\n\t9209:  0x7754,\n\t9210:  0x7755,\n\t9211:  0x7756,\n\t9212:  0x7757,\n\t9213:  0x7758,\n\t9214:  0x7759,\n\t9215:  0x775C,\n\t9216:  0x8584,\n\t9217:  0x96F9,\n\t9218:  0x4FDD,\n\t9219:  0x5821,\n\t9220:  0x9971,\n\t9221:  0x5B9D,\n\t9222:  0x62B1,\n\t9223:  0x62A5,\n\t9224:  0x66B4,\n\t9225:  0x8C79,\n\t9226:  0x9C8D,\n\t9227:  0x7206,\n\t9228:  0x676F,\n\t9229:  0x7891,\n\t9230:  0x60B2,\n\t9231:  0x5351,\n\t9232:  0x5317,\n\t9233:  0x8F88,\n\t9234:  0x80CC,\n\t9235:  0x8D1D,\n\t9236:  0x94A1,\n\t9237:  0x500D,\n\t9238:  0x72C8,\n\t9239:  0x5907,\n\t9240:  0x60EB,\n\t9241:  0x7119,\n\t9242:  0x88AB,\n\t9243:  0x5954,\n\t9244:  0x82EF,\n\t9245:  0x672C,\n\t9246:  0x7B28,\n\t9247:  0x5D29,\n\t9248:  0x7EF7,\n\t9249:  0x752D,\n\t9250:  0x6CF5,\n\t9251:  0x8E66,\n\t9252:  0x8FF8,\n\t9253:  0x903C,\n\t9254:  0x9F3B,\n\t9255:  0x6BD4,\n\t9256:  0x9119,\n\t9257:  0x7B14,\n\t9258:  0x5F7C,\n\t9259:  0x78A7,\n\t9260:  0x84D6,\n\t9261:  0x853D,\n\t9262:  0x6BD5,\n\t9263:  0x6BD9,\n\t9264:  0x6BD6,\n\t9265:  0x5E01,\n\t9266:  0x5E87,\n\t9267:  0x75F9,\n\t9268:  0x95ED,\n\t9269:  0x655D,\n\t9270:  0x5F0A,\n\t9271:  0x5FC5,\n\t9272:  0x8F9F,\n\t9273:  0x58C1,\n\t9274:  0x81C2,\n\t9275:  0x907F,\n\t9276:  0x965B,\n\t9277:  0x97AD,\n\t9278:  0x8FB9,\n\t9279:  0x7F16,\n\t9280:  0x8D2C,\n\t9281:  0x6241,\n\t9282:  0x4FBF,\n\t9283:  0x53D8,\n\t9284:  0x535E,\n\t9285:  0x8FA8,\n\t9286:  0x8FA9,\n\t9287:  0x8FAB,\n\t9288:  0x904D,\n\t9289:  0x6807,\n\t9290:  0x5F6A,\n\t9291:  0x8198,\n\t9292:  0x8868,\n\t9293:  0x9CD6,\n\t9294:  0x618B,\n\t9295:  0x522B,\n\t9296:  0x762A,\n\t9297:  0x5F6C,\n\t9298:  0x658C,\n\t9299:  0x6FD2,\n\t9300:  0x6EE8,\n\t9301:  0x5BBE,\n\t9302:  0x6448,\n\t9303:  0x5175,\n\t9304:  0x51B0,\n\t9305:  0x67C4,\n\t9306:  0x4E19,\n\t9307:  0x79C9,\n\t9308:  0x997C,\n\t9309:  0x70B3,\n\t9310:  0x775D,\n\t9311:  0x775E,\n\t9312:  0x775F,\n\t9313:  0x7760,\n\t9314:  0x7764,\n\t9315:  0x7767,\n\t9316:  0x7769,\n\t9317:  0x776A,\n\t9318:  0x776D,\n\t9319:  0x776E,\n\t9320:  0x776F,\n\t9321:  0x7770,\n\t9322:  0x7771,\n\t9323:  0x7772,\n\t9324:  0x7773,\n\t9325:  0x7774,\n\t9326:  0x7775,\n\t9327:  0x7776,\n\t9328:  0x7777,\n\t9329:  0x7778,\n\t9330:  0x777A,\n\t9331:  0x777B,\n\t9332:  0x777C,\n\t9333:  0x7781,\n\t9334:  0x7782,\n\t9335:  0x7783,\n\t9336:  0x7786,\n\t9337:  0x7787,\n\t9338:  0x7788,\n\t9339:  0x7789,\n\t9340:  0x778A,\n\t9341:  0x778B,\n\t9342:  0x778F,\n\t9343:  0x7790,\n\t9344:  0x7793,\n\t9345:  0x7794,\n\t9346:  0x7795,\n\t9347:  0x7796,\n\t9348:  0x7797,\n\t9349:  0x7798,\n\t9350:  0x7799,\n\t9351:  0x779A,\n\t9352:  0x779B,\n\t9353:  0x779C,\n\t9354:  0x779D,\n\t9355:  0x779E,\n\t9356:  0x77A1,\n\t9357:  0x77A3,\n\t9358:  0x77A4,\n\t9359:  0x77A6,\n\t9360:  0x77A8,\n\t9361:  0x77AB,\n\t9362:  0x77AD,\n\t9363:  0x77AE,\n\t9364:  0x77AF,\n\t9365:  0x77B1,\n\t9366:  0x77B2,\n\t9367:  0x77B4,\n\t9368:  0x77B6,\n\t9369:  0x77B7,\n\t9370:  0x77B8,\n\t9371:  0x77B9,\n\t9372:  0x77BA,\n\t9373:  0x77BC,\n\t9374:  0x77BE,\n\t9375:  0x77C0,\n\t9376:  0x77C1,\n\t9377:  0x77C2,\n\t9378:  0x77C3,\n\t9379:  0x77C4,\n\t9380:  0x77C5,\n\t9381:  0x77C6,\n\t9382:  0x77C7,\n\t9383:  0x77C8,\n\t9384:  0x77C9,\n\t9385:  0x77CA,\n\t9386:  0x77CB,\n\t9387:  0x77CC,\n\t9388:  0x77CE,\n\t9389:  0x77CF,\n\t9390:  0x77D0,\n\t9391:  0x77D1,\n\t9392:  0x77D2,\n\t9393:  0x77D3,\n\t9394:  0x77D4,\n\t9395:  0x77D5,\n\t9396:  0x77D6,\n\t9397:  0x77D8,\n\t9398:  0x77D9,\n\t9399:  0x77DA,\n\t9400:  0x77DD,\n\t9401:  0x77DE,\n\t9402:  0x77DF,\n\t9403:  0x77E0,\n\t9404:  0x77E1,\n\t9405:  0x77E4,\n\t9406:  0x75C5,\n\t9407:  0x5E76,\n\t9408:  0x73BB,\n\t9409:  0x83E0,\n\t9410:  0x64AD,\n\t9411:  0x62E8,\n\t9412:  0x94B5,\n\t9413:  0x6CE2,\n\t9414:  0x535A,\n\t9415:  0x52C3,\n\t9416:  0x640F,\n\t9417:  0x94C2,\n\t9418:  0x7B94,\n\t9419:  0x4F2F,\n\t9420:  0x5E1B,\n\t9421:  0x8236,\n\t9422:  0x8116,\n\t9423:  0x818A,\n\t9424:  0x6E24,\n\t9425:  0x6CCA,\n\t9426:  0x9A73,\n\t9427:  0x6355,\n\t9428:  0x535C,\n\t9429:  0x54FA,\n\t9430:  0x8865,\n\t9431:  0x57E0,\n\t9432:  0x4E0D,\n\t9433:  0x5E03,\n\t9434:  0x6B65,\n\t9435:  0x7C3F,\n\t9436:  0x90E8,\n\t9437:  0x6016,\n\t9438:  0x64E6,\n\t9439:  0x731C,\n\t9440:  0x88C1,\n\t9441:  0x6750,\n\t9442:  0x624D,\n\t9443:  0x8D22,\n\t9444:  0x776C,\n\t9445:  0x8E29,\n\t9446:  0x91C7,\n\t9447:  0x5F69,\n\t9448:  0x83DC,\n\t9449:  0x8521,\n\t9450:  0x9910,\n\t9451:  0x53C2,\n\t9452:  0x8695,\n\t9453:  0x6B8B,\n\t9454:  0x60ED,\n\t9455:  0x60E8,\n\t9456:  0x707F,\n\t9457:  0x82CD,\n\t9458:  0x8231,\n\t9459:  0x4ED3,\n\t9460:  0x6CA7,\n\t9461:  0x85CF,\n\t9462:  0x64CD,\n\t9463:  0x7CD9,\n\t9464:  0x69FD,\n\t9465:  0x66F9,\n\t9466:  0x8349,\n\t9467:  0x5395,\n\t9468:  0x7B56,\n\t9469:  0x4FA7,\n\t9470:  0x518C,\n\t9471:  0x6D4B,\n\t9472:  0x5C42,\n\t9473:  0x8E6D,\n\t9474:  0x63D2,\n\t9475:  0x53C9,\n\t9476:  0x832C,\n\t9477:  0x8336,\n\t9478:  0x67E5,\n\t9479:  0x78B4,\n\t9480:  0x643D,\n\t9481:  0x5BDF,\n\t9482:  0x5C94,\n\t9483:  0x5DEE,\n\t9484:  0x8BE7,\n\t9485:  0x62C6,\n\t9486:  0x67F4,\n\t9487:  0x8C7A,\n\t9488:  0x6400,\n\t9489:  0x63BA,\n\t9490:  0x8749,\n\t9491:  0x998B,\n\t9492:  0x8C17,\n\t9493:  0x7F20,\n\t9494:  0x94F2,\n\t9495:  0x4EA7,\n\t9496:  0x9610,\n\t9497:  0x98A4,\n\t9498:  0x660C,\n\t9499:  0x7316,\n\t9500:  0x77E6,\n\t9501:  0x77E8,\n\t9502:  0x77EA,\n\t9503:  0x77EF,\n\t9504:  0x77F0,\n\t9505:  0x77F1,\n\t9506:  0x77F2,\n\t9507:  0x77F4,\n\t9508:  0x77F5,\n\t9509:  0x77F7,\n\t9510:  0x77F9,\n\t9511:  0x77FA,\n\t9512:  0x77FB,\n\t9513:  0x77FC,\n\t9514:  0x7803,\n\t9515:  0x7804,\n\t9516:  0x7805,\n\t9517:  0x7806,\n\t9518:  0x7807,\n\t9519:  0x7808,\n\t9520:  0x780A,\n\t9521:  0x780B,\n\t9522:  0x780E,\n\t9523:  0x780F,\n\t9524:  0x7810,\n\t9525:  0x7813,\n\t9526:  0x7815,\n\t9527:  0x7819,\n\t9528:  0x781B,\n\t9529:  0x781E,\n\t9530:  0x7820,\n\t9531:  0x7821,\n\t9532:  0x7822,\n\t9533:  0x7824,\n\t9534:  0x7828,\n\t9535:  0x782A,\n\t9536:  0x782B,\n\t9537:  0x782E,\n\t9538:  0x782F,\n\t9539:  0x7831,\n\t9540:  0x7832,\n\t9541:  0x7833,\n\t9542:  0x7835,\n\t9543:  0x7836,\n\t9544:  0x783D,\n\t9545:  0x783F,\n\t9546:  0x7841,\n\t9547:  0x7842,\n\t9548:  0x7843,\n\t9549:  0x7844,\n\t9550:  0x7846,\n\t9551:  0x7848,\n\t9552:  0x7849,\n\t9553:  0x784A,\n\t9554:  0x784B,\n\t9555:  0x784D,\n\t9556:  0x784F,\n\t9557:  0x7851,\n\t9558:  0x7853,\n\t9559:  0x7854,\n\t9560:  0x7858,\n\t9561:  0x7859,\n\t9562:  0x785A,\n\t9563:  0x785B,\n\t9564:  0x785C,\n\t9565:  0x785E,\n\t9566:  0x785F,\n\t9567:  0x7860,\n\t9568:  0x7861,\n\t9569:  0x7862,\n\t9570:  0x7863,\n\t9571:  0x7864,\n\t9572:  0x7865,\n\t9573:  0x7866,\n\t9574:  0x7867,\n\t9575:  0x7868,\n\t9576:  0x7869,\n\t9577:  0x786F,\n\t9578:  0x7870,\n\t9579:  0x7871,\n\t9580:  0x7872,\n\t9581:  0x7873,\n\t9582:  0x7874,\n\t9583:  0x7875,\n\t9584:  0x7876,\n\t9585:  0x7878,\n\t9586:  0x7879,\n\t9587:  0x787A,\n\t9588:  0x787B,\n\t9589:  0x787D,\n\t9590:  0x787E,\n\t9591:  0x787F,\n\t9592:  0x7880,\n\t9593:  0x7881,\n\t9594:  0x7882,\n\t9595:  0x7883,\n\t9596:  0x573A,\n\t9597:  0x5C1D,\n\t9598:  0x5E38,\n\t9599:  0x957F,\n\t9600:  0x507F,\n\t9601:  0x80A0,\n\t9602:  0x5382,\n\t9603:  0x655E,\n\t9604:  0x7545,\n\t9605:  0x5531,\n\t9606:  0x5021,\n\t9607:  0x8D85,\n\t9608:  0x6284,\n\t9609:  0x949E,\n\t9610:  0x671D,\n\t9611:  0x5632,\n\t9612:  0x6F6E,\n\t9613:  0x5DE2,\n\t9614:  0x5435,\n\t9615:  0x7092,\n\t9616:  0x8F66,\n\t9617:  0x626F,\n\t9618:  0x64A4,\n\t9619:  0x63A3,\n\t9620:  0x5F7B,\n\t9621:  0x6F88,\n\t9622:  0x90F4,\n\t9623:  0x81E3,\n\t9624:  0x8FB0,\n\t9625:  0x5C18,\n\t9626:  0x6668,\n\t9627:  0x5FF1,\n\t9628:  0x6C89,\n\t9629:  0x9648,\n\t9630:  0x8D81,\n\t9631:  0x886C,\n\t9632:  0x6491,\n\t9633:  0x79F0,\n\t9634:  0x57CE,\n\t9635:  0x6A59,\n\t9636:  0x6210,\n\t9637:  0x5448,\n\t9638:  0x4E58,\n\t9639:  0x7A0B,\n\t9640:  0x60E9,\n\t9641:  0x6F84,\n\t9642:  0x8BDA,\n\t9643:  0x627F,\n\t9644:  0x901E,\n\t9645:  0x9A8B,\n\t9646:  0x79E4,\n\t9647:  0x5403,\n\t9648:  0x75F4,\n\t9649:  0x6301,\n\t9650:  0x5319,\n\t9651:  0x6C60,\n\t9652:  0x8FDF,\n\t9653:  0x5F1B,\n\t9654:  0x9A70,\n\t9655:  0x803B,\n\t9656:  0x9F7F,\n\t9657:  0x4F88,\n\t9658:  0x5C3A,\n\t9659:  0x8D64,\n\t9660:  0x7FC5,\n\t9661:  0x65A5,\n\t9662:  0x70BD,\n\t9663:  0x5145,\n\t9664:  0x51B2,\n\t9665:  0x866B,\n\t9666:  0x5D07,\n\t9667:  0x5BA0,\n\t9668:  0x62BD,\n\t9669:  0x916C,\n\t9670:  0x7574,\n\t9671:  0x8E0C,\n\t9672:  0x7A20,\n\t9673:  0x6101,\n\t9674:  0x7B79,\n\t9675:  0x4EC7,\n\t9676:  0x7EF8,\n\t9677:  0x7785,\n\t9678:  0x4E11,\n\t9679:  0x81ED,\n\t9680:  0x521D,\n\t9681:  0x51FA,\n\t9682:  0x6A71,\n\t9683:  0x53A8,\n\t9684:  0x8E87,\n\t9685:  0x9504,\n\t9686:  0x96CF,\n\t9687:  0x6EC1,\n\t9688:  0x9664,\n\t9689:  0x695A,\n\t9690:  0x7884,\n\t9691:  0x7885,\n\t9692:  0x7886,\n\t9693:  0x7888,\n\t9694:  0x788A,\n\t9695:  0x788B,\n\t9696:  0x788F,\n\t9697:  0x7890,\n\t9698:  0x7892,\n\t9699:  0x7894,\n\t9700:  0x7895,\n\t9701:  0x7896,\n\t9702:  0x7899,\n\t9703:  0x789D,\n\t9704:  0x789E,\n\t9705:  0x78A0,\n\t9706:  0x78A2,\n\t9707:  0x78A4,\n\t9708:  0x78A6,\n\t9709:  0x78A8,\n\t9710:  0x78A9,\n\t9711:  0x78AA,\n\t9712:  0x78AB,\n\t9713:  0x78AC,\n\t9714:  0x78AD,\n\t9715:  0x78AE,\n\t9716:  0x78AF,\n\t9717:  0x78B5,\n\t9718:  0x78B6,\n\t9719:  0x78B7,\n\t9720:  0x78B8,\n\t9721:  0x78BA,\n\t9722:  0x78BB,\n\t9723:  0x78BC,\n\t9724:  0x78BD,\n\t9725:  0x78BF,\n\t9726:  0x78C0,\n\t9727:  0x78C2,\n\t9728:  0x78C3,\n\t9729:  0x78C4,\n\t9730:  0x78C6,\n\t9731:  0x78C7,\n\t9732:  0x78C8,\n\t9733:  0x78CC,\n\t9734:  0x78CD,\n\t9735:  0x78CE,\n\t9736:  0x78CF,\n\t9737:  0x78D1,\n\t9738:  0x78D2,\n\t9739:  0x78D3,\n\t9740:  0x78D6,\n\t9741:  0x78D7,\n\t9742:  0x78D8,\n\t9743:  0x78DA,\n\t9744:  0x78DB,\n\t9745:  0x78DC,\n\t9746:  0x78DD,\n\t9747:  0x78DE,\n\t9748:  0x78DF,\n\t9749:  0x78E0,\n\t9750:  0x78E1,\n\t9751:  0x78E2,\n\t9752:  0x78E3,\n\t9753:  0x78E4,\n\t9754:  0x78E5,\n\t9755:  0x78E6,\n\t9756:  0x78E7,\n\t9757:  0x78E9,\n\t9758:  0x78EA,\n\t9759:  0x78EB,\n\t9760:  0x78ED,\n\t9761:  0x78EE,\n\t9762:  0x78EF,\n\t9763:  0x78F0,\n\t9764:  0x78F1,\n\t9765:  0x78F3,\n\t9766:  0x78F5,\n\t9767:  0x78F6,\n\t9768:  0x78F8,\n\t9769:  0x78F9,\n\t9770:  0x78FB,\n\t9771:  0x78FC,\n\t9772:  0x78FD,\n\t9773:  0x78FE,\n\t9774:  0x78FF,\n\t9775:  0x7900,\n\t9776:  0x7902,\n\t9777:  0x7903,\n\t9778:  0x7904,\n\t9779:  0x7906,\n\t9780:  0x7907,\n\t9781:  0x7908,\n\t9782:  0x7909,\n\t9783:  0x790A,\n\t9784:  0x790B,\n\t9785:  0x790C,\n\t9786:  0x7840,\n\t9787:  0x50A8,\n\t9788:  0x77D7,\n\t9789:  0x6410,\n\t9790:  0x89E6,\n\t9791:  0x5904,\n\t9792:  0x63E3,\n\t9793:  0x5DDD,\n\t9794:  0x7A7F,\n\t9795:  0x693D,\n\t9796:  0x4F20,\n\t9797:  0x8239,\n\t9798:  0x5598,\n\t9799:  0x4E32,\n\t9800:  0x75AE,\n\t9801:  0x7A97,\n\t9802:  0x5E62,\n\t9803:  0x5E8A,\n\t9804:  0x95EF,\n\t9805:  0x521B,\n\t9806:  0x5439,\n\t9807:  0x708A,\n\t9808:  0x6376,\n\t9809:  0x9524,\n\t9810:  0x5782,\n\t9811:  0x6625,\n\t9812:  0x693F,\n\t9813:  0x9187,\n\t9814:  0x5507,\n\t9815:  0x6DF3,\n\t9816:  0x7EAF,\n\t9817:  0x8822,\n\t9818:  0x6233,\n\t9819:  0x7EF0,\n\t9820:  0x75B5,\n\t9821:  0x8328,\n\t9822:  0x78C1,\n\t9823:  0x96CC,\n\t9824:  0x8F9E,\n\t9825:  0x6148,\n\t9826:  0x74F7,\n\t9827:  0x8BCD,\n\t9828:  0x6B64,\n\t9829:  0x523A,\n\t9830:  0x8D50,\n\t9831:  0x6B21,\n\t9832:  0x806A,\n\t9833:  0x8471,\n\t9834:  0x56F1,\n\t9835:  0x5306,\n\t9836:  0x4ECE,\n\t9837:  0x4E1B,\n\t9838:  0x51D1,\n\t9839:  0x7C97,\n\t9840:  0x918B,\n\t9841:  0x7C07,\n\t9842:  0x4FC3,\n\t9843:  0x8E7F,\n\t9844:  0x7BE1,\n\t9845:  0x7A9C,\n\t9846:  0x6467,\n\t9847:  0x5D14,\n\t9848:  0x50AC,\n\t9849:  0x8106,\n\t9850:  0x7601,\n\t9851:  0x7CB9,\n\t9852:  0x6DEC,\n\t9853:  0x7FE0,\n\t9854:  0x6751,\n\t9855:  0x5B58,\n\t9856:  0x5BF8,\n\t9857:  0x78CB,\n\t9858:  0x64AE,\n\t9859:  0x6413,\n\t9860:  0x63AA,\n\t9861:  0x632B,\n\t9862:  0x9519,\n\t9863:  0x642D,\n\t9864:  0x8FBE,\n\t9865:  0x7B54,\n\t9866:  0x7629,\n\t9867:  0x6253,\n\t9868:  0x5927,\n\t9869:  0x5446,\n\t9870:  0x6B79,\n\t9871:  0x50A3,\n\t9872:  0x6234,\n\t9873:  0x5E26,\n\t9874:  0x6B86,\n\t9875:  0x4EE3,\n\t9876:  0x8D37,\n\t9877:  0x888B,\n\t9878:  0x5F85,\n\t9879:  0x902E,\n\t9880:  0x790D,\n\t9881:  0x790E,\n\t9882:  0x790F,\n\t9883:  0x7910,\n\t9884:  0x7911,\n\t9885:  0x7912,\n\t9886:  0x7914,\n\t9887:  0x7915,\n\t9888:  0x7916,\n\t9889:  0x7917,\n\t9890:  0x7918,\n\t9891:  0x7919,\n\t9892:  0x791A,\n\t9893:  0x791B,\n\t9894:  0x791C,\n\t9895:  0x791D,\n\t9896:  0x791F,\n\t9897:  0x7920,\n\t9898:  0x7921,\n\t9899:  0x7922,\n\t9900:  0x7923,\n\t9901:  0x7925,\n\t9902:  0x7926,\n\t9903:  0x7927,\n\t9904:  0x7928,\n\t9905:  0x7929,\n\t9906:  0x792A,\n\t9907:  0x792B,\n\t9908:  0x792C,\n\t9909:  0x792D,\n\t9910:  0x792E,\n\t9911:  0x792F,\n\t9912:  0x7930,\n\t9913:  0x7931,\n\t9914:  0x7932,\n\t9915:  0x7933,\n\t9916:  0x7935,\n\t9917:  0x7936,\n\t9918:  0x7937,\n\t9919:  0x7938,\n\t9920:  0x7939,\n\t9921:  0x793D,\n\t9922:  0x793F,\n\t9923:  0x7942,\n\t9924:  0x7943,\n\t9925:  0x7944,\n\t9926:  0x7945,\n\t9927:  0x7947,\n\t9928:  0x794A,\n\t9929:  0x794B,\n\t9930:  0x794C,\n\t9931:  0x794D,\n\t9932:  0x794E,\n\t9933:  0x794F,\n\t9934:  0x7950,\n\t9935:  0x7951,\n\t9936:  0x7952,\n\t9937:  0x7954,\n\t9938:  0x7955,\n\t9939:  0x7958,\n\t9940:  0x7959,\n\t9941:  0x7961,\n\t9942:  0x7963,\n\t9943:  0x7964,\n\t9944:  0x7966,\n\t9945:  0x7969,\n\t9946:  0x796A,\n\t9947:  0x796B,\n\t9948:  0x796C,\n\t9949:  0x796E,\n\t9950:  0x7970,\n\t9951:  0x7971,\n\t9952:  0x7972,\n\t9953:  0x7973,\n\t9954:  0x7974,\n\t9955:  0x7975,\n\t9956:  0x7976,\n\t9957:  0x7979,\n\t9958:  0x797B,\n\t9959:  0x797C,\n\t9960:  0x797D,\n\t9961:  0x797E,\n\t9962:  0x797F,\n\t9963:  0x7982,\n\t9964:  0x7983,\n\t9965:  0x7986,\n\t9966:  0x7987,\n\t9967:  0x7988,\n\t9968:  0x7989,\n\t9969:  0x798B,\n\t9970:  0x798C,\n\t9971:  0x798D,\n\t9972:  0x798E,\n\t9973:  0x7990,\n\t9974:  0x7991,\n\t9975:  0x7992,\n\t9976:  0x6020,\n\t9977:  0x803D,\n\t9978:  0x62C5,\n\t9979:  0x4E39,\n\t9980:  0x5355,\n\t9981:  0x90F8,\n\t9982:  0x63B8,\n\t9983:  0x80C6,\n\t9984:  0x65E6,\n\t9985:  0x6C2E,\n\t9986:  0x4F46,\n\t9987:  0x60EE,\n\t9988:  0x6DE1,\n\t9989:  0x8BDE,\n\t9990:  0x5F39,\n\t9991:  0x86CB,\n\t9992:  0x5F53,\n\t9993:  0x6321,\n\t9994:  0x515A,\n\t9995:  0x8361,\n\t9996:  0x6863,\n\t9997:  0x5200,\n\t9998:  0x6363,\n\t9999:  0x8E48,\n\t10000: 0x5012,\n\t10001: 0x5C9B,\n\t10002: 0x7977,\n\t10003: 0x5BFC,\n\t10004: 0x5230,\n\t10005: 0x7A3B,\n\t10006: 0x60BC,\n\t10007: 0x9053,\n\t10008: 0x76D7,\n\t10009: 0x5FB7,\n\t10010: 0x5F97,\n\t10011: 0x7684,\n\t10012: 0x8E6C,\n\t10013: 0x706F,\n\t10014: 0x767B,\n\t10015: 0x7B49,\n\t10016: 0x77AA,\n\t10017: 0x51F3,\n\t10018: 0x9093,\n\t10019: 0x5824,\n\t10020: 0x4F4E,\n\t10021: 0x6EF4,\n\t10022: 0x8FEA,\n\t10023: 0x654C,\n\t10024: 0x7B1B,\n\t10025: 0x72C4,\n\t10026: 0x6DA4,\n\t10027: 0x7FDF,\n\t10028: 0x5AE1,\n\t10029: 0x62B5,\n\t10030: 0x5E95,\n\t10031: 0x5730,\n\t10032: 0x8482,\n\t10033: 0x7B2C,\n\t10034: 0x5E1D,\n\t10035: 0x5F1F,\n\t10036: 0x9012,\n\t10037: 0x7F14,\n\t10038: 0x98A0,\n\t10039: 0x6382,\n\t10040: 0x6EC7,\n\t10041: 0x7898,\n\t10042: 0x70B9,\n\t10043: 0x5178,\n\t10044: 0x975B,\n\t10045: 0x57AB,\n\t10046: 0x7535,\n\t10047: 0x4F43,\n\t10048: 0x7538,\n\t10049: 0x5E97,\n\t10050: 0x60E6,\n\t10051: 0x5960,\n\t10052: 0x6DC0,\n\t10053: 0x6BBF,\n\t10054: 0x7889,\n\t10055: 0x53FC,\n\t10056: 0x96D5,\n\t10057: 0x51CB,\n\t10058: 0x5201,\n\t10059: 0x6389,\n\t10060: 0x540A,\n\t10061: 0x9493,\n\t10062: 0x8C03,\n\t10063: 0x8DCC,\n\t10064: 0x7239,\n\t10065: 0x789F,\n\t10066: 0x8776,\n\t10067: 0x8FED,\n\t10068: 0x8C0D,\n\t10069: 0x53E0,\n\t10070: 0x7993,\n\t10071: 0x7994,\n\t10072: 0x7995,\n\t10073: 0x7996,\n\t10074: 0x7997,\n\t10075: 0x7998,\n\t10076: 0x7999,\n\t10077: 0x799B,\n\t10078: 0x799C,\n\t10079: 0x799D,\n\t10080: 0x799E,\n\t10081: 0x799F,\n\t10082: 0x79A0,\n\t10083: 0x79A1,\n\t10084: 0x79A2,\n\t10085: 0x79A3,\n\t10086: 0x79A4,\n\t10087: 0x79A5,\n\t10088: 0x79A6,\n\t10089: 0x79A8,\n\t10090: 0x79A9,\n\t10091: 0x79AA,\n\t10092: 0x79AB,\n\t10093: 0x79AC,\n\t10094: 0x79AD,\n\t10095: 0x79AE,\n\t10096: 0x79AF,\n\t10097: 0x79B0,\n\t10098: 0x79B1,\n\t10099: 0x79B2,\n\t10100: 0x79B4,\n\t10101: 0x79B5,\n\t10102: 0x79B6,\n\t10103: 0x79B7,\n\t10104: 0x79B8,\n\t10105: 0x79BC,\n\t10106: 0x79BF,\n\t10107: 0x79C2,\n\t10108: 0x79C4,\n\t10109: 0x79C5,\n\t10110: 0x79C7,\n\t10111: 0x79C8,\n\t10112: 0x79CA,\n\t10113: 0x79CC,\n\t10114: 0x79CE,\n\t10115: 0x79CF,\n\t10116: 0x79D0,\n\t10117: 0x79D3,\n\t10118: 0x79D4,\n\t10119: 0x79D6,\n\t10120: 0x79D7,\n\t10121: 0x79D9,\n\t10122: 0x79DA,\n\t10123: 0x79DB,\n\t10124: 0x79DC,\n\t10125: 0x79DD,\n\t10126: 0x79DE,\n\t10127: 0x79E0,\n\t10128: 0x79E1,\n\t10129: 0x79E2,\n\t10130: 0x79E5,\n\t10131: 0x79E8,\n\t10132: 0x79EA,\n\t10133: 0x79EC,\n\t10134: 0x79EE,\n\t10135: 0x79F1,\n\t10136: 0x79F2,\n\t10137: 0x79F3,\n\t10138: 0x79F4,\n\t10139: 0x79F5,\n\t10140: 0x79F6,\n\t10141: 0x79F7,\n\t10142: 0x79F9,\n\t10143: 0x79FA,\n\t10144: 0x79FC,\n\t10145: 0x79FE,\n\t10146: 0x79FF,\n\t10147: 0x7A01,\n\t10148: 0x7A04,\n\t10149: 0x7A05,\n\t10150: 0x7A07,\n\t10151: 0x7A08,\n\t10152: 0x7A09,\n\t10153: 0x7A0A,\n\t10154: 0x7A0C,\n\t10155: 0x7A0F,\n\t10156: 0x7A10,\n\t10157: 0x7A11,\n\t10158: 0x7A12,\n\t10159: 0x7A13,\n\t10160: 0x7A15,\n\t10161: 0x7A16,\n\t10162: 0x7A18,\n\t10163: 0x7A19,\n\t10164: 0x7A1B,\n\t10165: 0x7A1C,\n\t10166: 0x4E01,\n\t10167: 0x76EF,\n\t10168: 0x53EE,\n\t10169: 0x9489,\n\t10170: 0x9876,\n\t10171: 0x9F0E,\n\t10172: 0x952D,\n\t10173: 0x5B9A,\n\t10174: 0x8BA2,\n\t10175: 0x4E22,\n\t10176: 0x4E1C,\n\t10177: 0x51AC,\n\t10178: 0x8463,\n\t10179: 0x61C2,\n\t10180: 0x52A8,\n\t10181: 0x680B,\n\t10182: 0x4F97,\n\t10183: 0x606B,\n\t10184: 0x51BB,\n\t10185: 0x6D1E,\n\t10186: 0x515C,\n\t10187: 0x6296,\n\t10188: 0x6597,\n\t10189: 0x9661,\n\t10190: 0x8C46,\n\t10191: 0x9017,\n\t10192: 0x75D8,\n\t10193: 0x90FD,\n\t10194: 0x7763,\n\t10195: 0x6BD2,\n\t10196: 0x728A,\n\t10197: 0x72EC,\n\t10198: 0x8BFB,\n\t10199: 0x5835,\n\t10200: 0x7779,\n\t10201: 0x8D4C,\n\t10202: 0x675C,\n\t10203: 0x9540,\n\t10204: 0x809A,\n\t10205: 0x5EA6,\n\t10206: 0x6E21,\n\t10207: 0x5992,\n\t10208: 0x7AEF,\n\t10209: 0x77ED,\n\t10210: 0x953B,\n\t10211: 0x6BB5,\n\t10212: 0x65AD,\n\t10213: 0x7F0E,\n\t10214: 0x5806,\n\t10215: 0x5151,\n\t10216: 0x961F,\n\t10217: 0x5BF9,\n\t10218: 0x58A9,\n\t10219: 0x5428,\n\t10220: 0x8E72,\n\t10221: 0x6566,\n\t10222: 0x987F,\n\t10223: 0x56E4,\n\t10224: 0x949D,\n\t10225: 0x76FE,\n\t10226: 0x9041,\n\t10227: 0x6387,\n\t10228: 0x54C6,\n\t10229: 0x591A,\n\t10230: 0x593A,\n\t10231: 0x579B,\n\t10232: 0x8EB2,\n\t10233: 0x6735,\n\t10234: 0x8DFA,\n\t10235: 0x8235,\n\t10236: 0x5241,\n\t10237: 0x60F0,\n\t10238: 0x5815,\n\t10239: 0x86FE,\n\t10240: 0x5CE8,\n\t10241: 0x9E45,\n\t10242: 0x4FC4,\n\t10243: 0x989D,\n\t10244: 0x8BB9,\n\t10245: 0x5A25,\n\t10246: 0x6076,\n\t10247: 0x5384,\n\t10248: 0x627C,\n\t10249: 0x904F,\n\t10250: 0x9102,\n\t10251: 0x997F,\n\t10252: 0x6069,\n\t10253: 0x800C,\n\t10254: 0x513F,\n\t10255: 0x8033,\n\t10256: 0x5C14,\n\t10257: 0x9975,\n\t10258: 0x6D31,\n\t10259: 0x4E8C,\n\t10260: 0x7A1D,\n\t10261: 0x7A1F,\n\t10262: 0x7A21,\n\t10263: 0x7A22,\n\t10264: 0x7A24,\n\t10265: 0x7A25,\n\t10266: 0x7A26,\n\t10267: 0x7A27,\n\t10268: 0x7A28,\n\t10269: 0x7A29,\n\t10270: 0x7A2A,\n\t10271: 0x7A2B,\n\t10272: 0x7A2C,\n\t10273: 0x7A2D,\n\t10274: 0x7A2E,\n\t10275: 0x7A2F,\n\t10276: 0x7A30,\n\t10277: 0x7A31,\n\t10278: 0x7A32,\n\t10279: 0x7A34,\n\t10280: 0x7A35,\n\t10281: 0x7A36,\n\t10282: 0x7A38,\n\t10283: 0x7A3A,\n\t10284: 0x7A3E,\n\t10285: 0x7A40,\n\t10286: 0x7A41,\n\t10287: 0x7A42,\n\t10288: 0x7A43,\n\t10289: 0x7A44,\n\t10290: 0x7A45,\n\t10291: 0x7A47,\n\t10292: 0x7A48,\n\t10293: 0x7A49,\n\t10294: 0x7A4A,\n\t10295: 0x7A4B,\n\t10296: 0x7A4C,\n\t10297: 0x7A4D,\n\t10298: 0x7A4E,\n\t10299: 0x7A4F,\n\t10300: 0x7A50,\n\t10301: 0x7A52,\n\t10302: 0x7A53,\n\t10303: 0x7A54,\n\t10304: 0x7A55,\n\t10305: 0x7A56,\n\t10306: 0x7A58,\n\t10307: 0x7A59,\n\t10308: 0x7A5A,\n\t10309: 0x7A5B,\n\t10310: 0x7A5C,\n\t10311: 0x7A5D,\n\t10312: 0x7A5E,\n\t10313: 0x7A5F,\n\t10314: 0x7A60,\n\t10315: 0x7A61,\n\t10316: 0x7A62,\n\t10317: 0x7A63,\n\t10318: 0x7A64,\n\t10319: 0x7A65,\n\t10320: 0x7A66,\n\t10321: 0x7A67,\n\t10322: 0x7A68,\n\t10323: 0x7A69,\n\t10324: 0x7A6A,\n\t10325: 0x7A6B,\n\t10326: 0x7A6C,\n\t10327: 0x7A6D,\n\t10328: 0x7A6E,\n\t10329: 0x7A6F,\n\t10330: 0x7A71,\n\t10331: 0x7A72,\n\t10332: 0x7A73,\n\t10333: 0x7A75,\n\t10334: 0x7A7B,\n\t10335: 0x7A7C,\n\t10336: 0x7A7D,\n\t10337: 0x7A7E,\n\t10338: 0x7A82,\n\t10339: 0x7A85,\n\t10340: 0x7A87,\n\t10341: 0x7A89,\n\t10342: 0x7A8A,\n\t10343: 0x7A8B,\n\t10344: 0x7A8C,\n\t10345: 0x7A8E,\n\t10346: 0x7A8F,\n\t10347: 0x7A90,\n\t10348: 0x7A93,\n\t10349: 0x7A94,\n\t10350: 0x7A99,\n\t10351: 0x7A9A,\n\t10352: 0x7A9B,\n\t10353: 0x7A9E,\n\t10354: 0x7AA1,\n\t10355: 0x7AA2,\n\t10356: 0x8D30,\n\t10357: 0x53D1,\n\t10358: 0x7F5A,\n\t10359: 0x7B4F,\n\t10360: 0x4F10,\n\t10361: 0x4E4F,\n\t10362: 0x9600,\n\t10363: 0x6CD5,\n\t10364: 0x73D0,\n\t10365: 0x85E9,\n\t10366: 0x5E06,\n\t10367: 0x756A,\n\t10368: 0x7FFB,\n\t10369: 0x6A0A,\n\t10370: 0x77FE,\n\t10371: 0x9492,\n\t10372: 0x7E41,\n\t10373: 0x51E1,\n\t10374: 0x70E6,\n\t10375: 0x53CD,\n\t10376: 0x8FD4,\n\t10377: 0x8303,\n\t10378: 0x8D29,\n\t10379: 0x72AF,\n\t10380: 0x996D,\n\t10381: 0x6CDB,\n\t10382: 0x574A,\n\t10383: 0x82B3,\n\t10384: 0x65B9,\n\t10385: 0x80AA,\n\t10386: 0x623F,\n\t10387: 0x9632,\n\t10388: 0x59A8,\n\t10389: 0x4EFF,\n\t10390: 0x8BBF,\n\t10391: 0x7EBA,\n\t10392: 0x653E,\n\t10393: 0x83F2,\n\t10394: 0x975E,\n\t10395: 0x5561,\n\t10396: 0x98DE,\n\t10397: 0x80A5,\n\t10398: 0x532A,\n\t10399: 0x8BFD,\n\t10400: 0x5420,\n\t10401: 0x80BA,\n\t10402: 0x5E9F,\n\t10403: 0x6CB8,\n\t10404: 0x8D39,\n\t10405: 0x82AC,\n\t10406: 0x915A,\n\t10407: 0x5429,\n\t10408: 0x6C1B,\n\t10409: 0x5206,\n\t10410: 0x7EB7,\n\t10411: 0x575F,\n\t10412: 0x711A,\n\t10413: 0x6C7E,\n\t10414: 0x7C89,\n\t10415: 0x594B,\n\t10416: 0x4EFD,\n\t10417: 0x5FFF,\n\t10418: 0x6124,\n\t10419: 0x7CAA,\n\t10420: 0x4E30,\n\t10421: 0x5C01,\n\t10422: 0x67AB,\n\t10423: 0x8702,\n\t10424: 0x5CF0,\n\t10425: 0x950B,\n\t10426: 0x98CE,\n\t10427: 0x75AF,\n\t10428: 0x70FD,\n\t10429: 0x9022,\n\t10430: 0x51AF,\n\t10431: 0x7F1D,\n\t10432: 0x8BBD,\n\t10433: 0x5949,\n\t10434: 0x51E4,\n\t10435: 0x4F5B,\n\t10436: 0x5426,\n\t10437: 0x592B,\n\t10438: 0x6577,\n\t10439: 0x80A4,\n\t10440: 0x5B75,\n\t10441: 0x6276,\n\t10442: 0x62C2,\n\t10443: 0x8F90,\n\t10444: 0x5E45,\n\t10445: 0x6C1F,\n\t10446: 0x7B26,\n\t10447: 0x4F0F,\n\t10448: 0x4FD8,\n\t10449: 0x670D,\n\t10450: 0x7AA3,\n\t10451: 0x7AA4,\n\t10452: 0x7AA7,\n\t10453: 0x7AA9,\n\t10454: 0x7AAA,\n\t10455: 0x7AAB,\n\t10456: 0x7AAE,\n\t10457: 0x7AAF,\n\t10458: 0x7AB0,\n\t10459: 0x7AB1,\n\t10460: 0x7AB2,\n\t10461: 0x7AB4,\n\t10462: 0x7AB5,\n\t10463: 0x7AB6,\n\t10464: 0x7AB7,\n\t10465: 0x7AB8,\n\t10466: 0x7AB9,\n\t10467: 0x7ABA,\n\t10468: 0x7ABB,\n\t10469: 0x7ABC,\n\t10470: 0x7ABD,\n\t10471: 0x7ABE,\n\t10472: 0x7AC0,\n\t10473: 0x7AC1,\n\t10474: 0x7AC2,\n\t10475: 0x7AC3,\n\t10476: 0x7AC4,\n\t10477: 0x7AC5,\n\t10478: 0x7AC6,\n\t10479: 0x7AC7,\n\t10480: 0x7AC8,\n\t10481: 0x7AC9,\n\t10482: 0x7ACA,\n\t10483: 0x7ACC,\n\t10484: 0x7ACD,\n\t10485: 0x7ACE,\n\t10486: 0x7ACF,\n\t10487: 0x7AD0,\n\t10488: 0x7AD1,\n\t10489: 0x7AD2,\n\t10490: 0x7AD3,\n\t10491: 0x7AD4,\n\t10492: 0x7AD5,\n\t10493: 0x7AD7,\n\t10494: 0x7AD8,\n\t10495: 0x7ADA,\n\t10496: 0x7ADB,\n\t10497: 0x7ADC,\n\t10498: 0x7ADD,\n\t10499: 0x7AE1,\n\t10500: 0x7AE2,\n\t10501: 0x7AE4,\n\t10502: 0x7AE7,\n\t10503: 0x7AE8,\n\t10504: 0x7AE9,\n\t10505: 0x7AEA,\n\t10506: 0x7AEB,\n\t10507: 0x7AEC,\n\t10508: 0x7AEE,\n\t10509: 0x7AF0,\n\t10510: 0x7AF1,\n\t10511: 0x7AF2,\n\t10512: 0x7AF3,\n\t10513: 0x7AF4,\n\t10514: 0x7AF5,\n\t10515: 0x7AF6,\n\t10516: 0x7AF7,\n\t10517: 0x7AF8,\n\t10518: 0x7AFB,\n\t10519: 0x7AFC,\n\t10520: 0x7AFE,\n\t10521: 0x7B00,\n\t10522: 0x7B01,\n\t10523: 0x7B02,\n\t10524: 0x7B05,\n\t10525: 0x7B07,\n\t10526: 0x7B09,\n\t10527: 0x7B0C,\n\t10528: 0x7B0D,\n\t10529: 0x7B0E,\n\t10530: 0x7B10,\n\t10531: 0x7B12,\n\t10532: 0x7B13,\n\t10533: 0x7B16,\n\t10534: 0x7B17,\n\t10535: 0x7B18,\n\t10536: 0x7B1A,\n\t10537: 0x7B1C,\n\t10538: 0x7B1D,\n\t10539: 0x7B1F,\n\t10540: 0x7B21,\n\t10541: 0x7B22,\n\t10542: 0x7B23,\n\t10543: 0x7B27,\n\t10544: 0x7B29,\n\t10545: 0x7B2D,\n\t10546: 0x6D6E,\n\t10547: 0x6DAA,\n\t10548: 0x798F,\n\t10549: 0x88B1,\n\t10550: 0x5F17,\n\t10551: 0x752B,\n\t10552: 0x629A,\n\t10553: 0x8F85,\n\t10554: 0x4FEF,\n\t10555: 0x91DC,\n\t10556: 0x65A7,\n\t10557: 0x812F,\n\t10558: 0x8151,\n\t10559: 0x5E9C,\n\t10560: 0x8150,\n\t10561: 0x8D74,\n\t10562: 0x526F,\n\t10563: 0x8986,\n\t10564: 0x8D4B,\n\t10565: 0x590D,\n\t10566: 0x5085,\n\t10567: 0x4ED8,\n\t10568: 0x961C,\n\t10569: 0x7236,\n\t10570: 0x8179,\n\t10571: 0x8D1F,\n\t10572: 0x5BCC,\n\t10573: 0x8BA3,\n\t10574: 0x9644,\n\t10575: 0x5987,\n\t10576: 0x7F1A,\n\t10577: 0x5490,\n\t10578: 0x5676,\n\t10579: 0x560E,\n\t10580: 0x8BE5,\n\t10581: 0x6539,\n\t10582: 0x6982,\n\t10583: 0x9499,\n\t10584: 0x76D6,\n\t10585: 0x6E89,\n\t10586: 0x5E72,\n\t10587: 0x7518,\n\t10588: 0x6746,\n\t10589: 0x67D1,\n\t10590: 0x7AFF,\n\t10591: 0x809D,\n\t10592: 0x8D76,\n\t10593: 0x611F,\n\t10594: 0x79C6,\n\t10595: 0x6562,\n\t10596: 0x8D63,\n\t10597: 0x5188,\n\t10598: 0x521A,\n\t10599: 0x94A2,\n\t10600: 0x7F38,\n\t10601: 0x809B,\n\t10602: 0x7EB2,\n\t10603: 0x5C97,\n\t10604: 0x6E2F,\n\t10605: 0x6760,\n\t10606: 0x7BD9,\n\t10607: 0x768B,\n\t10608: 0x9AD8,\n\t10609: 0x818F,\n\t10610: 0x7F94,\n\t10611: 0x7CD5,\n\t10612: 0x641E,\n\t10613: 0x9550,\n\t10614: 0x7A3F,\n\t10615: 0x544A,\n\t10616: 0x54E5,\n\t10617: 0x6B4C,\n\t10618: 0x6401,\n\t10619: 0x6208,\n\t10620: 0x9E3D,\n\t10621: 0x80F3,\n\t10622: 0x7599,\n\t10623: 0x5272,\n\t10624: 0x9769,\n\t10625: 0x845B,\n\t10626: 0x683C,\n\t10627: 0x86E4,\n\t10628: 0x9601,\n\t10629: 0x9694,\n\t10630: 0x94EC,\n\t10631: 0x4E2A,\n\t10632: 0x5404,\n\t10633: 0x7ED9,\n\t10634: 0x6839,\n\t10635: 0x8DDF,\n\t10636: 0x8015,\n\t10637: 0x66F4,\n\t10638: 0x5E9A,\n\t10639: 0x7FB9,\n\t10640: 0x7B2F,\n\t10641: 0x7B30,\n\t10642: 0x7B32,\n\t10643: 0x7B34,\n\t10644: 0x7B35,\n\t10645: 0x7B36,\n\t10646: 0x7B37,\n\t10647: 0x7B39,\n\t10648: 0x7B3B,\n\t10649: 0x7B3D,\n\t10650: 0x7B3F,\n\t10651: 0x7B40,\n\t10652: 0x7B41,\n\t10653: 0x7B42,\n\t10654: 0x7B43,\n\t10655: 0x7B44,\n\t10656: 0x7B46,\n\t10657: 0x7B48,\n\t10658: 0x7B4A,\n\t10659: 0x7B4D,\n\t10660: 0x7B4E,\n\t10661: 0x7B53,\n\t10662: 0x7B55,\n\t10663: 0x7B57,\n\t10664: 0x7B59,\n\t10665: 0x7B5C,\n\t10666: 0x7B5E,\n\t10667: 0x7B5F,\n\t10668: 0x7B61,\n\t10669: 0x7B63,\n\t10670: 0x7B64,\n\t10671: 0x7B65,\n\t10672: 0x7B66,\n\t10673: 0x7B67,\n\t10674: 0x7B68,\n\t10675: 0x7B69,\n\t10676: 0x7B6A,\n\t10677: 0x7B6B,\n\t10678: 0x7B6C,\n\t10679: 0x7B6D,\n\t10680: 0x7B6F,\n\t10681: 0x7B70,\n\t10682: 0x7B73,\n\t10683: 0x7B74,\n\t10684: 0x7B76,\n\t10685: 0x7B78,\n\t10686: 0x7B7A,\n\t10687: 0x7B7C,\n\t10688: 0x7B7D,\n\t10689: 0x7B7F,\n\t10690: 0x7B81,\n\t10691: 0x7B82,\n\t10692: 0x7B83,\n\t10693: 0x7B84,\n\t10694: 0x7B86,\n\t10695: 0x7B87,\n\t10696: 0x7B88,\n\t10697: 0x7B89,\n\t10698: 0x7B8A,\n\t10699: 0x7B8B,\n\t10700: 0x7B8C,\n\t10701: 0x7B8E,\n\t10702: 0x7B8F,\n\t10703: 0x7B91,\n\t10704: 0x7B92,\n\t10705: 0x7B93,\n\t10706: 0x7B96,\n\t10707: 0x7B98,\n\t10708: 0x7B99,\n\t10709: 0x7B9A,\n\t10710: 0x7B9B,\n\t10711: 0x7B9E,\n\t10712: 0x7B9F,\n\t10713: 0x7BA0,\n\t10714: 0x7BA3,\n\t10715: 0x7BA4,\n\t10716: 0x7BA5,\n\t10717: 0x7BAE,\n\t10718: 0x7BAF,\n\t10719: 0x7BB0,\n\t10720: 0x7BB2,\n\t10721: 0x7BB3,\n\t10722: 0x7BB5,\n\t10723: 0x7BB6,\n\t10724: 0x7BB7,\n\t10725: 0x7BB9,\n\t10726: 0x7BBA,\n\t10727: 0x7BBB,\n\t10728: 0x7BBC,\n\t10729: 0x7BBD,\n\t10730: 0x7BBE,\n\t10731: 0x7BBF,\n\t10732: 0x7BC0,\n\t10733: 0x7BC2,\n\t10734: 0x7BC3,\n\t10735: 0x7BC4,\n\t10736: 0x57C2,\n\t10737: 0x803F,\n\t10738: 0x6897,\n\t10739: 0x5DE5,\n\t10740: 0x653B,\n\t10741: 0x529F,\n\t10742: 0x606D,\n\t10743: 0x9F9A,\n\t10744: 0x4F9B,\n\t10745: 0x8EAC,\n\t10746: 0x516C,\n\t10747: 0x5BAB,\n\t10748: 0x5F13,\n\t10749: 0x5DE9,\n\t10750: 0x6C5E,\n\t10751: 0x62F1,\n\t10752: 0x8D21,\n\t10753: 0x5171,\n\t10754: 0x94A9,\n\t10755: 0x52FE,\n\t10756: 0x6C9F,\n\t10757: 0x82DF,\n\t10758: 0x72D7,\n\t10759: 0x57A2,\n\t10760: 0x6784,\n\t10761: 0x8D2D,\n\t10762: 0x591F,\n\t10763: 0x8F9C,\n\t10764: 0x83C7,\n\t10765: 0x5495,\n\t10766: 0x7B8D,\n\t10767: 0x4F30,\n\t10768: 0x6CBD,\n\t10769: 0x5B64,\n\t10770: 0x59D1,\n\t10771: 0x9F13,\n\t10772: 0x53E4,\n\t10773: 0x86CA,\n\t10774: 0x9AA8,\n\t10775: 0x8C37,\n\t10776: 0x80A1,\n\t10777: 0x6545,\n\t10778: 0x987E,\n\t10779: 0x56FA,\n\t10780: 0x96C7,\n\t10781: 0x522E,\n\t10782: 0x74DC,\n\t10783: 0x5250,\n\t10784: 0x5BE1,\n\t10785: 0x6302,\n\t10786: 0x8902,\n\t10787: 0x4E56,\n\t10788: 0x62D0,\n\t10789: 0x602A,\n\t10790: 0x68FA,\n\t10791: 0x5173,\n\t10792: 0x5B98,\n\t10793: 0x51A0,\n\t10794: 0x89C2,\n\t10795: 0x7BA1,\n\t10796: 0x9986,\n\t10797: 0x7F50,\n\t10798: 0x60EF,\n\t10799: 0x704C,\n\t10800: 0x8D2F,\n\t10801: 0x5149,\n\t10802: 0x5E7F,\n\t10803: 0x901B,\n\t10804: 0x7470,\n\t10805: 0x89C4,\n\t10806: 0x572D,\n\t10807: 0x7845,\n\t10808: 0x5F52,\n\t10809: 0x9F9F,\n\t10810: 0x95FA,\n\t10811: 0x8F68,\n\t10812: 0x9B3C,\n\t10813: 0x8BE1,\n\t10814: 0x7678,\n\t10815: 0x6842,\n\t10816: 0x67DC,\n\t10817: 0x8DEA,\n\t10818: 0x8D35,\n\t10819: 0x523D,\n\t10820: 0x8F8A,\n\t10821: 0x6EDA,\n\t10822: 0x68CD,\n\t10823: 0x9505,\n\t10824: 0x90ED,\n\t10825: 0x56FD,\n\t10826: 0x679C,\n\t10827: 0x88F9,\n\t10828: 0x8FC7,\n\t10829: 0x54C8,\n\t10830: 0x7BC5,\n\t10831: 0x7BC8,\n\t10832: 0x7BC9,\n\t10833: 0x7BCA,\n\t10834: 0x7BCB,\n\t10835: 0x7BCD,\n\t10836: 0x7BCE,\n\t10837: 0x7BCF,\n\t10838: 0x7BD0,\n\t10839: 0x7BD2,\n\t10840: 0x7BD4,\n\t10841: 0x7BD5,\n\t10842: 0x7BD6,\n\t10843: 0x7BD7,\n\t10844: 0x7BD8,\n\t10845: 0x7BDB,\n\t10846: 0x7BDC,\n\t10847: 0x7BDE,\n\t10848: 0x7BDF,\n\t10849: 0x7BE0,\n\t10850: 0x7BE2,\n\t10851: 0x7BE3,\n\t10852: 0x7BE4,\n\t10853: 0x7BE7,\n\t10854: 0x7BE8,\n\t10855: 0x7BE9,\n\t10856: 0x7BEB,\n\t10857: 0x7BEC,\n\t10858: 0x7BED,\n\t10859: 0x7BEF,\n\t10860: 0x7BF0,\n\t10861: 0x7BF2,\n\t10862: 0x7BF3,\n\t10863: 0x7BF4,\n\t10864: 0x7BF5,\n\t10865: 0x7BF6,\n\t10866: 0x7BF8,\n\t10867: 0x7BF9,\n\t10868: 0x7BFA,\n\t10869: 0x7BFB,\n\t10870: 0x7BFD,\n\t10871: 0x7BFF,\n\t10872: 0x7C00,\n\t10873: 0x7C01,\n\t10874: 0x7C02,\n\t10875: 0x7C03,\n\t10876: 0x7C04,\n\t10877: 0x7C05,\n\t10878: 0x7C06,\n\t10879: 0x7C08,\n\t10880: 0x7C09,\n\t10881: 0x7C0A,\n\t10882: 0x7C0D,\n\t10883: 0x7C0E,\n\t10884: 0x7C10,\n\t10885: 0x7C11,\n\t10886: 0x7C12,\n\t10887: 0x7C13,\n\t10888: 0x7C14,\n\t10889: 0x7C15,\n\t10890: 0x7C17,\n\t10891: 0x7C18,\n\t10892: 0x7C19,\n\t10893: 0x7C1A,\n\t10894: 0x7C1B,\n\t10895: 0x7C1C,\n\t10896: 0x7C1D,\n\t10897: 0x7C1E,\n\t10898: 0x7C20,\n\t10899: 0x7C21,\n\t10900: 0x7C22,\n\t10901: 0x7C23,\n\t10902: 0x7C24,\n\t10903: 0x7C25,\n\t10904: 0x7C28,\n\t10905: 0x7C29,\n\t10906: 0x7C2B,\n\t10907: 0x7C2C,\n\t10908: 0x7C2D,\n\t10909: 0x7C2E,\n\t10910: 0x7C2F,\n\t10911: 0x7C30,\n\t10912: 0x7C31,\n\t10913: 0x7C32,\n\t10914: 0x7C33,\n\t10915: 0x7C34,\n\t10916: 0x7C35,\n\t10917: 0x7C36,\n\t10918: 0x7C37,\n\t10919: 0x7C39,\n\t10920: 0x7C3A,\n\t10921: 0x7C3B,\n\t10922: 0x7C3C,\n\t10923: 0x7C3D,\n\t10924: 0x7C3E,\n\t10925: 0x7C42,\n\t10926: 0x9AB8,\n\t10927: 0x5B69,\n\t10928: 0x6D77,\n\t10929: 0x6C26,\n\t10930: 0x4EA5,\n\t10931: 0x5BB3,\n\t10932: 0x9A87,\n\t10933: 0x9163,\n\t10934: 0x61A8,\n\t10935: 0x90AF,\n\t10936: 0x97E9,\n\t10937: 0x542B,\n\t10938: 0x6DB5,\n\t10939: 0x5BD2,\n\t10940: 0x51FD,\n\t10941: 0x558A,\n\t10942: 0x7F55,\n\t10943: 0x7FF0,\n\t10944: 0x64BC,\n\t10945: 0x634D,\n\t10946: 0x65F1,\n\t10947: 0x61BE,\n\t10948: 0x608D,\n\t10949: 0x710A,\n\t10950: 0x6C57,\n\t10951: 0x6C49,\n\t10952: 0x592F,\n\t10953: 0x676D,\n\t10954: 0x822A,\n\t10955: 0x58D5,\n\t10956: 0x568E,\n\t10957: 0x8C6A,\n\t10958: 0x6BEB,\n\t10959: 0x90DD,\n\t10960: 0x597D,\n\t10961: 0x8017,\n\t10962: 0x53F7,\n\t10963: 0x6D69,\n\t10964: 0x5475,\n\t10965: 0x559D,\n\t10966: 0x8377,\n\t10967: 0x83CF,\n\t10968: 0x6838,\n\t10969: 0x79BE,\n\t10970: 0x548C,\n\t10971: 0x4F55,\n\t10972: 0x5408,\n\t10973: 0x76D2,\n\t10974: 0x8C89,\n\t10975: 0x9602,\n\t10976: 0x6CB3,\n\t10977: 0x6DB8,\n\t10978: 0x8D6B,\n\t10979: 0x8910,\n\t10980: 0x9E64,\n\t10981: 0x8D3A,\n\t10982: 0x563F,\n\t10983: 0x9ED1,\n\t10984: 0x75D5,\n\t10985: 0x5F88,\n\t10986: 0x72E0,\n\t10987: 0x6068,\n\t10988: 0x54FC,\n\t10989: 0x4EA8,\n\t10990: 0x6A2A,\n\t10991: 0x8861,\n\t10992: 0x6052,\n\t10993: 0x8F70,\n\t10994: 0x54C4,\n\t10995: 0x70D8,\n\t10996: 0x8679,\n\t10997: 0x9E3F,\n\t10998: 0x6D2A,\n\t10999: 0x5B8F,\n\t11000: 0x5F18,\n\t11001: 0x7EA2,\n\t11002: 0x5589,\n\t11003: 0x4FAF,\n\t11004: 0x7334,\n\t11005: 0x543C,\n\t11006: 0x539A,\n\t11007: 0x5019,\n\t11008: 0x540E,\n\t11009: 0x547C,\n\t11010: 0x4E4E,\n\t11011: 0x5FFD,\n\t11012: 0x745A,\n\t11013: 0x58F6,\n\t11014: 0x846B,\n\t11015: 0x80E1,\n\t11016: 0x8774,\n\t11017: 0x72D0,\n\t11018: 0x7CCA,\n\t11019: 0x6E56,\n\t11020: 0x7C43,\n\t11021: 0x7C44,\n\t11022: 0x7C45,\n\t11023: 0x7C46,\n\t11024: 0x7C47,\n\t11025: 0x7C48,\n\t11026: 0x7C49,\n\t11027: 0x7C4A,\n\t11028: 0x7C4B,\n\t11029: 0x7C4C,\n\t11030: 0x7C4E,\n\t11031: 0x7C4F,\n\t11032: 0x7C50,\n\t11033: 0x7C51,\n\t11034: 0x7C52,\n\t11035: 0x7C53,\n\t11036: 0x7C54,\n\t11037: 0x7C55,\n\t11038: 0x7C56,\n\t11039: 0x7C57,\n\t11040: 0x7C58,\n\t11041: 0x7C59,\n\t11042: 0x7C5A,\n\t11043: 0x7C5B,\n\t11044: 0x7C5C,\n\t11045: 0x7C5D,\n\t11046: 0x7C5E,\n\t11047: 0x7C5F,\n\t11048: 0x7C60,\n\t11049: 0x7C61,\n\t11050: 0x7C62,\n\t11051: 0x7C63,\n\t11052: 0x7C64,\n\t11053: 0x7C65,\n\t11054: 0x7C66,\n\t11055: 0x7C67,\n\t11056: 0x7C68,\n\t11057: 0x7C69,\n\t11058: 0x7C6A,\n\t11059: 0x7C6B,\n\t11060: 0x7C6C,\n\t11061: 0x7C6D,\n\t11062: 0x7C6E,\n\t11063: 0x7C6F,\n\t11064: 0x7C70,\n\t11065: 0x7C71,\n\t11066: 0x7C72,\n\t11067: 0x7C75,\n\t11068: 0x7C76,\n\t11069: 0x7C77,\n\t11070: 0x7C78,\n\t11071: 0x7C79,\n\t11072: 0x7C7A,\n\t11073: 0x7C7E,\n\t11074: 0x7C7F,\n\t11075: 0x7C80,\n\t11076: 0x7C81,\n\t11077: 0x7C82,\n\t11078: 0x7C83,\n\t11079: 0x7C84,\n\t11080: 0x7C85,\n\t11081: 0x7C86,\n\t11082: 0x7C87,\n\t11083: 0x7C88,\n\t11084: 0x7C8A,\n\t11085: 0x7C8B,\n\t11086: 0x7C8C,\n\t11087: 0x7C8D,\n\t11088: 0x7C8E,\n\t11089: 0x7C8F,\n\t11090: 0x7C90,\n\t11091: 0x7C93,\n\t11092: 0x7C94,\n\t11093: 0x7C96,\n\t11094: 0x7C99,\n\t11095: 0x7C9A,\n\t11096: 0x7C9B,\n\t11097: 0x7CA0,\n\t11098: 0x7CA1,\n\t11099: 0x7CA3,\n\t11100: 0x7CA6,\n\t11101: 0x7CA7,\n\t11102: 0x7CA8,\n\t11103: 0x7CA9,\n\t11104: 0x7CAB,\n\t11105: 0x7CAC,\n\t11106: 0x7CAD,\n\t11107: 0x7CAF,\n\t11108: 0x7CB0,\n\t11109: 0x7CB4,\n\t11110: 0x7CB5,\n\t11111: 0x7CB6,\n\t11112: 0x7CB7,\n\t11113: 0x7CB8,\n\t11114: 0x7CBA,\n\t11115: 0x7CBB,\n\t11116: 0x5F27,\n\t11117: 0x864E,\n\t11118: 0x552C,\n\t11119: 0x62A4,\n\t11120: 0x4E92,\n\t11121: 0x6CAA,\n\t11122: 0x6237,\n\t11123: 0x82B1,\n\t11124: 0x54D7,\n\t11125: 0x534E,\n\t11126: 0x733E,\n\t11127: 0x6ED1,\n\t11128: 0x753B,\n\t11129: 0x5212,\n\t11130: 0x5316,\n\t11131: 0x8BDD,\n\t11132: 0x69D0,\n\t11133: 0x5F8A,\n\t11134: 0x6000,\n\t11135: 0x6DEE,\n\t11136: 0x574F,\n\t11137: 0x6B22,\n\t11138: 0x73AF,\n\t11139: 0x6853,\n\t11140: 0x8FD8,\n\t11141: 0x7F13,\n\t11142: 0x6362,\n\t11143: 0x60A3,\n\t11144: 0x5524,\n\t11145: 0x75EA,\n\t11146: 0x8C62,\n\t11147: 0x7115,\n\t11148: 0x6DA3,\n\t11149: 0x5BA6,\n\t11150: 0x5E7B,\n\t11151: 0x8352,\n\t11152: 0x614C,\n\t11153: 0x9EC4,\n\t11154: 0x78FA,\n\t11155: 0x8757,\n\t11156: 0x7C27,\n\t11157: 0x7687,\n\t11158: 0x51F0,\n\t11159: 0x60F6,\n\t11160: 0x714C,\n\t11161: 0x6643,\n\t11162: 0x5E4C,\n\t11163: 0x604D,\n\t11164: 0x8C0E,\n\t11165: 0x7070,\n\t11166: 0x6325,\n\t11167: 0x8F89,\n\t11168: 0x5FBD,\n\t11169: 0x6062,\n\t11170: 0x86D4,\n\t11171: 0x56DE,\n\t11172: 0x6BC1,\n\t11173: 0x6094,\n\t11174: 0x6167,\n\t11175: 0x5349,\n\t11176: 0x60E0,\n\t11177: 0x6666,\n\t11178: 0x8D3F,\n\t11179: 0x79FD,\n\t11180: 0x4F1A,\n\t11181: 0x70E9,\n\t11182: 0x6C47,\n\t11183: 0x8BB3,\n\t11184: 0x8BF2,\n\t11185: 0x7ED8,\n\t11186: 0x8364,\n\t11187: 0x660F,\n\t11188: 0x5A5A,\n\t11189: 0x9B42,\n\t11190: 0x6D51,\n\t11191: 0x6DF7,\n\t11192: 0x8C41,\n\t11193: 0x6D3B,\n\t11194: 0x4F19,\n\t11195: 0x706B,\n\t11196: 0x83B7,\n\t11197: 0x6216,\n\t11198: 0x60D1,\n\t11199: 0x970D,\n\t11200: 0x8D27,\n\t11201: 0x7978,\n\t11202: 0x51FB,\n\t11203: 0x573E,\n\t11204: 0x57FA,\n\t11205: 0x673A,\n\t11206: 0x7578,\n\t11207: 0x7A3D,\n\t11208: 0x79EF,\n\t11209: 0x7B95,\n\t11210: 0x7CBF,\n\t11211: 0x7CC0,\n\t11212: 0x7CC2,\n\t11213: 0x7CC3,\n\t11214: 0x7CC4,\n\t11215: 0x7CC6,\n\t11216: 0x7CC9,\n\t11217: 0x7CCB,\n\t11218: 0x7CCE,\n\t11219: 0x7CCF,\n\t11220: 0x7CD0,\n\t11221: 0x7CD1,\n\t11222: 0x7CD2,\n\t11223: 0x7CD3,\n\t11224: 0x7CD4,\n\t11225: 0x7CD8,\n\t11226: 0x7CDA,\n\t11227: 0x7CDB,\n\t11228: 0x7CDD,\n\t11229: 0x7CDE,\n\t11230: 0x7CE1,\n\t11231: 0x7CE2,\n\t11232: 0x7CE3,\n\t11233: 0x7CE4,\n\t11234: 0x7CE5,\n\t11235: 0x7CE6,\n\t11236: 0x7CE7,\n\t11237: 0x7CE9,\n\t11238: 0x7CEA,\n\t11239: 0x7CEB,\n\t11240: 0x7CEC,\n\t11241: 0x7CED,\n\t11242: 0x7CEE,\n\t11243: 0x7CF0,\n\t11244: 0x7CF1,\n\t11245: 0x7CF2,\n\t11246: 0x7CF3,\n\t11247: 0x7CF4,\n\t11248: 0x7CF5,\n\t11249: 0x7CF6,\n\t11250: 0x7CF7,\n\t11251: 0x7CF9,\n\t11252: 0x7CFA,\n\t11253: 0x7CFC,\n\t11254: 0x7CFD,\n\t11255: 0x7CFE,\n\t11256: 0x7CFF,\n\t11257: 0x7D00,\n\t11258: 0x7D01,\n\t11259: 0x7D02,\n\t11260: 0x7D03,\n\t11261: 0x7D04,\n\t11262: 0x7D05,\n\t11263: 0x7D06,\n\t11264: 0x7D07,\n\t11265: 0x7D08,\n\t11266: 0x7D09,\n\t11267: 0x7D0B,\n\t11268: 0x7D0C,\n\t11269: 0x7D0D,\n\t11270: 0x7D0E,\n\t11271: 0x7D0F,\n\t11272: 0x7D10,\n\t11273: 0x7D11,\n\t11274: 0x7D12,\n\t11275: 0x7D13,\n\t11276: 0x7D14,\n\t11277: 0x7D15,\n\t11278: 0x7D16,\n\t11279: 0x7D17,\n\t11280: 0x7D18,\n\t11281: 0x7D19,\n\t11282: 0x7D1A,\n\t11283: 0x7D1B,\n\t11284: 0x7D1C,\n\t11285: 0x7D1D,\n\t11286: 0x7D1E,\n\t11287: 0x7D1F,\n\t11288: 0x7D21,\n\t11289: 0x7D23,\n\t11290: 0x7D24,\n\t11291: 0x7D25,\n\t11292: 0x7D26,\n\t11293: 0x7D28,\n\t11294: 0x7D29,\n\t11295: 0x7D2A,\n\t11296: 0x7D2C,\n\t11297: 0x7D2D,\n\t11298: 0x7D2E,\n\t11299: 0x7D30,\n\t11300: 0x7D31,\n\t11301: 0x7D32,\n\t11302: 0x7D33,\n\t11303: 0x7D34,\n\t11304: 0x7D35,\n\t11305: 0x7D36,\n\t11306: 0x808C,\n\t11307: 0x9965,\n\t11308: 0x8FF9,\n\t11309: 0x6FC0,\n\t11310: 0x8BA5,\n\t11311: 0x9E21,\n\t11312: 0x59EC,\n\t11313: 0x7EE9,\n\t11314: 0x7F09,\n\t11315: 0x5409,\n\t11316: 0x6781,\n\t11317: 0x68D8,\n\t11318: 0x8F91,\n\t11319: 0x7C4D,\n\t11320: 0x96C6,\n\t11321: 0x53CA,\n\t11322: 0x6025,\n\t11323: 0x75BE,\n\t11324: 0x6C72,\n\t11325: 0x5373,\n\t11326: 0x5AC9,\n\t11327: 0x7EA7,\n\t11328: 0x6324,\n\t11329: 0x51E0,\n\t11330: 0x810A,\n\t11331: 0x5DF1,\n\t11332: 0x84DF,\n\t11333: 0x6280,\n\t11334: 0x5180,\n\t11335: 0x5B63,\n\t11336: 0x4F0E,\n\t11337: 0x796D,\n\t11338: 0x5242,\n\t11339: 0x60B8,\n\t11340: 0x6D4E,\n\t11341: 0x5BC4,\n\t11342: 0x5BC2,\n\t11343: 0x8BA1,\n\t11344: 0x8BB0,\n\t11345: 0x65E2,\n\t11346: 0x5FCC,\n\t11347: 0x9645,\n\t11348: 0x5993,\n\t11349: 0x7EE7,\n\t11350: 0x7EAA,\n\t11351: 0x5609,\n\t11352: 0x67B7,\n\t11353: 0x5939,\n\t11354: 0x4F73,\n\t11355: 0x5BB6,\n\t11356: 0x52A0,\n\t11357: 0x835A,\n\t11358: 0x988A,\n\t11359: 0x8D3E,\n\t11360: 0x7532,\n\t11361: 0x94BE,\n\t11362: 0x5047,\n\t11363: 0x7A3C,\n\t11364: 0x4EF7,\n\t11365: 0x67B6,\n\t11366: 0x9A7E,\n\t11367: 0x5AC1,\n\t11368: 0x6B7C,\n\t11369: 0x76D1,\n\t11370: 0x575A,\n\t11371: 0x5C16,\n\t11372: 0x7B3A,\n\t11373: 0x95F4,\n\t11374: 0x714E,\n\t11375: 0x517C,\n\t11376: 0x80A9,\n\t11377: 0x8270,\n\t11378: 0x5978,\n\t11379: 0x7F04,\n\t11380: 0x8327,\n\t11381: 0x68C0,\n\t11382: 0x67EC,\n\t11383: 0x78B1,\n\t11384: 0x7877,\n\t11385: 0x62E3,\n\t11386: 0x6361,\n\t11387: 0x7B80,\n\t11388: 0x4FED,\n\t11389: 0x526A,\n\t11390: 0x51CF,\n\t11391: 0x8350,\n\t11392: 0x69DB,\n\t11393: 0x9274,\n\t11394: 0x8DF5,\n\t11395: 0x8D31,\n\t11396: 0x89C1,\n\t11397: 0x952E,\n\t11398: 0x7BAD,\n\t11399: 0x4EF6,\n\t11400: 0x7D37,\n\t11401: 0x7D38,\n\t11402: 0x7D39,\n\t11403: 0x7D3A,\n\t11404: 0x7D3B,\n\t11405: 0x7D3C,\n\t11406: 0x7D3D,\n\t11407: 0x7D3E,\n\t11408: 0x7D3F,\n\t11409: 0x7D40,\n\t11410: 0x7D41,\n\t11411: 0x7D42,\n\t11412: 0x7D43,\n\t11413: 0x7D44,\n\t11414: 0x7D45,\n\t11415: 0x7D46,\n\t11416: 0x7D47,\n\t11417: 0x7D48,\n\t11418: 0x7D49,\n\t11419: 0x7D4A,\n\t11420: 0x7D4B,\n\t11421: 0x7D4C,\n\t11422: 0x7D4D,\n\t11423: 0x7D4E,\n\t11424: 0x7D4F,\n\t11425: 0x7D50,\n\t11426: 0x7D51,\n\t11427: 0x7D52,\n\t11428: 0x7D53,\n\t11429: 0x7D54,\n\t11430: 0x7D55,\n\t11431: 0x7D56,\n\t11432: 0x7D57,\n\t11433: 0x7D58,\n\t11434: 0x7D59,\n\t11435: 0x7D5A,\n\t11436: 0x7D5B,\n\t11437: 0x7D5C,\n\t11438: 0x7D5D,\n\t11439: 0x7D5E,\n\t11440: 0x7D5F,\n\t11441: 0x7D60,\n\t11442: 0x7D61,\n\t11443: 0x7D62,\n\t11444: 0x7D63,\n\t11445: 0x7D64,\n\t11446: 0x7D65,\n\t11447: 0x7D66,\n\t11448: 0x7D67,\n\t11449: 0x7D68,\n\t11450: 0x7D69,\n\t11451: 0x7D6A,\n\t11452: 0x7D6B,\n\t11453: 0x7D6C,\n\t11454: 0x7D6D,\n\t11455: 0x7D6F,\n\t11456: 0x7D70,\n\t11457: 0x7D71,\n\t11458: 0x7D72,\n\t11459: 0x7D73,\n\t11460: 0x7D74,\n\t11461: 0x7D75,\n\t11462: 0x7D76,\n\t11463: 0x7D78,\n\t11464: 0x7D79,\n\t11465: 0x7D7A,\n\t11466: 0x7D7B,\n\t11467: 0x7D7C,\n\t11468: 0x7D7D,\n\t11469: 0x7D7E,\n\t11470: 0x7D7F,\n\t11471: 0x7D80,\n\t11472: 0x7D81,\n\t11473: 0x7D82,\n\t11474: 0x7D83,\n\t11475: 0x7D84,\n\t11476: 0x7D85,\n\t11477: 0x7D86,\n\t11478: 0x7D87,\n\t11479: 0x7D88,\n\t11480: 0x7D89,\n\t11481: 0x7D8A,\n\t11482: 0x7D8B,\n\t11483: 0x7D8C,\n\t11484: 0x7D8D,\n\t11485: 0x7D8E,\n\t11486: 0x7D8F,\n\t11487: 0x7D90,\n\t11488: 0x7D91,\n\t11489: 0x7D92,\n\t11490: 0x7D93,\n\t11491: 0x7D94,\n\t11492: 0x7D95,\n\t11493: 0x7D96,\n\t11494: 0x7D97,\n\t11495: 0x7D98,\n\t11496: 0x5065,\n\t11497: 0x8230,\n\t11498: 0x5251,\n\t11499: 0x996F,\n\t11500: 0x6E10,\n\t11501: 0x6E85,\n\t11502: 0x6DA7,\n\t11503: 0x5EFA,\n\t11504: 0x50F5,\n\t11505: 0x59DC,\n\t11506: 0x5C06,\n\t11507: 0x6D46,\n\t11508: 0x6C5F,\n\t11509: 0x7586,\n\t11510: 0x848B,\n\t11511: 0x6868,\n\t11512: 0x5956,\n\t11513: 0x8BB2,\n\t11514: 0x5320,\n\t11515: 0x9171,\n\t11516: 0x964D,\n\t11517: 0x8549,\n\t11518: 0x6912,\n\t11519: 0x7901,\n\t11520: 0x7126,\n\t11521: 0x80F6,\n\t11522: 0x4EA4,\n\t11523: 0x90CA,\n\t11524: 0x6D47,\n\t11525: 0x9A84,\n\t11526: 0x5A07,\n\t11527: 0x56BC,\n\t11528: 0x6405,\n\t11529: 0x94F0,\n\t11530: 0x77EB,\n\t11531: 0x4FA5,\n\t11532: 0x811A,\n\t11533: 0x72E1,\n\t11534: 0x89D2,\n\t11535: 0x997A,\n\t11536: 0x7F34,\n\t11537: 0x7EDE,\n\t11538: 0x527F,\n\t11539: 0x6559,\n\t11540: 0x9175,\n\t11541: 0x8F7F,\n\t11542: 0x8F83,\n\t11543: 0x53EB,\n\t11544: 0x7A96,\n\t11545: 0x63ED,\n\t11546: 0x63A5,\n\t11547: 0x7686,\n\t11548: 0x79F8,\n\t11549: 0x8857,\n\t11550: 0x9636,\n\t11551: 0x622A,\n\t11552: 0x52AB,\n\t11553: 0x8282,\n\t11554: 0x6854,\n\t11555: 0x6770,\n\t11556: 0x6377,\n\t11557: 0x776B,\n\t11558: 0x7AED,\n\t11559: 0x6D01,\n\t11560: 0x7ED3,\n\t11561: 0x89E3,\n\t11562: 0x59D0,\n\t11563: 0x6212,\n\t11564: 0x85C9,\n\t11565: 0x82A5,\n\t11566: 0x754C,\n\t11567: 0x501F,\n\t11568: 0x4ECB,\n\t11569: 0x75A5,\n\t11570: 0x8BEB,\n\t11571: 0x5C4A,\n\t11572: 0x5DFE,\n\t11573: 0x7B4B,\n\t11574: 0x65A4,\n\t11575: 0x91D1,\n\t11576: 0x4ECA,\n\t11577: 0x6D25,\n\t11578: 0x895F,\n\t11579: 0x7D27,\n\t11580: 0x9526,\n\t11581: 0x4EC5,\n\t11582: 0x8C28,\n\t11583: 0x8FDB,\n\t11584: 0x9773,\n\t11585: 0x664B,\n\t11586: 0x7981,\n\t11587: 0x8FD1,\n\t11588: 0x70EC,\n\t11589: 0x6D78,\n\t11590: 0x7D99,\n\t11591: 0x7D9A,\n\t11592: 0x7D9B,\n\t11593: 0x7D9C,\n\t11594: 0x7D9D,\n\t11595: 0x7D9E,\n\t11596: 0x7D9F,\n\t11597: 0x7DA0,\n\t11598: 0x7DA1,\n\t11599: 0x7DA2,\n\t11600: 0x7DA3,\n\t11601: 0x7DA4,\n\t11602: 0x7DA5,\n\t11603: 0x7DA7,\n\t11604: 0x7DA8,\n\t11605: 0x7DA9,\n\t11606: 0x7DAA,\n\t11607: 0x7DAB,\n\t11608: 0x7DAC,\n\t11609: 0x7DAD,\n\t11610: 0x7DAF,\n\t11611: 0x7DB0,\n\t11612: 0x7DB1,\n\t11613: 0x7DB2,\n\t11614: 0x7DB3,\n\t11615: 0x7DB4,\n\t11616: 0x7DB5,\n\t11617: 0x7DB6,\n\t11618: 0x7DB7,\n\t11619: 0x7DB8,\n\t11620: 0x7DB9,\n\t11621: 0x7DBA,\n\t11622: 0x7DBB,\n\t11623: 0x7DBC,\n\t11624: 0x7DBD,\n\t11625: 0x7DBE,\n\t11626: 0x7DBF,\n\t11627: 0x7DC0,\n\t11628: 0x7DC1,\n\t11629: 0x7DC2,\n\t11630: 0x7DC3,\n\t11631: 0x7DC4,\n\t11632: 0x7DC5,\n\t11633: 0x7DC6,\n\t11634: 0x7DC7,\n\t11635: 0x7DC8,\n\t11636: 0x7DC9,\n\t11637: 0x7DCA,\n\t11638: 0x7DCB,\n\t11639: 0x7DCC,\n\t11640: 0x7DCD,\n\t11641: 0x7DCE,\n\t11642: 0x7DCF,\n\t11643: 0x7DD0,\n\t11644: 0x7DD1,\n\t11645: 0x7DD2,\n\t11646: 0x7DD3,\n\t11647: 0x7DD4,\n\t11648: 0x7DD5,\n\t11649: 0x7DD6,\n\t11650: 0x7DD7,\n\t11651: 0x7DD8,\n\t11652: 0x7DD9,\n\t11653: 0x7DDA,\n\t11654: 0x7DDB,\n\t11655: 0x7DDC,\n\t11656: 0x7DDD,\n\t11657: 0x7DDE,\n\t11658: 0x7DDF,\n\t11659: 0x7DE0,\n\t11660: 0x7DE1,\n\t11661: 0x7DE2,\n\t11662: 0x7DE3,\n\t11663: 0x7DE4,\n\t11664: 0x7DE5,\n\t11665: 0x7DE6,\n\t11666: 0x7DE7,\n\t11667: 0x7DE8,\n\t11668: 0x7DE9,\n\t11669: 0x7DEA,\n\t11670: 0x7DEB,\n\t11671: 0x7DEC,\n\t11672: 0x7DED,\n\t11673: 0x7DEE,\n\t11674: 0x7DEF,\n\t11675: 0x7DF0,\n\t11676: 0x7DF1,\n\t11677: 0x7DF2,\n\t11678: 0x7DF3,\n\t11679: 0x7DF4,\n\t11680: 0x7DF5,\n\t11681: 0x7DF6,\n\t11682: 0x7DF7,\n\t11683: 0x7DF8,\n\t11684: 0x7DF9,\n\t11685: 0x7DFA,\n\t11686: 0x5C3D,\n\t11687: 0x52B2,\n\t11688: 0x8346,\n\t11689: 0x5162,\n\t11690: 0x830E,\n\t11691: 0x775B,\n\t11692: 0x6676,\n\t11693: 0x9CB8,\n\t11694: 0x4EAC,\n\t11695: 0x60CA,\n\t11696: 0x7CBE,\n\t11697: 0x7CB3,\n\t11698: 0x7ECF,\n\t11699: 0x4E95,\n\t11700: 0x8B66,\n\t11701: 0x666F,\n\t11702: 0x9888,\n\t11703: 0x9759,\n\t11704: 0x5883,\n\t11705: 0x656C,\n\t11706: 0x955C,\n\t11707: 0x5F84,\n\t11708: 0x75C9,\n\t11709: 0x9756,\n\t11710: 0x7ADF,\n\t11711: 0x7ADE,\n\t11712: 0x51C0,\n\t11713: 0x70AF,\n\t11714: 0x7A98,\n\t11715: 0x63EA,\n\t11716: 0x7A76,\n\t11717: 0x7EA0,\n\t11718: 0x7396,\n\t11719: 0x97ED,\n\t11720: 0x4E45,\n\t11721: 0x7078,\n\t11722: 0x4E5D,\n\t11723: 0x9152,\n\t11724: 0x53A9,\n\t11725: 0x6551,\n\t11726: 0x65E7,\n\t11727: 0x81FC,\n\t11728: 0x8205,\n\t11729: 0x548E,\n\t11730: 0x5C31,\n\t11731: 0x759A,\n\t11732: 0x97A0,\n\t11733: 0x62D8,\n\t11734: 0x72D9,\n\t11735: 0x75BD,\n\t11736: 0x5C45,\n\t11737: 0x9A79,\n\t11738: 0x83CA,\n\t11739: 0x5C40,\n\t11740: 0x5480,\n\t11741: 0x77E9,\n\t11742: 0x4E3E,\n\t11743: 0x6CAE,\n\t11744: 0x805A,\n\t11745: 0x62D2,\n\t11746: 0x636E,\n\t11747: 0x5DE8,\n\t11748: 0x5177,\n\t11749: 0x8DDD,\n\t11750: 0x8E1E,\n\t11751: 0x952F,\n\t11752: 0x4FF1,\n\t11753: 0x53E5,\n\t11754: 0x60E7,\n\t11755: 0x70AC,\n\t11756: 0x5267,\n\t11757: 0x6350,\n\t11758: 0x9E43,\n\t11759: 0x5A1F,\n\t11760: 0x5026,\n\t11761: 0x7737,\n\t11762: 0x5377,\n\t11763: 0x7EE2,\n\t11764: 0x6485,\n\t11765: 0x652B,\n\t11766: 0x6289,\n\t11767: 0x6398,\n\t11768: 0x5014,\n\t11769: 0x7235,\n\t11770: 0x89C9,\n\t11771: 0x51B3,\n\t11772: 0x8BC0,\n\t11773: 0x7EDD,\n\t11774: 0x5747,\n\t11775: 0x83CC,\n\t11776: 0x94A7,\n\t11777: 0x519B,\n\t11778: 0x541B,\n\t11779: 0x5CFB,\n\t11780: 0x7DFB,\n\t11781: 0x7DFC,\n\t11782: 0x7DFD,\n\t11783: 0x7DFE,\n\t11784: 0x7DFF,\n\t11785: 0x7E00,\n\t11786: 0x7E01,\n\t11787: 0x7E02,\n\t11788: 0x7E03,\n\t11789: 0x7E04,\n\t11790: 0x7E05,\n\t11791: 0x7E06,\n\t11792: 0x7E07,\n\t11793: 0x7E08,\n\t11794: 0x7E09,\n\t11795: 0x7E0A,\n\t11796: 0x7E0B,\n\t11797: 0x7E0C,\n\t11798: 0x7E0D,\n\t11799: 0x7E0E,\n\t11800: 0x7E0F,\n\t11801: 0x7E10,\n\t11802: 0x7E11,\n\t11803: 0x7E12,\n\t11804: 0x7E13,\n\t11805: 0x7E14,\n\t11806: 0x7E15,\n\t11807: 0x7E16,\n\t11808: 0x7E17,\n\t11809: 0x7E18,\n\t11810: 0x7E19,\n\t11811: 0x7E1A,\n\t11812: 0x7E1B,\n\t11813: 0x7E1C,\n\t11814: 0x7E1D,\n\t11815: 0x7E1E,\n\t11816: 0x7E1F,\n\t11817: 0x7E20,\n\t11818: 0x7E21,\n\t11819: 0x7E22,\n\t11820: 0x7E23,\n\t11821: 0x7E24,\n\t11822: 0x7E25,\n\t11823: 0x7E26,\n\t11824: 0x7E27,\n\t11825: 0x7E28,\n\t11826: 0x7E29,\n\t11827: 0x7E2A,\n\t11828: 0x7E2B,\n\t11829: 0x7E2C,\n\t11830: 0x7E2D,\n\t11831: 0x7E2E,\n\t11832: 0x7E2F,\n\t11833: 0x7E30,\n\t11834: 0x7E31,\n\t11835: 0x7E32,\n\t11836: 0x7E33,\n\t11837: 0x7E34,\n\t11838: 0x7E35,\n\t11839: 0x7E36,\n\t11840: 0x7E37,\n\t11841: 0x7E38,\n\t11842: 0x7E39,\n\t11843: 0x7E3A,\n\t11844: 0x7E3C,\n\t11845: 0x7E3D,\n\t11846: 0x7E3E,\n\t11847: 0x7E3F,\n\t11848: 0x7E40,\n\t11849: 0x7E42,\n\t11850: 0x7E43,\n\t11851: 0x7E44,\n\t11852: 0x7E45,\n\t11853: 0x7E46,\n\t11854: 0x7E48,\n\t11855: 0x7E49,\n\t11856: 0x7E4A,\n\t11857: 0x7E4B,\n\t11858: 0x7E4C,\n\t11859: 0x7E4D,\n\t11860: 0x7E4E,\n\t11861: 0x7E4F,\n\t11862: 0x7E50,\n\t11863: 0x7E51,\n\t11864: 0x7E52,\n\t11865: 0x7E53,\n\t11866: 0x7E54,\n\t11867: 0x7E55,\n\t11868: 0x7E56,\n\t11869: 0x7E57,\n\t11870: 0x7E58,\n\t11871: 0x7E59,\n\t11872: 0x7E5A,\n\t11873: 0x7E5B,\n\t11874: 0x7E5C,\n\t11875: 0x7E5D,\n\t11876: 0x4FCA,\n\t11877: 0x7AE3,\n\t11878: 0x6D5A,\n\t11879: 0x90E1,\n\t11880: 0x9A8F,\n\t11881: 0x5580,\n\t11882: 0x5496,\n\t11883: 0x5361,\n\t11884: 0x54AF,\n\t11885: 0x5F00,\n\t11886: 0x63E9,\n\t11887: 0x6977,\n\t11888: 0x51EF,\n\t11889: 0x6168,\n\t11890: 0x520A,\n\t11891: 0x582A,\n\t11892: 0x52D8,\n\t11893: 0x574E,\n\t11894: 0x780D,\n\t11895: 0x770B,\n\t11896: 0x5EB7,\n\t11897: 0x6177,\n\t11898: 0x7CE0,\n\t11899: 0x625B,\n\t11900: 0x6297,\n\t11901: 0x4EA2,\n\t11902: 0x7095,\n\t11903: 0x8003,\n\t11904: 0x62F7,\n\t11905: 0x70E4,\n\t11906: 0x9760,\n\t11907: 0x5777,\n\t11908: 0x82DB,\n\t11909: 0x67EF,\n\t11910: 0x68F5,\n\t11911: 0x78D5,\n\t11912: 0x9897,\n\t11913: 0x79D1,\n\t11914: 0x58F3,\n\t11915: 0x54B3,\n\t11916: 0x53EF,\n\t11917: 0x6E34,\n\t11918: 0x514B,\n\t11919: 0x523B,\n\t11920: 0x5BA2,\n\t11921: 0x8BFE,\n\t11922: 0x80AF,\n\t11923: 0x5543,\n\t11924: 0x57A6,\n\t11925: 0x6073,\n\t11926: 0x5751,\n\t11927: 0x542D,\n\t11928: 0x7A7A,\n\t11929: 0x6050,\n\t11930: 0x5B54,\n\t11931: 0x63A7,\n\t11932: 0x62A0,\n\t11933: 0x53E3,\n\t11934: 0x6263,\n\t11935: 0x5BC7,\n\t11936: 0x67AF,\n\t11937: 0x54ED,\n\t11938: 0x7A9F,\n\t11939: 0x82E6,\n\t11940: 0x9177,\n\t11941: 0x5E93,\n\t11942: 0x88E4,\n\t11943: 0x5938,\n\t11944: 0x57AE,\n\t11945: 0x630E,\n\t11946: 0x8DE8,\n\t11947: 0x80EF,\n\t11948: 0x5757,\n\t11949: 0x7B77,\n\t11950: 0x4FA9,\n\t11951: 0x5FEB,\n\t11952: 0x5BBD,\n\t11953: 0x6B3E,\n\t11954: 0x5321,\n\t11955: 0x7B50,\n\t11956: 0x72C2,\n\t11957: 0x6846,\n\t11958: 0x77FF,\n\t11959: 0x7736,\n\t11960: 0x65F7,\n\t11961: 0x51B5,\n\t11962: 0x4E8F,\n\t11963: 0x76D4,\n\t11964: 0x5CBF,\n\t11965: 0x7AA5,\n\t11966: 0x8475,\n\t11967: 0x594E,\n\t11968: 0x9B41,\n\t11969: 0x5080,\n\t11970: 0x7E5E,\n\t11971: 0x7E5F,\n\t11972: 0x7E60,\n\t11973: 0x7E61,\n\t11974: 0x7E62,\n\t11975: 0x7E63,\n\t11976: 0x7E64,\n\t11977: 0x7E65,\n\t11978: 0x7E66,\n\t11979: 0x7E67,\n\t11980: 0x7E68,\n\t11981: 0x7E69,\n\t11982: 0x7E6A,\n\t11983: 0x7E6B,\n\t11984: 0x7E6C,\n\t11985: 0x7E6D,\n\t11986: 0x7E6E,\n\t11987: 0x7E6F,\n\t11988: 0x7E70,\n\t11989: 0x7E71,\n\t11990: 0x7E72,\n\t11991: 0x7E73,\n\t11992: 0x7E74,\n\t11993: 0x7E75,\n\t11994: 0x7E76,\n\t11995: 0x7E77,\n\t11996: 0x7E78,\n\t11997: 0x7E79,\n\t11998: 0x7E7A,\n\t11999: 0x7E7B,\n\t12000: 0x7E7C,\n\t12001: 0x7E7D,\n\t12002: 0x7E7E,\n\t12003: 0x7E7F,\n\t12004: 0x7E80,\n\t12005: 0x7E81,\n\t12006: 0x7E83,\n\t12007: 0x7E84,\n\t12008: 0x7E85,\n\t12009: 0x7E86,\n\t12010: 0x7E87,\n\t12011: 0x7E88,\n\t12012: 0x7E89,\n\t12013: 0x7E8A,\n\t12014: 0x7E8B,\n\t12015: 0x7E8C,\n\t12016: 0x7E8D,\n\t12017: 0x7E8E,\n\t12018: 0x7E8F,\n\t12019: 0x7E90,\n\t12020: 0x7E91,\n\t12021: 0x7E92,\n\t12022: 0x7E93,\n\t12023: 0x7E94,\n\t12024: 0x7E95,\n\t12025: 0x7E96,\n\t12026: 0x7E97,\n\t12027: 0x7E98,\n\t12028: 0x7E99,\n\t12029: 0x7E9A,\n\t12030: 0x7E9C,\n\t12031: 0x7E9D,\n\t12032: 0x7E9E,\n\t12033: 0x7EAE,\n\t12034: 0x7EB4,\n\t12035: 0x7EBB,\n\t12036: 0x7EBC,\n\t12037: 0x7ED6,\n\t12038: 0x7EE4,\n\t12039: 0x7EEC,\n\t12040: 0x7EF9,\n\t12041: 0x7F0A,\n\t12042: 0x7F10,\n\t12043: 0x7F1E,\n\t12044: 0x7F37,\n\t12045: 0x7F39,\n\t12046: 0x7F3B,\n\t12047: 0x7F3C,\n\t12048: 0x7F3D,\n\t12049: 0x7F3E,\n\t12050: 0x7F3F,\n\t12051: 0x7F40,\n\t12052: 0x7F41,\n\t12053: 0x7F43,\n\t12054: 0x7F46,\n\t12055: 0x7F47,\n\t12056: 0x7F48,\n\t12057: 0x7F49,\n\t12058: 0x7F4A,\n\t12059: 0x7F4B,\n\t12060: 0x7F4C,\n\t12061: 0x7F4D,\n\t12062: 0x7F4E,\n\t12063: 0x7F4F,\n\t12064: 0x7F52,\n\t12065: 0x7F53,\n\t12066: 0x9988,\n\t12067: 0x6127,\n\t12068: 0x6E83,\n\t12069: 0x5764,\n\t12070: 0x6606,\n\t12071: 0x6346,\n\t12072: 0x56F0,\n\t12073: 0x62EC,\n\t12074: 0x6269,\n\t12075: 0x5ED3,\n\t12076: 0x9614,\n\t12077: 0x5783,\n\t12078: 0x62C9,\n\t12079: 0x5587,\n\t12080: 0x8721,\n\t12081: 0x814A,\n\t12082: 0x8FA3,\n\t12083: 0x5566,\n\t12084: 0x83B1,\n\t12085: 0x6765,\n\t12086: 0x8D56,\n\t12087: 0x84DD,\n\t12088: 0x5A6A,\n\t12089: 0x680F,\n\t12090: 0x62E6,\n\t12091: 0x7BEE,\n\t12092: 0x9611,\n\t12093: 0x5170,\n\t12094: 0x6F9C,\n\t12095: 0x8C30,\n\t12096: 0x63FD,\n\t12097: 0x89C8,\n\t12098: 0x61D2,\n\t12099: 0x7F06,\n\t12100: 0x70C2,\n\t12101: 0x6EE5,\n\t12102: 0x7405,\n\t12103: 0x6994,\n\t12104: 0x72FC,\n\t12105: 0x5ECA,\n\t12106: 0x90CE,\n\t12107: 0x6717,\n\t12108: 0x6D6A,\n\t12109: 0x635E,\n\t12110: 0x52B3,\n\t12111: 0x7262,\n\t12112: 0x8001,\n\t12113: 0x4F6C,\n\t12114: 0x59E5,\n\t12115: 0x916A,\n\t12116: 0x70D9,\n\t12117: 0x6D9D,\n\t12118: 0x52D2,\n\t12119: 0x4E50,\n\t12120: 0x96F7,\n\t12121: 0x956D,\n\t12122: 0x857E,\n\t12123: 0x78CA,\n\t12124: 0x7D2F,\n\t12125: 0x5121,\n\t12126: 0x5792,\n\t12127: 0x64C2,\n\t12128: 0x808B,\n\t12129: 0x7C7B,\n\t12130: 0x6CEA,\n\t12131: 0x68F1,\n\t12132: 0x695E,\n\t12133: 0x51B7,\n\t12134: 0x5398,\n\t12135: 0x68A8,\n\t12136: 0x7281,\n\t12137: 0x9ECE,\n\t12138: 0x7BF1,\n\t12139: 0x72F8,\n\t12140: 0x79BB,\n\t12141: 0x6F13,\n\t12142: 0x7406,\n\t12143: 0x674E,\n\t12144: 0x91CC,\n\t12145: 0x9CA4,\n\t12146: 0x793C,\n\t12147: 0x8389,\n\t12148: 0x8354,\n\t12149: 0x540F,\n\t12150: 0x6817,\n\t12151: 0x4E3D,\n\t12152: 0x5389,\n\t12153: 0x52B1,\n\t12154: 0x783E,\n\t12155: 0x5386,\n\t12156: 0x5229,\n\t12157: 0x5088,\n\t12158: 0x4F8B,\n\t12159: 0x4FD0,\n\t12160: 0x7F56,\n\t12161: 0x7F59,\n\t12162: 0x7F5B,\n\t12163: 0x7F5C,\n\t12164: 0x7F5D,\n\t12165: 0x7F5E,\n\t12166: 0x7F60,\n\t12167: 0x7F63,\n\t12168: 0x7F64,\n\t12169: 0x7F65,\n\t12170: 0x7F66,\n\t12171: 0x7F67,\n\t12172: 0x7F6B,\n\t12173: 0x7F6C,\n\t12174: 0x7F6D,\n\t12175: 0x7F6F,\n\t12176: 0x7F70,\n\t12177: 0x7F73,\n\t12178: 0x7F75,\n\t12179: 0x7F76,\n\t12180: 0x7F77,\n\t12181: 0x7F78,\n\t12182: 0x7F7A,\n\t12183: 0x7F7B,\n\t12184: 0x7F7C,\n\t12185: 0x7F7D,\n\t12186: 0x7F7F,\n\t12187: 0x7F80,\n\t12188: 0x7F82,\n\t12189: 0x7F83,\n\t12190: 0x7F84,\n\t12191: 0x7F85,\n\t12192: 0x7F86,\n\t12193: 0x7F87,\n\t12194: 0x7F88,\n\t12195: 0x7F89,\n\t12196: 0x7F8B,\n\t12197: 0x7F8D,\n\t12198: 0x7F8F,\n\t12199: 0x7F90,\n\t12200: 0x7F91,\n\t12201: 0x7F92,\n\t12202: 0x7F93,\n\t12203: 0x7F95,\n\t12204: 0x7F96,\n\t12205: 0x7F97,\n\t12206: 0x7F98,\n\t12207: 0x7F99,\n\t12208: 0x7F9B,\n\t12209: 0x7F9C,\n\t12210: 0x7FA0,\n\t12211: 0x7FA2,\n\t12212: 0x7FA3,\n\t12213: 0x7FA5,\n\t12214: 0x7FA6,\n\t12215: 0x7FA8,\n\t12216: 0x7FA9,\n\t12217: 0x7FAA,\n\t12218: 0x7FAB,\n\t12219: 0x7FAC,\n\t12220: 0x7FAD,\n\t12221: 0x7FAE,\n\t12222: 0x7FB1,\n\t12223: 0x7FB3,\n\t12224: 0x7FB4,\n\t12225: 0x7FB5,\n\t12226: 0x7FB6,\n\t12227: 0x7FB7,\n\t12228: 0x7FBA,\n\t12229: 0x7FBB,\n\t12230: 0x7FBE,\n\t12231: 0x7FC0,\n\t12232: 0x7FC2,\n\t12233: 0x7FC3,\n\t12234: 0x7FC4,\n\t12235: 0x7FC6,\n\t12236: 0x7FC7,\n\t12237: 0x7FC8,\n\t12238: 0x7FC9,\n\t12239: 0x7FCB,\n\t12240: 0x7FCD,\n\t12241: 0x7FCF,\n\t12242: 0x7FD0,\n\t12243: 0x7FD1,\n\t12244: 0x7FD2,\n\t12245: 0x7FD3,\n\t12246: 0x7FD6,\n\t12247: 0x7FD7,\n\t12248: 0x7FD9,\n\t12249: 0x7FDA,\n\t12250: 0x7FDB,\n\t12251: 0x7FDC,\n\t12252: 0x7FDD,\n\t12253: 0x7FDE,\n\t12254: 0x7FE2,\n\t12255: 0x7FE3,\n\t12256: 0x75E2,\n\t12257: 0x7ACB,\n\t12258: 0x7C92,\n\t12259: 0x6CA5,\n\t12260: 0x96B6,\n\t12261: 0x529B,\n\t12262: 0x7483,\n\t12263: 0x54E9,\n\t12264: 0x4FE9,\n\t12265: 0x8054,\n\t12266: 0x83B2,\n\t12267: 0x8FDE,\n\t12268: 0x9570,\n\t12269: 0x5EC9,\n\t12270: 0x601C,\n\t12271: 0x6D9F,\n\t12272: 0x5E18,\n\t12273: 0x655B,\n\t12274: 0x8138,\n\t12275: 0x94FE,\n\t12276: 0x604B,\n\t12277: 0x70BC,\n\t12278: 0x7EC3,\n\t12279: 0x7CAE,\n\t12280: 0x51C9,\n\t12281: 0x6881,\n\t12282: 0x7CB1,\n\t12283: 0x826F,\n\t12284: 0x4E24,\n\t12285: 0x8F86,\n\t12286: 0x91CF,\n\t12287: 0x667E,\n\t12288: 0x4EAE,\n\t12289: 0x8C05,\n\t12290: 0x64A9,\n\t12291: 0x804A,\n\t12292: 0x50DA,\n\t12293: 0x7597,\n\t12294: 0x71CE,\n\t12295: 0x5BE5,\n\t12296: 0x8FBD,\n\t12297: 0x6F66,\n\t12298: 0x4E86,\n\t12299: 0x6482,\n\t12300: 0x9563,\n\t12301: 0x5ED6,\n\t12302: 0x6599,\n\t12303: 0x5217,\n\t12304: 0x88C2,\n\t12305: 0x70C8,\n\t12306: 0x52A3,\n\t12307: 0x730E,\n\t12308: 0x7433,\n\t12309: 0x6797,\n\t12310: 0x78F7,\n\t12311: 0x9716,\n\t12312: 0x4E34,\n\t12313: 0x90BB,\n\t12314: 0x9CDE,\n\t12315: 0x6DCB,\n\t12316: 0x51DB,\n\t12317: 0x8D41,\n\t12318: 0x541D,\n\t12319: 0x62CE,\n\t12320: 0x73B2,\n\t12321: 0x83F1,\n\t12322: 0x96F6,\n\t12323: 0x9F84,\n\t12324: 0x94C3,\n\t12325: 0x4F36,\n\t12326: 0x7F9A,\n\t12327: 0x51CC,\n\t12328: 0x7075,\n\t12329: 0x9675,\n\t12330: 0x5CAD,\n\t12331: 0x9886,\n\t12332: 0x53E6,\n\t12333: 0x4EE4,\n\t12334: 0x6E9C,\n\t12335: 0x7409,\n\t12336: 0x69B4,\n\t12337: 0x786B,\n\t12338: 0x998F,\n\t12339: 0x7559,\n\t12340: 0x5218,\n\t12341: 0x7624,\n\t12342: 0x6D41,\n\t12343: 0x67F3,\n\t12344: 0x516D,\n\t12345: 0x9F99,\n\t12346: 0x804B,\n\t12347: 0x5499,\n\t12348: 0x7B3C,\n\t12349: 0x7ABF,\n\t12350: 0x7FE4,\n\t12351: 0x7FE7,\n\t12352: 0x7FE8,\n\t12353: 0x7FEA,\n\t12354: 0x7FEB,\n\t12355: 0x7FEC,\n\t12356: 0x7FED,\n\t12357: 0x7FEF,\n\t12358: 0x7FF2,\n\t12359: 0x7FF4,\n\t12360: 0x7FF5,\n\t12361: 0x7FF6,\n\t12362: 0x7FF7,\n\t12363: 0x7FF8,\n\t12364: 0x7FF9,\n\t12365: 0x7FFA,\n\t12366: 0x7FFD,\n\t12367: 0x7FFE,\n\t12368: 0x7FFF,\n\t12369: 0x8002,\n\t12370: 0x8007,\n\t12371: 0x8008,\n\t12372: 0x8009,\n\t12373: 0x800A,\n\t12374: 0x800E,\n\t12375: 0x800F,\n\t12376: 0x8011,\n\t12377: 0x8013,\n\t12378: 0x801A,\n\t12379: 0x801B,\n\t12380: 0x801D,\n\t12381: 0x801E,\n\t12382: 0x801F,\n\t12383: 0x8021,\n\t12384: 0x8023,\n\t12385: 0x8024,\n\t12386: 0x802B,\n\t12387: 0x802C,\n\t12388: 0x802D,\n\t12389: 0x802E,\n\t12390: 0x802F,\n\t12391: 0x8030,\n\t12392: 0x8032,\n\t12393: 0x8034,\n\t12394: 0x8039,\n\t12395: 0x803A,\n\t12396: 0x803C,\n\t12397: 0x803E,\n\t12398: 0x8040,\n\t12399: 0x8041,\n\t12400: 0x8044,\n\t12401: 0x8045,\n\t12402: 0x8047,\n\t12403: 0x8048,\n\t12404: 0x8049,\n\t12405: 0x804E,\n\t12406: 0x804F,\n\t12407: 0x8050,\n\t12408: 0x8051,\n\t12409: 0x8053,\n\t12410: 0x8055,\n\t12411: 0x8056,\n\t12412: 0x8057,\n\t12413: 0x8059,\n\t12414: 0x805B,\n\t12415: 0x805C,\n\t12416: 0x805D,\n\t12417: 0x805E,\n\t12418: 0x805F,\n\t12419: 0x8060,\n\t12420: 0x8061,\n\t12421: 0x8062,\n\t12422: 0x8063,\n\t12423: 0x8064,\n\t12424: 0x8065,\n\t12425: 0x8066,\n\t12426: 0x8067,\n\t12427: 0x8068,\n\t12428: 0x806B,\n\t12429: 0x806C,\n\t12430: 0x806D,\n\t12431: 0x806E,\n\t12432: 0x806F,\n\t12433: 0x8070,\n\t12434: 0x8072,\n\t12435: 0x8073,\n\t12436: 0x8074,\n\t12437: 0x8075,\n\t12438: 0x8076,\n\t12439: 0x8077,\n\t12440: 0x8078,\n\t12441: 0x8079,\n\t12442: 0x807A,\n\t12443: 0x807B,\n\t12444: 0x807C,\n\t12445: 0x807D,\n\t12446: 0x9686,\n\t12447: 0x5784,\n\t12448: 0x62E2,\n\t12449: 0x9647,\n\t12450: 0x697C,\n\t12451: 0x5A04,\n\t12452: 0x6402,\n\t12453: 0x7BD3,\n\t12454: 0x6F0F,\n\t12455: 0x964B,\n\t12456: 0x82A6,\n\t12457: 0x5362,\n\t12458: 0x9885,\n\t12459: 0x5E90,\n\t12460: 0x7089,\n\t12461: 0x63B3,\n\t12462: 0x5364,\n\t12463: 0x864F,\n\t12464: 0x9C81,\n\t12465: 0x9E93,\n\t12466: 0x788C,\n\t12467: 0x9732,\n\t12468: 0x8DEF,\n\t12469: 0x8D42,\n\t12470: 0x9E7F,\n\t12471: 0x6F5E,\n\t12472: 0x7984,\n\t12473: 0x5F55,\n\t12474: 0x9646,\n\t12475: 0x622E,\n\t12476: 0x9A74,\n\t12477: 0x5415,\n\t12478: 0x94DD,\n\t12479: 0x4FA3,\n\t12480: 0x65C5,\n\t12481: 0x5C65,\n\t12482: 0x5C61,\n\t12483: 0x7F15,\n\t12484: 0x8651,\n\t12485: 0x6C2F,\n\t12486: 0x5F8B,\n\t12487: 0x7387,\n\t12488: 0x6EE4,\n\t12489: 0x7EFF,\n\t12490: 0x5CE6,\n\t12491: 0x631B,\n\t12492: 0x5B6A,\n\t12493: 0x6EE6,\n\t12494: 0x5375,\n\t12495: 0x4E71,\n\t12496: 0x63A0,\n\t12497: 0x7565,\n\t12498: 0x62A1,\n\t12499: 0x8F6E,\n\t12500: 0x4F26,\n\t12501: 0x4ED1,\n\t12502: 0x6CA6,\n\t12503: 0x7EB6,\n\t12504: 0x8BBA,\n\t12505: 0x841D,\n\t12506: 0x87BA,\n\t12507: 0x7F57,\n\t12508: 0x903B,\n\t12509: 0x9523,\n\t12510: 0x7BA9,\n\t12511: 0x9AA1,\n\t12512: 0x88F8,\n\t12513: 0x843D,\n\t12514: 0x6D1B,\n\t12515: 0x9A86,\n\t12516: 0x7EDC,\n\t12517: 0x5988,\n\t12518: 0x9EBB,\n\t12519: 0x739B,\n\t12520: 0x7801,\n\t12521: 0x8682,\n\t12522: 0x9A6C,\n\t12523: 0x9A82,\n\t12524: 0x561B,\n\t12525: 0x5417,\n\t12526: 0x57CB,\n\t12527: 0x4E70,\n\t12528: 0x9EA6,\n\t12529: 0x5356,\n\t12530: 0x8FC8,\n\t12531: 0x8109,\n\t12532: 0x7792,\n\t12533: 0x9992,\n\t12534: 0x86EE,\n\t12535: 0x6EE1,\n\t12536: 0x8513,\n\t12537: 0x66FC,\n\t12538: 0x6162,\n\t12539: 0x6F2B,\n\t12540: 0x807E,\n\t12541: 0x8081,\n\t12542: 0x8082,\n\t12543: 0x8085,\n\t12544: 0x8088,\n\t12545: 0x808A,\n\t12546: 0x808D,\n\t12547: 0x808E,\n\t12548: 0x808F,\n\t12549: 0x8090,\n\t12550: 0x8091,\n\t12551: 0x8092,\n\t12552: 0x8094,\n\t12553: 0x8095,\n\t12554: 0x8097,\n\t12555: 0x8099,\n\t12556: 0x809E,\n\t12557: 0x80A3,\n\t12558: 0x80A6,\n\t12559: 0x80A7,\n\t12560: 0x80A8,\n\t12561: 0x80AC,\n\t12562: 0x80B0,\n\t12563: 0x80B3,\n\t12564: 0x80B5,\n\t12565: 0x80B6,\n\t12566: 0x80B8,\n\t12567: 0x80B9,\n\t12568: 0x80BB,\n\t12569: 0x80C5,\n\t12570: 0x80C7,\n\t12571: 0x80C8,\n\t12572: 0x80C9,\n\t12573: 0x80CA,\n\t12574: 0x80CB,\n\t12575: 0x80CF,\n\t12576: 0x80D0,\n\t12577: 0x80D1,\n\t12578: 0x80D2,\n\t12579: 0x80D3,\n\t12580: 0x80D4,\n\t12581: 0x80D5,\n\t12582: 0x80D8,\n\t12583: 0x80DF,\n\t12584: 0x80E0,\n\t12585: 0x80E2,\n\t12586: 0x80E3,\n\t12587: 0x80E6,\n\t12588: 0x80EE,\n\t12589: 0x80F5,\n\t12590: 0x80F7,\n\t12591: 0x80F9,\n\t12592: 0x80FB,\n\t12593: 0x80FE,\n\t12594: 0x80FF,\n\t12595: 0x8100,\n\t12596: 0x8101,\n\t12597: 0x8103,\n\t12598: 0x8104,\n\t12599: 0x8105,\n\t12600: 0x8107,\n\t12601: 0x8108,\n\t12602: 0x810B,\n\t12603: 0x810C,\n\t12604: 0x8115,\n\t12605: 0x8117,\n\t12606: 0x8119,\n\t12607: 0x811B,\n\t12608: 0x811C,\n\t12609: 0x811D,\n\t12610: 0x811F,\n\t12611: 0x8120,\n\t12612: 0x8121,\n\t12613: 0x8122,\n\t12614: 0x8123,\n\t12615: 0x8124,\n\t12616: 0x8125,\n\t12617: 0x8126,\n\t12618: 0x8127,\n\t12619: 0x8128,\n\t12620: 0x8129,\n\t12621: 0x812A,\n\t12622: 0x812B,\n\t12623: 0x812D,\n\t12624: 0x812E,\n\t12625: 0x8130,\n\t12626: 0x8133,\n\t12627: 0x8134,\n\t12628: 0x8135,\n\t12629: 0x8137,\n\t12630: 0x8139,\n\t12631: 0x813A,\n\t12632: 0x813B,\n\t12633: 0x813C,\n\t12634: 0x813D,\n\t12635: 0x813F,\n\t12636: 0x8C29,\n\t12637: 0x8292,\n\t12638: 0x832B,\n\t12639: 0x76F2,\n\t12640: 0x6C13,\n\t12641: 0x5FD9,\n\t12642: 0x83BD,\n\t12643: 0x732B,\n\t12644: 0x8305,\n\t12645: 0x951A,\n\t12646: 0x6BDB,\n\t12647: 0x77DB,\n\t12648: 0x94C6,\n\t12649: 0x536F,\n\t12650: 0x8302,\n\t12651: 0x5192,\n\t12652: 0x5E3D,\n\t12653: 0x8C8C,\n\t12654: 0x8D38,\n\t12655: 0x4E48,\n\t12656: 0x73AB,\n\t12657: 0x679A,\n\t12658: 0x6885,\n\t12659: 0x9176,\n\t12660: 0x9709,\n\t12661: 0x7164,\n\t12662: 0x6CA1,\n\t12663: 0x7709,\n\t12664: 0x5A92,\n\t12665: 0x9541,\n\t12666: 0x6BCF,\n\t12667: 0x7F8E,\n\t12668: 0x6627,\n\t12669: 0x5BD0,\n\t12670: 0x59B9,\n\t12671: 0x5A9A,\n\t12672: 0x95E8,\n\t12673: 0x95F7,\n\t12674: 0x4EEC,\n\t12675: 0x840C,\n\t12676: 0x8499,\n\t12677: 0x6AAC,\n\t12678: 0x76DF,\n\t12679: 0x9530,\n\t12680: 0x731B,\n\t12681: 0x68A6,\n\t12682: 0x5B5F,\n\t12683: 0x772F,\n\t12684: 0x919A,\n\t12685: 0x9761,\n\t12686: 0x7CDC,\n\t12687: 0x8FF7,\n\t12688: 0x8C1C,\n\t12689: 0x5F25,\n\t12690: 0x7C73,\n\t12691: 0x79D8,\n\t12692: 0x89C5,\n\t12693: 0x6CCC,\n\t12694: 0x871C,\n\t12695: 0x5BC6,\n\t12696: 0x5E42,\n\t12697: 0x68C9,\n\t12698: 0x7720,\n\t12699: 0x7EF5,\n\t12700: 0x5195,\n\t12701: 0x514D,\n\t12702: 0x52C9,\n\t12703: 0x5A29,\n\t12704: 0x7F05,\n\t12705: 0x9762,\n\t12706: 0x82D7,\n\t12707: 0x63CF,\n\t12708: 0x7784,\n\t12709: 0x85D0,\n\t12710: 0x79D2,\n\t12711: 0x6E3A,\n\t12712: 0x5E99,\n\t12713: 0x5999,\n\t12714: 0x8511,\n\t12715: 0x706D,\n\t12716: 0x6C11,\n\t12717: 0x62BF,\n\t12718: 0x76BF,\n\t12719: 0x654F,\n\t12720: 0x60AF,\n\t12721: 0x95FD,\n\t12722: 0x660E,\n\t12723: 0x879F,\n\t12724: 0x9E23,\n\t12725: 0x94ED,\n\t12726: 0x540D,\n\t12727: 0x547D,\n\t12728: 0x8C2C,\n\t12729: 0x6478,\n\t12730: 0x8140,\n\t12731: 0x8141,\n\t12732: 0x8142,\n\t12733: 0x8143,\n\t12734: 0x8144,\n\t12735: 0x8145,\n\t12736: 0x8147,\n\t12737: 0x8149,\n\t12738: 0x814D,\n\t12739: 0x814E,\n\t12740: 0x814F,\n\t12741: 0x8152,\n\t12742: 0x8156,\n\t12743: 0x8157,\n\t12744: 0x8158,\n\t12745: 0x815B,\n\t12746: 0x815C,\n\t12747: 0x815D,\n\t12748: 0x815E,\n\t12749: 0x815F,\n\t12750: 0x8161,\n\t12751: 0x8162,\n\t12752: 0x8163,\n\t12753: 0x8164,\n\t12754: 0x8166,\n\t12755: 0x8168,\n\t12756: 0x816A,\n\t12757: 0x816B,\n\t12758: 0x816C,\n\t12759: 0x816F,\n\t12760: 0x8172,\n\t12761: 0x8173,\n\t12762: 0x8175,\n\t12763: 0x8176,\n\t12764: 0x8177,\n\t12765: 0x8178,\n\t12766: 0x8181,\n\t12767: 0x8183,\n\t12768: 0x8184,\n\t12769: 0x8185,\n\t12770: 0x8186,\n\t12771: 0x8187,\n\t12772: 0x8189,\n\t12773: 0x818B,\n\t12774: 0x818C,\n\t12775: 0x818D,\n\t12776: 0x818E,\n\t12777: 0x8190,\n\t12778: 0x8192,\n\t12779: 0x8193,\n\t12780: 0x8194,\n\t12781: 0x8195,\n\t12782: 0x8196,\n\t12783: 0x8197,\n\t12784: 0x8199,\n\t12785: 0x819A,\n\t12786: 0x819E,\n\t12787: 0x819F,\n\t12788: 0x81A0,\n\t12789: 0x81A1,\n\t12790: 0x81A2,\n\t12791: 0x81A4,\n\t12792: 0x81A5,\n\t12793: 0x81A7,\n\t12794: 0x81A9,\n\t12795: 0x81AB,\n\t12796: 0x81AC,\n\t12797: 0x81AD,\n\t12798: 0x81AE,\n\t12799: 0x81AF,\n\t12800: 0x81B0,\n\t12801: 0x81B1,\n\t12802: 0x81B2,\n\t12803: 0x81B4,\n\t12804: 0x81B5,\n\t12805: 0x81B6,\n\t12806: 0x81B7,\n\t12807: 0x81B8,\n\t12808: 0x81B9,\n\t12809: 0x81BC,\n\t12810: 0x81BD,\n\t12811: 0x81BE,\n\t12812: 0x81BF,\n\t12813: 0x81C4,\n\t12814: 0x81C5,\n\t12815: 0x81C7,\n\t12816: 0x81C8,\n\t12817: 0x81C9,\n\t12818: 0x81CB,\n\t12819: 0x81CD,\n\t12820: 0x81CE,\n\t12821: 0x81CF,\n\t12822: 0x81D0,\n\t12823: 0x81D1,\n\t12824: 0x81D2,\n\t12825: 0x81D3,\n\t12826: 0x6479,\n\t12827: 0x8611,\n\t12828: 0x6A21,\n\t12829: 0x819C,\n\t12830: 0x78E8,\n\t12831: 0x6469,\n\t12832: 0x9B54,\n\t12833: 0x62B9,\n\t12834: 0x672B,\n\t12835: 0x83AB,\n\t12836: 0x58A8,\n\t12837: 0x9ED8,\n\t12838: 0x6CAB,\n\t12839: 0x6F20,\n\t12840: 0x5BDE,\n\t12841: 0x964C,\n\t12842: 0x8C0B,\n\t12843: 0x725F,\n\t12844: 0x67D0,\n\t12845: 0x62C7,\n\t12846: 0x7261,\n\t12847: 0x4EA9,\n\t12848: 0x59C6,\n\t12849: 0x6BCD,\n\t12850: 0x5893,\n\t12851: 0x66AE,\n\t12852: 0x5E55,\n\t12853: 0x52DF,\n\t12854: 0x6155,\n\t12855: 0x6728,\n\t12856: 0x76EE,\n\t12857: 0x7766,\n\t12858: 0x7267,\n\t12859: 0x7A46,\n\t12860: 0x62FF,\n\t12861: 0x54EA,\n\t12862: 0x5450,\n\t12863: 0x94A0,\n\t12864: 0x90A3,\n\t12865: 0x5A1C,\n\t12866: 0x7EB3,\n\t12867: 0x6C16,\n\t12868: 0x4E43,\n\t12869: 0x5976,\n\t12870: 0x8010,\n\t12871: 0x5948,\n\t12872: 0x5357,\n\t12873: 0x7537,\n\t12874: 0x96BE,\n\t12875: 0x56CA,\n\t12876: 0x6320,\n\t12877: 0x8111,\n\t12878: 0x607C,\n\t12879: 0x95F9,\n\t12880: 0x6DD6,\n\t12881: 0x5462,\n\t12882: 0x9981,\n\t12883: 0x5185,\n\t12884: 0x5AE9,\n\t12885: 0x80FD,\n\t12886: 0x59AE,\n\t12887: 0x9713,\n\t12888: 0x502A,\n\t12889: 0x6CE5,\n\t12890: 0x5C3C,\n\t12891: 0x62DF,\n\t12892: 0x4F60,\n\t12893: 0x533F,\n\t12894: 0x817B,\n\t12895: 0x9006,\n\t12896: 0x6EBA,\n\t12897: 0x852B,\n\t12898: 0x62C8,\n\t12899: 0x5E74,\n\t12900: 0x78BE,\n\t12901: 0x64B5,\n\t12902: 0x637B,\n\t12903: 0x5FF5,\n\t12904: 0x5A18,\n\t12905: 0x917F,\n\t12906: 0x9E1F,\n\t12907: 0x5C3F,\n\t12908: 0x634F,\n\t12909: 0x8042,\n\t12910: 0x5B7D,\n\t12911: 0x556E,\n\t12912: 0x954A,\n\t12913: 0x954D,\n\t12914: 0x6D85,\n\t12915: 0x60A8,\n\t12916: 0x67E0,\n\t12917: 0x72DE,\n\t12918: 0x51DD,\n\t12919: 0x5B81,\n\t12920: 0x81D4,\n\t12921: 0x81D5,\n\t12922: 0x81D6,\n\t12923: 0x81D7,\n\t12924: 0x81D8,\n\t12925: 0x81D9,\n\t12926: 0x81DA,\n\t12927: 0x81DB,\n\t12928: 0x81DC,\n\t12929: 0x81DD,\n\t12930: 0x81DE,\n\t12931: 0x81DF,\n\t12932: 0x81E0,\n\t12933: 0x81E1,\n\t12934: 0x81E2,\n\t12935: 0x81E4,\n\t12936: 0x81E5,\n\t12937: 0x81E6,\n\t12938: 0x81E8,\n\t12939: 0x81E9,\n\t12940: 0x81EB,\n\t12941: 0x81EE,\n\t12942: 0x81EF,\n\t12943: 0x81F0,\n\t12944: 0x81F1,\n\t12945: 0x81F2,\n\t12946: 0x81F5,\n\t12947: 0x81F6,\n\t12948: 0x81F7,\n\t12949: 0x81F8,\n\t12950: 0x81F9,\n\t12951: 0x81FA,\n\t12952: 0x81FD,\n\t12953: 0x81FF,\n\t12954: 0x8203,\n\t12955: 0x8207,\n\t12956: 0x8208,\n\t12957: 0x8209,\n\t12958: 0x820A,\n\t12959: 0x820B,\n\t12960: 0x820E,\n\t12961: 0x820F,\n\t12962: 0x8211,\n\t12963: 0x8213,\n\t12964: 0x8215,\n\t12965: 0x8216,\n\t12966: 0x8217,\n\t12967: 0x8218,\n\t12968: 0x8219,\n\t12969: 0x821A,\n\t12970: 0x821D,\n\t12971: 0x8220,\n\t12972: 0x8224,\n\t12973: 0x8225,\n\t12974: 0x8226,\n\t12975: 0x8227,\n\t12976: 0x8229,\n\t12977: 0x822E,\n\t12978: 0x8232,\n\t12979: 0x823A,\n\t12980: 0x823C,\n\t12981: 0x823D,\n\t12982: 0x823F,\n\t12983: 0x8240,\n\t12984: 0x8241,\n\t12985: 0x8242,\n\t12986: 0x8243,\n\t12987: 0x8245,\n\t12988: 0x8246,\n\t12989: 0x8248,\n\t12990: 0x824A,\n\t12991: 0x824C,\n\t12992: 0x824D,\n\t12993: 0x824E,\n\t12994: 0x8250,\n\t12995: 0x8251,\n\t12996: 0x8252,\n\t12997: 0x8253,\n\t12998: 0x8254,\n\t12999: 0x8255,\n\t13000: 0x8256,\n\t13001: 0x8257,\n\t13002: 0x8259,\n\t13003: 0x825B,\n\t13004: 0x825C,\n\t13005: 0x825D,\n\t13006: 0x825E,\n\t13007: 0x8260,\n\t13008: 0x8261,\n\t13009: 0x8262,\n\t13010: 0x8263,\n\t13011: 0x8264,\n\t13012: 0x8265,\n\t13013: 0x8266,\n\t13014: 0x8267,\n\t13015: 0x8269,\n\t13016: 0x62E7,\n\t13017: 0x6CDE,\n\t13018: 0x725B,\n\t13019: 0x626D,\n\t13020: 0x94AE,\n\t13021: 0x7EBD,\n\t13022: 0x8113,\n\t13023: 0x6D53,\n\t13024: 0x519C,\n\t13025: 0x5F04,\n\t13026: 0x5974,\n\t13027: 0x52AA,\n\t13028: 0x6012,\n\t13029: 0x5973,\n\t13030: 0x6696,\n\t13031: 0x8650,\n\t13032: 0x759F,\n\t13033: 0x632A,\n\t13034: 0x61E6,\n\t13035: 0x7CEF,\n\t13036: 0x8BFA,\n\t13037: 0x54E6,\n\t13038: 0x6B27,\n\t13039: 0x9E25,\n\t13040: 0x6BB4,\n\t13041: 0x85D5,\n\t13042: 0x5455,\n\t13043: 0x5076,\n\t13044: 0x6CA4,\n\t13045: 0x556A,\n\t13046: 0x8DB4,\n\t13047: 0x722C,\n\t13048: 0x5E15,\n\t13049: 0x6015,\n\t13050: 0x7436,\n\t13051: 0x62CD,\n\t13052: 0x6392,\n\t13053: 0x724C,\n\t13054: 0x5F98,\n\t13055: 0x6E43,\n\t13056: 0x6D3E,\n\t13057: 0x6500,\n\t13058: 0x6F58,\n\t13059: 0x76D8,\n\t13060: 0x78D0,\n\t13061: 0x76FC,\n\t13062: 0x7554,\n\t13063: 0x5224,\n\t13064: 0x53DB,\n\t13065: 0x4E53,\n\t13066: 0x5E9E,\n\t13067: 0x65C1,\n\t13068: 0x802A,\n\t13069: 0x80D6,\n\t13070: 0x629B,\n\t13071: 0x5486,\n\t13072: 0x5228,\n\t13073: 0x70AE,\n\t13074: 0x888D,\n\t13075: 0x8DD1,\n\t13076: 0x6CE1,\n\t13077: 0x5478,\n\t13078: 0x80DA,\n\t13079: 0x57F9,\n\t13080: 0x88F4,\n\t13081: 0x8D54,\n\t13082: 0x966A,\n\t13083: 0x914D,\n\t13084: 0x4F69,\n\t13085: 0x6C9B,\n\t13086: 0x55B7,\n\t13087: 0x76C6,\n\t13088: 0x7830,\n\t13089: 0x62A8,\n\t13090: 0x70F9,\n\t13091: 0x6F8E,\n\t13092: 0x5F6D,\n\t13093: 0x84EC,\n\t13094: 0x68DA,\n\t13095: 0x787C,\n\t13096: 0x7BF7,\n\t13097: 0x81A8,\n\t13098: 0x670B,\n\t13099: 0x9E4F,\n\t13100: 0x6367,\n\t13101: 0x78B0,\n\t13102: 0x576F,\n\t13103: 0x7812,\n\t13104: 0x9739,\n\t13105: 0x6279,\n\t13106: 0x62AB,\n\t13107: 0x5288,\n\t13108: 0x7435,\n\t13109: 0x6BD7,\n\t13110: 0x826A,\n\t13111: 0x826B,\n\t13112: 0x826C,\n\t13113: 0x826D,\n\t13114: 0x8271,\n\t13115: 0x8275,\n\t13116: 0x8276,\n\t13117: 0x8277,\n\t13118: 0x8278,\n\t13119: 0x827B,\n\t13120: 0x827C,\n\t13121: 0x8280,\n\t13122: 0x8281,\n\t13123: 0x8283,\n\t13124: 0x8285,\n\t13125: 0x8286,\n\t13126: 0x8287,\n\t13127: 0x8289,\n\t13128: 0x828C,\n\t13129: 0x8290,\n\t13130: 0x8293,\n\t13131: 0x8294,\n\t13132: 0x8295,\n\t13133: 0x8296,\n\t13134: 0x829A,\n\t13135: 0x829B,\n\t13136: 0x829E,\n\t13137: 0x82A0,\n\t13138: 0x82A2,\n\t13139: 0x82A3,\n\t13140: 0x82A7,\n\t13141: 0x82B2,\n\t13142: 0x82B5,\n\t13143: 0x82B6,\n\t13144: 0x82BA,\n\t13145: 0x82BB,\n\t13146: 0x82BC,\n\t13147: 0x82BF,\n\t13148: 0x82C0,\n\t13149: 0x82C2,\n\t13150: 0x82C3,\n\t13151: 0x82C5,\n\t13152: 0x82C6,\n\t13153: 0x82C9,\n\t13154: 0x82D0,\n\t13155: 0x82D6,\n\t13156: 0x82D9,\n\t13157: 0x82DA,\n\t13158: 0x82DD,\n\t13159: 0x82E2,\n\t13160: 0x82E7,\n\t13161: 0x82E8,\n\t13162: 0x82E9,\n\t13163: 0x82EA,\n\t13164: 0x82EC,\n\t13165: 0x82ED,\n\t13166: 0x82EE,\n\t13167: 0x82F0,\n\t13168: 0x82F2,\n\t13169: 0x82F3,\n\t13170: 0x82F5,\n\t13171: 0x82F6,\n\t13172: 0x82F8,\n\t13173: 0x82FA,\n\t13174: 0x82FC,\n\t13175: 0x82FD,\n\t13176: 0x82FE,\n\t13177: 0x82FF,\n\t13178: 0x8300,\n\t13179: 0x830A,\n\t13180: 0x830B,\n\t13181: 0x830D,\n\t13182: 0x8310,\n\t13183: 0x8312,\n\t13184: 0x8313,\n\t13185: 0x8316,\n\t13186: 0x8318,\n\t13187: 0x8319,\n\t13188: 0x831D,\n\t13189: 0x831E,\n\t13190: 0x831F,\n\t13191: 0x8320,\n\t13192: 0x8321,\n\t13193: 0x8322,\n\t13194: 0x8323,\n\t13195: 0x8324,\n\t13196: 0x8325,\n\t13197: 0x8326,\n\t13198: 0x8329,\n\t13199: 0x832A,\n\t13200: 0x832E,\n\t13201: 0x8330,\n\t13202: 0x8332,\n\t13203: 0x8337,\n\t13204: 0x833B,\n\t13205: 0x833D,\n\t13206: 0x5564,\n\t13207: 0x813E,\n\t13208: 0x75B2,\n\t13209: 0x76AE,\n\t13210: 0x5339,\n\t13211: 0x75DE,\n\t13212: 0x50FB,\n\t13213: 0x5C41,\n\t13214: 0x8B6C,\n\t13215: 0x7BC7,\n\t13216: 0x504F,\n\t13217: 0x7247,\n\t13218: 0x9A97,\n\t13219: 0x98D8,\n\t13220: 0x6F02,\n\t13221: 0x74E2,\n\t13222: 0x7968,\n\t13223: 0x6487,\n\t13224: 0x77A5,\n\t13225: 0x62FC,\n\t13226: 0x9891,\n\t13227: 0x8D2B,\n\t13228: 0x54C1,\n\t13229: 0x8058,\n\t13230: 0x4E52,\n\t13231: 0x576A,\n\t13232: 0x82F9,\n\t13233: 0x840D,\n\t13234: 0x5E73,\n\t13235: 0x51ED,\n\t13236: 0x74F6,\n\t13237: 0x8BC4,\n\t13238: 0x5C4F,\n\t13239: 0x5761,\n\t13240: 0x6CFC,\n\t13241: 0x9887,\n\t13242: 0x5A46,\n\t13243: 0x7834,\n\t13244: 0x9B44,\n\t13245: 0x8FEB,\n\t13246: 0x7C95,\n\t13247: 0x5256,\n\t13248: 0x6251,\n\t13249: 0x94FA,\n\t13250: 0x4EC6,\n\t13251: 0x8386,\n\t13252: 0x8461,\n\t13253: 0x83E9,\n\t13254: 0x84B2,\n\t13255: 0x57D4,\n\t13256: 0x6734,\n\t13257: 0x5703,\n\t13258: 0x666E,\n\t13259: 0x6D66,\n\t13260: 0x8C31,\n\t13261: 0x66DD,\n\t13262: 0x7011,\n\t13263: 0x671F,\n\t13264: 0x6B3A,\n\t13265: 0x6816,\n\t13266: 0x621A,\n\t13267: 0x59BB,\n\t13268: 0x4E03,\n\t13269: 0x51C4,\n\t13270: 0x6F06,\n\t13271: 0x67D2,\n\t13272: 0x6C8F,\n\t13273: 0x5176,\n\t13274: 0x68CB,\n\t13275: 0x5947,\n\t13276: 0x6B67,\n\t13277: 0x7566,\n\t13278: 0x5D0E,\n\t13279: 0x8110,\n\t13280: 0x9F50,\n\t13281: 0x65D7,\n\t13282: 0x7948,\n\t13283: 0x7941,\n\t13284: 0x9A91,\n\t13285: 0x8D77,\n\t13286: 0x5C82,\n\t13287: 0x4E5E,\n\t13288: 0x4F01,\n\t13289: 0x542F,\n\t13290: 0x5951,\n\t13291: 0x780C,\n\t13292: 0x5668,\n\t13293: 0x6C14,\n\t13294: 0x8FC4,\n\t13295: 0x5F03,\n\t13296: 0x6C7D,\n\t13297: 0x6CE3,\n\t13298: 0x8BAB,\n\t13299: 0x6390,\n\t13300: 0x833E,\n\t13301: 0x833F,\n\t13302: 0x8341,\n\t13303: 0x8342,\n\t13304: 0x8344,\n\t13305: 0x8345,\n\t13306: 0x8348,\n\t13307: 0x834A,\n\t13308: 0x834B,\n\t13309: 0x834C,\n\t13310: 0x834D,\n\t13311: 0x834E,\n\t13312: 0x8353,\n\t13313: 0x8355,\n\t13314: 0x8356,\n\t13315: 0x8357,\n\t13316: 0x8358,\n\t13317: 0x8359,\n\t13318: 0x835D,\n\t13319: 0x8362,\n\t13320: 0x8370,\n\t13321: 0x8371,\n\t13322: 0x8372,\n\t13323: 0x8373,\n\t13324: 0x8374,\n\t13325: 0x8375,\n\t13326: 0x8376,\n\t13327: 0x8379,\n\t13328: 0x837A,\n\t13329: 0x837E,\n\t13330: 0x837F,\n\t13331: 0x8380,\n\t13332: 0x8381,\n\t13333: 0x8382,\n\t13334: 0x8383,\n\t13335: 0x8384,\n\t13336: 0x8387,\n\t13337: 0x8388,\n\t13338: 0x838A,\n\t13339: 0x838B,\n\t13340: 0x838C,\n\t13341: 0x838D,\n\t13342: 0x838F,\n\t13343: 0x8390,\n\t13344: 0x8391,\n\t13345: 0x8394,\n\t13346: 0x8395,\n\t13347: 0x8396,\n\t13348: 0x8397,\n\t13349: 0x8399,\n\t13350: 0x839A,\n\t13351: 0x839D,\n\t13352: 0x839F,\n\t13353: 0x83A1,\n\t13354: 0x83A2,\n\t13355: 0x83A3,\n\t13356: 0x83A4,\n\t13357: 0x83A5,\n\t13358: 0x83A6,\n\t13359: 0x83A7,\n\t13360: 0x83AC,\n\t13361: 0x83AD,\n\t13362: 0x83AE,\n\t13363: 0x83AF,\n\t13364: 0x83B5,\n\t13365: 0x83BB,\n\t13366: 0x83BE,\n\t13367: 0x83BF,\n\t13368: 0x83C2,\n\t13369: 0x83C3,\n\t13370: 0x83C4,\n\t13371: 0x83C6,\n\t13372: 0x83C8,\n\t13373: 0x83C9,\n\t13374: 0x83CB,\n\t13375: 0x83CD,\n\t13376: 0x83CE,\n\t13377: 0x83D0,\n\t13378: 0x83D1,\n\t13379: 0x83D2,\n\t13380: 0x83D3,\n\t13381: 0x83D5,\n\t13382: 0x83D7,\n\t13383: 0x83D9,\n\t13384: 0x83DA,\n\t13385: 0x83DB,\n\t13386: 0x83DE,\n\t13387: 0x83E2,\n\t13388: 0x83E3,\n\t13389: 0x83E4,\n\t13390: 0x83E6,\n\t13391: 0x83E7,\n\t13392: 0x83E8,\n\t13393: 0x83EB,\n\t13394: 0x83EC,\n\t13395: 0x83ED,\n\t13396: 0x6070,\n\t13397: 0x6D3D,\n\t13398: 0x7275,\n\t13399: 0x6266,\n\t13400: 0x948E,\n\t13401: 0x94C5,\n\t13402: 0x5343,\n\t13403: 0x8FC1,\n\t13404: 0x7B7E,\n\t13405: 0x4EDF,\n\t13406: 0x8C26,\n\t13407: 0x4E7E,\n\t13408: 0x9ED4,\n\t13409: 0x94B1,\n\t13410: 0x94B3,\n\t13411: 0x524D,\n\t13412: 0x6F5C,\n\t13413: 0x9063,\n\t13414: 0x6D45,\n\t13415: 0x8C34,\n\t13416: 0x5811,\n\t13417: 0x5D4C,\n\t13418: 0x6B20,\n\t13419: 0x6B49,\n\t13420: 0x67AA,\n\t13421: 0x545B,\n\t13422: 0x8154,\n\t13423: 0x7F8C,\n\t13424: 0x5899,\n\t13425: 0x8537,\n\t13426: 0x5F3A,\n\t13427: 0x62A2,\n\t13428: 0x6A47,\n\t13429: 0x9539,\n\t13430: 0x6572,\n\t13431: 0x6084,\n\t13432: 0x6865,\n\t13433: 0x77A7,\n\t13434: 0x4E54,\n\t13435: 0x4FA8,\n\t13436: 0x5DE7,\n\t13437: 0x9798,\n\t13438: 0x64AC,\n\t13439: 0x7FD8,\n\t13440: 0x5CED,\n\t13441: 0x4FCF,\n\t13442: 0x7A8D,\n\t13443: 0x5207,\n\t13444: 0x8304,\n\t13445: 0x4E14,\n\t13446: 0x602F,\n\t13447: 0x7A83,\n\t13448: 0x94A6,\n\t13449: 0x4FB5,\n\t13450: 0x4EB2,\n\t13451: 0x79E6,\n\t13452: 0x7434,\n\t13453: 0x52E4,\n\t13454: 0x82B9,\n\t13455: 0x64D2,\n\t13456: 0x79BD,\n\t13457: 0x5BDD,\n\t13458: 0x6C81,\n\t13459: 0x9752,\n\t13460: 0x8F7B,\n\t13461: 0x6C22,\n\t13462: 0x503E,\n\t13463: 0x537F,\n\t13464: 0x6E05,\n\t13465: 0x64CE,\n\t13466: 0x6674,\n\t13467: 0x6C30,\n\t13468: 0x60C5,\n\t13469: 0x9877,\n\t13470: 0x8BF7,\n\t13471: 0x5E86,\n\t13472: 0x743C,\n\t13473: 0x7A77,\n\t13474: 0x79CB,\n\t13475: 0x4E18,\n\t13476: 0x90B1,\n\t13477: 0x7403,\n\t13478: 0x6C42,\n\t13479: 0x56DA,\n\t13480: 0x914B,\n\t13481: 0x6CC5,\n\t13482: 0x8D8B,\n\t13483: 0x533A,\n\t13484: 0x86C6,\n\t13485: 0x66F2,\n\t13486: 0x8EAF,\n\t13487: 0x5C48,\n\t13488: 0x9A71,\n\t13489: 0x6E20,\n\t13490: 0x83EE,\n\t13491: 0x83EF,\n\t13492: 0x83F3,\n\t13493: 0x83F4,\n\t13494: 0x83F5,\n\t13495: 0x83F6,\n\t13496: 0x83F7,\n\t13497: 0x83FA,\n\t13498: 0x83FB,\n\t13499: 0x83FC,\n\t13500: 0x83FE,\n\t13501: 0x83FF,\n\t13502: 0x8400,\n\t13503: 0x8402,\n\t13504: 0x8405,\n\t13505: 0x8407,\n\t13506: 0x8408,\n\t13507: 0x8409,\n\t13508: 0x840A,\n\t13509: 0x8410,\n\t13510: 0x8412,\n\t13511: 0x8413,\n\t13512: 0x8414,\n\t13513: 0x8415,\n\t13514: 0x8416,\n\t13515: 0x8417,\n\t13516: 0x8419,\n\t13517: 0x841A,\n\t13518: 0x841B,\n\t13519: 0x841E,\n\t13520: 0x841F,\n\t13521: 0x8420,\n\t13522: 0x8421,\n\t13523: 0x8422,\n\t13524: 0x8423,\n\t13525: 0x8429,\n\t13526: 0x842A,\n\t13527: 0x842B,\n\t13528: 0x842C,\n\t13529: 0x842D,\n\t13530: 0x842E,\n\t13531: 0x842F,\n\t13532: 0x8430,\n\t13533: 0x8432,\n\t13534: 0x8433,\n\t13535: 0x8434,\n\t13536: 0x8435,\n\t13537: 0x8436,\n\t13538: 0x8437,\n\t13539: 0x8439,\n\t13540: 0x843A,\n\t13541: 0x843B,\n\t13542: 0x843E,\n\t13543: 0x843F,\n\t13544: 0x8440,\n\t13545: 0x8441,\n\t13546: 0x8442,\n\t13547: 0x8443,\n\t13548: 0x8444,\n\t13549: 0x8445,\n\t13550: 0x8447,\n\t13551: 0x8448,\n\t13552: 0x8449,\n\t13553: 0x844A,\n\t13554: 0x844B,\n\t13555: 0x844C,\n\t13556: 0x844D,\n\t13557: 0x844E,\n\t13558: 0x844F,\n\t13559: 0x8450,\n\t13560: 0x8452,\n\t13561: 0x8453,\n\t13562: 0x8454,\n\t13563: 0x8455,\n\t13564: 0x8456,\n\t13565: 0x8458,\n\t13566: 0x845D,\n\t13567: 0x845E,\n\t13568: 0x845F,\n\t13569: 0x8460,\n\t13570: 0x8462,\n\t13571: 0x8464,\n\t13572: 0x8465,\n\t13573: 0x8466,\n\t13574: 0x8467,\n\t13575: 0x8468,\n\t13576: 0x846A,\n\t13577: 0x846E,\n\t13578: 0x846F,\n\t13579: 0x8470,\n\t13580: 0x8472,\n\t13581: 0x8474,\n\t13582: 0x8477,\n\t13583: 0x8479,\n\t13584: 0x847B,\n\t13585: 0x847C,\n\t13586: 0x53D6,\n\t13587: 0x5A36,\n\t13588: 0x9F8B,\n\t13589: 0x8DA3,\n\t13590: 0x53BB,\n\t13591: 0x5708,\n\t13592: 0x98A7,\n\t13593: 0x6743,\n\t13594: 0x919B,\n\t13595: 0x6CC9,\n\t13596: 0x5168,\n\t13597: 0x75CA,\n\t13598: 0x62F3,\n\t13599: 0x72AC,\n\t13600: 0x5238,\n\t13601: 0x529D,\n\t13602: 0x7F3A,\n\t13603: 0x7094,\n\t13604: 0x7638,\n\t13605: 0x5374,\n\t13606: 0x9E4A,\n\t13607: 0x69B7,\n\t13608: 0x786E,\n\t13609: 0x96C0,\n\t13610: 0x88D9,\n\t13611: 0x7FA4,\n\t13612: 0x7136,\n\t13613: 0x71C3,\n\t13614: 0x5189,\n\t13615: 0x67D3,\n\t13616: 0x74E4,\n\t13617: 0x58E4,\n\t13618: 0x6518,\n\t13619: 0x56B7,\n\t13620: 0x8BA9,\n\t13621: 0x9976,\n\t13622: 0x6270,\n\t13623: 0x7ED5,\n\t13624: 0x60F9,\n\t13625: 0x70ED,\n\t13626: 0x58EC,\n\t13627: 0x4EC1,\n\t13628: 0x4EBA,\n\t13629: 0x5FCD,\n\t13630: 0x97E7,\n\t13631: 0x4EFB,\n\t13632: 0x8BA4,\n\t13633: 0x5203,\n\t13634: 0x598A,\n\t13635: 0x7EAB,\n\t13636: 0x6254,\n\t13637: 0x4ECD,\n\t13638: 0x65E5,\n\t13639: 0x620E,\n\t13640: 0x8338,\n\t13641: 0x84C9,\n\t13642: 0x8363,\n\t13643: 0x878D,\n\t13644: 0x7194,\n\t13645: 0x6EB6,\n\t13646: 0x5BB9,\n\t13647: 0x7ED2,\n\t13648: 0x5197,\n\t13649: 0x63C9,\n\t13650: 0x67D4,\n\t13651: 0x8089,\n\t13652: 0x8339,\n\t13653: 0x8815,\n\t13654: 0x5112,\n\t13655: 0x5B7A,\n\t13656: 0x5982,\n\t13657: 0x8FB1,\n\t13658: 0x4E73,\n\t13659: 0x6C5D,\n\t13660: 0x5165,\n\t13661: 0x8925,\n\t13662: 0x8F6F,\n\t13663: 0x962E,\n\t13664: 0x854A,\n\t13665: 0x745E,\n\t13666: 0x9510,\n\t13667: 0x95F0,\n\t13668: 0x6DA6,\n\t13669: 0x82E5,\n\t13670: 0x5F31,\n\t13671: 0x6492,\n\t13672: 0x6D12,\n\t13673: 0x8428,\n\t13674: 0x816E,\n\t13675: 0x9CC3,\n\t13676: 0x585E,\n\t13677: 0x8D5B,\n\t13678: 0x4E09,\n\t13679: 0x53C1,\n\t13680: 0x847D,\n\t13681: 0x847E,\n\t13682: 0x847F,\n\t13683: 0x8480,\n\t13684: 0x8481,\n\t13685: 0x8483,\n\t13686: 0x8484,\n\t13687: 0x8485,\n\t13688: 0x8486,\n\t13689: 0x848A,\n\t13690: 0x848D,\n\t13691: 0x848F,\n\t13692: 0x8490,\n\t13693: 0x8491,\n\t13694: 0x8492,\n\t13695: 0x8493,\n\t13696: 0x8494,\n\t13697: 0x8495,\n\t13698: 0x8496,\n\t13699: 0x8498,\n\t13700: 0x849A,\n\t13701: 0x849B,\n\t13702: 0x849D,\n\t13703: 0x849E,\n\t13704: 0x849F,\n\t13705: 0x84A0,\n\t13706: 0x84A2,\n\t13707: 0x84A3,\n\t13708: 0x84A4,\n\t13709: 0x84A5,\n\t13710: 0x84A6,\n\t13711: 0x84A7,\n\t13712: 0x84A8,\n\t13713: 0x84A9,\n\t13714: 0x84AA,\n\t13715: 0x84AB,\n\t13716: 0x84AC,\n\t13717: 0x84AD,\n\t13718: 0x84AE,\n\t13719: 0x84B0,\n\t13720: 0x84B1,\n\t13721: 0x84B3,\n\t13722: 0x84B5,\n\t13723: 0x84B6,\n\t13724: 0x84B7,\n\t13725: 0x84BB,\n\t13726: 0x84BC,\n\t13727: 0x84BE,\n\t13728: 0x84C0,\n\t13729: 0x84C2,\n\t13730: 0x84C3,\n\t13731: 0x84C5,\n\t13732: 0x84C6,\n\t13733: 0x84C7,\n\t13734: 0x84C8,\n\t13735: 0x84CB,\n\t13736: 0x84CC,\n\t13737: 0x84CE,\n\t13738: 0x84CF,\n\t13739: 0x84D2,\n\t13740: 0x84D4,\n\t13741: 0x84D5,\n\t13742: 0x84D7,\n\t13743: 0x84D8,\n\t13744: 0x84D9,\n\t13745: 0x84DA,\n\t13746: 0x84DB,\n\t13747: 0x84DC,\n\t13748: 0x84DE,\n\t13749: 0x84E1,\n\t13750: 0x84E2,\n\t13751: 0x84E4,\n\t13752: 0x84E7,\n\t13753: 0x84E8,\n\t13754: 0x84E9,\n\t13755: 0x84EA,\n\t13756: 0x84EB,\n\t13757: 0x84ED,\n\t13758: 0x84EE,\n\t13759: 0x84EF,\n\t13760: 0x84F1,\n\t13761: 0x84F2,\n\t13762: 0x84F3,\n\t13763: 0x84F4,\n\t13764: 0x84F5,\n\t13765: 0x84F6,\n\t13766: 0x84F7,\n\t13767: 0x84F8,\n\t13768: 0x84F9,\n\t13769: 0x84FA,\n\t13770: 0x84FB,\n\t13771: 0x84FD,\n\t13772: 0x84FE,\n\t13773: 0x8500,\n\t13774: 0x8501,\n\t13775: 0x8502,\n\t13776: 0x4F1E,\n\t13777: 0x6563,\n\t13778: 0x6851,\n\t13779: 0x55D3,\n\t13780: 0x4E27,\n\t13781: 0x6414,\n\t13782: 0x9A9A,\n\t13783: 0x626B,\n\t13784: 0x5AC2,\n\t13785: 0x745F,\n\t13786: 0x8272,\n\t13787: 0x6DA9,\n\t13788: 0x68EE,\n\t13789: 0x50E7,\n\t13790: 0x838E,\n\t13791: 0x7802,\n\t13792: 0x6740,\n\t13793: 0x5239,\n\t13794: 0x6C99,\n\t13795: 0x7EB1,\n\t13796: 0x50BB,\n\t13797: 0x5565,\n\t13798: 0x715E,\n\t13799: 0x7B5B,\n\t13800: 0x6652,\n\t13801: 0x73CA,\n\t13802: 0x82EB,\n\t13803: 0x6749,\n\t13804: 0x5C71,\n\t13805: 0x5220,\n\t13806: 0x717D,\n\t13807: 0x886B,\n\t13808: 0x95EA,\n\t13809: 0x9655,\n\t13810: 0x64C5,\n\t13811: 0x8D61,\n\t13812: 0x81B3,\n\t13813: 0x5584,\n\t13814: 0x6C55,\n\t13815: 0x6247,\n\t13816: 0x7F2E,\n\t13817: 0x5892,\n\t13818: 0x4F24,\n\t13819: 0x5546,\n\t13820: 0x8D4F,\n\t13821: 0x664C,\n\t13822: 0x4E0A,\n\t13823: 0x5C1A,\n\t13824: 0x88F3,\n\t13825: 0x68A2,\n\t13826: 0x634E,\n\t13827: 0x7A0D,\n\t13828: 0x70E7,\n\t13829: 0x828D,\n\t13830: 0x52FA,\n\t13831: 0x97F6,\n\t13832: 0x5C11,\n\t13833: 0x54E8,\n\t13834: 0x90B5,\n\t13835: 0x7ECD,\n\t13836: 0x5962,\n\t13837: 0x8D4A,\n\t13838: 0x86C7,\n\t13839: 0x820C,\n\t13840: 0x820D,\n\t13841: 0x8D66,\n\t13842: 0x6444,\n\t13843: 0x5C04,\n\t13844: 0x6151,\n\t13845: 0x6D89,\n\t13846: 0x793E,\n\t13847: 0x8BBE,\n\t13848: 0x7837,\n\t13849: 0x7533,\n\t13850: 0x547B,\n\t13851: 0x4F38,\n\t13852: 0x8EAB,\n\t13853: 0x6DF1,\n\t13854: 0x5A20,\n\t13855: 0x7EC5,\n\t13856: 0x795E,\n\t13857: 0x6C88,\n\t13858: 0x5BA1,\n\t13859: 0x5A76,\n\t13860: 0x751A,\n\t13861: 0x80BE,\n\t13862: 0x614E,\n\t13863: 0x6E17,\n\t13864: 0x58F0,\n\t13865: 0x751F,\n\t13866: 0x7525,\n\t13867: 0x7272,\n\t13868: 0x5347,\n\t13869: 0x7EF3,\n\t13870: 0x8503,\n\t13871: 0x8504,\n\t13872: 0x8505,\n\t13873: 0x8506,\n\t13874: 0x8507,\n\t13875: 0x8508,\n\t13876: 0x8509,\n\t13877: 0x850A,\n\t13878: 0x850B,\n\t13879: 0x850D,\n\t13880: 0x850E,\n\t13881: 0x850F,\n\t13882: 0x8510,\n\t13883: 0x8512,\n\t13884: 0x8514,\n\t13885: 0x8515,\n\t13886: 0x8516,\n\t13887: 0x8518,\n\t13888: 0x8519,\n\t13889: 0x851B,\n\t13890: 0x851C,\n\t13891: 0x851D,\n\t13892: 0x851E,\n\t13893: 0x8520,\n\t13894: 0x8522,\n\t13895: 0x8523,\n\t13896: 0x8524,\n\t13897: 0x8525,\n\t13898: 0x8526,\n\t13899: 0x8527,\n\t13900: 0x8528,\n\t13901: 0x8529,\n\t13902: 0x852A,\n\t13903: 0x852D,\n\t13904: 0x852E,\n\t13905: 0x852F,\n\t13906: 0x8530,\n\t13907: 0x8531,\n\t13908: 0x8532,\n\t13909: 0x8533,\n\t13910: 0x8534,\n\t13911: 0x8535,\n\t13912: 0x8536,\n\t13913: 0x853E,\n\t13914: 0x853F,\n\t13915: 0x8540,\n\t13916: 0x8541,\n\t13917: 0x8542,\n\t13918: 0x8544,\n\t13919: 0x8545,\n\t13920: 0x8546,\n\t13921: 0x8547,\n\t13922: 0x854B,\n\t13923: 0x854C,\n\t13924: 0x854D,\n\t13925: 0x854E,\n\t13926: 0x854F,\n\t13927: 0x8550,\n\t13928: 0x8551,\n\t13929: 0x8552,\n\t13930: 0x8553,\n\t13931: 0x8554,\n\t13932: 0x8555,\n\t13933: 0x8557,\n\t13934: 0x8558,\n\t13935: 0x855A,\n\t13936: 0x855B,\n\t13937: 0x855C,\n\t13938: 0x855D,\n\t13939: 0x855F,\n\t13940: 0x8560,\n\t13941: 0x8561,\n\t13942: 0x8562,\n\t13943: 0x8563,\n\t13944: 0x8565,\n\t13945: 0x8566,\n\t13946: 0x8567,\n\t13947: 0x8569,\n\t13948: 0x856A,\n\t13949: 0x856B,\n\t13950: 0x856C,\n\t13951: 0x856D,\n\t13952: 0x856E,\n\t13953: 0x856F,\n\t13954: 0x8570,\n\t13955: 0x8571,\n\t13956: 0x8573,\n\t13957: 0x8575,\n\t13958: 0x8576,\n\t13959: 0x8577,\n\t13960: 0x8578,\n\t13961: 0x857C,\n\t13962: 0x857D,\n\t13963: 0x857F,\n\t13964: 0x8580,\n\t13965: 0x8581,\n\t13966: 0x7701,\n\t13967: 0x76DB,\n\t13968: 0x5269,\n\t13969: 0x80DC,\n\t13970: 0x5723,\n\t13971: 0x5E08,\n\t13972: 0x5931,\n\t13973: 0x72EE,\n\t13974: 0x65BD,\n\t13975: 0x6E7F,\n\t13976: 0x8BD7,\n\t13977: 0x5C38,\n\t13978: 0x8671,\n\t13979: 0x5341,\n\t13980: 0x77F3,\n\t13981: 0x62FE,\n\t13982: 0x65F6,\n\t13983: 0x4EC0,\n\t13984: 0x98DF,\n\t13985: 0x8680,\n\t13986: 0x5B9E,\n\t13987: 0x8BC6,\n\t13988: 0x53F2,\n\t13989: 0x77E2,\n\t13990: 0x4F7F,\n\t13991: 0x5C4E,\n\t13992: 0x9A76,\n\t13993: 0x59CB,\n\t13994: 0x5F0F,\n\t13995: 0x793A,\n\t13996: 0x58EB,\n\t13997: 0x4E16,\n\t13998: 0x67FF,\n\t13999: 0x4E8B,\n\t14000: 0x62ED,\n\t14001: 0x8A93,\n\t14002: 0x901D,\n\t14003: 0x52BF,\n\t14004: 0x662F,\n\t14005: 0x55DC,\n\t14006: 0x566C,\n\t14007: 0x9002,\n\t14008: 0x4ED5,\n\t14009: 0x4F8D,\n\t14010: 0x91CA,\n\t14011: 0x9970,\n\t14012: 0x6C0F,\n\t14013: 0x5E02,\n\t14014: 0x6043,\n\t14015: 0x5BA4,\n\t14016: 0x89C6,\n\t14017: 0x8BD5,\n\t14018: 0x6536,\n\t14019: 0x624B,\n\t14020: 0x9996,\n\t14021: 0x5B88,\n\t14022: 0x5BFF,\n\t14023: 0x6388,\n\t14024: 0x552E,\n\t14025: 0x53D7,\n\t14026: 0x7626,\n\t14027: 0x517D,\n\t14028: 0x852C,\n\t14029: 0x67A2,\n\t14030: 0x68B3,\n\t14031: 0x6B8A,\n\t14032: 0x6292,\n\t14033: 0x8F93,\n\t14034: 0x53D4,\n\t14035: 0x8212,\n\t14036: 0x6DD1,\n\t14037: 0x758F,\n\t14038: 0x4E66,\n\t14039: 0x8D4E,\n\t14040: 0x5B70,\n\t14041: 0x719F,\n\t14042: 0x85AF,\n\t14043: 0x6691,\n\t14044: 0x66D9,\n\t14045: 0x7F72,\n\t14046: 0x8700,\n\t14047: 0x9ECD,\n\t14048: 0x9F20,\n\t14049: 0x5C5E,\n\t14050: 0x672F,\n\t14051: 0x8FF0,\n\t14052: 0x6811,\n\t14053: 0x675F,\n\t14054: 0x620D,\n\t14055: 0x7AD6,\n\t14056: 0x5885,\n\t14057: 0x5EB6,\n\t14058: 0x6570,\n\t14059: 0x6F31,\n\t14060: 0x8582,\n\t14061: 0x8583,\n\t14062: 0x8586,\n\t14063: 0x8588,\n\t14064: 0x8589,\n\t14065: 0x858A,\n\t14066: 0x858B,\n\t14067: 0x858C,\n\t14068: 0x858D,\n\t14069: 0x858E,\n\t14070: 0x8590,\n\t14071: 0x8591,\n\t14072: 0x8592,\n\t14073: 0x8593,\n\t14074: 0x8594,\n\t14075: 0x8595,\n\t14076: 0x8596,\n\t14077: 0x8597,\n\t14078: 0x8598,\n\t14079: 0x8599,\n\t14080: 0x859A,\n\t14081: 0x859D,\n\t14082: 0x859E,\n\t14083: 0x859F,\n\t14084: 0x85A0,\n\t14085: 0x85A1,\n\t14086: 0x85A2,\n\t14087: 0x85A3,\n\t14088: 0x85A5,\n\t14089: 0x85A6,\n\t14090: 0x85A7,\n\t14091: 0x85A9,\n\t14092: 0x85AB,\n\t14093: 0x85AC,\n\t14094: 0x85AD,\n\t14095: 0x85B1,\n\t14096: 0x85B2,\n\t14097: 0x85B3,\n\t14098: 0x85B4,\n\t14099: 0x85B5,\n\t14100: 0x85B6,\n\t14101: 0x85B8,\n\t14102: 0x85BA,\n\t14103: 0x85BB,\n\t14104: 0x85BC,\n\t14105: 0x85BD,\n\t14106: 0x85BE,\n\t14107: 0x85BF,\n\t14108: 0x85C0,\n\t14109: 0x85C2,\n\t14110: 0x85C3,\n\t14111: 0x85C4,\n\t14112: 0x85C5,\n\t14113: 0x85C6,\n\t14114: 0x85C7,\n\t14115: 0x85C8,\n\t14116: 0x85CA,\n\t14117: 0x85CB,\n\t14118: 0x85CC,\n\t14119: 0x85CD,\n\t14120: 0x85CE,\n\t14121: 0x85D1,\n\t14122: 0x85D2,\n\t14123: 0x85D4,\n\t14124: 0x85D6,\n\t14125: 0x85D7,\n\t14126: 0x85D8,\n\t14127: 0x85D9,\n\t14128: 0x85DA,\n\t14129: 0x85DB,\n\t14130: 0x85DD,\n\t14131: 0x85DE,\n\t14132: 0x85DF,\n\t14133: 0x85E0,\n\t14134: 0x85E1,\n\t14135: 0x85E2,\n\t14136: 0x85E3,\n\t14137: 0x85E5,\n\t14138: 0x85E6,\n\t14139: 0x85E7,\n\t14140: 0x85E8,\n\t14141: 0x85EA,\n\t14142: 0x85EB,\n\t14143: 0x85EC,\n\t14144: 0x85ED,\n\t14145: 0x85EE,\n\t14146: 0x85EF,\n\t14147: 0x85F0,\n\t14148: 0x85F1,\n\t14149: 0x85F2,\n\t14150: 0x85F3,\n\t14151: 0x85F4,\n\t14152: 0x85F5,\n\t14153: 0x85F6,\n\t14154: 0x85F7,\n\t14155: 0x85F8,\n\t14156: 0x6055,\n\t14157: 0x5237,\n\t14158: 0x800D,\n\t14159: 0x6454,\n\t14160: 0x8870,\n\t14161: 0x7529,\n\t14162: 0x5E05,\n\t14163: 0x6813,\n\t14164: 0x62F4,\n\t14165: 0x971C,\n\t14166: 0x53CC,\n\t14167: 0x723D,\n\t14168: 0x8C01,\n\t14169: 0x6C34,\n\t14170: 0x7761,\n\t14171: 0x7A0E,\n\t14172: 0x542E,\n\t14173: 0x77AC,\n\t14174: 0x987A,\n\t14175: 0x821C,\n\t14176: 0x8BF4,\n\t14177: 0x7855,\n\t14178: 0x6714,\n\t14179: 0x70C1,\n\t14180: 0x65AF,\n\t14181: 0x6495,\n\t14182: 0x5636,\n\t14183: 0x601D,\n\t14184: 0x79C1,\n\t14185: 0x53F8,\n\t14186: 0x4E1D,\n\t14187: 0x6B7B,\n\t14188: 0x8086,\n\t14189: 0x5BFA,\n\t14190: 0x55E3,\n\t14191: 0x56DB,\n\t14192: 0x4F3A,\n\t14193: 0x4F3C,\n\t14194: 0x9972,\n\t14195: 0x5DF3,\n\t14196: 0x677E,\n\t14197: 0x8038,\n\t14198: 0x6002,\n\t14199: 0x9882,\n\t14200: 0x9001,\n\t14201: 0x5B8B,\n\t14202: 0x8BBC,\n\t14203: 0x8BF5,\n\t14204: 0x641C,\n\t14205: 0x8258,\n\t14206: 0x64DE,\n\t14207: 0x55FD,\n\t14208: 0x82CF,\n\t14209: 0x9165,\n\t14210: 0x4FD7,\n\t14211: 0x7D20,\n\t14212: 0x901F,\n\t14213: 0x7C9F,\n\t14214: 0x50F3,\n\t14215: 0x5851,\n\t14216: 0x6EAF,\n\t14217: 0x5BBF,\n\t14218: 0x8BC9,\n\t14219: 0x8083,\n\t14220: 0x9178,\n\t14221: 0x849C,\n\t14222: 0x7B97,\n\t14223: 0x867D,\n\t14224: 0x968B,\n\t14225: 0x968F,\n\t14226: 0x7EE5,\n\t14227: 0x9AD3,\n\t14228: 0x788E,\n\t14229: 0x5C81,\n\t14230: 0x7A57,\n\t14231: 0x9042,\n\t14232: 0x96A7,\n\t14233: 0x795F,\n\t14234: 0x5B59,\n\t14235: 0x635F,\n\t14236: 0x7B0B,\n\t14237: 0x84D1,\n\t14238: 0x68AD,\n\t14239: 0x5506,\n\t14240: 0x7F29,\n\t14241: 0x7410,\n\t14242: 0x7D22,\n\t14243: 0x9501,\n\t14244: 0x6240,\n\t14245: 0x584C,\n\t14246: 0x4ED6,\n\t14247: 0x5B83,\n\t14248: 0x5979,\n\t14249: 0x5854,\n\t14250: 0x85F9,\n\t14251: 0x85FA,\n\t14252: 0x85FC,\n\t14253: 0x85FD,\n\t14254: 0x85FE,\n\t14255: 0x8600,\n\t14256: 0x8601,\n\t14257: 0x8602,\n\t14258: 0x8603,\n\t14259: 0x8604,\n\t14260: 0x8606,\n\t14261: 0x8607,\n\t14262: 0x8608,\n\t14263: 0x8609,\n\t14264: 0x860A,\n\t14265: 0x860B,\n\t14266: 0x860C,\n\t14267: 0x860D,\n\t14268: 0x860E,\n\t14269: 0x860F,\n\t14270: 0x8610,\n\t14271: 0x8612,\n\t14272: 0x8613,\n\t14273: 0x8614,\n\t14274: 0x8615,\n\t14275: 0x8617,\n\t14276: 0x8618,\n\t14277: 0x8619,\n\t14278: 0x861A,\n\t14279: 0x861B,\n\t14280: 0x861C,\n\t14281: 0x861D,\n\t14282: 0x861E,\n\t14283: 0x861F,\n\t14284: 0x8620,\n\t14285: 0x8621,\n\t14286: 0x8622,\n\t14287: 0x8623,\n\t14288: 0x8624,\n\t14289: 0x8625,\n\t14290: 0x8626,\n\t14291: 0x8628,\n\t14292: 0x862A,\n\t14293: 0x862B,\n\t14294: 0x862C,\n\t14295: 0x862D,\n\t14296: 0x862E,\n\t14297: 0x862F,\n\t14298: 0x8630,\n\t14299: 0x8631,\n\t14300: 0x8632,\n\t14301: 0x8633,\n\t14302: 0x8634,\n\t14303: 0x8635,\n\t14304: 0x8636,\n\t14305: 0x8637,\n\t14306: 0x8639,\n\t14307: 0x863A,\n\t14308: 0x863B,\n\t14309: 0x863D,\n\t14310: 0x863E,\n\t14311: 0x863F,\n\t14312: 0x8640,\n\t14313: 0x8641,\n\t14314: 0x8642,\n\t14315: 0x8643,\n\t14316: 0x8644,\n\t14317: 0x8645,\n\t14318: 0x8646,\n\t14319: 0x8647,\n\t14320: 0x8648,\n\t14321: 0x8649,\n\t14322: 0x864A,\n\t14323: 0x864B,\n\t14324: 0x864C,\n\t14325: 0x8652,\n\t14326: 0x8653,\n\t14327: 0x8655,\n\t14328: 0x8656,\n\t14329: 0x8657,\n\t14330: 0x8658,\n\t14331: 0x8659,\n\t14332: 0x865B,\n\t14333: 0x865C,\n\t14334: 0x865D,\n\t14335: 0x865F,\n\t14336: 0x8660,\n\t14337: 0x8661,\n\t14338: 0x8663,\n\t14339: 0x8664,\n\t14340: 0x8665,\n\t14341: 0x8666,\n\t14342: 0x8667,\n\t14343: 0x8668,\n\t14344: 0x8669,\n\t14345: 0x866A,\n\t14346: 0x736D,\n\t14347: 0x631E,\n\t14348: 0x8E4B,\n\t14349: 0x8E0F,\n\t14350: 0x80CE,\n\t14351: 0x82D4,\n\t14352: 0x62AC,\n\t14353: 0x53F0,\n\t14354: 0x6CF0,\n\t14355: 0x915E,\n\t14356: 0x592A,\n\t14357: 0x6001,\n\t14358: 0x6C70,\n\t14359: 0x574D,\n\t14360: 0x644A,\n\t14361: 0x8D2A,\n\t14362: 0x762B,\n\t14363: 0x6EE9,\n\t14364: 0x575B,\n\t14365: 0x6A80,\n\t14366: 0x75F0,\n\t14367: 0x6F6D,\n\t14368: 0x8C2D,\n\t14369: 0x8C08,\n\t14370: 0x5766,\n\t14371: 0x6BEF,\n\t14372: 0x8892,\n\t14373: 0x78B3,\n\t14374: 0x63A2,\n\t14375: 0x53F9,\n\t14376: 0x70AD,\n\t14377: 0x6C64,\n\t14378: 0x5858,\n\t14379: 0x642A,\n\t14380: 0x5802,\n\t14381: 0x68E0,\n\t14382: 0x819B,\n\t14383: 0x5510,\n\t14384: 0x7CD6,\n\t14385: 0x5018,\n\t14386: 0x8EBA,\n\t14387: 0x6DCC,\n\t14388: 0x8D9F,\n\t14389: 0x70EB,\n\t14390: 0x638F,\n\t14391: 0x6D9B,\n\t14392: 0x6ED4,\n\t14393: 0x7EE6,\n\t14394: 0x8404,\n\t14395: 0x6843,\n\t14396: 0x9003,\n\t14397: 0x6DD8,\n\t14398: 0x9676,\n\t14399: 0x8BA8,\n\t14400: 0x5957,\n\t14401: 0x7279,\n\t14402: 0x85E4,\n\t14403: 0x817E,\n\t14404: 0x75BC,\n\t14405: 0x8A8A,\n\t14406: 0x68AF,\n\t14407: 0x5254,\n\t14408: 0x8E22,\n\t14409: 0x9511,\n\t14410: 0x63D0,\n\t14411: 0x9898,\n\t14412: 0x8E44,\n\t14413: 0x557C,\n\t14414: 0x4F53,\n\t14415: 0x66FF,\n\t14416: 0x568F,\n\t14417: 0x60D5,\n\t14418: 0x6D95,\n\t14419: 0x5243,\n\t14420: 0x5C49,\n\t14421: 0x5929,\n\t14422: 0x6DFB,\n\t14423: 0x586B,\n\t14424: 0x7530,\n\t14425: 0x751C,\n\t14426: 0x606C,\n\t14427: 0x8214,\n\t14428: 0x8146,\n\t14429: 0x6311,\n\t14430: 0x6761,\n\t14431: 0x8FE2,\n\t14432: 0x773A,\n\t14433: 0x8DF3,\n\t14434: 0x8D34,\n\t14435: 0x94C1,\n\t14436: 0x5E16,\n\t14437: 0x5385,\n\t14438: 0x542C,\n\t14439: 0x70C3,\n\t14440: 0x866D,\n\t14441: 0x866F,\n\t14442: 0x8670,\n\t14443: 0x8672,\n\t14444: 0x8673,\n\t14445: 0x8674,\n\t14446: 0x8675,\n\t14447: 0x8676,\n\t14448: 0x8677,\n\t14449: 0x8678,\n\t14450: 0x8683,\n\t14451: 0x8684,\n\t14452: 0x8685,\n\t14453: 0x8686,\n\t14454: 0x8687,\n\t14455: 0x8688,\n\t14456: 0x8689,\n\t14457: 0x868E,\n\t14458: 0x868F,\n\t14459: 0x8690,\n\t14460: 0x8691,\n\t14461: 0x8692,\n\t14462: 0x8694,\n\t14463: 0x8696,\n\t14464: 0x8697,\n\t14465: 0x8698,\n\t14466: 0x8699,\n\t14467: 0x869A,\n\t14468: 0x869B,\n\t14469: 0x869E,\n\t14470: 0x869F,\n\t14471: 0x86A0,\n\t14472: 0x86A1,\n\t14473: 0x86A2,\n\t14474: 0x86A5,\n\t14475: 0x86A6,\n\t14476: 0x86AB,\n\t14477: 0x86AD,\n\t14478: 0x86AE,\n\t14479: 0x86B2,\n\t14480: 0x86B3,\n\t14481: 0x86B7,\n\t14482: 0x86B8,\n\t14483: 0x86B9,\n\t14484: 0x86BB,\n\t14485: 0x86BC,\n\t14486: 0x86BD,\n\t14487: 0x86BE,\n\t14488: 0x86BF,\n\t14489: 0x86C1,\n\t14490: 0x86C2,\n\t14491: 0x86C3,\n\t14492: 0x86C5,\n\t14493: 0x86C8,\n\t14494: 0x86CC,\n\t14495: 0x86CD,\n\t14496: 0x86D2,\n\t14497: 0x86D3,\n\t14498: 0x86D5,\n\t14499: 0x86D6,\n\t14500: 0x86D7,\n\t14501: 0x86DA,\n\t14502: 0x86DC,\n\t14503: 0x86DD,\n\t14504: 0x86E0,\n\t14505: 0x86E1,\n\t14506: 0x86E2,\n\t14507: 0x86E3,\n\t14508: 0x86E5,\n\t14509: 0x86E6,\n\t14510: 0x86E7,\n\t14511: 0x86E8,\n\t14512: 0x86EA,\n\t14513: 0x86EB,\n\t14514: 0x86EC,\n\t14515: 0x86EF,\n\t14516: 0x86F5,\n\t14517: 0x86F6,\n\t14518: 0x86F7,\n\t14519: 0x86FA,\n\t14520: 0x86FB,\n\t14521: 0x86FC,\n\t14522: 0x86FD,\n\t14523: 0x86FF,\n\t14524: 0x8701,\n\t14525: 0x8704,\n\t14526: 0x8705,\n\t14527: 0x8706,\n\t14528: 0x870B,\n\t14529: 0x870C,\n\t14530: 0x870E,\n\t14531: 0x870F,\n\t14532: 0x8710,\n\t14533: 0x8711,\n\t14534: 0x8714,\n\t14535: 0x8716,\n\t14536: 0x6C40,\n\t14537: 0x5EF7,\n\t14538: 0x505C,\n\t14539: 0x4EAD,\n\t14540: 0x5EAD,\n\t14541: 0x633A,\n\t14542: 0x8247,\n\t14543: 0x901A,\n\t14544: 0x6850,\n\t14545: 0x916E,\n\t14546: 0x77B3,\n\t14547: 0x540C,\n\t14548: 0x94DC,\n\t14549: 0x5F64,\n\t14550: 0x7AE5,\n\t14551: 0x6876,\n\t14552: 0x6345,\n\t14553: 0x7B52,\n\t14554: 0x7EDF,\n\t14555: 0x75DB,\n\t14556: 0x5077,\n\t14557: 0x6295,\n\t14558: 0x5934,\n\t14559: 0x900F,\n\t14560: 0x51F8,\n\t14561: 0x79C3,\n\t14562: 0x7A81,\n\t14563: 0x56FE,\n\t14564: 0x5F92,\n\t14565: 0x9014,\n\t14566: 0x6D82,\n\t14567: 0x5C60,\n\t14568: 0x571F,\n\t14569: 0x5410,\n\t14570: 0x5154,\n\t14571: 0x6E4D,\n\t14572: 0x56E2,\n\t14573: 0x63A8,\n\t14574: 0x9893,\n\t14575: 0x817F,\n\t14576: 0x8715,\n\t14577: 0x892A,\n\t14578: 0x9000,\n\t14579: 0x541E,\n\t14580: 0x5C6F,\n\t14581: 0x81C0,\n\t14582: 0x62D6,\n\t14583: 0x6258,\n\t14584: 0x8131,\n\t14585: 0x9E35,\n\t14586: 0x9640,\n\t14587: 0x9A6E,\n\t14588: 0x9A7C,\n\t14589: 0x692D,\n\t14590: 0x59A5,\n\t14591: 0x62D3,\n\t14592: 0x553E,\n\t14593: 0x6316,\n\t14594: 0x54C7,\n\t14595: 0x86D9,\n\t14596: 0x6D3C,\n\t14597: 0x5A03,\n\t14598: 0x74E6,\n\t14599: 0x889C,\n\t14600: 0x6B6A,\n\t14601: 0x5916,\n\t14602: 0x8C4C,\n\t14603: 0x5F2F,\n\t14604: 0x6E7E,\n\t14605: 0x73A9,\n\t14606: 0x987D,\n\t14607: 0x4E38,\n\t14608: 0x70F7,\n\t14609: 0x5B8C,\n\t14610: 0x7897,\n\t14611: 0x633D,\n\t14612: 0x665A,\n\t14613: 0x7696,\n\t14614: 0x60CB,\n\t14615: 0x5B9B,\n\t14616: 0x5A49,\n\t14617: 0x4E07,\n\t14618: 0x8155,\n\t14619: 0x6C6A,\n\t14620: 0x738B,\n\t14621: 0x4EA1,\n\t14622: 0x6789,\n\t14623: 0x7F51,\n\t14624: 0x5F80,\n\t14625: 0x65FA,\n\t14626: 0x671B,\n\t14627: 0x5FD8,\n\t14628: 0x5984,\n\t14629: 0x5A01,\n\t14630: 0x8719,\n\t14631: 0x871B,\n\t14632: 0x871D,\n\t14633: 0x871F,\n\t14634: 0x8720,\n\t14635: 0x8724,\n\t14636: 0x8726,\n\t14637: 0x8727,\n\t14638: 0x8728,\n\t14639: 0x872A,\n\t14640: 0x872B,\n\t14641: 0x872C,\n\t14642: 0x872D,\n\t14643: 0x872F,\n\t14644: 0x8730,\n\t14645: 0x8732,\n\t14646: 0x8733,\n\t14647: 0x8735,\n\t14648: 0x8736,\n\t14649: 0x8738,\n\t14650: 0x8739,\n\t14651: 0x873A,\n\t14652: 0x873C,\n\t14653: 0x873D,\n\t14654: 0x8740,\n\t14655: 0x8741,\n\t14656: 0x8742,\n\t14657: 0x8743,\n\t14658: 0x8744,\n\t14659: 0x8745,\n\t14660: 0x8746,\n\t14661: 0x874A,\n\t14662: 0x874B,\n\t14663: 0x874D,\n\t14664: 0x874F,\n\t14665: 0x8750,\n\t14666: 0x8751,\n\t14667: 0x8752,\n\t14668: 0x8754,\n\t14669: 0x8755,\n\t14670: 0x8756,\n\t14671: 0x8758,\n\t14672: 0x875A,\n\t14673: 0x875B,\n\t14674: 0x875C,\n\t14675: 0x875D,\n\t14676: 0x875E,\n\t14677: 0x875F,\n\t14678: 0x8761,\n\t14679: 0x8762,\n\t14680: 0x8766,\n\t14681: 0x8767,\n\t14682: 0x8768,\n\t14683: 0x8769,\n\t14684: 0x876A,\n\t14685: 0x876B,\n\t14686: 0x876C,\n\t14687: 0x876D,\n\t14688: 0x876F,\n\t14689: 0x8771,\n\t14690: 0x8772,\n\t14691: 0x8773,\n\t14692: 0x8775,\n\t14693: 0x8777,\n\t14694: 0x8778,\n\t14695: 0x8779,\n\t14696: 0x877A,\n\t14697: 0x877F,\n\t14698: 0x8780,\n\t14699: 0x8781,\n\t14700: 0x8784,\n\t14701: 0x8786,\n\t14702: 0x8787,\n\t14703: 0x8789,\n\t14704: 0x878A,\n\t14705: 0x878C,\n\t14706: 0x878E,\n\t14707: 0x878F,\n\t14708: 0x8790,\n\t14709: 0x8791,\n\t14710: 0x8792,\n\t14711: 0x8794,\n\t14712: 0x8795,\n\t14713: 0x8796,\n\t14714: 0x8798,\n\t14715: 0x8799,\n\t14716: 0x879A,\n\t14717: 0x879B,\n\t14718: 0x879C,\n\t14719: 0x879D,\n\t14720: 0x879E,\n\t14721: 0x87A0,\n\t14722: 0x87A1,\n\t14723: 0x87A2,\n\t14724: 0x87A3,\n\t14725: 0x87A4,\n\t14726: 0x5DCD,\n\t14727: 0x5FAE,\n\t14728: 0x5371,\n\t14729: 0x97E6,\n\t14730: 0x8FDD,\n\t14731: 0x6845,\n\t14732: 0x56F4,\n\t14733: 0x552F,\n\t14734: 0x60DF,\n\t14735: 0x4E3A,\n\t14736: 0x6F4D,\n\t14737: 0x7EF4,\n\t14738: 0x82C7,\n\t14739: 0x840E,\n\t14740: 0x59D4,\n\t14741: 0x4F1F,\n\t14742: 0x4F2A,\n\t14743: 0x5C3E,\n\t14744: 0x7EAC,\n\t14745: 0x672A,\n\t14746: 0x851A,\n\t14747: 0x5473,\n\t14748: 0x754F,\n\t14749: 0x80C3,\n\t14750: 0x5582,\n\t14751: 0x9B4F,\n\t14752: 0x4F4D,\n\t14753: 0x6E2D,\n\t14754: 0x8C13,\n\t14755: 0x5C09,\n\t14756: 0x6170,\n\t14757: 0x536B,\n\t14758: 0x761F,\n\t14759: 0x6E29,\n\t14760: 0x868A,\n\t14761: 0x6587,\n\t14762: 0x95FB,\n\t14763: 0x7EB9,\n\t14764: 0x543B,\n\t14765: 0x7A33,\n\t14766: 0x7D0A,\n\t14767: 0x95EE,\n\t14768: 0x55E1,\n\t14769: 0x7FC1,\n\t14770: 0x74EE,\n\t14771: 0x631D,\n\t14772: 0x8717,\n\t14773: 0x6DA1,\n\t14774: 0x7A9D,\n\t14775: 0x6211,\n\t14776: 0x65A1,\n\t14777: 0x5367,\n\t14778: 0x63E1,\n\t14779: 0x6C83,\n\t14780: 0x5DEB,\n\t14781: 0x545C,\n\t14782: 0x94A8,\n\t14783: 0x4E4C,\n\t14784: 0x6C61,\n\t14785: 0x8BEC,\n\t14786: 0x5C4B,\n\t14787: 0x65E0,\n\t14788: 0x829C,\n\t14789: 0x68A7,\n\t14790: 0x543E,\n\t14791: 0x5434,\n\t14792: 0x6BCB,\n\t14793: 0x6B66,\n\t14794: 0x4E94,\n\t14795: 0x6342,\n\t14796: 0x5348,\n\t14797: 0x821E,\n\t14798: 0x4F0D,\n\t14799: 0x4FAE,\n\t14800: 0x575E,\n\t14801: 0x620A,\n\t14802: 0x96FE,\n\t14803: 0x6664,\n\t14804: 0x7269,\n\t14805: 0x52FF,\n\t14806: 0x52A1,\n\t14807: 0x609F,\n\t14808: 0x8BEF,\n\t14809: 0x6614,\n\t14810: 0x7199,\n\t14811: 0x6790,\n\t14812: 0x897F,\n\t14813: 0x7852,\n\t14814: 0x77FD,\n\t14815: 0x6670,\n\t14816: 0x563B,\n\t14817: 0x5438,\n\t14818: 0x9521,\n\t14819: 0x727A,\n\t14820: 0x87A5,\n\t14821: 0x87A6,\n\t14822: 0x87A7,\n\t14823: 0x87A9,\n\t14824: 0x87AA,\n\t14825: 0x87AE,\n\t14826: 0x87B0,\n\t14827: 0x87B1,\n\t14828: 0x87B2,\n\t14829: 0x87B4,\n\t14830: 0x87B6,\n\t14831: 0x87B7,\n\t14832: 0x87B8,\n\t14833: 0x87B9,\n\t14834: 0x87BB,\n\t14835: 0x87BC,\n\t14836: 0x87BE,\n\t14837: 0x87BF,\n\t14838: 0x87C1,\n\t14839: 0x87C2,\n\t14840: 0x87C3,\n\t14841: 0x87C4,\n\t14842: 0x87C5,\n\t14843: 0x87C7,\n\t14844: 0x87C8,\n\t14845: 0x87C9,\n\t14846: 0x87CC,\n\t14847: 0x87CD,\n\t14848: 0x87CE,\n\t14849: 0x87CF,\n\t14850: 0x87D0,\n\t14851: 0x87D4,\n\t14852: 0x87D5,\n\t14853: 0x87D6,\n\t14854: 0x87D7,\n\t14855: 0x87D8,\n\t14856: 0x87D9,\n\t14857: 0x87DA,\n\t14858: 0x87DC,\n\t14859: 0x87DD,\n\t14860: 0x87DE,\n\t14861: 0x87DF,\n\t14862: 0x87E1,\n\t14863: 0x87E2,\n\t14864: 0x87E3,\n\t14865: 0x87E4,\n\t14866: 0x87E6,\n\t14867: 0x87E7,\n\t14868: 0x87E8,\n\t14869: 0x87E9,\n\t14870: 0x87EB,\n\t14871: 0x87EC,\n\t14872: 0x87ED,\n\t14873: 0x87EF,\n\t14874: 0x87F0,\n\t14875: 0x87F1,\n\t14876: 0x87F2,\n\t14877: 0x87F3,\n\t14878: 0x87F4,\n\t14879: 0x87F5,\n\t14880: 0x87F6,\n\t14881: 0x87F7,\n\t14882: 0x87F8,\n\t14883: 0x87FA,\n\t14884: 0x87FB,\n\t14885: 0x87FC,\n\t14886: 0x87FD,\n\t14887: 0x87FF,\n\t14888: 0x8800,\n\t14889: 0x8801,\n\t14890: 0x8802,\n\t14891: 0x8804,\n\t14892: 0x8805,\n\t14893: 0x8806,\n\t14894: 0x8807,\n\t14895: 0x8808,\n\t14896: 0x8809,\n\t14897: 0x880B,\n\t14898: 0x880C,\n\t14899: 0x880D,\n\t14900: 0x880E,\n\t14901: 0x880F,\n\t14902: 0x8810,\n\t14903: 0x8811,\n\t14904: 0x8812,\n\t14905: 0x8814,\n\t14906: 0x8817,\n\t14907: 0x8818,\n\t14908: 0x8819,\n\t14909: 0x881A,\n\t14910: 0x881C,\n\t14911: 0x881D,\n\t14912: 0x881E,\n\t14913: 0x881F,\n\t14914: 0x8820,\n\t14915: 0x8823,\n\t14916: 0x7A00,\n\t14917: 0x606F,\n\t14918: 0x5E0C,\n\t14919: 0x6089,\n\t14920: 0x819D,\n\t14921: 0x5915,\n\t14922: 0x60DC,\n\t14923: 0x7184,\n\t14924: 0x70EF,\n\t14925: 0x6EAA,\n\t14926: 0x6C50,\n\t14927: 0x7280,\n\t14928: 0x6A84,\n\t14929: 0x88AD,\n\t14930: 0x5E2D,\n\t14931: 0x4E60,\n\t14932: 0x5AB3,\n\t14933: 0x559C,\n\t14934: 0x94E3,\n\t14935: 0x6D17,\n\t14936: 0x7CFB,\n\t14937: 0x9699,\n\t14938: 0x620F,\n\t14939: 0x7EC6,\n\t14940: 0x778E,\n\t14941: 0x867E,\n\t14942: 0x5323,\n\t14943: 0x971E,\n\t14944: 0x8F96,\n\t14945: 0x6687,\n\t14946: 0x5CE1,\n\t14947: 0x4FA0,\n\t14948: 0x72ED,\n\t14949: 0x4E0B,\n\t14950: 0x53A6,\n\t14951: 0x590F,\n\t14952: 0x5413,\n\t14953: 0x6380,\n\t14954: 0x9528,\n\t14955: 0x5148,\n\t14956: 0x4ED9,\n\t14957: 0x9C9C,\n\t14958: 0x7EA4,\n\t14959: 0x54B8,\n\t14960: 0x8D24,\n\t14961: 0x8854,\n\t14962: 0x8237,\n\t14963: 0x95F2,\n\t14964: 0x6D8E,\n\t14965: 0x5F26,\n\t14966: 0x5ACC,\n\t14967: 0x663E,\n\t14968: 0x9669,\n\t14969: 0x73B0,\n\t14970: 0x732E,\n\t14971: 0x53BF,\n\t14972: 0x817A,\n\t14973: 0x9985,\n\t14974: 0x7FA1,\n\t14975: 0x5BAA,\n\t14976: 0x9677,\n\t14977: 0x9650,\n\t14978: 0x7EBF,\n\t14979: 0x76F8,\n\t14980: 0x53A2,\n\t14981: 0x9576,\n\t14982: 0x9999,\n\t14983: 0x7BB1,\n\t14984: 0x8944,\n\t14985: 0x6E58,\n\t14986: 0x4E61,\n\t14987: 0x7FD4,\n\t14988: 0x7965,\n\t14989: 0x8BE6,\n\t14990: 0x60F3,\n\t14991: 0x54CD,\n\t14992: 0x4EAB,\n\t14993: 0x9879,\n\t14994: 0x5DF7,\n\t14995: 0x6A61,\n\t14996: 0x50CF,\n\t14997: 0x5411,\n\t14998: 0x8C61,\n\t14999: 0x8427,\n\t15000: 0x785D,\n\t15001: 0x9704,\n\t15002: 0x524A,\n\t15003: 0x54EE,\n\t15004: 0x56A3,\n\t15005: 0x9500,\n\t15006: 0x6D88,\n\t15007: 0x5BB5,\n\t15008: 0x6DC6,\n\t15009: 0x6653,\n\t15010: 0x8824,\n\t15011: 0x8825,\n\t15012: 0x8826,\n\t15013: 0x8827,\n\t15014: 0x8828,\n\t15015: 0x8829,\n\t15016: 0x882A,\n\t15017: 0x882B,\n\t15018: 0x882C,\n\t15019: 0x882D,\n\t15020: 0x882E,\n\t15021: 0x882F,\n\t15022: 0x8830,\n\t15023: 0x8831,\n\t15024: 0x8833,\n\t15025: 0x8834,\n\t15026: 0x8835,\n\t15027: 0x8836,\n\t15028: 0x8837,\n\t15029: 0x8838,\n\t15030: 0x883A,\n\t15031: 0x883B,\n\t15032: 0x883D,\n\t15033: 0x883E,\n\t15034: 0x883F,\n\t15035: 0x8841,\n\t15036: 0x8842,\n\t15037: 0x8843,\n\t15038: 0x8846,\n\t15039: 0x8847,\n\t15040: 0x8848,\n\t15041: 0x8849,\n\t15042: 0x884A,\n\t15043: 0x884B,\n\t15044: 0x884E,\n\t15045: 0x884F,\n\t15046: 0x8850,\n\t15047: 0x8851,\n\t15048: 0x8852,\n\t15049: 0x8853,\n\t15050: 0x8855,\n\t15051: 0x8856,\n\t15052: 0x8858,\n\t15053: 0x885A,\n\t15054: 0x885B,\n\t15055: 0x885C,\n\t15056: 0x885D,\n\t15057: 0x885E,\n\t15058: 0x885F,\n\t15059: 0x8860,\n\t15060: 0x8866,\n\t15061: 0x8867,\n\t15062: 0x886A,\n\t15063: 0x886D,\n\t15064: 0x886F,\n\t15065: 0x8871,\n\t15066: 0x8873,\n\t15067: 0x8874,\n\t15068: 0x8875,\n\t15069: 0x8876,\n\t15070: 0x8878,\n\t15071: 0x8879,\n\t15072: 0x887A,\n\t15073: 0x887B,\n\t15074: 0x887C,\n\t15075: 0x8880,\n\t15076: 0x8883,\n\t15077: 0x8886,\n\t15078: 0x8887,\n\t15079: 0x8889,\n\t15080: 0x888A,\n\t15081: 0x888C,\n\t15082: 0x888E,\n\t15083: 0x888F,\n\t15084: 0x8890,\n\t15085: 0x8891,\n\t15086: 0x8893,\n\t15087: 0x8894,\n\t15088: 0x8895,\n\t15089: 0x8897,\n\t15090: 0x8898,\n\t15091: 0x8899,\n\t15092: 0x889A,\n\t15093: 0x889B,\n\t15094: 0x889D,\n\t15095: 0x889E,\n\t15096: 0x889F,\n\t15097: 0x88A0,\n\t15098: 0x88A1,\n\t15099: 0x88A3,\n\t15100: 0x88A5,\n\t15101: 0x88A6,\n\t15102: 0x88A7,\n\t15103: 0x88A8,\n\t15104: 0x88A9,\n\t15105: 0x88AA,\n\t15106: 0x5C0F,\n\t15107: 0x5B5D,\n\t15108: 0x6821,\n\t15109: 0x8096,\n\t15110: 0x5578,\n\t15111: 0x7B11,\n\t15112: 0x6548,\n\t15113: 0x6954,\n\t15114: 0x4E9B,\n\t15115: 0x6B47,\n\t15116: 0x874E,\n\t15117: 0x978B,\n\t15118: 0x534F,\n\t15119: 0x631F,\n\t15120: 0x643A,\n\t15121: 0x90AA,\n\t15122: 0x659C,\n\t15123: 0x80C1,\n\t15124: 0x8C10,\n\t15125: 0x5199,\n\t15126: 0x68B0,\n\t15127: 0x5378,\n\t15128: 0x87F9,\n\t15129: 0x61C8,\n\t15130: 0x6CC4,\n\t15131: 0x6CFB,\n\t15132: 0x8C22,\n\t15133: 0x5C51,\n\t15134: 0x85AA,\n\t15135: 0x82AF,\n\t15136: 0x950C,\n\t15137: 0x6B23,\n\t15138: 0x8F9B,\n\t15139: 0x65B0,\n\t15140: 0x5FFB,\n\t15141: 0x5FC3,\n\t15142: 0x4FE1,\n\t15143: 0x8845,\n\t15144: 0x661F,\n\t15145: 0x8165,\n\t15146: 0x7329,\n\t15147: 0x60FA,\n\t15148: 0x5174,\n\t15149: 0x5211,\n\t15150: 0x578B,\n\t15151: 0x5F62,\n\t15152: 0x90A2,\n\t15153: 0x884C,\n\t15154: 0x9192,\n\t15155: 0x5E78,\n\t15156: 0x674F,\n\t15157: 0x6027,\n\t15158: 0x59D3,\n\t15159: 0x5144,\n\t15160: 0x51F6,\n\t15161: 0x80F8,\n\t15162: 0x5308,\n\t15163: 0x6C79,\n\t15164: 0x96C4,\n\t15165: 0x718A,\n\t15166: 0x4F11,\n\t15167: 0x4FEE,\n\t15168: 0x7F9E,\n\t15169: 0x673D,\n\t15170: 0x55C5,\n\t15171: 0x9508,\n\t15172: 0x79C0,\n\t15173: 0x8896,\n\t15174: 0x7EE3,\n\t15175: 0x589F,\n\t15176: 0x620C,\n\t15177: 0x9700,\n\t15178: 0x865A,\n\t15179: 0x5618,\n\t15180: 0x987B,\n\t15181: 0x5F90,\n\t15182: 0x8BB8,\n\t15183: 0x84C4,\n\t15184: 0x9157,\n\t15185: 0x53D9,\n\t15186: 0x65ED,\n\t15187: 0x5E8F,\n\t15188: 0x755C,\n\t15189: 0x6064,\n\t15190: 0x7D6E,\n\t15191: 0x5A7F,\n\t15192: 0x7EEA,\n\t15193: 0x7EED,\n\t15194: 0x8F69,\n\t15195: 0x55A7,\n\t15196: 0x5BA3,\n\t15197: 0x60AC,\n\t15198: 0x65CB,\n\t15199: 0x7384,\n\t15200: 0x88AC,\n\t15201: 0x88AE,\n\t15202: 0x88AF,\n\t15203: 0x88B0,\n\t15204: 0x88B2,\n\t15205: 0x88B3,\n\t15206: 0x88B4,\n\t15207: 0x88B5,\n\t15208: 0x88B6,\n\t15209: 0x88B8,\n\t15210: 0x88B9,\n\t15211: 0x88BA,\n\t15212: 0x88BB,\n\t15213: 0x88BD,\n\t15214: 0x88BE,\n\t15215: 0x88BF,\n\t15216: 0x88C0,\n\t15217: 0x88C3,\n\t15218: 0x88C4,\n\t15219: 0x88C7,\n\t15220: 0x88C8,\n\t15221: 0x88CA,\n\t15222: 0x88CB,\n\t15223: 0x88CC,\n\t15224: 0x88CD,\n\t15225: 0x88CF,\n\t15226: 0x88D0,\n\t15227: 0x88D1,\n\t15228: 0x88D3,\n\t15229: 0x88D6,\n\t15230: 0x88D7,\n\t15231: 0x88DA,\n\t15232: 0x88DB,\n\t15233: 0x88DC,\n\t15234: 0x88DD,\n\t15235: 0x88DE,\n\t15236: 0x88E0,\n\t15237: 0x88E1,\n\t15238: 0x88E6,\n\t15239: 0x88E7,\n\t15240: 0x88E9,\n\t15241: 0x88EA,\n\t15242: 0x88EB,\n\t15243: 0x88EC,\n\t15244: 0x88ED,\n\t15245: 0x88EE,\n\t15246: 0x88EF,\n\t15247: 0x88F2,\n\t15248: 0x88F5,\n\t15249: 0x88F6,\n\t15250: 0x88F7,\n\t15251: 0x88FA,\n\t15252: 0x88FB,\n\t15253: 0x88FD,\n\t15254: 0x88FF,\n\t15255: 0x8900,\n\t15256: 0x8901,\n\t15257: 0x8903,\n\t15258: 0x8904,\n\t15259: 0x8905,\n\t15260: 0x8906,\n\t15261: 0x8907,\n\t15262: 0x8908,\n\t15263: 0x8909,\n\t15264: 0x890B,\n\t15265: 0x890C,\n\t15266: 0x890D,\n\t15267: 0x890E,\n\t15268: 0x890F,\n\t15269: 0x8911,\n\t15270: 0x8914,\n\t15271: 0x8915,\n\t15272: 0x8916,\n\t15273: 0x8917,\n\t15274: 0x8918,\n\t15275: 0x891C,\n\t15276: 0x891D,\n\t15277: 0x891E,\n\t15278: 0x891F,\n\t15279: 0x8920,\n\t15280: 0x8922,\n\t15281: 0x8923,\n\t15282: 0x8924,\n\t15283: 0x8926,\n\t15284: 0x8927,\n\t15285: 0x8928,\n\t15286: 0x8929,\n\t15287: 0x892C,\n\t15288: 0x892D,\n\t15289: 0x892E,\n\t15290: 0x892F,\n\t15291: 0x8931,\n\t15292: 0x8932,\n\t15293: 0x8933,\n\t15294: 0x8935,\n\t15295: 0x8937,\n\t15296: 0x9009,\n\t15297: 0x7663,\n\t15298: 0x7729,\n\t15299: 0x7EDA,\n\t15300: 0x9774,\n\t15301: 0x859B,\n\t15302: 0x5B66,\n\t15303: 0x7A74,\n\t15304: 0x96EA,\n\t15305: 0x8840,\n\t15306: 0x52CB,\n\t15307: 0x718F,\n\t15308: 0x5FAA,\n\t15309: 0x65EC,\n\t15310: 0x8BE2,\n\t15311: 0x5BFB,\n\t15312: 0x9A6F,\n\t15313: 0x5DE1,\n\t15314: 0x6B89,\n\t15315: 0x6C5B,\n\t15316: 0x8BAD,\n\t15317: 0x8BAF,\n\t15318: 0x900A,\n\t15319: 0x8FC5,\n\t15320: 0x538B,\n\t15321: 0x62BC,\n\t15322: 0x9E26,\n\t15323: 0x9E2D,\n\t15324: 0x5440,\n\t15325: 0x4E2B,\n\t15326: 0x82BD,\n\t15327: 0x7259,\n\t15328: 0x869C,\n\t15329: 0x5D16,\n\t15330: 0x8859,\n\t15331: 0x6DAF,\n\t15332: 0x96C5,\n\t15333: 0x54D1,\n\t15334: 0x4E9A,\n\t15335: 0x8BB6,\n\t15336: 0x7109,\n\t15337: 0x54BD,\n\t15338: 0x9609,\n\t15339: 0x70DF,\n\t15340: 0x6DF9,\n\t15341: 0x76D0,\n\t15342: 0x4E25,\n\t15343: 0x7814,\n\t15344: 0x8712,\n\t15345: 0x5CA9,\n\t15346: 0x5EF6,\n\t15347: 0x8A00,\n\t15348: 0x989C,\n\t15349: 0x960E,\n\t15350: 0x708E,\n\t15351: 0x6CBF,\n\t15352: 0x5944,\n\t15353: 0x63A9,\n\t15354: 0x773C,\n\t15355: 0x884D,\n\t15356: 0x6F14,\n\t15357: 0x8273,\n\t15358: 0x5830,\n\t15359: 0x71D5,\n\t15360: 0x538C,\n\t15361: 0x781A,\n\t15362: 0x96C1,\n\t15363: 0x5501,\n\t15364: 0x5F66,\n\t15365: 0x7130,\n\t15366: 0x5BB4,\n\t15367: 0x8C1A,\n\t15368: 0x9A8C,\n\t15369: 0x6B83,\n\t15370: 0x592E,\n\t15371: 0x9E2F,\n\t15372: 0x79E7,\n\t15373: 0x6768,\n\t15374: 0x626C,\n\t15375: 0x4F6F,\n\t15376: 0x75A1,\n\t15377: 0x7F8A,\n\t15378: 0x6D0B,\n\t15379: 0x9633,\n\t15380: 0x6C27,\n\t15381: 0x4EF0,\n\t15382: 0x75D2,\n\t15383: 0x517B,\n\t15384: 0x6837,\n\t15385: 0x6F3E,\n\t15386: 0x9080,\n\t15387: 0x8170,\n\t15388: 0x5996,\n\t15389: 0x7476,\n\t15390: 0x8938,\n\t15391: 0x8939,\n\t15392: 0x893A,\n\t15393: 0x893B,\n\t15394: 0x893C,\n\t15395: 0x893D,\n\t15396: 0x893E,\n\t15397: 0x893F,\n\t15398: 0x8940,\n\t15399: 0x8942,\n\t15400: 0x8943,\n\t15401: 0x8945,\n\t15402: 0x8946,\n\t15403: 0x8947,\n\t15404: 0x8948,\n\t15405: 0x8949,\n\t15406: 0x894A,\n\t15407: 0x894B,\n\t15408: 0x894C,\n\t15409: 0x894D,\n\t15410: 0x894E,\n\t15411: 0x894F,\n\t15412: 0x8950,\n\t15413: 0x8951,\n\t15414: 0x8952,\n\t15415: 0x8953,\n\t15416: 0x8954,\n\t15417: 0x8955,\n\t15418: 0x8956,\n\t15419: 0x8957,\n\t15420: 0x8958,\n\t15421: 0x8959,\n\t15422: 0x895A,\n\t15423: 0x895B,\n\t15424: 0x895C,\n\t15425: 0x895D,\n\t15426: 0x8960,\n\t15427: 0x8961,\n\t15428: 0x8962,\n\t15429: 0x8963,\n\t15430: 0x8964,\n\t15431: 0x8965,\n\t15432: 0x8967,\n\t15433: 0x8968,\n\t15434: 0x8969,\n\t15435: 0x896A,\n\t15436: 0x896B,\n\t15437: 0x896C,\n\t15438: 0x896D,\n\t15439: 0x896E,\n\t15440: 0x896F,\n\t15441: 0x8970,\n\t15442: 0x8971,\n\t15443: 0x8972,\n\t15444: 0x8973,\n\t15445: 0x8974,\n\t15446: 0x8975,\n\t15447: 0x8976,\n\t15448: 0x8977,\n\t15449: 0x8978,\n\t15450: 0x8979,\n\t15451: 0x897A,\n\t15452: 0x897C,\n\t15453: 0x897D,\n\t15454: 0x897E,\n\t15455: 0x8980,\n\t15456: 0x8982,\n\t15457: 0x8984,\n\t15458: 0x8985,\n\t15459: 0x8987,\n\t15460: 0x8988,\n\t15461: 0x8989,\n\t15462: 0x898A,\n\t15463: 0x898B,\n\t15464: 0x898C,\n\t15465: 0x898D,\n\t15466: 0x898E,\n\t15467: 0x898F,\n\t15468: 0x8990,\n\t15469: 0x8991,\n\t15470: 0x8992,\n\t15471: 0x8993,\n\t15472: 0x8994,\n\t15473: 0x8995,\n\t15474: 0x8996,\n\t15475: 0x8997,\n\t15476: 0x8998,\n\t15477: 0x8999,\n\t15478: 0x899A,\n\t15479: 0x899B,\n\t15480: 0x899C,\n\t15481: 0x899D,\n\t15482: 0x899E,\n\t15483: 0x899F,\n\t15484: 0x89A0,\n\t15485: 0x89A1,\n\t15486: 0x6447,\n\t15487: 0x5C27,\n\t15488: 0x9065,\n\t15489: 0x7A91,\n\t15490: 0x8C23,\n\t15491: 0x59DA,\n\t15492: 0x54AC,\n\t15493: 0x8200,\n\t15494: 0x836F,\n\t15495: 0x8981,\n\t15496: 0x8000,\n\t15497: 0x6930,\n\t15498: 0x564E,\n\t15499: 0x8036,\n\t15500: 0x7237,\n\t15501: 0x91CE,\n\t15502: 0x51B6,\n\t15503: 0x4E5F,\n\t15504: 0x9875,\n\t15505: 0x6396,\n\t15506: 0x4E1A,\n\t15507: 0x53F6,\n\t15508: 0x66F3,\n\t15509: 0x814B,\n\t15510: 0x591C,\n\t15511: 0x6DB2,\n\t15512: 0x4E00,\n\t15513: 0x58F9,\n\t15514: 0x533B,\n\t15515: 0x63D6,\n\t15516: 0x94F1,\n\t15517: 0x4F9D,\n\t15518: 0x4F0A,\n\t15519: 0x8863,\n\t15520: 0x9890,\n\t15521: 0x5937,\n\t15522: 0x9057,\n\t15523: 0x79FB,\n\t15524: 0x4EEA,\n\t15525: 0x80F0,\n\t15526: 0x7591,\n\t15527: 0x6C82,\n\t15528: 0x5B9C,\n\t15529: 0x59E8,\n\t15530: 0x5F5D,\n\t15531: 0x6905,\n\t15532: 0x8681,\n\t15533: 0x501A,\n\t15534: 0x5DF2,\n\t15535: 0x4E59,\n\t15536: 0x77E3,\n\t15537: 0x4EE5,\n\t15538: 0x827A,\n\t15539: 0x6291,\n\t15540: 0x6613,\n\t15541: 0x9091,\n\t15542: 0x5C79,\n\t15543: 0x4EBF,\n\t15544: 0x5F79,\n\t15545: 0x81C6,\n\t15546: 0x9038,\n\t15547: 0x8084,\n\t15548: 0x75AB,\n\t15549: 0x4EA6,\n\t15550: 0x88D4,\n\t15551: 0x610F,\n\t15552: 0x6BC5,\n\t15553: 0x5FC6,\n\t15554: 0x4E49,\n\t15555: 0x76CA,\n\t15556: 0x6EA2,\n\t15557: 0x8BE3,\n\t15558: 0x8BAE,\n\t15559: 0x8C0A,\n\t15560: 0x8BD1,\n\t15561: 0x5F02,\n\t15562: 0x7FFC,\n\t15563: 0x7FCC,\n\t15564: 0x7ECE,\n\t15565: 0x8335,\n\t15566: 0x836B,\n\t15567: 0x56E0,\n\t15568: 0x6BB7,\n\t15569: 0x97F3,\n\t15570: 0x9634,\n\t15571: 0x59FB,\n\t15572: 0x541F,\n\t15573: 0x94F6,\n\t15574: 0x6DEB,\n\t15575: 0x5BC5,\n\t15576: 0x996E,\n\t15577: 0x5C39,\n\t15578: 0x5F15,\n\t15579: 0x9690,\n\t15580: 0x89A2,\n\t15581: 0x89A3,\n\t15582: 0x89A4,\n\t15583: 0x89A5,\n\t15584: 0x89A6,\n\t15585: 0x89A7,\n\t15586: 0x89A8,\n\t15587: 0x89A9,\n\t15588: 0x89AA,\n\t15589: 0x89AB,\n\t15590: 0x89AC,\n\t15591: 0x89AD,\n\t15592: 0x89AE,\n\t15593: 0x89AF,\n\t15594: 0x89B0,\n\t15595: 0x89B1,\n\t15596: 0x89B2,\n\t15597: 0x89B3,\n\t15598: 0x89B4,\n\t15599: 0x89B5,\n\t15600: 0x89B6,\n\t15601: 0x89B7,\n\t15602: 0x89B8,\n\t15603: 0x89B9,\n\t15604: 0x89BA,\n\t15605: 0x89BB,\n\t15606: 0x89BC,\n\t15607: 0x89BD,\n\t15608: 0x89BE,\n\t15609: 0x89BF,\n\t15610: 0x89C0,\n\t15611: 0x89C3,\n\t15612: 0x89CD,\n\t15613: 0x89D3,\n\t15614: 0x89D4,\n\t15615: 0x89D5,\n\t15616: 0x89D7,\n\t15617: 0x89D8,\n\t15618: 0x89D9,\n\t15619: 0x89DB,\n\t15620: 0x89DD,\n\t15621: 0x89DF,\n\t15622: 0x89E0,\n\t15623: 0x89E1,\n\t15624: 0x89E2,\n\t15625: 0x89E4,\n\t15626: 0x89E7,\n\t15627: 0x89E8,\n\t15628: 0x89E9,\n\t15629: 0x89EA,\n\t15630: 0x89EC,\n\t15631: 0x89ED,\n\t15632: 0x89EE,\n\t15633: 0x89F0,\n\t15634: 0x89F1,\n\t15635: 0x89F2,\n\t15636: 0x89F4,\n\t15637: 0x89F5,\n\t15638: 0x89F6,\n\t15639: 0x89F7,\n\t15640: 0x89F8,\n\t15641: 0x89F9,\n\t15642: 0x89FA,\n\t15643: 0x89FB,\n\t15644: 0x89FC,\n\t15645: 0x89FD,\n\t15646: 0x89FE,\n\t15647: 0x89FF,\n\t15648: 0x8A01,\n\t15649: 0x8A02,\n\t15650: 0x8A03,\n\t15651: 0x8A04,\n\t15652: 0x8A05,\n\t15653: 0x8A06,\n\t15654: 0x8A08,\n\t15655: 0x8A09,\n\t15656: 0x8A0A,\n\t15657: 0x8A0B,\n\t15658: 0x8A0C,\n\t15659: 0x8A0D,\n\t15660: 0x8A0E,\n\t15661: 0x8A0F,\n\t15662: 0x8A10,\n\t15663: 0x8A11,\n\t15664: 0x8A12,\n\t15665: 0x8A13,\n\t15666: 0x8A14,\n\t15667: 0x8A15,\n\t15668: 0x8A16,\n\t15669: 0x8A17,\n\t15670: 0x8A18,\n\t15671: 0x8A19,\n\t15672: 0x8A1A,\n\t15673: 0x8A1B,\n\t15674: 0x8A1C,\n\t15675: 0x8A1D,\n\t15676: 0x5370,\n\t15677: 0x82F1,\n\t15678: 0x6A31,\n\t15679: 0x5A74,\n\t15680: 0x9E70,\n\t15681: 0x5E94,\n\t15682: 0x7F28,\n\t15683: 0x83B9,\n\t15684: 0x8424,\n\t15685: 0x8425,\n\t15686: 0x8367,\n\t15687: 0x8747,\n\t15688: 0x8FCE,\n\t15689: 0x8D62,\n\t15690: 0x76C8,\n\t15691: 0x5F71,\n\t15692: 0x9896,\n\t15693: 0x786C,\n\t15694: 0x6620,\n\t15695: 0x54DF,\n\t15696: 0x62E5,\n\t15697: 0x4F63,\n\t15698: 0x81C3,\n\t15699: 0x75C8,\n\t15700: 0x5EB8,\n\t15701: 0x96CD,\n\t15702: 0x8E0A,\n\t15703: 0x86F9,\n\t15704: 0x548F,\n\t15705: 0x6CF3,\n\t15706: 0x6D8C,\n\t15707: 0x6C38,\n\t15708: 0x607F,\n\t15709: 0x52C7,\n\t15710: 0x7528,\n\t15711: 0x5E7D,\n\t15712: 0x4F18,\n\t15713: 0x60A0,\n\t15714: 0x5FE7,\n\t15715: 0x5C24,\n\t15716: 0x7531,\n\t15717: 0x90AE,\n\t15718: 0x94C0,\n\t15719: 0x72B9,\n\t15720: 0x6CB9,\n\t15721: 0x6E38,\n\t15722: 0x9149,\n\t15723: 0x6709,\n\t15724: 0x53CB,\n\t15725: 0x53F3,\n\t15726: 0x4F51,\n\t15727: 0x91C9,\n\t15728: 0x8BF1,\n\t15729: 0x53C8,\n\t15730: 0x5E7C,\n\t15731: 0x8FC2,\n\t15732: 0x6DE4,\n\t15733: 0x4E8E,\n\t15734: 0x76C2,\n\t15735: 0x6986,\n\t15736: 0x865E,\n\t15737: 0x611A,\n\t15738: 0x8206,\n\t15739: 0x4F59,\n\t15740: 0x4FDE,\n\t15741: 0x903E,\n\t15742: 0x9C7C,\n\t15743: 0x6109,\n\t15744: 0x6E1D,\n\t15745: 0x6E14,\n\t15746: 0x9685,\n\t15747: 0x4E88,\n\t15748: 0x5A31,\n\t15749: 0x96E8,\n\t15750: 0x4E0E,\n\t15751: 0x5C7F,\n\t15752: 0x79B9,\n\t15753: 0x5B87,\n\t15754: 0x8BED,\n\t15755: 0x7FBD,\n\t15756: 0x7389,\n\t15757: 0x57DF,\n\t15758: 0x828B,\n\t15759: 0x90C1,\n\t15760: 0x5401,\n\t15761: 0x9047,\n\t15762: 0x55BB,\n\t15763: 0x5CEA,\n\t15764: 0x5FA1,\n\t15765: 0x6108,\n\t15766: 0x6B32,\n\t15767: 0x72F1,\n\t15768: 0x80B2,\n\t15769: 0x8A89,\n\t15770: 0x8A1E,\n\t15771: 0x8A1F,\n\t15772: 0x8A20,\n\t15773: 0x8A21,\n\t15774: 0x8A22,\n\t15775: 0x8A23,\n\t15776: 0x8A24,\n\t15777: 0x8A25,\n\t15778: 0x8A26,\n\t15779: 0x8A27,\n\t15780: 0x8A28,\n\t15781: 0x8A29,\n\t15782: 0x8A2A,\n\t15783: 0x8A2B,\n\t15784: 0x8A2C,\n\t15785: 0x8A2D,\n\t15786: 0x8A2E,\n\t15787: 0x8A2F,\n\t15788: 0x8A30,\n\t15789: 0x8A31,\n\t15790: 0x8A32,\n\t15791: 0x8A33,\n\t15792: 0x8A34,\n\t15793: 0x8A35,\n\t15794: 0x8A36,\n\t15795: 0x8A37,\n\t15796: 0x8A38,\n\t15797: 0x8A39,\n\t15798: 0x8A3A,\n\t15799: 0x8A3B,\n\t15800: 0x8A3C,\n\t15801: 0x8A3D,\n\t15802: 0x8A3F,\n\t15803: 0x8A40,\n\t15804: 0x8A41,\n\t15805: 0x8A42,\n\t15806: 0x8A43,\n\t15807: 0x8A44,\n\t15808: 0x8A45,\n\t15809: 0x8A46,\n\t15810: 0x8A47,\n\t15811: 0x8A49,\n\t15812: 0x8A4A,\n\t15813: 0x8A4B,\n\t15814: 0x8A4C,\n\t15815: 0x8A4D,\n\t15816: 0x8A4E,\n\t15817: 0x8A4F,\n\t15818: 0x8A50,\n\t15819: 0x8A51,\n\t15820: 0x8A52,\n\t15821: 0x8A53,\n\t15822: 0x8A54,\n\t15823: 0x8A55,\n\t15824: 0x8A56,\n\t15825: 0x8A57,\n\t15826: 0x8A58,\n\t15827: 0x8A59,\n\t15828: 0x8A5A,\n\t15829: 0x8A5B,\n\t15830: 0x8A5C,\n\t15831: 0x8A5D,\n\t15832: 0x8A5E,\n\t15833: 0x8A5F,\n\t15834: 0x8A60,\n\t15835: 0x8A61,\n\t15836: 0x8A62,\n\t15837: 0x8A63,\n\t15838: 0x8A64,\n\t15839: 0x8A65,\n\t15840: 0x8A66,\n\t15841: 0x8A67,\n\t15842: 0x8A68,\n\t15843: 0x8A69,\n\t15844: 0x8A6A,\n\t15845: 0x8A6B,\n\t15846: 0x8A6C,\n\t15847: 0x8A6D,\n\t15848: 0x8A6E,\n\t15849: 0x8A6F,\n\t15850: 0x8A70,\n\t15851: 0x8A71,\n\t15852: 0x8A72,\n\t15853: 0x8A73,\n\t15854: 0x8A74,\n\t15855: 0x8A75,\n\t15856: 0x8A76,\n\t15857: 0x8A77,\n\t15858: 0x8A78,\n\t15859: 0x8A7A,\n\t15860: 0x8A7B,\n\t15861: 0x8A7C,\n\t15862: 0x8A7D,\n\t15863: 0x8A7E,\n\t15864: 0x8A7F,\n\t15865: 0x8A80,\n\t15866: 0x6D74,\n\t15867: 0x5BD3,\n\t15868: 0x88D5,\n\t15869: 0x9884,\n\t15870: 0x8C6B,\n\t15871: 0x9A6D,\n\t15872: 0x9E33,\n\t15873: 0x6E0A,\n\t15874: 0x51A4,\n\t15875: 0x5143,\n\t15876: 0x57A3,\n\t15877: 0x8881,\n\t15878: 0x539F,\n\t15879: 0x63F4,\n\t15880: 0x8F95,\n\t15881: 0x56ED,\n\t15882: 0x5458,\n\t15883: 0x5706,\n\t15884: 0x733F,\n\t15885: 0x6E90,\n\t15886: 0x7F18,\n\t15887: 0x8FDC,\n\t15888: 0x82D1,\n\t15889: 0x613F,\n\t15890: 0x6028,\n\t15891: 0x9662,\n\t15892: 0x66F0,\n\t15893: 0x7EA6,\n\t15894: 0x8D8A,\n\t15895: 0x8DC3,\n\t15896: 0x94A5,\n\t15897: 0x5CB3,\n\t15898: 0x7CA4,\n\t15899: 0x6708,\n\t15900: 0x60A6,\n\t15901: 0x9605,\n\t15902: 0x8018,\n\t15903: 0x4E91,\n\t15904: 0x90E7,\n\t15905: 0x5300,\n\t15906: 0x9668,\n\t15907: 0x5141,\n\t15908: 0x8FD0,\n\t15909: 0x8574,\n\t15910: 0x915D,\n\t15911: 0x6655,\n\t15912: 0x97F5,\n\t15913: 0x5B55,\n\t15914: 0x531D,\n\t15915: 0x7838,\n\t15916: 0x6742,\n\t15917: 0x683D,\n\t15918: 0x54C9,\n\t15919: 0x707E,\n\t15920: 0x5BB0,\n\t15921: 0x8F7D,\n\t15922: 0x518D,\n\t15923: 0x5728,\n\t15924: 0x54B1,\n\t15925: 0x6512,\n\t15926: 0x6682,\n\t15927: 0x8D5E,\n\t15928: 0x8D43,\n\t15929: 0x810F,\n\t15930: 0x846C,\n\t15931: 0x906D,\n\t15932: 0x7CDF,\n\t15933: 0x51FF,\n\t15934: 0x85FB,\n\t15935: 0x67A3,\n\t15936: 0x65E9,\n\t15937: 0x6FA1,\n\t15938: 0x86A4,\n\t15939: 0x8E81,\n\t15940: 0x566A,\n\t15941: 0x9020,\n\t15942: 0x7682,\n\t15943: 0x7076,\n\t15944: 0x71E5,\n\t15945: 0x8D23,\n\t15946: 0x62E9,\n\t15947: 0x5219,\n\t15948: 0x6CFD,\n\t15949: 0x8D3C,\n\t15950: 0x600E,\n\t15951: 0x589E,\n\t15952: 0x618E,\n\t15953: 0x66FE,\n\t15954: 0x8D60,\n\t15955: 0x624E,\n\t15956: 0x55B3,\n\t15957: 0x6E23,\n\t15958: 0x672D,\n\t15959: 0x8F67,\n\t15960: 0x8A81,\n\t15961: 0x8A82,\n\t15962: 0x8A83,\n\t15963: 0x8A84,\n\t15964: 0x8A85,\n\t15965: 0x8A86,\n\t15966: 0x8A87,\n\t15967: 0x8A88,\n\t15968: 0x8A8B,\n\t15969: 0x8A8C,\n\t15970: 0x8A8D,\n\t15971: 0x8A8E,\n\t15972: 0x8A8F,\n\t15973: 0x8A90,\n\t15974: 0x8A91,\n\t15975: 0x8A92,\n\t15976: 0x8A94,\n\t15977: 0x8A95,\n\t15978: 0x8A96,\n\t15979: 0x8A97,\n\t15980: 0x8A98,\n\t15981: 0x8A99,\n\t15982: 0x8A9A,\n\t15983: 0x8A9B,\n\t15984: 0x8A9C,\n\t15985: 0x8A9D,\n\t15986: 0x8A9E,\n\t15987: 0x8A9F,\n\t15988: 0x8AA0,\n\t15989: 0x8AA1,\n\t15990: 0x8AA2,\n\t15991: 0x8AA3,\n\t15992: 0x8AA4,\n\t15993: 0x8AA5,\n\t15994: 0x8AA6,\n\t15995: 0x8AA7,\n\t15996: 0x8AA8,\n\t15997: 0x8AA9,\n\t15998: 0x8AAA,\n\t15999: 0x8AAB,\n\t16000: 0x8AAC,\n\t16001: 0x8AAD,\n\t16002: 0x8AAE,\n\t16003: 0x8AAF,\n\t16004: 0x8AB0,\n\t16005: 0x8AB1,\n\t16006: 0x8AB2,\n\t16007: 0x8AB3,\n\t16008: 0x8AB4,\n\t16009: 0x8AB5,\n\t16010: 0x8AB6,\n\t16011: 0x8AB7,\n\t16012: 0x8AB8,\n\t16013: 0x8AB9,\n\t16014: 0x8ABA,\n\t16015: 0x8ABB,\n\t16016: 0x8ABC,\n\t16017: 0x8ABD,\n\t16018: 0x8ABE,\n\t16019: 0x8ABF,\n\t16020: 0x8AC0,\n\t16021: 0x8AC1,\n\t16022: 0x8AC2,\n\t16023: 0x8AC3,\n\t16024: 0x8AC4,\n\t16025: 0x8AC5,\n\t16026: 0x8AC6,\n\t16027: 0x8AC7,\n\t16028: 0x8AC8,\n\t16029: 0x8AC9,\n\t16030: 0x8ACA,\n\t16031: 0x8ACB,\n\t16032: 0x8ACC,\n\t16033: 0x8ACD,\n\t16034: 0x8ACE,\n\t16035: 0x8ACF,\n\t16036: 0x8AD0,\n\t16037: 0x8AD1,\n\t16038: 0x8AD2,\n\t16039: 0x8AD3,\n\t16040: 0x8AD4,\n\t16041: 0x8AD5,\n\t16042: 0x8AD6,\n\t16043: 0x8AD7,\n\t16044: 0x8AD8,\n\t16045: 0x8AD9,\n\t16046: 0x8ADA,\n\t16047: 0x8ADB,\n\t16048: 0x8ADC,\n\t16049: 0x8ADD,\n\t16050: 0x8ADE,\n\t16051: 0x8ADF,\n\t16052: 0x8AE0,\n\t16053: 0x8AE1,\n\t16054: 0x8AE2,\n\t16055: 0x8AE3,\n\t16056: 0x94E1,\n\t16057: 0x95F8,\n\t16058: 0x7728,\n\t16059: 0x6805,\n\t16060: 0x69A8,\n\t16061: 0x548B,\n\t16062: 0x4E4D,\n\t16063: 0x70B8,\n\t16064: 0x8BC8,\n\t16065: 0x6458,\n\t16066: 0x658B,\n\t16067: 0x5B85,\n\t16068: 0x7A84,\n\t16069: 0x503A,\n\t16070: 0x5BE8,\n\t16071: 0x77BB,\n\t16072: 0x6BE1,\n\t16073: 0x8A79,\n\t16074: 0x7C98,\n\t16075: 0x6CBE,\n\t16076: 0x76CF,\n\t16077: 0x65A9,\n\t16078: 0x8F97,\n\t16079: 0x5D2D,\n\t16080: 0x5C55,\n\t16081: 0x8638,\n\t16082: 0x6808,\n\t16083: 0x5360,\n\t16084: 0x6218,\n\t16085: 0x7AD9,\n\t16086: 0x6E5B,\n\t16087: 0x7EFD,\n\t16088: 0x6A1F,\n\t16089: 0x7AE0,\n\t16090: 0x5F70,\n\t16091: 0x6F33,\n\t16092: 0x5F20,\n\t16093: 0x638C,\n\t16094: 0x6DA8,\n\t16095: 0x6756,\n\t16096: 0x4E08,\n\t16097: 0x5E10,\n\t16098: 0x8D26,\n\t16099: 0x4ED7,\n\t16100: 0x80C0,\n\t16101: 0x7634,\n\t16102: 0x969C,\n\t16103: 0x62DB,\n\t16104: 0x662D,\n\t16105: 0x627E,\n\t16106: 0x6CBC,\n\t16107: 0x8D75,\n\t16108: 0x7167,\n\t16109: 0x7F69,\n\t16110: 0x5146,\n\t16111: 0x8087,\n\t16112: 0x53EC,\n\t16113: 0x906E,\n\t16114: 0x6298,\n\t16115: 0x54F2,\n\t16116: 0x86F0,\n\t16117: 0x8F99,\n\t16118: 0x8005,\n\t16119: 0x9517,\n\t16120: 0x8517,\n\t16121: 0x8FD9,\n\t16122: 0x6D59,\n\t16123: 0x73CD,\n\t16124: 0x659F,\n\t16125: 0x771F,\n\t16126: 0x7504,\n\t16127: 0x7827,\n\t16128: 0x81FB,\n\t16129: 0x8D1E,\n\t16130: 0x9488,\n\t16131: 0x4FA6,\n\t16132: 0x6795,\n\t16133: 0x75B9,\n\t16134: 0x8BCA,\n\t16135: 0x9707,\n\t16136: 0x632F,\n\t16137: 0x9547,\n\t16138: 0x9635,\n\t16139: 0x84B8,\n\t16140: 0x6323,\n\t16141: 0x7741,\n\t16142: 0x5F81,\n\t16143: 0x72F0,\n\t16144: 0x4E89,\n\t16145: 0x6014,\n\t16146: 0x6574,\n\t16147: 0x62EF,\n\t16148: 0x6B63,\n\t16149: 0x653F,\n\t16150: 0x8AE4,\n\t16151: 0x8AE5,\n\t16152: 0x8AE6,\n\t16153: 0x8AE7,\n\t16154: 0x8AE8,\n\t16155: 0x8AE9,\n\t16156: 0x8AEA,\n\t16157: 0x8AEB,\n\t16158: 0x8AEC,\n\t16159: 0x8AED,\n\t16160: 0x8AEE,\n\t16161: 0x8AEF,\n\t16162: 0x8AF0,\n\t16163: 0x8AF1,\n\t16164: 0x8AF2,\n\t16165: 0x8AF3,\n\t16166: 0x8AF4,\n\t16167: 0x8AF5,\n\t16168: 0x8AF6,\n\t16169: 0x8AF7,\n\t16170: 0x8AF8,\n\t16171: 0x8AF9,\n\t16172: 0x8AFA,\n\t16173: 0x8AFB,\n\t16174: 0x8AFC,\n\t16175: 0x8AFD,\n\t16176: 0x8AFE,\n\t16177: 0x8AFF,\n\t16178: 0x8B00,\n\t16179: 0x8B01,\n\t16180: 0x8B02,\n\t16181: 0x8B03,\n\t16182: 0x8B04,\n\t16183: 0x8B05,\n\t16184: 0x8B06,\n\t16185: 0x8B08,\n\t16186: 0x8B09,\n\t16187: 0x8B0A,\n\t16188: 0x8B0B,\n\t16189: 0x8B0C,\n\t16190: 0x8B0D,\n\t16191: 0x8B0E,\n\t16192: 0x8B0F,\n\t16193: 0x8B10,\n\t16194: 0x8B11,\n\t16195: 0x8B12,\n\t16196: 0x8B13,\n\t16197: 0x8B14,\n\t16198: 0x8B15,\n\t16199: 0x8B16,\n\t16200: 0x8B17,\n\t16201: 0x8B18,\n\t16202: 0x8B19,\n\t16203: 0x8B1A,\n\t16204: 0x8B1B,\n\t16205: 0x8B1C,\n\t16206: 0x8B1D,\n\t16207: 0x8B1E,\n\t16208: 0x8B1F,\n\t16209: 0x8B20,\n\t16210: 0x8B21,\n\t16211: 0x8B22,\n\t16212: 0x8B23,\n\t16213: 0x8B24,\n\t16214: 0x8B25,\n\t16215: 0x8B27,\n\t16216: 0x8B28,\n\t16217: 0x8B29,\n\t16218: 0x8B2A,\n\t16219: 0x8B2B,\n\t16220: 0x8B2C,\n\t16221: 0x8B2D,\n\t16222: 0x8B2E,\n\t16223: 0x8B2F,\n\t16224: 0x8B30,\n\t16225: 0x8B31,\n\t16226: 0x8B32,\n\t16227: 0x8B33,\n\t16228: 0x8B34,\n\t16229: 0x8B35,\n\t16230: 0x8B36,\n\t16231: 0x8B37,\n\t16232: 0x8B38,\n\t16233: 0x8B39,\n\t16234: 0x8B3A,\n\t16235: 0x8B3B,\n\t16236: 0x8B3C,\n\t16237: 0x8B3D,\n\t16238: 0x8B3E,\n\t16239: 0x8B3F,\n\t16240: 0x8B40,\n\t16241: 0x8B41,\n\t16242: 0x8B42,\n\t16243: 0x8B43,\n\t16244: 0x8B44,\n\t16245: 0x8B45,\n\t16246: 0x5E27,\n\t16247: 0x75C7,\n\t16248: 0x90D1,\n\t16249: 0x8BC1,\n\t16250: 0x829D,\n\t16251: 0x679D,\n\t16252: 0x652F,\n\t16253: 0x5431,\n\t16254: 0x8718,\n\t16255: 0x77E5,\n\t16256: 0x80A2,\n\t16257: 0x8102,\n\t16258: 0x6C41,\n\t16259: 0x4E4B,\n\t16260: 0x7EC7,\n\t16261: 0x804C,\n\t16262: 0x76F4,\n\t16263: 0x690D,\n\t16264: 0x6B96,\n\t16265: 0x6267,\n\t16266: 0x503C,\n\t16267: 0x4F84,\n\t16268: 0x5740,\n\t16269: 0x6307,\n\t16270: 0x6B62,\n\t16271: 0x8DBE,\n\t16272: 0x53EA,\n\t16273: 0x65E8,\n\t16274: 0x7EB8,\n\t16275: 0x5FD7,\n\t16276: 0x631A,\n\t16277: 0x63B7,\n\t16278: 0x81F3,\n\t16279: 0x81F4,\n\t16280: 0x7F6E,\n\t16281: 0x5E1C,\n\t16282: 0x5CD9,\n\t16283: 0x5236,\n\t16284: 0x667A,\n\t16285: 0x79E9,\n\t16286: 0x7A1A,\n\t16287: 0x8D28,\n\t16288: 0x7099,\n\t16289: 0x75D4,\n\t16290: 0x6EDE,\n\t16291: 0x6CBB,\n\t16292: 0x7A92,\n\t16293: 0x4E2D,\n\t16294: 0x76C5,\n\t16295: 0x5FE0,\n\t16296: 0x949F,\n\t16297: 0x8877,\n\t16298: 0x7EC8,\n\t16299: 0x79CD,\n\t16300: 0x80BF,\n\t16301: 0x91CD,\n\t16302: 0x4EF2,\n\t16303: 0x4F17,\n\t16304: 0x821F,\n\t16305: 0x5468,\n\t16306: 0x5DDE,\n\t16307: 0x6D32,\n\t16308: 0x8BCC,\n\t16309: 0x7CA5,\n\t16310: 0x8F74,\n\t16311: 0x8098,\n\t16312: 0x5E1A,\n\t16313: 0x5492,\n\t16314: 0x76B1,\n\t16315: 0x5B99,\n\t16316: 0x663C,\n\t16317: 0x9AA4,\n\t16318: 0x73E0,\n\t16319: 0x682A,\n\t16320: 0x86DB,\n\t16321: 0x6731,\n\t16322: 0x732A,\n\t16323: 0x8BF8,\n\t16324: 0x8BDB,\n\t16325: 0x9010,\n\t16326: 0x7AF9,\n\t16327: 0x70DB,\n\t16328: 0x716E,\n\t16329: 0x62C4,\n\t16330: 0x77A9,\n\t16331: 0x5631,\n\t16332: 0x4E3B,\n\t16333: 0x8457,\n\t16334: 0x67F1,\n\t16335: 0x52A9,\n\t16336: 0x86C0,\n\t16337: 0x8D2E,\n\t16338: 0x94F8,\n\t16339: 0x7B51,\n\t16340: 0x8B46,\n\t16341: 0x8B47,\n\t16342: 0x8B48,\n\t16343: 0x8B49,\n\t16344: 0x8B4A,\n\t16345: 0x8B4B,\n\t16346: 0x8B4C,\n\t16347: 0x8B4D,\n\t16348: 0x8B4E,\n\t16349: 0x8B4F,\n\t16350: 0x8B50,\n\t16351: 0x8B51,\n\t16352: 0x8B52,\n\t16353: 0x8B53,\n\t16354: 0x8B54,\n\t16355: 0x8B55,\n\t16356: 0x8B56,\n\t16357: 0x8B57,\n\t16358: 0x8B58,\n\t16359: 0x8B59,\n\t16360: 0x8B5A,\n\t16361: 0x8B5B,\n\t16362: 0x8B5C,\n\t16363: 0x8B5D,\n\t16364: 0x8B5E,\n\t16365: 0x8B5F,\n\t16366: 0x8B60,\n\t16367: 0x8B61,\n\t16368: 0x8B62,\n\t16369: 0x8B63,\n\t16370: 0x8B64,\n\t16371: 0x8B65,\n\t16372: 0x8B67,\n\t16373: 0x8B68,\n\t16374: 0x8B69,\n\t16375: 0x8B6A,\n\t16376: 0x8B6B,\n\t16377: 0x8B6D,\n\t16378: 0x8B6E,\n\t16379: 0x8B6F,\n\t16380: 0x8B70,\n\t16381: 0x8B71,\n\t16382: 0x8B72,\n\t16383: 0x8B73,\n\t16384: 0x8B74,\n\t16385: 0x8B75,\n\t16386: 0x8B76,\n\t16387: 0x8B77,\n\t16388: 0x8B78,\n\t16389: 0x8B79,\n\t16390: 0x8B7A,\n\t16391: 0x8B7B,\n\t16392: 0x8B7C,\n\t16393: 0x8B7D,\n\t16394: 0x8B7E,\n\t16395: 0x8B7F,\n\t16396: 0x8B80,\n\t16397: 0x8B81,\n\t16398: 0x8B82,\n\t16399: 0x8B83,\n\t16400: 0x8B84,\n\t16401: 0x8B85,\n\t16402: 0x8B86,\n\t16403: 0x8B87,\n\t16404: 0x8B88,\n\t16405: 0x8B89,\n\t16406: 0x8B8A,\n\t16407: 0x8B8B,\n\t16408: 0x8B8C,\n\t16409: 0x8B8D,\n\t16410: 0x8B8E,\n\t16411: 0x8B8F,\n\t16412: 0x8B90,\n\t16413: 0x8B91,\n\t16414: 0x8B92,\n\t16415: 0x8B93,\n\t16416: 0x8B94,\n\t16417: 0x8B95,\n\t16418: 0x8B96,\n\t16419: 0x8B97,\n\t16420: 0x8B98,\n\t16421: 0x8B99,\n\t16422: 0x8B9A,\n\t16423: 0x8B9B,\n\t16424: 0x8B9C,\n\t16425: 0x8B9D,\n\t16426: 0x8B9E,\n\t16427: 0x8B9F,\n\t16428: 0x8BAC,\n\t16429: 0x8BB1,\n\t16430: 0x8BBB,\n\t16431: 0x8BC7,\n\t16432: 0x8BD0,\n\t16433: 0x8BEA,\n\t16434: 0x8C09,\n\t16435: 0x8C1E,\n\t16436: 0x4F4F,\n\t16437: 0x6CE8,\n\t16438: 0x795D,\n\t16439: 0x9A7B,\n\t16440: 0x6293,\n\t16441: 0x722A,\n\t16442: 0x62FD,\n\t16443: 0x4E13,\n\t16444: 0x7816,\n\t16445: 0x8F6C,\n\t16446: 0x64B0,\n\t16447: 0x8D5A,\n\t16448: 0x7BC6,\n\t16449: 0x6869,\n\t16450: 0x5E84,\n\t16451: 0x88C5,\n\t16452: 0x5986,\n\t16453: 0x649E,\n\t16454: 0x58EE,\n\t16455: 0x72B6,\n\t16456: 0x690E,\n\t16457: 0x9525,\n\t16458: 0x8FFD,\n\t16459: 0x8D58,\n\t16460: 0x5760,\n\t16461: 0x7F00,\n\t16462: 0x8C06,\n\t16463: 0x51C6,\n\t16464: 0x6349,\n\t16465: 0x62D9,\n\t16466: 0x5353,\n\t16467: 0x684C,\n\t16468: 0x7422,\n\t16469: 0x8301,\n\t16470: 0x914C,\n\t16471: 0x5544,\n\t16472: 0x7740,\n\t16473: 0x707C,\n\t16474: 0x6D4A,\n\t16475: 0x5179,\n\t16476: 0x54A8,\n\t16477: 0x8D44,\n\t16478: 0x59FF,\n\t16479: 0x6ECB,\n\t16480: 0x6DC4,\n\t16481: 0x5B5C,\n\t16482: 0x7D2B,\n\t16483: 0x4ED4,\n\t16484: 0x7C7D,\n\t16485: 0x6ED3,\n\t16486: 0x5B50,\n\t16487: 0x81EA,\n\t16488: 0x6E0D,\n\t16489: 0x5B57,\n\t16490: 0x9B03,\n\t16491: 0x68D5,\n\t16492: 0x8E2A,\n\t16493: 0x5B97,\n\t16494: 0x7EFC,\n\t16495: 0x603B,\n\t16496: 0x7EB5,\n\t16497: 0x90B9,\n\t16498: 0x8D70,\n\t16499: 0x594F,\n\t16500: 0x63CD,\n\t16501: 0x79DF,\n\t16502: 0x8DB3,\n\t16503: 0x5352,\n\t16504: 0x65CF,\n\t16505: 0x7956,\n\t16506: 0x8BC5,\n\t16507: 0x963B,\n\t16508: 0x7EC4,\n\t16509: 0x94BB,\n\t16510: 0x7E82,\n\t16511: 0x5634,\n\t16512: 0x9189,\n\t16513: 0x6700,\n\t16514: 0x7F6A,\n\t16515: 0x5C0A,\n\t16516: 0x9075,\n\t16517: 0x6628,\n\t16518: 0x5DE6,\n\t16519: 0x4F50,\n\t16520: 0x67DE,\n\t16521: 0x505A,\n\t16522: 0x4F5C,\n\t16523: 0x5750,\n\t16524: 0x5EA7,\n\t16530: 0x8C38,\n\t16531: 0x8C39,\n\t16532: 0x8C3A,\n\t16533: 0x8C3B,\n\t16534: 0x8C3C,\n\t16535: 0x8C3D,\n\t16536: 0x8C3E,\n\t16537: 0x8C3F,\n\t16538: 0x8C40,\n\t16539: 0x8C42,\n\t16540: 0x8C43,\n\t16541: 0x8C44,\n\t16542: 0x8C45,\n\t16543: 0x8C48,\n\t16544: 0x8C4A,\n\t16545: 0x8C4B,\n\t16546: 0x8C4D,\n\t16547: 0x8C4E,\n\t16548: 0x8C4F,\n\t16549: 0x8C50,\n\t16550: 0x8C51,\n\t16551: 0x8C52,\n\t16552: 0x8C53,\n\t16553: 0x8C54,\n\t16554: 0x8C56,\n\t16555: 0x8C57,\n\t16556: 0x8C58,\n\t16557: 0x8C59,\n\t16558: 0x8C5B,\n\t16559: 0x8C5C,\n\t16560: 0x8C5D,\n\t16561: 0x8C5E,\n\t16562: 0x8C5F,\n\t16563: 0x8C60,\n\t16564: 0x8C63,\n\t16565: 0x8C64,\n\t16566: 0x8C65,\n\t16567: 0x8C66,\n\t16568: 0x8C67,\n\t16569: 0x8C68,\n\t16570: 0x8C69,\n\t16571: 0x8C6C,\n\t16572: 0x8C6D,\n\t16573: 0x8C6E,\n\t16574: 0x8C6F,\n\t16575: 0x8C70,\n\t16576: 0x8C71,\n\t16577: 0x8C72,\n\t16578: 0x8C74,\n\t16579: 0x8C75,\n\t16580: 0x8C76,\n\t16581: 0x8C77,\n\t16582: 0x8C7B,\n\t16583: 0x8C7C,\n\t16584: 0x8C7D,\n\t16585: 0x8C7E,\n\t16586: 0x8C7F,\n\t16587: 0x8C80,\n\t16588: 0x8C81,\n\t16589: 0x8C83,\n\t16590: 0x8C84,\n\t16591: 0x8C86,\n\t16592: 0x8C87,\n\t16593: 0x8C88,\n\t16594: 0x8C8B,\n\t16595: 0x8C8D,\n\t16596: 0x8C8E,\n\t16597: 0x8C8F,\n\t16598: 0x8C90,\n\t16599: 0x8C91,\n\t16600: 0x8C92,\n\t16601: 0x8C93,\n\t16602: 0x8C95,\n\t16603: 0x8C96,\n\t16604: 0x8C97,\n\t16605: 0x8C99,\n\t16606: 0x8C9A,\n\t16607: 0x8C9B,\n\t16608: 0x8C9C,\n\t16609: 0x8C9D,\n\t16610: 0x8C9E,\n\t16611: 0x8C9F,\n\t16612: 0x8CA0,\n\t16613: 0x8CA1,\n\t16614: 0x8CA2,\n\t16615: 0x8CA3,\n\t16616: 0x8CA4,\n\t16617: 0x8CA5,\n\t16618: 0x8CA6,\n\t16619: 0x8CA7,\n\t16620: 0x8CA8,\n\t16621: 0x8CA9,\n\t16622: 0x8CAA,\n\t16623: 0x8CAB,\n\t16624: 0x8CAC,\n\t16625: 0x8CAD,\n\t16626: 0x4E8D,\n\t16627: 0x4E0C,\n\t16628: 0x5140,\n\t16629: 0x4E10,\n\t16630: 0x5EFF,\n\t16631: 0x5345,\n\t16632: 0x4E15,\n\t16633: 0x4E98,\n\t16634: 0x4E1E,\n\t16635: 0x9B32,\n\t16636: 0x5B6C,\n\t16637: 0x5669,\n\t16638: 0x4E28,\n\t16639: 0x79BA,\n\t16640: 0x4E3F,\n\t16641: 0x5315,\n\t16642: 0x4E47,\n\t16643: 0x592D,\n\t16644: 0x723B,\n\t16645: 0x536E,\n\t16646: 0x6C10,\n\t16647: 0x56DF,\n\t16648: 0x80E4,\n\t16649: 0x9997,\n\t16650: 0x6BD3,\n\t16651: 0x777E,\n\t16652: 0x9F17,\n\t16653: 0x4E36,\n\t16654: 0x4E9F,\n\t16655: 0x9F10,\n\t16656: 0x4E5C,\n\t16657: 0x4E69,\n\t16658: 0x4E93,\n\t16659: 0x8288,\n\t16660: 0x5B5B,\n\t16661: 0x556C,\n\t16662: 0x560F,\n\t16663: 0x4EC4,\n\t16664: 0x538D,\n\t16665: 0x539D,\n\t16666: 0x53A3,\n\t16667: 0x53A5,\n\t16668: 0x53AE,\n\t16669: 0x9765,\n\t16670: 0x8D5D,\n\t16671: 0x531A,\n\t16672: 0x53F5,\n\t16673: 0x5326,\n\t16674: 0x532E,\n\t16675: 0x533E,\n\t16676: 0x8D5C,\n\t16677: 0x5366,\n\t16678: 0x5363,\n\t16679: 0x5202,\n\t16680: 0x5208,\n\t16681: 0x520E,\n\t16682: 0x522D,\n\t16683: 0x5233,\n\t16684: 0x523F,\n\t16685: 0x5240,\n\t16686: 0x524C,\n\t16687: 0x525E,\n\t16688: 0x5261,\n\t16689: 0x525C,\n\t16690: 0x84AF,\n\t16691: 0x527D,\n\t16692: 0x5282,\n\t16693: 0x5281,\n\t16694: 0x5290,\n\t16695: 0x5293,\n\t16696: 0x5182,\n\t16697: 0x7F54,\n\t16698: 0x4EBB,\n\t16699: 0x4EC3,\n\t16700: 0x4EC9,\n\t16701: 0x4EC2,\n\t16702: 0x4EE8,\n\t16703: 0x4EE1,\n\t16704: 0x4EEB,\n\t16705: 0x4EDE,\n\t16706: 0x4F1B,\n\t16707: 0x4EF3,\n\t16708: 0x4F22,\n\t16709: 0x4F64,\n\t16710: 0x4EF5,\n\t16711: 0x4F25,\n\t16712: 0x4F27,\n\t16713: 0x4F09,\n\t16714: 0x4F2B,\n\t16715: 0x4F5E,\n\t16716: 0x4F67,\n\t16717: 0x6538,\n\t16718: 0x4F5A,\n\t16719: 0x4F5D,\n\t16720: 0x8CAE,\n\t16721: 0x8CAF,\n\t16722: 0x8CB0,\n\t16723: 0x8CB1,\n\t16724: 0x8CB2,\n\t16725: 0x8CB3,\n\t16726: 0x8CB4,\n\t16727: 0x8CB5,\n\t16728: 0x8CB6,\n\t16729: 0x8CB7,\n\t16730: 0x8CB8,\n\t16731: 0x8CB9,\n\t16732: 0x8CBA,\n\t16733: 0x8CBB,\n\t16734: 0x8CBC,\n\t16735: 0x8CBD,\n\t16736: 0x8CBE,\n\t16737: 0x8CBF,\n\t16738: 0x8CC0,\n\t16739: 0x8CC1,\n\t16740: 0x8CC2,\n\t16741: 0x8CC3,\n\t16742: 0x8CC4,\n\t16743: 0x8CC5,\n\t16744: 0x8CC6,\n\t16745: 0x8CC7,\n\t16746: 0x8CC8,\n\t16747: 0x8CC9,\n\t16748: 0x8CCA,\n\t16749: 0x8CCB,\n\t16750: 0x8CCC,\n\t16751: 0x8CCD,\n\t16752: 0x8CCE,\n\t16753: 0x8CCF,\n\t16754: 0x8CD0,\n\t16755: 0x8CD1,\n\t16756: 0x8CD2,\n\t16757: 0x8CD3,\n\t16758: 0x8CD4,\n\t16759: 0x8CD5,\n\t16760: 0x8CD6,\n\t16761: 0x8CD7,\n\t16762: 0x8CD8,\n\t16763: 0x8CD9,\n\t16764: 0x8CDA,\n\t16765: 0x8CDB,\n\t16766: 0x8CDC,\n\t16767: 0x8CDD,\n\t16768: 0x8CDE,\n\t16769: 0x8CDF,\n\t16770: 0x8CE0,\n\t16771: 0x8CE1,\n\t16772: 0x8CE2,\n\t16773: 0x8CE3,\n\t16774: 0x8CE4,\n\t16775: 0x8CE5,\n\t16776: 0x8CE6,\n\t16777: 0x8CE7,\n\t16778: 0x8CE8,\n\t16779: 0x8CE9,\n\t16780: 0x8CEA,\n\t16781: 0x8CEB,\n\t16782: 0x8CEC,\n\t16783: 0x8CED,\n\t16784: 0x8CEE,\n\t16785: 0x8CEF,\n\t16786: 0x8CF0,\n\t16787: 0x8CF1,\n\t16788: 0x8CF2,\n\t16789: 0x8CF3,\n\t16790: 0x8CF4,\n\t16791: 0x8CF5,\n\t16792: 0x8CF6,\n\t16793: 0x8CF7,\n\t16794: 0x8CF8,\n\t16795: 0x8CF9,\n\t16796: 0x8CFA,\n\t16797: 0x8CFB,\n\t16798: 0x8CFC,\n\t16799: 0x8CFD,\n\t16800: 0x8CFE,\n\t16801: 0x8CFF,\n\t16802: 0x8D00,\n\t16803: 0x8D01,\n\t16804: 0x8D02,\n\t16805: 0x8D03,\n\t16806: 0x8D04,\n\t16807: 0x8D05,\n\t16808: 0x8D06,\n\t16809: 0x8D07,\n\t16810: 0x8D08,\n\t16811: 0x8D09,\n\t16812: 0x8D0A,\n\t16813: 0x8D0B,\n\t16814: 0x8D0C,\n\t16815: 0x8D0D,\n\t16816: 0x4F5F,\n\t16817: 0x4F57,\n\t16818: 0x4F32,\n\t16819: 0x4F3D,\n\t16820: 0x4F76,\n\t16821: 0x4F74,\n\t16822: 0x4F91,\n\t16823: 0x4F89,\n\t16824: 0x4F83,\n\t16825: 0x4F8F,\n\t16826: 0x4F7E,\n\t16827: 0x4F7B,\n\t16828: 0x4FAA,\n\t16829: 0x4F7C,\n\t16830: 0x4FAC,\n\t16831: 0x4F94,\n\t16832: 0x4FE6,\n\t16833: 0x4FE8,\n\t16834: 0x4FEA,\n\t16835: 0x4FC5,\n\t16836: 0x4FDA,\n\t16837: 0x4FE3,\n\t16838: 0x4FDC,\n\t16839: 0x4FD1,\n\t16840: 0x4FDF,\n\t16841: 0x4FF8,\n\t16842: 0x5029,\n\t16843: 0x504C,\n\t16844: 0x4FF3,\n\t16845: 0x502C,\n\t16846: 0x500F,\n\t16847: 0x502E,\n\t16848: 0x502D,\n\t16849: 0x4FFE,\n\t16850: 0x501C,\n\t16851: 0x500C,\n\t16852: 0x5025,\n\t16853: 0x5028,\n\t16854: 0x507E,\n\t16855: 0x5043,\n\t16856: 0x5055,\n\t16857: 0x5048,\n\t16858: 0x504E,\n\t16859: 0x506C,\n\t16860: 0x507B,\n\t16861: 0x50A5,\n\t16862: 0x50A7,\n\t16863: 0x50A9,\n\t16864: 0x50BA,\n\t16865: 0x50D6,\n\t16866: 0x5106,\n\t16867: 0x50ED,\n\t16868: 0x50EC,\n\t16869: 0x50E6,\n\t16870: 0x50EE,\n\t16871: 0x5107,\n\t16872: 0x510B,\n\t16873: 0x4EDD,\n\t16874: 0x6C3D,\n\t16875: 0x4F58,\n\t16876: 0x4F65,\n\t16877: 0x4FCE,\n\t16878: 0x9FA0,\n\t16879: 0x6C46,\n\t16880: 0x7C74,\n\t16881: 0x516E,\n\t16882: 0x5DFD,\n\t16883: 0x9EC9,\n\t16884: 0x9998,\n\t16885: 0x5181,\n\t16886: 0x5914,\n\t16887: 0x52F9,\n\t16888: 0x530D,\n\t16889: 0x8A07,\n\t16890: 0x5310,\n\t16891: 0x51EB,\n\t16892: 0x5919,\n\t16893: 0x5155,\n\t16894: 0x4EA0,\n\t16895: 0x5156,\n\t16896: 0x4EB3,\n\t16897: 0x886E,\n\t16898: 0x88A4,\n\t16899: 0x4EB5,\n\t16900: 0x8114,\n\t16901: 0x88D2,\n\t16902: 0x7980,\n\t16903: 0x5B34,\n\t16904: 0x8803,\n\t16905: 0x7FB8,\n\t16906: 0x51AB,\n\t16907: 0x51B1,\n\t16908: 0x51BD,\n\t16909: 0x51BC,\n\t16910: 0x8D0E,\n\t16911: 0x8D0F,\n\t16912: 0x8D10,\n\t16913: 0x8D11,\n\t16914: 0x8D12,\n\t16915: 0x8D13,\n\t16916: 0x8D14,\n\t16917: 0x8D15,\n\t16918: 0x8D16,\n\t16919: 0x8D17,\n\t16920: 0x8D18,\n\t16921: 0x8D19,\n\t16922: 0x8D1A,\n\t16923: 0x8D1B,\n\t16924: 0x8D1C,\n\t16925: 0x8D20,\n\t16926: 0x8D51,\n\t16927: 0x8D52,\n\t16928: 0x8D57,\n\t16929: 0x8D5F,\n\t16930: 0x8D65,\n\t16931: 0x8D68,\n\t16932: 0x8D69,\n\t16933: 0x8D6A,\n\t16934: 0x8D6C,\n\t16935: 0x8D6E,\n\t16936: 0x8D6F,\n\t16937: 0x8D71,\n\t16938: 0x8D72,\n\t16939: 0x8D78,\n\t16940: 0x8D79,\n\t16941: 0x8D7A,\n\t16942: 0x8D7B,\n\t16943: 0x8D7C,\n\t16944: 0x8D7D,\n\t16945: 0x8D7E,\n\t16946: 0x8D7F,\n\t16947: 0x8D80,\n\t16948: 0x8D82,\n\t16949: 0x8D83,\n\t16950: 0x8D86,\n\t16951: 0x8D87,\n\t16952: 0x8D88,\n\t16953: 0x8D89,\n\t16954: 0x8D8C,\n\t16955: 0x8D8D,\n\t16956: 0x8D8E,\n\t16957: 0x8D8F,\n\t16958: 0x8D90,\n\t16959: 0x8D92,\n\t16960: 0x8D93,\n\t16961: 0x8D95,\n\t16962: 0x8D96,\n\t16963: 0x8D97,\n\t16964: 0x8D98,\n\t16965: 0x8D99,\n\t16966: 0x8D9A,\n\t16967: 0x8D9B,\n\t16968: 0x8D9C,\n\t16969: 0x8D9D,\n\t16970: 0x8D9E,\n\t16971: 0x8DA0,\n\t16972: 0x8DA1,\n\t16973: 0x8DA2,\n\t16974: 0x8DA4,\n\t16975: 0x8DA5,\n\t16976: 0x8DA6,\n\t16977: 0x8DA7,\n\t16978: 0x8DA8,\n\t16979: 0x8DA9,\n\t16980: 0x8DAA,\n\t16981: 0x8DAB,\n\t16982: 0x8DAC,\n\t16983: 0x8DAD,\n\t16984: 0x8DAE,\n\t16985: 0x8DAF,\n\t16986: 0x8DB0,\n\t16987: 0x8DB2,\n\t16988: 0x8DB6,\n\t16989: 0x8DB7,\n\t16990: 0x8DB9,\n\t16991: 0x8DBB,\n\t16992: 0x8DBD,\n\t16993: 0x8DC0,\n\t16994: 0x8DC1,\n\t16995: 0x8DC2,\n\t16996: 0x8DC5,\n\t16997: 0x8DC7,\n\t16998: 0x8DC8,\n\t16999: 0x8DC9,\n\t17000: 0x8DCA,\n\t17001: 0x8DCD,\n\t17002: 0x8DD0,\n\t17003: 0x8DD2,\n\t17004: 0x8DD3,\n\t17005: 0x8DD4,\n\t17006: 0x51C7,\n\t17007: 0x5196,\n\t17008: 0x51A2,\n\t17009: 0x51A5,\n\t17010: 0x8BA0,\n\t17011: 0x8BA6,\n\t17012: 0x8BA7,\n\t17013: 0x8BAA,\n\t17014: 0x8BB4,\n\t17015: 0x8BB5,\n\t17016: 0x8BB7,\n\t17017: 0x8BC2,\n\t17018: 0x8BC3,\n\t17019: 0x8BCB,\n\t17020: 0x8BCF,\n\t17021: 0x8BCE,\n\t17022: 0x8BD2,\n\t17023: 0x8BD3,\n\t17024: 0x8BD4,\n\t17025: 0x8BD6,\n\t17026: 0x8BD8,\n\t17027: 0x8BD9,\n\t17028: 0x8BDC,\n\t17029: 0x8BDF,\n\t17030: 0x8BE0,\n\t17031: 0x8BE4,\n\t17032: 0x8BE8,\n\t17033: 0x8BE9,\n\t17034: 0x8BEE,\n\t17035: 0x8BF0,\n\t17036: 0x8BF3,\n\t17037: 0x8BF6,\n\t17038: 0x8BF9,\n\t17039: 0x8BFC,\n\t17040: 0x8BFF,\n\t17041: 0x8C00,\n\t17042: 0x8C02,\n\t17043: 0x8C04,\n\t17044: 0x8C07,\n\t17045: 0x8C0C,\n\t17046: 0x8C0F,\n\t17047: 0x8C11,\n\t17048: 0x8C12,\n\t17049: 0x8C14,\n\t17050: 0x8C15,\n\t17051: 0x8C16,\n\t17052: 0x8C19,\n\t17053: 0x8C1B,\n\t17054: 0x8C18,\n\t17055: 0x8C1D,\n\t17056: 0x8C1F,\n\t17057: 0x8C20,\n\t17058: 0x8C21,\n\t17059: 0x8C25,\n\t17060: 0x8C27,\n\t17061: 0x8C2A,\n\t17062: 0x8C2B,\n\t17063: 0x8C2E,\n\t17064: 0x8C2F,\n\t17065: 0x8C32,\n\t17066: 0x8C33,\n\t17067: 0x8C35,\n\t17068: 0x8C36,\n\t17069: 0x5369,\n\t17070: 0x537A,\n\t17071: 0x961D,\n\t17072: 0x9622,\n\t17073: 0x9621,\n\t17074: 0x9631,\n\t17075: 0x962A,\n\t17076: 0x963D,\n\t17077: 0x963C,\n\t17078: 0x9642,\n\t17079: 0x9649,\n\t17080: 0x9654,\n\t17081: 0x965F,\n\t17082: 0x9667,\n\t17083: 0x966C,\n\t17084: 0x9672,\n\t17085: 0x9674,\n\t17086: 0x9688,\n\t17087: 0x968D,\n\t17088: 0x9697,\n\t17089: 0x96B0,\n\t17090: 0x9097,\n\t17091: 0x909B,\n\t17092: 0x909D,\n\t17093: 0x9099,\n\t17094: 0x90AC,\n\t17095: 0x90A1,\n\t17096: 0x90B4,\n\t17097: 0x90B3,\n\t17098: 0x90B6,\n\t17099: 0x90BA,\n\t17100: 0x8DD5,\n\t17101: 0x8DD8,\n\t17102: 0x8DD9,\n\t17103: 0x8DDC,\n\t17104: 0x8DE0,\n\t17105: 0x8DE1,\n\t17106: 0x8DE2,\n\t17107: 0x8DE5,\n\t17108: 0x8DE6,\n\t17109: 0x8DE7,\n\t17110: 0x8DE9,\n\t17111: 0x8DED,\n\t17112: 0x8DEE,\n\t17113: 0x8DF0,\n\t17114: 0x8DF1,\n\t17115: 0x8DF2,\n\t17116: 0x8DF4,\n\t17117: 0x8DF6,\n\t17118: 0x8DFC,\n\t17119: 0x8DFE,\n\t17120: 0x8DFF,\n\t17121: 0x8E00,\n\t17122: 0x8E01,\n\t17123: 0x8E02,\n\t17124: 0x8E03,\n\t17125: 0x8E04,\n\t17126: 0x8E06,\n\t17127: 0x8E07,\n\t17128: 0x8E08,\n\t17129: 0x8E0B,\n\t17130: 0x8E0D,\n\t17131: 0x8E0E,\n\t17132: 0x8E10,\n\t17133: 0x8E11,\n\t17134: 0x8E12,\n\t17135: 0x8E13,\n\t17136: 0x8E15,\n\t17137: 0x8E16,\n\t17138: 0x8E17,\n\t17139: 0x8E18,\n\t17140: 0x8E19,\n\t17141: 0x8E1A,\n\t17142: 0x8E1B,\n\t17143: 0x8E1C,\n\t17144: 0x8E20,\n\t17145: 0x8E21,\n\t17146: 0x8E24,\n\t17147: 0x8E25,\n\t17148: 0x8E26,\n\t17149: 0x8E27,\n\t17150: 0x8E28,\n\t17151: 0x8E2B,\n\t17152: 0x8E2D,\n\t17153: 0x8E30,\n\t17154: 0x8E32,\n\t17155: 0x8E33,\n\t17156: 0x8E34,\n\t17157: 0x8E36,\n\t17158: 0x8E37,\n\t17159: 0x8E38,\n\t17160: 0x8E3B,\n\t17161: 0x8E3C,\n\t17162: 0x8E3E,\n\t17163: 0x8E3F,\n\t17164: 0x8E43,\n\t17165: 0x8E45,\n\t17166: 0x8E46,\n\t17167: 0x8E4C,\n\t17168: 0x8E4D,\n\t17169: 0x8E4E,\n\t17170: 0x8E4F,\n\t17171: 0x8E50,\n\t17172: 0x8E53,\n\t17173: 0x8E54,\n\t17174: 0x8E55,\n\t17175: 0x8E56,\n\t17176: 0x8E57,\n\t17177: 0x8E58,\n\t17178: 0x8E5A,\n\t17179: 0x8E5B,\n\t17180: 0x8E5C,\n\t17181: 0x8E5D,\n\t17182: 0x8E5E,\n\t17183: 0x8E5F,\n\t17184: 0x8E60,\n\t17185: 0x8E61,\n\t17186: 0x8E62,\n\t17187: 0x8E63,\n\t17188: 0x8E64,\n\t17189: 0x8E65,\n\t17190: 0x8E67,\n\t17191: 0x8E68,\n\t17192: 0x8E6A,\n\t17193: 0x8E6B,\n\t17194: 0x8E6E,\n\t17195: 0x8E71,\n\t17196: 0x90B8,\n\t17197: 0x90B0,\n\t17198: 0x90CF,\n\t17199: 0x90C5,\n\t17200: 0x90BE,\n\t17201: 0x90D0,\n\t17202: 0x90C4,\n\t17203: 0x90C7,\n\t17204: 0x90D3,\n\t17205: 0x90E6,\n\t17206: 0x90E2,\n\t17207: 0x90DC,\n\t17208: 0x90D7,\n\t17209: 0x90DB,\n\t17210: 0x90EB,\n\t17211: 0x90EF,\n\t17212: 0x90FE,\n\t17213: 0x9104,\n\t17214: 0x9122,\n\t17215: 0x911E,\n\t17216: 0x9123,\n\t17217: 0x9131,\n\t17218: 0x912F,\n\t17219: 0x9139,\n\t17220: 0x9143,\n\t17221: 0x9146,\n\t17222: 0x520D,\n\t17223: 0x5942,\n\t17224: 0x52A2,\n\t17225: 0x52AC,\n\t17226: 0x52AD,\n\t17227: 0x52BE,\n\t17228: 0x54FF,\n\t17229: 0x52D0,\n\t17230: 0x52D6,\n\t17231: 0x52F0,\n\t17232: 0x53DF,\n\t17233: 0x71EE,\n\t17234: 0x77CD,\n\t17235: 0x5EF4,\n\t17236: 0x51F5,\n\t17237: 0x51FC,\n\t17238: 0x9B2F,\n\t17239: 0x53B6,\n\t17240: 0x5F01,\n\t17241: 0x755A,\n\t17242: 0x5DEF,\n\t17243: 0x574C,\n\t17244: 0x57A9,\n\t17245: 0x57A1,\n\t17246: 0x587E,\n\t17247: 0x58BC,\n\t17248: 0x58C5,\n\t17249: 0x58D1,\n\t17250: 0x5729,\n\t17251: 0x572C,\n\t17252: 0x572A,\n\t17253: 0x5733,\n\t17254: 0x5739,\n\t17255: 0x572E,\n\t17256: 0x572F,\n\t17257: 0x575C,\n\t17258: 0x573B,\n\t17259: 0x5742,\n\t17260: 0x5769,\n\t17261: 0x5785,\n\t17262: 0x576B,\n\t17263: 0x5786,\n\t17264: 0x577C,\n\t17265: 0x577B,\n\t17266: 0x5768,\n\t17267: 0x576D,\n\t17268: 0x5776,\n\t17269: 0x5773,\n\t17270: 0x57AD,\n\t17271: 0x57A4,\n\t17272: 0x578C,\n\t17273: 0x57B2,\n\t17274: 0x57CF,\n\t17275: 0x57A7,\n\t17276: 0x57B4,\n\t17277: 0x5793,\n\t17278: 0x57A0,\n\t17279: 0x57D5,\n\t17280: 0x57D8,\n\t17281: 0x57DA,\n\t17282: 0x57D9,\n\t17283: 0x57D2,\n\t17284: 0x57B8,\n\t17285: 0x57F4,\n\t17286: 0x57EF,\n\t17287: 0x57F8,\n\t17288: 0x57E4,\n\t17289: 0x57DD,\n\t17290: 0x8E73,\n\t17291: 0x8E75,\n\t17292: 0x8E77,\n\t17293: 0x8E78,\n\t17294: 0x8E79,\n\t17295: 0x8E7A,\n\t17296: 0x8E7B,\n\t17297: 0x8E7D,\n\t17298: 0x8E7E,\n\t17299: 0x8E80,\n\t17300: 0x8E82,\n\t17301: 0x8E83,\n\t17302: 0x8E84,\n\t17303: 0x8E86,\n\t17304: 0x8E88,\n\t17305: 0x8E89,\n\t17306: 0x8E8A,\n\t17307: 0x8E8B,\n\t17308: 0x8E8C,\n\t17309: 0x8E8D,\n\t17310: 0x8E8E,\n\t17311: 0x8E91,\n\t17312: 0x8E92,\n\t17313: 0x8E93,\n\t17314: 0x8E95,\n\t17315: 0x8E96,\n\t17316: 0x8E97,\n\t17317: 0x8E98,\n\t17318: 0x8E99,\n\t17319: 0x8E9A,\n\t17320: 0x8E9B,\n\t17321: 0x8E9D,\n\t17322: 0x8E9F,\n\t17323: 0x8EA0,\n\t17324: 0x8EA1,\n\t17325: 0x8EA2,\n\t17326: 0x8EA3,\n\t17327: 0x8EA4,\n\t17328: 0x8EA5,\n\t17329: 0x8EA6,\n\t17330: 0x8EA7,\n\t17331: 0x8EA8,\n\t17332: 0x8EA9,\n\t17333: 0x8EAA,\n\t17334: 0x8EAD,\n\t17335: 0x8EAE,\n\t17336: 0x8EB0,\n\t17337: 0x8EB1,\n\t17338: 0x8EB3,\n\t17339: 0x8EB4,\n\t17340: 0x8EB5,\n\t17341: 0x8EB6,\n\t17342: 0x8EB7,\n\t17343: 0x8EB8,\n\t17344: 0x8EB9,\n\t17345: 0x8EBB,\n\t17346: 0x8EBC,\n\t17347: 0x8EBD,\n\t17348: 0x8EBE,\n\t17349: 0x8EBF,\n\t17350: 0x8EC0,\n\t17351: 0x8EC1,\n\t17352: 0x8EC2,\n\t17353: 0x8EC3,\n\t17354: 0x8EC4,\n\t17355: 0x8EC5,\n\t17356: 0x8EC6,\n\t17357: 0x8EC7,\n\t17358: 0x8EC8,\n\t17359: 0x8EC9,\n\t17360: 0x8ECA,\n\t17361: 0x8ECB,\n\t17362: 0x8ECC,\n\t17363: 0x8ECD,\n\t17364: 0x8ECF,\n\t17365: 0x8ED0,\n\t17366: 0x8ED1,\n\t17367: 0x8ED2,\n\t17368: 0x8ED3,\n\t17369: 0x8ED4,\n\t17370: 0x8ED5,\n\t17371: 0x8ED6,\n\t17372: 0x8ED7,\n\t17373: 0x8ED8,\n\t17374: 0x8ED9,\n\t17375: 0x8EDA,\n\t17376: 0x8EDB,\n\t17377: 0x8EDC,\n\t17378: 0x8EDD,\n\t17379: 0x8EDE,\n\t17380: 0x8EDF,\n\t17381: 0x8EE0,\n\t17382: 0x8EE1,\n\t17383: 0x8EE2,\n\t17384: 0x8EE3,\n\t17385: 0x8EE4,\n\t17386: 0x580B,\n\t17387: 0x580D,\n\t17388: 0x57FD,\n\t17389: 0x57ED,\n\t17390: 0x5800,\n\t17391: 0x581E,\n\t17392: 0x5819,\n\t17393: 0x5844,\n\t17394: 0x5820,\n\t17395: 0x5865,\n\t17396: 0x586C,\n\t17397: 0x5881,\n\t17398: 0x5889,\n\t17399: 0x589A,\n\t17400: 0x5880,\n\t17401: 0x99A8,\n\t17402: 0x9F19,\n\t17403: 0x61FF,\n\t17404: 0x8279,\n\t17405: 0x827D,\n\t17406: 0x827F,\n\t17407: 0x828F,\n\t17408: 0x828A,\n\t17409: 0x82A8,\n\t17410: 0x8284,\n\t17411: 0x828E,\n\t17412: 0x8291,\n\t17413: 0x8297,\n\t17414: 0x8299,\n\t17415: 0x82AB,\n\t17416: 0x82B8,\n\t17417: 0x82BE,\n\t17418: 0x82B0,\n\t17419: 0x82C8,\n\t17420: 0x82CA,\n\t17421: 0x82E3,\n\t17422: 0x8298,\n\t17423: 0x82B7,\n\t17424: 0x82AE,\n\t17425: 0x82CB,\n\t17426: 0x82CC,\n\t17427: 0x82C1,\n\t17428: 0x82A9,\n\t17429: 0x82B4,\n\t17430: 0x82A1,\n\t17431: 0x82AA,\n\t17432: 0x829F,\n\t17433: 0x82C4,\n\t17434: 0x82CE,\n\t17435: 0x82A4,\n\t17436: 0x82E1,\n\t17437: 0x8309,\n\t17438: 0x82F7,\n\t17439: 0x82E4,\n\t17440: 0x830F,\n\t17441: 0x8307,\n\t17442: 0x82DC,\n\t17443: 0x82F4,\n\t17444: 0x82D2,\n\t17445: 0x82D8,\n\t17446: 0x830C,\n\t17447: 0x82FB,\n\t17448: 0x82D3,\n\t17449: 0x8311,\n\t17450: 0x831A,\n\t17451: 0x8306,\n\t17452: 0x8314,\n\t17453: 0x8315,\n\t17454: 0x82E0,\n\t17455: 0x82D5,\n\t17456: 0x831C,\n\t17457: 0x8351,\n\t17458: 0x835B,\n\t17459: 0x835C,\n\t17460: 0x8308,\n\t17461: 0x8392,\n\t17462: 0x833C,\n\t17463: 0x8334,\n\t17464: 0x8331,\n\t17465: 0x839B,\n\t17466: 0x835E,\n\t17467: 0x832F,\n\t17468: 0x834F,\n\t17469: 0x8347,\n\t17470: 0x8343,\n\t17471: 0x835F,\n\t17472: 0x8340,\n\t17473: 0x8317,\n\t17474: 0x8360,\n\t17475: 0x832D,\n\t17476: 0x833A,\n\t17477: 0x8333,\n\t17478: 0x8366,\n\t17479: 0x8365,\n\t17480: 0x8EE5,\n\t17481: 0x8EE6,\n\t17482: 0x8EE7,\n\t17483: 0x8EE8,\n\t17484: 0x8EE9,\n\t17485: 0x8EEA,\n\t17486: 0x8EEB,\n\t17487: 0x8EEC,\n\t17488: 0x8EED,\n\t17489: 0x8EEE,\n\t17490: 0x8EEF,\n\t17491: 0x8EF0,\n\t17492: 0x8EF1,\n\t17493: 0x8EF2,\n\t17494: 0x8EF3,\n\t17495: 0x8EF4,\n\t17496: 0x8EF5,\n\t17497: 0x8EF6,\n\t17498: 0x8EF7,\n\t17499: 0x8EF8,\n\t17500: 0x8EF9,\n\t17501: 0x8EFA,\n\t17502: 0x8EFB,\n\t17503: 0x8EFC,\n\t17504: 0x8EFD,\n\t17505: 0x8EFE,\n\t17506: 0x8EFF,\n\t17507: 0x8F00,\n\t17508: 0x8F01,\n\t17509: 0x8F02,\n\t17510: 0x8F03,\n\t17511: 0x8F04,\n\t17512: 0x8F05,\n\t17513: 0x8F06,\n\t17514: 0x8F07,\n\t17515: 0x8F08,\n\t17516: 0x8F09,\n\t17517: 0x8F0A,\n\t17518: 0x8F0B,\n\t17519: 0x8F0C,\n\t17520: 0x8F0D,\n\t17521: 0x8F0E,\n\t17522: 0x8F0F,\n\t17523: 0x8F10,\n\t17524: 0x8F11,\n\t17525: 0x8F12,\n\t17526: 0x8F13,\n\t17527: 0x8F14,\n\t17528: 0x8F15,\n\t17529: 0x8F16,\n\t17530: 0x8F17,\n\t17531: 0x8F18,\n\t17532: 0x8F19,\n\t17533: 0x8F1A,\n\t17534: 0x8F1B,\n\t17535: 0x8F1C,\n\t17536: 0x8F1D,\n\t17537: 0x8F1E,\n\t17538: 0x8F1F,\n\t17539: 0x8F20,\n\t17540: 0x8F21,\n\t17541: 0x8F22,\n\t17542: 0x8F23,\n\t17543: 0x8F24,\n\t17544: 0x8F25,\n\t17545: 0x8F26,\n\t17546: 0x8F27,\n\t17547: 0x8F28,\n\t17548: 0x8F29,\n\t17549: 0x8F2A,\n\t17550: 0x8F2B,\n\t17551: 0x8F2C,\n\t17552: 0x8F2D,\n\t17553: 0x8F2E,\n\t17554: 0x8F2F,\n\t17555: 0x8F30,\n\t17556: 0x8F31,\n\t17557: 0x8F32,\n\t17558: 0x8F33,\n\t17559: 0x8F34,\n\t17560: 0x8F35,\n\t17561: 0x8F36,\n\t17562: 0x8F37,\n\t17563: 0x8F38,\n\t17564: 0x8F39,\n\t17565: 0x8F3A,\n\t17566: 0x8F3B,\n\t17567: 0x8F3C,\n\t17568: 0x8F3D,\n\t17569: 0x8F3E,\n\t17570: 0x8F3F,\n\t17571: 0x8F40,\n\t17572: 0x8F41,\n\t17573: 0x8F42,\n\t17574: 0x8F43,\n\t17575: 0x8F44,\n\t17576: 0x8368,\n\t17577: 0x831B,\n\t17578: 0x8369,\n\t17579: 0x836C,\n\t17580: 0x836A,\n\t17581: 0x836D,\n\t17582: 0x836E,\n\t17583: 0x83B0,\n\t17584: 0x8378,\n\t17585: 0x83B3,\n\t17586: 0x83B4,\n\t17587: 0x83A0,\n\t17588: 0x83AA,\n\t17589: 0x8393,\n\t17590: 0x839C,\n\t17591: 0x8385,\n\t17592: 0x837C,\n\t17593: 0x83B6,\n\t17594: 0x83A9,\n\t17595: 0x837D,\n\t17596: 0x83B8,\n\t17597: 0x837B,\n\t17598: 0x8398,\n\t17599: 0x839E,\n\t17600: 0x83A8,\n\t17601: 0x83BA,\n\t17602: 0x83BC,\n\t17603: 0x83C1,\n\t17604: 0x8401,\n\t17605: 0x83E5,\n\t17606: 0x83D8,\n\t17607: 0x5807,\n\t17608: 0x8418,\n\t17609: 0x840B,\n\t17610: 0x83DD,\n\t17611: 0x83FD,\n\t17612: 0x83D6,\n\t17613: 0x841C,\n\t17614: 0x8438,\n\t17615: 0x8411,\n\t17616: 0x8406,\n\t17617: 0x83D4,\n\t17618: 0x83DF,\n\t17619: 0x840F,\n\t17620: 0x8403,\n\t17621: 0x83F8,\n\t17622: 0x83F9,\n\t17623: 0x83EA,\n\t17624: 0x83C5,\n\t17625: 0x83C0,\n\t17626: 0x8426,\n\t17627: 0x83F0,\n\t17628: 0x83E1,\n\t17629: 0x845C,\n\t17630: 0x8451,\n\t17631: 0x845A,\n\t17632: 0x8459,\n\t17633: 0x8473,\n\t17634: 0x8487,\n\t17635: 0x8488,\n\t17636: 0x847A,\n\t17637: 0x8489,\n\t17638: 0x8478,\n\t17639: 0x843C,\n\t17640: 0x8446,\n\t17641: 0x8469,\n\t17642: 0x8476,\n\t17643: 0x848C,\n\t17644: 0x848E,\n\t17645: 0x8431,\n\t17646: 0x846D,\n\t17647: 0x84C1,\n\t17648: 0x84CD,\n\t17649: 0x84D0,\n\t17650: 0x84E6,\n\t17651: 0x84BD,\n\t17652: 0x84D3,\n\t17653: 0x84CA,\n\t17654: 0x84BF,\n\t17655: 0x84BA,\n\t17656: 0x84E0,\n\t17657: 0x84A1,\n\t17658: 0x84B9,\n\t17659: 0x84B4,\n\t17660: 0x8497,\n\t17661: 0x84E5,\n\t17662: 0x84E3,\n\t17663: 0x850C,\n\t17664: 0x750D,\n\t17665: 0x8538,\n\t17666: 0x84F0,\n\t17667: 0x8539,\n\t17668: 0x851F,\n\t17669: 0x853A,\n\t17670: 0x8F45,\n\t17671: 0x8F46,\n\t17672: 0x8F47,\n\t17673: 0x8F48,\n\t17674: 0x8F49,\n\t17675: 0x8F4A,\n\t17676: 0x8F4B,\n\t17677: 0x8F4C,\n\t17678: 0x8F4D,\n\t17679: 0x8F4E,\n\t17680: 0x8F4F,\n\t17681: 0x8F50,\n\t17682: 0x8F51,\n\t17683: 0x8F52,\n\t17684: 0x8F53,\n\t17685: 0x8F54,\n\t17686: 0x8F55,\n\t17687: 0x8F56,\n\t17688: 0x8F57,\n\t17689: 0x8F58,\n\t17690: 0x8F59,\n\t17691: 0x8F5A,\n\t17692: 0x8F5B,\n\t17693: 0x8F5C,\n\t17694: 0x8F5D,\n\t17695: 0x8F5E,\n\t17696: 0x8F5F,\n\t17697: 0x8F60,\n\t17698: 0x8F61,\n\t17699: 0x8F62,\n\t17700: 0x8F63,\n\t17701: 0x8F64,\n\t17702: 0x8F65,\n\t17703: 0x8F6A,\n\t17704: 0x8F80,\n\t17705: 0x8F8C,\n\t17706: 0x8F92,\n\t17707: 0x8F9D,\n\t17708: 0x8FA0,\n\t17709: 0x8FA1,\n\t17710: 0x8FA2,\n\t17711: 0x8FA4,\n\t17712: 0x8FA5,\n\t17713: 0x8FA6,\n\t17714: 0x8FA7,\n\t17715: 0x8FAA,\n\t17716: 0x8FAC,\n\t17717: 0x8FAD,\n\t17718: 0x8FAE,\n\t17719: 0x8FAF,\n\t17720: 0x8FB2,\n\t17721: 0x8FB3,\n\t17722: 0x8FB4,\n\t17723: 0x8FB5,\n\t17724: 0x8FB7,\n\t17725: 0x8FB8,\n\t17726: 0x8FBA,\n\t17727: 0x8FBB,\n\t17728: 0x8FBC,\n\t17729: 0x8FBF,\n\t17730: 0x8FC0,\n\t17731: 0x8FC3,\n\t17732: 0x8FC6,\n\t17733: 0x8FC9,\n\t17734: 0x8FCA,\n\t17735: 0x8FCB,\n\t17736: 0x8FCC,\n\t17737: 0x8FCD,\n\t17738: 0x8FCF,\n\t17739: 0x8FD2,\n\t17740: 0x8FD6,\n\t17741: 0x8FD7,\n\t17742: 0x8FDA,\n\t17743: 0x8FE0,\n\t17744: 0x8FE1,\n\t17745: 0x8FE3,\n\t17746: 0x8FE7,\n\t17747: 0x8FEC,\n\t17748: 0x8FEF,\n\t17749: 0x8FF1,\n\t17750: 0x8FF2,\n\t17751: 0x8FF4,\n\t17752: 0x8FF5,\n\t17753: 0x8FF6,\n\t17754: 0x8FFA,\n\t17755: 0x8FFB,\n\t17756: 0x8FFC,\n\t17757: 0x8FFE,\n\t17758: 0x8FFF,\n\t17759: 0x9007,\n\t17760: 0x9008,\n\t17761: 0x900C,\n\t17762: 0x900E,\n\t17763: 0x9013,\n\t17764: 0x9015,\n\t17765: 0x9018,\n\t17766: 0x8556,\n\t17767: 0x853B,\n\t17768: 0x84FF,\n\t17769: 0x84FC,\n\t17770: 0x8559,\n\t17771: 0x8548,\n\t17772: 0x8568,\n\t17773: 0x8564,\n\t17774: 0x855E,\n\t17775: 0x857A,\n\t17776: 0x77A2,\n\t17777: 0x8543,\n\t17778: 0x8572,\n\t17779: 0x857B,\n\t17780: 0x85A4,\n\t17781: 0x85A8,\n\t17782: 0x8587,\n\t17783: 0x858F,\n\t17784: 0x8579,\n\t17785: 0x85AE,\n\t17786: 0x859C,\n\t17787: 0x8585,\n\t17788: 0x85B9,\n\t17789: 0x85B7,\n\t17790: 0x85B0,\n\t17791: 0x85D3,\n\t17792: 0x85C1,\n\t17793: 0x85DC,\n\t17794: 0x85FF,\n\t17795: 0x8627,\n\t17796: 0x8605,\n\t17797: 0x8629,\n\t17798: 0x8616,\n\t17799: 0x863C,\n\t17800: 0x5EFE,\n\t17801: 0x5F08,\n\t17802: 0x593C,\n\t17803: 0x5941,\n\t17804: 0x8037,\n\t17805: 0x5955,\n\t17806: 0x595A,\n\t17807: 0x5958,\n\t17808: 0x530F,\n\t17809: 0x5C22,\n\t17810: 0x5C25,\n\t17811: 0x5C2C,\n\t17812: 0x5C34,\n\t17813: 0x624C,\n\t17814: 0x626A,\n\t17815: 0x629F,\n\t17816: 0x62BB,\n\t17817: 0x62CA,\n\t17818: 0x62DA,\n\t17819: 0x62D7,\n\t17820: 0x62EE,\n\t17821: 0x6322,\n\t17822: 0x62F6,\n\t17823: 0x6339,\n\t17824: 0x634B,\n\t17825: 0x6343,\n\t17826: 0x63AD,\n\t17827: 0x63F6,\n\t17828: 0x6371,\n\t17829: 0x637A,\n\t17830: 0x638E,\n\t17831: 0x63B4,\n\t17832: 0x636D,\n\t17833: 0x63AC,\n\t17834: 0x638A,\n\t17835: 0x6369,\n\t17836: 0x63AE,\n\t17837: 0x63BC,\n\t17838: 0x63F2,\n\t17839: 0x63F8,\n\t17840: 0x63E0,\n\t17841: 0x63FF,\n\t17842: 0x63C4,\n\t17843: 0x63DE,\n\t17844: 0x63CE,\n\t17845: 0x6452,\n\t17846: 0x63C6,\n\t17847: 0x63BE,\n\t17848: 0x6445,\n\t17849: 0x6441,\n\t17850: 0x640B,\n\t17851: 0x641B,\n\t17852: 0x6420,\n\t17853: 0x640C,\n\t17854: 0x6426,\n\t17855: 0x6421,\n\t17856: 0x645E,\n\t17857: 0x6484,\n\t17858: 0x646D,\n\t17859: 0x6496,\n\t17860: 0x9019,\n\t17861: 0x901C,\n\t17862: 0x9023,\n\t17863: 0x9024,\n\t17864: 0x9025,\n\t17865: 0x9027,\n\t17866: 0x9028,\n\t17867: 0x9029,\n\t17868: 0x902A,\n\t17869: 0x902B,\n\t17870: 0x902C,\n\t17871: 0x9030,\n\t17872: 0x9031,\n\t17873: 0x9032,\n\t17874: 0x9033,\n\t17875: 0x9034,\n\t17876: 0x9037,\n\t17877: 0x9039,\n\t17878: 0x903A,\n\t17879: 0x903D,\n\t17880: 0x903F,\n\t17881: 0x9040,\n\t17882: 0x9043,\n\t17883: 0x9045,\n\t17884: 0x9046,\n\t17885: 0x9048,\n\t17886: 0x9049,\n\t17887: 0x904A,\n\t17888: 0x904B,\n\t17889: 0x904C,\n\t17890: 0x904E,\n\t17891: 0x9054,\n\t17892: 0x9055,\n\t17893: 0x9056,\n\t17894: 0x9059,\n\t17895: 0x905A,\n\t17896: 0x905C,\n\t17897: 0x905D,\n\t17898: 0x905E,\n\t17899: 0x905F,\n\t17900: 0x9060,\n\t17901: 0x9061,\n\t17902: 0x9064,\n\t17903: 0x9066,\n\t17904: 0x9067,\n\t17905: 0x9069,\n\t17906: 0x906A,\n\t17907: 0x906B,\n\t17908: 0x906C,\n\t17909: 0x906F,\n\t17910: 0x9070,\n\t17911: 0x9071,\n\t17912: 0x9072,\n\t17913: 0x9073,\n\t17914: 0x9076,\n\t17915: 0x9077,\n\t17916: 0x9078,\n\t17917: 0x9079,\n\t17918: 0x907A,\n\t17919: 0x907B,\n\t17920: 0x907C,\n\t17921: 0x907E,\n\t17922: 0x9081,\n\t17923: 0x9084,\n\t17924: 0x9085,\n\t17925: 0x9086,\n\t17926: 0x9087,\n\t17927: 0x9089,\n\t17928: 0x908A,\n\t17929: 0x908C,\n\t17930: 0x908D,\n\t17931: 0x908E,\n\t17932: 0x908F,\n\t17933: 0x9090,\n\t17934: 0x9092,\n\t17935: 0x9094,\n\t17936: 0x9096,\n\t17937: 0x9098,\n\t17938: 0x909A,\n\t17939: 0x909C,\n\t17940: 0x909E,\n\t17941: 0x909F,\n\t17942: 0x90A0,\n\t17943: 0x90A4,\n\t17944: 0x90A5,\n\t17945: 0x90A7,\n\t17946: 0x90A8,\n\t17947: 0x90A9,\n\t17948: 0x90AB,\n\t17949: 0x90AD,\n\t17950: 0x90B2,\n\t17951: 0x90B7,\n\t17952: 0x90BC,\n\t17953: 0x90BD,\n\t17954: 0x90BF,\n\t17955: 0x90C0,\n\t17956: 0x647A,\n\t17957: 0x64B7,\n\t17958: 0x64B8,\n\t17959: 0x6499,\n\t17960: 0x64BA,\n\t17961: 0x64C0,\n\t17962: 0x64D0,\n\t17963: 0x64D7,\n\t17964: 0x64E4,\n\t17965: 0x64E2,\n\t17966: 0x6509,\n\t17967: 0x6525,\n\t17968: 0x652E,\n\t17969: 0x5F0B,\n\t17970: 0x5FD2,\n\t17971: 0x7519,\n\t17972: 0x5F11,\n\t17973: 0x535F,\n\t17974: 0x53F1,\n\t17975: 0x53FD,\n\t17976: 0x53E9,\n\t17977: 0x53E8,\n\t17978: 0x53FB,\n\t17979: 0x5412,\n\t17980: 0x5416,\n\t17981: 0x5406,\n\t17982: 0x544B,\n\t17983: 0x5452,\n\t17984: 0x5453,\n\t17985: 0x5454,\n\t17986: 0x5456,\n\t17987: 0x5443,\n\t17988: 0x5421,\n\t17989: 0x5457,\n\t17990: 0x5459,\n\t17991: 0x5423,\n\t17992: 0x5432,\n\t17993: 0x5482,\n\t17994: 0x5494,\n\t17995: 0x5477,\n\t17996: 0x5471,\n\t17997: 0x5464,\n\t17998: 0x549A,\n\t17999: 0x549B,\n\t18000: 0x5484,\n\t18001: 0x5476,\n\t18002: 0x5466,\n\t18003: 0x549D,\n\t18004: 0x54D0,\n\t18005: 0x54AD,\n\t18006: 0x54C2,\n\t18007: 0x54B4,\n\t18008: 0x54D2,\n\t18009: 0x54A7,\n\t18010: 0x54A6,\n\t18011: 0x54D3,\n\t18012: 0x54D4,\n\t18013: 0x5472,\n\t18014: 0x54A3,\n\t18015: 0x54D5,\n\t18016: 0x54BB,\n\t18017: 0x54BF,\n\t18018: 0x54CC,\n\t18019: 0x54D9,\n\t18020: 0x54DA,\n\t18021: 0x54DC,\n\t18022: 0x54A9,\n\t18023: 0x54AA,\n\t18024: 0x54A4,\n\t18025: 0x54DD,\n\t18026: 0x54CF,\n\t18027: 0x54DE,\n\t18028: 0x551B,\n\t18029: 0x54E7,\n\t18030: 0x5520,\n\t18031: 0x54FD,\n\t18032: 0x5514,\n\t18033: 0x54F3,\n\t18034: 0x5522,\n\t18035: 0x5523,\n\t18036: 0x550F,\n\t18037: 0x5511,\n\t18038: 0x5527,\n\t18039: 0x552A,\n\t18040: 0x5567,\n\t18041: 0x558F,\n\t18042: 0x55B5,\n\t18043: 0x5549,\n\t18044: 0x556D,\n\t18045: 0x5541,\n\t18046: 0x5555,\n\t18047: 0x553F,\n\t18048: 0x5550,\n\t18049: 0x553C,\n\t18050: 0x90C2,\n\t18051: 0x90C3,\n\t18052: 0x90C6,\n\t18053: 0x90C8,\n\t18054: 0x90C9,\n\t18055: 0x90CB,\n\t18056: 0x90CC,\n\t18057: 0x90CD,\n\t18058: 0x90D2,\n\t18059: 0x90D4,\n\t18060: 0x90D5,\n\t18061: 0x90D6,\n\t18062: 0x90D8,\n\t18063: 0x90D9,\n\t18064: 0x90DA,\n\t18065: 0x90DE,\n\t18066: 0x90DF,\n\t18067: 0x90E0,\n\t18068: 0x90E3,\n\t18069: 0x90E4,\n\t18070: 0x90E5,\n\t18071: 0x90E9,\n\t18072: 0x90EA,\n\t18073: 0x90EC,\n\t18074: 0x90EE,\n\t18075: 0x90F0,\n\t18076: 0x90F1,\n\t18077: 0x90F2,\n\t18078: 0x90F3,\n\t18079: 0x90F5,\n\t18080: 0x90F6,\n\t18081: 0x90F7,\n\t18082: 0x90F9,\n\t18083: 0x90FA,\n\t18084: 0x90FB,\n\t18085: 0x90FC,\n\t18086: 0x90FF,\n\t18087: 0x9100,\n\t18088: 0x9101,\n\t18089: 0x9103,\n\t18090: 0x9105,\n\t18091: 0x9106,\n\t18092: 0x9107,\n\t18093: 0x9108,\n\t18094: 0x9109,\n\t18095: 0x910A,\n\t18096: 0x910B,\n\t18097: 0x910C,\n\t18098: 0x910D,\n\t18099: 0x910E,\n\t18100: 0x910F,\n\t18101: 0x9110,\n\t18102: 0x9111,\n\t18103: 0x9112,\n\t18104: 0x9113,\n\t18105: 0x9114,\n\t18106: 0x9115,\n\t18107: 0x9116,\n\t18108: 0x9117,\n\t18109: 0x9118,\n\t18110: 0x911A,\n\t18111: 0x911B,\n\t18112: 0x911C,\n\t18113: 0x911D,\n\t18114: 0x911F,\n\t18115: 0x9120,\n\t18116: 0x9121,\n\t18117: 0x9124,\n\t18118: 0x9125,\n\t18119: 0x9126,\n\t18120: 0x9127,\n\t18121: 0x9128,\n\t18122: 0x9129,\n\t18123: 0x912A,\n\t18124: 0x912B,\n\t18125: 0x912C,\n\t18126: 0x912D,\n\t18127: 0x912E,\n\t18128: 0x9130,\n\t18129: 0x9132,\n\t18130: 0x9133,\n\t18131: 0x9134,\n\t18132: 0x9135,\n\t18133: 0x9136,\n\t18134: 0x9137,\n\t18135: 0x9138,\n\t18136: 0x913A,\n\t18137: 0x913B,\n\t18138: 0x913C,\n\t18139: 0x913D,\n\t18140: 0x913E,\n\t18141: 0x913F,\n\t18142: 0x9140,\n\t18143: 0x9141,\n\t18144: 0x9142,\n\t18145: 0x9144,\n\t18146: 0x5537,\n\t18147: 0x5556,\n\t18148: 0x5575,\n\t18149: 0x5576,\n\t18150: 0x5577,\n\t18151: 0x5533,\n\t18152: 0x5530,\n\t18153: 0x555C,\n\t18154: 0x558B,\n\t18155: 0x55D2,\n\t18156: 0x5583,\n\t18157: 0x55B1,\n\t18158: 0x55B9,\n\t18159: 0x5588,\n\t18160: 0x5581,\n\t18161: 0x559F,\n\t18162: 0x557E,\n\t18163: 0x55D6,\n\t18164: 0x5591,\n\t18165: 0x557B,\n\t18166: 0x55DF,\n\t18167: 0x55BD,\n\t18168: 0x55BE,\n\t18169: 0x5594,\n\t18170: 0x5599,\n\t18171: 0x55EA,\n\t18172: 0x55F7,\n\t18173: 0x55C9,\n\t18174: 0x561F,\n\t18175: 0x55D1,\n\t18176: 0x55EB,\n\t18177: 0x55EC,\n\t18178: 0x55D4,\n\t18179: 0x55E6,\n\t18180: 0x55DD,\n\t18181: 0x55C4,\n\t18182: 0x55EF,\n\t18183: 0x55E5,\n\t18184: 0x55F2,\n\t18185: 0x55F3,\n\t18186: 0x55CC,\n\t18187: 0x55CD,\n\t18188: 0x55E8,\n\t18189: 0x55F5,\n\t18190: 0x55E4,\n\t18191: 0x8F94,\n\t18192: 0x561E,\n\t18193: 0x5608,\n\t18194: 0x560C,\n\t18195: 0x5601,\n\t18196: 0x5624,\n\t18197: 0x5623,\n\t18198: 0x55FE,\n\t18199: 0x5600,\n\t18200: 0x5627,\n\t18201: 0x562D,\n\t18202: 0x5658,\n\t18203: 0x5639,\n\t18204: 0x5657,\n\t18205: 0x562C,\n\t18206: 0x564D,\n\t18207: 0x5662,\n\t18208: 0x5659,\n\t18209: 0x565C,\n\t18210: 0x564C,\n\t18211: 0x5654,\n\t18212: 0x5686,\n\t18213: 0x5664,\n\t18214: 0x5671,\n\t18215: 0x566B,\n\t18216: 0x567B,\n\t18217: 0x567C,\n\t18218: 0x5685,\n\t18219: 0x5693,\n\t18220: 0x56AF,\n\t18221: 0x56D4,\n\t18222: 0x56D7,\n\t18223: 0x56DD,\n\t18224: 0x56E1,\n\t18225: 0x56F5,\n\t18226: 0x56EB,\n\t18227: 0x56F9,\n\t18228: 0x56FF,\n\t18229: 0x5704,\n\t18230: 0x570A,\n\t18231: 0x5709,\n\t18232: 0x571C,\n\t18233: 0x5E0F,\n\t18234: 0x5E19,\n\t18235: 0x5E14,\n\t18236: 0x5E11,\n\t18237: 0x5E31,\n\t18238: 0x5E3B,\n\t18239: 0x5E3C,\n\t18240: 0x9145,\n\t18241: 0x9147,\n\t18242: 0x9148,\n\t18243: 0x9151,\n\t18244: 0x9153,\n\t18245: 0x9154,\n\t18246: 0x9155,\n\t18247: 0x9156,\n\t18248: 0x9158,\n\t18249: 0x9159,\n\t18250: 0x915B,\n\t18251: 0x915C,\n\t18252: 0x915F,\n\t18253: 0x9160,\n\t18254: 0x9166,\n\t18255: 0x9167,\n\t18256: 0x9168,\n\t18257: 0x916B,\n\t18258: 0x916D,\n\t18259: 0x9173,\n\t18260: 0x917A,\n\t18261: 0x917B,\n\t18262: 0x917C,\n\t18263: 0x9180,\n\t18264: 0x9181,\n\t18265: 0x9182,\n\t18266: 0x9183,\n\t18267: 0x9184,\n\t18268: 0x9186,\n\t18269: 0x9188,\n\t18270: 0x918A,\n\t18271: 0x918E,\n\t18272: 0x918F,\n\t18273: 0x9193,\n\t18274: 0x9194,\n\t18275: 0x9195,\n\t18276: 0x9196,\n\t18277: 0x9197,\n\t18278: 0x9198,\n\t18279: 0x9199,\n\t18280: 0x919C,\n\t18281: 0x919D,\n\t18282: 0x919E,\n\t18283: 0x919F,\n\t18284: 0x91A0,\n\t18285: 0x91A1,\n\t18286: 0x91A4,\n\t18287: 0x91A5,\n\t18288: 0x91A6,\n\t18289: 0x91A7,\n\t18290: 0x91A8,\n\t18291: 0x91A9,\n\t18292: 0x91AB,\n\t18293: 0x91AC,\n\t18294: 0x91B0,\n\t18295: 0x91B1,\n\t18296: 0x91B2,\n\t18297: 0x91B3,\n\t18298: 0x91B6,\n\t18299: 0x91B7,\n\t18300: 0x91B8,\n\t18301: 0x91B9,\n\t18302: 0x91BB,\n\t18303: 0x91BC,\n\t18304: 0x91BD,\n\t18305: 0x91BE,\n\t18306: 0x91BF,\n\t18307: 0x91C0,\n\t18308: 0x91C1,\n\t18309: 0x91C2,\n\t18310: 0x91C3,\n\t18311: 0x91C4,\n\t18312: 0x91C5,\n\t18313: 0x91C6,\n\t18314: 0x91C8,\n\t18315: 0x91CB,\n\t18316: 0x91D0,\n\t18317: 0x91D2,\n\t18318: 0x91D3,\n\t18319: 0x91D4,\n\t18320: 0x91D5,\n\t18321: 0x91D6,\n\t18322: 0x91D7,\n\t18323: 0x91D8,\n\t18324: 0x91D9,\n\t18325: 0x91DA,\n\t18326: 0x91DB,\n\t18327: 0x91DD,\n\t18328: 0x91DE,\n\t18329: 0x91DF,\n\t18330: 0x91E0,\n\t18331: 0x91E1,\n\t18332: 0x91E2,\n\t18333: 0x91E3,\n\t18334: 0x91E4,\n\t18335: 0x91E5,\n\t18336: 0x5E37,\n\t18337: 0x5E44,\n\t18338: 0x5E54,\n\t18339: 0x5E5B,\n\t18340: 0x5E5E,\n\t18341: 0x5E61,\n\t18342: 0x5C8C,\n\t18343: 0x5C7A,\n\t18344: 0x5C8D,\n\t18345: 0x5C90,\n\t18346: 0x5C96,\n\t18347: 0x5C88,\n\t18348: 0x5C98,\n\t18349: 0x5C99,\n\t18350: 0x5C91,\n\t18351: 0x5C9A,\n\t18352: 0x5C9C,\n\t18353: 0x5CB5,\n\t18354: 0x5CA2,\n\t18355: 0x5CBD,\n\t18356: 0x5CAC,\n\t18357: 0x5CAB,\n\t18358: 0x5CB1,\n\t18359: 0x5CA3,\n\t18360: 0x5CC1,\n\t18361: 0x5CB7,\n\t18362: 0x5CC4,\n\t18363: 0x5CD2,\n\t18364: 0x5CE4,\n\t18365: 0x5CCB,\n\t18366: 0x5CE5,\n\t18367: 0x5D02,\n\t18368: 0x5D03,\n\t18369: 0x5D27,\n\t18370: 0x5D26,\n\t18371: 0x5D2E,\n\t18372: 0x5D24,\n\t18373: 0x5D1E,\n\t18374: 0x5D06,\n\t18375: 0x5D1B,\n\t18376: 0x5D58,\n\t18377: 0x5D3E,\n\t18378: 0x5D34,\n\t18379: 0x5D3D,\n\t18380: 0x5D6C,\n\t18381: 0x5D5B,\n\t18382: 0x5D6F,\n\t18383: 0x5D5D,\n\t18384: 0x5D6B,\n\t18385: 0x5D4B,\n\t18386: 0x5D4A,\n\t18387: 0x5D69,\n\t18388: 0x5D74,\n\t18389: 0x5D82,\n\t18390: 0x5D99,\n\t18391: 0x5D9D,\n\t18392: 0x8C73,\n\t18393: 0x5DB7,\n\t18394: 0x5DC5,\n\t18395: 0x5F73,\n\t18396: 0x5F77,\n\t18397: 0x5F82,\n\t18398: 0x5F87,\n\t18399: 0x5F89,\n\t18400: 0x5F8C,\n\t18401: 0x5F95,\n\t18402: 0x5F99,\n\t18403: 0x5F9C,\n\t18404: 0x5FA8,\n\t18405: 0x5FAD,\n\t18406: 0x5FB5,\n\t18407: 0x5FBC,\n\t18408: 0x8862,\n\t18409: 0x5F61,\n\t18410: 0x72AD,\n\t18411: 0x72B0,\n\t18412: 0x72B4,\n\t18413: 0x72B7,\n\t18414: 0x72B8,\n\t18415: 0x72C3,\n\t18416: 0x72C1,\n\t18417: 0x72CE,\n\t18418: 0x72CD,\n\t18419: 0x72D2,\n\t18420: 0x72E8,\n\t18421: 0x72EF,\n\t18422: 0x72E9,\n\t18423: 0x72F2,\n\t18424: 0x72F4,\n\t18425: 0x72F7,\n\t18426: 0x7301,\n\t18427: 0x72F3,\n\t18428: 0x7303,\n\t18429: 0x72FA,\n\t18430: 0x91E6,\n\t18431: 0x91E7,\n\t18432: 0x91E8,\n\t18433: 0x91E9,\n\t18434: 0x91EA,\n\t18435: 0x91EB,\n\t18436: 0x91EC,\n\t18437: 0x91ED,\n\t18438: 0x91EE,\n\t18439: 0x91EF,\n\t18440: 0x91F0,\n\t18441: 0x91F1,\n\t18442: 0x91F2,\n\t18443: 0x91F3,\n\t18444: 0x91F4,\n\t18445: 0x91F5,\n\t18446: 0x91F6,\n\t18447: 0x91F7,\n\t18448: 0x91F8,\n\t18449: 0x91F9,\n\t18450: 0x91FA,\n\t18451: 0x91FB,\n\t18452: 0x91FC,\n\t18453: 0x91FD,\n\t18454: 0x91FE,\n\t18455: 0x91FF,\n\t18456: 0x9200,\n\t18457: 0x9201,\n\t18458: 0x9202,\n\t18459: 0x9203,\n\t18460: 0x9204,\n\t18461: 0x9205,\n\t18462: 0x9206,\n\t18463: 0x9207,\n\t18464: 0x9208,\n\t18465: 0x9209,\n\t18466: 0x920A,\n\t18467: 0x920B,\n\t18468: 0x920C,\n\t18469: 0x920D,\n\t18470: 0x920E,\n\t18471: 0x920F,\n\t18472: 0x9210,\n\t18473: 0x9211,\n\t18474: 0x9212,\n\t18475: 0x9213,\n\t18476: 0x9214,\n\t18477: 0x9215,\n\t18478: 0x9216,\n\t18479: 0x9217,\n\t18480: 0x9218,\n\t18481: 0x9219,\n\t18482: 0x921A,\n\t18483: 0x921B,\n\t18484: 0x921C,\n\t18485: 0x921D,\n\t18486: 0x921E,\n\t18487: 0x921F,\n\t18488: 0x9220,\n\t18489: 0x9221,\n\t18490: 0x9222,\n\t18491: 0x9223,\n\t18492: 0x9224,\n\t18493: 0x9225,\n\t18494: 0x9226,\n\t18495: 0x9227,\n\t18496: 0x9228,\n\t18497: 0x9229,\n\t18498: 0x922A,\n\t18499: 0x922B,\n\t18500: 0x922C,\n\t18501: 0x922D,\n\t18502: 0x922E,\n\t18503: 0x922F,\n\t18504: 0x9230,\n\t18505: 0x9231,\n\t18506: 0x9232,\n\t18507: 0x9233,\n\t18508: 0x9234,\n\t18509: 0x9235,\n\t18510: 0x9236,\n\t18511: 0x9237,\n\t18512: 0x9238,\n\t18513: 0x9239,\n\t18514: 0x923A,\n\t18515: 0x923B,\n\t18516: 0x923C,\n\t18517: 0x923D,\n\t18518: 0x923E,\n\t18519: 0x923F,\n\t18520: 0x9240,\n\t18521: 0x9241,\n\t18522: 0x9242,\n\t18523: 0x9243,\n\t18524: 0x9244,\n\t18525: 0x9245,\n\t18526: 0x72FB,\n\t18527: 0x7317,\n\t18528: 0x7313,\n\t18529: 0x7321,\n\t18530: 0x730A,\n\t18531: 0x731E,\n\t18532: 0x731D,\n\t18533: 0x7315,\n\t18534: 0x7322,\n\t18535: 0x7339,\n\t18536: 0x7325,\n\t18537: 0x732C,\n\t18538: 0x7338,\n\t18539: 0x7331,\n\t18540: 0x7350,\n\t18541: 0x734D,\n\t18542: 0x7357,\n\t18543: 0x7360,\n\t18544: 0x736C,\n\t18545: 0x736F,\n\t18546: 0x737E,\n\t18547: 0x821B,\n\t18548: 0x5925,\n\t18549: 0x98E7,\n\t18550: 0x5924,\n\t18551: 0x5902,\n\t18552: 0x9963,\n\t18553: 0x9967,\n\t18554: 0x9968,\n\t18555: 0x9969,\n\t18556: 0x996A,\n\t18557: 0x996B,\n\t18558: 0x996C,\n\t18559: 0x9974,\n\t18560: 0x9977,\n\t18561: 0x997D,\n\t18562: 0x9980,\n\t18563: 0x9984,\n\t18564: 0x9987,\n\t18565: 0x998A,\n\t18566: 0x998D,\n\t18567: 0x9990,\n\t18568: 0x9991,\n\t18569: 0x9993,\n\t18570: 0x9994,\n\t18571: 0x9995,\n\t18572: 0x5E80,\n\t18573: 0x5E91,\n\t18574: 0x5E8B,\n\t18575: 0x5E96,\n\t18576: 0x5EA5,\n\t18577: 0x5EA0,\n\t18578: 0x5EB9,\n\t18579: 0x5EB5,\n\t18580: 0x5EBE,\n\t18581: 0x5EB3,\n\t18582: 0x8D53,\n\t18583: 0x5ED2,\n\t18584: 0x5ED1,\n\t18585: 0x5EDB,\n\t18586: 0x5EE8,\n\t18587: 0x5EEA,\n\t18588: 0x81BA,\n\t18589: 0x5FC4,\n\t18590: 0x5FC9,\n\t18591: 0x5FD6,\n\t18592: 0x5FCF,\n\t18593: 0x6003,\n\t18594: 0x5FEE,\n\t18595: 0x6004,\n\t18596: 0x5FE1,\n\t18597: 0x5FE4,\n\t18598: 0x5FFE,\n\t18599: 0x6005,\n\t18600: 0x6006,\n\t18601: 0x5FEA,\n\t18602: 0x5FED,\n\t18603: 0x5FF8,\n\t18604: 0x6019,\n\t18605: 0x6035,\n\t18606: 0x6026,\n\t18607: 0x601B,\n\t18608: 0x600F,\n\t18609: 0x600D,\n\t18610: 0x6029,\n\t18611: 0x602B,\n\t18612: 0x600A,\n\t18613: 0x603F,\n\t18614: 0x6021,\n\t18615: 0x6078,\n\t18616: 0x6079,\n\t18617: 0x607B,\n\t18618: 0x607A,\n\t18619: 0x6042,\n\t18620: 0x9246,\n\t18621: 0x9247,\n\t18622: 0x9248,\n\t18623: 0x9249,\n\t18624: 0x924A,\n\t18625: 0x924B,\n\t18626: 0x924C,\n\t18627: 0x924D,\n\t18628: 0x924E,\n\t18629: 0x924F,\n\t18630: 0x9250,\n\t18631: 0x9251,\n\t18632: 0x9252,\n\t18633: 0x9253,\n\t18634: 0x9254,\n\t18635: 0x9255,\n\t18636: 0x9256,\n\t18637: 0x9257,\n\t18638: 0x9258,\n\t18639: 0x9259,\n\t18640: 0x925A,\n\t18641: 0x925B,\n\t18642: 0x925C,\n\t18643: 0x925D,\n\t18644: 0x925E,\n\t18645: 0x925F,\n\t18646: 0x9260,\n\t18647: 0x9261,\n\t18648: 0x9262,\n\t18649: 0x9263,\n\t18650: 0x9264,\n\t18651: 0x9265,\n\t18652: 0x9266,\n\t18653: 0x9267,\n\t18654: 0x9268,\n\t18655: 0x9269,\n\t18656: 0x926A,\n\t18657: 0x926B,\n\t18658: 0x926C,\n\t18659: 0x926D,\n\t18660: 0x926E,\n\t18661: 0x926F,\n\t18662: 0x9270,\n\t18663: 0x9271,\n\t18664: 0x9272,\n\t18665: 0x9273,\n\t18666: 0x9275,\n\t18667: 0x9276,\n\t18668: 0x9277,\n\t18669: 0x9278,\n\t18670: 0x9279,\n\t18671: 0x927A,\n\t18672: 0x927B,\n\t18673: 0x927C,\n\t18674: 0x927D,\n\t18675: 0x927E,\n\t18676: 0x927F,\n\t18677: 0x9280,\n\t18678: 0x9281,\n\t18679: 0x9282,\n\t18680: 0x9283,\n\t18681: 0x9284,\n\t18682: 0x9285,\n\t18683: 0x9286,\n\t18684: 0x9287,\n\t18685: 0x9288,\n\t18686: 0x9289,\n\t18687: 0x928A,\n\t18688: 0x928B,\n\t18689: 0x928C,\n\t18690: 0x928D,\n\t18691: 0x928F,\n\t18692: 0x9290,\n\t18693: 0x9291,\n\t18694: 0x9292,\n\t18695: 0x9293,\n\t18696: 0x9294,\n\t18697: 0x9295,\n\t18698: 0x9296,\n\t18699: 0x9297,\n\t18700: 0x9298,\n\t18701: 0x9299,\n\t18702: 0x929A,\n\t18703: 0x929B,\n\t18704: 0x929C,\n\t18705: 0x929D,\n\t18706: 0x929E,\n\t18707: 0x929F,\n\t18708: 0x92A0,\n\t18709: 0x92A1,\n\t18710: 0x92A2,\n\t18711: 0x92A3,\n\t18712: 0x92A4,\n\t18713: 0x92A5,\n\t18714: 0x92A6,\n\t18715: 0x92A7,\n\t18716: 0x606A,\n\t18717: 0x607D,\n\t18718: 0x6096,\n\t18719: 0x609A,\n\t18720: 0x60AD,\n\t18721: 0x609D,\n\t18722: 0x6083,\n\t18723: 0x6092,\n\t18724: 0x608C,\n\t18725: 0x609B,\n\t18726: 0x60EC,\n\t18727: 0x60BB,\n\t18728: 0x60B1,\n\t18729: 0x60DD,\n\t18730: 0x60D8,\n\t18731: 0x60C6,\n\t18732: 0x60DA,\n\t18733: 0x60B4,\n\t18734: 0x6120,\n\t18735: 0x6126,\n\t18736: 0x6115,\n\t18737: 0x6123,\n\t18738: 0x60F4,\n\t18739: 0x6100,\n\t18740: 0x610E,\n\t18741: 0x612B,\n\t18742: 0x614A,\n\t18743: 0x6175,\n\t18744: 0x61AC,\n\t18745: 0x6194,\n\t18746: 0x61A7,\n\t18747: 0x61B7,\n\t18748: 0x61D4,\n\t18749: 0x61F5,\n\t18750: 0x5FDD,\n\t18751: 0x96B3,\n\t18752: 0x95E9,\n\t18753: 0x95EB,\n\t18754: 0x95F1,\n\t18755: 0x95F3,\n\t18756: 0x95F5,\n\t18757: 0x95F6,\n\t18758: 0x95FC,\n\t18759: 0x95FE,\n\t18760: 0x9603,\n\t18761: 0x9604,\n\t18762: 0x9606,\n\t18763: 0x9608,\n\t18764: 0x960A,\n\t18765: 0x960B,\n\t18766: 0x960C,\n\t18767: 0x960D,\n\t18768: 0x960F,\n\t18769: 0x9612,\n\t18770: 0x9615,\n\t18771: 0x9616,\n\t18772: 0x9617,\n\t18773: 0x9619,\n\t18774: 0x961A,\n\t18775: 0x4E2C,\n\t18776: 0x723F,\n\t18777: 0x6215,\n\t18778: 0x6C35,\n\t18779: 0x6C54,\n\t18780: 0x6C5C,\n\t18781: 0x6C4A,\n\t18782: 0x6CA3,\n\t18783: 0x6C85,\n\t18784: 0x6C90,\n\t18785: 0x6C94,\n\t18786: 0x6C8C,\n\t18787: 0x6C68,\n\t18788: 0x6C69,\n\t18789: 0x6C74,\n\t18790: 0x6C76,\n\t18791: 0x6C86,\n\t18792: 0x6CA9,\n\t18793: 0x6CD0,\n\t18794: 0x6CD4,\n\t18795: 0x6CAD,\n\t18796: 0x6CF7,\n\t18797: 0x6CF8,\n\t18798: 0x6CF1,\n\t18799: 0x6CD7,\n\t18800: 0x6CB2,\n\t18801: 0x6CE0,\n\t18802: 0x6CD6,\n\t18803: 0x6CFA,\n\t18804: 0x6CEB,\n\t18805: 0x6CEE,\n\t18806: 0x6CB1,\n\t18807: 0x6CD3,\n\t18808: 0x6CEF,\n\t18809: 0x6CFE,\n\t18810: 0x92A8,\n\t18811: 0x92A9,\n\t18812: 0x92AA,\n\t18813: 0x92AB,\n\t18814: 0x92AC,\n\t18815: 0x92AD,\n\t18816: 0x92AF,\n\t18817: 0x92B0,\n\t18818: 0x92B1,\n\t18819: 0x92B2,\n\t18820: 0x92B3,\n\t18821: 0x92B4,\n\t18822: 0x92B5,\n\t18823: 0x92B6,\n\t18824: 0x92B7,\n\t18825: 0x92B8,\n\t18826: 0x92B9,\n\t18827: 0x92BA,\n\t18828: 0x92BB,\n\t18829: 0x92BC,\n\t18830: 0x92BD,\n\t18831: 0x92BE,\n\t18832: 0x92BF,\n\t18833: 0x92C0,\n\t18834: 0x92C1,\n\t18835: 0x92C2,\n\t18836: 0x92C3,\n\t18837: 0x92C4,\n\t18838: 0x92C5,\n\t18839: 0x92C6,\n\t18840: 0x92C7,\n\t18841: 0x92C9,\n\t18842: 0x92CA,\n\t18843: 0x92CB,\n\t18844: 0x92CC,\n\t18845: 0x92CD,\n\t18846: 0x92CE,\n\t18847: 0x92CF,\n\t18848: 0x92D0,\n\t18849: 0x92D1,\n\t18850: 0x92D2,\n\t18851: 0x92D3,\n\t18852: 0x92D4,\n\t18853: 0x92D5,\n\t18854: 0x92D6,\n\t18855: 0x92D7,\n\t18856: 0x92D8,\n\t18857: 0x92D9,\n\t18858: 0x92DA,\n\t18859: 0x92DB,\n\t18860: 0x92DC,\n\t18861: 0x92DD,\n\t18862: 0x92DE,\n\t18863: 0x92DF,\n\t18864: 0x92E0,\n\t18865: 0x92E1,\n\t18866: 0x92E2,\n\t18867: 0x92E3,\n\t18868: 0x92E4,\n\t18869: 0x92E5,\n\t18870: 0x92E6,\n\t18871: 0x92E7,\n\t18872: 0x92E8,\n\t18873: 0x92E9,\n\t18874: 0x92EA,\n\t18875: 0x92EB,\n\t18876: 0x92EC,\n\t18877: 0x92ED,\n\t18878: 0x92EE,\n\t18879: 0x92EF,\n\t18880: 0x92F0,\n\t18881: 0x92F1,\n\t18882: 0x92F2,\n\t18883: 0x92F3,\n\t18884: 0x92F4,\n\t18885: 0x92F5,\n\t18886: 0x92F6,\n\t18887: 0x92F7,\n\t18888: 0x92F8,\n\t18889: 0x92F9,\n\t18890: 0x92FA,\n\t18891: 0x92FB,\n\t18892: 0x92FC,\n\t18893: 0x92FD,\n\t18894: 0x92FE,\n\t18895: 0x92FF,\n\t18896: 0x9300,\n\t18897: 0x9301,\n\t18898: 0x9302,\n\t18899: 0x9303,\n\t18900: 0x9304,\n\t18901: 0x9305,\n\t18902: 0x9306,\n\t18903: 0x9307,\n\t18904: 0x9308,\n\t18905: 0x9309,\n\t18906: 0x6D39,\n\t18907: 0x6D27,\n\t18908: 0x6D0C,\n\t18909: 0x6D43,\n\t18910: 0x6D48,\n\t18911: 0x6D07,\n\t18912: 0x6D04,\n\t18913: 0x6D19,\n\t18914: 0x6D0E,\n\t18915: 0x6D2B,\n\t18916: 0x6D4D,\n\t18917: 0x6D2E,\n\t18918: 0x6D35,\n\t18919: 0x6D1A,\n\t18920: 0x6D4F,\n\t18921: 0x6D52,\n\t18922: 0x6D54,\n\t18923: 0x6D33,\n\t18924: 0x6D91,\n\t18925: 0x6D6F,\n\t18926: 0x6D9E,\n\t18927: 0x6DA0,\n\t18928: 0x6D5E,\n\t18929: 0x6D93,\n\t18930: 0x6D94,\n\t18931: 0x6D5C,\n\t18932: 0x6D60,\n\t18933: 0x6D7C,\n\t18934: 0x6D63,\n\t18935: 0x6E1A,\n\t18936: 0x6DC7,\n\t18937: 0x6DC5,\n\t18938: 0x6DDE,\n\t18939: 0x6E0E,\n\t18940: 0x6DBF,\n\t18941: 0x6DE0,\n\t18942: 0x6E11,\n\t18943: 0x6DE6,\n\t18944: 0x6DDD,\n\t18945: 0x6DD9,\n\t18946: 0x6E16,\n\t18947: 0x6DAB,\n\t18948: 0x6E0C,\n\t18949: 0x6DAE,\n\t18950: 0x6E2B,\n\t18951: 0x6E6E,\n\t18952: 0x6E4E,\n\t18953: 0x6E6B,\n\t18954: 0x6EB2,\n\t18955: 0x6E5F,\n\t18956: 0x6E86,\n\t18957: 0x6E53,\n\t18958: 0x6E54,\n\t18959: 0x6E32,\n\t18960: 0x6E25,\n\t18961: 0x6E44,\n\t18962: 0x6EDF,\n\t18963: 0x6EB1,\n\t18964: 0x6E98,\n\t18965: 0x6EE0,\n\t18966: 0x6F2D,\n\t18967: 0x6EE2,\n\t18968: 0x6EA5,\n\t18969: 0x6EA7,\n\t18970: 0x6EBD,\n\t18971: 0x6EBB,\n\t18972: 0x6EB7,\n\t18973: 0x6ED7,\n\t18974: 0x6EB4,\n\t18975: 0x6ECF,\n\t18976: 0x6E8F,\n\t18977: 0x6EC2,\n\t18978: 0x6E9F,\n\t18979: 0x6F62,\n\t18980: 0x6F46,\n\t18981: 0x6F47,\n\t18982: 0x6F24,\n\t18983: 0x6F15,\n\t18984: 0x6EF9,\n\t18985: 0x6F2F,\n\t18986: 0x6F36,\n\t18987: 0x6F4B,\n\t18988: 0x6F74,\n\t18989: 0x6F2A,\n\t18990: 0x6F09,\n\t18991: 0x6F29,\n\t18992: 0x6F89,\n\t18993: 0x6F8D,\n\t18994: 0x6F8C,\n\t18995: 0x6F78,\n\t18996: 0x6F72,\n\t18997: 0x6F7C,\n\t18998: 0x6F7A,\n\t18999: 0x6FD1,\n\t19000: 0x930A,\n\t19001: 0x930B,\n\t19002: 0x930C,\n\t19003: 0x930D,\n\t19004: 0x930E,\n\t19005: 0x930F,\n\t19006: 0x9310,\n\t19007: 0x9311,\n\t19008: 0x9312,\n\t19009: 0x9313,\n\t19010: 0x9314,\n\t19011: 0x9315,\n\t19012: 0x9316,\n\t19013: 0x9317,\n\t19014: 0x9318,\n\t19015: 0x9319,\n\t19016: 0x931A,\n\t19017: 0x931B,\n\t19018: 0x931C,\n\t19019: 0x931D,\n\t19020: 0x931E,\n\t19021: 0x931F,\n\t19022: 0x9320,\n\t19023: 0x9321,\n\t19024: 0x9322,\n\t19025: 0x9323,\n\t19026: 0x9324,\n\t19027: 0x9325,\n\t19028: 0x9326,\n\t19029: 0x9327,\n\t19030: 0x9328,\n\t19031: 0x9329,\n\t19032: 0x932A,\n\t19033: 0x932B,\n\t19034: 0x932C,\n\t19035: 0x932D,\n\t19036: 0x932E,\n\t19037: 0x932F,\n\t19038: 0x9330,\n\t19039: 0x9331,\n\t19040: 0x9332,\n\t19041: 0x9333,\n\t19042: 0x9334,\n\t19043: 0x9335,\n\t19044: 0x9336,\n\t19045: 0x9337,\n\t19046: 0x9338,\n\t19047: 0x9339,\n\t19048: 0x933A,\n\t19049: 0x933B,\n\t19050: 0x933C,\n\t19051: 0x933D,\n\t19052: 0x933F,\n\t19053: 0x9340,\n\t19054: 0x9341,\n\t19055: 0x9342,\n\t19056: 0x9343,\n\t19057: 0x9344,\n\t19058: 0x9345,\n\t19059: 0x9346,\n\t19060: 0x9347,\n\t19061: 0x9348,\n\t19062: 0x9349,\n\t19063: 0x934A,\n\t19064: 0x934B,\n\t19065: 0x934C,\n\t19066: 0x934D,\n\t19067: 0x934E,\n\t19068: 0x934F,\n\t19069: 0x9350,\n\t19070: 0x9351,\n\t19071: 0x9352,\n\t19072: 0x9353,\n\t19073: 0x9354,\n\t19074: 0x9355,\n\t19075: 0x9356,\n\t19076: 0x9357,\n\t19077: 0x9358,\n\t19078: 0x9359,\n\t19079: 0x935A,\n\t19080: 0x935B,\n\t19081: 0x935C,\n\t19082: 0x935D,\n\t19083: 0x935E,\n\t19084: 0x935F,\n\t19085: 0x9360,\n\t19086: 0x9361,\n\t19087: 0x9362,\n\t19088: 0x9363,\n\t19089: 0x9364,\n\t19090: 0x9365,\n\t19091: 0x9366,\n\t19092: 0x9367,\n\t19093: 0x9368,\n\t19094: 0x9369,\n\t19095: 0x936B,\n\t19096: 0x6FC9,\n\t19097: 0x6FA7,\n\t19098: 0x6FB9,\n\t19099: 0x6FB6,\n\t19100: 0x6FC2,\n\t19101: 0x6FE1,\n\t19102: 0x6FEE,\n\t19103: 0x6FDE,\n\t19104: 0x6FE0,\n\t19105: 0x6FEF,\n\t19106: 0x701A,\n\t19107: 0x7023,\n\t19108: 0x701B,\n\t19109: 0x7039,\n\t19110: 0x7035,\n\t19111: 0x704F,\n\t19112: 0x705E,\n\t19113: 0x5B80,\n\t19114: 0x5B84,\n\t19115: 0x5B95,\n\t19116: 0x5B93,\n\t19117: 0x5BA5,\n\t19118: 0x5BB8,\n\t19119: 0x752F,\n\t19120: 0x9A9E,\n\t19121: 0x6434,\n\t19122: 0x5BE4,\n\t19123: 0x5BEE,\n\t19124: 0x8930,\n\t19125: 0x5BF0,\n\t19126: 0x8E47,\n\t19127: 0x8B07,\n\t19128: 0x8FB6,\n\t19129: 0x8FD3,\n\t19130: 0x8FD5,\n\t19131: 0x8FE5,\n\t19132: 0x8FEE,\n\t19133: 0x8FE4,\n\t19134: 0x8FE9,\n\t19135: 0x8FE6,\n\t19136: 0x8FF3,\n\t19137: 0x8FE8,\n\t19138: 0x9005,\n\t19139: 0x9004,\n\t19140: 0x900B,\n\t19141: 0x9026,\n\t19142: 0x9011,\n\t19143: 0x900D,\n\t19144: 0x9016,\n\t19145: 0x9021,\n\t19146: 0x9035,\n\t19147: 0x9036,\n\t19148: 0x902D,\n\t19149: 0x902F,\n\t19150: 0x9044,\n\t19151: 0x9051,\n\t19152: 0x9052,\n\t19153: 0x9050,\n\t19154: 0x9068,\n\t19155: 0x9058,\n\t19156: 0x9062,\n\t19157: 0x905B,\n\t19158: 0x66B9,\n\t19159: 0x9074,\n\t19160: 0x907D,\n\t19161: 0x9082,\n\t19162: 0x9088,\n\t19163: 0x9083,\n\t19164: 0x908B,\n\t19165: 0x5F50,\n\t19166: 0x5F57,\n\t19167: 0x5F56,\n\t19168: 0x5F58,\n\t19169: 0x5C3B,\n\t19170: 0x54AB,\n\t19171: 0x5C50,\n\t19172: 0x5C59,\n\t19173: 0x5B71,\n\t19174: 0x5C63,\n\t19175: 0x5C66,\n\t19176: 0x7FBC,\n\t19177: 0x5F2A,\n\t19178: 0x5F29,\n\t19179: 0x5F2D,\n\t19180: 0x8274,\n\t19181: 0x5F3C,\n\t19182: 0x9B3B,\n\t19183: 0x5C6E,\n\t19184: 0x5981,\n\t19185: 0x5983,\n\t19186: 0x598D,\n\t19187: 0x59A9,\n\t19188: 0x59AA,\n\t19189: 0x59A3,\n\t19190: 0x936C,\n\t19191: 0x936D,\n\t19192: 0x936E,\n\t19193: 0x936F,\n\t19194: 0x9370,\n\t19195: 0x9371,\n\t19196: 0x9372,\n\t19197: 0x9373,\n\t19198: 0x9374,\n\t19199: 0x9375,\n\t19200: 0x9376,\n\t19201: 0x9377,\n\t19202: 0x9378,\n\t19203: 0x9379,\n\t19204: 0x937A,\n\t19205: 0x937B,\n\t19206: 0x937C,\n\t19207: 0x937D,\n\t19208: 0x937E,\n\t19209: 0x937F,\n\t19210: 0x9380,\n\t19211: 0x9381,\n\t19212: 0x9382,\n\t19213: 0x9383,\n\t19214: 0x9384,\n\t19215: 0x9385,\n\t19216: 0x9386,\n\t19217: 0x9387,\n\t19218: 0x9388,\n\t19219: 0x9389,\n\t19220: 0x938A,\n\t19221: 0x938B,\n\t19222: 0x938C,\n\t19223: 0x938D,\n\t19224: 0x938E,\n\t19225: 0x9390,\n\t19226: 0x9391,\n\t19227: 0x9392,\n\t19228: 0x9393,\n\t19229: 0x9394,\n\t19230: 0x9395,\n\t19231: 0x9396,\n\t19232: 0x9397,\n\t19233: 0x9398,\n\t19234: 0x9399,\n\t19235: 0x939A,\n\t19236: 0x939B,\n\t19237: 0x939C,\n\t19238: 0x939D,\n\t19239: 0x939E,\n\t19240: 0x939F,\n\t19241: 0x93A0,\n\t19242: 0x93A1,\n\t19243: 0x93A2,\n\t19244: 0x93A3,\n\t19245: 0x93A4,\n\t19246: 0x93A5,\n\t19247: 0x93A6,\n\t19248: 0x93A7,\n\t19249: 0x93A8,\n\t19250: 0x93A9,\n\t19251: 0x93AA,\n\t19252: 0x93AB,\n\t19253: 0x93AC,\n\t19254: 0x93AD,\n\t19255: 0x93AE,\n\t19256: 0x93AF,\n\t19257: 0x93B0,\n\t19258: 0x93B1,\n\t19259: 0x93B2,\n\t19260: 0x93B3,\n\t19261: 0x93B4,\n\t19262: 0x93B5,\n\t19263: 0x93B6,\n\t19264: 0x93B7,\n\t19265: 0x93B8,\n\t19266: 0x93B9,\n\t19267: 0x93BA,\n\t19268: 0x93BB,\n\t19269: 0x93BC,\n\t19270: 0x93BD,\n\t19271: 0x93BE,\n\t19272: 0x93BF,\n\t19273: 0x93C0,\n\t19274: 0x93C1,\n\t19275: 0x93C2,\n\t19276: 0x93C3,\n\t19277: 0x93C4,\n\t19278: 0x93C5,\n\t19279: 0x93C6,\n\t19280: 0x93C7,\n\t19281: 0x93C8,\n\t19282: 0x93C9,\n\t19283: 0x93CB,\n\t19284: 0x93CC,\n\t19285: 0x93CD,\n\t19286: 0x5997,\n\t19287: 0x59CA,\n\t19288: 0x59AB,\n\t19289: 0x599E,\n\t19290: 0x59A4,\n\t19291: 0x59D2,\n\t19292: 0x59B2,\n\t19293: 0x59AF,\n\t19294: 0x59D7,\n\t19295: 0x59BE,\n\t19296: 0x5A05,\n\t19297: 0x5A06,\n\t19298: 0x59DD,\n\t19299: 0x5A08,\n\t19300: 0x59E3,\n\t19301: 0x59D8,\n\t19302: 0x59F9,\n\t19303: 0x5A0C,\n\t19304: 0x5A09,\n\t19305: 0x5A32,\n\t19306: 0x5A34,\n\t19307: 0x5A11,\n\t19308: 0x5A23,\n\t19309: 0x5A13,\n\t19310: 0x5A40,\n\t19311: 0x5A67,\n\t19312: 0x5A4A,\n\t19313: 0x5A55,\n\t19314: 0x5A3C,\n\t19315: 0x5A62,\n\t19316: 0x5A75,\n\t19317: 0x80EC,\n\t19318: 0x5AAA,\n\t19319: 0x5A9B,\n\t19320: 0x5A77,\n\t19321: 0x5A7A,\n\t19322: 0x5ABE,\n\t19323: 0x5AEB,\n\t19324: 0x5AB2,\n\t19325: 0x5AD2,\n\t19326: 0x5AD4,\n\t19327: 0x5AB8,\n\t19328: 0x5AE0,\n\t19329: 0x5AE3,\n\t19330: 0x5AF1,\n\t19331: 0x5AD6,\n\t19332: 0x5AE6,\n\t19333: 0x5AD8,\n\t19334: 0x5ADC,\n\t19335: 0x5B09,\n\t19336: 0x5B17,\n\t19337: 0x5B16,\n\t19338: 0x5B32,\n\t19339: 0x5B37,\n\t19340: 0x5B40,\n\t19341: 0x5C15,\n\t19342: 0x5C1C,\n\t19343: 0x5B5A,\n\t19344: 0x5B65,\n\t19345: 0x5B73,\n\t19346: 0x5B51,\n\t19347: 0x5B53,\n\t19348: 0x5B62,\n\t19349: 0x9A75,\n\t19350: 0x9A77,\n\t19351: 0x9A78,\n\t19352: 0x9A7A,\n\t19353: 0x9A7F,\n\t19354: 0x9A7D,\n\t19355: 0x9A80,\n\t19356: 0x9A81,\n\t19357: 0x9A85,\n\t19358: 0x9A88,\n\t19359: 0x9A8A,\n\t19360: 0x9A90,\n\t19361: 0x9A92,\n\t19362: 0x9A93,\n\t19363: 0x9A96,\n\t19364: 0x9A98,\n\t19365: 0x9A9B,\n\t19366: 0x9A9C,\n\t19367: 0x9A9D,\n\t19368: 0x9A9F,\n\t19369: 0x9AA0,\n\t19370: 0x9AA2,\n\t19371: 0x9AA3,\n\t19372: 0x9AA5,\n\t19373: 0x9AA7,\n\t19374: 0x7E9F,\n\t19375: 0x7EA1,\n\t19376: 0x7EA3,\n\t19377: 0x7EA5,\n\t19378: 0x7EA8,\n\t19379: 0x7EA9,\n\t19380: 0x93CE,\n\t19381: 0x93CF,\n\t19382: 0x93D0,\n\t19383: 0x93D1,\n\t19384: 0x93D2,\n\t19385: 0x93D3,\n\t19386: 0x93D4,\n\t19387: 0x93D5,\n\t19388: 0x93D7,\n\t19389: 0x93D8,\n\t19390: 0x93D9,\n\t19391: 0x93DA,\n\t19392: 0x93DB,\n\t19393: 0x93DC,\n\t19394: 0x93DD,\n\t19395: 0x93DE,\n\t19396: 0x93DF,\n\t19397: 0x93E0,\n\t19398: 0x93E1,\n\t19399: 0x93E2,\n\t19400: 0x93E3,\n\t19401: 0x93E4,\n\t19402: 0x93E5,\n\t19403: 0x93E6,\n\t19404: 0x93E7,\n\t19405: 0x93E8,\n\t19406: 0x93E9,\n\t19407: 0x93EA,\n\t19408: 0x93EB,\n\t19409: 0x93EC,\n\t19410: 0x93ED,\n\t19411: 0x93EE,\n\t19412: 0x93EF,\n\t19413: 0x93F0,\n\t19414: 0x93F1,\n\t19415: 0x93F2,\n\t19416: 0x93F3,\n\t19417: 0x93F4,\n\t19418: 0x93F5,\n\t19419: 0x93F6,\n\t19420: 0x93F7,\n\t19421: 0x93F8,\n\t19422: 0x93F9,\n\t19423: 0x93FA,\n\t19424: 0x93FB,\n\t19425: 0x93FC,\n\t19426: 0x93FD,\n\t19427: 0x93FE,\n\t19428: 0x93FF,\n\t19429: 0x9400,\n\t19430: 0x9401,\n\t19431: 0x9402,\n\t19432: 0x9403,\n\t19433: 0x9404,\n\t19434: 0x9405,\n\t19435: 0x9406,\n\t19436: 0x9407,\n\t19437: 0x9408,\n\t19438: 0x9409,\n\t19439: 0x940A,\n\t19440: 0x940B,\n\t19441: 0x940C,\n\t19442: 0x940D,\n\t19443: 0x940E,\n\t19444: 0x940F,\n\t19445: 0x9410,\n\t19446: 0x9411,\n\t19447: 0x9412,\n\t19448: 0x9413,\n\t19449: 0x9414,\n\t19450: 0x9415,\n\t19451: 0x9416,\n\t19452: 0x9417,\n\t19453: 0x9418,\n\t19454: 0x9419,\n\t19455: 0x941A,\n\t19456: 0x941B,\n\t19457: 0x941C,\n\t19458: 0x941D,\n\t19459: 0x941E,\n\t19460: 0x941F,\n\t19461: 0x9420,\n\t19462: 0x9421,\n\t19463: 0x9422,\n\t19464: 0x9423,\n\t19465: 0x9424,\n\t19466: 0x9425,\n\t19467: 0x9426,\n\t19468: 0x9427,\n\t19469: 0x9428,\n\t19470: 0x9429,\n\t19471: 0x942A,\n\t19472: 0x942B,\n\t19473: 0x942C,\n\t19474: 0x942D,\n\t19475: 0x942E,\n\t19476: 0x7EAD,\n\t19477: 0x7EB0,\n\t19478: 0x7EBE,\n\t19479: 0x7EC0,\n\t19480: 0x7EC1,\n\t19481: 0x7EC2,\n\t19482: 0x7EC9,\n\t19483: 0x7ECB,\n\t19484: 0x7ECC,\n\t19485: 0x7ED0,\n\t19486: 0x7ED4,\n\t19487: 0x7ED7,\n\t19488: 0x7EDB,\n\t19489: 0x7EE0,\n\t19490: 0x7EE1,\n\t19491: 0x7EE8,\n\t19492: 0x7EEB,\n\t19493: 0x7EEE,\n\t19494: 0x7EEF,\n\t19495: 0x7EF1,\n\t19496: 0x7EF2,\n\t19497: 0x7F0D,\n\t19498: 0x7EF6,\n\t19499: 0x7EFA,\n\t19500: 0x7EFB,\n\t19501: 0x7EFE,\n\t19502: 0x7F01,\n\t19503: 0x7F02,\n\t19504: 0x7F03,\n\t19505: 0x7F07,\n\t19506: 0x7F08,\n\t19507: 0x7F0B,\n\t19508: 0x7F0C,\n\t19509: 0x7F0F,\n\t19510: 0x7F11,\n\t19511: 0x7F12,\n\t19512: 0x7F17,\n\t19513: 0x7F19,\n\t19514: 0x7F1C,\n\t19515: 0x7F1B,\n\t19516: 0x7F1F,\n\t19517: 0x7F21,\n\t19518: 0x7F22,\n\t19519: 0x7F23,\n\t19520: 0x7F24,\n\t19521: 0x7F25,\n\t19522: 0x7F26,\n\t19523: 0x7F27,\n\t19524: 0x7F2A,\n\t19525: 0x7F2B,\n\t19526: 0x7F2C,\n\t19527: 0x7F2D,\n\t19528: 0x7F2F,\n\t19529: 0x7F30,\n\t19530: 0x7F31,\n\t19531: 0x7F32,\n\t19532: 0x7F33,\n\t19533: 0x7F35,\n\t19534: 0x5E7A,\n\t19535: 0x757F,\n\t19536: 0x5DDB,\n\t19537: 0x753E,\n\t19538: 0x9095,\n\t19539: 0x738E,\n\t19540: 0x7391,\n\t19541: 0x73AE,\n\t19542: 0x73A2,\n\t19543: 0x739F,\n\t19544: 0x73CF,\n\t19545: 0x73C2,\n\t19546: 0x73D1,\n\t19547: 0x73B7,\n\t19548: 0x73B3,\n\t19549: 0x73C0,\n\t19550: 0x73C9,\n\t19551: 0x73C8,\n\t19552: 0x73E5,\n\t19553: 0x73D9,\n\t19554: 0x987C,\n\t19555: 0x740A,\n\t19556: 0x73E9,\n\t19557: 0x73E7,\n\t19558: 0x73DE,\n\t19559: 0x73BA,\n\t19560: 0x73F2,\n\t19561: 0x740F,\n\t19562: 0x742A,\n\t19563: 0x745B,\n\t19564: 0x7426,\n\t19565: 0x7425,\n\t19566: 0x7428,\n\t19567: 0x7430,\n\t19568: 0x742E,\n\t19569: 0x742C,\n\t19570: 0x942F,\n\t19571: 0x9430,\n\t19572: 0x9431,\n\t19573: 0x9432,\n\t19574: 0x9433,\n\t19575: 0x9434,\n\t19576: 0x9435,\n\t19577: 0x9436,\n\t19578: 0x9437,\n\t19579: 0x9438,\n\t19580: 0x9439,\n\t19581: 0x943A,\n\t19582: 0x943B,\n\t19583: 0x943C,\n\t19584: 0x943D,\n\t19585: 0x943F,\n\t19586: 0x9440,\n\t19587: 0x9441,\n\t19588: 0x9442,\n\t19589: 0x9443,\n\t19590: 0x9444,\n\t19591: 0x9445,\n\t19592: 0x9446,\n\t19593: 0x9447,\n\t19594: 0x9448,\n\t19595: 0x9449,\n\t19596: 0x944A,\n\t19597: 0x944B,\n\t19598: 0x944C,\n\t19599: 0x944D,\n\t19600: 0x944E,\n\t19601: 0x944F,\n\t19602: 0x9450,\n\t19603: 0x9451,\n\t19604: 0x9452,\n\t19605: 0x9453,\n\t19606: 0x9454,\n\t19607: 0x9455,\n\t19608: 0x9456,\n\t19609: 0x9457,\n\t19610: 0x9458,\n\t19611: 0x9459,\n\t19612: 0x945A,\n\t19613: 0x945B,\n\t19614: 0x945C,\n\t19615: 0x945D,\n\t19616: 0x945E,\n\t19617: 0x945F,\n\t19618: 0x9460,\n\t19619: 0x9461,\n\t19620: 0x9462,\n\t19621: 0x9463,\n\t19622: 0x9464,\n\t19623: 0x9465,\n\t19624: 0x9466,\n\t19625: 0x9467,\n\t19626: 0x9468,\n\t19627: 0x9469,\n\t19628: 0x946A,\n\t19629: 0x946C,\n\t19630: 0x946D,\n\t19631: 0x946E,\n\t19632: 0x946F,\n\t19633: 0x9470,\n\t19634: 0x9471,\n\t19635: 0x9472,\n\t19636: 0x9473,\n\t19637: 0x9474,\n\t19638: 0x9475,\n\t19639: 0x9476,\n\t19640: 0x9477,\n\t19641: 0x9478,\n\t19642: 0x9479,\n\t19643: 0x947A,\n\t19644: 0x947B,\n\t19645: 0x947C,\n\t19646: 0x947D,\n\t19647: 0x947E,\n\t19648: 0x947F,\n\t19649: 0x9480,\n\t19650: 0x9481,\n\t19651: 0x9482,\n\t19652: 0x9483,\n\t19653: 0x9484,\n\t19654: 0x9491,\n\t19655: 0x9496,\n\t19656: 0x9498,\n\t19657: 0x94C7,\n\t19658: 0x94CF,\n\t19659: 0x94D3,\n\t19660: 0x94D4,\n\t19661: 0x94DA,\n\t19662: 0x94E6,\n\t19663: 0x94FB,\n\t19664: 0x951C,\n\t19665: 0x9520,\n\t19666: 0x741B,\n\t19667: 0x741A,\n\t19668: 0x7441,\n\t19669: 0x745C,\n\t19670: 0x7457,\n\t19671: 0x7455,\n\t19672: 0x7459,\n\t19673: 0x7477,\n\t19674: 0x746D,\n\t19675: 0x747E,\n\t19676: 0x749C,\n\t19677: 0x748E,\n\t19678: 0x7480,\n\t19679: 0x7481,\n\t19680: 0x7487,\n\t19681: 0x748B,\n\t19682: 0x749E,\n\t19683: 0x74A8,\n\t19684: 0x74A9,\n\t19685: 0x7490,\n\t19686: 0x74A7,\n\t19687: 0x74D2,\n\t19688: 0x74BA,\n\t19689: 0x97EA,\n\t19690: 0x97EB,\n\t19691: 0x97EC,\n\t19692: 0x674C,\n\t19693: 0x6753,\n\t19694: 0x675E,\n\t19695: 0x6748,\n\t19696: 0x6769,\n\t19697: 0x67A5,\n\t19698: 0x6787,\n\t19699: 0x676A,\n\t19700: 0x6773,\n\t19701: 0x6798,\n\t19702: 0x67A7,\n\t19703: 0x6775,\n\t19704: 0x67A8,\n\t19705: 0x679E,\n\t19706: 0x67AD,\n\t19707: 0x678B,\n\t19708: 0x6777,\n\t19709: 0x677C,\n\t19710: 0x67F0,\n\t19711: 0x6809,\n\t19712: 0x67D8,\n\t19713: 0x680A,\n\t19714: 0x67E9,\n\t19715: 0x67B0,\n\t19716: 0x680C,\n\t19717: 0x67D9,\n\t19718: 0x67B5,\n\t19719: 0x67DA,\n\t19720: 0x67B3,\n\t19721: 0x67DD,\n\t19722: 0x6800,\n\t19723: 0x67C3,\n\t19724: 0x67B8,\n\t19725: 0x67E2,\n\t19726: 0x680E,\n\t19727: 0x67C1,\n\t19728: 0x67FD,\n\t19729: 0x6832,\n\t19730: 0x6833,\n\t19731: 0x6860,\n\t19732: 0x6861,\n\t19733: 0x684E,\n\t19734: 0x6862,\n\t19735: 0x6844,\n\t19736: 0x6864,\n\t19737: 0x6883,\n\t19738: 0x681D,\n\t19739: 0x6855,\n\t19740: 0x6866,\n\t19741: 0x6841,\n\t19742: 0x6867,\n\t19743: 0x6840,\n\t19744: 0x683E,\n\t19745: 0x684A,\n\t19746: 0x6849,\n\t19747: 0x6829,\n\t19748: 0x68B5,\n\t19749: 0x688F,\n\t19750: 0x6874,\n\t19751: 0x6877,\n\t19752: 0x6893,\n\t19753: 0x686B,\n\t19754: 0x68C2,\n\t19755: 0x696E,\n\t19756: 0x68FC,\n\t19757: 0x691F,\n\t19758: 0x6920,\n\t19759: 0x68F9,\n\t19760: 0x9527,\n\t19761: 0x9533,\n\t19762: 0x953D,\n\t19763: 0x9543,\n\t19764: 0x9548,\n\t19765: 0x954B,\n\t19766: 0x9555,\n\t19767: 0x955A,\n\t19768: 0x9560,\n\t19769: 0x956E,\n\t19770: 0x9574,\n\t19771: 0x9575,\n\t19772: 0x9577,\n\t19773: 0x9578,\n\t19774: 0x9579,\n\t19775: 0x957A,\n\t19776: 0x957B,\n\t19777: 0x957C,\n\t19778: 0x957D,\n\t19779: 0x957E,\n\t19780: 0x9580,\n\t19781: 0x9581,\n\t19782: 0x9582,\n\t19783: 0x9583,\n\t19784: 0x9584,\n\t19785: 0x9585,\n\t19786: 0x9586,\n\t19787: 0x9587,\n\t19788: 0x9588,\n\t19789: 0x9589,\n\t19790: 0x958A,\n\t19791: 0x958B,\n\t19792: 0x958C,\n\t19793: 0x958D,\n\t19794: 0x958E,\n\t19795: 0x958F,\n\t19796: 0x9590,\n\t19797: 0x9591,\n\t19798: 0x9592,\n\t19799: 0x9593,\n\t19800: 0x9594,\n\t19801: 0x9595,\n\t19802: 0x9596,\n\t19803: 0x9597,\n\t19804: 0x9598,\n\t19805: 0x9599,\n\t19806: 0x959A,\n\t19807: 0x959B,\n\t19808: 0x959C,\n\t19809: 0x959D,\n\t19810: 0x959E,\n\t19811: 0x959F,\n\t19812: 0x95A0,\n\t19813: 0x95A1,\n\t19814: 0x95A2,\n\t19815: 0x95A3,\n\t19816: 0x95A4,\n\t19817: 0x95A5,\n\t19818: 0x95A6,\n\t19819: 0x95A7,\n\t19820: 0x95A8,\n\t19821: 0x95A9,\n\t19822: 0x95AA,\n\t19823: 0x95AB,\n\t19824: 0x95AC,\n\t19825: 0x95AD,\n\t19826: 0x95AE,\n\t19827: 0x95AF,\n\t19828: 0x95B0,\n\t19829: 0x95B1,\n\t19830: 0x95B2,\n\t19831: 0x95B3,\n\t19832: 0x95B4,\n\t19833: 0x95B5,\n\t19834: 0x95B6,\n\t19835: 0x95B7,\n\t19836: 0x95B8,\n\t19837: 0x95B9,\n\t19838: 0x95BA,\n\t19839: 0x95BB,\n\t19840: 0x95BC,\n\t19841: 0x95BD,\n\t19842: 0x95BE,\n\t19843: 0x95BF,\n\t19844: 0x95C0,\n\t19845: 0x95C1,\n\t19846: 0x95C2,\n\t19847: 0x95C3,\n\t19848: 0x95C4,\n\t19849: 0x95C5,\n\t19850: 0x95C6,\n\t19851: 0x95C7,\n\t19852: 0x95C8,\n\t19853: 0x95C9,\n\t19854: 0x95CA,\n\t19855: 0x95CB,\n\t19856: 0x6924,\n\t19857: 0x68F0,\n\t19858: 0x690B,\n\t19859: 0x6901,\n\t19860: 0x6957,\n\t19861: 0x68E3,\n\t19862: 0x6910,\n\t19863: 0x6971,\n\t19864: 0x6939,\n\t19865: 0x6960,\n\t19866: 0x6942,\n\t19867: 0x695D,\n\t19868: 0x6984,\n\t19869: 0x696B,\n\t19870: 0x6980,\n\t19871: 0x6998,\n\t19872: 0x6978,\n\t19873: 0x6934,\n\t19874: 0x69CC,\n\t19875: 0x6987,\n\t19876: 0x6988,\n\t19877: 0x69CE,\n\t19878: 0x6989,\n\t19879: 0x6966,\n\t19880: 0x6963,\n\t19881: 0x6979,\n\t19882: 0x699B,\n\t19883: 0x69A7,\n\t19884: 0x69BB,\n\t19885: 0x69AB,\n\t19886: 0x69AD,\n\t19887: 0x69D4,\n\t19888: 0x69B1,\n\t19889: 0x69C1,\n\t19890: 0x69CA,\n\t19891: 0x69DF,\n\t19892: 0x6995,\n\t19893: 0x69E0,\n\t19894: 0x698D,\n\t19895: 0x69FF,\n\t19896: 0x6A2F,\n\t19897: 0x69ED,\n\t19898: 0x6A17,\n\t19899: 0x6A18,\n\t19900: 0x6A65,\n\t19901: 0x69F2,\n\t19902: 0x6A44,\n\t19903: 0x6A3E,\n\t19904: 0x6AA0,\n\t19905: 0x6A50,\n\t19906: 0x6A5B,\n\t19907: 0x6A35,\n\t19908: 0x6A8E,\n\t19909: 0x6A79,\n\t19910: 0x6A3D,\n\t19911: 0x6A28,\n\t19912: 0x6A58,\n\t19913: 0x6A7C,\n\t19914: 0x6A91,\n\t19915: 0x6A90,\n\t19916: 0x6AA9,\n\t19917: 0x6A97,\n\t19918: 0x6AAB,\n\t19919: 0x7337,\n\t19920: 0x7352,\n\t19921: 0x6B81,\n\t19922: 0x6B82,\n\t19923: 0x6B87,\n\t19924: 0x6B84,\n\t19925: 0x6B92,\n\t19926: 0x6B93,\n\t19927: 0x6B8D,\n\t19928: 0x6B9A,\n\t19929: 0x6B9B,\n\t19930: 0x6BA1,\n\t19931: 0x6BAA,\n\t19932: 0x8F6B,\n\t19933: 0x8F6D,\n\t19934: 0x8F71,\n\t19935: 0x8F72,\n\t19936: 0x8F73,\n\t19937: 0x8F75,\n\t19938: 0x8F76,\n\t19939: 0x8F78,\n\t19940: 0x8F77,\n\t19941: 0x8F79,\n\t19942: 0x8F7A,\n\t19943: 0x8F7C,\n\t19944: 0x8F7E,\n\t19945: 0x8F81,\n\t19946: 0x8F82,\n\t19947: 0x8F84,\n\t19948: 0x8F87,\n\t19949: 0x8F8B,\n\t19950: 0x95CC,\n\t19951: 0x95CD,\n\t19952: 0x95CE,\n\t19953: 0x95CF,\n\t19954: 0x95D0,\n\t19955: 0x95D1,\n\t19956: 0x95D2,\n\t19957: 0x95D3,\n\t19958: 0x95D4,\n\t19959: 0x95D5,\n\t19960: 0x95D6,\n\t19961: 0x95D7,\n\t19962: 0x95D8,\n\t19963: 0x95D9,\n\t19964: 0x95DA,\n\t19965: 0x95DB,\n\t19966: 0x95DC,\n\t19967: 0x95DD,\n\t19968: 0x95DE,\n\t19969: 0x95DF,\n\t19970: 0x95E0,\n\t19971: 0x95E1,\n\t19972: 0x95E2,\n\t19973: 0x95E3,\n\t19974: 0x95E4,\n\t19975: 0x95E5,\n\t19976: 0x95E6,\n\t19977: 0x95E7,\n\t19978: 0x95EC,\n\t19979: 0x95FF,\n\t19980: 0x9607,\n\t19981: 0x9613,\n\t19982: 0x9618,\n\t19983: 0x961B,\n\t19984: 0x961E,\n\t19985: 0x9620,\n\t19986: 0x9623,\n\t19987: 0x9624,\n\t19988: 0x9625,\n\t19989: 0x9626,\n\t19990: 0x9627,\n\t19991: 0x9628,\n\t19992: 0x9629,\n\t19993: 0x962B,\n\t19994: 0x962C,\n\t19995: 0x962D,\n\t19996: 0x962F,\n\t19997: 0x9630,\n\t19998: 0x9637,\n\t19999: 0x9638,\n\t20000: 0x9639,\n\t20001: 0x963A,\n\t20002: 0x963E,\n\t20003: 0x9641,\n\t20004: 0x9643,\n\t20005: 0x964A,\n\t20006: 0x964E,\n\t20007: 0x964F,\n\t20008: 0x9651,\n\t20009: 0x9652,\n\t20010: 0x9653,\n\t20011: 0x9656,\n\t20012: 0x9657,\n\t20013: 0x9658,\n\t20014: 0x9659,\n\t20015: 0x965A,\n\t20016: 0x965C,\n\t20017: 0x965D,\n\t20018: 0x965E,\n\t20019: 0x9660,\n\t20020: 0x9663,\n\t20021: 0x9665,\n\t20022: 0x9666,\n\t20023: 0x966B,\n\t20024: 0x966D,\n\t20025: 0x966E,\n\t20026: 0x966F,\n\t20027: 0x9670,\n\t20028: 0x9671,\n\t20029: 0x9673,\n\t20030: 0x9678,\n\t20031: 0x9679,\n\t20032: 0x967A,\n\t20033: 0x967B,\n\t20034: 0x967C,\n\t20035: 0x967D,\n\t20036: 0x967E,\n\t20037: 0x967F,\n\t20038: 0x9680,\n\t20039: 0x9681,\n\t20040: 0x9682,\n\t20041: 0x9683,\n\t20042: 0x9684,\n\t20043: 0x9687,\n\t20044: 0x9689,\n\t20045: 0x968A,\n\t20046: 0x8F8D,\n\t20047: 0x8F8E,\n\t20048: 0x8F8F,\n\t20049: 0x8F98,\n\t20050: 0x8F9A,\n\t20051: 0x8ECE,\n\t20052: 0x620B,\n\t20053: 0x6217,\n\t20054: 0x621B,\n\t20055: 0x621F,\n\t20056: 0x6222,\n\t20057: 0x6221,\n\t20058: 0x6225,\n\t20059: 0x6224,\n\t20060: 0x622C,\n\t20061: 0x81E7,\n\t20062: 0x74EF,\n\t20063: 0x74F4,\n\t20064: 0x74FF,\n\t20065: 0x750F,\n\t20066: 0x7511,\n\t20067: 0x7513,\n\t20068: 0x6534,\n\t20069: 0x65EE,\n\t20070: 0x65EF,\n\t20071: 0x65F0,\n\t20072: 0x660A,\n\t20073: 0x6619,\n\t20074: 0x6772,\n\t20075: 0x6603,\n\t20076: 0x6615,\n\t20077: 0x6600,\n\t20078: 0x7085,\n\t20079: 0x66F7,\n\t20080: 0x661D,\n\t20081: 0x6634,\n\t20082: 0x6631,\n\t20083: 0x6636,\n\t20084: 0x6635,\n\t20085: 0x8006,\n\t20086: 0x665F,\n\t20087: 0x6654,\n\t20088: 0x6641,\n\t20089: 0x664F,\n\t20090: 0x6656,\n\t20091: 0x6661,\n\t20092: 0x6657,\n\t20093: 0x6677,\n\t20094: 0x6684,\n\t20095: 0x668C,\n\t20096: 0x66A7,\n\t20097: 0x669D,\n\t20098: 0x66BE,\n\t20099: 0x66DB,\n\t20100: 0x66DC,\n\t20101: 0x66E6,\n\t20102: 0x66E9,\n\t20103: 0x8D32,\n\t20104: 0x8D33,\n\t20105: 0x8D36,\n\t20106: 0x8D3B,\n\t20107: 0x8D3D,\n\t20108: 0x8D40,\n\t20109: 0x8D45,\n\t20110: 0x8D46,\n\t20111: 0x8D48,\n\t20112: 0x8D49,\n\t20113: 0x8D47,\n\t20114: 0x8D4D,\n\t20115: 0x8D55,\n\t20116: 0x8D59,\n\t20117: 0x89C7,\n\t20118: 0x89CA,\n\t20119: 0x89CB,\n\t20120: 0x89CC,\n\t20121: 0x89CE,\n\t20122: 0x89CF,\n\t20123: 0x89D0,\n\t20124: 0x89D1,\n\t20125: 0x726E,\n\t20126: 0x729F,\n\t20127: 0x725D,\n\t20128: 0x7266,\n\t20129: 0x726F,\n\t20130: 0x727E,\n\t20131: 0x727F,\n\t20132: 0x7284,\n\t20133: 0x728B,\n\t20134: 0x728D,\n\t20135: 0x728F,\n\t20136: 0x7292,\n\t20137: 0x6308,\n\t20138: 0x6332,\n\t20139: 0x63B0,\n\t20140: 0x968C,\n\t20141: 0x968E,\n\t20142: 0x9691,\n\t20143: 0x9692,\n\t20144: 0x9693,\n\t20145: 0x9695,\n\t20146: 0x9696,\n\t20147: 0x969A,\n\t20148: 0x969B,\n\t20149: 0x969D,\n\t20150: 0x969E,\n\t20151: 0x969F,\n\t20152: 0x96A0,\n\t20153: 0x96A1,\n\t20154: 0x96A2,\n\t20155: 0x96A3,\n\t20156: 0x96A4,\n\t20157: 0x96A5,\n\t20158: 0x96A6,\n\t20159: 0x96A8,\n\t20160: 0x96A9,\n\t20161: 0x96AA,\n\t20162: 0x96AB,\n\t20163: 0x96AC,\n\t20164: 0x96AD,\n\t20165: 0x96AE,\n\t20166: 0x96AF,\n\t20167: 0x96B1,\n\t20168: 0x96B2,\n\t20169: 0x96B4,\n\t20170: 0x96B5,\n\t20171: 0x96B7,\n\t20172: 0x96B8,\n\t20173: 0x96BA,\n\t20174: 0x96BB,\n\t20175: 0x96BF,\n\t20176: 0x96C2,\n\t20177: 0x96C3,\n\t20178: 0x96C8,\n\t20179: 0x96CA,\n\t20180: 0x96CB,\n\t20181: 0x96D0,\n\t20182: 0x96D1,\n\t20183: 0x96D3,\n\t20184: 0x96D4,\n\t20185: 0x96D6,\n\t20186: 0x96D7,\n\t20187: 0x96D8,\n\t20188: 0x96D9,\n\t20189: 0x96DA,\n\t20190: 0x96DB,\n\t20191: 0x96DC,\n\t20192: 0x96DD,\n\t20193: 0x96DE,\n\t20194: 0x96DF,\n\t20195: 0x96E1,\n\t20196: 0x96E2,\n\t20197: 0x96E3,\n\t20198: 0x96E4,\n\t20199: 0x96E5,\n\t20200: 0x96E6,\n\t20201: 0x96E7,\n\t20202: 0x96EB,\n\t20203: 0x96EC,\n\t20204: 0x96ED,\n\t20205: 0x96EE,\n\t20206: 0x96F0,\n\t20207: 0x96F1,\n\t20208: 0x96F2,\n\t20209: 0x96F4,\n\t20210: 0x96F5,\n\t20211: 0x96F8,\n\t20212: 0x96FA,\n\t20213: 0x96FB,\n\t20214: 0x96FC,\n\t20215: 0x96FD,\n\t20216: 0x96FF,\n\t20217: 0x9702,\n\t20218: 0x9703,\n\t20219: 0x9705,\n\t20220: 0x970A,\n\t20221: 0x970B,\n\t20222: 0x970C,\n\t20223: 0x9710,\n\t20224: 0x9711,\n\t20225: 0x9712,\n\t20226: 0x9714,\n\t20227: 0x9715,\n\t20228: 0x9717,\n\t20229: 0x9718,\n\t20230: 0x9719,\n\t20231: 0x971A,\n\t20232: 0x971B,\n\t20233: 0x971D,\n\t20234: 0x971F,\n\t20235: 0x9720,\n\t20236: 0x643F,\n\t20237: 0x64D8,\n\t20238: 0x8004,\n\t20239: 0x6BEA,\n\t20240: 0x6BF3,\n\t20241: 0x6BFD,\n\t20242: 0x6BF5,\n\t20243: 0x6BF9,\n\t20244: 0x6C05,\n\t20245: 0x6C07,\n\t20246: 0x6C06,\n\t20247: 0x6C0D,\n\t20248: 0x6C15,\n\t20249: 0x6C18,\n\t20250: 0x6C19,\n\t20251: 0x6C1A,\n\t20252: 0x6C21,\n\t20253: 0x6C29,\n\t20254: 0x6C24,\n\t20255: 0x6C2A,\n\t20256: 0x6C32,\n\t20257: 0x6535,\n\t20258: 0x6555,\n\t20259: 0x656B,\n\t20260: 0x724D,\n\t20261: 0x7252,\n\t20262: 0x7256,\n\t20263: 0x7230,\n\t20264: 0x8662,\n\t20265: 0x5216,\n\t20266: 0x809F,\n\t20267: 0x809C,\n\t20268: 0x8093,\n\t20269: 0x80BC,\n\t20270: 0x670A,\n\t20271: 0x80BD,\n\t20272: 0x80B1,\n\t20273: 0x80AB,\n\t20274: 0x80AD,\n\t20275: 0x80B4,\n\t20276: 0x80B7,\n\t20277: 0x80E7,\n\t20278: 0x80E8,\n\t20279: 0x80E9,\n\t20280: 0x80EA,\n\t20281: 0x80DB,\n\t20282: 0x80C2,\n\t20283: 0x80C4,\n\t20284: 0x80D9,\n\t20285: 0x80CD,\n\t20286: 0x80D7,\n\t20287: 0x6710,\n\t20288: 0x80DD,\n\t20289: 0x80EB,\n\t20290: 0x80F1,\n\t20291: 0x80F4,\n\t20292: 0x80ED,\n\t20293: 0x810D,\n\t20294: 0x810E,\n\t20295: 0x80F2,\n\t20296: 0x80FC,\n\t20297: 0x6715,\n\t20298: 0x8112,\n\t20299: 0x8C5A,\n\t20300: 0x8136,\n\t20301: 0x811E,\n\t20302: 0x812C,\n\t20303: 0x8118,\n\t20304: 0x8132,\n\t20305: 0x8148,\n\t20306: 0x814C,\n\t20307: 0x8153,\n\t20308: 0x8174,\n\t20309: 0x8159,\n\t20310: 0x815A,\n\t20311: 0x8171,\n\t20312: 0x8160,\n\t20313: 0x8169,\n\t20314: 0x817C,\n\t20315: 0x817D,\n\t20316: 0x816D,\n\t20317: 0x8167,\n\t20318: 0x584D,\n\t20319: 0x5AB5,\n\t20320: 0x8188,\n\t20321: 0x8182,\n\t20322: 0x8191,\n\t20323: 0x6ED5,\n\t20324: 0x81A3,\n\t20325: 0x81AA,\n\t20326: 0x81CC,\n\t20327: 0x6726,\n\t20328: 0x81CA,\n\t20329: 0x81BB,\n\t20330: 0x9721,\n\t20331: 0x9722,\n\t20332: 0x9723,\n\t20333: 0x9724,\n\t20334: 0x9725,\n\t20335: 0x9726,\n\t20336: 0x9727,\n\t20337: 0x9728,\n\t20338: 0x9729,\n\t20339: 0x972B,\n\t20340: 0x972C,\n\t20341: 0x972E,\n\t20342: 0x972F,\n\t20343: 0x9731,\n\t20344: 0x9733,\n\t20345: 0x9734,\n\t20346: 0x9735,\n\t20347: 0x9736,\n\t20348: 0x9737,\n\t20349: 0x973A,\n\t20350: 0x973B,\n\t20351: 0x973C,\n\t20352: 0x973D,\n\t20353: 0x973F,\n\t20354: 0x9740,\n\t20355: 0x9741,\n\t20356: 0x9742,\n\t20357: 0x9743,\n\t20358: 0x9744,\n\t20359: 0x9745,\n\t20360: 0x9746,\n\t20361: 0x9747,\n\t20362: 0x9748,\n\t20363: 0x9749,\n\t20364: 0x974A,\n\t20365: 0x974B,\n\t20366: 0x974C,\n\t20367: 0x974D,\n\t20368: 0x974E,\n\t20369: 0x974F,\n\t20370: 0x9750,\n\t20371: 0x9751,\n\t20372: 0x9754,\n\t20373: 0x9755,\n\t20374: 0x9757,\n\t20375: 0x9758,\n\t20376: 0x975A,\n\t20377: 0x975C,\n\t20378: 0x975D,\n\t20379: 0x975F,\n\t20380: 0x9763,\n\t20381: 0x9764,\n\t20382: 0x9766,\n\t20383: 0x9767,\n\t20384: 0x9768,\n\t20385: 0x976A,\n\t20386: 0x976B,\n\t20387: 0x976C,\n\t20388: 0x976D,\n\t20389: 0x976E,\n\t20390: 0x976F,\n\t20391: 0x9770,\n\t20392: 0x9771,\n\t20393: 0x9772,\n\t20394: 0x9775,\n\t20395: 0x9777,\n\t20396: 0x9778,\n\t20397: 0x9779,\n\t20398: 0x977A,\n\t20399: 0x977B,\n\t20400: 0x977D,\n\t20401: 0x977E,\n\t20402: 0x977F,\n\t20403: 0x9780,\n\t20404: 0x9781,\n\t20405: 0x9782,\n\t20406: 0x9783,\n\t20407: 0x9784,\n\t20408: 0x9786,\n\t20409: 0x9787,\n\t20410: 0x9788,\n\t20411: 0x9789,\n\t20412: 0x978A,\n\t20413: 0x978C,\n\t20414: 0x978E,\n\t20415: 0x978F,\n\t20416: 0x9790,\n\t20417: 0x9793,\n\t20418: 0x9795,\n\t20419: 0x9796,\n\t20420: 0x9797,\n\t20421: 0x9799,\n\t20422: 0x979A,\n\t20423: 0x979B,\n\t20424: 0x979C,\n\t20425: 0x979D,\n\t20426: 0x81C1,\n\t20427: 0x81A6,\n\t20428: 0x6B24,\n\t20429: 0x6B37,\n\t20430: 0x6B39,\n\t20431: 0x6B43,\n\t20432: 0x6B46,\n\t20433: 0x6B59,\n\t20434: 0x98D1,\n\t20435: 0x98D2,\n\t20436: 0x98D3,\n\t20437: 0x98D5,\n\t20438: 0x98D9,\n\t20439: 0x98DA,\n\t20440: 0x6BB3,\n\t20441: 0x5F40,\n\t20442: 0x6BC2,\n\t20443: 0x89F3,\n\t20444: 0x6590,\n\t20445: 0x9F51,\n\t20446: 0x6593,\n\t20447: 0x65BC,\n\t20448: 0x65C6,\n\t20449: 0x65C4,\n\t20450: 0x65C3,\n\t20451: 0x65CC,\n\t20452: 0x65CE,\n\t20453: 0x65D2,\n\t20454: 0x65D6,\n\t20455: 0x7080,\n\t20456: 0x709C,\n\t20457: 0x7096,\n\t20458: 0x709D,\n\t20459: 0x70BB,\n\t20460: 0x70C0,\n\t20461: 0x70B7,\n\t20462: 0x70AB,\n\t20463: 0x70B1,\n\t20464: 0x70E8,\n\t20465: 0x70CA,\n\t20466: 0x7110,\n\t20467: 0x7113,\n\t20468: 0x7116,\n\t20469: 0x712F,\n\t20470: 0x7131,\n\t20471: 0x7173,\n\t20472: 0x715C,\n\t20473: 0x7168,\n\t20474: 0x7145,\n\t20475: 0x7172,\n\t20476: 0x714A,\n\t20477: 0x7178,\n\t20478: 0x717A,\n\t20479: 0x7198,\n\t20480: 0x71B3,\n\t20481: 0x71B5,\n\t20482: 0x71A8,\n\t20483: 0x71A0,\n\t20484: 0x71E0,\n\t20485: 0x71D4,\n\t20486: 0x71E7,\n\t20487: 0x71F9,\n\t20488: 0x721D,\n\t20489: 0x7228,\n\t20490: 0x706C,\n\t20491: 0x7118,\n\t20492: 0x7166,\n\t20493: 0x71B9,\n\t20494: 0x623E,\n\t20495: 0x623D,\n\t20496: 0x6243,\n\t20497: 0x6248,\n\t20498: 0x6249,\n\t20499: 0x793B,\n\t20500: 0x7940,\n\t20501: 0x7946,\n\t20502: 0x7949,\n\t20503: 0x795B,\n\t20504: 0x795C,\n\t20505: 0x7953,\n\t20506: 0x795A,\n\t20507: 0x7962,\n\t20508: 0x7957,\n\t20509: 0x7960,\n\t20510: 0x796F,\n\t20511: 0x7967,\n\t20512: 0x797A,\n\t20513: 0x7985,\n\t20514: 0x798A,\n\t20515: 0x799A,\n\t20516: 0x79A7,\n\t20517: 0x79B3,\n\t20518: 0x5FD1,\n\t20519: 0x5FD0,\n\t20520: 0x979E,\n\t20521: 0x979F,\n\t20522: 0x97A1,\n\t20523: 0x97A2,\n\t20524: 0x97A4,\n\t20525: 0x97A5,\n\t20526: 0x97A6,\n\t20527: 0x97A7,\n\t20528: 0x97A8,\n\t20529: 0x97A9,\n\t20530: 0x97AA,\n\t20531: 0x97AC,\n\t20532: 0x97AE,\n\t20533: 0x97B0,\n\t20534: 0x97B1,\n\t20535: 0x97B3,\n\t20536: 0x97B5,\n\t20537: 0x97B6,\n\t20538: 0x97B7,\n\t20539: 0x97B8,\n\t20540: 0x97B9,\n\t20541: 0x97BA,\n\t20542: 0x97BB,\n\t20543: 0x97BC,\n\t20544: 0x97BD,\n\t20545: 0x97BE,\n\t20546: 0x97BF,\n\t20547: 0x97C0,\n\t20548: 0x97C1,\n\t20549: 0x97C2,\n\t20550: 0x97C3,\n\t20551: 0x97C4,\n\t20552: 0x97C5,\n\t20553: 0x97C6,\n\t20554: 0x97C7,\n\t20555: 0x97C8,\n\t20556: 0x97C9,\n\t20557: 0x97CA,\n\t20558: 0x97CB,\n\t20559: 0x97CC,\n\t20560: 0x97CD,\n\t20561: 0x97CE,\n\t20562: 0x97CF,\n\t20563: 0x97D0,\n\t20564: 0x97D1,\n\t20565: 0x97D2,\n\t20566: 0x97D3,\n\t20567: 0x97D4,\n\t20568: 0x97D5,\n\t20569: 0x97D6,\n\t20570: 0x97D7,\n\t20571: 0x97D8,\n\t20572: 0x97D9,\n\t20573: 0x97DA,\n\t20574: 0x97DB,\n\t20575: 0x97DC,\n\t20576: 0x97DD,\n\t20577: 0x97DE,\n\t20578: 0x97DF,\n\t20579: 0x97E0,\n\t20580: 0x97E1,\n\t20581: 0x97E2,\n\t20582: 0x97E3,\n\t20583: 0x97E4,\n\t20584: 0x97E5,\n\t20585: 0x97E8,\n\t20586: 0x97EE,\n\t20587: 0x97EF,\n\t20588: 0x97F0,\n\t20589: 0x97F1,\n\t20590: 0x97F2,\n\t20591: 0x97F4,\n\t20592: 0x97F7,\n\t20593: 0x97F8,\n\t20594: 0x97F9,\n\t20595: 0x97FA,\n\t20596: 0x97FB,\n\t20597: 0x97FC,\n\t20598: 0x97FD,\n\t20599: 0x97FE,\n\t20600: 0x97FF,\n\t20601: 0x9800,\n\t20602: 0x9801,\n\t20603: 0x9802,\n\t20604: 0x9803,\n\t20605: 0x9804,\n\t20606: 0x9805,\n\t20607: 0x9806,\n\t20608: 0x9807,\n\t20609: 0x9808,\n\t20610: 0x9809,\n\t20611: 0x980A,\n\t20612: 0x980B,\n\t20613: 0x980C,\n\t20614: 0x980D,\n\t20615: 0x980E,\n\t20616: 0x603C,\n\t20617: 0x605D,\n\t20618: 0x605A,\n\t20619: 0x6067,\n\t20620: 0x6041,\n\t20621: 0x6059,\n\t20622: 0x6063,\n\t20623: 0x60AB,\n\t20624: 0x6106,\n\t20625: 0x610D,\n\t20626: 0x615D,\n\t20627: 0x61A9,\n\t20628: 0x619D,\n\t20629: 0x61CB,\n\t20630: 0x61D1,\n\t20631: 0x6206,\n\t20632: 0x8080,\n\t20633: 0x807F,\n\t20634: 0x6C93,\n\t20635: 0x6CF6,\n\t20636: 0x6DFC,\n\t20637: 0x77F6,\n\t20638: 0x77F8,\n\t20639: 0x7800,\n\t20640: 0x7809,\n\t20641: 0x7817,\n\t20642: 0x7818,\n\t20643: 0x7811,\n\t20644: 0x65AB,\n\t20645: 0x782D,\n\t20646: 0x781C,\n\t20647: 0x781D,\n\t20648: 0x7839,\n\t20649: 0x783A,\n\t20650: 0x783B,\n\t20651: 0x781F,\n\t20652: 0x783C,\n\t20653: 0x7825,\n\t20654: 0x782C,\n\t20655: 0x7823,\n\t20656: 0x7829,\n\t20657: 0x784E,\n\t20658: 0x786D,\n\t20659: 0x7856,\n\t20660: 0x7857,\n\t20661: 0x7826,\n\t20662: 0x7850,\n\t20663: 0x7847,\n\t20664: 0x784C,\n\t20665: 0x786A,\n\t20666: 0x789B,\n\t20667: 0x7893,\n\t20668: 0x789A,\n\t20669: 0x7887,\n\t20670: 0x789C,\n\t20671: 0x78A1,\n\t20672: 0x78A3,\n\t20673: 0x78B2,\n\t20674: 0x78B9,\n\t20675: 0x78A5,\n\t20676: 0x78D4,\n\t20677: 0x78D9,\n\t20678: 0x78C9,\n\t20679: 0x78EC,\n\t20680: 0x78F2,\n\t20681: 0x7905,\n\t20682: 0x78F4,\n\t20683: 0x7913,\n\t20684: 0x7924,\n\t20685: 0x791E,\n\t20686: 0x7934,\n\t20687: 0x9F9B,\n\t20688: 0x9EF9,\n\t20689: 0x9EFB,\n\t20690: 0x9EFC,\n\t20691: 0x76F1,\n\t20692: 0x7704,\n\t20693: 0x770D,\n\t20694: 0x76F9,\n\t20695: 0x7707,\n\t20696: 0x7708,\n\t20697: 0x771A,\n\t20698: 0x7722,\n\t20699: 0x7719,\n\t20700: 0x772D,\n\t20701: 0x7726,\n\t20702: 0x7735,\n\t20703: 0x7738,\n\t20704: 0x7750,\n\t20705: 0x7751,\n\t20706: 0x7747,\n\t20707: 0x7743,\n\t20708: 0x775A,\n\t20709: 0x7768,\n\t20710: 0x980F,\n\t20711: 0x9810,\n\t20712: 0x9811,\n\t20713: 0x9812,\n\t20714: 0x9813,\n\t20715: 0x9814,\n\t20716: 0x9815,\n\t20717: 0x9816,\n\t20718: 0x9817,\n\t20719: 0x9818,\n\t20720: 0x9819,\n\t20721: 0x981A,\n\t20722: 0x981B,\n\t20723: 0x981C,\n\t20724: 0x981D,\n\t20725: 0x981E,\n\t20726: 0x981F,\n\t20727: 0x9820,\n\t20728: 0x9821,\n\t20729: 0x9822,\n\t20730: 0x9823,\n\t20731: 0x9824,\n\t20732: 0x9825,\n\t20733: 0x9826,\n\t20734: 0x9827,\n\t20735: 0x9828,\n\t20736: 0x9829,\n\t20737: 0x982A,\n\t20738: 0x982B,\n\t20739: 0x982C,\n\t20740: 0x982D,\n\t20741: 0x982E,\n\t20742: 0x982F,\n\t20743: 0x9830,\n\t20744: 0x9831,\n\t20745: 0x9832,\n\t20746: 0x9833,\n\t20747: 0x9834,\n\t20748: 0x9835,\n\t20749: 0x9836,\n\t20750: 0x9837,\n\t20751: 0x9838,\n\t20752: 0x9839,\n\t20753: 0x983A,\n\t20754: 0x983B,\n\t20755: 0x983C,\n\t20756: 0x983D,\n\t20757: 0x983E,\n\t20758: 0x983F,\n\t20759: 0x9840,\n\t20760: 0x9841,\n\t20761: 0x9842,\n\t20762: 0x9843,\n\t20763: 0x9844,\n\t20764: 0x9845,\n\t20765: 0x9846,\n\t20766: 0x9847,\n\t20767: 0x9848,\n\t20768: 0x9849,\n\t20769: 0x984A,\n\t20770: 0x984B,\n\t20771: 0x984C,\n\t20772: 0x984D,\n\t20773: 0x984E,\n\t20774: 0x984F,\n\t20775: 0x9850,\n\t20776: 0x9851,\n\t20777: 0x9852,\n\t20778: 0x9853,\n\t20779: 0x9854,\n\t20780: 0x9855,\n\t20781: 0x9856,\n\t20782: 0x9857,\n\t20783: 0x9858,\n\t20784: 0x9859,\n\t20785: 0x985A,\n\t20786: 0x985B,\n\t20787: 0x985C,\n\t20788: 0x985D,\n\t20789: 0x985E,\n\t20790: 0x985F,\n\t20791: 0x9860,\n\t20792: 0x9861,\n\t20793: 0x9862,\n\t20794: 0x9863,\n\t20795: 0x9864,\n\t20796: 0x9865,\n\t20797: 0x9866,\n\t20798: 0x9867,\n\t20799: 0x9868,\n\t20800: 0x9869,\n\t20801: 0x986A,\n\t20802: 0x986B,\n\t20803: 0x986C,\n\t20804: 0x986D,\n\t20805: 0x986E,\n\t20806: 0x7762,\n\t20807: 0x7765,\n\t20808: 0x777F,\n\t20809: 0x778D,\n\t20810: 0x777D,\n\t20811: 0x7780,\n\t20812: 0x778C,\n\t20813: 0x7791,\n\t20814: 0x779F,\n\t20815: 0x77A0,\n\t20816: 0x77B0,\n\t20817: 0x77B5,\n\t20818: 0x77BD,\n\t20819: 0x753A,\n\t20820: 0x7540,\n\t20821: 0x754E,\n\t20822: 0x754B,\n\t20823: 0x7548,\n\t20824: 0x755B,\n\t20825: 0x7572,\n\t20826: 0x7579,\n\t20827: 0x7583,\n\t20828: 0x7F58,\n\t20829: 0x7F61,\n\t20830: 0x7F5F,\n\t20831: 0x8A48,\n\t20832: 0x7F68,\n\t20833: 0x7F74,\n\t20834: 0x7F71,\n\t20835: 0x7F79,\n\t20836: 0x7F81,\n\t20837: 0x7F7E,\n\t20838: 0x76CD,\n\t20839: 0x76E5,\n\t20840: 0x8832,\n\t20841: 0x9485,\n\t20842: 0x9486,\n\t20843: 0x9487,\n\t20844: 0x948B,\n\t20845: 0x948A,\n\t20846: 0x948C,\n\t20847: 0x948D,\n\t20848: 0x948F,\n\t20849: 0x9490,\n\t20850: 0x9494,\n\t20851: 0x9497,\n\t20852: 0x9495,\n\t20853: 0x949A,\n\t20854: 0x949B,\n\t20855: 0x949C,\n\t20856: 0x94A3,\n\t20857: 0x94A4,\n\t20858: 0x94AB,\n\t20859: 0x94AA,\n\t20860: 0x94AD,\n\t20861: 0x94AC,\n\t20862: 0x94AF,\n\t20863: 0x94B0,\n\t20864: 0x94B2,\n\t20865: 0x94B4,\n\t20866: 0x94B6,\n\t20867: 0x94B7,\n\t20868: 0x94B8,\n\t20869: 0x94B9,\n\t20870: 0x94BA,\n\t20871: 0x94BC,\n\t20872: 0x94BD,\n\t20873: 0x94BF,\n\t20874: 0x94C4,\n\t20875: 0x94C8,\n\t20876: 0x94C9,\n\t20877: 0x94CA,\n\t20878: 0x94CB,\n\t20879: 0x94CC,\n\t20880: 0x94CD,\n\t20881: 0x94CE,\n\t20882: 0x94D0,\n\t20883: 0x94D1,\n\t20884: 0x94D2,\n\t20885: 0x94D5,\n\t20886: 0x94D6,\n\t20887: 0x94D7,\n\t20888: 0x94D9,\n\t20889: 0x94D8,\n\t20890: 0x94DB,\n\t20891: 0x94DE,\n\t20892: 0x94DF,\n\t20893: 0x94E0,\n\t20894: 0x94E2,\n\t20895: 0x94E4,\n\t20896: 0x94E5,\n\t20897: 0x94E7,\n\t20898: 0x94E8,\n\t20899: 0x94EA,\n\t20900: 0x986F,\n\t20901: 0x9870,\n\t20902: 0x9871,\n\t20903: 0x9872,\n\t20904: 0x9873,\n\t20905: 0x9874,\n\t20906: 0x988B,\n\t20907: 0x988E,\n\t20908: 0x9892,\n\t20909: 0x9895,\n\t20910: 0x9899,\n\t20911: 0x98A3,\n\t20912: 0x98A8,\n\t20913: 0x98A9,\n\t20914: 0x98AA,\n\t20915: 0x98AB,\n\t20916: 0x98AC,\n\t20917: 0x98AD,\n\t20918: 0x98AE,\n\t20919: 0x98AF,\n\t20920: 0x98B0,\n\t20921: 0x98B1,\n\t20922: 0x98B2,\n\t20923: 0x98B3,\n\t20924: 0x98B4,\n\t20925: 0x98B5,\n\t20926: 0x98B6,\n\t20927: 0x98B7,\n\t20928: 0x98B8,\n\t20929: 0x98B9,\n\t20930: 0x98BA,\n\t20931: 0x98BB,\n\t20932: 0x98BC,\n\t20933: 0x98BD,\n\t20934: 0x98BE,\n\t20935: 0x98BF,\n\t20936: 0x98C0,\n\t20937: 0x98C1,\n\t20938: 0x98C2,\n\t20939: 0x98C3,\n\t20940: 0x98C4,\n\t20941: 0x98C5,\n\t20942: 0x98C6,\n\t20943: 0x98C7,\n\t20944: 0x98C8,\n\t20945: 0x98C9,\n\t20946: 0x98CA,\n\t20947: 0x98CB,\n\t20948: 0x98CC,\n\t20949: 0x98CD,\n\t20950: 0x98CF,\n\t20951: 0x98D0,\n\t20952: 0x98D4,\n\t20953: 0x98D6,\n\t20954: 0x98D7,\n\t20955: 0x98DB,\n\t20956: 0x98DC,\n\t20957: 0x98DD,\n\t20958: 0x98E0,\n\t20959: 0x98E1,\n\t20960: 0x98E2,\n\t20961: 0x98E3,\n\t20962: 0x98E4,\n\t20963: 0x98E5,\n\t20964: 0x98E6,\n\t20965: 0x98E9,\n\t20966: 0x98EA,\n\t20967: 0x98EB,\n\t20968: 0x98EC,\n\t20969: 0x98ED,\n\t20970: 0x98EE,\n\t20971: 0x98EF,\n\t20972: 0x98F0,\n\t20973: 0x98F1,\n\t20974: 0x98F2,\n\t20975: 0x98F3,\n\t20976: 0x98F4,\n\t20977: 0x98F5,\n\t20978: 0x98F6,\n\t20979: 0x98F7,\n\t20980: 0x98F8,\n\t20981: 0x98F9,\n\t20982: 0x98FA,\n\t20983: 0x98FB,\n\t20984: 0x98FC,\n\t20985: 0x98FD,\n\t20986: 0x98FE,\n\t20987: 0x98FF,\n\t20988: 0x9900,\n\t20989: 0x9901,\n\t20990: 0x9902,\n\t20991: 0x9903,\n\t20992: 0x9904,\n\t20993: 0x9905,\n\t20994: 0x9906,\n\t20995: 0x9907,\n\t20996: 0x94E9,\n\t20997: 0x94EB,\n\t20998: 0x94EE,\n\t20999: 0x94EF,\n\t21000: 0x94F3,\n\t21001: 0x94F4,\n\t21002: 0x94F5,\n\t21003: 0x94F7,\n\t21004: 0x94F9,\n\t21005: 0x94FC,\n\t21006: 0x94FD,\n\t21007: 0x94FF,\n\t21008: 0x9503,\n\t21009: 0x9502,\n\t21010: 0x9506,\n\t21011: 0x9507,\n\t21012: 0x9509,\n\t21013: 0x950A,\n\t21014: 0x950D,\n\t21015: 0x950E,\n\t21016: 0x950F,\n\t21017: 0x9512,\n\t21018: 0x9513,\n\t21019: 0x9514,\n\t21020: 0x9515,\n\t21021: 0x9516,\n\t21022: 0x9518,\n\t21023: 0x951B,\n\t21024: 0x951D,\n\t21025: 0x951E,\n\t21026: 0x951F,\n\t21027: 0x9522,\n\t21028: 0x952A,\n\t21029: 0x952B,\n\t21030: 0x9529,\n\t21031: 0x952C,\n\t21032: 0x9531,\n\t21033: 0x9532,\n\t21034: 0x9534,\n\t21035: 0x9536,\n\t21036: 0x9537,\n\t21037: 0x9538,\n\t21038: 0x953C,\n\t21039: 0x953E,\n\t21040: 0x953F,\n\t21041: 0x9542,\n\t21042: 0x9535,\n\t21043: 0x9544,\n\t21044: 0x9545,\n\t21045: 0x9546,\n\t21046: 0x9549,\n\t21047: 0x954C,\n\t21048: 0x954E,\n\t21049: 0x954F,\n\t21050: 0x9552,\n\t21051: 0x9553,\n\t21052: 0x9554,\n\t21053: 0x9556,\n\t21054: 0x9557,\n\t21055: 0x9558,\n\t21056: 0x9559,\n\t21057: 0x955B,\n\t21058: 0x955E,\n\t21059: 0x955F,\n\t21060: 0x955D,\n\t21061: 0x9561,\n\t21062: 0x9562,\n\t21063: 0x9564,\n\t21064: 0x9565,\n\t21065: 0x9566,\n\t21066: 0x9567,\n\t21067: 0x9568,\n\t21068: 0x9569,\n\t21069: 0x956A,\n\t21070: 0x956B,\n\t21071: 0x956C,\n\t21072: 0x956F,\n\t21073: 0x9571,\n\t21074: 0x9572,\n\t21075: 0x9573,\n\t21076: 0x953A,\n\t21077: 0x77E7,\n\t21078: 0x77EC,\n\t21079: 0x96C9,\n\t21080: 0x79D5,\n\t21081: 0x79ED,\n\t21082: 0x79E3,\n\t21083: 0x79EB,\n\t21084: 0x7A06,\n\t21085: 0x5D47,\n\t21086: 0x7A03,\n\t21087: 0x7A02,\n\t21088: 0x7A1E,\n\t21089: 0x7A14,\n\t21090: 0x9908,\n\t21091: 0x9909,\n\t21092: 0x990A,\n\t21093: 0x990B,\n\t21094: 0x990C,\n\t21095: 0x990E,\n\t21096: 0x990F,\n\t21097: 0x9911,\n\t21098: 0x9912,\n\t21099: 0x9913,\n\t21100: 0x9914,\n\t21101: 0x9915,\n\t21102: 0x9916,\n\t21103: 0x9917,\n\t21104: 0x9918,\n\t21105: 0x9919,\n\t21106: 0x991A,\n\t21107: 0x991B,\n\t21108: 0x991C,\n\t21109: 0x991D,\n\t21110: 0x991E,\n\t21111: 0x991F,\n\t21112: 0x9920,\n\t21113: 0x9921,\n\t21114: 0x9922,\n\t21115: 0x9923,\n\t21116: 0x9924,\n\t21117: 0x9925,\n\t21118: 0x9926,\n\t21119: 0x9927,\n\t21120: 0x9928,\n\t21121: 0x9929,\n\t21122: 0x992A,\n\t21123: 0x992B,\n\t21124: 0x992C,\n\t21125: 0x992D,\n\t21126: 0x992F,\n\t21127: 0x9930,\n\t21128: 0x9931,\n\t21129: 0x9932,\n\t21130: 0x9933,\n\t21131: 0x9934,\n\t21132: 0x9935,\n\t21133: 0x9936,\n\t21134: 0x9937,\n\t21135: 0x9938,\n\t21136: 0x9939,\n\t21137: 0x993A,\n\t21138: 0x993B,\n\t21139: 0x993C,\n\t21140: 0x993D,\n\t21141: 0x993E,\n\t21142: 0x993F,\n\t21143: 0x9940,\n\t21144: 0x9941,\n\t21145: 0x9942,\n\t21146: 0x9943,\n\t21147: 0x9944,\n\t21148: 0x9945,\n\t21149: 0x9946,\n\t21150: 0x9947,\n\t21151: 0x9948,\n\t21152: 0x9949,\n\t21153: 0x994A,\n\t21154: 0x994B,\n\t21155: 0x994C,\n\t21156: 0x994D,\n\t21157: 0x994E,\n\t21158: 0x994F,\n\t21159: 0x9950,\n\t21160: 0x9951,\n\t21161: 0x9952,\n\t21162: 0x9953,\n\t21163: 0x9956,\n\t21164: 0x9957,\n\t21165: 0x9958,\n\t21166: 0x9959,\n\t21167: 0x995A,\n\t21168: 0x995B,\n\t21169: 0x995C,\n\t21170: 0x995D,\n\t21171: 0x995E,\n\t21172: 0x995F,\n\t21173: 0x9960,\n\t21174: 0x9961,\n\t21175: 0x9962,\n\t21176: 0x9964,\n\t21177: 0x9966,\n\t21178: 0x9973,\n\t21179: 0x9978,\n\t21180: 0x9979,\n\t21181: 0x997B,\n\t21182: 0x997E,\n\t21183: 0x9982,\n\t21184: 0x9983,\n\t21185: 0x9989,\n\t21186: 0x7A39,\n\t21187: 0x7A37,\n\t21188: 0x7A51,\n\t21189: 0x9ECF,\n\t21190: 0x99A5,\n\t21191: 0x7A70,\n\t21192: 0x7688,\n\t21193: 0x768E,\n\t21194: 0x7693,\n\t21195: 0x7699,\n\t21196: 0x76A4,\n\t21197: 0x74DE,\n\t21198: 0x74E0,\n\t21199: 0x752C,\n\t21200: 0x9E20,\n\t21201: 0x9E22,\n\t21202: 0x9E28,\n\t21203: 0x9E29,\n\t21204: 0x9E2A,\n\t21205: 0x9E2B,\n\t21206: 0x9E2C,\n\t21207: 0x9E32,\n\t21208: 0x9E31,\n\t21209: 0x9E36,\n\t21210: 0x9E38,\n\t21211: 0x9E37,\n\t21212: 0x9E39,\n\t21213: 0x9E3A,\n\t21214: 0x9E3E,\n\t21215: 0x9E41,\n\t21216: 0x9E42,\n\t21217: 0x9E44,\n\t21218: 0x9E46,\n\t21219: 0x9E47,\n\t21220: 0x9E48,\n\t21221: 0x9E49,\n\t21222: 0x9E4B,\n\t21223: 0x9E4C,\n\t21224: 0x9E4E,\n\t21225: 0x9E51,\n\t21226: 0x9E55,\n\t21227: 0x9E57,\n\t21228: 0x9E5A,\n\t21229: 0x9E5B,\n\t21230: 0x9E5C,\n\t21231: 0x9E5E,\n\t21232: 0x9E63,\n\t21233: 0x9E66,\n\t21234: 0x9E67,\n\t21235: 0x9E68,\n\t21236: 0x9E69,\n\t21237: 0x9E6A,\n\t21238: 0x9E6B,\n\t21239: 0x9E6C,\n\t21240: 0x9E71,\n\t21241: 0x9E6D,\n\t21242: 0x9E73,\n\t21243: 0x7592,\n\t21244: 0x7594,\n\t21245: 0x7596,\n\t21246: 0x75A0,\n\t21247: 0x759D,\n\t21248: 0x75AC,\n\t21249: 0x75A3,\n\t21250: 0x75B3,\n\t21251: 0x75B4,\n\t21252: 0x75B8,\n\t21253: 0x75C4,\n\t21254: 0x75B1,\n\t21255: 0x75B0,\n\t21256: 0x75C3,\n\t21257: 0x75C2,\n\t21258: 0x75D6,\n\t21259: 0x75CD,\n\t21260: 0x75E3,\n\t21261: 0x75E8,\n\t21262: 0x75E6,\n\t21263: 0x75E4,\n\t21264: 0x75EB,\n\t21265: 0x75E7,\n\t21266: 0x7603,\n\t21267: 0x75F1,\n\t21268: 0x75FC,\n\t21269: 0x75FF,\n\t21270: 0x7610,\n\t21271: 0x7600,\n\t21272: 0x7605,\n\t21273: 0x760C,\n\t21274: 0x7617,\n\t21275: 0x760A,\n\t21276: 0x7625,\n\t21277: 0x7618,\n\t21278: 0x7615,\n\t21279: 0x7619,\n\t21280: 0x998C,\n\t21281: 0x998E,\n\t21282: 0x999A,\n\t21283: 0x999B,\n\t21284: 0x999C,\n\t21285: 0x999D,\n\t21286: 0x999E,\n\t21287: 0x999F,\n\t21288: 0x99A0,\n\t21289: 0x99A1,\n\t21290: 0x99A2,\n\t21291: 0x99A3,\n\t21292: 0x99A4,\n\t21293: 0x99A6,\n\t21294: 0x99A7,\n\t21295: 0x99A9,\n\t21296: 0x99AA,\n\t21297: 0x99AB,\n\t21298: 0x99AC,\n\t21299: 0x99AD,\n\t21300: 0x99AE,\n\t21301: 0x99AF,\n\t21302: 0x99B0,\n\t21303: 0x99B1,\n\t21304: 0x99B2,\n\t21305: 0x99B3,\n\t21306: 0x99B4,\n\t21307: 0x99B5,\n\t21308: 0x99B6,\n\t21309: 0x99B7,\n\t21310: 0x99B8,\n\t21311: 0x99B9,\n\t21312: 0x99BA,\n\t21313: 0x99BB,\n\t21314: 0x99BC,\n\t21315: 0x99BD,\n\t21316: 0x99BE,\n\t21317: 0x99BF,\n\t21318: 0x99C0,\n\t21319: 0x99C1,\n\t21320: 0x99C2,\n\t21321: 0x99C3,\n\t21322: 0x99C4,\n\t21323: 0x99C5,\n\t21324: 0x99C6,\n\t21325: 0x99C7,\n\t21326: 0x99C8,\n\t21327: 0x99C9,\n\t21328: 0x99CA,\n\t21329: 0x99CB,\n\t21330: 0x99CC,\n\t21331: 0x99CD,\n\t21332: 0x99CE,\n\t21333: 0x99CF,\n\t21334: 0x99D0,\n\t21335: 0x99D1,\n\t21336: 0x99D2,\n\t21337: 0x99D3,\n\t21338: 0x99D4,\n\t21339: 0x99D5,\n\t21340: 0x99D6,\n\t21341: 0x99D7,\n\t21342: 0x99D8,\n\t21343: 0x99D9,\n\t21344: 0x99DA,\n\t21345: 0x99DB,\n\t21346: 0x99DC,\n\t21347: 0x99DD,\n\t21348: 0x99DE,\n\t21349: 0x99DF,\n\t21350: 0x99E0,\n\t21351: 0x99E1,\n\t21352: 0x99E2,\n\t21353: 0x99E3,\n\t21354: 0x99E4,\n\t21355: 0x99E5,\n\t21356: 0x99E6,\n\t21357: 0x99E7,\n\t21358: 0x99E8,\n\t21359: 0x99E9,\n\t21360: 0x99EA,\n\t21361: 0x99EB,\n\t21362: 0x99EC,\n\t21363: 0x99ED,\n\t21364: 0x99EE,\n\t21365: 0x99EF,\n\t21366: 0x99F0,\n\t21367: 0x99F1,\n\t21368: 0x99F2,\n\t21369: 0x99F3,\n\t21370: 0x99F4,\n\t21371: 0x99F5,\n\t21372: 0x99F6,\n\t21373: 0x99F7,\n\t21374: 0x99F8,\n\t21375: 0x99F9,\n\t21376: 0x761B,\n\t21377: 0x763C,\n\t21378: 0x7622,\n\t21379: 0x7620,\n\t21380: 0x7640,\n\t21381: 0x762D,\n\t21382: 0x7630,\n\t21383: 0x763F,\n\t21384: 0x7635,\n\t21385: 0x7643,\n\t21386: 0x763E,\n\t21387: 0x7633,\n\t21388: 0x764D,\n\t21389: 0x765E,\n\t21390: 0x7654,\n\t21391: 0x765C,\n\t21392: 0x7656,\n\t21393: 0x766B,\n\t21394: 0x766F,\n\t21395: 0x7FCA,\n\t21396: 0x7AE6,\n\t21397: 0x7A78,\n\t21398: 0x7A79,\n\t21399: 0x7A80,\n\t21400: 0x7A86,\n\t21401: 0x7A88,\n\t21402: 0x7A95,\n\t21403: 0x7AA6,\n\t21404: 0x7AA0,\n\t21405: 0x7AAC,\n\t21406: 0x7AA8,\n\t21407: 0x7AAD,\n\t21408: 0x7AB3,\n\t21409: 0x8864,\n\t21410: 0x8869,\n\t21411: 0x8872,\n\t21412: 0x887D,\n\t21413: 0x887F,\n\t21414: 0x8882,\n\t21415: 0x88A2,\n\t21416: 0x88C6,\n\t21417: 0x88B7,\n\t21418: 0x88BC,\n\t21419: 0x88C9,\n\t21420: 0x88E2,\n\t21421: 0x88CE,\n\t21422: 0x88E3,\n\t21423: 0x88E5,\n\t21424: 0x88F1,\n\t21425: 0x891A,\n\t21426: 0x88FC,\n\t21427: 0x88E8,\n\t21428: 0x88FE,\n\t21429: 0x88F0,\n\t21430: 0x8921,\n\t21431: 0x8919,\n\t21432: 0x8913,\n\t21433: 0x891B,\n\t21434: 0x890A,\n\t21435: 0x8934,\n\t21436: 0x892B,\n\t21437: 0x8936,\n\t21438: 0x8941,\n\t21439: 0x8966,\n\t21440: 0x897B,\n\t21441: 0x758B,\n\t21442: 0x80E5,\n\t21443: 0x76B2,\n\t21444: 0x76B4,\n\t21445: 0x77DC,\n\t21446: 0x8012,\n\t21447: 0x8014,\n\t21448: 0x8016,\n\t21449: 0x801C,\n\t21450: 0x8020,\n\t21451: 0x8022,\n\t21452: 0x8025,\n\t21453: 0x8026,\n\t21454: 0x8027,\n\t21455: 0x8029,\n\t21456: 0x8028,\n\t21457: 0x8031,\n\t21458: 0x800B,\n\t21459: 0x8035,\n\t21460: 0x8043,\n\t21461: 0x8046,\n\t21462: 0x804D,\n\t21463: 0x8052,\n\t21464: 0x8069,\n\t21465: 0x8071,\n\t21466: 0x8983,\n\t21467: 0x9878,\n\t21468: 0x9880,\n\t21469: 0x9883,\n\t21470: 0x99FA,\n\t21471: 0x99FB,\n\t21472: 0x99FC,\n\t21473: 0x99FD,\n\t21474: 0x99FE,\n\t21475: 0x99FF,\n\t21476: 0x9A00,\n\t21477: 0x9A01,\n\t21478: 0x9A02,\n\t21479: 0x9A03,\n\t21480: 0x9A04,\n\t21481: 0x9A05,\n\t21482: 0x9A06,\n\t21483: 0x9A07,\n\t21484: 0x9A08,\n\t21485: 0x9A09,\n\t21486: 0x9A0A,\n\t21487: 0x9A0B,\n\t21488: 0x9A0C,\n\t21489: 0x9A0D,\n\t21490: 0x9A0E,\n\t21491: 0x9A0F,\n\t21492: 0x9A10,\n\t21493: 0x9A11,\n\t21494: 0x9A12,\n\t21495: 0x9A13,\n\t21496: 0x9A14,\n\t21497: 0x9A15,\n\t21498: 0x9A16,\n\t21499: 0x9A17,\n\t21500: 0x9A18,\n\t21501: 0x9A19,\n\t21502: 0x9A1A,\n\t21503: 0x9A1B,\n\t21504: 0x9A1C,\n\t21505: 0x9A1D,\n\t21506: 0x9A1E,\n\t21507: 0x9A1F,\n\t21508: 0x9A20,\n\t21509: 0x9A21,\n\t21510: 0x9A22,\n\t21511: 0x9A23,\n\t21512: 0x9A24,\n\t21513: 0x9A25,\n\t21514: 0x9A26,\n\t21515: 0x9A27,\n\t21516: 0x9A28,\n\t21517: 0x9A29,\n\t21518: 0x9A2A,\n\t21519: 0x9A2B,\n\t21520: 0x9A2C,\n\t21521: 0x9A2D,\n\t21522: 0x9A2E,\n\t21523: 0x9A2F,\n\t21524: 0x9A30,\n\t21525: 0x9A31,\n\t21526: 0x9A32,\n\t21527: 0x9A33,\n\t21528: 0x9A34,\n\t21529: 0x9A35,\n\t21530: 0x9A36,\n\t21531: 0x9A37,\n\t21532: 0x9A38,\n\t21533: 0x9A39,\n\t21534: 0x9A3A,\n\t21535: 0x9A3B,\n\t21536: 0x9A3C,\n\t21537: 0x9A3D,\n\t21538: 0x9A3E,\n\t21539: 0x9A3F,\n\t21540: 0x9A40,\n\t21541: 0x9A41,\n\t21542: 0x9A42,\n\t21543: 0x9A43,\n\t21544: 0x9A44,\n\t21545: 0x9A45,\n\t21546: 0x9A46,\n\t21547: 0x9A47,\n\t21548: 0x9A48,\n\t21549: 0x9A49,\n\t21550: 0x9A4A,\n\t21551: 0x9A4B,\n\t21552: 0x9A4C,\n\t21553: 0x9A4D,\n\t21554: 0x9A4E,\n\t21555: 0x9A4F,\n\t21556: 0x9A50,\n\t21557: 0x9A51,\n\t21558: 0x9A52,\n\t21559: 0x9A53,\n\t21560: 0x9A54,\n\t21561: 0x9A55,\n\t21562: 0x9A56,\n\t21563: 0x9A57,\n\t21564: 0x9A58,\n\t21565: 0x9A59,\n\t21566: 0x9889,\n\t21567: 0x988C,\n\t21568: 0x988D,\n\t21569: 0x988F,\n\t21570: 0x9894,\n\t21571: 0x989A,\n\t21572: 0x989B,\n\t21573: 0x989E,\n\t21574: 0x989F,\n\t21575: 0x98A1,\n\t21576: 0x98A2,\n\t21577: 0x98A5,\n\t21578: 0x98A6,\n\t21579: 0x864D,\n\t21580: 0x8654,\n\t21581: 0x866C,\n\t21582: 0x866E,\n\t21583: 0x867F,\n\t21584: 0x867A,\n\t21585: 0x867C,\n\t21586: 0x867B,\n\t21587: 0x86A8,\n\t21588: 0x868D,\n\t21589: 0x868B,\n\t21590: 0x86AC,\n\t21591: 0x869D,\n\t21592: 0x86A7,\n\t21593: 0x86A3,\n\t21594: 0x86AA,\n\t21595: 0x8693,\n\t21596: 0x86A9,\n\t21597: 0x86B6,\n\t21598: 0x86C4,\n\t21599: 0x86B5,\n\t21600: 0x86CE,\n\t21601: 0x86B0,\n\t21602: 0x86BA,\n\t21603: 0x86B1,\n\t21604: 0x86AF,\n\t21605: 0x86C9,\n\t21606: 0x86CF,\n\t21607: 0x86B4,\n\t21608: 0x86E9,\n\t21609: 0x86F1,\n\t21610: 0x86F2,\n\t21611: 0x86ED,\n\t21612: 0x86F3,\n\t21613: 0x86D0,\n\t21614: 0x8713,\n\t21615: 0x86DE,\n\t21616: 0x86F4,\n\t21617: 0x86DF,\n\t21618: 0x86D8,\n\t21619: 0x86D1,\n\t21620: 0x8703,\n\t21621: 0x8707,\n\t21622: 0x86F8,\n\t21623: 0x8708,\n\t21624: 0x870A,\n\t21625: 0x870D,\n\t21626: 0x8709,\n\t21627: 0x8723,\n\t21628: 0x873B,\n\t21629: 0x871E,\n\t21630: 0x8725,\n\t21631: 0x872E,\n\t21632: 0x871A,\n\t21633: 0x873E,\n\t21634: 0x8748,\n\t21635: 0x8734,\n\t21636: 0x8731,\n\t21637: 0x8729,\n\t21638: 0x8737,\n\t21639: 0x873F,\n\t21640: 0x8782,\n\t21641: 0x8722,\n\t21642: 0x877D,\n\t21643: 0x877E,\n\t21644: 0x877B,\n\t21645: 0x8760,\n\t21646: 0x8770,\n\t21647: 0x874C,\n\t21648: 0x876E,\n\t21649: 0x878B,\n\t21650: 0x8753,\n\t21651: 0x8763,\n\t21652: 0x877C,\n\t21653: 0x8764,\n\t21654: 0x8759,\n\t21655: 0x8765,\n\t21656: 0x8793,\n\t21657: 0x87AF,\n\t21658: 0x87A8,\n\t21659: 0x87D2,\n\t21660: 0x9A5A,\n\t21661: 0x9A5B,\n\t21662: 0x9A5C,\n\t21663: 0x9A5D,\n\t21664: 0x9A5E,\n\t21665: 0x9A5F,\n\t21666: 0x9A60,\n\t21667: 0x9A61,\n\t21668: 0x9A62,\n\t21669: 0x9A63,\n\t21670: 0x9A64,\n\t21671: 0x9A65,\n\t21672: 0x9A66,\n\t21673: 0x9A67,\n\t21674: 0x9A68,\n\t21675: 0x9A69,\n\t21676: 0x9A6A,\n\t21677: 0x9A6B,\n\t21678: 0x9A72,\n\t21679: 0x9A83,\n\t21680: 0x9A89,\n\t21681: 0x9A8D,\n\t21682: 0x9A8E,\n\t21683: 0x9A94,\n\t21684: 0x9A95,\n\t21685: 0x9A99,\n\t21686: 0x9AA6,\n\t21687: 0x9AA9,\n\t21688: 0x9AAA,\n\t21689: 0x9AAB,\n\t21690: 0x9AAC,\n\t21691: 0x9AAD,\n\t21692: 0x9AAE,\n\t21693: 0x9AAF,\n\t21694: 0x9AB2,\n\t21695: 0x9AB3,\n\t21696: 0x9AB4,\n\t21697: 0x9AB5,\n\t21698: 0x9AB9,\n\t21699: 0x9ABB,\n\t21700: 0x9ABD,\n\t21701: 0x9ABE,\n\t21702: 0x9ABF,\n\t21703: 0x9AC3,\n\t21704: 0x9AC4,\n\t21705: 0x9AC6,\n\t21706: 0x9AC7,\n\t21707: 0x9AC8,\n\t21708: 0x9AC9,\n\t21709: 0x9ACA,\n\t21710: 0x9ACD,\n\t21711: 0x9ACE,\n\t21712: 0x9ACF,\n\t21713: 0x9AD0,\n\t21714: 0x9AD2,\n\t21715: 0x9AD4,\n\t21716: 0x9AD5,\n\t21717: 0x9AD6,\n\t21718: 0x9AD7,\n\t21719: 0x9AD9,\n\t21720: 0x9ADA,\n\t21721: 0x9ADB,\n\t21722: 0x9ADC,\n\t21723: 0x9ADD,\n\t21724: 0x9ADE,\n\t21725: 0x9AE0,\n\t21726: 0x9AE2,\n\t21727: 0x9AE3,\n\t21728: 0x9AE4,\n\t21729: 0x9AE5,\n\t21730: 0x9AE7,\n\t21731: 0x9AE8,\n\t21732: 0x9AE9,\n\t21733: 0x9AEA,\n\t21734: 0x9AEC,\n\t21735: 0x9AEE,\n\t21736: 0x9AF0,\n\t21737: 0x9AF1,\n\t21738: 0x9AF2,\n\t21739: 0x9AF3,\n\t21740: 0x9AF4,\n\t21741: 0x9AF5,\n\t21742: 0x9AF6,\n\t21743: 0x9AF7,\n\t21744: 0x9AF8,\n\t21745: 0x9AFA,\n\t21746: 0x9AFC,\n\t21747: 0x9AFD,\n\t21748: 0x9AFE,\n\t21749: 0x9AFF,\n\t21750: 0x9B00,\n\t21751: 0x9B01,\n\t21752: 0x9B02,\n\t21753: 0x9B04,\n\t21754: 0x9B05,\n\t21755: 0x9B06,\n\t21756: 0x87C6,\n\t21757: 0x8788,\n\t21758: 0x8785,\n\t21759: 0x87AD,\n\t21760: 0x8797,\n\t21761: 0x8783,\n\t21762: 0x87AB,\n\t21763: 0x87E5,\n\t21764: 0x87AC,\n\t21765: 0x87B5,\n\t21766: 0x87B3,\n\t21767: 0x87CB,\n\t21768: 0x87D3,\n\t21769: 0x87BD,\n\t21770: 0x87D1,\n\t21771: 0x87C0,\n\t21772: 0x87CA,\n\t21773: 0x87DB,\n\t21774: 0x87EA,\n\t21775: 0x87E0,\n\t21776: 0x87EE,\n\t21777: 0x8816,\n\t21778: 0x8813,\n\t21779: 0x87FE,\n\t21780: 0x880A,\n\t21781: 0x881B,\n\t21782: 0x8821,\n\t21783: 0x8839,\n\t21784: 0x883C,\n\t21785: 0x7F36,\n\t21786: 0x7F42,\n\t21787: 0x7F44,\n\t21788: 0x7F45,\n\t21789: 0x8210,\n\t21790: 0x7AFA,\n\t21791: 0x7AFD,\n\t21792: 0x7B08,\n\t21793: 0x7B03,\n\t21794: 0x7B04,\n\t21795: 0x7B15,\n\t21796: 0x7B0A,\n\t21797: 0x7B2B,\n\t21798: 0x7B0F,\n\t21799: 0x7B47,\n\t21800: 0x7B38,\n\t21801: 0x7B2A,\n\t21802: 0x7B19,\n\t21803: 0x7B2E,\n\t21804: 0x7B31,\n\t21805: 0x7B20,\n\t21806: 0x7B25,\n\t21807: 0x7B24,\n\t21808: 0x7B33,\n\t21809: 0x7B3E,\n\t21810: 0x7B1E,\n\t21811: 0x7B58,\n\t21812: 0x7B5A,\n\t21813: 0x7B45,\n\t21814: 0x7B75,\n\t21815: 0x7B4C,\n\t21816: 0x7B5D,\n\t21817: 0x7B60,\n\t21818: 0x7B6E,\n\t21819: 0x7B7B,\n\t21820: 0x7B62,\n\t21821: 0x7B72,\n\t21822: 0x7B71,\n\t21823: 0x7B90,\n\t21824: 0x7BA6,\n\t21825: 0x7BA7,\n\t21826: 0x7BB8,\n\t21827: 0x7BAC,\n\t21828: 0x7B9D,\n\t21829: 0x7BA8,\n\t21830: 0x7B85,\n\t21831: 0x7BAA,\n\t21832: 0x7B9C,\n\t21833: 0x7BA2,\n\t21834: 0x7BAB,\n\t21835: 0x7BB4,\n\t21836: 0x7BD1,\n\t21837: 0x7BC1,\n\t21838: 0x7BCC,\n\t21839: 0x7BDD,\n\t21840: 0x7BDA,\n\t21841: 0x7BE5,\n\t21842: 0x7BE6,\n\t21843: 0x7BEA,\n\t21844: 0x7C0C,\n\t21845: 0x7BFE,\n\t21846: 0x7BFC,\n\t21847: 0x7C0F,\n\t21848: 0x7C16,\n\t21849: 0x7C0B,\n\t21850: 0x9B07,\n\t21851: 0x9B09,\n\t21852: 0x9B0A,\n\t21853: 0x9B0B,\n\t21854: 0x9B0C,\n\t21855: 0x9B0D,\n\t21856: 0x9B0E,\n\t21857: 0x9B10,\n\t21858: 0x9B11,\n\t21859: 0x9B12,\n\t21860: 0x9B14,\n\t21861: 0x9B15,\n\t21862: 0x9B16,\n\t21863: 0x9B17,\n\t21864: 0x9B18,\n\t21865: 0x9B19,\n\t21866: 0x9B1A,\n\t21867: 0x9B1B,\n\t21868: 0x9B1C,\n\t21869: 0x9B1D,\n\t21870: 0x9B1E,\n\t21871: 0x9B20,\n\t21872: 0x9B21,\n\t21873: 0x9B22,\n\t21874: 0x9B24,\n\t21875: 0x9B25,\n\t21876: 0x9B26,\n\t21877: 0x9B27,\n\t21878: 0x9B28,\n\t21879: 0x9B29,\n\t21880: 0x9B2A,\n\t21881: 0x9B2B,\n\t21882: 0x9B2C,\n\t21883: 0x9B2D,\n\t21884: 0x9B2E,\n\t21885: 0x9B30,\n\t21886: 0x9B31,\n\t21887: 0x9B33,\n\t21888: 0x9B34,\n\t21889: 0x9B35,\n\t21890: 0x9B36,\n\t21891: 0x9B37,\n\t21892: 0x9B38,\n\t21893: 0x9B39,\n\t21894: 0x9B3A,\n\t21895: 0x9B3D,\n\t21896: 0x9B3E,\n\t21897: 0x9B3F,\n\t21898: 0x9B40,\n\t21899: 0x9B46,\n\t21900: 0x9B4A,\n\t21901: 0x9B4B,\n\t21902: 0x9B4C,\n\t21903: 0x9B4E,\n\t21904: 0x9B50,\n\t21905: 0x9B52,\n\t21906: 0x9B53,\n\t21907: 0x9B55,\n\t21908: 0x9B56,\n\t21909: 0x9B57,\n\t21910: 0x9B58,\n\t21911: 0x9B59,\n\t21912: 0x9B5A,\n\t21913: 0x9B5B,\n\t21914: 0x9B5C,\n\t21915: 0x9B5D,\n\t21916: 0x9B5E,\n\t21917: 0x9B5F,\n\t21918: 0x9B60,\n\t21919: 0x9B61,\n\t21920: 0x9B62,\n\t21921: 0x9B63,\n\t21922: 0x9B64,\n\t21923: 0x9B65,\n\t21924: 0x9B66,\n\t21925: 0x9B67,\n\t21926: 0x9B68,\n\t21927: 0x9B69,\n\t21928: 0x9B6A,\n\t21929: 0x9B6B,\n\t21930: 0x9B6C,\n\t21931: 0x9B6D,\n\t21932: 0x9B6E,\n\t21933: 0x9B6F,\n\t21934: 0x9B70,\n\t21935: 0x9B71,\n\t21936: 0x9B72,\n\t21937: 0x9B73,\n\t21938: 0x9B74,\n\t21939: 0x9B75,\n\t21940: 0x9B76,\n\t21941: 0x9B77,\n\t21942: 0x9B78,\n\t21943: 0x9B79,\n\t21944: 0x9B7A,\n\t21945: 0x9B7B,\n\t21946: 0x7C1F,\n\t21947: 0x7C2A,\n\t21948: 0x7C26,\n\t21949: 0x7C38,\n\t21950: 0x7C41,\n\t21951: 0x7C40,\n\t21952: 0x81FE,\n\t21953: 0x8201,\n\t21954: 0x8202,\n\t21955: 0x8204,\n\t21956: 0x81EC,\n\t21957: 0x8844,\n\t21958: 0x8221,\n\t21959: 0x8222,\n\t21960: 0x8223,\n\t21961: 0x822D,\n\t21962: 0x822F,\n\t21963: 0x8228,\n\t21964: 0x822B,\n\t21965: 0x8238,\n\t21966: 0x823B,\n\t21967: 0x8233,\n\t21968: 0x8234,\n\t21969: 0x823E,\n\t21970: 0x8244,\n\t21971: 0x8249,\n\t21972: 0x824B,\n\t21973: 0x824F,\n\t21974: 0x825A,\n\t21975: 0x825F,\n\t21976: 0x8268,\n\t21977: 0x887E,\n\t21978: 0x8885,\n\t21979: 0x8888,\n\t21980: 0x88D8,\n\t21981: 0x88DF,\n\t21982: 0x895E,\n\t21983: 0x7F9D,\n\t21984: 0x7F9F,\n\t21985: 0x7FA7,\n\t21986: 0x7FAF,\n\t21987: 0x7FB0,\n\t21988: 0x7FB2,\n\t21989: 0x7C7C,\n\t21990: 0x6549,\n\t21991: 0x7C91,\n\t21992: 0x7C9D,\n\t21993: 0x7C9C,\n\t21994: 0x7C9E,\n\t21995: 0x7CA2,\n\t21996: 0x7CB2,\n\t21997: 0x7CBC,\n\t21998: 0x7CBD,\n\t21999: 0x7CC1,\n\t22000: 0x7CC7,\n\t22001: 0x7CCC,\n\t22002: 0x7CCD,\n\t22003: 0x7CC8,\n\t22004: 0x7CC5,\n\t22005: 0x7CD7,\n\t22006: 0x7CE8,\n\t22007: 0x826E,\n\t22008: 0x66A8,\n\t22009: 0x7FBF,\n\t22010: 0x7FCE,\n\t22011: 0x7FD5,\n\t22012: 0x7FE5,\n\t22013: 0x7FE1,\n\t22014: 0x7FE6,\n\t22015: 0x7FE9,\n\t22016: 0x7FEE,\n\t22017: 0x7FF3,\n\t22018: 0x7CF8,\n\t22019: 0x7D77,\n\t22020: 0x7DA6,\n\t22021: 0x7DAE,\n\t22022: 0x7E47,\n\t22023: 0x7E9B,\n\t22024: 0x9EB8,\n\t22025: 0x9EB4,\n\t22026: 0x8D73,\n\t22027: 0x8D84,\n\t22028: 0x8D94,\n\t22029: 0x8D91,\n\t22030: 0x8DB1,\n\t22031: 0x8D67,\n\t22032: 0x8D6D,\n\t22033: 0x8C47,\n\t22034: 0x8C49,\n\t22035: 0x914A,\n\t22036: 0x9150,\n\t22037: 0x914E,\n\t22038: 0x914F,\n\t22039: 0x9164,\n\t22040: 0x9B7C,\n\t22041: 0x9B7D,\n\t22042: 0x9B7E,\n\t22043: 0x9B7F,\n\t22044: 0x9B80,\n\t22045: 0x9B81,\n\t22046: 0x9B82,\n\t22047: 0x9B83,\n\t22048: 0x9B84,\n\t22049: 0x9B85,\n\t22050: 0x9B86,\n\t22051: 0x9B87,\n\t22052: 0x9B88,\n\t22053: 0x9B89,\n\t22054: 0x9B8A,\n\t22055: 0x9B8B,\n\t22056: 0x9B8C,\n\t22057: 0x9B8D,\n\t22058: 0x9B8E,\n\t22059: 0x9B8F,\n\t22060: 0x9B90,\n\t22061: 0x9B91,\n\t22062: 0x9B92,\n\t22063: 0x9B93,\n\t22064: 0x9B94,\n\t22065: 0x9B95,\n\t22066: 0x9B96,\n\t22067: 0x9B97,\n\t22068: 0x9B98,\n\t22069: 0x9B99,\n\t22070: 0x9B9A,\n\t22071: 0x9B9B,\n\t22072: 0x9B9C,\n\t22073: 0x9B9D,\n\t22074: 0x9B9E,\n\t22075: 0x9B9F,\n\t22076: 0x9BA0,\n\t22077: 0x9BA1,\n\t22078: 0x9BA2,\n\t22079: 0x9BA3,\n\t22080: 0x9BA4,\n\t22081: 0x9BA5,\n\t22082: 0x9BA6,\n\t22083: 0x9BA7,\n\t22084: 0x9BA8,\n\t22085: 0x9BA9,\n\t22086: 0x9BAA,\n\t22087: 0x9BAB,\n\t22088: 0x9BAC,\n\t22089: 0x9BAD,\n\t22090: 0x9BAE,\n\t22091: 0x9BAF,\n\t22092: 0x9BB0,\n\t22093: 0x9BB1,\n\t22094: 0x9BB2,\n\t22095: 0x9BB3,\n\t22096: 0x9BB4,\n\t22097: 0x9BB5,\n\t22098: 0x9BB6,\n\t22099: 0x9BB7,\n\t22100: 0x9BB8,\n\t22101: 0x9BB9,\n\t22102: 0x9BBA,\n\t22103: 0x9BBB,\n\t22104: 0x9BBC,\n\t22105: 0x9BBD,\n\t22106: 0x9BBE,\n\t22107: 0x9BBF,\n\t22108: 0x9BC0,\n\t22109: 0x9BC1,\n\t22110: 0x9BC2,\n\t22111: 0x9BC3,\n\t22112: 0x9BC4,\n\t22113: 0x9BC5,\n\t22114: 0x9BC6,\n\t22115: 0x9BC7,\n\t22116: 0x9BC8,\n\t22117: 0x9BC9,\n\t22118: 0x9BCA,\n\t22119: 0x9BCB,\n\t22120: 0x9BCC,\n\t22121: 0x9BCD,\n\t22122: 0x9BCE,\n\t22123: 0x9BCF,\n\t22124: 0x9BD0,\n\t22125: 0x9BD1,\n\t22126: 0x9BD2,\n\t22127: 0x9BD3,\n\t22128: 0x9BD4,\n\t22129: 0x9BD5,\n\t22130: 0x9BD6,\n\t22131: 0x9BD7,\n\t22132: 0x9BD8,\n\t22133: 0x9BD9,\n\t22134: 0x9BDA,\n\t22135: 0x9BDB,\n\t22136: 0x9162,\n\t22137: 0x9161,\n\t22138: 0x9170,\n\t22139: 0x9169,\n\t22140: 0x916F,\n\t22141: 0x917D,\n\t22142: 0x917E,\n\t22143: 0x9172,\n\t22144: 0x9174,\n\t22145: 0x9179,\n\t22146: 0x918C,\n\t22147: 0x9185,\n\t22148: 0x9190,\n\t22149: 0x918D,\n\t22150: 0x9191,\n\t22151: 0x91A2,\n\t22152: 0x91A3,\n\t22153: 0x91AA,\n\t22154: 0x91AD,\n\t22155: 0x91AE,\n\t22156: 0x91AF,\n\t22157: 0x91B5,\n\t22158: 0x91B4,\n\t22159: 0x91BA,\n\t22160: 0x8C55,\n\t22161: 0x9E7E,\n\t22162: 0x8DB8,\n\t22163: 0x8DEB,\n\t22164: 0x8E05,\n\t22165: 0x8E59,\n\t22166: 0x8E69,\n\t22167: 0x8DB5,\n\t22168: 0x8DBF,\n\t22169: 0x8DBC,\n\t22170: 0x8DBA,\n\t22171: 0x8DC4,\n\t22172: 0x8DD6,\n\t22173: 0x8DD7,\n\t22174: 0x8DDA,\n\t22175: 0x8DDE,\n\t22176: 0x8DCE,\n\t22177: 0x8DCF,\n\t22178: 0x8DDB,\n\t22179: 0x8DC6,\n\t22180: 0x8DEC,\n\t22181: 0x8DF7,\n\t22182: 0x8DF8,\n\t22183: 0x8DE3,\n\t22184: 0x8DF9,\n\t22185: 0x8DFB,\n\t22186: 0x8DE4,\n\t22187: 0x8E09,\n\t22188: 0x8DFD,\n\t22189: 0x8E14,\n\t22190: 0x8E1D,\n\t22191: 0x8E1F,\n\t22192: 0x8E2C,\n\t22193: 0x8E2E,\n\t22194: 0x8E23,\n\t22195: 0x8E2F,\n\t22196: 0x8E3A,\n\t22197: 0x8E40,\n\t22198: 0x8E39,\n\t22199: 0x8E35,\n\t22200: 0x8E3D,\n\t22201: 0x8E31,\n\t22202: 0x8E49,\n\t22203: 0x8E41,\n\t22204: 0x8E42,\n\t22205: 0x8E51,\n\t22206: 0x8E52,\n\t22207: 0x8E4A,\n\t22208: 0x8E70,\n\t22209: 0x8E76,\n\t22210: 0x8E7C,\n\t22211: 0x8E6F,\n\t22212: 0x8E74,\n\t22213: 0x8E85,\n\t22214: 0x8E8F,\n\t22215: 0x8E94,\n\t22216: 0x8E90,\n\t22217: 0x8E9C,\n\t22218: 0x8E9E,\n\t22219: 0x8C78,\n\t22220: 0x8C82,\n\t22221: 0x8C8A,\n\t22222: 0x8C85,\n\t22223: 0x8C98,\n\t22224: 0x8C94,\n\t22225: 0x659B,\n\t22226: 0x89D6,\n\t22227: 0x89DE,\n\t22228: 0x89DA,\n\t22229: 0x89DC,\n\t22230: 0x9BDC,\n\t22231: 0x9BDD,\n\t22232: 0x9BDE,\n\t22233: 0x9BDF,\n\t22234: 0x9BE0,\n\t22235: 0x9BE1,\n\t22236: 0x9BE2,\n\t22237: 0x9BE3,\n\t22238: 0x9BE4,\n\t22239: 0x9BE5,\n\t22240: 0x9BE6,\n\t22241: 0x9BE7,\n\t22242: 0x9BE8,\n\t22243: 0x9BE9,\n\t22244: 0x9BEA,\n\t22245: 0x9BEB,\n\t22246: 0x9BEC,\n\t22247: 0x9BED,\n\t22248: 0x9BEE,\n\t22249: 0x9BEF,\n\t22250: 0x9BF0,\n\t22251: 0x9BF1,\n\t22252: 0x9BF2,\n\t22253: 0x9BF3,\n\t22254: 0x9BF4,\n\t22255: 0x9BF5,\n\t22256: 0x9BF6,\n\t22257: 0x9BF7,\n\t22258: 0x9BF8,\n\t22259: 0x9BF9,\n\t22260: 0x9BFA,\n\t22261: 0x9BFB,\n\t22262: 0x9BFC,\n\t22263: 0x9BFD,\n\t22264: 0x9BFE,\n\t22265: 0x9BFF,\n\t22266: 0x9C00,\n\t22267: 0x9C01,\n\t22268: 0x9C02,\n\t22269: 0x9C03,\n\t22270: 0x9C04,\n\t22271: 0x9C05,\n\t22272: 0x9C06,\n\t22273: 0x9C07,\n\t22274: 0x9C08,\n\t22275: 0x9C09,\n\t22276: 0x9C0A,\n\t22277: 0x9C0B,\n\t22278: 0x9C0C,\n\t22279: 0x9C0D,\n\t22280: 0x9C0E,\n\t22281: 0x9C0F,\n\t22282: 0x9C10,\n\t22283: 0x9C11,\n\t22284: 0x9C12,\n\t22285: 0x9C13,\n\t22286: 0x9C14,\n\t22287: 0x9C15,\n\t22288: 0x9C16,\n\t22289: 0x9C17,\n\t22290: 0x9C18,\n\t22291: 0x9C19,\n\t22292: 0x9C1A,\n\t22293: 0x9C1B,\n\t22294: 0x9C1C,\n\t22295: 0x9C1D,\n\t22296: 0x9C1E,\n\t22297: 0x9C1F,\n\t22298: 0x9C20,\n\t22299: 0x9C21,\n\t22300: 0x9C22,\n\t22301: 0x9C23,\n\t22302: 0x9C24,\n\t22303: 0x9C25,\n\t22304: 0x9C26,\n\t22305: 0x9C27,\n\t22306: 0x9C28,\n\t22307: 0x9C29,\n\t22308: 0x9C2A,\n\t22309: 0x9C2B,\n\t22310: 0x9C2C,\n\t22311: 0x9C2D,\n\t22312: 0x9C2E,\n\t22313: 0x9C2F,\n\t22314: 0x9C30,\n\t22315: 0x9C31,\n\t22316: 0x9C32,\n\t22317: 0x9C33,\n\t22318: 0x9C34,\n\t22319: 0x9C35,\n\t22320: 0x9C36,\n\t22321: 0x9C37,\n\t22322: 0x9C38,\n\t22323: 0x9C39,\n\t22324: 0x9C3A,\n\t22325: 0x9C3B,\n\t22326: 0x89E5,\n\t22327: 0x89EB,\n\t22328: 0x89EF,\n\t22329: 0x8A3E,\n\t22330: 0x8B26,\n\t22331: 0x9753,\n\t22332: 0x96E9,\n\t22333: 0x96F3,\n\t22334: 0x96EF,\n\t22335: 0x9706,\n\t22336: 0x9701,\n\t22337: 0x9708,\n\t22338: 0x970F,\n\t22339: 0x970E,\n\t22340: 0x972A,\n\t22341: 0x972D,\n\t22342: 0x9730,\n\t22343: 0x973E,\n\t22344: 0x9F80,\n\t22345: 0x9F83,\n\t22346: 0x9F85,\n\t22347: 0x9F86,\n\t22348: 0x9F87,\n\t22349: 0x9F88,\n\t22350: 0x9F89,\n\t22351: 0x9F8A,\n\t22352: 0x9F8C,\n\t22353: 0x9EFE,\n\t22354: 0x9F0B,\n\t22355: 0x9F0D,\n\t22356: 0x96B9,\n\t22357: 0x96BC,\n\t22358: 0x96BD,\n\t22359: 0x96CE,\n\t22360: 0x96D2,\n\t22361: 0x77BF,\n\t22362: 0x96E0,\n\t22363: 0x928E,\n\t22364: 0x92AE,\n\t22365: 0x92C8,\n\t22366: 0x933E,\n\t22367: 0x936A,\n\t22368: 0x93CA,\n\t22369: 0x938F,\n\t22370: 0x943E,\n\t22371: 0x946B,\n\t22372: 0x9C7F,\n\t22373: 0x9C82,\n\t22374: 0x9C85,\n\t22375: 0x9C86,\n\t22376: 0x9C87,\n\t22377: 0x9C88,\n\t22378: 0x7A23,\n\t22379: 0x9C8B,\n\t22380: 0x9C8E,\n\t22381: 0x9C90,\n\t22382: 0x9C91,\n\t22383: 0x9C92,\n\t22384: 0x9C94,\n\t22385: 0x9C95,\n\t22386: 0x9C9A,\n\t22387: 0x9C9B,\n\t22388: 0x9C9E,\n\t22389: 0x9C9F,\n\t22390: 0x9CA0,\n\t22391: 0x9CA1,\n\t22392: 0x9CA2,\n\t22393: 0x9CA3,\n\t22394: 0x9CA5,\n\t22395: 0x9CA6,\n\t22396: 0x9CA7,\n\t22397: 0x9CA8,\n\t22398: 0x9CA9,\n\t22399: 0x9CAB,\n\t22400: 0x9CAD,\n\t22401: 0x9CAE,\n\t22402: 0x9CB0,\n\t22403: 0x9CB1,\n\t22404: 0x9CB2,\n\t22405: 0x9CB3,\n\t22406: 0x9CB4,\n\t22407: 0x9CB5,\n\t22408: 0x9CB6,\n\t22409: 0x9CB7,\n\t22410: 0x9CBA,\n\t22411: 0x9CBB,\n\t22412: 0x9CBC,\n\t22413: 0x9CBD,\n\t22414: 0x9CC4,\n\t22415: 0x9CC5,\n\t22416: 0x9CC6,\n\t22417: 0x9CC7,\n\t22418: 0x9CCA,\n\t22419: 0x9CCB,\n\t22420: 0x9C3C,\n\t22421: 0x9C3D,\n\t22422: 0x9C3E,\n\t22423: 0x9C3F,\n\t22424: 0x9C40,\n\t22425: 0x9C41,\n\t22426: 0x9C42,\n\t22427: 0x9C43,\n\t22428: 0x9C44,\n\t22429: 0x9C45,\n\t22430: 0x9C46,\n\t22431: 0x9C47,\n\t22432: 0x9C48,\n\t22433: 0x9C49,\n\t22434: 0x9C4A,\n\t22435: 0x9C4B,\n\t22436: 0x9C4C,\n\t22437: 0x9C4D,\n\t22438: 0x9C4E,\n\t22439: 0x9C4F,\n\t22440: 0x9C50,\n\t22441: 0x9C51,\n\t22442: 0x9C52,\n\t22443: 0x9C53,\n\t22444: 0x9C54,\n\t22445: 0x9C55,\n\t22446: 0x9C56,\n\t22447: 0x9C57,\n\t22448: 0x9C58,\n\t22449: 0x9C59,\n\t22450: 0x9C5A,\n\t22451: 0x9C5B,\n\t22452: 0x9C5C,\n\t22453: 0x9C5D,\n\t22454: 0x9C5E,\n\t22455: 0x9C5F,\n\t22456: 0x9C60,\n\t22457: 0x9C61,\n\t22458: 0x9C62,\n\t22459: 0x9C63,\n\t22460: 0x9C64,\n\t22461: 0x9C65,\n\t22462: 0x9C66,\n\t22463: 0x9C67,\n\t22464: 0x9C68,\n\t22465: 0x9C69,\n\t22466: 0x9C6A,\n\t22467: 0x9C6B,\n\t22468: 0x9C6C,\n\t22469: 0x9C6D,\n\t22470: 0x9C6E,\n\t22471: 0x9C6F,\n\t22472: 0x9C70,\n\t22473: 0x9C71,\n\t22474: 0x9C72,\n\t22475: 0x9C73,\n\t22476: 0x9C74,\n\t22477: 0x9C75,\n\t22478: 0x9C76,\n\t22479: 0x9C77,\n\t22480: 0x9C78,\n\t22481: 0x9C79,\n\t22482: 0x9C7A,\n\t22483: 0x9C7B,\n\t22484: 0x9C7D,\n\t22485: 0x9C7E,\n\t22486: 0x9C80,\n\t22487: 0x9C83,\n\t22488: 0x9C84,\n\t22489: 0x9C89,\n\t22490: 0x9C8A,\n\t22491: 0x9C8C,\n\t22492: 0x9C8F,\n\t22493: 0x9C93,\n\t22494: 0x9C96,\n\t22495: 0x9C97,\n\t22496: 0x9C98,\n\t22497: 0x9C99,\n\t22498: 0x9C9D,\n\t22499: 0x9CAA,\n\t22500: 0x9CAC,\n\t22501: 0x9CAF,\n\t22502: 0x9CB9,\n\t22503: 0x9CBE,\n\t22504: 0x9CBF,\n\t22505: 0x9CC0,\n\t22506: 0x9CC1,\n\t22507: 0x9CC2,\n\t22508: 0x9CC8,\n\t22509: 0x9CC9,\n\t22510: 0x9CD1,\n\t22511: 0x9CD2,\n\t22512: 0x9CDA,\n\t22513: 0x9CDB,\n\t22514: 0x9CE0,\n\t22515: 0x9CE1,\n\t22516: 0x9CCC,\n\t22517: 0x9CCD,\n\t22518: 0x9CCE,\n\t22519: 0x9CCF,\n\t22520: 0x9CD0,\n\t22521: 0x9CD3,\n\t22522: 0x9CD4,\n\t22523: 0x9CD5,\n\t22524: 0x9CD7,\n\t22525: 0x9CD8,\n\t22526: 0x9CD9,\n\t22527: 0x9CDC,\n\t22528: 0x9CDD,\n\t22529: 0x9CDF,\n\t22530: 0x9CE2,\n\t22531: 0x977C,\n\t22532: 0x9785,\n\t22533: 0x9791,\n\t22534: 0x9792,\n\t22535: 0x9794,\n\t22536: 0x97AF,\n\t22537: 0x97AB,\n\t22538: 0x97A3,\n\t22539: 0x97B2,\n\t22540: 0x97B4,\n\t22541: 0x9AB1,\n\t22542: 0x9AB0,\n\t22543: 0x9AB7,\n\t22544: 0x9E58,\n\t22545: 0x9AB6,\n\t22546: 0x9ABA,\n\t22547: 0x9ABC,\n\t22548: 0x9AC1,\n\t22549: 0x9AC0,\n\t22550: 0x9AC5,\n\t22551: 0x9AC2,\n\t22552: 0x9ACB,\n\t22553: 0x9ACC,\n\t22554: 0x9AD1,\n\t22555: 0x9B45,\n\t22556: 0x9B43,\n\t22557: 0x9B47,\n\t22558: 0x9B49,\n\t22559: 0x9B48,\n\t22560: 0x9B4D,\n\t22561: 0x9B51,\n\t22562: 0x98E8,\n\t22563: 0x990D,\n\t22564: 0x992E,\n\t22565: 0x9955,\n\t22566: 0x9954,\n\t22567: 0x9ADF,\n\t22568: 0x9AE1,\n\t22569: 0x9AE6,\n\t22570: 0x9AEF,\n\t22571: 0x9AEB,\n\t22572: 0x9AFB,\n\t22573: 0x9AED,\n\t22574: 0x9AF9,\n\t22575: 0x9B08,\n\t22576: 0x9B0F,\n\t22577: 0x9B13,\n\t22578: 0x9B1F,\n\t22579: 0x9B23,\n\t22580: 0x9EBD,\n\t22581: 0x9EBE,\n\t22582: 0x7E3B,\n\t22583: 0x9E82,\n\t22584: 0x9E87,\n\t22585: 0x9E88,\n\t22586: 0x9E8B,\n\t22587: 0x9E92,\n\t22588: 0x93D6,\n\t22589: 0x9E9D,\n\t22590: 0x9E9F,\n\t22591: 0x9EDB,\n\t22592: 0x9EDC,\n\t22593: 0x9EDD,\n\t22594: 0x9EE0,\n\t22595: 0x9EDF,\n\t22596: 0x9EE2,\n\t22597: 0x9EE9,\n\t22598: 0x9EE7,\n\t22599: 0x9EE5,\n\t22600: 0x9EEA,\n\t22601: 0x9EEF,\n\t22602: 0x9F22,\n\t22603: 0x9F2C,\n\t22604: 0x9F2F,\n\t22605: 0x9F39,\n\t22606: 0x9F37,\n\t22607: 0x9F3D,\n\t22608: 0x9F3E,\n\t22609: 0x9F44,\n\t22610: 0x9CE3,\n\t22611: 0x9CE4,\n\t22612: 0x9CE5,\n\t22613: 0x9CE6,\n\t22614: 0x9CE7,\n\t22615: 0x9CE8,\n\t22616: 0x9CE9,\n\t22617: 0x9CEA,\n\t22618: 0x9CEB,\n\t22619: 0x9CEC,\n\t22620: 0x9CED,\n\t22621: 0x9CEE,\n\t22622: 0x9CEF,\n\t22623: 0x9CF0,\n\t22624: 0x9CF1,\n\t22625: 0x9CF2,\n\t22626: 0x9CF3,\n\t22627: 0x9CF4,\n\t22628: 0x9CF5,\n\t22629: 0x9CF6,\n\t22630: 0x9CF7,\n\t22631: 0x9CF8,\n\t22632: 0x9CF9,\n\t22633: 0x9CFA,\n\t22634: 0x9CFB,\n\t22635: 0x9CFC,\n\t22636: 0x9CFD,\n\t22637: 0x9CFE,\n\t22638: 0x9CFF,\n\t22639: 0x9D00,\n\t22640: 0x9D01,\n\t22641: 0x9D02,\n\t22642: 0x9D03,\n\t22643: 0x9D04,\n\t22644: 0x9D05,\n\t22645: 0x9D06,\n\t22646: 0x9D07,\n\t22647: 0x9D08,\n\t22648: 0x9D09,\n\t22649: 0x9D0A,\n\t22650: 0x9D0B,\n\t22651: 0x9D0C,\n\t22652: 0x9D0D,\n\t22653: 0x9D0E,\n\t22654: 0x9D0F,\n\t22655: 0x9D10,\n\t22656: 0x9D11,\n\t22657: 0x9D12,\n\t22658: 0x9D13,\n\t22659: 0x9D14,\n\t22660: 0x9D15,\n\t22661: 0x9D16,\n\t22662: 0x9D17,\n\t22663: 0x9D18,\n\t22664: 0x9D19,\n\t22665: 0x9D1A,\n\t22666: 0x9D1B,\n\t22667: 0x9D1C,\n\t22668: 0x9D1D,\n\t22669: 0x9D1E,\n\t22670: 0x9D1F,\n\t22671: 0x9D20,\n\t22672: 0x9D21,\n\t22673: 0x9D22,\n\t22674: 0x9D23,\n\t22675: 0x9D24,\n\t22676: 0x9D25,\n\t22677: 0x9D26,\n\t22678: 0x9D27,\n\t22679: 0x9D28,\n\t22680: 0x9D29,\n\t22681: 0x9D2A,\n\t22682: 0x9D2B,\n\t22683: 0x9D2C,\n\t22684: 0x9D2D,\n\t22685: 0x9D2E,\n\t22686: 0x9D2F,\n\t22687: 0x9D30,\n\t22688: 0x9D31,\n\t22689: 0x9D32,\n\t22690: 0x9D33,\n\t22691: 0x9D34,\n\t22692: 0x9D35,\n\t22693: 0x9D36,\n\t22694: 0x9D37,\n\t22695: 0x9D38,\n\t22696: 0x9D39,\n\t22697: 0x9D3A,\n\t22698: 0x9D3B,\n\t22699: 0x9D3C,\n\t22700: 0x9D3D,\n\t22701: 0x9D3E,\n\t22702: 0x9D3F,\n\t22703: 0x9D40,\n\t22704: 0x9D41,\n\t22705: 0x9D42,\n\t22800: 0x9D43,\n\t22801: 0x9D44,\n\t22802: 0x9D45,\n\t22803: 0x9D46,\n\t22804: 0x9D47,\n\t22805: 0x9D48,\n\t22806: 0x9D49,\n\t22807: 0x9D4A,\n\t22808: 0x9D4B,\n\t22809: 0x9D4C,\n\t22810: 0x9D4D,\n\t22811: 0x9D4E,\n\t22812: 0x9D4F,\n\t22813: 0x9D50,\n\t22814: 0x9D51,\n\t22815: 0x9D52,\n\t22816: 0x9D53,\n\t22817: 0x9D54,\n\t22818: 0x9D55,\n\t22819: 0x9D56,\n\t22820: 0x9D57,\n\t22821: 0x9D58,\n\t22822: 0x9D59,\n\t22823: 0x9D5A,\n\t22824: 0x9D5B,\n\t22825: 0x9D5C,\n\t22826: 0x9D5D,\n\t22827: 0x9D5E,\n\t22828: 0x9D5F,\n\t22829: 0x9D60,\n\t22830: 0x9D61,\n\t22831: 0x9D62,\n\t22832: 0x9D63,\n\t22833: 0x9D64,\n\t22834: 0x9D65,\n\t22835: 0x9D66,\n\t22836: 0x9D67,\n\t22837: 0x9D68,\n\t22838: 0x9D69,\n\t22839: 0x9D6A,\n\t22840: 0x9D6B,\n\t22841: 0x9D6C,\n\t22842: 0x9D6D,\n\t22843: 0x9D6E,\n\t22844: 0x9D6F,\n\t22845: 0x9D70,\n\t22846: 0x9D71,\n\t22847: 0x9D72,\n\t22848: 0x9D73,\n\t22849: 0x9D74,\n\t22850: 0x9D75,\n\t22851: 0x9D76,\n\t22852: 0x9D77,\n\t22853: 0x9D78,\n\t22854: 0x9D79,\n\t22855: 0x9D7A,\n\t22856: 0x9D7B,\n\t22857: 0x9D7C,\n\t22858: 0x9D7D,\n\t22859: 0x9D7E,\n\t22860: 0x9D7F,\n\t22861: 0x9D80,\n\t22862: 0x9D81,\n\t22863: 0x9D82,\n\t22864: 0x9D83,\n\t22865: 0x9D84,\n\t22866: 0x9D85,\n\t22867: 0x9D86,\n\t22868: 0x9D87,\n\t22869: 0x9D88,\n\t22870: 0x9D89,\n\t22871: 0x9D8A,\n\t22872: 0x9D8B,\n\t22873: 0x9D8C,\n\t22874: 0x9D8D,\n\t22875: 0x9D8E,\n\t22876: 0x9D8F,\n\t22877: 0x9D90,\n\t22878: 0x9D91,\n\t22879: 0x9D92,\n\t22880: 0x9D93,\n\t22881: 0x9D94,\n\t22882: 0x9D95,\n\t22883: 0x9D96,\n\t22884: 0x9D97,\n\t22885: 0x9D98,\n\t22886: 0x9D99,\n\t22887: 0x9D9A,\n\t22888: 0x9D9B,\n\t22889: 0x9D9C,\n\t22890: 0x9D9D,\n\t22891: 0x9D9E,\n\t22892: 0x9D9F,\n\t22893: 0x9DA0,\n\t22894: 0x9DA1,\n\t22895: 0x9DA2,\n\t22990: 0x9DA3,\n\t22991: 0x9DA4,\n\t22992: 0x9DA5,\n\t22993: 0x9DA6,\n\t22994: 0x9DA7,\n\t22995: 0x9DA8,\n\t22996: 0x9DA9,\n\t22997: 0x9DAA,\n\t22998: 0x9DAB,\n\t22999: 0x9DAC,\n\t23000: 0x9DAD,\n\t23001: 0x9DAE,\n\t23002: 0x9DAF,\n\t23003: 0x9DB0,\n\t23004: 0x9DB1,\n\t23005: 0x9DB2,\n\t23006: 0x9DB3,\n\t23007: 0x9DB4,\n\t23008: 0x9DB5,\n\t23009: 0x9DB6,\n\t23010: 0x9DB7,\n\t23011: 0x9DB8,\n\t23012: 0x9DB9,\n\t23013: 0x9DBA,\n\t23014: 0x9DBB,\n\t23015: 0x9DBC,\n\t23016: 0x9DBD,\n\t23017: 0x9DBE,\n\t23018: 0x9DBF,\n\t23019: 0x9DC0,\n\t23020: 0x9DC1,\n\t23021: 0x9DC2,\n\t23022: 0x9DC3,\n\t23023: 0x9DC4,\n\t23024: 0x9DC5,\n\t23025: 0x9DC6,\n\t23026: 0x9DC7,\n\t23027: 0x9DC8,\n\t23028: 0x9DC9,\n\t23029: 0x9DCA,\n\t23030: 0x9DCB,\n\t23031: 0x9DCC,\n\t23032: 0x9DCD,\n\t23033: 0x9DCE,\n\t23034: 0x9DCF,\n\t23035: 0x9DD0,\n\t23036: 0x9DD1,\n\t23037: 0x9DD2,\n\t23038: 0x9DD3,\n\t23039: 0x9DD4,\n\t23040: 0x9DD5,\n\t23041: 0x9DD6,\n\t23042: 0x9DD7,\n\t23043: 0x9DD8,\n\t23044: 0x9DD9,\n\t23045: 0x9DDA,\n\t23046: 0x9DDB,\n\t23047: 0x9DDC,\n\t23048: 0x9DDD,\n\t23049: 0x9DDE,\n\t23050: 0x9DDF,\n\t23051: 0x9DE0,\n\t23052: 0x9DE1,\n\t23053: 0x9DE2,\n\t23054: 0x9DE3,\n\t23055: 0x9DE4,\n\t23056: 0x9DE5,\n\t23057: 0x9DE6,\n\t23058: 0x9DE7,\n\t23059: 0x9DE8,\n\t23060: 0x9DE9,\n\t23061: 0x9DEA,\n\t23062: 0x9DEB,\n\t23063: 0x9DEC,\n\t23064: 0x9DED,\n\t23065: 0x9DEE,\n\t23066: 0x9DEF,\n\t23067: 0x9DF0,\n\t23068: 0x9DF1,\n\t23069: 0x9DF2,\n\t23070: 0x9DF3,\n\t23071: 0x9DF4,\n\t23072: 0x9DF5,\n\t23073: 0x9DF6,\n\t23074: 0x9DF7,\n\t23075: 0x9DF8,\n\t23076: 0x9DF9,\n\t23077: 0x9DFA,\n\t23078: 0x9DFB,\n\t23079: 0x9DFC,\n\t23080: 0x9DFD,\n\t23081: 0x9DFE,\n\t23082: 0x9DFF,\n\t23083: 0x9E00,\n\t23084: 0x9E01,\n\t23085: 0x9E02,\n\t23180: 0x9E03,\n\t23181: 0x9E04,\n\t23182: 0x9E05,\n\t23183: 0x9E06,\n\t23184: 0x9E07,\n\t23185: 0x9E08,\n\t23186: 0x9E09,\n\t23187: 0x9E0A,\n\t23188: 0x9E0B,\n\t23189: 0x9E0C,\n\t23190: 0x9E0D,\n\t23191: 0x9E0E,\n\t23192: 0x9E0F,\n\t23193: 0x9E10,\n\t23194: 0x9E11,\n\t23195: 0x9E12,\n\t23196: 0x9E13,\n\t23197: 0x9E14,\n\t23198: 0x9E15,\n\t23199: 0x9E16,\n\t23200: 0x9E17,\n\t23201: 0x9E18,\n\t23202: 0x9E19,\n\t23203: 0x9E1A,\n\t23204: 0x9E1B,\n\t23205: 0x9E1C,\n\t23206: 0x9E1D,\n\t23207: 0x9E1E,\n\t23208: 0x9E24,\n\t23209: 0x9E27,\n\t23210: 0x9E2E,\n\t23211: 0x9E30,\n\t23212: 0x9E34,\n\t23213: 0x9E3B,\n\t23214: 0x9E3C,\n\t23215: 0x9E40,\n\t23216: 0x9E4D,\n\t23217: 0x9E50,\n\t23218: 0x9E52,\n\t23219: 0x9E53,\n\t23220: 0x9E54,\n\t23221: 0x9E56,\n\t23222: 0x9E59,\n\t23223: 0x9E5D,\n\t23224: 0x9E5F,\n\t23225: 0x9E60,\n\t23226: 0x9E61,\n\t23227: 0x9E62,\n\t23228: 0x9E65,\n\t23229: 0x9E6E,\n\t23230: 0x9E6F,\n\t23231: 0x9E72,\n\t23232: 0x9E74,\n\t23233: 0x9E75,\n\t23234: 0x9E76,\n\t23235: 0x9E77,\n\t23236: 0x9E78,\n\t23237: 0x9E79,\n\t23238: 0x9E7A,\n\t23239: 0x9E7B,\n\t23240: 0x9E7C,\n\t23241: 0x9E7D,\n\t23242: 0x9E80,\n\t23243: 0x9E81,\n\t23244: 0x9E83,\n\t23245: 0x9E84,\n\t23246: 0x9E85,\n\t23247: 0x9E86,\n\t23248: 0x9E89,\n\t23249: 0x9E8A,\n\t23250: 0x9E8C,\n\t23251: 0x9E8D,\n\t23252: 0x9E8E,\n\t23253: 0x9E8F,\n\t23254: 0x9E90,\n\t23255: 0x9E91,\n\t23256: 0x9E94,\n\t23257: 0x9E95,\n\t23258: 0x9E96,\n\t23259: 0x9E97,\n\t23260: 0x9E98,\n\t23261: 0x9E99,\n\t23262: 0x9E9A,\n\t23263: 0x9E9B,\n\t23264: 0x9E9C,\n\t23265: 0x9E9E,\n\t23266: 0x9EA0,\n\t23267: 0x9EA1,\n\t23268: 0x9EA2,\n\t23269: 0x9EA3,\n\t23270: 0x9EA4,\n\t23271: 0x9EA5,\n\t23272: 0x9EA7,\n\t23273: 0x9EA8,\n\t23274: 0x9EA9,\n\t23275: 0x9EAA,\n\t23370: 0x9EAB,\n\t23371: 0x9EAC,\n\t23372: 0x9EAD,\n\t23373: 0x9EAE,\n\t23374: 0x9EAF,\n\t23375: 0x9EB0,\n\t23376: 0x9EB1,\n\t23377: 0x9EB2,\n\t23378: 0x9EB3,\n\t23379: 0x9EB5,\n\t23380: 0x9EB6,\n\t23381: 0x9EB7,\n\t23382: 0x9EB9,\n\t23383: 0x9EBA,\n\t23384: 0x9EBC,\n\t23385: 0x9EBF,\n\t23386: 0x9EC0,\n\t23387: 0x9EC1,\n\t23388: 0x9EC2,\n\t23389: 0x9EC3,\n\t23390: 0x9EC5,\n\t23391: 0x9EC6,\n\t23392: 0x9EC7,\n\t23393: 0x9EC8,\n\t23394: 0x9ECA,\n\t23395: 0x9ECB,\n\t23396: 0x9ECC,\n\t23397: 0x9ED0,\n\t23398: 0x9ED2,\n\t23399: 0x9ED3,\n\t23400: 0x9ED5,\n\t23401: 0x9ED6,\n\t23402: 0x9ED7,\n\t23403: 0x9ED9,\n\t23404: 0x9EDA,\n\t23405: 0x9EDE,\n\t23406: 0x9EE1,\n\t23407: 0x9EE3,\n\t23408: 0x9EE4,\n\t23409: 0x9EE6,\n\t23410: 0x9EE8,\n\t23411: 0x9EEB,\n\t23412: 0x9EEC,\n\t23413: 0x9EED,\n\t23414: 0x9EEE,\n\t23415: 0x9EF0,\n\t23416: 0x9EF1,\n\t23417: 0x9EF2,\n\t23418: 0x9EF3,\n\t23419: 0x9EF4,\n\t23420: 0x9EF5,\n\t23421: 0x9EF6,\n\t23422: 0x9EF7,\n\t23423: 0x9EF8,\n\t23424: 0x9EFA,\n\t23425: 0x9EFD,\n\t23426: 0x9EFF,\n\t23427: 0x9F00,\n\t23428: 0x9F01,\n\t23429: 0x9F02,\n\t23430: 0x9F03,\n\t23431: 0x9F04,\n\t23432: 0x9F05,\n\t23433: 0x9F06,\n\t23434: 0x9F07,\n\t23435: 0x9F08,\n\t23436: 0x9F09,\n\t23437: 0x9F0A,\n\t23438: 0x9F0C,\n\t23439: 0x9F0F,\n\t23440: 0x9F11,\n\t23441: 0x9F12,\n\t23442: 0x9F14,\n\t23443: 0x9F15,\n\t23444: 0x9F16,\n\t23445: 0x9F18,\n\t23446: 0x9F1A,\n\t23447: 0x9F1B,\n\t23448: 0x9F1C,\n\t23449: 0x9F1D,\n\t23450: 0x9F1E,\n\t23451: 0x9F1F,\n\t23452: 0x9F21,\n\t23453: 0x9F23,\n\t23454: 0x9F24,\n\t23455: 0x9F25,\n\t23456: 0x9F26,\n\t23457: 0x9F27,\n\t23458: 0x9F28,\n\t23459: 0x9F29,\n\t23460: 0x9F2A,\n\t23461: 0x9F2B,\n\t23462: 0x9F2D,\n\t23463: 0x9F2E,\n\t23464: 0x9F30,\n\t23465: 0x9F31,\n\t23560: 0x9F32,\n\t23561: 0x9F33,\n\t23562: 0x9F34,\n\t23563: 0x9F35,\n\t23564: 0x9F36,\n\t23565: 0x9F38,\n\t23566: 0x9F3A,\n\t23567: 0x9F3C,\n\t23568: 0x9F3F,\n\t23569: 0x9F40,\n\t23570: 0x9F41,\n\t23571: 0x9F42,\n\t23572: 0x9F43,\n\t23573: 0x9F45,\n\t23574: 0x9F46,\n\t23575: 0x9F47,\n\t23576: 0x9F48,\n\t23577: 0x9F49,\n\t23578: 0x9F4A,\n\t23579: 0x9F4B,\n\t23580: 0x9F4C,\n\t23581: 0x9F4D,\n\t23582: 0x9F4E,\n\t23583: 0x9F4F,\n\t23584: 0x9F52,\n\t23585: 0x9F53,\n\t23586: 0x9F54,\n\t23587: 0x9F55,\n\t23588: 0x9F56,\n\t23589: 0x9F57,\n\t23590: 0x9F58,\n\t23591: 0x9F59,\n\t23592: 0x9F5A,\n\t23593: 0x9F5B,\n\t23594: 0x9F5C,\n\t23595: 0x9F5D,\n\t23596: 0x9F5E,\n\t23597: 0x9F5F,\n\t23598: 0x9F60,\n\t23599: 0x9F61,\n\t23600: 0x9F62,\n\t23601: 0x9F63,\n\t23602: 0x9F64,\n\t23603: 0x9F65,\n\t23604: 0x9F66,\n\t23605: 0x9F67,\n\t23606: 0x9F68,\n\t23607: 0x9F69,\n\t23608: 0x9F6A,\n\t23609: 0x9F6B,\n\t23610: 0x9F6C,\n\t23611: 0x9F6D,\n\t23612: 0x9F6E,\n\t23613: 0x9F6F,\n\t23614: 0x9F70,\n\t23615: 0x9F71,\n\t23616: 0x9F72,\n\t23617: 0x9F73,\n\t23618: 0x9F74,\n\t23619: 0x9F75,\n\t23620: 0x9F76,\n\t23621: 0x9F77,\n\t23622: 0x9F78,\n\t23623: 0x9F79,\n\t23624: 0x9F7A,\n\t23625: 0x9F7B,\n\t23626: 0x9F7C,\n\t23627: 0x9F7D,\n\t23628: 0x9F7E,\n\t23629: 0x9F81,\n\t23630: 0x9F82,\n\t23631: 0x9F8D,\n\t23632: 0x9F8E,\n\t23633: 0x9F8F,\n\t23634: 0x9F90,\n\t23635: 0x9F91,\n\t23636: 0x9F92,\n\t23637: 0x9F93,\n\t23638: 0x9F94,\n\t23639: 0x9F95,\n\t23640: 0x9F96,\n\t23641: 0x9F97,\n\t23642: 0x9F98,\n\t23643: 0x9F9C,\n\t23644: 0x9F9D,\n\t23645: 0x9F9E,\n\t23646: 0x9FA1,\n\t23647: 0x9FA2,\n\t23648: 0x9FA3,\n\t23649: 0x9FA4,\n\t23650: 0x9FA5,\n\t23651: 0xF92C,\n\t23652: 0xF979,\n\t23653: 0xF995,\n\t23654: 0xF9E7,\n\t23655: 0xF9F1,\n\t23750: 0xFA0C,\n\t23751: 0xFA0D,\n\t23752: 0xFA0E,\n\t23753: 0xFA0F,\n\t23754: 0xFA11,\n\t23755: 0xFA13,\n\t23756: 0xFA14,\n\t23757: 0xFA18,\n\t23758: 0xFA1F,\n\t23759: 0xFA20,\n\t23760: 0xFA21,\n\t23761: 0xFA23,\n\t23762: 0xFA24,\n\t23763: 0xFA27,\n\t23764: 0xFA28,\n\t23765: 0xFA29,\n\t23766: 0x2E81,\n\t23770: 0x2E84,\n\t23771: 0x3473,\n\t23772: 0x3447,\n\t23773: 0x2E88,\n\t23774: 0x2E8B,\n\t23776: 0x359E,\n\t23777: 0x361A,\n\t23778: 0x360E,\n\t23779: 0x2E8C,\n\t23780: 0x2E97,\n\t23781: 0x396E,\n\t23782: 0x3918,\n\t23784: 0x39CF,\n\t23785: 0x39DF,\n\t23786: 0x3A73,\n\t23787: 0x39D0,\n\t23790: 0x3B4E,\n\t23791: 0x3C6E,\n\t23792: 0x3CE0,\n\t23793: 0x2EA7,\n\t23796: 0x2EAA,\n\t23797: 0x4056,\n\t23798: 0x415F,\n\t23799: 0x2EAE,\n\t23800: 0x4337,\n\t23801: 0x2EB3,\n\t23802: 0x2EB6,\n\t23803: 0x2EB7,\n\t23805: 0x43B1,\n\t23806: 0x43AC,\n\t23807: 0x2EBB,\n\t23808: 0x43DD,\n\t23809: 0x44D6,\n\t23810: 0x4661,\n\t23811: 0x464C,\n\t23813: 0x4723,\n\t23814: 0x4729,\n\t23815: 0x477C,\n\t23816: 0x478D,\n\t23817: 0x2ECA,\n\t23818: 0x4947,\n\t23819: 0x497A,\n\t23820: 0x497D,\n\t23821: 0x4982,\n\t23822: 0x4983,\n\t23823: 0x4985,\n\t23824: 0x4986,\n\t23825: 0x499F,\n\t23826: 0x499B,\n\t23827: 0x49B7,\n\t23828: 0x49B6,\n\t23831: 0x4CA3,\n\t23832: 0x4C9F,\n\t23833: 0x4CA0,\n\t23834: 0x4CA1,\n\t23835: 0x4C77,\n\t23836: 0x4CA2,\n\t23837: 0x4D13,\n\t23838: 0x4D14,\n\t23839: 0x4D15,\n\t23840: 0x4D16,\n\t23841: 0x4D17,\n\t23842: 0x4D18,\n\t23843: 0x4D19,\n\t23844: 0x4DAE,\n}\n\nconst numEncodeTables = 5\n\n// encodeX are the encoding tables from Unicode to GBK code,\n// sorted by decreasing length.\n// encode0: 28965 entries for runes in [11905, 40870).\n// encode1:  1587 entries for runes in [ 8208,  9795).\n// encode2:   942 entries for runes in [  164,  1106).\n// encode3:   438 entries for runes in [65072, 65510).\n// encode4:   254 entries for runes in [63788, 64042).\n\nconst encode0Low, encode0High = 11905, 40870\n\nvar encode0 = [...]uint16{\n\t11905 - 11905: 0xFE50,\n\t11908 - 11905: 0xFE54,\n\t11912 - 11905: 0xFE57,\n\t11915 - 11905: 0xFE58,\n\t11916 - 11905: 0xFE5D,\n\t11927 - 11905: 0xFE5E,\n\t11943 - 11905: 0xFE6B,\n\t11946 - 11905: 0xFE6E,\n\t11950 - 11905: 0xFE71,\n\t11955 - 11905: 0xFE73,\n\t11958 - 11905: 0xFE74,\n\t11959 - 11905: 0xFE75,\n\t11963 - 11905: 0xFE79,\n\t11978 - 11905: 0xFE84,\n\t12272 - 11905: 0xA98A,\n\t12273 - 11905: 0xA98B,\n\t12274 - 11905: 0xA98C,\n\t12275 - 11905: 0xA98D,\n\t12276 - 11905: 0xA98E,\n\t12277 - 11905: 0xA98F,\n\t12278 - 11905: 0xA990,\n\t12279 - 11905: 0xA991,\n\t12280 - 11905: 0xA992,\n\t12281 - 11905: 0xA993,\n\t12282 - 11905: 0xA994,\n\t12283 - 11905: 0xA995,\n\t12288 - 11905: 0xA1A1,\n\t12289 - 11905: 0xA1A2,\n\t12290 - 11905: 0xA1A3,\n\t12291 - 11905: 0xA1A8,\n\t12293 - 11905: 0xA1A9,\n\t12294 - 11905: 0xA965,\n\t12295 - 11905: 0xA996,\n\t12296 - 11905: 0xA1B4,\n\t12297 - 11905: 0xA1B5,\n\t12298 - 11905: 0xA1B6,\n\t12299 - 11905: 0xA1B7,\n\t12300 - 11905: 0xA1B8,\n\t12301 - 11905: 0xA1B9,\n\t12302 - 11905: 0xA1BA,\n\t12303 - 11905: 0xA1BB,\n\t12304 - 11905: 0xA1BE,\n\t12305 - 11905: 0xA1BF,\n\t12306 - 11905: 0xA893,\n\t12307 - 11905: 0xA1FE,\n\t12308 - 11905: 0xA1B2,\n\t12309 - 11905: 0xA1B3,\n\t12310 - 11905: 0xA1BC,\n\t12311 - 11905: 0xA1BD,\n\t12317 - 11905: 0xA894,\n\t12318 - 11905: 0xA895,\n\t12321 - 11905: 0xA940,\n\t12322 - 11905: 0xA941,\n\t12323 - 11905: 0xA942,\n\t12324 - 11905: 0xA943,\n\t12325 - 11905: 0xA944,\n\t12326 - 11905: 0xA945,\n\t12327 - 11905: 0xA946,\n\t12328 - 11905: 0xA947,\n\t12329 - 11905: 0xA948,\n\t12350 - 11905: 0xA989,\n\t12353 - 11905: 0xA4A1,\n\t12354 - 11905: 0xA4A2,\n\t12355 - 11905: 0xA4A3,\n\t12356 - 11905: 0xA4A4,\n\t12357 - 11905: 0xA4A5,\n\t12358 - 11905: 0xA4A6,\n\t12359 - 11905: 0xA4A7,\n\t12360 - 11905: 0xA4A8,\n\t12361 - 11905: 0xA4A9,\n\t12362 - 11905: 0xA4AA,\n\t12363 - 11905: 0xA4AB,\n\t12364 - 11905: 0xA4AC,\n\t12365 - 11905: 0xA4AD,\n\t12366 - 11905: 0xA4AE,\n\t12367 - 11905: 0xA4AF,\n\t12368 - 11905: 0xA4B0,\n\t12369 - 11905: 0xA4B1,\n\t12370 - 11905: 0xA4B2,\n\t12371 - 11905: 0xA4B3,\n\t12372 - 11905: 0xA4B4,\n\t12373 - 11905: 0xA4B5,\n\t12374 - 11905: 0xA4B6,\n\t12375 - 11905: 0xA4B7,\n\t12376 - 11905: 0xA4B8,\n\t12377 - 11905: 0xA4B9,\n\t12378 - 11905: 0xA4BA,\n\t12379 - 11905: 0xA4BB,\n\t12380 - 11905: 0xA4BC,\n\t12381 - 11905: 0xA4BD,\n\t12382 - 11905: 0xA4BE,\n\t12383 - 11905: 0xA4BF,\n\t12384 - 11905: 0xA4C0,\n\t12385 - 11905: 0xA4C1,\n\t12386 - 11905: 0xA4C2,\n\t12387 - 11905: 0xA4C3,\n\t12388 - 11905: 0xA4C4,\n\t12389 - 11905: 0xA4C5,\n\t12390 - 11905: 0xA4C6,\n\t12391 - 11905: 0xA4C7,\n\t12392 - 11905: 0xA4C8,\n\t12393 - 11905: 0xA4C9,\n\t12394 - 11905: 0xA4CA,\n\t12395 - 11905: 0xA4CB,\n\t12396 - 11905: 0xA4CC,\n\t12397 - 11905: 0xA4CD,\n\t12398 - 11905: 0xA4CE,\n\t12399 - 11905: 0xA4CF,\n\t12400 - 11905: 0xA4D0,\n\t12401 - 11905: 0xA4D1,\n\t12402 - 11905: 0xA4D2,\n\t12403 - 11905: 0xA4D3,\n\t12404 - 11905: 0xA4D4,\n\t12405 - 11905: 0xA4D5,\n\t12406 - 11905: 0xA4D6,\n\t12407 - 11905: 0xA4D7,\n\t12408 - 11905: 0xA4D8,\n\t12409 - 11905: 0xA4D9,\n\t12410 - 11905: 0xA4DA,\n\t12411 - 11905: 0xA4DB,\n\t12412 - 11905: 0xA4DC,\n\t12413 - 11905: 0xA4DD,\n\t12414 - 11905: 0xA4DE,\n\t12415 - 11905: 0xA4DF,\n\t12416 - 11905: 0xA4E0,\n\t12417 - 11905: 0xA4E1,\n\t12418 - 11905: 0xA4E2,\n\t12419 - 11905: 0xA4E3,\n\t12420 - 11905: 0xA4E4,\n\t12421 - 11905: 0xA4E5,\n\t12422 - 11905: 0xA4E6,\n\t12423 - 11905: 0xA4E7,\n\t12424 - 11905: 0xA4E8,\n\t12425 - 11905: 0xA4E9,\n\t12426 - 11905: 0xA4EA,\n\t12427 - 11905: 0xA4EB,\n\t12428 - 11905: 0xA4EC,\n\t12429 - 11905: 0xA4ED,\n\t12430 - 11905: 0xA4EE,\n\t12431 - 11905: 0xA4EF,\n\t12432 - 11905: 0xA4F0,\n\t12433 - 11905: 0xA4F1,\n\t12434 - 11905: 0xA4F2,\n\t12435 - 11905: 0xA4F3,\n\t12443 - 11905: 0xA961,\n\t12444 - 11905: 0xA962,\n\t12445 - 11905: 0xA966,\n\t12446 - 11905: 0xA967,\n\t12449 - 11905: 0xA5A1,\n\t12450 - 11905: 0xA5A2,\n\t12451 - 11905: 0xA5A3,\n\t12452 - 11905: 0xA5A4,\n\t12453 - 11905: 0xA5A5,\n\t12454 - 11905: 0xA5A6,\n\t12455 - 11905: 0xA5A7,\n\t12456 - 11905: 0xA5A8,\n\t12457 - 11905: 0xA5A9,\n\t12458 - 11905: 0xA5AA,\n\t12459 - 11905: 0xA5AB,\n\t12460 - 11905: 0xA5AC,\n\t12461 - 11905: 0xA5AD,\n\t12462 - 11905: 0xA5AE,\n\t12463 - 11905: 0xA5AF,\n\t12464 - 11905: 0xA5B0,\n\t12465 - 11905: 0xA5B1,\n\t12466 - 11905: 0xA5B2,\n\t12467 - 11905: 0xA5B3,\n\t12468 - 11905: 0xA5B4,\n\t12469 - 11905: 0xA5B5,\n\t12470 - 11905: 0xA5B6,\n\t12471 - 11905: 0xA5B7,\n\t12472 - 11905: 0xA5B8,\n\t12473 - 11905: 0xA5B9,\n\t12474 - 11905: 0xA5BA,\n\t12475 - 11905: 0xA5BB,\n\t12476 - 11905: 0xA5BC,\n\t12477 - 11905: 0xA5BD,\n\t12478 - 11905: 0xA5BE,\n\t12479 - 11905: 0xA5BF,\n\t12480 - 11905: 0xA5C0,\n\t12481 - 11905: 0xA5C1,\n\t12482 - 11905: 0xA5C2,\n\t12483 - 11905: 0xA5C3,\n\t12484 - 11905: 0xA5C4,\n\t12485 - 11905: 0xA5C5,\n\t12486 - 11905: 0xA5C6,\n\t12487 - 11905: 0xA5C7,\n\t12488 - 11905: 0xA5C8,\n\t12489 - 11905: 0xA5C9,\n\t12490 - 11905: 0xA5CA,\n\t12491 - 11905: 0xA5CB,\n\t12492 - 11905: 0xA5CC,\n\t12493 - 11905: 0xA5CD,\n\t12494 - 11905: 0xA5CE,\n\t12495 - 11905: 0xA5CF,\n\t12496 - 11905: 0xA5D0,\n\t12497 - 11905: 0xA5D1,\n\t12498 - 11905: 0xA5D2,\n\t12499 - 11905: 0xA5D3,\n\t12500 - 11905: 0xA5D4,\n\t12501 - 11905: 0xA5D5,\n\t12502 - 11905: 0xA5D6,\n\t12503 - 11905: 0xA5D7,\n\t12504 - 11905: 0xA5D8,\n\t12505 - 11905: 0xA5D9,\n\t12506 - 11905: 0xA5DA,\n\t12507 - 11905: 0xA5DB,\n\t12508 - 11905: 0xA5DC,\n\t12509 - 11905: 0xA5DD,\n\t12510 - 11905: 0xA5DE,\n\t12511 - 11905: 0xA5DF,\n\t12512 - 11905: 0xA5E0,\n\t12513 - 11905: 0xA5E1,\n\t12514 - 11905: 0xA5E2,\n\t12515 - 11905: 0xA5E3,\n\t12516 - 11905: 0xA5E4,\n\t12517 - 11905: 0xA5E5,\n\t12518 - 11905: 0xA5E6,\n\t12519 - 11905: 0xA5E7,\n\t12520 - 11905: 0xA5E8,\n\t12521 - 11905: 0xA5E9,\n\t12522 - 11905: 0xA5EA,\n\t12523 - 11905: 0xA5EB,\n\t12524 - 11905: 0xA5EC,\n\t12525 - 11905: 0xA5ED,\n\t12526 - 11905: 0xA5EE,\n\t12527 - 11905: 0xA5EF,\n\t12528 - 11905: 0xA5F0,\n\t12529 - 11905: 0xA5F1,\n\t12530 - 11905: 0xA5F2,\n\t12531 - 11905: 0xA5F3,\n\t12532 - 11905: 0xA5F4,\n\t12533 - 11905: 0xA5F5,\n\t12534 - 11905: 0xA5F6,\n\t12540 - 11905: 0xA960,\n\t12541 - 11905: 0xA963,\n\t12542 - 11905: 0xA964,\n\t12549 - 11905: 0xA8C5,\n\t12550 - 11905: 0xA8C6,\n\t12551 - 11905: 0xA8C7,\n\t12552 - 11905: 0xA8C8,\n\t12553 - 11905: 0xA8C9,\n\t12554 - 11905: 0xA8CA,\n\t12555 - 11905: 0xA8CB,\n\t12556 - 11905: 0xA8CC,\n\t12557 - 11905: 0xA8CD,\n\t12558 - 11905: 0xA8CE,\n\t12559 - 11905: 0xA8CF,\n\t12560 - 11905: 0xA8D0,\n\t12561 - 11905: 0xA8D1,\n\t12562 - 11905: 0xA8D2,\n\t12563 - 11905: 0xA8D3,\n\t12564 - 11905: 0xA8D4,\n\t12565 - 11905: 0xA8D5,\n\t12566 - 11905: 0xA8D6,\n\t12567 - 11905: 0xA8D7,\n\t12568 - 11905: 0xA8D8,\n\t12569 - 11905: 0xA8D9,\n\t12570 - 11905: 0xA8DA,\n\t12571 - 11905: 0xA8DB,\n\t12572 - 11905: 0xA8DC,\n\t12573 - 11905: 0xA8DD,\n\t12574 - 11905: 0xA8DE,\n\t12575 - 11905: 0xA8DF,\n\t12576 - 11905: 0xA8E0,\n\t12577 - 11905: 0xA8E1,\n\t12578 - 11905: 0xA8E2,\n\t12579 - 11905: 0xA8E3,\n\t12580 - 11905: 0xA8E4,\n\t12581 - 11905: 0xA8E5,\n\t12582 - 11905: 0xA8E6,\n\t12583 - 11905: 0xA8E7,\n\t12584 - 11905: 0xA8E8,\n\t12585 - 11905: 0xA8E9,\n\t12832 - 11905: 0xA2E5,\n\t12833 - 11905: 0xA2E6,\n\t12834 - 11905: 0xA2E7,\n\t12835 - 11905: 0xA2E8,\n\t12836 - 11905: 0xA2E9,\n\t12837 - 11905: 0xA2EA,\n\t12838 - 11905: 0xA2EB,\n\t12839 - 11905: 0xA2EC,\n\t12840 - 11905: 0xA2ED,\n\t12841 - 11905: 0xA2EE,\n\t12849 - 11905: 0xA95A,\n\t12963 - 11905: 0xA949,\n\t13198 - 11905: 0xA94A,\n\t13199 - 11905: 0xA94B,\n\t13212 - 11905: 0xA94C,\n\t13213 - 11905: 0xA94D,\n\t13214 - 11905: 0xA94E,\n\t13217 - 11905: 0xA94F,\n\t13252 - 11905: 0xA950,\n\t13262 - 11905: 0xA951,\n\t13265 - 11905: 0xA952,\n\t13266 - 11905: 0xA953,\n\t13269 - 11905: 0xA954,\n\t13383 - 11905: 0xFE56,\n\t13427 - 11905: 0xFE55,\n\t13726 - 11905: 0xFE5A,\n\t13838 - 11905: 0xFE5C,\n\t13850 - 11905: 0xFE5B,\n\t14616 - 11905: 0xFE60,\n\t14702 - 11905: 0xFE5F,\n\t14799 - 11905: 0xFE62,\n\t14800 - 11905: 0xFE65,\n\t14815 - 11905: 0xFE63,\n\t14963 - 11905: 0xFE64,\n\t15182 - 11905: 0xFE68,\n\t15470 - 11905: 0xFE69,\n\t15584 - 11905: 0xFE6A,\n\t16470 - 11905: 0xFE6F,\n\t16735 - 11905: 0xFE70,\n\t17207 - 11905: 0xFE72,\n\t17324 - 11905: 0xFE78,\n\t17329 - 11905: 0xFE77,\n\t17373 - 11905: 0xFE7A,\n\t17622 - 11905: 0xFE7B,\n\t17996 - 11905: 0xFE7D,\n\t18017 - 11905: 0xFE7C,\n\t18211 - 11905: 0xFE80,\n\t18217 - 11905: 0xFE81,\n\t18300 - 11905: 0xFE82,\n\t18317 - 11905: 0xFE83,\n\t18759 - 11905: 0xFE85,\n\t18810 - 11905: 0xFE86,\n\t18813 - 11905: 0xFE87,\n\t18818 - 11905: 0xFE88,\n\t18819 - 11905: 0xFE89,\n\t18821 - 11905: 0xFE8A,\n\t18822 - 11905: 0xFE8B,\n\t18843 - 11905: 0xFE8D,\n\t18847 - 11905: 0xFE8C,\n\t18870 - 11905: 0xFE8F,\n\t18871 - 11905: 0xFE8E,\n\t19575 - 11905: 0xFE96,\n\t19615 - 11905: 0xFE93,\n\t19616 - 11905: 0xFE94,\n\t19617 - 11905: 0xFE95,\n\t19618 - 11905: 0xFE97,\n\t19619 - 11905: 0xFE92,\n\t19731 - 11905: 0xFE98,\n\t19732 - 11905: 0xFE99,\n\t19733 - 11905: 0xFE9A,\n\t19734 - 11905: 0xFE9B,\n\t19735 - 11905: 0xFE9C,\n\t19736 - 11905: 0xFE9D,\n\t19737 - 11905: 0xFE9E,\n\t19886 - 11905: 0xFE9F,\n\t19968 - 11905: 0xD2BB,\n\t19969 - 11905: 0xB6A1,\n\t19970 - 11905: 0x8140,\n\t19971 - 11905: 0xC6DF,\n\t19972 - 11905: 0x8141,\n\t19973 - 11905: 0x8142,\n\t19974 - 11905: 0x8143,\n\t19975 - 11905: 0xCDF2,\n\t19976 - 11905: 0xD5C9,\n\t19977 - 11905: 0xC8FD,\n\t19978 - 11905: 0xC9CF,\n\t19979 - 11905: 0xCFC2,\n\t19980 - 11905: 0xD8A2,\n\t19981 - 11905: 0xB2BB,\n\t19982 - 11905: 0xD3EB,\n\t19983 - 11905: 0x8144,\n\t19984 - 11905: 0xD8A4,\n\t19985 - 11905: 0xB3F3,\n\t19986 - 11905: 0x8145,\n\t19987 - 11905: 0xD7A8,\n\t19988 - 11905: 0xC7D2,\n\t19989 - 11905: 0xD8A7,\n\t19990 - 11905: 0xCAC0,\n\t19991 - 11905: 0x8146,\n\t19992 - 11905: 0xC7F0,\n\t19993 - 11905: 0xB1FB,\n\t19994 - 11905: 0xD2B5,\n\t19995 - 11905: 0xB4D4,\n\t19996 - 11905: 0xB6AB,\n\t19997 - 11905: 0xCBBF,\n\t19998 - 11905: 0xD8A9,\n\t19999 - 11905: 0x8147,\n\t20000 - 11905: 0x8148,\n\t20001 - 11905: 0x8149,\n\t20002 - 11905: 0xB6AA,\n\t20003 - 11905: 0x814A,\n\t20004 - 11905: 0xC1BD,\n\t20005 - 11905: 0xD1CF,\n\t20006 - 11905: 0x814B,\n\t20007 - 11905: 0xC9A5,\n\t20008 - 11905: 0xD8AD,\n\t20009 - 11905: 0x814C,\n\t20010 - 11905: 0xB8F6,\n\t20011 - 11905: 0xD1BE,\n\t20012 - 11905: 0xE3DC,\n\t20013 - 11905: 0xD6D0,\n\t20014 - 11905: 0x814D,\n\t20015 - 11905: 0x814E,\n\t20016 - 11905: 0xB7E1,\n\t20017 - 11905: 0x814F,\n\t20018 - 11905: 0xB4AE,\n\t20019 - 11905: 0x8150,\n\t20020 - 11905: 0xC1D9,\n\t20021 - 11905: 0x8151,\n\t20022 - 11905: 0xD8BC,\n\t20023 - 11905: 0x8152,\n\t20024 - 11905: 0xCDE8,\n\t20025 - 11905: 0xB5A4,\n\t20026 - 11905: 0xCEAA,\n\t20027 - 11905: 0xD6F7,\n\t20028 - 11905: 0x8153,\n\t20029 - 11905: 0xC0F6,\n\t20030 - 11905: 0xBED9,\n\t20031 - 11905: 0xD8AF,\n\t20032 - 11905: 0x8154,\n\t20033 - 11905: 0x8155,\n\t20034 - 11905: 0x8156,\n\t20035 - 11905: 0xC4CB,\n\t20036 - 11905: 0x8157,\n\t20037 - 11905: 0xBEC3,\n\t20038 - 11905: 0x8158,\n\t20039 - 11905: 0xD8B1,\n\t20040 - 11905: 0xC3B4,\n\t20041 - 11905: 0xD2E5,\n\t20042 - 11905: 0x8159,\n\t20043 - 11905: 0xD6AE,\n\t20044 - 11905: 0xCEDA,\n\t20045 - 11905: 0xD5A7,\n\t20046 - 11905: 0xBAF5,\n\t20047 - 11905: 0xB7A6,\n\t20048 - 11905: 0xC0D6,\n\t20049 - 11905: 0x815A,\n\t20050 - 11905: 0xC6B9,\n\t20051 - 11905: 0xC5D2,\n\t20052 - 11905: 0xC7C7,\n\t20053 - 11905: 0x815B,\n\t20054 - 11905: 0xB9D4,\n\t20055 - 11905: 0x815C,\n\t20056 - 11905: 0xB3CB,\n\t20057 - 11905: 0xD2D2,\n\t20058 - 11905: 0x815D,\n\t20059 - 11905: 0x815E,\n\t20060 - 11905: 0xD8BF,\n\t20061 - 11905: 0xBEC5,\n\t20062 - 11905: 0xC6F2,\n\t20063 - 11905: 0xD2B2,\n\t20064 - 11905: 0xCFB0,\n\t20065 - 11905: 0xCFE7,\n\t20066 - 11905: 0x815F,\n\t20067 - 11905: 0x8160,\n\t20068 - 11905: 0x8161,\n\t20069 - 11905: 0x8162,\n\t20070 - 11905: 0xCAE9,\n\t20071 - 11905: 0x8163,\n\t20072 - 11905: 0x8164,\n\t20073 - 11905: 0xD8C0,\n\t20074 - 11905: 0x8165,\n\t20075 - 11905: 0x8166,\n\t20076 - 11905: 0x8167,\n\t20077 - 11905: 0x8168,\n\t20078 - 11905: 0x8169,\n\t20079 - 11905: 0x816A,\n\t20080 - 11905: 0xC2F2,\n\t20081 - 11905: 0xC2D2,\n\t20082 - 11905: 0x816B,\n\t20083 - 11905: 0xC8E9,\n\t20084 - 11905: 0x816C,\n\t20085 - 11905: 0x816D,\n\t20086 - 11905: 0x816E,\n\t20087 - 11905: 0x816F,\n\t20088 - 11905: 0x8170,\n\t20089 - 11905: 0x8171,\n\t20090 - 11905: 0x8172,\n\t20091 - 11905: 0x8173,\n\t20092 - 11905: 0x8174,\n\t20093 - 11905: 0x8175,\n\t20094 - 11905: 0xC7AC,\n\t20095 - 11905: 0x8176,\n\t20096 - 11905: 0x8177,\n\t20097 - 11905: 0x8178,\n\t20098 - 11905: 0x8179,\n\t20099 - 11905: 0x817A,\n\t20100 - 11905: 0x817B,\n\t20101 - 11905: 0x817C,\n\t20102 - 11905: 0xC1CB,\n\t20103 - 11905: 0x817D,\n\t20104 - 11905: 0xD3E8,\n\t20105 - 11905: 0xD5F9,\n\t20106 - 11905: 0x817E,\n\t20107 - 11905: 0xCAC2,\n\t20108 - 11905: 0xB6FE,\n\t20109 - 11905: 0xD8A1,\n\t20110 - 11905: 0xD3DA,\n\t20111 - 11905: 0xBFF7,\n\t20112 - 11905: 0x8180,\n\t20113 - 11905: 0xD4C6,\n\t20114 - 11905: 0xBBA5,\n\t20115 - 11905: 0xD8C1,\n\t20116 - 11905: 0xCEE5,\n\t20117 - 11905: 0xBEAE,\n\t20118 - 11905: 0x8181,\n\t20119 - 11905: 0x8182,\n\t20120 - 11905: 0xD8A8,\n\t20121 - 11905: 0x8183,\n\t20122 - 11905: 0xD1C7,\n\t20123 - 11905: 0xD0A9,\n\t20124 - 11905: 0x8184,\n\t20125 - 11905: 0x8185,\n\t20126 - 11905: 0x8186,\n\t20127 - 11905: 0xD8BD,\n\t20128 - 11905: 0xD9EF,\n\t20129 - 11905: 0xCDF6,\n\t20130 - 11905: 0xBFBA,\n\t20131 - 11905: 0x8187,\n\t20132 - 11905: 0xBDBB,\n\t20133 - 11905: 0xBAA5,\n\t20134 - 11905: 0xD2E0,\n\t20135 - 11905: 0xB2FA,\n\t20136 - 11905: 0xBAE0,\n\t20137 - 11905: 0xC4B6,\n\t20138 - 11905: 0x8188,\n\t20139 - 11905: 0xCFED,\n\t20140 - 11905: 0xBEA9,\n\t20141 - 11905: 0xCDA4,\n\t20142 - 11905: 0xC1C1,\n\t20143 - 11905: 0x8189,\n\t20144 - 11905: 0x818A,\n\t20145 - 11905: 0x818B,\n\t20146 - 11905: 0xC7D7,\n\t20147 - 11905: 0xD9F1,\n\t20148 - 11905: 0x818C,\n\t20149 - 11905: 0xD9F4,\n\t20150 - 11905: 0x818D,\n\t20151 - 11905: 0x818E,\n\t20152 - 11905: 0x818F,\n\t20153 - 11905: 0x8190,\n\t20154 - 11905: 0xC8CB,\n\t20155 - 11905: 0xD8E9,\n\t20156 - 11905: 0x8191,\n\t20157 - 11905: 0x8192,\n\t20158 - 11905: 0x8193,\n\t20159 - 11905: 0xD2DA,\n\t20160 - 11905: 0xCAB2,\n\t20161 - 11905: 0xC8CA,\n\t20162 - 11905: 0xD8EC,\n\t20163 - 11905: 0xD8EA,\n\t20164 - 11905: 0xD8C6,\n\t20165 - 11905: 0xBDF6,\n\t20166 - 11905: 0xC6CD,\n\t20167 - 11905: 0xB3F0,\n\t20168 - 11905: 0x8194,\n\t20169 - 11905: 0xD8EB,\n\t20170 - 11905: 0xBDF1,\n\t20171 - 11905: 0xBDE9,\n\t20172 - 11905: 0x8195,\n\t20173 - 11905: 0xC8D4,\n\t20174 - 11905: 0xB4D3,\n\t20175 - 11905: 0x8196,\n\t20176 - 11905: 0x8197,\n\t20177 - 11905: 0xC2D8,\n\t20178 - 11905: 0x8198,\n\t20179 - 11905: 0xB2D6,\n\t20180 - 11905: 0xD7D0,\n\t20181 - 11905: 0xCACB,\n\t20182 - 11905: 0xCBFB,\n\t20183 - 11905: 0xD5CC,\n\t20184 - 11905: 0xB8B6,\n\t20185 - 11905: 0xCFC9,\n\t20186 - 11905: 0x8199,\n\t20187 - 11905: 0x819A,\n\t20188 - 11905: 0x819B,\n\t20189 - 11905: 0xD9DA,\n\t20190 - 11905: 0xD8F0,\n\t20191 - 11905: 0xC7AA,\n\t20192 - 11905: 0x819C,\n\t20193 - 11905: 0xD8EE,\n\t20194 - 11905: 0x819D,\n\t20195 - 11905: 0xB4FA,\n\t20196 - 11905: 0xC1EE,\n\t20197 - 11905: 0xD2D4,\n\t20198 - 11905: 0x819E,\n\t20199 - 11905: 0x819F,\n\t20200 - 11905: 0xD8ED,\n\t20201 - 11905: 0x81A0,\n\t20202 - 11905: 0xD2C7,\n\t20203 - 11905: 0xD8EF,\n\t20204 - 11905: 0xC3C7,\n\t20205 - 11905: 0x81A1,\n\t20206 - 11905: 0x81A2,\n\t20207 - 11905: 0x81A3,\n\t20208 - 11905: 0xD1F6,\n\t20209 - 11905: 0x81A4,\n\t20210 - 11905: 0xD6D9,\n\t20211 - 11905: 0xD8F2,\n\t20212 - 11905: 0x81A5,\n\t20213 - 11905: 0xD8F5,\n\t20214 - 11905: 0xBCFE,\n\t20215 - 11905: 0xBCDB,\n\t20216 - 11905: 0x81A6,\n\t20217 - 11905: 0x81A7,\n\t20218 - 11905: 0x81A8,\n\t20219 - 11905: 0xC8CE,\n\t20220 - 11905: 0x81A9,\n\t20221 - 11905: 0xB7DD,\n\t20222 - 11905: 0x81AA,\n\t20223 - 11905: 0xB7C2,\n\t20224 - 11905: 0x81AB,\n\t20225 - 11905: 0xC6F3,\n\t20226 - 11905: 0x81AC,\n\t20227 - 11905: 0x81AD,\n\t20228 - 11905: 0x81AE,\n\t20229 - 11905: 0x81AF,\n\t20230 - 11905: 0x81B0,\n\t20231 - 11905: 0x81B1,\n\t20232 - 11905: 0x81B2,\n\t20233 - 11905: 0xD8F8,\n\t20234 - 11905: 0xD2C1,\n\t20235 - 11905: 0x81B3,\n\t20236 - 11905: 0x81B4,\n\t20237 - 11905: 0xCEE9,\n\t20238 - 11905: 0xBCBF,\n\t20239 - 11905: 0xB7FC,\n\t20240 - 11905: 0xB7A5,\n\t20241 - 11905: 0xD0DD,\n\t20242 - 11905: 0x81B5,\n\t20243 - 11905: 0x81B6,\n\t20244 - 11905: 0x81B7,\n\t20245 - 11905: 0x81B8,\n\t20246 - 11905: 0x81B9,\n\t20247 - 11905: 0xD6DA,\n\t20248 - 11905: 0xD3C5,\n\t20249 - 11905: 0xBBEF,\n\t20250 - 11905: 0xBBE1,\n\t20251 - 11905: 0xD8F1,\n\t20252 - 11905: 0x81BA,\n\t20253 - 11905: 0x81BB,\n\t20254 - 11905: 0xC9A1,\n\t20255 - 11905: 0xCEB0,\n\t20256 - 11905: 0xB4AB,\n\t20257 - 11905: 0x81BC,\n\t20258 - 11905: 0xD8F3,\n\t20259 - 11905: 0x81BD,\n\t20260 - 11905: 0xC9CB,\n\t20261 - 11905: 0xD8F6,\n\t20262 - 11905: 0xC2D7,\n\t20263 - 11905: 0xD8F7,\n\t20264 - 11905: 0x81BE,\n\t20265 - 11905: 0x81BF,\n\t20266 - 11905: 0xCEB1,\n\t20267 - 11905: 0xD8F9,\n\t20268 - 11905: 0x81C0,\n\t20269 - 11905: 0x81C1,\n\t20270 - 11905: 0x81C2,\n\t20271 - 11905: 0xB2AE,\n\t20272 - 11905: 0xB9C0,\n\t20273 - 11905: 0x81C3,\n\t20274 - 11905: 0xD9A3,\n\t20275 - 11905: 0x81C4,\n\t20276 - 11905: 0xB0E9,\n\t20277 - 11905: 0x81C5,\n\t20278 - 11905: 0xC1E6,\n\t20279 - 11905: 0x81C6,\n\t20280 - 11905: 0xC9EC,\n\t20281 - 11905: 0x81C7,\n\t20282 - 11905: 0xCBC5,\n\t20283 - 11905: 0x81C8,\n\t20284 - 11905: 0xCBC6,\n\t20285 - 11905: 0xD9A4,\n\t20286 - 11905: 0x81C9,\n\t20287 - 11905: 0x81CA,\n\t20288 - 11905: 0x81CB,\n\t20289 - 11905: 0x81CC,\n\t20290 - 11905: 0x81CD,\n\t20291 - 11905: 0xB5E8,\n\t20292 - 11905: 0x81CE,\n\t20293 - 11905: 0x81CF,\n\t20294 - 11905: 0xB5AB,\n\t20295 - 11905: 0x81D0,\n\t20296 - 11905: 0x81D1,\n\t20297 - 11905: 0x81D2,\n\t20298 - 11905: 0x81D3,\n\t20299 - 11905: 0x81D4,\n\t20300 - 11905: 0x81D5,\n\t20301 - 11905: 0xCEBB,\n\t20302 - 11905: 0xB5CD,\n\t20303 - 11905: 0xD7A1,\n\t20304 - 11905: 0xD7F4,\n\t20305 - 11905: 0xD3D3,\n\t20306 - 11905: 0x81D6,\n\t20307 - 11905: 0xCCE5,\n\t20308 - 11905: 0x81D7,\n\t20309 - 11905: 0xBACE,\n\t20310 - 11905: 0x81D8,\n\t20311 - 11905: 0xD9A2,\n\t20312 - 11905: 0xD9DC,\n\t20313 - 11905: 0xD3E0,\n\t20314 - 11905: 0xD8FD,\n\t20315 - 11905: 0xB7F0,\n\t20316 - 11905: 0xD7F7,\n\t20317 - 11905: 0xD8FE,\n\t20318 - 11905: 0xD8FA,\n\t20319 - 11905: 0xD9A1,\n\t20320 - 11905: 0xC4E3,\n\t20321 - 11905: 0x81D9,\n\t20322 - 11905: 0x81DA,\n\t20323 - 11905: 0xD3B6,\n\t20324 - 11905: 0xD8F4,\n\t20325 - 11905: 0xD9DD,\n\t20326 - 11905: 0x81DB,\n\t20327 - 11905: 0xD8FB,\n\t20328 - 11905: 0x81DC,\n\t20329 - 11905: 0xC5E5,\n\t20330 - 11905: 0x81DD,\n\t20331 - 11905: 0x81DE,\n\t20332 - 11905: 0xC0D0,\n\t20333 - 11905: 0x81DF,\n\t20334 - 11905: 0x81E0,\n\t20335 - 11905: 0xD1F0,\n\t20336 - 11905: 0xB0DB,\n\t20337 - 11905: 0x81E1,\n\t20338 - 11905: 0x81E2,\n\t20339 - 11905: 0xBCD1,\n\t20340 - 11905: 0xD9A6,\n\t20341 - 11905: 0x81E3,\n\t20342 - 11905: 0xD9A5,\n\t20343 - 11905: 0x81E4,\n\t20344 - 11905: 0x81E5,\n\t20345 - 11905: 0x81E6,\n\t20346 - 11905: 0x81E7,\n\t20347 - 11905: 0xD9AC,\n\t20348 - 11905: 0xD9AE,\n\t20349 - 11905: 0x81E8,\n\t20350 - 11905: 0xD9AB,\n\t20351 - 11905: 0xCAB9,\n\t20352 - 11905: 0x81E9,\n\t20353 - 11905: 0x81EA,\n\t20354 - 11905: 0x81EB,\n\t20355 - 11905: 0xD9A9,\n\t20356 - 11905: 0xD6B6,\n\t20357 - 11905: 0x81EC,\n\t20358 - 11905: 0x81ED,\n\t20359 - 11905: 0x81EE,\n\t20360 - 11905: 0xB3DE,\n\t20361 - 11905: 0xD9A8,\n\t20362 - 11905: 0x81EF,\n\t20363 - 11905: 0xC0FD,\n\t20364 - 11905: 0x81F0,\n\t20365 - 11905: 0xCACC,\n\t20366 - 11905: 0x81F1,\n\t20367 - 11905: 0xD9AA,\n\t20368 - 11905: 0x81F2,\n\t20369 - 11905: 0xD9A7,\n\t20370 - 11905: 0x81F3,\n\t20371 - 11905: 0x81F4,\n\t20372 - 11905: 0xD9B0,\n\t20373 - 11905: 0x81F5,\n\t20374 - 11905: 0x81F6,\n\t20375 - 11905: 0xB6B1,\n\t20376 - 11905: 0x81F7,\n\t20377 - 11905: 0x81F8,\n\t20378 - 11905: 0x81F9,\n\t20379 - 11905: 0xB9A9,\n\t20380 - 11905: 0x81FA,\n\t20381 - 11905: 0xD2C0,\n\t20382 - 11905: 0x81FB,\n\t20383 - 11905: 0x81FC,\n\t20384 - 11905: 0xCFC0,\n\t20385 - 11905: 0x81FD,\n\t20386 - 11905: 0x81FE,\n\t20387 - 11905: 0xC2C2,\n\t20388 - 11905: 0x8240,\n\t20389 - 11905: 0xBDC4,\n\t20390 - 11905: 0xD5EC,\n\t20391 - 11905: 0xB2E0,\n\t20392 - 11905: 0xC7C8,\n\t20393 - 11905: 0xBFEB,\n\t20394 - 11905: 0xD9AD,\n\t20395 - 11905: 0x8241,\n\t20396 - 11905: 0xD9AF,\n\t20397 - 11905: 0x8242,\n\t20398 - 11905: 0xCEEA,\n\t20399 - 11905: 0xBAEE,\n\t20400 - 11905: 0x8243,\n\t20401 - 11905: 0x8244,\n\t20402 - 11905: 0x8245,\n\t20403 - 11905: 0x8246,\n\t20404 - 11905: 0x8247,\n\t20405 - 11905: 0xC7D6,\n\t20406 - 11905: 0x8248,\n\t20407 - 11905: 0x8249,\n\t20408 - 11905: 0x824A,\n\t20409 - 11905: 0x824B,\n\t20410 - 11905: 0x824C,\n\t20411 - 11905: 0x824D,\n\t20412 - 11905: 0x824E,\n\t20413 - 11905: 0x824F,\n\t20414 - 11905: 0x8250,\n\t20415 - 11905: 0xB1E3,\n\t20416 - 11905: 0x8251,\n\t20417 - 11905: 0x8252,\n\t20418 - 11905: 0x8253,\n\t20419 - 11905: 0xB4D9,\n\t20420 - 11905: 0xB6ED,\n\t20421 - 11905: 0xD9B4,\n\t20422 - 11905: 0x8254,\n\t20423 - 11905: 0x8255,\n\t20424 - 11905: 0x8256,\n\t20425 - 11905: 0x8257,\n\t20426 - 11905: 0xBFA1,\n\t20427 - 11905: 0x8258,\n\t20428 - 11905: 0x8259,\n\t20429 - 11905: 0x825A,\n\t20430 - 11905: 0xD9DE,\n\t20431 - 11905: 0xC7CE,\n\t20432 - 11905: 0xC0FE,\n\t20433 - 11905: 0xD9B8,\n\t20434 - 11905: 0x825B,\n\t20435 - 11905: 0x825C,\n\t20436 - 11905: 0x825D,\n\t20437 - 11905: 0x825E,\n\t20438 - 11905: 0x825F,\n\t20439 - 11905: 0xCBD7,\n\t20440 - 11905: 0xB7FD,\n\t20441 - 11905: 0x8260,\n\t20442 - 11905: 0xD9B5,\n\t20443 - 11905: 0x8261,\n\t20444 - 11905: 0xD9B7,\n\t20445 - 11905: 0xB1A3,\n\t20446 - 11905: 0xD3E1,\n\t20447 - 11905: 0xD9B9,\n\t20448 - 11905: 0x8262,\n\t20449 - 11905: 0xD0C5,\n\t20450 - 11905: 0x8263,\n\t20451 - 11905: 0xD9B6,\n\t20452 - 11905: 0x8264,\n\t20453 - 11905: 0x8265,\n\t20454 - 11905: 0xD9B1,\n\t20455 - 11905: 0x8266,\n\t20456 - 11905: 0xD9B2,\n\t20457 - 11905: 0xC1A9,\n\t20458 - 11905: 0xD9B3,\n\t20459 - 11905: 0x8267,\n\t20460 - 11905: 0x8268,\n\t20461 - 11905: 0xBCF3,\n\t20462 - 11905: 0xD0DE,\n\t20463 - 11905: 0xB8A9,\n\t20464 - 11905: 0x8269,\n\t20465 - 11905: 0xBEE3,\n\t20466 - 11905: 0x826A,\n\t20467 - 11905: 0xD9BD,\n\t20468 - 11905: 0x826B,\n\t20469 - 11905: 0x826C,\n\t20470 - 11905: 0x826D,\n\t20471 - 11905: 0x826E,\n\t20472 - 11905: 0xD9BA,\n\t20473 - 11905: 0x826F,\n\t20474 - 11905: 0xB0B3,\n\t20475 - 11905: 0x8270,\n\t20476 - 11905: 0x8271,\n\t20477 - 11905: 0x8272,\n\t20478 - 11905: 0xD9C2,\n\t20479 - 11905: 0x8273,\n\t20480 - 11905: 0x8274,\n\t20481 - 11905: 0x8275,\n\t20482 - 11905: 0x8276,\n\t20483 - 11905: 0x8277,\n\t20484 - 11905: 0x8278,\n\t20485 - 11905: 0x8279,\n\t20486 - 11905: 0x827A,\n\t20487 - 11905: 0x827B,\n\t20488 - 11905: 0x827C,\n\t20489 - 11905: 0x827D,\n\t20490 - 11905: 0x827E,\n\t20491 - 11905: 0x8280,\n\t20492 - 11905: 0xD9C4,\n\t20493 - 11905: 0xB1B6,\n\t20494 - 11905: 0x8281,\n\t20495 - 11905: 0xD9BF,\n\t20496 - 11905: 0x8282,\n\t20497 - 11905: 0x8283,\n\t20498 - 11905: 0xB5B9,\n\t20499 - 11905: 0x8284,\n\t20500 - 11905: 0xBEF3,\n\t20501 - 11905: 0x8285,\n\t20502 - 11905: 0x8286,\n\t20503 - 11905: 0x8287,\n\t20504 - 11905: 0xCCC8,\n\t20505 - 11905: 0xBAF2,\n\t20506 - 11905: 0xD2D0,\n\t20507 - 11905: 0x8288,\n\t20508 - 11905: 0xD9C3,\n\t20509 - 11905: 0x8289,\n\t20510 - 11905: 0x828A,\n\t20511 - 11905: 0xBDE8,\n\t20512 - 11905: 0x828B,\n\t20513 - 11905: 0xB3AB,\n\t20514 - 11905: 0x828C,\n\t20515 - 11905: 0x828D,\n\t20516 - 11905: 0x828E,\n\t20517 - 11905: 0xD9C5,\n\t20518 - 11905: 0xBEEB,\n\t20519 - 11905: 0x828F,\n\t20520 - 11905: 0xD9C6,\n\t20521 - 11905: 0xD9BB,\n\t20522 - 11905: 0xC4DF,\n\t20523 - 11905: 0x8290,\n\t20524 - 11905: 0xD9BE,\n\t20525 - 11905: 0xD9C1,\n\t20526 - 11905: 0xD9C0,\n\t20527 - 11905: 0x8291,\n\t20528 - 11905: 0x8292,\n\t20529 - 11905: 0x8293,\n\t20530 - 11905: 0x8294,\n\t20531 - 11905: 0x8295,\n\t20532 - 11905: 0x8296,\n\t20533 - 11905: 0x8297,\n\t20534 - 11905: 0x8298,\n\t20535 - 11905: 0x8299,\n\t20536 - 11905: 0x829A,\n\t20537 - 11905: 0x829B,\n\t20538 - 11905: 0xD5AE,\n\t20539 - 11905: 0x829C,\n\t20540 - 11905: 0xD6B5,\n\t20541 - 11905: 0x829D,\n\t20542 - 11905: 0xC7E3,\n\t20543 - 11905: 0x829E,\n\t20544 - 11905: 0x829F,\n\t20545 - 11905: 0x82A0,\n\t20546 - 11905: 0x82A1,\n\t20547 - 11905: 0xD9C8,\n\t20548 - 11905: 0x82A2,\n\t20549 - 11905: 0x82A3,\n\t20550 - 11905: 0x82A4,\n\t20551 - 11905: 0xBCD9,\n\t20552 - 11905: 0xD9CA,\n\t20553 - 11905: 0x82A5,\n\t20554 - 11905: 0x82A6,\n\t20555 - 11905: 0x82A7,\n\t20556 - 11905: 0xD9BC,\n\t20557 - 11905: 0x82A8,\n\t20558 - 11905: 0xD9CB,\n\t20559 - 11905: 0xC6AB,\n\t20560 - 11905: 0x82A9,\n\t20561 - 11905: 0x82AA,\n\t20562 - 11905: 0x82AB,\n\t20563 - 11905: 0x82AC,\n\t20564 - 11905: 0x82AD,\n\t20565 - 11905: 0xD9C9,\n\t20566 - 11905: 0x82AE,\n\t20567 - 11905: 0x82AF,\n\t20568 - 11905: 0x82B0,\n\t20569 - 11905: 0x82B1,\n\t20570 - 11905: 0xD7F6,\n\t20571 - 11905: 0x82B2,\n\t20572 - 11905: 0xCDA3,\n\t20573 - 11905: 0x82B3,\n\t20574 - 11905: 0x82B4,\n\t20575 - 11905: 0x82B5,\n\t20576 - 11905: 0x82B6,\n\t20577 - 11905: 0x82B7,\n\t20578 - 11905: 0x82B8,\n\t20579 - 11905: 0x82B9,\n\t20580 - 11905: 0x82BA,\n\t20581 - 11905: 0xBDA1,\n\t20582 - 11905: 0x82BB,\n\t20583 - 11905: 0x82BC,\n\t20584 - 11905: 0x82BD,\n\t20585 - 11905: 0x82BE,\n\t20586 - 11905: 0x82BF,\n\t20587 - 11905: 0x82C0,\n\t20588 - 11905: 0xD9CC,\n\t20589 - 11905: 0x82C1,\n\t20590 - 11905: 0x82C2,\n\t20591 - 11905: 0x82C3,\n\t20592 - 11905: 0x82C4,\n\t20593 - 11905: 0x82C5,\n\t20594 - 11905: 0x82C6,\n\t20595 - 11905: 0x82C7,\n\t20596 - 11905: 0x82C8,\n\t20597 - 11905: 0x82C9,\n\t20598 - 11905: 0xC5BC,\n\t20599 - 11905: 0xCDB5,\n\t20600 - 11905: 0x82CA,\n\t20601 - 11905: 0x82CB,\n\t20602 - 11905: 0x82CC,\n\t20603 - 11905: 0xD9CD,\n\t20604 - 11905: 0x82CD,\n\t20605 - 11905: 0x82CE,\n\t20606 - 11905: 0xD9C7,\n\t20607 - 11905: 0xB3A5,\n\t20608 - 11905: 0xBFFE,\n\t20609 - 11905: 0x82CF,\n\t20610 - 11905: 0x82D0,\n\t20611 - 11905: 0x82D1,\n\t20612 - 11905: 0x82D2,\n\t20613 - 11905: 0xB8B5,\n\t20614 - 11905: 0x82D3,\n\t20615 - 11905: 0x82D4,\n\t20616 - 11905: 0xC0FC,\n\t20617 - 11905: 0x82D5,\n\t20618 - 11905: 0x82D6,\n\t20619 - 11905: 0x82D7,\n\t20620 - 11905: 0x82D8,\n\t20621 - 11905: 0xB0F8,\n\t20622 - 11905: 0x82D9,\n\t20623 - 11905: 0x82DA,\n\t20624 - 11905: 0x82DB,\n\t20625 - 11905: 0x82DC,\n\t20626 - 11905: 0x82DD,\n\t20627 - 11905: 0x82DE,\n\t20628 - 11905: 0x82DF,\n\t20629 - 11905: 0x82E0,\n\t20630 - 11905: 0x82E1,\n\t20631 - 11905: 0x82E2,\n\t20632 - 11905: 0x82E3,\n\t20633 - 11905: 0x82E4,\n\t20634 - 11905: 0x82E5,\n\t20635 - 11905: 0x82E6,\n\t20636 - 11905: 0x82E7,\n\t20637 - 11905: 0x82E8,\n\t20638 - 11905: 0x82E9,\n\t20639 - 11905: 0x82EA,\n\t20640 - 11905: 0x82EB,\n\t20641 - 11905: 0x82EC,\n\t20642 - 11905: 0x82ED,\n\t20643 - 11905: 0xB4F6,\n\t20644 - 11905: 0x82EE,\n\t20645 - 11905: 0xD9CE,\n\t20646 - 11905: 0x82EF,\n\t20647 - 11905: 0xD9CF,\n\t20648 - 11905: 0xB4A2,\n\t20649 - 11905: 0xD9D0,\n\t20650 - 11905: 0x82F0,\n\t20651 - 11905: 0x82F1,\n\t20652 - 11905: 0xB4DF,\n\t20653 - 11905: 0x82F2,\n\t20654 - 11905: 0x82F3,\n\t20655 - 11905: 0x82F4,\n\t20656 - 11905: 0x82F5,\n\t20657 - 11905: 0x82F6,\n\t20658 - 11905: 0xB0C1,\n\t20659 - 11905: 0x82F7,\n\t20660 - 11905: 0x82F8,\n\t20661 - 11905: 0x82F9,\n\t20662 - 11905: 0x82FA,\n\t20663 - 11905: 0x82FB,\n\t20664 - 11905: 0x82FC,\n\t20665 - 11905: 0x82FD,\n\t20666 - 11905: 0xD9D1,\n\t20667 - 11905: 0xC9B5,\n\t20668 - 11905: 0x82FE,\n\t20669 - 11905: 0x8340,\n\t20670 - 11905: 0x8341,\n\t20671 - 11905: 0x8342,\n\t20672 - 11905: 0x8343,\n\t20673 - 11905: 0x8344,\n\t20674 - 11905: 0x8345,\n\t20675 - 11905: 0x8346,\n\t20676 - 11905: 0x8347,\n\t20677 - 11905: 0x8348,\n\t20678 - 11905: 0x8349,\n\t20679 - 11905: 0x834A,\n\t20680 - 11905: 0x834B,\n\t20681 - 11905: 0x834C,\n\t20682 - 11905: 0x834D,\n\t20683 - 11905: 0x834E,\n\t20684 - 11905: 0x834F,\n\t20685 - 11905: 0x8350,\n\t20686 - 11905: 0x8351,\n\t20687 - 11905: 0xCFF1,\n\t20688 - 11905: 0x8352,\n\t20689 - 11905: 0x8353,\n\t20690 - 11905: 0x8354,\n\t20691 - 11905: 0x8355,\n\t20692 - 11905: 0x8356,\n\t20693 - 11905: 0x8357,\n\t20694 - 11905: 0xD9D2,\n\t20695 - 11905: 0x8358,\n\t20696 - 11905: 0x8359,\n\t20697 - 11905: 0x835A,\n\t20698 - 11905: 0xC1C5,\n\t20699 - 11905: 0x835B,\n\t20700 - 11905: 0x835C,\n\t20701 - 11905: 0x835D,\n\t20702 - 11905: 0x835E,\n\t20703 - 11905: 0x835F,\n\t20704 - 11905: 0x8360,\n\t20705 - 11905: 0x8361,\n\t20706 - 11905: 0x8362,\n\t20707 - 11905: 0x8363,\n\t20708 - 11905: 0x8364,\n\t20709 - 11905: 0x8365,\n\t20710 - 11905: 0xD9D6,\n\t20711 - 11905: 0xC9AE,\n\t20712 - 11905: 0x8366,\n\t20713 - 11905: 0x8367,\n\t20714 - 11905: 0x8368,\n\t20715 - 11905: 0x8369,\n\t20716 - 11905: 0xD9D5,\n\t20717 - 11905: 0xD9D4,\n\t20718 - 11905: 0xD9D7,\n\t20719 - 11905: 0x836A,\n\t20720 - 11905: 0x836B,\n\t20721 - 11905: 0x836C,\n\t20722 - 11905: 0x836D,\n\t20723 - 11905: 0xCBDB,\n\t20724 - 11905: 0x836E,\n\t20725 - 11905: 0xBDA9,\n\t20726 - 11905: 0x836F,\n\t20727 - 11905: 0x8370,\n\t20728 - 11905: 0x8371,\n\t20729 - 11905: 0x8372,\n\t20730 - 11905: 0x8373,\n\t20731 - 11905: 0xC6A7,\n\t20732 - 11905: 0x8374,\n\t20733 - 11905: 0x8375,\n\t20734 - 11905: 0x8376,\n\t20735 - 11905: 0x8377,\n\t20736 - 11905: 0x8378,\n\t20737 - 11905: 0x8379,\n\t20738 - 11905: 0x837A,\n\t20739 - 11905: 0x837B,\n\t20740 - 11905: 0x837C,\n\t20741 - 11905: 0x837D,\n\t20742 - 11905: 0xD9D3,\n\t20743 - 11905: 0xD9D8,\n\t20744 - 11905: 0x837E,\n\t20745 - 11905: 0x8380,\n\t20746 - 11905: 0x8381,\n\t20747 - 11905: 0xD9D9,\n\t20748 - 11905: 0x8382,\n\t20749 - 11905: 0x8383,\n\t20750 - 11905: 0x8384,\n\t20751 - 11905: 0x8385,\n\t20752 - 11905: 0x8386,\n\t20753 - 11905: 0x8387,\n\t20754 - 11905: 0xC8E5,\n\t20755 - 11905: 0x8388,\n\t20756 - 11905: 0x8389,\n\t20757 - 11905: 0x838A,\n\t20758 - 11905: 0x838B,\n\t20759 - 11905: 0x838C,\n\t20760 - 11905: 0x838D,\n\t20761 - 11905: 0x838E,\n\t20762 - 11905: 0x838F,\n\t20763 - 11905: 0x8390,\n\t20764 - 11905: 0x8391,\n\t20765 - 11905: 0x8392,\n\t20766 - 11905: 0x8393,\n\t20767 - 11905: 0x8394,\n\t20768 - 11905: 0x8395,\n\t20769 - 11905: 0xC0DC,\n\t20770 - 11905: 0x8396,\n\t20771 - 11905: 0x8397,\n\t20772 - 11905: 0x8398,\n\t20773 - 11905: 0x8399,\n\t20774 - 11905: 0x839A,\n\t20775 - 11905: 0x839B,\n\t20776 - 11905: 0x839C,\n\t20777 - 11905: 0x839D,\n\t20778 - 11905: 0x839E,\n\t20779 - 11905: 0x839F,\n\t20780 - 11905: 0x83A0,\n\t20781 - 11905: 0x83A1,\n\t20782 - 11905: 0x83A2,\n\t20783 - 11905: 0x83A3,\n\t20784 - 11905: 0x83A4,\n\t20785 - 11905: 0x83A5,\n\t20786 - 11905: 0x83A6,\n\t20787 - 11905: 0x83A7,\n\t20788 - 11905: 0x83A8,\n\t20789 - 11905: 0x83A9,\n\t20790 - 11905: 0x83AA,\n\t20791 - 11905: 0x83AB,\n\t20792 - 11905: 0x83AC,\n\t20793 - 11905: 0x83AD,\n\t20794 - 11905: 0x83AE,\n\t20795 - 11905: 0x83AF,\n\t20796 - 11905: 0x83B0,\n\t20797 - 11905: 0x83B1,\n\t20798 - 11905: 0x83B2,\n\t20799 - 11905: 0xB6F9,\n\t20800 - 11905: 0xD8A3,\n\t20801 - 11905: 0xD4CA,\n\t20802 - 11905: 0x83B3,\n\t20803 - 11905: 0xD4AA,\n\t20804 - 11905: 0xD0D6,\n\t20805 - 11905: 0xB3E4,\n\t20806 - 11905: 0xD5D7,\n\t20807 - 11905: 0x83B4,\n\t20808 - 11905: 0xCFC8,\n\t20809 - 11905: 0xB9E2,\n\t20810 - 11905: 0x83B5,\n\t20811 - 11905: 0xBFCB,\n\t20812 - 11905: 0x83B6,\n\t20813 - 11905: 0xC3E2,\n\t20814 - 11905: 0x83B7,\n\t20815 - 11905: 0x83B8,\n\t20816 - 11905: 0x83B9,\n\t20817 - 11905: 0xB6D2,\n\t20818 - 11905: 0x83BA,\n\t20819 - 11905: 0x83BB,\n\t20820 - 11905: 0xCDC3,\n\t20821 - 11905: 0xD9EE,\n\t20822 - 11905: 0xD9F0,\n\t20823 - 11905: 0x83BC,\n\t20824 - 11905: 0x83BD,\n\t20825 - 11905: 0x83BE,\n\t20826 - 11905: 0xB5B3,\n\t20827 - 11905: 0x83BF,\n\t20828 - 11905: 0xB6B5,\n\t20829 - 11905: 0x83C0,\n\t20830 - 11905: 0x83C1,\n\t20831 - 11905: 0x83C2,\n\t20832 - 11905: 0x83C3,\n\t20833 - 11905: 0x83C4,\n\t20834 - 11905: 0xBEA4,\n\t20835 - 11905: 0x83C5,\n\t20836 - 11905: 0x83C6,\n\t20837 - 11905: 0xC8EB,\n\t20838 - 11905: 0x83C7,\n\t20839 - 11905: 0x83C8,\n\t20840 - 11905: 0xC8AB,\n\t20841 - 11905: 0x83C9,\n\t20842 - 11905: 0x83CA,\n\t20843 - 11905: 0xB0CB,\n\t20844 - 11905: 0xB9AB,\n\t20845 - 11905: 0xC1F9,\n\t20846 - 11905: 0xD9E2,\n\t20847 - 11905: 0x83CB,\n\t20848 - 11905: 0xC0BC,\n\t20849 - 11905: 0xB9B2,\n\t20850 - 11905: 0x83CC,\n\t20851 - 11905: 0xB9D8,\n\t20852 - 11905: 0xD0CB,\n\t20853 - 11905: 0xB1F8,\n\t20854 - 11905: 0xC6E4,\n\t20855 - 11905: 0xBEDF,\n\t20856 - 11905: 0xB5E4,\n\t20857 - 11905: 0xD7C8,\n\t20858 - 11905: 0x83CD,\n\t20859 - 11905: 0xD1F8,\n\t20860 - 11905: 0xBCE6,\n\t20861 - 11905: 0xCADE,\n\t20862 - 11905: 0x83CE,\n\t20863 - 11905: 0x83CF,\n\t20864 - 11905: 0xBCBD,\n\t20865 - 11905: 0xD9E6,\n\t20866 - 11905: 0xD8E7,\n\t20867 - 11905: 0x83D0,\n\t20868 - 11905: 0x83D1,\n\t20869 - 11905: 0xC4DA,\n\t20870 - 11905: 0x83D2,\n\t20871 - 11905: 0x83D3,\n\t20872 - 11905: 0xB8D4,\n\t20873 - 11905: 0xC8BD,\n\t20874 - 11905: 0x83D4,\n\t20875 - 11905: 0x83D5,\n\t20876 - 11905: 0xB2E1,\n\t20877 - 11905: 0xD4D9,\n\t20878 - 11905: 0x83D6,\n\t20879 - 11905: 0x83D7,\n\t20880 - 11905: 0x83D8,\n\t20881 - 11905: 0x83D9,\n\t20882 - 11905: 0xC3B0,\n\t20883 - 11905: 0x83DA,\n\t20884 - 11905: 0x83DB,\n\t20885 - 11905: 0xC3E1,\n\t20886 - 11905: 0xDAA2,\n\t20887 - 11905: 0xC8DF,\n\t20888 - 11905: 0x83DC,\n\t20889 - 11905: 0xD0B4,\n\t20890 - 11905: 0x83DD,\n\t20891 - 11905: 0xBEFC,\n\t20892 - 11905: 0xC5A9,\n\t20893 - 11905: 0x83DE,\n\t20894 - 11905: 0x83DF,\n\t20895 - 11905: 0x83E0,\n\t20896 - 11905: 0xB9DA,\n\t20897 - 11905: 0x83E1,\n\t20898 - 11905: 0xDAA3,\n\t20899 - 11905: 0x83E2,\n\t20900 - 11905: 0xD4A9,\n\t20901 - 11905: 0xDAA4,\n\t20902 - 11905: 0x83E3,\n\t20903 - 11905: 0x83E4,\n\t20904 - 11905: 0x83E5,\n\t20905 - 11905: 0x83E6,\n\t20906 - 11905: 0x83E7,\n\t20907 - 11905: 0xD9FB,\n\t20908 - 11905: 0xB6AC,\n\t20909 - 11905: 0x83E8,\n\t20910 - 11905: 0x83E9,\n\t20911 - 11905: 0xB7EB,\n\t20912 - 11905: 0xB1F9,\n\t20913 - 11905: 0xD9FC,\n\t20914 - 11905: 0xB3E5,\n\t20915 - 11905: 0xBEF6,\n\t20916 - 11905: 0x83EA,\n\t20917 - 11905: 0xBFF6,\n\t20918 - 11905: 0xD2B1,\n\t20919 - 11905: 0xC0E4,\n\t20920 - 11905: 0x83EB,\n\t20921 - 11905: 0x83EC,\n\t20922 - 11905: 0x83ED,\n\t20923 - 11905: 0xB6B3,\n\t20924 - 11905: 0xD9FE,\n\t20925 - 11905: 0xD9FD,\n\t20926 - 11905: 0x83EE,\n\t20927 - 11905: 0x83EF,\n\t20928 - 11905: 0xBEBB,\n\t20929 - 11905: 0x83F0,\n\t20930 - 11905: 0x83F1,\n\t20931 - 11905: 0x83F2,\n\t20932 - 11905: 0xC6E0,\n\t20933 - 11905: 0x83F3,\n\t20934 - 11905: 0xD7BC,\n\t20935 - 11905: 0xDAA1,\n\t20936 - 11905: 0x83F4,\n\t20937 - 11905: 0xC1B9,\n\t20938 - 11905: 0x83F5,\n\t20939 - 11905: 0xB5F2,\n\t20940 - 11905: 0xC1E8,\n\t20941 - 11905: 0x83F6,\n\t20942 - 11905: 0x83F7,\n\t20943 - 11905: 0xBCF5,\n\t20944 - 11905: 0x83F8,\n\t20945 - 11905: 0xB4D5,\n\t20946 - 11905: 0x83F9,\n\t20947 - 11905: 0x83FA,\n\t20948 - 11905: 0x83FB,\n\t20949 - 11905: 0x83FC,\n\t20950 - 11905: 0x83FD,\n\t20951 - 11905: 0x83FE,\n\t20952 - 11905: 0x8440,\n\t20953 - 11905: 0x8441,\n\t20954 - 11905: 0x8442,\n\t20955 - 11905: 0xC1DD,\n\t20956 - 11905: 0x8443,\n\t20957 - 11905: 0xC4FD,\n\t20958 - 11905: 0x8444,\n\t20959 - 11905: 0x8445,\n\t20960 - 11905: 0xBCB8,\n\t20961 - 11905: 0xB7B2,\n\t20962 - 11905: 0x8446,\n\t20963 - 11905: 0x8447,\n\t20964 - 11905: 0xB7EF,\n\t20965 - 11905: 0x8448,\n\t20966 - 11905: 0x8449,\n\t20967 - 11905: 0x844A,\n\t20968 - 11905: 0x844B,\n\t20969 - 11905: 0x844C,\n\t20970 - 11905: 0x844D,\n\t20971 - 11905: 0xD9EC,\n\t20972 - 11905: 0x844E,\n\t20973 - 11905: 0xC6BE,\n\t20974 - 11905: 0x844F,\n\t20975 - 11905: 0xBFAD,\n\t20976 - 11905: 0xBBCB,\n\t20977 - 11905: 0x8450,\n\t20978 - 11905: 0x8451,\n\t20979 - 11905: 0xB5CA,\n\t20980 - 11905: 0x8452,\n\t20981 - 11905: 0xDBC9,\n\t20982 - 11905: 0xD0D7,\n\t20983 - 11905: 0x8453,\n\t20984 - 11905: 0xCDB9,\n\t20985 - 11905: 0xB0BC,\n\t20986 - 11905: 0xB3F6,\n\t20987 - 11905: 0xBBF7,\n\t20988 - 11905: 0xDBCA,\n\t20989 - 11905: 0xBAAF,\n\t20990 - 11905: 0x8454,\n\t20991 - 11905: 0xD4E4,\n\t20992 - 11905: 0xB5B6,\n\t20993 - 11905: 0xB5F3,\n\t20994 - 11905: 0xD8D6,\n\t20995 - 11905: 0xC8D0,\n\t20996 - 11905: 0x8455,\n\t20997 - 11905: 0x8456,\n\t20998 - 11905: 0xB7D6,\n\t20999 - 11905: 0xC7D0,\n\t21000 - 11905: 0xD8D7,\n\t21001 - 11905: 0x8457,\n\t21002 - 11905: 0xBFAF,\n\t21003 - 11905: 0x8458,\n\t21004 - 11905: 0x8459,\n\t21005 - 11905: 0xDBBB,\n\t21006 - 11905: 0xD8D8,\n\t21007 - 11905: 0x845A,\n\t21008 - 11905: 0x845B,\n\t21009 - 11905: 0xD0CC,\n\t21010 - 11905: 0xBBAE,\n\t21011 - 11905: 0x845C,\n\t21012 - 11905: 0x845D,\n\t21013 - 11905: 0x845E,\n\t21014 - 11905: 0xEBBE,\n\t21015 - 11905: 0xC1D0,\n\t21016 - 11905: 0xC1F5,\n\t21017 - 11905: 0xD4F2,\n\t21018 - 11905: 0xB8D5,\n\t21019 - 11905: 0xB4B4,\n\t21020 - 11905: 0x845F,\n\t21021 - 11905: 0xB3F5,\n\t21022 - 11905: 0x8460,\n\t21023 - 11905: 0x8461,\n\t21024 - 11905: 0xC9BE,\n\t21025 - 11905: 0x8462,\n\t21026 - 11905: 0x8463,\n\t21027 - 11905: 0x8464,\n\t21028 - 11905: 0xC5D0,\n\t21029 - 11905: 0x8465,\n\t21030 - 11905: 0x8466,\n\t21031 - 11905: 0x8467,\n\t21032 - 11905: 0xC5D9,\n\t21033 - 11905: 0xC0FB,\n\t21034 - 11905: 0x8468,\n\t21035 - 11905: 0xB1F0,\n\t21036 - 11905: 0x8469,\n\t21037 - 11905: 0xD8D9,\n\t21038 - 11905: 0xB9CE,\n\t21039 - 11905: 0x846A,\n\t21040 - 11905: 0xB5BD,\n\t21041 - 11905: 0x846B,\n\t21042 - 11905: 0x846C,\n\t21043 - 11905: 0xD8DA,\n\t21044 - 11905: 0x846D,\n\t21045 - 11905: 0x846E,\n\t21046 - 11905: 0xD6C6,\n\t21047 - 11905: 0xCBA2,\n\t21048 - 11905: 0xC8AF,\n\t21049 - 11905: 0xC9B2,\n\t21050 - 11905: 0xB4CC,\n\t21051 - 11905: 0xBFCC,\n\t21052 - 11905: 0x846F,\n\t21053 - 11905: 0xB9F4,\n\t21054 - 11905: 0x8470,\n\t21055 - 11905: 0xD8DB,\n\t21056 - 11905: 0xD8DC,\n\t21057 - 11905: 0xB6E7,\n\t21058 - 11905: 0xBCC1,\n\t21059 - 11905: 0xCCEA,\n\t21060 - 11905: 0x8471,\n\t21061 - 11905: 0x8472,\n\t21062 - 11905: 0x8473,\n\t21063 - 11905: 0x8474,\n\t21064 - 11905: 0x8475,\n\t21065 - 11905: 0x8476,\n\t21066 - 11905: 0xCFF7,\n\t21067 - 11905: 0x8477,\n\t21068 - 11905: 0xD8DD,\n\t21069 - 11905: 0xC7B0,\n\t21070 - 11905: 0x8478,\n\t21071 - 11905: 0x8479,\n\t21072 - 11905: 0xB9D0,\n\t21073 - 11905: 0xBDA3,\n\t21074 - 11905: 0x847A,\n\t21075 - 11905: 0x847B,\n\t21076 - 11905: 0xCCDE,\n\t21077 - 11905: 0x847C,\n\t21078 - 11905: 0xC6CA,\n\t21079 - 11905: 0x847D,\n\t21080 - 11905: 0x847E,\n\t21081 - 11905: 0x8480,\n\t21082 - 11905: 0x8481,\n\t21083 - 11905: 0x8482,\n\t21084 - 11905: 0xD8E0,\n\t21085 - 11905: 0x8483,\n\t21086 - 11905: 0xD8DE,\n\t21087 - 11905: 0x8484,\n\t21088 - 11905: 0x8485,\n\t21089 - 11905: 0xD8DF,\n\t21090 - 11905: 0x8486,\n\t21091 - 11905: 0x8487,\n\t21092 - 11905: 0x8488,\n\t21093 - 11905: 0xB0FE,\n\t21094 - 11905: 0x8489,\n\t21095 - 11905: 0xBEE7,\n\t21096 - 11905: 0x848A,\n\t21097 - 11905: 0xCAA3,\n\t21098 - 11905: 0xBCF4,\n\t21099 - 11905: 0x848B,\n\t21100 - 11905: 0x848C,\n\t21101 - 11905: 0x848D,\n\t21102 - 11905: 0x848E,\n\t21103 - 11905: 0xB8B1,\n\t21104 - 11905: 0x848F,\n\t21105 - 11905: 0x8490,\n\t21106 - 11905: 0xB8EE,\n\t21107 - 11905: 0x8491,\n\t21108 - 11905: 0x8492,\n\t21109 - 11905: 0x8493,\n\t21110 - 11905: 0x8494,\n\t21111 - 11905: 0x8495,\n\t21112 - 11905: 0x8496,\n\t21113 - 11905: 0x8497,\n\t21114 - 11905: 0x8498,\n\t21115 - 11905: 0x8499,\n\t21116 - 11905: 0x849A,\n\t21117 - 11905: 0xD8E2,\n\t21118 - 11905: 0x849B,\n\t21119 - 11905: 0xBDCB,\n\t21120 - 11905: 0x849C,\n\t21121 - 11905: 0xD8E4,\n\t21122 - 11905: 0xD8E3,\n\t21123 - 11905: 0x849D,\n\t21124 - 11905: 0x849E,\n\t21125 - 11905: 0x849F,\n\t21126 - 11905: 0x84A0,\n\t21127 - 11905: 0x84A1,\n\t21128 - 11905: 0xC5FC,\n\t21129 - 11905: 0x84A2,\n\t21130 - 11905: 0x84A3,\n\t21131 - 11905: 0x84A4,\n\t21132 - 11905: 0x84A5,\n\t21133 - 11905: 0x84A6,\n\t21134 - 11905: 0x84A7,\n\t21135 - 11905: 0x84A8,\n\t21136 - 11905: 0xD8E5,\n\t21137 - 11905: 0x84A9,\n\t21138 - 11905: 0x84AA,\n\t21139 - 11905: 0xD8E6,\n\t21140 - 11905: 0x84AB,\n\t21141 - 11905: 0x84AC,\n\t21142 - 11905: 0x84AD,\n\t21143 - 11905: 0x84AE,\n\t21144 - 11905: 0x84AF,\n\t21145 - 11905: 0x84B0,\n\t21146 - 11905: 0x84B1,\n\t21147 - 11905: 0xC1A6,\n\t21148 - 11905: 0x84B2,\n\t21149 - 11905: 0xC8B0,\n\t21150 - 11905: 0xB0EC,\n\t21151 - 11905: 0xB9A6,\n\t21152 - 11905: 0xBCD3,\n\t21153 - 11905: 0xCEF1,\n\t21154 - 11905: 0xDBBD,\n\t21155 - 11905: 0xC1D3,\n\t21156 - 11905: 0x84B3,\n\t21157 - 11905: 0x84B4,\n\t21158 - 11905: 0x84B5,\n\t21159 - 11905: 0x84B6,\n\t21160 - 11905: 0xB6AF,\n\t21161 - 11905: 0xD6FA,\n\t21162 - 11905: 0xC5AC,\n\t21163 - 11905: 0xBDD9,\n\t21164 - 11905: 0xDBBE,\n\t21165 - 11905: 0xDBBF,\n\t21166 - 11905: 0x84B7,\n\t21167 - 11905: 0x84B8,\n\t21168 - 11905: 0x84B9,\n\t21169 - 11905: 0xC0F8,\n\t21170 - 11905: 0xBEA2,\n\t21171 - 11905: 0xC0CD,\n\t21172 - 11905: 0x84BA,\n\t21173 - 11905: 0x84BB,\n\t21174 - 11905: 0x84BC,\n\t21175 - 11905: 0x84BD,\n\t21176 - 11905: 0x84BE,\n\t21177 - 11905: 0x84BF,\n\t21178 - 11905: 0x84C0,\n\t21179 - 11905: 0x84C1,\n\t21180 - 11905: 0x84C2,\n\t21181 - 11905: 0x84C3,\n\t21182 - 11905: 0xDBC0,\n\t21183 - 11905: 0xCAC6,\n\t21184 - 11905: 0x84C4,\n\t21185 - 11905: 0x84C5,\n\t21186 - 11905: 0x84C6,\n\t21187 - 11905: 0xB2AA,\n\t21188 - 11905: 0x84C7,\n\t21189 - 11905: 0x84C8,\n\t21190 - 11905: 0x84C9,\n\t21191 - 11905: 0xD3C2,\n\t21192 - 11905: 0x84CA,\n\t21193 - 11905: 0xC3E3,\n\t21194 - 11905: 0x84CB,\n\t21195 - 11905: 0xD1AB,\n\t21196 - 11905: 0x84CC,\n\t21197 - 11905: 0x84CD,\n\t21198 - 11905: 0x84CE,\n\t21199 - 11905: 0x84CF,\n\t21200 - 11905: 0xDBC2,\n\t21201 - 11905: 0x84D0,\n\t21202 - 11905: 0xC0D5,\n\t21203 - 11905: 0x84D1,\n\t21204 - 11905: 0x84D2,\n\t21205 - 11905: 0x84D3,\n\t21206 - 11905: 0xDBC3,\n\t21207 - 11905: 0x84D4,\n\t21208 - 11905: 0xBFB1,\n\t21209 - 11905: 0x84D5,\n\t21210 - 11905: 0x84D6,\n\t21211 - 11905: 0x84D7,\n\t21212 - 11905: 0x84D8,\n\t21213 - 11905: 0x84D9,\n\t21214 - 11905: 0x84DA,\n\t21215 - 11905: 0xC4BC,\n\t21216 - 11905: 0x84DB,\n\t21217 - 11905: 0x84DC,\n\t21218 - 11905: 0x84DD,\n\t21219 - 11905: 0x84DE,\n\t21220 - 11905: 0xC7DA,\n\t21221 - 11905: 0x84DF,\n\t21222 - 11905: 0x84E0,\n\t21223 - 11905: 0x84E1,\n\t21224 - 11905: 0x84E2,\n\t21225 - 11905: 0x84E3,\n\t21226 - 11905: 0x84E4,\n\t21227 - 11905: 0x84E5,\n\t21228 - 11905: 0x84E6,\n\t21229 - 11905: 0x84E7,\n\t21230 - 11905: 0x84E8,\n\t21231 - 11905: 0x84E9,\n\t21232 - 11905: 0xDBC4,\n\t21233 - 11905: 0x84EA,\n\t21234 - 11905: 0x84EB,\n\t21235 - 11905: 0x84EC,\n\t21236 - 11905: 0x84ED,\n\t21237 - 11905: 0x84EE,\n\t21238 - 11905: 0x84EF,\n\t21239 - 11905: 0x84F0,\n\t21240 - 11905: 0x84F1,\n\t21241 - 11905: 0xD9E8,\n\t21242 - 11905: 0xC9D7,\n\t21243 - 11905: 0x84F2,\n\t21244 - 11905: 0x84F3,\n\t21245 - 11905: 0x84F4,\n\t21246 - 11905: 0xB9B4,\n\t21247 - 11905: 0xCEF0,\n\t21248 - 11905: 0xD4C8,\n\t21249 - 11905: 0x84F5,\n\t21250 - 11905: 0x84F6,\n\t21251 - 11905: 0x84F7,\n\t21252 - 11905: 0x84F8,\n\t21253 - 11905: 0xB0FC,\n\t21254 - 11905: 0xB4D2,\n\t21255 - 11905: 0x84F9,\n\t21256 - 11905: 0xD0D9,\n\t21257 - 11905: 0x84FA,\n\t21258 - 11905: 0x84FB,\n\t21259 - 11905: 0x84FC,\n\t21260 - 11905: 0x84FD,\n\t21261 - 11905: 0xD9E9,\n\t21262 - 11905: 0x84FE,\n\t21263 - 11905: 0xDECB,\n\t21264 - 11905: 0xD9EB,\n\t21265 - 11905: 0x8540,\n\t21266 - 11905: 0x8541,\n\t21267 - 11905: 0x8542,\n\t21268 - 11905: 0x8543,\n\t21269 - 11905: 0xD8B0,\n\t21270 - 11905: 0xBBAF,\n\t21271 - 11905: 0xB1B1,\n\t21272 - 11905: 0x8544,\n\t21273 - 11905: 0xB3D7,\n\t21274 - 11905: 0xD8CE,\n\t21275 - 11905: 0x8545,\n\t21276 - 11905: 0x8546,\n\t21277 - 11905: 0xD4D1,\n\t21278 - 11905: 0x8547,\n\t21279 - 11905: 0x8548,\n\t21280 - 11905: 0xBDB3,\n\t21281 - 11905: 0xBFEF,\n\t21282 - 11905: 0x8549,\n\t21283 - 11905: 0xCFBB,\n\t21284 - 11905: 0x854A,\n\t21285 - 11905: 0x854B,\n\t21286 - 11905: 0xD8D0,\n\t21287 - 11905: 0x854C,\n\t21288 - 11905: 0x854D,\n\t21289 - 11905: 0x854E,\n\t21290 - 11905: 0xB7CB,\n\t21291 - 11905: 0x854F,\n\t21292 - 11905: 0x8550,\n\t21293 - 11905: 0x8551,\n\t21294 - 11905: 0xD8D1,\n\t21295 - 11905: 0x8552,\n\t21296 - 11905: 0x8553,\n\t21297 - 11905: 0x8554,\n\t21298 - 11905: 0x8555,\n\t21299 - 11905: 0x8556,\n\t21300 - 11905: 0x8557,\n\t21301 - 11905: 0x8558,\n\t21302 - 11905: 0x8559,\n\t21303 - 11905: 0x855A,\n\t21304 - 11905: 0x855B,\n\t21305 - 11905: 0xC6A5,\n\t21306 - 11905: 0xC7F8,\n\t21307 - 11905: 0xD2BD,\n\t21308 - 11905: 0x855C,\n\t21309 - 11905: 0x855D,\n\t21310 - 11905: 0xD8D2,\n\t21311 - 11905: 0xC4E4,\n\t21312 - 11905: 0x855E,\n\t21313 - 11905: 0xCAAE,\n\t21314 - 11905: 0x855F,\n\t21315 - 11905: 0xC7A7,\n\t21316 - 11905: 0x8560,\n\t21317 - 11905: 0xD8A6,\n\t21318 - 11905: 0x8561,\n\t21319 - 11905: 0xC9FD,\n\t21320 - 11905: 0xCEE7,\n\t21321 - 11905: 0xBBDC,\n\t21322 - 11905: 0xB0EB,\n\t21323 - 11905: 0x8562,\n\t21324 - 11905: 0x8563,\n\t21325 - 11905: 0x8564,\n\t21326 - 11905: 0xBBAA,\n\t21327 - 11905: 0xD0AD,\n\t21328 - 11905: 0x8565,\n\t21329 - 11905: 0xB1B0,\n\t21330 - 11905: 0xD7E4,\n\t21331 - 11905: 0xD7BF,\n\t21332 - 11905: 0x8566,\n\t21333 - 11905: 0xB5A5,\n\t21334 - 11905: 0xC2F4,\n\t21335 - 11905: 0xC4CF,\n\t21336 - 11905: 0x8567,\n\t21337 - 11905: 0x8568,\n\t21338 - 11905: 0xB2A9,\n\t21339 - 11905: 0x8569,\n\t21340 - 11905: 0xB2B7,\n\t21341 - 11905: 0x856A,\n\t21342 - 11905: 0xB1E5,\n\t21343 - 11905: 0xDFB2,\n\t21344 - 11905: 0xD5BC,\n\t21345 - 11905: 0xBFA8,\n\t21346 - 11905: 0xC2AC,\n\t21347 - 11905: 0xD8D5,\n\t21348 - 11905: 0xC2B1,\n\t21349 - 11905: 0x856B,\n\t21350 - 11905: 0xD8D4,\n\t21351 - 11905: 0xCED4,\n\t21352 - 11905: 0x856C,\n\t21353 - 11905: 0xDAE0,\n\t21354 - 11905: 0x856D,\n\t21355 - 11905: 0xCEC0,\n\t21356 - 11905: 0x856E,\n\t21357 - 11905: 0x856F,\n\t21358 - 11905: 0xD8B4,\n\t21359 - 11905: 0xC3AE,\n\t21360 - 11905: 0xD3A1,\n\t21361 - 11905: 0xCEA3,\n\t21362 - 11905: 0x8570,\n\t21363 - 11905: 0xBCB4,\n\t21364 - 11905: 0xC8B4,\n\t21365 - 11905: 0xC2D1,\n\t21366 - 11905: 0x8571,\n\t21367 - 11905: 0xBEED,\n\t21368 - 11905: 0xD0B6,\n\t21369 - 11905: 0x8572,\n\t21370 - 11905: 0xDAE1,\n\t21371 - 11905: 0x8573,\n\t21372 - 11905: 0x8574,\n\t21373 - 11905: 0x8575,\n\t21374 - 11905: 0x8576,\n\t21375 - 11905: 0xC7E4,\n\t21376 - 11905: 0x8577,\n\t21377 - 11905: 0x8578,\n\t21378 - 11905: 0xB3A7,\n\t21379 - 11905: 0x8579,\n\t21380 - 11905: 0xB6F2,\n\t21381 - 11905: 0xCCFC,\n\t21382 - 11905: 0xC0FA,\n\t21383 - 11905: 0x857A,\n\t21384 - 11905: 0x857B,\n\t21385 - 11905: 0xC0F7,\n\t21386 - 11905: 0x857C,\n\t21387 - 11905: 0xD1B9,\n\t21388 - 11905: 0xD1E1,\n\t21389 - 11905: 0xD8C7,\n\t21390 - 11905: 0x857D,\n\t21391 - 11905: 0x857E,\n\t21392 - 11905: 0x8580,\n\t21393 - 11905: 0x8581,\n\t21394 - 11905: 0x8582,\n\t21395 - 11905: 0x8583,\n\t21396 - 11905: 0x8584,\n\t21397 - 11905: 0xB2DE,\n\t21398 - 11905: 0x8585,\n\t21399 - 11905: 0x8586,\n\t21400 - 11905: 0xC0E5,\n\t21401 - 11905: 0x8587,\n\t21402 - 11905: 0xBAF1,\n\t21403 - 11905: 0x8588,\n\t21404 - 11905: 0x8589,\n\t21405 - 11905: 0xD8C8,\n\t21406 - 11905: 0x858A,\n\t21407 - 11905: 0xD4AD,\n\t21408 - 11905: 0x858B,\n\t21409 - 11905: 0x858C,\n\t21410 - 11905: 0xCFE1,\n\t21411 - 11905: 0xD8C9,\n\t21412 - 11905: 0x858D,\n\t21413 - 11905: 0xD8CA,\n\t21414 - 11905: 0xCFC3,\n\t21415 - 11905: 0x858E,\n\t21416 - 11905: 0xB3F8,\n\t21417 - 11905: 0xBEC7,\n\t21418 - 11905: 0x858F,\n\t21419 - 11905: 0x8590,\n\t21420 - 11905: 0x8591,\n\t21421 - 11905: 0x8592,\n\t21422 - 11905: 0xD8CB,\n\t21423 - 11905: 0x8593,\n\t21424 - 11905: 0x8594,\n\t21425 - 11905: 0x8595,\n\t21426 - 11905: 0x8596,\n\t21427 - 11905: 0x8597,\n\t21428 - 11905: 0x8598,\n\t21429 - 11905: 0x8599,\n\t21430 - 11905: 0xDBCC,\n\t21431 - 11905: 0x859A,\n\t21432 - 11905: 0x859B,\n\t21433 - 11905: 0x859C,\n\t21434 - 11905: 0x859D,\n\t21435 - 11905: 0xC8A5,\n\t21436 - 11905: 0x859E,\n\t21437 - 11905: 0x859F,\n\t21438 - 11905: 0x85A0,\n\t21439 - 11905: 0xCFD8,\n\t21440 - 11905: 0x85A1,\n\t21441 - 11905: 0xC8FE,\n\t21442 - 11905: 0xB2CE,\n\t21443 - 11905: 0x85A2,\n\t21444 - 11905: 0x85A3,\n\t21445 - 11905: 0x85A4,\n\t21446 - 11905: 0x85A5,\n\t21447 - 11905: 0x85A6,\n\t21448 - 11905: 0xD3D6,\n\t21449 - 11905: 0xB2E6,\n\t21450 - 11905: 0xBCB0,\n\t21451 - 11905: 0xD3D1,\n\t21452 - 11905: 0xCBAB,\n\t21453 - 11905: 0xB7B4,\n\t21454 - 11905: 0x85A7,\n\t21455 - 11905: 0x85A8,\n\t21456 - 11905: 0x85A9,\n\t21457 - 11905: 0xB7A2,\n\t21458 - 11905: 0x85AA,\n\t21459 - 11905: 0x85AB,\n\t21460 - 11905: 0xCAE5,\n\t21461 - 11905: 0x85AC,\n\t21462 - 11905: 0xC8A1,\n\t21463 - 11905: 0xCADC,\n\t21464 - 11905: 0xB1E4,\n\t21465 - 11905: 0xD0F0,\n\t21466 - 11905: 0x85AD,\n\t21467 - 11905: 0xC5D1,\n\t21468 - 11905: 0x85AE,\n\t21469 - 11905: 0x85AF,\n\t21470 - 11905: 0x85B0,\n\t21471 - 11905: 0xDBC5,\n\t21472 - 11905: 0xB5FE,\n\t21473 - 11905: 0x85B1,\n\t21474 - 11905: 0x85B2,\n\t21475 - 11905: 0xBFDA,\n\t21476 - 11905: 0xB9C5,\n\t21477 - 11905: 0xBEE4,\n\t21478 - 11905: 0xC1ED,\n\t21479 - 11905: 0x85B3,\n\t21480 - 11905: 0xDFB6,\n\t21481 - 11905: 0xDFB5,\n\t21482 - 11905: 0xD6BB,\n\t21483 - 11905: 0xBDD0,\n\t21484 - 11905: 0xD5D9,\n\t21485 - 11905: 0xB0C8,\n\t21486 - 11905: 0xB6A3,\n\t21487 - 11905: 0xBFC9,\n\t21488 - 11905: 0xCCA8,\n\t21489 - 11905: 0xDFB3,\n\t21490 - 11905: 0xCAB7,\n\t21491 - 11905: 0xD3D2,\n\t21492 - 11905: 0x85B4,\n\t21493 - 11905: 0xD8CF,\n\t21494 - 11905: 0xD2B6,\n\t21495 - 11905: 0xBAC5,\n\t21496 - 11905: 0xCBBE,\n\t21497 - 11905: 0xCCBE,\n\t21498 - 11905: 0x85B5,\n\t21499 - 11905: 0xDFB7,\n\t21500 - 11905: 0xB5F0,\n\t21501 - 11905: 0xDFB4,\n\t21502 - 11905: 0x85B6,\n\t21503 - 11905: 0x85B7,\n\t21504 - 11905: 0x85B8,\n\t21505 - 11905: 0xD3F5,\n\t21506 - 11905: 0x85B9,\n\t21507 - 11905: 0xB3D4,\n\t21508 - 11905: 0xB8F7,\n\t21509 - 11905: 0x85BA,\n\t21510 - 11905: 0xDFBA,\n\t21511 - 11905: 0x85BB,\n\t21512 - 11905: 0xBACF,\n\t21513 - 11905: 0xBCAA,\n\t21514 - 11905: 0xB5F5,\n\t21515 - 11905: 0x85BC,\n\t21516 - 11905: 0xCDAC,\n\t21517 - 11905: 0xC3FB,\n\t21518 - 11905: 0xBAF3,\n\t21519 - 11905: 0xC0F4,\n\t21520 - 11905: 0xCDC2,\n\t21521 - 11905: 0xCFF2,\n\t21522 - 11905: 0xDFB8,\n\t21523 - 11905: 0xCFC5,\n\t21524 - 11905: 0x85BD,\n\t21525 - 11905: 0xC2C0,\n\t21526 - 11905: 0xDFB9,\n\t21527 - 11905: 0xC2F0,\n\t21528 - 11905: 0x85BE,\n\t21529 - 11905: 0x85BF,\n\t21530 - 11905: 0x85C0,\n\t21531 - 11905: 0xBEFD,\n\t21532 - 11905: 0x85C1,\n\t21533 - 11905: 0xC1DF,\n\t21534 - 11905: 0xCDCC,\n\t21535 - 11905: 0xD2F7,\n\t21536 - 11905: 0xB7CD,\n\t21537 - 11905: 0xDFC1,\n\t21538 - 11905: 0x85C2,\n\t21539 - 11905: 0xDFC4,\n\t21540 - 11905: 0x85C3,\n\t21541 - 11905: 0x85C4,\n\t21542 - 11905: 0xB7F1,\n\t21543 - 11905: 0xB0C9,\n\t21544 - 11905: 0xB6D6,\n\t21545 - 11905: 0xB7D4,\n\t21546 - 11905: 0x85C5,\n\t21547 - 11905: 0xBAAC,\n\t21548 - 11905: 0xCCFD,\n\t21549 - 11905: 0xBFD4,\n\t21550 - 11905: 0xCBB1,\n\t21551 - 11905: 0xC6F4,\n\t21552 - 11905: 0x85C6,\n\t21553 - 11905: 0xD6A8,\n\t21554 - 11905: 0xDFC5,\n\t21555 - 11905: 0x85C7,\n\t21556 - 11905: 0xCEE2,\n\t21557 - 11905: 0xB3B3,\n\t21558 - 11905: 0x85C8,\n\t21559 - 11905: 0x85C9,\n\t21560 - 11905: 0xCEFC,\n\t21561 - 11905: 0xB4B5,\n\t21562 - 11905: 0x85CA,\n\t21563 - 11905: 0xCEC7,\n\t21564 - 11905: 0xBAF0,\n\t21565 - 11905: 0x85CB,\n\t21566 - 11905: 0xCEE1,\n\t21567 - 11905: 0x85CC,\n\t21568 - 11905: 0xD1BD,\n\t21569 - 11905: 0x85CD,\n\t21570 - 11905: 0x85CE,\n\t21571 - 11905: 0xDFC0,\n\t21572 - 11905: 0x85CF,\n\t21573 - 11905: 0x85D0,\n\t21574 - 11905: 0xB4F4,\n\t21575 - 11905: 0x85D1,\n\t21576 - 11905: 0xB3CA,\n\t21577 - 11905: 0x85D2,\n\t21578 - 11905: 0xB8E6,\n\t21579 - 11905: 0xDFBB,\n\t21580 - 11905: 0x85D3,\n\t21581 - 11905: 0x85D4,\n\t21582 - 11905: 0x85D5,\n\t21583 - 11905: 0x85D6,\n\t21584 - 11905: 0xC4C5,\n\t21585 - 11905: 0x85D7,\n\t21586 - 11905: 0xDFBC,\n\t21587 - 11905: 0xDFBD,\n\t21588 - 11905: 0xDFBE,\n\t21589 - 11905: 0xC5BB,\n\t21590 - 11905: 0xDFBF,\n\t21591 - 11905: 0xDFC2,\n\t21592 - 11905: 0xD4B1,\n\t21593 - 11905: 0xDFC3,\n\t21594 - 11905: 0x85D8,\n\t21595 - 11905: 0xC7BA,\n\t21596 - 11905: 0xCED8,\n\t21597 - 11905: 0x85D9,\n\t21598 - 11905: 0x85DA,\n\t21599 - 11905: 0x85DB,\n\t21600 - 11905: 0x85DC,\n\t21601 - 11905: 0x85DD,\n\t21602 - 11905: 0xC4D8,\n\t21603 - 11905: 0x85DE,\n\t21604 - 11905: 0xDFCA,\n\t21605 - 11905: 0x85DF,\n\t21606 - 11905: 0xDFCF,\n\t21607 - 11905: 0x85E0,\n\t21608 - 11905: 0xD6DC,\n\t21609 - 11905: 0x85E1,\n\t21610 - 11905: 0x85E2,\n\t21611 - 11905: 0x85E3,\n\t21612 - 11905: 0x85E4,\n\t21613 - 11905: 0x85E5,\n\t21614 - 11905: 0x85E6,\n\t21615 - 11905: 0x85E7,\n\t21616 - 11905: 0x85E8,\n\t21617 - 11905: 0xDFC9,\n\t21618 - 11905: 0xDFDA,\n\t21619 - 11905: 0xCEB6,\n\t21620 - 11905: 0x85E9,\n\t21621 - 11905: 0xBAC7,\n\t21622 - 11905: 0xDFCE,\n\t21623 - 11905: 0xDFC8,\n\t21624 - 11905: 0xC5DE,\n\t21625 - 11905: 0x85EA,\n\t21626 - 11905: 0x85EB,\n\t21627 - 11905: 0xC9EB,\n\t21628 - 11905: 0xBAF4,\n\t21629 - 11905: 0xC3FC,\n\t21630 - 11905: 0x85EC,\n\t21631 - 11905: 0x85ED,\n\t21632 - 11905: 0xBED7,\n\t21633 - 11905: 0x85EE,\n\t21634 - 11905: 0xDFC6,\n\t21635 - 11905: 0x85EF,\n\t21636 - 11905: 0xDFCD,\n\t21637 - 11905: 0x85F0,\n\t21638 - 11905: 0xC5D8,\n\t21639 - 11905: 0x85F1,\n\t21640 - 11905: 0x85F2,\n\t21641 - 11905: 0x85F3,\n\t21642 - 11905: 0x85F4,\n\t21643 - 11905: 0xD5A6,\n\t21644 - 11905: 0xBACD,\n\t21645 - 11905: 0x85F5,\n\t21646 - 11905: 0xBECC,\n\t21647 - 11905: 0xD3BD,\n\t21648 - 11905: 0xB8C0,\n\t21649 - 11905: 0x85F6,\n\t21650 - 11905: 0xD6E4,\n\t21651 - 11905: 0x85F7,\n\t21652 - 11905: 0xDFC7,\n\t21653 - 11905: 0xB9BE,\n\t21654 - 11905: 0xBFA7,\n\t21655 - 11905: 0x85F8,\n\t21656 - 11905: 0x85F9,\n\t21657 - 11905: 0xC1FC,\n\t21658 - 11905: 0xDFCB,\n\t21659 - 11905: 0xDFCC,\n\t21660 - 11905: 0x85FA,\n\t21661 - 11905: 0xDFD0,\n\t21662 - 11905: 0x85FB,\n\t21663 - 11905: 0x85FC,\n\t21664 - 11905: 0x85FD,\n\t21665 - 11905: 0x85FE,\n\t21666 - 11905: 0x8640,\n\t21667 - 11905: 0xDFDB,\n\t21668 - 11905: 0xDFE5,\n\t21669 - 11905: 0x8641,\n\t21670 - 11905: 0xDFD7,\n\t21671 - 11905: 0xDFD6,\n\t21672 - 11905: 0xD7C9,\n\t21673 - 11905: 0xDFE3,\n\t21674 - 11905: 0xDFE4,\n\t21675 - 11905: 0xE5EB,\n\t21676 - 11905: 0xD2A7,\n\t21677 - 11905: 0xDFD2,\n\t21678 - 11905: 0x8642,\n\t21679 - 11905: 0xBFA9,\n\t21680 - 11905: 0x8643,\n\t21681 - 11905: 0xD4DB,\n\t21682 - 11905: 0x8644,\n\t21683 - 11905: 0xBFC8,\n\t21684 - 11905: 0xDFD4,\n\t21685 - 11905: 0x8645,\n\t21686 - 11905: 0x8646,\n\t21687 - 11905: 0x8647,\n\t21688 - 11905: 0xCFCC,\n\t21689 - 11905: 0x8648,\n\t21690 - 11905: 0x8649,\n\t21691 - 11905: 0xDFDD,\n\t21692 - 11905: 0x864A,\n\t21693 - 11905: 0xD1CA,\n\t21694 - 11905: 0x864B,\n\t21695 - 11905: 0xDFDE,\n\t21696 - 11905: 0xB0A7,\n\t21697 - 11905: 0xC6B7,\n\t21698 - 11905: 0xDFD3,\n\t21699 - 11905: 0x864C,\n\t21700 - 11905: 0xBAE5,\n\t21701 - 11905: 0x864D,\n\t21702 - 11905: 0xB6DF,\n\t21703 - 11905: 0xCDDB,\n\t21704 - 11905: 0xB9FE,\n\t21705 - 11905: 0xD4D5,\n\t21706 - 11905: 0x864E,\n\t21707 - 11905: 0x864F,\n\t21708 - 11905: 0xDFDF,\n\t21709 - 11905: 0xCFEC,\n\t21710 - 11905: 0xB0A5,\n\t21711 - 11905: 0xDFE7,\n\t21712 - 11905: 0xDFD1,\n\t21713 - 11905: 0xD1C6,\n\t21714 - 11905: 0xDFD5,\n\t21715 - 11905: 0xDFD8,\n\t21716 - 11905: 0xDFD9,\n\t21717 - 11905: 0xDFDC,\n\t21718 - 11905: 0x8650,\n\t21719 - 11905: 0xBBA9,\n\t21720 - 11905: 0x8651,\n\t21721 - 11905: 0xDFE0,\n\t21722 - 11905: 0xDFE1,\n\t21723 - 11905: 0x8652,\n\t21724 - 11905: 0xDFE2,\n\t21725 - 11905: 0xDFE6,\n\t21726 - 11905: 0xDFE8,\n\t21727 - 11905: 0xD3B4,\n\t21728 - 11905: 0x8653,\n\t21729 - 11905: 0x8654,\n\t21730 - 11905: 0x8655,\n\t21731 - 11905: 0x8656,\n\t21732 - 11905: 0x8657,\n\t21733 - 11905: 0xB8E7,\n\t21734 - 11905: 0xC5B6,\n\t21735 - 11905: 0xDFEA,\n\t21736 - 11905: 0xC9DA,\n\t21737 - 11905: 0xC1A8,\n\t21738 - 11905: 0xC4C4,\n\t21739 - 11905: 0x8658,\n\t21740 - 11905: 0x8659,\n\t21741 - 11905: 0xBFDE,\n\t21742 - 11905: 0xCFF8,\n\t21743 - 11905: 0x865A,\n\t21744 - 11905: 0x865B,\n\t21745 - 11905: 0x865C,\n\t21746 - 11905: 0xD5DC,\n\t21747 - 11905: 0xDFEE,\n\t21748 - 11905: 0x865D,\n\t21749 - 11905: 0x865E,\n\t21750 - 11905: 0x865F,\n\t21751 - 11905: 0x8660,\n\t21752 - 11905: 0x8661,\n\t21753 - 11905: 0x8662,\n\t21754 - 11905: 0xB2B8,\n\t21755 - 11905: 0x8663,\n\t21756 - 11905: 0xBADF,\n\t21757 - 11905: 0xDFEC,\n\t21758 - 11905: 0x8664,\n\t21759 - 11905: 0xDBC1,\n\t21760 - 11905: 0x8665,\n\t21761 - 11905: 0xD1E4,\n\t21762 - 11905: 0x8666,\n\t21763 - 11905: 0x8667,\n\t21764 - 11905: 0x8668,\n\t21765 - 11905: 0x8669,\n\t21766 - 11905: 0xCBF4,\n\t21767 - 11905: 0xB4BD,\n\t21768 - 11905: 0x866A,\n\t21769 - 11905: 0xB0A6,\n\t21770 - 11905: 0x866B,\n\t21771 - 11905: 0x866C,\n\t21772 - 11905: 0x866D,\n\t21773 - 11905: 0x866E,\n\t21774 - 11905: 0x866F,\n\t21775 - 11905: 0xDFF1,\n\t21776 - 11905: 0xCCC6,\n\t21777 - 11905: 0xDFF2,\n\t21778 - 11905: 0x8670,\n\t21779 - 11905: 0x8671,\n\t21780 - 11905: 0xDFED,\n\t21781 - 11905: 0x8672,\n\t21782 - 11905: 0x8673,\n\t21783 - 11905: 0x8674,\n\t21784 - 11905: 0x8675,\n\t21785 - 11905: 0x8676,\n\t21786 - 11905: 0x8677,\n\t21787 - 11905: 0xDFE9,\n\t21788 - 11905: 0x8678,\n\t21789 - 11905: 0x8679,\n\t21790 - 11905: 0x867A,\n\t21791 - 11905: 0x867B,\n\t21792 - 11905: 0xDFEB,\n\t21793 - 11905: 0x867C,\n\t21794 - 11905: 0xDFEF,\n\t21795 - 11905: 0xDFF0,\n\t21796 - 11905: 0xBBBD,\n\t21797 - 11905: 0x867D,\n\t21798 - 11905: 0x867E,\n\t21799 - 11905: 0xDFF3,\n\t21800 - 11905: 0x8680,\n\t21801 - 11905: 0x8681,\n\t21802 - 11905: 0xDFF4,\n\t21803 - 11905: 0x8682,\n\t21804 - 11905: 0xBBA3,\n\t21805 - 11905: 0x8683,\n\t21806 - 11905: 0xCADB,\n\t21807 - 11905: 0xCEA8,\n\t21808 - 11905: 0xE0A7,\n\t21809 - 11905: 0xB3AA,\n\t21810 - 11905: 0x8684,\n\t21811 - 11905: 0xE0A6,\n\t21812 - 11905: 0x8685,\n\t21813 - 11905: 0x8686,\n\t21814 - 11905: 0x8687,\n\t21815 - 11905: 0xE0A1,\n\t21816 - 11905: 0x8688,\n\t21817 - 11905: 0x8689,\n\t21818 - 11905: 0x868A,\n\t21819 - 11905: 0x868B,\n\t21820 - 11905: 0xDFFE,\n\t21821 - 11905: 0x868C,\n\t21822 - 11905: 0xCDD9,\n\t21823 - 11905: 0xDFFC,\n\t21824 - 11905: 0x868D,\n\t21825 - 11905: 0xDFFA,\n\t21826 - 11905: 0x868E,\n\t21827 - 11905: 0xBFD0,\n\t21828 - 11905: 0xD7C4,\n\t21829 - 11905: 0x868F,\n\t21830 - 11905: 0xC9CC,\n\t21831 - 11905: 0x8690,\n\t21832 - 11905: 0x8691,\n\t21833 - 11905: 0xDFF8,\n\t21834 - 11905: 0xB0A1,\n\t21835 - 11905: 0x8692,\n\t21836 - 11905: 0x8693,\n\t21837 - 11905: 0x8694,\n\t21838 - 11905: 0x8695,\n\t21839 - 11905: 0x8696,\n\t21840 - 11905: 0xDFFD,\n\t21841 - 11905: 0x8697,\n\t21842 - 11905: 0x8698,\n\t21843 - 11905: 0x8699,\n\t21844 - 11905: 0x869A,\n\t21845 - 11905: 0xDFFB,\n\t21846 - 11905: 0xE0A2,\n\t21847 - 11905: 0x869B,\n\t21848 - 11905: 0x869C,\n\t21849 - 11905: 0x869D,\n\t21850 - 11905: 0x869E,\n\t21851 - 11905: 0x869F,\n\t21852 - 11905: 0xE0A8,\n\t21853 - 11905: 0x86A0,\n\t21854 - 11905: 0x86A1,\n\t21855 - 11905: 0x86A2,\n\t21856 - 11905: 0x86A3,\n\t21857 - 11905: 0xB7C8,\n\t21858 - 11905: 0x86A4,\n\t21859 - 11905: 0x86A5,\n\t21860 - 11905: 0xC6A1,\n\t21861 - 11905: 0xC9B6,\n\t21862 - 11905: 0xC0B2,\n\t21863 - 11905: 0xDFF5,\n\t21864 - 11905: 0x86A6,\n\t21865 - 11905: 0x86A7,\n\t21866 - 11905: 0xC5BE,\n\t21867 - 11905: 0x86A8,\n\t21868 - 11905: 0xD8C4,\n\t21869 - 11905: 0xDFF9,\n\t21870 - 11905: 0xC4F6,\n\t21871 - 11905: 0x86A9,\n\t21872 - 11905: 0x86AA,\n\t21873 - 11905: 0x86AB,\n\t21874 - 11905: 0x86AC,\n\t21875 - 11905: 0x86AD,\n\t21876 - 11905: 0x86AE,\n\t21877 - 11905: 0xE0A3,\n\t21878 - 11905: 0xE0A4,\n\t21879 - 11905: 0xE0A5,\n\t21880 - 11905: 0xD0A5,\n\t21881 - 11905: 0x86AF,\n\t21882 - 11905: 0x86B0,\n\t21883 - 11905: 0xE0B4,\n\t21884 - 11905: 0xCCE4,\n\t21885 - 11905: 0x86B1,\n\t21886 - 11905: 0xE0B1,\n\t21887 - 11905: 0x86B2,\n\t21888 - 11905: 0xBFA6,\n\t21889 - 11905: 0xE0AF,\n\t21890 - 11905: 0xCEB9,\n\t21891 - 11905: 0xE0AB,\n\t21892 - 11905: 0xC9C6,\n\t21893 - 11905: 0x86B3,\n\t21894 - 11905: 0x86B4,\n\t21895 - 11905: 0xC0AE,\n\t21896 - 11905: 0xE0AE,\n\t21897 - 11905: 0xBAED,\n\t21898 - 11905: 0xBAB0,\n\t21899 - 11905: 0xE0A9,\n\t21900 - 11905: 0x86B5,\n\t21901 - 11905: 0x86B6,\n\t21902 - 11905: 0x86B7,\n\t21903 - 11905: 0xDFF6,\n\t21904 - 11905: 0x86B8,\n\t21905 - 11905: 0xE0B3,\n\t21906 - 11905: 0x86B9,\n\t21907 - 11905: 0x86BA,\n\t21908 - 11905: 0xE0B8,\n\t21909 - 11905: 0x86BB,\n\t21910 - 11905: 0x86BC,\n\t21911 - 11905: 0x86BD,\n\t21912 - 11905: 0xB4AD,\n\t21913 - 11905: 0xE0B9,\n\t21914 - 11905: 0x86BE,\n\t21915 - 11905: 0x86BF,\n\t21916 - 11905: 0xCFB2,\n\t21917 - 11905: 0xBAC8,\n\t21918 - 11905: 0x86C0,\n\t21919 - 11905: 0xE0B0,\n\t21920 - 11905: 0x86C1,\n\t21921 - 11905: 0x86C2,\n\t21922 - 11905: 0x86C3,\n\t21923 - 11905: 0x86C4,\n\t21924 - 11905: 0x86C5,\n\t21925 - 11905: 0x86C6,\n\t21926 - 11905: 0x86C7,\n\t21927 - 11905: 0xD0FA,\n\t21928 - 11905: 0x86C8,\n\t21929 - 11905: 0x86C9,\n\t21930 - 11905: 0x86CA,\n\t21931 - 11905: 0x86CB,\n\t21932 - 11905: 0x86CC,\n\t21933 - 11905: 0x86CD,\n\t21934 - 11905: 0x86CE,\n\t21935 - 11905: 0x86CF,\n\t21936 - 11905: 0x86D0,\n\t21937 - 11905: 0xE0AC,\n\t21938 - 11905: 0x86D1,\n\t21939 - 11905: 0xD4FB,\n\t21940 - 11905: 0x86D2,\n\t21941 - 11905: 0xDFF7,\n\t21942 - 11905: 0x86D3,\n\t21943 - 11905: 0xC5E7,\n\t21944 - 11905: 0x86D4,\n\t21945 - 11905: 0xE0AD,\n\t21946 - 11905: 0x86D5,\n\t21947 - 11905: 0xD3F7,\n\t21948 - 11905: 0x86D6,\n\t21949 - 11905: 0xE0B6,\n\t21950 - 11905: 0xE0B7,\n\t21951 - 11905: 0x86D7,\n\t21952 - 11905: 0x86D8,\n\t21953 - 11905: 0x86D9,\n\t21954 - 11905: 0x86DA,\n\t21955 - 11905: 0x86DB,\n\t21956 - 11905: 0xE0C4,\n\t21957 - 11905: 0xD0E1,\n\t21958 - 11905: 0x86DC,\n\t21959 - 11905: 0x86DD,\n\t21960 - 11905: 0x86DE,\n\t21961 - 11905: 0xE0BC,\n\t21962 - 11905: 0x86DF,\n\t21963 - 11905: 0x86E0,\n\t21964 - 11905: 0xE0C9,\n\t21965 - 11905: 0xE0CA,\n\t21966 - 11905: 0x86E1,\n\t21967 - 11905: 0x86E2,\n\t21968 - 11905: 0x86E3,\n\t21969 - 11905: 0xE0BE,\n\t21970 - 11905: 0xE0AA,\n\t21971 - 11905: 0xC9A4,\n\t21972 - 11905: 0xE0C1,\n\t21973 - 11905: 0x86E4,\n\t21974 - 11905: 0xE0B2,\n\t21975 - 11905: 0x86E5,\n\t21976 - 11905: 0x86E6,\n\t21977 - 11905: 0x86E7,\n\t21978 - 11905: 0x86E8,\n\t21979 - 11905: 0x86E9,\n\t21980 - 11905: 0xCAC8,\n\t21981 - 11905: 0xE0C3,\n\t21982 - 11905: 0x86EA,\n\t21983 - 11905: 0xE0B5,\n\t21984 - 11905: 0x86EB,\n\t21985 - 11905: 0xCECB,\n\t21986 - 11905: 0x86EC,\n\t21987 - 11905: 0xCBC3,\n\t21988 - 11905: 0xE0CD,\n\t21989 - 11905: 0xE0C6,\n\t21990 - 11905: 0xE0C2,\n\t21991 - 11905: 0x86ED,\n\t21992 - 11905: 0xE0CB,\n\t21993 - 11905: 0x86EE,\n\t21994 - 11905: 0xE0BA,\n\t21995 - 11905: 0xE0BF,\n\t21996 - 11905: 0xE0C0,\n\t21997 - 11905: 0x86EF,\n\t21998 - 11905: 0x86F0,\n\t21999 - 11905: 0xE0C5,\n\t22000 - 11905: 0x86F1,\n\t22001 - 11905: 0x86F2,\n\t22002 - 11905: 0xE0C7,\n\t22003 - 11905: 0xE0C8,\n\t22004 - 11905: 0x86F3,\n\t22005 - 11905: 0xE0CC,\n\t22006 - 11905: 0x86F4,\n\t22007 - 11905: 0xE0BB,\n\t22008 - 11905: 0x86F5,\n\t22009 - 11905: 0x86F6,\n\t22010 - 11905: 0x86F7,\n\t22011 - 11905: 0x86F8,\n\t22012 - 11905: 0x86F9,\n\t22013 - 11905: 0xCBD4,\n\t22014 - 11905: 0xE0D5,\n\t22015 - 11905: 0x86FA,\n\t22016 - 11905: 0xE0D6,\n\t22017 - 11905: 0xE0D2,\n\t22018 - 11905: 0x86FB,\n\t22019 - 11905: 0x86FC,\n\t22020 - 11905: 0x86FD,\n\t22021 - 11905: 0x86FE,\n\t22022 - 11905: 0x8740,\n\t22023 - 11905: 0x8741,\n\t22024 - 11905: 0xE0D0,\n\t22025 - 11905: 0xBCCE,\n\t22026 - 11905: 0x8742,\n\t22027 - 11905: 0x8743,\n\t22028 - 11905: 0xE0D1,\n\t22029 - 11905: 0x8744,\n\t22030 - 11905: 0xB8C2,\n\t22031 - 11905: 0xD8C5,\n\t22032 - 11905: 0x8745,\n\t22033 - 11905: 0x8746,\n\t22034 - 11905: 0x8747,\n\t22035 - 11905: 0x8748,\n\t22036 - 11905: 0x8749,\n\t22037 - 11905: 0x874A,\n\t22038 - 11905: 0x874B,\n\t22039 - 11905: 0x874C,\n\t22040 - 11905: 0xD0EA,\n\t22041 - 11905: 0x874D,\n\t22042 - 11905: 0x874E,\n\t22043 - 11905: 0xC2EF,\n\t22044 - 11905: 0x874F,\n\t22045 - 11905: 0x8750,\n\t22046 - 11905: 0xE0CF,\n\t22047 - 11905: 0xE0BD,\n\t22048 - 11905: 0x8751,\n\t22049 - 11905: 0x8752,\n\t22050 - 11905: 0x8753,\n\t22051 - 11905: 0xE0D4,\n\t22052 - 11905: 0xE0D3,\n\t22053 - 11905: 0x8754,\n\t22054 - 11905: 0x8755,\n\t22055 - 11905: 0xE0D7,\n\t22056 - 11905: 0x8756,\n\t22057 - 11905: 0x8757,\n\t22058 - 11905: 0x8758,\n\t22059 - 11905: 0x8759,\n\t22060 - 11905: 0xE0DC,\n\t22061 - 11905: 0xE0D8,\n\t22062 - 11905: 0x875A,\n\t22063 - 11905: 0x875B,\n\t22064 - 11905: 0x875C,\n\t22065 - 11905: 0xD6F6,\n\t22066 - 11905: 0xB3B0,\n\t22067 - 11905: 0x875D,\n\t22068 - 11905: 0xD7EC,\n\t22069 - 11905: 0x875E,\n\t22070 - 11905: 0xCBBB,\n\t22071 - 11905: 0x875F,\n\t22072 - 11905: 0x8760,\n\t22073 - 11905: 0xE0DA,\n\t22074 - 11905: 0x8761,\n\t22075 - 11905: 0xCEFB,\n\t22076 - 11905: 0x8762,\n\t22077 - 11905: 0x8763,\n\t22078 - 11905: 0x8764,\n\t22079 - 11905: 0xBAD9,\n\t22080 - 11905: 0x8765,\n\t22081 - 11905: 0x8766,\n\t22082 - 11905: 0x8767,\n\t22083 - 11905: 0x8768,\n\t22084 - 11905: 0x8769,\n\t22085 - 11905: 0x876A,\n\t22086 - 11905: 0x876B,\n\t22087 - 11905: 0x876C,\n\t22088 - 11905: 0x876D,\n\t22089 - 11905: 0x876E,\n\t22090 - 11905: 0x876F,\n\t22091 - 11905: 0x8770,\n\t22092 - 11905: 0xE0E1,\n\t22093 - 11905: 0xE0DD,\n\t22094 - 11905: 0xD2AD,\n\t22095 - 11905: 0x8771,\n\t22096 - 11905: 0x8772,\n\t22097 - 11905: 0x8773,\n\t22098 - 11905: 0x8774,\n\t22099 - 11905: 0x8775,\n\t22100 - 11905: 0xE0E2,\n\t22101 - 11905: 0x8776,\n\t22102 - 11905: 0x8777,\n\t22103 - 11905: 0xE0DB,\n\t22104 - 11905: 0xE0D9,\n\t22105 - 11905: 0xE0DF,\n\t22106 - 11905: 0x8778,\n\t22107 - 11905: 0x8779,\n\t22108 - 11905: 0xE0E0,\n\t22109 - 11905: 0x877A,\n\t22110 - 11905: 0x877B,\n\t22111 - 11905: 0x877C,\n\t22112 - 11905: 0x877D,\n\t22113 - 11905: 0x877E,\n\t22114 - 11905: 0xE0DE,\n\t22115 - 11905: 0x8780,\n\t22116 - 11905: 0xE0E4,\n\t22117 - 11905: 0x8781,\n\t22118 - 11905: 0x8782,\n\t22119 - 11905: 0x8783,\n\t22120 - 11905: 0xC6F7,\n\t22121 - 11905: 0xD8AC,\n\t22122 - 11905: 0xD4EB,\n\t22123 - 11905: 0xE0E6,\n\t22124 - 11905: 0xCAC9,\n\t22125 - 11905: 0x8784,\n\t22126 - 11905: 0x8785,\n\t22127 - 11905: 0x8786,\n\t22128 - 11905: 0x8787,\n\t22129 - 11905: 0xE0E5,\n\t22130 - 11905: 0x8788,\n\t22131 - 11905: 0x8789,\n\t22132 - 11905: 0x878A,\n\t22133 - 11905: 0x878B,\n\t22134 - 11905: 0xB8C1,\n\t22135 - 11905: 0x878C,\n\t22136 - 11905: 0x878D,\n\t22137 - 11905: 0x878E,\n\t22138 - 11905: 0x878F,\n\t22139 - 11905: 0xE0E7,\n\t22140 - 11905: 0xE0E8,\n\t22141 - 11905: 0x8790,\n\t22142 - 11905: 0x8791,\n\t22143 - 11905: 0x8792,\n\t22144 - 11905: 0x8793,\n\t22145 - 11905: 0x8794,\n\t22146 - 11905: 0x8795,\n\t22147 - 11905: 0x8796,\n\t22148 - 11905: 0x8797,\n\t22149 - 11905: 0xE0E9,\n\t22150 - 11905: 0xE0E3,\n\t22151 - 11905: 0x8798,\n\t22152 - 11905: 0x8799,\n\t22153 - 11905: 0x879A,\n\t22154 - 11905: 0x879B,\n\t22155 - 11905: 0x879C,\n\t22156 - 11905: 0x879D,\n\t22157 - 11905: 0x879E,\n\t22158 - 11905: 0xBABF,\n\t22159 - 11905: 0xCCE7,\n\t22160 - 11905: 0x879F,\n\t22161 - 11905: 0x87A0,\n\t22162 - 11905: 0x87A1,\n\t22163 - 11905: 0xE0EA,\n\t22164 - 11905: 0x87A2,\n\t22165 - 11905: 0x87A3,\n\t22166 - 11905: 0x87A4,\n\t22167 - 11905: 0x87A5,\n\t22168 - 11905: 0x87A6,\n\t22169 - 11905: 0x87A7,\n\t22170 - 11905: 0x87A8,\n\t22171 - 11905: 0x87A9,\n\t22172 - 11905: 0x87AA,\n\t22173 - 11905: 0x87AB,\n\t22174 - 11905: 0x87AC,\n\t22175 - 11905: 0x87AD,\n\t22176 - 11905: 0x87AE,\n\t22177 - 11905: 0x87AF,\n\t22178 - 11905: 0x87B0,\n\t22179 - 11905: 0xCFF9,\n\t22180 - 11905: 0x87B1,\n\t22181 - 11905: 0x87B2,\n\t22182 - 11905: 0x87B3,\n\t22183 - 11905: 0x87B4,\n\t22184 - 11905: 0x87B5,\n\t22185 - 11905: 0x87B6,\n\t22186 - 11905: 0x87B7,\n\t22187 - 11905: 0x87B8,\n\t22188 - 11905: 0x87B9,\n\t22189 - 11905: 0x87BA,\n\t22190 - 11905: 0x87BB,\n\t22191 - 11905: 0xE0EB,\n\t22192 - 11905: 0x87BC,\n\t22193 - 11905: 0x87BD,\n\t22194 - 11905: 0x87BE,\n\t22195 - 11905: 0x87BF,\n\t22196 - 11905: 0x87C0,\n\t22197 - 11905: 0x87C1,\n\t22198 - 11905: 0x87C2,\n\t22199 - 11905: 0xC8C2,\n\t22200 - 11905: 0x87C3,\n\t22201 - 11905: 0x87C4,\n\t22202 - 11905: 0x87C5,\n\t22203 - 11905: 0x87C6,\n\t22204 - 11905: 0xBDC0,\n\t22205 - 11905: 0x87C7,\n\t22206 - 11905: 0x87C8,\n\t22207 - 11905: 0x87C9,\n\t22208 - 11905: 0x87CA,\n\t22209 - 11905: 0x87CB,\n\t22210 - 11905: 0x87CC,\n\t22211 - 11905: 0x87CD,\n\t22212 - 11905: 0x87CE,\n\t22213 - 11905: 0x87CF,\n\t22214 - 11905: 0x87D0,\n\t22215 - 11905: 0x87D1,\n\t22216 - 11905: 0x87D2,\n\t22217 - 11905: 0x87D3,\n\t22218 - 11905: 0xC4D2,\n\t22219 - 11905: 0x87D4,\n\t22220 - 11905: 0x87D5,\n\t22221 - 11905: 0x87D6,\n\t22222 - 11905: 0x87D7,\n\t22223 - 11905: 0x87D8,\n\t22224 - 11905: 0x87D9,\n\t22225 - 11905: 0x87DA,\n\t22226 - 11905: 0x87DB,\n\t22227 - 11905: 0x87DC,\n\t22228 - 11905: 0xE0EC,\n\t22229 - 11905: 0x87DD,\n\t22230 - 11905: 0x87DE,\n\t22231 - 11905: 0xE0ED,\n\t22232 - 11905: 0x87DF,\n\t22233 - 11905: 0x87E0,\n\t22234 - 11905: 0xC7F4,\n\t22235 - 11905: 0xCBC4,\n\t22236 - 11905: 0x87E1,\n\t22237 - 11905: 0xE0EE,\n\t22238 - 11905: 0xBBD8,\n\t22239 - 11905: 0xD8B6,\n\t22240 - 11905: 0xD2F2,\n\t22241 - 11905: 0xE0EF,\n\t22242 - 11905: 0xCDC5,\n\t22243 - 11905: 0x87E2,\n\t22244 - 11905: 0xB6DA,\n\t22245 - 11905: 0x87E3,\n\t22246 - 11905: 0x87E4,\n\t22247 - 11905: 0x87E5,\n\t22248 - 11905: 0x87E6,\n\t22249 - 11905: 0x87E7,\n\t22250 - 11905: 0x87E8,\n\t22251 - 11905: 0xE0F1,\n\t22252 - 11905: 0x87E9,\n\t22253 - 11905: 0xD4B0,\n\t22254 - 11905: 0x87EA,\n\t22255 - 11905: 0x87EB,\n\t22256 - 11905: 0xC0A7,\n\t22257 - 11905: 0xB4D1,\n\t22258 - 11905: 0x87EC,\n\t22259 - 11905: 0x87ED,\n\t22260 - 11905: 0xCEA7,\n\t22261 - 11905: 0xE0F0,\n\t22262 - 11905: 0x87EE,\n\t22263 - 11905: 0x87EF,\n\t22264 - 11905: 0x87F0,\n\t22265 - 11905: 0xE0F2,\n\t22266 - 11905: 0xB9CC,\n\t22267 - 11905: 0x87F1,\n\t22268 - 11905: 0x87F2,\n\t22269 - 11905: 0xB9FA,\n\t22270 - 11905: 0xCDBC,\n\t22271 - 11905: 0xE0F3,\n\t22272 - 11905: 0x87F3,\n\t22273 - 11905: 0x87F4,\n\t22274 - 11905: 0x87F5,\n\t22275 - 11905: 0xC6D4,\n\t22276 - 11905: 0xE0F4,\n\t22277 - 11905: 0x87F6,\n\t22278 - 11905: 0xD4B2,\n\t22279 - 11905: 0x87F7,\n\t22280 - 11905: 0xC8A6,\n\t22281 - 11905: 0xE0F6,\n\t22282 - 11905: 0xE0F5,\n\t22283 - 11905: 0x87F8,\n\t22284 - 11905: 0x87F9,\n\t22285 - 11905: 0x87FA,\n\t22286 - 11905: 0x87FB,\n\t22287 - 11905: 0x87FC,\n\t22288 - 11905: 0x87FD,\n\t22289 - 11905: 0x87FE,\n\t22290 - 11905: 0x8840,\n\t22291 - 11905: 0x8841,\n\t22292 - 11905: 0x8842,\n\t22293 - 11905: 0x8843,\n\t22294 - 11905: 0x8844,\n\t22295 - 11905: 0x8845,\n\t22296 - 11905: 0x8846,\n\t22297 - 11905: 0x8847,\n\t22298 - 11905: 0x8848,\n\t22299 - 11905: 0x8849,\n\t22300 - 11905: 0xE0F7,\n\t22301 - 11905: 0x884A,\n\t22302 - 11905: 0x884B,\n\t22303 - 11905: 0xCDC1,\n\t22304 - 11905: 0x884C,\n\t22305 - 11905: 0x884D,\n\t22306 - 11905: 0x884E,\n\t22307 - 11905: 0xCAA5,\n\t22308 - 11905: 0x884F,\n\t22309 - 11905: 0x8850,\n\t22310 - 11905: 0x8851,\n\t22311 - 11905: 0x8852,\n\t22312 - 11905: 0xD4DA,\n\t22313 - 11905: 0xDBD7,\n\t22314 - 11905: 0xDBD9,\n\t22315 - 11905: 0x8853,\n\t22316 - 11905: 0xDBD8,\n\t22317 - 11905: 0xB9E7,\n\t22318 - 11905: 0xDBDC,\n\t22319 - 11905: 0xDBDD,\n\t22320 - 11905: 0xB5D8,\n\t22321 - 11905: 0x8854,\n\t22322 - 11905: 0x8855,\n\t22323 - 11905: 0xDBDA,\n\t22324 - 11905: 0x8856,\n\t22325 - 11905: 0x8857,\n\t22326 - 11905: 0x8858,\n\t22327 - 11905: 0x8859,\n\t22328 - 11905: 0x885A,\n\t22329 - 11905: 0xDBDB,\n\t22330 - 11905: 0xB3A1,\n\t22331 - 11905: 0xDBDF,\n\t22332 - 11905: 0x885B,\n\t22333 - 11905: 0x885C,\n\t22334 - 11905: 0xBBF8,\n\t22335 - 11905: 0x885D,\n\t22336 - 11905: 0xD6B7,\n\t22337 - 11905: 0x885E,\n\t22338 - 11905: 0xDBE0,\n\t22339 - 11905: 0x885F,\n\t22340 - 11905: 0x8860,\n\t22341 - 11905: 0x8861,\n\t22342 - 11905: 0x8862,\n\t22343 - 11905: 0xBEF9,\n\t22344 - 11905: 0x8863,\n\t22345 - 11905: 0x8864,\n\t22346 - 11905: 0xB7BB,\n\t22347 - 11905: 0x8865,\n\t22348 - 11905: 0xDBD0,\n\t22349 - 11905: 0xCCAE,\n\t22350 - 11905: 0xBFB2,\n\t22351 - 11905: 0xBBB5,\n\t22352 - 11905: 0xD7F8,\n\t22353 - 11905: 0xBFD3,\n\t22354 - 11905: 0x8866,\n\t22355 - 11905: 0x8867,\n\t22356 - 11905: 0x8868,\n\t22357 - 11905: 0x8869,\n\t22358 - 11905: 0x886A,\n\t22359 - 11905: 0xBFE9,\n\t22360 - 11905: 0x886B,\n\t22361 - 11905: 0x886C,\n\t22362 - 11905: 0xBCE1,\n\t22363 - 11905: 0xCCB3,\n\t22364 - 11905: 0xDBDE,\n\t22365 - 11905: 0xB0D3,\n\t22366 - 11905: 0xCEEB,\n\t22367 - 11905: 0xB7D8,\n\t22368 - 11905: 0xD7B9,\n\t22369 - 11905: 0xC6C2,\n\t22370 - 11905: 0x886D,\n\t22371 - 11905: 0x886E,\n\t22372 - 11905: 0xC0A4,\n\t22373 - 11905: 0x886F,\n\t22374 - 11905: 0xCCB9,\n\t22375 - 11905: 0x8870,\n\t22376 - 11905: 0xDBE7,\n\t22377 - 11905: 0xDBE1,\n\t22378 - 11905: 0xC6BA,\n\t22379 - 11905: 0xDBE3,\n\t22380 - 11905: 0x8871,\n\t22381 - 11905: 0xDBE8,\n\t22382 - 11905: 0x8872,\n\t22383 - 11905: 0xC5F7,\n\t22384 - 11905: 0x8873,\n\t22385 - 11905: 0x8874,\n\t22386 - 11905: 0x8875,\n\t22387 - 11905: 0xDBEA,\n\t22388 - 11905: 0x8876,\n\t22389 - 11905: 0x8877,\n\t22390 - 11905: 0xDBE9,\n\t22391 - 11905: 0xBFC0,\n\t22392 - 11905: 0x8878,\n\t22393 - 11905: 0x8879,\n\t22394 - 11905: 0x887A,\n\t22395 - 11905: 0xDBE6,\n\t22396 - 11905: 0xDBE5,\n\t22397 - 11905: 0x887B,\n\t22398 - 11905: 0x887C,\n\t22399 - 11905: 0x887D,\n\t22400 - 11905: 0x887E,\n\t22401 - 11905: 0x8880,\n\t22402 - 11905: 0xB4B9,\n\t22403 - 11905: 0xC0AC,\n\t22404 - 11905: 0xC2A2,\n\t22405 - 11905: 0xDBE2,\n\t22406 - 11905: 0xDBE4,\n\t22407 - 11905: 0x8881,\n\t22408 - 11905: 0x8882,\n\t22409 - 11905: 0x8883,\n\t22410 - 11905: 0x8884,\n\t22411 - 11905: 0xD0CD,\n\t22412 - 11905: 0xDBED,\n\t22413 - 11905: 0x8885,\n\t22414 - 11905: 0x8886,\n\t22415 - 11905: 0x8887,\n\t22416 - 11905: 0x8888,\n\t22417 - 11905: 0x8889,\n\t22418 - 11905: 0xC0DD,\n\t22419 - 11905: 0xDBF2,\n\t22420 - 11905: 0x888A,\n\t22421 - 11905: 0x888B,\n\t22422 - 11905: 0x888C,\n\t22423 - 11905: 0x888D,\n\t22424 - 11905: 0x888E,\n\t22425 - 11905: 0x888F,\n\t22426 - 11905: 0x8890,\n\t22427 - 11905: 0xB6E2,\n\t22428 - 11905: 0x8891,\n\t22429 - 11905: 0x8892,\n\t22430 - 11905: 0x8893,\n\t22431 - 11905: 0x8894,\n\t22432 - 11905: 0xDBF3,\n\t22433 - 11905: 0xDBD2,\n\t22434 - 11905: 0xB9B8,\n\t22435 - 11905: 0xD4AB,\n\t22436 - 11905: 0xDBEC,\n\t22437 - 11905: 0x8895,\n\t22438 - 11905: 0xBFD1,\n\t22439 - 11905: 0xDBF0,\n\t22440 - 11905: 0x8896,\n\t22441 - 11905: 0xDBD1,\n\t22442 - 11905: 0x8897,\n\t22443 - 11905: 0xB5E6,\n\t22444 - 11905: 0x8898,\n\t22445 - 11905: 0xDBEB,\n\t22446 - 11905: 0xBFE5,\n\t22447 - 11905: 0x8899,\n\t22448 - 11905: 0x889A,\n\t22449 - 11905: 0x889B,\n\t22450 - 11905: 0xDBEE,\n\t22451 - 11905: 0x889C,\n\t22452 - 11905: 0xDBF1,\n\t22453 - 11905: 0x889D,\n\t22454 - 11905: 0x889E,\n\t22455 - 11905: 0x889F,\n\t22456 - 11905: 0xDBF9,\n\t22457 - 11905: 0x88A0,\n\t22458 - 11905: 0x88A1,\n\t22459 - 11905: 0x88A2,\n\t22460 - 11905: 0x88A3,\n\t22461 - 11905: 0x88A4,\n\t22462 - 11905: 0x88A5,\n\t22463 - 11905: 0x88A6,\n\t22464 - 11905: 0x88A7,\n\t22465 - 11905: 0x88A8,\n\t22466 - 11905: 0xB9A1,\n\t22467 - 11905: 0xB0A3,\n\t22468 - 11905: 0x88A9,\n\t22469 - 11905: 0x88AA,\n\t22470 - 11905: 0x88AB,\n\t22471 - 11905: 0x88AC,\n\t22472 - 11905: 0x88AD,\n\t22473 - 11905: 0x88AE,\n\t22474 - 11905: 0x88AF,\n\t22475 - 11905: 0xC2F1,\n\t22476 - 11905: 0x88B0,\n\t22477 - 11905: 0x88B1,\n\t22478 - 11905: 0xB3C7,\n\t22479 - 11905: 0xDBEF,\n\t22480 - 11905: 0x88B2,\n\t22481 - 11905: 0x88B3,\n\t22482 - 11905: 0xDBF8,\n\t22483 - 11905: 0x88B4,\n\t22484 - 11905: 0xC6D2,\n\t22485 - 11905: 0xDBF4,\n\t22486 - 11905: 0x88B5,\n\t22487 - 11905: 0x88B6,\n\t22488 - 11905: 0xDBF5,\n\t22489 - 11905: 0xDBF7,\n\t22490 - 11905: 0xDBF6,\n\t22491 - 11905: 0x88B7,\n\t22492 - 11905: 0x88B8,\n\t22493 - 11905: 0xDBFE,\n\t22494 - 11905: 0x88B9,\n\t22495 - 11905: 0xD3F2,\n\t22496 - 11905: 0xB2BA,\n\t22497 - 11905: 0x88BA,\n\t22498 - 11905: 0x88BB,\n\t22499 - 11905: 0x88BC,\n\t22500 - 11905: 0xDBFD,\n\t22501 - 11905: 0x88BD,\n\t22502 - 11905: 0x88BE,\n\t22503 - 11905: 0x88BF,\n\t22504 - 11905: 0x88C0,\n\t22505 - 11905: 0x88C1,\n\t22506 - 11905: 0x88C2,\n\t22507 - 11905: 0x88C3,\n\t22508 - 11905: 0x88C4,\n\t22509 - 11905: 0xDCA4,\n\t22510 - 11905: 0x88C5,\n\t22511 - 11905: 0xDBFB,\n\t22512 - 11905: 0x88C6,\n\t22513 - 11905: 0x88C7,\n\t22514 - 11905: 0x88C8,\n\t22515 - 11905: 0x88C9,\n\t22516 - 11905: 0xDBFA,\n\t22517 - 11905: 0x88CA,\n\t22518 - 11905: 0x88CB,\n\t22519 - 11905: 0x88CC,\n\t22520 - 11905: 0xDBFC,\n\t22521 - 11905: 0xC5E0,\n\t22522 - 11905: 0xBBF9,\n\t22523 - 11905: 0x88CD,\n\t22524 - 11905: 0x88CE,\n\t22525 - 11905: 0xDCA3,\n\t22526 - 11905: 0x88CF,\n\t22527 - 11905: 0x88D0,\n\t22528 - 11905: 0xDCA5,\n\t22529 - 11905: 0x88D1,\n\t22530 - 11905: 0xCCC3,\n\t22531 - 11905: 0x88D2,\n\t22532 - 11905: 0x88D3,\n\t22533 - 11905: 0x88D4,\n\t22534 - 11905: 0xB6D1,\n\t22535 - 11905: 0xDDC0,\n\t22536 - 11905: 0x88D5,\n\t22537 - 11905: 0x88D6,\n\t22538 - 11905: 0x88D7,\n\t22539 - 11905: 0xDCA1,\n\t22540 - 11905: 0x88D8,\n\t22541 - 11905: 0xDCA2,\n\t22542 - 11905: 0x88D9,\n\t22543 - 11905: 0x88DA,\n\t22544 - 11905: 0x88DB,\n\t22545 - 11905: 0xC7B5,\n\t22546 - 11905: 0x88DC,\n\t22547 - 11905: 0x88DD,\n\t22548 - 11905: 0x88DE,\n\t22549 - 11905: 0xB6E9,\n\t22550 - 11905: 0x88DF,\n\t22551 - 11905: 0x88E0,\n\t22552 - 11905: 0x88E1,\n\t22553 - 11905: 0xDCA7,\n\t22554 - 11905: 0x88E2,\n\t22555 - 11905: 0x88E3,\n\t22556 - 11905: 0x88E4,\n\t22557 - 11905: 0x88E5,\n\t22558 - 11905: 0xDCA6,\n\t22559 - 11905: 0x88E6,\n\t22560 - 11905: 0xDCA9,\n\t22561 - 11905: 0xB1A4,\n\t22562 - 11905: 0x88E7,\n\t22563 - 11905: 0x88E8,\n\t22564 - 11905: 0xB5CC,\n\t22565 - 11905: 0x88E9,\n\t22566 - 11905: 0x88EA,\n\t22567 - 11905: 0x88EB,\n\t22568 - 11905: 0x88EC,\n\t22569 - 11905: 0x88ED,\n\t22570 - 11905: 0xBFB0,\n\t22571 - 11905: 0x88EE,\n\t22572 - 11905: 0x88EF,\n\t22573 - 11905: 0x88F0,\n\t22574 - 11905: 0x88F1,\n\t22575 - 11905: 0x88F2,\n\t22576 - 11905: 0xD1DF,\n\t22577 - 11905: 0x88F3,\n\t22578 - 11905: 0x88F4,\n\t22579 - 11905: 0x88F5,\n\t22580 - 11905: 0x88F6,\n\t22581 - 11905: 0xB6C2,\n\t22582 - 11905: 0x88F7,\n\t22583 - 11905: 0x88F8,\n\t22584 - 11905: 0x88F9,\n\t22585 - 11905: 0x88FA,\n\t22586 - 11905: 0x88FB,\n\t22587 - 11905: 0x88FC,\n\t22588 - 11905: 0x88FD,\n\t22589 - 11905: 0x88FE,\n\t22590 - 11905: 0x8940,\n\t22591 - 11905: 0x8941,\n\t22592 - 11905: 0x8942,\n\t22593 - 11905: 0x8943,\n\t22594 - 11905: 0x8944,\n\t22595 - 11905: 0x8945,\n\t22596 - 11905: 0xDCA8,\n\t22597 - 11905: 0x8946,\n\t22598 - 11905: 0x8947,\n\t22599 - 11905: 0x8948,\n\t22600 - 11905: 0x8949,\n\t22601 - 11905: 0x894A,\n\t22602 - 11905: 0x894B,\n\t22603 - 11905: 0x894C,\n\t22604 - 11905: 0xCBFA,\n\t22605 - 11905: 0xEBF3,\n\t22606 - 11905: 0x894D,\n\t22607 - 11905: 0x894E,\n\t22608 - 11905: 0x894F,\n\t22609 - 11905: 0xCBDC,\n\t22610 - 11905: 0x8950,\n\t22611 - 11905: 0x8951,\n\t22612 - 11905: 0xCBFE,\n\t22613 - 11905: 0x8952,\n\t22614 - 11905: 0x8953,\n\t22615 - 11905: 0x8954,\n\t22616 - 11905: 0xCCC1,\n\t22617 - 11905: 0x8955,\n\t22618 - 11905: 0x8956,\n\t22619 - 11905: 0x8957,\n\t22620 - 11905: 0x8958,\n\t22621 - 11905: 0x8959,\n\t22622 - 11905: 0xC8FB,\n\t22623 - 11905: 0x895A,\n\t22624 - 11905: 0x895B,\n\t22625 - 11905: 0x895C,\n\t22626 - 11905: 0x895D,\n\t22627 - 11905: 0x895E,\n\t22628 - 11905: 0x895F,\n\t22629 - 11905: 0xDCAA,\n\t22630 - 11905: 0x8960,\n\t22631 - 11905: 0x8961,\n\t22632 - 11905: 0x8962,\n\t22633 - 11905: 0x8963,\n\t22634 - 11905: 0x8964,\n\t22635 - 11905: 0xCCEE,\n\t22636 - 11905: 0xDCAB,\n\t22637 - 11905: 0x8965,\n\t22638 - 11905: 0x8966,\n\t22639 - 11905: 0x8967,\n\t22640 - 11905: 0x8968,\n\t22641 - 11905: 0x8969,\n\t22642 - 11905: 0x896A,\n\t22643 - 11905: 0x896B,\n\t22644 - 11905: 0x896C,\n\t22645 - 11905: 0x896D,\n\t22646 - 11905: 0x896E,\n\t22647 - 11905: 0x896F,\n\t22648 - 11905: 0x8970,\n\t22649 - 11905: 0x8971,\n\t22650 - 11905: 0x8972,\n\t22651 - 11905: 0x8973,\n\t22652 - 11905: 0x8974,\n\t22653 - 11905: 0x8975,\n\t22654 - 11905: 0xDBD3,\n\t22655 - 11905: 0x8976,\n\t22656 - 11905: 0xDCAF,\n\t22657 - 11905: 0xDCAC,\n\t22658 - 11905: 0x8977,\n\t22659 - 11905: 0xBEB3,\n\t22660 - 11905: 0x8978,\n\t22661 - 11905: 0xCAFB,\n\t22662 - 11905: 0x8979,\n\t22663 - 11905: 0x897A,\n\t22664 - 11905: 0x897B,\n\t22665 - 11905: 0xDCAD,\n\t22666 - 11905: 0x897C,\n\t22667 - 11905: 0x897D,\n\t22668 - 11905: 0x897E,\n\t22669 - 11905: 0x8980,\n\t22670 - 11905: 0x8981,\n\t22671 - 11905: 0x8982,\n\t22672 - 11905: 0x8983,\n\t22673 - 11905: 0x8984,\n\t22674 - 11905: 0xC9CA,\n\t22675 - 11905: 0xC4B9,\n\t22676 - 11905: 0x8985,\n\t22677 - 11905: 0x8986,\n\t22678 - 11905: 0x8987,\n\t22679 - 11905: 0x8988,\n\t22680 - 11905: 0x8989,\n\t22681 - 11905: 0xC7BD,\n\t22682 - 11905: 0xDCAE,\n\t22683 - 11905: 0x898A,\n\t22684 - 11905: 0x898B,\n\t22685 - 11905: 0x898C,\n\t22686 - 11905: 0xD4F6,\n\t22687 - 11905: 0xD0E6,\n\t22688 - 11905: 0x898D,\n\t22689 - 11905: 0x898E,\n\t22690 - 11905: 0x898F,\n\t22691 - 11905: 0x8990,\n\t22692 - 11905: 0x8991,\n\t22693 - 11905: 0x8992,\n\t22694 - 11905: 0x8993,\n\t22695 - 11905: 0x8994,\n\t22696 - 11905: 0xC4AB,\n\t22697 - 11905: 0xB6D5,\n\t22698 - 11905: 0x8995,\n\t22699 - 11905: 0x8996,\n\t22700 - 11905: 0x8997,\n\t22701 - 11905: 0x8998,\n\t22702 - 11905: 0x8999,\n\t22703 - 11905: 0x899A,\n\t22704 - 11905: 0x899B,\n\t22705 - 11905: 0x899C,\n\t22706 - 11905: 0x899D,\n\t22707 - 11905: 0x899E,\n\t22708 - 11905: 0x899F,\n\t22709 - 11905: 0x89A0,\n\t22710 - 11905: 0x89A1,\n\t22711 - 11905: 0x89A2,\n\t22712 - 11905: 0x89A3,\n\t22713 - 11905: 0x89A4,\n\t22714 - 11905: 0x89A5,\n\t22715 - 11905: 0x89A6,\n\t22716 - 11905: 0xDBD4,\n\t22717 - 11905: 0x89A7,\n\t22718 - 11905: 0x89A8,\n\t22719 - 11905: 0x89A9,\n\t22720 - 11905: 0x89AA,\n\t22721 - 11905: 0xB1DA,\n\t22722 - 11905: 0x89AB,\n\t22723 - 11905: 0x89AC,\n\t22724 - 11905: 0x89AD,\n\t22725 - 11905: 0xDBD5,\n\t22726 - 11905: 0x89AE,\n\t22727 - 11905: 0x89AF,\n\t22728 - 11905: 0x89B0,\n\t22729 - 11905: 0x89B1,\n\t22730 - 11905: 0x89B2,\n\t22731 - 11905: 0x89B3,\n\t22732 - 11905: 0x89B4,\n\t22733 - 11905: 0x89B5,\n\t22734 - 11905: 0x89B6,\n\t22735 - 11905: 0x89B7,\n\t22736 - 11905: 0x89B8,\n\t22737 - 11905: 0xDBD6,\n\t22738 - 11905: 0x89B9,\n\t22739 - 11905: 0x89BA,\n\t22740 - 11905: 0x89BB,\n\t22741 - 11905: 0xBABE,\n\t22742 - 11905: 0x89BC,\n\t22743 - 11905: 0x89BD,\n\t22744 - 11905: 0x89BE,\n\t22745 - 11905: 0x89BF,\n\t22746 - 11905: 0x89C0,\n\t22747 - 11905: 0x89C1,\n\t22748 - 11905: 0x89C2,\n\t22749 - 11905: 0x89C3,\n\t22750 - 11905: 0x89C4,\n\t22751 - 11905: 0x89C5,\n\t22752 - 11905: 0x89C6,\n\t22753 - 11905: 0x89C7,\n\t22754 - 11905: 0x89C8,\n\t22755 - 11905: 0x89C9,\n\t22756 - 11905: 0xC8C0,\n\t22757 - 11905: 0x89CA,\n\t22758 - 11905: 0x89CB,\n\t22759 - 11905: 0x89CC,\n\t22760 - 11905: 0x89CD,\n\t22761 - 11905: 0x89CE,\n\t22762 - 11905: 0x89CF,\n\t22763 - 11905: 0xCABF,\n\t22764 - 11905: 0xC8C9,\n\t22765 - 11905: 0x89D0,\n\t22766 - 11905: 0xD7B3,\n\t22767 - 11905: 0x89D1,\n\t22768 - 11905: 0xC9F9,\n\t22769 - 11905: 0x89D2,\n\t22770 - 11905: 0x89D3,\n\t22771 - 11905: 0xBFC7,\n\t22772 - 11905: 0x89D4,\n\t22773 - 11905: 0x89D5,\n\t22774 - 11905: 0xBAF8,\n\t22775 - 11905: 0x89D6,\n\t22776 - 11905: 0x89D7,\n\t22777 - 11905: 0xD2BC,\n\t22778 - 11905: 0x89D8,\n\t22779 - 11905: 0x89D9,\n\t22780 - 11905: 0x89DA,\n\t22781 - 11905: 0x89DB,\n\t22782 - 11905: 0x89DC,\n\t22783 - 11905: 0x89DD,\n\t22784 - 11905: 0x89DE,\n\t22785 - 11905: 0x89DF,\n\t22786 - 11905: 0xE2BA,\n\t22787 - 11905: 0x89E0,\n\t22788 - 11905: 0xB4A6,\n\t22789 - 11905: 0x89E1,\n\t22790 - 11905: 0x89E2,\n\t22791 - 11905: 0xB1B8,\n\t22792 - 11905: 0x89E3,\n\t22793 - 11905: 0x89E4,\n\t22794 - 11905: 0x89E5,\n\t22795 - 11905: 0x89E6,\n\t22796 - 11905: 0x89E7,\n\t22797 - 11905: 0xB8B4,\n\t22798 - 11905: 0x89E8,\n\t22799 - 11905: 0xCFC4,\n\t22800 - 11905: 0x89E9,\n\t22801 - 11905: 0x89EA,\n\t22802 - 11905: 0x89EB,\n\t22803 - 11905: 0x89EC,\n\t22804 - 11905: 0xD9E7,\n\t22805 - 11905: 0xCFA6,\n\t22806 - 11905: 0xCDE2,\n\t22807 - 11905: 0x89ED,\n\t22808 - 11905: 0x89EE,\n\t22809 - 11905: 0xD9ED,\n\t22810 - 11905: 0xB6E0,\n\t22811 - 11905: 0x89EF,\n\t22812 - 11905: 0xD2B9,\n\t22813 - 11905: 0x89F0,\n\t22814 - 11905: 0x89F1,\n\t22815 - 11905: 0xB9BB,\n\t22816 - 11905: 0x89F2,\n\t22817 - 11905: 0x89F3,\n\t22818 - 11905: 0x89F4,\n\t22819 - 11905: 0x89F5,\n\t22820 - 11905: 0xE2B9,\n\t22821 - 11905: 0xE2B7,\n\t22822 - 11905: 0x89F6,\n\t22823 - 11905: 0xB4F3,\n\t22824 - 11905: 0x89F7,\n\t22825 - 11905: 0xCCEC,\n\t22826 - 11905: 0xCCAB,\n\t22827 - 11905: 0xB7F2,\n\t22828 - 11905: 0x89F8,\n\t22829 - 11905: 0xD8B2,\n\t22830 - 11905: 0xD1EB,\n\t22831 - 11905: 0xBABB,\n\t22832 - 11905: 0x89F9,\n\t22833 - 11905: 0xCAA7,\n\t22834 - 11905: 0x89FA,\n\t22835 - 11905: 0x89FB,\n\t22836 - 11905: 0xCDB7,\n\t22837 - 11905: 0x89FC,\n\t22838 - 11905: 0x89FD,\n\t22839 - 11905: 0xD2C4,\n\t22840 - 11905: 0xBFE4,\n\t22841 - 11905: 0xBCD0,\n\t22842 - 11905: 0xB6E1,\n\t22843 - 11905: 0x89FE,\n\t22844 - 11905: 0xDEC5,\n\t22845 - 11905: 0x8A40,\n\t22846 - 11905: 0x8A41,\n\t22847 - 11905: 0x8A42,\n\t22848 - 11905: 0x8A43,\n\t22849 - 11905: 0xDEC6,\n\t22850 - 11905: 0xDBBC,\n\t22851 - 11905: 0x8A44,\n\t22852 - 11905: 0xD1D9,\n\t22853 - 11905: 0x8A45,\n\t22854 - 11905: 0x8A46,\n\t22855 - 11905: 0xC6E6,\n\t22856 - 11905: 0xC4CE,\n\t22857 - 11905: 0xB7EE,\n\t22858 - 11905: 0x8A47,\n\t22859 - 11905: 0xB7DC,\n\t22860 - 11905: 0x8A48,\n\t22861 - 11905: 0x8A49,\n\t22862 - 11905: 0xBFFC,\n\t22863 - 11905: 0xD7E0,\n\t22864 - 11905: 0x8A4A,\n\t22865 - 11905: 0xC6F5,\n\t22866 - 11905: 0x8A4B,\n\t22867 - 11905: 0x8A4C,\n\t22868 - 11905: 0xB1BC,\n\t22869 - 11905: 0xDEC8,\n\t22870 - 11905: 0xBDB1,\n\t22871 - 11905: 0xCCD7,\n\t22872 - 11905: 0xDECA,\n\t22873 - 11905: 0x8A4D,\n\t22874 - 11905: 0xDEC9,\n\t22875 - 11905: 0x8A4E,\n\t22876 - 11905: 0x8A4F,\n\t22877 - 11905: 0x8A50,\n\t22878 - 11905: 0x8A51,\n\t22879 - 11905: 0x8A52,\n\t22880 - 11905: 0xB5EC,\n\t22881 - 11905: 0x8A53,\n\t22882 - 11905: 0xC9DD,\n\t22883 - 11905: 0x8A54,\n\t22884 - 11905: 0x8A55,\n\t22885 - 11905: 0xB0C2,\n\t22886 - 11905: 0x8A56,\n\t22887 - 11905: 0x8A57,\n\t22888 - 11905: 0x8A58,\n\t22889 - 11905: 0x8A59,\n\t22890 - 11905: 0x8A5A,\n\t22891 - 11905: 0x8A5B,\n\t22892 - 11905: 0x8A5C,\n\t22893 - 11905: 0x8A5D,\n\t22894 - 11905: 0x8A5E,\n\t22895 - 11905: 0x8A5F,\n\t22896 - 11905: 0x8A60,\n\t22897 - 11905: 0x8A61,\n\t22898 - 11905: 0x8A62,\n\t22899 - 11905: 0xC5AE,\n\t22900 - 11905: 0xC5AB,\n\t22901 - 11905: 0x8A63,\n\t22902 - 11905: 0xC4CC,\n\t22903 - 11905: 0x8A64,\n\t22904 - 11905: 0xBCE9,\n\t22905 - 11905: 0xCBFD,\n\t22906 - 11905: 0x8A65,\n\t22907 - 11905: 0x8A66,\n\t22908 - 11905: 0x8A67,\n\t22909 - 11905: 0xBAC3,\n\t22910 - 11905: 0x8A68,\n\t22911 - 11905: 0x8A69,\n\t22912 - 11905: 0x8A6A,\n\t22913 - 11905: 0xE5F9,\n\t22914 - 11905: 0xC8E7,\n\t22915 - 11905: 0xE5FA,\n\t22916 - 11905: 0xCDFD,\n\t22917 - 11905: 0x8A6B,\n\t22918 - 11905: 0xD7B1,\n\t22919 - 11905: 0xB8BE,\n\t22920 - 11905: 0xC2E8,\n\t22921 - 11905: 0x8A6C,\n\t22922 - 11905: 0xC8D1,\n\t22923 - 11905: 0x8A6D,\n\t22924 - 11905: 0x8A6E,\n\t22925 - 11905: 0xE5FB,\n\t22926 - 11905: 0x8A6F,\n\t22927 - 11905: 0x8A70,\n\t22928 - 11905: 0x8A71,\n\t22929 - 11905: 0x8A72,\n\t22930 - 11905: 0xB6CA,\n\t22931 - 11905: 0xBCCB,\n\t22932 - 11905: 0x8A73,\n\t22933 - 11905: 0x8A74,\n\t22934 - 11905: 0xD1FD,\n\t22935 - 11905: 0xE6A1,\n\t22936 - 11905: 0x8A75,\n\t22937 - 11905: 0xC3EE,\n\t22938 - 11905: 0x8A76,\n\t22939 - 11905: 0x8A77,\n\t22940 - 11905: 0x8A78,\n\t22941 - 11905: 0x8A79,\n\t22942 - 11905: 0xE6A4,\n\t22943 - 11905: 0x8A7A,\n\t22944 - 11905: 0x8A7B,\n\t22945 - 11905: 0x8A7C,\n\t22946 - 11905: 0x8A7D,\n\t22947 - 11905: 0xE5FE,\n\t22948 - 11905: 0xE6A5,\n\t22949 - 11905: 0xCDD7,\n\t22950 - 11905: 0x8A7E,\n\t22951 - 11905: 0x8A80,\n\t22952 - 11905: 0xB7C1,\n\t22953 - 11905: 0xE5FC,\n\t22954 - 11905: 0xE5FD,\n\t22955 - 11905: 0xE6A3,\n\t22956 - 11905: 0x8A81,\n\t22957 - 11905: 0x8A82,\n\t22958 - 11905: 0xC4DD,\n\t22959 - 11905: 0xE6A8,\n\t22960 - 11905: 0x8A83,\n\t22961 - 11905: 0x8A84,\n\t22962 - 11905: 0xE6A7,\n\t22963 - 11905: 0x8A85,\n\t22964 - 11905: 0x8A86,\n\t22965 - 11905: 0x8A87,\n\t22966 - 11905: 0x8A88,\n\t22967 - 11905: 0x8A89,\n\t22968 - 11905: 0x8A8A,\n\t22969 - 11905: 0xC3C3,\n\t22970 - 11905: 0x8A8B,\n\t22971 - 11905: 0xC6DE,\n\t22972 - 11905: 0x8A8C,\n\t22973 - 11905: 0x8A8D,\n\t22974 - 11905: 0xE6AA,\n\t22975 - 11905: 0x8A8E,\n\t22976 - 11905: 0x8A8F,\n\t22977 - 11905: 0x8A90,\n\t22978 - 11905: 0x8A91,\n\t22979 - 11905: 0x8A92,\n\t22980 - 11905: 0x8A93,\n\t22981 - 11905: 0x8A94,\n\t22982 - 11905: 0xC4B7,\n\t22983 - 11905: 0x8A95,\n\t22984 - 11905: 0x8A96,\n\t22985 - 11905: 0x8A97,\n\t22986 - 11905: 0xE6A2,\n\t22987 - 11905: 0xCABC,\n\t22988 - 11905: 0x8A98,\n\t22989 - 11905: 0x8A99,\n\t22990 - 11905: 0x8A9A,\n\t22991 - 11905: 0x8A9B,\n\t22992 - 11905: 0xBDE3,\n\t22993 - 11905: 0xB9C3,\n\t22994 - 11905: 0xE6A6,\n\t22995 - 11905: 0xD0D5,\n\t22996 - 11905: 0xCEAF,\n\t22997 - 11905: 0x8A9C,\n\t22998 - 11905: 0x8A9D,\n\t22999 - 11905: 0xE6A9,\n\t23000 - 11905: 0xE6B0,\n\t23001 - 11905: 0x8A9E,\n\t23002 - 11905: 0xD2A6,\n\t23003 - 11905: 0x8A9F,\n\t23004 - 11905: 0xBDAA,\n\t23005 - 11905: 0xE6AD,\n\t23006 - 11905: 0x8AA0,\n\t23007 - 11905: 0x8AA1,\n\t23008 - 11905: 0x8AA2,\n\t23009 - 11905: 0x8AA3,\n\t23010 - 11905: 0x8AA4,\n\t23011 - 11905: 0xE6AF,\n\t23012 - 11905: 0x8AA5,\n\t23013 - 11905: 0xC0D1,\n\t23014 - 11905: 0x8AA6,\n\t23015 - 11905: 0x8AA7,\n\t23016 - 11905: 0xD2CC,\n\t23017 - 11905: 0x8AA8,\n\t23018 - 11905: 0x8AA9,\n\t23019 - 11905: 0x8AAA,\n\t23020 - 11905: 0xBCA7,\n\t23021 - 11905: 0x8AAB,\n\t23022 - 11905: 0x8AAC,\n\t23023 - 11905: 0x8AAD,\n\t23024 - 11905: 0x8AAE,\n\t23025 - 11905: 0x8AAF,\n\t23026 - 11905: 0x8AB0,\n\t23027 - 11905: 0x8AB1,\n\t23028 - 11905: 0x8AB2,\n\t23029 - 11905: 0x8AB3,\n\t23030 - 11905: 0x8AB4,\n\t23031 - 11905: 0x8AB5,\n\t23032 - 11905: 0x8AB6,\n\t23033 - 11905: 0xE6B1,\n\t23034 - 11905: 0x8AB7,\n\t23035 - 11905: 0xD2F6,\n\t23036 - 11905: 0x8AB8,\n\t23037 - 11905: 0x8AB9,\n\t23038 - 11905: 0x8ABA,\n\t23039 - 11905: 0xD7CB,\n\t23040 - 11905: 0x8ABB,\n\t23041 - 11905: 0xCDFE,\n\t23042 - 11905: 0x8ABC,\n\t23043 - 11905: 0xCDDE,\n\t23044 - 11905: 0xC2A6,\n\t23045 - 11905: 0xE6AB,\n\t23046 - 11905: 0xE6AC,\n\t23047 - 11905: 0xBDBF,\n\t23048 - 11905: 0xE6AE,\n\t23049 - 11905: 0xE6B3,\n\t23050 - 11905: 0x8ABD,\n\t23051 - 11905: 0x8ABE,\n\t23052 - 11905: 0xE6B2,\n\t23053 - 11905: 0x8ABF,\n\t23054 - 11905: 0x8AC0,\n\t23055 - 11905: 0x8AC1,\n\t23056 - 11905: 0x8AC2,\n\t23057 - 11905: 0xE6B6,\n\t23058 - 11905: 0x8AC3,\n\t23059 - 11905: 0xE6B8,\n\t23060 - 11905: 0x8AC4,\n\t23061 - 11905: 0x8AC5,\n\t23062 - 11905: 0x8AC6,\n\t23063 - 11905: 0x8AC7,\n\t23064 - 11905: 0xC4EF,\n\t23065 - 11905: 0x8AC8,\n\t23066 - 11905: 0x8AC9,\n\t23067 - 11905: 0x8ACA,\n\t23068 - 11905: 0xC4C8,\n\t23069 - 11905: 0x8ACB,\n\t23070 - 11905: 0x8ACC,\n\t23071 - 11905: 0xBEEA,\n\t23072 - 11905: 0xC9EF,\n\t23073 - 11905: 0x8ACD,\n\t23074 - 11905: 0x8ACE,\n\t23075 - 11905: 0xE6B7,\n\t23076 - 11905: 0x8ACF,\n\t23077 - 11905: 0xB6F0,\n\t23078 - 11905: 0x8AD0,\n\t23079 - 11905: 0x8AD1,\n\t23080 - 11905: 0x8AD2,\n\t23081 - 11905: 0xC3E4,\n\t23082 - 11905: 0x8AD3,\n\t23083 - 11905: 0x8AD4,\n\t23084 - 11905: 0x8AD5,\n\t23085 - 11905: 0x8AD6,\n\t23086 - 11905: 0x8AD7,\n\t23087 - 11905: 0x8AD8,\n\t23088 - 11905: 0x8AD9,\n\t23089 - 11905: 0xD3E9,\n\t23090 - 11905: 0xE6B4,\n\t23091 - 11905: 0x8ADA,\n\t23092 - 11905: 0xE6B5,\n\t23093 - 11905: 0x8ADB,\n\t23094 - 11905: 0xC8A2,\n\t23095 - 11905: 0x8ADC,\n\t23096 - 11905: 0x8ADD,\n\t23097 - 11905: 0x8ADE,\n\t23098 - 11905: 0x8ADF,\n\t23099 - 11905: 0x8AE0,\n\t23100 - 11905: 0xE6BD,\n\t23101 - 11905: 0x8AE1,\n\t23102 - 11905: 0x8AE2,\n\t23103 - 11905: 0x8AE3,\n\t23104 - 11905: 0xE6B9,\n\t23105 - 11905: 0x8AE4,\n\t23106 - 11905: 0x8AE5,\n\t23107 - 11905: 0x8AE6,\n\t23108 - 11905: 0x8AE7,\n\t23109 - 11905: 0x8AE8,\n\t23110 - 11905: 0xC6C5,\n\t23111 - 11905: 0x8AE9,\n\t23112 - 11905: 0x8AEA,\n\t23113 - 11905: 0xCDF1,\n\t23114 - 11905: 0xE6BB,\n\t23115 - 11905: 0x8AEB,\n\t23116 - 11905: 0x8AEC,\n\t23117 - 11905: 0x8AED,\n\t23118 - 11905: 0x8AEE,\n\t23119 - 11905: 0x8AEF,\n\t23120 - 11905: 0x8AF0,\n\t23121 - 11905: 0x8AF1,\n\t23122 - 11905: 0x8AF2,\n\t23123 - 11905: 0x8AF3,\n\t23124 - 11905: 0x8AF4,\n\t23125 - 11905: 0xE6BC,\n\t23126 - 11905: 0x8AF5,\n\t23127 - 11905: 0x8AF6,\n\t23128 - 11905: 0x8AF7,\n\t23129 - 11905: 0x8AF8,\n\t23130 - 11905: 0xBBE9,\n\t23131 - 11905: 0x8AF9,\n\t23132 - 11905: 0x8AFA,\n\t23133 - 11905: 0x8AFB,\n\t23134 - 11905: 0x8AFC,\n\t23135 - 11905: 0x8AFD,\n\t23136 - 11905: 0x8AFE,\n\t23137 - 11905: 0x8B40,\n\t23138 - 11905: 0xE6BE,\n\t23139 - 11905: 0x8B41,\n\t23140 - 11905: 0x8B42,\n\t23141 - 11905: 0x8B43,\n\t23142 - 11905: 0x8B44,\n\t23143 - 11905: 0xE6BA,\n\t23144 - 11905: 0x8B45,\n\t23145 - 11905: 0x8B46,\n\t23146 - 11905: 0xC0B7,\n\t23147 - 11905: 0x8B47,\n\t23148 - 11905: 0x8B48,\n\t23149 - 11905: 0x8B49,\n\t23150 - 11905: 0x8B4A,\n\t23151 - 11905: 0x8B4B,\n\t23152 - 11905: 0x8B4C,\n\t23153 - 11905: 0x8B4D,\n\t23154 - 11905: 0x8B4E,\n\t23155 - 11905: 0x8B4F,\n\t23156 - 11905: 0xD3A4,\n\t23157 - 11905: 0xE6BF,\n\t23158 - 11905: 0xC9F4,\n\t23159 - 11905: 0xE6C3,\n\t23160 - 11905: 0x8B50,\n\t23161 - 11905: 0x8B51,\n\t23162 - 11905: 0xE6C4,\n\t23163 - 11905: 0x8B52,\n\t23164 - 11905: 0x8B53,\n\t23165 - 11905: 0x8B54,\n\t23166 - 11905: 0x8B55,\n\t23167 - 11905: 0xD0F6,\n\t23168 - 11905: 0x8B56,\n\t23169 - 11905: 0x8B57,\n\t23170 - 11905: 0x8B58,\n\t23171 - 11905: 0x8B59,\n\t23172 - 11905: 0x8B5A,\n\t23173 - 11905: 0x8B5B,\n\t23174 - 11905: 0x8B5C,\n\t23175 - 11905: 0x8B5D,\n\t23176 - 11905: 0x8B5E,\n\t23177 - 11905: 0x8B5F,\n\t23178 - 11905: 0x8B60,\n\t23179 - 11905: 0x8B61,\n\t23180 - 11905: 0x8B62,\n\t23181 - 11905: 0x8B63,\n\t23182 - 11905: 0x8B64,\n\t23183 - 11905: 0x8B65,\n\t23184 - 11905: 0x8B66,\n\t23185 - 11905: 0x8B67,\n\t23186 - 11905: 0xC3BD,\n\t23187 - 11905: 0x8B68,\n\t23188 - 11905: 0x8B69,\n\t23189 - 11905: 0x8B6A,\n\t23190 - 11905: 0x8B6B,\n\t23191 - 11905: 0x8B6C,\n\t23192 - 11905: 0x8B6D,\n\t23193 - 11905: 0x8B6E,\n\t23194 - 11905: 0xC3C4,\n\t23195 - 11905: 0xE6C2,\n\t23196 - 11905: 0x8B6F,\n\t23197 - 11905: 0x8B70,\n\t23198 - 11905: 0x8B71,\n\t23199 - 11905: 0x8B72,\n\t23200 - 11905: 0x8B73,\n\t23201 - 11905: 0x8B74,\n\t23202 - 11905: 0x8B75,\n\t23203 - 11905: 0x8B76,\n\t23204 - 11905: 0x8B77,\n\t23205 - 11905: 0x8B78,\n\t23206 - 11905: 0x8B79,\n\t23207 - 11905: 0x8B7A,\n\t23208 - 11905: 0x8B7B,\n\t23209 - 11905: 0x8B7C,\n\t23210 - 11905: 0xE6C1,\n\t23211 - 11905: 0x8B7D,\n\t23212 - 11905: 0x8B7E,\n\t23213 - 11905: 0x8B80,\n\t23214 - 11905: 0x8B81,\n\t23215 - 11905: 0x8B82,\n\t23216 - 11905: 0x8B83,\n\t23217 - 11905: 0x8B84,\n\t23218 - 11905: 0xE6C7,\n\t23219 - 11905: 0xCFB1,\n\t23220 - 11905: 0x8B85,\n\t23221 - 11905: 0xEBF4,\n\t23222 - 11905: 0x8B86,\n\t23223 - 11905: 0x8B87,\n\t23224 - 11905: 0xE6CA,\n\t23225 - 11905: 0x8B88,\n\t23226 - 11905: 0x8B89,\n\t23227 - 11905: 0x8B8A,\n\t23228 - 11905: 0x8B8B,\n\t23229 - 11905: 0x8B8C,\n\t23230 - 11905: 0xE6C5,\n\t23231 - 11905: 0x8B8D,\n\t23232 - 11905: 0x8B8E,\n\t23233 - 11905: 0xBCDE,\n\t23234 - 11905: 0xC9A9,\n\t23235 - 11905: 0x8B8F,\n\t23236 - 11905: 0x8B90,\n\t23237 - 11905: 0x8B91,\n\t23238 - 11905: 0x8B92,\n\t23239 - 11905: 0x8B93,\n\t23240 - 11905: 0x8B94,\n\t23241 - 11905: 0xBCB5,\n\t23242 - 11905: 0x8B95,\n\t23243 - 11905: 0x8B96,\n\t23244 - 11905: 0xCFD3,\n\t23245 - 11905: 0x8B97,\n\t23246 - 11905: 0x8B98,\n\t23247 - 11905: 0x8B99,\n\t23248 - 11905: 0x8B9A,\n\t23249 - 11905: 0x8B9B,\n\t23250 - 11905: 0xE6C8,\n\t23251 - 11905: 0x8B9C,\n\t23252 - 11905: 0xE6C9,\n\t23253 - 11905: 0x8B9D,\n\t23254 - 11905: 0xE6CE,\n\t23255 - 11905: 0x8B9E,\n\t23256 - 11905: 0xE6D0,\n\t23257 - 11905: 0x8B9F,\n\t23258 - 11905: 0x8BA0,\n\t23259 - 11905: 0x8BA1,\n\t23260 - 11905: 0xE6D1,\n\t23261 - 11905: 0x8BA2,\n\t23262 - 11905: 0x8BA3,\n\t23263 - 11905: 0x8BA4,\n\t23264 - 11905: 0xE6CB,\n\t23265 - 11905: 0xB5D5,\n\t23266 - 11905: 0x8BA5,\n\t23267 - 11905: 0xE6CC,\n\t23268 - 11905: 0x8BA6,\n\t23269 - 11905: 0x8BA7,\n\t23270 - 11905: 0xE6CF,\n\t23271 - 11905: 0x8BA8,\n\t23272 - 11905: 0x8BA9,\n\t23273 - 11905: 0xC4DB,\n\t23274 - 11905: 0x8BAA,\n\t23275 - 11905: 0xE6C6,\n\t23276 - 11905: 0x8BAB,\n\t23277 - 11905: 0x8BAC,\n\t23278 - 11905: 0x8BAD,\n\t23279 - 11905: 0x8BAE,\n\t23280 - 11905: 0x8BAF,\n\t23281 - 11905: 0xE6CD,\n\t23282 - 11905: 0x8BB0,\n\t23283 - 11905: 0x8BB1,\n\t23284 - 11905: 0x8BB2,\n\t23285 - 11905: 0x8BB3,\n\t23286 - 11905: 0x8BB4,\n\t23287 - 11905: 0x8BB5,\n\t23288 - 11905: 0x8BB6,\n\t23289 - 11905: 0x8BB7,\n\t23290 - 11905: 0x8BB8,\n\t23291 - 11905: 0x8BB9,\n\t23292 - 11905: 0x8BBA,\n\t23293 - 11905: 0x8BBB,\n\t23294 - 11905: 0x8BBC,\n\t23295 - 11905: 0x8BBD,\n\t23296 - 11905: 0x8BBE,\n\t23297 - 11905: 0x8BBF,\n\t23298 - 11905: 0x8BC0,\n\t23299 - 11905: 0x8BC1,\n\t23300 - 11905: 0x8BC2,\n\t23301 - 11905: 0x8BC3,\n\t23302 - 11905: 0x8BC4,\n\t23303 - 11905: 0x8BC5,\n\t23304 - 11905: 0x8BC6,\n\t23305 - 11905: 0xE6D2,\n\t23306 - 11905: 0x8BC7,\n\t23307 - 11905: 0x8BC8,\n\t23308 - 11905: 0x8BC9,\n\t23309 - 11905: 0x8BCA,\n\t23310 - 11905: 0x8BCB,\n\t23311 - 11905: 0x8BCC,\n\t23312 - 11905: 0x8BCD,\n\t23313 - 11905: 0x8BCE,\n\t23314 - 11905: 0x8BCF,\n\t23315 - 11905: 0x8BD0,\n\t23316 - 11905: 0x8BD1,\n\t23317 - 11905: 0x8BD2,\n\t23318 - 11905: 0xE6D4,\n\t23319 - 11905: 0xE6D3,\n\t23320 - 11905: 0x8BD3,\n\t23321 - 11905: 0x8BD4,\n\t23322 - 11905: 0x8BD5,\n\t23323 - 11905: 0x8BD6,\n\t23324 - 11905: 0x8BD7,\n\t23325 - 11905: 0x8BD8,\n\t23326 - 11905: 0x8BD9,\n\t23327 - 11905: 0x8BDA,\n\t23328 - 11905: 0x8BDB,\n\t23329 - 11905: 0x8BDC,\n\t23330 - 11905: 0x8BDD,\n\t23331 - 11905: 0x8BDE,\n\t23332 - 11905: 0x8BDF,\n\t23333 - 11905: 0x8BE0,\n\t23334 - 11905: 0x8BE1,\n\t23335 - 11905: 0x8BE2,\n\t23336 - 11905: 0x8BE3,\n\t23337 - 11905: 0x8BE4,\n\t23338 - 11905: 0x8BE5,\n\t23339 - 11905: 0x8BE6,\n\t23340 - 11905: 0x8BE7,\n\t23341 - 11905: 0x8BE8,\n\t23342 - 11905: 0x8BE9,\n\t23343 - 11905: 0x8BEA,\n\t23344 - 11905: 0x8BEB,\n\t23345 - 11905: 0x8BEC,\n\t23346 - 11905: 0xE6D5,\n\t23347 - 11905: 0x8BED,\n\t23348 - 11905: 0xD9F8,\n\t23349 - 11905: 0x8BEE,\n\t23350 - 11905: 0x8BEF,\n\t23351 - 11905: 0xE6D6,\n\t23352 - 11905: 0x8BF0,\n\t23353 - 11905: 0x8BF1,\n\t23354 - 11905: 0x8BF2,\n\t23355 - 11905: 0x8BF3,\n\t23356 - 11905: 0x8BF4,\n\t23357 - 11905: 0x8BF5,\n\t23358 - 11905: 0x8BF6,\n\t23359 - 11905: 0x8BF7,\n\t23360 - 11905: 0xE6D7,\n\t23361 - 11905: 0x8BF8,\n\t23362 - 11905: 0x8BF9,\n\t23363 - 11905: 0x8BFA,\n\t23364 - 11905: 0x8BFB,\n\t23365 - 11905: 0x8BFC,\n\t23366 - 11905: 0x8BFD,\n\t23367 - 11905: 0x8BFE,\n\t23368 - 11905: 0x8C40,\n\t23369 - 11905: 0x8C41,\n\t23370 - 11905: 0x8C42,\n\t23371 - 11905: 0x8C43,\n\t23372 - 11905: 0x8C44,\n\t23373 - 11905: 0x8C45,\n\t23374 - 11905: 0x8C46,\n\t23375 - 11905: 0x8C47,\n\t23376 - 11905: 0xD7D3,\n\t23377 - 11905: 0xE6DD,\n\t23378 - 11905: 0x8C48,\n\t23379 - 11905: 0xE6DE,\n\t23380 - 11905: 0xBFD7,\n\t23381 - 11905: 0xD4D0,\n\t23382 - 11905: 0x8C49,\n\t23383 - 11905: 0xD7D6,\n\t23384 - 11905: 0xB4E6,\n\t23385 - 11905: 0xCBEF,\n\t23386 - 11905: 0xE6DA,\n\t23387 - 11905: 0xD8C3,\n\t23388 - 11905: 0xD7CE,\n\t23389 - 11905: 0xD0A2,\n\t23390 - 11905: 0x8C4A,\n\t23391 - 11905: 0xC3CF,\n\t23392 - 11905: 0x8C4B,\n\t23393 - 11905: 0x8C4C,\n\t23394 - 11905: 0xE6DF,\n\t23395 - 11905: 0xBCBE,\n\t23396 - 11905: 0xB9C2,\n\t23397 - 11905: 0xE6DB,\n\t23398 - 11905: 0xD1A7,\n\t23399 - 11905: 0x8C4D,\n\t23400 - 11905: 0x8C4E,\n\t23401 - 11905: 0xBAA2,\n\t23402 - 11905: 0xC2CF,\n\t23403 - 11905: 0x8C4F,\n\t23404 - 11905: 0xD8AB,\n\t23405 - 11905: 0x8C50,\n\t23406 - 11905: 0x8C51,\n\t23407 - 11905: 0x8C52,\n\t23408 - 11905: 0xCAEB,\n\t23409 - 11905: 0xE5EE,\n\t23410 - 11905: 0x8C53,\n\t23411 - 11905: 0xE6DC,\n\t23412 - 11905: 0x8C54,\n\t23413 - 11905: 0xB7F5,\n\t23414 - 11905: 0x8C55,\n\t23415 - 11905: 0x8C56,\n\t23416 - 11905: 0x8C57,\n\t23417 - 11905: 0x8C58,\n\t23418 - 11905: 0xC8E6,\n\t23419 - 11905: 0x8C59,\n\t23420 - 11905: 0x8C5A,\n\t23421 - 11905: 0xC4F5,\n\t23422 - 11905: 0x8C5B,\n\t23423 - 11905: 0x8C5C,\n\t23424 - 11905: 0xE5B2,\n\t23425 - 11905: 0xC4FE,\n\t23426 - 11905: 0x8C5D,\n\t23427 - 11905: 0xCBFC,\n\t23428 - 11905: 0xE5B3,\n\t23429 - 11905: 0xD5AC,\n\t23430 - 11905: 0x8C5E,\n\t23431 - 11905: 0xD3EE,\n\t23432 - 11905: 0xCAD8,\n\t23433 - 11905: 0xB0B2,\n\t23434 - 11905: 0x8C5F,\n\t23435 - 11905: 0xCBCE,\n\t23436 - 11905: 0xCDEA,\n\t23437 - 11905: 0x8C60,\n\t23438 - 11905: 0x8C61,\n\t23439 - 11905: 0xBAEA,\n\t23440 - 11905: 0x8C62,\n\t23441 - 11905: 0x8C63,\n\t23442 - 11905: 0x8C64,\n\t23443 - 11905: 0xE5B5,\n\t23444 - 11905: 0x8C65,\n\t23445 - 11905: 0xE5B4,\n\t23446 - 11905: 0x8C66,\n\t23447 - 11905: 0xD7DA,\n\t23448 - 11905: 0xB9D9,\n\t23449 - 11905: 0xD6E6,\n\t23450 - 11905: 0xB6A8,\n\t23451 - 11905: 0xCDF0,\n\t23452 - 11905: 0xD2CB,\n\t23453 - 11905: 0xB1A6,\n\t23454 - 11905: 0xCAB5,\n\t23455 - 11905: 0x8C67,\n\t23456 - 11905: 0xB3E8,\n\t23457 - 11905: 0xC9F3,\n\t23458 - 11905: 0xBFCD,\n\t23459 - 11905: 0xD0FB,\n\t23460 - 11905: 0xCAD2,\n\t23461 - 11905: 0xE5B6,\n\t23462 - 11905: 0xBBC2,\n\t23463 - 11905: 0x8C68,\n\t23464 - 11905: 0x8C69,\n\t23465 - 11905: 0x8C6A,\n\t23466 - 11905: 0xCFDC,\n\t23467 - 11905: 0xB9AC,\n\t23468 - 11905: 0x8C6B,\n\t23469 - 11905: 0x8C6C,\n\t23470 - 11905: 0x8C6D,\n\t23471 - 11905: 0x8C6E,\n\t23472 - 11905: 0xD4D7,\n\t23473 - 11905: 0x8C6F,\n\t23474 - 11905: 0x8C70,\n\t23475 - 11905: 0xBAA6,\n\t23476 - 11905: 0xD1E7,\n\t23477 - 11905: 0xCFFC,\n\t23478 - 11905: 0xBCD2,\n\t23479 - 11905: 0x8C71,\n\t23480 - 11905: 0xE5B7,\n\t23481 - 11905: 0xC8DD,\n\t23482 - 11905: 0x8C72,\n\t23483 - 11905: 0x8C73,\n\t23484 - 11905: 0x8C74,\n\t23485 - 11905: 0xBFED,\n\t23486 - 11905: 0xB1F6,\n\t23487 - 11905: 0xCBDE,\n\t23488 - 11905: 0x8C75,\n\t23489 - 11905: 0x8C76,\n\t23490 - 11905: 0xBCC5,\n\t23491 - 11905: 0x8C77,\n\t23492 - 11905: 0xBCC4,\n\t23493 - 11905: 0xD2FA,\n\t23494 - 11905: 0xC3DC,\n\t23495 - 11905: 0xBFDC,\n\t23496 - 11905: 0x8C78,\n\t23497 - 11905: 0x8C79,\n\t23498 - 11905: 0x8C7A,\n\t23499 - 11905: 0x8C7B,\n\t23500 - 11905: 0xB8BB,\n\t23501 - 11905: 0x8C7C,\n\t23502 - 11905: 0x8C7D,\n\t23503 - 11905: 0x8C7E,\n\t23504 - 11905: 0xC3C2,\n\t23505 - 11905: 0x8C80,\n\t23506 - 11905: 0xBAAE,\n\t23507 - 11905: 0xD4A2,\n\t23508 - 11905: 0x8C81,\n\t23509 - 11905: 0x8C82,\n\t23510 - 11905: 0x8C83,\n\t23511 - 11905: 0x8C84,\n\t23512 - 11905: 0x8C85,\n\t23513 - 11905: 0x8C86,\n\t23514 - 11905: 0x8C87,\n\t23515 - 11905: 0x8C88,\n\t23516 - 11905: 0x8C89,\n\t23517 - 11905: 0xC7DE,\n\t23518 - 11905: 0xC4AF,\n\t23519 - 11905: 0xB2EC,\n\t23520 - 11905: 0x8C8A,\n\t23521 - 11905: 0xB9D1,\n\t23522 - 11905: 0x8C8B,\n\t23523 - 11905: 0x8C8C,\n\t23524 - 11905: 0xE5BB,\n\t23525 - 11905: 0xC1C8,\n\t23526 - 11905: 0x8C8D,\n\t23527 - 11905: 0x8C8E,\n\t23528 - 11905: 0xD5AF,\n\t23529 - 11905: 0x8C8F,\n\t23530 - 11905: 0x8C90,\n\t23531 - 11905: 0x8C91,\n\t23532 - 11905: 0x8C92,\n\t23533 - 11905: 0x8C93,\n\t23534 - 11905: 0xE5BC,\n\t23535 - 11905: 0x8C94,\n\t23536 - 11905: 0xE5BE,\n\t23537 - 11905: 0x8C95,\n\t23538 - 11905: 0x8C96,\n\t23539 - 11905: 0x8C97,\n\t23540 - 11905: 0x8C98,\n\t23541 - 11905: 0x8C99,\n\t23542 - 11905: 0x8C9A,\n\t23543 - 11905: 0x8C9B,\n\t23544 - 11905: 0xB4E7,\n\t23545 - 11905: 0xB6D4,\n\t23546 - 11905: 0xCBC2,\n\t23547 - 11905: 0xD1B0,\n\t23548 - 11905: 0xB5BC,\n\t23549 - 11905: 0x8C9C,\n\t23550 - 11905: 0x8C9D,\n\t23551 - 11905: 0xCAD9,\n\t23552 - 11905: 0x8C9E,\n\t23553 - 11905: 0xB7E2,\n\t23554 - 11905: 0x8C9F,\n\t23555 - 11905: 0x8CA0,\n\t23556 - 11905: 0xC9E4,\n\t23557 - 11905: 0x8CA1,\n\t23558 - 11905: 0xBDAB,\n\t23559 - 11905: 0x8CA2,\n\t23560 - 11905: 0x8CA3,\n\t23561 - 11905: 0xCEBE,\n\t23562 - 11905: 0xD7F0,\n\t23563 - 11905: 0x8CA4,\n\t23564 - 11905: 0x8CA5,\n\t23565 - 11905: 0x8CA6,\n\t23566 - 11905: 0x8CA7,\n\t23567 - 11905: 0xD0A1,\n\t23568 - 11905: 0x8CA8,\n\t23569 - 11905: 0xC9D9,\n\t23570 - 11905: 0x8CA9,\n\t23571 - 11905: 0x8CAA,\n\t23572 - 11905: 0xB6FB,\n\t23573 - 11905: 0xE6D8,\n\t23574 - 11905: 0xBCE2,\n\t23575 - 11905: 0x8CAB,\n\t23576 - 11905: 0xB3BE,\n\t23577 - 11905: 0x8CAC,\n\t23578 - 11905: 0xC9D0,\n\t23579 - 11905: 0x8CAD,\n\t23580 - 11905: 0xE6D9,\n\t23581 - 11905: 0xB3A2,\n\t23582 - 11905: 0x8CAE,\n\t23583 - 11905: 0x8CAF,\n\t23584 - 11905: 0x8CB0,\n\t23585 - 11905: 0x8CB1,\n\t23586 - 11905: 0xDECC,\n\t23587 - 11905: 0x8CB2,\n\t23588 - 11905: 0xD3C8,\n\t23589 - 11905: 0xDECD,\n\t23590 - 11905: 0x8CB3,\n\t23591 - 11905: 0xD2A2,\n\t23592 - 11905: 0x8CB4,\n\t23593 - 11905: 0x8CB5,\n\t23594 - 11905: 0x8CB6,\n\t23595 - 11905: 0x8CB7,\n\t23596 - 11905: 0xDECE,\n\t23597 - 11905: 0x8CB8,\n\t23598 - 11905: 0x8CB9,\n\t23599 - 11905: 0x8CBA,\n\t23600 - 11905: 0x8CBB,\n\t23601 - 11905: 0xBECD,\n\t23602 - 11905: 0x8CBC,\n\t23603 - 11905: 0x8CBD,\n\t23604 - 11905: 0xDECF,\n\t23605 - 11905: 0x8CBE,\n\t23606 - 11905: 0x8CBF,\n\t23607 - 11905: 0x8CC0,\n\t23608 - 11905: 0xCAAC,\n\t23609 - 11905: 0xD2FC,\n\t23610 - 11905: 0xB3DF,\n\t23611 - 11905: 0xE5EA,\n\t23612 - 11905: 0xC4E1,\n\t23613 - 11905: 0xBEA1,\n\t23614 - 11905: 0xCEB2,\n\t23615 - 11905: 0xC4F2,\n\t23616 - 11905: 0xBED6,\n\t23617 - 11905: 0xC6A8,\n\t23618 - 11905: 0xB2E3,\n\t23619 - 11905: 0x8CC1,\n\t23620 - 11905: 0x8CC2,\n\t23621 - 11905: 0xBED3,\n\t23622 - 11905: 0x8CC3,\n\t23623 - 11905: 0x8CC4,\n\t23624 - 11905: 0xC7FC,\n\t23625 - 11905: 0xCCEB,\n\t23626 - 11905: 0xBDEC,\n\t23627 - 11905: 0xCEDD,\n\t23628 - 11905: 0x8CC5,\n\t23629 - 11905: 0x8CC6,\n\t23630 - 11905: 0xCABA,\n\t23631 - 11905: 0xC6C1,\n\t23632 - 11905: 0xE5EC,\n\t23633 - 11905: 0xD0BC,\n\t23634 - 11905: 0x8CC7,\n\t23635 - 11905: 0x8CC8,\n\t23636 - 11905: 0x8CC9,\n\t23637 - 11905: 0xD5B9,\n\t23638 - 11905: 0x8CCA,\n\t23639 - 11905: 0x8CCB,\n\t23640 - 11905: 0x8CCC,\n\t23641 - 11905: 0xE5ED,\n\t23642 - 11905: 0x8CCD,\n\t23643 - 11905: 0x8CCE,\n\t23644 - 11905: 0x8CCF,\n\t23645 - 11905: 0x8CD0,\n\t23646 - 11905: 0xCAF4,\n\t23647 - 11905: 0x8CD1,\n\t23648 - 11905: 0xCDC0,\n\t23649 - 11905: 0xC2C5,\n\t23650 - 11905: 0x8CD2,\n\t23651 - 11905: 0xE5EF,\n\t23652 - 11905: 0x8CD3,\n\t23653 - 11905: 0xC2C4,\n\t23654 - 11905: 0xE5F0,\n\t23655 - 11905: 0x8CD4,\n\t23656 - 11905: 0x8CD5,\n\t23657 - 11905: 0x8CD6,\n\t23658 - 11905: 0x8CD7,\n\t23659 - 11905: 0x8CD8,\n\t23660 - 11905: 0x8CD9,\n\t23661 - 11905: 0x8CDA,\n\t23662 - 11905: 0xE5F8,\n\t23663 - 11905: 0xCDCD,\n\t23664 - 11905: 0x8CDB,\n\t23665 - 11905: 0xC9BD,\n\t23666 - 11905: 0x8CDC,\n\t23667 - 11905: 0x8CDD,\n\t23668 - 11905: 0x8CDE,\n\t23669 - 11905: 0x8CDF,\n\t23670 - 11905: 0x8CE0,\n\t23671 - 11905: 0x8CE1,\n\t23672 - 11905: 0x8CE2,\n\t23673 - 11905: 0xD2D9,\n\t23674 - 11905: 0xE1A8,\n\t23675 - 11905: 0x8CE3,\n\t23676 - 11905: 0x8CE4,\n\t23677 - 11905: 0x8CE5,\n\t23678 - 11905: 0x8CE6,\n\t23679 - 11905: 0xD3EC,\n\t23680 - 11905: 0x8CE7,\n\t23681 - 11905: 0xCBEA,\n\t23682 - 11905: 0xC6F1,\n\t23683 - 11905: 0x8CE8,\n\t23684 - 11905: 0x8CE9,\n\t23685 - 11905: 0x8CEA,\n\t23686 - 11905: 0x8CEB,\n\t23687 - 11905: 0x8CEC,\n\t23688 - 11905: 0xE1AC,\n\t23689 - 11905: 0x8CED,\n\t23690 - 11905: 0x8CEE,\n\t23691 - 11905: 0x8CEF,\n\t23692 - 11905: 0xE1A7,\n\t23693 - 11905: 0xE1A9,\n\t23694 - 11905: 0x8CF0,\n\t23695 - 11905: 0x8CF1,\n\t23696 - 11905: 0xE1AA,\n\t23697 - 11905: 0xE1AF,\n\t23698 - 11905: 0x8CF2,\n\t23699 - 11905: 0x8CF3,\n\t23700 - 11905: 0xB2ED,\n\t23701 - 11905: 0x8CF4,\n\t23702 - 11905: 0xE1AB,\n\t23703 - 11905: 0xB8DA,\n\t23704 - 11905: 0xE1AD,\n\t23705 - 11905: 0xE1AE,\n\t23706 - 11905: 0xE1B0,\n\t23707 - 11905: 0xB5BA,\n\t23708 - 11905: 0xE1B1,\n\t23709 - 11905: 0x8CF5,\n\t23710 - 11905: 0x8CF6,\n\t23711 - 11905: 0x8CF7,\n\t23712 - 11905: 0x8CF8,\n\t23713 - 11905: 0x8CF9,\n\t23714 - 11905: 0xE1B3,\n\t23715 - 11905: 0xE1B8,\n\t23716 - 11905: 0x8CFA,\n\t23717 - 11905: 0x8CFB,\n\t23718 - 11905: 0x8CFC,\n\t23719 - 11905: 0x8CFD,\n\t23720 - 11905: 0x8CFE,\n\t23721 - 11905: 0xD1D2,\n\t23722 - 11905: 0x8D40,\n\t23723 - 11905: 0xE1B6,\n\t23724 - 11905: 0xE1B5,\n\t23725 - 11905: 0xC1EB,\n\t23726 - 11905: 0x8D41,\n\t23727 - 11905: 0x8D42,\n\t23728 - 11905: 0x8D43,\n\t23729 - 11905: 0xE1B7,\n\t23730 - 11905: 0x8D44,\n\t23731 - 11905: 0xD4C0,\n\t23732 - 11905: 0x8D45,\n\t23733 - 11905: 0xE1B2,\n\t23734 - 11905: 0x8D46,\n\t23735 - 11905: 0xE1BA,\n\t23736 - 11905: 0xB0B6,\n\t23737 - 11905: 0x8D47,\n\t23738 - 11905: 0x8D48,\n\t23739 - 11905: 0x8D49,\n\t23740 - 11905: 0x8D4A,\n\t23741 - 11905: 0xE1B4,\n\t23742 - 11905: 0x8D4B,\n\t23743 - 11905: 0xBFF9,\n\t23744 - 11905: 0x8D4C,\n\t23745 - 11905: 0xE1B9,\n\t23746 - 11905: 0x8D4D,\n\t23747 - 11905: 0x8D4E,\n\t23748 - 11905: 0xE1BB,\n\t23749 - 11905: 0x8D4F,\n\t23750 - 11905: 0x8D50,\n\t23751 - 11905: 0x8D51,\n\t23752 - 11905: 0x8D52,\n\t23753 - 11905: 0x8D53,\n\t23754 - 11905: 0x8D54,\n\t23755 - 11905: 0xE1BE,\n\t23756 - 11905: 0x8D55,\n\t23757 - 11905: 0x8D56,\n\t23758 - 11905: 0x8D57,\n\t23759 - 11905: 0x8D58,\n\t23760 - 11905: 0x8D59,\n\t23761 - 11905: 0x8D5A,\n\t23762 - 11905: 0xE1BC,\n\t23763 - 11905: 0x8D5B,\n\t23764 - 11905: 0x8D5C,\n\t23765 - 11905: 0x8D5D,\n\t23766 - 11905: 0x8D5E,\n\t23767 - 11905: 0x8D5F,\n\t23768 - 11905: 0x8D60,\n\t23769 - 11905: 0xD6C5,\n\t23770 - 11905: 0x8D61,\n\t23771 - 11905: 0x8D62,\n\t23772 - 11905: 0x8D63,\n\t23773 - 11905: 0x8D64,\n\t23774 - 11905: 0x8D65,\n\t23775 - 11905: 0x8D66,\n\t23776 - 11905: 0x8D67,\n\t23777 - 11905: 0xCFBF,\n\t23778 - 11905: 0x8D68,\n\t23779 - 11905: 0x8D69,\n\t23780 - 11905: 0xE1BD,\n\t23781 - 11905: 0xE1BF,\n\t23782 - 11905: 0xC2CD,\n\t23783 - 11905: 0x8D6A,\n\t23784 - 11905: 0xB6EB,\n\t23785 - 11905: 0x8D6B,\n\t23786 - 11905: 0xD3F8,\n\t23787 - 11905: 0x8D6C,\n\t23788 - 11905: 0x8D6D,\n\t23789 - 11905: 0xC7CD,\n\t23790 - 11905: 0x8D6E,\n\t23791 - 11905: 0x8D6F,\n\t23792 - 11905: 0xB7E5,\n\t23793 - 11905: 0x8D70,\n\t23794 - 11905: 0x8D71,\n\t23795 - 11905: 0x8D72,\n\t23796 - 11905: 0x8D73,\n\t23797 - 11905: 0x8D74,\n\t23798 - 11905: 0x8D75,\n\t23799 - 11905: 0x8D76,\n\t23800 - 11905: 0x8D77,\n\t23801 - 11905: 0x8D78,\n\t23802 - 11905: 0x8D79,\n\t23803 - 11905: 0xBEFE,\n\t23804 - 11905: 0x8D7A,\n\t23805 - 11905: 0x8D7B,\n\t23806 - 11905: 0x8D7C,\n\t23807 - 11905: 0x8D7D,\n\t23808 - 11905: 0x8D7E,\n\t23809 - 11905: 0x8D80,\n\t23810 - 11905: 0xE1C0,\n\t23811 - 11905: 0xE1C1,\n\t23812 - 11905: 0x8D81,\n\t23813 - 11905: 0x8D82,\n\t23814 - 11905: 0xE1C7,\n\t23815 - 11905: 0xB3E7,\n\t23816 - 11905: 0x8D83,\n\t23817 - 11905: 0x8D84,\n\t23818 - 11905: 0x8D85,\n\t23819 - 11905: 0x8D86,\n\t23820 - 11905: 0x8D87,\n\t23821 - 11905: 0x8D88,\n\t23822 - 11905: 0xC6E9,\n\t23823 - 11905: 0x8D89,\n\t23824 - 11905: 0x8D8A,\n\t23825 - 11905: 0x8D8B,\n\t23826 - 11905: 0x8D8C,\n\t23827 - 11905: 0x8D8D,\n\t23828 - 11905: 0xB4DE,\n\t23829 - 11905: 0x8D8E,\n\t23830 - 11905: 0xD1C2,\n\t23831 - 11905: 0x8D8F,\n\t23832 - 11905: 0x8D90,\n\t23833 - 11905: 0x8D91,\n\t23834 - 11905: 0x8D92,\n\t23835 - 11905: 0xE1C8,\n\t23836 - 11905: 0x8D93,\n\t23837 - 11905: 0x8D94,\n\t23838 - 11905: 0xE1C6,\n\t23839 - 11905: 0x8D95,\n\t23840 - 11905: 0x8D96,\n\t23841 - 11905: 0x8D97,\n\t23842 - 11905: 0x8D98,\n\t23843 - 11905: 0x8D99,\n\t23844 - 11905: 0xE1C5,\n\t23845 - 11905: 0x8D9A,\n\t23846 - 11905: 0xE1C3,\n\t23847 - 11905: 0xE1C2,\n\t23848 - 11905: 0x8D9B,\n\t23849 - 11905: 0xB1C0,\n\t23850 - 11905: 0x8D9C,\n\t23851 - 11905: 0x8D9D,\n\t23852 - 11905: 0x8D9E,\n\t23853 - 11905: 0xD5B8,\n\t23854 - 11905: 0xE1C4,\n\t23855 - 11905: 0x8D9F,\n\t23856 - 11905: 0x8DA0,\n\t23857 - 11905: 0x8DA1,\n\t23858 - 11905: 0x8DA2,\n\t23859 - 11905: 0x8DA3,\n\t23860 - 11905: 0xE1CB,\n\t23861 - 11905: 0x8DA4,\n\t23862 - 11905: 0x8DA5,\n\t23863 - 11905: 0x8DA6,\n\t23864 - 11905: 0x8DA7,\n\t23865 - 11905: 0x8DA8,\n\t23866 - 11905: 0x8DA9,\n\t23867 - 11905: 0x8DAA,\n\t23868 - 11905: 0x8DAB,\n\t23869 - 11905: 0xE1CC,\n\t23870 - 11905: 0xE1CA,\n\t23871 - 11905: 0x8DAC,\n\t23872 - 11905: 0x8DAD,\n\t23873 - 11905: 0x8DAE,\n\t23874 - 11905: 0x8DAF,\n\t23875 - 11905: 0x8DB0,\n\t23876 - 11905: 0x8DB1,\n\t23877 - 11905: 0x8DB2,\n\t23878 - 11905: 0x8DB3,\n\t23879 - 11905: 0xEFFA,\n\t23880 - 11905: 0x8DB4,\n\t23881 - 11905: 0x8DB5,\n\t23882 - 11905: 0xE1D3,\n\t23883 - 11905: 0xE1D2,\n\t23884 - 11905: 0xC7B6,\n\t23885 - 11905: 0x8DB6,\n\t23886 - 11905: 0x8DB7,\n\t23887 - 11905: 0x8DB8,\n\t23888 - 11905: 0x8DB9,\n\t23889 - 11905: 0x8DBA,\n\t23890 - 11905: 0x8DBB,\n\t23891 - 11905: 0x8DBC,\n\t23892 - 11905: 0x8DBD,\n\t23893 - 11905: 0x8DBE,\n\t23894 - 11905: 0x8DBF,\n\t23895 - 11905: 0x8DC0,\n\t23896 - 11905: 0xE1C9,\n\t23897 - 11905: 0x8DC1,\n\t23898 - 11905: 0x8DC2,\n\t23899 - 11905: 0xE1CE,\n\t23900 - 11905: 0x8DC3,\n\t23901 - 11905: 0xE1D0,\n\t23902 - 11905: 0x8DC4,\n\t23903 - 11905: 0x8DC5,\n\t23904 - 11905: 0x8DC6,\n\t23905 - 11905: 0x8DC7,\n\t23906 - 11905: 0x8DC8,\n\t23907 - 11905: 0x8DC9,\n\t23908 - 11905: 0x8DCA,\n\t23909 - 11905: 0x8DCB,\n\t23910 - 11905: 0x8DCC,\n\t23911 - 11905: 0x8DCD,\n\t23912 - 11905: 0x8DCE,\n\t23913 - 11905: 0xE1D4,\n\t23914 - 11905: 0x8DCF,\n\t23915 - 11905: 0xE1D1,\n\t23916 - 11905: 0xE1CD,\n\t23917 - 11905: 0x8DD0,\n\t23918 - 11905: 0x8DD1,\n\t23919 - 11905: 0xE1CF,\n\t23920 - 11905: 0x8DD2,\n\t23921 - 11905: 0x8DD3,\n\t23922 - 11905: 0x8DD4,\n\t23923 - 11905: 0x8DD5,\n\t23924 - 11905: 0xE1D5,\n\t23925 - 11905: 0x8DD6,\n\t23926 - 11905: 0x8DD7,\n\t23927 - 11905: 0x8DD8,\n\t23928 - 11905: 0x8DD9,\n\t23929 - 11905: 0x8DDA,\n\t23930 - 11905: 0x8DDB,\n\t23931 - 11905: 0x8DDC,\n\t23932 - 11905: 0x8DDD,\n\t23933 - 11905: 0x8DDE,\n\t23934 - 11905: 0x8DDF,\n\t23935 - 11905: 0x8DE0,\n\t23936 - 11905: 0x8DE1,\n\t23937 - 11905: 0x8DE2,\n\t23938 - 11905: 0xE1D6,\n\t23939 - 11905: 0x8DE3,\n\t23940 - 11905: 0x8DE4,\n\t23941 - 11905: 0x8DE5,\n\t23942 - 11905: 0x8DE6,\n\t23943 - 11905: 0x8DE7,\n\t23944 - 11905: 0x8DE8,\n\t23945 - 11905: 0x8DE9,\n\t23946 - 11905: 0x8DEA,\n\t23947 - 11905: 0x8DEB,\n\t23948 - 11905: 0x8DEC,\n\t23949 - 11905: 0x8DED,\n\t23950 - 11905: 0x8DEE,\n\t23951 - 11905: 0x8DEF,\n\t23952 - 11905: 0x8DF0,\n\t23953 - 11905: 0x8DF1,\n\t23954 - 11905: 0x8DF2,\n\t23955 - 11905: 0x8DF3,\n\t23956 - 11905: 0x8DF4,\n\t23957 - 11905: 0x8DF5,\n\t23958 - 11905: 0x8DF6,\n\t23959 - 11905: 0x8DF7,\n\t23960 - 11905: 0x8DF8,\n\t23961 - 11905: 0xE1D7,\n\t23962 - 11905: 0x8DF9,\n\t23963 - 11905: 0x8DFA,\n\t23964 - 11905: 0x8DFB,\n\t23965 - 11905: 0xE1D8,\n\t23966 - 11905: 0x8DFC,\n\t23967 - 11905: 0x8DFD,\n\t23968 - 11905: 0x8DFE,\n\t23969 - 11905: 0x8E40,\n\t23970 - 11905: 0x8E41,\n\t23971 - 11905: 0x8E42,\n\t23972 - 11905: 0x8E43,\n\t23973 - 11905: 0x8E44,\n\t23974 - 11905: 0x8E45,\n\t23975 - 11905: 0x8E46,\n\t23976 - 11905: 0x8E47,\n\t23977 - 11905: 0x8E48,\n\t23978 - 11905: 0x8E49,\n\t23979 - 11905: 0x8E4A,\n\t23980 - 11905: 0x8E4B,\n\t23981 - 11905: 0x8E4C,\n\t23982 - 11905: 0x8E4D,\n\t23983 - 11905: 0x8E4E,\n\t23984 - 11905: 0x8E4F,\n\t23985 - 11905: 0x8E50,\n\t23986 - 11905: 0x8E51,\n\t23987 - 11905: 0x8E52,\n\t23988 - 11905: 0x8E53,\n\t23989 - 11905: 0x8E54,\n\t23990 - 11905: 0x8E55,\n\t23991 - 11905: 0xE1DA,\n\t23992 - 11905: 0x8E56,\n\t23993 - 11905: 0x8E57,\n\t23994 - 11905: 0x8E58,\n\t23995 - 11905: 0x8E59,\n\t23996 - 11905: 0x8E5A,\n\t23997 - 11905: 0x8E5B,\n\t23998 - 11905: 0x8E5C,\n\t23999 - 11905: 0x8E5D,\n\t24000 - 11905: 0x8E5E,\n\t24001 - 11905: 0x8E5F,\n\t24002 - 11905: 0x8E60,\n\t24003 - 11905: 0x8E61,\n\t24004 - 11905: 0x8E62,\n\t24005 - 11905: 0xE1DB,\n\t24006 - 11905: 0x8E63,\n\t24007 - 11905: 0x8E64,\n\t24008 - 11905: 0x8E65,\n\t24009 - 11905: 0x8E66,\n\t24010 - 11905: 0x8E67,\n\t24011 - 11905: 0x8E68,\n\t24012 - 11905: 0x8E69,\n\t24013 - 11905: 0xCEA1,\n\t24014 - 11905: 0x8E6A,\n\t24015 - 11905: 0x8E6B,\n\t24016 - 11905: 0x8E6C,\n\t24017 - 11905: 0x8E6D,\n\t24018 - 11905: 0x8E6E,\n\t24019 - 11905: 0x8E6F,\n\t24020 - 11905: 0x8E70,\n\t24021 - 11905: 0x8E71,\n\t24022 - 11905: 0x8E72,\n\t24023 - 11905: 0x8E73,\n\t24024 - 11905: 0x8E74,\n\t24025 - 11905: 0x8E75,\n\t24026 - 11905: 0x8E76,\n\t24027 - 11905: 0xE7DD,\n\t24028 - 11905: 0x8E77,\n\t24029 - 11905: 0xB4A8,\n\t24030 - 11905: 0xD6DD,\n\t24031 - 11905: 0x8E78,\n\t24032 - 11905: 0x8E79,\n\t24033 - 11905: 0xD1B2,\n\t24034 - 11905: 0xB3B2,\n\t24035 - 11905: 0x8E7A,\n\t24036 - 11905: 0x8E7B,\n\t24037 - 11905: 0xB9A4,\n\t24038 - 11905: 0xD7F3,\n\t24039 - 11905: 0xC7C9,\n\t24040 - 11905: 0xBEDE,\n\t24041 - 11905: 0xB9AE,\n\t24042 - 11905: 0x8E7C,\n\t24043 - 11905: 0xCED7,\n\t24044 - 11905: 0x8E7D,\n\t24045 - 11905: 0x8E7E,\n\t24046 - 11905: 0xB2EE,\n\t24047 - 11905: 0xDBCF,\n\t24048 - 11905: 0x8E80,\n\t24049 - 11905: 0xBCBA,\n\t24050 - 11905: 0xD2D1,\n\t24051 - 11905: 0xCBC8,\n\t24052 - 11905: 0xB0CD,\n\t24053 - 11905: 0x8E81,\n\t24054 - 11905: 0x8E82,\n\t24055 - 11905: 0xCFEF,\n\t24056 - 11905: 0x8E83,\n\t24057 - 11905: 0x8E84,\n\t24058 - 11905: 0x8E85,\n\t24059 - 11905: 0x8E86,\n\t24060 - 11905: 0x8E87,\n\t24061 - 11905: 0xD9E3,\n\t24062 - 11905: 0xBDED,\n\t24063 - 11905: 0x8E88,\n\t24064 - 11905: 0x8E89,\n\t24065 - 11905: 0xB1D2,\n\t24066 - 11905: 0xCAD0,\n\t24067 - 11905: 0xB2BC,\n\t24068 - 11905: 0x8E8A,\n\t24069 - 11905: 0xCBA7,\n\t24070 - 11905: 0xB7AB,\n\t24071 - 11905: 0x8E8B,\n\t24072 - 11905: 0xCAA6,\n\t24073 - 11905: 0x8E8C,\n\t24074 - 11905: 0x8E8D,\n\t24075 - 11905: 0x8E8E,\n\t24076 - 11905: 0xCFA3,\n\t24077 - 11905: 0x8E8F,\n\t24078 - 11905: 0x8E90,\n\t24079 - 11905: 0xE0F8,\n\t24080 - 11905: 0xD5CA,\n\t24081 - 11905: 0xE0FB,\n\t24082 - 11905: 0x8E91,\n\t24083 - 11905: 0x8E92,\n\t24084 - 11905: 0xE0FA,\n\t24085 - 11905: 0xC5C1,\n\t24086 - 11905: 0xCCFB,\n\t24087 - 11905: 0x8E93,\n\t24088 - 11905: 0xC1B1,\n\t24089 - 11905: 0xE0F9,\n\t24090 - 11905: 0xD6E3,\n\t24091 - 11905: 0xB2AF,\n\t24092 - 11905: 0xD6C4,\n\t24093 - 11905: 0xB5DB,\n\t24094 - 11905: 0x8E94,\n\t24095 - 11905: 0x8E95,\n\t24096 - 11905: 0x8E96,\n\t24097 - 11905: 0x8E97,\n\t24098 - 11905: 0x8E98,\n\t24099 - 11905: 0x8E99,\n\t24100 - 11905: 0x8E9A,\n\t24101 - 11905: 0x8E9B,\n\t24102 - 11905: 0xB4F8,\n\t24103 - 11905: 0xD6A1,\n\t24104 - 11905: 0x8E9C,\n\t24105 - 11905: 0x8E9D,\n\t24106 - 11905: 0x8E9E,\n\t24107 - 11905: 0x8E9F,\n\t24108 - 11905: 0x8EA0,\n\t24109 - 11905: 0xCFAF,\n\t24110 - 11905: 0xB0EF,\n\t24111 - 11905: 0x8EA1,\n\t24112 - 11905: 0x8EA2,\n\t24113 - 11905: 0xE0FC,\n\t24114 - 11905: 0x8EA3,\n\t24115 - 11905: 0x8EA4,\n\t24116 - 11905: 0x8EA5,\n\t24117 - 11905: 0x8EA6,\n\t24118 - 11905: 0x8EA7,\n\t24119 - 11905: 0xE1A1,\n\t24120 - 11905: 0xB3A3,\n\t24121 - 11905: 0x8EA8,\n\t24122 - 11905: 0x8EA9,\n\t24123 - 11905: 0xE0FD,\n\t24124 - 11905: 0xE0FE,\n\t24125 - 11905: 0xC3B1,\n\t24126 - 11905: 0x8EAA,\n\t24127 - 11905: 0x8EAB,\n\t24128 - 11905: 0x8EAC,\n\t24129 - 11905: 0x8EAD,\n\t24130 - 11905: 0xC3DD,\n\t24131 - 11905: 0x8EAE,\n\t24132 - 11905: 0xE1A2,\n\t24133 - 11905: 0xB7F9,\n\t24134 - 11905: 0x8EAF,\n\t24135 - 11905: 0x8EB0,\n\t24136 - 11905: 0x8EB1,\n\t24137 - 11905: 0x8EB2,\n\t24138 - 11905: 0x8EB3,\n\t24139 - 11905: 0x8EB4,\n\t24140 - 11905: 0xBBCF,\n\t24141 - 11905: 0x8EB5,\n\t24142 - 11905: 0x8EB6,\n\t24143 - 11905: 0x8EB7,\n\t24144 - 11905: 0x8EB8,\n\t24145 - 11905: 0x8EB9,\n\t24146 - 11905: 0x8EBA,\n\t24147 - 11905: 0x8EBB,\n\t24148 - 11905: 0xE1A3,\n\t24149 - 11905: 0xC4BB,\n\t24150 - 11905: 0x8EBC,\n\t24151 - 11905: 0x8EBD,\n\t24152 - 11905: 0x8EBE,\n\t24153 - 11905: 0x8EBF,\n\t24154 - 11905: 0x8EC0,\n\t24155 - 11905: 0xE1A4,\n\t24156 - 11905: 0x8EC1,\n\t24157 - 11905: 0x8EC2,\n\t24158 - 11905: 0xE1A5,\n\t24159 - 11905: 0x8EC3,\n\t24160 - 11905: 0x8EC4,\n\t24161 - 11905: 0xE1A6,\n\t24162 - 11905: 0xB4B1,\n\t24163 - 11905: 0x8EC5,\n\t24164 - 11905: 0x8EC6,\n\t24165 - 11905: 0x8EC7,\n\t24166 - 11905: 0x8EC8,\n\t24167 - 11905: 0x8EC9,\n\t24168 - 11905: 0x8ECA,\n\t24169 - 11905: 0x8ECB,\n\t24170 - 11905: 0x8ECC,\n\t24171 - 11905: 0x8ECD,\n\t24172 - 11905: 0x8ECE,\n\t24173 - 11905: 0x8ECF,\n\t24174 - 11905: 0x8ED0,\n\t24175 - 11905: 0x8ED1,\n\t24176 - 11905: 0x8ED2,\n\t24177 - 11905: 0x8ED3,\n\t24178 - 11905: 0xB8C9,\n\t24179 - 11905: 0xC6BD,\n\t24180 - 11905: 0xC4EA,\n\t24181 - 11905: 0x8ED4,\n\t24182 - 11905: 0xB2A2,\n\t24183 - 11905: 0x8ED5,\n\t24184 - 11905: 0xD0D2,\n\t24185 - 11905: 0x8ED6,\n\t24186 - 11905: 0xE7DB,\n\t24187 - 11905: 0xBBC3,\n\t24188 - 11905: 0xD3D7,\n\t24189 - 11905: 0xD3C4,\n\t24190 - 11905: 0x8ED7,\n\t24191 - 11905: 0xB9E3,\n\t24192 - 11905: 0xE2CF,\n\t24193 - 11905: 0x8ED8,\n\t24194 - 11905: 0x8ED9,\n\t24195 - 11905: 0x8EDA,\n\t24196 - 11905: 0xD7AF,\n\t24197 - 11905: 0x8EDB,\n\t24198 - 11905: 0xC7EC,\n\t24199 - 11905: 0xB1D3,\n\t24200 - 11905: 0x8EDC,\n\t24201 - 11905: 0x8EDD,\n\t24202 - 11905: 0xB4B2,\n\t24203 - 11905: 0xE2D1,\n\t24204 - 11905: 0x8EDE,\n\t24205 - 11905: 0x8EDF,\n\t24206 - 11905: 0x8EE0,\n\t24207 - 11905: 0xD0F2,\n\t24208 - 11905: 0xC2AE,\n\t24209 - 11905: 0xE2D0,\n\t24210 - 11905: 0x8EE1,\n\t24211 - 11905: 0xBFE2,\n\t24212 - 11905: 0xD3A6,\n\t24213 - 11905: 0xB5D7,\n\t24214 - 11905: 0xE2D2,\n\t24215 - 11905: 0xB5EA,\n\t24216 - 11905: 0x8EE2,\n\t24217 - 11905: 0xC3ED,\n\t24218 - 11905: 0xB8FD,\n\t24219 - 11905: 0x8EE3,\n\t24220 - 11905: 0xB8AE,\n\t24221 - 11905: 0x8EE4,\n\t24222 - 11905: 0xC5D3,\n\t24223 - 11905: 0xB7CF,\n\t24224 - 11905: 0xE2D4,\n\t24225 - 11905: 0x8EE5,\n\t24226 - 11905: 0x8EE6,\n\t24227 - 11905: 0x8EE7,\n\t24228 - 11905: 0x8EE8,\n\t24229 - 11905: 0xE2D3,\n\t24230 - 11905: 0xB6C8,\n\t24231 - 11905: 0xD7F9,\n\t24232 - 11905: 0x8EE9,\n\t24233 - 11905: 0x8EEA,\n\t24234 - 11905: 0x8EEB,\n\t24235 - 11905: 0x8EEC,\n\t24236 - 11905: 0x8EED,\n\t24237 - 11905: 0xCDA5,\n\t24238 - 11905: 0x8EEE,\n\t24239 - 11905: 0x8EEF,\n\t24240 - 11905: 0x8EF0,\n\t24241 - 11905: 0x8EF1,\n\t24242 - 11905: 0x8EF2,\n\t24243 - 11905: 0xE2D8,\n\t24244 - 11905: 0x8EF3,\n\t24245 - 11905: 0xE2D6,\n\t24246 - 11905: 0xCAFC,\n\t24247 - 11905: 0xBFB5,\n\t24248 - 11905: 0xD3B9,\n\t24249 - 11905: 0xE2D5,\n\t24250 - 11905: 0x8EF4,\n\t24251 - 11905: 0x8EF5,\n\t24252 - 11905: 0x8EF6,\n\t24253 - 11905: 0x8EF7,\n\t24254 - 11905: 0xE2D7,\n\t24255 - 11905: 0x8EF8,\n\t24256 - 11905: 0x8EF9,\n\t24257 - 11905: 0x8EFA,\n\t24258 - 11905: 0x8EFB,\n\t24259 - 11905: 0x8EFC,\n\t24260 - 11905: 0x8EFD,\n\t24261 - 11905: 0x8EFE,\n\t24262 - 11905: 0x8F40,\n\t24263 - 11905: 0x8F41,\n\t24264 - 11905: 0x8F42,\n\t24265 - 11905: 0xC1AE,\n\t24266 - 11905: 0xC0C8,\n\t24267 - 11905: 0x8F43,\n\t24268 - 11905: 0x8F44,\n\t24269 - 11905: 0x8F45,\n\t24270 - 11905: 0x8F46,\n\t24271 - 11905: 0x8F47,\n\t24272 - 11905: 0x8F48,\n\t24273 - 11905: 0xE2DB,\n\t24274 - 11905: 0xE2DA,\n\t24275 - 11905: 0xC0AA,\n\t24276 - 11905: 0x8F49,\n\t24277 - 11905: 0x8F4A,\n\t24278 - 11905: 0xC1CE,\n\t24279 - 11905: 0x8F4B,\n\t24280 - 11905: 0x8F4C,\n\t24281 - 11905: 0x8F4D,\n\t24282 - 11905: 0x8F4E,\n\t24283 - 11905: 0xE2DC,\n\t24284 - 11905: 0x8F4F,\n\t24285 - 11905: 0x8F50,\n\t24286 - 11905: 0x8F51,\n\t24287 - 11905: 0x8F52,\n\t24288 - 11905: 0x8F53,\n\t24289 - 11905: 0x8F54,\n\t24290 - 11905: 0x8F55,\n\t24291 - 11905: 0x8F56,\n\t24292 - 11905: 0x8F57,\n\t24293 - 11905: 0x8F58,\n\t24294 - 11905: 0x8F59,\n\t24295 - 11905: 0x8F5A,\n\t24296 - 11905: 0xE2DD,\n\t24297 - 11905: 0x8F5B,\n\t24298 - 11905: 0xE2DE,\n\t24299 - 11905: 0x8F5C,\n\t24300 - 11905: 0x8F5D,\n\t24301 - 11905: 0x8F5E,\n\t24302 - 11905: 0x8F5F,\n\t24303 - 11905: 0x8F60,\n\t24304 - 11905: 0x8F61,\n\t24305 - 11905: 0x8F62,\n\t24306 - 11905: 0x8F63,\n\t24307 - 11905: 0x8F64,\n\t24308 - 11905: 0xDBC8,\n\t24309 - 11905: 0x8F65,\n\t24310 - 11905: 0xD1D3,\n\t24311 - 11905: 0xCDA2,\n\t24312 - 11905: 0x8F66,\n\t24313 - 11905: 0x8F67,\n\t24314 - 11905: 0xBDA8,\n\t24315 - 11905: 0x8F68,\n\t24316 - 11905: 0x8F69,\n\t24317 - 11905: 0x8F6A,\n\t24318 - 11905: 0xDEC3,\n\t24319 - 11905: 0xD8A5,\n\t24320 - 11905: 0xBFAA,\n\t24321 - 11905: 0xDBCD,\n\t24322 - 11905: 0xD2EC,\n\t24323 - 11905: 0xC6FA,\n\t24324 - 11905: 0xC5AA,\n\t24325 - 11905: 0x8F6B,\n\t24326 - 11905: 0x8F6C,\n\t24327 - 11905: 0x8F6D,\n\t24328 - 11905: 0xDEC4,\n\t24329 - 11905: 0x8F6E,\n\t24330 - 11905: 0xB1D7,\n\t24331 - 11905: 0xDFAE,\n\t24332 - 11905: 0x8F6F,\n\t24333 - 11905: 0x8F70,\n\t24334 - 11905: 0x8F71,\n\t24335 - 11905: 0xCABD,\n\t24336 - 11905: 0x8F72,\n\t24337 - 11905: 0xDFB1,\n\t24338 - 11905: 0x8F73,\n\t24339 - 11905: 0xB9AD,\n\t24340 - 11905: 0x8F74,\n\t24341 - 11905: 0xD2FD,\n\t24342 - 11905: 0x8F75,\n\t24343 - 11905: 0xB8A5,\n\t24344 - 11905: 0xBAEB,\n\t24345 - 11905: 0x8F76,\n\t24346 - 11905: 0x8F77,\n\t24347 - 11905: 0xB3DA,\n\t24348 - 11905: 0x8F78,\n\t24349 - 11905: 0x8F79,\n\t24350 - 11905: 0x8F7A,\n\t24351 - 11905: 0xB5DC,\n\t24352 - 11905: 0xD5C5,\n\t24353 - 11905: 0x8F7B,\n\t24354 - 11905: 0x8F7C,\n\t24355 - 11905: 0x8F7D,\n\t24356 - 11905: 0x8F7E,\n\t24357 - 11905: 0xC3D6,\n\t24358 - 11905: 0xCFD2,\n\t24359 - 11905: 0xBBA1,\n\t24360 - 11905: 0x8F80,\n\t24361 - 11905: 0xE5F3,\n\t24362 - 11905: 0xE5F2,\n\t24363 - 11905: 0x8F81,\n\t24364 - 11905: 0x8F82,\n\t24365 - 11905: 0xE5F4,\n\t24366 - 11905: 0x8F83,\n\t24367 - 11905: 0xCDE4,\n\t24368 - 11905: 0x8F84,\n\t24369 - 11905: 0xC8F5,\n\t24370 - 11905: 0x8F85,\n\t24371 - 11905: 0x8F86,\n\t24372 - 11905: 0x8F87,\n\t24373 - 11905: 0x8F88,\n\t24374 - 11905: 0x8F89,\n\t24375 - 11905: 0x8F8A,\n\t24376 - 11905: 0x8F8B,\n\t24377 - 11905: 0xB5AF,\n\t24378 - 11905: 0xC7BF,\n\t24379 - 11905: 0x8F8C,\n\t24380 - 11905: 0xE5F6,\n\t24381 - 11905: 0x8F8D,\n\t24382 - 11905: 0x8F8E,\n\t24383 - 11905: 0x8F8F,\n\t24384 - 11905: 0xECB0,\n\t24385 - 11905: 0x8F90,\n\t24386 - 11905: 0x8F91,\n\t24387 - 11905: 0x8F92,\n\t24388 - 11905: 0x8F93,\n\t24389 - 11905: 0x8F94,\n\t24390 - 11905: 0x8F95,\n\t24391 - 11905: 0x8F96,\n\t24392 - 11905: 0x8F97,\n\t24393 - 11905: 0x8F98,\n\t24394 - 11905: 0x8F99,\n\t24395 - 11905: 0x8F9A,\n\t24396 - 11905: 0x8F9B,\n\t24397 - 11905: 0x8F9C,\n\t24398 - 11905: 0x8F9D,\n\t24399 - 11905: 0x8F9E,\n\t24400 - 11905: 0xE5E6,\n\t24401 - 11905: 0x8F9F,\n\t24402 - 11905: 0xB9E9,\n\t24403 - 11905: 0xB5B1,\n\t24404 - 11905: 0x8FA0,\n\t24405 - 11905: 0xC2BC,\n\t24406 - 11905: 0xE5E8,\n\t24407 - 11905: 0xE5E7,\n\t24408 - 11905: 0xE5E9,\n\t24409 - 11905: 0x8FA1,\n\t24410 - 11905: 0x8FA2,\n\t24411 - 11905: 0x8FA3,\n\t24412 - 11905: 0x8FA4,\n\t24413 - 11905: 0xD2CD,\n\t24414 - 11905: 0x8FA5,\n\t24415 - 11905: 0x8FA6,\n\t24416 - 11905: 0x8FA7,\n\t24417 - 11905: 0xE1EA,\n\t24418 - 11905: 0xD0CE,\n\t24419 - 11905: 0x8FA8,\n\t24420 - 11905: 0xCDAE,\n\t24421 - 11905: 0x8FA9,\n\t24422 - 11905: 0xD1E5,\n\t24423 - 11905: 0x8FAA,\n\t24424 - 11905: 0x8FAB,\n\t24425 - 11905: 0xB2CA,\n\t24426 - 11905: 0xB1EB,\n\t24427 - 11905: 0x8FAC,\n\t24428 - 11905: 0xB1F2,\n\t24429 - 11905: 0xC5ED,\n\t24430 - 11905: 0x8FAD,\n\t24431 - 11905: 0x8FAE,\n\t24432 - 11905: 0xD5C3,\n\t24433 - 11905: 0xD3B0,\n\t24434 - 11905: 0x8FAF,\n\t24435 - 11905: 0xE1DC,\n\t24436 - 11905: 0x8FB0,\n\t24437 - 11905: 0x8FB1,\n\t24438 - 11905: 0x8FB2,\n\t24439 - 11905: 0xE1DD,\n\t24440 - 11905: 0x8FB3,\n\t24441 - 11905: 0xD2DB,\n\t24442 - 11905: 0x8FB4,\n\t24443 - 11905: 0xB3B9,\n\t24444 - 11905: 0xB1CB,\n\t24445 - 11905: 0x8FB5,\n\t24446 - 11905: 0x8FB6,\n\t24447 - 11905: 0x8FB7,\n\t24448 - 11905: 0xCDF9,\n\t24449 - 11905: 0xD5F7,\n\t24450 - 11905: 0xE1DE,\n\t24451 - 11905: 0x8FB8,\n\t24452 - 11905: 0xBEB6,\n\t24453 - 11905: 0xB4FD,\n\t24454 - 11905: 0x8FB9,\n\t24455 - 11905: 0xE1DF,\n\t24456 - 11905: 0xBADC,\n\t24457 - 11905: 0xE1E0,\n\t24458 - 11905: 0xBBB2,\n\t24459 - 11905: 0xC2C9,\n\t24460 - 11905: 0xE1E1,\n\t24461 - 11905: 0x8FBA,\n\t24462 - 11905: 0x8FBB,\n\t24463 - 11905: 0x8FBC,\n\t24464 - 11905: 0xD0EC,\n\t24465 - 11905: 0x8FBD,\n\t24466 - 11905: 0xCDBD,\n\t24467 - 11905: 0x8FBE,\n\t24468 - 11905: 0x8FBF,\n\t24469 - 11905: 0xE1E2,\n\t24470 - 11905: 0x8FC0,\n\t24471 - 11905: 0xB5C3,\n\t24472 - 11905: 0xC5C7,\n\t24473 - 11905: 0xE1E3,\n\t24474 - 11905: 0x8FC1,\n\t24475 - 11905: 0x8FC2,\n\t24476 - 11905: 0xE1E4,\n\t24477 - 11905: 0x8FC3,\n\t24478 - 11905: 0x8FC4,\n\t24479 - 11905: 0x8FC5,\n\t24480 - 11905: 0x8FC6,\n\t24481 - 11905: 0xD3F9,\n\t24482 - 11905: 0x8FC7,\n\t24483 - 11905: 0x8FC8,\n\t24484 - 11905: 0x8FC9,\n\t24485 - 11905: 0x8FCA,\n\t24486 - 11905: 0x8FCB,\n\t24487 - 11905: 0x8FCC,\n\t24488 - 11905: 0xE1E5,\n\t24489 - 11905: 0x8FCD,\n\t24490 - 11905: 0xD1AD,\n\t24491 - 11905: 0x8FCE,\n\t24492 - 11905: 0x8FCF,\n\t24493 - 11905: 0xE1E6,\n\t24494 - 11905: 0xCEA2,\n\t24495 - 11905: 0x8FD0,\n\t24496 - 11905: 0x8FD1,\n\t24497 - 11905: 0x8FD2,\n\t24498 - 11905: 0x8FD3,\n\t24499 - 11905: 0x8FD4,\n\t24500 - 11905: 0x8FD5,\n\t24501 - 11905: 0xE1E7,\n\t24502 - 11905: 0x8FD6,\n\t24503 - 11905: 0xB5C2,\n\t24504 - 11905: 0x8FD7,\n\t24505 - 11905: 0x8FD8,\n\t24506 - 11905: 0x8FD9,\n\t24507 - 11905: 0x8FDA,\n\t24508 - 11905: 0xE1E8,\n\t24509 - 11905: 0xBBD5,\n\t24510 - 11905: 0x8FDB,\n\t24511 - 11905: 0x8FDC,\n\t24512 - 11905: 0x8FDD,\n\t24513 - 11905: 0x8FDE,\n\t24514 - 11905: 0x8FDF,\n\t24515 - 11905: 0xD0C4,\n\t24516 - 11905: 0xE2E0,\n\t24517 - 11905: 0xB1D8,\n\t24518 - 11905: 0xD2E4,\n\t24519 - 11905: 0x8FE0,\n\t24520 - 11905: 0x8FE1,\n\t24521 - 11905: 0xE2E1,\n\t24522 - 11905: 0x8FE2,\n\t24523 - 11905: 0x8FE3,\n\t24524 - 11905: 0xBCC9,\n\t24525 - 11905: 0xC8CC,\n\t24526 - 11905: 0x8FE4,\n\t24527 - 11905: 0xE2E3,\n\t24528 - 11905: 0xECFE,\n\t24529 - 11905: 0xECFD,\n\t24530 - 11905: 0xDFAF,\n\t24531 - 11905: 0x8FE5,\n\t24532 - 11905: 0x8FE6,\n\t24533 - 11905: 0x8FE7,\n\t24534 - 11905: 0xE2E2,\n\t24535 - 11905: 0xD6BE,\n\t24536 - 11905: 0xCDFC,\n\t24537 - 11905: 0xC3A6,\n\t24538 - 11905: 0x8FE8,\n\t24539 - 11905: 0x8FE9,\n\t24540 - 11905: 0x8FEA,\n\t24541 - 11905: 0xE3C3,\n\t24542 - 11905: 0x8FEB,\n\t24543 - 11905: 0x8FEC,\n\t24544 - 11905: 0xD6D2,\n\t24545 - 11905: 0xE2E7,\n\t24546 - 11905: 0x8FED,\n\t24547 - 11905: 0x8FEE,\n\t24548 - 11905: 0xE2E8,\n\t24549 - 11905: 0x8FEF,\n\t24550 - 11905: 0x8FF0,\n\t24551 - 11905: 0xD3C7,\n\t24552 - 11905: 0x8FF1,\n\t24553 - 11905: 0x8FF2,\n\t24554 - 11905: 0xE2EC,\n\t24555 - 11905: 0xBFEC,\n\t24556 - 11905: 0x8FF3,\n\t24557 - 11905: 0xE2ED,\n\t24558 - 11905: 0xE2E5,\n\t24559 - 11905: 0x8FF4,\n\t24560 - 11905: 0x8FF5,\n\t24561 - 11905: 0xB3C0,\n\t24562 - 11905: 0x8FF6,\n\t24563 - 11905: 0x8FF7,\n\t24564 - 11905: 0x8FF8,\n\t24565 - 11905: 0xC4EE,\n\t24566 - 11905: 0x8FF9,\n\t24567 - 11905: 0x8FFA,\n\t24568 - 11905: 0xE2EE,\n\t24569 - 11905: 0x8FFB,\n\t24570 - 11905: 0x8FFC,\n\t24571 - 11905: 0xD0C3,\n\t24572 - 11905: 0x8FFD,\n\t24573 - 11905: 0xBAF6,\n\t24574 - 11905: 0xE2E9,\n\t24575 - 11905: 0xB7DE,\n\t24576 - 11905: 0xBBB3,\n\t24577 - 11905: 0xCCAC,\n\t24578 - 11905: 0xCBCB,\n\t24579 - 11905: 0xE2E4,\n\t24580 - 11905: 0xE2E6,\n\t24581 - 11905: 0xE2EA,\n\t24582 - 11905: 0xE2EB,\n\t24583 - 11905: 0x8FFE,\n\t24584 - 11905: 0x9040,\n\t24585 - 11905: 0x9041,\n\t24586 - 11905: 0xE2F7,\n\t24587 - 11905: 0x9042,\n\t24588 - 11905: 0x9043,\n\t24589 - 11905: 0xE2F4,\n\t24590 - 11905: 0xD4F5,\n\t24591 - 11905: 0xE2F3,\n\t24592 - 11905: 0x9044,\n\t24593 - 11905: 0x9045,\n\t24594 - 11905: 0xC5AD,\n\t24595 - 11905: 0x9046,\n\t24596 - 11905: 0xD5FA,\n\t24597 - 11905: 0xC5C2,\n\t24598 - 11905: 0xB2C0,\n\t24599 - 11905: 0x9047,\n\t24600 - 11905: 0x9048,\n\t24601 - 11905: 0xE2EF,\n\t24602 - 11905: 0x9049,\n\t24603 - 11905: 0xE2F2,\n\t24604 - 11905: 0xC1AF,\n\t24605 - 11905: 0xCBBC,\n\t24606 - 11905: 0x904A,\n\t24607 - 11905: 0x904B,\n\t24608 - 11905: 0xB5A1,\n\t24609 - 11905: 0xE2F9,\n\t24610 - 11905: 0x904C,\n\t24611 - 11905: 0x904D,\n\t24612 - 11905: 0x904E,\n\t24613 - 11905: 0xBCB1,\n\t24614 - 11905: 0xE2F1,\n\t24615 - 11905: 0xD0D4,\n\t24616 - 11905: 0xD4B9,\n\t24617 - 11905: 0xE2F5,\n\t24618 - 11905: 0xB9D6,\n\t24619 - 11905: 0xE2F6,\n\t24620 - 11905: 0x904F,\n\t24621 - 11905: 0x9050,\n\t24622 - 11905: 0x9051,\n\t24623 - 11905: 0xC7D3,\n\t24624 - 11905: 0x9052,\n\t24625 - 11905: 0x9053,\n\t24626 - 11905: 0x9054,\n\t24627 - 11905: 0x9055,\n\t24628 - 11905: 0x9056,\n\t24629 - 11905: 0xE2F0,\n\t24630 - 11905: 0x9057,\n\t24631 - 11905: 0x9058,\n\t24632 - 11905: 0x9059,\n\t24633 - 11905: 0x905A,\n\t24634 - 11905: 0x905B,\n\t24635 - 11905: 0xD7DC,\n\t24636 - 11905: 0xEDA1,\n\t24637 - 11905: 0x905C,\n\t24638 - 11905: 0x905D,\n\t24639 - 11905: 0xE2F8,\n\t24640 - 11905: 0x905E,\n\t24641 - 11905: 0xEDA5,\n\t24642 - 11905: 0xE2FE,\n\t24643 - 11905: 0xCAD1,\n\t24644 - 11905: 0x905F,\n\t24645 - 11905: 0x9060,\n\t24646 - 11905: 0x9061,\n\t24647 - 11905: 0x9062,\n\t24648 - 11905: 0x9063,\n\t24649 - 11905: 0x9064,\n\t24650 - 11905: 0x9065,\n\t24651 - 11905: 0xC1B5,\n\t24652 - 11905: 0x9066,\n\t24653 - 11905: 0xBBD0,\n\t24654 - 11905: 0x9067,\n\t24655 - 11905: 0x9068,\n\t24656 - 11905: 0xBFD6,\n\t24657 - 11905: 0x9069,\n\t24658 - 11905: 0xBAE3,\n\t24659 - 11905: 0x906A,\n\t24660 - 11905: 0x906B,\n\t24661 - 11905: 0xCBA1,\n\t24662 - 11905: 0x906C,\n\t24663 - 11905: 0x906D,\n\t24664 - 11905: 0x906E,\n\t24665 - 11905: 0xEDA6,\n\t24666 - 11905: 0xEDA3,\n\t24667 - 11905: 0x906F,\n\t24668 - 11905: 0x9070,\n\t24669 - 11905: 0xEDA2,\n\t24670 - 11905: 0x9071,\n\t24671 - 11905: 0x9072,\n\t24672 - 11905: 0x9073,\n\t24673 - 11905: 0x9074,\n\t24674 - 11905: 0xBBD6,\n\t24675 - 11905: 0xEDA7,\n\t24676 - 11905: 0xD0F4,\n\t24677 - 11905: 0x9075,\n\t24678 - 11905: 0x9076,\n\t24679 - 11905: 0xEDA4,\n\t24680 - 11905: 0xBADE,\n\t24681 - 11905: 0xB6F7,\n\t24682 - 11905: 0xE3A1,\n\t24683 - 11905: 0xB6B2,\n\t24684 - 11905: 0xCCF1,\n\t24685 - 11905: 0xB9A7,\n\t24686 - 11905: 0x9077,\n\t24687 - 11905: 0xCFA2,\n\t24688 - 11905: 0xC7A1,\n\t24689 - 11905: 0x9078,\n\t24690 - 11905: 0x9079,\n\t24691 - 11905: 0xBFD2,\n\t24692 - 11905: 0x907A,\n\t24693 - 11905: 0x907B,\n\t24694 - 11905: 0xB6F1,\n\t24695 - 11905: 0x907C,\n\t24696 - 11905: 0xE2FA,\n\t24697 - 11905: 0xE2FB,\n\t24698 - 11905: 0xE2FD,\n\t24699 - 11905: 0xE2FC,\n\t24700 - 11905: 0xC4D5,\n\t24701 - 11905: 0xE3A2,\n\t24702 - 11905: 0x907D,\n\t24703 - 11905: 0xD3C1,\n\t24704 - 11905: 0x907E,\n\t24705 - 11905: 0x9080,\n\t24706 - 11905: 0x9081,\n\t24707 - 11905: 0xE3A7,\n\t24708 - 11905: 0xC7C4,\n\t24709 - 11905: 0x9082,\n\t24710 - 11905: 0x9083,\n\t24711 - 11905: 0x9084,\n\t24712 - 11905: 0x9085,\n\t24713 - 11905: 0xCFA4,\n\t24714 - 11905: 0x9086,\n\t24715 - 11905: 0x9087,\n\t24716 - 11905: 0xE3A9,\n\t24717 - 11905: 0xBAB7,\n\t24718 - 11905: 0x9088,\n\t24719 - 11905: 0x9089,\n\t24720 - 11905: 0x908A,\n\t24721 - 11905: 0x908B,\n\t24722 - 11905: 0xE3A8,\n\t24723 - 11905: 0x908C,\n\t24724 - 11905: 0xBBDA,\n\t24725 - 11905: 0x908D,\n\t24726 - 11905: 0xE3A3,\n\t24727 - 11905: 0x908E,\n\t24728 - 11905: 0x908F,\n\t24729 - 11905: 0x9090,\n\t24730 - 11905: 0xE3A4,\n\t24731 - 11905: 0xE3AA,\n\t24732 - 11905: 0x9091,\n\t24733 - 11905: 0xE3A6,\n\t24734 - 11905: 0x9092,\n\t24735 - 11905: 0xCEF2,\n\t24736 - 11905: 0xD3C6,\n\t24737 - 11905: 0x9093,\n\t24738 - 11905: 0x9094,\n\t24739 - 11905: 0xBBBC,\n\t24740 - 11905: 0x9095,\n\t24741 - 11905: 0x9096,\n\t24742 - 11905: 0xD4C3,\n\t24743 - 11905: 0x9097,\n\t24744 - 11905: 0xC4FA,\n\t24745 - 11905: 0x9098,\n\t24746 - 11905: 0x9099,\n\t24747 - 11905: 0xEDA8,\n\t24748 - 11905: 0xD0FC,\n\t24749 - 11905: 0xE3A5,\n\t24750 - 11905: 0x909A,\n\t24751 - 11905: 0xC3F5,\n\t24752 - 11905: 0x909B,\n\t24753 - 11905: 0xE3AD,\n\t24754 - 11905: 0xB1AF,\n\t24755 - 11905: 0x909C,\n\t24756 - 11905: 0xE3B2,\n\t24757 - 11905: 0x909D,\n\t24758 - 11905: 0x909E,\n\t24759 - 11905: 0x909F,\n\t24760 - 11905: 0xBCC2,\n\t24761 - 11905: 0x90A0,\n\t24762 - 11905: 0x90A1,\n\t24763 - 11905: 0xE3AC,\n\t24764 - 11905: 0xB5BF,\n\t24765 - 11905: 0x90A2,\n\t24766 - 11905: 0x90A3,\n\t24767 - 11905: 0x90A4,\n\t24768 - 11905: 0x90A5,\n\t24769 - 11905: 0x90A6,\n\t24770 - 11905: 0x90A7,\n\t24771 - 11905: 0x90A8,\n\t24772 - 11905: 0x90A9,\n\t24773 - 11905: 0xC7E9,\n\t24774 - 11905: 0xE3B0,\n\t24775 - 11905: 0x90AA,\n\t24776 - 11905: 0x90AB,\n\t24777 - 11905: 0x90AC,\n\t24778 - 11905: 0xBEAA,\n\t24779 - 11905: 0xCDEF,\n\t24780 - 11905: 0x90AD,\n\t24781 - 11905: 0x90AE,\n\t24782 - 11905: 0x90AF,\n\t24783 - 11905: 0x90B0,\n\t24784 - 11905: 0x90B1,\n\t24785 - 11905: 0xBBF3,\n\t24786 - 11905: 0x90B2,\n\t24787 - 11905: 0x90B3,\n\t24788 - 11905: 0x90B4,\n\t24789 - 11905: 0xCCE8,\n\t24790 - 11905: 0x90B5,\n\t24791 - 11905: 0x90B6,\n\t24792 - 11905: 0xE3AF,\n\t24793 - 11905: 0x90B7,\n\t24794 - 11905: 0xE3B1,\n\t24795 - 11905: 0x90B8,\n\t24796 - 11905: 0xCFA7,\n\t24797 - 11905: 0xE3AE,\n\t24798 - 11905: 0x90B9,\n\t24799 - 11905: 0xCEA9,\n\t24800 - 11905: 0xBBDD,\n\t24801 - 11905: 0x90BA,\n\t24802 - 11905: 0x90BB,\n\t24803 - 11905: 0x90BC,\n\t24804 - 11905: 0x90BD,\n\t24805 - 11905: 0x90BE,\n\t24806 - 11905: 0xB5EB,\n\t24807 - 11905: 0xBEE5,\n\t24808 - 11905: 0xB2D2,\n\t24809 - 11905: 0xB3CD,\n\t24810 - 11905: 0x90BF,\n\t24811 - 11905: 0xB1B9,\n\t24812 - 11905: 0xE3AB,\n\t24813 - 11905: 0xB2D1,\n\t24814 - 11905: 0xB5AC,\n\t24815 - 11905: 0xB9DF,\n\t24816 - 11905: 0xB6E8,\n\t24817 - 11905: 0x90C0,\n\t24818 - 11905: 0x90C1,\n\t24819 - 11905: 0xCFEB,\n\t24820 - 11905: 0xE3B7,\n\t24821 - 11905: 0x90C2,\n\t24822 - 11905: 0xBBCC,\n\t24823 - 11905: 0x90C3,\n\t24824 - 11905: 0x90C4,\n\t24825 - 11905: 0xC8C7,\n\t24826 - 11905: 0xD0CA,\n\t24827 - 11905: 0x90C5,\n\t24828 - 11905: 0x90C6,\n\t24829 - 11905: 0x90C7,\n\t24830 - 11905: 0x90C8,\n\t24831 - 11905: 0x90C9,\n\t24832 - 11905: 0xE3B8,\n\t24833 - 11905: 0xB3EE,\n\t24834 - 11905: 0x90CA,\n\t24835 - 11905: 0x90CB,\n\t24836 - 11905: 0x90CC,\n\t24837 - 11905: 0x90CD,\n\t24838 - 11905: 0xEDA9,\n\t24839 - 11905: 0x90CE,\n\t24840 - 11905: 0xD3FA,\n\t24841 - 11905: 0xD3E4,\n\t24842 - 11905: 0x90CF,\n\t24843 - 11905: 0x90D0,\n\t24844 - 11905: 0x90D1,\n\t24845 - 11905: 0xEDAA,\n\t24846 - 11905: 0xE3B9,\n\t24847 - 11905: 0xD2E2,\n\t24848 - 11905: 0x90D2,\n\t24849 - 11905: 0x90D3,\n\t24850 - 11905: 0x90D4,\n\t24851 - 11905: 0x90D5,\n\t24852 - 11905: 0x90D6,\n\t24853 - 11905: 0xE3B5,\n\t24854 - 11905: 0x90D7,\n\t24855 - 11905: 0x90D8,\n\t24856 - 11905: 0x90D9,\n\t24857 - 11905: 0x90DA,\n\t24858 - 11905: 0xD3DE,\n\t24859 - 11905: 0x90DB,\n\t24860 - 11905: 0x90DC,\n\t24861 - 11905: 0x90DD,\n\t24862 - 11905: 0x90DE,\n\t24863 - 11905: 0xB8D0,\n\t24864 - 11905: 0xE3B3,\n\t24865 - 11905: 0x90DF,\n\t24866 - 11905: 0x90E0,\n\t24867 - 11905: 0xE3B6,\n\t24868 - 11905: 0xB7DF,\n\t24869 - 11905: 0x90E1,\n\t24870 - 11905: 0xE3B4,\n\t24871 - 11905: 0xC0A2,\n\t24872 - 11905: 0x90E2,\n\t24873 - 11905: 0x90E3,\n\t24874 - 11905: 0x90E4,\n\t24875 - 11905: 0xE3BA,\n\t24876 - 11905: 0x90E5,\n\t24877 - 11905: 0x90E6,\n\t24878 - 11905: 0x90E7,\n\t24879 - 11905: 0x90E8,\n\t24880 - 11905: 0x90E9,\n\t24881 - 11905: 0x90EA,\n\t24882 - 11905: 0x90EB,\n\t24883 - 11905: 0x90EC,\n\t24884 - 11905: 0x90ED,\n\t24885 - 11905: 0x90EE,\n\t24886 - 11905: 0x90EF,\n\t24887 - 11905: 0x90F0,\n\t24888 - 11905: 0x90F1,\n\t24889 - 11905: 0x90F2,\n\t24890 - 11905: 0x90F3,\n\t24891 - 11905: 0x90F4,\n\t24892 - 11905: 0x90F5,\n\t24893 - 11905: 0x90F6,\n\t24894 - 11905: 0x90F7,\n\t24895 - 11905: 0xD4B8,\n\t24896 - 11905: 0x90F8,\n\t24897 - 11905: 0x90F9,\n\t24898 - 11905: 0x90FA,\n\t24899 - 11905: 0x90FB,\n\t24900 - 11905: 0x90FC,\n\t24901 - 11905: 0x90FD,\n\t24902 - 11905: 0x90FE,\n\t24903 - 11905: 0x9140,\n\t24904 - 11905: 0xB4C8,\n\t24905 - 11905: 0x9141,\n\t24906 - 11905: 0xE3BB,\n\t24907 - 11905: 0x9142,\n\t24908 - 11905: 0xBBC5,\n\t24909 - 11905: 0x9143,\n\t24910 - 11905: 0xC9F7,\n\t24911 - 11905: 0x9144,\n\t24912 - 11905: 0x9145,\n\t24913 - 11905: 0xC9E5,\n\t24914 - 11905: 0x9146,\n\t24915 - 11905: 0x9147,\n\t24916 - 11905: 0x9148,\n\t24917 - 11905: 0xC4BD,\n\t24918 - 11905: 0x9149,\n\t24919 - 11905: 0x914A,\n\t24920 - 11905: 0x914B,\n\t24921 - 11905: 0x914C,\n\t24922 - 11905: 0x914D,\n\t24923 - 11905: 0x914E,\n\t24924 - 11905: 0x914F,\n\t24925 - 11905: 0xEDAB,\n\t24926 - 11905: 0x9150,\n\t24927 - 11905: 0x9151,\n\t24928 - 11905: 0x9152,\n\t24929 - 11905: 0x9153,\n\t24930 - 11905: 0xC2FD,\n\t24931 - 11905: 0x9154,\n\t24932 - 11905: 0x9155,\n\t24933 - 11905: 0x9156,\n\t24934 - 11905: 0x9157,\n\t24935 - 11905: 0xBBDB,\n\t24936 - 11905: 0xBFAE,\n\t24937 - 11905: 0x9158,\n\t24938 - 11905: 0x9159,\n\t24939 - 11905: 0x915A,\n\t24940 - 11905: 0x915B,\n\t24941 - 11905: 0x915C,\n\t24942 - 11905: 0x915D,\n\t24943 - 11905: 0x915E,\n\t24944 - 11905: 0xCEBF,\n\t24945 - 11905: 0x915F,\n\t24946 - 11905: 0x9160,\n\t24947 - 11905: 0x9161,\n\t24948 - 11905: 0x9162,\n\t24949 - 11905: 0xE3BC,\n\t24950 - 11905: 0x9163,\n\t24951 - 11905: 0xBFB6,\n\t24952 - 11905: 0x9164,\n\t24953 - 11905: 0x9165,\n\t24954 - 11905: 0x9166,\n\t24955 - 11905: 0x9167,\n\t24956 - 11905: 0x9168,\n\t24957 - 11905: 0x9169,\n\t24958 - 11905: 0x916A,\n\t24959 - 11905: 0x916B,\n\t24960 - 11905: 0x916C,\n\t24961 - 11905: 0x916D,\n\t24962 - 11905: 0x916E,\n\t24963 - 11905: 0x916F,\n\t24964 - 11905: 0x9170,\n\t24965 - 11905: 0x9171,\n\t24966 - 11905: 0x9172,\n\t24967 - 11905: 0x9173,\n\t24968 - 11905: 0x9174,\n\t24969 - 11905: 0x9175,\n\t24970 - 11905: 0x9176,\n\t24971 - 11905: 0xB1EF,\n\t24972 - 11905: 0x9177,\n\t24973 - 11905: 0x9178,\n\t24974 - 11905: 0xD4F7,\n\t24975 - 11905: 0x9179,\n\t24976 - 11905: 0x917A,\n\t24977 - 11905: 0x917B,\n\t24978 - 11905: 0x917C,\n\t24979 - 11905: 0x917D,\n\t24980 - 11905: 0xE3BE,\n\t24981 - 11905: 0x917E,\n\t24982 - 11905: 0x9180,\n\t24983 - 11905: 0x9181,\n\t24984 - 11905: 0x9182,\n\t24985 - 11905: 0x9183,\n\t24986 - 11905: 0x9184,\n\t24987 - 11905: 0x9185,\n\t24988 - 11905: 0x9186,\n\t24989 - 11905: 0xEDAD,\n\t24990 - 11905: 0x9187,\n\t24991 - 11905: 0x9188,\n\t24992 - 11905: 0x9189,\n\t24993 - 11905: 0x918A,\n\t24994 - 11905: 0x918B,\n\t24995 - 11905: 0x918C,\n\t24996 - 11905: 0x918D,\n\t24997 - 11905: 0x918E,\n\t24998 - 11905: 0x918F,\n\t24999 - 11905: 0xE3BF,\n\t25000 - 11905: 0xBAA9,\n\t25001 - 11905: 0xEDAC,\n\t25002 - 11905: 0x9190,\n\t25003 - 11905: 0x9191,\n\t25004 - 11905: 0xE3BD,\n\t25005 - 11905: 0x9192,\n\t25006 - 11905: 0x9193,\n\t25007 - 11905: 0x9194,\n\t25008 - 11905: 0x9195,\n\t25009 - 11905: 0x9196,\n\t25010 - 11905: 0x9197,\n\t25011 - 11905: 0x9198,\n\t25012 - 11905: 0x9199,\n\t25013 - 11905: 0x919A,\n\t25014 - 11905: 0x919B,\n\t25015 - 11905: 0xE3C0,\n\t25016 - 11905: 0x919C,\n\t25017 - 11905: 0x919D,\n\t25018 - 11905: 0x919E,\n\t25019 - 11905: 0x919F,\n\t25020 - 11905: 0x91A0,\n\t25021 - 11905: 0x91A1,\n\t25022 - 11905: 0xBAB6,\n\t25023 - 11905: 0x91A2,\n\t25024 - 11905: 0x91A3,\n\t25025 - 11905: 0x91A4,\n\t25026 - 11905: 0xB6AE,\n\t25027 - 11905: 0x91A5,\n\t25028 - 11905: 0x91A6,\n\t25029 - 11905: 0x91A7,\n\t25030 - 11905: 0x91A8,\n\t25031 - 11905: 0x91A9,\n\t25032 - 11905: 0xD0B8,\n\t25033 - 11905: 0x91AA,\n\t25034 - 11905: 0xB0C3,\n\t25035 - 11905: 0xEDAE,\n\t25036 - 11905: 0x91AB,\n\t25037 - 11905: 0x91AC,\n\t25038 - 11905: 0x91AD,\n\t25039 - 11905: 0x91AE,\n\t25040 - 11905: 0x91AF,\n\t25041 - 11905: 0xEDAF,\n\t25042 - 11905: 0xC0C1,\n\t25043 - 11905: 0x91B0,\n\t25044 - 11905: 0xE3C1,\n\t25045 - 11905: 0x91B1,\n\t25046 - 11905: 0x91B2,\n\t25047 - 11905: 0x91B3,\n\t25048 - 11905: 0x91B4,\n\t25049 - 11905: 0x91B5,\n\t25050 - 11905: 0x91B6,\n\t25051 - 11905: 0x91B7,\n\t25052 - 11905: 0x91B8,\n\t25053 - 11905: 0x91B9,\n\t25054 - 11905: 0x91BA,\n\t25055 - 11905: 0x91BB,\n\t25056 - 11905: 0x91BC,\n\t25057 - 11905: 0x91BD,\n\t25058 - 11905: 0x91BE,\n\t25059 - 11905: 0x91BF,\n\t25060 - 11905: 0x91C0,\n\t25061 - 11905: 0x91C1,\n\t25062 - 11905: 0xC5B3,\n\t25063 - 11905: 0x91C2,\n\t25064 - 11905: 0x91C3,\n\t25065 - 11905: 0x91C4,\n\t25066 - 11905: 0x91C5,\n\t25067 - 11905: 0x91C6,\n\t25068 - 11905: 0x91C7,\n\t25069 - 11905: 0x91C8,\n\t25070 - 11905: 0x91C9,\n\t25071 - 11905: 0x91CA,\n\t25072 - 11905: 0x91CB,\n\t25073 - 11905: 0x91CC,\n\t25074 - 11905: 0x91CD,\n\t25075 - 11905: 0x91CE,\n\t25076 - 11905: 0x91CF,\n\t25077 - 11905: 0xE3C2,\n\t25078 - 11905: 0x91D0,\n\t25079 - 11905: 0x91D1,\n\t25080 - 11905: 0x91D2,\n\t25081 - 11905: 0x91D3,\n\t25082 - 11905: 0x91D4,\n\t25083 - 11905: 0x91D5,\n\t25084 - 11905: 0x91D6,\n\t25085 - 11905: 0x91D7,\n\t25086 - 11905: 0x91D8,\n\t25087 - 11905: 0xDCB2,\n\t25088 - 11905: 0x91D9,\n\t25089 - 11905: 0x91DA,\n\t25090 - 11905: 0x91DB,\n\t25091 - 11905: 0x91DC,\n\t25092 - 11905: 0x91DD,\n\t25093 - 11905: 0x91DE,\n\t25094 - 11905: 0xEDB0,\n\t25095 - 11905: 0x91DF,\n\t25096 - 11905: 0xB8EA,\n\t25097 - 11905: 0x91E0,\n\t25098 - 11905: 0xCEEC,\n\t25099 - 11905: 0xEAA7,\n\t25100 - 11905: 0xD0E7,\n\t25101 - 11905: 0xCAF9,\n\t25102 - 11905: 0xC8D6,\n\t25103 - 11905: 0xCFB7,\n\t25104 - 11905: 0xB3C9,\n\t25105 - 11905: 0xCED2,\n\t25106 - 11905: 0xBDE4,\n\t25107 - 11905: 0x91E1,\n\t25108 - 11905: 0x91E2,\n\t25109 - 11905: 0xE3DE,\n\t25110 - 11905: 0xBBF2,\n\t25111 - 11905: 0xEAA8,\n\t25112 - 11905: 0xD5BD,\n\t25113 - 11905: 0x91E3,\n\t25114 - 11905: 0xC6DD,\n\t25115 - 11905: 0xEAA9,\n\t25116 - 11905: 0x91E4,\n\t25117 - 11905: 0x91E5,\n\t25118 - 11905: 0x91E6,\n\t25119 - 11905: 0xEAAA,\n\t25120 - 11905: 0x91E7,\n\t25121 - 11905: 0xEAAC,\n\t25122 - 11905: 0xEAAB,\n\t25123 - 11905: 0x91E8,\n\t25124 - 11905: 0xEAAE,\n\t25125 - 11905: 0xEAAD,\n\t25126 - 11905: 0x91E9,\n\t25127 - 11905: 0x91EA,\n\t25128 - 11905: 0x91EB,\n\t25129 - 11905: 0x91EC,\n\t25130 - 11905: 0xBDD8,\n\t25131 - 11905: 0x91ED,\n\t25132 - 11905: 0xEAAF,\n\t25133 - 11905: 0x91EE,\n\t25134 - 11905: 0xC2BE,\n\t25135 - 11905: 0x91EF,\n\t25136 - 11905: 0x91F0,\n\t25137 - 11905: 0x91F1,\n\t25138 - 11905: 0x91F2,\n\t25139 - 11905: 0xB4C1,\n\t25140 - 11905: 0xB4F7,\n\t25141 - 11905: 0x91F3,\n\t25142 - 11905: 0x91F4,\n\t25143 - 11905: 0xBBA7,\n\t25144 - 11905: 0x91F5,\n\t25145 - 11905: 0x91F6,\n\t25146 - 11905: 0x91F7,\n\t25147 - 11905: 0x91F8,\n\t25148 - 11905: 0x91F9,\n\t25149 - 11905: 0xECE6,\n\t25150 - 11905: 0xECE5,\n\t25151 - 11905: 0xB7BF,\n\t25152 - 11905: 0xCBF9,\n\t25153 - 11905: 0xB1E2,\n\t25154 - 11905: 0x91FA,\n\t25155 - 11905: 0xECE7,\n\t25156 - 11905: 0x91FB,\n\t25157 - 11905: 0x91FC,\n\t25158 - 11905: 0x91FD,\n\t25159 - 11905: 0xC9C8,\n\t25160 - 11905: 0xECE8,\n\t25161 - 11905: 0xECE9,\n\t25162 - 11905: 0x91FE,\n\t25163 - 11905: 0xCAD6,\n\t25164 - 11905: 0xDED0,\n\t25165 - 11905: 0xB2C5,\n\t25166 - 11905: 0xD4FA,\n\t25167 - 11905: 0x9240,\n\t25168 - 11905: 0x9241,\n\t25169 - 11905: 0xC6CB,\n\t25170 - 11905: 0xB0C7,\n\t25171 - 11905: 0xB4F2,\n\t25172 - 11905: 0xC8D3,\n\t25173 - 11905: 0x9242,\n\t25174 - 11905: 0x9243,\n\t25175 - 11905: 0x9244,\n\t25176 - 11905: 0xCDD0,\n\t25177 - 11905: 0x9245,\n\t25178 - 11905: 0x9246,\n\t25179 - 11905: 0xBFB8,\n\t25180 - 11905: 0x9247,\n\t25181 - 11905: 0x9248,\n\t25182 - 11905: 0x9249,\n\t25183 - 11905: 0x924A,\n\t25184 - 11905: 0x924B,\n\t25185 - 11905: 0x924C,\n\t25186 - 11905: 0x924D,\n\t25187 - 11905: 0xBFDB,\n\t25188 - 11905: 0x924E,\n\t25189 - 11905: 0x924F,\n\t25190 - 11905: 0xC7A4,\n\t25191 - 11905: 0xD6B4,\n\t25192 - 11905: 0x9250,\n\t25193 - 11905: 0xC0A9,\n\t25194 - 11905: 0xDED1,\n\t25195 - 11905: 0xC9A8,\n\t25196 - 11905: 0xD1EF,\n\t25197 - 11905: 0xC5A4,\n\t25198 - 11905: 0xB0E7,\n\t25199 - 11905: 0xB3B6,\n\t25200 - 11905: 0xC8C5,\n\t25201 - 11905: 0x9251,\n\t25202 - 11905: 0x9252,\n\t25203 - 11905: 0xB0E2,\n\t25204 - 11905: 0x9253,\n\t25205 - 11905: 0x9254,\n\t25206 - 11905: 0xB7F6,\n\t25207 - 11905: 0x9255,\n\t25208 - 11905: 0x9256,\n\t25209 - 11905: 0xC5FA,\n\t25210 - 11905: 0x9257,\n\t25211 - 11905: 0x9258,\n\t25212 - 11905: 0xB6F3,\n\t25213 - 11905: 0x9259,\n\t25214 - 11905: 0xD5D2,\n\t25215 - 11905: 0xB3D0,\n\t25216 - 11905: 0xBCBC,\n\t25217 - 11905: 0x925A,\n\t25218 - 11905: 0x925B,\n\t25219 - 11905: 0x925C,\n\t25220 - 11905: 0xB3AD,\n\t25221 - 11905: 0x925D,\n\t25222 - 11905: 0x925E,\n\t25223 - 11905: 0x925F,\n\t25224 - 11905: 0x9260,\n\t25225 - 11905: 0xBEF1,\n\t25226 - 11905: 0xB0D1,\n\t25227 - 11905: 0x9261,\n\t25228 - 11905: 0x9262,\n\t25229 - 11905: 0x9263,\n\t25230 - 11905: 0x9264,\n\t25231 - 11905: 0x9265,\n\t25232 - 11905: 0x9266,\n\t25233 - 11905: 0xD2D6,\n\t25234 - 11905: 0xCAE3,\n\t25235 - 11905: 0xD7A5,\n\t25236 - 11905: 0x9267,\n\t25237 - 11905: 0xCDB6,\n\t25238 - 11905: 0xB6B6,\n\t25239 - 11905: 0xBFB9,\n\t25240 - 11905: 0xD5DB,\n\t25241 - 11905: 0x9268,\n\t25242 - 11905: 0xB8A7,\n\t25243 - 11905: 0xC5D7,\n\t25244 - 11905: 0x9269,\n\t25245 - 11905: 0x926A,\n\t25246 - 11905: 0x926B,\n\t25247 - 11905: 0xDED2,\n\t25248 - 11905: 0xBFD9,\n\t25249 - 11905: 0xC2D5,\n\t25250 - 11905: 0xC7C0,\n\t25251 - 11905: 0x926C,\n\t25252 - 11905: 0xBBA4,\n\t25253 - 11905: 0xB1A8,\n\t25254 - 11905: 0x926D,\n\t25255 - 11905: 0x926E,\n\t25256 - 11905: 0xC5EA,\n\t25257 - 11905: 0x926F,\n\t25258 - 11905: 0x9270,\n\t25259 - 11905: 0xC5FB,\n\t25260 - 11905: 0xCCA7,\n\t25261 - 11905: 0x9271,\n\t25262 - 11905: 0x9272,\n\t25263 - 11905: 0x9273,\n\t25264 - 11905: 0x9274,\n\t25265 - 11905: 0xB1A7,\n\t25266 - 11905: 0x9275,\n\t25267 - 11905: 0x9276,\n\t25268 - 11905: 0x9277,\n\t25269 - 11905: 0xB5D6,\n\t25270 - 11905: 0x9278,\n\t25271 - 11905: 0x9279,\n\t25272 - 11905: 0x927A,\n\t25273 - 11905: 0xC4A8,\n\t25274 - 11905: 0x927B,\n\t25275 - 11905: 0xDED3,\n\t25276 - 11905: 0xD1BA,\n\t25277 - 11905: 0xB3E9,\n\t25278 - 11905: 0x927C,\n\t25279 - 11905: 0xC3F2,\n\t25280 - 11905: 0x927D,\n\t25281 - 11905: 0x927E,\n\t25282 - 11905: 0xB7F7,\n\t25283 - 11905: 0x9280,\n\t25284 - 11905: 0xD6F4,\n\t25285 - 11905: 0xB5A3,\n\t25286 - 11905: 0xB2F0,\n\t25287 - 11905: 0xC4B4,\n\t25288 - 11905: 0xC4E9,\n\t25289 - 11905: 0xC0AD,\n\t25290 - 11905: 0xDED4,\n\t25291 - 11905: 0x9281,\n\t25292 - 11905: 0xB0E8,\n\t25293 - 11905: 0xC5C4,\n\t25294 - 11905: 0xC1E0,\n\t25295 - 11905: 0x9282,\n\t25296 - 11905: 0xB9D5,\n\t25297 - 11905: 0x9283,\n\t25298 - 11905: 0xBEDC,\n\t25299 - 11905: 0xCDD8,\n\t25300 - 11905: 0xB0CE,\n\t25301 - 11905: 0x9284,\n\t25302 - 11905: 0xCDCF,\n\t25303 - 11905: 0xDED6,\n\t25304 - 11905: 0xBED0,\n\t25305 - 11905: 0xD7BE,\n\t25306 - 11905: 0xDED5,\n\t25307 - 11905: 0xD5D0,\n\t25308 - 11905: 0xB0DD,\n\t25309 - 11905: 0x9285,\n\t25310 - 11905: 0x9286,\n\t25311 - 11905: 0xC4E2,\n\t25312 - 11905: 0x9287,\n\t25313 - 11905: 0x9288,\n\t25314 - 11905: 0xC2A3,\n\t25315 - 11905: 0xBCF0,\n\t25316 - 11905: 0x9289,\n\t25317 - 11905: 0xD3B5,\n\t25318 - 11905: 0xC0B9,\n\t25319 - 11905: 0xC5A1,\n\t25320 - 11905: 0xB2A6,\n\t25321 - 11905: 0xD4F1,\n\t25322 - 11905: 0x928A,\n\t25323 - 11905: 0x928B,\n\t25324 - 11905: 0xC0A8,\n\t25325 - 11905: 0xCAC3,\n\t25326 - 11905: 0xDED7,\n\t25327 - 11905: 0xD5FC,\n\t25328 - 11905: 0x928C,\n\t25329 - 11905: 0xB9B0,\n\t25330 - 11905: 0x928D,\n\t25331 - 11905: 0xC8AD,\n\t25332 - 11905: 0xCBA9,\n\t25333 - 11905: 0x928E,\n\t25334 - 11905: 0xDED9,\n\t25335 - 11905: 0xBFBD,\n\t25336 - 11905: 0x928F,\n\t25337 - 11905: 0x9290,\n\t25338 - 11905: 0x9291,\n\t25339 - 11905: 0x9292,\n\t25340 - 11905: 0xC6B4,\n\t25341 - 11905: 0xD7A7,\n\t25342 - 11905: 0xCAB0,\n\t25343 - 11905: 0xC4C3,\n\t25344 - 11905: 0x9293,\n\t25345 - 11905: 0xB3D6,\n\t25346 - 11905: 0xB9D2,\n\t25347 - 11905: 0x9294,\n\t25348 - 11905: 0x9295,\n\t25349 - 11905: 0x9296,\n\t25350 - 11905: 0x9297,\n\t25351 - 11905: 0xD6B8,\n\t25352 - 11905: 0xEAFC,\n\t25353 - 11905: 0xB0B4,\n\t25354 - 11905: 0x9298,\n\t25355 - 11905: 0x9299,\n\t25356 - 11905: 0x929A,\n\t25357 - 11905: 0x929B,\n\t25358 - 11905: 0xBFE6,\n\t25359 - 11905: 0x929C,\n\t25360 - 11905: 0x929D,\n\t25361 - 11905: 0xCCF4,\n\t25362 - 11905: 0x929E,\n\t25363 - 11905: 0x929F,\n\t25364 - 11905: 0x92A0,\n\t25365 - 11905: 0x92A1,\n\t25366 - 11905: 0xCDDA,\n\t25367 - 11905: 0x92A2,\n\t25368 - 11905: 0x92A3,\n\t25369 - 11905: 0x92A4,\n\t25370 - 11905: 0xD6BF,\n\t25371 - 11905: 0xC2CE,\n\t25372 - 11905: 0x92A5,\n\t25373 - 11905: 0xCECE,\n\t25374 - 11905: 0xCCA2,\n\t25375 - 11905: 0xD0AE,\n\t25376 - 11905: 0xC4D3,\n\t25377 - 11905: 0xB5B2,\n\t25378 - 11905: 0xDED8,\n\t25379 - 11905: 0xD5F5,\n\t25380 - 11905: 0xBCB7,\n\t25381 - 11905: 0xBBD3,\n\t25382 - 11905: 0x92A6,\n\t25383 - 11905: 0x92A7,\n\t25384 - 11905: 0xB0A4,\n\t25385 - 11905: 0x92A8,\n\t25386 - 11905: 0xC5B2,\n\t25387 - 11905: 0xB4EC,\n\t25388 - 11905: 0x92A9,\n\t25389 - 11905: 0x92AA,\n\t25390 - 11905: 0x92AB,\n\t25391 - 11905: 0xD5F1,\n\t25392 - 11905: 0x92AC,\n\t25393 - 11905: 0x92AD,\n\t25394 - 11905: 0xEAFD,\n\t25395 - 11905: 0x92AE,\n\t25396 - 11905: 0x92AF,\n\t25397 - 11905: 0x92B0,\n\t25398 - 11905: 0x92B1,\n\t25399 - 11905: 0x92B2,\n\t25400 - 11905: 0x92B3,\n\t25401 - 11905: 0xDEDA,\n\t25402 - 11905: 0xCDA6,\n\t25403 - 11905: 0x92B4,\n\t25404 - 11905: 0x92B5,\n\t25405 - 11905: 0xCDEC,\n\t25406 - 11905: 0x92B6,\n\t25407 - 11905: 0x92B7,\n\t25408 - 11905: 0x92B8,\n\t25409 - 11905: 0x92B9,\n\t25410 - 11905: 0xCEE6,\n\t25411 - 11905: 0xDEDC,\n\t25412 - 11905: 0x92BA,\n\t25413 - 11905: 0xCDB1,\n\t25414 - 11905: 0xC0A6,\n\t25415 - 11905: 0x92BB,\n\t25416 - 11905: 0x92BC,\n\t25417 - 11905: 0xD7BD,\n\t25418 - 11905: 0x92BD,\n\t25419 - 11905: 0xDEDB,\n\t25420 - 11905: 0xB0C6,\n\t25421 - 11905: 0xBAB4,\n\t25422 - 11905: 0xC9D3,\n\t25423 - 11905: 0xC4F3,\n\t25424 - 11905: 0xBEE8,\n\t25425 - 11905: 0x92BE,\n\t25426 - 11905: 0x92BF,\n\t25427 - 11905: 0x92C0,\n\t25428 - 11905: 0x92C1,\n\t25429 - 11905: 0xB2B6,\n\t25430 - 11905: 0x92C2,\n\t25431 - 11905: 0x92C3,\n\t25432 - 11905: 0x92C4,\n\t25433 - 11905: 0x92C5,\n\t25434 - 11905: 0x92C6,\n\t25435 - 11905: 0x92C7,\n\t25436 - 11905: 0x92C8,\n\t25437 - 11905: 0x92C9,\n\t25438 - 11905: 0xC0CC,\n\t25439 - 11905: 0xCBF0,\n\t25440 - 11905: 0x92CA,\n\t25441 - 11905: 0xBCF1,\n\t25442 - 11905: 0xBBBB,\n\t25443 - 11905: 0xB5B7,\n\t25444 - 11905: 0x92CB,\n\t25445 - 11905: 0x92CC,\n\t25446 - 11905: 0x92CD,\n\t25447 - 11905: 0xC5F5,\n\t25448 - 11905: 0x92CE,\n\t25449 - 11905: 0xDEE6,\n\t25450 - 11905: 0x92CF,\n\t25451 - 11905: 0x92D0,\n\t25452 - 11905: 0x92D1,\n\t25453 - 11905: 0xDEE3,\n\t25454 - 11905: 0xBEDD,\n\t25455 - 11905: 0x92D2,\n\t25456 - 11905: 0x92D3,\n\t25457 - 11905: 0xDEDF,\n\t25458 - 11905: 0x92D4,\n\t25459 - 11905: 0x92D5,\n\t25460 - 11905: 0x92D6,\n\t25461 - 11905: 0x92D7,\n\t25462 - 11905: 0xB4B7,\n\t25463 - 11905: 0xBDDD,\n\t25464 - 11905: 0x92D8,\n\t25465 - 11905: 0x92D9,\n\t25466 - 11905: 0xDEE0,\n\t25467 - 11905: 0xC4ED,\n\t25468 - 11905: 0x92DA,\n\t25469 - 11905: 0x92DB,\n\t25470 - 11905: 0x92DC,\n\t25471 - 11905: 0x92DD,\n\t25472 - 11905: 0xCFC6,\n\t25473 - 11905: 0x92DE,\n\t25474 - 11905: 0xB5E0,\n\t25475 - 11905: 0x92DF,\n\t25476 - 11905: 0x92E0,\n\t25477 - 11905: 0x92E1,\n\t25478 - 11905: 0x92E2,\n\t25479 - 11905: 0xB6DE,\n\t25480 - 11905: 0xCADA,\n\t25481 - 11905: 0xB5F4,\n\t25482 - 11905: 0xDEE5,\n\t25483 - 11905: 0x92E3,\n\t25484 - 11905: 0xD5C6,\n\t25485 - 11905: 0x92E4,\n\t25486 - 11905: 0xDEE1,\n\t25487 - 11905: 0xCCCD,\n\t25488 - 11905: 0xC6FE,\n\t25489 - 11905: 0x92E5,\n\t25490 - 11905: 0xC5C5,\n\t25491 - 11905: 0x92E6,\n\t25492 - 11905: 0x92E7,\n\t25493 - 11905: 0x92E8,\n\t25494 - 11905: 0xD2B4,\n\t25495 - 11905: 0x92E9,\n\t25496 - 11905: 0xBEF2,\n\t25497 - 11905: 0x92EA,\n\t25498 - 11905: 0x92EB,\n\t25499 - 11905: 0x92EC,\n\t25500 - 11905: 0x92ED,\n\t25501 - 11905: 0x92EE,\n\t25502 - 11905: 0x92EF,\n\t25503 - 11905: 0x92F0,\n\t25504 - 11905: 0xC2D3,\n\t25505 - 11905: 0x92F1,\n\t25506 - 11905: 0xCCBD,\n\t25507 - 11905: 0xB3B8,\n\t25508 - 11905: 0x92F2,\n\t25509 - 11905: 0xBDD3,\n\t25510 - 11905: 0x92F3,\n\t25511 - 11905: 0xBFD8,\n\t25512 - 11905: 0xCDC6,\n\t25513 - 11905: 0xD1DA,\n\t25514 - 11905: 0xB4EB,\n\t25515 - 11905: 0x92F4,\n\t25516 - 11905: 0xDEE4,\n\t25517 - 11905: 0xDEDD,\n\t25518 - 11905: 0xDEE7,\n\t25519 - 11905: 0x92F5,\n\t25520 - 11905: 0xEAFE,\n\t25521 - 11905: 0x92F6,\n\t25522 - 11905: 0x92F7,\n\t25523 - 11905: 0xC2B0,\n\t25524 - 11905: 0xDEE2,\n\t25525 - 11905: 0x92F8,\n\t25526 - 11905: 0x92F9,\n\t25527 - 11905: 0xD6C0,\n\t25528 - 11905: 0xB5A7,\n\t25529 - 11905: 0x92FA,\n\t25530 - 11905: 0xB2F4,\n\t25531 - 11905: 0x92FB,\n\t25532 - 11905: 0xDEE8,\n\t25533 - 11905: 0x92FC,\n\t25534 - 11905: 0xDEF2,\n\t25535 - 11905: 0x92FD,\n\t25536 - 11905: 0x92FE,\n\t25537 - 11905: 0x9340,\n\t25538 - 11905: 0x9341,\n\t25539 - 11905: 0x9342,\n\t25540 - 11905: 0xDEED,\n\t25541 - 11905: 0x9343,\n\t25542 - 11905: 0xDEF1,\n\t25543 - 11905: 0x9344,\n\t25544 - 11905: 0x9345,\n\t25545 - 11905: 0xC8E0,\n\t25546 - 11905: 0x9346,\n\t25547 - 11905: 0x9347,\n\t25548 - 11905: 0x9348,\n\t25549 - 11905: 0xD7E1,\n\t25550 - 11905: 0xDEEF,\n\t25551 - 11905: 0xC3E8,\n\t25552 - 11905: 0xCCE1,\n\t25553 - 11905: 0x9349,\n\t25554 - 11905: 0xB2E5,\n\t25555 - 11905: 0x934A,\n\t25556 - 11905: 0x934B,\n\t25557 - 11905: 0x934C,\n\t25558 - 11905: 0xD2BE,\n\t25559 - 11905: 0x934D,\n\t25560 - 11905: 0x934E,\n\t25561 - 11905: 0x934F,\n\t25562 - 11905: 0x9350,\n\t25563 - 11905: 0x9351,\n\t25564 - 11905: 0x9352,\n\t25565 - 11905: 0x9353,\n\t25566 - 11905: 0xDEEE,\n\t25567 - 11905: 0x9354,\n\t25568 - 11905: 0xDEEB,\n\t25569 - 11905: 0xCED5,\n\t25570 - 11905: 0x9355,\n\t25571 - 11905: 0xB4A7,\n\t25572 - 11905: 0x9356,\n\t25573 - 11905: 0x9357,\n\t25574 - 11905: 0x9358,\n\t25575 - 11905: 0x9359,\n\t25576 - 11905: 0x935A,\n\t25577 - 11905: 0xBFAB,\n\t25578 - 11905: 0xBEBE,\n\t25579 - 11905: 0x935B,\n\t25580 - 11905: 0x935C,\n\t25581 - 11905: 0xBDD2,\n\t25582 - 11905: 0x935D,\n\t25583 - 11905: 0x935E,\n\t25584 - 11905: 0x935F,\n\t25585 - 11905: 0x9360,\n\t25586 - 11905: 0xDEE9,\n\t25587 - 11905: 0x9361,\n\t25588 - 11905: 0xD4AE,\n\t25589 - 11905: 0x9362,\n\t25590 - 11905: 0xDEDE,\n\t25591 - 11905: 0x9363,\n\t25592 - 11905: 0xDEEA,\n\t25593 - 11905: 0x9364,\n\t25594 - 11905: 0x9365,\n\t25595 - 11905: 0x9366,\n\t25596 - 11905: 0x9367,\n\t25597 - 11905: 0xC0BF,\n\t25598 - 11905: 0x9368,\n\t25599 - 11905: 0xDEEC,\n\t25600 - 11905: 0xB2F3,\n\t25601 - 11905: 0xB8E9,\n\t25602 - 11905: 0xC2A7,\n\t25603 - 11905: 0x9369,\n\t25604 - 11905: 0x936A,\n\t25605 - 11905: 0xBDC1,\n\t25606 - 11905: 0x936B,\n\t25607 - 11905: 0x936C,\n\t25608 - 11905: 0x936D,\n\t25609 - 11905: 0x936E,\n\t25610 - 11905: 0x936F,\n\t25611 - 11905: 0xDEF5,\n\t25612 - 11905: 0xDEF8,\n\t25613 - 11905: 0x9370,\n\t25614 - 11905: 0x9371,\n\t25615 - 11905: 0xB2AB,\n\t25616 - 11905: 0xB4A4,\n\t25617 - 11905: 0x9372,\n\t25618 - 11905: 0x9373,\n\t25619 - 11905: 0xB4EA,\n\t25620 - 11905: 0xC9A6,\n\t25621 - 11905: 0x9374,\n\t25622 - 11905: 0x9375,\n\t25623 - 11905: 0x9376,\n\t25624 - 11905: 0x9377,\n\t25625 - 11905: 0x9378,\n\t25626 - 11905: 0x9379,\n\t25627 - 11905: 0xDEF6,\n\t25628 - 11905: 0xCBD1,\n\t25629 - 11905: 0x937A,\n\t25630 - 11905: 0xB8E3,\n\t25631 - 11905: 0x937B,\n\t25632 - 11905: 0xDEF7,\n\t25633 - 11905: 0xDEFA,\n\t25634 - 11905: 0x937C,\n\t25635 - 11905: 0x937D,\n\t25636 - 11905: 0x937E,\n\t25637 - 11905: 0x9380,\n\t25638 - 11905: 0xDEF9,\n\t25639 - 11905: 0x9381,\n\t25640 - 11905: 0x9382,\n\t25641 - 11905: 0x9383,\n\t25642 - 11905: 0xCCC2,\n\t25643 - 11905: 0x9384,\n\t25644 - 11905: 0xB0E1,\n\t25645 - 11905: 0xB4EE,\n\t25646 - 11905: 0x9385,\n\t25647 - 11905: 0x9386,\n\t25648 - 11905: 0x9387,\n\t25649 - 11905: 0x9388,\n\t25650 - 11905: 0x9389,\n\t25651 - 11905: 0x938A,\n\t25652 - 11905: 0xE5BA,\n\t25653 - 11905: 0x938B,\n\t25654 - 11905: 0x938C,\n\t25655 - 11905: 0x938D,\n\t25656 - 11905: 0x938E,\n\t25657 - 11905: 0x938F,\n\t25658 - 11905: 0xD0AF,\n\t25659 - 11905: 0x9390,\n\t25660 - 11905: 0x9391,\n\t25661 - 11905: 0xB2EB,\n\t25662 - 11905: 0x9392,\n\t25663 - 11905: 0xEBA1,\n\t25664 - 11905: 0x9393,\n\t25665 - 11905: 0xDEF4,\n\t25666 - 11905: 0x9394,\n\t25667 - 11905: 0x9395,\n\t25668 - 11905: 0xC9E3,\n\t25669 - 11905: 0xDEF3,\n\t25670 - 11905: 0xB0DA,\n\t25671 - 11905: 0xD2A1,\n\t25672 - 11905: 0xB1F7,\n\t25673 - 11905: 0x9396,\n\t25674 - 11905: 0xCCAF,\n\t25675 - 11905: 0x9397,\n\t25676 - 11905: 0x9398,\n\t25677 - 11905: 0x9399,\n\t25678 - 11905: 0x939A,\n\t25679 - 11905: 0x939B,\n\t25680 - 11905: 0x939C,\n\t25681 - 11905: 0x939D,\n\t25682 - 11905: 0xDEF0,\n\t25683 - 11905: 0x939E,\n\t25684 - 11905: 0xCBA4,\n\t25685 - 11905: 0x939F,\n\t25686 - 11905: 0x93A0,\n\t25687 - 11905: 0x93A1,\n\t25688 - 11905: 0xD5AA,\n\t25689 - 11905: 0x93A2,\n\t25690 - 11905: 0x93A3,\n\t25691 - 11905: 0x93A4,\n\t25692 - 11905: 0x93A5,\n\t25693 - 11905: 0x93A6,\n\t25694 - 11905: 0xDEFB,\n\t25695 - 11905: 0x93A7,\n\t25696 - 11905: 0x93A8,\n\t25697 - 11905: 0x93A9,\n\t25698 - 11905: 0x93AA,\n\t25699 - 11905: 0x93AB,\n\t25700 - 11905: 0x93AC,\n\t25701 - 11905: 0x93AD,\n\t25702 - 11905: 0x93AE,\n\t25703 - 11905: 0xB4DD,\n\t25704 - 11905: 0x93AF,\n\t25705 - 11905: 0xC4A6,\n\t25706 - 11905: 0x93B0,\n\t25707 - 11905: 0x93B1,\n\t25708 - 11905: 0x93B2,\n\t25709 - 11905: 0xDEFD,\n\t25710 - 11905: 0x93B3,\n\t25711 - 11905: 0x93B4,\n\t25712 - 11905: 0x93B5,\n\t25713 - 11905: 0x93B6,\n\t25714 - 11905: 0x93B7,\n\t25715 - 11905: 0x93B8,\n\t25716 - 11905: 0x93B9,\n\t25717 - 11905: 0x93BA,\n\t25718 - 11905: 0x93BB,\n\t25719 - 11905: 0x93BC,\n\t25720 - 11905: 0xC3FE,\n\t25721 - 11905: 0xC4A1,\n\t25722 - 11905: 0xDFA1,\n\t25723 - 11905: 0x93BD,\n\t25724 - 11905: 0x93BE,\n\t25725 - 11905: 0x93BF,\n\t25726 - 11905: 0x93C0,\n\t25727 - 11905: 0x93C1,\n\t25728 - 11905: 0x93C2,\n\t25729 - 11905: 0x93C3,\n\t25730 - 11905: 0xC1CC,\n\t25731 - 11905: 0x93C4,\n\t25732 - 11905: 0xDEFC,\n\t25733 - 11905: 0xBEEF,\n\t25734 - 11905: 0x93C5,\n\t25735 - 11905: 0xC6B2,\n\t25736 - 11905: 0x93C6,\n\t25737 - 11905: 0x93C7,\n\t25738 - 11905: 0x93C8,\n\t25739 - 11905: 0x93C9,\n\t25740 - 11905: 0x93CA,\n\t25741 - 11905: 0x93CB,\n\t25742 - 11905: 0x93CC,\n\t25743 - 11905: 0x93CD,\n\t25744 - 11905: 0x93CE,\n\t25745 - 11905: 0xB3C5,\n\t25746 - 11905: 0xC8F6,\n\t25747 - 11905: 0x93CF,\n\t25748 - 11905: 0x93D0,\n\t25749 - 11905: 0xCBBA,\n\t25750 - 11905: 0xDEFE,\n\t25751 - 11905: 0x93D1,\n\t25752 - 11905: 0x93D2,\n\t25753 - 11905: 0xDFA4,\n\t25754 - 11905: 0x93D3,\n\t25755 - 11905: 0x93D4,\n\t25756 - 11905: 0x93D5,\n\t25757 - 11905: 0x93D6,\n\t25758 - 11905: 0xD7B2,\n\t25759 - 11905: 0x93D7,\n\t25760 - 11905: 0x93D8,\n\t25761 - 11905: 0x93D9,\n\t25762 - 11905: 0x93DA,\n\t25763 - 11905: 0x93DB,\n\t25764 - 11905: 0xB3B7,\n\t25765 - 11905: 0x93DC,\n\t25766 - 11905: 0x93DD,\n\t25767 - 11905: 0x93DE,\n\t25768 - 11905: 0x93DF,\n\t25769 - 11905: 0xC1C3,\n\t25770 - 11905: 0x93E0,\n\t25771 - 11905: 0x93E1,\n\t25772 - 11905: 0xC7CB,\n\t25773 - 11905: 0xB2A5,\n\t25774 - 11905: 0xB4E9,\n\t25775 - 11905: 0x93E2,\n\t25776 - 11905: 0xD7AB,\n\t25777 - 11905: 0x93E3,\n\t25778 - 11905: 0x93E4,\n\t25779 - 11905: 0x93E5,\n\t25780 - 11905: 0x93E6,\n\t25781 - 11905: 0xC4EC,\n\t25782 - 11905: 0x93E7,\n\t25783 - 11905: 0xDFA2,\n\t25784 - 11905: 0xDFA3,\n\t25785 - 11905: 0x93E8,\n\t25786 - 11905: 0xDFA5,\n\t25787 - 11905: 0x93E9,\n\t25788 - 11905: 0xBAB3,\n\t25789 - 11905: 0x93EA,\n\t25790 - 11905: 0x93EB,\n\t25791 - 11905: 0x93EC,\n\t25792 - 11905: 0xDFA6,\n\t25793 - 11905: 0x93ED,\n\t25794 - 11905: 0xC0DE,\n\t25795 - 11905: 0x93EE,\n\t25796 - 11905: 0x93EF,\n\t25797 - 11905: 0xC9C3,\n\t25798 - 11905: 0x93F0,\n\t25799 - 11905: 0x93F1,\n\t25800 - 11905: 0x93F2,\n\t25801 - 11905: 0x93F3,\n\t25802 - 11905: 0x93F4,\n\t25803 - 11905: 0x93F5,\n\t25804 - 11905: 0x93F6,\n\t25805 - 11905: 0xB2D9,\n\t25806 - 11905: 0xC7E6,\n\t25807 - 11905: 0x93F7,\n\t25808 - 11905: 0xDFA7,\n\t25809 - 11905: 0x93F8,\n\t25810 - 11905: 0xC7DC,\n\t25811 - 11905: 0x93F9,\n\t25812 - 11905: 0x93FA,\n\t25813 - 11905: 0x93FB,\n\t25814 - 11905: 0x93FC,\n\t25815 - 11905: 0xDFA8,\n\t25816 - 11905: 0xEBA2,\n\t25817 - 11905: 0x93FD,\n\t25818 - 11905: 0x93FE,\n\t25819 - 11905: 0x9440,\n\t25820 - 11905: 0x9441,\n\t25821 - 11905: 0x9442,\n\t25822 - 11905: 0xCBD3,\n\t25823 - 11905: 0x9443,\n\t25824 - 11905: 0x9444,\n\t25825 - 11905: 0x9445,\n\t25826 - 11905: 0xDFAA,\n\t25827 - 11905: 0x9446,\n\t25828 - 11905: 0xDFA9,\n\t25829 - 11905: 0x9447,\n\t25830 - 11905: 0xB2C1,\n\t25831 - 11905: 0x9448,\n\t25832 - 11905: 0x9449,\n\t25833 - 11905: 0x944A,\n\t25834 - 11905: 0x944B,\n\t25835 - 11905: 0x944C,\n\t25836 - 11905: 0x944D,\n\t25837 - 11905: 0x944E,\n\t25838 - 11905: 0x944F,\n\t25839 - 11905: 0x9450,\n\t25840 - 11905: 0x9451,\n\t25841 - 11905: 0x9452,\n\t25842 - 11905: 0x9453,\n\t25843 - 11905: 0x9454,\n\t25844 - 11905: 0x9455,\n\t25845 - 11905: 0x9456,\n\t25846 - 11905: 0x9457,\n\t25847 - 11905: 0x9458,\n\t25848 - 11905: 0x9459,\n\t25849 - 11905: 0x945A,\n\t25850 - 11905: 0x945B,\n\t25851 - 11905: 0x945C,\n\t25852 - 11905: 0x945D,\n\t25853 - 11905: 0x945E,\n\t25854 - 11905: 0x945F,\n\t25855 - 11905: 0x9460,\n\t25856 - 11905: 0xC5CA,\n\t25857 - 11905: 0x9461,\n\t25858 - 11905: 0x9462,\n\t25859 - 11905: 0x9463,\n\t25860 - 11905: 0x9464,\n\t25861 - 11905: 0x9465,\n\t25862 - 11905: 0x9466,\n\t25863 - 11905: 0x9467,\n\t25864 - 11905: 0x9468,\n\t25865 - 11905: 0xDFAB,\n\t25866 - 11905: 0x9469,\n\t25867 - 11905: 0x946A,\n\t25868 - 11905: 0x946B,\n\t25869 - 11905: 0x946C,\n\t25870 - 11905: 0x946D,\n\t25871 - 11905: 0x946E,\n\t25872 - 11905: 0x946F,\n\t25873 - 11905: 0x9470,\n\t25874 - 11905: 0xD4DC,\n\t25875 - 11905: 0x9471,\n\t25876 - 11905: 0x9472,\n\t25877 - 11905: 0x9473,\n\t25878 - 11905: 0x9474,\n\t25879 - 11905: 0x9475,\n\t25880 - 11905: 0xC8C1,\n\t25881 - 11905: 0x9476,\n\t25882 - 11905: 0x9477,\n\t25883 - 11905: 0x9478,\n\t25884 - 11905: 0x9479,\n\t25885 - 11905: 0x947A,\n\t25886 - 11905: 0x947B,\n\t25887 - 11905: 0x947C,\n\t25888 - 11905: 0x947D,\n\t25889 - 11905: 0x947E,\n\t25890 - 11905: 0x9480,\n\t25891 - 11905: 0x9481,\n\t25892 - 11905: 0x9482,\n\t25893 - 11905: 0xDFAC,\n\t25894 - 11905: 0x9483,\n\t25895 - 11905: 0x9484,\n\t25896 - 11905: 0x9485,\n\t25897 - 11905: 0x9486,\n\t25898 - 11905: 0x9487,\n\t25899 - 11905: 0xBEF0,\n\t25900 - 11905: 0x9488,\n\t25901 - 11905: 0x9489,\n\t25902 - 11905: 0xDFAD,\n\t25903 - 11905: 0xD6A7,\n\t25904 - 11905: 0x948A,\n\t25905 - 11905: 0x948B,\n\t25906 - 11905: 0x948C,\n\t25907 - 11905: 0x948D,\n\t25908 - 11905: 0xEAB7,\n\t25909 - 11905: 0xEBB6,\n\t25910 - 11905: 0xCAD5,\n\t25911 - 11905: 0x948E,\n\t25912 - 11905: 0xD8FC,\n\t25913 - 11905: 0xB8C4,\n\t25914 - 11905: 0x948F,\n\t25915 - 11905: 0xB9A5,\n\t25916 - 11905: 0x9490,\n\t25917 - 11905: 0x9491,\n\t25918 - 11905: 0xB7C5,\n\t25919 - 11905: 0xD5FE,\n\t25920 - 11905: 0x9492,\n\t25921 - 11905: 0x9493,\n\t25922 - 11905: 0x9494,\n\t25923 - 11905: 0x9495,\n\t25924 - 11905: 0x9496,\n\t25925 - 11905: 0xB9CA,\n\t25926 - 11905: 0x9497,\n\t25927 - 11905: 0x9498,\n\t25928 - 11905: 0xD0A7,\n\t25929 - 11905: 0xF4CD,\n\t25930 - 11905: 0x9499,\n\t25931 - 11905: 0x949A,\n\t25932 - 11905: 0xB5D0,\n\t25933 - 11905: 0x949B,\n\t25934 - 11905: 0x949C,\n\t25935 - 11905: 0xC3F4,\n\t25936 - 11905: 0x949D,\n\t25937 - 11905: 0xBEC8,\n\t25938 - 11905: 0x949E,\n\t25939 - 11905: 0x949F,\n\t25940 - 11905: 0x94A0,\n\t25941 - 11905: 0xEBB7,\n\t25942 - 11905: 0xB0BD,\n\t25943 - 11905: 0x94A1,\n\t25944 - 11905: 0x94A2,\n\t25945 - 11905: 0xBDCC,\n\t25946 - 11905: 0x94A3,\n\t25947 - 11905: 0xC1B2,\n\t25948 - 11905: 0x94A4,\n\t25949 - 11905: 0xB1D6,\n\t25950 - 11905: 0xB3A8,\n\t25951 - 11905: 0x94A5,\n\t25952 - 11905: 0x94A6,\n\t25953 - 11905: 0x94A7,\n\t25954 - 11905: 0xB8D2,\n\t25955 - 11905: 0xC9A2,\n\t25956 - 11905: 0x94A8,\n\t25957 - 11905: 0x94A9,\n\t25958 - 11905: 0xB6D8,\n\t25959 - 11905: 0x94AA,\n\t25960 - 11905: 0x94AB,\n\t25961 - 11905: 0x94AC,\n\t25962 - 11905: 0x94AD,\n\t25963 - 11905: 0xEBB8,\n\t25964 - 11905: 0xBEB4,\n\t25965 - 11905: 0x94AE,\n\t25966 - 11905: 0x94AF,\n\t25967 - 11905: 0x94B0,\n\t25968 - 11905: 0xCAFD,\n\t25969 - 11905: 0x94B1,\n\t25970 - 11905: 0xC7C3,\n\t25971 - 11905: 0x94B2,\n\t25972 - 11905: 0xD5FB,\n\t25973 - 11905: 0x94B3,\n\t25974 - 11905: 0x94B4,\n\t25975 - 11905: 0xB7F3,\n\t25976 - 11905: 0x94B5,\n\t25977 - 11905: 0x94B6,\n\t25978 - 11905: 0x94B7,\n\t25979 - 11905: 0x94B8,\n\t25980 - 11905: 0x94B9,\n\t25981 - 11905: 0x94BA,\n\t25982 - 11905: 0x94BB,\n\t25983 - 11905: 0x94BC,\n\t25984 - 11905: 0x94BD,\n\t25985 - 11905: 0x94BE,\n\t25986 - 11905: 0x94BF,\n\t25987 - 11905: 0x94C0,\n\t25988 - 11905: 0x94C1,\n\t25989 - 11905: 0x94C2,\n\t25990 - 11905: 0x94C3,\n\t25991 - 11905: 0xCEC4,\n\t25992 - 11905: 0x94C4,\n\t25993 - 11905: 0x94C5,\n\t25994 - 11905: 0x94C6,\n\t25995 - 11905: 0xD5AB,\n\t25996 - 11905: 0xB1F3,\n\t25997 - 11905: 0x94C7,\n\t25998 - 11905: 0x94C8,\n\t25999 - 11905: 0x94C9,\n\t26000 - 11905: 0xECB3,\n\t26001 - 11905: 0xB0DF,\n\t26002 - 11905: 0x94CA,\n\t26003 - 11905: 0xECB5,\n\t26004 - 11905: 0x94CB,\n\t26005 - 11905: 0x94CC,\n\t26006 - 11905: 0x94CD,\n\t26007 - 11905: 0xB6B7,\n\t26008 - 11905: 0x94CE,\n\t26009 - 11905: 0xC1CF,\n\t26010 - 11905: 0x94CF,\n\t26011 - 11905: 0xF5FA,\n\t26012 - 11905: 0xD0B1,\n\t26013 - 11905: 0x94D0,\n\t26014 - 11905: 0x94D1,\n\t26015 - 11905: 0xD5E5,\n\t26016 - 11905: 0x94D2,\n\t26017 - 11905: 0xCED3,\n\t26018 - 11905: 0x94D3,\n\t26019 - 11905: 0x94D4,\n\t26020 - 11905: 0xBDEF,\n\t26021 - 11905: 0xB3E2,\n\t26022 - 11905: 0x94D5,\n\t26023 - 11905: 0xB8AB,\n\t26024 - 11905: 0x94D6,\n\t26025 - 11905: 0xD5B6,\n\t26026 - 11905: 0x94D7,\n\t26027 - 11905: 0xEDBD,\n\t26028 - 11905: 0x94D8,\n\t26029 - 11905: 0xB6CF,\n\t26030 - 11905: 0x94D9,\n\t26031 - 11905: 0xCBB9,\n\t26032 - 11905: 0xD0C2,\n\t26033 - 11905: 0x94DA,\n\t26034 - 11905: 0x94DB,\n\t26035 - 11905: 0x94DC,\n\t26036 - 11905: 0x94DD,\n\t26037 - 11905: 0x94DE,\n\t26038 - 11905: 0x94DF,\n\t26039 - 11905: 0x94E0,\n\t26040 - 11905: 0x94E1,\n\t26041 - 11905: 0xB7BD,\n\t26042 - 11905: 0x94E2,\n\t26043 - 11905: 0x94E3,\n\t26044 - 11905: 0xECB6,\n\t26045 - 11905: 0xCAA9,\n\t26046 - 11905: 0x94E4,\n\t26047 - 11905: 0x94E5,\n\t26048 - 11905: 0x94E6,\n\t26049 - 11905: 0xC5D4,\n\t26050 - 11905: 0x94E7,\n\t26051 - 11905: 0xECB9,\n\t26052 - 11905: 0xECB8,\n\t26053 - 11905: 0xC2C3,\n\t26054 - 11905: 0xECB7,\n\t26055 - 11905: 0x94E8,\n\t26056 - 11905: 0x94E9,\n\t26057 - 11905: 0x94EA,\n\t26058 - 11905: 0x94EB,\n\t26059 - 11905: 0xD0FD,\n\t26060 - 11905: 0xECBA,\n\t26061 - 11905: 0x94EC,\n\t26062 - 11905: 0xECBB,\n\t26063 - 11905: 0xD7E5,\n\t26064 - 11905: 0x94ED,\n\t26065 - 11905: 0x94EE,\n\t26066 - 11905: 0xECBC,\n\t26067 - 11905: 0x94EF,\n\t26068 - 11905: 0x94F0,\n\t26069 - 11905: 0x94F1,\n\t26070 - 11905: 0xECBD,\n\t26071 - 11905: 0xC6EC,\n\t26072 - 11905: 0x94F2,\n\t26073 - 11905: 0x94F3,\n\t26074 - 11905: 0x94F4,\n\t26075 - 11905: 0x94F5,\n\t26076 - 11905: 0x94F6,\n\t26077 - 11905: 0x94F7,\n\t26078 - 11905: 0x94F8,\n\t26079 - 11905: 0x94F9,\n\t26080 - 11905: 0xCEDE,\n\t26081 - 11905: 0x94FA,\n\t26082 - 11905: 0xBCC8,\n\t26083 - 11905: 0x94FB,\n\t26084 - 11905: 0x94FC,\n\t26085 - 11905: 0xC8D5,\n\t26086 - 11905: 0xB5A9,\n\t26087 - 11905: 0xBEC9,\n\t26088 - 11905: 0xD6BC,\n\t26089 - 11905: 0xD4E7,\n\t26090 - 11905: 0x94FD,\n\t26091 - 11905: 0x94FE,\n\t26092 - 11905: 0xD1AE,\n\t26093 - 11905: 0xD0F1,\n\t26094 - 11905: 0xEAB8,\n\t26095 - 11905: 0xEAB9,\n\t26096 - 11905: 0xEABA,\n\t26097 - 11905: 0xBAB5,\n\t26098 - 11905: 0x9540,\n\t26099 - 11905: 0x9541,\n\t26100 - 11905: 0x9542,\n\t26101 - 11905: 0x9543,\n\t26102 - 11905: 0xCAB1,\n\t26103 - 11905: 0xBFF5,\n\t26104 - 11905: 0x9544,\n\t26105 - 11905: 0x9545,\n\t26106 - 11905: 0xCDFA,\n\t26107 - 11905: 0x9546,\n\t26108 - 11905: 0x9547,\n\t26109 - 11905: 0x9548,\n\t26110 - 11905: 0x9549,\n\t26111 - 11905: 0x954A,\n\t26112 - 11905: 0xEAC0,\n\t26113 - 11905: 0x954B,\n\t26114 - 11905: 0xB0BA,\n\t26115 - 11905: 0xEABE,\n\t26116 - 11905: 0x954C,\n\t26117 - 11905: 0x954D,\n\t26118 - 11905: 0xC0A5,\n\t26119 - 11905: 0x954E,\n\t26120 - 11905: 0x954F,\n\t26121 - 11905: 0x9550,\n\t26122 - 11905: 0xEABB,\n\t26123 - 11905: 0x9551,\n\t26124 - 11905: 0xB2FD,\n\t26125 - 11905: 0x9552,\n\t26126 - 11905: 0xC3F7,\n\t26127 - 11905: 0xBBE8,\n\t26128 - 11905: 0x9553,\n\t26129 - 11905: 0x9554,\n\t26130 - 11905: 0x9555,\n\t26131 - 11905: 0xD2D7,\n\t26132 - 11905: 0xCEF4,\n\t26133 - 11905: 0xEABF,\n\t26134 - 11905: 0x9556,\n\t26135 - 11905: 0x9557,\n\t26136 - 11905: 0x9558,\n\t26137 - 11905: 0xEABC,\n\t26138 - 11905: 0x9559,\n\t26139 - 11905: 0x955A,\n\t26140 - 11905: 0x955B,\n\t26141 - 11905: 0xEAC3,\n\t26142 - 11905: 0x955C,\n\t26143 - 11905: 0xD0C7,\n\t26144 - 11905: 0xD3B3,\n\t26145 - 11905: 0x955D,\n\t26146 - 11905: 0x955E,\n\t26147 - 11905: 0x955F,\n\t26148 - 11905: 0x9560,\n\t26149 - 11905: 0xB4BA,\n\t26150 - 11905: 0x9561,\n\t26151 - 11905: 0xC3C1,\n\t26152 - 11905: 0xD7F2,\n\t26153 - 11905: 0x9562,\n\t26154 - 11905: 0x9563,\n\t26155 - 11905: 0x9564,\n\t26156 - 11905: 0x9565,\n\t26157 - 11905: 0xD5D1,\n\t26158 - 11905: 0x9566,\n\t26159 - 11905: 0xCAC7,\n\t26160 - 11905: 0x9567,\n\t26161 - 11905: 0xEAC5,\n\t26162 - 11905: 0x9568,\n\t26163 - 11905: 0x9569,\n\t26164 - 11905: 0xEAC4,\n\t26165 - 11905: 0xEAC7,\n\t26166 - 11905: 0xEAC6,\n\t26167 - 11905: 0x956A,\n\t26168 - 11905: 0x956B,\n\t26169 - 11905: 0x956C,\n\t26170 - 11905: 0x956D,\n\t26171 - 11905: 0x956E,\n\t26172 - 11905: 0xD6E7,\n\t26173 - 11905: 0x956F,\n\t26174 - 11905: 0xCFD4,\n\t26175 - 11905: 0x9570,\n\t26176 - 11905: 0x9571,\n\t26177 - 11905: 0xEACB,\n\t26178 - 11905: 0x9572,\n\t26179 - 11905: 0xBBCE,\n\t26180 - 11905: 0x9573,\n\t26181 - 11905: 0x9574,\n\t26182 - 11905: 0x9575,\n\t26183 - 11905: 0x9576,\n\t26184 - 11905: 0x9577,\n\t26185 - 11905: 0x9578,\n\t26186 - 11905: 0x9579,\n\t26187 - 11905: 0xBDFA,\n\t26188 - 11905: 0xC9CE,\n\t26189 - 11905: 0x957A,\n\t26190 - 11905: 0x957B,\n\t26191 - 11905: 0xEACC,\n\t26192 - 11905: 0x957C,\n\t26193 - 11905: 0x957D,\n\t26194 - 11905: 0xC9B9,\n\t26195 - 11905: 0xCFFE,\n\t26196 - 11905: 0xEACA,\n\t26197 - 11905: 0xD4CE,\n\t26198 - 11905: 0xEACD,\n\t26199 - 11905: 0xEACF,\n\t26200 - 11905: 0x957E,\n\t26201 - 11905: 0x9580,\n\t26202 - 11905: 0xCDED,\n\t26203 - 11905: 0x9581,\n\t26204 - 11905: 0x9582,\n\t26205 - 11905: 0x9583,\n\t26206 - 11905: 0x9584,\n\t26207 - 11905: 0xEAC9,\n\t26208 - 11905: 0x9585,\n\t26209 - 11905: 0xEACE,\n\t26210 - 11905: 0x9586,\n\t26211 - 11905: 0x9587,\n\t26212 - 11905: 0xCEEE,\n\t26213 - 11905: 0x9588,\n\t26214 - 11905: 0xBBDE,\n\t26215 - 11905: 0x9589,\n\t26216 - 11905: 0xB3BF,\n\t26217 - 11905: 0x958A,\n\t26218 - 11905: 0x958B,\n\t26219 - 11905: 0x958C,\n\t26220 - 11905: 0x958D,\n\t26221 - 11905: 0x958E,\n\t26222 - 11905: 0xC6D5,\n\t26223 - 11905: 0xBEB0,\n\t26224 - 11905: 0xCEFA,\n\t26225 - 11905: 0x958F,\n\t26226 - 11905: 0x9590,\n\t26227 - 11905: 0x9591,\n\t26228 - 11905: 0xC7E7,\n\t26229 - 11905: 0x9592,\n\t26230 - 11905: 0xBEA7,\n\t26231 - 11905: 0xEAD0,\n\t26232 - 11905: 0x9593,\n\t26233 - 11905: 0x9594,\n\t26234 - 11905: 0xD6C7,\n\t26235 - 11905: 0x9595,\n\t26236 - 11905: 0x9596,\n\t26237 - 11905: 0x9597,\n\t26238 - 11905: 0xC1C0,\n\t26239 - 11905: 0x9598,\n\t26240 - 11905: 0x9599,\n\t26241 - 11905: 0x959A,\n\t26242 - 11905: 0xD4DD,\n\t26243 - 11905: 0x959B,\n\t26244 - 11905: 0xEAD1,\n\t26245 - 11905: 0x959C,\n\t26246 - 11905: 0x959D,\n\t26247 - 11905: 0xCFBE,\n\t26248 - 11905: 0x959E,\n\t26249 - 11905: 0x959F,\n\t26250 - 11905: 0x95A0,\n\t26251 - 11905: 0x95A1,\n\t26252 - 11905: 0xEAD2,\n\t26253 - 11905: 0x95A2,\n\t26254 - 11905: 0x95A3,\n\t26255 - 11905: 0x95A4,\n\t26256 - 11905: 0x95A5,\n\t26257 - 11905: 0xCAEE,\n\t26258 - 11905: 0x95A6,\n\t26259 - 11905: 0x95A7,\n\t26260 - 11905: 0x95A8,\n\t26261 - 11905: 0x95A9,\n\t26262 - 11905: 0xC5AF,\n\t26263 - 11905: 0xB0B5,\n\t26264 - 11905: 0x95AA,\n\t26265 - 11905: 0x95AB,\n\t26266 - 11905: 0x95AC,\n\t26267 - 11905: 0x95AD,\n\t26268 - 11905: 0x95AE,\n\t26269 - 11905: 0xEAD4,\n\t26270 - 11905: 0x95AF,\n\t26271 - 11905: 0x95B0,\n\t26272 - 11905: 0x95B1,\n\t26273 - 11905: 0x95B2,\n\t26274 - 11905: 0x95B3,\n\t26275 - 11905: 0x95B4,\n\t26276 - 11905: 0x95B5,\n\t26277 - 11905: 0x95B6,\n\t26278 - 11905: 0x95B7,\n\t26279 - 11905: 0xEAD3,\n\t26280 - 11905: 0xF4DF,\n\t26281 - 11905: 0x95B8,\n\t26282 - 11905: 0x95B9,\n\t26283 - 11905: 0x95BA,\n\t26284 - 11905: 0x95BB,\n\t26285 - 11905: 0x95BC,\n\t26286 - 11905: 0xC4BA,\n\t26287 - 11905: 0x95BD,\n\t26288 - 11905: 0x95BE,\n\t26289 - 11905: 0x95BF,\n\t26290 - 11905: 0x95C0,\n\t26291 - 11905: 0x95C1,\n\t26292 - 11905: 0xB1A9,\n\t26293 - 11905: 0x95C2,\n\t26294 - 11905: 0x95C3,\n\t26295 - 11905: 0x95C4,\n\t26296 - 11905: 0x95C5,\n\t26297 - 11905: 0xE5DF,\n\t26298 - 11905: 0x95C6,\n\t26299 - 11905: 0x95C7,\n\t26300 - 11905: 0x95C8,\n\t26301 - 11905: 0x95C9,\n\t26302 - 11905: 0xEAD5,\n\t26303 - 11905: 0x95CA,\n\t26304 - 11905: 0x95CB,\n\t26305 - 11905: 0x95CC,\n\t26306 - 11905: 0x95CD,\n\t26307 - 11905: 0x95CE,\n\t26308 - 11905: 0x95CF,\n\t26309 - 11905: 0x95D0,\n\t26310 - 11905: 0x95D1,\n\t26311 - 11905: 0x95D2,\n\t26312 - 11905: 0x95D3,\n\t26313 - 11905: 0x95D4,\n\t26314 - 11905: 0x95D5,\n\t26315 - 11905: 0x95D6,\n\t26316 - 11905: 0x95D7,\n\t26317 - 11905: 0x95D8,\n\t26318 - 11905: 0x95D9,\n\t26319 - 11905: 0x95DA,\n\t26320 - 11905: 0x95DB,\n\t26321 - 11905: 0x95DC,\n\t26322 - 11905: 0x95DD,\n\t26323 - 11905: 0x95DE,\n\t26324 - 11905: 0x95DF,\n\t26325 - 11905: 0x95E0,\n\t26326 - 11905: 0x95E1,\n\t26327 - 11905: 0x95E2,\n\t26328 - 11905: 0x95E3,\n\t26329 - 11905: 0xCAEF,\n\t26330 - 11905: 0x95E4,\n\t26331 - 11905: 0xEAD6,\n\t26332 - 11905: 0xEAD7,\n\t26333 - 11905: 0xC6D8,\n\t26334 - 11905: 0x95E5,\n\t26335 - 11905: 0x95E6,\n\t26336 - 11905: 0x95E7,\n\t26337 - 11905: 0x95E8,\n\t26338 - 11905: 0x95E9,\n\t26339 - 11905: 0x95EA,\n\t26340 - 11905: 0x95EB,\n\t26341 - 11905: 0x95EC,\n\t26342 - 11905: 0xEAD8,\n\t26343 - 11905: 0x95ED,\n\t26344 - 11905: 0x95EE,\n\t26345 - 11905: 0xEAD9,\n\t26346 - 11905: 0x95EF,\n\t26347 - 11905: 0x95F0,\n\t26348 - 11905: 0x95F1,\n\t26349 - 11905: 0x95F2,\n\t26350 - 11905: 0x95F3,\n\t26351 - 11905: 0x95F4,\n\t26352 - 11905: 0xD4BB,\n\t26353 - 11905: 0x95F5,\n\t26354 - 11905: 0xC7FA,\n\t26355 - 11905: 0xD2B7,\n\t26356 - 11905: 0xB8FC,\n\t26357 - 11905: 0x95F6,\n\t26358 - 11905: 0x95F7,\n\t26359 - 11905: 0xEAC2,\n\t26360 - 11905: 0x95F8,\n\t26361 - 11905: 0xB2DC,\n\t26362 - 11905: 0x95F9,\n\t26363 - 11905: 0x95FA,\n\t26364 - 11905: 0xC2FC,\n\t26365 - 11905: 0x95FB,\n\t26366 - 11905: 0xD4F8,\n\t26367 - 11905: 0xCCE6,\n\t26368 - 11905: 0xD7EE,\n\t26369 - 11905: 0x95FC,\n\t26370 - 11905: 0x95FD,\n\t26371 - 11905: 0x95FE,\n\t26372 - 11905: 0x9640,\n\t26373 - 11905: 0x9641,\n\t26374 - 11905: 0x9642,\n\t26375 - 11905: 0x9643,\n\t26376 - 11905: 0xD4C2,\n\t26377 - 11905: 0xD3D0,\n\t26378 - 11905: 0xEBC3,\n\t26379 - 11905: 0xC5F3,\n\t26380 - 11905: 0x9644,\n\t26381 - 11905: 0xB7FE,\n\t26382 - 11905: 0x9645,\n\t26383 - 11905: 0x9646,\n\t26384 - 11905: 0xEBD4,\n\t26385 - 11905: 0x9647,\n\t26386 - 11905: 0x9648,\n\t26387 - 11905: 0x9649,\n\t26388 - 11905: 0xCBB7,\n\t26389 - 11905: 0xEBDE,\n\t26390 - 11905: 0x964A,\n\t26391 - 11905: 0xC0CA,\n\t26392 - 11905: 0x964B,\n\t26393 - 11905: 0x964C,\n\t26394 - 11905: 0x964D,\n\t26395 - 11905: 0xCDFB,\n\t26396 - 11905: 0x964E,\n\t26397 - 11905: 0xB3AF,\n\t26398 - 11905: 0x964F,\n\t26399 - 11905: 0xC6DA,\n\t26400 - 11905: 0x9650,\n\t26401 - 11905: 0x9651,\n\t26402 - 11905: 0x9652,\n\t26403 - 11905: 0x9653,\n\t26404 - 11905: 0x9654,\n\t26405 - 11905: 0x9655,\n\t26406 - 11905: 0xEBFC,\n\t26407 - 11905: 0x9656,\n\t26408 - 11905: 0xC4BE,\n\t26409 - 11905: 0x9657,\n\t26410 - 11905: 0xCEB4,\n\t26411 - 11905: 0xC4A9,\n\t26412 - 11905: 0xB1BE,\n\t26413 - 11905: 0xD4FD,\n\t26414 - 11905: 0x9658,\n\t26415 - 11905: 0xCAF5,\n\t26416 - 11905: 0x9659,\n\t26417 - 11905: 0xD6EC,\n\t26418 - 11905: 0x965A,\n\t26419 - 11905: 0x965B,\n\t26420 - 11905: 0xC6D3,\n\t26421 - 11905: 0xB6E4,\n\t26422 - 11905: 0x965C,\n\t26423 - 11905: 0x965D,\n\t26424 - 11905: 0x965E,\n\t26425 - 11905: 0x965F,\n\t26426 - 11905: 0xBBFA,\n\t26427 - 11905: 0x9660,\n\t26428 - 11905: 0x9661,\n\t26429 - 11905: 0xD0E0,\n\t26430 - 11905: 0x9662,\n\t26431 - 11905: 0x9663,\n\t26432 - 11905: 0xC9B1,\n\t26433 - 11905: 0x9664,\n\t26434 - 11905: 0xD4D3,\n\t26435 - 11905: 0xC8A8,\n\t26436 - 11905: 0x9665,\n\t26437 - 11905: 0x9666,\n\t26438 - 11905: 0xB8CB,\n\t26439 - 11905: 0x9667,\n\t26440 - 11905: 0xE8BE,\n\t26441 - 11905: 0xC9BC,\n\t26442 - 11905: 0x9668,\n\t26443 - 11905: 0x9669,\n\t26444 - 11905: 0xE8BB,\n\t26445 - 11905: 0x966A,\n\t26446 - 11905: 0xC0EE,\n\t26447 - 11905: 0xD0D3,\n\t26448 - 11905: 0xB2C4,\n\t26449 - 11905: 0xB4E5,\n\t26450 - 11905: 0x966B,\n\t26451 - 11905: 0xE8BC,\n\t26452 - 11905: 0x966C,\n\t26453 - 11905: 0x966D,\n\t26454 - 11905: 0xD5C8,\n\t26455 - 11905: 0x966E,\n\t26456 - 11905: 0x966F,\n\t26457 - 11905: 0x9670,\n\t26458 - 11905: 0x9671,\n\t26459 - 11905: 0x9672,\n\t26460 - 11905: 0xB6C5,\n\t26461 - 11905: 0x9673,\n\t26462 - 11905: 0xE8BD,\n\t26463 - 11905: 0xCAF8,\n\t26464 - 11905: 0xB8DC,\n\t26465 - 11905: 0xCCF5,\n\t26466 - 11905: 0x9674,\n\t26467 - 11905: 0x9675,\n\t26468 - 11905: 0x9676,\n\t26469 - 11905: 0xC0B4,\n\t26470 - 11905: 0x9677,\n\t26471 - 11905: 0x9678,\n\t26472 - 11905: 0xD1EE,\n\t26473 - 11905: 0xE8BF,\n\t26474 - 11905: 0xE8C2,\n\t26475 - 11905: 0x9679,\n\t26476 - 11905: 0x967A,\n\t26477 - 11905: 0xBABC,\n\t26478 - 11905: 0x967B,\n\t26479 - 11905: 0xB1AD,\n\t26480 - 11905: 0xBDDC,\n\t26481 - 11905: 0x967C,\n\t26482 - 11905: 0xEABD,\n\t26483 - 11905: 0xE8C3,\n\t26484 - 11905: 0x967D,\n\t26485 - 11905: 0xE8C6,\n\t26486 - 11905: 0x967E,\n\t26487 - 11905: 0xE8CB,\n\t26488 - 11905: 0x9680,\n\t26489 - 11905: 0x9681,\n\t26490 - 11905: 0x9682,\n\t26491 - 11905: 0x9683,\n\t26492 - 11905: 0xE8CC,\n\t26493 - 11905: 0x9684,\n\t26494 - 11905: 0xCBC9,\n\t26495 - 11905: 0xB0E5,\n\t26496 - 11905: 0x9685,\n\t26497 - 11905: 0xBCAB,\n\t26498 - 11905: 0x9686,\n\t26499 - 11905: 0x9687,\n\t26500 - 11905: 0xB9B9,\n\t26501 - 11905: 0x9688,\n\t26502 - 11905: 0x9689,\n\t26503 - 11905: 0xE8C1,\n\t26504 - 11905: 0x968A,\n\t26505 - 11905: 0xCDF7,\n\t26506 - 11905: 0x968B,\n\t26507 - 11905: 0xE8CA,\n\t26508 - 11905: 0x968C,\n\t26509 - 11905: 0x968D,\n\t26510 - 11905: 0x968E,\n\t26511 - 11905: 0x968F,\n\t26512 - 11905: 0xCEF6,\n\t26513 - 11905: 0x9690,\n\t26514 - 11905: 0x9691,\n\t26515 - 11905: 0x9692,\n\t26516 - 11905: 0x9693,\n\t26517 - 11905: 0xD5ED,\n\t26518 - 11905: 0x9694,\n\t26519 - 11905: 0xC1D6,\n\t26520 - 11905: 0xE8C4,\n\t26521 - 11905: 0x9695,\n\t26522 - 11905: 0xC3B6,\n\t26523 - 11905: 0x9696,\n\t26524 - 11905: 0xB9FB,\n\t26525 - 11905: 0xD6A6,\n\t26526 - 11905: 0xE8C8,\n\t26527 - 11905: 0x9697,\n\t26528 - 11905: 0x9698,\n\t26529 - 11905: 0x9699,\n\t26530 - 11905: 0xCAE0,\n\t26531 - 11905: 0xD4E6,\n\t26532 - 11905: 0x969A,\n\t26533 - 11905: 0xE8C0,\n\t26534 - 11905: 0x969B,\n\t26535 - 11905: 0xE8C5,\n\t26536 - 11905: 0xE8C7,\n\t26537 - 11905: 0x969C,\n\t26538 - 11905: 0xC7B9,\n\t26539 - 11905: 0xB7E3,\n\t26540 - 11905: 0x969D,\n\t26541 - 11905: 0xE8C9,\n\t26542 - 11905: 0x969E,\n\t26543 - 11905: 0xBFDD,\n\t26544 - 11905: 0xE8D2,\n\t26545 - 11905: 0x969F,\n\t26546 - 11905: 0x96A0,\n\t26547 - 11905: 0xE8D7,\n\t26548 - 11905: 0x96A1,\n\t26549 - 11905: 0xE8D5,\n\t26550 - 11905: 0xBCDC,\n\t26551 - 11905: 0xBCCF,\n\t26552 - 11905: 0xE8DB,\n\t26553 - 11905: 0x96A2,\n\t26554 - 11905: 0x96A3,\n\t26555 - 11905: 0x96A4,\n\t26556 - 11905: 0x96A5,\n\t26557 - 11905: 0x96A6,\n\t26558 - 11905: 0x96A7,\n\t26559 - 11905: 0x96A8,\n\t26560 - 11905: 0x96A9,\n\t26561 - 11905: 0xE8DE,\n\t26562 - 11905: 0x96AA,\n\t26563 - 11905: 0xE8DA,\n\t26564 - 11905: 0xB1FA,\n\t26565 - 11905: 0x96AB,\n\t26566 - 11905: 0x96AC,\n\t26567 - 11905: 0x96AD,\n\t26568 - 11905: 0x96AE,\n\t26569 - 11905: 0x96AF,\n\t26570 - 11905: 0x96B0,\n\t26571 - 11905: 0x96B1,\n\t26572 - 11905: 0x96B2,\n\t26573 - 11905: 0x96B3,\n\t26574 - 11905: 0x96B4,\n\t26575 - 11905: 0xB0D8,\n\t26576 - 11905: 0xC4B3,\n\t26577 - 11905: 0xB8CC,\n\t26578 - 11905: 0xC6E2,\n\t26579 - 11905: 0xC8BE,\n\t26580 - 11905: 0xC8E1,\n\t26581 - 11905: 0x96B5,\n\t26582 - 11905: 0x96B6,\n\t26583 - 11905: 0x96B7,\n\t26584 - 11905: 0xE8CF,\n\t26585 - 11905: 0xE8D4,\n\t26586 - 11905: 0xE8D6,\n\t26587 - 11905: 0x96B8,\n\t26588 - 11905: 0xB9F1,\n\t26589 - 11905: 0xE8D8,\n\t26590 - 11905: 0xD7F5,\n\t26591 - 11905: 0x96B9,\n\t26592 - 11905: 0xC4FB,\n\t26593 - 11905: 0x96BA,\n\t26594 - 11905: 0xE8DC,\n\t26595 - 11905: 0x96BB,\n\t26596 - 11905: 0x96BC,\n\t26597 - 11905: 0xB2E9,\n\t26598 - 11905: 0x96BD,\n\t26599 - 11905: 0x96BE,\n\t26600 - 11905: 0x96BF,\n\t26601 - 11905: 0xE8D1,\n\t26602 - 11905: 0x96C0,\n\t26603 - 11905: 0x96C1,\n\t26604 - 11905: 0xBCED,\n\t26605 - 11905: 0x96C2,\n\t26606 - 11905: 0x96C3,\n\t26607 - 11905: 0xBFC2,\n\t26608 - 11905: 0xE8CD,\n\t26609 - 11905: 0xD6F9,\n\t26610 - 11905: 0x96C4,\n\t26611 - 11905: 0xC1F8,\n\t26612 - 11905: 0xB2F1,\n\t26613 - 11905: 0x96C5,\n\t26614 - 11905: 0x96C6,\n\t26615 - 11905: 0x96C7,\n\t26616 - 11905: 0x96C8,\n\t26617 - 11905: 0x96C9,\n\t26618 - 11905: 0x96CA,\n\t26619 - 11905: 0x96CB,\n\t26620 - 11905: 0x96CC,\n\t26621 - 11905: 0xE8DF,\n\t26622 - 11905: 0x96CD,\n\t26623 - 11905: 0xCAC1,\n\t26624 - 11905: 0xE8D9,\n\t26625 - 11905: 0x96CE,\n\t26626 - 11905: 0x96CF,\n\t26627 - 11905: 0x96D0,\n\t26628 - 11905: 0x96D1,\n\t26629 - 11905: 0xD5A4,\n\t26630 - 11905: 0x96D2,\n\t26631 - 11905: 0xB1EA,\n\t26632 - 11905: 0xD5BB,\n\t26633 - 11905: 0xE8CE,\n\t26634 - 11905: 0xE8D0,\n\t26635 - 11905: 0xB6B0,\n\t26636 - 11905: 0xE8D3,\n\t26637 - 11905: 0x96D3,\n\t26638 - 11905: 0xE8DD,\n\t26639 - 11905: 0xC0B8,\n\t26640 - 11905: 0x96D4,\n\t26641 - 11905: 0xCAF7,\n\t26642 - 11905: 0x96D5,\n\t26643 - 11905: 0xCBA8,\n\t26644 - 11905: 0x96D6,\n\t26645 - 11905: 0x96D7,\n\t26646 - 11905: 0xC6DC,\n\t26647 - 11905: 0xC0F5,\n\t26648 - 11905: 0x96D8,\n\t26649 - 11905: 0x96D9,\n\t26650 - 11905: 0x96DA,\n\t26651 - 11905: 0x96DB,\n\t26652 - 11905: 0x96DC,\n\t26653 - 11905: 0xE8E9,\n\t26654 - 11905: 0x96DD,\n\t26655 - 11905: 0x96DE,\n\t26656 - 11905: 0x96DF,\n\t26657 - 11905: 0xD0A3,\n\t26658 - 11905: 0x96E0,\n\t26659 - 11905: 0x96E1,\n\t26660 - 11905: 0x96E2,\n\t26661 - 11905: 0x96E3,\n\t26662 - 11905: 0x96E4,\n\t26663 - 11905: 0x96E5,\n\t26664 - 11905: 0x96E6,\n\t26665 - 11905: 0xE8F2,\n\t26666 - 11905: 0xD6EA,\n\t26667 - 11905: 0x96E7,\n\t26668 - 11905: 0x96E8,\n\t26669 - 11905: 0x96E9,\n\t26670 - 11905: 0x96EA,\n\t26671 - 11905: 0x96EB,\n\t26672 - 11905: 0x96EC,\n\t26673 - 11905: 0x96ED,\n\t26674 - 11905: 0xE8E0,\n\t26675 - 11905: 0xE8E1,\n\t26676 - 11905: 0x96EE,\n\t26677 - 11905: 0x96EF,\n\t26678 - 11905: 0x96F0,\n\t26679 - 11905: 0xD1F9,\n\t26680 - 11905: 0xBACB,\n\t26681 - 11905: 0xB8F9,\n\t26682 - 11905: 0x96F1,\n\t26683 - 11905: 0x96F2,\n\t26684 - 11905: 0xB8F1,\n\t26685 - 11905: 0xD4D4,\n\t26686 - 11905: 0xE8EF,\n\t26687 - 11905: 0x96F3,\n\t26688 - 11905: 0xE8EE,\n\t26689 - 11905: 0xE8EC,\n\t26690 - 11905: 0xB9F0,\n\t26691 - 11905: 0xCCD2,\n\t26692 - 11905: 0xE8E6,\n\t26693 - 11905: 0xCEA6,\n\t26694 - 11905: 0xBFF2,\n\t26695 - 11905: 0x96F4,\n\t26696 - 11905: 0xB0B8,\n\t26697 - 11905: 0xE8F1,\n\t26698 - 11905: 0xE8F0,\n\t26699 - 11905: 0x96F5,\n\t26700 - 11905: 0xD7C0,\n\t26701 - 11905: 0x96F6,\n\t26702 - 11905: 0xE8E4,\n\t26703 - 11905: 0x96F7,\n\t26704 - 11905: 0xCDA9,\n\t26705 - 11905: 0xC9A3,\n\t26706 - 11905: 0x96F8,\n\t26707 - 11905: 0xBBB8,\n\t26708 - 11905: 0xBDDB,\n\t26709 - 11905: 0xE8EA,\n\t26710 - 11905: 0x96F9,\n\t26711 - 11905: 0x96FA,\n\t26712 - 11905: 0x96FB,\n\t26713 - 11905: 0x96FC,\n\t26714 - 11905: 0x96FD,\n\t26715 - 11905: 0x96FE,\n\t26716 - 11905: 0x9740,\n\t26717 - 11905: 0x9741,\n\t26718 - 11905: 0x9742,\n\t26719 - 11905: 0x9743,\n\t26720 - 11905: 0xE8E2,\n\t26721 - 11905: 0xE8E3,\n\t26722 - 11905: 0xE8E5,\n\t26723 - 11905: 0xB5B5,\n\t26724 - 11905: 0xE8E7,\n\t26725 - 11905: 0xC7C5,\n\t26726 - 11905: 0xE8EB,\n\t26727 - 11905: 0xE8ED,\n\t26728 - 11905: 0xBDB0,\n\t26729 - 11905: 0xD7AE,\n\t26730 - 11905: 0x9744,\n\t26731 - 11905: 0xE8F8,\n\t26732 - 11905: 0x9745,\n\t26733 - 11905: 0x9746,\n\t26734 - 11905: 0x9747,\n\t26735 - 11905: 0x9748,\n\t26736 - 11905: 0x9749,\n\t26737 - 11905: 0x974A,\n\t26738 - 11905: 0x974B,\n\t26739 - 11905: 0x974C,\n\t26740 - 11905: 0xE8F5,\n\t26741 - 11905: 0x974D,\n\t26742 - 11905: 0xCDB0,\n\t26743 - 11905: 0xE8F6,\n\t26744 - 11905: 0x974E,\n\t26745 - 11905: 0x974F,\n\t26746 - 11905: 0x9750,\n\t26747 - 11905: 0x9751,\n\t26748 - 11905: 0x9752,\n\t26749 - 11905: 0x9753,\n\t26750 - 11905: 0x9754,\n\t26751 - 11905: 0x9755,\n\t26752 - 11905: 0x9756,\n\t26753 - 11905: 0xC1BA,\n\t26754 - 11905: 0x9757,\n\t26755 - 11905: 0xE8E8,\n\t26756 - 11905: 0x9758,\n\t26757 - 11905: 0xC3B7,\n\t26758 - 11905: 0xB0F0,\n\t26759 - 11905: 0x9759,\n\t26760 - 11905: 0x975A,\n\t26761 - 11905: 0x975B,\n\t26762 - 11905: 0x975C,\n\t26763 - 11905: 0x975D,\n\t26764 - 11905: 0x975E,\n\t26765 - 11905: 0x975F,\n\t26766 - 11905: 0x9760,\n\t26767 - 11905: 0xE8F4,\n\t26768 - 11905: 0x9761,\n\t26769 - 11905: 0x9762,\n\t26770 - 11905: 0x9763,\n\t26771 - 11905: 0xE8F7,\n\t26772 - 11905: 0x9764,\n\t26773 - 11905: 0x9765,\n\t26774 - 11905: 0x9766,\n\t26775 - 11905: 0xB9A3,\n\t26776 - 11905: 0x9767,\n\t26777 - 11905: 0x9768,\n\t26778 - 11905: 0x9769,\n\t26779 - 11905: 0x976A,\n\t26780 - 11905: 0x976B,\n\t26781 - 11905: 0x976C,\n\t26782 - 11905: 0x976D,\n\t26783 - 11905: 0x976E,\n\t26784 - 11905: 0x976F,\n\t26785 - 11905: 0x9770,\n\t26786 - 11905: 0xC9D2,\n\t26787 - 11905: 0x9771,\n\t26788 - 11905: 0x9772,\n\t26789 - 11905: 0x9773,\n\t26790 - 11905: 0xC3CE,\n\t26791 - 11905: 0xCEE0,\n\t26792 - 11905: 0xC0E6,\n\t26793 - 11905: 0x9774,\n\t26794 - 11905: 0x9775,\n\t26795 - 11905: 0x9776,\n\t26796 - 11905: 0x9777,\n\t26797 - 11905: 0xCBF3,\n\t26798 - 11905: 0x9778,\n\t26799 - 11905: 0xCCDD,\n\t26800 - 11905: 0xD0B5,\n\t26801 - 11905: 0x9779,\n\t26802 - 11905: 0x977A,\n\t26803 - 11905: 0xCAE1,\n\t26804 - 11905: 0x977B,\n\t26805 - 11905: 0xE8F3,\n\t26806 - 11905: 0x977C,\n\t26807 - 11905: 0x977D,\n\t26808 - 11905: 0x977E,\n\t26809 - 11905: 0x9780,\n\t26810 - 11905: 0x9781,\n\t26811 - 11905: 0x9782,\n\t26812 - 11905: 0x9783,\n\t26813 - 11905: 0x9784,\n\t26814 - 11905: 0x9785,\n\t26815 - 11905: 0x9786,\n\t26816 - 11905: 0xBCEC,\n\t26817 - 11905: 0x9787,\n\t26818 - 11905: 0xE8F9,\n\t26819 - 11905: 0x9788,\n\t26820 - 11905: 0x9789,\n\t26821 - 11905: 0x978A,\n\t26822 - 11905: 0x978B,\n\t26823 - 11905: 0x978C,\n\t26824 - 11905: 0x978D,\n\t26825 - 11905: 0xC3DE,\n\t26826 - 11905: 0x978E,\n\t26827 - 11905: 0xC6E5,\n\t26828 - 11905: 0x978F,\n\t26829 - 11905: 0xB9F7,\n\t26830 - 11905: 0x9790,\n\t26831 - 11905: 0x9791,\n\t26832 - 11905: 0x9792,\n\t26833 - 11905: 0x9793,\n\t26834 - 11905: 0xB0F4,\n\t26835 - 11905: 0x9794,\n\t26836 - 11905: 0x9795,\n\t26837 - 11905: 0xD7D8,\n\t26838 - 11905: 0x9796,\n\t26839 - 11905: 0x9797,\n\t26840 - 11905: 0xBCAC,\n\t26841 - 11905: 0x9798,\n\t26842 - 11905: 0xC5EF,\n\t26843 - 11905: 0x9799,\n\t26844 - 11905: 0x979A,\n\t26845 - 11905: 0x979B,\n\t26846 - 11905: 0x979C,\n\t26847 - 11905: 0x979D,\n\t26848 - 11905: 0xCCC4,\n\t26849 - 11905: 0x979E,\n\t26850 - 11905: 0x979F,\n\t26851 - 11905: 0xE9A6,\n\t26852 - 11905: 0x97A0,\n\t26853 - 11905: 0x97A1,\n\t26854 - 11905: 0x97A2,\n\t26855 - 11905: 0x97A3,\n\t26856 - 11905: 0x97A4,\n\t26857 - 11905: 0x97A5,\n\t26858 - 11905: 0x97A6,\n\t26859 - 11905: 0x97A7,\n\t26860 - 11905: 0x97A8,\n\t26861 - 11905: 0x97A9,\n\t26862 - 11905: 0xC9AD,\n\t26863 - 11905: 0x97AA,\n\t26864 - 11905: 0xE9A2,\n\t26865 - 11905: 0xC0E2,\n\t26866 - 11905: 0x97AB,\n\t26867 - 11905: 0x97AC,\n\t26868 - 11905: 0x97AD,\n\t26869 - 11905: 0xBFC3,\n\t26870 - 11905: 0x97AE,\n\t26871 - 11905: 0x97AF,\n\t26872 - 11905: 0x97B0,\n\t26873 - 11905: 0xE8FE,\n\t26874 - 11905: 0xB9D7,\n\t26875 - 11905: 0x97B1,\n\t26876 - 11905: 0xE8FB,\n\t26877 - 11905: 0x97B2,\n\t26878 - 11905: 0x97B3,\n\t26879 - 11905: 0x97B4,\n\t26880 - 11905: 0x97B5,\n\t26881 - 11905: 0xE9A4,\n\t26882 - 11905: 0x97B6,\n\t26883 - 11905: 0x97B7,\n\t26884 - 11905: 0x97B8,\n\t26885 - 11905: 0xD2CE,\n\t26886 - 11905: 0x97B9,\n\t26887 - 11905: 0x97BA,\n\t26888 - 11905: 0x97BB,\n\t26889 - 11905: 0x97BC,\n\t26890 - 11905: 0x97BD,\n\t26891 - 11905: 0xE9A3,\n\t26892 - 11905: 0x97BE,\n\t26893 - 11905: 0xD6B2,\n\t26894 - 11905: 0xD7B5,\n\t26895 - 11905: 0x97BF,\n\t26896 - 11905: 0xE9A7,\n\t26897 - 11905: 0x97C0,\n\t26898 - 11905: 0xBDB7,\n\t26899 - 11905: 0x97C1,\n\t26900 - 11905: 0x97C2,\n\t26901 - 11905: 0x97C3,\n\t26902 - 11905: 0x97C4,\n\t26903 - 11905: 0x97C5,\n\t26904 - 11905: 0x97C6,\n\t26905 - 11905: 0x97C7,\n\t26906 - 11905: 0x97C8,\n\t26907 - 11905: 0x97C9,\n\t26908 - 11905: 0x97CA,\n\t26909 - 11905: 0x97CB,\n\t26910 - 11905: 0x97CC,\n\t26911 - 11905: 0xE8FC,\n\t26912 - 11905: 0xE8FD,\n\t26913 - 11905: 0x97CD,\n\t26914 - 11905: 0x97CE,\n\t26915 - 11905: 0x97CF,\n\t26916 - 11905: 0xE9A1,\n\t26917 - 11905: 0x97D0,\n\t26918 - 11905: 0x97D1,\n\t26919 - 11905: 0x97D2,\n\t26920 - 11905: 0x97D3,\n\t26921 - 11905: 0x97D4,\n\t26922 - 11905: 0x97D5,\n\t26923 - 11905: 0x97D6,\n\t26924 - 11905: 0x97D7,\n\t26925 - 11905: 0xCDD6,\n\t26926 - 11905: 0x97D8,\n\t26927 - 11905: 0x97D9,\n\t26928 - 11905: 0xD2AC,\n\t26929 - 11905: 0x97DA,\n\t26930 - 11905: 0x97DB,\n\t26931 - 11905: 0x97DC,\n\t26932 - 11905: 0xE9B2,\n\t26933 - 11905: 0x97DD,\n\t26934 - 11905: 0x97DE,\n\t26935 - 11905: 0x97DF,\n\t26936 - 11905: 0x97E0,\n\t26937 - 11905: 0xE9A9,\n\t26938 - 11905: 0x97E1,\n\t26939 - 11905: 0x97E2,\n\t26940 - 11905: 0x97E3,\n\t26941 - 11905: 0xB4AA,\n\t26942 - 11905: 0x97E4,\n\t26943 - 11905: 0xB4BB,\n\t26944 - 11905: 0x97E5,\n\t26945 - 11905: 0x97E6,\n\t26946 - 11905: 0xE9AB,\n\t26947 - 11905: 0x97E7,\n\t26948 - 11905: 0x97E8,\n\t26949 - 11905: 0x97E9,\n\t26950 - 11905: 0x97EA,\n\t26951 - 11905: 0x97EB,\n\t26952 - 11905: 0x97EC,\n\t26953 - 11905: 0x97ED,\n\t26954 - 11905: 0x97EE,\n\t26955 - 11905: 0x97EF,\n\t26956 - 11905: 0x97F0,\n\t26957 - 11905: 0x97F1,\n\t26958 - 11905: 0x97F2,\n\t26959 - 11905: 0x97F3,\n\t26960 - 11905: 0x97F4,\n\t26961 - 11905: 0x97F5,\n\t26962 - 11905: 0x97F6,\n\t26963 - 11905: 0x97F7,\n\t26964 - 11905: 0xD0A8,\n\t26965 - 11905: 0x97F8,\n\t26966 - 11905: 0x97F9,\n\t26967 - 11905: 0xE9A5,\n\t26968 - 11905: 0x97FA,\n\t26969 - 11905: 0x97FB,\n\t26970 - 11905: 0xB3FE,\n\t26971 - 11905: 0x97FC,\n\t26972 - 11905: 0x97FD,\n\t26973 - 11905: 0xE9AC,\n\t26974 - 11905: 0xC0E3,\n\t26975 - 11905: 0x97FE,\n\t26976 - 11905: 0xE9AA,\n\t26977 - 11905: 0x9840,\n\t26978 - 11905: 0x9841,\n\t26979 - 11905: 0xE9B9,\n\t26980 - 11905: 0x9842,\n\t26981 - 11905: 0x9843,\n\t26982 - 11905: 0xE9B8,\n\t26983 - 11905: 0x9844,\n\t26984 - 11905: 0x9845,\n\t26985 - 11905: 0x9846,\n\t26986 - 11905: 0x9847,\n\t26987 - 11905: 0xE9AE,\n\t26988 - 11905: 0x9848,\n\t26989 - 11905: 0x9849,\n\t26990 - 11905: 0xE8FA,\n\t26991 - 11905: 0x984A,\n\t26992 - 11905: 0x984B,\n\t26993 - 11905: 0xE9A8,\n\t26994 - 11905: 0x984C,\n\t26995 - 11905: 0x984D,\n\t26996 - 11905: 0x984E,\n\t26997 - 11905: 0x984F,\n\t26998 - 11905: 0x9850,\n\t26999 - 11905: 0xBFAC,\n\t27000 - 11905: 0xE9B1,\n\t27001 - 11905: 0xE9BA,\n\t27002 - 11905: 0x9851,\n\t27003 - 11905: 0x9852,\n\t27004 - 11905: 0xC2A5,\n\t27005 - 11905: 0x9853,\n\t27006 - 11905: 0x9854,\n\t27007 - 11905: 0x9855,\n\t27008 - 11905: 0xE9AF,\n\t27009 - 11905: 0x9856,\n\t27010 - 11905: 0xB8C5,\n\t27011 - 11905: 0x9857,\n\t27012 - 11905: 0xE9AD,\n\t27013 - 11905: 0x9858,\n\t27014 - 11905: 0xD3DC,\n\t27015 - 11905: 0xE9B4,\n\t27016 - 11905: 0xE9B5,\n\t27017 - 11905: 0xE9B7,\n\t27018 - 11905: 0x9859,\n\t27019 - 11905: 0x985A,\n\t27020 - 11905: 0x985B,\n\t27021 - 11905: 0xE9C7,\n\t27022 - 11905: 0x985C,\n\t27023 - 11905: 0x985D,\n\t27024 - 11905: 0x985E,\n\t27025 - 11905: 0x985F,\n\t27026 - 11905: 0x9860,\n\t27027 - 11905: 0x9861,\n\t27028 - 11905: 0xC0C6,\n\t27029 - 11905: 0xE9C5,\n\t27030 - 11905: 0x9862,\n\t27031 - 11905: 0x9863,\n\t27032 - 11905: 0xE9B0,\n\t27033 - 11905: 0x9864,\n\t27034 - 11905: 0x9865,\n\t27035 - 11905: 0xE9BB,\n\t27036 - 11905: 0xB0F1,\n\t27037 - 11905: 0x9866,\n\t27038 - 11905: 0x9867,\n\t27039 - 11905: 0x9868,\n\t27040 - 11905: 0x9869,\n\t27041 - 11905: 0x986A,\n\t27042 - 11905: 0x986B,\n\t27043 - 11905: 0x986C,\n\t27044 - 11905: 0x986D,\n\t27045 - 11905: 0x986E,\n\t27046 - 11905: 0x986F,\n\t27047 - 11905: 0xE9BC,\n\t27048 - 11905: 0xD5A5,\n\t27049 - 11905: 0x9870,\n\t27050 - 11905: 0x9871,\n\t27051 - 11905: 0xE9BE,\n\t27052 - 11905: 0x9872,\n\t27053 - 11905: 0xE9BF,\n\t27054 - 11905: 0x9873,\n\t27055 - 11905: 0x9874,\n\t27056 - 11905: 0x9875,\n\t27057 - 11905: 0xE9C1,\n\t27058 - 11905: 0x9876,\n\t27059 - 11905: 0x9877,\n\t27060 - 11905: 0xC1F1,\n\t27061 - 11905: 0x9878,\n\t27062 - 11905: 0x9879,\n\t27063 - 11905: 0xC8B6,\n\t27064 - 11905: 0x987A,\n\t27065 - 11905: 0x987B,\n\t27066 - 11905: 0x987C,\n\t27067 - 11905: 0xE9BD,\n\t27068 - 11905: 0x987D,\n\t27069 - 11905: 0x987E,\n\t27070 - 11905: 0x9880,\n\t27071 - 11905: 0x9881,\n\t27072 - 11905: 0x9882,\n\t27073 - 11905: 0xE9C2,\n\t27074 - 11905: 0x9883,\n\t27075 - 11905: 0x9884,\n\t27076 - 11905: 0x9885,\n\t27077 - 11905: 0x9886,\n\t27078 - 11905: 0x9887,\n\t27079 - 11905: 0x9888,\n\t27080 - 11905: 0x9889,\n\t27081 - 11905: 0x988A,\n\t27082 - 11905: 0xE9C3,\n\t27083 - 11905: 0x988B,\n\t27084 - 11905: 0xE9B3,\n\t27085 - 11905: 0x988C,\n\t27086 - 11905: 0xE9B6,\n\t27087 - 11905: 0x988D,\n\t27088 - 11905: 0xBBB1,\n\t27089 - 11905: 0x988E,\n\t27090 - 11905: 0x988F,\n\t27091 - 11905: 0x9890,\n\t27092 - 11905: 0xE9C0,\n\t27093 - 11905: 0x9891,\n\t27094 - 11905: 0x9892,\n\t27095 - 11905: 0x9893,\n\t27096 - 11905: 0x9894,\n\t27097 - 11905: 0x9895,\n\t27098 - 11905: 0x9896,\n\t27099 - 11905: 0xBCF7,\n\t27100 - 11905: 0x9897,\n\t27101 - 11905: 0x9898,\n\t27102 - 11905: 0x9899,\n\t27103 - 11905: 0xE9C4,\n\t27104 - 11905: 0xE9C6,\n\t27105 - 11905: 0x989A,\n\t27106 - 11905: 0x989B,\n\t27107 - 11905: 0x989C,\n\t27108 - 11905: 0x989D,\n\t27109 - 11905: 0x989E,\n\t27110 - 11905: 0x989F,\n\t27111 - 11905: 0x98A0,\n\t27112 - 11905: 0x98A1,\n\t27113 - 11905: 0x98A2,\n\t27114 - 11905: 0x98A3,\n\t27115 - 11905: 0x98A4,\n\t27116 - 11905: 0x98A5,\n\t27117 - 11905: 0xE9CA,\n\t27118 - 11905: 0x98A6,\n\t27119 - 11905: 0x98A7,\n\t27120 - 11905: 0x98A8,\n\t27121 - 11905: 0x98A9,\n\t27122 - 11905: 0xE9CE,\n\t27123 - 11905: 0x98AA,\n\t27124 - 11905: 0x98AB,\n\t27125 - 11905: 0x98AC,\n\t27126 - 11905: 0x98AD,\n\t27127 - 11905: 0x98AE,\n\t27128 - 11905: 0x98AF,\n\t27129 - 11905: 0x98B0,\n\t27130 - 11905: 0x98B1,\n\t27131 - 11905: 0x98B2,\n\t27132 - 11905: 0x98B3,\n\t27133 - 11905: 0xB2DB,\n\t27134 - 11905: 0x98B4,\n\t27135 - 11905: 0xE9C8,\n\t27136 - 11905: 0x98B5,\n\t27137 - 11905: 0x98B6,\n\t27138 - 11905: 0x98B7,\n\t27139 - 11905: 0x98B8,\n\t27140 - 11905: 0x98B9,\n\t27141 - 11905: 0x98BA,\n\t27142 - 11905: 0x98BB,\n\t27143 - 11905: 0x98BC,\n\t27144 - 11905: 0x98BD,\n\t27145 - 11905: 0x98BE,\n\t27146 - 11905: 0xB7AE,\n\t27147 - 11905: 0x98BF,\n\t27148 - 11905: 0x98C0,\n\t27149 - 11905: 0x98C1,\n\t27150 - 11905: 0x98C2,\n\t27151 - 11905: 0x98C3,\n\t27152 - 11905: 0x98C4,\n\t27153 - 11905: 0x98C5,\n\t27154 - 11905: 0x98C6,\n\t27155 - 11905: 0x98C7,\n\t27156 - 11905: 0x98C8,\n\t27157 - 11905: 0x98C9,\n\t27158 - 11905: 0x98CA,\n\t27159 - 11905: 0xE9CB,\n\t27160 - 11905: 0xE9CC,\n\t27161 - 11905: 0x98CB,\n\t27162 - 11905: 0x98CC,\n\t27163 - 11905: 0x98CD,\n\t27164 - 11905: 0x98CE,\n\t27165 - 11905: 0x98CF,\n\t27166 - 11905: 0x98D0,\n\t27167 - 11905: 0xD5C1,\n\t27168 - 11905: 0x98D1,\n\t27169 - 11905: 0xC4A3,\n\t27170 - 11905: 0x98D2,\n\t27171 - 11905: 0x98D3,\n\t27172 - 11905: 0x98D4,\n\t27173 - 11905: 0x98D5,\n\t27174 - 11905: 0x98D6,\n\t27175 - 11905: 0x98D7,\n\t27176 - 11905: 0xE9D8,\n\t27177 - 11905: 0x98D8,\n\t27178 - 11905: 0xBAE1,\n\t27179 - 11905: 0x98D9,\n\t27180 - 11905: 0x98DA,\n\t27181 - 11905: 0x98DB,\n\t27182 - 11905: 0x98DC,\n\t27183 - 11905: 0xE9C9,\n\t27184 - 11905: 0x98DD,\n\t27185 - 11905: 0xD3A3,\n\t27186 - 11905: 0x98DE,\n\t27187 - 11905: 0x98DF,\n\t27188 - 11905: 0x98E0,\n\t27189 - 11905: 0xE9D4,\n\t27190 - 11905: 0x98E1,\n\t27191 - 11905: 0x98E2,\n\t27192 - 11905: 0x98E3,\n\t27193 - 11905: 0x98E4,\n\t27194 - 11905: 0x98E5,\n\t27195 - 11905: 0x98E6,\n\t27196 - 11905: 0x98E7,\n\t27197 - 11905: 0xE9D7,\n\t27198 - 11905: 0xE9D0,\n\t27199 - 11905: 0x98E8,\n\t27200 - 11905: 0x98E9,\n\t27201 - 11905: 0x98EA,\n\t27202 - 11905: 0x98EB,\n\t27203 - 11905: 0x98EC,\n\t27204 - 11905: 0xE9CF,\n\t27205 - 11905: 0x98ED,\n\t27206 - 11905: 0x98EE,\n\t27207 - 11905: 0xC7C1,\n\t27208 - 11905: 0x98EF,\n\t27209 - 11905: 0x98F0,\n\t27210 - 11905: 0x98F1,\n\t27211 - 11905: 0x98F2,\n\t27212 - 11905: 0x98F3,\n\t27213 - 11905: 0x98F4,\n\t27214 - 11905: 0x98F5,\n\t27215 - 11905: 0x98F6,\n\t27216 - 11905: 0xE9D2,\n\t27217 - 11905: 0x98F7,\n\t27218 - 11905: 0x98F8,\n\t27219 - 11905: 0x98F9,\n\t27220 - 11905: 0x98FA,\n\t27221 - 11905: 0x98FB,\n\t27222 - 11905: 0x98FC,\n\t27223 - 11905: 0x98FD,\n\t27224 - 11905: 0xE9D9,\n\t27225 - 11905: 0xB3C8,\n\t27226 - 11905: 0x98FE,\n\t27227 - 11905: 0xE9D3,\n\t27228 - 11905: 0x9940,\n\t27229 - 11905: 0x9941,\n\t27230 - 11905: 0x9942,\n\t27231 - 11905: 0x9943,\n\t27232 - 11905: 0x9944,\n\t27233 - 11905: 0xCFF0,\n\t27234 - 11905: 0x9945,\n\t27235 - 11905: 0x9946,\n\t27236 - 11905: 0x9947,\n\t27237 - 11905: 0xE9CD,\n\t27238 - 11905: 0x9948,\n\t27239 - 11905: 0x9949,\n\t27240 - 11905: 0x994A,\n\t27241 - 11905: 0x994B,\n\t27242 - 11905: 0x994C,\n\t27243 - 11905: 0x994D,\n\t27244 - 11905: 0x994E,\n\t27245 - 11905: 0x994F,\n\t27246 - 11905: 0x9950,\n\t27247 - 11905: 0x9951,\n\t27248 - 11905: 0x9952,\n\t27249 - 11905: 0xB3F7,\n\t27250 - 11905: 0x9953,\n\t27251 - 11905: 0x9954,\n\t27252 - 11905: 0x9955,\n\t27253 - 11905: 0x9956,\n\t27254 - 11905: 0x9957,\n\t27255 - 11905: 0x9958,\n\t27256 - 11905: 0x9959,\n\t27257 - 11905: 0xE9D6,\n\t27258 - 11905: 0x995A,\n\t27259 - 11905: 0x995B,\n\t27260 - 11905: 0xE9DA,\n\t27261 - 11905: 0x995C,\n\t27262 - 11905: 0x995D,\n\t27263 - 11905: 0x995E,\n\t27264 - 11905: 0xCCB4,\n\t27265 - 11905: 0x995F,\n\t27266 - 11905: 0x9960,\n\t27267 - 11905: 0x9961,\n\t27268 - 11905: 0xCFAD,\n\t27269 - 11905: 0x9962,\n\t27270 - 11905: 0x9963,\n\t27271 - 11905: 0x9964,\n\t27272 - 11905: 0x9965,\n\t27273 - 11905: 0x9966,\n\t27274 - 11905: 0x9967,\n\t27275 - 11905: 0x9968,\n\t27276 - 11905: 0x9969,\n\t27277 - 11905: 0x996A,\n\t27278 - 11905: 0xE9D5,\n\t27279 - 11905: 0x996B,\n\t27280 - 11905: 0xE9DC,\n\t27281 - 11905: 0xE9DB,\n\t27282 - 11905: 0x996C,\n\t27283 - 11905: 0x996D,\n\t27284 - 11905: 0x996E,\n\t27285 - 11905: 0x996F,\n\t27286 - 11905: 0x9970,\n\t27287 - 11905: 0xE9DE,\n\t27288 - 11905: 0x9971,\n\t27289 - 11905: 0x9972,\n\t27290 - 11905: 0x9973,\n\t27291 - 11905: 0x9974,\n\t27292 - 11905: 0x9975,\n\t27293 - 11905: 0x9976,\n\t27294 - 11905: 0x9977,\n\t27295 - 11905: 0x9978,\n\t27296 - 11905: 0xE9D1,\n\t27297 - 11905: 0x9979,\n\t27298 - 11905: 0x997A,\n\t27299 - 11905: 0x997B,\n\t27300 - 11905: 0x997C,\n\t27301 - 11905: 0x997D,\n\t27302 - 11905: 0x997E,\n\t27303 - 11905: 0x9980,\n\t27304 - 11905: 0x9981,\n\t27305 - 11905: 0xE9DD,\n\t27306 - 11905: 0x9982,\n\t27307 - 11905: 0xE9DF,\n\t27308 - 11905: 0xC3CA,\n\t27309 - 11905: 0x9983,\n\t27310 - 11905: 0x9984,\n\t27311 - 11905: 0x9985,\n\t27312 - 11905: 0x9986,\n\t27313 - 11905: 0x9987,\n\t27314 - 11905: 0x9988,\n\t27315 - 11905: 0x9989,\n\t27316 - 11905: 0x998A,\n\t27317 - 11905: 0x998B,\n\t27318 - 11905: 0x998C,\n\t27319 - 11905: 0x998D,\n\t27320 - 11905: 0x998E,\n\t27321 - 11905: 0x998F,\n\t27322 - 11905: 0x9990,\n\t27323 - 11905: 0x9991,\n\t27324 - 11905: 0x9992,\n\t27325 - 11905: 0x9993,\n\t27326 - 11905: 0x9994,\n\t27327 - 11905: 0x9995,\n\t27328 - 11905: 0x9996,\n\t27329 - 11905: 0x9997,\n\t27330 - 11905: 0x9998,\n\t27331 - 11905: 0x9999,\n\t27332 - 11905: 0x999A,\n\t27333 - 11905: 0x999B,\n\t27334 - 11905: 0x999C,\n\t27335 - 11905: 0x999D,\n\t27336 - 11905: 0x999E,\n\t27337 - 11905: 0x999F,\n\t27338 - 11905: 0x99A0,\n\t27339 - 11905: 0x99A1,\n\t27340 - 11905: 0x99A2,\n\t27341 - 11905: 0x99A3,\n\t27342 - 11905: 0x99A4,\n\t27343 - 11905: 0x99A5,\n\t27344 - 11905: 0x99A6,\n\t27345 - 11905: 0x99A7,\n\t27346 - 11905: 0x99A8,\n\t27347 - 11905: 0x99A9,\n\t27348 - 11905: 0x99AA,\n\t27349 - 11905: 0x99AB,\n\t27350 - 11905: 0x99AC,\n\t27351 - 11905: 0x99AD,\n\t27352 - 11905: 0x99AE,\n\t27353 - 11905: 0x99AF,\n\t27354 - 11905: 0x99B0,\n\t27355 - 11905: 0x99B1,\n\t27356 - 11905: 0x99B2,\n\t27357 - 11905: 0x99B3,\n\t27358 - 11905: 0x99B4,\n\t27359 - 11905: 0x99B5,\n\t27360 - 11905: 0x99B6,\n\t27361 - 11905: 0x99B7,\n\t27362 - 11905: 0x99B8,\n\t27363 - 11905: 0x99B9,\n\t27364 - 11905: 0x99BA,\n\t27365 - 11905: 0x99BB,\n\t27366 - 11905: 0x99BC,\n\t27367 - 11905: 0x99BD,\n\t27368 - 11905: 0x99BE,\n\t27369 - 11905: 0x99BF,\n\t27370 - 11905: 0x99C0,\n\t27371 - 11905: 0x99C1,\n\t27372 - 11905: 0x99C2,\n\t27373 - 11905: 0x99C3,\n\t27374 - 11905: 0x99C4,\n\t27375 - 11905: 0x99C5,\n\t27376 - 11905: 0x99C6,\n\t27377 - 11905: 0x99C7,\n\t27378 - 11905: 0x99C8,\n\t27379 - 11905: 0x99C9,\n\t27380 - 11905: 0x99CA,\n\t27381 - 11905: 0x99CB,\n\t27382 - 11905: 0x99CC,\n\t27383 - 11905: 0x99CD,\n\t27384 - 11905: 0x99CE,\n\t27385 - 11905: 0x99CF,\n\t27386 - 11905: 0x99D0,\n\t27387 - 11905: 0x99D1,\n\t27388 - 11905: 0x99D2,\n\t27389 - 11905: 0x99D3,\n\t27390 - 11905: 0x99D4,\n\t27391 - 11905: 0x99D5,\n\t27392 - 11905: 0x99D6,\n\t27393 - 11905: 0x99D7,\n\t27394 - 11905: 0x99D8,\n\t27395 - 11905: 0x99D9,\n\t27396 - 11905: 0x99DA,\n\t27397 - 11905: 0x99DB,\n\t27398 - 11905: 0x99DC,\n\t27399 - 11905: 0x99DD,\n\t27400 - 11905: 0x99DE,\n\t27401 - 11905: 0x99DF,\n\t27402 - 11905: 0x99E0,\n\t27403 - 11905: 0x99E1,\n\t27404 - 11905: 0x99E2,\n\t27405 - 11905: 0x99E3,\n\t27406 - 11905: 0x99E4,\n\t27407 - 11905: 0x99E5,\n\t27408 - 11905: 0x99E6,\n\t27409 - 11905: 0x99E7,\n\t27410 - 11905: 0x99E8,\n\t27411 - 11905: 0x99E9,\n\t27412 - 11905: 0x99EA,\n\t27413 - 11905: 0x99EB,\n\t27414 - 11905: 0x99EC,\n\t27415 - 11905: 0x99ED,\n\t27416 - 11905: 0x99EE,\n\t27417 - 11905: 0x99EF,\n\t27418 - 11905: 0x99F0,\n\t27419 - 11905: 0x99F1,\n\t27420 - 11905: 0x99F2,\n\t27421 - 11905: 0x99F3,\n\t27422 - 11905: 0x99F4,\n\t27423 - 11905: 0x99F5,\n\t27424 - 11905: 0xC7B7,\n\t27425 - 11905: 0xB4CE,\n\t27426 - 11905: 0xBBB6,\n\t27427 - 11905: 0xD0C0,\n\t27428 - 11905: 0xECA3,\n\t27429 - 11905: 0x99F6,\n\t27430 - 11905: 0x99F7,\n\t27431 - 11905: 0xC5B7,\n\t27432 - 11905: 0x99F8,\n\t27433 - 11905: 0x99F9,\n\t27434 - 11905: 0x99FA,\n\t27435 - 11905: 0x99FB,\n\t27436 - 11905: 0x99FC,\n\t27437 - 11905: 0x99FD,\n\t27438 - 11905: 0x99FE,\n\t27439 - 11905: 0x9A40,\n\t27440 - 11905: 0x9A41,\n\t27441 - 11905: 0x9A42,\n\t27442 - 11905: 0xD3FB,\n\t27443 - 11905: 0x9A43,\n\t27444 - 11905: 0x9A44,\n\t27445 - 11905: 0x9A45,\n\t27446 - 11905: 0x9A46,\n\t27447 - 11905: 0xECA4,\n\t27448 - 11905: 0x9A47,\n\t27449 - 11905: 0xECA5,\n\t27450 - 11905: 0xC6DB,\n\t27451 - 11905: 0x9A48,\n\t27452 - 11905: 0x9A49,\n\t27453 - 11905: 0x9A4A,\n\t27454 - 11905: 0xBFEE,\n\t27455 - 11905: 0x9A4B,\n\t27456 - 11905: 0x9A4C,\n\t27457 - 11905: 0x9A4D,\n\t27458 - 11905: 0x9A4E,\n\t27459 - 11905: 0xECA6,\n\t27460 - 11905: 0x9A4F,\n\t27461 - 11905: 0x9A50,\n\t27462 - 11905: 0xECA7,\n\t27463 - 11905: 0xD0AA,\n\t27464 - 11905: 0x9A51,\n\t27465 - 11905: 0xC7B8,\n\t27466 - 11905: 0x9A52,\n\t27467 - 11905: 0x9A53,\n\t27468 - 11905: 0xB8E8,\n\t27469 - 11905: 0x9A54,\n\t27470 - 11905: 0x9A55,\n\t27471 - 11905: 0x9A56,\n\t27472 - 11905: 0x9A57,\n\t27473 - 11905: 0x9A58,\n\t27474 - 11905: 0x9A59,\n\t27475 - 11905: 0x9A5A,\n\t27476 - 11905: 0x9A5B,\n\t27477 - 11905: 0x9A5C,\n\t27478 - 11905: 0x9A5D,\n\t27479 - 11905: 0x9A5E,\n\t27480 - 11905: 0x9A5F,\n\t27481 - 11905: 0xECA8,\n\t27482 - 11905: 0x9A60,\n\t27483 - 11905: 0x9A61,\n\t27484 - 11905: 0x9A62,\n\t27485 - 11905: 0x9A63,\n\t27486 - 11905: 0x9A64,\n\t27487 - 11905: 0x9A65,\n\t27488 - 11905: 0x9A66,\n\t27489 - 11905: 0x9A67,\n\t27490 - 11905: 0xD6B9,\n\t27491 - 11905: 0xD5FD,\n\t27492 - 11905: 0xB4CB,\n\t27493 - 11905: 0xB2BD,\n\t27494 - 11905: 0xCEE4,\n\t27495 - 11905: 0xC6E7,\n\t27496 - 11905: 0x9A68,\n\t27497 - 11905: 0x9A69,\n\t27498 - 11905: 0xCDE1,\n\t27499 - 11905: 0x9A6A,\n\t27500 - 11905: 0x9A6B,\n\t27501 - 11905: 0x9A6C,\n\t27502 - 11905: 0x9A6D,\n\t27503 - 11905: 0x9A6E,\n\t27504 - 11905: 0x9A6F,\n\t27505 - 11905: 0x9A70,\n\t27506 - 11905: 0x9A71,\n\t27507 - 11905: 0x9A72,\n\t27508 - 11905: 0x9A73,\n\t27509 - 11905: 0x9A74,\n\t27510 - 11905: 0x9A75,\n\t27511 - 11905: 0x9A76,\n\t27512 - 11905: 0x9A77,\n\t27513 - 11905: 0xB4F5,\n\t27514 - 11905: 0x9A78,\n\t27515 - 11905: 0xCBC0,\n\t27516 - 11905: 0xBCDF,\n\t27517 - 11905: 0x9A79,\n\t27518 - 11905: 0x9A7A,\n\t27519 - 11905: 0x9A7B,\n\t27520 - 11905: 0x9A7C,\n\t27521 - 11905: 0xE9E2,\n\t27522 - 11905: 0xE9E3,\n\t27523 - 11905: 0xD1EA,\n\t27524 - 11905: 0xE9E5,\n\t27525 - 11905: 0x9A7D,\n\t27526 - 11905: 0xB4F9,\n\t27527 - 11905: 0xE9E4,\n\t27528 - 11905: 0x9A7E,\n\t27529 - 11905: 0xD1B3,\n\t27530 - 11905: 0xCAE2,\n\t27531 - 11905: 0xB2D0,\n\t27532 - 11905: 0x9A80,\n\t27533 - 11905: 0xE9E8,\n\t27534 - 11905: 0x9A81,\n\t27535 - 11905: 0x9A82,\n\t27536 - 11905: 0x9A83,\n\t27537 - 11905: 0x9A84,\n\t27538 - 11905: 0xE9E6,\n\t27539 - 11905: 0xE9E7,\n\t27540 - 11905: 0x9A85,\n\t27541 - 11905: 0x9A86,\n\t27542 - 11905: 0xD6B3,\n\t27543 - 11905: 0x9A87,\n\t27544 - 11905: 0x9A88,\n\t27545 - 11905: 0x9A89,\n\t27546 - 11905: 0xE9E9,\n\t27547 - 11905: 0xE9EA,\n\t27548 - 11905: 0x9A8A,\n\t27549 - 11905: 0x9A8B,\n\t27550 - 11905: 0x9A8C,\n\t27551 - 11905: 0x9A8D,\n\t27552 - 11905: 0x9A8E,\n\t27553 - 11905: 0xE9EB,\n\t27554 - 11905: 0x9A8F,\n\t27555 - 11905: 0x9A90,\n\t27556 - 11905: 0x9A91,\n\t27557 - 11905: 0x9A92,\n\t27558 - 11905: 0x9A93,\n\t27559 - 11905: 0x9A94,\n\t27560 - 11905: 0x9A95,\n\t27561 - 11905: 0x9A96,\n\t27562 - 11905: 0xE9EC,\n\t27563 - 11905: 0x9A97,\n\t27564 - 11905: 0x9A98,\n\t27565 - 11905: 0x9A99,\n\t27566 - 11905: 0x9A9A,\n\t27567 - 11905: 0x9A9B,\n\t27568 - 11905: 0x9A9C,\n\t27569 - 11905: 0x9A9D,\n\t27570 - 11905: 0x9A9E,\n\t27571 - 11905: 0xECAF,\n\t27572 - 11905: 0xC5B9,\n\t27573 - 11905: 0xB6CE,\n\t27574 - 11905: 0x9A9F,\n\t27575 - 11905: 0xD2F3,\n\t27576 - 11905: 0x9AA0,\n\t27577 - 11905: 0x9AA1,\n\t27578 - 11905: 0x9AA2,\n\t27579 - 11905: 0x9AA3,\n\t27580 - 11905: 0x9AA4,\n\t27581 - 11905: 0x9AA5,\n\t27582 - 11905: 0x9AA6,\n\t27583 - 11905: 0xB5EE,\n\t27584 - 11905: 0x9AA7,\n\t27585 - 11905: 0xBBD9,\n\t27586 - 11905: 0xECB1,\n\t27587 - 11905: 0x9AA8,\n\t27588 - 11905: 0x9AA9,\n\t27589 - 11905: 0xD2E3,\n\t27590 - 11905: 0x9AAA,\n\t27591 - 11905: 0x9AAB,\n\t27592 - 11905: 0x9AAC,\n\t27593 - 11905: 0x9AAD,\n\t27594 - 11905: 0x9AAE,\n\t27595 - 11905: 0xCEE3,\n\t27596 - 11905: 0x9AAF,\n\t27597 - 11905: 0xC4B8,\n\t27598 - 11905: 0x9AB0,\n\t27599 - 11905: 0xC3BF,\n\t27600 - 11905: 0x9AB1,\n\t27601 - 11905: 0x9AB2,\n\t27602 - 11905: 0xB6BE,\n\t27603 - 11905: 0xD8B9,\n\t27604 - 11905: 0xB1C8,\n\t27605 - 11905: 0xB1CF,\n\t27606 - 11905: 0xB1D1,\n\t27607 - 11905: 0xC5FE,\n\t27608 - 11905: 0x9AB3,\n\t27609 - 11905: 0xB1D0,\n\t27610 - 11905: 0x9AB4,\n\t27611 - 11905: 0xC3AB,\n\t27612 - 11905: 0x9AB5,\n\t27613 - 11905: 0x9AB6,\n\t27614 - 11905: 0x9AB7,\n\t27615 - 11905: 0x9AB8,\n\t27616 - 11905: 0x9AB9,\n\t27617 - 11905: 0xD5B1,\n\t27618 - 11905: 0x9ABA,\n\t27619 - 11905: 0x9ABB,\n\t27620 - 11905: 0x9ABC,\n\t27621 - 11905: 0x9ABD,\n\t27622 - 11905: 0x9ABE,\n\t27623 - 11905: 0x9ABF,\n\t27624 - 11905: 0x9AC0,\n\t27625 - 11905: 0x9AC1,\n\t27626 - 11905: 0xEBA4,\n\t27627 - 11905: 0xBAC1,\n\t27628 - 11905: 0x9AC2,\n\t27629 - 11905: 0x9AC3,\n\t27630 - 11905: 0x9AC4,\n\t27631 - 11905: 0xCCBA,\n\t27632 - 11905: 0x9AC5,\n\t27633 - 11905: 0x9AC6,\n\t27634 - 11905: 0x9AC7,\n\t27635 - 11905: 0xEBA5,\n\t27636 - 11905: 0x9AC8,\n\t27637 - 11905: 0xEBA7,\n\t27638 - 11905: 0x9AC9,\n\t27639 - 11905: 0x9ACA,\n\t27640 - 11905: 0x9ACB,\n\t27641 - 11905: 0xEBA8,\n\t27642 - 11905: 0x9ACC,\n\t27643 - 11905: 0x9ACD,\n\t27644 - 11905: 0x9ACE,\n\t27645 - 11905: 0xEBA6,\n\t27646 - 11905: 0x9ACF,\n\t27647 - 11905: 0x9AD0,\n\t27648 - 11905: 0x9AD1,\n\t27649 - 11905: 0x9AD2,\n\t27650 - 11905: 0x9AD3,\n\t27651 - 11905: 0x9AD4,\n\t27652 - 11905: 0x9AD5,\n\t27653 - 11905: 0xEBA9,\n\t27654 - 11905: 0xEBAB,\n\t27655 - 11905: 0xEBAA,\n\t27656 - 11905: 0x9AD6,\n\t27657 - 11905: 0x9AD7,\n\t27658 - 11905: 0x9AD8,\n\t27659 - 11905: 0x9AD9,\n\t27660 - 11905: 0x9ADA,\n\t27661 - 11905: 0xEBAC,\n\t27662 - 11905: 0x9ADB,\n\t27663 - 11905: 0xCACF,\n\t27664 - 11905: 0xD8B5,\n\t27665 - 11905: 0xC3F1,\n\t27666 - 11905: 0x9ADC,\n\t27667 - 11905: 0xC3A5,\n\t27668 - 11905: 0xC6F8,\n\t27669 - 11905: 0xEBAD,\n\t27670 - 11905: 0xC4CA,\n\t27671 - 11905: 0x9ADD,\n\t27672 - 11905: 0xEBAE,\n\t27673 - 11905: 0xEBAF,\n\t27674 - 11905: 0xEBB0,\n\t27675 - 11905: 0xB7D5,\n\t27676 - 11905: 0x9ADE,\n\t27677 - 11905: 0x9ADF,\n\t27678 - 11905: 0x9AE0,\n\t27679 - 11905: 0xB7FA,\n\t27680 - 11905: 0x9AE1,\n\t27681 - 11905: 0xEBB1,\n\t27682 - 11905: 0xC7E2,\n\t27683 - 11905: 0x9AE2,\n\t27684 - 11905: 0xEBB3,\n\t27685 - 11905: 0x9AE3,\n\t27686 - 11905: 0xBAA4,\n\t27687 - 11905: 0xD1F5,\n\t27688 - 11905: 0xB0B1,\n\t27689 - 11905: 0xEBB2,\n\t27690 - 11905: 0xEBB4,\n\t27691 - 11905: 0x9AE4,\n\t27692 - 11905: 0x9AE5,\n\t27693 - 11905: 0x9AE6,\n\t27694 - 11905: 0xB5AA,\n\t27695 - 11905: 0xC2C8,\n\t27696 - 11905: 0xC7E8,\n\t27697 - 11905: 0x9AE7,\n\t27698 - 11905: 0xEBB5,\n\t27699 - 11905: 0x9AE8,\n\t27700 - 11905: 0xCBAE,\n\t27701 - 11905: 0xE3DF,\n\t27702 - 11905: 0x9AE9,\n\t27703 - 11905: 0x9AEA,\n\t27704 - 11905: 0xD3C0,\n\t27705 - 11905: 0x9AEB,\n\t27706 - 11905: 0x9AEC,\n\t27707 - 11905: 0x9AED,\n\t27708 - 11905: 0x9AEE,\n\t27709 - 11905: 0xD9DB,\n\t27710 - 11905: 0x9AEF,\n\t27711 - 11905: 0x9AF0,\n\t27712 - 11905: 0xCDA1,\n\t27713 - 11905: 0xD6AD,\n\t27714 - 11905: 0xC7F3,\n\t27715 - 11905: 0x9AF1,\n\t27716 - 11905: 0x9AF2,\n\t27717 - 11905: 0x9AF3,\n\t27718 - 11905: 0xD9E0,\n\t27719 - 11905: 0xBBE3,\n\t27720 - 11905: 0x9AF4,\n\t27721 - 11905: 0xBABA,\n\t27722 - 11905: 0xE3E2,\n\t27723 - 11905: 0x9AF5,\n\t27724 - 11905: 0x9AF6,\n\t27725 - 11905: 0x9AF7,\n\t27726 - 11905: 0x9AF8,\n\t27727 - 11905: 0x9AF9,\n\t27728 - 11905: 0xCFAB,\n\t27729 - 11905: 0x9AFA,\n\t27730 - 11905: 0x9AFB,\n\t27731 - 11905: 0x9AFC,\n\t27732 - 11905: 0xE3E0,\n\t27733 - 11905: 0xC9C7,\n\t27734 - 11905: 0x9AFD,\n\t27735 - 11905: 0xBAB9,\n\t27736 - 11905: 0x9AFE,\n\t27737 - 11905: 0x9B40,\n\t27738 - 11905: 0x9B41,\n\t27739 - 11905: 0xD1B4,\n\t27740 - 11905: 0xE3E1,\n\t27741 - 11905: 0xC8EA,\n\t27742 - 11905: 0xB9AF,\n\t27743 - 11905: 0xBDAD,\n\t27744 - 11905: 0xB3D8,\n\t27745 - 11905: 0xCEDB,\n\t27746 - 11905: 0x9B42,\n\t27747 - 11905: 0x9B43,\n\t27748 - 11905: 0xCCC0,\n\t27749 - 11905: 0x9B44,\n\t27750 - 11905: 0x9B45,\n\t27751 - 11905: 0x9B46,\n\t27752 - 11905: 0xE3E8,\n\t27753 - 11905: 0xE3E9,\n\t27754 - 11905: 0xCDF4,\n\t27755 - 11905: 0x9B47,\n\t27756 - 11905: 0x9B48,\n\t27757 - 11905: 0x9B49,\n\t27758 - 11905: 0x9B4A,\n\t27759 - 11905: 0x9B4B,\n\t27760 - 11905: 0xCCAD,\n\t27761 - 11905: 0x9B4C,\n\t27762 - 11905: 0xBCB3,\n\t27763 - 11905: 0x9B4D,\n\t27764 - 11905: 0xE3EA,\n\t27765 - 11905: 0x9B4E,\n\t27766 - 11905: 0xE3EB,\n\t27767 - 11905: 0x9B4F,\n\t27768 - 11905: 0x9B50,\n\t27769 - 11905: 0xD0DA,\n\t27770 - 11905: 0x9B51,\n\t27771 - 11905: 0x9B52,\n\t27772 - 11905: 0x9B53,\n\t27773 - 11905: 0xC6FB,\n\t27774 - 11905: 0xB7DA,\n\t27775 - 11905: 0x9B54,\n\t27776 - 11905: 0x9B55,\n\t27777 - 11905: 0xC7DF,\n\t27778 - 11905: 0xD2CA,\n\t27779 - 11905: 0xCED6,\n\t27780 - 11905: 0x9B56,\n\t27781 - 11905: 0xE3E4,\n\t27782 - 11905: 0xE3EC,\n\t27783 - 11905: 0x9B57,\n\t27784 - 11905: 0xC9F2,\n\t27785 - 11905: 0xB3C1,\n\t27786 - 11905: 0x9B58,\n\t27787 - 11905: 0x9B59,\n\t27788 - 11905: 0xE3E7,\n\t27789 - 11905: 0x9B5A,\n\t27790 - 11905: 0x9B5B,\n\t27791 - 11905: 0xC6E3,\n\t27792 - 11905: 0xE3E5,\n\t27793 - 11905: 0x9B5C,\n\t27794 - 11905: 0x9B5D,\n\t27795 - 11905: 0xEDB3,\n\t27796 - 11905: 0xE3E6,\n\t27797 - 11905: 0x9B5E,\n\t27798 - 11905: 0x9B5F,\n\t27799 - 11905: 0x9B60,\n\t27800 - 11905: 0x9B61,\n\t27801 - 11905: 0xC9B3,\n\t27802 - 11905: 0x9B62,\n\t27803 - 11905: 0xC5E6,\n\t27804 - 11905: 0x9B63,\n\t27805 - 11905: 0x9B64,\n\t27806 - 11905: 0x9B65,\n\t27807 - 11905: 0xB9B5,\n\t27808 - 11905: 0x9B66,\n\t27809 - 11905: 0xC3BB,\n\t27810 - 11905: 0x9B67,\n\t27811 - 11905: 0xE3E3,\n\t27812 - 11905: 0xC5BD,\n\t27813 - 11905: 0xC1A4,\n\t27814 - 11905: 0xC2D9,\n\t27815 - 11905: 0xB2D7,\n\t27816 - 11905: 0x9B68,\n\t27817 - 11905: 0xE3ED,\n\t27818 - 11905: 0xBBA6,\n\t27819 - 11905: 0xC4AD,\n\t27820 - 11905: 0x9B69,\n\t27821 - 11905: 0xE3F0,\n\t27822 - 11905: 0xBEDA,\n\t27823 - 11905: 0x9B6A,\n\t27824 - 11905: 0x9B6B,\n\t27825 - 11905: 0xE3FB,\n\t27826 - 11905: 0xE3F5,\n\t27827 - 11905: 0xBAD3,\n\t27828 - 11905: 0x9B6C,\n\t27829 - 11905: 0x9B6D,\n\t27830 - 11905: 0x9B6E,\n\t27831 - 11905: 0x9B6F,\n\t27832 - 11905: 0xB7D0,\n\t27833 - 11905: 0xD3CD,\n\t27834 - 11905: 0x9B70,\n\t27835 - 11905: 0xD6CE,\n\t27836 - 11905: 0xD5D3,\n\t27837 - 11905: 0xB9C1,\n\t27838 - 11905: 0xD5B4,\n\t27839 - 11905: 0xD1D8,\n\t27840 - 11905: 0x9B71,\n\t27841 - 11905: 0x9B72,\n\t27842 - 11905: 0x9B73,\n\t27843 - 11905: 0x9B74,\n\t27844 - 11905: 0xD0B9,\n\t27845 - 11905: 0xC7F6,\n\t27846 - 11905: 0x9B75,\n\t27847 - 11905: 0x9B76,\n\t27848 - 11905: 0x9B77,\n\t27849 - 11905: 0xC8AA,\n\t27850 - 11905: 0xB2B4,\n\t27851 - 11905: 0x9B78,\n\t27852 - 11905: 0xC3DA,\n\t27853 - 11905: 0x9B79,\n\t27854 - 11905: 0x9B7A,\n\t27855 - 11905: 0x9B7B,\n\t27856 - 11905: 0xE3EE,\n\t27857 - 11905: 0x9B7C,\n\t27858 - 11905: 0x9B7D,\n\t27859 - 11905: 0xE3FC,\n\t27860 - 11905: 0xE3EF,\n\t27861 - 11905: 0xB7A8,\n\t27862 - 11905: 0xE3F7,\n\t27863 - 11905: 0xE3F4,\n\t27864 - 11905: 0x9B7E,\n\t27865 - 11905: 0x9B80,\n\t27866 - 11905: 0x9B81,\n\t27867 - 11905: 0xB7BA,\n\t27868 - 11905: 0x9B82,\n\t27869 - 11905: 0x9B83,\n\t27870 - 11905: 0xC5A2,\n\t27871 - 11905: 0x9B84,\n\t27872 - 11905: 0xE3F6,\n\t27873 - 11905: 0xC5DD,\n\t27874 - 11905: 0xB2A8,\n\t27875 - 11905: 0xC6FC,\n\t27876 - 11905: 0x9B85,\n\t27877 - 11905: 0xC4E0,\n\t27878 - 11905: 0x9B86,\n\t27879 - 11905: 0x9B87,\n\t27880 - 11905: 0xD7A2,\n\t27881 - 11905: 0x9B88,\n\t27882 - 11905: 0xC0E1,\n\t27883 - 11905: 0xE3F9,\n\t27884 - 11905: 0x9B89,\n\t27885 - 11905: 0x9B8A,\n\t27886 - 11905: 0xE3FA,\n\t27887 - 11905: 0xE3FD,\n\t27888 - 11905: 0xCCA9,\n\t27889 - 11905: 0xE3F3,\n\t27890 - 11905: 0x9B8B,\n\t27891 - 11905: 0xD3BE,\n\t27892 - 11905: 0x9B8C,\n\t27893 - 11905: 0xB1C3,\n\t27894 - 11905: 0xEDB4,\n\t27895 - 11905: 0xE3F1,\n\t27896 - 11905: 0xE3F2,\n\t27897 - 11905: 0x9B8D,\n\t27898 - 11905: 0xE3F8,\n\t27899 - 11905: 0xD0BA,\n\t27900 - 11905: 0xC6C3,\n\t27901 - 11905: 0xD4F3,\n\t27902 - 11905: 0xE3FE,\n\t27903 - 11905: 0x9B8E,\n\t27904 - 11905: 0x9B8F,\n\t27905 - 11905: 0xBDE0,\n\t27906 - 11905: 0x9B90,\n\t27907 - 11905: 0x9B91,\n\t27908 - 11905: 0xE4A7,\n\t27909 - 11905: 0x9B92,\n\t27910 - 11905: 0x9B93,\n\t27911 - 11905: 0xE4A6,\n\t27912 - 11905: 0x9B94,\n\t27913 - 11905: 0x9B95,\n\t27914 - 11905: 0x9B96,\n\t27915 - 11905: 0xD1F3,\n\t27916 - 11905: 0xE4A3,\n\t27917 - 11905: 0x9B97,\n\t27918 - 11905: 0xE4A9,\n\t27919 - 11905: 0x9B98,\n\t27920 - 11905: 0x9B99,\n\t27921 - 11905: 0x9B9A,\n\t27922 - 11905: 0xC8F7,\n\t27923 - 11905: 0x9B9B,\n\t27924 - 11905: 0x9B9C,\n\t27925 - 11905: 0x9B9D,\n\t27926 - 11905: 0x9B9E,\n\t27927 - 11905: 0xCFB4,\n\t27928 - 11905: 0x9B9F,\n\t27929 - 11905: 0xE4A8,\n\t27930 - 11905: 0xE4AE,\n\t27931 - 11905: 0xC2E5,\n\t27932 - 11905: 0x9BA0,\n\t27933 - 11905: 0x9BA1,\n\t27934 - 11905: 0xB6B4,\n\t27935 - 11905: 0x9BA2,\n\t27936 - 11905: 0x9BA3,\n\t27937 - 11905: 0x9BA4,\n\t27938 - 11905: 0x9BA5,\n\t27939 - 11905: 0x9BA6,\n\t27940 - 11905: 0x9BA7,\n\t27941 - 11905: 0xBDF2,\n\t27942 - 11905: 0x9BA8,\n\t27943 - 11905: 0xE4A2,\n\t27944 - 11905: 0x9BA9,\n\t27945 - 11905: 0x9BAA,\n\t27946 - 11905: 0xBAE9,\n\t27947 - 11905: 0xE4AA,\n\t27948 - 11905: 0x9BAB,\n\t27949 - 11905: 0x9BAC,\n\t27950 - 11905: 0xE4AC,\n\t27951 - 11905: 0x9BAD,\n\t27952 - 11905: 0x9BAE,\n\t27953 - 11905: 0xB6FD,\n\t27954 - 11905: 0xD6DE,\n\t27955 - 11905: 0xE4B2,\n\t27956 - 11905: 0x9BAF,\n\t27957 - 11905: 0xE4AD,\n\t27958 - 11905: 0x9BB0,\n\t27959 - 11905: 0x9BB1,\n\t27960 - 11905: 0x9BB2,\n\t27961 - 11905: 0xE4A1,\n\t27962 - 11905: 0x9BB3,\n\t27963 - 11905: 0xBBEE,\n\t27964 - 11905: 0xCDDD,\n\t27965 - 11905: 0xC7A2,\n\t27966 - 11905: 0xC5C9,\n\t27967 - 11905: 0x9BB4,\n\t27968 - 11905: 0x9BB5,\n\t27969 - 11905: 0xC1F7,\n\t27970 - 11905: 0x9BB6,\n\t27971 - 11905: 0xE4A4,\n\t27972 - 11905: 0x9BB7,\n\t27973 - 11905: 0xC7B3,\n\t27974 - 11905: 0xBDAC,\n\t27975 - 11905: 0xBDBD,\n\t27976 - 11905: 0xE4A5,\n\t27977 - 11905: 0x9BB8,\n\t27978 - 11905: 0xD7C7,\n\t27979 - 11905: 0xB2E2,\n\t27980 - 11905: 0x9BB9,\n\t27981 - 11905: 0xE4AB,\n\t27982 - 11905: 0xBCC3,\n\t27983 - 11905: 0xE4AF,\n\t27984 - 11905: 0x9BBA,\n\t27985 - 11905: 0xBBEB,\n\t27986 - 11905: 0xE4B0,\n\t27987 - 11905: 0xC5A8,\n\t27988 - 11905: 0xE4B1,\n\t27989 - 11905: 0x9BBB,\n\t27990 - 11905: 0x9BBC,\n\t27991 - 11905: 0x9BBD,\n\t27992 - 11905: 0x9BBE,\n\t27993 - 11905: 0xD5E3,\n\t27994 - 11905: 0xBFA3,\n\t27995 - 11905: 0x9BBF,\n\t27996 - 11905: 0xE4BA,\n\t27997 - 11905: 0x9BC0,\n\t27998 - 11905: 0xE4B7,\n\t27999 - 11905: 0x9BC1,\n\t28000 - 11905: 0xE4BB,\n\t28001 - 11905: 0x9BC2,\n\t28002 - 11905: 0x9BC3,\n\t28003 - 11905: 0xE4BD,\n\t28004 - 11905: 0x9BC4,\n\t28005 - 11905: 0x9BC5,\n\t28006 - 11905: 0xC6D6,\n\t28007 - 11905: 0x9BC6,\n\t28008 - 11905: 0x9BC7,\n\t28009 - 11905: 0xBAC6,\n\t28010 - 11905: 0xC0CB,\n\t28011 - 11905: 0x9BC8,\n\t28012 - 11905: 0x9BC9,\n\t28013 - 11905: 0x9BCA,\n\t28014 - 11905: 0xB8A1,\n\t28015 - 11905: 0xE4B4,\n\t28016 - 11905: 0x9BCB,\n\t28017 - 11905: 0x9BCC,\n\t28018 - 11905: 0x9BCD,\n\t28019 - 11905: 0x9BCE,\n\t28020 - 11905: 0xD4A1,\n\t28021 - 11905: 0x9BCF,\n\t28022 - 11905: 0x9BD0,\n\t28023 - 11905: 0xBAA3,\n\t28024 - 11905: 0xBDFE,\n\t28025 - 11905: 0x9BD1,\n\t28026 - 11905: 0x9BD2,\n\t28027 - 11905: 0x9BD3,\n\t28028 - 11905: 0xE4BC,\n\t28029 - 11905: 0x9BD4,\n\t28030 - 11905: 0x9BD5,\n\t28031 - 11905: 0x9BD6,\n\t28032 - 11905: 0x9BD7,\n\t28033 - 11905: 0x9BD8,\n\t28034 - 11905: 0xCDBF,\n\t28035 - 11905: 0x9BD9,\n\t28036 - 11905: 0x9BDA,\n\t28037 - 11905: 0xC4F9,\n\t28038 - 11905: 0x9BDB,\n\t28039 - 11905: 0x9BDC,\n\t28040 - 11905: 0xCFFB,\n\t28041 - 11905: 0xC9E6,\n\t28042 - 11905: 0x9BDD,\n\t28043 - 11905: 0x9BDE,\n\t28044 - 11905: 0xD3BF,\n\t28045 - 11905: 0x9BDF,\n\t28046 - 11905: 0xCFD1,\n\t28047 - 11905: 0x9BE0,\n\t28048 - 11905: 0x9BE1,\n\t28049 - 11905: 0xE4B3,\n\t28050 - 11905: 0x9BE2,\n\t28051 - 11905: 0xE4B8,\n\t28052 - 11905: 0xE4B9,\n\t28053 - 11905: 0xCCE9,\n\t28054 - 11905: 0x9BE3,\n\t28055 - 11905: 0x9BE4,\n\t28056 - 11905: 0x9BE5,\n\t28057 - 11905: 0x9BE6,\n\t28058 - 11905: 0x9BE7,\n\t28059 - 11905: 0xCCCE,\n\t28060 - 11905: 0x9BE8,\n\t28061 - 11905: 0xC0D4,\n\t28062 - 11905: 0xE4B5,\n\t28063 - 11905: 0xC1B0,\n\t28064 - 11905: 0xE4B6,\n\t28065 - 11905: 0xCED0,\n\t28066 - 11905: 0x9BE9,\n\t28067 - 11905: 0xBBC1,\n\t28068 - 11905: 0xB5D3,\n\t28069 - 11905: 0x9BEA,\n\t28070 - 11905: 0xC8F3,\n\t28071 - 11905: 0xBDA7,\n\t28072 - 11905: 0xD5C7,\n\t28073 - 11905: 0xC9AC,\n\t28074 - 11905: 0xB8A2,\n\t28075 - 11905: 0xE4CA,\n\t28076 - 11905: 0x9BEB,\n\t28077 - 11905: 0x9BEC,\n\t28078 - 11905: 0xE4CC,\n\t28079 - 11905: 0xD1C4,\n\t28080 - 11905: 0x9BED,\n\t28081 - 11905: 0x9BEE,\n\t28082 - 11905: 0xD2BA,\n\t28083 - 11905: 0x9BEF,\n\t28084 - 11905: 0x9BF0,\n\t28085 - 11905: 0xBAAD,\n\t28086 - 11905: 0x9BF1,\n\t28087 - 11905: 0x9BF2,\n\t28088 - 11905: 0xBAD4,\n\t28089 - 11905: 0x9BF3,\n\t28090 - 11905: 0x9BF4,\n\t28091 - 11905: 0x9BF5,\n\t28092 - 11905: 0x9BF6,\n\t28093 - 11905: 0x9BF7,\n\t28094 - 11905: 0x9BF8,\n\t28095 - 11905: 0xE4C3,\n\t28096 - 11905: 0xB5ED,\n\t28097 - 11905: 0x9BF9,\n\t28098 - 11905: 0x9BFA,\n\t28099 - 11905: 0x9BFB,\n\t28100 - 11905: 0xD7CD,\n\t28101 - 11905: 0xE4C0,\n\t28102 - 11905: 0xCFFD,\n\t28103 - 11905: 0xE4BF,\n\t28104 - 11905: 0x9BFC,\n\t28105 - 11905: 0x9BFD,\n\t28106 - 11905: 0x9BFE,\n\t28107 - 11905: 0xC1DC,\n\t28108 - 11905: 0xCCCA,\n\t28109 - 11905: 0x9C40,\n\t28110 - 11905: 0x9C41,\n\t28111 - 11905: 0x9C42,\n\t28112 - 11905: 0x9C43,\n\t28113 - 11905: 0xCAE7,\n\t28114 - 11905: 0x9C44,\n\t28115 - 11905: 0x9C45,\n\t28116 - 11905: 0x9C46,\n\t28117 - 11905: 0x9C47,\n\t28118 - 11905: 0xC4D7,\n\t28119 - 11905: 0x9C48,\n\t28120 - 11905: 0xCCD4,\n\t28121 - 11905: 0xE4C8,\n\t28122 - 11905: 0x9C49,\n\t28123 - 11905: 0x9C4A,\n\t28124 - 11905: 0x9C4B,\n\t28125 - 11905: 0xE4C7,\n\t28126 - 11905: 0xE4C1,\n\t28127 - 11905: 0x9C4C,\n\t28128 - 11905: 0xE4C4,\n\t28129 - 11905: 0xB5AD,\n\t28130 - 11905: 0x9C4D,\n\t28131 - 11905: 0x9C4E,\n\t28132 - 11905: 0xD3D9,\n\t28133 - 11905: 0x9C4F,\n\t28134 - 11905: 0xE4C6,\n\t28135 - 11905: 0x9C50,\n\t28136 - 11905: 0x9C51,\n\t28137 - 11905: 0x9C52,\n\t28138 - 11905: 0x9C53,\n\t28139 - 11905: 0xD2F9,\n\t28140 - 11905: 0xB4E3,\n\t28141 - 11905: 0x9C54,\n\t28142 - 11905: 0xBBB4,\n\t28143 - 11905: 0x9C55,\n\t28144 - 11905: 0x9C56,\n\t28145 - 11905: 0xC9EE,\n\t28146 - 11905: 0x9C57,\n\t28147 - 11905: 0xB4BE,\n\t28148 - 11905: 0x9C58,\n\t28149 - 11905: 0x9C59,\n\t28150 - 11905: 0x9C5A,\n\t28151 - 11905: 0xBBEC,\n\t28152 - 11905: 0x9C5B,\n\t28153 - 11905: 0xD1CD,\n\t28154 - 11905: 0x9C5C,\n\t28155 - 11905: 0xCCED,\n\t28156 - 11905: 0xEDB5,\n\t28157 - 11905: 0x9C5D,\n\t28158 - 11905: 0x9C5E,\n\t28159 - 11905: 0x9C5F,\n\t28160 - 11905: 0x9C60,\n\t28161 - 11905: 0x9C61,\n\t28162 - 11905: 0x9C62,\n\t28163 - 11905: 0x9C63,\n\t28164 - 11905: 0x9C64,\n\t28165 - 11905: 0xC7E5,\n\t28166 - 11905: 0x9C65,\n\t28167 - 11905: 0x9C66,\n\t28168 - 11905: 0x9C67,\n\t28169 - 11905: 0x9C68,\n\t28170 - 11905: 0xD4A8,\n\t28171 - 11905: 0x9C69,\n\t28172 - 11905: 0xE4CB,\n\t28173 - 11905: 0xD7D5,\n\t28174 - 11905: 0xE4C2,\n\t28175 - 11905: 0x9C6A,\n\t28176 - 11905: 0xBDA5,\n\t28177 - 11905: 0xE4C5,\n\t28178 - 11905: 0x9C6B,\n\t28179 - 11905: 0x9C6C,\n\t28180 - 11905: 0xD3E6,\n\t28181 - 11905: 0x9C6D,\n\t28182 - 11905: 0xE4C9,\n\t28183 - 11905: 0xC9F8,\n\t28184 - 11905: 0x9C6E,\n\t28185 - 11905: 0x9C6F,\n\t28186 - 11905: 0xE4BE,\n\t28187 - 11905: 0x9C70,\n\t28188 - 11905: 0x9C71,\n\t28189 - 11905: 0xD3E5,\n\t28190 - 11905: 0x9C72,\n\t28191 - 11905: 0x9C73,\n\t28192 - 11905: 0xC7FE,\n\t28193 - 11905: 0xB6C9,\n\t28194 - 11905: 0x9C74,\n\t28195 - 11905: 0xD4FC,\n\t28196 - 11905: 0xB2B3,\n\t28197 - 11905: 0xE4D7,\n\t28198 - 11905: 0x9C75,\n\t28199 - 11905: 0x9C76,\n\t28200 - 11905: 0x9C77,\n\t28201 - 11905: 0xCEC2,\n\t28202 - 11905: 0x9C78,\n\t28203 - 11905: 0xE4CD,\n\t28204 - 11905: 0x9C79,\n\t28205 - 11905: 0xCEBC,\n\t28206 - 11905: 0x9C7A,\n\t28207 - 11905: 0xB8DB,\n\t28208 - 11905: 0x9C7B,\n\t28209 - 11905: 0x9C7C,\n\t28210 - 11905: 0xE4D6,\n\t28211 - 11905: 0x9C7D,\n\t28212 - 11905: 0xBFCA,\n\t28213 - 11905: 0x9C7E,\n\t28214 - 11905: 0x9C80,\n\t28215 - 11905: 0x9C81,\n\t28216 - 11905: 0xD3CE,\n\t28217 - 11905: 0x9C82,\n\t28218 - 11905: 0xC3EC,\n\t28219 - 11905: 0x9C83,\n\t28220 - 11905: 0x9C84,\n\t28221 - 11905: 0x9C85,\n\t28222 - 11905: 0x9C86,\n\t28223 - 11905: 0x9C87,\n\t28224 - 11905: 0x9C88,\n\t28225 - 11905: 0x9C89,\n\t28226 - 11905: 0x9C8A,\n\t28227 - 11905: 0xC5C8,\n\t28228 - 11905: 0xE4D8,\n\t28229 - 11905: 0x9C8B,\n\t28230 - 11905: 0x9C8C,\n\t28231 - 11905: 0x9C8D,\n\t28232 - 11905: 0x9C8E,\n\t28233 - 11905: 0x9C8F,\n\t28234 - 11905: 0x9C90,\n\t28235 - 11905: 0x9C91,\n\t28236 - 11905: 0x9C92,\n\t28237 - 11905: 0xCDC4,\n\t28238 - 11905: 0xE4CF,\n\t28239 - 11905: 0x9C93,\n\t28240 - 11905: 0x9C94,\n\t28241 - 11905: 0x9C95,\n\t28242 - 11905: 0x9C96,\n\t28243 - 11905: 0xE4D4,\n\t28244 - 11905: 0xE4D5,\n\t28245 - 11905: 0x9C97,\n\t28246 - 11905: 0xBAFE,\n\t28247 - 11905: 0x9C98,\n\t28248 - 11905: 0xCFE6,\n\t28249 - 11905: 0x9C99,\n\t28250 - 11905: 0x9C9A,\n\t28251 - 11905: 0xD5BF,\n\t28252 - 11905: 0x9C9B,\n\t28253 - 11905: 0x9C9C,\n\t28254 - 11905: 0x9C9D,\n\t28255 - 11905: 0xE4D2,\n\t28256 - 11905: 0x9C9E,\n\t28257 - 11905: 0x9C9F,\n\t28258 - 11905: 0x9CA0,\n\t28259 - 11905: 0x9CA1,\n\t28260 - 11905: 0x9CA2,\n\t28261 - 11905: 0x9CA3,\n\t28262 - 11905: 0x9CA4,\n\t28263 - 11905: 0x9CA5,\n\t28264 - 11905: 0x9CA6,\n\t28265 - 11905: 0x9CA7,\n\t28266 - 11905: 0x9CA8,\n\t28267 - 11905: 0xE4D0,\n\t28268 - 11905: 0x9CA9,\n\t28269 - 11905: 0x9CAA,\n\t28270 - 11905: 0xE4CE,\n\t28271 - 11905: 0x9CAB,\n\t28272 - 11905: 0x9CAC,\n\t28273 - 11905: 0x9CAD,\n\t28274 - 11905: 0x9CAE,\n\t28275 - 11905: 0x9CAF,\n\t28276 - 11905: 0x9CB0,\n\t28277 - 11905: 0x9CB1,\n\t28278 - 11905: 0x9CB2,\n\t28279 - 11905: 0x9CB3,\n\t28280 - 11905: 0x9CB4,\n\t28281 - 11905: 0x9CB5,\n\t28282 - 11905: 0x9CB6,\n\t28283 - 11905: 0x9CB7,\n\t28284 - 11905: 0x9CB8,\n\t28285 - 11905: 0x9CB9,\n\t28286 - 11905: 0xCDE5,\n\t28287 - 11905: 0xCAAA,\n\t28288 - 11905: 0x9CBA,\n\t28289 - 11905: 0x9CBB,\n\t28290 - 11905: 0x9CBC,\n\t28291 - 11905: 0xC0A3,\n\t28292 - 11905: 0x9CBD,\n\t28293 - 11905: 0xBDA6,\n\t28294 - 11905: 0xE4D3,\n\t28295 - 11905: 0x9CBE,\n\t28296 - 11905: 0x9CBF,\n\t28297 - 11905: 0xB8C8,\n\t28298 - 11905: 0x9CC0,\n\t28299 - 11905: 0x9CC1,\n\t28300 - 11905: 0x9CC2,\n\t28301 - 11905: 0x9CC3,\n\t28302 - 11905: 0x9CC4,\n\t28303 - 11905: 0xE4E7,\n\t28304 - 11905: 0xD4B4,\n\t28305 - 11905: 0x9CC5,\n\t28306 - 11905: 0x9CC6,\n\t28307 - 11905: 0x9CC7,\n\t28308 - 11905: 0x9CC8,\n\t28309 - 11905: 0x9CC9,\n\t28310 - 11905: 0x9CCA,\n\t28311 - 11905: 0x9CCB,\n\t28312 - 11905: 0xE4DB,\n\t28313 - 11905: 0x9CCC,\n\t28314 - 11905: 0x9CCD,\n\t28315 - 11905: 0x9CCE,\n\t28316 - 11905: 0xC1EF,\n\t28317 - 11905: 0x9CCF,\n\t28318 - 11905: 0x9CD0,\n\t28319 - 11905: 0xE4E9,\n\t28320 - 11905: 0x9CD1,\n\t28321 - 11905: 0x9CD2,\n\t28322 - 11905: 0xD2E7,\n\t28323 - 11905: 0x9CD3,\n\t28324 - 11905: 0x9CD4,\n\t28325 - 11905: 0xE4DF,\n\t28326 - 11905: 0x9CD5,\n\t28327 - 11905: 0xE4E0,\n\t28328 - 11905: 0x9CD6,\n\t28329 - 11905: 0x9CD7,\n\t28330 - 11905: 0xCFAA,\n\t28331 - 11905: 0x9CD8,\n\t28332 - 11905: 0x9CD9,\n\t28333 - 11905: 0x9CDA,\n\t28334 - 11905: 0x9CDB,\n\t28335 - 11905: 0xCBDD,\n\t28336 - 11905: 0x9CDC,\n\t28337 - 11905: 0xE4DA,\n\t28338 - 11905: 0xE4D1,\n\t28339 - 11905: 0x9CDD,\n\t28340 - 11905: 0xE4E5,\n\t28341 - 11905: 0x9CDE,\n\t28342 - 11905: 0xC8DC,\n\t28343 - 11905: 0xE4E3,\n\t28344 - 11905: 0x9CDF,\n\t28345 - 11905: 0x9CE0,\n\t28346 - 11905: 0xC4E7,\n\t28347 - 11905: 0xE4E2,\n\t28348 - 11905: 0x9CE1,\n\t28349 - 11905: 0xE4E1,\n\t28350 - 11905: 0x9CE2,\n\t28351 - 11905: 0x9CE3,\n\t28352 - 11905: 0x9CE4,\n\t28353 - 11905: 0xB3FC,\n\t28354 - 11905: 0xE4E8,\n\t28355 - 11905: 0x9CE5,\n\t28356 - 11905: 0x9CE6,\n\t28357 - 11905: 0x9CE7,\n\t28358 - 11905: 0x9CE8,\n\t28359 - 11905: 0xB5E1,\n\t28360 - 11905: 0x9CE9,\n\t28361 - 11905: 0x9CEA,\n\t28362 - 11905: 0x9CEB,\n\t28363 - 11905: 0xD7CC,\n\t28364 - 11905: 0x9CEC,\n\t28365 - 11905: 0x9CED,\n\t28366 - 11905: 0x9CEE,\n\t28367 - 11905: 0xE4E6,\n\t28368 - 11905: 0x9CEF,\n\t28369 - 11905: 0xBBAC,\n\t28370 - 11905: 0x9CF0,\n\t28371 - 11905: 0xD7D2,\n\t28372 - 11905: 0xCCCF,\n\t28373 - 11905: 0xEBF8,\n\t28374 - 11905: 0x9CF1,\n\t28375 - 11905: 0xE4E4,\n\t28376 - 11905: 0x9CF2,\n\t28377 - 11905: 0x9CF3,\n\t28378 - 11905: 0xB9F6,\n\t28379 - 11905: 0x9CF4,\n\t28380 - 11905: 0x9CF5,\n\t28381 - 11905: 0x9CF6,\n\t28382 - 11905: 0xD6CD,\n\t28383 - 11905: 0xE4D9,\n\t28384 - 11905: 0xE4DC,\n\t28385 - 11905: 0xC2FA,\n\t28386 - 11905: 0xE4DE,\n\t28387 - 11905: 0x9CF7,\n\t28388 - 11905: 0xC2CB,\n\t28389 - 11905: 0xC0C4,\n\t28390 - 11905: 0xC2D0,\n\t28391 - 11905: 0x9CF8,\n\t28392 - 11905: 0xB1F5,\n\t28393 - 11905: 0xCCB2,\n\t28394 - 11905: 0x9CF9,\n\t28395 - 11905: 0x9CFA,\n\t28396 - 11905: 0x9CFB,\n\t28397 - 11905: 0x9CFC,\n\t28398 - 11905: 0x9CFD,\n\t28399 - 11905: 0x9CFE,\n\t28400 - 11905: 0x9D40,\n\t28401 - 11905: 0x9D41,\n\t28402 - 11905: 0x9D42,\n\t28403 - 11905: 0x9D43,\n\t28404 - 11905: 0xB5CE,\n\t28405 - 11905: 0x9D44,\n\t28406 - 11905: 0x9D45,\n\t28407 - 11905: 0x9D46,\n\t28408 - 11905: 0x9D47,\n\t28409 - 11905: 0xE4EF,\n\t28410 - 11905: 0x9D48,\n\t28411 - 11905: 0x9D49,\n\t28412 - 11905: 0x9D4A,\n\t28413 - 11905: 0x9D4B,\n\t28414 - 11905: 0x9D4C,\n\t28415 - 11905: 0x9D4D,\n\t28416 - 11905: 0x9D4E,\n\t28417 - 11905: 0x9D4F,\n\t28418 - 11905: 0xC6AF,\n\t28419 - 11905: 0x9D50,\n\t28420 - 11905: 0x9D51,\n\t28421 - 11905: 0x9D52,\n\t28422 - 11905: 0xC6E1,\n\t28423 - 11905: 0x9D53,\n\t28424 - 11905: 0x9D54,\n\t28425 - 11905: 0xE4F5,\n\t28426 - 11905: 0x9D55,\n\t28427 - 11905: 0x9D56,\n\t28428 - 11905: 0x9D57,\n\t28429 - 11905: 0x9D58,\n\t28430 - 11905: 0x9D59,\n\t28431 - 11905: 0xC2A9,\n\t28432 - 11905: 0x9D5A,\n\t28433 - 11905: 0x9D5B,\n\t28434 - 11905: 0x9D5C,\n\t28435 - 11905: 0xC0EC,\n\t28436 - 11905: 0xD1DD,\n\t28437 - 11905: 0xE4EE,\n\t28438 - 11905: 0x9D5D,\n\t28439 - 11905: 0x9D5E,\n\t28440 - 11905: 0x9D5F,\n\t28441 - 11905: 0x9D60,\n\t28442 - 11905: 0x9D61,\n\t28443 - 11905: 0x9D62,\n\t28444 - 11905: 0x9D63,\n\t28445 - 11905: 0x9D64,\n\t28446 - 11905: 0x9D65,\n\t28447 - 11905: 0x9D66,\n\t28448 - 11905: 0xC4AE,\n\t28449 - 11905: 0x9D67,\n\t28450 - 11905: 0x9D68,\n\t28451 - 11905: 0x9D69,\n\t28452 - 11905: 0xE4ED,\n\t28453 - 11905: 0x9D6A,\n\t28454 - 11905: 0x9D6B,\n\t28455 - 11905: 0x9D6C,\n\t28456 - 11905: 0x9D6D,\n\t28457 - 11905: 0xE4F6,\n\t28458 - 11905: 0xE4F4,\n\t28459 - 11905: 0xC2FE,\n\t28460 - 11905: 0x9D6E,\n\t28461 - 11905: 0xE4DD,\n\t28462 - 11905: 0x9D6F,\n\t28463 - 11905: 0xE4F0,\n\t28464 - 11905: 0x9D70,\n\t28465 - 11905: 0xCAFE,\n\t28466 - 11905: 0x9D71,\n\t28467 - 11905: 0xD5C4,\n\t28468 - 11905: 0x9D72,\n\t28469 - 11905: 0x9D73,\n\t28470 - 11905: 0xE4F1,\n\t28471 - 11905: 0x9D74,\n\t28472 - 11905: 0x9D75,\n\t28473 - 11905: 0x9D76,\n\t28474 - 11905: 0x9D77,\n\t28475 - 11905: 0x9D78,\n\t28476 - 11905: 0x9D79,\n\t28477 - 11905: 0x9D7A,\n\t28478 - 11905: 0xD1FA,\n\t28479 - 11905: 0x9D7B,\n\t28480 - 11905: 0x9D7C,\n\t28481 - 11905: 0x9D7D,\n\t28482 - 11905: 0x9D7E,\n\t28483 - 11905: 0x9D80,\n\t28484 - 11905: 0x9D81,\n\t28485 - 11905: 0x9D82,\n\t28486 - 11905: 0xE4EB,\n\t28487 - 11905: 0xE4EC,\n\t28488 - 11905: 0x9D83,\n\t28489 - 11905: 0x9D84,\n\t28490 - 11905: 0x9D85,\n\t28491 - 11905: 0xE4F2,\n\t28492 - 11905: 0x9D86,\n\t28493 - 11905: 0xCEAB,\n\t28494 - 11905: 0x9D87,\n\t28495 - 11905: 0x9D88,\n\t28496 - 11905: 0x9D89,\n\t28497 - 11905: 0x9D8A,\n\t28498 - 11905: 0x9D8B,\n\t28499 - 11905: 0x9D8C,\n\t28500 - 11905: 0x9D8D,\n\t28501 - 11905: 0x9D8E,\n\t28502 - 11905: 0x9D8F,\n\t28503 - 11905: 0x9D90,\n\t28504 - 11905: 0xC5CB,\n\t28505 - 11905: 0x9D91,\n\t28506 - 11905: 0x9D92,\n\t28507 - 11905: 0x9D93,\n\t28508 - 11905: 0xC7B1,\n\t28509 - 11905: 0x9D94,\n\t28510 - 11905: 0xC2BA,\n\t28511 - 11905: 0x9D95,\n\t28512 - 11905: 0x9D96,\n\t28513 - 11905: 0x9D97,\n\t28514 - 11905: 0xE4EA,\n\t28515 - 11905: 0x9D98,\n\t28516 - 11905: 0x9D99,\n\t28517 - 11905: 0x9D9A,\n\t28518 - 11905: 0xC1CA,\n\t28519 - 11905: 0x9D9B,\n\t28520 - 11905: 0x9D9C,\n\t28521 - 11905: 0x9D9D,\n\t28522 - 11905: 0x9D9E,\n\t28523 - 11905: 0x9D9F,\n\t28524 - 11905: 0x9DA0,\n\t28525 - 11905: 0xCCB6,\n\t28526 - 11905: 0xB3B1,\n\t28527 - 11905: 0x9DA1,\n\t28528 - 11905: 0x9DA2,\n\t28529 - 11905: 0x9DA3,\n\t28530 - 11905: 0xE4FB,\n\t28531 - 11905: 0x9DA4,\n\t28532 - 11905: 0xE4F3,\n\t28533 - 11905: 0x9DA5,\n\t28534 - 11905: 0x9DA6,\n\t28535 - 11905: 0x9DA7,\n\t28536 - 11905: 0xE4FA,\n\t28537 - 11905: 0x9DA8,\n\t28538 - 11905: 0xE4FD,\n\t28539 - 11905: 0x9DA9,\n\t28540 - 11905: 0xE4FC,\n\t28541 - 11905: 0x9DAA,\n\t28542 - 11905: 0x9DAB,\n\t28543 - 11905: 0x9DAC,\n\t28544 - 11905: 0x9DAD,\n\t28545 - 11905: 0x9DAE,\n\t28546 - 11905: 0x9DAF,\n\t28547 - 11905: 0x9DB0,\n\t28548 - 11905: 0xB3CE,\n\t28549 - 11905: 0x9DB1,\n\t28550 - 11905: 0x9DB2,\n\t28551 - 11905: 0x9DB3,\n\t28552 - 11905: 0xB3BA,\n\t28553 - 11905: 0xE4F7,\n\t28554 - 11905: 0x9DB4,\n\t28555 - 11905: 0x9DB5,\n\t28556 - 11905: 0xE4F9,\n\t28557 - 11905: 0xE4F8,\n\t28558 - 11905: 0xC5EC,\n\t28559 - 11905: 0x9DB6,\n\t28560 - 11905: 0x9DB7,\n\t28561 - 11905: 0x9DB8,\n\t28562 - 11905: 0x9DB9,\n\t28563 - 11905: 0x9DBA,\n\t28564 - 11905: 0x9DBB,\n\t28565 - 11905: 0x9DBC,\n\t28566 - 11905: 0x9DBD,\n\t28567 - 11905: 0x9DBE,\n\t28568 - 11905: 0x9DBF,\n\t28569 - 11905: 0x9DC0,\n\t28570 - 11905: 0x9DC1,\n\t28571 - 11905: 0x9DC2,\n\t28572 - 11905: 0xC0BD,\n\t28573 - 11905: 0x9DC3,\n\t28574 - 11905: 0x9DC4,\n\t28575 - 11905: 0x9DC5,\n\t28576 - 11905: 0x9DC6,\n\t28577 - 11905: 0xD4E8,\n\t28578 - 11905: 0x9DC7,\n\t28579 - 11905: 0x9DC8,\n\t28580 - 11905: 0x9DC9,\n\t28581 - 11905: 0x9DCA,\n\t28582 - 11905: 0x9DCB,\n\t28583 - 11905: 0xE5A2,\n\t28584 - 11905: 0x9DCC,\n\t28585 - 11905: 0x9DCD,\n\t28586 - 11905: 0x9DCE,\n\t28587 - 11905: 0x9DCF,\n\t28588 - 11905: 0x9DD0,\n\t28589 - 11905: 0x9DD1,\n\t28590 - 11905: 0x9DD2,\n\t28591 - 11905: 0x9DD3,\n\t28592 - 11905: 0x9DD4,\n\t28593 - 11905: 0x9DD5,\n\t28594 - 11905: 0x9DD6,\n\t28595 - 11905: 0xB0C4,\n\t28596 - 11905: 0x9DD7,\n\t28597 - 11905: 0x9DD8,\n\t28598 - 11905: 0xE5A4,\n\t28599 - 11905: 0x9DD9,\n\t28600 - 11905: 0x9DDA,\n\t28601 - 11905: 0xE5A3,\n\t28602 - 11905: 0x9DDB,\n\t28603 - 11905: 0x9DDC,\n\t28604 - 11905: 0x9DDD,\n\t28605 - 11905: 0x9DDE,\n\t28606 - 11905: 0x9DDF,\n\t28607 - 11905: 0x9DE0,\n\t28608 - 11905: 0xBCA4,\n\t28609 - 11905: 0x9DE1,\n\t28610 - 11905: 0xE5A5,\n\t28611 - 11905: 0x9DE2,\n\t28612 - 11905: 0x9DE3,\n\t28613 - 11905: 0x9DE4,\n\t28614 - 11905: 0x9DE5,\n\t28615 - 11905: 0x9DE6,\n\t28616 - 11905: 0x9DE7,\n\t28617 - 11905: 0xE5A1,\n\t28618 - 11905: 0x9DE8,\n\t28619 - 11905: 0x9DE9,\n\t28620 - 11905: 0x9DEA,\n\t28621 - 11905: 0x9DEB,\n\t28622 - 11905: 0x9DEC,\n\t28623 - 11905: 0x9DED,\n\t28624 - 11905: 0x9DEE,\n\t28625 - 11905: 0xE4FE,\n\t28626 - 11905: 0xB1F4,\n\t28627 - 11905: 0x9DEF,\n\t28628 - 11905: 0x9DF0,\n\t28629 - 11905: 0x9DF1,\n\t28630 - 11905: 0x9DF2,\n\t28631 - 11905: 0x9DF3,\n\t28632 - 11905: 0x9DF4,\n\t28633 - 11905: 0x9DF5,\n\t28634 - 11905: 0x9DF6,\n\t28635 - 11905: 0x9DF7,\n\t28636 - 11905: 0x9DF8,\n\t28637 - 11905: 0x9DF9,\n\t28638 - 11905: 0xE5A8,\n\t28639 - 11905: 0x9DFA,\n\t28640 - 11905: 0xE5A9,\n\t28641 - 11905: 0xE5A6,\n\t28642 - 11905: 0x9DFB,\n\t28643 - 11905: 0x9DFC,\n\t28644 - 11905: 0x9DFD,\n\t28645 - 11905: 0x9DFE,\n\t28646 - 11905: 0x9E40,\n\t28647 - 11905: 0x9E41,\n\t28648 - 11905: 0x9E42,\n\t28649 - 11905: 0x9E43,\n\t28650 - 11905: 0x9E44,\n\t28651 - 11905: 0x9E45,\n\t28652 - 11905: 0x9E46,\n\t28653 - 11905: 0x9E47,\n\t28654 - 11905: 0xE5A7,\n\t28655 - 11905: 0xE5AA,\n\t28656 - 11905: 0x9E48,\n\t28657 - 11905: 0x9E49,\n\t28658 - 11905: 0x9E4A,\n\t28659 - 11905: 0x9E4B,\n\t28660 - 11905: 0x9E4C,\n\t28661 - 11905: 0x9E4D,\n\t28662 - 11905: 0x9E4E,\n\t28663 - 11905: 0x9E4F,\n\t28664 - 11905: 0x9E50,\n\t28665 - 11905: 0x9E51,\n\t28666 - 11905: 0x9E52,\n\t28667 - 11905: 0x9E53,\n\t28668 - 11905: 0x9E54,\n\t28669 - 11905: 0x9E55,\n\t28670 - 11905: 0x9E56,\n\t28671 - 11905: 0x9E57,\n\t28672 - 11905: 0x9E58,\n\t28673 - 11905: 0x9E59,\n\t28674 - 11905: 0x9E5A,\n\t28675 - 11905: 0x9E5B,\n\t28676 - 11905: 0x9E5C,\n\t28677 - 11905: 0x9E5D,\n\t28678 - 11905: 0x9E5E,\n\t28679 - 11905: 0x9E5F,\n\t28680 - 11905: 0x9E60,\n\t28681 - 11905: 0x9E61,\n\t28682 - 11905: 0x9E62,\n\t28683 - 11905: 0x9E63,\n\t28684 - 11905: 0x9E64,\n\t28685 - 11905: 0x9E65,\n\t28686 - 11905: 0x9E66,\n\t28687 - 11905: 0x9E67,\n\t28688 - 11905: 0x9E68,\n\t28689 - 11905: 0xC6D9,\n\t28690 - 11905: 0x9E69,\n\t28691 - 11905: 0x9E6A,\n\t28692 - 11905: 0x9E6B,\n\t28693 - 11905: 0x9E6C,\n\t28694 - 11905: 0x9E6D,\n\t28695 - 11905: 0x9E6E,\n\t28696 - 11905: 0x9E6F,\n\t28697 - 11905: 0x9E70,\n\t28698 - 11905: 0xE5AB,\n\t28699 - 11905: 0xE5AD,\n\t28700 - 11905: 0x9E71,\n\t28701 - 11905: 0x9E72,\n\t28702 - 11905: 0x9E73,\n\t28703 - 11905: 0x9E74,\n\t28704 - 11905: 0x9E75,\n\t28705 - 11905: 0x9E76,\n\t28706 - 11905: 0x9E77,\n\t28707 - 11905: 0xE5AC,\n\t28708 - 11905: 0x9E78,\n\t28709 - 11905: 0x9E79,\n\t28710 - 11905: 0x9E7A,\n\t28711 - 11905: 0x9E7B,\n\t28712 - 11905: 0x9E7C,\n\t28713 - 11905: 0x9E7D,\n\t28714 - 11905: 0x9E7E,\n\t28715 - 11905: 0x9E80,\n\t28716 - 11905: 0x9E81,\n\t28717 - 11905: 0x9E82,\n\t28718 - 11905: 0x9E83,\n\t28719 - 11905: 0x9E84,\n\t28720 - 11905: 0x9E85,\n\t28721 - 11905: 0x9E86,\n\t28722 - 11905: 0x9E87,\n\t28723 - 11905: 0x9E88,\n\t28724 - 11905: 0x9E89,\n\t28725 - 11905: 0xE5AF,\n\t28726 - 11905: 0x9E8A,\n\t28727 - 11905: 0x9E8B,\n\t28728 - 11905: 0x9E8C,\n\t28729 - 11905: 0xE5AE,\n\t28730 - 11905: 0x9E8D,\n\t28731 - 11905: 0x9E8E,\n\t28732 - 11905: 0x9E8F,\n\t28733 - 11905: 0x9E90,\n\t28734 - 11905: 0x9E91,\n\t28735 - 11905: 0x9E92,\n\t28736 - 11905: 0x9E93,\n\t28737 - 11905: 0x9E94,\n\t28738 - 11905: 0x9E95,\n\t28739 - 11905: 0x9E96,\n\t28740 - 11905: 0x9E97,\n\t28741 - 11905: 0x9E98,\n\t28742 - 11905: 0x9E99,\n\t28743 - 11905: 0x9E9A,\n\t28744 - 11905: 0x9E9B,\n\t28745 - 11905: 0x9E9C,\n\t28746 - 11905: 0x9E9D,\n\t28747 - 11905: 0x9E9E,\n\t28748 - 11905: 0xB9E0,\n\t28749 - 11905: 0x9E9F,\n\t28750 - 11905: 0x9EA0,\n\t28751 - 11905: 0xE5B0,\n\t28752 - 11905: 0x9EA1,\n\t28753 - 11905: 0x9EA2,\n\t28754 - 11905: 0x9EA3,\n\t28755 - 11905: 0x9EA4,\n\t28756 - 11905: 0x9EA5,\n\t28757 - 11905: 0x9EA6,\n\t28758 - 11905: 0x9EA7,\n\t28759 - 11905: 0x9EA8,\n\t28760 - 11905: 0x9EA9,\n\t28761 - 11905: 0x9EAA,\n\t28762 - 11905: 0x9EAB,\n\t28763 - 11905: 0x9EAC,\n\t28764 - 11905: 0x9EAD,\n\t28765 - 11905: 0x9EAE,\n\t28766 - 11905: 0xE5B1,\n\t28767 - 11905: 0x9EAF,\n\t28768 - 11905: 0x9EB0,\n\t28769 - 11905: 0x9EB1,\n\t28770 - 11905: 0x9EB2,\n\t28771 - 11905: 0x9EB3,\n\t28772 - 11905: 0x9EB4,\n\t28773 - 11905: 0x9EB5,\n\t28774 - 11905: 0x9EB6,\n\t28775 - 11905: 0x9EB7,\n\t28776 - 11905: 0x9EB8,\n\t28777 - 11905: 0x9EB9,\n\t28778 - 11905: 0x9EBA,\n\t28779 - 11905: 0xBBF0,\n\t28780 - 11905: 0xECE1,\n\t28781 - 11905: 0xC3F0,\n\t28782 - 11905: 0x9EBB,\n\t28783 - 11905: 0xB5C6,\n\t28784 - 11905: 0xBBD2,\n\t28785 - 11905: 0x9EBC,\n\t28786 - 11905: 0x9EBD,\n\t28787 - 11905: 0x9EBE,\n\t28788 - 11905: 0x9EBF,\n\t28789 - 11905: 0xC1E9,\n\t28790 - 11905: 0xD4EE,\n\t28791 - 11905: 0x9EC0,\n\t28792 - 11905: 0xBEC4,\n\t28793 - 11905: 0x9EC1,\n\t28794 - 11905: 0x9EC2,\n\t28795 - 11905: 0x9EC3,\n\t28796 - 11905: 0xD7C6,\n\t28797 - 11905: 0x9EC4,\n\t28798 - 11905: 0xD4D6,\n\t28799 - 11905: 0xB2D3,\n\t28800 - 11905: 0xECBE,\n\t28801 - 11905: 0x9EC5,\n\t28802 - 11905: 0x9EC6,\n\t28803 - 11905: 0x9EC7,\n\t28804 - 11905: 0x9EC8,\n\t28805 - 11905: 0xEAC1,\n\t28806 - 11905: 0x9EC9,\n\t28807 - 11905: 0x9ECA,\n\t28808 - 11905: 0x9ECB,\n\t28809 - 11905: 0xC2AF,\n\t28810 - 11905: 0xB4B6,\n\t28811 - 11905: 0x9ECC,\n\t28812 - 11905: 0x9ECD,\n\t28813 - 11905: 0x9ECE,\n\t28814 - 11905: 0xD1D7,\n\t28815 - 11905: 0x9ECF,\n\t28816 - 11905: 0x9ED0,\n\t28817 - 11905: 0x9ED1,\n\t28818 - 11905: 0xB3B4,\n\t28819 - 11905: 0x9ED2,\n\t28820 - 11905: 0xC8B2,\n\t28821 - 11905: 0xBFBB,\n\t28822 - 11905: 0xECC0,\n\t28823 - 11905: 0x9ED3,\n\t28824 - 11905: 0x9ED4,\n\t28825 - 11905: 0xD6CB,\n\t28826 - 11905: 0x9ED5,\n\t28827 - 11905: 0x9ED6,\n\t28828 - 11905: 0xECBF,\n\t28829 - 11905: 0xECC1,\n\t28830 - 11905: 0x9ED7,\n\t28831 - 11905: 0x9ED8,\n\t28832 - 11905: 0x9ED9,\n\t28833 - 11905: 0x9EDA,\n\t28834 - 11905: 0x9EDB,\n\t28835 - 11905: 0x9EDC,\n\t28836 - 11905: 0x9EDD,\n\t28837 - 11905: 0x9EDE,\n\t28838 - 11905: 0x9EDF,\n\t28839 - 11905: 0x9EE0,\n\t28840 - 11905: 0x9EE1,\n\t28841 - 11905: 0x9EE2,\n\t28842 - 11905: 0x9EE3,\n\t28843 - 11905: 0xECC5,\n\t28844 - 11905: 0xBEE6,\n\t28845 - 11905: 0xCCBF,\n\t28846 - 11905: 0xC5DA,\n\t28847 - 11905: 0xBEBC,\n\t28848 - 11905: 0x9EE4,\n\t28849 - 11905: 0xECC6,\n\t28850 - 11905: 0x9EE5,\n\t28851 - 11905: 0xB1FE,\n\t28852 - 11905: 0x9EE6,\n\t28853 - 11905: 0x9EE7,\n\t28854 - 11905: 0x9EE8,\n\t28855 - 11905: 0xECC4,\n\t28856 - 11905: 0xD5A8,\n\t28857 - 11905: 0xB5E3,\n\t28858 - 11905: 0x9EE9,\n\t28859 - 11905: 0xECC2,\n\t28860 - 11905: 0xC1B6,\n\t28861 - 11905: 0xB3E3,\n\t28862 - 11905: 0x9EEA,\n\t28863 - 11905: 0x9EEB,\n\t28864 - 11905: 0xECC3,\n\t28865 - 11905: 0xCBB8,\n\t28866 - 11905: 0xC0C3,\n\t28867 - 11905: 0xCCFE,\n\t28868 - 11905: 0x9EEC,\n\t28869 - 11905: 0x9EED,\n\t28870 - 11905: 0x9EEE,\n\t28871 - 11905: 0x9EEF,\n\t28872 - 11905: 0xC1D2,\n\t28873 - 11905: 0x9EF0,\n\t28874 - 11905: 0xECC8,\n\t28875 - 11905: 0x9EF1,\n\t28876 - 11905: 0x9EF2,\n\t28877 - 11905: 0x9EF3,\n\t28878 - 11905: 0x9EF4,\n\t28879 - 11905: 0x9EF5,\n\t28880 - 11905: 0x9EF6,\n\t28881 - 11905: 0x9EF7,\n\t28882 - 11905: 0x9EF8,\n\t28883 - 11905: 0x9EF9,\n\t28884 - 11905: 0x9EFA,\n\t28885 - 11905: 0x9EFB,\n\t28886 - 11905: 0x9EFC,\n\t28887 - 11905: 0x9EFD,\n\t28888 - 11905: 0xBAE6,\n\t28889 - 11905: 0xC0D3,\n\t28890 - 11905: 0x9EFE,\n\t28891 - 11905: 0xD6F2,\n\t28892 - 11905: 0x9F40,\n\t28893 - 11905: 0x9F41,\n\t28894 - 11905: 0x9F42,\n\t28895 - 11905: 0xD1CC,\n\t28896 - 11905: 0x9F43,\n\t28897 - 11905: 0x9F44,\n\t28898 - 11905: 0x9F45,\n\t28899 - 11905: 0x9F46,\n\t28900 - 11905: 0xBFBE,\n\t28901 - 11905: 0x9F47,\n\t28902 - 11905: 0xB7B3,\n\t28903 - 11905: 0xC9D5,\n\t28904 - 11905: 0xECC7,\n\t28905 - 11905: 0xBBE2,\n\t28906 - 11905: 0x9F48,\n\t28907 - 11905: 0xCCCC,\n\t28908 - 11905: 0xBDFD,\n\t28909 - 11905: 0xC8C8,\n\t28910 - 11905: 0x9F49,\n\t28911 - 11905: 0xCFA9,\n\t28912 - 11905: 0x9F4A,\n\t28913 - 11905: 0x9F4B,\n\t28914 - 11905: 0x9F4C,\n\t28915 - 11905: 0x9F4D,\n\t28916 - 11905: 0x9F4E,\n\t28917 - 11905: 0x9F4F,\n\t28918 - 11905: 0x9F50,\n\t28919 - 11905: 0xCDE9,\n\t28920 - 11905: 0x9F51,\n\t28921 - 11905: 0xC5EB,\n\t28922 - 11905: 0x9F52,\n\t28923 - 11905: 0x9F53,\n\t28924 - 11905: 0x9F54,\n\t28925 - 11905: 0xB7E9,\n\t28926 - 11905: 0x9F55,\n\t28927 - 11905: 0x9F56,\n\t28928 - 11905: 0x9F57,\n\t28929 - 11905: 0x9F58,\n\t28930 - 11905: 0x9F59,\n\t28931 - 11905: 0x9F5A,\n\t28932 - 11905: 0x9F5B,\n\t28933 - 11905: 0x9F5C,\n\t28934 - 11905: 0x9F5D,\n\t28935 - 11905: 0x9F5E,\n\t28936 - 11905: 0x9F5F,\n\t28937 - 11905: 0xD1C9,\n\t28938 - 11905: 0xBAB8,\n\t28939 - 11905: 0x9F60,\n\t28940 - 11905: 0x9F61,\n\t28941 - 11905: 0x9F62,\n\t28942 - 11905: 0x9F63,\n\t28943 - 11905: 0x9F64,\n\t28944 - 11905: 0xECC9,\n\t28945 - 11905: 0x9F65,\n\t28946 - 11905: 0x9F66,\n\t28947 - 11905: 0xECCA,\n\t28948 - 11905: 0x9F67,\n\t28949 - 11905: 0xBBC0,\n\t28950 - 11905: 0xECCB,\n\t28951 - 11905: 0x9F68,\n\t28952 - 11905: 0xECE2,\n\t28953 - 11905: 0xB1BA,\n\t28954 - 11905: 0xB7D9,\n\t28955 - 11905: 0x9F69,\n\t28956 - 11905: 0x9F6A,\n\t28957 - 11905: 0x9F6B,\n\t28958 - 11905: 0x9F6C,\n\t28959 - 11905: 0x9F6D,\n\t28960 - 11905: 0x9F6E,\n\t28961 - 11905: 0x9F6F,\n\t28962 - 11905: 0x9F70,\n\t28963 - 11905: 0x9F71,\n\t28964 - 11905: 0x9F72,\n\t28965 - 11905: 0x9F73,\n\t28966 - 11905: 0xBDB9,\n\t28967 - 11905: 0x9F74,\n\t28968 - 11905: 0x9F75,\n\t28969 - 11905: 0x9F76,\n\t28970 - 11905: 0x9F77,\n\t28971 - 11905: 0x9F78,\n\t28972 - 11905: 0x9F79,\n\t28973 - 11905: 0x9F7A,\n\t28974 - 11905: 0x9F7B,\n\t28975 - 11905: 0xECCC,\n\t28976 - 11905: 0xD1E6,\n\t28977 - 11905: 0xECCD,\n\t28978 - 11905: 0x9F7C,\n\t28979 - 11905: 0x9F7D,\n\t28980 - 11905: 0x9F7E,\n\t28981 - 11905: 0x9F80,\n\t28982 - 11905: 0xC8BB,\n\t28983 - 11905: 0x9F81,\n\t28984 - 11905: 0x9F82,\n\t28985 - 11905: 0x9F83,\n\t28986 - 11905: 0x9F84,\n\t28987 - 11905: 0x9F85,\n\t28988 - 11905: 0x9F86,\n\t28989 - 11905: 0x9F87,\n\t28990 - 11905: 0x9F88,\n\t28991 - 11905: 0x9F89,\n\t28992 - 11905: 0x9F8A,\n\t28993 - 11905: 0x9F8B,\n\t28994 - 11905: 0x9F8C,\n\t28995 - 11905: 0x9F8D,\n\t28996 - 11905: 0x9F8E,\n\t28997 - 11905: 0xECD1,\n\t28998 - 11905: 0x9F8F,\n\t28999 - 11905: 0x9F90,\n\t29000 - 11905: 0x9F91,\n\t29001 - 11905: 0x9F92,\n\t29002 - 11905: 0xECD3,\n\t29003 - 11905: 0x9F93,\n\t29004 - 11905: 0xBBCD,\n\t29005 - 11905: 0x9F94,\n\t29006 - 11905: 0xBCE5,\n\t29007 - 11905: 0x9F95,\n\t29008 - 11905: 0x9F96,\n\t29009 - 11905: 0x9F97,\n\t29010 - 11905: 0x9F98,\n\t29011 - 11905: 0x9F99,\n\t29012 - 11905: 0x9F9A,\n\t29013 - 11905: 0x9F9B,\n\t29014 - 11905: 0x9F9C,\n\t29015 - 11905: 0x9F9D,\n\t29016 - 11905: 0x9F9E,\n\t29017 - 11905: 0x9F9F,\n\t29018 - 11905: 0x9FA0,\n\t29019 - 11905: 0x9FA1,\n\t29020 - 11905: 0xECCF,\n\t29021 - 11905: 0x9FA2,\n\t29022 - 11905: 0xC9B7,\n\t29023 - 11905: 0x9FA3,\n\t29024 - 11905: 0x9FA4,\n\t29025 - 11905: 0x9FA5,\n\t29026 - 11905: 0x9FA6,\n\t29027 - 11905: 0x9FA7,\n\t29028 - 11905: 0xC3BA,\n\t29029 - 11905: 0x9FA8,\n\t29030 - 11905: 0xECE3,\n\t29031 - 11905: 0xD5D5,\n\t29032 - 11905: 0xECD0,\n\t29033 - 11905: 0x9FA9,\n\t29034 - 11905: 0x9FAA,\n\t29035 - 11905: 0x9FAB,\n\t29036 - 11905: 0x9FAC,\n\t29037 - 11905: 0x9FAD,\n\t29038 - 11905: 0xD6F3,\n\t29039 - 11905: 0x9FAE,\n\t29040 - 11905: 0x9FAF,\n\t29041 - 11905: 0x9FB0,\n\t29042 - 11905: 0xECD2,\n\t29043 - 11905: 0xECCE,\n\t29044 - 11905: 0x9FB1,\n\t29045 - 11905: 0x9FB2,\n\t29046 - 11905: 0x9FB3,\n\t29047 - 11905: 0x9FB4,\n\t29048 - 11905: 0xECD4,\n\t29049 - 11905: 0x9FB5,\n\t29050 - 11905: 0xECD5,\n\t29051 - 11905: 0x9FB6,\n\t29052 - 11905: 0x9FB7,\n\t29053 - 11905: 0xC9BF,\n\t29054 - 11905: 0x9FB8,\n\t29055 - 11905: 0x9FB9,\n\t29056 - 11905: 0x9FBA,\n\t29057 - 11905: 0x9FBB,\n\t29058 - 11905: 0x9FBC,\n\t29059 - 11905: 0x9FBD,\n\t29060 - 11905: 0xCFA8,\n\t29061 - 11905: 0x9FBE,\n\t29062 - 11905: 0x9FBF,\n\t29063 - 11905: 0x9FC0,\n\t29064 - 11905: 0x9FC1,\n\t29065 - 11905: 0x9FC2,\n\t29066 - 11905: 0xD0DC,\n\t29067 - 11905: 0x9FC3,\n\t29068 - 11905: 0x9FC4,\n\t29069 - 11905: 0x9FC5,\n\t29070 - 11905: 0x9FC6,\n\t29071 - 11905: 0xD1AC,\n\t29072 - 11905: 0x9FC7,\n\t29073 - 11905: 0x9FC8,\n\t29074 - 11905: 0x9FC9,\n\t29075 - 11905: 0x9FCA,\n\t29076 - 11905: 0xC8DB,\n\t29077 - 11905: 0x9FCB,\n\t29078 - 11905: 0x9FCC,\n\t29079 - 11905: 0x9FCD,\n\t29080 - 11905: 0xECD6,\n\t29081 - 11905: 0xCEF5,\n\t29082 - 11905: 0x9FCE,\n\t29083 - 11905: 0x9FCF,\n\t29084 - 11905: 0x9FD0,\n\t29085 - 11905: 0x9FD1,\n\t29086 - 11905: 0x9FD2,\n\t29087 - 11905: 0xCAEC,\n\t29088 - 11905: 0xECDA,\n\t29089 - 11905: 0x9FD3,\n\t29090 - 11905: 0x9FD4,\n\t29091 - 11905: 0x9FD5,\n\t29092 - 11905: 0x9FD6,\n\t29093 - 11905: 0x9FD7,\n\t29094 - 11905: 0x9FD8,\n\t29095 - 11905: 0x9FD9,\n\t29096 - 11905: 0xECD9,\n\t29097 - 11905: 0x9FDA,\n\t29098 - 11905: 0x9FDB,\n\t29099 - 11905: 0x9FDC,\n\t29100 - 11905: 0xB0BE,\n\t29101 - 11905: 0x9FDD,\n\t29102 - 11905: 0x9FDE,\n\t29103 - 11905: 0x9FDF,\n\t29104 - 11905: 0x9FE0,\n\t29105 - 11905: 0x9FE1,\n\t29106 - 11905: 0x9FE2,\n\t29107 - 11905: 0xECD7,\n\t29108 - 11905: 0x9FE3,\n\t29109 - 11905: 0xECD8,\n\t29110 - 11905: 0x9FE4,\n\t29111 - 11905: 0x9FE5,\n\t29112 - 11905: 0x9FE6,\n\t29113 - 11905: 0xECE4,\n\t29114 - 11905: 0x9FE7,\n\t29115 - 11905: 0x9FE8,\n\t29116 - 11905: 0x9FE9,\n\t29117 - 11905: 0x9FEA,\n\t29118 - 11905: 0x9FEB,\n\t29119 - 11905: 0x9FEC,\n\t29120 - 11905: 0x9FED,\n\t29121 - 11905: 0x9FEE,\n\t29122 - 11905: 0x9FEF,\n\t29123 - 11905: 0xC8BC,\n\t29124 - 11905: 0x9FF0,\n\t29125 - 11905: 0x9FF1,\n\t29126 - 11905: 0x9FF2,\n\t29127 - 11905: 0x9FF3,\n\t29128 - 11905: 0x9FF4,\n\t29129 - 11905: 0x9FF5,\n\t29130 - 11905: 0x9FF6,\n\t29131 - 11905: 0x9FF7,\n\t29132 - 11905: 0x9FF8,\n\t29133 - 11905: 0x9FF9,\n\t29134 - 11905: 0xC1C7,\n\t29135 - 11905: 0x9FFA,\n\t29136 - 11905: 0x9FFB,\n\t29137 - 11905: 0x9FFC,\n\t29138 - 11905: 0x9FFD,\n\t29139 - 11905: 0x9FFE,\n\t29140 - 11905: 0xECDC,\n\t29141 - 11905: 0xD1E0,\n\t29142 - 11905: 0xA040,\n\t29143 - 11905: 0xA041,\n\t29144 - 11905: 0xA042,\n\t29145 - 11905: 0xA043,\n\t29146 - 11905: 0xA044,\n\t29147 - 11905: 0xA045,\n\t29148 - 11905: 0xA046,\n\t29149 - 11905: 0xA047,\n\t29150 - 11905: 0xA048,\n\t29151 - 11905: 0xA049,\n\t29152 - 11905: 0xECDB,\n\t29153 - 11905: 0xA04A,\n\t29154 - 11905: 0xA04B,\n\t29155 - 11905: 0xA04C,\n\t29156 - 11905: 0xA04D,\n\t29157 - 11905: 0xD4EF,\n\t29158 - 11905: 0xA04E,\n\t29159 - 11905: 0xECDD,\n\t29160 - 11905: 0xA04F,\n\t29161 - 11905: 0xA050,\n\t29162 - 11905: 0xA051,\n\t29163 - 11905: 0xA052,\n\t29164 - 11905: 0xA053,\n\t29165 - 11905: 0xA054,\n\t29166 - 11905: 0xDBC6,\n\t29167 - 11905: 0xA055,\n\t29168 - 11905: 0xA056,\n\t29169 - 11905: 0xA057,\n\t29170 - 11905: 0xA058,\n\t29171 - 11905: 0xA059,\n\t29172 - 11905: 0xA05A,\n\t29173 - 11905: 0xA05B,\n\t29174 - 11905: 0xA05C,\n\t29175 - 11905: 0xA05D,\n\t29176 - 11905: 0xA05E,\n\t29177 - 11905: 0xECDE,\n\t29178 - 11905: 0xA05F,\n\t29179 - 11905: 0xA060,\n\t29180 - 11905: 0xA061,\n\t29181 - 11905: 0xA062,\n\t29182 - 11905: 0xA063,\n\t29183 - 11905: 0xA064,\n\t29184 - 11905: 0xA065,\n\t29185 - 11905: 0xA066,\n\t29186 - 11905: 0xA067,\n\t29187 - 11905: 0xA068,\n\t29188 - 11905: 0xA069,\n\t29189 - 11905: 0xA06A,\n\t29190 - 11905: 0xB1AC,\n\t29191 - 11905: 0xA06B,\n\t29192 - 11905: 0xA06C,\n\t29193 - 11905: 0xA06D,\n\t29194 - 11905: 0xA06E,\n\t29195 - 11905: 0xA06F,\n\t29196 - 11905: 0xA070,\n\t29197 - 11905: 0xA071,\n\t29198 - 11905: 0xA072,\n\t29199 - 11905: 0xA073,\n\t29200 - 11905: 0xA074,\n\t29201 - 11905: 0xA075,\n\t29202 - 11905: 0xA076,\n\t29203 - 11905: 0xA077,\n\t29204 - 11905: 0xA078,\n\t29205 - 11905: 0xA079,\n\t29206 - 11905: 0xA07A,\n\t29207 - 11905: 0xA07B,\n\t29208 - 11905: 0xA07C,\n\t29209 - 11905: 0xA07D,\n\t29210 - 11905: 0xA07E,\n\t29211 - 11905: 0xA080,\n\t29212 - 11905: 0xA081,\n\t29213 - 11905: 0xECDF,\n\t29214 - 11905: 0xA082,\n\t29215 - 11905: 0xA083,\n\t29216 - 11905: 0xA084,\n\t29217 - 11905: 0xA085,\n\t29218 - 11905: 0xA086,\n\t29219 - 11905: 0xA087,\n\t29220 - 11905: 0xA088,\n\t29221 - 11905: 0xA089,\n\t29222 - 11905: 0xA08A,\n\t29223 - 11905: 0xA08B,\n\t29224 - 11905: 0xECE0,\n\t29225 - 11905: 0xA08C,\n\t29226 - 11905: 0xD7A6,\n\t29227 - 11905: 0xA08D,\n\t29228 - 11905: 0xC5C0,\n\t29229 - 11905: 0xA08E,\n\t29230 - 11905: 0xA08F,\n\t29231 - 11905: 0xA090,\n\t29232 - 11905: 0xEBBC,\n\t29233 - 11905: 0xB0AE,\n\t29234 - 11905: 0xA091,\n\t29235 - 11905: 0xA092,\n\t29236 - 11905: 0xA093,\n\t29237 - 11905: 0xBEF4,\n\t29238 - 11905: 0xB8B8,\n\t29239 - 11905: 0xD2AF,\n\t29240 - 11905: 0xB0D6,\n\t29241 - 11905: 0xB5F9,\n\t29242 - 11905: 0xA094,\n\t29243 - 11905: 0xD8B3,\n\t29244 - 11905: 0xA095,\n\t29245 - 11905: 0xCBAC,\n\t29246 - 11905: 0xA096,\n\t29247 - 11905: 0xE3DD,\n\t29248 - 11905: 0xA097,\n\t29249 - 11905: 0xA098,\n\t29250 - 11905: 0xA099,\n\t29251 - 11905: 0xA09A,\n\t29252 - 11905: 0xA09B,\n\t29253 - 11905: 0xA09C,\n\t29254 - 11905: 0xA09D,\n\t29255 - 11905: 0xC6AC,\n\t29256 - 11905: 0xB0E6,\n\t29257 - 11905: 0xA09E,\n\t29258 - 11905: 0xA09F,\n\t29259 - 11905: 0xA0A0,\n\t29260 - 11905: 0xC5C6,\n\t29261 - 11905: 0xEBB9,\n\t29262 - 11905: 0xA0A1,\n\t29263 - 11905: 0xA0A2,\n\t29264 - 11905: 0xA0A3,\n\t29265 - 11905: 0xA0A4,\n\t29266 - 11905: 0xEBBA,\n\t29267 - 11905: 0xA0A5,\n\t29268 - 11905: 0xA0A6,\n\t29269 - 11905: 0xA0A7,\n\t29270 - 11905: 0xEBBB,\n\t29271 - 11905: 0xA0A8,\n\t29272 - 11905: 0xA0A9,\n\t29273 - 11905: 0xD1C0,\n\t29274 - 11905: 0xA0AA,\n\t29275 - 11905: 0xC5A3,\n\t29276 - 11905: 0xA0AB,\n\t29277 - 11905: 0xEAF2,\n\t29278 - 11905: 0xA0AC,\n\t29279 - 11905: 0xC4B2,\n\t29280 - 11905: 0xA0AD,\n\t29281 - 11905: 0xC4B5,\n\t29282 - 11905: 0xC0CE,\n\t29283 - 11905: 0xA0AE,\n\t29284 - 11905: 0xA0AF,\n\t29285 - 11905: 0xA0B0,\n\t29286 - 11905: 0xEAF3,\n\t29287 - 11905: 0xC4C1,\n\t29288 - 11905: 0xA0B1,\n\t29289 - 11905: 0xCEEF,\n\t29290 - 11905: 0xA0B2,\n\t29291 - 11905: 0xA0B3,\n\t29292 - 11905: 0xA0B4,\n\t29293 - 11905: 0xA0B5,\n\t29294 - 11905: 0xEAF0,\n\t29295 - 11905: 0xEAF4,\n\t29296 - 11905: 0xA0B6,\n\t29297 - 11905: 0xA0B7,\n\t29298 - 11905: 0xC9FC,\n\t29299 - 11905: 0xA0B8,\n\t29300 - 11905: 0xA0B9,\n\t29301 - 11905: 0xC7A3,\n\t29302 - 11905: 0xA0BA,\n\t29303 - 11905: 0xA0BB,\n\t29304 - 11905: 0xA0BC,\n\t29305 - 11905: 0xCCD8,\n\t29306 - 11905: 0xCEFE,\n\t29307 - 11905: 0xA0BD,\n\t29308 - 11905: 0xA0BE,\n\t29309 - 11905: 0xA0BF,\n\t29310 - 11905: 0xEAF5,\n\t29311 - 11905: 0xEAF6,\n\t29312 - 11905: 0xCFAC,\n\t29313 - 11905: 0xC0E7,\n\t29314 - 11905: 0xA0C0,\n\t29315 - 11905: 0xA0C1,\n\t29316 - 11905: 0xEAF7,\n\t29317 - 11905: 0xA0C2,\n\t29318 - 11905: 0xA0C3,\n\t29319 - 11905: 0xA0C4,\n\t29320 - 11905: 0xA0C5,\n\t29321 - 11905: 0xA0C6,\n\t29322 - 11905: 0xB6BF,\n\t29323 - 11905: 0xEAF8,\n\t29324 - 11905: 0xA0C7,\n\t29325 - 11905: 0xEAF9,\n\t29326 - 11905: 0xA0C8,\n\t29327 - 11905: 0xEAFA,\n\t29328 - 11905: 0xA0C9,\n\t29329 - 11905: 0xA0CA,\n\t29330 - 11905: 0xEAFB,\n\t29331 - 11905: 0xA0CB,\n\t29332 - 11905: 0xA0CC,\n\t29333 - 11905: 0xA0CD,\n\t29334 - 11905: 0xA0CE,\n\t29335 - 11905: 0xA0CF,\n\t29336 - 11905: 0xA0D0,\n\t29337 - 11905: 0xA0D1,\n\t29338 - 11905: 0xA0D2,\n\t29339 - 11905: 0xA0D3,\n\t29340 - 11905: 0xA0D4,\n\t29341 - 11905: 0xA0D5,\n\t29342 - 11905: 0xA0D6,\n\t29343 - 11905: 0xEAF1,\n\t29344 - 11905: 0xA0D7,\n\t29345 - 11905: 0xA0D8,\n\t29346 - 11905: 0xA0D9,\n\t29347 - 11905: 0xA0DA,\n\t29348 - 11905: 0xA0DB,\n\t29349 - 11905: 0xA0DC,\n\t29350 - 11905: 0xA0DD,\n\t29351 - 11905: 0xA0DE,\n\t29352 - 11905: 0xA0DF,\n\t29353 - 11905: 0xA0E0,\n\t29354 - 11905: 0xA0E1,\n\t29355 - 11905: 0xA0E2,\n\t29356 - 11905: 0xC8AE,\n\t29357 - 11905: 0xE1EB,\n\t29358 - 11905: 0xA0E3,\n\t29359 - 11905: 0xB7B8,\n\t29360 - 11905: 0xE1EC,\n\t29361 - 11905: 0xA0E4,\n\t29362 - 11905: 0xA0E5,\n\t29363 - 11905: 0xA0E6,\n\t29364 - 11905: 0xE1ED,\n\t29365 - 11905: 0xA0E7,\n\t29366 - 11905: 0xD7B4,\n\t29367 - 11905: 0xE1EE,\n\t29368 - 11905: 0xE1EF,\n\t29369 - 11905: 0xD3CC,\n\t29370 - 11905: 0xA0E8,\n\t29371 - 11905: 0xA0E9,\n\t29372 - 11905: 0xA0EA,\n\t29373 - 11905: 0xA0EB,\n\t29374 - 11905: 0xA0EC,\n\t29375 - 11905: 0xA0ED,\n\t29376 - 11905: 0xA0EE,\n\t29377 - 11905: 0xE1F1,\n\t29378 - 11905: 0xBFF1,\n\t29379 - 11905: 0xE1F0,\n\t29380 - 11905: 0xB5D2,\n\t29381 - 11905: 0xA0EF,\n\t29382 - 11905: 0xA0F0,\n\t29383 - 11905: 0xA0F1,\n\t29384 - 11905: 0xB1B7,\n\t29385 - 11905: 0xA0F2,\n\t29386 - 11905: 0xA0F3,\n\t29387 - 11905: 0xA0F4,\n\t29388 - 11905: 0xA0F5,\n\t29389 - 11905: 0xE1F3,\n\t29390 - 11905: 0xE1F2,\n\t29391 - 11905: 0xA0F6,\n\t29392 - 11905: 0xBAFC,\n\t29393 - 11905: 0xA0F7,\n\t29394 - 11905: 0xE1F4,\n\t29395 - 11905: 0xA0F8,\n\t29396 - 11905: 0xA0F9,\n\t29397 - 11905: 0xA0FA,\n\t29398 - 11905: 0xA0FB,\n\t29399 - 11905: 0xB9B7,\n\t29400 - 11905: 0xA0FC,\n\t29401 - 11905: 0xBED1,\n\t29402 - 11905: 0xA0FD,\n\t29403 - 11905: 0xA0FE,\n\t29404 - 11905: 0xAA40,\n\t29405 - 11905: 0xAA41,\n\t29406 - 11905: 0xC4FC,\n\t29407 - 11905: 0xAA42,\n\t29408 - 11905: 0xBADD,\n\t29409 - 11905: 0xBDC6,\n\t29410 - 11905: 0xAA43,\n\t29411 - 11905: 0xAA44,\n\t29412 - 11905: 0xAA45,\n\t29413 - 11905: 0xAA46,\n\t29414 - 11905: 0xAA47,\n\t29415 - 11905: 0xAA48,\n\t29416 - 11905: 0xE1F5,\n\t29417 - 11905: 0xE1F7,\n\t29418 - 11905: 0xAA49,\n\t29419 - 11905: 0xAA4A,\n\t29420 - 11905: 0xB6C0,\n\t29421 - 11905: 0xCFC1,\n\t29422 - 11905: 0xCAA8,\n\t29423 - 11905: 0xE1F6,\n\t29424 - 11905: 0xD5F8,\n\t29425 - 11905: 0xD3FC,\n\t29426 - 11905: 0xE1F8,\n\t29427 - 11905: 0xE1FC,\n\t29428 - 11905: 0xE1F9,\n\t29429 - 11905: 0xAA4B,\n\t29430 - 11905: 0xAA4C,\n\t29431 - 11905: 0xE1FA,\n\t29432 - 11905: 0xC0EA,\n\t29433 - 11905: 0xAA4D,\n\t29434 - 11905: 0xE1FE,\n\t29435 - 11905: 0xE2A1,\n\t29436 - 11905: 0xC0C7,\n\t29437 - 11905: 0xAA4E,\n\t29438 - 11905: 0xAA4F,\n\t29439 - 11905: 0xAA50,\n\t29440 - 11905: 0xAA51,\n\t29441 - 11905: 0xE1FB,\n\t29442 - 11905: 0xAA52,\n\t29443 - 11905: 0xE1FD,\n\t29444 - 11905: 0xAA53,\n\t29445 - 11905: 0xAA54,\n\t29446 - 11905: 0xAA55,\n\t29447 - 11905: 0xAA56,\n\t29448 - 11905: 0xAA57,\n\t29449 - 11905: 0xAA58,\n\t29450 - 11905: 0xE2A5,\n\t29451 - 11905: 0xAA59,\n\t29452 - 11905: 0xAA5A,\n\t29453 - 11905: 0xAA5B,\n\t29454 - 11905: 0xC1D4,\n\t29455 - 11905: 0xAA5C,\n\t29456 - 11905: 0xAA5D,\n\t29457 - 11905: 0xAA5E,\n\t29458 - 11905: 0xAA5F,\n\t29459 - 11905: 0xE2A3,\n\t29460 - 11905: 0xAA60,\n\t29461 - 11905: 0xE2A8,\n\t29462 - 11905: 0xB2FE,\n\t29463 - 11905: 0xE2A2,\n\t29464 - 11905: 0xAA61,\n\t29465 - 11905: 0xAA62,\n\t29466 - 11905: 0xAA63,\n\t29467 - 11905: 0xC3CD,\n\t29468 - 11905: 0xB2C2,\n\t29469 - 11905: 0xE2A7,\n\t29470 - 11905: 0xE2A6,\n\t29471 - 11905: 0xAA64,\n\t29472 - 11905: 0xAA65,\n\t29473 - 11905: 0xE2A4,\n\t29474 - 11905: 0xE2A9,\n\t29475 - 11905: 0xAA66,\n\t29476 - 11905: 0xAA67,\n\t29477 - 11905: 0xE2AB,\n\t29478 - 11905: 0xAA68,\n\t29479 - 11905: 0xAA69,\n\t29480 - 11905: 0xAA6A,\n\t29481 - 11905: 0xD0C9,\n\t29482 - 11905: 0xD6ED,\n\t29483 - 11905: 0xC3A8,\n\t29484 - 11905: 0xE2AC,\n\t29485 - 11905: 0xAA6B,\n\t29486 - 11905: 0xCFD7,\n\t29487 - 11905: 0xAA6C,\n\t29488 - 11905: 0xAA6D,\n\t29489 - 11905: 0xE2AE,\n\t29490 - 11905: 0xAA6E,\n\t29491 - 11905: 0xAA6F,\n\t29492 - 11905: 0xBAEF,\n\t29493 - 11905: 0xAA70,\n\t29494 - 11905: 0xAA71,\n\t29495 - 11905: 0xE9E0,\n\t29496 - 11905: 0xE2AD,\n\t29497 - 11905: 0xE2AA,\n\t29498 - 11905: 0xAA72,\n\t29499 - 11905: 0xAA73,\n\t29500 - 11905: 0xAA74,\n\t29501 - 11905: 0xAA75,\n\t29502 - 11905: 0xBBAB,\n\t29503 - 11905: 0xD4B3,\n\t29504 - 11905: 0xAA76,\n\t29505 - 11905: 0xAA77,\n\t29506 - 11905: 0xAA78,\n\t29507 - 11905: 0xAA79,\n\t29508 - 11905: 0xAA7A,\n\t29509 - 11905: 0xAA7B,\n\t29510 - 11905: 0xAA7C,\n\t29511 - 11905: 0xAA7D,\n\t29512 - 11905: 0xAA7E,\n\t29513 - 11905: 0xAA80,\n\t29514 - 11905: 0xAA81,\n\t29515 - 11905: 0xAA82,\n\t29516 - 11905: 0xAA83,\n\t29517 - 11905: 0xE2B0,\n\t29518 - 11905: 0xAA84,\n\t29519 - 11905: 0xAA85,\n\t29520 - 11905: 0xE2AF,\n\t29521 - 11905: 0xAA86,\n\t29522 - 11905: 0xE9E1,\n\t29523 - 11905: 0xAA87,\n\t29524 - 11905: 0xAA88,\n\t29525 - 11905: 0xAA89,\n\t29526 - 11905: 0xAA8A,\n\t29527 - 11905: 0xE2B1,\n\t29528 - 11905: 0xAA8B,\n\t29529 - 11905: 0xAA8C,\n\t29530 - 11905: 0xAA8D,\n\t29531 - 11905: 0xAA8E,\n\t29532 - 11905: 0xAA8F,\n\t29533 - 11905: 0xAA90,\n\t29534 - 11905: 0xAA91,\n\t29535 - 11905: 0xAA92,\n\t29536 - 11905: 0xE2B2,\n\t29537 - 11905: 0xAA93,\n\t29538 - 11905: 0xAA94,\n\t29539 - 11905: 0xAA95,\n\t29540 - 11905: 0xAA96,\n\t29541 - 11905: 0xAA97,\n\t29542 - 11905: 0xAA98,\n\t29543 - 11905: 0xAA99,\n\t29544 - 11905: 0xAA9A,\n\t29545 - 11905: 0xAA9B,\n\t29546 - 11905: 0xAA9C,\n\t29547 - 11905: 0xAA9D,\n\t29548 - 11905: 0xE2B3,\n\t29549 - 11905: 0xCCA1,\n\t29550 - 11905: 0xAA9E,\n\t29551 - 11905: 0xE2B4,\n\t29552 - 11905: 0xAA9F,\n\t29553 - 11905: 0xAAA0,\n\t29554 - 11905: 0xAB40,\n\t29555 - 11905: 0xAB41,\n\t29556 - 11905: 0xAB42,\n\t29557 - 11905: 0xAB43,\n\t29558 - 11905: 0xAB44,\n\t29559 - 11905: 0xAB45,\n\t29560 - 11905: 0xAB46,\n\t29561 - 11905: 0xAB47,\n\t29562 - 11905: 0xAB48,\n\t29563 - 11905: 0xAB49,\n\t29564 - 11905: 0xAB4A,\n\t29565 - 11905: 0xAB4B,\n\t29566 - 11905: 0xE2B5,\n\t29567 - 11905: 0xAB4C,\n\t29568 - 11905: 0xAB4D,\n\t29569 - 11905: 0xAB4E,\n\t29570 - 11905: 0xAB4F,\n\t29571 - 11905: 0xAB50,\n\t29572 - 11905: 0xD0FE,\n\t29573 - 11905: 0xAB51,\n\t29574 - 11905: 0xAB52,\n\t29575 - 11905: 0xC2CA,\n\t29576 - 11905: 0xAB53,\n\t29577 - 11905: 0xD3F1,\n\t29578 - 11905: 0xAB54,\n\t29579 - 11905: 0xCDF5,\n\t29580 - 11905: 0xAB55,\n\t29581 - 11905: 0xAB56,\n\t29582 - 11905: 0xE7E0,\n\t29583 - 11905: 0xAB57,\n\t29584 - 11905: 0xAB58,\n\t29585 - 11905: 0xE7E1,\n\t29586 - 11905: 0xAB59,\n\t29587 - 11905: 0xAB5A,\n\t29588 - 11905: 0xAB5B,\n\t29589 - 11905: 0xAB5C,\n\t29590 - 11905: 0xBEC1,\n\t29591 - 11905: 0xAB5D,\n\t29592 - 11905: 0xAB5E,\n\t29593 - 11905: 0xAB5F,\n\t29594 - 11905: 0xAB60,\n\t29595 - 11905: 0xC2EA,\n\t29596 - 11905: 0xAB61,\n\t29597 - 11905: 0xAB62,\n\t29598 - 11905: 0xAB63,\n\t29599 - 11905: 0xE7E4,\n\t29600 - 11905: 0xAB64,\n\t29601 - 11905: 0xAB65,\n\t29602 - 11905: 0xE7E3,\n\t29603 - 11905: 0xAB66,\n\t29604 - 11905: 0xAB67,\n\t29605 - 11905: 0xAB68,\n\t29606 - 11905: 0xAB69,\n\t29607 - 11905: 0xAB6A,\n\t29608 - 11905: 0xAB6B,\n\t29609 - 11905: 0xCDE6,\n\t29610 - 11905: 0xAB6C,\n\t29611 - 11905: 0xC3B5,\n\t29612 - 11905: 0xAB6D,\n\t29613 - 11905: 0xAB6E,\n\t29614 - 11905: 0xE7E2,\n\t29615 - 11905: 0xBBB7,\n\t29616 - 11905: 0xCFD6,\n\t29617 - 11905: 0xAB6F,\n\t29618 - 11905: 0xC1E1,\n\t29619 - 11905: 0xE7E9,\n\t29620 - 11905: 0xAB70,\n\t29621 - 11905: 0xAB71,\n\t29622 - 11905: 0xAB72,\n\t29623 - 11905: 0xE7E8,\n\t29624 - 11905: 0xAB73,\n\t29625 - 11905: 0xAB74,\n\t29626 - 11905: 0xE7F4,\n\t29627 - 11905: 0xB2A3,\n\t29628 - 11905: 0xAB75,\n\t29629 - 11905: 0xAB76,\n\t29630 - 11905: 0xAB77,\n\t29631 - 11905: 0xAB78,\n\t29632 - 11905: 0xE7EA,\n\t29633 - 11905: 0xAB79,\n\t29634 - 11905: 0xE7E6,\n\t29635 - 11905: 0xAB7A,\n\t29636 - 11905: 0xAB7B,\n\t29637 - 11905: 0xAB7C,\n\t29638 - 11905: 0xAB7D,\n\t29639 - 11905: 0xAB7E,\n\t29640 - 11905: 0xE7EC,\n\t29641 - 11905: 0xE7EB,\n\t29642 - 11905: 0xC9BA,\n\t29643 - 11905: 0xAB80,\n\t29644 - 11905: 0xAB81,\n\t29645 - 11905: 0xD5E4,\n\t29646 - 11905: 0xAB82,\n\t29647 - 11905: 0xE7E5,\n\t29648 - 11905: 0xB7A9,\n\t29649 - 11905: 0xE7E7,\n\t29650 - 11905: 0xAB83,\n\t29651 - 11905: 0xAB84,\n\t29652 - 11905: 0xAB85,\n\t29653 - 11905: 0xAB86,\n\t29654 - 11905: 0xAB87,\n\t29655 - 11905: 0xAB88,\n\t29656 - 11905: 0xAB89,\n\t29657 - 11905: 0xE7EE,\n\t29658 - 11905: 0xAB8A,\n\t29659 - 11905: 0xAB8B,\n\t29660 - 11905: 0xAB8C,\n\t29661 - 11905: 0xAB8D,\n\t29662 - 11905: 0xE7F3,\n\t29663 - 11905: 0xAB8E,\n\t29664 - 11905: 0xD6E9,\n\t29665 - 11905: 0xAB8F,\n\t29666 - 11905: 0xAB90,\n\t29667 - 11905: 0xAB91,\n\t29668 - 11905: 0xAB92,\n\t29669 - 11905: 0xE7ED,\n\t29670 - 11905: 0xAB93,\n\t29671 - 11905: 0xE7F2,\n\t29672 - 11905: 0xAB94,\n\t29673 - 11905: 0xE7F1,\n\t29674 - 11905: 0xAB95,\n\t29675 - 11905: 0xAB96,\n\t29676 - 11905: 0xAB97,\n\t29677 - 11905: 0xB0E0,\n\t29678 - 11905: 0xAB98,\n\t29679 - 11905: 0xAB99,\n\t29680 - 11905: 0xAB9A,\n\t29681 - 11905: 0xAB9B,\n\t29682 - 11905: 0xE7F5,\n\t29683 - 11905: 0xAB9C,\n\t29684 - 11905: 0xAB9D,\n\t29685 - 11905: 0xAB9E,\n\t29686 - 11905: 0xAB9F,\n\t29687 - 11905: 0xABA0,\n\t29688 - 11905: 0xAC40,\n\t29689 - 11905: 0xAC41,\n\t29690 - 11905: 0xAC42,\n\t29691 - 11905: 0xAC43,\n\t29692 - 11905: 0xAC44,\n\t29693 - 11905: 0xAC45,\n\t29694 - 11905: 0xAC46,\n\t29695 - 11905: 0xAC47,\n\t29696 - 11905: 0xAC48,\n\t29697 - 11905: 0xAC49,\n\t29698 - 11905: 0xAC4A,\n\t29699 - 11905: 0xC7F2,\n\t29700 - 11905: 0xAC4B,\n\t29701 - 11905: 0xC0C5,\n\t29702 - 11905: 0xC0ED,\n\t29703 - 11905: 0xAC4C,\n\t29704 - 11905: 0xAC4D,\n\t29705 - 11905: 0xC1F0,\n\t29706 - 11905: 0xE7F0,\n\t29707 - 11905: 0xAC4E,\n\t29708 - 11905: 0xAC4F,\n\t29709 - 11905: 0xAC50,\n\t29710 - 11905: 0xAC51,\n\t29711 - 11905: 0xE7F6,\n\t29712 - 11905: 0xCBF6,\n\t29713 - 11905: 0xAC52,\n\t29714 - 11905: 0xAC53,\n\t29715 - 11905: 0xAC54,\n\t29716 - 11905: 0xAC55,\n\t29717 - 11905: 0xAC56,\n\t29718 - 11905: 0xAC57,\n\t29719 - 11905: 0xAC58,\n\t29720 - 11905: 0xAC59,\n\t29721 - 11905: 0xAC5A,\n\t29722 - 11905: 0xE8A2,\n\t29723 - 11905: 0xE8A1,\n\t29724 - 11905: 0xAC5B,\n\t29725 - 11905: 0xAC5C,\n\t29726 - 11905: 0xAC5D,\n\t29727 - 11905: 0xAC5E,\n\t29728 - 11905: 0xAC5F,\n\t29729 - 11905: 0xAC60,\n\t29730 - 11905: 0xD7C1,\n\t29731 - 11905: 0xAC61,\n\t29732 - 11905: 0xAC62,\n\t29733 - 11905: 0xE7FA,\n\t29734 - 11905: 0xE7F9,\n\t29735 - 11905: 0xAC63,\n\t29736 - 11905: 0xE7FB,\n\t29737 - 11905: 0xAC64,\n\t29738 - 11905: 0xE7F7,\n\t29739 - 11905: 0xAC65,\n\t29740 - 11905: 0xE7FE,\n\t29741 - 11905: 0xAC66,\n\t29742 - 11905: 0xE7FD,\n\t29743 - 11905: 0xAC67,\n\t29744 - 11905: 0xE7FC,\n\t29745 - 11905: 0xAC68,\n\t29746 - 11905: 0xAC69,\n\t29747 - 11905: 0xC1D5,\n\t29748 - 11905: 0xC7D9,\n\t29749 - 11905: 0xC5FD,\n\t29750 - 11905: 0xC5C3,\n\t29751 - 11905: 0xAC6A,\n\t29752 - 11905: 0xAC6B,\n\t29753 - 11905: 0xAC6C,\n\t29754 - 11905: 0xAC6D,\n\t29755 - 11905: 0xAC6E,\n\t29756 - 11905: 0xC7ED,\n\t29757 - 11905: 0xAC6F,\n\t29758 - 11905: 0xAC70,\n\t29759 - 11905: 0xAC71,\n\t29760 - 11905: 0xAC72,\n\t29761 - 11905: 0xE8A3,\n\t29762 - 11905: 0xAC73,\n\t29763 - 11905: 0xAC74,\n\t29764 - 11905: 0xAC75,\n\t29765 - 11905: 0xAC76,\n\t29766 - 11905: 0xAC77,\n\t29767 - 11905: 0xAC78,\n\t29768 - 11905: 0xAC79,\n\t29769 - 11905: 0xAC7A,\n\t29770 - 11905: 0xAC7B,\n\t29771 - 11905: 0xAC7C,\n\t29772 - 11905: 0xAC7D,\n\t29773 - 11905: 0xAC7E,\n\t29774 - 11905: 0xAC80,\n\t29775 - 11905: 0xAC81,\n\t29776 - 11905: 0xAC82,\n\t29777 - 11905: 0xAC83,\n\t29778 - 11905: 0xAC84,\n\t29779 - 11905: 0xAC85,\n\t29780 - 11905: 0xAC86,\n\t29781 - 11905: 0xE8A6,\n\t29782 - 11905: 0xAC87,\n\t29783 - 11905: 0xE8A5,\n\t29784 - 11905: 0xAC88,\n\t29785 - 11905: 0xE8A7,\n\t29786 - 11905: 0xBAF7,\n\t29787 - 11905: 0xE7F8,\n\t29788 - 11905: 0xE8A4,\n\t29789 - 11905: 0xAC89,\n\t29790 - 11905: 0xC8F0,\n\t29791 - 11905: 0xC9AA,\n\t29792 - 11905: 0xAC8A,\n\t29793 - 11905: 0xAC8B,\n\t29794 - 11905: 0xAC8C,\n\t29795 - 11905: 0xAC8D,\n\t29796 - 11905: 0xAC8E,\n\t29797 - 11905: 0xAC8F,\n\t29798 - 11905: 0xAC90,\n\t29799 - 11905: 0xAC91,\n\t29800 - 11905: 0xAC92,\n\t29801 - 11905: 0xAC93,\n\t29802 - 11905: 0xAC94,\n\t29803 - 11905: 0xAC95,\n\t29804 - 11905: 0xAC96,\n\t29805 - 11905: 0xE8A9,\n\t29806 - 11905: 0xAC97,\n\t29807 - 11905: 0xAC98,\n\t29808 - 11905: 0xB9E5,\n\t29809 - 11905: 0xAC99,\n\t29810 - 11905: 0xAC9A,\n\t29811 - 11905: 0xAC9B,\n\t29812 - 11905: 0xAC9C,\n\t29813 - 11905: 0xAC9D,\n\t29814 - 11905: 0xD1FE,\n\t29815 - 11905: 0xE8A8,\n\t29816 - 11905: 0xAC9E,\n\t29817 - 11905: 0xAC9F,\n\t29818 - 11905: 0xACA0,\n\t29819 - 11905: 0xAD40,\n\t29820 - 11905: 0xAD41,\n\t29821 - 11905: 0xAD42,\n\t29822 - 11905: 0xE8AA,\n\t29823 - 11905: 0xAD43,\n\t29824 - 11905: 0xE8AD,\n\t29825 - 11905: 0xE8AE,\n\t29826 - 11905: 0xAD44,\n\t29827 - 11905: 0xC1A7,\n\t29828 - 11905: 0xAD45,\n\t29829 - 11905: 0xAD46,\n\t29830 - 11905: 0xAD47,\n\t29831 - 11905: 0xE8AF,\n\t29832 - 11905: 0xAD48,\n\t29833 - 11905: 0xAD49,\n\t29834 - 11905: 0xAD4A,\n\t29835 - 11905: 0xE8B0,\n\t29836 - 11905: 0xAD4B,\n\t29837 - 11905: 0xAD4C,\n\t29838 - 11905: 0xE8AC,\n\t29839 - 11905: 0xAD4D,\n\t29840 - 11905: 0xE8B4,\n\t29841 - 11905: 0xAD4E,\n\t29842 - 11905: 0xAD4F,\n\t29843 - 11905: 0xAD50,\n\t29844 - 11905: 0xAD51,\n\t29845 - 11905: 0xAD52,\n\t29846 - 11905: 0xAD53,\n\t29847 - 11905: 0xAD54,\n\t29848 - 11905: 0xAD55,\n\t29849 - 11905: 0xAD56,\n\t29850 - 11905: 0xAD57,\n\t29851 - 11905: 0xAD58,\n\t29852 - 11905: 0xE8AB,\n\t29853 - 11905: 0xAD59,\n\t29854 - 11905: 0xE8B1,\n\t29855 - 11905: 0xAD5A,\n\t29856 - 11905: 0xAD5B,\n\t29857 - 11905: 0xAD5C,\n\t29858 - 11905: 0xAD5D,\n\t29859 - 11905: 0xAD5E,\n\t29860 - 11905: 0xAD5F,\n\t29861 - 11905: 0xAD60,\n\t29862 - 11905: 0xAD61,\n\t29863 - 11905: 0xE8B5,\n\t29864 - 11905: 0xE8B2,\n\t29865 - 11905: 0xE8B3,\n\t29866 - 11905: 0xAD62,\n\t29867 - 11905: 0xAD63,\n\t29868 - 11905: 0xAD64,\n\t29869 - 11905: 0xAD65,\n\t29870 - 11905: 0xAD66,\n\t29871 - 11905: 0xAD67,\n\t29872 - 11905: 0xAD68,\n\t29873 - 11905: 0xAD69,\n\t29874 - 11905: 0xAD6A,\n\t29875 - 11905: 0xAD6B,\n\t29876 - 11905: 0xAD6C,\n\t29877 - 11905: 0xAD6D,\n\t29878 - 11905: 0xAD6E,\n\t29879 - 11905: 0xAD6F,\n\t29880 - 11905: 0xAD70,\n\t29881 - 11905: 0xAD71,\n\t29882 - 11905: 0xE8B7,\n\t29883 - 11905: 0xAD72,\n\t29884 - 11905: 0xAD73,\n\t29885 - 11905: 0xAD74,\n\t29886 - 11905: 0xAD75,\n\t29887 - 11905: 0xAD76,\n\t29888 - 11905: 0xAD77,\n\t29889 - 11905: 0xAD78,\n\t29890 - 11905: 0xAD79,\n\t29891 - 11905: 0xAD7A,\n\t29892 - 11905: 0xAD7B,\n\t29893 - 11905: 0xAD7C,\n\t29894 - 11905: 0xAD7D,\n\t29895 - 11905: 0xAD7E,\n\t29896 - 11905: 0xAD80,\n\t29897 - 11905: 0xAD81,\n\t29898 - 11905: 0xAD82,\n\t29899 - 11905: 0xAD83,\n\t29900 - 11905: 0xAD84,\n\t29901 - 11905: 0xAD85,\n\t29902 - 11905: 0xAD86,\n\t29903 - 11905: 0xAD87,\n\t29904 - 11905: 0xAD88,\n\t29905 - 11905: 0xAD89,\n\t29906 - 11905: 0xE8B6,\n\t29907 - 11905: 0xAD8A,\n\t29908 - 11905: 0xAD8B,\n\t29909 - 11905: 0xAD8C,\n\t29910 - 11905: 0xAD8D,\n\t29911 - 11905: 0xAD8E,\n\t29912 - 11905: 0xAD8F,\n\t29913 - 11905: 0xAD90,\n\t29914 - 11905: 0xAD91,\n\t29915 - 11905: 0xAD92,\n\t29916 - 11905: 0xB9CF,\n\t29917 - 11905: 0xAD93,\n\t29918 - 11905: 0xF0AC,\n\t29919 - 11905: 0xAD94,\n\t29920 - 11905: 0xF0AD,\n\t29921 - 11905: 0xAD95,\n\t29922 - 11905: 0xC6B0,\n\t29923 - 11905: 0xB0EA,\n\t29924 - 11905: 0xC8BF,\n\t29925 - 11905: 0xAD96,\n\t29926 - 11905: 0xCDDF,\n\t29927 - 11905: 0xAD97,\n\t29928 - 11905: 0xAD98,\n\t29929 - 11905: 0xAD99,\n\t29930 - 11905: 0xAD9A,\n\t29931 - 11905: 0xAD9B,\n\t29932 - 11905: 0xAD9C,\n\t29933 - 11905: 0xAD9D,\n\t29934 - 11905: 0xCECD,\n\t29935 - 11905: 0xEAB1,\n\t29936 - 11905: 0xAD9E,\n\t29937 - 11905: 0xAD9F,\n\t29938 - 11905: 0xADA0,\n\t29939 - 11905: 0xAE40,\n\t29940 - 11905: 0xEAB2,\n\t29941 - 11905: 0xAE41,\n\t29942 - 11905: 0xC6BF,\n\t29943 - 11905: 0xB4C9,\n\t29944 - 11905: 0xAE42,\n\t29945 - 11905: 0xAE43,\n\t29946 - 11905: 0xAE44,\n\t29947 - 11905: 0xAE45,\n\t29948 - 11905: 0xAE46,\n\t29949 - 11905: 0xAE47,\n\t29950 - 11905: 0xAE48,\n\t29951 - 11905: 0xEAB3,\n\t29952 - 11905: 0xAE49,\n\t29953 - 11905: 0xAE4A,\n\t29954 - 11905: 0xAE4B,\n\t29955 - 11905: 0xAE4C,\n\t29956 - 11905: 0xD5E7,\n\t29957 - 11905: 0xAE4D,\n\t29958 - 11905: 0xAE4E,\n\t29959 - 11905: 0xAE4F,\n\t29960 - 11905: 0xAE50,\n\t29961 - 11905: 0xAE51,\n\t29962 - 11905: 0xAE52,\n\t29963 - 11905: 0xAE53,\n\t29964 - 11905: 0xAE54,\n\t29965 - 11905: 0xDDF9,\n\t29966 - 11905: 0xAE55,\n\t29967 - 11905: 0xEAB4,\n\t29968 - 11905: 0xAE56,\n\t29969 - 11905: 0xEAB5,\n\t29970 - 11905: 0xAE57,\n\t29971 - 11905: 0xEAB6,\n\t29972 - 11905: 0xAE58,\n\t29973 - 11905: 0xAE59,\n\t29974 - 11905: 0xAE5A,\n\t29975 - 11905: 0xAE5B,\n\t29976 - 11905: 0xB8CA,\n\t29977 - 11905: 0xDFB0,\n\t29978 - 11905: 0xC9F5,\n\t29979 - 11905: 0xAE5C,\n\t29980 - 11905: 0xCCF0,\n\t29981 - 11905: 0xAE5D,\n\t29982 - 11905: 0xAE5E,\n\t29983 - 11905: 0xC9FA,\n\t29984 - 11905: 0xAE5F,\n\t29985 - 11905: 0xAE60,\n\t29986 - 11905: 0xAE61,\n\t29987 - 11905: 0xAE62,\n\t29988 - 11905: 0xAE63,\n\t29989 - 11905: 0xC9FB,\n\t29990 - 11905: 0xAE64,\n\t29991 - 11905: 0xAE65,\n\t29992 - 11905: 0xD3C3,\n\t29993 - 11905: 0xCBA6,\n\t29994 - 11905: 0xAE66,\n\t29995 - 11905: 0xB8A6,\n\t29996 - 11905: 0xF0AE,\n\t29997 - 11905: 0xB1C2,\n\t29998 - 11905: 0xAE67,\n\t29999 - 11905: 0xE5B8,\n\t30000 - 11905: 0xCCEF,\n\t30001 - 11905: 0xD3C9,\n\t30002 - 11905: 0xBCD7,\n\t30003 - 11905: 0xC9EA,\n\t30004 - 11905: 0xAE68,\n\t30005 - 11905: 0xB5E7,\n\t30006 - 11905: 0xAE69,\n\t30007 - 11905: 0xC4D0,\n\t30008 - 11905: 0xB5E9,\n\t30009 - 11905: 0xAE6A,\n\t30010 - 11905: 0xEEAE,\n\t30011 - 11905: 0xBBAD,\n\t30012 - 11905: 0xAE6B,\n\t30013 - 11905: 0xAE6C,\n\t30014 - 11905: 0xE7DE,\n\t30015 - 11905: 0xAE6D,\n\t30016 - 11905: 0xEEAF,\n\t30017 - 11905: 0xAE6E,\n\t30018 - 11905: 0xAE6F,\n\t30019 - 11905: 0xAE70,\n\t30020 - 11905: 0xAE71,\n\t30021 - 11905: 0xB3A9,\n\t30022 - 11905: 0xAE72,\n\t30023 - 11905: 0xAE73,\n\t30024 - 11905: 0xEEB2,\n\t30025 - 11905: 0xAE74,\n\t30026 - 11905: 0xAE75,\n\t30027 - 11905: 0xEEB1,\n\t30028 - 11905: 0xBDE7,\n\t30029 - 11905: 0xAE76,\n\t30030 - 11905: 0xEEB0,\n\t30031 - 11905: 0xCEB7,\n\t30032 - 11905: 0xAE77,\n\t30033 - 11905: 0xAE78,\n\t30034 - 11905: 0xAE79,\n\t30035 - 11905: 0xAE7A,\n\t30036 - 11905: 0xC5CF,\n\t30037 - 11905: 0xAE7B,\n\t30038 - 11905: 0xAE7C,\n\t30039 - 11905: 0xAE7D,\n\t30040 - 11905: 0xAE7E,\n\t30041 - 11905: 0xC1F4,\n\t30042 - 11905: 0xDBCE,\n\t30043 - 11905: 0xEEB3,\n\t30044 - 11905: 0xD0F3,\n\t30045 - 11905: 0xAE80,\n\t30046 - 11905: 0xAE81,\n\t30047 - 11905: 0xAE82,\n\t30048 - 11905: 0xAE83,\n\t30049 - 11905: 0xAE84,\n\t30050 - 11905: 0xAE85,\n\t30051 - 11905: 0xAE86,\n\t30052 - 11905: 0xAE87,\n\t30053 - 11905: 0xC2D4,\n\t30054 - 11905: 0xC6E8,\n\t30055 - 11905: 0xAE88,\n\t30056 - 11905: 0xAE89,\n\t30057 - 11905: 0xAE8A,\n\t30058 - 11905: 0xB7AC,\n\t30059 - 11905: 0xAE8B,\n\t30060 - 11905: 0xAE8C,\n\t30061 - 11905: 0xAE8D,\n\t30062 - 11905: 0xAE8E,\n\t30063 - 11905: 0xAE8F,\n\t30064 - 11905: 0xAE90,\n\t30065 - 11905: 0xAE91,\n\t30066 - 11905: 0xEEB4,\n\t30067 - 11905: 0xAE92,\n\t30068 - 11905: 0xB3EB,\n\t30069 - 11905: 0xAE93,\n\t30070 - 11905: 0xAE94,\n\t30071 - 11905: 0xAE95,\n\t30072 - 11905: 0xBBFB,\n\t30073 - 11905: 0xEEB5,\n\t30074 - 11905: 0xAE96,\n\t30075 - 11905: 0xAE97,\n\t30076 - 11905: 0xAE98,\n\t30077 - 11905: 0xAE99,\n\t30078 - 11905: 0xAE9A,\n\t30079 - 11905: 0xE7DC,\n\t30080 - 11905: 0xAE9B,\n\t30081 - 11905: 0xAE9C,\n\t30082 - 11905: 0xAE9D,\n\t30083 - 11905: 0xEEB6,\n\t30084 - 11905: 0xAE9E,\n\t30085 - 11905: 0xAE9F,\n\t30086 - 11905: 0xBDAE,\n\t30087 - 11905: 0xAEA0,\n\t30088 - 11905: 0xAF40,\n\t30089 - 11905: 0xAF41,\n\t30090 - 11905: 0xAF42,\n\t30091 - 11905: 0xF1E2,\n\t30092 - 11905: 0xAF43,\n\t30093 - 11905: 0xAF44,\n\t30094 - 11905: 0xAF45,\n\t30095 - 11905: 0xCAE8,\n\t30096 - 11905: 0xAF46,\n\t30097 - 11905: 0xD2C9,\n\t30098 - 11905: 0xF0DA,\n\t30099 - 11905: 0xAF47,\n\t30100 - 11905: 0xF0DB,\n\t30101 - 11905: 0xAF48,\n\t30102 - 11905: 0xF0DC,\n\t30103 - 11905: 0xC1C6,\n\t30104 - 11905: 0xAF49,\n\t30105 - 11905: 0xB8ED,\n\t30106 - 11905: 0xBECE,\n\t30107 - 11905: 0xAF4A,\n\t30108 - 11905: 0xAF4B,\n\t30109 - 11905: 0xF0DE,\n\t30110 - 11905: 0xAF4C,\n\t30111 - 11905: 0xC5B1,\n\t30112 - 11905: 0xF0DD,\n\t30113 - 11905: 0xD1F1,\n\t30114 - 11905: 0xAF4D,\n\t30115 - 11905: 0xF0E0,\n\t30116 - 11905: 0xB0CC,\n\t30117 - 11905: 0xBDEA,\n\t30118 - 11905: 0xAF4E,\n\t30119 - 11905: 0xAF4F,\n\t30120 - 11905: 0xAF50,\n\t30121 - 11905: 0xAF51,\n\t30122 - 11905: 0xAF52,\n\t30123 - 11905: 0xD2DF,\n\t30124 - 11905: 0xF0DF,\n\t30125 - 11905: 0xAF53,\n\t30126 - 11905: 0xB4AF,\n\t30127 - 11905: 0xB7E8,\n\t30128 - 11905: 0xF0E6,\n\t30129 - 11905: 0xF0E5,\n\t30130 - 11905: 0xC6A3,\n\t30131 - 11905: 0xF0E1,\n\t30132 - 11905: 0xF0E2,\n\t30133 - 11905: 0xB4C3,\n\t30134 - 11905: 0xAF54,\n\t30135 - 11905: 0xAF55,\n\t30136 - 11905: 0xF0E3,\n\t30137 - 11905: 0xD5EE,\n\t30138 - 11905: 0xAF56,\n\t30139 - 11905: 0xAF57,\n\t30140 - 11905: 0xCCDB,\n\t30141 - 11905: 0xBED2,\n\t30142 - 11905: 0xBCB2,\n\t30143 - 11905: 0xAF58,\n\t30144 - 11905: 0xAF59,\n\t30145 - 11905: 0xAF5A,\n\t30146 - 11905: 0xF0E8,\n\t30147 - 11905: 0xF0E7,\n\t30148 - 11905: 0xF0E4,\n\t30149 - 11905: 0xB2A1,\n\t30150 - 11905: 0xAF5B,\n\t30151 - 11905: 0xD6A2,\n\t30152 - 11905: 0xD3B8,\n\t30153 - 11905: 0xBEB7,\n\t30154 - 11905: 0xC8AC,\n\t30155 - 11905: 0xAF5C,\n\t30156 - 11905: 0xAF5D,\n\t30157 - 11905: 0xF0EA,\n\t30158 - 11905: 0xAF5E,\n\t30159 - 11905: 0xAF5F,\n\t30160 - 11905: 0xAF60,\n\t30161 - 11905: 0xAF61,\n\t30162 - 11905: 0xD1F7,\n\t30163 - 11905: 0xAF62,\n\t30164 - 11905: 0xD6CC,\n\t30165 - 11905: 0xBADB,\n\t30166 - 11905: 0xF0E9,\n\t30167 - 11905: 0xAF63,\n\t30168 - 11905: 0xB6BB,\n\t30169 - 11905: 0xAF64,\n\t30170 - 11905: 0xAF65,\n\t30171 - 11905: 0xCDB4,\n\t30172 - 11905: 0xAF66,\n\t30173 - 11905: 0xAF67,\n\t30174 - 11905: 0xC6A6,\n\t30175 - 11905: 0xAF68,\n\t30176 - 11905: 0xAF69,\n\t30177 - 11905: 0xAF6A,\n\t30178 - 11905: 0xC1A1,\n\t30179 - 11905: 0xF0EB,\n\t30180 - 11905: 0xF0EE,\n\t30181 - 11905: 0xAF6B,\n\t30182 - 11905: 0xF0ED,\n\t30183 - 11905: 0xF0F0,\n\t30184 - 11905: 0xF0EC,\n\t30185 - 11905: 0xAF6C,\n\t30186 - 11905: 0xBBBE,\n\t30187 - 11905: 0xF0EF,\n\t30188 - 11905: 0xAF6D,\n\t30189 - 11905: 0xAF6E,\n\t30190 - 11905: 0xAF6F,\n\t30191 - 11905: 0xAF70,\n\t30192 - 11905: 0xCCB5,\n\t30193 - 11905: 0xF0F2,\n\t30194 - 11905: 0xAF71,\n\t30195 - 11905: 0xAF72,\n\t30196 - 11905: 0xB3D5,\n\t30197 - 11905: 0xAF73,\n\t30198 - 11905: 0xAF74,\n\t30199 - 11905: 0xAF75,\n\t30200 - 11905: 0xAF76,\n\t30201 - 11905: 0xB1D4,\n\t30202 - 11905: 0xAF77,\n\t30203 - 11905: 0xAF78,\n\t30204 - 11905: 0xF0F3,\n\t30205 - 11905: 0xAF79,\n\t30206 - 11905: 0xAF7A,\n\t30207 - 11905: 0xF0F4,\n\t30208 - 11905: 0xF0F6,\n\t30209 - 11905: 0xB4E1,\n\t30210 - 11905: 0xAF7B,\n\t30211 - 11905: 0xF0F1,\n\t30212 - 11905: 0xAF7C,\n\t30213 - 11905: 0xF0F7,\n\t30214 - 11905: 0xAF7D,\n\t30215 - 11905: 0xAF7E,\n\t30216 - 11905: 0xAF80,\n\t30217 - 11905: 0xAF81,\n\t30218 - 11905: 0xF0FA,\n\t30219 - 11905: 0xAF82,\n\t30220 - 11905: 0xF0F8,\n\t30221 - 11905: 0xAF83,\n\t30222 - 11905: 0xAF84,\n\t30223 - 11905: 0xAF85,\n\t30224 - 11905: 0xF0F5,\n\t30225 - 11905: 0xAF86,\n\t30226 - 11905: 0xAF87,\n\t30227 - 11905: 0xAF88,\n\t30228 - 11905: 0xAF89,\n\t30229 - 11905: 0xF0FD,\n\t30230 - 11905: 0xAF8A,\n\t30231 - 11905: 0xF0F9,\n\t30232 - 11905: 0xF0FC,\n\t30233 - 11905: 0xF0FE,\n\t30234 - 11905: 0xAF8B,\n\t30235 - 11905: 0xF1A1,\n\t30236 - 11905: 0xAF8C,\n\t30237 - 11905: 0xAF8D,\n\t30238 - 11905: 0xAF8E,\n\t30239 - 11905: 0xCEC1,\n\t30240 - 11905: 0xF1A4,\n\t30241 - 11905: 0xAF8F,\n\t30242 - 11905: 0xF1A3,\n\t30243 - 11905: 0xAF90,\n\t30244 - 11905: 0xC1F6,\n\t30245 - 11905: 0xF0FB,\n\t30246 - 11905: 0xCADD,\n\t30247 - 11905: 0xAF91,\n\t30248 - 11905: 0xAF92,\n\t30249 - 11905: 0xB4F1,\n\t30250 - 11905: 0xB1F1,\n\t30251 - 11905: 0xCCB1,\n\t30252 - 11905: 0xAF93,\n\t30253 - 11905: 0xF1A6,\n\t30254 - 11905: 0xAF94,\n\t30255 - 11905: 0xAF95,\n\t30256 - 11905: 0xF1A7,\n\t30257 - 11905: 0xAF96,\n\t30258 - 11905: 0xAF97,\n\t30259 - 11905: 0xF1AC,\n\t30260 - 11905: 0xD5CE,\n\t30261 - 11905: 0xF1A9,\n\t30262 - 11905: 0xAF98,\n\t30263 - 11905: 0xAF99,\n\t30264 - 11905: 0xC8B3,\n\t30265 - 11905: 0xAF9A,\n\t30266 - 11905: 0xAF9B,\n\t30267 - 11905: 0xAF9C,\n\t30268 - 11905: 0xF1A2,\n\t30269 - 11905: 0xAF9D,\n\t30270 - 11905: 0xF1AB,\n\t30271 - 11905: 0xF1A8,\n\t30272 - 11905: 0xF1A5,\n\t30273 - 11905: 0xAF9E,\n\t30274 - 11905: 0xAF9F,\n\t30275 - 11905: 0xF1AA,\n\t30276 - 11905: 0xAFA0,\n\t30277 - 11905: 0xB040,\n\t30278 - 11905: 0xB041,\n\t30279 - 11905: 0xB042,\n\t30280 - 11905: 0xB043,\n\t30281 - 11905: 0xB044,\n\t30282 - 11905: 0xB045,\n\t30283 - 11905: 0xB046,\n\t30284 - 11905: 0xB0A9,\n\t30285 - 11905: 0xF1AD,\n\t30286 - 11905: 0xB047,\n\t30287 - 11905: 0xB048,\n\t30288 - 11905: 0xB049,\n\t30289 - 11905: 0xB04A,\n\t30290 - 11905: 0xB04B,\n\t30291 - 11905: 0xB04C,\n\t30292 - 11905: 0xF1AF,\n\t30293 - 11905: 0xB04D,\n\t30294 - 11905: 0xF1B1,\n\t30295 - 11905: 0xB04E,\n\t30296 - 11905: 0xB04F,\n\t30297 - 11905: 0xB050,\n\t30298 - 11905: 0xB051,\n\t30299 - 11905: 0xB052,\n\t30300 - 11905: 0xF1B0,\n\t30301 - 11905: 0xB053,\n\t30302 - 11905: 0xF1AE,\n\t30303 - 11905: 0xB054,\n\t30304 - 11905: 0xB055,\n\t30305 - 11905: 0xB056,\n\t30306 - 11905: 0xB057,\n\t30307 - 11905: 0xD1A2,\n\t30308 - 11905: 0xB058,\n\t30309 - 11905: 0xB059,\n\t30310 - 11905: 0xB05A,\n\t30311 - 11905: 0xB05B,\n\t30312 - 11905: 0xB05C,\n\t30313 - 11905: 0xB05D,\n\t30314 - 11905: 0xB05E,\n\t30315 - 11905: 0xF1B2,\n\t30316 - 11905: 0xB05F,\n\t30317 - 11905: 0xB060,\n\t30318 - 11905: 0xB061,\n\t30319 - 11905: 0xF1B3,\n\t30320 - 11905: 0xB062,\n\t30321 - 11905: 0xB063,\n\t30322 - 11905: 0xB064,\n\t30323 - 11905: 0xB065,\n\t30324 - 11905: 0xB066,\n\t30325 - 11905: 0xB067,\n\t30326 - 11905: 0xB068,\n\t30327 - 11905: 0xB069,\n\t30328 - 11905: 0xB9EF,\n\t30329 - 11905: 0xB06A,\n\t30330 - 11905: 0xB06B,\n\t30331 - 11905: 0xB5C7,\n\t30332 - 11905: 0xB06C,\n\t30333 - 11905: 0xB0D7,\n\t30334 - 11905: 0xB0D9,\n\t30335 - 11905: 0xB06D,\n\t30336 - 11905: 0xB06E,\n\t30337 - 11905: 0xB06F,\n\t30338 - 11905: 0xD4ED,\n\t30339 - 11905: 0xB070,\n\t30340 - 11905: 0xB5C4,\n\t30341 - 11905: 0xB071,\n\t30342 - 11905: 0xBDD4,\n\t30343 - 11905: 0xBBCA,\n\t30344 - 11905: 0xF0A7,\n\t30345 - 11905: 0xB072,\n\t30346 - 11905: 0xB073,\n\t30347 - 11905: 0xB8DE,\n\t30348 - 11905: 0xB074,\n\t30349 - 11905: 0xB075,\n\t30350 - 11905: 0xF0A8,\n\t30351 - 11905: 0xB076,\n\t30352 - 11905: 0xB077,\n\t30353 - 11905: 0xB0A8,\n\t30354 - 11905: 0xB078,\n\t30355 - 11905: 0xF0A9,\n\t30356 - 11905: 0xB079,\n\t30357 - 11905: 0xB07A,\n\t30358 - 11905: 0xCDEE,\n\t30359 - 11905: 0xB07B,\n\t30360 - 11905: 0xB07C,\n\t30361 - 11905: 0xF0AA,\n\t30362 - 11905: 0xB07D,\n\t30363 - 11905: 0xB07E,\n\t30364 - 11905: 0xB080,\n\t30365 - 11905: 0xB081,\n\t30366 - 11905: 0xB082,\n\t30367 - 11905: 0xB083,\n\t30368 - 11905: 0xB084,\n\t30369 - 11905: 0xB085,\n\t30370 - 11905: 0xB086,\n\t30371 - 11905: 0xB087,\n\t30372 - 11905: 0xF0AB,\n\t30373 - 11905: 0xB088,\n\t30374 - 11905: 0xB089,\n\t30375 - 11905: 0xB08A,\n\t30376 - 11905: 0xB08B,\n\t30377 - 11905: 0xB08C,\n\t30378 - 11905: 0xB08D,\n\t30379 - 11905: 0xB08E,\n\t30380 - 11905: 0xB08F,\n\t30381 - 11905: 0xB090,\n\t30382 - 11905: 0xC6A4,\n\t30383 - 11905: 0xB091,\n\t30384 - 11905: 0xB092,\n\t30385 - 11905: 0xD6E5,\n\t30386 - 11905: 0xF1E4,\n\t30387 - 11905: 0xB093,\n\t30388 - 11905: 0xF1E5,\n\t30389 - 11905: 0xB094,\n\t30390 - 11905: 0xB095,\n\t30391 - 11905: 0xB096,\n\t30392 - 11905: 0xB097,\n\t30393 - 11905: 0xB098,\n\t30394 - 11905: 0xB099,\n\t30395 - 11905: 0xB09A,\n\t30396 - 11905: 0xB09B,\n\t30397 - 11905: 0xB09C,\n\t30398 - 11905: 0xB09D,\n\t30399 - 11905: 0xC3F3,\n\t30400 - 11905: 0xB09E,\n\t30401 - 11905: 0xB09F,\n\t30402 - 11905: 0xD3DB,\n\t30403 - 11905: 0xB0A0,\n\t30404 - 11905: 0xB140,\n\t30405 - 11905: 0xD6D1,\n\t30406 - 11905: 0xC5E8,\n\t30407 - 11905: 0xB141,\n\t30408 - 11905: 0xD3AF,\n\t30409 - 11905: 0xB142,\n\t30410 - 11905: 0xD2E6,\n\t30411 - 11905: 0xB143,\n\t30412 - 11905: 0xB144,\n\t30413 - 11905: 0xEEC1,\n\t30414 - 11905: 0xB0BB,\n\t30415 - 11905: 0xD5B5,\n\t30416 - 11905: 0xD1CE,\n\t30417 - 11905: 0xBCE0,\n\t30418 - 11905: 0xBAD0,\n\t30419 - 11905: 0xB145,\n\t30420 - 11905: 0xBFF8,\n\t30421 - 11905: 0xB146,\n\t30422 - 11905: 0xB8C7,\n\t30423 - 11905: 0xB5C1,\n\t30424 - 11905: 0xC5CC,\n\t30425 - 11905: 0xB147,\n\t30426 - 11905: 0xB148,\n\t30427 - 11905: 0xCAA2,\n\t30428 - 11905: 0xB149,\n\t30429 - 11905: 0xB14A,\n\t30430 - 11905: 0xB14B,\n\t30431 - 11905: 0xC3CB,\n\t30432 - 11905: 0xB14C,\n\t30433 - 11905: 0xB14D,\n\t30434 - 11905: 0xB14E,\n\t30435 - 11905: 0xB14F,\n\t30436 - 11905: 0xB150,\n\t30437 - 11905: 0xEEC2,\n\t30438 - 11905: 0xB151,\n\t30439 - 11905: 0xB152,\n\t30440 - 11905: 0xB153,\n\t30441 - 11905: 0xB154,\n\t30442 - 11905: 0xB155,\n\t30443 - 11905: 0xB156,\n\t30444 - 11905: 0xB157,\n\t30445 - 11905: 0xB158,\n\t30446 - 11905: 0xC4BF,\n\t30447 - 11905: 0xB6A2,\n\t30448 - 11905: 0xB159,\n\t30449 - 11905: 0xEDEC,\n\t30450 - 11905: 0xC3A4,\n\t30451 - 11905: 0xB15A,\n\t30452 - 11905: 0xD6B1,\n\t30453 - 11905: 0xB15B,\n\t30454 - 11905: 0xB15C,\n\t30455 - 11905: 0xB15D,\n\t30456 - 11905: 0xCFE0,\n\t30457 - 11905: 0xEDEF,\n\t30458 - 11905: 0xB15E,\n\t30459 - 11905: 0xB15F,\n\t30460 - 11905: 0xC5CE,\n\t30461 - 11905: 0xB160,\n\t30462 - 11905: 0xB6DC,\n\t30463 - 11905: 0xB161,\n\t30464 - 11905: 0xB162,\n\t30465 - 11905: 0xCAA1,\n\t30466 - 11905: 0xB163,\n\t30467 - 11905: 0xB164,\n\t30468 - 11905: 0xEDED,\n\t30469 - 11905: 0xB165,\n\t30470 - 11905: 0xB166,\n\t30471 - 11905: 0xEDF0,\n\t30472 - 11905: 0xEDF1,\n\t30473 - 11905: 0xC3BC,\n\t30474 - 11905: 0xB167,\n\t30475 - 11905: 0xBFB4,\n\t30476 - 11905: 0xB168,\n\t30477 - 11905: 0xEDEE,\n\t30478 - 11905: 0xB169,\n\t30479 - 11905: 0xB16A,\n\t30480 - 11905: 0xB16B,\n\t30481 - 11905: 0xB16C,\n\t30482 - 11905: 0xB16D,\n\t30483 - 11905: 0xB16E,\n\t30484 - 11905: 0xB16F,\n\t30485 - 11905: 0xB170,\n\t30486 - 11905: 0xB171,\n\t30487 - 11905: 0xB172,\n\t30488 - 11905: 0xB173,\n\t30489 - 11905: 0xEDF4,\n\t30490 - 11905: 0xEDF2,\n\t30491 - 11905: 0xB174,\n\t30492 - 11905: 0xB175,\n\t30493 - 11905: 0xB176,\n\t30494 - 11905: 0xB177,\n\t30495 - 11905: 0xD5E6,\n\t30496 - 11905: 0xC3DF,\n\t30497 - 11905: 0xB178,\n\t30498 - 11905: 0xEDF3,\n\t30499 - 11905: 0xB179,\n\t30500 - 11905: 0xB17A,\n\t30501 - 11905: 0xB17B,\n\t30502 - 11905: 0xEDF6,\n\t30503 - 11905: 0xB17C,\n\t30504 - 11905: 0xD5A3,\n\t30505 - 11905: 0xD1A3,\n\t30506 - 11905: 0xB17D,\n\t30507 - 11905: 0xB17E,\n\t30508 - 11905: 0xB180,\n\t30509 - 11905: 0xEDF5,\n\t30510 - 11905: 0xB181,\n\t30511 - 11905: 0xC3D0,\n\t30512 - 11905: 0xB182,\n\t30513 - 11905: 0xB183,\n\t30514 - 11905: 0xB184,\n\t30515 - 11905: 0xB185,\n\t30516 - 11905: 0xB186,\n\t30517 - 11905: 0xEDF7,\n\t30518 - 11905: 0xBFF4,\n\t30519 - 11905: 0xBEEC,\n\t30520 - 11905: 0xEDF8,\n\t30521 - 11905: 0xB187,\n\t30522 - 11905: 0xCCF7,\n\t30523 - 11905: 0xB188,\n\t30524 - 11905: 0xD1DB,\n\t30525 - 11905: 0xB189,\n\t30526 - 11905: 0xB18A,\n\t30527 - 11905: 0xB18B,\n\t30528 - 11905: 0xD7C5,\n\t30529 - 11905: 0xD5F6,\n\t30530 - 11905: 0xB18C,\n\t30531 - 11905: 0xEDFC,\n\t30532 - 11905: 0xB18D,\n\t30533 - 11905: 0xB18E,\n\t30534 - 11905: 0xB18F,\n\t30535 - 11905: 0xEDFB,\n\t30536 - 11905: 0xB190,\n\t30537 - 11905: 0xB191,\n\t30538 - 11905: 0xB192,\n\t30539 - 11905: 0xB193,\n\t30540 - 11905: 0xB194,\n\t30541 - 11905: 0xB195,\n\t30542 - 11905: 0xB196,\n\t30543 - 11905: 0xB197,\n\t30544 - 11905: 0xEDF9,\n\t30545 - 11905: 0xEDFA,\n\t30546 - 11905: 0xB198,\n\t30547 - 11905: 0xB199,\n\t30548 - 11905: 0xB19A,\n\t30549 - 11905: 0xB19B,\n\t30550 - 11905: 0xB19C,\n\t30551 - 11905: 0xB19D,\n\t30552 - 11905: 0xB19E,\n\t30553 - 11905: 0xB19F,\n\t30554 - 11905: 0xEDFD,\n\t30555 - 11905: 0xBEA6,\n\t30556 - 11905: 0xB1A0,\n\t30557 - 11905: 0xB240,\n\t30558 - 11905: 0xB241,\n\t30559 - 11905: 0xB242,\n\t30560 - 11905: 0xB243,\n\t30561 - 11905: 0xCBAF,\n\t30562 - 11905: 0xEEA1,\n\t30563 - 11905: 0xB6BD,\n\t30564 - 11905: 0xB244,\n\t30565 - 11905: 0xEEA2,\n\t30566 - 11905: 0xC4C0,\n\t30567 - 11905: 0xB245,\n\t30568 - 11905: 0xEDFE,\n\t30569 - 11905: 0xB246,\n\t30570 - 11905: 0xB247,\n\t30571 - 11905: 0xBDDE,\n\t30572 - 11905: 0xB2C7,\n\t30573 - 11905: 0xB248,\n\t30574 - 11905: 0xB249,\n\t30575 - 11905: 0xB24A,\n\t30576 - 11905: 0xB24B,\n\t30577 - 11905: 0xB24C,\n\t30578 - 11905: 0xB24D,\n\t30579 - 11905: 0xB24E,\n\t30580 - 11905: 0xB24F,\n\t30581 - 11905: 0xB250,\n\t30582 - 11905: 0xB251,\n\t30583 - 11905: 0xB252,\n\t30584 - 11905: 0xB253,\n\t30585 - 11905: 0xB6C3,\n\t30586 - 11905: 0xB254,\n\t30587 - 11905: 0xB255,\n\t30588 - 11905: 0xB256,\n\t30589 - 11905: 0xEEA5,\n\t30590 - 11905: 0xD8BA,\n\t30591 - 11905: 0xEEA3,\n\t30592 - 11905: 0xEEA6,\n\t30593 - 11905: 0xB257,\n\t30594 - 11905: 0xB258,\n\t30595 - 11905: 0xB259,\n\t30596 - 11905: 0xC3E9,\n\t30597 - 11905: 0xB3F2,\n\t30598 - 11905: 0xB25A,\n\t30599 - 11905: 0xB25B,\n\t30600 - 11905: 0xB25C,\n\t30601 - 11905: 0xB25D,\n\t30602 - 11905: 0xB25E,\n\t30603 - 11905: 0xB25F,\n\t30604 - 11905: 0xEEA7,\n\t30605 - 11905: 0xEEA4,\n\t30606 - 11905: 0xCFB9,\n\t30607 - 11905: 0xB260,\n\t30608 - 11905: 0xB261,\n\t30609 - 11905: 0xEEA8,\n\t30610 - 11905: 0xC2F7,\n\t30611 - 11905: 0xB262,\n\t30612 - 11905: 0xB263,\n\t30613 - 11905: 0xB264,\n\t30614 - 11905: 0xB265,\n\t30615 - 11905: 0xB266,\n\t30616 - 11905: 0xB267,\n\t30617 - 11905: 0xB268,\n\t30618 - 11905: 0xB269,\n\t30619 - 11905: 0xB26A,\n\t30620 - 11905: 0xB26B,\n\t30621 - 11905: 0xB26C,\n\t30622 - 11905: 0xB26D,\n\t30623 - 11905: 0xEEA9,\n\t30624 - 11905: 0xEEAA,\n\t30625 - 11905: 0xB26E,\n\t30626 - 11905: 0xDEAB,\n\t30627 - 11905: 0xB26F,\n\t30628 - 11905: 0xB270,\n\t30629 - 11905: 0xC6B3,\n\t30630 - 11905: 0xB271,\n\t30631 - 11905: 0xC7C6,\n\t30632 - 11905: 0xB272,\n\t30633 - 11905: 0xD6F5,\n\t30634 - 11905: 0xB5C9,\n\t30635 - 11905: 0xB273,\n\t30636 - 11905: 0xCBB2,\n\t30637 - 11905: 0xB274,\n\t30638 - 11905: 0xB275,\n\t30639 - 11905: 0xB276,\n\t30640 - 11905: 0xEEAB,\n\t30641 - 11905: 0xB277,\n\t30642 - 11905: 0xB278,\n\t30643 - 11905: 0xCDAB,\n\t30644 - 11905: 0xB279,\n\t30645 - 11905: 0xEEAC,\n\t30646 - 11905: 0xB27A,\n\t30647 - 11905: 0xB27B,\n\t30648 - 11905: 0xB27C,\n\t30649 - 11905: 0xB27D,\n\t30650 - 11905: 0xB27E,\n\t30651 - 11905: 0xD5B0,\n\t30652 - 11905: 0xB280,\n\t30653 - 11905: 0xEEAD,\n\t30654 - 11905: 0xB281,\n\t30655 - 11905: 0xF6C4,\n\t30656 - 11905: 0xB282,\n\t30657 - 11905: 0xB283,\n\t30658 - 11905: 0xB284,\n\t30659 - 11905: 0xB285,\n\t30660 - 11905: 0xB286,\n\t30661 - 11905: 0xB287,\n\t30662 - 11905: 0xB288,\n\t30663 - 11905: 0xB289,\n\t30664 - 11905: 0xB28A,\n\t30665 - 11905: 0xB28B,\n\t30666 - 11905: 0xB28C,\n\t30667 - 11905: 0xB28D,\n\t30668 - 11905: 0xB28E,\n\t30669 - 11905: 0xDBC7,\n\t30670 - 11905: 0xB28F,\n\t30671 - 11905: 0xB290,\n\t30672 - 11905: 0xB291,\n\t30673 - 11905: 0xB292,\n\t30674 - 11905: 0xB293,\n\t30675 - 11905: 0xB294,\n\t30676 - 11905: 0xB295,\n\t30677 - 11905: 0xB296,\n\t30678 - 11905: 0xB297,\n\t30679 - 11905: 0xB4A3,\n\t30680 - 11905: 0xB298,\n\t30681 - 11905: 0xB299,\n\t30682 - 11905: 0xB29A,\n\t30683 - 11905: 0xC3AC,\n\t30684 - 11905: 0xF1E6,\n\t30685 - 11905: 0xB29B,\n\t30686 - 11905: 0xB29C,\n\t30687 - 11905: 0xB29D,\n\t30688 - 11905: 0xB29E,\n\t30689 - 11905: 0xB29F,\n\t30690 - 11905: 0xCAB8,\n\t30691 - 11905: 0xD2D3,\n\t30692 - 11905: 0xB2A0,\n\t30693 - 11905: 0xD6AA,\n\t30694 - 11905: 0xB340,\n\t30695 - 11905: 0xEFF2,\n\t30696 - 11905: 0xB341,\n\t30697 - 11905: 0xBED8,\n\t30698 - 11905: 0xB342,\n\t30699 - 11905: 0xBDC3,\n\t30700 - 11905: 0xEFF3,\n\t30701 - 11905: 0xB6CC,\n\t30702 - 11905: 0xB0AB,\n\t30703 - 11905: 0xB343,\n\t30704 - 11905: 0xB344,\n\t30705 - 11905: 0xB345,\n\t30706 - 11905: 0xB346,\n\t30707 - 11905: 0xCAAF,\n\t30708 - 11905: 0xB347,\n\t30709 - 11905: 0xB348,\n\t30710 - 11905: 0xEDB6,\n\t30711 - 11905: 0xB349,\n\t30712 - 11905: 0xEDB7,\n\t30713 - 11905: 0xB34A,\n\t30714 - 11905: 0xB34B,\n\t30715 - 11905: 0xB34C,\n\t30716 - 11905: 0xB34D,\n\t30717 - 11905: 0xCEF9,\n\t30718 - 11905: 0xB7AF,\n\t30719 - 11905: 0xBFF3,\n\t30720 - 11905: 0xEDB8,\n\t30721 - 11905: 0xC2EB,\n\t30722 - 11905: 0xC9B0,\n\t30723 - 11905: 0xB34E,\n\t30724 - 11905: 0xB34F,\n\t30725 - 11905: 0xB350,\n\t30726 - 11905: 0xB351,\n\t30727 - 11905: 0xB352,\n\t30728 - 11905: 0xB353,\n\t30729 - 11905: 0xEDB9,\n\t30730 - 11905: 0xB354,\n\t30731 - 11905: 0xB355,\n\t30732 - 11905: 0xC6F6,\n\t30733 - 11905: 0xBFB3,\n\t30734 - 11905: 0xB356,\n\t30735 - 11905: 0xB357,\n\t30736 - 11905: 0xB358,\n\t30737 - 11905: 0xEDBC,\n\t30738 - 11905: 0xC5F8,\n\t30739 - 11905: 0xB359,\n\t30740 - 11905: 0xD1D0,\n\t30741 - 11905: 0xB35A,\n\t30742 - 11905: 0xD7A9,\n\t30743 - 11905: 0xEDBA,\n\t30744 - 11905: 0xEDBB,\n\t30745 - 11905: 0xB35B,\n\t30746 - 11905: 0xD1E2,\n\t30747 - 11905: 0xB35C,\n\t30748 - 11905: 0xEDBF,\n\t30749 - 11905: 0xEDC0,\n\t30750 - 11905: 0xB35D,\n\t30751 - 11905: 0xEDC4,\n\t30752 - 11905: 0xB35E,\n\t30753 - 11905: 0xB35F,\n\t30754 - 11905: 0xB360,\n\t30755 - 11905: 0xEDC8,\n\t30756 - 11905: 0xB361,\n\t30757 - 11905: 0xEDC6,\n\t30758 - 11905: 0xEDCE,\n\t30759 - 11905: 0xD5E8,\n\t30760 - 11905: 0xB362,\n\t30761 - 11905: 0xEDC9,\n\t30762 - 11905: 0xB363,\n\t30763 - 11905: 0xB364,\n\t30764 - 11905: 0xEDC7,\n\t30765 - 11905: 0xEDBE,\n\t30766 - 11905: 0xB365,\n\t30767 - 11905: 0xB366,\n\t30768 - 11905: 0xC5E9,\n\t30769 - 11905: 0xB367,\n\t30770 - 11905: 0xB368,\n\t30771 - 11905: 0xB369,\n\t30772 - 11905: 0xC6C6,\n\t30773 - 11905: 0xB36A,\n\t30774 - 11905: 0xB36B,\n\t30775 - 11905: 0xC9E9,\n\t30776 - 11905: 0xD4D2,\n\t30777 - 11905: 0xEDC1,\n\t30778 - 11905: 0xEDC2,\n\t30779 - 11905: 0xEDC3,\n\t30780 - 11905: 0xEDC5,\n\t30781 - 11905: 0xB36C,\n\t30782 - 11905: 0xC0F9,\n\t30783 - 11905: 0xB36D,\n\t30784 - 11905: 0xB4A1,\n\t30785 - 11905: 0xB36E,\n\t30786 - 11905: 0xB36F,\n\t30787 - 11905: 0xB370,\n\t30788 - 11905: 0xB371,\n\t30789 - 11905: 0xB9E8,\n\t30790 - 11905: 0xB372,\n\t30791 - 11905: 0xEDD0,\n\t30792 - 11905: 0xB373,\n\t30793 - 11905: 0xB374,\n\t30794 - 11905: 0xB375,\n\t30795 - 11905: 0xB376,\n\t30796 - 11905: 0xEDD1,\n\t30797 - 11905: 0xB377,\n\t30798 - 11905: 0xEDCA,\n\t30799 - 11905: 0xB378,\n\t30800 - 11905: 0xEDCF,\n\t30801 - 11905: 0xB379,\n\t30802 - 11905: 0xCEF8,\n\t30803 - 11905: 0xB37A,\n\t30804 - 11905: 0xB37B,\n\t30805 - 11905: 0xCBB6,\n\t30806 - 11905: 0xEDCC,\n\t30807 - 11905: 0xEDCD,\n\t30808 - 11905: 0xB37C,\n\t30809 - 11905: 0xB37D,\n\t30810 - 11905: 0xB37E,\n\t30811 - 11905: 0xB380,\n\t30812 - 11905: 0xB381,\n\t30813 - 11905: 0xCFF5,\n\t30814 - 11905: 0xB382,\n\t30815 - 11905: 0xB383,\n\t30816 - 11905: 0xB384,\n\t30817 - 11905: 0xB385,\n\t30818 - 11905: 0xB386,\n\t30819 - 11905: 0xB387,\n\t30820 - 11905: 0xB388,\n\t30821 - 11905: 0xB389,\n\t30822 - 11905: 0xB38A,\n\t30823 - 11905: 0xB38B,\n\t30824 - 11905: 0xB38C,\n\t30825 - 11905: 0xB38D,\n\t30826 - 11905: 0xEDD2,\n\t30827 - 11905: 0xC1F2,\n\t30828 - 11905: 0xD3B2,\n\t30829 - 11905: 0xEDCB,\n\t30830 - 11905: 0xC8B7,\n\t30831 - 11905: 0xB38E,\n\t30832 - 11905: 0xB38F,\n\t30833 - 11905: 0xB390,\n\t30834 - 11905: 0xB391,\n\t30835 - 11905: 0xB392,\n\t30836 - 11905: 0xB393,\n\t30837 - 11905: 0xB394,\n\t30838 - 11905: 0xB395,\n\t30839 - 11905: 0xBCEF,\n\t30840 - 11905: 0xB396,\n\t30841 - 11905: 0xB397,\n\t30842 - 11905: 0xB398,\n\t30843 - 11905: 0xB399,\n\t30844 - 11905: 0xC5F0,\n\t30845 - 11905: 0xB39A,\n\t30846 - 11905: 0xB39B,\n\t30847 - 11905: 0xB39C,\n\t30848 - 11905: 0xB39D,\n\t30849 - 11905: 0xB39E,\n\t30850 - 11905: 0xB39F,\n\t30851 - 11905: 0xB3A0,\n\t30852 - 11905: 0xB440,\n\t30853 - 11905: 0xB441,\n\t30854 - 11905: 0xB442,\n\t30855 - 11905: 0xEDD6,\n\t30856 - 11905: 0xB443,\n\t30857 - 11905: 0xB5EF,\n\t30858 - 11905: 0xB444,\n\t30859 - 11905: 0xB445,\n\t30860 - 11905: 0xC2B5,\n\t30861 - 11905: 0xB0AD,\n\t30862 - 11905: 0xCBE9,\n\t30863 - 11905: 0xB446,\n\t30864 - 11905: 0xB447,\n\t30865 - 11905: 0xB1AE,\n\t30866 - 11905: 0xB448,\n\t30867 - 11905: 0xEDD4,\n\t30868 - 11905: 0xB449,\n\t30869 - 11905: 0xB44A,\n\t30870 - 11905: 0xB44B,\n\t30871 - 11905: 0xCDEB,\n\t30872 - 11905: 0xB5E2,\n\t30873 - 11905: 0xB44C,\n\t30874 - 11905: 0xEDD5,\n\t30875 - 11905: 0xEDD3,\n\t30876 - 11905: 0xEDD7,\n\t30877 - 11905: 0xB44D,\n\t30878 - 11905: 0xB44E,\n\t30879 - 11905: 0xB5FA,\n\t30880 - 11905: 0xB44F,\n\t30881 - 11905: 0xEDD8,\n\t30882 - 11905: 0xB450,\n\t30883 - 11905: 0xEDD9,\n\t30884 - 11905: 0xB451,\n\t30885 - 11905: 0xEDDC,\n\t30886 - 11905: 0xB452,\n\t30887 - 11905: 0xB1CC,\n\t30888 - 11905: 0xB453,\n\t30889 - 11905: 0xB454,\n\t30890 - 11905: 0xB455,\n\t30891 - 11905: 0xB456,\n\t30892 - 11905: 0xB457,\n\t30893 - 11905: 0xB458,\n\t30894 - 11905: 0xB459,\n\t30895 - 11905: 0xB45A,\n\t30896 - 11905: 0xC5F6,\n\t30897 - 11905: 0xBCEE,\n\t30898 - 11905: 0xEDDA,\n\t30899 - 11905: 0xCCBC,\n\t30900 - 11905: 0xB2EA,\n\t30901 - 11905: 0xB45B,\n\t30902 - 11905: 0xB45C,\n\t30903 - 11905: 0xB45D,\n\t30904 - 11905: 0xB45E,\n\t30905 - 11905: 0xEDDB,\n\t30906 - 11905: 0xB45F,\n\t30907 - 11905: 0xB460,\n\t30908 - 11905: 0xB461,\n\t30909 - 11905: 0xB462,\n\t30910 - 11905: 0xC4EB,\n\t30911 - 11905: 0xB463,\n\t30912 - 11905: 0xB464,\n\t30913 - 11905: 0xB4C5,\n\t30914 - 11905: 0xB465,\n\t30915 - 11905: 0xB466,\n\t30916 - 11905: 0xB467,\n\t30917 - 11905: 0xB0F5,\n\t30918 - 11905: 0xB468,\n\t30919 - 11905: 0xB469,\n\t30920 - 11905: 0xB46A,\n\t30921 - 11905: 0xEDDF,\n\t30922 - 11905: 0xC0DA,\n\t30923 - 11905: 0xB4E8,\n\t30924 - 11905: 0xB46B,\n\t30925 - 11905: 0xB46C,\n\t30926 - 11905: 0xB46D,\n\t30927 - 11905: 0xB46E,\n\t30928 - 11905: 0xC5CD,\n\t30929 - 11905: 0xB46F,\n\t30930 - 11905: 0xB470,\n\t30931 - 11905: 0xB471,\n\t30932 - 11905: 0xEDDD,\n\t30933 - 11905: 0xBFC4,\n\t30934 - 11905: 0xB472,\n\t30935 - 11905: 0xB473,\n\t30936 - 11905: 0xB474,\n\t30937 - 11905: 0xEDDE,\n\t30938 - 11905: 0xB475,\n\t30939 - 11905: 0xB476,\n\t30940 - 11905: 0xB477,\n\t30941 - 11905: 0xB478,\n\t30942 - 11905: 0xB479,\n\t30943 - 11905: 0xB47A,\n\t30944 - 11905: 0xB47B,\n\t30945 - 11905: 0xB47C,\n\t30946 - 11905: 0xB47D,\n\t30947 - 11905: 0xB47E,\n\t30948 - 11905: 0xB480,\n\t30949 - 11905: 0xB481,\n\t30950 - 11905: 0xB482,\n\t30951 - 11905: 0xB483,\n\t30952 - 11905: 0xC4A5,\n\t30953 - 11905: 0xB484,\n\t30954 - 11905: 0xB485,\n\t30955 - 11905: 0xB486,\n\t30956 - 11905: 0xEDE0,\n\t30957 - 11905: 0xB487,\n\t30958 - 11905: 0xB488,\n\t30959 - 11905: 0xB489,\n\t30960 - 11905: 0xB48A,\n\t30961 - 11905: 0xB48B,\n\t30962 - 11905: 0xEDE1,\n\t30963 - 11905: 0xB48C,\n\t30964 - 11905: 0xEDE3,\n\t30965 - 11905: 0xB48D,\n\t30966 - 11905: 0xB48E,\n\t30967 - 11905: 0xC1D7,\n\t30968 - 11905: 0xB48F,\n\t30969 - 11905: 0xB490,\n\t30970 - 11905: 0xBBC7,\n\t30971 - 11905: 0xB491,\n\t30972 - 11905: 0xB492,\n\t30973 - 11905: 0xB493,\n\t30974 - 11905: 0xB494,\n\t30975 - 11905: 0xB495,\n\t30976 - 11905: 0xB496,\n\t30977 - 11905: 0xBDB8,\n\t30978 - 11905: 0xB497,\n\t30979 - 11905: 0xB498,\n\t30980 - 11905: 0xB499,\n\t30981 - 11905: 0xEDE2,\n\t30982 - 11905: 0xB49A,\n\t30983 - 11905: 0xB49B,\n\t30984 - 11905: 0xB49C,\n\t30985 - 11905: 0xB49D,\n\t30986 - 11905: 0xB49E,\n\t30987 - 11905: 0xB49F,\n\t30988 - 11905: 0xB4A0,\n\t30989 - 11905: 0xB540,\n\t30990 - 11905: 0xB541,\n\t30991 - 11905: 0xB542,\n\t30992 - 11905: 0xB543,\n\t30993 - 11905: 0xB544,\n\t30994 - 11905: 0xB545,\n\t30995 - 11905: 0xEDE4,\n\t30996 - 11905: 0xB546,\n\t30997 - 11905: 0xB547,\n\t30998 - 11905: 0xB548,\n\t30999 - 11905: 0xB549,\n\t31000 - 11905: 0xB54A,\n\t31001 - 11905: 0xB54B,\n\t31002 - 11905: 0xB54C,\n\t31003 - 11905: 0xB54D,\n\t31004 - 11905: 0xB54E,\n\t31005 - 11905: 0xB54F,\n\t31006 - 11905: 0xEDE6,\n\t31007 - 11905: 0xB550,\n\t31008 - 11905: 0xB551,\n\t31009 - 11905: 0xB552,\n\t31010 - 11905: 0xB553,\n\t31011 - 11905: 0xB554,\n\t31012 - 11905: 0xEDE5,\n\t31013 - 11905: 0xB555,\n\t31014 - 11905: 0xB556,\n\t31015 - 11905: 0xB557,\n\t31016 - 11905: 0xB558,\n\t31017 - 11905: 0xB559,\n\t31018 - 11905: 0xB55A,\n\t31019 - 11905: 0xB55B,\n\t31020 - 11905: 0xB55C,\n\t31021 - 11905: 0xB55D,\n\t31022 - 11905: 0xB55E,\n\t31023 - 11905: 0xB55F,\n\t31024 - 11905: 0xB560,\n\t31025 - 11905: 0xB561,\n\t31026 - 11905: 0xB562,\n\t31027 - 11905: 0xB563,\n\t31028 - 11905: 0xEDE7,\n\t31029 - 11905: 0xB564,\n\t31030 - 11905: 0xB565,\n\t31031 - 11905: 0xB566,\n\t31032 - 11905: 0xB567,\n\t31033 - 11905: 0xB568,\n\t31034 - 11905: 0xCABE,\n\t31035 - 11905: 0xECEA,\n\t31036 - 11905: 0xC0F1,\n\t31037 - 11905: 0xB569,\n\t31038 - 11905: 0xC9E7,\n\t31039 - 11905: 0xB56A,\n\t31040 - 11905: 0xECEB,\n\t31041 - 11905: 0xC6EE,\n\t31042 - 11905: 0xB56B,\n\t31043 - 11905: 0xB56C,\n\t31044 - 11905: 0xB56D,\n\t31045 - 11905: 0xB56E,\n\t31046 - 11905: 0xECEC,\n\t31047 - 11905: 0xB56F,\n\t31048 - 11905: 0xC6ED,\n\t31049 - 11905: 0xECED,\n\t31050 - 11905: 0xB570,\n\t31051 - 11905: 0xB571,\n\t31052 - 11905: 0xB572,\n\t31053 - 11905: 0xB573,\n\t31054 - 11905: 0xB574,\n\t31055 - 11905: 0xB575,\n\t31056 - 11905: 0xB576,\n\t31057 - 11905: 0xB577,\n\t31058 - 11905: 0xB578,\n\t31059 - 11905: 0xECF0,\n\t31060 - 11905: 0xB579,\n\t31061 - 11905: 0xB57A,\n\t31062 - 11905: 0xD7E6,\n\t31063 - 11905: 0xECF3,\n\t31064 - 11905: 0xB57B,\n\t31065 - 11905: 0xB57C,\n\t31066 - 11905: 0xECF1,\n\t31067 - 11905: 0xECEE,\n\t31068 - 11905: 0xECEF,\n\t31069 - 11905: 0xD7A3,\n\t31070 - 11905: 0xC9F1,\n\t31071 - 11905: 0xCBEE,\n\t31072 - 11905: 0xECF4,\n\t31073 - 11905: 0xB57D,\n\t31074 - 11905: 0xECF2,\n\t31075 - 11905: 0xB57E,\n\t31076 - 11905: 0xB580,\n\t31077 - 11905: 0xCFE9,\n\t31078 - 11905: 0xB581,\n\t31079 - 11905: 0xECF6,\n\t31080 - 11905: 0xC6B1,\n\t31081 - 11905: 0xB582,\n\t31082 - 11905: 0xB583,\n\t31083 - 11905: 0xB584,\n\t31084 - 11905: 0xB585,\n\t31085 - 11905: 0xBCC0,\n\t31086 - 11905: 0xB586,\n\t31087 - 11905: 0xECF5,\n\t31088 - 11905: 0xB587,\n\t31089 - 11905: 0xB588,\n\t31090 - 11905: 0xB589,\n\t31091 - 11905: 0xB58A,\n\t31092 - 11905: 0xB58B,\n\t31093 - 11905: 0xB58C,\n\t31094 - 11905: 0xB58D,\n\t31095 - 11905: 0xB5BB,\n\t31096 - 11905: 0xBBF6,\n\t31097 - 11905: 0xB58E,\n\t31098 - 11905: 0xECF7,\n\t31099 - 11905: 0xB58F,\n\t31100 - 11905: 0xB590,\n\t31101 - 11905: 0xB591,\n\t31102 - 11905: 0xB592,\n\t31103 - 11905: 0xB593,\n\t31104 - 11905: 0xD9F7,\n\t31105 - 11905: 0xBDFB,\n\t31106 - 11905: 0xB594,\n\t31107 - 11905: 0xB595,\n\t31108 - 11905: 0xC2BB,\n\t31109 - 11905: 0xECF8,\n\t31110 - 11905: 0xB596,\n\t31111 - 11905: 0xB597,\n\t31112 - 11905: 0xB598,\n\t31113 - 11905: 0xB599,\n\t31114 - 11905: 0xECF9,\n\t31115 - 11905: 0xB59A,\n\t31116 - 11905: 0xB59B,\n\t31117 - 11905: 0xB59C,\n\t31118 - 11905: 0xB59D,\n\t31119 - 11905: 0xB8A3,\n\t31120 - 11905: 0xB59E,\n\t31121 - 11905: 0xB59F,\n\t31122 - 11905: 0xB5A0,\n\t31123 - 11905: 0xB640,\n\t31124 - 11905: 0xB641,\n\t31125 - 11905: 0xB642,\n\t31126 - 11905: 0xB643,\n\t31127 - 11905: 0xB644,\n\t31128 - 11905: 0xB645,\n\t31129 - 11905: 0xB646,\n\t31130 - 11905: 0xECFA,\n\t31131 - 11905: 0xB647,\n\t31132 - 11905: 0xB648,\n\t31133 - 11905: 0xB649,\n\t31134 - 11905: 0xB64A,\n\t31135 - 11905: 0xB64B,\n\t31136 - 11905: 0xB64C,\n\t31137 - 11905: 0xB64D,\n\t31138 - 11905: 0xB64E,\n\t31139 - 11905: 0xB64F,\n\t31140 - 11905: 0xB650,\n\t31141 - 11905: 0xB651,\n\t31142 - 11905: 0xB652,\n\t31143 - 11905: 0xECFB,\n\t31144 - 11905: 0xB653,\n\t31145 - 11905: 0xB654,\n\t31146 - 11905: 0xB655,\n\t31147 - 11905: 0xB656,\n\t31148 - 11905: 0xB657,\n\t31149 - 11905: 0xB658,\n\t31150 - 11905: 0xB659,\n\t31151 - 11905: 0xB65A,\n\t31152 - 11905: 0xB65B,\n\t31153 - 11905: 0xB65C,\n\t31154 - 11905: 0xB65D,\n\t31155 - 11905: 0xECFC,\n\t31156 - 11905: 0xB65E,\n\t31157 - 11905: 0xB65F,\n\t31158 - 11905: 0xB660,\n\t31159 - 11905: 0xB661,\n\t31160 - 11905: 0xB662,\n\t31161 - 11905: 0xD3ED,\n\t31162 - 11905: 0xD8AE,\n\t31163 - 11905: 0xC0EB,\n\t31164 - 11905: 0xB663,\n\t31165 - 11905: 0xC7DD,\n\t31166 - 11905: 0xBACC,\n\t31167 - 11905: 0xB664,\n\t31168 - 11905: 0xD0E3,\n\t31169 - 11905: 0xCBBD,\n\t31170 - 11905: 0xB665,\n\t31171 - 11905: 0xCDBA,\n\t31172 - 11905: 0xB666,\n\t31173 - 11905: 0xB667,\n\t31174 - 11905: 0xB8D1,\n\t31175 - 11905: 0xB668,\n\t31176 - 11905: 0xB669,\n\t31177 - 11905: 0xB1FC,\n\t31178 - 11905: 0xB66A,\n\t31179 - 11905: 0xC7EF,\n\t31180 - 11905: 0xB66B,\n\t31181 - 11905: 0xD6D6,\n\t31182 - 11905: 0xB66C,\n\t31183 - 11905: 0xB66D,\n\t31184 - 11905: 0xB66E,\n\t31185 - 11905: 0xBFC6,\n\t31186 - 11905: 0xC3EB,\n\t31187 - 11905: 0xB66F,\n\t31188 - 11905: 0xB670,\n\t31189 - 11905: 0xEFF5,\n\t31190 - 11905: 0xB671,\n\t31191 - 11905: 0xB672,\n\t31192 - 11905: 0xC3D8,\n\t31193 - 11905: 0xB673,\n\t31194 - 11905: 0xB674,\n\t31195 - 11905: 0xB675,\n\t31196 - 11905: 0xB676,\n\t31197 - 11905: 0xB677,\n\t31198 - 11905: 0xB678,\n\t31199 - 11905: 0xD7E2,\n\t31200 - 11905: 0xB679,\n\t31201 - 11905: 0xB67A,\n\t31202 - 11905: 0xB67B,\n\t31203 - 11905: 0xEFF7,\n\t31204 - 11905: 0xB3D3,\n\t31205 - 11905: 0xB67C,\n\t31206 - 11905: 0xC7D8,\n\t31207 - 11905: 0xD1ED,\n\t31208 - 11905: 0xB67D,\n\t31209 - 11905: 0xD6C8,\n\t31210 - 11905: 0xB67E,\n\t31211 - 11905: 0xEFF8,\n\t31212 - 11905: 0xB680,\n\t31213 - 11905: 0xEFF6,\n\t31214 - 11905: 0xB681,\n\t31215 - 11905: 0xBBFD,\n\t31216 - 11905: 0xB3C6,\n\t31217 - 11905: 0xB682,\n\t31218 - 11905: 0xB683,\n\t31219 - 11905: 0xB684,\n\t31220 - 11905: 0xB685,\n\t31221 - 11905: 0xB686,\n\t31222 - 11905: 0xB687,\n\t31223 - 11905: 0xB688,\n\t31224 - 11905: 0xBDD5,\n\t31225 - 11905: 0xB689,\n\t31226 - 11905: 0xB68A,\n\t31227 - 11905: 0xD2C6,\n\t31228 - 11905: 0xB68B,\n\t31229 - 11905: 0xBBE0,\n\t31230 - 11905: 0xB68C,\n\t31231 - 11905: 0xB68D,\n\t31232 - 11905: 0xCFA1,\n\t31233 - 11905: 0xB68E,\n\t31234 - 11905: 0xEFFC,\n\t31235 - 11905: 0xEFFB,\n\t31236 - 11905: 0xB68F,\n\t31237 - 11905: 0xB690,\n\t31238 - 11905: 0xEFF9,\n\t31239 - 11905: 0xB691,\n\t31240 - 11905: 0xB692,\n\t31241 - 11905: 0xB693,\n\t31242 - 11905: 0xB694,\n\t31243 - 11905: 0xB3CC,\n\t31244 - 11905: 0xB695,\n\t31245 - 11905: 0xC9D4,\n\t31246 - 11905: 0xCBB0,\n\t31247 - 11905: 0xB696,\n\t31248 - 11905: 0xB697,\n\t31249 - 11905: 0xB698,\n\t31250 - 11905: 0xB699,\n\t31251 - 11905: 0xB69A,\n\t31252 - 11905: 0xEFFE,\n\t31253 - 11905: 0xB69B,\n\t31254 - 11905: 0xB69C,\n\t31255 - 11905: 0xB0DE,\n\t31256 - 11905: 0xB69D,\n\t31257 - 11905: 0xB69E,\n\t31258 - 11905: 0xD6C9,\n\t31259 - 11905: 0xB69F,\n\t31260 - 11905: 0xB6A0,\n\t31261 - 11905: 0xB740,\n\t31262 - 11905: 0xEFFD,\n\t31263 - 11905: 0xB741,\n\t31264 - 11905: 0xB3ED,\n\t31265 - 11905: 0xB742,\n\t31266 - 11905: 0xB743,\n\t31267 - 11905: 0xF6D5,\n\t31268 - 11905: 0xB744,\n\t31269 - 11905: 0xB745,\n\t31270 - 11905: 0xB746,\n\t31271 - 11905: 0xB747,\n\t31272 - 11905: 0xB748,\n\t31273 - 11905: 0xB749,\n\t31274 - 11905: 0xB74A,\n\t31275 - 11905: 0xB74B,\n\t31276 - 11905: 0xB74C,\n\t31277 - 11905: 0xB74D,\n\t31278 - 11905: 0xB74E,\n\t31279 - 11905: 0xB74F,\n\t31280 - 11905: 0xB750,\n\t31281 - 11905: 0xB751,\n\t31282 - 11905: 0xB752,\n\t31283 - 11905: 0xCEC8,\n\t31284 - 11905: 0xB753,\n\t31285 - 11905: 0xB754,\n\t31286 - 11905: 0xB755,\n\t31287 - 11905: 0xF0A2,\n\t31288 - 11905: 0xB756,\n\t31289 - 11905: 0xF0A1,\n\t31290 - 11905: 0xB757,\n\t31291 - 11905: 0xB5BE,\n\t31292 - 11905: 0xBCDA,\n\t31293 - 11905: 0xBBFC,\n\t31294 - 11905: 0xB758,\n\t31295 - 11905: 0xB8E5,\n\t31296 - 11905: 0xB759,\n\t31297 - 11905: 0xB75A,\n\t31298 - 11905: 0xB75B,\n\t31299 - 11905: 0xB75C,\n\t31300 - 11905: 0xB75D,\n\t31301 - 11905: 0xB75E,\n\t31302 - 11905: 0xC4C2,\n\t31303 - 11905: 0xB75F,\n\t31304 - 11905: 0xB760,\n\t31305 - 11905: 0xB761,\n\t31306 - 11905: 0xB762,\n\t31307 - 11905: 0xB763,\n\t31308 - 11905: 0xB764,\n\t31309 - 11905: 0xB765,\n\t31310 - 11905: 0xB766,\n\t31311 - 11905: 0xB767,\n\t31312 - 11905: 0xB768,\n\t31313 - 11905: 0xF0A3,\n\t31314 - 11905: 0xB769,\n\t31315 - 11905: 0xB76A,\n\t31316 - 11905: 0xB76B,\n\t31317 - 11905: 0xB76C,\n\t31318 - 11905: 0xB76D,\n\t31319 - 11905: 0xCBEB,\n\t31320 - 11905: 0xB76E,\n\t31321 - 11905: 0xB76F,\n\t31322 - 11905: 0xB770,\n\t31323 - 11905: 0xB771,\n\t31324 - 11905: 0xB772,\n\t31325 - 11905: 0xB773,\n\t31326 - 11905: 0xB774,\n\t31327 - 11905: 0xB775,\n\t31328 - 11905: 0xB776,\n\t31329 - 11905: 0xB777,\n\t31330 - 11905: 0xB778,\n\t31331 - 11905: 0xB779,\n\t31332 - 11905: 0xB77A,\n\t31333 - 11905: 0xB77B,\n\t31334 - 11905: 0xB77C,\n\t31335 - 11905: 0xB77D,\n\t31336 - 11905: 0xB77E,\n\t31337 - 11905: 0xB780,\n\t31338 - 11905: 0xB781,\n\t31339 - 11905: 0xB782,\n\t31340 - 11905: 0xB783,\n\t31341 - 11905: 0xB784,\n\t31342 - 11905: 0xB785,\n\t31343 - 11905: 0xB786,\n\t31344 - 11905: 0xF0A6,\n\t31345 - 11905: 0xB787,\n\t31346 - 11905: 0xB788,\n\t31347 - 11905: 0xB789,\n\t31348 - 11905: 0xD1A8,\n\t31349 - 11905: 0xB78A,\n\t31350 - 11905: 0xBEBF,\n\t31351 - 11905: 0xC7EE,\n\t31352 - 11905: 0xF1B6,\n\t31353 - 11905: 0xF1B7,\n\t31354 - 11905: 0xBFD5,\n\t31355 - 11905: 0xB78B,\n\t31356 - 11905: 0xB78C,\n\t31357 - 11905: 0xB78D,\n\t31358 - 11905: 0xB78E,\n\t31359 - 11905: 0xB4A9,\n\t31360 - 11905: 0xF1B8,\n\t31361 - 11905: 0xCDBB,\n\t31362 - 11905: 0xB78F,\n\t31363 - 11905: 0xC7D4,\n\t31364 - 11905: 0xD5AD,\n\t31365 - 11905: 0xB790,\n\t31366 - 11905: 0xF1B9,\n\t31367 - 11905: 0xB791,\n\t31368 - 11905: 0xF1BA,\n\t31369 - 11905: 0xB792,\n\t31370 - 11905: 0xB793,\n\t31371 - 11905: 0xB794,\n\t31372 - 11905: 0xB795,\n\t31373 - 11905: 0xC7CF,\n\t31374 - 11905: 0xB796,\n\t31375 - 11905: 0xB797,\n\t31376 - 11905: 0xB798,\n\t31377 - 11905: 0xD2A4,\n\t31378 - 11905: 0xD6CF,\n\t31379 - 11905: 0xB799,\n\t31380 - 11905: 0xB79A,\n\t31381 - 11905: 0xF1BB,\n\t31382 - 11905: 0xBDD1,\n\t31383 - 11905: 0xB4B0,\n\t31384 - 11905: 0xBEBD,\n\t31385 - 11905: 0xB79B,\n\t31386 - 11905: 0xB79C,\n\t31387 - 11905: 0xB79D,\n\t31388 - 11905: 0xB4DC,\n\t31389 - 11905: 0xCED1,\n\t31390 - 11905: 0xB79E,\n\t31391 - 11905: 0xBFDF,\n\t31392 - 11905: 0xF1BD,\n\t31393 - 11905: 0xB79F,\n\t31394 - 11905: 0xB7A0,\n\t31395 - 11905: 0xB840,\n\t31396 - 11905: 0xB841,\n\t31397 - 11905: 0xBFFA,\n\t31398 - 11905: 0xF1BC,\n\t31399 - 11905: 0xB842,\n\t31400 - 11905: 0xF1BF,\n\t31401 - 11905: 0xB843,\n\t31402 - 11905: 0xB844,\n\t31403 - 11905: 0xB845,\n\t31404 - 11905: 0xF1BE,\n\t31405 - 11905: 0xF1C0,\n\t31406 - 11905: 0xB846,\n\t31407 - 11905: 0xB847,\n\t31408 - 11905: 0xB848,\n\t31409 - 11905: 0xB849,\n\t31410 - 11905: 0xB84A,\n\t31411 - 11905: 0xF1C1,\n\t31412 - 11905: 0xB84B,\n\t31413 - 11905: 0xB84C,\n\t31414 - 11905: 0xB84D,\n\t31415 - 11905: 0xB84E,\n\t31416 - 11905: 0xB84F,\n\t31417 - 11905: 0xB850,\n\t31418 - 11905: 0xB851,\n\t31419 - 11905: 0xB852,\n\t31420 - 11905: 0xB853,\n\t31421 - 11905: 0xB854,\n\t31422 - 11905: 0xB855,\n\t31423 - 11905: 0xC1FE,\n\t31424 - 11905: 0xB856,\n\t31425 - 11905: 0xB857,\n\t31426 - 11905: 0xB858,\n\t31427 - 11905: 0xB859,\n\t31428 - 11905: 0xB85A,\n\t31429 - 11905: 0xB85B,\n\t31430 - 11905: 0xB85C,\n\t31431 - 11905: 0xB85D,\n\t31432 - 11905: 0xB85E,\n\t31433 - 11905: 0xB85F,\n\t31434 - 11905: 0xB860,\n\t31435 - 11905: 0xC1A2,\n\t31436 - 11905: 0xB861,\n\t31437 - 11905: 0xB862,\n\t31438 - 11905: 0xB863,\n\t31439 - 11905: 0xB864,\n\t31440 - 11905: 0xB865,\n\t31441 - 11905: 0xB866,\n\t31442 - 11905: 0xB867,\n\t31443 - 11905: 0xB868,\n\t31444 - 11905: 0xB869,\n\t31445 - 11905: 0xB86A,\n\t31446 - 11905: 0xCAFA,\n\t31447 - 11905: 0xB86B,\n\t31448 - 11905: 0xB86C,\n\t31449 - 11905: 0xD5BE,\n\t31450 - 11905: 0xB86D,\n\t31451 - 11905: 0xB86E,\n\t31452 - 11905: 0xB86F,\n\t31453 - 11905: 0xB870,\n\t31454 - 11905: 0xBEBA,\n\t31455 - 11905: 0xBEB9,\n\t31456 - 11905: 0xD5C2,\n\t31457 - 11905: 0xB871,\n\t31458 - 11905: 0xB872,\n\t31459 - 11905: 0xBFA2,\n\t31460 - 11905: 0xB873,\n\t31461 - 11905: 0xCDAF,\n\t31462 - 11905: 0xF1B5,\n\t31463 - 11905: 0xB874,\n\t31464 - 11905: 0xB875,\n\t31465 - 11905: 0xB876,\n\t31466 - 11905: 0xB877,\n\t31467 - 11905: 0xB878,\n\t31468 - 11905: 0xB879,\n\t31469 - 11905: 0xBDDF,\n\t31470 - 11905: 0xB87A,\n\t31471 - 11905: 0xB6CB,\n\t31472 - 11905: 0xB87B,\n\t31473 - 11905: 0xB87C,\n\t31474 - 11905: 0xB87D,\n\t31475 - 11905: 0xB87E,\n\t31476 - 11905: 0xB880,\n\t31477 - 11905: 0xB881,\n\t31478 - 11905: 0xB882,\n\t31479 - 11905: 0xB883,\n\t31480 - 11905: 0xB884,\n\t31481 - 11905: 0xD6F1,\n\t31482 - 11905: 0xF3C3,\n\t31483 - 11905: 0xB885,\n\t31484 - 11905: 0xB886,\n\t31485 - 11905: 0xF3C4,\n\t31486 - 11905: 0xB887,\n\t31487 - 11905: 0xB8CD,\n\t31488 - 11905: 0xB888,\n\t31489 - 11905: 0xB889,\n\t31490 - 11905: 0xB88A,\n\t31491 - 11905: 0xF3C6,\n\t31492 - 11905: 0xF3C7,\n\t31493 - 11905: 0xB88B,\n\t31494 - 11905: 0xB0CA,\n\t31495 - 11905: 0xB88C,\n\t31496 - 11905: 0xF3C5,\n\t31497 - 11905: 0xB88D,\n\t31498 - 11905: 0xF3C9,\n\t31499 - 11905: 0xCBF1,\n\t31500 - 11905: 0xB88E,\n\t31501 - 11905: 0xB88F,\n\t31502 - 11905: 0xB890,\n\t31503 - 11905: 0xF3CB,\n\t31504 - 11905: 0xB891,\n\t31505 - 11905: 0xD0A6,\n\t31506 - 11905: 0xB892,\n\t31507 - 11905: 0xB893,\n\t31508 - 11905: 0xB1CA,\n\t31509 - 11905: 0xF3C8,\n\t31510 - 11905: 0xB894,\n\t31511 - 11905: 0xB895,\n\t31512 - 11905: 0xB896,\n\t31513 - 11905: 0xF3CF,\n\t31514 - 11905: 0xB897,\n\t31515 - 11905: 0xB5D1,\n\t31516 - 11905: 0xB898,\n\t31517 - 11905: 0xB899,\n\t31518 - 11905: 0xF3D7,\n\t31519 - 11905: 0xB89A,\n\t31520 - 11905: 0xF3D2,\n\t31521 - 11905: 0xB89B,\n\t31522 - 11905: 0xB89C,\n\t31523 - 11905: 0xB89D,\n\t31524 - 11905: 0xF3D4,\n\t31525 - 11905: 0xF3D3,\n\t31526 - 11905: 0xB7FB,\n\t31527 - 11905: 0xB89E,\n\t31528 - 11905: 0xB1BF,\n\t31529 - 11905: 0xB89F,\n\t31530 - 11905: 0xF3CE,\n\t31531 - 11905: 0xF3CA,\n\t31532 - 11905: 0xB5DA,\n\t31533 - 11905: 0xB8A0,\n\t31534 - 11905: 0xF3D0,\n\t31535 - 11905: 0xB940,\n\t31536 - 11905: 0xB941,\n\t31537 - 11905: 0xF3D1,\n\t31538 - 11905: 0xB942,\n\t31539 - 11905: 0xF3D5,\n\t31540 - 11905: 0xB943,\n\t31541 - 11905: 0xB944,\n\t31542 - 11905: 0xB945,\n\t31543 - 11905: 0xB946,\n\t31544 - 11905: 0xF3CD,\n\t31545 - 11905: 0xB947,\n\t31546 - 11905: 0xBCE3,\n\t31547 - 11905: 0xB948,\n\t31548 - 11905: 0xC1FD,\n\t31549 - 11905: 0xB949,\n\t31550 - 11905: 0xF3D6,\n\t31551 - 11905: 0xB94A,\n\t31552 - 11905: 0xB94B,\n\t31553 - 11905: 0xB94C,\n\t31554 - 11905: 0xB94D,\n\t31555 - 11905: 0xB94E,\n\t31556 - 11905: 0xB94F,\n\t31557 - 11905: 0xF3DA,\n\t31558 - 11905: 0xB950,\n\t31559 - 11905: 0xF3CC,\n\t31560 - 11905: 0xB951,\n\t31561 - 11905: 0xB5C8,\n\t31562 - 11905: 0xB952,\n\t31563 - 11905: 0xBDEE,\n\t31564 - 11905: 0xF3DC,\n\t31565 - 11905: 0xB953,\n\t31566 - 11905: 0xB954,\n\t31567 - 11905: 0xB7A4,\n\t31568 - 11905: 0xBFF0,\n\t31569 - 11905: 0xD6FE,\n\t31570 - 11905: 0xCDB2,\n\t31571 - 11905: 0xB955,\n\t31572 - 11905: 0xB4F0,\n\t31573 - 11905: 0xB956,\n\t31574 - 11905: 0xB2DF,\n\t31575 - 11905: 0xB957,\n\t31576 - 11905: 0xF3D8,\n\t31577 - 11905: 0xB958,\n\t31578 - 11905: 0xF3D9,\n\t31579 - 11905: 0xC9B8,\n\t31580 - 11905: 0xB959,\n\t31581 - 11905: 0xF3DD,\n\t31582 - 11905: 0xB95A,\n\t31583 - 11905: 0xB95B,\n\t31584 - 11905: 0xF3DE,\n\t31585 - 11905: 0xB95C,\n\t31586 - 11905: 0xF3E1,\n\t31587 - 11905: 0xB95D,\n\t31588 - 11905: 0xB95E,\n\t31589 - 11905: 0xB95F,\n\t31590 - 11905: 0xB960,\n\t31591 - 11905: 0xB961,\n\t31592 - 11905: 0xB962,\n\t31593 - 11905: 0xB963,\n\t31594 - 11905: 0xB964,\n\t31595 - 11905: 0xB965,\n\t31596 - 11905: 0xB966,\n\t31597 - 11905: 0xB967,\n\t31598 - 11905: 0xF3DF,\n\t31599 - 11905: 0xB968,\n\t31600 - 11905: 0xB969,\n\t31601 - 11905: 0xF3E3,\n\t31602 - 11905: 0xF3E2,\n\t31603 - 11905: 0xB96A,\n\t31604 - 11905: 0xB96B,\n\t31605 - 11905: 0xF3DB,\n\t31606 - 11905: 0xB96C,\n\t31607 - 11905: 0xBFEA,\n\t31608 - 11905: 0xB96D,\n\t31609 - 11905: 0xB3EF,\n\t31610 - 11905: 0xB96E,\n\t31611 - 11905: 0xF3E0,\n\t31612 - 11905: 0xB96F,\n\t31613 - 11905: 0xB970,\n\t31614 - 11905: 0xC7A9,\n\t31615 - 11905: 0xB971,\n\t31616 - 11905: 0xBCF2,\n\t31617 - 11905: 0xB972,\n\t31618 - 11905: 0xB973,\n\t31619 - 11905: 0xB974,\n\t31620 - 11905: 0xB975,\n\t31621 - 11905: 0xF3EB,\n\t31622 - 11905: 0xB976,\n\t31623 - 11905: 0xB977,\n\t31624 - 11905: 0xB978,\n\t31625 - 11905: 0xB979,\n\t31626 - 11905: 0xB97A,\n\t31627 - 11905: 0xB97B,\n\t31628 - 11905: 0xB97C,\n\t31629 - 11905: 0xB9BF,\n\t31630 - 11905: 0xB97D,\n\t31631 - 11905: 0xB97E,\n\t31632 - 11905: 0xF3E4,\n\t31633 - 11905: 0xB980,\n\t31634 - 11905: 0xB981,\n\t31635 - 11905: 0xB982,\n\t31636 - 11905: 0xB2AD,\n\t31637 - 11905: 0xBBFE,\n\t31638 - 11905: 0xB983,\n\t31639 - 11905: 0xCBE3,\n\t31640 - 11905: 0xB984,\n\t31641 - 11905: 0xB985,\n\t31642 - 11905: 0xB986,\n\t31643 - 11905: 0xB987,\n\t31644 - 11905: 0xF3ED,\n\t31645 - 11905: 0xF3E9,\n\t31646 - 11905: 0xB988,\n\t31647 - 11905: 0xB989,\n\t31648 - 11905: 0xB98A,\n\t31649 - 11905: 0xB9DC,\n\t31650 - 11905: 0xF3EE,\n\t31651 - 11905: 0xB98B,\n\t31652 - 11905: 0xB98C,\n\t31653 - 11905: 0xB98D,\n\t31654 - 11905: 0xF3E5,\n\t31655 - 11905: 0xF3E6,\n\t31656 - 11905: 0xF3EA,\n\t31657 - 11905: 0xC2E1,\n\t31658 - 11905: 0xF3EC,\n\t31659 - 11905: 0xF3EF,\n\t31660 - 11905: 0xF3E8,\n\t31661 - 11905: 0xBCFD,\n\t31662 - 11905: 0xB98E,\n\t31663 - 11905: 0xB98F,\n\t31664 - 11905: 0xB990,\n\t31665 - 11905: 0xCFE4,\n\t31666 - 11905: 0xB991,\n\t31667 - 11905: 0xB992,\n\t31668 - 11905: 0xF3F0,\n\t31669 - 11905: 0xB993,\n\t31670 - 11905: 0xB994,\n\t31671 - 11905: 0xB995,\n\t31672 - 11905: 0xF3E7,\n\t31673 - 11905: 0xB996,\n\t31674 - 11905: 0xB997,\n\t31675 - 11905: 0xB998,\n\t31676 - 11905: 0xB999,\n\t31677 - 11905: 0xB99A,\n\t31678 - 11905: 0xB99B,\n\t31679 - 11905: 0xB99C,\n\t31680 - 11905: 0xB99D,\n\t31681 - 11905: 0xF3F2,\n\t31682 - 11905: 0xB99E,\n\t31683 - 11905: 0xB99F,\n\t31684 - 11905: 0xB9A0,\n\t31685 - 11905: 0xBA40,\n\t31686 - 11905: 0xD7AD,\n\t31687 - 11905: 0xC6AA,\n\t31688 - 11905: 0xBA41,\n\t31689 - 11905: 0xBA42,\n\t31690 - 11905: 0xBA43,\n\t31691 - 11905: 0xBA44,\n\t31692 - 11905: 0xF3F3,\n\t31693 - 11905: 0xBA45,\n\t31694 - 11905: 0xBA46,\n\t31695 - 11905: 0xBA47,\n\t31696 - 11905: 0xBA48,\n\t31697 - 11905: 0xF3F1,\n\t31698 - 11905: 0xBA49,\n\t31699 - 11905: 0xC2A8,\n\t31700 - 11905: 0xBA4A,\n\t31701 - 11905: 0xBA4B,\n\t31702 - 11905: 0xBA4C,\n\t31703 - 11905: 0xBA4D,\n\t31704 - 11905: 0xBA4E,\n\t31705 - 11905: 0xB8DD,\n\t31706 - 11905: 0xF3F5,\n\t31707 - 11905: 0xBA4F,\n\t31708 - 11905: 0xBA50,\n\t31709 - 11905: 0xF3F4,\n\t31710 - 11905: 0xBA51,\n\t31711 - 11905: 0xBA52,\n\t31712 - 11905: 0xBA53,\n\t31713 - 11905: 0xB4DB,\n\t31714 - 11905: 0xBA54,\n\t31715 - 11905: 0xBA55,\n\t31716 - 11905: 0xBA56,\n\t31717 - 11905: 0xF3F6,\n\t31718 - 11905: 0xF3F7,\n\t31719 - 11905: 0xBA57,\n\t31720 - 11905: 0xBA58,\n\t31721 - 11905: 0xBA59,\n\t31722 - 11905: 0xF3F8,\n\t31723 - 11905: 0xBA5A,\n\t31724 - 11905: 0xBA5B,\n\t31725 - 11905: 0xBA5C,\n\t31726 - 11905: 0xC0BA,\n\t31727 - 11905: 0xBA5D,\n\t31728 - 11905: 0xBA5E,\n\t31729 - 11905: 0xC0E9,\n\t31730 - 11905: 0xBA5F,\n\t31731 - 11905: 0xBA60,\n\t31732 - 11905: 0xBA61,\n\t31733 - 11905: 0xBA62,\n\t31734 - 11905: 0xBA63,\n\t31735 - 11905: 0xC5F1,\n\t31736 - 11905: 0xBA64,\n\t31737 - 11905: 0xBA65,\n\t31738 - 11905: 0xBA66,\n\t31739 - 11905: 0xBA67,\n\t31740 - 11905: 0xF3FB,\n\t31741 - 11905: 0xBA68,\n\t31742 - 11905: 0xF3FA,\n\t31743 - 11905: 0xBA69,\n\t31744 - 11905: 0xBA6A,\n\t31745 - 11905: 0xBA6B,\n\t31746 - 11905: 0xBA6C,\n\t31747 - 11905: 0xBA6D,\n\t31748 - 11905: 0xBA6E,\n\t31749 - 11905: 0xBA6F,\n\t31750 - 11905: 0xBA70,\n\t31751 - 11905: 0xB4D8,\n\t31752 - 11905: 0xBA71,\n\t31753 - 11905: 0xBA72,\n\t31754 - 11905: 0xBA73,\n\t31755 - 11905: 0xF3FE,\n\t31756 - 11905: 0xF3F9,\n\t31757 - 11905: 0xBA74,\n\t31758 - 11905: 0xBA75,\n\t31759 - 11905: 0xF3FC,\n\t31760 - 11905: 0xBA76,\n\t31761 - 11905: 0xBA77,\n\t31762 - 11905: 0xBA78,\n\t31763 - 11905: 0xBA79,\n\t31764 - 11905: 0xBA7A,\n\t31765 - 11905: 0xBA7B,\n\t31766 - 11905: 0xF3FD,\n\t31767 - 11905: 0xBA7C,\n\t31768 - 11905: 0xBA7D,\n\t31769 - 11905: 0xBA7E,\n\t31770 - 11905: 0xBA80,\n\t31771 - 11905: 0xBA81,\n\t31772 - 11905: 0xBA82,\n\t31773 - 11905: 0xBA83,\n\t31774 - 11905: 0xBA84,\n\t31775 - 11905: 0xF4A1,\n\t31776 - 11905: 0xBA85,\n\t31777 - 11905: 0xBA86,\n\t31778 - 11905: 0xBA87,\n\t31779 - 11905: 0xBA88,\n\t31780 - 11905: 0xBA89,\n\t31781 - 11905: 0xBA8A,\n\t31782 - 11905: 0xF4A3,\n\t31783 - 11905: 0xBBC9,\n\t31784 - 11905: 0xBA8B,\n\t31785 - 11905: 0xBA8C,\n\t31786 - 11905: 0xF4A2,\n\t31787 - 11905: 0xBA8D,\n\t31788 - 11905: 0xBA8E,\n\t31789 - 11905: 0xBA8F,\n\t31790 - 11905: 0xBA90,\n\t31791 - 11905: 0xBA91,\n\t31792 - 11905: 0xBA92,\n\t31793 - 11905: 0xBA93,\n\t31794 - 11905: 0xBA94,\n\t31795 - 11905: 0xBA95,\n\t31796 - 11905: 0xBA96,\n\t31797 - 11905: 0xBA97,\n\t31798 - 11905: 0xBA98,\n\t31799 - 11905: 0xBA99,\n\t31800 - 11905: 0xF4A4,\n\t31801 - 11905: 0xBA9A,\n\t31802 - 11905: 0xBA9B,\n\t31803 - 11905: 0xBA9C,\n\t31804 - 11905: 0xBA9D,\n\t31805 - 11905: 0xBA9E,\n\t31806 - 11905: 0xBA9F,\n\t31807 - 11905: 0xB2BE,\n\t31808 - 11905: 0xF4A6,\n\t31809 - 11905: 0xF4A5,\n\t31810 - 11905: 0xBAA0,\n\t31811 - 11905: 0xBB40,\n\t31812 - 11905: 0xBB41,\n\t31813 - 11905: 0xBB42,\n\t31814 - 11905: 0xBB43,\n\t31815 - 11905: 0xBB44,\n\t31816 - 11905: 0xBB45,\n\t31817 - 11905: 0xBB46,\n\t31818 - 11905: 0xBB47,\n\t31819 - 11905: 0xBB48,\n\t31820 - 11905: 0xBB49,\n\t31821 - 11905: 0xBCAE,\n\t31822 - 11905: 0xBB4A,\n\t31823 - 11905: 0xBB4B,\n\t31824 - 11905: 0xBB4C,\n\t31825 - 11905: 0xBB4D,\n\t31826 - 11905: 0xBB4E,\n\t31827 - 11905: 0xBB4F,\n\t31828 - 11905: 0xBB50,\n\t31829 - 11905: 0xBB51,\n\t31830 - 11905: 0xBB52,\n\t31831 - 11905: 0xBB53,\n\t31832 - 11905: 0xBB54,\n\t31833 - 11905: 0xBB55,\n\t31834 - 11905: 0xBB56,\n\t31835 - 11905: 0xBB57,\n\t31836 - 11905: 0xBB58,\n\t31837 - 11905: 0xBB59,\n\t31838 - 11905: 0xBB5A,\n\t31839 - 11905: 0xBB5B,\n\t31840 - 11905: 0xBB5C,\n\t31841 - 11905: 0xBB5D,\n\t31842 - 11905: 0xBB5E,\n\t31843 - 11905: 0xBB5F,\n\t31844 - 11905: 0xBB60,\n\t31845 - 11905: 0xBB61,\n\t31846 - 11905: 0xBB62,\n\t31847 - 11905: 0xBB63,\n\t31848 - 11905: 0xBB64,\n\t31849 - 11905: 0xBB65,\n\t31850 - 11905: 0xBB66,\n\t31851 - 11905: 0xBB67,\n\t31852 - 11905: 0xBB68,\n\t31853 - 11905: 0xBB69,\n\t31854 - 11905: 0xBB6A,\n\t31855 - 11905: 0xBB6B,\n\t31856 - 11905: 0xBB6C,\n\t31857 - 11905: 0xBB6D,\n\t31858 - 11905: 0xBB6E,\n\t31859 - 11905: 0xC3D7,\n\t31860 - 11905: 0xD9E1,\n\t31861 - 11905: 0xBB6F,\n\t31862 - 11905: 0xBB70,\n\t31863 - 11905: 0xBB71,\n\t31864 - 11905: 0xBB72,\n\t31865 - 11905: 0xBB73,\n\t31866 - 11905: 0xBB74,\n\t31867 - 11905: 0xC0E0,\n\t31868 - 11905: 0xF4CC,\n\t31869 - 11905: 0xD7D1,\n\t31870 - 11905: 0xBB75,\n\t31871 - 11905: 0xBB76,\n\t31872 - 11905: 0xBB77,\n\t31873 - 11905: 0xBB78,\n\t31874 - 11905: 0xBB79,\n\t31875 - 11905: 0xBB7A,\n\t31876 - 11905: 0xBB7B,\n\t31877 - 11905: 0xBB7C,\n\t31878 - 11905: 0xBB7D,\n\t31879 - 11905: 0xBB7E,\n\t31880 - 11905: 0xBB80,\n\t31881 - 11905: 0xB7DB,\n\t31882 - 11905: 0xBB81,\n\t31883 - 11905: 0xBB82,\n\t31884 - 11905: 0xBB83,\n\t31885 - 11905: 0xBB84,\n\t31886 - 11905: 0xBB85,\n\t31887 - 11905: 0xBB86,\n\t31888 - 11905: 0xBB87,\n\t31889 - 11905: 0xF4CE,\n\t31890 - 11905: 0xC1A3,\n\t31891 - 11905: 0xBB88,\n\t31892 - 11905: 0xBB89,\n\t31893 - 11905: 0xC6C9,\n\t31894 - 11905: 0xBB8A,\n\t31895 - 11905: 0xB4D6,\n\t31896 - 11905: 0xD5B3,\n\t31897 - 11905: 0xBB8B,\n\t31898 - 11905: 0xBB8C,\n\t31899 - 11905: 0xBB8D,\n\t31900 - 11905: 0xF4D0,\n\t31901 - 11905: 0xF4CF,\n\t31902 - 11905: 0xF4D1,\n\t31903 - 11905: 0xCBDA,\n\t31904 - 11905: 0xBB8E,\n\t31905 - 11905: 0xBB8F,\n\t31906 - 11905: 0xF4D2,\n\t31907 - 11905: 0xBB90,\n\t31908 - 11905: 0xD4C1,\n\t31909 - 11905: 0xD6E0,\n\t31910 - 11905: 0xBB91,\n\t31911 - 11905: 0xBB92,\n\t31912 - 11905: 0xBB93,\n\t31913 - 11905: 0xBB94,\n\t31914 - 11905: 0xB7E0,\n\t31915 - 11905: 0xBB95,\n\t31916 - 11905: 0xBB96,\n\t31917 - 11905: 0xBB97,\n\t31918 - 11905: 0xC1B8,\n\t31919 - 11905: 0xBB98,\n\t31920 - 11905: 0xBB99,\n\t31921 - 11905: 0xC1BB,\n\t31922 - 11905: 0xF4D3,\n\t31923 - 11905: 0xBEAC,\n\t31924 - 11905: 0xBB9A,\n\t31925 - 11905: 0xBB9B,\n\t31926 - 11905: 0xBB9C,\n\t31927 - 11905: 0xBB9D,\n\t31928 - 11905: 0xBB9E,\n\t31929 - 11905: 0xB4E2,\n\t31930 - 11905: 0xBB9F,\n\t31931 - 11905: 0xBBA0,\n\t31932 - 11905: 0xF4D4,\n\t31933 - 11905: 0xF4D5,\n\t31934 - 11905: 0xBEAB,\n\t31935 - 11905: 0xBC40,\n\t31936 - 11905: 0xBC41,\n\t31937 - 11905: 0xF4D6,\n\t31938 - 11905: 0xBC42,\n\t31939 - 11905: 0xBC43,\n\t31940 - 11905: 0xBC44,\n\t31941 - 11905: 0xF4DB,\n\t31942 - 11905: 0xBC45,\n\t31943 - 11905: 0xF4D7,\n\t31944 - 11905: 0xF4DA,\n\t31945 - 11905: 0xBC46,\n\t31946 - 11905: 0xBAFD,\n\t31947 - 11905: 0xBC47,\n\t31948 - 11905: 0xF4D8,\n\t31949 - 11905: 0xF4D9,\n\t31950 - 11905: 0xBC48,\n\t31951 - 11905: 0xBC49,\n\t31952 - 11905: 0xBC4A,\n\t31953 - 11905: 0xBC4B,\n\t31954 - 11905: 0xBC4C,\n\t31955 - 11905: 0xBC4D,\n\t31956 - 11905: 0xBC4E,\n\t31957 - 11905: 0xB8E2,\n\t31958 - 11905: 0xCCC7,\n\t31959 - 11905: 0xF4DC,\n\t31960 - 11905: 0xBC4F,\n\t31961 - 11905: 0xB2DA,\n\t31962 - 11905: 0xBC50,\n\t31963 - 11905: 0xBC51,\n\t31964 - 11905: 0xC3D3,\n\t31965 - 11905: 0xBC52,\n\t31966 - 11905: 0xBC53,\n\t31967 - 11905: 0xD4E3,\n\t31968 - 11905: 0xBFB7,\n\t31969 - 11905: 0xBC54,\n\t31970 - 11905: 0xBC55,\n\t31971 - 11905: 0xBC56,\n\t31972 - 11905: 0xBC57,\n\t31973 - 11905: 0xBC58,\n\t31974 - 11905: 0xBC59,\n\t31975 - 11905: 0xBC5A,\n\t31976 - 11905: 0xF4DD,\n\t31977 - 11905: 0xBC5B,\n\t31978 - 11905: 0xBC5C,\n\t31979 - 11905: 0xBC5D,\n\t31980 - 11905: 0xBC5E,\n\t31981 - 11905: 0xBC5F,\n\t31982 - 11905: 0xBC60,\n\t31983 - 11905: 0xC5B4,\n\t31984 - 11905: 0xBC61,\n\t31985 - 11905: 0xBC62,\n\t31986 - 11905: 0xBC63,\n\t31987 - 11905: 0xBC64,\n\t31988 - 11905: 0xBC65,\n\t31989 - 11905: 0xBC66,\n\t31990 - 11905: 0xBC67,\n\t31991 - 11905: 0xBC68,\n\t31992 - 11905: 0xF4E9,\n\t31993 - 11905: 0xBC69,\n\t31994 - 11905: 0xBC6A,\n\t31995 - 11905: 0xCFB5,\n\t31996 - 11905: 0xBC6B,\n\t31997 - 11905: 0xBC6C,\n\t31998 - 11905: 0xBC6D,\n\t31999 - 11905: 0xBC6E,\n\t32000 - 11905: 0xBC6F,\n\t32001 - 11905: 0xBC70,\n\t32002 - 11905: 0xBC71,\n\t32003 - 11905: 0xBC72,\n\t32004 - 11905: 0xBC73,\n\t32005 - 11905: 0xBC74,\n\t32006 - 11905: 0xBC75,\n\t32007 - 11905: 0xBC76,\n\t32008 - 11905: 0xBC77,\n\t32009 - 11905: 0xBC78,\n\t32010 - 11905: 0xCEC9,\n\t32011 - 11905: 0xBC79,\n\t32012 - 11905: 0xBC7A,\n\t32013 - 11905: 0xBC7B,\n\t32014 - 11905: 0xBC7C,\n\t32015 - 11905: 0xBC7D,\n\t32016 - 11905: 0xBC7E,\n\t32017 - 11905: 0xBC80,\n\t32018 - 11905: 0xBC81,\n\t32019 - 11905: 0xBC82,\n\t32020 - 11905: 0xBC83,\n\t32021 - 11905: 0xBC84,\n\t32022 - 11905: 0xBC85,\n\t32023 - 11905: 0xBC86,\n\t32024 - 11905: 0xBC87,\n\t32025 - 11905: 0xBC88,\n\t32026 - 11905: 0xBC89,\n\t32027 - 11905: 0xBC8A,\n\t32028 - 11905: 0xBC8B,\n\t32029 - 11905: 0xBC8C,\n\t32030 - 11905: 0xBC8D,\n\t32031 - 11905: 0xBC8E,\n\t32032 - 11905: 0xCBD8,\n\t32033 - 11905: 0xBC8F,\n\t32034 - 11905: 0xCBF7,\n\t32035 - 11905: 0xBC90,\n\t32036 - 11905: 0xBC91,\n\t32037 - 11905: 0xBC92,\n\t32038 - 11905: 0xBC93,\n\t32039 - 11905: 0xBDF4,\n\t32040 - 11905: 0xBC94,\n\t32041 - 11905: 0xBC95,\n\t32042 - 11905: 0xBC96,\n\t32043 - 11905: 0xD7CF,\n\t32044 - 11905: 0xBC97,\n\t32045 - 11905: 0xBC98,\n\t32046 - 11905: 0xBC99,\n\t32047 - 11905: 0xC0DB,\n\t32048 - 11905: 0xBC9A,\n\t32049 - 11905: 0xBC9B,\n\t32050 - 11905: 0xBC9C,\n\t32051 - 11905: 0xBC9D,\n\t32052 - 11905: 0xBC9E,\n\t32053 - 11905: 0xBC9F,\n\t32054 - 11905: 0xBCA0,\n\t32055 - 11905: 0xBD40,\n\t32056 - 11905: 0xBD41,\n\t32057 - 11905: 0xBD42,\n\t32058 - 11905: 0xBD43,\n\t32059 - 11905: 0xBD44,\n\t32060 - 11905: 0xBD45,\n\t32061 - 11905: 0xBD46,\n\t32062 - 11905: 0xBD47,\n\t32063 - 11905: 0xBD48,\n\t32064 - 11905: 0xBD49,\n\t32065 - 11905: 0xBD4A,\n\t32066 - 11905: 0xBD4B,\n\t32067 - 11905: 0xBD4C,\n\t32068 - 11905: 0xBD4D,\n\t32069 - 11905: 0xBD4E,\n\t32070 - 11905: 0xBD4F,\n\t32071 - 11905: 0xBD50,\n\t32072 - 11905: 0xBD51,\n\t32073 - 11905: 0xBD52,\n\t32074 - 11905: 0xBD53,\n\t32075 - 11905: 0xBD54,\n\t32076 - 11905: 0xBD55,\n\t32077 - 11905: 0xBD56,\n\t32078 - 11905: 0xBD57,\n\t32079 - 11905: 0xBD58,\n\t32080 - 11905: 0xBD59,\n\t32081 - 11905: 0xBD5A,\n\t32082 - 11905: 0xBD5B,\n\t32083 - 11905: 0xBD5C,\n\t32084 - 11905: 0xBD5D,\n\t32085 - 11905: 0xBD5E,\n\t32086 - 11905: 0xBD5F,\n\t32087 - 11905: 0xBD60,\n\t32088 - 11905: 0xBD61,\n\t32089 - 11905: 0xBD62,\n\t32090 - 11905: 0xBD63,\n\t32091 - 11905: 0xBD64,\n\t32092 - 11905: 0xBD65,\n\t32093 - 11905: 0xBD66,\n\t32094 - 11905: 0xBD67,\n\t32095 - 11905: 0xBD68,\n\t32096 - 11905: 0xBD69,\n\t32097 - 11905: 0xBD6A,\n\t32098 - 11905: 0xBD6B,\n\t32099 - 11905: 0xBD6C,\n\t32100 - 11905: 0xBD6D,\n\t32101 - 11905: 0xBD6E,\n\t32102 - 11905: 0xBD6F,\n\t32103 - 11905: 0xBD70,\n\t32104 - 11905: 0xBD71,\n\t32105 - 11905: 0xBD72,\n\t32106 - 11905: 0xBD73,\n\t32107 - 11905: 0xBD74,\n\t32108 - 11905: 0xBD75,\n\t32109 - 11905: 0xBD76,\n\t32110 - 11905: 0xD0F5,\n\t32111 - 11905: 0xBD77,\n\t32112 - 11905: 0xBD78,\n\t32113 - 11905: 0xBD79,\n\t32114 - 11905: 0xBD7A,\n\t32115 - 11905: 0xBD7B,\n\t32116 - 11905: 0xBD7C,\n\t32117 - 11905: 0xBD7D,\n\t32118 - 11905: 0xBD7E,\n\t32119 - 11905: 0xF4EA,\n\t32120 - 11905: 0xBD80,\n\t32121 - 11905: 0xBD81,\n\t32122 - 11905: 0xBD82,\n\t32123 - 11905: 0xBD83,\n\t32124 - 11905: 0xBD84,\n\t32125 - 11905: 0xBD85,\n\t32126 - 11905: 0xBD86,\n\t32127 - 11905: 0xBD87,\n\t32128 - 11905: 0xBD88,\n\t32129 - 11905: 0xBD89,\n\t32130 - 11905: 0xBD8A,\n\t32131 - 11905: 0xBD8B,\n\t32132 - 11905: 0xBD8C,\n\t32133 - 11905: 0xBD8D,\n\t32134 - 11905: 0xBD8E,\n\t32135 - 11905: 0xBD8F,\n\t32136 - 11905: 0xBD90,\n\t32137 - 11905: 0xBD91,\n\t32138 - 11905: 0xBD92,\n\t32139 - 11905: 0xBD93,\n\t32140 - 11905: 0xBD94,\n\t32141 - 11905: 0xBD95,\n\t32142 - 11905: 0xBD96,\n\t32143 - 11905: 0xBD97,\n\t32144 - 11905: 0xBD98,\n\t32145 - 11905: 0xBD99,\n\t32146 - 11905: 0xBD9A,\n\t32147 - 11905: 0xBD9B,\n\t32148 - 11905: 0xBD9C,\n\t32149 - 11905: 0xBD9D,\n\t32150 - 11905: 0xBD9E,\n\t32151 - 11905: 0xBD9F,\n\t32152 - 11905: 0xBDA0,\n\t32153 - 11905: 0xBE40,\n\t32154 - 11905: 0xBE41,\n\t32155 - 11905: 0xBE42,\n\t32156 - 11905: 0xBE43,\n\t32157 - 11905: 0xBE44,\n\t32158 - 11905: 0xBE45,\n\t32159 - 11905: 0xBE46,\n\t32160 - 11905: 0xBE47,\n\t32161 - 11905: 0xBE48,\n\t32162 - 11905: 0xBE49,\n\t32163 - 11905: 0xBE4A,\n\t32164 - 11905: 0xBE4B,\n\t32165 - 11905: 0xBE4C,\n\t32166 - 11905: 0xF4EB,\n\t32167 - 11905: 0xBE4D,\n\t32168 - 11905: 0xBE4E,\n\t32169 - 11905: 0xBE4F,\n\t32170 - 11905: 0xBE50,\n\t32171 - 11905: 0xBE51,\n\t32172 - 11905: 0xBE52,\n\t32173 - 11905: 0xBE53,\n\t32174 - 11905: 0xF4EC,\n\t32175 - 11905: 0xBE54,\n\t32176 - 11905: 0xBE55,\n\t32177 - 11905: 0xBE56,\n\t32178 - 11905: 0xBE57,\n\t32179 - 11905: 0xBE58,\n\t32180 - 11905: 0xBE59,\n\t32181 - 11905: 0xBE5A,\n\t32182 - 11905: 0xBE5B,\n\t32183 - 11905: 0xBE5C,\n\t32184 - 11905: 0xBE5D,\n\t32185 - 11905: 0xBE5E,\n\t32186 - 11905: 0xBE5F,\n\t32187 - 11905: 0xBE60,\n\t32188 - 11905: 0xBE61,\n\t32189 - 11905: 0xBE62,\n\t32190 - 11905: 0xBE63,\n\t32191 - 11905: 0xBE64,\n\t32192 - 11905: 0xBE65,\n\t32193 - 11905: 0xBE66,\n\t32194 - 11905: 0xBE67,\n\t32195 - 11905: 0xBE68,\n\t32196 - 11905: 0xBE69,\n\t32197 - 11905: 0xBE6A,\n\t32198 - 11905: 0xBE6B,\n\t32199 - 11905: 0xBE6C,\n\t32200 - 11905: 0xBE6D,\n\t32201 - 11905: 0xBE6E,\n\t32202 - 11905: 0xBE6F,\n\t32203 - 11905: 0xBE70,\n\t32204 - 11905: 0xBE71,\n\t32205 - 11905: 0xBE72,\n\t32206 - 11905: 0xBE73,\n\t32207 - 11905: 0xBE74,\n\t32208 - 11905: 0xBE75,\n\t32209 - 11905: 0xBE76,\n\t32210 - 11905: 0xBE77,\n\t32211 - 11905: 0xBE78,\n\t32212 - 11905: 0xBE79,\n\t32213 - 11905: 0xBE7A,\n\t32214 - 11905: 0xBE7B,\n\t32215 - 11905: 0xBE7C,\n\t32216 - 11905: 0xBE7D,\n\t32217 - 11905: 0xBE7E,\n\t32218 - 11905: 0xBE80,\n\t32219 - 11905: 0xBE81,\n\t32220 - 11905: 0xBE82,\n\t32221 - 11905: 0xBE83,\n\t32222 - 11905: 0xBE84,\n\t32223 - 11905: 0xBE85,\n\t32224 - 11905: 0xBE86,\n\t32225 - 11905: 0xBE87,\n\t32226 - 11905: 0xBE88,\n\t32227 - 11905: 0xBE89,\n\t32228 - 11905: 0xBE8A,\n\t32229 - 11905: 0xBE8B,\n\t32230 - 11905: 0xBE8C,\n\t32231 - 11905: 0xBE8D,\n\t32232 - 11905: 0xBE8E,\n\t32233 - 11905: 0xBE8F,\n\t32234 - 11905: 0xBE90,\n\t32235 - 11905: 0xBE91,\n\t32236 - 11905: 0xBE92,\n\t32237 - 11905: 0xBE93,\n\t32238 - 11905: 0xBE94,\n\t32239 - 11905: 0xBE95,\n\t32240 - 11905: 0xBE96,\n\t32241 - 11905: 0xBE97,\n\t32242 - 11905: 0xBE98,\n\t32243 - 11905: 0xBE99,\n\t32244 - 11905: 0xBE9A,\n\t32245 - 11905: 0xBE9B,\n\t32246 - 11905: 0xBE9C,\n\t32247 - 11905: 0xBE9D,\n\t32248 - 11905: 0xBE9E,\n\t32249 - 11905: 0xBE9F,\n\t32250 - 11905: 0xBEA0,\n\t32251 - 11905: 0xBF40,\n\t32252 - 11905: 0xBF41,\n\t32253 - 11905: 0xBF42,\n\t32254 - 11905: 0xBF43,\n\t32255 - 11905: 0xBF44,\n\t32256 - 11905: 0xBF45,\n\t32257 - 11905: 0xBF46,\n\t32258 - 11905: 0xBF47,\n\t32259 - 11905: 0xBF48,\n\t32260 - 11905: 0xBF49,\n\t32261 - 11905: 0xBF4A,\n\t32262 - 11905: 0xBF4B,\n\t32263 - 11905: 0xBF4C,\n\t32264 - 11905: 0xBF4D,\n\t32265 - 11905: 0xBF4E,\n\t32266 - 11905: 0xBF4F,\n\t32267 - 11905: 0xBF50,\n\t32268 - 11905: 0xBF51,\n\t32269 - 11905: 0xBF52,\n\t32270 - 11905: 0xBF53,\n\t32271 - 11905: 0xBF54,\n\t32272 - 11905: 0xBF55,\n\t32273 - 11905: 0xBF56,\n\t32274 - 11905: 0xBF57,\n\t32275 - 11905: 0xBF58,\n\t32276 - 11905: 0xBF59,\n\t32277 - 11905: 0xBF5A,\n\t32278 - 11905: 0xBF5B,\n\t32279 - 11905: 0xBF5C,\n\t32280 - 11905: 0xBF5D,\n\t32281 - 11905: 0xBF5E,\n\t32282 - 11905: 0xBF5F,\n\t32283 - 11905: 0xBF60,\n\t32284 - 11905: 0xBF61,\n\t32285 - 11905: 0xBF62,\n\t32286 - 11905: 0xBF63,\n\t32287 - 11905: 0xBF64,\n\t32288 - 11905: 0xBF65,\n\t32289 - 11905: 0xBF66,\n\t32290 - 11905: 0xBF67,\n\t32291 - 11905: 0xBF68,\n\t32292 - 11905: 0xBF69,\n\t32293 - 11905: 0xBF6A,\n\t32294 - 11905: 0xBF6B,\n\t32295 - 11905: 0xBF6C,\n\t32296 - 11905: 0xBF6D,\n\t32297 - 11905: 0xBF6E,\n\t32298 - 11905: 0xBF6F,\n\t32299 - 11905: 0xBF70,\n\t32300 - 11905: 0xBF71,\n\t32301 - 11905: 0xBF72,\n\t32302 - 11905: 0xBF73,\n\t32303 - 11905: 0xBF74,\n\t32304 - 11905: 0xBF75,\n\t32305 - 11905: 0xBF76,\n\t32306 - 11905: 0xBF77,\n\t32307 - 11905: 0xBF78,\n\t32308 - 11905: 0xBF79,\n\t32309 - 11905: 0xBF7A,\n\t32310 - 11905: 0xBF7B,\n\t32311 - 11905: 0xBF7C,\n\t32312 - 11905: 0xBF7D,\n\t32313 - 11905: 0xBF7E,\n\t32314 - 11905: 0xBF80,\n\t32315 - 11905: 0xF7E3,\n\t32316 - 11905: 0xBF81,\n\t32317 - 11905: 0xBF82,\n\t32318 - 11905: 0xBF83,\n\t32319 - 11905: 0xBF84,\n\t32320 - 11905: 0xBF85,\n\t32321 - 11905: 0xB7B1,\n\t32322 - 11905: 0xBF86,\n\t32323 - 11905: 0xBF87,\n\t32324 - 11905: 0xBF88,\n\t32325 - 11905: 0xBF89,\n\t32326 - 11905: 0xBF8A,\n\t32327 - 11905: 0xF4ED,\n\t32328 - 11905: 0xBF8B,\n\t32329 - 11905: 0xBF8C,\n\t32330 - 11905: 0xBF8D,\n\t32331 - 11905: 0xBF8E,\n\t32332 - 11905: 0xBF8F,\n\t32333 - 11905: 0xBF90,\n\t32334 - 11905: 0xBF91,\n\t32335 - 11905: 0xBF92,\n\t32336 - 11905: 0xBF93,\n\t32337 - 11905: 0xBF94,\n\t32338 - 11905: 0xBF95,\n\t32339 - 11905: 0xBF96,\n\t32340 - 11905: 0xBF97,\n\t32341 - 11905: 0xBF98,\n\t32342 - 11905: 0xBF99,\n\t32343 - 11905: 0xBF9A,\n\t32344 - 11905: 0xBF9B,\n\t32345 - 11905: 0xBF9C,\n\t32346 - 11905: 0xBF9D,\n\t32347 - 11905: 0xBF9E,\n\t32348 - 11905: 0xBF9F,\n\t32349 - 11905: 0xBFA0,\n\t32350 - 11905: 0xC040,\n\t32351 - 11905: 0xC041,\n\t32352 - 11905: 0xC042,\n\t32353 - 11905: 0xC043,\n\t32354 - 11905: 0xC044,\n\t32355 - 11905: 0xC045,\n\t32356 - 11905: 0xC046,\n\t32357 - 11905: 0xC047,\n\t32358 - 11905: 0xC048,\n\t32359 - 11905: 0xC049,\n\t32360 - 11905: 0xC04A,\n\t32361 - 11905: 0xC04B,\n\t32362 - 11905: 0xC04C,\n\t32363 - 11905: 0xC04D,\n\t32364 - 11905: 0xC04E,\n\t32365 - 11905: 0xC04F,\n\t32366 - 11905: 0xC050,\n\t32367 - 11905: 0xC051,\n\t32368 - 11905: 0xC052,\n\t32369 - 11905: 0xC053,\n\t32370 - 11905: 0xC054,\n\t32371 - 11905: 0xC055,\n\t32372 - 11905: 0xC056,\n\t32373 - 11905: 0xC057,\n\t32374 - 11905: 0xC058,\n\t32375 - 11905: 0xC059,\n\t32376 - 11905: 0xC05A,\n\t32377 - 11905: 0xC05B,\n\t32378 - 11905: 0xC05C,\n\t32379 - 11905: 0xC05D,\n\t32380 - 11905: 0xC05E,\n\t32381 - 11905: 0xC05F,\n\t32382 - 11905: 0xC060,\n\t32383 - 11905: 0xC061,\n\t32384 - 11905: 0xC062,\n\t32385 - 11905: 0xC063,\n\t32386 - 11905: 0xD7EB,\n\t32387 - 11905: 0xC064,\n\t32388 - 11905: 0xC065,\n\t32389 - 11905: 0xC066,\n\t32390 - 11905: 0xC067,\n\t32391 - 11905: 0xC068,\n\t32392 - 11905: 0xC069,\n\t32393 - 11905: 0xC06A,\n\t32394 - 11905: 0xC06B,\n\t32395 - 11905: 0xC06C,\n\t32396 - 11905: 0xC06D,\n\t32397 - 11905: 0xC06E,\n\t32398 - 11905: 0xC06F,\n\t32399 - 11905: 0xC070,\n\t32400 - 11905: 0xC071,\n\t32401 - 11905: 0xC072,\n\t32402 - 11905: 0xC073,\n\t32403 - 11905: 0xC074,\n\t32404 - 11905: 0xC075,\n\t32405 - 11905: 0xC076,\n\t32406 - 11905: 0xC077,\n\t32407 - 11905: 0xC078,\n\t32408 - 11905: 0xC079,\n\t32409 - 11905: 0xC07A,\n\t32410 - 11905: 0xC07B,\n\t32411 - 11905: 0xF4EE,\n\t32412 - 11905: 0xC07C,\n\t32413 - 11905: 0xC07D,\n\t32414 - 11905: 0xC07E,\n\t32415 - 11905: 0xE6F9,\n\t32416 - 11905: 0xBEC0,\n\t32417 - 11905: 0xE6FA,\n\t32418 - 11905: 0xBAEC,\n\t32419 - 11905: 0xE6FB,\n\t32420 - 11905: 0xCFCB,\n\t32421 - 11905: 0xE6FC,\n\t32422 - 11905: 0xD4BC,\n\t32423 - 11905: 0xBCB6,\n\t32424 - 11905: 0xE6FD,\n\t32425 - 11905: 0xE6FE,\n\t32426 - 11905: 0xBCCD,\n\t32427 - 11905: 0xC8D2,\n\t32428 - 11905: 0xCEB3,\n\t32429 - 11905: 0xE7A1,\n\t32430 - 11905: 0xC080,\n\t32431 - 11905: 0xB4BF,\n\t32432 - 11905: 0xE7A2,\n\t32433 - 11905: 0xC9B4,\n\t32434 - 11905: 0xB8D9,\n\t32435 - 11905: 0xC4C9,\n\t32436 - 11905: 0xC081,\n\t32437 - 11905: 0xD7DD,\n\t32438 - 11905: 0xC2DA,\n\t32439 - 11905: 0xB7D7,\n\t32440 - 11905: 0xD6BD,\n\t32441 - 11905: 0xCEC6,\n\t32442 - 11905: 0xB7C4,\n\t32443 - 11905: 0xC082,\n\t32444 - 11905: 0xC083,\n\t32445 - 11905: 0xC5A6,\n\t32446 - 11905: 0xE7A3,\n\t32447 - 11905: 0xCFDF,\n\t32448 - 11905: 0xE7A4,\n\t32449 - 11905: 0xE7A5,\n\t32450 - 11905: 0xE7A6,\n\t32451 - 11905: 0xC1B7,\n\t32452 - 11905: 0xD7E9,\n\t32453 - 11905: 0xC9F0,\n\t32454 - 11905: 0xCFB8,\n\t32455 - 11905: 0xD6AF,\n\t32456 - 11905: 0xD6D5,\n\t32457 - 11905: 0xE7A7,\n\t32458 - 11905: 0xB0ED,\n\t32459 - 11905: 0xE7A8,\n\t32460 - 11905: 0xE7A9,\n\t32461 - 11905: 0xC9DC,\n\t32462 - 11905: 0xD2EF,\n\t32463 - 11905: 0xBEAD,\n\t32464 - 11905: 0xE7AA,\n\t32465 - 11905: 0xB0F3,\n\t32466 - 11905: 0xC8DE,\n\t32467 - 11905: 0xBDE1,\n\t32468 - 11905: 0xE7AB,\n\t32469 - 11905: 0xC8C6,\n\t32470 - 11905: 0xC084,\n\t32471 - 11905: 0xE7AC,\n\t32472 - 11905: 0xBBE6,\n\t32473 - 11905: 0xB8F8,\n\t32474 - 11905: 0xD1A4,\n\t32475 - 11905: 0xE7AD,\n\t32476 - 11905: 0xC2E7,\n\t32477 - 11905: 0xBEF8,\n\t32478 - 11905: 0xBDCA,\n\t32479 - 11905: 0xCDB3,\n\t32480 - 11905: 0xE7AE,\n\t32481 - 11905: 0xE7AF,\n\t32482 - 11905: 0xBEEE,\n\t32483 - 11905: 0xD0E5,\n\t32484 - 11905: 0xC085,\n\t32485 - 11905: 0xCBE7,\n\t32486 - 11905: 0xCCD0,\n\t32487 - 11905: 0xBCCC,\n\t32488 - 11905: 0xE7B0,\n\t32489 - 11905: 0xBCA8,\n\t32490 - 11905: 0xD0F7,\n\t32491 - 11905: 0xE7B1,\n\t32492 - 11905: 0xC086,\n\t32493 - 11905: 0xD0F8,\n\t32494 - 11905: 0xE7B2,\n\t32495 - 11905: 0xE7B3,\n\t32496 - 11905: 0xB4C2,\n\t32497 - 11905: 0xE7B4,\n\t32498 - 11905: 0xE7B5,\n\t32499 - 11905: 0xC9FE,\n\t32500 - 11905: 0xCEAC,\n\t32501 - 11905: 0xC3E0,\n\t32502 - 11905: 0xE7B7,\n\t32503 - 11905: 0xB1C1,\n\t32504 - 11905: 0xB3F1,\n\t32505 - 11905: 0xC087,\n\t32506 - 11905: 0xE7B8,\n\t32507 - 11905: 0xE7B9,\n\t32508 - 11905: 0xD7DB,\n\t32509 - 11905: 0xD5C0,\n\t32510 - 11905: 0xE7BA,\n\t32511 - 11905: 0xC2CC,\n\t32512 - 11905: 0xD7BA,\n\t32513 - 11905: 0xE7BB,\n\t32514 - 11905: 0xE7BC,\n\t32515 - 11905: 0xE7BD,\n\t32516 - 11905: 0xBCEA,\n\t32517 - 11905: 0xC3E5,\n\t32518 - 11905: 0xC0C2,\n\t32519 - 11905: 0xE7BE,\n\t32520 - 11905: 0xE7BF,\n\t32521 - 11905: 0xBCA9,\n\t32522 - 11905: 0xC088,\n\t32523 - 11905: 0xE7C0,\n\t32524 - 11905: 0xE7C1,\n\t32525 - 11905: 0xE7B6,\n\t32526 - 11905: 0xB6D0,\n\t32527 - 11905: 0xE7C2,\n\t32528 - 11905: 0xC089,\n\t32529 - 11905: 0xE7C3,\n\t32530 - 11905: 0xE7C4,\n\t32531 - 11905: 0xBBBA,\n\t32532 - 11905: 0xB5DE,\n\t32533 - 11905: 0xC2C6,\n\t32534 - 11905: 0xB1E0,\n\t32535 - 11905: 0xE7C5,\n\t32536 - 11905: 0xD4B5,\n\t32537 - 11905: 0xE7C6,\n\t32538 - 11905: 0xB8BF,\n\t32539 - 11905: 0xE7C8,\n\t32540 - 11905: 0xE7C7,\n\t32541 - 11905: 0xB7EC,\n\t32542 - 11905: 0xC08A,\n\t32543 - 11905: 0xE7C9,\n\t32544 - 11905: 0xB2F8,\n\t32545 - 11905: 0xE7CA,\n\t32546 - 11905: 0xE7CB,\n\t32547 - 11905: 0xE7CC,\n\t32548 - 11905: 0xE7CD,\n\t32549 - 11905: 0xE7CE,\n\t32550 - 11905: 0xE7CF,\n\t32551 - 11905: 0xE7D0,\n\t32552 - 11905: 0xD3A7,\n\t32553 - 11905: 0xCBF5,\n\t32554 - 11905: 0xE7D1,\n\t32555 - 11905: 0xE7D2,\n\t32556 - 11905: 0xE7D3,\n\t32557 - 11905: 0xE7D4,\n\t32558 - 11905: 0xC9C9,\n\t32559 - 11905: 0xE7D5,\n\t32560 - 11905: 0xE7D6,\n\t32561 - 11905: 0xE7D7,\n\t32562 - 11905: 0xE7D8,\n\t32563 - 11905: 0xE7D9,\n\t32564 - 11905: 0xBDC9,\n\t32565 - 11905: 0xE7DA,\n\t32566 - 11905: 0xF3BE,\n\t32567 - 11905: 0xC08B,\n\t32568 - 11905: 0xB8D7,\n\t32569 - 11905: 0xC08C,\n\t32570 - 11905: 0xC8B1,\n\t32571 - 11905: 0xC08D,\n\t32572 - 11905: 0xC08E,\n\t32573 - 11905: 0xC08F,\n\t32574 - 11905: 0xC090,\n\t32575 - 11905: 0xC091,\n\t32576 - 11905: 0xC092,\n\t32577 - 11905: 0xC093,\n\t32578 - 11905: 0xF3BF,\n\t32579 - 11905: 0xC094,\n\t32580 - 11905: 0xF3C0,\n\t32581 - 11905: 0xF3C1,\n\t32582 - 11905: 0xC095,\n\t32583 - 11905: 0xC096,\n\t32584 - 11905: 0xC097,\n\t32585 - 11905: 0xC098,\n\t32586 - 11905: 0xC099,\n\t32587 - 11905: 0xC09A,\n\t32588 - 11905: 0xC09B,\n\t32589 - 11905: 0xC09C,\n\t32590 - 11905: 0xC09D,\n\t32591 - 11905: 0xC09E,\n\t32592 - 11905: 0xB9DE,\n\t32593 - 11905: 0xCDF8,\n\t32594 - 11905: 0xC09F,\n\t32595 - 11905: 0xC0A0,\n\t32596 - 11905: 0xD8E8,\n\t32597 - 11905: 0xBAB1,\n\t32598 - 11905: 0xC140,\n\t32599 - 11905: 0xC2DE,\n\t32600 - 11905: 0xEEB7,\n\t32601 - 11905: 0xC141,\n\t32602 - 11905: 0xB7A3,\n\t32603 - 11905: 0xC142,\n\t32604 - 11905: 0xC143,\n\t32605 - 11905: 0xC144,\n\t32606 - 11905: 0xC145,\n\t32607 - 11905: 0xEEB9,\n\t32608 - 11905: 0xC146,\n\t32609 - 11905: 0xEEB8,\n\t32610 - 11905: 0xB0D5,\n\t32611 - 11905: 0xC147,\n\t32612 - 11905: 0xC148,\n\t32613 - 11905: 0xC149,\n\t32614 - 11905: 0xC14A,\n\t32615 - 11905: 0xC14B,\n\t32616 - 11905: 0xEEBB,\n\t32617 - 11905: 0xD5D6,\n\t32618 - 11905: 0xD7EF,\n\t32619 - 11905: 0xC14C,\n\t32620 - 11905: 0xC14D,\n\t32621 - 11905: 0xC14E,\n\t32622 - 11905: 0xD6C3,\n\t32623 - 11905: 0xC14F,\n\t32624 - 11905: 0xC150,\n\t32625 - 11905: 0xEEBD,\n\t32626 - 11905: 0xCAF0,\n\t32627 - 11905: 0xC151,\n\t32628 - 11905: 0xEEBC,\n\t32629 - 11905: 0xC152,\n\t32630 - 11905: 0xC153,\n\t32631 - 11905: 0xC154,\n\t32632 - 11905: 0xC155,\n\t32633 - 11905: 0xEEBE,\n\t32634 - 11905: 0xC156,\n\t32635 - 11905: 0xC157,\n\t32636 - 11905: 0xC158,\n\t32637 - 11905: 0xC159,\n\t32638 - 11905: 0xEEC0,\n\t32639 - 11905: 0xC15A,\n\t32640 - 11905: 0xC15B,\n\t32641 - 11905: 0xEEBF,\n\t32642 - 11905: 0xC15C,\n\t32643 - 11905: 0xC15D,\n\t32644 - 11905: 0xC15E,\n\t32645 - 11905: 0xC15F,\n\t32646 - 11905: 0xC160,\n\t32647 - 11905: 0xC161,\n\t32648 - 11905: 0xC162,\n\t32649 - 11905: 0xC163,\n\t32650 - 11905: 0xD1F2,\n\t32651 - 11905: 0xC164,\n\t32652 - 11905: 0xC7BC,\n\t32653 - 11905: 0xC165,\n\t32654 - 11905: 0xC3C0,\n\t32655 - 11905: 0xC166,\n\t32656 - 11905: 0xC167,\n\t32657 - 11905: 0xC168,\n\t32658 - 11905: 0xC169,\n\t32659 - 11905: 0xC16A,\n\t32660 - 11905: 0xB8E1,\n\t32661 - 11905: 0xC16B,\n\t32662 - 11905: 0xC16C,\n\t32663 - 11905: 0xC16D,\n\t32664 - 11905: 0xC16E,\n\t32665 - 11905: 0xC16F,\n\t32666 - 11905: 0xC1E7,\n\t32667 - 11905: 0xC170,\n\t32668 - 11905: 0xC171,\n\t32669 - 11905: 0xF4C6,\n\t32670 - 11905: 0xD0DF,\n\t32671 - 11905: 0xF4C7,\n\t32672 - 11905: 0xC172,\n\t32673 - 11905: 0xCFDB,\n\t32674 - 11905: 0xC173,\n\t32675 - 11905: 0xC174,\n\t32676 - 11905: 0xC8BA,\n\t32677 - 11905: 0xC175,\n\t32678 - 11905: 0xC176,\n\t32679 - 11905: 0xF4C8,\n\t32680 - 11905: 0xC177,\n\t32681 - 11905: 0xC178,\n\t32682 - 11905: 0xC179,\n\t32683 - 11905: 0xC17A,\n\t32684 - 11905: 0xC17B,\n\t32685 - 11905: 0xC17C,\n\t32686 - 11905: 0xC17D,\n\t32687 - 11905: 0xF4C9,\n\t32688 - 11905: 0xF4CA,\n\t32689 - 11905: 0xC17E,\n\t32690 - 11905: 0xF4CB,\n\t32691 - 11905: 0xC180,\n\t32692 - 11905: 0xC181,\n\t32693 - 11905: 0xC182,\n\t32694 - 11905: 0xC183,\n\t32695 - 11905: 0xC184,\n\t32696 - 11905: 0xD9FA,\n\t32697 - 11905: 0xB8FE,\n\t32698 - 11905: 0xC185,\n\t32699 - 11905: 0xC186,\n\t32700 - 11905: 0xE5F1,\n\t32701 - 11905: 0xD3F0,\n\t32702 - 11905: 0xC187,\n\t32703 - 11905: 0xF4E0,\n\t32704 - 11905: 0xC188,\n\t32705 - 11905: 0xCECC,\n\t32706 - 11905: 0xC189,\n\t32707 - 11905: 0xC18A,\n\t32708 - 11905: 0xC18B,\n\t32709 - 11905: 0xB3E1,\n\t32710 - 11905: 0xC18C,\n\t32711 - 11905: 0xC18D,\n\t32712 - 11905: 0xC18E,\n\t32713 - 11905: 0xC18F,\n\t32714 - 11905: 0xF1B4,\n\t32715 - 11905: 0xC190,\n\t32716 - 11905: 0xD2EE,\n\t32717 - 11905: 0xC191,\n\t32718 - 11905: 0xF4E1,\n\t32719 - 11905: 0xC192,\n\t32720 - 11905: 0xC193,\n\t32721 - 11905: 0xC194,\n\t32722 - 11905: 0xC195,\n\t32723 - 11905: 0xC196,\n\t32724 - 11905: 0xCFE8,\n\t32725 - 11905: 0xF4E2,\n\t32726 - 11905: 0xC197,\n\t32727 - 11905: 0xC198,\n\t32728 - 11905: 0xC7CC,\n\t32729 - 11905: 0xC199,\n\t32730 - 11905: 0xC19A,\n\t32731 - 11905: 0xC19B,\n\t32732 - 11905: 0xC19C,\n\t32733 - 11905: 0xC19D,\n\t32734 - 11905: 0xC19E,\n\t32735 - 11905: 0xB5D4,\n\t32736 - 11905: 0xB4E4,\n\t32737 - 11905: 0xF4E4,\n\t32738 - 11905: 0xC19F,\n\t32739 - 11905: 0xC1A0,\n\t32740 - 11905: 0xC240,\n\t32741 - 11905: 0xF4E3,\n\t32742 - 11905: 0xF4E5,\n\t32743 - 11905: 0xC241,\n\t32744 - 11905: 0xC242,\n\t32745 - 11905: 0xF4E6,\n\t32746 - 11905: 0xC243,\n\t32747 - 11905: 0xC244,\n\t32748 - 11905: 0xC245,\n\t32749 - 11905: 0xC246,\n\t32750 - 11905: 0xF4E7,\n\t32751 - 11905: 0xC247,\n\t32752 - 11905: 0xBAB2,\n\t32753 - 11905: 0xB0BF,\n\t32754 - 11905: 0xC248,\n\t32755 - 11905: 0xF4E8,\n\t32756 - 11905: 0xC249,\n\t32757 - 11905: 0xC24A,\n\t32758 - 11905: 0xC24B,\n\t32759 - 11905: 0xC24C,\n\t32760 - 11905: 0xC24D,\n\t32761 - 11905: 0xC24E,\n\t32762 - 11905: 0xC24F,\n\t32763 - 11905: 0xB7AD,\n\t32764 - 11905: 0xD2ED,\n\t32765 - 11905: 0xC250,\n\t32766 - 11905: 0xC251,\n\t32767 - 11905: 0xC252,\n\t32768 - 11905: 0xD2AB,\n\t32769 - 11905: 0xC0CF,\n\t32770 - 11905: 0xC253,\n\t32771 - 11905: 0xBFBC,\n\t32772 - 11905: 0xEBA3,\n\t32773 - 11905: 0xD5DF,\n\t32774 - 11905: 0xEAC8,\n\t32775 - 11905: 0xC254,\n\t32776 - 11905: 0xC255,\n\t32777 - 11905: 0xC256,\n\t32778 - 11905: 0xC257,\n\t32779 - 11905: 0xF1F3,\n\t32780 - 11905: 0xB6F8,\n\t32781 - 11905: 0xCBA3,\n\t32782 - 11905: 0xC258,\n\t32783 - 11905: 0xC259,\n\t32784 - 11905: 0xC4CD,\n\t32785 - 11905: 0xC25A,\n\t32786 - 11905: 0xF1E7,\n\t32787 - 11905: 0xC25B,\n\t32788 - 11905: 0xF1E8,\n\t32789 - 11905: 0xB8FB,\n\t32790 - 11905: 0xF1E9,\n\t32791 - 11905: 0xBAC4,\n\t32792 - 11905: 0xD4C5,\n\t32793 - 11905: 0xB0D2,\n\t32794 - 11905: 0xC25C,\n\t32795 - 11905: 0xC25D,\n\t32796 - 11905: 0xF1EA,\n\t32797 - 11905: 0xC25E,\n\t32798 - 11905: 0xC25F,\n\t32799 - 11905: 0xC260,\n\t32800 - 11905: 0xF1EB,\n\t32801 - 11905: 0xC261,\n\t32802 - 11905: 0xF1EC,\n\t32803 - 11905: 0xC262,\n\t32804 - 11905: 0xC263,\n\t32805 - 11905: 0xF1ED,\n\t32806 - 11905: 0xF1EE,\n\t32807 - 11905: 0xF1EF,\n\t32808 - 11905: 0xF1F1,\n\t32809 - 11905: 0xF1F0,\n\t32810 - 11905: 0xC5D5,\n\t32811 - 11905: 0xC264,\n\t32812 - 11905: 0xC265,\n\t32813 - 11905: 0xC266,\n\t32814 - 11905: 0xC267,\n\t32815 - 11905: 0xC268,\n\t32816 - 11905: 0xC269,\n\t32817 - 11905: 0xF1F2,\n\t32818 - 11905: 0xC26A,\n\t32819 - 11905: 0xB6FA,\n\t32820 - 11905: 0xC26B,\n\t32821 - 11905: 0xF1F4,\n\t32822 - 11905: 0xD2AE,\n\t32823 - 11905: 0xDEC7,\n\t32824 - 11905: 0xCBCA,\n\t32825 - 11905: 0xC26C,\n\t32826 - 11905: 0xC26D,\n\t32827 - 11905: 0xB3DC,\n\t32828 - 11905: 0xC26E,\n\t32829 - 11905: 0xB5A2,\n\t32830 - 11905: 0xC26F,\n\t32831 - 11905: 0xB9A2,\n\t32832 - 11905: 0xC270,\n\t32833 - 11905: 0xC271,\n\t32834 - 11905: 0xC4F4,\n\t32835 - 11905: 0xF1F5,\n\t32836 - 11905: 0xC272,\n\t32837 - 11905: 0xC273,\n\t32838 - 11905: 0xF1F6,\n\t32839 - 11905: 0xC274,\n\t32840 - 11905: 0xC275,\n\t32841 - 11905: 0xC276,\n\t32842 - 11905: 0xC1C4,\n\t32843 - 11905: 0xC1FB,\n\t32844 - 11905: 0xD6B0,\n\t32845 - 11905: 0xF1F7,\n\t32846 - 11905: 0xC277,\n\t32847 - 11905: 0xC278,\n\t32848 - 11905: 0xC279,\n\t32849 - 11905: 0xC27A,\n\t32850 - 11905: 0xF1F8,\n\t32851 - 11905: 0xC27B,\n\t32852 - 11905: 0xC1AA,\n\t32853 - 11905: 0xC27C,\n\t32854 - 11905: 0xC27D,\n\t32855 - 11905: 0xC27E,\n\t32856 - 11905: 0xC6B8,\n\t32857 - 11905: 0xC280,\n\t32858 - 11905: 0xBEDB,\n\t32859 - 11905: 0xC281,\n\t32860 - 11905: 0xC282,\n\t32861 - 11905: 0xC283,\n\t32862 - 11905: 0xC284,\n\t32863 - 11905: 0xC285,\n\t32864 - 11905: 0xC286,\n\t32865 - 11905: 0xC287,\n\t32866 - 11905: 0xC288,\n\t32867 - 11905: 0xC289,\n\t32868 - 11905: 0xC28A,\n\t32869 - 11905: 0xC28B,\n\t32870 - 11905: 0xC28C,\n\t32871 - 11905: 0xC28D,\n\t32872 - 11905: 0xC28E,\n\t32873 - 11905: 0xF1F9,\n\t32874 - 11905: 0xB4CF,\n\t32875 - 11905: 0xC28F,\n\t32876 - 11905: 0xC290,\n\t32877 - 11905: 0xC291,\n\t32878 - 11905: 0xC292,\n\t32879 - 11905: 0xC293,\n\t32880 - 11905: 0xC294,\n\t32881 - 11905: 0xF1FA,\n\t32882 - 11905: 0xC295,\n\t32883 - 11905: 0xC296,\n\t32884 - 11905: 0xC297,\n\t32885 - 11905: 0xC298,\n\t32886 - 11905: 0xC299,\n\t32887 - 11905: 0xC29A,\n\t32888 - 11905: 0xC29B,\n\t32889 - 11905: 0xC29C,\n\t32890 - 11905: 0xC29D,\n\t32891 - 11905: 0xC29E,\n\t32892 - 11905: 0xC29F,\n\t32893 - 11905: 0xC2A0,\n\t32894 - 11905: 0xC340,\n\t32895 - 11905: 0xEDB2,\n\t32896 - 11905: 0xEDB1,\n\t32897 - 11905: 0xC341,\n\t32898 - 11905: 0xC342,\n\t32899 - 11905: 0xCBE0,\n\t32900 - 11905: 0xD2DE,\n\t32901 - 11905: 0xC343,\n\t32902 - 11905: 0xCBC1,\n\t32903 - 11905: 0xD5D8,\n\t32904 - 11905: 0xC344,\n\t32905 - 11905: 0xC8E2,\n\t32906 - 11905: 0xC345,\n\t32907 - 11905: 0xC0DF,\n\t32908 - 11905: 0xBCA1,\n\t32909 - 11905: 0xC346,\n\t32910 - 11905: 0xC347,\n\t32911 - 11905: 0xC348,\n\t32912 - 11905: 0xC349,\n\t32913 - 11905: 0xC34A,\n\t32914 - 11905: 0xC34B,\n\t32915 - 11905: 0xEBC1,\n\t32916 - 11905: 0xC34C,\n\t32917 - 11905: 0xC34D,\n\t32918 - 11905: 0xD0A4,\n\t32919 - 11905: 0xC34E,\n\t32920 - 11905: 0xD6E2,\n\t32921 - 11905: 0xC34F,\n\t32922 - 11905: 0xB6C7,\n\t32923 - 11905: 0xB8D8,\n\t32924 - 11905: 0xEBC0,\n\t32925 - 11905: 0xB8CE,\n\t32926 - 11905: 0xC350,\n\t32927 - 11905: 0xEBBF,\n\t32928 - 11905: 0xB3A6,\n\t32929 - 11905: 0xB9C9,\n\t32930 - 11905: 0xD6AB,\n\t32931 - 11905: 0xC351,\n\t32932 - 11905: 0xB7F4,\n\t32933 - 11905: 0xB7CA,\n\t32934 - 11905: 0xC352,\n\t32935 - 11905: 0xC353,\n\t32936 - 11905: 0xC354,\n\t32937 - 11905: 0xBCE7,\n\t32938 - 11905: 0xB7BE,\n\t32939 - 11905: 0xEBC6,\n\t32940 - 11905: 0xC355,\n\t32941 - 11905: 0xEBC7,\n\t32942 - 11905: 0xB0B9,\n\t32943 - 11905: 0xBFCF,\n\t32944 - 11905: 0xC356,\n\t32945 - 11905: 0xEBC5,\n\t32946 - 11905: 0xD3FD,\n\t32947 - 11905: 0xC357,\n\t32948 - 11905: 0xEBC8,\n\t32949 - 11905: 0xC358,\n\t32950 - 11905: 0xC359,\n\t32951 - 11905: 0xEBC9,\n\t32952 - 11905: 0xC35A,\n\t32953 - 11905: 0xC35B,\n\t32954 - 11905: 0xB7CE,\n\t32955 - 11905: 0xC35C,\n\t32956 - 11905: 0xEBC2,\n\t32957 - 11905: 0xEBC4,\n\t32958 - 11905: 0xC9F6,\n\t32959 - 11905: 0xD6D7,\n\t32960 - 11905: 0xD5CD,\n\t32961 - 11905: 0xD0B2,\n\t32962 - 11905: 0xEBCF,\n\t32963 - 11905: 0xCEB8,\n\t32964 - 11905: 0xEBD0,\n\t32965 - 11905: 0xC35D,\n\t32966 - 11905: 0xB5A8,\n\t32967 - 11905: 0xC35E,\n\t32968 - 11905: 0xC35F,\n\t32969 - 11905: 0xC360,\n\t32970 - 11905: 0xC361,\n\t32971 - 11905: 0xC362,\n\t32972 - 11905: 0xB1B3,\n\t32973 - 11905: 0xEBD2,\n\t32974 - 11905: 0xCCA5,\n\t32975 - 11905: 0xC363,\n\t32976 - 11905: 0xC364,\n\t32977 - 11905: 0xC365,\n\t32978 - 11905: 0xC366,\n\t32979 - 11905: 0xC367,\n\t32980 - 11905: 0xC368,\n\t32981 - 11905: 0xC369,\n\t32982 - 11905: 0xC5D6,\n\t32983 - 11905: 0xEBD3,\n\t32984 - 11905: 0xC36A,\n\t32985 - 11905: 0xEBD1,\n\t32986 - 11905: 0xC5DF,\n\t32987 - 11905: 0xEBCE,\n\t32988 - 11905: 0xCAA4,\n\t32989 - 11905: 0xEBD5,\n\t32990 - 11905: 0xB0FB,\n\t32991 - 11905: 0xC36B,\n\t32992 - 11905: 0xC36C,\n\t32993 - 11905: 0xBAFA,\n\t32994 - 11905: 0xC36D,\n\t32995 - 11905: 0xC36E,\n\t32996 - 11905: 0xD8B7,\n\t32997 - 11905: 0xF1E3,\n\t32998 - 11905: 0xC36F,\n\t32999 - 11905: 0xEBCA,\n\t33000 - 11905: 0xEBCB,\n\t33001 - 11905: 0xEBCC,\n\t33002 - 11905: 0xEBCD,\n\t33003 - 11905: 0xEBD6,\n\t33004 - 11905: 0xE6C0,\n\t33005 - 11905: 0xEBD9,\n\t33006 - 11905: 0xC370,\n\t33007 - 11905: 0xBFE8,\n\t33008 - 11905: 0xD2C8,\n\t33009 - 11905: 0xEBD7,\n\t33010 - 11905: 0xEBDC,\n\t33011 - 11905: 0xB8EC,\n\t33012 - 11905: 0xEBD8,\n\t33013 - 11905: 0xC371,\n\t33014 - 11905: 0xBDBA,\n\t33015 - 11905: 0xC372,\n\t33016 - 11905: 0xD0D8,\n\t33017 - 11905: 0xC373,\n\t33018 - 11905: 0xB0B7,\n\t33019 - 11905: 0xC374,\n\t33020 - 11905: 0xEBDD,\n\t33021 - 11905: 0xC4DC,\n\t33022 - 11905: 0xC375,\n\t33023 - 11905: 0xC376,\n\t33024 - 11905: 0xC377,\n\t33025 - 11905: 0xC378,\n\t33026 - 11905: 0xD6AC,\n\t33027 - 11905: 0xC379,\n\t33028 - 11905: 0xC37A,\n\t33029 - 11905: 0xC37B,\n\t33030 - 11905: 0xB4E0,\n\t33031 - 11905: 0xC37C,\n\t33032 - 11905: 0xC37D,\n\t33033 - 11905: 0xC2F6,\n\t33034 - 11905: 0xBCB9,\n\t33035 - 11905: 0xC37E,\n\t33036 - 11905: 0xC380,\n\t33037 - 11905: 0xEBDA,\n\t33038 - 11905: 0xEBDB,\n\t33039 - 11905: 0xD4E0,\n\t33040 - 11905: 0xC6EA,\n\t33041 - 11905: 0xC4D4,\n\t33042 - 11905: 0xEBDF,\n\t33043 - 11905: 0xC5A7,\n\t33044 - 11905: 0xD9F5,\n\t33045 - 11905: 0xC381,\n\t33046 - 11905: 0xB2B1,\n\t33047 - 11905: 0xC382,\n\t33048 - 11905: 0xEBE4,\n\t33049 - 11905: 0xC383,\n\t33050 - 11905: 0xBDC5,\n\t33051 - 11905: 0xC384,\n\t33052 - 11905: 0xC385,\n\t33053 - 11905: 0xC386,\n\t33054 - 11905: 0xEBE2,\n\t33055 - 11905: 0xC387,\n\t33056 - 11905: 0xC388,\n\t33057 - 11905: 0xC389,\n\t33058 - 11905: 0xC38A,\n\t33059 - 11905: 0xC38B,\n\t33060 - 11905: 0xC38C,\n\t33061 - 11905: 0xC38D,\n\t33062 - 11905: 0xC38E,\n\t33063 - 11905: 0xC38F,\n\t33064 - 11905: 0xC390,\n\t33065 - 11905: 0xC391,\n\t33066 - 11905: 0xC392,\n\t33067 - 11905: 0xC393,\n\t33068 - 11905: 0xEBE3,\n\t33069 - 11905: 0xC394,\n\t33070 - 11905: 0xC395,\n\t33071 - 11905: 0xB8AC,\n\t33072 - 11905: 0xC396,\n\t33073 - 11905: 0xCDD1,\n\t33074 - 11905: 0xEBE5,\n\t33075 - 11905: 0xC397,\n\t33076 - 11905: 0xC398,\n\t33077 - 11905: 0xC399,\n\t33078 - 11905: 0xEBE1,\n\t33079 - 11905: 0xC39A,\n\t33080 - 11905: 0xC1B3,\n\t33081 - 11905: 0xC39B,\n\t33082 - 11905: 0xC39C,\n\t33083 - 11905: 0xC39D,\n\t33084 - 11905: 0xC39E,\n\t33085 - 11905: 0xC39F,\n\t33086 - 11905: 0xC6A2,\n\t33087 - 11905: 0xC3A0,\n\t33088 - 11905: 0xC440,\n\t33089 - 11905: 0xC441,\n\t33090 - 11905: 0xC442,\n\t33091 - 11905: 0xC443,\n\t33092 - 11905: 0xC444,\n\t33093 - 11905: 0xC445,\n\t33094 - 11905: 0xCCF3,\n\t33095 - 11905: 0xC446,\n\t33096 - 11905: 0xEBE6,\n\t33097 - 11905: 0xC447,\n\t33098 - 11905: 0xC0B0,\n\t33099 - 11905: 0xD2B8,\n\t33100 - 11905: 0xEBE7,\n\t33101 - 11905: 0xC448,\n\t33102 - 11905: 0xC449,\n\t33103 - 11905: 0xC44A,\n\t33104 - 11905: 0xB8AF,\n\t33105 - 11905: 0xB8AD,\n\t33106 - 11905: 0xC44B,\n\t33107 - 11905: 0xEBE8,\n\t33108 - 11905: 0xC7BB,\n\t33109 - 11905: 0xCDF3,\n\t33110 - 11905: 0xC44C,\n\t33111 - 11905: 0xC44D,\n\t33112 - 11905: 0xC44E,\n\t33113 - 11905: 0xEBEA,\n\t33114 - 11905: 0xEBEB,\n\t33115 - 11905: 0xC44F,\n\t33116 - 11905: 0xC450,\n\t33117 - 11905: 0xC451,\n\t33118 - 11905: 0xC452,\n\t33119 - 11905: 0xC453,\n\t33120 - 11905: 0xEBED,\n\t33121 - 11905: 0xC454,\n\t33122 - 11905: 0xC455,\n\t33123 - 11905: 0xC456,\n\t33124 - 11905: 0xC457,\n\t33125 - 11905: 0xD0C8,\n\t33126 - 11905: 0xC458,\n\t33127 - 11905: 0xEBF2,\n\t33128 - 11905: 0xC459,\n\t33129 - 11905: 0xEBEE,\n\t33130 - 11905: 0xC45A,\n\t33131 - 11905: 0xC45B,\n\t33132 - 11905: 0xC45C,\n\t33133 - 11905: 0xEBF1,\n\t33134 - 11905: 0xC8F9,\n\t33135 - 11905: 0xC45D,\n\t33136 - 11905: 0xD1FC,\n\t33137 - 11905: 0xEBEC,\n\t33138 - 11905: 0xC45E,\n\t33139 - 11905: 0xC45F,\n\t33140 - 11905: 0xEBE9,\n\t33141 - 11905: 0xC460,\n\t33142 - 11905: 0xC461,\n\t33143 - 11905: 0xC462,\n\t33144 - 11905: 0xC463,\n\t33145 - 11905: 0xB8B9,\n\t33146 - 11905: 0xCFD9,\n\t33147 - 11905: 0xC4E5,\n\t33148 - 11905: 0xEBEF,\n\t33149 - 11905: 0xEBF0,\n\t33150 - 11905: 0xCCDA,\n\t33151 - 11905: 0xCDC8,\n\t33152 - 11905: 0xB0F2,\n\t33153 - 11905: 0xC464,\n\t33154 - 11905: 0xEBF6,\n\t33155 - 11905: 0xC465,\n\t33156 - 11905: 0xC466,\n\t33157 - 11905: 0xC467,\n\t33158 - 11905: 0xC468,\n\t33159 - 11905: 0xC469,\n\t33160 - 11905: 0xEBF5,\n\t33161 - 11905: 0xC46A,\n\t33162 - 11905: 0xB2B2,\n\t33163 - 11905: 0xC46B,\n\t33164 - 11905: 0xC46C,\n\t33165 - 11905: 0xC46D,\n\t33166 - 11905: 0xC46E,\n\t33167 - 11905: 0xB8E0,\n\t33168 - 11905: 0xC46F,\n\t33169 - 11905: 0xEBF7,\n\t33170 - 11905: 0xC470,\n\t33171 - 11905: 0xC471,\n\t33172 - 11905: 0xC472,\n\t33173 - 11905: 0xC473,\n\t33174 - 11905: 0xC474,\n\t33175 - 11905: 0xC475,\n\t33176 - 11905: 0xB1EC,\n\t33177 - 11905: 0xC476,\n\t33178 - 11905: 0xC477,\n\t33179 - 11905: 0xCCC5,\n\t33180 - 11905: 0xC4A4,\n\t33181 - 11905: 0xCFA5,\n\t33182 - 11905: 0xC478,\n\t33183 - 11905: 0xC479,\n\t33184 - 11905: 0xC47A,\n\t33185 - 11905: 0xC47B,\n\t33186 - 11905: 0xC47C,\n\t33187 - 11905: 0xEBF9,\n\t33188 - 11905: 0xC47D,\n\t33189 - 11905: 0xC47E,\n\t33190 - 11905: 0xECA2,\n\t33191 - 11905: 0xC480,\n\t33192 - 11905: 0xC5F2,\n\t33193 - 11905: 0xC481,\n\t33194 - 11905: 0xEBFA,\n\t33195 - 11905: 0xC482,\n\t33196 - 11905: 0xC483,\n\t33197 - 11905: 0xC484,\n\t33198 - 11905: 0xC485,\n\t33199 - 11905: 0xC486,\n\t33200 - 11905: 0xC487,\n\t33201 - 11905: 0xC488,\n\t33202 - 11905: 0xC489,\n\t33203 - 11905: 0xC9C5,\n\t33204 - 11905: 0xC48A,\n\t33205 - 11905: 0xC48B,\n\t33206 - 11905: 0xC48C,\n\t33207 - 11905: 0xC48D,\n\t33208 - 11905: 0xC48E,\n\t33209 - 11905: 0xC48F,\n\t33210 - 11905: 0xE2DF,\n\t33211 - 11905: 0xEBFE,\n\t33212 - 11905: 0xC490,\n\t33213 - 11905: 0xC491,\n\t33214 - 11905: 0xC492,\n\t33215 - 11905: 0xC493,\n\t33216 - 11905: 0xCDCE,\n\t33217 - 11905: 0xECA1,\n\t33218 - 11905: 0xB1DB,\n\t33219 - 11905: 0xD3B7,\n\t33220 - 11905: 0xC494,\n\t33221 - 11905: 0xC495,\n\t33222 - 11905: 0xD2DC,\n\t33223 - 11905: 0xC496,\n\t33224 - 11905: 0xC497,\n\t33225 - 11905: 0xC498,\n\t33226 - 11905: 0xEBFD,\n\t33227 - 11905: 0xC499,\n\t33228 - 11905: 0xEBFB,\n\t33229 - 11905: 0xC49A,\n\t33230 - 11905: 0xC49B,\n\t33231 - 11905: 0xC49C,\n\t33232 - 11905: 0xC49D,\n\t33233 - 11905: 0xC49E,\n\t33234 - 11905: 0xC49F,\n\t33235 - 11905: 0xC4A0,\n\t33236 - 11905: 0xC540,\n\t33237 - 11905: 0xC541,\n\t33238 - 11905: 0xC542,\n\t33239 - 11905: 0xC543,\n\t33240 - 11905: 0xC544,\n\t33241 - 11905: 0xC545,\n\t33242 - 11905: 0xC546,\n\t33243 - 11905: 0xC547,\n\t33244 - 11905: 0xC548,\n\t33245 - 11905: 0xC549,\n\t33246 - 11905: 0xC54A,\n\t33247 - 11905: 0xC54B,\n\t33248 - 11905: 0xC54C,\n\t33249 - 11905: 0xC54D,\n\t33250 - 11905: 0xC54E,\n\t33251 - 11905: 0xB3BC,\n\t33252 - 11905: 0xC54F,\n\t33253 - 11905: 0xC550,\n\t33254 - 11905: 0xC551,\n\t33255 - 11905: 0xEAB0,\n\t33256 - 11905: 0xC552,\n\t33257 - 11905: 0xC553,\n\t33258 - 11905: 0xD7D4,\n\t33259 - 11905: 0xC554,\n\t33260 - 11905: 0xF4AB,\n\t33261 - 11905: 0xB3F4,\n\t33262 - 11905: 0xC555,\n\t33263 - 11905: 0xC556,\n\t33264 - 11905: 0xC557,\n\t33265 - 11905: 0xC558,\n\t33266 - 11905: 0xC559,\n\t33267 - 11905: 0xD6C1,\n\t33268 - 11905: 0xD6C2,\n\t33269 - 11905: 0xC55A,\n\t33270 - 11905: 0xC55B,\n\t33271 - 11905: 0xC55C,\n\t33272 - 11905: 0xC55D,\n\t33273 - 11905: 0xC55E,\n\t33274 - 11905: 0xC55F,\n\t33275 - 11905: 0xD5E9,\n\t33276 - 11905: 0xBECA,\n\t33277 - 11905: 0xC560,\n\t33278 - 11905: 0xF4A7,\n\t33279 - 11905: 0xC561,\n\t33280 - 11905: 0xD2A8,\n\t33281 - 11905: 0xF4A8,\n\t33282 - 11905: 0xF4A9,\n\t33283 - 11905: 0xC562,\n\t33284 - 11905: 0xF4AA,\n\t33285 - 11905: 0xBECB,\n\t33286 - 11905: 0xD3DF,\n\t33287 - 11905: 0xC563,\n\t33288 - 11905: 0xC564,\n\t33289 - 11905: 0xC565,\n\t33290 - 11905: 0xC566,\n\t33291 - 11905: 0xC567,\n\t33292 - 11905: 0xC9E0,\n\t33293 - 11905: 0xC9E1,\n\t33294 - 11905: 0xC568,\n\t33295 - 11905: 0xC569,\n\t33296 - 11905: 0xF3C2,\n\t33297 - 11905: 0xC56A,\n\t33298 - 11905: 0xCAE6,\n\t33299 - 11905: 0xC56B,\n\t33300 - 11905: 0xCCF2,\n\t33301 - 11905: 0xC56C,\n\t33302 - 11905: 0xC56D,\n\t33303 - 11905: 0xC56E,\n\t33304 - 11905: 0xC56F,\n\t33305 - 11905: 0xC570,\n\t33306 - 11905: 0xC571,\n\t33307 - 11905: 0xE2B6,\n\t33308 - 11905: 0xCBB4,\n\t33309 - 11905: 0xC572,\n\t33310 - 11905: 0xCEE8,\n\t33311 - 11905: 0xD6DB,\n\t33312 - 11905: 0xC573,\n\t33313 - 11905: 0xF4AD,\n\t33314 - 11905: 0xF4AE,\n\t33315 - 11905: 0xF4AF,\n\t33316 - 11905: 0xC574,\n\t33317 - 11905: 0xC575,\n\t33318 - 11905: 0xC576,\n\t33319 - 11905: 0xC577,\n\t33320 - 11905: 0xF4B2,\n\t33321 - 11905: 0xC578,\n\t33322 - 11905: 0xBABD,\n\t33323 - 11905: 0xF4B3,\n\t33324 - 11905: 0xB0E3,\n\t33325 - 11905: 0xF4B0,\n\t33326 - 11905: 0xC579,\n\t33327 - 11905: 0xF4B1,\n\t33328 - 11905: 0xBDA2,\n\t33329 - 11905: 0xB2D5,\n\t33330 - 11905: 0xC57A,\n\t33331 - 11905: 0xF4B6,\n\t33332 - 11905: 0xF4B7,\n\t33333 - 11905: 0xB6E6,\n\t33334 - 11905: 0xB2B0,\n\t33335 - 11905: 0xCFCF,\n\t33336 - 11905: 0xF4B4,\n\t33337 - 11905: 0xB4AC,\n\t33338 - 11905: 0xC57B,\n\t33339 - 11905: 0xF4B5,\n\t33340 - 11905: 0xC57C,\n\t33341 - 11905: 0xC57D,\n\t33342 - 11905: 0xF4B8,\n\t33343 - 11905: 0xC57E,\n\t33344 - 11905: 0xC580,\n\t33345 - 11905: 0xC581,\n\t33346 - 11905: 0xC582,\n\t33347 - 11905: 0xC583,\n\t33348 - 11905: 0xF4B9,\n\t33349 - 11905: 0xC584,\n\t33350 - 11905: 0xC585,\n\t33351 - 11905: 0xCDA7,\n\t33352 - 11905: 0xC586,\n\t33353 - 11905: 0xF4BA,\n\t33354 - 11905: 0xC587,\n\t33355 - 11905: 0xF4BB,\n\t33356 - 11905: 0xC588,\n\t33357 - 11905: 0xC589,\n\t33358 - 11905: 0xC58A,\n\t33359 - 11905: 0xF4BC,\n\t33360 - 11905: 0xC58B,\n\t33361 - 11905: 0xC58C,\n\t33362 - 11905: 0xC58D,\n\t33363 - 11905: 0xC58E,\n\t33364 - 11905: 0xC58F,\n\t33365 - 11905: 0xC590,\n\t33366 - 11905: 0xC591,\n\t33367 - 11905: 0xC592,\n\t33368 - 11905: 0xCBD2,\n\t33369 - 11905: 0xC593,\n\t33370 - 11905: 0xF4BD,\n\t33371 - 11905: 0xC594,\n\t33372 - 11905: 0xC595,\n\t33373 - 11905: 0xC596,\n\t33374 - 11905: 0xC597,\n\t33375 - 11905: 0xF4BE,\n\t33376 - 11905: 0xC598,\n\t33377 - 11905: 0xC599,\n\t33378 - 11905: 0xC59A,\n\t33379 - 11905: 0xC59B,\n\t33380 - 11905: 0xC59C,\n\t33381 - 11905: 0xC59D,\n\t33382 - 11905: 0xC59E,\n\t33383 - 11905: 0xC59F,\n\t33384 - 11905: 0xF4BF,\n\t33385 - 11905: 0xC5A0,\n\t33386 - 11905: 0xC640,\n\t33387 - 11905: 0xC641,\n\t33388 - 11905: 0xC642,\n\t33389 - 11905: 0xC643,\n\t33390 - 11905: 0xF4DE,\n\t33391 - 11905: 0xC1BC,\n\t33392 - 11905: 0xBCE8,\n\t33393 - 11905: 0xC644,\n\t33394 - 11905: 0xC9AB,\n\t33395 - 11905: 0xD1DE,\n\t33396 - 11905: 0xE5F5,\n\t33397 - 11905: 0xC645,\n\t33398 - 11905: 0xC646,\n\t33399 - 11905: 0xC647,\n\t33400 - 11905: 0xC648,\n\t33401 - 11905: 0xDCB3,\n\t33402 - 11905: 0xD2D5,\n\t33403 - 11905: 0xC649,\n\t33404 - 11905: 0xC64A,\n\t33405 - 11905: 0xDCB4,\n\t33406 - 11905: 0xB0AC,\n\t33407 - 11905: 0xDCB5,\n\t33408 - 11905: 0xC64B,\n\t33409 - 11905: 0xC64C,\n\t33410 - 11905: 0xBDDA,\n\t33411 - 11905: 0xC64D,\n\t33412 - 11905: 0xDCB9,\n\t33413 - 11905: 0xC64E,\n\t33414 - 11905: 0xC64F,\n\t33415 - 11905: 0xC650,\n\t33416 - 11905: 0xD8C2,\n\t33417 - 11905: 0xC651,\n\t33418 - 11905: 0xDCB7,\n\t33419 - 11905: 0xD3F3,\n\t33420 - 11905: 0xC652,\n\t33421 - 11905: 0xC9D6,\n\t33422 - 11905: 0xDCBA,\n\t33423 - 11905: 0xDCB6,\n\t33424 - 11905: 0xC653,\n\t33425 - 11905: 0xDCBB,\n\t33426 - 11905: 0xC3A2,\n\t33427 - 11905: 0xC654,\n\t33428 - 11905: 0xC655,\n\t33429 - 11905: 0xC656,\n\t33430 - 11905: 0xC657,\n\t33431 - 11905: 0xDCBC,\n\t33432 - 11905: 0xDCC5,\n\t33433 - 11905: 0xDCBD,\n\t33434 - 11905: 0xC658,\n\t33435 - 11905: 0xC659,\n\t33436 - 11905: 0xCEDF,\n\t33437 - 11905: 0xD6A5,\n\t33438 - 11905: 0xC65A,\n\t33439 - 11905: 0xDCCF,\n\t33440 - 11905: 0xC65B,\n\t33441 - 11905: 0xDCCD,\n\t33442 - 11905: 0xC65C,\n\t33443 - 11905: 0xC65D,\n\t33444 - 11905: 0xDCD2,\n\t33445 - 11905: 0xBDE6,\n\t33446 - 11905: 0xC2AB,\n\t33447 - 11905: 0xC65E,\n\t33448 - 11905: 0xDCB8,\n\t33449 - 11905: 0xDCCB,\n\t33450 - 11905: 0xDCCE,\n\t33451 - 11905: 0xDCBE,\n\t33452 - 11905: 0xB7D2,\n\t33453 - 11905: 0xB0C5,\n\t33454 - 11905: 0xDCC7,\n\t33455 - 11905: 0xD0BE,\n\t33456 - 11905: 0xDCC1,\n\t33457 - 11905: 0xBBA8,\n\t33458 - 11905: 0xC65F,\n\t33459 - 11905: 0xB7BC,\n\t33460 - 11905: 0xDCCC,\n\t33461 - 11905: 0xC660,\n\t33462 - 11905: 0xC661,\n\t33463 - 11905: 0xDCC6,\n\t33464 - 11905: 0xDCBF,\n\t33465 - 11905: 0xC7DB,\n\t33466 - 11905: 0xC662,\n\t33467 - 11905: 0xC663,\n\t33468 - 11905: 0xC664,\n\t33469 - 11905: 0xD1BF,\n\t33470 - 11905: 0xDCC0,\n\t33471 - 11905: 0xC665,\n\t33472 - 11905: 0xC666,\n\t33473 - 11905: 0xDCCA,\n\t33474 - 11905: 0xC667,\n\t33475 - 11905: 0xC668,\n\t33476 - 11905: 0xDCD0,\n\t33477 - 11905: 0xC669,\n\t33478 - 11905: 0xC66A,\n\t33479 - 11905: 0xCEAD,\n\t33480 - 11905: 0xDCC2,\n\t33481 - 11905: 0xC66B,\n\t33482 - 11905: 0xDCC3,\n\t33483 - 11905: 0xDCC8,\n\t33484 - 11905: 0xDCC9,\n\t33485 - 11905: 0xB2D4,\n\t33486 - 11905: 0xDCD1,\n\t33487 - 11905: 0xCBD5,\n\t33488 - 11905: 0xC66C,\n\t33489 - 11905: 0xD4B7,\n\t33490 - 11905: 0xDCDB,\n\t33491 - 11905: 0xDCDF,\n\t33492 - 11905: 0xCCA6,\n\t33493 - 11905: 0xDCE6,\n\t33494 - 11905: 0xC66D,\n\t33495 - 11905: 0xC3E7,\n\t33496 - 11905: 0xDCDC,\n\t33497 - 11905: 0xC66E,\n\t33498 - 11905: 0xC66F,\n\t33499 - 11905: 0xBFC1,\n\t33500 - 11905: 0xDCD9,\n\t33501 - 11905: 0xC670,\n\t33502 - 11905: 0xB0FA,\n\t33503 - 11905: 0xB9B6,\n\t33504 - 11905: 0xDCE5,\n\t33505 - 11905: 0xDCD3,\n\t33506 - 11905: 0xC671,\n\t33507 - 11905: 0xDCC4,\n\t33508 - 11905: 0xDCD6,\n\t33509 - 11905: 0xC8F4,\n\t33510 - 11905: 0xBFE0,\n\t33511 - 11905: 0xC672,\n\t33512 - 11905: 0xC673,\n\t33513 - 11905: 0xC674,\n\t33514 - 11905: 0xC675,\n\t33515 - 11905: 0xC9BB,\n\t33516 - 11905: 0xC676,\n\t33517 - 11905: 0xC677,\n\t33518 - 11905: 0xC678,\n\t33519 - 11905: 0xB1BD,\n\t33520 - 11905: 0xC679,\n\t33521 - 11905: 0xD3A2,\n\t33522 - 11905: 0xC67A,\n\t33523 - 11905: 0xC67B,\n\t33524 - 11905: 0xDCDA,\n\t33525 - 11905: 0xC67C,\n\t33526 - 11905: 0xC67D,\n\t33527 - 11905: 0xDCD5,\n\t33528 - 11905: 0xC67E,\n\t33529 - 11905: 0xC6BB,\n\t33530 - 11905: 0xC680,\n\t33531 - 11905: 0xDCDE,\n\t33532 - 11905: 0xC681,\n\t33533 - 11905: 0xC682,\n\t33534 - 11905: 0xC683,\n\t33535 - 11905: 0xC684,\n\t33536 - 11905: 0xC685,\n\t33537 - 11905: 0xD7C2,\n\t33538 - 11905: 0xC3AF,\n\t33539 - 11905: 0xB7B6,\n\t33540 - 11905: 0xC7D1,\n\t33541 - 11905: 0xC3A9,\n\t33542 - 11905: 0xDCE2,\n\t33543 - 11905: 0xDCD8,\n\t33544 - 11905: 0xDCEB,\n\t33545 - 11905: 0xDCD4,\n\t33546 - 11905: 0xC686,\n\t33547 - 11905: 0xC687,\n\t33548 - 11905: 0xDCDD,\n\t33549 - 11905: 0xC688,\n\t33550 - 11905: 0xBEA5,\n\t33551 - 11905: 0xDCD7,\n\t33552 - 11905: 0xC689,\n\t33553 - 11905: 0xDCE0,\n\t33554 - 11905: 0xC68A,\n\t33555 - 11905: 0xC68B,\n\t33556 - 11905: 0xDCE3,\n\t33557 - 11905: 0xDCE4,\n\t33558 - 11905: 0xC68C,\n\t33559 - 11905: 0xDCF8,\n\t33560 - 11905: 0xC68D,\n\t33561 - 11905: 0xC68E,\n\t33562 - 11905: 0xDCE1,\n\t33563 - 11905: 0xDDA2,\n\t33564 - 11905: 0xDCE7,\n\t33565 - 11905: 0xC68F,\n\t33566 - 11905: 0xC690,\n\t33567 - 11905: 0xC691,\n\t33568 - 11905: 0xC692,\n\t33569 - 11905: 0xC693,\n\t33570 - 11905: 0xC694,\n\t33571 - 11905: 0xC695,\n\t33572 - 11905: 0xC696,\n\t33573 - 11905: 0xC697,\n\t33574 - 11905: 0xC698,\n\t33575 - 11905: 0xBCEB,\n\t33576 - 11905: 0xB4C4,\n\t33577 - 11905: 0xC699,\n\t33578 - 11905: 0xC69A,\n\t33579 - 11905: 0xC3A3,\n\t33580 - 11905: 0xB2E7,\n\t33581 - 11905: 0xDCFA,\n\t33582 - 11905: 0xC69B,\n\t33583 - 11905: 0xDCF2,\n\t33584 - 11905: 0xC69C,\n\t33585 - 11905: 0xDCEF,\n\t33586 - 11905: 0xC69D,\n\t33587 - 11905: 0xDCFC,\n\t33588 - 11905: 0xDCEE,\n\t33589 - 11905: 0xD2F0,\n\t33590 - 11905: 0xB2E8,\n\t33591 - 11905: 0xC69E,\n\t33592 - 11905: 0xC8D7,\n\t33593 - 11905: 0xC8E3,\n\t33594 - 11905: 0xDCFB,\n\t33595 - 11905: 0xC69F,\n\t33596 - 11905: 0xDCED,\n\t33597 - 11905: 0xC6A0,\n\t33598 - 11905: 0xC740,\n\t33599 - 11905: 0xC741,\n\t33600 - 11905: 0xDCF7,\n\t33601 - 11905: 0xC742,\n\t33602 - 11905: 0xC743,\n\t33603 - 11905: 0xDCF5,\n\t33604 - 11905: 0xC744,\n\t33605 - 11905: 0xC745,\n\t33606 - 11905: 0xBEA3,\n\t33607 - 11905: 0xDCF4,\n\t33608 - 11905: 0xC746,\n\t33609 - 11905: 0xB2DD,\n\t33610 - 11905: 0xC747,\n\t33611 - 11905: 0xC748,\n\t33612 - 11905: 0xC749,\n\t33613 - 11905: 0xC74A,\n\t33614 - 11905: 0xC74B,\n\t33615 - 11905: 0xDCF3,\n\t33616 - 11905: 0xBCF6,\n\t33617 - 11905: 0xDCE8,\n\t33618 - 11905: 0xBBC4,\n\t33619 - 11905: 0xC74C,\n\t33620 - 11905: 0xC0F3,\n\t33621 - 11905: 0xC74D,\n\t33622 - 11905: 0xC74E,\n\t33623 - 11905: 0xC74F,\n\t33624 - 11905: 0xC750,\n\t33625 - 11905: 0xC751,\n\t33626 - 11905: 0xBCD4,\n\t33627 - 11905: 0xDCE9,\n\t33628 - 11905: 0xDCEA,\n\t33629 - 11905: 0xC752,\n\t33630 - 11905: 0xDCF1,\n\t33631 - 11905: 0xDCF6,\n\t33632 - 11905: 0xDCF9,\n\t33633 - 11905: 0xB5B4,\n\t33634 - 11905: 0xC753,\n\t33635 - 11905: 0xC8D9,\n\t33636 - 11905: 0xBBE7,\n\t33637 - 11905: 0xDCFE,\n\t33638 - 11905: 0xDCFD,\n\t33639 - 11905: 0xD3AB,\n\t33640 - 11905: 0xDDA1,\n\t33641 - 11905: 0xDDA3,\n\t33642 - 11905: 0xDDA5,\n\t33643 - 11905: 0xD2F1,\n\t33644 - 11905: 0xDDA4,\n\t33645 - 11905: 0xDDA6,\n\t33646 - 11905: 0xDDA7,\n\t33647 - 11905: 0xD2A9,\n\t33648 - 11905: 0xC754,\n\t33649 - 11905: 0xC755,\n\t33650 - 11905: 0xC756,\n\t33651 - 11905: 0xC757,\n\t33652 - 11905: 0xC758,\n\t33653 - 11905: 0xC759,\n\t33654 - 11905: 0xC75A,\n\t33655 - 11905: 0xBAC9,\n\t33656 - 11905: 0xDDA9,\n\t33657 - 11905: 0xC75B,\n\t33658 - 11905: 0xC75C,\n\t33659 - 11905: 0xDDB6,\n\t33660 - 11905: 0xDDB1,\n\t33661 - 11905: 0xDDB4,\n\t33662 - 11905: 0xC75D,\n\t33663 - 11905: 0xC75E,\n\t33664 - 11905: 0xC75F,\n\t33665 - 11905: 0xC760,\n\t33666 - 11905: 0xC761,\n\t33667 - 11905: 0xC762,\n\t33668 - 11905: 0xC763,\n\t33669 - 11905: 0xDDB0,\n\t33670 - 11905: 0xC6CE,\n\t33671 - 11905: 0xC764,\n\t33672 - 11905: 0xC765,\n\t33673 - 11905: 0xC0F2,\n\t33674 - 11905: 0xC766,\n\t33675 - 11905: 0xC767,\n\t33676 - 11905: 0xC768,\n\t33677 - 11905: 0xC769,\n\t33678 - 11905: 0xC9AF,\n\t33679 - 11905: 0xC76A,\n\t33680 - 11905: 0xC76B,\n\t33681 - 11905: 0xC76C,\n\t33682 - 11905: 0xDCEC,\n\t33683 - 11905: 0xDDAE,\n\t33684 - 11905: 0xC76D,\n\t33685 - 11905: 0xC76E,\n\t33686 - 11905: 0xC76F,\n\t33687 - 11905: 0xC770,\n\t33688 - 11905: 0xDDB7,\n\t33689 - 11905: 0xC771,\n\t33690 - 11905: 0xC772,\n\t33691 - 11905: 0xDCF0,\n\t33692 - 11905: 0xDDAF,\n\t33693 - 11905: 0xC773,\n\t33694 - 11905: 0xDDB8,\n\t33695 - 11905: 0xC774,\n\t33696 - 11905: 0xDDAC,\n\t33697 - 11905: 0xC775,\n\t33698 - 11905: 0xC776,\n\t33699 - 11905: 0xC777,\n\t33700 - 11905: 0xC778,\n\t33701 - 11905: 0xC779,\n\t33702 - 11905: 0xC77A,\n\t33703 - 11905: 0xC77B,\n\t33704 - 11905: 0xDDB9,\n\t33705 - 11905: 0xDDB3,\n\t33706 - 11905: 0xDDAD,\n\t33707 - 11905: 0xC4AA,\n\t33708 - 11905: 0xC77C,\n\t33709 - 11905: 0xC77D,\n\t33710 - 11905: 0xC77E,\n\t33711 - 11905: 0xC780,\n\t33712 - 11905: 0xDDA8,\n\t33713 - 11905: 0xC0B3,\n\t33714 - 11905: 0xC1AB,\n\t33715 - 11905: 0xDDAA,\n\t33716 - 11905: 0xDDAB,\n\t33717 - 11905: 0xC781,\n\t33718 - 11905: 0xDDB2,\n\t33719 - 11905: 0xBBF1,\n\t33720 - 11905: 0xDDB5,\n\t33721 - 11905: 0xD3A8,\n\t33722 - 11905: 0xDDBA,\n\t33723 - 11905: 0xC782,\n\t33724 - 11905: 0xDDBB,\n\t33725 - 11905: 0xC3A7,\n\t33726 - 11905: 0xC783,\n\t33727 - 11905: 0xC784,\n\t33728 - 11905: 0xDDD2,\n\t33729 - 11905: 0xDDBC,\n\t33730 - 11905: 0xC785,\n\t33731 - 11905: 0xC786,\n\t33732 - 11905: 0xC787,\n\t33733 - 11905: 0xDDD1,\n\t33734 - 11905: 0xC788,\n\t33735 - 11905: 0xB9BD,\n\t33736 - 11905: 0xC789,\n\t33737 - 11905: 0xC78A,\n\t33738 - 11905: 0xBED5,\n\t33739 - 11905: 0xC78B,\n\t33740 - 11905: 0xBEFA,\n\t33741 - 11905: 0xC78C,\n\t33742 - 11905: 0xC78D,\n\t33743 - 11905: 0xBACA,\n\t33744 - 11905: 0xC78E,\n\t33745 - 11905: 0xC78F,\n\t33746 - 11905: 0xC790,\n\t33747 - 11905: 0xC791,\n\t33748 - 11905: 0xDDCA,\n\t33749 - 11905: 0xC792,\n\t33750 - 11905: 0xDDC5,\n\t33751 - 11905: 0xC793,\n\t33752 - 11905: 0xDDBF,\n\t33753 - 11905: 0xC794,\n\t33754 - 11905: 0xC795,\n\t33755 - 11905: 0xC796,\n\t33756 - 11905: 0xB2CB,\n\t33757 - 11905: 0xDDC3,\n\t33758 - 11905: 0xC797,\n\t33759 - 11905: 0xDDCB,\n\t33760 - 11905: 0xB2A4,\n\t33761 - 11905: 0xDDD5,\n\t33762 - 11905: 0xC798,\n\t33763 - 11905: 0xC799,\n\t33764 - 11905: 0xC79A,\n\t33765 - 11905: 0xDDBE,\n\t33766 - 11905: 0xC79B,\n\t33767 - 11905: 0xC79C,\n\t33768 - 11905: 0xC79D,\n\t33769 - 11905: 0xC6D0,\n\t33770 - 11905: 0xDDD0,\n\t33771 - 11905: 0xC79E,\n\t33772 - 11905: 0xC79F,\n\t33773 - 11905: 0xC7A0,\n\t33774 - 11905: 0xC840,\n\t33775 - 11905: 0xC841,\n\t33776 - 11905: 0xDDD4,\n\t33777 - 11905: 0xC1E2,\n\t33778 - 11905: 0xB7C6,\n\t33779 - 11905: 0xC842,\n\t33780 - 11905: 0xC843,\n\t33781 - 11905: 0xC844,\n\t33782 - 11905: 0xC845,\n\t33783 - 11905: 0xC846,\n\t33784 - 11905: 0xDDCE,\n\t33785 - 11905: 0xDDCF,\n\t33786 - 11905: 0xC847,\n\t33787 - 11905: 0xC848,\n\t33788 - 11905: 0xC849,\n\t33789 - 11905: 0xDDC4,\n\t33790 - 11905: 0xC84A,\n\t33791 - 11905: 0xC84B,\n\t33792 - 11905: 0xC84C,\n\t33793 - 11905: 0xDDBD,\n\t33794 - 11905: 0xC84D,\n\t33795 - 11905: 0xDDCD,\n\t33796 - 11905: 0xCCD1,\n\t33797 - 11905: 0xC84E,\n\t33798 - 11905: 0xDDC9,\n\t33799 - 11905: 0xC84F,\n\t33800 - 11905: 0xC850,\n\t33801 - 11905: 0xC851,\n\t33802 - 11905: 0xC852,\n\t33803 - 11905: 0xDDC2,\n\t33804 - 11905: 0xC3C8,\n\t33805 - 11905: 0xC6BC,\n\t33806 - 11905: 0xCEAE,\n\t33807 - 11905: 0xDDCC,\n\t33808 - 11905: 0xC853,\n\t33809 - 11905: 0xDDC8,\n\t33810 - 11905: 0xC854,\n\t33811 - 11905: 0xC855,\n\t33812 - 11905: 0xC856,\n\t33813 - 11905: 0xC857,\n\t33814 - 11905: 0xC858,\n\t33815 - 11905: 0xC859,\n\t33816 - 11905: 0xDDC1,\n\t33817 - 11905: 0xC85A,\n\t33818 - 11905: 0xC85B,\n\t33819 - 11905: 0xC85C,\n\t33820 - 11905: 0xDDC6,\n\t33821 - 11905: 0xC2DC,\n\t33822 - 11905: 0xC85D,\n\t33823 - 11905: 0xC85E,\n\t33824 - 11905: 0xC85F,\n\t33825 - 11905: 0xC860,\n\t33826 - 11905: 0xC861,\n\t33827 - 11905: 0xC862,\n\t33828 - 11905: 0xD3A9,\n\t33829 - 11905: 0xD3AA,\n\t33830 - 11905: 0xDDD3,\n\t33831 - 11905: 0xCFF4,\n\t33832 - 11905: 0xC8F8,\n\t33833 - 11905: 0xC863,\n\t33834 - 11905: 0xC864,\n\t33835 - 11905: 0xC865,\n\t33836 - 11905: 0xC866,\n\t33837 - 11905: 0xC867,\n\t33838 - 11905: 0xC868,\n\t33839 - 11905: 0xC869,\n\t33840 - 11905: 0xC86A,\n\t33841 - 11905: 0xDDE6,\n\t33842 - 11905: 0xC86B,\n\t33843 - 11905: 0xC86C,\n\t33844 - 11905: 0xC86D,\n\t33845 - 11905: 0xC86E,\n\t33846 - 11905: 0xC86F,\n\t33847 - 11905: 0xC870,\n\t33848 - 11905: 0xDDC7,\n\t33849 - 11905: 0xC871,\n\t33850 - 11905: 0xC872,\n\t33851 - 11905: 0xC873,\n\t33852 - 11905: 0xDDE0,\n\t33853 - 11905: 0xC2E4,\n\t33854 - 11905: 0xC874,\n\t33855 - 11905: 0xC875,\n\t33856 - 11905: 0xC876,\n\t33857 - 11905: 0xC877,\n\t33858 - 11905: 0xC878,\n\t33859 - 11905: 0xC879,\n\t33860 - 11905: 0xC87A,\n\t33861 - 11905: 0xC87B,\n\t33862 - 11905: 0xDDE1,\n\t33863 - 11905: 0xC87C,\n\t33864 - 11905: 0xC87D,\n\t33865 - 11905: 0xC87E,\n\t33866 - 11905: 0xC880,\n\t33867 - 11905: 0xC881,\n\t33868 - 11905: 0xC882,\n\t33869 - 11905: 0xC883,\n\t33870 - 11905: 0xC884,\n\t33871 - 11905: 0xC885,\n\t33872 - 11905: 0xC886,\n\t33873 - 11905: 0xDDD7,\n\t33874 - 11905: 0xC887,\n\t33875 - 11905: 0xC888,\n\t33876 - 11905: 0xC889,\n\t33877 - 11905: 0xC88A,\n\t33878 - 11905: 0xC88B,\n\t33879 - 11905: 0xD6F8,\n\t33880 - 11905: 0xC88C,\n\t33881 - 11905: 0xDDD9,\n\t33882 - 11905: 0xDDD8,\n\t33883 - 11905: 0xB8F0,\n\t33884 - 11905: 0xDDD6,\n\t33885 - 11905: 0xC88D,\n\t33886 - 11905: 0xC88E,\n\t33887 - 11905: 0xC88F,\n\t33888 - 11905: 0xC890,\n\t33889 - 11905: 0xC6CF,\n\t33890 - 11905: 0xC891,\n\t33891 - 11905: 0xB6AD,\n\t33892 - 11905: 0xC892,\n\t33893 - 11905: 0xC893,\n\t33894 - 11905: 0xC894,\n\t33895 - 11905: 0xC895,\n\t33896 - 11905: 0xC896,\n\t33897 - 11905: 0xDDE2,\n\t33898 - 11905: 0xC897,\n\t33899 - 11905: 0xBAF9,\n\t33900 - 11905: 0xD4E1,\n\t33901 - 11905: 0xDDE7,\n\t33902 - 11905: 0xC898,\n\t33903 - 11905: 0xC899,\n\t33904 - 11905: 0xC89A,\n\t33905 - 11905: 0xB4D0,\n\t33906 - 11905: 0xC89B,\n\t33907 - 11905: 0xDDDA,\n\t33908 - 11905: 0xC89C,\n\t33909 - 11905: 0xBFFB,\n\t33910 - 11905: 0xDDE3,\n\t33911 - 11905: 0xC89D,\n\t33912 - 11905: 0xDDDF,\n\t33913 - 11905: 0xC89E,\n\t33914 - 11905: 0xDDDD,\n\t33915 - 11905: 0xC89F,\n\t33916 - 11905: 0xC8A0,\n\t33917 - 11905: 0xC940,\n\t33918 - 11905: 0xC941,\n\t33919 - 11905: 0xC942,\n\t33920 - 11905: 0xC943,\n\t33921 - 11905: 0xC944,\n\t33922 - 11905: 0xB5D9,\n\t33923 - 11905: 0xC945,\n\t33924 - 11905: 0xC946,\n\t33925 - 11905: 0xC947,\n\t33926 - 11905: 0xC948,\n\t33927 - 11905: 0xDDDB,\n\t33928 - 11905: 0xDDDC,\n\t33929 - 11905: 0xDDDE,\n\t33930 - 11905: 0xC949,\n\t33931 - 11905: 0xBDAF,\n\t33932 - 11905: 0xDDE4,\n\t33933 - 11905: 0xC94A,\n\t33934 - 11905: 0xDDE5,\n\t33935 - 11905: 0xC94B,\n\t33936 - 11905: 0xC94C,\n\t33937 - 11905: 0xC94D,\n\t33938 - 11905: 0xC94E,\n\t33939 - 11905: 0xC94F,\n\t33940 - 11905: 0xC950,\n\t33941 - 11905: 0xC951,\n\t33942 - 11905: 0xC952,\n\t33943 - 11905: 0xDDF5,\n\t33944 - 11905: 0xC953,\n\t33945 - 11905: 0xC3C9,\n\t33946 - 11905: 0xC954,\n\t33947 - 11905: 0xC955,\n\t33948 - 11905: 0xCBE2,\n\t33949 - 11905: 0xC956,\n\t33950 - 11905: 0xC957,\n\t33951 - 11905: 0xC958,\n\t33952 - 11905: 0xC959,\n\t33953 - 11905: 0xDDF2,\n\t33954 - 11905: 0xC95A,\n\t33955 - 11905: 0xC95B,\n\t33956 - 11905: 0xC95C,\n\t33957 - 11905: 0xC95D,\n\t33958 - 11905: 0xC95E,\n\t33959 - 11905: 0xC95F,\n\t33960 - 11905: 0xC960,\n\t33961 - 11905: 0xC961,\n\t33962 - 11905: 0xC962,\n\t33963 - 11905: 0xC963,\n\t33964 - 11905: 0xC964,\n\t33965 - 11905: 0xC965,\n\t33966 - 11905: 0xC966,\n\t33967 - 11905: 0xD8E1,\n\t33968 - 11905: 0xC967,\n\t33969 - 11905: 0xC968,\n\t33970 - 11905: 0xC6D1,\n\t33971 - 11905: 0xC969,\n\t33972 - 11905: 0xDDF4,\n\t33973 - 11905: 0xC96A,\n\t33974 - 11905: 0xC96B,\n\t33975 - 11905: 0xC96C,\n\t33976 - 11905: 0xD5F4,\n\t33977 - 11905: 0xDDF3,\n\t33978 - 11905: 0xDDF0,\n\t33979 - 11905: 0xC96D,\n\t33980 - 11905: 0xC96E,\n\t33981 - 11905: 0xDDEC,\n\t33982 - 11905: 0xC96F,\n\t33983 - 11905: 0xDDEF,\n\t33984 - 11905: 0xC970,\n\t33985 - 11905: 0xDDE8,\n\t33986 - 11905: 0xC971,\n\t33987 - 11905: 0xC972,\n\t33988 - 11905: 0xD0EE,\n\t33989 - 11905: 0xC973,\n\t33990 - 11905: 0xC974,\n\t33991 - 11905: 0xC975,\n\t33992 - 11905: 0xC976,\n\t33993 - 11905: 0xC8D8,\n\t33994 - 11905: 0xDDEE,\n\t33995 - 11905: 0xC977,\n\t33996 - 11905: 0xC978,\n\t33997 - 11905: 0xDDE9,\n\t33998 - 11905: 0xC979,\n\t33999 - 11905: 0xC97A,\n\t34000 - 11905: 0xDDEA,\n\t34001 - 11905: 0xCBF2,\n\t34002 - 11905: 0xC97B,\n\t34003 - 11905: 0xDDED,\n\t34004 - 11905: 0xC97C,\n\t34005 - 11905: 0xC97D,\n\t34006 - 11905: 0xB1CD,\n\t34007 - 11905: 0xC97E,\n\t34008 - 11905: 0xC980,\n\t34009 - 11905: 0xC981,\n\t34010 - 11905: 0xC982,\n\t34011 - 11905: 0xC983,\n\t34012 - 11905: 0xC984,\n\t34013 - 11905: 0xC0B6,\n\t34014 - 11905: 0xC985,\n\t34015 - 11905: 0xBCBB,\n\t34016 - 11905: 0xDDF1,\n\t34017 - 11905: 0xC986,\n\t34018 - 11905: 0xC987,\n\t34019 - 11905: 0xDDF7,\n\t34020 - 11905: 0xC988,\n\t34021 - 11905: 0xDDF6,\n\t34022 - 11905: 0xDDEB,\n\t34023 - 11905: 0xC989,\n\t34024 - 11905: 0xC98A,\n\t34025 - 11905: 0xC98B,\n\t34026 - 11905: 0xC98C,\n\t34027 - 11905: 0xC98D,\n\t34028 - 11905: 0xC5EE,\n\t34029 - 11905: 0xC98E,\n\t34030 - 11905: 0xC98F,\n\t34031 - 11905: 0xC990,\n\t34032 - 11905: 0xDDFB,\n\t34033 - 11905: 0xC991,\n\t34034 - 11905: 0xC992,\n\t34035 - 11905: 0xC993,\n\t34036 - 11905: 0xC994,\n\t34037 - 11905: 0xC995,\n\t34038 - 11905: 0xC996,\n\t34039 - 11905: 0xC997,\n\t34040 - 11905: 0xC998,\n\t34041 - 11905: 0xC999,\n\t34042 - 11905: 0xC99A,\n\t34043 - 11905: 0xC99B,\n\t34044 - 11905: 0xDEA4,\n\t34045 - 11905: 0xC99C,\n\t34046 - 11905: 0xC99D,\n\t34047 - 11905: 0xDEA3,\n\t34048 - 11905: 0xC99E,\n\t34049 - 11905: 0xC99F,\n\t34050 - 11905: 0xC9A0,\n\t34051 - 11905: 0xCA40,\n\t34052 - 11905: 0xCA41,\n\t34053 - 11905: 0xCA42,\n\t34054 - 11905: 0xCA43,\n\t34055 - 11905: 0xCA44,\n\t34056 - 11905: 0xCA45,\n\t34057 - 11905: 0xCA46,\n\t34058 - 11905: 0xCA47,\n\t34059 - 11905: 0xCA48,\n\t34060 - 11905: 0xDDF8,\n\t34061 - 11905: 0xCA49,\n\t34062 - 11905: 0xCA4A,\n\t34063 - 11905: 0xCA4B,\n\t34064 - 11905: 0xCA4C,\n\t34065 - 11905: 0xC3EF,\n\t34066 - 11905: 0xCA4D,\n\t34067 - 11905: 0xC2FB,\n\t34068 - 11905: 0xCA4E,\n\t34069 - 11905: 0xCA4F,\n\t34070 - 11905: 0xCA50,\n\t34071 - 11905: 0xD5E1,\n\t34072 - 11905: 0xCA51,\n\t34073 - 11905: 0xCA52,\n\t34074 - 11905: 0xCEB5,\n\t34075 - 11905: 0xCA53,\n\t34076 - 11905: 0xCA54,\n\t34077 - 11905: 0xCA55,\n\t34078 - 11905: 0xCA56,\n\t34079 - 11905: 0xDDFD,\n\t34080 - 11905: 0xCA57,\n\t34081 - 11905: 0xB2CC,\n\t34082 - 11905: 0xCA58,\n\t34083 - 11905: 0xCA59,\n\t34084 - 11905: 0xCA5A,\n\t34085 - 11905: 0xCA5B,\n\t34086 - 11905: 0xCA5C,\n\t34087 - 11905: 0xCA5D,\n\t34088 - 11905: 0xCA5E,\n\t34089 - 11905: 0xCA5F,\n\t34090 - 11905: 0xCA60,\n\t34091 - 11905: 0xC4E8,\n\t34092 - 11905: 0xCADF,\n\t34093 - 11905: 0xCA61,\n\t34094 - 11905: 0xCA62,\n\t34095 - 11905: 0xCA63,\n\t34096 - 11905: 0xCA64,\n\t34097 - 11905: 0xCA65,\n\t34098 - 11905: 0xCA66,\n\t34099 - 11905: 0xCA67,\n\t34100 - 11905: 0xCA68,\n\t34101 - 11905: 0xCA69,\n\t34102 - 11905: 0xCA6A,\n\t34103 - 11905: 0xC7BE,\n\t34104 - 11905: 0xDDFA,\n\t34105 - 11905: 0xDDFC,\n\t34106 - 11905: 0xDDFE,\n\t34107 - 11905: 0xDEA2,\n\t34108 - 11905: 0xB0AA,\n\t34109 - 11905: 0xB1CE,\n\t34110 - 11905: 0xCA6B,\n\t34111 - 11905: 0xCA6C,\n\t34112 - 11905: 0xCA6D,\n\t34113 - 11905: 0xCA6E,\n\t34114 - 11905: 0xCA6F,\n\t34115 - 11905: 0xDEAC,\n\t34116 - 11905: 0xCA70,\n\t34117 - 11905: 0xCA71,\n\t34118 - 11905: 0xCA72,\n\t34119 - 11905: 0xCA73,\n\t34120 - 11905: 0xDEA6,\n\t34121 - 11905: 0xBDB6,\n\t34122 - 11905: 0xC8EF,\n\t34123 - 11905: 0xCA74,\n\t34124 - 11905: 0xCA75,\n\t34125 - 11905: 0xCA76,\n\t34126 - 11905: 0xCA77,\n\t34127 - 11905: 0xCA78,\n\t34128 - 11905: 0xCA79,\n\t34129 - 11905: 0xCA7A,\n\t34130 - 11905: 0xCA7B,\n\t34131 - 11905: 0xCA7C,\n\t34132 - 11905: 0xCA7D,\n\t34133 - 11905: 0xCA7E,\n\t34134 - 11905: 0xDEA1,\n\t34135 - 11905: 0xCA80,\n\t34136 - 11905: 0xCA81,\n\t34137 - 11905: 0xDEA5,\n\t34138 - 11905: 0xCA82,\n\t34139 - 11905: 0xCA83,\n\t34140 - 11905: 0xCA84,\n\t34141 - 11905: 0xCA85,\n\t34142 - 11905: 0xDEA9,\n\t34143 - 11905: 0xCA86,\n\t34144 - 11905: 0xCA87,\n\t34145 - 11905: 0xCA88,\n\t34146 - 11905: 0xCA89,\n\t34147 - 11905: 0xCA8A,\n\t34148 - 11905: 0xDEA8,\n\t34149 - 11905: 0xCA8B,\n\t34150 - 11905: 0xCA8C,\n\t34151 - 11905: 0xCA8D,\n\t34152 - 11905: 0xDEA7,\n\t34153 - 11905: 0xCA8E,\n\t34154 - 11905: 0xCA8F,\n\t34155 - 11905: 0xCA90,\n\t34156 - 11905: 0xCA91,\n\t34157 - 11905: 0xCA92,\n\t34158 - 11905: 0xCA93,\n\t34159 - 11905: 0xCA94,\n\t34160 - 11905: 0xCA95,\n\t34161 - 11905: 0xCA96,\n\t34162 - 11905: 0xDEAD,\n\t34163 - 11905: 0xCA97,\n\t34164 - 11905: 0xD4CC,\n\t34165 - 11905: 0xCA98,\n\t34166 - 11905: 0xCA99,\n\t34167 - 11905: 0xCA9A,\n\t34168 - 11905: 0xCA9B,\n\t34169 - 11905: 0xDEB3,\n\t34170 - 11905: 0xDEAA,\n\t34171 - 11905: 0xDEAE,\n\t34172 - 11905: 0xCA9C,\n\t34173 - 11905: 0xCA9D,\n\t34174 - 11905: 0xC0D9,\n\t34175 - 11905: 0xCA9E,\n\t34176 - 11905: 0xCA9F,\n\t34177 - 11905: 0xCAA0,\n\t34178 - 11905: 0xCB40,\n\t34179 - 11905: 0xCB41,\n\t34180 - 11905: 0xB1A1,\n\t34181 - 11905: 0xDEB6,\n\t34182 - 11905: 0xCB42,\n\t34183 - 11905: 0xDEB1,\n\t34184 - 11905: 0xCB43,\n\t34185 - 11905: 0xCB44,\n\t34186 - 11905: 0xCB45,\n\t34187 - 11905: 0xCB46,\n\t34188 - 11905: 0xCB47,\n\t34189 - 11905: 0xCB48,\n\t34190 - 11905: 0xCB49,\n\t34191 - 11905: 0xDEB2,\n\t34192 - 11905: 0xCB4A,\n\t34193 - 11905: 0xCB4B,\n\t34194 - 11905: 0xCB4C,\n\t34195 - 11905: 0xCB4D,\n\t34196 - 11905: 0xCB4E,\n\t34197 - 11905: 0xCB4F,\n\t34198 - 11905: 0xCB50,\n\t34199 - 11905: 0xCB51,\n\t34200 - 11905: 0xCB52,\n\t34201 - 11905: 0xCB53,\n\t34202 - 11905: 0xCB54,\n\t34203 - 11905: 0xD1A6,\n\t34204 - 11905: 0xDEB5,\n\t34205 - 11905: 0xCB55,\n\t34206 - 11905: 0xCB56,\n\t34207 - 11905: 0xCB57,\n\t34208 - 11905: 0xCB58,\n\t34209 - 11905: 0xCB59,\n\t34210 - 11905: 0xCB5A,\n\t34211 - 11905: 0xCB5B,\n\t34212 - 11905: 0xDEAF,\n\t34213 - 11905: 0xCB5C,\n\t34214 - 11905: 0xCB5D,\n\t34215 - 11905: 0xCB5E,\n\t34216 - 11905: 0xDEB0,\n\t34217 - 11905: 0xCB5F,\n\t34218 - 11905: 0xD0BD,\n\t34219 - 11905: 0xCB60,\n\t34220 - 11905: 0xCB61,\n\t34221 - 11905: 0xCB62,\n\t34222 - 11905: 0xDEB4,\n\t34223 - 11905: 0xCAED,\n\t34224 - 11905: 0xDEB9,\n\t34225 - 11905: 0xCB63,\n\t34226 - 11905: 0xCB64,\n\t34227 - 11905: 0xCB65,\n\t34228 - 11905: 0xCB66,\n\t34229 - 11905: 0xCB67,\n\t34230 - 11905: 0xCB68,\n\t34231 - 11905: 0xDEB8,\n\t34232 - 11905: 0xCB69,\n\t34233 - 11905: 0xDEB7,\n\t34234 - 11905: 0xCB6A,\n\t34235 - 11905: 0xCB6B,\n\t34236 - 11905: 0xCB6C,\n\t34237 - 11905: 0xCB6D,\n\t34238 - 11905: 0xCB6E,\n\t34239 - 11905: 0xCB6F,\n\t34240 - 11905: 0xCB70,\n\t34241 - 11905: 0xDEBB,\n\t34242 - 11905: 0xCB71,\n\t34243 - 11905: 0xCB72,\n\t34244 - 11905: 0xCB73,\n\t34245 - 11905: 0xCB74,\n\t34246 - 11905: 0xCB75,\n\t34247 - 11905: 0xCB76,\n\t34248 - 11905: 0xCB77,\n\t34249 - 11905: 0xBDE5,\n\t34250 - 11905: 0xCB78,\n\t34251 - 11905: 0xCB79,\n\t34252 - 11905: 0xCB7A,\n\t34253 - 11905: 0xCB7B,\n\t34254 - 11905: 0xCB7C,\n\t34255 - 11905: 0xB2D8,\n\t34256 - 11905: 0xC3EA,\n\t34257 - 11905: 0xCB7D,\n\t34258 - 11905: 0xCB7E,\n\t34259 - 11905: 0xDEBA,\n\t34260 - 11905: 0xCB80,\n\t34261 - 11905: 0xC5BA,\n\t34262 - 11905: 0xCB81,\n\t34263 - 11905: 0xCB82,\n\t34264 - 11905: 0xCB83,\n\t34265 - 11905: 0xCB84,\n\t34266 - 11905: 0xCB85,\n\t34267 - 11905: 0xCB86,\n\t34268 - 11905: 0xDEBC,\n\t34269 - 11905: 0xCB87,\n\t34270 - 11905: 0xCB88,\n\t34271 - 11905: 0xCB89,\n\t34272 - 11905: 0xCB8A,\n\t34273 - 11905: 0xCB8B,\n\t34274 - 11905: 0xCB8C,\n\t34275 - 11905: 0xCB8D,\n\t34276 - 11905: 0xCCD9,\n\t34277 - 11905: 0xCB8E,\n\t34278 - 11905: 0xCB8F,\n\t34279 - 11905: 0xCB90,\n\t34280 - 11905: 0xCB91,\n\t34281 - 11905: 0xB7AA,\n\t34282 - 11905: 0xCB92,\n\t34283 - 11905: 0xCB93,\n\t34284 - 11905: 0xCB94,\n\t34285 - 11905: 0xCB95,\n\t34286 - 11905: 0xCB96,\n\t34287 - 11905: 0xCB97,\n\t34288 - 11905: 0xCB98,\n\t34289 - 11905: 0xCB99,\n\t34290 - 11905: 0xCB9A,\n\t34291 - 11905: 0xCB9B,\n\t34292 - 11905: 0xCB9C,\n\t34293 - 11905: 0xCB9D,\n\t34294 - 11905: 0xCB9E,\n\t34295 - 11905: 0xCB9F,\n\t34296 - 11905: 0xCBA0,\n\t34297 - 11905: 0xCC40,\n\t34298 - 11905: 0xCC41,\n\t34299 - 11905: 0xD4E5,\n\t34300 - 11905: 0xCC42,\n\t34301 - 11905: 0xCC43,\n\t34302 - 11905: 0xCC44,\n\t34303 - 11905: 0xDEBD,\n\t34304 - 11905: 0xCC45,\n\t34305 - 11905: 0xCC46,\n\t34306 - 11905: 0xCC47,\n\t34307 - 11905: 0xCC48,\n\t34308 - 11905: 0xCC49,\n\t34309 - 11905: 0xDEBF,\n\t34310 - 11905: 0xCC4A,\n\t34311 - 11905: 0xCC4B,\n\t34312 - 11905: 0xCC4C,\n\t34313 - 11905: 0xCC4D,\n\t34314 - 11905: 0xCC4E,\n\t34315 - 11905: 0xCC4F,\n\t34316 - 11905: 0xCC50,\n\t34317 - 11905: 0xCC51,\n\t34318 - 11905: 0xCC52,\n\t34319 - 11905: 0xCC53,\n\t34320 - 11905: 0xCC54,\n\t34321 - 11905: 0xC4A2,\n\t34322 - 11905: 0xCC55,\n\t34323 - 11905: 0xCC56,\n\t34324 - 11905: 0xCC57,\n\t34325 - 11905: 0xCC58,\n\t34326 - 11905: 0xDEC1,\n\t34327 - 11905: 0xCC59,\n\t34328 - 11905: 0xCC5A,\n\t34329 - 11905: 0xCC5B,\n\t34330 - 11905: 0xCC5C,\n\t34331 - 11905: 0xCC5D,\n\t34332 - 11905: 0xCC5E,\n\t34333 - 11905: 0xCC5F,\n\t34334 - 11905: 0xCC60,\n\t34335 - 11905: 0xCC61,\n\t34336 - 11905: 0xCC62,\n\t34337 - 11905: 0xCC63,\n\t34338 - 11905: 0xCC64,\n\t34339 - 11905: 0xCC65,\n\t34340 - 11905: 0xCC66,\n\t34341 - 11905: 0xCC67,\n\t34342 - 11905: 0xCC68,\n\t34343 - 11905: 0xDEBE,\n\t34344 - 11905: 0xCC69,\n\t34345 - 11905: 0xDEC0,\n\t34346 - 11905: 0xCC6A,\n\t34347 - 11905: 0xCC6B,\n\t34348 - 11905: 0xCC6C,\n\t34349 - 11905: 0xCC6D,\n\t34350 - 11905: 0xCC6E,\n\t34351 - 11905: 0xCC6F,\n\t34352 - 11905: 0xCC70,\n\t34353 - 11905: 0xCC71,\n\t34354 - 11905: 0xCC72,\n\t34355 - 11905: 0xCC73,\n\t34356 - 11905: 0xCC74,\n\t34357 - 11905: 0xCC75,\n\t34358 - 11905: 0xCC76,\n\t34359 - 11905: 0xCC77,\n\t34360 - 11905: 0xD5BA,\n\t34361 - 11905: 0xCC78,\n\t34362 - 11905: 0xCC79,\n\t34363 - 11905: 0xCC7A,\n\t34364 - 11905: 0xDEC2,\n\t34365 - 11905: 0xCC7B,\n\t34366 - 11905: 0xCC7C,\n\t34367 - 11905: 0xCC7D,\n\t34368 - 11905: 0xCC7E,\n\t34369 - 11905: 0xCC80,\n\t34370 - 11905: 0xCC81,\n\t34371 - 11905: 0xCC82,\n\t34372 - 11905: 0xCC83,\n\t34373 - 11905: 0xCC84,\n\t34374 - 11905: 0xCC85,\n\t34375 - 11905: 0xCC86,\n\t34376 - 11905: 0xCC87,\n\t34377 - 11905: 0xCC88,\n\t34378 - 11905: 0xCC89,\n\t34379 - 11905: 0xCC8A,\n\t34380 - 11905: 0xCC8B,\n\t34381 - 11905: 0xF2AE,\n\t34382 - 11905: 0xBBA2,\n\t34383 - 11905: 0xC2B2,\n\t34384 - 11905: 0xC5B0,\n\t34385 - 11905: 0xC2C7,\n\t34386 - 11905: 0xCC8C,\n\t34387 - 11905: 0xCC8D,\n\t34388 - 11905: 0xF2AF,\n\t34389 - 11905: 0xCC8E,\n\t34390 - 11905: 0xCC8F,\n\t34391 - 11905: 0xCC90,\n\t34392 - 11905: 0xCC91,\n\t34393 - 11905: 0xCC92,\n\t34394 - 11905: 0xD0E9,\n\t34395 - 11905: 0xCC93,\n\t34396 - 11905: 0xCC94,\n\t34397 - 11905: 0xCC95,\n\t34398 - 11905: 0xD3DD,\n\t34399 - 11905: 0xCC96,\n\t34400 - 11905: 0xCC97,\n\t34401 - 11905: 0xCC98,\n\t34402 - 11905: 0xEBBD,\n\t34403 - 11905: 0xCC99,\n\t34404 - 11905: 0xCC9A,\n\t34405 - 11905: 0xCC9B,\n\t34406 - 11905: 0xCC9C,\n\t34407 - 11905: 0xCC9D,\n\t34408 - 11905: 0xCC9E,\n\t34409 - 11905: 0xCC9F,\n\t34410 - 11905: 0xCCA0,\n\t34411 - 11905: 0xB3E6,\n\t34412 - 11905: 0xF2B0,\n\t34413 - 11905: 0xCD40,\n\t34414 - 11905: 0xF2B1,\n\t34415 - 11905: 0xCD41,\n\t34416 - 11905: 0xCD42,\n\t34417 - 11905: 0xCAAD,\n\t34418 - 11905: 0xCD43,\n\t34419 - 11905: 0xCD44,\n\t34420 - 11905: 0xCD45,\n\t34421 - 11905: 0xCD46,\n\t34422 - 11905: 0xCD47,\n\t34423 - 11905: 0xCD48,\n\t34424 - 11905: 0xCD49,\n\t34425 - 11905: 0xBAE7,\n\t34426 - 11905: 0xF2B3,\n\t34427 - 11905: 0xF2B5,\n\t34428 - 11905: 0xF2B4,\n\t34429 - 11905: 0xCBE4,\n\t34430 - 11905: 0xCFBA,\n\t34431 - 11905: 0xF2B2,\n\t34432 - 11905: 0xCAB4,\n\t34433 - 11905: 0xD2CF,\n\t34434 - 11905: 0xC2EC,\n\t34435 - 11905: 0xCD4A,\n\t34436 - 11905: 0xCD4B,\n\t34437 - 11905: 0xCD4C,\n\t34438 - 11905: 0xCD4D,\n\t34439 - 11905: 0xCD4E,\n\t34440 - 11905: 0xCD4F,\n\t34441 - 11905: 0xCD50,\n\t34442 - 11905: 0xCEC3,\n\t34443 - 11905: 0xF2B8,\n\t34444 - 11905: 0xB0F6,\n\t34445 - 11905: 0xF2B7,\n\t34446 - 11905: 0xCD51,\n\t34447 - 11905: 0xCD52,\n\t34448 - 11905: 0xCD53,\n\t34449 - 11905: 0xCD54,\n\t34450 - 11905: 0xCD55,\n\t34451 - 11905: 0xF2BE,\n\t34452 - 11905: 0xCD56,\n\t34453 - 11905: 0xB2CF,\n\t34454 - 11905: 0xCD57,\n\t34455 - 11905: 0xCD58,\n\t34456 - 11905: 0xCD59,\n\t34457 - 11905: 0xCD5A,\n\t34458 - 11905: 0xCD5B,\n\t34459 - 11905: 0xCD5C,\n\t34460 - 11905: 0xD1C1,\n\t34461 - 11905: 0xF2BA,\n\t34462 - 11905: 0xCD5D,\n\t34463 - 11905: 0xCD5E,\n\t34464 - 11905: 0xCD5F,\n\t34465 - 11905: 0xCD60,\n\t34466 - 11905: 0xCD61,\n\t34467 - 11905: 0xF2BC,\n\t34468 - 11905: 0xD4E9,\n\t34469 - 11905: 0xCD62,\n\t34470 - 11905: 0xCD63,\n\t34471 - 11905: 0xF2BB,\n\t34472 - 11905: 0xF2B6,\n\t34473 - 11905: 0xF2BF,\n\t34474 - 11905: 0xF2BD,\n\t34475 - 11905: 0xCD64,\n\t34476 - 11905: 0xF2B9,\n\t34477 - 11905: 0xCD65,\n\t34478 - 11905: 0xCD66,\n\t34479 - 11905: 0xF2C7,\n\t34480 - 11905: 0xF2C4,\n\t34481 - 11905: 0xF2C6,\n\t34482 - 11905: 0xCD67,\n\t34483 - 11905: 0xCD68,\n\t34484 - 11905: 0xF2CA,\n\t34485 - 11905: 0xF2C2,\n\t34486 - 11905: 0xF2C0,\n\t34487 - 11905: 0xCD69,\n\t34488 - 11905: 0xCD6A,\n\t34489 - 11905: 0xCD6B,\n\t34490 - 11905: 0xF2C5,\n\t34491 - 11905: 0xCD6C,\n\t34492 - 11905: 0xCD6D,\n\t34493 - 11905: 0xCD6E,\n\t34494 - 11905: 0xCD6F,\n\t34495 - 11905: 0xCD70,\n\t34496 - 11905: 0xD6FB,\n\t34497 - 11905: 0xCD71,\n\t34498 - 11905: 0xCD72,\n\t34499 - 11905: 0xCD73,\n\t34500 - 11905: 0xF2C1,\n\t34501 - 11905: 0xCD74,\n\t34502 - 11905: 0xC7F9,\n\t34503 - 11905: 0xC9DF,\n\t34504 - 11905: 0xCD75,\n\t34505 - 11905: 0xF2C8,\n\t34506 - 11905: 0xB9C6,\n\t34507 - 11905: 0xB5B0,\n\t34508 - 11905: 0xCD76,\n\t34509 - 11905: 0xCD77,\n\t34510 - 11905: 0xF2C3,\n\t34511 - 11905: 0xF2C9,\n\t34512 - 11905: 0xF2D0,\n\t34513 - 11905: 0xF2D6,\n\t34514 - 11905: 0xCD78,\n\t34515 - 11905: 0xCD79,\n\t34516 - 11905: 0xBBD7,\n\t34517 - 11905: 0xCD7A,\n\t34518 - 11905: 0xCD7B,\n\t34519 - 11905: 0xCD7C,\n\t34520 - 11905: 0xF2D5,\n\t34521 - 11905: 0xCDDC,\n\t34522 - 11905: 0xCD7D,\n\t34523 - 11905: 0xD6EB,\n\t34524 - 11905: 0xCD7E,\n\t34525 - 11905: 0xCD80,\n\t34526 - 11905: 0xF2D2,\n\t34527 - 11905: 0xF2D4,\n\t34528 - 11905: 0xCD81,\n\t34529 - 11905: 0xCD82,\n\t34530 - 11905: 0xCD83,\n\t34531 - 11905: 0xCD84,\n\t34532 - 11905: 0xB8F2,\n\t34533 - 11905: 0xCD85,\n\t34534 - 11905: 0xCD86,\n\t34535 - 11905: 0xCD87,\n\t34536 - 11905: 0xCD88,\n\t34537 - 11905: 0xF2CB,\n\t34538 - 11905: 0xCD89,\n\t34539 - 11905: 0xCD8A,\n\t34540 - 11905: 0xCD8B,\n\t34541 - 11905: 0xF2CE,\n\t34542 - 11905: 0xC2F9,\n\t34543 - 11905: 0xCD8C,\n\t34544 - 11905: 0xD5DD,\n\t34545 - 11905: 0xF2CC,\n\t34546 - 11905: 0xF2CD,\n\t34547 - 11905: 0xF2CF,\n\t34548 - 11905: 0xF2D3,\n\t34549 - 11905: 0xCD8D,\n\t34550 - 11905: 0xCD8E,\n\t34551 - 11905: 0xCD8F,\n\t34552 - 11905: 0xF2D9,\n\t34553 - 11905: 0xD3BC,\n\t34554 - 11905: 0xCD90,\n\t34555 - 11905: 0xCD91,\n\t34556 - 11905: 0xCD92,\n\t34557 - 11905: 0xCD93,\n\t34558 - 11905: 0xB6EA,\n\t34559 - 11905: 0xCD94,\n\t34560 - 11905: 0xCAF1,\n\t34561 - 11905: 0xCD95,\n\t34562 - 11905: 0xB7E4,\n\t34563 - 11905: 0xF2D7,\n\t34564 - 11905: 0xCD96,\n\t34565 - 11905: 0xCD97,\n\t34566 - 11905: 0xCD98,\n\t34567 - 11905: 0xF2D8,\n\t34568 - 11905: 0xF2DA,\n\t34569 - 11905: 0xF2DD,\n\t34570 - 11905: 0xF2DB,\n\t34571 - 11905: 0xCD99,\n\t34572 - 11905: 0xCD9A,\n\t34573 - 11905: 0xF2DC,\n\t34574 - 11905: 0xCD9B,\n\t34575 - 11905: 0xCD9C,\n\t34576 - 11905: 0xCD9D,\n\t34577 - 11905: 0xCD9E,\n\t34578 - 11905: 0xD1D1,\n\t34579 - 11905: 0xF2D1,\n\t34580 - 11905: 0xCD9F,\n\t34581 - 11905: 0xCDC9,\n\t34582 - 11905: 0xCDA0,\n\t34583 - 11905: 0xCECF,\n\t34584 - 11905: 0xD6A9,\n\t34585 - 11905: 0xCE40,\n\t34586 - 11905: 0xF2E3,\n\t34587 - 11905: 0xCE41,\n\t34588 - 11905: 0xC3DB,\n\t34589 - 11905: 0xCE42,\n\t34590 - 11905: 0xF2E0,\n\t34591 - 11905: 0xCE43,\n\t34592 - 11905: 0xCE44,\n\t34593 - 11905: 0xC0AF,\n\t34594 - 11905: 0xF2EC,\n\t34595 - 11905: 0xF2DE,\n\t34596 - 11905: 0xCE45,\n\t34597 - 11905: 0xF2E1,\n\t34598 - 11905: 0xCE46,\n\t34599 - 11905: 0xCE47,\n\t34600 - 11905: 0xCE48,\n\t34601 - 11905: 0xF2E8,\n\t34602 - 11905: 0xCE49,\n\t34603 - 11905: 0xCE4A,\n\t34604 - 11905: 0xCE4B,\n\t34605 - 11905: 0xCE4C,\n\t34606 - 11905: 0xF2E2,\n\t34607 - 11905: 0xCE4D,\n\t34608 - 11905: 0xCE4E,\n\t34609 - 11905: 0xF2E7,\n\t34610 - 11905: 0xCE4F,\n\t34611 - 11905: 0xCE50,\n\t34612 - 11905: 0xF2E6,\n\t34613 - 11905: 0xCE51,\n\t34614 - 11905: 0xCE52,\n\t34615 - 11905: 0xF2E9,\n\t34616 - 11905: 0xCE53,\n\t34617 - 11905: 0xCE54,\n\t34618 - 11905: 0xCE55,\n\t34619 - 11905: 0xF2DF,\n\t34620 - 11905: 0xCE56,\n\t34621 - 11905: 0xCE57,\n\t34622 - 11905: 0xF2E4,\n\t34623 - 11905: 0xF2EA,\n\t34624 - 11905: 0xCE58,\n\t34625 - 11905: 0xCE59,\n\t34626 - 11905: 0xCE5A,\n\t34627 - 11905: 0xCE5B,\n\t34628 - 11905: 0xCE5C,\n\t34629 - 11905: 0xCE5D,\n\t34630 - 11905: 0xCE5E,\n\t34631 - 11905: 0xD3AC,\n\t34632 - 11905: 0xF2E5,\n\t34633 - 11905: 0xB2F5,\n\t34634 - 11905: 0xCE5F,\n\t34635 - 11905: 0xCE60,\n\t34636 - 11905: 0xF2F2,\n\t34637 - 11905: 0xCE61,\n\t34638 - 11905: 0xD0AB,\n\t34639 - 11905: 0xCE62,\n\t34640 - 11905: 0xCE63,\n\t34641 - 11905: 0xCE64,\n\t34642 - 11905: 0xCE65,\n\t34643 - 11905: 0xF2F5,\n\t34644 - 11905: 0xCE66,\n\t34645 - 11905: 0xCE67,\n\t34646 - 11905: 0xCE68,\n\t34647 - 11905: 0xBBC8,\n\t34648 - 11905: 0xCE69,\n\t34649 - 11905: 0xF2F9,\n\t34650 - 11905: 0xCE6A,\n\t34651 - 11905: 0xCE6B,\n\t34652 - 11905: 0xCE6C,\n\t34653 - 11905: 0xCE6D,\n\t34654 - 11905: 0xCE6E,\n\t34655 - 11905: 0xCE6F,\n\t34656 - 11905: 0xF2F0,\n\t34657 - 11905: 0xCE70,\n\t34658 - 11905: 0xCE71,\n\t34659 - 11905: 0xF2F6,\n\t34660 - 11905: 0xF2F8,\n\t34661 - 11905: 0xF2FA,\n\t34662 - 11905: 0xCE72,\n\t34663 - 11905: 0xCE73,\n\t34664 - 11905: 0xCE74,\n\t34665 - 11905: 0xCE75,\n\t34666 - 11905: 0xCE76,\n\t34667 - 11905: 0xCE77,\n\t34668 - 11905: 0xCE78,\n\t34669 - 11905: 0xCE79,\n\t34670 - 11905: 0xF2F3,\n\t34671 - 11905: 0xCE7A,\n\t34672 - 11905: 0xF2F1,\n\t34673 - 11905: 0xCE7B,\n\t34674 - 11905: 0xCE7C,\n\t34675 - 11905: 0xCE7D,\n\t34676 - 11905: 0xBAFB,\n\t34677 - 11905: 0xCE7E,\n\t34678 - 11905: 0xB5FB,\n\t34679 - 11905: 0xCE80,\n\t34680 - 11905: 0xCE81,\n\t34681 - 11905: 0xCE82,\n\t34682 - 11905: 0xCE83,\n\t34683 - 11905: 0xF2EF,\n\t34684 - 11905: 0xF2F7,\n\t34685 - 11905: 0xF2ED,\n\t34686 - 11905: 0xF2EE,\n\t34687 - 11905: 0xCE84,\n\t34688 - 11905: 0xCE85,\n\t34689 - 11905: 0xCE86,\n\t34690 - 11905: 0xF2EB,\n\t34691 - 11905: 0xF3A6,\n\t34692 - 11905: 0xCE87,\n\t34693 - 11905: 0xF3A3,\n\t34694 - 11905: 0xCE88,\n\t34695 - 11905: 0xCE89,\n\t34696 - 11905: 0xF3A2,\n\t34697 - 11905: 0xCE8A,\n\t34698 - 11905: 0xCE8B,\n\t34699 - 11905: 0xF2F4,\n\t34700 - 11905: 0xCE8C,\n\t34701 - 11905: 0xC8DA,\n\t34702 - 11905: 0xCE8D,\n\t34703 - 11905: 0xCE8E,\n\t34704 - 11905: 0xCE8F,\n\t34705 - 11905: 0xCE90,\n\t34706 - 11905: 0xCE91,\n\t34707 - 11905: 0xF2FB,\n\t34708 - 11905: 0xCE92,\n\t34709 - 11905: 0xCE93,\n\t34710 - 11905: 0xCE94,\n\t34711 - 11905: 0xF3A5,\n\t34712 - 11905: 0xCE95,\n\t34713 - 11905: 0xCE96,\n\t34714 - 11905: 0xCE97,\n\t34715 - 11905: 0xCE98,\n\t34716 - 11905: 0xCE99,\n\t34717 - 11905: 0xCE9A,\n\t34718 - 11905: 0xCE9B,\n\t34719 - 11905: 0xC3F8,\n\t34720 - 11905: 0xCE9C,\n\t34721 - 11905: 0xCE9D,\n\t34722 - 11905: 0xCE9E,\n\t34723 - 11905: 0xCE9F,\n\t34724 - 11905: 0xCEA0,\n\t34725 - 11905: 0xCF40,\n\t34726 - 11905: 0xCF41,\n\t34727 - 11905: 0xCF42,\n\t34728 - 11905: 0xF2FD,\n\t34729 - 11905: 0xCF43,\n\t34730 - 11905: 0xCF44,\n\t34731 - 11905: 0xF3A7,\n\t34732 - 11905: 0xF3A9,\n\t34733 - 11905: 0xF3A4,\n\t34734 - 11905: 0xCF45,\n\t34735 - 11905: 0xF2FC,\n\t34736 - 11905: 0xCF46,\n\t34737 - 11905: 0xCF47,\n\t34738 - 11905: 0xCF48,\n\t34739 - 11905: 0xF3AB,\n\t34740 - 11905: 0xCF49,\n\t34741 - 11905: 0xF3AA,\n\t34742 - 11905: 0xCF4A,\n\t34743 - 11905: 0xCF4B,\n\t34744 - 11905: 0xCF4C,\n\t34745 - 11905: 0xCF4D,\n\t34746 - 11905: 0xC2DD,\n\t34747 - 11905: 0xCF4E,\n\t34748 - 11905: 0xCF4F,\n\t34749 - 11905: 0xF3AE,\n\t34750 - 11905: 0xCF50,\n\t34751 - 11905: 0xCF51,\n\t34752 - 11905: 0xF3B0,\n\t34753 - 11905: 0xCF52,\n\t34754 - 11905: 0xCF53,\n\t34755 - 11905: 0xCF54,\n\t34756 - 11905: 0xCF55,\n\t34757 - 11905: 0xCF56,\n\t34758 - 11905: 0xF3A1,\n\t34759 - 11905: 0xCF57,\n\t34760 - 11905: 0xCF58,\n\t34761 - 11905: 0xCF59,\n\t34762 - 11905: 0xF3B1,\n\t34763 - 11905: 0xF3AC,\n\t34764 - 11905: 0xCF5A,\n\t34765 - 11905: 0xCF5B,\n\t34766 - 11905: 0xCF5C,\n\t34767 - 11905: 0xCF5D,\n\t34768 - 11905: 0xCF5E,\n\t34769 - 11905: 0xF3AF,\n\t34770 - 11905: 0xF2FE,\n\t34771 - 11905: 0xF3AD,\n\t34772 - 11905: 0xCF5F,\n\t34773 - 11905: 0xCF60,\n\t34774 - 11905: 0xCF61,\n\t34775 - 11905: 0xCF62,\n\t34776 - 11905: 0xCF63,\n\t34777 - 11905: 0xCF64,\n\t34778 - 11905: 0xCF65,\n\t34779 - 11905: 0xF3B2,\n\t34780 - 11905: 0xCF66,\n\t34781 - 11905: 0xCF67,\n\t34782 - 11905: 0xCF68,\n\t34783 - 11905: 0xCF69,\n\t34784 - 11905: 0xF3B4,\n\t34785 - 11905: 0xCF6A,\n\t34786 - 11905: 0xCF6B,\n\t34787 - 11905: 0xCF6C,\n\t34788 - 11905: 0xCF6D,\n\t34789 - 11905: 0xF3A8,\n\t34790 - 11905: 0xCF6E,\n\t34791 - 11905: 0xCF6F,\n\t34792 - 11905: 0xCF70,\n\t34793 - 11905: 0xCF71,\n\t34794 - 11905: 0xF3B3,\n\t34795 - 11905: 0xCF72,\n\t34796 - 11905: 0xCF73,\n\t34797 - 11905: 0xCF74,\n\t34798 - 11905: 0xF3B5,\n\t34799 - 11905: 0xCF75,\n\t34800 - 11905: 0xCF76,\n\t34801 - 11905: 0xCF77,\n\t34802 - 11905: 0xCF78,\n\t34803 - 11905: 0xCF79,\n\t34804 - 11905: 0xCF7A,\n\t34805 - 11905: 0xCF7B,\n\t34806 - 11905: 0xCF7C,\n\t34807 - 11905: 0xCF7D,\n\t34808 - 11905: 0xCF7E,\n\t34809 - 11905: 0xD0B7,\n\t34810 - 11905: 0xCF80,\n\t34811 - 11905: 0xCF81,\n\t34812 - 11905: 0xCF82,\n\t34813 - 11905: 0xCF83,\n\t34814 - 11905: 0xF3B8,\n\t34815 - 11905: 0xCF84,\n\t34816 - 11905: 0xCF85,\n\t34817 - 11905: 0xCF86,\n\t34818 - 11905: 0xCF87,\n\t34819 - 11905: 0xD9F9,\n\t34820 - 11905: 0xCF88,\n\t34821 - 11905: 0xCF89,\n\t34822 - 11905: 0xCF8A,\n\t34823 - 11905: 0xCF8B,\n\t34824 - 11905: 0xCF8C,\n\t34825 - 11905: 0xCF8D,\n\t34826 - 11905: 0xF3B9,\n\t34827 - 11905: 0xCF8E,\n\t34828 - 11905: 0xCF8F,\n\t34829 - 11905: 0xCF90,\n\t34830 - 11905: 0xCF91,\n\t34831 - 11905: 0xCF92,\n\t34832 - 11905: 0xCF93,\n\t34833 - 11905: 0xCF94,\n\t34834 - 11905: 0xCF95,\n\t34835 - 11905: 0xF3B7,\n\t34836 - 11905: 0xCF96,\n\t34837 - 11905: 0xC8E4,\n\t34838 - 11905: 0xF3B6,\n\t34839 - 11905: 0xCF97,\n\t34840 - 11905: 0xCF98,\n\t34841 - 11905: 0xCF99,\n\t34842 - 11905: 0xCF9A,\n\t34843 - 11905: 0xF3BA,\n\t34844 - 11905: 0xCF9B,\n\t34845 - 11905: 0xCF9C,\n\t34846 - 11905: 0xCF9D,\n\t34847 - 11905: 0xCF9E,\n\t34848 - 11905: 0xCF9F,\n\t34849 - 11905: 0xF3BB,\n\t34850 - 11905: 0xB4C0,\n\t34851 - 11905: 0xCFA0,\n\t34852 - 11905: 0xD040,\n\t34853 - 11905: 0xD041,\n\t34854 - 11905: 0xD042,\n\t34855 - 11905: 0xD043,\n\t34856 - 11905: 0xD044,\n\t34857 - 11905: 0xD045,\n\t34858 - 11905: 0xD046,\n\t34859 - 11905: 0xD047,\n\t34860 - 11905: 0xD048,\n\t34861 - 11905: 0xD049,\n\t34862 - 11905: 0xD04A,\n\t34863 - 11905: 0xD04B,\n\t34864 - 11905: 0xD04C,\n\t34865 - 11905: 0xD04D,\n\t34866 - 11905: 0xEEC3,\n\t34867 - 11905: 0xD04E,\n\t34868 - 11905: 0xD04F,\n\t34869 - 11905: 0xD050,\n\t34870 - 11905: 0xD051,\n\t34871 - 11905: 0xD052,\n\t34872 - 11905: 0xD053,\n\t34873 - 11905: 0xF3BC,\n\t34874 - 11905: 0xD054,\n\t34875 - 11905: 0xD055,\n\t34876 - 11905: 0xF3BD,\n\t34877 - 11905: 0xD056,\n\t34878 - 11905: 0xD057,\n\t34879 - 11905: 0xD058,\n\t34880 - 11905: 0xD1AA,\n\t34881 - 11905: 0xD059,\n\t34882 - 11905: 0xD05A,\n\t34883 - 11905: 0xD05B,\n\t34884 - 11905: 0xF4AC,\n\t34885 - 11905: 0xD0C6,\n\t34886 - 11905: 0xD05C,\n\t34887 - 11905: 0xD05D,\n\t34888 - 11905: 0xD05E,\n\t34889 - 11905: 0xD05F,\n\t34890 - 11905: 0xD060,\n\t34891 - 11905: 0xD061,\n\t34892 - 11905: 0xD0D0,\n\t34893 - 11905: 0xD1DC,\n\t34894 - 11905: 0xD062,\n\t34895 - 11905: 0xD063,\n\t34896 - 11905: 0xD064,\n\t34897 - 11905: 0xD065,\n\t34898 - 11905: 0xD066,\n\t34899 - 11905: 0xD067,\n\t34900 - 11905: 0xCFCE,\n\t34901 - 11905: 0xD068,\n\t34902 - 11905: 0xD069,\n\t34903 - 11905: 0xBDD6,\n\t34904 - 11905: 0xD06A,\n\t34905 - 11905: 0xD1C3,\n\t34906 - 11905: 0xD06B,\n\t34907 - 11905: 0xD06C,\n\t34908 - 11905: 0xD06D,\n\t34909 - 11905: 0xD06E,\n\t34910 - 11905: 0xD06F,\n\t34911 - 11905: 0xD070,\n\t34912 - 11905: 0xD071,\n\t34913 - 11905: 0xBAE2,\n\t34914 - 11905: 0xE1E9,\n\t34915 - 11905: 0xD2C2,\n\t34916 - 11905: 0xF1C2,\n\t34917 - 11905: 0xB2B9,\n\t34918 - 11905: 0xD072,\n\t34919 - 11905: 0xD073,\n\t34920 - 11905: 0xB1ED,\n\t34921 - 11905: 0xF1C3,\n\t34922 - 11905: 0xD074,\n\t34923 - 11905: 0xC9C0,\n\t34924 - 11905: 0xB3C4,\n\t34925 - 11905: 0xD075,\n\t34926 - 11905: 0xD9F2,\n\t34927 - 11905: 0xD076,\n\t34928 - 11905: 0xCBA5,\n\t34929 - 11905: 0xD077,\n\t34930 - 11905: 0xF1C4,\n\t34931 - 11905: 0xD078,\n\t34932 - 11905: 0xD079,\n\t34933 - 11905: 0xD07A,\n\t34934 - 11905: 0xD07B,\n\t34935 - 11905: 0xD6D4,\n\t34936 - 11905: 0xD07C,\n\t34937 - 11905: 0xD07D,\n\t34938 - 11905: 0xD07E,\n\t34939 - 11905: 0xD080,\n\t34940 - 11905: 0xD081,\n\t34941 - 11905: 0xF1C5,\n\t34942 - 11905: 0xF4C0,\n\t34943 - 11905: 0xF1C6,\n\t34944 - 11905: 0xD082,\n\t34945 - 11905: 0xD4AC,\n\t34946 - 11905: 0xF1C7,\n\t34947 - 11905: 0xD083,\n\t34948 - 11905: 0xB0C0,\n\t34949 - 11905: 0xF4C1,\n\t34950 - 11905: 0xD084,\n\t34951 - 11905: 0xD085,\n\t34952 - 11905: 0xF4C2,\n\t34953 - 11905: 0xD086,\n\t34954 - 11905: 0xD087,\n\t34955 - 11905: 0xB4FC,\n\t34956 - 11905: 0xD088,\n\t34957 - 11905: 0xC5DB,\n\t34958 - 11905: 0xD089,\n\t34959 - 11905: 0xD08A,\n\t34960 - 11905: 0xD08B,\n\t34961 - 11905: 0xD08C,\n\t34962 - 11905: 0xCCBB,\n\t34963 - 11905: 0xD08D,\n\t34964 - 11905: 0xD08E,\n\t34965 - 11905: 0xD08F,\n\t34966 - 11905: 0xD0E4,\n\t34967 - 11905: 0xD090,\n\t34968 - 11905: 0xD091,\n\t34969 - 11905: 0xD092,\n\t34970 - 11905: 0xD093,\n\t34971 - 11905: 0xD094,\n\t34972 - 11905: 0xCDE0,\n\t34973 - 11905: 0xD095,\n\t34974 - 11905: 0xD096,\n\t34975 - 11905: 0xD097,\n\t34976 - 11905: 0xD098,\n\t34977 - 11905: 0xD099,\n\t34978 - 11905: 0xF1C8,\n\t34979 - 11905: 0xD09A,\n\t34980 - 11905: 0xD9F3,\n\t34981 - 11905: 0xD09B,\n\t34982 - 11905: 0xD09C,\n\t34983 - 11905: 0xD09D,\n\t34984 - 11905: 0xD09E,\n\t34985 - 11905: 0xD09F,\n\t34986 - 11905: 0xD0A0,\n\t34987 - 11905: 0xB1BB,\n\t34988 - 11905: 0xD140,\n\t34989 - 11905: 0xCFAE,\n\t34990 - 11905: 0xD141,\n\t34991 - 11905: 0xD142,\n\t34992 - 11905: 0xD143,\n\t34993 - 11905: 0xB8A4,\n\t34994 - 11905: 0xD144,\n\t34995 - 11905: 0xD145,\n\t34996 - 11905: 0xD146,\n\t34997 - 11905: 0xD147,\n\t34998 - 11905: 0xD148,\n\t34999 - 11905: 0xF1CA,\n\t35000 - 11905: 0xD149,\n\t35001 - 11905: 0xD14A,\n\t35002 - 11905: 0xD14B,\n\t35003 - 11905: 0xD14C,\n\t35004 - 11905: 0xF1CB,\n\t35005 - 11905: 0xD14D,\n\t35006 - 11905: 0xD14E,\n\t35007 - 11905: 0xD14F,\n\t35008 - 11905: 0xD150,\n\t35009 - 11905: 0xB2C3,\n\t35010 - 11905: 0xC1D1,\n\t35011 - 11905: 0xD151,\n\t35012 - 11905: 0xD152,\n\t35013 - 11905: 0xD7B0,\n\t35014 - 11905: 0xF1C9,\n\t35015 - 11905: 0xD153,\n\t35016 - 11905: 0xD154,\n\t35017 - 11905: 0xF1CC,\n\t35018 - 11905: 0xD155,\n\t35019 - 11905: 0xD156,\n\t35020 - 11905: 0xD157,\n\t35021 - 11905: 0xD158,\n\t35022 - 11905: 0xF1CE,\n\t35023 - 11905: 0xD159,\n\t35024 - 11905: 0xD15A,\n\t35025 - 11905: 0xD15B,\n\t35026 - 11905: 0xD9F6,\n\t35027 - 11905: 0xD15C,\n\t35028 - 11905: 0xD2E1,\n\t35029 - 11905: 0xD4A3,\n\t35030 - 11905: 0xD15D,\n\t35031 - 11905: 0xD15E,\n\t35032 - 11905: 0xF4C3,\n\t35033 - 11905: 0xC8B9,\n\t35034 - 11905: 0xD15F,\n\t35035 - 11905: 0xD160,\n\t35036 - 11905: 0xD161,\n\t35037 - 11905: 0xD162,\n\t35038 - 11905: 0xD163,\n\t35039 - 11905: 0xF4C4,\n\t35040 - 11905: 0xD164,\n\t35041 - 11905: 0xD165,\n\t35042 - 11905: 0xF1CD,\n\t35043 - 11905: 0xF1CF,\n\t35044 - 11905: 0xBFE3,\n\t35045 - 11905: 0xF1D0,\n\t35046 - 11905: 0xD166,\n\t35047 - 11905: 0xD167,\n\t35048 - 11905: 0xF1D4,\n\t35049 - 11905: 0xD168,\n\t35050 - 11905: 0xD169,\n\t35051 - 11905: 0xD16A,\n\t35052 - 11905: 0xD16B,\n\t35053 - 11905: 0xD16C,\n\t35054 - 11905: 0xD16D,\n\t35055 - 11905: 0xD16E,\n\t35056 - 11905: 0xF1D6,\n\t35057 - 11905: 0xF1D1,\n\t35058 - 11905: 0xD16F,\n\t35059 - 11905: 0xC9D1,\n\t35060 - 11905: 0xC5E1,\n\t35061 - 11905: 0xD170,\n\t35062 - 11905: 0xD171,\n\t35063 - 11905: 0xD172,\n\t35064 - 11905: 0xC2E3,\n\t35065 - 11905: 0xB9FC,\n\t35066 - 11905: 0xD173,\n\t35067 - 11905: 0xD174,\n\t35068 - 11905: 0xF1D3,\n\t35069 - 11905: 0xD175,\n\t35070 - 11905: 0xF1D5,\n\t35071 - 11905: 0xD176,\n\t35072 - 11905: 0xD177,\n\t35073 - 11905: 0xD178,\n\t35074 - 11905: 0xB9D3,\n\t35075 - 11905: 0xD179,\n\t35076 - 11905: 0xD17A,\n\t35077 - 11905: 0xD17B,\n\t35078 - 11905: 0xD17C,\n\t35079 - 11905: 0xD17D,\n\t35080 - 11905: 0xD17E,\n\t35081 - 11905: 0xD180,\n\t35082 - 11905: 0xF1DB,\n\t35083 - 11905: 0xD181,\n\t35084 - 11905: 0xD182,\n\t35085 - 11905: 0xD183,\n\t35086 - 11905: 0xD184,\n\t35087 - 11905: 0xD185,\n\t35088 - 11905: 0xBAD6,\n\t35089 - 11905: 0xD186,\n\t35090 - 11905: 0xB0FD,\n\t35091 - 11905: 0xF1D9,\n\t35092 - 11905: 0xD187,\n\t35093 - 11905: 0xD188,\n\t35094 - 11905: 0xD189,\n\t35095 - 11905: 0xD18A,\n\t35096 - 11905: 0xD18B,\n\t35097 - 11905: 0xF1D8,\n\t35098 - 11905: 0xF1D2,\n\t35099 - 11905: 0xF1DA,\n\t35100 - 11905: 0xD18C,\n\t35101 - 11905: 0xD18D,\n\t35102 - 11905: 0xD18E,\n\t35103 - 11905: 0xD18F,\n\t35104 - 11905: 0xD190,\n\t35105 - 11905: 0xF1D7,\n\t35106 - 11905: 0xD191,\n\t35107 - 11905: 0xD192,\n\t35108 - 11905: 0xD193,\n\t35109 - 11905: 0xC8EC,\n\t35110 - 11905: 0xD194,\n\t35111 - 11905: 0xD195,\n\t35112 - 11905: 0xD196,\n\t35113 - 11905: 0xD197,\n\t35114 - 11905: 0xCDCA,\n\t35115 - 11905: 0xF1DD,\n\t35116 - 11905: 0xD198,\n\t35117 - 11905: 0xD199,\n\t35118 - 11905: 0xD19A,\n\t35119 - 11905: 0xD19B,\n\t35120 - 11905: 0xE5BD,\n\t35121 - 11905: 0xD19C,\n\t35122 - 11905: 0xD19D,\n\t35123 - 11905: 0xD19E,\n\t35124 - 11905: 0xF1DC,\n\t35125 - 11905: 0xD19F,\n\t35126 - 11905: 0xF1DE,\n\t35127 - 11905: 0xD1A0,\n\t35128 - 11905: 0xD240,\n\t35129 - 11905: 0xD241,\n\t35130 - 11905: 0xD242,\n\t35131 - 11905: 0xD243,\n\t35132 - 11905: 0xD244,\n\t35133 - 11905: 0xD245,\n\t35134 - 11905: 0xD246,\n\t35135 - 11905: 0xD247,\n\t35136 - 11905: 0xD248,\n\t35137 - 11905: 0xF1DF,\n\t35138 - 11905: 0xD249,\n\t35139 - 11905: 0xD24A,\n\t35140 - 11905: 0xCFE5,\n\t35141 - 11905: 0xD24B,\n\t35142 - 11905: 0xD24C,\n\t35143 - 11905: 0xD24D,\n\t35144 - 11905: 0xD24E,\n\t35145 - 11905: 0xD24F,\n\t35146 - 11905: 0xD250,\n\t35147 - 11905: 0xD251,\n\t35148 - 11905: 0xD252,\n\t35149 - 11905: 0xD253,\n\t35150 - 11905: 0xD254,\n\t35151 - 11905: 0xD255,\n\t35152 - 11905: 0xD256,\n\t35153 - 11905: 0xD257,\n\t35154 - 11905: 0xD258,\n\t35155 - 11905: 0xD259,\n\t35156 - 11905: 0xD25A,\n\t35157 - 11905: 0xD25B,\n\t35158 - 11905: 0xD25C,\n\t35159 - 11905: 0xD25D,\n\t35160 - 11905: 0xD25E,\n\t35161 - 11905: 0xD25F,\n\t35162 - 11905: 0xD260,\n\t35163 - 11905: 0xD261,\n\t35164 - 11905: 0xD262,\n\t35165 - 11905: 0xD263,\n\t35166 - 11905: 0xF4C5,\n\t35167 - 11905: 0xBDF3,\n\t35168 - 11905: 0xD264,\n\t35169 - 11905: 0xD265,\n\t35170 - 11905: 0xD266,\n\t35171 - 11905: 0xD267,\n\t35172 - 11905: 0xD268,\n\t35173 - 11905: 0xD269,\n\t35174 - 11905: 0xF1E0,\n\t35175 - 11905: 0xD26A,\n\t35176 - 11905: 0xD26B,\n\t35177 - 11905: 0xD26C,\n\t35178 - 11905: 0xD26D,\n\t35179 - 11905: 0xD26E,\n\t35180 - 11905: 0xD26F,\n\t35181 - 11905: 0xD270,\n\t35182 - 11905: 0xD271,\n\t35183 - 11905: 0xD272,\n\t35184 - 11905: 0xD273,\n\t35185 - 11905: 0xD274,\n\t35186 - 11905: 0xD275,\n\t35187 - 11905: 0xD276,\n\t35188 - 11905: 0xD277,\n\t35189 - 11905: 0xD278,\n\t35190 - 11905: 0xD279,\n\t35191 - 11905: 0xD27A,\n\t35192 - 11905: 0xD27B,\n\t35193 - 11905: 0xD27C,\n\t35194 - 11905: 0xD27D,\n\t35195 - 11905: 0xF1E1,\n\t35196 - 11905: 0xD27E,\n\t35197 - 11905: 0xD280,\n\t35198 - 11905: 0xD281,\n\t35199 - 11905: 0xCEF7,\n\t35200 - 11905: 0xD282,\n\t35201 - 11905: 0xD2AA,\n\t35202 - 11905: 0xD283,\n\t35203 - 11905: 0xF1FB,\n\t35204 - 11905: 0xD284,\n\t35205 - 11905: 0xD285,\n\t35206 - 11905: 0xB8B2,\n\t35207 - 11905: 0xD286,\n\t35208 - 11905: 0xD287,\n\t35209 - 11905: 0xD288,\n\t35210 - 11905: 0xD289,\n\t35211 - 11905: 0xD28A,\n\t35212 - 11905: 0xD28B,\n\t35213 - 11905: 0xD28C,\n\t35214 - 11905: 0xD28D,\n\t35215 - 11905: 0xD28E,\n\t35216 - 11905: 0xD28F,\n\t35217 - 11905: 0xD290,\n\t35218 - 11905: 0xD291,\n\t35219 - 11905: 0xD292,\n\t35220 - 11905: 0xD293,\n\t35221 - 11905: 0xD294,\n\t35222 - 11905: 0xD295,\n\t35223 - 11905: 0xD296,\n\t35224 - 11905: 0xD297,\n\t35225 - 11905: 0xD298,\n\t35226 - 11905: 0xD299,\n\t35227 - 11905: 0xD29A,\n\t35228 - 11905: 0xD29B,\n\t35229 - 11905: 0xD29C,\n\t35230 - 11905: 0xD29D,\n\t35231 - 11905: 0xD29E,\n\t35232 - 11905: 0xD29F,\n\t35233 - 11905: 0xD2A0,\n\t35234 - 11905: 0xD340,\n\t35235 - 11905: 0xD341,\n\t35236 - 11905: 0xD342,\n\t35237 - 11905: 0xD343,\n\t35238 - 11905: 0xD344,\n\t35239 - 11905: 0xD345,\n\t35240 - 11905: 0xD346,\n\t35241 - 11905: 0xD347,\n\t35242 - 11905: 0xD348,\n\t35243 - 11905: 0xD349,\n\t35244 - 11905: 0xD34A,\n\t35245 - 11905: 0xD34B,\n\t35246 - 11905: 0xD34C,\n\t35247 - 11905: 0xD34D,\n\t35248 - 11905: 0xD34E,\n\t35249 - 11905: 0xD34F,\n\t35250 - 11905: 0xD350,\n\t35251 - 11905: 0xD351,\n\t35252 - 11905: 0xD352,\n\t35253 - 11905: 0xD353,\n\t35254 - 11905: 0xD354,\n\t35255 - 11905: 0xD355,\n\t35256 - 11905: 0xD356,\n\t35257 - 11905: 0xD357,\n\t35258 - 11905: 0xD358,\n\t35259 - 11905: 0xD359,\n\t35260 - 11905: 0xD35A,\n\t35261 - 11905: 0xD35B,\n\t35262 - 11905: 0xD35C,\n\t35263 - 11905: 0xD35D,\n\t35264 - 11905: 0xD35E,\n\t35265 - 11905: 0xBCFB,\n\t35266 - 11905: 0xB9DB,\n\t35267 - 11905: 0xD35F,\n\t35268 - 11905: 0xB9E6,\n\t35269 - 11905: 0xC3D9,\n\t35270 - 11905: 0xCAD3,\n\t35271 - 11905: 0xEAE8,\n\t35272 - 11905: 0xC0C0,\n\t35273 - 11905: 0xBEF5,\n\t35274 - 11905: 0xEAE9,\n\t35275 - 11905: 0xEAEA,\n\t35276 - 11905: 0xEAEB,\n\t35277 - 11905: 0xD360,\n\t35278 - 11905: 0xEAEC,\n\t35279 - 11905: 0xEAED,\n\t35280 - 11905: 0xEAEE,\n\t35281 - 11905: 0xEAEF,\n\t35282 - 11905: 0xBDC7,\n\t35283 - 11905: 0xD361,\n\t35284 - 11905: 0xD362,\n\t35285 - 11905: 0xD363,\n\t35286 - 11905: 0xF5FB,\n\t35287 - 11905: 0xD364,\n\t35288 - 11905: 0xD365,\n\t35289 - 11905: 0xD366,\n\t35290 - 11905: 0xF5FD,\n\t35291 - 11905: 0xD367,\n\t35292 - 11905: 0xF5FE,\n\t35293 - 11905: 0xD368,\n\t35294 - 11905: 0xF5FC,\n\t35295 - 11905: 0xD369,\n\t35296 - 11905: 0xD36A,\n\t35297 - 11905: 0xD36B,\n\t35298 - 11905: 0xD36C,\n\t35299 - 11905: 0xBDE2,\n\t35300 - 11905: 0xD36D,\n\t35301 - 11905: 0xF6A1,\n\t35302 - 11905: 0xB4A5,\n\t35303 - 11905: 0xD36E,\n\t35304 - 11905: 0xD36F,\n\t35305 - 11905: 0xD370,\n\t35306 - 11905: 0xD371,\n\t35307 - 11905: 0xF6A2,\n\t35308 - 11905: 0xD372,\n\t35309 - 11905: 0xD373,\n\t35310 - 11905: 0xD374,\n\t35311 - 11905: 0xF6A3,\n\t35312 - 11905: 0xD375,\n\t35313 - 11905: 0xD376,\n\t35314 - 11905: 0xD377,\n\t35315 - 11905: 0xECB2,\n\t35316 - 11905: 0xD378,\n\t35317 - 11905: 0xD379,\n\t35318 - 11905: 0xD37A,\n\t35319 - 11905: 0xD37B,\n\t35320 - 11905: 0xD37C,\n\t35321 - 11905: 0xD37D,\n\t35322 - 11905: 0xD37E,\n\t35323 - 11905: 0xD380,\n\t35324 - 11905: 0xD381,\n\t35325 - 11905: 0xD382,\n\t35326 - 11905: 0xD383,\n\t35327 - 11905: 0xD384,\n\t35328 - 11905: 0xD1D4,\n\t35329 - 11905: 0xD385,\n\t35330 - 11905: 0xD386,\n\t35331 - 11905: 0xD387,\n\t35332 - 11905: 0xD388,\n\t35333 - 11905: 0xD389,\n\t35334 - 11905: 0xD38A,\n\t35335 - 11905: 0xD9EA,\n\t35336 - 11905: 0xD38B,\n\t35337 - 11905: 0xD38C,\n\t35338 - 11905: 0xD38D,\n\t35339 - 11905: 0xD38E,\n\t35340 - 11905: 0xD38F,\n\t35341 - 11905: 0xD390,\n\t35342 - 11905: 0xD391,\n\t35343 - 11905: 0xD392,\n\t35344 - 11905: 0xD393,\n\t35345 - 11905: 0xD394,\n\t35346 - 11905: 0xD395,\n\t35347 - 11905: 0xD396,\n\t35348 - 11905: 0xD397,\n\t35349 - 11905: 0xD398,\n\t35350 - 11905: 0xD399,\n\t35351 - 11905: 0xD39A,\n\t35352 - 11905: 0xD39B,\n\t35353 - 11905: 0xD39C,\n\t35354 - 11905: 0xD39D,\n\t35355 - 11905: 0xD39E,\n\t35356 - 11905: 0xD39F,\n\t35357 - 11905: 0xD3A0,\n\t35358 - 11905: 0xD440,\n\t35359 - 11905: 0xD441,\n\t35360 - 11905: 0xD442,\n\t35361 - 11905: 0xD443,\n\t35362 - 11905: 0xD444,\n\t35363 - 11905: 0xD445,\n\t35364 - 11905: 0xD446,\n\t35365 - 11905: 0xD447,\n\t35366 - 11905: 0xD448,\n\t35367 - 11905: 0xD449,\n\t35368 - 11905: 0xD44A,\n\t35369 - 11905: 0xD44B,\n\t35370 - 11905: 0xD44C,\n\t35371 - 11905: 0xD44D,\n\t35372 - 11905: 0xD44E,\n\t35373 - 11905: 0xD44F,\n\t35374 - 11905: 0xD450,\n\t35375 - 11905: 0xD451,\n\t35376 - 11905: 0xD452,\n\t35377 - 11905: 0xD453,\n\t35378 - 11905: 0xD454,\n\t35379 - 11905: 0xD455,\n\t35380 - 11905: 0xD456,\n\t35381 - 11905: 0xD457,\n\t35382 - 11905: 0xD458,\n\t35383 - 11905: 0xD459,\n\t35384 - 11905: 0xD45A,\n\t35385 - 11905: 0xD45B,\n\t35386 - 11905: 0xD45C,\n\t35387 - 11905: 0xD45D,\n\t35388 - 11905: 0xD45E,\n\t35389 - 11905: 0xD45F,\n\t35390 - 11905: 0xF6A4,\n\t35391 - 11905: 0xD460,\n\t35392 - 11905: 0xD461,\n\t35393 - 11905: 0xD462,\n\t35394 - 11905: 0xD463,\n\t35395 - 11905: 0xD464,\n\t35396 - 11905: 0xD465,\n\t35397 - 11905: 0xD466,\n\t35398 - 11905: 0xD467,\n\t35399 - 11905: 0xD468,\n\t35400 - 11905: 0xEEBA,\n\t35401 - 11905: 0xD469,\n\t35402 - 11905: 0xD46A,\n\t35403 - 11905: 0xD46B,\n\t35404 - 11905: 0xD46C,\n\t35405 - 11905: 0xD46D,\n\t35406 - 11905: 0xD46E,\n\t35407 - 11905: 0xD46F,\n\t35408 - 11905: 0xD470,\n\t35409 - 11905: 0xD471,\n\t35410 - 11905: 0xD472,\n\t35411 - 11905: 0xD473,\n\t35412 - 11905: 0xD474,\n\t35413 - 11905: 0xD475,\n\t35414 - 11905: 0xD476,\n\t35415 - 11905: 0xD477,\n\t35416 - 11905: 0xD478,\n\t35417 - 11905: 0xD479,\n\t35418 - 11905: 0xD47A,\n\t35419 - 11905: 0xD47B,\n\t35420 - 11905: 0xD47C,\n\t35421 - 11905: 0xD47D,\n\t35422 - 11905: 0xD47E,\n\t35423 - 11905: 0xD480,\n\t35424 - 11905: 0xD481,\n\t35425 - 11905: 0xD482,\n\t35426 - 11905: 0xD483,\n\t35427 - 11905: 0xD484,\n\t35428 - 11905: 0xD485,\n\t35429 - 11905: 0xD486,\n\t35430 - 11905: 0xD487,\n\t35431 - 11905: 0xD488,\n\t35432 - 11905: 0xD489,\n\t35433 - 11905: 0xD48A,\n\t35434 - 11905: 0xD48B,\n\t35435 - 11905: 0xD48C,\n\t35436 - 11905: 0xD48D,\n\t35437 - 11905: 0xD48E,\n\t35438 - 11905: 0xD48F,\n\t35439 - 11905: 0xD490,\n\t35440 - 11905: 0xD491,\n\t35441 - 11905: 0xD492,\n\t35442 - 11905: 0xD493,\n\t35443 - 11905: 0xD494,\n\t35444 - 11905: 0xD495,\n\t35445 - 11905: 0xD496,\n\t35446 - 11905: 0xD497,\n\t35447 - 11905: 0xD498,\n\t35448 - 11905: 0xD499,\n\t35449 - 11905: 0xD5B2,\n\t35450 - 11905: 0xD49A,\n\t35451 - 11905: 0xD49B,\n\t35452 - 11905: 0xD49C,\n\t35453 - 11905: 0xD49D,\n\t35454 - 11905: 0xD49E,\n\t35455 - 11905: 0xD49F,\n\t35456 - 11905: 0xD4A0,\n\t35457 - 11905: 0xD540,\n\t35458 - 11905: 0xD541,\n\t35459 - 11905: 0xD542,\n\t35460 - 11905: 0xD543,\n\t35461 - 11905: 0xD544,\n\t35462 - 11905: 0xD545,\n\t35463 - 11905: 0xD546,\n\t35464 - 11905: 0xD547,\n\t35465 - 11905: 0xD3FE,\n\t35466 - 11905: 0xCCDC,\n\t35467 - 11905: 0xD548,\n\t35468 - 11905: 0xD549,\n\t35469 - 11905: 0xD54A,\n\t35470 - 11905: 0xD54B,\n\t35471 - 11905: 0xD54C,\n\t35472 - 11905: 0xD54D,\n\t35473 - 11905: 0xD54E,\n\t35474 - 11905: 0xD54F,\n\t35475 - 11905: 0xCAC4,\n\t35476 - 11905: 0xD550,\n\t35477 - 11905: 0xD551,\n\t35478 - 11905: 0xD552,\n\t35479 - 11905: 0xD553,\n\t35480 - 11905: 0xD554,\n\t35481 - 11905: 0xD555,\n\t35482 - 11905: 0xD556,\n\t35483 - 11905: 0xD557,\n\t35484 - 11905: 0xD558,\n\t35485 - 11905: 0xD559,\n\t35486 - 11905: 0xD55A,\n\t35487 - 11905: 0xD55B,\n\t35488 - 11905: 0xD55C,\n\t35489 - 11905: 0xD55D,\n\t35490 - 11905: 0xD55E,\n\t35491 - 11905: 0xD55F,\n\t35492 - 11905: 0xD560,\n\t35493 - 11905: 0xD561,\n\t35494 - 11905: 0xD562,\n\t35495 - 11905: 0xD563,\n\t35496 - 11905: 0xD564,\n\t35497 - 11905: 0xD565,\n\t35498 - 11905: 0xD566,\n\t35499 - 11905: 0xD567,\n\t35500 - 11905: 0xD568,\n\t35501 - 11905: 0xD569,\n\t35502 - 11905: 0xD56A,\n\t35503 - 11905: 0xD56B,\n\t35504 - 11905: 0xD56C,\n\t35505 - 11905: 0xD56D,\n\t35506 - 11905: 0xD56E,\n\t35507 - 11905: 0xD56F,\n\t35508 - 11905: 0xD570,\n\t35509 - 11905: 0xD571,\n\t35510 - 11905: 0xD572,\n\t35511 - 11905: 0xD573,\n\t35512 - 11905: 0xD574,\n\t35513 - 11905: 0xD575,\n\t35514 - 11905: 0xD576,\n\t35515 - 11905: 0xD577,\n\t35516 - 11905: 0xD578,\n\t35517 - 11905: 0xD579,\n\t35518 - 11905: 0xD57A,\n\t35519 - 11905: 0xD57B,\n\t35520 - 11905: 0xD57C,\n\t35521 - 11905: 0xD57D,\n\t35522 - 11905: 0xD57E,\n\t35523 - 11905: 0xD580,\n\t35524 - 11905: 0xD581,\n\t35525 - 11905: 0xD582,\n\t35526 - 11905: 0xD583,\n\t35527 - 11905: 0xD584,\n\t35528 - 11905: 0xD585,\n\t35529 - 11905: 0xD586,\n\t35530 - 11905: 0xD587,\n\t35531 - 11905: 0xD588,\n\t35532 - 11905: 0xD589,\n\t35533 - 11905: 0xD58A,\n\t35534 - 11905: 0xD58B,\n\t35535 - 11905: 0xD58C,\n\t35536 - 11905: 0xD58D,\n\t35537 - 11905: 0xD58E,\n\t35538 - 11905: 0xD58F,\n\t35539 - 11905: 0xD590,\n\t35540 - 11905: 0xD591,\n\t35541 - 11905: 0xD592,\n\t35542 - 11905: 0xD593,\n\t35543 - 11905: 0xD594,\n\t35544 - 11905: 0xD595,\n\t35545 - 11905: 0xD596,\n\t35546 - 11905: 0xD597,\n\t35547 - 11905: 0xD598,\n\t35548 - 11905: 0xD599,\n\t35549 - 11905: 0xD59A,\n\t35550 - 11905: 0xD59B,\n\t35551 - 11905: 0xD59C,\n\t35552 - 11905: 0xD59D,\n\t35553 - 11905: 0xD59E,\n\t35554 - 11905: 0xD59F,\n\t35555 - 11905: 0xD5A0,\n\t35556 - 11905: 0xD640,\n\t35557 - 11905: 0xD641,\n\t35558 - 11905: 0xD642,\n\t35559 - 11905: 0xD643,\n\t35560 - 11905: 0xD644,\n\t35561 - 11905: 0xD645,\n\t35562 - 11905: 0xD646,\n\t35563 - 11905: 0xD647,\n\t35564 - 11905: 0xD648,\n\t35565 - 11905: 0xD649,\n\t35566 - 11905: 0xD64A,\n\t35567 - 11905: 0xD64B,\n\t35568 - 11905: 0xD64C,\n\t35569 - 11905: 0xD64D,\n\t35570 - 11905: 0xD64E,\n\t35571 - 11905: 0xD64F,\n\t35572 - 11905: 0xD650,\n\t35573 - 11905: 0xD651,\n\t35574 - 11905: 0xD652,\n\t35575 - 11905: 0xD653,\n\t35576 - 11905: 0xD654,\n\t35577 - 11905: 0xD655,\n\t35578 - 11905: 0xD656,\n\t35579 - 11905: 0xD657,\n\t35580 - 11905: 0xD658,\n\t35581 - 11905: 0xD659,\n\t35582 - 11905: 0xD65A,\n\t35583 - 11905: 0xD65B,\n\t35584 - 11905: 0xD65C,\n\t35585 - 11905: 0xD65D,\n\t35586 - 11905: 0xD65E,\n\t35587 - 11905: 0xD65F,\n\t35588 - 11905: 0xD660,\n\t35589 - 11905: 0xD661,\n\t35590 - 11905: 0xD662,\n\t35591 - 11905: 0xE5C0,\n\t35592 - 11905: 0xD663,\n\t35593 - 11905: 0xD664,\n\t35594 - 11905: 0xD665,\n\t35595 - 11905: 0xD666,\n\t35596 - 11905: 0xD667,\n\t35597 - 11905: 0xD668,\n\t35598 - 11905: 0xD669,\n\t35599 - 11905: 0xD66A,\n\t35600 - 11905: 0xD66B,\n\t35601 - 11905: 0xD66C,\n\t35602 - 11905: 0xD66D,\n\t35603 - 11905: 0xD66E,\n\t35604 - 11905: 0xD66F,\n\t35605 - 11905: 0xD670,\n\t35606 - 11905: 0xD671,\n\t35607 - 11905: 0xD672,\n\t35608 - 11905: 0xD673,\n\t35609 - 11905: 0xD674,\n\t35610 - 11905: 0xD675,\n\t35611 - 11905: 0xD676,\n\t35612 - 11905: 0xD677,\n\t35613 - 11905: 0xD678,\n\t35614 - 11905: 0xD679,\n\t35615 - 11905: 0xD67A,\n\t35616 - 11905: 0xD67B,\n\t35617 - 11905: 0xD67C,\n\t35618 - 11905: 0xD67D,\n\t35619 - 11905: 0xD67E,\n\t35620 - 11905: 0xD680,\n\t35621 - 11905: 0xD681,\n\t35622 - 11905: 0xF6A5,\n\t35623 - 11905: 0xD682,\n\t35624 - 11905: 0xD683,\n\t35625 - 11905: 0xD684,\n\t35626 - 11905: 0xD685,\n\t35627 - 11905: 0xD686,\n\t35628 - 11905: 0xD687,\n\t35629 - 11905: 0xD688,\n\t35630 - 11905: 0xD689,\n\t35631 - 11905: 0xD68A,\n\t35632 - 11905: 0xD68B,\n\t35633 - 11905: 0xD68C,\n\t35634 - 11905: 0xD68D,\n\t35635 - 11905: 0xD68E,\n\t35636 - 11905: 0xD68F,\n\t35637 - 11905: 0xD690,\n\t35638 - 11905: 0xD691,\n\t35639 - 11905: 0xD692,\n\t35640 - 11905: 0xD693,\n\t35641 - 11905: 0xD694,\n\t35642 - 11905: 0xD695,\n\t35643 - 11905: 0xD696,\n\t35644 - 11905: 0xD697,\n\t35645 - 11905: 0xD698,\n\t35646 - 11905: 0xD699,\n\t35647 - 11905: 0xD69A,\n\t35648 - 11905: 0xD69B,\n\t35649 - 11905: 0xD69C,\n\t35650 - 11905: 0xD69D,\n\t35651 - 11905: 0xD69E,\n\t35652 - 11905: 0xD69F,\n\t35653 - 11905: 0xD6A0,\n\t35654 - 11905: 0xD740,\n\t35655 - 11905: 0xD741,\n\t35656 - 11905: 0xD742,\n\t35657 - 11905: 0xD743,\n\t35658 - 11905: 0xD744,\n\t35659 - 11905: 0xD745,\n\t35660 - 11905: 0xD746,\n\t35661 - 11905: 0xD747,\n\t35662 - 11905: 0xD748,\n\t35663 - 11905: 0xD749,\n\t35664 - 11905: 0xD74A,\n\t35665 - 11905: 0xD74B,\n\t35666 - 11905: 0xD74C,\n\t35667 - 11905: 0xD74D,\n\t35668 - 11905: 0xD74E,\n\t35669 - 11905: 0xD74F,\n\t35670 - 11905: 0xD750,\n\t35671 - 11905: 0xD751,\n\t35672 - 11905: 0xD752,\n\t35673 - 11905: 0xD753,\n\t35674 - 11905: 0xD754,\n\t35675 - 11905: 0xD755,\n\t35676 - 11905: 0xD756,\n\t35677 - 11905: 0xD757,\n\t35678 - 11905: 0xD758,\n\t35679 - 11905: 0xD759,\n\t35680 - 11905: 0xD75A,\n\t35681 - 11905: 0xD75B,\n\t35682 - 11905: 0xD75C,\n\t35683 - 11905: 0xD75D,\n\t35684 - 11905: 0xD75E,\n\t35685 - 11905: 0xD75F,\n\t35686 - 11905: 0xBEAF,\n\t35687 - 11905: 0xD760,\n\t35688 - 11905: 0xD761,\n\t35689 - 11905: 0xD762,\n\t35690 - 11905: 0xD763,\n\t35691 - 11905: 0xD764,\n\t35692 - 11905: 0xC6A9,\n\t35693 - 11905: 0xD765,\n\t35694 - 11905: 0xD766,\n\t35695 - 11905: 0xD767,\n\t35696 - 11905: 0xD768,\n\t35697 - 11905: 0xD769,\n\t35698 - 11905: 0xD76A,\n\t35699 - 11905: 0xD76B,\n\t35700 - 11905: 0xD76C,\n\t35701 - 11905: 0xD76D,\n\t35702 - 11905: 0xD76E,\n\t35703 - 11905: 0xD76F,\n\t35704 - 11905: 0xD770,\n\t35705 - 11905: 0xD771,\n\t35706 - 11905: 0xD772,\n\t35707 - 11905: 0xD773,\n\t35708 - 11905: 0xD774,\n\t35709 - 11905: 0xD775,\n\t35710 - 11905: 0xD776,\n\t35711 - 11905: 0xD777,\n\t35712 - 11905: 0xD778,\n\t35713 - 11905: 0xD779,\n\t35714 - 11905: 0xD77A,\n\t35715 - 11905: 0xD77B,\n\t35716 - 11905: 0xD77C,\n\t35717 - 11905: 0xD77D,\n\t35718 - 11905: 0xD77E,\n\t35719 - 11905: 0xD780,\n\t35720 - 11905: 0xD781,\n\t35721 - 11905: 0xD782,\n\t35722 - 11905: 0xD783,\n\t35723 - 11905: 0xD784,\n\t35724 - 11905: 0xD785,\n\t35725 - 11905: 0xD786,\n\t35726 - 11905: 0xD787,\n\t35727 - 11905: 0xD788,\n\t35728 - 11905: 0xD789,\n\t35729 - 11905: 0xD78A,\n\t35730 - 11905: 0xD78B,\n\t35731 - 11905: 0xD78C,\n\t35732 - 11905: 0xD78D,\n\t35733 - 11905: 0xD78E,\n\t35734 - 11905: 0xD78F,\n\t35735 - 11905: 0xD790,\n\t35736 - 11905: 0xD791,\n\t35737 - 11905: 0xD792,\n\t35738 - 11905: 0xD793,\n\t35739 - 11905: 0xD794,\n\t35740 - 11905: 0xD795,\n\t35741 - 11905: 0xD796,\n\t35742 - 11905: 0xD797,\n\t35743 - 11905: 0xD798,\n\t35744 - 11905: 0xDAA5,\n\t35745 - 11905: 0xBCC6,\n\t35746 - 11905: 0xB6A9,\n\t35747 - 11905: 0xB8BC,\n\t35748 - 11905: 0xC8CF,\n\t35749 - 11905: 0xBCA5,\n\t35750 - 11905: 0xDAA6,\n\t35751 - 11905: 0xDAA7,\n\t35752 - 11905: 0xCCD6,\n\t35753 - 11905: 0xC8C3,\n\t35754 - 11905: 0xDAA8,\n\t35755 - 11905: 0xC6FD,\n\t35756 - 11905: 0xD799,\n\t35757 - 11905: 0xD1B5,\n\t35758 - 11905: 0xD2E9,\n\t35759 - 11905: 0xD1B6,\n\t35760 - 11905: 0xBCC7,\n\t35761 - 11905: 0xD79A,\n\t35762 - 11905: 0xBDB2,\n\t35763 - 11905: 0xBBE4,\n\t35764 - 11905: 0xDAA9,\n\t35765 - 11905: 0xDAAA,\n\t35766 - 11905: 0xD1C8,\n\t35767 - 11905: 0xDAAB,\n\t35768 - 11905: 0xD0ED,\n\t35769 - 11905: 0xB6EF,\n\t35770 - 11905: 0xC2DB,\n\t35771 - 11905: 0xD79B,\n\t35772 - 11905: 0xCBCF,\n\t35773 - 11905: 0xB7ED,\n\t35774 - 11905: 0xC9E8,\n\t35775 - 11905: 0xB7C3,\n\t35776 - 11905: 0xBEF7,\n\t35777 - 11905: 0xD6A4,\n\t35778 - 11905: 0xDAAC,\n\t35779 - 11905: 0xDAAD,\n\t35780 - 11905: 0xC6C0,\n\t35781 - 11905: 0xD7E7,\n\t35782 - 11905: 0xCAB6,\n\t35783 - 11905: 0xD79C,\n\t35784 - 11905: 0xD5A9,\n\t35785 - 11905: 0xCBDF,\n\t35786 - 11905: 0xD5EF,\n\t35787 - 11905: 0xDAAE,\n\t35788 - 11905: 0xD6DF,\n\t35789 - 11905: 0xB4CA,\n\t35790 - 11905: 0xDAB0,\n\t35791 - 11905: 0xDAAF,\n\t35792 - 11905: 0xD79D,\n\t35793 - 11905: 0xD2EB,\n\t35794 - 11905: 0xDAB1,\n\t35795 - 11905: 0xDAB2,\n\t35796 - 11905: 0xDAB3,\n\t35797 - 11905: 0xCAD4,\n\t35798 - 11905: 0xDAB4,\n\t35799 - 11905: 0xCAAB,\n\t35800 - 11905: 0xDAB5,\n\t35801 - 11905: 0xDAB6,\n\t35802 - 11905: 0xB3CF,\n\t35803 - 11905: 0xD6EF,\n\t35804 - 11905: 0xDAB7,\n\t35805 - 11905: 0xBBB0,\n\t35806 - 11905: 0xB5AE,\n\t35807 - 11905: 0xDAB8,\n\t35808 - 11905: 0xDAB9,\n\t35809 - 11905: 0xB9EE,\n\t35810 - 11905: 0xD1AF,\n\t35811 - 11905: 0xD2E8,\n\t35812 - 11905: 0xDABA,\n\t35813 - 11905: 0xB8C3,\n\t35814 - 11905: 0xCFEA,\n\t35815 - 11905: 0xB2EF,\n\t35816 - 11905: 0xDABB,\n\t35817 - 11905: 0xDABC,\n\t35818 - 11905: 0xD79E,\n\t35819 - 11905: 0xBDEB,\n\t35820 - 11905: 0xCEDC,\n\t35821 - 11905: 0xD3EF,\n\t35822 - 11905: 0xDABD,\n\t35823 - 11905: 0xCEF3,\n\t35824 - 11905: 0xDABE,\n\t35825 - 11905: 0xD3D5,\n\t35826 - 11905: 0xBBE5,\n\t35827 - 11905: 0xDABF,\n\t35828 - 11905: 0xCBB5,\n\t35829 - 11905: 0xCBD0,\n\t35830 - 11905: 0xDAC0,\n\t35831 - 11905: 0xC7EB,\n\t35832 - 11905: 0xD6EE,\n\t35833 - 11905: 0xDAC1,\n\t35834 - 11905: 0xC5B5,\n\t35835 - 11905: 0xB6C1,\n\t35836 - 11905: 0xDAC2,\n\t35837 - 11905: 0xB7CC,\n\t35838 - 11905: 0xBFCE,\n\t35839 - 11905: 0xDAC3,\n\t35840 - 11905: 0xDAC4,\n\t35841 - 11905: 0xCBAD,\n\t35842 - 11905: 0xDAC5,\n\t35843 - 11905: 0xB5F7,\n\t35844 - 11905: 0xDAC6,\n\t35845 - 11905: 0xC1C2,\n\t35846 - 11905: 0xD7BB,\n\t35847 - 11905: 0xDAC7,\n\t35848 - 11905: 0xCCB8,\n\t35849 - 11905: 0xD79F,\n\t35850 - 11905: 0xD2EA,\n\t35851 - 11905: 0xC4B1,\n\t35852 - 11905: 0xDAC8,\n\t35853 - 11905: 0xB5FD,\n\t35854 - 11905: 0xBBD1,\n\t35855 - 11905: 0xDAC9,\n\t35856 - 11905: 0xD0B3,\n\t35857 - 11905: 0xDACA,\n\t35858 - 11905: 0xDACB,\n\t35859 - 11905: 0xCEBD,\n\t35860 - 11905: 0xDACC,\n\t35861 - 11905: 0xDACD,\n\t35862 - 11905: 0xDACE,\n\t35863 - 11905: 0xB2F7,\n\t35864 - 11905: 0xDAD1,\n\t35865 - 11905: 0xDACF,\n\t35866 - 11905: 0xD1E8,\n\t35867 - 11905: 0xDAD0,\n\t35868 - 11905: 0xC3D5,\n\t35869 - 11905: 0xDAD2,\n\t35870 - 11905: 0xD7A0,\n\t35871 - 11905: 0xDAD3,\n\t35872 - 11905: 0xDAD4,\n\t35873 - 11905: 0xDAD5,\n\t35874 - 11905: 0xD0BB,\n\t35875 - 11905: 0xD2A5,\n\t35876 - 11905: 0xB0F9,\n\t35877 - 11905: 0xDAD6,\n\t35878 - 11905: 0xC7AB,\n\t35879 - 11905: 0xDAD7,\n\t35880 - 11905: 0xBDF7,\n\t35881 - 11905: 0xC3A1,\n\t35882 - 11905: 0xDAD8,\n\t35883 - 11905: 0xDAD9,\n\t35884 - 11905: 0xC3FD,\n\t35885 - 11905: 0xCCB7,\n\t35886 - 11905: 0xDADA,\n\t35887 - 11905: 0xDADB,\n\t35888 - 11905: 0xC0BE,\n\t35889 - 11905: 0xC6D7,\n\t35890 - 11905: 0xDADC,\n\t35891 - 11905: 0xDADD,\n\t35892 - 11905: 0xC7B4,\n\t35893 - 11905: 0xDADE,\n\t35894 - 11905: 0xDADF,\n\t35895 - 11905: 0xB9C8,\n\t35896 - 11905: 0xD840,\n\t35897 - 11905: 0xD841,\n\t35898 - 11905: 0xD842,\n\t35899 - 11905: 0xD843,\n\t35900 - 11905: 0xD844,\n\t35901 - 11905: 0xD845,\n\t35902 - 11905: 0xD846,\n\t35903 - 11905: 0xD847,\n\t35904 - 11905: 0xD848,\n\t35905 - 11905: 0xBBED,\n\t35906 - 11905: 0xD849,\n\t35907 - 11905: 0xD84A,\n\t35908 - 11905: 0xD84B,\n\t35909 - 11905: 0xD84C,\n\t35910 - 11905: 0xB6B9,\n\t35911 - 11905: 0xF4F8,\n\t35912 - 11905: 0xD84D,\n\t35913 - 11905: 0xF4F9,\n\t35914 - 11905: 0xD84E,\n\t35915 - 11905: 0xD84F,\n\t35916 - 11905: 0xCDE3,\n\t35917 - 11905: 0xD850,\n\t35918 - 11905: 0xD851,\n\t35919 - 11905: 0xD852,\n\t35920 - 11905: 0xD853,\n\t35921 - 11905: 0xD854,\n\t35922 - 11905: 0xD855,\n\t35923 - 11905: 0xD856,\n\t35924 - 11905: 0xD857,\n\t35925 - 11905: 0xF5B9,\n\t35926 - 11905: 0xD858,\n\t35927 - 11905: 0xD859,\n\t35928 - 11905: 0xD85A,\n\t35929 - 11905: 0xD85B,\n\t35930 - 11905: 0xEBE0,\n\t35931 - 11905: 0xD85C,\n\t35932 - 11905: 0xD85D,\n\t35933 - 11905: 0xD85E,\n\t35934 - 11905: 0xD85F,\n\t35935 - 11905: 0xD860,\n\t35936 - 11905: 0xD861,\n\t35937 - 11905: 0xCFF3,\n\t35938 - 11905: 0xBBBF,\n\t35939 - 11905: 0xD862,\n\t35940 - 11905: 0xD863,\n\t35941 - 11905: 0xD864,\n\t35942 - 11905: 0xD865,\n\t35943 - 11905: 0xD866,\n\t35944 - 11905: 0xD867,\n\t35945 - 11905: 0xD868,\n\t35946 - 11905: 0xBAC0,\n\t35947 - 11905: 0xD4A5,\n\t35948 - 11905: 0xD869,\n\t35949 - 11905: 0xD86A,\n\t35950 - 11905: 0xD86B,\n\t35951 - 11905: 0xD86C,\n\t35952 - 11905: 0xD86D,\n\t35953 - 11905: 0xD86E,\n\t35954 - 11905: 0xD86F,\n\t35955 - 11905: 0xE1D9,\n\t35956 - 11905: 0xD870,\n\t35957 - 11905: 0xD871,\n\t35958 - 11905: 0xD872,\n\t35959 - 11905: 0xD873,\n\t35960 - 11905: 0xF5F4,\n\t35961 - 11905: 0xB1AA,\n\t35962 - 11905: 0xB2F2,\n\t35963 - 11905: 0xD874,\n\t35964 - 11905: 0xD875,\n\t35965 - 11905: 0xD876,\n\t35966 - 11905: 0xD877,\n\t35967 - 11905: 0xD878,\n\t35968 - 11905: 0xD879,\n\t35969 - 11905: 0xD87A,\n\t35970 - 11905: 0xF5F5,\n\t35971 - 11905: 0xD87B,\n\t35972 - 11905: 0xD87C,\n\t35973 - 11905: 0xF5F7,\n\t35974 - 11905: 0xD87D,\n\t35975 - 11905: 0xD87E,\n\t35976 - 11905: 0xD880,\n\t35977 - 11905: 0xBAD1,\n\t35978 - 11905: 0xF5F6,\n\t35979 - 11905: 0xD881,\n\t35980 - 11905: 0xC3B2,\n\t35981 - 11905: 0xD882,\n\t35982 - 11905: 0xD883,\n\t35983 - 11905: 0xD884,\n\t35984 - 11905: 0xD885,\n\t35985 - 11905: 0xD886,\n\t35986 - 11905: 0xD887,\n\t35987 - 11905: 0xD888,\n\t35988 - 11905: 0xF5F9,\n\t35989 - 11905: 0xD889,\n\t35990 - 11905: 0xD88A,\n\t35991 - 11905: 0xD88B,\n\t35992 - 11905: 0xF5F8,\n\t35993 - 11905: 0xD88C,\n\t35994 - 11905: 0xD88D,\n\t35995 - 11905: 0xD88E,\n\t35996 - 11905: 0xD88F,\n\t35997 - 11905: 0xD890,\n\t35998 - 11905: 0xD891,\n\t35999 - 11905: 0xD892,\n\t36000 - 11905: 0xD893,\n\t36001 - 11905: 0xD894,\n\t36002 - 11905: 0xD895,\n\t36003 - 11905: 0xD896,\n\t36004 - 11905: 0xD897,\n\t36005 - 11905: 0xD898,\n\t36006 - 11905: 0xD899,\n\t36007 - 11905: 0xD89A,\n\t36008 - 11905: 0xD89B,\n\t36009 - 11905: 0xD89C,\n\t36010 - 11905: 0xD89D,\n\t36011 - 11905: 0xD89E,\n\t36012 - 11905: 0xD89F,\n\t36013 - 11905: 0xD8A0,\n\t36014 - 11905: 0xD940,\n\t36015 - 11905: 0xD941,\n\t36016 - 11905: 0xD942,\n\t36017 - 11905: 0xD943,\n\t36018 - 11905: 0xD944,\n\t36019 - 11905: 0xD945,\n\t36020 - 11905: 0xD946,\n\t36021 - 11905: 0xD947,\n\t36022 - 11905: 0xD948,\n\t36023 - 11905: 0xD949,\n\t36024 - 11905: 0xD94A,\n\t36025 - 11905: 0xD94B,\n\t36026 - 11905: 0xD94C,\n\t36027 - 11905: 0xD94D,\n\t36028 - 11905: 0xD94E,\n\t36029 - 11905: 0xD94F,\n\t36030 - 11905: 0xD950,\n\t36031 - 11905: 0xD951,\n\t36032 - 11905: 0xD952,\n\t36033 - 11905: 0xD953,\n\t36034 - 11905: 0xD954,\n\t36035 - 11905: 0xD955,\n\t36036 - 11905: 0xD956,\n\t36037 - 11905: 0xD957,\n\t36038 - 11905: 0xD958,\n\t36039 - 11905: 0xD959,\n\t36040 - 11905: 0xD95A,\n\t36041 - 11905: 0xD95B,\n\t36042 - 11905: 0xD95C,\n\t36043 - 11905: 0xD95D,\n\t36044 - 11905: 0xD95E,\n\t36045 - 11905: 0xD95F,\n\t36046 - 11905: 0xD960,\n\t36047 - 11905: 0xD961,\n\t36048 - 11905: 0xD962,\n\t36049 - 11905: 0xD963,\n\t36050 - 11905: 0xD964,\n\t36051 - 11905: 0xD965,\n\t36052 - 11905: 0xD966,\n\t36053 - 11905: 0xD967,\n\t36054 - 11905: 0xD968,\n\t36055 - 11905: 0xD969,\n\t36056 - 11905: 0xD96A,\n\t36057 - 11905: 0xD96B,\n\t36058 - 11905: 0xD96C,\n\t36059 - 11905: 0xD96D,\n\t36060 - 11905: 0xD96E,\n\t36061 - 11905: 0xD96F,\n\t36062 - 11905: 0xD970,\n\t36063 - 11905: 0xD971,\n\t36064 - 11905: 0xD972,\n\t36065 - 11905: 0xD973,\n\t36066 - 11905: 0xD974,\n\t36067 - 11905: 0xD975,\n\t36068 - 11905: 0xD976,\n\t36069 - 11905: 0xD977,\n\t36070 - 11905: 0xD978,\n\t36071 - 11905: 0xD979,\n\t36072 - 11905: 0xD97A,\n\t36073 - 11905: 0xD97B,\n\t36074 - 11905: 0xD97C,\n\t36075 - 11905: 0xD97D,\n\t36076 - 11905: 0xD97E,\n\t36077 - 11905: 0xD980,\n\t36078 - 11905: 0xD981,\n\t36079 - 11905: 0xD982,\n\t36080 - 11905: 0xD983,\n\t36081 - 11905: 0xD984,\n\t36082 - 11905: 0xD985,\n\t36083 - 11905: 0xD986,\n\t36084 - 11905: 0xD987,\n\t36085 - 11905: 0xD988,\n\t36086 - 11905: 0xD989,\n\t36087 - 11905: 0xD98A,\n\t36088 - 11905: 0xD98B,\n\t36089 - 11905: 0xD98C,\n\t36090 - 11905: 0xD98D,\n\t36091 - 11905: 0xD98E,\n\t36092 - 11905: 0xD98F,\n\t36093 - 11905: 0xD990,\n\t36094 - 11905: 0xD991,\n\t36095 - 11905: 0xD992,\n\t36096 - 11905: 0xD993,\n\t36097 - 11905: 0xD994,\n\t36098 - 11905: 0xD995,\n\t36099 - 11905: 0xD996,\n\t36100 - 11905: 0xD997,\n\t36101 - 11905: 0xD998,\n\t36102 - 11905: 0xD999,\n\t36103 - 11905: 0xD99A,\n\t36104 - 11905: 0xD99B,\n\t36105 - 11905: 0xD99C,\n\t36106 - 11905: 0xD99D,\n\t36107 - 11905: 0xD99E,\n\t36108 - 11905: 0xD99F,\n\t36109 - 11905: 0xD9A0,\n\t36110 - 11905: 0xDA40,\n\t36111 - 11905: 0xDA41,\n\t36112 - 11905: 0xDA42,\n\t36113 - 11905: 0xDA43,\n\t36114 - 11905: 0xDA44,\n\t36115 - 11905: 0xDA45,\n\t36116 - 11905: 0xDA46,\n\t36117 - 11905: 0xDA47,\n\t36118 - 11905: 0xDA48,\n\t36119 - 11905: 0xDA49,\n\t36120 - 11905: 0xDA4A,\n\t36121 - 11905: 0xDA4B,\n\t36122 - 11905: 0xDA4C,\n\t36123 - 11905: 0xDA4D,\n\t36124 - 11905: 0xDA4E,\n\t36125 - 11905: 0xB1B4,\n\t36126 - 11905: 0xD5EA,\n\t36127 - 11905: 0xB8BA,\n\t36128 - 11905: 0xDA4F,\n\t36129 - 11905: 0xB9B1,\n\t36130 - 11905: 0xB2C6,\n\t36131 - 11905: 0xD4F0,\n\t36132 - 11905: 0xCFCD,\n\t36133 - 11905: 0xB0DC,\n\t36134 - 11905: 0xD5CB,\n\t36135 - 11905: 0xBBF5,\n\t36136 - 11905: 0xD6CA,\n\t36137 - 11905: 0xB7B7,\n\t36138 - 11905: 0xCCB0,\n\t36139 - 11905: 0xC6B6,\n\t36140 - 11905: 0xB1E1,\n\t36141 - 11905: 0xB9BA,\n\t36142 - 11905: 0xD6FC,\n\t36143 - 11905: 0xB9E1,\n\t36144 - 11905: 0xB7A1,\n\t36145 - 11905: 0xBCFA,\n\t36146 - 11905: 0xEADA,\n\t36147 - 11905: 0xEADB,\n\t36148 - 11905: 0xCCF9,\n\t36149 - 11905: 0xB9F3,\n\t36150 - 11905: 0xEADC,\n\t36151 - 11905: 0xB4FB,\n\t36152 - 11905: 0xC3B3,\n\t36153 - 11905: 0xB7D1,\n\t36154 - 11905: 0xBAD8,\n\t36155 - 11905: 0xEADD,\n\t36156 - 11905: 0xD4F4,\n\t36157 - 11905: 0xEADE,\n\t36158 - 11905: 0xBCD6,\n\t36159 - 11905: 0xBBDF,\n\t36160 - 11905: 0xEADF,\n\t36161 - 11905: 0xC1DE,\n\t36162 - 11905: 0xC2B8,\n\t36163 - 11905: 0xD4DF,\n\t36164 - 11905: 0xD7CA,\n\t36165 - 11905: 0xEAE0,\n\t36166 - 11905: 0xEAE1,\n\t36167 - 11905: 0xEAE4,\n\t36168 - 11905: 0xEAE2,\n\t36169 - 11905: 0xEAE3,\n\t36170 - 11905: 0xC9DE,\n\t36171 - 11905: 0xB8B3,\n\t36172 - 11905: 0xB6C4,\n\t36173 - 11905: 0xEAE5,\n\t36174 - 11905: 0xCAEA,\n\t36175 - 11905: 0xC9CD,\n\t36176 - 11905: 0xB4CD,\n\t36177 - 11905: 0xDA50,\n\t36178 - 11905: 0xDA51,\n\t36179 - 11905: 0xE2D9,\n\t36180 - 11905: 0xC5E2,\n\t36181 - 11905: 0xEAE6,\n\t36182 - 11905: 0xC0B5,\n\t36183 - 11905: 0xDA52,\n\t36184 - 11905: 0xD7B8,\n\t36185 - 11905: 0xEAE7,\n\t36186 - 11905: 0xD7AC,\n\t36187 - 11905: 0xC8FC,\n\t36188 - 11905: 0xD8D3,\n\t36189 - 11905: 0xD8CD,\n\t36190 - 11905: 0xD4DE,\n\t36191 - 11905: 0xDA53,\n\t36192 - 11905: 0xD4F9,\n\t36193 - 11905: 0xC9C4,\n\t36194 - 11905: 0xD3AE,\n\t36195 - 11905: 0xB8D3,\n\t36196 - 11905: 0xB3E0,\n\t36197 - 11905: 0xDA54,\n\t36198 - 11905: 0xC9E2,\n\t36199 - 11905: 0xF4F6,\n\t36200 - 11905: 0xDA55,\n\t36201 - 11905: 0xDA56,\n\t36202 - 11905: 0xDA57,\n\t36203 - 11905: 0xBAD5,\n\t36204 - 11905: 0xDA58,\n\t36205 - 11905: 0xF4F7,\n\t36206 - 11905: 0xDA59,\n\t36207 - 11905: 0xDA5A,\n\t36208 - 11905: 0xD7DF,\n\t36209 - 11905: 0xDA5B,\n\t36210 - 11905: 0xDA5C,\n\t36211 - 11905: 0xF4F1,\n\t36212 - 11905: 0xB8B0,\n\t36213 - 11905: 0xD5D4,\n\t36214 - 11905: 0xB8CF,\n\t36215 - 11905: 0xC6F0,\n\t36216 - 11905: 0xDA5D,\n\t36217 - 11905: 0xDA5E,\n\t36218 - 11905: 0xDA5F,\n\t36219 - 11905: 0xDA60,\n\t36220 - 11905: 0xDA61,\n\t36221 - 11905: 0xDA62,\n\t36222 - 11905: 0xDA63,\n\t36223 - 11905: 0xDA64,\n\t36224 - 11905: 0xDA65,\n\t36225 - 11905: 0xB3C3,\n\t36226 - 11905: 0xDA66,\n\t36227 - 11905: 0xDA67,\n\t36228 - 11905: 0xF4F2,\n\t36229 - 11905: 0xB3AC,\n\t36230 - 11905: 0xDA68,\n\t36231 - 11905: 0xDA69,\n\t36232 - 11905: 0xDA6A,\n\t36233 - 11905: 0xDA6B,\n\t36234 - 11905: 0xD4BD,\n\t36235 - 11905: 0xC7F7,\n\t36236 - 11905: 0xDA6C,\n\t36237 - 11905: 0xDA6D,\n\t36238 - 11905: 0xDA6E,\n\t36239 - 11905: 0xDA6F,\n\t36240 - 11905: 0xDA70,\n\t36241 - 11905: 0xF4F4,\n\t36242 - 11905: 0xDA71,\n\t36243 - 11905: 0xDA72,\n\t36244 - 11905: 0xF4F3,\n\t36245 - 11905: 0xDA73,\n\t36246 - 11905: 0xDA74,\n\t36247 - 11905: 0xDA75,\n\t36248 - 11905: 0xDA76,\n\t36249 - 11905: 0xDA77,\n\t36250 - 11905: 0xDA78,\n\t36251 - 11905: 0xDA79,\n\t36252 - 11905: 0xDA7A,\n\t36253 - 11905: 0xDA7B,\n\t36254 - 11905: 0xDA7C,\n\t36255 - 11905: 0xCCCB,\n\t36256 - 11905: 0xDA7D,\n\t36257 - 11905: 0xDA7E,\n\t36258 - 11905: 0xDA80,\n\t36259 - 11905: 0xC8A4,\n\t36260 - 11905: 0xDA81,\n\t36261 - 11905: 0xDA82,\n\t36262 - 11905: 0xDA83,\n\t36263 - 11905: 0xDA84,\n\t36264 - 11905: 0xDA85,\n\t36265 - 11905: 0xDA86,\n\t36266 - 11905: 0xDA87,\n\t36267 - 11905: 0xDA88,\n\t36268 - 11905: 0xDA89,\n\t36269 - 11905: 0xDA8A,\n\t36270 - 11905: 0xDA8B,\n\t36271 - 11905: 0xDA8C,\n\t36272 - 11905: 0xDA8D,\n\t36273 - 11905: 0xF4F5,\n\t36274 - 11905: 0xDA8E,\n\t36275 - 11905: 0xD7E3,\n\t36276 - 11905: 0xC5BF,\n\t36277 - 11905: 0xF5C0,\n\t36278 - 11905: 0xDA8F,\n\t36279 - 11905: 0xDA90,\n\t36280 - 11905: 0xF5BB,\n\t36281 - 11905: 0xDA91,\n\t36282 - 11905: 0xF5C3,\n\t36283 - 11905: 0xDA92,\n\t36284 - 11905: 0xF5C2,\n\t36285 - 11905: 0xDA93,\n\t36286 - 11905: 0xD6BA,\n\t36287 - 11905: 0xF5C1,\n\t36288 - 11905: 0xDA94,\n\t36289 - 11905: 0xDA95,\n\t36290 - 11905: 0xDA96,\n\t36291 - 11905: 0xD4BE,\n\t36292 - 11905: 0xF5C4,\n\t36293 - 11905: 0xDA97,\n\t36294 - 11905: 0xF5CC,\n\t36295 - 11905: 0xDA98,\n\t36296 - 11905: 0xDA99,\n\t36297 - 11905: 0xDA9A,\n\t36298 - 11905: 0xDA9B,\n\t36299 - 11905: 0xB0CF,\n\t36300 - 11905: 0xB5F8,\n\t36301 - 11905: 0xDA9C,\n\t36302 - 11905: 0xF5C9,\n\t36303 - 11905: 0xF5CA,\n\t36304 - 11905: 0xDA9D,\n\t36305 - 11905: 0xC5DC,\n\t36306 - 11905: 0xDA9E,\n\t36307 - 11905: 0xDA9F,\n\t36308 - 11905: 0xDAA0,\n\t36309 - 11905: 0xDB40,\n\t36310 - 11905: 0xF5C5,\n\t36311 - 11905: 0xF5C6,\n\t36312 - 11905: 0xDB41,\n\t36313 - 11905: 0xDB42,\n\t36314 - 11905: 0xF5C7,\n\t36315 - 11905: 0xF5CB,\n\t36316 - 11905: 0xDB43,\n\t36317 - 11905: 0xBEE0,\n\t36318 - 11905: 0xF5C8,\n\t36319 - 11905: 0xB8FA,\n\t36320 - 11905: 0xDB44,\n\t36321 - 11905: 0xDB45,\n\t36322 - 11905: 0xDB46,\n\t36323 - 11905: 0xF5D0,\n\t36324 - 11905: 0xF5D3,\n\t36325 - 11905: 0xDB47,\n\t36326 - 11905: 0xDB48,\n\t36327 - 11905: 0xDB49,\n\t36328 - 11905: 0xBFE7,\n\t36329 - 11905: 0xDB4A,\n\t36330 - 11905: 0xB9F2,\n\t36331 - 11905: 0xF5BC,\n\t36332 - 11905: 0xF5CD,\n\t36333 - 11905: 0xDB4B,\n\t36334 - 11905: 0xDB4C,\n\t36335 - 11905: 0xC2B7,\n\t36336 - 11905: 0xDB4D,\n\t36337 - 11905: 0xDB4E,\n\t36338 - 11905: 0xDB4F,\n\t36339 - 11905: 0xCCF8,\n\t36340 - 11905: 0xDB50,\n\t36341 - 11905: 0xBCF9,\n\t36342 - 11905: 0xDB51,\n\t36343 - 11905: 0xF5CE,\n\t36344 - 11905: 0xF5CF,\n\t36345 - 11905: 0xF5D1,\n\t36346 - 11905: 0xB6E5,\n\t36347 - 11905: 0xF5D2,\n\t36348 - 11905: 0xDB52,\n\t36349 - 11905: 0xF5D5,\n\t36350 - 11905: 0xDB53,\n\t36351 - 11905: 0xDB54,\n\t36352 - 11905: 0xDB55,\n\t36353 - 11905: 0xDB56,\n\t36354 - 11905: 0xDB57,\n\t36355 - 11905: 0xDB58,\n\t36356 - 11905: 0xDB59,\n\t36357 - 11905: 0xF5BD,\n\t36358 - 11905: 0xDB5A,\n\t36359 - 11905: 0xDB5B,\n\t36360 - 11905: 0xDB5C,\n\t36361 - 11905: 0xF5D4,\n\t36362 - 11905: 0xD3BB,\n\t36363 - 11905: 0xDB5D,\n\t36364 - 11905: 0xB3EC,\n\t36365 - 11905: 0xDB5E,\n\t36366 - 11905: 0xDB5F,\n\t36367 - 11905: 0xCCA4,\n\t36368 - 11905: 0xDB60,\n\t36369 - 11905: 0xDB61,\n\t36370 - 11905: 0xDB62,\n\t36371 - 11905: 0xDB63,\n\t36372 - 11905: 0xF5D6,\n\t36373 - 11905: 0xDB64,\n\t36374 - 11905: 0xDB65,\n\t36375 - 11905: 0xDB66,\n\t36376 - 11905: 0xDB67,\n\t36377 - 11905: 0xDB68,\n\t36378 - 11905: 0xDB69,\n\t36379 - 11905: 0xDB6A,\n\t36380 - 11905: 0xDB6B,\n\t36381 - 11905: 0xF5D7,\n\t36382 - 11905: 0xBEE1,\n\t36383 - 11905: 0xF5D8,\n\t36384 - 11905: 0xDB6C,\n\t36385 - 11905: 0xDB6D,\n\t36386 - 11905: 0xCCDF,\n\t36387 - 11905: 0xF5DB,\n\t36388 - 11905: 0xDB6E,\n\t36389 - 11905: 0xDB6F,\n\t36390 - 11905: 0xDB70,\n\t36391 - 11905: 0xDB71,\n\t36392 - 11905: 0xDB72,\n\t36393 - 11905: 0xB2C8,\n\t36394 - 11905: 0xD7D9,\n\t36395 - 11905: 0xDB73,\n\t36396 - 11905: 0xF5D9,\n\t36397 - 11905: 0xDB74,\n\t36398 - 11905: 0xF5DA,\n\t36399 - 11905: 0xF5DC,\n\t36400 - 11905: 0xDB75,\n\t36401 - 11905: 0xF5E2,\n\t36402 - 11905: 0xDB76,\n\t36403 - 11905: 0xDB77,\n\t36404 - 11905: 0xDB78,\n\t36405 - 11905: 0xF5E0,\n\t36406 - 11905: 0xDB79,\n\t36407 - 11905: 0xDB7A,\n\t36408 - 11905: 0xDB7B,\n\t36409 - 11905: 0xF5DF,\n\t36410 - 11905: 0xF5DD,\n\t36411 - 11905: 0xDB7C,\n\t36412 - 11905: 0xDB7D,\n\t36413 - 11905: 0xF5E1,\n\t36414 - 11905: 0xDB7E,\n\t36415 - 11905: 0xDB80,\n\t36416 - 11905: 0xF5DE,\n\t36417 - 11905: 0xF5E4,\n\t36418 - 11905: 0xF5E5,\n\t36419 - 11905: 0xDB81,\n\t36420 - 11905: 0xCCE3,\n\t36421 - 11905: 0xDB82,\n\t36422 - 11905: 0xDB83,\n\t36423 - 11905: 0xE5BF,\n\t36424 - 11905: 0xB5B8,\n\t36425 - 11905: 0xF5E3,\n\t36426 - 11905: 0xF5E8,\n\t36427 - 11905: 0xCCA3,\n\t36428 - 11905: 0xDB84,\n\t36429 - 11905: 0xDB85,\n\t36430 - 11905: 0xDB86,\n\t36431 - 11905: 0xDB87,\n\t36432 - 11905: 0xDB88,\n\t36433 - 11905: 0xF5E6,\n\t36434 - 11905: 0xF5E7,\n\t36435 - 11905: 0xDB89,\n\t36436 - 11905: 0xDB8A,\n\t36437 - 11905: 0xDB8B,\n\t36438 - 11905: 0xDB8C,\n\t36439 - 11905: 0xDB8D,\n\t36440 - 11905: 0xDB8E,\n\t36441 - 11905: 0xF5BE,\n\t36442 - 11905: 0xDB8F,\n\t36443 - 11905: 0xDB90,\n\t36444 - 11905: 0xDB91,\n\t36445 - 11905: 0xDB92,\n\t36446 - 11905: 0xDB93,\n\t36447 - 11905: 0xDB94,\n\t36448 - 11905: 0xDB95,\n\t36449 - 11905: 0xDB96,\n\t36450 - 11905: 0xDB97,\n\t36451 - 11905: 0xDB98,\n\t36452 - 11905: 0xDB99,\n\t36453 - 11905: 0xDB9A,\n\t36454 - 11905: 0xB1C4,\n\t36455 - 11905: 0xDB9B,\n\t36456 - 11905: 0xDB9C,\n\t36457 - 11905: 0xF5BF,\n\t36458 - 11905: 0xDB9D,\n\t36459 - 11905: 0xDB9E,\n\t36460 - 11905: 0xB5C5,\n\t36461 - 11905: 0xB2E4,\n\t36462 - 11905: 0xDB9F,\n\t36463 - 11905: 0xF5EC,\n\t36464 - 11905: 0xF5E9,\n\t36465 - 11905: 0xDBA0,\n\t36466 - 11905: 0xB6D7,\n\t36467 - 11905: 0xDC40,\n\t36468 - 11905: 0xF5ED,\n\t36469 - 11905: 0xDC41,\n\t36470 - 11905: 0xF5EA,\n\t36471 - 11905: 0xDC42,\n\t36472 - 11905: 0xDC43,\n\t36473 - 11905: 0xDC44,\n\t36474 - 11905: 0xDC45,\n\t36475 - 11905: 0xDC46,\n\t36476 - 11905: 0xF5EB,\n\t36477 - 11905: 0xDC47,\n\t36478 - 11905: 0xDC48,\n\t36479 - 11905: 0xB4DA,\n\t36480 - 11905: 0xDC49,\n\t36481 - 11905: 0xD4EA,\n\t36482 - 11905: 0xDC4A,\n\t36483 - 11905: 0xDC4B,\n\t36484 - 11905: 0xDC4C,\n\t36485 - 11905: 0xF5EE,\n\t36486 - 11905: 0xDC4D,\n\t36487 - 11905: 0xB3F9,\n\t36488 - 11905: 0xDC4E,\n\t36489 - 11905: 0xDC4F,\n\t36490 - 11905: 0xDC50,\n\t36491 - 11905: 0xDC51,\n\t36492 - 11905: 0xDC52,\n\t36493 - 11905: 0xDC53,\n\t36494 - 11905: 0xDC54,\n\t36495 - 11905: 0xF5EF,\n\t36496 - 11905: 0xF5F1,\n\t36497 - 11905: 0xDC55,\n\t36498 - 11905: 0xDC56,\n\t36499 - 11905: 0xDC57,\n\t36500 - 11905: 0xF5F0,\n\t36501 - 11905: 0xDC58,\n\t36502 - 11905: 0xDC59,\n\t36503 - 11905: 0xDC5A,\n\t36504 - 11905: 0xDC5B,\n\t36505 - 11905: 0xDC5C,\n\t36506 - 11905: 0xDC5D,\n\t36507 - 11905: 0xDC5E,\n\t36508 - 11905: 0xF5F2,\n\t36509 - 11905: 0xDC5F,\n\t36510 - 11905: 0xF5F3,\n\t36511 - 11905: 0xDC60,\n\t36512 - 11905: 0xDC61,\n\t36513 - 11905: 0xDC62,\n\t36514 - 11905: 0xDC63,\n\t36515 - 11905: 0xDC64,\n\t36516 - 11905: 0xDC65,\n\t36517 - 11905: 0xDC66,\n\t36518 - 11905: 0xDC67,\n\t36519 - 11905: 0xDC68,\n\t36520 - 11905: 0xDC69,\n\t36521 - 11905: 0xDC6A,\n\t36522 - 11905: 0xDC6B,\n\t36523 - 11905: 0xC9ED,\n\t36524 - 11905: 0xB9AA,\n\t36525 - 11905: 0xDC6C,\n\t36526 - 11905: 0xDC6D,\n\t36527 - 11905: 0xC7FB,\n\t36528 - 11905: 0xDC6E,\n\t36529 - 11905: 0xDC6F,\n\t36530 - 11905: 0xB6E3,\n\t36531 - 11905: 0xDC70,\n\t36532 - 11905: 0xDC71,\n\t36533 - 11905: 0xDC72,\n\t36534 - 11905: 0xDC73,\n\t36535 - 11905: 0xDC74,\n\t36536 - 11905: 0xDC75,\n\t36537 - 11905: 0xDC76,\n\t36538 - 11905: 0xCCC9,\n\t36539 - 11905: 0xDC77,\n\t36540 - 11905: 0xDC78,\n\t36541 - 11905: 0xDC79,\n\t36542 - 11905: 0xDC7A,\n\t36543 - 11905: 0xDC7B,\n\t36544 - 11905: 0xDC7C,\n\t36545 - 11905: 0xDC7D,\n\t36546 - 11905: 0xDC7E,\n\t36547 - 11905: 0xDC80,\n\t36548 - 11905: 0xDC81,\n\t36549 - 11905: 0xDC82,\n\t36550 - 11905: 0xDC83,\n\t36551 - 11905: 0xDC84,\n\t36552 - 11905: 0xDC85,\n\t36553 - 11905: 0xDC86,\n\t36554 - 11905: 0xDC87,\n\t36555 - 11905: 0xDC88,\n\t36556 - 11905: 0xDC89,\n\t36557 - 11905: 0xDC8A,\n\t36558 - 11905: 0xEAA6,\n\t36559 - 11905: 0xDC8B,\n\t36560 - 11905: 0xDC8C,\n\t36561 - 11905: 0xDC8D,\n\t36562 - 11905: 0xDC8E,\n\t36563 - 11905: 0xDC8F,\n\t36564 - 11905: 0xDC90,\n\t36565 - 11905: 0xDC91,\n\t36566 - 11905: 0xDC92,\n\t36567 - 11905: 0xDC93,\n\t36568 - 11905: 0xDC94,\n\t36569 - 11905: 0xDC95,\n\t36570 - 11905: 0xDC96,\n\t36571 - 11905: 0xDC97,\n\t36572 - 11905: 0xDC98,\n\t36573 - 11905: 0xDC99,\n\t36574 - 11905: 0xDC9A,\n\t36575 - 11905: 0xDC9B,\n\t36576 - 11905: 0xDC9C,\n\t36577 - 11905: 0xDC9D,\n\t36578 - 11905: 0xDC9E,\n\t36579 - 11905: 0xDC9F,\n\t36580 - 11905: 0xDCA0,\n\t36581 - 11905: 0xDD40,\n\t36582 - 11905: 0xDD41,\n\t36583 - 11905: 0xDD42,\n\t36584 - 11905: 0xDD43,\n\t36585 - 11905: 0xDD44,\n\t36586 - 11905: 0xDD45,\n\t36587 - 11905: 0xDD46,\n\t36588 - 11905: 0xDD47,\n\t36589 - 11905: 0xDD48,\n\t36590 - 11905: 0xDD49,\n\t36591 - 11905: 0xDD4A,\n\t36592 - 11905: 0xDD4B,\n\t36593 - 11905: 0xDD4C,\n\t36594 - 11905: 0xDD4D,\n\t36595 - 11905: 0xDD4E,\n\t36596 - 11905: 0xDD4F,\n\t36597 - 11905: 0xDD50,\n\t36598 - 11905: 0xDD51,\n\t36599 - 11905: 0xDD52,\n\t36600 - 11905: 0xDD53,\n\t36601 - 11905: 0xDD54,\n\t36602 - 11905: 0xDD55,\n\t36603 - 11905: 0xDD56,\n\t36604 - 11905: 0xDD57,\n\t36605 - 11905: 0xDD58,\n\t36606 - 11905: 0xDD59,\n\t36607 - 11905: 0xDD5A,\n\t36608 - 11905: 0xDD5B,\n\t36609 - 11905: 0xDD5C,\n\t36610 - 11905: 0xDD5D,\n\t36611 - 11905: 0xDD5E,\n\t36612 - 11905: 0xDD5F,\n\t36613 - 11905: 0xDD60,\n\t36614 - 11905: 0xDD61,\n\t36615 - 11905: 0xDD62,\n\t36616 - 11905: 0xDD63,\n\t36617 - 11905: 0xDD64,\n\t36618 - 11905: 0xDD65,\n\t36619 - 11905: 0xDD66,\n\t36620 - 11905: 0xDD67,\n\t36621 - 11905: 0xDD68,\n\t36622 - 11905: 0xDD69,\n\t36623 - 11905: 0xDD6A,\n\t36624 - 11905: 0xDD6B,\n\t36625 - 11905: 0xDD6C,\n\t36626 - 11905: 0xDD6D,\n\t36627 - 11905: 0xDD6E,\n\t36628 - 11905: 0xDD6F,\n\t36629 - 11905: 0xDD70,\n\t36630 - 11905: 0xDD71,\n\t36631 - 11905: 0xDD72,\n\t36632 - 11905: 0xDD73,\n\t36633 - 11905: 0xDD74,\n\t36634 - 11905: 0xDD75,\n\t36635 - 11905: 0xDD76,\n\t36636 - 11905: 0xDD77,\n\t36637 - 11905: 0xDD78,\n\t36638 - 11905: 0xDD79,\n\t36639 - 11905: 0xDD7A,\n\t36640 - 11905: 0xDD7B,\n\t36641 - 11905: 0xDD7C,\n\t36642 - 11905: 0xDD7D,\n\t36643 - 11905: 0xDD7E,\n\t36644 - 11905: 0xDD80,\n\t36645 - 11905: 0xDD81,\n\t36646 - 11905: 0xDD82,\n\t36647 - 11905: 0xDD83,\n\t36648 - 11905: 0xDD84,\n\t36649 - 11905: 0xDD85,\n\t36650 - 11905: 0xDD86,\n\t36651 - 11905: 0xDD87,\n\t36652 - 11905: 0xDD88,\n\t36653 - 11905: 0xDD89,\n\t36654 - 11905: 0xDD8A,\n\t36655 - 11905: 0xDD8B,\n\t36656 - 11905: 0xDD8C,\n\t36657 - 11905: 0xDD8D,\n\t36658 - 11905: 0xDD8E,\n\t36659 - 11905: 0xDD8F,\n\t36660 - 11905: 0xDD90,\n\t36661 - 11905: 0xDD91,\n\t36662 - 11905: 0xDD92,\n\t36663 - 11905: 0xDD93,\n\t36664 - 11905: 0xDD94,\n\t36665 - 11905: 0xDD95,\n\t36666 - 11905: 0xDD96,\n\t36667 - 11905: 0xDD97,\n\t36668 - 11905: 0xDD98,\n\t36669 - 11905: 0xDD99,\n\t36670 - 11905: 0xDD9A,\n\t36671 - 11905: 0xDD9B,\n\t36672 - 11905: 0xDD9C,\n\t36673 - 11905: 0xDD9D,\n\t36674 - 11905: 0xDD9E,\n\t36675 - 11905: 0xDD9F,\n\t36676 - 11905: 0xDDA0,\n\t36677 - 11905: 0xDE40,\n\t36678 - 11905: 0xDE41,\n\t36679 - 11905: 0xDE42,\n\t36680 - 11905: 0xDE43,\n\t36681 - 11905: 0xDE44,\n\t36682 - 11905: 0xDE45,\n\t36683 - 11905: 0xDE46,\n\t36684 - 11905: 0xDE47,\n\t36685 - 11905: 0xDE48,\n\t36686 - 11905: 0xDE49,\n\t36687 - 11905: 0xDE4A,\n\t36688 - 11905: 0xDE4B,\n\t36689 - 11905: 0xDE4C,\n\t36690 - 11905: 0xDE4D,\n\t36691 - 11905: 0xDE4E,\n\t36692 - 11905: 0xDE4F,\n\t36693 - 11905: 0xDE50,\n\t36694 - 11905: 0xDE51,\n\t36695 - 11905: 0xDE52,\n\t36696 - 11905: 0xDE53,\n\t36697 - 11905: 0xDE54,\n\t36698 - 11905: 0xDE55,\n\t36699 - 11905: 0xDE56,\n\t36700 - 11905: 0xDE57,\n\t36701 - 11905: 0xDE58,\n\t36702 - 11905: 0xDE59,\n\t36703 - 11905: 0xDE5A,\n\t36704 - 11905: 0xDE5B,\n\t36705 - 11905: 0xDE5C,\n\t36706 - 11905: 0xDE5D,\n\t36707 - 11905: 0xDE5E,\n\t36708 - 11905: 0xDE5F,\n\t36709 - 11905: 0xDE60,\n\t36710 - 11905: 0xB3B5,\n\t36711 - 11905: 0xD4FE,\n\t36712 - 11905: 0xB9EC,\n\t36713 - 11905: 0xD0F9,\n\t36714 - 11905: 0xDE61,\n\t36715 - 11905: 0xE9ED,\n\t36716 - 11905: 0xD7AA,\n\t36717 - 11905: 0xE9EE,\n\t36718 - 11905: 0xC2D6,\n\t36719 - 11905: 0xC8ED,\n\t36720 - 11905: 0xBAE4,\n\t36721 - 11905: 0xE9EF,\n\t36722 - 11905: 0xE9F0,\n\t36723 - 11905: 0xE9F1,\n\t36724 - 11905: 0xD6E1,\n\t36725 - 11905: 0xE9F2,\n\t36726 - 11905: 0xE9F3,\n\t36727 - 11905: 0xE9F5,\n\t36728 - 11905: 0xE9F4,\n\t36729 - 11905: 0xE9F6,\n\t36730 - 11905: 0xE9F7,\n\t36731 - 11905: 0xC7E1,\n\t36732 - 11905: 0xE9F8,\n\t36733 - 11905: 0xD4D8,\n\t36734 - 11905: 0xE9F9,\n\t36735 - 11905: 0xBDCE,\n\t36736 - 11905: 0xDE62,\n\t36737 - 11905: 0xE9FA,\n\t36738 - 11905: 0xE9FB,\n\t36739 - 11905: 0xBDCF,\n\t36740 - 11905: 0xE9FC,\n\t36741 - 11905: 0xB8A8,\n\t36742 - 11905: 0xC1BE,\n\t36743 - 11905: 0xE9FD,\n\t36744 - 11905: 0xB1B2,\n\t36745 - 11905: 0xBBD4,\n\t36746 - 11905: 0xB9F5,\n\t36747 - 11905: 0xE9FE,\n\t36748 - 11905: 0xDE63,\n\t36749 - 11905: 0xEAA1,\n\t36750 - 11905: 0xEAA2,\n\t36751 - 11905: 0xEAA3,\n\t36752 - 11905: 0xB7F8,\n\t36753 - 11905: 0xBCAD,\n\t36754 - 11905: 0xDE64,\n\t36755 - 11905: 0xCAE4,\n\t36756 - 11905: 0xE0CE,\n\t36757 - 11905: 0xD4AF,\n\t36758 - 11905: 0xCFBD,\n\t36759 - 11905: 0xD5B7,\n\t36760 - 11905: 0xEAA4,\n\t36761 - 11905: 0xD5DE,\n\t36762 - 11905: 0xEAA5,\n\t36763 - 11905: 0xD0C1,\n\t36764 - 11905: 0xB9BC,\n\t36765 - 11905: 0xDE65,\n\t36766 - 11905: 0xB4C7,\n\t36767 - 11905: 0xB1D9,\n\t36768 - 11905: 0xDE66,\n\t36769 - 11905: 0xDE67,\n\t36770 - 11905: 0xDE68,\n\t36771 - 11905: 0xC0B1,\n\t36772 - 11905: 0xDE69,\n\t36773 - 11905: 0xDE6A,\n\t36774 - 11905: 0xDE6B,\n\t36775 - 11905: 0xDE6C,\n\t36776 - 11905: 0xB1E6,\n\t36777 - 11905: 0xB1E7,\n\t36778 - 11905: 0xDE6D,\n\t36779 - 11905: 0xB1E8,\n\t36780 - 11905: 0xDE6E,\n\t36781 - 11905: 0xDE6F,\n\t36782 - 11905: 0xDE70,\n\t36783 - 11905: 0xDE71,\n\t36784 - 11905: 0xB3BD,\n\t36785 - 11905: 0xC8E8,\n\t36786 - 11905: 0xDE72,\n\t36787 - 11905: 0xDE73,\n\t36788 - 11905: 0xDE74,\n\t36789 - 11905: 0xDE75,\n\t36790 - 11905: 0xE5C1,\n\t36791 - 11905: 0xDE76,\n\t36792 - 11905: 0xDE77,\n\t36793 - 11905: 0xB1DF,\n\t36794 - 11905: 0xDE78,\n\t36795 - 11905: 0xDE79,\n\t36796 - 11905: 0xDE7A,\n\t36797 - 11905: 0xC1C9,\n\t36798 - 11905: 0xB4EF,\n\t36799 - 11905: 0xDE7B,\n\t36800 - 11905: 0xDE7C,\n\t36801 - 11905: 0xC7A8,\n\t36802 - 11905: 0xD3D8,\n\t36803 - 11905: 0xDE7D,\n\t36804 - 11905: 0xC6F9,\n\t36805 - 11905: 0xD1B8,\n\t36806 - 11905: 0xDE7E,\n\t36807 - 11905: 0xB9FD,\n\t36808 - 11905: 0xC2F5,\n\t36809 - 11905: 0xDE80,\n\t36810 - 11905: 0xDE81,\n\t36811 - 11905: 0xDE82,\n\t36812 - 11905: 0xDE83,\n\t36813 - 11905: 0xDE84,\n\t36814 - 11905: 0xD3AD,\n\t36815 - 11905: 0xDE85,\n\t36816 - 11905: 0xD4CB,\n\t36817 - 11905: 0xBDFC,\n\t36818 - 11905: 0xDE86,\n\t36819 - 11905: 0xE5C2,\n\t36820 - 11905: 0xB7B5,\n\t36821 - 11905: 0xE5C3,\n\t36822 - 11905: 0xDE87,\n\t36823 - 11905: 0xDE88,\n\t36824 - 11905: 0xBBB9,\n\t36825 - 11905: 0xD5E2,\n\t36826 - 11905: 0xDE89,\n\t36827 - 11905: 0xBDF8,\n\t36828 - 11905: 0xD4B6,\n\t36829 - 11905: 0xCEA5,\n\t36830 - 11905: 0xC1AC,\n\t36831 - 11905: 0xB3D9,\n\t36832 - 11905: 0xDE8A,\n\t36833 - 11905: 0xDE8B,\n\t36834 - 11905: 0xCCF6,\n\t36835 - 11905: 0xDE8C,\n\t36836 - 11905: 0xE5C6,\n\t36837 - 11905: 0xE5C4,\n\t36838 - 11905: 0xE5C8,\n\t36839 - 11905: 0xDE8D,\n\t36840 - 11905: 0xE5CA,\n\t36841 - 11905: 0xE5C7,\n\t36842 - 11905: 0xB5CF,\n\t36843 - 11905: 0xC6C8,\n\t36844 - 11905: 0xDE8E,\n\t36845 - 11905: 0xB5FC,\n\t36846 - 11905: 0xE5C5,\n\t36847 - 11905: 0xDE8F,\n\t36848 - 11905: 0xCAF6,\n\t36849 - 11905: 0xDE90,\n\t36850 - 11905: 0xDE91,\n\t36851 - 11905: 0xE5C9,\n\t36852 - 11905: 0xDE92,\n\t36853 - 11905: 0xDE93,\n\t36854 - 11905: 0xDE94,\n\t36855 - 11905: 0xC3D4,\n\t36856 - 11905: 0xB1C5,\n\t36857 - 11905: 0xBCA3,\n\t36858 - 11905: 0xDE95,\n\t36859 - 11905: 0xDE96,\n\t36860 - 11905: 0xDE97,\n\t36861 - 11905: 0xD7B7,\n\t36862 - 11905: 0xDE98,\n\t36863 - 11905: 0xDE99,\n\t36864 - 11905: 0xCDCB,\n\t36865 - 11905: 0xCBCD,\n\t36866 - 11905: 0xCACA,\n\t36867 - 11905: 0xCCD3,\n\t36868 - 11905: 0xE5CC,\n\t36869 - 11905: 0xE5CB,\n\t36870 - 11905: 0xC4E6,\n\t36871 - 11905: 0xDE9A,\n\t36872 - 11905: 0xDE9B,\n\t36873 - 11905: 0xD1A1,\n\t36874 - 11905: 0xD1B7,\n\t36875 - 11905: 0xE5CD,\n\t36876 - 11905: 0xDE9C,\n\t36877 - 11905: 0xE5D0,\n\t36878 - 11905: 0xDE9D,\n\t36879 - 11905: 0xCDB8,\n\t36880 - 11905: 0xD6F0,\n\t36881 - 11905: 0xE5CF,\n\t36882 - 11905: 0xB5DD,\n\t36883 - 11905: 0xDE9E,\n\t36884 - 11905: 0xCDBE,\n\t36885 - 11905: 0xDE9F,\n\t36886 - 11905: 0xE5D1,\n\t36887 - 11905: 0xB6BA,\n\t36888 - 11905: 0xDEA0,\n\t36889 - 11905: 0xDF40,\n\t36890 - 11905: 0xCDA8,\n\t36891 - 11905: 0xB9E4,\n\t36892 - 11905: 0xDF41,\n\t36893 - 11905: 0xCAC5,\n\t36894 - 11905: 0xB3D1,\n\t36895 - 11905: 0xCBD9,\n\t36896 - 11905: 0xD4EC,\n\t36897 - 11905: 0xE5D2,\n\t36898 - 11905: 0xB7EA,\n\t36899 - 11905: 0xDF42,\n\t36900 - 11905: 0xDF43,\n\t36901 - 11905: 0xDF44,\n\t36902 - 11905: 0xE5CE,\n\t36903 - 11905: 0xDF45,\n\t36904 - 11905: 0xDF46,\n\t36905 - 11905: 0xDF47,\n\t36906 - 11905: 0xDF48,\n\t36907 - 11905: 0xDF49,\n\t36908 - 11905: 0xDF4A,\n\t36909 - 11905: 0xE5D5,\n\t36910 - 11905: 0xB4FE,\n\t36911 - 11905: 0xE5D6,\n\t36912 - 11905: 0xDF4B,\n\t36913 - 11905: 0xDF4C,\n\t36914 - 11905: 0xDF4D,\n\t36915 - 11905: 0xDF4E,\n\t36916 - 11905: 0xDF4F,\n\t36917 - 11905: 0xE5D3,\n\t36918 - 11905: 0xE5D4,\n\t36919 - 11905: 0xDF50,\n\t36920 - 11905: 0xD2DD,\n\t36921 - 11905: 0xDF51,\n\t36922 - 11905: 0xDF52,\n\t36923 - 11905: 0xC2DF,\n\t36924 - 11905: 0xB1C6,\n\t36925 - 11905: 0xDF53,\n\t36926 - 11905: 0xD3E2,\n\t36927 - 11905: 0xDF54,\n\t36928 - 11905: 0xDF55,\n\t36929 - 11905: 0xB6DD,\n\t36930 - 11905: 0xCBEC,\n\t36931 - 11905: 0xDF56,\n\t36932 - 11905: 0xE5D7,\n\t36933 - 11905: 0xDF57,\n\t36934 - 11905: 0xDF58,\n\t36935 - 11905: 0xD3F6,\n\t36936 - 11905: 0xDF59,\n\t36937 - 11905: 0xDF5A,\n\t36938 - 11905: 0xDF5B,\n\t36939 - 11905: 0xDF5C,\n\t36940 - 11905: 0xDF5D,\n\t36941 - 11905: 0xB1E9,\n\t36942 - 11905: 0xDF5E,\n\t36943 - 11905: 0xB6F4,\n\t36944 - 11905: 0xE5DA,\n\t36945 - 11905: 0xE5D8,\n\t36946 - 11905: 0xE5D9,\n\t36947 - 11905: 0xB5C0,\n\t36948 - 11905: 0xDF5F,\n\t36949 - 11905: 0xDF60,\n\t36950 - 11905: 0xDF61,\n\t36951 - 11905: 0xD2C5,\n\t36952 - 11905: 0xE5DC,\n\t36953 - 11905: 0xDF62,\n\t36954 - 11905: 0xDF63,\n\t36955 - 11905: 0xE5DE,\n\t36956 - 11905: 0xDF64,\n\t36957 - 11905: 0xDF65,\n\t36958 - 11905: 0xDF66,\n\t36959 - 11905: 0xDF67,\n\t36960 - 11905: 0xDF68,\n\t36961 - 11905: 0xDF69,\n\t36962 - 11905: 0xE5DD,\n\t36963 - 11905: 0xC7B2,\n\t36964 - 11905: 0xDF6A,\n\t36965 - 11905: 0xD2A3,\n\t36966 - 11905: 0xDF6B,\n\t36967 - 11905: 0xDF6C,\n\t36968 - 11905: 0xE5DB,\n\t36969 - 11905: 0xDF6D,\n\t36970 - 11905: 0xDF6E,\n\t36971 - 11905: 0xDF6F,\n\t36972 - 11905: 0xDF70,\n\t36973 - 11905: 0xD4E2,\n\t36974 - 11905: 0xD5DA,\n\t36975 - 11905: 0xDF71,\n\t36976 - 11905: 0xDF72,\n\t36977 - 11905: 0xDF73,\n\t36978 - 11905: 0xDF74,\n\t36979 - 11905: 0xDF75,\n\t36980 - 11905: 0xE5E0,\n\t36981 - 11905: 0xD7F1,\n\t36982 - 11905: 0xDF76,\n\t36983 - 11905: 0xDF77,\n\t36984 - 11905: 0xDF78,\n\t36985 - 11905: 0xDF79,\n\t36986 - 11905: 0xDF7A,\n\t36987 - 11905: 0xDF7B,\n\t36988 - 11905: 0xDF7C,\n\t36989 - 11905: 0xE5E1,\n\t36990 - 11905: 0xDF7D,\n\t36991 - 11905: 0xB1DC,\n\t36992 - 11905: 0xD1FB,\n\t36993 - 11905: 0xDF7E,\n\t36994 - 11905: 0xE5E2,\n\t36995 - 11905: 0xE5E4,\n\t36996 - 11905: 0xDF80,\n\t36997 - 11905: 0xDF81,\n\t36998 - 11905: 0xDF82,\n\t36999 - 11905: 0xDF83,\n\t37000 - 11905: 0xE5E3,\n\t37001 - 11905: 0xDF84,\n\t37002 - 11905: 0xDF85,\n\t37003 - 11905: 0xE5E5,\n\t37004 - 11905: 0xDF86,\n\t37005 - 11905: 0xDF87,\n\t37006 - 11905: 0xDF88,\n\t37007 - 11905: 0xDF89,\n\t37008 - 11905: 0xDF8A,\n\t37009 - 11905: 0xD2D8,\n\t37010 - 11905: 0xDF8B,\n\t37011 - 11905: 0xB5CB,\n\t37012 - 11905: 0xDF8C,\n\t37013 - 11905: 0xE7DF,\n\t37014 - 11905: 0xDF8D,\n\t37015 - 11905: 0xDAF5,\n\t37016 - 11905: 0xDF8E,\n\t37017 - 11905: 0xDAF8,\n\t37018 - 11905: 0xDF8F,\n\t37019 - 11905: 0xDAF6,\n\t37020 - 11905: 0xDF90,\n\t37021 - 11905: 0xDAF7,\n\t37022 - 11905: 0xDF91,\n\t37023 - 11905: 0xDF92,\n\t37024 - 11905: 0xDF93,\n\t37025 - 11905: 0xDAFA,\n\t37026 - 11905: 0xD0CF,\n\t37027 - 11905: 0xC4C7,\n\t37028 - 11905: 0xDF94,\n\t37029 - 11905: 0xDF95,\n\t37030 - 11905: 0xB0EE,\n\t37031 - 11905: 0xDF96,\n\t37032 - 11905: 0xDF97,\n\t37033 - 11905: 0xDF98,\n\t37034 - 11905: 0xD0B0,\n\t37035 - 11905: 0xDF99,\n\t37036 - 11905: 0xDAF9,\n\t37037 - 11905: 0xDF9A,\n\t37038 - 11905: 0xD3CA,\n\t37039 - 11905: 0xBAAA,\n\t37040 - 11905: 0xDBA2,\n\t37041 - 11905: 0xC7F1,\n\t37042 - 11905: 0xDF9B,\n\t37043 - 11905: 0xDAFC,\n\t37044 - 11905: 0xDAFB,\n\t37045 - 11905: 0xC9DB,\n\t37046 - 11905: 0xDAFD,\n\t37047 - 11905: 0xDF9C,\n\t37048 - 11905: 0xDBA1,\n\t37049 - 11905: 0xD7DE,\n\t37050 - 11905: 0xDAFE,\n\t37051 - 11905: 0xC1DA,\n\t37052 - 11905: 0xDF9D,\n\t37053 - 11905: 0xDF9E,\n\t37054 - 11905: 0xDBA5,\n\t37055 - 11905: 0xDF9F,\n\t37056 - 11905: 0xDFA0,\n\t37057 - 11905: 0xD3F4,\n\t37058 - 11905: 0xE040,\n\t37059 - 11905: 0xE041,\n\t37060 - 11905: 0xDBA7,\n\t37061 - 11905: 0xDBA4,\n\t37062 - 11905: 0xE042,\n\t37063 - 11905: 0xDBA8,\n\t37064 - 11905: 0xE043,\n\t37065 - 11905: 0xE044,\n\t37066 - 11905: 0xBDBC,\n\t37067 - 11905: 0xE045,\n\t37068 - 11905: 0xE046,\n\t37069 - 11905: 0xE047,\n\t37070 - 11905: 0xC0C9,\n\t37071 - 11905: 0xDBA3,\n\t37072 - 11905: 0xDBA6,\n\t37073 - 11905: 0xD6A3,\n\t37074 - 11905: 0xE048,\n\t37075 - 11905: 0xDBA9,\n\t37076 - 11905: 0xE049,\n\t37077 - 11905: 0xE04A,\n\t37078 - 11905: 0xE04B,\n\t37079 - 11905: 0xDBAD,\n\t37080 - 11905: 0xE04C,\n\t37081 - 11905: 0xE04D,\n\t37082 - 11905: 0xE04E,\n\t37083 - 11905: 0xDBAE,\n\t37084 - 11905: 0xDBAC,\n\t37085 - 11905: 0xBAC2,\n\t37086 - 11905: 0xE04F,\n\t37087 - 11905: 0xE050,\n\t37088 - 11905: 0xE051,\n\t37089 - 11905: 0xBFA4,\n\t37090 - 11905: 0xDBAB,\n\t37091 - 11905: 0xE052,\n\t37092 - 11905: 0xE053,\n\t37093 - 11905: 0xE054,\n\t37094 - 11905: 0xDBAA,\n\t37095 - 11905: 0xD4C7,\n\t37096 - 11905: 0xB2BF,\n\t37097 - 11905: 0xE055,\n\t37098 - 11905: 0xE056,\n\t37099 - 11905: 0xDBAF,\n\t37100 - 11905: 0xE057,\n\t37101 - 11905: 0xB9F9,\n\t37102 - 11905: 0xE058,\n\t37103 - 11905: 0xDBB0,\n\t37104 - 11905: 0xE059,\n\t37105 - 11905: 0xE05A,\n\t37106 - 11905: 0xE05B,\n\t37107 - 11905: 0xE05C,\n\t37108 - 11905: 0xB3BB,\n\t37109 - 11905: 0xE05D,\n\t37110 - 11905: 0xE05E,\n\t37111 - 11905: 0xE05F,\n\t37112 - 11905: 0xB5A6,\n\t37113 - 11905: 0xE060,\n\t37114 - 11905: 0xE061,\n\t37115 - 11905: 0xE062,\n\t37116 - 11905: 0xE063,\n\t37117 - 11905: 0xB6BC,\n\t37118 - 11905: 0xDBB1,\n\t37119 - 11905: 0xE064,\n\t37120 - 11905: 0xE065,\n\t37121 - 11905: 0xE066,\n\t37122 - 11905: 0xB6F5,\n\t37123 - 11905: 0xE067,\n\t37124 - 11905: 0xDBB2,\n\t37125 - 11905: 0xE068,\n\t37126 - 11905: 0xE069,\n\t37127 - 11905: 0xE06A,\n\t37128 - 11905: 0xE06B,\n\t37129 - 11905: 0xE06C,\n\t37130 - 11905: 0xE06D,\n\t37131 - 11905: 0xE06E,\n\t37132 - 11905: 0xE06F,\n\t37133 - 11905: 0xE070,\n\t37134 - 11905: 0xE071,\n\t37135 - 11905: 0xE072,\n\t37136 - 11905: 0xE073,\n\t37137 - 11905: 0xE074,\n\t37138 - 11905: 0xE075,\n\t37139 - 11905: 0xE076,\n\t37140 - 11905: 0xE077,\n\t37141 - 11905: 0xE078,\n\t37142 - 11905: 0xE079,\n\t37143 - 11905: 0xE07A,\n\t37144 - 11905: 0xE07B,\n\t37145 - 11905: 0xB1C9,\n\t37146 - 11905: 0xE07C,\n\t37147 - 11905: 0xE07D,\n\t37148 - 11905: 0xE07E,\n\t37149 - 11905: 0xE080,\n\t37150 - 11905: 0xDBB4,\n\t37151 - 11905: 0xE081,\n\t37152 - 11905: 0xE082,\n\t37153 - 11905: 0xE083,\n\t37154 - 11905: 0xDBB3,\n\t37155 - 11905: 0xDBB5,\n\t37156 - 11905: 0xE084,\n\t37157 - 11905: 0xE085,\n\t37158 - 11905: 0xE086,\n\t37159 - 11905: 0xE087,\n\t37160 - 11905: 0xE088,\n\t37161 - 11905: 0xE089,\n\t37162 - 11905: 0xE08A,\n\t37163 - 11905: 0xE08B,\n\t37164 - 11905: 0xE08C,\n\t37165 - 11905: 0xE08D,\n\t37166 - 11905: 0xE08E,\n\t37167 - 11905: 0xDBB7,\n\t37168 - 11905: 0xE08F,\n\t37169 - 11905: 0xDBB6,\n\t37170 - 11905: 0xE090,\n\t37171 - 11905: 0xE091,\n\t37172 - 11905: 0xE092,\n\t37173 - 11905: 0xE093,\n\t37174 - 11905: 0xE094,\n\t37175 - 11905: 0xE095,\n\t37176 - 11905: 0xE096,\n\t37177 - 11905: 0xDBB8,\n\t37178 - 11905: 0xE097,\n\t37179 - 11905: 0xE098,\n\t37180 - 11905: 0xE099,\n\t37181 - 11905: 0xE09A,\n\t37182 - 11905: 0xE09B,\n\t37183 - 11905: 0xE09C,\n\t37184 - 11905: 0xE09D,\n\t37185 - 11905: 0xE09E,\n\t37186 - 11905: 0xE09F,\n\t37187 - 11905: 0xDBB9,\n\t37188 - 11905: 0xE0A0,\n\t37189 - 11905: 0xE140,\n\t37190 - 11905: 0xDBBA,\n\t37191 - 11905: 0xE141,\n\t37192 - 11905: 0xE142,\n\t37193 - 11905: 0xD3CF,\n\t37194 - 11905: 0xF4FA,\n\t37195 - 11905: 0xC7F5,\n\t37196 - 11905: 0xD7C3,\n\t37197 - 11905: 0xC5E4,\n\t37198 - 11905: 0xF4FC,\n\t37199 - 11905: 0xF4FD,\n\t37200 - 11905: 0xF4FB,\n\t37201 - 11905: 0xE143,\n\t37202 - 11905: 0xBEC6,\n\t37203 - 11905: 0xE144,\n\t37204 - 11905: 0xE145,\n\t37205 - 11905: 0xE146,\n\t37206 - 11905: 0xE147,\n\t37207 - 11905: 0xD0EF,\n\t37208 - 11905: 0xE148,\n\t37209 - 11905: 0xE149,\n\t37210 - 11905: 0xB7D3,\n\t37211 - 11905: 0xE14A,\n\t37212 - 11905: 0xE14B,\n\t37213 - 11905: 0xD4CD,\n\t37214 - 11905: 0xCCAA,\n\t37215 - 11905: 0xE14C,\n\t37216 - 11905: 0xE14D,\n\t37217 - 11905: 0xF5A2,\n\t37218 - 11905: 0xF5A1,\n\t37219 - 11905: 0xBAA8,\n\t37220 - 11905: 0xF4FE,\n\t37221 - 11905: 0xCBD6,\n\t37222 - 11905: 0xE14E,\n\t37223 - 11905: 0xE14F,\n\t37224 - 11905: 0xE150,\n\t37225 - 11905: 0xF5A4,\n\t37226 - 11905: 0xC0D2,\n\t37227 - 11905: 0xE151,\n\t37228 - 11905: 0xB3EA,\n\t37229 - 11905: 0xE152,\n\t37230 - 11905: 0xCDAA,\n\t37231 - 11905: 0xF5A5,\n\t37232 - 11905: 0xF5A3,\n\t37233 - 11905: 0xBDB4,\n\t37234 - 11905: 0xF5A8,\n\t37235 - 11905: 0xE153,\n\t37236 - 11905: 0xF5A9,\n\t37237 - 11905: 0xBDCD,\n\t37238 - 11905: 0xC3B8,\n\t37239 - 11905: 0xBFE1,\n\t37240 - 11905: 0xCBE1,\n\t37241 - 11905: 0xF5AA,\n\t37242 - 11905: 0xE154,\n\t37243 - 11905: 0xE155,\n\t37244 - 11905: 0xE156,\n\t37245 - 11905: 0xF5A6,\n\t37246 - 11905: 0xF5A7,\n\t37247 - 11905: 0xC4F0,\n\t37248 - 11905: 0xE157,\n\t37249 - 11905: 0xE158,\n\t37250 - 11905: 0xE159,\n\t37251 - 11905: 0xE15A,\n\t37252 - 11905: 0xE15B,\n\t37253 - 11905: 0xF5AC,\n\t37254 - 11905: 0xE15C,\n\t37255 - 11905: 0xB4BC,\n\t37256 - 11905: 0xE15D,\n\t37257 - 11905: 0xD7ED,\n\t37258 - 11905: 0xE15E,\n\t37259 - 11905: 0xB4D7,\n\t37260 - 11905: 0xF5AB,\n\t37261 - 11905: 0xF5AE,\n\t37262 - 11905: 0xE15F,\n\t37263 - 11905: 0xE160,\n\t37264 - 11905: 0xF5AD,\n\t37265 - 11905: 0xF5AF,\n\t37266 - 11905: 0xD0D1,\n\t37267 - 11905: 0xE161,\n\t37268 - 11905: 0xE162,\n\t37269 - 11905: 0xE163,\n\t37270 - 11905: 0xE164,\n\t37271 - 11905: 0xE165,\n\t37272 - 11905: 0xE166,\n\t37273 - 11905: 0xE167,\n\t37274 - 11905: 0xC3D1,\n\t37275 - 11905: 0xC8A9,\n\t37276 - 11905: 0xE168,\n\t37277 - 11905: 0xE169,\n\t37278 - 11905: 0xE16A,\n\t37279 - 11905: 0xE16B,\n\t37280 - 11905: 0xE16C,\n\t37281 - 11905: 0xE16D,\n\t37282 - 11905: 0xF5B0,\n\t37283 - 11905: 0xF5B1,\n\t37284 - 11905: 0xE16E,\n\t37285 - 11905: 0xE16F,\n\t37286 - 11905: 0xE170,\n\t37287 - 11905: 0xE171,\n\t37288 - 11905: 0xE172,\n\t37289 - 11905: 0xE173,\n\t37290 - 11905: 0xF5B2,\n\t37291 - 11905: 0xE174,\n\t37292 - 11905: 0xE175,\n\t37293 - 11905: 0xF5B3,\n\t37294 - 11905: 0xF5B4,\n\t37295 - 11905: 0xF5B5,\n\t37296 - 11905: 0xE176,\n\t37297 - 11905: 0xE177,\n\t37298 - 11905: 0xE178,\n\t37299 - 11905: 0xE179,\n\t37300 - 11905: 0xF5B7,\n\t37301 - 11905: 0xF5B6,\n\t37302 - 11905: 0xE17A,\n\t37303 - 11905: 0xE17B,\n\t37304 - 11905: 0xE17C,\n\t37305 - 11905: 0xE17D,\n\t37306 - 11905: 0xF5B8,\n\t37307 - 11905: 0xE17E,\n\t37308 - 11905: 0xE180,\n\t37309 - 11905: 0xE181,\n\t37310 - 11905: 0xE182,\n\t37311 - 11905: 0xE183,\n\t37312 - 11905: 0xE184,\n\t37313 - 11905: 0xE185,\n\t37314 - 11905: 0xE186,\n\t37315 - 11905: 0xE187,\n\t37316 - 11905: 0xE188,\n\t37317 - 11905: 0xE189,\n\t37318 - 11905: 0xE18A,\n\t37319 - 11905: 0xB2C9,\n\t37320 - 11905: 0xE18B,\n\t37321 - 11905: 0xD3D4,\n\t37322 - 11905: 0xCACD,\n\t37323 - 11905: 0xE18C,\n\t37324 - 11905: 0xC0EF,\n\t37325 - 11905: 0xD6D8,\n\t37326 - 11905: 0xD2B0,\n\t37327 - 11905: 0xC1BF,\n\t37328 - 11905: 0xE18D,\n\t37329 - 11905: 0xBDF0,\n\t37330 - 11905: 0xE18E,\n\t37331 - 11905: 0xE18F,\n\t37332 - 11905: 0xE190,\n\t37333 - 11905: 0xE191,\n\t37334 - 11905: 0xE192,\n\t37335 - 11905: 0xE193,\n\t37336 - 11905: 0xE194,\n\t37337 - 11905: 0xE195,\n\t37338 - 11905: 0xE196,\n\t37339 - 11905: 0xE197,\n\t37340 - 11905: 0xB8AA,\n\t37341 - 11905: 0xE198,\n\t37342 - 11905: 0xE199,\n\t37343 - 11905: 0xE19A,\n\t37344 - 11905: 0xE19B,\n\t37345 - 11905: 0xE19C,\n\t37346 - 11905: 0xE19D,\n\t37347 - 11905: 0xE19E,\n\t37348 - 11905: 0xE19F,\n\t37349 - 11905: 0xE1A0,\n\t37350 - 11905: 0xE240,\n\t37351 - 11905: 0xE241,\n\t37352 - 11905: 0xE242,\n\t37353 - 11905: 0xE243,\n\t37354 - 11905: 0xE244,\n\t37355 - 11905: 0xE245,\n\t37356 - 11905: 0xE246,\n\t37357 - 11905: 0xE247,\n\t37358 - 11905: 0xE248,\n\t37359 - 11905: 0xE249,\n\t37360 - 11905: 0xE24A,\n\t37361 - 11905: 0xE24B,\n\t37362 - 11905: 0xE24C,\n\t37363 - 11905: 0xE24D,\n\t37364 - 11905: 0xE24E,\n\t37365 - 11905: 0xE24F,\n\t37366 - 11905: 0xE250,\n\t37367 - 11905: 0xE251,\n\t37368 - 11905: 0xE252,\n\t37369 - 11905: 0xE253,\n\t37370 - 11905: 0xE254,\n\t37371 - 11905: 0xE255,\n\t37372 - 11905: 0xE256,\n\t37373 - 11905: 0xE257,\n\t37374 - 11905: 0xE258,\n\t37375 - 11905: 0xE259,\n\t37376 - 11905: 0xE25A,\n\t37377 - 11905: 0xE25B,\n\t37378 - 11905: 0xE25C,\n\t37379 - 11905: 0xE25D,\n\t37380 - 11905: 0xE25E,\n\t37381 - 11905: 0xE25F,\n\t37382 - 11905: 0xE260,\n\t37383 - 11905: 0xE261,\n\t37384 - 11905: 0xE262,\n\t37385 - 11905: 0xE263,\n\t37386 - 11905: 0xE264,\n\t37387 - 11905: 0xE265,\n\t37388 - 11905: 0xE266,\n\t37389 - 11905: 0xE267,\n\t37390 - 11905: 0xE268,\n\t37391 - 11905: 0xE269,\n\t37392 - 11905: 0xE26A,\n\t37393 - 11905: 0xE26B,\n\t37394 - 11905: 0xE26C,\n\t37395 - 11905: 0xE26D,\n\t37396 - 11905: 0xE26E,\n\t37397 - 11905: 0xE26F,\n\t37398 - 11905: 0xE270,\n\t37399 - 11905: 0xE271,\n\t37400 - 11905: 0xE272,\n\t37401 - 11905: 0xE273,\n\t37402 - 11905: 0xE274,\n\t37403 - 11905: 0xE275,\n\t37404 - 11905: 0xE276,\n\t37405 - 11905: 0xE277,\n\t37406 - 11905: 0xE278,\n\t37407 - 11905: 0xE279,\n\t37408 - 11905: 0xE27A,\n\t37409 - 11905: 0xE27B,\n\t37410 - 11905: 0xE27C,\n\t37411 - 11905: 0xE27D,\n\t37412 - 11905: 0xE27E,\n\t37413 - 11905: 0xE280,\n\t37414 - 11905: 0xE281,\n\t37415 - 11905: 0xE282,\n\t37416 - 11905: 0xE283,\n\t37417 - 11905: 0xE284,\n\t37418 - 11905: 0xE285,\n\t37419 - 11905: 0xE286,\n\t37420 - 11905: 0xE287,\n\t37421 - 11905: 0xE288,\n\t37422 - 11905: 0xE289,\n\t37423 - 11905: 0xE28A,\n\t37424 - 11905: 0xE28B,\n\t37425 - 11905: 0xE28C,\n\t37426 - 11905: 0xE28D,\n\t37427 - 11905: 0xE28E,\n\t37428 - 11905: 0xE28F,\n\t37429 - 11905: 0xE290,\n\t37430 - 11905: 0xE291,\n\t37431 - 11905: 0xE292,\n\t37432 - 11905: 0xE293,\n\t37433 - 11905: 0xE294,\n\t37434 - 11905: 0xE295,\n\t37435 - 11905: 0xE296,\n\t37436 - 11905: 0xE297,\n\t37437 - 11905: 0xE298,\n\t37438 - 11905: 0xE299,\n\t37439 - 11905: 0xE29A,\n\t37440 - 11905: 0xE29B,\n\t37441 - 11905: 0xE29C,\n\t37442 - 11905: 0xE29D,\n\t37443 - 11905: 0xE29E,\n\t37444 - 11905: 0xE29F,\n\t37445 - 11905: 0xE2A0,\n\t37446 - 11905: 0xE340,\n\t37447 - 11905: 0xE341,\n\t37448 - 11905: 0xE342,\n\t37449 - 11905: 0xE343,\n\t37450 - 11905: 0xE344,\n\t37451 - 11905: 0xE345,\n\t37452 - 11905: 0xE346,\n\t37453 - 11905: 0xE347,\n\t37454 - 11905: 0xE348,\n\t37455 - 11905: 0xE349,\n\t37456 - 11905: 0xE34A,\n\t37457 - 11905: 0xE34B,\n\t37458 - 11905: 0xE34C,\n\t37459 - 11905: 0xE34D,\n\t37460 - 11905: 0xE34E,\n\t37461 - 11905: 0xE34F,\n\t37462 - 11905: 0xE350,\n\t37463 - 11905: 0xE351,\n\t37464 - 11905: 0xE352,\n\t37465 - 11905: 0xE353,\n\t37466 - 11905: 0xE354,\n\t37467 - 11905: 0xE355,\n\t37468 - 11905: 0xE356,\n\t37469 - 11905: 0xE357,\n\t37470 - 11905: 0xE358,\n\t37471 - 11905: 0xE359,\n\t37472 - 11905: 0xE35A,\n\t37473 - 11905: 0xE35B,\n\t37474 - 11905: 0xE35C,\n\t37475 - 11905: 0xE35D,\n\t37476 - 11905: 0xE35E,\n\t37477 - 11905: 0xE35F,\n\t37478 - 11905: 0xE360,\n\t37479 - 11905: 0xE361,\n\t37480 - 11905: 0xE362,\n\t37481 - 11905: 0xE363,\n\t37482 - 11905: 0xE364,\n\t37483 - 11905: 0xE365,\n\t37484 - 11905: 0xE366,\n\t37485 - 11905: 0xE367,\n\t37486 - 11905: 0xE368,\n\t37487 - 11905: 0xE369,\n\t37488 - 11905: 0xE36A,\n\t37489 - 11905: 0xE36B,\n\t37490 - 11905: 0xE36C,\n\t37491 - 11905: 0xE36D,\n\t37492 - 11905: 0xBCF8,\n\t37493 - 11905: 0xE36E,\n\t37494 - 11905: 0xE36F,\n\t37495 - 11905: 0xE370,\n\t37496 - 11905: 0xE371,\n\t37497 - 11905: 0xE372,\n\t37498 - 11905: 0xE373,\n\t37499 - 11905: 0xE374,\n\t37500 - 11905: 0xE375,\n\t37501 - 11905: 0xE376,\n\t37502 - 11905: 0xE377,\n\t37503 - 11905: 0xE378,\n\t37504 - 11905: 0xE379,\n\t37505 - 11905: 0xE37A,\n\t37506 - 11905: 0xE37B,\n\t37507 - 11905: 0xE37C,\n\t37508 - 11905: 0xE37D,\n\t37509 - 11905: 0xE37E,\n\t37510 - 11905: 0xE380,\n\t37511 - 11905: 0xE381,\n\t37512 - 11905: 0xE382,\n\t37513 - 11905: 0xE383,\n\t37514 - 11905: 0xE384,\n\t37515 - 11905: 0xE385,\n\t37516 - 11905: 0xE386,\n\t37517 - 11905: 0xE387,\n\t37518 - 11905: 0xF6C6,\n\t37519 - 11905: 0xE388,\n\t37520 - 11905: 0xE389,\n\t37521 - 11905: 0xE38A,\n\t37522 - 11905: 0xE38B,\n\t37523 - 11905: 0xE38C,\n\t37524 - 11905: 0xE38D,\n\t37525 - 11905: 0xE38E,\n\t37526 - 11905: 0xE38F,\n\t37527 - 11905: 0xE390,\n\t37528 - 11905: 0xE391,\n\t37529 - 11905: 0xE392,\n\t37530 - 11905: 0xE393,\n\t37531 - 11905: 0xE394,\n\t37532 - 11905: 0xE395,\n\t37533 - 11905: 0xE396,\n\t37534 - 11905: 0xE397,\n\t37535 - 11905: 0xE398,\n\t37536 - 11905: 0xE399,\n\t37537 - 11905: 0xE39A,\n\t37538 - 11905: 0xE39B,\n\t37539 - 11905: 0xE39C,\n\t37540 - 11905: 0xE39D,\n\t37541 - 11905: 0xE39E,\n\t37542 - 11905: 0xE39F,\n\t37543 - 11905: 0xE3A0,\n\t37544 - 11905: 0xE440,\n\t37545 - 11905: 0xE441,\n\t37546 - 11905: 0xE442,\n\t37547 - 11905: 0xE443,\n\t37548 - 11905: 0xE444,\n\t37549 - 11905: 0xE445,\n\t37550 - 11905: 0xF6C7,\n\t37551 - 11905: 0xE446,\n\t37552 - 11905: 0xE447,\n\t37553 - 11905: 0xE448,\n\t37554 - 11905: 0xE449,\n\t37555 - 11905: 0xE44A,\n\t37556 - 11905: 0xE44B,\n\t37557 - 11905: 0xE44C,\n\t37558 - 11905: 0xE44D,\n\t37559 - 11905: 0xE44E,\n\t37560 - 11905: 0xE44F,\n\t37561 - 11905: 0xE450,\n\t37562 - 11905: 0xE451,\n\t37563 - 11905: 0xE452,\n\t37564 - 11905: 0xE453,\n\t37565 - 11905: 0xE454,\n\t37566 - 11905: 0xE455,\n\t37567 - 11905: 0xE456,\n\t37568 - 11905: 0xE457,\n\t37569 - 11905: 0xE458,\n\t37570 - 11905: 0xE459,\n\t37571 - 11905: 0xE45A,\n\t37572 - 11905: 0xE45B,\n\t37573 - 11905: 0xE45C,\n\t37574 - 11905: 0xE45D,\n\t37575 - 11905: 0xE45E,\n\t37576 - 11905: 0xF6C8,\n\t37577 - 11905: 0xE45F,\n\t37578 - 11905: 0xE460,\n\t37579 - 11905: 0xE461,\n\t37580 - 11905: 0xE462,\n\t37581 - 11905: 0xE463,\n\t37582 - 11905: 0xE464,\n\t37583 - 11905: 0xE465,\n\t37584 - 11905: 0xE466,\n\t37585 - 11905: 0xE467,\n\t37586 - 11905: 0xE468,\n\t37587 - 11905: 0xE469,\n\t37588 - 11905: 0xE46A,\n\t37589 - 11905: 0xE46B,\n\t37590 - 11905: 0xE46C,\n\t37591 - 11905: 0xE46D,\n\t37592 - 11905: 0xE46E,\n\t37593 - 11905: 0xE46F,\n\t37594 - 11905: 0xE470,\n\t37595 - 11905: 0xE471,\n\t37596 - 11905: 0xE472,\n\t37597 - 11905: 0xE473,\n\t37598 - 11905: 0xE474,\n\t37599 - 11905: 0xE475,\n\t37600 - 11905: 0xE476,\n\t37601 - 11905: 0xE477,\n\t37602 - 11905: 0xE478,\n\t37603 - 11905: 0xE479,\n\t37604 - 11905: 0xE47A,\n\t37605 - 11905: 0xE47B,\n\t37606 - 11905: 0xE47C,\n\t37607 - 11905: 0xE47D,\n\t37608 - 11905: 0xE47E,\n\t37609 - 11905: 0xE480,\n\t37610 - 11905: 0xE481,\n\t37611 - 11905: 0xE482,\n\t37612 - 11905: 0xE483,\n\t37613 - 11905: 0xE484,\n\t37614 - 11905: 0xE485,\n\t37615 - 11905: 0xE486,\n\t37616 - 11905: 0xE487,\n\t37617 - 11905: 0xE488,\n\t37618 - 11905: 0xE489,\n\t37619 - 11905: 0xE48A,\n\t37620 - 11905: 0xE48B,\n\t37621 - 11905: 0xE48C,\n\t37622 - 11905: 0xE48D,\n\t37623 - 11905: 0xE48E,\n\t37624 - 11905: 0xE48F,\n\t37625 - 11905: 0xE490,\n\t37626 - 11905: 0xE491,\n\t37627 - 11905: 0xE492,\n\t37628 - 11905: 0xE493,\n\t37629 - 11905: 0xE494,\n\t37630 - 11905: 0xE495,\n\t37631 - 11905: 0xE496,\n\t37632 - 11905: 0xE497,\n\t37633 - 11905: 0xE498,\n\t37634 - 11905: 0xE499,\n\t37635 - 11905: 0xE49A,\n\t37636 - 11905: 0xE49B,\n\t37637 - 11905: 0xE49C,\n\t37638 - 11905: 0xE49D,\n\t37639 - 11905: 0xE49E,\n\t37640 - 11905: 0xE49F,\n\t37641 - 11905: 0xE4A0,\n\t37642 - 11905: 0xE540,\n\t37643 - 11905: 0xE541,\n\t37644 - 11905: 0xE542,\n\t37645 - 11905: 0xE543,\n\t37646 - 11905: 0xE544,\n\t37647 - 11905: 0xE545,\n\t37648 - 11905: 0xE546,\n\t37649 - 11905: 0xE547,\n\t37650 - 11905: 0xE548,\n\t37651 - 11905: 0xE549,\n\t37652 - 11905: 0xE54A,\n\t37653 - 11905: 0xE54B,\n\t37654 - 11905: 0xE54C,\n\t37655 - 11905: 0xE54D,\n\t37656 - 11905: 0xE54E,\n\t37657 - 11905: 0xE54F,\n\t37658 - 11905: 0xE550,\n\t37659 - 11905: 0xE551,\n\t37660 - 11905: 0xE552,\n\t37661 - 11905: 0xE553,\n\t37662 - 11905: 0xE554,\n\t37663 - 11905: 0xE555,\n\t37664 - 11905: 0xE556,\n\t37665 - 11905: 0xE557,\n\t37666 - 11905: 0xE558,\n\t37667 - 11905: 0xE559,\n\t37668 - 11905: 0xE55A,\n\t37669 - 11905: 0xE55B,\n\t37670 - 11905: 0xE55C,\n\t37671 - 11905: 0xE55D,\n\t37672 - 11905: 0xE55E,\n\t37673 - 11905: 0xE55F,\n\t37674 - 11905: 0xE560,\n\t37675 - 11905: 0xE561,\n\t37676 - 11905: 0xE562,\n\t37677 - 11905: 0xE563,\n\t37678 - 11905: 0xE564,\n\t37679 - 11905: 0xE565,\n\t37680 - 11905: 0xE566,\n\t37681 - 11905: 0xE567,\n\t37682 - 11905: 0xE568,\n\t37683 - 11905: 0xE569,\n\t37684 - 11905: 0xE56A,\n\t37685 - 11905: 0xE56B,\n\t37686 - 11905: 0xE56C,\n\t37687 - 11905: 0xE56D,\n\t37688 - 11905: 0xE56E,\n\t37689 - 11905: 0xE56F,\n\t37690 - 11905: 0xE570,\n\t37691 - 11905: 0xE571,\n\t37692 - 11905: 0xE572,\n\t37693 - 11905: 0xE573,\n\t37694 - 11905: 0xF6C9,\n\t37695 - 11905: 0xE574,\n\t37696 - 11905: 0xE575,\n\t37697 - 11905: 0xE576,\n\t37698 - 11905: 0xE577,\n\t37699 - 11905: 0xE578,\n\t37700 - 11905: 0xE579,\n\t37701 - 11905: 0xE57A,\n\t37702 - 11905: 0xE57B,\n\t37703 - 11905: 0xE57C,\n\t37704 - 11905: 0xE57D,\n\t37705 - 11905: 0xE57E,\n\t37706 - 11905: 0xE580,\n\t37707 - 11905: 0xE581,\n\t37708 - 11905: 0xE582,\n\t37709 - 11905: 0xE583,\n\t37710 - 11905: 0xE584,\n\t37711 - 11905: 0xE585,\n\t37712 - 11905: 0xE586,\n\t37713 - 11905: 0xE587,\n\t37714 - 11905: 0xE588,\n\t37715 - 11905: 0xE589,\n\t37716 - 11905: 0xE58A,\n\t37717 - 11905: 0xE58B,\n\t37718 - 11905: 0xE58C,\n\t37719 - 11905: 0xE58D,\n\t37720 - 11905: 0xE58E,\n\t37721 - 11905: 0xE58F,\n\t37722 - 11905: 0xE590,\n\t37723 - 11905: 0xE591,\n\t37724 - 11905: 0xE592,\n\t37725 - 11905: 0xE593,\n\t37726 - 11905: 0xE594,\n\t37727 - 11905: 0xE595,\n\t37728 - 11905: 0xE596,\n\t37729 - 11905: 0xE597,\n\t37730 - 11905: 0xE598,\n\t37731 - 11905: 0xE599,\n\t37732 - 11905: 0xE59A,\n\t37733 - 11905: 0xE59B,\n\t37734 - 11905: 0xE59C,\n\t37735 - 11905: 0xE59D,\n\t37736 - 11905: 0xE59E,\n\t37737 - 11905: 0xE59F,\n\t37738 - 11905: 0xF6CA,\n\t37739 - 11905: 0xE5A0,\n\t37740 - 11905: 0xE640,\n\t37741 - 11905: 0xE641,\n\t37742 - 11905: 0xE642,\n\t37743 - 11905: 0xE643,\n\t37744 - 11905: 0xE644,\n\t37745 - 11905: 0xE645,\n\t37746 - 11905: 0xE646,\n\t37747 - 11905: 0xE647,\n\t37748 - 11905: 0xE648,\n\t37749 - 11905: 0xE649,\n\t37750 - 11905: 0xE64A,\n\t37751 - 11905: 0xE64B,\n\t37752 - 11905: 0xE64C,\n\t37753 - 11905: 0xE64D,\n\t37754 - 11905: 0xE64E,\n\t37755 - 11905: 0xE64F,\n\t37756 - 11905: 0xE650,\n\t37757 - 11905: 0xE651,\n\t37758 - 11905: 0xE652,\n\t37759 - 11905: 0xE653,\n\t37760 - 11905: 0xE654,\n\t37761 - 11905: 0xE655,\n\t37762 - 11905: 0xE656,\n\t37763 - 11905: 0xE657,\n\t37764 - 11905: 0xE658,\n\t37765 - 11905: 0xE659,\n\t37766 - 11905: 0xE65A,\n\t37767 - 11905: 0xE65B,\n\t37768 - 11905: 0xE65C,\n\t37769 - 11905: 0xE65D,\n\t37770 - 11905: 0xE65E,\n\t37771 - 11905: 0xE65F,\n\t37772 - 11905: 0xE660,\n\t37773 - 11905: 0xE661,\n\t37774 - 11905: 0xE662,\n\t37775 - 11905: 0xF6CC,\n\t37776 - 11905: 0xE663,\n\t37777 - 11905: 0xE664,\n\t37778 - 11905: 0xE665,\n\t37779 - 11905: 0xE666,\n\t37780 - 11905: 0xE667,\n\t37781 - 11905: 0xE668,\n\t37782 - 11905: 0xE669,\n\t37783 - 11905: 0xE66A,\n\t37784 - 11905: 0xE66B,\n\t37785 - 11905: 0xE66C,\n\t37786 - 11905: 0xE66D,\n\t37787 - 11905: 0xE66E,\n\t37788 - 11905: 0xE66F,\n\t37789 - 11905: 0xE670,\n\t37790 - 11905: 0xE671,\n\t37791 - 11905: 0xE672,\n\t37792 - 11905: 0xE673,\n\t37793 - 11905: 0xE674,\n\t37794 - 11905: 0xE675,\n\t37795 - 11905: 0xE676,\n\t37796 - 11905: 0xE677,\n\t37797 - 11905: 0xE678,\n\t37798 - 11905: 0xE679,\n\t37799 - 11905: 0xE67A,\n\t37800 - 11905: 0xE67B,\n\t37801 - 11905: 0xE67C,\n\t37802 - 11905: 0xE67D,\n\t37803 - 11905: 0xE67E,\n\t37804 - 11905: 0xE680,\n\t37805 - 11905: 0xE681,\n\t37806 - 11905: 0xE682,\n\t37807 - 11905: 0xE683,\n\t37808 - 11905: 0xE684,\n\t37809 - 11905: 0xE685,\n\t37810 - 11905: 0xE686,\n\t37811 - 11905: 0xE687,\n\t37812 - 11905: 0xE688,\n\t37813 - 11905: 0xE689,\n\t37814 - 11905: 0xE68A,\n\t37815 - 11905: 0xE68B,\n\t37816 - 11905: 0xE68C,\n\t37817 - 11905: 0xE68D,\n\t37818 - 11905: 0xE68E,\n\t37819 - 11905: 0xE68F,\n\t37820 - 11905: 0xE690,\n\t37821 - 11905: 0xE691,\n\t37822 - 11905: 0xE692,\n\t37823 - 11905: 0xE693,\n\t37824 - 11905: 0xE694,\n\t37825 - 11905: 0xE695,\n\t37826 - 11905: 0xE696,\n\t37827 - 11905: 0xE697,\n\t37828 - 11905: 0xE698,\n\t37829 - 11905: 0xE699,\n\t37830 - 11905: 0xE69A,\n\t37831 - 11905: 0xE69B,\n\t37832 - 11905: 0xE69C,\n\t37833 - 11905: 0xE69D,\n\t37834 - 11905: 0xF6CB,\n\t37835 - 11905: 0xE69E,\n\t37836 - 11905: 0xE69F,\n\t37837 - 11905: 0xE6A0,\n\t37838 - 11905: 0xE740,\n\t37839 - 11905: 0xE741,\n\t37840 - 11905: 0xE742,\n\t37841 - 11905: 0xE743,\n\t37842 - 11905: 0xE744,\n\t37843 - 11905: 0xE745,\n\t37844 - 11905: 0xE746,\n\t37845 - 11905: 0xE747,\n\t37846 - 11905: 0xF7E9,\n\t37847 - 11905: 0xE748,\n\t37848 - 11905: 0xE749,\n\t37849 - 11905: 0xE74A,\n\t37850 - 11905: 0xE74B,\n\t37851 - 11905: 0xE74C,\n\t37852 - 11905: 0xE74D,\n\t37853 - 11905: 0xE74E,\n\t37854 - 11905: 0xE74F,\n\t37855 - 11905: 0xE750,\n\t37856 - 11905: 0xE751,\n\t37857 - 11905: 0xE752,\n\t37858 - 11905: 0xE753,\n\t37859 - 11905: 0xE754,\n\t37860 - 11905: 0xE755,\n\t37861 - 11905: 0xE756,\n\t37862 - 11905: 0xE757,\n\t37863 - 11905: 0xE758,\n\t37864 - 11905: 0xE759,\n\t37865 - 11905: 0xE75A,\n\t37866 - 11905: 0xE75B,\n\t37867 - 11905: 0xE75C,\n\t37868 - 11905: 0xE75D,\n\t37869 - 11905: 0xE75E,\n\t37870 - 11905: 0xE75F,\n\t37871 - 11905: 0xE760,\n\t37872 - 11905: 0xE761,\n\t37873 - 11905: 0xE762,\n\t37874 - 11905: 0xE763,\n\t37875 - 11905: 0xE764,\n\t37876 - 11905: 0xE765,\n\t37877 - 11905: 0xE766,\n\t37878 - 11905: 0xE767,\n\t37879 - 11905: 0xE768,\n\t37880 - 11905: 0xE769,\n\t37881 - 11905: 0xE76A,\n\t37882 - 11905: 0xE76B,\n\t37883 - 11905: 0xE76C,\n\t37884 - 11905: 0xE76D,\n\t37885 - 11905: 0xE76E,\n\t37886 - 11905: 0xE76F,\n\t37887 - 11905: 0xE770,\n\t37888 - 11905: 0xE771,\n\t37889 - 11905: 0xE772,\n\t37890 - 11905: 0xE773,\n\t37891 - 11905: 0xE774,\n\t37892 - 11905: 0xE775,\n\t37893 - 11905: 0xE776,\n\t37894 - 11905: 0xE777,\n\t37895 - 11905: 0xE778,\n\t37896 - 11905: 0xE779,\n\t37897 - 11905: 0xE77A,\n\t37898 - 11905: 0xE77B,\n\t37899 - 11905: 0xE77C,\n\t37900 - 11905: 0xE77D,\n\t37901 - 11905: 0xE77E,\n\t37902 - 11905: 0xE780,\n\t37903 - 11905: 0xE781,\n\t37904 - 11905: 0xE782,\n\t37905 - 11905: 0xE783,\n\t37906 - 11905: 0xE784,\n\t37907 - 11905: 0xE785,\n\t37908 - 11905: 0xE786,\n\t37909 - 11905: 0xE787,\n\t37910 - 11905: 0xE788,\n\t37911 - 11905: 0xE789,\n\t37912 - 11905: 0xE78A,\n\t37913 - 11905: 0xE78B,\n\t37914 - 11905: 0xE78C,\n\t37915 - 11905: 0xE78D,\n\t37916 - 11905: 0xE78E,\n\t37917 - 11905: 0xE78F,\n\t37918 - 11905: 0xE790,\n\t37919 - 11905: 0xE791,\n\t37920 - 11905: 0xE792,\n\t37921 - 11905: 0xE793,\n\t37922 - 11905: 0xE794,\n\t37923 - 11905: 0xE795,\n\t37924 - 11905: 0xE796,\n\t37925 - 11905: 0xE797,\n\t37926 - 11905: 0xE798,\n\t37927 - 11905: 0xE799,\n\t37928 - 11905: 0xE79A,\n\t37929 - 11905: 0xE79B,\n\t37930 - 11905: 0xE79C,\n\t37931 - 11905: 0xE79D,\n\t37932 - 11905: 0xE79E,\n\t37933 - 11905: 0xE79F,\n\t37934 - 11905: 0xE7A0,\n\t37935 - 11905: 0xE840,\n\t37936 - 11905: 0xE841,\n\t37937 - 11905: 0xE842,\n\t37938 - 11905: 0xE843,\n\t37939 - 11905: 0xE844,\n\t37940 - 11905: 0xE845,\n\t37941 - 11905: 0xE846,\n\t37942 - 11905: 0xE847,\n\t37943 - 11905: 0xE848,\n\t37944 - 11905: 0xE849,\n\t37945 - 11905: 0xE84A,\n\t37946 - 11905: 0xE84B,\n\t37947 - 11905: 0xE84C,\n\t37948 - 11905: 0xE84D,\n\t37949 - 11905: 0xE84E,\n\t37950 - 11905: 0xF6CD,\n\t37951 - 11905: 0xE84F,\n\t37952 - 11905: 0xE850,\n\t37953 - 11905: 0xE851,\n\t37954 - 11905: 0xE852,\n\t37955 - 11905: 0xE853,\n\t37956 - 11905: 0xE854,\n\t37957 - 11905: 0xE855,\n\t37958 - 11905: 0xE856,\n\t37959 - 11905: 0xE857,\n\t37960 - 11905: 0xE858,\n\t37961 - 11905: 0xE859,\n\t37962 - 11905: 0xE85A,\n\t37963 - 11905: 0xE85B,\n\t37964 - 11905: 0xE85C,\n\t37965 - 11905: 0xE85D,\n\t37966 - 11905: 0xE85E,\n\t37967 - 11905: 0xE85F,\n\t37968 - 11905: 0xE860,\n\t37969 - 11905: 0xE861,\n\t37970 - 11905: 0xE862,\n\t37971 - 11905: 0xE863,\n\t37972 - 11905: 0xE864,\n\t37973 - 11905: 0xE865,\n\t37974 - 11905: 0xE866,\n\t37975 - 11905: 0xE867,\n\t37976 - 11905: 0xE868,\n\t37977 - 11905: 0xE869,\n\t37978 - 11905: 0xE86A,\n\t37979 - 11905: 0xE86B,\n\t37980 - 11905: 0xE86C,\n\t37981 - 11905: 0xE86D,\n\t37982 - 11905: 0xE86E,\n\t37983 - 11905: 0xE86F,\n\t37984 - 11905: 0xE870,\n\t37985 - 11905: 0xE871,\n\t37986 - 11905: 0xE872,\n\t37987 - 11905: 0xE873,\n\t37988 - 11905: 0xE874,\n\t37989 - 11905: 0xE875,\n\t37990 - 11905: 0xE876,\n\t37991 - 11905: 0xE877,\n\t37992 - 11905: 0xE878,\n\t37993 - 11905: 0xE879,\n\t37994 - 11905: 0xE87A,\n\t37995 - 11905: 0xF6CE,\n\t37996 - 11905: 0xE87B,\n\t37997 - 11905: 0xE87C,\n\t37998 - 11905: 0xE87D,\n\t37999 - 11905: 0xE87E,\n\t38000 - 11905: 0xE880,\n\t38001 - 11905: 0xE881,\n\t38002 - 11905: 0xE882,\n\t38003 - 11905: 0xE883,\n\t38004 - 11905: 0xE884,\n\t38005 - 11905: 0xE885,\n\t38006 - 11905: 0xE886,\n\t38007 - 11905: 0xE887,\n\t38008 - 11905: 0xE888,\n\t38009 - 11905: 0xE889,\n\t38010 - 11905: 0xE88A,\n\t38011 - 11905: 0xE88B,\n\t38012 - 11905: 0xE88C,\n\t38013 - 11905: 0xE88D,\n\t38014 - 11905: 0xE88E,\n\t38015 - 11905: 0xE88F,\n\t38016 - 11905: 0xE890,\n\t38017 - 11905: 0xE891,\n\t38018 - 11905: 0xE892,\n\t38019 - 11905: 0xE893,\n\t38020 - 11905: 0xE894,\n\t38021 - 11905: 0xEEC4,\n\t38022 - 11905: 0xEEC5,\n\t38023 - 11905: 0xEEC6,\n\t38024 - 11905: 0xD5EB,\n\t38025 - 11905: 0xB6A4,\n\t38026 - 11905: 0xEEC8,\n\t38027 - 11905: 0xEEC7,\n\t38028 - 11905: 0xEEC9,\n\t38029 - 11905: 0xEECA,\n\t38030 - 11905: 0xC7A5,\n\t38031 - 11905: 0xEECB,\n\t38032 - 11905: 0xEECC,\n\t38033 - 11905: 0xE895,\n\t38034 - 11905: 0xB7B0,\n\t38035 - 11905: 0xB5F6,\n\t38036 - 11905: 0xEECD,\n\t38037 - 11905: 0xEECF,\n\t38038 - 11905: 0xE896,\n\t38039 - 11905: 0xEECE,\n\t38040 - 11905: 0xE897,\n\t38041 - 11905: 0xB8C6,\n\t38042 - 11905: 0xEED0,\n\t38043 - 11905: 0xEED1,\n\t38044 - 11905: 0xEED2,\n\t38045 - 11905: 0xB6DB,\n\t38046 - 11905: 0xB3AE,\n\t38047 - 11905: 0xD6D3,\n\t38048 - 11905: 0xC4C6,\n\t38049 - 11905: 0xB1B5,\n\t38050 - 11905: 0xB8D6,\n\t38051 - 11905: 0xEED3,\n\t38052 - 11905: 0xEED4,\n\t38053 - 11905: 0xD4BF,\n\t38054 - 11905: 0xC7D5,\n\t38055 - 11905: 0xBEFB,\n\t38056 - 11905: 0xCED9,\n\t38057 - 11905: 0xB9B3,\n\t38058 - 11905: 0xEED6,\n\t38059 - 11905: 0xEED5,\n\t38060 - 11905: 0xEED8,\n\t38061 - 11905: 0xEED7,\n\t38062 - 11905: 0xC5A5,\n\t38063 - 11905: 0xEED9,\n\t38064 - 11905: 0xEEDA,\n\t38065 - 11905: 0xC7AE,\n\t38066 - 11905: 0xEEDB,\n\t38067 - 11905: 0xC7AF,\n\t38068 - 11905: 0xEEDC,\n\t38069 - 11905: 0xB2A7,\n\t38070 - 11905: 0xEEDD,\n\t38071 - 11905: 0xEEDE,\n\t38072 - 11905: 0xEEDF,\n\t38073 - 11905: 0xEEE0,\n\t38074 - 11905: 0xEEE1,\n\t38075 - 11905: 0xD7EA,\n\t38076 - 11905: 0xEEE2,\n\t38077 - 11905: 0xEEE3,\n\t38078 - 11905: 0xBCD8,\n\t38079 - 11905: 0xEEE4,\n\t38080 - 11905: 0xD3CB,\n\t38081 - 11905: 0xCCFA,\n\t38082 - 11905: 0xB2AC,\n\t38083 - 11905: 0xC1E5,\n\t38084 - 11905: 0xEEE5,\n\t38085 - 11905: 0xC7A6,\n\t38086 - 11905: 0xC3AD,\n\t38087 - 11905: 0xE898,\n\t38088 - 11905: 0xEEE6,\n\t38089 - 11905: 0xEEE7,\n\t38090 - 11905: 0xEEE8,\n\t38091 - 11905: 0xEEE9,\n\t38092 - 11905: 0xEEEA,\n\t38093 - 11905: 0xEEEB,\n\t38094 - 11905: 0xEEEC,\n\t38095 - 11905: 0xE899,\n\t38096 - 11905: 0xEEED,\n\t38097 - 11905: 0xEEEE,\n\t38098 - 11905: 0xEEEF,\n\t38099 - 11905: 0xE89A,\n\t38100 - 11905: 0xE89B,\n\t38101 - 11905: 0xEEF0,\n\t38102 - 11905: 0xEEF1,\n\t38103 - 11905: 0xEEF2,\n\t38104 - 11905: 0xEEF4,\n\t38105 - 11905: 0xEEF3,\n\t38106 - 11905: 0xE89C,\n\t38107 - 11905: 0xEEF5,\n\t38108 - 11905: 0xCDAD,\n\t38109 - 11905: 0xC2C1,\n\t38110 - 11905: 0xEEF6,\n\t38111 - 11905: 0xEEF7,\n\t38112 - 11905: 0xEEF8,\n\t38113 - 11905: 0xD5A1,\n\t38114 - 11905: 0xEEF9,\n\t38115 - 11905: 0xCFB3,\n\t38116 - 11905: 0xEEFA,\n\t38117 - 11905: 0xEEFB,\n\t38118 - 11905: 0xE89D,\n\t38119 - 11905: 0xEEFC,\n\t38120 - 11905: 0xEEFD,\n\t38121 - 11905: 0xEFA1,\n\t38122 - 11905: 0xEEFE,\n\t38123 - 11905: 0xEFA2,\n\t38124 - 11905: 0xB8F5,\n\t38125 - 11905: 0xC3FA,\n\t38126 - 11905: 0xEFA3,\n\t38127 - 11905: 0xEFA4,\n\t38128 - 11905: 0xBDC2,\n\t38129 - 11905: 0xD2BF,\n\t38130 - 11905: 0xB2F9,\n\t38131 - 11905: 0xEFA5,\n\t38132 - 11905: 0xEFA6,\n\t38133 - 11905: 0xEFA7,\n\t38134 - 11905: 0xD2F8,\n\t38135 - 11905: 0xEFA8,\n\t38136 - 11905: 0xD6FD,\n\t38137 - 11905: 0xEFA9,\n\t38138 - 11905: 0xC6CC,\n\t38139 - 11905: 0xE89E,\n\t38140 - 11905: 0xEFAA,\n\t38141 - 11905: 0xEFAB,\n\t38142 - 11905: 0xC1B4,\n\t38143 - 11905: 0xEFAC,\n\t38144 - 11905: 0xCFFA,\n\t38145 - 11905: 0xCBF8,\n\t38146 - 11905: 0xEFAE,\n\t38147 - 11905: 0xEFAD,\n\t38148 - 11905: 0xB3FA,\n\t38149 - 11905: 0xB9F8,\n\t38150 - 11905: 0xEFAF,\n\t38151 - 11905: 0xEFB0,\n\t38152 - 11905: 0xD0E2,\n\t38153 - 11905: 0xEFB1,\n\t38154 - 11905: 0xEFB2,\n\t38155 - 11905: 0xB7E6,\n\t38156 - 11905: 0xD0BF,\n\t38157 - 11905: 0xEFB3,\n\t38158 - 11905: 0xEFB4,\n\t38159 - 11905: 0xEFB5,\n\t38160 - 11905: 0xC8F1,\n\t38161 - 11905: 0xCCE0,\n\t38162 - 11905: 0xEFB6,\n\t38163 - 11905: 0xEFB7,\n\t38164 - 11905: 0xEFB8,\n\t38165 - 11905: 0xEFB9,\n\t38166 - 11905: 0xEFBA,\n\t38167 - 11905: 0xD5E0,\n\t38168 - 11905: 0xEFBB,\n\t38169 - 11905: 0xB4ED,\n\t38170 - 11905: 0xC3AA,\n\t38171 - 11905: 0xEFBC,\n\t38172 - 11905: 0xE89F,\n\t38173 - 11905: 0xEFBD,\n\t38174 - 11905: 0xEFBE,\n\t38175 - 11905: 0xEFBF,\n\t38176 - 11905: 0xE8A0,\n\t38177 - 11905: 0xCEFD,\n\t38178 - 11905: 0xEFC0,\n\t38179 - 11905: 0xC2E0,\n\t38180 - 11905: 0xB4B8,\n\t38181 - 11905: 0xD7B6,\n\t38182 - 11905: 0xBDF5,\n\t38183 - 11905: 0xE940,\n\t38184 - 11905: 0xCFC7,\n\t38185 - 11905: 0xEFC3,\n\t38186 - 11905: 0xEFC1,\n\t38187 - 11905: 0xEFC2,\n\t38188 - 11905: 0xEFC4,\n\t38189 - 11905: 0xB6A7,\n\t38190 - 11905: 0xBCFC,\n\t38191 - 11905: 0xBEE2,\n\t38192 - 11905: 0xC3CC,\n\t38193 - 11905: 0xEFC5,\n\t38194 - 11905: 0xEFC6,\n\t38195 - 11905: 0xE941,\n\t38196 - 11905: 0xEFC7,\n\t38197 - 11905: 0xEFCF,\n\t38198 - 11905: 0xEFC8,\n\t38199 - 11905: 0xEFC9,\n\t38200 - 11905: 0xEFCA,\n\t38201 - 11905: 0xC7C2,\n\t38202 - 11905: 0xEFF1,\n\t38203 - 11905: 0xB6CD,\n\t38204 - 11905: 0xEFCB,\n\t38205 - 11905: 0xE942,\n\t38206 - 11905: 0xEFCC,\n\t38207 - 11905: 0xEFCD,\n\t38208 - 11905: 0xB6C6,\n\t38209 - 11905: 0xC3BE,\n\t38210 - 11905: 0xEFCE,\n\t38211 - 11905: 0xE943,\n\t38212 - 11905: 0xEFD0,\n\t38213 - 11905: 0xEFD1,\n\t38214 - 11905: 0xEFD2,\n\t38215 - 11905: 0xD5F2,\n\t38216 - 11905: 0xE944,\n\t38217 - 11905: 0xEFD3,\n\t38218 - 11905: 0xC4F7,\n\t38219 - 11905: 0xE945,\n\t38220 - 11905: 0xEFD4,\n\t38221 - 11905: 0xC4F8,\n\t38222 - 11905: 0xEFD5,\n\t38223 - 11905: 0xEFD6,\n\t38224 - 11905: 0xB8E4,\n\t38225 - 11905: 0xB0F7,\n\t38226 - 11905: 0xEFD7,\n\t38227 - 11905: 0xEFD8,\n\t38228 - 11905: 0xEFD9,\n\t38229 - 11905: 0xE946,\n\t38230 - 11905: 0xEFDA,\n\t38231 - 11905: 0xEFDB,\n\t38232 - 11905: 0xEFDC,\n\t38233 - 11905: 0xEFDD,\n\t38234 - 11905: 0xE947,\n\t38235 - 11905: 0xEFDE,\n\t38236 - 11905: 0xBEB5,\n\t38237 - 11905: 0xEFE1,\n\t38238 - 11905: 0xEFDF,\n\t38239 - 11905: 0xEFE0,\n\t38240 - 11905: 0xE948,\n\t38241 - 11905: 0xEFE2,\n\t38242 - 11905: 0xEFE3,\n\t38243 - 11905: 0xC1CD,\n\t38244 - 11905: 0xEFE4,\n\t38245 - 11905: 0xEFE5,\n\t38246 - 11905: 0xEFE6,\n\t38247 - 11905: 0xEFE7,\n\t38248 - 11905: 0xEFE8,\n\t38249 - 11905: 0xEFE9,\n\t38250 - 11905: 0xEFEA,\n\t38251 - 11905: 0xEFEB,\n\t38252 - 11905: 0xEFEC,\n\t38253 - 11905: 0xC0D8,\n\t38254 - 11905: 0xE949,\n\t38255 - 11905: 0xEFED,\n\t38256 - 11905: 0xC1AD,\n\t38257 - 11905: 0xEFEE,\n\t38258 - 11905: 0xEFEF,\n\t38259 - 11905: 0xEFF0,\n\t38260 - 11905: 0xE94A,\n\t38261 - 11905: 0xE94B,\n\t38262 - 11905: 0xCFE2,\n\t38263 - 11905: 0xE94C,\n\t38264 - 11905: 0xE94D,\n\t38265 - 11905: 0xE94E,\n\t38266 - 11905: 0xE94F,\n\t38267 - 11905: 0xE950,\n\t38268 - 11905: 0xE951,\n\t38269 - 11905: 0xE952,\n\t38270 - 11905: 0xE953,\n\t38271 - 11905: 0xB3A4,\n\t38272 - 11905: 0xE954,\n\t38273 - 11905: 0xE955,\n\t38274 - 11905: 0xE956,\n\t38275 - 11905: 0xE957,\n\t38276 - 11905: 0xE958,\n\t38277 - 11905: 0xE959,\n\t38278 - 11905: 0xE95A,\n\t38279 - 11905: 0xE95B,\n\t38280 - 11905: 0xE95C,\n\t38281 - 11905: 0xE95D,\n\t38282 - 11905: 0xE95E,\n\t38283 - 11905: 0xE95F,\n\t38284 - 11905: 0xE960,\n\t38285 - 11905: 0xE961,\n\t38286 - 11905: 0xE962,\n\t38287 - 11905: 0xE963,\n\t38288 - 11905: 0xE964,\n\t38289 - 11905: 0xE965,\n\t38290 - 11905: 0xE966,\n\t38291 - 11905: 0xE967,\n\t38292 - 11905: 0xE968,\n\t38293 - 11905: 0xE969,\n\t38294 - 11905: 0xE96A,\n\t38295 - 11905: 0xE96B,\n\t38296 - 11905: 0xE96C,\n\t38297 - 11905: 0xE96D,\n\t38298 - 11905: 0xE96E,\n\t38299 - 11905: 0xE96F,\n\t38300 - 11905: 0xE970,\n\t38301 - 11905: 0xE971,\n\t38302 - 11905: 0xE972,\n\t38303 - 11905: 0xE973,\n\t38304 - 11905: 0xE974,\n\t38305 - 11905: 0xE975,\n\t38306 - 11905: 0xE976,\n\t38307 - 11905: 0xE977,\n\t38308 - 11905: 0xE978,\n\t38309 - 11905: 0xE979,\n\t38310 - 11905: 0xE97A,\n\t38311 - 11905: 0xE97B,\n\t38312 - 11905: 0xE97C,\n\t38313 - 11905: 0xE97D,\n\t38314 - 11905: 0xE97E,\n\t38315 - 11905: 0xE980,\n\t38316 - 11905: 0xE981,\n\t38317 - 11905: 0xE982,\n\t38318 - 11905: 0xE983,\n\t38319 - 11905: 0xE984,\n\t38320 - 11905: 0xE985,\n\t38321 - 11905: 0xE986,\n\t38322 - 11905: 0xE987,\n\t38323 - 11905: 0xE988,\n\t38324 - 11905: 0xE989,\n\t38325 - 11905: 0xE98A,\n\t38326 - 11905: 0xE98B,\n\t38327 - 11905: 0xE98C,\n\t38328 - 11905: 0xE98D,\n\t38329 - 11905: 0xE98E,\n\t38330 - 11905: 0xE98F,\n\t38331 - 11905: 0xE990,\n\t38332 - 11905: 0xE991,\n\t38333 - 11905: 0xE992,\n\t38334 - 11905: 0xE993,\n\t38335 - 11905: 0xE994,\n\t38336 - 11905: 0xE995,\n\t38337 - 11905: 0xE996,\n\t38338 - 11905: 0xE997,\n\t38339 - 11905: 0xE998,\n\t38340 - 11905: 0xE999,\n\t38341 - 11905: 0xE99A,\n\t38342 - 11905: 0xE99B,\n\t38343 - 11905: 0xE99C,\n\t38344 - 11905: 0xE99D,\n\t38345 - 11905: 0xE99E,\n\t38346 - 11905: 0xE99F,\n\t38347 - 11905: 0xE9A0,\n\t38348 - 11905: 0xEA40,\n\t38349 - 11905: 0xEA41,\n\t38350 - 11905: 0xEA42,\n\t38351 - 11905: 0xEA43,\n\t38352 - 11905: 0xEA44,\n\t38353 - 11905: 0xEA45,\n\t38354 - 11905: 0xEA46,\n\t38355 - 11905: 0xEA47,\n\t38356 - 11905: 0xEA48,\n\t38357 - 11905: 0xEA49,\n\t38358 - 11905: 0xEA4A,\n\t38359 - 11905: 0xEA4B,\n\t38360 - 11905: 0xEA4C,\n\t38361 - 11905: 0xEA4D,\n\t38362 - 11905: 0xEA4E,\n\t38363 - 11905: 0xEA4F,\n\t38364 - 11905: 0xEA50,\n\t38365 - 11905: 0xEA51,\n\t38366 - 11905: 0xEA52,\n\t38367 - 11905: 0xEA53,\n\t38368 - 11905: 0xEA54,\n\t38369 - 11905: 0xEA55,\n\t38370 - 11905: 0xEA56,\n\t38371 - 11905: 0xEA57,\n\t38372 - 11905: 0xEA58,\n\t38373 - 11905: 0xEA59,\n\t38374 - 11905: 0xEA5A,\n\t38375 - 11905: 0xEA5B,\n\t38376 - 11905: 0xC3C5,\n\t38377 - 11905: 0xE3C5,\n\t38378 - 11905: 0xC9C1,\n\t38379 - 11905: 0xE3C6,\n\t38380 - 11905: 0xEA5C,\n\t38381 - 11905: 0xB1D5,\n\t38382 - 11905: 0xCECA,\n\t38383 - 11905: 0xB4B3,\n\t38384 - 11905: 0xC8F2,\n\t38385 - 11905: 0xE3C7,\n\t38386 - 11905: 0xCFD0,\n\t38387 - 11905: 0xE3C8,\n\t38388 - 11905: 0xBCE4,\n\t38389 - 11905: 0xE3C9,\n\t38390 - 11905: 0xE3CA,\n\t38391 - 11905: 0xC3C6,\n\t38392 - 11905: 0xD5A2,\n\t38393 - 11905: 0xC4D6,\n\t38394 - 11905: 0xB9EB,\n\t38395 - 11905: 0xCEC5,\n\t38396 - 11905: 0xE3CB,\n\t38397 - 11905: 0xC3F6,\n\t38398 - 11905: 0xE3CC,\n\t38399 - 11905: 0xEA5D,\n\t38400 - 11905: 0xB7A7,\n\t38401 - 11905: 0xB8F3,\n\t38402 - 11905: 0xBAD2,\n\t38403 - 11905: 0xE3CD,\n\t38404 - 11905: 0xE3CE,\n\t38405 - 11905: 0xD4C4,\n\t38406 - 11905: 0xE3CF,\n\t38407 - 11905: 0xEA5E,\n\t38408 - 11905: 0xE3D0,\n\t38409 - 11905: 0xD1CB,\n\t38410 - 11905: 0xE3D1,\n\t38411 - 11905: 0xE3D2,\n\t38412 - 11905: 0xE3D3,\n\t38413 - 11905: 0xE3D4,\n\t38414 - 11905: 0xD1D6,\n\t38415 - 11905: 0xE3D5,\n\t38416 - 11905: 0xB2FB,\n\t38417 - 11905: 0xC0BB,\n\t38418 - 11905: 0xE3D6,\n\t38419 - 11905: 0xEA5F,\n\t38420 - 11905: 0xC0AB,\n\t38421 - 11905: 0xE3D7,\n\t38422 - 11905: 0xE3D8,\n\t38423 - 11905: 0xE3D9,\n\t38424 - 11905: 0xEA60,\n\t38425 - 11905: 0xE3DA,\n\t38426 - 11905: 0xE3DB,\n\t38427 - 11905: 0xEA61,\n\t38428 - 11905: 0xB8B7,\n\t38429 - 11905: 0xDAE2,\n\t38430 - 11905: 0xEA62,\n\t38431 - 11905: 0xB6D3,\n\t38432 - 11905: 0xEA63,\n\t38433 - 11905: 0xDAE4,\n\t38434 - 11905: 0xDAE3,\n\t38435 - 11905: 0xEA64,\n\t38436 - 11905: 0xEA65,\n\t38437 - 11905: 0xEA66,\n\t38438 - 11905: 0xEA67,\n\t38439 - 11905: 0xEA68,\n\t38440 - 11905: 0xEA69,\n\t38441 - 11905: 0xEA6A,\n\t38442 - 11905: 0xDAE6,\n\t38443 - 11905: 0xEA6B,\n\t38444 - 11905: 0xEA6C,\n\t38445 - 11905: 0xEA6D,\n\t38446 - 11905: 0xC8EE,\n\t38447 - 11905: 0xEA6E,\n\t38448 - 11905: 0xEA6F,\n\t38449 - 11905: 0xDAE5,\n\t38450 - 11905: 0xB7C0,\n\t38451 - 11905: 0xD1F4,\n\t38452 - 11905: 0xD2F5,\n\t38453 - 11905: 0xD5F3,\n\t38454 - 11905: 0xBDD7,\n\t38455 - 11905: 0xEA70,\n\t38456 - 11905: 0xEA71,\n\t38457 - 11905: 0xEA72,\n\t38458 - 11905: 0xEA73,\n\t38459 - 11905: 0xD7E8,\n\t38460 - 11905: 0xDAE8,\n\t38461 - 11905: 0xDAE7,\n\t38462 - 11905: 0xEA74,\n\t38463 - 11905: 0xB0A2,\n\t38464 - 11905: 0xCDD3,\n\t38465 - 11905: 0xEA75,\n\t38466 - 11905: 0xDAE9,\n\t38467 - 11905: 0xEA76,\n\t38468 - 11905: 0xB8BD,\n\t38469 - 11905: 0xBCCA,\n\t38470 - 11905: 0xC2BD,\n\t38471 - 11905: 0xC2A4,\n\t38472 - 11905: 0xB3C2,\n\t38473 - 11905: 0xDAEA,\n\t38474 - 11905: 0xEA77,\n\t38475 - 11905: 0xC2AA,\n\t38476 - 11905: 0xC4B0,\n\t38477 - 11905: 0xBDB5,\n\t38478 - 11905: 0xEA78,\n\t38479 - 11905: 0xEA79,\n\t38480 - 11905: 0xCFDE,\n\t38481 - 11905: 0xEA7A,\n\t38482 - 11905: 0xEA7B,\n\t38483 - 11905: 0xEA7C,\n\t38484 - 11905: 0xDAEB,\n\t38485 - 11905: 0xC9C2,\n\t38486 - 11905: 0xEA7D,\n\t38487 - 11905: 0xEA7E,\n\t38488 - 11905: 0xEA80,\n\t38489 - 11905: 0xEA81,\n\t38490 - 11905: 0xEA82,\n\t38491 - 11905: 0xB1DD,\n\t38492 - 11905: 0xEA83,\n\t38493 - 11905: 0xEA84,\n\t38494 - 11905: 0xEA85,\n\t38495 - 11905: 0xDAEC,\n\t38496 - 11905: 0xEA86,\n\t38497 - 11905: 0xB6B8,\n\t38498 - 11905: 0xD4BA,\n\t38499 - 11905: 0xEA87,\n\t38500 - 11905: 0xB3FD,\n\t38501 - 11905: 0xEA88,\n\t38502 - 11905: 0xEA89,\n\t38503 - 11905: 0xDAED,\n\t38504 - 11905: 0xD4C9,\n\t38505 - 11905: 0xCFD5,\n\t38506 - 11905: 0xC5E3,\n\t38507 - 11905: 0xEA8A,\n\t38508 - 11905: 0xDAEE,\n\t38509 - 11905: 0xEA8B,\n\t38510 - 11905: 0xEA8C,\n\t38511 - 11905: 0xEA8D,\n\t38512 - 11905: 0xEA8E,\n\t38513 - 11905: 0xEA8F,\n\t38514 - 11905: 0xDAEF,\n\t38515 - 11905: 0xEA90,\n\t38516 - 11905: 0xDAF0,\n\t38517 - 11905: 0xC1EA,\n\t38518 - 11905: 0xCCD5,\n\t38519 - 11905: 0xCFDD,\n\t38520 - 11905: 0xEA91,\n\t38521 - 11905: 0xEA92,\n\t38522 - 11905: 0xEA93,\n\t38523 - 11905: 0xEA94,\n\t38524 - 11905: 0xEA95,\n\t38525 - 11905: 0xEA96,\n\t38526 - 11905: 0xEA97,\n\t38527 - 11905: 0xEA98,\n\t38528 - 11905: 0xEA99,\n\t38529 - 11905: 0xEA9A,\n\t38530 - 11905: 0xEA9B,\n\t38531 - 11905: 0xEA9C,\n\t38532 - 11905: 0xEA9D,\n\t38533 - 11905: 0xD3E7,\n\t38534 - 11905: 0xC2A1,\n\t38535 - 11905: 0xEA9E,\n\t38536 - 11905: 0xDAF1,\n\t38537 - 11905: 0xEA9F,\n\t38538 - 11905: 0xEAA0,\n\t38539 - 11905: 0xCBE5,\n\t38540 - 11905: 0xEB40,\n\t38541 - 11905: 0xDAF2,\n\t38542 - 11905: 0xEB41,\n\t38543 - 11905: 0xCBE6,\n\t38544 - 11905: 0xD2FE,\n\t38545 - 11905: 0xEB42,\n\t38546 - 11905: 0xEB43,\n\t38547 - 11905: 0xEB44,\n\t38548 - 11905: 0xB8F4,\n\t38549 - 11905: 0xEB45,\n\t38550 - 11905: 0xEB46,\n\t38551 - 11905: 0xDAF3,\n\t38552 - 11905: 0xB0AF,\n\t38553 - 11905: 0xCFB6,\n\t38554 - 11905: 0xEB47,\n\t38555 - 11905: 0xEB48,\n\t38556 - 11905: 0xD5CF,\n\t38557 - 11905: 0xEB49,\n\t38558 - 11905: 0xEB4A,\n\t38559 - 11905: 0xEB4B,\n\t38560 - 11905: 0xEB4C,\n\t38561 - 11905: 0xEB4D,\n\t38562 - 11905: 0xEB4E,\n\t38563 - 11905: 0xEB4F,\n\t38564 - 11905: 0xEB50,\n\t38565 - 11905: 0xEB51,\n\t38566 - 11905: 0xEB52,\n\t38567 - 11905: 0xCBED,\n\t38568 - 11905: 0xEB53,\n\t38569 - 11905: 0xEB54,\n\t38570 - 11905: 0xEB55,\n\t38571 - 11905: 0xEB56,\n\t38572 - 11905: 0xEB57,\n\t38573 - 11905: 0xEB58,\n\t38574 - 11905: 0xEB59,\n\t38575 - 11905: 0xEB5A,\n\t38576 - 11905: 0xDAF4,\n\t38577 - 11905: 0xEB5B,\n\t38578 - 11905: 0xEB5C,\n\t38579 - 11905: 0xE3C4,\n\t38580 - 11905: 0xEB5D,\n\t38581 - 11905: 0xEB5E,\n\t38582 - 11905: 0xC1A5,\n\t38583 - 11905: 0xEB5F,\n\t38584 - 11905: 0xEB60,\n\t38585 - 11905: 0xF6BF,\n\t38586 - 11905: 0xEB61,\n\t38587 - 11905: 0xEB62,\n\t38588 - 11905: 0xF6C0,\n\t38589 - 11905: 0xF6C1,\n\t38590 - 11905: 0xC4D1,\n\t38591 - 11905: 0xEB63,\n\t38592 - 11905: 0xC8B8,\n\t38593 - 11905: 0xD1E3,\n\t38594 - 11905: 0xEB64,\n\t38595 - 11905: 0xEB65,\n\t38596 - 11905: 0xD0DB,\n\t38597 - 11905: 0xD1C5,\n\t38598 - 11905: 0xBCAF,\n\t38599 - 11905: 0xB9CD,\n\t38600 - 11905: 0xEB66,\n\t38601 - 11905: 0xEFF4,\n\t38602 - 11905: 0xEB67,\n\t38603 - 11905: 0xEB68,\n\t38604 - 11905: 0xB4C6,\n\t38605 - 11905: 0xD3BA,\n\t38606 - 11905: 0xF6C2,\n\t38607 - 11905: 0xB3FB,\n\t38608 - 11905: 0xEB69,\n\t38609 - 11905: 0xEB6A,\n\t38610 - 11905: 0xF6C3,\n\t38611 - 11905: 0xEB6B,\n\t38612 - 11905: 0xEB6C,\n\t38613 - 11905: 0xB5F1,\n\t38614 - 11905: 0xEB6D,\n\t38615 - 11905: 0xEB6E,\n\t38616 - 11905: 0xEB6F,\n\t38617 - 11905: 0xEB70,\n\t38618 - 11905: 0xEB71,\n\t38619 - 11905: 0xEB72,\n\t38620 - 11905: 0xEB73,\n\t38621 - 11905: 0xEB74,\n\t38622 - 11905: 0xEB75,\n\t38623 - 11905: 0xEB76,\n\t38624 - 11905: 0xF6C5,\n\t38625 - 11905: 0xEB77,\n\t38626 - 11905: 0xEB78,\n\t38627 - 11905: 0xEB79,\n\t38628 - 11905: 0xEB7A,\n\t38629 - 11905: 0xEB7B,\n\t38630 - 11905: 0xEB7C,\n\t38631 - 11905: 0xEB7D,\n\t38632 - 11905: 0xD3EA,\n\t38633 - 11905: 0xF6A7,\n\t38634 - 11905: 0xD1A9,\n\t38635 - 11905: 0xEB7E,\n\t38636 - 11905: 0xEB80,\n\t38637 - 11905: 0xEB81,\n\t38638 - 11905: 0xEB82,\n\t38639 - 11905: 0xF6A9,\n\t38640 - 11905: 0xEB83,\n\t38641 - 11905: 0xEB84,\n\t38642 - 11905: 0xEB85,\n\t38643 - 11905: 0xF6A8,\n\t38644 - 11905: 0xEB86,\n\t38645 - 11905: 0xEB87,\n\t38646 - 11905: 0xC1E3,\n\t38647 - 11905: 0xC0D7,\n\t38648 - 11905: 0xEB88,\n\t38649 - 11905: 0xB1A2,\n\t38650 - 11905: 0xEB89,\n\t38651 - 11905: 0xEB8A,\n\t38652 - 11905: 0xEB8B,\n\t38653 - 11905: 0xEB8C,\n\t38654 - 11905: 0xCEED,\n\t38655 - 11905: 0xEB8D,\n\t38656 - 11905: 0xD0E8,\n\t38657 - 11905: 0xF6AB,\n\t38658 - 11905: 0xEB8E,\n\t38659 - 11905: 0xEB8F,\n\t38660 - 11905: 0xCFF6,\n\t38661 - 11905: 0xEB90,\n\t38662 - 11905: 0xF6AA,\n\t38663 - 11905: 0xD5F0,\n\t38664 - 11905: 0xF6AC,\n\t38665 - 11905: 0xC3B9,\n\t38666 - 11905: 0xEB91,\n\t38667 - 11905: 0xEB92,\n\t38668 - 11905: 0xEB93,\n\t38669 - 11905: 0xBBF4,\n\t38670 - 11905: 0xF6AE,\n\t38671 - 11905: 0xF6AD,\n\t38672 - 11905: 0xEB94,\n\t38673 - 11905: 0xEB95,\n\t38674 - 11905: 0xEB96,\n\t38675 - 11905: 0xC4DE,\n\t38676 - 11905: 0xEB97,\n\t38677 - 11905: 0xEB98,\n\t38678 - 11905: 0xC1D8,\n\t38679 - 11905: 0xEB99,\n\t38680 - 11905: 0xEB9A,\n\t38681 - 11905: 0xEB9B,\n\t38682 - 11905: 0xEB9C,\n\t38683 - 11905: 0xEB9D,\n\t38684 - 11905: 0xCBAA,\n\t38685 - 11905: 0xEB9E,\n\t38686 - 11905: 0xCFBC,\n\t38687 - 11905: 0xEB9F,\n\t38688 - 11905: 0xEBA0,\n\t38689 - 11905: 0xEC40,\n\t38690 - 11905: 0xEC41,\n\t38691 - 11905: 0xEC42,\n\t38692 - 11905: 0xEC43,\n\t38693 - 11905: 0xEC44,\n\t38694 - 11905: 0xEC45,\n\t38695 - 11905: 0xEC46,\n\t38696 - 11905: 0xEC47,\n\t38697 - 11905: 0xEC48,\n\t38698 - 11905: 0xF6AF,\n\t38699 - 11905: 0xEC49,\n\t38700 - 11905: 0xEC4A,\n\t38701 - 11905: 0xF6B0,\n\t38702 - 11905: 0xEC4B,\n\t38703 - 11905: 0xEC4C,\n\t38704 - 11905: 0xF6B1,\n\t38705 - 11905: 0xEC4D,\n\t38706 - 11905: 0xC2B6,\n\t38707 - 11905: 0xEC4E,\n\t38708 - 11905: 0xEC4F,\n\t38709 - 11905: 0xEC50,\n\t38710 - 11905: 0xEC51,\n\t38711 - 11905: 0xEC52,\n\t38712 - 11905: 0xB0D4,\n\t38713 - 11905: 0xC5F9,\n\t38714 - 11905: 0xEC53,\n\t38715 - 11905: 0xEC54,\n\t38716 - 11905: 0xEC55,\n\t38717 - 11905: 0xEC56,\n\t38718 - 11905: 0xF6B2,\n\t38719 - 11905: 0xEC57,\n\t38720 - 11905: 0xEC58,\n\t38721 - 11905: 0xEC59,\n\t38722 - 11905: 0xEC5A,\n\t38723 - 11905: 0xEC5B,\n\t38724 - 11905: 0xEC5C,\n\t38725 - 11905: 0xEC5D,\n\t38726 - 11905: 0xEC5E,\n\t38727 - 11905: 0xEC5F,\n\t38728 - 11905: 0xEC60,\n\t38729 - 11905: 0xEC61,\n\t38730 - 11905: 0xEC62,\n\t38731 - 11905: 0xEC63,\n\t38732 - 11905: 0xEC64,\n\t38733 - 11905: 0xEC65,\n\t38734 - 11905: 0xEC66,\n\t38735 - 11905: 0xEC67,\n\t38736 - 11905: 0xEC68,\n\t38737 - 11905: 0xEC69,\n\t38738 - 11905: 0xC7E0,\n\t38739 - 11905: 0xF6A6,\n\t38740 - 11905: 0xEC6A,\n\t38741 - 11905: 0xEC6B,\n\t38742 - 11905: 0xBEB8,\n\t38743 - 11905: 0xEC6C,\n\t38744 - 11905: 0xEC6D,\n\t38745 - 11905: 0xBEB2,\n\t38746 - 11905: 0xEC6E,\n\t38747 - 11905: 0xB5E5,\n\t38748 - 11905: 0xEC6F,\n\t38749 - 11905: 0xEC70,\n\t38750 - 11905: 0xB7C7,\n\t38751 - 11905: 0xEC71,\n\t38752 - 11905: 0xBFBF,\n\t38753 - 11905: 0xC3D2,\n\t38754 - 11905: 0xC3E6,\n\t38755 - 11905: 0xEC72,\n\t38756 - 11905: 0xEC73,\n\t38757 - 11905: 0xD8CC,\n\t38758 - 11905: 0xEC74,\n\t38759 - 11905: 0xEC75,\n\t38760 - 11905: 0xEC76,\n\t38761 - 11905: 0xB8EF,\n\t38762 - 11905: 0xEC77,\n\t38763 - 11905: 0xEC78,\n\t38764 - 11905: 0xEC79,\n\t38765 - 11905: 0xEC7A,\n\t38766 - 11905: 0xEC7B,\n\t38767 - 11905: 0xEC7C,\n\t38768 - 11905: 0xEC7D,\n\t38769 - 11905: 0xEC7E,\n\t38770 - 11905: 0xEC80,\n\t38771 - 11905: 0xBDF9,\n\t38772 - 11905: 0xD1A5,\n\t38773 - 11905: 0xEC81,\n\t38774 - 11905: 0xB0D0,\n\t38775 - 11905: 0xEC82,\n\t38776 - 11905: 0xEC83,\n\t38777 - 11905: 0xEC84,\n\t38778 - 11905: 0xEC85,\n\t38779 - 11905: 0xEC86,\n\t38780 - 11905: 0xF7B0,\n\t38781 - 11905: 0xEC87,\n\t38782 - 11905: 0xEC88,\n\t38783 - 11905: 0xEC89,\n\t38784 - 11905: 0xEC8A,\n\t38785 - 11905: 0xEC8B,\n\t38786 - 11905: 0xEC8C,\n\t38787 - 11905: 0xEC8D,\n\t38788 - 11905: 0xEC8E,\n\t38789 - 11905: 0xF7B1,\n\t38790 - 11905: 0xEC8F,\n\t38791 - 11905: 0xEC90,\n\t38792 - 11905: 0xEC91,\n\t38793 - 11905: 0xEC92,\n\t38794 - 11905: 0xEC93,\n\t38795 - 11905: 0xD0AC,\n\t38796 - 11905: 0xEC94,\n\t38797 - 11905: 0xB0B0,\n\t38798 - 11905: 0xEC95,\n\t38799 - 11905: 0xEC96,\n\t38800 - 11905: 0xEC97,\n\t38801 - 11905: 0xF7B2,\n\t38802 - 11905: 0xF7B3,\n\t38803 - 11905: 0xEC98,\n\t38804 - 11905: 0xF7B4,\n\t38805 - 11905: 0xEC99,\n\t38806 - 11905: 0xEC9A,\n\t38807 - 11905: 0xEC9B,\n\t38808 - 11905: 0xC7CA,\n\t38809 - 11905: 0xEC9C,\n\t38810 - 11905: 0xEC9D,\n\t38811 - 11905: 0xEC9E,\n\t38812 - 11905: 0xEC9F,\n\t38813 - 11905: 0xECA0,\n\t38814 - 11905: 0xED40,\n\t38815 - 11905: 0xED41,\n\t38816 - 11905: 0xBECF,\n\t38817 - 11905: 0xED42,\n\t38818 - 11905: 0xED43,\n\t38819 - 11905: 0xF7B7,\n\t38820 - 11905: 0xED44,\n\t38821 - 11905: 0xED45,\n\t38822 - 11905: 0xED46,\n\t38823 - 11905: 0xED47,\n\t38824 - 11905: 0xED48,\n\t38825 - 11905: 0xED49,\n\t38826 - 11905: 0xED4A,\n\t38827 - 11905: 0xF7B6,\n\t38828 - 11905: 0xED4B,\n\t38829 - 11905: 0xB1DE,\n\t38830 - 11905: 0xED4C,\n\t38831 - 11905: 0xF7B5,\n\t38832 - 11905: 0xED4D,\n\t38833 - 11905: 0xED4E,\n\t38834 - 11905: 0xF7B8,\n\t38835 - 11905: 0xED4F,\n\t38836 - 11905: 0xF7B9,\n\t38837 - 11905: 0xED50,\n\t38838 - 11905: 0xED51,\n\t38839 - 11905: 0xED52,\n\t38840 - 11905: 0xED53,\n\t38841 - 11905: 0xED54,\n\t38842 - 11905: 0xED55,\n\t38843 - 11905: 0xED56,\n\t38844 - 11905: 0xED57,\n\t38845 - 11905: 0xED58,\n\t38846 - 11905: 0xED59,\n\t38847 - 11905: 0xED5A,\n\t38848 - 11905: 0xED5B,\n\t38849 - 11905: 0xED5C,\n\t38850 - 11905: 0xED5D,\n\t38851 - 11905: 0xED5E,\n\t38852 - 11905: 0xED5F,\n\t38853 - 11905: 0xED60,\n\t38854 - 11905: 0xED61,\n\t38855 - 11905: 0xED62,\n\t38856 - 11905: 0xED63,\n\t38857 - 11905: 0xED64,\n\t38858 - 11905: 0xED65,\n\t38859 - 11905: 0xED66,\n\t38860 - 11905: 0xED67,\n\t38861 - 11905: 0xED68,\n\t38862 - 11905: 0xED69,\n\t38863 - 11905: 0xED6A,\n\t38864 - 11905: 0xED6B,\n\t38865 - 11905: 0xED6C,\n\t38866 - 11905: 0xED6D,\n\t38867 - 11905: 0xED6E,\n\t38868 - 11905: 0xED6F,\n\t38869 - 11905: 0xED70,\n\t38870 - 11905: 0xED71,\n\t38871 - 11905: 0xED72,\n\t38872 - 11905: 0xED73,\n\t38873 - 11905: 0xED74,\n\t38874 - 11905: 0xED75,\n\t38875 - 11905: 0xED76,\n\t38876 - 11905: 0xED77,\n\t38877 - 11905: 0xED78,\n\t38878 - 11905: 0xED79,\n\t38879 - 11905: 0xED7A,\n\t38880 - 11905: 0xED7B,\n\t38881 - 11905: 0xED7C,\n\t38882 - 11905: 0xED7D,\n\t38883 - 11905: 0xED7E,\n\t38884 - 11905: 0xED80,\n\t38885 - 11905: 0xED81,\n\t38886 - 11905: 0xCEA4,\n\t38887 - 11905: 0xC8CD,\n\t38888 - 11905: 0xED82,\n\t38889 - 11905: 0xBAAB,\n\t38890 - 11905: 0xE8B8,\n\t38891 - 11905: 0xE8B9,\n\t38892 - 11905: 0xE8BA,\n\t38893 - 11905: 0xBEC2,\n\t38894 - 11905: 0xED83,\n\t38895 - 11905: 0xED84,\n\t38896 - 11905: 0xED85,\n\t38897 - 11905: 0xED86,\n\t38898 - 11905: 0xED87,\n\t38899 - 11905: 0xD2F4,\n\t38900 - 11905: 0xED88,\n\t38901 - 11905: 0xD4CF,\n\t38902 - 11905: 0xC9D8,\n\t38903 - 11905: 0xED89,\n\t38904 - 11905: 0xED8A,\n\t38905 - 11905: 0xED8B,\n\t38906 - 11905: 0xED8C,\n\t38907 - 11905: 0xED8D,\n\t38908 - 11905: 0xED8E,\n\t38909 - 11905: 0xED8F,\n\t38910 - 11905: 0xED90,\n\t38911 - 11905: 0xED91,\n\t38912 - 11905: 0xED92,\n\t38913 - 11905: 0xED93,\n\t38914 - 11905: 0xED94,\n\t38915 - 11905: 0xED95,\n\t38916 - 11905: 0xED96,\n\t38917 - 11905: 0xED97,\n\t38918 - 11905: 0xED98,\n\t38919 - 11905: 0xED99,\n\t38920 - 11905: 0xED9A,\n\t38921 - 11905: 0xED9B,\n\t38922 - 11905: 0xED9C,\n\t38923 - 11905: 0xED9D,\n\t38924 - 11905: 0xED9E,\n\t38925 - 11905: 0xED9F,\n\t38926 - 11905: 0xEDA0,\n\t38927 - 11905: 0xEE40,\n\t38928 - 11905: 0xEE41,\n\t38929 - 11905: 0xEE42,\n\t38930 - 11905: 0xEE43,\n\t38931 - 11905: 0xEE44,\n\t38932 - 11905: 0xEE45,\n\t38933 - 11905: 0xEE46,\n\t38934 - 11905: 0xEE47,\n\t38935 - 11905: 0xEE48,\n\t38936 - 11905: 0xEE49,\n\t38937 - 11905: 0xEE4A,\n\t38938 - 11905: 0xEE4B,\n\t38939 - 11905: 0xEE4C,\n\t38940 - 11905: 0xEE4D,\n\t38941 - 11905: 0xEE4E,\n\t38942 - 11905: 0xEE4F,\n\t38943 - 11905: 0xEE50,\n\t38944 - 11905: 0xEE51,\n\t38945 - 11905: 0xEE52,\n\t38946 - 11905: 0xEE53,\n\t38947 - 11905: 0xEE54,\n\t38948 - 11905: 0xEE55,\n\t38949 - 11905: 0xEE56,\n\t38950 - 11905: 0xEE57,\n\t38951 - 11905: 0xEE58,\n\t38952 - 11905: 0xEE59,\n\t38953 - 11905: 0xEE5A,\n\t38954 - 11905: 0xEE5B,\n\t38955 - 11905: 0xEE5C,\n\t38956 - 11905: 0xEE5D,\n\t38957 - 11905: 0xEE5E,\n\t38958 - 11905: 0xEE5F,\n\t38959 - 11905: 0xEE60,\n\t38960 - 11905: 0xEE61,\n\t38961 - 11905: 0xEE62,\n\t38962 - 11905: 0xEE63,\n\t38963 - 11905: 0xEE64,\n\t38964 - 11905: 0xEE65,\n\t38965 - 11905: 0xEE66,\n\t38966 - 11905: 0xEE67,\n\t38967 - 11905: 0xEE68,\n\t38968 - 11905: 0xEE69,\n\t38969 - 11905: 0xEE6A,\n\t38970 - 11905: 0xEE6B,\n\t38971 - 11905: 0xEE6C,\n\t38972 - 11905: 0xEE6D,\n\t38973 - 11905: 0xEE6E,\n\t38974 - 11905: 0xEE6F,\n\t38975 - 11905: 0xEE70,\n\t38976 - 11905: 0xEE71,\n\t38977 - 11905: 0xEE72,\n\t38978 - 11905: 0xEE73,\n\t38979 - 11905: 0xEE74,\n\t38980 - 11905: 0xEE75,\n\t38981 - 11905: 0xEE76,\n\t38982 - 11905: 0xEE77,\n\t38983 - 11905: 0xEE78,\n\t38984 - 11905: 0xEE79,\n\t38985 - 11905: 0xEE7A,\n\t38986 - 11905: 0xEE7B,\n\t38987 - 11905: 0xEE7C,\n\t38988 - 11905: 0xEE7D,\n\t38989 - 11905: 0xEE7E,\n\t38990 - 11905: 0xEE80,\n\t38991 - 11905: 0xEE81,\n\t38992 - 11905: 0xEE82,\n\t38993 - 11905: 0xEE83,\n\t38994 - 11905: 0xEE84,\n\t38995 - 11905: 0xEE85,\n\t38996 - 11905: 0xEE86,\n\t38997 - 11905: 0xEE87,\n\t38998 - 11905: 0xEE88,\n\t38999 - 11905: 0xEE89,\n\t39000 - 11905: 0xEE8A,\n\t39001 - 11905: 0xEE8B,\n\t39002 - 11905: 0xEE8C,\n\t39003 - 11905: 0xEE8D,\n\t39004 - 11905: 0xEE8E,\n\t39005 - 11905: 0xEE8F,\n\t39006 - 11905: 0xEE90,\n\t39007 - 11905: 0xEE91,\n\t39008 - 11905: 0xEE92,\n\t39009 - 11905: 0xEE93,\n\t39010 - 11905: 0xEE94,\n\t39011 - 11905: 0xEE95,\n\t39012 - 11905: 0xEE96,\n\t39013 - 11905: 0xEE97,\n\t39014 - 11905: 0xEE98,\n\t39015 - 11905: 0xEE99,\n\t39016 - 11905: 0xEE9A,\n\t39017 - 11905: 0xEE9B,\n\t39018 - 11905: 0xEE9C,\n\t39019 - 11905: 0xEE9D,\n\t39020 - 11905: 0xEE9E,\n\t39021 - 11905: 0xEE9F,\n\t39022 - 11905: 0xEEA0,\n\t39023 - 11905: 0xEF40,\n\t39024 - 11905: 0xEF41,\n\t39025 - 11905: 0xEF42,\n\t39026 - 11905: 0xEF43,\n\t39027 - 11905: 0xEF44,\n\t39028 - 11905: 0xEF45,\n\t39029 - 11905: 0xD2B3,\n\t39030 - 11905: 0xB6A5,\n\t39031 - 11905: 0xC7EA,\n\t39032 - 11905: 0xF1FC,\n\t39033 - 11905: 0xCFEE,\n\t39034 - 11905: 0xCBB3,\n\t39035 - 11905: 0xD0EB,\n\t39036 - 11905: 0xE7EF,\n\t39037 - 11905: 0xCDE7,\n\t39038 - 11905: 0xB9CB,\n\t39039 - 11905: 0xB6D9,\n\t39040 - 11905: 0xF1FD,\n\t39041 - 11905: 0xB0E4,\n\t39042 - 11905: 0xCBCC,\n\t39043 - 11905: 0xF1FE,\n\t39044 - 11905: 0xD4A4,\n\t39045 - 11905: 0xC2AD,\n\t39046 - 11905: 0xC1EC,\n\t39047 - 11905: 0xC6C4,\n\t39048 - 11905: 0xBEB1,\n\t39049 - 11905: 0xF2A1,\n\t39050 - 11905: 0xBCD5,\n\t39051 - 11905: 0xEF46,\n\t39052 - 11905: 0xF2A2,\n\t39053 - 11905: 0xF2A3,\n\t39054 - 11905: 0xEF47,\n\t39055 - 11905: 0xF2A4,\n\t39056 - 11905: 0xD2C3,\n\t39057 - 11905: 0xC6B5,\n\t39058 - 11905: 0xEF48,\n\t39059 - 11905: 0xCDC7,\n\t39060 - 11905: 0xF2A5,\n\t39061 - 11905: 0xEF49,\n\t39062 - 11905: 0xD3B1,\n\t39063 - 11905: 0xBFC5,\n\t39064 - 11905: 0xCCE2,\n\t39065 - 11905: 0xEF4A,\n\t39066 - 11905: 0xF2A6,\n\t39067 - 11905: 0xF2A7,\n\t39068 - 11905: 0xD1D5,\n\t39069 - 11905: 0xB6EE,\n\t39070 - 11905: 0xF2A8,\n\t39071 - 11905: 0xF2A9,\n\t39072 - 11905: 0xB5DF,\n\t39073 - 11905: 0xF2AA,\n\t39074 - 11905: 0xF2AB,\n\t39075 - 11905: 0xEF4B,\n\t39076 - 11905: 0xB2FC,\n\t39077 - 11905: 0xF2AC,\n\t39078 - 11905: 0xF2AD,\n\t39079 - 11905: 0xC8A7,\n\t39080 - 11905: 0xEF4C,\n\t39081 - 11905: 0xEF4D,\n\t39082 - 11905: 0xEF4E,\n\t39083 - 11905: 0xEF4F,\n\t39084 - 11905: 0xEF50,\n\t39085 - 11905: 0xEF51,\n\t39086 - 11905: 0xEF52,\n\t39087 - 11905: 0xEF53,\n\t39088 - 11905: 0xEF54,\n\t39089 - 11905: 0xEF55,\n\t39090 - 11905: 0xEF56,\n\t39091 - 11905: 0xEF57,\n\t39092 - 11905: 0xEF58,\n\t39093 - 11905: 0xEF59,\n\t39094 - 11905: 0xEF5A,\n\t39095 - 11905: 0xEF5B,\n\t39096 - 11905: 0xEF5C,\n\t39097 - 11905: 0xEF5D,\n\t39098 - 11905: 0xEF5E,\n\t39099 - 11905: 0xEF5F,\n\t39100 - 11905: 0xEF60,\n\t39101 - 11905: 0xEF61,\n\t39102 - 11905: 0xEF62,\n\t39103 - 11905: 0xEF63,\n\t39104 - 11905: 0xEF64,\n\t39105 - 11905: 0xEF65,\n\t39106 - 11905: 0xEF66,\n\t39107 - 11905: 0xEF67,\n\t39108 - 11905: 0xEF68,\n\t39109 - 11905: 0xEF69,\n\t39110 - 11905: 0xEF6A,\n\t39111 - 11905: 0xEF6B,\n\t39112 - 11905: 0xEF6C,\n\t39113 - 11905: 0xEF6D,\n\t39114 - 11905: 0xEF6E,\n\t39115 - 11905: 0xEF6F,\n\t39116 - 11905: 0xEF70,\n\t39117 - 11905: 0xEF71,\n\t39118 - 11905: 0xB7E7,\n\t39119 - 11905: 0xEF72,\n\t39120 - 11905: 0xEF73,\n\t39121 - 11905: 0xECA9,\n\t39122 - 11905: 0xECAA,\n\t39123 - 11905: 0xECAB,\n\t39124 - 11905: 0xEF74,\n\t39125 - 11905: 0xECAC,\n\t39126 - 11905: 0xEF75,\n\t39127 - 11905: 0xEF76,\n\t39128 - 11905: 0xC6AE,\n\t39129 - 11905: 0xECAD,\n\t39130 - 11905: 0xECAE,\n\t39131 - 11905: 0xEF77,\n\t39132 - 11905: 0xEF78,\n\t39133 - 11905: 0xEF79,\n\t39134 - 11905: 0xB7C9,\n\t39135 - 11905: 0xCAB3,\n\t39136 - 11905: 0xEF7A,\n\t39137 - 11905: 0xEF7B,\n\t39138 - 11905: 0xEF7C,\n\t39139 - 11905: 0xEF7D,\n\t39140 - 11905: 0xEF7E,\n\t39141 - 11905: 0xEF80,\n\t39142 - 11905: 0xEF81,\n\t39143 - 11905: 0xE2B8,\n\t39144 - 11905: 0xF7CF,\n\t39145 - 11905: 0xEF82,\n\t39146 - 11905: 0xEF83,\n\t39147 - 11905: 0xEF84,\n\t39148 - 11905: 0xEF85,\n\t39149 - 11905: 0xEF86,\n\t39150 - 11905: 0xEF87,\n\t39151 - 11905: 0xEF88,\n\t39152 - 11905: 0xEF89,\n\t39153 - 11905: 0xEF8A,\n\t39154 - 11905: 0xEF8B,\n\t39155 - 11905: 0xEF8C,\n\t39156 - 11905: 0xEF8D,\n\t39157 - 11905: 0xEF8E,\n\t39158 - 11905: 0xEF8F,\n\t39159 - 11905: 0xEF90,\n\t39160 - 11905: 0xEF91,\n\t39161 - 11905: 0xEF92,\n\t39162 - 11905: 0xEF93,\n\t39163 - 11905: 0xEF94,\n\t39164 - 11905: 0xEF95,\n\t39165 - 11905: 0xEF96,\n\t39166 - 11905: 0xEF97,\n\t39167 - 11905: 0xEF98,\n\t39168 - 11905: 0xEF99,\n\t39169 - 11905: 0xEF9A,\n\t39170 - 11905: 0xEF9B,\n\t39171 - 11905: 0xEF9C,\n\t39172 - 11905: 0xEF9D,\n\t39173 - 11905: 0xEF9E,\n\t39174 - 11905: 0xEF9F,\n\t39175 - 11905: 0xEFA0,\n\t39176 - 11905: 0xF040,\n\t39177 - 11905: 0xF041,\n\t39178 - 11905: 0xF042,\n\t39179 - 11905: 0xF043,\n\t39180 - 11905: 0xF044,\n\t39181 - 11905: 0xF7D0,\n\t39182 - 11905: 0xF045,\n\t39183 - 11905: 0xF046,\n\t39184 - 11905: 0xB2CD,\n\t39185 - 11905: 0xF047,\n\t39186 - 11905: 0xF048,\n\t39187 - 11905: 0xF049,\n\t39188 - 11905: 0xF04A,\n\t39189 - 11905: 0xF04B,\n\t39190 - 11905: 0xF04C,\n\t39191 - 11905: 0xF04D,\n\t39192 - 11905: 0xF04E,\n\t39193 - 11905: 0xF04F,\n\t39194 - 11905: 0xF050,\n\t39195 - 11905: 0xF051,\n\t39196 - 11905: 0xF052,\n\t39197 - 11905: 0xF053,\n\t39198 - 11905: 0xF054,\n\t39199 - 11905: 0xF055,\n\t39200 - 11905: 0xF056,\n\t39201 - 11905: 0xF057,\n\t39202 - 11905: 0xF058,\n\t39203 - 11905: 0xF059,\n\t39204 - 11905: 0xF05A,\n\t39205 - 11905: 0xF05B,\n\t39206 - 11905: 0xF05C,\n\t39207 - 11905: 0xF05D,\n\t39208 - 11905: 0xF05E,\n\t39209 - 11905: 0xF05F,\n\t39210 - 11905: 0xF060,\n\t39211 - 11905: 0xF061,\n\t39212 - 11905: 0xF062,\n\t39213 - 11905: 0xF063,\n\t39214 - 11905: 0xF7D1,\n\t39215 - 11905: 0xF064,\n\t39216 - 11905: 0xF065,\n\t39217 - 11905: 0xF066,\n\t39218 - 11905: 0xF067,\n\t39219 - 11905: 0xF068,\n\t39220 - 11905: 0xF069,\n\t39221 - 11905: 0xF06A,\n\t39222 - 11905: 0xF06B,\n\t39223 - 11905: 0xF06C,\n\t39224 - 11905: 0xF06D,\n\t39225 - 11905: 0xF06E,\n\t39226 - 11905: 0xF06F,\n\t39227 - 11905: 0xF070,\n\t39228 - 11905: 0xF071,\n\t39229 - 11905: 0xF072,\n\t39230 - 11905: 0xF073,\n\t39231 - 11905: 0xF074,\n\t39232 - 11905: 0xF075,\n\t39233 - 11905: 0xF076,\n\t39234 - 11905: 0xF077,\n\t39235 - 11905: 0xF078,\n\t39236 - 11905: 0xF079,\n\t39237 - 11905: 0xF07A,\n\t39238 - 11905: 0xF07B,\n\t39239 - 11905: 0xF07C,\n\t39240 - 11905: 0xF07D,\n\t39241 - 11905: 0xF07E,\n\t39242 - 11905: 0xF080,\n\t39243 - 11905: 0xF081,\n\t39244 - 11905: 0xF082,\n\t39245 - 11905: 0xF083,\n\t39246 - 11905: 0xF084,\n\t39247 - 11905: 0xF085,\n\t39248 - 11905: 0xF086,\n\t39249 - 11905: 0xF087,\n\t39250 - 11905: 0xF088,\n\t39251 - 11905: 0xF089,\n\t39252 - 11905: 0xF7D3,\n\t39253 - 11905: 0xF7D2,\n\t39254 - 11905: 0xF08A,\n\t39255 - 11905: 0xF08B,\n\t39256 - 11905: 0xF08C,\n\t39257 - 11905: 0xF08D,\n\t39258 - 11905: 0xF08E,\n\t39259 - 11905: 0xF08F,\n\t39260 - 11905: 0xF090,\n\t39261 - 11905: 0xF091,\n\t39262 - 11905: 0xF092,\n\t39263 - 11905: 0xF093,\n\t39264 - 11905: 0xF094,\n\t39265 - 11905: 0xF095,\n\t39266 - 11905: 0xF096,\n\t39267 - 11905: 0xE2BB,\n\t39268 - 11905: 0xF097,\n\t39269 - 11905: 0xBCA2,\n\t39270 - 11905: 0xF098,\n\t39271 - 11905: 0xE2BC,\n\t39272 - 11905: 0xE2BD,\n\t39273 - 11905: 0xE2BE,\n\t39274 - 11905: 0xE2BF,\n\t39275 - 11905: 0xE2C0,\n\t39276 - 11905: 0xE2C1,\n\t39277 - 11905: 0xB7B9,\n\t39278 - 11905: 0xD2FB,\n\t39279 - 11905: 0xBDA4,\n\t39280 - 11905: 0xCACE,\n\t39281 - 11905: 0xB1A5,\n\t39282 - 11905: 0xCBC7,\n\t39283 - 11905: 0xF099,\n\t39284 - 11905: 0xE2C2,\n\t39285 - 11905: 0xB6FC,\n\t39286 - 11905: 0xC8C4,\n\t39287 - 11905: 0xE2C3,\n\t39288 - 11905: 0xF09A,\n\t39289 - 11905: 0xF09B,\n\t39290 - 11905: 0xBDC8,\n\t39291 - 11905: 0xF09C,\n\t39292 - 11905: 0xB1FD,\n\t39293 - 11905: 0xE2C4,\n\t39294 - 11905: 0xF09D,\n\t39295 - 11905: 0xB6F6,\n\t39296 - 11905: 0xE2C5,\n\t39297 - 11905: 0xC4D9,\n\t39298 - 11905: 0xF09E,\n\t39299 - 11905: 0xF09F,\n\t39300 - 11905: 0xE2C6,\n\t39301 - 11905: 0xCFDA,\n\t39302 - 11905: 0xB9DD,\n\t39303 - 11905: 0xE2C7,\n\t39304 - 11905: 0xC0A1,\n\t39305 - 11905: 0xF0A0,\n\t39306 - 11905: 0xE2C8,\n\t39307 - 11905: 0xB2F6,\n\t39308 - 11905: 0xF140,\n\t39309 - 11905: 0xE2C9,\n\t39310 - 11905: 0xF141,\n\t39311 - 11905: 0xC1F3,\n\t39312 - 11905: 0xE2CA,\n\t39313 - 11905: 0xE2CB,\n\t39314 - 11905: 0xC2F8,\n\t39315 - 11905: 0xE2CC,\n\t39316 - 11905: 0xE2CD,\n\t39317 - 11905: 0xE2CE,\n\t39318 - 11905: 0xCAD7,\n\t39319 - 11905: 0xD8B8,\n\t39320 - 11905: 0xD9E5,\n\t39321 - 11905: 0xCFE3,\n\t39322 - 11905: 0xF142,\n\t39323 - 11905: 0xF143,\n\t39324 - 11905: 0xF144,\n\t39325 - 11905: 0xF145,\n\t39326 - 11905: 0xF146,\n\t39327 - 11905: 0xF147,\n\t39328 - 11905: 0xF148,\n\t39329 - 11905: 0xF149,\n\t39330 - 11905: 0xF14A,\n\t39331 - 11905: 0xF14B,\n\t39332 - 11905: 0xF14C,\n\t39333 - 11905: 0xF0A5,\n\t39334 - 11905: 0xF14D,\n\t39335 - 11905: 0xF14E,\n\t39336 - 11905: 0xDCB0,\n\t39337 - 11905: 0xF14F,\n\t39338 - 11905: 0xF150,\n\t39339 - 11905: 0xF151,\n\t39340 - 11905: 0xF152,\n\t39341 - 11905: 0xF153,\n\t39342 - 11905: 0xF154,\n\t39343 - 11905: 0xF155,\n\t39344 - 11905: 0xF156,\n\t39345 - 11905: 0xF157,\n\t39346 - 11905: 0xF158,\n\t39347 - 11905: 0xF159,\n\t39348 - 11905: 0xF15A,\n\t39349 - 11905: 0xF15B,\n\t39350 - 11905: 0xF15C,\n\t39351 - 11905: 0xF15D,\n\t39352 - 11905: 0xF15E,\n\t39353 - 11905: 0xF15F,\n\t39354 - 11905: 0xF160,\n\t39355 - 11905: 0xF161,\n\t39356 - 11905: 0xF162,\n\t39357 - 11905: 0xF163,\n\t39358 - 11905: 0xF164,\n\t39359 - 11905: 0xF165,\n\t39360 - 11905: 0xF166,\n\t39361 - 11905: 0xF167,\n\t39362 - 11905: 0xF168,\n\t39363 - 11905: 0xF169,\n\t39364 - 11905: 0xF16A,\n\t39365 - 11905: 0xF16B,\n\t39366 - 11905: 0xF16C,\n\t39367 - 11905: 0xF16D,\n\t39368 - 11905: 0xF16E,\n\t39369 - 11905: 0xF16F,\n\t39370 - 11905: 0xF170,\n\t39371 - 11905: 0xF171,\n\t39372 - 11905: 0xF172,\n\t39373 - 11905: 0xF173,\n\t39374 - 11905: 0xF174,\n\t39375 - 11905: 0xF175,\n\t39376 - 11905: 0xF176,\n\t39377 - 11905: 0xF177,\n\t39378 - 11905: 0xF178,\n\t39379 - 11905: 0xF179,\n\t39380 - 11905: 0xF17A,\n\t39381 - 11905: 0xF17B,\n\t39382 - 11905: 0xF17C,\n\t39383 - 11905: 0xF17D,\n\t39384 - 11905: 0xF17E,\n\t39385 - 11905: 0xF180,\n\t39386 - 11905: 0xF181,\n\t39387 - 11905: 0xF182,\n\t39388 - 11905: 0xF183,\n\t39389 - 11905: 0xF184,\n\t39390 - 11905: 0xF185,\n\t39391 - 11905: 0xF186,\n\t39392 - 11905: 0xF187,\n\t39393 - 11905: 0xF188,\n\t39394 - 11905: 0xF189,\n\t39395 - 11905: 0xF18A,\n\t39396 - 11905: 0xF18B,\n\t39397 - 11905: 0xF18C,\n\t39398 - 11905: 0xF18D,\n\t39399 - 11905: 0xF18E,\n\t39400 - 11905: 0xF18F,\n\t39401 - 11905: 0xF190,\n\t39402 - 11905: 0xF191,\n\t39403 - 11905: 0xF192,\n\t39404 - 11905: 0xF193,\n\t39405 - 11905: 0xF194,\n\t39406 - 11905: 0xF195,\n\t39407 - 11905: 0xF196,\n\t39408 - 11905: 0xF197,\n\t39409 - 11905: 0xF198,\n\t39410 - 11905: 0xF199,\n\t39411 - 11905: 0xF19A,\n\t39412 - 11905: 0xF19B,\n\t39413 - 11905: 0xF19C,\n\t39414 - 11905: 0xF19D,\n\t39415 - 11905: 0xF19E,\n\t39416 - 11905: 0xF19F,\n\t39417 - 11905: 0xF1A0,\n\t39418 - 11905: 0xF240,\n\t39419 - 11905: 0xF241,\n\t39420 - 11905: 0xF242,\n\t39421 - 11905: 0xF243,\n\t39422 - 11905: 0xF244,\n\t39423 - 11905: 0xF245,\n\t39424 - 11905: 0xF246,\n\t39425 - 11905: 0xF247,\n\t39426 - 11905: 0xF248,\n\t39427 - 11905: 0xF249,\n\t39428 - 11905: 0xF24A,\n\t39429 - 11905: 0xF24B,\n\t39430 - 11905: 0xF24C,\n\t39431 - 11905: 0xF24D,\n\t39432 - 11905: 0xF24E,\n\t39433 - 11905: 0xF24F,\n\t39434 - 11905: 0xF250,\n\t39435 - 11905: 0xF251,\n\t39436 - 11905: 0xF252,\n\t39437 - 11905: 0xF253,\n\t39438 - 11905: 0xF254,\n\t39439 - 11905: 0xF255,\n\t39440 - 11905: 0xF256,\n\t39441 - 11905: 0xF257,\n\t39442 - 11905: 0xF258,\n\t39443 - 11905: 0xF259,\n\t39444 - 11905: 0xF25A,\n\t39445 - 11905: 0xF25B,\n\t39446 - 11905: 0xF25C,\n\t39447 - 11905: 0xF25D,\n\t39448 - 11905: 0xF25E,\n\t39449 - 11905: 0xF25F,\n\t39450 - 11905: 0xF260,\n\t39451 - 11905: 0xF261,\n\t39452 - 11905: 0xF262,\n\t39453 - 11905: 0xF263,\n\t39454 - 11905: 0xF264,\n\t39455 - 11905: 0xF265,\n\t39456 - 11905: 0xF266,\n\t39457 - 11905: 0xF267,\n\t39458 - 11905: 0xF268,\n\t39459 - 11905: 0xF269,\n\t39460 - 11905: 0xF26A,\n\t39461 - 11905: 0xF26B,\n\t39462 - 11905: 0xF26C,\n\t39463 - 11905: 0xF26D,\n\t39464 - 11905: 0xF26E,\n\t39465 - 11905: 0xF26F,\n\t39466 - 11905: 0xF270,\n\t39467 - 11905: 0xF271,\n\t39468 - 11905: 0xF272,\n\t39469 - 11905: 0xF273,\n\t39470 - 11905: 0xF274,\n\t39471 - 11905: 0xF275,\n\t39472 - 11905: 0xF276,\n\t39473 - 11905: 0xF277,\n\t39474 - 11905: 0xF278,\n\t39475 - 11905: 0xF279,\n\t39476 - 11905: 0xF27A,\n\t39477 - 11905: 0xF27B,\n\t39478 - 11905: 0xF27C,\n\t39479 - 11905: 0xF27D,\n\t39480 - 11905: 0xF27E,\n\t39481 - 11905: 0xF280,\n\t39482 - 11905: 0xF281,\n\t39483 - 11905: 0xF282,\n\t39484 - 11905: 0xF283,\n\t39485 - 11905: 0xF284,\n\t39486 - 11905: 0xF285,\n\t39487 - 11905: 0xF286,\n\t39488 - 11905: 0xF287,\n\t39489 - 11905: 0xF288,\n\t39490 - 11905: 0xF289,\n\t39491 - 11905: 0xF28A,\n\t39492 - 11905: 0xF28B,\n\t39493 - 11905: 0xF28C,\n\t39494 - 11905: 0xF28D,\n\t39495 - 11905: 0xF28E,\n\t39496 - 11905: 0xF28F,\n\t39497 - 11905: 0xF290,\n\t39498 - 11905: 0xF291,\n\t39499 - 11905: 0xF292,\n\t39500 - 11905: 0xF293,\n\t39501 - 11905: 0xF294,\n\t39502 - 11905: 0xF295,\n\t39503 - 11905: 0xF296,\n\t39504 - 11905: 0xF297,\n\t39505 - 11905: 0xF298,\n\t39506 - 11905: 0xF299,\n\t39507 - 11905: 0xF29A,\n\t39508 - 11905: 0xF29B,\n\t39509 - 11905: 0xF29C,\n\t39510 - 11905: 0xF29D,\n\t39511 - 11905: 0xF29E,\n\t39512 - 11905: 0xF29F,\n\t39513 - 11905: 0xF2A0,\n\t39514 - 11905: 0xF340,\n\t39515 - 11905: 0xF341,\n\t39516 - 11905: 0xF342,\n\t39517 - 11905: 0xF343,\n\t39518 - 11905: 0xF344,\n\t39519 - 11905: 0xF345,\n\t39520 - 11905: 0xF346,\n\t39521 - 11905: 0xF347,\n\t39522 - 11905: 0xF348,\n\t39523 - 11905: 0xF349,\n\t39524 - 11905: 0xF34A,\n\t39525 - 11905: 0xF34B,\n\t39526 - 11905: 0xF34C,\n\t39527 - 11905: 0xF34D,\n\t39528 - 11905: 0xF34E,\n\t39529 - 11905: 0xF34F,\n\t39530 - 11905: 0xF350,\n\t39531 - 11905: 0xF351,\n\t39532 - 11905: 0xC2ED,\n\t39533 - 11905: 0xD4A6,\n\t39534 - 11905: 0xCDD4,\n\t39535 - 11905: 0xD1B1,\n\t39536 - 11905: 0xB3DB,\n\t39537 - 11905: 0xC7FD,\n\t39538 - 11905: 0xF352,\n\t39539 - 11905: 0xB2B5,\n\t39540 - 11905: 0xC2BF,\n\t39541 - 11905: 0xE6E0,\n\t39542 - 11905: 0xCABB,\n\t39543 - 11905: 0xE6E1,\n\t39544 - 11905: 0xE6E2,\n\t39545 - 11905: 0xBED4,\n\t39546 - 11905: 0xE6E3,\n\t39547 - 11905: 0xD7A4,\n\t39548 - 11905: 0xCDD5,\n\t39549 - 11905: 0xE6E5,\n\t39550 - 11905: 0xBCDD,\n\t39551 - 11905: 0xE6E4,\n\t39552 - 11905: 0xE6E6,\n\t39553 - 11905: 0xE6E7,\n\t39554 - 11905: 0xC2EE,\n\t39555 - 11905: 0xF353,\n\t39556 - 11905: 0xBDBE,\n\t39557 - 11905: 0xE6E8,\n\t39558 - 11905: 0xC2E6,\n\t39559 - 11905: 0xBAA7,\n\t39560 - 11905: 0xE6E9,\n\t39561 - 11905: 0xF354,\n\t39562 - 11905: 0xE6EA,\n\t39563 - 11905: 0xB3D2,\n\t39564 - 11905: 0xD1E9,\n\t39565 - 11905: 0xF355,\n\t39566 - 11905: 0xF356,\n\t39567 - 11905: 0xBFA5,\n\t39568 - 11905: 0xE6EB,\n\t39569 - 11905: 0xC6EF,\n\t39570 - 11905: 0xE6EC,\n\t39571 - 11905: 0xE6ED,\n\t39572 - 11905: 0xF357,\n\t39573 - 11905: 0xF358,\n\t39574 - 11905: 0xE6EE,\n\t39575 - 11905: 0xC6AD,\n\t39576 - 11905: 0xE6EF,\n\t39577 - 11905: 0xF359,\n\t39578 - 11905: 0xC9A7,\n\t39579 - 11905: 0xE6F0,\n\t39580 - 11905: 0xE6F1,\n\t39581 - 11905: 0xE6F2,\n\t39582 - 11905: 0xE5B9,\n\t39583 - 11905: 0xE6F3,\n\t39584 - 11905: 0xE6F4,\n\t39585 - 11905: 0xC2E2,\n\t39586 - 11905: 0xE6F5,\n\t39587 - 11905: 0xE6F6,\n\t39588 - 11905: 0xD6E8,\n\t39589 - 11905: 0xE6F7,\n\t39590 - 11905: 0xF35A,\n\t39591 - 11905: 0xE6F8,\n\t39592 - 11905: 0xB9C7,\n\t39593 - 11905: 0xF35B,\n\t39594 - 11905: 0xF35C,\n\t39595 - 11905: 0xF35D,\n\t39596 - 11905: 0xF35E,\n\t39597 - 11905: 0xF35F,\n\t39598 - 11905: 0xF360,\n\t39599 - 11905: 0xF361,\n\t39600 - 11905: 0xF7BB,\n\t39601 - 11905: 0xF7BA,\n\t39602 - 11905: 0xF362,\n\t39603 - 11905: 0xF363,\n\t39604 - 11905: 0xF364,\n\t39605 - 11905: 0xF365,\n\t39606 - 11905: 0xF7BE,\n\t39607 - 11905: 0xF7BC,\n\t39608 - 11905: 0xBAA1,\n\t39609 - 11905: 0xF366,\n\t39610 - 11905: 0xF7BF,\n\t39611 - 11905: 0xF367,\n\t39612 - 11905: 0xF7C0,\n\t39613 - 11905: 0xF368,\n\t39614 - 11905: 0xF369,\n\t39615 - 11905: 0xF36A,\n\t39616 - 11905: 0xF7C2,\n\t39617 - 11905: 0xF7C1,\n\t39618 - 11905: 0xF7C4,\n\t39619 - 11905: 0xF36B,\n\t39620 - 11905: 0xF36C,\n\t39621 - 11905: 0xF7C3,\n\t39622 - 11905: 0xF36D,\n\t39623 - 11905: 0xF36E,\n\t39624 - 11905: 0xF36F,\n\t39625 - 11905: 0xF370,\n\t39626 - 11905: 0xF371,\n\t39627 - 11905: 0xF7C5,\n\t39628 - 11905: 0xF7C6,\n\t39629 - 11905: 0xF372,\n\t39630 - 11905: 0xF373,\n\t39631 - 11905: 0xF374,\n\t39632 - 11905: 0xF375,\n\t39633 - 11905: 0xF7C7,\n\t39634 - 11905: 0xF376,\n\t39635 - 11905: 0xCBE8,\n\t39636 - 11905: 0xF377,\n\t39637 - 11905: 0xF378,\n\t39638 - 11905: 0xF379,\n\t39639 - 11905: 0xF37A,\n\t39640 - 11905: 0xB8DF,\n\t39641 - 11905: 0xF37B,\n\t39642 - 11905: 0xF37C,\n\t39643 - 11905: 0xF37D,\n\t39644 - 11905: 0xF37E,\n\t39645 - 11905: 0xF380,\n\t39646 - 11905: 0xF381,\n\t39647 - 11905: 0xF7D4,\n\t39648 - 11905: 0xF382,\n\t39649 - 11905: 0xF7D5,\n\t39650 - 11905: 0xF383,\n\t39651 - 11905: 0xF384,\n\t39652 - 11905: 0xF385,\n\t39653 - 11905: 0xF386,\n\t39654 - 11905: 0xF7D6,\n\t39655 - 11905: 0xF387,\n\t39656 - 11905: 0xF388,\n\t39657 - 11905: 0xF389,\n\t39658 - 11905: 0xF38A,\n\t39659 - 11905: 0xF7D8,\n\t39660 - 11905: 0xF38B,\n\t39661 - 11905: 0xF7DA,\n\t39662 - 11905: 0xF38C,\n\t39663 - 11905: 0xF7D7,\n\t39664 - 11905: 0xF38D,\n\t39665 - 11905: 0xF38E,\n\t39666 - 11905: 0xF38F,\n\t39667 - 11905: 0xF390,\n\t39668 - 11905: 0xF391,\n\t39669 - 11905: 0xF392,\n\t39670 - 11905: 0xF393,\n\t39671 - 11905: 0xF394,\n\t39672 - 11905: 0xF395,\n\t39673 - 11905: 0xF7DB,\n\t39674 - 11905: 0xF396,\n\t39675 - 11905: 0xF7D9,\n\t39676 - 11905: 0xF397,\n\t39677 - 11905: 0xF398,\n\t39678 - 11905: 0xF399,\n\t39679 - 11905: 0xF39A,\n\t39680 - 11905: 0xF39B,\n\t39681 - 11905: 0xF39C,\n\t39682 - 11905: 0xF39D,\n\t39683 - 11905: 0xD7D7,\n\t39684 - 11905: 0xF39E,\n\t39685 - 11905: 0xF39F,\n\t39686 - 11905: 0xF3A0,\n\t39687 - 11905: 0xF440,\n\t39688 - 11905: 0xF7DC,\n\t39689 - 11905: 0xF441,\n\t39690 - 11905: 0xF442,\n\t39691 - 11905: 0xF443,\n\t39692 - 11905: 0xF444,\n\t39693 - 11905: 0xF445,\n\t39694 - 11905: 0xF446,\n\t39695 - 11905: 0xF7DD,\n\t39696 - 11905: 0xF447,\n\t39697 - 11905: 0xF448,\n\t39698 - 11905: 0xF449,\n\t39699 - 11905: 0xF7DE,\n\t39700 - 11905: 0xF44A,\n\t39701 - 11905: 0xF44B,\n\t39702 - 11905: 0xF44C,\n\t39703 - 11905: 0xF44D,\n\t39704 - 11905: 0xF44E,\n\t39705 - 11905: 0xF44F,\n\t39706 - 11905: 0xF450,\n\t39707 - 11905: 0xF451,\n\t39708 - 11905: 0xF452,\n\t39709 - 11905: 0xF453,\n\t39710 - 11905: 0xF454,\n\t39711 - 11905: 0xF7DF,\n\t39712 - 11905: 0xF455,\n\t39713 - 11905: 0xF456,\n\t39714 - 11905: 0xF457,\n\t39715 - 11905: 0xF7E0,\n\t39716 - 11905: 0xF458,\n\t39717 - 11905: 0xF459,\n\t39718 - 11905: 0xF45A,\n\t39719 - 11905: 0xF45B,\n\t39720 - 11905: 0xF45C,\n\t39721 - 11905: 0xF45D,\n\t39722 - 11905: 0xF45E,\n\t39723 - 11905: 0xF45F,\n\t39724 - 11905: 0xF460,\n\t39725 - 11905: 0xF461,\n\t39726 - 11905: 0xF462,\n\t39727 - 11905: 0xDBCB,\n\t39728 - 11905: 0xF463,\n\t39729 - 11905: 0xF464,\n\t39730 - 11905: 0xD8AA,\n\t39731 - 11905: 0xF465,\n\t39732 - 11905: 0xF466,\n\t39733 - 11905: 0xF467,\n\t39734 - 11905: 0xF468,\n\t39735 - 11905: 0xF469,\n\t39736 - 11905: 0xF46A,\n\t39737 - 11905: 0xF46B,\n\t39738 - 11905: 0xF46C,\n\t39739 - 11905: 0xE5F7,\n\t39740 - 11905: 0xB9ED,\n\t39741 - 11905: 0xF46D,\n\t39742 - 11905: 0xF46E,\n\t39743 - 11905: 0xF46F,\n\t39744 - 11905: 0xF470,\n\t39745 - 11905: 0xBFFD,\n\t39746 - 11905: 0xBBEA,\n\t39747 - 11905: 0xF7C9,\n\t39748 - 11905: 0xC6C7,\n\t39749 - 11905: 0xF7C8,\n\t39750 - 11905: 0xF471,\n\t39751 - 11905: 0xF7CA,\n\t39752 - 11905: 0xF7CC,\n\t39753 - 11905: 0xF7CB,\n\t39754 - 11905: 0xF472,\n\t39755 - 11905: 0xF473,\n\t39756 - 11905: 0xF474,\n\t39757 - 11905: 0xF7CD,\n\t39758 - 11905: 0xF475,\n\t39759 - 11905: 0xCEBA,\n\t39760 - 11905: 0xF476,\n\t39761 - 11905: 0xF7CE,\n\t39762 - 11905: 0xF477,\n\t39763 - 11905: 0xF478,\n\t39764 - 11905: 0xC4A7,\n\t39765 - 11905: 0xF479,\n\t39766 - 11905: 0xF47A,\n\t39767 - 11905: 0xF47B,\n\t39768 - 11905: 0xF47C,\n\t39769 - 11905: 0xF47D,\n\t39770 - 11905: 0xF47E,\n\t39771 - 11905: 0xF480,\n\t39772 - 11905: 0xF481,\n\t39773 - 11905: 0xF482,\n\t39774 - 11905: 0xF483,\n\t39775 - 11905: 0xF484,\n\t39776 - 11905: 0xF485,\n\t39777 - 11905: 0xF486,\n\t39778 - 11905: 0xF487,\n\t39779 - 11905: 0xF488,\n\t39780 - 11905: 0xF489,\n\t39781 - 11905: 0xF48A,\n\t39782 - 11905: 0xF48B,\n\t39783 - 11905: 0xF48C,\n\t39784 - 11905: 0xF48D,\n\t39785 - 11905: 0xF48E,\n\t39786 - 11905: 0xF48F,\n\t39787 - 11905: 0xF490,\n\t39788 - 11905: 0xF491,\n\t39789 - 11905: 0xF492,\n\t39790 - 11905: 0xF493,\n\t39791 - 11905: 0xF494,\n\t39792 - 11905: 0xF495,\n\t39793 - 11905: 0xF496,\n\t39794 - 11905: 0xF497,\n\t39795 - 11905: 0xF498,\n\t39796 - 11905: 0xF499,\n\t39797 - 11905: 0xF49A,\n\t39798 - 11905: 0xF49B,\n\t39799 - 11905: 0xF49C,\n\t39800 - 11905: 0xF49D,\n\t39801 - 11905: 0xF49E,\n\t39802 - 11905: 0xF49F,\n\t39803 - 11905: 0xF4A0,\n\t39804 - 11905: 0xF540,\n\t39805 - 11905: 0xF541,\n\t39806 - 11905: 0xF542,\n\t39807 - 11905: 0xF543,\n\t39808 - 11905: 0xF544,\n\t39809 - 11905: 0xF545,\n\t39810 - 11905: 0xF546,\n\t39811 - 11905: 0xF547,\n\t39812 - 11905: 0xF548,\n\t39813 - 11905: 0xF549,\n\t39814 - 11905: 0xF54A,\n\t39815 - 11905: 0xF54B,\n\t39816 - 11905: 0xF54C,\n\t39817 - 11905: 0xF54D,\n\t39818 - 11905: 0xF54E,\n\t39819 - 11905: 0xF54F,\n\t39820 - 11905: 0xF550,\n\t39821 - 11905: 0xF551,\n\t39822 - 11905: 0xF552,\n\t39823 - 11905: 0xF553,\n\t39824 - 11905: 0xF554,\n\t39825 - 11905: 0xF555,\n\t39826 - 11905: 0xF556,\n\t39827 - 11905: 0xF557,\n\t39828 - 11905: 0xF558,\n\t39829 - 11905: 0xF559,\n\t39830 - 11905: 0xF55A,\n\t39831 - 11905: 0xF55B,\n\t39832 - 11905: 0xF55C,\n\t39833 - 11905: 0xF55D,\n\t39834 - 11905: 0xF55E,\n\t39835 - 11905: 0xF55F,\n\t39836 - 11905: 0xF560,\n\t39837 - 11905: 0xF561,\n\t39838 - 11905: 0xF562,\n\t39839 - 11905: 0xF563,\n\t39840 - 11905: 0xF564,\n\t39841 - 11905: 0xF565,\n\t39842 - 11905: 0xF566,\n\t39843 - 11905: 0xF567,\n\t39844 - 11905: 0xF568,\n\t39845 - 11905: 0xF569,\n\t39846 - 11905: 0xF56A,\n\t39847 - 11905: 0xF56B,\n\t39848 - 11905: 0xF56C,\n\t39849 - 11905: 0xF56D,\n\t39850 - 11905: 0xF56E,\n\t39851 - 11905: 0xF56F,\n\t39852 - 11905: 0xF570,\n\t39853 - 11905: 0xF571,\n\t39854 - 11905: 0xF572,\n\t39855 - 11905: 0xF573,\n\t39856 - 11905: 0xF574,\n\t39857 - 11905: 0xF575,\n\t39858 - 11905: 0xF576,\n\t39859 - 11905: 0xF577,\n\t39860 - 11905: 0xF578,\n\t39861 - 11905: 0xF579,\n\t39862 - 11905: 0xF57A,\n\t39863 - 11905: 0xF57B,\n\t39864 - 11905: 0xF57C,\n\t39865 - 11905: 0xF57D,\n\t39866 - 11905: 0xF57E,\n\t39867 - 11905: 0xF580,\n\t39868 - 11905: 0xF581,\n\t39869 - 11905: 0xF582,\n\t39870 - 11905: 0xF583,\n\t39871 - 11905: 0xF584,\n\t39872 - 11905: 0xF585,\n\t39873 - 11905: 0xF586,\n\t39874 - 11905: 0xF587,\n\t39875 - 11905: 0xF588,\n\t39876 - 11905: 0xF589,\n\t39877 - 11905: 0xF58A,\n\t39878 - 11905: 0xF58B,\n\t39879 - 11905: 0xF58C,\n\t39880 - 11905: 0xF58D,\n\t39881 - 11905: 0xF58E,\n\t39882 - 11905: 0xF58F,\n\t39883 - 11905: 0xF590,\n\t39884 - 11905: 0xF591,\n\t39885 - 11905: 0xF592,\n\t39886 - 11905: 0xF593,\n\t39887 - 11905: 0xF594,\n\t39888 - 11905: 0xF595,\n\t39889 - 11905: 0xF596,\n\t39890 - 11905: 0xF597,\n\t39891 - 11905: 0xF598,\n\t39892 - 11905: 0xF599,\n\t39893 - 11905: 0xF59A,\n\t39894 - 11905: 0xF59B,\n\t39895 - 11905: 0xF59C,\n\t39896 - 11905: 0xF59D,\n\t39897 - 11905: 0xF59E,\n\t39898 - 11905: 0xF59F,\n\t39899 - 11905: 0xF5A0,\n\t39900 - 11905: 0xF640,\n\t39901 - 11905: 0xF641,\n\t39902 - 11905: 0xF642,\n\t39903 - 11905: 0xF643,\n\t39904 - 11905: 0xF644,\n\t39905 - 11905: 0xF645,\n\t39906 - 11905: 0xF646,\n\t39907 - 11905: 0xF647,\n\t39908 - 11905: 0xF648,\n\t39909 - 11905: 0xF649,\n\t39910 - 11905: 0xF64A,\n\t39911 - 11905: 0xF64B,\n\t39912 - 11905: 0xF64C,\n\t39913 - 11905: 0xF64D,\n\t39914 - 11905: 0xF64E,\n\t39915 - 11905: 0xF64F,\n\t39916 - 11905: 0xF650,\n\t39917 - 11905: 0xF651,\n\t39918 - 11905: 0xF652,\n\t39919 - 11905: 0xF653,\n\t39920 - 11905: 0xF654,\n\t39921 - 11905: 0xF655,\n\t39922 - 11905: 0xF656,\n\t39923 - 11905: 0xF657,\n\t39924 - 11905: 0xF658,\n\t39925 - 11905: 0xF659,\n\t39926 - 11905: 0xF65A,\n\t39927 - 11905: 0xF65B,\n\t39928 - 11905: 0xF65C,\n\t39929 - 11905: 0xF65D,\n\t39930 - 11905: 0xF65E,\n\t39931 - 11905: 0xF65F,\n\t39932 - 11905: 0xF660,\n\t39933 - 11905: 0xF661,\n\t39934 - 11905: 0xF662,\n\t39935 - 11905: 0xF663,\n\t39936 - 11905: 0xF664,\n\t39937 - 11905: 0xF665,\n\t39938 - 11905: 0xF666,\n\t39939 - 11905: 0xF667,\n\t39940 - 11905: 0xF668,\n\t39941 - 11905: 0xF669,\n\t39942 - 11905: 0xF66A,\n\t39943 - 11905: 0xF66B,\n\t39944 - 11905: 0xF66C,\n\t39945 - 11905: 0xF66D,\n\t39946 - 11905: 0xF66E,\n\t39947 - 11905: 0xF66F,\n\t39948 - 11905: 0xF670,\n\t39949 - 11905: 0xF671,\n\t39950 - 11905: 0xF672,\n\t39951 - 11905: 0xF673,\n\t39952 - 11905: 0xF674,\n\t39953 - 11905: 0xF675,\n\t39954 - 11905: 0xF676,\n\t39955 - 11905: 0xF677,\n\t39956 - 11905: 0xF678,\n\t39957 - 11905: 0xF679,\n\t39958 - 11905: 0xF67A,\n\t39959 - 11905: 0xF67B,\n\t39960 - 11905: 0xF67C,\n\t39961 - 11905: 0xF67D,\n\t39962 - 11905: 0xF67E,\n\t39963 - 11905: 0xF680,\n\t39964 - 11905: 0xF681,\n\t39965 - 11905: 0xF682,\n\t39966 - 11905: 0xF683,\n\t39967 - 11905: 0xF684,\n\t39968 - 11905: 0xF685,\n\t39969 - 11905: 0xF686,\n\t39970 - 11905: 0xF687,\n\t39971 - 11905: 0xF688,\n\t39972 - 11905: 0xF689,\n\t39973 - 11905: 0xF68A,\n\t39974 - 11905: 0xF68B,\n\t39975 - 11905: 0xF68C,\n\t39976 - 11905: 0xF68D,\n\t39977 - 11905: 0xF68E,\n\t39978 - 11905: 0xF68F,\n\t39979 - 11905: 0xF690,\n\t39980 - 11905: 0xF691,\n\t39981 - 11905: 0xF692,\n\t39982 - 11905: 0xF693,\n\t39983 - 11905: 0xF694,\n\t39984 - 11905: 0xF695,\n\t39985 - 11905: 0xF696,\n\t39986 - 11905: 0xF697,\n\t39987 - 11905: 0xF698,\n\t39988 - 11905: 0xF699,\n\t39989 - 11905: 0xF69A,\n\t39990 - 11905: 0xF69B,\n\t39991 - 11905: 0xF69C,\n\t39992 - 11905: 0xF69D,\n\t39993 - 11905: 0xF69E,\n\t39994 - 11905: 0xF69F,\n\t39995 - 11905: 0xF6A0,\n\t39996 - 11905: 0xF740,\n\t39997 - 11905: 0xF741,\n\t39998 - 11905: 0xF742,\n\t39999 - 11905: 0xF743,\n\t40000 - 11905: 0xF744,\n\t40001 - 11905: 0xF745,\n\t40002 - 11905: 0xF746,\n\t40003 - 11905: 0xF747,\n\t40004 - 11905: 0xF748,\n\t40005 - 11905: 0xF749,\n\t40006 - 11905: 0xF74A,\n\t40007 - 11905: 0xF74B,\n\t40008 - 11905: 0xF74C,\n\t40009 - 11905: 0xF74D,\n\t40010 - 11905: 0xF74E,\n\t40011 - 11905: 0xF74F,\n\t40012 - 11905: 0xF750,\n\t40013 - 11905: 0xF751,\n\t40014 - 11905: 0xF752,\n\t40015 - 11905: 0xF753,\n\t40016 - 11905: 0xF754,\n\t40017 - 11905: 0xF755,\n\t40018 - 11905: 0xF756,\n\t40019 - 11905: 0xF757,\n\t40020 - 11905: 0xF758,\n\t40021 - 11905: 0xF759,\n\t40022 - 11905: 0xF75A,\n\t40023 - 11905: 0xF75B,\n\t40024 - 11905: 0xF75C,\n\t40025 - 11905: 0xF75D,\n\t40026 - 11905: 0xF75E,\n\t40027 - 11905: 0xF75F,\n\t40028 - 11905: 0xF760,\n\t40029 - 11905: 0xF761,\n\t40030 - 11905: 0xF762,\n\t40031 - 11905: 0xF763,\n\t40032 - 11905: 0xF764,\n\t40033 - 11905: 0xF765,\n\t40034 - 11905: 0xF766,\n\t40035 - 11905: 0xF767,\n\t40036 - 11905: 0xF768,\n\t40037 - 11905: 0xF769,\n\t40038 - 11905: 0xF76A,\n\t40039 - 11905: 0xF76B,\n\t40040 - 11905: 0xF76C,\n\t40041 - 11905: 0xF76D,\n\t40042 - 11905: 0xF76E,\n\t40043 - 11905: 0xF76F,\n\t40044 - 11905: 0xF770,\n\t40045 - 11905: 0xF771,\n\t40046 - 11905: 0xF772,\n\t40047 - 11905: 0xF773,\n\t40048 - 11905: 0xF774,\n\t40049 - 11905: 0xF775,\n\t40050 - 11905: 0xF776,\n\t40051 - 11905: 0xF777,\n\t40052 - 11905: 0xF778,\n\t40053 - 11905: 0xF779,\n\t40054 - 11905: 0xF77A,\n\t40055 - 11905: 0xF77B,\n\t40056 - 11905: 0xF77C,\n\t40057 - 11905: 0xF77D,\n\t40058 - 11905: 0xF77E,\n\t40059 - 11905: 0xF780,\n\t40060 - 11905: 0xD3E3,\n\t40061 - 11905: 0xF781,\n\t40062 - 11905: 0xF782,\n\t40063 - 11905: 0xF6CF,\n\t40064 - 11905: 0xF783,\n\t40065 - 11905: 0xC2B3,\n\t40066 - 11905: 0xF6D0,\n\t40067 - 11905: 0xF784,\n\t40068 - 11905: 0xF785,\n\t40069 - 11905: 0xF6D1,\n\t40070 - 11905: 0xF6D2,\n\t40071 - 11905: 0xF6D3,\n\t40072 - 11905: 0xF6D4,\n\t40073 - 11905: 0xF786,\n\t40074 - 11905: 0xF787,\n\t40075 - 11905: 0xF6D6,\n\t40076 - 11905: 0xF788,\n\t40077 - 11905: 0xB1AB,\n\t40078 - 11905: 0xF6D7,\n\t40079 - 11905: 0xF789,\n\t40080 - 11905: 0xF6D8,\n\t40081 - 11905: 0xF6D9,\n\t40082 - 11905: 0xF6DA,\n\t40083 - 11905: 0xF78A,\n\t40084 - 11905: 0xF6DB,\n\t40085 - 11905: 0xF6DC,\n\t40086 - 11905: 0xF78B,\n\t40087 - 11905: 0xF78C,\n\t40088 - 11905: 0xF78D,\n\t40089 - 11905: 0xF78E,\n\t40090 - 11905: 0xF6DD,\n\t40091 - 11905: 0xF6DE,\n\t40092 - 11905: 0xCFCA,\n\t40093 - 11905: 0xF78F,\n\t40094 - 11905: 0xF6DF,\n\t40095 - 11905: 0xF6E0,\n\t40096 - 11905: 0xF6E1,\n\t40097 - 11905: 0xF6E2,\n\t40098 - 11905: 0xF6E3,\n\t40099 - 11905: 0xF6E4,\n\t40100 - 11905: 0xC0F0,\n\t40101 - 11905: 0xF6E5,\n\t40102 - 11905: 0xF6E6,\n\t40103 - 11905: 0xF6E7,\n\t40104 - 11905: 0xF6E8,\n\t40105 - 11905: 0xF6E9,\n\t40106 - 11905: 0xF790,\n\t40107 - 11905: 0xF6EA,\n\t40108 - 11905: 0xF791,\n\t40109 - 11905: 0xF6EB,\n\t40110 - 11905: 0xF6EC,\n\t40111 - 11905: 0xF792,\n\t40112 - 11905: 0xF6ED,\n\t40113 - 11905: 0xF6EE,\n\t40114 - 11905: 0xF6EF,\n\t40115 - 11905: 0xF6F0,\n\t40116 - 11905: 0xF6F1,\n\t40117 - 11905: 0xF6F2,\n\t40118 - 11905: 0xF6F3,\n\t40119 - 11905: 0xF6F4,\n\t40120 - 11905: 0xBEA8,\n\t40121 - 11905: 0xF793,\n\t40122 - 11905: 0xF6F5,\n\t40123 - 11905: 0xF6F6,\n\t40124 - 11905: 0xF6F7,\n\t40125 - 11905: 0xF6F8,\n\t40126 - 11905: 0xF794,\n\t40127 - 11905: 0xF795,\n\t40128 - 11905: 0xF796,\n\t40129 - 11905: 0xF797,\n\t40130 - 11905: 0xF798,\n\t40131 - 11905: 0xC8FA,\n\t40132 - 11905: 0xF6F9,\n\t40133 - 11905: 0xF6FA,\n\t40134 - 11905: 0xF6FB,\n\t40135 - 11905: 0xF6FC,\n\t40136 - 11905: 0xF799,\n\t40137 - 11905: 0xF79A,\n\t40138 - 11905: 0xF6FD,\n\t40139 - 11905: 0xF6FE,\n\t40140 - 11905: 0xF7A1,\n\t40141 - 11905: 0xF7A2,\n\t40142 - 11905: 0xF7A3,\n\t40143 - 11905: 0xF7A4,\n\t40144 - 11905: 0xF7A5,\n\t40145 - 11905: 0xF79B,\n\t40146 - 11905: 0xF79C,\n\t40147 - 11905: 0xF7A6,\n\t40148 - 11905: 0xF7A7,\n\t40149 - 11905: 0xF7A8,\n\t40150 - 11905: 0xB1EE,\n\t40151 - 11905: 0xF7A9,\n\t40152 - 11905: 0xF7AA,\n\t40153 - 11905: 0xF7AB,\n\t40154 - 11905: 0xF79D,\n\t40155 - 11905: 0xF79E,\n\t40156 - 11905: 0xF7AC,\n\t40157 - 11905: 0xF7AD,\n\t40158 - 11905: 0xC1DB,\n\t40159 - 11905: 0xF7AE,\n\t40160 - 11905: 0xF79F,\n\t40161 - 11905: 0xF7A0,\n\t40162 - 11905: 0xF7AF,\n\t40163 - 11905: 0xF840,\n\t40164 - 11905: 0xF841,\n\t40165 - 11905: 0xF842,\n\t40166 - 11905: 0xF843,\n\t40167 - 11905: 0xF844,\n\t40168 - 11905: 0xF845,\n\t40169 - 11905: 0xF846,\n\t40170 - 11905: 0xF847,\n\t40171 - 11905: 0xF848,\n\t40172 - 11905: 0xF849,\n\t40173 - 11905: 0xF84A,\n\t40174 - 11905: 0xF84B,\n\t40175 - 11905: 0xF84C,\n\t40176 - 11905: 0xF84D,\n\t40177 - 11905: 0xF84E,\n\t40178 - 11905: 0xF84F,\n\t40179 - 11905: 0xF850,\n\t40180 - 11905: 0xF851,\n\t40181 - 11905: 0xF852,\n\t40182 - 11905: 0xF853,\n\t40183 - 11905: 0xF854,\n\t40184 - 11905: 0xF855,\n\t40185 - 11905: 0xF856,\n\t40186 - 11905: 0xF857,\n\t40187 - 11905: 0xF858,\n\t40188 - 11905: 0xF859,\n\t40189 - 11905: 0xF85A,\n\t40190 - 11905: 0xF85B,\n\t40191 - 11905: 0xF85C,\n\t40192 - 11905: 0xF85D,\n\t40193 - 11905: 0xF85E,\n\t40194 - 11905: 0xF85F,\n\t40195 - 11905: 0xF860,\n\t40196 - 11905: 0xF861,\n\t40197 - 11905: 0xF862,\n\t40198 - 11905: 0xF863,\n\t40199 - 11905: 0xF864,\n\t40200 - 11905: 0xF865,\n\t40201 - 11905: 0xF866,\n\t40202 - 11905: 0xF867,\n\t40203 - 11905: 0xF868,\n\t40204 - 11905: 0xF869,\n\t40205 - 11905: 0xF86A,\n\t40206 - 11905: 0xF86B,\n\t40207 - 11905: 0xF86C,\n\t40208 - 11905: 0xF86D,\n\t40209 - 11905: 0xF86E,\n\t40210 - 11905: 0xF86F,\n\t40211 - 11905: 0xF870,\n\t40212 - 11905: 0xF871,\n\t40213 - 11905: 0xF872,\n\t40214 - 11905: 0xF873,\n\t40215 - 11905: 0xF874,\n\t40216 - 11905: 0xF875,\n\t40217 - 11905: 0xF876,\n\t40218 - 11905: 0xF877,\n\t40219 - 11905: 0xF878,\n\t40220 - 11905: 0xF879,\n\t40221 - 11905: 0xF87A,\n\t40222 - 11905: 0xF87B,\n\t40223 - 11905: 0xF87C,\n\t40224 - 11905: 0xF87D,\n\t40225 - 11905: 0xF87E,\n\t40226 - 11905: 0xF880,\n\t40227 - 11905: 0xF881,\n\t40228 - 11905: 0xF882,\n\t40229 - 11905: 0xF883,\n\t40230 - 11905: 0xF884,\n\t40231 - 11905: 0xF885,\n\t40232 - 11905: 0xF886,\n\t40233 - 11905: 0xF887,\n\t40234 - 11905: 0xF888,\n\t40235 - 11905: 0xF889,\n\t40236 - 11905: 0xF88A,\n\t40237 - 11905: 0xF88B,\n\t40238 - 11905: 0xF88C,\n\t40239 - 11905: 0xF88D,\n\t40240 - 11905: 0xF88E,\n\t40241 - 11905: 0xF88F,\n\t40242 - 11905: 0xF890,\n\t40243 - 11905: 0xF891,\n\t40244 - 11905: 0xF892,\n\t40245 - 11905: 0xF893,\n\t40246 - 11905: 0xF894,\n\t40247 - 11905: 0xF895,\n\t40248 - 11905: 0xF896,\n\t40249 - 11905: 0xF897,\n\t40250 - 11905: 0xF898,\n\t40251 - 11905: 0xF899,\n\t40252 - 11905: 0xF89A,\n\t40253 - 11905: 0xF89B,\n\t40254 - 11905: 0xF89C,\n\t40255 - 11905: 0xF89D,\n\t40256 - 11905: 0xF89E,\n\t40257 - 11905: 0xF89F,\n\t40258 - 11905: 0xF8A0,\n\t40259 - 11905: 0xF940,\n\t40260 - 11905: 0xF941,\n\t40261 - 11905: 0xF942,\n\t40262 - 11905: 0xF943,\n\t40263 - 11905: 0xF944,\n\t40264 - 11905: 0xF945,\n\t40265 - 11905: 0xF946,\n\t40266 - 11905: 0xF947,\n\t40267 - 11905: 0xF948,\n\t40268 - 11905: 0xF949,\n\t40269 - 11905: 0xF94A,\n\t40270 - 11905: 0xF94B,\n\t40271 - 11905: 0xF94C,\n\t40272 - 11905: 0xF94D,\n\t40273 - 11905: 0xF94E,\n\t40274 - 11905: 0xF94F,\n\t40275 - 11905: 0xF950,\n\t40276 - 11905: 0xF951,\n\t40277 - 11905: 0xF952,\n\t40278 - 11905: 0xF953,\n\t40279 - 11905: 0xF954,\n\t40280 - 11905: 0xF955,\n\t40281 - 11905: 0xF956,\n\t40282 - 11905: 0xF957,\n\t40283 - 11905: 0xF958,\n\t40284 - 11905: 0xF959,\n\t40285 - 11905: 0xF95A,\n\t40286 - 11905: 0xF95B,\n\t40287 - 11905: 0xF95C,\n\t40288 - 11905: 0xF95D,\n\t40289 - 11905: 0xF95E,\n\t40290 - 11905: 0xF95F,\n\t40291 - 11905: 0xF960,\n\t40292 - 11905: 0xF961,\n\t40293 - 11905: 0xF962,\n\t40294 - 11905: 0xF963,\n\t40295 - 11905: 0xF964,\n\t40296 - 11905: 0xF965,\n\t40297 - 11905: 0xF966,\n\t40298 - 11905: 0xF967,\n\t40299 - 11905: 0xF968,\n\t40300 - 11905: 0xF969,\n\t40301 - 11905: 0xF96A,\n\t40302 - 11905: 0xF96B,\n\t40303 - 11905: 0xF96C,\n\t40304 - 11905: 0xF96D,\n\t40305 - 11905: 0xF96E,\n\t40306 - 11905: 0xF96F,\n\t40307 - 11905: 0xF970,\n\t40308 - 11905: 0xF971,\n\t40309 - 11905: 0xF972,\n\t40310 - 11905: 0xF973,\n\t40311 - 11905: 0xF974,\n\t40312 - 11905: 0xF975,\n\t40313 - 11905: 0xF976,\n\t40314 - 11905: 0xF977,\n\t40315 - 11905: 0xF978,\n\t40316 - 11905: 0xF979,\n\t40317 - 11905: 0xF97A,\n\t40318 - 11905: 0xF97B,\n\t40319 - 11905: 0xF97C,\n\t40320 - 11905: 0xF97D,\n\t40321 - 11905: 0xF97E,\n\t40322 - 11905: 0xF980,\n\t40323 - 11905: 0xF981,\n\t40324 - 11905: 0xF982,\n\t40325 - 11905: 0xF983,\n\t40326 - 11905: 0xF984,\n\t40327 - 11905: 0xF985,\n\t40328 - 11905: 0xF986,\n\t40329 - 11905: 0xF987,\n\t40330 - 11905: 0xF988,\n\t40331 - 11905: 0xF989,\n\t40332 - 11905: 0xF98A,\n\t40333 - 11905: 0xF98B,\n\t40334 - 11905: 0xF98C,\n\t40335 - 11905: 0xF98D,\n\t40336 - 11905: 0xF98E,\n\t40337 - 11905: 0xF98F,\n\t40338 - 11905: 0xF990,\n\t40339 - 11905: 0xF991,\n\t40340 - 11905: 0xF992,\n\t40341 - 11905: 0xF993,\n\t40342 - 11905: 0xF994,\n\t40343 - 11905: 0xF995,\n\t40344 - 11905: 0xF996,\n\t40345 - 11905: 0xF997,\n\t40346 - 11905: 0xF998,\n\t40347 - 11905: 0xF999,\n\t40348 - 11905: 0xF99A,\n\t40349 - 11905: 0xF99B,\n\t40350 - 11905: 0xF99C,\n\t40351 - 11905: 0xF99D,\n\t40352 - 11905: 0xF99E,\n\t40353 - 11905: 0xF99F,\n\t40354 - 11905: 0xF9A0,\n\t40355 - 11905: 0xFA40,\n\t40356 - 11905: 0xFA41,\n\t40357 - 11905: 0xFA42,\n\t40358 - 11905: 0xFA43,\n\t40359 - 11905: 0xFA44,\n\t40360 - 11905: 0xFA45,\n\t40361 - 11905: 0xFA46,\n\t40362 - 11905: 0xFA47,\n\t40363 - 11905: 0xFA48,\n\t40364 - 11905: 0xFA49,\n\t40365 - 11905: 0xFA4A,\n\t40366 - 11905: 0xFA4B,\n\t40367 - 11905: 0xFA4C,\n\t40368 - 11905: 0xFA4D,\n\t40369 - 11905: 0xFA4E,\n\t40370 - 11905: 0xFA4F,\n\t40371 - 11905: 0xFA50,\n\t40372 - 11905: 0xFA51,\n\t40373 - 11905: 0xFA52,\n\t40374 - 11905: 0xFA53,\n\t40375 - 11905: 0xFA54,\n\t40376 - 11905: 0xFA55,\n\t40377 - 11905: 0xFA56,\n\t40378 - 11905: 0xFA57,\n\t40379 - 11905: 0xFA58,\n\t40380 - 11905: 0xFA59,\n\t40381 - 11905: 0xFA5A,\n\t40382 - 11905: 0xFA5B,\n\t40383 - 11905: 0xFA5C,\n\t40384 - 11905: 0xFA5D,\n\t40385 - 11905: 0xFA5E,\n\t40386 - 11905: 0xFA5F,\n\t40387 - 11905: 0xFA60,\n\t40388 - 11905: 0xFA61,\n\t40389 - 11905: 0xFA62,\n\t40390 - 11905: 0xFA63,\n\t40391 - 11905: 0xFA64,\n\t40392 - 11905: 0xFA65,\n\t40393 - 11905: 0xFA66,\n\t40394 - 11905: 0xFA67,\n\t40395 - 11905: 0xFA68,\n\t40396 - 11905: 0xFA69,\n\t40397 - 11905: 0xFA6A,\n\t40398 - 11905: 0xFA6B,\n\t40399 - 11905: 0xFA6C,\n\t40400 - 11905: 0xFA6D,\n\t40401 - 11905: 0xFA6E,\n\t40402 - 11905: 0xFA6F,\n\t40403 - 11905: 0xFA70,\n\t40404 - 11905: 0xFA71,\n\t40405 - 11905: 0xFA72,\n\t40406 - 11905: 0xFA73,\n\t40407 - 11905: 0xFA74,\n\t40408 - 11905: 0xFA75,\n\t40409 - 11905: 0xFA76,\n\t40410 - 11905: 0xFA77,\n\t40411 - 11905: 0xFA78,\n\t40412 - 11905: 0xFA79,\n\t40413 - 11905: 0xFA7A,\n\t40414 - 11905: 0xFA7B,\n\t40415 - 11905: 0xFA7C,\n\t40416 - 11905: 0xFA7D,\n\t40417 - 11905: 0xFA7E,\n\t40418 - 11905: 0xFA80,\n\t40419 - 11905: 0xFA81,\n\t40420 - 11905: 0xFA82,\n\t40421 - 11905: 0xFA83,\n\t40422 - 11905: 0xFA84,\n\t40423 - 11905: 0xFA85,\n\t40424 - 11905: 0xFA86,\n\t40425 - 11905: 0xFA87,\n\t40426 - 11905: 0xFA88,\n\t40427 - 11905: 0xFA89,\n\t40428 - 11905: 0xFA8A,\n\t40429 - 11905: 0xFA8B,\n\t40430 - 11905: 0xFA8C,\n\t40431 - 11905: 0xFA8D,\n\t40432 - 11905: 0xFA8E,\n\t40433 - 11905: 0xFA8F,\n\t40434 - 11905: 0xFA90,\n\t40435 - 11905: 0xFA91,\n\t40436 - 11905: 0xFA92,\n\t40437 - 11905: 0xFA93,\n\t40438 - 11905: 0xFA94,\n\t40439 - 11905: 0xFA95,\n\t40440 - 11905: 0xFA96,\n\t40441 - 11905: 0xFA97,\n\t40442 - 11905: 0xFA98,\n\t40443 - 11905: 0xFA99,\n\t40444 - 11905: 0xFA9A,\n\t40445 - 11905: 0xFA9B,\n\t40446 - 11905: 0xFA9C,\n\t40447 - 11905: 0xFA9D,\n\t40448 - 11905: 0xFA9E,\n\t40449 - 11905: 0xFA9F,\n\t40450 - 11905: 0xFAA0,\n\t40451 - 11905: 0xFB40,\n\t40452 - 11905: 0xFB41,\n\t40453 - 11905: 0xFB42,\n\t40454 - 11905: 0xFB43,\n\t40455 - 11905: 0xFB44,\n\t40456 - 11905: 0xFB45,\n\t40457 - 11905: 0xFB46,\n\t40458 - 11905: 0xFB47,\n\t40459 - 11905: 0xFB48,\n\t40460 - 11905: 0xFB49,\n\t40461 - 11905: 0xFB4A,\n\t40462 - 11905: 0xFB4B,\n\t40463 - 11905: 0xFB4C,\n\t40464 - 11905: 0xFB4D,\n\t40465 - 11905: 0xFB4E,\n\t40466 - 11905: 0xFB4F,\n\t40467 - 11905: 0xFB50,\n\t40468 - 11905: 0xFB51,\n\t40469 - 11905: 0xFB52,\n\t40470 - 11905: 0xFB53,\n\t40471 - 11905: 0xFB54,\n\t40472 - 11905: 0xFB55,\n\t40473 - 11905: 0xFB56,\n\t40474 - 11905: 0xFB57,\n\t40475 - 11905: 0xFB58,\n\t40476 - 11905: 0xFB59,\n\t40477 - 11905: 0xFB5A,\n\t40478 - 11905: 0xFB5B,\n\t40479 - 11905: 0xC4F1,\n\t40480 - 11905: 0xF0AF,\n\t40481 - 11905: 0xBCA6,\n\t40482 - 11905: 0xF0B0,\n\t40483 - 11905: 0xC3F9,\n\t40484 - 11905: 0xFB5C,\n\t40485 - 11905: 0xC5B8,\n\t40486 - 11905: 0xD1BB,\n\t40487 - 11905: 0xFB5D,\n\t40488 - 11905: 0xF0B1,\n\t40489 - 11905: 0xF0B2,\n\t40490 - 11905: 0xF0B3,\n\t40491 - 11905: 0xF0B4,\n\t40492 - 11905: 0xF0B5,\n\t40493 - 11905: 0xD1BC,\n\t40494 - 11905: 0xFB5E,\n\t40495 - 11905: 0xD1EC,\n\t40496 - 11905: 0xFB5F,\n\t40497 - 11905: 0xF0B7,\n\t40498 - 11905: 0xF0B6,\n\t40499 - 11905: 0xD4A7,\n\t40500 - 11905: 0xFB60,\n\t40501 - 11905: 0xCDD2,\n\t40502 - 11905: 0xF0B8,\n\t40503 - 11905: 0xF0BA,\n\t40504 - 11905: 0xF0B9,\n\t40505 - 11905: 0xF0BB,\n\t40506 - 11905: 0xF0BC,\n\t40507 - 11905: 0xFB61,\n\t40508 - 11905: 0xFB62,\n\t40509 - 11905: 0xB8EB,\n\t40510 - 11905: 0xF0BD,\n\t40511 - 11905: 0xBAE8,\n\t40512 - 11905: 0xFB63,\n\t40513 - 11905: 0xF0BE,\n\t40514 - 11905: 0xF0BF,\n\t40515 - 11905: 0xBEE9,\n\t40516 - 11905: 0xF0C0,\n\t40517 - 11905: 0xB6EC,\n\t40518 - 11905: 0xF0C1,\n\t40519 - 11905: 0xF0C2,\n\t40520 - 11905: 0xF0C3,\n\t40521 - 11905: 0xF0C4,\n\t40522 - 11905: 0xC8B5,\n\t40523 - 11905: 0xF0C5,\n\t40524 - 11905: 0xF0C6,\n\t40525 - 11905: 0xFB64,\n\t40526 - 11905: 0xF0C7,\n\t40527 - 11905: 0xC5F4,\n\t40528 - 11905: 0xFB65,\n\t40529 - 11905: 0xF0C8,\n\t40530 - 11905: 0xFB66,\n\t40531 - 11905: 0xFB67,\n\t40532 - 11905: 0xFB68,\n\t40533 - 11905: 0xF0C9,\n\t40534 - 11905: 0xFB69,\n\t40535 - 11905: 0xF0CA,\n\t40536 - 11905: 0xF7BD,\n\t40537 - 11905: 0xFB6A,\n\t40538 - 11905: 0xF0CB,\n\t40539 - 11905: 0xF0CC,\n\t40540 - 11905: 0xF0CD,\n\t40541 - 11905: 0xFB6B,\n\t40542 - 11905: 0xF0CE,\n\t40543 - 11905: 0xFB6C,\n\t40544 - 11905: 0xFB6D,\n\t40545 - 11905: 0xFB6E,\n\t40546 - 11905: 0xFB6F,\n\t40547 - 11905: 0xF0CF,\n\t40548 - 11905: 0xBAD7,\n\t40549 - 11905: 0xFB70,\n\t40550 - 11905: 0xF0D0,\n\t40551 - 11905: 0xF0D1,\n\t40552 - 11905: 0xF0D2,\n\t40553 - 11905: 0xF0D3,\n\t40554 - 11905: 0xF0D4,\n\t40555 - 11905: 0xF0D5,\n\t40556 - 11905: 0xF0D6,\n\t40557 - 11905: 0xF0D8,\n\t40558 - 11905: 0xFB71,\n\t40559 - 11905: 0xFB72,\n\t40560 - 11905: 0xD3A5,\n\t40561 - 11905: 0xF0D7,\n\t40562 - 11905: 0xFB73,\n\t40563 - 11905: 0xF0D9,\n\t40564 - 11905: 0xFB74,\n\t40565 - 11905: 0xFB75,\n\t40566 - 11905: 0xFB76,\n\t40567 - 11905: 0xFB77,\n\t40568 - 11905: 0xFB78,\n\t40569 - 11905: 0xFB79,\n\t40570 - 11905: 0xFB7A,\n\t40571 - 11905: 0xFB7B,\n\t40572 - 11905: 0xFB7C,\n\t40573 - 11905: 0xFB7D,\n\t40574 - 11905: 0xF5BA,\n\t40575 - 11905: 0xC2B9,\n\t40576 - 11905: 0xFB7E,\n\t40577 - 11905: 0xFB80,\n\t40578 - 11905: 0xF7E4,\n\t40579 - 11905: 0xFB81,\n\t40580 - 11905: 0xFB82,\n\t40581 - 11905: 0xFB83,\n\t40582 - 11905: 0xFB84,\n\t40583 - 11905: 0xF7E5,\n\t40584 - 11905: 0xF7E6,\n\t40585 - 11905: 0xFB85,\n\t40586 - 11905: 0xFB86,\n\t40587 - 11905: 0xF7E7,\n\t40588 - 11905: 0xFB87,\n\t40589 - 11905: 0xFB88,\n\t40590 - 11905: 0xFB89,\n\t40591 - 11905: 0xFB8A,\n\t40592 - 11905: 0xFB8B,\n\t40593 - 11905: 0xFB8C,\n\t40594 - 11905: 0xF7E8,\n\t40595 - 11905: 0xC2B4,\n\t40596 - 11905: 0xFB8D,\n\t40597 - 11905: 0xFB8E,\n\t40598 - 11905: 0xFB8F,\n\t40599 - 11905: 0xFB90,\n\t40600 - 11905: 0xFB91,\n\t40601 - 11905: 0xFB92,\n\t40602 - 11905: 0xFB93,\n\t40603 - 11905: 0xFB94,\n\t40604 - 11905: 0xFB95,\n\t40605 - 11905: 0xF7EA,\n\t40606 - 11905: 0xFB96,\n\t40607 - 11905: 0xF7EB,\n\t40608 - 11905: 0xFB97,\n\t40609 - 11905: 0xFB98,\n\t40610 - 11905: 0xFB99,\n\t40611 - 11905: 0xFB9A,\n\t40612 - 11905: 0xFB9B,\n\t40613 - 11905: 0xFB9C,\n\t40614 - 11905: 0xC2F3,\n\t40615 - 11905: 0xFB9D,\n\t40616 - 11905: 0xFB9E,\n\t40617 - 11905: 0xFB9F,\n\t40618 - 11905: 0xFBA0,\n\t40619 - 11905: 0xFC40,\n\t40620 - 11905: 0xFC41,\n\t40621 - 11905: 0xFC42,\n\t40622 - 11905: 0xFC43,\n\t40623 - 11905: 0xFC44,\n\t40624 - 11905: 0xFC45,\n\t40625 - 11905: 0xFC46,\n\t40626 - 11905: 0xFC47,\n\t40627 - 11905: 0xFC48,\n\t40628 - 11905: 0xF4F0,\n\t40629 - 11905: 0xFC49,\n\t40630 - 11905: 0xFC4A,\n\t40631 - 11905: 0xFC4B,\n\t40632 - 11905: 0xF4EF,\n\t40633 - 11905: 0xFC4C,\n\t40634 - 11905: 0xFC4D,\n\t40635 - 11905: 0xC2E9,\n\t40636 - 11905: 0xFC4E,\n\t40637 - 11905: 0xF7E1,\n\t40638 - 11905: 0xF7E2,\n\t40639 - 11905: 0xFC4F,\n\t40640 - 11905: 0xFC50,\n\t40641 - 11905: 0xFC51,\n\t40642 - 11905: 0xFC52,\n\t40643 - 11905: 0xFC53,\n\t40644 - 11905: 0xBBC6,\n\t40645 - 11905: 0xFC54,\n\t40646 - 11905: 0xFC55,\n\t40647 - 11905: 0xFC56,\n\t40648 - 11905: 0xFC57,\n\t40649 - 11905: 0xD9E4,\n\t40650 - 11905: 0xFC58,\n\t40651 - 11905: 0xFC59,\n\t40652 - 11905: 0xFC5A,\n\t40653 - 11905: 0xCAF2,\n\t40654 - 11905: 0xC0E8,\n\t40655 - 11905: 0xF0A4,\n\t40656 - 11905: 0xFC5B,\n\t40657 - 11905: 0xBADA,\n\t40658 - 11905: 0xFC5C,\n\t40659 - 11905: 0xFC5D,\n\t40660 - 11905: 0xC7AD,\n\t40661 - 11905: 0xFC5E,\n\t40662 - 11905: 0xFC5F,\n\t40663 - 11905: 0xFC60,\n\t40664 - 11905: 0xC4AC,\n\t40665 - 11905: 0xFC61,\n\t40666 - 11905: 0xFC62,\n\t40667 - 11905: 0xF7EC,\n\t40668 - 11905: 0xF7ED,\n\t40669 - 11905: 0xF7EE,\n\t40670 - 11905: 0xFC63,\n\t40671 - 11905: 0xF7F0,\n\t40672 - 11905: 0xF7EF,\n\t40673 - 11905: 0xFC64,\n\t40674 - 11905: 0xF7F1,\n\t40675 - 11905: 0xFC65,\n\t40676 - 11905: 0xFC66,\n\t40677 - 11905: 0xF7F4,\n\t40678 - 11905: 0xFC67,\n\t40679 - 11905: 0xF7F3,\n\t40680 - 11905: 0xFC68,\n\t40681 - 11905: 0xF7F2,\n\t40682 - 11905: 0xF7F5,\n\t40683 - 11905: 0xFC69,\n\t40684 - 11905: 0xFC6A,\n\t40685 - 11905: 0xFC6B,\n\t40686 - 11905: 0xFC6C,\n\t40687 - 11905: 0xF7F6,\n\t40688 - 11905: 0xFC6D,\n\t40689 - 11905: 0xFC6E,\n\t40690 - 11905: 0xFC6F,\n\t40691 - 11905: 0xFC70,\n\t40692 - 11905: 0xFC71,\n\t40693 - 11905: 0xFC72,\n\t40694 - 11905: 0xFC73,\n\t40695 - 11905: 0xFC74,\n\t40696 - 11905: 0xFC75,\n\t40697 - 11905: 0xEDE9,\n\t40698 - 11905: 0xFC76,\n\t40699 - 11905: 0xEDEA,\n\t40700 - 11905: 0xEDEB,\n\t40701 - 11905: 0xFC77,\n\t40702 - 11905: 0xF6BC,\n\t40703 - 11905: 0xFC78,\n\t40704 - 11905: 0xFC79,\n\t40705 - 11905: 0xFC7A,\n\t40706 - 11905: 0xFC7B,\n\t40707 - 11905: 0xFC7C,\n\t40708 - 11905: 0xFC7D,\n\t40709 - 11905: 0xFC7E,\n\t40710 - 11905: 0xFC80,\n\t40711 - 11905: 0xFC81,\n\t40712 - 11905: 0xFC82,\n\t40713 - 11905: 0xFC83,\n\t40714 - 11905: 0xFC84,\n\t40715 - 11905: 0xF6BD,\n\t40716 - 11905: 0xFC85,\n\t40717 - 11905: 0xF6BE,\n\t40718 - 11905: 0xB6A6,\n\t40719 - 11905: 0xFC86,\n\t40720 - 11905: 0xD8BE,\n\t40721 - 11905: 0xFC87,\n\t40722 - 11905: 0xFC88,\n\t40723 - 11905: 0xB9C4,\n\t40724 - 11905: 0xFC89,\n\t40725 - 11905: 0xFC8A,\n\t40726 - 11905: 0xFC8B,\n\t40727 - 11905: 0xD8BB,\n\t40728 - 11905: 0xFC8C,\n\t40729 - 11905: 0xDCB1,\n\t40730 - 11905: 0xFC8D,\n\t40731 - 11905: 0xFC8E,\n\t40732 - 11905: 0xFC8F,\n\t40733 - 11905: 0xFC90,\n\t40734 - 11905: 0xFC91,\n\t40735 - 11905: 0xFC92,\n\t40736 - 11905: 0xCAF3,\n\t40737 - 11905: 0xFC93,\n\t40738 - 11905: 0xF7F7,\n\t40739 - 11905: 0xFC94,\n\t40740 - 11905: 0xFC95,\n\t40741 - 11905: 0xFC96,\n\t40742 - 11905: 0xFC97,\n\t40743 - 11905: 0xFC98,\n\t40744 - 11905: 0xFC99,\n\t40745 - 11905: 0xFC9A,\n\t40746 - 11905: 0xFC9B,\n\t40747 - 11905: 0xFC9C,\n\t40748 - 11905: 0xF7F8,\n\t40749 - 11905: 0xFC9D,\n\t40750 - 11905: 0xFC9E,\n\t40751 - 11905: 0xF7F9,\n\t40752 - 11905: 0xFC9F,\n\t40753 - 11905: 0xFCA0,\n\t40754 - 11905: 0xFD40,\n\t40755 - 11905: 0xFD41,\n\t40756 - 11905: 0xFD42,\n\t40757 - 11905: 0xFD43,\n\t40758 - 11905: 0xFD44,\n\t40759 - 11905: 0xF7FB,\n\t40760 - 11905: 0xFD45,\n\t40761 - 11905: 0xF7FA,\n\t40762 - 11905: 0xFD46,\n\t40763 - 11905: 0xB1C7,\n\t40764 - 11905: 0xFD47,\n\t40765 - 11905: 0xF7FC,\n\t40766 - 11905: 0xF7FD,\n\t40767 - 11905: 0xFD48,\n\t40768 - 11905: 0xFD49,\n\t40769 - 11905: 0xFD4A,\n\t40770 - 11905: 0xFD4B,\n\t40771 - 11905: 0xFD4C,\n\t40772 - 11905: 0xF7FE,\n\t40773 - 11905: 0xFD4D,\n\t40774 - 11905: 0xFD4E,\n\t40775 - 11905: 0xFD4F,\n\t40776 - 11905: 0xFD50,\n\t40777 - 11905: 0xFD51,\n\t40778 - 11905: 0xFD52,\n\t40779 - 11905: 0xFD53,\n\t40780 - 11905: 0xFD54,\n\t40781 - 11905: 0xFD55,\n\t40782 - 11905: 0xFD56,\n\t40783 - 11905: 0xFD57,\n\t40784 - 11905: 0xC6EB,\n\t40785 - 11905: 0xECB4,\n\t40786 - 11905: 0xFD58,\n\t40787 - 11905: 0xFD59,\n\t40788 - 11905: 0xFD5A,\n\t40789 - 11905: 0xFD5B,\n\t40790 - 11905: 0xFD5C,\n\t40791 - 11905: 0xFD5D,\n\t40792 - 11905: 0xFD5E,\n\t40793 - 11905: 0xFD5F,\n\t40794 - 11905: 0xFD60,\n\t40795 - 11905: 0xFD61,\n\t40796 - 11905: 0xFD62,\n\t40797 - 11905: 0xFD63,\n\t40798 - 11905: 0xFD64,\n\t40799 - 11905: 0xFD65,\n\t40800 - 11905: 0xFD66,\n\t40801 - 11905: 0xFD67,\n\t40802 - 11905: 0xFD68,\n\t40803 - 11905: 0xFD69,\n\t40804 - 11905: 0xFD6A,\n\t40805 - 11905: 0xFD6B,\n\t40806 - 11905: 0xFD6C,\n\t40807 - 11905: 0xFD6D,\n\t40808 - 11905: 0xFD6E,\n\t40809 - 11905: 0xFD6F,\n\t40810 - 11905: 0xFD70,\n\t40811 - 11905: 0xFD71,\n\t40812 - 11905: 0xFD72,\n\t40813 - 11905: 0xFD73,\n\t40814 - 11905: 0xFD74,\n\t40815 - 11905: 0xFD75,\n\t40816 - 11905: 0xFD76,\n\t40817 - 11905: 0xFD77,\n\t40818 - 11905: 0xFD78,\n\t40819 - 11905: 0xFD79,\n\t40820 - 11905: 0xFD7A,\n\t40821 - 11905: 0xFD7B,\n\t40822 - 11905: 0xFD7C,\n\t40823 - 11905: 0xFD7D,\n\t40824 - 11905: 0xFD7E,\n\t40825 - 11905: 0xFD80,\n\t40826 - 11905: 0xFD81,\n\t40827 - 11905: 0xFD82,\n\t40828 - 11905: 0xFD83,\n\t40829 - 11905: 0xFD84,\n\t40830 - 11905: 0xFD85,\n\t40831 - 11905: 0xB3DD,\n\t40832 - 11905: 0xF6B3,\n\t40833 - 11905: 0xFD86,\n\t40834 - 11905: 0xFD87,\n\t40835 - 11905: 0xF6B4,\n\t40836 - 11905: 0xC1E4,\n\t40837 - 11905: 0xF6B5,\n\t40838 - 11905: 0xF6B6,\n\t40839 - 11905: 0xF6B7,\n\t40840 - 11905: 0xF6B8,\n\t40841 - 11905: 0xF6B9,\n\t40842 - 11905: 0xF6BA,\n\t40843 - 11905: 0xC8A3,\n\t40844 - 11905: 0xF6BB,\n\t40845 - 11905: 0xFD88,\n\t40846 - 11905: 0xFD89,\n\t40847 - 11905: 0xFD8A,\n\t40848 - 11905: 0xFD8B,\n\t40849 - 11905: 0xFD8C,\n\t40850 - 11905: 0xFD8D,\n\t40851 - 11905: 0xFD8E,\n\t40852 - 11905: 0xFD8F,\n\t40853 - 11905: 0xFD90,\n\t40854 - 11905: 0xFD91,\n\t40855 - 11905: 0xFD92,\n\t40856 - 11905: 0xFD93,\n\t40857 - 11905: 0xC1FA,\n\t40858 - 11905: 0xB9A8,\n\t40859 - 11905: 0xEDE8,\n\t40860 - 11905: 0xFD94,\n\t40861 - 11905: 0xFD95,\n\t40862 - 11905: 0xFD96,\n\t40863 - 11905: 0xB9EA,\n\t40864 - 11905: 0xD9DF,\n\t40865 - 11905: 0xFD97,\n\t40866 - 11905: 0xFD98,\n\t40867 - 11905: 0xFD99,\n\t40868 - 11905: 0xFD9A,\n\t40869 - 11905: 0xFD9B,\n}\n\nconst encode1Low, encode1High = 8208, 9795\n\nvar encode1 = [...]uint16{\n\t8208 - 8208: 0xA95C,\n\t8211 - 8208: 0xA843,\n\t8212 - 8208: 0xA1AA,\n\t8213 - 8208: 0xA844,\n\t8214 - 8208: 0xA1AC,\n\t8216 - 8208: 0xA1AE,\n\t8217 - 8208: 0xA1AF,\n\t8220 - 8208: 0xA1B0,\n\t8221 - 8208: 0xA1B1,\n\t8229 - 8208: 0xA845,\n\t8230 - 8208: 0xA1AD,\n\t8240 - 8208: 0xA1EB,\n\t8242 - 8208: 0xA1E4,\n\t8243 - 8208: 0xA1E5,\n\t8245 - 8208: 0xA846,\n\t8251 - 8208: 0xA1F9,\n\t8364 - 8208: 0xA2E3,\n\t8451 - 8208: 0xA1E6,\n\t8453 - 8208: 0xA847,\n\t8457 - 8208: 0xA848,\n\t8470 - 8208: 0xA1ED,\n\t8481 - 8208: 0xA959,\n\t8544 - 8208: 0xA2F1,\n\t8545 - 8208: 0xA2F2,\n\t8546 - 8208: 0xA2F3,\n\t8547 - 8208: 0xA2F4,\n\t8548 - 8208: 0xA2F5,\n\t8549 - 8208: 0xA2F6,\n\t8550 - 8208: 0xA2F7,\n\t8551 - 8208: 0xA2F8,\n\t8552 - 8208: 0xA2F9,\n\t8553 - 8208: 0xA2FA,\n\t8554 - 8208: 0xA2FB,\n\t8555 - 8208: 0xA2FC,\n\t8560 - 8208: 0xA2A1,\n\t8561 - 8208: 0xA2A2,\n\t8562 - 8208: 0xA2A3,\n\t8563 - 8208: 0xA2A4,\n\t8564 - 8208: 0xA2A5,\n\t8565 - 8208: 0xA2A6,\n\t8566 - 8208: 0xA2A7,\n\t8567 - 8208: 0xA2A8,\n\t8568 - 8208: 0xA2A9,\n\t8569 - 8208: 0xA2AA,\n\t8592 - 8208: 0xA1FB,\n\t8593 - 8208: 0xA1FC,\n\t8594 - 8208: 0xA1FA,\n\t8595 - 8208: 0xA1FD,\n\t8598 - 8208: 0xA849,\n\t8599 - 8208: 0xA84A,\n\t8600 - 8208: 0xA84B,\n\t8601 - 8208: 0xA84C,\n\t8712 - 8208: 0xA1CA,\n\t8719 - 8208: 0xA1C7,\n\t8721 - 8208: 0xA1C6,\n\t8725 - 8208: 0xA84D,\n\t8730 - 8208: 0xA1CC,\n\t8733 - 8208: 0xA1D8,\n\t8734 - 8208: 0xA1DE,\n\t8735 - 8208: 0xA84E,\n\t8736 - 8208: 0xA1CF,\n\t8739 - 8208: 0xA84F,\n\t8741 - 8208: 0xA1CE,\n\t8743 - 8208: 0xA1C4,\n\t8744 - 8208: 0xA1C5,\n\t8745 - 8208: 0xA1C9,\n\t8746 - 8208: 0xA1C8,\n\t8747 - 8208: 0xA1D2,\n\t8750 - 8208: 0xA1D3,\n\t8756 - 8208: 0xA1E0,\n\t8757 - 8208: 0xA1DF,\n\t8758 - 8208: 0xA1C3,\n\t8759 - 8208: 0xA1CB,\n\t8765 - 8208: 0xA1D7,\n\t8776 - 8208: 0xA1D6,\n\t8780 - 8208: 0xA1D5,\n\t8786 - 8208: 0xA850,\n\t8800 - 8208: 0xA1D9,\n\t8801 - 8208: 0xA1D4,\n\t8804 - 8208: 0xA1DC,\n\t8805 - 8208: 0xA1DD,\n\t8806 - 8208: 0xA851,\n\t8807 - 8208: 0xA852,\n\t8814 - 8208: 0xA1DA,\n\t8815 - 8208: 0xA1DB,\n\t8853 - 8208: 0xA892,\n\t8857 - 8208: 0xA1D1,\n\t8869 - 8208: 0xA1CD,\n\t8895 - 8208: 0xA853,\n\t8978 - 8208: 0xA1D0,\n\t9312 - 8208: 0xA2D9,\n\t9313 - 8208: 0xA2DA,\n\t9314 - 8208: 0xA2DB,\n\t9315 - 8208: 0xA2DC,\n\t9316 - 8208: 0xA2DD,\n\t9317 - 8208: 0xA2DE,\n\t9318 - 8208: 0xA2DF,\n\t9319 - 8208: 0xA2E0,\n\t9320 - 8208: 0xA2E1,\n\t9321 - 8208: 0xA2E2,\n\t9332 - 8208: 0xA2C5,\n\t9333 - 8208: 0xA2C6,\n\t9334 - 8208: 0xA2C7,\n\t9335 - 8208: 0xA2C8,\n\t9336 - 8208: 0xA2C9,\n\t9337 - 8208: 0xA2CA,\n\t9338 - 8208: 0xA2CB,\n\t9339 - 8208: 0xA2CC,\n\t9340 - 8208: 0xA2CD,\n\t9341 - 8208: 0xA2CE,\n\t9342 - 8208: 0xA2CF,\n\t9343 - 8208: 0xA2D0,\n\t9344 - 8208: 0xA2D1,\n\t9345 - 8208: 0xA2D2,\n\t9346 - 8208: 0xA2D3,\n\t9347 - 8208: 0xA2D4,\n\t9348 - 8208: 0xA2D5,\n\t9349 - 8208: 0xA2D6,\n\t9350 - 8208: 0xA2D7,\n\t9351 - 8208: 0xA2D8,\n\t9352 - 8208: 0xA2B1,\n\t9353 - 8208: 0xA2B2,\n\t9354 - 8208: 0xA2B3,\n\t9355 - 8208: 0xA2B4,\n\t9356 - 8208: 0xA2B5,\n\t9357 - 8208: 0xA2B6,\n\t9358 - 8208: 0xA2B7,\n\t9359 - 8208: 0xA2B8,\n\t9360 - 8208: 0xA2B9,\n\t9361 - 8208: 0xA2BA,\n\t9362 - 8208: 0xA2BB,\n\t9363 - 8208: 0xA2BC,\n\t9364 - 8208: 0xA2BD,\n\t9365 - 8208: 0xA2BE,\n\t9366 - 8208: 0xA2BF,\n\t9367 - 8208: 0xA2C0,\n\t9368 - 8208: 0xA2C1,\n\t9369 - 8208: 0xA2C2,\n\t9370 - 8208: 0xA2C3,\n\t9371 - 8208: 0xA2C4,\n\t9472 - 8208: 0xA9A4,\n\t9473 - 8208: 0xA9A5,\n\t9474 - 8208: 0xA9A6,\n\t9475 - 8208: 0xA9A7,\n\t9476 - 8208: 0xA9A8,\n\t9477 - 8208: 0xA9A9,\n\t9478 - 8208: 0xA9AA,\n\t9479 - 8208: 0xA9AB,\n\t9480 - 8208: 0xA9AC,\n\t9481 - 8208: 0xA9AD,\n\t9482 - 8208: 0xA9AE,\n\t9483 - 8208: 0xA9AF,\n\t9484 - 8208: 0xA9B0,\n\t9485 - 8208: 0xA9B1,\n\t9486 - 8208: 0xA9B2,\n\t9487 - 8208: 0xA9B3,\n\t9488 - 8208: 0xA9B4,\n\t9489 - 8208: 0xA9B5,\n\t9490 - 8208: 0xA9B6,\n\t9491 - 8208: 0xA9B7,\n\t9492 - 8208: 0xA9B8,\n\t9493 - 8208: 0xA9B9,\n\t9494 - 8208: 0xA9BA,\n\t9495 - 8208: 0xA9BB,\n\t9496 - 8208: 0xA9BC,\n\t9497 - 8208: 0xA9BD,\n\t9498 - 8208: 0xA9BE,\n\t9499 - 8208: 0xA9BF,\n\t9500 - 8208: 0xA9C0,\n\t9501 - 8208: 0xA9C1,\n\t9502 - 8208: 0xA9C2,\n\t9503 - 8208: 0xA9C3,\n\t9504 - 8208: 0xA9C4,\n\t9505 - 8208: 0xA9C5,\n\t9506 - 8208: 0xA9C6,\n\t9507 - 8208: 0xA9C7,\n\t9508 - 8208: 0xA9C8,\n\t9509 - 8208: 0xA9C9,\n\t9510 - 8208: 0xA9CA,\n\t9511 - 8208: 0xA9CB,\n\t9512 - 8208: 0xA9CC,\n\t9513 - 8208: 0xA9CD,\n\t9514 - 8208: 0xA9CE,\n\t9515 - 8208: 0xA9CF,\n\t9516 - 8208: 0xA9D0,\n\t9517 - 8208: 0xA9D1,\n\t9518 - 8208: 0xA9D2,\n\t9519 - 8208: 0xA9D3,\n\t9520 - 8208: 0xA9D4,\n\t9521 - 8208: 0xA9D5,\n\t9522 - 8208: 0xA9D6,\n\t9523 - 8208: 0xA9D7,\n\t9524 - 8208: 0xA9D8,\n\t9525 - 8208: 0xA9D9,\n\t9526 - 8208: 0xA9DA,\n\t9527 - 8208: 0xA9DB,\n\t9528 - 8208: 0xA9DC,\n\t9529 - 8208: 0xA9DD,\n\t9530 - 8208: 0xA9DE,\n\t9531 - 8208: 0xA9DF,\n\t9532 - 8208: 0xA9E0,\n\t9533 - 8208: 0xA9E1,\n\t9534 - 8208: 0xA9E2,\n\t9535 - 8208: 0xA9E3,\n\t9536 - 8208: 0xA9E4,\n\t9537 - 8208: 0xA9E5,\n\t9538 - 8208: 0xA9E6,\n\t9539 - 8208: 0xA9E7,\n\t9540 - 8208: 0xA9E8,\n\t9541 - 8208: 0xA9E9,\n\t9542 - 8208: 0xA9EA,\n\t9543 - 8208: 0xA9EB,\n\t9544 - 8208: 0xA9EC,\n\t9545 - 8208: 0xA9ED,\n\t9546 - 8208: 0xA9EE,\n\t9547 - 8208: 0xA9EF,\n\t9552 - 8208: 0xA854,\n\t9553 - 8208: 0xA855,\n\t9554 - 8208: 0xA856,\n\t9555 - 8208: 0xA857,\n\t9556 - 8208: 0xA858,\n\t9557 - 8208: 0xA859,\n\t9558 - 8208: 0xA85A,\n\t9559 - 8208: 0xA85B,\n\t9560 - 8208: 0xA85C,\n\t9561 - 8208: 0xA85D,\n\t9562 - 8208: 0xA85E,\n\t9563 - 8208: 0xA85F,\n\t9564 - 8208: 0xA860,\n\t9565 - 8208: 0xA861,\n\t9566 - 8208: 0xA862,\n\t9567 - 8208: 0xA863,\n\t9568 - 8208: 0xA864,\n\t9569 - 8208: 0xA865,\n\t9570 - 8208: 0xA866,\n\t9571 - 8208: 0xA867,\n\t9572 - 8208: 0xA868,\n\t9573 - 8208: 0xA869,\n\t9574 - 8208: 0xA86A,\n\t9575 - 8208: 0xA86B,\n\t9576 - 8208: 0xA86C,\n\t9577 - 8208: 0xA86D,\n\t9578 - 8208: 0xA86E,\n\t9579 - 8208: 0xA86F,\n\t9580 - 8208: 0xA870,\n\t9581 - 8208: 0xA871,\n\t9582 - 8208: 0xA872,\n\t9583 - 8208: 0xA873,\n\t9584 - 8208: 0xA874,\n\t9585 - 8208: 0xA875,\n\t9586 - 8208: 0xA876,\n\t9587 - 8208: 0xA877,\n\t9601 - 8208: 0xA878,\n\t9602 - 8208: 0xA879,\n\t9603 - 8208: 0xA87A,\n\t9604 - 8208: 0xA87B,\n\t9605 - 8208: 0xA87C,\n\t9606 - 8208: 0xA87D,\n\t9607 - 8208: 0xA87E,\n\t9608 - 8208: 0xA880,\n\t9609 - 8208: 0xA881,\n\t9610 - 8208: 0xA882,\n\t9611 - 8208: 0xA883,\n\t9612 - 8208: 0xA884,\n\t9613 - 8208: 0xA885,\n\t9614 - 8208: 0xA886,\n\t9615 - 8208: 0xA887,\n\t9619 - 8208: 0xA888,\n\t9620 - 8208: 0xA889,\n\t9621 - 8208: 0xA88A,\n\t9632 - 8208: 0xA1F6,\n\t9633 - 8208: 0xA1F5,\n\t9650 - 8208: 0xA1F8,\n\t9651 - 8208: 0xA1F7,\n\t9660 - 8208: 0xA88B,\n\t9661 - 8208: 0xA88C,\n\t9670 - 8208: 0xA1F4,\n\t9671 - 8208: 0xA1F3,\n\t9675 - 8208: 0xA1F0,\n\t9678 - 8208: 0xA1F2,\n\t9679 - 8208: 0xA1F1,\n\t9698 - 8208: 0xA88D,\n\t9699 - 8208: 0xA88E,\n\t9700 - 8208: 0xA88F,\n\t9701 - 8208: 0xA890,\n\t9733 - 8208: 0xA1EF,\n\t9734 - 8208: 0xA1EE,\n\t9737 - 8208: 0xA891,\n\t9792 - 8208: 0xA1E2,\n\t9794 - 8208: 0xA1E1,\n}\n\nconst encode2Low, encode2High = 164, 1106\n\nvar encode2 = [...]uint16{\n\t164 - 164:  0xA1E8,\n\t167 - 164:  0xA1EC,\n\t168 - 164:  0xA1A7,\n\t176 - 164:  0xA1E3,\n\t177 - 164:  0xA1C0,\n\t183 - 164:  0xA1A4,\n\t215 - 164:  0xA1C1,\n\t224 - 164:  0xA8A4,\n\t225 - 164:  0xA8A2,\n\t232 - 164:  0xA8A8,\n\t233 - 164:  0xA8A6,\n\t234 - 164:  0xA8BA,\n\t236 - 164:  0xA8AC,\n\t237 - 164:  0xA8AA,\n\t242 - 164:  0xA8B0,\n\t243 - 164:  0xA8AE,\n\t247 - 164:  0xA1C2,\n\t249 - 164:  0xA8B4,\n\t250 - 164:  0xA8B2,\n\t252 - 164:  0xA8B9,\n\t257 - 164:  0xA8A1,\n\t275 - 164:  0xA8A5,\n\t283 - 164:  0xA8A7,\n\t299 - 164:  0xA8A9,\n\t324 - 164:  0xA8BD,\n\t328 - 164:  0xA8BE,\n\t333 - 164:  0xA8AD,\n\t363 - 164:  0xA8B1,\n\t462 - 164:  0xA8A3,\n\t464 - 164:  0xA8AB,\n\t466 - 164:  0xA8AF,\n\t468 - 164:  0xA8B3,\n\t470 - 164:  0xA8B5,\n\t472 - 164:  0xA8B6,\n\t474 - 164:  0xA8B7,\n\t476 - 164:  0xA8B8,\n\t505 - 164:  0xA8BF,\n\t593 - 164:  0xA8BB,\n\t609 - 164:  0xA8C0,\n\t711 - 164:  0xA1A6,\n\t713 - 164:  0xA1A5,\n\t714 - 164:  0xA840,\n\t715 - 164:  0xA841,\n\t729 - 164:  0xA842,\n\t913 - 164:  0xA6A1,\n\t914 - 164:  0xA6A2,\n\t915 - 164:  0xA6A3,\n\t916 - 164:  0xA6A4,\n\t917 - 164:  0xA6A5,\n\t918 - 164:  0xA6A6,\n\t919 - 164:  0xA6A7,\n\t920 - 164:  0xA6A8,\n\t921 - 164:  0xA6A9,\n\t922 - 164:  0xA6AA,\n\t923 - 164:  0xA6AB,\n\t924 - 164:  0xA6AC,\n\t925 - 164:  0xA6AD,\n\t926 - 164:  0xA6AE,\n\t927 - 164:  0xA6AF,\n\t928 - 164:  0xA6B0,\n\t929 - 164:  0xA6B1,\n\t931 - 164:  0xA6B2,\n\t932 - 164:  0xA6B3,\n\t933 - 164:  0xA6B4,\n\t934 - 164:  0xA6B5,\n\t935 - 164:  0xA6B6,\n\t936 - 164:  0xA6B7,\n\t937 - 164:  0xA6B8,\n\t945 - 164:  0xA6C1,\n\t946 - 164:  0xA6C2,\n\t947 - 164:  0xA6C3,\n\t948 - 164:  0xA6C4,\n\t949 - 164:  0xA6C5,\n\t950 - 164:  0xA6C6,\n\t951 - 164:  0xA6C7,\n\t952 - 164:  0xA6C8,\n\t953 - 164:  0xA6C9,\n\t954 - 164:  0xA6CA,\n\t955 - 164:  0xA6CB,\n\t956 - 164:  0xA6CC,\n\t957 - 164:  0xA6CD,\n\t958 - 164:  0xA6CE,\n\t959 - 164:  0xA6CF,\n\t960 - 164:  0xA6D0,\n\t961 - 164:  0xA6D1,\n\t963 - 164:  0xA6D2,\n\t964 - 164:  0xA6D3,\n\t965 - 164:  0xA6D4,\n\t966 - 164:  0xA6D5,\n\t967 - 164:  0xA6D6,\n\t968 - 164:  0xA6D7,\n\t969 - 164:  0xA6D8,\n\t1025 - 164: 0xA7A7,\n\t1040 - 164: 0xA7A1,\n\t1041 - 164: 0xA7A2,\n\t1042 - 164: 0xA7A3,\n\t1043 - 164: 0xA7A4,\n\t1044 - 164: 0xA7A5,\n\t1045 - 164: 0xA7A6,\n\t1046 - 164: 0xA7A8,\n\t1047 - 164: 0xA7A9,\n\t1048 - 164: 0xA7AA,\n\t1049 - 164: 0xA7AB,\n\t1050 - 164: 0xA7AC,\n\t1051 - 164: 0xA7AD,\n\t1052 - 164: 0xA7AE,\n\t1053 - 164: 0xA7AF,\n\t1054 - 164: 0xA7B0,\n\t1055 - 164: 0xA7B1,\n\t1056 - 164: 0xA7B2,\n\t1057 - 164: 0xA7B3,\n\t1058 - 164: 0xA7B4,\n\t1059 - 164: 0xA7B5,\n\t1060 - 164: 0xA7B6,\n\t1061 - 164: 0xA7B7,\n\t1062 - 164: 0xA7B8,\n\t1063 - 164: 0xA7B9,\n\t1064 - 164: 0xA7BA,\n\t1065 - 164: 0xA7BB,\n\t1066 - 164: 0xA7BC,\n\t1067 - 164: 0xA7BD,\n\t1068 - 164: 0xA7BE,\n\t1069 - 164: 0xA7BF,\n\t1070 - 164: 0xA7C0,\n\t1071 - 164: 0xA7C1,\n\t1072 - 164: 0xA7D1,\n\t1073 - 164: 0xA7D2,\n\t1074 - 164: 0xA7D3,\n\t1075 - 164: 0xA7D4,\n\t1076 - 164: 0xA7D5,\n\t1077 - 164: 0xA7D6,\n\t1078 - 164: 0xA7D8,\n\t1079 - 164: 0xA7D9,\n\t1080 - 164: 0xA7DA,\n\t1081 - 164: 0xA7DB,\n\t1082 - 164: 0xA7DC,\n\t1083 - 164: 0xA7DD,\n\t1084 - 164: 0xA7DE,\n\t1085 - 164: 0xA7DF,\n\t1086 - 164: 0xA7E0,\n\t1087 - 164: 0xA7E1,\n\t1088 - 164: 0xA7E2,\n\t1089 - 164: 0xA7E3,\n\t1090 - 164: 0xA7E4,\n\t1091 - 164: 0xA7E5,\n\t1092 - 164: 0xA7E6,\n\t1093 - 164: 0xA7E7,\n\t1094 - 164: 0xA7E8,\n\t1095 - 164: 0xA7E9,\n\t1096 - 164: 0xA7EA,\n\t1097 - 164: 0xA7EB,\n\t1098 - 164: 0xA7EC,\n\t1099 - 164: 0xA7ED,\n\t1100 - 164: 0xA7EE,\n\t1101 - 164: 0xA7EF,\n\t1102 - 164: 0xA7F0,\n\t1103 - 164: 0xA7F1,\n\t1105 - 164: 0xA7D7,\n}\n\nconst encode3Low, encode3High = 65072, 65510\n\nvar encode3 = [...]uint16{\n\t65072 - 65072: 0xA955,\n\t65073 - 65072: 0xA6F2,\n\t65075 - 65072: 0xA6F4,\n\t65076 - 65072: 0xA6F5,\n\t65077 - 65072: 0xA6E0,\n\t65078 - 65072: 0xA6E1,\n\t65079 - 65072: 0xA6F0,\n\t65080 - 65072: 0xA6F1,\n\t65081 - 65072: 0xA6E2,\n\t65082 - 65072: 0xA6E3,\n\t65083 - 65072: 0xA6EE,\n\t65084 - 65072: 0xA6EF,\n\t65085 - 65072: 0xA6E6,\n\t65086 - 65072: 0xA6E7,\n\t65087 - 65072: 0xA6E4,\n\t65088 - 65072: 0xA6E5,\n\t65089 - 65072: 0xA6E8,\n\t65090 - 65072: 0xA6E9,\n\t65091 - 65072: 0xA6EA,\n\t65092 - 65072: 0xA6EB,\n\t65097 - 65072: 0xA968,\n\t65098 - 65072: 0xA969,\n\t65099 - 65072: 0xA96A,\n\t65100 - 65072: 0xA96B,\n\t65101 - 65072: 0xA96C,\n\t65102 - 65072: 0xA96D,\n\t65103 - 65072: 0xA96E,\n\t65104 - 65072: 0xA96F,\n\t65105 - 65072: 0xA970,\n\t65106 - 65072: 0xA971,\n\t65108 - 65072: 0xA972,\n\t65109 - 65072: 0xA973,\n\t65110 - 65072: 0xA974,\n\t65111 - 65072: 0xA975,\n\t65113 - 65072: 0xA976,\n\t65114 - 65072: 0xA977,\n\t65115 - 65072: 0xA978,\n\t65116 - 65072: 0xA979,\n\t65117 - 65072: 0xA97A,\n\t65118 - 65072: 0xA97B,\n\t65119 - 65072: 0xA97C,\n\t65120 - 65072: 0xA97D,\n\t65121 - 65072: 0xA97E,\n\t65122 - 65072: 0xA980,\n\t65123 - 65072: 0xA981,\n\t65124 - 65072: 0xA982,\n\t65125 - 65072: 0xA983,\n\t65126 - 65072: 0xA984,\n\t65128 - 65072: 0xA985,\n\t65129 - 65072: 0xA986,\n\t65130 - 65072: 0xA987,\n\t65131 - 65072: 0xA988,\n\t65281 - 65072: 0xA3A1,\n\t65282 - 65072: 0xA3A2,\n\t65283 - 65072: 0xA3A3,\n\t65284 - 65072: 0xA1E7,\n\t65285 - 65072: 0xA3A5,\n\t65286 - 65072: 0xA3A6,\n\t65287 - 65072: 0xA3A7,\n\t65288 - 65072: 0xA3A8,\n\t65289 - 65072: 0xA3A9,\n\t65290 - 65072: 0xA3AA,\n\t65291 - 65072: 0xA3AB,\n\t65292 - 65072: 0xA3AC,\n\t65293 - 65072: 0xA3AD,\n\t65294 - 65072: 0xA3AE,\n\t65295 - 65072: 0xA3AF,\n\t65296 - 65072: 0xA3B0,\n\t65297 - 65072: 0xA3B1,\n\t65298 - 65072: 0xA3B2,\n\t65299 - 65072: 0xA3B3,\n\t65300 - 65072: 0xA3B4,\n\t65301 - 65072: 0xA3B5,\n\t65302 - 65072: 0xA3B6,\n\t65303 - 65072: 0xA3B7,\n\t65304 - 65072: 0xA3B8,\n\t65305 - 65072: 0xA3B9,\n\t65306 - 65072: 0xA3BA,\n\t65307 - 65072: 0xA3BB,\n\t65308 - 65072: 0xA3BC,\n\t65309 - 65072: 0xA3BD,\n\t65310 - 65072: 0xA3BE,\n\t65311 - 65072: 0xA3BF,\n\t65312 - 65072: 0xA3C0,\n\t65313 - 65072: 0xA3C1,\n\t65314 - 65072: 0xA3C2,\n\t65315 - 65072: 0xA3C3,\n\t65316 - 65072: 0xA3C4,\n\t65317 - 65072: 0xA3C5,\n\t65318 - 65072: 0xA3C6,\n\t65319 - 65072: 0xA3C7,\n\t65320 - 65072: 0xA3C8,\n\t65321 - 65072: 0xA3C9,\n\t65322 - 65072: 0xA3CA,\n\t65323 - 65072: 0xA3CB,\n\t65324 - 65072: 0xA3CC,\n\t65325 - 65072: 0xA3CD,\n\t65326 - 65072: 0xA3CE,\n\t65327 - 65072: 0xA3CF,\n\t65328 - 65072: 0xA3D0,\n\t65329 - 65072: 0xA3D1,\n\t65330 - 65072: 0xA3D2,\n\t65331 - 65072: 0xA3D3,\n\t65332 - 65072: 0xA3D4,\n\t65333 - 65072: 0xA3D5,\n\t65334 - 65072: 0xA3D6,\n\t65335 - 65072: 0xA3D7,\n\t65336 - 65072: 0xA3D8,\n\t65337 - 65072: 0xA3D9,\n\t65338 - 65072: 0xA3DA,\n\t65339 - 65072: 0xA3DB,\n\t65340 - 65072: 0xA3DC,\n\t65341 - 65072: 0xA3DD,\n\t65342 - 65072: 0xA3DE,\n\t65343 - 65072: 0xA3DF,\n\t65344 - 65072: 0xA3E0,\n\t65345 - 65072: 0xA3E1,\n\t65346 - 65072: 0xA3E2,\n\t65347 - 65072: 0xA3E3,\n\t65348 - 65072: 0xA3E4,\n\t65349 - 65072: 0xA3E5,\n\t65350 - 65072: 0xA3E6,\n\t65351 - 65072: 0xA3E7,\n\t65352 - 65072: 0xA3E8,\n\t65353 - 65072: 0xA3E9,\n\t65354 - 65072: 0xA3EA,\n\t65355 - 65072: 0xA3EB,\n\t65356 - 65072: 0xA3EC,\n\t65357 - 65072: 0xA3ED,\n\t65358 - 65072: 0xA3EE,\n\t65359 - 65072: 0xA3EF,\n\t65360 - 65072: 0xA3F0,\n\t65361 - 65072: 0xA3F1,\n\t65362 - 65072: 0xA3F2,\n\t65363 - 65072: 0xA3F3,\n\t65364 - 65072: 0xA3F4,\n\t65365 - 65072: 0xA3F5,\n\t65366 - 65072: 0xA3F6,\n\t65367 - 65072: 0xA3F7,\n\t65368 - 65072: 0xA3F8,\n\t65369 - 65072: 0xA3F9,\n\t65370 - 65072: 0xA3FA,\n\t65371 - 65072: 0xA3FB,\n\t65372 - 65072: 0xA3FC,\n\t65373 - 65072: 0xA3FD,\n\t65374 - 65072: 0xA1AB,\n\t65504 - 65072: 0xA1E9,\n\t65505 - 65072: 0xA1EA,\n\t65506 - 65072: 0xA956,\n\t65507 - 65072: 0xA3FE,\n\t65508 - 65072: 0xA957,\n\t65509 - 65072: 0xA3A4,\n}\n\nconst encode4Low, encode4High = 63788, 64042\n\nvar encode4 = [...]uint16{\n\t63788 - 63788: 0xFD9C,\n\t63865 - 63788: 0xFD9D,\n\t63893 - 63788: 0xFD9E,\n\t63975 - 63788: 0xFD9F,\n\t63985 - 63788: 0xFDA0,\n\t64012 - 63788: 0xFE40,\n\t64013 - 63788: 0xFE41,\n\t64014 - 63788: 0xFE42,\n\t64015 - 63788: 0xFE43,\n\t64017 - 63788: 0xFE44,\n\t64019 - 63788: 0xFE45,\n\t64020 - 63788: 0xFE46,\n\t64024 - 63788: 0xFE47,\n\t64031 - 63788: 0xFE48,\n\t64032 - 63788: 0xFE49,\n\t64033 - 63788: 0xFE4A,\n\t64035 - 63788: 0xFE4B,\n\t64036 - 63788: 0xFE4C,\n\t64039 - 63788: 0xFE4D,\n\t64040 - 63788: 0xFE4E,\n\t64041 - 63788: 0xFE4F,\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/traditionalchinese/big5.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage traditionalchinese\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/transform\"\n)\n\n// All is a list of all defined encodings in this package.\nvar All = []encoding.Encoding{Big5}\n\n// Big5 is the Big5 encoding, also known as Code Page 950.\nvar Big5 encoding.Encoding = &big5\n\nvar big5 = internal.Encoding{\n\t&internal.SimpleEncoding{big5Decoder{}, big5Encoder{}},\n\t\"Big5\",\n\tidentifier.Big5,\n}\n\nvar errInvalidBig5 = errors.New(\"traditionalchinese: invalid Big5 encoding\")\n\ntype big5Decoder struct{ transform.NopResetter }\n\nfunc (big5Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size, s := rune(0), 0, \"\"\nloop:\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tswitch c0 := src[nSrc]; {\n\t\tcase c0 < utf8.RuneSelf:\n\t\t\tr, size = rune(c0), 1\n\n\t\tcase 0x81 <= c0 && c0 < 0xff:\n\t\t\tif nSrc+1 >= len(src) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tc1 := src[nSrc+1]\n\t\t\tswitch {\n\t\t\tcase 0x40 <= c1 && c1 < 0x7f:\n\t\t\t\tc1 -= 0x40\n\t\t\tcase 0xa1 <= c1 && c1 < 0xff:\n\t\t\t\tc1 -= 0x62\n\t\t\tdefault:\n\t\t\t\terr = errInvalidBig5\n\t\t\t\tbreak loop\n\t\t\t}\n\t\t\tr, size = '\\ufffd', 2\n\t\t\tif i := int(c0-0x81)*157 + int(c1); i < len(decode) {\n\t\t\t\tif 1133 <= i && i < 1167 {\n\t\t\t\t\t// The two-rune special cases for LATIN CAPITAL / SMALL E WITH CIRCUMFLEX\n\t\t\t\t\t// AND MACRON / CARON are from http://encoding.spec.whatwg.org/#big5\n\t\t\t\t\tswitch i {\n\t\t\t\t\tcase 1133:\n\t\t\t\t\t\ts = \"\\u00CA\\u0304\"\n\t\t\t\t\t\tgoto writeStr\n\t\t\t\t\tcase 1135:\n\t\t\t\t\t\ts = \"\\u00CA\\u030C\"\n\t\t\t\t\t\tgoto writeStr\n\t\t\t\t\tcase 1164:\n\t\t\t\t\t\ts = \"\\u00EA\\u0304\"\n\t\t\t\t\t\tgoto writeStr\n\t\t\t\t\tcase 1166:\n\t\t\t\t\t\ts = \"\\u00EA\\u030C\"\n\t\t\t\t\t\tgoto writeStr\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tr = rune(decode[i])\n\t\t\t\tif r == 0 {\n\t\t\t\t\tr = '\\ufffd'\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\terr = errInvalidBig5\n\t\t\tbreak loop\n\t\t}\n\n\t\tif nDst+utf8.RuneLen(r) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t\tcontinue loop\n\n\twriteStr:\n\t\tif nDst+len(s) > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak loop\n\t\t}\n\t\tnDst += copy(dst[nDst:], s)\n\t\tcontinue loop\n\t}\n\tif atEOF && err == transform.ErrShortSrc {\n\t\terr = errInvalidBig5\n\t}\n\treturn nDst, nSrc, err\n}\n\ntype big5Encoder struct{ transform.NopResetter }\n\nfunc (big5Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tr, size := rune(0), 0\n\tfor ; nSrc < len(src); nSrc += size {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\t\t\tif nDst >= len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst] = uint8(r)\n\t\t\tnDst++\n\t\t\tcontinue\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif r >= utf8.RuneSelf {\n\t\t\t// func init checks that the switch covers all tables.\n\t\t\tswitch {\n\t\t\tcase encode0Low <= r && r < encode0High:\n\t\t\t\tif r = rune(encode0[r-encode0Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode1Low <= r && r < encode1High:\n\t\t\t\tif r = rune(encode1[r-encode1Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode2Low <= r && r < encode2High:\n\t\t\t\tif r = rune(encode2[r-encode2Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode3Low <= r && r < encode3High:\n\t\t\t\tif r = rune(encode3[r-encode3Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode4Low <= r && r < encode4High:\n\t\t\t\tif r = rune(encode4[r-encode4Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode5Low <= r && r < encode5High:\n\t\t\t\tif r = rune(encode5[r-encode5Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode6Low <= r && r < encode6High:\n\t\t\t\tif r = rune(encode6[r-encode6Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\tcase encode7Low <= r && r < encode7High:\n\t\t\t\tif r = rune(encode7[r-encode7Low]); r != 0 {\n\t\t\t\t\tgoto write2\n\t\t\t\t}\n\t\t\t}\n\t\t\terr = internal.ErrASCIIReplacement\n\t\t\tbreak\n\t\t}\n\n\twrite2:\n\t\tif nDst+2 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+0] = uint8(r >> 8)\n\t\tdst[nDst+1] = uint8(r)\n\t\tnDst += 2\n\t\tcontinue\n\t}\n\treturn nDst, nSrc, err\n}\n\nfunc init() {\n\t// Check that the hard-coded encode switch covers all tables.\n\tif numEncodeTables != 8 {\n\t\tpanic(\"bad numEncodeTables\")\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/traditionalchinese/maketables.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\n// This program generates tables.go:\n//\tgo run maketables.go | gofmt > tables.go\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"sort\"\n\t\"strings\"\n)\n\nfunc main() {\n\tfmt.Printf(\"// generated by go run maketables.go; DO NOT EDIT\\n\\n\")\n\tfmt.Printf(\"// Package traditionalchinese provides Traditional Chinese encodings such as Big5.\\n\")\n\tfmt.Printf(`package traditionalchinese // import \"golang.org/x/text/encoding/traditionalchinese\"` + \"\\n\\n\")\n\n\tres, err := http.Get(\"http://encoding.spec.whatwg.org/index-big5.txt\")\n\tif err != nil {\n\t\tlog.Fatalf(\"Get: %v\", err)\n\t}\n\tdefer res.Body.Close()\n\n\tmapping := [65536]uint32{}\n\treverse := [65536 * 4]uint16{}\n\n\tscanner := bufio.NewScanner(res.Body)\n\tfor scanner.Scan() {\n\t\ts := strings.TrimSpace(scanner.Text())\n\t\tif s == \"\" || s[0] == '#' {\n\t\t\tcontinue\n\t\t}\n\t\tx, y := uint16(0), uint32(0)\n\t\tif _, err := fmt.Sscanf(s, \"%d 0x%x\", &x, &y); err != nil {\n\t\t\tlog.Fatalf(\"could not parse %q\", s)\n\t\t}\n\t\tif x < 0 || 126*157 <= x {\n\t\t\tlog.Fatalf(\"Big5 code %d is out of range\", x)\n\t\t}\n\t\tmapping[x] = y\n\n\t\t// The WHATWG spec http://encoding.spec.whatwg.org/#indexes says that\n\t\t// \"The index pointer for code point in index is the first pointer\n\t\t// corresponding to code point in index\", which would normally mean\n\t\t// that the code below should be guarded by \"if reverse[y] == 0\", but\n\t\t// last instead of first seems to match the behavior of\n\t\t// \"iconv -f UTF-8 -t BIG5\". For example, U+8005 者 occurs twice in\n\t\t// http://encoding.spec.whatwg.org/index-big5.txt, as index 2148\n\t\t// (encoded as \"\\x8e\\xcd\") and index 6543 (encoded as \"\\xaa\\xcc\")\n\t\t// and \"echo 者 | iconv -f UTF-8 -t BIG5 | xxd\" gives \"\\xaa\\xcc\".\n\t\tc0, c1 := x/157, x%157\n\t\tif c1 < 0x3f {\n\t\t\tc1 += 0x40\n\t\t} else {\n\t\t\tc1 += 0x62\n\t\t}\n\t\treverse[y] = (0x81+c0)<<8 | c1\n\t}\n\tif err := scanner.Err(); err != nil {\n\t\tlog.Fatalf(\"scanner error: %v\", err)\n\t}\n\n\tfmt.Printf(\"// decode is the decoding table from Big5 code to Unicode.\\n\")\n\tfmt.Printf(\"// It is defined at http://encoding.spec.whatwg.org/index-big5.txt\\n\")\n\tfmt.Printf(\"var decode = [...]uint32{\\n\")\n\tfor i, v := range mapping {\n\t\tif v != 0 {\n\t\t\tfmt.Printf(\"\\t%d: 0x%08X,\\n\", i, v)\n\t\t}\n\t}\n\tfmt.Printf(\"}\\n\\n\")\n\n\t// Any run of at least separation continuous zero entries in the reverse map will\n\t// be a separate encode table.\n\tconst separation = 1024\n\n\tintervals := []interval(nil)\n\tlow, high := -1, -1\n\tfor i, v := range reverse {\n\t\tif v == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tif low < 0 {\n\t\t\tlow = i\n\t\t} else if i-high >= separation {\n\t\t\tif high >= 0 {\n\t\t\t\tintervals = append(intervals, interval{low, high})\n\t\t\t}\n\t\t\tlow = i\n\t\t}\n\t\thigh = i + 1\n\t}\n\tif high >= 0 {\n\t\tintervals = append(intervals, interval{low, high})\n\t}\n\tsort.Sort(byDecreasingLength(intervals))\n\n\tfmt.Printf(\"const numEncodeTables = %d\\n\\n\", len(intervals))\n\tfmt.Printf(\"// encodeX are the encoding tables from Unicode to Big5 code,\\n\")\n\tfmt.Printf(\"// sorted by decreasing length.\\n\")\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"// encode%d: %5d entries for runes in [%6d, %6d).\\n\", i, v.len(), v.low, v.high)\n\t}\n\tfmt.Printf(\"\\n\")\n\n\tfor i, v := range intervals {\n\t\tfmt.Printf(\"const encode%dLow, encode%dHigh = %d, %d\\n\\n\", i, i, v.low, v.high)\n\t\tfmt.Printf(\"var encode%d = [...]uint16{\\n\", i)\n\t\tfor j := v.low; j < v.high; j++ {\n\t\t\tx := reverse[j]\n\t\t\tif x == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfmt.Printf(\"\\t%d-%d: 0x%04X,\\n\", j, v.low, x)\n\t\t}\n\t\tfmt.Printf(\"}\\n\\n\")\n\t}\n}\n\n// interval is a half-open interval [low, high).\ntype interval struct {\n\tlow, high int\n}\n\nfunc (i interval) len() int { return i.high - i.low }\n\n// byDecreasingLength sorts intervals by decreasing length.\ntype byDecreasingLength []interval\n\nfunc (b byDecreasingLength) Len() int           { return len(b) }\nfunc (b byDecreasingLength) Less(i, j int) bool { return b[i].len() > b[j].len() }\nfunc (b byDecreasingLength) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/traditionalchinese/tables.go",
    "content": "// generated by go run maketables.go; DO NOT EDIT\n\n// Package traditionalchinese provides Traditional Chinese encodings such as Big5.\npackage traditionalchinese // import \"golang.org/x/text/encoding/traditionalchinese\"\n\n// decode is the decoding table from Big5 code to Unicode.\n// It is defined at http://encoding.spec.whatwg.org/index-big5.txt\nvar decode = [...]uint32{\n\t942:   0x000043F0,\n\t943:   0x00004C32,\n\t944:   0x00004603,\n\t945:   0x000045A6,\n\t946:   0x00004578,\n\t947:   0x00027267,\n\t948:   0x00004D77,\n\t949:   0x000045B3,\n\t950:   0x00027CB1,\n\t951:   0x00004CE2,\n\t952:   0x00027CC5,\n\t953:   0x00003B95,\n\t954:   0x00004736,\n\t955:   0x00004744,\n\t956:   0x00004C47,\n\t957:   0x00004C40,\n\t958:   0x000242BF,\n\t959:   0x00023617,\n\t960:   0x00027352,\n\t961:   0x00026E8B,\n\t962:   0x000270D2,\n\t963:   0x00004C57,\n\t964:   0x0002A351,\n\t965:   0x0000474F,\n\t966:   0x000045DA,\n\t967:   0x00004C85,\n\t968:   0x00027C6C,\n\t969:   0x00004D07,\n\t970:   0x00004AA4,\n\t971:   0x000046A1,\n\t972:   0x00026B23,\n\t973:   0x00007225,\n\t974:   0x00025A54,\n\t975:   0x00021A63,\n\t976:   0x00023E06,\n\t977:   0x00023F61,\n\t978:   0x0000664D,\n\t979:   0x000056FB,\n\t981:   0x00007D95,\n\t982:   0x0000591D,\n\t983:   0x00028BB9,\n\t984:   0x00003DF4,\n\t985:   0x00009734,\n\t986:   0x00027BEF,\n\t987:   0x00005BDB,\n\t988:   0x00021D5E,\n\t989:   0x00005AA4,\n\t990:   0x00003625,\n\t991:   0x00029EB0,\n\t992:   0x00005AD1,\n\t993:   0x00005BB7,\n\t994:   0x00005CFC,\n\t995:   0x0000676E,\n\t996:   0x00008593,\n\t997:   0x00029945,\n\t998:   0x00007461,\n\t999:   0x0000749D,\n\t1000:  0x00003875,\n\t1001:  0x00021D53,\n\t1002:  0x0002369E,\n\t1003:  0x00026021,\n\t1004:  0x00003EEC,\n\t1005:  0x000258DE,\n\t1006:  0x00003AF5,\n\t1007:  0x00007AFC,\n\t1008:  0x00009F97,\n\t1009:  0x00024161,\n\t1010:  0x0002890D,\n\t1011:  0x000231EA,\n\t1012:  0x00020A8A,\n\t1013:  0x0002325E,\n\t1014:  0x0000430A,\n\t1015:  0x00008484,\n\t1016:  0x00009F96,\n\t1017:  0x0000942F,\n\t1018:  0x00004930,\n\t1019:  0x00008613,\n\t1020:  0x00005896,\n\t1021:  0x0000974A,\n\t1022:  0x00009218,\n\t1023:  0x000079D0,\n\t1024:  0x00007A32,\n\t1025:  0x00006660,\n\t1026:  0x00006A29,\n\t1027:  0x0000889D,\n\t1028:  0x0000744C,\n\t1029:  0x00007BC5,\n\t1030:  0x00006782,\n\t1031:  0x00007A2C,\n\t1032:  0x0000524F,\n\t1033:  0x00009046,\n\t1034:  0x000034E6,\n\t1035:  0x000073C4,\n\t1036:  0x00025DB9,\n\t1037:  0x000074C6,\n\t1038:  0x00009FC7,\n\t1039:  0x000057B3,\n\t1040:  0x0000492F,\n\t1041:  0x0000544C,\n\t1042:  0x00004131,\n\t1043:  0x0002368E,\n\t1044:  0x00005818,\n\t1045:  0x00007A72,\n\t1046:  0x00027B65,\n\t1047:  0x00008B8F,\n\t1048:  0x000046AE,\n\t1049:  0x00026E88,\n\t1050:  0x00004181,\n\t1051:  0x00025D99,\n\t1052:  0x00007BAE,\n\t1053:  0x000224BC,\n\t1054:  0x00009FC8,\n\t1055:  0x000224C1,\n\t1056:  0x000224C9,\n\t1057:  0x000224CC,\n\t1058:  0x00009FC9,\n\t1059:  0x00008504,\n\t1060:  0x000235BB,\n\t1061:  0x000040B4,\n\t1062:  0x00009FCA,\n\t1063:  0x000044E1,\n\t1064:  0x0002ADFF,\n\t1065:  0x000062C1,\n\t1066:  0x0000706E,\n\t1067:  0x00009FCB,\n\t1099:  0x000031C0,\n\t1100:  0x000031C1,\n\t1101:  0x000031C2,\n\t1102:  0x000031C3,\n\t1103:  0x000031C4,\n\t1104:  0x0002010C,\n\t1105:  0x000031C5,\n\t1106:  0x000200D1,\n\t1107:  0x000200CD,\n\t1108:  0x000031C6,\n\t1109:  0x000031C7,\n\t1110:  0x000200CB,\n\t1111:  0x00021FE8,\n\t1112:  0x000031C8,\n\t1113:  0x000200CA,\n\t1114:  0x000031C9,\n\t1115:  0x000031CA,\n\t1116:  0x000031CB,\n\t1117:  0x000031CC,\n\t1118:  0x0002010E,\n\t1119:  0x000031CD,\n\t1120:  0x000031CE,\n\t1121:  0x00000100,\n\t1122:  0x000000C1,\n\t1123:  0x000001CD,\n\t1124:  0x000000C0,\n\t1125:  0x00000112,\n\t1126:  0x000000C9,\n\t1127:  0x0000011A,\n\t1128:  0x000000C8,\n\t1129:  0x0000014C,\n\t1130:  0x000000D3,\n\t1131:  0x000001D1,\n\t1132:  0x000000D2,\n\t1134:  0x00001EBE,\n\t1136:  0x00001EC0,\n\t1137:  0x000000CA,\n\t1138:  0x00000101,\n\t1139:  0x000000E1,\n\t1140:  0x000001CE,\n\t1141:  0x000000E0,\n\t1142:  0x00000251,\n\t1143:  0x00000113,\n\t1144:  0x000000E9,\n\t1145:  0x0000011B,\n\t1146:  0x000000E8,\n\t1147:  0x0000012B,\n\t1148:  0x000000ED,\n\t1149:  0x000001D0,\n\t1150:  0x000000EC,\n\t1151:  0x0000014D,\n\t1152:  0x000000F3,\n\t1153:  0x000001D2,\n\t1154:  0x000000F2,\n\t1155:  0x0000016B,\n\t1156:  0x000000FA,\n\t1157:  0x000001D4,\n\t1158:  0x000000F9,\n\t1159:  0x000001D6,\n\t1160:  0x000001D8,\n\t1161:  0x000001DA,\n\t1162:  0x000001DC,\n\t1163:  0x000000FC,\n\t1165:  0x00001EBF,\n\t1167:  0x00001EC1,\n\t1168:  0x000000EA,\n\t1169:  0x00000261,\n\t1170:  0x000023DA,\n\t1171:  0x000023DB,\n\t1256:  0x0002A3A9,\n\t1257:  0x00021145,\n\t1259:  0x0000650A,\n\t1262:  0x00004E3D,\n\t1263:  0x00006EDD,\n\t1264:  0x00009D4E,\n\t1265:  0x000091DF,\n\t1268:  0x00027735,\n\t1269:  0x00006491,\n\t1270:  0x00004F1A,\n\t1271:  0x00004F28,\n\t1272:  0x00004FA8,\n\t1273:  0x00005156,\n\t1274:  0x00005174,\n\t1275:  0x0000519C,\n\t1276:  0x000051E4,\n\t1277:  0x000052A1,\n\t1278:  0x000052A8,\n\t1279:  0x0000533B,\n\t1280:  0x0000534E,\n\t1281:  0x000053D1,\n\t1282:  0x000053D8,\n\t1283:  0x000056E2,\n\t1284:  0x000058F0,\n\t1285:  0x00005904,\n\t1286:  0x00005907,\n\t1287:  0x00005932,\n\t1288:  0x00005934,\n\t1289:  0x00005B66,\n\t1290:  0x00005B9E,\n\t1291:  0x00005B9F,\n\t1292:  0x00005C9A,\n\t1293:  0x00005E86,\n\t1294:  0x0000603B,\n\t1295:  0x00006589,\n\t1296:  0x000067FE,\n\t1297:  0x00006804,\n\t1298:  0x00006865,\n\t1299:  0x00006D4E,\n\t1300:  0x000070BC,\n\t1301:  0x00007535,\n\t1302:  0x00007EA4,\n\t1303:  0x00007EAC,\n\t1304:  0x00007EBA,\n\t1305:  0x00007EC7,\n\t1306:  0x00007ECF,\n\t1307:  0x00007EDF,\n\t1308:  0x00007F06,\n\t1309:  0x00007F37,\n\t1310:  0x0000827A,\n\t1311:  0x000082CF,\n\t1312:  0x0000836F,\n\t1313:  0x000089C6,\n\t1314:  0x00008BBE,\n\t1315:  0x00008BE2,\n\t1316:  0x00008F66,\n\t1317:  0x00008F67,\n\t1318:  0x00008F6E,\n\t1319:  0x00007411,\n\t1320:  0x00007CFC,\n\t1321:  0x00007DCD,\n\t1322:  0x00006946,\n\t1323:  0x00007AC9,\n\t1324:  0x00005227,\n\t1329:  0x0000918C,\n\t1330:  0x000078B8,\n\t1331:  0x0000915E,\n\t1332:  0x000080BC,\n\t1334:  0x00008D0B,\n\t1335:  0x000080F6,\n\t1336:  0x000209E7,\n\t1339:  0x0000809F,\n\t1340:  0x00009EC7,\n\t1341:  0x00004CCD,\n\t1342:  0x00009DC9,\n\t1343:  0x00009E0C,\n\t1344:  0x00004C3E,\n\t1345:  0x00029DF6,\n\t1346:  0x0002700E,\n\t1347:  0x00009E0A,\n\t1348:  0x0002A133,\n\t1349:  0x000035C1,\n\t1351:  0x00006E9A,\n\t1352:  0x0000823E,\n\t1353:  0x00007519,\n\t1355:  0x00004911,\n\t1356:  0x00009A6C,\n\t1357:  0x00009A8F,\n\t1358:  0x00009F99,\n\t1359:  0x00007987,\n\t1360:  0x0002846C,\n\t1361:  0x00021DCA,\n\t1362:  0x000205D0,\n\t1363:  0x00022AE6,\n\t1364:  0x00004E24,\n\t1365:  0x00004E81,\n\t1366:  0x00004E80,\n\t1367:  0x00004E87,\n\t1368:  0x00004EBF,\n\t1369:  0x00004EEB,\n\t1370:  0x00004F37,\n\t1371:  0x0000344C,\n\t1372:  0x00004FBD,\n\t1373:  0x00003E48,\n\t1374:  0x00005003,\n\t1375:  0x00005088,\n\t1376:  0x0000347D,\n\t1377:  0x00003493,\n\t1378:  0x000034A5,\n\t1379:  0x00005186,\n\t1380:  0x00005905,\n\t1381:  0x000051DB,\n\t1382:  0x000051FC,\n\t1383:  0x00005205,\n\t1384:  0x00004E89,\n\t1385:  0x00005279,\n\t1386:  0x00005290,\n\t1387:  0x00005327,\n\t1388:  0x000035C7,\n\t1389:  0x000053A9,\n\t1390:  0x00003551,\n\t1391:  0x000053B0,\n\t1392:  0x00003553,\n\t1393:  0x000053C2,\n\t1394:  0x00005423,\n\t1395:  0x0000356D,\n\t1396:  0x00003572,\n\t1397:  0x00003681,\n\t1398:  0x00005493,\n\t1399:  0x000054A3,\n\t1400:  0x000054B4,\n\t1401:  0x000054B9,\n\t1402:  0x000054D0,\n\t1403:  0x000054EF,\n\t1404:  0x00005518,\n\t1405:  0x00005523,\n\t1406:  0x00005528,\n\t1407:  0x00003598,\n\t1408:  0x0000553F,\n\t1409:  0x000035A5,\n\t1410:  0x000035BF,\n\t1411:  0x000055D7,\n\t1412:  0x000035C5,\n\t1413:  0x00027D84,\n\t1414:  0x00005525,\n\t1416:  0x00020C42,\n\t1417:  0x00020D15,\n\t1418:  0x0002512B,\n\t1419:  0x00005590,\n\t1420:  0x00022CC6,\n\t1421:  0x000039EC,\n\t1422:  0x00020341,\n\t1423:  0x00008E46,\n\t1424:  0x00024DB8,\n\t1425:  0x000294E5,\n\t1426:  0x00004053,\n\t1427:  0x000280BE,\n\t1428:  0x0000777A,\n\t1429:  0x00022C38,\n\t1430:  0x00003A34,\n\t1431:  0x000047D5,\n\t1432:  0x0002815D,\n\t1433:  0x000269F2,\n\t1434:  0x00024DEA,\n\t1435:  0x000064DD,\n\t1436:  0x00020D7C,\n\t1437:  0x00020FB4,\n\t1438:  0x00020CD5,\n\t1439:  0x000210F4,\n\t1440:  0x0000648D,\n\t1441:  0x00008E7E,\n\t1442:  0x00020E96,\n\t1443:  0x00020C0B,\n\t1444:  0x00020F64,\n\t1445:  0x00022CA9,\n\t1446:  0x00028256,\n\t1447:  0x000244D3,\n\t1449:  0x00020D46,\n\t1450:  0x00029A4D,\n\t1451:  0x000280E9,\n\t1452:  0x000047F4,\n\t1453:  0x00024EA7,\n\t1454:  0x00022CC2,\n\t1455:  0x00009AB2,\n\t1456:  0x00003A67,\n\t1457:  0x000295F4,\n\t1458:  0x00003FED,\n\t1459:  0x00003506,\n\t1460:  0x000252C7,\n\t1461:  0x000297D4,\n\t1462:  0x000278C8,\n\t1463:  0x00022D44,\n\t1464:  0x00009D6E,\n\t1465:  0x00009815,\n\t1467:  0x000043D9,\n\t1468:  0x000260A5,\n\t1469:  0x000064B4,\n\t1470:  0x000054E3,\n\t1471:  0x00022D4C,\n\t1472:  0x00022BCA,\n\t1473:  0x00021077,\n\t1474:  0x000039FB,\n\t1475:  0x0002106F,\n\t1476:  0x000266DA,\n\t1477:  0x00026716,\n\t1478:  0x000279A0,\n\t1479:  0x000064EA,\n\t1480:  0x00025052,\n\t1481:  0x00020C43,\n\t1482:  0x00008E68,\n\t1483:  0x000221A1,\n\t1484:  0x00028B4C,\n\t1485:  0x00020731,\n\t1487:  0x0000480B,\n\t1488:  0x000201A9,\n\t1489:  0x00003FFA,\n\t1490:  0x00005873,\n\t1491:  0x00022D8D,\n\t1493:  0x000245C8,\n\t1494:  0x000204FC,\n\t1495:  0x00026097,\n\t1496:  0x00020F4C,\n\t1497:  0x00020D96,\n\t1498:  0x00005579,\n\t1499:  0x000040BB,\n\t1500:  0x000043BA,\n\t1502:  0x00004AB4,\n\t1503:  0x00022A66,\n\t1504:  0x0002109D,\n\t1505:  0x000081AA,\n\t1506:  0x000098F5,\n\t1507:  0x00020D9C,\n\t1508:  0x00006379,\n\t1509:  0x000039FE,\n\t1510:  0x00022775,\n\t1511:  0x00008DC0,\n\t1512:  0x000056A1,\n\t1513:  0x0000647C,\n\t1514:  0x00003E43,\n\t1516:  0x0002A601,\n\t1517:  0x00020E09,\n\t1518:  0x00022ACF,\n\t1519:  0x00022CC9,\n\t1521:  0x000210C8,\n\t1522:  0x000239C2,\n\t1523:  0x00003992,\n\t1524:  0x00003A06,\n\t1525:  0x0002829B,\n\t1526:  0x00003578,\n\t1527:  0x00025E49,\n\t1528:  0x000220C7,\n\t1529:  0x00005652,\n\t1530:  0x00020F31,\n\t1531:  0x00022CB2,\n\t1532:  0x00029720,\n\t1533:  0x000034BC,\n\t1534:  0x00006C3D,\n\t1535:  0x00024E3B,\n\t1538:  0x00027574,\n\t1539:  0x00022E8B,\n\t1540:  0x00022208,\n\t1541:  0x0002A65B,\n\t1542:  0x00028CCD,\n\t1543:  0x00020E7A,\n\t1544:  0x00020C34,\n\t1545:  0x0002681C,\n\t1546:  0x00007F93,\n\t1547:  0x000210CF,\n\t1548:  0x00022803,\n\t1549:  0x00022939,\n\t1550:  0x000035FB,\n\t1551:  0x000251E3,\n\t1552:  0x00020E8C,\n\t1553:  0x00020F8D,\n\t1554:  0x00020EAA,\n\t1555:  0x00003F93,\n\t1556:  0x00020F30,\n\t1557:  0x00020D47,\n\t1558:  0x0002114F,\n\t1559:  0x00020E4C,\n\t1561:  0x00020EAB,\n\t1562:  0x00020BA9,\n\t1563:  0x00020D48,\n\t1564:  0x000210C0,\n\t1565:  0x0002113D,\n\t1566:  0x00003FF9,\n\t1567:  0x00022696,\n\t1568:  0x00006432,\n\t1569:  0x00020FAD,\n\t1570:  0x000233F4,\n\t1571:  0x00027639,\n\t1572:  0x00022BCE,\n\t1573:  0x00020D7E,\n\t1574:  0x00020D7F,\n\t1575:  0x00022C51,\n\t1576:  0x00022C55,\n\t1577:  0x00003A18,\n\t1578:  0x00020E98,\n\t1579:  0x000210C7,\n\t1580:  0x00020F2E,\n\t1581:  0x0002A632,\n\t1582:  0x00026B50,\n\t1583:  0x00028CD2,\n\t1584:  0x00028D99,\n\t1585:  0x00028CCA,\n\t1586:  0x000095AA,\n\t1587:  0x000054CC,\n\t1588:  0x000082C4,\n\t1589:  0x000055B9,\n\t1591:  0x00029EC3,\n\t1592:  0x00009C26,\n\t1593:  0x00009AB6,\n\t1594:  0x0002775E,\n\t1595:  0x00022DEE,\n\t1596:  0x00007140,\n\t1597:  0x0000816D,\n\t1598:  0x000080EC,\n\t1599:  0x00005C1C,\n\t1600:  0x00026572,\n\t1601:  0x00008134,\n\t1602:  0x00003797,\n\t1603:  0x0000535F,\n\t1604:  0x000280BD,\n\t1605:  0x000091B6,\n\t1606:  0x00020EFA,\n\t1607:  0x00020E0F,\n\t1608:  0x00020E77,\n\t1609:  0x00020EFB,\n\t1610:  0x000035DD,\n\t1611:  0x00024DEB,\n\t1612:  0x00003609,\n\t1613:  0x00020CD6,\n\t1614:  0x000056AF,\n\t1615:  0x000227B5,\n\t1616:  0x000210C9,\n\t1617:  0x00020E10,\n\t1618:  0x00020E78,\n\t1619:  0x00021078,\n\t1620:  0x00021148,\n\t1621:  0x00028207,\n\t1622:  0x00021455,\n\t1623:  0x00020E79,\n\t1624:  0x00024E50,\n\t1625:  0x00022DA4,\n\t1626:  0x00005A54,\n\t1627:  0x0002101D,\n\t1628:  0x0002101E,\n\t1629:  0x000210F5,\n\t1630:  0x000210F6,\n\t1631:  0x0000579C,\n\t1632:  0x00020E11,\n\t1633:  0x00027694,\n\t1634:  0x000282CD,\n\t1635:  0x00020FB5,\n\t1636:  0x00020E7B,\n\t1637:  0x0002517E,\n\t1638:  0x00003703,\n\t1639:  0x00020FB6,\n\t1640:  0x00021180,\n\t1641:  0x000252D8,\n\t1642:  0x0002A2BD,\n\t1643:  0x000249DA,\n\t1644:  0x0002183A,\n\t1645:  0x00024177,\n\t1646:  0x0002827C,\n\t1647:  0x00005899,\n\t1648:  0x00005268,\n\t1649:  0x0000361A,\n\t1650:  0x0002573D,\n\t1651:  0x00007BB2,\n\t1652:  0x00005B68,\n\t1653:  0x00004800,\n\t1654:  0x00004B2C,\n\t1655:  0x00009F27,\n\t1656:  0x000049E7,\n\t1657:  0x00009C1F,\n\t1658:  0x00009B8D,\n\t1659:  0x00025B74,\n\t1660:  0x0002313D,\n\t1661:  0x000055FB,\n\t1662:  0x000035F2,\n\t1663:  0x00005689,\n\t1664:  0x00004E28,\n\t1665:  0x00005902,\n\t1666:  0x00021BC1,\n\t1667:  0x0002F878,\n\t1668:  0x00009751,\n\t1669:  0x00020086,\n\t1670:  0x00004E5B,\n\t1671:  0x00004EBB,\n\t1672:  0x0000353E,\n\t1673:  0x00005C23,\n\t1674:  0x00005F51,\n\t1675:  0x00005FC4,\n\t1676:  0x000038FA,\n\t1677:  0x0000624C,\n\t1678:  0x00006535,\n\t1679:  0x00006B7A,\n\t1680:  0x00006C35,\n\t1681:  0x00006C3A,\n\t1682:  0x0000706C,\n\t1683:  0x0000722B,\n\t1684:  0x00004E2C,\n\t1685:  0x000072AD,\n\t1686:  0x000248E9,\n\t1687:  0x00007F52,\n\t1688:  0x0000793B,\n\t1689:  0x00007CF9,\n\t1690:  0x00007F53,\n\t1691:  0x0002626A,\n\t1692:  0x000034C1,\n\t1694:  0x0002634B,\n\t1695:  0x00008002,\n\t1696:  0x00008080,\n\t1697:  0x00026612,\n\t1698:  0x00026951,\n\t1699:  0x0000535D,\n\t1700:  0x00008864,\n\t1701:  0x000089C1,\n\t1702:  0x000278B2,\n\t1703:  0x00008BA0,\n\t1704:  0x00008D1D,\n\t1705:  0x00009485,\n\t1706:  0x00009578,\n\t1707:  0x0000957F,\n\t1708:  0x000095E8,\n\t1709:  0x00028E0F,\n\t1710:  0x000097E6,\n\t1711:  0x00009875,\n\t1712:  0x000098CE,\n\t1713:  0x000098DE,\n\t1714:  0x00009963,\n\t1715:  0x00029810,\n\t1716:  0x00009C7C,\n\t1717:  0x00009E1F,\n\t1718:  0x00009EC4,\n\t1719:  0x00006B6F,\n\t1720:  0x0000F907,\n\t1721:  0x00004E37,\n\t1722:  0x00020087,\n\t1723:  0x0000961D,\n\t1724:  0x00006237,\n\t1725:  0x000094A2,\n\t1727:  0x0000503B,\n\t1728:  0x00006DFE,\n\t1729:  0x00029C73,\n\t1730:  0x00009FA6,\n\t1731:  0x00003DC9,\n\t1732:  0x0000888F,\n\t1733:  0x0002414E,\n\t1734:  0x00007077,\n\t1735:  0x00005CF5,\n\t1736:  0x00004B20,\n\t1737:  0x000251CD,\n\t1738:  0x00003559,\n\t1739:  0x00025D30,\n\t1740:  0x00006122,\n\t1741:  0x00028A32,\n\t1742:  0x00008FA7,\n\t1743:  0x000091F6,\n\t1744:  0x00007191,\n\t1745:  0x00006719,\n\t1746:  0x000073BA,\n\t1747:  0x00023281,\n\t1748:  0x0002A107,\n\t1749:  0x00003C8B,\n\t1750:  0x00021980,\n\t1751:  0x00004B10,\n\t1752:  0x000078E4,\n\t1753:  0x00007402,\n\t1754:  0x000051AE,\n\t1755:  0x0002870F,\n\t1756:  0x00004009,\n\t1757:  0x00006A63,\n\t1758:  0x0002A2BA,\n\t1759:  0x00004223,\n\t1760:  0x0000860F,\n\t1761:  0x00020A6F,\n\t1762:  0x00007A2A,\n\t1763:  0x00029947,\n\t1764:  0x00028AEA,\n\t1765:  0x00009755,\n\t1766:  0x0000704D,\n\t1767:  0x00005324,\n\t1768:  0x0002207E,\n\t1769:  0x000093F4,\n\t1770:  0x000076D9,\n\t1771:  0x000289E3,\n\t1772:  0x00009FA7,\n\t1773:  0x000077DD,\n\t1774:  0x00004EA3,\n\t1775:  0x00004FF0,\n\t1776:  0x000050BC,\n\t1777:  0x00004E2F,\n\t1778:  0x00004F17,\n\t1779:  0x00009FA8,\n\t1780:  0x00005434,\n\t1781:  0x00007D8B,\n\t1782:  0x00005892,\n\t1783:  0x000058D0,\n\t1784:  0x00021DB6,\n\t1785:  0x00005E92,\n\t1786:  0x00005E99,\n\t1787:  0x00005FC2,\n\t1788:  0x00022712,\n\t1789:  0x0000658B,\n\t1790:  0x000233F9,\n\t1791:  0x00006919,\n\t1792:  0x00006A43,\n\t1793:  0x00023C63,\n\t1794:  0x00006CFF,\n\t1796:  0x00007200,\n\t1797:  0x00024505,\n\t1798:  0x0000738C,\n\t1799:  0x00003EDB,\n\t1800:  0x00024A13,\n\t1801:  0x00005B15,\n\t1802:  0x000074B9,\n\t1803:  0x00008B83,\n\t1804:  0x00025CA4,\n\t1805:  0x00025695,\n\t1806:  0x00007A93,\n\t1807:  0x00007BEC,\n\t1808:  0x00007CC3,\n\t1809:  0x00007E6C,\n\t1810:  0x000082F8,\n\t1811:  0x00008597,\n\t1812:  0x00009FA9,\n\t1813:  0x00008890,\n\t1814:  0x00009FAA,\n\t1815:  0x00008EB9,\n\t1816:  0x00009FAB,\n\t1817:  0x00008FCF,\n\t1818:  0x0000855F,\n\t1819:  0x000099E0,\n\t1820:  0x00009221,\n\t1821:  0x00009FAC,\n\t1822:  0x00028DB9,\n\t1823:  0x0002143F,\n\t1824:  0x00004071,\n\t1825:  0x000042A2,\n\t1826:  0x00005A1A,\n\t1830:  0x00009868,\n\t1831:  0x0000676B,\n\t1832:  0x00004276,\n\t1833:  0x0000573D,\n\t1835:  0x000085D6,\n\t1836:  0x0002497B,\n\t1837:  0x000082BF,\n\t1838:  0x0002710D,\n\t1839:  0x00004C81,\n\t1840:  0x00026D74,\n\t1841:  0x00005D7B,\n\t1842:  0x00026B15,\n\t1843:  0x00026FBE,\n\t1844:  0x00009FAD,\n\t1845:  0x00009FAE,\n\t1846:  0x00005B96,\n\t1847:  0x00009FAF,\n\t1848:  0x000066E7,\n\t1849:  0x00007E5B,\n\t1850:  0x00006E57,\n\t1851:  0x000079CA,\n\t1852:  0x00003D88,\n\t1853:  0x000044C3,\n\t1854:  0x00023256,\n\t1855:  0x00022796,\n\t1856:  0x0000439A,\n\t1857:  0x00004536,\n\t1859:  0x00005CD5,\n\t1860:  0x00023B1A,\n\t1861:  0x00008AF9,\n\t1862:  0x00005C78,\n\t1863:  0x00003D12,\n\t1864:  0x00023551,\n\t1865:  0x00005D78,\n\t1866:  0x00009FB2,\n\t1867:  0x00007157,\n\t1868:  0x00004558,\n\t1869:  0x000240EC,\n\t1870:  0x00021E23,\n\t1871:  0x00004C77,\n\t1872:  0x00003978,\n\t1873:  0x0000344A,\n\t1874:  0x000201A4,\n\t1875:  0x00026C41,\n\t1876:  0x00008ACC,\n\t1877:  0x00004FB4,\n\t1878:  0x00020239,\n\t1879:  0x000059BF,\n\t1880:  0x0000816C,\n\t1881:  0x00009856,\n\t1882:  0x000298FA,\n\t1883:  0x00005F3B,\n\t1884:  0x00020B9F,\n\t1886:  0x000221C1,\n\t1887:  0x0002896D,\n\t1888:  0x00004102,\n\t1889:  0x000046BB,\n\t1890:  0x00029079,\n\t1891:  0x00003F07,\n\t1892:  0x00009FB3,\n\t1893:  0x0002A1B5,\n\t1894:  0x000040F8,\n\t1895:  0x000037D6,\n\t1896:  0x000046F7,\n\t1897:  0x00026C46,\n\t1898:  0x0000417C,\n\t1899:  0x000286B2,\n\t1900:  0x000273FF,\n\t1901:  0x0000456D,\n\t1902:  0x000038D4,\n\t1903:  0x0002549A,\n\t1904:  0x00004561,\n\t1905:  0x0000451B,\n\t1906:  0x00004D89,\n\t1907:  0x00004C7B,\n\t1908:  0x00004D76,\n\t1909:  0x000045EA,\n\t1910:  0x00003FC8,\n\t1911:  0x00024B0F,\n\t1912:  0x00003661,\n\t1913:  0x000044DE,\n\t1914:  0x000044BD,\n\t1915:  0x000041ED,\n\t1916:  0x00005D3E,\n\t1917:  0x00005D48,\n\t1918:  0x00005D56,\n\t1919:  0x00003DFC,\n\t1920:  0x0000380F,\n\t1921:  0x00005DA4,\n\t1922:  0x00005DB9,\n\t1923:  0x00003820,\n\t1924:  0x00003838,\n\t1925:  0x00005E42,\n\t1926:  0x00005EBD,\n\t1927:  0x00005F25,\n\t1928:  0x00005F83,\n\t1929:  0x00003908,\n\t1930:  0x00003914,\n\t1931:  0x0000393F,\n\t1932:  0x0000394D,\n\t1933:  0x000060D7,\n\t1934:  0x0000613D,\n\t1935:  0x00005CE5,\n\t1936:  0x00003989,\n\t1937:  0x000061B7,\n\t1938:  0x000061B9,\n\t1939:  0x000061CF,\n\t1940:  0x000039B8,\n\t1941:  0x0000622C,\n\t1942:  0x00006290,\n\t1943:  0x000062E5,\n\t1944:  0x00006318,\n\t1945:  0x000039F8,\n\t1946:  0x000056B1,\n\t1947:  0x00003A03,\n\t1948:  0x000063E2,\n\t1949:  0x000063FB,\n\t1950:  0x00006407,\n\t1951:  0x0000645A,\n\t1952:  0x00003A4B,\n\t1953:  0x000064C0,\n\t1954:  0x00005D15,\n\t1955:  0x00005621,\n\t1956:  0x00009F9F,\n\t1957:  0x00003A97,\n\t1958:  0x00006586,\n\t1959:  0x00003ABD,\n\t1960:  0x000065FF,\n\t1961:  0x00006653,\n\t1962:  0x00003AF2,\n\t1963:  0x00006692,\n\t1964:  0x00003B22,\n\t1965:  0x00006716,\n\t1966:  0x00003B42,\n\t1967:  0x000067A4,\n\t1968:  0x00006800,\n\t1969:  0x00003B58,\n\t1970:  0x0000684A,\n\t1971:  0x00006884,\n\t1972:  0x00003B72,\n\t1973:  0x00003B71,\n\t1974:  0x00003B7B,\n\t1975:  0x00006909,\n\t1976:  0x00006943,\n\t1977:  0x0000725C,\n\t1978:  0x00006964,\n\t1979:  0x0000699F,\n\t1980:  0x00006985,\n\t1981:  0x00003BBC,\n\t1982:  0x000069D6,\n\t1983:  0x00003BDD,\n\t1984:  0x00006A65,\n\t1985:  0x00006A74,\n\t1986:  0x00006A71,\n\t1987:  0x00006A82,\n\t1988:  0x00003BEC,\n\t1989:  0x00006A99,\n\t1990:  0x00003BF2,\n\t1991:  0x00006AAB,\n\t1992:  0x00006AB5,\n\t1993:  0x00006AD4,\n\t1994:  0x00006AF6,\n\t1995:  0x00006B81,\n\t1996:  0x00006BC1,\n\t1997:  0x00006BEA,\n\t1998:  0x00006C75,\n\t1999:  0x00006CAA,\n\t2000:  0x00003CCB,\n\t2001:  0x00006D02,\n\t2002:  0x00006D06,\n\t2003:  0x00006D26,\n\t2004:  0x00006D81,\n\t2005:  0x00003CEF,\n\t2006:  0x00006DA4,\n\t2007:  0x00006DB1,\n\t2008:  0x00006E15,\n\t2009:  0x00006E18,\n\t2010:  0x00006E29,\n\t2011:  0x00006E86,\n\t2012:  0x000289C0,\n\t2013:  0x00006EBB,\n\t2014:  0x00006EE2,\n\t2015:  0x00006EDA,\n\t2016:  0x00009F7F,\n\t2017:  0x00006EE8,\n\t2018:  0x00006EE9,\n\t2019:  0x00006F24,\n\t2020:  0x00006F34,\n\t2021:  0x00003D46,\n\t2022:  0x00023F41,\n\t2023:  0x00006F81,\n\t2024:  0x00006FBE,\n\t2025:  0x00003D6A,\n\t2026:  0x00003D75,\n\t2027:  0x000071B7,\n\t2028:  0x00005C99,\n\t2029:  0x00003D8A,\n\t2030:  0x0000702C,\n\t2031:  0x00003D91,\n\t2032:  0x00007050,\n\t2033:  0x00007054,\n\t2034:  0x0000706F,\n\t2035:  0x0000707F,\n\t2036:  0x00007089,\n\t2037:  0x00020325,\n\t2038:  0x000043C1,\n\t2039:  0x000035F1,\n\t2040:  0x00020ED8,\n\t2041:  0x00023ED7,\n\t2042:  0x000057BE,\n\t2043:  0x00026ED3,\n\t2044:  0x0000713E,\n\t2045:  0x000257E0,\n\t2046:  0x0000364E,\n\t2047:  0x000069A2,\n\t2048:  0x00028BE9,\n\t2049:  0x00005B74,\n\t2050:  0x00007A49,\n\t2051:  0x000258E1,\n\t2052:  0x000294D9,\n\t2053:  0x00007A65,\n\t2054:  0x00007A7D,\n\t2055:  0x000259AC,\n\t2056:  0x00007ABB,\n\t2057:  0x00007AB0,\n\t2058:  0x00007AC2,\n\t2059:  0x00007AC3,\n\t2060:  0x000071D1,\n\t2061:  0x0002648D,\n\t2062:  0x000041CA,\n\t2063:  0x00007ADA,\n\t2064:  0x00007ADD,\n\t2065:  0x00007AEA,\n\t2066:  0x000041EF,\n\t2067:  0x000054B2,\n\t2068:  0x00025C01,\n\t2069:  0x00007B0B,\n\t2070:  0x00007B55,\n\t2071:  0x00007B29,\n\t2072:  0x0002530E,\n\t2073:  0x00025CFE,\n\t2074:  0x00007BA2,\n\t2075:  0x00007B6F,\n\t2076:  0x0000839C,\n\t2077:  0x00025BB4,\n\t2078:  0x00026C7F,\n\t2079:  0x00007BD0,\n\t2080:  0x00008421,\n\t2081:  0x00007B92,\n\t2082:  0x00007BB8,\n\t2083:  0x00025D20,\n\t2084:  0x00003DAD,\n\t2085:  0x00025C65,\n\t2086:  0x00008492,\n\t2087:  0x00007BFA,\n\t2088:  0x00007C06,\n\t2089:  0x00007C35,\n\t2090:  0x00025CC1,\n\t2091:  0x00007C44,\n\t2092:  0x00007C83,\n\t2093:  0x00024882,\n\t2094:  0x00007CA6,\n\t2095:  0x0000667D,\n\t2096:  0x00024578,\n\t2097:  0x00007CC9,\n\t2098:  0x00007CC7,\n\t2099:  0x00007CE6,\n\t2100:  0x00007C74,\n\t2101:  0x00007CF3,\n\t2102:  0x00007CF5,\n\t2103:  0x00007CCE,\n\t2104:  0x00007E67,\n\t2105:  0x0000451D,\n\t2106:  0x00026E44,\n\t2107:  0x00007D5D,\n\t2108:  0x00026ED6,\n\t2109:  0x0000748D,\n\t2110:  0x00007D89,\n\t2111:  0x00007DAB,\n\t2112:  0x00007135,\n\t2113:  0x00007DB3,\n\t2114:  0x00007DD2,\n\t2115:  0x00024057,\n\t2116:  0x00026029,\n\t2117:  0x00007DE4,\n\t2118:  0x00003D13,\n\t2119:  0x00007DF5,\n\t2120:  0x000217F9,\n\t2121:  0x00007DE5,\n\t2122:  0x0002836D,\n\t2123:  0x00007E1D,\n\t2124:  0x00026121,\n\t2125:  0x0002615A,\n\t2126:  0x00007E6E,\n\t2127:  0x00007E92,\n\t2128:  0x0000432B,\n\t2129:  0x0000946C,\n\t2130:  0x00007E27,\n\t2131:  0x00007F40,\n\t2132:  0x00007F41,\n\t2133:  0x00007F47,\n\t2134:  0x00007936,\n\t2135:  0x000262D0,\n\t2136:  0x000099E1,\n\t2137:  0x00007F97,\n\t2138:  0x00026351,\n\t2139:  0x00007FA3,\n\t2140:  0x00021661,\n\t2141:  0x00020068,\n\t2142:  0x0000455C,\n\t2143:  0x00023766,\n\t2144:  0x00004503,\n\t2145:  0x0002833A,\n\t2146:  0x00007FFA,\n\t2147:  0x00026489,\n\t2148:  0x00008005,\n\t2149:  0x00008008,\n\t2150:  0x0000801D,\n\t2151:  0x00008028,\n\t2152:  0x0000802F,\n\t2153:  0x0002A087,\n\t2154:  0x00026CC3,\n\t2155:  0x0000803B,\n\t2156:  0x0000803C,\n\t2157:  0x00008061,\n\t2158:  0x00022714,\n\t2159:  0x00004989,\n\t2160:  0x00026626,\n\t2161:  0x00023DE3,\n\t2162:  0x000266E8,\n\t2163:  0x00006725,\n\t2164:  0x000080A7,\n\t2165:  0x00028A48,\n\t2166:  0x00008107,\n\t2167:  0x0000811A,\n\t2168:  0x000058B0,\n\t2169:  0x000226F6,\n\t2170:  0x00006C7F,\n\t2171:  0x00026498,\n\t2172:  0x00024FB8,\n\t2173:  0x000064E7,\n\t2174:  0x0002148A,\n\t2175:  0x00008218,\n\t2176:  0x0002185E,\n\t2177:  0x00006A53,\n\t2178:  0x00024A65,\n\t2179:  0x00024A95,\n\t2180:  0x0000447A,\n\t2181:  0x00008229,\n\t2182:  0x00020B0D,\n\t2183:  0x00026A52,\n\t2184:  0x00023D7E,\n\t2185:  0x00004FF9,\n\t2186:  0x000214FD,\n\t2187:  0x000084E2,\n\t2188:  0x00008362,\n\t2189:  0x00026B0A,\n\t2190:  0x000249A7,\n\t2191:  0x00023530,\n\t2192:  0x00021773,\n\t2193:  0x00023DF8,\n\t2194:  0x000082AA,\n\t2195:  0x0000691B,\n\t2196:  0x0002F994,\n\t2197:  0x000041DB,\n\t2198:  0x0000854B,\n\t2199:  0x000082D0,\n\t2200:  0x0000831A,\n\t2201:  0x00020E16,\n\t2202:  0x000217B4,\n\t2203:  0x000036C1,\n\t2204:  0x0002317D,\n\t2205:  0x0002355A,\n\t2206:  0x0000827B,\n\t2207:  0x000082E2,\n\t2208:  0x00008318,\n\t2209:  0x00023E8B,\n\t2210:  0x00026DA3,\n\t2211:  0x00026B05,\n\t2212:  0x00026B97,\n\t2213:  0x000235CE,\n\t2214:  0x00003DBF,\n\t2215:  0x0000831D,\n\t2216:  0x000055EC,\n\t2217:  0x00008385,\n\t2218:  0x0000450B,\n\t2219:  0x00026DA5,\n\t2220:  0x000083AC,\n\t2221:  0x000083C1,\n\t2222:  0x000083D3,\n\t2223:  0x0000347E,\n\t2224:  0x00026ED4,\n\t2225:  0x00006A57,\n\t2226:  0x0000855A,\n\t2227:  0x00003496,\n\t2228:  0x00026E42,\n\t2229:  0x00022EEF,\n\t2230:  0x00008458,\n\t2231:  0x00025BE4,\n\t2232:  0x00008471,\n\t2233:  0x00003DD3,\n\t2234:  0x000044E4,\n\t2235:  0x00006AA7,\n\t2236:  0x0000844A,\n\t2237:  0x00023CB5,\n\t2238:  0x00007958,\n\t2239:  0x000084A8,\n\t2240:  0x00026B96,\n\t2241:  0x00026E77,\n\t2242:  0x00026E43,\n\t2243:  0x000084DE,\n\t2244:  0x0000840F,\n\t2245:  0x00008391,\n\t2246:  0x000044A0,\n\t2247:  0x00008493,\n\t2248:  0x000084E4,\n\t2249:  0x00025C91,\n\t2250:  0x00004240,\n\t2251:  0x00025CC0,\n\t2252:  0x00004543,\n\t2253:  0x00008534,\n\t2254:  0x00005AF2,\n\t2255:  0x00026E99,\n\t2256:  0x00004527,\n\t2257:  0x00008573,\n\t2258:  0x00004516,\n\t2259:  0x000067BF,\n\t2260:  0x00008616,\n\t2261:  0x00028625,\n\t2262:  0x0002863B,\n\t2263:  0x000085C1,\n\t2264:  0x00027088,\n\t2265:  0x00008602,\n\t2266:  0x00021582,\n\t2267:  0x000270CD,\n\t2268:  0x0002F9B2,\n\t2269:  0x0000456A,\n\t2270:  0x00008628,\n\t2271:  0x00003648,\n\t2272:  0x000218A2,\n\t2273:  0x000053F7,\n\t2274:  0x0002739A,\n\t2275:  0x0000867E,\n\t2276:  0x00008771,\n\t2277:  0x0002A0F8,\n\t2278:  0x000087EE,\n\t2279:  0x00022C27,\n\t2280:  0x000087B1,\n\t2281:  0x000087DA,\n\t2282:  0x0000880F,\n\t2283:  0x00005661,\n\t2284:  0x0000866C,\n\t2285:  0x00006856,\n\t2286:  0x0000460F,\n\t2287:  0x00008845,\n\t2288:  0x00008846,\n\t2289:  0x000275E0,\n\t2290:  0x00023DB9,\n\t2291:  0x000275E4,\n\t2292:  0x0000885E,\n\t2293:  0x0000889C,\n\t2294:  0x0000465B,\n\t2295:  0x000088B4,\n\t2296:  0x000088B5,\n\t2297:  0x000063C1,\n\t2298:  0x000088C5,\n\t2299:  0x00007777,\n\t2300:  0x0002770F,\n\t2301:  0x00008987,\n\t2302:  0x0000898A,\n\t2303:  0x000089A6,\n\t2304:  0x000089A9,\n\t2305:  0x000089A7,\n\t2306:  0x000089BC,\n\t2307:  0x00028A25,\n\t2308:  0x000089E7,\n\t2309:  0x00027924,\n\t2310:  0x00027ABD,\n\t2311:  0x00008A9C,\n\t2312:  0x00007793,\n\t2313:  0x000091FE,\n\t2314:  0x00008A90,\n\t2315:  0x00027A59,\n\t2316:  0x00007AE9,\n\t2317:  0x00027B3A,\n\t2318:  0x00023F8F,\n\t2319:  0x00004713,\n\t2320:  0x00027B38,\n\t2321:  0x0000717C,\n\t2322:  0x00008B0C,\n\t2323:  0x00008B1F,\n\t2324:  0x00025430,\n\t2325:  0x00025565,\n\t2326:  0x00008B3F,\n\t2327:  0x00008B4C,\n\t2328:  0x00008B4D,\n\t2329:  0x00008AA9,\n\t2330:  0x00024A7A,\n\t2331:  0x00008B90,\n\t2332:  0x00008B9B,\n\t2333:  0x00008AAF,\n\t2334:  0x000216DF,\n\t2335:  0x00004615,\n\t2336:  0x0000884F,\n\t2337:  0x00008C9B,\n\t2338:  0x00027D54,\n\t2339:  0x00027D8F,\n\t2340:  0x0002F9D4,\n\t2341:  0x00003725,\n\t2342:  0x00027D53,\n\t2343:  0x00008CD6,\n\t2344:  0x00027D98,\n\t2345:  0x00027DBD,\n\t2346:  0x00008D12,\n\t2347:  0x00008D03,\n\t2348:  0x00021910,\n\t2349:  0x00008CDB,\n\t2350:  0x0000705C,\n\t2351:  0x00008D11,\n\t2352:  0x00024CC9,\n\t2353:  0x00003ED0,\n\t2354:  0x00008D77,\n\t2355:  0x00008DA9,\n\t2356:  0x00028002,\n\t2357:  0x00021014,\n\t2358:  0x0002498A,\n\t2359:  0x00003B7C,\n\t2360:  0x000281BC,\n\t2361:  0x0002710C,\n\t2362:  0x00007AE7,\n\t2363:  0x00008EAD,\n\t2364:  0x00008EB6,\n\t2365:  0x00008EC3,\n\t2366:  0x000092D4,\n\t2367:  0x00008F19,\n\t2368:  0x00008F2D,\n\t2369:  0x00028365,\n\t2370:  0x00028412,\n\t2371:  0x00008FA5,\n\t2372:  0x00009303,\n\t2373:  0x0002A29F,\n\t2374:  0x00020A50,\n\t2375:  0x00008FB3,\n\t2376:  0x0000492A,\n\t2377:  0x000289DE,\n\t2378:  0x0002853D,\n\t2379:  0x00023DBB,\n\t2380:  0x00005EF8,\n\t2381:  0x00023262,\n\t2382:  0x00008FF9,\n\t2383:  0x0002A014,\n\t2384:  0x000286BC,\n\t2385:  0x00028501,\n\t2386:  0x00022325,\n\t2387:  0x00003980,\n\t2388:  0x00026ED7,\n\t2389:  0x00009037,\n\t2390:  0x0002853C,\n\t2391:  0x00027ABE,\n\t2392:  0x00009061,\n\t2393:  0x0002856C,\n\t2394:  0x0002860B,\n\t2395:  0x000090A8,\n\t2396:  0x00028713,\n\t2397:  0x000090C4,\n\t2398:  0x000286E6,\n\t2399:  0x000090AE,\n\t2400:  0x000090FD,\n\t2401:  0x00009167,\n\t2402:  0x00003AF0,\n\t2403:  0x000091A9,\n\t2404:  0x000091C4,\n\t2405:  0x00007CAC,\n\t2406:  0x00028933,\n\t2407:  0x00021E89,\n\t2408:  0x0000920E,\n\t2409:  0x00006C9F,\n\t2410:  0x00009241,\n\t2411:  0x00009262,\n\t2412:  0x000255B9,\n\t2413:  0x000092B9,\n\t2414:  0x00028AC6,\n\t2415:  0x00023C9B,\n\t2416:  0x00028B0C,\n\t2417:  0x000255DB,\n\t2418:  0x00020D31,\n\t2419:  0x0000932C,\n\t2420:  0x0000936B,\n\t2421:  0x00028AE1,\n\t2422:  0x00028BEB,\n\t2423:  0x0000708F,\n\t2424:  0x00005AC3,\n\t2425:  0x00028AE2,\n\t2426:  0x00028AE5,\n\t2427:  0x00004965,\n\t2428:  0x00009244,\n\t2429:  0x00028BEC,\n\t2430:  0x00028C39,\n\t2431:  0x00028BFF,\n\t2432:  0x00009373,\n\t2433:  0x0000945B,\n\t2434:  0x00008EBC,\n\t2435:  0x00009585,\n\t2436:  0x000095A6,\n\t2437:  0x00009426,\n\t2438:  0x000095A0,\n\t2439:  0x00006FF6,\n\t2440:  0x000042B9,\n\t2441:  0x0002267A,\n\t2442:  0x000286D8,\n\t2443:  0x0002127C,\n\t2444:  0x00023E2E,\n\t2445:  0x000049DF,\n\t2446:  0x00006C1C,\n\t2447:  0x0000967B,\n\t2448:  0x00009696,\n\t2449:  0x0000416C,\n\t2450:  0x000096A3,\n\t2451:  0x00026ED5,\n\t2452:  0x000061DA,\n\t2453:  0x000096B6,\n\t2454:  0x000078F5,\n\t2455:  0x00028AE0,\n\t2456:  0x000096BD,\n\t2457:  0x000053CC,\n\t2458:  0x000049A1,\n\t2459:  0x00026CB8,\n\t2460:  0x00020274,\n\t2461:  0x00026410,\n\t2462:  0x000290AF,\n\t2463:  0x000290E5,\n\t2464:  0x00024AD1,\n\t2465:  0x00021915,\n\t2466:  0x0002330A,\n\t2467:  0x00009731,\n\t2468:  0x00008642,\n\t2469:  0x00009736,\n\t2470:  0x00004A0F,\n\t2471:  0x0000453D,\n\t2472:  0x00004585,\n\t2473:  0x00024AE9,\n\t2474:  0x00007075,\n\t2475:  0x00005B41,\n\t2476:  0x0000971B,\n\t2477:  0x0000975C,\n\t2478:  0x000291D5,\n\t2479:  0x00009757,\n\t2480:  0x00005B4A,\n\t2481:  0x000291EB,\n\t2482:  0x0000975F,\n\t2483:  0x00009425,\n\t2484:  0x000050D0,\n\t2485:  0x000230B7,\n\t2486:  0x000230BC,\n\t2487:  0x00009789,\n\t2488:  0x0000979F,\n\t2489:  0x000097B1,\n\t2490:  0x000097BE,\n\t2491:  0x000097C0,\n\t2492:  0x000097D2,\n\t2493:  0x000097E0,\n\t2494:  0x0002546C,\n\t2495:  0x000097EE,\n\t2496:  0x0000741C,\n\t2497:  0x00029433,\n\t2498:  0x000097FF,\n\t2499:  0x000097F5,\n\t2500:  0x0002941D,\n\t2501:  0x0002797A,\n\t2502:  0x00004AD1,\n\t2503:  0x00009834,\n\t2504:  0x00009833,\n\t2505:  0x0000984B,\n\t2506:  0x00009866,\n\t2507:  0x00003B0E,\n\t2508:  0x00027175,\n\t2509:  0x00003D51,\n\t2510:  0x00020630,\n\t2511:  0x0002415C,\n\t2512:  0x00025706,\n\t2513:  0x000098CA,\n\t2514:  0x000098B7,\n\t2515:  0x000098C8,\n\t2516:  0x000098C7,\n\t2517:  0x00004AFF,\n\t2518:  0x00026D27,\n\t2519:  0x000216D3,\n\t2520:  0x000055B0,\n\t2521:  0x000098E1,\n\t2522:  0x000098E6,\n\t2523:  0x000098EC,\n\t2524:  0x00009378,\n\t2525:  0x00009939,\n\t2526:  0x00024A29,\n\t2527:  0x00004B72,\n\t2528:  0x00029857,\n\t2529:  0x00029905,\n\t2530:  0x000099F5,\n\t2531:  0x00009A0C,\n\t2532:  0x00009A3B,\n\t2533:  0x00009A10,\n\t2534:  0x00009A58,\n\t2535:  0x00025725,\n\t2536:  0x000036C4,\n\t2537:  0x000290B1,\n\t2538:  0x00029BD5,\n\t2539:  0x00009AE0,\n\t2540:  0x00009AE2,\n\t2541:  0x00029B05,\n\t2542:  0x00009AF4,\n\t2543:  0x00004C0E,\n\t2544:  0x00009B14,\n\t2545:  0x00009B2D,\n\t2546:  0x00028600,\n\t2547:  0x00005034,\n\t2548:  0x00009B34,\n\t2549:  0x000269A8,\n\t2550:  0x000038C3,\n\t2551:  0x0002307D,\n\t2552:  0x00009B50,\n\t2553:  0x00009B40,\n\t2554:  0x00029D3E,\n\t2555:  0x00005A45,\n\t2556:  0x00021863,\n\t2557:  0x00009B8E,\n\t2558:  0x0002424B,\n\t2559:  0x00009C02,\n\t2560:  0x00009BFF,\n\t2561:  0x00009C0C,\n\t2562:  0x00029E68,\n\t2563:  0x00009DD4,\n\t2564:  0x00029FB7,\n\t2565:  0x0002A192,\n\t2566:  0x0002A1AB,\n\t2567:  0x0002A0E1,\n\t2568:  0x0002A123,\n\t2569:  0x0002A1DF,\n\t2570:  0x00009D7E,\n\t2571:  0x00009D83,\n\t2572:  0x0002A134,\n\t2573:  0x00009E0E,\n\t2574:  0x00006888,\n\t2575:  0x00009DC4,\n\t2576:  0x0002215B,\n\t2577:  0x0002A193,\n\t2578:  0x0002A220,\n\t2579:  0x0002193B,\n\t2580:  0x0002A233,\n\t2581:  0x00009D39,\n\t2582:  0x0002A0B9,\n\t2583:  0x0002A2B4,\n\t2584:  0x00009E90,\n\t2585:  0x00009E95,\n\t2586:  0x00009E9E,\n\t2587:  0x00009EA2,\n\t2588:  0x00004D34,\n\t2589:  0x00009EAA,\n\t2590:  0x00009EAF,\n\t2591:  0x00024364,\n\t2592:  0x00009EC1,\n\t2593:  0x00003B60,\n\t2594:  0x000039E5,\n\t2595:  0x00003D1D,\n\t2596:  0x00004F32,\n\t2597:  0x000037BE,\n\t2598:  0x00028C2B,\n\t2599:  0x00009F02,\n\t2600:  0x00009F08,\n\t2601:  0x00004B96,\n\t2602:  0x00009424,\n\t2603:  0x00026DA2,\n\t2604:  0x00009F17,\n\t2605:  0x00009F16,\n\t2606:  0x00009F39,\n\t2607:  0x0000569F,\n\t2608:  0x0000568A,\n\t2609:  0x00009F45,\n\t2610:  0x000099B8,\n\t2611:  0x0002908B,\n\t2612:  0x000097F2,\n\t2613:  0x0000847F,\n\t2614:  0x00009F62,\n\t2615:  0x00009F69,\n\t2616:  0x00007ADC,\n\t2617:  0x00009F8E,\n\t2618:  0x00007216,\n\t2619:  0x00004BBE,\n\t2620:  0x00024975,\n\t2621:  0x000249BB,\n\t2622:  0x00007177,\n\t2623:  0x000249F8,\n\t2624:  0x00024348,\n\t2625:  0x00024A51,\n\t2626:  0x0000739E,\n\t2627:  0x00028BDA,\n\t2628:  0x000218FA,\n\t2629:  0x0000799F,\n\t2630:  0x0002897E,\n\t2631:  0x00028E36,\n\t2632:  0x00009369,\n\t2633:  0x000093F3,\n\t2634:  0x00028A44,\n\t2635:  0x000092EC,\n\t2636:  0x00009381,\n\t2637:  0x000093CB,\n\t2638:  0x0002896C,\n\t2639:  0x000244B9,\n\t2640:  0x00007217,\n\t2641:  0x00003EEB,\n\t2642:  0x00007772,\n\t2643:  0x00007A43,\n\t2644:  0x000070D0,\n\t2645:  0x00024473,\n\t2646:  0x000243F8,\n\t2647:  0x0000717E,\n\t2648:  0x000217EF,\n\t2649:  0x000070A3,\n\t2650:  0x000218BE,\n\t2651:  0x00023599,\n\t2652:  0x00003EC7,\n\t2653:  0x00021885,\n\t2654:  0x0002542F,\n\t2655:  0x000217F8,\n\t2656:  0x00003722,\n\t2657:  0x000216FB,\n\t2658:  0x00021839,\n\t2659:  0x000036E1,\n\t2660:  0x00021774,\n\t2661:  0x000218D1,\n\t2662:  0x00025F4B,\n\t2663:  0x00003723,\n\t2664:  0x000216C0,\n\t2665:  0x0000575B,\n\t2666:  0x00024A25,\n\t2667:  0x000213FE,\n\t2668:  0x000212A8,\n\t2669:  0x000213C6,\n\t2670:  0x000214B6,\n\t2671:  0x00008503,\n\t2672:  0x000236A6,\n\t2673:  0x00008503,\n\t2674:  0x00008455,\n\t2675:  0x00024994,\n\t2676:  0x00027165,\n\t2677:  0x00023E31,\n\t2678:  0x0002555C,\n\t2679:  0x00023EFB,\n\t2680:  0x00027052,\n\t2681:  0x000044F4,\n\t2682:  0x000236EE,\n\t2683:  0x0002999D,\n\t2684:  0x00026F26,\n\t2685:  0x000067F9,\n\t2686:  0x00003733,\n\t2687:  0x00003C15,\n\t2688:  0x00003DE7,\n\t2689:  0x0000586C,\n\t2690:  0x00021922,\n\t2691:  0x00006810,\n\t2692:  0x00004057,\n\t2693:  0x0002373F,\n\t2694:  0x000240E1,\n\t2695:  0x0002408B,\n\t2696:  0x0002410F,\n\t2697:  0x00026C21,\n\t2698:  0x000054CB,\n\t2699:  0x0000569E,\n\t2700:  0x000266B1,\n\t2701:  0x00005692,\n\t2702:  0x00020FDF,\n\t2703:  0x00020BA8,\n\t2704:  0x00020E0D,\n\t2705:  0x000093C6,\n\t2706:  0x00028B13,\n\t2707:  0x0000939C,\n\t2708:  0x00004EF8,\n\t2709:  0x0000512B,\n\t2710:  0x00003819,\n\t2711:  0x00024436,\n\t2712:  0x00004EBC,\n\t2713:  0x00020465,\n\t2714:  0x0002037F,\n\t2715:  0x00004F4B,\n\t2716:  0x00004F8A,\n\t2717:  0x00025651,\n\t2718:  0x00005A68,\n\t2719:  0x000201AB,\n\t2720:  0x000203CB,\n\t2721:  0x00003999,\n\t2722:  0x0002030A,\n\t2723:  0x00020414,\n\t2724:  0x00003435,\n\t2725:  0x00004F29,\n\t2726:  0x000202C0,\n\t2727:  0x00028EB3,\n\t2728:  0x00020275,\n\t2729:  0x00008ADA,\n\t2730:  0x0002020C,\n\t2731:  0x00004E98,\n\t2732:  0x000050CD,\n\t2733:  0x0000510D,\n\t2734:  0x00004FA2,\n\t2735:  0x00004F03,\n\t2736:  0x00024A0E,\n\t2737:  0x00023E8A,\n\t2738:  0x00004F42,\n\t2739:  0x0000502E,\n\t2740:  0x0000506C,\n\t2741:  0x00005081,\n\t2742:  0x00004FCC,\n\t2743:  0x00004FE5,\n\t2744:  0x00005058,\n\t2745:  0x000050FC,\n\t2746:  0x00005159,\n\t2747:  0x0000515B,\n\t2748:  0x0000515D,\n\t2749:  0x0000515E,\n\t2750:  0x00006E76,\n\t2751:  0x00023595,\n\t2752:  0x00023E39,\n\t2753:  0x00023EBF,\n\t2754:  0x00006D72,\n\t2755:  0x00021884,\n\t2756:  0x00023E89,\n\t2757:  0x000051A8,\n\t2758:  0x000051C3,\n\t2759:  0x000205E0,\n\t2760:  0x000044DD,\n\t2761:  0x000204A3,\n\t2762:  0x00020492,\n\t2763:  0x00020491,\n\t2764:  0x00008D7A,\n\t2765:  0x00028A9C,\n\t2766:  0x0002070E,\n\t2767:  0x00005259,\n\t2768:  0x000052A4,\n\t2769:  0x00020873,\n\t2770:  0x000052E1,\n\t2771:  0x0000936E,\n\t2772:  0x0000467A,\n\t2773:  0x0000718C,\n\t2774:  0x0002438C,\n\t2775:  0x00020C20,\n\t2776:  0x000249AC,\n\t2777:  0x000210E4,\n\t2778:  0x000069D1,\n\t2779:  0x00020E1D,\n\t2780:  0x00007479,\n\t2781:  0x00003EDE,\n\t2782:  0x00007499,\n\t2783:  0x00007414,\n\t2784:  0x00007456,\n\t2785:  0x00007398,\n\t2786:  0x00004B8E,\n\t2787:  0x00024ABC,\n\t2788:  0x0002408D,\n\t2789:  0x000053D0,\n\t2790:  0x00003584,\n\t2791:  0x0000720F,\n\t2792:  0x000240C9,\n\t2793:  0x000055B4,\n\t2794:  0x00020345,\n\t2795:  0x000054CD,\n\t2796:  0x00020BC6,\n\t2797:  0x0000571D,\n\t2798:  0x0000925D,\n\t2799:  0x000096F4,\n\t2800:  0x00009366,\n\t2801:  0x000057DD,\n\t2802:  0x0000578D,\n\t2803:  0x0000577F,\n\t2804:  0x0000363E,\n\t2805:  0x000058CB,\n\t2806:  0x00005A99,\n\t2807:  0x00028A46,\n\t2808:  0x000216FA,\n\t2809:  0x0002176F,\n\t2810:  0x00021710,\n\t2811:  0x00005A2C,\n\t2812:  0x000059B8,\n\t2813:  0x0000928F,\n\t2814:  0x00005A7E,\n\t2815:  0x00005ACF,\n\t2816:  0x00005A12,\n\t2817:  0x00025946,\n\t2818:  0x000219F3,\n\t2819:  0x00021861,\n\t2820:  0x00024295,\n\t2821:  0x000036F5,\n\t2822:  0x00006D05,\n\t2823:  0x00007443,\n\t2824:  0x00005A21,\n\t2825:  0x00025E83,\n\t2826:  0x00005A81,\n\t2827:  0x00028BD7,\n\t2828:  0x00020413,\n\t2829:  0x000093E0,\n\t2830:  0x0000748C,\n\t2831:  0x00021303,\n\t2832:  0x00007105,\n\t2833:  0x00004972,\n\t2834:  0x00009408,\n\t2835:  0x000289FB,\n\t2836:  0x000093BD,\n\t2837:  0x000037A0,\n\t2838:  0x00005C1E,\n\t2839:  0x00005C9E,\n\t2840:  0x00005E5E,\n\t2841:  0x00005E48,\n\t2842:  0x00021996,\n\t2843:  0x0002197C,\n\t2844:  0x00023AEE,\n\t2845:  0x00005ECD,\n\t2846:  0x00005B4F,\n\t2847:  0x00021903,\n\t2848:  0x00021904,\n\t2849:  0x00003701,\n\t2850:  0x000218A0,\n\t2851:  0x000036DD,\n\t2852:  0x000216FE,\n\t2853:  0x000036D3,\n\t2854:  0x0000812A,\n\t2855:  0x00028A47,\n\t2856:  0x00021DBA,\n\t2857:  0x00023472,\n\t2858:  0x000289A8,\n\t2859:  0x00005F0C,\n\t2860:  0x00005F0E,\n\t2861:  0x00021927,\n\t2862:  0x000217AB,\n\t2863:  0x00005A6B,\n\t2864:  0x0002173B,\n\t2865:  0x00005B44,\n\t2866:  0x00008614,\n\t2867:  0x000275FD,\n\t2868:  0x00008860,\n\t2869:  0x0000607E,\n\t2870:  0x00022860,\n\t2871:  0x0002262B,\n\t2872:  0x00005FDB,\n\t2873:  0x00003EB8,\n\t2874:  0x000225AF,\n\t2875:  0x000225BE,\n\t2876:  0x00029088,\n\t2877:  0x00026F73,\n\t2878:  0x000061C0,\n\t2879:  0x0002003E,\n\t2880:  0x00020046,\n\t2881:  0x0002261B,\n\t2882:  0x00006199,\n\t2883:  0x00006198,\n\t2884:  0x00006075,\n\t2885:  0x00022C9B,\n\t2886:  0x00022D07,\n\t2887:  0x000246D4,\n\t2888:  0x0002914D,\n\t2889:  0x00006471,\n\t2890:  0x00024665,\n\t2891:  0x00022B6A,\n\t2892:  0x00003A29,\n\t2893:  0x00022B22,\n\t2894:  0x00023450,\n\t2895:  0x000298EA,\n\t2896:  0x00022E78,\n\t2897:  0x00006337,\n\t2898:  0x0002A45B,\n\t2899:  0x000064B6,\n\t2900:  0x00006331,\n\t2901:  0x000063D1,\n\t2902:  0x000249E3,\n\t2903:  0x00022D67,\n\t2904:  0x000062A4,\n\t2905:  0x00022CA1,\n\t2906:  0x0000643B,\n\t2907:  0x0000656B,\n\t2908:  0x00006972,\n\t2909:  0x00003BF4,\n\t2910:  0x0002308E,\n\t2911:  0x000232AD,\n\t2912:  0x00024989,\n\t2913:  0x000232AB,\n\t2914:  0x0000550D,\n\t2915:  0x000232E0,\n\t2916:  0x000218D9,\n\t2917:  0x0002943F,\n\t2918:  0x000066CE,\n\t2919:  0x00023289,\n\t2920:  0x000231B3,\n\t2921:  0x00003AE0,\n\t2922:  0x00004190,\n\t2923:  0x00025584,\n\t2924:  0x00028B22,\n\t2925:  0x0002558F,\n\t2926:  0x000216FC,\n\t2927:  0x0002555B,\n\t2928:  0x00025425,\n\t2929:  0x000078EE,\n\t2930:  0x00023103,\n\t2931:  0x0002182A,\n\t2932:  0x00023234,\n\t2933:  0x00003464,\n\t2934:  0x0002320F,\n\t2935:  0x00023182,\n\t2936:  0x000242C9,\n\t2937:  0x0000668E,\n\t2938:  0x00026D24,\n\t2939:  0x0000666B,\n\t2940:  0x00004B93,\n\t2941:  0x00006630,\n\t2942:  0x00027870,\n\t2943:  0x00021DEB,\n\t2944:  0x00006663,\n\t2945:  0x000232D2,\n\t2946:  0x000232E1,\n\t2947:  0x0000661E,\n\t2948:  0x00025872,\n\t2949:  0x000038D1,\n\t2950:  0x0002383A,\n\t2951:  0x000237BC,\n\t2952:  0x00003B99,\n\t2953:  0x000237A2,\n\t2954:  0x000233FE,\n\t2955:  0x000074D0,\n\t2956:  0x00003B96,\n\t2957:  0x0000678F,\n\t2958:  0x0002462A,\n\t2959:  0x000068B6,\n\t2960:  0x0000681E,\n\t2961:  0x00003BC4,\n\t2962:  0x00006ABE,\n\t2963:  0x00003863,\n\t2964:  0x000237D5,\n\t2965:  0x00024487,\n\t2966:  0x00006A33,\n\t2967:  0x00006A52,\n\t2968:  0x00006AC9,\n\t2969:  0x00006B05,\n\t2970:  0x00021912,\n\t2971:  0x00006511,\n\t2972:  0x00006898,\n\t2973:  0x00006A4C,\n\t2974:  0x00003BD7,\n\t2975:  0x00006A7A,\n\t2976:  0x00006B57,\n\t2977:  0x00023FC0,\n\t2978:  0x00023C9A,\n\t2979:  0x000093A0,\n\t2980:  0x000092F2,\n\t2981:  0x00028BEA,\n\t2982:  0x00028ACB,\n\t2983:  0x00009289,\n\t2984:  0x0002801E,\n\t2985:  0x000289DC,\n\t2986:  0x00009467,\n\t2987:  0x00006DA5,\n\t2988:  0x00006F0B,\n\t2989:  0x000249EC,\n\t2990:  0x00006D67,\n\t2991:  0x00023F7F,\n\t2992:  0x00003D8F,\n\t2993:  0x00006E04,\n\t2994:  0x0002403C,\n\t2995:  0x00005A3D,\n\t2996:  0x00006E0A,\n\t2997:  0x00005847,\n\t2998:  0x00006D24,\n\t2999:  0x00007842,\n\t3000:  0x0000713B,\n\t3001:  0x0002431A,\n\t3002:  0x00024276,\n\t3003:  0x000070F1,\n\t3004:  0x00007250,\n\t3005:  0x00007287,\n\t3006:  0x00007294,\n\t3007:  0x0002478F,\n\t3008:  0x00024725,\n\t3009:  0x00005179,\n\t3010:  0x00024AA4,\n\t3011:  0x000205EB,\n\t3012:  0x0000747A,\n\t3013:  0x00023EF8,\n\t3014:  0x0002365F,\n\t3015:  0x00024A4A,\n\t3016:  0x00024917,\n\t3017:  0x00025FE1,\n\t3018:  0x00003F06,\n\t3019:  0x00003EB1,\n\t3020:  0x00024ADF,\n\t3021:  0x00028C23,\n\t3022:  0x00023F35,\n\t3023:  0x000060A7,\n\t3024:  0x00003EF3,\n\t3025:  0x000074CC,\n\t3026:  0x0000743C,\n\t3027:  0x00009387,\n\t3028:  0x00007437,\n\t3029:  0x0000449F,\n\t3030:  0x00026DEA,\n\t3031:  0x00004551,\n\t3032:  0x00007583,\n\t3033:  0x00003F63,\n\t3034:  0x00024CD9,\n\t3035:  0x00024D06,\n\t3036:  0x00003F58,\n\t3037:  0x00007555,\n\t3038:  0x00007673,\n\t3039:  0x0002A5C6,\n\t3040:  0x00003B19,\n\t3041:  0x00007468,\n\t3042:  0x00028ACC,\n\t3043:  0x000249AB,\n\t3044:  0x0002498E,\n\t3045:  0x00003AFB,\n\t3046:  0x00003DCD,\n\t3047:  0x00024A4E,\n\t3048:  0x00003EFF,\n\t3049:  0x000249C5,\n\t3050:  0x000248F3,\n\t3051:  0x000091FA,\n\t3052:  0x00005732,\n\t3053:  0x00009342,\n\t3054:  0x00028AE3,\n\t3055:  0x00021864,\n\t3056:  0x000050DF,\n\t3057:  0x00025221,\n\t3058:  0x000251E7,\n\t3059:  0x00007778,\n\t3060:  0x00023232,\n\t3061:  0x0000770E,\n\t3062:  0x0000770F,\n\t3063:  0x0000777B,\n\t3064:  0x00024697,\n\t3065:  0x00023781,\n\t3066:  0x00003A5E,\n\t3067:  0x000248F0,\n\t3068:  0x00007438,\n\t3069:  0x0000749B,\n\t3070:  0x00003EBF,\n\t3071:  0x00024ABA,\n\t3072:  0x00024AC7,\n\t3073:  0x000040C8,\n\t3074:  0x00024A96,\n\t3075:  0x000261AE,\n\t3076:  0x00009307,\n\t3077:  0x00025581,\n\t3078:  0x0000781E,\n\t3079:  0x0000788D,\n\t3080:  0x00007888,\n\t3081:  0x000078D2,\n\t3082:  0x000073D0,\n\t3083:  0x00007959,\n\t3084:  0x00027741,\n\t3085:  0x000256E3,\n\t3086:  0x0000410E,\n\t3087:  0x0000799B,\n\t3088:  0x00008496,\n\t3089:  0x000079A5,\n\t3090:  0x00006A2D,\n\t3091:  0x00023EFA,\n\t3092:  0x00007A3A,\n\t3093:  0x000079F4,\n\t3094:  0x0000416E,\n\t3095:  0x000216E6,\n\t3096:  0x00004132,\n\t3097:  0x00009235,\n\t3098:  0x000079F1,\n\t3099:  0x00020D4C,\n\t3100:  0x0002498C,\n\t3101:  0x00020299,\n\t3102:  0x00023DBA,\n\t3103:  0x0002176E,\n\t3104:  0x00003597,\n\t3105:  0x0000556B,\n\t3106:  0x00003570,\n\t3107:  0x000036AA,\n\t3108:  0x000201D4,\n\t3109:  0x00020C0D,\n\t3110:  0x00007AE2,\n\t3111:  0x00005A59,\n\t3112:  0x000226F5,\n\t3113:  0x00025AAF,\n\t3114:  0x00025A9C,\n\t3115:  0x00005A0D,\n\t3116:  0x0002025B,\n\t3117:  0x000078F0,\n\t3118:  0x00005A2A,\n\t3119:  0x00025BC6,\n\t3120:  0x00007AFE,\n\t3121:  0x000041F9,\n\t3122:  0x00007C5D,\n\t3123:  0x00007C6D,\n\t3124:  0x00004211,\n\t3125:  0x00025BB3,\n\t3126:  0x00025EBC,\n\t3127:  0x00025EA6,\n\t3128:  0x00007CCD,\n\t3129:  0x000249F9,\n\t3130:  0x000217B0,\n\t3131:  0x00007C8E,\n\t3132:  0x00007C7C,\n\t3133:  0x00007CAE,\n\t3134:  0x00006AB2,\n\t3135:  0x00007DDC,\n\t3136:  0x00007E07,\n\t3137:  0x00007DD3,\n\t3138:  0x00007F4E,\n\t3139:  0x00026261,\n\t3140:  0x0002615C,\n\t3141:  0x00027B48,\n\t3142:  0x00007D97,\n\t3143:  0x00025E82,\n\t3144:  0x0000426A,\n\t3145:  0x00026B75,\n\t3146:  0x00020916,\n\t3147:  0x000067D6,\n\t3148:  0x0002004E,\n\t3149:  0x000235CF,\n\t3150:  0x000057C4,\n\t3151:  0x00026412,\n\t3152:  0x000263F8,\n\t3153:  0x00024962,\n\t3154:  0x00007FDD,\n\t3155:  0x00007B27,\n\t3156:  0x0002082C,\n\t3157:  0x00025AE9,\n\t3158:  0x00025D43,\n\t3159:  0x00007B0C,\n\t3160:  0x00025E0E,\n\t3161:  0x000099E6,\n\t3162:  0x00008645,\n\t3163:  0x00009A63,\n\t3164:  0x00006A1C,\n\t3165:  0x0002343F,\n\t3166:  0x000039E2,\n\t3167:  0x000249F7,\n\t3168:  0x000265AD,\n\t3169:  0x00009A1F,\n\t3170:  0x000265A0,\n\t3171:  0x00008480,\n\t3172:  0x00027127,\n\t3173:  0x00026CD1,\n\t3174:  0x000044EA,\n\t3175:  0x00008137,\n\t3176:  0x00004402,\n\t3177:  0x000080C6,\n\t3178:  0x00008109,\n\t3179:  0x00008142,\n\t3180:  0x000267B4,\n\t3181:  0x000098C3,\n\t3182:  0x00026A42,\n\t3183:  0x00008262,\n\t3184:  0x00008265,\n\t3185:  0x00026A51,\n\t3186:  0x00008453,\n\t3187:  0x00026DA7,\n\t3188:  0x00008610,\n\t3189:  0x0002721B,\n\t3190:  0x00005A86,\n\t3191:  0x0000417F,\n\t3192:  0x00021840,\n\t3193:  0x00005B2B,\n\t3194:  0x000218A1,\n\t3195:  0x00005AE4,\n\t3196:  0x000218D8,\n\t3197:  0x000086A0,\n\t3198:  0x0002F9BC,\n\t3199:  0x00023D8F,\n\t3200:  0x0000882D,\n\t3201:  0x00027422,\n\t3202:  0x00005A02,\n\t3203:  0x0000886E,\n\t3204:  0x00004F45,\n\t3205:  0x00008887,\n\t3206:  0x000088BF,\n\t3207:  0x000088E6,\n\t3208:  0x00008965,\n\t3209:  0x0000894D,\n\t3210:  0x00025683,\n\t3211:  0x00008954,\n\t3212:  0x00027785,\n\t3213:  0x00027784,\n\t3214:  0x00028BF5,\n\t3215:  0x00028BD9,\n\t3216:  0x00028B9C,\n\t3217:  0x000289F9,\n\t3218:  0x00003EAD,\n\t3219:  0x000084A3,\n\t3220:  0x000046F5,\n\t3221:  0x000046CF,\n\t3222:  0x000037F2,\n\t3223:  0x00008A3D,\n\t3224:  0x00008A1C,\n\t3225:  0x00029448,\n\t3226:  0x00005F4D,\n\t3227:  0x0000922B,\n\t3228:  0x00024284,\n\t3229:  0x000065D4,\n\t3230:  0x00007129,\n\t3231:  0x000070C4,\n\t3232:  0x00021845,\n\t3233:  0x00009D6D,\n\t3234:  0x00008C9F,\n\t3235:  0x00008CE9,\n\t3236:  0x00027DDC,\n\t3237:  0x0000599A,\n\t3238:  0x000077C3,\n\t3239:  0x000059F0,\n\t3240:  0x0000436E,\n\t3241:  0x000036D4,\n\t3242:  0x00008E2A,\n\t3243:  0x00008EA7,\n\t3244:  0x00024C09,\n\t3245:  0x00008F30,\n\t3246:  0x00008F4A,\n\t3247:  0x000042F4,\n\t3248:  0x00006C58,\n\t3249:  0x00006FBB,\n\t3250:  0x00022321,\n\t3251:  0x0000489B,\n\t3252:  0x00006F79,\n\t3253:  0x00006E8B,\n\t3254:  0x000217DA,\n\t3255:  0x00009BE9,\n\t3256:  0x000036B5,\n\t3257:  0x0002492F,\n\t3258:  0x000090BB,\n\t3259:  0x00009097,\n\t3260:  0x00005571,\n\t3261:  0x00004906,\n\t3262:  0x000091BB,\n\t3263:  0x00009404,\n\t3264:  0x00028A4B,\n\t3265:  0x00004062,\n\t3266:  0x00028AFC,\n\t3267:  0x00009427,\n\t3268:  0x00028C1D,\n\t3269:  0x00028C3B,\n\t3270:  0x000084E5,\n\t3271:  0x00008A2B,\n\t3272:  0x00009599,\n\t3273:  0x000095A7,\n\t3274:  0x00009597,\n\t3275:  0x00009596,\n\t3276:  0x00028D34,\n\t3277:  0x00007445,\n\t3278:  0x00003EC2,\n\t3279:  0x000248FF,\n\t3280:  0x00024A42,\n\t3281:  0x000243EA,\n\t3282:  0x00003EE7,\n\t3283:  0x00023225,\n\t3284:  0x0000968F,\n\t3285:  0x00028EE7,\n\t3286:  0x00028E66,\n\t3287:  0x00028E65,\n\t3288:  0x00003ECC,\n\t3289:  0x000249ED,\n\t3290:  0x00024A78,\n\t3291:  0x00023FEE,\n\t3292:  0x00007412,\n\t3293:  0x0000746B,\n\t3294:  0x00003EFC,\n\t3295:  0x00009741,\n\t3296:  0x000290B0,\n\t3297:  0x00006847,\n\t3298:  0x00004A1D,\n\t3299:  0x00029093,\n\t3300:  0x000257DF,\n\t3301:  0x0000975D,\n\t3302:  0x00009368,\n\t3303:  0x00028989,\n\t3304:  0x00028C26,\n\t3305:  0x00028B2F,\n\t3306:  0x000263BE,\n\t3307:  0x000092BA,\n\t3308:  0x00005B11,\n\t3309:  0x00008B69,\n\t3310:  0x0000493C,\n\t3311:  0x000073F9,\n\t3312:  0x0002421B,\n\t3313:  0x0000979B,\n\t3314:  0x00009771,\n\t3315:  0x00009938,\n\t3316:  0x00020F26,\n\t3317:  0x00005DC1,\n\t3318:  0x00028BC5,\n\t3319:  0x00024AB2,\n\t3320:  0x0000981F,\n\t3321:  0x000294DA,\n\t3322:  0x000092F6,\n\t3323:  0x000295D7,\n\t3324:  0x000091E5,\n\t3325:  0x000044C0,\n\t3326:  0x00028B50,\n\t3327:  0x00024A67,\n\t3328:  0x00028B64,\n\t3329:  0x000098DC,\n\t3330:  0x00028A45,\n\t3331:  0x00003F00,\n\t3332:  0x0000922A,\n\t3333:  0x00004925,\n\t3334:  0x00008414,\n\t3335:  0x0000993B,\n\t3336:  0x0000994D,\n\t3337:  0x00027B06,\n\t3338:  0x00003DFD,\n\t3339:  0x0000999B,\n\t3340:  0x00004B6F,\n\t3341:  0x000099AA,\n\t3342:  0x00009A5C,\n\t3343:  0x00028B65,\n\t3344:  0x000258C8,\n\t3345:  0x00006A8F,\n\t3346:  0x00009A21,\n\t3347:  0x00005AFE,\n\t3348:  0x00009A2F,\n\t3349:  0x000298F1,\n\t3350:  0x00004B90,\n\t3351:  0x00029948,\n\t3352:  0x000099BC,\n\t3353:  0x00004BBD,\n\t3354:  0x00004B97,\n\t3355:  0x0000937D,\n\t3356:  0x00005872,\n\t3357:  0x00021302,\n\t3358:  0x00005822,\n\t3359:  0x000249B8,\n\t3360:  0x000214E8,\n\t3361:  0x00007844,\n\t3362:  0x0002271F,\n\t3363:  0x00023DB8,\n\t3364:  0x000068C5,\n\t3365:  0x00003D7D,\n\t3366:  0x00009458,\n\t3367:  0x00003927,\n\t3368:  0x00006150,\n\t3369:  0x00022781,\n\t3370:  0x0002296B,\n\t3371:  0x00006107,\n\t3372:  0x00009C4F,\n\t3373:  0x00009C53,\n\t3374:  0x00009C7B,\n\t3375:  0x00009C35,\n\t3376:  0x00009C10,\n\t3377:  0x00009B7F,\n\t3378:  0x00009BCF,\n\t3379:  0x00029E2D,\n\t3380:  0x00009B9F,\n\t3381:  0x0002A1F5,\n\t3382:  0x0002A0FE,\n\t3383:  0x00009D21,\n\t3384:  0x00004CAE,\n\t3385:  0x00024104,\n\t3386:  0x00009E18,\n\t3387:  0x00004CB0,\n\t3388:  0x00009D0C,\n\t3389:  0x0002A1B4,\n\t3390:  0x0002A0ED,\n\t3391:  0x0002A0F3,\n\t3392:  0x0002992F,\n\t3393:  0x00009DA5,\n\t3394:  0x000084BD,\n\t3395:  0x00026E12,\n\t3396:  0x00026FDF,\n\t3397:  0x00026B82,\n\t3398:  0x000085FC,\n\t3399:  0x00004533,\n\t3400:  0x00026DA4,\n\t3401:  0x00026E84,\n\t3402:  0x00026DF0,\n\t3403:  0x00008420,\n\t3404:  0x000085EE,\n\t3405:  0x00026E00,\n\t3406:  0x000237D7,\n\t3407:  0x00026064,\n\t3408:  0x000079E2,\n\t3409:  0x0002359C,\n\t3410:  0x00023640,\n\t3411:  0x0000492D,\n\t3412:  0x000249DE,\n\t3413:  0x00003D62,\n\t3414:  0x000093DB,\n\t3415:  0x000092BE,\n\t3416:  0x00009348,\n\t3417:  0x000202BF,\n\t3418:  0x000078B9,\n\t3419:  0x00009277,\n\t3420:  0x0000944D,\n\t3421:  0x00004FE4,\n\t3422:  0x00003440,\n\t3423:  0x00009064,\n\t3424:  0x0002555D,\n\t3425:  0x0000783D,\n\t3426:  0x00007854,\n\t3427:  0x000078B6,\n\t3428:  0x0000784B,\n\t3429:  0x00021757,\n\t3430:  0x000231C9,\n\t3431:  0x00024941,\n\t3432:  0x0000369A,\n\t3433:  0x00004F72,\n\t3434:  0x00006FDA,\n\t3435:  0x00006FD9,\n\t3436:  0x0000701E,\n\t3437:  0x0000701E,\n\t3438:  0x00005414,\n\t3439:  0x000241B5,\n\t3440:  0x000057BB,\n\t3441:  0x000058F3,\n\t3442:  0x0000578A,\n\t3443:  0x00009D16,\n\t3444:  0x000057D7,\n\t3445:  0x00007134,\n\t3446:  0x000034AF,\n\t3447:  0x000241AC,\n\t3448:  0x000071EB,\n\t3449:  0x00026C40,\n\t3450:  0x00024F97,\n\t3451:  0x00005B28,\n\t3452:  0x000217B5,\n\t3453:  0x00028A49,\n\t3454:  0x0000610C,\n\t3455:  0x00005ACE,\n\t3456:  0x00005A0B,\n\t3457:  0x000042BC,\n\t3458:  0x00024488,\n\t3459:  0x0000372C,\n\t3460:  0x00004B7B,\n\t3461:  0x000289FC,\n\t3462:  0x000093BB,\n\t3463:  0x000093B8,\n\t3464:  0x000218D6,\n\t3465:  0x00020F1D,\n\t3466:  0x00008472,\n\t3467:  0x00026CC0,\n\t3468:  0x00021413,\n\t3469:  0x000242FA,\n\t3470:  0x00022C26,\n\t3471:  0x000243C1,\n\t3472:  0x00005994,\n\t3473:  0x00023DB7,\n\t3474:  0x00026741,\n\t3475:  0x00007DA8,\n\t3476:  0x0002615B,\n\t3477:  0x000260A4,\n\t3478:  0x000249B9,\n\t3479:  0x0002498B,\n\t3480:  0x000289FA,\n\t3481:  0x000092E5,\n\t3482:  0x000073E2,\n\t3483:  0x00003EE9,\n\t3484:  0x000074B4,\n\t3485:  0x00028B63,\n\t3486:  0x0002189F,\n\t3487:  0x00003EE1,\n\t3488:  0x00024AB3,\n\t3489:  0x00006AD8,\n\t3490:  0x000073F3,\n\t3491:  0x000073FB,\n\t3492:  0x00003ED6,\n\t3493:  0x00024A3E,\n\t3494:  0x00024A94,\n\t3495:  0x000217D9,\n\t3496:  0x00024A66,\n\t3497:  0x000203A7,\n\t3498:  0x00021424,\n\t3499:  0x000249E5,\n\t3500:  0x00007448,\n\t3501:  0x00024916,\n\t3502:  0x000070A5,\n\t3503:  0x00024976,\n\t3504:  0x00009284,\n\t3505:  0x000073E6,\n\t3506:  0x0000935F,\n\t3507:  0x000204FE,\n\t3508:  0x00009331,\n\t3509:  0x00028ACE,\n\t3510:  0x00028A16,\n\t3511:  0x00009386,\n\t3512:  0x00028BE7,\n\t3513:  0x000255D5,\n\t3514:  0x00004935,\n\t3515:  0x00028A82,\n\t3516:  0x0000716B,\n\t3517:  0x00024943,\n\t3518:  0x00020CFF,\n\t3519:  0x000056A4,\n\t3520:  0x0002061A,\n\t3521:  0x00020BEB,\n\t3522:  0x00020CB8,\n\t3523:  0x00005502,\n\t3524:  0x000079C4,\n\t3525:  0x000217FA,\n\t3526:  0x00007DFE,\n\t3527:  0x000216C2,\n\t3528:  0x00024A50,\n\t3529:  0x00021852,\n\t3530:  0x0000452E,\n\t3531:  0x00009401,\n\t3532:  0x0000370A,\n\t3533:  0x00028AC0,\n\t3534:  0x000249AD,\n\t3535:  0x000059B0,\n\t3536:  0x000218BF,\n\t3537:  0x00021883,\n\t3538:  0x00027484,\n\t3539:  0x00005AA1,\n\t3540:  0x000036E2,\n\t3541:  0x00023D5B,\n\t3542:  0x000036B0,\n\t3543:  0x0000925F,\n\t3544:  0x00005A79,\n\t3545:  0x00028A81,\n\t3546:  0x00021862,\n\t3547:  0x00009374,\n\t3548:  0x00003CCD,\n\t3549:  0x00020AB4,\n\t3550:  0x00004A96,\n\t3551:  0x0000398A,\n\t3552:  0x000050F4,\n\t3553:  0x00003D69,\n\t3554:  0x00003D4C,\n\t3555:  0x0002139C,\n\t3556:  0x00007175,\n\t3557:  0x000042FB,\n\t3558:  0x00028218,\n\t3559:  0x00006E0F,\n\t3560:  0x000290E4,\n\t3561:  0x000044EB,\n\t3562:  0x00006D57,\n\t3563:  0x00027E4F,\n\t3564:  0x00007067,\n\t3565:  0x00006CAF,\n\t3566:  0x00003CD6,\n\t3567:  0x00023FED,\n\t3568:  0x00023E2D,\n\t3569:  0x00006E02,\n\t3570:  0x00006F0C,\n\t3571:  0x00003D6F,\n\t3572:  0x000203F5,\n\t3573:  0x00007551,\n\t3574:  0x000036BC,\n\t3575:  0x000034C8,\n\t3576:  0x00004680,\n\t3577:  0x00003EDA,\n\t3578:  0x00004871,\n\t3579:  0x000059C4,\n\t3580:  0x0000926E,\n\t3581:  0x0000493E,\n\t3582:  0x00008F41,\n\t3583:  0x00028C1C,\n\t3584:  0x00026BC0,\n\t3585:  0x00005812,\n\t3586:  0x000057C8,\n\t3587:  0x000036D6,\n\t3588:  0x00021452,\n\t3589:  0x000070FE,\n\t3590:  0x00024362,\n\t3591:  0x00024A71,\n\t3592:  0x00022FE3,\n\t3593:  0x000212B0,\n\t3594:  0x000223BD,\n\t3595:  0x000068B9,\n\t3596:  0x00006967,\n\t3597:  0x00021398,\n\t3598:  0x000234E5,\n\t3599:  0x00027BF4,\n\t3600:  0x000236DF,\n\t3601:  0x00028A83,\n\t3602:  0x000237D6,\n\t3603:  0x000233FA,\n\t3604:  0x00024C9F,\n\t3605:  0x00006A1A,\n\t3606:  0x000236AD,\n\t3607:  0x00026CB7,\n\t3608:  0x0000843E,\n\t3609:  0x000044DF,\n\t3610:  0x000044CE,\n\t3611:  0x00026D26,\n\t3612:  0x00026D51,\n\t3613:  0x00026C82,\n\t3614:  0x00026FDE,\n\t3615:  0x00006F17,\n\t3616:  0x00027109,\n\t3617:  0x0000833D,\n\t3618:  0x0002173A,\n\t3619:  0x000083ED,\n\t3620:  0x00026C80,\n\t3621:  0x00027053,\n\t3622:  0x000217DB,\n\t3623:  0x00005989,\n\t3624:  0x00005A82,\n\t3625:  0x000217B3,\n\t3626:  0x00005A61,\n\t3627:  0x00005A71,\n\t3628:  0x00021905,\n\t3629:  0x000241FC,\n\t3630:  0x0000372D,\n\t3631:  0x000059EF,\n\t3632:  0x0002173C,\n\t3633:  0x000036C7,\n\t3634:  0x0000718E,\n\t3635:  0x00009390,\n\t3636:  0x0000669A,\n\t3637:  0x000242A5,\n\t3638:  0x00005A6E,\n\t3639:  0x00005A2B,\n\t3640:  0x00024293,\n\t3641:  0x00006A2B,\n\t3642:  0x00023EF9,\n\t3643:  0x00027736,\n\t3644:  0x0002445B,\n\t3645:  0x000242CA,\n\t3646:  0x0000711D,\n\t3647:  0x00024259,\n\t3648:  0x000289E1,\n\t3649:  0x00004FB0,\n\t3650:  0x00026D28,\n\t3651:  0x00005CC2,\n\t3652:  0x000244CE,\n\t3653:  0x00027E4D,\n\t3654:  0x000243BD,\n\t3655:  0x00006A0C,\n\t3656:  0x00024256,\n\t3657:  0x00021304,\n\t3658:  0x000070A6,\n\t3659:  0x00007133,\n\t3660:  0x000243E9,\n\t3661:  0x00003DA5,\n\t3662:  0x00006CDF,\n\t3663:  0x0002F825,\n\t3664:  0x00024A4F,\n\t3665:  0x00007E65,\n\t3666:  0x000059EB,\n\t3667:  0x00005D2F,\n\t3668:  0x00003DF3,\n\t3669:  0x00005F5C,\n\t3670:  0x00024A5D,\n\t3671:  0x000217DF,\n\t3672:  0x00007DA4,\n\t3673:  0x00008426,\n\t3674:  0x00005485,\n\t3675:  0x00023AFA,\n\t3676:  0x00023300,\n\t3677:  0x00020214,\n\t3678:  0x0000577E,\n\t3679:  0x000208D5,\n\t3680:  0x00020619,\n\t3681:  0x00003FE5,\n\t3682:  0x00021F9E,\n\t3683:  0x0002A2B6,\n\t3684:  0x00007003,\n\t3685:  0x0002915B,\n\t3686:  0x00005D70,\n\t3687:  0x0000738F,\n\t3688:  0x00007CD3,\n\t3689:  0x00028A59,\n\t3690:  0x00029420,\n\t3691:  0x00004FC8,\n\t3692:  0x00007FE7,\n\t3693:  0x000072CD,\n\t3694:  0x00007310,\n\t3695:  0x00027AF4,\n\t3696:  0x00007338,\n\t3697:  0x00007339,\n\t3698:  0x000256F6,\n\t3699:  0x00007341,\n\t3700:  0x00007348,\n\t3701:  0x00003EA9,\n\t3702:  0x00027B18,\n\t3703:  0x0000906C,\n\t3704:  0x000071F5,\n\t3705:  0x000248F2,\n\t3706:  0x000073E1,\n\t3707:  0x000081F6,\n\t3708:  0x00003ECA,\n\t3709:  0x0000770C,\n\t3710:  0x00003ED1,\n\t3711:  0x00006CA2,\n\t3712:  0x000056FD,\n\t3713:  0x00007419,\n\t3714:  0x0000741E,\n\t3715:  0x0000741F,\n\t3716:  0x00003EE2,\n\t3717:  0x00003EF0,\n\t3718:  0x00003EF4,\n\t3719:  0x00003EFA,\n\t3720:  0x000074D3,\n\t3721:  0x00003F0E,\n\t3722:  0x00003F53,\n\t3723:  0x00007542,\n\t3724:  0x0000756D,\n\t3725:  0x00007572,\n\t3726:  0x0000758D,\n\t3727:  0x00003F7C,\n\t3728:  0x000075C8,\n\t3729:  0x000075DC,\n\t3730:  0x00003FC0,\n\t3731:  0x0000764D,\n\t3732:  0x00003FD7,\n\t3733:  0x00007674,\n\t3734:  0x00003FDC,\n\t3735:  0x0000767A,\n\t3736:  0x00024F5C,\n\t3737:  0x00007188,\n\t3738:  0x00005623,\n\t3739:  0x00008980,\n\t3740:  0x00005869,\n\t3741:  0x0000401D,\n\t3742:  0x00007743,\n\t3743:  0x00004039,\n\t3744:  0x00006761,\n\t3745:  0x00004045,\n\t3746:  0x000035DB,\n\t3747:  0x00007798,\n\t3748:  0x0000406A,\n\t3749:  0x0000406F,\n\t3750:  0x00005C5E,\n\t3751:  0x000077BE,\n\t3752:  0x000077CB,\n\t3753:  0x000058F2,\n\t3754:  0x00007818,\n\t3755:  0x000070B9,\n\t3756:  0x0000781C,\n\t3757:  0x000040A8,\n\t3758:  0x00007839,\n\t3759:  0x00007847,\n\t3760:  0x00007851,\n\t3761:  0x00007866,\n\t3762:  0x00008448,\n\t3763:  0x00025535,\n\t3764:  0x00007933,\n\t3765:  0x00006803,\n\t3766:  0x00007932,\n\t3767:  0x00004103,\n\t3768:  0x00004109,\n\t3769:  0x00007991,\n\t3770:  0x00007999,\n\t3771:  0x00008FBB,\n\t3772:  0x00007A06,\n\t3773:  0x00008FBC,\n\t3774:  0x00004167,\n\t3775:  0x00007A91,\n\t3776:  0x000041B2,\n\t3777:  0x00007ABC,\n\t3778:  0x00008279,\n\t3779:  0x000041C4,\n\t3780:  0x00007ACF,\n\t3781:  0x00007ADB,\n\t3782:  0x000041CF,\n\t3783:  0x00004E21,\n\t3784:  0x00007B62,\n\t3785:  0x00007B6C,\n\t3786:  0x00007B7B,\n\t3787:  0x00007C12,\n\t3788:  0x00007C1B,\n\t3789:  0x00004260,\n\t3790:  0x0000427A,\n\t3791:  0x00007C7B,\n\t3792:  0x00007C9C,\n\t3793:  0x0000428C,\n\t3794:  0x00007CB8,\n\t3795:  0x00004294,\n\t3796:  0x00007CED,\n\t3797:  0x00008F93,\n\t3798:  0x000070C0,\n\t3799:  0x00020CCF,\n\t3800:  0x00007DCF,\n\t3801:  0x00007DD4,\n\t3802:  0x00007DD0,\n\t3803:  0x00007DFD,\n\t3804:  0x00007FAE,\n\t3805:  0x00007FB4,\n\t3806:  0x0000729F,\n\t3807:  0x00004397,\n\t3808:  0x00008020,\n\t3809:  0x00008025,\n\t3810:  0x00007B39,\n\t3811:  0x0000802E,\n\t3812:  0x00008031,\n\t3813:  0x00008054,\n\t3814:  0x00003DCC,\n\t3815:  0x000057B4,\n\t3816:  0x000070A0,\n\t3817:  0x000080B7,\n\t3818:  0x000080E9,\n\t3819:  0x000043ED,\n\t3820:  0x0000810C,\n\t3821:  0x0000732A,\n\t3822:  0x0000810E,\n\t3823:  0x00008112,\n\t3824:  0x00007560,\n\t3825:  0x00008114,\n\t3826:  0x00004401,\n\t3827:  0x00003B39,\n\t3828:  0x00008156,\n\t3829:  0x00008159,\n\t3830:  0x0000815A,\n\t3831:  0x00004413,\n\t3832:  0x0000583A,\n\t3833:  0x0000817C,\n\t3834:  0x00008184,\n\t3835:  0x00004425,\n\t3836:  0x00008193,\n\t3837:  0x0000442D,\n\t3838:  0x000081A5,\n\t3839:  0x000057EF,\n\t3840:  0x000081C1,\n\t3841:  0x000081E4,\n\t3842:  0x00008254,\n\t3843:  0x0000448F,\n\t3844:  0x000082A6,\n\t3845:  0x00008276,\n\t3846:  0x000082CA,\n\t3847:  0x000082D8,\n\t3848:  0x000082FF,\n\t3849:  0x000044B0,\n\t3850:  0x00008357,\n\t3851:  0x00009669,\n\t3852:  0x0000698A,\n\t3853:  0x00008405,\n\t3854:  0x000070F5,\n\t3855:  0x00008464,\n\t3856:  0x000060E3,\n\t3857:  0x00008488,\n\t3858:  0x00004504,\n\t3859:  0x000084BE,\n\t3860:  0x000084E1,\n\t3861:  0x000084F8,\n\t3862:  0x00008510,\n\t3863:  0x00008538,\n\t3864:  0x00008552,\n\t3865:  0x0000453B,\n\t3866:  0x0000856F,\n\t3867:  0x00008570,\n\t3868:  0x000085E0,\n\t3869:  0x00004577,\n\t3870:  0x00008672,\n\t3871:  0x00008692,\n\t3872:  0x000086B2,\n\t3873:  0x000086EF,\n\t3874:  0x00009645,\n\t3875:  0x0000878B,\n\t3876:  0x00004606,\n\t3877:  0x00004617,\n\t3878:  0x000088AE,\n\t3879:  0x000088FF,\n\t3880:  0x00008924,\n\t3881:  0x00008947,\n\t3882:  0x00008991,\n\t3883:  0x00027967,\n\t3884:  0x00008A29,\n\t3885:  0x00008A38,\n\t3886:  0x00008A94,\n\t3887:  0x00008AB4,\n\t3888:  0x00008C51,\n\t3889:  0x00008CD4,\n\t3890:  0x00008CF2,\n\t3891:  0x00008D1C,\n\t3892:  0x00004798,\n\t3893:  0x0000585F,\n\t3894:  0x00008DC3,\n\t3895:  0x000047ED,\n\t3896:  0x00004EEE,\n\t3897:  0x00008E3A,\n\t3898:  0x000055D8,\n\t3899:  0x00005754,\n\t3900:  0x00008E71,\n\t3901:  0x000055F5,\n\t3902:  0x00008EB0,\n\t3903:  0x00004837,\n\t3904:  0x00008ECE,\n\t3905:  0x00008EE2,\n\t3906:  0x00008EE4,\n\t3907:  0x00008EED,\n\t3908:  0x00008EF2,\n\t3909:  0x00008FB7,\n\t3910:  0x00008FC1,\n\t3911:  0x00008FCA,\n\t3912:  0x00008FCC,\n\t3913:  0x00009033,\n\t3914:  0x000099C4,\n\t3915:  0x000048AD,\n\t3916:  0x000098E0,\n\t3917:  0x00009213,\n\t3918:  0x0000491E,\n\t3919:  0x00009228,\n\t3920:  0x00009258,\n\t3921:  0x0000926B,\n\t3922:  0x000092B1,\n\t3923:  0x000092AE,\n\t3924:  0x000092BF,\n\t3925:  0x000092E3,\n\t3926:  0x000092EB,\n\t3927:  0x000092F3,\n\t3928:  0x000092F4,\n\t3929:  0x000092FD,\n\t3930:  0x00009343,\n\t3931:  0x00009384,\n\t3932:  0x000093AD,\n\t3933:  0x00004945,\n\t3934:  0x00004951,\n\t3935:  0x00009EBF,\n\t3936:  0x00009417,\n\t3937:  0x00005301,\n\t3938:  0x0000941D,\n\t3939:  0x0000942D,\n\t3940:  0x0000943E,\n\t3941:  0x0000496A,\n\t3942:  0x00009454,\n\t3943:  0x00009479,\n\t3944:  0x0000952D,\n\t3945:  0x000095A2,\n\t3946:  0x000049A7,\n\t3947:  0x000095F4,\n\t3948:  0x00009633,\n\t3949:  0x000049E5,\n\t3950:  0x000067A0,\n\t3951:  0x00004A24,\n\t3952:  0x00009740,\n\t3953:  0x00004A35,\n\t3954:  0x000097B2,\n\t3955:  0x000097C2,\n\t3956:  0x00005654,\n\t3957:  0x00004AE4,\n\t3958:  0x000060E8,\n\t3959:  0x000098B9,\n\t3960:  0x00004B19,\n\t3961:  0x000098F1,\n\t3962:  0x00005844,\n\t3963:  0x0000990E,\n\t3964:  0x00009919,\n\t3965:  0x000051B4,\n\t3966:  0x0000991C,\n\t3967:  0x00009937,\n\t3968:  0x00009942,\n\t3969:  0x0000995D,\n\t3970:  0x00009962,\n\t3971:  0x00004B70,\n\t3972:  0x000099C5,\n\t3973:  0x00004B9D,\n\t3974:  0x00009A3C,\n\t3975:  0x00009B0F,\n\t3976:  0x00007A83,\n\t3977:  0x00009B69,\n\t3978:  0x00009B81,\n\t3979:  0x00009BDD,\n\t3980:  0x00009BF1,\n\t3981:  0x00009BF4,\n\t3982:  0x00004C6D,\n\t3983:  0x00009C20,\n\t3984:  0x0000376F,\n\t3985:  0x00021BC2,\n\t3986:  0x00009D49,\n\t3987:  0x00009C3A,\n\t3988:  0x00009EFE,\n\t3989:  0x00005650,\n\t3990:  0x00009D93,\n\t3991:  0x00009DBD,\n\t3992:  0x00009DC0,\n\t3993:  0x00009DFC,\n\t3994:  0x000094F6,\n\t3995:  0x00008FB6,\n\t3996:  0x00009E7B,\n\t3997:  0x00009EAC,\n\t3998:  0x00009EB1,\n\t3999:  0x00009EBD,\n\t4000:  0x00009EC6,\n\t4001:  0x000094DC,\n\t4002:  0x00009EE2,\n\t4003:  0x00009EF1,\n\t4004:  0x00009EF8,\n\t4005:  0x00007AC8,\n\t4006:  0x00009F44,\n\t4007:  0x00020094,\n\t4008:  0x000202B7,\n\t4009:  0x000203A0,\n\t4010:  0x0000691A,\n\t4011:  0x000094C3,\n\t4012:  0x000059AC,\n\t4013:  0x000204D7,\n\t4014:  0x00005840,\n\t4015:  0x000094C1,\n\t4016:  0x000037B9,\n\t4017:  0x000205D5,\n\t4018:  0x00020615,\n\t4019:  0x00020676,\n\t4020:  0x000216BA,\n\t4021:  0x00005757,\n\t4022:  0x00007173,\n\t4023:  0x00020AC2,\n\t4024:  0x00020ACD,\n\t4025:  0x00020BBF,\n\t4026:  0x0000546A,\n\t4027:  0x0002F83B,\n\t4028:  0x00020BCB,\n\t4029:  0x0000549E,\n\t4030:  0x00020BFB,\n\t4031:  0x00020C3B,\n\t4032:  0x00020C53,\n\t4033:  0x00020C65,\n\t4034:  0x00020C7C,\n\t4035:  0x000060E7,\n\t4036:  0x00020C8D,\n\t4037:  0x0000567A,\n\t4038:  0x00020CB5,\n\t4039:  0x00020CDD,\n\t4040:  0x00020CED,\n\t4041:  0x00020D6F,\n\t4042:  0x00020DB2,\n\t4043:  0x00020DC8,\n\t4044:  0x00006955,\n\t4045:  0x00009C2F,\n\t4046:  0x000087A5,\n\t4047:  0x00020E04,\n\t4048:  0x00020E0E,\n\t4049:  0x00020ED7,\n\t4050:  0x00020F90,\n\t4051:  0x00020F2D,\n\t4052:  0x00020E73,\n\t4053:  0x00005C20,\n\t4054:  0x00020FBC,\n\t4055:  0x00005E0B,\n\t4056:  0x0002105C,\n\t4057:  0x0002104F,\n\t4058:  0x00021076,\n\t4059:  0x0000671E,\n\t4060:  0x0002107B,\n\t4061:  0x00021088,\n\t4062:  0x00021096,\n\t4063:  0x00003647,\n\t4064:  0x000210BF,\n\t4065:  0x000210D3,\n\t4066:  0x0002112F,\n\t4067:  0x0002113B,\n\t4068:  0x00005364,\n\t4069:  0x000084AD,\n\t4070:  0x000212E3,\n\t4071:  0x00021375,\n\t4072:  0x00021336,\n\t4073:  0x00008B81,\n\t4074:  0x00021577,\n\t4075:  0x00021619,\n\t4076:  0x000217C3,\n\t4077:  0x000217C7,\n\t4078:  0x00004E78,\n\t4079:  0x000070BB,\n\t4080:  0x0002182D,\n\t4081:  0x0002196A,\n\t4082:  0x00021A2D,\n\t4083:  0x00021A45,\n\t4084:  0x00021C2A,\n\t4085:  0x00021C70,\n\t4086:  0x00021CAC,\n\t4087:  0x00021EC8,\n\t4088:  0x000062C3,\n\t4089:  0x00021ED5,\n\t4090:  0x00021F15,\n\t4091:  0x00007198,\n\t4092:  0x00006855,\n\t4093:  0x00022045,\n\t4094:  0x000069E9,\n\t4095:  0x000036C8,\n\t4096:  0x0002227C,\n\t4097:  0x000223D7,\n\t4098:  0x000223FA,\n\t4099:  0x0002272A,\n\t4100:  0x00022871,\n\t4101:  0x0002294F,\n\t4102:  0x000082FD,\n\t4103:  0x00022967,\n\t4104:  0x00022993,\n\t4105:  0x00022AD5,\n\t4106:  0x000089A5,\n\t4107:  0x00022AE8,\n\t4108:  0x00008FA0,\n\t4109:  0x00022B0E,\n\t4110:  0x000097B8,\n\t4111:  0x00022B3F,\n\t4112:  0x00009847,\n\t4113:  0x00009ABD,\n\t4114:  0x00022C4C,\n\t4116:  0x00022C88,\n\t4117:  0x00022CB7,\n\t4118:  0x00025BE8,\n\t4119:  0x00022D08,\n\t4120:  0x00022D12,\n\t4121:  0x00022DB7,\n\t4122:  0x00022D95,\n\t4123:  0x00022E42,\n\t4124:  0x00022F74,\n\t4125:  0x00022FCC,\n\t4126:  0x00023033,\n\t4127:  0x00023066,\n\t4128:  0x0002331F,\n\t4129:  0x000233DE,\n\t4130:  0x00005FB1,\n\t4131:  0x00006648,\n\t4132:  0x000066BF,\n\t4133:  0x00027A79,\n\t4134:  0x00023567,\n\t4135:  0x000235F3,\n\t4136:  0x00007201,\n\t4137:  0x000249BA,\n\t4138:  0x000077D7,\n\t4139:  0x0002361A,\n\t4140:  0x00023716,\n\t4141:  0x00007E87,\n\t4142:  0x00020346,\n\t4143:  0x000058B5,\n\t4144:  0x0000670E,\n\t4145:  0x00006918,\n\t4146:  0x00023AA7,\n\t4147:  0x00027657,\n\t4148:  0x00025FE2,\n\t4149:  0x00023E11,\n\t4150:  0x00023EB9,\n\t4151:  0x000275FE,\n\t4152:  0x0002209A,\n\t4153:  0x000048D0,\n\t4154:  0x00004AB8,\n\t4155:  0x00024119,\n\t4156:  0x00028A9A,\n\t4157:  0x000242EE,\n\t4158:  0x0002430D,\n\t4159:  0x0002403B,\n\t4160:  0x00024334,\n\t4161:  0x00024396,\n\t4162:  0x00024A45,\n\t4163:  0x000205CA,\n\t4164:  0x000051D2,\n\t4165:  0x00020611,\n\t4166:  0x0000599F,\n\t4167:  0x00021EA8,\n\t4168:  0x00003BBE,\n\t4169:  0x00023CFF,\n\t4170:  0x00024404,\n\t4171:  0x000244D6,\n\t4172:  0x00005788,\n\t4173:  0x00024674,\n\t4174:  0x0000399B,\n\t4175:  0x0002472F,\n\t4176:  0x000285E8,\n\t4177:  0x000299C9,\n\t4178:  0x00003762,\n\t4179:  0x000221C3,\n\t4180:  0x00008B5E,\n\t4181:  0x00028B4E,\n\t4182:  0x000099D6,\n\t4183:  0x00024812,\n\t4184:  0x000248FB,\n\t4185:  0x00024A15,\n\t4186:  0x00007209,\n\t4187:  0x00024AC0,\n\t4188:  0x00020C78,\n\t4189:  0x00005965,\n\t4190:  0x00024EA5,\n\t4191:  0x00024F86,\n\t4192:  0x00020779,\n\t4193:  0x00008EDA,\n\t4194:  0x0002502C,\n\t4195:  0x0000528F,\n\t4196:  0x0000573F,\n\t4197:  0x00007171,\n\t4198:  0x00025299,\n\t4199:  0x00025419,\n\t4200:  0x00023F4A,\n\t4201:  0x00024AA7,\n\t4202:  0x000055BC,\n\t4203:  0x00025446,\n\t4204:  0x0002546E,\n\t4205:  0x00026B52,\n\t4206:  0x000091D4,\n\t4207:  0x00003473,\n\t4208:  0x0002553F,\n\t4209:  0x00027632,\n\t4210:  0x0002555E,\n\t4211:  0x00004718,\n\t4212:  0x00025562,\n\t4213:  0x00025566,\n\t4214:  0x000257C7,\n\t4215:  0x0002493F,\n\t4216:  0x0002585D,\n\t4217:  0x00005066,\n\t4218:  0x000034FB,\n\t4219:  0x000233CC,\n\t4220:  0x000060DE,\n\t4221:  0x00025903,\n\t4222:  0x0000477C,\n\t4223:  0x00028948,\n\t4224:  0x00025AAE,\n\t4225:  0x00025B89,\n\t4226:  0x00025C06,\n\t4227:  0x00021D90,\n\t4228:  0x000057A1,\n\t4229:  0x00007151,\n\t4230:  0x00006FB6,\n\t4231:  0x00026102,\n\t4232:  0x00027C12,\n\t4233:  0x00009056,\n\t4234:  0x000261B2,\n\t4235:  0x00024F9A,\n\t4236:  0x00008B62,\n\t4237:  0x00026402,\n\t4238:  0x0002644A,\n\t4239:  0x00005D5B,\n\t4240:  0x00026BF7,\n\t4241:  0x00008F36,\n\t4242:  0x00026484,\n\t4243:  0x0002191C,\n\t4244:  0x00008AEA,\n\t4245:  0x000249F6,\n\t4246:  0x00026488,\n\t4247:  0x00023FEF,\n\t4248:  0x00026512,\n\t4249:  0x00004BC0,\n\t4250:  0x000265BF,\n\t4251:  0x000266B5,\n\t4252:  0x0002271B,\n\t4253:  0x00009465,\n\t4254:  0x000257E1,\n\t4255:  0x00006195,\n\t4256:  0x00005A27,\n\t4257:  0x0002F8CD,\n\t4258:  0x00004FBB,\n\t4259:  0x000056B9,\n\t4260:  0x00024521,\n\t4261:  0x000266FC,\n\t4262:  0x00004E6A,\n\t4263:  0x00024934,\n\t4264:  0x00009656,\n\t4265:  0x00006D8F,\n\t4266:  0x00026CBD,\n\t4267:  0x00003618,\n\t4268:  0x00008977,\n\t4269:  0x00026799,\n\t4270:  0x0002686E,\n\t4271:  0x00026411,\n\t4272:  0x0002685E,\n\t4273:  0x000071DF,\n\t4274:  0x000268C7,\n\t4275:  0x00007B42,\n\t4276:  0x000290C0,\n\t4277:  0x00020A11,\n\t4278:  0x00026926,\n\t4279:  0x00009104,\n\t4280:  0x00026939,\n\t4281:  0x00007A45,\n\t4282:  0x00009DF0,\n\t4283:  0x000269FA,\n\t4284:  0x00009A26,\n\t4285:  0x00026A2D,\n\t4286:  0x0000365F,\n\t4287:  0x00026469,\n\t4288:  0x00020021,\n\t4289:  0x00007983,\n\t4290:  0x00026A34,\n\t4291:  0x00026B5B,\n\t4292:  0x00005D2C,\n\t4293:  0x00023519,\n\t4294:  0x000083CF,\n\t4295:  0x00026B9D,\n\t4296:  0x000046D0,\n\t4297:  0x00026CA4,\n\t4298:  0x0000753B,\n\t4299:  0x00008865,\n\t4300:  0x00026DAE,\n\t4301:  0x000058B6,\n\t4302:  0x0000371C,\n\t4303:  0x0002258D,\n\t4304:  0x0002704B,\n\t4305:  0x000271CD,\n\t4306:  0x00003C54,\n\t4307:  0x00027280,\n\t4308:  0x00027285,\n\t4309:  0x00009281,\n\t4310:  0x0002217A,\n\t4311:  0x0002728B,\n\t4312:  0x00009330,\n\t4313:  0x000272E6,\n\t4314:  0x000249D0,\n\t4315:  0x00006C39,\n\t4316:  0x0000949F,\n\t4317:  0x00027450,\n\t4318:  0x00020EF8,\n\t4319:  0x00008827,\n\t4320:  0x000088F5,\n\t4321:  0x00022926,\n\t4322:  0x00028473,\n\t4323:  0x000217B1,\n\t4324:  0x00006EB8,\n\t4325:  0x00024A2A,\n\t4326:  0x00021820,\n\t4327:  0x000039A4,\n\t4328:  0x000036B9,\n\t4329:  0x00005C10,\n\t4330:  0x000079E3,\n\t4331:  0x0000453F,\n\t4332:  0x000066B6,\n\t4333:  0x00029CAD,\n\t4334:  0x000298A4,\n\t4335:  0x00008943,\n\t4336:  0x000277CC,\n\t4337:  0x00027858,\n\t4338:  0x000056D6,\n\t4339:  0x000040DF,\n\t4340:  0x0002160A,\n\t4341:  0x000039A1,\n\t4342:  0x0002372F,\n\t4343:  0x000280E8,\n\t4344:  0x000213C5,\n\t4345:  0x000071AD,\n\t4346:  0x00008366,\n\t4347:  0x000279DD,\n\t4348:  0x000291A8,\n\t4349:  0x00005A67,\n\t4350:  0x00004CB7,\n\t4351:  0x000270AF,\n\t4352:  0x000289AB,\n\t4353:  0x000279FD,\n\t4354:  0x00027A0A,\n\t4355:  0x00027B0B,\n\t4356:  0x00027D66,\n\t4357:  0x0002417A,\n\t4358:  0x00007B43,\n\t4359:  0x0000797E,\n\t4360:  0x00028009,\n\t4361:  0x00006FB5,\n\t4362:  0x0002A2DF,\n\t4363:  0x00006A03,\n\t4364:  0x00028318,\n\t4365:  0x000053A2,\n\t4366:  0x00026E07,\n\t4367:  0x000093BF,\n\t4368:  0x00006836,\n\t4369:  0x0000975D,\n\t4370:  0x0002816F,\n\t4371:  0x00028023,\n\t4372:  0x000269B5,\n\t4373:  0x000213ED,\n\t4374:  0x0002322F,\n\t4375:  0x00028048,\n\t4376:  0x00005D85,\n\t4377:  0x00028C30,\n\t4378:  0x00028083,\n\t4379:  0x00005715,\n\t4380:  0x00009823,\n\t4381:  0x00028949,\n\t4382:  0x00005DAB,\n\t4383:  0x00024988,\n\t4384:  0x000065BE,\n\t4385:  0x000069D5,\n\t4386:  0x000053D2,\n\t4387:  0x00024AA5,\n\t4388:  0x00023F81,\n\t4389:  0x00003C11,\n\t4390:  0x00006736,\n\t4391:  0x00028090,\n\t4392:  0x000280F4,\n\t4393:  0x0002812E,\n\t4394:  0x00021FA1,\n\t4395:  0x0002814F,\n\t4396:  0x00028189,\n\t4397:  0x000281AF,\n\t4398:  0x0002821A,\n\t4399:  0x00028306,\n\t4400:  0x0002832F,\n\t4401:  0x0002838A,\n\t4402:  0x000035CA,\n\t4403:  0x00028468,\n\t4404:  0x000286AA,\n\t4405:  0x000048FA,\n\t4406:  0x000063E6,\n\t4407:  0x00028956,\n\t4408:  0x00007808,\n\t4409:  0x00009255,\n\t4410:  0x000289B8,\n\t4411:  0x000043F2,\n\t4412:  0x000289E7,\n\t4413:  0x000043DF,\n\t4414:  0x000289E8,\n\t4415:  0x00028B46,\n\t4416:  0x00028BD4,\n\t4417:  0x000059F8,\n\t4418:  0x00028C09,\n\t4419:  0x00008F0B,\n\t4420:  0x00028FC5,\n\t4421:  0x000290EC,\n\t4422:  0x00007B51,\n\t4423:  0x00029110,\n\t4424:  0x0002913C,\n\t4425:  0x00003DF7,\n\t4426:  0x0002915E,\n\t4427:  0x00024ACA,\n\t4428:  0x00008FD0,\n\t4429:  0x0000728F,\n\t4430:  0x0000568B,\n\t4431:  0x000294E7,\n\t4432:  0x000295E9,\n\t4433:  0x000295B0,\n\t4434:  0x000295B8,\n\t4435:  0x00029732,\n\t4436:  0x000298D1,\n\t4437:  0x00029949,\n\t4438:  0x0002996A,\n\t4439:  0x000299C3,\n\t4440:  0x00029A28,\n\t4441:  0x00029B0E,\n\t4442:  0x00029D5A,\n\t4443:  0x00029D9B,\n\t4444:  0x00007E9F,\n\t4445:  0x00029EF8,\n\t4446:  0x00029F23,\n\t4447:  0x00004CA4,\n\t4448:  0x00009547,\n\t4449:  0x0002A293,\n\t4450:  0x000071A2,\n\t4451:  0x0002A2FF,\n\t4452:  0x00004D91,\n\t4453:  0x00009012,\n\t4454:  0x0002A5CB,\n\t4455:  0x00004D9C,\n\t4456:  0x00020C9C,\n\t4457:  0x00008FBE,\n\t4458:  0x000055C1,\n\t4459:  0x00008FBA,\n\t4460:  0x000224B0,\n\t4461:  0x00008FB9,\n\t4462:  0x00024A93,\n\t4463:  0x00004509,\n\t4464:  0x00007E7F,\n\t4465:  0x00006F56,\n\t4466:  0x00006AB1,\n\t4467:  0x00004EEA,\n\t4468:  0x000034E4,\n\t4469:  0x00028B2C,\n\t4470:  0x0002789D,\n\t4471:  0x0000373A,\n\t4472:  0x00008E80,\n\t4473:  0x000217F5,\n\t4474:  0x00028024,\n\t4475:  0x00028B6C,\n\t4476:  0x00028B99,\n\t4477:  0x00027A3E,\n\t4478:  0x000266AF,\n\t4479:  0x00003DEB,\n\t4480:  0x00027655,\n\t4481:  0x00023CB7,\n\t4482:  0x00025635,\n\t4483:  0x00025956,\n\t4484:  0x00004E9A,\n\t4485:  0x00025E81,\n\t4486:  0x00026258,\n\t4487:  0x000056BF,\n\t4488:  0x00020E6D,\n\t4489:  0x00008E0E,\n\t4490:  0x00005B6D,\n\t4491:  0x00023E88,\n\t4492:  0x00024C9E,\n\t4493:  0x000063DE,\n\t4494:  0x000062D0,\n\t4495:  0x000217F6,\n\t4496:  0x0002187B,\n\t4497:  0x00006530,\n\t4498:  0x0000562D,\n\t4499:  0x00025C4A,\n\t4500:  0x0000541A,\n\t4501:  0x00025311,\n\t4502:  0x00003DC6,\n\t4503:  0x00029D98,\n\t4504:  0x00004C7D,\n\t4505:  0x00005622,\n\t4506:  0x0000561E,\n\t4507:  0x00007F49,\n\t4508:  0x00025ED8,\n\t4509:  0x00005975,\n\t4510:  0x00023D40,\n\t4511:  0x00008770,\n\t4512:  0x00004E1C,\n\t4513:  0x00020FEA,\n\t4514:  0x00020D49,\n\t4515:  0x000236BA,\n\t4516:  0x00008117,\n\t4517:  0x00009D5E,\n\t4518:  0x00008D18,\n\t4519:  0x0000763B,\n\t4520:  0x00009C45,\n\t4521:  0x0000764E,\n\t4522:  0x000077B9,\n\t4523:  0x00009345,\n\t4524:  0x00005432,\n\t4525:  0x00008148,\n\t4526:  0x000082F7,\n\t4527:  0x00005625,\n\t4528:  0x00008132,\n\t4529:  0x00008418,\n\t4530:  0x000080BD,\n\t4531:  0x000055EA,\n\t4532:  0x00007962,\n\t4533:  0x00005643,\n\t4534:  0x00005416,\n\t4535:  0x00020E9D,\n\t4536:  0x000035CE,\n\t4537:  0x00005605,\n\t4538:  0x000055F1,\n\t4539:  0x000066F1,\n\t4540:  0x000282E2,\n\t4541:  0x0000362D,\n\t4542:  0x00007534,\n\t4543:  0x000055F0,\n\t4544:  0x000055BA,\n\t4545:  0x00005497,\n\t4546:  0x00005572,\n\t4547:  0x00020C41,\n\t4548:  0x00020C96,\n\t4549:  0x00005ED0,\n\t4550:  0x00025148,\n\t4551:  0x00020E76,\n\t4552:  0x00022C62,\n\t4553:  0x00020EA2,\n\t4554:  0x00009EAB,\n\t4555:  0x00007D5A,\n\t4556:  0x000055DE,\n\t4557:  0x00021075,\n\t4558:  0x0000629D,\n\t4559:  0x0000976D,\n\t4560:  0x00005494,\n\t4561:  0x00008CCD,\n\t4562:  0x000071F6,\n\t4563:  0x00009176,\n\t4564:  0x000063FC,\n\t4565:  0x000063B9,\n\t4566:  0x000063FE,\n\t4567:  0x00005569,\n\t4568:  0x00022B43,\n\t4569:  0x00009C72,\n\t4570:  0x00022EB3,\n\t4571:  0x0000519A,\n\t4572:  0x000034DF,\n\t4573:  0x00020DA7,\n\t4574:  0x000051A7,\n\t4575:  0x0000544D,\n\t4576:  0x0000551E,\n\t4577:  0x00005513,\n\t4578:  0x00007666,\n\t4579:  0x00008E2D,\n\t4580:  0x0002688A,\n\t4581:  0x000075B1,\n\t4582:  0x000080B6,\n\t4583:  0x00008804,\n\t4584:  0x00008786,\n\t4585:  0x000088C7,\n\t4586:  0x000081B6,\n\t4587:  0x0000841C,\n\t4588:  0x000210C1,\n\t4589:  0x000044EC,\n\t4590:  0x00007304,\n\t4591:  0x00024706,\n\t4592:  0x00005B90,\n\t4593:  0x0000830B,\n\t4594:  0x00026893,\n\t4595:  0x0000567B,\n\t4596:  0x000226F4,\n\t4597:  0x00027D2F,\n\t4598:  0x000241A3,\n\t4599:  0x00027D73,\n\t4600:  0x00026ED0,\n\t4601:  0x000272B6,\n\t4602:  0x00009170,\n\t4603:  0x000211D9,\n\t4604:  0x00009208,\n\t4605:  0x00023CFC,\n\t4606:  0x0002A6A9,\n\t4607:  0x00020EAC,\n\t4608:  0x00020EF9,\n\t4609:  0x00007266,\n\t4610:  0x00021CA2,\n\t4611:  0x0000474E,\n\t4612:  0x00024FC2,\n\t4613:  0x00027FF9,\n\t4614:  0x00020FEB,\n\t4615:  0x000040FA,\n\t4616:  0x00009C5D,\n\t4617:  0x0000651F,\n\t4618:  0x00022DA0,\n\t4619:  0x000048F3,\n\t4620:  0x000247E0,\n\t4621:  0x00029D7C,\n\t4622:  0x00020FEC,\n\t4623:  0x00020E0A,\n\t4624:  0x00006062,\n\t4625:  0x000275A3,\n\t4626:  0x00020FED,\n\t4628:  0x00026048,\n\t4629:  0x00021187,\n\t4630:  0x000071A3,\n\t4631:  0x00007E8E,\n\t4632:  0x00009D50,\n\t4633:  0x00004E1A,\n\t4634:  0x00004E04,\n\t4635:  0x00003577,\n\t4636:  0x00005B0D,\n\t4637:  0x00006CB2,\n\t4638:  0x00005367,\n\t4639:  0x000036AC,\n\t4640:  0x000039DC,\n\t4641:  0x0000537D,\n\t4642:  0x000036A5,\n\t4643:  0x00024618,\n\t4644:  0x0000589A,\n\t4645:  0x00024B6E,\n\t4646:  0x0000822D,\n\t4647:  0x0000544B,\n\t4648:  0x000057AA,\n\t4649:  0x00025A95,\n\t4650:  0x00020979,\n\t4652:  0x00003A52,\n\t4653:  0x00022465,\n\t4654:  0x00007374,\n\t4655:  0x00029EAC,\n\t4656:  0x00004D09,\n\t4657:  0x00009BED,\n\t4658:  0x00023CFE,\n\t4659:  0x00029F30,\n\t4660:  0x00004C5B,\n\t4661:  0x00024FA9,\n\t4662:  0x0002959E,\n\t4663:  0x00029FDE,\n\t4664:  0x0000845C,\n\t4665:  0x00023DB6,\n\t4666:  0x000272B2,\n\t4667:  0x000267B3,\n\t4668:  0x00023720,\n\t4669:  0x0000632E,\n\t4670:  0x00007D25,\n\t4671:  0x00023EF7,\n\t4672:  0x00023E2C,\n\t4673:  0x00003A2A,\n\t4674:  0x00009008,\n\t4675:  0x000052CC,\n\t4676:  0x00003E74,\n\t4677:  0x0000367A,\n\t4678:  0x000045E9,\n\t4679:  0x0002048E,\n\t4680:  0x00007640,\n\t4681:  0x00005AF0,\n\t4682:  0x00020EB6,\n\t4683:  0x0000787A,\n\t4684:  0x00027F2E,\n\t4685:  0x000058A7,\n\t4686:  0x000040BF,\n\t4687:  0x0000567C,\n\t4688:  0x00009B8B,\n\t4689:  0x00005D74,\n\t4690:  0x00007654,\n\t4691:  0x0002A434,\n\t4692:  0x00009E85,\n\t4693:  0x00004CE1,\n\t4694:  0x000075F9,\n\t4695:  0x000037FB,\n\t4696:  0x00006119,\n\t4697:  0x000230DA,\n\t4698:  0x000243F2,\n\t4700:  0x0000565D,\n\t4701:  0x000212A9,\n\t4702:  0x000057A7,\n\t4703:  0x00024963,\n\t4704:  0x00029E06,\n\t4705:  0x00005234,\n\t4706:  0x000270AE,\n\t4707:  0x000035AD,\n\t4708:  0x00006C4A,\n\t4709:  0x00009D7C,\n\t4710:  0x00007C56,\n\t4711:  0x00009B39,\n\t4712:  0x000057DE,\n\t4713:  0x0002176C,\n\t4714:  0x00005C53,\n\t4715:  0x000064D3,\n\t4716:  0x000294D0,\n\t4717:  0x00026335,\n\t4718:  0x00027164,\n\t4719:  0x000086AD,\n\t4720:  0x00020D28,\n\t4721:  0x00026D22,\n\t4722:  0x00024AE2,\n\t4723:  0x00020D71,\n\t4725:  0x000051FE,\n\t4726:  0x00021F0F,\n\t4727:  0x00005D8E,\n\t4728:  0x00009703,\n\t4729:  0x00021DD1,\n\t4730:  0x00009E81,\n\t4731:  0x0000904C,\n\t4732:  0x00007B1F,\n\t4733:  0x00009B02,\n\t4734:  0x00005CD1,\n\t4735:  0x00007BA3,\n\t4736:  0x00006268,\n\t4737:  0x00006335,\n\t4738:  0x00009AFF,\n\t4739:  0x00007BCF,\n\t4740:  0x00009B2A,\n\t4741:  0x00007C7E,\n\t4742:  0x00009B2E,\n\t4743:  0x00007C42,\n\t4744:  0x00007C86,\n\t4745:  0x00009C15,\n\t4746:  0x00007BFC,\n\t4747:  0x00009B09,\n\t4748:  0x00009F17,\n\t4749:  0x00009C1B,\n\t4750:  0x0002493E,\n\t4751:  0x00009F5A,\n\t4752:  0x00005573,\n\t4753:  0x00005BC3,\n\t4754:  0x00004FFD,\n\t4755:  0x00009E98,\n\t4756:  0x00004FF2,\n\t4757:  0x00005260,\n\t4758:  0x00003E06,\n\t4759:  0x000052D1,\n\t4760:  0x00005767,\n\t4761:  0x00005056,\n\t4762:  0x000059B7,\n\t4763:  0x00005E12,\n\t4764:  0x000097C8,\n\t4765:  0x00009DAB,\n\t4766:  0x00008F5C,\n\t4767:  0x00005469,\n\t4768:  0x000097B4,\n\t4769:  0x00009940,\n\t4770:  0x000097BA,\n\t4771:  0x0000532C,\n\t4772:  0x00006130,\n\t4773:  0x0000692C,\n\t4774:  0x000053DA,\n\t4775:  0x00009C0A,\n\t4776:  0x00009D02,\n\t4777:  0x00004C3B,\n\t4778:  0x00009641,\n\t4779:  0x00006980,\n\t4780:  0x000050A6,\n\t4781:  0x00007546,\n\t4782:  0x0002176D,\n\t4783:  0x000099DA,\n\t4784:  0x00005273,\n\t4786:  0x00009159,\n\t4787:  0x00009681,\n\t4788:  0x0000915C,\n\t4790:  0x00009151,\n\t4791:  0x00028E97,\n\t4792:  0x0000637F,\n\t4793:  0x00026D23,\n\t4794:  0x00006ACA,\n\t4795:  0x00005611,\n\t4796:  0x0000918E,\n\t4797:  0x0000757A,\n\t4798:  0x00006285,\n\t4799:  0x000203FC,\n\t4800:  0x0000734F,\n\t4801:  0x00007C70,\n\t4802:  0x00025C21,\n\t4803:  0x00023CFD,\n\t4805:  0x00024919,\n\t4806:  0x000076D6,\n\t4807:  0x00009B9D,\n\t4808:  0x00004E2A,\n\t4809:  0x00020CD4,\n\t4810:  0x000083BE,\n\t4811:  0x00008842,\n\t4813:  0x00005C4A,\n\t4814:  0x000069C0,\n\t4815:  0x000050ED,\n\t4816:  0x0000577A,\n\t4817:  0x0000521F,\n\t4818:  0x00005DF5,\n\t4819:  0x00004ECE,\n\t4820:  0x00006C31,\n\t4821:  0x000201F2,\n\t4822:  0x00004F39,\n\t4823:  0x0000549C,\n\t4824:  0x000054DA,\n\t4825:  0x0000529A,\n\t4826:  0x00008D82,\n\t4827:  0x000035FE,\n\t4828:  0x00005F0C,\n\t4829:  0x000035F3,\n\t4831:  0x00006B52,\n\t4832:  0x0000917C,\n\t4833:  0x00009FA5,\n\t4834:  0x00009B97,\n\t4835:  0x0000982E,\n\t4836:  0x000098B4,\n\t4837:  0x00009ABA,\n\t4838:  0x00009EA8,\n\t4839:  0x00009E84,\n\t4840:  0x0000717A,\n\t4841:  0x00007B14,\n\t4843:  0x00006BFA,\n\t4844:  0x00008818,\n\t4845:  0x00007F78,\n\t4847:  0x00005620,\n\t4848:  0x0002A64A,\n\t4849:  0x00008E77,\n\t4850:  0x00009F53,\n\t4852:  0x00008DD4,\n\t4853:  0x00008E4F,\n\t4854:  0x00009E1C,\n\t4855:  0x00008E01,\n\t4856:  0x00006282,\n\t4857:  0x0002837D,\n\t4858:  0x00008E28,\n\t4859:  0x00008E75,\n\t4860:  0x00007AD3,\n\t4861:  0x00024A77,\n\t4862:  0x00007A3E,\n\t4863:  0x000078D8,\n\t4864:  0x00006CEA,\n\t4865:  0x00008A67,\n\t4866:  0x00007607,\n\t4867:  0x00028A5A,\n\t4868:  0x00009F26,\n\t4869:  0x00006CCE,\n\t4870:  0x000087D6,\n\t4871:  0x000075C3,\n\t4872:  0x0002A2B2,\n\t4873:  0x00007853,\n\t4874:  0x0002F840,\n\t4875:  0x00008D0C,\n\t4876:  0x000072E2,\n\t4877:  0x00007371,\n\t4878:  0x00008B2D,\n\t4879:  0x00007302,\n\t4880:  0x000074F1,\n\t4881:  0x00008CEB,\n\t4882:  0x00024ABB,\n\t4883:  0x0000862F,\n\t4884:  0x00005FBA,\n\t4885:  0x000088A0,\n\t4886:  0x000044B7,\n\t4888:  0x0002183B,\n\t4889:  0x00026E05,\n\t4891:  0x00008A7E,\n\t4892:  0x0002251B,\n\t4894:  0x000060FD,\n\t4895:  0x00007667,\n\t4896:  0x00009AD7,\n\t4897:  0x00009D44,\n\t4898:  0x0000936E,\n\t4899:  0x00009B8F,\n\t4900:  0x000087F5,\n\t4902:  0x0000880F,\n\t4903:  0x00008CF7,\n\t4904:  0x0000732C,\n\t4905:  0x00009721,\n\t4906:  0x00009BB0,\n\t4907:  0x000035D6,\n\t4908:  0x000072B2,\n\t4909:  0x00004C07,\n\t4910:  0x00007C51,\n\t4911:  0x0000994A,\n\t4912:  0x00026159,\n\t4913:  0x00006159,\n\t4914:  0x00004C04,\n\t4915:  0x00009E96,\n\t4916:  0x0000617D,\n\t4918:  0x0000575F,\n\t4919:  0x0000616F,\n\t4920:  0x000062A6,\n\t4921:  0x00006239,\n\t4922:  0x000062CE,\n\t4923:  0x00003A5C,\n\t4924:  0x000061E2,\n\t4925:  0x000053AA,\n\t4926:  0x000233F5,\n\t4927:  0x00006364,\n\t4928:  0x00006802,\n\t4929:  0x000035D2,\n\t4930:  0x00005D57,\n\t4931:  0x00028BC2,\n\t4932:  0x00008FDA,\n\t4933:  0x00028E39,\n\t4935:  0x000050D9,\n\t4936:  0x00021D46,\n\t4937:  0x00007906,\n\t4938:  0x00005332,\n\t4939:  0x00009638,\n\t4940:  0x00020F3B,\n\t4941:  0x00004065,\n\t4943:  0x000077FE,\n\t4945:  0x00007CC2,\n\t4946:  0x00025F1A,\n\t4947:  0x00007CDA,\n\t4948:  0x00007A2D,\n\t4949:  0x00008066,\n\t4950:  0x00008063,\n\t4951:  0x00007D4D,\n\t4952:  0x00007505,\n\t4953:  0x000074F2,\n\t4954:  0x00008994,\n\t4955:  0x0000821A,\n\t4956:  0x0000670C,\n\t4957:  0x00008062,\n\t4958:  0x00027486,\n\t4959:  0x0000805B,\n\t4960:  0x000074F0,\n\t4961:  0x00008103,\n\t4962:  0x00007724,\n\t4963:  0x00008989,\n\t4964:  0x000267CC,\n\t4965:  0x00007553,\n\t4966:  0x00026ED1,\n\t4967:  0x000087A9,\n\t4968:  0x000087CE,\n\t4969:  0x000081C8,\n\t4970:  0x0000878C,\n\t4971:  0x00008A49,\n\t4972:  0x00008CAD,\n\t4973:  0x00008B43,\n\t4974:  0x0000772B,\n\t4975:  0x000074F8,\n\t4976:  0x000084DA,\n\t4977:  0x00003635,\n\t4978:  0x000069B2,\n\t4979:  0x00008DA6,\n\t4981:  0x000089A9,\n\t4982:  0x00007468,\n\t4983:  0x00006DB9,\n\t4984:  0x000087C1,\n\t4985:  0x00024011,\n\t4986:  0x000074E7,\n\t4987:  0x00003DDB,\n\t4988:  0x00007176,\n\t4989:  0x000060A4,\n\t4990:  0x0000619C,\n\t4991:  0x00003CD1,\n\t4992:  0x00007162,\n\t4993:  0x00006077,\n\t4995:  0x00007F71,\n\t4996:  0x00028B2D,\n\t4997:  0x00007250,\n\t4998:  0x000060E9,\n\t4999:  0x00004B7E,\n\t5000:  0x00005220,\n\t5001:  0x00003C18,\n\t5002:  0x00023CC7,\n\t5003:  0x00025ED7,\n\t5004:  0x00027656,\n\t5005:  0x00025531,\n\t5006:  0x00021944,\n\t5007:  0x000212FE,\n\t5008:  0x00029903,\n\t5009:  0x00026DDC,\n\t5010:  0x000270AD,\n\t5011:  0x00005CC1,\n\t5012:  0x000261AD,\n\t5013:  0x00028A0F,\n\t5014:  0x00023677,\n\t5015:  0x000200EE,\n\t5016:  0x00026846,\n\t5017:  0x00024F0E,\n\t5018:  0x00004562,\n\t5019:  0x00005B1F,\n\t5020:  0x0002634C,\n\t5021:  0x00009F50,\n\t5022:  0x00009EA6,\n\t5023:  0x0002626B,\n\t5024:  0x00003000,\n\t5025:  0x0000FF0C,\n\t5026:  0x00003001,\n\t5027:  0x00003002,\n\t5028:  0x0000FF0E,\n\t5029:  0x00002027,\n\t5030:  0x0000FF1B,\n\t5031:  0x0000FF1A,\n\t5032:  0x0000FF1F,\n\t5033:  0x0000FF01,\n\t5034:  0x0000FE30,\n\t5035:  0x00002026,\n\t5036:  0x00002025,\n\t5037:  0x0000FE50,\n\t5038:  0x0000FE51,\n\t5039:  0x0000FE52,\n\t5040:  0x000000B7,\n\t5041:  0x0000FE54,\n\t5042:  0x0000FE55,\n\t5043:  0x0000FE56,\n\t5044:  0x0000FE57,\n\t5045:  0x0000FF5C,\n\t5046:  0x00002013,\n\t5047:  0x0000FE31,\n\t5048:  0x00002014,\n\t5049:  0x0000FE33,\n\t5050:  0x00002574,\n\t5051:  0x0000FE34,\n\t5052:  0x0000FE4F,\n\t5053:  0x0000FF08,\n\t5054:  0x0000FF09,\n\t5055:  0x0000FE35,\n\t5056:  0x0000FE36,\n\t5057:  0x0000FF5B,\n\t5058:  0x0000FF5D,\n\t5059:  0x0000FE37,\n\t5060:  0x0000FE38,\n\t5061:  0x00003014,\n\t5062:  0x00003015,\n\t5063:  0x0000FE39,\n\t5064:  0x0000FE3A,\n\t5065:  0x00003010,\n\t5066:  0x00003011,\n\t5067:  0x0000FE3B,\n\t5068:  0x0000FE3C,\n\t5069:  0x0000300A,\n\t5070:  0x0000300B,\n\t5071:  0x0000FE3D,\n\t5072:  0x0000FE3E,\n\t5073:  0x00003008,\n\t5074:  0x00003009,\n\t5075:  0x0000FE3F,\n\t5076:  0x0000FE40,\n\t5077:  0x0000300C,\n\t5078:  0x0000300D,\n\t5079:  0x0000FE41,\n\t5080:  0x0000FE42,\n\t5081:  0x0000300E,\n\t5082:  0x0000300F,\n\t5083:  0x0000FE43,\n\t5084:  0x0000FE44,\n\t5085:  0x0000FE59,\n\t5086:  0x0000FE5A,\n\t5087:  0x0000FE5B,\n\t5088:  0x0000FE5C,\n\t5089:  0x0000FE5D,\n\t5090:  0x0000FE5E,\n\t5091:  0x00002018,\n\t5092:  0x00002019,\n\t5093:  0x0000201C,\n\t5094:  0x0000201D,\n\t5095:  0x0000301D,\n\t5096:  0x0000301E,\n\t5097:  0x00002035,\n\t5098:  0x00002032,\n\t5099:  0x0000FF03,\n\t5100:  0x0000FF06,\n\t5101:  0x0000FF0A,\n\t5102:  0x0000203B,\n\t5103:  0x000000A7,\n\t5104:  0x00003003,\n\t5105:  0x000025CB,\n\t5106:  0x000025CF,\n\t5107:  0x000025B3,\n\t5108:  0x000025B2,\n\t5109:  0x000025CE,\n\t5110:  0x00002606,\n\t5111:  0x00002605,\n\t5112:  0x000025C7,\n\t5113:  0x000025C6,\n\t5114:  0x000025A1,\n\t5115:  0x000025A0,\n\t5116:  0x000025BD,\n\t5117:  0x000025BC,\n\t5118:  0x000032A3,\n\t5119:  0x00002105,\n\t5120:  0x000000AF,\n\t5121:  0x0000FFE3,\n\t5122:  0x0000FF3F,\n\t5123:  0x000002CD,\n\t5124:  0x0000FE49,\n\t5125:  0x0000FE4A,\n\t5126:  0x0000FE4D,\n\t5127:  0x0000FE4E,\n\t5128:  0x0000FE4B,\n\t5129:  0x0000FE4C,\n\t5130:  0x0000FE5F,\n\t5131:  0x0000FE60,\n\t5132:  0x0000FE61,\n\t5133:  0x0000FF0B,\n\t5134:  0x0000FF0D,\n\t5135:  0x000000D7,\n\t5136:  0x000000F7,\n\t5137:  0x000000B1,\n\t5138:  0x0000221A,\n\t5139:  0x0000FF1C,\n\t5140:  0x0000FF1E,\n\t5141:  0x0000FF1D,\n\t5142:  0x00002266,\n\t5143:  0x00002267,\n\t5144:  0x00002260,\n\t5145:  0x0000221E,\n\t5146:  0x00002252,\n\t5147:  0x00002261,\n\t5148:  0x0000FE62,\n\t5149:  0x0000FE63,\n\t5150:  0x0000FE64,\n\t5151:  0x0000FE65,\n\t5152:  0x0000FE66,\n\t5153:  0x0000FF5E,\n\t5154:  0x00002229,\n\t5155:  0x0000222A,\n\t5156:  0x000022A5,\n\t5157:  0x00002220,\n\t5158:  0x0000221F,\n\t5159:  0x000022BF,\n\t5160:  0x000033D2,\n\t5161:  0x000033D1,\n\t5162:  0x0000222B,\n\t5163:  0x0000222E,\n\t5164:  0x00002235,\n\t5165:  0x00002234,\n\t5166:  0x00002640,\n\t5167:  0x00002642,\n\t5168:  0x00002295,\n\t5169:  0x00002299,\n\t5170:  0x00002191,\n\t5171:  0x00002193,\n\t5172:  0x00002190,\n\t5173:  0x00002192,\n\t5174:  0x00002196,\n\t5175:  0x00002197,\n\t5176:  0x00002199,\n\t5177:  0x00002198,\n\t5178:  0x00002225,\n\t5179:  0x00002223,\n\t5180:  0x0000FF0F,\n\t5181:  0x0000FF3C,\n\t5182:  0x00002215,\n\t5183:  0x0000FE68,\n\t5184:  0x0000FF04,\n\t5185:  0x0000FFE5,\n\t5186:  0x00003012,\n\t5187:  0x0000FFE0,\n\t5188:  0x0000FFE1,\n\t5189:  0x0000FF05,\n\t5190:  0x0000FF20,\n\t5191:  0x00002103,\n\t5192:  0x00002109,\n\t5193:  0x0000FE69,\n\t5194:  0x0000FE6A,\n\t5195:  0x0000FE6B,\n\t5196:  0x000033D5,\n\t5197:  0x0000339C,\n\t5198:  0x0000339D,\n\t5199:  0x0000339E,\n\t5200:  0x000033CE,\n\t5201:  0x000033A1,\n\t5202:  0x0000338E,\n\t5203:  0x0000338F,\n\t5204:  0x000033C4,\n\t5205:  0x000000B0,\n\t5206:  0x00005159,\n\t5207:  0x0000515B,\n\t5208:  0x0000515E,\n\t5209:  0x0000515D,\n\t5210:  0x00005161,\n\t5211:  0x00005163,\n\t5212:  0x000055E7,\n\t5213:  0x000074E9,\n\t5214:  0x00007CCE,\n\t5215:  0x00002581,\n\t5216:  0x00002582,\n\t5217:  0x00002583,\n\t5218:  0x00002584,\n\t5219:  0x00002585,\n\t5220:  0x00002586,\n\t5221:  0x00002587,\n\t5222:  0x00002588,\n\t5223:  0x0000258F,\n\t5224:  0x0000258E,\n\t5225:  0x0000258D,\n\t5226:  0x0000258C,\n\t5227:  0x0000258B,\n\t5228:  0x0000258A,\n\t5229:  0x00002589,\n\t5230:  0x0000253C,\n\t5231:  0x00002534,\n\t5232:  0x0000252C,\n\t5233:  0x00002524,\n\t5234:  0x0000251C,\n\t5235:  0x00002594,\n\t5236:  0x00002500,\n\t5237:  0x00002502,\n\t5238:  0x00002595,\n\t5239:  0x0000250C,\n\t5240:  0x00002510,\n\t5241:  0x00002514,\n\t5242:  0x00002518,\n\t5243:  0x0000256D,\n\t5244:  0x0000256E,\n\t5245:  0x00002570,\n\t5246:  0x0000256F,\n\t5247:  0x00002550,\n\t5248:  0x0000255E,\n\t5249:  0x0000256A,\n\t5250:  0x00002561,\n\t5251:  0x000025E2,\n\t5252:  0x000025E3,\n\t5253:  0x000025E5,\n\t5254:  0x000025E4,\n\t5255:  0x00002571,\n\t5256:  0x00002572,\n\t5257:  0x00002573,\n\t5258:  0x0000FF10,\n\t5259:  0x0000FF11,\n\t5260:  0x0000FF12,\n\t5261:  0x0000FF13,\n\t5262:  0x0000FF14,\n\t5263:  0x0000FF15,\n\t5264:  0x0000FF16,\n\t5265:  0x0000FF17,\n\t5266:  0x0000FF18,\n\t5267:  0x0000FF19,\n\t5268:  0x00002160,\n\t5269:  0x00002161,\n\t5270:  0x00002162,\n\t5271:  0x00002163,\n\t5272:  0x00002164,\n\t5273:  0x00002165,\n\t5274:  0x00002166,\n\t5275:  0x00002167,\n\t5276:  0x00002168,\n\t5277:  0x00002169,\n\t5278:  0x00003021,\n\t5279:  0x00003022,\n\t5280:  0x00003023,\n\t5281:  0x00003024,\n\t5282:  0x00003025,\n\t5283:  0x00003026,\n\t5284:  0x00003027,\n\t5285:  0x00003028,\n\t5286:  0x00003029,\n\t5287:  0x00005341,\n\t5288:  0x00005344,\n\t5289:  0x00005345,\n\t5290:  0x0000FF21,\n\t5291:  0x0000FF22,\n\t5292:  0x0000FF23,\n\t5293:  0x0000FF24,\n\t5294:  0x0000FF25,\n\t5295:  0x0000FF26,\n\t5296:  0x0000FF27,\n\t5297:  0x0000FF28,\n\t5298:  0x0000FF29,\n\t5299:  0x0000FF2A,\n\t5300:  0x0000FF2B,\n\t5301:  0x0000FF2C,\n\t5302:  0x0000FF2D,\n\t5303:  0x0000FF2E,\n\t5304:  0x0000FF2F,\n\t5305:  0x0000FF30,\n\t5306:  0x0000FF31,\n\t5307:  0x0000FF32,\n\t5308:  0x0000FF33,\n\t5309:  0x0000FF34,\n\t5310:  0x0000FF35,\n\t5311:  0x0000FF36,\n\t5312:  0x0000FF37,\n\t5313:  0x0000FF38,\n\t5314:  0x0000FF39,\n\t5315:  0x0000FF3A,\n\t5316:  0x0000FF41,\n\t5317:  0x0000FF42,\n\t5318:  0x0000FF43,\n\t5319:  0x0000FF44,\n\t5320:  0x0000FF45,\n\t5321:  0x0000FF46,\n\t5322:  0x0000FF47,\n\t5323:  0x0000FF48,\n\t5324:  0x0000FF49,\n\t5325:  0x0000FF4A,\n\t5326:  0x0000FF4B,\n\t5327:  0x0000FF4C,\n\t5328:  0x0000FF4D,\n\t5329:  0x0000FF4E,\n\t5330:  0x0000FF4F,\n\t5331:  0x0000FF50,\n\t5332:  0x0000FF51,\n\t5333:  0x0000FF52,\n\t5334:  0x0000FF53,\n\t5335:  0x0000FF54,\n\t5336:  0x0000FF55,\n\t5337:  0x0000FF56,\n\t5338:  0x0000FF57,\n\t5339:  0x0000FF58,\n\t5340:  0x0000FF59,\n\t5341:  0x0000FF5A,\n\t5342:  0x00000391,\n\t5343:  0x00000392,\n\t5344:  0x00000393,\n\t5345:  0x00000394,\n\t5346:  0x00000395,\n\t5347:  0x00000396,\n\t5348:  0x00000397,\n\t5349:  0x00000398,\n\t5350:  0x00000399,\n\t5351:  0x0000039A,\n\t5352:  0x0000039B,\n\t5353:  0x0000039C,\n\t5354:  0x0000039D,\n\t5355:  0x0000039E,\n\t5356:  0x0000039F,\n\t5357:  0x000003A0,\n\t5358:  0x000003A1,\n\t5359:  0x000003A3,\n\t5360:  0x000003A4,\n\t5361:  0x000003A5,\n\t5362:  0x000003A6,\n\t5363:  0x000003A7,\n\t5364:  0x000003A8,\n\t5365:  0x000003A9,\n\t5366:  0x000003B1,\n\t5367:  0x000003B2,\n\t5368:  0x000003B3,\n\t5369:  0x000003B4,\n\t5370:  0x000003B5,\n\t5371:  0x000003B6,\n\t5372:  0x000003B7,\n\t5373:  0x000003B8,\n\t5374:  0x000003B9,\n\t5375:  0x000003BA,\n\t5376:  0x000003BB,\n\t5377:  0x000003BC,\n\t5378:  0x000003BD,\n\t5379:  0x000003BE,\n\t5380:  0x000003BF,\n\t5381:  0x000003C0,\n\t5382:  0x000003C1,\n\t5383:  0x000003C3,\n\t5384:  0x000003C4,\n\t5385:  0x000003C5,\n\t5386:  0x000003C6,\n\t5387:  0x000003C7,\n\t5388:  0x000003C8,\n\t5389:  0x000003C9,\n\t5390:  0x00003105,\n\t5391:  0x00003106,\n\t5392:  0x00003107,\n\t5393:  0x00003108,\n\t5394:  0x00003109,\n\t5395:  0x0000310A,\n\t5396:  0x0000310B,\n\t5397:  0x0000310C,\n\t5398:  0x0000310D,\n\t5399:  0x0000310E,\n\t5400:  0x0000310F,\n\t5401:  0x00003110,\n\t5402:  0x00003111,\n\t5403:  0x00003112,\n\t5404:  0x00003113,\n\t5405:  0x00003114,\n\t5406:  0x00003115,\n\t5407:  0x00003116,\n\t5408:  0x00003117,\n\t5409:  0x00003118,\n\t5410:  0x00003119,\n\t5411:  0x0000311A,\n\t5412:  0x0000311B,\n\t5413:  0x0000311C,\n\t5414:  0x0000311D,\n\t5415:  0x0000311E,\n\t5416:  0x0000311F,\n\t5417:  0x00003120,\n\t5418:  0x00003121,\n\t5419:  0x00003122,\n\t5420:  0x00003123,\n\t5421:  0x00003124,\n\t5422:  0x00003125,\n\t5423:  0x00003126,\n\t5424:  0x00003127,\n\t5425:  0x00003128,\n\t5426:  0x00003129,\n\t5427:  0x000002D9,\n\t5428:  0x000002C9,\n\t5429:  0x000002CA,\n\t5430:  0x000002C7,\n\t5431:  0x000002CB,\n\t5432:  0x00002400,\n\t5433:  0x00002401,\n\t5434:  0x00002402,\n\t5435:  0x00002403,\n\t5436:  0x00002404,\n\t5437:  0x00002405,\n\t5438:  0x00002406,\n\t5439:  0x00002407,\n\t5440:  0x00002408,\n\t5441:  0x00002409,\n\t5442:  0x0000240A,\n\t5443:  0x0000240B,\n\t5444:  0x0000240C,\n\t5445:  0x0000240D,\n\t5446:  0x0000240E,\n\t5447:  0x0000240F,\n\t5448:  0x00002410,\n\t5449:  0x00002411,\n\t5450:  0x00002412,\n\t5451:  0x00002413,\n\t5452:  0x00002414,\n\t5453:  0x00002415,\n\t5454:  0x00002416,\n\t5455:  0x00002417,\n\t5456:  0x00002418,\n\t5457:  0x00002419,\n\t5458:  0x0000241A,\n\t5459:  0x0000241B,\n\t5460:  0x0000241C,\n\t5461:  0x0000241D,\n\t5462:  0x0000241E,\n\t5463:  0x0000241F,\n\t5464:  0x00002421,\n\t5465:  0x000020AC,\n\t5495:  0x00004E00,\n\t5496:  0x00004E59,\n\t5497:  0x00004E01,\n\t5498:  0x00004E03,\n\t5499:  0x00004E43,\n\t5500:  0x00004E5D,\n\t5501:  0x00004E86,\n\t5502:  0x00004E8C,\n\t5503:  0x00004EBA,\n\t5504:  0x0000513F,\n\t5505:  0x00005165,\n\t5506:  0x0000516B,\n\t5507:  0x000051E0,\n\t5508:  0x00005200,\n\t5509:  0x00005201,\n\t5510:  0x0000529B,\n\t5511:  0x00005315,\n\t5512:  0x00005341,\n\t5513:  0x0000535C,\n\t5514:  0x000053C8,\n\t5515:  0x00004E09,\n\t5516:  0x00004E0B,\n\t5517:  0x00004E08,\n\t5518:  0x00004E0A,\n\t5519:  0x00004E2B,\n\t5520:  0x00004E38,\n\t5521:  0x000051E1,\n\t5522:  0x00004E45,\n\t5523:  0x00004E48,\n\t5524:  0x00004E5F,\n\t5525:  0x00004E5E,\n\t5526:  0x00004E8E,\n\t5527:  0x00004EA1,\n\t5528:  0x00005140,\n\t5529:  0x00005203,\n\t5530:  0x000052FA,\n\t5531:  0x00005343,\n\t5532:  0x000053C9,\n\t5533:  0x000053E3,\n\t5534:  0x0000571F,\n\t5535:  0x000058EB,\n\t5536:  0x00005915,\n\t5537:  0x00005927,\n\t5538:  0x00005973,\n\t5539:  0x00005B50,\n\t5540:  0x00005B51,\n\t5541:  0x00005B53,\n\t5542:  0x00005BF8,\n\t5543:  0x00005C0F,\n\t5544:  0x00005C22,\n\t5545:  0x00005C38,\n\t5546:  0x00005C71,\n\t5547:  0x00005DDD,\n\t5548:  0x00005DE5,\n\t5549:  0x00005DF1,\n\t5550:  0x00005DF2,\n\t5551:  0x00005DF3,\n\t5552:  0x00005DFE,\n\t5553:  0x00005E72,\n\t5554:  0x00005EFE,\n\t5555:  0x00005F0B,\n\t5556:  0x00005F13,\n\t5557:  0x0000624D,\n\t5558:  0x00004E11,\n\t5559:  0x00004E10,\n\t5560:  0x00004E0D,\n\t5561:  0x00004E2D,\n\t5562:  0x00004E30,\n\t5563:  0x00004E39,\n\t5564:  0x00004E4B,\n\t5565:  0x00005C39,\n\t5566:  0x00004E88,\n\t5567:  0x00004E91,\n\t5568:  0x00004E95,\n\t5569:  0x00004E92,\n\t5570:  0x00004E94,\n\t5571:  0x00004EA2,\n\t5572:  0x00004EC1,\n\t5573:  0x00004EC0,\n\t5574:  0x00004EC3,\n\t5575:  0x00004EC6,\n\t5576:  0x00004EC7,\n\t5577:  0x00004ECD,\n\t5578:  0x00004ECA,\n\t5579:  0x00004ECB,\n\t5580:  0x00004EC4,\n\t5581:  0x00005143,\n\t5582:  0x00005141,\n\t5583:  0x00005167,\n\t5584:  0x0000516D,\n\t5585:  0x0000516E,\n\t5586:  0x0000516C,\n\t5587:  0x00005197,\n\t5588:  0x000051F6,\n\t5589:  0x00005206,\n\t5590:  0x00005207,\n\t5591:  0x00005208,\n\t5592:  0x000052FB,\n\t5593:  0x000052FE,\n\t5594:  0x000052FF,\n\t5595:  0x00005316,\n\t5596:  0x00005339,\n\t5597:  0x00005348,\n\t5598:  0x00005347,\n\t5599:  0x00005345,\n\t5600:  0x0000535E,\n\t5601:  0x00005384,\n\t5602:  0x000053CB,\n\t5603:  0x000053CA,\n\t5604:  0x000053CD,\n\t5605:  0x000058EC,\n\t5606:  0x00005929,\n\t5607:  0x0000592B,\n\t5608:  0x0000592A,\n\t5609:  0x0000592D,\n\t5610:  0x00005B54,\n\t5611:  0x00005C11,\n\t5612:  0x00005C24,\n\t5613:  0x00005C3A,\n\t5614:  0x00005C6F,\n\t5615:  0x00005DF4,\n\t5616:  0x00005E7B,\n\t5617:  0x00005EFF,\n\t5618:  0x00005F14,\n\t5619:  0x00005F15,\n\t5620:  0x00005FC3,\n\t5621:  0x00006208,\n\t5622:  0x00006236,\n\t5623:  0x0000624B,\n\t5624:  0x0000624E,\n\t5625:  0x0000652F,\n\t5626:  0x00006587,\n\t5627:  0x00006597,\n\t5628:  0x000065A4,\n\t5629:  0x000065B9,\n\t5630:  0x000065E5,\n\t5631:  0x000066F0,\n\t5632:  0x00006708,\n\t5633:  0x00006728,\n\t5634:  0x00006B20,\n\t5635:  0x00006B62,\n\t5636:  0x00006B79,\n\t5637:  0x00006BCB,\n\t5638:  0x00006BD4,\n\t5639:  0x00006BDB,\n\t5640:  0x00006C0F,\n\t5641:  0x00006C34,\n\t5642:  0x0000706B,\n\t5643:  0x0000722A,\n\t5644:  0x00007236,\n\t5645:  0x0000723B,\n\t5646:  0x00007247,\n\t5647:  0x00007259,\n\t5648:  0x0000725B,\n\t5649:  0x000072AC,\n\t5650:  0x0000738B,\n\t5651:  0x00004E19,\n\t5652:  0x00004E16,\n\t5653:  0x00004E15,\n\t5654:  0x00004E14,\n\t5655:  0x00004E18,\n\t5656:  0x00004E3B,\n\t5657:  0x00004E4D,\n\t5658:  0x00004E4F,\n\t5659:  0x00004E4E,\n\t5660:  0x00004EE5,\n\t5661:  0x00004ED8,\n\t5662:  0x00004ED4,\n\t5663:  0x00004ED5,\n\t5664:  0x00004ED6,\n\t5665:  0x00004ED7,\n\t5666:  0x00004EE3,\n\t5667:  0x00004EE4,\n\t5668:  0x00004ED9,\n\t5669:  0x00004EDE,\n\t5670:  0x00005145,\n\t5671:  0x00005144,\n\t5672:  0x00005189,\n\t5673:  0x0000518A,\n\t5674:  0x000051AC,\n\t5675:  0x000051F9,\n\t5676:  0x000051FA,\n\t5677:  0x000051F8,\n\t5678:  0x0000520A,\n\t5679:  0x000052A0,\n\t5680:  0x0000529F,\n\t5681:  0x00005305,\n\t5682:  0x00005306,\n\t5683:  0x00005317,\n\t5684:  0x0000531D,\n\t5685:  0x00004EDF,\n\t5686:  0x0000534A,\n\t5687:  0x00005349,\n\t5688:  0x00005361,\n\t5689:  0x00005360,\n\t5690:  0x0000536F,\n\t5691:  0x0000536E,\n\t5692:  0x000053BB,\n\t5693:  0x000053EF,\n\t5694:  0x000053E4,\n\t5695:  0x000053F3,\n\t5696:  0x000053EC,\n\t5697:  0x000053EE,\n\t5698:  0x000053E9,\n\t5699:  0x000053E8,\n\t5700:  0x000053FC,\n\t5701:  0x000053F8,\n\t5702:  0x000053F5,\n\t5703:  0x000053EB,\n\t5704:  0x000053E6,\n\t5705:  0x000053EA,\n\t5706:  0x000053F2,\n\t5707:  0x000053F1,\n\t5708:  0x000053F0,\n\t5709:  0x000053E5,\n\t5710:  0x000053ED,\n\t5711:  0x000053FB,\n\t5712:  0x000056DB,\n\t5713:  0x000056DA,\n\t5714:  0x00005916,\n\t5715:  0x0000592E,\n\t5716:  0x00005931,\n\t5717:  0x00005974,\n\t5718:  0x00005976,\n\t5719:  0x00005B55,\n\t5720:  0x00005B83,\n\t5721:  0x00005C3C,\n\t5722:  0x00005DE8,\n\t5723:  0x00005DE7,\n\t5724:  0x00005DE6,\n\t5725:  0x00005E02,\n\t5726:  0x00005E03,\n\t5727:  0x00005E73,\n\t5728:  0x00005E7C,\n\t5729:  0x00005F01,\n\t5730:  0x00005F18,\n\t5731:  0x00005F17,\n\t5732:  0x00005FC5,\n\t5733:  0x0000620A,\n\t5734:  0x00006253,\n\t5735:  0x00006254,\n\t5736:  0x00006252,\n\t5737:  0x00006251,\n\t5738:  0x000065A5,\n\t5739:  0x000065E6,\n\t5740:  0x0000672E,\n\t5741:  0x0000672C,\n\t5742:  0x0000672A,\n\t5743:  0x0000672B,\n\t5744:  0x0000672D,\n\t5745:  0x00006B63,\n\t5746:  0x00006BCD,\n\t5747:  0x00006C11,\n\t5748:  0x00006C10,\n\t5749:  0x00006C38,\n\t5750:  0x00006C41,\n\t5751:  0x00006C40,\n\t5752:  0x00006C3E,\n\t5753:  0x000072AF,\n\t5754:  0x00007384,\n\t5755:  0x00007389,\n\t5756:  0x000074DC,\n\t5757:  0x000074E6,\n\t5758:  0x00007518,\n\t5759:  0x0000751F,\n\t5760:  0x00007528,\n\t5761:  0x00007529,\n\t5762:  0x00007530,\n\t5763:  0x00007531,\n\t5764:  0x00007532,\n\t5765:  0x00007533,\n\t5766:  0x0000758B,\n\t5767:  0x0000767D,\n\t5768:  0x000076AE,\n\t5769:  0x000076BF,\n\t5770:  0x000076EE,\n\t5771:  0x000077DB,\n\t5772:  0x000077E2,\n\t5773:  0x000077F3,\n\t5774:  0x0000793A,\n\t5775:  0x000079BE,\n\t5776:  0x00007A74,\n\t5777:  0x00007ACB,\n\t5778:  0x00004E1E,\n\t5779:  0x00004E1F,\n\t5780:  0x00004E52,\n\t5781:  0x00004E53,\n\t5782:  0x00004E69,\n\t5783:  0x00004E99,\n\t5784:  0x00004EA4,\n\t5785:  0x00004EA6,\n\t5786:  0x00004EA5,\n\t5787:  0x00004EFF,\n\t5788:  0x00004F09,\n\t5789:  0x00004F19,\n\t5790:  0x00004F0A,\n\t5791:  0x00004F15,\n\t5792:  0x00004F0D,\n\t5793:  0x00004F10,\n\t5794:  0x00004F11,\n\t5795:  0x00004F0F,\n\t5796:  0x00004EF2,\n\t5797:  0x00004EF6,\n\t5798:  0x00004EFB,\n\t5799:  0x00004EF0,\n\t5800:  0x00004EF3,\n\t5801:  0x00004EFD,\n\t5802:  0x00004F01,\n\t5803:  0x00004F0B,\n\t5804:  0x00005149,\n\t5805:  0x00005147,\n\t5806:  0x00005146,\n\t5807:  0x00005148,\n\t5808:  0x00005168,\n\t5809:  0x00005171,\n\t5810:  0x0000518D,\n\t5811:  0x000051B0,\n\t5812:  0x00005217,\n\t5813:  0x00005211,\n\t5814:  0x00005212,\n\t5815:  0x0000520E,\n\t5816:  0x00005216,\n\t5817:  0x000052A3,\n\t5818:  0x00005308,\n\t5819:  0x00005321,\n\t5820:  0x00005320,\n\t5821:  0x00005370,\n\t5822:  0x00005371,\n\t5823:  0x00005409,\n\t5824:  0x0000540F,\n\t5825:  0x0000540C,\n\t5826:  0x0000540A,\n\t5827:  0x00005410,\n\t5828:  0x00005401,\n\t5829:  0x0000540B,\n\t5830:  0x00005404,\n\t5831:  0x00005411,\n\t5832:  0x0000540D,\n\t5833:  0x00005408,\n\t5834:  0x00005403,\n\t5835:  0x0000540E,\n\t5836:  0x00005406,\n\t5837:  0x00005412,\n\t5838:  0x000056E0,\n\t5839:  0x000056DE,\n\t5840:  0x000056DD,\n\t5841:  0x00005733,\n\t5842:  0x00005730,\n\t5843:  0x00005728,\n\t5844:  0x0000572D,\n\t5845:  0x0000572C,\n\t5846:  0x0000572F,\n\t5847:  0x00005729,\n\t5848:  0x00005919,\n\t5849:  0x0000591A,\n\t5850:  0x00005937,\n\t5851:  0x00005938,\n\t5852:  0x00005984,\n\t5853:  0x00005978,\n\t5854:  0x00005983,\n\t5855:  0x0000597D,\n\t5856:  0x00005979,\n\t5857:  0x00005982,\n\t5858:  0x00005981,\n\t5859:  0x00005B57,\n\t5860:  0x00005B58,\n\t5861:  0x00005B87,\n\t5862:  0x00005B88,\n\t5863:  0x00005B85,\n\t5864:  0x00005B89,\n\t5865:  0x00005BFA,\n\t5866:  0x00005C16,\n\t5867:  0x00005C79,\n\t5868:  0x00005DDE,\n\t5869:  0x00005E06,\n\t5870:  0x00005E76,\n\t5871:  0x00005E74,\n\t5872:  0x00005F0F,\n\t5873:  0x00005F1B,\n\t5874:  0x00005FD9,\n\t5875:  0x00005FD6,\n\t5876:  0x0000620E,\n\t5877:  0x0000620C,\n\t5878:  0x0000620D,\n\t5879:  0x00006210,\n\t5880:  0x00006263,\n\t5881:  0x0000625B,\n\t5882:  0x00006258,\n\t5883:  0x00006536,\n\t5884:  0x000065E9,\n\t5885:  0x000065E8,\n\t5886:  0x000065EC,\n\t5887:  0x000065ED,\n\t5888:  0x000066F2,\n\t5889:  0x000066F3,\n\t5890:  0x00006709,\n\t5891:  0x0000673D,\n\t5892:  0x00006734,\n\t5893:  0x00006731,\n\t5894:  0x00006735,\n\t5895:  0x00006B21,\n\t5896:  0x00006B64,\n\t5897:  0x00006B7B,\n\t5898:  0x00006C16,\n\t5899:  0x00006C5D,\n\t5900:  0x00006C57,\n\t5901:  0x00006C59,\n\t5902:  0x00006C5F,\n\t5903:  0x00006C60,\n\t5904:  0x00006C50,\n\t5905:  0x00006C55,\n\t5906:  0x00006C61,\n\t5907:  0x00006C5B,\n\t5908:  0x00006C4D,\n\t5909:  0x00006C4E,\n\t5910:  0x00007070,\n\t5911:  0x0000725F,\n\t5912:  0x0000725D,\n\t5913:  0x0000767E,\n\t5914:  0x00007AF9,\n\t5915:  0x00007C73,\n\t5916:  0x00007CF8,\n\t5917:  0x00007F36,\n\t5918:  0x00007F8A,\n\t5919:  0x00007FBD,\n\t5920:  0x00008001,\n\t5921:  0x00008003,\n\t5922:  0x0000800C,\n\t5923:  0x00008012,\n\t5924:  0x00008033,\n\t5925:  0x0000807F,\n\t5926:  0x00008089,\n\t5927:  0x0000808B,\n\t5928:  0x0000808C,\n\t5929:  0x000081E3,\n\t5930:  0x000081EA,\n\t5931:  0x000081F3,\n\t5932:  0x000081FC,\n\t5933:  0x0000820C,\n\t5934:  0x0000821B,\n\t5935:  0x0000821F,\n\t5936:  0x0000826E,\n\t5937:  0x00008272,\n\t5938:  0x0000827E,\n\t5939:  0x0000866B,\n\t5940:  0x00008840,\n\t5941:  0x0000884C,\n\t5942:  0x00008863,\n\t5943:  0x0000897F,\n\t5944:  0x00009621,\n\t5945:  0x00004E32,\n\t5946:  0x00004EA8,\n\t5947:  0x00004F4D,\n\t5948:  0x00004F4F,\n\t5949:  0x00004F47,\n\t5950:  0x00004F57,\n\t5951:  0x00004F5E,\n\t5952:  0x00004F34,\n\t5953:  0x00004F5B,\n\t5954:  0x00004F55,\n\t5955:  0x00004F30,\n\t5956:  0x00004F50,\n\t5957:  0x00004F51,\n\t5958:  0x00004F3D,\n\t5959:  0x00004F3A,\n\t5960:  0x00004F38,\n\t5961:  0x00004F43,\n\t5962:  0x00004F54,\n\t5963:  0x00004F3C,\n\t5964:  0x00004F46,\n\t5965:  0x00004F63,\n\t5966:  0x00004F5C,\n\t5967:  0x00004F60,\n\t5968:  0x00004F2F,\n\t5969:  0x00004F4E,\n\t5970:  0x00004F36,\n\t5971:  0x00004F59,\n\t5972:  0x00004F5D,\n\t5973:  0x00004F48,\n\t5974:  0x00004F5A,\n\t5975:  0x0000514C,\n\t5976:  0x0000514B,\n\t5977:  0x0000514D,\n\t5978:  0x00005175,\n\t5979:  0x000051B6,\n\t5980:  0x000051B7,\n\t5981:  0x00005225,\n\t5982:  0x00005224,\n\t5983:  0x00005229,\n\t5984:  0x0000522A,\n\t5985:  0x00005228,\n\t5986:  0x000052AB,\n\t5987:  0x000052A9,\n\t5988:  0x000052AA,\n\t5989:  0x000052AC,\n\t5990:  0x00005323,\n\t5991:  0x00005373,\n\t5992:  0x00005375,\n\t5993:  0x0000541D,\n\t5994:  0x0000542D,\n\t5995:  0x0000541E,\n\t5996:  0x0000543E,\n\t5997:  0x00005426,\n\t5998:  0x0000544E,\n\t5999:  0x00005427,\n\t6000:  0x00005446,\n\t6001:  0x00005443,\n\t6002:  0x00005433,\n\t6003:  0x00005448,\n\t6004:  0x00005442,\n\t6005:  0x0000541B,\n\t6006:  0x00005429,\n\t6007:  0x0000544A,\n\t6008:  0x00005439,\n\t6009:  0x0000543B,\n\t6010:  0x00005438,\n\t6011:  0x0000542E,\n\t6012:  0x00005435,\n\t6013:  0x00005436,\n\t6014:  0x00005420,\n\t6015:  0x0000543C,\n\t6016:  0x00005440,\n\t6017:  0x00005431,\n\t6018:  0x0000542B,\n\t6019:  0x0000541F,\n\t6020:  0x0000542C,\n\t6021:  0x000056EA,\n\t6022:  0x000056F0,\n\t6023:  0x000056E4,\n\t6024:  0x000056EB,\n\t6025:  0x0000574A,\n\t6026:  0x00005751,\n\t6027:  0x00005740,\n\t6028:  0x0000574D,\n\t6029:  0x00005747,\n\t6030:  0x0000574E,\n\t6031:  0x0000573E,\n\t6032:  0x00005750,\n\t6033:  0x0000574F,\n\t6034:  0x0000573B,\n\t6035:  0x000058EF,\n\t6036:  0x0000593E,\n\t6037:  0x0000599D,\n\t6038:  0x00005992,\n\t6039:  0x000059A8,\n\t6040:  0x0000599E,\n\t6041:  0x000059A3,\n\t6042:  0x00005999,\n\t6043:  0x00005996,\n\t6044:  0x0000598D,\n\t6045:  0x000059A4,\n\t6046:  0x00005993,\n\t6047:  0x0000598A,\n\t6048:  0x000059A5,\n\t6049:  0x00005B5D,\n\t6050:  0x00005B5C,\n\t6051:  0x00005B5A,\n\t6052:  0x00005B5B,\n\t6053:  0x00005B8C,\n\t6054:  0x00005B8B,\n\t6055:  0x00005B8F,\n\t6056:  0x00005C2C,\n\t6057:  0x00005C40,\n\t6058:  0x00005C41,\n\t6059:  0x00005C3F,\n\t6060:  0x00005C3E,\n\t6061:  0x00005C90,\n\t6062:  0x00005C91,\n\t6063:  0x00005C94,\n\t6064:  0x00005C8C,\n\t6065:  0x00005DEB,\n\t6066:  0x00005E0C,\n\t6067:  0x00005E8F,\n\t6068:  0x00005E87,\n\t6069:  0x00005E8A,\n\t6070:  0x00005EF7,\n\t6071:  0x00005F04,\n\t6072:  0x00005F1F,\n\t6073:  0x00005F64,\n\t6074:  0x00005F62,\n\t6075:  0x00005F77,\n\t6076:  0x00005F79,\n\t6077:  0x00005FD8,\n\t6078:  0x00005FCC,\n\t6079:  0x00005FD7,\n\t6080:  0x00005FCD,\n\t6081:  0x00005FF1,\n\t6082:  0x00005FEB,\n\t6083:  0x00005FF8,\n\t6084:  0x00005FEA,\n\t6085:  0x00006212,\n\t6086:  0x00006211,\n\t6087:  0x00006284,\n\t6088:  0x00006297,\n\t6089:  0x00006296,\n\t6090:  0x00006280,\n\t6091:  0x00006276,\n\t6092:  0x00006289,\n\t6093:  0x0000626D,\n\t6094:  0x0000628A,\n\t6095:  0x0000627C,\n\t6096:  0x0000627E,\n\t6097:  0x00006279,\n\t6098:  0x00006273,\n\t6099:  0x00006292,\n\t6100:  0x0000626F,\n\t6101:  0x00006298,\n\t6102:  0x0000626E,\n\t6103:  0x00006295,\n\t6104:  0x00006293,\n\t6105:  0x00006291,\n\t6106:  0x00006286,\n\t6107:  0x00006539,\n\t6108:  0x0000653B,\n\t6109:  0x00006538,\n\t6110:  0x000065F1,\n\t6111:  0x000066F4,\n\t6112:  0x0000675F,\n\t6113:  0x0000674E,\n\t6114:  0x0000674F,\n\t6115:  0x00006750,\n\t6116:  0x00006751,\n\t6117:  0x0000675C,\n\t6118:  0x00006756,\n\t6119:  0x0000675E,\n\t6120:  0x00006749,\n\t6121:  0x00006746,\n\t6122:  0x00006760,\n\t6123:  0x00006753,\n\t6124:  0x00006757,\n\t6125:  0x00006B65,\n\t6126:  0x00006BCF,\n\t6127:  0x00006C42,\n\t6128:  0x00006C5E,\n\t6129:  0x00006C99,\n\t6130:  0x00006C81,\n\t6131:  0x00006C88,\n\t6132:  0x00006C89,\n\t6133:  0x00006C85,\n\t6134:  0x00006C9B,\n\t6135:  0x00006C6A,\n\t6136:  0x00006C7A,\n\t6137:  0x00006C90,\n\t6138:  0x00006C70,\n\t6139:  0x00006C8C,\n\t6140:  0x00006C68,\n\t6141:  0x00006C96,\n\t6142:  0x00006C92,\n\t6143:  0x00006C7D,\n\t6144:  0x00006C83,\n\t6145:  0x00006C72,\n\t6146:  0x00006C7E,\n\t6147:  0x00006C74,\n\t6148:  0x00006C86,\n\t6149:  0x00006C76,\n\t6150:  0x00006C8D,\n\t6151:  0x00006C94,\n\t6152:  0x00006C98,\n\t6153:  0x00006C82,\n\t6154:  0x00007076,\n\t6155:  0x0000707C,\n\t6156:  0x0000707D,\n\t6157:  0x00007078,\n\t6158:  0x00007262,\n\t6159:  0x00007261,\n\t6160:  0x00007260,\n\t6161:  0x000072C4,\n\t6162:  0x000072C2,\n\t6163:  0x00007396,\n\t6164:  0x0000752C,\n\t6165:  0x0000752B,\n\t6166:  0x00007537,\n\t6167:  0x00007538,\n\t6168:  0x00007682,\n\t6169:  0x000076EF,\n\t6170:  0x000077E3,\n\t6171:  0x000079C1,\n\t6172:  0x000079C0,\n\t6173:  0x000079BF,\n\t6174:  0x00007A76,\n\t6175:  0x00007CFB,\n\t6176:  0x00007F55,\n\t6177:  0x00008096,\n\t6178:  0x00008093,\n\t6179:  0x0000809D,\n\t6180:  0x00008098,\n\t6181:  0x0000809B,\n\t6182:  0x0000809A,\n\t6183:  0x000080B2,\n\t6184:  0x0000826F,\n\t6185:  0x00008292,\n\t6186:  0x0000828B,\n\t6187:  0x0000828D,\n\t6188:  0x0000898B,\n\t6189:  0x000089D2,\n\t6190:  0x00008A00,\n\t6191:  0x00008C37,\n\t6192:  0x00008C46,\n\t6193:  0x00008C55,\n\t6194:  0x00008C9D,\n\t6195:  0x00008D64,\n\t6196:  0x00008D70,\n\t6197:  0x00008DB3,\n\t6198:  0x00008EAB,\n\t6199:  0x00008ECA,\n\t6200:  0x00008F9B,\n\t6201:  0x00008FB0,\n\t6202:  0x00008FC2,\n\t6203:  0x00008FC6,\n\t6204:  0x00008FC5,\n\t6205:  0x00008FC4,\n\t6206:  0x00005DE1,\n\t6207:  0x00009091,\n\t6208:  0x000090A2,\n\t6209:  0x000090AA,\n\t6210:  0x000090A6,\n\t6211:  0x000090A3,\n\t6212:  0x00009149,\n\t6213:  0x000091C6,\n\t6214:  0x000091CC,\n\t6215:  0x00009632,\n\t6216:  0x0000962E,\n\t6217:  0x00009631,\n\t6218:  0x0000962A,\n\t6219:  0x0000962C,\n\t6220:  0x00004E26,\n\t6221:  0x00004E56,\n\t6222:  0x00004E73,\n\t6223:  0x00004E8B,\n\t6224:  0x00004E9B,\n\t6225:  0x00004E9E,\n\t6226:  0x00004EAB,\n\t6227:  0x00004EAC,\n\t6228:  0x00004F6F,\n\t6229:  0x00004F9D,\n\t6230:  0x00004F8D,\n\t6231:  0x00004F73,\n\t6232:  0x00004F7F,\n\t6233:  0x00004F6C,\n\t6234:  0x00004F9B,\n\t6235:  0x00004F8B,\n\t6236:  0x00004F86,\n\t6237:  0x00004F83,\n\t6238:  0x00004F70,\n\t6239:  0x00004F75,\n\t6240:  0x00004F88,\n\t6241:  0x00004F69,\n\t6242:  0x00004F7B,\n\t6243:  0x00004F96,\n\t6244:  0x00004F7E,\n\t6245:  0x00004F8F,\n\t6246:  0x00004F91,\n\t6247:  0x00004F7A,\n\t6248:  0x00005154,\n\t6249:  0x00005152,\n\t6250:  0x00005155,\n\t6251:  0x00005169,\n\t6252:  0x00005177,\n\t6253:  0x00005176,\n\t6254:  0x00005178,\n\t6255:  0x000051BD,\n\t6256:  0x000051FD,\n\t6257:  0x0000523B,\n\t6258:  0x00005238,\n\t6259:  0x00005237,\n\t6260:  0x0000523A,\n\t6261:  0x00005230,\n\t6262:  0x0000522E,\n\t6263:  0x00005236,\n\t6264:  0x00005241,\n\t6265:  0x000052BE,\n\t6266:  0x000052BB,\n\t6267:  0x00005352,\n\t6268:  0x00005354,\n\t6269:  0x00005353,\n\t6270:  0x00005351,\n\t6271:  0x00005366,\n\t6272:  0x00005377,\n\t6273:  0x00005378,\n\t6274:  0x00005379,\n\t6275:  0x000053D6,\n\t6276:  0x000053D4,\n\t6277:  0x000053D7,\n\t6278:  0x00005473,\n\t6279:  0x00005475,\n\t6280:  0x00005496,\n\t6281:  0x00005478,\n\t6282:  0x00005495,\n\t6283:  0x00005480,\n\t6284:  0x0000547B,\n\t6285:  0x00005477,\n\t6286:  0x00005484,\n\t6287:  0x00005492,\n\t6288:  0x00005486,\n\t6289:  0x0000547C,\n\t6290:  0x00005490,\n\t6291:  0x00005471,\n\t6292:  0x00005476,\n\t6293:  0x0000548C,\n\t6294:  0x0000549A,\n\t6295:  0x00005462,\n\t6296:  0x00005468,\n\t6297:  0x0000548B,\n\t6298:  0x0000547D,\n\t6299:  0x0000548E,\n\t6300:  0x000056FA,\n\t6301:  0x00005783,\n\t6302:  0x00005777,\n\t6303:  0x0000576A,\n\t6304:  0x00005769,\n\t6305:  0x00005761,\n\t6306:  0x00005766,\n\t6307:  0x00005764,\n\t6308:  0x0000577C,\n\t6309:  0x0000591C,\n\t6310:  0x00005949,\n\t6311:  0x00005947,\n\t6312:  0x00005948,\n\t6313:  0x00005944,\n\t6314:  0x00005954,\n\t6315:  0x000059BE,\n\t6316:  0x000059BB,\n\t6317:  0x000059D4,\n\t6318:  0x000059B9,\n\t6319:  0x000059AE,\n\t6320:  0x000059D1,\n\t6321:  0x000059C6,\n\t6322:  0x000059D0,\n\t6323:  0x000059CD,\n\t6324:  0x000059CB,\n\t6325:  0x000059D3,\n\t6326:  0x000059CA,\n\t6327:  0x000059AF,\n\t6328:  0x000059B3,\n\t6329:  0x000059D2,\n\t6330:  0x000059C5,\n\t6331:  0x00005B5F,\n\t6332:  0x00005B64,\n\t6333:  0x00005B63,\n\t6334:  0x00005B97,\n\t6335:  0x00005B9A,\n\t6336:  0x00005B98,\n\t6337:  0x00005B9C,\n\t6338:  0x00005B99,\n\t6339:  0x00005B9B,\n\t6340:  0x00005C1A,\n\t6341:  0x00005C48,\n\t6342:  0x00005C45,\n\t6343:  0x00005C46,\n\t6344:  0x00005CB7,\n\t6345:  0x00005CA1,\n\t6346:  0x00005CB8,\n\t6347:  0x00005CA9,\n\t6348:  0x00005CAB,\n\t6349:  0x00005CB1,\n\t6350:  0x00005CB3,\n\t6351:  0x00005E18,\n\t6352:  0x00005E1A,\n\t6353:  0x00005E16,\n\t6354:  0x00005E15,\n\t6355:  0x00005E1B,\n\t6356:  0x00005E11,\n\t6357:  0x00005E78,\n\t6358:  0x00005E9A,\n\t6359:  0x00005E97,\n\t6360:  0x00005E9C,\n\t6361:  0x00005E95,\n\t6362:  0x00005E96,\n\t6363:  0x00005EF6,\n\t6364:  0x00005F26,\n\t6365:  0x00005F27,\n\t6366:  0x00005F29,\n\t6367:  0x00005F80,\n\t6368:  0x00005F81,\n\t6369:  0x00005F7F,\n\t6370:  0x00005F7C,\n\t6371:  0x00005FDD,\n\t6372:  0x00005FE0,\n\t6373:  0x00005FFD,\n\t6374:  0x00005FF5,\n\t6375:  0x00005FFF,\n\t6376:  0x0000600F,\n\t6377:  0x00006014,\n\t6378:  0x0000602F,\n\t6379:  0x00006035,\n\t6380:  0x00006016,\n\t6381:  0x0000602A,\n\t6382:  0x00006015,\n\t6383:  0x00006021,\n\t6384:  0x00006027,\n\t6385:  0x00006029,\n\t6386:  0x0000602B,\n\t6387:  0x0000601B,\n\t6388:  0x00006216,\n\t6389:  0x00006215,\n\t6390:  0x0000623F,\n\t6391:  0x0000623E,\n\t6392:  0x00006240,\n\t6393:  0x0000627F,\n\t6394:  0x000062C9,\n\t6395:  0x000062CC,\n\t6396:  0x000062C4,\n\t6397:  0x000062BF,\n\t6398:  0x000062C2,\n\t6399:  0x000062B9,\n\t6400:  0x000062D2,\n\t6401:  0x000062DB,\n\t6402:  0x000062AB,\n\t6403:  0x000062D3,\n\t6404:  0x000062D4,\n\t6405:  0x000062CB,\n\t6406:  0x000062C8,\n\t6407:  0x000062A8,\n\t6408:  0x000062BD,\n\t6409:  0x000062BC,\n\t6410:  0x000062D0,\n\t6411:  0x000062D9,\n\t6412:  0x000062C7,\n\t6413:  0x000062CD,\n\t6414:  0x000062B5,\n\t6415:  0x000062DA,\n\t6416:  0x000062B1,\n\t6417:  0x000062D8,\n\t6418:  0x000062D6,\n\t6419:  0x000062D7,\n\t6420:  0x000062C6,\n\t6421:  0x000062AC,\n\t6422:  0x000062CE,\n\t6423:  0x0000653E,\n\t6424:  0x000065A7,\n\t6425:  0x000065BC,\n\t6426:  0x000065FA,\n\t6427:  0x00006614,\n\t6428:  0x00006613,\n\t6429:  0x0000660C,\n\t6430:  0x00006606,\n\t6431:  0x00006602,\n\t6432:  0x0000660E,\n\t6433:  0x00006600,\n\t6434:  0x0000660F,\n\t6435:  0x00006615,\n\t6436:  0x0000660A,\n\t6437:  0x00006607,\n\t6438:  0x0000670D,\n\t6439:  0x0000670B,\n\t6440:  0x0000676D,\n\t6441:  0x0000678B,\n\t6442:  0x00006795,\n\t6443:  0x00006771,\n\t6444:  0x0000679C,\n\t6445:  0x00006773,\n\t6446:  0x00006777,\n\t6447:  0x00006787,\n\t6448:  0x0000679D,\n\t6449:  0x00006797,\n\t6450:  0x0000676F,\n\t6451:  0x00006770,\n\t6452:  0x0000677F,\n\t6453:  0x00006789,\n\t6454:  0x0000677E,\n\t6455:  0x00006790,\n\t6456:  0x00006775,\n\t6457:  0x0000679A,\n\t6458:  0x00006793,\n\t6459:  0x0000677C,\n\t6460:  0x0000676A,\n\t6461:  0x00006772,\n\t6462:  0x00006B23,\n\t6463:  0x00006B66,\n\t6464:  0x00006B67,\n\t6465:  0x00006B7F,\n\t6466:  0x00006C13,\n\t6467:  0x00006C1B,\n\t6468:  0x00006CE3,\n\t6469:  0x00006CE8,\n\t6470:  0x00006CF3,\n\t6471:  0x00006CB1,\n\t6472:  0x00006CCC,\n\t6473:  0x00006CE5,\n\t6474:  0x00006CB3,\n\t6475:  0x00006CBD,\n\t6476:  0x00006CBE,\n\t6477:  0x00006CBC,\n\t6478:  0x00006CE2,\n\t6479:  0x00006CAB,\n\t6480:  0x00006CD5,\n\t6481:  0x00006CD3,\n\t6482:  0x00006CB8,\n\t6483:  0x00006CC4,\n\t6484:  0x00006CB9,\n\t6485:  0x00006CC1,\n\t6486:  0x00006CAE,\n\t6487:  0x00006CD7,\n\t6488:  0x00006CC5,\n\t6489:  0x00006CF1,\n\t6490:  0x00006CBF,\n\t6491:  0x00006CBB,\n\t6492:  0x00006CE1,\n\t6493:  0x00006CDB,\n\t6494:  0x00006CCA,\n\t6495:  0x00006CAC,\n\t6496:  0x00006CEF,\n\t6497:  0x00006CDC,\n\t6498:  0x00006CD6,\n\t6499:  0x00006CE0,\n\t6500:  0x00007095,\n\t6501:  0x0000708E,\n\t6502:  0x00007092,\n\t6503:  0x0000708A,\n\t6504:  0x00007099,\n\t6505:  0x0000722C,\n\t6506:  0x0000722D,\n\t6507:  0x00007238,\n\t6508:  0x00007248,\n\t6509:  0x00007267,\n\t6510:  0x00007269,\n\t6511:  0x000072C0,\n\t6512:  0x000072CE,\n\t6513:  0x000072D9,\n\t6514:  0x000072D7,\n\t6515:  0x000072D0,\n\t6516:  0x000073A9,\n\t6517:  0x000073A8,\n\t6518:  0x0000739F,\n\t6519:  0x000073AB,\n\t6520:  0x000073A5,\n\t6521:  0x0000753D,\n\t6522:  0x0000759D,\n\t6523:  0x00007599,\n\t6524:  0x0000759A,\n\t6525:  0x00007684,\n\t6526:  0x000076C2,\n\t6527:  0x000076F2,\n\t6528:  0x000076F4,\n\t6529:  0x000077E5,\n\t6530:  0x000077FD,\n\t6531:  0x0000793E,\n\t6532:  0x00007940,\n\t6533:  0x00007941,\n\t6534:  0x000079C9,\n\t6535:  0x000079C8,\n\t6536:  0x00007A7A,\n\t6537:  0x00007A79,\n\t6538:  0x00007AFA,\n\t6539:  0x00007CFE,\n\t6540:  0x00007F54,\n\t6541:  0x00007F8C,\n\t6542:  0x00007F8B,\n\t6543:  0x00008005,\n\t6544:  0x000080BA,\n\t6545:  0x000080A5,\n\t6546:  0x000080A2,\n\t6547:  0x000080B1,\n\t6548:  0x000080A1,\n\t6549:  0x000080AB,\n\t6550:  0x000080A9,\n\t6551:  0x000080B4,\n\t6552:  0x000080AA,\n\t6553:  0x000080AF,\n\t6554:  0x000081E5,\n\t6555:  0x000081FE,\n\t6556:  0x0000820D,\n\t6557:  0x000082B3,\n\t6558:  0x0000829D,\n\t6559:  0x00008299,\n\t6560:  0x000082AD,\n\t6561:  0x000082BD,\n\t6562:  0x0000829F,\n\t6563:  0x000082B9,\n\t6564:  0x000082B1,\n\t6565:  0x000082AC,\n\t6566:  0x000082A5,\n\t6567:  0x000082AF,\n\t6568:  0x000082B8,\n\t6569:  0x000082A3,\n\t6570:  0x000082B0,\n\t6571:  0x000082BE,\n\t6572:  0x000082B7,\n\t6573:  0x0000864E,\n\t6574:  0x00008671,\n\t6575:  0x0000521D,\n\t6576:  0x00008868,\n\t6577:  0x00008ECB,\n\t6578:  0x00008FCE,\n\t6579:  0x00008FD4,\n\t6580:  0x00008FD1,\n\t6581:  0x000090B5,\n\t6582:  0x000090B8,\n\t6583:  0x000090B1,\n\t6584:  0x000090B6,\n\t6585:  0x000091C7,\n\t6586:  0x000091D1,\n\t6587:  0x00009577,\n\t6588:  0x00009580,\n\t6589:  0x0000961C,\n\t6590:  0x00009640,\n\t6591:  0x0000963F,\n\t6592:  0x0000963B,\n\t6593:  0x00009644,\n\t6594:  0x00009642,\n\t6595:  0x000096B9,\n\t6596:  0x000096E8,\n\t6597:  0x00009752,\n\t6598:  0x0000975E,\n\t6599:  0x00004E9F,\n\t6600:  0x00004EAD,\n\t6601:  0x00004EAE,\n\t6602:  0x00004FE1,\n\t6603:  0x00004FB5,\n\t6604:  0x00004FAF,\n\t6605:  0x00004FBF,\n\t6606:  0x00004FE0,\n\t6607:  0x00004FD1,\n\t6608:  0x00004FCF,\n\t6609:  0x00004FDD,\n\t6610:  0x00004FC3,\n\t6611:  0x00004FB6,\n\t6612:  0x00004FD8,\n\t6613:  0x00004FDF,\n\t6614:  0x00004FCA,\n\t6615:  0x00004FD7,\n\t6616:  0x00004FAE,\n\t6617:  0x00004FD0,\n\t6618:  0x00004FC4,\n\t6619:  0x00004FC2,\n\t6620:  0x00004FDA,\n\t6621:  0x00004FCE,\n\t6622:  0x00004FDE,\n\t6623:  0x00004FB7,\n\t6624:  0x00005157,\n\t6625:  0x00005192,\n\t6626:  0x00005191,\n\t6627:  0x000051A0,\n\t6628:  0x0000524E,\n\t6629:  0x00005243,\n\t6630:  0x0000524A,\n\t6631:  0x0000524D,\n\t6632:  0x0000524C,\n\t6633:  0x0000524B,\n\t6634:  0x00005247,\n\t6635:  0x000052C7,\n\t6636:  0x000052C9,\n\t6637:  0x000052C3,\n\t6638:  0x000052C1,\n\t6639:  0x0000530D,\n\t6640:  0x00005357,\n\t6641:  0x0000537B,\n\t6642:  0x0000539A,\n\t6643:  0x000053DB,\n\t6644:  0x000054AC,\n\t6645:  0x000054C0,\n\t6646:  0x000054A8,\n\t6647:  0x000054CE,\n\t6648:  0x000054C9,\n\t6649:  0x000054B8,\n\t6650:  0x000054A6,\n\t6651:  0x000054B3,\n\t6652:  0x000054C7,\n\t6653:  0x000054C2,\n\t6654:  0x000054BD,\n\t6655:  0x000054AA,\n\t6656:  0x000054C1,\n\t6657:  0x000054C4,\n\t6658:  0x000054C8,\n\t6659:  0x000054AF,\n\t6660:  0x000054AB,\n\t6661:  0x000054B1,\n\t6662:  0x000054BB,\n\t6663:  0x000054A9,\n\t6664:  0x000054A7,\n\t6665:  0x000054BF,\n\t6666:  0x000056FF,\n\t6667:  0x00005782,\n\t6668:  0x0000578B,\n\t6669:  0x000057A0,\n\t6670:  0x000057A3,\n\t6671:  0x000057A2,\n\t6672:  0x000057CE,\n\t6673:  0x000057AE,\n\t6674:  0x00005793,\n\t6675:  0x00005955,\n\t6676:  0x00005951,\n\t6677:  0x0000594F,\n\t6678:  0x0000594E,\n\t6679:  0x00005950,\n\t6680:  0x000059DC,\n\t6681:  0x000059D8,\n\t6682:  0x000059FF,\n\t6683:  0x000059E3,\n\t6684:  0x000059E8,\n\t6685:  0x00005A03,\n\t6686:  0x000059E5,\n\t6687:  0x000059EA,\n\t6688:  0x000059DA,\n\t6689:  0x000059E6,\n\t6690:  0x00005A01,\n\t6691:  0x000059FB,\n\t6692:  0x00005B69,\n\t6693:  0x00005BA3,\n\t6694:  0x00005BA6,\n\t6695:  0x00005BA4,\n\t6696:  0x00005BA2,\n\t6697:  0x00005BA5,\n\t6698:  0x00005C01,\n\t6699:  0x00005C4E,\n\t6700:  0x00005C4F,\n\t6701:  0x00005C4D,\n\t6702:  0x00005C4B,\n\t6703:  0x00005CD9,\n\t6704:  0x00005CD2,\n\t6705:  0x00005DF7,\n\t6706:  0x00005E1D,\n\t6707:  0x00005E25,\n\t6708:  0x00005E1F,\n\t6709:  0x00005E7D,\n\t6710:  0x00005EA0,\n\t6711:  0x00005EA6,\n\t6712:  0x00005EFA,\n\t6713:  0x00005F08,\n\t6714:  0x00005F2D,\n\t6715:  0x00005F65,\n\t6716:  0x00005F88,\n\t6717:  0x00005F85,\n\t6718:  0x00005F8A,\n\t6719:  0x00005F8B,\n\t6720:  0x00005F87,\n\t6721:  0x00005F8C,\n\t6722:  0x00005F89,\n\t6723:  0x00006012,\n\t6724:  0x0000601D,\n\t6725:  0x00006020,\n\t6726:  0x00006025,\n\t6727:  0x0000600E,\n\t6728:  0x00006028,\n\t6729:  0x0000604D,\n\t6730:  0x00006070,\n\t6731:  0x00006068,\n\t6732:  0x00006062,\n\t6733:  0x00006046,\n\t6734:  0x00006043,\n\t6735:  0x0000606C,\n\t6736:  0x0000606B,\n\t6737:  0x0000606A,\n\t6738:  0x00006064,\n\t6739:  0x00006241,\n\t6740:  0x000062DC,\n\t6741:  0x00006316,\n\t6742:  0x00006309,\n\t6743:  0x000062FC,\n\t6744:  0x000062ED,\n\t6745:  0x00006301,\n\t6746:  0x000062EE,\n\t6747:  0x000062FD,\n\t6748:  0x00006307,\n\t6749:  0x000062F1,\n\t6750:  0x000062F7,\n\t6751:  0x000062EF,\n\t6752:  0x000062EC,\n\t6753:  0x000062FE,\n\t6754:  0x000062F4,\n\t6755:  0x00006311,\n\t6756:  0x00006302,\n\t6757:  0x0000653F,\n\t6758:  0x00006545,\n\t6759:  0x000065AB,\n\t6760:  0x000065BD,\n\t6761:  0x000065E2,\n\t6762:  0x00006625,\n\t6763:  0x0000662D,\n\t6764:  0x00006620,\n\t6765:  0x00006627,\n\t6766:  0x0000662F,\n\t6767:  0x0000661F,\n\t6768:  0x00006628,\n\t6769:  0x00006631,\n\t6770:  0x00006624,\n\t6771:  0x000066F7,\n\t6772:  0x000067FF,\n\t6773:  0x000067D3,\n\t6774:  0x000067F1,\n\t6775:  0x000067D4,\n\t6776:  0x000067D0,\n\t6777:  0x000067EC,\n\t6778:  0x000067B6,\n\t6779:  0x000067AF,\n\t6780:  0x000067F5,\n\t6781:  0x000067E9,\n\t6782:  0x000067EF,\n\t6783:  0x000067C4,\n\t6784:  0x000067D1,\n\t6785:  0x000067B4,\n\t6786:  0x000067DA,\n\t6787:  0x000067E5,\n\t6788:  0x000067B8,\n\t6789:  0x000067CF,\n\t6790:  0x000067DE,\n\t6791:  0x000067F3,\n\t6792:  0x000067B0,\n\t6793:  0x000067D9,\n\t6794:  0x000067E2,\n\t6795:  0x000067DD,\n\t6796:  0x000067D2,\n\t6797:  0x00006B6A,\n\t6798:  0x00006B83,\n\t6799:  0x00006B86,\n\t6800:  0x00006BB5,\n\t6801:  0x00006BD2,\n\t6802:  0x00006BD7,\n\t6803:  0x00006C1F,\n\t6804:  0x00006CC9,\n\t6805:  0x00006D0B,\n\t6806:  0x00006D32,\n\t6807:  0x00006D2A,\n\t6808:  0x00006D41,\n\t6809:  0x00006D25,\n\t6810:  0x00006D0C,\n\t6811:  0x00006D31,\n\t6812:  0x00006D1E,\n\t6813:  0x00006D17,\n\t6814:  0x00006D3B,\n\t6815:  0x00006D3D,\n\t6816:  0x00006D3E,\n\t6817:  0x00006D36,\n\t6818:  0x00006D1B,\n\t6819:  0x00006CF5,\n\t6820:  0x00006D39,\n\t6821:  0x00006D27,\n\t6822:  0x00006D38,\n\t6823:  0x00006D29,\n\t6824:  0x00006D2E,\n\t6825:  0x00006D35,\n\t6826:  0x00006D0E,\n\t6827:  0x00006D2B,\n\t6828:  0x000070AB,\n\t6829:  0x000070BA,\n\t6830:  0x000070B3,\n\t6831:  0x000070AC,\n\t6832:  0x000070AF,\n\t6833:  0x000070AD,\n\t6834:  0x000070B8,\n\t6835:  0x000070AE,\n\t6836:  0x000070A4,\n\t6837:  0x00007230,\n\t6838:  0x00007272,\n\t6839:  0x0000726F,\n\t6840:  0x00007274,\n\t6841:  0x000072E9,\n\t6842:  0x000072E0,\n\t6843:  0x000072E1,\n\t6844:  0x000073B7,\n\t6845:  0x000073CA,\n\t6846:  0x000073BB,\n\t6847:  0x000073B2,\n\t6848:  0x000073CD,\n\t6849:  0x000073C0,\n\t6850:  0x000073B3,\n\t6851:  0x0000751A,\n\t6852:  0x0000752D,\n\t6853:  0x0000754F,\n\t6854:  0x0000754C,\n\t6855:  0x0000754E,\n\t6856:  0x0000754B,\n\t6857:  0x000075AB,\n\t6858:  0x000075A4,\n\t6859:  0x000075A5,\n\t6860:  0x000075A2,\n\t6861:  0x000075A3,\n\t6862:  0x00007678,\n\t6863:  0x00007686,\n\t6864:  0x00007687,\n\t6865:  0x00007688,\n\t6866:  0x000076C8,\n\t6867:  0x000076C6,\n\t6868:  0x000076C3,\n\t6869:  0x000076C5,\n\t6870:  0x00007701,\n\t6871:  0x000076F9,\n\t6872:  0x000076F8,\n\t6873:  0x00007709,\n\t6874:  0x0000770B,\n\t6875:  0x000076FE,\n\t6876:  0x000076FC,\n\t6877:  0x00007707,\n\t6878:  0x000077DC,\n\t6879:  0x00007802,\n\t6880:  0x00007814,\n\t6881:  0x0000780C,\n\t6882:  0x0000780D,\n\t6883:  0x00007946,\n\t6884:  0x00007949,\n\t6885:  0x00007948,\n\t6886:  0x00007947,\n\t6887:  0x000079B9,\n\t6888:  0x000079BA,\n\t6889:  0x000079D1,\n\t6890:  0x000079D2,\n\t6891:  0x000079CB,\n\t6892:  0x00007A7F,\n\t6893:  0x00007A81,\n\t6894:  0x00007AFF,\n\t6895:  0x00007AFD,\n\t6896:  0x00007C7D,\n\t6897:  0x00007D02,\n\t6898:  0x00007D05,\n\t6899:  0x00007D00,\n\t6900:  0x00007D09,\n\t6901:  0x00007D07,\n\t6902:  0x00007D04,\n\t6903:  0x00007D06,\n\t6904:  0x00007F38,\n\t6905:  0x00007F8E,\n\t6906:  0x00007FBF,\n\t6907:  0x00008004,\n\t6908:  0x00008010,\n\t6909:  0x0000800D,\n\t6910:  0x00008011,\n\t6911:  0x00008036,\n\t6912:  0x000080D6,\n\t6913:  0x000080E5,\n\t6914:  0x000080DA,\n\t6915:  0x000080C3,\n\t6916:  0x000080C4,\n\t6917:  0x000080CC,\n\t6918:  0x000080E1,\n\t6919:  0x000080DB,\n\t6920:  0x000080CE,\n\t6921:  0x000080DE,\n\t6922:  0x000080E4,\n\t6923:  0x000080DD,\n\t6924:  0x000081F4,\n\t6925:  0x00008222,\n\t6926:  0x000082E7,\n\t6927:  0x00008303,\n\t6928:  0x00008305,\n\t6929:  0x000082E3,\n\t6930:  0x000082DB,\n\t6931:  0x000082E6,\n\t6932:  0x00008304,\n\t6933:  0x000082E5,\n\t6934:  0x00008302,\n\t6935:  0x00008309,\n\t6936:  0x000082D2,\n\t6937:  0x000082D7,\n\t6938:  0x000082F1,\n\t6939:  0x00008301,\n\t6940:  0x000082DC,\n\t6941:  0x000082D4,\n\t6942:  0x000082D1,\n\t6943:  0x000082DE,\n\t6944:  0x000082D3,\n\t6945:  0x000082DF,\n\t6946:  0x000082EF,\n\t6947:  0x00008306,\n\t6948:  0x00008650,\n\t6949:  0x00008679,\n\t6950:  0x0000867B,\n\t6951:  0x0000867A,\n\t6952:  0x0000884D,\n\t6953:  0x0000886B,\n\t6954:  0x00008981,\n\t6955:  0x000089D4,\n\t6956:  0x00008A08,\n\t6957:  0x00008A02,\n\t6958:  0x00008A03,\n\t6959:  0x00008C9E,\n\t6960:  0x00008CA0,\n\t6961:  0x00008D74,\n\t6962:  0x00008D73,\n\t6963:  0x00008DB4,\n\t6964:  0x00008ECD,\n\t6965:  0x00008ECC,\n\t6966:  0x00008FF0,\n\t6967:  0x00008FE6,\n\t6968:  0x00008FE2,\n\t6969:  0x00008FEA,\n\t6970:  0x00008FE5,\n\t6971:  0x00008FED,\n\t6972:  0x00008FEB,\n\t6973:  0x00008FE4,\n\t6974:  0x00008FE8,\n\t6975:  0x000090CA,\n\t6976:  0x000090CE,\n\t6977:  0x000090C1,\n\t6978:  0x000090C3,\n\t6979:  0x0000914B,\n\t6980:  0x0000914A,\n\t6981:  0x000091CD,\n\t6982:  0x00009582,\n\t6983:  0x00009650,\n\t6984:  0x0000964B,\n\t6985:  0x0000964C,\n\t6986:  0x0000964D,\n\t6987:  0x00009762,\n\t6988:  0x00009769,\n\t6989:  0x000097CB,\n\t6990:  0x000097ED,\n\t6991:  0x000097F3,\n\t6992:  0x00009801,\n\t6993:  0x000098A8,\n\t6994:  0x000098DB,\n\t6995:  0x000098DF,\n\t6996:  0x00009996,\n\t6997:  0x00009999,\n\t6998:  0x00004E58,\n\t6999:  0x00004EB3,\n\t7000:  0x0000500C,\n\t7001:  0x0000500D,\n\t7002:  0x00005023,\n\t7003:  0x00004FEF,\n\t7004:  0x00005026,\n\t7005:  0x00005025,\n\t7006:  0x00004FF8,\n\t7007:  0x00005029,\n\t7008:  0x00005016,\n\t7009:  0x00005006,\n\t7010:  0x0000503C,\n\t7011:  0x0000501F,\n\t7012:  0x0000501A,\n\t7013:  0x00005012,\n\t7014:  0x00005011,\n\t7015:  0x00004FFA,\n\t7016:  0x00005000,\n\t7017:  0x00005014,\n\t7018:  0x00005028,\n\t7019:  0x00004FF1,\n\t7020:  0x00005021,\n\t7021:  0x0000500B,\n\t7022:  0x00005019,\n\t7023:  0x00005018,\n\t7024:  0x00004FF3,\n\t7025:  0x00004FEE,\n\t7026:  0x0000502D,\n\t7027:  0x0000502A,\n\t7028:  0x00004FFE,\n\t7029:  0x0000502B,\n\t7030:  0x00005009,\n\t7031:  0x0000517C,\n\t7032:  0x000051A4,\n\t7033:  0x000051A5,\n\t7034:  0x000051A2,\n\t7035:  0x000051CD,\n\t7036:  0x000051CC,\n\t7037:  0x000051C6,\n\t7038:  0x000051CB,\n\t7039:  0x00005256,\n\t7040:  0x0000525C,\n\t7041:  0x00005254,\n\t7042:  0x0000525B,\n\t7043:  0x0000525D,\n\t7044:  0x0000532A,\n\t7045:  0x0000537F,\n\t7046:  0x0000539F,\n\t7047:  0x0000539D,\n\t7048:  0x000053DF,\n\t7049:  0x000054E8,\n\t7050:  0x00005510,\n\t7051:  0x00005501,\n\t7052:  0x00005537,\n\t7053:  0x000054FC,\n\t7054:  0x000054E5,\n\t7055:  0x000054F2,\n\t7056:  0x00005506,\n\t7057:  0x000054FA,\n\t7058:  0x00005514,\n\t7059:  0x000054E9,\n\t7060:  0x000054ED,\n\t7061:  0x000054E1,\n\t7062:  0x00005509,\n\t7063:  0x000054EE,\n\t7064:  0x000054EA,\n\t7065:  0x000054E6,\n\t7066:  0x00005527,\n\t7067:  0x00005507,\n\t7068:  0x000054FD,\n\t7069:  0x0000550F,\n\t7070:  0x00005703,\n\t7071:  0x00005704,\n\t7072:  0x000057C2,\n\t7073:  0x000057D4,\n\t7074:  0x000057CB,\n\t7075:  0x000057C3,\n\t7076:  0x00005809,\n\t7077:  0x0000590F,\n\t7078:  0x00005957,\n\t7079:  0x00005958,\n\t7080:  0x0000595A,\n\t7081:  0x00005A11,\n\t7082:  0x00005A18,\n\t7083:  0x00005A1C,\n\t7084:  0x00005A1F,\n\t7085:  0x00005A1B,\n\t7086:  0x00005A13,\n\t7087:  0x000059EC,\n\t7088:  0x00005A20,\n\t7089:  0x00005A23,\n\t7090:  0x00005A29,\n\t7091:  0x00005A25,\n\t7092:  0x00005A0C,\n\t7093:  0x00005A09,\n\t7094:  0x00005B6B,\n\t7095:  0x00005C58,\n\t7096:  0x00005BB0,\n\t7097:  0x00005BB3,\n\t7098:  0x00005BB6,\n\t7099:  0x00005BB4,\n\t7100:  0x00005BAE,\n\t7101:  0x00005BB5,\n\t7102:  0x00005BB9,\n\t7103:  0x00005BB8,\n\t7104:  0x00005C04,\n\t7105:  0x00005C51,\n\t7106:  0x00005C55,\n\t7107:  0x00005C50,\n\t7108:  0x00005CED,\n\t7109:  0x00005CFD,\n\t7110:  0x00005CFB,\n\t7111:  0x00005CEA,\n\t7112:  0x00005CE8,\n\t7113:  0x00005CF0,\n\t7114:  0x00005CF6,\n\t7115:  0x00005D01,\n\t7116:  0x00005CF4,\n\t7117:  0x00005DEE,\n\t7118:  0x00005E2D,\n\t7119:  0x00005E2B,\n\t7120:  0x00005EAB,\n\t7121:  0x00005EAD,\n\t7122:  0x00005EA7,\n\t7123:  0x00005F31,\n\t7124:  0x00005F92,\n\t7125:  0x00005F91,\n\t7126:  0x00005F90,\n\t7127:  0x00006059,\n\t7128:  0x00006063,\n\t7129:  0x00006065,\n\t7130:  0x00006050,\n\t7131:  0x00006055,\n\t7132:  0x0000606D,\n\t7133:  0x00006069,\n\t7134:  0x0000606F,\n\t7135:  0x00006084,\n\t7136:  0x0000609F,\n\t7137:  0x0000609A,\n\t7138:  0x0000608D,\n\t7139:  0x00006094,\n\t7140:  0x0000608C,\n\t7141:  0x00006085,\n\t7142:  0x00006096,\n\t7143:  0x00006247,\n\t7144:  0x000062F3,\n\t7145:  0x00006308,\n\t7146:  0x000062FF,\n\t7147:  0x0000634E,\n\t7148:  0x0000633E,\n\t7149:  0x0000632F,\n\t7150:  0x00006355,\n\t7151:  0x00006342,\n\t7152:  0x00006346,\n\t7153:  0x0000634F,\n\t7154:  0x00006349,\n\t7155:  0x0000633A,\n\t7156:  0x00006350,\n\t7157:  0x0000633D,\n\t7158:  0x0000632A,\n\t7159:  0x0000632B,\n\t7160:  0x00006328,\n\t7161:  0x0000634D,\n\t7162:  0x0000634C,\n\t7163:  0x00006548,\n\t7164:  0x00006549,\n\t7165:  0x00006599,\n\t7166:  0x000065C1,\n\t7167:  0x000065C5,\n\t7168:  0x00006642,\n\t7169:  0x00006649,\n\t7170:  0x0000664F,\n\t7171:  0x00006643,\n\t7172:  0x00006652,\n\t7173:  0x0000664C,\n\t7174:  0x00006645,\n\t7175:  0x00006641,\n\t7176:  0x000066F8,\n\t7177:  0x00006714,\n\t7178:  0x00006715,\n\t7179:  0x00006717,\n\t7180:  0x00006821,\n\t7181:  0x00006838,\n\t7182:  0x00006848,\n\t7183:  0x00006846,\n\t7184:  0x00006853,\n\t7185:  0x00006839,\n\t7186:  0x00006842,\n\t7187:  0x00006854,\n\t7188:  0x00006829,\n\t7189:  0x000068B3,\n\t7190:  0x00006817,\n\t7191:  0x0000684C,\n\t7192:  0x00006851,\n\t7193:  0x0000683D,\n\t7194:  0x000067F4,\n\t7195:  0x00006850,\n\t7196:  0x00006840,\n\t7197:  0x0000683C,\n\t7198:  0x00006843,\n\t7199:  0x0000682A,\n\t7200:  0x00006845,\n\t7201:  0x00006813,\n\t7202:  0x00006818,\n\t7203:  0x00006841,\n\t7204:  0x00006B8A,\n\t7205:  0x00006B89,\n\t7206:  0x00006BB7,\n\t7207:  0x00006C23,\n\t7208:  0x00006C27,\n\t7209:  0x00006C28,\n\t7210:  0x00006C26,\n\t7211:  0x00006C24,\n\t7212:  0x00006CF0,\n\t7213:  0x00006D6A,\n\t7214:  0x00006D95,\n\t7215:  0x00006D88,\n\t7216:  0x00006D87,\n\t7217:  0x00006D66,\n\t7218:  0x00006D78,\n\t7219:  0x00006D77,\n\t7220:  0x00006D59,\n\t7221:  0x00006D93,\n\t7222:  0x00006D6C,\n\t7223:  0x00006D89,\n\t7224:  0x00006D6E,\n\t7225:  0x00006D5A,\n\t7226:  0x00006D74,\n\t7227:  0x00006D69,\n\t7228:  0x00006D8C,\n\t7229:  0x00006D8A,\n\t7230:  0x00006D79,\n\t7231:  0x00006D85,\n\t7232:  0x00006D65,\n\t7233:  0x00006D94,\n\t7234:  0x000070CA,\n\t7235:  0x000070D8,\n\t7236:  0x000070E4,\n\t7237:  0x000070D9,\n\t7238:  0x000070C8,\n\t7239:  0x000070CF,\n\t7240:  0x00007239,\n\t7241:  0x00007279,\n\t7242:  0x000072FC,\n\t7243:  0x000072F9,\n\t7244:  0x000072FD,\n\t7245:  0x000072F8,\n\t7246:  0x000072F7,\n\t7247:  0x00007386,\n\t7248:  0x000073ED,\n\t7249:  0x00007409,\n\t7250:  0x000073EE,\n\t7251:  0x000073E0,\n\t7252:  0x000073EA,\n\t7253:  0x000073DE,\n\t7254:  0x00007554,\n\t7255:  0x0000755D,\n\t7256:  0x0000755C,\n\t7257:  0x0000755A,\n\t7258:  0x00007559,\n\t7259:  0x000075BE,\n\t7260:  0x000075C5,\n\t7261:  0x000075C7,\n\t7262:  0x000075B2,\n\t7263:  0x000075B3,\n\t7264:  0x000075BD,\n\t7265:  0x000075BC,\n\t7266:  0x000075B9,\n\t7267:  0x000075C2,\n\t7268:  0x000075B8,\n\t7269:  0x0000768B,\n\t7270:  0x000076B0,\n\t7271:  0x000076CA,\n\t7272:  0x000076CD,\n\t7273:  0x000076CE,\n\t7274:  0x00007729,\n\t7275:  0x0000771F,\n\t7276:  0x00007720,\n\t7277:  0x00007728,\n\t7278:  0x000077E9,\n\t7279:  0x00007830,\n\t7280:  0x00007827,\n\t7281:  0x00007838,\n\t7282:  0x0000781D,\n\t7283:  0x00007834,\n\t7284:  0x00007837,\n\t7285:  0x00007825,\n\t7286:  0x0000782D,\n\t7287:  0x00007820,\n\t7288:  0x0000781F,\n\t7289:  0x00007832,\n\t7290:  0x00007955,\n\t7291:  0x00007950,\n\t7292:  0x00007960,\n\t7293:  0x0000795F,\n\t7294:  0x00007956,\n\t7295:  0x0000795E,\n\t7296:  0x0000795D,\n\t7297:  0x00007957,\n\t7298:  0x0000795A,\n\t7299:  0x000079E4,\n\t7300:  0x000079E3,\n\t7301:  0x000079E7,\n\t7302:  0x000079DF,\n\t7303:  0x000079E6,\n\t7304:  0x000079E9,\n\t7305:  0x000079D8,\n\t7306:  0x00007A84,\n\t7307:  0x00007A88,\n\t7308:  0x00007AD9,\n\t7309:  0x00007B06,\n\t7310:  0x00007B11,\n\t7311:  0x00007C89,\n\t7312:  0x00007D21,\n\t7313:  0x00007D17,\n\t7314:  0x00007D0B,\n\t7315:  0x00007D0A,\n\t7316:  0x00007D20,\n\t7317:  0x00007D22,\n\t7318:  0x00007D14,\n\t7319:  0x00007D10,\n\t7320:  0x00007D15,\n\t7321:  0x00007D1A,\n\t7322:  0x00007D1C,\n\t7323:  0x00007D0D,\n\t7324:  0x00007D19,\n\t7325:  0x00007D1B,\n\t7326:  0x00007F3A,\n\t7327:  0x00007F5F,\n\t7328:  0x00007F94,\n\t7329:  0x00007FC5,\n\t7330:  0x00007FC1,\n\t7331:  0x00008006,\n\t7332:  0x00008018,\n\t7333:  0x00008015,\n\t7334:  0x00008019,\n\t7335:  0x00008017,\n\t7336:  0x0000803D,\n\t7337:  0x0000803F,\n\t7338:  0x000080F1,\n\t7339:  0x00008102,\n\t7340:  0x000080F0,\n\t7341:  0x00008105,\n\t7342:  0x000080ED,\n\t7343:  0x000080F4,\n\t7344:  0x00008106,\n\t7345:  0x000080F8,\n\t7346:  0x000080F3,\n\t7347:  0x00008108,\n\t7348:  0x000080FD,\n\t7349:  0x0000810A,\n\t7350:  0x000080FC,\n\t7351:  0x000080EF,\n\t7352:  0x000081ED,\n\t7353:  0x000081EC,\n\t7354:  0x00008200,\n\t7355:  0x00008210,\n\t7356:  0x0000822A,\n\t7357:  0x0000822B,\n\t7358:  0x00008228,\n\t7359:  0x0000822C,\n\t7360:  0x000082BB,\n\t7361:  0x0000832B,\n\t7362:  0x00008352,\n\t7363:  0x00008354,\n\t7364:  0x0000834A,\n\t7365:  0x00008338,\n\t7366:  0x00008350,\n\t7367:  0x00008349,\n\t7368:  0x00008335,\n\t7369:  0x00008334,\n\t7370:  0x0000834F,\n\t7371:  0x00008332,\n\t7372:  0x00008339,\n\t7373:  0x00008336,\n\t7374:  0x00008317,\n\t7375:  0x00008340,\n\t7376:  0x00008331,\n\t7377:  0x00008328,\n\t7378:  0x00008343,\n\t7379:  0x00008654,\n\t7380:  0x0000868A,\n\t7381:  0x000086AA,\n\t7382:  0x00008693,\n\t7383:  0x000086A4,\n\t7384:  0x000086A9,\n\t7385:  0x0000868C,\n\t7386:  0x000086A3,\n\t7387:  0x0000869C,\n\t7388:  0x00008870,\n\t7389:  0x00008877,\n\t7390:  0x00008881,\n\t7391:  0x00008882,\n\t7392:  0x0000887D,\n\t7393:  0x00008879,\n\t7394:  0x00008A18,\n\t7395:  0x00008A10,\n\t7396:  0x00008A0E,\n\t7397:  0x00008A0C,\n\t7398:  0x00008A15,\n\t7399:  0x00008A0A,\n\t7400:  0x00008A17,\n\t7401:  0x00008A13,\n\t7402:  0x00008A16,\n\t7403:  0x00008A0F,\n\t7404:  0x00008A11,\n\t7405:  0x00008C48,\n\t7406:  0x00008C7A,\n\t7407:  0x00008C79,\n\t7408:  0x00008CA1,\n\t7409:  0x00008CA2,\n\t7410:  0x00008D77,\n\t7411:  0x00008EAC,\n\t7412:  0x00008ED2,\n\t7413:  0x00008ED4,\n\t7414:  0x00008ECF,\n\t7415:  0x00008FB1,\n\t7416:  0x00009001,\n\t7417:  0x00009006,\n\t7418:  0x00008FF7,\n\t7419:  0x00009000,\n\t7420:  0x00008FFA,\n\t7421:  0x00008FF4,\n\t7422:  0x00009003,\n\t7423:  0x00008FFD,\n\t7424:  0x00009005,\n\t7425:  0x00008FF8,\n\t7426:  0x00009095,\n\t7427:  0x000090E1,\n\t7428:  0x000090DD,\n\t7429:  0x000090E2,\n\t7430:  0x00009152,\n\t7431:  0x0000914D,\n\t7432:  0x0000914C,\n\t7433:  0x000091D8,\n\t7434:  0x000091DD,\n\t7435:  0x000091D7,\n\t7436:  0x000091DC,\n\t7437:  0x000091D9,\n\t7438:  0x00009583,\n\t7439:  0x00009662,\n\t7440:  0x00009663,\n\t7441:  0x00009661,\n\t7442:  0x0000965B,\n\t7443:  0x0000965D,\n\t7444:  0x00009664,\n\t7445:  0x00009658,\n\t7446:  0x0000965E,\n\t7447:  0x000096BB,\n\t7448:  0x000098E2,\n\t7449:  0x000099AC,\n\t7450:  0x00009AA8,\n\t7451:  0x00009AD8,\n\t7452:  0x00009B25,\n\t7453:  0x00009B32,\n\t7454:  0x00009B3C,\n\t7455:  0x00004E7E,\n\t7456:  0x0000507A,\n\t7457:  0x0000507D,\n\t7458:  0x0000505C,\n\t7459:  0x00005047,\n\t7460:  0x00005043,\n\t7461:  0x0000504C,\n\t7462:  0x0000505A,\n\t7463:  0x00005049,\n\t7464:  0x00005065,\n\t7465:  0x00005076,\n\t7466:  0x0000504E,\n\t7467:  0x00005055,\n\t7468:  0x00005075,\n\t7469:  0x00005074,\n\t7470:  0x00005077,\n\t7471:  0x0000504F,\n\t7472:  0x0000500F,\n\t7473:  0x0000506F,\n\t7474:  0x0000506D,\n\t7475:  0x0000515C,\n\t7476:  0x00005195,\n\t7477:  0x000051F0,\n\t7478:  0x0000526A,\n\t7479:  0x0000526F,\n\t7480:  0x000052D2,\n\t7481:  0x000052D9,\n\t7482:  0x000052D8,\n\t7483:  0x000052D5,\n\t7484:  0x00005310,\n\t7485:  0x0000530F,\n\t7486:  0x00005319,\n\t7487:  0x0000533F,\n\t7488:  0x00005340,\n\t7489:  0x0000533E,\n\t7490:  0x000053C3,\n\t7491:  0x000066FC,\n\t7492:  0x00005546,\n\t7493:  0x0000556A,\n\t7494:  0x00005566,\n\t7495:  0x00005544,\n\t7496:  0x0000555E,\n\t7497:  0x00005561,\n\t7498:  0x00005543,\n\t7499:  0x0000554A,\n\t7500:  0x00005531,\n\t7501:  0x00005556,\n\t7502:  0x0000554F,\n\t7503:  0x00005555,\n\t7504:  0x0000552F,\n\t7505:  0x00005564,\n\t7506:  0x00005538,\n\t7507:  0x0000552E,\n\t7508:  0x0000555C,\n\t7509:  0x0000552C,\n\t7510:  0x00005563,\n\t7511:  0x00005533,\n\t7512:  0x00005541,\n\t7513:  0x00005557,\n\t7514:  0x00005708,\n\t7515:  0x0000570B,\n\t7516:  0x00005709,\n\t7517:  0x000057DF,\n\t7518:  0x00005805,\n\t7519:  0x0000580A,\n\t7520:  0x00005806,\n\t7521:  0x000057E0,\n\t7522:  0x000057E4,\n\t7523:  0x000057FA,\n\t7524:  0x00005802,\n\t7525:  0x00005835,\n\t7526:  0x000057F7,\n\t7527:  0x000057F9,\n\t7528:  0x00005920,\n\t7529:  0x00005962,\n\t7530:  0x00005A36,\n\t7531:  0x00005A41,\n\t7532:  0x00005A49,\n\t7533:  0x00005A66,\n\t7534:  0x00005A6A,\n\t7535:  0x00005A40,\n\t7536:  0x00005A3C,\n\t7537:  0x00005A62,\n\t7538:  0x00005A5A,\n\t7539:  0x00005A46,\n\t7540:  0x00005A4A,\n\t7541:  0x00005B70,\n\t7542:  0x00005BC7,\n\t7543:  0x00005BC5,\n\t7544:  0x00005BC4,\n\t7545:  0x00005BC2,\n\t7546:  0x00005BBF,\n\t7547:  0x00005BC6,\n\t7548:  0x00005C09,\n\t7549:  0x00005C08,\n\t7550:  0x00005C07,\n\t7551:  0x00005C60,\n\t7552:  0x00005C5C,\n\t7553:  0x00005C5D,\n\t7554:  0x00005D07,\n\t7555:  0x00005D06,\n\t7556:  0x00005D0E,\n\t7557:  0x00005D1B,\n\t7558:  0x00005D16,\n\t7559:  0x00005D22,\n\t7560:  0x00005D11,\n\t7561:  0x00005D29,\n\t7562:  0x00005D14,\n\t7563:  0x00005D19,\n\t7564:  0x00005D24,\n\t7565:  0x00005D27,\n\t7566:  0x00005D17,\n\t7567:  0x00005DE2,\n\t7568:  0x00005E38,\n\t7569:  0x00005E36,\n\t7570:  0x00005E33,\n\t7571:  0x00005E37,\n\t7572:  0x00005EB7,\n\t7573:  0x00005EB8,\n\t7574:  0x00005EB6,\n\t7575:  0x00005EB5,\n\t7576:  0x00005EBE,\n\t7577:  0x00005F35,\n\t7578:  0x00005F37,\n\t7579:  0x00005F57,\n\t7580:  0x00005F6C,\n\t7581:  0x00005F69,\n\t7582:  0x00005F6B,\n\t7583:  0x00005F97,\n\t7584:  0x00005F99,\n\t7585:  0x00005F9E,\n\t7586:  0x00005F98,\n\t7587:  0x00005FA1,\n\t7588:  0x00005FA0,\n\t7589:  0x00005F9C,\n\t7590:  0x0000607F,\n\t7591:  0x000060A3,\n\t7592:  0x00006089,\n\t7593:  0x000060A0,\n\t7594:  0x000060A8,\n\t7595:  0x000060CB,\n\t7596:  0x000060B4,\n\t7597:  0x000060E6,\n\t7598:  0x000060BD,\n\t7599:  0x000060C5,\n\t7600:  0x000060BB,\n\t7601:  0x000060B5,\n\t7602:  0x000060DC,\n\t7603:  0x000060BC,\n\t7604:  0x000060D8,\n\t7605:  0x000060D5,\n\t7606:  0x000060C6,\n\t7607:  0x000060DF,\n\t7608:  0x000060B8,\n\t7609:  0x000060DA,\n\t7610:  0x000060C7,\n\t7611:  0x0000621A,\n\t7612:  0x0000621B,\n\t7613:  0x00006248,\n\t7614:  0x000063A0,\n\t7615:  0x000063A7,\n\t7616:  0x00006372,\n\t7617:  0x00006396,\n\t7618:  0x000063A2,\n\t7619:  0x000063A5,\n\t7620:  0x00006377,\n\t7621:  0x00006367,\n\t7622:  0x00006398,\n\t7623:  0x000063AA,\n\t7624:  0x00006371,\n\t7625:  0x000063A9,\n\t7626:  0x00006389,\n\t7627:  0x00006383,\n\t7628:  0x0000639B,\n\t7629:  0x0000636B,\n\t7630:  0x000063A8,\n\t7631:  0x00006384,\n\t7632:  0x00006388,\n\t7633:  0x00006399,\n\t7634:  0x000063A1,\n\t7635:  0x000063AC,\n\t7636:  0x00006392,\n\t7637:  0x0000638F,\n\t7638:  0x00006380,\n\t7639:  0x0000637B,\n\t7640:  0x00006369,\n\t7641:  0x00006368,\n\t7642:  0x0000637A,\n\t7643:  0x0000655D,\n\t7644:  0x00006556,\n\t7645:  0x00006551,\n\t7646:  0x00006559,\n\t7647:  0x00006557,\n\t7648:  0x0000555F,\n\t7649:  0x0000654F,\n\t7650:  0x00006558,\n\t7651:  0x00006555,\n\t7652:  0x00006554,\n\t7653:  0x0000659C,\n\t7654:  0x0000659B,\n\t7655:  0x000065AC,\n\t7656:  0x000065CF,\n\t7657:  0x000065CB,\n\t7658:  0x000065CC,\n\t7659:  0x000065CE,\n\t7660:  0x0000665D,\n\t7661:  0x0000665A,\n\t7662:  0x00006664,\n\t7663:  0x00006668,\n\t7664:  0x00006666,\n\t7665:  0x0000665E,\n\t7666:  0x000066F9,\n\t7667:  0x000052D7,\n\t7668:  0x0000671B,\n\t7669:  0x00006881,\n\t7670:  0x000068AF,\n\t7671:  0x000068A2,\n\t7672:  0x00006893,\n\t7673:  0x000068B5,\n\t7674:  0x0000687F,\n\t7675:  0x00006876,\n\t7676:  0x000068B1,\n\t7677:  0x000068A7,\n\t7678:  0x00006897,\n\t7679:  0x000068B0,\n\t7680:  0x00006883,\n\t7681:  0x000068C4,\n\t7682:  0x000068AD,\n\t7683:  0x00006886,\n\t7684:  0x00006885,\n\t7685:  0x00006894,\n\t7686:  0x0000689D,\n\t7687:  0x000068A8,\n\t7688:  0x0000689F,\n\t7689:  0x000068A1,\n\t7690:  0x00006882,\n\t7691:  0x00006B32,\n\t7692:  0x00006BBA,\n\t7693:  0x00006BEB,\n\t7694:  0x00006BEC,\n\t7695:  0x00006C2B,\n\t7696:  0x00006D8E,\n\t7697:  0x00006DBC,\n\t7698:  0x00006DF3,\n\t7699:  0x00006DD9,\n\t7700:  0x00006DB2,\n\t7701:  0x00006DE1,\n\t7702:  0x00006DCC,\n\t7703:  0x00006DE4,\n\t7704:  0x00006DFB,\n\t7705:  0x00006DFA,\n\t7706:  0x00006E05,\n\t7707:  0x00006DC7,\n\t7708:  0x00006DCB,\n\t7709:  0x00006DAF,\n\t7710:  0x00006DD1,\n\t7711:  0x00006DAE,\n\t7712:  0x00006DDE,\n\t7713:  0x00006DF9,\n\t7714:  0x00006DB8,\n\t7715:  0x00006DF7,\n\t7716:  0x00006DF5,\n\t7717:  0x00006DC5,\n\t7718:  0x00006DD2,\n\t7719:  0x00006E1A,\n\t7720:  0x00006DB5,\n\t7721:  0x00006DDA,\n\t7722:  0x00006DEB,\n\t7723:  0x00006DD8,\n\t7724:  0x00006DEA,\n\t7725:  0x00006DF1,\n\t7726:  0x00006DEE,\n\t7727:  0x00006DE8,\n\t7728:  0x00006DC6,\n\t7729:  0x00006DC4,\n\t7730:  0x00006DAA,\n\t7731:  0x00006DEC,\n\t7732:  0x00006DBF,\n\t7733:  0x00006DE6,\n\t7734:  0x000070F9,\n\t7735:  0x00007109,\n\t7736:  0x0000710A,\n\t7737:  0x000070FD,\n\t7738:  0x000070EF,\n\t7739:  0x0000723D,\n\t7740:  0x0000727D,\n\t7741:  0x00007281,\n\t7742:  0x0000731C,\n\t7743:  0x0000731B,\n\t7744:  0x00007316,\n\t7745:  0x00007313,\n\t7746:  0x00007319,\n\t7747:  0x00007387,\n\t7748:  0x00007405,\n\t7749:  0x0000740A,\n\t7750:  0x00007403,\n\t7751:  0x00007406,\n\t7752:  0x000073FE,\n\t7753:  0x0000740D,\n\t7754:  0x000074E0,\n\t7755:  0x000074F6,\n\t7756:  0x000074F7,\n\t7757:  0x0000751C,\n\t7758:  0x00007522,\n\t7759:  0x00007565,\n\t7760:  0x00007566,\n\t7761:  0x00007562,\n\t7762:  0x00007570,\n\t7763:  0x0000758F,\n\t7764:  0x000075D4,\n\t7765:  0x000075D5,\n\t7766:  0x000075B5,\n\t7767:  0x000075CA,\n\t7768:  0x000075CD,\n\t7769:  0x0000768E,\n\t7770:  0x000076D4,\n\t7771:  0x000076D2,\n\t7772:  0x000076DB,\n\t7773:  0x00007737,\n\t7774:  0x0000773E,\n\t7775:  0x0000773C,\n\t7776:  0x00007736,\n\t7777:  0x00007738,\n\t7778:  0x0000773A,\n\t7779:  0x0000786B,\n\t7780:  0x00007843,\n\t7781:  0x0000784E,\n\t7782:  0x00007965,\n\t7783:  0x00007968,\n\t7784:  0x0000796D,\n\t7785:  0x000079FB,\n\t7786:  0x00007A92,\n\t7787:  0x00007A95,\n\t7788:  0x00007B20,\n\t7789:  0x00007B28,\n\t7790:  0x00007B1B,\n\t7791:  0x00007B2C,\n\t7792:  0x00007B26,\n\t7793:  0x00007B19,\n\t7794:  0x00007B1E,\n\t7795:  0x00007B2E,\n\t7796:  0x00007C92,\n\t7797:  0x00007C97,\n\t7798:  0x00007C95,\n\t7799:  0x00007D46,\n\t7800:  0x00007D43,\n\t7801:  0x00007D71,\n\t7802:  0x00007D2E,\n\t7803:  0x00007D39,\n\t7804:  0x00007D3C,\n\t7805:  0x00007D40,\n\t7806:  0x00007D30,\n\t7807:  0x00007D33,\n\t7808:  0x00007D44,\n\t7809:  0x00007D2F,\n\t7810:  0x00007D42,\n\t7811:  0x00007D32,\n\t7812:  0x00007D31,\n\t7813:  0x00007F3D,\n\t7814:  0x00007F9E,\n\t7815:  0x00007F9A,\n\t7816:  0x00007FCC,\n\t7817:  0x00007FCE,\n\t7818:  0x00007FD2,\n\t7819:  0x0000801C,\n\t7820:  0x0000804A,\n\t7821:  0x00008046,\n\t7822:  0x0000812F,\n\t7823:  0x00008116,\n\t7824:  0x00008123,\n\t7825:  0x0000812B,\n\t7826:  0x00008129,\n\t7827:  0x00008130,\n\t7828:  0x00008124,\n\t7829:  0x00008202,\n\t7830:  0x00008235,\n\t7831:  0x00008237,\n\t7832:  0x00008236,\n\t7833:  0x00008239,\n\t7834:  0x0000838E,\n\t7835:  0x0000839E,\n\t7836:  0x00008398,\n\t7837:  0x00008378,\n\t7838:  0x000083A2,\n\t7839:  0x00008396,\n\t7840:  0x000083BD,\n\t7841:  0x000083AB,\n\t7842:  0x00008392,\n\t7843:  0x0000838A,\n\t7844:  0x00008393,\n\t7845:  0x00008389,\n\t7846:  0x000083A0,\n\t7847:  0x00008377,\n\t7848:  0x0000837B,\n\t7849:  0x0000837C,\n\t7850:  0x00008386,\n\t7851:  0x000083A7,\n\t7852:  0x00008655,\n\t7853:  0x00005F6A,\n\t7854:  0x000086C7,\n\t7855:  0x000086C0,\n\t7856:  0x000086B6,\n\t7857:  0x000086C4,\n\t7858:  0x000086B5,\n\t7859:  0x000086C6,\n\t7860:  0x000086CB,\n\t7861:  0x000086B1,\n\t7862:  0x000086AF,\n\t7863:  0x000086C9,\n\t7864:  0x00008853,\n\t7865:  0x0000889E,\n\t7866:  0x00008888,\n\t7867:  0x000088AB,\n\t7868:  0x00008892,\n\t7869:  0x00008896,\n\t7870:  0x0000888D,\n\t7871:  0x0000888B,\n\t7872:  0x00008993,\n\t7873:  0x0000898F,\n\t7874:  0x00008A2A,\n\t7875:  0x00008A1D,\n\t7876:  0x00008A23,\n\t7877:  0x00008A25,\n\t7878:  0x00008A31,\n\t7879:  0x00008A2D,\n\t7880:  0x00008A1F,\n\t7881:  0x00008A1B,\n\t7882:  0x00008A22,\n\t7883:  0x00008C49,\n\t7884:  0x00008C5A,\n\t7885:  0x00008CA9,\n\t7886:  0x00008CAC,\n\t7887:  0x00008CAB,\n\t7888:  0x00008CA8,\n\t7889:  0x00008CAA,\n\t7890:  0x00008CA7,\n\t7891:  0x00008D67,\n\t7892:  0x00008D66,\n\t7893:  0x00008DBE,\n\t7894:  0x00008DBA,\n\t7895:  0x00008EDB,\n\t7896:  0x00008EDF,\n\t7897:  0x00009019,\n\t7898:  0x0000900D,\n\t7899:  0x0000901A,\n\t7900:  0x00009017,\n\t7901:  0x00009023,\n\t7902:  0x0000901F,\n\t7903:  0x0000901D,\n\t7904:  0x00009010,\n\t7905:  0x00009015,\n\t7906:  0x0000901E,\n\t7907:  0x00009020,\n\t7908:  0x0000900F,\n\t7909:  0x00009022,\n\t7910:  0x00009016,\n\t7911:  0x0000901B,\n\t7912:  0x00009014,\n\t7913:  0x000090E8,\n\t7914:  0x000090ED,\n\t7915:  0x000090FD,\n\t7916:  0x00009157,\n\t7917:  0x000091CE,\n\t7918:  0x000091F5,\n\t7919:  0x000091E6,\n\t7920:  0x000091E3,\n\t7921:  0x000091E7,\n\t7922:  0x000091ED,\n\t7923:  0x000091E9,\n\t7924:  0x00009589,\n\t7925:  0x0000966A,\n\t7926:  0x00009675,\n\t7927:  0x00009673,\n\t7928:  0x00009678,\n\t7929:  0x00009670,\n\t7930:  0x00009674,\n\t7931:  0x00009676,\n\t7932:  0x00009677,\n\t7933:  0x0000966C,\n\t7934:  0x000096C0,\n\t7935:  0x000096EA,\n\t7936:  0x000096E9,\n\t7937:  0x00007AE0,\n\t7938:  0x00007ADF,\n\t7939:  0x00009802,\n\t7940:  0x00009803,\n\t7941:  0x00009B5A,\n\t7942:  0x00009CE5,\n\t7943:  0x00009E75,\n\t7944:  0x00009E7F,\n\t7945:  0x00009EA5,\n\t7946:  0x00009EBB,\n\t7947:  0x000050A2,\n\t7948:  0x0000508D,\n\t7949:  0x00005085,\n\t7950:  0x00005099,\n\t7951:  0x00005091,\n\t7952:  0x00005080,\n\t7953:  0x00005096,\n\t7954:  0x00005098,\n\t7955:  0x0000509A,\n\t7956:  0x00006700,\n\t7957:  0x000051F1,\n\t7958:  0x00005272,\n\t7959:  0x00005274,\n\t7960:  0x00005275,\n\t7961:  0x00005269,\n\t7962:  0x000052DE,\n\t7963:  0x000052DD,\n\t7964:  0x000052DB,\n\t7965:  0x0000535A,\n\t7966:  0x000053A5,\n\t7967:  0x0000557B,\n\t7968:  0x00005580,\n\t7969:  0x000055A7,\n\t7970:  0x0000557C,\n\t7971:  0x0000558A,\n\t7972:  0x0000559D,\n\t7973:  0x00005598,\n\t7974:  0x00005582,\n\t7975:  0x0000559C,\n\t7976:  0x000055AA,\n\t7977:  0x00005594,\n\t7978:  0x00005587,\n\t7979:  0x0000558B,\n\t7980:  0x00005583,\n\t7981:  0x000055B3,\n\t7982:  0x000055AE,\n\t7983:  0x0000559F,\n\t7984:  0x0000553E,\n\t7985:  0x000055B2,\n\t7986:  0x0000559A,\n\t7987:  0x000055BB,\n\t7988:  0x000055AC,\n\t7989:  0x000055B1,\n\t7990:  0x0000557E,\n\t7991:  0x00005589,\n\t7992:  0x000055AB,\n\t7993:  0x00005599,\n\t7994:  0x0000570D,\n\t7995:  0x0000582F,\n\t7996:  0x0000582A,\n\t7997:  0x00005834,\n\t7998:  0x00005824,\n\t7999:  0x00005830,\n\t8000:  0x00005831,\n\t8001:  0x00005821,\n\t8002:  0x0000581D,\n\t8003:  0x00005820,\n\t8004:  0x000058F9,\n\t8005:  0x000058FA,\n\t8006:  0x00005960,\n\t8007:  0x00005A77,\n\t8008:  0x00005A9A,\n\t8009:  0x00005A7F,\n\t8010:  0x00005A92,\n\t8011:  0x00005A9B,\n\t8012:  0x00005AA7,\n\t8013:  0x00005B73,\n\t8014:  0x00005B71,\n\t8015:  0x00005BD2,\n\t8016:  0x00005BCC,\n\t8017:  0x00005BD3,\n\t8018:  0x00005BD0,\n\t8019:  0x00005C0A,\n\t8020:  0x00005C0B,\n\t8021:  0x00005C31,\n\t8022:  0x00005D4C,\n\t8023:  0x00005D50,\n\t8024:  0x00005D34,\n\t8025:  0x00005D47,\n\t8026:  0x00005DFD,\n\t8027:  0x00005E45,\n\t8028:  0x00005E3D,\n\t8029:  0x00005E40,\n\t8030:  0x00005E43,\n\t8031:  0x00005E7E,\n\t8032:  0x00005ECA,\n\t8033:  0x00005EC1,\n\t8034:  0x00005EC2,\n\t8035:  0x00005EC4,\n\t8036:  0x00005F3C,\n\t8037:  0x00005F6D,\n\t8038:  0x00005FA9,\n\t8039:  0x00005FAA,\n\t8040:  0x00005FA8,\n\t8041:  0x000060D1,\n\t8042:  0x000060E1,\n\t8043:  0x000060B2,\n\t8044:  0x000060B6,\n\t8045:  0x000060E0,\n\t8046:  0x0000611C,\n\t8047:  0x00006123,\n\t8048:  0x000060FA,\n\t8049:  0x00006115,\n\t8050:  0x000060F0,\n\t8051:  0x000060FB,\n\t8052:  0x000060F4,\n\t8053:  0x00006168,\n\t8054:  0x000060F1,\n\t8055:  0x0000610E,\n\t8056:  0x000060F6,\n\t8057:  0x00006109,\n\t8058:  0x00006100,\n\t8059:  0x00006112,\n\t8060:  0x0000621F,\n\t8061:  0x00006249,\n\t8062:  0x000063A3,\n\t8063:  0x0000638C,\n\t8064:  0x000063CF,\n\t8065:  0x000063C0,\n\t8066:  0x000063E9,\n\t8067:  0x000063C9,\n\t8068:  0x000063C6,\n\t8069:  0x000063CD,\n\t8070:  0x000063D2,\n\t8071:  0x000063E3,\n\t8072:  0x000063D0,\n\t8073:  0x000063E1,\n\t8074:  0x000063D6,\n\t8075:  0x000063ED,\n\t8076:  0x000063EE,\n\t8077:  0x00006376,\n\t8078:  0x000063F4,\n\t8079:  0x000063EA,\n\t8080:  0x000063DB,\n\t8081:  0x00006452,\n\t8082:  0x000063DA,\n\t8083:  0x000063F9,\n\t8084:  0x0000655E,\n\t8085:  0x00006566,\n\t8086:  0x00006562,\n\t8087:  0x00006563,\n\t8088:  0x00006591,\n\t8089:  0x00006590,\n\t8090:  0x000065AF,\n\t8091:  0x0000666E,\n\t8092:  0x00006670,\n\t8093:  0x00006674,\n\t8094:  0x00006676,\n\t8095:  0x0000666F,\n\t8096:  0x00006691,\n\t8097:  0x0000667A,\n\t8098:  0x0000667E,\n\t8099:  0x00006677,\n\t8100:  0x000066FE,\n\t8101:  0x000066FF,\n\t8102:  0x0000671F,\n\t8103:  0x0000671D,\n\t8104:  0x000068FA,\n\t8105:  0x000068D5,\n\t8106:  0x000068E0,\n\t8107:  0x000068D8,\n\t8108:  0x000068D7,\n\t8109:  0x00006905,\n\t8110:  0x000068DF,\n\t8111:  0x000068F5,\n\t8112:  0x000068EE,\n\t8113:  0x000068E7,\n\t8114:  0x000068F9,\n\t8115:  0x000068D2,\n\t8116:  0x000068F2,\n\t8117:  0x000068E3,\n\t8118:  0x000068CB,\n\t8119:  0x000068CD,\n\t8120:  0x0000690D,\n\t8121:  0x00006912,\n\t8122:  0x0000690E,\n\t8123:  0x000068C9,\n\t8124:  0x000068DA,\n\t8125:  0x0000696E,\n\t8126:  0x000068FB,\n\t8127:  0x00006B3E,\n\t8128:  0x00006B3A,\n\t8129:  0x00006B3D,\n\t8130:  0x00006B98,\n\t8131:  0x00006B96,\n\t8132:  0x00006BBC,\n\t8133:  0x00006BEF,\n\t8134:  0x00006C2E,\n\t8135:  0x00006C2F,\n\t8136:  0x00006C2C,\n\t8137:  0x00006E2F,\n\t8138:  0x00006E38,\n\t8139:  0x00006E54,\n\t8140:  0x00006E21,\n\t8141:  0x00006E32,\n\t8142:  0x00006E67,\n\t8143:  0x00006E4A,\n\t8144:  0x00006E20,\n\t8145:  0x00006E25,\n\t8146:  0x00006E23,\n\t8147:  0x00006E1B,\n\t8148:  0x00006E5B,\n\t8149:  0x00006E58,\n\t8150:  0x00006E24,\n\t8151:  0x00006E56,\n\t8152:  0x00006E6E,\n\t8153:  0x00006E2D,\n\t8154:  0x00006E26,\n\t8155:  0x00006E6F,\n\t8156:  0x00006E34,\n\t8157:  0x00006E4D,\n\t8158:  0x00006E3A,\n\t8159:  0x00006E2C,\n\t8160:  0x00006E43,\n\t8161:  0x00006E1D,\n\t8162:  0x00006E3E,\n\t8163:  0x00006ECB,\n\t8164:  0x00006E89,\n\t8165:  0x00006E19,\n\t8166:  0x00006E4E,\n\t8167:  0x00006E63,\n\t8168:  0x00006E44,\n\t8169:  0x00006E72,\n\t8170:  0x00006E69,\n\t8171:  0x00006E5F,\n\t8172:  0x00007119,\n\t8173:  0x0000711A,\n\t8174:  0x00007126,\n\t8175:  0x00007130,\n\t8176:  0x00007121,\n\t8177:  0x00007136,\n\t8178:  0x0000716E,\n\t8179:  0x0000711C,\n\t8180:  0x0000724C,\n\t8181:  0x00007284,\n\t8182:  0x00007280,\n\t8183:  0x00007336,\n\t8184:  0x00007325,\n\t8185:  0x00007334,\n\t8186:  0x00007329,\n\t8187:  0x0000743A,\n\t8188:  0x0000742A,\n\t8189:  0x00007433,\n\t8190:  0x00007422,\n\t8191:  0x00007425,\n\t8192:  0x00007435,\n\t8193:  0x00007436,\n\t8194:  0x00007434,\n\t8195:  0x0000742F,\n\t8196:  0x0000741B,\n\t8197:  0x00007426,\n\t8198:  0x00007428,\n\t8199:  0x00007525,\n\t8200:  0x00007526,\n\t8201:  0x0000756B,\n\t8202:  0x0000756A,\n\t8203:  0x000075E2,\n\t8204:  0x000075DB,\n\t8205:  0x000075E3,\n\t8206:  0x000075D9,\n\t8207:  0x000075D8,\n\t8208:  0x000075DE,\n\t8209:  0x000075E0,\n\t8210:  0x0000767B,\n\t8211:  0x0000767C,\n\t8212:  0x00007696,\n\t8213:  0x00007693,\n\t8214:  0x000076B4,\n\t8215:  0x000076DC,\n\t8216:  0x0000774F,\n\t8217:  0x000077ED,\n\t8218:  0x0000785D,\n\t8219:  0x0000786C,\n\t8220:  0x0000786F,\n\t8221:  0x00007A0D,\n\t8222:  0x00007A08,\n\t8223:  0x00007A0B,\n\t8224:  0x00007A05,\n\t8225:  0x00007A00,\n\t8226:  0x00007A98,\n\t8227:  0x00007A97,\n\t8228:  0x00007A96,\n\t8229:  0x00007AE5,\n\t8230:  0x00007AE3,\n\t8231:  0x00007B49,\n\t8232:  0x00007B56,\n\t8233:  0x00007B46,\n\t8234:  0x00007B50,\n\t8235:  0x00007B52,\n\t8236:  0x00007B54,\n\t8237:  0x00007B4D,\n\t8238:  0x00007B4B,\n\t8239:  0x00007B4F,\n\t8240:  0x00007B51,\n\t8241:  0x00007C9F,\n\t8242:  0x00007CA5,\n\t8243:  0x00007D5E,\n\t8244:  0x00007D50,\n\t8245:  0x00007D68,\n\t8246:  0x00007D55,\n\t8247:  0x00007D2B,\n\t8248:  0x00007D6E,\n\t8249:  0x00007D72,\n\t8250:  0x00007D61,\n\t8251:  0x00007D66,\n\t8252:  0x00007D62,\n\t8253:  0x00007D70,\n\t8254:  0x00007D73,\n\t8255:  0x00005584,\n\t8256:  0x00007FD4,\n\t8257:  0x00007FD5,\n\t8258:  0x0000800B,\n\t8259:  0x00008052,\n\t8260:  0x00008085,\n\t8261:  0x00008155,\n\t8262:  0x00008154,\n\t8263:  0x0000814B,\n\t8264:  0x00008151,\n\t8265:  0x0000814E,\n\t8266:  0x00008139,\n\t8267:  0x00008146,\n\t8268:  0x0000813E,\n\t8269:  0x0000814C,\n\t8270:  0x00008153,\n\t8271:  0x00008174,\n\t8272:  0x00008212,\n\t8273:  0x0000821C,\n\t8274:  0x000083E9,\n\t8275:  0x00008403,\n\t8276:  0x000083F8,\n\t8277:  0x0000840D,\n\t8278:  0x000083E0,\n\t8279:  0x000083C5,\n\t8280:  0x0000840B,\n\t8281:  0x000083C1,\n\t8282:  0x000083EF,\n\t8283:  0x000083F1,\n\t8284:  0x000083F4,\n\t8285:  0x00008457,\n\t8286:  0x0000840A,\n\t8287:  0x000083F0,\n\t8288:  0x0000840C,\n\t8289:  0x000083CC,\n\t8290:  0x000083FD,\n\t8291:  0x000083F2,\n\t8292:  0x000083CA,\n\t8293:  0x00008438,\n\t8294:  0x0000840E,\n\t8295:  0x00008404,\n\t8296:  0x000083DC,\n\t8297:  0x00008407,\n\t8298:  0x000083D4,\n\t8299:  0x000083DF,\n\t8300:  0x0000865B,\n\t8301:  0x000086DF,\n\t8302:  0x000086D9,\n\t8303:  0x000086ED,\n\t8304:  0x000086D4,\n\t8305:  0x000086DB,\n\t8306:  0x000086E4,\n\t8307:  0x000086D0,\n\t8308:  0x000086DE,\n\t8309:  0x00008857,\n\t8310:  0x000088C1,\n\t8311:  0x000088C2,\n\t8312:  0x000088B1,\n\t8313:  0x00008983,\n\t8314:  0x00008996,\n\t8315:  0x00008A3B,\n\t8316:  0x00008A60,\n\t8317:  0x00008A55,\n\t8318:  0x00008A5E,\n\t8319:  0x00008A3C,\n\t8320:  0x00008A41,\n\t8321:  0x00008A54,\n\t8322:  0x00008A5B,\n\t8323:  0x00008A50,\n\t8324:  0x00008A46,\n\t8325:  0x00008A34,\n\t8326:  0x00008A3A,\n\t8327:  0x00008A36,\n\t8328:  0x00008A56,\n\t8329:  0x00008C61,\n\t8330:  0x00008C82,\n\t8331:  0x00008CAF,\n\t8332:  0x00008CBC,\n\t8333:  0x00008CB3,\n\t8334:  0x00008CBD,\n\t8335:  0x00008CC1,\n\t8336:  0x00008CBB,\n\t8337:  0x00008CC0,\n\t8338:  0x00008CB4,\n\t8339:  0x00008CB7,\n\t8340:  0x00008CB6,\n\t8341:  0x00008CBF,\n\t8342:  0x00008CB8,\n\t8343:  0x00008D8A,\n\t8344:  0x00008D85,\n\t8345:  0x00008D81,\n\t8346:  0x00008DCE,\n\t8347:  0x00008DDD,\n\t8348:  0x00008DCB,\n\t8349:  0x00008DDA,\n\t8350:  0x00008DD1,\n\t8351:  0x00008DCC,\n\t8352:  0x00008DDB,\n\t8353:  0x00008DC6,\n\t8354:  0x00008EFB,\n\t8355:  0x00008EF8,\n\t8356:  0x00008EFC,\n\t8357:  0x00008F9C,\n\t8358:  0x0000902E,\n\t8359:  0x00009035,\n\t8360:  0x00009031,\n\t8361:  0x00009038,\n\t8362:  0x00009032,\n\t8363:  0x00009036,\n\t8364:  0x00009102,\n\t8365:  0x000090F5,\n\t8366:  0x00009109,\n\t8367:  0x000090FE,\n\t8368:  0x00009163,\n\t8369:  0x00009165,\n\t8370:  0x000091CF,\n\t8371:  0x00009214,\n\t8372:  0x00009215,\n\t8373:  0x00009223,\n\t8374:  0x00009209,\n\t8375:  0x0000921E,\n\t8376:  0x0000920D,\n\t8377:  0x00009210,\n\t8378:  0x00009207,\n\t8379:  0x00009211,\n\t8380:  0x00009594,\n\t8381:  0x0000958F,\n\t8382:  0x0000958B,\n\t8383:  0x00009591,\n\t8384:  0x00009593,\n\t8385:  0x00009592,\n\t8386:  0x0000958E,\n\t8387:  0x0000968A,\n\t8388:  0x0000968E,\n\t8389:  0x0000968B,\n\t8390:  0x0000967D,\n\t8391:  0x00009685,\n\t8392:  0x00009686,\n\t8393:  0x0000968D,\n\t8394:  0x00009672,\n\t8395:  0x00009684,\n\t8396:  0x000096C1,\n\t8397:  0x000096C5,\n\t8398:  0x000096C4,\n\t8399:  0x000096C6,\n\t8400:  0x000096C7,\n\t8401:  0x000096EF,\n\t8402:  0x000096F2,\n\t8403:  0x000097CC,\n\t8404:  0x00009805,\n\t8405:  0x00009806,\n\t8406:  0x00009808,\n\t8407:  0x000098E7,\n\t8408:  0x000098EA,\n\t8409:  0x000098EF,\n\t8410:  0x000098E9,\n\t8411:  0x000098F2,\n\t8412:  0x000098ED,\n\t8413:  0x000099AE,\n\t8414:  0x000099AD,\n\t8415:  0x00009EC3,\n\t8416:  0x00009ECD,\n\t8417:  0x00009ED1,\n\t8418:  0x00004E82,\n\t8419:  0x000050AD,\n\t8420:  0x000050B5,\n\t8421:  0x000050B2,\n\t8422:  0x000050B3,\n\t8423:  0x000050C5,\n\t8424:  0x000050BE,\n\t8425:  0x000050AC,\n\t8426:  0x000050B7,\n\t8427:  0x000050BB,\n\t8428:  0x000050AF,\n\t8429:  0x000050C7,\n\t8430:  0x0000527F,\n\t8431:  0x00005277,\n\t8432:  0x0000527D,\n\t8433:  0x000052DF,\n\t8434:  0x000052E6,\n\t8435:  0x000052E4,\n\t8436:  0x000052E2,\n\t8437:  0x000052E3,\n\t8438:  0x0000532F,\n\t8439:  0x000055DF,\n\t8440:  0x000055E8,\n\t8441:  0x000055D3,\n\t8442:  0x000055E6,\n\t8443:  0x000055CE,\n\t8444:  0x000055DC,\n\t8445:  0x000055C7,\n\t8446:  0x000055D1,\n\t8447:  0x000055E3,\n\t8448:  0x000055E4,\n\t8449:  0x000055EF,\n\t8450:  0x000055DA,\n\t8451:  0x000055E1,\n\t8452:  0x000055C5,\n\t8453:  0x000055C6,\n\t8454:  0x000055E5,\n\t8455:  0x000055C9,\n\t8456:  0x00005712,\n\t8457:  0x00005713,\n\t8458:  0x0000585E,\n\t8459:  0x00005851,\n\t8460:  0x00005858,\n\t8461:  0x00005857,\n\t8462:  0x0000585A,\n\t8463:  0x00005854,\n\t8464:  0x0000586B,\n\t8465:  0x0000584C,\n\t8466:  0x0000586D,\n\t8467:  0x0000584A,\n\t8468:  0x00005862,\n\t8469:  0x00005852,\n\t8470:  0x0000584B,\n\t8471:  0x00005967,\n\t8472:  0x00005AC1,\n\t8473:  0x00005AC9,\n\t8474:  0x00005ACC,\n\t8475:  0x00005ABE,\n\t8476:  0x00005ABD,\n\t8477:  0x00005ABC,\n\t8478:  0x00005AB3,\n\t8479:  0x00005AC2,\n\t8480:  0x00005AB2,\n\t8481:  0x00005D69,\n\t8482:  0x00005D6F,\n\t8483:  0x00005E4C,\n\t8484:  0x00005E79,\n\t8485:  0x00005EC9,\n\t8486:  0x00005EC8,\n\t8487:  0x00005F12,\n\t8488:  0x00005F59,\n\t8489:  0x00005FAC,\n\t8490:  0x00005FAE,\n\t8491:  0x0000611A,\n\t8492:  0x0000610F,\n\t8493:  0x00006148,\n\t8494:  0x0000611F,\n\t8495:  0x000060F3,\n\t8496:  0x0000611B,\n\t8497:  0x000060F9,\n\t8498:  0x00006101,\n\t8499:  0x00006108,\n\t8500:  0x0000614E,\n\t8501:  0x0000614C,\n\t8502:  0x00006144,\n\t8503:  0x0000614D,\n\t8504:  0x0000613E,\n\t8505:  0x00006134,\n\t8506:  0x00006127,\n\t8507:  0x0000610D,\n\t8508:  0x00006106,\n\t8509:  0x00006137,\n\t8510:  0x00006221,\n\t8511:  0x00006222,\n\t8512:  0x00006413,\n\t8513:  0x0000643E,\n\t8514:  0x0000641E,\n\t8515:  0x0000642A,\n\t8516:  0x0000642D,\n\t8517:  0x0000643D,\n\t8518:  0x0000642C,\n\t8519:  0x0000640F,\n\t8520:  0x0000641C,\n\t8521:  0x00006414,\n\t8522:  0x0000640D,\n\t8523:  0x00006436,\n\t8524:  0x00006416,\n\t8525:  0x00006417,\n\t8526:  0x00006406,\n\t8527:  0x0000656C,\n\t8528:  0x0000659F,\n\t8529:  0x000065B0,\n\t8530:  0x00006697,\n\t8531:  0x00006689,\n\t8532:  0x00006687,\n\t8533:  0x00006688,\n\t8534:  0x00006696,\n\t8535:  0x00006684,\n\t8536:  0x00006698,\n\t8537:  0x0000668D,\n\t8538:  0x00006703,\n\t8539:  0x00006994,\n\t8540:  0x0000696D,\n\t8541:  0x0000695A,\n\t8542:  0x00006977,\n\t8543:  0x00006960,\n\t8544:  0x00006954,\n\t8545:  0x00006975,\n\t8546:  0x00006930,\n\t8547:  0x00006982,\n\t8548:  0x0000694A,\n\t8549:  0x00006968,\n\t8550:  0x0000696B,\n\t8551:  0x0000695E,\n\t8552:  0x00006953,\n\t8553:  0x00006979,\n\t8554:  0x00006986,\n\t8555:  0x0000695D,\n\t8556:  0x00006963,\n\t8557:  0x0000695B,\n\t8558:  0x00006B47,\n\t8559:  0x00006B72,\n\t8560:  0x00006BC0,\n\t8561:  0x00006BBF,\n\t8562:  0x00006BD3,\n\t8563:  0x00006BFD,\n\t8564:  0x00006EA2,\n\t8565:  0x00006EAF,\n\t8566:  0x00006ED3,\n\t8567:  0x00006EB6,\n\t8568:  0x00006EC2,\n\t8569:  0x00006E90,\n\t8570:  0x00006E9D,\n\t8571:  0x00006EC7,\n\t8572:  0x00006EC5,\n\t8573:  0x00006EA5,\n\t8574:  0x00006E98,\n\t8575:  0x00006EBC,\n\t8576:  0x00006EBA,\n\t8577:  0x00006EAB,\n\t8578:  0x00006ED1,\n\t8579:  0x00006E96,\n\t8580:  0x00006E9C,\n\t8581:  0x00006EC4,\n\t8582:  0x00006ED4,\n\t8583:  0x00006EAA,\n\t8584:  0x00006EA7,\n\t8585:  0x00006EB4,\n\t8586:  0x0000714E,\n\t8587:  0x00007159,\n\t8588:  0x00007169,\n\t8589:  0x00007164,\n\t8590:  0x00007149,\n\t8591:  0x00007167,\n\t8592:  0x0000715C,\n\t8593:  0x0000716C,\n\t8594:  0x00007166,\n\t8595:  0x0000714C,\n\t8596:  0x00007165,\n\t8597:  0x0000715E,\n\t8598:  0x00007146,\n\t8599:  0x00007168,\n\t8600:  0x00007156,\n\t8601:  0x0000723A,\n\t8602:  0x00007252,\n\t8603:  0x00007337,\n\t8604:  0x00007345,\n\t8605:  0x0000733F,\n\t8606:  0x0000733E,\n\t8607:  0x0000746F,\n\t8608:  0x0000745A,\n\t8609:  0x00007455,\n\t8610:  0x0000745F,\n\t8611:  0x0000745E,\n\t8612:  0x00007441,\n\t8613:  0x0000743F,\n\t8614:  0x00007459,\n\t8615:  0x0000745B,\n\t8616:  0x0000745C,\n\t8617:  0x00007576,\n\t8618:  0x00007578,\n\t8619:  0x00007600,\n\t8620:  0x000075F0,\n\t8621:  0x00007601,\n\t8622:  0x000075F2,\n\t8623:  0x000075F1,\n\t8624:  0x000075FA,\n\t8625:  0x000075FF,\n\t8626:  0x000075F4,\n\t8627:  0x000075F3,\n\t8628:  0x000076DE,\n\t8629:  0x000076DF,\n\t8630:  0x0000775B,\n\t8631:  0x0000776B,\n\t8632:  0x00007766,\n\t8633:  0x0000775E,\n\t8634:  0x00007763,\n\t8635:  0x00007779,\n\t8636:  0x0000776A,\n\t8637:  0x0000776C,\n\t8638:  0x0000775C,\n\t8639:  0x00007765,\n\t8640:  0x00007768,\n\t8641:  0x00007762,\n\t8642:  0x000077EE,\n\t8643:  0x0000788E,\n\t8644:  0x000078B0,\n\t8645:  0x00007897,\n\t8646:  0x00007898,\n\t8647:  0x0000788C,\n\t8648:  0x00007889,\n\t8649:  0x0000787C,\n\t8650:  0x00007891,\n\t8651:  0x00007893,\n\t8652:  0x0000787F,\n\t8653:  0x0000797A,\n\t8654:  0x0000797F,\n\t8655:  0x00007981,\n\t8656:  0x0000842C,\n\t8657:  0x000079BD,\n\t8658:  0x00007A1C,\n\t8659:  0x00007A1A,\n\t8660:  0x00007A20,\n\t8661:  0x00007A14,\n\t8662:  0x00007A1F,\n\t8663:  0x00007A1E,\n\t8664:  0x00007A9F,\n\t8665:  0x00007AA0,\n\t8666:  0x00007B77,\n\t8667:  0x00007BC0,\n\t8668:  0x00007B60,\n\t8669:  0x00007B6E,\n\t8670:  0x00007B67,\n\t8671:  0x00007CB1,\n\t8672:  0x00007CB3,\n\t8673:  0x00007CB5,\n\t8674:  0x00007D93,\n\t8675:  0x00007D79,\n\t8676:  0x00007D91,\n\t8677:  0x00007D81,\n\t8678:  0x00007D8F,\n\t8679:  0x00007D5B,\n\t8680:  0x00007F6E,\n\t8681:  0x00007F69,\n\t8682:  0x00007F6A,\n\t8683:  0x00007F72,\n\t8684:  0x00007FA9,\n\t8685:  0x00007FA8,\n\t8686:  0x00007FA4,\n\t8687:  0x00008056,\n\t8688:  0x00008058,\n\t8689:  0x00008086,\n\t8690:  0x00008084,\n\t8691:  0x00008171,\n\t8692:  0x00008170,\n\t8693:  0x00008178,\n\t8694:  0x00008165,\n\t8695:  0x0000816E,\n\t8696:  0x00008173,\n\t8697:  0x0000816B,\n\t8698:  0x00008179,\n\t8699:  0x0000817A,\n\t8700:  0x00008166,\n\t8701:  0x00008205,\n\t8702:  0x00008247,\n\t8703:  0x00008482,\n\t8704:  0x00008477,\n\t8705:  0x0000843D,\n\t8706:  0x00008431,\n\t8707:  0x00008475,\n\t8708:  0x00008466,\n\t8709:  0x0000846B,\n\t8710:  0x00008449,\n\t8711:  0x0000846C,\n\t8712:  0x0000845B,\n\t8713:  0x0000843C,\n\t8714:  0x00008435,\n\t8715:  0x00008461,\n\t8716:  0x00008463,\n\t8717:  0x00008469,\n\t8718:  0x0000846D,\n\t8719:  0x00008446,\n\t8720:  0x0000865E,\n\t8721:  0x0000865C,\n\t8722:  0x0000865F,\n\t8723:  0x000086F9,\n\t8724:  0x00008713,\n\t8725:  0x00008708,\n\t8726:  0x00008707,\n\t8727:  0x00008700,\n\t8728:  0x000086FE,\n\t8729:  0x000086FB,\n\t8730:  0x00008702,\n\t8731:  0x00008703,\n\t8732:  0x00008706,\n\t8733:  0x0000870A,\n\t8734:  0x00008859,\n\t8735:  0x000088DF,\n\t8736:  0x000088D4,\n\t8737:  0x000088D9,\n\t8738:  0x000088DC,\n\t8739:  0x000088D8,\n\t8740:  0x000088DD,\n\t8741:  0x000088E1,\n\t8742:  0x000088CA,\n\t8743:  0x000088D5,\n\t8744:  0x000088D2,\n\t8745:  0x0000899C,\n\t8746:  0x000089E3,\n\t8747:  0x00008A6B,\n\t8748:  0x00008A72,\n\t8749:  0x00008A73,\n\t8750:  0x00008A66,\n\t8751:  0x00008A69,\n\t8752:  0x00008A70,\n\t8753:  0x00008A87,\n\t8754:  0x00008A7C,\n\t8755:  0x00008A63,\n\t8756:  0x00008AA0,\n\t8757:  0x00008A71,\n\t8758:  0x00008A85,\n\t8759:  0x00008A6D,\n\t8760:  0x00008A62,\n\t8761:  0x00008A6E,\n\t8762:  0x00008A6C,\n\t8763:  0x00008A79,\n\t8764:  0x00008A7B,\n\t8765:  0x00008A3E,\n\t8766:  0x00008A68,\n\t8767:  0x00008C62,\n\t8768:  0x00008C8A,\n\t8769:  0x00008C89,\n\t8770:  0x00008CCA,\n\t8771:  0x00008CC7,\n\t8772:  0x00008CC8,\n\t8773:  0x00008CC4,\n\t8774:  0x00008CB2,\n\t8775:  0x00008CC3,\n\t8776:  0x00008CC2,\n\t8777:  0x00008CC5,\n\t8778:  0x00008DE1,\n\t8779:  0x00008DDF,\n\t8780:  0x00008DE8,\n\t8781:  0x00008DEF,\n\t8782:  0x00008DF3,\n\t8783:  0x00008DFA,\n\t8784:  0x00008DEA,\n\t8785:  0x00008DE4,\n\t8786:  0x00008DE6,\n\t8787:  0x00008EB2,\n\t8788:  0x00008F03,\n\t8789:  0x00008F09,\n\t8790:  0x00008EFE,\n\t8791:  0x00008F0A,\n\t8792:  0x00008F9F,\n\t8793:  0x00008FB2,\n\t8794:  0x0000904B,\n\t8795:  0x0000904A,\n\t8796:  0x00009053,\n\t8797:  0x00009042,\n\t8798:  0x00009054,\n\t8799:  0x0000903C,\n\t8800:  0x00009055,\n\t8801:  0x00009050,\n\t8802:  0x00009047,\n\t8803:  0x0000904F,\n\t8804:  0x0000904E,\n\t8805:  0x0000904D,\n\t8806:  0x00009051,\n\t8807:  0x0000903E,\n\t8808:  0x00009041,\n\t8809:  0x00009112,\n\t8810:  0x00009117,\n\t8811:  0x0000916C,\n\t8812:  0x0000916A,\n\t8813:  0x00009169,\n\t8814:  0x000091C9,\n\t8815:  0x00009237,\n\t8816:  0x00009257,\n\t8817:  0x00009238,\n\t8818:  0x0000923D,\n\t8819:  0x00009240,\n\t8820:  0x0000923E,\n\t8821:  0x0000925B,\n\t8822:  0x0000924B,\n\t8823:  0x00009264,\n\t8824:  0x00009251,\n\t8825:  0x00009234,\n\t8826:  0x00009249,\n\t8827:  0x0000924D,\n\t8828:  0x00009245,\n\t8829:  0x00009239,\n\t8830:  0x0000923F,\n\t8831:  0x0000925A,\n\t8832:  0x00009598,\n\t8833:  0x00009698,\n\t8834:  0x00009694,\n\t8835:  0x00009695,\n\t8836:  0x000096CD,\n\t8837:  0x000096CB,\n\t8838:  0x000096C9,\n\t8839:  0x000096CA,\n\t8840:  0x000096F7,\n\t8841:  0x000096FB,\n\t8842:  0x000096F9,\n\t8843:  0x000096F6,\n\t8844:  0x00009756,\n\t8845:  0x00009774,\n\t8846:  0x00009776,\n\t8847:  0x00009810,\n\t8848:  0x00009811,\n\t8849:  0x00009813,\n\t8850:  0x0000980A,\n\t8851:  0x00009812,\n\t8852:  0x0000980C,\n\t8853:  0x000098FC,\n\t8854:  0x000098F4,\n\t8855:  0x000098FD,\n\t8856:  0x000098FE,\n\t8857:  0x000099B3,\n\t8858:  0x000099B1,\n\t8859:  0x000099B4,\n\t8860:  0x00009AE1,\n\t8861:  0x00009CE9,\n\t8862:  0x00009E82,\n\t8863:  0x00009F0E,\n\t8864:  0x00009F13,\n\t8865:  0x00009F20,\n\t8866:  0x000050E7,\n\t8867:  0x000050EE,\n\t8868:  0x000050E5,\n\t8869:  0x000050D6,\n\t8870:  0x000050ED,\n\t8871:  0x000050DA,\n\t8872:  0x000050D5,\n\t8873:  0x000050CF,\n\t8874:  0x000050D1,\n\t8875:  0x000050F1,\n\t8876:  0x000050CE,\n\t8877:  0x000050E9,\n\t8878:  0x00005162,\n\t8879:  0x000051F3,\n\t8880:  0x00005283,\n\t8881:  0x00005282,\n\t8882:  0x00005331,\n\t8883:  0x000053AD,\n\t8884:  0x000055FE,\n\t8885:  0x00005600,\n\t8886:  0x0000561B,\n\t8887:  0x00005617,\n\t8888:  0x000055FD,\n\t8889:  0x00005614,\n\t8890:  0x00005606,\n\t8891:  0x00005609,\n\t8892:  0x0000560D,\n\t8893:  0x0000560E,\n\t8894:  0x000055F7,\n\t8895:  0x00005616,\n\t8896:  0x0000561F,\n\t8897:  0x00005608,\n\t8898:  0x00005610,\n\t8899:  0x000055F6,\n\t8900:  0x00005718,\n\t8901:  0x00005716,\n\t8902:  0x00005875,\n\t8903:  0x0000587E,\n\t8904:  0x00005883,\n\t8905:  0x00005893,\n\t8906:  0x0000588A,\n\t8907:  0x00005879,\n\t8908:  0x00005885,\n\t8909:  0x0000587D,\n\t8910:  0x000058FD,\n\t8911:  0x00005925,\n\t8912:  0x00005922,\n\t8913:  0x00005924,\n\t8914:  0x0000596A,\n\t8915:  0x00005969,\n\t8916:  0x00005AE1,\n\t8917:  0x00005AE6,\n\t8918:  0x00005AE9,\n\t8919:  0x00005AD7,\n\t8920:  0x00005AD6,\n\t8921:  0x00005AD8,\n\t8922:  0x00005AE3,\n\t8923:  0x00005B75,\n\t8924:  0x00005BDE,\n\t8925:  0x00005BE7,\n\t8926:  0x00005BE1,\n\t8927:  0x00005BE5,\n\t8928:  0x00005BE6,\n\t8929:  0x00005BE8,\n\t8930:  0x00005BE2,\n\t8931:  0x00005BE4,\n\t8932:  0x00005BDF,\n\t8933:  0x00005C0D,\n\t8934:  0x00005C62,\n\t8935:  0x00005D84,\n\t8936:  0x00005D87,\n\t8937:  0x00005E5B,\n\t8938:  0x00005E63,\n\t8939:  0x00005E55,\n\t8940:  0x00005E57,\n\t8941:  0x00005E54,\n\t8942:  0x00005ED3,\n\t8943:  0x00005ED6,\n\t8944:  0x00005F0A,\n\t8945:  0x00005F46,\n\t8946:  0x00005F70,\n\t8947:  0x00005FB9,\n\t8948:  0x00006147,\n\t8949:  0x0000613F,\n\t8950:  0x0000614B,\n\t8951:  0x00006177,\n\t8952:  0x00006162,\n\t8953:  0x00006163,\n\t8954:  0x0000615F,\n\t8955:  0x0000615A,\n\t8956:  0x00006158,\n\t8957:  0x00006175,\n\t8958:  0x0000622A,\n\t8959:  0x00006487,\n\t8960:  0x00006458,\n\t8961:  0x00006454,\n\t8962:  0x000064A4,\n\t8963:  0x00006478,\n\t8964:  0x0000645F,\n\t8965:  0x0000647A,\n\t8966:  0x00006451,\n\t8967:  0x00006467,\n\t8968:  0x00006434,\n\t8969:  0x0000646D,\n\t8970:  0x0000647B,\n\t8971:  0x00006572,\n\t8972:  0x000065A1,\n\t8973:  0x000065D7,\n\t8974:  0x000065D6,\n\t8975:  0x000066A2,\n\t8976:  0x000066A8,\n\t8977:  0x0000669D,\n\t8978:  0x0000699C,\n\t8979:  0x000069A8,\n\t8980:  0x00006995,\n\t8981:  0x000069C1,\n\t8982:  0x000069AE,\n\t8983:  0x000069D3,\n\t8984:  0x000069CB,\n\t8985:  0x0000699B,\n\t8986:  0x000069B7,\n\t8987:  0x000069BB,\n\t8988:  0x000069AB,\n\t8989:  0x000069B4,\n\t8990:  0x000069D0,\n\t8991:  0x000069CD,\n\t8992:  0x000069AD,\n\t8993:  0x000069CC,\n\t8994:  0x000069A6,\n\t8995:  0x000069C3,\n\t8996:  0x000069A3,\n\t8997:  0x00006B49,\n\t8998:  0x00006B4C,\n\t8999:  0x00006C33,\n\t9000:  0x00006F33,\n\t9001:  0x00006F14,\n\t9002:  0x00006EFE,\n\t9003:  0x00006F13,\n\t9004:  0x00006EF4,\n\t9005:  0x00006F29,\n\t9006:  0x00006F3E,\n\t9007:  0x00006F20,\n\t9008:  0x00006F2C,\n\t9009:  0x00006F0F,\n\t9010:  0x00006F02,\n\t9011:  0x00006F22,\n\t9012:  0x00006EFF,\n\t9013:  0x00006EEF,\n\t9014:  0x00006F06,\n\t9015:  0x00006F31,\n\t9016:  0x00006F38,\n\t9017:  0x00006F32,\n\t9018:  0x00006F23,\n\t9019:  0x00006F15,\n\t9020:  0x00006F2B,\n\t9021:  0x00006F2F,\n\t9022:  0x00006F88,\n\t9023:  0x00006F2A,\n\t9024:  0x00006EEC,\n\t9025:  0x00006F01,\n\t9026:  0x00006EF2,\n\t9027:  0x00006ECC,\n\t9028:  0x00006EF7,\n\t9029:  0x00007194,\n\t9030:  0x00007199,\n\t9031:  0x0000717D,\n\t9032:  0x0000718A,\n\t9033:  0x00007184,\n\t9034:  0x00007192,\n\t9035:  0x0000723E,\n\t9036:  0x00007292,\n\t9037:  0x00007296,\n\t9038:  0x00007344,\n\t9039:  0x00007350,\n\t9040:  0x00007464,\n\t9041:  0x00007463,\n\t9042:  0x0000746A,\n\t9043:  0x00007470,\n\t9044:  0x0000746D,\n\t9045:  0x00007504,\n\t9046:  0x00007591,\n\t9047:  0x00007627,\n\t9048:  0x0000760D,\n\t9049:  0x0000760B,\n\t9050:  0x00007609,\n\t9051:  0x00007613,\n\t9052:  0x000076E1,\n\t9053:  0x000076E3,\n\t9054:  0x00007784,\n\t9055:  0x0000777D,\n\t9056:  0x0000777F,\n\t9057:  0x00007761,\n\t9058:  0x000078C1,\n\t9059:  0x0000789F,\n\t9060:  0x000078A7,\n\t9061:  0x000078B3,\n\t9062:  0x000078A9,\n\t9063:  0x000078A3,\n\t9064:  0x0000798E,\n\t9065:  0x0000798F,\n\t9066:  0x0000798D,\n\t9067:  0x00007A2E,\n\t9068:  0x00007A31,\n\t9069:  0x00007AAA,\n\t9070:  0x00007AA9,\n\t9071:  0x00007AED,\n\t9072:  0x00007AEF,\n\t9073:  0x00007BA1,\n\t9074:  0x00007B95,\n\t9075:  0x00007B8B,\n\t9076:  0x00007B75,\n\t9077:  0x00007B97,\n\t9078:  0x00007B9D,\n\t9079:  0x00007B94,\n\t9080:  0x00007B8F,\n\t9081:  0x00007BB8,\n\t9082:  0x00007B87,\n\t9083:  0x00007B84,\n\t9084:  0x00007CB9,\n\t9085:  0x00007CBD,\n\t9086:  0x00007CBE,\n\t9087:  0x00007DBB,\n\t9088:  0x00007DB0,\n\t9089:  0x00007D9C,\n\t9090:  0x00007DBD,\n\t9091:  0x00007DBE,\n\t9092:  0x00007DA0,\n\t9093:  0x00007DCA,\n\t9094:  0x00007DB4,\n\t9095:  0x00007DB2,\n\t9096:  0x00007DB1,\n\t9097:  0x00007DBA,\n\t9098:  0x00007DA2,\n\t9099:  0x00007DBF,\n\t9100:  0x00007DB5,\n\t9101:  0x00007DB8,\n\t9102:  0x00007DAD,\n\t9103:  0x00007DD2,\n\t9104:  0x00007DC7,\n\t9105:  0x00007DAC,\n\t9106:  0x00007F70,\n\t9107:  0x00007FE0,\n\t9108:  0x00007FE1,\n\t9109:  0x00007FDF,\n\t9110:  0x0000805E,\n\t9111:  0x0000805A,\n\t9112:  0x00008087,\n\t9113:  0x00008150,\n\t9114:  0x00008180,\n\t9115:  0x0000818F,\n\t9116:  0x00008188,\n\t9117:  0x0000818A,\n\t9118:  0x0000817F,\n\t9119:  0x00008182,\n\t9120:  0x000081E7,\n\t9121:  0x000081FA,\n\t9122:  0x00008207,\n\t9123:  0x00008214,\n\t9124:  0x0000821E,\n\t9125:  0x0000824B,\n\t9126:  0x000084C9,\n\t9127:  0x000084BF,\n\t9128:  0x000084C6,\n\t9129:  0x000084C4,\n\t9130:  0x00008499,\n\t9131:  0x0000849E,\n\t9132:  0x000084B2,\n\t9133:  0x0000849C,\n\t9134:  0x000084CB,\n\t9135:  0x000084B8,\n\t9136:  0x000084C0,\n\t9137:  0x000084D3,\n\t9138:  0x00008490,\n\t9139:  0x000084BC,\n\t9140:  0x000084D1,\n\t9141:  0x000084CA,\n\t9142:  0x0000873F,\n\t9143:  0x0000871C,\n\t9144:  0x0000873B,\n\t9145:  0x00008722,\n\t9146:  0x00008725,\n\t9147:  0x00008734,\n\t9148:  0x00008718,\n\t9149:  0x00008755,\n\t9150:  0x00008737,\n\t9151:  0x00008729,\n\t9152:  0x000088F3,\n\t9153:  0x00008902,\n\t9154:  0x000088F4,\n\t9155:  0x000088F9,\n\t9156:  0x000088F8,\n\t9157:  0x000088FD,\n\t9158:  0x000088E8,\n\t9159:  0x0000891A,\n\t9160:  0x000088EF,\n\t9161:  0x00008AA6,\n\t9162:  0x00008A8C,\n\t9163:  0x00008A9E,\n\t9164:  0x00008AA3,\n\t9165:  0x00008A8D,\n\t9166:  0x00008AA1,\n\t9167:  0x00008A93,\n\t9168:  0x00008AA4,\n\t9169:  0x00008AAA,\n\t9170:  0x00008AA5,\n\t9171:  0x00008AA8,\n\t9172:  0x00008A98,\n\t9173:  0x00008A91,\n\t9174:  0x00008A9A,\n\t9175:  0x00008AA7,\n\t9176:  0x00008C6A,\n\t9177:  0x00008C8D,\n\t9178:  0x00008C8C,\n\t9179:  0x00008CD3,\n\t9180:  0x00008CD1,\n\t9181:  0x00008CD2,\n\t9182:  0x00008D6B,\n\t9183:  0x00008D99,\n\t9184:  0x00008D95,\n\t9185:  0x00008DFC,\n\t9186:  0x00008F14,\n\t9187:  0x00008F12,\n\t9188:  0x00008F15,\n\t9189:  0x00008F13,\n\t9190:  0x00008FA3,\n\t9191:  0x00009060,\n\t9192:  0x00009058,\n\t9193:  0x0000905C,\n\t9194:  0x00009063,\n\t9195:  0x00009059,\n\t9196:  0x0000905E,\n\t9197:  0x00009062,\n\t9198:  0x0000905D,\n\t9199:  0x0000905B,\n\t9200:  0x00009119,\n\t9201:  0x00009118,\n\t9202:  0x0000911E,\n\t9203:  0x00009175,\n\t9204:  0x00009178,\n\t9205:  0x00009177,\n\t9206:  0x00009174,\n\t9207:  0x00009278,\n\t9208:  0x00009280,\n\t9209:  0x00009285,\n\t9210:  0x00009298,\n\t9211:  0x00009296,\n\t9212:  0x0000927B,\n\t9213:  0x00009293,\n\t9214:  0x0000929C,\n\t9215:  0x000092A8,\n\t9216:  0x0000927C,\n\t9217:  0x00009291,\n\t9218:  0x000095A1,\n\t9219:  0x000095A8,\n\t9220:  0x000095A9,\n\t9221:  0x000095A3,\n\t9222:  0x000095A5,\n\t9223:  0x000095A4,\n\t9224:  0x00009699,\n\t9225:  0x0000969C,\n\t9226:  0x0000969B,\n\t9227:  0x000096CC,\n\t9228:  0x000096D2,\n\t9229:  0x00009700,\n\t9230:  0x0000977C,\n\t9231:  0x00009785,\n\t9232:  0x000097F6,\n\t9233:  0x00009817,\n\t9234:  0x00009818,\n\t9235:  0x000098AF,\n\t9236:  0x000098B1,\n\t9237:  0x00009903,\n\t9238:  0x00009905,\n\t9239:  0x0000990C,\n\t9240:  0x00009909,\n\t9241:  0x000099C1,\n\t9242:  0x00009AAF,\n\t9243:  0x00009AB0,\n\t9244:  0x00009AE6,\n\t9245:  0x00009B41,\n\t9246:  0x00009B42,\n\t9247:  0x00009CF4,\n\t9248:  0x00009CF6,\n\t9249:  0x00009CF3,\n\t9250:  0x00009EBC,\n\t9251:  0x00009F3B,\n\t9252:  0x00009F4A,\n\t9253:  0x00005104,\n\t9254:  0x00005100,\n\t9255:  0x000050FB,\n\t9256:  0x000050F5,\n\t9257:  0x000050F9,\n\t9258:  0x00005102,\n\t9259:  0x00005108,\n\t9260:  0x00005109,\n\t9261:  0x00005105,\n\t9262:  0x000051DC,\n\t9263:  0x00005287,\n\t9264:  0x00005288,\n\t9265:  0x00005289,\n\t9266:  0x0000528D,\n\t9267:  0x0000528A,\n\t9268:  0x000052F0,\n\t9269:  0x000053B2,\n\t9270:  0x0000562E,\n\t9271:  0x0000563B,\n\t9272:  0x00005639,\n\t9273:  0x00005632,\n\t9274:  0x0000563F,\n\t9275:  0x00005634,\n\t9276:  0x00005629,\n\t9277:  0x00005653,\n\t9278:  0x0000564E,\n\t9279:  0x00005657,\n\t9280:  0x00005674,\n\t9281:  0x00005636,\n\t9282:  0x0000562F,\n\t9283:  0x00005630,\n\t9284:  0x00005880,\n\t9285:  0x0000589F,\n\t9286:  0x0000589E,\n\t9287:  0x000058B3,\n\t9288:  0x0000589C,\n\t9289:  0x000058AE,\n\t9290:  0x000058A9,\n\t9291:  0x000058A6,\n\t9292:  0x0000596D,\n\t9293:  0x00005B09,\n\t9294:  0x00005AFB,\n\t9295:  0x00005B0B,\n\t9296:  0x00005AF5,\n\t9297:  0x00005B0C,\n\t9298:  0x00005B08,\n\t9299:  0x00005BEE,\n\t9300:  0x00005BEC,\n\t9301:  0x00005BE9,\n\t9302:  0x00005BEB,\n\t9303:  0x00005C64,\n\t9304:  0x00005C65,\n\t9305:  0x00005D9D,\n\t9306:  0x00005D94,\n\t9307:  0x00005E62,\n\t9308:  0x00005E5F,\n\t9309:  0x00005E61,\n\t9310:  0x00005EE2,\n\t9311:  0x00005EDA,\n\t9312:  0x00005EDF,\n\t9313:  0x00005EDD,\n\t9314:  0x00005EE3,\n\t9315:  0x00005EE0,\n\t9316:  0x00005F48,\n\t9317:  0x00005F71,\n\t9318:  0x00005FB7,\n\t9319:  0x00005FB5,\n\t9320:  0x00006176,\n\t9321:  0x00006167,\n\t9322:  0x0000616E,\n\t9323:  0x0000615D,\n\t9324:  0x00006155,\n\t9325:  0x00006182,\n\t9326:  0x0000617C,\n\t9327:  0x00006170,\n\t9328:  0x0000616B,\n\t9329:  0x0000617E,\n\t9330:  0x000061A7,\n\t9331:  0x00006190,\n\t9332:  0x000061AB,\n\t9333:  0x0000618E,\n\t9334:  0x000061AC,\n\t9335:  0x0000619A,\n\t9336:  0x000061A4,\n\t9337:  0x00006194,\n\t9338:  0x000061AE,\n\t9339:  0x0000622E,\n\t9340:  0x00006469,\n\t9341:  0x0000646F,\n\t9342:  0x00006479,\n\t9343:  0x0000649E,\n\t9344:  0x000064B2,\n\t9345:  0x00006488,\n\t9346:  0x00006490,\n\t9347:  0x000064B0,\n\t9348:  0x000064A5,\n\t9349:  0x00006493,\n\t9350:  0x00006495,\n\t9351:  0x000064A9,\n\t9352:  0x00006492,\n\t9353:  0x000064AE,\n\t9354:  0x000064AD,\n\t9355:  0x000064AB,\n\t9356:  0x0000649A,\n\t9357:  0x000064AC,\n\t9358:  0x00006499,\n\t9359:  0x000064A2,\n\t9360:  0x000064B3,\n\t9361:  0x00006575,\n\t9362:  0x00006577,\n\t9363:  0x00006578,\n\t9364:  0x000066AE,\n\t9365:  0x000066AB,\n\t9366:  0x000066B4,\n\t9367:  0x000066B1,\n\t9368:  0x00006A23,\n\t9369:  0x00006A1F,\n\t9370:  0x000069E8,\n\t9371:  0x00006A01,\n\t9372:  0x00006A1E,\n\t9373:  0x00006A19,\n\t9374:  0x000069FD,\n\t9375:  0x00006A21,\n\t9376:  0x00006A13,\n\t9377:  0x00006A0A,\n\t9378:  0x000069F3,\n\t9379:  0x00006A02,\n\t9380:  0x00006A05,\n\t9381:  0x000069ED,\n\t9382:  0x00006A11,\n\t9383:  0x00006B50,\n\t9384:  0x00006B4E,\n\t9385:  0x00006BA4,\n\t9386:  0x00006BC5,\n\t9387:  0x00006BC6,\n\t9388:  0x00006F3F,\n\t9389:  0x00006F7C,\n\t9390:  0x00006F84,\n\t9391:  0x00006F51,\n\t9392:  0x00006F66,\n\t9393:  0x00006F54,\n\t9394:  0x00006F86,\n\t9395:  0x00006F6D,\n\t9396:  0x00006F5B,\n\t9397:  0x00006F78,\n\t9398:  0x00006F6E,\n\t9399:  0x00006F8E,\n\t9400:  0x00006F7A,\n\t9401:  0x00006F70,\n\t9402:  0x00006F64,\n\t9403:  0x00006F97,\n\t9404:  0x00006F58,\n\t9405:  0x00006ED5,\n\t9406:  0x00006F6F,\n\t9407:  0x00006F60,\n\t9408:  0x00006F5F,\n\t9409:  0x0000719F,\n\t9410:  0x000071AC,\n\t9411:  0x000071B1,\n\t9412:  0x000071A8,\n\t9413:  0x00007256,\n\t9414:  0x0000729B,\n\t9415:  0x0000734E,\n\t9416:  0x00007357,\n\t9417:  0x00007469,\n\t9418:  0x0000748B,\n\t9419:  0x00007483,\n\t9420:  0x0000747E,\n\t9421:  0x00007480,\n\t9422:  0x0000757F,\n\t9423:  0x00007620,\n\t9424:  0x00007629,\n\t9425:  0x0000761F,\n\t9426:  0x00007624,\n\t9427:  0x00007626,\n\t9428:  0x00007621,\n\t9429:  0x00007622,\n\t9430:  0x0000769A,\n\t9431:  0x000076BA,\n\t9432:  0x000076E4,\n\t9433:  0x0000778E,\n\t9434:  0x00007787,\n\t9435:  0x0000778C,\n\t9436:  0x00007791,\n\t9437:  0x0000778B,\n\t9438:  0x000078CB,\n\t9439:  0x000078C5,\n\t9440:  0x000078BA,\n\t9441:  0x000078CA,\n\t9442:  0x000078BE,\n\t9443:  0x000078D5,\n\t9444:  0x000078BC,\n\t9445:  0x000078D0,\n\t9446:  0x00007A3F,\n\t9447:  0x00007A3C,\n\t9448:  0x00007A40,\n\t9449:  0x00007A3D,\n\t9450:  0x00007A37,\n\t9451:  0x00007A3B,\n\t9452:  0x00007AAF,\n\t9453:  0x00007AAE,\n\t9454:  0x00007BAD,\n\t9455:  0x00007BB1,\n\t9456:  0x00007BC4,\n\t9457:  0x00007BB4,\n\t9458:  0x00007BC6,\n\t9459:  0x00007BC7,\n\t9460:  0x00007BC1,\n\t9461:  0x00007BA0,\n\t9462:  0x00007BCC,\n\t9463:  0x00007CCA,\n\t9464:  0x00007DE0,\n\t9465:  0x00007DF4,\n\t9466:  0x00007DEF,\n\t9467:  0x00007DFB,\n\t9468:  0x00007DD8,\n\t9469:  0x00007DEC,\n\t9470:  0x00007DDD,\n\t9471:  0x00007DE8,\n\t9472:  0x00007DE3,\n\t9473:  0x00007DDA,\n\t9474:  0x00007DDE,\n\t9475:  0x00007DE9,\n\t9476:  0x00007D9E,\n\t9477:  0x00007DD9,\n\t9478:  0x00007DF2,\n\t9479:  0x00007DF9,\n\t9480:  0x00007F75,\n\t9481:  0x00007F77,\n\t9482:  0x00007FAF,\n\t9483:  0x00007FE9,\n\t9484:  0x00008026,\n\t9485:  0x0000819B,\n\t9486:  0x0000819C,\n\t9487:  0x0000819D,\n\t9488:  0x000081A0,\n\t9489:  0x0000819A,\n\t9490:  0x00008198,\n\t9491:  0x00008517,\n\t9492:  0x0000853D,\n\t9493:  0x0000851A,\n\t9494:  0x000084EE,\n\t9495:  0x0000852C,\n\t9496:  0x0000852D,\n\t9497:  0x00008513,\n\t9498:  0x00008511,\n\t9499:  0x00008523,\n\t9500:  0x00008521,\n\t9501:  0x00008514,\n\t9502:  0x000084EC,\n\t9503:  0x00008525,\n\t9504:  0x000084FF,\n\t9505:  0x00008506,\n\t9506:  0x00008782,\n\t9507:  0x00008774,\n\t9508:  0x00008776,\n\t9509:  0x00008760,\n\t9510:  0x00008766,\n\t9511:  0x00008778,\n\t9512:  0x00008768,\n\t9513:  0x00008759,\n\t9514:  0x00008757,\n\t9515:  0x0000874C,\n\t9516:  0x00008753,\n\t9517:  0x0000885B,\n\t9518:  0x0000885D,\n\t9519:  0x00008910,\n\t9520:  0x00008907,\n\t9521:  0x00008912,\n\t9522:  0x00008913,\n\t9523:  0x00008915,\n\t9524:  0x0000890A,\n\t9525:  0x00008ABC,\n\t9526:  0x00008AD2,\n\t9527:  0x00008AC7,\n\t9528:  0x00008AC4,\n\t9529:  0x00008A95,\n\t9530:  0x00008ACB,\n\t9531:  0x00008AF8,\n\t9532:  0x00008AB2,\n\t9533:  0x00008AC9,\n\t9534:  0x00008AC2,\n\t9535:  0x00008ABF,\n\t9536:  0x00008AB0,\n\t9537:  0x00008AD6,\n\t9538:  0x00008ACD,\n\t9539:  0x00008AB6,\n\t9540:  0x00008AB9,\n\t9541:  0x00008ADB,\n\t9542:  0x00008C4C,\n\t9543:  0x00008C4E,\n\t9544:  0x00008C6C,\n\t9545:  0x00008CE0,\n\t9546:  0x00008CDE,\n\t9547:  0x00008CE6,\n\t9548:  0x00008CE4,\n\t9549:  0x00008CEC,\n\t9550:  0x00008CED,\n\t9551:  0x00008CE2,\n\t9552:  0x00008CE3,\n\t9553:  0x00008CDC,\n\t9554:  0x00008CEA,\n\t9555:  0x00008CE1,\n\t9556:  0x00008D6D,\n\t9557:  0x00008D9F,\n\t9558:  0x00008DA3,\n\t9559:  0x00008E2B,\n\t9560:  0x00008E10,\n\t9561:  0x00008E1D,\n\t9562:  0x00008E22,\n\t9563:  0x00008E0F,\n\t9564:  0x00008E29,\n\t9565:  0x00008E1F,\n\t9566:  0x00008E21,\n\t9567:  0x00008E1E,\n\t9568:  0x00008EBA,\n\t9569:  0x00008F1D,\n\t9570:  0x00008F1B,\n\t9571:  0x00008F1F,\n\t9572:  0x00008F29,\n\t9573:  0x00008F26,\n\t9574:  0x00008F2A,\n\t9575:  0x00008F1C,\n\t9576:  0x00008F1E,\n\t9577:  0x00008F25,\n\t9578:  0x00009069,\n\t9579:  0x0000906E,\n\t9580:  0x00009068,\n\t9581:  0x0000906D,\n\t9582:  0x00009077,\n\t9583:  0x00009130,\n\t9584:  0x0000912D,\n\t9585:  0x00009127,\n\t9586:  0x00009131,\n\t9587:  0x00009187,\n\t9588:  0x00009189,\n\t9589:  0x0000918B,\n\t9590:  0x00009183,\n\t9591:  0x000092C5,\n\t9592:  0x000092BB,\n\t9593:  0x000092B7,\n\t9594:  0x000092EA,\n\t9595:  0x000092AC,\n\t9596:  0x000092E4,\n\t9597:  0x000092C1,\n\t9598:  0x000092B3,\n\t9599:  0x000092BC,\n\t9600:  0x000092D2,\n\t9601:  0x000092C7,\n\t9602:  0x000092F0,\n\t9603:  0x000092B2,\n\t9604:  0x000095AD,\n\t9605:  0x000095B1,\n\t9606:  0x00009704,\n\t9607:  0x00009706,\n\t9608:  0x00009707,\n\t9609:  0x00009709,\n\t9610:  0x00009760,\n\t9611:  0x0000978D,\n\t9612:  0x0000978B,\n\t9613:  0x0000978F,\n\t9614:  0x00009821,\n\t9615:  0x0000982B,\n\t9616:  0x0000981C,\n\t9617:  0x000098B3,\n\t9618:  0x0000990A,\n\t9619:  0x00009913,\n\t9620:  0x00009912,\n\t9621:  0x00009918,\n\t9622:  0x000099DD,\n\t9623:  0x000099D0,\n\t9624:  0x000099DF,\n\t9625:  0x000099DB,\n\t9626:  0x000099D1,\n\t9627:  0x000099D5,\n\t9628:  0x000099D2,\n\t9629:  0x000099D9,\n\t9630:  0x00009AB7,\n\t9631:  0x00009AEE,\n\t9632:  0x00009AEF,\n\t9633:  0x00009B27,\n\t9634:  0x00009B45,\n\t9635:  0x00009B44,\n\t9636:  0x00009B77,\n\t9637:  0x00009B6F,\n\t9638:  0x00009D06,\n\t9639:  0x00009D09,\n\t9640:  0x00009D03,\n\t9641:  0x00009EA9,\n\t9642:  0x00009EBE,\n\t9643:  0x00009ECE,\n\t9644:  0x000058A8,\n\t9645:  0x00009F52,\n\t9646:  0x00005112,\n\t9647:  0x00005118,\n\t9648:  0x00005114,\n\t9649:  0x00005110,\n\t9650:  0x00005115,\n\t9651:  0x00005180,\n\t9652:  0x000051AA,\n\t9653:  0x000051DD,\n\t9654:  0x00005291,\n\t9655:  0x00005293,\n\t9656:  0x000052F3,\n\t9657:  0x00005659,\n\t9658:  0x0000566B,\n\t9659:  0x00005679,\n\t9660:  0x00005669,\n\t9661:  0x00005664,\n\t9662:  0x00005678,\n\t9663:  0x0000566A,\n\t9664:  0x00005668,\n\t9665:  0x00005665,\n\t9666:  0x00005671,\n\t9667:  0x0000566F,\n\t9668:  0x0000566C,\n\t9669:  0x00005662,\n\t9670:  0x00005676,\n\t9671:  0x000058C1,\n\t9672:  0x000058BE,\n\t9673:  0x000058C7,\n\t9674:  0x000058C5,\n\t9675:  0x0000596E,\n\t9676:  0x00005B1D,\n\t9677:  0x00005B34,\n\t9678:  0x00005B78,\n\t9679:  0x00005BF0,\n\t9680:  0x00005C0E,\n\t9681:  0x00005F4A,\n\t9682:  0x000061B2,\n\t9683:  0x00006191,\n\t9684:  0x000061A9,\n\t9685:  0x0000618A,\n\t9686:  0x000061CD,\n\t9687:  0x000061B6,\n\t9688:  0x000061BE,\n\t9689:  0x000061CA,\n\t9690:  0x000061C8,\n\t9691:  0x00006230,\n\t9692:  0x000064C5,\n\t9693:  0x000064C1,\n\t9694:  0x000064CB,\n\t9695:  0x000064BB,\n\t9696:  0x000064BC,\n\t9697:  0x000064DA,\n\t9698:  0x000064C4,\n\t9699:  0x000064C7,\n\t9700:  0x000064C2,\n\t9701:  0x000064CD,\n\t9702:  0x000064BF,\n\t9703:  0x000064D2,\n\t9704:  0x000064D4,\n\t9705:  0x000064BE,\n\t9706:  0x00006574,\n\t9707:  0x000066C6,\n\t9708:  0x000066C9,\n\t9709:  0x000066B9,\n\t9710:  0x000066C4,\n\t9711:  0x000066C7,\n\t9712:  0x000066B8,\n\t9713:  0x00006A3D,\n\t9714:  0x00006A38,\n\t9715:  0x00006A3A,\n\t9716:  0x00006A59,\n\t9717:  0x00006A6B,\n\t9718:  0x00006A58,\n\t9719:  0x00006A39,\n\t9720:  0x00006A44,\n\t9721:  0x00006A62,\n\t9722:  0x00006A61,\n\t9723:  0x00006A4B,\n\t9724:  0x00006A47,\n\t9725:  0x00006A35,\n\t9726:  0x00006A5F,\n\t9727:  0x00006A48,\n\t9728:  0x00006B59,\n\t9729:  0x00006B77,\n\t9730:  0x00006C05,\n\t9731:  0x00006FC2,\n\t9732:  0x00006FB1,\n\t9733:  0x00006FA1,\n\t9734:  0x00006FC3,\n\t9735:  0x00006FA4,\n\t9736:  0x00006FC1,\n\t9737:  0x00006FA7,\n\t9738:  0x00006FB3,\n\t9739:  0x00006FC0,\n\t9740:  0x00006FB9,\n\t9741:  0x00006FB6,\n\t9742:  0x00006FA6,\n\t9743:  0x00006FA0,\n\t9744:  0x00006FB4,\n\t9745:  0x000071BE,\n\t9746:  0x000071C9,\n\t9747:  0x000071D0,\n\t9748:  0x000071D2,\n\t9749:  0x000071C8,\n\t9750:  0x000071D5,\n\t9751:  0x000071B9,\n\t9752:  0x000071CE,\n\t9753:  0x000071D9,\n\t9754:  0x000071DC,\n\t9755:  0x000071C3,\n\t9756:  0x000071C4,\n\t9757:  0x00007368,\n\t9758:  0x0000749C,\n\t9759:  0x000074A3,\n\t9760:  0x00007498,\n\t9761:  0x0000749F,\n\t9762:  0x0000749E,\n\t9763:  0x000074E2,\n\t9764:  0x0000750C,\n\t9765:  0x0000750D,\n\t9766:  0x00007634,\n\t9767:  0x00007638,\n\t9768:  0x0000763A,\n\t9769:  0x000076E7,\n\t9770:  0x000076E5,\n\t9771:  0x000077A0,\n\t9772:  0x0000779E,\n\t9773:  0x0000779F,\n\t9774:  0x000077A5,\n\t9775:  0x000078E8,\n\t9776:  0x000078DA,\n\t9777:  0x000078EC,\n\t9778:  0x000078E7,\n\t9779:  0x000079A6,\n\t9780:  0x00007A4D,\n\t9781:  0x00007A4E,\n\t9782:  0x00007A46,\n\t9783:  0x00007A4C,\n\t9784:  0x00007A4B,\n\t9785:  0x00007ABA,\n\t9786:  0x00007BD9,\n\t9787:  0x00007C11,\n\t9788:  0x00007BC9,\n\t9789:  0x00007BE4,\n\t9790:  0x00007BDB,\n\t9791:  0x00007BE1,\n\t9792:  0x00007BE9,\n\t9793:  0x00007BE6,\n\t9794:  0x00007CD5,\n\t9795:  0x00007CD6,\n\t9796:  0x00007E0A,\n\t9797:  0x00007E11,\n\t9798:  0x00007E08,\n\t9799:  0x00007E1B,\n\t9800:  0x00007E23,\n\t9801:  0x00007E1E,\n\t9802:  0x00007E1D,\n\t9803:  0x00007E09,\n\t9804:  0x00007E10,\n\t9805:  0x00007F79,\n\t9806:  0x00007FB2,\n\t9807:  0x00007FF0,\n\t9808:  0x00007FF1,\n\t9809:  0x00007FEE,\n\t9810:  0x00008028,\n\t9811:  0x000081B3,\n\t9812:  0x000081A9,\n\t9813:  0x000081A8,\n\t9814:  0x000081FB,\n\t9815:  0x00008208,\n\t9816:  0x00008258,\n\t9817:  0x00008259,\n\t9818:  0x0000854A,\n\t9819:  0x00008559,\n\t9820:  0x00008548,\n\t9821:  0x00008568,\n\t9822:  0x00008569,\n\t9823:  0x00008543,\n\t9824:  0x00008549,\n\t9825:  0x0000856D,\n\t9826:  0x0000856A,\n\t9827:  0x0000855E,\n\t9828:  0x00008783,\n\t9829:  0x0000879F,\n\t9830:  0x0000879E,\n\t9831:  0x000087A2,\n\t9832:  0x0000878D,\n\t9833:  0x00008861,\n\t9834:  0x0000892A,\n\t9835:  0x00008932,\n\t9836:  0x00008925,\n\t9837:  0x0000892B,\n\t9838:  0x00008921,\n\t9839:  0x000089AA,\n\t9840:  0x000089A6,\n\t9841:  0x00008AE6,\n\t9842:  0x00008AFA,\n\t9843:  0x00008AEB,\n\t9844:  0x00008AF1,\n\t9845:  0x00008B00,\n\t9846:  0x00008ADC,\n\t9847:  0x00008AE7,\n\t9848:  0x00008AEE,\n\t9849:  0x00008AFE,\n\t9850:  0x00008B01,\n\t9851:  0x00008B02,\n\t9852:  0x00008AF7,\n\t9853:  0x00008AED,\n\t9854:  0x00008AF3,\n\t9855:  0x00008AF6,\n\t9856:  0x00008AFC,\n\t9857:  0x00008C6B,\n\t9858:  0x00008C6D,\n\t9859:  0x00008C93,\n\t9860:  0x00008CF4,\n\t9861:  0x00008E44,\n\t9862:  0x00008E31,\n\t9863:  0x00008E34,\n\t9864:  0x00008E42,\n\t9865:  0x00008E39,\n\t9866:  0x00008E35,\n\t9867:  0x00008F3B,\n\t9868:  0x00008F2F,\n\t9869:  0x00008F38,\n\t9870:  0x00008F33,\n\t9871:  0x00008FA8,\n\t9872:  0x00008FA6,\n\t9873:  0x00009075,\n\t9874:  0x00009074,\n\t9875:  0x00009078,\n\t9876:  0x00009072,\n\t9877:  0x0000907C,\n\t9878:  0x0000907A,\n\t9879:  0x00009134,\n\t9880:  0x00009192,\n\t9881:  0x00009320,\n\t9882:  0x00009336,\n\t9883:  0x000092F8,\n\t9884:  0x00009333,\n\t9885:  0x0000932F,\n\t9886:  0x00009322,\n\t9887:  0x000092FC,\n\t9888:  0x0000932B,\n\t9889:  0x00009304,\n\t9890:  0x0000931A,\n\t9891:  0x00009310,\n\t9892:  0x00009326,\n\t9893:  0x00009321,\n\t9894:  0x00009315,\n\t9895:  0x0000932E,\n\t9896:  0x00009319,\n\t9897:  0x000095BB,\n\t9898:  0x000096A7,\n\t9899:  0x000096A8,\n\t9900:  0x000096AA,\n\t9901:  0x000096D5,\n\t9902:  0x0000970E,\n\t9903:  0x00009711,\n\t9904:  0x00009716,\n\t9905:  0x0000970D,\n\t9906:  0x00009713,\n\t9907:  0x0000970F,\n\t9908:  0x0000975B,\n\t9909:  0x0000975C,\n\t9910:  0x00009766,\n\t9911:  0x00009798,\n\t9912:  0x00009830,\n\t9913:  0x00009838,\n\t9914:  0x0000983B,\n\t9915:  0x00009837,\n\t9916:  0x0000982D,\n\t9917:  0x00009839,\n\t9918:  0x00009824,\n\t9919:  0x00009910,\n\t9920:  0x00009928,\n\t9921:  0x0000991E,\n\t9922:  0x0000991B,\n\t9923:  0x00009921,\n\t9924:  0x0000991A,\n\t9925:  0x000099ED,\n\t9926:  0x000099E2,\n\t9927:  0x000099F1,\n\t9928:  0x00009AB8,\n\t9929:  0x00009ABC,\n\t9930:  0x00009AFB,\n\t9931:  0x00009AED,\n\t9932:  0x00009B28,\n\t9933:  0x00009B91,\n\t9934:  0x00009D15,\n\t9935:  0x00009D23,\n\t9936:  0x00009D26,\n\t9937:  0x00009D28,\n\t9938:  0x00009D12,\n\t9939:  0x00009D1B,\n\t9940:  0x00009ED8,\n\t9941:  0x00009ED4,\n\t9942:  0x00009F8D,\n\t9943:  0x00009F9C,\n\t9944:  0x0000512A,\n\t9945:  0x0000511F,\n\t9946:  0x00005121,\n\t9947:  0x00005132,\n\t9948:  0x000052F5,\n\t9949:  0x0000568E,\n\t9950:  0x00005680,\n\t9951:  0x00005690,\n\t9952:  0x00005685,\n\t9953:  0x00005687,\n\t9954:  0x0000568F,\n\t9955:  0x000058D5,\n\t9956:  0x000058D3,\n\t9957:  0x000058D1,\n\t9958:  0x000058CE,\n\t9959:  0x00005B30,\n\t9960:  0x00005B2A,\n\t9961:  0x00005B24,\n\t9962:  0x00005B7A,\n\t9963:  0x00005C37,\n\t9964:  0x00005C68,\n\t9965:  0x00005DBC,\n\t9966:  0x00005DBA,\n\t9967:  0x00005DBD,\n\t9968:  0x00005DB8,\n\t9969:  0x00005E6B,\n\t9970:  0x00005F4C,\n\t9971:  0x00005FBD,\n\t9972:  0x000061C9,\n\t9973:  0x000061C2,\n\t9974:  0x000061C7,\n\t9975:  0x000061E6,\n\t9976:  0x000061CB,\n\t9977:  0x00006232,\n\t9978:  0x00006234,\n\t9979:  0x000064CE,\n\t9980:  0x000064CA,\n\t9981:  0x000064D8,\n\t9982:  0x000064E0,\n\t9983:  0x000064F0,\n\t9984:  0x000064E6,\n\t9985:  0x000064EC,\n\t9986:  0x000064F1,\n\t9987:  0x000064E2,\n\t9988:  0x000064ED,\n\t9989:  0x00006582,\n\t9990:  0x00006583,\n\t9991:  0x000066D9,\n\t9992:  0x000066D6,\n\t9993:  0x00006A80,\n\t9994:  0x00006A94,\n\t9995:  0x00006A84,\n\t9996:  0x00006AA2,\n\t9997:  0x00006A9C,\n\t9998:  0x00006ADB,\n\t9999:  0x00006AA3,\n\t10000: 0x00006A7E,\n\t10001: 0x00006A97,\n\t10002: 0x00006A90,\n\t10003: 0x00006AA0,\n\t10004: 0x00006B5C,\n\t10005: 0x00006BAE,\n\t10006: 0x00006BDA,\n\t10007: 0x00006C08,\n\t10008: 0x00006FD8,\n\t10009: 0x00006FF1,\n\t10010: 0x00006FDF,\n\t10011: 0x00006FE0,\n\t10012: 0x00006FDB,\n\t10013: 0x00006FE4,\n\t10014: 0x00006FEB,\n\t10015: 0x00006FEF,\n\t10016: 0x00006F80,\n\t10017: 0x00006FEC,\n\t10018: 0x00006FE1,\n\t10019: 0x00006FE9,\n\t10020: 0x00006FD5,\n\t10021: 0x00006FEE,\n\t10022: 0x00006FF0,\n\t10023: 0x000071E7,\n\t10024: 0x000071DF,\n\t10025: 0x000071EE,\n\t10026: 0x000071E6,\n\t10027: 0x000071E5,\n\t10028: 0x000071ED,\n\t10029: 0x000071EC,\n\t10030: 0x000071F4,\n\t10031: 0x000071E0,\n\t10032: 0x00007235,\n\t10033: 0x00007246,\n\t10034: 0x00007370,\n\t10035: 0x00007372,\n\t10036: 0x000074A9,\n\t10037: 0x000074B0,\n\t10038: 0x000074A6,\n\t10039: 0x000074A8,\n\t10040: 0x00007646,\n\t10041: 0x00007642,\n\t10042: 0x0000764C,\n\t10043: 0x000076EA,\n\t10044: 0x000077B3,\n\t10045: 0x000077AA,\n\t10046: 0x000077B0,\n\t10047: 0x000077AC,\n\t10048: 0x000077A7,\n\t10049: 0x000077AD,\n\t10050: 0x000077EF,\n\t10051: 0x000078F7,\n\t10052: 0x000078FA,\n\t10053: 0x000078F4,\n\t10054: 0x000078EF,\n\t10055: 0x00007901,\n\t10056: 0x000079A7,\n\t10057: 0x000079AA,\n\t10058: 0x00007A57,\n\t10059: 0x00007ABF,\n\t10060: 0x00007C07,\n\t10061: 0x00007C0D,\n\t10062: 0x00007BFE,\n\t10063: 0x00007BF7,\n\t10064: 0x00007C0C,\n\t10065: 0x00007BE0,\n\t10066: 0x00007CE0,\n\t10067: 0x00007CDC,\n\t10068: 0x00007CDE,\n\t10069: 0x00007CE2,\n\t10070: 0x00007CDF,\n\t10071: 0x00007CD9,\n\t10072: 0x00007CDD,\n\t10073: 0x00007E2E,\n\t10074: 0x00007E3E,\n\t10075: 0x00007E46,\n\t10076: 0x00007E37,\n\t10077: 0x00007E32,\n\t10078: 0x00007E43,\n\t10079: 0x00007E2B,\n\t10080: 0x00007E3D,\n\t10081: 0x00007E31,\n\t10082: 0x00007E45,\n\t10083: 0x00007E41,\n\t10084: 0x00007E34,\n\t10085: 0x00007E39,\n\t10086: 0x00007E48,\n\t10087: 0x00007E35,\n\t10088: 0x00007E3F,\n\t10089: 0x00007E2F,\n\t10090: 0x00007F44,\n\t10091: 0x00007FF3,\n\t10092: 0x00007FFC,\n\t10093: 0x00008071,\n\t10094: 0x00008072,\n\t10095: 0x00008070,\n\t10096: 0x0000806F,\n\t10097: 0x00008073,\n\t10098: 0x000081C6,\n\t10099: 0x000081C3,\n\t10100: 0x000081BA,\n\t10101: 0x000081C2,\n\t10102: 0x000081C0,\n\t10103: 0x000081BF,\n\t10104: 0x000081BD,\n\t10105: 0x000081C9,\n\t10106: 0x000081BE,\n\t10107: 0x000081E8,\n\t10108: 0x00008209,\n\t10109: 0x00008271,\n\t10110: 0x000085AA,\n\t10111: 0x00008584,\n\t10112: 0x0000857E,\n\t10113: 0x0000859C,\n\t10114: 0x00008591,\n\t10115: 0x00008594,\n\t10116: 0x000085AF,\n\t10117: 0x0000859B,\n\t10118: 0x00008587,\n\t10119: 0x000085A8,\n\t10120: 0x0000858A,\n\t10121: 0x00008667,\n\t10122: 0x000087C0,\n\t10123: 0x000087D1,\n\t10124: 0x000087B3,\n\t10125: 0x000087D2,\n\t10126: 0x000087C6,\n\t10127: 0x000087AB,\n\t10128: 0x000087BB,\n\t10129: 0x000087BA,\n\t10130: 0x000087C8,\n\t10131: 0x000087CB,\n\t10132: 0x0000893B,\n\t10133: 0x00008936,\n\t10134: 0x00008944,\n\t10135: 0x00008938,\n\t10136: 0x0000893D,\n\t10137: 0x000089AC,\n\t10138: 0x00008B0E,\n\t10139: 0x00008B17,\n\t10140: 0x00008B19,\n\t10141: 0x00008B1B,\n\t10142: 0x00008B0A,\n\t10143: 0x00008B20,\n\t10144: 0x00008B1D,\n\t10145: 0x00008B04,\n\t10146: 0x00008B10,\n\t10147: 0x00008C41,\n\t10148: 0x00008C3F,\n\t10149: 0x00008C73,\n\t10150: 0x00008CFA,\n\t10151: 0x00008CFD,\n\t10152: 0x00008CFC,\n\t10153: 0x00008CF8,\n\t10154: 0x00008CFB,\n\t10155: 0x00008DA8,\n\t10156: 0x00008E49,\n\t10157: 0x00008E4B,\n\t10158: 0x00008E48,\n\t10159: 0x00008E4A,\n\t10160: 0x00008F44,\n\t10161: 0x00008F3E,\n\t10162: 0x00008F42,\n\t10163: 0x00008F45,\n\t10164: 0x00008F3F,\n\t10165: 0x0000907F,\n\t10166: 0x0000907D,\n\t10167: 0x00009084,\n\t10168: 0x00009081,\n\t10169: 0x00009082,\n\t10170: 0x00009080,\n\t10171: 0x00009139,\n\t10172: 0x000091A3,\n\t10173: 0x0000919E,\n\t10174: 0x0000919C,\n\t10175: 0x0000934D,\n\t10176: 0x00009382,\n\t10177: 0x00009328,\n\t10178: 0x00009375,\n\t10179: 0x0000934A,\n\t10180: 0x00009365,\n\t10181: 0x0000934B,\n\t10182: 0x00009318,\n\t10183: 0x0000937E,\n\t10184: 0x0000936C,\n\t10185: 0x0000935B,\n\t10186: 0x00009370,\n\t10187: 0x0000935A,\n\t10188: 0x00009354,\n\t10189: 0x000095CA,\n\t10190: 0x000095CB,\n\t10191: 0x000095CC,\n\t10192: 0x000095C8,\n\t10193: 0x000095C6,\n\t10194: 0x000096B1,\n\t10195: 0x000096B8,\n\t10196: 0x000096D6,\n\t10197: 0x0000971C,\n\t10198: 0x0000971E,\n\t10199: 0x000097A0,\n\t10200: 0x000097D3,\n\t10201: 0x00009846,\n\t10202: 0x000098B6,\n\t10203: 0x00009935,\n\t10204: 0x00009A01,\n\t10205: 0x000099FF,\n\t10206: 0x00009BAE,\n\t10207: 0x00009BAB,\n\t10208: 0x00009BAA,\n\t10209: 0x00009BAD,\n\t10210: 0x00009D3B,\n\t10211: 0x00009D3F,\n\t10212: 0x00009E8B,\n\t10213: 0x00009ECF,\n\t10214: 0x00009EDE,\n\t10215: 0x00009EDC,\n\t10216: 0x00009EDD,\n\t10217: 0x00009EDB,\n\t10218: 0x00009F3E,\n\t10219: 0x00009F4B,\n\t10220: 0x000053E2,\n\t10221: 0x00005695,\n\t10222: 0x000056AE,\n\t10223: 0x000058D9,\n\t10224: 0x000058D8,\n\t10225: 0x00005B38,\n\t10226: 0x00005F5D,\n\t10227: 0x000061E3,\n\t10228: 0x00006233,\n\t10229: 0x000064F4,\n\t10230: 0x000064F2,\n\t10231: 0x000064FE,\n\t10232: 0x00006506,\n\t10233: 0x000064FA,\n\t10234: 0x000064FB,\n\t10235: 0x000064F7,\n\t10236: 0x000065B7,\n\t10237: 0x000066DC,\n\t10238: 0x00006726,\n\t10239: 0x00006AB3,\n\t10240: 0x00006AAC,\n\t10241: 0x00006AC3,\n\t10242: 0x00006ABB,\n\t10243: 0x00006AB8,\n\t10244: 0x00006AC2,\n\t10245: 0x00006AAE,\n\t10246: 0x00006AAF,\n\t10247: 0x00006B5F,\n\t10248: 0x00006B78,\n\t10249: 0x00006BAF,\n\t10250: 0x00007009,\n\t10251: 0x0000700B,\n\t10252: 0x00006FFE,\n\t10253: 0x00007006,\n\t10254: 0x00006FFA,\n\t10255: 0x00007011,\n\t10256: 0x0000700F,\n\t10257: 0x000071FB,\n\t10258: 0x000071FC,\n\t10259: 0x000071FE,\n\t10260: 0x000071F8,\n\t10261: 0x00007377,\n\t10262: 0x00007375,\n\t10263: 0x000074A7,\n\t10264: 0x000074BF,\n\t10265: 0x00007515,\n\t10266: 0x00007656,\n\t10267: 0x00007658,\n\t10268: 0x00007652,\n\t10269: 0x000077BD,\n\t10270: 0x000077BF,\n\t10271: 0x000077BB,\n\t10272: 0x000077BC,\n\t10273: 0x0000790E,\n\t10274: 0x000079AE,\n\t10275: 0x00007A61,\n\t10276: 0x00007A62,\n\t10277: 0x00007A60,\n\t10278: 0x00007AC4,\n\t10279: 0x00007AC5,\n\t10280: 0x00007C2B,\n\t10281: 0x00007C27,\n\t10282: 0x00007C2A,\n\t10283: 0x00007C1E,\n\t10284: 0x00007C23,\n\t10285: 0x00007C21,\n\t10286: 0x00007CE7,\n\t10287: 0x00007E54,\n\t10288: 0x00007E55,\n\t10289: 0x00007E5E,\n\t10290: 0x00007E5A,\n\t10291: 0x00007E61,\n\t10292: 0x00007E52,\n\t10293: 0x00007E59,\n\t10294: 0x00007F48,\n\t10295: 0x00007FF9,\n\t10296: 0x00007FFB,\n\t10297: 0x00008077,\n\t10298: 0x00008076,\n\t10299: 0x000081CD,\n\t10300: 0x000081CF,\n\t10301: 0x0000820A,\n\t10302: 0x000085CF,\n\t10303: 0x000085A9,\n\t10304: 0x000085CD,\n\t10305: 0x000085D0,\n\t10306: 0x000085C9,\n\t10307: 0x000085B0,\n\t10308: 0x000085BA,\n\t10309: 0x000085B9,\n\t10310: 0x000085A6,\n\t10311: 0x000087EF,\n\t10312: 0x000087EC,\n\t10313: 0x000087F2,\n\t10314: 0x000087E0,\n\t10315: 0x00008986,\n\t10316: 0x000089B2,\n\t10317: 0x000089F4,\n\t10318: 0x00008B28,\n\t10319: 0x00008B39,\n\t10320: 0x00008B2C,\n\t10321: 0x00008B2B,\n\t10322: 0x00008C50,\n\t10323: 0x00008D05,\n\t10324: 0x00008E59,\n\t10325: 0x00008E63,\n\t10326: 0x00008E66,\n\t10327: 0x00008E64,\n\t10328: 0x00008E5F,\n\t10329: 0x00008E55,\n\t10330: 0x00008EC0,\n\t10331: 0x00008F49,\n\t10332: 0x00008F4D,\n\t10333: 0x00009087,\n\t10334: 0x00009083,\n\t10335: 0x00009088,\n\t10336: 0x000091AB,\n\t10337: 0x000091AC,\n\t10338: 0x000091D0,\n\t10339: 0x00009394,\n\t10340: 0x0000938A,\n\t10341: 0x00009396,\n\t10342: 0x000093A2,\n\t10343: 0x000093B3,\n\t10344: 0x000093AE,\n\t10345: 0x000093AC,\n\t10346: 0x000093B0,\n\t10347: 0x00009398,\n\t10348: 0x0000939A,\n\t10349: 0x00009397,\n\t10350: 0x000095D4,\n\t10351: 0x000095D6,\n\t10352: 0x000095D0,\n\t10353: 0x000095D5,\n\t10354: 0x000096E2,\n\t10355: 0x000096DC,\n\t10356: 0x000096D9,\n\t10357: 0x000096DB,\n\t10358: 0x000096DE,\n\t10359: 0x00009724,\n\t10360: 0x000097A3,\n\t10361: 0x000097A6,\n\t10362: 0x000097AD,\n\t10363: 0x000097F9,\n\t10364: 0x0000984D,\n\t10365: 0x0000984F,\n\t10366: 0x0000984C,\n\t10367: 0x0000984E,\n\t10368: 0x00009853,\n\t10369: 0x000098BA,\n\t10370: 0x0000993E,\n\t10371: 0x0000993F,\n\t10372: 0x0000993D,\n\t10373: 0x0000992E,\n\t10374: 0x000099A5,\n\t10375: 0x00009A0E,\n\t10376: 0x00009AC1,\n\t10377: 0x00009B03,\n\t10378: 0x00009B06,\n\t10379: 0x00009B4F,\n\t10380: 0x00009B4E,\n\t10381: 0x00009B4D,\n\t10382: 0x00009BCA,\n\t10383: 0x00009BC9,\n\t10384: 0x00009BFD,\n\t10385: 0x00009BC8,\n\t10386: 0x00009BC0,\n\t10387: 0x00009D51,\n\t10388: 0x00009D5D,\n\t10389: 0x00009D60,\n\t10390: 0x00009EE0,\n\t10391: 0x00009F15,\n\t10392: 0x00009F2C,\n\t10393: 0x00005133,\n\t10394: 0x000056A5,\n\t10395: 0x000058DE,\n\t10396: 0x000058DF,\n\t10397: 0x000058E2,\n\t10398: 0x00005BF5,\n\t10399: 0x00009F90,\n\t10400: 0x00005EEC,\n\t10401: 0x000061F2,\n\t10402: 0x000061F7,\n\t10403: 0x000061F6,\n\t10404: 0x000061F5,\n\t10405: 0x00006500,\n\t10406: 0x0000650F,\n\t10407: 0x000066E0,\n\t10408: 0x000066DD,\n\t10409: 0x00006AE5,\n\t10410: 0x00006ADD,\n\t10411: 0x00006ADA,\n\t10412: 0x00006AD3,\n\t10413: 0x0000701B,\n\t10414: 0x0000701F,\n\t10415: 0x00007028,\n\t10416: 0x0000701A,\n\t10417: 0x0000701D,\n\t10418: 0x00007015,\n\t10419: 0x00007018,\n\t10420: 0x00007206,\n\t10421: 0x0000720D,\n\t10422: 0x00007258,\n\t10423: 0x000072A2,\n\t10424: 0x00007378,\n\t10425: 0x0000737A,\n\t10426: 0x000074BD,\n\t10427: 0x000074CA,\n\t10428: 0x000074E3,\n\t10429: 0x00007587,\n\t10430: 0x00007586,\n\t10431: 0x0000765F,\n\t10432: 0x00007661,\n\t10433: 0x000077C7,\n\t10434: 0x00007919,\n\t10435: 0x000079B1,\n\t10436: 0x00007A6B,\n\t10437: 0x00007A69,\n\t10438: 0x00007C3E,\n\t10439: 0x00007C3F,\n\t10440: 0x00007C38,\n\t10441: 0x00007C3D,\n\t10442: 0x00007C37,\n\t10443: 0x00007C40,\n\t10444: 0x00007E6B,\n\t10445: 0x00007E6D,\n\t10446: 0x00007E79,\n\t10447: 0x00007E69,\n\t10448: 0x00007E6A,\n\t10449: 0x00007F85,\n\t10450: 0x00007E73,\n\t10451: 0x00007FB6,\n\t10452: 0x00007FB9,\n\t10453: 0x00007FB8,\n\t10454: 0x000081D8,\n\t10455: 0x000085E9,\n\t10456: 0x000085DD,\n\t10457: 0x000085EA,\n\t10458: 0x000085D5,\n\t10459: 0x000085E4,\n\t10460: 0x000085E5,\n\t10461: 0x000085F7,\n\t10462: 0x000087FB,\n\t10463: 0x00008805,\n\t10464: 0x0000880D,\n\t10465: 0x000087F9,\n\t10466: 0x000087FE,\n\t10467: 0x00008960,\n\t10468: 0x0000895F,\n\t10469: 0x00008956,\n\t10470: 0x0000895E,\n\t10471: 0x00008B41,\n\t10472: 0x00008B5C,\n\t10473: 0x00008B58,\n\t10474: 0x00008B49,\n\t10475: 0x00008B5A,\n\t10476: 0x00008B4E,\n\t10477: 0x00008B4F,\n\t10478: 0x00008B46,\n\t10479: 0x00008B59,\n\t10480: 0x00008D08,\n\t10481: 0x00008D0A,\n\t10482: 0x00008E7C,\n\t10483: 0x00008E72,\n\t10484: 0x00008E87,\n\t10485: 0x00008E76,\n\t10486: 0x00008E6C,\n\t10487: 0x00008E7A,\n\t10488: 0x00008E74,\n\t10489: 0x00008F54,\n\t10490: 0x00008F4E,\n\t10491: 0x00008FAD,\n\t10492: 0x0000908A,\n\t10493: 0x0000908B,\n\t10494: 0x000091B1,\n\t10495: 0x000091AE,\n\t10496: 0x000093E1,\n\t10497: 0x000093D1,\n\t10498: 0x000093DF,\n\t10499: 0x000093C3,\n\t10500: 0x000093C8,\n\t10501: 0x000093DC,\n\t10502: 0x000093DD,\n\t10503: 0x000093D6,\n\t10504: 0x000093E2,\n\t10505: 0x000093CD,\n\t10506: 0x000093D8,\n\t10507: 0x000093E4,\n\t10508: 0x000093D7,\n\t10509: 0x000093E8,\n\t10510: 0x000095DC,\n\t10511: 0x000096B4,\n\t10512: 0x000096E3,\n\t10513: 0x0000972A,\n\t10514: 0x00009727,\n\t10515: 0x00009761,\n\t10516: 0x000097DC,\n\t10517: 0x000097FB,\n\t10518: 0x0000985E,\n\t10519: 0x00009858,\n\t10520: 0x0000985B,\n\t10521: 0x000098BC,\n\t10522: 0x00009945,\n\t10523: 0x00009949,\n\t10524: 0x00009A16,\n\t10525: 0x00009A19,\n\t10526: 0x00009B0D,\n\t10527: 0x00009BE8,\n\t10528: 0x00009BE7,\n\t10529: 0x00009BD6,\n\t10530: 0x00009BDB,\n\t10531: 0x00009D89,\n\t10532: 0x00009D61,\n\t10533: 0x00009D72,\n\t10534: 0x00009D6A,\n\t10535: 0x00009D6C,\n\t10536: 0x00009E92,\n\t10537: 0x00009E97,\n\t10538: 0x00009E93,\n\t10539: 0x00009EB4,\n\t10540: 0x000052F8,\n\t10541: 0x000056A8,\n\t10542: 0x000056B7,\n\t10543: 0x000056B6,\n\t10544: 0x000056B4,\n\t10545: 0x000056BC,\n\t10546: 0x000058E4,\n\t10547: 0x00005B40,\n\t10548: 0x00005B43,\n\t10549: 0x00005B7D,\n\t10550: 0x00005BF6,\n\t10551: 0x00005DC9,\n\t10552: 0x000061F8,\n\t10553: 0x000061FA,\n\t10554: 0x00006518,\n\t10555: 0x00006514,\n\t10556: 0x00006519,\n\t10557: 0x000066E6,\n\t10558: 0x00006727,\n\t10559: 0x00006AEC,\n\t10560: 0x0000703E,\n\t10561: 0x00007030,\n\t10562: 0x00007032,\n\t10563: 0x00007210,\n\t10564: 0x0000737B,\n\t10565: 0x000074CF,\n\t10566: 0x00007662,\n\t10567: 0x00007665,\n\t10568: 0x00007926,\n\t10569: 0x0000792A,\n\t10570: 0x0000792C,\n\t10571: 0x0000792B,\n\t10572: 0x00007AC7,\n\t10573: 0x00007AF6,\n\t10574: 0x00007C4C,\n\t10575: 0x00007C43,\n\t10576: 0x00007C4D,\n\t10577: 0x00007CEF,\n\t10578: 0x00007CF0,\n\t10579: 0x00008FAE,\n\t10580: 0x00007E7D,\n\t10581: 0x00007E7C,\n\t10582: 0x00007E82,\n\t10583: 0x00007F4C,\n\t10584: 0x00008000,\n\t10585: 0x000081DA,\n\t10586: 0x00008266,\n\t10587: 0x000085FB,\n\t10588: 0x000085F9,\n\t10589: 0x00008611,\n\t10590: 0x000085FA,\n\t10591: 0x00008606,\n\t10592: 0x0000860B,\n\t10593: 0x00008607,\n\t10594: 0x0000860A,\n\t10595: 0x00008814,\n\t10596: 0x00008815,\n\t10597: 0x00008964,\n\t10598: 0x000089BA,\n\t10599: 0x000089F8,\n\t10600: 0x00008B70,\n\t10601: 0x00008B6C,\n\t10602: 0x00008B66,\n\t10603: 0x00008B6F,\n\t10604: 0x00008B5F,\n\t10605: 0x00008B6B,\n\t10606: 0x00008D0F,\n\t10607: 0x00008D0D,\n\t10608: 0x00008E89,\n\t10609: 0x00008E81,\n\t10610: 0x00008E85,\n\t10611: 0x00008E82,\n\t10612: 0x000091B4,\n\t10613: 0x000091CB,\n\t10614: 0x00009418,\n\t10615: 0x00009403,\n\t10616: 0x000093FD,\n\t10617: 0x000095E1,\n\t10618: 0x00009730,\n\t10619: 0x000098C4,\n\t10620: 0x00009952,\n\t10621: 0x00009951,\n\t10622: 0x000099A8,\n\t10623: 0x00009A2B,\n\t10624: 0x00009A30,\n\t10625: 0x00009A37,\n\t10626: 0x00009A35,\n\t10627: 0x00009C13,\n\t10628: 0x00009C0D,\n\t10629: 0x00009E79,\n\t10630: 0x00009EB5,\n\t10631: 0x00009EE8,\n\t10632: 0x00009F2F,\n\t10633: 0x00009F5F,\n\t10634: 0x00009F63,\n\t10635: 0x00009F61,\n\t10636: 0x00005137,\n\t10637: 0x00005138,\n\t10638: 0x000056C1,\n\t10639: 0x000056C0,\n\t10640: 0x000056C2,\n\t10641: 0x00005914,\n\t10642: 0x00005C6C,\n\t10643: 0x00005DCD,\n\t10644: 0x000061FC,\n\t10645: 0x000061FE,\n\t10646: 0x0000651D,\n\t10647: 0x0000651C,\n\t10648: 0x00006595,\n\t10649: 0x000066E9,\n\t10650: 0x00006AFB,\n\t10651: 0x00006B04,\n\t10652: 0x00006AFA,\n\t10653: 0x00006BB2,\n\t10654: 0x0000704C,\n\t10655: 0x0000721B,\n\t10656: 0x000072A7,\n\t10657: 0x000074D6,\n\t10658: 0x000074D4,\n\t10659: 0x00007669,\n\t10660: 0x000077D3,\n\t10661: 0x00007C50,\n\t10662: 0x00007E8F,\n\t10663: 0x00007E8C,\n\t10664: 0x00007FBC,\n\t10665: 0x00008617,\n\t10666: 0x0000862D,\n\t10667: 0x0000861A,\n\t10668: 0x00008823,\n\t10669: 0x00008822,\n\t10670: 0x00008821,\n\t10671: 0x0000881F,\n\t10672: 0x0000896A,\n\t10673: 0x0000896C,\n\t10674: 0x000089BD,\n\t10675: 0x00008B74,\n\t10676: 0x00008B77,\n\t10677: 0x00008B7D,\n\t10678: 0x00008D13,\n\t10679: 0x00008E8A,\n\t10680: 0x00008E8D,\n\t10681: 0x00008E8B,\n\t10682: 0x00008F5F,\n\t10683: 0x00008FAF,\n\t10684: 0x000091BA,\n\t10685: 0x0000942E,\n\t10686: 0x00009433,\n\t10687: 0x00009435,\n\t10688: 0x0000943A,\n\t10689: 0x00009438,\n\t10690: 0x00009432,\n\t10691: 0x0000942B,\n\t10692: 0x000095E2,\n\t10693: 0x00009738,\n\t10694: 0x00009739,\n\t10695: 0x00009732,\n\t10696: 0x000097FF,\n\t10697: 0x00009867,\n\t10698: 0x00009865,\n\t10699: 0x00009957,\n\t10700: 0x00009A45,\n\t10701: 0x00009A43,\n\t10702: 0x00009A40,\n\t10703: 0x00009A3E,\n\t10704: 0x00009ACF,\n\t10705: 0x00009B54,\n\t10706: 0x00009B51,\n\t10707: 0x00009C2D,\n\t10708: 0x00009C25,\n\t10709: 0x00009DAF,\n\t10710: 0x00009DB4,\n\t10711: 0x00009DC2,\n\t10712: 0x00009DB8,\n\t10713: 0x00009E9D,\n\t10714: 0x00009EEF,\n\t10715: 0x00009F19,\n\t10716: 0x00009F5C,\n\t10717: 0x00009F66,\n\t10718: 0x00009F67,\n\t10719: 0x0000513C,\n\t10720: 0x0000513B,\n\t10721: 0x000056C8,\n\t10722: 0x000056CA,\n\t10723: 0x000056C9,\n\t10724: 0x00005B7F,\n\t10725: 0x00005DD4,\n\t10726: 0x00005DD2,\n\t10727: 0x00005F4E,\n\t10728: 0x000061FF,\n\t10729: 0x00006524,\n\t10730: 0x00006B0A,\n\t10731: 0x00006B61,\n\t10732: 0x00007051,\n\t10733: 0x00007058,\n\t10734: 0x00007380,\n\t10735: 0x000074E4,\n\t10736: 0x0000758A,\n\t10737: 0x0000766E,\n\t10738: 0x0000766C,\n\t10739: 0x000079B3,\n\t10740: 0x00007C60,\n\t10741: 0x00007C5F,\n\t10742: 0x0000807E,\n\t10743: 0x0000807D,\n\t10744: 0x000081DF,\n\t10745: 0x00008972,\n\t10746: 0x0000896F,\n\t10747: 0x000089FC,\n\t10748: 0x00008B80,\n\t10749: 0x00008D16,\n\t10750: 0x00008D17,\n\t10751: 0x00008E91,\n\t10752: 0x00008E93,\n\t10753: 0x00008F61,\n\t10754: 0x00009148,\n\t10755: 0x00009444,\n\t10756: 0x00009451,\n\t10757: 0x00009452,\n\t10758: 0x0000973D,\n\t10759: 0x0000973E,\n\t10760: 0x000097C3,\n\t10761: 0x000097C1,\n\t10762: 0x0000986B,\n\t10763: 0x00009955,\n\t10764: 0x00009A55,\n\t10765: 0x00009A4D,\n\t10766: 0x00009AD2,\n\t10767: 0x00009B1A,\n\t10768: 0x00009C49,\n\t10769: 0x00009C31,\n\t10770: 0x00009C3E,\n\t10771: 0x00009C3B,\n\t10772: 0x00009DD3,\n\t10773: 0x00009DD7,\n\t10774: 0x00009F34,\n\t10775: 0x00009F6C,\n\t10776: 0x00009F6A,\n\t10777: 0x00009F94,\n\t10778: 0x000056CC,\n\t10779: 0x00005DD6,\n\t10780: 0x00006200,\n\t10781: 0x00006523,\n\t10782: 0x0000652B,\n\t10783: 0x0000652A,\n\t10784: 0x000066EC,\n\t10785: 0x00006B10,\n\t10786: 0x000074DA,\n\t10787: 0x00007ACA,\n\t10788: 0x00007C64,\n\t10789: 0x00007C63,\n\t10790: 0x00007C65,\n\t10791: 0x00007E93,\n\t10792: 0x00007E96,\n\t10793: 0x00007E94,\n\t10794: 0x000081E2,\n\t10795: 0x00008638,\n\t10796: 0x0000863F,\n\t10797: 0x00008831,\n\t10798: 0x00008B8A,\n\t10799: 0x00009090,\n\t10800: 0x0000908F,\n\t10801: 0x00009463,\n\t10802: 0x00009460,\n\t10803: 0x00009464,\n\t10804: 0x00009768,\n\t10805: 0x0000986F,\n\t10806: 0x0000995C,\n\t10807: 0x00009A5A,\n\t10808: 0x00009A5B,\n\t10809: 0x00009A57,\n\t10810: 0x00009AD3,\n\t10811: 0x00009AD4,\n\t10812: 0x00009AD1,\n\t10813: 0x00009C54,\n\t10814: 0x00009C57,\n\t10815: 0x00009C56,\n\t10816: 0x00009DE5,\n\t10817: 0x00009E9F,\n\t10818: 0x00009EF4,\n\t10819: 0x000056D1,\n\t10820: 0x000058E9,\n\t10821: 0x0000652C,\n\t10822: 0x0000705E,\n\t10823: 0x00007671,\n\t10824: 0x00007672,\n\t10825: 0x000077D7,\n\t10826: 0x00007F50,\n\t10827: 0x00007F88,\n\t10828: 0x00008836,\n\t10829: 0x00008839,\n\t10830: 0x00008862,\n\t10831: 0x00008B93,\n\t10832: 0x00008B92,\n\t10833: 0x00008B96,\n\t10834: 0x00008277,\n\t10835: 0x00008D1B,\n\t10836: 0x000091C0,\n\t10837: 0x0000946A,\n\t10838: 0x00009742,\n\t10839: 0x00009748,\n\t10840: 0x00009744,\n\t10841: 0x000097C6,\n\t10842: 0x00009870,\n\t10843: 0x00009A5F,\n\t10844: 0x00009B22,\n\t10845: 0x00009B58,\n\t10846: 0x00009C5F,\n\t10847: 0x00009DF9,\n\t10848: 0x00009DFA,\n\t10849: 0x00009E7C,\n\t10850: 0x00009E7D,\n\t10851: 0x00009F07,\n\t10852: 0x00009F77,\n\t10853: 0x00009F72,\n\t10854: 0x00005EF3,\n\t10855: 0x00006B16,\n\t10856: 0x00007063,\n\t10857: 0x00007C6C,\n\t10858: 0x00007C6E,\n\t10859: 0x0000883B,\n\t10860: 0x000089C0,\n\t10861: 0x00008EA1,\n\t10862: 0x000091C1,\n\t10863: 0x00009472,\n\t10864: 0x00009470,\n\t10865: 0x00009871,\n\t10866: 0x0000995E,\n\t10867: 0x00009AD6,\n\t10868: 0x00009B23,\n\t10869: 0x00009ECC,\n\t10870: 0x00007064,\n\t10871: 0x000077DA,\n\t10872: 0x00008B9A,\n\t10873: 0x00009477,\n\t10874: 0x000097C9,\n\t10875: 0x00009A62,\n\t10876: 0x00009A65,\n\t10877: 0x00007E9C,\n\t10878: 0x00008B9C,\n\t10879: 0x00008EAA,\n\t10880: 0x000091C5,\n\t10881: 0x0000947D,\n\t10882: 0x0000947E,\n\t10883: 0x0000947C,\n\t10884: 0x00009C77,\n\t10885: 0x00009C78,\n\t10886: 0x00009EF7,\n\t10887: 0x00008C54,\n\t10888: 0x0000947F,\n\t10889: 0x00009E1A,\n\t10890: 0x00007228,\n\t10891: 0x00009A6A,\n\t10892: 0x00009B31,\n\t10893: 0x00009E1B,\n\t10894: 0x00009E1E,\n\t10895: 0x00007C72,\n\t10896: 0x00002460,\n\t10897: 0x00002461,\n\t10898: 0x00002462,\n\t10899: 0x00002463,\n\t10900: 0x00002464,\n\t10901: 0x00002465,\n\t10902: 0x00002466,\n\t10903: 0x00002467,\n\t10904: 0x00002468,\n\t10905: 0x00002469,\n\t10906: 0x00002474,\n\t10907: 0x00002475,\n\t10908: 0x00002476,\n\t10909: 0x00002477,\n\t10910: 0x00002478,\n\t10911: 0x00002479,\n\t10912: 0x0000247A,\n\t10913: 0x0000247B,\n\t10914: 0x0000247C,\n\t10915: 0x0000247D,\n\t10916: 0x00002170,\n\t10917: 0x00002171,\n\t10918: 0x00002172,\n\t10919: 0x00002173,\n\t10920: 0x00002174,\n\t10921: 0x00002175,\n\t10922: 0x00002176,\n\t10923: 0x00002177,\n\t10924: 0x00002178,\n\t10925: 0x00002179,\n\t10926: 0x00004E36,\n\t10927: 0x00004E3F,\n\t10928: 0x00004E85,\n\t10929: 0x00004EA0,\n\t10930: 0x00005182,\n\t10931: 0x00005196,\n\t10932: 0x000051AB,\n\t10933: 0x000052F9,\n\t10934: 0x00005338,\n\t10935: 0x00005369,\n\t10936: 0x000053B6,\n\t10937: 0x0000590A,\n\t10938: 0x00005B80,\n\t10939: 0x00005DDB,\n\t10940: 0x00002F33,\n\t10941: 0x00005E7F,\n\t10942: 0x00005EF4,\n\t10943: 0x00005F50,\n\t10944: 0x00005F61,\n\t10945: 0x00006534,\n\t10946: 0x000065E0,\n\t10947: 0x00007592,\n\t10948: 0x00007676,\n\t10949: 0x00008FB5,\n\t10950: 0x000096B6,\n\t10951: 0x000000A8,\n\t10952: 0x000002C6,\n\t10953: 0x000030FD,\n\t10954: 0x000030FE,\n\t10955: 0x0000309D,\n\t10956: 0x0000309E,\n\t10957: 0x00003003,\n\t10958: 0x00004EDD,\n\t10959: 0x00003005,\n\t10960: 0x00003006,\n\t10961: 0x00003007,\n\t10962: 0x000030FC,\n\t10963: 0x0000FF3B,\n\t10964: 0x0000FF3D,\n\t10965: 0x0000273D,\n\t10966: 0x00003041,\n\t10967: 0x00003042,\n\t10968: 0x00003043,\n\t10969: 0x00003044,\n\t10970: 0x00003045,\n\t10971: 0x00003046,\n\t10972: 0x00003047,\n\t10973: 0x00003048,\n\t10974: 0x00003049,\n\t10975: 0x0000304A,\n\t10976: 0x0000304B,\n\t10977: 0x0000304C,\n\t10978: 0x0000304D,\n\t10979: 0x0000304E,\n\t10980: 0x0000304F,\n\t10981: 0x00003050,\n\t10982: 0x00003051,\n\t10983: 0x00003052,\n\t10984: 0x00003053,\n\t10985: 0x00003054,\n\t10986: 0x00003055,\n\t10987: 0x00003056,\n\t10988: 0x00003057,\n\t10989: 0x00003058,\n\t10990: 0x00003059,\n\t10991: 0x0000305A,\n\t10992: 0x0000305B,\n\t10993: 0x0000305C,\n\t10994: 0x0000305D,\n\t10995: 0x0000305E,\n\t10996: 0x0000305F,\n\t10997: 0x00003060,\n\t10998: 0x00003061,\n\t10999: 0x00003062,\n\t11000: 0x00003063,\n\t11001: 0x00003064,\n\t11002: 0x00003065,\n\t11003: 0x00003066,\n\t11004: 0x00003067,\n\t11005: 0x00003068,\n\t11006: 0x00003069,\n\t11007: 0x0000306A,\n\t11008: 0x0000306B,\n\t11009: 0x0000306C,\n\t11010: 0x0000306D,\n\t11011: 0x0000306E,\n\t11012: 0x0000306F,\n\t11013: 0x00003070,\n\t11014: 0x00003071,\n\t11015: 0x00003072,\n\t11016: 0x00003073,\n\t11017: 0x00003074,\n\t11018: 0x00003075,\n\t11019: 0x00003076,\n\t11020: 0x00003077,\n\t11021: 0x00003078,\n\t11022: 0x00003079,\n\t11023: 0x0000307A,\n\t11024: 0x0000307B,\n\t11025: 0x0000307C,\n\t11026: 0x0000307D,\n\t11027: 0x0000307E,\n\t11028: 0x0000307F,\n\t11029: 0x00003080,\n\t11030: 0x00003081,\n\t11031: 0x00003082,\n\t11032: 0x00003083,\n\t11033: 0x00003084,\n\t11034: 0x00003085,\n\t11035: 0x00003086,\n\t11036: 0x00003087,\n\t11037: 0x00003088,\n\t11038: 0x00003089,\n\t11039: 0x0000308A,\n\t11040: 0x0000308B,\n\t11041: 0x0000308C,\n\t11042: 0x0000308D,\n\t11043: 0x0000308E,\n\t11044: 0x0000308F,\n\t11045: 0x00003090,\n\t11046: 0x00003091,\n\t11047: 0x00003092,\n\t11048: 0x00003093,\n\t11049: 0x000030A1,\n\t11050: 0x000030A2,\n\t11051: 0x000030A3,\n\t11052: 0x000030A4,\n\t11053: 0x000030A5,\n\t11054: 0x000030A6,\n\t11055: 0x000030A7,\n\t11056: 0x000030A8,\n\t11057: 0x000030A9,\n\t11058: 0x000030AA,\n\t11059: 0x000030AB,\n\t11060: 0x000030AC,\n\t11061: 0x000030AD,\n\t11062: 0x000030AE,\n\t11063: 0x000030AF,\n\t11064: 0x000030B0,\n\t11065: 0x000030B1,\n\t11066: 0x000030B2,\n\t11067: 0x000030B3,\n\t11068: 0x000030B4,\n\t11069: 0x000030B5,\n\t11070: 0x000030B6,\n\t11071: 0x000030B7,\n\t11072: 0x000030B8,\n\t11073: 0x000030B9,\n\t11074: 0x000030BA,\n\t11075: 0x000030BB,\n\t11076: 0x000030BC,\n\t11077: 0x000030BD,\n\t11078: 0x000030BE,\n\t11079: 0x000030BF,\n\t11080: 0x000030C0,\n\t11081: 0x000030C1,\n\t11082: 0x000030C2,\n\t11083: 0x000030C3,\n\t11084: 0x000030C4,\n\t11085: 0x000030C5,\n\t11086: 0x000030C6,\n\t11087: 0x000030C7,\n\t11088: 0x000030C8,\n\t11089: 0x000030C9,\n\t11090: 0x000030CA,\n\t11091: 0x000030CB,\n\t11092: 0x000030CC,\n\t11093: 0x000030CD,\n\t11094: 0x000030CE,\n\t11095: 0x000030CF,\n\t11096: 0x000030D0,\n\t11097: 0x000030D1,\n\t11098: 0x000030D2,\n\t11099: 0x000030D3,\n\t11100: 0x000030D4,\n\t11101: 0x000030D5,\n\t11102: 0x000030D6,\n\t11103: 0x000030D7,\n\t11104: 0x000030D8,\n\t11105: 0x000030D9,\n\t11106: 0x000030DA,\n\t11107: 0x000030DB,\n\t11108: 0x000030DC,\n\t11109: 0x000030DD,\n\t11110: 0x000030DE,\n\t11111: 0x000030DF,\n\t11112: 0x000030E0,\n\t11113: 0x000030E1,\n\t11114: 0x000030E2,\n\t11115: 0x000030E3,\n\t11116: 0x000030E4,\n\t11117: 0x000030E5,\n\t11118: 0x000030E6,\n\t11119: 0x000030E7,\n\t11120: 0x000030E8,\n\t11121: 0x000030E9,\n\t11122: 0x000030EA,\n\t11123: 0x000030EB,\n\t11124: 0x000030EC,\n\t11125: 0x000030ED,\n\t11126: 0x000030EE,\n\t11127: 0x000030EF,\n\t11128: 0x000030F0,\n\t11129: 0x000030F1,\n\t11130: 0x000030F2,\n\t11131: 0x000030F3,\n\t11132: 0x000030F4,\n\t11133: 0x000030F5,\n\t11134: 0x000030F6,\n\t11135: 0x00000410,\n\t11136: 0x00000411,\n\t11137: 0x00000412,\n\t11138: 0x00000413,\n\t11139: 0x00000414,\n\t11140: 0x00000415,\n\t11141: 0x00000401,\n\t11142: 0x00000416,\n\t11143: 0x00000417,\n\t11144: 0x00000418,\n\t11145: 0x00000419,\n\t11146: 0x0000041A,\n\t11147: 0x0000041B,\n\t11148: 0x0000041C,\n\t11149: 0x0000041D,\n\t11150: 0x0000041E,\n\t11151: 0x0000041F,\n\t11152: 0x00000420,\n\t11153: 0x00000421,\n\t11154: 0x00000422,\n\t11155: 0x00000423,\n\t11156: 0x00000424,\n\t11157: 0x00000425,\n\t11158: 0x00000426,\n\t11159: 0x00000427,\n\t11160: 0x00000428,\n\t11161: 0x00000429,\n\t11162: 0x0000042A,\n\t11163: 0x0000042B,\n\t11164: 0x0000042C,\n\t11165: 0x0000042D,\n\t11166: 0x0000042E,\n\t11167: 0x0000042F,\n\t11168: 0x00000430,\n\t11169: 0x00000431,\n\t11170: 0x00000432,\n\t11171: 0x00000433,\n\t11172: 0x00000434,\n\t11173: 0x00000435,\n\t11174: 0x00000451,\n\t11175: 0x00000436,\n\t11176: 0x00000437,\n\t11177: 0x00000438,\n\t11178: 0x00000439,\n\t11179: 0x0000043A,\n\t11180: 0x0000043B,\n\t11181: 0x0000043C,\n\t11182: 0x0000043D,\n\t11183: 0x0000043E,\n\t11184: 0x0000043F,\n\t11185: 0x00000440,\n\t11186: 0x00000441,\n\t11187: 0x00000442,\n\t11188: 0x00000443,\n\t11189: 0x00000444,\n\t11190: 0x00000445,\n\t11191: 0x00000446,\n\t11192: 0x00000447,\n\t11193: 0x00000448,\n\t11194: 0x00000449,\n\t11195: 0x0000044A,\n\t11196: 0x0000044B,\n\t11197: 0x0000044C,\n\t11198: 0x0000044D,\n\t11199: 0x0000044E,\n\t11200: 0x0000044F,\n\t11201: 0x000021E7,\n\t11202: 0x000021B8,\n\t11203: 0x000021B9,\n\t11204: 0x000031CF,\n\t11205: 0x000200CC,\n\t11206: 0x00004E5A,\n\t11207: 0x0002008A,\n\t11208: 0x00005202,\n\t11209: 0x00004491,\n\t11210: 0x00009FB0,\n\t11211: 0x00005188,\n\t11212: 0x00009FB1,\n\t11213: 0x00027607,\n\t11254: 0x0000FFE2,\n\t11255: 0x0000FFE4,\n\t11256: 0x0000FF07,\n\t11257: 0x0000FF02,\n\t11258: 0x00003231,\n\t11259: 0x00002116,\n\t11260: 0x00002121,\n\t11261: 0x0000309B,\n\t11262: 0x0000309C,\n\t11263: 0x00002E80,\n\t11264: 0x00002E84,\n\t11265: 0x00002E86,\n\t11266: 0x00002E87,\n\t11267: 0x00002E88,\n\t11268: 0x00002E8A,\n\t11269: 0x00002E8C,\n\t11270: 0x00002E8D,\n\t11271: 0x00002E95,\n\t11272: 0x00002E9C,\n\t11273: 0x00002E9D,\n\t11274: 0x00002EA5,\n\t11275: 0x00002EA7,\n\t11276: 0x00002EAA,\n\t11277: 0x00002EAC,\n\t11278: 0x00002EAE,\n\t11279: 0x00002EB6,\n\t11280: 0x00002EBC,\n\t11281: 0x00002EBE,\n\t11282: 0x00002EC6,\n\t11283: 0x00002ECA,\n\t11284: 0x00002ECC,\n\t11285: 0x00002ECD,\n\t11286: 0x00002ECF,\n\t11287: 0x00002ED6,\n\t11288: 0x00002ED7,\n\t11289: 0x00002EDE,\n\t11290: 0x00002EE3,\n\t11294: 0x00000283,\n\t11295: 0x00000250,\n\t11296: 0x0000025B,\n\t11297: 0x00000254,\n\t11298: 0x00000275,\n\t11299: 0x00000153,\n\t11300: 0x000000F8,\n\t11301: 0x0000014B,\n\t11302: 0x0000028A,\n\t11303: 0x0000026A,\n\t11304: 0x00004E42,\n\t11305: 0x00004E5C,\n\t11306: 0x000051F5,\n\t11307: 0x0000531A,\n\t11308: 0x00005382,\n\t11309: 0x00004E07,\n\t11310: 0x00004E0C,\n\t11311: 0x00004E47,\n\t11312: 0x00004E8D,\n\t11313: 0x000056D7,\n\t11314: 0x0000FA0C,\n\t11315: 0x00005C6E,\n\t11316: 0x00005F73,\n\t11317: 0x00004E0F,\n\t11318: 0x00005187,\n\t11319: 0x00004E0E,\n\t11320: 0x00004E2E,\n\t11321: 0x00004E93,\n\t11322: 0x00004EC2,\n\t11323: 0x00004EC9,\n\t11324: 0x00004EC8,\n\t11325: 0x00005198,\n\t11326: 0x000052FC,\n\t11327: 0x0000536C,\n\t11328: 0x000053B9,\n\t11329: 0x00005720,\n\t11330: 0x00005903,\n\t11331: 0x0000592C,\n\t11332: 0x00005C10,\n\t11333: 0x00005DFF,\n\t11334: 0x000065E1,\n\t11335: 0x00006BB3,\n\t11336: 0x00006BCC,\n\t11337: 0x00006C14,\n\t11338: 0x0000723F,\n\t11339: 0x00004E31,\n\t11340: 0x00004E3C,\n\t11341: 0x00004EE8,\n\t11342: 0x00004EDC,\n\t11343: 0x00004EE9,\n\t11344: 0x00004EE1,\n\t11345: 0x00004EDD,\n\t11346: 0x00004EDA,\n\t11347: 0x0000520C,\n\t11348: 0x0000531C,\n\t11349: 0x0000534C,\n\t11350: 0x00005722,\n\t11351: 0x00005723,\n\t11352: 0x00005917,\n\t11353: 0x0000592F,\n\t11354: 0x00005B81,\n\t11355: 0x00005B84,\n\t11356: 0x00005C12,\n\t11357: 0x00005C3B,\n\t11358: 0x00005C74,\n\t11359: 0x00005C73,\n\t11360: 0x00005E04,\n\t11361: 0x00005E80,\n\t11362: 0x00005E82,\n\t11363: 0x00005FC9,\n\t11364: 0x00006209,\n\t11365: 0x00006250,\n\t11366: 0x00006C15,\n\t11367: 0x00006C36,\n\t11368: 0x00006C43,\n\t11369: 0x00006C3F,\n\t11370: 0x00006C3B,\n\t11371: 0x000072AE,\n\t11372: 0x000072B0,\n\t11373: 0x0000738A,\n\t11374: 0x000079B8,\n\t11375: 0x0000808A,\n\t11376: 0x0000961E,\n\t11377: 0x00004F0E,\n\t11378: 0x00004F18,\n\t11379: 0x00004F2C,\n\t11380: 0x00004EF5,\n\t11381: 0x00004F14,\n\t11382: 0x00004EF1,\n\t11383: 0x00004F00,\n\t11384: 0x00004EF7,\n\t11385: 0x00004F08,\n\t11386: 0x00004F1D,\n\t11387: 0x00004F02,\n\t11388: 0x00004F05,\n\t11389: 0x00004F22,\n\t11390: 0x00004F13,\n\t11391: 0x00004F04,\n\t11392: 0x00004EF4,\n\t11393: 0x00004F12,\n\t11394: 0x000051B1,\n\t11395: 0x00005213,\n\t11396: 0x00005209,\n\t11397: 0x00005210,\n\t11398: 0x000052A6,\n\t11399: 0x00005322,\n\t11400: 0x0000531F,\n\t11401: 0x0000534D,\n\t11402: 0x0000538A,\n\t11403: 0x00005407,\n\t11404: 0x000056E1,\n\t11405: 0x000056DF,\n\t11406: 0x0000572E,\n\t11407: 0x0000572A,\n\t11408: 0x00005734,\n\t11409: 0x0000593C,\n\t11410: 0x00005980,\n\t11411: 0x0000597C,\n\t11412: 0x00005985,\n\t11413: 0x0000597B,\n\t11414: 0x0000597E,\n\t11415: 0x00005977,\n\t11416: 0x0000597F,\n\t11417: 0x00005B56,\n\t11418: 0x00005C15,\n\t11419: 0x00005C25,\n\t11420: 0x00005C7C,\n\t11421: 0x00005C7A,\n\t11422: 0x00005C7B,\n\t11423: 0x00005C7E,\n\t11424: 0x00005DDF,\n\t11425: 0x00005E75,\n\t11426: 0x00005E84,\n\t11427: 0x00005F02,\n\t11428: 0x00005F1A,\n\t11429: 0x00005F74,\n\t11430: 0x00005FD5,\n\t11431: 0x00005FD4,\n\t11432: 0x00005FCF,\n\t11433: 0x0000625C,\n\t11434: 0x0000625E,\n\t11435: 0x00006264,\n\t11436: 0x00006261,\n\t11437: 0x00006266,\n\t11438: 0x00006262,\n\t11439: 0x00006259,\n\t11440: 0x00006260,\n\t11441: 0x0000625A,\n\t11442: 0x00006265,\n\t11443: 0x000065EF,\n\t11444: 0x000065EE,\n\t11445: 0x0000673E,\n\t11446: 0x00006739,\n\t11447: 0x00006738,\n\t11448: 0x0000673B,\n\t11449: 0x0000673A,\n\t11450: 0x0000673F,\n\t11451: 0x0000673C,\n\t11452: 0x00006733,\n\t11453: 0x00006C18,\n\t11454: 0x00006C46,\n\t11455: 0x00006C52,\n\t11456: 0x00006C5C,\n\t11457: 0x00006C4F,\n\t11458: 0x00006C4A,\n\t11459: 0x00006C54,\n\t11460: 0x00006C4B,\n\t11461: 0x00006C4C,\n\t11462: 0x00007071,\n\t11463: 0x0000725E,\n\t11464: 0x000072B4,\n\t11465: 0x000072B5,\n\t11466: 0x0000738E,\n\t11467: 0x0000752A,\n\t11468: 0x0000767F,\n\t11469: 0x00007A75,\n\t11470: 0x00007F51,\n\t11471: 0x00008278,\n\t11472: 0x0000827C,\n\t11473: 0x00008280,\n\t11474: 0x0000827D,\n\t11475: 0x0000827F,\n\t11476: 0x0000864D,\n\t11477: 0x0000897E,\n\t11478: 0x00009099,\n\t11479: 0x00009097,\n\t11480: 0x00009098,\n\t11481: 0x0000909B,\n\t11482: 0x00009094,\n\t11483: 0x00009622,\n\t11484: 0x00009624,\n\t11485: 0x00009620,\n\t11486: 0x00009623,\n\t11487: 0x00004F56,\n\t11488: 0x00004F3B,\n\t11489: 0x00004F62,\n\t11490: 0x00004F49,\n\t11491: 0x00004F53,\n\t11492: 0x00004F64,\n\t11493: 0x00004F3E,\n\t11494: 0x00004F67,\n\t11495: 0x00004F52,\n\t11496: 0x00004F5F,\n\t11497: 0x00004F41,\n\t11498: 0x00004F58,\n\t11499: 0x00004F2D,\n\t11500: 0x00004F33,\n\t11501: 0x00004F3F,\n\t11502: 0x00004F61,\n\t11503: 0x0000518F,\n\t11504: 0x000051B9,\n\t11505: 0x0000521C,\n\t11506: 0x0000521E,\n\t11507: 0x00005221,\n\t11508: 0x000052AD,\n\t11509: 0x000052AE,\n\t11510: 0x00005309,\n\t11511: 0x00005363,\n\t11512: 0x00005372,\n\t11513: 0x0000538E,\n\t11514: 0x0000538F,\n\t11515: 0x00005430,\n\t11516: 0x00005437,\n\t11517: 0x0000542A,\n\t11518: 0x00005454,\n\t11519: 0x00005445,\n\t11520: 0x00005419,\n\t11521: 0x0000541C,\n\t11522: 0x00005425,\n\t11523: 0x00005418,\n\t11524: 0x0000543D,\n\t11525: 0x0000544F,\n\t11526: 0x00005441,\n\t11527: 0x00005428,\n\t11528: 0x00005424,\n\t11529: 0x00005447,\n\t11530: 0x000056EE,\n\t11531: 0x000056E7,\n\t11532: 0x000056E5,\n\t11533: 0x00005741,\n\t11534: 0x00005745,\n\t11535: 0x0000574C,\n\t11536: 0x00005749,\n\t11537: 0x0000574B,\n\t11538: 0x00005752,\n\t11539: 0x00005906,\n\t11540: 0x00005940,\n\t11541: 0x000059A6,\n\t11542: 0x00005998,\n\t11543: 0x000059A0,\n\t11544: 0x00005997,\n\t11545: 0x0000598E,\n\t11546: 0x000059A2,\n\t11547: 0x00005990,\n\t11548: 0x0000598F,\n\t11549: 0x000059A7,\n\t11550: 0x000059A1,\n\t11551: 0x00005B8E,\n\t11552: 0x00005B92,\n\t11553: 0x00005C28,\n\t11554: 0x00005C2A,\n\t11555: 0x00005C8D,\n\t11556: 0x00005C8F,\n\t11557: 0x00005C88,\n\t11558: 0x00005C8B,\n\t11559: 0x00005C89,\n\t11560: 0x00005C92,\n\t11561: 0x00005C8A,\n\t11562: 0x00005C86,\n\t11563: 0x00005C93,\n\t11564: 0x00005C95,\n\t11565: 0x00005DE0,\n\t11566: 0x00005E0A,\n\t11567: 0x00005E0E,\n\t11568: 0x00005E8B,\n\t11569: 0x00005E89,\n\t11570: 0x00005E8C,\n\t11571: 0x00005E88,\n\t11572: 0x00005E8D,\n\t11573: 0x00005F05,\n\t11574: 0x00005F1D,\n\t11575: 0x00005F78,\n\t11576: 0x00005F76,\n\t11577: 0x00005FD2,\n\t11578: 0x00005FD1,\n\t11579: 0x00005FD0,\n\t11580: 0x00005FED,\n\t11581: 0x00005FE8,\n\t11582: 0x00005FEE,\n\t11583: 0x00005FF3,\n\t11584: 0x00005FE1,\n\t11585: 0x00005FE4,\n\t11586: 0x00005FE3,\n\t11587: 0x00005FFA,\n\t11588: 0x00005FEF,\n\t11589: 0x00005FF7,\n\t11590: 0x00005FFB,\n\t11591: 0x00006000,\n\t11592: 0x00005FF4,\n\t11593: 0x0000623A,\n\t11594: 0x00006283,\n\t11595: 0x0000628C,\n\t11596: 0x0000628E,\n\t11597: 0x0000628F,\n\t11598: 0x00006294,\n\t11599: 0x00006287,\n\t11600: 0x00006271,\n\t11601: 0x0000627B,\n\t11602: 0x0000627A,\n\t11603: 0x00006270,\n\t11604: 0x00006281,\n\t11605: 0x00006288,\n\t11606: 0x00006277,\n\t11607: 0x0000627D,\n\t11608: 0x00006272,\n\t11609: 0x00006274,\n\t11610: 0x00006537,\n\t11611: 0x000065F0,\n\t11612: 0x000065F4,\n\t11613: 0x000065F3,\n\t11614: 0x000065F2,\n\t11615: 0x000065F5,\n\t11616: 0x00006745,\n\t11617: 0x00006747,\n\t11618: 0x00006759,\n\t11619: 0x00006755,\n\t11620: 0x0000674C,\n\t11621: 0x00006748,\n\t11622: 0x0000675D,\n\t11623: 0x0000674D,\n\t11624: 0x0000675A,\n\t11625: 0x0000674B,\n\t11626: 0x00006BD0,\n\t11627: 0x00006C19,\n\t11628: 0x00006C1A,\n\t11629: 0x00006C78,\n\t11630: 0x00006C67,\n\t11631: 0x00006C6B,\n\t11632: 0x00006C84,\n\t11633: 0x00006C8B,\n\t11634: 0x00006C8F,\n\t11635: 0x00006C71,\n\t11636: 0x00006C6F,\n\t11637: 0x00006C69,\n\t11638: 0x00006C9A,\n\t11639: 0x00006C6D,\n\t11640: 0x00006C87,\n\t11641: 0x00006C95,\n\t11642: 0x00006C9C,\n\t11643: 0x00006C66,\n\t11644: 0x00006C73,\n\t11645: 0x00006C65,\n\t11646: 0x00006C7B,\n\t11647: 0x00006C8E,\n\t11648: 0x00007074,\n\t11649: 0x0000707A,\n\t11650: 0x00007263,\n\t11651: 0x000072BF,\n\t11652: 0x000072BD,\n\t11653: 0x000072C3,\n\t11654: 0x000072C6,\n\t11655: 0x000072C1,\n\t11656: 0x000072BA,\n\t11657: 0x000072C5,\n\t11658: 0x00007395,\n\t11659: 0x00007397,\n\t11660: 0x00007393,\n\t11661: 0x00007394,\n\t11662: 0x00007392,\n\t11663: 0x0000753A,\n\t11664: 0x00007539,\n\t11665: 0x00007594,\n\t11666: 0x00007595,\n\t11667: 0x00007681,\n\t11668: 0x0000793D,\n\t11669: 0x00008034,\n\t11670: 0x00008095,\n\t11671: 0x00008099,\n\t11672: 0x00008090,\n\t11673: 0x00008092,\n\t11674: 0x0000809C,\n\t11675: 0x00008290,\n\t11676: 0x0000828F,\n\t11677: 0x00008285,\n\t11678: 0x0000828E,\n\t11679: 0x00008291,\n\t11680: 0x00008293,\n\t11681: 0x0000828A,\n\t11682: 0x00008283,\n\t11683: 0x00008284,\n\t11684: 0x00008C78,\n\t11685: 0x00008FC9,\n\t11686: 0x00008FBF,\n\t11687: 0x0000909F,\n\t11688: 0x000090A1,\n\t11689: 0x000090A5,\n\t11690: 0x0000909E,\n\t11691: 0x000090A7,\n\t11692: 0x000090A0,\n\t11693: 0x00009630,\n\t11694: 0x00009628,\n\t11695: 0x0000962F,\n\t11696: 0x0000962D,\n\t11697: 0x00004E33,\n\t11698: 0x00004F98,\n\t11699: 0x00004F7C,\n\t11700: 0x00004F85,\n\t11701: 0x00004F7D,\n\t11702: 0x00004F80,\n\t11703: 0x00004F87,\n\t11704: 0x00004F76,\n\t11705: 0x00004F74,\n\t11706: 0x00004F89,\n\t11707: 0x00004F84,\n\t11708: 0x00004F77,\n\t11709: 0x00004F4C,\n\t11710: 0x00004F97,\n\t11711: 0x00004F6A,\n\t11712: 0x00004F9A,\n\t11713: 0x00004F79,\n\t11714: 0x00004F81,\n\t11715: 0x00004F78,\n\t11716: 0x00004F90,\n\t11717: 0x00004F9C,\n\t11718: 0x00004F94,\n\t11719: 0x00004F9E,\n\t11720: 0x00004F92,\n\t11721: 0x00004F82,\n\t11722: 0x00004F95,\n\t11723: 0x00004F6B,\n\t11724: 0x00004F6E,\n\t11725: 0x0000519E,\n\t11726: 0x000051BC,\n\t11727: 0x000051BE,\n\t11728: 0x00005235,\n\t11729: 0x00005232,\n\t11730: 0x00005233,\n\t11731: 0x00005246,\n\t11732: 0x00005231,\n\t11733: 0x000052BC,\n\t11734: 0x0000530A,\n\t11735: 0x0000530B,\n\t11736: 0x0000533C,\n\t11737: 0x00005392,\n\t11738: 0x00005394,\n\t11739: 0x00005487,\n\t11740: 0x0000547F,\n\t11741: 0x00005481,\n\t11742: 0x00005491,\n\t11743: 0x00005482,\n\t11744: 0x00005488,\n\t11745: 0x0000546B,\n\t11746: 0x0000547A,\n\t11747: 0x0000547E,\n\t11748: 0x00005465,\n\t11749: 0x0000546C,\n\t11750: 0x00005474,\n\t11751: 0x00005466,\n\t11752: 0x0000548D,\n\t11753: 0x0000546F,\n\t11754: 0x00005461,\n\t11755: 0x00005460,\n\t11756: 0x00005498,\n\t11757: 0x00005463,\n\t11758: 0x00005467,\n\t11759: 0x00005464,\n\t11760: 0x000056F7,\n\t11761: 0x000056F9,\n\t11762: 0x0000576F,\n\t11763: 0x00005772,\n\t11764: 0x0000576D,\n\t11765: 0x0000576B,\n\t11766: 0x00005771,\n\t11767: 0x00005770,\n\t11768: 0x00005776,\n\t11769: 0x00005780,\n\t11770: 0x00005775,\n\t11771: 0x0000577B,\n\t11772: 0x00005773,\n\t11773: 0x00005774,\n\t11774: 0x00005762,\n\t11775: 0x00005768,\n\t11776: 0x0000577D,\n\t11777: 0x0000590C,\n\t11778: 0x00005945,\n\t11779: 0x000059B5,\n\t11780: 0x000059BA,\n\t11781: 0x000059CF,\n\t11782: 0x000059CE,\n\t11783: 0x000059B2,\n\t11784: 0x000059CC,\n\t11785: 0x000059C1,\n\t11786: 0x000059B6,\n\t11787: 0x000059BC,\n\t11788: 0x000059C3,\n\t11789: 0x000059D6,\n\t11790: 0x000059B1,\n\t11791: 0x000059BD,\n\t11792: 0x000059C0,\n\t11793: 0x000059C8,\n\t11794: 0x000059B4,\n\t11795: 0x000059C7,\n\t11796: 0x00005B62,\n\t11797: 0x00005B65,\n\t11798: 0x00005B93,\n\t11799: 0x00005B95,\n\t11800: 0x00005C44,\n\t11801: 0x00005C47,\n\t11802: 0x00005CAE,\n\t11803: 0x00005CA4,\n\t11804: 0x00005CA0,\n\t11805: 0x00005CB5,\n\t11806: 0x00005CAF,\n\t11807: 0x00005CA8,\n\t11808: 0x00005CAC,\n\t11809: 0x00005C9F,\n\t11810: 0x00005CA3,\n\t11811: 0x00005CAD,\n\t11812: 0x00005CA2,\n\t11813: 0x00005CAA,\n\t11814: 0x00005CA7,\n\t11815: 0x00005C9D,\n\t11816: 0x00005CA5,\n\t11817: 0x00005CB6,\n\t11818: 0x00005CB0,\n\t11819: 0x00005CA6,\n\t11820: 0x00005E17,\n\t11821: 0x00005E14,\n\t11822: 0x00005E19,\n\t11823: 0x00005F28,\n\t11824: 0x00005F22,\n\t11825: 0x00005F23,\n\t11826: 0x00005F24,\n\t11827: 0x00005F54,\n\t11828: 0x00005F82,\n\t11829: 0x00005F7E,\n\t11830: 0x00005F7D,\n\t11831: 0x00005FDE,\n\t11832: 0x00005FE5,\n\t11833: 0x0000602D,\n\t11834: 0x00006026,\n\t11835: 0x00006019,\n\t11836: 0x00006032,\n\t11837: 0x0000600B,\n\t11838: 0x00006034,\n\t11839: 0x0000600A,\n\t11840: 0x00006017,\n\t11841: 0x00006033,\n\t11842: 0x0000601A,\n\t11843: 0x0000601E,\n\t11844: 0x0000602C,\n\t11845: 0x00006022,\n\t11846: 0x0000600D,\n\t11847: 0x00006010,\n\t11848: 0x0000602E,\n\t11849: 0x00006013,\n\t11850: 0x00006011,\n\t11851: 0x0000600C,\n\t11852: 0x00006009,\n\t11853: 0x0000601C,\n\t11854: 0x00006214,\n\t11855: 0x0000623D,\n\t11856: 0x000062AD,\n\t11857: 0x000062B4,\n\t11858: 0x000062D1,\n\t11859: 0x000062BE,\n\t11860: 0x000062AA,\n\t11861: 0x000062B6,\n\t11862: 0x000062CA,\n\t11863: 0x000062AE,\n\t11864: 0x000062B3,\n\t11865: 0x000062AF,\n\t11866: 0x000062BB,\n\t11867: 0x000062A9,\n\t11868: 0x000062B0,\n\t11869: 0x000062B8,\n\t11870: 0x0000653D,\n\t11871: 0x000065A8,\n\t11872: 0x000065BB,\n\t11873: 0x00006609,\n\t11874: 0x000065FC,\n\t11875: 0x00006604,\n\t11876: 0x00006612,\n\t11877: 0x00006608,\n\t11878: 0x000065FB,\n\t11879: 0x00006603,\n\t11880: 0x0000660B,\n\t11881: 0x0000660D,\n\t11882: 0x00006605,\n\t11883: 0x000065FD,\n\t11884: 0x00006611,\n\t11885: 0x00006610,\n\t11886: 0x000066F6,\n\t11887: 0x0000670A,\n\t11888: 0x00006785,\n\t11889: 0x0000676C,\n\t11890: 0x0000678E,\n\t11891: 0x00006792,\n\t11892: 0x00006776,\n\t11893: 0x0000677B,\n\t11894: 0x00006798,\n\t11895: 0x00006786,\n\t11896: 0x00006784,\n\t11897: 0x00006774,\n\t11898: 0x0000678D,\n\t11899: 0x0000678C,\n\t11900: 0x0000677A,\n\t11901: 0x0000679F,\n\t11902: 0x00006791,\n\t11903: 0x00006799,\n\t11904: 0x00006783,\n\t11905: 0x0000677D,\n\t11906: 0x00006781,\n\t11907: 0x00006778,\n\t11908: 0x00006779,\n\t11909: 0x00006794,\n\t11910: 0x00006B25,\n\t11911: 0x00006B80,\n\t11912: 0x00006B7E,\n\t11913: 0x00006BDE,\n\t11914: 0x00006C1D,\n\t11915: 0x00006C93,\n\t11916: 0x00006CEC,\n\t11917: 0x00006CEB,\n\t11918: 0x00006CEE,\n\t11919: 0x00006CD9,\n\t11920: 0x00006CB6,\n\t11921: 0x00006CD4,\n\t11922: 0x00006CAD,\n\t11923: 0x00006CE7,\n\t11924: 0x00006CB7,\n\t11925: 0x00006CD0,\n\t11926: 0x00006CC2,\n\t11927: 0x00006CBA,\n\t11928: 0x00006CC3,\n\t11929: 0x00006CC6,\n\t11930: 0x00006CED,\n\t11931: 0x00006CF2,\n\t11932: 0x00006CD2,\n\t11933: 0x00006CDD,\n\t11934: 0x00006CB4,\n\t11935: 0x00006C8A,\n\t11936: 0x00006C9D,\n\t11937: 0x00006C80,\n\t11938: 0x00006CDE,\n\t11939: 0x00006CC0,\n\t11940: 0x00006D30,\n\t11941: 0x00006CCD,\n\t11942: 0x00006CC7,\n\t11943: 0x00006CB0,\n\t11944: 0x00006CF9,\n\t11945: 0x00006CCF,\n\t11946: 0x00006CE9,\n\t11947: 0x00006CD1,\n\t11948: 0x00007094,\n\t11949: 0x00007098,\n\t11950: 0x00007085,\n\t11951: 0x00007093,\n\t11952: 0x00007086,\n\t11953: 0x00007084,\n\t11954: 0x00007091,\n\t11955: 0x00007096,\n\t11956: 0x00007082,\n\t11957: 0x0000709A,\n\t11958: 0x00007083,\n\t11959: 0x0000726A,\n\t11960: 0x000072D6,\n\t11961: 0x000072CB,\n\t11962: 0x000072D8,\n\t11963: 0x000072C9,\n\t11964: 0x000072DC,\n\t11965: 0x000072D2,\n\t11966: 0x000072D4,\n\t11967: 0x000072DA,\n\t11968: 0x000072CC,\n\t11969: 0x000072D1,\n\t11970: 0x000073A4,\n\t11971: 0x000073A1,\n\t11972: 0x000073AD,\n\t11973: 0x000073A6,\n\t11974: 0x000073A2,\n\t11975: 0x000073A0,\n\t11976: 0x000073AC,\n\t11977: 0x0000739D,\n\t11978: 0x000074DD,\n\t11979: 0x000074E8,\n\t11980: 0x0000753F,\n\t11981: 0x00007540,\n\t11982: 0x0000753E,\n\t11983: 0x0000758C,\n\t11984: 0x00007598,\n\t11985: 0x000076AF,\n\t11986: 0x000076F3,\n\t11987: 0x000076F1,\n\t11988: 0x000076F0,\n\t11989: 0x000076F5,\n\t11990: 0x000077F8,\n\t11991: 0x000077FC,\n\t11992: 0x000077F9,\n\t11993: 0x000077FB,\n\t11994: 0x000077FA,\n\t11995: 0x000077F7,\n\t11996: 0x00007942,\n\t11997: 0x0000793F,\n\t11998: 0x000079C5,\n\t11999: 0x00007A78,\n\t12000: 0x00007A7B,\n\t12001: 0x00007AFB,\n\t12002: 0x00007C75,\n\t12003: 0x00007CFD,\n\t12004: 0x00008035,\n\t12005: 0x0000808F,\n\t12006: 0x000080AE,\n\t12007: 0x000080A3,\n\t12008: 0x000080B8,\n\t12009: 0x000080B5,\n\t12010: 0x000080AD,\n\t12011: 0x00008220,\n\t12012: 0x000082A0,\n\t12013: 0x000082C0,\n\t12014: 0x000082AB,\n\t12015: 0x0000829A,\n\t12016: 0x00008298,\n\t12017: 0x0000829B,\n\t12018: 0x000082B5,\n\t12019: 0x000082A7,\n\t12020: 0x000082AE,\n\t12021: 0x000082BC,\n\t12022: 0x0000829E,\n\t12023: 0x000082BA,\n\t12024: 0x000082B4,\n\t12025: 0x000082A8,\n\t12026: 0x000082A1,\n\t12027: 0x000082A9,\n\t12028: 0x000082C2,\n\t12029: 0x000082A4,\n\t12030: 0x000082C3,\n\t12031: 0x000082B6,\n\t12032: 0x000082A2,\n\t12033: 0x00008670,\n\t12034: 0x0000866F,\n\t12035: 0x0000866D,\n\t12036: 0x0000866E,\n\t12037: 0x00008C56,\n\t12038: 0x00008FD2,\n\t12039: 0x00008FCB,\n\t12040: 0x00008FD3,\n\t12041: 0x00008FCD,\n\t12042: 0x00008FD6,\n\t12043: 0x00008FD5,\n\t12044: 0x00008FD7,\n\t12045: 0x000090B2,\n\t12046: 0x000090B4,\n\t12047: 0x000090AF,\n\t12048: 0x000090B3,\n\t12049: 0x000090B0,\n\t12050: 0x00009639,\n\t12051: 0x0000963D,\n\t12052: 0x0000963C,\n\t12053: 0x0000963A,\n\t12054: 0x00009643,\n\t12055: 0x00004FCD,\n\t12056: 0x00004FC5,\n\t12057: 0x00004FD3,\n\t12058: 0x00004FB2,\n\t12059: 0x00004FC9,\n\t12060: 0x00004FCB,\n\t12061: 0x00004FC1,\n\t12062: 0x00004FD4,\n\t12063: 0x00004FDC,\n\t12064: 0x00004FD9,\n\t12065: 0x00004FBB,\n\t12066: 0x00004FB3,\n\t12067: 0x00004FDB,\n\t12068: 0x00004FC7,\n\t12069: 0x00004FD6,\n\t12070: 0x00004FBA,\n\t12071: 0x00004FC0,\n\t12072: 0x00004FB9,\n\t12073: 0x00004FEC,\n\t12074: 0x00005244,\n\t12075: 0x00005249,\n\t12076: 0x000052C0,\n\t12077: 0x000052C2,\n\t12078: 0x0000533D,\n\t12079: 0x0000537C,\n\t12080: 0x00005397,\n\t12081: 0x00005396,\n\t12082: 0x00005399,\n\t12083: 0x00005398,\n\t12084: 0x000054BA,\n\t12085: 0x000054A1,\n\t12086: 0x000054AD,\n\t12087: 0x000054A5,\n\t12088: 0x000054CF,\n\t12089: 0x000054C3,\n\t12090: 0x0000830D,\n\t12091: 0x000054B7,\n\t12092: 0x000054AE,\n\t12093: 0x000054D6,\n\t12094: 0x000054B6,\n\t12095: 0x000054C5,\n\t12096: 0x000054C6,\n\t12097: 0x000054A0,\n\t12098: 0x00005470,\n\t12099: 0x000054BC,\n\t12100: 0x000054A2,\n\t12101: 0x000054BE,\n\t12102: 0x00005472,\n\t12103: 0x000054DE,\n\t12104: 0x000054B0,\n\t12105: 0x000057B5,\n\t12106: 0x0000579E,\n\t12107: 0x0000579F,\n\t12108: 0x000057A4,\n\t12109: 0x0000578C,\n\t12110: 0x00005797,\n\t12111: 0x0000579D,\n\t12112: 0x0000579B,\n\t12113: 0x00005794,\n\t12114: 0x00005798,\n\t12115: 0x0000578F,\n\t12116: 0x00005799,\n\t12117: 0x000057A5,\n\t12118: 0x0000579A,\n\t12119: 0x00005795,\n\t12120: 0x000058F4,\n\t12121: 0x0000590D,\n\t12122: 0x00005953,\n\t12123: 0x000059E1,\n\t12124: 0x000059DE,\n\t12125: 0x000059EE,\n\t12126: 0x00005A00,\n\t12127: 0x000059F1,\n\t12128: 0x000059DD,\n\t12129: 0x000059FA,\n\t12130: 0x000059FD,\n\t12131: 0x000059FC,\n\t12132: 0x000059F6,\n\t12133: 0x000059E4,\n\t12134: 0x000059F2,\n\t12135: 0x000059F7,\n\t12136: 0x000059DB,\n\t12137: 0x000059E9,\n\t12138: 0x000059F3,\n\t12139: 0x000059F5,\n\t12140: 0x000059E0,\n\t12141: 0x000059FE,\n\t12142: 0x000059F4,\n\t12143: 0x000059ED,\n\t12144: 0x00005BA8,\n\t12145: 0x00005C4C,\n\t12146: 0x00005CD0,\n\t12147: 0x00005CD8,\n\t12148: 0x00005CCC,\n\t12149: 0x00005CD7,\n\t12150: 0x00005CCB,\n\t12151: 0x00005CDB,\n\t12152: 0x00005CDE,\n\t12153: 0x00005CDA,\n\t12154: 0x00005CC9,\n\t12155: 0x00005CC7,\n\t12156: 0x00005CCA,\n\t12157: 0x00005CD6,\n\t12158: 0x00005CD3,\n\t12159: 0x00005CD4,\n\t12160: 0x00005CCF,\n\t12161: 0x00005CC8,\n\t12162: 0x00005CC6,\n\t12163: 0x00005CCE,\n\t12164: 0x00005CDF,\n\t12165: 0x00005CF8,\n\t12166: 0x00005DF9,\n\t12167: 0x00005E21,\n\t12168: 0x00005E22,\n\t12169: 0x00005E23,\n\t12170: 0x00005E20,\n\t12171: 0x00005E24,\n\t12172: 0x00005EB0,\n\t12173: 0x00005EA4,\n\t12174: 0x00005EA2,\n\t12175: 0x00005E9B,\n\t12176: 0x00005EA3,\n\t12177: 0x00005EA5,\n\t12178: 0x00005F07,\n\t12179: 0x00005F2E,\n\t12180: 0x00005F56,\n\t12181: 0x00005F86,\n\t12182: 0x00006037,\n\t12183: 0x00006039,\n\t12184: 0x00006054,\n\t12185: 0x00006072,\n\t12186: 0x0000605E,\n\t12187: 0x00006045,\n\t12188: 0x00006053,\n\t12189: 0x00006047,\n\t12190: 0x00006049,\n\t12191: 0x0000605B,\n\t12192: 0x0000604C,\n\t12193: 0x00006040,\n\t12194: 0x00006042,\n\t12195: 0x0000605F,\n\t12196: 0x00006024,\n\t12197: 0x00006044,\n\t12198: 0x00006058,\n\t12199: 0x00006066,\n\t12200: 0x0000606E,\n\t12201: 0x00006242,\n\t12202: 0x00006243,\n\t12203: 0x000062CF,\n\t12204: 0x0000630D,\n\t12205: 0x0000630B,\n\t12206: 0x000062F5,\n\t12207: 0x0000630E,\n\t12208: 0x00006303,\n\t12209: 0x000062EB,\n\t12210: 0x000062F9,\n\t12211: 0x0000630F,\n\t12212: 0x0000630C,\n\t12213: 0x000062F8,\n\t12214: 0x000062F6,\n\t12215: 0x00006300,\n\t12216: 0x00006313,\n\t12217: 0x00006314,\n\t12218: 0x000062FA,\n\t12219: 0x00006315,\n\t12220: 0x000062FB,\n\t12221: 0x000062F0,\n\t12222: 0x00006541,\n\t12223: 0x00006543,\n\t12224: 0x000065AA,\n\t12225: 0x000065BF,\n\t12226: 0x00006636,\n\t12227: 0x00006621,\n\t12228: 0x00006632,\n\t12229: 0x00006635,\n\t12230: 0x0000661C,\n\t12231: 0x00006626,\n\t12232: 0x00006622,\n\t12233: 0x00006633,\n\t12234: 0x0000662B,\n\t12235: 0x0000663A,\n\t12236: 0x0000661D,\n\t12237: 0x00006634,\n\t12238: 0x00006639,\n\t12239: 0x0000662E,\n\t12240: 0x0000670F,\n\t12241: 0x00006710,\n\t12242: 0x000067C1,\n\t12243: 0x000067F2,\n\t12244: 0x000067C8,\n\t12245: 0x000067BA,\n\t12246: 0x000067DC,\n\t12247: 0x000067BB,\n\t12248: 0x000067F8,\n\t12249: 0x000067D8,\n\t12250: 0x000067C0,\n\t12251: 0x000067B7,\n\t12252: 0x000067C5,\n\t12253: 0x000067EB,\n\t12254: 0x000067E4,\n\t12255: 0x000067DF,\n\t12256: 0x000067B5,\n\t12257: 0x000067CD,\n\t12258: 0x000067B3,\n\t12259: 0x000067F7,\n\t12260: 0x000067F6,\n\t12261: 0x000067EE,\n\t12262: 0x000067E3,\n\t12263: 0x000067C2,\n\t12264: 0x000067B9,\n\t12265: 0x000067CE,\n\t12266: 0x000067E7,\n\t12267: 0x000067F0,\n\t12268: 0x000067B2,\n\t12269: 0x000067FC,\n\t12270: 0x000067C6,\n\t12271: 0x000067ED,\n\t12272: 0x000067CC,\n\t12273: 0x000067AE,\n\t12274: 0x000067E6,\n\t12275: 0x000067DB,\n\t12276: 0x000067FA,\n\t12277: 0x000067C9,\n\t12278: 0x000067CA,\n\t12279: 0x000067C3,\n\t12280: 0x000067EA,\n\t12281: 0x000067CB,\n\t12282: 0x00006B28,\n\t12283: 0x00006B82,\n\t12284: 0x00006B84,\n\t12285: 0x00006BB6,\n\t12286: 0x00006BD6,\n\t12287: 0x00006BD8,\n\t12288: 0x00006BE0,\n\t12289: 0x00006C20,\n\t12290: 0x00006C21,\n\t12291: 0x00006D28,\n\t12292: 0x00006D34,\n\t12293: 0x00006D2D,\n\t12294: 0x00006D1F,\n\t12295: 0x00006D3C,\n\t12296: 0x00006D3F,\n\t12297: 0x00006D12,\n\t12298: 0x00006D0A,\n\t12299: 0x00006CDA,\n\t12300: 0x00006D33,\n\t12301: 0x00006D04,\n\t12302: 0x00006D19,\n\t12303: 0x00006D3A,\n\t12304: 0x00006D1A,\n\t12305: 0x00006D11,\n\t12306: 0x00006D00,\n\t12307: 0x00006D1D,\n\t12308: 0x00006D42,\n\t12309: 0x00006D01,\n\t12310: 0x00006D18,\n\t12311: 0x00006D37,\n\t12312: 0x00006D03,\n\t12313: 0x00006D0F,\n\t12314: 0x00006D40,\n\t12315: 0x00006D07,\n\t12316: 0x00006D20,\n\t12317: 0x00006D2C,\n\t12318: 0x00006D08,\n\t12319: 0x00006D22,\n\t12320: 0x00006D09,\n\t12321: 0x00006D10,\n\t12322: 0x000070B7,\n\t12323: 0x0000709F,\n\t12324: 0x000070BE,\n\t12325: 0x000070B1,\n\t12326: 0x000070B0,\n\t12327: 0x000070A1,\n\t12328: 0x000070B4,\n\t12329: 0x000070B5,\n\t12330: 0x000070A9,\n\t12331: 0x00007241,\n\t12332: 0x00007249,\n\t12333: 0x0000724A,\n\t12334: 0x0000726C,\n\t12335: 0x00007270,\n\t12336: 0x00007273,\n\t12337: 0x0000726E,\n\t12338: 0x000072CA,\n\t12339: 0x000072E4,\n\t12340: 0x000072E8,\n\t12341: 0x000072EB,\n\t12342: 0x000072DF,\n\t12343: 0x000072EA,\n\t12344: 0x000072E6,\n\t12345: 0x000072E3,\n\t12346: 0x00007385,\n\t12347: 0x000073CC,\n\t12348: 0x000073C2,\n\t12349: 0x000073C8,\n\t12350: 0x000073C5,\n\t12351: 0x000073B9,\n\t12352: 0x000073B6,\n\t12353: 0x000073B5,\n\t12354: 0x000073B4,\n\t12355: 0x000073EB,\n\t12356: 0x000073BF,\n\t12357: 0x000073C7,\n\t12358: 0x000073BE,\n\t12359: 0x000073C3,\n\t12360: 0x000073C6,\n\t12361: 0x000073B8,\n\t12362: 0x000073CB,\n\t12363: 0x000074EC,\n\t12364: 0x000074EE,\n\t12365: 0x0000752E,\n\t12366: 0x00007547,\n\t12367: 0x00007548,\n\t12368: 0x000075A7,\n\t12369: 0x000075AA,\n\t12370: 0x00007679,\n\t12371: 0x000076C4,\n\t12372: 0x00007708,\n\t12373: 0x00007703,\n\t12374: 0x00007704,\n\t12375: 0x00007705,\n\t12376: 0x0000770A,\n\t12377: 0x000076F7,\n\t12378: 0x000076FB,\n\t12379: 0x000076FA,\n\t12380: 0x000077E7,\n\t12381: 0x000077E8,\n\t12382: 0x00007806,\n\t12383: 0x00007811,\n\t12384: 0x00007812,\n\t12385: 0x00007805,\n\t12386: 0x00007810,\n\t12387: 0x0000780F,\n\t12388: 0x0000780E,\n\t12389: 0x00007809,\n\t12390: 0x00007803,\n\t12391: 0x00007813,\n\t12392: 0x0000794A,\n\t12393: 0x0000794C,\n\t12394: 0x0000794B,\n\t12395: 0x00007945,\n\t12396: 0x00007944,\n\t12397: 0x000079D5,\n\t12398: 0x000079CD,\n\t12399: 0x000079CF,\n\t12400: 0x000079D6,\n\t12401: 0x000079CE,\n\t12402: 0x00007A80,\n\t12403: 0x00007A7E,\n\t12404: 0x00007AD1,\n\t12405: 0x00007B00,\n\t12406: 0x00007B01,\n\t12407: 0x00007C7A,\n\t12408: 0x00007C78,\n\t12409: 0x00007C79,\n\t12410: 0x00007C7F,\n\t12411: 0x00007C80,\n\t12412: 0x00007C81,\n\t12413: 0x00007D03,\n\t12414: 0x00007D08,\n\t12415: 0x00007D01,\n\t12416: 0x00007F58,\n\t12417: 0x00007F91,\n\t12418: 0x00007F8D,\n\t12419: 0x00007FBE,\n\t12420: 0x00008007,\n\t12421: 0x0000800E,\n\t12422: 0x0000800F,\n\t12423: 0x00008014,\n\t12424: 0x00008037,\n\t12425: 0x000080D8,\n\t12426: 0x000080C7,\n\t12427: 0x000080E0,\n\t12428: 0x000080D1,\n\t12429: 0x000080C8,\n\t12430: 0x000080C2,\n\t12431: 0x000080D0,\n\t12432: 0x000080C5,\n\t12433: 0x000080E3,\n\t12434: 0x000080D9,\n\t12435: 0x000080DC,\n\t12436: 0x000080CA,\n\t12437: 0x000080D5,\n\t12438: 0x000080C9,\n\t12439: 0x000080CF,\n\t12440: 0x000080D7,\n\t12441: 0x000080E6,\n\t12442: 0x000080CD,\n\t12443: 0x000081FF,\n\t12444: 0x00008221,\n\t12445: 0x00008294,\n\t12446: 0x000082D9,\n\t12447: 0x000082FE,\n\t12448: 0x000082F9,\n\t12449: 0x00008307,\n\t12450: 0x000082E8,\n\t12451: 0x00008300,\n\t12452: 0x000082D5,\n\t12453: 0x0000833A,\n\t12454: 0x000082EB,\n\t12455: 0x000082D6,\n\t12456: 0x000082F4,\n\t12457: 0x000082EC,\n\t12458: 0x000082E1,\n\t12459: 0x000082F2,\n\t12460: 0x000082F5,\n\t12461: 0x0000830C,\n\t12462: 0x000082FB,\n\t12463: 0x000082F6,\n\t12464: 0x000082F0,\n\t12465: 0x000082EA,\n\t12466: 0x000082E4,\n\t12467: 0x000082E0,\n\t12468: 0x000082FA,\n\t12469: 0x000082F3,\n\t12470: 0x000082ED,\n\t12471: 0x00008677,\n\t12472: 0x00008674,\n\t12473: 0x0000867C,\n\t12474: 0x00008673,\n\t12475: 0x00008841,\n\t12476: 0x0000884E,\n\t12477: 0x00008867,\n\t12478: 0x0000886A,\n\t12479: 0x00008869,\n\t12480: 0x000089D3,\n\t12481: 0x00008A04,\n\t12482: 0x00008A07,\n\t12483: 0x00008D72,\n\t12484: 0x00008FE3,\n\t12485: 0x00008FE1,\n\t12486: 0x00008FEE,\n\t12487: 0x00008FE0,\n\t12488: 0x000090F1,\n\t12489: 0x000090BD,\n\t12490: 0x000090BF,\n\t12491: 0x000090D5,\n\t12492: 0x000090C5,\n\t12493: 0x000090BE,\n\t12494: 0x000090C7,\n\t12495: 0x000090CB,\n\t12496: 0x000090C8,\n\t12497: 0x000091D4,\n\t12498: 0x000091D3,\n\t12499: 0x00009654,\n\t12500: 0x0000964F,\n\t12501: 0x00009651,\n\t12502: 0x00009653,\n\t12503: 0x0000964A,\n\t12504: 0x0000964E,\n\t12505: 0x0000501E,\n\t12506: 0x00005005,\n\t12507: 0x00005007,\n\t12508: 0x00005013,\n\t12509: 0x00005022,\n\t12510: 0x00005030,\n\t12511: 0x0000501B,\n\t12512: 0x00004FF5,\n\t12513: 0x00004FF4,\n\t12514: 0x00005033,\n\t12515: 0x00005037,\n\t12516: 0x0000502C,\n\t12517: 0x00004FF6,\n\t12518: 0x00004FF7,\n\t12519: 0x00005017,\n\t12520: 0x0000501C,\n\t12521: 0x00005020,\n\t12522: 0x00005027,\n\t12523: 0x00005035,\n\t12524: 0x0000502F,\n\t12525: 0x00005031,\n\t12526: 0x0000500E,\n\t12527: 0x0000515A,\n\t12528: 0x00005194,\n\t12529: 0x00005193,\n\t12530: 0x000051CA,\n\t12531: 0x000051C4,\n\t12532: 0x000051C5,\n\t12533: 0x000051C8,\n\t12534: 0x000051CE,\n\t12535: 0x00005261,\n\t12536: 0x0000525A,\n\t12537: 0x00005252,\n\t12538: 0x0000525E,\n\t12539: 0x0000525F,\n\t12540: 0x00005255,\n\t12541: 0x00005262,\n\t12542: 0x000052CD,\n\t12543: 0x0000530E,\n\t12544: 0x0000539E,\n\t12545: 0x00005526,\n\t12546: 0x000054E2,\n\t12547: 0x00005517,\n\t12548: 0x00005512,\n\t12549: 0x000054E7,\n\t12550: 0x000054F3,\n\t12551: 0x000054E4,\n\t12552: 0x0000551A,\n\t12553: 0x000054FF,\n\t12554: 0x00005504,\n\t12555: 0x00005508,\n\t12556: 0x000054EB,\n\t12557: 0x00005511,\n\t12558: 0x00005505,\n\t12559: 0x000054F1,\n\t12560: 0x0000550A,\n\t12561: 0x000054FB,\n\t12562: 0x000054F7,\n\t12563: 0x000054F8,\n\t12564: 0x000054E0,\n\t12565: 0x0000550E,\n\t12566: 0x00005503,\n\t12567: 0x0000550B,\n\t12568: 0x00005701,\n\t12569: 0x00005702,\n\t12570: 0x000057CC,\n\t12571: 0x00005832,\n\t12572: 0x000057D5,\n\t12573: 0x000057D2,\n\t12574: 0x000057BA,\n\t12575: 0x000057C6,\n\t12576: 0x000057BD,\n\t12577: 0x000057BC,\n\t12578: 0x000057B8,\n\t12579: 0x000057B6,\n\t12580: 0x000057BF,\n\t12581: 0x000057C7,\n\t12582: 0x000057D0,\n\t12583: 0x000057B9,\n\t12584: 0x000057C1,\n\t12585: 0x0000590E,\n\t12586: 0x0000594A,\n\t12587: 0x00005A19,\n\t12588: 0x00005A16,\n\t12589: 0x00005A2D,\n\t12590: 0x00005A2E,\n\t12591: 0x00005A15,\n\t12592: 0x00005A0F,\n\t12593: 0x00005A17,\n\t12594: 0x00005A0A,\n\t12595: 0x00005A1E,\n\t12596: 0x00005A33,\n\t12597: 0x00005B6C,\n\t12598: 0x00005BA7,\n\t12599: 0x00005BAD,\n\t12600: 0x00005BAC,\n\t12601: 0x00005C03,\n\t12602: 0x00005C56,\n\t12603: 0x00005C54,\n\t12604: 0x00005CEC,\n\t12605: 0x00005CFF,\n\t12606: 0x00005CEE,\n\t12607: 0x00005CF1,\n\t12608: 0x00005CF7,\n\t12609: 0x00005D00,\n\t12610: 0x00005CF9,\n\t12611: 0x00005E29,\n\t12612: 0x00005E28,\n\t12613: 0x00005EA8,\n\t12614: 0x00005EAE,\n\t12615: 0x00005EAA,\n\t12616: 0x00005EAC,\n\t12617: 0x00005F33,\n\t12618: 0x00005F30,\n\t12619: 0x00005F67,\n\t12620: 0x0000605D,\n\t12621: 0x0000605A,\n\t12622: 0x00006067,\n\t12623: 0x00006041,\n\t12624: 0x000060A2,\n\t12625: 0x00006088,\n\t12626: 0x00006080,\n\t12627: 0x00006092,\n\t12628: 0x00006081,\n\t12629: 0x0000609D,\n\t12630: 0x00006083,\n\t12631: 0x00006095,\n\t12632: 0x0000609B,\n\t12633: 0x00006097,\n\t12634: 0x00006087,\n\t12635: 0x0000609C,\n\t12636: 0x0000608E,\n\t12637: 0x00006219,\n\t12638: 0x00006246,\n\t12639: 0x000062F2,\n\t12640: 0x00006310,\n\t12641: 0x00006356,\n\t12642: 0x0000632C,\n\t12643: 0x00006344,\n\t12644: 0x00006345,\n\t12645: 0x00006336,\n\t12646: 0x00006343,\n\t12647: 0x000063E4,\n\t12648: 0x00006339,\n\t12649: 0x0000634B,\n\t12650: 0x0000634A,\n\t12651: 0x0000633C,\n\t12652: 0x00006329,\n\t12653: 0x00006341,\n\t12654: 0x00006334,\n\t12655: 0x00006358,\n\t12656: 0x00006354,\n\t12657: 0x00006359,\n\t12658: 0x0000632D,\n\t12659: 0x00006347,\n\t12660: 0x00006333,\n\t12661: 0x0000635A,\n\t12662: 0x00006351,\n\t12663: 0x00006338,\n\t12664: 0x00006357,\n\t12665: 0x00006340,\n\t12666: 0x00006348,\n\t12667: 0x0000654A,\n\t12668: 0x00006546,\n\t12669: 0x000065C6,\n\t12670: 0x000065C3,\n\t12671: 0x000065C4,\n\t12672: 0x000065C2,\n\t12673: 0x0000664A,\n\t12674: 0x0000665F,\n\t12675: 0x00006647,\n\t12676: 0x00006651,\n\t12677: 0x00006712,\n\t12678: 0x00006713,\n\t12679: 0x0000681F,\n\t12680: 0x0000681A,\n\t12681: 0x00006849,\n\t12682: 0x00006832,\n\t12683: 0x00006833,\n\t12684: 0x0000683B,\n\t12685: 0x0000684B,\n\t12686: 0x0000684F,\n\t12687: 0x00006816,\n\t12688: 0x00006831,\n\t12689: 0x0000681C,\n\t12690: 0x00006835,\n\t12691: 0x0000682B,\n\t12692: 0x0000682D,\n\t12693: 0x0000682F,\n\t12694: 0x0000684E,\n\t12695: 0x00006844,\n\t12696: 0x00006834,\n\t12697: 0x0000681D,\n\t12698: 0x00006812,\n\t12699: 0x00006814,\n\t12700: 0x00006826,\n\t12701: 0x00006828,\n\t12702: 0x0000682E,\n\t12703: 0x0000684D,\n\t12704: 0x0000683A,\n\t12705: 0x00006825,\n\t12706: 0x00006820,\n\t12707: 0x00006B2C,\n\t12708: 0x00006B2F,\n\t12709: 0x00006B2D,\n\t12710: 0x00006B31,\n\t12711: 0x00006B34,\n\t12712: 0x00006B6D,\n\t12713: 0x00008082,\n\t12714: 0x00006B88,\n\t12715: 0x00006BE6,\n\t12716: 0x00006BE4,\n\t12717: 0x00006BE8,\n\t12718: 0x00006BE3,\n\t12719: 0x00006BE2,\n\t12720: 0x00006BE7,\n\t12721: 0x00006C25,\n\t12722: 0x00006D7A,\n\t12723: 0x00006D63,\n\t12724: 0x00006D64,\n\t12725: 0x00006D76,\n\t12726: 0x00006D0D,\n\t12727: 0x00006D61,\n\t12728: 0x00006D92,\n\t12729: 0x00006D58,\n\t12730: 0x00006D62,\n\t12731: 0x00006D6D,\n\t12732: 0x00006D6F,\n\t12733: 0x00006D91,\n\t12734: 0x00006D8D,\n\t12735: 0x00006DEF,\n\t12736: 0x00006D7F,\n\t12737: 0x00006D86,\n\t12738: 0x00006D5E,\n\t12739: 0x00006D67,\n\t12740: 0x00006D60,\n\t12741: 0x00006D97,\n\t12742: 0x00006D70,\n\t12743: 0x00006D7C,\n\t12744: 0x00006D5F,\n\t12745: 0x00006D82,\n\t12746: 0x00006D98,\n\t12747: 0x00006D2F,\n\t12748: 0x00006D68,\n\t12749: 0x00006D8B,\n\t12750: 0x00006D7E,\n\t12751: 0x00006D80,\n\t12752: 0x00006D84,\n\t12753: 0x00006D16,\n\t12754: 0x00006D83,\n\t12755: 0x00006D7B,\n\t12756: 0x00006D7D,\n\t12757: 0x00006D75,\n\t12758: 0x00006D90,\n\t12759: 0x000070DC,\n\t12760: 0x000070D3,\n\t12761: 0x000070D1,\n\t12762: 0x000070DD,\n\t12763: 0x000070CB,\n\t12764: 0x00007F39,\n\t12765: 0x000070E2,\n\t12766: 0x000070D7,\n\t12767: 0x000070D2,\n\t12768: 0x000070DE,\n\t12769: 0x000070E0,\n\t12770: 0x000070D4,\n\t12771: 0x000070CD,\n\t12772: 0x000070C5,\n\t12773: 0x000070C6,\n\t12774: 0x000070C7,\n\t12775: 0x000070DA,\n\t12776: 0x000070CE,\n\t12777: 0x000070E1,\n\t12778: 0x00007242,\n\t12779: 0x00007278,\n\t12780: 0x00007277,\n\t12781: 0x00007276,\n\t12782: 0x00007300,\n\t12783: 0x000072FA,\n\t12784: 0x000072F4,\n\t12785: 0x000072FE,\n\t12786: 0x000072F6,\n\t12787: 0x000072F3,\n\t12788: 0x000072FB,\n\t12789: 0x00007301,\n\t12790: 0x000073D3,\n\t12791: 0x000073D9,\n\t12792: 0x000073E5,\n\t12793: 0x000073D6,\n\t12794: 0x000073BC,\n\t12795: 0x000073E7,\n\t12796: 0x000073E3,\n\t12797: 0x000073E9,\n\t12798: 0x000073DC,\n\t12799: 0x000073D2,\n\t12800: 0x000073DB,\n\t12801: 0x000073D4,\n\t12802: 0x000073DD,\n\t12803: 0x000073DA,\n\t12804: 0x000073D7,\n\t12805: 0x000073D8,\n\t12806: 0x000073E8,\n\t12807: 0x000074DE,\n\t12808: 0x000074DF,\n\t12809: 0x000074F4,\n\t12810: 0x000074F5,\n\t12811: 0x00007521,\n\t12812: 0x0000755B,\n\t12813: 0x0000755F,\n\t12814: 0x000075B0,\n\t12815: 0x000075C1,\n\t12816: 0x000075BB,\n\t12817: 0x000075C4,\n\t12818: 0x000075C0,\n\t12819: 0x000075BF,\n\t12820: 0x000075B6,\n\t12821: 0x000075BA,\n\t12822: 0x0000768A,\n\t12823: 0x000076C9,\n\t12824: 0x0000771D,\n\t12825: 0x0000771B,\n\t12826: 0x00007710,\n\t12827: 0x00007713,\n\t12828: 0x00007712,\n\t12829: 0x00007723,\n\t12830: 0x00007711,\n\t12831: 0x00007715,\n\t12832: 0x00007719,\n\t12833: 0x0000771A,\n\t12834: 0x00007722,\n\t12835: 0x00007727,\n\t12836: 0x00007823,\n\t12837: 0x0000782C,\n\t12838: 0x00007822,\n\t12839: 0x00007835,\n\t12840: 0x0000782F,\n\t12841: 0x00007828,\n\t12842: 0x0000782E,\n\t12843: 0x0000782B,\n\t12844: 0x00007821,\n\t12845: 0x00007829,\n\t12846: 0x00007833,\n\t12847: 0x0000782A,\n\t12848: 0x00007831,\n\t12849: 0x00007954,\n\t12850: 0x0000795B,\n\t12851: 0x0000794F,\n\t12852: 0x0000795C,\n\t12853: 0x00007953,\n\t12854: 0x00007952,\n\t12855: 0x00007951,\n\t12856: 0x000079EB,\n\t12857: 0x000079EC,\n\t12858: 0x000079E0,\n\t12859: 0x000079EE,\n\t12860: 0x000079ED,\n\t12861: 0x000079EA,\n\t12862: 0x000079DC,\n\t12863: 0x000079DE,\n\t12864: 0x000079DD,\n\t12865: 0x00007A86,\n\t12866: 0x00007A89,\n\t12867: 0x00007A85,\n\t12868: 0x00007A8B,\n\t12869: 0x00007A8C,\n\t12870: 0x00007A8A,\n\t12871: 0x00007A87,\n\t12872: 0x00007AD8,\n\t12873: 0x00007B10,\n\t12874: 0x00007B04,\n\t12875: 0x00007B13,\n\t12876: 0x00007B05,\n\t12877: 0x00007B0F,\n\t12878: 0x00007B08,\n\t12879: 0x00007B0A,\n\t12880: 0x00007B0E,\n\t12881: 0x00007B09,\n\t12882: 0x00007B12,\n\t12883: 0x00007C84,\n\t12884: 0x00007C91,\n\t12885: 0x00007C8A,\n\t12886: 0x00007C8C,\n\t12887: 0x00007C88,\n\t12888: 0x00007C8D,\n\t12889: 0x00007C85,\n\t12890: 0x00007D1E,\n\t12891: 0x00007D1D,\n\t12892: 0x00007D11,\n\t12893: 0x00007D0E,\n\t12894: 0x00007D18,\n\t12895: 0x00007D16,\n\t12896: 0x00007D13,\n\t12897: 0x00007D1F,\n\t12898: 0x00007D12,\n\t12899: 0x00007D0F,\n\t12900: 0x00007D0C,\n\t12901: 0x00007F5C,\n\t12902: 0x00007F61,\n\t12903: 0x00007F5E,\n\t12904: 0x00007F60,\n\t12905: 0x00007F5D,\n\t12906: 0x00007F5B,\n\t12907: 0x00007F96,\n\t12908: 0x00007F92,\n\t12909: 0x00007FC3,\n\t12910: 0x00007FC2,\n\t12911: 0x00007FC0,\n\t12912: 0x00008016,\n\t12913: 0x0000803E,\n\t12914: 0x00008039,\n\t12915: 0x000080FA,\n\t12916: 0x000080F2,\n\t12917: 0x000080F9,\n\t12918: 0x000080F5,\n\t12919: 0x00008101,\n\t12920: 0x000080FB,\n\t12921: 0x00008100,\n\t12922: 0x00008201,\n\t12923: 0x0000822F,\n\t12924: 0x00008225,\n\t12925: 0x00008333,\n\t12926: 0x0000832D,\n\t12927: 0x00008344,\n\t12928: 0x00008319,\n\t12929: 0x00008351,\n\t12930: 0x00008325,\n\t12931: 0x00008356,\n\t12932: 0x0000833F,\n\t12933: 0x00008341,\n\t12934: 0x00008326,\n\t12935: 0x0000831C,\n\t12936: 0x00008322,\n\t12937: 0x00008342,\n\t12938: 0x0000834E,\n\t12939: 0x0000831B,\n\t12940: 0x0000832A,\n\t12941: 0x00008308,\n\t12942: 0x0000833C,\n\t12943: 0x0000834D,\n\t12944: 0x00008316,\n\t12945: 0x00008324,\n\t12946: 0x00008320,\n\t12947: 0x00008337,\n\t12948: 0x0000832F,\n\t12949: 0x00008329,\n\t12950: 0x00008347,\n\t12951: 0x00008345,\n\t12952: 0x0000834C,\n\t12953: 0x00008353,\n\t12954: 0x0000831E,\n\t12955: 0x0000832C,\n\t12956: 0x0000834B,\n\t12957: 0x00008327,\n\t12958: 0x00008348,\n\t12959: 0x00008653,\n\t12960: 0x00008652,\n\t12961: 0x000086A2,\n\t12962: 0x000086A8,\n\t12963: 0x00008696,\n\t12964: 0x0000868D,\n\t12965: 0x00008691,\n\t12966: 0x0000869E,\n\t12967: 0x00008687,\n\t12968: 0x00008697,\n\t12969: 0x00008686,\n\t12970: 0x0000868B,\n\t12971: 0x0000869A,\n\t12972: 0x00008685,\n\t12973: 0x000086A5,\n\t12974: 0x00008699,\n\t12975: 0x000086A1,\n\t12976: 0x000086A7,\n\t12977: 0x00008695,\n\t12978: 0x00008698,\n\t12979: 0x0000868E,\n\t12980: 0x0000869D,\n\t12981: 0x00008690,\n\t12982: 0x00008694,\n\t12983: 0x00008843,\n\t12984: 0x00008844,\n\t12985: 0x0000886D,\n\t12986: 0x00008875,\n\t12987: 0x00008876,\n\t12988: 0x00008872,\n\t12989: 0x00008880,\n\t12990: 0x00008871,\n\t12991: 0x0000887F,\n\t12992: 0x0000886F,\n\t12993: 0x00008883,\n\t12994: 0x0000887E,\n\t12995: 0x00008874,\n\t12996: 0x0000887C,\n\t12997: 0x00008A12,\n\t12998: 0x00008C47,\n\t12999: 0x00008C57,\n\t13000: 0x00008C7B,\n\t13001: 0x00008CA4,\n\t13002: 0x00008CA3,\n\t13003: 0x00008D76,\n\t13004: 0x00008D78,\n\t13005: 0x00008DB5,\n\t13006: 0x00008DB7,\n\t13007: 0x00008DB6,\n\t13008: 0x00008ED1,\n\t13009: 0x00008ED3,\n\t13010: 0x00008FFE,\n\t13011: 0x00008FF5,\n\t13012: 0x00009002,\n\t13013: 0x00008FFF,\n\t13014: 0x00008FFB,\n\t13015: 0x00009004,\n\t13016: 0x00008FFC,\n\t13017: 0x00008FF6,\n\t13018: 0x000090D6,\n\t13019: 0x000090E0,\n\t13020: 0x000090D9,\n\t13021: 0x000090DA,\n\t13022: 0x000090E3,\n\t13023: 0x000090DF,\n\t13024: 0x000090E5,\n\t13025: 0x000090D8,\n\t13026: 0x000090DB,\n\t13027: 0x000090D7,\n\t13028: 0x000090DC,\n\t13029: 0x000090E4,\n\t13030: 0x00009150,\n\t13031: 0x0000914E,\n\t13032: 0x0000914F,\n\t13033: 0x000091D5,\n\t13034: 0x000091E2,\n\t13035: 0x000091DA,\n\t13036: 0x0000965C,\n\t13037: 0x0000965F,\n\t13038: 0x000096BC,\n\t13039: 0x000098E3,\n\t13040: 0x00009ADF,\n\t13041: 0x00009B2F,\n\t13042: 0x00004E7F,\n\t13043: 0x00005070,\n\t13044: 0x0000506A,\n\t13045: 0x00005061,\n\t13046: 0x0000505E,\n\t13047: 0x00005060,\n\t13048: 0x00005053,\n\t13049: 0x0000504B,\n\t13050: 0x0000505D,\n\t13051: 0x00005072,\n\t13052: 0x00005048,\n\t13053: 0x0000504D,\n\t13054: 0x00005041,\n\t13055: 0x0000505B,\n\t13056: 0x0000504A,\n\t13057: 0x00005062,\n\t13058: 0x00005015,\n\t13059: 0x00005045,\n\t13060: 0x0000505F,\n\t13061: 0x00005069,\n\t13062: 0x0000506B,\n\t13063: 0x00005063,\n\t13064: 0x00005064,\n\t13065: 0x00005046,\n\t13066: 0x00005040,\n\t13067: 0x0000506E,\n\t13068: 0x00005073,\n\t13069: 0x00005057,\n\t13070: 0x00005051,\n\t13071: 0x000051D0,\n\t13072: 0x0000526B,\n\t13073: 0x0000526D,\n\t13074: 0x0000526C,\n\t13075: 0x0000526E,\n\t13076: 0x000052D6,\n\t13077: 0x000052D3,\n\t13078: 0x0000532D,\n\t13079: 0x0000539C,\n\t13080: 0x00005575,\n\t13081: 0x00005576,\n\t13082: 0x0000553C,\n\t13083: 0x0000554D,\n\t13084: 0x00005550,\n\t13085: 0x00005534,\n\t13086: 0x0000552A,\n\t13087: 0x00005551,\n\t13088: 0x00005562,\n\t13089: 0x00005536,\n\t13090: 0x00005535,\n\t13091: 0x00005530,\n\t13092: 0x00005552,\n\t13093: 0x00005545,\n\t13094: 0x0000550C,\n\t13095: 0x00005532,\n\t13096: 0x00005565,\n\t13097: 0x0000554E,\n\t13098: 0x00005539,\n\t13099: 0x00005548,\n\t13100: 0x0000552D,\n\t13101: 0x0000553B,\n\t13102: 0x00005540,\n\t13103: 0x0000554B,\n\t13104: 0x0000570A,\n\t13105: 0x00005707,\n\t13106: 0x000057FB,\n\t13107: 0x00005814,\n\t13108: 0x000057E2,\n\t13109: 0x000057F6,\n\t13110: 0x000057DC,\n\t13111: 0x000057F4,\n\t13112: 0x00005800,\n\t13113: 0x000057ED,\n\t13114: 0x000057FD,\n\t13115: 0x00005808,\n\t13116: 0x000057F8,\n\t13117: 0x0000580B,\n\t13118: 0x000057F3,\n\t13119: 0x000057CF,\n\t13120: 0x00005807,\n\t13121: 0x000057EE,\n\t13122: 0x000057E3,\n\t13123: 0x000057F2,\n\t13124: 0x000057E5,\n\t13125: 0x000057EC,\n\t13126: 0x000057E1,\n\t13127: 0x0000580E,\n\t13128: 0x000057FC,\n\t13129: 0x00005810,\n\t13130: 0x000057E7,\n\t13131: 0x00005801,\n\t13132: 0x0000580C,\n\t13133: 0x000057F1,\n\t13134: 0x000057E9,\n\t13135: 0x000057F0,\n\t13136: 0x0000580D,\n\t13137: 0x00005804,\n\t13138: 0x0000595C,\n\t13139: 0x00005A60,\n\t13140: 0x00005A58,\n\t13141: 0x00005A55,\n\t13142: 0x00005A67,\n\t13143: 0x00005A5E,\n\t13144: 0x00005A38,\n\t13145: 0x00005A35,\n\t13146: 0x00005A6D,\n\t13147: 0x00005A50,\n\t13148: 0x00005A5F,\n\t13149: 0x00005A65,\n\t13150: 0x00005A6C,\n\t13151: 0x00005A53,\n\t13152: 0x00005A64,\n\t13153: 0x00005A57,\n\t13154: 0x00005A43,\n\t13155: 0x00005A5D,\n\t13156: 0x00005A52,\n\t13157: 0x00005A44,\n\t13158: 0x00005A5B,\n\t13159: 0x00005A48,\n\t13160: 0x00005A8E,\n\t13161: 0x00005A3E,\n\t13162: 0x00005A4D,\n\t13163: 0x00005A39,\n\t13164: 0x00005A4C,\n\t13165: 0x00005A70,\n\t13166: 0x00005A69,\n\t13167: 0x00005A47,\n\t13168: 0x00005A51,\n\t13169: 0x00005A56,\n\t13170: 0x00005A42,\n\t13171: 0x00005A5C,\n\t13172: 0x00005B72,\n\t13173: 0x00005B6E,\n\t13174: 0x00005BC1,\n\t13175: 0x00005BC0,\n\t13176: 0x00005C59,\n\t13177: 0x00005D1E,\n\t13178: 0x00005D0B,\n\t13179: 0x00005D1D,\n\t13180: 0x00005D1A,\n\t13181: 0x00005D20,\n\t13182: 0x00005D0C,\n\t13183: 0x00005D28,\n\t13184: 0x00005D0D,\n\t13185: 0x00005D26,\n\t13186: 0x00005D25,\n\t13187: 0x00005D0F,\n\t13188: 0x00005D30,\n\t13189: 0x00005D12,\n\t13190: 0x00005D23,\n\t13191: 0x00005D1F,\n\t13192: 0x00005D2E,\n\t13193: 0x00005E3E,\n\t13194: 0x00005E34,\n\t13195: 0x00005EB1,\n\t13196: 0x00005EB4,\n\t13197: 0x00005EB9,\n\t13198: 0x00005EB2,\n\t13199: 0x00005EB3,\n\t13200: 0x00005F36,\n\t13201: 0x00005F38,\n\t13202: 0x00005F9B,\n\t13203: 0x00005F96,\n\t13204: 0x00005F9F,\n\t13205: 0x0000608A,\n\t13206: 0x00006090,\n\t13207: 0x00006086,\n\t13208: 0x000060BE,\n\t13209: 0x000060B0,\n\t13210: 0x000060BA,\n\t13211: 0x000060D3,\n\t13212: 0x000060D4,\n\t13213: 0x000060CF,\n\t13214: 0x000060E4,\n\t13215: 0x000060D9,\n\t13216: 0x000060DD,\n\t13217: 0x000060C8,\n\t13218: 0x000060B1,\n\t13219: 0x000060DB,\n\t13220: 0x000060B7,\n\t13221: 0x000060CA,\n\t13222: 0x000060BF,\n\t13223: 0x000060C3,\n\t13224: 0x000060CD,\n\t13225: 0x000060C0,\n\t13226: 0x00006332,\n\t13227: 0x00006365,\n\t13228: 0x0000638A,\n\t13229: 0x00006382,\n\t13230: 0x0000637D,\n\t13231: 0x000063BD,\n\t13232: 0x0000639E,\n\t13233: 0x000063AD,\n\t13234: 0x0000639D,\n\t13235: 0x00006397,\n\t13236: 0x000063AB,\n\t13237: 0x0000638E,\n\t13238: 0x0000636F,\n\t13239: 0x00006387,\n\t13240: 0x00006390,\n\t13241: 0x0000636E,\n\t13242: 0x000063AF,\n\t13243: 0x00006375,\n\t13244: 0x0000639C,\n\t13245: 0x0000636D,\n\t13246: 0x000063AE,\n\t13247: 0x0000637C,\n\t13248: 0x000063A4,\n\t13249: 0x0000633B,\n\t13250: 0x0000639F,\n\t13251: 0x00006378,\n\t13252: 0x00006385,\n\t13253: 0x00006381,\n\t13254: 0x00006391,\n\t13255: 0x0000638D,\n\t13256: 0x00006370,\n\t13257: 0x00006553,\n\t13258: 0x000065CD,\n\t13259: 0x00006665,\n\t13260: 0x00006661,\n\t13261: 0x0000665B,\n\t13262: 0x00006659,\n\t13263: 0x0000665C,\n\t13264: 0x00006662,\n\t13265: 0x00006718,\n\t13266: 0x00006879,\n\t13267: 0x00006887,\n\t13268: 0x00006890,\n\t13269: 0x0000689C,\n\t13270: 0x0000686D,\n\t13271: 0x0000686E,\n\t13272: 0x000068AE,\n\t13273: 0x000068AB,\n\t13274: 0x00006956,\n\t13275: 0x0000686F,\n\t13276: 0x000068A3,\n\t13277: 0x000068AC,\n\t13278: 0x000068A9,\n\t13279: 0x00006875,\n\t13280: 0x00006874,\n\t13281: 0x000068B2,\n\t13282: 0x0000688F,\n\t13283: 0x00006877,\n\t13284: 0x00006892,\n\t13285: 0x0000687C,\n\t13286: 0x0000686B,\n\t13287: 0x00006872,\n\t13288: 0x000068AA,\n\t13289: 0x00006880,\n\t13290: 0x00006871,\n\t13291: 0x0000687E,\n\t13292: 0x0000689B,\n\t13293: 0x00006896,\n\t13294: 0x0000688B,\n\t13295: 0x000068A0,\n\t13296: 0x00006889,\n\t13297: 0x000068A4,\n\t13298: 0x00006878,\n\t13299: 0x0000687B,\n\t13300: 0x00006891,\n\t13301: 0x0000688C,\n\t13302: 0x0000688A,\n\t13303: 0x0000687D,\n\t13304: 0x00006B36,\n\t13305: 0x00006B33,\n\t13306: 0x00006B37,\n\t13307: 0x00006B38,\n\t13308: 0x00006B91,\n\t13309: 0x00006B8F,\n\t13310: 0x00006B8D,\n\t13311: 0x00006B8E,\n\t13312: 0x00006B8C,\n\t13313: 0x00006C2A,\n\t13314: 0x00006DC0,\n\t13315: 0x00006DAB,\n\t13316: 0x00006DB4,\n\t13317: 0x00006DB3,\n\t13318: 0x00006E74,\n\t13319: 0x00006DAC,\n\t13320: 0x00006DE9,\n\t13321: 0x00006DE2,\n\t13322: 0x00006DB7,\n\t13323: 0x00006DF6,\n\t13324: 0x00006DD4,\n\t13325: 0x00006E00,\n\t13326: 0x00006DC8,\n\t13327: 0x00006DE0,\n\t13328: 0x00006DDF,\n\t13329: 0x00006DD6,\n\t13330: 0x00006DBE,\n\t13331: 0x00006DE5,\n\t13332: 0x00006DDC,\n\t13333: 0x00006DDD,\n\t13334: 0x00006DDB,\n\t13335: 0x00006DF4,\n\t13336: 0x00006DCA,\n\t13337: 0x00006DBD,\n\t13338: 0x00006DED,\n\t13339: 0x00006DF0,\n\t13340: 0x00006DBA,\n\t13341: 0x00006DD5,\n\t13342: 0x00006DC2,\n\t13343: 0x00006DCF,\n\t13344: 0x00006DC9,\n\t13345: 0x00006DD0,\n\t13346: 0x00006DF2,\n\t13347: 0x00006DD3,\n\t13348: 0x00006DFD,\n\t13349: 0x00006DD7,\n\t13350: 0x00006DCD,\n\t13351: 0x00006DE3,\n\t13352: 0x00006DBB,\n\t13353: 0x000070FA,\n\t13354: 0x0000710D,\n\t13355: 0x000070F7,\n\t13356: 0x00007117,\n\t13357: 0x000070F4,\n\t13358: 0x0000710C,\n\t13359: 0x000070F0,\n\t13360: 0x00007104,\n\t13361: 0x000070F3,\n\t13362: 0x00007110,\n\t13363: 0x000070FC,\n\t13364: 0x000070FF,\n\t13365: 0x00007106,\n\t13366: 0x00007113,\n\t13367: 0x00007100,\n\t13368: 0x000070F8,\n\t13369: 0x000070F6,\n\t13370: 0x0000710B,\n\t13371: 0x00007102,\n\t13372: 0x0000710E,\n\t13373: 0x0000727E,\n\t13374: 0x0000727B,\n\t13375: 0x0000727C,\n\t13376: 0x0000727F,\n\t13377: 0x0000731D,\n\t13378: 0x00007317,\n\t13379: 0x00007307,\n\t13380: 0x00007311,\n\t13381: 0x00007318,\n\t13382: 0x0000730A,\n\t13383: 0x00007308,\n\t13384: 0x000072FF,\n\t13385: 0x0000730F,\n\t13386: 0x0000731E,\n\t13387: 0x00007388,\n\t13388: 0x000073F6,\n\t13389: 0x000073F8,\n\t13390: 0x000073F5,\n\t13391: 0x00007404,\n\t13392: 0x00007401,\n\t13393: 0x000073FD,\n\t13394: 0x00007407,\n\t13395: 0x00007400,\n\t13396: 0x000073FA,\n\t13397: 0x000073FC,\n\t13398: 0x000073FF,\n\t13399: 0x0000740C,\n\t13400: 0x0000740B,\n\t13401: 0x000073F4,\n\t13402: 0x00007408,\n\t13403: 0x00007564,\n\t13404: 0x00007563,\n\t13405: 0x000075CE,\n\t13406: 0x000075D2,\n\t13407: 0x000075CF,\n\t13408: 0x000075CB,\n\t13409: 0x000075CC,\n\t13410: 0x000075D1,\n\t13411: 0x000075D0,\n\t13412: 0x0000768F,\n\t13413: 0x00007689,\n\t13414: 0x000076D3,\n\t13415: 0x00007739,\n\t13416: 0x0000772F,\n\t13417: 0x0000772D,\n\t13418: 0x00007731,\n\t13419: 0x00007732,\n\t13420: 0x00007734,\n\t13421: 0x00007733,\n\t13422: 0x0000773D,\n\t13423: 0x00007725,\n\t13424: 0x0000773B,\n\t13425: 0x00007735,\n\t13426: 0x00007848,\n\t13427: 0x00007852,\n\t13428: 0x00007849,\n\t13429: 0x0000784D,\n\t13430: 0x0000784A,\n\t13431: 0x0000784C,\n\t13432: 0x00007826,\n\t13433: 0x00007845,\n\t13434: 0x00007850,\n\t13435: 0x00007964,\n\t13436: 0x00007967,\n\t13437: 0x00007969,\n\t13438: 0x0000796A,\n\t13439: 0x00007963,\n\t13440: 0x0000796B,\n\t13441: 0x00007961,\n\t13442: 0x000079BB,\n\t13443: 0x000079FA,\n\t13444: 0x000079F8,\n\t13445: 0x000079F6,\n\t13446: 0x000079F7,\n\t13447: 0x00007A8F,\n\t13448: 0x00007A94,\n\t13449: 0x00007A90,\n\t13450: 0x00007B35,\n\t13451: 0x00007B47,\n\t13452: 0x00007B34,\n\t13453: 0x00007B25,\n\t13454: 0x00007B30,\n\t13455: 0x00007B22,\n\t13456: 0x00007B24,\n\t13457: 0x00007B33,\n\t13458: 0x00007B18,\n\t13459: 0x00007B2A,\n\t13460: 0x00007B1D,\n\t13461: 0x00007B31,\n\t13462: 0x00007B2B,\n\t13463: 0x00007B2D,\n\t13464: 0x00007B2F,\n\t13465: 0x00007B32,\n\t13466: 0x00007B38,\n\t13467: 0x00007B1A,\n\t13468: 0x00007B23,\n\t13469: 0x00007C94,\n\t13470: 0x00007C98,\n\t13471: 0x00007C96,\n\t13472: 0x00007CA3,\n\t13473: 0x00007D35,\n\t13474: 0x00007D3D,\n\t13475: 0x00007D38,\n\t13476: 0x00007D36,\n\t13477: 0x00007D3A,\n\t13478: 0x00007D45,\n\t13479: 0x00007D2C,\n\t13480: 0x00007D29,\n\t13481: 0x00007D41,\n\t13482: 0x00007D47,\n\t13483: 0x00007D3E,\n\t13484: 0x00007D3F,\n\t13485: 0x00007D4A,\n\t13486: 0x00007D3B,\n\t13487: 0x00007D28,\n\t13488: 0x00007F63,\n\t13489: 0x00007F95,\n\t13490: 0x00007F9C,\n\t13491: 0x00007F9D,\n\t13492: 0x00007F9B,\n\t13493: 0x00007FCA,\n\t13494: 0x00007FCB,\n\t13495: 0x00007FCD,\n\t13496: 0x00007FD0,\n\t13497: 0x00007FD1,\n\t13498: 0x00007FC7,\n\t13499: 0x00007FCF,\n\t13500: 0x00007FC9,\n\t13501: 0x0000801F,\n\t13502: 0x0000801E,\n\t13503: 0x0000801B,\n\t13504: 0x00008047,\n\t13505: 0x00008043,\n\t13506: 0x00008048,\n\t13507: 0x00008118,\n\t13508: 0x00008125,\n\t13509: 0x00008119,\n\t13510: 0x0000811B,\n\t13511: 0x0000812D,\n\t13512: 0x0000811F,\n\t13513: 0x0000812C,\n\t13514: 0x0000811E,\n\t13515: 0x00008121,\n\t13516: 0x00008115,\n\t13517: 0x00008127,\n\t13518: 0x0000811D,\n\t13519: 0x00008122,\n\t13520: 0x00008211,\n\t13521: 0x00008238,\n\t13522: 0x00008233,\n\t13523: 0x0000823A,\n\t13524: 0x00008234,\n\t13525: 0x00008232,\n\t13526: 0x00008274,\n\t13527: 0x00008390,\n\t13528: 0x000083A3,\n\t13529: 0x000083A8,\n\t13530: 0x0000838D,\n\t13531: 0x0000837A,\n\t13532: 0x00008373,\n\t13533: 0x000083A4,\n\t13534: 0x00008374,\n\t13535: 0x0000838F,\n\t13536: 0x00008381,\n\t13537: 0x00008395,\n\t13538: 0x00008399,\n\t13539: 0x00008375,\n\t13540: 0x00008394,\n\t13541: 0x000083A9,\n\t13542: 0x0000837D,\n\t13543: 0x00008383,\n\t13544: 0x0000838C,\n\t13545: 0x0000839D,\n\t13546: 0x0000839B,\n\t13547: 0x000083AA,\n\t13548: 0x0000838B,\n\t13549: 0x0000837E,\n\t13550: 0x000083A5,\n\t13551: 0x000083AF,\n\t13552: 0x00008388,\n\t13553: 0x00008397,\n\t13554: 0x000083B0,\n\t13555: 0x0000837F,\n\t13556: 0x000083A6,\n\t13557: 0x00008387,\n\t13558: 0x000083AE,\n\t13559: 0x00008376,\n\t13560: 0x0000839A,\n\t13561: 0x00008659,\n\t13562: 0x00008656,\n\t13563: 0x000086BF,\n\t13564: 0x000086B7,\n\t13565: 0x000086C2,\n\t13566: 0x000086C1,\n\t13567: 0x000086C5,\n\t13568: 0x000086BA,\n\t13569: 0x000086B0,\n\t13570: 0x000086C8,\n\t13571: 0x000086B9,\n\t13572: 0x000086B3,\n\t13573: 0x000086B8,\n\t13574: 0x000086CC,\n\t13575: 0x000086B4,\n\t13576: 0x000086BB,\n\t13577: 0x000086BC,\n\t13578: 0x000086C3,\n\t13579: 0x000086BD,\n\t13580: 0x000086BE,\n\t13581: 0x00008852,\n\t13582: 0x00008889,\n\t13583: 0x00008895,\n\t13584: 0x000088A8,\n\t13585: 0x000088A2,\n\t13586: 0x000088AA,\n\t13587: 0x0000889A,\n\t13588: 0x00008891,\n\t13589: 0x000088A1,\n\t13590: 0x0000889F,\n\t13591: 0x00008898,\n\t13592: 0x000088A7,\n\t13593: 0x00008899,\n\t13594: 0x0000889B,\n\t13595: 0x00008897,\n\t13596: 0x000088A4,\n\t13597: 0x000088AC,\n\t13598: 0x0000888C,\n\t13599: 0x00008893,\n\t13600: 0x0000888E,\n\t13601: 0x00008982,\n\t13602: 0x000089D6,\n\t13603: 0x000089D9,\n\t13604: 0x000089D5,\n\t13605: 0x00008A30,\n\t13606: 0x00008A27,\n\t13607: 0x00008A2C,\n\t13608: 0x00008A1E,\n\t13609: 0x00008C39,\n\t13610: 0x00008C3B,\n\t13611: 0x00008C5C,\n\t13612: 0x00008C5D,\n\t13613: 0x00008C7D,\n\t13614: 0x00008CA5,\n\t13615: 0x00008D7D,\n\t13616: 0x00008D7B,\n\t13617: 0x00008D79,\n\t13618: 0x00008DBC,\n\t13619: 0x00008DC2,\n\t13620: 0x00008DB9,\n\t13621: 0x00008DBF,\n\t13622: 0x00008DC1,\n\t13623: 0x00008ED8,\n\t13624: 0x00008EDE,\n\t13625: 0x00008EDD,\n\t13626: 0x00008EDC,\n\t13627: 0x00008ED7,\n\t13628: 0x00008EE0,\n\t13629: 0x00008EE1,\n\t13630: 0x00009024,\n\t13631: 0x0000900B,\n\t13632: 0x00009011,\n\t13633: 0x0000901C,\n\t13634: 0x0000900C,\n\t13635: 0x00009021,\n\t13636: 0x000090EF,\n\t13637: 0x000090EA,\n\t13638: 0x000090F0,\n\t13639: 0x000090F4,\n\t13640: 0x000090F2,\n\t13641: 0x000090F3,\n\t13642: 0x000090D4,\n\t13643: 0x000090EB,\n\t13644: 0x000090EC,\n\t13645: 0x000090E9,\n\t13646: 0x00009156,\n\t13647: 0x00009158,\n\t13648: 0x0000915A,\n\t13649: 0x00009153,\n\t13650: 0x00009155,\n\t13651: 0x000091EC,\n\t13652: 0x000091F4,\n\t13653: 0x000091F1,\n\t13654: 0x000091F3,\n\t13655: 0x000091F8,\n\t13656: 0x000091E4,\n\t13657: 0x000091F9,\n\t13658: 0x000091EA,\n\t13659: 0x000091EB,\n\t13660: 0x000091F7,\n\t13661: 0x000091E8,\n\t13662: 0x000091EE,\n\t13663: 0x0000957A,\n\t13664: 0x00009586,\n\t13665: 0x00009588,\n\t13666: 0x0000967C,\n\t13667: 0x0000966D,\n\t13668: 0x0000966B,\n\t13669: 0x00009671,\n\t13670: 0x0000966F,\n\t13671: 0x000096BF,\n\t13672: 0x0000976A,\n\t13673: 0x00009804,\n\t13674: 0x000098E5,\n\t13675: 0x00009997,\n\t13676: 0x0000509B,\n\t13677: 0x00005095,\n\t13678: 0x00005094,\n\t13679: 0x0000509E,\n\t13680: 0x0000508B,\n\t13681: 0x000050A3,\n\t13682: 0x00005083,\n\t13683: 0x0000508C,\n\t13684: 0x0000508E,\n\t13685: 0x0000509D,\n\t13686: 0x00005068,\n\t13687: 0x0000509C,\n\t13688: 0x00005092,\n\t13689: 0x00005082,\n\t13690: 0x00005087,\n\t13691: 0x0000515F,\n\t13692: 0x000051D4,\n\t13693: 0x00005312,\n\t13694: 0x00005311,\n\t13695: 0x000053A4,\n\t13696: 0x000053A7,\n\t13697: 0x00005591,\n\t13698: 0x000055A8,\n\t13699: 0x000055A5,\n\t13700: 0x000055AD,\n\t13701: 0x00005577,\n\t13702: 0x00005645,\n\t13703: 0x000055A2,\n\t13704: 0x00005593,\n\t13705: 0x00005588,\n\t13706: 0x0000558F,\n\t13707: 0x000055B5,\n\t13708: 0x00005581,\n\t13709: 0x000055A3,\n\t13710: 0x00005592,\n\t13711: 0x000055A4,\n\t13712: 0x0000557D,\n\t13713: 0x0000558C,\n\t13714: 0x000055A6,\n\t13715: 0x0000557F,\n\t13716: 0x00005595,\n\t13717: 0x000055A1,\n\t13718: 0x0000558E,\n\t13719: 0x0000570C,\n\t13720: 0x00005829,\n\t13721: 0x00005837,\n\t13722: 0x00005819,\n\t13723: 0x0000581E,\n\t13724: 0x00005827,\n\t13725: 0x00005823,\n\t13726: 0x00005828,\n\t13727: 0x000057F5,\n\t13728: 0x00005848,\n\t13729: 0x00005825,\n\t13730: 0x0000581C,\n\t13731: 0x0000581B,\n\t13732: 0x00005833,\n\t13733: 0x0000583F,\n\t13734: 0x00005836,\n\t13735: 0x0000582E,\n\t13736: 0x00005839,\n\t13737: 0x00005838,\n\t13738: 0x0000582D,\n\t13739: 0x0000582C,\n\t13740: 0x0000583B,\n\t13741: 0x00005961,\n\t13742: 0x00005AAF,\n\t13743: 0x00005A94,\n\t13744: 0x00005A9F,\n\t13745: 0x00005A7A,\n\t13746: 0x00005AA2,\n\t13747: 0x00005A9E,\n\t13748: 0x00005A78,\n\t13749: 0x00005AA6,\n\t13750: 0x00005A7C,\n\t13751: 0x00005AA5,\n\t13752: 0x00005AAC,\n\t13753: 0x00005A95,\n\t13754: 0x00005AAE,\n\t13755: 0x00005A37,\n\t13756: 0x00005A84,\n\t13757: 0x00005A8A,\n\t13758: 0x00005A97,\n\t13759: 0x00005A83,\n\t13760: 0x00005A8B,\n\t13761: 0x00005AA9,\n\t13762: 0x00005A7B,\n\t13763: 0x00005A7D,\n\t13764: 0x00005A8C,\n\t13765: 0x00005A9C,\n\t13766: 0x00005A8F,\n\t13767: 0x00005A93,\n\t13768: 0x00005A9D,\n\t13769: 0x00005BEA,\n\t13770: 0x00005BCD,\n\t13771: 0x00005BCB,\n\t13772: 0x00005BD4,\n\t13773: 0x00005BD1,\n\t13774: 0x00005BCA,\n\t13775: 0x00005BCE,\n\t13776: 0x00005C0C,\n\t13777: 0x00005C30,\n\t13778: 0x00005D37,\n\t13779: 0x00005D43,\n\t13780: 0x00005D6B,\n\t13781: 0x00005D41,\n\t13782: 0x00005D4B,\n\t13783: 0x00005D3F,\n\t13784: 0x00005D35,\n\t13785: 0x00005D51,\n\t13786: 0x00005D4E,\n\t13787: 0x00005D55,\n\t13788: 0x00005D33,\n\t13789: 0x00005D3A,\n\t13790: 0x00005D52,\n\t13791: 0x00005D3D,\n\t13792: 0x00005D31,\n\t13793: 0x00005D59,\n\t13794: 0x00005D42,\n\t13795: 0x00005D39,\n\t13796: 0x00005D49,\n\t13797: 0x00005D38,\n\t13798: 0x00005D3C,\n\t13799: 0x00005D32,\n\t13800: 0x00005D36,\n\t13801: 0x00005D40,\n\t13802: 0x00005D45,\n\t13803: 0x00005E44,\n\t13804: 0x00005E41,\n\t13805: 0x00005F58,\n\t13806: 0x00005FA6,\n\t13807: 0x00005FA5,\n\t13808: 0x00005FAB,\n\t13809: 0x000060C9,\n\t13810: 0x000060B9,\n\t13811: 0x000060CC,\n\t13812: 0x000060E2,\n\t13813: 0x000060CE,\n\t13814: 0x000060C4,\n\t13815: 0x00006114,\n\t13816: 0x000060F2,\n\t13817: 0x0000610A,\n\t13818: 0x00006116,\n\t13819: 0x00006105,\n\t13820: 0x000060F5,\n\t13821: 0x00006113,\n\t13822: 0x000060F8,\n\t13823: 0x000060FC,\n\t13824: 0x000060FE,\n\t13825: 0x000060C1,\n\t13826: 0x00006103,\n\t13827: 0x00006118,\n\t13828: 0x0000611D,\n\t13829: 0x00006110,\n\t13830: 0x000060FF,\n\t13831: 0x00006104,\n\t13832: 0x0000610B,\n\t13833: 0x0000624A,\n\t13834: 0x00006394,\n\t13835: 0x000063B1,\n\t13836: 0x000063B0,\n\t13837: 0x000063CE,\n\t13838: 0x000063E5,\n\t13839: 0x000063E8,\n\t13840: 0x000063EF,\n\t13841: 0x000063C3,\n\t13842: 0x0000649D,\n\t13843: 0x000063F3,\n\t13844: 0x000063CA,\n\t13845: 0x000063E0,\n\t13846: 0x000063F6,\n\t13847: 0x000063D5,\n\t13848: 0x000063F2,\n\t13849: 0x000063F5,\n\t13850: 0x00006461,\n\t13851: 0x000063DF,\n\t13852: 0x000063BE,\n\t13853: 0x000063DD,\n\t13854: 0x000063DC,\n\t13855: 0x000063C4,\n\t13856: 0x000063D8,\n\t13857: 0x000063D3,\n\t13858: 0x000063C2,\n\t13859: 0x000063C7,\n\t13860: 0x000063CC,\n\t13861: 0x000063CB,\n\t13862: 0x000063C8,\n\t13863: 0x000063F0,\n\t13864: 0x000063D7,\n\t13865: 0x000063D9,\n\t13866: 0x00006532,\n\t13867: 0x00006567,\n\t13868: 0x0000656A,\n\t13869: 0x00006564,\n\t13870: 0x0000655C,\n\t13871: 0x00006568,\n\t13872: 0x00006565,\n\t13873: 0x0000658C,\n\t13874: 0x0000659D,\n\t13875: 0x0000659E,\n\t13876: 0x000065AE,\n\t13877: 0x000065D0,\n\t13878: 0x000065D2,\n\t13879: 0x0000667C,\n\t13880: 0x0000666C,\n\t13881: 0x0000667B,\n\t13882: 0x00006680,\n\t13883: 0x00006671,\n\t13884: 0x00006679,\n\t13885: 0x0000666A,\n\t13886: 0x00006672,\n\t13887: 0x00006701,\n\t13888: 0x0000690C,\n\t13889: 0x000068D3,\n\t13890: 0x00006904,\n\t13891: 0x000068DC,\n\t13892: 0x0000692A,\n\t13893: 0x000068EC,\n\t13894: 0x000068EA,\n\t13895: 0x000068F1,\n\t13896: 0x0000690F,\n\t13897: 0x000068D6,\n\t13898: 0x000068F7,\n\t13899: 0x000068EB,\n\t13900: 0x000068E4,\n\t13901: 0x000068F6,\n\t13902: 0x00006913,\n\t13903: 0x00006910,\n\t13904: 0x000068F3,\n\t13905: 0x000068E1,\n\t13906: 0x00006907,\n\t13907: 0x000068CC,\n\t13908: 0x00006908,\n\t13909: 0x00006970,\n\t13910: 0x000068B4,\n\t13911: 0x00006911,\n\t13912: 0x000068EF,\n\t13913: 0x000068C6,\n\t13914: 0x00006914,\n\t13915: 0x000068F8,\n\t13916: 0x000068D0,\n\t13917: 0x000068FD,\n\t13918: 0x000068FC,\n\t13919: 0x000068E8,\n\t13920: 0x0000690B,\n\t13921: 0x0000690A,\n\t13922: 0x00006917,\n\t13923: 0x000068CE,\n\t13924: 0x000068C8,\n\t13925: 0x000068DD,\n\t13926: 0x000068DE,\n\t13927: 0x000068E6,\n\t13928: 0x000068F4,\n\t13929: 0x000068D1,\n\t13930: 0x00006906,\n\t13931: 0x000068D4,\n\t13932: 0x000068E9,\n\t13933: 0x00006915,\n\t13934: 0x00006925,\n\t13935: 0x000068C7,\n\t13936: 0x00006B39,\n\t13937: 0x00006B3B,\n\t13938: 0x00006B3F,\n\t13939: 0x00006B3C,\n\t13940: 0x00006B94,\n\t13941: 0x00006B97,\n\t13942: 0x00006B99,\n\t13943: 0x00006B95,\n\t13944: 0x00006BBD,\n\t13945: 0x00006BF0,\n\t13946: 0x00006BF2,\n\t13947: 0x00006BF3,\n\t13948: 0x00006C30,\n\t13949: 0x00006DFC,\n\t13950: 0x00006E46,\n\t13951: 0x00006E47,\n\t13952: 0x00006E1F,\n\t13953: 0x00006E49,\n\t13954: 0x00006E88,\n\t13955: 0x00006E3C,\n\t13956: 0x00006E3D,\n\t13957: 0x00006E45,\n\t13958: 0x00006E62,\n\t13959: 0x00006E2B,\n\t13960: 0x00006E3F,\n\t13961: 0x00006E41,\n\t13962: 0x00006E5D,\n\t13963: 0x00006E73,\n\t13964: 0x00006E1C,\n\t13965: 0x00006E33,\n\t13966: 0x00006E4B,\n\t13967: 0x00006E40,\n\t13968: 0x00006E51,\n\t13969: 0x00006E3B,\n\t13970: 0x00006E03,\n\t13971: 0x00006E2E,\n\t13972: 0x00006E5E,\n\t13973: 0x00006E68,\n\t13974: 0x00006E5C,\n\t13975: 0x00006E61,\n\t13976: 0x00006E31,\n\t13977: 0x00006E28,\n\t13978: 0x00006E60,\n\t13979: 0x00006E71,\n\t13980: 0x00006E6B,\n\t13981: 0x00006E39,\n\t13982: 0x00006E22,\n\t13983: 0x00006E30,\n\t13984: 0x00006E53,\n\t13985: 0x00006E65,\n\t13986: 0x00006E27,\n\t13987: 0x00006E78,\n\t13988: 0x00006E64,\n\t13989: 0x00006E77,\n\t13990: 0x00006E55,\n\t13991: 0x00006E79,\n\t13992: 0x00006E52,\n\t13993: 0x00006E66,\n\t13994: 0x00006E35,\n\t13995: 0x00006E36,\n\t13996: 0x00006E5A,\n\t13997: 0x00007120,\n\t13998: 0x0000711E,\n\t13999: 0x0000712F,\n\t14000: 0x000070FB,\n\t14001: 0x0000712E,\n\t14002: 0x00007131,\n\t14003: 0x00007123,\n\t14004: 0x00007125,\n\t14005: 0x00007122,\n\t14006: 0x00007132,\n\t14007: 0x0000711F,\n\t14008: 0x00007128,\n\t14009: 0x0000713A,\n\t14010: 0x0000711B,\n\t14011: 0x0000724B,\n\t14012: 0x0000725A,\n\t14013: 0x00007288,\n\t14014: 0x00007289,\n\t14015: 0x00007286,\n\t14016: 0x00007285,\n\t14017: 0x0000728B,\n\t14018: 0x00007312,\n\t14019: 0x0000730B,\n\t14020: 0x00007330,\n\t14021: 0x00007322,\n\t14022: 0x00007331,\n\t14023: 0x00007333,\n\t14024: 0x00007327,\n\t14025: 0x00007332,\n\t14026: 0x0000732D,\n\t14027: 0x00007326,\n\t14028: 0x00007323,\n\t14029: 0x00007335,\n\t14030: 0x0000730C,\n\t14031: 0x0000742E,\n\t14032: 0x0000742C,\n\t14033: 0x00007430,\n\t14034: 0x0000742B,\n\t14035: 0x00007416,\n\t14036: 0x0000741A,\n\t14037: 0x00007421,\n\t14038: 0x0000742D,\n\t14039: 0x00007431,\n\t14040: 0x00007424,\n\t14041: 0x00007423,\n\t14042: 0x0000741D,\n\t14043: 0x00007429,\n\t14044: 0x00007420,\n\t14045: 0x00007432,\n\t14046: 0x000074FB,\n\t14047: 0x0000752F,\n\t14048: 0x0000756F,\n\t14049: 0x0000756C,\n\t14050: 0x000075E7,\n\t14051: 0x000075DA,\n\t14052: 0x000075E1,\n\t14053: 0x000075E6,\n\t14054: 0x000075DD,\n\t14055: 0x000075DF,\n\t14056: 0x000075E4,\n\t14057: 0x000075D7,\n\t14058: 0x00007695,\n\t14059: 0x00007692,\n\t14060: 0x000076DA,\n\t14061: 0x00007746,\n\t14062: 0x00007747,\n\t14063: 0x00007744,\n\t14064: 0x0000774D,\n\t14065: 0x00007745,\n\t14066: 0x0000774A,\n\t14067: 0x0000774E,\n\t14068: 0x0000774B,\n\t14069: 0x0000774C,\n\t14070: 0x000077DE,\n\t14071: 0x000077EC,\n\t14072: 0x00007860,\n\t14073: 0x00007864,\n\t14074: 0x00007865,\n\t14075: 0x0000785C,\n\t14076: 0x0000786D,\n\t14077: 0x00007871,\n\t14078: 0x0000786A,\n\t14079: 0x0000786E,\n\t14080: 0x00007870,\n\t14081: 0x00007869,\n\t14082: 0x00007868,\n\t14083: 0x0000785E,\n\t14084: 0x00007862,\n\t14085: 0x00007974,\n\t14086: 0x00007973,\n\t14087: 0x00007972,\n\t14088: 0x00007970,\n\t14089: 0x00007A02,\n\t14090: 0x00007A0A,\n\t14091: 0x00007A03,\n\t14092: 0x00007A0C,\n\t14093: 0x00007A04,\n\t14094: 0x00007A99,\n\t14095: 0x00007AE6,\n\t14096: 0x00007AE4,\n\t14097: 0x00007B4A,\n\t14098: 0x00007B3B,\n\t14099: 0x00007B44,\n\t14100: 0x00007B48,\n\t14101: 0x00007B4C,\n\t14102: 0x00007B4E,\n\t14103: 0x00007B40,\n\t14104: 0x00007B58,\n\t14105: 0x00007B45,\n\t14106: 0x00007CA2,\n\t14107: 0x00007C9E,\n\t14108: 0x00007CA8,\n\t14109: 0x00007CA1,\n\t14110: 0x00007D58,\n\t14111: 0x00007D6F,\n\t14112: 0x00007D63,\n\t14113: 0x00007D53,\n\t14114: 0x00007D56,\n\t14115: 0x00007D67,\n\t14116: 0x00007D6A,\n\t14117: 0x00007D4F,\n\t14118: 0x00007D6D,\n\t14119: 0x00007D5C,\n\t14120: 0x00007D6B,\n\t14121: 0x00007D52,\n\t14122: 0x00007D54,\n\t14123: 0x00007D69,\n\t14124: 0x00007D51,\n\t14125: 0x00007D5F,\n\t14126: 0x00007D4E,\n\t14127: 0x00007F3E,\n\t14128: 0x00007F3F,\n\t14129: 0x00007F65,\n\t14130: 0x00007F66,\n\t14131: 0x00007FA2,\n\t14132: 0x00007FA0,\n\t14133: 0x00007FA1,\n\t14134: 0x00007FD7,\n\t14135: 0x00008051,\n\t14136: 0x0000804F,\n\t14137: 0x00008050,\n\t14138: 0x000080FE,\n\t14139: 0x000080D4,\n\t14140: 0x00008143,\n\t14141: 0x0000814A,\n\t14142: 0x00008152,\n\t14143: 0x0000814F,\n\t14144: 0x00008147,\n\t14145: 0x0000813D,\n\t14146: 0x0000814D,\n\t14147: 0x0000813A,\n\t14148: 0x000081E6,\n\t14149: 0x000081EE,\n\t14150: 0x000081F7,\n\t14151: 0x000081F8,\n\t14152: 0x000081F9,\n\t14153: 0x00008204,\n\t14154: 0x0000823C,\n\t14155: 0x0000823D,\n\t14156: 0x0000823F,\n\t14157: 0x00008275,\n\t14158: 0x0000833B,\n\t14159: 0x000083CF,\n\t14160: 0x000083F9,\n\t14161: 0x00008423,\n\t14162: 0x000083C0,\n\t14163: 0x000083E8,\n\t14164: 0x00008412,\n\t14165: 0x000083E7,\n\t14166: 0x000083E4,\n\t14167: 0x000083FC,\n\t14168: 0x000083F6,\n\t14169: 0x00008410,\n\t14170: 0x000083C6,\n\t14171: 0x000083C8,\n\t14172: 0x000083EB,\n\t14173: 0x000083E3,\n\t14174: 0x000083BF,\n\t14175: 0x00008401,\n\t14176: 0x000083DD,\n\t14177: 0x000083E5,\n\t14178: 0x000083D8,\n\t14179: 0x000083FF,\n\t14180: 0x000083E1,\n\t14181: 0x000083CB,\n\t14182: 0x000083CE,\n\t14183: 0x000083D6,\n\t14184: 0x000083F5,\n\t14185: 0x000083C9,\n\t14186: 0x00008409,\n\t14187: 0x0000840F,\n\t14188: 0x000083DE,\n\t14189: 0x00008411,\n\t14190: 0x00008406,\n\t14191: 0x000083C2,\n\t14192: 0x000083F3,\n\t14193: 0x000083D5,\n\t14194: 0x000083FA,\n\t14195: 0x000083C7,\n\t14196: 0x000083D1,\n\t14197: 0x000083EA,\n\t14198: 0x00008413,\n\t14199: 0x000083C3,\n\t14200: 0x000083EC,\n\t14201: 0x000083EE,\n\t14202: 0x000083C4,\n\t14203: 0x000083FB,\n\t14204: 0x000083D7,\n\t14205: 0x000083E2,\n\t14206: 0x0000841B,\n\t14207: 0x000083DB,\n\t14208: 0x000083FE,\n\t14209: 0x000086D8,\n\t14210: 0x000086E2,\n\t14211: 0x000086E6,\n\t14212: 0x000086D3,\n\t14213: 0x000086E3,\n\t14214: 0x000086DA,\n\t14215: 0x000086EA,\n\t14216: 0x000086DD,\n\t14217: 0x000086EB,\n\t14218: 0x000086DC,\n\t14219: 0x000086EC,\n\t14220: 0x000086E9,\n\t14221: 0x000086D7,\n\t14222: 0x000086E8,\n\t14223: 0x000086D1,\n\t14224: 0x00008848,\n\t14225: 0x00008856,\n\t14226: 0x00008855,\n\t14227: 0x000088BA,\n\t14228: 0x000088D7,\n\t14229: 0x000088B9,\n\t14230: 0x000088B8,\n\t14231: 0x000088C0,\n\t14232: 0x000088BE,\n\t14233: 0x000088B6,\n\t14234: 0x000088BC,\n\t14235: 0x000088B7,\n\t14236: 0x000088BD,\n\t14237: 0x000088B2,\n\t14238: 0x00008901,\n\t14239: 0x000088C9,\n\t14240: 0x00008995,\n\t14241: 0x00008998,\n\t14242: 0x00008997,\n\t14243: 0x000089DD,\n\t14244: 0x000089DA,\n\t14245: 0x000089DB,\n\t14246: 0x00008A4E,\n\t14247: 0x00008A4D,\n\t14248: 0x00008A39,\n\t14249: 0x00008A59,\n\t14250: 0x00008A40,\n\t14251: 0x00008A57,\n\t14252: 0x00008A58,\n\t14253: 0x00008A44,\n\t14254: 0x00008A45,\n\t14255: 0x00008A52,\n\t14256: 0x00008A48,\n\t14257: 0x00008A51,\n\t14258: 0x00008A4A,\n\t14259: 0x00008A4C,\n\t14260: 0x00008A4F,\n\t14261: 0x00008C5F,\n\t14262: 0x00008C81,\n\t14263: 0x00008C80,\n\t14264: 0x00008CBA,\n\t14265: 0x00008CBE,\n\t14266: 0x00008CB0,\n\t14267: 0x00008CB9,\n\t14268: 0x00008CB5,\n\t14269: 0x00008D84,\n\t14270: 0x00008D80,\n\t14271: 0x00008D89,\n\t14272: 0x00008DD8,\n\t14273: 0x00008DD3,\n\t14274: 0x00008DCD,\n\t14275: 0x00008DC7,\n\t14276: 0x00008DD6,\n\t14277: 0x00008DDC,\n\t14278: 0x00008DCF,\n\t14279: 0x00008DD5,\n\t14280: 0x00008DD9,\n\t14281: 0x00008DC8,\n\t14282: 0x00008DD7,\n\t14283: 0x00008DC5,\n\t14284: 0x00008EEF,\n\t14285: 0x00008EF7,\n\t14286: 0x00008EFA,\n\t14287: 0x00008EF9,\n\t14288: 0x00008EE6,\n\t14289: 0x00008EEE,\n\t14290: 0x00008EE5,\n\t14291: 0x00008EF5,\n\t14292: 0x00008EE7,\n\t14293: 0x00008EE8,\n\t14294: 0x00008EF6,\n\t14295: 0x00008EEB,\n\t14296: 0x00008EF1,\n\t14297: 0x00008EEC,\n\t14298: 0x00008EF4,\n\t14299: 0x00008EE9,\n\t14300: 0x0000902D,\n\t14301: 0x00009034,\n\t14302: 0x0000902F,\n\t14303: 0x00009106,\n\t14304: 0x0000912C,\n\t14305: 0x00009104,\n\t14306: 0x000090FF,\n\t14307: 0x000090FC,\n\t14308: 0x00009108,\n\t14309: 0x000090F9,\n\t14310: 0x000090FB,\n\t14311: 0x00009101,\n\t14312: 0x00009100,\n\t14313: 0x00009107,\n\t14314: 0x00009105,\n\t14315: 0x00009103,\n\t14316: 0x00009161,\n\t14317: 0x00009164,\n\t14318: 0x0000915F,\n\t14319: 0x00009162,\n\t14320: 0x00009160,\n\t14321: 0x00009201,\n\t14322: 0x0000920A,\n\t14323: 0x00009225,\n\t14324: 0x00009203,\n\t14325: 0x0000921A,\n\t14326: 0x00009226,\n\t14327: 0x0000920F,\n\t14328: 0x0000920C,\n\t14329: 0x00009200,\n\t14330: 0x00009212,\n\t14331: 0x000091FF,\n\t14332: 0x000091FD,\n\t14333: 0x00009206,\n\t14334: 0x00009204,\n\t14335: 0x00009227,\n\t14336: 0x00009202,\n\t14337: 0x0000921C,\n\t14338: 0x00009224,\n\t14339: 0x00009219,\n\t14340: 0x00009217,\n\t14341: 0x00009205,\n\t14342: 0x00009216,\n\t14343: 0x0000957B,\n\t14344: 0x0000958D,\n\t14345: 0x0000958C,\n\t14346: 0x00009590,\n\t14347: 0x00009687,\n\t14348: 0x0000967E,\n\t14349: 0x00009688,\n\t14350: 0x00009689,\n\t14351: 0x00009683,\n\t14352: 0x00009680,\n\t14353: 0x000096C2,\n\t14354: 0x000096C8,\n\t14355: 0x000096C3,\n\t14356: 0x000096F1,\n\t14357: 0x000096F0,\n\t14358: 0x0000976C,\n\t14359: 0x00009770,\n\t14360: 0x0000976E,\n\t14361: 0x00009807,\n\t14362: 0x000098A9,\n\t14363: 0x000098EB,\n\t14364: 0x00009CE6,\n\t14365: 0x00009EF9,\n\t14366: 0x00004E83,\n\t14367: 0x00004E84,\n\t14368: 0x00004EB6,\n\t14369: 0x000050BD,\n\t14370: 0x000050BF,\n\t14371: 0x000050C6,\n\t14372: 0x000050AE,\n\t14373: 0x000050C4,\n\t14374: 0x000050CA,\n\t14375: 0x000050B4,\n\t14376: 0x000050C8,\n\t14377: 0x000050C2,\n\t14378: 0x000050B0,\n\t14379: 0x000050C1,\n\t14380: 0x000050BA,\n\t14381: 0x000050B1,\n\t14382: 0x000050CB,\n\t14383: 0x000050C9,\n\t14384: 0x000050B6,\n\t14385: 0x000050B8,\n\t14386: 0x000051D7,\n\t14387: 0x0000527A,\n\t14388: 0x00005278,\n\t14389: 0x0000527B,\n\t14390: 0x0000527C,\n\t14391: 0x000055C3,\n\t14392: 0x000055DB,\n\t14393: 0x000055CC,\n\t14394: 0x000055D0,\n\t14395: 0x000055CB,\n\t14396: 0x000055CA,\n\t14397: 0x000055DD,\n\t14398: 0x000055C0,\n\t14399: 0x000055D4,\n\t14400: 0x000055C4,\n\t14401: 0x000055E9,\n\t14402: 0x000055BF,\n\t14403: 0x000055D2,\n\t14404: 0x0000558D,\n\t14405: 0x000055CF,\n\t14406: 0x000055D5,\n\t14407: 0x000055E2,\n\t14408: 0x000055D6,\n\t14409: 0x000055C8,\n\t14410: 0x000055F2,\n\t14411: 0x000055CD,\n\t14412: 0x000055D9,\n\t14413: 0x000055C2,\n\t14414: 0x00005714,\n\t14415: 0x00005853,\n\t14416: 0x00005868,\n\t14417: 0x00005864,\n\t14418: 0x0000584F,\n\t14419: 0x0000584D,\n\t14420: 0x00005849,\n\t14421: 0x0000586F,\n\t14422: 0x00005855,\n\t14423: 0x0000584E,\n\t14424: 0x0000585D,\n\t14425: 0x00005859,\n\t14426: 0x00005865,\n\t14427: 0x0000585B,\n\t14428: 0x0000583D,\n\t14429: 0x00005863,\n\t14430: 0x00005871,\n\t14431: 0x000058FC,\n\t14432: 0x00005AC7,\n\t14433: 0x00005AC4,\n\t14434: 0x00005ACB,\n\t14435: 0x00005ABA,\n\t14436: 0x00005AB8,\n\t14437: 0x00005AB1,\n\t14438: 0x00005AB5,\n\t14439: 0x00005AB0,\n\t14440: 0x00005ABF,\n\t14441: 0x00005AC8,\n\t14442: 0x00005ABB,\n\t14443: 0x00005AC6,\n\t14444: 0x00005AB7,\n\t14445: 0x00005AC0,\n\t14446: 0x00005ACA,\n\t14447: 0x00005AB4,\n\t14448: 0x00005AB6,\n\t14449: 0x00005ACD,\n\t14450: 0x00005AB9,\n\t14451: 0x00005A90,\n\t14452: 0x00005BD6,\n\t14453: 0x00005BD8,\n\t14454: 0x00005BD9,\n\t14455: 0x00005C1F,\n\t14456: 0x00005C33,\n\t14457: 0x00005D71,\n\t14458: 0x00005D63,\n\t14459: 0x00005D4A,\n\t14460: 0x00005D65,\n\t14461: 0x00005D72,\n\t14462: 0x00005D6C,\n\t14463: 0x00005D5E,\n\t14464: 0x00005D68,\n\t14465: 0x00005D67,\n\t14466: 0x00005D62,\n\t14467: 0x00005DF0,\n\t14468: 0x00005E4F,\n\t14469: 0x00005E4E,\n\t14470: 0x00005E4A,\n\t14471: 0x00005E4D,\n\t14472: 0x00005E4B,\n\t14473: 0x00005EC5,\n\t14474: 0x00005ECC,\n\t14475: 0x00005EC6,\n\t14476: 0x00005ECB,\n\t14477: 0x00005EC7,\n\t14478: 0x00005F40,\n\t14479: 0x00005FAF,\n\t14480: 0x00005FAD,\n\t14481: 0x000060F7,\n\t14482: 0x00006149,\n\t14483: 0x0000614A,\n\t14484: 0x0000612B,\n\t14485: 0x00006145,\n\t14486: 0x00006136,\n\t14487: 0x00006132,\n\t14488: 0x0000612E,\n\t14489: 0x00006146,\n\t14490: 0x0000612F,\n\t14491: 0x0000614F,\n\t14492: 0x00006129,\n\t14493: 0x00006140,\n\t14494: 0x00006220,\n\t14495: 0x00009168,\n\t14496: 0x00006223,\n\t14497: 0x00006225,\n\t14498: 0x00006224,\n\t14499: 0x000063C5,\n\t14500: 0x000063F1,\n\t14501: 0x000063EB,\n\t14502: 0x00006410,\n\t14503: 0x00006412,\n\t14504: 0x00006409,\n\t14505: 0x00006420,\n\t14506: 0x00006424,\n\t14507: 0x00006433,\n\t14508: 0x00006443,\n\t14509: 0x0000641F,\n\t14510: 0x00006415,\n\t14511: 0x00006418,\n\t14512: 0x00006439,\n\t14513: 0x00006437,\n\t14514: 0x00006422,\n\t14515: 0x00006423,\n\t14516: 0x0000640C,\n\t14517: 0x00006426,\n\t14518: 0x00006430,\n\t14519: 0x00006428,\n\t14520: 0x00006441,\n\t14521: 0x00006435,\n\t14522: 0x0000642F,\n\t14523: 0x0000640A,\n\t14524: 0x0000641A,\n\t14525: 0x00006440,\n\t14526: 0x00006425,\n\t14527: 0x00006427,\n\t14528: 0x0000640B,\n\t14529: 0x000063E7,\n\t14530: 0x0000641B,\n\t14531: 0x0000642E,\n\t14532: 0x00006421,\n\t14533: 0x0000640E,\n\t14534: 0x0000656F,\n\t14535: 0x00006592,\n\t14536: 0x000065D3,\n\t14537: 0x00006686,\n\t14538: 0x0000668C,\n\t14539: 0x00006695,\n\t14540: 0x00006690,\n\t14541: 0x0000668B,\n\t14542: 0x0000668A,\n\t14543: 0x00006699,\n\t14544: 0x00006694,\n\t14545: 0x00006678,\n\t14546: 0x00006720,\n\t14547: 0x00006966,\n\t14548: 0x0000695F,\n\t14549: 0x00006938,\n\t14550: 0x0000694E,\n\t14551: 0x00006962,\n\t14552: 0x00006971,\n\t14553: 0x0000693F,\n\t14554: 0x00006945,\n\t14555: 0x0000696A,\n\t14556: 0x00006939,\n\t14557: 0x00006942,\n\t14558: 0x00006957,\n\t14559: 0x00006959,\n\t14560: 0x0000697A,\n\t14561: 0x00006948,\n\t14562: 0x00006949,\n\t14563: 0x00006935,\n\t14564: 0x0000696C,\n\t14565: 0x00006933,\n\t14566: 0x0000693D,\n\t14567: 0x00006965,\n\t14568: 0x000068F0,\n\t14569: 0x00006978,\n\t14570: 0x00006934,\n\t14571: 0x00006969,\n\t14572: 0x00006940,\n\t14573: 0x0000696F,\n\t14574: 0x00006944,\n\t14575: 0x00006976,\n\t14576: 0x00006958,\n\t14577: 0x00006941,\n\t14578: 0x00006974,\n\t14579: 0x0000694C,\n\t14580: 0x0000693B,\n\t14581: 0x0000694B,\n\t14582: 0x00006937,\n\t14583: 0x0000695C,\n\t14584: 0x0000694F,\n\t14585: 0x00006951,\n\t14586: 0x00006932,\n\t14587: 0x00006952,\n\t14588: 0x0000692F,\n\t14589: 0x0000697B,\n\t14590: 0x0000693C,\n\t14591: 0x00006B46,\n\t14592: 0x00006B45,\n\t14593: 0x00006B43,\n\t14594: 0x00006B42,\n\t14595: 0x00006B48,\n\t14596: 0x00006B41,\n\t14597: 0x00006B9B,\n\t14598: 0x0000FA0D,\n\t14599: 0x00006BFB,\n\t14600: 0x00006BFC,\n\t14601: 0x00006BF9,\n\t14602: 0x00006BF7,\n\t14603: 0x00006BF8,\n\t14604: 0x00006E9B,\n\t14605: 0x00006ED6,\n\t14606: 0x00006EC8,\n\t14607: 0x00006E8F,\n\t14608: 0x00006EC0,\n\t14609: 0x00006E9F,\n\t14610: 0x00006E93,\n\t14611: 0x00006E94,\n\t14612: 0x00006EA0,\n\t14613: 0x00006EB1,\n\t14614: 0x00006EB9,\n\t14615: 0x00006EC6,\n\t14616: 0x00006ED2,\n\t14617: 0x00006EBD,\n\t14618: 0x00006EC1,\n\t14619: 0x00006E9E,\n\t14620: 0x00006EC9,\n\t14621: 0x00006EB7,\n\t14622: 0x00006EB0,\n\t14623: 0x00006ECD,\n\t14624: 0x00006EA6,\n\t14625: 0x00006ECF,\n\t14626: 0x00006EB2,\n\t14627: 0x00006EBE,\n\t14628: 0x00006EC3,\n\t14629: 0x00006EDC,\n\t14630: 0x00006ED8,\n\t14631: 0x00006E99,\n\t14632: 0x00006E92,\n\t14633: 0x00006E8E,\n\t14634: 0x00006E8D,\n\t14635: 0x00006EA4,\n\t14636: 0x00006EA1,\n\t14637: 0x00006EBF,\n\t14638: 0x00006EB3,\n\t14639: 0x00006ED0,\n\t14640: 0x00006ECA,\n\t14641: 0x00006E97,\n\t14642: 0x00006EAE,\n\t14643: 0x00006EA3,\n\t14644: 0x00007147,\n\t14645: 0x00007154,\n\t14646: 0x00007152,\n\t14647: 0x00007163,\n\t14648: 0x00007160,\n\t14649: 0x00007141,\n\t14650: 0x0000715D,\n\t14651: 0x00007162,\n\t14652: 0x00007172,\n\t14653: 0x00007178,\n\t14654: 0x0000716A,\n\t14655: 0x00007161,\n\t14656: 0x00007142,\n\t14657: 0x00007158,\n\t14658: 0x00007143,\n\t14659: 0x0000714B,\n\t14660: 0x00007170,\n\t14661: 0x0000715F,\n\t14662: 0x00007150,\n\t14663: 0x00007153,\n\t14664: 0x00007144,\n\t14665: 0x0000714D,\n\t14666: 0x0000715A,\n\t14667: 0x0000724F,\n\t14668: 0x0000728D,\n\t14669: 0x0000728C,\n\t14670: 0x00007291,\n\t14671: 0x00007290,\n\t14672: 0x0000728E,\n\t14673: 0x0000733C,\n\t14674: 0x00007342,\n\t14675: 0x0000733B,\n\t14676: 0x0000733A,\n\t14677: 0x00007340,\n\t14678: 0x0000734A,\n\t14679: 0x00007349,\n\t14680: 0x00007444,\n\t14681: 0x0000744A,\n\t14682: 0x0000744B,\n\t14683: 0x00007452,\n\t14684: 0x00007451,\n\t14685: 0x00007457,\n\t14686: 0x00007440,\n\t14687: 0x0000744F,\n\t14688: 0x00007450,\n\t14689: 0x0000744E,\n\t14690: 0x00007442,\n\t14691: 0x00007446,\n\t14692: 0x0000744D,\n\t14693: 0x00007454,\n\t14694: 0x000074E1,\n\t14695: 0x000074FF,\n\t14696: 0x000074FE,\n\t14697: 0x000074FD,\n\t14698: 0x0000751D,\n\t14699: 0x00007579,\n\t14700: 0x00007577,\n\t14701: 0x00006983,\n\t14702: 0x000075EF,\n\t14703: 0x0000760F,\n\t14704: 0x00007603,\n\t14705: 0x000075F7,\n\t14706: 0x000075FE,\n\t14707: 0x000075FC,\n\t14708: 0x000075F9,\n\t14709: 0x000075F8,\n\t14710: 0x00007610,\n\t14711: 0x000075FB,\n\t14712: 0x000075F6,\n\t14713: 0x000075ED,\n\t14714: 0x000075F5,\n\t14715: 0x000075FD,\n\t14716: 0x00007699,\n\t14717: 0x000076B5,\n\t14718: 0x000076DD,\n\t14719: 0x00007755,\n\t14720: 0x0000775F,\n\t14721: 0x00007760,\n\t14722: 0x00007752,\n\t14723: 0x00007756,\n\t14724: 0x0000775A,\n\t14725: 0x00007769,\n\t14726: 0x00007767,\n\t14727: 0x00007754,\n\t14728: 0x00007759,\n\t14729: 0x0000776D,\n\t14730: 0x000077E0,\n\t14731: 0x00007887,\n\t14732: 0x0000789A,\n\t14733: 0x00007894,\n\t14734: 0x0000788F,\n\t14735: 0x00007884,\n\t14736: 0x00007895,\n\t14737: 0x00007885,\n\t14738: 0x00007886,\n\t14739: 0x000078A1,\n\t14740: 0x00007883,\n\t14741: 0x00007879,\n\t14742: 0x00007899,\n\t14743: 0x00007880,\n\t14744: 0x00007896,\n\t14745: 0x0000787B,\n\t14746: 0x0000797C,\n\t14747: 0x00007982,\n\t14748: 0x0000797D,\n\t14749: 0x00007979,\n\t14750: 0x00007A11,\n\t14751: 0x00007A18,\n\t14752: 0x00007A19,\n\t14753: 0x00007A12,\n\t14754: 0x00007A17,\n\t14755: 0x00007A15,\n\t14756: 0x00007A22,\n\t14757: 0x00007A13,\n\t14758: 0x00007A1B,\n\t14759: 0x00007A10,\n\t14760: 0x00007AA3,\n\t14761: 0x00007AA2,\n\t14762: 0x00007A9E,\n\t14763: 0x00007AEB,\n\t14764: 0x00007B66,\n\t14765: 0x00007B64,\n\t14766: 0x00007B6D,\n\t14767: 0x00007B74,\n\t14768: 0x00007B69,\n\t14769: 0x00007B72,\n\t14770: 0x00007B65,\n\t14771: 0x00007B73,\n\t14772: 0x00007B71,\n\t14773: 0x00007B70,\n\t14774: 0x00007B61,\n\t14775: 0x00007B78,\n\t14776: 0x00007B76,\n\t14777: 0x00007B63,\n\t14778: 0x00007CB2,\n\t14779: 0x00007CB4,\n\t14780: 0x00007CAF,\n\t14781: 0x00007D88,\n\t14782: 0x00007D86,\n\t14783: 0x00007D80,\n\t14784: 0x00007D8D,\n\t14785: 0x00007D7F,\n\t14786: 0x00007D85,\n\t14787: 0x00007D7A,\n\t14788: 0x00007D8E,\n\t14789: 0x00007D7B,\n\t14790: 0x00007D83,\n\t14791: 0x00007D7C,\n\t14792: 0x00007D8C,\n\t14793: 0x00007D94,\n\t14794: 0x00007D84,\n\t14795: 0x00007D7D,\n\t14796: 0x00007D92,\n\t14797: 0x00007F6D,\n\t14798: 0x00007F6B,\n\t14799: 0x00007F67,\n\t14800: 0x00007F68,\n\t14801: 0x00007F6C,\n\t14802: 0x00007FA6,\n\t14803: 0x00007FA5,\n\t14804: 0x00007FA7,\n\t14805: 0x00007FDB,\n\t14806: 0x00007FDC,\n\t14807: 0x00008021,\n\t14808: 0x00008164,\n\t14809: 0x00008160,\n\t14810: 0x00008177,\n\t14811: 0x0000815C,\n\t14812: 0x00008169,\n\t14813: 0x0000815B,\n\t14814: 0x00008162,\n\t14815: 0x00008172,\n\t14816: 0x00006721,\n\t14817: 0x0000815E,\n\t14818: 0x00008176,\n\t14819: 0x00008167,\n\t14820: 0x0000816F,\n\t14821: 0x00008144,\n\t14822: 0x00008161,\n\t14823: 0x0000821D,\n\t14824: 0x00008249,\n\t14825: 0x00008244,\n\t14826: 0x00008240,\n\t14827: 0x00008242,\n\t14828: 0x00008245,\n\t14829: 0x000084F1,\n\t14830: 0x0000843F,\n\t14831: 0x00008456,\n\t14832: 0x00008476,\n\t14833: 0x00008479,\n\t14834: 0x0000848F,\n\t14835: 0x0000848D,\n\t14836: 0x00008465,\n\t14837: 0x00008451,\n\t14838: 0x00008440,\n\t14839: 0x00008486,\n\t14840: 0x00008467,\n\t14841: 0x00008430,\n\t14842: 0x0000844D,\n\t14843: 0x0000847D,\n\t14844: 0x0000845A,\n\t14845: 0x00008459,\n\t14846: 0x00008474,\n\t14847: 0x00008473,\n\t14848: 0x0000845D,\n\t14849: 0x00008507,\n\t14850: 0x0000845E,\n\t14851: 0x00008437,\n\t14852: 0x0000843A,\n\t14853: 0x00008434,\n\t14854: 0x0000847A,\n\t14855: 0x00008443,\n\t14856: 0x00008478,\n\t14857: 0x00008432,\n\t14858: 0x00008445,\n\t14859: 0x00008429,\n\t14860: 0x000083D9,\n\t14861: 0x0000844B,\n\t14862: 0x0000842F,\n\t14863: 0x00008442,\n\t14864: 0x0000842D,\n\t14865: 0x0000845F,\n\t14866: 0x00008470,\n\t14867: 0x00008439,\n\t14868: 0x0000844E,\n\t14869: 0x0000844C,\n\t14870: 0x00008452,\n\t14871: 0x0000846F,\n\t14872: 0x000084C5,\n\t14873: 0x0000848E,\n\t14874: 0x0000843B,\n\t14875: 0x00008447,\n\t14876: 0x00008436,\n\t14877: 0x00008433,\n\t14878: 0x00008468,\n\t14879: 0x0000847E,\n\t14880: 0x00008444,\n\t14881: 0x0000842B,\n\t14882: 0x00008460,\n\t14883: 0x00008454,\n\t14884: 0x0000846E,\n\t14885: 0x00008450,\n\t14886: 0x0000870B,\n\t14887: 0x00008704,\n\t14888: 0x000086F7,\n\t14889: 0x0000870C,\n\t14890: 0x000086FA,\n\t14891: 0x000086D6,\n\t14892: 0x000086F5,\n\t14893: 0x0000874D,\n\t14894: 0x000086F8,\n\t14895: 0x0000870E,\n\t14896: 0x00008709,\n\t14897: 0x00008701,\n\t14898: 0x000086F6,\n\t14899: 0x0000870D,\n\t14900: 0x00008705,\n\t14901: 0x000088D6,\n\t14902: 0x000088CB,\n\t14903: 0x000088CD,\n\t14904: 0x000088CE,\n\t14905: 0x000088DE,\n\t14906: 0x000088DB,\n\t14907: 0x000088DA,\n\t14908: 0x000088CC,\n\t14909: 0x000088D0,\n\t14910: 0x00008985,\n\t14911: 0x0000899B,\n\t14912: 0x000089DF,\n\t14913: 0x000089E5,\n\t14914: 0x000089E4,\n\t14915: 0x000089E1,\n\t14916: 0x000089E0,\n\t14917: 0x000089E2,\n\t14918: 0x000089DC,\n\t14919: 0x000089E6,\n\t14920: 0x00008A76,\n\t14921: 0x00008A86,\n\t14922: 0x00008A7F,\n\t14923: 0x00008A61,\n\t14924: 0x00008A3F,\n\t14925: 0x00008A77,\n\t14926: 0x00008A82,\n\t14927: 0x00008A84,\n\t14928: 0x00008A75,\n\t14929: 0x00008A83,\n\t14930: 0x00008A81,\n\t14931: 0x00008A74,\n\t14932: 0x00008A7A,\n\t14933: 0x00008C3C,\n\t14934: 0x00008C4B,\n\t14935: 0x00008C4A,\n\t14936: 0x00008C65,\n\t14937: 0x00008C64,\n\t14938: 0x00008C66,\n\t14939: 0x00008C86,\n\t14940: 0x00008C84,\n\t14941: 0x00008C85,\n\t14942: 0x00008CCC,\n\t14943: 0x00008D68,\n\t14944: 0x00008D69,\n\t14945: 0x00008D91,\n\t14946: 0x00008D8C,\n\t14947: 0x00008D8E,\n\t14948: 0x00008D8F,\n\t14949: 0x00008D8D,\n\t14950: 0x00008D93,\n\t14951: 0x00008D94,\n\t14952: 0x00008D90,\n\t14953: 0x00008D92,\n\t14954: 0x00008DF0,\n\t14955: 0x00008DE0,\n\t14956: 0x00008DEC,\n\t14957: 0x00008DF1,\n\t14958: 0x00008DEE,\n\t14959: 0x00008DD0,\n\t14960: 0x00008DE9,\n\t14961: 0x00008DE3,\n\t14962: 0x00008DE2,\n\t14963: 0x00008DE7,\n\t14964: 0x00008DF2,\n\t14965: 0x00008DEB,\n\t14966: 0x00008DF4,\n\t14967: 0x00008F06,\n\t14968: 0x00008EFF,\n\t14969: 0x00008F01,\n\t14970: 0x00008F00,\n\t14971: 0x00008F05,\n\t14972: 0x00008F07,\n\t14973: 0x00008F08,\n\t14974: 0x00008F02,\n\t14975: 0x00008F0B,\n\t14976: 0x00009052,\n\t14977: 0x0000903F,\n\t14978: 0x00009044,\n\t14979: 0x00009049,\n\t14980: 0x0000903D,\n\t14981: 0x00009110,\n\t14982: 0x0000910D,\n\t14983: 0x0000910F,\n\t14984: 0x00009111,\n\t14985: 0x00009116,\n\t14986: 0x00009114,\n\t14987: 0x0000910B,\n\t14988: 0x0000910E,\n\t14989: 0x0000916E,\n\t14990: 0x0000916F,\n\t14991: 0x00009248,\n\t14992: 0x00009252,\n\t14993: 0x00009230,\n\t14994: 0x0000923A,\n\t14995: 0x00009266,\n\t14996: 0x00009233,\n\t14997: 0x00009265,\n\t14998: 0x0000925E,\n\t14999: 0x00009283,\n\t15000: 0x0000922E,\n\t15001: 0x0000924A,\n\t15002: 0x00009246,\n\t15003: 0x0000926D,\n\t15004: 0x0000926C,\n\t15005: 0x0000924F,\n\t15006: 0x00009260,\n\t15007: 0x00009267,\n\t15008: 0x0000926F,\n\t15009: 0x00009236,\n\t15010: 0x00009261,\n\t15011: 0x00009270,\n\t15012: 0x00009231,\n\t15013: 0x00009254,\n\t15014: 0x00009263,\n\t15015: 0x00009250,\n\t15016: 0x00009272,\n\t15017: 0x0000924E,\n\t15018: 0x00009253,\n\t15019: 0x0000924C,\n\t15020: 0x00009256,\n\t15021: 0x00009232,\n\t15022: 0x0000959F,\n\t15023: 0x0000959C,\n\t15024: 0x0000959E,\n\t15025: 0x0000959B,\n\t15026: 0x00009692,\n\t15027: 0x00009693,\n\t15028: 0x00009691,\n\t15029: 0x00009697,\n\t15030: 0x000096CE,\n\t15031: 0x000096FA,\n\t15032: 0x000096FD,\n\t15033: 0x000096F8,\n\t15034: 0x000096F5,\n\t15035: 0x00009773,\n\t15036: 0x00009777,\n\t15037: 0x00009778,\n\t15038: 0x00009772,\n\t15039: 0x0000980F,\n\t15040: 0x0000980D,\n\t15041: 0x0000980E,\n\t15042: 0x000098AC,\n\t15043: 0x000098F6,\n\t15044: 0x000098F9,\n\t15045: 0x000099AF,\n\t15046: 0x000099B2,\n\t15047: 0x000099B0,\n\t15048: 0x000099B5,\n\t15049: 0x00009AAD,\n\t15050: 0x00009AAB,\n\t15051: 0x00009B5B,\n\t15052: 0x00009CEA,\n\t15053: 0x00009CED,\n\t15054: 0x00009CE7,\n\t15055: 0x00009E80,\n\t15056: 0x00009EFD,\n\t15057: 0x000050E6,\n\t15058: 0x000050D4,\n\t15059: 0x000050D7,\n\t15060: 0x000050E8,\n\t15061: 0x000050F3,\n\t15062: 0x000050DB,\n\t15063: 0x000050EA,\n\t15064: 0x000050DD,\n\t15065: 0x000050E4,\n\t15066: 0x000050D3,\n\t15067: 0x000050EC,\n\t15068: 0x000050F0,\n\t15069: 0x000050EF,\n\t15070: 0x000050E3,\n\t15071: 0x000050E0,\n\t15072: 0x000051D8,\n\t15073: 0x00005280,\n\t15074: 0x00005281,\n\t15075: 0x000052E9,\n\t15076: 0x000052EB,\n\t15077: 0x00005330,\n\t15078: 0x000053AC,\n\t15079: 0x00005627,\n\t15080: 0x00005615,\n\t15081: 0x0000560C,\n\t15082: 0x00005612,\n\t15083: 0x000055FC,\n\t15084: 0x0000560F,\n\t15085: 0x0000561C,\n\t15086: 0x00005601,\n\t15087: 0x00005613,\n\t15088: 0x00005602,\n\t15089: 0x000055FA,\n\t15090: 0x0000561D,\n\t15091: 0x00005604,\n\t15092: 0x000055FF,\n\t15093: 0x000055F9,\n\t15094: 0x00005889,\n\t15095: 0x0000587C,\n\t15096: 0x00005890,\n\t15097: 0x00005898,\n\t15098: 0x00005886,\n\t15099: 0x00005881,\n\t15100: 0x0000587F,\n\t15101: 0x00005874,\n\t15102: 0x0000588B,\n\t15103: 0x0000587A,\n\t15104: 0x00005887,\n\t15105: 0x00005891,\n\t15106: 0x0000588E,\n\t15107: 0x00005876,\n\t15108: 0x00005882,\n\t15109: 0x00005888,\n\t15110: 0x0000587B,\n\t15111: 0x00005894,\n\t15112: 0x0000588F,\n\t15113: 0x000058FE,\n\t15114: 0x0000596B,\n\t15115: 0x00005ADC,\n\t15116: 0x00005AEE,\n\t15117: 0x00005AE5,\n\t15118: 0x00005AD5,\n\t15119: 0x00005AEA,\n\t15120: 0x00005ADA,\n\t15121: 0x00005AED,\n\t15122: 0x00005AEB,\n\t15123: 0x00005AF3,\n\t15124: 0x00005AE2,\n\t15125: 0x00005AE0,\n\t15126: 0x00005ADB,\n\t15127: 0x00005AEC,\n\t15128: 0x00005ADE,\n\t15129: 0x00005ADD,\n\t15130: 0x00005AD9,\n\t15131: 0x00005AE8,\n\t15132: 0x00005ADF,\n\t15133: 0x00005B77,\n\t15134: 0x00005BE0,\n\t15135: 0x00005BE3,\n\t15136: 0x00005C63,\n\t15137: 0x00005D82,\n\t15138: 0x00005D80,\n\t15139: 0x00005D7D,\n\t15140: 0x00005D86,\n\t15141: 0x00005D7A,\n\t15142: 0x00005D81,\n\t15143: 0x00005D77,\n\t15144: 0x00005D8A,\n\t15145: 0x00005D89,\n\t15146: 0x00005D88,\n\t15147: 0x00005D7E,\n\t15148: 0x00005D7C,\n\t15149: 0x00005D8D,\n\t15150: 0x00005D79,\n\t15151: 0x00005D7F,\n\t15152: 0x00005E58,\n\t15153: 0x00005E59,\n\t15154: 0x00005E53,\n\t15155: 0x00005ED8,\n\t15156: 0x00005ED1,\n\t15157: 0x00005ED7,\n\t15158: 0x00005ECE,\n\t15159: 0x00005EDC,\n\t15160: 0x00005ED5,\n\t15161: 0x00005ED9,\n\t15162: 0x00005ED2,\n\t15163: 0x00005ED4,\n\t15164: 0x00005F44,\n\t15165: 0x00005F43,\n\t15166: 0x00005F6F,\n\t15167: 0x00005FB6,\n\t15168: 0x0000612C,\n\t15169: 0x00006128,\n\t15170: 0x00006141,\n\t15171: 0x0000615E,\n\t15172: 0x00006171,\n\t15173: 0x00006173,\n\t15174: 0x00006152,\n\t15175: 0x00006153,\n\t15176: 0x00006172,\n\t15177: 0x0000616C,\n\t15178: 0x00006180,\n\t15179: 0x00006174,\n\t15180: 0x00006154,\n\t15181: 0x0000617A,\n\t15182: 0x0000615B,\n\t15183: 0x00006165,\n\t15184: 0x0000613B,\n\t15185: 0x0000616A,\n\t15186: 0x00006161,\n\t15187: 0x00006156,\n\t15188: 0x00006229,\n\t15189: 0x00006227,\n\t15190: 0x0000622B,\n\t15191: 0x0000642B,\n\t15192: 0x0000644D,\n\t15193: 0x0000645B,\n\t15194: 0x0000645D,\n\t15195: 0x00006474,\n\t15196: 0x00006476,\n\t15197: 0x00006472,\n\t15198: 0x00006473,\n\t15199: 0x0000647D,\n\t15200: 0x00006475,\n\t15201: 0x00006466,\n\t15202: 0x000064A6,\n\t15203: 0x0000644E,\n\t15204: 0x00006482,\n\t15205: 0x0000645E,\n\t15206: 0x0000645C,\n\t15207: 0x0000644B,\n\t15208: 0x00006453,\n\t15209: 0x00006460,\n\t15210: 0x00006450,\n\t15211: 0x0000647F,\n\t15212: 0x0000643F,\n\t15213: 0x0000646C,\n\t15214: 0x0000646B,\n\t15215: 0x00006459,\n\t15216: 0x00006465,\n\t15217: 0x00006477,\n\t15218: 0x00006573,\n\t15219: 0x000065A0,\n\t15220: 0x000066A1,\n\t15221: 0x000066A0,\n\t15222: 0x0000669F,\n\t15223: 0x00006705,\n\t15224: 0x00006704,\n\t15225: 0x00006722,\n\t15226: 0x000069B1,\n\t15227: 0x000069B6,\n\t15228: 0x000069C9,\n\t15229: 0x000069A0,\n\t15230: 0x000069CE,\n\t15231: 0x00006996,\n\t15232: 0x000069B0,\n\t15233: 0x000069AC,\n\t15234: 0x000069BC,\n\t15235: 0x00006991,\n\t15236: 0x00006999,\n\t15237: 0x0000698E,\n\t15238: 0x000069A7,\n\t15239: 0x0000698D,\n\t15240: 0x000069A9,\n\t15241: 0x000069BE,\n\t15242: 0x000069AF,\n\t15243: 0x000069BF,\n\t15244: 0x000069C4,\n\t15245: 0x000069BD,\n\t15246: 0x000069A4,\n\t15247: 0x000069D4,\n\t15248: 0x000069B9,\n\t15249: 0x000069CA,\n\t15250: 0x0000699A,\n\t15251: 0x000069CF,\n\t15252: 0x000069B3,\n\t15253: 0x00006993,\n\t15254: 0x000069AA,\n\t15255: 0x000069A1,\n\t15256: 0x0000699E,\n\t15257: 0x000069D9,\n\t15258: 0x00006997,\n\t15259: 0x00006990,\n\t15260: 0x000069C2,\n\t15261: 0x000069B5,\n\t15262: 0x000069A5,\n\t15263: 0x000069C6,\n\t15264: 0x00006B4A,\n\t15265: 0x00006B4D,\n\t15266: 0x00006B4B,\n\t15267: 0x00006B9E,\n\t15268: 0x00006B9F,\n\t15269: 0x00006BA0,\n\t15270: 0x00006BC3,\n\t15271: 0x00006BC4,\n\t15272: 0x00006BFE,\n\t15273: 0x00006ECE,\n\t15274: 0x00006EF5,\n\t15275: 0x00006EF1,\n\t15276: 0x00006F03,\n\t15277: 0x00006F25,\n\t15278: 0x00006EF8,\n\t15279: 0x00006F37,\n\t15280: 0x00006EFB,\n\t15281: 0x00006F2E,\n\t15282: 0x00006F09,\n\t15283: 0x00006F4E,\n\t15284: 0x00006F19,\n\t15285: 0x00006F1A,\n\t15286: 0x00006F27,\n\t15287: 0x00006F18,\n\t15288: 0x00006F3B,\n\t15289: 0x00006F12,\n\t15290: 0x00006EED,\n\t15291: 0x00006F0A,\n\t15292: 0x00006F36,\n\t15293: 0x00006F73,\n\t15294: 0x00006EF9,\n\t15295: 0x00006EEE,\n\t15296: 0x00006F2D,\n\t15297: 0x00006F40,\n\t15298: 0x00006F30,\n\t15299: 0x00006F3C,\n\t15300: 0x00006F35,\n\t15301: 0x00006EEB,\n\t15302: 0x00006F07,\n\t15303: 0x00006F0E,\n\t15304: 0x00006F43,\n\t15305: 0x00006F05,\n\t15306: 0x00006EFD,\n\t15307: 0x00006EF6,\n\t15308: 0x00006F39,\n\t15309: 0x00006F1C,\n\t15310: 0x00006EFC,\n\t15311: 0x00006F3A,\n\t15312: 0x00006F1F,\n\t15313: 0x00006F0D,\n\t15314: 0x00006F1E,\n\t15315: 0x00006F08,\n\t15316: 0x00006F21,\n\t15317: 0x00007187,\n\t15318: 0x00007190,\n\t15319: 0x00007189,\n\t15320: 0x00007180,\n\t15321: 0x00007185,\n\t15322: 0x00007182,\n\t15323: 0x0000718F,\n\t15324: 0x0000717B,\n\t15325: 0x00007186,\n\t15326: 0x00007181,\n\t15327: 0x00007197,\n\t15328: 0x00007244,\n\t15329: 0x00007253,\n\t15330: 0x00007297,\n\t15331: 0x00007295,\n\t15332: 0x00007293,\n\t15333: 0x00007343,\n\t15334: 0x0000734D,\n\t15335: 0x00007351,\n\t15336: 0x0000734C,\n\t15337: 0x00007462,\n\t15338: 0x00007473,\n\t15339: 0x00007471,\n\t15340: 0x00007475,\n\t15341: 0x00007472,\n\t15342: 0x00007467,\n\t15343: 0x0000746E,\n\t15344: 0x00007500,\n\t15345: 0x00007502,\n\t15346: 0x00007503,\n\t15347: 0x0000757D,\n\t15348: 0x00007590,\n\t15349: 0x00007616,\n\t15350: 0x00007608,\n\t15351: 0x0000760C,\n\t15352: 0x00007615,\n\t15353: 0x00007611,\n\t15354: 0x0000760A,\n\t15355: 0x00007614,\n\t15356: 0x000076B8,\n\t15357: 0x00007781,\n\t15358: 0x0000777C,\n\t15359: 0x00007785,\n\t15360: 0x00007782,\n\t15361: 0x0000776E,\n\t15362: 0x00007780,\n\t15363: 0x0000776F,\n\t15364: 0x0000777E,\n\t15365: 0x00007783,\n\t15366: 0x000078B2,\n\t15367: 0x000078AA,\n\t15368: 0x000078B4,\n\t15369: 0x000078AD,\n\t15370: 0x000078A8,\n\t15371: 0x0000787E,\n\t15372: 0x000078AB,\n\t15373: 0x0000789E,\n\t15374: 0x000078A5,\n\t15375: 0x000078A0,\n\t15376: 0x000078AC,\n\t15377: 0x000078A2,\n\t15378: 0x000078A4,\n\t15379: 0x00007998,\n\t15380: 0x0000798A,\n\t15381: 0x0000798B,\n\t15382: 0x00007996,\n\t15383: 0x00007995,\n\t15384: 0x00007994,\n\t15385: 0x00007993,\n\t15386: 0x00007997,\n\t15387: 0x00007988,\n\t15388: 0x00007992,\n\t15389: 0x00007990,\n\t15390: 0x00007A2B,\n\t15391: 0x00007A4A,\n\t15392: 0x00007A30,\n\t15393: 0x00007A2F,\n\t15394: 0x00007A28,\n\t15395: 0x00007A26,\n\t15396: 0x00007AA8,\n\t15397: 0x00007AAB,\n\t15398: 0x00007AAC,\n\t15399: 0x00007AEE,\n\t15400: 0x00007B88,\n\t15401: 0x00007B9C,\n\t15402: 0x00007B8A,\n\t15403: 0x00007B91,\n\t15404: 0x00007B90,\n\t15405: 0x00007B96,\n\t15406: 0x00007B8D,\n\t15407: 0x00007B8C,\n\t15408: 0x00007B9B,\n\t15409: 0x00007B8E,\n\t15410: 0x00007B85,\n\t15411: 0x00007B98,\n\t15412: 0x00005284,\n\t15413: 0x00007B99,\n\t15414: 0x00007BA4,\n\t15415: 0x00007B82,\n\t15416: 0x00007CBB,\n\t15417: 0x00007CBF,\n\t15418: 0x00007CBC,\n\t15419: 0x00007CBA,\n\t15420: 0x00007DA7,\n\t15421: 0x00007DB7,\n\t15422: 0x00007DC2,\n\t15423: 0x00007DA3,\n\t15424: 0x00007DAA,\n\t15425: 0x00007DC1,\n\t15426: 0x00007DC0,\n\t15427: 0x00007DC5,\n\t15428: 0x00007D9D,\n\t15429: 0x00007DCE,\n\t15430: 0x00007DC4,\n\t15431: 0x00007DC6,\n\t15432: 0x00007DCB,\n\t15433: 0x00007DCC,\n\t15434: 0x00007DAF,\n\t15435: 0x00007DB9,\n\t15436: 0x00007D96,\n\t15437: 0x00007DBC,\n\t15438: 0x00007D9F,\n\t15439: 0x00007DA6,\n\t15440: 0x00007DAE,\n\t15441: 0x00007DA9,\n\t15442: 0x00007DA1,\n\t15443: 0x00007DC9,\n\t15444: 0x00007F73,\n\t15445: 0x00007FE2,\n\t15446: 0x00007FE3,\n\t15447: 0x00007FE5,\n\t15448: 0x00007FDE,\n\t15449: 0x00008024,\n\t15450: 0x0000805D,\n\t15451: 0x0000805C,\n\t15452: 0x00008189,\n\t15453: 0x00008186,\n\t15454: 0x00008183,\n\t15455: 0x00008187,\n\t15456: 0x0000818D,\n\t15457: 0x0000818C,\n\t15458: 0x0000818B,\n\t15459: 0x00008215,\n\t15460: 0x00008497,\n\t15461: 0x000084A4,\n\t15462: 0x000084A1,\n\t15463: 0x0000849F,\n\t15464: 0x000084BA,\n\t15465: 0x000084CE,\n\t15466: 0x000084C2,\n\t15467: 0x000084AC,\n\t15468: 0x000084AE,\n\t15469: 0x000084AB,\n\t15470: 0x000084B9,\n\t15471: 0x000084B4,\n\t15472: 0x000084C1,\n\t15473: 0x000084CD,\n\t15474: 0x000084AA,\n\t15475: 0x0000849A,\n\t15476: 0x000084B1,\n\t15477: 0x000084D0,\n\t15478: 0x0000849D,\n\t15479: 0x000084A7,\n\t15480: 0x000084BB,\n\t15481: 0x000084A2,\n\t15482: 0x00008494,\n\t15483: 0x000084C7,\n\t15484: 0x000084CC,\n\t15485: 0x0000849B,\n\t15486: 0x000084A9,\n\t15487: 0x000084AF,\n\t15488: 0x000084A8,\n\t15489: 0x000084D6,\n\t15490: 0x00008498,\n\t15491: 0x000084B6,\n\t15492: 0x000084CF,\n\t15493: 0x000084A0,\n\t15494: 0x000084D7,\n\t15495: 0x000084D4,\n\t15496: 0x000084D2,\n\t15497: 0x000084DB,\n\t15498: 0x000084B0,\n\t15499: 0x00008491,\n\t15500: 0x00008661,\n\t15501: 0x00008733,\n\t15502: 0x00008723,\n\t15503: 0x00008728,\n\t15504: 0x0000876B,\n\t15505: 0x00008740,\n\t15506: 0x0000872E,\n\t15507: 0x0000871E,\n\t15508: 0x00008721,\n\t15509: 0x00008719,\n\t15510: 0x0000871B,\n\t15511: 0x00008743,\n\t15512: 0x0000872C,\n\t15513: 0x00008741,\n\t15514: 0x0000873E,\n\t15515: 0x00008746,\n\t15516: 0x00008720,\n\t15517: 0x00008732,\n\t15518: 0x0000872A,\n\t15519: 0x0000872D,\n\t15520: 0x0000873C,\n\t15521: 0x00008712,\n\t15522: 0x0000873A,\n\t15523: 0x00008731,\n\t15524: 0x00008735,\n\t15525: 0x00008742,\n\t15526: 0x00008726,\n\t15527: 0x00008727,\n\t15528: 0x00008738,\n\t15529: 0x00008724,\n\t15530: 0x0000871A,\n\t15531: 0x00008730,\n\t15532: 0x00008711,\n\t15533: 0x000088F7,\n\t15534: 0x000088E7,\n\t15535: 0x000088F1,\n\t15536: 0x000088F2,\n\t15537: 0x000088FA,\n\t15538: 0x000088FE,\n\t15539: 0x000088EE,\n\t15540: 0x000088FC,\n\t15541: 0x000088F6,\n\t15542: 0x000088FB,\n\t15543: 0x000088F0,\n\t15544: 0x000088EC,\n\t15545: 0x000088EB,\n\t15546: 0x0000899D,\n\t15547: 0x000089A1,\n\t15548: 0x0000899F,\n\t15549: 0x0000899E,\n\t15550: 0x000089E9,\n\t15551: 0x000089EB,\n\t15552: 0x000089E8,\n\t15553: 0x00008AAB,\n\t15554: 0x00008A99,\n\t15555: 0x00008A8B,\n\t15556: 0x00008A92,\n\t15557: 0x00008A8F,\n\t15558: 0x00008A96,\n\t15559: 0x00008C3D,\n\t15560: 0x00008C68,\n\t15561: 0x00008C69,\n\t15562: 0x00008CD5,\n\t15563: 0x00008CCF,\n\t15564: 0x00008CD7,\n\t15565: 0x00008D96,\n\t15566: 0x00008E09,\n\t15567: 0x00008E02,\n\t15568: 0x00008DFF,\n\t15569: 0x00008E0D,\n\t15570: 0x00008DFD,\n\t15571: 0x00008E0A,\n\t15572: 0x00008E03,\n\t15573: 0x00008E07,\n\t15574: 0x00008E06,\n\t15575: 0x00008E05,\n\t15576: 0x00008DFE,\n\t15577: 0x00008E00,\n\t15578: 0x00008E04,\n\t15579: 0x00008F10,\n\t15580: 0x00008F11,\n\t15581: 0x00008F0E,\n\t15582: 0x00008F0D,\n\t15583: 0x00009123,\n\t15584: 0x0000911C,\n\t15585: 0x00009120,\n\t15586: 0x00009122,\n\t15587: 0x0000911F,\n\t15588: 0x0000911D,\n\t15589: 0x0000911A,\n\t15590: 0x00009124,\n\t15591: 0x00009121,\n\t15592: 0x0000911B,\n\t15593: 0x0000917A,\n\t15594: 0x00009172,\n\t15595: 0x00009179,\n\t15596: 0x00009173,\n\t15597: 0x000092A5,\n\t15598: 0x000092A4,\n\t15599: 0x00009276,\n\t15600: 0x0000929B,\n\t15601: 0x0000927A,\n\t15602: 0x000092A0,\n\t15603: 0x00009294,\n\t15604: 0x000092AA,\n\t15605: 0x0000928D,\n\t15606: 0x000092A6,\n\t15607: 0x0000929A,\n\t15608: 0x000092AB,\n\t15609: 0x00009279,\n\t15610: 0x00009297,\n\t15611: 0x0000927F,\n\t15612: 0x000092A3,\n\t15613: 0x000092EE,\n\t15614: 0x0000928E,\n\t15615: 0x00009282,\n\t15616: 0x00009295,\n\t15617: 0x000092A2,\n\t15618: 0x0000927D,\n\t15619: 0x00009288,\n\t15620: 0x000092A1,\n\t15621: 0x0000928A,\n\t15622: 0x00009286,\n\t15623: 0x0000928C,\n\t15624: 0x00009299,\n\t15625: 0x000092A7,\n\t15626: 0x0000927E,\n\t15627: 0x00009287,\n\t15628: 0x000092A9,\n\t15629: 0x0000929D,\n\t15630: 0x0000928B,\n\t15631: 0x0000922D,\n\t15632: 0x0000969E,\n\t15633: 0x000096A1,\n\t15634: 0x000096FF,\n\t15635: 0x00009758,\n\t15636: 0x0000977D,\n\t15637: 0x0000977A,\n\t15638: 0x0000977E,\n\t15639: 0x00009783,\n\t15640: 0x00009780,\n\t15641: 0x00009782,\n\t15642: 0x0000977B,\n\t15643: 0x00009784,\n\t15644: 0x00009781,\n\t15645: 0x0000977F,\n\t15646: 0x000097CE,\n\t15647: 0x000097CD,\n\t15648: 0x00009816,\n\t15649: 0x000098AD,\n\t15650: 0x000098AE,\n\t15651: 0x00009902,\n\t15652: 0x00009900,\n\t15653: 0x00009907,\n\t15654: 0x0000999D,\n\t15655: 0x0000999C,\n\t15656: 0x000099C3,\n\t15657: 0x000099B9,\n\t15658: 0x000099BB,\n\t15659: 0x000099BA,\n\t15660: 0x000099C2,\n\t15661: 0x000099BD,\n\t15662: 0x000099C7,\n\t15663: 0x00009AB1,\n\t15664: 0x00009AE3,\n\t15665: 0x00009AE7,\n\t15666: 0x00009B3E,\n\t15667: 0x00009B3F,\n\t15668: 0x00009B60,\n\t15669: 0x00009B61,\n\t15670: 0x00009B5F,\n\t15671: 0x00009CF1,\n\t15672: 0x00009CF2,\n\t15673: 0x00009CF5,\n\t15674: 0x00009EA7,\n\t15675: 0x000050FF,\n\t15676: 0x00005103,\n\t15677: 0x00005130,\n\t15678: 0x000050F8,\n\t15679: 0x00005106,\n\t15680: 0x00005107,\n\t15681: 0x000050F6,\n\t15682: 0x000050FE,\n\t15683: 0x0000510B,\n\t15684: 0x0000510C,\n\t15685: 0x000050FD,\n\t15686: 0x0000510A,\n\t15687: 0x0000528B,\n\t15688: 0x0000528C,\n\t15689: 0x000052F1,\n\t15690: 0x000052EF,\n\t15691: 0x00005648,\n\t15692: 0x00005642,\n\t15693: 0x0000564C,\n\t15694: 0x00005635,\n\t15695: 0x00005641,\n\t15696: 0x0000564A,\n\t15697: 0x00005649,\n\t15698: 0x00005646,\n\t15699: 0x00005658,\n\t15700: 0x0000565A,\n\t15701: 0x00005640,\n\t15702: 0x00005633,\n\t15703: 0x0000563D,\n\t15704: 0x0000562C,\n\t15705: 0x0000563E,\n\t15706: 0x00005638,\n\t15707: 0x0000562A,\n\t15708: 0x0000563A,\n\t15709: 0x0000571A,\n\t15710: 0x000058AB,\n\t15711: 0x0000589D,\n\t15712: 0x000058B1,\n\t15713: 0x000058A0,\n\t15714: 0x000058A3,\n\t15715: 0x000058AF,\n\t15716: 0x000058AC,\n\t15717: 0x000058A5,\n\t15718: 0x000058A1,\n\t15719: 0x000058FF,\n\t15720: 0x00005AFF,\n\t15721: 0x00005AF4,\n\t15722: 0x00005AFD,\n\t15723: 0x00005AF7,\n\t15724: 0x00005AF6,\n\t15725: 0x00005B03,\n\t15726: 0x00005AF8,\n\t15727: 0x00005B02,\n\t15728: 0x00005AF9,\n\t15729: 0x00005B01,\n\t15730: 0x00005B07,\n\t15731: 0x00005B05,\n\t15732: 0x00005B0F,\n\t15733: 0x00005C67,\n\t15734: 0x00005D99,\n\t15735: 0x00005D97,\n\t15736: 0x00005D9F,\n\t15737: 0x00005D92,\n\t15738: 0x00005DA2,\n\t15739: 0x00005D93,\n\t15740: 0x00005D95,\n\t15741: 0x00005DA0,\n\t15742: 0x00005D9C,\n\t15743: 0x00005DA1,\n\t15744: 0x00005D9A,\n\t15745: 0x00005D9E,\n\t15746: 0x00005E69,\n\t15747: 0x00005E5D,\n\t15748: 0x00005E60,\n\t15749: 0x00005E5C,\n\t15750: 0x00007DF3,\n\t15751: 0x00005EDB,\n\t15752: 0x00005EDE,\n\t15753: 0x00005EE1,\n\t15754: 0x00005F49,\n\t15755: 0x00005FB2,\n\t15756: 0x0000618B,\n\t15757: 0x00006183,\n\t15758: 0x00006179,\n\t15759: 0x000061B1,\n\t15760: 0x000061B0,\n\t15761: 0x000061A2,\n\t15762: 0x00006189,\n\t15763: 0x0000619B,\n\t15764: 0x00006193,\n\t15765: 0x000061AF,\n\t15766: 0x000061AD,\n\t15767: 0x0000619F,\n\t15768: 0x00006192,\n\t15769: 0x000061AA,\n\t15770: 0x000061A1,\n\t15771: 0x0000618D,\n\t15772: 0x00006166,\n\t15773: 0x000061B3,\n\t15774: 0x0000622D,\n\t15775: 0x0000646E,\n\t15776: 0x00006470,\n\t15777: 0x00006496,\n\t15778: 0x000064A0,\n\t15779: 0x00006485,\n\t15780: 0x00006497,\n\t15781: 0x0000649C,\n\t15782: 0x0000648F,\n\t15783: 0x0000648B,\n\t15784: 0x0000648A,\n\t15785: 0x0000648C,\n\t15786: 0x000064A3,\n\t15787: 0x0000649F,\n\t15788: 0x00006468,\n\t15789: 0x000064B1,\n\t15790: 0x00006498,\n\t15791: 0x00006576,\n\t15792: 0x0000657A,\n\t15793: 0x00006579,\n\t15794: 0x0000657B,\n\t15795: 0x000065B2,\n\t15796: 0x000065B3,\n\t15797: 0x000066B5,\n\t15798: 0x000066B0,\n\t15799: 0x000066A9,\n\t15800: 0x000066B2,\n\t15801: 0x000066B7,\n\t15802: 0x000066AA,\n\t15803: 0x000066AF,\n\t15804: 0x00006A00,\n\t15805: 0x00006A06,\n\t15806: 0x00006A17,\n\t15807: 0x000069E5,\n\t15808: 0x000069F8,\n\t15809: 0x00006A15,\n\t15810: 0x000069F1,\n\t15811: 0x000069E4,\n\t15812: 0x00006A20,\n\t15813: 0x000069FF,\n\t15814: 0x000069EC,\n\t15815: 0x000069E2,\n\t15816: 0x00006A1B,\n\t15817: 0x00006A1D,\n\t15818: 0x000069FE,\n\t15819: 0x00006A27,\n\t15820: 0x000069F2,\n\t15821: 0x000069EE,\n\t15822: 0x00006A14,\n\t15823: 0x000069F7,\n\t15824: 0x000069E7,\n\t15825: 0x00006A40,\n\t15826: 0x00006A08,\n\t15827: 0x000069E6,\n\t15828: 0x000069FB,\n\t15829: 0x00006A0D,\n\t15830: 0x000069FC,\n\t15831: 0x000069EB,\n\t15832: 0x00006A09,\n\t15833: 0x00006A04,\n\t15834: 0x00006A18,\n\t15835: 0x00006A25,\n\t15836: 0x00006A0F,\n\t15837: 0x000069F6,\n\t15838: 0x00006A26,\n\t15839: 0x00006A07,\n\t15840: 0x000069F4,\n\t15841: 0x00006A16,\n\t15842: 0x00006B51,\n\t15843: 0x00006BA5,\n\t15844: 0x00006BA3,\n\t15845: 0x00006BA2,\n\t15846: 0x00006BA6,\n\t15847: 0x00006C01,\n\t15848: 0x00006C00,\n\t15849: 0x00006BFF,\n\t15850: 0x00006C02,\n\t15851: 0x00006F41,\n\t15852: 0x00006F26,\n\t15853: 0x00006F7E,\n\t15854: 0x00006F87,\n\t15855: 0x00006FC6,\n\t15856: 0x00006F92,\n\t15857: 0x00006F8D,\n\t15858: 0x00006F89,\n\t15859: 0x00006F8C,\n\t15860: 0x00006F62,\n\t15861: 0x00006F4F,\n\t15862: 0x00006F85,\n\t15863: 0x00006F5A,\n\t15864: 0x00006F96,\n\t15865: 0x00006F76,\n\t15866: 0x00006F6C,\n\t15867: 0x00006F82,\n\t15868: 0x00006F55,\n\t15869: 0x00006F72,\n\t15870: 0x00006F52,\n\t15871: 0x00006F50,\n\t15872: 0x00006F57,\n\t15873: 0x00006F94,\n\t15874: 0x00006F93,\n\t15875: 0x00006F5D,\n\t15876: 0x00006F00,\n\t15877: 0x00006F61,\n\t15878: 0x00006F6B,\n\t15879: 0x00006F7D,\n\t15880: 0x00006F67,\n\t15881: 0x00006F90,\n\t15882: 0x00006F53,\n\t15883: 0x00006F8B,\n\t15884: 0x00006F69,\n\t15885: 0x00006F7F,\n\t15886: 0x00006F95,\n\t15887: 0x00006F63,\n\t15888: 0x00006F77,\n\t15889: 0x00006F6A,\n\t15890: 0x00006F7B,\n\t15891: 0x000071B2,\n\t15892: 0x000071AF,\n\t15893: 0x0000719B,\n\t15894: 0x000071B0,\n\t15895: 0x000071A0,\n\t15896: 0x0000719A,\n\t15897: 0x000071A9,\n\t15898: 0x000071B5,\n\t15899: 0x0000719D,\n\t15900: 0x000071A5,\n\t15901: 0x0000719E,\n\t15902: 0x000071A4,\n\t15903: 0x000071A1,\n\t15904: 0x000071AA,\n\t15905: 0x0000719C,\n\t15906: 0x000071A7,\n\t15907: 0x000071B3,\n\t15908: 0x00007298,\n\t15909: 0x0000729A,\n\t15910: 0x00007358,\n\t15911: 0x00007352,\n\t15912: 0x0000735E,\n\t15913: 0x0000735F,\n\t15914: 0x00007360,\n\t15915: 0x0000735D,\n\t15916: 0x0000735B,\n\t15917: 0x00007361,\n\t15918: 0x0000735A,\n\t15919: 0x00007359,\n\t15920: 0x00007362,\n\t15921: 0x00007487,\n\t15922: 0x00007489,\n\t15923: 0x0000748A,\n\t15924: 0x00007486,\n\t15925: 0x00007481,\n\t15926: 0x0000747D,\n\t15927: 0x00007485,\n\t15928: 0x00007488,\n\t15929: 0x0000747C,\n\t15930: 0x00007479,\n\t15931: 0x00007508,\n\t15932: 0x00007507,\n\t15933: 0x0000757E,\n\t15934: 0x00007625,\n\t15935: 0x0000761E,\n\t15936: 0x00007619,\n\t15937: 0x0000761D,\n\t15938: 0x0000761C,\n\t15939: 0x00007623,\n\t15940: 0x0000761A,\n\t15941: 0x00007628,\n\t15942: 0x0000761B,\n\t15943: 0x0000769C,\n\t15944: 0x0000769D,\n\t15945: 0x0000769E,\n\t15946: 0x0000769B,\n\t15947: 0x0000778D,\n\t15948: 0x0000778F,\n\t15949: 0x00007789,\n\t15950: 0x00007788,\n\t15951: 0x000078CD,\n\t15952: 0x000078BB,\n\t15953: 0x000078CF,\n\t15954: 0x000078CC,\n\t15955: 0x000078D1,\n\t15956: 0x000078CE,\n\t15957: 0x000078D4,\n\t15958: 0x000078C8,\n\t15959: 0x000078C3,\n\t15960: 0x000078C4,\n\t15961: 0x000078C9,\n\t15962: 0x0000799A,\n\t15963: 0x000079A1,\n\t15964: 0x000079A0,\n\t15965: 0x0000799C,\n\t15966: 0x000079A2,\n\t15967: 0x0000799B,\n\t15968: 0x00006B76,\n\t15969: 0x00007A39,\n\t15970: 0x00007AB2,\n\t15971: 0x00007AB4,\n\t15972: 0x00007AB3,\n\t15973: 0x00007BB7,\n\t15974: 0x00007BCB,\n\t15975: 0x00007BBE,\n\t15976: 0x00007BAC,\n\t15977: 0x00007BCE,\n\t15978: 0x00007BAF,\n\t15979: 0x00007BB9,\n\t15980: 0x00007BCA,\n\t15981: 0x00007BB5,\n\t15982: 0x00007CC5,\n\t15983: 0x00007CC8,\n\t15984: 0x00007CCC,\n\t15985: 0x00007CCB,\n\t15986: 0x00007DF7,\n\t15987: 0x00007DDB,\n\t15988: 0x00007DEA,\n\t15989: 0x00007DE7,\n\t15990: 0x00007DD7,\n\t15991: 0x00007DE1,\n\t15992: 0x00007E03,\n\t15993: 0x00007DFA,\n\t15994: 0x00007DE6,\n\t15995: 0x00007DF6,\n\t15996: 0x00007DF1,\n\t15997: 0x00007DF0,\n\t15998: 0x00007DEE,\n\t15999: 0x00007DDF,\n\t16000: 0x00007F76,\n\t16001: 0x00007FAC,\n\t16002: 0x00007FB0,\n\t16003: 0x00007FAD,\n\t16004: 0x00007FED,\n\t16005: 0x00007FEB,\n\t16006: 0x00007FEA,\n\t16007: 0x00007FEC,\n\t16008: 0x00007FE6,\n\t16009: 0x00007FE8,\n\t16010: 0x00008064,\n\t16011: 0x00008067,\n\t16012: 0x000081A3,\n\t16013: 0x0000819F,\n\t16014: 0x0000819E,\n\t16015: 0x00008195,\n\t16016: 0x000081A2,\n\t16017: 0x00008199,\n\t16018: 0x00008197,\n\t16019: 0x00008216,\n\t16020: 0x0000824F,\n\t16021: 0x00008253,\n\t16022: 0x00008252,\n\t16023: 0x00008250,\n\t16024: 0x0000824E,\n\t16025: 0x00008251,\n\t16026: 0x00008524,\n\t16027: 0x0000853B,\n\t16028: 0x0000850F,\n\t16029: 0x00008500,\n\t16030: 0x00008529,\n\t16031: 0x0000850E,\n\t16032: 0x00008509,\n\t16033: 0x0000850D,\n\t16034: 0x0000851F,\n\t16035: 0x0000850A,\n\t16036: 0x00008527,\n\t16037: 0x0000851C,\n\t16038: 0x000084FB,\n\t16039: 0x0000852B,\n\t16040: 0x000084FA,\n\t16041: 0x00008508,\n\t16042: 0x0000850C,\n\t16043: 0x000084F4,\n\t16044: 0x0000852A,\n\t16045: 0x000084F2,\n\t16046: 0x00008515,\n\t16047: 0x000084F7,\n\t16048: 0x000084EB,\n\t16049: 0x000084F3,\n\t16050: 0x000084FC,\n\t16051: 0x00008512,\n\t16052: 0x000084EA,\n\t16053: 0x000084E9,\n\t16054: 0x00008516,\n\t16055: 0x000084FE,\n\t16056: 0x00008528,\n\t16057: 0x0000851D,\n\t16058: 0x0000852E,\n\t16059: 0x00008502,\n\t16060: 0x000084FD,\n\t16061: 0x0000851E,\n\t16062: 0x000084F6,\n\t16063: 0x00008531,\n\t16064: 0x00008526,\n\t16065: 0x000084E7,\n\t16066: 0x000084E8,\n\t16067: 0x000084F0,\n\t16068: 0x000084EF,\n\t16069: 0x000084F9,\n\t16070: 0x00008518,\n\t16071: 0x00008520,\n\t16072: 0x00008530,\n\t16073: 0x0000850B,\n\t16074: 0x00008519,\n\t16075: 0x0000852F,\n\t16076: 0x00008662,\n\t16077: 0x00008756,\n\t16078: 0x00008763,\n\t16079: 0x00008764,\n\t16080: 0x00008777,\n\t16081: 0x000087E1,\n\t16082: 0x00008773,\n\t16083: 0x00008758,\n\t16084: 0x00008754,\n\t16085: 0x0000875B,\n\t16086: 0x00008752,\n\t16087: 0x00008761,\n\t16088: 0x0000875A,\n\t16089: 0x00008751,\n\t16090: 0x0000875E,\n\t16091: 0x0000876D,\n\t16092: 0x0000876A,\n\t16093: 0x00008750,\n\t16094: 0x0000874E,\n\t16095: 0x0000875F,\n\t16096: 0x0000875D,\n\t16097: 0x0000876F,\n\t16098: 0x0000876C,\n\t16099: 0x0000877A,\n\t16100: 0x0000876E,\n\t16101: 0x0000875C,\n\t16102: 0x00008765,\n\t16103: 0x0000874F,\n\t16104: 0x0000877B,\n\t16105: 0x00008775,\n\t16106: 0x00008762,\n\t16107: 0x00008767,\n\t16108: 0x00008769,\n\t16109: 0x0000885A,\n\t16110: 0x00008905,\n\t16111: 0x0000890C,\n\t16112: 0x00008914,\n\t16113: 0x0000890B,\n\t16114: 0x00008917,\n\t16115: 0x00008918,\n\t16116: 0x00008919,\n\t16117: 0x00008906,\n\t16118: 0x00008916,\n\t16119: 0x00008911,\n\t16120: 0x0000890E,\n\t16121: 0x00008909,\n\t16122: 0x000089A2,\n\t16123: 0x000089A4,\n\t16124: 0x000089A3,\n\t16125: 0x000089ED,\n\t16126: 0x000089F0,\n\t16127: 0x000089EC,\n\t16128: 0x00008ACF,\n\t16129: 0x00008AC6,\n\t16130: 0x00008AB8,\n\t16131: 0x00008AD3,\n\t16132: 0x00008AD1,\n\t16133: 0x00008AD4,\n\t16134: 0x00008AD5,\n\t16135: 0x00008ABB,\n\t16136: 0x00008AD7,\n\t16137: 0x00008ABE,\n\t16138: 0x00008AC0,\n\t16139: 0x00008AC5,\n\t16140: 0x00008AD8,\n\t16141: 0x00008AC3,\n\t16142: 0x00008ABA,\n\t16143: 0x00008ABD,\n\t16144: 0x00008AD9,\n\t16145: 0x00008C3E,\n\t16146: 0x00008C4D,\n\t16147: 0x00008C8F,\n\t16148: 0x00008CE5,\n\t16149: 0x00008CDF,\n\t16150: 0x00008CD9,\n\t16151: 0x00008CE8,\n\t16152: 0x00008CDA,\n\t16153: 0x00008CDD,\n\t16154: 0x00008CE7,\n\t16155: 0x00008DA0,\n\t16156: 0x00008D9C,\n\t16157: 0x00008DA1,\n\t16158: 0x00008D9B,\n\t16159: 0x00008E20,\n\t16160: 0x00008E23,\n\t16161: 0x00008E25,\n\t16162: 0x00008E24,\n\t16163: 0x00008E2E,\n\t16164: 0x00008E15,\n\t16165: 0x00008E1B,\n\t16166: 0x00008E16,\n\t16167: 0x00008E11,\n\t16168: 0x00008E19,\n\t16169: 0x00008E26,\n\t16170: 0x00008E27,\n\t16171: 0x00008E14,\n\t16172: 0x00008E12,\n\t16173: 0x00008E18,\n\t16174: 0x00008E13,\n\t16175: 0x00008E1C,\n\t16176: 0x00008E17,\n\t16177: 0x00008E1A,\n\t16178: 0x00008F2C,\n\t16179: 0x00008F24,\n\t16180: 0x00008F18,\n\t16181: 0x00008F1A,\n\t16182: 0x00008F20,\n\t16183: 0x00008F23,\n\t16184: 0x00008F16,\n\t16185: 0x00008F17,\n\t16186: 0x00009073,\n\t16187: 0x00009070,\n\t16188: 0x0000906F,\n\t16189: 0x00009067,\n\t16190: 0x0000906B,\n\t16191: 0x0000912F,\n\t16192: 0x0000912B,\n\t16193: 0x00009129,\n\t16194: 0x0000912A,\n\t16195: 0x00009132,\n\t16196: 0x00009126,\n\t16197: 0x0000912E,\n\t16198: 0x00009185,\n\t16199: 0x00009186,\n\t16200: 0x0000918A,\n\t16201: 0x00009181,\n\t16202: 0x00009182,\n\t16203: 0x00009184,\n\t16204: 0x00009180,\n\t16205: 0x000092D0,\n\t16206: 0x000092C3,\n\t16207: 0x000092C4,\n\t16208: 0x000092C0,\n\t16209: 0x000092D9,\n\t16210: 0x000092B6,\n\t16211: 0x000092CF,\n\t16212: 0x000092F1,\n\t16213: 0x000092DF,\n\t16214: 0x000092D8,\n\t16215: 0x000092E9,\n\t16216: 0x000092D7,\n\t16217: 0x000092DD,\n\t16218: 0x000092CC,\n\t16219: 0x000092EF,\n\t16220: 0x000092C2,\n\t16221: 0x000092E8,\n\t16222: 0x000092CA,\n\t16223: 0x000092C8,\n\t16224: 0x000092CE,\n\t16225: 0x000092E6,\n\t16226: 0x000092CD,\n\t16227: 0x000092D5,\n\t16228: 0x000092C9,\n\t16229: 0x000092E0,\n\t16230: 0x000092DE,\n\t16231: 0x000092E7,\n\t16232: 0x000092D1,\n\t16233: 0x000092D3,\n\t16234: 0x000092B5,\n\t16235: 0x000092E1,\n\t16236: 0x000092C6,\n\t16237: 0x000092B4,\n\t16238: 0x0000957C,\n\t16239: 0x000095AC,\n\t16240: 0x000095AB,\n\t16241: 0x000095AE,\n\t16242: 0x000095B0,\n\t16243: 0x000096A4,\n\t16244: 0x000096A2,\n\t16245: 0x000096D3,\n\t16246: 0x00009705,\n\t16247: 0x00009708,\n\t16248: 0x00009702,\n\t16249: 0x0000975A,\n\t16250: 0x0000978A,\n\t16251: 0x0000978E,\n\t16252: 0x00009788,\n\t16253: 0x000097D0,\n\t16254: 0x000097CF,\n\t16255: 0x0000981E,\n\t16256: 0x0000981D,\n\t16257: 0x00009826,\n\t16258: 0x00009829,\n\t16259: 0x00009828,\n\t16260: 0x00009820,\n\t16261: 0x0000981B,\n\t16262: 0x00009827,\n\t16263: 0x000098B2,\n\t16264: 0x00009908,\n\t16265: 0x000098FA,\n\t16266: 0x00009911,\n\t16267: 0x00009914,\n\t16268: 0x00009916,\n\t16269: 0x00009917,\n\t16270: 0x00009915,\n\t16271: 0x000099DC,\n\t16272: 0x000099CD,\n\t16273: 0x000099CF,\n\t16274: 0x000099D3,\n\t16275: 0x000099D4,\n\t16276: 0x000099CE,\n\t16277: 0x000099C9,\n\t16278: 0x000099D6,\n\t16279: 0x000099D8,\n\t16280: 0x000099CB,\n\t16281: 0x000099D7,\n\t16282: 0x000099CC,\n\t16283: 0x00009AB3,\n\t16284: 0x00009AEC,\n\t16285: 0x00009AEB,\n\t16286: 0x00009AF3,\n\t16287: 0x00009AF2,\n\t16288: 0x00009AF1,\n\t16289: 0x00009B46,\n\t16290: 0x00009B43,\n\t16291: 0x00009B67,\n\t16292: 0x00009B74,\n\t16293: 0x00009B71,\n\t16294: 0x00009B66,\n\t16295: 0x00009B76,\n\t16296: 0x00009B75,\n\t16297: 0x00009B70,\n\t16298: 0x00009B68,\n\t16299: 0x00009B64,\n\t16300: 0x00009B6C,\n\t16301: 0x00009CFC,\n\t16302: 0x00009CFA,\n\t16303: 0x00009CFD,\n\t16304: 0x00009CFF,\n\t16305: 0x00009CF7,\n\t16306: 0x00009D07,\n\t16307: 0x00009D00,\n\t16308: 0x00009CF9,\n\t16309: 0x00009CFB,\n\t16310: 0x00009D08,\n\t16311: 0x00009D05,\n\t16312: 0x00009D04,\n\t16313: 0x00009E83,\n\t16314: 0x00009ED3,\n\t16315: 0x00009F0F,\n\t16316: 0x00009F10,\n\t16317: 0x0000511C,\n\t16318: 0x00005113,\n\t16319: 0x00005117,\n\t16320: 0x0000511A,\n\t16321: 0x00005111,\n\t16322: 0x000051DE,\n\t16323: 0x00005334,\n\t16324: 0x000053E1,\n\t16325: 0x00005670,\n\t16326: 0x00005660,\n\t16327: 0x0000566E,\n\t16328: 0x00005673,\n\t16329: 0x00005666,\n\t16330: 0x00005663,\n\t16331: 0x0000566D,\n\t16332: 0x00005672,\n\t16333: 0x0000565E,\n\t16334: 0x00005677,\n\t16335: 0x0000571C,\n\t16336: 0x0000571B,\n\t16337: 0x000058C8,\n\t16338: 0x000058BD,\n\t16339: 0x000058C9,\n\t16340: 0x000058BF,\n\t16341: 0x000058BA,\n\t16342: 0x000058C2,\n\t16343: 0x000058BC,\n\t16344: 0x000058C6,\n\t16345: 0x00005B17,\n\t16346: 0x00005B19,\n\t16347: 0x00005B1B,\n\t16348: 0x00005B21,\n\t16349: 0x00005B14,\n\t16350: 0x00005B13,\n\t16351: 0x00005B10,\n\t16352: 0x00005B16,\n\t16353: 0x00005B28,\n\t16354: 0x00005B1A,\n\t16355: 0x00005B20,\n\t16356: 0x00005B1E,\n\t16357: 0x00005BEF,\n\t16358: 0x00005DAC,\n\t16359: 0x00005DB1,\n\t16360: 0x00005DA9,\n\t16361: 0x00005DA7,\n\t16362: 0x00005DB5,\n\t16363: 0x00005DB0,\n\t16364: 0x00005DAE,\n\t16365: 0x00005DAA,\n\t16366: 0x00005DA8,\n\t16367: 0x00005DB2,\n\t16368: 0x00005DAD,\n\t16369: 0x00005DAF,\n\t16370: 0x00005DB4,\n\t16371: 0x00005E67,\n\t16372: 0x00005E68,\n\t16373: 0x00005E66,\n\t16374: 0x00005E6F,\n\t16375: 0x00005EE9,\n\t16376: 0x00005EE7,\n\t16377: 0x00005EE6,\n\t16378: 0x00005EE8,\n\t16379: 0x00005EE5,\n\t16380: 0x00005F4B,\n\t16381: 0x00005FBC,\n\t16382: 0x0000619D,\n\t16383: 0x000061A8,\n\t16384: 0x00006196,\n\t16385: 0x000061C5,\n\t16386: 0x000061B4,\n\t16387: 0x000061C6,\n\t16388: 0x000061C1,\n\t16389: 0x000061CC,\n\t16390: 0x000061BA,\n\t16391: 0x000061BF,\n\t16392: 0x000061B8,\n\t16393: 0x0000618C,\n\t16394: 0x000064D7,\n\t16395: 0x000064D6,\n\t16396: 0x000064D0,\n\t16397: 0x000064CF,\n\t16398: 0x000064C9,\n\t16399: 0x000064BD,\n\t16400: 0x00006489,\n\t16401: 0x000064C3,\n\t16402: 0x000064DB,\n\t16403: 0x000064F3,\n\t16404: 0x000064D9,\n\t16405: 0x00006533,\n\t16406: 0x0000657F,\n\t16407: 0x0000657C,\n\t16408: 0x000065A2,\n\t16409: 0x000066C8,\n\t16410: 0x000066BE,\n\t16411: 0x000066C0,\n\t16412: 0x000066CA,\n\t16413: 0x000066CB,\n\t16414: 0x000066CF,\n\t16415: 0x000066BD,\n\t16416: 0x000066BB,\n\t16417: 0x000066BA,\n\t16418: 0x000066CC,\n\t16419: 0x00006723,\n\t16420: 0x00006A34,\n\t16421: 0x00006A66,\n\t16422: 0x00006A49,\n\t16423: 0x00006A67,\n\t16424: 0x00006A32,\n\t16425: 0x00006A68,\n\t16426: 0x00006A3E,\n\t16427: 0x00006A5D,\n\t16428: 0x00006A6D,\n\t16429: 0x00006A76,\n\t16430: 0x00006A5B,\n\t16431: 0x00006A51,\n\t16432: 0x00006A28,\n\t16433: 0x00006A5A,\n\t16434: 0x00006A3B,\n\t16435: 0x00006A3F,\n\t16436: 0x00006A41,\n\t16437: 0x00006A6A,\n\t16438: 0x00006A64,\n\t16439: 0x00006A50,\n\t16440: 0x00006A4F,\n\t16441: 0x00006A54,\n\t16442: 0x00006A6F,\n\t16443: 0x00006A69,\n\t16444: 0x00006A60,\n\t16445: 0x00006A3C,\n\t16446: 0x00006A5E,\n\t16447: 0x00006A56,\n\t16448: 0x00006A55,\n\t16449: 0x00006A4D,\n\t16450: 0x00006A4E,\n\t16451: 0x00006A46,\n\t16452: 0x00006B55,\n\t16453: 0x00006B54,\n\t16454: 0x00006B56,\n\t16455: 0x00006BA7,\n\t16456: 0x00006BAA,\n\t16457: 0x00006BAB,\n\t16458: 0x00006BC8,\n\t16459: 0x00006BC7,\n\t16460: 0x00006C04,\n\t16461: 0x00006C03,\n\t16462: 0x00006C06,\n\t16463: 0x00006FAD,\n\t16464: 0x00006FCB,\n\t16465: 0x00006FA3,\n\t16466: 0x00006FC7,\n\t16467: 0x00006FBC,\n\t16468: 0x00006FCE,\n\t16469: 0x00006FC8,\n\t16470: 0x00006F5E,\n\t16471: 0x00006FC4,\n\t16472: 0x00006FBD,\n\t16473: 0x00006F9E,\n\t16474: 0x00006FCA,\n\t16475: 0x00006FA8,\n\t16476: 0x00007004,\n\t16477: 0x00006FA5,\n\t16478: 0x00006FAE,\n\t16479: 0x00006FBA,\n\t16480: 0x00006FAC,\n\t16481: 0x00006FAA,\n\t16482: 0x00006FCF,\n\t16483: 0x00006FBF,\n\t16484: 0x00006FB8,\n\t16485: 0x00006FA2,\n\t16486: 0x00006FC9,\n\t16487: 0x00006FAB,\n\t16488: 0x00006FCD,\n\t16489: 0x00006FAF,\n\t16490: 0x00006FB2,\n\t16491: 0x00006FB0,\n\t16492: 0x000071C5,\n\t16493: 0x000071C2,\n\t16494: 0x000071BF,\n\t16495: 0x000071B8,\n\t16496: 0x000071D6,\n\t16497: 0x000071C0,\n\t16498: 0x000071C1,\n\t16499: 0x000071CB,\n\t16500: 0x000071D4,\n\t16501: 0x000071CA,\n\t16502: 0x000071C7,\n\t16503: 0x000071CF,\n\t16504: 0x000071BD,\n\t16505: 0x000071D8,\n\t16506: 0x000071BC,\n\t16507: 0x000071C6,\n\t16508: 0x000071DA,\n\t16509: 0x000071DB,\n\t16510: 0x0000729D,\n\t16511: 0x0000729E,\n\t16512: 0x00007369,\n\t16513: 0x00007366,\n\t16514: 0x00007367,\n\t16515: 0x0000736C,\n\t16516: 0x00007365,\n\t16517: 0x0000736B,\n\t16518: 0x0000736A,\n\t16519: 0x0000747F,\n\t16520: 0x0000749A,\n\t16521: 0x000074A0,\n\t16522: 0x00007494,\n\t16523: 0x00007492,\n\t16524: 0x00007495,\n\t16525: 0x000074A1,\n\t16526: 0x0000750B,\n\t16527: 0x00007580,\n\t16528: 0x0000762F,\n\t16529: 0x0000762D,\n\t16530: 0x00007631,\n\t16531: 0x0000763D,\n\t16532: 0x00007633,\n\t16533: 0x0000763C,\n\t16534: 0x00007635,\n\t16535: 0x00007632,\n\t16536: 0x00007630,\n\t16537: 0x000076BB,\n\t16538: 0x000076E6,\n\t16539: 0x0000779A,\n\t16540: 0x0000779D,\n\t16541: 0x000077A1,\n\t16542: 0x0000779C,\n\t16543: 0x0000779B,\n\t16544: 0x000077A2,\n\t16545: 0x000077A3,\n\t16546: 0x00007795,\n\t16547: 0x00007799,\n\t16548: 0x00007797,\n\t16549: 0x000078DD,\n\t16550: 0x000078E9,\n\t16551: 0x000078E5,\n\t16552: 0x000078EA,\n\t16553: 0x000078DE,\n\t16554: 0x000078E3,\n\t16555: 0x000078DB,\n\t16556: 0x000078E1,\n\t16557: 0x000078E2,\n\t16558: 0x000078ED,\n\t16559: 0x000078DF,\n\t16560: 0x000078E0,\n\t16561: 0x000079A4,\n\t16562: 0x00007A44,\n\t16563: 0x00007A48,\n\t16564: 0x00007A47,\n\t16565: 0x00007AB6,\n\t16566: 0x00007AB8,\n\t16567: 0x00007AB5,\n\t16568: 0x00007AB1,\n\t16569: 0x00007AB7,\n\t16570: 0x00007BDE,\n\t16571: 0x00007BE3,\n\t16572: 0x00007BE7,\n\t16573: 0x00007BDD,\n\t16574: 0x00007BD5,\n\t16575: 0x00007BE5,\n\t16576: 0x00007BDA,\n\t16577: 0x00007BE8,\n\t16578: 0x00007BF9,\n\t16579: 0x00007BD4,\n\t16580: 0x00007BEA,\n\t16581: 0x00007BE2,\n\t16582: 0x00007BDC,\n\t16583: 0x00007BEB,\n\t16584: 0x00007BD8,\n\t16585: 0x00007BDF,\n\t16586: 0x00007CD2,\n\t16587: 0x00007CD4,\n\t16588: 0x00007CD7,\n\t16589: 0x00007CD0,\n\t16590: 0x00007CD1,\n\t16591: 0x00007E12,\n\t16592: 0x00007E21,\n\t16593: 0x00007E17,\n\t16594: 0x00007E0C,\n\t16595: 0x00007E1F,\n\t16596: 0x00007E20,\n\t16597: 0x00007E13,\n\t16598: 0x00007E0E,\n\t16599: 0x00007E1C,\n\t16600: 0x00007E15,\n\t16601: 0x00007E1A,\n\t16602: 0x00007E22,\n\t16603: 0x00007E0B,\n\t16604: 0x00007E0F,\n\t16605: 0x00007E16,\n\t16606: 0x00007E0D,\n\t16607: 0x00007E14,\n\t16608: 0x00007E25,\n\t16609: 0x00007E24,\n\t16610: 0x00007F43,\n\t16611: 0x00007F7B,\n\t16612: 0x00007F7C,\n\t16613: 0x00007F7A,\n\t16614: 0x00007FB1,\n\t16615: 0x00007FEF,\n\t16616: 0x0000802A,\n\t16617: 0x00008029,\n\t16618: 0x0000806C,\n\t16619: 0x000081B1,\n\t16620: 0x000081A6,\n\t16621: 0x000081AE,\n\t16622: 0x000081B9,\n\t16623: 0x000081B5,\n\t16624: 0x000081AB,\n\t16625: 0x000081B0,\n\t16626: 0x000081AC,\n\t16627: 0x000081B4,\n\t16628: 0x000081B2,\n\t16629: 0x000081B7,\n\t16630: 0x000081A7,\n\t16631: 0x000081F2,\n\t16632: 0x00008255,\n\t16633: 0x00008256,\n\t16634: 0x00008257,\n\t16635: 0x00008556,\n\t16636: 0x00008545,\n\t16637: 0x0000856B,\n\t16638: 0x0000854D,\n\t16639: 0x00008553,\n\t16640: 0x00008561,\n\t16641: 0x00008558,\n\t16642: 0x00008540,\n\t16643: 0x00008546,\n\t16644: 0x00008564,\n\t16645: 0x00008541,\n\t16646: 0x00008562,\n\t16647: 0x00008544,\n\t16648: 0x00008551,\n\t16649: 0x00008547,\n\t16650: 0x00008563,\n\t16651: 0x0000853E,\n\t16652: 0x0000855B,\n\t16653: 0x00008571,\n\t16654: 0x0000854E,\n\t16655: 0x0000856E,\n\t16656: 0x00008575,\n\t16657: 0x00008555,\n\t16658: 0x00008567,\n\t16659: 0x00008560,\n\t16660: 0x0000858C,\n\t16661: 0x00008566,\n\t16662: 0x0000855D,\n\t16663: 0x00008554,\n\t16664: 0x00008565,\n\t16665: 0x0000856C,\n\t16666: 0x00008663,\n\t16667: 0x00008665,\n\t16668: 0x00008664,\n\t16669: 0x0000879B,\n\t16670: 0x0000878F,\n\t16671: 0x00008797,\n\t16672: 0x00008793,\n\t16673: 0x00008792,\n\t16674: 0x00008788,\n\t16675: 0x00008781,\n\t16676: 0x00008796,\n\t16677: 0x00008798,\n\t16678: 0x00008779,\n\t16679: 0x00008787,\n\t16680: 0x000087A3,\n\t16681: 0x00008785,\n\t16682: 0x00008790,\n\t16683: 0x00008791,\n\t16684: 0x0000879D,\n\t16685: 0x00008784,\n\t16686: 0x00008794,\n\t16687: 0x0000879C,\n\t16688: 0x0000879A,\n\t16689: 0x00008789,\n\t16690: 0x0000891E,\n\t16691: 0x00008926,\n\t16692: 0x00008930,\n\t16693: 0x0000892D,\n\t16694: 0x0000892E,\n\t16695: 0x00008927,\n\t16696: 0x00008931,\n\t16697: 0x00008922,\n\t16698: 0x00008929,\n\t16699: 0x00008923,\n\t16700: 0x0000892F,\n\t16701: 0x0000892C,\n\t16702: 0x0000891F,\n\t16703: 0x000089F1,\n\t16704: 0x00008AE0,\n\t16705: 0x00008AE2,\n\t16706: 0x00008AF2,\n\t16707: 0x00008AF4,\n\t16708: 0x00008AF5,\n\t16709: 0x00008ADD,\n\t16710: 0x00008B14,\n\t16711: 0x00008AE4,\n\t16712: 0x00008ADF,\n\t16713: 0x00008AF0,\n\t16714: 0x00008AC8,\n\t16715: 0x00008ADE,\n\t16716: 0x00008AE1,\n\t16717: 0x00008AE8,\n\t16718: 0x00008AFF,\n\t16719: 0x00008AEF,\n\t16720: 0x00008AFB,\n\t16721: 0x00008C91,\n\t16722: 0x00008C92,\n\t16723: 0x00008C90,\n\t16724: 0x00008CF5,\n\t16725: 0x00008CEE,\n\t16726: 0x00008CF1,\n\t16727: 0x00008CF0,\n\t16728: 0x00008CF3,\n\t16729: 0x00008D6C,\n\t16730: 0x00008D6E,\n\t16731: 0x00008DA5,\n\t16732: 0x00008DA7,\n\t16733: 0x00008E33,\n\t16734: 0x00008E3E,\n\t16735: 0x00008E38,\n\t16736: 0x00008E40,\n\t16737: 0x00008E45,\n\t16738: 0x00008E36,\n\t16739: 0x00008E3C,\n\t16740: 0x00008E3D,\n\t16741: 0x00008E41,\n\t16742: 0x00008E30,\n\t16743: 0x00008E3F,\n\t16744: 0x00008EBD,\n\t16745: 0x00008F36,\n\t16746: 0x00008F2E,\n\t16747: 0x00008F35,\n\t16748: 0x00008F32,\n\t16749: 0x00008F39,\n\t16750: 0x00008F37,\n\t16751: 0x00008F34,\n\t16752: 0x00009076,\n\t16753: 0x00009079,\n\t16754: 0x0000907B,\n\t16755: 0x00009086,\n\t16756: 0x000090FA,\n\t16757: 0x00009133,\n\t16758: 0x00009135,\n\t16759: 0x00009136,\n\t16760: 0x00009193,\n\t16761: 0x00009190,\n\t16762: 0x00009191,\n\t16763: 0x0000918D,\n\t16764: 0x0000918F,\n\t16765: 0x00009327,\n\t16766: 0x0000931E,\n\t16767: 0x00009308,\n\t16768: 0x0000931F,\n\t16769: 0x00009306,\n\t16770: 0x0000930F,\n\t16771: 0x0000937A,\n\t16772: 0x00009338,\n\t16773: 0x0000933C,\n\t16774: 0x0000931B,\n\t16775: 0x00009323,\n\t16776: 0x00009312,\n\t16777: 0x00009301,\n\t16778: 0x00009346,\n\t16779: 0x0000932D,\n\t16780: 0x0000930E,\n\t16781: 0x0000930D,\n\t16782: 0x000092CB,\n\t16783: 0x0000931D,\n\t16784: 0x000092FA,\n\t16785: 0x00009325,\n\t16786: 0x00009313,\n\t16787: 0x000092F9,\n\t16788: 0x000092F7,\n\t16789: 0x00009334,\n\t16790: 0x00009302,\n\t16791: 0x00009324,\n\t16792: 0x000092FF,\n\t16793: 0x00009329,\n\t16794: 0x00009339,\n\t16795: 0x00009335,\n\t16796: 0x0000932A,\n\t16797: 0x00009314,\n\t16798: 0x0000930C,\n\t16799: 0x0000930B,\n\t16800: 0x000092FE,\n\t16801: 0x00009309,\n\t16802: 0x00009300,\n\t16803: 0x000092FB,\n\t16804: 0x00009316,\n\t16805: 0x000095BC,\n\t16806: 0x000095CD,\n\t16807: 0x000095BE,\n\t16808: 0x000095B9,\n\t16809: 0x000095BA,\n\t16810: 0x000095B6,\n\t16811: 0x000095BF,\n\t16812: 0x000095B5,\n\t16813: 0x000095BD,\n\t16814: 0x000096A9,\n\t16815: 0x000096D4,\n\t16816: 0x0000970B,\n\t16817: 0x00009712,\n\t16818: 0x00009710,\n\t16819: 0x00009799,\n\t16820: 0x00009797,\n\t16821: 0x00009794,\n\t16822: 0x000097F0,\n\t16823: 0x000097F8,\n\t16824: 0x00009835,\n\t16825: 0x0000982F,\n\t16826: 0x00009832,\n\t16827: 0x00009924,\n\t16828: 0x0000991F,\n\t16829: 0x00009927,\n\t16830: 0x00009929,\n\t16831: 0x0000999E,\n\t16832: 0x000099EE,\n\t16833: 0x000099EC,\n\t16834: 0x000099E5,\n\t16835: 0x000099E4,\n\t16836: 0x000099F0,\n\t16837: 0x000099E3,\n\t16838: 0x000099EA,\n\t16839: 0x000099E9,\n\t16840: 0x000099E7,\n\t16841: 0x00009AB9,\n\t16842: 0x00009ABF,\n\t16843: 0x00009AB4,\n\t16844: 0x00009ABB,\n\t16845: 0x00009AF6,\n\t16846: 0x00009AFA,\n\t16847: 0x00009AF9,\n\t16848: 0x00009AF7,\n\t16849: 0x00009B33,\n\t16850: 0x00009B80,\n\t16851: 0x00009B85,\n\t16852: 0x00009B87,\n\t16853: 0x00009B7C,\n\t16854: 0x00009B7E,\n\t16855: 0x00009B7B,\n\t16856: 0x00009B82,\n\t16857: 0x00009B93,\n\t16858: 0x00009B92,\n\t16859: 0x00009B90,\n\t16860: 0x00009B7A,\n\t16861: 0x00009B95,\n\t16862: 0x00009B7D,\n\t16863: 0x00009B88,\n\t16864: 0x00009D25,\n\t16865: 0x00009D17,\n\t16866: 0x00009D20,\n\t16867: 0x00009D1E,\n\t16868: 0x00009D14,\n\t16869: 0x00009D29,\n\t16870: 0x00009D1D,\n\t16871: 0x00009D18,\n\t16872: 0x00009D22,\n\t16873: 0x00009D10,\n\t16874: 0x00009D19,\n\t16875: 0x00009D1F,\n\t16876: 0x00009E88,\n\t16877: 0x00009E86,\n\t16878: 0x00009E87,\n\t16879: 0x00009EAE,\n\t16880: 0x00009EAD,\n\t16881: 0x00009ED5,\n\t16882: 0x00009ED6,\n\t16883: 0x00009EFA,\n\t16884: 0x00009F12,\n\t16885: 0x00009F3D,\n\t16886: 0x00005126,\n\t16887: 0x00005125,\n\t16888: 0x00005122,\n\t16889: 0x00005124,\n\t16890: 0x00005120,\n\t16891: 0x00005129,\n\t16892: 0x000052F4,\n\t16893: 0x00005693,\n\t16894: 0x0000568C,\n\t16895: 0x0000568D,\n\t16896: 0x00005686,\n\t16897: 0x00005684,\n\t16898: 0x00005683,\n\t16899: 0x0000567E,\n\t16900: 0x00005682,\n\t16901: 0x0000567F,\n\t16902: 0x00005681,\n\t16903: 0x000058D6,\n\t16904: 0x000058D4,\n\t16905: 0x000058CF,\n\t16906: 0x000058D2,\n\t16907: 0x00005B2D,\n\t16908: 0x00005B25,\n\t16909: 0x00005B32,\n\t16910: 0x00005B23,\n\t16911: 0x00005B2C,\n\t16912: 0x00005B27,\n\t16913: 0x00005B26,\n\t16914: 0x00005B2F,\n\t16915: 0x00005B2E,\n\t16916: 0x00005B7B,\n\t16917: 0x00005BF1,\n\t16918: 0x00005BF2,\n\t16919: 0x00005DB7,\n\t16920: 0x00005E6C,\n\t16921: 0x00005E6A,\n\t16922: 0x00005FBE,\n\t16923: 0x00005FBB,\n\t16924: 0x000061C3,\n\t16925: 0x000061B5,\n\t16926: 0x000061BC,\n\t16927: 0x000061E7,\n\t16928: 0x000061E0,\n\t16929: 0x000061E5,\n\t16930: 0x000061E4,\n\t16931: 0x000061E8,\n\t16932: 0x000061DE,\n\t16933: 0x000064EF,\n\t16934: 0x000064E9,\n\t16935: 0x000064E3,\n\t16936: 0x000064EB,\n\t16937: 0x000064E4,\n\t16938: 0x000064E8,\n\t16939: 0x00006581,\n\t16940: 0x00006580,\n\t16941: 0x000065B6,\n\t16942: 0x000065DA,\n\t16943: 0x000066D2,\n\t16944: 0x00006A8D,\n\t16945: 0x00006A96,\n\t16946: 0x00006A81,\n\t16947: 0x00006AA5,\n\t16948: 0x00006A89,\n\t16949: 0x00006A9F,\n\t16950: 0x00006A9B,\n\t16951: 0x00006AA1,\n\t16952: 0x00006A9E,\n\t16953: 0x00006A87,\n\t16954: 0x00006A93,\n\t16955: 0x00006A8E,\n\t16956: 0x00006A95,\n\t16957: 0x00006A83,\n\t16958: 0x00006AA8,\n\t16959: 0x00006AA4,\n\t16960: 0x00006A91,\n\t16961: 0x00006A7F,\n\t16962: 0x00006AA6,\n\t16963: 0x00006A9A,\n\t16964: 0x00006A85,\n\t16965: 0x00006A8C,\n\t16966: 0x00006A92,\n\t16967: 0x00006B5B,\n\t16968: 0x00006BAD,\n\t16969: 0x00006C09,\n\t16970: 0x00006FCC,\n\t16971: 0x00006FA9,\n\t16972: 0x00006FF4,\n\t16973: 0x00006FD4,\n\t16974: 0x00006FE3,\n\t16975: 0x00006FDC,\n\t16976: 0x00006FED,\n\t16977: 0x00006FE7,\n\t16978: 0x00006FE6,\n\t16979: 0x00006FDE,\n\t16980: 0x00006FF2,\n\t16981: 0x00006FDD,\n\t16982: 0x00006FE2,\n\t16983: 0x00006FE8,\n\t16984: 0x000071E1,\n\t16985: 0x000071F1,\n\t16986: 0x000071E8,\n\t16987: 0x000071F2,\n\t16988: 0x000071E4,\n\t16989: 0x000071F0,\n\t16990: 0x000071E2,\n\t16991: 0x00007373,\n\t16992: 0x0000736E,\n\t16993: 0x0000736F,\n\t16994: 0x00007497,\n\t16995: 0x000074B2,\n\t16996: 0x000074AB,\n\t16997: 0x00007490,\n\t16998: 0x000074AA,\n\t16999: 0x000074AD,\n\t17000: 0x000074B1,\n\t17001: 0x000074A5,\n\t17002: 0x000074AF,\n\t17003: 0x00007510,\n\t17004: 0x00007511,\n\t17005: 0x00007512,\n\t17006: 0x0000750F,\n\t17007: 0x00007584,\n\t17008: 0x00007643,\n\t17009: 0x00007648,\n\t17010: 0x00007649,\n\t17011: 0x00007647,\n\t17012: 0x000076A4,\n\t17013: 0x000076E9,\n\t17014: 0x000077B5,\n\t17015: 0x000077AB,\n\t17016: 0x000077B2,\n\t17017: 0x000077B7,\n\t17018: 0x000077B6,\n\t17019: 0x000077B4,\n\t17020: 0x000077B1,\n\t17021: 0x000077A8,\n\t17022: 0x000077F0,\n\t17023: 0x000078F3,\n\t17024: 0x000078FD,\n\t17025: 0x00007902,\n\t17026: 0x000078FB,\n\t17027: 0x000078FC,\n\t17028: 0x000078F2,\n\t17029: 0x00007905,\n\t17030: 0x000078F9,\n\t17031: 0x000078FE,\n\t17032: 0x00007904,\n\t17033: 0x000079AB,\n\t17034: 0x000079A8,\n\t17035: 0x00007A5C,\n\t17036: 0x00007A5B,\n\t17037: 0x00007A56,\n\t17038: 0x00007A58,\n\t17039: 0x00007A54,\n\t17040: 0x00007A5A,\n\t17041: 0x00007ABE,\n\t17042: 0x00007AC0,\n\t17043: 0x00007AC1,\n\t17044: 0x00007C05,\n\t17045: 0x00007C0F,\n\t17046: 0x00007BF2,\n\t17047: 0x00007C00,\n\t17048: 0x00007BFF,\n\t17049: 0x00007BFB,\n\t17050: 0x00007C0E,\n\t17051: 0x00007BF4,\n\t17052: 0x00007C0B,\n\t17053: 0x00007BF3,\n\t17054: 0x00007C02,\n\t17055: 0x00007C09,\n\t17056: 0x00007C03,\n\t17057: 0x00007C01,\n\t17058: 0x00007BF8,\n\t17059: 0x00007BFD,\n\t17060: 0x00007C06,\n\t17061: 0x00007BF0,\n\t17062: 0x00007BF1,\n\t17063: 0x00007C10,\n\t17064: 0x00007C0A,\n\t17065: 0x00007CE8,\n\t17066: 0x00007E2D,\n\t17067: 0x00007E3C,\n\t17068: 0x00007E42,\n\t17069: 0x00007E33,\n\t17070: 0x00009848,\n\t17071: 0x00007E38,\n\t17072: 0x00007E2A,\n\t17073: 0x00007E49,\n\t17074: 0x00007E40,\n\t17075: 0x00007E47,\n\t17076: 0x00007E29,\n\t17077: 0x00007E4C,\n\t17078: 0x00007E30,\n\t17079: 0x00007E3B,\n\t17080: 0x00007E36,\n\t17081: 0x00007E44,\n\t17082: 0x00007E3A,\n\t17083: 0x00007F45,\n\t17084: 0x00007F7F,\n\t17085: 0x00007F7E,\n\t17086: 0x00007F7D,\n\t17087: 0x00007FF4,\n\t17088: 0x00007FF2,\n\t17089: 0x0000802C,\n\t17090: 0x000081BB,\n\t17091: 0x000081C4,\n\t17092: 0x000081CC,\n\t17093: 0x000081CA,\n\t17094: 0x000081C5,\n\t17095: 0x000081C7,\n\t17096: 0x000081BC,\n\t17097: 0x000081E9,\n\t17098: 0x0000825B,\n\t17099: 0x0000825A,\n\t17100: 0x0000825C,\n\t17101: 0x00008583,\n\t17102: 0x00008580,\n\t17103: 0x0000858F,\n\t17104: 0x000085A7,\n\t17105: 0x00008595,\n\t17106: 0x000085A0,\n\t17107: 0x0000858B,\n\t17108: 0x000085A3,\n\t17109: 0x0000857B,\n\t17110: 0x000085A4,\n\t17111: 0x0000859A,\n\t17112: 0x0000859E,\n\t17113: 0x00008577,\n\t17114: 0x0000857C,\n\t17115: 0x00008589,\n\t17116: 0x000085A1,\n\t17117: 0x0000857A,\n\t17118: 0x00008578,\n\t17119: 0x00008557,\n\t17120: 0x0000858E,\n\t17121: 0x00008596,\n\t17122: 0x00008586,\n\t17123: 0x0000858D,\n\t17124: 0x00008599,\n\t17125: 0x0000859D,\n\t17126: 0x00008581,\n\t17127: 0x000085A2,\n\t17128: 0x00008582,\n\t17129: 0x00008588,\n\t17130: 0x00008585,\n\t17131: 0x00008579,\n\t17132: 0x00008576,\n\t17133: 0x00008598,\n\t17134: 0x00008590,\n\t17135: 0x0000859F,\n\t17136: 0x00008668,\n\t17137: 0x000087BE,\n\t17138: 0x000087AA,\n\t17139: 0x000087AD,\n\t17140: 0x000087C5,\n\t17141: 0x000087B0,\n\t17142: 0x000087AC,\n\t17143: 0x000087B9,\n\t17144: 0x000087B5,\n\t17145: 0x000087BC,\n\t17146: 0x000087AE,\n\t17147: 0x000087C9,\n\t17148: 0x000087C3,\n\t17149: 0x000087C2,\n\t17150: 0x000087CC,\n\t17151: 0x000087B7,\n\t17152: 0x000087AF,\n\t17153: 0x000087C4,\n\t17154: 0x000087CA,\n\t17155: 0x000087B4,\n\t17156: 0x000087B6,\n\t17157: 0x000087BF,\n\t17158: 0x000087B8,\n\t17159: 0x000087BD,\n\t17160: 0x000087DE,\n\t17161: 0x000087B2,\n\t17162: 0x00008935,\n\t17163: 0x00008933,\n\t17164: 0x0000893C,\n\t17165: 0x0000893E,\n\t17166: 0x00008941,\n\t17167: 0x00008952,\n\t17168: 0x00008937,\n\t17169: 0x00008942,\n\t17170: 0x000089AD,\n\t17171: 0x000089AF,\n\t17172: 0x000089AE,\n\t17173: 0x000089F2,\n\t17174: 0x000089F3,\n\t17175: 0x00008B1E,\n\t17176: 0x00008B18,\n\t17177: 0x00008B16,\n\t17178: 0x00008B11,\n\t17179: 0x00008B05,\n\t17180: 0x00008B0B,\n\t17181: 0x00008B22,\n\t17182: 0x00008B0F,\n\t17183: 0x00008B12,\n\t17184: 0x00008B15,\n\t17185: 0x00008B07,\n\t17186: 0x00008B0D,\n\t17187: 0x00008B08,\n\t17188: 0x00008B06,\n\t17189: 0x00008B1C,\n\t17190: 0x00008B13,\n\t17191: 0x00008B1A,\n\t17192: 0x00008C4F,\n\t17193: 0x00008C70,\n\t17194: 0x00008C72,\n\t17195: 0x00008C71,\n\t17196: 0x00008C6F,\n\t17197: 0x00008C95,\n\t17198: 0x00008C94,\n\t17199: 0x00008CF9,\n\t17200: 0x00008D6F,\n\t17201: 0x00008E4E,\n\t17202: 0x00008E4D,\n\t17203: 0x00008E53,\n\t17204: 0x00008E50,\n\t17205: 0x00008E4C,\n\t17206: 0x00008E47,\n\t17207: 0x00008F43,\n\t17208: 0x00008F40,\n\t17209: 0x00009085,\n\t17210: 0x0000907E,\n\t17211: 0x00009138,\n\t17212: 0x0000919A,\n\t17213: 0x000091A2,\n\t17214: 0x0000919B,\n\t17215: 0x00009199,\n\t17216: 0x0000919F,\n\t17217: 0x000091A1,\n\t17218: 0x0000919D,\n\t17219: 0x000091A0,\n\t17220: 0x000093A1,\n\t17221: 0x00009383,\n\t17222: 0x000093AF,\n\t17223: 0x00009364,\n\t17224: 0x00009356,\n\t17225: 0x00009347,\n\t17226: 0x0000937C,\n\t17227: 0x00009358,\n\t17228: 0x0000935C,\n\t17229: 0x00009376,\n\t17230: 0x00009349,\n\t17231: 0x00009350,\n\t17232: 0x00009351,\n\t17233: 0x00009360,\n\t17234: 0x0000936D,\n\t17235: 0x0000938F,\n\t17236: 0x0000934C,\n\t17237: 0x0000936A,\n\t17238: 0x00009379,\n\t17239: 0x00009357,\n\t17240: 0x00009355,\n\t17241: 0x00009352,\n\t17242: 0x0000934F,\n\t17243: 0x00009371,\n\t17244: 0x00009377,\n\t17245: 0x0000937B,\n\t17246: 0x00009361,\n\t17247: 0x0000935E,\n\t17248: 0x00009363,\n\t17249: 0x00009367,\n\t17250: 0x00009380,\n\t17251: 0x0000934E,\n\t17252: 0x00009359,\n\t17253: 0x000095C7,\n\t17254: 0x000095C0,\n\t17255: 0x000095C9,\n\t17256: 0x000095C3,\n\t17257: 0x000095C5,\n\t17258: 0x000095B7,\n\t17259: 0x000096AE,\n\t17260: 0x000096B0,\n\t17261: 0x000096AC,\n\t17262: 0x00009720,\n\t17263: 0x0000971F,\n\t17264: 0x00009718,\n\t17265: 0x0000971D,\n\t17266: 0x00009719,\n\t17267: 0x0000979A,\n\t17268: 0x000097A1,\n\t17269: 0x0000979C,\n\t17270: 0x0000979E,\n\t17271: 0x0000979D,\n\t17272: 0x000097D5,\n\t17273: 0x000097D4,\n\t17274: 0x000097F1,\n\t17275: 0x00009841,\n\t17276: 0x00009844,\n\t17277: 0x0000984A,\n\t17278: 0x00009849,\n\t17279: 0x00009845,\n\t17280: 0x00009843,\n\t17281: 0x00009925,\n\t17282: 0x0000992B,\n\t17283: 0x0000992C,\n\t17284: 0x0000992A,\n\t17285: 0x00009933,\n\t17286: 0x00009932,\n\t17287: 0x0000992F,\n\t17288: 0x0000992D,\n\t17289: 0x00009931,\n\t17290: 0x00009930,\n\t17291: 0x00009998,\n\t17292: 0x000099A3,\n\t17293: 0x000099A1,\n\t17294: 0x00009A02,\n\t17295: 0x000099FA,\n\t17296: 0x000099F4,\n\t17297: 0x000099F7,\n\t17298: 0x000099F9,\n\t17299: 0x000099F8,\n\t17300: 0x000099F6,\n\t17301: 0x000099FB,\n\t17302: 0x000099FD,\n\t17303: 0x000099FE,\n\t17304: 0x000099FC,\n\t17305: 0x00009A03,\n\t17306: 0x00009ABE,\n\t17307: 0x00009AFE,\n\t17308: 0x00009AFD,\n\t17309: 0x00009B01,\n\t17310: 0x00009AFC,\n\t17311: 0x00009B48,\n\t17312: 0x00009B9A,\n\t17313: 0x00009BA8,\n\t17314: 0x00009B9E,\n\t17315: 0x00009B9B,\n\t17316: 0x00009BA6,\n\t17317: 0x00009BA1,\n\t17318: 0x00009BA5,\n\t17319: 0x00009BA4,\n\t17320: 0x00009B86,\n\t17321: 0x00009BA2,\n\t17322: 0x00009BA0,\n\t17323: 0x00009BAF,\n\t17324: 0x00009D33,\n\t17325: 0x00009D41,\n\t17326: 0x00009D67,\n\t17327: 0x00009D36,\n\t17328: 0x00009D2E,\n\t17329: 0x00009D2F,\n\t17330: 0x00009D31,\n\t17331: 0x00009D38,\n\t17332: 0x00009D30,\n\t17333: 0x00009D45,\n\t17334: 0x00009D42,\n\t17335: 0x00009D43,\n\t17336: 0x00009D3E,\n\t17337: 0x00009D37,\n\t17338: 0x00009D40,\n\t17339: 0x00009D3D,\n\t17340: 0x00007FF5,\n\t17341: 0x00009D2D,\n\t17342: 0x00009E8A,\n\t17343: 0x00009E89,\n\t17344: 0x00009E8D,\n\t17345: 0x00009EB0,\n\t17346: 0x00009EC8,\n\t17347: 0x00009EDA,\n\t17348: 0x00009EFB,\n\t17349: 0x00009EFF,\n\t17350: 0x00009F24,\n\t17351: 0x00009F23,\n\t17352: 0x00009F22,\n\t17353: 0x00009F54,\n\t17354: 0x00009FA0,\n\t17355: 0x00005131,\n\t17356: 0x0000512D,\n\t17357: 0x0000512E,\n\t17358: 0x00005698,\n\t17359: 0x0000569C,\n\t17360: 0x00005697,\n\t17361: 0x0000569A,\n\t17362: 0x0000569D,\n\t17363: 0x00005699,\n\t17364: 0x00005970,\n\t17365: 0x00005B3C,\n\t17366: 0x00005C69,\n\t17367: 0x00005C6A,\n\t17368: 0x00005DC0,\n\t17369: 0x00005E6D,\n\t17370: 0x00005E6E,\n\t17371: 0x000061D8,\n\t17372: 0x000061DF,\n\t17373: 0x000061ED,\n\t17374: 0x000061EE,\n\t17375: 0x000061F1,\n\t17376: 0x000061EA,\n\t17377: 0x000061F0,\n\t17378: 0x000061EB,\n\t17379: 0x000061D6,\n\t17380: 0x000061E9,\n\t17381: 0x000064FF,\n\t17382: 0x00006504,\n\t17383: 0x000064FD,\n\t17384: 0x000064F8,\n\t17385: 0x00006501,\n\t17386: 0x00006503,\n\t17387: 0x000064FC,\n\t17388: 0x00006594,\n\t17389: 0x000065DB,\n\t17390: 0x000066DA,\n\t17391: 0x000066DB,\n\t17392: 0x000066D8,\n\t17393: 0x00006AC5,\n\t17394: 0x00006AB9,\n\t17395: 0x00006ABD,\n\t17396: 0x00006AE1,\n\t17397: 0x00006AC6,\n\t17398: 0x00006ABA,\n\t17399: 0x00006AB6,\n\t17400: 0x00006AB7,\n\t17401: 0x00006AC7,\n\t17402: 0x00006AB4,\n\t17403: 0x00006AAD,\n\t17404: 0x00006B5E,\n\t17405: 0x00006BC9,\n\t17406: 0x00006C0B,\n\t17407: 0x00007007,\n\t17408: 0x0000700C,\n\t17409: 0x0000700D,\n\t17410: 0x00007001,\n\t17411: 0x00007005,\n\t17412: 0x00007014,\n\t17413: 0x0000700E,\n\t17414: 0x00006FFF,\n\t17415: 0x00007000,\n\t17416: 0x00006FFB,\n\t17417: 0x00007026,\n\t17418: 0x00006FFC,\n\t17419: 0x00006FF7,\n\t17420: 0x0000700A,\n\t17421: 0x00007201,\n\t17422: 0x000071FF,\n\t17423: 0x000071F9,\n\t17424: 0x00007203,\n\t17425: 0x000071FD,\n\t17426: 0x00007376,\n\t17427: 0x000074B8,\n\t17428: 0x000074C0,\n\t17429: 0x000074B5,\n\t17430: 0x000074C1,\n\t17431: 0x000074BE,\n\t17432: 0x000074B6,\n\t17433: 0x000074BB,\n\t17434: 0x000074C2,\n\t17435: 0x00007514,\n\t17436: 0x00007513,\n\t17437: 0x0000765C,\n\t17438: 0x00007664,\n\t17439: 0x00007659,\n\t17440: 0x00007650,\n\t17441: 0x00007653,\n\t17442: 0x00007657,\n\t17443: 0x0000765A,\n\t17444: 0x000076A6,\n\t17445: 0x000076BD,\n\t17446: 0x000076EC,\n\t17447: 0x000077C2,\n\t17448: 0x000077BA,\n\t17449: 0x000078FF,\n\t17450: 0x0000790C,\n\t17451: 0x00007913,\n\t17452: 0x00007914,\n\t17453: 0x00007909,\n\t17454: 0x00007910,\n\t17455: 0x00007912,\n\t17456: 0x00007911,\n\t17457: 0x000079AD,\n\t17458: 0x000079AC,\n\t17459: 0x00007A5F,\n\t17460: 0x00007C1C,\n\t17461: 0x00007C29,\n\t17462: 0x00007C19,\n\t17463: 0x00007C20,\n\t17464: 0x00007C1F,\n\t17465: 0x00007C2D,\n\t17466: 0x00007C1D,\n\t17467: 0x00007C26,\n\t17468: 0x00007C28,\n\t17469: 0x00007C22,\n\t17470: 0x00007C25,\n\t17471: 0x00007C30,\n\t17472: 0x00007E5C,\n\t17473: 0x00007E50,\n\t17474: 0x00007E56,\n\t17475: 0x00007E63,\n\t17476: 0x00007E58,\n\t17477: 0x00007E62,\n\t17478: 0x00007E5F,\n\t17479: 0x00007E51,\n\t17480: 0x00007E60,\n\t17481: 0x00007E57,\n\t17482: 0x00007E53,\n\t17483: 0x00007FB5,\n\t17484: 0x00007FB3,\n\t17485: 0x00007FF7,\n\t17486: 0x00007FF8,\n\t17487: 0x00008075,\n\t17488: 0x000081D1,\n\t17489: 0x000081D2,\n\t17490: 0x000081D0,\n\t17491: 0x0000825F,\n\t17492: 0x0000825E,\n\t17493: 0x000085B4,\n\t17494: 0x000085C6,\n\t17495: 0x000085C0,\n\t17496: 0x000085C3,\n\t17497: 0x000085C2,\n\t17498: 0x000085B3,\n\t17499: 0x000085B5,\n\t17500: 0x000085BD,\n\t17501: 0x000085C7,\n\t17502: 0x000085C4,\n\t17503: 0x000085BF,\n\t17504: 0x000085CB,\n\t17505: 0x000085CE,\n\t17506: 0x000085C8,\n\t17507: 0x000085C5,\n\t17508: 0x000085B1,\n\t17509: 0x000085B6,\n\t17510: 0x000085D2,\n\t17511: 0x00008624,\n\t17512: 0x000085B8,\n\t17513: 0x000085B7,\n\t17514: 0x000085BE,\n\t17515: 0x00008669,\n\t17516: 0x000087E7,\n\t17517: 0x000087E6,\n\t17518: 0x000087E2,\n\t17519: 0x000087DB,\n\t17520: 0x000087EB,\n\t17521: 0x000087EA,\n\t17522: 0x000087E5,\n\t17523: 0x000087DF,\n\t17524: 0x000087F3,\n\t17525: 0x000087E4,\n\t17526: 0x000087D4,\n\t17527: 0x000087DC,\n\t17528: 0x000087D3,\n\t17529: 0x000087ED,\n\t17530: 0x000087D8,\n\t17531: 0x000087E3,\n\t17532: 0x000087A4,\n\t17533: 0x000087D7,\n\t17534: 0x000087D9,\n\t17535: 0x00008801,\n\t17536: 0x000087F4,\n\t17537: 0x000087E8,\n\t17538: 0x000087DD,\n\t17539: 0x00008953,\n\t17540: 0x0000894B,\n\t17541: 0x0000894F,\n\t17542: 0x0000894C,\n\t17543: 0x00008946,\n\t17544: 0x00008950,\n\t17545: 0x00008951,\n\t17546: 0x00008949,\n\t17547: 0x00008B2A,\n\t17548: 0x00008B27,\n\t17549: 0x00008B23,\n\t17550: 0x00008B33,\n\t17551: 0x00008B30,\n\t17552: 0x00008B35,\n\t17553: 0x00008B47,\n\t17554: 0x00008B2F,\n\t17555: 0x00008B3C,\n\t17556: 0x00008B3E,\n\t17557: 0x00008B31,\n\t17558: 0x00008B25,\n\t17559: 0x00008B37,\n\t17560: 0x00008B26,\n\t17561: 0x00008B36,\n\t17562: 0x00008B2E,\n\t17563: 0x00008B24,\n\t17564: 0x00008B3B,\n\t17565: 0x00008B3D,\n\t17566: 0x00008B3A,\n\t17567: 0x00008C42,\n\t17568: 0x00008C75,\n\t17569: 0x00008C99,\n\t17570: 0x00008C98,\n\t17571: 0x00008C97,\n\t17572: 0x00008CFE,\n\t17573: 0x00008D04,\n\t17574: 0x00008D02,\n\t17575: 0x00008D00,\n\t17576: 0x00008E5C,\n\t17577: 0x00008E62,\n\t17578: 0x00008E60,\n\t17579: 0x00008E57,\n\t17580: 0x00008E56,\n\t17581: 0x00008E5E,\n\t17582: 0x00008E65,\n\t17583: 0x00008E67,\n\t17584: 0x00008E5B,\n\t17585: 0x00008E5A,\n\t17586: 0x00008E61,\n\t17587: 0x00008E5D,\n\t17588: 0x00008E69,\n\t17589: 0x00008E54,\n\t17590: 0x00008F46,\n\t17591: 0x00008F47,\n\t17592: 0x00008F48,\n\t17593: 0x00008F4B,\n\t17594: 0x00009128,\n\t17595: 0x0000913A,\n\t17596: 0x0000913B,\n\t17597: 0x0000913E,\n\t17598: 0x000091A8,\n\t17599: 0x000091A5,\n\t17600: 0x000091A7,\n\t17601: 0x000091AF,\n\t17602: 0x000091AA,\n\t17603: 0x000093B5,\n\t17604: 0x0000938C,\n\t17605: 0x00009392,\n\t17606: 0x000093B7,\n\t17607: 0x0000939B,\n\t17608: 0x0000939D,\n\t17609: 0x00009389,\n\t17610: 0x000093A7,\n\t17611: 0x0000938E,\n\t17612: 0x000093AA,\n\t17613: 0x0000939E,\n\t17614: 0x000093A6,\n\t17615: 0x00009395,\n\t17616: 0x00009388,\n\t17617: 0x00009399,\n\t17618: 0x0000939F,\n\t17619: 0x0000938D,\n\t17620: 0x000093B1,\n\t17621: 0x00009391,\n\t17622: 0x000093B2,\n\t17623: 0x000093A4,\n\t17624: 0x000093A8,\n\t17625: 0x000093B4,\n\t17626: 0x000093A3,\n\t17627: 0x000093A5,\n\t17628: 0x000095D2,\n\t17629: 0x000095D3,\n\t17630: 0x000095D1,\n\t17631: 0x000096B3,\n\t17632: 0x000096D7,\n\t17633: 0x000096DA,\n\t17634: 0x00005DC2,\n\t17635: 0x000096DF,\n\t17636: 0x000096D8,\n\t17637: 0x000096DD,\n\t17638: 0x00009723,\n\t17639: 0x00009722,\n\t17640: 0x00009725,\n\t17641: 0x000097AC,\n\t17642: 0x000097AE,\n\t17643: 0x000097A8,\n\t17644: 0x000097AB,\n\t17645: 0x000097A4,\n\t17646: 0x000097AA,\n\t17647: 0x000097A2,\n\t17648: 0x000097A5,\n\t17649: 0x000097D7,\n\t17650: 0x000097D9,\n\t17651: 0x000097D6,\n\t17652: 0x000097D8,\n\t17653: 0x000097FA,\n\t17654: 0x00009850,\n\t17655: 0x00009851,\n\t17656: 0x00009852,\n\t17657: 0x000098B8,\n\t17658: 0x00009941,\n\t17659: 0x0000993C,\n\t17660: 0x0000993A,\n\t17661: 0x00009A0F,\n\t17662: 0x00009A0B,\n\t17663: 0x00009A09,\n\t17664: 0x00009A0D,\n\t17665: 0x00009A04,\n\t17666: 0x00009A11,\n\t17667: 0x00009A0A,\n\t17668: 0x00009A05,\n\t17669: 0x00009A07,\n\t17670: 0x00009A06,\n\t17671: 0x00009AC0,\n\t17672: 0x00009ADC,\n\t17673: 0x00009B08,\n\t17674: 0x00009B04,\n\t17675: 0x00009B05,\n\t17676: 0x00009B29,\n\t17677: 0x00009B35,\n\t17678: 0x00009B4A,\n\t17679: 0x00009B4C,\n\t17680: 0x00009B4B,\n\t17681: 0x00009BC7,\n\t17682: 0x00009BC6,\n\t17683: 0x00009BC3,\n\t17684: 0x00009BBF,\n\t17685: 0x00009BC1,\n\t17686: 0x00009BB5,\n\t17687: 0x00009BB8,\n\t17688: 0x00009BD3,\n\t17689: 0x00009BB6,\n\t17690: 0x00009BC4,\n\t17691: 0x00009BB9,\n\t17692: 0x00009BBD,\n\t17693: 0x00009D5C,\n\t17694: 0x00009D53,\n\t17695: 0x00009D4F,\n\t17696: 0x00009D4A,\n\t17697: 0x00009D5B,\n\t17698: 0x00009D4B,\n\t17699: 0x00009D59,\n\t17700: 0x00009D56,\n\t17701: 0x00009D4C,\n\t17702: 0x00009D57,\n\t17703: 0x00009D52,\n\t17704: 0x00009D54,\n\t17705: 0x00009D5F,\n\t17706: 0x00009D58,\n\t17707: 0x00009D5A,\n\t17708: 0x00009E8E,\n\t17709: 0x00009E8C,\n\t17710: 0x00009EDF,\n\t17711: 0x00009F01,\n\t17712: 0x00009F00,\n\t17713: 0x00009F16,\n\t17714: 0x00009F25,\n\t17715: 0x00009F2B,\n\t17716: 0x00009F2A,\n\t17717: 0x00009F29,\n\t17718: 0x00009F28,\n\t17719: 0x00009F4C,\n\t17720: 0x00009F55,\n\t17721: 0x00005134,\n\t17722: 0x00005135,\n\t17723: 0x00005296,\n\t17724: 0x000052F7,\n\t17725: 0x000053B4,\n\t17726: 0x000056AB,\n\t17727: 0x000056AD,\n\t17728: 0x000056A6,\n\t17729: 0x000056A7,\n\t17730: 0x000056AA,\n\t17731: 0x000056AC,\n\t17732: 0x000058DA,\n\t17733: 0x000058DD,\n\t17734: 0x000058DB,\n\t17735: 0x00005912,\n\t17736: 0x00005B3D,\n\t17737: 0x00005B3E,\n\t17738: 0x00005B3F,\n\t17739: 0x00005DC3,\n\t17740: 0x00005E70,\n\t17741: 0x00005FBF,\n\t17742: 0x000061FB,\n\t17743: 0x00006507,\n\t17744: 0x00006510,\n\t17745: 0x0000650D,\n\t17746: 0x00006509,\n\t17747: 0x0000650C,\n\t17748: 0x0000650E,\n\t17749: 0x00006584,\n\t17750: 0x000065DE,\n\t17751: 0x000065DD,\n\t17752: 0x000066DE,\n\t17753: 0x00006AE7,\n\t17754: 0x00006AE0,\n\t17755: 0x00006ACC,\n\t17756: 0x00006AD1,\n\t17757: 0x00006AD9,\n\t17758: 0x00006ACB,\n\t17759: 0x00006ADF,\n\t17760: 0x00006ADC,\n\t17761: 0x00006AD0,\n\t17762: 0x00006AEB,\n\t17763: 0x00006ACF,\n\t17764: 0x00006ACD,\n\t17765: 0x00006ADE,\n\t17766: 0x00006B60,\n\t17767: 0x00006BB0,\n\t17768: 0x00006C0C,\n\t17769: 0x00007019,\n\t17770: 0x00007027,\n\t17771: 0x00007020,\n\t17772: 0x00007016,\n\t17773: 0x0000702B,\n\t17774: 0x00007021,\n\t17775: 0x00007022,\n\t17776: 0x00007023,\n\t17777: 0x00007029,\n\t17778: 0x00007017,\n\t17779: 0x00007024,\n\t17780: 0x0000701C,\n\t17781: 0x0000702A,\n\t17782: 0x0000720C,\n\t17783: 0x0000720A,\n\t17784: 0x00007207,\n\t17785: 0x00007202,\n\t17786: 0x00007205,\n\t17787: 0x000072A5,\n\t17788: 0x000072A6,\n\t17789: 0x000072A4,\n\t17790: 0x000072A3,\n\t17791: 0x000072A1,\n\t17792: 0x000074CB,\n\t17793: 0x000074C5,\n\t17794: 0x000074B7,\n\t17795: 0x000074C3,\n\t17796: 0x00007516,\n\t17797: 0x00007660,\n\t17798: 0x000077C9,\n\t17799: 0x000077CA,\n\t17800: 0x000077C4,\n\t17801: 0x000077F1,\n\t17802: 0x0000791D,\n\t17803: 0x0000791B,\n\t17804: 0x00007921,\n\t17805: 0x0000791C,\n\t17806: 0x00007917,\n\t17807: 0x0000791E,\n\t17808: 0x000079B0,\n\t17809: 0x00007A67,\n\t17810: 0x00007A68,\n\t17811: 0x00007C33,\n\t17812: 0x00007C3C,\n\t17813: 0x00007C39,\n\t17814: 0x00007C2C,\n\t17815: 0x00007C3B,\n\t17816: 0x00007CEC,\n\t17817: 0x00007CEA,\n\t17818: 0x00007E76,\n\t17819: 0x00007E75,\n\t17820: 0x00007E78,\n\t17821: 0x00007E70,\n\t17822: 0x00007E77,\n\t17823: 0x00007E6F,\n\t17824: 0x00007E7A,\n\t17825: 0x00007E72,\n\t17826: 0x00007E74,\n\t17827: 0x00007E68,\n\t17828: 0x00007F4B,\n\t17829: 0x00007F4A,\n\t17830: 0x00007F83,\n\t17831: 0x00007F86,\n\t17832: 0x00007FB7,\n\t17833: 0x00007FFD,\n\t17834: 0x00007FFE,\n\t17835: 0x00008078,\n\t17836: 0x000081D7,\n\t17837: 0x000081D5,\n\t17838: 0x00008264,\n\t17839: 0x00008261,\n\t17840: 0x00008263,\n\t17841: 0x000085EB,\n\t17842: 0x000085F1,\n\t17843: 0x000085ED,\n\t17844: 0x000085D9,\n\t17845: 0x000085E1,\n\t17846: 0x000085E8,\n\t17847: 0x000085DA,\n\t17848: 0x000085D7,\n\t17849: 0x000085EC,\n\t17850: 0x000085F2,\n\t17851: 0x000085F8,\n\t17852: 0x000085D8,\n\t17853: 0x000085DF,\n\t17854: 0x000085E3,\n\t17855: 0x000085DC,\n\t17856: 0x000085D1,\n\t17857: 0x000085F0,\n\t17858: 0x000085E6,\n\t17859: 0x000085EF,\n\t17860: 0x000085DE,\n\t17861: 0x000085E2,\n\t17862: 0x00008800,\n\t17863: 0x000087FA,\n\t17864: 0x00008803,\n\t17865: 0x000087F6,\n\t17866: 0x000087F7,\n\t17867: 0x00008809,\n\t17868: 0x0000880C,\n\t17869: 0x0000880B,\n\t17870: 0x00008806,\n\t17871: 0x000087FC,\n\t17872: 0x00008808,\n\t17873: 0x000087FF,\n\t17874: 0x0000880A,\n\t17875: 0x00008802,\n\t17876: 0x00008962,\n\t17877: 0x0000895A,\n\t17878: 0x0000895B,\n\t17879: 0x00008957,\n\t17880: 0x00008961,\n\t17881: 0x0000895C,\n\t17882: 0x00008958,\n\t17883: 0x0000895D,\n\t17884: 0x00008959,\n\t17885: 0x00008988,\n\t17886: 0x000089B7,\n\t17887: 0x000089B6,\n\t17888: 0x000089F6,\n\t17889: 0x00008B50,\n\t17890: 0x00008B48,\n\t17891: 0x00008B4A,\n\t17892: 0x00008B40,\n\t17893: 0x00008B53,\n\t17894: 0x00008B56,\n\t17895: 0x00008B54,\n\t17896: 0x00008B4B,\n\t17897: 0x00008B55,\n\t17898: 0x00008B51,\n\t17899: 0x00008B42,\n\t17900: 0x00008B52,\n\t17901: 0x00008B57,\n\t17902: 0x00008C43,\n\t17903: 0x00008C77,\n\t17904: 0x00008C76,\n\t17905: 0x00008C9A,\n\t17906: 0x00008D06,\n\t17907: 0x00008D07,\n\t17908: 0x00008D09,\n\t17909: 0x00008DAC,\n\t17910: 0x00008DAA,\n\t17911: 0x00008DAD,\n\t17912: 0x00008DAB,\n\t17913: 0x00008E6D,\n\t17914: 0x00008E78,\n\t17915: 0x00008E73,\n\t17916: 0x00008E6A,\n\t17917: 0x00008E6F,\n\t17918: 0x00008E7B,\n\t17919: 0x00008EC2,\n\t17920: 0x00008F52,\n\t17921: 0x00008F51,\n\t17922: 0x00008F4F,\n\t17923: 0x00008F50,\n\t17924: 0x00008F53,\n\t17925: 0x00008FB4,\n\t17926: 0x00009140,\n\t17927: 0x0000913F,\n\t17928: 0x000091B0,\n\t17929: 0x000091AD,\n\t17930: 0x000093DE,\n\t17931: 0x000093C7,\n\t17932: 0x000093CF,\n\t17933: 0x000093C2,\n\t17934: 0x000093DA,\n\t17935: 0x000093D0,\n\t17936: 0x000093F9,\n\t17937: 0x000093EC,\n\t17938: 0x000093CC,\n\t17939: 0x000093D9,\n\t17940: 0x000093A9,\n\t17941: 0x000093E6,\n\t17942: 0x000093CA,\n\t17943: 0x000093D4,\n\t17944: 0x000093EE,\n\t17945: 0x000093E3,\n\t17946: 0x000093D5,\n\t17947: 0x000093C4,\n\t17948: 0x000093CE,\n\t17949: 0x000093C0,\n\t17950: 0x000093D2,\n\t17951: 0x000093E7,\n\t17952: 0x0000957D,\n\t17953: 0x000095DA,\n\t17954: 0x000095DB,\n\t17955: 0x000096E1,\n\t17956: 0x00009729,\n\t17957: 0x0000972B,\n\t17958: 0x0000972C,\n\t17959: 0x00009728,\n\t17960: 0x00009726,\n\t17961: 0x000097B3,\n\t17962: 0x000097B7,\n\t17963: 0x000097B6,\n\t17964: 0x000097DD,\n\t17965: 0x000097DE,\n\t17966: 0x000097DF,\n\t17967: 0x0000985C,\n\t17968: 0x00009859,\n\t17969: 0x0000985D,\n\t17970: 0x00009857,\n\t17971: 0x000098BF,\n\t17972: 0x000098BD,\n\t17973: 0x000098BB,\n\t17974: 0x000098BE,\n\t17975: 0x00009948,\n\t17976: 0x00009947,\n\t17977: 0x00009943,\n\t17978: 0x000099A6,\n\t17979: 0x000099A7,\n\t17980: 0x00009A1A,\n\t17981: 0x00009A15,\n\t17982: 0x00009A25,\n\t17983: 0x00009A1D,\n\t17984: 0x00009A24,\n\t17985: 0x00009A1B,\n\t17986: 0x00009A22,\n\t17987: 0x00009A20,\n\t17988: 0x00009A27,\n\t17989: 0x00009A23,\n\t17990: 0x00009A1E,\n\t17991: 0x00009A1C,\n\t17992: 0x00009A14,\n\t17993: 0x00009AC2,\n\t17994: 0x00009B0B,\n\t17995: 0x00009B0A,\n\t17996: 0x00009B0E,\n\t17997: 0x00009B0C,\n\t17998: 0x00009B37,\n\t17999: 0x00009BEA,\n\t18000: 0x00009BEB,\n\t18001: 0x00009BE0,\n\t18002: 0x00009BDE,\n\t18003: 0x00009BE4,\n\t18004: 0x00009BE6,\n\t18005: 0x00009BE2,\n\t18006: 0x00009BF0,\n\t18007: 0x00009BD4,\n\t18008: 0x00009BD7,\n\t18009: 0x00009BEC,\n\t18010: 0x00009BDC,\n\t18011: 0x00009BD9,\n\t18012: 0x00009BE5,\n\t18013: 0x00009BD5,\n\t18014: 0x00009BE1,\n\t18015: 0x00009BDA,\n\t18016: 0x00009D77,\n\t18017: 0x00009D81,\n\t18018: 0x00009D8A,\n\t18019: 0x00009D84,\n\t18020: 0x00009D88,\n\t18021: 0x00009D71,\n\t18022: 0x00009D80,\n\t18023: 0x00009D78,\n\t18024: 0x00009D86,\n\t18025: 0x00009D8B,\n\t18026: 0x00009D8C,\n\t18027: 0x00009D7D,\n\t18028: 0x00009D6B,\n\t18029: 0x00009D74,\n\t18030: 0x00009D75,\n\t18031: 0x00009D70,\n\t18032: 0x00009D69,\n\t18033: 0x00009D85,\n\t18034: 0x00009D73,\n\t18035: 0x00009D7B,\n\t18036: 0x00009D82,\n\t18037: 0x00009D6F,\n\t18038: 0x00009D79,\n\t18039: 0x00009D7F,\n\t18040: 0x00009D87,\n\t18041: 0x00009D68,\n\t18042: 0x00009E94,\n\t18043: 0x00009E91,\n\t18044: 0x00009EC0,\n\t18045: 0x00009EFC,\n\t18046: 0x00009F2D,\n\t18047: 0x00009F40,\n\t18048: 0x00009F41,\n\t18049: 0x00009F4D,\n\t18050: 0x00009F56,\n\t18051: 0x00009F57,\n\t18052: 0x00009F58,\n\t18053: 0x00005337,\n\t18054: 0x000056B2,\n\t18055: 0x000056B5,\n\t18056: 0x000056B3,\n\t18057: 0x000058E3,\n\t18058: 0x00005B45,\n\t18059: 0x00005DC6,\n\t18060: 0x00005DC7,\n\t18061: 0x00005EEE,\n\t18062: 0x00005EEF,\n\t18063: 0x00005FC0,\n\t18064: 0x00005FC1,\n\t18065: 0x000061F9,\n\t18066: 0x00006517,\n\t18067: 0x00006516,\n\t18068: 0x00006515,\n\t18069: 0x00006513,\n\t18070: 0x000065DF,\n\t18071: 0x000066E8,\n\t18072: 0x000066E3,\n\t18073: 0x000066E4,\n\t18074: 0x00006AF3,\n\t18075: 0x00006AF0,\n\t18076: 0x00006AEA,\n\t18077: 0x00006AE8,\n\t18078: 0x00006AF9,\n\t18079: 0x00006AF1,\n\t18080: 0x00006AEE,\n\t18081: 0x00006AEF,\n\t18082: 0x0000703C,\n\t18083: 0x00007035,\n\t18084: 0x0000702F,\n\t18085: 0x00007037,\n\t18086: 0x00007034,\n\t18087: 0x00007031,\n\t18088: 0x00007042,\n\t18089: 0x00007038,\n\t18090: 0x0000703F,\n\t18091: 0x0000703A,\n\t18092: 0x00007039,\n\t18093: 0x00007040,\n\t18094: 0x0000703B,\n\t18095: 0x00007033,\n\t18096: 0x00007041,\n\t18097: 0x00007213,\n\t18098: 0x00007214,\n\t18099: 0x000072A8,\n\t18100: 0x0000737D,\n\t18101: 0x0000737C,\n\t18102: 0x000074BA,\n\t18103: 0x000076AB,\n\t18104: 0x000076AA,\n\t18105: 0x000076BE,\n\t18106: 0x000076ED,\n\t18107: 0x000077CC,\n\t18108: 0x000077CE,\n\t18109: 0x000077CF,\n\t18110: 0x000077CD,\n\t18111: 0x000077F2,\n\t18112: 0x00007925,\n\t18113: 0x00007923,\n\t18114: 0x00007927,\n\t18115: 0x00007928,\n\t18116: 0x00007924,\n\t18117: 0x00007929,\n\t18118: 0x000079B2,\n\t18119: 0x00007A6E,\n\t18120: 0x00007A6C,\n\t18121: 0x00007A6D,\n\t18122: 0x00007AF7,\n\t18123: 0x00007C49,\n\t18124: 0x00007C48,\n\t18125: 0x00007C4A,\n\t18126: 0x00007C47,\n\t18127: 0x00007C45,\n\t18128: 0x00007CEE,\n\t18129: 0x00007E7B,\n\t18130: 0x00007E7E,\n\t18131: 0x00007E81,\n\t18132: 0x00007E80,\n\t18133: 0x00007FBA,\n\t18134: 0x00007FFF,\n\t18135: 0x00008079,\n\t18136: 0x000081DB,\n\t18137: 0x000081D9,\n\t18138: 0x0000820B,\n\t18139: 0x00008268,\n\t18140: 0x00008269,\n\t18141: 0x00008622,\n\t18142: 0x000085FF,\n\t18143: 0x00008601,\n\t18144: 0x000085FE,\n\t18145: 0x0000861B,\n\t18146: 0x00008600,\n\t18147: 0x000085F6,\n\t18148: 0x00008604,\n\t18149: 0x00008609,\n\t18150: 0x00008605,\n\t18151: 0x0000860C,\n\t18152: 0x000085FD,\n\t18153: 0x00008819,\n\t18154: 0x00008810,\n\t18155: 0x00008811,\n\t18156: 0x00008817,\n\t18157: 0x00008813,\n\t18158: 0x00008816,\n\t18159: 0x00008963,\n\t18160: 0x00008966,\n\t18161: 0x000089B9,\n\t18162: 0x000089F7,\n\t18163: 0x00008B60,\n\t18164: 0x00008B6A,\n\t18165: 0x00008B5D,\n\t18166: 0x00008B68,\n\t18167: 0x00008B63,\n\t18168: 0x00008B65,\n\t18169: 0x00008B67,\n\t18170: 0x00008B6D,\n\t18171: 0x00008DAE,\n\t18172: 0x00008E86,\n\t18173: 0x00008E88,\n\t18174: 0x00008E84,\n\t18175: 0x00008F59,\n\t18176: 0x00008F56,\n\t18177: 0x00008F57,\n\t18178: 0x00008F55,\n\t18179: 0x00008F58,\n\t18180: 0x00008F5A,\n\t18181: 0x0000908D,\n\t18182: 0x00009143,\n\t18183: 0x00009141,\n\t18184: 0x000091B7,\n\t18185: 0x000091B5,\n\t18186: 0x000091B2,\n\t18187: 0x000091B3,\n\t18188: 0x0000940B,\n\t18189: 0x00009413,\n\t18190: 0x000093FB,\n\t18191: 0x00009420,\n\t18192: 0x0000940F,\n\t18193: 0x00009414,\n\t18194: 0x000093FE,\n\t18195: 0x00009415,\n\t18196: 0x00009410,\n\t18197: 0x00009428,\n\t18198: 0x00009419,\n\t18199: 0x0000940D,\n\t18200: 0x000093F5,\n\t18201: 0x00009400,\n\t18202: 0x000093F7,\n\t18203: 0x00009407,\n\t18204: 0x0000940E,\n\t18205: 0x00009416,\n\t18206: 0x00009412,\n\t18207: 0x000093FA,\n\t18208: 0x00009409,\n\t18209: 0x000093F8,\n\t18210: 0x0000940A,\n\t18211: 0x000093FF,\n\t18212: 0x000093FC,\n\t18213: 0x0000940C,\n\t18214: 0x000093F6,\n\t18215: 0x00009411,\n\t18216: 0x00009406,\n\t18217: 0x000095DE,\n\t18218: 0x000095E0,\n\t18219: 0x000095DF,\n\t18220: 0x0000972E,\n\t18221: 0x0000972F,\n\t18222: 0x000097B9,\n\t18223: 0x000097BB,\n\t18224: 0x000097FD,\n\t18225: 0x000097FE,\n\t18226: 0x00009860,\n\t18227: 0x00009862,\n\t18228: 0x00009863,\n\t18229: 0x0000985F,\n\t18230: 0x000098C1,\n\t18231: 0x000098C2,\n\t18232: 0x00009950,\n\t18233: 0x0000994E,\n\t18234: 0x00009959,\n\t18235: 0x0000994C,\n\t18236: 0x0000994B,\n\t18237: 0x00009953,\n\t18238: 0x00009A32,\n\t18239: 0x00009A34,\n\t18240: 0x00009A31,\n\t18241: 0x00009A2C,\n\t18242: 0x00009A2A,\n\t18243: 0x00009A36,\n\t18244: 0x00009A29,\n\t18245: 0x00009A2E,\n\t18246: 0x00009A38,\n\t18247: 0x00009A2D,\n\t18248: 0x00009AC7,\n\t18249: 0x00009ACA,\n\t18250: 0x00009AC6,\n\t18251: 0x00009B10,\n\t18252: 0x00009B12,\n\t18253: 0x00009B11,\n\t18254: 0x00009C0B,\n\t18255: 0x00009C08,\n\t18256: 0x00009BF7,\n\t18257: 0x00009C05,\n\t18258: 0x00009C12,\n\t18259: 0x00009BF8,\n\t18260: 0x00009C40,\n\t18261: 0x00009C07,\n\t18262: 0x00009C0E,\n\t18263: 0x00009C06,\n\t18264: 0x00009C17,\n\t18265: 0x00009C14,\n\t18266: 0x00009C09,\n\t18267: 0x00009D9F,\n\t18268: 0x00009D99,\n\t18269: 0x00009DA4,\n\t18270: 0x00009D9D,\n\t18271: 0x00009D92,\n\t18272: 0x00009D98,\n\t18273: 0x00009D90,\n\t18274: 0x00009D9B,\n\t18275: 0x00009DA0,\n\t18276: 0x00009D94,\n\t18277: 0x00009D9C,\n\t18278: 0x00009DAA,\n\t18279: 0x00009D97,\n\t18280: 0x00009DA1,\n\t18281: 0x00009D9A,\n\t18282: 0x00009DA2,\n\t18283: 0x00009DA8,\n\t18284: 0x00009D9E,\n\t18285: 0x00009DA3,\n\t18286: 0x00009DBF,\n\t18287: 0x00009DA9,\n\t18288: 0x00009D96,\n\t18289: 0x00009DA6,\n\t18290: 0x00009DA7,\n\t18291: 0x00009E99,\n\t18292: 0x00009E9B,\n\t18293: 0x00009E9A,\n\t18294: 0x00009EE5,\n\t18295: 0x00009EE4,\n\t18296: 0x00009EE7,\n\t18297: 0x00009EE6,\n\t18298: 0x00009F30,\n\t18299: 0x00009F2E,\n\t18300: 0x00009F5B,\n\t18301: 0x00009F60,\n\t18302: 0x00009F5E,\n\t18303: 0x00009F5D,\n\t18304: 0x00009F59,\n\t18305: 0x00009F91,\n\t18306: 0x0000513A,\n\t18307: 0x00005139,\n\t18308: 0x00005298,\n\t18309: 0x00005297,\n\t18310: 0x000056C3,\n\t18311: 0x000056BD,\n\t18312: 0x000056BE,\n\t18313: 0x00005B48,\n\t18314: 0x00005B47,\n\t18315: 0x00005DCB,\n\t18316: 0x00005DCF,\n\t18317: 0x00005EF1,\n\t18318: 0x000061FD,\n\t18319: 0x0000651B,\n\t18320: 0x00006B02,\n\t18321: 0x00006AFC,\n\t18322: 0x00006B03,\n\t18323: 0x00006AF8,\n\t18324: 0x00006B00,\n\t18325: 0x00007043,\n\t18326: 0x00007044,\n\t18327: 0x0000704A,\n\t18328: 0x00007048,\n\t18329: 0x00007049,\n\t18330: 0x00007045,\n\t18331: 0x00007046,\n\t18332: 0x0000721D,\n\t18333: 0x0000721A,\n\t18334: 0x00007219,\n\t18335: 0x0000737E,\n\t18336: 0x00007517,\n\t18337: 0x0000766A,\n\t18338: 0x000077D0,\n\t18339: 0x0000792D,\n\t18340: 0x00007931,\n\t18341: 0x0000792F,\n\t18342: 0x00007C54,\n\t18343: 0x00007C53,\n\t18344: 0x00007CF2,\n\t18345: 0x00007E8A,\n\t18346: 0x00007E87,\n\t18347: 0x00007E88,\n\t18348: 0x00007E8B,\n\t18349: 0x00007E86,\n\t18350: 0x00007E8D,\n\t18351: 0x00007F4D,\n\t18352: 0x00007FBB,\n\t18353: 0x00008030,\n\t18354: 0x000081DD,\n\t18355: 0x00008618,\n\t18356: 0x0000862A,\n\t18357: 0x00008626,\n\t18358: 0x0000861F,\n\t18359: 0x00008623,\n\t18360: 0x0000861C,\n\t18361: 0x00008619,\n\t18362: 0x00008627,\n\t18363: 0x0000862E,\n\t18364: 0x00008621,\n\t18365: 0x00008620,\n\t18366: 0x00008629,\n\t18367: 0x0000861E,\n\t18368: 0x00008625,\n\t18369: 0x00008829,\n\t18370: 0x0000881D,\n\t18371: 0x0000881B,\n\t18372: 0x00008820,\n\t18373: 0x00008824,\n\t18374: 0x0000881C,\n\t18375: 0x0000882B,\n\t18376: 0x0000884A,\n\t18377: 0x0000896D,\n\t18378: 0x00008969,\n\t18379: 0x0000896E,\n\t18380: 0x0000896B,\n\t18381: 0x000089FA,\n\t18382: 0x00008B79,\n\t18383: 0x00008B78,\n\t18384: 0x00008B45,\n\t18385: 0x00008B7A,\n\t18386: 0x00008B7B,\n\t18387: 0x00008D10,\n\t18388: 0x00008D14,\n\t18389: 0x00008DAF,\n\t18390: 0x00008E8E,\n\t18391: 0x00008E8C,\n\t18392: 0x00008F5E,\n\t18393: 0x00008F5B,\n\t18394: 0x00008F5D,\n\t18395: 0x00009146,\n\t18396: 0x00009144,\n\t18397: 0x00009145,\n\t18398: 0x000091B9,\n\t18399: 0x0000943F,\n\t18400: 0x0000943B,\n\t18401: 0x00009436,\n\t18402: 0x00009429,\n\t18403: 0x0000943D,\n\t18404: 0x0000943C,\n\t18405: 0x00009430,\n\t18406: 0x00009439,\n\t18407: 0x0000942A,\n\t18408: 0x00009437,\n\t18409: 0x0000942C,\n\t18410: 0x00009440,\n\t18411: 0x00009431,\n\t18412: 0x000095E5,\n\t18413: 0x000095E4,\n\t18414: 0x000095E3,\n\t18415: 0x00009735,\n\t18416: 0x0000973A,\n\t18417: 0x000097BF,\n\t18418: 0x000097E1,\n\t18419: 0x00009864,\n\t18420: 0x000098C9,\n\t18421: 0x000098C6,\n\t18422: 0x000098C0,\n\t18423: 0x00009958,\n\t18424: 0x00009956,\n\t18425: 0x00009A39,\n\t18426: 0x00009A3D,\n\t18427: 0x00009A46,\n\t18428: 0x00009A44,\n\t18429: 0x00009A42,\n\t18430: 0x00009A41,\n\t18431: 0x00009A3A,\n\t18432: 0x00009A3F,\n\t18433: 0x00009ACD,\n\t18434: 0x00009B15,\n\t18435: 0x00009B17,\n\t18436: 0x00009B18,\n\t18437: 0x00009B16,\n\t18438: 0x00009B3A,\n\t18439: 0x00009B52,\n\t18440: 0x00009C2B,\n\t18441: 0x00009C1D,\n\t18442: 0x00009C1C,\n\t18443: 0x00009C2C,\n\t18444: 0x00009C23,\n\t18445: 0x00009C28,\n\t18446: 0x00009C29,\n\t18447: 0x00009C24,\n\t18448: 0x00009C21,\n\t18449: 0x00009DB7,\n\t18450: 0x00009DB6,\n\t18451: 0x00009DBC,\n\t18452: 0x00009DC1,\n\t18453: 0x00009DC7,\n\t18454: 0x00009DCA,\n\t18455: 0x00009DCF,\n\t18456: 0x00009DBE,\n\t18457: 0x00009DC5,\n\t18458: 0x00009DC3,\n\t18459: 0x00009DBB,\n\t18460: 0x00009DB5,\n\t18461: 0x00009DCE,\n\t18462: 0x00009DB9,\n\t18463: 0x00009DBA,\n\t18464: 0x00009DAC,\n\t18465: 0x00009DC8,\n\t18466: 0x00009DB1,\n\t18467: 0x00009DAD,\n\t18468: 0x00009DCC,\n\t18469: 0x00009DB3,\n\t18470: 0x00009DCD,\n\t18471: 0x00009DB2,\n\t18472: 0x00009E7A,\n\t18473: 0x00009E9C,\n\t18474: 0x00009EEB,\n\t18475: 0x00009EEE,\n\t18476: 0x00009EED,\n\t18477: 0x00009F1B,\n\t18478: 0x00009F18,\n\t18479: 0x00009F1A,\n\t18480: 0x00009F31,\n\t18481: 0x00009F4E,\n\t18482: 0x00009F65,\n\t18483: 0x00009F64,\n\t18484: 0x00009F92,\n\t18485: 0x00004EB9,\n\t18486: 0x000056C6,\n\t18487: 0x000056C5,\n\t18488: 0x000056CB,\n\t18489: 0x00005971,\n\t18490: 0x00005B4B,\n\t18491: 0x00005B4C,\n\t18492: 0x00005DD5,\n\t18493: 0x00005DD1,\n\t18494: 0x00005EF2,\n\t18495: 0x00006521,\n\t18496: 0x00006520,\n\t18497: 0x00006526,\n\t18498: 0x00006522,\n\t18499: 0x00006B0B,\n\t18500: 0x00006B08,\n\t18501: 0x00006B09,\n\t18502: 0x00006C0D,\n\t18503: 0x00007055,\n\t18504: 0x00007056,\n\t18505: 0x00007057,\n\t18506: 0x00007052,\n\t18507: 0x0000721E,\n\t18508: 0x0000721F,\n\t18509: 0x000072A9,\n\t18510: 0x0000737F,\n\t18511: 0x000074D8,\n\t18512: 0x000074D5,\n\t18513: 0x000074D9,\n\t18514: 0x000074D7,\n\t18515: 0x0000766D,\n\t18516: 0x000076AD,\n\t18517: 0x00007935,\n\t18518: 0x000079B4,\n\t18519: 0x00007A70,\n\t18520: 0x00007A71,\n\t18521: 0x00007C57,\n\t18522: 0x00007C5C,\n\t18523: 0x00007C59,\n\t18524: 0x00007C5B,\n\t18525: 0x00007C5A,\n\t18526: 0x00007CF4,\n\t18527: 0x00007CF1,\n\t18528: 0x00007E91,\n\t18529: 0x00007F4F,\n\t18530: 0x00007F87,\n\t18531: 0x000081DE,\n\t18532: 0x0000826B,\n\t18533: 0x00008634,\n\t18534: 0x00008635,\n\t18535: 0x00008633,\n\t18536: 0x0000862C,\n\t18537: 0x00008632,\n\t18538: 0x00008636,\n\t18539: 0x0000882C,\n\t18540: 0x00008828,\n\t18541: 0x00008826,\n\t18542: 0x0000882A,\n\t18543: 0x00008825,\n\t18544: 0x00008971,\n\t18545: 0x000089BF,\n\t18546: 0x000089BE,\n\t18547: 0x000089FB,\n\t18548: 0x00008B7E,\n\t18549: 0x00008B84,\n\t18550: 0x00008B82,\n\t18551: 0x00008B86,\n\t18552: 0x00008B85,\n\t18553: 0x00008B7F,\n\t18554: 0x00008D15,\n\t18555: 0x00008E95,\n\t18556: 0x00008E94,\n\t18557: 0x00008E9A,\n\t18558: 0x00008E92,\n\t18559: 0x00008E90,\n\t18560: 0x00008E96,\n\t18561: 0x00008E97,\n\t18562: 0x00008F60,\n\t18563: 0x00008F62,\n\t18564: 0x00009147,\n\t18565: 0x0000944C,\n\t18566: 0x00009450,\n\t18567: 0x0000944A,\n\t18568: 0x0000944B,\n\t18569: 0x0000944F,\n\t18570: 0x00009447,\n\t18571: 0x00009445,\n\t18572: 0x00009448,\n\t18573: 0x00009449,\n\t18574: 0x00009446,\n\t18575: 0x0000973F,\n\t18576: 0x000097E3,\n\t18577: 0x0000986A,\n\t18578: 0x00009869,\n\t18579: 0x000098CB,\n\t18580: 0x00009954,\n\t18581: 0x0000995B,\n\t18582: 0x00009A4E,\n\t18583: 0x00009A53,\n\t18584: 0x00009A54,\n\t18585: 0x00009A4C,\n\t18586: 0x00009A4F,\n\t18587: 0x00009A48,\n\t18588: 0x00009A4A,\n\t18589: 0x00009A49,\n\t18590: 0x00009A52,\n\t18591: 0x00009A50,\n\t18592: 0x00009AD0,\n\t18593: 0x00009B19,\n\t18594: 0x00009B2B,\n\t18595: 0x00009B3B,\n\t18596: 0x00009B56,\n\t18597: 0x00009B55,\n\t18598: 0x00009C46,\n\t18599: 0x00009C48,\n\t18600: 0x00009C3F,\n\t18601: 0x00009C44,\n\t18602: 0x00009C39,\n\t18603: 0x00009C33,\n\t18604: 0x00009C41,\n\t18605: 0x00009C3C,\n\t18606: 0x00009C37,\n\t18607: 0x00009C34,\n\t18608: 0x00009C32,\n\t18609: 0x00009C3D,\n\t18610: 0x00009C36,\n\t18611: 0x00009DDB,\n\t18612: 0x00009DD2,\n\t18613: 0x00009DDE,\n\t18614: 0x00009DDA,\n\t18615: 0x00009DCB,\n\t18616: 0x00009DD0,\n\t18617: 0x00009DDC,\n\t18618: 0x00009DD1,\n\t18619: 0x00009DDF,\n\t18620: 0x00009DE9,\n\t18621: 0x00009DD9,\n\t18622: 0x00009DD8,\n\t18623: 0x00009DD6,\n\t18624: 0x00009DF5,\n\t18625: 0x00009DD5,\n\t18626: 0x00009DDD,\n\t18627: 0x00009EB6,\n\t18628: 0x00009EF0,\n\t18629: 0x00009F35,\n\t18630: 0x00009F33,\n\t18631: 0x00009F32,\n\t18632: 0x00009F42,\n\t18633: 0x00009F6B,\n\t18634: 0x00009F95,\n\t18635: 0x00009FA2,\n\t18636: 0x0000513D,\n\t18637: 0x00005299,\n\t18638: 0x000058E8,\n\t18639: 0x000058E7,\n\t18640: 0x00005972,\n\t18641: 0x00005B4D,\n\t18642: 0x00005DD8,\n\t18643: 0x0000882F,\n\t18644: 0x00005F4F,\n\t18645: 0x00006201,\n\t18646: 0x00006203,\n\t18647: 0x00006204,\n\t18648: 0x00006529,\n\t18649: 0x00006525,\n\t18650: 0x00006596,\n\t18651: 0x000066EB,\n\t18652: 0x00006B11,\n\t18653: 0x00006B12,\n\t18654: 0x00006B0F,\n\t18655: 0x00006BCA,\n\t18656: 0x0000705B,\n\t18657: 0x0000705A,\n\t18658: 0x00007222,\n\t18659: 0x00007382,\n\t18660: 0x00007381,\n\t18661: 0x00007383,\n\t18662: 0x00007670,\n\t18663: 0x000077D4,\n\t18664: 0x00007C67,\n\t18665: 0x00007C66,\n\t18666: 0x00007E95,\n\t18667: 0x0000826C,\n\t18668: 0x0000863A,\n\t18669: 0x00008640,\n\t18670: 0x00008639,\n\t18671: 0x0000863C,\n\t18672: 0x00008631,\n\t18673: 0x0000863B,\n\t18674: 0x0000863E,\n\t18675: 0x00008830,\n\t18676: 0x00008832,\n\t18677: 0x0000882E,\n\t18678: 0x00008833,\n\t18679: 0x00008976,\n\t18680: 0x00008974,\n\t18681: 0x00008973,\n\t18682: 0x000089FE,\n\t18683: 0x00008B8C,\n\t18684: 0x00008B8E,\n\t18685: 0x00008B8B,\n\t18686: 0x00008B88,\n\t18687: 0x00008C45,\n\t18688: 0x00008D19,\n\t18689: 0x00008E98,\n\t18690: 0x00008F64,\n\t18691: 0x00008F63,\n\t18692: 0x000091BC,\n\t18693: 0x00009462,\n\t18694: 0x00009455,\n\t18695: 0x0000945D,\n\t18696: 0x00009457,\n\t18697: 0x0000945E,\n\t18698: 0x000097C4,\n\t18699: 0x000097C5,\n\t18700: 0x00009800,\n\t18701: 0x00009A56,\n\t18702: 0x00009A59,\n\t18703: 0x00009B1E,\n\t18704: 0x00009B1F,\n\t18705: 0x00009B20,\n\t18706: 0x00009C52,\n\t18707: 0x00009C58,\n\t18708: 0x00009C50,\n\t18709: 0x00009C4A,\n\t18710: 0x00009C4D,\n\t18711: 0x00009C4B,\n\t18712: 0x00009C55,\n\t18713: 0x00009C59,\n\t18714: 0x00009C4C,\n\t18715: 0x00009C4E,\n\t18716: 0x00009DFB,\n\t18717: 0x00009DF7,\n\t18718: 0x00009DEF,\n\t18719: 0x00009DE3,\n\t18720: 0x00009DEB,\n\t18721: 0x00009DF8,\n\t18722: 0x00009DE4,\n\t18723: 0x00009DF6,\n\t18724: 0x00009DE1,\n\t18725: 0x00009DEE,\n\t18726: 0x00009DE6,\n\t18727: 0x00009DF2,\n\t18728: 0x00009DF0,\n\t18729: 0x00009DE2,\n\t18730: 0x00009DEC,\n\t18731: 0x00009DF4,\n\t18732: 0x00009DF3,\n\t18733: 0x00009DE8,\n\t18734: 0x00009DED,\n\t18735: 0x00009EC2,\n\t18736: 0x00009ED0,\n\t18737: 0x00009EF2,\n\t18738: 0x00009EF3,\n\t18739: 0x00009F06,\n\t18740: 0x00009F1C,\n\t18741: 0x00009F38,\n\t18742: 0x00009F37,\n\t18743: 0x00009F36,\n\t18744: 0x00009F43,\n\t18745: 0x00009F4F,\n\t18746: 0x00009F71,\n\t18747: 0x00009F70,\n\t18748: 0x00009F6E,\n\t18749: 0x00009F6F,\n\t18750: 0x000056D3,\n\t18751: 0x000056CD,\n\t18752: 0x00005B4E,\n\t18753: 0x00005C6D,\n\t18754: 0x0000652D,\n\t18755: 0x000066ED,\n\t18756: 0x000066EE,\n\t18757: 0x00006B13,\n\t18758: 0x0000705F,\n\t18759: 0x00007061,\n\t18760: 0x0000705D,\n\t18761: 0x00007060,\n\t18762: 0x00007223,\n\t18763: 0x000074DB,\n\t18764: 0x000074E5,\n\t18765: 0x000077D5,\n\t18766: 0x00007938,\n\t18767: 0x000079B7,\n\t18768: 0x000079B6,\n\t18769: 0x00007C6A,\n\t18770: 0x00007E97,\n\t18771: 0x00007F89,\n\t18772: 0x0000826D,\n\t18773: 0x00008643,\n\t18774: 0x00008838,\n\t18775: 0x00008837,\n\t18776: 0x00008835,\n\t18777: 0x0000884B,\n\t18778: 0x00008B94,\n\t18779: 0x00008B95,\n\t18780: 0x00008E9E,\n\t18781: 0x00008E9F,\n\t18782: 0x00008EA0,\n\t18783: 0x00008E9D,\n\t18784: 0x000091BE,\n\t18785: 0x000091BD,\n\t18786: 0x000091C2,\n\t18787: 0x0000946B,\n\t18788: 0x00009468,\n\t18789: 0x00009469,\n\t18790: 0x000096E5,\n\t18791: 0x00009746,\n\t18792: 0x00009743,\n\t18793: 0x00009747,\n\t18794: 0x000097C7,\n\t18795: 0x000097E5,\n\t18796: 0x00009A5E,\n\t18797: 0x00009AD5,\n\t18798: 0x00009B59,\n\t18799: 0x00009C63,\n\t18800: 0x00009C67,\n\t18801: 0x00009C66,\n\t18802: 0x00009C62,\n\t18803: 0x00009C5E,\n\t18804: 0x00009C60,\n\t18805: 0x00009E02,\n\t18806: 0x00009DFE,\n\t18807: 0x00009E07,\n\t18808: 0x00009E03,\n\t18809: 0x00009E06,\n\t18810: 0x00009E05,\n\t18811: 0x00009E00,\n\t18812: 0x00009E01,\n\t18813: 0x00009E09,\n\t18814: 0x00009DFF,\n\t18815: 0x00009DFD,\n\t18816: 0x00009E04,\n\t18817: 0x00009EA0,\n\t18818: 0x00009F1E,\n\t18819: 0x00009F46,\n\t18820: 0x00009F74,\n\t18821: 0x00009F75,\n\t18822: 0x00009F76,\n\t18823: 0x000056D4,\n\t18824: 0x0000652E,\n\t18825: 0x000065B8,\n\t18826: 0x00006B18,\n\t18827: 0x00006B19,\n\t18828: 0x00006B17,\n\t18829: 0x00006B1A,\n\t18830: 0x00007062,\n\t18831: 0x00007226,\n\t18832: 0x000072AA,\n\t18833: 0x000077D8,\n\t18834: 0x000077D9,\n\t18835: 0x00007939,\n\t18836: 0x00007C69,\n\t18837: 0x00007C6B,\n\t18838: 0x00007CF6,\n\t18839: 0x00007E9A,\n\t18840: 0x00007E98,\n\t18841: 0x00007E9B,\n\t18842: 0x00007E99,\n\t18843: 0x000081E0,\n\t18844: 0x000081E1,\n\t18845: 0x00008646,\n\t18846: 0x00008647,\n\t18847: 0x00008648,\n\t18848: 0x00008979,\n\t18849: 0x0000897A,\n\t18850: 0x0000897C,\n\t18851: 0x0000897B,\n\t18852: 0x000089FF,\n\t18853: 0x00008B98,\n\t18854: 0x00008B99,\n\t18855: 0x00008EA5,\n\t18856: 0x00008EA4,\n\t18857: 0x00008EA3,\n\t18858: 0x0000946E,\n\t18859: 0x0000946D,\n\t18860: 0x0000946F,\n\t18861: 0x00009471,\n\t18862: 0x00009473,\n\t18863: 0x00009749,\n\t18864: 0x00009872,\n\t18865: 0x0000995F,\n\t18866: 0x00009C68,\n\t18867: 0x00009C6E,\n\t18868: 0x00009C6D,\n\t18869: 0x00009E0B,\n\t18870: 0x00009E0D,\n\t18871: 0x00009E10,\n\t18872: 0x00009E0F,\n\t18873: 0x00009E12,\n\t18874: 0x00009E11,\n\t18875: 0x00009EA1,\n\t18876: 0x00009EF5,\n\t18877: 0x00009F09,\n\t18878: 0x00009F47,\n\t18879: 0x00009F78,\n\t18880: 0x00009F7B,\n\t18881: 0x00009F7A,\n\t18882: 0x00009F79,\n\t18883: 0x0000571E,\n\t18884: 0x00007066,\n\t18885: 0x00007C6F,\n\t18886: 0x0000883C,\n\t18887: 0x00008DB2,\n\t18888: 0x00008EA6,\n\t18889: 0x000091C3,\n\t18890: 0x00009474,\n\t18891: 0x00009478,\n\t18892: 0x00009476,\n\t18893: 0x00009475,\n\t18894: 0x00009A60,\n\t18895: 0x00009C74,\n\t18896: 0x00009C73,\n\t18897: 0x00009C71,\n\t18898: 0x00009C75,\n\t18899: 0x00009E14,\n\t18900: 0x00009E13,\n\t18901: 0x00009EF6,\n\t18902: 0x00009F0A,\n\t18903: 0x00009FA4,\n\t18904: 0x00007068,\n\t18905: 0x00007065,\n\t18906: 0x00007CF7,\n\t18907: 0x0000866A,\n\t18908: 0x0000883E,\n\t18909: 0x0000883D,\n\t18910: 0x0000883F,\n\t18911: 0x00008B9E,\n\t18912: 0x00008C9C,\n\t18913: 0x00008EA9,\n\t18914: 0x00008EC9,\n\t18915: 0x0000974B,\n\t18916: 0x00009873,\n\t18917: 0x00009874,\n\t18918: 0x000098CC,\n\t18919: 0x00009961,\n\t18920: 0x000099AB,\n\t18921: 0x00009A64,\n\t18922: 0x00009A66,\n\t18923: 0x00009A67,\n\t18924: 0x00009B24,\n\t18925: 0x00009E15,\n\t18926: 0x00009E17,\n\t18927: 0x00009F48,\n\t18928: 0x00006207,\n\t18929: 0x00006B1E,\n\t18930: 0x00007227,\n\t18931: 0x0000864C,\n\t18932: 0x00008EA8,\n\t18933: 0x00009482,\n\t18934: 0x00009480,\n\t18935: 0x00009481,\n\t18936: 0x00009A69,\n\t18937: 0x00009A68,\n\t18938: 0x00009B2E,\n\t18939: 0x00009E19,\n\t18940: 0x00007229,\n\t18941: 0x0000864B,\n\t18942: 0x00008B9F,\n\t18943: 0x00009483,\n\t18944: 0x00009C79,\n\t18945: 0x00009EB7,\n\t18946: 0x00007675,\n\t18947: 0x00009A6B,\n\t18948: 0x00009C7A,\n\t18949: 0x00009E1D,\n\t18950: 0x00007069,\n\t18951: 0x0000706A,\n\t18952: 0x00009EA4,\n\t18953: 0x00009F7E,\n\t18954: 0x00009F49,\n\t18955: 0x00009F98,\n\t18956: 0x00007881,\n\t18957: 0x000092B9,\n\t18958: 0x000088CF,\n\t18959: 0x000058BB,\n\t18960: 0x00006052,\n\t18961: 0x00007CA7,\n\t18962: 0x00005AFA,\n\t18963: 0x00002554,\n\t18964: 0x00002566,\n\t18965: 0x00002557,\n\t18966: 0x00002560,\n\t18967: 0x0000256C,\n\t18968: 0x00002563,\n\t18969: 0x0000255A,\n\t18970: 0x00002569,\n\t18971: 0x0000255D,\n\t18972: 0x00002552,\n\t18973: 0x00002564,\n\t18974: 0x00002555,\n\t18975: 0x0000255E,\n\t18976: 0x0000256A,\n\t18977: 0x00002561,\n\t18978: 0x00002558,\n\t18979: 0x00002567,\n\t18980: 0x0000255B,\n\t18981: 0x00002553,\n\t18982: 0x00002565,\n\t18983: 0x00002556,\n\t18984: 0x0000255F,\n\t18985: 0x0000256B,\n\t18986: 0x00002562,\n\t18987: 0x00002559,\n\t18988: 0x00002568,\n\t18989: 0x0000255C,\n\t18990: 0x00002551,\n\t18991: 0x00002550,\n\t18992: 0x0000256D,\n\t18993: 0x0000256E,\n\t18994: 0x00002570,\n\t18995: 0x0000256F,\n\t18996: 0x0000FFED,\n\t18997: 0x00020547,\n\t18998: 0x000092DB,\n\t18999: 0x000205DF,\n\t19000: 0x00023FC5,\n\t19001: 0x0000854C,\n\t19002: 0x000042B5,\n\t19003: 0x000073EF,\n\t19004: 0x000051B5,\n\t19005: 0x00003649,\n\t19006: 0x00024942,\n\t19007: 0x000289E4,\n\t19008: 0x00009344,\n\t19009: 0x000219DB,\n\t19010: 0x000082EE,\n\t19011: 0x00023CC8,\n\t19012: 0x0000783C,\n\t19013: 0x00006744,\n\t19014: 0x000062DF,\n\t19015: 0x00024933,\n\t19016: 0x000289AA,\n\t19017: 0x000202A0,\n\t19018: 0x00026BB3,\n\t19019: 0x00021305,\n\t19020: 0x00004FAB,\n\t19021: 0x000224ED,\n\t19022: 0x00005008,\n\t19023: 0x00026D29,\n\t19024: 0x00027A84,\n\t19025: 0x00023600,\n\t19026: 0x00024AB1,\n\t19027: 0x00022513,\n\t19028: 0x00005029,\n\t19029: 0x0002037E,\n\t19030: 0x00005FA4,\n\t19031: 0x00020380,\n\t19032: 0x00020347,\n\t19033: 0x00006EDB,\n\t19034: 0x0002041F,\n\t19035: 0x0000507D,\n\t19036: 0x00005101,\n\t19037: 0x0000347A,\n\t19038: 0x0000510E,\n\t19039: 0x0000986C,\n\t19040: 0x00003743,\n\t19041: 0x00008416,\n\t19042: 0x000249A4,\n\t19043: 0x00020487,\n\t19044: 0x00005160,\n\t19045: 0x000233B4,\n\t19046: 0x0000516A,\n\t19047: 0x00020BFF,\n\t19048: 0x000220FC,\n\t19049: 0x000202E5,\n\t19050: 0x00022530,\n\t19051: 0x0002058E,\n\t19052: 0x00023233,\n\t19053: 0x00021983,\n\t19054: 0x00005B82,\n\t19055: 0x0000877D,\n\t19056: 0x000205B3,\n\t19057: 0x00023C99,\n\t19058: 0x000051B2,\n\t19059: 0x000051B8,\n\t19060: 0x00009D34,\n\t19061: 0x000051C9,\n\t19062: 0x000051CF,\n\t19063: 0x000051D1,\n\t19064: 0x00003CDC,\n\t19065: 0x000051D3,\n\t19066: 0x00024AA6,\n\t19067: 0x000051B3,\n\t19068: 0x000051E2,\n\t19069: 0x00005342,\n\t19070: 0x000051ED,\n\t19071: 0x000083CD,\n\t19072: 0x0000693E,\n\t19073: 0x0002372D,\n\t19074: 0x00005F7B,\n\t19075: 0x0000520B,\n\t19076: 0x00005226,\n\t19077: 0x0000523C,\n\t19078: 0x000052B5,\n\t19079: 0x00005257,\n\t19080: 0x00005294,\n\t19081: 0x000052B9,\n\t19082: 0x000052C5,\n\t19083: 0x00007C15,\n\t19084: 0x00008542,\n\t19085: 0x000052E0,\n\t19086: 0x0000860D,\n\t19087: 0x00026B13,\n\t19088: 0x00005305,\n\t19089: 0x00028ADE,\n\t19090: 0x00005549,\n\t19091: 0x00006ED9,\n\t19092: 0x00023F80,\n\t19093: 0x00020954,\n\t19094: 0x00023FEC,\n\t19095: 0x00005333,\n\t19096: 0x00005344,\n\t19097: 0x00020BE2,\n\t19098: 0x00006CCB,\n\t19099: 0x00021726,\n\t19100: 0x0000681B,\n\t19101: 0x000073D5,\n\t19102: 0x0000604A,\n\t19103: 0x00003EAA,\n\t19104: 0x000038CC,\n\t19105: 0x000216E8,\n\t19106: 0x000071DD,\n\t19107: 0x000044A2,\n\t19108: 0x0000536D,\n\t19109: 0x00005374,\n\t19110: 0x000286AB,\n\t19111: 0x0000537E,\n\t19112: 0x0000537F,\n\t19113: 0x00021596,\n\t19114: 0x00021613,\n\t19115: 0x000077E6,\n\t19116: 0x00005393,\n\t19117: 0x00028A9B,\n\t19118: 0x000053A0,\n\t19119: 0x000053AB,\n\t19120: 0x000053AE,\n\t19121: 0x000073A7,\n\t19122: 0x00025772,\n\t19123: 0x00003F59,\n\t19124: 0x0000739C,\n\t19125: 0x000053C1,\n\t19126: 0x000053C5,\n\t19127: 0x00006C49,\n\t19128: 0x00004E49,\n\t19129: 0x000057FE,\n\t19130: 0x000053D9,\n\t19131: 0x00003AAB,\n\t19132: 0x00020B8F,\n\t19133: 0x000053E0,\n\t19134: 0x00023FEB,\n\t19135: 0x00022DA3,\n\t19136: 0x000053F6,\n\t19137: 0x00020C77,\n\t19138: 0x00005413,\n\t19139: 0x00007079,\n\t19140: 0x0000552B,\n\t19141: 0x00006657,\n\t19142: 0x00006D5B,\n\t19143: 0x0000546D,\n\t19144: 0x00026B53,\n\t19145: 0x00020D74,\n\t19146: 0x0000555D,\n\t19147: 0x0000548F,\n\t19148: 0x000054A4,\n\t19149: 0x000047A6,\n\t19150: 0x0002170D,\n\t19151: 0x00020EDD,\n\t19152: 0x00003DB4,\n\t19153: 0x00020D4D,\n\t19154: 0x000289BC,\n\t19155: 0x00022698,\n\t19156: 0x00005547,\n\t19157: 0x00004CED,\n\t19158: 0x0000542F,\n\t19159: 0x00007417,\n\t19160: 0x00005586,\n\t19161: 0x000055A9,\n\t19162: 0x00005605,\n\t19163: 0x000218D7,\n\t19164: 0x0002403A,\n\t19165: 0x00004552,\n\t19166: 0x00024435,\n\t19167: 0x000066B3,\n\t19168: 0x000210B4,\n\t19169: 0x00005637,\n\t19170: 0x000066CD,\n\t19171: 0x0002328A,\n\t19172: 0x000066A4,\n\t19173: 0x000066AD,\n\t19174: 0x0000564D,\n\t19175: 0x0000564F,\n\t19176: 0x000078F1,\n\t19177: 0x000056F1,\n\t19178: 0x00009787,\n\t19179: 0x000053FE,\n\t19180: 0x00005700,\n\t19181: 0x000056EF,\n\t19182: 0x000056ED,\n\t19183: 0x00028B66,\n\t19184: 0x00003623,\n\t19185: 0x0002124F,\n\t19186: 0x00005746,\n\t19187: 0x000241A5,\n\t19188: 0x00006C6E,\n\t19189: 0x0000708B,\n\t19190: 0x00005742,\n\t19191: 0x000036B1,\n\t19192: 0x00026C7E,\n\t19193: 0x000057E6,\n\t19194: 0x00021416,\n\t19195: 0x00005803,\n\t19196: 0x00021454,\n\t19197: 0x00024363,\n\t19198: 0x00005826,\n\t19199: 0x00024BF5,\n\t19200: 0x0000585C,\n\t19201: 0x000058AA,\n\t19202: 0x00003561,\n\t19203: 0x000058E0,\n\t19204: 0x000058DC,\n\t19205: 0x0002123C,\n\t19206: 0x000058FB,\n\t19207: 0x00005BFF,\n\t19208: 0x00005743,\n\t19209: 0x0002A150,\n\t19210: 0x00024278,\n\t19211: 0x000093D3,\n\t19212: 0x000035A1,\n\t19213: 0x0000591F,\n\t19214: 0x000068A6,\n\t19215: 0x000036C3,\n\t19216: 0x00006E59,\n\t19217: 0x0002163E,\n\t19218: 0x00005A24,\n\t19219: 0x00005553,\n\t19220: 0x00021692,\n\t19221: 0x00008505,\n\t19222: 0x000059C9,\n\t19223: 0x00020D4E,\n\t19224: 0x00026C81,\n\t19225: 0x00026D2A,\n\t19226: 0x000217DC,\n\t19227: 0x000059D9,\n\t19228: 0x000217FB,\n\t19229: 0x000217B2,\n\t19230: 0x00026DA6,\n\t19231: 0x00006D71,\n\t19232: 0x00021828,\n\t19233: 0x000216D5,\n\t19234: 0x000059F9,\n\t19235: 0x00026E45,\n\t19236: 0x00005AAB,\n\t19237: 0x00005A63,\n\t19238: 0x000036E6,\n\t19239: 0x000249A9,\n\t19240: 0x00005A77,\n\t19241: 0x00003708,\n\t19242: 0x00005A96,\n\t19243: 0x00007465,\n\t19244: 0x00005AD3,\n\t19245: 0x00026FA1,\n\t19246: 0x00022554,\n\t19247: 0x00003D85,\n\t19248: 0x00021911,\n\t19249: 0x00003732,\n\t19250: 0x000216B8,\n\t19251: 0x00005E83,\n\t19252: 0x000052D0,\n\t19253: 0x00005B76,\n\t19254: 0x00006588,\n\t19255: 0x00005B7C,\n\t19256: 0x00027A0E,\n\t19257: 0x00004004,\n\t19258: 0x0000485D,\n\t19259: 0x00020204,\n\t19260: 0x00005BD5,\n\t19261: 0x00006160,\n\t19262: 0x00021A34,\n\t19263: 0x000259CC,\n\t19264: 0x000205A5,\n\t19265: 0x00005BF3,\n\t19266: 0x00005B9D,\n\t19267: 0x00004D10,\n\t19268: 0x00005C05,\n\t19269: 0x00021B44,\n\t19270: 0x00005C13,\n\t19271: 0x000073CE,\n\t19272: 0x00005C14,\n\t19273: 0x00021CA5,\n\t19274: 0x00026B28,\n\t19275: 0x00005C49,\n\t19276: 0x000048DD,\n\t19277: 0x00005C85,\n\t19278: 0x00005CE9,\n\t19279: 0x00005CEF,\n\t19280: 0x00005D8B,\n\t19281: 0x00021DF9,\n\t19282: 0x00021E37,\n\t19283: 0x00005D10,\n\t19284: 0x00005D18,\n\t19285: 0x00005D46,\n\t19286: 0x00021EA4,\n\t19287: 0x00005CBA,\n\t19288: 0x00005DD7,\n\t19289: 0x000082FC,\n\t19290: 0x0000382D,\n\t19291: 0x00024901,\n\t19292: 0x00022049,\n\t19293: 0x00022173,\n\t19294: 0x00008287,\n\t19295: 0x00003836,\n\t19296: 0x00003BC2,\n\t19297: 0x00005E2E,\n\t19298: 0x00006A8A,\n\t19299: 0x00005E75,\n\t19300: 0x00005E7A,\n\t19301: 0x000244BC,\n\t19302: 0x00020CD3,\n\t19303: 0x000053A6,\n\t19304: 0x00004EB7,\n\t19305: 0x00005ED0,\n\t19306: 0x000053A8,\n\t19307: 0x00021771,\n\t19308: 0x00005E09,\n\t19309: 0x00005EF4,\n\t19310: 0x00028482,\n\t19311: 0x00005EF9,\n\t19312: 0x00005EFB,\n\t19313: 0x000038A0,\n\t19314: 0x00005EFC,\n\t19315: 0x0000683E,\n\t19316: 0x0000941B,\n\t19317: 0x00005F0D,\n\t19318: 0x000201C1,\n\t19319: 0x0002F894,\n\t19320: 0x00003ADE,\n\t19321: 0x000048AE,\n\t19322: 0x0002133A,\n\t19323: 0x00005F3A,\n\t19324: 0x00026888,\n\t19325: 0x000223D0,\n\t19326: 0x00005F58,\n\t19327: 0x00022471,\n\t19328: 0x00005F63,\n\t19329: 0x000097BD,\n\t19330: 0x00026E6E,\n\t19331: 0x00005F72,\n\t19332: 0x00009340,\n\t19333: 0x00028A36,\n\t19334: 0x00005FA7,\n\t19335: 0x00005DB6,\n\t19336: 0x00003D5F,\n\t19337: 0x00025250,\n\t19338: 0x00021F6A,\n\t19339: 0x000270F8,\n\t19340: 0x00022668,\n\t19341: 0x000091D6,\n\t19342: 0x0002029E,\n\t19343: 0x00028A29,\n\t19344: 0x00006031,\n\t19345: 0x00006685,\n\t19346: 0x00021877,\n\t19347: 0x00003963,\n\t19348: 0x00003DC7,\n\t19349: 0x00003639,\n\t19350: 0x00005790,\n\t19351: 0x000227B4,\n\t19352: 0x00007971,\n\t19353: 0x00003E40,\n\t19354: 0x0000609E,\n\t19355: 0x000060A4,\n\t19356: 0x000060B3,\n\t19357: 0x00024982,\n\t19358: 0x0002498F,\n\t19359: 0x00027A53,\n\t19360: 0x000074A4,\n\t19361: 0x000050E1,\n\t19362: 0x00005AA0,\n\t19363: 0x00006164,\n\t19364: 0x00008424,\n\t19365: 0x00006142,\n\t19366: 0x0002F8A6,\n\t19367: 0x00026ED2,\n\t19368: 0x00006181,\n\t19369: 0x000051F4,\n\t19370: 0x00020656,\n\t19371: 0x00006187,\n\t19372: 0x00005BAA,\n\t19373: 0x00023FB7,\n\t19374: 0x0002285F,\n\t19375: 0x000061D3,\n\t19376: 0x00028B9D,\n\t19377: 0x0002995D,\n\t19378: 0x000061D0,\n\t19379: 0x00003932,\n\t19380: 0x00022980,\n\t19381: 0x000228C1,\n\t19382: 0x00006023,\n\t19383: 0x0000615C,\n\t19384: 0x0000651E,\n\t19385: 0x0000638B,\n\t19386: 0x00020118,\n\t19387: 0x000062C5,\n\t19388: 0x00021770,\n\t19389: 0x000062D5,\n\t19390: 0x00022E0D,\n\t19391: 0x0000636C,\n\t19392: 0x000249DF,\n\t19393: 0x00003A17,\n\t19394: 0x00006438,\n\t19395: 0x000063F8,\n\t19396: 0x0002138E,\n\t19397: 0x000217FC,\n\t19398: 0x00006490,\n\t19399: 0x00006F8A,\n\t19400: 0x00022E36,\n\t19401: 0x00009814,\n\t19402: 0x0002408C,\n\t19403: 0x0002571D,\n\t19404: 0x000064E1,\n\t19405: 0x000064E5,\n\t19406: 0x0000947B,\n\t19407: 0x00003A66,\n\t19408: 0x0000643A,\n\t19409: 0x00003A57,\n\t19410: 0x0000654D,\n\t19411: 0x00006F16,\n\t19412: 0x00024A28,\n\t19413: 0x00024A23,\n\t19414: 0x00006585,\n\t19415: 0x0000656D,\n\t19416: 0x0000655F,\n\t19417: 0x0002307E,\n\t19418: 0x000065B5,\n\t19419: 0x00024940,\n\t19420: 0x00004B37,\n\t19421: 0x000065D1,\n\t19422: 0x000040D8,\n\t19423: 0x00021829,\n\t19424: 0x000065E0,\n\t19425: 0x000065E3,\n\t19426: 0x00005FDF,\n\t19427: 0x00023400,\n\t19428: 0x00006618,\n\t19429: 0x000231F7,\n\t19430: 0x000231F8,\n\t19431: 0x00006644,\n\t19432: 0x000231A4,\n\t19433: 0x000231A5,\n\t19434: 0x0000664B,\n\t19435: 0x00020E75,\n\t19436: 0x00006667,\n\t19437: 0x000251E6,\n\t19438: 0x00006673,\n\t19439: 0x00006674,\n\t19440: 0x00021E3D,\n\t19441: 0x00023231,\n\t19442: 0x000285F4,\n\t19443: 0x000231C8,\n\t19444: 0x00025313,\n\t19445: 0x000077C5,\n\t19446: 0x000228F7,\n\t19447: 0x000099A4,\n\t19448: 0x00006702,\n\t19449: 0x0002439C,\n\t19450: 0x00024A21,\n\t19451: 0x00003B2B,\n\t19452: 0x000069FA,\n\t19453: 0x000237C2,\n\t19454: 0x0000675E,\n\t19455: 0x00006767,\n\t19456: 0x00006762,\n\t19457: 0x000241CD,\n\t19458: 0x000290ED,\n\t19459: 0x000067D7,\n\t19460: 0x000044E9,\n\t19461: 0x00006822,\n\t19462: 0x00006E50,\n\t19463: 0x0000923C,\n\t19464: 0x00006801,\n\t19465: 0x000233E6,\n\t19466: 0x00026DA0,\n\t19467: 0x0000685D,\n\t19468: 0x0002346F,\n\t19469: 0x000069E1,\n\t19470: 0x00006A0B,\n\t19471: 0x00028ADF,\n\t19472: 0x00006973,\n\t19473: 0x000068C3,\n\t19474: 0x000235CD,\n\t19475: 0x00006901,\n\t19476: 0x00006900,\n\t19477: 0x00003D32,\n\t19478: 0x00003A01,\n\t19479: 0x0002363C,\n\t19480: 0x00003B80,\n\t19481: 0x000067AC,\n\t19482: 0x00006961,\n\t19483: 0x00028A4A,\n\t19484: 0x000042FC,\n\t19485: 0x00006936,\n\t19486: 0x00006998,\n\t19487: 0x00003BA1,\n\t19488: 0x000203C9,\n\t19489: 0x00008363,\n\t19490: 0x00005090,\n\t19491: 0x000069F9,\n\t19492: 0x00023659,\n\t19493: 0x0002212A,\n\t19494: 0x00006A45,\n\t19495: 0x00023703,\n\t19496: 0x00006A9D,\n\t19497: 0x00003BF3,\n\t19498: 0x000067B1,\n\t19499: 0x00006AC8,\n\t19500: 0x0002919C,\n\t19501: 0x00003C0D,\n\t19502: 0x00006B1D,\n\t19503: 0x00020923,\n\t19504: 0x000060DE,\n\t19505: 0x00006B35,\n\t19506: 0x00006B74,\n\t19507: 0x000227CD,\n\t19508: 0x00006EB5,\n\t19509: 0x00023ADB,\n\t19510: 0x000203B5,\n\t19511: 0x00021958,\n\t19512: 0x00003740,\n\t19513: 0x00005421,\n\t19514: 0x00023B5A,\n\t19515: 0x00006BE1,\n\t19516: 0x00023EFC,\n\t19517: 0x00006BDC,\n\t19518: 0x00006C37,\n\t19519: 0x0002248B,\n\t19520: 0x000248F1,\n\t19521: 0x00026B51,\n\t19522: 0x00006C5A,\n\t19523: 0x00008226,\n\t19524: 0x00006C79,\n\t19525: 0x00023DBC,\n\t19526: 0x000044C5,\n\t19527: 0x00023DBD,\n\t19528: 0x000241A4,\n\t19529: 0x0002490C,\n\t19530: 0x00024900,\n\t19531: 0x00023CC9,\n\t19532: 0x000036E5,\n\t19533: 0x00003CEB,\n\t19534: 0x00020D32,\n\t19535: 0x00009B83,\n\t19536: 0x000231F9,\n\t19537: 0x00022491,\n\t19538: 0x00007F8F,\n\t19539: 0x00006837,\n\t19540: 0x00026D25,\n\t19541: 0x00026DA1,\n\t19542: 0x00026DEB,\n\t19543: 0x00006D96,\n\t19544: 0x00006D5C,\n\t19545: 0x00006E7C,\n\t19546: 0x00006F04,\n\t19547: 0x0002497F,\n\t19548: 0x00024085,\n\t19549: 0x00026E72,\n\t19550: 0x00008533,\n\t19551: 0x00026F74,\n\t19552: 0x000051C7,\n\t19553: 0x00006C9C,\n\t19554: 0x00006E1D,\n\t19555: 0x0000842E,\n\t19556: 0x00028B21,\n\t19557: 0x00006E2F,\n\t19558: 0x00023E2F,\n\t19559: 0x00007453,\n\t19560: 0x00023F82,\n\t19561: 0x000079CC,\n\t19562: 0x00006E4F,\n\t19563: 0x00005A91,\n\t19564: 0x0002304B,\n\t19565: 0x00006FF8,\n\t19566: 0x0000370D,\n\t19567: 0x00006F9D,\n\t19568: 0x00023E30,\n\t19569: 0x00006EFA,\n\t19570: 0x00021497,\n\t19571: 0x0002403D,\n\t19572: 0x00004555,\n\t19573: 0x000093F0,\n\t19574: 0x00006F44,\n\t19575: 0x00006F5C,\n\t19576: 0x00003D4E,\n\t19577: 0x00006F74,\n\t19578: 0x00029170,\n\t19579: 0x00003D3B,\n\t19580: 0x00006F9F,\n\t19581: 0x00024144,\n\t19582: 0x00006FD3,\n\t19583: 0x00024091,\n\t19584: 0x00024155,\n\t19585: 0x00024039,\n\t19586: 0x00023FF0,\n\t19587: 0x00023FB4,\n\t19588: 0x0002413F,\n\t19589: 0x000051DF,\n\t19590: 0x00024156,\n\t19591: 0x00024157,\n\t19592: 0x00024140,\n\t19593: 0x000261DD,\n\t19594: 0x0000704B,\n\t19595: 0x0000707E,\n\t19596: 0x000070A7,\n\t19597: 0x00007081,\n\t19598: 0x000070CC,\n\t19599: 0x000070D5,\n\t19600: 0x000070D6,\n\t19601: 0x000070DF,\n\t19602: 0x00004104,\n\t19603: 0x00003DE8,\n\t19604: 0x000071B4,\n\t19605: 0x00007196,\n\t19606: 0x00024277,\n\t19607: 0x0000712B,\n\t19608: 0x00007145,\n\t19609: 0x00005A88,\n\t19610: 0x0000714A,\n\t19611: 0x0000716E,\n\t19612: 0x00005C9C,\n\t19613: 0x00024365,\n\t19614: 0x0000714F,\n\t19615: 0x00009362,\n\t19616: 0x000242C1,\n\t19617: 0x0000712C,\n\t19618: 0x0002445A,\n\t19619: 0x00024A27,\n\t19620: 0x00024A22,\n\t19621: 0x000071BA,\n\t19622: 0x00028BE8,\n\t19623: 0x000070BD,\n\t19624: 0x0000720E,\n\t19625: 0x00009442,\n\t19626: 0x00007215,\n\t19627: 0x00005911,\n\t19628: 0x00009443,\n\t19629: 0x00007224,\n\t19630: 0x00009341,\n\t19631: 0x00025605,\n\t19632: 0x0000722E,\n\t19633: 0x00007240,\n\t19634: 0x00024974,\n\t19635: 0x000068BD,\n\t19636: 0x00007255,\n\t19637: 0x00007257,\n\t19638: 0x00003E55,\n\t19639: 0x00023044,\n\t19640: 0x0000680D,\n\t19641: 0x00006F3D,\n\t19642: 0x00007282,\n\t19643: 0x0000732A,\n\t19644: 0x0000732B,\n\t19645: 0x00024823,\n\t19646: 0x0002882B,\n\t19647: 0x000048ED,\n\t19648: 0x00028804,\n\t19649: 0x00007328,\n\t19650: 0x0000732E,\n\t19651: 0x000073CF,\n\t19652: 0x000073AA,\n\t19653: 0x00020C3A,\n\t19654: 0x00026A2E,\n\t19655: 0x000073C9,\n\t19656: 0x00007449,\n\t19657: 0x000241E2,\n\t19658: 0x000216E7,\n\t19659: 0x00024A24,\n\t19660: 0x00006623,\n\t19661: 0x000036C5,\n\t19662: 0x000249B7,\n\t19663: 0x0002498D,\n\t19664: 0x000249FB,\n\t19665: 0x000073F7,\n\t19666: 0x00007415,\n\t19667: 0x00006903,\n\t19668: 0x00024A26,\n\t19669: 0x00007439,\n\t19670: 0x000205C3,\n\t19671: 0x00003ED7,\n\t19672: 0x0000745C,\n\t19673: 0x000228AD,\n\t19674: 0x00007460,\n\t19675: 0x00028EB2,\n\t19676: 0x00007447,\n\t19677: 0x000073E4,\n\t19678: 0x00007476,\n\t19679: 0x000083B9,\n\t19680: 0x0000746C,\n\t19681: 0x00003730,\n\t19682: 0x00007474,\n\t19683: 0x000093F1,\n\t19684: 0x00006A2C,\n\t19685: 0x00007482,\n\t19686: 0x00004953,\n\t19687: 0x00024A8C,\n\t19688: 0x0002415F,\n\t19689: 0x00024A79,\n\t19690: 0x00028B8F,\n\t19691: 0x00005B46,\n\t19692: 0x00028C03,\n\t19693: 0x0002189E,\n\t19694: 0x000074C8,\n\t19695: 0x00021988,\n\t19696: 0x0000750E,\n\t19697: 0x000074E9,\n\t19698: 0x0000751E,\n\t19699: 0x00028ED9,\n\t19700: 0x00021A4B,\n\t19701: 0x00005BD7,\n\t19702: 0x00028EAC,\n\t19703: 0x00009385,\n\t19704: 0x0000754D,\n\t19705: 0x0000754A,\n\t19706: 0x00007567,\n\t19707: 0x0000756E,\n\t19708: 0x00024F82,\n\t19709: 0x00003F04,\n\t19710: 0x00024D13,\n\t19711: 0x0000758E,\n\t19712: 0x0000745D,\n\t19713: 0x0000759E,\n\t19714: 0x000075B4,\n\t19715: 0x00007602,\n\t19716: 0x0000762C,\n\t19717: 0x00007651,\n\t19718: 0x0000764F,\n\t19719: 0x0000766F,\n\t19720: 0x00007676,\n\t19721: 0x000263F5,\n\t19722: 0x00007690,\n\t19723: 0x000081EF,\n\t19724: 0x000037F8,\n\t19725: 0x00026911,\n\t19726: 0x0002690E,\n\t19727: 0x000076A1,\n\t19728: 0x000076A5,\n\t19729: 0x000076B7,\n\t19730: 0x000076CC,\n\t19731: 0x00026F9F,\n\t19732: 0x00008462,\n\t19733: 0x0002509D,\n\t19734: 0x0002517D,\n\t19735: 0x00021E1C,\n\t19736: 0x0000771E,\n\t19737: 0x00007726,\n\t19738: 0x00007740,\n\t19739: 0x000064AF,\n\t19740: 0x00025220,\n\t19741: 0x00007758,\n\t19742: 0x000232AC,\n\t19743: 0x000077AF,\n\t19744: 0x00028964,\n\t19745: 0x00028968,\n\t19746: 0x000216C1,\n\t19747: 0x000077F4,\n\t19748: 0x00007809,\n\t19749: 0x00021376,\n\t19750: 0x00024A12,\n\t19751: 0x000068CA,\n\t19752: 0x000078AF,\n\t19753: 0x000078C7,\n\t19754: 0x000078D3,\n\t19755: 0x000096A5,\n\t19756: 0x0000792E,\n\t19757: 0x000255E0,\n\t19758: 0x000078D7,\n\t19759: 0x00007934,\n\t19760: 0x000078B1,\n\t19761: 0x0002760C,\n\t19762: 0x00008FB8,\n\t19763: 0x00008884,\n\t19764: 0x00028B2B,\n\t19765: 0x00026083,\n\t19766: 0x0002261C,\n\t19767: 0x00007986,\n\t19768: 0x00008900,\n\t19769: 0x00006902,\n\t19770: 0x00007980,\n\t19771: 0x00025857,\n\t19772: 0x0000799D,\n\t19773: 0x00027B39,\n\t19774: 0x0000793C,\n\t19775: 0x000079A9,\n\t19776: 0x00006E2A,\n\t19777: 0x00027126,\n\t19778: 0x00003EA8,\n\t19779: 0x000079C6,\n\t19780: 0x0002910D,\n\t19781: 0x000079D4,\n}\n\nconst numEncodeTables = 8\n\n// encodeX are the encoding tables from Unicode to Big5 code,\n// sorted by decreasing length.\n// encode0: 42633 entries for runes in [131105, 173738).\n// encode1: 29004 entries for runes in [ 11904,  40908).\n// encode2:  2176 entries for runes in [  7870,  10046).\n// encode3:   939 entries for runes in [   167,   1106).\n// encode4:   446 entries for runes in [ 65072,  65518).\n// encode5:   432 entries for runes in [194597, 195029).\n// encode6:   263 entries for runes in [ 63751,  64014).\n// encode7:     1 entries for runes in [175615, 175616).\n\nconst encode0Low, encode0High = 131105, 173738\n\nvar encode0 = [...]uint16{\n\t131105 - 131105: 0x9C71,\n\t131134 - 131105: 0x9375,\n\t131142 - 131105: 0x9376,\n\t131150 - 131105: 0x9548,\n\t131176 - 131105: 0x8EC6,\n\t131206 - 131105: 0x8BC5,\n\t131207 - 131105: 0x8BFA,\n\t131210 - 131105: 0xC87C,\n\t131220 - 131105: 0x9AB4,\n\t131274 - 131105: 0x884E,\n\t131275 - 131105: 0x884B,\n\t131276 - 131105: 0xC87A,\n\t131277 - 131105: 0x8848,\n\t131281 - 131105: 0x8847,\n\t131310 - 131105: 0xA0F6,\n\t131340 - 131105: 0x8845,\n\t131342 - 131105: 0x8853,\n\t131352 - 131105: 0xFCAD,\n\t131492 - 131105: 0x8CF5,\n\t131497 - 131105: 0x8AAD,\n\t131499 - 131105: 0x9272,\n\t131521 - 131105: 0xFC47,\n\t131540 - 131105: 0x94DF,\n\t131570 - 131105: 0x9FD1,\n\t131588 - 131105: 0xFBCB,\n\t131596 - 131105: 0x927D,\n\t131604 - 131105: 0x98A4,\n\t131641 - 131105: 0x8CF9,\n\t131675 - 131105: 0x94E7,\n\t131700 - 131105: 0x90CB,\n\t131701 - 131105: 0x927B,\n\t131737 - 131105: 0x94D8,\n\t131742 - 131105: 0xFC5F,\n\t131744 - 131105: 0xFA54,\n\t131767 - 131105: 0x9AB5,\n\t131775 - 131105: 0x96DA,\n\t131776 - 131105: 0x9279,\n\t131813 - 131105: 0xFA74,\n\t131850 - 131105: 0x9275,\n\t131877 - 131105: 0x8DFB,\n\t131905 - 131105: 0x8A49,\n\t131909 - 131105: 0x92DF,\n\t131910 - 131105: 0x9B7C,\n\t131911 - 131105: 0xFA63,\n\t131966 - 131105: 0xFA60,\n\t131967 - 131105: 0x926D,\n\t131968 - 131105: 0xFA62,\n\t132000 - 131105: 0x9AB6,\n\t132007 - 131105: 0x976B,\n\t132021 - 131105: 0xFD6A,\n\t132041 - 131105: 0xFD54,\n\t132043 - 131105: 0x9273,\n\t132085 - 131105: 0x97D8,\n\t132092 - 131105: 0x9FBB,\n\t132115 - 131105: 0x9342,\n\t132116 - 131105: 0x9276,\n\t132127 - 131105: 0xFA65,\n\t132197 - 131105: 0x926C,\n\t132231 - 131105: 0xFA6E,\n\t132238 - 131105: 0x9EE0,\n\t132241 - 131105: 0x92C0,\n\t132242 - 131105: 0x92BF,\n\t132259 - 131105: 0x92BE,\n\t132311 - 131105: 0x9ABA,\n\t132348 - 131105: 0x8AB3,\n\t132350 - 131105: 0x9775,\n\t132423 - 131105: 0xFA40,\n\t132494 - 131105: 0xFA76,\n\t132517 - 131105: 0xFBD0,\n\t132531 - 131105: 0xFA7B,\n\t132547 - 131105: 0xFE6D,\n\t132554 - 131105: 0x9BB3,\n\t132560 - 131105: 0x89CC,\n\t132565 - 131105: 0x9ABE,\n\t132575 - 131105: 0xFA42,\n\t132576 - 131105: 0x92BC,\n\t132587 - 131105: 0x945C,\n\t132625 - 131105: 0x9BB5,\n\t132629 - 131105: 0x9ABF,\n\t132633 - 131105: 0x98A7,\n\t132634 - 131105: 0x97A4,\n\t132656 - 131105: 0x90FD,\n\t132694 - 131105: 0xFC7B,\n\t132726 - 131105: 0x9AC0,\n\t132878 - 131105: 0x92C3,\n\t132913 - 131105: 0x8AAA,\n\t132985 - 131105: 0x9BD0,\n\t133164 - 131105: 0x9550,\n\t133235 - 131105: 0x92C6,\n\t133333 - 131105: 0x98A6,\n\t133398 - 131105: 0x9546,\n\t133411 - 131105: 0xFD63,\n\t133460 - 131105: 0xFAC2,\n\t133497 - 131105: 0x9EC3,\n\t133607 - 131105: 0x89B2,\n\t133649 - 131105: 0x9C66,\n\t133712 - 131105: 0x9053,\n\t133743 - 131105: 0x8C62,\n\t133770 - 131105: 0x87A8,\n\t133812 - 131105: 0x97C1,\n\t133826 - 131105: 0x9AC4,\n\t133837 - 131105: 0x9AC5,\n\t133901 - 131105: 0x8EEF,\n\t134031 - 131105: 0xFAE9,\n\t134047 - 131105: 0x8D40,\n\t134056 - 131105: 0x9262,\n\t134057 - 131105: 0x8AF7,\n\t134079 - 131105: 0x9AC6,\n\t134086 - 131105: 0x92E1,\n\t134091 - 131105: 0x9AC9,\n\t134114 - 131105: 0xFAC6,\n\t134123 - 131105: 0x97A5,\n\t134139 - 131105: 0x9ACB,\n\t134143 - 131105: 0xFA72,\n\t134155 - 131105: 0x8A5E,\n\t134157 - 131105: 0x94E0,\n\t134176 - 131105: 0x92CC,\n\t134196 - 131105: 0x8AE5,\n\t134202 - 131105: 0xFE5C,\n\t134203 - 131105: 0x9ACC,\n\t134209 - 131105: 0x9DF9,\n\t134210 - 131105: 0x8A43,\n\t134211 - 131105: 0x8AA6,\n\t134227 - 131105: 0x9ACD,\n\t134245 - 131105: 0x9ACE,\n\t134263 - 131105: 0xFAEE,\n\t134264 - 131105: 0x9BCC,\n\t134268 - 131105: 0x9ACF,\n\t134285 - 131105: 0x9AD1,\n\t134294 - 131105: 0x9DFA,\n\t134300 - 131105: 0x9D7C,\n\t134325 - 131105: 0x9AD3,\n\t134328 - 131105: 0x97A6,\n\t134351 - 131105: 0x995F,\n\t134355 - 131105: 0xFBF6,\n\t134356 - 131105: 0x9FC5,\n\t134357 - 131105: 0x8A59,\n\t134358 - 131105: 0x8B6B,\n\t134365 - 131105: 0x9AD4,\n\t134381 - 131105: 0x9AD5,\n\t134399 - 131105: 0x97A2,\n\t134421 - 131105: 0x8A44,\n\t134440 - 131105: 0x9F4A,\n\t134449 - 131105: 0x90A1,\n\t134450 - 131105: 0xFDA4,\n\t134470 - 131105: 0x8A64,\n\t134471 - 131105: 0x8AF2,\n\t134472 - 131105: 0x8AF8,\n\t134473 - 131105: 0x9DD8,\n\t134476 - 131105: 0x94D6,\n\t134477 - 131105: 0xFAFE,\n\t134478 - 131105: 0xFBA7,\n\t134511 - 131105: 0x9AD6,\n\t134513 - 131105: 0x9F4D,\n\t134516 - 131105: 0xFAF6,\n\t134524 - 131105: 0x8A57,\n\t134526 - 131105: 0x8B43,\n\t134527 - 131105: 0x8B44,\n\t134550 - 131105: 0x8AB6,\n\t134556 - 131105: 0x8AC0,\n\t134567 - 131105: 0x9E54,\n\t134578 - 131105: 0x9AD7,\n\t134600 - 131105: 0x9AD8,\n\t134660 - 131105: 0x9ADC,\n\t134665 - 131105: 0x8ACA,\n\t134666 - 131105: 0x9EA8,\n\t134669 - 131105: 0x9263,\n\t134670 - 131105: 0x9ADD,\n\t134671 - 131105: 0x8B65,\n\t134672 - 131105: 0x8B6F,\n\t134673 - 131105: 0x8B7E,\n\t134678 - 131105: 0x8F43,\n\t134685 - 131105: 0x92D0,\n\t134732 - 131105: 0x8AF4,\n\t134765 - 131105: 0x9DBE,\n\t134771 - 131105: 0x9AE1,\n\t134773 - 131105: 0xFCDE,\n\t134774 - 131105: 0x9DFD,\n\t134775 - 131105: 0x8B66,\n\t134776 - 131105: 0x8B70,\n\t134777 - 131105: 0x8B75,\n\t134778 - 131105: 0x8AE4,\n\t134779 - 131105: 0x8BA4,\n\t134796 - 131105: 0x8AED,\n\t134806 - 131105: 0x8A5D,\n\t134808 - 131105: 0x8B48,\n\t134813 - 131105: 0x9DED,\n\t134818 - 131105: 0x9E40,\n\t134826 - 131105: 0x8AEF,\n\t134827 - 131105: 0x8AF6,\n\t134828 - 131105: 0x9E76,\n\t134838 - 131105: 0x9EE3,\n\t134871 - 131105: 0x9ADE,\n\t134872 - 131105: 0x8DFE,\n\t134877 - 131105: 0xFAFC,\n\t134904 - 131105: 0x9CB1,\n\t134905 - 131105: 0x9E77,\n\t134906 - 131105: 0x8B64,\n\t134907 - 131105: 0x8B67,\n\t134941 - 131105: 0x974B,\n\t134950 - 131105: 0x9653,\n\t134957 - 131105: 0x9AE0,\n\t134958 - 131105: 0x8B4A,\n\t134960 - 131105: 0x8AF1,\n\t134961 - 131105: 0x8AD7,\n\t134971 - 131105: 0xA0AB,\n\t134988 - 131105: 0x8AB5,\n\t135012 - 131105: 0x8A5F,\n\t135053 - 131105: 0x8AEE,\n\t135056 - 131105: 0x9ADF,\n\t135085 - 131105: 0x8AFE,\n\t135092 - 131105: 0x8A58,\n\t135093 - 131105: 0x8BA3,\n\t135094 - 131105: 0x8BA7,\n\t135100 - 131105: 0x9AE3,\n\t135135 - 131105: 0x9261,\n\t135146 - 131105: 0x9DD7,\n\t135147 - 131105: 0x9E7D,\n\t135148 - 131105: 0x9EA7,\n\t135149 - 131105: 0x9EAB,\n\t135188 - 131105: 0x9042,\n\t135197 - 131105: 0x8B79,\n\t135198 - 131105: 0x8B7A,\n\t135247 - 131105: 0x9AE6,\n\t135260 - 131105: 0x9AE5,\n\t135279 - 131105: 0x8A7E,\n\t135285 - 131105: 0x9E44,\n\t135286 - 131105: 0x9AE7,\n\t135287 - 131105: 0x8A7C,\n\t135288 - 131105: 0x8B71,\n\t135291 - 131105: 0x9AE9,\n\t135304 - 131105: 0x9AEA,\n\t135318 - 131105: 0x9AEB,\n\t135325 - 131105: 0x8ABD,\n\t135348 - 131105: 0xFB4E,\n\t135359 - 131105: 0x9AED,\n\t135360 - 131105: 0x8AF9,\n\t135361 - 131105: 0x9E63,\n\t135367 - 131105: 0x8B49,\n\t135368 - 131105: 0x8ACE,\n\t135369 - 131105: 0x8B6E,\n\t135375 - 131105: 0x8AE8,\n\t135379 - 131105: 0x9AEE,\n\t135396 - 131105: 0x92CE,\n\t135412 - 131105: 0x8A5A,\n\t135413 - 131105: 0x8B7B,\n\t135414 - 131105: 0x8B7C,\n\t135471 - 131105: 0x9AEF,\n\t135483 - 131105: 0x9AF0,\n\t135485 - 131105: 0x8AFA,\n\t135493 - 131105: 0x8941,\n\t135496 - 131105: 0x8B72,\n\t135503 - 131105: 0x8AF3,\n\t135552 - 131105: 0x8BA8,\n\t135559 - 131105: 0x9EAE,\n\t135641 - 131105: 0x9E72,\n\t135740 - 131105: 0xFB73,\n\t135759 - 131105: 0xFB5F,\n\t135804 - 131105: 0x90BA,\n\t135848 - 131105: 0x91FE,\n\t135849 - 131105: 0x9EF6,\n\t135856 - 131105: 0x97ED,\n\t135907 - 131105: 0x9AF3,\n\t135934 - 131105: 0xA0EE,\n\t135938 - 131105: 0x967C,\n\t135939 - 131105: 0x9345,\n\t135940 - 131105: 0x986E,\n\t135941 - 131105: 0xFA56,\n\t135990 - 131105: 0x9AF5,\n\t135994 - 131105: 0xFC4B,\n\t136053 - 131105: 0x9AF4,\n\t136054 - 131105: 0xFEDE,\n\t136078 - 131105: 0xFCB7,\n\t136088 - 131105: 0x97F1,\n\t136092 - 131105: 0x97C7,\n\t136133 - 131105: 0x9CCB,\n\t136134 - 131105: 0x9240,\n\t136173 - 131105: 0x9CE8,\n\t136190 - 131105: 0x91FD,\n\t136211 - 131105: 0x974E,\n\t136214 - 131105: 0xFB68,\n\t136228 - 131105: 0x976C,\n\t136255 - 131105: 0x8CC2,\n\t136274 - 131105: 0x97E8,\n\t136276 - 131105: 0xFB6A,\n\t136277 - 131105: 0x8B74,\n\t136330 - 131105: 0x8EE7,\n\t136343 - 131105: 0xFDC8,\n\t136374 - 131105: 0x9241,\n\t136424 - 131105: 0x96A1,\n\t136445 - 131105: 0x8EF3,\n\t136567 - 131105: 0x9AF7,\n\t136578 - 131105: 0x8FA6,\n\t136598 - 131105: 0xFAD6,\n\t136714 - 131105: 0x9CC7,\n\t136723 - 131105: 0xFAD7,\n\t136729 - 131105: 0x9AF8,\n\t136766 - 131105: 0xFBA1,\n\t136801 - 131105: 0x8EC5,\n\t136850 - 131105: 0xFBA4,\n\t136888 - 131105: 0xFBC2,\n\t136890 - 131105: 0x9AC1,\n\t136896 - 131105: 0x91FA,\n\t136897 - 131105: 0xFEDB,\n\t136898 - 131105: 0x97AB,\n\t136915 - 131105: 0x9147,\n\t136917 - 131105: 0xFBB1,\n\t136927 - 131105: 0x8FEA,\n\t136934 - 131105: 0x94D2,\n\t136935 - 131105: 0xFE61,\n\t136936 - 131105: 0xFACE,\n\t136954 - 131105: 0x92ED,\n\t136955 - 131105: 0x91F3,\n\t136956 - 131105: 0x93C6,\n\t136958 - 131105: 0x935A,\n\t136973 - 131105: 0xFAFB,\n\t136976 - 131105: 0x92EF,\n\t136998 - 131105: 0xFAC8,\n\t137018 - 131105: 0x9847,\n\t137019 - 131105: 0x9366,\n\t137020 - 131105: 0x9855,\n\t137047 - 131105: 0x96E6,\n\t137068 - 131105: 0x9F43,\n\t137069 - 131105: 0x9FAA,\n\t137070 - 131105: 0x94DA,\n\t137071 - 131105: 0x92EE,\n\t137072 - 131105: 0xFCAF,\n\t137073 - 131105: 0xFBFB,\n\t137075 - 131105: 0x8EF9,\n\t137076 - 131105: 0x91F6,\n\t137131 - 131105: 0x9364,\n\t137136 - 131105: 0x94F5,\n\t137137 - 131105: 0x9CB6,\n\t137138 - 131105: 0xFBAD,\n\t137139 - 131105: 0x984E,\n\t137140 - 131105: 0x8F44,\n\t137141 - 131105: 0x96FD,\n\t137155 - 131105: 0x9AF9,\n\t137159 - 131105: 0x9AFA,\n\t137177 - 131105: 0x9769,\n\t137178 - 131105: 0x95D4,\n\t137179 - 131105: 0x984B,\n\t137180 - 131105: 0xFBAA,\n\t137183 - 131105: 0x987C,\n\t137199 - 131105: 0x91EA,\n\t137205 - 131105: 0x9DAF,\n\t137206 - 131105: 0x9DC5,\n\t137208 - 131105: 0x91F1,\n\t137209 - 131105: 0x8EB1,\n\t137210 - 131105: 0x97A9,\n\t137211 - 131105: 0xFBAC,\n\t137212 - 131105: 0xFCB8,\n\t137248 - 131105: 0x9CB9,\n\t137256 - 131105: 0xFBB0,\n\t137257 - 131105: 0xFCD2,\n\t137258 - 131105: 0x93CB,\n\t137261 - 131105: 0x9AFD,\n\t137273 - 131105: 0x91F4,\n\t137274 - 131105: 0x8BAC,\n\t137275 - 131105: 0xA055,\n\t137280 - 131105: 0x9574,\n\t137285 - 131105: 0x95BE,\n\t137298 - 131105: 0x97AD,\n\t137310 - 131105: 0x8EE9,\n\t137313 - 131105: 0x92F8,\n\t137314 - 131105: 0x97BE,\n\t137315 - 131105: 0x916C,\n\t137316 - 131105: 0x94AA,\n\t137335 - 131105: 0xFC63,\n\t137339 - 131105: 0x9DC6,\n\t137347 - 131105: 0x97B5,\n\t137348 - 131105: 0x92B8,\n\t137349 - 131105: 0x91EF,\n\t137374 - 131105: 0xFEA6,\n\t137375 - 131105: 0x9760,\n\t137376 - 131105: 0x9358,\n\t137377 - 131105: 0x9576,\n\t137378 - 131105: 0x8FAC,\n\t137406 - 131105: 0x91EC,\n\t137407 - 131105: 0x97B4,\n\t137425 - 131105: 0x91F7,\n\t137430 - 131105: 0x974A,\n\t137431 - 131105: 0xFB49,\n\t137432 - 131105: 0x9578,\n\t137433 - 131105: 0x93BC,\n\t137466 - 131105: 0x91D6,\n\t137475 - 131105: 0x9355,\n\t137476 - 131105: 0x9356,\n\t137477 - 131105: 0x9851,\n\t137488 - 131105: 0x8FF8,\n\t137489 - 131105: 0xFBC0,\n\t137490 - 131105: 0x93F2,\n\t137493 - 131105: 0x90D0,\n\t137500 - 131105: 0x9C44,\n\t137506 - 131105: 0x9255,\n\t137511 - 131105: 0x9363,\n\t137531 - 131105: 0x91A5,\n\t137540 - 131105: 0xA0ED,\n\t137560 - 131105: 0xFD6B,\n\t137578 - 131105: 0x9AFE,\n\t137596 - 131105: 0x9351,\n\t137600 - 131105: 0x8C57,\n\t137603 - 131105: 0xFA78,\n\t137608 - 131105: 0xFEA8,\n\t137622 - 131105: 0x9350,\n\t137691 - 131105: 0xFA4C,\n\t137715 - 131105: 0x92F7,\n\t137773 - 131105: 0x9B40,\n\t137780 - 131105: 0xFBCE,\n\t137797 - 131105: 0x9B41,\n\t137803 - 131105: 0xFEAD,\n\t137827 - 131105: 0x8761,\n\t138052 - 131105: 0xFBD5,\n\t138177 - 131105: 0x8BC2,\n\t138178 - 131105: 0x9A7C,\n\t138282 - 131105: 0x9B42,\n\t138352 - 131105: 0x9B43,\n\t138402 - 131105: 0x9E79,\n\t138405 - 131105: 0xFBD9,\n\t138412 - 131105: 0x9B44,\n\t138566 - 131105: 0xA0A7,\n\t138579 - 131105: 0x877B,\n\t138590 - 131105: 0x876E,\n\t138640 - 131105: 0x9BF3,\n\t138678 - 131105: 0x8C79,\n\t138682 - 131105: 0x935E,\n\t138698 - 131105: 0x89CB,\n\t138705 - 131105: 0x9F53,\n\t138731 - 131105: 0x93D7,\n\t138745 - 131105: 0xFBE1,\n\t138780 - 131105: 0xFED0,\n\t138787 - 131105: 0x8CF1,\n\t138807 - 131105: 0xFBE2,\n\t138813 - 131105: 0xFCE3,\n\t138889 - 131105: 0x9074,\n\t138916 - 131105: 0xFBE6,\n\t138920 - 131105: 0x9BB7,\n\t138952 - 131105: 0x9B45,\n\t138965 - 131105: 0x9B47,\n\t139023 - 131105: 0x9F50,\n\t139029 - 131105: 0x9B48,\n\t139114 - 131105: 0xFC5B,\n\t139166 - 131105: 0x98A9,\n\t139169 - 131105: 0x9CFD,\n\t139240 - 131105: 0x884C,\n\t139333 - 131105: 0x9B4B,\n\t139337 - 131105: 0xFBEC,\n\t139390 - 131105: 0x8C69,\n\t139418 - 131105: 0x9BA8,\n\t139463 - 131105: 0x8AD5,\n\t139516 - 131105: 0xFA73,\n\t139562 - 131105: 0xFD59,\n\t139611 - 131105: 0x91A2,\n\t139635 - 131105: 0xFBED,\n\t139642 - 131105: 0x9CA9,\n\t139681 - 131105: 0x8AA8,\n\t139713 - 131105: 0x8D42,\n\t139715 - 131105: 0x9BC3,\n\t139784 - 131105: 0x8AE1,\n\t139900 - 131105: 0x9B4E,\n\t140065 - 131105: 0x95D0,\n\t140069 - 131105: 0x905F,\n\t140221 - 131105: 0x97EE,\n\t140240 - 131105: 0xFC4E,\n\t140247 - 131105: 0x9B4F,\n\t140282 - 131105: 0x9B50,\n\t140389 - 131105: 0x9EC6,\n\t140401 - 131105: 0xFC50,\n\t140427 - 131105: 0xFD73,\n\t140433 - 131105: 0xFDA7,\n\t140464 - 131105: 0x9DA2,\n\t140476 - 131105: 0x87D1,\n\t140481 - 131105: 0x87D3,\n\t140489 - 131105: 0x87D4,\n\t140492 - 131105: 0x87D5,\n\t140525 - 131105: 0xFA58,\n\t140563 - 131105: 0xFA5E,\n\t140571 - 131105: 0xA059,\n\t140592 - 131105: 0xFA75,\n\t140628 - 131105: 0xFBBE,\n\t140685 - 131105: 0x9CA2,\n\t140719 - 131105: 0x9370,\n\t140734 - 131105: 0x9371,\n\t140827 - 131105: 0x9377,\n\t140828 - 131105: 0xFEEF,\n\t140843 - 131105: 0x936D,\n\t140904 - 131105: 0xFC5D,\n\t140922 - 131105: 0x90B8,\n\t140950 - 131105: 0x8AFC,\n\t140952 - 131105: 0xFB41,\n\t141044 - 131105: 0x9E6B,\n\t141045 - 131105: 0x94E3,\n\t141046 - 131105: 0x8EE2,\n\t141074 - 131105: 0x8C7D,\n\t141076 - 131105: 0x8ED7,\n\t141083 - 131105: 0x9C4D,\n\t141087 - 131105: 0x96A3,\n\t141098 - 131105: 0x9B51,\n\t141173 - 131105: 0x8AC3,\n\t141185 - 131105: 0x96AA,\n\t141206 - 131105: 0x8CE2,\n\t141236 - 131105: 0xFC68,\n\t141237 - 131105: 0x8B6D,\n\t141261 - 131105: 0xFD67,\n\t141315 - 131105: 0x8AE9,\n\t141407 - 131105: 0xFCA1,\n\t141408 - 131105: 0x936C,\n\t141425 - 131105: 0x9B52,\n\t141485 - 131105: 0xFE70,\n\t141505 - 131105: 0xFCA8,\n\t141559 - 131105: 0xFCE9,\n\t141606 - 131105: 0x9CB4,\n\t141625 - 131105: 0x8AEA,\n\t141647 - 131105: 0x9B53,\n\t141671 - 131105: 0x9B55,\n\t141675 - 131105: 0x96AB,\n\t141696 - 131105: 0xFCA7,\n\t141715 - 131105: 0x9B56,\n\t141926 - 131105: 0x8ABC,\n\t142031 - 131105: 0x8ACB,\n\t142037 - 131105: 0x9B57,\n\t142054 - 131105: 0x89CD,\n\t142056 - 131105: 0x9B59,\n\t142094 - 131105: 0x9B5B,\n\t142114 - 131105: 0x93A5,\n\t142143 - 131105: 0x9B5D,\n\t142147 - 131105: 0x9E4F,\n\t142186 - 131105: 0x93A3,\n\t142282 - 131105: 0x8A7B,\n\t142286 - 131105: 0x8B42,\n\t142374 - 131105: 0x9750,\n\t142375 - 131105: 0x8FB3,\n\t142392 - 131105: 0x8A50,\n\t142412 - 131105: 0x9B60,\n\t142417 - 131105: 0x8B45,\n\t142421 - 131105: 0x8B46,\n\t142434 - 131105: 0x9DFE,\n\t142472 - 131105: 0x9B62,\n\t142491 - 131105: 0x937B,\n\t142497 - 131105: 0x93B1,\n\t142505 - 131105: 0x8A60,\n\t142514 - 131105: 0x8AD8,\n\t142519 - 131105: 0x9B63,\n\t142530 - 131105: 0x8A69,\n\t142534 - 131105: 0x8A47,\n\t142537 - 131105: 0x8ACC,\n\t142599 - 131105: 0x937C,\n\t142600 - 131105: 0x9B65,\n\t142610 - 131105: 0x9B66,\n\t142660 - 131105: 0x8A72,\n\t142668 - 131105: 0x8A7A,\n\t142695 - 131105: 0x93AF,\n\t142733 - 131105: 0x8AB0,\n\t142741 - 131105: 0x9B68,\n\t142752 - 131105: 0x9EA3,\n\t142755 - 131105: 0xFAEC,\n\t142756 - 131105: 0x8B77,\n\t142775 - 131105: 0x9B67,\n\t142830 - 131105: 0x8B59,\n\t142861 - 131105: 0xFCB1,\n\t142902 - 131105: 0xFCBB,\n\t142914 - 131105: 0x9B69,\n\t142968 - 131105: 0x93A8,\n\t142987 - 131105: 0x8AE0,\n\t143027 - 131105: 0x9E51,\n\t143087 - 131105: 0x8F5F,\n\t143220 - 131105: 0x9B6A,\n\t143308 - 131105: 0x9B6B,\n\t143331 - 131105: 0x97EC,\n\t143411 - 131105: 0x9B6C,\n\t143428 - 131105: 0xFE4E,\n\t143435 - 131105: 0xFDC2,\n\t143462 - 131105: 0x9B6D,\n\t143485 - 131105: 0x9167,\n\t143486 - 131105: 0xFCCC,\n\t143502 - 131105: 0x93B6,\n\t143543 - 131105: 0x90E4,\n\t143548 - 131105: 0x90E5,\n\t143578 - 131105: 0x9EF2,\n\t143619 - 131105: 0x93CA,\n\t143677 - 131105: 0x8BBC,\n\t143741 - 131105: 0x8F46,\n\t143746 - 131105: 0x93CF,\n\t143780 - 131105: 0xFCDB,\n\t143781 - 131105: 0xFCDC,\n\t143795 - 131105: 0x93C0,\n\t143816 - 131105: 0xFCE6,\n\t143817 - 131105: 0x96E7,\n\t143850 - 131105: 0x87A7,\n\t143863 - 131105: 0xFCD8,\n\t143864 - 131105: 0xFCD9,\n\t143865 - 131105: 0xFDA6,\n\t143887 - 131105: 0x93CE,\n\t143909 - 131105: 0x95F1,\n\t143919 - 131105: 0x9CE9,\n\t143921 - 131105: 0xFCE4,\n\t143922 - 131105: 0x94AF,\n\t143923 - 131105: 0xFA77,\n\t143924 - 131105: 0x93CC,\n\t143958 - 131105: 0x8CE1,\n\t143966 - 131105: 0x87A9,\n\t143970 - 131105: 0x905A,\n\t144001 - 131105: 0x8C54,\n\t144009 - 131105: 0x93BF,\n\t144010 - 131105: 0xFB51,\n\t144043 - 131105: 0x93B9,\n\t144044 - 131105: 0xFED7,\n\t144045 - 131105: 0x93B7,\n\t144082 - 131105: 0x93D9,\n\t144096 - 131105: 0x93BB,\n\t144097 - 131105: 0x93DA,\n\t144128 - 131105: 0x98A3,\n\t144138 - 131105: 0x90D1,\n\t144159 - 131105: 0x9B6E,\n\t144308 - 131105: 0xFA70,\n\t144332 - 131105: 0x9BEB,\n\t144350 - 131105: 0x9B6F,\n\t144358 - 131105: 0xFCFC,\n\t144372 - 131105: 0x8B40,\n\t144373 - 131105: 0xA07B,\n\t144377 - 131105: 0x8CA1,\n\t144378 - 131105: 0x97F7,\n\t144382 - 131105: 0x93E2,\n\t144384 - 131105: 0xFCD6,\n\t144447 - 131105: 0x9559,\n\t144464 - 131105: 0x93A6,\n\t144495 - 131105: 0xFD40,\n\t144498 - 131105: 0x935F,\n\t144613 - 131105: 0x97F2,\n\t144665 - 131105: 0x9C76,\n\t144688 - 131105: 0x8EF8,\n\t144721 - 131105: 0x8CEB,\n\t144730 - 131105: 0x8F47,\n\t144743 - 131105: 0x9B74,\n\t144789 - 131105: 0x92B4,\n\t144793 - 131105: 0x91ED,\n\t144796 - 131105: 0x96D2,\n\t144827 - 131105: 0x87D8,\n\t144845 - 131105: 0xFD46,\n\t144846 - 131105: 0x8F4F,\n\t144847 - 131105: 0x9549,\n\t144883 - 131105: 0x9B75,\n\t144896 - 131105: 0xFA5C,\n\t144919 - 131105: 0x8751,\n\t144922 - 131105: 0x9B79,\n\t144956 - 131105: 0xFD4B,\n\t144960 - 131105: 0x96D3,\n\t144985 - 131105: 0xFD58,\n\t144991 - 131105: 0x945F,\n\t145015 - 131105: 0xA0F5,\n\t145038 - 131105: 0x87C7,\n\t145054 - 131105: 0x877C,\n\t145062 - 131105: 0x9243,\n\t145069 - 131105: 0x97FA,\n\t145082 - 131105: 0x9DD9,\n\t145119 - 131105: 0x97F4,\n\t145134 - 131105: 0x924D,\n\t145155 - 131105: 0xFD5B,\n\t145174 - 131105: 0x9B7A,\n\t145184 - 131105: 0x9ED5,\n\t145197 - 131105: 0xFAAE,\n\t145199 - 131105: 0x9CC9,\n\t145215 - 131105: 0x9258,\n\t145254 - 131105: 0x8EC8,\n\t145281 - 131105: 0x94B4,\n\t145314 - 131105: 0x93E1,\n\t145340 - 131105: 0x93DF,\n\t145346 - 131105: 0xFCF0,\n\t145365 - 131105: 0x93EC,\n\t145366 - 131105: 0x97F6,\n\t145367 - 131105: 0x96CF,\n\t145466 - 131105: 0x93DE,\n\t145858 - 131105: 0x8ACF,\n\t146087 - 131105: 0x9BA2,\n\t146139 - 131105: 0xFD69,\n\t146158 - 131105: 0x9352,\n\t146170 - 131105: 0x98A2,\n\t146202 - 131105: 0x8CE7,\n\t146266 - 131105: 0xFD6E,\n\t146531 - 131105: 0x8CA4,\n\t146585 - 131105: 0xFA7C,\n\t146586 - 131105: 0x93FA,\n\t146587 - 131105: 0x907C,\n\t146613 - 131105: 0x8F67,\n\t146615 - 131105: 0x9DB7,\n\t146631 - 131105: 0xA0E9,\n\t146632 - 131105: 0xFA4E,\n\t146633 - 131105: 0xFDA1,\n\t146684 - 131105: 0x9E74,\n\t146685 - 131105: 0x9FBF,\n\t146686 - 131105: 0x9ECB,\n\t146687 - 131105: 0x9BB9,\n\t146752 - 131105: 0x9DD4,\n\t146779 - 131105: 0x97B9,\n\t146814 - 131105: 0x8EF1,\n\t146831 - 131105: 0x957B,\n\t146870 - 131105: 0x9ED2,\n\t146871 - 131105: 0x9753,\n\t146872 - 131105: 0x96A4,\n\t146873 - 131105: 0x8FBE,\n\t146874 - 131105: 0x94D9,\n\t146875 - 131105: 0x9058,\n\t146876 - 131105: 0xFD79,\n\t146877 - 131105: 0xFD7B,\n\t146915 - 131105: 0x8EDA,\n\t146936 - 131105: 0x8EFA,\n\t146950 - 131105: 0x8762,\n\t146961 - 131105: 0x9BA5,\n\t146988 - 131105: 0x9ED9,\n\t146989 - 131105: 0x97D4,\n\t146990 - 131105: 0x90BB,\n\t146991 - 131105: 0xFDBC,\n\t146992 - 131105: 0xFDC6,\n\t146993 - 131105: 0x9248,\n\t147001 - 131105: 0x92B5,\n\t147080 - 131105: 0x9DC1,\n\t147081 - 131105: 0x92B9,\n\t147082 - 131105: 0x92A6,\n\t147083 - 131105: 0x8F4B,\n\t147129 - 131105: 0x9BA6,\n\t147135 - 131105: 0x92B6,\n\t147159 - 131105: 0x8E40,\n\t147191 - 131105: 0x9ED8,\n\t147192 - 131105: 0x945E,\n\t147193 - 131105: 0x985F,\n\t147194 - 131105: 0x94CE,\n\t147195 - 131105: 0x924A,\n\t147196 - 131105: 0xFD70,\n\t147253 - 131105: 0x9467,\n\t147265 - 131105: 0x8DEC,\n\t147274 - 131105: 0x9BD8,\n\t147297 - 131105: 0x8763,\n\t147327 - 131105: 0x9448,\n\t147328 - 131105: 0xFAC1,\n\t147329 - 131105: 0x9CF7,\n\t147330 - 131105: 0xFDBE,\n\t147343 - 131105: 0x8FDA,\n\t147380 - 131105: 0xFDD9,\n\t147383 - 131105: 0xFC7E,\n\t147392 - 131105: 0x93F9,\n\t147397 - 131105: 0xFA43,\n\t147435 - 131105: 0xFAEB,\n\t147436 - 131105: 0xFAC3,\n\t147437 - 131105: 0x97D3,\n\t147438 - 131105: 0x95F9,\n\t147439 - 131105: 0x9C48,\n\t147440 - 131105: 0xFDD8,\n\t147473 - 131105: 0xA0D8,\n\t147513 - 131105: 0xFDD7,\n\t147514 - 131105: 0xFB4A,\n\t147515 - 131105: 0x9BAF,\n\t147516 - 131105: 0x944B,\n\t147517 - 131105: 0xFDC9,\n\t147543 - 131105: 0x8EAC,\n\t147589 - 131105: 0xFDB2,\n\t147595 - 131105: 0x925A,\n\t147596 - 131105: 0xFCBD,\n\t147597 - 131105: 0x92D9,\n\t147601 - 131105: 0xFDD5,\n\t147657 - 131105: 0x92DD,\n\t147681 - 131105: 0x9259,\n\t147692 - 131105: 0x8CF0,\n\t147716 - 131105: 0x96BA,\n\t147727 - 131105: 0x925B,\n\t147737 - 131105: 0x9BAB,\n\t147775 - 131105: 0xFDDA,\n\t147776 - 131105: 0xFDDE,\n\t147780 - 131105: 0xFDD3,\n\t147790 - 131105: 0x8C46,\n\t147797 - 131105: 0xFDD6,\n\t147798 - 131105: 0xFDDC,\n\t147799 - 131105: 0xFDDD,\n\t147804 - 131105: 0x90FE,\n\t147807 - 131105: 0xFEA1,\n\t147809 - 131105: 0x87A5,\n\t147831 - 131105: 0x8BAD,\n\t147834 - 131105: 0x9CD8,\n\t147875 - 131105: 0x9E6D,\n\t147876 - 131105: 0xFD7C,\n\t147877 - 131105: 0xFB61,\n\t147884 - 131105: 0x96F8,\n\t147893 - 131105: 0x96F0,\n\t147917 - 131105: 0xFCF4,\n\t147938 - 131105: 0xFE60,\n\t147964 - 131105: 0x9852,\n\t147995 - 131105: 0x964F,\n\t148043 - 131105: 0x916E,\n\t148054 - 131105: 0x986D,\n\t148057 - 131105: 0x9864,\n\t148086 - 131105: 0x9453,\n\t148087 - 131105: 0xFDEC,\n\t148088 - 131105: 0xFB78,\n\t148100 - 131105: 0x95BA,\n\t148115 - 131105: 0x985D,\n\t148117 - 131105: 0x92F9,\n\t148133 - 131105: 0x985A,\n\t148159 - 131105: 0x8750,\n\t148161 - 131105: 0xFDF6,\n\t148169 - 131105: 0x93D0,\n\t148170 - 131105: 0x9862,\n\t148206 - 131105: 0x9BAD,\n\t148218 - 131105: 0x974F,\n\t148237 - 131105: 0x9BAE,\n\t148250 - 131105: 0x9452,\n\t148276 - 131105: 0x9BB0,\n\t148296 - 131105: 0x91D2,\n\t148322 - 131105: 0x97EA,\n\t148323 - 131105: 0xFB6B,\n\t148324 - 131105: 0x91B1,\n\t148325 - 131105: 0xFDF3,\n\t148364 - 131105: 0x92CB,\n\t148374 - 131105: 0x9BB1,\n\t148380 - 131105: 0xFCEC,\n\t148413 - 131105: 0x986B,\n\t148417 - 131105: 0x9751,\n\t148457 - 131105: 0x9871,\n\t148458 - 131105: 0x95EF,\n\t148466 - 131105: 0x9EF3,\n\t148472 - 131105: 0x91E8,\n\t148484 - 131105: 0x9BBA,\n\t148533 - 131105: 0xFB4C,\n\t148534 - 131105: 0x926A,\n\t148570 - 131105: 0xFDF8,\n\t148571 - 131105: 0x9861,\n\t148595 - 131105: 0x91E7,\n\t148615 - 131105: 0x93ED,\n\t148616 - 131105: 0x9744,\n\t148665 - 131105: 0x91E1,\n\t148668 - 131105: 0xFBF5,\n\t148686 - 131105: 0x9869,\n\t148691 - 131105: 0x8A62,\n\t148694 - 131105: 0x9BBB,\n\t148741 - 131105: 0x8CA8,\n\t148769 - 131105: 0x9C55,\n\t148856 - 131105: 0x8E77,\n\t148936 - 131105: 0x8AB2,\n\t149016 - 131105: 0x9EBC,\n\t149034 - 131105: 0x93E6,\n\t149093 - 131105: 0x93A2,\n\t149108 - 131105: 0x9BBD,\n\t149143 - 131105: 0x94B3,\n\t149204 - 131105: 0x937D,\n\t149254 - 131105: 0x9E66,\n\t149285 - 131105: 0x9459,\n\t149295 - 131105: 0x9BBF,\n\t149391 - 131105: 0x9458,\n\t149472 - 131105: 0x9EA5,\n\t149522 - 131105: 0x9BC7,\n\t149539 - 131105: 0xFE54,\n\t149634 - 131105: 0x8E74,\n\t149737 - 131105: 0x8BD6,\n\t149744 - 131105: 0x94B6,\n\t149745 - 131105: 0xFD74,\n\t149746 - 131105: 0x98C0,\n\t149747 - 131105: 0x94A5,\n\t149755 - 131105: 0x9BC8,\n\t149759 - 131105: 0x95ED,\n\t149760 - 131105: 0xFD7E,\n\t149761 - 131105: 0xFBEB,\n\t149772 - 131105: 0xFD7D,\n\t149782 - 131105: 0x976F,\n\t149783 - 131105: 0x9461,\n\t149785 - 131105: 0x9FC1,\n\t149807 - 131105: 0x95D7,\n\t149811 - 131105: 0xFA52,\n\t149812 - 131105: 0x9C58,\n\t149822 - 131105: 0x9F68,\n\t149823 - 131105: 0x9BE7,\n\t149824 - 131105: 0xFCCE,\n\t149825 - 131105: 0x96E8,\n\t149826 - 131105: 0xFA49,\n\t149827 - 131105: 0x97A1,\n\t149858 - 131105: 0x954D,\n\t149859 - 131105: 0x9EF8,\n\t149876 - 131105: 0xFE49,\n\t149877 - 131105: 0x91CE,\n\t149878 - 131105: 0x9771,\n\t149883 - 131105: 0x8CCF,\n\t149887 - 131105: 0xFDB1,\n\t149890 - 131105: 0xFC6E,\n\t149896 - 131105: 0x9CF2,\n\t149897 - 131105: 0x93B8,\n\t149898 - 131105: 0x9043,\n\t149899 - 131105: 0x9759,\n\t149900 - 131105: 0x94D7,\n\t149901 - 131105: 0xFE66,\n\t149902 - 131105: 0x947D,\n\t149903 - 131105: 0xFC6F,\n\t149908 - 131105: 0x9246,\n\t149924 - 131105: 0xFA6D,\n\t149927 - 131105: 0x8EF7,\n\t149929 - 131105: 0xFBB7,\n\t149931 - 131105: 0x947C,\n\t149932 - 131105: 0x92CD,\n\t149933 - 131105: 0x97B2,\n\t149943 - 131105: 0xFE65,\n\t149944 - 131105: 0x967E,\n\t149945 - 131105: 0x9758,\n\t149946 - 131105: 0x9B77,\n\t149947 - 131105: 0x91CF,\n\t149957 - 131105: 0x94A4,\n\t149968 - 131105: 0x9CAD,\n\t149978 - 131105: 0x8BAB,\n\t149982 - 131105: 0x96D5,\n\t149983 - 131105: 0xFCB3,\n\t149987 - 131105: 0x93AE,\n\t149989 - 131105: 0x976D,\n\t149996 - 131105: 0x9446,\n\t149997 - 131105: 0x95F7,\n\t150006 - 131105: 0x9C46,\n\t150007 - 131105: 0x955B,\n\t150008 - 131105: 0x91D1,\n\t150009 - 131105: 0x94F4,\n\t150011 - 131105: 0xFE67,\n\t150030 - 131105: 0x92A5,\n\t150034 - 131105: 0xFEDF,\n\t150035 - 131105: 0x8CAB,\n\t150037 - 131105: 0x9BC9,\n\t150049 - 131105: 0xFCED,\n\t150050 - 131105: 0xFDFA,\n\t150051 - 131105: 0xFCC8,\n\t150052 - 131105: 0xFE62,\n\t150053 - 131105: 0x91FC,\n\t150054 - 131105: 0xFE6B,\n\t150055 - 131105: 0xFDF9,\n\t150056 - 131105: 0xFCC7,\n\t150057 - 131105: 0x914E,\n\t150058 - 131105: 0x9CB8,\n\t150078 - 131105: 0x9767,\n\t150082 - 131105: 0x95EE,\n\t150085 - 131105: 0x9BB2,\n\t150090 - 131105: 0x9460,\n\t150094 - 131105: 0x94A2,\n\t150095 - 131105: 0x9875,\n\t150096 - 131105: 0x97AC,\n\t150097 - 131105: 0x91D3,\n\t150109 - 131105: 0x987B,\n\t150117 - 131105: 0x8EEB,\n\t150118 - 131105: 0x976A,\n\t150119 - 131105: 0x965E,\n\t150129 - 131105: 0x97EB,\n\t150135 - 131105: 0x9FF9,\n\t150136 - 131105: 0x95F8,\n\t150137 - 131105: 0xFEA2,\n\t150138 - 131105: 0x8FE6,\n\t150156 - 131105: 0xFE7E,\n\t150163 - 131105: 0x9DA4,\n\t150164 - 131105: 0x9768,\n\t150165 - 131105: 0x8EEC,\n\t150166 - 131105: 0x94BD,\n\t150180 - 131105: 0x945B,\n\t150181 - 131105: 0x9CF6,\n\t150182 - 131105: 0xFAA7,\n\t150183 - 131105: 0x9BD9,\n\t150193 - 131105: 0xFA5D,\n\t150194 - 131105: 0x9656,\n\t150195 - 131105: 0x9762,\n\t150202 - 131105: 0x94BA,\n\t150203 - 131105: 0xA04F,\n\t150204 - 131105: 0x92D8,\n\t150208 - 131105: 0x9BCB,\n\t150215 - 131105: 0x94BB,\n\t150218 - 131105: 0x9D5F,\n\t150225 - 131105: 0x90CF,\n\t150239 - 131105: 0x9465,\n\t150242 - 131105: 0x9F4C,\n\t150249 - 131105: 0x90D8,\n\t150287 - 131105: 0x8D5B,\n\t150382 - 131105: 0x9EBE,\n\t150517 - 131105: 0xFB6D,\n\t150537 - 131105: 0x95CA,\n\t150686 - 131105: 0x9DC2,\n\t150687 - 131105: 0x97F8,\n\t150729 - 131105: 0x8FFC,\n\t150745 - 131105: 0x9473,\n\t150790 - 131105: 0x9474,\n\t150803 - 131105: 0xFEB7,\n\t150968 - 131105: 0x8A4B,\n\t151018 - 131105: 0x8A55,\n\t151019 - 131105: 0x8B69,\n\t151099 - 131105: 0x8ADC,\n\t151120 - 131105: 0x8B76,\n\t151205 - 131105: 0x9BCE,\n\t151207 - 131105: 0x8A68,\n\t151310 - 131105: 0xA0F8,\n\t151388 - 131105: 0x98DF,\n\t151426 - 131105: 0xFEB5,\n\t151430 - 131105: 0x9BCF,\n\t151447 - 131105: 0x96FB,\n\t151450 - 131105: 0x9BFB,\n\t151465 - 131105: 0x9ECE,\n\t151480 - 131105: 0x8EE5,\n\t151490 - 131105: 0x9E7B,\n\t151596 - 131105: 0x9BD2,\n\t151634 - 131105: 0x8AA5,\n\t151709 - 131105: 0xFECE,\n\t151851 - 131105: 0x8A45,\n\t151880 - 131105: 0x9DFC,\n\t151933 - 131105: 0xFECF,\n\t151934 - 131105: 0x8BA5,\n\t152013 - 131105: 0x8C4A,\n\t152035 - 131105: 0x8AEC,\n\t152038 - 131105: 0xFCE0,\n\t152039 - 131105: 0x94AD,\n\t152096 - 131105: 0xFED5,\n\t152097 - 131105: 0x94AC,\n\t152144 - 131105: 0xFC5A,\n\t152217 - 131105: 0x9BD6,\n\t152263 - 131105: 0x8A6F,\n\t152280 - 131105: 0x8BA9,\n\t152334 - 131105: 0x8E5F,\n\t152337 - 131105: 0x9DCB,\n\t152339 - 131105: 0xFCE7,\n\t152601 - 131105: 0x9BD7,\n\t152613 - 131105: 0x93C8,\n\t152623 - 131105: 0x91F0,\n\t152624 - 131105: 0x8FE0,\n\t152646 - 131105: 0x9BDB,\n\t152684 - 131105: 0x90ED,\n\t152686 - 131105: 0x9BDC,\n\t152730 - 131105: 0x8D53,\n\t152881 - 131105: 0xA0EC,\n\t152885 - 131105: 0x98FA,\n\t152895 - 131105: 0x9BE0,\n\t152923 - 131105: 0x93C7,\n\t152924 - 131105: 0x9249,\n\t152925 - 131105: 0x96E1,\n\t152926 - 131105: 0x9BE2,\n\t152930 - 131105: 0x9BE4,\n\t152933 - 131105: 0x8FE1,\n\t152934 - 131105: 0x9BE5,\n\t152961 - 131105: 0x94C0,\n\t152964 - 131105: 0x93C3,\n\t152975 - 131105: 0x93C5,\n\t153017 - 131105: 0x9079,\n\t153045 - 131105: 0x977B,\n\t153051 - 131105: 0x907E,\n\t153056 - 131105: 0xFEE6,\n\t153093 - 131105: 0xFE46,\n\t153141 - 131105: 0x9DB8,\n\t153169 - 131105: 0x9270,\n\t153219 - 131105: 0x95A8,\n\t153237 - 131105: 0x8CB0,\n\t153315 - 131105: 0x94C8,\n\t153334 - 131105: 0x98B9,\n\t153350 - 131105: 0x9140,\n\t153373 - 131105: 0xFCBE,\n\t153381 - 131105: 0x9157,\n\t153405 - 131105: 0x8BB2,\n\t153458 - 131105: 0xFADF,\n\t153543 - 131105: 0x9BE6,\n\t153567 - 131105: 0x9643,\n\t153568 - 131105: 0x8E44,\n\t153569 - 131105: 0x9C4F,\n\t153687 - 131105: 0xFEF4,\n\t153693 - 131105: 0x9BE8,\n\t153714 - 131105: 0x93DC,\n\t153800 - 131105: 0x966F,\n\t153822 - 131105: 0x87A1,\n\t153825 - 131105: 0x8E4A,\n\t153859 - 131105: 0x9BED,\n\t153926 - 131105: 0x92F6,\n\t153942 - 131105: 0x9DB9,\n\t154028 - 131105: 0x8E4E,\n\t154060 - 131105: 0xFBCF,\n\t154196 - 131105: 0x8760,\n\t154261 - 131105: 0x9EC2,\n\t154268 - 131105: 0x94E5,\n\t154286 - 131105: 0x9BF0,\n\t154287 - 131105: 0x94E4,\n\t154345 - 131105: 0x9551,\n\t154484 - 131105: 0x8BBB,\n\t154505 - 131105: 0x9BF1,\n\t154547 - 131105: 0x94F0,\n\t154548 - 131105: 0x8E64,\n\t154566 - 131105: 0x94EA,\n\t154596 - 131105: 0x8F61,\n\t154600 - 131105: 0x9B64,\n\t154625 - 131105: 0x8E5B,\n\t154630 - 131105: 0x9BF2,\n\t154657 - 131105: 0x9FBE,\n\t154698 - 131105: 0x9DC9,\n\t154725 - 131105: 0x8E6C,\n\t154769 - 131105: 0x8F73,\n\t154788 - 131105: 0x8CAF,\n\t154816 - 131105: 0x8F75,\n\t154817 - 131105: 0x8E71,\n\t154878 - 131105: 0x8E60,\n\t154912 - 131105: 0x8E6A,\n\t154928 - 131105: 0x8C4C,\n\t154947 - 131105: 0x9552,\n\t155033 - 131105: 0x87CF,\n\t155065 - 131105: 0x87C0,\n\t155150 - 131105: 0x9554,\n\t155209 - 131105: 0x8AD4,\n\t155265 - 131105: 0x9DBB,\n\t155266 - 131105: 0x9543,\n\t155267 - 131105: 0x92FE,\n\t155302 - 131105: 0x94F2,\n\t155324 - 131105: 0x94F1,\n\t155351 - 131105: 0xA0EA,\n\t155352 - 131105: 0x9DD2,\n\t155418 - 131105: 0xA0B1,\n\t155467 - 131105: 0x91F8,\n\t155617 - 131105: 0x9462,\n\t155618 - 131105: 0x9BA4,\n\t155681 - 131105: 0x877D,\n\t155689 - 131105: 0x8EAD,\n\t155720 - 131105: 0x9EAD,\n\t155748 - 131105: 0x96D0,\n\t155779 - 131105: 0xFEEE,\n\t155799 - 131105: 0x8AB4,\n\t155812 - 131105: 0x9757,\n\t155813 - 131105: 0x8A77,\n\t155906 - 131105: 0x9BF7,\n\t155937 - 131105: 0x8EB5,\n\t155993 - 131105: 0xA06D,\n\t155994 - 131105: 0x8EB6,\n\t155995 - 131105: 0x9756,\n\t155996 - 131105: 0x9540,\n\t156077 - 131105: 0xA0F3,\n\t156078 - 131105: 0x94BE,\n\t156082 - 131105: 0x9BFA,\n\t156125 - 131105: 0xFDDF,\n\t156248 - 131105: 0x9DBC,\n\t156257 - 131105: 0x94FE,\n\t156266 - 131105: 0x8BDB,\n\t156267 - 131105: 0xA0FE,\n\t156368 - 131105: 0x8EC0,\n\t156469 - 131105: 0x9F47,\n\t156491 - 131105: 0x8BDE,\n\t156492 - 131105: 0xA0FB,\n\t156497 - 131105: 0x8EC3,\n\t156606 - 131105: 0x9649,\n\t156661 - 131105: 0xFEC2,\n\t156664 - 131105: 0x954C,\n\t156674 - 131105: 0x9BFD,\n\t156688 - 131105: 0x90CC,\n\t156689 - 131105: 0x9C60,\n\t156690 - 131105: 0x954B,\n\t156746 - 131105: 0x9BFE,\n\t156777 - 131105: 0x9C70,\n\t156804 - 131105: 0x9C43,\n\t156808 - 131105: 0x9C47,\n\t156809 - 131105: 0x8ECC,\n\t156813 - 131105: 0x8E54,\n\t156824 - 131105: 0x8EE4,\n\t156946 - 131105: 0x9C49,\n\t157042 - 131105: 0x8B5E,\n\t157088 - 131105: 0x955E,\n\t157101 - 131105: 0x955C,\n\t157119 - 131105: 0x9C4B,\n\t157202 - 131105: 0x8BE1,\n\t157222 - 131105: 0x8ED9,\n\t157359 - 131105: 0x9DB4,\n\t157361 - 131105: 0x925F,\n\t157365 - 131105: 0x9C4C,\n\t157402 - 131105: 0x8AA1,\n\t157416 - 131105: 0x8EDB,\n\t157436 - 131105: 0x9C56,\n\t157462 - 131105: 0x8AA2,\n\t157505 - 131105: 0x9754,\n\t157593 - 131105: 0x9C5E,\n\t157619 - 131105: 0x9ED4,\n\t157620 - 131105: 0x9568,\n\t157644 - 131105: 0xA0C3,\n\t157724 - 131105: 0x8AE6,\n\t157766 - 131105: 0xA0F7,\n\t157790 - 131105: 0x9C61,\n\t157806 - 131105: 0x9C5F,\n\t157832 - 131105: 0xFC4D,\n\t157834 - 131105: 0x9E5B,\n\t157843 - 131105: 0x9E69,\n\t157895 - 131105: 0x9C63,\n\t157966 - 131105: 0xFEC7,\n\t157969 - 131105: 0xFEC6,\n\t157990 - 131105: 0x9C67,\n\t158009 - 131105: 0x9C69,\n\t158033 - 131105: 0x8BE2,\n\t158120 - 131105: 0x9165,\n\t158133 - 131105: 0x9CE7,\n\t158194 - 131105: 0x8A54,\n\t158202 - 131105: 0x9C6C,\n\t158253 - 131105: 0x9C6E,\n\t158254 - 131105: 0xFE5D,\n\t158260 - 131105: 0x9C73,\n\t158274 - 131105: 0x956A,\n\t158289 - 131105: 0x956D,\n\t158290 - 131105: 0x8EF0,\n\t158469 - 131105: 0x8F4D,\n\t158474 - 131105: 0x8EF6,\n\t158483 - 131105: 0xFABC,\n\t158485 - 131105: 0x8CD5,\n\t158499 - 131105: 0x875E,\n\t158504 - 131105: 0xFBDA,\n\t158544 - 131105: 0x8B4C,\n\t158545 - 131105: 0xFD75,\n\t158546 - 131105: 0x9BDD,\n\t158547 - 131105: 0xFAF5,\n\t158555 - 131105: 0x9C74,\n\t158581 - 131105: 0x9545,\n\t158594 - 131105: 0x96C6,\n\t158614 - 131105: 0x8F6A,\n\t158615 - 131105: 0x8F4E,\n\t158621 - 131105: 0x9C78,\n\t158643 - 131105: 0xFA55,\n\t158656 - 131105: 0x97E4,\n\t158711 - 131105: 0x9C41,\n\t158753 - 131105: 0x925C,\n\t158784 - 131105: 0x96FA,\n\t158785 - 131105: 0x8CF6,\n\t158790 - 131105: 0x8D4D,\n\t158846 - 131105: 0xFB66,\n\t158847 - 131105: 0x8E65,\n\t158848 - 131105: 0x9849,\n\t158849 - 131105: 0xFBA8,\n\t158850 - 131105: 0x9842,\n\t158884 - 131105: 0x9C7A,\n\t158903 - 131105: 0x97FB,\n\t158904 - 131105: 0x90CA,\n\t158909 - 131105: 0x9C5B,\n\t158912 - 131105: 0x974D,\n\t158915 - 131105: 0x8ED3,\n\t158929 - 131105: 0x9561,\n\t159010 - 131105: 0x9F4B,\n\t159011 - 131105: 0x9FB5,\n\t159012 - 131105: 0x93D2,\n\t159013 - 131105: 0xFDAA,\n\t159014 - 131105: 0x9840,\n\t159015 - 131105: 0x9146,\n\t159016 - 131105: 0x9867,\n\t159017 - 131105: 0xFA5A,\n\t159018 - 131105: 0xFBA9,\n\t159057 - 131105: 0x9841,\n\t159092 - 131105: 0x8CD3,\n\t159136 - 131105: 0xFCFD,\n\t159137 - 131105: 0xFDAB,\n\t159138 - 131105: 0x91BD,\n\t159139 - 131105: 0x8F4C,\n\t159140 - 131105: 0x96C9,\n\t159141 - 131105: 0x8F55,\n\t159142 - 131105: 0xFBAE,\n\t159143 - 131105: 0x956F,\n\t159150 - 131105: 0x9C7D,\n\t159196 - 131105: 0xA0F0,\n\t159210 - 131105: 0x946F,\n\t159211 - 131105: 0xFDAC,\n\t159216 - 131105: 0x96CB,\n\t159232 - 131105: 0x96CE,\n\t159237 - 131105: 0xA056,\n\t159239 - 131105: 0x9CE1,\n\t159250 - 131105: 0x96C4,\n\t159298 - 131105: 0x8F5E,\n\t159299 - 131105: 0x8F6C,\n\t159300 - 131105: 0x8EA3,\n\t159301 - 131105: 0xFBB3,\n\t159342 - 131105: 0xFC53,\n\t159346 - 131105: 0xFDB3,\n\t159351 - 131105: 0x8F6B,\n\t159364 - 131105: 0x96CA,\n\t159368 - 131105: 0x87CD,\n\t159371 - 131105: 0x8753,\n\t159385 - 131105: 0x8F79,\n\t159440 - 131105: 0x9E6F,\n\t159441 - 131105: 0xA0C5,\n\t159442 - 131105: 0xFC78,\n\t159443 - 131105: 0x8E42,\n\t159444 - 131105: 0x8F5A,\n\t159445 - 131105: 0x90C2,\n\t159446 - 131105: 0x8EA5,\n\t159447 - 131105: 0x9061,\n\t159526 - 131105: 0x924F,\n\t159603 - 131105: 0x9373,\n\t159604 - 131105: 0xFDB5,\n\t159647 - 131105: 0xFECC,\n\t159649 - 131105: 0xFBBD,\n\t159678 - 131105: 0x8CD6,\n\t159710 - 131105: 0x9843,\n\t159711 - 131105: 0x96C5,\n\t159758 - 131105: 0x89BC,\n\t159819 - 131105: 0x9CA3,\n\t159826 - 131105: 0x924B,\n\t159827 - 131105: 0x984A,\n\t159880 - 131105: 0x8FA4,\n\t159917 - 131105: 0xA0F1,\n\t159918 - 131105: 0x9EFB,\n\t159919 - 131105: 0x9CD2,\n\t159949 - 131105: 0x8FA7,\n\t159954 - 131105: 0x8754,\n\t159992 - 131105: 0xFC5C,\n\t160009 - 131105: 0x9845,\n\t160012 - 131105: 0x9046,\n\t160013 - 131105: 0x8CD1,\n\t160038 - 131105: 0xFEFA,\n\t160039 - 131105: 0x9560,\n\t160100 - 131105: 0x9F48,\n\t160101 - 131105: 0x9247,\n\t160117 - 131105: 0x90FB,\n\t160205 - 131105: 0x9CA4,\n\t160283 - 131105: 0x9571,\n\t160359 - 131105: 0x8745,\n\t160384 - 131105: 0x9CA6,\n\t160389 - 131105: 0x9CA7,\n\t160395 - 131105: 0x9CAA,\n\t160434 - 131105: 0x9ED3,\n\t160438 - 131105: 0x9E70,\n\t160486 - 131105: 0x9CAC,\n\t160594 - 131105: 0x8752,\n\t160666 - 131105: 0x8FAE,\n\t160767 - 131105: 0x8D50,\n\t160802 - 131105: 0x957D,\n\t160848 - 131105: 0x9CB0,\n\t160900 - 131105: 0x97B6,\n\t160902 - 131105: 0xA0BD,\n\t161140 - 131105: 0x8ADF,\n\t161187 - 131105: 0x9EAA,\n\t161248 - 131105: 0x8FBD,\n\t161252 - 131105: 0x8FBF,\n\t161277 - 131105: 0x9369,\n\t161278 - 131105: 0x9BA7,\n\t161287 - 131105: 0xC8A4,\n\t161292 - 131105: 0xFEEA,\n\t161330 - 131105: 0x9BE1,\n\t161337 - 131105: 0x8B41,\n\t161365 - 131105: 0x9DB6,\n\t161366 - 131105: 0xA0EB,\n\t161367 - 131105: 0x9BA3,\n\t161428 - 131105: 0x8BA1,\n\t161551 - 131105: 0x8FC8,\n\t161589 - 131105: 0x894C,\n\t161590 - 131105: 0x9860,\n\t161601 - 131105: 0x94C7,\n\t161630 - 131105: 0x8B58,\n\t161668 - 131105: 0x95AB,\n\t161669 - 131105: 0x95AA,\n\t161740 - 131105: 0x9CC3,\n\t161880 - 131105: 0x9CC4,\n\t161904 - 131105: 0x93D6,\n\t161949 - 131105: 0x9DAC,\n\t161970 - 131105: 0x8BE6,\n\t161992 - 131105: 0x8A71,\n\t162084 - 131105: 0x8FD1,\n\t162151 - 131105: 0x99D5,\n\t162170 - 131105: 0x90F4,\n\t162208 - 131105: 0x8AA3,\n\t162269 - 131105: 0x9CCE,\n\t162301 - 131105: 0x9CD4,\n\t162314 - 131105: 0x9CD5,\n\t162318 - 131105: 0xFBC8,\n\t162366 - 131105: 0x9DB3,\n\t162387 - 131105: 0xFC70,\n\t162393 - 131105: 0x8FD7,\n\t162425 - 131105: 0x9B73,\n\t162436 - 131105: 0xFA5B,\n\t162493 - 131105: 0x8FD2,\n\t162494 - 131105: 0x9064,\n\t162548 - 131105: 0x98B6,\n\t162566 - 131105: 0x9668,\n\t162571 - 131105: 0x9CD6,\n\t162584 - 131105: 0x98BD,\n\t162616 - 131105: 0x8FDC,\n\t162617 - 131105: 0xFEF6,\n\t162618 - 131105: 0x8FD9,\n\t162632 - 131105: 0x9541,\n\t162661 - 131105: 0x87CA,\n\t162799 - 131105: 0x876C,\n\t162804 - 131105: 0x97F3,\n\t162834 - 131105: 0x9BF8,\n\t162924 - 131105: 0x875A,\n\t162993 - 131105: 0x8748,\n\t163013 - 131105: 0x874A,\n\t163119 - 131105: 0x9E6C,\n\t163155 - 131105: 0x8FF2,\n\t163156 - 131105: 0x8FEE,\n\t163174 - 131105: 0x9CD7,\n\t163187 - 131105: 0x9E6E,\n\t163204 - 131105: 0x8A40,\n\t163215 - 131105: 0x8FEF,\n\t163224 - 131105: 0x8FF4,\n\t163261 - 131105: 0x8FF5,\n\t163292 - 131105: 0x95C2,\n\t163405 - 131105: 0x986A,\n\t163407 - 131105: 0x97CF,\n\t163630 - 131105: 0x9EE5,\n\t163833 - 131105: 0x9E7C,\n\t163842 - 131105: 0x9041,\n\t163849 - 131105: 0x9CDB,\n\t163870 - 131105: 0x9441,\n\t163875 - 131105: 0x9CE6,\n\t163876 - 131105: 0x9DB0,\n\t163912 - 131105: 0x9CEA,\n\t163971 - 131105: 0x9CED,\n\t163984 - 131105: 0x9CFA,\n\t164029 - 131105: 0x8B62,\n\t164030 - 131105: 0x8A4E,\n\t164072 - 131105: 0x9CCA,\n\t164073 - 131105: 0x8A66,\n\t164084 - 131105: 0x9CFB,\n\t164142 - 131105: 0x9CFC,\n\t164175 - 131105: 0x9CFE,\n\t164189 - 131105: 0x8A53,\n\t164207 - 131105: 0x9CE5,\n\t164233 - 131105: 0x9D40,\n\t164271 - 131105: 0x9D41,\n\t164284 - 131105: 0x9045,\n\t164359 - 131105: 0x8B73,\n\t164376 - 131105: 0x97CA,\n\t164378 - 131105: 0x9D42,\n\t164438 - 131105: 0x8A61,\n\t164476 - 131105: 0x8BAE,\n\t164507 - 131105: 0x8AD2,\n\t164557 - 131105: 0x8BA2,\n\t164578 - 131105: 0x9DF2,\n\t164614 - 131105: 0x9D43,\n\t164632 - 131105: 0x9CDF,\n\t164655 - 131105: 0x9D44,\n\t164666 - 131105: 0x8ECA,\n\t164709 - 131105: 0x904E,\n\t164717 - 131105: 0x8EB3,\n\t164733 - 131105: 0x9FF5,\n\t164746 - 131105: 0x9D45,\n\t164882 - 131105: 0x904F,\n\t164968 - 131105: 0x9D47,\n\t164972 - 131105: 0x89CA,\n\t164979 - 131105: 0x9CB5,\n\t164994 - 131105: 0xFBFE,\n\t165121 - 131105: 0x905E,\n\t165180 - 131105: 0x9063,\n\t165181 - 131105: 0x9057,\n\t165228 - 131105: 0x9066,\n\t165352 - 131105: 0x9BC0,\n\t165364 - 131105: 0xFCE5,\n\t165376 - 131105: 0x9162,\n\t165387 - 131105: 0x9067,\n\t165413 - 131105: 0x8FA1,\n\t165435 - 131105: 0x8FA2,\n\t165546 - 131105: 0x9D48,\n\t165547 - 131105: 0xFAD3,\n\t165554 - 131105: 0x8D4F,\n\t165564 - 131105: 0x905D,\n\t165592 - 131105: 0x90B9,\n\t165606 - 131105: 0x906B,\n\t165647 - 131105: 0x8C5C,\n\t165651 - 131105: 0x9069,\n\t165892 - 131105: 0xFE57,\n\t165931 - 131105: 0xFE55,\n\t166157 - 131105: 0x87A6,\n\t166195 - 131105: 0x9073,\n\t166216 - 131105: 0x9BEF,\n\t166217 - 131105: 0x9CF0,\n\t166230 - 131105: 0x9D4B,\n\t166244 - 131105: 0xFED9,\n\t166248 - 131105: 0xFEDA,\n\t166252 - 131105: 0x91E0,\n\t166253 - 131105: 0x8D43,\n\t166270 - 131105: 0x91D8,\n\t166281 - 131105: 0x9646,\n\t166312 - 131105: 0x9360,\n\t166314 - 131105: 0xFA53,\n\t166315 - 131105: 0x9CD3,\n\t166328 - 131105: 0x9D4E,\n\t166332 - 131105: 0xFB40,\n\t166336 - 131105: 0x8DE2,\n\t166364 - 131105: 0x9442,\n\t166366 - 131105: 0x9056,\n\t166369 - 131105: 0x9865,\n\t166371 - 131105: 0x8C6C,\n\t166372 - 131105: 0xFA4A,\n\t166375 - 131105: 0x9D50,\n\t166376 - 131105: 0x9D52,\n\t166393 - 131105: 0x95AF,\n\t166394 - 131105: 0x975A,\n\t166395 - 131105: 0x9349,\n\t166396 - 131105: 0x9747,\n\t166415 - 131105: 0xA0F4,\n\t166422 - 131105: 0x9778,\n\t166437 - 131105: 0x8FCF,\n\t166441 - 131105: 0xFC60,\n\t166450 - 131105: 0x8C4E,\n\t166454 - 131105: 0xFC56,\n\t166468 - 131105: 0x91DC,\n\t166469 - 131105: 0x9661,\n\t166470 - 131105: 0x92EC,\n\t166471 - 131105: 0x935D,\n\t166472 - 131105: 0x8EDE,\n\t166473 - 131105: 0x96FE,\n\t166474 - 131105: 0xFD4F,\n\t166475 - 131105: 0x95DE,\n\t166489 - 131105: 0x98B0,\n\t166490 - 131105: 0xA040,\n\t166529 - 131105: 0x97BD,\n\t166530 - 131105: 0x977D,\n\t166531 - 131105: 0x97F5,\n\t166554 - 131105: 0x9BAC,\n\t166555 - 131105: 0xFADA,\n\t166556 - 131105: 0x92C2,\n\t166592 - 131105: 0x97B1,\n\t166598 - 131105: 0x907B,\n\t166603 - 131105: 0x93FE,\n\t166604 - 131105: 0x947B,\n\t166606 - 131105: 0x9777,\n\t166622 - 131105: 0xFABE,\n\t166623 - 131105: 0xFD43,\n\t166624 - 131105: 0x90C6,\n\t166625 - 131105: 0x90A4,\n\t166626 - 131105: 0x90A8,\n\t166627 - 131105: 0x94A9,\n\t166629 - 131105: 0x90A9,\n\t166634 - 131105: 0x8C65,\n\t166652 - 131105: 0x95E0,\n\t166668 - 131105: 0x907D,\n\t166675 - 131105: 0x9265,\n\t166689 - 131105: 0xFDBA,\n\t166690 - 131105: 0x93C4,\n\t166699 - 131105: 0xFEED,\n\t166700 - 131105: 0x9DAB,\n\t166701 - 131105: 0xA0E3,\n\t166703 - 131105: 0x9648,\n\t166726 - 131105: 0x9D53,\n\t166732 - 131105: 0x8AA9,\n\t166734 - 131105: 0x9BC5,\n\t166736 - 131105: 0x965D,\n\t166755 - 131105: 0x975F,\n\t166756 - 131105: 0x965F,\n\t166757 - 131105: 0x966E,\n\t166758 - 131105: 0xFB5D,\n\t166764 - 131105: 0x9DB1,\n\t166799 - 131105: 0xFEA3,\n\t166809 - 131105: 0x9DB2,\n\t166812 - 131105: 0x95AE,\n\t166813 - 131105: 0xFCA3,\n\t166841 - 131105: 0x8769,\n\t166850 - 131105: 0xA0A2,\n\t166853 - 131105: 0x9655,\n\t166868 - 131105: 0x9D54,\n\t166871 - 131105: 0x9341,\n\t166873 - 131105: 0x95AD,\n\t166874 - 131105: 0x91D5,\n\t166887 - 131105: 0x977A,\n\t166888 - 131105: 0xFDFC,\n\t166889 - 131105: 0x8E47,\n\t166890 - 131105: 0x93FD,\n\t166891 - 131105: 0x90A5,\n\t166892 - 131105: 0x90AC,\n\t166901 - 131105: 0x95AC,\n\t166911 - 131105: 0x90AE,\n\t166915 - 131105: 0xFEA5,\n\t166921 - 131105: 0x9D56,\n\t166940 - 131105: 0x97E3,\n\t166941 - 131105: 0x95E2,\n\t166947 - 131105: 0x9466,\n\t166950 - 131105: 0x9647,\n\t166955 - 131105: 0x91B8,\n\t166960 - 131105: 0x9CEC,\n\t166969 - 131105: 0x90AD,\n\t166971 - 131105: 0x95E3,\n\t167114 - 131105: 0x8B4F,\n\t167117 - 131105: 0x8AE3,\n\t167122 - 131105: 0x8B4D,\n\t167220 - 131105: 0x95EA,\n\t167321 - 131105: 0x8B4E,\n\t167353 - 131105: 0x8CC1,\n\t167439 - 131105: 0x8BED,\n\t167478 - 131105: 0x91D9,\n\t167481 - 131105: 0xA0A4,\n\t167525 - 131105: 0x95F5,\n\t167526 - 131105: 0x95F4,\n\t167575 - 131105: 0x9FB3,\n\t167596 - 131105: 0xFEAF,\n\t167602 - 131105: 0xFE72,\n\t167603 - 131105: 0x927A,\n\t167641 - 131105: 0xFEAC,\n\t167655 - 131105: 0x95F3,\n\t167877 - 131105: 0x9D58,\n\t168057 - 131105: 0x8D46,\n\t168072 - 131105: 0x9372,\n\t168075 - 131105: 0x91C5,\n\t168083 - 131105: 0x9642,\n\t168111 - 131105: 0x90CD,\n\t168112 - 131105: 0x95FE,\n\t168113 - 131105: 0x9159,\n\t168128 - 131105: 0x9C65,\n\t168164 - 131105: 0x97CC,\n\t168165 - 131105: 0x90CE,\n\t168172 - 131105: 0x9D59,\n\t168173 - 131105: 0xFCF5,\n\t168205 - 131105: 0xFEFD,\n\t168208 - 131105: 0x9D5B,\n\t168252 - 131105: 0x9D5C,\n\t168269 - 131105: 0x937E,\n\t168283 - 131105: 0x98AC,\n\t168286 - 131105: 0x9D5E,\n\t168304 - 131105: 0xFDD0,\n\t168348 - 131105: 0xFD60,\n\t168360 - 131105: 0x9CCF,\n\t168405 - 131105: 0x90DD,\n\t168427 - 131105: 0x90E0,\n\t168989 - 131105: 0x90F3,\n\t168992 - 131105: 0x98B1,\n\t169011 - 131105: 0x90F0,\n\t169023 - 131105: 0x93BD,\n\t169032 - 131105: 0x95B7,\n\t169168 - 131105: 0x9F46,\n\t169177 - 131105: 0x8E4B,\n\t169178 - 131105: 0x9658,\n\t169189 - 131105: 0x8A4C,\n\t169191 - 131105: 0x9D63,\n\t169374 - 131105: 0x9ECF,\n\t169392 - 131105: 0x9D65,\n\t169400 - 131105: 0x9D66,\n\t169431 - 131105: 0x965A,\n\t169449 - 131105: 0x9D64,\n\t169460 - 131105: 0x8A6C,\n\t169760 - 131105: 0x8AD9,\n\t169778 - 131105: 0x9D67,\n\t169940 - 131105: 0x8A70,\n\t170000 - 131105: 0x8BF3,\n\t170071 - 131105: 0x9150,\n\t170148 - 131105: 0x9CC1,\n\t170193 - 131105: 0x9D68,\n\t170218 - 131105: 0x93A7,\n\t170225 - 131105: 0x9674,\n\t170234 - 131105: 0x8CFD,\n\t170243 - 131105: 0xA0EF,\n\t170245 - 131105: 0x9151,\n\t170287 - 131105: 0x96C1,\n\t170309 - 131105: 0x8777,\n\t170311 - 131105: 0x8C64,\n\t170312 - 131105: 0x9676,\n\t170313 - 131105: 0x9D69,\n\t170333 - 131105: 0xFCA4,\n\t170346 - 131105: 0x9D6A,\n\t170397 - 131105: 0x924E,\n\t170435 - 131105: 0x9D6B,\n\t170441 - 131105: 0x9BC1,\n\t170536 - 131105: 0x9D6C,\n\t170573 - 131105: 0x8A65,\n\t170757 - 131105: 0x915D,\n\t170766 - 131105: 0x9D6D,\n\t170965 - 131105: 0x915A,\n\t171123 - 131105: 0x8C42,\n\t171181 - 131105: 0x9CC0,\n\t171326 - 131105: 0x916A,\n\t171354 - 131105: 0x9D6E,\n\t171388 - 131105: 0x9EA6,\n\t171416 - 131105: 0x9DCD,\n\t171419 - 131105: 0x9D6F,\n\t171510 - 131105: 0x89BB,\n\t171526 - 131105: 0x9EF9,\n\t171565 - 131105: 0x96B4,\n\t171624 - 131105: 0x9172,\n\t171692 - 131105: 0x9EC8,\n\t171696 - 131105: 0x8771,\n\t171715 - 131105: 0x8B55,\n\t171768 - 131105: 0x9D71,\n\t171811 - 131105: 0x9D72,\n\t171824 - 131105: 0x9ECC,\n\t171959 - 131105: 0x9174,\n\t171998 - 131105: 0x9ED0,\n\t172052 - 131105: 0x905C,\n\t172167 - 131105: 0x8ED2,\n\t172217 - 131105: 0x91A8,\n\t172257 - 131105: 0x9177,\n\t172269 - 131105: 0x96BF,\n\t172275 - 131105: 0x96C0,\n\t172280 - 131105: 0x8FB1,\n\t172286 - 131105: 0x96B7,\n\t172295 - 131105: 0x8C55,\n\t172323 - 131105: 0x9178,\n\t172339 - 131105: 0x89BE,\n\t172340 - 131105: 0x917C,\n\t172368 - 131105: 0xFB77,\n\t172434 - 131105: 0x9175,\n\t172435 - 131105: 0x91A3,\n\t172459 - 131105: 0x9176,\n\t172468 - 131105: 0x96BE,\n\t172469 - 131105: 0x8D49,\n\t172511 - 131105: 0x9179,\n\t172533 - 131105: 0x96B6,\n\t172576 - 131105: 0x91A4,\n\t172595 - 131105: 0x91A6,\n\t172691 - 131105: 0x9D75,\n\t172703 - 131105: 0x9052,\n\t172722 - 131105: 0xA045,\n\t172724 - 131105: 0x91A9,\n\t172726 - 131105: 0x98AA,\n\t172730 - 131105: 0x8C5F,\n\t172733 - 131105: 0x8BAA,\n\t172767 - 131105: 0x9CDD,\n\t172799 - 131105: 0x9D77,\n\t172881 - 131105: 0x8756,\n\t172969 - 131105: 0x8940,\n\t173108 - 131105: 0x9EEC,\n\t173147 - 131105: 0x93AA,\n\t173510 - 131105: 0x9478,\n\t173515 - 131105: 0x9D7A,\n\t173569 - 131105: 0x8AC9,\n\t173618 - 131105: 0x8B4B,\n\t173642 - 131105: 0x9FEC,\n\t173659 - 131105: 0x8AE2,\n\t173737 - 131105: 0x9E75,\n}\n\nconst encode1Low, encode1High = 11904, 40908\n\nvar encode1 = [...]uint16{\n\t11904 - 11904: 0xC8D6,\n\t11908 - 11904: 0xC8D7,\n\t11910 - 11904: 0xC8D8,\n\t11911 - 11904: 0xC8D9,\n\t11912 - 11904: 0xC8DA,\n\t11914 - 11904: 0xC8DB,\n\t11916 - 11904: 0xC8DC,\n\t11917 - 11904: 0xC8DD,\n\t11925 - 11904: 0xC8DE,\n\t11932 - 11904: 0xC8DF,\n\t11933 - 11904: 0xC8E0,\n\t11941 - 11904: 0xC8E1,\n\t11943 - 11904: 0xC8E2,\n\t11946 - 11904: 0xC8E3,\n\t11948 - 11904: 0xC8E4,\n\t11950 - 11904: 0xC8E5,\n\t11958 - 11904: 0xC8E6,\n\t11964 - 11904: 0xC8E7,\n\t11966 - 11904: 0xC8E8,\n\t11974 - 11904: 0xC8E9,\n\t11978 - 11904: 0xC8EA,\n\t11980 - 11904: 0xC8EB,\n\t11981 - 11904: 0xC8EC,\n\t11983 - 11904: 0xC8ED,\n\t11990 - 11904: 0xC8EE,\n\t11991 - 11904: 0xC8EF,\n\t11998 - 11904: 0xC8F0,\n\t12003 - 11904: 0xC8F1,\n\t12083 - 11904: 0xC6CD,\n\t12288 - 11904: 0xA140,\n\t12289 - 11904: 0xA142,\n\t12290 - 11904: 0xA143,\n\t12291 - 11904: 0xC6DE,\n\t12293 - 11904: 0xC6E0,\n\t12294 - 11904: 0xC6E1,\n\t12295 - 11904: 0xC6E2,\n\t12296 - 11904: 0xA171,\n\t12297 - 11904: 0xA172,\n\t12298 - 11904: 0xA16D,\n\t12299 - 11904: 0xA16E,\n\t12300 - 11904: 0xA175,\n\t12301 - 11904: 0xA176,\n\t12302 - 11904: 0xA179,\n\t12303 - 11904: 0xA17A,\n\t12304 - 11904: 0xA169,\n\t12305 - 11904: 0xA16A,\n\t12306 - 11904: 0xA245,\n\t12308 - 11904: 0xA165,\n\t12309 - 11904: 0xA166,\n\t12317 - 11904: 0xA1A9,\n\t12318 - 11904: 0xA1AA,\n\t12321 - 11904: 0xA2C3,\n\t12322 - 11904: 0xA2C4,\n\t12323 - 11904: 0xA2C5,\n\t12324 - 11904: 0xA2C6,\n\t12325 - 11904: 0xA2C7,\n\t12326 - 11904: 0xA2C8,\n\t12327 - 11904: 0xA2C9,\n\t12328 - 11904: 0xA2CA,\n\t12329 - 11904: 0xA2CB,\n\t12353 - 11904: 0xC6E7,\n\t12354 - 11904: 0xC6E8,\n\t12355 - 11904: 0xC6E9,\n\t12356 - 11904: 0xC6EA,\n\t12357 - 11904: 0xC6EB,\n\t12358 - 11904: 0xC6EC,\n\t12359 - 11904: 0xC6ED,\n\t12360 - 11904: 0xC6EE,\n\t12361 - 11904: 0xC6EF,\n\t12362 - 11904: 0xC6F0,\n\t12363 - 11904: 0xC6F1,\n\t12364 - 11904: 0xC6F2,\n\t12365 - 11904: 0xC6F3,\n\t12366 - 11904: 0xC6F4,\n\t12367 - 11904: 0xC6F5,\n\t12368 - 11904: 0xC6F6,\n\t12369 - 11904: 0xC6F7,\n\t12370 - 11904: 0xC6F8,\n\t12371 - 11904: 0xC6F9,\n\t12372 - 11904: 0xC6FA,\n\t12373 - 11904: 0xC6FB,\n\t12374 - 11904: 0xC6FC,\n\t12375 - 11904: 0xC6FD,\n\t12376 - 11904: 0xC6FE,\n\t12377 - 11904: 0xC740,\n\t12378 - 11904: 0xC741,\n\t12379 - 11904: 0xC742,\n\t12380 - 11904: 0xC743,\n\t12381 - 11904: 0xC744,\n\t12382 - 11904: 0xC745,\n\t12383 - 11904: 0xC746,\n\t12384 - 11904: 0xC747,\n\t12385 - 11904: 0xC748,\n\t12386 - 11904: 0xC749,\n\t12387 - 11904: 0xC74A,\n\t12388 - 11904: 0xC74B,\n\t12389 - 11904: 0xC74C,\n\t12390 - 11904: 0xC74D,\n\t12391 - 11904: 0xC74E,\n\t12392 - 11904: 0xC74F,\n\t12393 - 11904: 0xC750,\n\t12394 - 11904: 0xC751,\n\t12395 - 11904: 0xC752,\n\t12396 - 11904: 0xC753,\n\t12397 - 11904: 0xC754,\n\t12398 - 11904: 0xC755,\n\t12399 - 11904: 0xC756,\n\t12400 - 11904: 0xC757,\n\t12401 - 11904: 0xC758,\n\t12402 - 11904: 0xC759,\n\t12403 - 11904: 0xC75A,\n\t12404 - 11904: 0xC75B,\n\t12405 - 11904: 0xC75C,\n\t12406 - 11904: 0xC75D,\n\t12407 - 11904: 0xC75E,\n\t12408 - 11904: 0xC75F,\n\t12409 - 11904: 0xC760,\n\t12410 - 11904: 0xC761,\n\t12411 - 11904: 0xC762,\n\t12412 - 11904: 0xC763,\n\t12413 - 11904: 0xC764,\n\t12414 - 11904: 0xC765,\n\t12415 - 11904: 0xC766,\n\t12416 - 11904: 0xC767,\n\t12417 - 11904: 0xC768,\n\t12418 - 11904: 0xC769,\n\t12419 - 11904: 0xC76A,\n\t12420 - 11904: 0xC76B,\n\t12421 - 11904: 0xC76C,\n\t12422 - 11904: 0xC76D,\n\t12423 - 11904: 0xC76E,\n\t12424 - 11904: 0xC76F,\n\t12425 - 11904: 0xC770,\n\t12426 - 11904: 0xC771,\n\t12427 - 11904: 0xC772,\n\t12428 - 11904: 0xC773,\n\t12429 - 11904: 0xC774,\n\t12430 - 11904: 0xC775,\n\t12431 - 11904: 0xC776,\n\t12432 - 11904: 0xC777,\n\t12433 - 11904: 0xC778,\n\t12434 - 11904: 0xC779,\n\t12435 - 11904: 0xC77A,\n\t12443 - 11904: 0xC8D4,\n\t12444 - 11904: 0xC8D5,\n\t12445 - 11904: 0xC6DC,\n\t12446 - 11904: 0xC6DD,\n\t12449 - 11904: 0xC77B,\n\t12450 - 11904: 0xC77C,\n\t12451 - 11904: 0xC77D,\n\t12452 - 11904: 0xC77E,\n\t12453 - 11904: 0xC7A1,\n\t12454 - 11904: 0xC7A2,\n\t12455 - 11904: 0xC7A3,\n\t12456 - 11904: 0xC7A4,\n\t12457 - 11904: 0xC7A5,\n\t12458 - 11904: 0xC7A6,\n\t12459 - 11904: 0xC7A7,\n\t12460 - 11904: 0xC7A8,\n\t12461 - 11904: 0xC7A9,\n\t12462 - 11904: 0xC7AA,\n\t12463 - 11904: 0xC7AB,\n\t12464 - 11904: 0xC7AC,\n\t12465 - 11904: 0xC7AD,\n\t12466 - 11904: 0xC7AE,\n\t12467 - 11904: 0xC7AF,\n\t12468 - 11904: 0xC7B0,\n\t12469 - 11904: 0xC7B1,\n\t12470 - 11904: 0xC7B2,\n\t12471 - 11904: 0xC7B3,\n\t12472 - 11904: 0xC7B4,\n\t12473 - 11904: 0xC7B5,\n\t12474 - 11904: 0xC7B6,\n\t12475 - 11904: 0xC7B7,\n\t12476 - 11904: 0xC7B8,\n\t12477 - 11904: 0xC7B9,\n\t12478 - 11904: 0xC7BA,\n\t12479 - 11904: 0xC7BB,\n\t12480 - 11904: 0xC7BC,\n\t12481 - 11904: 0xC7BD,\n\t12482 - 11904: 0xC7BE,\n\t12483 - 11904: 0xC7BF,\n\t12484 - 11904: 0xC7C0,\n\t12485 - 11904: 0xC7C1,\n\t12486 - 11904: 0xC7C2,\n\t12487 - 11904: 0xC7C3,\n\t12488 - 11904: 0xC7C4,\n\t12489 - 11904: 0xC7C5,\n\t12490 - 11904: 0xC7C6,\n\t12491 - 11904: 0xC7C7,\n\t12492 - 11904: 0xC7C8,\n\t12493 - 11904: 0xC7C9,\n\t12494 - 11904: 0xC7CA,\n\t12495 - 11904: 0xC7CB,\n\t12496 - 11904: 0xC7CC,\n\t12497 - 11904: 0xC7CD,\n\t12498 - 11904: 0xC7CE,\n\t12499 - 11904: 0xC7CF,\n\t12500 - 11904: 0xC7D0,\n\t12501 - 11904: 0xC7D1,\n\t12502 - 11904: 0xC7D2,\n\t12503 - 11904: 0xC7D3,\n\t12504 - 11904: 0xC7D4,\n\t12505 - 11904: 0xC7D5,\n\t12506 - 11904: 0xC7D6,\n\t12507 - 11904: 0xC7D7,\n\t12508 - 11904: 0xC7D8,\n\t12509 - 11904: 0xC7D9,\n\t12510 - 11904: 0xC7DA,\n\t12511 - 11904: 0xC7DB,\n\t12512 - 11904: 0xC7DC,\n\t12513 - 11904: 0xC7DD,\n\t12514 - 11904: 0xC7DE,\n\t12515 - 11904: 0xC7DF,\n\t12516 - 11904: 0xC7E0,\n\t12517 - 11904: 0xC7E1,\n\t12518 - 11904: 0xC7E2,\n\t12519 - 11904: 0xC7E3,\n\t12520 - 11904: 0xC7E4,\n\t12521 - 11904: 0xC7E5,\n\t12522 - 11904: 0xC7E6,\n\t12523 - 11904: 0xC7E7,\n\t12524 - 11904: 0xC7E8,\n\t12525 - 11904: 0xC7E9,\n\t12526 - 11904: 0xC7EA,\n\t12527 - 11904: 0xC7EB,\n\t12528 - 11904: 0xC7EC,\n\t12529 - 11904: 0xC7ED,\n\t12530 - 11904: 0xC7EE,\n\t12531 - 11904: 0xC7EF,\n\t12532 - 11904: 0xC7F0,\n\t12533 - 11904: 0xC7F1,\n\t12534 - 11904: 0xC7F2,\n\t12540 - 11904: 0xC6E3,\n\t12541 - 11904: 0xC6DA,\n\t12542 - 11904: 0xC6DB,\n\t12549 - 11904: 0xA374,\n\t12550 - 11904: 0xA375,\n\t12551 - 11904: 0xA376,\n\t12552 - 11904: 0xA377,\n\t12553 - 11904: 0xA378,\n\t12554 - 11904: 0xA379,\n\t12555 - 11904: 0xA37A,\n\t12556 - 11904: 0xA37B,\n\t12557 - 11904: 0xA37C,\n\t12558 - 11904: 0xA37D,\n\t12559 - 11904: 0xA37E,\n\t12560 - 11904: 0xA3A1,\n\t12561 - 11904: 0xA3A2,\n\t12562 - 11904: 0xA3A3,\n\t12563 - 11904: 0xA3A4,\n\t12564 - 11904: 0xA3A5,\n\t12565 - 11904: 0xA3A6,\n\t12566 - 11904: 0xA3A7,\n\t12567 - 11904: 0xA3A8,\n\t12568 - 11904: 0xA3A9,\n\t12569 - 11904: 0xA3AA,\n\t12570 - 11904: 0xA3AB,\n\t12571 - 11904: 0xA3AC,\n\t12572 - 11904: 0xA3AD,\n\t12573 - 11904: 0xA3AE,\n\t12574 - 11904: 0xA3AF,\n\t12575 - 11904: 0xA3B0,\n\t12576 - 11904: 0xA3B1,\n\t12577 - 11904: 0xA3B2,\n\t12578 - 11904: 0xA3B3,\n\t12579 - 11904: 0xA3B4,\n\t12580 - 11904: 0xA3B5,\n\t12581 - 11904: 0xA3B6,\n\t12582 - 11904: 0xA3B7,\n\t12583 - 11904: 0xA3B8,\n\t12584 - 11904: 0xA3B9,\n\t12585 - 11904: 0xA3BA,\n\t12736 - 11904: 0x8840,\n\t12737 - 11904: 0x8841,\n\t12738 - 11904: 0x8842,\n\t12739 - 11904: 0x8843,\n\t12740 - 11904: 0x8844,\n\t12741 - 11904: 0x8846,\n\t12742 - 11904: 0x8849,\n\t12743 - 11904: 0x884A,\n\t12744 - 11904: 0x884D,\n\t12745 - 11904: 0x884F,\n\t12746 - 11904: 0x8850,\n\t12747 - 11904: 0x8851,\n\t12748 - 11904: 0x8852,\n\t12749 - 11904: 0x8854,\n\t12750 - 11904: 0x8855,\n\t12751 - 11904: 0xC879,\n\t12849 - 11904: 0xC8D1,\n\t12963 - 11904: 0xA1C0,\n\t13198 - 11904: 0xA255,\n\t13199 - 11904: 0xA256,\n\t13212 - 11904: 0xA250,\n\t13213 - 11904: 0xA251,\n\t13214 - 11904: 0xA252,\n\t13217 - 11904: 0xA254,\n\t13252 - 11904: 0xA257,\n\t13262 - 11904: 0xA253,\n\t13265 - 11904: 0xA1EB,\n\t13266 - 11904: 0xA1EA,\n\t13269 - 11904: 0xA24F,\n\t13365 - 11904: 0x9277,\n\t13376 - 11904: 0x96DF,\n\t13386 - 11904: 0x8CF4,\n\t13388 - 11904: 0x89D5,\n\t13412 - 11904: 0x93CD,\n\t13427 - 11904: 0x9BDF,\n\t13434 - 11904: 0xFA68,\n\t13437 - 11904: 0x89DA,\n\t13438 - 11904: 0x8F59,\n\t13459 - 11904: 0x89DB,\n\t13462 - 11904: 0x8F5D,\n\t13477 - 11904: 0x89DC,\n\t13487 - 11904: 0x96F7,\n\t13500 - 11904: 0x8ADA,\n\t13505 - 11904: 0x8BDC,\n\t13512 - 11904: 0x97DB,\n\t13535 - 11904: 0x9E53,\n\t13540 - 11904: 0x9DAA,\n\t13542 - 11904: 0x87BE,\n\t13563 - 11904: 0x9BEA,\n\t13574 - 11904: 0x8A6E,\n\t13630 - 11904: 0x8BC8,\n\t13649 - 11904: 0x89E8,\n\t13651 - 11904: 0x89EA,\n\t13657 - 11904: 0x8C4B,\n\t13665 - 11904: 0xFB70,\n\t13677 - 11904: 0x89ED,\n\t13680 - 11904: 0x94DD,\n\t13682 - 11904: 0x89EE,\n\t13687 - 11904: 0x9EB4,\n\t13688 - 11904: 0x8AD3,\n\t13700 - 11904: 0x92DB,\n\t13719 - 11904: 0x94DB,\n\t13720 - 11904: 0x89F9,\n\t13729 - 11904: 0xFB7A,\n\t13733 - 11904: 0x89FB,\n\t13741 - 11904: 0x9EFC,\n\t13759 - 11904: 0x89FC,\n\t13761 - 11904: 0x89BF,\n\t13765 - 11904: 0x89FE,\n\t13767 - 11904: 0x89E6,\n\t13770 - 11904: 0x9D46,\n\t13774 - 11904: 0x9DEE,\n\t13778 - 11904: 0xA07E,\n\t13782 - 11904: 0xA068,\n\t13787 - 11904: 0x98E9,\n\t13789 - 11904: 0x8B68,\n\t13809 - 11904: 0x8DFD,\n\t13810 - 11904: 0x8BBE,\n\t13811 - 11904: 0x9FD9,\n\t13819 - 11904: 0x8AEB,\n\t13822 - 11904: 0x9FD7,\n\t13833 - 11904: 0x8B6A,\n\t13848 - 11904: 0x9C5C,\n\t13850 - 11904: 0x8BB1,\n\t13859 - 11904: 0xFB5E,\n\t13861 - 11904: 0x8770,\n\t13869 - 11904: 0x9DF3,\n\t13877 - 11904: 0xA0D0,\n\t13881 - 11904: 0xFC66,\n\t13886 - 11904: 0x92E9,\n\t13895 - 11904: 0x9AEC,\n\t13896 - 11904: 0x8FAB,\n\t13897 - 11904: 0xFA48,\n\t13902 - 11904: 0x8E45,\n\t13919 - 11904: 0x9C6F,\n\t13921 - 11904: 0x8D5C,\n\t13946 - 11904: 0x9EDE,\n\t13953 - 11904: 0x89EF,\n\t13978 - 11904: 0x96E9,\n\t13989 - 11904: 0x9EBB,\n\t13994 - 11904: 0x94DE,\n\t13996 - 11904: 0x9EB8,\n\t14000 - 11904: 0x97BA,\n\t14001 - 11904: 0xFB65,\n\t14005 - 11904: 0x95D6,\n\t14009 - 11904: 0x9CBB,\n\t14012 - 11904: 0x97DA,\n\t14017 - 11904: 0x8F45,\n\t14019 - 11904: 0xFB7D,\n\t14020 - 11904: 0x9158,\n\t14021 - 11904: 0xFE64,\n\t14023 - 11904: 0x9856,\n\t14024 - 11904: 0x9B4D,\n\t14035 - 11904: 0x935B,\n\t14036 - 11904: 0x95C7,\n\t14038 - 11904: 0x97E7,\n\t14045 - 11904: 0x9359,\n\t14049 - 11904: 0x91F5,\n\t14050 - 11904: 0x97B8,\n\t14053 - 11904: 0xFDA2,\n\t14054 - 11904: 0xFBB6,\n\t14069 - 11904: 0x92FA,\n\t14081 - 11904: 0x9357,\n\t14083 - 11904: 0x8BA6,\n\t14088 - 11904: 0xFBB9,\n\t14090 - 11904: 0x97B0,\n\t14093 - 11904: 0xFDC4,\n\t14108 - 11904: 0x9CA1,\n\t14114 - 11904: 0x91F2,\n\t14115 - 11904: 0x91F9,\n\t14117 - 11904: 0x8FF1,\n\t14124 - 11904: 0x9745,\n\t14125 - 11904: 0x9853,\n\t14128 - 11904: 0xFE78,\n\t14130 - 11904: 0xFBC1,\n\t14131 - 11904: 0x9251,\n\t14138 - 11904: 0x9DAD,\n\t14144 - 11904: 0xFD6C,\n\t14147 - 11904: 0xFA6B,\n\t14178 - 11904: 0x9BC2,\n\t14191 - 11904: 0x9A7B,\n\t14231 - 11904: 0x8B60,\n\t14240 - 11904: 0x934B,\n\t14265 - 11904: 0x9ABD,\n\t14270 - 11904: 0x91B7,\n\t14294 - 11904: 0x8D4B,\n\t14322 - 11904: 0x95B4,\n\t14328 - 11904: 0xFEC5,\n\t14331 - 11904: 0x9EF0,\n\t14351 - 11904: 0x8D64,\n\t14361 - 11904: 0x9269,\n\t14368 - 11904: 0x8D67,\n\t14381 - 11904: 0xFBEA,\n\t14390 - 11904: 0xFBEF,\n\t14392 - 11904: 0x8D68,\n\t14435 - 11904: 0x93EB,\n\t14453 - 11904: 0x877A,\n\t14496 - 11904: 0xFC42,\n\t14531 - 11904: 0x9166,\n\t14540 - 11904: 0xFACD,\n\t14545 - 11904: 0x93DD,\n\t14548 - 11904: 0x8D52,\n\t14586 - 11904: 0x8BCC,\n\t14600 - 11904: 0x8D6D,\n\t14612 - 11904: 0x8D6E,\n\t14631 - 11904: 0x96A8,\n\t14642 - 11904: 0xFCA6,\n\t14655 - 11904: 0x8D6F,\n\t14669 - 11904: 0x8D70,\n\t14691 - 11904: 0xFC64,\n\t14712 - 11904: 0x8CF3,\n\t14720 - 11904: 0x9060,\n\t14729 - 11904: 0x8D74,\n\t14730 - 11904: 0x97C3,\n\t14738 - 11904: 0x8AD0,\n\t14745 - 11904: 0x9274,\n\t14747 - 11904: 0x9BBE,\n\t14753 - 11904: 0x9CC8,\n\t14756 - 11904: 0x9CBA,\n\t14776 - 11904: 0x8D78,\n\t14812 - 11904: 0x9EB9,\n\t14818 - 11904: 0x955A,\n\t14821 - 11904: 0x91B4,\n\t14828 - 11904: 0x8A48,\n\t14840 - 11904: 0x8D7D,\n\t14843 - 11904: 0x8A7D,\n\t14846 - 11904: 0x8AC2,\n\t14849 - 11904: 0xFD4A,\n\t14851 - 11904: 0x8DA1,\n\t14854 - 11904: 0x8AD1,\n\t14871 - 11904: 0xFCB4,\n\t14872 - 11904: 0x8B47,\n\t14889 - 11904: 0x93A4,\n\t14890 - 11904: 0x9EDA,\n\t14900 - 11904: 0x8A51,\n\t14923 - 11904: 0x8DA6,\n\t14930 - 11904: 0x9EC5,\n\t14935 - 11904: 0xFCC4,\n\t14940 - 11904: 0xA078,\n\t14942 - 11904: 0x94B5,\n\t14950 - 11904: 0xFCC2,\n\t14951 - 11904: 0x8A6B,\n\t14999 - 11904: 0x8DAB,\n\t15019 - 11904: 0xFAE8,\n\t15037 - 11904: 0x8DAD,\n\t15070 - 11904: 0xFC49,\n\t15072 - 11904: 0x93C1,\n\t15088 - 11904: 0x906F,\n\t15090 - 11904: 0x8DB0,\n\t15093 - 11904: 0x87A2,\n\t15099 - 11904: 0x947E,\n\t15118 - 11904: 0x90FA,\n\t15129 - 11904: 0x9479,\n\t15138 - 11904: 0x8DB2,\n\t15147 - 11904: 0xFCEE,\n\t15161 - 11904: 0x997B,\n\t15170 - 11904: 0x8DB4,\n\t15192 - 11904: 0x8DB7,\n\t15200 - 11904: 0x91B3,\n\t15217 - 11904: 0x8DBB,\n\t15218 - 11904: 0x8DBA,\n\t15227 - 11904: 0x8DBC,\n\t15228 - 11904: 0x9044,\n\t15232 - 11904: 0xFD4C,\n\t15253 - 11904: 0x874B,\n\t15254 - 11904: 0x93E4,\n\t15257 - 11904: 0x93E0,\n\t15265 - 11904: 0xFD53,\n\t15292 - 11904: 0x8DC3,\n\t15294 - 11904: 0x9BB8,\n\t15298 - 11904: 0xFBF0,\n\t15300 - 11904: 0x93E9,\n\t15319 - 11904: 0x93F6,\n\t15325 - 11904: 0x8DC5,\n\t15340 - 11904: 0x8DCA,\n\t15346 - 11904: 0x8DCC,\n\t15347 - 11904: 0xFD5D,\n\t15348 - 11904: 0x93B5,\n\t15373 - 11904: 0xFD61,\n\t15377 - 11904: 0x9CF8,\n\t15381 - 11904: 0x9252,\n\t15384 - 11904: 0xA0E8,\n\t15444 - 11904: 0x9CA5,\n\t15499 - 11904: 0x8C56,\n\t15563 - 11904: 0x8DD6,\n\t15565 - 11904: 0x97C0,\n\t15569 - 11904: 0xA0DE,\n\t15574 - 11904: 0x97D2,\n\t15580 - 11904: 0xFAA5,\n\t15595 - 11904: 0xFDA3,\n\t15599 - 11904: 0x8DDB,\n\t15634 - 11904: 0x8CEA,\n\t15635 - 11904: 0x8EAF,\n\t15645 - 11904: 0x91B5,\n\t15666 - 11904: 0xFD49,\n\t15675 - 11904: 0xFDD1,\n\t15686 - 11904: 0x8DEB,\n\t15692 - 11904: 0x97C6,\n\t15694 - 11904: 0xFDCE,\n\t15697 - 11904: 0x90FC,\n\t15711 - 11904: 0xFC59,\n\t15714 - 11904: 0x96D6,\n\t15721 - 11904: 0x97C5,\n\t15722 - 11904: 0x8DEF,\n\t15727 - 11904: 0x97D7,\n\t15733 - 11904: 0x8DF0,\n\t15741 - 11904: 0x96A6,\n\t15749 - 11904: 0xFBBF,\n\t15752 - 11904: 0x8CDF,\n\t15754 - 11904: 0x8DF3,\n\t15759 - 11904: 0x9449,\n\t15761 - 11904: 0x8DF5,\n\t15781 - 11904: 0x9872,\n\t15789 - 11904: 0x8E6B,\n\t15796 - 11904: 0xFAFD,\n\t15807 - 11904: 0x8F50,\n\t15814 - 11904: 0x9DCC,\n\t15815 - 11904: 0xFC65,\n\t15817 - 11904: 0x8C44,\n\t15820 - 11904: 0x996E,\n\t15821 - 11904: 0x94A1,\n\t15827 - 11904: 0x8F63,\n\t15835 - 11904: 0xA0DA,\n\t15847 - 11904: 0x9253,\n\t15848 - 11904: 0xFDE9,\n\t15851 - 11904: 0x9DB5,\n\t15859 - 11904: 0x9879,\n\t15860 - 11904: 0x876A,\n\t15863 - 11904: 0x9D5D,\n\t15868 - 11904: 0x8D63,\n\t15869 - 11904: 0x9669,\n\t15878 - 11904: 0x9F70,\n\t15936 - 11904: 0xFC6A,\n\t15939 - 11904: 0x8AC7,\n\t15944 - 11904: 0x89D7,\n\t15957 - 11904: 0xFE4D,\n\t15988 - 11904: 0x9EDD,\n\t16040 - 11904: 0xFEFB,\n\t16041 - 11904: 0x98BC,\n\t16042 - 11904: 0xFACC,\n\t16045 - 11904: 0x95B0,\n\t16049 - 11904: 0x9464,\n\t16056 - 11904: 0x936F,\n\t16063 - 11904: 0x94B9,\n\t16066 - 11904: 0x95EC,\n\t16071 - 11904: 0x91EE,\n\t16074 - 11904: 0x98C3,\n\t16076 - 11904: 0x95F6,\n\t16080 - 11904: 0x8FFD,\n\t16081 - 11904: 0x98C5,\n\t16086 - 11904: 0x9766,\n\t16087 - 11904: 0xFE6E,\n\t16090 - 11904: 0x97DD,\n\t16091 - 11904: 0x8CAA,\n\t16094 - 11904: 0x92D2,\n\t16097 - 11904: 0x9761,\n\t16098 - 11904: 0x98CB,\n\t16103 - 11904: 0x95F0,\n\t16105 - 11904: 0x975D,\n\t16107 - 11904: 0x91E3,\n\t16108 - 11904: 0x877E,\n\t16112 - 11904: 0x98CC,\n\t16115 - 11904: 0x9469,\n\t16116 - 11904: 0x98CD,\n\t16122 - 11904: 0x98CE,\n\t16124 - 11904: 0x95FC,\n\t16127 - 11904: 0x94A3,\n\t16128 - 11904: 0x9662,\n\t16132 - 11904: 0xFEB6,\n\t16134 - 11904: 0x9463,\n\t16135 - 11904: 0x8D47,\n\t16142 - 11904: 0x98D0,\n\t16211 - 11904: 0x98D1,\n\t16216 - 11904: 0x9475,\n\t16217 - 11904: 0xFAE0,\n\t16227 - 11904: 0x9472,\n\t16252 - 11904: 0x98D6,\n\t16275 - 11904: 0x8AF0,\n\t16320 - 11904: 0x98D9,\n\t16328 - 11904: 0x8D5A,\n\t16343 - 11904: 0x98DB,\n\t16348 - 11904: 0x98DD,\n\t16357 - 11904: 0x98A8,\n\t16365 - 11904: 0x8A6D,\n\t16377 - 11904: 0x8AFB,\n\t16378 - 11904: 0x8AAE,\n\t16388 - 11904: 0xFBC9,\n\t16393 - 11904: 0x8C5D,\n\t16413 - 11904: 0x98E4,\n\t16441 - 11904: 0x98E6,\n\t16453 - 11904: 0x98E8,\n\t16467 - 11904: 0x8A4D,\n\t16471 - 11904: 0x9257,\n\t16482 - 11904: 0x95DF,\n\t16485 - 11904: 0xA0AC,\n\t16490 - 11904: 0x98EB,\n\t16495 - 11904: 0x98EC,\n\t16497 - 11904: 0x8CC3,\n\t16552 - 11904: 0x98F4,\n\t16564 - 11904: 0x87D9,\n\t16571 - 11904: 0x8AB8,\n\t16575 - 11904: 0x9EE7,\n\t16584 - 11904: 0x94BC,\n\t16600 - 11904: 0xFCD1,\n\t16607 - 11904: 0x9CC6,\n\t16632 - 11904: 0x8D4A,\n\t16634 - 11904: 0x9E7E,\n\t16642 - 11904: 0x8D44,\n\t16643 - 11904: 0x98FE,\n\t16644 - 11904: 0xFDE8,\n\t16649 - 11904: 0x9940,\n\t16654 - 11904: 0x94C9,\n\t16689 - 11904: 0x87C6,\n\t16690 - 11904: 0x94D3,\n\t16743 - 11904: 0x9946,\n\t16748 - 11904: 0x90C0,\n\t16750 - 11904: 0x94D1,\n\t16764 - 11904: 0x8D4E,\n\t16767 - 11904: 0x9573,\n\t16769 - 11904: 0x87CE,\n\t16784 - 11904: 0x93C2,\n\t16818 - 11904: 0x9948,\n\t16836 - 11904: 0x994B,\n\t16842 - 11904: 0x8E55,\n\t16847 - 11904: 0x994E,\n\t16859 - 11904: 0x8EFE,\n\t16877 - 11904: 0x8D5F,\n\t16879 - 11904: 0x8E59,\n\t16889 - 11904: 0x94EC,\n\t16913 - 11904: 0x94EF,\n\t16931 - 11904: 0x8C60,\n\t16960 - 11904: 0x8F74,\n\t16992 - 11904: 0x9955,\n\t17002 - 11904: 0x9544,\n\t17014 - 11904: 0x8CCB,\n\t17018 - 11904: 0x9956,\n\t17036 - 11904: 0x9959,\n\t17044 - 11904: 0x995B,\n\t17058 - 11904: 0x8CC4,\n\t17077 - 11904: 0xFA45,\n\t17081 - 11904: 0x90B7,\n\t17084 - 11904: 0x9743,\n\t17140 - 11904: 0x95CD,\n\t17147 - 11904: 0x97C9,\n\t17148 - 11904: 0xFD50,\n\t17162 - 11904: 0x87AA,\n\t17195 - 11904: 0x8EB9,\n\t17262 - 11904: 0x95C6,\n\t17303 - 11904: 0x9967,\n\t17306 - 11904: 0x8CE3,\n\t17338 - 11904: 0x8AB9,\n\t17345 - 11904: 0x8DFC,\n\t17369 - 11904: 0x8A76,\n\t17375 - 11904: 0x9D51,\n\t17389 - 11904: 0x9973,\n\t17392 - 11904: 0x8740,\n\t17394 - 11904: 0x9D4F,\n\t17409 - 11904: 0x997A,\n\t17410 - 11904: 0x9564,\n\t17427 - 11904: 0x99A1,\n\t17445 - 11904: 0x99A5,\n\t17453 - 11904: 0x99A7,\n\t17530 - 11904: 0x8EED,\n\t17551 - 11904: 0x99AD,\n\t17553 - 11904: 0xC87E,\n\t17567 - 11904: 0x946E,\n\t17568 - 11904: 0x8F70,\n\t17570 - 11904: 0xFAD0,\n\t17584 - 11904: 0x99B3,\n\t17591 - 11904: 0xA053,\n\t17597 - 11904: 0x8D5E,\n\t17600 - 11904: 0x965C,\n\t17603 - 11904: 0x8CE0,\n\t17605 - 11904: 0xFD7A,\n\t17614 - 11904: 0x97FE,\n\t17629 - 11904: 0x92BD,\n\t17630 - 11904: 0x8D5D,\n\t17631 - 11904: 0x97FD,\n\t17633 - 11904: 0x87DB,\n\t17636 - 11904: 0x8F64,\n\t17641 - 11904: 0xFCF7,\n\t17642 - 11904: 0x9562,\n\t17643 - 11904: 0x97CD,\n\t17644 - 11904: 0x9E64,\n\t17652 - 11904: 0x924C,\n\t17667 - 11904: 0x8EC9,\n\t17668 - 11904: 0x99BC,\n\t17673 - 11904: 0x9DA5,\n\t17675 - 11904: 0x8F54,\n\t17686 - 11904: 0x8F7C,\n\t17691 - 11904: 0x8D55,\n\t17693 - 11904: 0x8EA2,\n\t17703 - 11904: 0x8F7A,\n\t17710 - 11904: 0x97AE,\n\t17715 - 11904: 0x96C8,\n\t17718 - 11904: 0x8CE4,\n\t17723 - 11904: 0x99C3,\n\t17725 - 11904: 0x90D6,\n\t17727 - 11904: 0x9CBE,\n\t17731 - 11904: 0x8F76,\n\t17745 - 11904: 0x9470,\n\t17746 - 11904: 0xFB4B,\n\t17749 - 11904: 0xFDCA,\n\t17752 - 11904: 0x8CEF,\n\t17756 - 11904: 0x8EC7,\n\t17761 - 11904: 0x8D54,\n\t17762 - 11904: 0xA0F9,\n\t17770 - 11904: 0x8FA9,\n\t17773 - 11904: 0x8D51,\n\t17783 - 11904: 0x99C7,\n\t17784 - 11904: 0x8744,\n\t17797 - 11904: 0x90D7,\n\t17830 - 11904: 0x8743,\n\t17843 - 11904: 0x8747,\n\t17882 - 11904: 0x8758,\n\t17897 - 11904: 0x9EDF,\n\t17898 - 11904: 0x8D59,\n\t17923 - 11904: 0x8742,\n\t17926 - 11904: 0x99CE,\n\t17935 - 11904: 0x8FBA,\n\t17941 - 11904: 0x8FEB,\n\t17943 - 11904: 0x99CF,\n\t18011 - 11904: 0x8FC2,\n\t18042 - 11904: 0x92C9,\n\t18048 - 11904: 0x97DC,\n\t18081 - 11904: 0x875D,\n\t18094 - 11904: 0x87CC,\n\t18107 - 11904: 0x8D45,\n\t18127 - 11904: 0x95B3,\n\t18128 - 11904: 0x9C79,\n\t18165 - 11904: 0x95B2,\n\t18167 - 11904: 0x8D4C,\n\t18195 - 11904: 0x8FDB,\n\t18200 - 11904: 0x9BE3,\n\t18230 - 11904: 0x874C,\n\t18244 - 11904: 0x874D,\n\t18254 - 11904: 0x9E7A,\n\t18255 - 11904: 0x8757,\n\t18300 - 11904: 0x9BEE,\n\t18328 - 11904: 0x99DE,\n\t18342 - 11904: 0xFAFA,\n\t18389 - 11904: 0x8A52,\n\t18413 - 11904: 0x99E1,\n\t18420 - 11904: 0x8A67,\n\t18432 - 11904: 0x8BB5,\n\t18443 - 11904: 0x8AAC,\n\t18487 - 11904: 0x99E9,\n\t18525 - 11904: 0xFBCA,\n\t18545 - 11904: 0x97DE,\n\t18587 - 11904: 0x95D1,\n\t18605 - 11904: 0x99F5,\n\t18606 - 11904: 0xFC4A,\n\t18640 - 11904: 0x9BA9,\n\t18653 - 11904: 0xFBDC,\n\t18669 - 11904: 0xFE56,\n\t18675 - 11904: 0x9EA4,\n\t18682 - 11904: 0x9D49,\n\t18694 - 11904: 0x95DB,\n\t18705 - 11904: 0x89C5,\n\t18718 - 11904: 0x99F8,\n\t18725 - 11904: 0x9664,\n\t18730 - 11904: 0x9055,\n\t18733 - 11904: 0x96D4,\n\t18735 - 11904: 0x87C4,\n\t18736 - 11904: 0x87AE,\n\t18741 - 11904: 0x977C,\n\t18748 - 11904: 0x964D,\n\t18750 - 11904: 0x97E1,\n\t18757 - 11904: 0x9A48,\n\t18769 - 11904: 0x9A49,\n\t18771 - 11904: 0xFE7D,\n\t18789 - 11904: 0x90AA,\n\t18794 - 11904: 0x9A50,\n\t18802 - 11904: 0x9347,\n\t18825 - 11904: 0x8ED8,\n\t18849 - 11904: 0x90C9,\n\t18855 - 11904: 0x9A55,\n\t18911 - 11904: 0x90BC,\n\t18917 - 11904: 0x9A58,\n\t18919 - 11904: 0x8BB8,\n\t18959 - 11904: 0x90D5,\n\t18973 - 11904: 0x9641,\n\t18980 - 11904: 0x9A5A,\n\t18997 - 11904: 0x9A5C,\n\t19094 - 11904: 0x97C2,\n\t19108 - 11904: 0x875C,\n\t19124 - 11904: 0x8ABB,\n\t19128 - 11904: 0x9BAA,\n\t19153 - 11904: 0x90F5,\n\t19172 - 11904: 0x9A60,\n\t19199 - 11904: 0x9145,\n\t19216 - 11904: 0x8C58,\n\t19225 - 11904: 0x9A63,\n\t19232 - 11904: 0x8C49,\n\t19244 - 11904: 0x8BB6,\n\t19255 - 11904: 0xFCCF,\n\t19311 - 11904: 0x966B,\n\t19312 - 11904: 0x9A6E,\n\t19314 - 11904: 0x914F,\n\t19323 - 11904: 0x9746,\n\t19326 - 11904: 0xA0E6,\n\t19342 - 11904: 0x92D7,\n\t19344 - 11904: 0x9675,\n\t19347 - 11904: 0x93D4,\n\t19350 - 11904: 0x91BB,\n\t19351 - 11904: 0x9679,\n\t19357 - 11904: 0x9A70,\n\t19389 - 11904: 0x9678,\n\t19390 - 11904: 0x91CD,\n\t19392 - 11904: 0x9C4A,\n\t19460 - 11904: 0xA06F,\n\t19463 - 11904: 0xA06A,\n\t19470 - 11904: 0x915F,\n\t19506 - 11904: 0x8741,\n\t19515 - 11904: 0x9FA5,\n\t19518 - 11904: 0x89BA,\n\t19520 - 11904: 0x874F,\n\t19527 - 11904: 0x874E,\n\t19543 - 11904: 0x8755,\n\t19547 - 11904: 0x9ECD,\n\t19565 - 11904: 0x9A79,\n\t19575 - 11904: 0x8CF2,\n\t19579 - 11904: 0x8D57,\n\t19581 - 11904: 0x9DCE,\n\t19585 - 11904: 0x8CD2,\n\t19589 - 11904: 0x8759,\n\t19620 - 11904: 0x9D73,\n\t19630 - 11904: 0x96B9,\n\t19632 - 11904: 0x96BC,\n\t19639 - 11904: 0x9CD1,\n\t19661 - 11904: 0x89B7,\n\t19681 - 11904: 0x9EEE,\n\t19682 - 11904: 0x8749,\n\t19693 - 11904: 0xFB43,\n\t19719 - 11904: 0x875B,\n\t19721 - 11904: 0x9EC9,\n\t19728 - 11904: 0xFBD3,\n\t19764 - 11904: 0x91AE,\n\t19830 - 11904: 0x8D58,\n\t19831 - 11904: 0x8746,\n\t19849 - 11904: 0x8D56,\n\t19857 - 11904: 0x9D78,\n\t19868 - 11904: 0x9D7B,\n\t19968 - 11904: 0xA440,\n\t19969 - 11904: 0xA442,\n\t19971 - 11904: 0xA443,\n\t19972 - 11904: 0x9EB3,\n\t19975 - 11904: 0xC945,\n\t19976 - 11904: 0xA456,\n\t19977 - 11904: 0xA454,\n\t19978 - 11904: 0xA457,\n\t19979 - 11904: 0xA455,\n\t19980 - 11904: 0xC946,\n\t19981 - 11904: 0xA4A3,\n\t19982 - 11904: 0xC94F,\n\t19983 - 11904: 0xC94D,\n\t19984 - 11904: 0xA4A2,\n\t19985 - 11904: 0xA4A1,\n\t19988 - 11904: 0xA542,\n\t19989 - 11904: 0xA541,\n\t19990 - 11904: 0xA540,\n\t19992 - 11904: 0xA543,\n\t19993 - 11904: 0xA4FE,\n\t19994 - 11904: 0x9EB2,\n\t19996 - 11904: 0x9DD6,\n\t19998 - 11904: 0xA5E0,\n\t19999 - 11904: 0xA5E1,\n\t20001 - 11904: 0x994F,\n\t20004 - 11904: 0x89CE,\n\t20006 - 11904: 0xA8C3,\n\t20008 - 11904: 0x8BC0,\n\t20010 - 11904: 0x9FC4,\n\t20011 - 11904: 0xA458,\n\t20012 - 11904: 0x8BD4,\n\t20013 - 11904: 0xA4A4,\n\t20014 - 11904: 0xC950,\n\t20015 - 11904: 0x8C72,\n\t20016 - 11904: 0xA4A5,\n\t20017 - 11904: 0xC963,\n\t20018 - 11904: 0xA6EA,\n\t20019 - 11904: 0xCBB1,\n\t20022 - 11904: 0xC6BF,\n\t20023 - 11904: 0x8BF9,\n\t20024 - 11904: 0xA459,\n\t20025 - 11904: 0xA4A6,\n\t20027 - 11904: 0xA544,\n\t20028 - 11904: 0xC964,\n\t20029 - 11904: 0x8946,\n\t20031 - 11904: 0xC6C0,\n\t20034 - 11904: 0xC940,\n\t20035 - 11904: 0xA444,\n\t20037 - 11904: 0xA45B,\n\t20039 - 11904: 0xC947,\n\t20040 - 11904: 0xA45C,\n\t20041 - 11904: 0xFAE5,\n\t20043 - 11904: 0xA4A7,\n\t20045 - 11904: 0xA545,\n\t20046 - 11904: 0xA547,\n\t20047 - 11904: 0xA546,\n\t20050 - 11904: 0xA5E2,\n\t20051 - 11904: 0xA5E3,\n\t20054 - 11904: 0xA8C4,\n\t20056 - 11904: 0xADBC,\n\t20057 - 11904: 0xA441,\n\t20058 - 11904: 0xC87B,\n\t20059 - 11904: 0x8BC6,\n\t20060 - 11904: 0xC941,\n\t20061 - 11904: 0xA445,\n\t20062 - 11904: 0xA45E,\n\t20063 - 11904: 0xA45D,\n\t20073 - 11904: 0xA5E4,\n\t20074 - 11904: 0x9C57,\n\t20083 - 11904: 0xA8C5,\n\t20088 - 11904: 0x9AFB,\n\t20094 - 11904: 0xB0AE,\n\t20095 - 11904: 0xD44B,\n\t20096 - 11904: 0x89D0,\n\t20097 - 11904: 0x89CF,\n\t20098 - 11904: 0xB6C3,\n\t20099 - 11904: 0xDCB1,\n\t20100 - 11904: 0xDCB2,\n\t20101 - 11904: 0xC6C1,\n\t20102 - 11904: 0xA446,\n\t20103 - 11904: 0x89D1,\n\t20104 - 11904: 0xA4A9,\n\t20105 - 11904: 0x89E2,\n\t20107 - 11904: 0xA8C6,\n\t20108 - 11904: 0xA447,\n\t20109 - 11904: 0xC948,\n\t20110 - 11904: 0xA45F,\n\t20113 - 11904: 0xA4AA,\n\t20114 - 11904: 0xA4AC,\n\t20115 - 11904: 0xC951,\n\t20116 - 11904: 0xA4AD,\n\t20117 - 11904: 0xA4AB,\n\t20120 - 11904: 0x927E,\n\t20121 - 11904: 0xA5E5,\n\t20122 - 11904: 0x9DBA,\n\t20123 - 11904: 0xA8C7,\n\t20126 - 11904: 0xA8C8,\n\t20127 - 11904: 0xAB45,\n\t20128 - 11904: 0xC6C2,\n\t20129 - 11904: 0xA460,\n\t20130 - 11904: 0xA4AE,\n\t20131 - 11904: 0x8C6F,\n\t20132 - 11904: 0xA5E6,\n\t20133 - 11904: 0xA5E8,\n\t20134 - 11904: 0xA5E7,\n\t20136 - 11904: 0xA6EB,\n\t20139 - 11904: 0xA8C9,\n\t20140 - 11904: 0xA8CA,\n\t20141 - 11904: 0xAB46,\n\t20142 - 11904: 0xAB47,\n\t20147 - 11904: 0xADBD,\n\t20150 - 11904: 0xDCB3,\n\t20151 - 11904: 0xFBF8,\n\t20153 - 11904: 0xF6D6,\n\t20154 - 11904: 0xA448,\n\t20155 - 11904: 0x8BC7,\n\t20156 - 11904: 0x926B,\n\t20159 - 11904: 0x89D2,\n\t20160 - 11904: 0xA4B0,\n\t20161 - 11904: 0xA4AF,\n\t20162 - 11904: 0xC952,\n\t20163 - 11904: 0xA4B1,\n\t20164 - 11904: 0xA4B7,\n\t20166 - 11904: 0xA4B2,\n\t20167 - 11904: 0xA4B3,\n\t20168 - 11904: 0xC954,\n\t20169 - 11904: 0xC953,\n\t20170 - 11904: 0xA4B5,\n\t20171 - 11904: 0xA4B6,\n\t20173 - 11904: 0xA4B4,\n\t20174 - 11904: 0x9FCF,\n\t20180 - 11904: 0xA54A,\n\t20181 - 11904: 0xA54B,\n\t20182 - 11904: 0xA54C,\n\t20183 - 11904: 0xA54D,\n\t20184 - 11904: 0xA549,\n\t20185 - 11904: 0xA550,\n\t20186 - 11904: 0xC96A,\n\t20188 - 11904: 0xC966,\n\t20189 - 11904: 0xC969,\n\t20190 - 11904: 0xA551,\n\t20191 - 11904: 0xA561,\n\t20193 - 11904: 0xC968,\n\t20195 - 11904: 0xA54E,\n\t20196 - 11904: 0xA54F,\n\t20197 - 11904: 0xA548,\n\t20200 - 11904: 0xC965,\n\t20201 - 11904: 0xC967,\n\t20202 - 11904: 0x9DA9,\n\t20203 - 11904: 0x89D3,\n\t20206 - 11904: 0x99E2,\n\t20208 - 11904: 0xA5F5,\n\t20209 - 11904: 0xC9B0,\n\t20210 - 11904: 0xA5F2,\n\t20211 - 11904: 0xA5F6,\n\t20212 - 11904: 0xC9BA,\n\t20213 - 11904: 0xC9AE,\n\t20214 - 11904: 0xA5F3,\n\t20215 - 11904: 0xC9B2,\n\t20216 - 11904: 0x9267,\n\t20219 - 11904: 0xA5F4,\n\t20221 - 11904: 0xA5F7,\n\t20223 - 11904: 0xA5E9,\n\t20224 - 11904: 0xC9B1,\n\t20225 - 11904: 0xA5F8,\n\t20226 - 11904: 0xC9B5,\n\t20227 - 11904: 0x92A4,\n\t20228 - 11904: 0xC9B9,\n\t20229 - 11904: 0xC9B6,\n\t20232 - 11904: 0xC9B3,\n\t20233 - 11904: 0xA5EA,\n\t20234 - 11904: 0xA5EC,\n\t20235 - 11904: 0xA5F9,\n\t20237 - 11904: 0xA5EE,\n\t20238 - 11904: 0xC9AB,\n\t20239 - 11904: 0xA5F1,\n\t20240 - 11904: 0xA5EF,\n\t20241 - 11904: 0xA5F0,\n\t20242 - 11904: 0xC9BB,\n\t20243 - 11904: 0xC9B8,\n\t20244 - 11904: 0xC9AF,\n\t20245 - 11904: 0xA5ED,\n\t20247 - 11904: 0x8C73,\n\t20248 - 11904: 0xC9AC,\n\t20249 - 11904: 0xA5EB,\n\t20250 - 11904: 0x894E,\n\t20253 - 11904: 0xC9B4,\n\t20258 - 11904: 0xC9B7,\n\t20264 - 11904: 0x894F,\n\t20265 - 11904: 0x9278,\n\t20268 - 11904: 0xC9AD,\n\t20269 - 11904: 0xCA66,\n\t20271 - 11904: 0xA742,\n\t20272 - 11904: 0xA6F4,\n\t20274 - 11904: 0x91B6,\n\t20275 - 11904: 0xCA67,\n\t20276 - 11904: 0xA6F1,\n\t20278 - 11904: 0xA744,\n\t20279 - 11904: 0x89D4,\n\t20280 - 11904: 0xA6F9,\n\t20281 - 11904: 0x9FD2,\n\t20282 - 11904: 0xA6F8,\n\t20283 - 11904: 0xCA5B,\n\t20284 - 11904: 0xA6FC,\n\t20285 - 11904: 0xA6F7,\n\t20286 - 11904: 0xCA60,\n\t20287 - 11904: 0xCA68,\n\t20289 - 11904: 0xCA64,\n\t20290 - 11904: 0x92A7,\n\t20291 - 11904: 0xA6FA,\n\t20293 - 11904: 0x95A2,\n\t20294 - 11904: 0xA6FD,\n\t20295 - 11904: 0xA6EE,\n\t20296 - 11904: 0xA747,\n\t20297 - 11904: 0xCA5D,\n\t20299 - 11904: 0x926E,\n\t20300 - 11904: 0xCBBD,\n\t20301 - 11904: 0xA6EC,\n\t20302 - 11904: 0xA743,\n\t20303 - 11904: 0xA6ED,\n\t20304 - 11904: 0xA6F5,\n\t20305 - 11904: 0xA6F6,\n\t20306 - 11904: 0xCA62,\n\t20307 - 11904: 0xCA5E,\n\t20308 - 11904: 0xA6FB,\n\t20309 - 11904: 0xA6F3,\n\t20310 - 11904: 0xCA5A,\n\t20311 - 11904: 0xA6EF,\n\t20312 - 11904: 0xCA65,\n\t20313 - 11904: 0xA745,\n\t20314 - 11904: 0xA748,\n\t20315 - 11904: 0xA6F2,\n\t20316 - 11904: 0xA740,\n\t20317 - 11904: 0xA746,\n\t20318 - 11904: 0xA6F0,\n\t20319 - 11904: 0xCA63,\n\t20320 - 11904: 0xA741,\n\t20321 - 11904: 0xCA69,\n\t20322 - 11904: 0xCA5C,\n\t20323 - 11904: 0xA6FE,\n\t20324 - 11904: 0xCA5F,\n\t20327 - 11904: 0xCA61,\n\t20329 - 11904: 0xA8D8,\n\t20330 - 11904: 0xCBBF,\n\t20331 - 11904: 0xCBCB,\n\t20332 - 11904: 0xA8D0,\n\t20334 - 11904: 0xCBCC,\n\t20335 - 11904: 0xA8CB,\n\t20336 - 11904: 0xA8D5,\n\t20338 - 11904: 0x96EA,\n\t20339 - 11904: 0xA8CE,\n\t20340 - 11904: 0xCBB9,\n\t20341 - 11904: 0xA8D6,\n\t20342 - 11904: 0xCBB8,\n\t20343 - 11904: 0xCBBC,\n\t20344 - 11904: 0xCBC3,\n\t20345 - 11904: 0xCBC1,\n\t20346 - 11904: 0xA8DE,\n\t20347 - 11904: 0xA8D9,\n\t20348 - 11904: 0xCBB3,\n\t20349 - 11904: 0xCBB5,\n\t20350 - 11904: 0xA8DB,\n\t20351 - 11904: 0xA8CF,\n\t20352 - 11904: 0xCBB6,\n\t20353 - 11904: 0xCBC2,\n\t20354 - 11904: 0xCBC9,\n\t20355 - 11904: 0xA8D4,\n\t20356 - 11904: 0xCBBB,\n\t20357 - 11904: 0xCBB4,\n\t20358 - 11904: 0xA8D3,\n\t20359 - 11904: 0xCBB7,\n\t20360 - 11904: 0xA8D7,\n\t20361 - 11904: 0xCBBA,\n\t20362 - 11904: 0x926F,\n\t20363 - 11904: 0xA8D2,\n\t20365 - 11904: 0xA8CD,\n\t20367 - 11904: 0xA8DC,\n\t20368 - 11904: 0xCBC4,\n\t20369 - 11904: 0xA8DD,\n\t20370 - 11904: 0xCBC8,\n\t20372 - 11904: 0xCBC6,\n\t20373 - 11904: 0xCBCA,\n\t20374 - 11904: 0xA8DA,\n\t20375 - 11904: 0xCBBE,\n\t20376 - 11904: 0xCBB2,\n\t20378 - 11904: 0xCBC0,\n\t20379 - 11904: 0xA8D1,\n\t20380 - 11904: 0xCBC5,\n\t20381 - 11904: 0xA8CC,\n\t20382 - 11904: 0xCBC7,\n\t20386 - 11904: 0x92A3,\n\t20392 - 11904: 0x8950,\n\t20395 - 11904: 0xFA57,\n\t20398 - 11904: 0xAB56,\n\t20399 - 11904: 0xAB4A,\n\t20400 - 11904: 0x9866,\n\t20402 - 11904: 0xCDE0,\n\t20403 - 11904: 0xCDE8,\n\t20404 - 11904: 0x8CF8,\n\t20405 - 11904: 0xAB49,\n\t20406 - 11904: 0xAB51,\n\t20407 - 11904: 0xAB5D,\n\t20409 - 11904: 0xCDEE,\n\t20410 - 11904: 0xCDEC,\n\t20411 - 11904: 0xCDE7,\n\t20413 - 11904: 0x89D6,\n\t20415 - 11904: 0xAB4B,\n\t20416 - 11904: 0xCDED,\n\t20417 - 11904: 0xCDE3,\n\t20418 - 11904: 0xAB59,\n\t20419 - 11904: 0xAB50,\n\t20420 - 11904: 0xAB58,\n\t20421 - 11904: 0xCDDE,\n\t20423 - 11904: 0xCDEA,\n\t20424 - 11904: 0x98B2,\n\t20425 - 11904: 0xCDE1,\n\t20426 - 11904: 0xAB54,\n\t20427 - 11904: 0xCDE2,\n\t20428 - 11904: 0x92AB,\n\t20429 - 11904: 0xCDDD,\n\t20430 - 11904: 0xAB5B,\n\t20431 - 11904: 0xAB4E,\n\t20432 - 11904: 0xAB57,\n\t20433 - 11904: 0xAB4D,\n\t20435 - 11904: 0xCDDF,\n\t20436 - 11904: 0xCDE4,\n\t20438 - 11904: 0xCDEB,\n\t20439 - 11904: 0xAB55,\n\t20440 - 11904: 0xAB52,\n\t20441 - 11904: 0xCDE6,\n\t20442 - 11904: 0xAB5A,\n\t20443 - 11904: 0xCDE9,\n\t20444 - 11904: 0xCDE5,\n\t20445 - 11904: 0xAB4F,\n\t20446 - 11904: 0xAB5C,\n\t20447 - 11904: 0xAB53,\n\t20448 - 11904: 0xAB4C,\n\t20449 - 11904: 0xAB48,\n\t20452 - 11904: 0x96DE,\n\t20453 - 11904: 0x92AC,\n\t20460 - 11904: 0xCDEF,\n\t20462 - 11904: 0xADD7,\n\t20463 - 11904: 0xADC1,\n\t20464 - 11904: 0x8C70,\n\t20465 - 11904: 0xADD1,\n\t20466 - 11904: 0x9F6E,\n\t20467 - 11904: 0xADD6,\n\t20468 - 11904: 0xD0D0,\n\t20469 - 11904: 0xD0CF,\n\t20470 - 11904: 0xD0D4,\n\t20471 - 11904: 0xD0D5,\n\t20472 - 11904: 0xADC4,\n\t20473 - 11904: 0x8EF2,\n\t20474 - 11904: 0xADCD,\n\t20477 - 11904: 0x9F6C,\n\t20478 - 11904: 0xADDA,\n\t20480 - 11904: 0xADCE,\n\t20483 - 11904: 0x89D8,\n\t20485 - 11904: 0xD0C9,\n\t20486 - 11904: 0xADC7,\n\t20487 - 11904: 0xD0CA,\n\t20488 - 11904: 0xFA59,\n\t20489 - 11904: 0xADDC,\n\t20491 - 11904: 0xADD3,\n\t20492 - 11904: 0xADBE,\n\t20493 - 11904: 0xADBF,\n\t20494 - 11904: 0xD0DD,\n\t20495 - 11904: 0xB0BF,\n\t20497 - 11904: 0xADCC,\n\t20498 - 11904: 0xADCB,\n\t20499 - 11904: 0xD0CB,\n\t20500 - 11904: 0xADCF,\n\t20501 - 11904: 0xD45B,\n\t20502 - 11904: 0xADC6,\n\t20503 - 11904: 0xD0D6,\n\t20504 - 11904: 0xADD5,\n\t20505 - 11904: 0xADD4,\n\t20506 - 11904: 0xADCA,\n\t20507 - 11904: 0xD0CE,\n\t20508 - 11904: 0xD0D7,\n\t20510 - 11904: 0xD0C8,\n\t20511 - 11904: 0xADC9,\n\t20512 - 11904: 0xD0D8,\n\t20513 - 11904: 0xADD2,\n\t20514 - 11904: 0xD0CC,\n\t20515 - 11904: 0xADC0,\n\t20517 - 11904: 0xADC3,\n\t20518 - 11904: 0xADC2,\n\t20519 - 11904: 0xD0D9,\n\t20520 - 11904: 0xADD0,\n\t20521 - 11904: 0xFA5F,\n\t20522 - 11904: 0xADD9,\n\t20523 - 11904: 0xADDB,\n\t20524 - 11904: 0xD0D3,\n\t20525 - 11904: 0xADD8,\n\t20526 - 11904: 0x92A8,\n\t20527 - 11904: 0xD0DB,\n\t20528 - 11904: 0xD0CD,\n\t20529 - 11904: 0xD0DC,\n\t20531 - 11904: 0xD0D1,\n\t20532 - 11904: 0x9163,\n\t20533 - 11904: 0xD0DA,\n\t20535 - 11904: 0xD0D2,\n\t20539 - 11904: 0x8C40,\n\t20540 - 11904: 0xADC8,\n\t20544 - 11904: 0xD463,\n\t20545 - 11904: 0xD457,\n\t20547 - 11904: 0xB0B3,\n\t20549 - 11904: 0xD45C,\n\t20550 - 11904: 0xD462,\n\t20551 - 11904: 0xB0B2,\n\t20552 - 11904: 0xD455,\n\t20553 - 11904: 0xB0B6,\n\t20554 - 11904: 0xD459,\n\t20555 - 11904: 0xD452,\n\t20556 - 11904: 0xB0B4,\n\t20557 - 11904: 0xD456,\n\t20558 - 11904: 0xB0B9,\n\t20559 - 11904: 0xB0BE,\n\t20561 - 11904: 0xD467,\n\t20563 - 11904: 0xD451,\n\t20565 - 11904: 0xB0BA,\n\t20566 - 11904: 0x9F73,\n\t20567 - 11904: 0xD466,\n\t20568 - 11904: 0x92AD,\n\t20570 - 11904: 0xB0B5,\n\t20571 - 11904: 0xD458,\n\t20572 - 11904: 0xB0B1,\n\t20573 - 11904: 0xD453,\n\t20574 - 11904: 0xD44F,\n\t20575 - 11904: 0xD45D,\n\t20576 - 11904: 0xD450,\n\t20577 - 11904: 0xD44E,\n\t20578 - 11904: 0xD45A,\n\t20579 - 11904: 0xD460,\n\t20580 - 11904: 0xD461,\n\t20581 - 11904: 0xB0B7,\n\t20582 - 11904: 0x9BE9,\n\t20584 - 11904: 0xD85B,\n\t20585 - 11904: 0xD45E,\n\t20586 - 11904: 0xD44D,\n\t20587 - 11904: 0xD45F,\n\t20588 - 11904: 0x92A9,\n\t20589 - 11904: 0xB0C1,\n\t20590 - 11904: 0xD464,\n\t20591 - 11904: 0xB0C0,\n\t20592 - 11904: 0xD44C,\n\t20594 - 11904: 0xD454,\n\t20595 - 11904: 0xD465,\n\t20596 - 11904: 0xB0BC,\n\t20597 - 11904: 0xB0BB,\n\t20598 - 11904: 0xB0B8,\n\t20599 - 11904: 0xB0BD,\n\t20602 - 11904: 0xB0AF,\n\t20605 - 11904: 0xFA66,\n\t20608 - 11904: 0xB3C8,\n\t20609 - 11904: 0x92AA,\n\t20610 - 11904: 0xD85E,\n\t20611 - 11904: 0xD857,\n\t20613 - 11904: 0xB3C5,\n\t20615 - 11904: 0xD85F,\n\t20616 - 11904: 0x89D9,\n\t20619 - 11904: 0xD855,\n\t20620 - 11904: 0xD858,\n\t20621 - 11904: 0xB3C4,\n\t20622 - 11904: 0xD859,\n\t20624 - 11904: 0xFD56,\n\t20625 - 11904: 0xB3C7,\n\t20626 - 11904: 0xD85D,\n\t20628 - 11904: 0xD853,\n\t20629 - 11904: 0xD852,\n\t20630 - 11904: 0xB3C9,\n\t20632 - 11904: 0xB3CA,\n\t20633 - 11904: 0xB3C6,\n\t20634 - 11904: 0xB3CB,\n\t20635 - 11904: 0xD851,\n\t20636 - 11904: 0xD85C,\n\t20637 - 11904: 0xD85A,\n\t20638 - 11904: 0xD854,\n\t20642 - 11904: 0xB3C3,\n\t20643 - 11904: 0xD856,\n\t20646 - 11904: 0x9FA8,\n\t20652 - 11904: 0xB6CA,\n\t20653 - 11904: 0xB6C4,\n\t20654 - 11904: 0xDCB7,\n\t20655 - 11904: 0xB6CD,\n\t20656 - 11904: 0xDCBD,\n\t20657 - 11904: 0xDCC0,\n\t20658 - 11904: 0xB6C6,\n\t20659 - 11904: 0xB6C7,\n\t20660 - 11904: 0xDCBA,\n\t20661 - 11904: 0xB6C5,\n\t20662 - 11904: 0xDCC3,\n\t20663 - 11904: 0xB6CB,\n\t20664 - 11904: 0xDCC4,\n\t20666 - 11904: 0xDCBF,\n\t20667 - 11904: 0xB6CC,\n\t20668 - 11904: 0x8C71,\n\t20669 - 11904: 0xDCB4,\n\t20670 - 11904: 0xB6C9,\n\t20671 - 11904: 0xDCB5,\n\t20673 - 11904: 0xDCBE,\n\t20674 - 11904: 0xDCBC,\n\t20676 - 11904: 0xDCB8,\n\t20677 - 11904: 0xB6C8,\n\t20678 - 11904: 0xDCB6,\n\t20679 - 11904: 0xB6CE,\n\t20680 - 11904: 0xDCBB,\n\t20681 - 11904: 0xDCC2,\n\t20682 - 11904: 0xDCB9,\n\t20683 - 11904: 0xDCC1,\n\t20685 - 11904: 0x92A1,\n\t20686 - 11904: 0xB9B6,\n\t20687 - 11904: 0xB9B3,\n\t20688 - 11904: 0x90E3,\n\t20689 - 11904: 0xB9B4,\n\t20691 - 11904: 0xE0F9,\n\t20692 - 11904: 0xE0F1,\n\t20693 - 11904: 0xB9B2,\n\t20694 - 11904: 0xB9AF,\n\t20695 - 11904: 0xE0F2,\n\t20697 - 11904: 0xA0A6,\n\t20698 - 11904: 0xB9B1,\n\t20699 - 11904: 0xE0F5,\n\t20701 - 11904: 0xE0F7,\n\t20703 - 11904: 0x94AB,\n\t20704 - 11904: 0xE0FE,\n\t20705 - 11904: 0xFC72,\n\t20707 - 11904: 0xE0FD,\n\t20708 - 11904: 0xE0F8,\n\t20709 - 11904: 0xB9AE,\n\t20710 - 11904: 0xE0F0,\n\t20711 - 11904: 0xB9AC,\n\t20712 - 11904: 0xE0F3,\n\t20713 - 11904: 0xB9B7,\n\t20714 - 11904: 0xE0F6,\n\t20716 - 11904: 0xE0FA,\n\t20717 - 11904: 0xB9B0,\n\t20718 - 11904: 0xB9AD,\n\t20719 - 11904: 0xE0FC,\n\t20720 - 11904: 0xE0FB,\n\t20721 - 11904: 0xB9B5,\n\t20723 - 11904: 0xE0F4,\n\t20724 - 11904: 0x97C4,\n\t20725 - 11904: 0xBBF8,\n\t20726 - 11904: 0xE4EC,\n\t20728 - 11904: 0xE4E9,\n\t20729 - 11904: 0xBBF9,\n\t20731 - 11904: 0xBBF7,\n\t20732 - 11904: 0x92AE,\n\t20733 - 11904: 0xE4F0,\n\t20734 - 11904: 0xE4ED,\n\t20735 - 11904: 0xE4E6,\n\t20736 - 11904: 0xBBF6,\n\t20737 - 11904: 0xFA67,\n\t20738 - 11904: 0xBBFA,\n\t20739 - 11904: 0xE4E7,\n\t20740 - 11904: 0xBBF5,\n\t20741 - 11904: 0xBBFD,\n\t20742 - 11904: 0xE4EA,\n\t20743 - 11904: 0xE4EB,\n\t20744 - 11904: 0xBBFB,\n\t20745 - 11904: 0xBBFC,\n\t20746 - 11904: 0xE4F1,\n\t20747 - 11904: 0xE4EE,\n\t20748 - 11904: 0xE4EF,\n\t20749 - 11904: 0x92A2,\n\t20750 - 11904: 0xFA69,\n\t20752 - 11904: 0xBEAA,\n\t20753 - 11904: 0xE8F8,\n\t20754 - 11904: 0xBEA7,\n\t20755 - 11904: 0xE8F5,\n\t20756 - 11904: 0xBEA9,\n\t20757 - 11904: 0xBEAB,\n\t20759 - 11904: 0xE8F6,\n\t20760 - 11904: 0xBEA8,\n\t20762 - 11904: 0xE8F7,\n\t20764 - 11904: 0xE8F4,\n\t20767 - 11904: 0xC076,\n\t20768 - 11904: 0xECBD,\n\t20769 - 11904: 0xC077,\n\t20770 - 11904: 0xECBB,\n\t20772 - 11904: 0xECBC,\n\t20773 - 11904: 0xECBA,\n\t20774 - 11904: 0xECB9,\n\t20777 - 11904: 0xECBE,\n\t20778 - 11904: 0xC075,\n\t20779 - 11904: 0x9268,\n\t20781 - 11904: 0xEFB8,\n\t20782 - 11904: 0xEFB9,\n\t20784 - 11904: 0xE4E8,\n\t20785 - 11904: 0xEFB7,\n\t20786 - 11904: 0xC078,\n\t20787 - 11904: 0xC35F,\n\t20788 - 11904: 0xF1EB,\n\t20789 - 11904: 0xF1EC,\n\t20791 - 11904: 0xC4D7,\n\t20792 - 11904: 0xC4D8,\n\t20793 - 11904: 0xF5C1,\n\t20794 - 11904: 0xF5C0,\n\t20795 - 11904: 0xC56C,\n\t20796 - 11904: 0xC56B,\n\t20797 - 11904: 0xF7D0,\n\t20799 - 11904: 0xA449,\n\t20800 - 11904: 0xA461,\n\t20801 - 11904: 0xA4B9,\n\t20803 - 11904: 0xA4B8,\n\t20804 - 11904: 0xA553,\n\t20805 - 11904: 0xA552,\n\t20806 - 11904: 0xA5FC,\n\t20807 - 11904: 0xA5FB,\n\t20808 - 11904: 0xA5FD,\n\t20809 - 11904: 0xA5FA,\n\t20811 - 11904: 0xA74A,\n\t20812 - 11904: 0xA749,\n\t20813 - 11904: 0xA74B,\n\t20818 - 11904: 0xA8E0,\n\t20820 - 11904: 0xA8DF,\n\t20821 - 11904: 0xA8E1,\n\t20822 - 11904: 0x8951,\n\t20823 - 11904: 0xAB5E,\n\t20825 - 11904: 0xA259,\n\t20826 - 11904: 0xD0DE,\n\t20827 - 11904: 0xA25A,\n\t20828 - 11904: 0xB0C2,\n\t20829 - 11904: 0xA25C,\n\t20830 - 11904: 0xA25B,\n\t20831 - 11904: 0xD860,\n\t20832 - 11904: 0xFA6F,\n\t20833 - 11904: 0xA25D,\n\t20834 - 11904: 0xB9B8,\n\t20835 - 11904: 0xA25E,\n\t20837 - 11904: 0xA44A,\n\t20839 - 11904: 0xA4BA,\n\t20840 - 11904: 0xA5FE,\n\t20841 - 11904: 0xA8E2,\n\t20842 - 11904: 0xFA71,\n\t20843 - 11904: 0xA44B,\n\t20844 - 11904: 0xA4BD,\n\t20845 - 11904: 0xA4BB,\n\t20846 - 11904: 0xA4BC,\n\t20849 - 11904: 0xA640,\n\t20852 - 11904: 0x8952,\n\t20853 - 11904: 0xA74C,\n\t20854 - 11904: 0xA8E4,\n\t20855 - 11904: 0xA8E3,\n\t20856 - 11904: 0xA8E5,\n\t20857 - 11904: 0x945A,\n\t20860 - 11904: 0xADDD,\n\t20864 - 11904: 0xBEAC,\n\t20866 - 11904: 0xC6C3,\n\t20870 - 11904: 0x89DD,\n\t20871 - 11904: 0xC94E,\n\t20872 - 11904: 0xC8A2,\n\t20873 - 11904: 0xA554,\n\t20874 - 11904: 0xA555,\n\t20877 - 11904: 0xA641,\n\t20879 - 11904: 0xCA6A,\n\t20881 - 11904: 0xAB60,\n\t20882 - 11904: 0xAB5F,\n\t20883 - 11904: 0xD0E0,\n\t20884 - 11904: 0xD0DF,\n\t20885 - 11904: 0xB0C3,\n\t20886 - 11904: 0xC6C4,\n\t20887 - 11904: 0xA4BE,\n\t20888 - 11904: 0xC955,\n\t20890 - 11904: 0x9E52,\n\t20892 - 11904: 0x8953,\n\t20894 - 11904: 0xCBCD,\n\t20896 - 11904: 0xAB61,\n\t20898 - 11904: 0xADE0,\n\t20900 - 11904: 0xADDE,\n\t20901 - 11904: 0xADDF,\n\t20903 - 11904: 0x9E55,\n\t20904 - 11904: 0x92BA,\n\t20906 - 11904: 0xBEAD,\n\t20907 - 11904: 0xC6C5,\n\t20908 - 11904: 0xA556,\n\t20910 - 11904: 0x8C5B,\n\t20912 - 11904: 0xA642,\n\t20913 - 11904: 0xC9BC,\n\t20914 - 11904: 0xFA7D,\n\t20915 - 11904: 0xFAA8,\n\t20916 - 11904: 0x9A68,\n\t20917 - 11904: 0xFA47,\n\t20918 - 11904: 0xA74D,\n\t20919 - 11904: 0xA74E,\n\t20920 - 11904: 0xFA7E,\n\t20921 - 11904: 0xCA6B,\n\t20924 - 11904: 0xCBCE,\n\t20925 - 11904: 0xA8E6,\n\t20926 - 11904: 0xCBCF,\n\t20931 - 11904: 0x92BB,\n\t20932 - 11904: 0xD0E2,\n\t20933 - 11904: 0xD0E3,\n\t20934 - 11904: 0xADE3,\n\t20935 - 11904: 0xFDB6,\n\t20936 - 11904: 0xD0E4,\n\t20937 - 11904: 0xFAA2,\n\t20938 - 11904: 0xD0E1,\n\t20939 - 11904: 0xADE4,\n\t20940 - 11904: 0xADE2,\n\t20941 - 11904: 0xADE1,\n\t20942 - 11904: 0xD0E5,\n\t20943 - 11904: 0xFAA3,\n\t20944 - 11904: 0xD468,\n\t20945 - 11904: 0xFAA4,\n\t20946 - 11904: 0x9BB4,\n\t20947 - 11904: 0xFAA6,\n\t20948 - 11904: 0xD861,\n\t20951 - 11904: 0xDCC5,\n\t20952 - 11904: 0xE140,\n\t20955 - 11904: 0x89DF,\n\t20956 - 11904: 0xBBFE,\n\t20957 - 11904: 0xBEAE,\n\t20958 - 11904: 0xE8F9,\n\t20959 - 11904: 0xFDDB,\n\t20960 - 11904: 0xA44C,\n\t20961 - 11904: 0xA45A,\n\t20962 - 11904: 0xFAA9,\n\t20964 - 11904: 0x8954,\n\t20973 - 11904: 0xFAAB,\n\t20976 - 11904: 0xB0C4,\n\t20977 - 11904: 0xB3CD,\n\t20979 - 11904: 0xB9B9,\n\t20980 - 11904: 0xFC7A,\n\t20981 - 11904: 0xC942,\n\t20982 - 11904: 0xA4BF,\n\t20984 - 11904: 0xA559,\n\t20985 - 11904: 0xA557,\n\t20986 - 11904: 0xA558,\n\t20988 - 11904: 0x89E0,\n\t20989 - 11904: 0xA8E7,\n\t20990 - 11904: 0x9F4F,\n\t20992 - 11904: 0xA44D,\n\t20993 - 11904: 0xA44E,\n\t20994 - 11904: 0xC87D,\n\t20995 - 11904: 0xA462,\n\t20997 - 11904: 0x89E1,\n\t20998 - 11904: 0xA4C0,\n\t20999 - 11904: 0xA4C1,\n\t21000 - 11904: 0xA4C2,\n\t21001 - 11904: 0xC9BE,\n\t21002 - 11904: 0xA55A,\n\t21003 - 11904: 0xFAB0,\n\t21004 - 11904: 0xC96B,\n\t21006 - 11904: 0xA646,\n\t21008 - 11904: 0xC9BF,\n\t21009 - 11904: 0xA644,\n\t21010 - 11904: 0xA645,\n\t21011 - 11904: 0xC9BD,\n\t21014 - 11904: 0xA647,\n\t21015 - 11904: 0xA643,\n\t21020 - 11904: 0xCA6C,\n\t21021 - 11904: 0xAAEC,\n\t21022 - 11904: 0xCA6D,\n\t21023 - 11904: 0x9FCD,\n\t21024 - 11904: 0xA0E7,\n\t21025 - 11904: 0xCA6E,\n\t21028 - 11904: 0xA750,\n\t21029 - 11904: 0xA74F,\n\t21030 - 11904: 0xFAB1,\n\t21031 - 11904: 0x89A6,\n\t21032 - 11904: 0xA753,\n\t21033 - 11904: 0xA751,\n\t21034 - 11904: 0xA752,\n\t21038 - 11904: 0xA8ED,\n\t21040 - 11904: 0xA8EC,\n\t21041 - 11904: 0xCBD4,\n\t21042 - 11904: 0xCBD1,\n\t21043 - 11904: 0xCBD2,\n\t21044 - 11904: 0x9EFA,\n\t21045 - 11904: 0xCBD0,\n\t21046 - 11904: 0xA8EE,\n\t21047 - 11904: 0xA8EA,\n\t21048 - 11904: 0xA8E9,\n\t21050 - 11904: 0xA8EB,\n\t21051 - 11904: 0xA8E8,\n\t21052 - 11904: 0xFAB2,\n\t21057 - 11904: 0xA8EF,\n\t21059 - 11904: 0xAB63,\n\t21060 - 11904: 0xCDF0,\n\t21062 - 11904: 0xCBD3,\n\t21063 - 11904: 0xAB68,\n\t21065 - 11904: 0xCDF1,\n\t21066 - 11904: 0xAB64,\n\t21067 - 11904: 0xAB67,\n\t21068 - 11904: 0xAB66,\n\t21069 - 11904: 0xAB65,\n\t21070 - 11904: 0xAB62,\n\t21071 - 11904: 0x87BC,\n\t21074 - 11904: 0xD0E8,\n\t21076 - 11904: 0xADE7,\n\t21077 - 11904: 0xD0EB,\n\t21078 - 11904: 0xADE5,\n\t21079 - 11904: 0xFAB4,\n\t21081 - 11904: 0x92C4,\n\t21082 - 11904: 0xD0E7,\n\t21083 - 11904: 0xADE8,\n\t21084 - 11904: 0xADE6,\n\t21085 - 11904: 0xADE9,\n\t21086 - 11904: 0xD0E9,\n\t21087 - 11904: 0xD0EA,\n\t21088 - 11904: 0x9F6F,\n\t21089 - 11904: 0xD0E6,\n\t21090 - 11904: 0xD0EC,\n\t21096 - 11904: 0x8BB0,\n\t21097 - 11904: 0xB3D1,\n\t21098 - 11904: 0xB0C5,\n\t21099 - 11904: 0xD469,\n\t21100 - 11904: 0xD46B,\n\t21101 - 11904: 0xD46A,\n\t21102 - 11904: 0xD46C,\n\t21103 - 11904: 0xB0C6,\n\t21106 - 11904: 0xB3CE,\n\t21107 - 11904: 0x9FAC,\n\t21108 - 11904: 0xB3CF,\n\t21109 - 11904: 0xB3D0,\n\t21111 - 11904: 0xB6D0,\n\t21112 - 11904: 0xDCC7,\n\t21113 - 11904: 0x89E3,\n\t21114 - 11904: 0xDCC6,\n\t21115 - 11904: 0xDCC8,\n\t21116 - 11904: 0xDCC9,\n\t21117 - 11904: 0xB6D1,\n\t21119 - 11904: 0xB6CF,\n\t21120 - 11904: 0xE141,\n\t21121 - 11904: 0xE142,\n\t21122 - 11904: 0xB9BB,\n\t21123 - 11904: 0xB9BA,\n\t21124 - 11904: 0xE35A,\n\t21127 - 11904: 0xBC40,\n\t21128 - 11904: 0xBC41,\n\t21129 - 11904: 0xBC42,\n\t21130 - 11904: 0xBC44,\n\t21131 - 11904: 0xE4F2,\n\t21132 - 11904: 0xE4F3,\n\t21133 - 11904: 0xBC43,\n\t21135 - 11904: 0x9BD3,\n\t21136 - 11904: 0x89E4,\n\t21137 - 11904: 0xBEAF,\n\t21139 - 11904: 0xBEB0,\n\t21140 - 11904: 0xFAB5,\n\t21142 - 11904: 0xF1ED,\n\t21143 - 11904: 0xF5C3,\n\t21144 - 11904: 0xF5C2,\n\t21145 - 11904: 0xF7D1,\n\t21146 - 11904: 0x9FD5,\n\t21147 - 11904: 0xA44F,\n\t21151 - 11904: 0xA55C,\n\t21152 - 11904: 0xA55B,\n\t21153 - 11904: 0x8955,\n\t21155 - 11904: 0xA648,\n\t21156 - 11904: 0x92C5,\n\t21158 - 11904: 0xC9C0,\n\t21160 - 11904: 0x8956,\n\t21161 - 11904: 0xA755,\n\t21162 - 11904: 0xA756,\n\t21163 - 11904: 0xA754,\n\t21164 - 11904: 0xA757,\n\t21165 - 11904: 0xCA6F,\n\t21166 - 11904: 0xCA70,\n\t21173 - 11904: 0xFAB3,\n\t21177 - 11904: 0xFAB6,\n\t21179 - 11904: 0xA8F1,\n\t21180 - 11904: 0xCBD5,\n\t21182 - 11904: 0xA8F0,\n\t21184 - 11904: 0xCDF2,\n\t21185 - 11904: 0xAB6C,\n\t21186 - 11904: 0xCDF3,\n\t21187 - 11904: 0xAB6B,\n\t21189 - 11904: 0xFAB7,\n\t21191 - 11904: 0xAB69,\n\t21193 - 11904: 0xAB6A,\n\t21196 - 11904: 0x9EDC,\n\t21197 - 11904: 0xD0ED,\n\t21200 - 11904: 0xFBC4,\n\t21201 - 11904: 0x9F71,\n\t21202 - 11904: 0xB0C7,\n\t21203 - 11904: 0xD46E,\n\t21205 - 11904: 0xB0CA,\n\t21206 - 11904: 0xD46D,\n\t21207 - 11904: 0xB1E5,\n\t21208 - 11904: 0xB0C9,\n\t21209 - 11904: 0xB0C8,\n\t21211 - 11904: 0xB3D4,\n\t21213 - 11904: 0xB3D3,\n\t21214 - 11904: 0xB3D2,\n\t21215 - 11904: 0xB6D2,\n\t21216 - 11904: 0xFABA,\n\t21217 - 11904: 0x92C7,\n\t21218 - 11904: 0xB6D5,\n\t21219 - 11904: 0xB6D6,\n\t21220 - 11904: 0xB6D4,\n\t21222 - 11904: 0xB6D3,\n\t21225 - 11904: 0xE143,\n\t21227 - 11904: 0xE144,\n\t21231 - 11904: 0xE4F5,\n\t21232 - 11904: 0xBC45,\n\t21233 - 11904: 0xE4F4,\n\t21235 - 11904: 0xBEB1,\n\t21236 - 11904: 0xECBF,\n\t21237 - 11904: 0xC079,\n\t21239 - 11904: 0xF1EE,\n\t21240 - 11904: 0xC455,\n\t21241 - 11904: 0xC6C6,\n\t21242 - 11904: 0xA463,\n\t21243 - 11904: 0xA4C3,\n\t21244 - 11904: 0xC956,\n\t21246 - 11904: 0xA4C4,\n\t21247 - 11904: 0xA4C5,\n\t21249 - 11904: 0x9A4C,\n\t21253 - 11904: 0xFABD,\n\t21254 - 11904: 0xA55E,\n\t21256 - 11904: 0xA649,\n\t21257 - 11904: 0xCA71,\n\t21258 - 11904: 0xCBD6,\n\t21259 - 11904: 0xCBD7,\n\t21261 - 11904: 0xAB6D,\n\t21262 - 11904: 0xD0EE,\n\t21263 - 11904: 0xB0CC,\n\t21264 - 11904: 0xB0CB,\n\t21265 - 11904: 0xD863,\n\t21266 - 11904: 0xD862,\n\t21269 - 11904: 0xA450,\n\t21270 - 11904: 0xA4C6,\n\t21271 - 11904: 0xA55F,\n\t21273 - 11904: 0xB0CD,\n\t21274 - 11904: 0xC943,\n\t21276 - 11904: 0xC96C,\n\t21277 - 11904: 0xA560,\n\t21279 - 11904: 0xC9C2,\n\t21280 - 11904: 0xA64B,\n\t21281 - 11904: 0xA64A,\n\t21282 - 11904: 0xC9C1,\n\t21283 - 11904: 0xA758,\n\t21284 - 11904: 0x8C68,\n\t21287 - 11904: 0x89E5,\n\t21290 - 11904: 0xADEA,\n\t21292 - 11904: 0x9F7D,\n\t21293 - 11904: 0xD46F,\n\t21295 - 11904: 0xB6D7,\n\t21296 - 11904: 0xE145,\n\t21297 - 11904: 0xB9BC,\n\t21298 - 11904: 0xA0A9,\n\t21299 - 11904: 0xFAC4,\n\t21300 - 11904: 0xE8FA,\n\t21303 - 11904: 0xF3FD,\n\t21304 - 11904: 0xC6C7,\n\t21305 - 11904: 0xA4C7,\n\t21307 - 11904: 0x8957,\n\t21308 - 11904: 0xCBD8,\n\t21309 - 11904: 0xCDF4,\n\t21310 - 11904: 0xB0D0,\n\t21311 - 11904: 0xB0CE,\n\t21312 - 11904: 0xB0CF,\n\t21313 - 11904: 0xA451,\n\t21314 - 11904: 0xFAAA,\n\t21315 - 11904: 0xA464,\n\t21316 - 11904: 0xFAC5,\n\t21317 - 11904: 0xA4CA,\n\t21319 - 11904: 0xA4C9,\n\t21320 - 11904: 0xA4C8,\n\t21321 - 11904: 0xA563,\n\t21322 - 11904: 0xA562,\n\t21324 - 11904: 0xC96D,\n\t21325 - 11904: 0xC9C3,\n\t21326 - 11904: 0x8958,\n\t21329 - 11904: 0xA8F5,\n\t21330 - 11904: 0xA8F2,\n\t21331 - 11904: 0xA8F4,\n\t21332 - 11904: 0xA8F3,\n\t21335 - 11904: 0xAB6E,\n\t21338 - 11904: 0xB3D5,\n\t21340 - 11904: 0xA452,\n\t21341 - 11904: 0x8BE3,\n\t21342 - 11904: 0xA4CB,\n\t21343 - 11904: 0x8B61,\n\t21344 - 11904: 0xA565,\n\t21345 - 11904: 0xA564,\n\t21347 - 11904: 0xCA72,\n\t21348 - 11904: 0x9AF1,\n\t21350 - 11904: 0xA8F6,\n\t21351 - 11904: 0x9EB7,\n\t21353 - 11904: 0xC6C8,\n\t21356 - 11904: 0xC957,\n\t21357 - 11904: 0xFAD1,\n\t21358 - 11904: 0xA567,\n\t21359 - 11904: 0xA566,\n\t21360 - 11904: 0xA64C,\n\t21361 - 11904: 0xA64D,\n\t21362 - 11904: 0xCA73,\n\t21363 - 11904: 0xA759,\n\t21364 - 11904: 0xFAD2,\n\t21365 - 11904: 0xA75A,\n\t21367 - 11904: 0xA8F7,\n\t21368 - 11904: 0xA8F8,\n\t21369 - 11904: 0xA8F9,\n\t21371 - 11904: 0xAB6F,\n\t21372 - 11904: 0xCDF5,\n\t21373 - 11904: 0x9EBA,\n\t21374 - 11904: 0xFAD4,\n\t21375 - 11904: 0xFAD5,\n\t21378 - 11904: 0xC944,\n\t21380 - 11904: 0xA4CC,\n\t21386 - 11904: 0xC9C4,\n\t21390 - 11904: 0xCA74,\n\t21391 - 11904: 0xCA75,\n\t21394 - 11904: 0xCBD9,\n\t21395 - 11904: 0xFAD9,\n\t21396 - 11904: 0xCBDA,\n\t21398 - 11904: 0xCDF7,\n\t21399 - 11904: 0xCDF6,\n\t21400 - 11904: 0xCDF9,\n\t21401 - 11904: 0xCDF8,\n\t21402 - 11904: 0xAB70,\n\t21404 - 11904: 0xD470,\n\t21405 - 11904: 0xADED,\n\t21406 - 11904: 0xD0EF,\n\t21407 - 11904: 0xADEC,\n\t21408 - 11904: 0xFADB,\n\t21410 - 11904: 0x9CE0,\n\t21412 - 11904: 0xD864,\n\t21413 - 11904: 0xB3D6,\n\t21414 - 11904: 0xFBF7,\n\t21415 - 11904: 0xD865,\n\t21416 - 11904: 0xFBFA,\n\t21417 - 11904: 0x89E7,\n\t21418 - 11904: 0xA07A,\n\t21419 - 11904: 0xFADC,\n\t21420 - 11904: 0xE146,\n\t21421 - 11904: 0xB9BD,\n\t21422 - 11904: 0xFADD,\n\t21424 - 11904: 0x89E9,\n\t21426 - 11904: 0xBC46,\n\t21428 - 11904: 0xF1EF,\n\t21430 - 11904: 0xC6C9,\n\t21433 - 11904: 0xC958,\n\t21435 - 11904: 0xA568,\n\t21441 - 11904: 0xFAE2,\n\t21442 - 11904: 0x89EB,\n\t21443 - 11904: 0xB0D1,\n\t21445 - 11904: 0xFAE3,\n\t21448 - 11904: 0xA453,\n\t21449 - 11904: 0xA465,\n\t21450 - 11904: 0xA4CE,\n\t21451 - 11904: 0xA4CD,\n\t21452 - 11904: 0x90C8,\n\t21453 - 11904: 0xA4CF,\n\t21456 - 11904: 0x92DA,\n\t21457 - 11904: 0x8959,\n\t21458 - 11904: 0x9CF5,\n\t21460 - 11904: 0xA8FB,\n\t21462 - 11904: 0xA8FA,\n\t21463 - 11904: 0xA8FC,\n\t21464 - 11904: 0x895A,\n\t21465 - 11904: 0xFAE7,\n\t21466 - 11904: 0x9FA2,\n\t21467 - 11904: 0xAB71,\n\t21471 - 11904: 0xADEE,\n\t21472 - 11904: 0xFAEA,\n\t21473 - 11904: 0xE8FB,\n\t21474 - 11904: 0xC24F,\n\t21475 - 11904: 0xA466,\n\t21476 - 11904: 0xA56A,\n\t21477 - 11904: 0xA579,\n\t21478 - 11904: 0xA574,\n\t21480 - 11904: 0xA56F,\n\t21481 - 11904: 0xA56E,\n\t21482 - 11904: 0xA575,\n\t21483 - 11904: 0xA573,\n\t21484 - 11904: 0xA56C,\n\t21485 - 11904: 0xA57A,\n\t21486 - 11904: 0xA56D,\n\t21487 - 11904: 0xA569,\n\t21488 - 11904: 0xA578,\n\t21489 - 11904: 0xA577,\n\t21490 - 11904: 0xA576,\n\t21491 - 11904: 0xA56B,\n\t21493 - 11904: 0xA572,\n\t21494 - 11904: 0xFAED,\n\t21495 - 11904: 0x8FAD,\n\t21496 - 11904: 0xA571,\n\t21499 - 11904: 0xA57B,\n\t21500 - 11904: 0xA570,\n\t21502 - 11904: 0xFB59,\n\t21505 - 11904: 0xA653,\n\t21507 - 11904: 0xA659,\n\t21508 - 11904: 0xA655,\n\t21510 - 11904: 0xA65B,\n\t21511 - 11904: 0xC9C5,\n\t21512 - 11904: 0xA658,\n\t21513 - 11904: 0xA64E,\n\t21514 - 11904: 0xA651,\n\t21515 - 11904: 0xA654,\n\t21516 - 11904: 0xA650,\n\t21517 - 11904: 0xA657,\n\t21518 - 11904: 0xA65A,\n\t21519 - 11904: 0xA64F,\n\t21520 - 11904: 0xA652,\n\t21521 - 11904: 0xA656,\n\t21522 - 11904: 0xA65C,\n\t21523 - 11904: 0xFAEF,\n\t21524 - 11904: 0x96EF,\n\t21526 - 11904: 0x9DEC,\n\t21528 - 11904: 0xCA7E,\n\t21529 - 11904: 0xCA7B,\n\t21530 - 11904: 0x9DCA,\n\t21531 - 11904: 0xA767,\n\t21532 - 11904: 0xCA7C,\n\t21533 - 11904: 0xA75B,\n\t21534 - 11904: 0xA75D,\n\t21535 - 11904: 0xA775,\n\t21536 - 11904: 0xA770,\n\t21537 - 11904: 0xFD6D,\n\t21539 - 11904: 0x89EC,\n\t21540 - 11904: 0xCAA5,\n\t21541 - 11904: 0xCA7D,\n\t21542 - 11904: 0xA75F,\n\t21543 - 11904: 0xA761,\n\t21544 - 11904: 0xCAA4,\n\t21545 - 11904: 0xA768,\n\t21546 - 11904: 0xCA78,\n\t21547 - 11904: 0xA774,\n\t21548 - 11904: 0xA776,\n\t21549 - 11904: 0xA75C,\n\t21550 - 11904: 0xA76D,\n\t21551 - 11904: 0xFB44,\n\t21552 - 11904: 0xCA76,\n\t21553 - 11904: 0xA773,\n\t21554 - 11904: 0x9DE2,\n\t21555 - 11904: 0xA764,\n\t21556 - 11904: 0x8C75,\n\t21557 - 11904: 0xA76E,\n\t21558 - 11904: 0xA76F,\n\t21559 - 11904: 0xCA77,\n\t21560 - 11904: 0xA76C,\n\t21561 - 11904: 0xA76A,\n\t21563 - 11904: 0xA76B,\n\t21564 - 11904: 0xA771,\n\t21565 - 11904: 0xCAA1,\n\t21566 - 11904: 0xA75E,\n\t21568 - 11904: 0xA772,\n\t21569 - 11904: 0xCAA3,\n\t21570 - 11904: 0xA766,\n\t21571 - 11904: 0xA763,\n\t21573 - 11904: 0xCA7A,\n\t21574 - 11904: 0xA762,\n\t21575 - 11904: 0xCAA6,\n\t21576 - 11904: 0xA765,\n\t21578 - 11904: 0xA769,\n\t21579 - 11904: 0x9EC0,\n\t21580 - 11904: 0x87C5,\n\t21581 - 11904: 0x9E56,\n\t21582 - 11904: 0xA760,\n\t21583 - 11904: 0xCAA2,\n\t21588 - 11904: 0xCA79,\n\t21600 - 11904: 0xCBEB,\n\t21601 - 11904: 0xCBEA,\n\t21602 - 11904: 0xA94F,\n\t21603 - 11904: 0xCBED,\n\t21604 - 11904: 0xCBEF,\n\t21605 - 11904: 0xCBE4,\n\t21606 - 11904: 0xCBE7,\n\t21607 - 11904: 0xCBEE,\n\t21608 - 11904: 0xA950,\n\t21609 - 11904: 0x9F79,\n\t21610 - 11904: 0x9AC7,\n\t21611 - 11904: 0xCBE1,\n\t21612 - 11904: 0xCBE5,\n\t21613 - 11904: 0xFAF4,\n\t21615 - 11904: 0xCBE9,\n\t21616 - 11904: 0xCE49,\n\t21617 - 11904: 0xA94B,\n\t21618 - 11904: 0xCE4D,\n\t21619 - 11904: 0xA8FD,\n\t21620 - 11904: 0xCBE6,\n\t21621 - 11904: 0xA8FE,\n\t21622 - 11904: 0xA94C,\n\t21623 - 11904: 0xA945,\n\t21624 - 11904: 0xA941,\n\t21626 - 11904: 0xCBE2,\n\t21627 - 11904: 0xA944,\n\t21628 - 11904: 0xA949,\n\t21629 - 11904: 0xA952,\n\t21630 - 11904: 0xCBE3,\n\t21631 - 11904: 0xCBDC,\n\t21632 - 11904: 0xA943,\n\t21633 - 11904: 0xCBDD,\n\t21634 - 11904: 0xCBDF,\n\t21636 - 11904: 0xA946,\n\t21637 - 11904: 0x98A1,\n\t21638 - 11904: 0xA948,\n\t21639 - 11904: 0xCBDB,\n\t21640 - 11904: 0xCBE0,\n\t21643 - 11904: 0xA951,\n\t21644 - 11904: 0xA94D,\n\t21645 - 11904: 0xCBE8,\n\t21646 - 11904: 0xA953,\n\t21647 - 11904: 0xFAF8,\n\t21648 - 11904: 0xA94A,\n\t21649 - 11904: 0xCBDE,\n\t21650 - 11904: 0xA947,\n\t21651 - 11904: 0x89F0,\n\t21652 - 11904: 0x9E47,\n\t21653 - 11904: 0xA942,\n\t21654 - 11904: 0xA940,\n\t21655 - 11904: 0x9DF7,\n\t21656 - 11904: 0xCBEC,\n\t21658 - 11904: 0xA94E,\n\t21660 - 11904: 0x9FD3,\n\t21662 - 11904: 0x9ACA,\n\t21664 - 11904: 0xCE48,\n\t21665 - 11904: 0xCDFB,\n\t21666 - 11904: 0xCE4B,\n\t21667 - 11904: 0x89F1,\n\t21668 - 11904: 0xFAF9,\n\t21669 - 11904: 0xCDFD,\n\t21670 - 11904: 0xAB78,\n\t21671 - 11904: 0xABA8,\n\t21672 - 11904: 0xAB74,\n\t21673 - 11904: 0xABA7,\n\t21674 - 11904: 0xAB7D,\n\t21675 - 11904: 0xABA4,\n\t21676 - 11904: 0xAB72,\n\t21677 - 11904: 0xCDFC,\n\t21678 - 11904: 0xCE43,\n\t21679 - 11904: 0xABA3,\n\t21680 - 11904: 0xCE4F,\n\t21681 - 11904: 0xABA5,\n\t21682 - 11904: 0x8E5A,\n\t21683 - 11904: 0xAB79,\n\t21684 - 11904: 0x89F2,\n\t21686 - 11904: 0xCE45,\n\t21687 - 11904: 0xCE42,\n\t21688 - 11904: 0xAB77,\n\t21689 - 11904: 0x89F3,\n\t21690 - 11904: 0xCDFA,\n\t21691 - 11904: 0xABA6,\n\t21692 - 11904: 0xCE4A,\n\t21693 - 11904: 0xAB7C,\n\t21694 - 11904: 0xCE4C,\n\t21695 - 11904: 0xABA9,\n\t21696 - 11904: 0xAB73,\n\t21697 - 11904: 0xAB7E,\n\t21698 - 11904: 0xAB7B,\n\t21699 - 11904: 0xCE40,\n\t21700 - 11904: 0xABA1,\n\t21701 - 11904: 0xCE46,\n\t21702 - 11904: 0xCE47,\n\t21703 - 11904: 0xAB7A,\n\t21704 - 11904: 0xABA2,\n\t21705 - 11904: 0xAB76,\n\t21707 - 11904: 0x925D,\n\t21708 - 11904: 0x8B51,\n\t21709 - 11904: 0x92E0,\n\t21710 - 11904: 0xAB75,\n\t21711 - 11904: 0xCDFE,\n\t21712 - 11904: 0x89F4,\n\t21718 - 11904: 0xCE44,\n\t21722 - 11904: 0x9FD4,\n\t21726 - 11904: 0xCE4E,\n\t21728 - 11904: 0xD144,\n\t21729 - 11904: 0xADFB,\n\t21730 - 11904: 0xD0F1,\n\t21731 - 11904: 0x8A79,\n\t21732 - 11904: 0xD0F6,\n\t21733 - 11904: 0xADF4,\n\t21734 - 11904: 0xAE40,\n\t21735 - 11904: 0xD0F4,\n\t21736 - 11904: 0xADEF,\n\t21737 - 11904: 0xADF9,\n\t21738 - 11904: 0xADFE,\n\t21739 - 11904: 0xD0FB,\n\t21741 - 11904: 0xADFA,\n\t21742 - 11904: 0xADFD,\n\t21743 - 11904: 0x89F5,\n\t21745 - 11904: 0xD0FE,\n\t21746 - 11904: 0xADF5,\n\t21747 - 11904: 0xD0F5,\n\t21751 - 11904: 0xD142,\n\t21752 - 11904: 0xD143,\n\t21754 - 11904: 0xADF7,\n\t21755 - 11904: 0xD141,\n\t21756 - 11904: 0xADF3,\n\t21757 - 11904: 0xAE43,\n\t21759 - 11904: 0xD0F8,\n\t21761 - 11904: 0xADF1,\n\t21762 - 11904: 0x97A7,\n\t21763 - 11904: 0xD146,\n\t21764 - 11904: 0xD0F9,\n\t21765 - 11904: 0xD0FD,\n\t21766 - 11904: 0xADF6,\n\t21767 - 11904: 0xAE42,\n\t21768 - 11904: 0xD0FA,\n\t21769 - 11904: 0xADFC,\n\t21770 - 11904: 0xD140,\n\t21771 - 11904: 0xD147,\n\t21772 - 11904: 0xD4A1,\n\t21773 - 11904: 0x93BA,\n\t21774 - 11904: 0xD145,\n\t21775 - 11904: 0xAE44,\n\t21776 - 11904: 0xADF0,\n\t21777 - 11904: 0xD0FC,\n\t21778 - 11904: 0xD0F3,\n\t21779 - 11904: 0x9E58,\n\t21780 - 11904: 0xADF8,\n\t21783 - 11904: 0xD0F2,\n\t21784 - 11904: 0x89F6,\n\t21786 - 11904: 0xD0F7,\n\t21790 - 11904: 0x9E57,\n\t21795 - 11904: 0x89F7,\n\t21797 - 11904: 0x8A41,\n\t21798 - 11904: 0xD0F0,\n\t21799 - 11904: 0xAE41,\n\t21800 - 11904: 0x89F8,\n\t21802 - 11904: 0xD477,\n\t21803 - 11904: 0xFAF1,\n\t21804 - 11904: 0xB0E4,\n\t21805 - 11904: 0xD4A7,\n\t21806 - 11904: 0xB0E2,\n\t21807 - 11904: 0xB0DF,\n\t21808 - 11904: 0xD47C,\n\t21809 - 11904: 0xB0DB,\n\t21810 - 11904: 0xD4A2,\n\t21811 - 11904: 0xB0E6,\n\t21812 - 11904: 0xD476,\n\t21813 - 11904: 0xD47B,\n\t21814 - 11904: 0xD47A,\n\t21815 - 11904: 0xADF2,\n\t21816 - 11904: 0xB0E1,\n\t21817 - 11904: 0xD4A5,\n\t21819 - 11904: 0xD4A8,\n\t21820 - 11904: 0xD473,\n\t21822 - 11904: 0xB3E8,\n\t21823 - 11904: 0x89FA,\n\t21824 - 11904: 0xD4A9,\n\t21825 - 11904: 0xB0E7,\n\t21827 - 11904: 0xB0D9,\n\t21828 - 11904: 0xB0D6,\n\t21829 - 11904: 0xD47E,\n\t21830 - 11904: 0xB0D3,\n\t21831 - 11904: 0xFB42,\n\t21832 - 11904: 0xD4A6,\n\t21833 - 11904: 0xFABF,\n\t21834 - 11904: 0xB0DA,\n\t21835 - 11904: 0xD4AA,\n\t21837 - 11904: 0xD474,\n\t21838 - 11904: 0xD4A4,\n\t21839 - 11904: 0xB0DD,\n\t21840 - 11904: 0xD475,\n\t21841 - 11904: 0xD478,\n\t21842 - 11904: 0xD47D,\n\t21843 - 11904: 0xFBA3,\n\t21845 - 11904: 0xB0DE,\n\t21846 - 11904: 0xB0DC,\n\t21847 - 11904: 0xB0E8,\n\t21852 - 11904: 0xB0E3,\n\t21853 - 11904: 0xFAF7,\n\t21854 - 11904: 0xB0D7,\n\t21855 - 11904: 0xB1D2,\n\t21857 - 11904: 0xB0D8,\n\t21858 - 11904: 0xD479,\n\t21859 - 11904: 0xB0E5,\n\t21860 - 11904: 0xB0E0,\n\t21861 - 11904: 0xD4A3,\n\t21862 - 11904: 0xB0D5,\n\t21865 - 11904: 0x9E4E,\n\t21866 - 11904: 0xB0D4,\n\t21867 - 11904: 0x94DC,\n\t21873 - 11904: 0x95DA,\n\t21874 - 11904: 0x9DF8,\n\t21875 - 11904: 0x9F6A,\n\t21877 - 11904: 0xD471,\n\t21878 - 11904: 0xD472,\n\t21879 - 11904: 0xD86A,\n\t21881 - 11904: 0x8AB7,\n\t21883 - 11904: 0xB3D7,\n\t21884 - 11904: 0xB3DA,\n\t21885 - 11904: 0xD875,\n\t21886 - 11904: 0xB3EE,\n\t21887 - 11904: 0xD878,\n\t21888 - 11904: 0xB3D8,\n\t21889 - 11904: 0xD871,\n\t21890 - 11904: 0xB3DE,\n\t21891 - 11904: 0xB3E4,\n\t21892 - 11904: 0xB5BD,\n\t21894 - 11904: 0xFB46,\n\t21895 - 11904: 0xB3E2,\n\t21896 - 11904: 0xD86E,\n\t21897 - 11904: 0xB3EF,\n\t21898 - 11904: 0xB3DB,\n\t21899 - 11904: 0xB3E3,\n\t21900 - 11904: 0xD876,\n\t21901 - 11904: 0xDCD7,\n\t21902 - 11904: 0xD87B,\n\t21903 - 11904: 0xD86F,\n\t21904 - 11904: 0x8A46,\n\t21905 - 11904: 0xD866,\n\t21906 - 11904: 0xD873,\n\t21907 - 11904: 0xD86D,\n\t21908 - 11904: 0xB3E1,\n\t21909 - 11904: 0xD879,\n\t21912 - 11904: 0xB3DD,\n\t21913 - 11904: 0xB3F1,\n\t21914 - 11904: 0xB3EA,\n\t21916 - 11904: 0xB3DF,\n\t21917 - 11904: 0xB3DC,\n\t21919 - 11904: 0xB3E7,\n\t21921 - 11904: 0xD87A,\n\t21922 - 11904: 0xD86C,\n\t21923 - 11904: 0xD872,\n\t21924 - 11904: 0xD874,\n\t21925 - 11904: 0xD868,\n\t21926 - 11904: 0xD877,\n\t21927 - 11904: 0xB3D9,\n\t21928 - 11904: 0xD867,\n\t21929 - 11904: 0xFB47,\n\t21930 - 11904: 0xB3E0,\n\t21931 - 11904: 0xB3F0,\n\t21932 - 11904: 0xB3EC,\n\t21933 - 11904: 0xD869,\n\t21934 - 11904: 0xB3E6,\n\t21936 - 11904: 0x9148,\n\t21937 - 11904: 0xB3ED,\n\t21938 - 11904: 0xB3E9,\n\t21939 - 11904: 0xB3E5,\n\t21940 - 11904: 0x92DE,\n\t21941 - 11904: 0xD870,\n\t21945 - 11904: 0x8B53,\n\t21946 - 11904: 0x9DF6,\n\t21947 - 11904: 0xB3EB,\n\t21948 - 11904: 0x9BDA,\n\t21951 - 11904: 0xDCD5,\n\t21952 - 11904: 0xDCD1,\n\t21953 - 11904: 0x9D7E,\n\t21954 - 11904: 0xDCE0,\n\t21955 - 11904: 0xDCCA,\n\t21956 - 11904: 0xDCD3,\n\t21957 - 11904: 0xB6E5,\n\t21958 - 11904: 0xB6E6,\n\t21959 - 11904: 0xB6DE,\n\t21960 - 11904: 0xDCDC,\n\t21961 - 11904: 0xB6E8,\n\t21962 - 11904: 0xDCCF,\n\t21963 - 11904: 0xDCCE,\n\t21964 - 11904: 0xDCCC,\n\t21965 - 11904: 0xDCDE,\n\t21966 - 11904: 0xB6DC,\n\t21967 - 11904: 0xDCD8,\n\t21968 - 11904: 0xDCCD,\n\t21969 - 11904: 0xB6DF,\n\t21970 - 11904: 0xDCD6,\n\t21971 - 11904: 0xB6DA,\n\t21972 - 11904: 0xDCD2,\n\t21973 - 11904: 0xDCD9,\n\t21974 - 11904: 0xDCDB,\n\t21975 - 11904: 0x89FD,\n\t21976 - 11904: 0x99E4,\n\t21977 - 11904: 0xDCDF,\n\t21978 - 11904: 0xB6E3,\n\t21979 - 11904: 0xDCCB,\n\t21980 - 11904: 0xB6DD,\n\t21981 - 11904: 0xDCD0,\n\t21982 - 11904: 0x9E43,\n\t21983 - 11904: 0xB6D8,\n\t21985 - 11904: 0xB6E4,\n\t21986 - 11904: 0xDCDA,\n\t21987 - 11904: 0xB6E0,\n\t21988 - 11904: 0xB6E1,\n\t21989 - 11904: 0xB6E7,\n\t21990 - 11904: 0xB6DB,\n\t21991 - 11904: 0xA25F,\n\t21992 - 11904: 0xB6D9,\n\t21993 - 11904: 0xDCD4,\n\t21994 - 11904: 0x9DE9,\n\t21996 - 11904: 0x8F52,\n\t21999 - 11904: 0xB6E2,\n\t22000 - 11904: 0x9DF5,\n\t22001 - 11904: 0x9DF0,\n\t22002 - 11904: 0xDCDD,\n\t22005 - 11904: 0x99E7,\n\t22006 - 11904: 0xB9CD,\n\t22007 - 11904: 0xB9C8,\n\t22009 - 11904: 0xE155,\n\t22010 - 11904: 0xE151,\n\t22011 - 11904: 0x8BBD,\n\t22012 - 11904: 0xE14B,\n\t22013 - 11904: 0xB9C2,\n\t22014 - 11904: 0xB9BE,\n\t22015 - 11904: 0xE154,\n\t22016 - 11904: 0xB9BF,\n\t22017 - 11904: 0xE14E,\n\t22018 - 11904: 0xE150,\n\t22020 - 11904: 0xE153,\n\t22021 - 11904: 0xFB48,\n\t22022 - 11904: 0xB9C4,\n\t22024 - 11904: 0xB9CB,\n\t22025 - 11904: 0xB9C5,\n\t22028 - 11904: 0xE149,\n\t22029 - 11904: 0xB9C6,\n\t22030 - 11904: 0xB9C7,\n\t22031 - 11904: 0xE14C,\n\t22032 - 11904: 0xB9CC,\n\t22033 - 11904: 0x9FB7,\n\t22034 - 11904: 0xE14A,\n\t22035 - 11904: 0xE14F,\n\t22036 - 11904: 0xB9C3,\n\t22037 - 11904: 0xE148,\n\t22038 - 11904: 0xB9C9,\n\t22039 - 11904: 0xB9C1,\n\t22043 - 11904: 0xB9C0,\n\t22044 - 11904: 0xE14D,\n\t22045 - 11904: 0xE152,\n\t22046 - 11904: 0x9DD0,\n\t22047 - 11904: 0xB9CA,\n\t22048 - 11904: 0x9FEB,\n\t22049 - 11904: 0x8DA9,\n\t22050 - 11904: 0x9DCF,\n\t22051 - 11904: 0x98E1,\n\t22053 - 11904: 0x9DE5,\n\t22055 - 11904: 0xE147,\n\t22057 - 11904: 0xBC4D,\n\t22058 - 11904: 0xE547,\n\t22060 - 11904: 0xE544,\n\t22061 - 11904: 0x9DC8,\n\t22062 - 11904: 0xBC47,\n\t22063 - 11904: 0xBC53,\n\t22064 - 11904: 0xBC54,\n\t22066 - 11904: 0xBC4A,\n\t22067 - 11904: 0xE542,\n\t22068 - 11904: 0xBC4C,\n\t22069 - 11904: 0xE4F9,\n\t22070 - 11904: 0xBC52,\n\t22071 - 11904: 0xFB4F,\n\t22072 - 11904: 0xE546,\n\t22073 - 11904: 0xBC49,\n\t22074 - 11904: 0xE548,\n\t22075 - 11904: 0xBC48,\n\t22077 - 11904: 0xE543,\n\t22078 - 11904: 0xE545,\n\t22079 - 11904: 0xBC4B,\n\t22080 - 11904: 0xE541,\n\t22081 - 11904: 0xE4FA,\n\t22082 - 11904: 0xE4F7,\n\t22083 - 11904: 0x9DEB,\n\t22085 - 11904: 0xD86B,\n\t22086 - 11904: 0xE4FD,\n\t22088 - 11904: 0xE4F6,\n\t22089 - 11904: 0xE4FC,\n\t22090 - 11904: 0xE4FB,\n\t22092 - 11904: 0xE4F8,\n\t22093 - 11904: 0xFB54,\n\t22094 - 11904: 0xBC4F,\n\t22095 - 11904: 0xFB55,\n\t22096 - 11904: 0x9AA2,\n\t22098 - 11904: 0x8AD6,\n\t22099 - 11904: 0xBC4E,\n\t22100 - 11904: 0x9A5F,\n\t22103 - 11904: 0xBC50,\n\t22104 - 11904: 0xE4FE,\n\t22105 - 11904: 0xBEB2,\n\t22106 - 11904: 0xE540,\n\t22109 - 11904: 0x9EF5,\n\t22110 - 11904: 0xE945,\n\t22112 - 11904: 0xE8FD,\n\t22113 - 11904: 0x8FB7,\n\t22114 - 11904: 0xBEBE,\n\t22115 - 11904: 0xE942,\n\t22116 - 11904: 0xBEB6,\n\t22117 - 11904: 0xBEBA,\n\t22118 - 11904: 0xE941,\n\t22120 - 11904: 0xBEB9,\n\t22121 - 11904: 0xBEB5,\n\t22122 - 11904: 0xBEB8,\n\t22123 - 11904: 0xBEB3,\n\t22124 - 11904: 0xBEBD,\n\t22125 - 11904: 0xE943,\n\t22126 - 11904: 0xE8FE,\n\t22127 - 11904: 0xBEBC,\n\t22128 - 11904: 0xE8FC,\n\t22129 - 11904: 0xBEBB,\n\t22130 - 11904: 0xE944,\n\t22131 - 11904: 0xE940,\n\t22132 - 11904: 0xBC51,\n\t22134 - 11904: 0xBEBF,\n\t22135 - 11904: 0xE946,\n\t22136 - 11904: 0xBEB7,\n\t22137 - 11904: 0xBEB4,\n\t22138 - 11904: 0x9AD2,\n\t22139 - 11904: 0x9E6A,\n\t22140 - 11904: 0x9EE8,\n\t22142 - 11904: 0xECC6,\n\t22143 - 11904: 0xECC8,\n\t22144 - 11904: 0xC07B,\n\t22145 - 11904: 0xECC9,\n\t22146 - 11904: 0xECC7,\n\t22147 - 11904: 0xECC5,\n\t22148 - 11904: 0xECC4,\n\t22149 - 11904: 0xC07D,\n\t22150 - 11904: 0xECC3,\n\t22151 - 11904: 0xC07E,\n\t22153 - 11904: 0x8BBF,\n\t22154 - 11904: 0x91C2,\n\t22155 - 11904: 0x9D62,\n\t22156 - 11904: 0xECC1,\n\t22157 - 11904: 0xECC2,\n\t22158 - 11904: 0xC07A,\n\t22159 - 11904: 0xC0A1,\n\t22160 - 11904: 0xC07C,\n\t22162 - 11904: 0x9260,\n\t22163 - 11904: 0xECC0,\n\t22165 - 11904: 0xC250,\n\t22167 - 11904: 0xEFBC,\n\t22168 - 11904: 0xEFBA,\n\t22169 - 11904: 0xEFBF,\n\t22170 - 11904: 0xEFBD,\n\t22172 - 11904: 0xEFBB,\n\t22173 - 11904: 0xEFBE,\n\t22174 - 11904: 0x925E,\n\t22175 - 11904: 0x91C1,\n\t22177 - 11904: 0x8AC5,\n\t22180 - 11904: 0x97A3,\n\t22181 - 11904: 0xC360,\n\t22182 - 11904: 0xF1F2,\n\t22183 - 11904: 0xF1F3,\n\t22184 - 11904: 0xC456,\n\t22186 - 11904: 0xF1F4,\n\t22187 - 11904: 0xF1F0,\n\t22188 - 11904: 0xF1F5,\n\t22189 - 11904: 0xF1F1,\n\t22190 - 11904: 0xC251,\n\t22191 - 11904: 0x8B6C,\n\t22193 - 11904: 0x8D7E,\n\t22194 - 11904: 0xF3FE,\n\t22195 - 11904: 0xF441,\n\t22196 - 11904: 0xC459,\n\t22197 - 11904: 0xF440,\n\t22198 - 11904: 0xC458,\n\t22199 - 11904: 0xC457,\n\t22201 - 11904: 0x9C54,\n\t22204 - 11904: 0xC45A,\n\t22205 - 11904: 0xF5C5,\n\t22206 - 11904: 0xF5C6,\n\t22207 - 11904: 0x9DBD,\n\t22208 - 11904: 0xC4DA,\n\t22209 - 11904: 0xC4D9,\n\t22210 - 11904: 0xC4DB,\n\t22211 - 11904: 0xF5C4,\n\t22213 - 11904: 0xF6D8,\n\t22214 - 11904: 0xF6D7,\n\t22216 - 11904: 0xC56D,\n\t22217 - 11904: 0xC56F,\n\t22218 - 11904: 0xC56E,\n\t22219 - 11904: 0xF6D9,\n\t22220 - 11904: 0xC5C8,\n\t22221 - 11904: 0xF8A6,\n\t22225 - 11904: 0xC5F1,\n\t22227 - 11904: 0xF8A5,\n\t22228 - 11904: 0xF8EE,\n\t22230 - 11904: 0x9CC5,\n\t22231 - 11904: 0xC949,\n\t22234 - 11904: 0xA57D,\n\t22235 - 11904: 0xA57C,\n\t22237 - 11904: 0xA65F,\n\t22238 - 11904: 0xA65E,\n\t22239 - 11904: 0xC9C7,\n\t22240 - 11904: 0xA65D,\n\t22241 - 11904: 0xC9C6,\n\t22242 - 11904: 0x895B,\n\t22244 - 11904: 0xA779,\n\t22245 - 11904: 0xCAA9,\n\t22247 - 11904: 0xCAA8,\n\t22250 - 11904: 0xA777,\n\t22251 - 11904: 0xA77A,\n\t22253 - 11904: 0xFB5C,\n\t22254 - 11904: 0xCAA7,\n\t22255 - 11904: 0xFB5B,\n\t22256 - 11904: 0xA778,\n\t22257 - 11904: 0xFB57,\n\t22263 - 11904: 0xCBF0,\n\t22265 - 11904: 0xCBF1,\n\t22266 - 11904: 0xA954,\n\t22267 - 11904: 0x8765,\n\t22269 - 11904: 0x98C7,\n\t22271 - 11904: 0xABAA,\n\t22272 - 11904: 0xFB5A,\n\t22273 - 11904: 0xD148,\n\t22274 - 11904: 0xD149,\n\t22275 - 11904: 0xAE45,\n\t22276 - 11904: 0xAE46,\n\t22279 - 11904: 0xD4AC,\n\t22280 - 11904: 0xB0E9,\n\t22281 - 11904: 0xB0EB,\n\t22282 - 11904: 0xD4AB,\n\t22283 - 11904: 0xB0EA,\n\t22284 - 11904: 0xD87C,\n\t22285 - 11904: 0xB3F2,\n\t22290 - 11904: 0xB6E9,\n\t22291 - 11904: 0xB6EA,\n\t22292 - 11904: 0xDCE1,\n\t22293 - 11904: 0x9CEE,\n\t22294 - 11904: 0xB9CF,\n\t22296 - 11904: 0xB9CE,\n\t22298 - 11904: 0xE549,\n\t22299 - 11904: 0xE948,\n\t22300 - 11904: 0xE947,\n\t22301 - 11904: 0x92E2,\n\t22302 - 11904: 0xF96B,\n\t22303 - 11904: 0xA467,\n\t22304 - 11904: 0xC959,\n\t22306 - 11904: 0xC96E,\n\t22307 - 11904: 0xC96F,\n\t22312 - 11904: 0xA662,\n\t22313 - 11904: 0xA666,\n\t22314 - 11904: 0xC9C9,\n\t22316 - 11904: 0xA664,\n\t22317 - 11904: 0xA663,\n\t22318 - 11904: 0xC9C8,\n\t22319 - 11904: 0xA665,\n\t22320 - 11904: 0xA661,\n\t22322 - 11904: 0x94A7,\n\t22323 - 11904: 0xA660,\n\t22324 - 11904: 0xC9CA,\n\t22331 - 11904: 0xA7A6,\n\t22333 - 11904: 0x8CCC,\n\t22334 - 11904: 0xA7A3,\n\t22335 - 11904: 0x9BD4,\n\t22336 - 11904: 0xA77D,\n\t22337 - 11904: 0xCAAA,\n\t22338 - 11904: 0xFB64,\n\t22339 - 11904: 0xFB76,\n\t22341 - 11904: 0xCAAB,\n\t22342 - 11904: 0xFB60,\n\t22343 - 11904: 0xA7A1,\n\t22345 - 11904: 0xCAAD,\n\t22346 - 11904: 0xA77B,\n\t22347 - 11904: 0xCAAE,\n\t22348 - 11904: 0xCAAC,\n\t22349 - 11904: 0xA77E,\n\t22350 - 11904: 0xA7A2,\n\t22351 - 11904: 0xA7A5,\n\t22352 - 11904: 0xA7A4,\n\t22353 - 11904: 0xA77C,\n\t22354 - 11904: 0xCAAF,\n\t22356 - 11904: 0x99E5,\n\t22359 - 11904: 0x9AC2,\n\t22363 - 11904: 0x91FB,\n\t22367 - 11904: 0xA073,\n\t22369 - 11904: 0xA959,\n\t22370 - 11904: 0xCBFE,\n\t22372 - 11904: 0xA95B,\n\t22374 - 11904: 0xA95A,\n\t22375 - 11904: 0x9F72,\n\t22376 - 11904: 0xCC40,\n\t22377 - 11904: 0xA958,\n\t22378 - 11904: 0xA957,\n\t22379 - 11904: 0xCBF5,\n\t22381 - 11904: 0xCBF4,\n\t22383 - 11904: 0xCBF2,\n\t22384 - 11904: 0xCBF7,\n\t22385 - 11904: 0xCBF6,\n\t22386 - 11904: 0xCBF3,\n\t22387 - 11904: 0xCBFC,\n\t22388 - 11904: 0xCBFD,\n\t22389 - 11904: 0xCBFA,\n\t22390 - 11904: 0xCBF8,\n\t22391 - 11904: 0xA956,\n\t22394 - 11904: 0x9FCC,\n\t22395 - 11904: 0xCBFB,\n\t22396 - 11904: 0xA95C,\n\t22397 - 11904: 0xCC41,\n\t22398 - 11904: 0x98A5,\n\t22399 - 11904: 0x92E8,\n\t22400 - 11904: 0xCBF9,\n\t22402 - 11904: 0xABAB,\n\t22403 - 11904: 0xA955,\n\t22408 - 11904: 0x9BBC,\n\t22410 - 11904: 0x96F3,\n\t22411 - 11904: 0xABAC,\n\t22412 - 11904: 0xCE54,\n\t22413 - 11904: 0x92E7,\n\t22415 - 11904: 0xCE5A,\n\t22416 - 11904: 0xFC67,\n\t22419 - 11904: 0xABB2,\n\t22420 - 11904: 0xCE58,\n\t22421 - 11904: 0xCE5E,\n\t22423 - 11904: 0xCE55,\n\t22424 - 11904: 0xCE59,\n\t22425 - 11904: 0xCE5B,\n\t22426 - 11904: 0xCE5D,\n\t22427 - 11904: 0xCE57,\n\t22428 - 11904: 0x8B7D,\n\t22429 - 11904: 0xCE56,\n\t22430 - 11904: 0xCE51,\n\t22431 - 11904: 0xCE52,\n\t22432 - 11904: 0xABAD,\n\t22433 - 11904: 0x9BF4,\n\t22434 - 11904: 0xABAF,\n\t22435 - 11904: 0xABAE,\n\t22436 - 11904: 0xCE53,\n\t22437 - 11904: 0xCE5C,\n\t22439 - 11904: 0x9EF7,\n\t22442 - 11904: 0x9EC1,\n\t22446 - 11904: 0xABB1,\n\t22451 - 11904: 0x87C3,\n\t22452 - 11904: 0x996F,\n\t22453 - 11904: 0xCE50,\n\t22454 - 11904: 0xD153,\n\t22456 - 11904: 0xD152,\n\t22457 - 11904: 0xD157,\n\t22458 - 11904: 0xD14E,\n\t22459 - 11904: 0x96F1,\n\t22460 - 11904: 0xD151,\n\t22461 - 11904: 0xD150,\n\t22462 - 11904: 0x8E41,\n\t22463 - 11904: 0xD154,\n\t22465 - 11904: 0xD158,\n\t22466 - 11904: 0xAE47,\n\t22467 - 11904: 0xAE4A,\n\t22468 - 11904: 0x954A,\n\t22470 - 11904: 0xD14F,\n\t22471 - 11904: 0xD155,\n\t22472 - 11904: 0x97E6,\n\t22475 - 11904: 0xAE49,\n\t22476 - 11904: 0xD14A,\n\t22478 - 11904: 0xABB0,\n\t22479 - 11904: 0xD4BA,\n\t22480 - 11904: 0xD156,\n\t22482 - 11904: 0xD14D,\n\t22484 - 11904: 0xAE48,\n\t22485 - 11904: 0xD14C,\n\t22487 - 11904: 0x96F5,\n\t22492 - 11904: 0xD4B1,\n\t22493 - 11904: 0x92E6,\n\t22494 - 11904: 0x9F42,\n\t22495 - 11904: 0xB0EC,\n\t22496 - 11904: 0xB0F0,\n\t22497 - 11904: 0xD4C1,\n\t22498 - 11904: 0xD4AF,\n\t22499 - 11904: 0xD4BD,\n\t22500 - 11904: 0xB0F1,\n\t22501 - 11904: 0xD4BF,\n\t22502 - 11904: 0xFB67,\n\t22503 - 11904: 0xD4C5,\n\t22505 - 11904: 0xD4C9,\n\t22508 - 11904: 0xD4C0,\n\t22509 - 11904: 0xD4B4,\n\t22510 - 11904: 0xD4BC,\n\t22511 - 11904: 0x99A9,\n\t22512 - 11904: 0xD4CA,\n\t22513 - 11904: 0xD4C8,\n\t22514 - 11904: 0xD4BE,\n\t22515 - 11904: 0xD4B9,\n\t22516 - 11904: 0xD4B2,\n\t22517 - 11904: 0xD8A6,\n\t22518 - 11904: 0xD4B0,\n\t22519 - 11904: 0xB0F5,\n\t22520 - 11904: 0xD4B7,\n\t22521 - 11904: 0xB0F6,\n\t22522 - 11904: 0xB0F2,\n\t22523 - 11904: 0xD4AD,\n\t22524 - 11904: 0xD4C3,\n\t22525 - 11904: 0xD4B5,\n\t22526 - 11904: 0xFAE6,\n\t22528 - 11904: 0xD4B3,\n\t22529 - 11904: 0xD4C6,\n\t22530 - 11904: 0xB0F3,\n\t22531 - 11904: 0xFB69,\n\t22532 - 11904: 0xD4CC,\n\t22533 - 11904: 0xB0ED,\n\t22534 - 11904: 0xB0EF,\n\t22535 - 11904: 0xD4BB,\n\t22536 - 11904: 0xD4B6,\n\t22537 - 11904: 0xAE4B,\n\t22538 - 11904: 0xB0EE,\n\t22539 - 11904: 0xD4B8,\n\t22540 - 11904: 0xD4C7,\n\t22541 - 11904: 0xD4CB,\n\t22542 - 11904: 0xD4C2,\n\t22544 - 11904: 0xD4C4,\n\t22546 - 11904: 0x97E5,\n\t22548 - 11904: 0xD4AE,\n\t22552 - 11904: 0x87C8,\n\t22553 - 11904: 0xD8A1,\n\t22555 - 11904: 0xD8AA,\n\t22556 - 11904: 0xD8A9,\n\t22557 - 11904: 0xB3FA,\n\t22558 - 11904: 0xD8A2,\n\t22560 - 11904: 0xB3FB,\n\t22561 - 11904: 0xB3F9,\n\t22562 - 11904: 0x967D,\n\t22563 - 11904: 0xD8A4,\n\t22564 - 11904: 0xB3F6,\n\t22565 - 11904: 0xD8A8,\n\t22566 - 11904: 0xFB6C,\n\t22567 - 11904: 0xD8A3,\n\t22568 - 11904: 0xD8A5,\n\t22569 - 11904: 0xD87D,\n\t22570 - 11904: 0xB3F4,\n\t22572 - 11904: 0xD8B2,\n\t22573 - 11904: 0xD8B1,\n\t22574 - 11904: 0xD8AE,\n\t22575 - 11904: 0xB3F3,\n\t22576 - 11904: 0xB3F7,\n\t22577 - 11904: 0xB3F8,\n\t22578 - 11904: 0xD14B,\n\t22579 - 11904: 0xD8AB,\n\t22580 - 11904: 0xB3F5,\n\t22581 - 11904: 0xB0F4,\n\t22582 - 11904: 0xD8AD,\n\t22583 - 11904: 0xD87E,\n\t22584 - 11904: 0xD8B0,\n\t22585 - 11904: 0xD8AF,\n\t22586 - 11904: 0x99A2,\n\t22587 - 11904: 0xD8B3,\n\t22589 - 11904: 0xDCEF,\n\t22591 - 11904: 0xD8AC,\n\t22592 - 11904: 0x9ABB,\n\t22596 - 11904: 0x9A65,\n\t22599 - 11904: 0x944E,\n\t22600 - 11904: 0xD8A7,\n\t22601 - 11904: 0xDCE7,\n\t22602 - 11904: 0xB6F4,\n\t22603 - 11904: 0xB6F7,\n\t22604 - 11904: 0xB6F2,\n\t22605 - 11904: 0xDCE6,\n\t22606 - 11904: 0xDCEA,\n\t22607 - 11904: 0xDCE5,\n\t22609 - 11904: 0xB6EC,\n\t22610 - 11904: 0xB6F6,\n\t22611 - 11904: 0xDCE2,\n\t22612 - 11904: 0xB6F0,\n\t22613 - 11904: 0xDCE9,\n\t22615 - 11904: 0xB6EE,\n\t22616 - 11904: 0xB6ED,\n\t22617 - 11904: 0xDCEC,\n\t22618 - 11904: 0xB6EF,\n\t22619 - 11904: 0xDCEE,\n\t22620 - 11904: 0xFB6E,\n\t22621 - 11904: 0xDCEB,\n\t22622 - 11904: 0xB6EB,\n\t22623 - 11904: 0x99DF,\n\t22626 - 11904: 0xB6F5,\n\t22627 - 11904: 0xDCF0,\n\t22628 - 11904: 0xDCE4,\n\t22629 - 11904: 0xDCED,\n\t22632 - 11904: 0xDCE3,\n\t22633 - 11904: 0x98E3,\n\t22635 - 11904: 0xB6F1,\n\t22636 - 11904: 0x9254,\n\t22637 - 11904: 0xB6F3,\n\t22639 - 11904: 0xDCE8,\n\t22641 - 11904: 0xDCF1,\n\t22642 - 11904: 0x967B,\n\t22643 - 11904: 0x8AAF,\n\t22644 - 11904: 0xE15D,\n\t22645 - 11904: 0xB9D0,\n\t22646 - 11904: 0xE163,\n\t22649 - 11904: 0xB9D5,\n\t22650 - 11904: 0xE15F,\n\t22651 - 11904: 0xE166,\n\t22652 - 11904: 0xE157,\n\t22653 - 11904: 0xB9D7,\n\t22654 - 11904: 0xB9D1,\n\t22655 - 11904: 0xE15C,\n\t22656 - 11904: 0xBC55,\n\t22657 - 11904: 0xE15B,\n\t22658 - 11904: 0xE164,\n\t22659 - 11904: 0xB9D2,\n\t22661 - 11904: 0xB9D6,\n\t22662 - 11904: 0xE15A,\n\t22663 - 11904: 0xE160,\n\t22664 - 11904: 0xE165,\n\t22665 - 11904: 0xE156,\n\t22666 - 11904: 0xB9D4,\n\t22667 - 11904: 0xE15E,\n\t22670 - 11904: 0xE162,\n\t22671 - 11904: 0xE168,\n\t22672 - 11904: 0xE158,\n\t22673 - 11904: 0xE161,\n\t22674 - 11904: 0x8C77,\n\t22675 - 11904: 0xB9D3,\n\t22676 - 11904: 0xE167,\n\t22678 - 11904: 0x87B0,\n\t22680 - 11904: 0xE159,\n\t22681 - 11904: 0x8BAF,\n\t22682 - 11904: 0x9EBD,\n\t22684 - 11904: 0xBC59,\n\t22685 - 11904: 0xE54B,\n\t22686 - 11904: 0xBC57,\n\t22687 - 11904: 0xBC56,\n\t22688 - 11904: 0xE54D,\n\t22689 - 11904: 0xE552,\n\t22691 - 11904: 0xE54E,\n\t22693 - 11904: 0xE551,\n\t22694 - 11904: 0xBC5C,\n\t22695 - 11904: 0x9EE6,\n\t22696 - 11904: 0xBEA5,\n\t22697 - 11904: 0xBC5B,\n\t22698 - 11904: 0xFB6F,\n\t22699 - 11904: 0xE54A,\n\t22700 - 11904: 0xE550,\n\t22702 - 11904: 0xBC5A,\n\t22703 - 11904: 0xE54F,\n\t22704 - 11904: 0x8EE1,\n\t22705 - 11904: 0xE54C,\n\t22707 - 11904: 0xBC58,\n\t22709 - 11904: 0x9B7D,\n\t22710 - 11904: 0x9C7E,\n\t22714 - 11904: 0xE94D,\n\t22715 - 11904: 0xF9D9,\n\t22716 - 11904: 0xE94F,\n\t22717 - 11904: 0xE94A,\n\t22718 - 11904: 0xBEC1,\n\t22719 - 11904: 0xE94C,\n\t22721 - 11904: 0xBEC0,\n\t22722 - 11904: 0xE94E,\n\t22725 - 11904: 0xBEC3,\n\t22726 - 11904: 0xE950,\n\t22727 - 11904: 0xBEC2,\n\t22728 - 11904: 0xE949,\n\t22729 - 11904: 0xE94B,\n\t22731 - 11904: 0x92EA,\n\t22734 - 11904: 0xC0A5,\n\t22735 - 11904: 0xECCC,\n\t22736 - 11904: 0x8C78,\n\t22737 - 11904: 0xC0A4,\n\t22738 - 11904: 0xECCD,\n\t22739 - 11904: 0xC0A3,\n\t22740 - 11904: 0xECCB,\n\t22741 - 11904: 0xC0A2,\n\t22742 - 11904: 0xECCA,\n\t22744 - 11904: 0xC253,\n\t22745 - 11904: 0xC252,\n\t22746 - 11904: 0xF1F6,\n\t22747 - 11904: 0xF1F8,\n\t22748 - 11904: 0xFB72,\n\t22749 - 11904: 0xF1F7,\n\t22750 - 11904: 0xC361,\n\t22751 - 11904: 0xC362,\n\t22752 - 11904: 0xFB71,\n\t22754 - 11904: 0xC363,\n\t22755 - 11904: 0xF442,\n\t22756 - 11904: 0xC45B,\n\t22759 - 11904: 0xF7D3,\n\t22760 - 11904: 0xF7D2,\n\t22761 - 11904: 0xC5F2,\n\t22763 - 11904: 0xA468,\n\t22764 - 11904: 0xA4D0,\n\t22767 - 11904: 0xA7A7,\n\t22768 - 11904: 0x895C,\n\t22770 - 11904: 0x98F0,\n\t22771 - 11904: 0x96F2,\n\t22772 - 11904: 0xCE5F,\n\t22777 - 11904: 0xB3FC,\n\t22778 - 11904: 0xB3FD,\n\t22779 - 11904: 0xFB74,\n\t22780 - 11904: 0xDCF2,\n\t22781 - 11904: 0xB9D8,\n\t22782 - 11904: 0xE169,\n\t22783 - 11904: 0xE553,\n\t22786 - 11904: 0x8BC1,\n\t22787 - 11904: 0xC95A,\n\t22788 - 11904: 0x895D,\n\t22789 - 11904: 0x89DE,\n\t22790 - 11904: 0xCAB0,\n\t22791 - 11904: 0x895E,\n\t22794 - 11904: 0xC6CA,\n\t22796 - 11904: 0xCC42,\n\t22797 - 11904: 0xCE60,\n\t22798 - 11904: 0xD159,\n\t22799 - 11904: 0xAE4C,\n\t22801 - 11904: 0xFE42,\n\t22802 - 11904: 0xF1F9,\n\t22804 - 11904: 0xC4DC,\n\t22805 - 11904: 0xA469,\n\t22806 - 11904: 0xA57E,\n\t22807 - 11904: 0xC970,\n\t22809 - 11904: 0xA667,\n\t22810 - 11904: 0xA668,\n\t22812 - 11904: 0xA95D,\n\t22813 - 11904: 0x8768,\n\t22815 - 11904: 0xFB7B,\n\t22816 - 11904: 0xB0F7,\n\t22818 - 11904: 0xB9DA,\n\t22820 - 11904: 0xB9DB,\n\t22821 - 11904: 0xB9D9,\n\t22823 - 11904: 0xA46A,\n\t22825 - 11904: 0xA4D1,\n\t22826 - 11904: 0xA4D3,\n\t22827 - 11904: 0xA4D2,\n\t22828 - 11904: 0xC95B,\n\t22829 - 11904: 0xA4D4,\n\t22830 - 11904: 0xA5A1,\n\t22831 - 11904: 0xC971,\n\t22833 - 11904: 0xA5A2,\n\t22834 - 11904: 0x895F,\n\t22836 - 11904: 0x8960,\n\t22839 - 11904: 0xA669,\n\t22840 - 11904: 0xA66A,\n\t22844 - 11904: 0xC9CB,\n\t22846 - 11904: 0xA7A8,\n\t22848 - 11904: 0xCAB1,\n\t22852 - 11904: 0xA961,\n\t22853 - 11904: 0xCC43,\n\t22855 - 11904: 0xA95F,\n\t22856 - 11904: 0xA960,\n\t22857 - 11904: 0xA95E,\n\t22858 - 11904: 0xD15A,\n\t22862 - 11904: 0xABB6,\n\t22863 - 11904: 0xABB5,\n\t22864 - 11904: 0xABB7,\n\t22865 - 11904: 0xABB4,\n\t22867 - 11904: 0xCE61,\n\t22868 - 11904: 0xA962,\n\t22869 - 11904: 0xABB3,\n\t22871 - 11904: 0xAE4D,\n\t22872 - 11904: 0xAE4E,\n\t22874 - 11904: 0xAE4F,\n\t22876 - 11904: 0xD4CD,\n\t22880 - 11904: 0xB3FE,\n\t22881 - 11904: 0xD8B4,\n\t22882 - 11904: 0xB0F8,\n\t22885 - 11904: 0x9BCD,\n\t22887 - 11904: 0xB6F8,\n\t22889 - 11904: 0xB9DD,\n\t22890 - 11904: 0xB9DC,\n\t22891 - 11904: 0xE16A,\n\t22893 - 11904: 0xBC5D,\n\t22894 - 11904: 0xBEC4,\n\t22896 - 11904: 0xEFC0,\n\t22897 - 11904: 0xF6DA,\n\t22898 - 11904: 0xF7D4,\n\t22899 - 11904: 0xA46B,\n\t22900 - 11904: 0xA5A3,\n\t22901 - 11904: 0x9DD3,\n\t22902 - 11904: 0xA5A4,\n\t22903 - 11904: 0xC9D1,\n\t22904 - 11904: 0xA66C,\n\t22905 - 11904: 0xA66F,\n\t22907 - 11904: 0xC9CF,\n\t22908 - 11904: 0xC9CD,\n\t22909 - 11904: 0xA66E,\n\t22910 - 11904: 0xC9D0,\n\t22911 - 11904: 0xC9D2,\n\t22912 - 11904: 0xC9CC,\n\t22913 - 11904: 0xA671,\n\t22914 - 11904: 0xA670,\n\t22915 - 11904: 0xA66D,\n\t22916 - 11904: 0xA66B,\n\t22917 - 11904: 0xC9CE,\n\t22921 - 11904: 0x984C,\n\t22922 - 11904: 0xA7B3,\n\t22925 - 11904: 0xA7B0,\n\t22926 - 11904: 0xCAB6,\n\t22927 - 11904: 0xCAB9,\n\t22928 - 11904: 0xCAB8,\n\t22930 - 11904: 0xA7AA,\n\t22931 - 11904: 0xA7B2,\n\t22932 - 11904: 0x9752,\n\t22934 - 11904: 0xA7AF,\n\t22935 - 11904: 0xCAB5,\n\t22936 - 11904: 0xCAB3,\n\t22937 - 11904: 0xA7AE,\n\t22938 - 11904: 0x95C3,\n\t22941 - 11904: 0xA7A9,\n\t22942 - 11904: 0xA7AC,\n\t22943 - 11904: 0x9BB6,\n\t22944 - 11904: 0xCAB4,\n\t22945 - 11904: 0xCABB,\n\t22946 - 11904: 0xCAB7,\n\t22947 - 11904: 0xA7AD,\n\t22948 - 11904: 0xA7B1,\n\t22949 - 11904: 0xA7B4,\n\t22950 - 11904: 0xCAB2,\n\t22951 - 11904: 0xCABA,\n\t22952 - 11904: 0xA7AB,\n\t22956 - 11904: 0x9AB9,\n\t22958 - 11904: 0xA967,\n\t22959 - 11904: 0xA96F,\n\t22960 - 11904: 0x97B3,\n\t22961 - 11904: 0xCC4F,\n\t22962 - 11904: 0xCC48,\n\t22963 - 11904: 0xA970,\n\t22964 - 11904: 0xCC53,\n\t22965 - 11904: 0xCC44,\n\t22966 - 11904: 0xCC4B,\n\t22967 - 11904: 0x9F74,\n\t22968 - 11904: 0x92F1,\n\t22969 - 11904: 0xA966,\n\t22970 - 11904: 0xCC45,\n\t22971 - 11904: 0xA964,\n\t22972 - 11904: 0xCC4C,\n\t22973 - 11904: 0xCC50,\n\t22974 - 11904: 0xA963,\n\t22975 - 11904: 0x8CFA,\n\t22976 - 11904: 0xCC51,\n\t22977 - 11904: 0xCC4A,\n\t22979 - 11904: 0xCC4D,\n\t22980 - 11904: 0x97DF,\n\t22981 - 11904: 0xA972,\n\t22982 - 11904: 0xA969,\n\t22983 - 11904: 0xCC54,\n\t22984 - 11904: 0xCC52,\n\t22985 - 11904: 0xFBA6,\n\t22986 - 11904: 0xA96E,\n\t22987 - 11904: 0xA96C,\n\t22988 - 11904: 0xCC49,\n\t22989 - 11904: 0xA96B,\n\t22990 - 11904: 0xCC47,\n\t22991 - 11904: 0xCC46,\n\t22992 - 11904: 0xA96A,\n\t22993 - 11904: 0xA968,\n\t22994 - 11904: 0xA971,\n\t22995 - 11904: 0xA96D,\n\t22996 - 11904: 0xA965,\n\t22998 - 11904: 0xCC4E,\n\t23000 - 11904: 0xABB9,\n\t23001 - 11904: 0xFBAB,\n\t23002 - 11904: 0xABC0,\n\t23003 - 11904: 0xCE6F,\n\t23004 - 11904: 0xABB8,\n\t23005 - 11904: 0xCE67,\n\t23006 - 11904: 0xCE63,\n\t23008 - 11904: 0xCE73,\n\t23009 - 11904: 0xCE62,\n\t23011 - 11904: 0xABBB,\n\t23012 - 11904: 0xCE6C,\n\t23013 - 11904: 0xABBE,\n\t23014 - 11904: 0xABC1,\n\t23016 - 11904: 0xABBC,\n\t23017 - 11904: 0xCE70,\n\t23018 - 11904: 0xABBF,\n\t23019 - 11904: 0x9877,\n\t23020 - 11904: 0xAE56,\n\t23021 - 11904: 0xCE76,\n\t23022 - 11904: 0xCE64,\n\t23023 - 11904: 0x9854,\n\t23024 - 11904: 0x95C5,\n\t23025 - 11904: 0xCE66,\n\t23026 - 11904: 0xCE6D,\n\t23027 - 11904: 0xCE71,\n\t23028 - 11904: 0xCE75,\n\t23029 - 11904: 0xCE72,\n\t23030 - 11904: 0xCE6B,\n\t23031 - 11904: 0xCE6E,\n\t23032 - 11904: 0x9D55,\n\t23033 - 11904: 0xFBB2,\n\t23034 - 11904: 0xCE68,\n\t23035 - 11904: 0xABC3,\n\t23036 - 11904: 0xCE6A,\n\t23037 - 11904: 0xCE69,\n\t23038 - 11904: 0xCE74,\n\t23039 - 11904: 0xABBA,\n\t23040 - 11904: 0xCE65,\n\t23041 - 11904: 0xABC2,\n\t23042 - 11904: 0x957E,\n\t23043 - 11904: 0xABBD,\n\t23049 - 11904: 0xAE5C,\n\t23050 - 11904: 0xD162,\n\t23051 - 11904: 0x9742,\n\t23052 - 11904: 0xAE5B,\n\t23053 - 11904: 0x94E6,\n\t23055 - 11904: 0xD160,\n\t23057 - 11904: 0xAE50,\n\t23058 - 11904: 0x92F5,\n\t23059 - 11904: 0xAE55,\n\t23061 - 11904: 0xD15F,\n\t23062 - 11904: 0xD15C,\n\t23063 - 11904: 0xD161,\n\t23064 - 11904: 0xAE51,\n\t23065 - 11904: 0xD15B,\n\t23066 - 11904: 0x8CC5,\n\t23067 - 11904: 0xAE54,\n\t23068 - 11904: 0xAE52,\n\t23070 - 11904: 0xD163,\n\t23071 - 11904: 0xAE53,\n\t23072 - 11904: 0xAE57,\n\t23073 - 11904: 0x92FD,\n\t23075 - 11904: 0xAE58,\n\t23076 - 11904: 0xFBA2,\n\t23077 - 11904: 0xAE5A,\n\t23079 - 11904: 0x9C51,\n\t23081 - 11904: 0xAE59,\n\t23082 - 11904: 0x94E9,\n\t23083 - 11904: 0x985C,\n\t23084 - 11904: 0x92F0,\n\t23085 - 11904: 0xD15D,\n\t23086 - 11904: 0xD15E,\n\t23091 - 11904: 0xD164,\n\t23093 - 11904: 0xD4D4,\n\t23094 - 11904: 0xB0F9,\n\t23095 - 11904: 0xD8C2,\n\t23096 - 11904: 0xD4D3,\n\t23097 - 11904: 0xD4E6,\n\t23100 - 11904: 0xB140,\n\t23101 - 11904: 0x944C,\n\t23102 - 11904: 0xD4E4,\n\t23104 - 11904: 0xB0FE,\n\t23105 - 11904: 0xB0FA,\n\t23106 - 11904: 0xD4ED,\n\t23107 - 11904: 0xD4DD,\n\t23108 - 11904: 0xD4E0,\n\t23109 - 11904: 0x916B,\n\t23110 - 11904: 0xB143,\n\t23111 - 11904: 0xD4EA,\n\t23112 - 11904: 0xD4E2,\n\t23113 - 11904: 0xB0FB,\n\t23114 - 11904: 0xB144,\n\t23116 - 11904: 0xD4E7,\n\t23117 - 11904: 0xD4E5,\n\t23120 - 11904: 0xD4D6,\n\t23121 - 11904: 0xD4EB,\n\t23122 - 11904: 0xD4DF,\n\t23123 - 11904: 0xD4DA,\n\t23124 - 11904: 0x8B78,\n\t23125 - 11904: 0xD4D0,\n\t23126 - 11904: 0xD4EC,\n\t23127 - 11904: 0xD4DC,\n\t23128 - 11904: 0xD4CF,\n\t23129 - 11904: 0x94E2,\n\t23130 - 11904: 0xB142,\n\t23131 - 11904: 0xD4E1,\n\t23132 - 11904: 0xD4EE,\n\t23133 - 11904: 0xD4DE,\n\t23134 - 11904: 0xD4D2,\n\t23135 - 11904: 0xD4D7,\n\t23136 - 11904: 0xD4CE,\n\t23137 - 11904: 0x984F,\n\t23138 - 11904: 0xB141,\n\t23139 - 11904: 0xFBB5,\n\t23140 - 11904: 0xD4DB,\n\t23141 - 11904: 0xD4D8,\n\t23142 - 11904: 0xB0FC,\n\t23143 - 11904: 0xD4D1,\n\t23144 - 11904: 0x9271,\n\t23145 - 11904: 0xD4E9,\n\t23146 - 11904: 0xB0FD,\n\t23147 - 11904: 0x9365,\n\t23148 - 11904: 0xD4D9,\n\t23149 - 11904: 0xD4D5,\n\t23150 - 11904: 0x985B,\n\t23152 - 11904: 0xD4E8,\n\t23153 - 11904: 0x9850,\n\t23159 - 11904: 0xFBB8,\n\t23160 - 11904: 0xD8BB,\n\t23161 - 11904: 0x97BC,\n\t23162 - 11904: 0xD8B8,\n\t23163 - 11904: 0xD8C9,\n\t23164 - 11904: 0xD8BD,\n\t23165 - 11904: 0xD8CA,\n\t23166 - 11904: 0x92F3,\n\t23167 - 11904: 0xB442,\n\t23169 - 11904: 0x9340,\n\t23170 - 11904: 0x984D,\n\t23171 - 11904: 0xD8C6,\n\t23172 - 11904: 0xD8C3,\n\t23174 - 11904: 0x9572,\n\t23176 - 11904: 0xFDEF,\n\t23178 - 11904: 0xD8C4,\n\t23179 - 11904: 0xD8C7,\n\t23180 - 11904: 0xD8CB,\n\t23182 - 11904: 0xD4E3,\n\t23183 - 11904: 0xD8CD,\n\t23184 - 11904: 0xDD47,\n\t23185 - 11904: 0xFDC1,\n\t23186 - 11904: 0xB443,\n\t23187 - 11904: 0xD8CE,\n\t23188 - 11904: 0xD8B6,\n\t23189 - 11904: 0xD8C0,\n\t23190 - 11904: 0xFBBA,\n\t23191 - 11904: 0xD8C5,\n\t23193 - 11904: 0x92EB,\n\t23194 - 11904: 0xB441,\n\t23195 - 11904: 0xB444,\n\t23196 - 11904: 0xD8CC,\n\t23197 - 11904: 0xD8CF,\n\t23198 - 11904: 0xD8BA,\n\t23199 - 11904: 0xD8B7,\n\t23200 - 11904: 0xFC73,\n\t23201 - 11904: 0x97B7,\n\t23202 - 11904: 0xD8B9,\n\t23204 - 11904: 0x876F,\n\t23205 - 11904: 0xD8BE,\n\t23206 - 11904: 0xD8BC,\n\t23207 - 11904: 0xB445,\n\t23209 - 11904: 0xD8C8,\n\t23211 - 11904: 0xFBB4,\n\t23212 - 11904: 0xD8BF,\n\t23214 - 11904: 0xD8C1,\n\t23215 - 11904: 0xD8B5,\n\t23216 - 11904: 0xDCFA,\n\t23217 - 11904: 0xDCF8,\n\t23218 - 11904: 0xB742,\n\t23219 - 11904: 0xB740,\n\t23220 - 11904: 0xDD43,\n\t23221 - 11904: 0xDCF9,\n\t23222 - 11904: 0xDD44,\n\t23223 - 11904: 0xDD40,\n\t23224 - 11904: 0xDCF7,\n\t23225 - 11904: 0xDD46,\n\t23226 - 11904: 0xDCF6,\n\t23227 - 11904: 0xDCFD,\n\t23228 - 11904: 0xB6FE,\n\t23229 - 11904: 0xB6FD,\n\t23230 - 11904: 0xB6FC,\n\t23231 - 11904: 0xDCFB,\n\t23232 - 11904: 0xDD41,\n\t23233 - 11904: 0xB6F9,\n\t23234 - 11904: 0xB741,\n\t23235 - 11904: 0x90A7,\n\t23236 - 11904: 0xDCF4,\n\t23238 - 11904: 0xDCFE,\n\t23239 - 11904: 0xDCF3,\n\t23240 - 11904: 0xDCFC,\n\t23241 - 11904: 0xB6FA,\n\t23242 - 11904: 0xDD42,\n\t23243 - 11904: 0xDCF5,\n\t23244 - 11904: 0xB6FB,\n\t23245 - 11904: 0xDD45,\n\t23246 - 11904: 0x9741,\n\t23247 - 11904: 0x92F4,\n\t23249 - 11904: 0x8772,\n\t23251 - 11904: 0xFBBC,\n\t23253 - 11904: 0xE16E,\n\t23254 - 11904: 0xB9E2,\n\t23255 - 11904: 0xB9E1,\n\t23256 - 11904: 0xB9E3,\n\t23257 - 11904: 0xE17A,\n\t23258 - 11904: 0xE170,\n\t23259 - 11904: 0xE176,\n\t23260 - 11904: 0xE16B,\n\t23261 - 11904: 0xE179,\n\t23262 - 11904: 0xE178,\n\t23263 - 11904: 0xE17C,\n\t23264 - 11904: 0xE175,\n\t23265 - 11904: 0xB9DE,\n\t23266 - 11904: 0xE174,\n\t23267 - 11904: 0xB9E4,\n\t23268 - 11904: 0x9577,\n\t23269 - 11904: 0xE16D,\n\t23270 - 11904: 0xB9DF,\n\t23272 - 11904: 0xE17B,\n\t23273 - 11904: 0xB9E0,\n\t23274 - 11904: 0xE16F,\n\t23275 - 11904: 0xE172,\n\t23276 - 11904: 0xE177,\n\t23277 - 11904: 0xE171,\n\t23278 - 11904: 0xE16C,\n\t23280 - 11904: 0x9EE2,\n\t23282 - 11904: 0x8F78,\n\t23283 - 11904: 0xE173,\n\t23284 - 11904: 0xE555,\n\t23285 - 11904: 0xBC61,\n\t23286 - 11904: 0xE558,\n\t23287 - 11904: 0xE557,\n\t23288 - 11904: 0xE55A,\n\t23289 - 11904: 0xE55C,\n\t23290 - 11904: 0xF9DC,\n\t23291 - 11904: 0xBC5F,\n\t23293 - 11904: 0xE556,\n\t23294 - 11904: 0x9672,\n\t23295 - 11904: 0xE554,\n\t23297 - 11904: 0xE55D,\n\t23298 - 11904: 0xE55B,\n\t23299 - 11904: 0xE559,\n\t23301 - 11904: 0xE55F,\n\t23303 - 11904: 0xE55E,\n\t23304 - 11904: 0xBC63,\n\t23305 - 11904: 0xBC5E,\n\t23307 - 11904: 0xBC60,\n\t23308 - 11904: 0xBC62,\n\t23309 - 11904: 0x9EB5,\n\t23311 - 11904: 0xE560,\n\t23312 - 11904: 0xE957,\n\t23313 - 11904: 0x964B,\n\t23315 - 11904: 0xE956,\n\t23316 - 11904: 0xE955,\n\t23317 - 11904: 0x8CAC,\n\t23318 - 11904: 0xE958,\n\t23319 - 11904: 0xE951,\n\t23321 - 11904: 0xE952,\n\t23322 - 11904: 0xE95A,\n\t23323 - 11904: 0xE953,\n\t23325 - 11904: 0xBEC5,\n\t23326 - 11904: 0xE95C,\n\t23327 - 11904: 0xA0FA,\n\t23328 - 11904: 0xE95B,\n\t23329 - 11904: 0xE954,\n\t23331 - 11904: 0xECD1,\n\t23332 - 11904: 0xC0A8,\n\t23333 - 11904: 0xECCF,\n\t23334 - 11904: 0xECD4,\n\t23335 - 11904: 0xECD3,\n\t23336 - 11904: 0xE959,\n\t23338 - 11904: 0xC0A7,\n\t23339 - 11904: 0x9575,\n\t23340 - 11904: 0xECD2,\n\t23341 - 11904: 0xECCE,\n\t23342 - 11904: 0xECD6,\n\t23343 - 11904: 0xECD5,\n\t23344 - 11904: 0xC0A6,\n\t23346 - 11904: 0xECD0,\n\t23348 - 11904: 0xBEC6,\n\t23352 - 11904: 0xC254,\n\t23356 - 11904: 0xEFC1,\n\t23357 - 11904: 0xF1FA,\n\t23358 - 11904: 0xF1FB,\n\t23359 - 11904: 0xF1FC,\n\t23360 - 11904: 0xC45C,\n\t23361 - 11904: 0x90DA,\n\t23363 - 11904: 0xC45D,\n\t23364 - 11904: 0x9367,\n\t23365 - 11904: 0xF443,\n\t23366 - 11904: 0xFEA4,\n\t23367 - 11904: 0xF5C8,\n\t23368 - 11904: 0xF5C7,\n\t23370 - 11904: 0x90DF,\n\t23371 - 11904: 0xF6DB,\n\t23372 - 11904: 0xF6DC,\n\t23373 - 11904: 0xF7D5,\n\t23374 - 11904: 0xF8A7,\n\t23375 - 11904: 0x9354,\n\t23376 - 11904: 0xA46C,\n\t23377 - 11904: 0xA46D,\n\t23379 - 11904: 0xA46E,\n\t23380 - 11904: 0xA4D5,\n\t23381 - 11904: 0xA5A5,\n\t23382 - 11904: 0xC9D3,\n\t23383 - 11904: 0xA672,\n\t23384 - 11904: 0xA673,\n\t23386 - 11904: 0xA7B7,\n\t23387 - 11904: 0xA7B8,\n\t23388 - 11904: 0xA7B6,\n\t23389 - 11904: 0xA7B5,\n\t23391 - 11904: 0xA973,\n\t23394 - 11904: 0xCC55,\n\t23395 - 11904: 0xA975,\n\t23396 - 11904: 0xA974,\n\t23397 - 11904: 0xCC56,\n\t23398 - 11904: 0x8961,\n\t23400 - 11904: 0x8BB4,\n\t23401 - 11904: 0xABC4,\n\t23403 - 11904: 0xAE5D,\n\t23404 - 11904: 0xD165,\n\t23405 - 11904: 0x9DC0,\n\t23406 - 11904: 0xD4F0,\n\t23408 - 11904: 0xB145,\n\t23409 - 11904: 0xB447,\n\t23410 - 11904: 0xD4EF,\n\t23411 - 11904: 0xB446,\n\t23412 - 11904: 0x8E48,\n\t23413 - 11904: 0xB9E5,\n\t23414 - 11904: 0xFBC5,\n\t23415 - 11904: 0xE17D,\n\t23416 - 11904: 0xBEC7,\n\t23418 - 11904: 0xC0A9,\n\t23419 - 11904: 0xECD7,\n\t23420 - 11904: 0xFBC7,\n\t23421 - 11904: 0xC45E,\n\t23423 - 11904: 0xC570,\n\t23424 - 11904: 0xC6CB,\n\t23425 - 11904: 0xC972,\n\t23426 - 11904: 0xFA79,\n\t23427 - 11904: 0xA5A6,\n\t23428 - 11904: 0xC973,\n\t23429 - 11904: 0xA676,\n\t23431 - 11904: 0xA674,\n\t23432 - 11904: 0xA675,\n\t23433 - 11904: 0xA677,\n\t23435 - 11904: 0xA7BA,\n\t23436 - 11904: 0xA7B9,\n\t23438 - 11904: 0xCABC,\n\t23439 - 11904: 0xA7BB,\n\t23440 - 11904: 0x9E67,\n\t23442 - 11904: 0xCABD,\n\t23443 - 11904: 0xCC57,\n\t23445 - 11904: 0xCC58,\n\t23446 - 11904: 0x8CD9,\n\t23447 - 11904: 0xA976,\n\t23448 - 11904: 0xA978,\n\t23449 - 11904: 0xA97A,\n\t23450 - 11904: 0xA977,\n\t23451 - 11904: 0xA97B,\n\t23452 - 11904: 0xA979,\n\t23453 - 11904: 0xFBD2,\n\t23454 - 11904: 0x8962,\n\t23455 - 11904: 0x8963,\n\t23458 - 11904: 0xABC8,\n\t23459 - 11904: 0xABC5,\n\t23460 - 11904: 0xABC7,\n\t23461 - 11904: 0xABC9,\n\t23462 - 11904: 0xABC6,\n\t23463 - 11904: 0xD166,\n\t23464 - 11904: 0xCE77,\n\t23466 - 11904: 0xFC7D,\n\t23468 - 11904: 0xD168,\n\t23469 - 11904: 0xD167,\n\t23470 - 11904: 0xAE63,\n\t23472 - 11904: 0xAE5F,\n\t23475 - 11904: 0xAE60,\n\t23476 - 11904: 0xAE62,\n\t23477 - 11904: 0xAE64,\n\t23478 - 11904: 0xAE61,\n\t23479 - 11904: 0x8773,\n\t23480 - 11904: 0xAE66,\n\t23481 - 11904: 0xAE65,\n\t23487 - 11904: 0xB14A,\n\t23488 - 11904: 0xD4F2,\n\t23489 - 11904: 0xD4F1,\n\t23490 - 11904: 0xB149,\n\t23491 - 11904: 0x9F6B,\n\t23492 - 11904: 0xB148,\n\t23493 - 11904: 0xB147,\n\t23494 - 11904: 0xB14B,\n\t23495 - 11904: 0xB146,\n\t23498 - 11904: 0xD8D5,\n\t23499 - 11904: 0xD8D2,\n\t23500 - 11904: 0xB449,\n\t23501 - 11904: 0xD8D1,\n\t23502 - 11904: 0xD8D6,\n\t23504 - 11904: 0xB44B,\n\t23505 - 11904: 0xD8D4,\n\t23506 - 11904: 0xB448,\n\t23507 - 11904: 0xB44A,\n\t23508 - 11904: 0xD8D3,\n\t23509 - 11904: 0xFBCC,\n\t23510 - 11904: 0xDD48,\n\t23511 - 11904: 0xFEAE,\n\t23512 - 11904: 0xDD49,\n\t23513 - 11904: 0xDD4A,\n\t23515 - 11904: 0x876D,\n\t23518 - 11904: 0xB9E6,\n\t23519 - 11904: 0xB9EE,\n\t23520 - 11904: 0xE17E,\n\t23521 - 11904: 0xB9E8,\n\t23522 - 11904: 0xB9EC,\n\t23523 - 11904: 0xE1A1,\n\t23524 - 11904: 0xB9ED,\n\t23525 - 11904: 0xB9E9,\n\t23526 - 11904: 0xB9EA,\n\t23527 - 11904: 0xB9E7,\n\t23528 - 11904: 0xB9EB,\n\t23529 - 11904: 0xBC66,\n\t23530 - 11904: 0xD8D0,\n\t23531 - 11904: 0xBC67,\n\t23532 - 11904: 0xBC65,\n\t23534 - 11904: 0xBC64,\n\t23535 - 11904: 0xE95D,\n\t23536 - 11904: 0xBEC8,\n\t23537 - 11904: 0xECD8,\n\t23538 - 11904: 0xECD9,\n\t23539 - 11904: 0xFBD1,\n\t23541 - 11904: 0xC364,\n\t23542 - 11904: 0xC45F,\n\t23544 - 11904: 0xA46F,\n\t23546 - 11904: 0xA678,\n\t23551 - 11904: 0xFB75,\n\t23553 - 11904: 0xABCA,\n\t23555 - 11904: 0xD169,\n\t23556 - 11904: 0xAE67,\n\t23557 - 11904: 0xFBD4,\n\t23559 - 11904: 0xB14E,\n\t23560 - 11904: 0xB14D,\n\t23561 - 11904: 0xB14C,\n\t23562 - 11904: 0xB44C,\n\t23563 - 11904: 0xB44D,\n\t23564 - 11904: 0xD8D7,\n\t23565 - 11904: 0xB9EF,\n\t23566 - 11904: 0xBEC9,\n\t23567 - 11904: 0xA470,\n\t23568 - 11904: 0xC95C,\n\t23569 - 11904: 0xA4D6,\n\t23570 - 11904: 0xC974,\n\t23571 - 11904: 0xFBD6,\n\t23572 - 11904: 0xFBD8,\n\t23573 - 11904: 0xC9D4,\n\t23574 - 11904: 0xA679,\n\t23578 - 11904: 0xA97C,\n\t23580 - 11904: 0x8B5D,\n\t23582 - 11904: 0x934C,\n\t23583 - 11904: 0xDD4B,\n\t23584 - 11904: 0x9AE2,\n\t23586 - 11904: 0xA471,\n\t23587 - 11904: 0x8BC9,\n\t23588 - 11904: 0xA4D7,\n\t23589 - 11904: 0xC9D5,\n\t23592 - 11904: 0xCABE,\n\t23594 - 11904: 0xCABF,\n\t23596 - 11904: 0xA7BC,\n\t23600 - 11904: 0xD8D8,\n\t23601 - 11904: 0xB44E,\n\t23603 - 11904: 0xDD4C,\n\t23607 - 11904: 0xC0AA,\n\t23608 - 11904: 0xA472,\n\t23609 - 11904: 0xA4A8,\n\t23610 - 11904: 0xA4D8,\n\t23611 - 11904: 0xC975,\n\t23612 - 11904: 0xA5A7,\n\t23614 - 11904: 0xA7C0,\n\t23615 - 11904: 0xA7BF,\n\t23616 - 11904: 0xA7BD,\n\t23617 - 11904: 0xA7BE,\n\t23620 - 11904: 0xCC59,\n\t23621 - 11904: 0xA97E,\n\t23622 - 11904: 0xA9A1,\n\t23623 - 11904: 0xCC5A,\n\t23624 - 11904: 0xA97D,\n\t23625 - 11904: 0xFBDB,\n\t23626 - 11904: 0x9FC9,\n\t23627 - 11904: 0xABCE,\n\t23628 - 11904: 0xCE78,\n\t23629 - 11904: 0xABCD,\n\t23630 - 11904: 0xABCB,\n\t23631 - 11904: 0xABCC,\n\t23632 - 11904: 0xAE6A,\n\t23633 - 11904: 0xAE68,\n\t23635 - 11904: 0x9F44,\n\t23636 - 11904: 0xD16B,\n\t23637 - 11904: 0xAE69,\n\t23638 - 11904: 0xD16A,\n\t23640 - 11904: 0xAE5E,\n\t23641 - 11904: 0xD4F3,\n\t23644 - 11904: 0xB150,\n\t23645 - 11904: 0xB151,\n\t23646 - 11904: 0x98ED,\n\t23648 - 11904: 0xB14F,\n\t23650 - 11904: 0xB9F0,\n\t23651 - 11904: 0xE1A2,\n\t23652 - 11904: 0xBC68,\n\t23653 - 11904: 0xBC69,\n\t23655 - 11904: 0xE561,\n\t23656 - 11904: 0xC0AB,\n\t23657 - 11904: 0xEFC2,\n\t23658 - 11904: 0xEFC3,\n\t23660 - 11904: 0xC4DD,\n\t23661 - 11904: 0xF8A8,\n\t23662 - 11904: 0xC94B,\n\t23663 - 11904: 0xA4D9,\n\t23665 - 11904: 0xA473,\n\t23667 - 11904: 0xC977,\n\t23668 - 11904: 0xC976,\n\t23672 - 11904: 0x8CE9,\n\t23673 - 11904: 0xA67A,\n\t23674 - 11904: 0xC9D7,\n\t23675 - 11904: 0xC9D8,\n\t23676 - 11904: 0xC9D6,\n\t23678 - 11904: 0xC9D9,\n\t23685 - 11904: 0xFBDD,\n\t23686 - 11904: 0xCAC7,\n\t23688 - 11904: 0xCAC2,\n\t23689 - 11904: 0xCAC4,\n\t23690 - 11904: 0xCAC6,\n\t23691 - 11904: 0xCAC3,\n\t23692 - 11904: 0xA7C4,\n\t23693 - 11904: 0xCAC0,\n\t23695 - 11904: 0xCAC1,\n\t23696 - 11904: 0xA7C1,\n\t23697 - 11904: 0xA7C2,\n\t23698 - 11904: 0xCAC5,\n\t23699 - 11904: 0xCAC8,\n\t23700 - 11904: 0xA7C3,\n\t23701 - 11904: 0xCAC9,\n\t23705 - 11904: 0x8DF2,\n\t23706 - 11904: 0x8964,\n\t23708 - 11904: 0xFDF2,\n\t23709 - 11904: 0xCC68,\n\t23710 - 11904: 0x934D,\n\t23711 - 11904: 0xCC62,\n\t23712 - 11904: 0xCC5D,\n\t23713 - 11904: 0xA9A3,\n\t23714 - 11904: 0xCC65,\n\t23715 - 11904: 0xCC63,\n\t23716 - 11904: 0xCC5C,\n\t23717 - 11904: 0xCC69,\n\t23718 - 11904: 0xCC6C,\n\t23719 - 11904: 0xCC67,\n\t23720 - 11904: 0xCC60,\n\t23721 - 11904: 0xA9A5,\n\t23722 - 11904: 0xCC66,\n\t23723 - 11904: 0xA9A6,\n\t23724 - 11904: 0xCC61,\n\t23725 - 11904: 0xCC64,\n\t23726 - 11904: 0xCC5B,\n\t23727 - 11904: 0xCC5F,\n\t23728 - 11904: 0xCC6B,\n\t23729 - 11904: 0xA9A7,\n\t23731 - 11904: 0xA9A8,\n\t23733 - 11904: 0xCC5E,\n\t23734 - 11904: 0xCC6A,\n\t23735 - 11904: 0xA9A2,\n\t23736 - 11904: 0xA9A4,\n\t23738 - 11904: 0xFBE7,\n\t23745 - 11904: 0xA0F2,\n\t23746 - 11904: 0x9868,\n\t23750 - 11904: 0xCEAB,\n\t23751 - 11904: 0xCEA4,\n\t23752 - 11904: 0xCEAA,\n\t23753 - 11904: 0xCEA3,\n\t23754 - 11904: 0xCEA5,\n\t23755 - 11904: 0xCE7D,\n\t23756 - 11904: 0xCE7B,\n\t23758 - 11904: 0xCEAC,\n\t23759 - 11904: 0xCEA9,\n\t23760 - 11904: 0xCE79,\n\t23761 - 11904: 0x9F58,\n\t23762 - 11904: 0xABD0,\n\t23763 - 11904: 0xCEA7,\n\t23764 - 11904: 0xCEA8,\n\t23765 - 11904: 0x8CE6,\n\t23766 - 11904: 0xCEA6,\n\t23767 - 11904: 0xCE7C,\n\t23768 - 11904: 0xCE7A,\n\t23769 - 11904: 0xABCF,\n\t23770 - 11904: 0xCEA2,\n\t23771 - 11904: 0xCE7E,\n\t23774 - 11904: 0xCEA1,\n\t23775 - 11904: 0xCEAD,\n\t23781 - 11904: 0x8D73,\n\t23784 - 11904: 0xAE6F,\n\t23785 - 11904: 0xFBDE,\n\t23786 - 11904: 0xAE6E,\n\t23788 - 11904: 0xD16C,\n\t23789 - 11904: 0xAE6B,\n\t23790 - 11904: 0xD16E,\n\t23791 - 11904: 0xFBDF,\n\t23792 - 11904: 0xAE70,\n\t23793 - 11904: 0xD16F,\n\t23796 - 11904: 0xAE73,\n\t23797 - 11904: 0x8C48,\n\t23798 - 11904: 0xAE71,\n\t23799 - 11904: 0xD170,\n\t23800 - 11904: 0xCEAE,\n\t23801 - 11904: 0xD172,\n\t23803 - 11904: 0xAE6D,\n\t23804 - 11904: 0x8774,\n\t23805 - 11904: 0xAE6C,\n\t23807 - 11904: 0xD16D,\n\t23808 - 11904: 0xD171,\n\t23809 - 11904: 0xAE72,\n\t23814 - 11904: 0xB153,\n\t23815 - 11904: 0xB152,\n\t23819 - 11904: 0xD4F5,\n\t23820 - 11904: 0xD4F9,\n\t23821 - 11904: 0xD4FB,\n\t23822 - 11904: 0xB154,\n\t23823 - 11904: 0xD4FE,\n\t23824 - 11904: 0xFBE3,\n\t23825 - 11904: 0xB158,\n\t23826 - 11904: 0xD541,\n\t23828 - 11904: 0xB15A,\n\t23829 - 11904: 0x8DA8,\n\t23830 - 11904: 0xB156,\n\t23831 - 11904: 0xB15E,\n\t23832 - 11904: 0xFBE4,\n\t23833 - 11904: 0xB15B,\n\t23834 - 11904: 0xD4F7,\n\t23835 - 11904: 0xB155,\n\t23837 - 11904: 0xD4F6,\n\t23838 - 11904: 0xD4F4,\n\t23839 - 11904: 0xD543,\n\t23840 - 11904: 0xD4F8,\n\t23842 - 11904: 0xB157,\n\t23843 - 11904: 0xD542,\n\t23844 - 11904: 0xB15C,\n\t23845 - 11904: 0xD4FD,\n\t23846 - 11904: 0xD4FC,\n\t23847 - 11904: 0xB15D,\n\t23848 - 11904: 0xD4FA,\n\t23849 - 11904: 0xB159,\n\t23852 - 11904: 0x9C75,\n\t23854 - 11904: 0xD544,\n\t23855 - 11904: 0x9878,\n\t23856 - 11904: 0xD540,\n\t23857 - 11904: 0xD8E7,\n\t23858 - 11904: 0xD8EE,\n\t23859 - 11904: 0xD8E3,\n\t23860 - 11904: 0xB451,\n\t23861 - 11904: 0xD8DF,\n\t23862 - 11904: 0xD8EF,\n\t23863 - 11904: 0xD8D9,\n\t23864 - 11904: 0xD8EC,\n\t23865 - 11904: 0xD8EA,\n\t23866 - 11904: 0xD8E4,\n\t23868 - 11904: 0xD8ED,\n\t23869 - 11904: 0xD8E6,\n\t23870 - 11904: 0x8D60,\n\t23871 - 11904: 0xD8DE,\n\t23872 - 11904: 0xD8F0,\n\t23873 - 11904: 0xD8DC,\n\t23874 - 11904: 0xD8E9,\n\t23875 - 11904: 0xD8DA,\n\t23877 - 11904: 0xD8F1,\n\t23878 - 11904: 0xFBE5,\n\t23879 - 11904: 0xB452,\n\t23880 - 11904: 0x8D61,\n\t23881 - 11904: 0xD8EB,\n\t23882 - 11904: 0xDD4F,\n\t23883 - 11904: 0xD8DD,\n\t23884 - 11904: 0xB44F,\n\t23886 - 11904: 0xD8E1,\n\t23888 - 11904: 0xB450,\n\t23889 - 11904: 0xD8E0,\n\t23890 - 11904: 0xD8E5,\n\t23893 - 11904: 0xD8E2,\n\t23894 - 11904: 0x8D62,\n\t23895 - 11904: 0xA0A1,\n\t23897 - 11904: 0xD8E8,\n\t23899 - 11904: 0x9C40,\n\t23902 - 11904: 0xDD53,\n\t23906 - 11904: 0xDD56,\n\t23907 - 11904: 0xDD4E,\n\t23909 - 11904: 0xDD50,\n\t23911 - 11904: 0xDD55,\n\t23912 - 11904: 0xDD54,\n\t23913 - 11904: 0xB743,\n\t23915 - 11904: 0xD8DB,\n\t23916 - 11904: 0xDD52,\n\t23919 - 11904: 0xB744,\n\t23920 - 11904: 0x98AD,\n\t23921 - 11904: 0xDD4D,\n\t23922 - 11904: 0xDD51,\n\t23924 - 11904: 0x9EEA,\n\t23927 - 11904: 0xE1A9,\n\t23928 - 11904: 0x8CEC,\n\t23929 - 11904: 0xE1B0,\n\t23930 - 11904: 0xE1A7,\n\t23931 - 11904: 0x8CD4,\n\t23932 - 11904: 0xE1AE,\n\t23933 - 11904: 0xE1A5,\n\t23934 - 11904: 0xE1AD,\n\t23935 - 11904: 0xE1B1,\n\t23936 - 11904: 0xE1A4,\n\t23937 - 11904: 0xE1A8,\n\t23938 - 11904: 0xE1A3,\n\t23940 - 11904: 0xB9F1,\n\t23941 - 11904: 0x9CEB,\n\t23942 - 11904: 0xE1A6,\n\t23943 - 11904: 0xB9F2,\n\t23944 - 11904: 0xE1AC,\n\t23945 - 11904: 0xE1AB,\n\t23946 - 11904: 0xE1AA,\n\t23947 - 11904: 0xFBE0,\n\t23949 - 11904: 0xE1AF,\n\t23950 - 11904: 0x9F51,\n\t23954 - 11904: 0xE565,\n\t23955 - 11904: 0xE567,\n\t23956 - 11904: 0xBC6B,\n\t23957 - 11904: 0xE568,\n\t23959 - 11904: 0xE563,\n\t23961 - 11904: 0xE562,\n\t23962 - 11904: 0xE56C,\n\t23964 - 11904: 0xE56A,\n\t23965 - 11904: 0xBC6A,\n\t23966 - 11904: 0xE56D,\n\t23967 - 11904: 0xE564,\n\t23968 - 11904: 0xE569,\n\t23969 - 11904: 0xE56B,\n\t23970 - 11904: 0xE566,\n\t23972 - 11904: 0x8D65,\n\t23975 - 11904: 0xE961,\n\t23976 - 11904: 0xE966,\n\t23977 - 11904: 0xE960,\n\t23978 - 11904: 0xE965,\n\t23979 - 11904: 0x9CF1,\n\t23980 - 11904: 0xE95E,\n\t23981 - 11904: 0xE968,\n\t23982 - 11904: 0xE964,\n\t23983 - 11904: 0xE969,\n\t23984 - 11904: 0xE963,\n\t23985 - 11904: 0xE95F,\n\t23986 - 11904: 0xE967,\n\t23988 - 11904: 0xE96A,\n\t23989 - 11904: 0xE962,\n\t23990 - 11904: 0xFC58,\n\t23991 - 11904: 0xECDA,\n\t23992 - 11904: 0xC0AF,\n\t23993 - 11904: 0x8D66,\n\t23994 - 11904: 0xC0AD,\n\t23996 - 11904: 0xC0AC,\n\t23997 - 11904: 0xC0AE,\n\t24000 - 11904: 0xEFC4,\n\t24001 - 11904: 0x9654,\n\t24002 - 11904: 0xF172,\n\t24003 - 11904: 0xF1FD,\n\t24006 - 11904: 0xF444,\n\t24007 - 11904: 0xF445,\n\t24009 - 11904: 0xC460,\n\t24011 - 11904: 0xF5C9,\n\t24013 - 11904: 0xC4DE,\n\t24015 - 11904: 0xF5CA,\n\t24017 - 11904: 0xF6DE,\n\t24018 - 11904: 0xC572,\n\t24020 - 11904: 0xC571,\n\t24021 - 11904: 0xF6DD,\n\t24022 - 11904: 0xC5C9,\n\t24023 - 11904: 0xFBE8,\n\t24024 - 11904: 0xF7D6,\n\t24027 - 11904: 0xC6CC,\n\t24029 - 11904: 0xA474,\n\t24030 - 11904: 0xA67B,\n\t24031 - 11904: 0xC9DA,\n\t24032 - 11904: 0xCACA,\n\t24033 - 11904: 0xA8B5,\n\t24034 - 11904: 0xB15F,\n\t24037 - 11904: 0xA475,\n\t24038 - 11904: 0xA5AA,\n\t24039 - 11904: 0xA5A9,\n\t24040 - 11904: 0xA5A8,\n\t24043 - 11904: 0xA7C5,\n\t24046 - 11904: 0xAE74,\n\t24048 - 11904: 0xDD57,\n\t24049 - 11904: 0xA476,\n\t24050 - 11904: 0xA477,\n\t24051 - 11904: 0xA478,\n\t24052 - 11904: 0xA4DA,\n\t24053 - 11904: 0x9FCE,\n\t24055 - 11904: 0xABD1,\n\t24057 - 11904: 0xCEAF,\n\t24061 - 11904: 0xB453,\n\t24062 - 11904: 0xA479,\n\t24063 - 11904: 0xC95D,\n\t24066 - 11904: 0xA5AB,\n\t24067 - 11904: 0xA5AC,\n\t24068 - 11904: 0xC978,\n\t24070 - 11904: 0xA67C,\n\t24073 - 11904: 0xFBFC,\n\t24074 - 11904: 0xCACB,\n\t24075 - 11904: 0x9AE4,\n\t24076 - 11904: 0xA7C6,\n\t24078 - 11904: 0xCACC,\n\t24081 - 11904: 0xA9AE,\n\t24082 - 11904: 0x9F75,\n\t24084 - 11904: 0xCC6E,\n\t24085 - 11904: 0xA9AC,\n\t24086 - 11904: 0xA9AB,\n\t24087 - 11904: 0xCC6D,\n\t24088 - 11904: 0xA9A9,\n\t24089 - 11904: 0xCC6F,\n\t24090 - 11904: 0xA9AA,\n\t24091 - 11904: 0xA9AD,\n\t24093 - 11904: 0xABD2,\n\t24095 - 11904: 0xABD4,\n\t24096 - 11904: 0xCEB3,\n\t24097 - 11904: 0xCEB0,\n\t24098 - 11904: 0xCEB1,\n\t24099 - 11904: 0xCEB2,\n\t24100 - 11904: 0xCEB4,\n\t24101 - 11904: 0xABD3,\n\t24104 - 11904: 0xD174,\n\t24105 - 11904: 0xD173,\n\t24107 - 11904: 0xAE76,\n\t24109 - 11904: 0xAE75,\n\t24110 - 11904: 0xFBF1,\n\t24115 - 11904: 0xB162,\n\t24116 - 11904: 0xD546,\n\t24118 - 11904: 0xB161,\n\t24119 - 11904: 0xB163,\n\t24120 - 11904: 0xB160,\n\t24125 - 11904: 0xB455,\n\t24126 - 11904: 0xD545,\n\t24128 - 11904: 0xB456,\n\t24129 - 11904: 0xD8F3,\n\t24130 - 11904: 0x8D69,\n\t24131 - 11904: 0xB457,\n\t24132 - 11904: 0xD8F2,\n\t24133 - 11904: 0xB454,\n\t24136 - 11904: 0x934F,\n\t24138 - 11904: 0xDD5A,\n\t24139 - 11904: 0xDD5C,\n\t24140 - 11904: 0xB745,\n\t24141 - 11904: 0xDD5B,\n\t24142 - 11904: 0xDD59,\n\t24143 - 11904: 0xDD58,\n\t24147 - 11904: 0xE1B4,\n\t24148 - 11904: 0xB9F7,\n\t24149 - 11904: 0xB9F5,\n\t24151 - 11904: 0xB9F6,\n\t24152 - 11904: 0xE1B2,\n\t24153 - 11904: 0xE1B3,\n\t24155 - 11904: 0xB9F3,\n\t24156 - 11904: 0xE571,\n\t24157 - 11904: 0xE56F,\n\t24158 - 11904: 0x934E,\n\t24159 - 11904: 0xBC6D,\n\t24160 - 11904: 0xE570,\n\t24161 - 11904: 0xBC6E,\n\t24162 - 11904: 0xBC6C,\n\t24163 - 11904: 0xB9F4,\n\t24166 - 11904: 0xE96D,\n\t24167 - 11904: 0xE96B,\n\t24168 - 11904: 0xE96C,\n\t24169 - 11904: 0xE56E,\n\t24170 - 11904: 0xECDC,\n\t24171 - 11904: 0xC0B0,\n\t24172 - 11904: 0xECDB,\n\t24173 - 11904: 0xEFC5,\n\t24174 - 11904: 0xEFC6,\n\t24175 - 11904: 0xE96E,\n\t24176 - 11904: 0xF1FE,\n\t24178 - 11904: 0xA47A,\n\t24179 - 11904: 0xA5AD,\n\t24180 - 11904: 0xA67E,\n\t24181 - 11904: 0xFBF3,\n\t24182 - 11904: 0xA67D,\n\t24184 - 11904: 0xA9AF,\n\t24185 - 11904: 0xB746,\n\t24186 - 11904: 0xFBF4,\n\t24187 - 11904: 0xA4DB,\n\t24188 - 11904: 0xA5AE,\n\t24189 - 11904: 0xABD5,\n\t24190 - 11904: 0xB458,\n\t24191 - 11904: 0xC6CE,\n\t24192 - 11904: 0xC979,\n\t24194 - 11904: 0xC97A,\n\t24195 - 11904: 0xFBC3,\n\t24196 - 11904: 0xC9DC,\n\t24198 - 11904: 0x8965,\n\t24199 - 11904: 0xA7C8,\n\t24200 - 11904: 0xCAD0,\n\t24201 - 11904: 0xCACE,\n\t24202 - 11904: 0xA7C9,\n\t24203 - 11904: 0xCACD,\n\t24204 - 11904: 0xCACF,\n\t24205 - 11904: 0xCAD1,\n\t24207 - 11904: 0xA7C7,\n\t24210 - 11904: 0x8C7A,\n\t24213 - 11904: 0xA9B3,\n\t24214 - 11904: 0xA9B4,\n\t24215 - 11904: 0xA9B1,\n\t24217 - 11904: 0x8C7B,\n\t24218 - 11904: 0xA9B0,\n\t24219 - 11904: 0xCEB8,\n\t24220 - 11904: 0xA9B2,\n\t24224 - 11904: 0xABD6,\n\t24226 - 11904: 0xCEB7,\n\t24227 - 11904: 0xCEB9,\n\t24228 - 11904: 0xCEB6,\n\t24229 - 11904: 0xCEBA,\n\t24230 - 11904: 0xABD7,\n\t24231 - 11904: 0xAE79,\n\t24232 - 11904: 0xD175,\n\t24234 - 11904: 0xD177,\n\t24235 - 11904: 0xAE77,\n\t24236 - 11904: 0xD178,\n\t24237 - 11904: 0xAE78,\n\t24238 - 11904: 0xD176,\n\t24240 - 11904: 0xCEB5,\n\t24241 - 11904: 0xD547,\n\t24242 - 11904: 0xD54A,\n\t24243 - 11904: 0xD54B,\n\t24244 - 11904: 0xD548,\n\t24245 - 11904: 0xB167,\n\t24246 - 11904: 0xB166,\n\t24247 - 11904: 0xB164,\n\t24248 - 11904: 0xB165,\n\t24249 - 11904: 0xD549,\n\t24253 - 11904: 0x8D6A,\n\t24254 - 11904: 0xB168,\n\t24257 - 11904: 0xB45A,\n\t24258 - 11904: 0xB45B,\n\t24260 - 11904: 0xB45C,\n\t24261 - 11904: 0xDD5D,\n\t24262 - 11904: 0xDD5F,\n\t24263 - 11904: 0xDD61,\n\t24264 - 11904: 0xB748,\n\t24265 - 11904: 0xB747,\n\t24266 - 11904: 0xB459,\n\t24267 - 11904: 0xDD60,\n\t24268 - 11904: 0xDD5E,\n\t24269 - 11904: 0x9353,\n\t24270 - 11904: 0xE1B8,\n\t24272 - 11904: 0xFBF9,\n\t24273 - 11904: 0xE1B6,\n\t24274 - 11904: 0xE1BC,\n\t24275 - 11904: 0xB9F8,\n\t24276 - 11904: 0xE1BD,\n\t24277 - 11904: 0xE1BA,\n\t24278 - 11904: 0xB9F9,\n\t24279 - 11904: 0xE1B7,\n\t24280 - 11904: 0xE1B5,\n\t24281 - 11904: 0xE1BB,\n\t24282 - 11904: 0xBC70,\n\t24283 - 11904: 0xE573,\n\t24284 - 11904: 0xE1B9,\n\t24285 - 11904: 0xBC72,\n\t24286 - 11904: 0xE574,\n\t24287 - 11904: 0xBC71,\n\t24288 - 11904: 0xBC74,\n\t24289 - 11904: 0xE575,\n\t24290 - 11904: 0xBC6F,\n\t24291 - 11904: 0xBC73,\n\t24293 - 11904: 0xE973,\n\t24294 - 11904: 0xE971,\n\t24295 - 11904: 0xE970,\n\t24296 - 11904: 0xE972,\n\t24297 - 11904: 0xE96F,\n\t24300 - 11904: 0xC366,\n\t24302 - 11904: 0xF446,\n\t24303 - 11904: 0xF447,\n\t24305 - 11904: 0xF5CB,\n\t24306 - 11904: 0xF6DF,\n\t24307 - 11904: 0xC655,\n\t24308 - 11904: 0xFBFD,\n\t24310 - 11904: 0xA9B5,\n\t24311 - 11904: 0xA7CA,\n\t24312 - 11904: 0x9059,\n\t24313 - 11904: 0xFC40,\n\t24314 - 11904: 0xABD8,\n\t24315 - 11904: 0xFC41,\n\t24316 - 11904: 0xFC43,\n\t24318 - 11904: 0xA47B,\n\t24319 - 11904: 0xA4DC,\n\t24321 - 11904: 0xA5AF,\n\t24322 - 11904: 0xC9DD,\n\t24324 - 11904: 0xA7CB,\n\t24325 - 11904: 0xCAD2,\n\t24327 - 11904: 0xCEBB,\n\t24328 - 11904: 0xABD9,\n\t24330 - 11904: 0xB9FA,\n\t24331 - 11904: 0xA47C,\n\t24332 - 11904: 0x9FD8,\n\t24333 - 11904: 0xFC46,\n\t24334 - 11904: 0x9362,\n\t24335 - 11904: 0xA6A1,\n\t24338 - 11904: 0xB749,\n\t24339 - 11904: 0xA47D,\n\t24340 - 11904: 0xA4DD,\n\t24341 - 11904: 0xA4DE,\n\t24343 - 11904: 0xA5B1,\n\t24344 - 11904: 0xA5B0,\n\t24346 - 11904: 0xC9DE,\n\t24347 - 11904: 0xA6A2,\n\t24349 - 11904: 0xCAD3,\n\t24351 - 11904: 0xA7CC,\n\t24354 - 11904: 0xCC71,\n\t24355 - 11904: 0xCC72,\n\t24356 - 11904: 0xCC73,\n\t24357 - 11904: 0x8D6B,\n\t24358 - 11904: 0xA9B6,\n\t24359 - 11904: 0xA9B7,\n\t24360 - 11904: 0xCC70,\n\t24361 - 11904: 0xA9B8,\n\t24365 - 11904: 0xABDA,\n\t24366 - 11904: 0xCEBC,\n\t24368 - 11904: 0xD17A,\n\t24369 - 11904: 0xAE7A,\n\t24371 - 11904: 0xD179,\n\t24373 - 11904: 0xB169,\n\t24374 - 11904: 0xD54C,\n\t24375 - 11904: 0xB16A,\n\t24376 - 11904: 0xD54D,\n\t24378 - 11904: 0xFC4C,\n\t24379 - 11904: 0x8CFE,\n\t24380 - 11904: 0xB45D,\n\t24384 - 11904: 0xDD62,\n\t24387 - 11904: 0xE1BF,\n\t24388 - 11904: 0xE1BE,\n\t24390 - 11904: 0xB9FB,\n\t24392 - 11904: 0xBC75,\n\t24393 - 11904: 0xE576,\n\t24394 - 11904: 0xBECA,\n\t24395 - 11904: 0xE974,\n\t24396 - 11904: 0xC0B1,\n\t24397 - 11904: 0x95B8,\n\t24398 - 11904: 0xC573,\n\t24399 - 11904: 0xF7D8,\n\t24400 - 11904: 0xC6D0,\n\t24401 - 11904: 0x8BCA,\n\t24404 - 11904: 0xCC74,\n\t24406 - 11904: 0xCEBD,\n\t24407 - 11904: 0xB16B,\n\t24408 - 11904: 0xFC4F,\n\t24409 - 11904: 0xB74A,\n\t24412 - 11904: 0x987A,\n\t24413 - 11904: 0xC255,\n\t24417 - 11904: 0xC6D1,\n\t24418 - 11904: 0xA7CE,\n\t24419 - 11904: 0xFC51,\n\t24420 - 11904: 0xA7CD,\n\t24421 - 11904: 0xABDB,\n\t24423 - 11904: 0xD17B,\n\t24425 - 11904: 0xB16D,\n\t24426 - 11904: 0xB343,\n\t24427 - 11904: 0xB16E,\n\t24428 - 11904: 0xB16C,\n\t24429 - 11904: 0xB45E,\n\t24431 - 11904: 0xE1C0,\n\t24432 - 11904: 0xB9FC,\n\t24433 - 11904: 0xBC76,\n\t24434 - 11904: 0xFC54,\n\t24435 - 11904: 0xC94C,\n\t24436 - 11904: 0xC9DF,\n\t24438 - 11904: 0xCAD5,\n\t24439 - 11904: 0xA7CF,\n\t24440 - 11904: 0xCAD4,\n\t24441 - 11904: 0xA7D0,\n\t24443 - 11904: 0xFAAF,\n\t24444 - 11904: 0xA9BC,\n\t24445 - 11904: 0xCC77,\n\t24446 - 11904: 0xCC76,\n\t24447 - 11904: 0xA9BB,\n\t24448 - 11904: 0xA9B9,\n\t24449 - 11904: 0xA9BA,\n\t24450 - 11904: 0xCC75,\n\t24451 - 11904: 0x8D6C,\n\t24453 - 11904: 0xABDD,\n\t24454 - 11904: 0xCEBE,\n\t24455 - 11904: 0xABE0,\n\t24456 - 11904: 0xABDC,\n\t24457 - 11904: 0xABE2,\n\t24458 - 11904: 0xABDE,\n\t24459 - 11904: 0xABDF,\n\t24460 - 11904: 0xABE1,\n\t24464 - 11904: 0xAE7D,\n\t24465 - 11904: 0xAE7C,\n\t24466 - 11904: 0xAE7B,\n\t24470 - 11904: 0xD54F,\n\t24471 - 11904: 0xB16F,\n\t24472 - 11904: 0xB172,\n\t24473 - 11904: 0xB170,\n\t24475 - 11904: 0xD54E,\n\t24476 - 11904: 0xB175,\n\t24478 - 11904: 0xB171,\n\t24479 - 11904: 0xD550,\n\t24480 - 11904: 0xB174,\n\t24481 - 11904: 0xB173,\n\t24484 - 11904: 0xFA61,\n\t24485 - 11904: 0xD8F6,\n\t24486 - 11904: 0xD8F5,\n\t24487 - 11904: 0xFC57,\n\t24488 - 11904: 0xB461,\n\t24489 - 11904: 0xB45F,\n\t24490 - 11904: 0xB460,\n\t24491 - 11904: 0xD8F7,\n\t24492 - 11904: 0xB74B,\n\t24493 - 11904: 0xDD64,\n\t24494 - 11904: 0xB74C,\n\t24495 - 11904: 0xDD63,\n\t24497 - 11904: 0x9B70,\n\t24498 - 11904: 0xE577,\n\t24501 - 11904: 0xBC78,\n\t24502 - 11904: 0xE1C1,\n\t24503 - 11904: 0xBC77,\n\t24505 - 11904: 0xB9FD,\n\t24506 - 11904: 0xA051,\n\t24507 - 11904: 0xECDE,\n\t24508 - 11904: 0xE975,\n\t24509 - 11904: 0xC0B2,\n\t24510 - 11904: 0xECDD,\n\t24511 - 11904: 0xF240,\n\t24512 - 11904: 0xF448,\n\t24513 - 11904: 0xF449,\n\t24514 - 11904: 0x8C7C,\n\t24515 - 11904: 0xA4DF,\n\t24516 - 11904: 0x8BCB,\n\t24517 - 11904: 0xA5B2,\n\t24521 - 11904: 0xC97B,\n\t24524 - 11904: 0xA7D2,\n\t24525 - 11904: 0xA7D4,\n\t24527 - 11904: 0xC9E2,\n\t24528 - 11904: 0xCAD8,\n\t24529 - 11904: 0xCAD7,\n\t24530 - 11904: 0xCAD6,\n\t24532 - 11904: 0xC9E1,\n\t24533 - 11904: 0xC9E0,\n\t24534 - 11904: 0xA6A4,\n\t24535 - 11904: 0xA7D3,\n\t24536 - 11904: 0xA7D1,\n\t24537 - 11904: 0xA6A3,\n\t24539 - 11904: 0x936E,\n\t24541 - 11904: 0xA9BD,\n\t24542 - 11904: 0xCC78,\n\t24543 - 11904: 0xFCD5,\n\t24544 - 11904: 0xA9BE,\n\t24545 - 11904: 0xCADD,\n\t24547 - 11904: 0xCADF,\n\t24548 - 11904: 0xCADE,\n\t24549 - 11904: 0xCC79,\n\t24552 - 11904: 0xCADA,\n\t24554 - 11904: 0xA7D8,\n\t24555 - 11904: 0xA7D6,\n\t24557 - 11904: 0xCAD9,\n\t24558 - 11904: 0xCADB,\n\t24559 - 11904: 0xCAE1,\n\t24561 - 11904: 0xA7D5,\n\t24563 - 11904: 0xCADC,\n\t24564 - 11904: 0xCAE5,\n\t24565 - 11904: 0xA9C0,\n\t24567 - 11904: 0xCAE2,\n\t24568 - 11904: 0xA7D7,\n\t24570 - 11904: 0xCAE0,\n\t24571 - 11904: 0xCAE3,\n\t24573 - 11904: 0xA9BF,\n\t24575 - 11904: 0xA9C1,\n\t24576 - 11904: 0xCAE4,\n\t24585 - 11904: 0xCCAF,\n\t24586 - 11904: 0xCCA2,\n\t24587 - 11904: 0xCC7E,\n\t24588 - 11904: 0xCCAE,\n\t24589 - 11904: 0xCCA9,\n\t24590 - 11904: 0xABE7,\n\t24591 - 11904: 0xA9C2,\n\t24592 - 11904: 0xCCAA,\n\t24593 - 11904: 0xCCAD,\n\t24594 - 11904: 0xABE3,\n\t24595 - 11904: 0xCCAC,\n\t24596 - 11904: 0xA9C3,\n\t24597 - 11904: 0xA9C8,\n\t24598 - 11904: 0xA9C6,\n\t24599 - 11904: 0xCCA3,\n\t24601 - 11904: 0xCC7C,\n\t24602 - 11904: 0xCCA5,\n\t24603 - 11904: 0xA9CD,\n\t24604 - 11904: 0xCCB0,\n\t24605 - 11904: 0xABE4,\n\t24606 - 11904: 0xCCA6,\n\t24608 - 11904: 0xABE5,\n\t24609 - 11904: 0xA9C9,\n\t24610 - 11904: 0xCCA8,\n\t24611 - 11904: 0xFCA9,\n\t24612 - 11904: 0xCECD,\n\t24613 - 11904: 0xABE6,\n\t24614 - 11904: 0xCC7B,\n\t24615 - 11904: 0xA9CA,\n\t24616 - 11904: 0xABE8,\n\t24617 - 11904: 0xA9CB,\n\t24618 - 11904: 0xA9C7,\n\t24619 - 11904: 0xA9CC,\n\t24620 - 11904: 0xCCA7,\n\t24621 - 11904: 0xCC7A,\n\t24622 - 11904: 0xCCAB,\n\t24623 - 11904: 0xA9C4,\n\t24625 - 11904: 0xFC61,\n\t24626 - 11904: 0xCC7D,\n\t24627 - 11904: 0xCCA4,\n\t24628 - 11904: 0xCCA1,\n\t24629 - 11904: 0xA9C5,\n\t24631 - 11904: 0xCEBF,\n\t24633 - 11904: 0xCEC0,\n\t24635 - 11904: 0x8966,\n\t24640 - 11904: 0xCECA,\n\t24641 - 11904: 0xD1A1,\n\t24642 - 11904: 0xCECB,\n\t24643 - 11904: 0xABEE,\n\t24644 - 11904: 0xCECE,\n\t24645 - 11904: 0xCEC4,\n\t24646 - 11904: 0xABED,\n\t24647 - 11904: 0xCEC6,\n\t24649 - 11904: 0xCEC7,\n\t24650 - 11904: 0xFACB,\n\t24652 - 11904: 0xCEC9,\n\t24653 - 11904: 0xABE9,\n\t24656 - 11904: 0xAEA3,\n\t24658 - 11904: 0xF9DA,\n\t24659 - 11904: 0xCEC5,\n\t24660 - 11904: 0xCEC1,\n\t24661 - 11904: 0xAEA4,\n\t24664 - 11904: 0xCECF,\n\t24665 - 11904: 0xAE7E,\n\t24666 - 11904: 0xD17D,\n\t24667 - 11904: 0xCEC8,\n\t24669 - 11904: 0xD17C,\n\t24670 - 11904: 0xCEC3,\n\t24671 - 11904: 0xCECC,\n\t24674 - 11904: 0xABEC,\n\t24675 - 11904: 0xAEA1,\n\t24676 - 11904: 0xABF2,\n\t24677 - 11904: 0xAEA2,\n\t24678 - 11904: 0xCED0,\n\t24679 - 11904: 0xD17E,\n\t24680 - 11904: 0xABEB,\n\t24681 - 11904: 0xAEA6,\n\t24682 - 11904: 0xABF1,\n\t24683 - 11904: 0xABF0,\n\t24684 - 11904: 0xABEF,\n\t24685 - 11904: 0xAEA5,\n\t24686 - 11904: 0xCED1,\n\t24687 - 11904: 0xAEA7,\n\t24688 - 11904: 0xABEA,\n\t24690 - 11904: 0xCEC2,\n\t24693 - 11904: 0x937A,\n\t24695 - 11904: 0xA0E0,\n\t24702 - 11904: 0x936B,\n\t24703 - 11904: 0xB176,\n\t24704 - 11904: 0xD1A4,\n\t24705 - 11904: 0xD1A6,\n\t24707 - 11904: 0xD1A8,\n\t24708 - 11904: 0xAEA8,\n\t24709 - 11904: 0xAEAE,\n\t24710 - 11904: 0xD553,\n\t24711 - 11904: 0xD1AC,\n\t24712 - 11904: 0xD1A3,\n\t24713 - 11904: 0xB178,\n\t24714 - 11904: 0xD551,\n\t24716 - 11904: 0xAEAD,\n\t24717 - 11904: 0xAEAB,\n\t24718 - 11904: 0xD1AE,\n\t24720 - 11904: 0xD552,\n\t24722 - 11904: 0xD1A5,\n\t24724 - 11904: 0xAEAC,\n\t24725 - 11904: 0xD1A9,\n\t24726 - 11904: 0xAEAF,\n\t24727 - 11904: 0xD1AB,\n\t24730 - 11904: 0xAEAA,\n\t24731 - 11904: 0xD1AA,\n\t24732 - 11904: 0xD1AD,\n\t24733 - 11904: 0xD1A7,\n\t24734 - 11904: 0xFC6B,\n\t24735 - 11904: 0xAEA9,\n\t24736 - 11904: 0xB179,\n\t24738 - 11904: 0xD1A2,\n\t24739 - 11904: 0xB177,\n\t24740 - 11904: 0xFC6C,\n\t24743 - 11904: 0x9468,\n\t24744 - 11904: 0xB17A,\n\t24752 - 11904: 0xD555,\n\t24753 - 11904: 0xD55E,\n\t24754 - 11904: 0xB464,\n\t24755 - 11904: 0xFC6D,\n\t24756 - 11904: 0xB17C,\n\t24757 - 11904: 0xB1A3,\n\t24758 - 11904: 0xB465,\n\t24759 - 11904: 0xD560,\n\t24760 - 11904: 0xB1AA,\n\t24761 - 11904: 0xD8F9,\n\t24762 - 11904: 0xD556,\n\t24763 - 11904: 0xB1A2,\n\t24764 - 11904: 0xB1A5,\n\t24765 - 11904: 0xB17E,\n\t24766 - 11904: 0xD554,\n\t24767 - 11904: 0xD562,\n\t24768 - 11904: 0xD565,\n\t24769 - 11904: 0xD949,\n\t24771 - 11904: 0xD563,\n\t24772 - 11904: 0xD8FD,\n\t24773 - 11904: 0xB1A1,\n\t24774 - 11904: 0xB1A8,\n\t24775 - 11904: 0xB1AC,\n\t24776 - 11904: 0xD55D,\n\t24777 - 11904: 0xD8F8,\n\t24778 - 11904: 0xD561,\n\t24779 - 11904: 0xB17B,\n\t24780 - 11904: 0xD8FA,\n\t24781 - 11904: 0xD564,\n\t24782 - 11904: 0xD8FC,\n\t24783 - 11904: 0xD559,\n\t24785 - 11904: 0xB462,\n\t24787 - 11904: 0xD557,\n\t24788 - 11904: 0xD558,\n\t24789 - 11904: 0xB1A7,\n\t24791 - 11904: 0x8D71,\n\t24792 - 11904: 0xB1A6,\n\t24793 - 11904: 0xD55B,\n\t24794 - 11904: 0xB1AB,\n\t24795 - 11904: 0xD55F,\n\t24796 - 11904: 0xB1A4,\n\t24797 - 11904: 0xD55C,\n\t24798 - 11904: 0xFD64,\n\t24799 - 11904: 0xB1A9,\n\t24800 - 11904: 0xB466,\n\t24801 - 11904: 0xB463,\n\t24802 - 11904: 0xD8FB,\n\t24803 - 11904: 0x99BA,\n\t24804 - 11904: 0xD55A,\n\t24806 - 11904: 0xB17D,\n\t24807 - 11904: 0x9AD0,\n\t24808 - 11904: 0x9A61,\n\t24809 - 11904: 0xA0E5,\n\t24816 - 11904: 0xB46B,\n\t24817 - 11904: 0xB46F,\n\t24818 - 11904: 0xD940,\n\t24819 - 11904: 0xB751,\n\t24820 - 11904: 0xB46D,\n\t24821 - 11904: 0xD944,\n\t24822 - 11904: 0xB471,\n\t24823 - 11904: 0xDD65,\n\t24824 - 11904: 0xD946,\n\t24825 - 11904: 0xB753,\n\t24826 - 11904: 0xB469,\n\t24827 - 11904: 0xB46C,\n\t24828 - 11904: 0xD947,\n\t24829 - 11904: 0xA05B,\n\t24830 - 11904: 0xD948,\n\t24831 - 11904: 0xD94E,\n\t24832 - 11904: 0xB473,\n\t24833 - 11904: 0xB754,\n\t24835 - 11904: 0xD94A,\n\t24836 - 11904: 0xD94F,\n\t24837 - 11904: 0xD943,\n\t24838 - 11904: 0xB75E,\n\t24839 - 11904: 0x96AC,\n\t24840 - 11904: 0xB755,\n\t24841 - 11904: 0xB472,\n\t24842 - 11904: 0xD941,\n\t24843 - 11904: 0xD950,\n\t24844 - 11904: 0x9740,\n\t24845 - 11904: 0xB75D,\n\t24846 - 11904: 0xB470,\n\t24847 - 11904: 0xB74E,\n\t24848 - 11904: 0xD94D,\n\t24850 - 11904: 0xB474,\n\t24851 - 11904: 0xD945,\n\t24852 - 11904: 0xD8FE,\n\t24853 - 11904: 0xB46A,\n\t24854 - 11904: 0xD942,\n\t24856 - 11904: 0xD94B,\n\t24857 - 11904: 0x9EF1,\n\t24858 - 11904: 0xB74D,\n\t24859 - 11904: 0xB752,\n\t24860 - 11904: 0xB467,\n\t24861 - 11904: 0xD94C,\n\t24863 - 11904: 0xB750,\n\t24866 - 11904: 0x8C4D,\n\t24867 - 11904: 0xB468,\n\t24871 - 11904: 0xB75C,\n\t24872 - 11904: 0xE1C3,\n\t24873 - 11904: 0xDD70,\n\t24875 - 11904: 0xDD68,\n\t24876 - 11904: 0xE1C2,\n\t24878 - 11904: 0xDD6C,\n\t24879 - 11904: 0xDD6E,\n\t24880 - 11904: 0x9F7E,\n\t24882 - 11904: 0xDD6B,\n\t24884 - 11904: 0xB75B,\n\t24886 - 11904: 0xDD6A,\n\t24887 - 11904: 0xB75F,\n\t24891 - 11904: 0xE1D2,\n\t24893 - 11904: 0x8D72,\n\t24894 - 11904: 0xB75A,\n\t24895 - 11904: 0xBA40,\n\t24896 - 11904: 0xDD71,\n\t24897 - 11904: 0xE1C4,\n\t24898 - 11904: 0xFC76,\n\t24900 - 11904: 0xB758,\n\t24901 - 11904: 0xDD69,\n\t24902 - 11904: 0xDD6D,\n\t24903 - 11904: 0xB9FE,\n\t24904 - 11904: 0xB74F,\n\t24905 - 11904: 0xDD66,\n\t24906 - 11904: 0xDD67,\n\t24907 - 11904: 0xBA41,\n\t24908 - 11904: 0xB757,\n\t24909 - 11904: 0xB759,\n\t24910 - 11904: 0xB756,\n\t24911 - 11904: 0xDD6F,\n\t24912 - 11904: 0x96A9,\n\t24914 - 11904: 0xE1C8,\n\t24915 - 11904: 0xE1C9,\n\t24916 - 11904: 0xE1CE,\n\t24917 - 11904: 0xBC7D,\n\t24918 - 11904: 0xE1D5,\n\t24920 - 11904: 0xBA47,\n\t24921 - 11904: 0xA06E,\n\t24922 - 11904: 0xBA46,\n\t24923 - 11904: 0xE1D0,\n\t24924 - 11904: 0xFCAA,\n\t24925 - 11904: 0xBC7C,\n\t24926 - 11904: 0xE1C5,\n\t24927 - 11904: 0xBA45,\n\t24928 - 11904: 0xFBCD,\n\t24929 - 11904: 0xE1D4,\n\t24930 - 11904: 0xBA43,\n\t24931 - 11904: 0xBA44,\n\t24932 - 11904: 0xFC74,\n\t24933 - 11904: 0xE1D1,\n\t24934 - 11904: 0xE5AA,\n\t24935 - 11904: 0xBC7A,\n\t24936 - 11904: 0xB46E,\n\t24938 - 11904: 0xE1D3,\n\t24939 - 11904: 0xBCA3,\n\t24940 - 11904: 0xE1CB,\n\t24942 - 11904: 0xBC7B,\n\t24943 - 11904: 0xA074,\n\t24944 - 11904: 0xBCA2,\n\t24945 - 11904: 0xE1C6,\n\t24946 - 11904: 0xE1CA,\n\t24947 - 11904: 0xE1C7,\n\t24948 - 11904: 0xE1CD,\n\t24949 - 11904: 0xBA48,\n\t24950 - 11904: 0xBC79,\n\t24951 - 11904: 0xBA42,\n\t24953 - 11904: 0xE57A,\n\t24954 - 11904: 0xE1CF,\n\t24956 - 11904: 0xBCA1,\n\t24957 - 11904: 0xA071,\n\t24958 - 11904: 0xBCA4,\n\t24960 - 11904: 0xE1CC,\n\t24961 - 11904: 0xFC79,\n\t24962 - 11904: 0xBC7E,\n\t24963 - 11904: 0xE579,\n\t24967 - 11904: 0xFC7C,\n\t24969 - 11904: 0xE57E,\n\t24970 - 11904: 0xBECE,\n\t24971 - 11904: 0xE578,\n\t24972 - 11904: 0xE9A3,\n\t24973 - 11904: 0xE5A9,\n\t24974 - 11904: 0xBCA8,\n\t24976 - 11904: 0xBCA6,\n\t24977 - 11904: 0xBECC,\n\t24978 - 11904: 0xE5A6,\n\t24979 - 11904: 0xE5A2,\n\t24980 - 11904: 0xBCAC,\n\t24981 - 11904: 0x9C50,\n\t24982 - 11904: 0xE978,\n\t24984 - 11904: 0x9379,\n\t24985 - 11904: 0x9378,\n\t24986 - 11904: 0xBCAA,\n\t24987 - 11904: 0xE5A1,\n\t24988 - 11904: 0xA0DD,\n\t24989 - 11904: 0xE976,\n\t24991 - 11904: 0xE5A5,\n\t24993 - 11904: 0xE5A8,\n\t24994 - 11904: 0xE57D,\n\t24996 - 11904: 0xBCAB,\n\t24999 - 11904: 0xBCA5,\n\t25000 - 11904: 0xE977,\n\t25001 - 11904: 0xBECD,\n\t25002 - 11904: 0xE5A7,\n\t25003 - 11904: 0xBCA7,\n\t25004 - 11904: 0xBCA9,\n\t25005 - 11904: 0xE5A4,\n\t25006 - 11904: 0xBCAD,\n\t25007 - 11904: 0xE5A3,\n\t25008 - 11904: 0xE57C,\n\t25009 - 11904: 0xE57B,\n\t25010 - 11904: 0xBECB,\n\t25011 - 11904: 0xE5AB,\n\t25012 - 11904: 0xE97A,\n\t25013 - 11904: 0xECE0,\n\t25014 - 11904: 0xBED0,\n\t25015 - 11904: 0x8D75,\n\t25016 - 11904: 0xE9A2,\n\t25017 - 11904: 0x8D76,\n\t25018 - 11904: 0xE97E,\n\t25020 - 11904: 0xECE1,\n\t25022 - 11904: 0xBED1,\n\t25023 - 11904: 0xE9A1,\n\t25024 - 11904: 0x9374,\n\t25025 - 11904: 0xE97C,\n\t25026 - 11904: 0xC0B4,\n\t25027 - 11904: 0xECDF,\n\t25029 - 11904: 0xE979,\n\t25030 - 11904: 0xE97B,\n\t25031 - 11904: 0xC0B5,\n\t25032 - 11904: 0xBED3,\n\t25033 - 11904: 0xC0B3,\n\t25034 - 11904: 0xBED2,\n\t25035 - 11904: 0xC0B7,\n\t25036 - 11904: 0xE97D,\n\t25037 - 11904: 0xBECF,\n\t25039 - 11904: 0x8D77,\n\t25040 - 11904: 0xFCA5,\n\t25043 - 11904: 0xFCA2,\n\t25046 - 11904: 0xEFCF,\n\t25048 - 11904: 0xEFC7,\n\t25050 - 11904: 0x90C3,\n\t25054 - 11904: 0xECE7,\n\t25055 - 11904: 0xEFC8,\n\t25056 - 11904: 0xECE3,\n\t25058 - 11904: 0xA079,\n\t25059 - 11904: 0xC256,\n\t25060 - 11904: 0xECE5,\n\t25061 - 11904: 0xECE4,\n\t25062 - 11904: 0xC0B6,\n\t25063 - 11904: 0xECE2,\n\t25064 - 11904: 0xECE6,\n\t25065 - 11904: 0xEFD0,\n\t25066 - 11904: 0xEFCC,\n\t25067 - 11904: 0xEFCE,\n\t25069 - 11904: 0xEFC9,\n\t25070 - 11904: 0xEFCA,\n\t25072 - 11904: 0xEFCD,\n\t25073 - 11904: 0xEFCB,\n\t25074 - 11904: 0xC367,\n\t25077 - 11904: 0xC36A,\n\t25078 - 11904: 0xC369,\n\t25079 - 11904: 0xC368,\n\t25080 - 11904: 0xC461,\n\t25081 - 11904: 0xF44A,\n\t25082 - 11904: 0xC462,\n\t25083 - 11904: 0xF241,\n\t25084 - 11904: 0xC4DF,\n\t25085 - 11904: 0xF5CC,\n\t25086 - 11904: 0xC4E0,\n\t25087 - 11904: 0xC574,\n\t25088 - 11904: 0xC5CA,\n\t25089 - 11904: 0xF7D9,\n\t25091 - 11904: 0xF7DA,\n\t25092 - 11904: 0xF7DB,\n\t25095 - 11904: 0xF9BA,\n\t25096 - 11904: 0xA4E0,\n\t25097 - 11904: 0xC97C,\n\t25098 - 11904: 0xA5B3,\n\t25100 - 11904: 0xA6A6,\n\t25101 - 11904: 0xA6A7,\n\t25102 - 11904: 0xA6A5,\n\t25104 - 11904: 0xA6A8,\n\t25105 - 11904: 0xA7DA,\n\t25106 - 11904: 0xA7D9,\n\t25108 - 11904: 0xCCB1,\n\t25109 - 11904: 0xA9CF,\n\t25110 - 11904: 0xA9CE,\n\t25113 - 11904: 0xD1AF,\n\t25114 - 11904: 0xB1AD,\n\t25115 - 11904: 0xB1AE,\n\t25119 - 11904: 0xB475,\n\t25120 - 11904: 0xDD72,\n\t25121 - 11904: 0xB760,\n\t25122 - 11904: 0xB761,\n\t25123 - 11904: 0xDD74,\n\t25124 - 11904: 0xDD76,\n\t25125 - 11904: 0xDD75,\n\t25127 - 11904: 0xE1D7,\n\t25129 - 11904: 0xE1D6,\n\t25130 - 11904: 0xBA49,\n\t25131 - 11904: 0xE1D8,\n\t25132 - 11904: 0x8D79,\n\t25133 - 11904: 0xE5AC,\n\t25134 - 11904: 0xBCAE,\n\t25136 - 11904: 0xBED4,\n\t25138 - 11904: 0xC0B8,\n\t25139 - 11904: 0xC257,\n\t25140 - 11904: 0xC0B9,\n\t25142 - 11904: 0xA4E1,\n\t25143 - 11904: 0x8BFC,\n\t25145 - 11904: 0xA076,\n\t25146 - 11904: 0xCAE6,\n\t25149 - 11904: 0xCCB2,\n\t25150 - 11904: 0xA9D1,\n\t25151 - 11904: 0xA9D0,\n\t25152 - 11904: 0xA9D2,\n\t25153 - 11904: 0xABF3,\n\t25154 - 11904: 0xCED2,\n\t25155 - 11904: 0xCED3,\n\t25158 - 11904: 0xD1B0,\n\t25159 - 11904: 0xAEB0,\n\t25160 - 11904: 0xB1AF,\n\t25161 - 11904: 0xB476,\n\t25162 - 11904: 0xD951,\n\t25163 - 11904: 0xA4E2,\n\t25164 - 11904: 0x8BCD,\n\t25165 - 11904: 0xA47E,\n\t25166 - 11904: 0xA4E3,\n\t25168 - 11904: 0xC97D,\n\t25169 - 11904: 0xA5B7,\n\t25170 - 11904: 0xA5B6,\n\t25171 - 11904: 0xA5B4,\n\t25172 - 11904: 0xA5B5,\n\t25176 - 11904: 0xA6AB,\n\t25177 - 11904: 0xC9E9,\n\t25178 - 11904: 0xC9EB,\n\t25179 - 11904: 0xA6AA,\n\t25180 - 11904: 0xC9E3,\n\t25182 - 11904: 0xC9E4,\n\t25184 - 11904: 0xC9EA,\n\t25185 - 11904: 0xC9E6,\n\t25186 - 11904: 0xC9E8,\n\t25187 - 11904: 0xA6A9,\n\t25188 - 11904: 0xC9E5,\n\t25189 - 11904: 0xC9EC,\n\t25190 - 11904: 0xC9E7,\n\t25192 - 11904: 0x9F5A,\n\t25197 - 11904: 0xA7E1,\n\t25198 - 11904: 0xA7EA,\n\t25199 - 11904: 0xA7E8,\n\t25200 - 11904: 0xCAF0,\n\t25201 - 11904: 0xCAED,\n\t25202 - 11904: 0xCAF5,\n\t25203 - 11904: 0xA7E6,\n\t25204 - 11904: 0xCAF6,\n\t25206 - 11904: 0xA7DF,\n\t25207 - 11904: 0xCAF3,\n\t25209 - 11904: 0xA7E5,\n\t25210 - 11904: 0xCAEF,\n\t25211 - 11904: 0xCAEE,\n\t25212 - 11904: 0xA7E3,\n\t25213 - 11904: 0xCAF4,\n\t25214 - 11904: 0xA7E4,\n\t25215 - 11904: 0xA9D3,\n\t25216 - 11904: 0xA7DE,\n\t25217 - 11904: 0xCAF1,\n\t25218 - 11904: 0x9FF4,\n\t25219 - 11904: 0xCAE7,\n\t25220 - 11904: 0xA7DB,\n\t25221 - 11904: 0x9FBA,\n\t25222 - 11904: 0xA7EE,\n\t25223 - 11904: 0xCAEC,\n\t25224 - 11904: 0xCAF2,\n\t25225 - 11904: 0xA7E0,\n\t25226 - 11904: 0xA7E2,\n\t25228 - 11904: 0xCAE8,\n\t25230 - 11904: 0xCAE9,\n\t25231 - 11904: 0xCAEA,\n\t25232 - 11904: 0x8D7A,\n\t25233 - 11904: 0xA7ED,\n\t25234 - 11904: 0xA7E7,\n\t25235 - 11904: 0xA7EC,\n\t25236 - 11904: 0xCAEB,\n\t25237 - 11904: 0xA7EB,\n\t25238 - 11904: 0xA7DD,\n\t25239 - 11904: 0xA7DC,\n\t25240 - 11904: 0xA7E9,\n\t25245 - 11904: 0x9E45,\n\t25252 - 11904: 0x93B0,\n\t25254 - 11904: 0xA075,\n\t25256 - 11904: 0xA9E1,\n\t25257 - 11904: 0xCCBE,\n\t25258 - 11904: 0xCCB7,\n\t25259 - 11904: 0xA9DC,\n\t25260 - 11904: 0xA9EF,\n\t25261 - 11904: 0xCCB3,\n\t25262 - 11904: 0xCCBA,\n\t25263 - 11904: 0xCCBC,\n\t25264 - 11904: 0xCCBF,\n\t25265 - 11904: 0xA9EA,\n\t25267 - 11904: 0xCCBB,\n\t25268 - 11904: 0xCCB4,\n\t25269 - 11904: 0xA9E8,\n\t25270 - 11904: 0xCCB8,\n\t25272 - 11904: 0xCCC0,\n\t25273 - 11904: 0xA9D9,\n\t25275 - 11904: 0xCCBD,\n\t25276 - 11904: 0xA9E3,\n\t25277 - 11904: 0xA9E2,\n\t25278 - 11904: 0xCCB6,\n\t25279 - 11904: 0xA9D7,\n\t25281 - 11904: 0x87DD,\n\t25282 - 11904: 0xA9D8,\n\t25283 - 11904: 0x9B46,\n\t25284 - 11904: 0xA9D6,\n\t25285 - 11904: 0xFCAE,\n\t25286 - 11904: 0xA9EE,\n\t25287 - 11904: 0xA9E6,\n\t25288 - 11904: 0xA9E0,\n\t25289 - 11904: 0xA9D4,\n\t25290 - 11904: 0xCCB9,\n\t25291 - 11904: 0xA9DF,\n\t25292 - 11904: 0xA9D5,\n\t25293 - 11904: 0xA9E7,\n\t25294 - 11904: 0xA9F0,\n\t25295 - 11904: 0xCED4,\n\t25296 - 11904: 0xA9E4,\n\t25297 - 11904: 0xCCB5,\n\t25298 - 11904: 0xA9DA,\n\t25299 - 11904: 0xA9DD,\n\t25300 - 11904: 0xA9DE,\n\t25301 - 11904: 0xFCB0,\n\t25302 - 11904: 0xA9EC,\n\t25303 - 11904: 0xA9ED,\n\t25304 - 11904: 0xA9EB,\n\t25305 - 11904: 0xA9E5,\n\t25306 - 11904: 0xA9E9,\n\t25307 - 11904: 0xA9DB,\n\t25308 - 11904: 0xABF4,\n\t25311 - 11904: 0xFA51,\n\t25317 - 11904: 0x8D7B,\n\t25323 - 11904: 0xCEDA,\n\t25324 - 11904: 0xAC41,\n\t25325 - 11904: 0xABF8,\n\t25326 - 11904: 0xABFA,\n\t25327 - 11904: 0xAC40,\n\t25328 - 11904: 0xCEE6,\n\t25329 - 11904: 0xABFD,\n\t25330 - 11904: 0xD1B1,\n\t25331 - 11904: 0xAEB1,\n\t25332 - 11904: 0xAC43,\n\t25333 - 11904: 0xCED7,\n\t25334 - 11904: 0xCEDF,\n\t25335 - 11904: 0xABFE,\n\t25336 - 11904: 0xCEDE,\n\t25337 - 11904: 0xCEDB,\n\t25338 - 11904: 0xCEE3,\n\t25339 - 11904: 0xCEE5,\n\t25340 - 11904: 0xABF7,\n\t25341 - 11904: 0xABFB,\n\t25342 - 11904: 0xAC42,\n\t25343 - 11904: 0xAEB3,\n\t25344 - 11904: 0xCEE0,\n\t25345 - 11904: 0xABF9,\n\t25346 - 11904: 0xAC45,\n\t25347 - 11904: 0xCED9,\n\t25351 - 11904: 0xABFC,\n\t25352 - 11904: 0xAEB2,\n\t25353 - 11904: 0xABF6,\n\t25355 - 11904: 0xCED6,\n\t25356 - 11904: 0xCEDD,\n\t25357 - 11904: 0xCED5,\n\t25358 - 11904: 0xCED8,\n\t25359 - 11904: 0xCEDC,\n\t25360 - 11904: 0xD1B2,\n\t25361 - 11904: 0xAC44,\n\t25363 - 11904: 0xCEE1,\n\t25364 - 11904: 0xCEE2,\n\t25365 - 11904: 0xCEE4,\n\t25366 - 11904: 0xABF5,\n\t25368 - 11904: 0x8D7C,\n\t25384 - 11904: 0xAEC1,\n\t25385 - 11904: 0xD1BE,\n\t25386 - 11904: 0xAEBF,\n\t25387 - 11904: 0xAEC0,\n\t25388 - 11904: 0xD1B4,\n\t25389 - 11904: 0xD1C4,\n\t25390 - 11904: 0x9ED6,\n\t25391 - 11904: 0xAEB6,\n\t25393 - 11904: 0x93AC,\n\t25394 - 11904: 0xD566,\n\t25395 - 11904: 0xD1C6,\n\t25396 - 11904: 0xD1C0,\n\t25397 - 11904: 0x9F5B,\n\t25398 - 11904: 0xD1B7,\n\t25399 - 11904: 0x93A9,\n\t25400 - 11904: 0xD1C9,\n\t25401 - 11904: 0xD1BA,\n\t25402 - 11904: 0xAEBC,\n\t25403 - 11904: 0xD57D,\n\t25404 - 11904: 0xD1BD,\n\t25405 - 11904: 0xAEBE,\n\t25406 - 11904: 0xAEB5,\n\t25408 - 11904: 0xD1CB,\n\t25409 - 11904: 0xD1BF,\n\t25410 - 11904: 0xAEB8,\n\t25411 - 11904: 0xD1B8,\n\t25412 - 11904: 0xD1B5,\n\t25413 - 11904: 0xD1B6,\n\t25414 - 11904: 0xAEB9,\n\t25415 - 11904: 0xD1C5,\n\t25416 - 11904: 0xD1CC,\n\t25417 - 11904: 0xAEBB,\n\t25418 - 11904: 0xD1BC,\n\t25419 - 11904: 0xD1BB,\n\t25420 - 11904: 0xAEC3,\n\t25421 - 11904: 0xAEC2,\n\t25422 - 11904: 0xAEB4,\n\t25423 - 11904: 0xAEBA,\n\t25424 - 11904: 0xAEBD,\n\t25425 - 11904: 0xD1C8,\n\t25428 - 11904: 0xD1C2,\n\t25429 - 11904: 0xAEB7,\n\t25430 - 11904: 0xD1B3,\n\t25431 - 11904: 0xD1CA,\n\t25432 - 11904: 0xD1C1,\n\t25433 - 11904: 0xD1C3,\n\t25434 - 11904: 0xD1C7,\n\t25444 - 11904: 0xA07C,\n\t25445 - 11904: 0xD567,\n\t25447 - 11904: 0xB1B7,\n\t25448 - 11904: 0xB1CB,\n\t25449 - 11904: 0xB1CA,\n\t25451 - 11904: 0xB1BF,\n\t25452 - 11904: 0xFCB2,\n\t25453 - 11904: 0xD579,\n\t25454 - 11904: 0xD575,\n\t25455 - 11904: 0xD572,\n\t25456 - 11904: 0xD5A6,\n\t25457 - 11904: 0xB1BA,\n\t25458 - 11904: 0xB1B2,\n\t25461 - 11904: 0xD577,\n\t25462 - 11904: 0xB4A8,\n\t25463 - 11904: 0xB1B6,\n\t25464 - 11904: 0xD5A1,\n\t25465 - 11904: 0x8AC1,\n\t25466 - 11904: 0xB1CC,\n\t25467 - 11904: 0xB1C9,\n\t25468 - 11904: 0xD57B,\n\t25469 - 11904: 0xD56A,\n\t25471 - 11904: 0x9FB4,\n\t25472 - 11904: 0xB1C8,\n\t25473 - 11904: 0xD5A3,\n\t25474 - 11904: 0xD569,\n\t25475 - 11904: 0xB1BD,\n\t25476 - 11904: 0xB1C1,\n\t25477 - 11904: 0xD5A2,\n\t25479 - 11904: 0xD573,\n\t25480 - 11904: 0xB1C2,\n\t25481 - 11904: 0xB1BC,\n\t25482 - 11904: 0xD568,\n\t25483 - 11904: 0xFCAC,\n\t25484 - 11904: 0xB478,\n\t25485 - 11904: 0xD5A5,\n\t25486 - 11904: 0xD571,\n\t25487 - 11904: 0xB1C7,\n\t25488 - 11904: 0xD574,\n\t25489 - 11904: 0xD5A4,\n\t25490 - 11904: 0xB1C6,\n\t25492 - 11904: 0xD952,\n\t25494 - 11904: 0xB1B3,\n\t25495 - 11904: 0xD56F,\n\t25496 - 11904: 0xB1B8,\n\t25497 - 11904: 0xB1C3,\n\t25499 - 11904: 0xB1BE,\n\t25500 - 11904: 0xD578,\n\t25501 - 11904: 0xD56E,\n\t25502 - 11904: 0xD56C,\n\t25503 - 11904: 0xD57E,\n\t25504 - 11904: 0xB1B0,\n\t25505 - 11904: 0xB1C4,\n\t25506 - 11904: 0xB1B4,\n\t25507 - 11904: 0xB477,\n\t25508 - 11904: 0xD57C,\n\t25509 - 11904: 0xB1B5,\n\t25511 - 11904: 0xB1B1,\n\t25512 - 11904: 0xB1C0,\n\t25513 - 11904: 0xB1BB,\n\t25514 - 11904: 0xB1B9,\n\t25515 - 11904: 0xD570,\n\t25516 - 11904: 0xB1C5,\n\t25517 - 11904: 0xD56D,\n\t25518 - 11904: 0xD57A,\n\t25519 - 11904: 0xD576,\n\t25520 - 11904: 0xD954,\n\t25521 - 11904: 0xD953,\n\t25529 - 11904: 0x9E4C,\n\t25533 - 11904: 0xD56B,\n\t25534 - 11904: 0xD964,\n\t25536 - 11904: 0xB47A,\n\t25537 - 11904: 0x8FC5,\n\t25538 - 11904: 0xD96A,\n\t25539 - 11904: 0xD959,\n\t25540 - 11904: 0xD967,\n\t25541 - 11904: 0xDD77,\n\t25542 - 11904: 0xB47D,\n\t25543 - 11904: 0xD96B,\n\t25544 - 11904: 0xD96E,\n\t25545 - 11904: 0xB47C,\n\t25546 - 11904: 0xD95C,\n\t25547 - 11904: 0xD96D,\n\t25548 - 11904: 0xD96C,\n\t25549 - 11904: 0xB47E,\n\t25550 - 11904: 0xD955,\n\t25551 - 11904: 0xB479,\n\t25552 - 11904: 0xB4A3,\n\t25553 - 11904: 0x93AD,\n\t25554 - 11904: 0xB4A1,\n\t25555 - 11904: 0xD969,\n\t25557 - 11904: 0xD95F,\n\t25558 - 11904: 0xB4A5,\n\t25559 - 11904: 0xD970,\n\t25560 - 11904: 0xD968,\n\t25561 - 11904: 0xD971,\n\t25562 - 11904: 0xB4AD,\n\t25563 - 11904: 0xB4AB,\n\t25564 - 11904: 0xD966,\n\t25565 - 11904: 0xD965,\n\t25566 - 11904: 0x9DC3,\n\t25567 - 11904: 0xD963,\n\t25568 - 11904: 0xD95D,\n\t25569 - 11904: 0xB4A4,\n\t25570 - 11904: 0x8DA2,\n\t25571 - 11904: 0xB4A2,\n\t25572 - 11904: 0xD1B9,\n\t25573 - 11904: 0xD956,\n\t25574 - 11904: 0x9D4A,\n\t25575 - 11904: 0xDDB7,\n\t25576 - 11904: 0xD957,\n\t25577 - 11904: 0xB47B,\n\t25578 - 11904: 0xB4AA,\n\t25579 - 11904: 0xDD79,\n\t25581 - 11904: 0xB4A6,\n\t25582 - 11904: 0xB4A7,\n\t25583 - 11904: 0xD958,\n\t25584 - 11904: 0xD96F,\n\t25585 - 11904: 0xDD78,\n\t25586 - 11904: 0xD960,\n\t25587 - 11904: 0xD95B,\n\t25588 - 11904: 0xB4A9,\n\t25589 - 11904: 0xD961,\n\t25590 - 11904: 0xD95E,\n\t25592 - 11904: 0xFCB6,\n\t25593 - 11904: 0xB4AE,\n\t25595 - 11904: 0x8DA3,\n\t25596 - 11904: 0x9E4B,\n\t25598 - 11904: 0x9E4D,\n\t25606 - 11904: 0xB770,\n\t25607 - 11904: 0x8DA4,\n\t25609 - 11904: 0xDD7C,\n\t25610 - 11904: 0xDDB1,\n\t25611 - 11904: 0xDDB6,\n\t25612 - 11904: 0xDDAA,\n\t25613 - 11904: 0xB76C,\n\t25614 - 11904: 0xDDBB,\n\t25615 - 11904: 0xB769,\n\t25616 - 11904: 0xDD7A,\n\t25618 - 11904: 0xDD7B,\n\t25619 - 11904: 0xB762,\n\t25620 - 11904: 0xB76B,\n\t25621 - 11904: 0xDDA4,\n\t25622 - 11904: 0xB76E,\n\t25623 - 11904: 0xB76F,\n\t25624 - 11904: 0xDDA5,\n\t25626 - 11904: 0xDDB2,\n\t25627 - 11904: 0xDDB8,\n\t25628 - 11904: 0xB76A,\n\t25630 - 11904: 0xB764,\n\t25631 - 11904: 0xDDA3,\n\t25632 - 11904: 0xDD7D,\n\t25633 - 11904: 0xDDBA,\n\t25634 - 11904: 0xDDA8,\n\t25635 - 11904: 0xDDA9,\n\t25636 - 11904: 0xDD7E,\n\t25637 - 11904: 0xDDB4,\n\t25638 - 11904: 0xDDAB,\n\t25639 - 11904: 0xDDB5,\n\t25640 - 11904: 0xDDAD,\n\t25642 - 11904: 0xB765,\n\t25643 - 11904: 0xE1D9,\n\t25644 - 11904: 0xB768,\n\t25645 - 11904: 0xB766,\n\t25646 - 11904: 0xDDB9,\n\t25647 - 11904: 0xDDB0,\n\t25648 - 11904: 0xDDAC,\n\t25650 - 11904: 0x8AFD,\n\t25651 - 11904: 0xDDA1,\n\t25652 - 11904: 0xBA53,\n\t25653 - 11904: 0xDDAF,\n\t25654 - 11904: 0xB76D,\n\t25655 - 11904: 0xDDA7,\n\t25656 - 11904: 0xFCB5,\n\t25657 - 11904: 0xDDA6,\n\t25658 - 11904: 0xFCC3,\n\t25659 - 11904: 0x93B2,\n\t25661 - 11904: 0xB767,\n\t25662 - 11904: 0xB763,\n\t25663 - 11904: 0xE1EE,\n\t25664 - 11904: 0xDDB3,\n\t25665 - 11904: 0xDDAE,\n\t25667 - 11904: 0xDDA2,\n\t25675 - 11904: 0xE1E9,\n\t25677 - 11904: 0xE1DA,\n\t25678 - 11904: 0xE1E5,\n\t25680 - 11904: 0xE1EC,\n\t25681 - 11904: 0xBA51,\n\t25682 - 11904: 0xB4AC,\n\t25683 - 11904: 0xE1EA,\n\t25684 - 11904: 0xBA4C,\n\t25688 - 11904: 0xBA4B,\n\t25689 - 11904: 0xE1F1,\n\t25690 - 11904: 0x8DA5,\n\t25691 - 11904: 0xE1DB,\n\t25692 - 11904: 0xE1E8,\n\t25693 - 11904: 0xE1DC,\n\t25694 - 11904: 0xE1E7,\n\t25695 - 11904: 0xBA4F,\n\t25696 - 11904: 0xE1EB,\n\t25697 - 11904: 0xD962,\n\t25701 - 11904: 0xE1F2,\n\t25702 - 11904: 0xE1E3,\n\t25703 - 11904: 0xBA52,\n\t25704 - 11904: 0xE5BA,\n\t25705 - 11904: 0xBCAF,\n\t25707 - 11904: 0xE1F0,\n\t25708 - 11904: 0xE1EF,\n\t25709 - 11904: 0xBA54,\n\t25710 - 11904: 0xE5AD,\n\t25711 - 11904: 0xBCB0,\n\t25712 - 11904: 0xE5AE,\n\t25713 - 11904: 0x93A1,\n\t25714 - 11904: 0xE1DF,\n\t25715 - 11904: 0xE1E0,\n\t25716 - 11904: 0xE1DD,\n\t25717 - 11904: 0xE1E2,\n\t25718 - 11904: 0xE1DE,\n\t25719 - 11904: 0xE1F3,\n\t25720 - 11904: 0xBA4E,\n\t25721 - 11904: 0xBCB1,\n\t25722 - 11904: 0xBA50,\n\t25723 - 11904: 0xBA55,\n\t25724 - 11904: 0x8AC6,\n\t25725 - 11904: 0xE1E1,\n\t25727 - 11904: 0xE1ED,\n\t25730 - 11904: 0xE1E6,\n\t25733 - 11904: 0xE5B1,\n\t25735 - 11904: 0xBA4A,\n\t25736 - 11904: 0xBCB4,\n\t25737 - 11904: 0xE9AA,\n\t25738 - 11904: 0xE5B6,\n\t25739 - 11904: 0xE5B5,\n\t25740 - 11904: 0xE5B7,\n\t25741 - 11904: 0x8A5B,\n\t25743 - 11904: 0xE5B4,\n\t25744 - 11904: 0xFCB9,\n\t25745 - 11904: 0x894D,\n\t25746 - 11904: 0xBCBB,\n\t25747 - 11904: 0xBCB8,\n\t25749 - 11904: 0xBCB9,\n\t25750 - 11904: 0xE5AF,\n\t25751 - 11904: 0xE5B2,\n\t25752 - 11904: 0xE5BC,\n\t25753 - 11904: 0xBCC1,\n\t25754 - 11904: 0xBCBF,\n\t25756 - 11904: 0xE5B3,\n\t25757 - 11904: 0xD95A,\n\t25758 - 11904: 0xBCB2,\n\t25759 - 11904: 0xE5B9,\n\t25760 - 11904: 0xE5B0,\n\t25762 - 11904: 0xBCC2,\n\t25763 - 11904: 0xE5B8,\n\t25764 - 11904: 0xBA4D,\n\t25765 - 11904: 0xBCB7,\n\t25766 - 11904: 0xE1E4,\n\t25769 - 11904: 0xBCBA,\n\t25771 - 11904: 0xBCBE,\n\t25772 - 11904: 0xBCC0,\n\t25773 - 11904: 0xBCBD,\n\t25774 - 11904: 0xBCBC,\n\t25775 - 11904: 0xFED4,\n\t25776 - 11904: 0xBCB6,\n\t25777 - 11904: 0xE5BB,\n\t25778 - 11904: 0xBCB3,\n\t25779 - 11904: 0xBCC3,\n\t25780 - 11904: 0x8A78,\n\t25782 - 11904: 0x93AB,\n\t25787 - 11904: 0xBED8,\n\t25788 - 11904: 0xBED9,\n\t25789 - 11904: 0xE9A9,\n\t25790 - 11904: 0xBEE2,\n\t25791 - 11904: 0xBEDF,\n\t25792 - 11904: 0x8DA7,\n\t25793 - 11904: 0xBED6,\n\t25794 - 11904: 0xBEDD,\n\t25795 - 11904: 0xE9AB,\n\t25796 - 11904: 0xBEDB,\n\t25797 - 11904: 0xBED5,\n\t25799 - 11904: 0xBEDC,\n\t25801 - 11904: 0xE9A8,\n\t25802 - 11904: 0xC0BB,\n\t25803 - 11904: 0xBED7,\n\t25805 - 11904: 0xBEDE,\n\t25806 - 11904: 0xC0BA,\n\t25807 - 11904: 0xE9A7,\n\t25808 - 11904: 0xE9A6,\n\t25810 - 11904: 0xBEE0,\n\t25811 - 11904: 0x9F45,\n\t25812 - 11904: 0xBEE1,\n\t25814 - 11904: 0xE9A5,\n\t25815 - 11904: 0xE9A4,\n\t25816 - 11904: 0xC0BC,\n\t25817 - 11904: 0xE9AE,\n\t25818 - 11904: 0xBEDA,\n\t25819 - 11904: 0xE9AC,\n\t25821 - 11904: 0x8A56,\n\t25824 - 11904: 0xC0BD,\n\t25825 - 11904: 0xFCBF,\n\t25826 - 11904: 0xC0C2,\n\t25827 - 11904: 0xECEA,\n\t25828 - 11904: 0xECEC,\n\t25829 - 11904: 0xFCC0,\n\t25830 - 11904: 0xC0BF,\n\t25831 - 11904: 0x8EE6,\n\t25832 - 11904: 0xECED,\n\t25833 - 11904: 0xECE9,\n\t25834 - 11904: 0x8AA4,\n\t25835 - 11904: 0xECEB,\n\t25836 - 11904: 0xC0C0,\n\t25837 - 11904: 0xC0C3,\n\t25839 - 11904: 0xECE8,\n\t25840 - 11904: 0xC0BE,\n\t25841 - 11904: 0xC0C1,\n\t25842 - 11904: 0xC259,\n\t25843 - 11904: 0xE9AD,\n\t25844 - 11904: 0xC258,\n\t25847 - 11904: 0xC25E,\n\t25848 - 11904: 0xEFD4,\n\t25850 - 11904: 0xC25C,\n\t25851 - 11904: 0xC25D,\n\t25852 - 11904: 0xEFD7,\n\t25853 - 11904: 0xEFD3,\n\t25854 - 11904: 0xC25A,\n\t25855 - 11904: 0xEFD1,\n\t25856 - 11904: 0xC36B,\n\t25857 - 11904: 0xEFD5,\n\t25859 - 11904: 0xEFD6,\n\t25860 - 11904: 0xEFD2,\n\t25862 - 11904: 0xC25B,\n\t25863 - 11904: 0xF242,\n\t25865 - 11904: 0xF245,\n\t25866 - 11904: 0x8943,\n\t25868 - 11904: 0xF246,\n\t25869 - 11904: 0xF244,\n\t25870 - 11904: 0xF247,\n\t25871 - 11904: 0xC36C,\n\t25872 - 11904: 0xF243,\n\t25873 - 11904: 0x93F3,\n\t25875 - 11904: 0xF44E,\n\t25876 - 11904: 0xC464,\n\t25877 - 11904: 0xF44D,\n\t25878 - 11904: 0xF44C,\n\t25879 - 11904: 0xF44B,\n\t25880 - 11904: 0xC463,\n\t25881 - 11904: 0xC465,\n\t25883 - 11904: 0xF5CD,\n\t25884 - 11904: 0xC4E2,\n\t25885 - 11904: 0xC4E1,\n\t25886 - 11904: 0xFCAB,\n\t25887 - 11904: 0x9EA2,\n\t25888 - 11904: 0xF6E1,\n\t25889 - 11904: 0xF6E0,\n\t25890 - 11904: 0xF6E3,\n\t25891 - 11904: 0xC5CB,\n\t25892 - 11904: 0xC575,\n\t25893 - 11904: 0xF7DD,\n\t25894 - 11904: 0xF6E2,\n\t25897 - 11904: 0xF7DC,\n\t25898 - 11904: 0xC5CD,\n\t25899 - 11904: 0xC5CC,\n\t25900 - 11904: 0xC5F3,\n\t25901 - 11904: 0xF8A9,\n\t25902 - 11904: 0xF8EF,\n\t25903 - 11904: 0xA4E4,\n\t25904 - 11904: 0x9DC7,\n\t25906 - 11904: 0xD972,\n\t25907 - 11904: 0xE9AF,\n\t25908 - 11904: 0xC6D2,\n\t25909 - 11904: 0x8BCE,\n\t25910 - 11904: 0xA6AC,\n\t25911 - 11904: 0xCAF7,\n\t25912 - 11904: 0xA7F1,\n\t25913 - 11904: 0xA7EF,\n\t25915 - 11904: 0xA7F0,\n\t25917 - 11904: 0xCCC1,\n\t25918 - 11904: 0xA9F1,\n\t25919 - 11904: 0xAC46,\n\t25921 - 11904: 0xCEE7,\n\t25923 - 11904: 0xCEE8,\n\t25925 - 11904: 0xAC47,\n\t25926 - 11904: 0xD1CE,\n\t25928 - 11904: 0xAEC4,\n\t25929 - 11904: 0xAEC5,\n\t25930 - 11904: 0xD1CD,\n\t25933 - 11904: 0xFCC5,\n\t25935 - 11904: 0xB1D3,\n\t25937 - 11904: 0xB1CF,\n\t25939 - 11904: 0xD5A7,\n\t25940 - 11904: 0xB1D6,\n\t25941 - 11904: 0xB1D5,\n\t25942 - 11904: 0xB1CE,\n\t25943 - 11904: 0xB1D1,\n\t25944 - 11904: 0xB1D4,\n\t25945 - 11904: 0xB1D0,\n\t25948 - 11904: 0xD976,\n\t25949 - 11904: 0xB1CD,\n\t25950 - 11904: 0xB4AF,\n\t25951 - 11904: 0xFCCB,\n\t25954 - 11904: 0xB4B1,\n\t25955 - 11904: 0xB4B2,\n\t25956 - 11904: 0xD975,\n\t25957 - 11904: 0xD978,\n\t25958 - 11904: 0xB4B0,\n\t25959 - 11904: 0xD973,\n\t25960 - 11904: 0xD977,\n\t25962 - 11904: 0xD974,\n\t25963 - 11904: 0x93B3,\n\t25964 - 11904: 0xB771,\n\t25965 - 11904: 0xFCCA,\n\t25967 - 11904: 0xDDBC,\n\t25970 - 11904: 0xBA56,\n\t25971 - 11904: 0xE1F4,\n\t25972 - 11904: 0xBEE3,\n\t25973 - 11904: 0xBCC4,\n\t25974 - 11904: 0xE5BD,\n\t25975 - 11904: 0xBCC5,\n\t25976 - 11904: 0xBCC6,\n\t25977 - 11904: 0xE5BF,\n\t25978 - 11904: 0xE5BE,\n\t25979 - 11904: 0xE5C0,\n\t25980 - 11904: 0xE9B1,\n\t25983 - 11904: 0xE9B0,\n\t25984 - 11904: 0xECEF,\n\t25985 - 11904: 0xECEE,\n\t25986 - 11904: 0xC0C4,\n\t25987 - 11904: 0xC0C5,\n\t25988 - 11904: 0xF248,\n\t25989 - 11904: 0xFCC9,\n\t25990 - 11904: 0x8DAC,\n\t25991 - 11904: 0xA4E5,\n\t25992 - 11904: 0xFBC6,\n\t25993 - 11904: 0x8967,\n\t25995 - 11904: 0x8C7E,\n\t25996 - 11904: 0xD979,\n\t26000 - 11904: 0xB4B4,\n\t26001 - 11904: 0xB4B3,\n\t26002 - 11904: 0xDDBD,\n\t26004 - 11904: 0xEFD8,\n\t26005 - 11904: 0xC4E3,\n\t26006 - 11904: 0xF7DE,\n\t26007 - 11904: 0xA4E6,\n\t26009 - 11904: 0xAEC6,\n\t26011 - 11904: 0xB1D8,\n\t26012 - 11904: 0xB1D7,\n\t26013 - 11904: 0xD97A,\n\t26014 - 11904: 0xD97B,\n\t26015 - 11904: 0xB772,\n\t26016 - 11904: 0xE1F5,\n\t26017 - 11904: 0xBA57,\n\t26018 - 11904: 0xE9B2,\n\t26020 - 11904: 0xA4E7,\n\t26021 - 11904: 0xA5B8,\n\t26023 - 11904: 0xA9F2,\n\t26024 - 11904: 0xCCC2,\n\t26026 - 11904: 0xCEE9,\n\t26027 - 11904: 0xAC48,\n\t26028 - 11904: 0xB1D9,\n\t26030 - 11904: 0xD97C,\n\t26031 - 11904: 0xB4B5,\n\t26032 - 11904: 0xB773,\n\t26034 - 11904: 0xE5C1,\n\t26035 - 11904: 0xE5C2,\n\t26037 - 11904: 0xFCCD,\n\t26038 - 11904: 0xECF0,\n\t26039 - 11904: 0xC25F,\n\t26040 - 11904: 0xF8F0,\n\t26041 - 11904: 0xA4E8,\n\t26043 - 11904: 0xCCC3,\n\t26044 - 11904: 0xA9F3,\n\t26045 - 11904: 0xAC49,\n\t26046 - 11904: 0x9CF3,\n\t26047 - 11904: 0xCEEA,\n\t26049 - 11904: 0xAEC7,\n\t26050 - 11904: 0xD1D2,\n\t26051 - 11904: 0xD1D0,\n\t26052 - 11904: 0xD1D1,\n\t26053 - 11904: 0xAEC8,\n\t26054 - 11904: 0xD1CF,\n\t26059 - 11904: 0xB1DB,\n\t26060 - 11904: 0xB1DC,\n\t26061 - 11904: 0xD5A8,\n\t26062 - 11904: 0xB1DD,\n\t26063 - 11904: 0xB1DA,\n\t26064 - 11904: 0xD97D,\n\t26065 - 11904: 0xFCD0,\n\t26066 - 11904: 0xD97E,\n\t26067 - 11904: 0xDDBE,\n\t26068 - 11904: 0x95BB,\n\t26070 - 11904: 0xBA59,\n\t26071 - 11904: 0xBA58,\n\t26074 - 11904: 0xECF1,\n\t26075 - 11904: 0xEFD9,\n\t26077 - 11904: 0xF24A,\n\t26078 - 11904: 0xF249,\n\t26079 - 11904: 0xF44F,\n\t26080 - 11904: 0xFCD3,\n\t26081 - 11904: 0xC95E,\n\t26082 - 11904: 0xAC4A,\n\t26083 - 11904: 0xFCD4,\n\t26085 - 11904: 0xA4E9,\n\t26086 - 11904: 0xA5B9,\n\t26088 - 11904: 0xA6AE,\n\t26089 - 11904: 0xA6AD,\n\t26092 - 11904: 0xA6AF,\n\t26093 - 11904: 0xA6B0,\n\t26094 - 11904: 0xC9EE,\n\t26095 - 11904: 0xC9ED,\n\t26096 - 11904: 0xCAF8,\n\t26097 - 11904: 0xA7F2,\n\t26098 - 11904: 0xCAFB,\n\t26099 - 11904: 0xCAFA,\n\t26100 - 11904: 0xCAF9,\n\t26101 - 11904: 0xCAFC,\n\t26106 - 11904: 0xA9F4,\n\t26107 - 11904: 0xCCC9,\n\t26108 - 11904: 0xCCC5,\n\t26109 - 11904: 0xCCCE,\n\t26111 - 11904: 0x8DAE,\n\t26112 - 11904: 0xA9FB,\n\t26114 - 11904: 0xA9F9,\n\t26115 - 11904: 0xCCCA,\n\t26116 - 11904: 0xCCC6,\n\t26117 - 11904: 0xCCCD,\n\t26118 - 11904: 0xA9F8,\n\t26119 - 11904: 0xAA40,\n\t26120 - 11904: 0xCCC8,\n\t26121 - 11904: 0xCCC4,\n\t26122 - 11904: 0xA9FE,\n\t26123 - 11904: 0xCCCB,\n\t26124 - 11904: 0xA9F7,\n\t26125 - 11904: 0xCCCC,\n\t26126 - 11904: 0xA9FA,\n\t26127 - 11904: 0xA9FC,\n\t26128 - 11904: 0xCCD0,\n\t26129 - 11904: 0xCCCF,\n\t26130 - 11904: 0xCCC7,\n\t26131 - 11904: 0xA9F6,\n\t26132 - 11904: 0xA9F5,\n\t26133 - 11904: 0xA9FD,\n\t26136 - 11904: 0xFCD7,\n\t26140 - 11904: 0xCEEF,\n\t26141 - 11904: 0xCEF5,\n\t26142 - 11904: 0x93DB,\n\t26143 - 11904: 0xAC50,\n\t26144 - 11904: 0xAC4D,\n\t26145 - 11904: 0xCEEC,\n\t26146 - 11904: 0xCEF1,\n\t26147 - 11904: 0xFE63,\n\t26148 - 11904: 0xAC53,\n\t26149 - 11904: 0xAC4B,\n\t26150 - 11904: 0xCEF0,\n\t26151 - 11904: 0xAC4E,\n\t26152 - 11904: 0xAC51,\n\t26155 - 11904: 0xCEF3,\n\t26157 - 11904: 0xAC4C,\n\t26158 - 11904: 0xCEF8,\n\t26159 - 11904: 0xAC4F,\n\t26160 - 11904: 0x93D5,\n\t26161 - 11904: 0xAC52,\n\t26162 - 11904: 0xCEED,\n\t26163 - 11904: 0xCEF2,\n\t26164 - 11904: 0xCEF6,\n\t26165 - 11904: 0xCEEE,\n\t26166 - 11904: 0xCEEB,\n\t26169 - 11904: 0xCEF7,\n\t26170 - 11904: 0xCEF4,\n\t26177 - 11904: 0xAED0,\n\t26178 - 11904: 0xAEC9,\n\t26179 - 11904: 0xAECC,\n\t26180 - 11904: 0xFCDA,\n\t26181 - 11904: 0xAECF,\n\t26183 - 11904: 0xD1D5,\n\t26184 - 11904: 0x9B71,\n\t26185 - 11904: 0xAECA,\n\t26186 - 11904: 0xD1D3,\n\t26187 - 11904: 0xFCDD,\n\t26188 - 11904: 0xAECE,\n\t26189 - 11904: 0x8764,\n\t26191 - 11904: 0xAECB,\n\t26193 - 11904: 0xD1D6,\n\t26194 - 11904: 0xAECD,\n\t26195 - 11904: 0x8DAF,\n\t26199 - 11904: 0xFAF2,\n\t26201 - 11904: 0xD5AC,\n\t26202 - 11904: 0xB1DF,\n\t26203 - 11904: 0xD5AB,\n\t26204 - 11904: 0xD5AD,\n\t26205 - 11904: 0xB1DE,\n\t26206 - 11904: 0xB1E3,\n\t26207 - 11904: 0xD1D4,\n\t26208 - 11904: 0x87B5,\n\t26209 - 11904: 0xD5AA,\n\t26210 - 11904: 0xD5AE,\n\t26211 - 11904: 0x93D8,\n\t26212 - 11904: 0xB1E0,\n\t26213 - 11904: 0xD5A9,\n\t26214 - 11904: 0xB1E2,\n\t26215 - 11904: 0xFCDF,\n\t26216 - 11904: 0xB1E1,\n\t26218 - 11904: 0xD9A7,\n\t26219 - 11904: 0x93D3,\n\t26220 - 11904: 0xD9A2,\n\t26222 - 11904: 0xB4B6,\n\t26223 - 11904: 0xB4BA,\n\t26224 - 11904: 0xB4B7,\n\t26225 - 11904: 0xD9A5,\n\t26226 - 11904: 0xD9A8,\n\t26227 - 11904: 0xFCE1,\n\t26228 - 11904: 0xFCE2,\n\t26230 - 11904: 0xB4B9,\n\t26231 - 11904: 0xB4BE,\n\t26232 - 11904: 0xDDC7,\n\t26233 - 11904: 0xD9A6,\n\t26234 - 11904: 0xB4BC,\n\t26235 - 11904: 0xD9A3,\n\t26236 - 11904: 0xD9A1,\n\t26237 - 11904: 0x8E76,\n\t26238 - 11904: 0xB4BD,\n\t26240 - 11904: 0xD9A4,\n\t26244 - 11904: 0xB779,\n\t26245 - 11904: 0xFC62,\n\t26246 - 11904: 0xDDBF,\n\t26247 - 11904: 0xB776,\n\t26248 - 11904: 0xB777,\n\t26249 - 11904: 0xB775,\n\t26250 - 11904: 0xDDC4,\n\t26251 - 11904: 0xDDC3,\n\t26252 - 11904: 0xDDC0,\n\t26253 - 11904: 0xB77B,\n\t26254 - 11904: 0x93D1,\n\t26256 - 11904: 0xDDC2,\n\t26257 - 11904: 0xB4BB,\n\t26258 - 11904: 0x8DB1,\n\t26260 - 11904: 0xDDC6,\n\t26261 - 11904: 0xDDC1,\n\t26262 - 11904: 0xB778,\n\t26263 - 11904: 0xB774,\n\t26264 - 11904: 0xB77A,\n\t26265 - 11904: 0xDDC5,\n\t26266 - 11904: 0x9859,\n\t26269 - 11904: 0xBA5C,\n\t26271 - 11904: 0xE1F8,\n\t26272 - 11904: 0xE1F7,\n\t26273 - 11904: 0xE1F6,\n\t26274 - 11904: 0xBA5A,\n\t26276 - 11904: 0xFB52,\n\t26280 - 11904: 0xBA5B,\n\t26281 - 11904: 0xE5C5,\n\t26282 - 11904: 0xE5C8,\n\t26283 - 11904: 0xBCC8,\n\t26285 - 11904: 0xFB53,\n\t26286 - 11904: 0xBCC7,\n\t26287 - 11904: 0xE5C9,\n\t26288 - 11904: 0xE5C4,\n\t26289 - 11904: 0xBCCA,\n\t26290 - 11904: 0xE5C6,\n\t26291 - 11904: 0xFB4D,\n\t26292 - 11904: 0xBCC9,\n\t26293 - 11904: 0xE5C3,\n\t26294 - 11904: 0x9CBF,\n\t26295 - 11904: 0xE5C7,\n\t26296 - 11904: 0xBEE9,\n\t26297 - 11904: 0xBEE6,\n\t26298 - 11904: 0xE9BB,\n\t26299 - 11904: 0xE9BA,\n\t26301 - 11904: 0xE9B9,\n\t26302 - 11904: 0xE9B4,\n\t26303 - 11904: 0x9B72,\n\t26304 - 11904: 0xE9B5,\n\t26308 - 11904: 0xBEE7,\n\t26310 - 11904: 0xBEE4,\n\t26311 - 11904: 0xBEE8,\n\t26312 - 11904: 0xE9B3,\n\t26313 - 11904: 0xBEE5,\n\t26314 - 11904: 0xE9B6,\n\t26315 - 11904: 0xE9B7,\n\t26316 - 11904: 0xE9BC,\n\t26317 - 11904: 0xFB50,\n\t26318 - 11904: 0x93BE,\n\t26319 - 11904: 0xE9B8,\n\t26322 - 11904: 0xECF2,\n\t26326 - 11904: 0xC0C7,\n\t26328 - 11904: 0xEFDC,\n\t26329 - 11904: 0xC0C6,\n\t26330 - 11904: 0xEFDA,\n\t26331 - 11904: 0xEFDB,\n\t26332 - 11904: 0xC260,\n\t26333 - 11904: 0xC36E,\n\t26334 - 11904: 0xF24B,\n\t26336 - 11904: 0xC36D,\n\t26339 - 11904: 0xF451,\n\t26340 - 11904: 0xF452,\n\t26342 - 11904: 0xC466,\n\t26343 - 11904: 0x8CDB,\n\t26344 - 11904: 0xF450,\n\t26345 - 11904: 0xC4E4,\n\t26347 - 11904: 0xF7DF,\n\t26348 - 11904: 0xC5CE,\n\t26349 - 11904: 0xF8AA,\n\t26350 - 11904: 0xF8AB,\n\t26352 - 11904: 0xA4EA,\n\t26353 - 11904: 0x9DF1,\n\t26354 - 11904: 0xA6B1,\n\t26355 - 11904: 0xA6B2,\n\t26356 - 11904: 0xA7F3,\n\t26358 - 11904: 0xCCD1,\n\t26359 - 11904: 0xAC54,\n\t26360 - 11904: 0xAED1,\n\t26361 - 11904: 0xB1E4,\n\t26364 - 11904: 0xB0D2,\n\t26366 - 11904: 0xB4BF,\n\t26367 - 11904: 0xB4C0,\n\t26368 - 11904: 0xB3CC,\n\t26369 - 11904: 0xD9A9,\n\t26370 - 11904: 0xFCEB,\n\t26371 - 11904: 0xB77C,\n\t26372 - 11904: 0xE1FA,\n\t26373 - 11904: 0xE1F9,\n\t26376 - 11904: 0xA4EB,\n\t26377 - 11904: 0xA6B3,\n\t26378 - 11904: 0xCCD2,\n\t26379 - 11904: 0xAA42,\n\t26380 - 11904: 0xA0BB,\n\t26381 - 11904: 0xAA41,\n\t26382 - 11904: 0x9B7E,\n\t26383 - 11904: 0xCEF9,\n\t26384 - 11904: 0xCEFA,\n\t26386 - 11904: 0xD1D7,\n\t26387 - 11904: 0xD1D8,\n\t26388 - 11904: 0xAED2,\n\t26389 - 11904: 0xAED3,\n\t26390 - 11904: 0x8DB3,\n\t26391 - 11904: 0xAED4,\n\t26392 - 11904: 0xD5AF,\n\t26393 - 11904: 0x8C52,\n\t26395 - 11904: 0xB1E6,\n\t26397 - 11904: 0xB4C2,\n\t26398 - 11904: 0x9AE8,\n\t26399 - 11904: 0xB4C1,\n\t26400 - 11904: 0xDDC8,\n\t26401 - 11904: 0xDF7A,\n\t26402 - 11904: 0xE1FB,\n\t26403 - 11904: 0xE9BD,\n\t26405 - 11904: 0x8EDC,\n\t26406 - 11904: 0xC261,\n\t26407 - 11904: 0xC467,\n\t26408 - 11904: 0xA4EC,\n\t26410 - 11904: 0xA5BC,\n\t26411 - 11904: 0xA5BD,\n\t26412 - 11904: 0xA5BB,\n\t26413 - 11904: 0xA5BE,\n\t26414 - 11904: 0xA5BA,\n\t26417 - 11904: 0xA6B6,\n\t26419 - 11904: 0xC9F6,\n\t26420 - 11904: 0xA6B5,\n\t26421 - 11904: 0xA6B7,\n\t26422 - 11904: 0x9CF9,\n\t26424 - 11904: 0xC9F1,\n\t26425 - 11904: 0xC9F0,\n\t26426 - 11904: 0xC9F3,\n\t26427 - 11904: 0xC9F2,\n\t26428 - 11904: 0xC9F5,\n\t26429 - 11904: 0xA6B4,\n\t26430 - 11904: 0xC9EF,\n\t26431 - 11904: 0xC9F4,\n\t26436 - 11904: 0xFA50,\n\t26437 - 11904: 0xCAFD,\n\t26438 - 11904: 0xA7FD,\n\t26439 - 11904: 0xCAFE,\n\t26440 - 11904: 0xCB43,\n\t26441 - 11904: 0xA7FC,\n\t26443 - 11904: 0xCB47,\n\t26444 - 11904: 0xCB42,\n\t26445 - 11904: 0xCB45,\n\t26446 - 11904: 0xA7F5,\n\t26447 - 11904: 0xA7F6,\n\t26448 - 11904: 0xA7F7,\n\t26449 - 11904: 0xA7F8,\n\t26451 - 11904: 0xA840,\n\t26453 - 11904: 0xCB41,\n\t26454 - 11904: 0xA7FA,\n\t26455 - 11904: 0xA841,\n\t26457 - 11904: 0xCB40,\n\t26458 - 11904: 0xCB46,\n\t26460 - 11904: 0xA7F9,\n\t26461 - 11904: 0xCB44,\n\t26462 - 11904: 0xFCF1,\n\t26463 - 11904: 0xA7F4,\n\t26464 - 11904: 0xA7FE,\n\t26465 - 11904: 0x98E7,\n\t26466 - 11904: 0xFCF3,\n\t26471 - 11904: 0xFCF2,\n\t26474 - 11904: 0xAA57,\n\t26475 - 11904: 0x8CCA,\n\t26476 - 11904: 0xCCD4,\n\t26477 - 11904: 0xAA43,\n\t26478 - 11904: 0x8775,\n\t26479 - 11904: 0xAA4D,\n\t26480 - 11904: 0xAA4E,\n\t26481 - 11904: 0xAA46,\n\t26482 - 11904: 0xAA58,\n\t26483 - 11904: 0xAA48,\n\t26484 - 11904: 0xCCDC,\n\t26485 - 11904: 0xAA53,\n\t26486 - 11904: 0xCCD7,\n\t26487 - 11904: 0xAA49,\n\t26488 - 11904: 0xCCE6,\n\t26489 - 11904: 0xCCE7,\n\t26490 - 11904: 0xCCDF,\n\t26491 - 11904: 0xCCD8,\n\t26492 - 11904: 0xAA56,\n\t26493 - 11904: 0xCCE4,\n\t26494 - 11904: 0xAA51,\n\t26495 - 11904: 0xAA4F,\n\t26497 - 11904: 0xCCE5,\n\t26498 - 11904: 0x87BA,\n\t26499 - 11904: 0xCCE3,\n\t26500 - 11904: 0xCCDB,\n\t26501 - 11904: 0xCCD3,\n\t26502 - 11904: 0xCCDA,\n\t26503 - 11904: 0xAA4A,\n\t26505 - 11904: 0xAA50,\n\t26507 - 11904: 0xAA44,\n\t26508 - 11904: 0xCCDE,\n\t26509 - 11904: 0xCCDD,\n\t26510 - 11904: 0xCCD5,\n\t26511 - 11904: 0x93E5,\n\t26512 - 11904: 0xAA52,\n\t26513 - 11904: 0xCCE1,\n\t26514 - 11904: 0xCCD6,\n\t26515 - 11904: 0xAA55,\n\t26516 - 11904: 0xCCE8,\n\t26517 - 11904: 0xAA45,\n\t26519 - 11904: 0xAA4C,\n\t26520 - 11904: 0xCCD9,\n\t26521 - 11904: 0xCCE2,\n\t26522 - 11904: 0xAA54,\n\t26524 - 11904: 0xAA47,\n\t26525 - 11904: 0xAA4B,\n\t26527 - 11904: 0xCCE0,\n\t26528 - 11904: 0x9A59,\n\t26532 - 11904: 0x8DB5,\n\t26540 - 11904: 0xFD4D,\n\t26542 - 11904: 0xCF5B,\n\t26543 - 11904: 0xAC5C,\n\t26544 - 11904: 0xAC69,\n\t26545 - 11904: 0xFD5E,\n\t26546 - 11904: 0xCF56,\n\t26547 - 11904: 0xCF4C,\n\t26548 - 11904: 0xAC62,\n\t26549 - 11904: 0xCF4A,\n\t26550 - 11904: 0xAC5B,\n\t26551 - 11904: 0xCF45,\n\t26552 - 11904: 0xAC65,\n\t26553 - 11904: 0xCF52,\n\t26554 - 11904: 0xCEFE,\n\t26555 - 11904: 0xCF41,\n\t26559 - 11904: 0x8F7D,\n\t26560 - 11904: 0xCF44,\n\t26561 - 11904: 0xCEFB,\n\t26562 - 11904: 0xCF51,\n\t26563 - 11904: 0xCF61,\n\t26564 - 11904: 0xAC60,\n\t26565 - 11904: 0xCF46,\n\t26566 - 11904: 0xCF58,\n\t26568 - 11904: 0xCEFD,\n\t26569 - 11904: 0xCF5F,\n\t26570 - 11904: 0xCF60,\n\t26571 - 11904: 0xCF63,\n\t26572 - 11904: 0xCF5A,\n\t26573 - 11904: 0xCF4B,\n\t26574 - 11904: 0xCF53,\n\t26575 - 11904: 0xAC66,\n\t26576 - 11904: 0xAC59,\n\t26577 - 11904: 0xAC61,\n\t26578 - 11904: 0xAC6D,\n\t26579 - 11904: 0xAC56,\n\t26580 - 11904: 0xAC58,\n\t26582 - 11904: 0x9547,\n\t26583 - 11904: 0xFCF6,\n\t26584 - 11904: 0xCF43,\n\t26585 - 11904: 0xAC6A,\n\t26586 - 11904: 0xAC63,\n\t26587 - 11904: 0xCF5D,\n\t26588 - 11904: 0xCF40,\n\t26589 - 11904: 0xAC6C,\n\t26590 - 11904: 0xAC67,\n\t26591 - 11904: 0xCF49,\n\t26594 - 11904: 0xAC6B,\n\t26595 - 11904: 0xCF50,\n\t26596 - 11904: 0xCF48,\n\t26597 - 11904: 0xAC64,\n\t26598 - 11904: 0xCF5C,\n\t26599 - 11904: 0xCF54,\n\t26601 - 11904: 0xAC5E,\n\t26602 - 11904: 0xCF62,\n\t26603 - 11904: 0xCF47,\n\t26604 - 11904: 0xAC5A,\n\t26605 - 11904: 0xCF59,\n\t26606 - 11904: 0xCF4F,\n\t26607 - 11904: 0xAC5F,\n\t26608 - 11904: 0xCF55,\n\t26609 - 11904: 0xAC57,\n\t26610 - 11904: 0xCEFC,\n\t26611 - 11904: 0xAC68,\n\t26612 - 11904: 0xAEE3,\n\t26613 - 11904: 0xAC5D,\n\t26614 - 11904: 0xCF4E,\n\t26615 - 11904: 0xCF4D,\n\t26616 - 11904: 0xCF42,\n\t26617 - 11904: 0x9250,\n\t26618 - 11904: 0xCF5E,\n\t26620 - 11904: 0xCF57,\n\t26622 - 11904: 0x8968,\n\t26623 - 11904: 0xAC55,\n\t26624 - 11904: 0x8DB6,\n\t26625 - 11904: 0xFCFB,\n\t26626 - 11904: 0xA07D,\n\t26627 - 11904: 0x98FC,\n\t26628 - 11904: 0x8969,\n\t26637 - 11904: 0xFE4F,\n\t26640 - 11904: 0x9256,\n\t26642 - 11904: 0xD1EC,\n\t26643 - 11904: 0xAEEA,\n\t26644 - 11904: 0xD1ED,\n\t26646 - 11904: 0xD1E1,\n\t26647 - 11904: 0xAEDF,\n\t26648 - 11904: 0xAEEB,\n\t26650 - 11904: 0xD1DA,\n\t26651 - 11904: 0xFAC9,\n\t26652 - 11904: 0xD1E3,\n\t26653 - 11904: 0xD1EB,\n\t26654 - 11904: 0x93E8,\n\t26655 - 11904: 0xD1D9,\n\t26656 - 11904: 0xD1F4,\n\t26657 - 11904: 0xAED5,\n\t26658 - 11904: 0xFCF8,\n\t26661 - 11904: 0xD1F3,\n\t26662 - 11904: 0xD1EE,\n\t26664 - 11904: 0xD1EF,\n\t26665 - 11904: 0xAEDD,\n\t26666 - 11904: 0xAEE8,\n\t26667 - 11904: 0xD1E5,\n\t26669 - 11904: 0xD1E6,\n\t26670 - 11904: 0xD1F0,\n\t26671 - 11904: 0xD1E7,\n\t26673 - 11904: 0xD1E2,\n\t26674 - 11904: 0xD1DC,\n\t26675 - 11904: 0xD1DD,\n\t26676 - 11904: 0xD1EA,\n\t26677 - 11904: 0xD1E4,\n\t26678 - 11904: 0x9CE3,\n\t26679 - 11904: 0xFDA9,\n\t26680 - 11904: 0xAED6,\n\t26681 - 11904: 0xAEDA,\n\t26682 - 11904: 0xD1F2,\n\t26683 - 11904: 0xD1DE,\n\t26684 - 11904: 0xAEE6,\n\t26685 - 11904: 0xAEE2,\n\t26686 - 11904: 0xFC44,\n\t26688 - 11904: 0xAEE5,\n\t26689 - 11904: 0xAEEC,\n\t26690 - 11904: 0xAEDB,\n\t26691 - 11904: 0xAEE7,\n\t26692 - 11904: 0xD1E9,\n\t26693 - 11904: 0xAEE9,\n\t26694 - 11904: 0xAED8,\n\t26695 - 11904: 0x9640,\n\t26696 - 11904: 0xAED7,\n\t26697 - 11904: 0xD1DB,\n\t26698 - 11904: 0x8DB8,\n\t26699 - 11904: 0xD1DF,\n\t26700 - 11904: 0xAEE0,\n\t26701 - 11904: 0xD1F1,\n\t26702 - 11904: 0xD1E8,\n\t26703 - 11904: 0xD1E0,\n\t26704 - 11904: 0xAEE4,\n\t26705 - 11904: 0xAEE1,\n\t26707 - 11904: 0xAED9,\n\t26708 - 11904: 0xAEDC,\n\t26709 - 11904: 0x9B4A,\n\t26710 - 11904: 0x8FB9,\n\t26717 - 11904: 0xFCFE,\n\t26725 - 11904: 0x896A,\n\t26731 - 11904: 0xD5C4,\n\t26733 - 11904: 0xD5B4,\n\t26734 - 11904: 0xD5B5,\n\t26735 - 11904: 0xD5B9,\n\t26737 - 11904: 0xD5C8,\n\t26738 - 11904: 0xD5C5,\n\t26740 - 11904: 0xD5BE,\n\t26741 - 11904: 0xD5BD,\n\t26742 - 11904: 0xB1ED,\n\t26743 - 11904: 0xD5C1,\n\t26744 - 11904: 0xD5D0,\n\t26745 - 11904: 0xD5B0,\n\t26747 - 11904: 0xD5D1,\n\t26748 - 11904: 0xD5C3,\n\t26749 - 11904: 0xD5D5,\n\t26750 - 11904: 0xD5C9,\n\t26751 - 11904: 0xB1EC,\n\t26752 - 11904: 0xD5C7,\n\t26753 - 11904: 0xB1E7,\n\t26754 - 11904: 0xB1FC,\n\t26755 - 11904: 0xB1F2,\n\t26756 - 11904: 0x8DB9,\n\t26757 - 11904: 0xB1F6,\n\t26758 - 11904: 0xB1F5,\n\t26759 - 11904: 0xD5B1,\n\t26760 - 11904: 0x917E,\n\t26761 - 11904: 0xD5CE,\n\t26762 - 11904: 0xD5D4,\n\t26763 - 11904: 0xD5CC,\n\t26764 - 11904: 0xD5D3,\n\t26767 - 11904: 0xD5C0,\n\t26768 - 11904: 0xD5B2,\n\t26769 - 11904: 0xD5D2,\n\t26770 - 11904: 0xD5C2,\n\t26771 - 11904: 0xB1EA,\n\t26772 - 11904: 0xB1F7,\n\t26774 - 11904: 0xD5CB,\n\t26775 - 11904: 0xB1F0,\n\t26776 - 11904: 0x93F4,\n\t26779 - 11904: 0xD5CA,\n\t26780 - 11904: 0xD5B3,\n\t26781 - 11904: 0xB1F8,\n\t26783 - 11904: 0xB1FA,\n\t26784 - 11904: 0xD5CD,\n\t26785 - 11904: 0xB1FB,\n\t26786 - 11904: 0xB1E9,\n\t26787 - 11904: 0xD5BA,\n\t26788 - 11904: 0xD5CF,\n\t26790 - 11904: 0xFB7C,\n\t26791 - 11904: 0xB1EF,\n\t26792 - 11904: 0xB1F9,\n\t26793 - 11904: 0xD5BC,\n\t26794 - 11904: 0xD5C6,\n\t26795 - 11904: 0xD5B7,\n\t26796 - 11904: 0xD5BB,\n\t26797 - 11904: 0xB1F4,\n\t26798 - 11904: 0xD5B6,\n\t26799 - 11904: 0xB1E8,\n\t26800 - 11904: 0xB1F1,\n\t26801 - 11904: 0xB1EE,\n\t26802 - 11904: 0xD5BF,\n\t26803 - 11904: 0xAEDE,\n\t26804 - 11904: 0xD9C0,\n\t26805 - 11904: 0xB1EB,\n\t26806 - 11904: 0x93E7,\n\t26809 - 11904: 0x97EF,\n\t26813 - 11904: 0xFE4A,\n\t26819 - 11904: 0xFD45,\n\t26820 - 11904: 0xB1F3,\n\t26821 - 11904: 0x96A5,\n\t26822 - 11904: 0xD9C3,\n\t26823 - 11904: 0xD9D9,\n\t26824 - 11904: 0xD9CE,\n\t26825 - 11904: 0xB4D6,\n\t26826 - 11904: 0xFEE0,\n\t26827 - 11904: 0xB4D1,\n\t26828 - 11904: 0xD9BD,\n\t26829 - 11904: 0xB4D2,\n\t26830 - 11904: 0xD9CD,\n\t26832 - 11904: 0xD9C6,\n\t26833 - 11904: 0xD9D3,\n\t26834 - 11904: 0xB4CE,\n\t26835 - 11904: 0xD9AB,\n\t26836 - 11904: 0xD9D5,\n\t26837 - 11904: 0xB4C4,\n\t26838 - 11904: 0xD9B3,\n\t26839 - 11904: 0xB4C7,\n\t26840 - 11904: 0xB4C6,\n\t26842 - 11904: 0xB4D7,\n\t26844 - 11904: 0xD9AD,\n\t26845 - 11904: 0xD9CF,\n\t26846 - 11904: 0xD9D0,\n\t26847 - 11904: 0xB4C9,\n\t26848 - 11904: 0xB4C5,\n\t26849 - 11904: 0xD9BB,\n\t26851 - 11904: 0xB4D0,\n\t26852 - 11904: 0xD9B6,\n\t26854 - 11904: 0xD9D1,\n\t26855 - 11904: 0xB4CC,\n\t26856 - 11904: 0xD9C9,\n\t26857 - 11904: 0xD9D6,\n\t26858 - 11904: 0xD9B0,\n\t26859 - 11904: 0xD9B5,\n\t26860 - 11904: 0xD9AF,\n\t26862 - 11904: 0xB4CB,\n\t26863 - 11904: 0xD9C2,\n\t26864 - 11904: 0xDDDE,\n\t26865 - 11904: 0xD9B1,\n\t26866 - 11904: 0xB4CF,\n\t26867 - 11904: 0xD9BA,\n\t26868 - 11904: 0xD9D2,\n\t26869 - 11904: 0xB4CA,\n\t26870 - 11904: 0xD9B7,\n\t26871 - 11904: 0xD9B4,\n\t26872 - 11904: 0xD9C5,\n\t26873 - 11904: 0xB4CD,\n\t26874 - 11904: 0xB4C3,\n\t26875 - 11904: 0xB4D9,\n\t26876 - 11904: 0xD9C8,\n\t26877 - 11904: 0xD9C7,\n\t26880 - 11904: 0xFD48,\n\t26881 - 11904: 0xFD47,\n\t26882 - 11904: 0xFEF2,\n\t26883 - 11904: 0xFE6A,\n\t26884 - 11904: 0xD9AC,\n\t26885 - 11904: 0xB4C8,\n\t26886 - 11904: 0xD9D4,\n\t26887 - 11904: 0xD9BC,\n\t26888 - 11904: 0xD9BE,\n\t26889 - 11904: 0x8DBD,\n\t26890 - 11904: 0xD9CB,\n\t26891 - 11904: 0xD9CA,\n\t26892 - 11904: 0xD9AA,\n\t26893 - 11904: 0xB4D3,\n\t26894 - 11904: 0xB4D5,\n\t26895 - 11904: 0xD9B2,\n\t26896 - 11904: 0xD9B9,\n\t26897 - 11904: 0xD9C1,\n\t26898 - 11904: 0xB4D4,\n\t26899 - 11904: 0xD9B8,\n\t26900 - 11904: 0xD9C4,\n\t26901 - 11904: 0xD9D7,\n\t26903 - 11904: 0xD9CC,\n\t26904 - 11904: 0x9BA1,\n\t26905 - 11904: 0x8CA2,\n\t26906 - 11904: 0x9AB7,\n\t26907 - 11904: 0x8EFC,\n\t26917 - 11904: 0xD9D8,\n\t26922 - 11904: 0xD9AE,\n\t26924 - 11904: 0x9FA1,\n\t26927 - 11904: 0xDDF2,\n\t26928 - 11904: 0xB7A6,\n\t26930 - 11904: 0xDDF0,\n\t26931 - 11904: 0xDDDB,\n\t26932 - 11904: 0xDDE0,\n\t26933 - 11904: 0xDDD9,\n\t26934 - 11904: 0xFD51,\n\t26935 - 11904: 0xDDEC,\n\t26936 - 11904: 0xDDCB,\n\t26937 - 11904: 0xDDD2,\n\t26939 - 11904: 0xDDEA,\n\t26940 - 11904: 0xDDF4,\n\t26941 - 11904: 0xDDDC,\n\t26942 - 11904: 0xFAAD,\n\t26943 - 11904: 0xDDCF,\n\t26944 - 11904: 0xDDE2,\n\t26945 - 11904: 0xDDE7,\n\t26946 - 11904: 0xDDD3,\n\t26947 - 11904: 0x8DBE,\n\t26948 - 11904: 0xDDE4,\n\t26949 - 11904: 0xDDD0,\n\t26950 - 11904: 0x89A4,\n\t26952 - 11904: 0xDDD7,\n\t26953 - 11904: 0xDDD8,\n\t26954 - 11904: 0xB7A8,\n\t26955 - 11904: 0xDDEB,\n\t26956 - 11904: 0xDDE9,\n\t26958 - 11904: 0xDDCC,\n\t26959 - 11904: 0xDDEE,\n\t26961 - 11904: 0xDDEF,\n\t26962 - 11904: 0xDDF1,\n\t26963 - 11904: 0xB7AC,\n\t26964 - 11904: 0xB7A4,\n\t26965 - 11904: 0x9AD9,\n\t26966 - 11904: 0xD5B8,\n\t26967 - 11904: 0xDDD4,\n\t26968 - 11904: 0xDDE6,\n\t26969 - 11904: 0xDDD5,\n\t26970 - 11904: 0xB7A1,\n\t26971 - 11904: 0xB7B1,\n\t26972 - 11904: 0xDDED,\n\t26973 - 11904: 0xB7AF,\n\t26974 - 11904: 0xB7AB,\n\t26975 - 11904: 0xDDCA,\n\t26976 - 11904: 0xB7A3,\n\t26977 - 11904: 0xFD4E,\n\t26978 - 11904: 0xDDCD,\n\t26979 - 11904: 0xB7B0,\n\t26980 - 11904: 0x8DC0,\n\t26981 - 11904: 0xDDDD,\n\t26982 - 11904: 0xDDC9,\n\t26983 - 11904: 0x97F0,\n\t26984 - 11904: 0xB7A9,\n\t26985 - 11904: 0xDDE1,\n\t26986 - 11904: 0xDDD1,\n\t26987 - 11904: 0xB7AA,\n\t26988 - 11904: 0xDDDA,\n\t26989 - 11904: 0xB77E,\n\t26990 - 11904: 0xB4D8,\n\t26991 - 11904: 0xDDE3,\n\t26992 - 11904: 0xD9BF,\n\t26993 - 11904: 0xDDCE,\n\t26994 - 11904: 0x93B4,\n\t26995 - 11904: 0xFD44,\n\t26996 - 11904: 0xDDE8,\n\t26997 - 11904: 0xB7A5,\n\t26998 - 11904: 0xDDE5,\n\t26999 - 11904: 0xB7A2,\n\t27000 - 11904: 0xDDDF,\n\t27001 - 11904: 0xB7AD,\n\t27002 - 11904: 0xDDD6,\n\t27003 - 11904: 0xDDF3,\n\t27008 - 11904: 0x9FA7,\n\t27010 - 11904: 0xB7A7,\n\t27011 - 11904: 0xDEC6,\n\t27013 - 11904: 0x8DC2,\n\t27014 - 11904: 0xB7AE,\n\t27018 - 11904: 0x99B6,\n\t27021 - 11904: 0xE24A,\n\t27022 - 11904: 0xE248,\n\t27024 - 11904: 0xE25E,\n\t27025 - 11904: 0xE246,\n\t27027 - 11904: 0xE258,\n\t27028 - 11904: 0xB77D,\n\t27029 - 11904: 0xBA5F,\n\t27030 - 11904: 0xE242,\n\t27031 - 11904: 0xE25D,\n\t27032 - 11904: 0xFD52,\n\t27033 - 11904: 0xE247,\n\t27034 - 11904: 0xE255,\n\t27035 - 11904: 0xBA64,\n\t27036 - 11904: 0xBA5D,\n\t27038 - 11904: 0xE25B,\n\t27039 - 11904: 0x8DC1,\n\t27040 - 11904: 0xE240,\n\t27041 - 11904: 0xE25A,\n\t27042 - 11904: 0x8E46,\n\t27043 - 11904: 0xBA6F,\n\t27044 - 11904: 0xE251,\n\t27045 - 11904: 0xE261,\n\t27046 - 11904: 0xBA6D,\n\t27047 - 11904: 0xE249,\n\t27048 - 11904: 0xBA5E,\n\t27049 - 11904: 0xE24B,\n\t27050 - 11904: 0xE259,\n\t27051 - 11904: 0xBA67,\n\t27052 - 11904: 0xE244,\n\t27053 - 11904: 0xBA6B,\n\t27054 - 11904: 0xBA61,\n\t27055 - 11904: 0xE24D,\n\t27056 - 11904: 0xE243,\n\t27057 - 11904: 0xE1FC,\n\t27058 - 11904: 0xA0D1,\n\t27059 - 11904: 0xE257,\n\t27060 - 11904: 0xBA68,\n\t27061 - 11904: 0xE260,\n\t27062 - 11904: 0xE1FD,\n\t27063 - 11904: 0xBA65,\n\t27065 - 11904: 0xE253,\n\t27067 - 11904: 0xBA66,\n\t27068 - 11904: 0xE245,\n\t27069 - 11904: 0xE250,\n\t27070 - 11904: 0xE24C,\n\t27071 - 11904: 0xE24E,\n\t27072 - 11904: 0x9FCA,\n\t27073 - 11904: 0xBA60,\n\t27074 - 11904: 0xE25F,\n\t27075 - 11904: 0xBA6E,\n\t27076 - 11904: 0xE24F,\n\t27078 - 11904: 0xE262,\n\t27081 - 11904: 0xE1FE,\n\t27082 - 11904: 0xE254,\n\t27083 - 11904: 0xBA63,\n\t27084 - 11904: 0xBA6C,\n\t27085 - 11904: 0xBA6A,\n\t27086 - 11904: 0xE241,\n\t27087 - 11904: 0xE256,\n\t27088 - 11904: 0xBA69,\n\t27089 - 11904: 0x92CF,\n\t27091 - 11904: 0xBA62,\n\t27092 - 11904: 0xE252,\n\t27093 - 11904: 0x9CF4,\n\t27094 - 11904: 0x8DC4,\n\t27097 - 11904: 0xE25C,\n\t27105 - 11904: 0xFD41,\n\t27106 - 11904: 0xE5D5,\n\t27108 - 11904: 0xE5D1,\n\t27109 - 11904: 0xE5CD,\n\t27110 - 11904: 0xE5E1,\n\t27111 - 11904: 0xE5DE,\n\t27112 - 11904: 0xBCCD,\n\t27113 - 11904: 0x9B4C,\n\t27115 - 11904: 0xE5E5,\n\t27116 - 11904: 0xE5D4,\n\t27117 - 11904: 0xBCD8,\n\t27118 - 11904: 0xE5DB,\n\t27121 - 11904: 0xE5D0,\n\t27122 - 11904: 0xE5DA,\n\t27123 - 11904: 0xBCD5,\n\t27124 - 11904: 0xE5EE,\n\t27126 - 11904: 0xE5EB,\n\t27127 - 11904: 0xE5DD,\n\t27128 - 11904: 0xE5CE,\n\t27129 - 11904: 0xFD57,\n\t27130 - 11904: 0xFCEF,\n\t27131 - 11904: 0xE5E2,\n\t27132 - 11904: 0xE5E4,\n\t27133 - 11904: 0xBCD1,\n\t27134 - 11904: 0xE5D8,\n\t27135 - 11904: 0xE5D3,\n\t27136 - 11904: 0xE5CA,\n\t27137 - 11904: 0xBCCE,\n\t27138 - 11904: 0xBCD6,\n\t27139 - 11904: 0x9CDE,\n\t27140 - 11904: 0xE5E7,\n\t27141 - 11904: 0xBCD7,\n\t27142 - 11904: 0xE5CB,\n\t27143 - 11904: 0xE5ED,\n\t27144 - 11904: 0xE5E0,\n\t27145 - 11904: 0xE5E6,\n\t27146 - 11904: 0xBCD4,\n\t27147 - 11904: 0xFD42,\n\t27148 - 11904: 0x986C,\n\t27149 - 11904: 0xE5E3,\n\t27151 - 11904: 0xE5EA,\n\t27153 - 11904: 0xBCD9,\n\t27155 - 11904: 0xBCD3,\n\t27156 - 11904: 0xE5DC,\n\t27157 - 11904: 0xE5CF,\n\t27158 - 11904: 0xE5EF,\n\t27159 - 11904: 0xE5CC,\n\t27160 - 11904: 0xE5E8,\n\t27161 - 11904: 0xBCD0,\n\t27162 - 11904: 0x97F9,\n\t27163 - 11904: 0xE5D6,\n\t27164 - 11904: 0x9558,\n\t27165 - 11904: 0xE5D7,\n\t27166 - 11904: 0xBCCF,\n\t27167 - 11904: 0xBCCC,\n\t27168 - 11904: 0xE5D2,\n\t27169 - 11904: 0xBCD2,\n\t27171 - 11904: 0xBCCB,\n\t27173 - 11904: 0xE5E9,\n\t27174 - 11904: 0xE5EC,\n\t27175 - 11904: 0xE5D9,\n\t27176 - 11904: 0xE9CA,\n\t27177 - 11904: 0x87B6,\n\t27179 - 11904: 0x985E,\n\t27180 - 11904: 0xFE7B,\n\t27181 - 11904: 0x94CD,\n\t27186 - 11904: 0xE9C2,\n\t27187 - 11904: 0x93EE,\n\t27188 - 11904: 0xE9BE,\n\t27189 - 11904: 0xBEF6,\n\t27192 - 11904: 0xBEEB,\n\t27193 - 11904: 0xBEF0,\n\t27194 - 11904: 0xBEEC,\n\t27195 - 11904: 0xE9CC,\n\t27196 - 11904: 0xE9D7,\n\t27197 - 11904: 0xBEEA,\n\t27198 - 11904: 0xE9C4,\n\t27199 - 11904: 0xE9CD,\n\t27200 - 11904: 0xE5DF,\n\t27201 - 11904: 0xE9CE,\n\t27203 - 11904: 0x8CA3,\n\t27204 - 11904: 0xBEF1,\n\t27205 - 11904: 0xFD5A,\n\t27206 - 11904: 0xE9DD,\n\t27207 - 11904: 0xBEF5,\n\t27208 - 11904: 0xBEF8,\n\t27209 - 11904: 0xE9C0,\n\t27211 - 11904: 0xBEF4,\n\t27212 - 11904: 0x93F5,\n\t27213 - 11904: 0xE9DB,\n\t27214 - 11904: 0xE9DC,\n\t27215 - 11904: 0xE9D2,\n\t27216 - 11904: 0xE9D1,\n\t27217 - 11904: 0xE9C9,\n\t27218 - 11904: 0x93EF,\n\t27219 - 11904: 0x8EEA,\n\t27220 - 11904: 0xE9D3,\n\t27221 - 11904: 0xE9DA,\n\t27222 - 11904: 0xE9D9,\n\t27223 - 11904: 0x8F5B,\n\t27224 - 11904: 0xBEEF,\n\t27225 - 11904: 0xBEED,\n\t27226 - 11904: 0xE9CB,\n\t27227 - 11904: 0xE9C8,\n\t27229 - 11904: 0xE9C5,\n\t27230 - 11904: 0xE9D8,\n\t27231 - 11904: 0xBEF7,\n\t27232 - 11904: 0xE9D6,\n\t27233 - 11904: 0xBEF3,\n\t27234 - 11904: 0xBEF2,\n\t27235 - 11904: 0x8C5E,\n\t27236 - 11904: 0xE9D0,\n\t27237 - 11904: 0x8DC6,\n\t27238 - 11904: 0xE9BF,\n\t27239 - 11904: 0xE9C1,\n\t27240 - 11904: 0xE9C3,\n\t27241 - 11904: 0xE9D5,\n\t27242 - 11904: 0xE9CF,\n\t27243 - 11904: 0xBEEE,\n\t27245 - 11904: 0xE9C6,\n\t27247 - 11904: 0xE9D4,\n\t27249 - 11904: 0x8DC8,\n\t27252 - 11904: 0x8DC7,\n\t27254 - 11904: 0xE9C7,\n\t27258 - 11904: 0x93F7,\n\t27262 - 11904: 0xC0CF,\n\t27263 - 11904: 0xED45,\n\t27264 - 11904: 0xC0C8,\n\t27265 - 11904: 0xECF5,\n\t27266 - 11904: 0x8DC9,\n\t27267 - 11904: 0xED41,\n\t27268 - 11904: 0xC0CA,\n\t27269 - 11904: 0xED48,\n\t27271 - 11904: 0xECFC,\n\t27273 - 11904: 0xECF7,\n\t27274 - 11904: 0xFBF2,\n\t27276 - 11904: 0xED49,\n\t27277 - 11904: 0xECF3,\n\t27278 - 11904: 0xECFE,\n\t27279 - 11904: 0x9670,\n\t27280 - 11904: 0xC0D1,\n\t27281 - 11904: 0xED44,\n\t27282 - 11904: 0xED4A,\n\t27283 - 11904: 0xECFD,\n\t27284 - 11904: 0xC0C9,\n\t27285 - 11904: 0xED40,\n\t27286 - 11904: 0xECF4,\n\t27287 - 11904: 0xC0D0,\n\t27289 - 11904: 0x8DCB,\n\t27290 - 11904: 0xED47,\n\t27291 - 11904: 0xECF9,\n\t27292 - 11904: 0xC0CC,\n\t27293 - 11904: 0xFD5C,\n\t27294 - 11904: 0xECFB,\n\t27295 - 11904: 0xECF8,\n\t27296 - 11904: 0xC0D2,\n\t27297 - 11904: 0xECFA,\n\t27298 - 11904: 0xC0CB,\n\t27299 - 11904: 0xC0CE,\n\t27300 - 11904: 0xED43,\n\t27301 - 11904: 0xECF6,\n\t27302 - 11904: 0xED46,\n\t27303 - 11904: 0x8F65,\n\t27304 - 11904: 0xED42,\n\t27307 - 11904: 0x8DCD,\n\t27308 - 11904: 0xC263,\n\t27309 - 11904: 0xEFE7,\n\t27310 - 11904: 0xC268,\n\t27311 - 11904: 0xC269,\n\t27313 - 11904: 0x9DA8,\n\t27314 - 11904: 0x94F9,\n\t27315 - 11904: 0xC262,\n\t27316 - 11904: 0xEFE6,\n\t27317 - 11904: 0x8DCE,\n\t27318 - 11904: 0xEFE3,\n\t27319 - 11904: 0xEFE4,\n\t27320 - 11904: 0xC266,\n\t27321 - 11904: 0xEFDE,\n\t27322 - 11904: 0xEFE2,\n\t27323 - 11904: 0xC265,\n\t27325 - 11904: 0xEFDF,\n\t27326 - 11904: 0x93EA,\n\t27330 - 11904: 0xC267,\n\t27331 - 11904: 0xC264,\n\t27333 - 11904: 0xEFDD,\n\t27334 - 11904: 0xEFE1,\n\t27335 - 11904: 0xEFE5,\n\t27336 - 11904: 0xFD5F,\n\t27337 - 11904: 0x93F0,\n\t27338 - 11904: 0x9FB6,\n\t27339 - 11904: 0xF251,\n\t27340 - 11904: 0xF24E,\n\t27341 - 11904: 0xF257,\n\t27343 - 11904: 0xF256,\n\t27344 - 11904: 0xF254,\n\t27345 - 11904: 0xF24F,\n\t27347 - 11904: 0xC372,\n\t27348 - 11904: 0x8DCF,\n\t27352 - 11904: 0x9763,\n\t27353 - 11904: 0xF250,\n\t27354 - 11904: 0xC371,\n\t27355 - 11904: 0xC0CD,\n\t27356 - 11904: 0xF253,\n\t27357 - 11904: 0xC370,\n\t27358 - 11904: 0xF258,\n\t27359 - 11904: 0xF252,\n\t27360 - 11904: 0xF24D,\n\t27361 - 11904: 0xEFE0,\n\t27365 - 11904: 0xC36F,\n\t27367 - 11904: 0xF24C,\n\t27368 - 11904: 0xF456,\n\t27370 - 11904: 0xF455,\n\t27371 - 11904: 0xF255,\n\t27372 - 11904: 0xC468,\n\t27374 - 11904: 0xF459,\n\t27375 - 11904: 0xF45A,\n\t27376 - 11904: 0xF454,\n\t27377 - 11904: 0xF458,\n\t27379 - 11904: 0xF453,\n\t27382 - 11904: 0x8DD0,\n\t27384 - 11904: 0xF5D1,\n\t27385 - 11904: 0xF457,\n\t27386 - 11904: 0xC4E7,\n\t27387 - 11904: 0xC4E5,\n\t27388 - 11904: 0xF5CF,\n\t27392 - 11904: 0xF5D2,\n\t27394 - 11904: 0xF5CE,\n\t27395 - 11904: 0xF5D0,\n\t27396 - 11904: 0xC4E6,\n\t27397 - 11904: 0x93F1,\n\t27400 - 11904: 0xF6E5,\n\t27401 - 11904: 0xF6E6,\n\t27402 - 11904: 0xC576,\n\t27403 - 11904: 0xF6E4,\n\t27407 - 11904: 0xF7E2,\n\t27408 - 11904: 0xC5CF,\n\t27409 - 11904: 0xF7E0,\n\t27410 - 11904: 0xF7E1,\n\t27411 - 11904: 0xF8AC,\n\t27414 - 11904: 0xC656,\n\t27415 - 11904: 0xF8F3,\n\t27416 - 11904: 0xF8F1,\n\t27417 - 11904: 0xF8F2,\n\t27418 - 11904: 0xF8F4,\n\t27421 - 11904: 0xFD62,\n\t27422 - 11904: 0xF9BB,\n\t27424 - 11904: 0xA4ED,\n\t27425 - 11904: 0xA6B8,\n\t27427 - 11904: 0xAA59,\n\t27429 - 11904: 0xCCE9,\n\t27432 - 11904: 0xCF64,\n\t27436 - 11904: 0xD1F5,\n\t27437 - 11904: 0xD1F7,\n\t27439 - 11904: 0xD1F6,\n\t27441 - 11904: 0xD1F8,\n\t27442 - 11904: 0xB1FD,\n\t27443 - 11904: 0xD5D7,\n\t27444 - 11904: 0xD1F9,\n\t27445 - 11904: 0xFD65,\n\t27446 - 11904: 0xD5D6,\n\t27447 - 11904: 0xD5D8,\n\t27448 - 11904: 0xD5D9,\n\t27449 - 11904: 0xD9DA,\n\t27450 - 11904: 0xB4DB,\n\t27451 - 11904: 0xD9DB,\n\t27452 - 11904: 0xD9DD,\n\t27453 - 11904: 0xB4DC,\n\t27454 - 11904: 0xB4DA,\n\t27455 - 11904: 0xD9DC,\n\t27457 - 11904: 0xDDFA,\n\t27458 - 11904: 0xDDF8,\n\t27459 - 11904: 0xDDF7,\n\t27461 - 11904: 0xDDF6,\n\t27462 - 11904: 0xDDF5,\n\t27463 - 11904: 0xB7B2,\n\t27464 - 11904: 0xDDF9,\n\t27465 - 11904: 0xBA70,\n\t27466 - 11904: 0xE263,\n\t27467 - 11904: 0xE265,\n\t27468 - 11904: 0xBA71,\n\t27469 - 11904: 0xE264,\n\t27470 - 11904: 0xBCDB,\n\t27472 - 11904: 0xBCDA,\n\t27473 - 11904: 0xE5F0,\n\t27474 - 11904: 0x9FDB,\n\t27476 - 11904: 0xE9DF,\n\t27477 - 11904: 0xE9DE,\n\t27478 - 11904: 0xE9E0,\n\t27479 - 11904: 0x93F8,\n\t27481 - 11904: 0xBEF9,\n\t27483 - 11904: 0xED4B,\n\t27484 - 11904: 0xC0D3,\n\t27486 - 11904: 0xEFE8,\n\t27487 - 11904: 0xC26A,\n\t27488 - 11904: 0xF259,\n\t27489 - 11904: 0xC577,\n\t27490 - 11904: 0xA4EE,\n\t27491 - 11904: 0xA5BF,\n\t27492 - 11904: 0xA6B9,\n\t27493 - 11904: 0xA842,\n\t27494 - 11904: 0xAA5A,\n\t27495 - 11904: 0xAA5B,\n\t27498 - 11904: 0xAC6E,\n\t27501 - 11904: 0xD1FA,\n\t27503 - 11904: 0x8BF7,\n\t27506 - 11904: 0xB7B3,\n\t27508 - 11904: 0xFD66,\n\t27510 - 11904: 0xE6D1,\n\t27511 - 11904: 0xBEFA,\n\t27512 - 11904: 0xC26B,\n\t27513 - 11904: 0xA4EF,\n\t27514 - 11904: 0x8BCF,\n\t27515 - 11904: 0xA6BA,\n\t27518 - 11904: 0xCCEB,\n\t27519 - 11904: 0xAA5C,\n\t27520 - 11904: 0xCCEA,\n\t27521 - 11904: 0x8DD1,\n\t27522 - 11904: 0xCF65,\n\t27523 - 11904: 0xAC6F,\n\t27524 - 11904: 0xCF66,\n\t27526 - 11904: 0xAC70,\n\t27528 - 11904: 0xD1FC,\n\t27529 - 11904: 0xAEEE,\n\t27530 - 11904: 0xAEED,\n\t27532 - 11904: 0xD5DE,\n\t27533 - 11904: 0xD5DC,\n\t27534 - 11904: 0xD5DD,\n\t27535 - 11904: 0xD5DB,\n\t27537 - 11904: 0xD5DA,\n\t27540 - 11904: 0xD9DE,\n\t27541 - 11904: 0xD9E1,\n\t27542 - 11904: 0xB4DE,\n\t27543 - 11904: 0xD9DF,\n\t27544 - 11904: 0xB4DD,\n\t27545 - 11904: 0xD9E0,\n\t27547 - 11904: 0xDDFB,\n\t27550 - 11904: 0xE266,\n\t27551 - 11904: 0xE267,\n\t27552 - 11904: 0xE268,\n\t27554 - 11904: 0xE5F3,\n\t27555 - 11904: 0xE5F2,\n\t27556 - 11904: 0xBCDC,\n\t27557 - 11904: 0xE5F1,\n\t27558 - 11904: 0xE5F4,\n\t27559 - 11904: 0xE9E1,\n\t27562 - 11904: 0xE9E2,\n\t27563 - 11904: 0xE9E3,\n\t27565 - 11904: 0xED4C,\n\t27566 - 11904: 0xC0D4,\n\t27567 - 11904: 0xC26C,\n\t27568 - 11904: 0xF25A,\n\t27570 - 11904: 0xC4E8,\n\t27571 - 11904: 0xC95F,\n\t27573 - 11904: 0xAC71,\n\t27574 - 11904: 0xCF67,\n\t27575 - 11904: 0xAEEF,\n\t27578 - 11904: 0xB1FE,\n\t27580 - 11904: 0xB4DF,\n\t27581 - 11904: 0xD9E2,\n\t27583 - 11904: 0xB7B5,\n\t27584 - 11904: 0xB7B4,\n\t27585 - 11904: 0x8DD2,\n\t27587 - 11904: 0xE269,\n\t27588 - 11904: 0xE26A,\n\t27589 - 11904: 0xBCDD,\n\t27590 - 11904: 0xBCDE,\n\t27591 - 11904: 0xE9E5,\n\t27592 - 11904: 0xE9E4,\n\t27593 - 11904: 0xEFE9,\n\t27594 - 11904: 0xF7E3,\n\t27595 - 11904: 0xA4F0,\n\t27596 - 11904: 0xC960,\n\t27597 - 11904: 0xA5C0,\n\t27599 - 11904: 0xA843,\n\t27600 - 11904: 0xCB48,\n\t27602 - 11904: 0xAC72,\n\t27603 - 11904: 0xB7B6,\n\t27604 - 11904: 0xA4F1,\n\t27606 - 11904: 0xCF68,\n\t27607 - 11904: 0xAC73,\n\t27608 - 11904: 0xCF69,\n\t27610 - 11904: 0xC0D5,\n\t27611 - 11904: 0xA4F2,\n\t27612 - 11904: 0xFD71,\n\t27614 - 11904: 0xCCEC,\n\t27616 - 11904: 0xCF6A,\n\t27617 - 11904: 0xFD6F,\n\t27618 - 11904: 0xD242,\n\t27619 - 11904: 0xD241,\n\t27620 - 11904: 0xD1FE,\n\t27622 - 11904: 0xD1FD,\n\t27623 - 11904: 0xD243,\n\t27624 - 11904: 0xD240,\n\t27626 - 11904: 0x8DD3,\n\t27627 - 11904: 0xB240,\n\t27628 - 11904: 0xB241,\n\t27631 - 11904: 0xB4E0,\n\t27632 - 11904: 0xD9E3,\n\t27634 - 11904: 0xD9E4,\n\t27635 - 11904: 0xD9E5,\n\t27639 - 11904: 0xDE41,\n\t27640 - 11904: 0xDE42,\n\t27641 - 11904: 0xDE40,\n\t27642 - 11904: 0x9FE7,\n\t27643 - 11904: 0xDDFD,\n\t27644 - 11904: 0xDDFE,\n\t27645 - 11904: 0xB7B7,\n\t27646 - 11904: 0xE26B,\n\t27647 - 11904: 0xE5F7,\n\t27648 - 11904: 0xE5F6,\n\t27649 - 11904: 0xE5F5,\n\t27650 - 11904: 0xE5F8,\n\t27651 - 11904: 0xE9E7,\n\t27652 - 11904: 0xE9E6,\n\t27653 - 11904: 0xBEFB,\n\t27654 - 11904: 0xE9E8,\n\t27656 - 11904: 0xC0D6,\n\t27657 - 11904: 0xED4D,\n\t27659 - 11904: 0xEFEA,\n\t27660 - 11904: 0xF25B,\n\t27661 - 11904: 0xF6E7,\n\t27663 - 11904: 0xA4F3,\n\t27664 - 11904: 0xA5C2,\n\t27665 - 11904: 0xA5C1,\n\t27667 - 11904: 0xAA5D,\n\t27668 - 11904: 0xC961,\n\t27669 - 11904: 0xC97E,\n\t27670 - 11904: 0xA6BB,\n\t27672 - 11904: 0xC9F7,\n\t27673 - 11904: 0xCB49,\n\t27674 - 11904: 0xCB4A,\n\t27675 - 11904: 0xAA5E,\n\t27676 - 11904: 0x90BD,\n\t27677 - 11904: 0xCCED,\n\t27679 - 11904: 0xAC74,\n\t27680 - 11904: 0xCF6B,\n\t27681 - 11904: 0xCF6C,\n\t27683 - 11904: 0xAEF0,\n\t27684 - 11904: 0xAEF4,\n\t27685 - 11904: 0xD244,\n\t27686 - 11904: 0xAEF3,\n\t27687 - 11904: 0xAEF1,\n\t27688 - 11904: 0xAEF2,\n\t27690 - 11904: 0xD5DF,\n\t27691 - 11904: 0xB242,\n\t27692 - 11904: 0xB4E3,\n\t27694 - 11904: 0xB4E1,\n\t27695 - 11904: 0xB4E2,\n\t27696 - 11904: 0xD9E6,\n\t27697 - 11904: 0x9FD0,\n\t27699 - 11904: 0xBA72,\n\t27700 - 11904: 0xA4F4,\n\t27701 - 11904: 0x8BD0,\n\t27702 - 11904: 0xC9A1,\n\t27703 - 11904: 0xFD72,\n\t27704 - 11904: 0xA5C3,\n\t27705 - 11904: 0x9CAE,\n\t27706 - 11904: 0x8BD1,\n\t27707 - 11904: 0xC9A4,\n\t27709 - 11904: 0x8ADB,\n\t27710 - 11904: 0xA5C6,\n\t27711 - 11904: 0xC9A3,\n\t27712 - 11904: 0xA5C5,\n\t27713 - 11904: 0xA5C4,\n\t27714 - 11904: 0xA844,\n\t27715 - 11904: 0xC9A2,\n\t27718 - 11904: 0xC9F8,\n\t27721 - 11904: 0xFAE4,\n\t27722 - 11904: 0xC9FC,\n\t27723 - 11904: 0xC9FE,\n\t27724 - 11904: 0xCA40,\n\t27725 - 11904: 0xA6C5,\n\t27726 - 11904: 0xA6C6,\n\t27727 - 11904: 0xC9FB,\n\t27728 - 11904: 0xA6C1,\n\t27730 - 11904: 0xC9F9,\n\t27732 - 11904: 0xC9FD,\n\t27733 - 11904: 0xA6C2,\n\t27735 - 11904: 0xA6BD,\n\t27736 - 11904: 0x95CE,\n\t27737 - 11904: 0xA6BE,\n\t27738 - 11904: 0xFD76,\n\t27739 - 11904: 0xA6C4,\n\t27740 - 11904: 0xC9FA,\n\t27741 - 11904: 0xA6BC,\n\t27742 - 11904: 0xA845,\n\t27743 - 11904: 0xA6BF,\n\t27744 - 11904: 0xA6C0,\n\t27745 - 11904: 0xA6C3,\n\t27749 - 11904: 0xCB5B,\n\t27750 - 11904: 0xCB59,\n\t27751 - 11904: 0xCB4C,\n\t27752 - 11904: 0xA851,\n\t27753 - 11904: 0xCB53,\n\t27754 - 11904: 0xA84C,\n\t27755 - 11904: 0xCB4D,\n\t27757 - 11904: 0xCB55,\n\t27758 - 11904: 0xFB62,\n\t27759 - 11904: 0xCB52,\n\t27760 - 11904: 0xA84F,\n\t27761 - 11904: 0xCB51,\n\t27762 - 11904: 0xA856,\n\t27763 - 11904: 0xCB5A,\n\t27764 - 11904: 0xA858,\n\t27765 - 11904: 0x8DD4,\n\t27766 - 11904: 0xA85A,\n\t27768 - 11904: 0xCB4B,\n\t27769 - 11904: 0xFD78,\n\t27770 - 11904: 0xA84D,\n\t27771 - 11904: 0xCB5C,\n\t27773 - 11904: 0xA854,\n\t27774 - 11904: 0xA857,\n\t27775 - 11904: 0x8EE3,\n\t27776 - 11904: 0xCD45,\n\t27777 - 11904: 0xA847,\n\t27778 - 11904: 0xA85E,\n\t27779 - 11904: 0xA855,\n\t27780 - 11904: 0xCB4E,\n\t27781 - 11904: 0xA84A,\n\t27782 - 11904: 0xA859,\n\t27783 - 11904: 0xCB56,\n\t27784 - 11904: 0xA848,\n\t27785 - 11904: 0xA849,\n\t27786 - 11904: 0xCD43,\n\t27787 - 11904: 0xCB4F,\n\t27788 - 11904: 0xA850,\n\t27789 - 11904: 0xA85B,\n\t27790 - 11904: 0xCB5D,\n\t27791 - 11904: 0xCB50,\n\t27792 - 11904: 0xA84E,\n\t27794 - 11904: 0xA853,\n\t27795 - 11904: 0xCCEE,\n\t27796 - 11904: 0xA85C,\n\t27797 - 11904: 0xCB57,\n\t27798 - 11904: 0xA852,\n\t27800 - 11904: 0xA85D,\n\t27801 - 11904: 0xA846,\n\t27802 - 11904: 0xCB54,\n\t27803 - 11904: 0xA84B,\n\t27804 - 11904: 0xFDB7,\n\t27805 - 11904: 0xCD44,\n\t27807 - 11904: 0x9076,\n\t27810 - 11904: 0x98C6,\n\t27818 - 11904: 0x8DD5,\n\t27819 - 11904: 0xAA6A,\n\t27820 - 11904: 0xAA7A,\n\t27821 - 11904: 0xCCF5,\n\t27822 - 11904: 0xAA71,\n\t27823 - 11904: 0x97D1,\n\t27824 - 11904: 0xCD4B,\n\t27825 - 11904: 0xAA62,\n\t27826 - 11904: 0x9EB6,\n\t27827 - 11904: 0xAA65,\n\t27828 - 11904: 0xCD42,\n\t27830 - 11904: 0xCCF3,\n\t27831 - 11904: 0xCCF7,\n\t27832 - 11904: 0xAA6D,\n\t27833 - 11904: 0xAA6F,\n\t27834 - 11904: 0xCCFA,\n\t27835 - 11904: 0xAA76,\n\t27836 - 11904: 0xAA68,\n\t27837 - 11904: 0xAA66,\n\t27838 - 11904: 0xAA67,\n\t27839 - 11904: 0xAA75,\n\t27840 - 11904: 0xCD47,\n\t27841 - 11904: 0xAA70,\n\t27842 - 11904: 0xCCF9,\n\t27843 - 11904: 0xCCFB,\n\t27844 - 11904: 0xAA6E,\n\t27845 - 11904: 0xAA73,\n\t27846 - 11904: 0xCCFC,\n\t27847 - 11904: 0xCD4A,\n\t27849 - 11904: 0xAC75,\n\t27850 - 11904: 0xAA79,\n\t27851 - 11904: 0xFAC7,\n\t27852 - 11904: 0xAA63,\n\t27853 - 11904: 0xCD49,\n\t27854 - 11904: 0xA042,\n\t27855 - 11904: 0xCD4D,\n\t27856 - 11904: 0xCCF8,\n\t27857 - 11904: 0xCD4F,\n\t27858 - 11904: 0xCD40,\n\t27859 - 11904: 0xAA6C,\n\t27860 - 11904: 0xCCF4,\n\t27861 - 11904: 0xAA6B,\n\t27862 - 11904: 0xAA7D,\n\t27863 - 11904: 0xAA72,\n\t27865 - 11904: 0xCCF2,\n\t27866 - 11904: 0xCF75,\n\t27867 - 11904: 0xAA78,\n\t27868 - 11904: 0xAA7C,\n\t27869 - 11904: 0xCD41,\n\t27870 - 11904: 0xCD46,\n\t27871 - 11904: 0x9873,\n\t27872 - 11904: 0xAA7E,\n\t27873 - 11904: 0xAA77,\n\t27874 - 11904: 0xAA69,\n\t27875 - 11904: 0xAA5F,\n\t27877 - 11904: 0xAA64,\n\t27879 - 11904: 0xCCF6,\n\t27880 - 11904: 0xAA60,\n\t27881 - 11904: 0xCD4E,\n\t27882 - 11904: 0x9FFC,\n\t27883 - 11904: 0xCCF0,\n\t27884 - 11904: 0xCCEF,\n\t27885 - 11904: 0xCCFD,\n\t27886 - 11904: 0xCCF1,\n\t27887 - 11904: 0xAA7B,\n\t27888 - 11904: 0xAEF5,\n\t27889 - 11904: 0xAA74,\n\t27890 - 11904: 0xCCFE,\n\t27891 - 11904: 0xAA61,\n\t27893 - 11904: 0xACA6,\n\t27897 - 11904: 0xCD4C,\n\t27903 - 11904: 0x8CA5,\n\t27904 - 11904: 0xCF7C,\n\t27905 - 11904: 0xCFA1,\n\t27906 - 11904: 0x8DD7,\n\t27907 - 11904: 0xCFA4,\n\t27908 - 11904: 0xCF77,\n\t27909 - 11904: 0x92FB,\n\t27910 - 11904: 0x8DD8,\n\t27911 - 11904: 0xCFA7,\n\t27912 - 11904: 0xCFAA,\n\t27913 - 11904: 0xCFAC,\n\t27914 - 11904: 0xCF74,\n\t27915 - 11904: 0xAC76,\n\t27916 - 11904: 0xAC7B,\n\t27917 - 11904: 0xD249,\n\t27918 - 11904: 0xACAD,\n\t27919 - 11904: 0xCFA5,\n\t27920 - 11904: 0xCFAD,\n\t27921 - 11904: 0xCF7B,\n\t27922 - 11904: 0xCF73,\n\t27926 - 11904: 0xD264,\n\t27927 - 11904: 0xAC7E,\n\t27928 - 11904: 0xCFA2,\n\t27929 - 11904: 0xCF78,\n\t27930 - 11904: 0xCF7A,\n\t27931 - 11904: 0xACA5,\n\t27933 - 11904: 0xCF7D,\n\t27934 - 11904: 0xAC7D,\n\t27935 - 11904: 0xCF70,\n\t27936 - 11904: 0xCFA8,\n\t27938 - 11904: 0xCFAB,\n\t27940 - 11904: 0x944F,\n\t27941 - 11904: 0xAC7A,\n\t27942 - 11904: 0x8DD9,\n\t27943 - 11904: 0xACA8,\n\t27944 - 11904: 0xCF6D,\n\t27945 - 11904: 0xACAA,\n\t27946 - 11904: 0xAC78,\n\t27947 - 11904: 0xACAE,\n\t27948 - 11904: 0xCFA9,\n\t27949 - 11904: 0xCF6F,\n\t27950 - 11904: 0xACAB,\n\t27951 - 11904: 0xD25E,\n\t27952 - 11904: 0xCD48,\n\t27953 - 11904: 0xAC7C,\n\t27954 - 11904: 0xAC77,\n\t27955 - 11904: 0xCF76,\n\t27956 - 11904: 0xCF6E,\n\t27957 - 11904: 0xACAC,\n\t27958 - 11904: 0xACA4,\n\t27959 - 11904: 0xCFA3,\n\t27960 - 11904: 0xACA9,\n\t27961 - 11904: 0xACA7,\n\t27962 - 11904: 0xCF79,\n\t27963 - 11904: 0xACA1,\n\t27964 - 11904: 0xCF71,\n\t27965 - 11904: 0xACA2,\n\t27966 - 11904: 0xACA3,\n\t27967 - 11904: 0xCF72,\n\t27968 - 11904: 0xCFA6,\n\t27969 - 11904: 0xAC79,\n\t27970 - 11904: 0xCF7E,\n\t27982 - 11904: 0x896B,\n\t27991 - 11904: 0x97CE,\n\t27992 - 11904: 0xD24C,\n\t27993 - 11904: 0xAEFD,\n\t27994 - 11904: 0xAF43,\n\t27995 - 11904: 0xFAF3,\n\t27996 - 11904: 0xFDAE,\n\t27998 - 11904: 0xD255,\n\t27999 - 11904: 0xD25B,\n\t28000 - 11904: 0xD257,\n\t28001 - 11904: 0xD24A,\n\t28002 - 11904: 0xD24D,\n\t28003 - 11904: 0xD246,\n\t28004 - 11904: 0xD247,\n\t28005 - 11904: 0xAF4A,\n\t28006 - 11904: 0xAEFA,\n\t28007 - 11904: 0xD256,\n\t28008 - 11904: 0xD25F,\n\t28009 - 11904: 0xAF45,\n\t28010 - 11904: 0xAEF6,\n\t28012 - 11904: 0xAF40,\n\t28013 - 11904: 0xD24E,\n\t28014 - 11904: 0xAF42,\n\t28015 - 11904: 0xD24F,\n\t28016 - 11904: 0xD259,\n\t28017 - 11904: 0xFBAF,\n\t28018 - 11904: 0x92B7,\n\t28020 - 11904: 0xAF44,\n\t28021 - 11904: 0xD268,\n\t28022 - 11904: 0xD248,\n\t28023 - 11904: 0xAEFC,\n\t28024 - 11904: 0xAEFB,\n\t28025 - 11904: 0xAF48,\n\t28026 - 11904: 0xD245,\n\t28027 - 11904: 0xD266,\n\t28028 - 11904: 0xD25A,\n\t28029 - 11904: 0xD267,\n\t28030 - 11904: 0xD261,\n\t28031 - 11904: 0xD253,\n\t28032 - 11904: 0xD262,\n\t28033 - 11904: 0x8DDA,\n\t28034 - 11904: 0xD25C,\n\t28035 - 11904: 0xD265,\n\t28036 - 11904: 0xD263,\n\t28037 - 11904: 0xAF49,\n\t28038 - 11904: 0xD254,\n\t28039 - 11904: 0xAEF9,\n\t28040 - 11904: 0xAEF8,\n\t28041 - 11904: 0xAF41,\n\t28042 - 11904: 0xAF47,\n\t28043 - 11904: 0xD260,\n\t28044 - 11904: 0xAF46,\n\t28045 - 11904: 0xD251,\n\t28046 - 11904: 0xB243,\n\t28047 - 11904: 0x9C5A,\n\t28048 - 11904: 0xD269,\n\t28049 - 11904: 0xD250,\n\t28050 - 11904: 0xD24B,\n\t28051 - 11904: 0xAEFE,\n\t28052 - 11904: 0xAF4B,\n\t28053 - 11904: 0xAEF7,\n\t28054 - 11904: 0xFDAD,\n\t28055 - 11904: 0xD258,\n\t28056 - 11904: 0xD25D,\n\t28068 - 11904: 0x8DDC,\n\t28069 - 11904: 0x9444,\n\t28074 - 11904: 0xB265,\n\t28075 - 11904: 0xD5E1,\n\t28076 - 11904: 0xD5E5,\n\t28078 - 11904: 0xB252,\n\t28079 - 11904: 0xB250,\n\t28081 - 11904: 0x8DDD,\n\t28082 - 11904: 0xB247,\n\t28083 - 11904: 0xD5E3,\n\t28084 - 11904: 0xD5E2,\n\t28085 - 11904: 0xB25B,\n\t28087 - 11904: 0xD5E8,\n\t28088 - 11904: 0xB255,\n\t28089 - 11904: 0xA0D6,\n\t28090 - 11904: 0xD5FA,\n\t28091 - 11904: 0xD647,\n\t28092 - 11904: 0xB244,\n\t28093 - 11904: 0xD5F7,\n\t28094 - 11904: 0xD5F0,\n\t28095 - 11904: 0xB267,\n\t28096 - 11904: 0xD5E0,\n\t28098 - 11904: 0xD5FC,\n\t28100 - 11904: 0xB264,\n\t28101 - 11904: 0xB258,\n\t28102 - 11904: 0xB263,\n\t28103 - 11904: 0xB24E,\n\t28104 - 11904: 0xD5EC,\n\t28105 - 11904: 0xD5FE,\n\t28106 - 11904: 0xD5F6,\n\t28107 - 11904: 0xB24F,\n\t28108 - 11904: 0xB249,\n\t28109 - 11904: 0xD645,\n\t28111 - 11904: 0xD5FD,\n\t28112 - 11904: 0xD640,\n\t28113 - 11904: 0xB251,\n\t28114 - 11904: 0xB259,\n\t28115 - 11904: 0xD642,\n\t28116 - 11904: 0xD5EA,\n\t28117 - 11904: 0xD5FB,\n\t28118 - 11904: 0xD5EF,\n\t28119 - 11904: 0xD644,\n\t28120 - 11904: 0xB25E,\n\t28121 - 11904: 0xB246,\n\t28122 - 11904: 0xB25C,\n\t28123 - 11904: 0xD5F4,\n\t28124 - 11904: 0xD5F2,\n\t28125 - 11904: 0xD5F3,\n\t28126 - 11904: 0xB253,\n\t28127 - 11904: 0xD5EE,\n\t28128 - 11904: 0xD5ED,\n\t28129 - 11904: 0xB248,\n\t28130 - 11904: 0xD5E7,\n\t28131 - 11904: 0xD646,\n\t28132 - 11904: 0xB24A,\n\t28133 - 11904: 0xD5F1,\n\t28134 - 11904: 0xB268,\n\t28136 - 11904: 0xB262,\n\t28137 - 11904: 0xD5E6,\n\t28138 - 11904: 0xB25F,\n\t28139 - 11904: 0xB25D,\n\t28140 - 11904: 0xB266,\n\t28141 - 11904: 0xD5F8,\n\t28142 - 11904: 0xB261,\n\t28143 - 11904: 0xD252,\n\t28144 - 11904: 0xD5F9,\n\t28145 - 11904: 0xB260,\n\t28146 - 11904: 0xD641,\n\t28147 - 11904: 0xB245,\n\t28148 - 11904: 0xD5F5,\n\t28149 - 11904: 0xB257,\n\t28150 - 11904: 0xD5E9,\n\t28151 - 11904: 0xB256,\n\t28153 - 11904: 0xB254,\n\t28154 - 11904: 0xB24C,\n\t28155 - 11904: 0xB24B,\n\t28156 - 11904: 0xD9E7,\n\t28157 - 11904: 0xD643,\n\t28158 - 11904: 0x8C41,\n\t28160 - 11904: 0xD5EB,\n\t28162 - 11904: 0x97D5,\n\t28163 - 11904: 0xD9FC,\n\t28164 - 11904: 0x944A,\n\t28165 - 11904: 0xB24D,\n\t28170 - 11904: 0x944D,\n\t28175 - 11904: 0x97CB,\n\t28181 - 11904: 0x8DDE,\n\t28184 - 11904: 0x8DDF,\n\t28185 - 11904: 0xB541,\n\t28186 - 11904: 0xB25A,\n\t28187 - 11904: 0xB4EE,\n\t28188 - 11904: 0xD9F6,\n\t28189 - 11904: 0xFDB8,\n\t28191 - 11904: 0xD9EA,\n\t28192 - 11904: 0xB4EB,\n\t28193 - 11904: 0xB4E7,\n\t28194 - 11904: 0xDA49,\n\t28195 - 11904: 0xB4ED,\n\t28196 - 11904: 0xB4F1,\n\t28197 - 11904: 0xB4EC,\n\t28198 - 11904: 0xB4F5,\n\t28199 - 11904: 0xDA4D,\n\t28200 - 11904: 0xDA44,\n\t28201 - 11904: 0x8DE0,\n\t28202 - 11904: 0xFEF9,\n\t28203 - 11904: 0xD9F1,\n\t28204 - 11904: 0xB4FA,\n\t28205 - 11904: 0xB4F4,\n\t28206 - 11904: 0xD9FD,\n\t28207 - 11904: 0xFDBB,\n\t28208 - 11904: 0xDA4A,\n\t28209 - 11904: 0xDA43,\n\t28210 - 11904: 0xB4E8,\n\t28211 - 11904: 0xD9F7,\n\t28212 - 11904: 0xB4F7,\n\t28213 - 11904: 0xDA55,\n\t28214 - 11904: 0xDA56,\n\t28216 - 11904: 0xB4E5,\n\t28217 - 11904: 0xDA48,\n\t28218 - 11904: 0xB4F9,\n\t28219 - 11904: 0xD9FB,\n\t28220 - 11904: 0xD9ED,\n\t28221 - 11904: 0xD9EE,\n\t28222 - 11904: 0xB4FD,\n\t28223 - 11904: 0xD9F2,\n\t28224 - 11904: 0xD9F9,\n\t28225 - 11904: 0xD9F3,\n\t28227 - 11904: 0xB4FB,\n\t28228 - 11904: 0xB544,\n\t28229 - 11904: 0xD9EF,\n\t28230 - 11904: 0xD9E8,\n\t28231 - 11904: 0xD9E9,\n\t28233 - 11904: 0xD9EB,\n\t28234 - 11904: 0xB4EA,\n\t28235 - 11904: 0xD9F8,\n\t28237 - 11904: 0xB4F8,\n\t28238 - 11904: 0xB542,\n\t28239 - 11904: 0xFDC0,\n\t28240 - 11904: 0xFCF9,\n\t28241 - 11904: 0xD9FA,\n\t28242 - 11904: 0xDA53,\n\t28243 - 11904: 0xDA4B,\n\t28244 - 11904: 0xB4E6,\n\t28245 - 11904: 0xDA51,\n\t28246 - 11904: 0xB4F2,\n\t28247 - 11904: 0x8CDD,\n\t28248 - 11904: 0xB4F0,\n\t28249 - 11904: 0xFB7E,\n\t28250 - 11904: 0xDA57,\n\t28251 - 11904: 0xB4EF,\n\t28252 - 11904: 0xDA41,\n\t28253 - 11904: 0xD9F4,\n\t28254 - 11904: 0xD9FE,\n\t28255 - 11904: 0xB547,\n\t28256 - 11904: 0xDA45,\n\t28257 - 11904: 0xDA42,\n\t28258 - 11904: 0xD9F0,\n\t28259 - 11904: 0xB543,\n\t28260 - 11904: 0xDA4F,\n\t28261 - 11904: 0xDA4C,\n\t28262 - 11904: 0xDA54,\n\t28263 - 11904: 0xB4E9,\n\t28264 - 11904: 0xDA40,\n\t28265 - 11904: 0xB546,\n\t28267 - 11904: 0xDA47,\n\t28270 - 11904: 0xB4F3,\n\t28271 - 11904: 0xB4F6,\n\t28273 - 11904: 0xDA46,\n\t28274 - 11904: 0xB545,\n\t28275 - 11904: 0xD9F5,\n\t28276 - 11904: 0xD5E4,\n\t28278 - 11904: 0x92B3,\n\t28279 - 11904: 0xDA50,\n\t28280 - 11904: 0xDA4E,\n\t28281 - 11904: 0xDA52,\n\t28284 - 11904: 0xFDAF,\n\t28294 - 11904: 0x8DE1,\n\t28296 - 11904: 0xD9EC,\n\t28297 - 11904: 0xB540,\n\t28299 - 11904: 0x95D3,\n\t28301 - 11904: 0xDE61,\n\t28302 - 11904: 0xDE60,\n\t28303 - 11904: 0xDE46,\n\t28304 - 11904: 0xB7BD,\n\t28306 - 11904: 0xDE5F,\n\t28307 - 11904: 0xDE49,\n\t28308 - 11904: 0xDE4A,\n\t28310 - 11904: 0xB7C7,\n\t28311 - 11904: 0xDE68,\n\t28312 - 11904: 0xB7C2,\n\t28313 - 11904: 0xDE5E,\n\t28314 - 11904: 0x89C1,\n\t28315 - 11904: 0xDE43,\n\t28316 - 11904: 0xB7C8,\n\t28317 - 11904: 0xB7BE,\n\t28318 - 11904: 0xDE52,\n\t28319 - 11904: 0xDE48,\n\t28320 - 11904: 0xDE4B,\n\t28321 - 11904: 0xDE63,\n\t28322 - 11904: 0xB7B8,\n\t28323 - 11904: 0xDE6A,\n\t28324 - 11904: 0xDE62,\n\t28325 - 11904: 0xB7C1,\n\t28326 - 11904: 0xDE57,\n\t28327 - 11904: 0xB7CC,\n\t28330 - 11904: 0xB7CB,\n\t28331 - 11904: 0xB7C5,\n\t28334 - 11904: 0xDE69,\n\t28335 - 11904: 0xB7B9,\n\t28336 - 11904: 0xDE55,\n\t28337 - 11904: 0xDE4C,\n\t28338 - 11904: 0xDE59,\n\t28339 - 11904: 0xDE65,\n\t28340 - 11904: 0xB7CD,\n\t28341 - 11904: 0xFD68,\n\t28342 - 11904: 0xB7BB,\n\t28343 - 11904: 0xDE54,\n\t28344 - 11904: 0x9CB7,\n\t28345 - 11904: 0xDE4D,\n\t28346 - 11904: 0xB7C4,\n\t28347 - 11904: 0x8DE3,\n\t28348 - 11904: 0xB7C3,\n\t28349 - 11904: 0xDE50,\n\t28350 - 11904: 0xDE5A,\n\t28351 - 11904: 0xDE64,\n\t28352 - 11904: 0xDE47,\n\t28353 - 11904: 0xDE51,\n\t28354 - 11904: 0xB7BC,\n\t28355 - 11904: 0xDE5B,\n\t28356 - 11904: 0xB7C9,\n\t28357 - 11904: 0xB7C0,\n\t28358 - 11904: 0xDE4E,\n\t28359 - 11904: 0xB7BF,\n\t28360 - 11904: 0xDE45,\n\t28361 - 11904: 0xDE53,\n\t28362 - 11904: 0xDE67,\n\t28363 - 11904: 0xB4FE,\n\t28364 - 11904: 0xBAB0,\n\t28365 - 11904: 0xDE56,\n\t28366 - 11904: 0xE26C,\n\t28367 - 11904: 0xDE58,\n\t28368 - 11904: 0xDE66,\n\t28369 - 11904: 0xB7C6,\n\t28370 - 11904: 0xDE4F,\n\t28371 - 11904: 0xB7BA,\n\t28372 - 11904: 0xB7CA,\n\t28373 - 11904: 0xBCF0,\n\t28374 - 11904: 0xDE44,\n\t28376 - 11904: 0xDE5D,\n\t28377 - 11904: 0xFAC0,\n\t28378 - 11904: 0x8DE5,\n\t28379 - 11904: 0xFA64,\n\t28380 - 11904: 0xDE5C,\n\t28381 - 11904: 0x8947,\n\t28386 - 11904: 0x8DE4,\n\t28392 - 11904: 0x8DE7,\n\t28393 - 11904: 0x8DE8,\n\t28395 - 11904: 0xE2AA,\n\t28396 - 11904: 0xBAAD,\n\t28397 - 11904: 0xE27D,\n\t28398 - 11904: 0xE2A4,\n\t28399 - 11904: 0xBAA2,\n\t28401 - 11904: 0xE26E,\n\t28402 - 11904: 0xBAAF,\n\t28404 - 11904: 0xBA77,\n\t28405 - 11904: 0xE26D,\n\t28406 - 11904: 0xE2B0,\n\t28407 - 11904: 0xBAB1,\n\t28408 - 11904: 0xE271,\n\t28409 - 11904: 0xE2A3,\n\t28410 - 11904: 0xFDC7,\n\t28411 - 11904: 0xE273,\n\t28412 - 11904: 0xE2B3,\n\t28413 - 11904: 0xE2AF,\n\t28414 - 11904: 0xBA75,\n\t28415 - 11904: 0xBAA1,\n\t28416 - 11904: 0xE653,\n\t28417 - 11904: 0xBAAE,\n\t28418 - 11904: 0xBA7D,\n\t28419 - 11904: 0xE26F,\n\t28420 - 11904: 0xFDB0,\n\t28421 - 11904: 0xE2AE,\n\t28422 - 11904: 0xBAA3,\n\t28423 - 11904: 0xE2AB,\n\t28424 - 11904: 0xE2B8,\n\t28425 - 11904: 0xE275,\n\t28426 - 11904: 0xE27E,\n\t28427 - 11904: 0x9445,\n\t28428 - 11904: 0x97D6,\n\t28429 - 11904: 0xE2B6,\n\t28430 - 11904: 0xE2AC,\n\t28431 - 11904: 0xBA7C,\n\t28434 - 11904: 0xE27C,\n\t28435 - 11904: 0xBA76,\n\t28436 - 11904: 0xBA74,\n\t28437 - 11904: 0xBAA8,\n\t28438 - 11904: 0xFCC6,\n\t28439 - 11904: 0x9844,\n\t28440 - 11904: 0xE27A,\n\t28441 - 11904: 0xE277,\n\t28442 - 11904: 0xE278,\n\t28444 - 11904: 0xE2B2,\n\t28446 - 11904: 0xE2B7,\n\t28447 - 11904: 0xE2B5,\n\t28448 - 11904: 0xBA7A,\n\t28449 - 11904: 0xE2B9,\n\t28450 - 11904: 0xBA7E,\n\t28451 - 11904: 0xBAA7,\n\t28452 - 11904: 0x8DE9,\n\t28453 - 11904: 0xE270,\n\t28454 - 11904: 0xE5FA,\n\t28455 - 11904: 0xE279,\n\t28457 - 11904: 0xBA78,\n\t28458 - 11904: 0xBAAC,\n\t28459 - 11904: 0xBAA9,\n\t28460 - 11904: 0xBA7B,\n\t28461 - 11904: 0xE2A5,\n\t28462 - 11904: 0xE274,\n\t28463 - 11904: 0xBAAA,\n\t28464 - 11904: 0xE2A7,\n\t28465 - 11904: 0xBAA4,\n\t28466 - 11904: 0xBAA6,\n\t28467 - 11904: 0xBA73,\n\t28468 - 11904: 0x8DEA,\n\t28469 - 11904: 0xE2A9,\n\t28470 - 11904: 0xE2A1,\n\t28471 - 11904: 0xE272,\n\t28472 - 11904: 0xBAA5,\n\t28473 - 11904: 0xE2B1,\n\t28474 - 11904: 0xE2B4,\n\t28475 - 11904: 0xE27B,\n\t28476 - 11904: 0xE2A8,\n\t28477 - 11904: 0xFE50,\n\t28478 - 11904: 0xBA79,\n\t28479 - 11904: 0xBCDF,\n\t28480 - 11904: 0xE2A6,\n\t28481 - 11904: 0xE5F9,\n\t28483 - 11904: 0xE2AD,\n\t28484 - 11904: 0xFDCC,\n\t28494 - 11904: 0xE276,\n\t28495 - 11904: 0xE644,\n\t28496 - 11904: 0xE64E,\n\t28497 - 11904: 0xBCE2,\n\t28498 - 11904: 0xE64D,\n\t28499 - 11904: 0xE659,\n\t28500 - 11904: 0xBCE4,\n\t28501 - 11904: 0xE64B,\n\t28502 - 11904: 0x9DA7,\n\t28503 - 11904: 0xE64F,\n\t28504 - 11904: 0xBCEF,\n\t28506 - 11904: 0xE646,\n\t28507 - 11904: 0xBCE7,\n\t28508 - 11904: 0xFDCD,\n\t28509 - 11904: 0xE652,\n\t28510 - 11904: 0xE9F0,\n\t28511 - 11904: 0xBCF3,\n\t28512 - 11904: 0xBCF2,\n\t28513 - 11904: 0xE654,\n\t28514 - 11904: 0xE643,\n\t28515 - 11904: 0xE65E,\n\t28516 - 11904: 0xBCED,\n\t28518 - 11904: 0xBCE3,\n\t28519 - 11904: 0xE657,\n\t28521 - 11904: 0xE65B,\n\t28522 - 11904: 0xE660,\n\t28523 - 11904: 0xE655,\n\t28524 - 11904: 0xE649,\n\t28525 - 11904: 0xBCE6,\n\t28526 - 11904: 0xBCE9,\n\t28527 - 11904: 0xBCF1,\n\t28528 - 11904: 0xBCEC,\n\t28530 - 11904: 0xE64C,\n\t28531 - 11904: 0xE2A2,\n\t28532 - 11904: 0xFDCF,\n\t28534 - 11904: 0xE648,\n\t28535 - 11904: 0xE65F,\n\t28536 - 11904: 0xBCE8,\n\t28537 - 11904: 0x95D2,\n\t28538 - 11904: 0xBCEB,\n\t28539 - 11904: 0xE661,\n\t28540 - 11904: 0xBCE0,\n\t28541 - 11904: 0xE656,\n\t28542 - 11904: 0xE5FB,\n\t28543 - 11904: 0xE65C,\n\t28544 - 11904: 0xC0DF,\n\t28545 - 11904: 0x8DED,\n\t28546 - 11904: 0xE64A,\n\t28548 - 11904: 0xBCE1,\n\t28549 - 11904: 0xE645,\n\t28550 - 11904: 0xBCE5,\n\t28551 - 11904: 0xE5FC,\n\t28552 - 11904: 0xBAAB,\n\t28553 - 11904: 0xE641,\n\t28554 - 11904: 0xFCBA,\n\t28555 - 11904: 0xE65A,\n\t28556 - 11904: 0xE642,\n\t28557 - 11904: 0xE640,\n\t28558 - 11904: 0xBCEA,\n\t28560 - 11904: 0xE658,\n\t28562 - 11904: 0xE5FE,\n\t28563 - 11904: 0xE651,\n\t28564 - 11904: 0xE650,\n\t28565 - 11904: 0xE65D,\n\t28566 - 11904: 0xE647,\n\t28567 - 11904: 0xBCEE,\n\t28573 - 11904: 0xFDC5,\n\t28574 - 11904: 0xE9F3,\n\t28575 - 11904: 0xFDD2,\n\t28576 - 11904: 0xBF49,\n\t28577 - 11904: 0xBEFE,\n\t28578 - 11904: 0xEA40,\n\t28579 - 11904: 0xE9EB,\n\t28580 - 11904: 0xBF41,\n\t28581 - 11904: 0xE9F7,\n\t28582 - 11904: 0xBF48,\n\t28583 - 11904: 0xBF43,\n\t28584 - 11904: 0xE9F5,\n\t28585 - 11904: 0xED4F,\n\t28586 - 11904: 0xE9FB,\n\t28587 - 11904: 0xEA42,\n\t28588 - 11904: 0xE9FA,\n\t28589 - 11904: 0xE9E9,\n\t28590 - 11904: 0xE9F8,\n\t28591 - 11904: 0xEA44,\n\t28592 - 11904: 0xEA46,\n\t28593 - 11904: 0xBEFD,\n\t28594 - 11904: 0xEA45,\n\t28595 - 11904: 0xBF44,\n\t28596 - 11904: 0xBF4A,\n\t28597 - 11904: 0x9CDC,\n\t28598 - 11904: 0xBF47,\n\t28600 - 11904: 0xE9FE,\n\t28601 - 11904: 0xBF46,\n\t28602 - 11904: 0xE9F9,\n\t28603 - 11904: 0x95CF,\n\t28604 - 11904: 0xE9ED,\n\t28605 - 11904: 0xE9F2,\n\t28606 - 11904: 0x8DEE,\n\t28607 - 11904: 0xE9FD,\n\t28608 - 11904: 0xBF45,\n\t28609 - 11904: 0xBF42,\n\t28610 - 11904: 0xBEFC,\n\t28611 - 11904: 0xBF40,\n\t28612 - 11904: 0xE9F1,\n\t28614 - 11904: 0xE5FD,\n\t28615 - 11904: 0xE9EC,\n\t28616 - 11904: 0xE9EF,\n\t28617 - 11904: 0xEA41,\n\t28618 - 11904: 0xE9F4,\n\t28619 - 11904: 0xE9EA,\n\t28620 - 11904: 0xED4E,\n\t28621 - 11904: 0xEA43,\n\t28622 - 11904: 0xE9EE,\n\t28623 - 11904: 0xE9FC,\n\t28627 - 11904: 0xFDD4,\n\t28628 - 11904: 0xED51,\n\t28629 - 11904: 0xC0E3,\n\t28632 - 11904: 0xC0D7,\n\t28633 - 11904: 0x96EC,\n\t28634 - 11904: 0x96EB,\n\t28635 - 11904: 0xC0DB,\n\t28636 - 11904: 0xED53,\n\t28637 - 11904: 0xED59,\n\t28638 - 11904: 0xED57,\n\t28639 - 11904: 0xC0D9,\n\t28640 - 11904: 0xC0DA,\n\t28641 - 11904: 0xC0E1,\n\t28642 - 11904: 0xED5A,\n\t28643 - 11904: 0xED52,\n\t28644 - 11904: 0xC0DC,\n\t28646 - 11904: 0xED56,\n\t28647 - 11904: 0xED55,\n\t28648 - 11904: 0xED5B,\n\t28649 - 11904: 0xC0E2,\n\t28651 - 11904: 0xC0DD,\n\t28652 - 11904: 0xC0E0,\n\t28653 - 11904: 0xED54,\n\t28654 - 11904: 0xC0E4,\n\t28655 - 11904: 0xC0DE,\n\t28656 - 11904: 0xC0E5,\n\t28657 - 11904: 0xC0D8,\n\t28658 - 11904: 0xED58,\n\t28660 - 11904: 0xED50,\n\t28662 - 11904: 0x90B6,\n\t28663 - 11904: 0xEFF7,\n\t28664 - 11904: 0xFDC3,\n\t28666 - 11904: 0xC271,\n\t28667 - 11904: 0xEFF4,\n\t28668 - 11904: 0xEFF6,\n\t28670 - 11904: 0xC26F,\n\t28671 - 11904: 0xEFF2,\n\t28672 - 11904: 0xEFF3,\n\t28673 - 11904: 0xEFEE,\n\t28675 - 11904: 0x98AB,\n\t28676 - 11904: 0xE9F6,\n\t28677 - 11904: 0xEFEF,\n\t28678 - 11904: 0xC270,\n\t28679 - 11904: 0xEFEB,\n\t28681 - 11904: 0xC26D,\n\t28682 - 11904: 0xEFF8,\n\t28683 - 11904: 0xC26E,\n\t28684 - 11904: 0xEFEC,\n\t28685 - 11904: 0xEFED,\n\t28686 - 11904: 0xEFF1,\n\t28687 - 11904: 0xC273,\n\t28689 - 11904: 0xC272,\n\t28692 - 11904: 0xEFF0,\n\t28693 - 11904: 0xC378,\n\t28694 - 11904: 0xF25F,\n\t28695 - 11904: 0xF265,\n\t28696 - 11904: 0xC379,\n\t28697 - 11904: 0xF25C,\n\t28698 - 11904: 0xC376,\n\t28699 - 11904: 0xC373,\n\t28700 - 11904: 0xF267,\n\t28701 - 11904: 0xC377,\n\t28702 - 11904: 0x96EE,\n\t28703 - 11904: 0xC374,\n\t28704 - 11904: 0xF25E,\n\t28705 - 11904: 0xF261,\n\t28706 - 11904: 0xF262,\n\t28707 - 11904: 0xF263,\n\t28708 - 11904: 0xF266,\n\t28710 - 11904: 0xEFF5,\n\t28711 - 11904: 0xF25D,\n\t28712 - 11904: 0xC375,\n\t28713 - 11904: 0xF264,\n\t28714 - 11904: 0xF268,\n\t28715 - 11904: 0xF260,\n\t28716 - 11904: 0x8DF4,\n\t28719 - 11904: 0xF45D,\n\t28720 - 11904: 0xC46A,\n\t28721 - 11904: 0xF460,\n\t28722 - 11904: 0xC46B,\n\t28723 - 11904: 0xF468,\n\t28724 - 11904: 0xF45F,\n\t28725 - 11904: 0xF45C,\n\t28727 - 11904: 0xF45E,\n\t28728 - 11904: 0xF462,\n\t28729 - 11904: 0xF465,\n\t28730 - 11904: 0xF464,\n\t28731 - 11904: 0xF467,\n\t28732 - 11904: 0xF45B,\n\t28734 - 11904: 0xC469,\n\t28735 - 11904: 0xF463,\n\t28736 - 11904: 0xF466,\n\t28737 - 11904: 0xF469,\n\t28738 - 11904: 0xF461,\n\t28739 - 11904: 0xF5D3,\n\t28740 - 11904: 0xF5D4,\n\t28741 - 11904: 0xF5D8,\n\t28742 - 11904: 0xF5D9,\n\t28744 - 11904: 0xF5D6,\n\t28745 - 11904: 0xF5D7,\n\t28746 - 11904: 0xF5D5,\n\t28747 - 11904: 0xFDE0,\n\t28748 - 11904: 0xC4E9,\n\t28749 - 11904: 0x8C67,\n\t28752 - 11904: 0x8DF6,\n\t28753 - 11904: 0xC578,\n\t28754 - 11904: 0xF6EB,\n\t28756 - 11904: 0x8DF7,\n\t28757 - 11904: 0xF6E8,\n\t28758 - 11904: 0xF6E9,\n\t28759 - 11904: 0xF6EA,\n\t28760 - 11904: 0xC579,\n\t28762 - 11904: 0xF7E5,\n\t28763 - 11904: 0xF7E4,\n\t28764 - 11904: 0x8FFA,\n\t28765 - 11904: 0xF8AF,\n\t28766 - 11904: 0xC5F4,\n\t28767 - 11904: 0xF8AD,\n\t28768 - 11904: 0xF8B0,\n\t28769 - 11904: 0xF8AE,\n\t28770 - 11904: 0xF8F5,\n\t28771 - 11904: 0xC657,\n\t28772 - 11904: 0xC665,\n\t28773 - 11904: 0xF9A3,\n\t28774 - 11904: 0xF96C,\n\t28775 - 11904: 0x97D0,\n\t28776 - 11904: 0xF9A2,\n\t28777 - 11904: 0xF9D0,\n\t28778 - 11904: 0xF9D1,\n\t28779 - 11904: 0xA4F5,\n\t28780 - 11904: 0x8BD2,\n\t28782 - 11904: 0x87DE,\n\t28783 - 11904: 0x8DF8,\n\t28784 - 11904: 0xA6C7,\n\t28785 - 11904: 0xCA41,\n\t28788 - 11904: 0xCB5E,\n\t28789 - 11904: 0x90D9,\n\t28790 - 11904: 0xA85F,\n\t28791 - 11904: 0x8C47,\n\t28792 - 11904: 0xA862,\n\t28793 - 11904: 0xFAF0,\n\t28794 - 11904: 0xCB5F,\n\t28796 - 11904: 0xA860,\n\t28797 - 11904: 0xA861,\n\t28798 - 11904: 0xFDE1,\n\t28799 - 11904: 0x8DF9,\n\t28801 - 11904: 0xFDE3,\n\t28802 - 11904: 0xCD58,\n\t28803 - 11904: 0xCD5A,\n\t28804 - 11904: 0xCD55,\n\t28805 - 11904: 0xCD52,\n\t28806 - 11904: 0xCD54,\n\t28809 - 11904: 0x8DFA,\n\t28810 - 11904: 0xAAA4,\n\t28811 - 11904: 0xFB63,\n\t28814 - 11904: 0xAAA2,\n\t28815 - 11904: 0x90A6,\n\t28817 - 11904: 0xCD56,\n\t28818 - 11904: 0xAAA3,\n\t28819 - 11904: 0xCD53,\n\t28820 - 11904: 0xCD50,\n\t28821 - 11904: 0xAAA1,\n\t28822 - 11904: 0xCD57,\n\t28824 - 11904: 0xCD51,\n\t28825 - 11904: 0xAAA5,\n\t28826 - 11904: 0xCD59,\n\t28831 - 11904: 0xCFAF,\n\t28832 - 11904: 0x9970,\n\t28833 - 11904: 0xCFB3,\n\t28835 - 11904: 0x91EB,\n\t28836 - 11904: 0xACB7,\n\t28837 - 11904: 0x9770,\n\t28838 - 11904: 0x986F,\n\t28839 - 11904: 0xFDE2,\n\t28841 - 11904: 0xCFB6,\n\t28843 - 11904: 0xACAF,\n\t28844 - 11904: 0xACB2,\n\t28845 - 11904: 0xACB4,\n\t28846 - 11904: 0xACB6,\n\t28847 - 11904: 0xACB3,\n\t28848 - 11904: 0xCFB2,\n\t28849 - 11904: 0xCFB1,\n\t28851 - 11904: 0xACB1,\n\t28852 - 11904: 0xCFB4,\n\t28853 - 11904: 0xCFB5,\n\t28855 - 11904: 0xCFAE,\n\t28856 - 11904: 0xACB5,\n\t28857 - 11904: 0x98F2,\n\t28858 - 11904: 0xACB0,\n\t28859 - 11904: 0x9AFC,\n\t28860 - 11904: 0x896C,\n\t28861 - 11904: 0xFDFD,\n\t28862 - 11904: 0xCFB0,\n\t28864 - 11904: 0x995E,\n\t28868 - 11904: 0x95BD,\n\t28869 - 11904: 0xD277,\n\t28870 - 11904: 0xD278,\n\t28871 - 11904: 0xD279,\n\t28872 - 11904: 0xAF50,\n\t28874 - 11904: 0xAF4C,\n\t28875 - 11904: 0xD26E,\n\t28876 - 11904: 0xFDE4,\n\t28877 - 11904: 0xD276,\n\t28878 - 11904: 0xD27B,\n\t28879 - 11904: 0xAF51,\n\t28880 - 11904: 0x91E6,\n\t28881 - 11904: 0xD26C,\n\t28882 - 11904: 0xD272,\n\t28883 - 11904: 0xD26B,\n\t28884 - 11904: 0xD275,\n\t28885 - 11904: 0xFDE5,\n\t28886 - 11904: 0xFDE6,\n\t28887 - 11904: 0xD271,\n\t28888 - 11904: 0xAF4D,\n\t28889 - 11904: 0xAF4F,\n\t28890 - 11904: 0xD27A,\n\t28892 - 11904: 0xD26A,\n\t28893 - 11904: 0xD26D,\n\t28894 - 11904: 0xD273,\n\t28895 - 11904: 0xFDE7,\n\t28896 - 11904: 0xD274,\n\t28897 - 11904: 0xD27C,\n\t28898 - 11904: 0xD270,\n\t28900 - 11904: 0xAF4E,\n\t28911 - 11904: 0xB26D,\n\t28912 - 11904: 0xD64E,\n\t28913 - 11904: 0x9454,\n\t28915 - 11904: 0xD650,\n\t28916 - 11904: 0xD64C,\n\t28917 - 11904: 0x99B8,\n\t28918 - 11904: 0xD658,\n\t28919 - 11904: 0xD64A,\n\t28920 - 11904: 0xD657,\n\t28921 - 11904: 0xB269,\n\t28922 - 11904: 0xD648,\n\t28923 - 11904: 0xDA5B,\n\t28924 - 11904: 0xD652,\n\t28925 - 11904: 0xB26C,\n\t28926 - 11904: 0x97E9,\n\t28927 - 11904: 0xD653,\n\t28928 - 11904: 0xD656,\n\t28930 - 11904: 0xD65A,\n\t28932 - 11904: 0xD64F,\n\t28933 - 11904: 0x9346,\n\t28934 - 11904: 0xD654,\n\t28937 - 11904: 0xB26A,\n\t28938 - 11904: 0xB26B,\n\t28939 - 11904: 0xD659,\n\t28940 - 11904: 0xD64D,\n\t28941 - 11904: 0xD649,\n\t28942 - 11904: 0xD65B,\n\t28944 - 11904: 0xD651,\n\t28947 - 11904: 0xD655,\n\t28951 - 11904: 0xD64B,\n\t28953 - 11904: 0xB548,\n\t28954 - 11904: 0xB549,\n\t28955 - 11904: 0xDA65,\n\t28956 - 11904: 0xB54F,\n\t28957 - 11904: 0x9863,\n\t28958 - 11904: 0xDA59,\n\t28959 - 11904: 0xDA62,\n\t28960 - 11904: 0xDA58,\n\t28961 - 11904: 0xB54C,\n\t28962 - 11904: 0xDA60,\n\t28963 - 11904: 0xDA5E,\n\t28965 - 11904: 0xDA5F,\n\t28966 - 11904: 0xB54A,\n\t28968 - 11904: 0xDA63,\n\t28969 - 11904: 0x95BC,\n\t28971 - 11904: 0xFDED,\n\t28972 - 11904: 0xFDF7,\n\t28974 - 11904: 0xDA5C,\n\t28975 - 11904: 0xDA5A,\n\t28976 - 11904: 0xB54B,\n\t28977 - 11904: 0xDA5D,\n\t28978 - 11904: 0xDA61,\n\t28979 - 11904: 0x9870,\n\t28980 - 11904: 0x96F6,\n\t28981 - 11904: 0x8EA9,\n\t28982 - 11904: 0xB54D,\n\t28986 - 11904: 0xDA64,\n\t28987 - 11904: 0x9451,\n\t28990 - 11904: 0x8E43,\n\t28992 - 11904: 0x8B5A,\n\t28993 - 11904: 0xDE70,\n\t28994 - 11904: 0xDE77,\n\t28995 - 11904: 0xDE79,\n\t28996 - 11904: 0xDEA1,\n\t28997 - 11904: 0xFDEE,\n\t28998 - 11904: 0xB7DA,\n\t28999 - 11904: 0xDE6B,\n\t29001 - 11904: 0xB7D2,\n\t29002 - 11904: 0xFDF0,\n\t29003 - 11904: 0xDE7A,\n\t29004 - 11904: 0xB7D7,\n\t29005 - 11904: 0xDEA2,\n\t29006 - 11904: 0xB7CE,\n\t29007 - 11904: 0xFDF4,\n\t29008 - 11904: 0xDE7D,\n\t29009 - 11904: 0x9BF5,\n\t29010 - 11904: 0xDE6D,\n\t29011 - 11904: 0xDE7E,\n\t29012 - 11904: 0xDE6C,\n\t29014 - 11904: 0xB7DC,\n\t29015 - 11904: 0x8CEE,\n\t29016 - 11904: 0xDE78,\n\t29017 - 11904: 0xB7CF,\n\t29018 - 11904: 0xDEA3,\n\t29020 - 11904: 0xB7D4,\n\t29021 - 11904: 0xDE71,\n\t29022 - 11904: 0xB7D9,\n\t29023 - 11904: 0xDE7C,\n\t29024 - 11904: 0xDE6F,\n\t29025 - 11904: 0xDE76,\n\t29026 - 11904: 0xDE72,\n\t29027 - 11904: 0xDE6E,\n\t29028 - 11904: 0xB7D1,\n\t29029 - 11904: 0xB7D8,\n\t29030 - 11904: 0xB7D6,\n\t29031 - 11904: 0xB7D3,\n\t29032 - 11904: 0xB7DB,\n\t29033 - 11904: 0xB7D0,\n\t29034 - 11904: 0xDE75,\n\t29035 - 11904: 0x977E,\n\t29036 - 11904: 0xB7D5,\n\t29038 - 11904: 0xFDF1,\n\t29040 - 11904: 0xDE7B,\n\t29041 - 11904: 0x9BD5,\n\t29042 - 11904: 0xDE73,\n\t29043 - 11904: 0x9AC3,\n\t29045 - 11904: 0x97C8,\n\t29046 - 11904: 0xA0DB,\n\t29047 - 11904: 0x91D0,\n\t29048 - 11904: 0xDE74,\n\t29050 - 11904: 0x9FE4,\n\t29051 - 11904: 0xE2C1,\n\t29052 - 11904: 0x8FDD,\n\t29053 - 11904: 0xBAB4,\n\t29054 - 11904: 0x91E9,\n\t29056 - 11904: 0xE2BD,\n\t29057 - 11904: 0xE2C3,\n\t29058 - 11904: 0xE2BF,\n\t29060 - 11904: 0xBAB6,\n\t29061 - 11904: 0xE2BE,\n\t29062 - 11904: 0xE2C2,\n\t29063 - 11904: 0xE2BA,\n\t29064 - 11904: 0x98E0,\n\t29065 - 11904: 0xE2BC,\n\t29066 - 11904: 0xBAB5,\n\t29068 - 11904: 0x92CA,\n\t29070 - 11904: 0x9857,\n\t29071 - 11904: 0xE2C0,\n\t29072 - 11904: 0xE2BB,\n\t29073 - 11904: 0x8C51,\n\t29074 - 11904: 0xBAB7,\n\t29076 - 11904: 0xBAB2,\n\t29078 - 11904: 0xFDEB,\n\t29079 - 11904: 0xE2C4,\n\t29080 - 11904: 0x9B49,\n\t29081 - 11904: 0xBAB3,\n\t29082 - 11904: 0xE667,\n\t29083 - 11904: 0xE664,\n\t29084 - 11904: 0xE670,\n\t29085 - 11904: 0xE66A,\n\t29086 - 11904: 0xE66C,\n\t29087 - 11904: 0xBCF4,\n\t29088 - 11904: 0xE666,\n\t29089 - 11904: 0xE66E,\n\t29090 - 11904: 0x9D76,\n\t29091 - 11904: 0x9EAF,\n\t29092 - 11904: 0xE66D,\n\t29093 - 11904: 0xE66B,\n\t29095 - 11904: 0xE671,\n\t29096 - 11904: 0xBCF7,\n\t29097 - 11904: 0xE668,\n\t29098 - 11904: 0xE66F,\n\t29100 - 11904: 0xBCF5,\n\t29101 - 11904: 0x9CCC,\n\t29103 - 11904: 0xE663,\n\t29104 - 11904: 0xE665,\n\t29105 - 11904: 0xBCF6,\n\t29106 - 11904: 0xE662,\n\t29107 - 11904: 0xE672,\n\t29108 - 11904: 0xFDEA,\n\t29109 - 11904: 0xE669,\n\t29111 - 11904: 0x8DF1,\n\t29112 - 11904: 0xEA4A,\n\t29113 - 11904: 0xBF51,\n\t29114 - 11904: 0xFDFB,\n\t29116 - 11904: 0xEA55,\n\t29117 - 11904: 0xEA53,\n\t29118 - 11904: 0xBF4B,\n\t29119 - 11904: 0xEA49,\n\t29120 - 11904: 0xEA4C,\n\t29121 - 11904: 0xEA4D,\n\t29122 - 11904: 0xEA48,\n\t29123 - 11904: 0xBF55,\n\t29124 - 11904: 0xBF56,\n\t29125 - 11904: 0xEA47,\n\t29126 - 11904: 0xEA56,\n\t29127 - 11904: 0xEA51,\n\t29128 - 11904: 0xBF4F,\n\t29129 - 11904: 0xBF4C,\n\t29130 - 11904: 0xEA50,\n\t29131 - 11904: 0xEA4E,\n\t29134 - 11904: 0xBF52,\n\t29135 - 11904: 0xEA52,\n\t29136 - 11904: 0xBF4D,\n\t29137 - 11904: 0x8E53,\n\t29138 - 11904: 0xBF4E,\n\t29140 - 11904: 0xEA4F,\n\t29141 - 11904: 0xBF50,\n\t29142 - 11904: 0xEA4B,\n\t29144 - 11904: 0xEA54,\n\t29145 - 11904: 0xBF53,\n\t29146 - 11904: 0xEA57,\n\t29147 - 11904: 0xEA58,\n\t29148 - 11904: 0xBF54,\n\t29149 - 11904: 0xFACF,\n\t29151 - 11904: 0xC0E7,\n\t29152 - 11904: 0xC0EE,\n\t29153 - 11904: 0xED5C,\n\t29154 - 11904: 0xED62,\n\t29156 - 11904: 0xED60,\n\t29157 - 11904: 0xC0EA,\n\t29158 - 11904: 0xC0E9,\n\t29159 - 11904: 0xC0E6,\n\t29160 - 11904: 0xED5E,\n\t29163 - 11904: 0x96F9,\n\t29164 - 11904: 0xC0EC,\n\t29165 - 11904: 0xC0EB,\n\t29166 - 11904: 0xC0E8,\n\t29168 - 11904: 0xED61,\n\t29169 - 11904: 0xED5D,\n\t29170 - 11904: 0xED5F,\n\t29172 - 11904: 0xC0ED,\n\t29173 - 11904: 0x98BF,\n\t29174 - 11904: 0x9E49,\n\t29176 - 11904: 0xC277,\n\t29177 - 11904: 0xEFFB,\n\t29179 - 11904: 0xC274,\n\t29180 - 11904: 0xC275,\n\t29181 - 11904: 0xEFFD,\n\t29182 - 11904: 0xC276,\n\t29183 - 11904: 0xEFFA,\n\t29184 - 11904: 0x8CA7,\n\t29185 - 11904: 0xEFF9,\n\t29186 - 11904: 0xF26C,\n\t29187 - 11904: 0xEFFC,\n\t29189 - 11904: 0xF26D,\n\t29190 - 11904: 0xC37A,\n\t29191 - 11904: 0xF26B,\n\t29193 - 11904: 0x9BCA,\n\t29194 - 11904: 0xF26A,\n\t29196 - 11904: 0xF269,\n\t29197 - 11904: 0xC37B,\n\t29198 - 11904: 0xFDFE,\n\t29199 - 11904: 0x92DC,\n\t29200 - 11904: 0xC46C,\n\t29203 - 11904: 0xF46A,\n\t29204 - 11904: 0xF46B,\n\t29205 - 11904: 0xFE41,\n\t29206 - 11904: 0x91CC,\n\t29207 - 11904: 0x91E2,\n\t29209 - 11904: 0xF5DC,\n\t29210 - 11904: 0xF5DB,\n\t29211 - 11904: 0xC4EA,\n\t29213 - 11904: 0xF5DA,\n\t29214 - 11904: 0xF6EC,\n\t29215 - 11904: 0xF6ED,\n\t29218 - 11904: 0xF7E6,\n\t29219 - 11904: 0xF8B1,\n\t29220 - 11904: 0xFE44,\n\t29221 - 11904: 0x875F,\n\t29222 - 11904: 0xF8F6,\n\t29223 - 11904: 0xF9BC,\n\t29224 - 11904: 0xC679,\n\t29225 - 11904: 0xF9C6,\n\t29226 - 11904: 0xA4F6,\n\t29227 - 11904: 0x8BD3,\n\t29228 - 11904: 0xAAA6,\n\t29229 - 11904: 0xAAA7,\n\t29230 - 11904: 0xFE47,\n\t29232 - 11904: 0xACB8,\n\t29237 - 11904: 0xC0EF,\n\t29238 - 11904: 0xA4F7,\n\t29240 - 11904: 0xAAA8,\n\t29241 - 11904: 0xAF52,\n\t29242 - 11904: 0xB7DD,\n\t29243 - 11904: 0xA4F8,\n\t29245 - 11904: 0xB26E,\n\t29246 - 11904: 0xBAB8,\n\t29247 - 11904: 0xC962,\n\t29248 - 11904: 0xFE48,\n\t29249 - 11904: 0xCFB7,\n\t29250 - 11904: 0xD27D,\n\t29252 - 11904: 0xE2C5,\n\t29254 - 11904: 0xC0F0,\n\t29255 - 11904: 0xA4F9,\n\t29256 - 11904: 0xAAA9,\n\t29257 - 11904: 0xCFB8,\n\t29258 - 11904: 0xCFB9,\n\t29259 - 11904: 0xDA66,\n\t29260 - 11904: 0xB550,\n\t29263 - 11904: 0xDEA4,\n\t29264 - 11904: 0xA0E4,\n\t29266 - 11904: 0xB7DE,\n\t29267 - 11904: 0xE2C6,\n\t29269 - 11904: 0xFE4B,\n\t29270 - 11904: 0xBCF8,\n\t29271 - 11904: 0xFE4C,\n\t29272 - 11904: 0xC37C,\n\t29273 - 11904: 0xA4FA,\n\t29274 - 11904: 0xDA67,\n\t29275 - 11904: 0xA4FB,\n\t29276 - 11904: 0x8DBF,\n\t29277 - 11904: 0xA6C9,\n\t29278 - 11904: 0xCA42,\n\t29279 - 11904: 0xA6C8,\n\t29280 - 11904: 0xA865,\n\t29281 - 11904: 0xA864,\n\t29282 - 11904: 0xA863,\n\t29283 - 11904: 0xCB60,\n\t29286 - 11904: 0x9E78,\n\t29287 - 11904: 0xAAAA,\n\t29289 - 11904: 0xAAAB,\n\t29290 - 11904: 0xCD5B,\n\t29292 - 11904: 0xCFBA,\n\t29294 - 11904: 0xCFBD,\n\t29295 - 11904: 0xACBA,\n\t29296 - 11904: 0xCFBB,\n\t29298 - 11904: 0xACB9,\n\t29299 - 11904: 0xCFBC,\n\t29300 - 11904: 0xACBB,\n\t29302 - 11904: 0xD2A2,\n\t29303 - 11904: 0xD2A1,\n\t29304 - 11904: 0xD27E,\n\t29305 - 11904: 0xAF53,\n\t29307 - 11904: 0xD65D,\n\t29308 - 11904: 0xD65E,\n\t29309 - 11904: 0xB26F,\n\t29310 - 11904: 0xD65C,\n\t29311 - 11904: 0xD65F,\n\t29312 - 11904: 0xB552,\n\t29313 - 11904: 0xB270,\n\t29314 - 11904: 0xFE51,\n\t29316 - 11904: 0xB551,\n\t29317 - 11904: 0xDA6B,\n\t29318 - 11904: 0xDA6A,\n\t29319 - 11904: 0x9456,\n\t29320 - 11904: 0xDA68,\n\t29321 - 11904: 0xDA69,\n\t29323 - 11904: 0xDA6C,\n\t29324 - 11904: 0xDEA6,\n\t29325 - 11904: 0xDEA5,\n\t29326 - 11904: 0xDEA9,\n\t29327 - 11904: 0x9D61,\n\t29328 - 11904: 0xDEA8,\n\t29329 - 11904: 0xDEA7,\n\t29330 - 11904: 0xBAB9,\n\t29331 - 11904: 0xE2C9,\n\t29332 - 11904: 0x9457,\n\t29333 - 11904: 0xE2C8,\n\t29334 - 11904: 0xBABA,\n\t29335 - 11904: 0xE2C7,\n\t29336 - 11904: 0xE673,\n\t29338 - 11904: 0xE674,\n\t29339 - 11904: 0xBCF9,\n\t29341 - 11904: 0xEA59,\n\t29342 - 11904: 0xEA5A,\n\t29343 - 11904: 0x9966,\n\t29345 - 11904: 0xF272,\n\t29346 - 11904: 0xC37D,\n\t29347 - 11904: 0xF271,\n\t29348 - 11904: 0xF270,\n\t29349 - 11904: 0xF26E,\n\t29350 - 11904: 0xF26F,\n\t29351 - 11904: 0xC4EB,\n\t29352 - 11904: 0xF46C,\n\t29353 - 11904: 0xF6EE,\n\t29354 - 11904: 0xF8F7,\n\t29356 - 11904: 0xA4FC,\n\t29357 - 11904: 0x8BD5,\n\t29358 - 11904: 0xC9A5,\n\t29359 - 11904: 0xA5C7,\n\t29360 - 11904: 0xC9A6,\n\t29362 - 11904: 0xA069,\n\t29364 - 11904: 0xCA43,\n\t29365 - 11904: 0xCA44,\n\t29370 - 11904: 0xCB66,\n\t29373 - 11904: 0xCB62,\n\t29375 - 11904: 0xCB61,\n\t29376 - 11904: 0xAAAC,\n\t29377 - 11904: 0xCB65,\n\t29378 - 11904: 0xA867,\n\t29379 - 11904: 0xCB63,\n\t29380 - 11904: 0xA866,\n\t29381 - 11904: 0xCB67,\n\t29382 - 11904: 0xCB64,\n\t29385 - 11904: 0xCD5F,\n\t29386 - 11904: 0xCFBE,\n\t29387 - 11904: 0xCD5D,\n\t29388 - 11904: 0xCD64,\n\t29389 - 11904: 0x98B4,\n\t29390 - 11904: 0xAAAD,\n\t29392 - 11904: 0xAAB0,\n\t29393 - 11904: 0xCD65,\n\t29394 - 11904: 0xCD61,\n\t29396 - 11904: 0xCD62,\n\t29398 - 11904: 0xCD5C,\n\t29399 - 11904: 0xAAAF,\n\t29400 - 11904: 0xCD5E,\n\t29401 - 11904: 0xAAAE,\n\t29402 - 11904: 0xCD63,\n\t29404 - 11904: 0xCD60,\n\t29407 - 11904: 0xCFC2,\n\t29408 - 11904: 0xACBD,\n\t29409 - 11904: 0xACBE,\n\t29410 - 11904: 0xA049,\n\t29411 - 11904: 0xCFC5,\n\t29412 - 11904: 0xCFBF,\n\t29414 - 11904: 0xCFC4,\n\t29416 - 11904: 0xCFC0,\n\t29417 - 11904: 0xACBC,\n\t29418 - 11904: 0xCFC3,\n\t29419 - 11904: 0xCFC1,\n\t29427 - 11904: 0xD2A8,\n\t29428 - 11904: 0xD2A5,\n\t29430 - 11904: 0xD2A7,\n\t29431 - 11904: 0xAF58,\n\t29432 - 11904: 0xAF57,\n\t29433 - 11904: 0xAF55,\n\t29434 - 11904: 0xD2A4,\n\t29435 - 11904: 0xD2A9,\n\t29436 - 11904: 0xAF54,\n\t29437 - 11904: 0xAF56,\n\t29438 - 11904: 0xD2A6,\n\t29439 - 11904: 0xD667,\n\t29440 - 11904: 0xD2A3,\n\t29441 - 11904: 0xD2AA,\n\t29442 - 11904: 0xA04C,\n\t29444 - 11904: 0x9E65,\n\t29447 - 11904: 0xD662,\n\t29448 - 11904: 0xD666,\n\t29450 - 11904: 0xD665,\n\t29451 - 11904: 0xDA6E,\n\t29452 - 11904: 0xDA79,\n\t29455 - 11904: 0xD668,\n\t29456 - 11904: 0x98B5,\n\t29457 - 11904: 0xD663,\n\t29458 - 11904: 0xDA6D,\n\t29459 - 11904: 0xB274,\n\t29462 - 11904: 0xB273,\n\t29463 - 11904: 0xD661,\n\t29464 - 11904: 0xD664,\n\t29465 - 11904: 0xB275,\n\t29467 - 11904: 0xB272,\n\t29468 - 11904: 0xB271,\n\t29469 - 11904: 0xD660,\n\t29470 - 11904: 0xD669,\n\t29474 - 11904: 0xDA70,\n\t29475 - 11904: 0xDA77,\n\t29477 - 11904: 0xB554,\n\t29478 - 11904: 0xDA76,\n\t29479 - 11904: 0xDA73,\n\t29480 - 11904: 0xFE58,\n\t29481 - 11904: 0xB556,\n\t29482 - 11904: 0xFE52,\n\t29483 - 11904: 0xFE53,\n\t29484 - 11904: 0xA065,\n\t29485 - 11904: 0xDA75,\n\t29486 - 11904: 0xFE59,\n\t29488 - 11904: 0xDA6F,\n\t29489 - 11904: 0xDA71,\n\t29490 - 11904: 0xDA74,\n\t29491 - 11904: 0xDA72,\n\t29492 - 11904: 0xB555,\n\t29493 - 11904: 0xDA78,\n\t29494 - 11904: 0xB553,\n\t29495 - 11904: 0xB7DF,\n\t29496 - 11904: 0x98B7,\n\t29497 - 11904: 0x98B8,\n\t29498 - 11904: 0xDEAD,\n\t29499 - 11904: 0xDEAC,\n\t29500 - 11904: 0xDEAA,\n\t29502 - 11904: 0xB7E2,\n\t29503 - 11904: 0xB7E1,\n\t29504 - 11904: 0xDEAE,\n\t29505 - 11904: 0x98BA,\n\t29506 - 11904: 0xDEAB,\n\t29507 - 11904: 0xE2CA,\n\t29508 - 11904: 0xBABB,\n\t29509 - 11904: 0xB7E0,\n\t29512 - 11904: 0x98BB,\n\t29513 - 11904: 0xDEB0,\n\t29514 - 11904: 0xDEAF,\n\t29516 - 11904: 0xE2CD,\n\t29517 - 11904: 0xE2CB,\n\t29518 - 11904: 0xBCFA,\n\t29519 - 11904: 0x9FBC,\n\t29520 - 11904: 0xBABC,\n\t29521 - 11904: 0xE2CC,\n\t29522 - 11904: 0xE676,\n\t29527 - 11904: 0xBCFB,\n\t29528 - 11904: 0xE675,\n\t29529 - 11904: 0xE67E,\n\t29530 - 11904: 0xE67D,\n\t29531 - 11904: 0xE67B,\n\t29533 - 11904: 0xE67A,\n\t29534 - 11904: 0xE677,\n\t29535 - 11904: 0xE678,\n\t29536 - 11904: 0xE679,\n\t29537 - 11904: 0xE67C,\n\t29538 - 11904: 0xE6A1,\n\t29541 - 11904: 0xEA5F,\n\t29542 - 11904: 0xEA5C,\n\t29543 - 11904: 0xEA5D,\n\t29544 - 11904: 0xBF57,\n\t29545 - 11904: 0xEA5B,\n\t29546 - 11904: 0xEA61,\n\t29547 - 11904: 0xEA60,\n\t29548 - 11904: 0xEA5E,\n\t29550 - 11904: 0xED64,\n\t29551 - 11904: 0xED65,\n\t29552 - 11904: 0xC0F1,\n\t29553 - 11904: 0xA04A,\n\t29554 - 11904: 0xC0F2,\n\t29555 - 11904: 0xED63,\n\t29556 - 11904: 0x9EC7,\n\t29557 - 11904: 0xC279,\n\t29558 - 11904: 0xEFFE,\n\t29559 - 11904: 0xC278,\n\t29560 - 11904: 0xC37E,\n\t29562 - 11904: 0xC3A1,\n\t29563 - 11904: 0xC46D,\n\t29564 - 11904: 0xF46E,\n\t29565 - 11904: 0xF46D,\n\t29566 - 11904: 0xF5DD,\n\t29567 - 11904: 0xF6EF,\n\t29568 - 11904: 0xC57A,\n\t29569 - 11904: 0xF7E8,\n\t29570 - 11904: 0xF7E7,\n\t29571 - 11904: 0xF7E9,\n\t29572 - 11904: 0xA5C8,\n\t29573 - 11904: 0xCFC6,\n\t29574 - 11904: 0xAF59,\n\t29575 - 11904: 0xB276,\n\t29576 - 11904: 0xD66A,\n\t29577 - 11904: 0xA5C9,\n\t29578 - 11904: 0xC9A7,\n\t29579 - 11904: 0xA4FD,\n\t29580 - 11904: 0x8CA9,\n\t29582 - 11904: 0xCA45,\n\t29583 - 11904: 0x98AE,\n\t29586 - 11904: 0xCB6C,\n\t29587 - 11904: 0xCB6A,\n\t29588 - 11904: 0xCB6B,\n\t29589 - 11904: 0xCB68,\n\t29590 - 11904: 0xA868,\n\t29591 - 11904: 0xCB69,\n\t29592 - 11904: 0x92D6,\n\t29596 - 11904: 0xFAE1,\n\t29597 - 11904: 0xCD6D,\n\t29598 - 11904: 0x91D4,\n\t29599 - 11904: 0xAAB3,\n\t29600 - 11904: 0xCD6B,\n\t29601 - 11904: 0xCD67,\n\t29602 - 11904: 0xCD6A,\n\t29604 - 11904: 0xCD66,\n\t29605 - 11904: 0xAAB5,\n\t29606 - 11904: 0xCD69,\n\t29607 - 11904: 0xFADE,\n\t29608 - 11904: 0xAAB2,\n\t29609 - 11904: 0xAAB1,\n\t29610 - 11904: 0xFE5B,\n\t29611 - 11904: 0xAAB4,\n\t29612 - 11904: 0xCD6C,\n\t29613 - 11904: 0xCD68,\n\t29618 - 11904: 0xACC2,\n\t29619 - 11904: 0xACC5,\n\t29620 - 11904: 0xCFCE,\n\t29621 - 11904: 0xCFCD,\n\t29622 - 11904: 0xCFCC,\n\t29623 - 11904: 0xACBF,\n\t29624 - 11904: 0xCFD5,\n\t29625 - 11904: 0xCFCB,\n\t29626 - 11904: 0x8C53,\n\t29627 - 11904: 0xACC1,\n\t29628 - 11904: 0xD2AF,\n\t29630 - 11904: 0xCFD2,\n\t29631 - 11904: 0xCFD0,\n\t29632 - 11904: 0xACC4,\n\t29634 - 11904: 0xCFC8,\n\t29635 - 11904: 0xCFD3,\n\t29636 - 11904: 0x87BF,\n\t29637 - 11904: 0xCFCA,\n\t29638 - 11904: 0xCFD4,\n\t29639 - 11904: 0xCFD1,\n\t29640 - 11904: 0xCFC9,\n\t29641 - 11904: 0xFE5E,\n\t29642 - 11904: 0xACC0,\n\t29643 - 11904: 0xCFD6,\n\t29644 - 11904: 0xCFC7,\n\t29645 - 11904: 0xACC3,\n\t29646 - 11904: 0xFBD7,\n\t29647 - 11904: 0xFE5A,\n\t29648 - 11904: 0x94C5,\n\t29650 - 11904: 0xD2B4,\n\t29651 - 11904: 0xD2AB,\n\t29652 - 11904: 0xD2B6,\n\t29653 - 11904: 0xFACA,\n\t29654 - 11904: 0xD2AE,\n\t29655 - 11904: 0xD2B9,\n\t29656 - 11904: 0xD2BA,\n\t29657 - 11904: 0xD2AC,\n\t29658 - 11904: 0xD2B8,\n\t29659 - 11904: 0xD2B5,\n\t29660 - 11904: 0xD2B3,\n\t29661 - 11904: 0xD2B7,\n\t29662 - 11904: 0xAF5F,\n\t29664 - 11904: 0xAF5D,\n\t29665 - 11904: 0x98C1,\n\t29666 - 11904: 0x975C,\n\t29667 - 11904: 0xD2B1,\n\t29668 - 11904: 0xFE74,\n\t29669 - 11904: 0xD2AD,\n\t29670 - 11904: 0x9773,\n\t29671 - 11904: 0xD2B0,\n\t29672 - 11904: 0xD2BB,\n\t29673 - 11904: 0xD2B2,\n\t29674 - 11904: 0xAF5E,\n\t29675 - 11904: 0xCFCF,\n\t29677 - 11904: 0xAF5A,\n\t29678 - 11904: 0xAF5C,\n\t29679 - 11904: 0xFA46,\n\t29683 - 11904: 0x9764,\n\t29684 - 11904: 0xD678,\n\t29685 - 11904: 0xD66D,\n\t29686 - 11904: 0xD66B,\n\t29687 - 11904: 0xFE68,\n\t29688 - 11904: 0xD66C,\n\t29689 - 11904: 0x964E,\n\t29690 - 11904: 0xD673,\n\t29691 - 11904: 0x9765,\n\t29692 - 11904: 0xD674,\n\t29693 - 11904: 0xD670,\n\t29694 - 11904: 0xB27B,\n\t29695 - 11904: 0xD675,\n\t29696 - 11904: 0xD672,\n\t29697 - 11904: 0xD66F,\n\t29698 - 11904: 0x8C5A,\n\t29699 - 11904: 0xB279,\n\t29700 - 11904: 0xD66E,\n\t29701 - 11904: 0xB277,\n\t29702 - 11904: 0xB27A,\n\t29703 - 11904: 0xD671,\n\t29704 - 11904: 0xD679,\n\t29705 - 11904: 0xAF5B,\n\t29706 - 11904: 0xB278,\n\t29707 - 11904: 0xD677,\n\t29708 - 11904: 0xD676,\n\t29709 - 11904: 0xB27C,\n\t29713 - 11904: 0x89A1,\n\t29714 - 11904: 0x95FA,\n\t29716 - 11904: 0x92D4,\n\t29717 - 11904: 0xFE69,\n\t29718 - 11904: 0xDA7E,\n\t29719 - 11904: 0xFB45,\n\t29721 - 11904: 0x98C8,\n\t29722 - 11904: 0xDAA1,\n\t29723 - 11904: 0xB560,\n\t29724 - 11904: 0x90EF,\n\t29725 - 11904: 0xDAA7,\n\t29726 - 11904: 0x98C9,\n\t29727 - 11904: 0x98CA,\n\t29728 - 11904: 0xDAA9,\n\t29729 - 11904: 0xDAA2,\n\t29730 - 11904: 0xB55A,\n\t29731 - 11904: 0xDAA6,\n\t29732 - 11904: 0xDAA5,\n\t29733 - 11904: 0xB55B,\n\t29734 - 11904: 0xB561,\n\t29736 - 11904: 0xB562,\n\t29737 - 11904: 0xDAA8,\n\t29738 - 11904: 0xB558,\n\t29739 - 11904: 0xDA7D,\n\t29740 - 11904: 0xDA7B,\n\t29741 - 11904: 0xDAA3,\n\t29742 - 11904: 0xDA7A,\n\t29743 - 11904: 0xB55F,\n\t29744 - 11904: 0xDA7C,\n\t29745 - 11904: 0xDAA4,\n\t29746 - 11904: 0xDAAA,\n\t29747 - 11904: 0xB559,\n\t29748 - 11904: 0xB55E,\n\t29749 - 11904: 0xB55C,\n\t29750 - 11904: 0xB55D,\n\t29751 - 11904: 0x946D,\n\t29752 - 11904: 0x94B7,\n\t29753 - 11904: 0xFE6C,\n\t29754 - 11904: 0xB557,\n\t29756 - 11904: 0x946B,\n\t29759 - 11904: 0xB7E9,\n\t29760 - 11904: 0xDEB7,\n\t29761 - 11904: 0xB7E8,\n\t29762 - 11904: 0xDEBB,\n\t29763 - 11904: 0x92FC,\n\t29764 - 11904: 0xDEB1,\n\t29765 - 11904: 0x95EB,\n\t29766 - 11904: 0xDEBC,\n\t29767 - 11904: 0xFE73,\n\t29768 - 11904: 0x976E,\n\t29769 - 11904: 0xFE5F,\n\t29770 - 11904: 0xDEB2,\n\t29771 - 11904: 0xDEB3,\n\t29772 - 11904: 0x87B8,\n\t29773 - 11904: 0xDEBD,\n\t29774 - 11904: 0xDEBA,\n\t29775 - 11904: 0xDEB8,\n\t29776 - 11904: 0xDEB9,\n\t29777 - 11904: 0xDEB5,\n\t29778 - 11904: 0xDEB4,\n\t29779 - 11904: 0xFDBD,\n\t29780 - 11904: 0xDEBE,\n\t29781 - 11904: 0xB7E5,\n\t29782 - 11904: 0x92D5,\n\t29783 - 11904: 0xDEB6,\n\t29785 - 11904: 0xB7EA,\n\t29786 - 11904: 0xB7E4,\n\t29787 - 11904: 0xB7EB,\n\t29788 - 11904: 0xFE6F,\n\t29789 - 11904: 0xFEB9,\n\t29790 - 11904: 0xB7E7,\n\t29791 - 11904: 0xB7E6,\n\t29792 - 11904: 0xFE71,\n\t29793 - 11904: 0x8778,\n\t29794 - 11904: 0xE2CE,\n\t29795 - 11904: 0xBABE,\n\t29796 - 11904: 0xBABD,\n\t29797 - 11904: 0xFBBB,\n\t29799 - 11904: 0xE2D3,\n\t29800 - 11904: 0xA0D5,\n\t29801 - 11904: 0xBCFC,\n\t29802 - 11904: 0xBABF,\n\t29803 - 11904: 0x95FB,\n\t29804 - 11904: 0xFE77,\n\t29805 - 11904: 0xBAC1,\n\t29806 - 11904: 0xE2D4,\n\t29807 - 11904: 0xB7E3,\n\t29808 - 11904: 0xBAC0,\n\t29809 - 11904: 0xE2D0,\n\t29810 - 11904: 0xE2D2,\n\t29811 - 11904: 0xE2CF,\n\t29812 - 11904: 0xFE79,\n\t29813 - 11904: 0xE2D1,\n\t29814 - 11904: 0xFE75,\n\t29817 - 11904: 0xE6AB,\n\t29818 - 11904: 0x945D,\n\t29820 - 11904: 0xE6AA,\n\t29821 - 11904: 0xE6A7,\n\t29822 - 11904: 0xBD40,\n\t29823 - 11904: 0xEA62,\n\t29824 - 11904: 0xBD41,\n\t29825 - 11904: 0xE6A6,\n\t29826 - 11904: 0xFE7C,\n\t29827 - 11904: 0xBCFE,\n\t29829 - 11904: 0xE6A8,\n\t29830 - 11904: 0xE6A5,\n\t29831 - 11904: 0xE6A2,\n\t29832 - 11904: 0xE6A9,\n\t29833 - 11904: 0xE6A3,\n\t29834 - 11904: 0xE6A4,\n\t29835 - 11904: 0xBCFD,\n\t29836 - 11904: 0x9344,\n\t29837 - 11904: 0x8EA6,\n\t29840 - 11904: 0xED69,\n\t29842 - 11904: 0xEA66,\n\t29844 - 11904: 0xEA65,\n\t29845 - 11904: 0xEA67,\n\t29847 - 11904: 0xED66,\n\t29848 - 11904: 0xBF5A,\n\t29849 - 11904: 0x92D3,\n\t29850 - 11904: 0xEA63,\n\t29851 - 11904: 0x94B8,\n\t29852 - 11904: 0xBF58,\n\t29853 - 11904: 0x8779,\n\t29854 - 11904: 0xBF5C,\n\t29855 - 11904: 0xBF5B,\n\t29856 - 11904: 0xEA64,\n\t29857 - 11904: 0xEA68,\n\t29859 - 11904: 0xBF59,\n\t29860 - 11904: 0xFC71,\n\t29861 - 11904: 0xED6D,\n\t29862 - 11904: 0xC0F5,\n\t29863 - 11904: 0xC27A,\n\t29864 - 11904: 0xC0F6,\n\t29865 - 11904: 0xC0F3,\n\t29866 - 11904: 0xED6A,\n\t29867 - 11904: 0xED68,\n\t29869 - 11904: 0xED6B,\n\t29871 - 11904: 0xED6E,\n\t29872 - 11904: 0xC0F4,\n\t29873 - 11904: 0xED6C,\n\t29874 - 11904: 0xED67,\n\t29876 - 11904: 0x975E,\n\t29877 - 11904: 0xF042,\n\t29878 - 11904: 0xF045,\n\t29879 - 11904: 0xF275,\n\t29880 - 11904: 0xF040,\n\t29881 - 11904: 0x8CAD,\n\t29882 - 11904: 0xF46F,\n\t29883 - 11904: 0xF046,\n\t29885 - 11904: 0xC3A2,\n\t29886 - 11904: 0xF044,\n\t29887 - 11904: 0xC27B,\n\t29888 - 11904: 0xF041,\n\t29889 - 11904: 0xF043,\n\t29890 - 11904: 0xF047,\n\t29891 - 11904: 0xF276,\n\t29893 - 11904: 0xF274,\n\t29894 - 11904: 0x87C1,\n\t29896 - 11904: 0xFEA7,\n\t29898 - 11904: 0xC3A3,\n\t29899 - 11904: 0xF273,\n\t29900 - 11904: 0x946A,\n\t29903 - 11904: 0xC46E,\n\t29904 - 11904: 0x93E3,\n\t29907 - 11904: 0x98CF,\n\t29908 - 11904: 0xC4ED,\n\t29909 - 11904: 0xF6F1,\n\t29910 - 11904: 0xC4EC,\n\t29911 - 11904: 0xF6F3,\n\t29912 - 11904: 0xF6F0,\n\t29913 - 11904: 0xF6F2,\n\t29914 - 11904: 0xC5D0,\n\t29915 - 11904: 0xF8B2,\n\t29916 - 11904: 0xA5CA,\n\t29917 - 11904: 0xCD6E,\n\t29918 - 11904: 0xD2BC,\n\t29919 - 11904: 0xD2BD,\n\t29920 - 11904: 0xB27D,\n\t29921 - 11904: 0xDEBF,\n\t29922 - 11904: 0xBF5D,\n\t29923 - 11904: 0xC3A4,\n\t29924 - 11904: 0xC57B,\n\t29925 - 11904: 0xF8B3,\n\t29926 - 11904: 0xA5CB,\n\t29927 - 11904: 0xA0D9,\n\t29928 - 11904: 0xCD6F,\n\t29929 - 11904: 0xFEAA,\n\t29932 - 11904: 0xCFD7,\n\t29934 - 11904: 0xCFD8,\n\t29936 - 11904: 0xA0BF,\n\t29937 - 11904: 0xA04D,\n\t29938 - 11904: 0xA0B8,\n\t29940 - 11904: 0xD2BE,\n\t29941 - 11904: 0xD2BF,\n\t29942 - 11904: 0xB27E,\n\t29943 - 11904: 0xB2A1,\n\t29944 - 11904: 0xA0CE,\n\t29947 - 11904: 0xDAAB,\n\t29949 - 11904: 0xDEC2,\n\t29950 - 11904: 0xDEC1,\n\t29951 - 11904: 0xDEC0,\n\t29952 - 11904: 0xE2D5,\n\t29954 - 11904: 0xE2D6,\n\t29955 - 11904: 0xE2D7,\n\t29956 - 11904: 0xBAC2,\n\t29957 - 11904: 0xA0B7,\n\t29959 - 11904: 0xE6AD,\n\t29960 - 11904: 0xE6AC,\n\t29963 - 11904: 0xEA69,\n\t29964 - 11904: 0xBF5E,\n\t29965 - 11904: 0xBF5F,\n\t29966 - 11904: 0xFEA9,\n\t29967 - 11904: 0xED72,\n\t29968 - 11904: 0xED6F,\n\t29969 - 11904: 0xED70,\n\t29970 - 11904: 0xED71,\n\t29971 - 11904: 0xF049,\n\t29972 - 11904: 0xF048,\n\t29973 - 11904: 0xC27C,\n\t29974 - 11904: 0xF277,\n\t29975 - 11904: 0xF5DE,\n\t29976 - 11904: 0xA5CC,\n\t29977 - 11904: 0x89C3,\n\t29978 - 11904: 0xACC6,\n\t29980 - 11904: 0xB2A2,\n\t29981 - 11904: 0xDEC3,\n\t29982 - 11904: 0xFEAB,\n\t29983 - 11904: 0xA5CD,\n\t29985 - 11904: 0xD2C0,\n\t29986 - 11904: 0xB2A3,\n\t29989 - 11904: 0xB563,\n\t29990 - 11904: 0xB564,\n\t29992 - 11904: 0xA5CE,\n\t29993 - 11904: 0xA5CF,\n\t29994 - 11904: 0xCA46,\n\t29995 - 11904: 0xA86A,\n\t29996 - 11904: 0xA869,\n\t29997 - 11904: 0xACC7,\n\t29998 - 11904: 0xCFD9,\n\t29999 - 11904: 0xDAAC,\n\t30000 - 11904: 0xA5D0,\n\t30001 - 11904: 0xA5D1,\n\t30002 - 11904: 0xA5D2,\n\t30003 - 11904: 0xA5D3,\n\t30004 - 11904: 0x9DF4,\n\t30005 - 11904: 0x896D,\n\t30007 - 11904: 0xA86B,\n\t30008 - 11904: 0xA86C,\n\t30009 - 11904: 0xCB6E,\n\t30010 - 11904: 0xCB6D,\n\t30011 - 11904: 0x9C7B,\n\t30013 - 11904: 0xAAB6,\n\t30014 - 11904: 0xCD72,\n\t30015 - 11904: 0xCD70,\n\t30016 - 11904: 0xCD71,\n\t30018 - 11904: 0x98D2,\n\t30022 - 11904: 0x9FA9,\n\t30023 - 11904: 0xCFDA,\n\t30024 - 11904: 0xCFDB,\n\t30026 - 11904: 0xFEB2,\n\t30027 - 11904: 0xACCB,\n\t30028 - 11904: 0xACC9,\n\t30029 - 11904: 0xFEB1,\n\t30030 - 11904: 0xACCA,\n\t30031 - 11904: 0xACC8,\n\t30033 - 11904: 0x97D9,\n\t30035 - 11904: 0xA0C4,\n\t30036 - 11904: 0xAF60,\n\t30037 - 11904: 0x9476,\n\t30041 - 11904: 0xAF64,\n\t30042 - 11904: 0xAF63,\n\t30043 - 11904: 0xD2C1,\n\t30044 - 11904: 0xAF62,\n\t30045 - 11904: 0xAF61,\n\t30047 - 11904: 0xD2C2,\n\t30048 - 11904: 0x9978,\n\t30050 - 11904: 0xB2A6,\n\t30051 - 11904: 0xD67B,\n\t30052 - 11904: 0xD67A,\n\t30053 - 11904: 0xB2A4,\n\t30054 - 11904: 0xB2A5,\n\t30055 - 11904: 0xFEB3,\n\t30058 - 11904: 0xB566,\n\t30059 - 11904: 0xB565,\n\t30060 - 11904: 0xDAAE,\n\t30061 - 11904: 0x98D3,\n\t30062 - 11904: 0xFEB4,\n\t30063 - 11904: 0xDAAD,\n\t30064 - 11904: 0xB2A7,\n\t30066 - 11904: 0x98D4,\n\t30070 - 11904: 0xB7ED,\n\t30071 - 11904: 0xDEC5,\n\t30072 - 11904: 0xB7EE,\n\t30073 - 11904: 0xDEC4,\n\t30074 - 11904: 0x9FB9,\n\t30077 - 11904: 0xE2D8,\n\t30078 - 11904: 0xE6AE,\n\t30079 - 11904: 0xBD42,\n\t30080 - 11904: 0xEA6A,\n\t30083 - 11904: 0x9471,\n\t30084 - 11904: 0xED73,\n\t30086 - 11904: 0xC3A6,\n\t30087 - 11904: 0xC3A5,\n\t30090 - 11904: 0xC57C,\n\t30091 - 11904: 0xA5D4,\n\t30092 - 11904: 0xCD73,\n\t30093 - 11904: 0x98D5,\n\t30094 - 11904: 0xFEB8,\n\t30095 - 11904: 0xB2A8,\n\t30096 - 11904: 0xE2D9,\n\t30097 - 11904: 0xBAC3,\n\t30098 - 11904: 0xC6D4,\n\t30100 - 11904: 0xCB6F,\n\t30101 - 11904: 0xCB70,\n\t30104 - 11904: 0xCD74,\n\t30105 - 11904: 0xAAB8,\n\t30106 - 11904: 0xAAB9,\n\t30109 - 11904: 0xAAB7,\n\t30110 - 11904: 0xFEBA,\n\t30114 - 11904: 0xACCF,\n\t30115 - 11904: 0xACD0,\n\t30116 - 11904: 0xACCD,\n\t30117 - 11904: 0xACCE,\n\t30119 - 11904: 0xCFDC,\n\t30122 - 11904: 0xCFDD,\n\t30123 - 11904: 0xACCC,\n\t30128 - 11904: 0xD2C3,\n\t30129 - 11904: 0x9E5C,\n\t30130 - 11904: 0xAF68,\n\t30131 - 11904: 0xAF69,\n\t30132 - 11904: 0xFEBB,\n\t30133 - 11904: 0xB2AB,\n\t30134 - 11904: 0xD2C9,\n\t30136 - 11904: 0xAF6E,\n\t30137 - 11904: 0xAF6C,\n\t30138 - 11904: 0xD2CA,\n\t30139 - 11904: 0xD2C5,\n\t30140 - 11904: 0xAF6B,\n\t30141 - 11904: 0xAF6A,\n\t30142 - 11904: 0xAF65,\n\t30143 - 11904: 0xD2C8,\n\t30144 - 11904: 0xD2C7,\n\t30145 - 11904: 0xD2C4,\n\t30146 - 11904: 0xAF6D,\n\t30147 - 11904: 0xA044,\n\t30148 - 11904: 0xD2C6,\n\t30149 - 11904: 0xAF66,\n\t30151 - 11904: 0xAF67,\n\t30152 - 11904: 0x98D7,\n\t30154 - 11904: 0xB2AC,\n\t30155 - 11904: 0xD6A1,\n\t30156 - 11904: 0xD6A2,\n\t30157 - 11904: 0xB2AD,\n\t30158 - 11904: 0xD67C,\n\t30159 - 11904: 0xD67E,\n\t30160 - 11904: 0xD6A4,\n\t30161 - 11904: 0xD6A3,\n\t30162 - 11904: 0xD67D,\n\t30164 - 11904: 0xB2A9,\n\t30165 - 11904: 0xB2AA,\n\t30167 - 11904: 0xDAB6,\n\t30168 - 11904: 0xB56B,\n\t30169 - 11904: 0xB56A,\n\t30170 - 11904: 0xDAB0,\n\t30171 - 11904: 0xB568,\n\t30172 - 11904: 0x98D8,\n\t30173 - 11904: 0xDAB3,\n\t30174 - 11904: 0xB56C,\n\t30175 - 11904: 0xDAB4,\n\t30176 - 11904: 0xB56D,\n\t30177 - 11904: 0xDAB1,\n\t30178 - 11904: 0xB567,\n\t30179 - 11904: 0xB569,\n\t30180 - 11904: 0xDAB5,\n\t30182 - 11904: 0xDAB2,\n\t30183 - 11904: 0xDAAF,\n\t30189 - 11904: 0xDED2,\n\t30191 - 11904: 0xDEC7,\n\t30192 - 11904: 0xB7F0,\n\t30193 - 11904: 0xB7F3,\n\t30194 - 11904: 0xB7F2,\n\t30195 - 11904: 0xB7F7,\n\t30196 - 11904: 0xB7F6,\n\t30197 - 11904: 0xDED3,\n\t30198 - 11904: 0xDED1,\n\t30199 - 11904: 0xDECA,\n\t30200 - 11904: 0xDECE,\n\t30201 - 11904: 0xDECD,\n\t30202 - 11904: 0xB7F4,\n\t30203 - 11904: 0xDED0,\n\t30204 - 11904: 0xDECC,\n\t30205 - 11904: 0xDED4,\n\t30206 - 11904: 0xDECB,\n\t30207 - 11904: 0xB7F5,\n\t30208 - 11904: 0xB7EF,\n\t30209 - 11904: 0xB7F1,\n\t30210 - 11904: 0xFEBC,\n\t30211 - 11904: 0xDEC9,\n\t30215 - 11904: 0x9FFE,\n\t30216 - 11904: 0xE2DB,\n\t30217 - 11904: 0xBAC7,\n\t30218 - 11904: 0xE2DF,\n\t30219 - 11904: 0xBAC6,\n\t30220 - 11904: 0xE2DC,\n\t30221 - 11904: 0xBAC5,\n\t30223 - 11904: 0xDEC8,\n\t30224 - 11904: 0xDECF,\n\t30225 - 11904: 0xE2DE,\n\t30227 - 11904: 0xBAC8,\n\t30228 - 11904: 0xE2E0,\n\t30229 - 11904: 0xE2DD,\n\t30230 - 11904: 0xE2DA,\n\t30233 - 11904: 0xE6B1,\n\t30234 - 11904: 0xE6B5,\n\t30235 - 11904: 0xE6B7,\n\t30236 - 11904: 0xE6B3,\n\t30237 - 11904: 0xE6B2,\n\t30238 - 11904: 0xE6B0,\n\t30239 - 11904: 0xBD45,\n\t30240 - 11904: 0xBD43,\n\t30241 - 11904: 0xBD48,\n\t30242 - 11904: 0xBD49,\n\t30243 - 11904: 0xE6B4,\n\t30244 - 11904: 0xBD46,\n\t30245 - 11904: 0xE6AF,\n\t30246 - 11904: 0xBD47,\n\t30247 - 11904: 0xBAC4,\n\t30248 - 11904: 0xE6B6,\n\t30249 - 11904: 0xBD44,\n\t30252 - 11904: 0xFEBD,\n\t30253 - 11904: 0xEA6C,\n\t30255 - 11904: 0xEA6B,\n\t30256 - 11904: 0xEA73,\n\t30257 - 11904: 0xEA6D,\n\t30258 - 11904: 0xEA72,\n\t30259 - 11904: 0xEA6F,\n\t30260 - 11904: 0xBF60,\n\t30261 - 11904: 0xEA71,\n\t30264 - 11904: 0xBF61,\n\t30266 - 11904: 0xBF62,\n\t30267 - 11904: 0x9DDD,\n\t30268 - 11904: 0xEA70,\n\t30269 - 11904: 0xEA6E,\n\t30272 - 11904: 0x9EE1,\n\t30274 - 11904: 0xC0F8,\n\t30275 - 11904: 0xED74,\n\t30278 - 11904: 0xC0F7,\n\t30279 - 11904: 0xED77,\n\t30280 - 11904: 0xED75,\n\t30281 - 11904: 0xED76,\n\t30284 - 11904: 0xC0F9,\n\t30285 - 11904: 0x98DA,\n\t30286 - 11904: 0x9DDF,\n\t30287 - 11904: 0xFEBF,\n\t30288 - 11904: 0xF04D,\n\t30289 - 11904: 0xFEBE,\n\t30290 - 11904: 0xC2A1,\n\t30291 - 11904: 0xF04E,\n\t30292 - 11904: 0x9EEB,\n\t30294 - 11904: 0xC27D,\n\t30295 - 11904: 0xF04F,\n\t30296 - 11904: 0xC27E,\n\t30297 - 11904: 0xF04C,\n\t30298 - 11904: 0xF050,\n\t30300 - 11904: 0xF04A,\n\t30303 - 11904: 0xC3A7,\n\t30304 - 11904: 0xF278,\n\t30305 - 11904: 0xC3A8,\n\t30306 - 11904: 0xC46F,\n\t30308 - 11904: 0xF04B,\n\t30309 - 11904: 0xC470,\n\t30310 - 11904: 0x9E59,\n\t30311 - 11904: 0xA05C,\n\t30313 - 11904: 0xC4EE,\n\t30314 - 11904: 0xF5DF,\n\t30316 - 11904: 0xC57E,\n\t30317 - 11904: 0xF6F4,\n\t30318 - 11904: 0xC57D,\n\t30319 - 11904: 0xFEC0,\n\t30320 - 11904: 0xF7EA,\n\t30321 - 11904: 0xC5F5,\n\t30322 - 11904: 0xC5F6,\n\t30323 - 11904: 0x9477,\n\t30324 - 11904: 0x98DC,\n\t30325 - 11904: 0xF9CC,\n\t30326 - 11904: 0xFEC1,\n\t30328 - 11904: 0xACD1,\n\t30329 - 11904: 0xCFDE,\n\t30330 - 11904: 0x98DE,\n\t30331 - 11904: 0xB56E,\n\t30332 - 11904: 0xB56F,\n\t30333 - 11904: 0xA5D5,\n\t30334 - 11904: 0xA6CA,\n\t30335 - 11904: 0xCA47,\n\t30337 - 11904: 0xCB71,\n\t30338 - 11904: 0xA86D,\n\t30340 - 11904: 0xAABA,\n\t30342 - 11904: 0xACD2,\n\t30343 - 11904: 0xACD3,\n\t30344 - 11904: 0xACD4,\n\t30345 - 11904: 0xD6A6,\n\t30346 - 11904: 0xD2CB,\n\t30347 - 11904: 0xAF6F,\n\t30350 - 11904: 0xB2AE,\n\t30351 - 11904: 0xD6A5,\n\t30352 - 11904: 0xFEC3,\n\t30354 - 11904: 0xDAB8,\n\t30355 - 11904: 0xB571,\n\t30357 - 11904: 0xDAB7,\n\t30358 - 11904: 0xB570,\n\t30361 - 11904: 0xDED5,\n\t30362 - 11904: 0xBD4A,\n\t30363 - 11904: 0xE6BB,\n\t30364 - 11904: 0xE6B8,\n\t30365 - 11904: 0xE6B9,\n\t30366 - 11904: 0xE6BA,\n\t30369 - 11904: 0xFEC8,\n\t30372 - 11904: 0xED78,\n\t30373 - 11904: 0xFEC9,\n\t30374 - 11904: 0xF051,\n\t30378 - 11904: 0xF471,\n\t30379 - 11904: 0xF470,\n\t30381 - 11904: 0xF6F5,\n\t30382 - 11904: 0xA5D6,\n\t30383 - 11904: 0xCD75,\n\t30384 - 11904: 0xAF70,\n\t30388 - 11904: 0xB572,\n\t30389 - 11904: 0xDED6,\n\t30391 - 11904: 0xFECA,\n\t30392 - 11904: 0xE2E1,\n\t30394 - 11904: 0xBD4B,\n\t30395 - 11904: 0xEA74,\n\t30397 - 11904: 0xF052,\n\t30398 - 11904: 0xF472,\n\t30399 - 11904: 0xA5D7,\n\t30402 - 11904: 0xAABB,\n\t30403 - 11904: 0xACD7,\n\t30404 - 11904: 0xCFDF,\n\t30405 - 11904: 0xACD8,\n\t30406 - 11904: 0xACD6,\n\t30408 - 11904: 0xACD5,\n\t30409 - 11904: 0xD2CC,\n\t30410 - 11904: 0xAF71,\n\t30412 - 11904: 0xFECB,\n\t30413 - 11904: 0xAF72,\n\t30414 - 11904: 0xAF73,\n\t30418 - 11904: 0xB2B0,\n\t30419 - 11904: 0xD6A7,\n\t30420 - 11904: 0xB2AF,\n\t30422 - 11904: 0x9FC2,\n\t30425 - 11904: 0x8C6B,\n\t30426 - 11904: 0xDAB9,\n\t30427 - 11904: 0xB2B1,\n\t30428 - 11904: 0xB573,\n\t30429 - 11904: 0xDED7,\n\t30430 - 11904: 0xB7F8,\n\t30431 - 11904: 0xB7F9,\n\t30433 - 11904: 0xBAC9,\n\t30435 - 11904: 0xBACA,\n\t30436 - 11904: 0xBD4C,\n\t30437 - 11904: 0xBF64,\n\t30438 - 11904: 0xEA75,\n\t30439 - 11904: 0xBF63,\n\t30441 - 11904: 0xED79,\n\t30442 - 11904: 0xC0FA,\n\t30444 - 11904: 0xF053,\n\t30445 - 11904: 0xF473,\n\t30446 - 11904: 0xA5D8,\n\t30447 - 11904: 0xA86E,\n\t30448 - 11904: 0xCD78,\n\t30449 - 11904: 0xCD77,\n\t30450 - 11904: 0xAABC,\n\t30451 - 11904: 0xCD76,\n\t30452 - 11904: 0xAABD,\n\t30453 - 11904: 0xCD79,\n\t30455 - 11904: 0xCFE5,\n\t30456 - 11904: 0xACDB,\n\t30457 - 11904: 0xACDA,\n\t30458 - 11904: 0xCFE7,\n\t30459 - 11904: 0xCFE6,\n\t30460 - 11904: 0xACDF,\n\t30462 - 11904: 0xACDE,\n\t30465 - 11904: 0xACD9,\n\t30467 - 11904: 0xCFE1,\n\t30468 - 11904: 0xCFE2,\n\t30469 - 11904: 0xCFE3,\n\t30471 - 11904: 0xACE0,\n\t30472 - 11904: 0xCFE0,\n\t30473 - 11904: 0xACDC,\n\t30474 - 11904: 0xCFE4,\n\t30475 - 11904: 0xACDD,\n\t30476 - 11904: 0x98C4,\n\t30478 - 11904: 0x94B0,\n\t30479 - 11904: 0x94B1,\n\t30480 - 11904: 0xD2CF,\n\t30481 - 11904: 0xD2D3,\n\t30482 - 11904: 0xD2D1,\n\t30483 - 11904: 0xD2D0,\n\t30485 - 11904: 0xD2D4,\n\t30489 - 11904: 0xD2D5,\n\t30490 - 11904: 0xD2D6,\n\t30491 - 11904: 0xD2CE,\n\t30493 - 11904: 0xD2CD,\n\t30494 - 11904: 0xFED1,\n\t30495 - 11904: 0xAF75,\n\t30496 - 11904: 0xAF76,\n\t30498 - 11904: 0xD2D7,\n\t30499 - 11904: 0xD2D2,\n\t30500 - 11904: 0xA0C1,\n\t30501 - 11904: 0xD6B0,\n\t30502 - 11904: 0xFED2,\n\t30503 - 11904: 0xD2D8,\n\t30504 - 11904: 0xAF77,\n\t30505 - 11904: 0xAF74,\n\t30507 - 11904: 0xA0CD,\n\t30509 - 11904: 0xD6AA,\n\t30511 - 11904: 0xD6A9,\n\t30513 - 11904: 0xD6AB,\n\t30514 - 11904: 0xD6AC,\n\t30515 - 11904: 0xD6AE,\n\t30516 - 11904: 0xD6AD,\n\t30517 - 11904: 0xD6B2,\n\t30518 - 11904: 0xB2B5,\n\t30519 - 11904: 0xB2B2,\n\t30520 - 11904: 0xB2B6,\n\t30521 - 11904: 0xD6A8,\n\t30522 - 11904: 0xB2B7,\n\t30523 - 11904: 0xD6B1,\n\t30524 - 11904: 0xB2B4,\n\t30525 - 11904: 0xD6AF,\n\t30526 - 11904: 0xB2B3,\n\t30528 - 11904: 0xFED3,\n\t30531 - 11904: 0x98E5,\n\t30532 - 11904: 0xDABC,\n\t30533 - 11904: 0xDABE,\n\t30534 - 11904: 0xDABA,\n\t30535 - 11904: 0xDABB,\n\t30538 - 11904: 0xDABF,\n\t30539 - 11904: 0xDAC1,\n\t30540 - 11904: 0xDAC2,\n\t30541 - 11904: 0xDABD,\n\t30542 - 11904: 0xDAC0,\n\t30543 - 11904: 0xB574,\n\t30546 - 11904: 0xDEDB,\n\t30548 - 11904: 0xDEE0,\n\t30549 - 11904: 0xDED8,\n\t30550 - 11904: 0xDEDC,\n\t30552 - 11904: 0xFED6,\n\t30553 - 11904: 0xDEE1,\n\t30554 - 11904: 0xDEDD,\n\t30555 - 11904: 0xB7FA,\n\t30556 - 11904: 0xB843,\n\t30558 - 11904: 0xB7FD,\n\t30559 - 11904: 0xDED9,\n\t30560 - 11904: 0xDEDA,\n\t30561 - 11904: 0xBACE,\n\t30562 - 11904: 0xB846,\n\t30563 - 11904: 0xB7FE,\n\t30565 - 11904: 0xB844,\n\t30566 - 11904: 0xB7FC,\n\t30567 - 11904: 0xDEDF,\n\t30568 - 11904: 0xB845,\n\t30569 - 11904: 0xDEDE,\n\t30570 - 11904: 0xB841,\n\t30571 - 11904: 0xB7FB,\n\t30572 - 11904: 0xB842,\n\t30573 - 11904: 0xDEE2,\n\t30574 - 11904: 0xE2E6,\n\t30575 - 11904: 0xE2E8,\n\t30578 - 11904: 0x91E4,\n\t30583 - 11904: 0x8FC7,\n\t30584 - 11904: 0x94AE,\n\t30585 - 11904: 0xB840,\n\t30586 - 11904: 0x8A4F,\n\t30587 - 11904: 0x94B2,\n\t30588 - 11904: 0xE2E3,\n\t30589 - 11904: 0xBACC,\n\t30590 - 11904: 0xE2E9,\n\t30591 - 11904: 0xBACD,\n\t30592 - 11904: 0xE2E7,\n\t30593 - 11904: 0xE2E2,\n\t30594 - 11904: 0xE2E5,\n\t30595 - 11904: 0xE2EA,\n\t30596 - 11904: 0xBACB,\n\t30597 - 11904: 0xE2E4,\n\t30599 - 11904: 0xBD4E,\n\t30600 - 11904: 0xE6BF,\n\t30601 - 11904: 0xE6BE,\n\t30603 - 11904: 0xBD51,\n\t30604 - 11904: 0xBD4F,\n\t30605 - 11904: 0xE6BC,\n\t30606 - 11904: 0xBD4D,\n\t30607 - 11904: 0xE6BD,\n\t30609 - 11904: 0xBD50,\n\t30611 - 11904: 0x8FD4,\n\t30613 - 11904: 0xEA7D,\n\t30615 - 11904: 0xEAA1,\n\t30616 - 11904: 0x98EA,\n\t30617 - 11904: 0xEA7E,\n\t30618 - 11904: 0xEA76,\n\t30619 - 11904: 0xEA7A,\n\t30620 - 11904: 0xEA79,\n\t30621 - 11904: 0xEA77,\n\t30622 - 11904: 0xBF66,\n\t30623 - 11904: 0xBF67,\n\t30624 - 11904: 0xBF65,\n\t30625 - 11904: 0xEA78,\n\t30626 - 11904: 0xEA7B,\n\t30627 - 11904: 0xEA7C,\n\t30629 - 11904: 0xBF68,\n\t30631 - 11904: 0xC140,\n\t30632 - 11904: 0xEDA3,\n\t30634 - 11904: 0xC0FC,\n\t30635 - 11904: 0xED7B,\n\t30636 - 11904: 0xC0FE,\n\t30637 - 11904: 0xC141,\n\t30639 - 11904: 0xFED8,\n\t30640 - 11904: 0xC0FD,\n\t30641 - 11904: 0xEDA2,\n\t30642 - 11904: 0xED7C,\n\t30643 - 11904: 0xC0FB,\n\t30644 - 11904: 0xEDA1,\n\t30645 - 11904: 0xED7A,\n\t30646 - 11904: 0xED7E,\n\t30647 - 11904: 0xED7D,\n\t30649 - 11904: 0x9DE0,\n\t30650 - 11904: 0xF055,\n\t30651 - 11904: 0xC2A4,\n\t30652 - 11904: 0xC2A5,\n\t30653 - 11904: 0xC2A2,\n\t30654 - 11904: 0x98EE,\n\t30655 - 11904: 0xC2A3,\n\t30658 - 11904: 0xF054,\n\t30659 - 11904: 0x95C4,\n\t30660 - 11904: 0xF27B,\n\t30661 - 11904: 0xFCE8,\n\t30663 - 11904: 0xC3A9,\n\t30665 - 11904: 0xF279,\n\t30666 - 11904: 0xF27A,\n\t30667 - 11904: 0x98EF,\n\t30668 - 11904: 0xF474,\n\t30669 - 11904: 0xF477,\n\t30670 - 11904: 0xF475,\n\t30671 - 11904: 0xF476,\n\t30672 - 11904: 0xF5E0,\n\t30675 - 11904: 0xC4EF,\n\t30676 - 11904: 0xF7EB,\n\t30677 - 11904: 0xF8B4,\n\t30679 - 11904: 0xC5F7,\n\t30680 - 11904: 0xF8F8,\n\t30681 - 11904: 0xF8F9,\n\t30682 - 11904: 0xC666,\n\t30683 - 11904: 0xA5D9,\n\t30684 - 11904: 0xACE1,\n\t30685 - 11904: 0x8C6E,\n\t30686 - 11904: 0xDAC3,\n\t30688 - 11904: 0xDEE3,\n\t30690 - 11904: 0xA5DA,\n\t30691 - 11904: 0xA86F,\n\t30693 - 11904: 0xAABE,\n\t30694 - 11904: 0xFAD8,\n\t30695 - 11904: 0xCFE8,\n\t30696 - 11904: 0xCFE9,\n\t30697 - 11904: 0xAF78,\n\t30700 - 11904: 0xDAC4,\n\t30701 - 11904: 0xB575,\n\t30702 - 11904: 0xB847,\n\t30703 - 11904: 0xC142,\n\t30704 - 11904: 0xEDA4,\n\t30705 - 11904: 0xF27C,\n\t30706 - 11904: 0xF478,\n\t30707 - 11904: 0xA5DB,\n\t30708 - 11904: 0xFEDC,\n\t30711 - 11904: 0xCDA1,\n\t30712 - 11904: 0xCD7A,\n\t30713 - 11904: 0xCD7C,\n\t30714 - 11904: 0xCD7E,\n\t30715 - 11904: 0xCD7D,\n\t30716 - 11904: 0xCD7B,\n\t30717 - 11904: 0xAABF,\n\t30718 - 11904: 0xA0AE,\n\t30722 - 11904: 0xACE2,\n\t30723 - 11904: 0xCFF2,\n\t30725 - 11904: 0xCFED,\n\t30726 - 11904: 0xCFEA,\n\t30728 - 11904: 0x9D4C,\n\t30729 - 11904: 0xFEDD,\n\t30732 - 11904: 0xACE4,\n\t30733 - 11904: 0xACE5,\n\t30734 - 11904: 0xCFF0,\n\t30735 - 11904: 0xCFEF,\n\t30736 - 11904: 0xCFEE,\n\t30737 - 11904: 0xCFEB,\n\t30738 - 11904: 0xCFEC,\n\t30739 - 11904: 0xCFF3,\n\t30740 - 11904: 0xACE3,\n\t30744 - 11904: 0x98F1,\n\t30748 - 11904: 0x98F3,\n\t30749 - 11904: 0xAF7C,\n\t30750 - 11904: 0x94C1,\n\t30751 - 11904: 0xAFA4,\n\t30752 - 11904: 0xAFA3,\n\t30753 - 11904: 0xD2E1,\n\t30754 - 11904: 0xD2DB,\n\t30755 - 11904: 0xD2D9,\n\t30757 - 11904: 0xAFA1,\n\t30758 - 11904: 0xD6B9,\n\t30759 - 11904: 0xAF7A,\n\t30760 - 11904: 0xD2DE,\n\t30761 - 11904: 0xD2E2,\n\t30762 - 11904: 0xD2E4,\n\t30763 - 11904: 0xD2E0,\n\t30764 - 11904: 0xD2DA,\n\t30765 - 11904: 0xAFA2,\n\t30766 - 11904: 0xD2DF,\n\t30767 - 11904: 0xD2DD,\n\t30768 - 11904: 0xAF79,\n\t30769 - 11904: 0xD2E5,\n\t30770 - 11904: 0xAFA5,\n\t30771 - 11904: 0xD2E3,\n\t30772 - 11904: 0xAF7D,\n\t30773 - 11904: 0xD2DC,\n\t30775 - 11904: 0xAF7E,\n\t30776 - 11904: 0xAF7B,\n\t30777 - 11904: 0x98F5,\n\t30780 - 11904: 0xFA4F,\n\t30781 - 11904: 0x96E2,\n\t30786 - 11904: 0x9450,\n\t30787 - 11904: 0xB2B9,\n\t30788 - 11904: 0x96A2,\n\t30789 - 11904: 0xD6BA,\n\t30791 - 11904: 0x98F6,\n\t30792 - 11904: 0xD6B3,\n\t30793 - 11904: 0xD6B5,\n\t30794 - 11904: 0xD6B7,\n\t30795 - 11904: 0x96E5,\n\t30796 - 11904: 0xD6B8,\n\t30797 - 11904: 0xD6B6,\n\t30798 - 11904: 0xB2BA,\n\t30800 - 11904: 0xD6BB,\n\t30801 - 11904: 0x98F7,\n\t30802 - 11904: 0xD6B4,\n\t30803 - 11904: 0xA046,\n\t30804 - 11904: 0x96E3,\n\t30812 - 11904: 0xDAC8,\n\t30813 - 11904: 0xB576,\n\t30814 - 11904: 0xDAD0,\n\t30816 - 11904: 0xDAC5,\n\t30818 - 11904: 0xDAD1,\n\t30820 - 11904: 0xDAC6,\n\t30821 - 11904: 0xDAC7,\n\t30822 - 11904: 0x98F8,\n\t30824 - 11904: 0xDACF,\n\t30825 - 11904: 0xDACE,\n\t30826 - 11904: 0xDACB,\n\t30827 - 11904: 0xB2B8,\n\t30828 - 11904: 0xB577,\n\t30829 - 11904: 0xDAC9,\n\t30830 - 11904: 0xDACC,\n\t30831 - 11904: 0xB578,\n\t30832 - 11904: 0xDACD,\n\t30833 - 11904: 0xDACA,\n\t30841 - 11904: 0xDEEE,\n\t30842 - 11904: 0x9EE4,\n\t30843 - 11904: 0xDEF2,\n\t30844 - 11904: 0xB84E,\n\t30846 - 11904: 0xE2F0,\n\t30847 - 11904: 0xB851,\n\t30848 - 11904: 0xDEF0,\n\t30849 - 11904: 0xF9D6,\n\t30851 - 11904: 0xDEED,\n\t30852 - 11904: 0xDEE8,\n\t30853 - 11904: 0xDEEA,\n\t30854 - 11904: 0xDEEB,\n\t30855 - 11904: 0xDEE4,\n\t30856 - 11904: 0x94C3,\n\t30857 - 11904: 0xB84D,\n\t30860 - 11904: 0xB84C,\n\t30861 - 11904: 0x94C2,\n\t30862 - 11904: 0xB848,\n\t30863 - 11904: 0xDEE7,\n\t30865 - 11904: 0xB84F,\n\t30867 - 11904: 0xB850,\n\t30868 - 11904: 0xDEE6,\n\t30869 - 11904: 0xDEE9,\n\t30870 - 11904: 0xDEF1,\n\t30871 - 11904: 0xB84A,\n\t30872 - 11904: 0xB84B,\n\t30873 - 11904: 0xDEEF,\n\t30874 - 11904: 0xDEE5,\n\t30878 - 11904: 0xE2F2,\n\t30879 - 11904: 0xBAD0,\n\t30880 - 11904: 0xE2F4,\n\t30881 - 11904: 0xDEEC,\n\t30882 - 11904: 0xE2F6,\n\t30883 - 11904: 0xBAD4,\n\t30884 - 11904: 0xE2F7,\n\t30885 - 11904: 0xE2F3,\n\t30887 - 11904: 0xBAD1,\n\t30888 - 11904: 0xE2EF,\n\t30889 - 11904: 0xBAD3,\n\t30890 - 11904: 0xE2EC,\n\t30891 - 11904: 0xE2F1,\n\t30892 - 11904: 0xE2F5,\n\t30893 - 11904: 0xE2EE,\n\t30895 - 11904: 0xFEE1,\n\t30896 - 11904: 0xB849,\n\t30897 - 11904: 0xFEE9,\n\t30898 - 11904: 0xE2EB,\n\t30899 - 11904: 0xBAD2,\n\t30900 - 11904: 0xE2ED,\n\t30902 - 11904: 0x96E4,\n\t30904 - 11904: 0x89AC,\n\t30905 - 11904: 0x96DB,\n\t30906 - 11904: 0xBD54,\n\t30907 - 11904: 0xE6C1,\n\t30908 - 11904: 0xBD58,\n\t30910 - 11904: 0xBD56,\n\t30913 - 11904: 0xBACF,\n\t30915 - 11904: 0xE6C8,\n\t30916 - 11904: 0xE6C9,\n\t30917 - 11904: 0xBD53,\n\t30919 - 11904: 0xFEE2,\n\t30920 - 11904: 0xE6C7,\n\t30921 - 11904: 0xE6CA,\n\t30922 - 11904: 0xBD55,\n\t30923 - 11904: 0xBD52,\n\t30924 - 11904: 0xE6C3,\n\t30925 - 11904: 0xE6C0,\n\t30926 - 11904: 0xE6C5,\n\t30927 - 11904: 0xE6C2,\n\t30928 - 11904: 0xBD59,\n\t30929 - 11904: 0xE6C4,\n\t30930 - 11904: 0x94C4,\n\t30931 - 11904: 0xFEE3,\n\t30932 - 11904: 0xE6C6,\n\t30933 - 11904: 0xBD57,\n\t30935 - 11904: 0xFEE7,\n\t30936 - 11904: 0x9FFB,\n\t30938 - 11904: 0xBF6A,\n\t30939 - 11904: 0xEAA8,\n\t30941 - 11904: 0xEAA2,\n\t30942 - 11904: 0xEAA6,\n\t30943 - 11904: 0xEAAC,\n\t30944 - 11904: 0xEAAD,\n\t30945 - 11904: 0xEAA9,\n\t30946 - 11904: 0xEAAA,\n\t30947 - 11904: 0xEAA7,\n\t30948 - 11904: 0x8C59,\n\t30949 - 11904: 0xEAA4,\n\t30951 - 11904: 0xBF6C,\n\t30952 - 11904: 0xBF69,\n\t30953 - 11904: 0xEAA3,\n\t30954 - 11904: 0xEAA5,\n\t30956 - 11904: 0xBF6B,\n\t30957 - 11904: 0xEAAB,\n\t30958 - 11904: 0x93C9,\n\t30959 - 11904: 0xC146,\n\t30960 - 11904: 0x94E8,\n\t30961 - 11904: 0xFB56,\n\t30962 - 11904: 0xEDAA,\n\t30963 - 11904: 0xEDA5,\n\t30964 - 11904: 0xC145,\n\t30965 - 11904: 0x90C5,\n\t30967 - 11904: 0xC143,\n\t30969 - 11904: 0xEDAC,\n\t30970 - 11904: 0xC144,\n\t30971 - 11904: 0xEDA8,\n\t30972 - 11904: 0xEDA9,\n\t30973 - 11904: 0xEDA6,\n\t30974 - 11904: 0xEDAD,\n\t30975 - 11904: 0xF056,\n\t30977 - 11904: 0xC147,\n\t30978 - 11904: 0xEDA7,\n\t30980 - 11904: 0xEDAE,\n\t30981 - 11904: 0xEDAB,\n\t30982 - 11904: 0xA0A8,\n\t30985 - 11904: 0xF05A,\n\t30988 - 11904: 0xF057,\n\t30990 - 11904: 0xC2A6,\n\t30992 - 11904: 0xF05B,\n\t30993 - 11904: 0xF05D,\n\t30994 - 11904: 0xF05C,\n\t30995 - 11904: 0xF058,\n\t30996 - 11904: 0xF059,\n\t30999 - 11904: 0xF2A3,\n\t31001 - 11904: 0xC3AA,\n\t31003 - 11904: 0xF27E,\n\t31004 - 11904: 0xF2A2,\n\t31005 - 11904: 0xF27D,\n\t31006 - 11904: 0xF2A4,\n\t31009 - 11904: 0xF2A1,\n\t31011 - 11904: 0xF47A,\n\t31012 - 11904: 0xF47D,\n\t31013 - 11904: 0xF479,\n\t31014 - 11904: 0xC471,\n\t31015 - 11904: 0xF47B,\n\t31016 - 11904: 0xF47C,\n\t31017 - 11904: 0xF47E,\n\t31018 - 11904: 0xC472,\n\t31019 - 11904: 0xC474,\n\t31020 - 11904: 0xC473,\n\t31021 - 11904: 0xF5E1,\n\t31022 - 11904: 0xFEE5,\n\t31023 - 11904: 0xF5E3,\n\t31025 - 11904: 0xF5E2,\n\t31026 - 11904: 0x98FD,\n\t31027 - 11904: 0x98FB,\n\t31028 - 11904: 0xFEE8,\n\t31029 - 11904: 0xF6F6,\n\t31030 - 11904: 0x8EBF,\n\t31032 - 11904: 0xF8B5,\n\t31033 - 11904: 0xF8FA,\n\t31034 - 11904: 0xA5DC,\n\t31035 - 11904: 0x8BD8,\n\t31036 - 11904: 0xFEF7,\n\t31037 - 11904: 0xCB72,\n\t31038 - 11904: 0xAAC0,\n\t31039 - 11904: 0xCDA3,\n\t31040 - 11904: 0xAAC1,\n\t31041 - 11904: 0xAAC2,\n\t31042 - 11904: 0xCDA2,\n\t31044 - 11904: 0xCFF8,\n\t31045 - 11904: 0xCFF7,\n\t31046 - 11904: 0xACE6,\n\t31047 - 11904: 0xACE9,\n\t31048 - 11904: 0xACE8,\n\t31049 - 11904: 0xACE7,\n\t31050 - 11904: 0xCFF4,\n\t31051 - 11904: 0xCFF6,\n\t31052 - 11904: 0xCFF5,\n\t31055 - 11904: 0xD2E8,\n\t31056 - 11904: 0xAFA7,\n\t31057 - 11904: 0xD2EC,\n\t31058 - 11904: 0xD2EB,\n\t31059 - 11904: 0xD2EA,\n\t31060 - 11904: 0xD2E6,\n\t31061 - 11904: 0xAFA6,\n\t31062 - 11904: 0xAFAA,\n\t31063 - 11904: 0xAFAD,\n\t31064 - 11904: 0x8F68,\n\t31065 - 11904: 0x94C6,\n\t31066 - 11904: 0xAFAE,\n\t31067 - 11904: 0xD2E7,\n\t31068 - 11904: 0xD2E9,\n\t31069 - 11904: 0xAFAC,\n\t31070 - 11904: 0xAFAB,\n\t31071 - 11904: 0xAFA9,\n\t31072 - 11904: 0xAFA8,\n\t31073 - 11904: 0xD6C2,\n\t31074 - 11904: 0x9DEA,\n\t31075 - 11904: 0xD6C0,\n\t31076 - 11904: 0xD6BC,\n\t31077 - 11904: 0xB2BB,\n\t31079 - 11904: 0xD6BD,\n\t31080 - 11904: 0xB2BC,\n\t31081 - 11904: 0xD6BE,\n\t31082 - 11904: 0xD6BF,\n\t31083 - 11904: 0xD6C1,\n\t31085 - 11904: 0xB2BD,\n\t31088 - 11904: 0xDAD5,\n\t31089 - 11904: 0xFC69,\n\t31090 - 11904: 0xDAD4,\n\t31091 - 11904: 0xDAD3,\n\t31092 - 11904: 0xDAD2,\n\t31097 - 11904: 0xDEF6,\n\t31098 - 11904: 0xB852,\n\t31100 - 11904: 0xDEF3,\n\t31101 - 11904: 0xDEF5,\n\t31102 - 11904: 0x9CDA,\n\t31103 - 11904: 0xB853,\n\t31104 - 11904: 0xFEF3,\n\t31105 - 11904: 0xB854,\n\t31106 - 11904: 0xDEF4,\n\t31107 - 11904: 0x9C72,\n\t31110 - 11904: 0xFEF0,\n\t31111 - 11904: 0x89C9,\n\t31112 - 11904: 0xE341,\n\t31114 - 11904: 0xE2F9,\n\t31115 - 11904: 0xE2FA,\n\t31117 - 11904: 0xBAD7,\n\t31118 - 11904: 0xBAD5,\n\t31119 - 11904: 0xBAD6,\n\t31120 - 11904: 0xE343,\n\t31121 - 11904: 0x9941,\n\t31122 - 11904: 0xE342,\n\t31123 - 11904: 0xE2FE,\n\t31124 - 11904: 0xE2FD,\n\t31125 - 11904: 0xE2FC,\n\t31126 - 11904: 0xE2FB,\n\t31127 - 11904: 0xE340,\n\t31128 - 11904: 0xE2F8,\n\t31129 - 11904: 0x9942,\n\t31130 - 11904: 0xE6CB,\n\t31131 - 11904: 0xE6D0,\n\t31132 - 11904: 0xE6CE,\n\t31133 - 11904: 0xFEF5,\n\t31135 - 11904: 0x91D7,\n\t31136 - 11904: 0xE6CD,\n\t31137 - 11904: 0xE6CC,\n\t31138 - 11904: 0xE6CF,\n\t31140 - 11904: 0xEAAE,\n\t31141 - 11904: 0x94CC,\n\t31142 - 11904: 0xBF6D,\n\t31143 - 11904: 0xC148,\n\t31144 - 11904: 0xEDB0,\n\t31145 - 11904: 0xFEF8,\n\t31146 - 11904: 0xC149,\n\t31147 - 11904: 0xEDAF,\n\t31148 - 11904: 0xF05F,\n\t31149 - 11904: 0xF05E,\n\t31150 - 11904: 0xC2A7,\n\t31152 - 11904: 0xF2A5,\n\t31153 - 11904: 0xC3AB,\n\t31154 - 11904: 0xF4A1,\n\t31155 - 11904: 0xC5A1,\n\t31156 - 11904: 0xF6F7,\n\t31158 - 11904: 0xF8B7,\n\t31159 - 11904: 0xF8B6,\n\t31160 - 11904: 0xC9A8,\n\t31161 - 11904: 0xACEA,\n\t31162 - 11904: 0xACEB,\n\t31163 - 11904: 0xD6C3,\n\t31165 - 11904: 0xB856,\n\t31166 - 11904: 0xA5DD,\n\t31167 - 11904: 0xA872,\n\t31168 - 11904: 0xA871,\n\t31169 - 11904: 0xA870,\n\t31172 - 11904: 0x97A8,\n\t31173 - 11904: 0xCDA4,\n\t31174 - 11904: 0xFEFC,\n\t31176 - 11904: 0xAAC4,\n\t31177 - 11904: 0xAAC3,\n\t31178 - 11904: 0x8CDE,\n\t31179 - 11904: 0xACEE,\n\t31180 - 11904: 0xFDBF,\n\t31181 - 11904: 0xCFFA,\n\t31182 - 11904: 0xCFFD,\n\t31183 - 11904: 0xCFFB,\n\t31184 - 11904: 0x87B3,\n\t31185 - 11904: 0xACEC,\n\t31186 - 11904: 0xACED,\n\t31188 - 11904: 0xFEFE,\n\t31189 - 11904: 0xCFF9,\n\t31190 - 11904: 0xCFFC,\n\t31192 - 11904: 0xAFB5,\n\t31196 - 11904: 0xD2F3,\n\t31197 - 11904: 0xD2F5,\n\t31198 - 11904: 0xD2F4,\n\t31199 - 11904: 0xAFB2,\n\t31200 - 11904: 0xD2EF,\n\t31202 - 11904: 0x96D1,\n\t31203 - 11904: 0xAFB0,\n\t31204 - 11904: 0xAFAF,\n\t31206 - 11904: 0xAFB3,\n\t31207 - 11904: 0xAFB1,\n\t31209 - 11904: 0xAFB4,\n\t31210 - 11904: 0xD2F2,\n\t31211 - 11904: 0xD2ED,\n\t31212 - 11904: 0xD2EE,\n\t31213 - 11904: 0xD2F1,\n\t31214 - 11904: 0xD2F0,\n\t31217 - 11904: 0x94D5,\n\t31220 - 11904: 0x94D0,\n\t31222 - 11904: 0xD6C6,\n\t31223 - 11904: 0xD6C7,\n\t31224 - 11904: 0xD6C5,\n\t31226 - 11904: 0xD6C4,\n\t31227 - 11904: 0xB2BE,\n\t31232 - 11904: 0xB57D,\n\t31234 - 11904: 0xDAD6,\n\t31235 - 11904: 0xDAD8,\n\t31236 - 11904: 0xDADA,\n\t31237 - 11904: 0xB57C,\n\t31238 - 11904: 0x9944,\n\t31240 - 11904: 0xB57A,\n\t31242 - 11904: 0xDAD7,\n\t31243 - 11904: 0xB57B,\n\t31244 - 11904: 0xDAD9,\n\t31245 - 11904: 0xB579,\n\t31248 - 11904: 0xDF41,\n\t31249 - 11904: 0xDEF7,\n\t31250 - 11904: 0xDEFA,\n\t31251 - 11904: 0xDEFE,\n\t31252 - 11904: 0xB85A,\n\t31253 - 11904: 0xDEFC,\n\t31255 - 11904: 0xDEFB,\n\t31256 - 11904: 0xDEF8,\n\t31257 - 11904: 0xDEF9,\n\t31258 - 11904: 0xB858,\n\t31259 - 11904: 0xDF40,\n\t31260 - 11904: 0xB857,\n\t31262 - 11904: 0xB85C,\n\t31263 - 11904: 0xB85B,\n\t31264 - 11904: 0xB859,\n\t31266 - 11904: 0xDEFD,\n\t31270 - 11904: 0xE349,\n\t31272 - 11904: 0xE348,\n\t31274 - 11904: 0x8C63,\n\t31275 - 11904: 0xE344,\n\t31276 - 11904: 0x87BB,\n\t31277 - 11904: 0xA0B3,\n\t31278 - 11904: 0xBAD8,\n\t31279 - 11904: 0xE347,\n\t31280 - 11904: 0xE346,\n\t31281 - 11904: 0xBAD9,\n\t31282 - 11904: 0x87B4,\n\t31287 - 11904: 0xBD5E,\n\t31289 - 11904: 0xE6D2,\n\t31290 - 11904: 0x94CF,\n\t31291 - 11904: 0xBD5F,\n\t31292 - 11904: 0xBD5B,\n\t31293 - 11904: 0xBD5D,\n\t31294 - 11904: 0x9FFA,\n\t31295 - 11904: 0xBD5A,\n\t31296 - 11904: 0xBD5C,\n\t31299 - 11904: 0x91E5,\n\t31300 - 11904: 0xEAAF,\n\t31301 - 11904: 0x9C6A,\n\t31302 - 11904: 0xBF70,\n\t31303 - 11904: 0xEAB1,\n\t31304 - 11904: 0xEAB0,\n\t31305 - 11904: 0x8E49,\n\t31306 - 11904: 0xE345,\n\t31307 - 11904: 0xBF72,\n\t31308 - 11904: 0xBF71,\n\t31309 - 11904: 0xBF6E,\n\t31310 - 11904: 0xBF6F,\n\t31316 - 11904: 0xEDB5,\n\t31318 - 11904: 0xEDB3,\n\t31319 - 11904: 0xC14A,\n\t31320 - 11904: 0xEDB4,\n\t31322 - 11904: 0xEDB6,\n\t31323 - 11904: 0xEDB2,\n\t31324 - 11904: 0xEDB1,\n\t31327 - 11904: 0xF060,\n\t31328 - 11904: 0xC2AA,\n\t31329 - 11904: 0xC2A8,\n\t31330 - 11904: 0xC2A9,\n\t31333 - 11904: 0x8E4C,\n\t31335 - 11904: 0xF2A6,\n\t31336 - 11904: 0xF2A7,\n\t31337 - 11904: 0xC3AD,\n\t31339 - 11904: 0xC3AC,\n\t31340 - 11904: 0xF4A3,\n\t31341 - 11904: 0xF4A4,\n\t31342 - 11904: 0xF4A2,\n\t31344 - 11904: 0xF6F8,\n\t31345 - 11904: 0xF6F9,\n\t31346 - 11904: 0x87C9,\n\t31348 - 11904: 0xA5DE,\n\t31349 - 11904: 0xCA48,\n\t31350 - 11904: 0xA873,\n\t31352 - 11904: 0xCDA5,\n\t31353 - 11904: 0xAAC6,\n\t31354 - 11904: 0xAAC5,\n\t31355 - 11904: 0xCDA6,\n\t31357 - 11904: 0x8E4D,\n\t31358 - 11904: 0xD040,\n\t31359 - 11904: 0xACEF,\n\t31360 - 11904: 0xCFFE,\n\t31361 - 11904: 0xACF0,\n\t31363 - 11904: 0x9A73,\n\t31364 - 11904: 0xAFB6,\n\t31365 - 11904: 0xD2F8,\n\t31366 - 11904: 0xD2F6,\n\t31367 - 11904: 0xD2FC,\n\t31368 - 11904: 0xAFB7,\n\t31369 - 11904: 0xD2F7,\n\t31370 - 11904: 0xD2FB,\n\t31371 - 11904: 0xD2F9,\n\t31372 - 11904: 0xD2FA,\n\t31375 - 11904: 0xD6C8,\n\t31376 - 11904: 0xD6CA,\n\t31377 - 11904: 0x9947,\n\t31378 - 11904: 0xB2BF,\n\t31379 - 11904: 0x8CB1,\n\t31380 - 11904: 0xD6C9,\n\t31381 - 11904: 0xB2C0,\n\t31382 - 11904: 0xB5A2,\n\t31383 - 11904: 0xB5A1,\n\t31384 - 11904: 0xB57E,\n\t31385 - 11904: 0xDADB,\n\t31390 - 11904: 0xDF44,\n\t31391 - 11904: 0xB85D,\n\t31392 - 11904: 0xB85E,\n\t31394 - 11904: 0xDF43,\n\t31395 - 11904: 0xDF42,\n\t31400 - 11904: 0xE34A,\n\t31401 - 11904: 0xBADB,\n\t31402 - 11904: 0xBADA,\n\t31403 - 11904: 0xE34B,\n\t31404 - 11904: 0xE34C,\n\t31406 - 11904: 0xBD61,\n\t31407 - 11904: 0xBD60,\n\t31408 - 11904: 0x8E50,\n\t31409 - 11904: 0xEAB5,\n\t31410 - 11904: 0xE6D3,\n\t31411 - 11904: 0xE6D5,\n\t31412 - 11904: 0xE6D4,\n\t31413 - 11904: 0xEAB4,\n\t31414 - 11904: 0xEAB2,\n\t31415 - 11904: 0xEAB6,\n\t31416 - 11904: 0xEAB3,\n\t31418 - 11904: 0xBF73,\n\t31419 - 11904: 0x8E4F,\n\t31420 - 11904: 0x9949,\n\t31422 - 11904: 0xEDB7,\n\t31423 - 11904: 0xC14B,\n\t31424 - 11904: 0xEDB8,\n\t31425 - 11904: 0xEDB9,\n\t31426 - 11904: 0x8E51,\n\t31427 - 11904: 0x8E52,\n\t31428 - 11904: 0xC2AB,\n\t31429 - 11904: 0xC2AC,\n\t31431 - 11904: 0xC475,\n\t31432 - 11904: 0x9AB2,\n\t31433 - 11904: 0x89A5,\n\t31434 - 11904: 0xC5D1,\n\t31435 - 11904: 0xA5DF,\n\t31439 - 11904: 0x994C,\n\t31441 - 11904: 0xD041,\n\t31443 - 11904: 0x9FF8,\n\t31448 - 11904: 0xD2FD,\n\t31449 - 11904: 0xAFB8,\n\t31450 - 11904: 0x8E56,\n\t31451 - 11904: 0x994D,\n\t31452 - 11904: 0x91CA,\n\t31453 - 11904: 0x8E57,\n\t31455 - 11904: 0xB3BA,\n\t31456 - 11904: 0xB3B9,\n\t31458 - 11904: 0x94E1,\n\t31459 - 11904: 0xB5A4,\n\t31460 - 11904: 0xDADD,\n\t31461 - 11904: 0xB5A3,\n\t31462 - 11904: 0xDADC,\n\t31463 - 11904: 0x9047,\n\t31465 - 11904: 0x8FD8,\n\t31466 - 11904: 0x8E58,\n\t31467 - 11904: 0xDF45,\n\t31469 - 11904: 0xBADC,\n\t31470 - 11904: 0xE34D,\n\t31471 - 11904: 0xBADD,\n\t31478 - 11904: 0xC476,\n\t31479 - 11904: 0xF4A5,\n\t31481 - 11904: 0xA6CB,\n\t31482 - 11904: 0xAAC7,\n\t31483 - 11904: 0xCDA7,\n\t31484 - 11904: 0x87A3,\n\t31485 - 11904: 0xACF2,\n\t31486 - 11904: 0x94EB,\n\t31487 - 11904: 0xACF1,\n\t31488 - 11904: 0xD042,\n\t31489 - 11904: 0xD043,\n\t31492 - 11904: 0xD340,\n\t31493 - 11904: 0xD342,\n\t31494 - 11904: 0xAFB9,\n\t31496 - 11904: 0xD344,\n\t31497 - 11904: 0xD347,\n\t31498 - 11904: 0xD345,\n\t31499 - 11904: 0x8E5C,\n\t31500 - 11904: 0x9553,\n\t31502 - 11904: 0xD346,\n\t31503 - 11904: 0xD343,\n\t31504 - 11904: 0xD2FE,\n\t31505 - 11904: 0xAFBA,\n\t31506 - 11904: 0xD348,\n\t31507 - 11904: 0xD341,\n\t31508 - 11904: 0x9FE5,\n\t31512 - 11904: 0xD6D3,\n\t31513 - 11904: 0xB2C6,\n\t31514 - 11904: 0xD6DC,\n\t31515 - 11904: 0xB2C3,\n\t31517 - 11904: 0xD6D5,\n\t31518 - 11904: 0xB2C7,\n\t31519 - 11904: 0x9F56,\n\t31520 - 11904: 0xB2C1,\n\t31522 - 11904: 0xD6D0,\n\t31523 - 11904: 0xD6DD,\n\t31524 - 11904: 0xD6D1,\n\t31525 - 11904: 0xD6CE,\n\t31526 - 11904: 0xB2C5,\n\t31527 - 11904: 0x954F,\n\t31528 - 11904: 0xB2C2,\n\t31529 - 11904: 0x8E5E,\n\t31530 - 11904: 0xD6D4,\n\t31531 - 11904: 0xD6D7,\n\t31532 - 11904: 0xB2C4,\n\t31533 - 11904: 0xD6D8,\n\t31534 - 11904: 0xB2C8,\n\t31535 - 11904: 0xD6D9,\n\t31536 - 11904: 0xD6CF,\n\t31537 - 11904: 0xD6D6,\n\t31538 - 11904: 0xD6DA,\n\t31539 - 11904: 0xD6D2,\n\t31540 - 11904: 0xD6CD,\n\t31541 - 11904: 0xD6CB,\n\t31544 - 11904: 0xD6DB,\n\t31545 - 11904: 0x996A,\n\t31547 - 11904: 0xDADF,\n\t31552 - 11904: 0xDAE4,\n\t31554 - 11904: 0x9C64,\n\t31555 - 11904: 0x9CD9,\n\t31556 - 11904: 0xDAE0,\n\t31557 - 11904: 0xDAE6,\n\t31558 - 11904: 0xB5A7,\n\t31559 - 11904: 0xD6CC,\n\t31560 - 11904: 0xDAE1,\n\t31561 - 11904: 0xB5A5,\n\t31562 - 11904: 0xDADE,\n\t31563 - 11904: 0xB5AC,\n\t31564 - 11904: 0xDAE2,\n\t31565 - 11904: 0xB5AB,\n\t31566 - 11904: 0xDAE3,\n\t31567 - 11904: 0xB5AD,\n\t31568 - 11904: 0xB5A8,\n\t31569 - 11904: 0xB5AE,\n\t31570 - 11904: 0xB5A9,\n\t31572 - 11904: 0xB5AA,\n\t31573 - 11904: 0x8E5D,\n\t31574 - 11904: 0xB5A6,\n\t31576 - 11904: 0xDAE5,\n\t31584 - 11904: 0xB861,\n\t31585 - 11904: 0xDF50,\n\t31586 - 11904: 0x9950,\n\t31587 - 11904: 0xDF53,\n\t31588 - 11904: 0xDF47,\n\t31589 - 11904: 0xDF4C,\n\t31590 - 11904: 0xDF46,\n\t31591 - 11904: 0xB863,\n\t31593 - 11904: 0xDF4A,\n\t31596 - 11904: 0x9951,\n\t31597 - 11904: 0xDF48,\n\t31598 - 11904: 0xB862,\n\t31599 - 11904: 0x8E62,\n\t31600 - 11904: 0xDF4F,\n\t31601 - 11904: 0xDF4E,\n\t31602 - 11904: 0xDF4B,\n\t31603 - 11904: 0xDF4D,\n\t31604 - 11904: 0xDF49,\n\t31605 - 11904: 0xBAE1,\n\t31606 - 11904: 0xDF52,\n\t31607 - 11904: 0xB85F,\n\t31608 - 11904: 0xDF51,\n\t31611 - 11904: 0x9952,\n\t31618 - 11904: 0xE35D,\n\t31620 - 11904: 0xBAE8,\n\t31621 - 11904: 0xE358,\n\t31623 - 11904: 0xBAE7,\n\t31624 - 11904: 0xE34E,\n\t31626 - 11904: 0xE350,\n\t31627 - 11904: 0xBAE0,\n\t31628 - 11904: 0xE355,\n\t31629 - 11904: 0xE354,\n\t31630 - 11904: 0xE357,\n\t31631 - 11904: 0xBAE5,\n\t31632 - 11904: 0xE352,\n\t31633 - 11904: 0xE351,\n\t31634 - 11904: 0x8E68,\n\t31636 - 11904: 0xBAE4,\n\t31637 - 11904: 0xBADF,\n\t31638 - 11904: 0xE353,\n\t31639 - 11904: 0xBAE2,\n\t31640 - 11904: 0xE359,\n\t31641 - 11904: 0xE35B,\n\t31643 - 11904: 0xE356,\n\t31644 - 11904: 0xE34F,\n\t31645 - 11904: 0xBAE3,\n\t31648 - 11904: 0xBD69,\n\t31649 - 11904: 0xBADE,\n\t31650 - 11904: 0x8E61,\n\t31651 - 11904: 0x9F59,\n\t31652 - 11904: 0xE35C,\n\t31660 - 11904: 0xE6D9,\n\t31661 - 11904: 0xBD62,\n\t31662 - 11904: 0x87D0,\n\t31663 - 11904: 0xE6DB,\n\t31665 - 11904: 0xBD63,\n\t31666 - 11904: 0x8BB3,\n\t31668 - 11904: 0xBD65,\n\t31669 - 11904: 0xE6DE,\n\t31671 - 11904: 0xE6D6,\n\t31672 - 11904: 0xBAE6,\n\t31673 - 11904: 0xE6DC,\n\t31678 - 11904: 0xE6D8,\n\t31680 - 11904: 0xB860,\n\t31681 - 11904: 0xBD68,\n\t31684 - 11904: 0xBD64,\n\t31685 - 11904: 0x87B9,\n\t31686 - 11904: 0xBD66,\n\t31687 - 11904: 0xBD67,\n\t31689 - 11904: 0xBF76,\n\t31690 - 11904: 0xE6DD,\n\t31691 - 11904: 0xE6D7,\n\t31692 - 11904: 0xBD6A,\n\t31694 - 11904: 0xE6DA,\n\t31695 - 11904: 0x9F5D,\n\t31696 - 11904: 0x8E66,\n\t31700 - 11904: 0xEAC0,\n\t31701 - 11904: 0xEABB,\n\t31704 - 11904: 0xEAC5,\n\t31705 - 11904: 0xBF74,\n\t31706 - 11904: 0xEABD,\n\t31707 - 11904: 0xBF78,\n\t31708 - 11904: 0xEAC3,\n\t31709 - 11904: 0xEABA,\n\t31710 - 11904: 0xEAB7,\n\t31711 - 11904: 0xEAC6,\n\t31712 - 11904: 0xC151,\n\t31713 - 11904: 0xBF79,\n\t31714 - 11904: 0xEAC2,\n\t31715 - 11904: 0xEAB8,\n\t31716 - 11904: 0xBF77,\n\t31717 - 11904: 0xEABC,\n\t31718 - 11904: 0xBF7B,\n\t31719 - 11904: 0xEAB9,\n\t31720 - 11904: 0xEABE,\n\t31721 - 11904: 0xBF7A,\n\t31722 - 11904: 0xEAC1,\n\t31723 - 11904: 0xEAC4,\n\t31724 - 11904: 0x8CB2,\n\t31728 - 11904: 0xEDCB,\n\t31729 - 11904: 0xEDCC,\n\t31730 - 11904: 0xEDBC,\n\t31731 - 11904: 0xEDC3,\n\t31732 - 11904: 0xEDC1,\n\t31735 - 11904: 0xC14F,\n\t31736 - 11904: 0xEDC8,\n\t31737 - 11904: 0xEABF,\n\t31738 - 11904: 0x8E6E,\n\t31739 - 11904: 0xEDBF,\n\t31740 - 11904: 0x9F64,\n\t31741 - 11904: 0xEDC9,\n\t31742 - 11904: 0xC14E,\n\t31743 - 11904: 0xEDBE,\n\t31744 - 11904: 0xEDBD,\n\t31745 - 11904: 0xEDC7,\n\t31746 - 11904: 0xEDC4,\n\t31747 - 11904: 0xEDC6,\n\t31749 - 11904: 0xEDBA,\n\t31750 - 11904: 0xEDCA,\n\t31751 - 11904: 0xC14C,\n\t31753 - 11904: 0xEDC5,\n\t31754 - 11904: 0xEDCE,\n\t31755 - 11904: 0xEDC2,\n\t31756 - 11904: 0xC150,\n\t31757 - 11904: 0xC14D,\n\t31758 - 11904: 0xEDC0,\n\t31759 - 11904: 0xEDBB,\n\t31760 - 11904: 0xEDCD,\n\t31761 - 11904: 0xBF75,\n\t31762 - 11904: 0x9953,\n\t31765 - 11904: 0xFAB8,\n\t31769 - 11904: 0xF063,\n\t31771 - 11904: 0x9954,\n\t31772 - 11904: 0xF061,\n\t31773 - 11904: 0xF067,\n\t31774 - 11904: 0xC2B0,\n\t31775 - 11904: 0xF065,\n\t31776 - 11904: 0xF064,\n\t31777 - 11904: 0xC2B2,\n\t31778 - 11904: 0xF06A,\n\t31779 - 11904: 0xC2B1,\n\t31781 - 11904: 0xF06B,\n\t31782 - 11904: 0xF068,\n\t31783 - 11904: 0xC2AE,\n\t31784 - 11904: 0xF069,\n\t31785 - 11904: 0xF062,\n\t31786 - 11904: 0xC2AF,\n\t31787 - 11904: 0xC2AD,\n\t31788 - 11904: 0xF2AB,\n\t31789 - 11904: 0xF066,\n\t31792 - 11904: 0xF06C,\n\t31795 - 11904: 0xF2A8,\n\t31797 - 11904: 0x8E70,\n\t31799 - 11904: 0xC3B2,\n\t31800 - 11904: 0xC3B0,\n\t31801 - 11904: 0xF2AA,\n\t31803 - 11904: 0xF2AC,\n\t31804 - 11904: 0xF2A9,\n\t31805 - 11904: 0xC3B1,\n\t31806 - 11904: 0xC3AE,\n\t31807 - 11904: 0xC3AF,\n\t31808 - 11904: 0xC3B3,\n\t31810 - 11904: 0x9F61,\n\t31811 - 11904: 0xC478,\n\t31812 - 11904: 0x8E72,\n\t31813 - 11904: 0xF4AA,\n\t31815 - 11904: 0xF4A9,\n\t31816 - 11904: 0xF4A7,\n\t31817 - 11904: 0xF4A6,\n\t31818 - 11904: 0xF4A8,\n\t31820 - 11904: 0xC477,\n\t31821 - 11904: 0xC479,\n\t31824 - 11904: 0xC4F0,\n\t31825 - 11904: 0xA06B,\n\t31827 - 11904: 0xF5E5,\n\t31828 - 11904: 0xF5E4,\n\t31830 - 11904: 0x9F40,\n\t31831 - 11904: 0xF6FA,\n\t31833 - 11904: 0xF6FC,\n\t31834 - 11904: 0xF6FE,\n\t31835 - 11904: 0xF6FD,\n\t31836 - 11904: 0xF6FB,\n\t31837 - 11904: 0x94ED,\n\t31839 - 11904: 0xC5A3,\n\t31840 - 11904: 0xC5A2,\n\t31843 - 11904: 0xC5D3,\n\t31844 - 11904: 0xC5D2,\n\t31845 - 11904: 0xC5D4,\n\t31846 - 11904: 0xF7ED,\n\t31847 - 11904: 0xF7EC,\n\t31849 - 11904: 0xF8FB,\n\t31850 - 11904: 0xF8B8,\n\t31851 - 11904: 0xF8FC,\n\t31852 - 11904: 0xC658,\n\t31853 - 11904: 0x94EE,\n\t31854 - 11904: 0xC659,\n\t31855 - 11904: 0xF96D,\n\t31856 - 11904: 0x9FBD,\n\t31858 - 11904: 0xC67E,\n\t31859 - 11904: 0xA6CC,\n\t31860 - 11904: 0x8E7B,\n\t31861 - 11904: 0xCDA8,\n\t31864 - 11904: 0xD045,\n\t31865 - 11904: 0xD046,\n\t31866 - 11904: 0xD044,\n\t31867 - 11904: 0x9957,\n\t31868 - 11904: 0x94F7,\n\t31869 - 11904: 0xACF3,\n\t31870 - 11904: 0x9F5F,\n\t31871 - 11904: 0xD047,\n\t31872 - 11904: 0xD048,\n\t31873 - 11904: 0xD049,\n\t31875 - 11904: 0x8E73,\n\t31876 - 11904: 0xD349,\n\t31877 - 11904: 0xD34F,\n\t31878 - 11904: 0x9F62,\n\t31880 - 11904: 0xD34D,\n\t31881 - 11904: 0xAFBB,\n\t31882 - 11904: 0xD34B,\n\t31884 - 11904: 0xD34C,\n\t31885 - 11904: 0xD34E,\n\t31886 - 11904: 0x94F6,\n\t31889 - 11904: 0xD34A,\n\t31890 - 11904: 0xB2C9,\n\t31892 - 11904: 0xD6DE,\n\t31893 - 11904: 0xB2CB,\n\t31894 - 11904: 0xD6E0,\n\t31895 - 11904: 0xB2CA,\n\t31896 - 11904: 0xD6DF,\n\t31900 - 11904: 0x9958,\n\t31902 - 11904: 0xDAE8,\n\t31903 - 11904: 0xB5AF,\n\t31905 - 11904: 0xDAEA,\n\t31906 - 11904: 0xDAE7,\n\t31907 - 11904: 0xD6E1,\n\t31909 - 11904: 0xB5B0,\n\t31910 - 11904: 0x8E75,\n\t31911 - 11904: 0xF9DB,\n\t31912 - 11904: 0xDAE9,\n\t31916 - 11904: 0x9072,\n\t31918 - 11904: 0x94F8,\n\t31919 - 11904: 0xDF56,\n\t31921 - 11904: 0xB864,\n\t31922 - 11904: 0xDF54,\n\t31923 - 11904: 0xB865,\n\t31924 - 11904: 0xDF55,\n\t31925 - 11904: 0xB866,\n\t31928 - 11904: 0x995A,\n\t31929 - 11904: 0xBAE9,\n\t31930 - 11904: 0xE361,\n\t31931 - 11904: 0xE35E,\n\t31932 - 11904: 0xE360,\n\t31933 - 11904: 0xBAEA,\n\t31934 - 11904: 0xBAEB,\n\t31935 - 11904: 0xE35F,\n\t31938 - 11904: 0xA0B0,\n\t31939 - 11904: 0x8CB3,\n\t31941 - 11904: 0xE6DF,\n\t31943 - 11904: 0x8E79,\n\t31944 - 11904: 0xE6E0,\n\t31945 - 11904: 0x8E78,\n\t31946 - 11904: 0xBD6B,\n\t31947 - 11904: 0xE6E2,\n\t31948 - 11904: 0xE6E1,\n\t31949 - 11904: 0x94F3,\n\t31950 - 11904: 0xA261,\n\t31952 - 11904: 0xEACA,\n\t31953 - 11904: 0xEACB,\n\t31954 - 11904: 0xEAC7,\n\t31955 - 11904: 0x98AF,\n\t31956 - 11904: 0xEAC8,\n\t31957 - 11904: 0xBF7C,\n\t31958 - 11904: 0xBF7D,\n\t31959 - 11904: 0xEAC9,\n\t31961 - 11904: 0xC157,\n\t31962 - 11904: 0xA0B2,\n\t31964 - 11904: 0xC153,\n\t31965 - 11904: 0xC158,\n\t31966 - 11904: 0xC154,\n\t31967 - 11904: 0xC156,\n\t31968 - 11904: 0xC152,\n\t31970 - 11904: 0xC155,\n\t31974 - 11904: 0x8E7A,\n\t31975 - 11904: 0xC2B3,\n\t31976 - 11904: 0xEDCF,\n\t31978 - 11904: 0xF2AE,\n\t31980 - 11904: 0xF2AD,\n\t31981 - 11904: 0x995C,\n\t31982 - 11904: 0xF4AB,\n\t31983 - 11904: 0xC47A,\n\t31984 - 11904: 0xC47B,\n\t31985 - 11904: 0xF741,\n\t31986 - 11904: 0xF5E6,\n\t31987 - 11904: 0x8E7C,\n\t31988 - 11904: 0xF740,\n\t31989 - 11904: 0x8E7D,\n\t31990 - 11904: 0xF8FD,\n\t31991 - 11904: 0xF9A4,\n\t31992 - 11904: 0xA6CD,\n\t31993 - 11904: 0x8BD9,\n\t31995 - 11904: 0xA874,\n\t31996 - 11904: 0x89A2,\n\t31997 - 11904: 0xCDA9,\n\t31998 - 11904: 0xAAC8,\n\t32000 - 11904: 0xACF6,\n\t32001 - 11904: 0xD04C,\n\t32002 - 11904: 0xACF4,\n\t32003 - 11904: 0xD04A,\n\t32004 - 11904: 0xACF9,\n\t32005 - 11904: 0xACF5,\n\t32006 - 11904: 0xACFA,\n\t32007 - 11904: 0xACF8,\n\t32008 - 11904: 0xD04B,\n\t32009 - 11904: 0xACF7,\n\t32010 - 11904: 0xAFBF,\n\t32011 - 11904: 0xAFBE,\n\t32012 - 11904: 0xD35A,\n\t32013 - 11904: 0xAFC7,\n\t32014 - 11904: 0xD353,\n\t32015 - 11904: 0xD359,\n\t32016 - 11904: 0xAFC3,\n\t32017 - 11904: 0xD352,\n\t32018 - 11904: 0xD358,\n\t32019 - 11904: 0xD356,\n\t32020 - 11904: 0xAFC2,\n\t32021 - 11904: 0xAFC4,\n\t32022 - 11904: 0xD355,\n\t32023 - 11904: 0xAFBD,\n\t32024 - 11904: 0xD354,\n\t32025 - 11904: 0xAFC8,\n\t32026 - 11904: 0xAFC5,\n\t32027 - 11904: 0xAFC9,\n\t32028 - 11904: 0xAFC6,\n\t32029 - 11904: 0xD351,\n\t32030 - 11904: 0xD350,\n\t32031 - 11904: 0xD357,\n\t32032 - 11904: 0xAFC0,\n\t32033 - 11904: 0xAFBC,\n\t32034 - 11904: 0xAFC1,\n\t32037 - 11904: 0x9ED7,\n\t32040 - 11904: 0xD6F0,\n\t32041 - 11904: 0xD6E9,\n\t32043 - 11904: 0xB5B5,\n\t32044 - 11904: 0xD6E8,\n\t32046 - 11904: 0xB2CF,\n\t32047 - 11904: 0xB2D6,\n\t32048 - 11904: 0xB2D3,\n\t32049 - 11904: 0xB2D9,\n\t32050 - 11904: 0xB2D8,\n\t32051 - 11904: 0xB2D4,\n\t32053 - 11904: 0xD6E2,\n\t32054 - 11904: 0xD6E5,\n\t32056 - 11904: 0xD6E4,\n\t32057 - 11904: 0xB2D0,\n\t32058 - 11904: 0xD6E6,\n\t32059 - 11904: 0xD6EF,\n\t32060 - 11904: 0xB2D1,\n\t32061 - 11904: 0xD6E3,\n\t32062 - 11904: 0xD6EC,\n\t32063 - 11904: 0xD6ED,\n\t32064 - 11904: 0xB2D2,\n\t32065 - 11904: 0xD6EA,\n\t32066 - 11904: 0xB2D7,\n\t32067 - 11904: 0xB2CD,\n\t32068 - 11904: 0xB2D5,\n\t32069 - 11904: 0xD6E7,\n\t32070 - 11904: 0xB2CC,\n\t32071 - 11904: 0xD6EB,\n\t32074 - 11904: 0xD6EE,\n\t32077 - 11904: 0xA0B6,\n\t32078 - 11904: 0xDAFB,\n\t32079 - 11904: 0xDAF2,\n\t32080 - 11904: 0xB5B2,\n\t32081 - 11904: 0xDAF9,\n\t32082 - 11904: 0xDAF6,\n\t32083 - 11904: 0xDAEE,\n\t32084 - 11904: 0xDAF7,\n\t32085 - 11904: 0xB5B4,\n\t32086 - 11904: 0xDAEF,\n\t32088 - 11904: 0xDAEB,\n\t32090 - 11904: 0x9E42,\n\t32091 - 11904: 0xB86C,\n\t32092 - 11904: 0xDAF4,\n\t32093 - 11904: 0x8EA4,\n\t32094 - 11904: 0xB5B1,\n\t32095 - 11904: 0xDAFA,\n\t32097 - 11904: 0xB5B8,\n\t32098 - 11904: 0xB5BA,\n\t32099 - 11904: 0xDAED,\n\t32102 - 11904: 0xB5B9,\n\t32103 - 11904: 0xDAF0,\n\t32104 - 11904: 0xB5B3,\n\t32105 - 11904: 0xDAF8,\n\t32106 - 11904: 0xDAF1,\n\t32107 - 11904: 0xDAF5,\n\t32109 - 11904: 0xDAF3,\n\t32110 - 11904: 0xB5B6,\n\t32111 - 11904: 0xDAEC,\n\t32112 - 11904: 0xB5BB,\n\t32113 - 11904: 0xB2CE,\n\t32114 - 11904: 0xB5B7,\n\t32115 - 11904: 0xB5BC,\n\t32121 - 11904: 0xB868,\n\t32122 - 11904: 0xDF5D,\n\t32123 - 11904: 0xDF5F,\n\t32124 - 11904: 0xDF61,\n\t32125 - 11904: 0xDF65,\n\t32127 - 11904: 0xDF5B,\n\t32128 - 11904: 0xDF59,\n\t32129 - 11904: 0xB86A,\n\t32131 - 11904: 0xDF60,\n\t32132 - 11904: 0xDF64,\n\t32133 - 11904: 0xDF5C,\n\t32134 - 11904: 0xDF58,\n\t32136 - 11904: 0xDF57,\n\t32137 - 11904: 0x8EA7,\n\t32139 - 11904: 0x8C76,\n\t32140 - 11904: 0xDF62,\n\t32141 - 11904: 0xDF5A,\n\t32142 - 11904: 0xDF5E,\n\t32143 - 11904: 0xB86B,\n\t32145 - 11904: 0xB869,\n\t32146 - 11904: 0xDF66,\n\t32147 - 11904: 0xB867,\n\t32148 - 11904: 0xDF63,\n\t32149 - 11904: 0x8767,\n\t32150 - 11904: 0xE372,\n\t32151 - 11904: 0x9542,\n\t32156 - 11904: 0xBAEE,\n\t32157 - 11904: 0xE36A,\n\t32158 - 11904: 0xBD78,\n\t32159 - 11904: 0xE374,\n\t32160 - 11904: 0xBAF1,\n\t32161 - 11904: 0xE378,\n\t32162 - 11904: 0xBAF7,\n\t32163 - 11904: 0xE365,\n\t32164 - 11904: 0x987D,\n\t32166 - 11904: 0xE375,\n\t32167 - 11904: 0xE362,\n\t32168 - 11904: 0x9755,\n\t32169 - 11904: 0xE377,\n\t32170 - 11904: 0xE366,\n\t32171 - 11904: 0x8EA8,\n\t32172 - 11904: 0xBAFE,\n\t32173 - 11904: 0xBAFB,\n\t32174 - 11904: 0xE376,\n\t32175 - 11904: 0xE370,\n\t32176 - 11904: 0xBAED,\n\t32177 - 11904: 0xBAF5,\n\t32178 - 11904: 0xBAF4,\n\t32179 - 11904: 0x8EAA,\n\t32180 - 11904: 0xBAF3,\n\t32181 - 11904: 0xBAF9,\n\t32183 - 11904: 0xE363,\n\t32184 - 11904: 0xBAFA,\n\t32185 - 11904: 0xE371,\n\t32186 - 11904: 0xBAF6,\n\t32187 - 11904: 0xBAEC,\n\t32188 - 11904: 0xE373,\n\t32189 - 11904: 0xBAEF,\n\t32190 - 11904: 0xBAF0,\n\t32191 - 11904: 0xBAF8,\n\t32192 - 11904: 0xE368,\n\t32193 - 11904: 0xE367,\n\t32194 - 11904: 0xE364,\n\t32196 - 11904: 0xE36C,\n\t32197 - 11904: 0xE369,\n\t32198 - 11904: 0xE36D,\n\t32199 - 11904: 0xBAFD,\n\t32201 - 11904: 0xE379,\n\t32202 - 11904: 0xBAF2,\n\t32203 - 11904: 0xE36E,\n\t32204 - 11904: 0xE36F,\n\t32205 - 11904: 0x89A3,\n\t32206 - 11904: 0xE36B,\n\t32207 - 11904: 0x9960,\n\t32208 - 11904: 0x9962,\n\t32210 - 11904: 0xBAFC,\n\t32211 - 11904: 0x94FC,\n\t32212 - 11904: 0x9961,\n\t32215 - 11904: 0xE6E7,\n\t32216 - 11904: 0xBD70,\n\t32217 - 11904: 0xBD79,\n\t32218 - 11904: 0xBD75,\n\t32219 - 11904: 0xE6E4,\n\t32220 - 11904: 0x94FA,\n\t32221 - 11904: 0xBD72,\n\t32222 - 11904: 0xBD76,\n\t32223 - 11904: 0xE6F0,\n\t32224 - 11904: 0xBD6C,\n\t32225 - 11904: 0xE6E8,\n\t32227 - 11904: 0xBD74,\n\t32228 - 11904: 0x8EAE,\n\t32229 - 11904: 0x8EB2,\n\t32230 - 11904: 0xE6EB,\n\t32231 - 11904: 0xE6E6,\n\t32232 - 11904: 0xBD73,\n\t32233 - 11904: 0xBD77,\n\t32234 - 11904: 0xE6E5,\n\t32236 - 11904: 0xBD71,\n\t32238 - 11904: 0xE6EF,\n\t32239 - 11904: 0xBD6E,\n\t32240 - 11904: 0xE6EE,\n\t32241 - 11904: 0xE6ED,\n\t32242 - 11904: 0xBD7A,\n\t32243 - 11904: 0xE572,\n\t32244 - 11904: 0xBD6D,\n\t32245 - 11904: 0x8EB0,\n\t32246 - 11904: 0xE6EC,\n\t32247 - 11904: 0xE6E3,\n\t32249 - 11904: 0xBD7B,\n\t32250 - 11904: 0xE6EA,\n\t32251 - 11904: 0xBD6F,\n\t32253 - 11904: 0x9963,\n\t32254 - 11904: 0x97AA,\n\t32259 - 11904: 0xE6E9,\n\t32263 - 11904: 0x94FB,\n\t32264 - 11904: 0xBFA2,\n\t32265 - 11904: 0xBFA7,\n\t32266 - 11904: 0xBF7E,\n\t32267 - 11904: 0xEAD8,\n\t32268 - 11904: 0xEACF,\n\t32269 - 11904: 0xEADB,\n\t32270 - 11904: 0xEAD3,\n\t32271 - 11904: 0xEAD9,\n\t32272 - 11904: 0xBFA8,\n\t32273 - 11904: 0xBFA1,\n\t32274 - 11904: 0xEACC,\n\t32275 - 11904: 0xEAD2,\n\t32276 - 11904: 0xEADC,\n\t32277 - 11904: 0xEAD5,\n\t32278 - 11904: 0xEADA,\n\t32279 - 11904: 0xEACE,\n\t32282 - 11904: 0xEAD6,\n\t32283 - 11904: 0xBFA3,\n\t32284 - 11904: 0xEAD4,\n\t32285 - 11904: 0xBFA6,\n\t32286 - 11904: 0xBFA5,\n\t32287 - 11904: 0xEAD0,\n\t32288 - 11904: 0xEAD1,\n\t32289 - 11904: 0xEACD,\n\t32290 - 11904: 0xEAD7,\n\t32291 - 11904: 0xBFA4,\n\t32292 - 11904: 0xEADE,\n\t32293 - 11904: 0xEADD,\n\t32295 - 11904: 0x8EBB,\n\t32297 - 11904: 0xEDDA,\n\t32298 - 11904: 0xEDD6,\n\t32299 - 11904: 0xC15F,\n\t32301 - 11904: 0xEDD0,\n\t32302 - 11904: 0xC159,\n\t32303 - 11904: 0xC169,\n\t32304 - 11904: 0xEDDC,\n\t32305 - 11904: 0xC161,\n\t32306 - 11904: 0xC15D,\n\t32307 - 11904: 0xEDD3,\n\t32308 - 11904: 0xC164,\n\t32309 - 11904: 0xC167,\n\t32310 - 11904: 0xEDDE,\n\t32311 - 11904: 0xC15C,\n\t32312 - 11904: 0xEDD5,\n\t32313 - 11904: 0xC165,\n\t32314 - 11904: 0xEDE0,\n\t32315 - 11904: 0xEDDD,\n\t32316 - 11904: 0xEDD1,\n\t32317 - 11904: 0xC160,\n\t32318 - 11904: 0xC15A,\n\t32319 - 11904: 0xC168,\n\t32320 - 11904: 0xEDD8,\n\t32321 - 11904: 0xC163,\n\t32322 - 11904: 0xEDD2,\n\t32323 - 11904: 0xC15E,\n\t32324 - 11904: 0xEDDF,\n\t32325 - 11904: 0xC162,\n\t32326 - 11904: 0xC15B,\n\t32327 - 11904: 0xEDD9,\n\t32328 - 11904: 0xC166,\n\t32329 - 11904: 0xEDD7,\n\t32332 - 11904: 0xEDDB,\n\t32336 - 11904: 0xF06E,\n\t32337 - 11904: 0xF074,\n\t32338 - 11904: 0xC2B9,\n\t32339 - 11904: 0xF077,\n\t32340 - 11904: 0xC2B4,\n\t32341 - 11904: 0xC2B5,\n\t32342 - 11904: 0xF06F,\n\t32343 - 11904: 0xF076,\n\t32344 - 11904: 0xF071,\n\t32345 - 11904: 0xC2BA,\n\t32346 - 11904: 0xC2B7,\n\t32347 - 11904: 0x8CDC,\n\t32348 - 11904: 0xF06D,\n\t32350 - 11904: 0xC2B6,\n\t32351 - 11904: 0xF073,\n\t32352 - 11904: 0xF075,\n\t32353 - 11904: 0xC2B8,\n\t32354 - 11904: 0xF072,\n\t32355 - 11904: 0xF070,\n\t32357 - 11904: 0x9876,\n\t32359 - 11904: 0x8EA1,\n\t32360 - 11904: 0xF2B8,\n\t32361 - 11904: 0xC3B7,\n\t32362 - 11904: 0xC3B8,\n\t32363 - 11904: 0xC3B4,\n\t32364 - 11904: 0x8CB4,\n\t32365 - 11904: 0xC3B5,\n\t32366 - 11904: 0x8EB7,\n\t32367 - 11904: 0xF2B4,\n\t32368 - 11904: 0xF2B2,\n\t32370 - 11904: 0xF2B6,\n\t32371 - 11904: 0xC3BA,\n\t32372 - 11904: 0xF2B7,\n\t32373 - 11904: 0xF2B0,\n\t32374 - 11904: 0xF2AF,\n\t32375 - 11904: 0xF2B3,\n\t32376 - 11904: 0xF2B1,\n\t32377 - 11904: 0xC3B6,\n\t32378 - 11904: 0xF2B5,\n\t32379 - 11904: 0xF4AC,\n\t32380 - 11904: 0xC47E,\n\t32381 - 11904: 0xC47D,\n\t32382 - 11904: 0xF4AD,\n\t32383 - 11904: 0x9DA6,\n\t32384 - 11904: 0xF4AF,\n\t32385 - 11904: 0xF4AE,\n\t32386 - 11904: 0xC4A1,\n\t32390 - 11904: 0xF5EB,\n\t32391 - 11904: 0xF5E8,\n\t32392 - 11904: 0xF5E9,\n\t32394 - 11904: 0xF5E7,\n\t32395 - 11904: 0xF5EA,\n\t32396 - 11904: 0xC4F2,\n\t32397 - 11904: 0xF5EC,\n\t32398 - 11904: 0x9EB0,\n\t32399 - 11904: 0xC4F1,\n\t32401 - 11904: 0xF742,\n\t32402 - 11904: 0x8EB8,\n\t32403 - 11904: 0xC5D5,\n\t32404 - 11904: 0xC5D7,\n\t32405 - 11904: 0xF7EE,\n\t32406 - 11904: 0xC5D6,\n\t32407 - 11904: 0xF8B9,\n\t32408 - 11904: 0xF940,\n\t32409 - 11904: 0xF942,\n\t32410 - 11904: 0xF8FE,\n\t32411 - 11904: 0xF941,\n\t32412 - 11904: 0xC66C,\n\t32415 - 11904: 0x9D70,\n\t32420 - 11904: 0x896E,\n\t32428 - 11904: 0x896F,\n\t32442 - 11904: 0x8970,\n\t32455 - 11904: 0x8971,\n\t32463 - 11904: 0x8972,\n\t32479 - 11904: 0x8973,\n\t32518 - 11904: 0x8974,\n\t32566 - 11904: 0xA6CE,\n\t32567 - 11904: 0x8975,\n\t32568 - 11904: 0xACFB,\n\t32569 - 11904: 0xD26F,\n\t32570 - 11904: 0xAFCA,\n\t32573 - 11904: 0xB2DA,\n\t32574 - 11904: 0xDAFC,\n\t32575 - 11904: 0xDAFD,\n\t32576 - 11904: 0x8EBC,\n\t32577 - 11904: 0x8EBD,\n\t32579 - 11904: 0xEADF,\n\t32580 - 11904: 0xC16A,\n\t32581 - 11904: 0xEDE1,\n\t32583 - 11904: 0x8EBE,\n\t32584 - 11904: 0xC2BB,\n\t32585 - 11904: 0x9DD1,\n\t32586 - 11904: 0xF2BA,\n\t32587 - 11904: 0xF2B9,\n\t32588 - 11904: 0xC4A2,\n\t32589 - 11904: 0xF5ED,\n\t32590 - 11904: 0x94FD,\n\t32591 - 11904: 0xF743,\n\t32592 - 11904: 0xC5F8,\n\t32593 - 11904: 0xCA49,\n\t32594 - 11904: 0x8BD7,\n\t32595 - 11904: 0x8BDA,\n\t32596 - 11904: 0xAAC9,\n\t32597 - 11904: 0xA875,\n\t32600 - 11904: 0xD04D,\n\t32603 - 11904: 0xD360,\n\t32604 - 11904: 0xD35B,\n\t32605 - 11904: 0xD35F,\n\t32606 - 11904: 0xD35D,\n\t32607 - 11904: 0xAFCB,\n\t32608 - 11904: 0xD35E,\n\t32609 - 11904: 0xD35C,\n\t32611 - 11904: 0xD6F1,\n\t32613 - 11904: 0xDAFE,\n\t32614 - 11904: 0xDB40,\n\t32615 - 11904: 0xDF69,\n\t32616 - 11904: 0xDF6A,\n\t32617 - 11904: 0xB86E,\n\t32618 - 11904: 0xB86F,\n\t32619 - 11904: 0xDF68,\n\t32620 - 11904: 0xDF6B,\n\t32621 - 11904: 0xDF67,\n\t32622 - 11904: 0xB86D,\n\t32624 - 11904: 0xBB40,\n\t32625 - 11904: 0xA0E2,\n\t32626 - 11904: 0xB870,\n\t32627 - 11904: 0xE37A,\n\t32629 - 11904: 0xBD7C,\n\t32630 - 11904: 0xE6F1,\n\t32631 - 11904: 0xBD7D,\n\t32632 - 11904: 0x9FE9,\n\t32633 - 11904: 0xBFA9,\n\t32634 - 11904: 0xEAE2,\n\t32635 - 11904: 0xEAE0,\n\t32636 - 11904: 0xEAE1,\n\t32637 - 11904: 0xEDE4,\n\t32638 - 11904: 0xEDE3,\n\t32639 - 11904: 0xEDE2,\n\t32643 - 11904: 0xF2BB,\n\t32645 - 11904: 0xC3B9,\n\t32646 - 11904: 0xF2BC,\n\t32647 - 11904: 0xF744,\n\t32648 - 11904: 0xC5F9,\n\t32649 - 11904: 0xF8BA,\n\t32650 - 11904: 0xA6CF,\n\t32651 - 11904: 0xAACB,\n\t32652 - 11904: 0xAACA,\n\t32653 - 11904: 0xD04F,\n\t32654 - 11904: 0xACFC,\n\t32655 - 11904: 0xFDA8,\n\t32657 - 11904: 0xD04E,\n\t32658 - 11904: 0xD362,\n\t32659 - 11904: 0x8AE7,\n\t32660 - 11904: 0xAFCC,\n\t32661 - 11904: 0xD6F2,\n\t32662 - 11904: 0xD361,\n\t32663 - 11904: 0x8EC2,\n\t32666 - 11904: 0xB2DC,\n\t32667 - 11904: 0xD6F5,\n\t32668 - 11904: 0xD6F3,\n\t32669 - 11904: 0xD6F4,\n\t32670 - 11904: 0xB2DB,\n\t32672 - 11904: 0xDB42,\n\t32673 - 11904: 0xDB43,\n\t32674 - 11904: 0xDB41,\n\t32675 - 11904: 0x8EC4,\n\t32676 - 11904: 0xB873,\n\t32677 - 11904: 0xDF6D,\n\t32678 - 11904: 0xDF6C,\n\t32679 - 11904: 0xDF6E,\n\t32680 - 11904: 0xB872,\n\t32681 - 11904: 0xB871,\n\t32684 - 11904: 0xE6F2,\n\t32685 - 11904: 0xE6F4,\n\t32686 - 11904: 0x9964,\n\t32687 - 11904: 0xBD7E,\n\t32688 - 11904: 0xE6F3,\n\t32689 - 11904: 0xEAE3,\n\t32690 - 11904: 0xBFAA,\n\t32691 - 11904: 0xF079,\n\t32692 - 11904: 0x9965,\n\t32693 - 11904: 0xF078,\n\t32694 - 11904: 0xC3BB,\n\t32695 - 11904: 0xF2BD,\n\t32696 - 11904: 0xC3BD,\n\t32697 - 11904: 0xC3BC,\n\t32698 - 11904: 0xF4B0,\n\t32699 - 11904: 0xF5EE,\n\t32700 - 11904: 0xC4F3,\n\t32701 - 11904: 0xA6D0,\n\t32702 - 11904: 0xD050,\n\t32703 - 11904: 0xACFD,\n\t32704 - 11904: 0xD365,\n\t32705 - 11904: 0xAFCE,\n\t32706 - 11904: 0xD364,\n\t32707 - 11904: 0xD363,\n\t32709 - 11904: 0xAFCD,\n\t32711 - 11904: 0xD6FB,\n\t32713 - 11904: 0xD6FD,\n\t32714 - 11904: 0xD6F6,\n\t32715 - 11904: 0xD6F7,\n\t32716 - 11904: 0xB2DD,\n\t32717 - 11904: 0xD6F8,\n\t32718 - 11904: 0xB2DE,\n\t32719 - 11904: 0xD6FC,\n\t32720 - 11904: 0xD6F9,\n\t32721 - 11904: 0xD6FA,\n\t32722 - 11904: 0xB2DF,\n\t32724 - 11904: 0xB5BE,\n\t32725 - 11904: 0xB5BF,\n\t32727 - 11904: 0xDB44,\n\t32731 - 11904: 0xDF6F,\n\t32732 - 11904: 0xDF70,\n\t32733 - 11904: 0x954E,\n\t32734 - 11904: 0xE37E,\n\t32735 - 11904: 0xBB43,\n\t32736 - 11904: 0xBB41,\n\t32737 - 11904: 0xBB42,\n\t32738 - 11904: 0xE37B,\n\t32739 - 11904: 0xE37C,\n\t32741 - 11904: 0xE37D,\n\t32742 - 11904: 0xE6F9,\n\t32743 - 11904: 0x98B3,\n\t32744 - 11904: 0xE6FA,\n\t32745 - 11904: 0xBDA1,\n\t32746 - 11904: 0xE6F7,\n\t32747 - 11904: 0xE6F6,\n\t32748 - 11904: 0xE6F8,\n\t32749 - 11904: 0xE6F5,\n\t32750 - 11904: 0xBFAD,\n\t32751 - 11904: 0xEAE4,\n\t32752 - 11904: 0xBFAB,\n\t32753 - 11904: 0xBFAC,\n\t32754 - 11904: 0xEDE6,\n\t32755 - 11904: 0xC16B,\n\t32756 - 11904: 0xEDE5,\n\t32757 - 11904: 0xEFA8,\n\t32759 - 11904: 0xF07A,\n\t32760 - 11904: 0xF07B,\n\t32761 - 11904: 0xC2BC,\n\t32762 - 11904: 0x8ECB,\n\t32763 - 11904: 0xC2BD,\n\t32764 - 11904: 0xC16C,\n\t32765 - 11904: 0xF2BE,\n\t32766 - 11904: 0xF2BF,\n\t32767 - 11904: 0xF4B1,\n\t32768 - 11904: 0xC4A3,\n\t32769 - 11904: 0xA6D1,\n\t32770 - 11904: 0x8BDF,\n\t32771 - 11904: 0xA6D2,\n\t32772 - 11904: 0xACFE,\n\t32773 - 11904: 0xAACC,\n\t32774 - 11904: 0xAFCF,\n\t32775 - 11904: 0xD051,\n\t32776 - 11904: 0x8ECE,\n\t32779 - 11904: 0xB5C0,\n\t32780 - 11904: 0xA6D3,\n\t32781 - 11904: 0xAD41,\n\t32782 - 11904: 0xD052,\n\t32783 - 11904: 0xD053,\n\t32784 - 11904: 0xAD40,\n\t32785 - 11904: 0xAD42,\n\t32786 - 11904: 0xA6D4,\n\t32788 - 11904: 0xD054,\n\t32789 - 11904: 0xAFD1,\n\t32790 - 11904: 0xD366,\n\t32791 - 11904: 0xAFD3,\n\t32792 - 11904: 0xAFD0,\n\t32793 - 11904: 0xAFD2,\n\t32795 - 11904: 0xD741,\n\t32796 - 11904: 0xB2E0,\n\t32797 - 11904: 0x8ECF,\n\t32798 - 11904: 0xD740,\n\t32799 - 11904: 0xD6FE,\n\t32800 - 11904: 0x9968,\n\t32801 - 11904: 0xDF71,\n\t32804 - 11904: 0xE3A1,\n\t32805 - 11904: 0x9969,\n\t32806 - 11904: 0xBDA2,\n\t32808 - 11904: 0xBFAE,\n\t32809 - 11904: 0xEAE6,\n\t32810 - 11904: 0xEAE5,\n\t32812 - 11904: 0xEDE7,\n\t32814 - 11904: 0x996B,\n\t32815 - 11904: 0x8ED1,\n\t32816 - 11904: 0xF5EF,\n\t32817 - 11904: 0x996C,\n\t32819 - 11904: 0xA6D5,\n\t32820 - 11904: 0xCB73,\n\t32821 - 11904: 0xCDAA,\n\t32822 - 11904: 0xAD43,\n\t32823 - 11904: 0xD055,\n\t32825 - 11904: 0xD368,\n\t32827 - 11904: 0x8ED4,\n\t32828 - 11904: 0x8ED5,\n\t32829 - 11904: 0xAFD4,\n\t32830 - 11904: 0xD367,\n\t32831 - 11904: 0xAFD5,\n\t32835 - 11904: 0xD743,\n\t32838 - 11904: 0xB2E2,\n\t32839 - 11904: 0xD742,\n\t32840 - 11904: 0xD744,\n\t32842 - 11904: 0xB2E1,\n\t32847 - 11904: 0xDB46,\n\t32848 - 11904: 0xDB47,\n\t32849 - 11904: 0xDB45,\n\t32850 - 11904: 0xB5C1,\n\t32852 - 11904: 0x996D,\n\t32854 - 11904: 0xB874,\n\t32856 - 11904: 0xB875,\n\t32858 - 11904: 0xBB45,\n\t32859 - 11904: 0xA0BE,\n\t32860 - 11904: 0xE3A3,\n\t32861 - 11904: 0xE3A2,\n\t32862 - 11904: 0xBB44,\n\t32865 - 11904: 0x8ED6,\n\t32866 - 11904: 0xA0BC,\n\t32867 - 11904: 0xA0B5,\n\t32868 - 11904: 0xE6FB,\n\t32870 - 11904: 0xA0B4,\n\t32871 - 11904: 0xE6FC,\n\t32876 - 11904: 0xEAE7,\n\t32879 - 11904: 0xC170,\n\t32880 - 11904: 0xC16F,\n\t32881 - 11904: 0xC16D,\n\t32882 - 11904: 0xC16E,\n\t32883 - 11904: 0xC171,\n\t32885 - 11904: 0xF07C,\n\t32886 - 11904: 0xC2BF,\n\t32887 - 11904: 0xC2BE,\n\t32888 - 11904: 0xF2C0,\n\t32889 - 11904: 0xF4B2,\n\t32893 - 11904: 0xC5A5,\n\t32894 - 11904: 0xC5A4,\n\t32895 - 11904: 0xA6D6,\n\t32896 - 11904: 0x8BE0,\n\t32898 - 11904: 0xD1FB,\n\t32900 - 11904: 0xB877,\n\t32901 - 11904: 0xB5C2,\n\t32902 - 11904: 0xB876,\n\t32903 - 11904: 0xBB46,\n\t32905 - 11904: 0xA6D7,\n\t32906 - 11904: 0xC9A9,\n\t32907 - 11904: 0xA6D8,\n\t32908 - 11904: 0xA6D9,\n\t32911 - 11904: 0xCDAB,\n\t32912 - 11904: 0xCB76,\n\t32914 - 11904: 0xCB77,\n\t32915 - 11904: 0xA877,\n\t32917 - 11904: 0xCB74,\n\t32918 - 11904: 0xA876,\n\t32920 - 11904: 0xA879,\n\t32921 - 11904: 0xCB75,\n\t32922 - 11904: 0xA87B,\n\t32923 - 11904: 0xA87A,\n\t32924 - 11904: 0xCB78,\n\t32925 - 11904: 0xA878,\n\t32927 - 11904: 0x89B5,\n\t32929 - 11904: 0xAAD1,\n\t32930 - 11904: 0xAACF,\n\t32931 - 11904: 0xCDAD,\n\t32933 - 11904: 0xAACE,\n\t32935 - 11904: 0x8EDD,\n\t32937 - 11904: 0xAAD3,\n\t32938 - 11904: 0xAAD5,\n\t32939 - 11904: 0xAAD2,\n\t32941 - 11904: 0xCDB0,\n\t32942 - 11904: 0xCDAC,\n\t32943 - 11904: 0xAAD6,\n\t32945 - 11904: 0xAAD0,\n\t32946 - 11904: 0xA87C,\n\t32948 - 11904: 0xAAD4,\n\t32949 - 11904: 0xCDAF,\n\t32950 - 11904: 0x9E5D,\n\t32951 - 11904: 0x9971,\n\t32952 - 11904: 0xCDAE,\n\t32954 - 11904: 0xAACD,\n\t32956 - 11904: 0x89AE,\n\t32957 - 11904: 0x9DE8,\n\t32962 - 11904: 0xD05B,\n\t32963 - 11904: 0xAD47,\n\t32964 - 11904: 0xAD48,\n\t32965 - 11904: 0xD05D,\n\t32966 - 11904: 0x9565,\n\t32967 - 11904: 0xD057,\n\t32968 - 11904: 0xD05A,\n\t32969 - 11904: 0xD063,\n\t32970 - 11904: 0xD061,\n\t32972 - 11904: 0xAD49,\n\t32973 - 11904: 0xD067,\n\t32974 - 11904: 0xAD4C,\n\t32975 - 11904: 0xD064,\n\t32976 - 11904: 0xD05C,\n\t32977 - 11904: 0xD059,\n\t32980 - 11904: 0xDB49,\n\t32981 - 11904: 0xD062,\n\t32982 - 11904: 0xAD44,\n\t32983 - 11904: 0xD065,\n\t32984 - 11904: 0xD056,\n\t32985 - 11904: 0xD05F,\n\t32986 - 11904: 0xAD46,\n\t32987 - 11904: 0xAD4B,\n\t32988 - 11904: 0xD060,\n\t32989 - 11904: 0xAD4F,\n\t32990 - 11904: 0xAD4D,\n\t32992 - 11904: 0xD058,\n\t32993 - 11904: 0xAD4A,\n\t32995 - 11904: 0xD05E,\n\t32996 - 11904: 0xAD4E,\n\t32997 - 11904: 0xAD45,\n\t32998 - 11904: 0xD066,\n\t33001 - 11904: 0x9972,\n\t33004 - 11904: 0x8B5C,\n\t33005 - 11904: 0xAFDA,\n\t33007 - 11904: 0xAFE3,\n\t33008 - 11904: 0xAFD8,\n\t33009 - 11904: 0xAFD6,\n\t33010 - 11904: 0xD36A,\n\t33011 - 11904: 0xAFDE,\n\t33012 - 11904: 0xAFDB,\n\t33013 - 11904: 0xD36C,\n\t33014 - 11904: 0x89B1,\n\t33016 - 11904: 0xAFDD,\n\t33017 - 11904: 0xD36B,\n\t33018 - 11904: 0xD369,\n\t33019 - 11904: 0xD36E,\n\t33020 - 11904: 0xAFE2,\n\t33021 - 11904: 0xAFE0,\n\t33022 - 11904: 0xDB48,\n\t33024 - 11904: 0xD36F,\n\t33025 - 11904: 0xD36D,\n\t33026 - 11904: 0xAFD7,\n\t33027 - 11904: 0xA0C0,\n\t33029 - 11904: 0xAFD9,\n\t33030 - 11904: 0xAFDC,\n\t33031 - 11904: 0x8EDF,\n\t33032 - 11904: 0xAFDF,\n\t33033 - 11904: 0x9566,\n\t33034 - 11904: 0xAFE1,\n\t33036 - 11904: 0x9974,\n\t33038 - 11904: 0x9976,\n\t33042 - 11904: 0x9977,\n\t33044 - 11904: 0x9979,\n\t33045 - 11904: 0xD74E,\n\t33046 - 11904: 0xB2E4,\n\t33047 - 11904: 0x9DDA,\n\t33048 - 11904: 0xD745,\n\t33049 - 11904: 0xD747,\n\t33050 - 11904: 0x8EE0,\n\t33051 - 11904: 0xD748,\n\t33053 - 11904: 0xD750,\n\t33054 - 11904: 0xD74C,\n\t33055 - 11904: 0xD74A,\n\t33057 - 11904: 0xD74D,\n\t33058 - 11904: 0xD751,\n\t33059 - 11904: 0xB2E5,\n\t33060 - 11904: 0xB2E9,\n\t33061 - 11904: 0xD746,\n\t33063 - 11904: 0xD74F,\n\t33065 - 11904: 0xB2E7,\n\t33066 - 11904: 0x935C,\n\t33067 - 11904: 0xB2E6,\n\t33068 - 11904: 0xD74B,\n\t33069 - 11904: 0xD749,\n\t33071 - 11904: 0xB2E3,\n\t33072 - 11904: 0xB2E8,\n\t33074 - 11904: 0x9DE6,\n\t33076 - 11904: 0x8B5F,\n\t33079 - 11904: 0x9563,\n\t33081 - 11904: 0xB5C8,\n\t33082 - 11904: 0xDB51,\n\t33085 - 11904: 0xDB4F,\n\t33086 - 11904: 0xB5CA,\n\t33090 - 11904: 0x9567,\n\t33091 - 11904: 0xDB4A,\n\t33092 - 11904: 0xDFA1,\n\t33094 - 11904: 0xB5C9,\n\t33095 - 11904: 0xDB4E,\n\t33096 - 11904: 0x9DE3,\n\t33098 - 11904: 0xDB4B,\n\t33099 - 11904: 0xB5C5,\n\t33100 - 11904: 0xB5CB,\n\t33101 - 11904: 0xDB50,\n\t33102 - 11904: 0xB5C7,\n\t33103 - 11904: 0xDB4D,\n\t33104 - 11904: 0xBB47,\n\t33105 - 11904: 0xB5C6,\n\t33106 - 11904: 0xDB4C,\n\t33107 - 11904: 0xB5CC,\n\t33108 - 11904: 0xB5C4,\n\t33109 - 11904: 0xB5C3,\n\t33110 - 11904: 0x997C,\n\t33113 - 11904: 0x997D,\n\t33114 - 11904: 0x997E,\n\t33115 - 11904: 0xDF77,\n\t33116 - 11904: 0xDF75,\n\t33118 - 11904: 0xDF7B,\n\t33120 - 11904: 0xDF73,\n\t33121 - 11904: 0xDFA2,\n\t33122 - 11904: 0xDF78,\n\t33124 - 11904: 0xDF72,\n\t33125 - 11904: 0xB87B,\n\t33126 - 11904: 0xB8A3,\n\t33127 - 11904: 0xDF7D,\n\t33129 - 11904: 0xDF76,\n\t33131 - 11904: 0xB87E,\n\t33132 - 11904: 0x8CFB,\n\t33133 - 11904: 0x8B5B,\n\t33134 - 11904: 0xB87C,\n\t33135 - 11904: 0xDF7E,\n\t33136 - 11904: 0xB879,\n\t33137 - 11904: 0xB878,\n\t33138 - 11904: 0xDF79,\n\t33139 - 11904: 0xB87D,\n\t33140 - 11904: 0xB5CD,\n\t33142 - 11904: 0xDF7C,\n\t33143 - 11904: 0xDF74,\n\t33144 - 11904: 0xB87A,\n\t33145 - 11904: 0xB8A1,\n\t33146 - 11904: 0xB8A2,\n\t33148 - 11904: 0x99A3,\n\t33151 - 11904: 0xBB4C,\n\t33152 - 11904: 0xBB48,\n\t33154 - 11904: 0xBB4D,\n\t33155 - 11904: 0xE3A6,\n\t33156 - 11904: 0x99A4,\n\t33158 - 11904: 0xE3A5,\n\t33159 - 11904: 0xE3A7,\n\t33160 - 11904: 0xBB4A,\n\t33161 - 11904: 0xE3A4,\n\t33162 - 11904: 0xBB4B,\n\t33163 - 11904: 0xE3AA,\n\t33164 - 11904: 0xE3A9,\n\t33165 - 11904: 0xE3A8,\n\t33167 - 11904: 0xBB49,\n\t33171 - 11904: 0x99A6,\n\t33173 - 11904: 0xE741,\n\t33175 - 11904: 0xE744,\n\t33176 - 11904: 0xBDA8,\n\t33177 - 11904: 0xE743,\n\t33178 - 11904: 0xBDA7,\n\t33179 - 11904: 0xBDA3,\n\t33180 - 11904: 0xBDA4,\n\t33181 - 11904: 0xBDA5,\n\t33182 - 11904: 0xE740,\n\t33183 - 11904: 0xE6FE,\n\t33184 - 11904: 0xBDA6,\n\t33186 - 11904: 0xE742,\n\t33187 - 11904: 0xE6FD,\n\t33189 - 11904: 0x99A8,\n\t33190 - 11904: 0xEAE9,\n\t33191 - 11904: 0xEAF3,\n\t33192 - 11904: 0xBFB1,\n\t33193 - 11904: 0xBFB0,\n\t33194 - 11904: 0x8ABE,\n\t33195 - 11904: 0xEAED,\n\t33196 - 11904: 0xEAEF,\n\t33198 - 11904: 0xEAEA,\n\t33200 - 11904: 0xEAEE,\n\t33201 - 11904: 0xEAE8,\n\t33202 - 11904: 0xEAF1,\n\t33203 - 11904: 0xBFAF,\n\t33204 - 11904: 0xEAF0,\n\t33205 - 11904: 0xEAEC,\n\t33206 - 11904: 0x9E61,\n\t33207 - 11904: 0xEAF2,\n\t33209 - 11904: 0xEAEB,\n\t33210 - 11904: 0xC174,\n\t33211 - 11904: 0xEDE8,\n\t33212 - 11904: 0xEDEE,\n\t33213 - 11904: 0xC178,\n\t33214 - 11904: 0xC17A,\n\t33215 - 11904: 0xC177,\n\t33216 - 11904: 0xC176,\n\t33217 - 11904: 0x99AA,\n\t33218 - 11904: 0xC175,\n\t33219 - 11904: 0xC173,\n\t33220 - 11904: 0xEDE9,\n\t33221 - 11904: 0xEDEC,\n\t33222 - 11904: 0xC172,\n\t33223 - 11904: 0xEDED,\n\t33224 - 11904: 0xA0C8,\n\t33225 - 11904: 0xC179,\n\t33226 - 11904: 0xEDEB,\n\t33228 - 11904: 0xEDEA,\n\t33229 - 11904: 0xC2C0,\n\t33231 - 11904: 0xC2C1,\n\t33232 - 11904: 0xF0A1,\n\t33233 - 11904: 0xF07D,\n\t33234 - 11904: 0xF07E,\n\t33237 - 11904: 0xF2C2,\n\t33239 - 11904: 0xF2C1,\n\t33240 - 11904: 0xC3BE,\n\t33241 - 11904: 0xF4B4,\n\t33242 - 11904: 0xC4A4,\n\t33243 - 11904: 0xF4B3,\n\t33245 - 11904: 0xF5F0,\n\t33246 - 11904: 0xF745,\n\t33247 - 11904: 0xC5A6,\n\t33248 - 11904: 0xF943,\n\t33249 - 11904: 0xF944,\n\t33250 - 11904: 0xC5D8,\n\t33251 - 11904: 0xA6DA,\n\t33252 - 11904: 0x99AB,\n\t33253 - 11904: 0xAAD7,\n\t33254 - 11904: 0xDB52,\n\t33255 - 11904: 0xBB4E,\n\t33256 - 11904: 0xC17B,\n\t33257 - 11904: 0xEDEF,\n\t33258 - 11904: 0xA6DB,\n\t33260 - 11904: 0xAFE5,\n\t33261 - 11904: 0xAFE4,\n\t33262 - 11904: 0xDB53,\n\t33263 - 11904: 0xFEC4,\n\t33266 - 11904: 0xEAF4,\n\t33267 - 11904: 0xA6DC,\n\t33268 - 11904: 0xAD50,\n\t33270 - 11904: 0x98C2,\n\t33271 - 11904: 0xDB54,\n\t33272 - 11904: 0xDB55,\n\t33273 - 11904: 0xDB56,\n\t33274 - 11904: 0xBB4F,\n\t33275 - 11904: 0xBFB2,\n\t33276 - 11904: 0xA6DD,\n\t33278 - 11904: 0xAAD8,\n\t33279 - 11904: 0xD068,\n\t33280 - 11904: 0xAFE6,\n\t33281 - 11904: 0xD370,\n\t33282 - 11904: 0xB2EA,\n\t33284 - 11904: 0xDB57,\n\t33285 - 11904: 0xB8A4,\n\t33287 - 11904: 0xBB50,\n\t33288 - 11904: 0xBFB3,\n\t33289 - 11904: 0xC17C,\n\t33290 - 11904: 0xC2C2,\n\t33291 - 11904: 0xF4B5,\n\t33292 - 11904: 0xA6DE,\n\t33293 - 11904: 0xAAD9,\n\t33296 - 11904: 0xAFE7,\n\t33297 - 11904: 0xD752,\n\t33298 - 11904: 0xB5CE,\n\t33300 - 11904: 0xBB51,\n\t33301 - 11904: 0xE3AB,\n\t33302 - 11904: 0xE745,\n\t33304 - 11904: 0x8EE8,\n\t33306 - 11904: 0xA0BA,\n\t33307 - 11904: 0xA6DF,\n\t33308 - 11904: 0xB5CF,\n\t33309 - 11904: 0xDFA3,\n\t33310 - 11904: 0xBB52,\n\t33311 - 11904: 0xA6E0,\n\t33312 - 11904: 0xCDB1,\n\t33313 - 11904: 0xD069,\n\t33314 - 11904: 0xAD51,\n\t33317 - 11904: 0xD372,\n\t33318 - 11904: 0xFD77,\n\t33320 - 11904: 0xAFEA,\n\t33321 - 11904: 0x8EEE,\n\t33322 - 11904: 0xAFE8,\n\t33323 - 11904: 0xAFE9,\n\t33324 - 11904: 0xAFEB,\n\t33325 - 11904: 0x9EBF,\n\t33327 - 11904: 0xD371,\n\t33330 - 11904: 0xD757,\n\t33331 - 11904: 0xD754,\n\t33332 - 11904: 0xD756,\n\t33333 - 11904: 0xB2EB,\n\t33334 - 11904: 0xB2ED,\n\t33335 - 11904: 0xB2EC,\n\t33336 - 11904: 0xD753,\n\t33337 - 11904: 0xB2EE,\n\t33338 - 11904: 0xD755,\n\t33340 - 11904: 0xDB58,\n\t33341 - 11904: 0xDB59,\n\t33342 - 11904: 0x89C2,\n\t33343 - 11904: 0xDB5A,\n\t33344 - 11904: 0xDFA6,\n\t33346 - 11904: 0xDFA7,\n\t33348 - 11904: 0xDFA5,\n\t33349 - 11904: 0xDFA8,\n\t33351 - 11904: 0xB8A5,\n\t33353 - 11904: 0xDFA4,\n\t33355 - 11904: 0xBB53,\n\t33358 - 11904: 0xE74A,\n\t33359 - 11904: 0xE746,\n\t33360 - 11904: 0xE749,\n\t33361 - 11904: 0xE74B,\n\t33362 - 11904: 0xE748,\n\t33363 - 11904: 0xE747,\n\t33364 - 11904: 0x99AC,\n\t33365 - 11904: 0xEAF5,\n\t33366 - 11904: 0xEAF6,\n\t33367 - 11904: 0xEAF7,\n\t33368 - 11904: 0xBFB4,\n\t33369 - 11904: 0xBFB5,\n\t33370 - 11904: 0xEDF1,\n\t33371 - 11904: 0xEDF0,\n\t33372 - 11904: 0xEDF2,\n\t33374 - 11904: 0xF0A3,\n\t33375 - 11904: 0xF0A2,\n\t33377 - 11904: 0xF2C4,\n\t33378 - 11904: 0x956B,\n\t33379 - 11904: 0xF2C5,\n\t33380 - 11904: 0xF2C3,\n\t33381 - 11904: 0x956C,\n\t33382 - 11904: 0xC4A5,\n\t33384 - 11904: 0xF4B6,\n\t33385 - 11904: 0xF4B7,\n\t33387 - 11904: 0xF746,\n\t33388 - 11904: 0xF7EF,\n\t33389 - 11904: 0xF8BB,\n\t33390 - 11904: 0xA6E1,\n\t33391 - 11904: 0xA87D,\n\t33393 - 11904: 0xC17D,\n\t33394 - 11904: 0xA6E2,\n\t33396 - 11904: 0xD758,\n\t33397 - 11904: 0xDB5B,\n\t33398 - 11904: 0x99AF,\n\t33399 - 11904: 0xC641,\n\t33400 - 11904: 0xCA4A,\n\t33401 - 11904: 0x994A,\n\t33402 - 11904: 0x8976,\n\t33403 - 11904: 0x8F48,\n\t33404 - 11904: 0xCA4B,\n\t33405 - 11904: 0xCA4D,\n\t33406 - 11904: 0xA6E3,\n\t33407 - 11904: 0xCA4E,\n\t33408 - 11904: 0xCA4C,\n\t33411 - 11904: 0xCBA2,\n\t33412 - 11904: 0xCBA3,\n\t33413 - 11904: 0xCB7B,\n\t33415 - 11904: 0xFBEE,\n\t33418 - 11904: 0xCBA1,\n\t33419 - 11904: 0xA8A1,\n\t33421 - 11904: 0xA8A2,\n\t33422 - 11904: 0xCB7C,\n\t33423 - 11904: 0xCB7A,\n\t33424 - 11904: 0xCB79,\n\t33425 - 11904: 0xCB7D,\n\t33426 - 11904: 0xA87E,\n\t33427 - 11904: 0xCB7E,\n\t33428 - 11904: 0xD06A,\n\t33432 - 11904: 0xCDB6,\n\t33433 - 11904: 0xAADC,\n\t33434 - 11904: 0xCDB5,\n\t33435 - 11904: 0xCDB7,\n\t33437 - 11904: 0xAADB,\n\t33438 - 11904: 0xCDBC,\n\t33439 - 11904: 0xAADF,\n\t33440 - 11904: 0xCDB2,\n\t33441 - 11904: 0xCDC0,\n\t33442 - 11904: 0xCDC6,\n\t33443 - 11904: 0xAAE6,\n\t33444 - 11904: 0xCDC3,\n\t33445 - 11904: 0xAAE3,\n\t33446 - 11904: 0x99AE,\n\t33447 - 11904: 0xCDB9,\n\t33448 - 11904: 0xCDBF,\n\t33449 - 11904: 0xCDC1,\n\t33450 - 11904: 0x8EFB,\n\t33451 - 11904: 0xCDB4,\n\t33452 - 11904: 0xAAE2,\n\t33453 - 11904: 0xAADD,\n\t33454 - 11904: 0xCDBA,\n\t33455 - 11904: 0xAAE4,\n\t33456 - 11904: 0xAAE7,\n\t33457 - 11904: 0xAAE1,\n\t33459 - 11904: 0xAADA,\n\t33460 - 11904: 0xCDBE,\n\t33461 - 11904: 0xCDB8,\n\t33462 - 11904: 0xCDC5,\n\t33463 - 11904: 0xAAE9,\n\t33464 - 11904: 0xAAE5,\n\t33465 - 11904: 0xAAE0,\n\t33466 - 11904: 0xCDBD,\n\t33467 - 11904: 0xAFEC,\n\t33468 - 11904: 0xCDBB,\n\t33469 - 11904: 0xAADE,\n\t33470 - 11904: 0xAAE8,\n\t33471 - 11904: 0x8CD0,\n\t33472 - 11904: 0xCDB3,\n\t33474 - 11904: 0xCDC2,\n\t33475 - 11904: 0xCDC4,\n\t33476 - 11904: 0x8B52,\n\t33482 - 11904: 0x99B0,\n\t33487 - 11904: 0x8977,\n\t33488 - 11904: 0x8F41,\n\t33489 - 11904: 0xAD62,\n\t33490 - 11904: 0xAD5C,\n\t33491 - 11904: 0xAD64,\n\t33492 - 11904: 0xAD61,\n\t33493 - 11904: 0xD071,\n\t33494 - 11904: 0xD074,\n\t33495 - 11904: 0xAD5D,\n\t33496 - 11904: 0x99B1,\n\t33497 - 11904: 0xD06B,\n\t33499 - 11904: 0xAD56,\n\t33500 - 11904: 0xAD60,\n\t33502 - 11904: 0xAD63,\n\t33503 - 11904: 0xAD65,\n\t33504 - 11904: 0xD0A2,\n\t33505 - 11904: 0xD077,\n\t33506 - 11904: 0x8F49,\n\t33507 - 11904: 0xAD55,\n\t33508 - 11904: 0xD0A1,\n\t33509 - 11904: 0xAD59,\n\t33510 - 11904: 0xAD57,\n\t33511 - 11904: 0xAD52,\n\t33512 - 11904: 0xD06F,\n\t33514 - 11904: 0xD07E,\n\t33515 - 11904: 0xD073,\n\t33516 - 11904: 0xD076,\n\t33517 - 11904: 0xD0A5,\n\t33518 - 11904: 0xFA4D,\n\t33519 - 11904: 0xAD66,\n\t33520 - 11904: 0xD07D,\n\t33521 - 11904: 0xAD5E,\n\t33522 - 11904: 0xD078,\n\t33523 - 11904: 0xD0A4,\n\t33524 - 11904: 0xD075,\n\t33525 - 11904: 0xD079,\n\t33526 - 11904: 0xD07C,\n\t33527 - 11904: 0x9DE4,\n\t33528 - 11904: 0x8CB5,\n\t33529 - 11904: 0xD06D,\n\t33530 - 11904: 0xD0A3,\n\t33531 - 11904: 0xD07B,\n\t33532 - 11904: 0xFBE9,\n\t33533 - 11904: 0x9B54,\n\t33534 - 11904: 0xD06C,\n\t33535 - 11904: 0x99B2,\n\t33536 - 11904: 0xD070,\n\t33537 - 11904: 0xAD5F,\n\t33538 - 11904: 0xAD5A,\n\t33539 - 11904: 0xAD53,\n\t33540 - 11904: 0xAD58,\n\t33541 - 11904: 0xAD54,\n\t33542 - 11904: 0xAD67,\n\t33543 - 11904: 0xD06E,\n\t33544 - 11904: 0xD3A5,\n\t33545 - 11904: 0xAD5B,\n\t33547 - 11904: 0x9E68,\n\t33548 - 11904: 0xD07A,\n\t33549 - 11904: 0xCE41,\n\t33558 - 11904: 0xD3A8,\n\t33559 - 11904: 0xAFFA,\n\t33560 - 11904: 0x8F4A,\n\t33561 - 11904: 0xD376,\n\t33562 - 11904: 0x8F42,\n\t33563 - 11904: 0xD3A3,\n\t33564 - 11904: 0xD37D,\n\t33565 - 11904: 0x8F51,\n\t33566 - 11904: 0xD3B2,\n\t33568 - 11904: 0xD3AA,\n\t33570 - 11904: 0xD37E,\n\t33572 - 11904: 0xD3A9,\n\t33573 - 11904: 0xD378,\n\t33574 - 11904: 0xD37C,\n\t33575 - 11904: 0xD3B5,\n\t33576 - 11904: 0xAFFD,\n\t33577 - 11904: 0xD3AD,\n\t33578 - 11904: 0xD3A4,\n\t33579 - 11904: 0xAFED,\n\t33580 - 11904: 0xD3B3,\n\t33581 - 11904: 0xD374,\n\t33583 - 11904: 0xD3AC,\n\t33585 - 11904: 0xAFFC,\n\t33586 - 11904: 0xAFF7,\n\t33587 - 11904: 0xD373,\n\t33588 - 11904: 0xAFF5,\n\t33589 - 11904: 0xAFF4,\n\t33590 - 11904: 0xAFF9,\n\t33591 - 11904: 0xD3AB,\n\t33592 - 11904: 0xAFF1,\n\t33593 - 11904: 0xAFF8,\n\t33594 - 11904: 0xD072,\n\t33595 - 11904: 0xDB5C,\n\t33596 - 11904: 0xD3A6,\n\t33597 - 11904: 0x9846,\n\t33599 - 11904: 0xD37A,\n\t33600 - 11904: 0xAFFB,\n\t33601 - 11904: 0xD37B,\n\t33602 - 11904: 0xD3A1,\n\t33603 - 11904: 0xAFFE,\n\t33604 - 11904: 0xD375,\n\t33605 - 11904: 0xD3AF,\n\t33607 - 11904: 0xD3AE,\n\t33608 - 11904: 0xD3B6,\n\t33609 - 11904: 0xAFF3,\n\t33610 - 11904: 0xAFF0,\n\t33611 - 11904: 0xD3B4,\n\t33612 - 11904: 0xD3B0,\n\t33613 - 11904: 0xD3A7,\n\t33614 - 11904: 0xD3A2,\n\t33615 - 11904: 0xAFF6,\n\t33616 - 11904: 0xAFF2,\n\t33617 - 11904: 0xD377,\n\t33618 - 11904: 0xAFEE,\n\t33619 - 11904: 0xD3B1,\n\t33620 - 11904: 0xAFEF,\n\t33622 - 11904: 0xD379,\n\t33623 - 11904: 0x99B4,\n\t33634 - 11904: 0x8EF5,\n\t33635 - 11904: 0xFD55,\n\t33638 - 11904: 0x9CCD,\n\t33647 - 11904: 0x8978,\n\t33651 - 11904: 0xD75E,\n\t33652 - 11904: 0xD760,\n\t33653 - 11904: 0xD765,\n\t33654 - 11904: 0xD779,\n\t33655 - 11904: 0xB2FC,\n\t33656 - 11904: 0xB2F2,\n\t33658 - 11904: 0xD75D,\n\t33659 - 11904: 0xB2FD,\n\t33660 - 11904: 0xB2FE,\n\t33661 - 11904: 0xD768,\n\t33662 - 11904: 0xD76F,\n\t33663 - 11904: 0xD775,\n\t33665 - 11904: 0xD762,\n\t33667 - 11904: 0xD769,\n\t33669 - 11904: 0x8F53,\n\t33670 - 11904: 0xB340,\n\t33671 - 11904: 0xD777,\n\t33672 - 11904: 0xD772,\n\t33673 - 11904: 0xB2FA,\n\t33674 - 11904: 0xB2F8,\n\t33675 - 11904: 0xD76E,\n\t33676 - 11904: 0xD76A,\n\t33677 - 11904: 0xD75C,\n\t33678 - 11904: 0xB2EF,\n\t33679 - 11904: 0xD761,\n\t33680 - 11904: 0xD759,\n\t33681 - 11904: 0x8F6F,\n\t33682 - 11904: 0xB2F7,\n\t33683 - 11904: 0xB2F9,\n\t33684 - 11904: 0xD766,\n\t33685 - 11904: 0xD763,\n\t33686 - 11904: 0xB2F4,\n\t33687 - 11904: 0xD773,\n\t33688 - 11904: 0xB2F1,\n\t33689 - 11904: 0xD764,\n\t33690 - 11904: 0xD77A,\n\t33691 - 11904: 0xD76C,\n\t33692 - 11904: 0x8E63,\n\t33693 - 11904: 0xD76B,\n\t33694 - 11904: 0xB2F0,\n\t33696 - 11904: 0xB2FB,\n\t33698 - 11904: 0xB2F3,\n\t33699 - 11904: 0xD75A,\n\t33700 - 11904: 0xD75F,\n\t33701 - 11904: 0xD770,\n\t33702 - 11904: 0xD776,\n\t33703 - 11904: 0xB341,\n\t33704 - 11904: 0xD75B,\n\t33705 - 11904: 0xD767,\n\t33706 - 11904: 0xD76D,\n\t33707 - 11904: 0xB2F6,\n\t33708 - 11904: 0x8F56,\n\t33710 - 11904: 0xD778,\n\t33711 - 11904: 0xD771,\n\t33712 - 11904: 0xD774,\n\t33721 - 11904: 0xFE76,\n\t33725 - 11904: 0xB2F5,\n\t33726 - 11904: 0x9FC6,\n\t33727 - 11904: 0xDB6C,\n\t33728 - 11904: 0xDB60,\n\t33729 - 11904: 0xB5D7,\n\t33730 - 11904: 0xDB7D,\n\t33731 - 11904: 0xDBA7,\n\t33732 - 11904: 0xDBAA,\n\t33733 - 11904: 0xB5D5,\n\t33734 - 11904: 0xDB68,\n\t33735 - 11904: 0xDBA3,\n\t33736 - 11904: 0xDB69,\n\t33737 - 11904: 0xDB77,\n\t33738 - 11904: 0xB5E2,\n\t33739 - 11904: 0xDB73,\n\t33740 - 11904: 0xB5DF,\n\t33741 - 11904: 0xFAAC,\n\t33742 - 11904: 0xDB74,\n\t33743 - 11904: 0xDB5D,\n\t33745 - 11904: 0xDBA4,\n\t33747 - 11904: 0x8F58,\n\t33748 - 11904: 0xB5E8,\n\t33749 - 11904: 0xDBA1,\n\t33750 - 11904: 0xDB75,\n\t33751 - 11904: 0xDBAC,\n\t33752 - 11904: 0xDB70,\n\t33753 - 11904: 0xDFC8,\n\t33755 - 11904: 0xDBAF,\n\t33756 - 11904: 0xB5E6,\n\t33757 - 11904: 0xDB6E,\n\t33758 - 11904: 0xDB7A,\n\t33759 - 11904: 0xB5E9,\n\t33760 - 11904: 0xB5D4,\n\t33761 - 11904: 0xDB72,\n\t33762 - 11904: 0xDBAD,\n\t33763 - 11904: 0xDB6B,\n\t33764 - 11904: 0xDB64,\n\t33765 - 11904: 0xDB6F,\n\t33767 - 11904: 0xDB63,\n\t33768 - 11904: 0xDB61,\n\t33769 - 11904: 0xB5D0,\n\t33770 - 11904: 0xDBA5,\n\t33771 - 11904: 0xDB6A,\n\t33772 - 11904: 0xDBA8,\n\t33773 - 11904: 0x9848,\n\t33774 - 11904: 0xDBA9,\n\t33775 - 11904: 0xB5D8,\n\t33776 - 11904: 0xB5DD,\n\t33777 - 11904: 0xB5D9,\n\t33778 - 11904: 0xB5E1,\n\t33779 - 11904: 0xDB7E,\n\t33780 - 11904: 0xB5DA,\n\t33781 - 11904: 0xDB76,\n\t33782 - 11904: 0xDB66,\n\t33784 - 11904: 0xB5D2,\n\t33785 - 11904: 0xDB5E,\n\t33786 - 11904: 0xDBA2,\n\t33787 - 11904: 0xDBAB,\n\t33788 - 11904: 0xDB65,\n\t33789 - 11904: 0xB5E0,\n\t33790 - 11904: 0xDBB0,\n\t33791 - 11904: 0xDB71,\n\t33793 - 11904: 0xDB6D,\n\t33795 - 11904: 0xB5D1,\n\t33796 - 11904: 0xB5E5,\n\t33797 - 11904: 0x99B7,\n\t33798 - 11904: 0xDB7C,\n\t33799 - 11904: 0xB5E7,\n\t33801 - 11904: 0xDB78,\n\t33802 - 11904: 0xB5DC,\n\t33803 - 11904: 0xB5D6,\n\t33804 - 11904: 0xB5DE,\n\t33805 - 11904: 0xB5D3,\n\t33806 - 11904: 0xB5E4,\n\t33807 - 11904: 0xDB79,\n\t33808 - 11904: 0xDB67,\n\t33809 - 11904: 0xDB7B,\n\t33810 - 11904: 0xDB62,\n\t33811 - 11904: 0xDBA6,\n\t33812 - 11904: 0x9665,\n\t33814 - 11904: 0xFA6C,\n\t33816 - 11904: 0x9DE7,\n\t33819 - 11904: 0xDBAE,\n\t33820 - 11904: 0x9E62,\n\t33824 - 11904: 0x96CC,\n\t33825 - 11904: 0x8E67,\n\t33827 - 11904: 0xDB5F,\n\t33828 - 11904: 0xFC75,\n\t33830 - 11904: 0x987E,\n\t33833 - 11904: 0xDFC7,\n\t33835 - 11904: 0xDFDD,\n\t33836 - 11904: 0xB855,\n\t33837 - 11904: 0xDFCC,\n\t33838 - 11904: 0xFDB9,\n\t33839 - 11904: 0xDFCA,\n\t33840 - 11904: 0xDFB5,\n\t33841 - 11904: 0xB8A9,\n\t33842 - 11904: 0xDFC5,\n\t33843 - 11904: 0xDFD9,\n\t33844 - 11904: 0xDFC1,\n\t33845 - 11904: 0xB8B1,\n\t33846 - 11904: 0xDFD8,\n\t33847 - 11904: 0xDFBF,\n\t33848 - 11904: 0xB5E3,\n\t33849 - 11904: 0xDFCF,\n\t33850 - 11904: 0xDFC0,\n\t33851 - 11904: 0xDFD6,\n\t33852 - 11904: 0xB8B0,\n\t33853 - 11904: 0xB8A8,\n\t33854 - 11904: 0x97FC,\n\t33855 - 11904: 0xDFAA,\n\t33856 - 11904: 0xDFB2,\n\t33858 - 11904: 0xDFCB,\n\t33859 - 11904: 0xDFC3,\n\t33860 - 11904: 0xDFDC,\n\t33861 - 11904: 0xDFC6,\n\t33862 - 11904: 0xB8B6,\n\t33863 - 11904: 0xDFD7,\n\t33864 - 11904: 0x98F9,\n\t33865 - 11904: 0xB8AD,\n\t33866 - 11904: 0x8F66,\n\t33867 - 11904: 0xDFC9,\n\t33868 - 11904: 0xDFD1,\n\t33869 - 11904: 0xDFB6,\n\t33870 - 11904: 0xDFD0,\n\t33872 - 11904: 0xDFE1,\n\t33873 - 11904: 0xDFB1,\n\t33874 - 11904: 0xDFD2,\n\t33875 - 11904: 0x956E,\n\t33876 - 11904: 0xDFDF,\n\t33877 - 11904: 0x9245,\n\t33878 - 11904: 0xDFAB,\n\t33879 - 11904: 0xB5DB,\n\t33880 - 11904: 0x8F60,\n\t33881 - 11904: 0xDFB9,\n\t33882 - 11904: 0xDFB8,\n\t33883 - 11904: 0xB8AF,\n\t33884 - 11904: 0x9ED1,\n\t33885 - 11904: 0xDFBC,\n\t33886 - 11904: 0xDFBE,\n\t33887 - 11904: 0xDFCD,\n\t33888 - 11904: 0xDFDE,\n\t33889 - 11904: 0xB8B2,\n\t33890 - 11904: 0xFECD,\n\t33891 - 11904: 0xB8B3,\n\t33892 - 11904: 0x99B9,\n\t33893 - 11904: 0xDFB0,\n\t33894 - 11904: 0xB8AB,\n\t33895 - 11904: 0xDFB4,\n\t33896 - 11904: 0xDFDA,\n\t33897 - 11904: 0xB8B4,\n\t33899 - 11904: 0xB8AC,\n\t33900 - 11904: 0xB8AE,\n\t33901 - 11904: 0xB8B5,\n\t33902 - 11904: 0xDFE0,\n\t33903 - 11904: 0xDFD3,\n\t33904 - 11904: 0xDFCE,\n\t33905 - 11904: 0x8F62,\n\t33906 - 11904: 0x974C,\n\t33907 - 11904: 0xDFBB,\n\t33908 - 11904: 0xDFBA,\n\t33909 - 11904: 0xB8AA,\n\t33910 - 11904: 0xDFAC,\n\t33911 - 11904: 0xB8A7,\n\t33912 - 11904: 0xDFC4,\n\t33913 - 11904: 0xDFAD,\n\t33914 - 11904: 0xDFC2,\n\t33917 - 11904: 0xDFB7,\n\t33918 - 11904: 0xDFDB,\n\t33919 - 11904: 0x91C7,\n\t33920 - 11904: 0x955F,\n\t33922 - 11904: 0xB8A6,\n\t33924 - 11904: 0x87AB,\n\t33926 - 11904: 0xDFB3,\n\t33928 - 11904: 0x99BB,\n\t33933 - 11904: 0xDFAF,\n\t33934 - 11904: 0xDFD5,\n\t33935 - 11904: 0xDFAE,\n\t33936 - 11904: 0xBB60,\n\t33937 - 11904: 0xE3D3,\n\t33938 - 11904: 0x8E6D,\n\t33939 - 11904: 0x8F71,\n\t33940 - 11904: 0xE3C2,\n\t33942 - 11904: 0x94CB,\n\t33943 - 11904: 0xE3AC,\n\t33944 - 11904: 0xE3CA,\n\t33945 - 11904: 0xBB58,\n\t33946 - 11904: 0xE3BB,\n\t33947 - 11904: 0xE3C5,\n\t33948 - 11904: 0xBB5B,\n\t33949 - 11904: 0xE3BE,\n\t33950 - 11904: 0xBB59,\n\t33951 - 11904: 0xE3AF,\n\t33952 - 11904: 0xE3CD,\n\t33953 - 11904: 0xE3AE,\n\t33954 - 11904: 0xE3C1,\n\t33955 - 11904: 0x95B1,\n\t33956 - 11904: 0xE3AD,\n\t33959 - 11904: 0xE3BF,\n\t33960 - 11904: 0xE3C8,\n\t33961 - 11904: 0xE3C6,\n\t33962 - 11904: 0xE3BA,\n\t33963 - 11904: 0xE3B5,\n\t33964 - 11904: 0xE3B3,\n\t33965 - 11904: 0x9AF2,\n\t33966 - 11904: 0xE3B4,\n\t33967 - 11904: 0xE3C7,\n\t33968 - 11904: 0xE3D2,\n\t33969 - 11904: 0xE3BC,\n\t33970 - 11904: 0xBB5A,\n\t33972 - 11904: 0xE3B7,\n\t33974 - 11904: 0xE3CB,\n\t33976 - 11904: 0xBB5D,\n\t33977 - 11904: 0xE3B6,\n\t33978 - 11904: 0xE3B0,\n\t33979 - 11904: 0xE3C0,\n\t33980 - 11904: 0xBB61,\n\t33981 - 11904: 0x96C3,\n\t33982 - 11904: 0x99BD,\n\t33983 - 11904: 0xBB55,\n\t33984 - 11904: 0xBB5E,\n\t33985 - 11904: 0xE3B8,\n\t33986 - 11904: 0xE3B2,\n\t33988 - 11904: 0xBB57,\n\t33989 - 11904: 0xDFD4,\n\t33990 - 11904: 0xBB56,\n\t33991 - 11904: 0xE3C3,\n\t33993 - 11904: 0xBB54,\n\t33994 - 11904: 0xBB63,\n\t33995 - 11904: 0xBB5C,\n\t33996 - 11904: 0xE3C4,\n\t33997 - 11904: 0xE3B9,\n\t33998 - 11904: 0xE3B1,\n\t33999 - 11904: 0xE3CC,\n\t34000 - 11904: 0xE3BD,\n\t34001 - 11904: 0xBB62,\n\t34002 - 11904: 0xE3D0,\n\t34003 - 11904: 0xBB5F,\n\t34004 - 11904: 0xE3CF,\n\t34006 - 11904: 0xE3C9,\n\t34007 - 11904: 0xE3CE,\n\t34010 - 11904: 0xA0CF,\n\t34011 - 11904: 0xE3D1,\n\t34014 - 11904: 0x8F6D,\n\t34017 - 11904: 0x99BE,\n\t34018 - 11904: 0x8EF4,\n\t34020 - 11904: 0x8F72,\n\t34021 - 11904: 0x95E4,\n\t34023 - 11904: 0xE773,\n\t34024 - 11904: 0xE774,\n\t34025 - 11904: 0xE767,\n\t34026 - 11904: 0xE766,\n\t34027 - 11904: 0xE762,\n\t34028 - 11904: 0xBDB4,\n\t34030 - 11904: 0xBDAC,\n\t34031 - 11904: 0xE776,\n\t34032 - 11904: 0xE775,\n\t34033 - 11904: 0xDFA9,\n\t34034 - 11904: 0xE75F,\n\t34035 - 11904: 0xE763,\n\t34036 - 11904: 0xE75D,\n\t34038 - 11904: 0xE770,\n\t34039 - 11904: 0xE761,\n\t34040 - 11904: 0x99BF,\n\t34041 - 11904: 0xE777,\n\t34042 - 11904: 0xE75A,\n\t34043 - 11904: 0xE758,\n\t34044 - 11904: 0xE764,\n\t34045 - 11904: 0xE76E,\n\t34046 - 11904: 0xE769,\n\t34047 - 11904: 0xBDB6,\n\t34048 - 11904: 0xE74F,\n\t34050 - 11904: 0xE76D,\n\t34051 - 11904: 0x9244,\n\t34052 - 11904: 0x87D7,\n\t34053 - 11904: 0xFBA5,\n\t34054 - 11904: 0xBDB7,\n\t34055 - 11904: 0xDFBD,\n\t34056 - 11904: 0xE75B,\n\t34057 - 11904: 0xE752,\n\t34058 - 11904: 0xE755,\n\t34059 - 11904: 0xE77B,\n\t34060 - 11904: 0xE75C,\n\t34061 - 11904: 0xE753,\n\t34062 - 11904: 0xE751,\n\t34063 - 11904: 0xE74E,\n\t34064 - 11904: 0x99C0,\n\t34065 - 11904: 0xBDB0,\n\t34066 - 11904: 0xE765,\n\t34067 - 11904: 0xBDAF,\n\t34068 - 11904: 0xBDB3,\n\t34069 - 11904: 0xE760,\n\t34070 - 11904: 0xE768,\n\t34071 - 11904: 0xBDA9,\n\t34072 - 11904: 0xE778,\n\t34073 - 11904: 0xE77C,\n\t34074 - 11904: 0xBDAB,\n\t34076 - 11904: 0xE757,\n\t34077 - 11904: 0xE76B,\n\t34078 - 11904: 0xE76F,\n\t34079 - 11904: 0xE754,\n\t34080 - 11904: 0xE779,\n\t34081 - 11904: 0xBDB2,\n\t34083 - 11904: 0xBDB1,\n\t34084 - 11904: 0xE74C,\n\t34085 - 11904: 0xBDB5,\n\t34086 - 11904: 0xE772,\n\t34087 - 11904: 0xE756,\n\t34088 - 11904: 0xE76A,\n\t34089 - 11904: 0xE750,\n\t34090 - 11904: 0xE75E,\n\t34091 - 11904: 0xE759,\n\t34092 - 11904: 0xBDAD,\n\t34093 - 11904: 0xBDAE,\n\t34094 - 11904: 0xE76C,\n\t34095 - 11904: 0xE77D,\n\t34096 - 11904: 0xE77A,\n\t34097 - 11904: 0xE771,\n\t34099 - 11904: 0xFDB4,\n\t34100 - 11904: 0x8F77,\n\t34104 - 11904: 0x99C1,\n\t34107 - 11904: 0xE74D,\n\t34109 - 11904: 0xBDAA,\n\t34110 - 11904: 0xEB49,\n\t34112 - 11904: 0xEB40,\n\t34113 - 11904: 0xEB43,\n\t34114 - 11904: 0xFAB9,\n\t34115 - 11904: 0xBFBB,\n\t34116 - 11904: 0xEB45,\n\t34117 - 11904: 0xEAF9,\n\t34118 - 11904: 0xEB41,\n\t34119 - 11904: 0xEB47,\n\t34120 - 11904: 0xBFB8,\n\t34121 - 11904: 0xBFBC,\n\t34122 - 11904: 0xBFB6,\n\t34123 - 11904: 0x8F40,\n\t34124 - 11904: 0xFA44,\n\t34125 - 11904: 0xEAFB,\n\t34126 - 11904: 0xEB4C,\n\t34129 - 11904: 0xEB46,\n\t34130 - 11904: 0x99C2,\n\t34131 - 11904: 0xEAFC,\n\t34132 - 11904: 0xEB55,\n\t34133 - 11904: 0xEB4F,\n\t34134 - 11904: 0xEAF8,\n\t34135 - 11904: 0xEE46,\n\t34136 - 11904: 0xEAFE,\n\t34137 - 11904: 0xBFB7,\n\t34138 - 11904: 0x8F5C,\n\t34139 - 11904: 0xEB4A,\n\t34141 - 11904: 0xEB54,\n\t34142 - 11904: 0xBFBF,\n\t34143 - 11904: 0x8CBD,\n\t34144 - 11904: 0xEB51,\n\t34145 - 11904: 0xEAFD,\n\t34146 - 11904: 0xEB44,\n\t34147 - 11904: 0xEB48,\n\t34148 - 11904: 0xEB42,\n\t34149 - 11904: 0xEB56,\n\t34150 - 11904: 0xEB53,\n\t34151 - 11904: 0xEB50,\n\t34152 - 11904: 0xBFB9,\n\t34153 - 11904: 0xBFBA,\n\t34154 - 11904: 0xBFBE,\n\t34155 - 11904: 0xEAFA,\n\t34156 - 11904: 0xEB57,\n\t34157 - 11904: 0xBFBD,\n\t34158 - 11904: 0xEB4D,\n\t34159 - 11904: 0x99C4,\n\t34160 - 11904: 0x99C5,\n\t34161 - 11904: 0xEB4B,\n\t34163 - 11904: 0x8F7B,\n\t34165 - 11904: 0xEB4E,\n\t34166 - 11904: 0xEE53,\n\t34167 - 11904: 0xEE40,\n\t34168 - 11904: 0xEE45,\n\t34169 - 11904: 0xEE52,\n\t34170 - 11904: 0xEE44,\n\t34171 - 11904: 0xEDFB,\n\t34172 - 11904: 0xEE41,\n\t34174 - 11904: 0xC1A2,\n\t34176 - 11904: 0xEDF4,\n\t34177 - 11904: 0xEE4D,\n\t34178 - 11904: 0xEE4F,\n\t34179 - 11904: 0xEDF3,\n\t34180 - 11904: 0xC1A1,\n\t34181 - 11904: 0xEE51,\n\t34182 - 11904: 0xEE49,\n\t34183 - 11904: 0xC1A8,\n\t34184 - 11904: 0xEE50,\n\t34185 - 11904: 0xEE42,\n\t34186 - 11904: 0xC1AA,\n\t34187 - 11904: 0xEDF9,\n\t34188 - 11904: 0xEB52,\n\t34189 - 11904: 0xEE4A,\n\t34190 - 11904: 0xEE47,\n\t34191 - 11904: 0xEDF5,\n\t34192 - 11904: 0xEE55,\n\t34193 - 11904: 0xC1A4,\n\t34195 - 11904: 0x8776,\n\t34196 - 11904: 0xC1A5,\n\t34197 - 11904: 0xEDF7,\n\t34198 - 11904: 0xEE48,\n\t34199 - 11904: 0x8CB6,\n\t34200 - 11904: 0xEE54,\n\t34201 - 11904: 0xEE4B,\n\t34202 - 11904: 0xEDFD,\n\t34203 - 11904: 0xC1A7,\n\t34204 - 11904: 0xC1A3,\n\t34205 - 11904: 0xEE4C,\n\t34206 - 11904: 0xEDFE,\n\t34207 - 11904: 0xEE56,\n\t34208 - 11904: 0xEDF8,\n\t34209 - 11904: 0xEE43,\n\t34210 - 11904: 0xEE4E,\n\t34211 - 11904: 0xEDFA,\n\t34212 - 11904: 0xEDFC,\n\t34214 - 11904: 0xC2CB,\n\t34215 - 11904: 0xEDF6,\n\t34216 - 11904: 0xC1A9,\n\t34217 - 11904: 0xC2C4,\n\t34218 - 11904: 0xC17E,\n\t34223 - 11904: 0xC1A6,\n\t34224 - 11904: 0xC2C8,\n\t34225 - 11904: 0xF0B3,\n\t34227 - 11904: 0xF0A9,\n\t34228 - 11904: 0xF0A4,\n\t34229 - 11904: 0xF0AA,\n\t34230 - 11904: 0xF0B4,\n\t34231 - 11904: 0xF0B8,\n\t34232 - 11904: 0xF0B7,\n\t34233 - 11904: 0xC2CA,\n\t34234 - 11904: 0xC2C9,\n\t34237 - 11904: 0xF0AB,\n\t34238 - 11904: 0xF0B9,\n\t34239 - 11904: 0xF0AE,\n\t34240 - 11904: 0xF0A6,\n\t34241 - 11904: 0x8FA3,\n\t34242 - 11904: 0xF0A8,\n\t34243 - 11904: 0xF0A7,\n\t34244 - 11904: 0xF0AD,\n\t34245 - 11904: 0xF0B2,\n\t34246 - 11904: 0xF0A5,\n\t34247 - 11904: 0xF0AC,\n\t34248 - 11904: 0xF0B1,\n\t34249 - 11904: 0xC2C7,\n\t34251 - 11904: 0xF0AF,\n\t34253 - 11904: 0xC2C5,\n\t34254 - 11904: 0xF0B0,\n\t34255 - 11904: 0xC2C3,\n\t34256 - 11904: 0xC2C6,\n\t34257 - 11904: 0xF2D5,\n\t34258 - 11904: 0xF0B5,\n\t34261 - 11904: 0xC3C2,\n\t34262 - 11904: 0x8CCE,\n\t34263 - 11904: 0xF2CD,\n\t34264 - 11904: 0xF2D1,\n\t34265 - 11904: 0xF2C9,\n\t34266 - 11904: 0xF2CC,\n\t34268 - 11904: 0xF2D4,\n\t34269 - 11904: 0xC3C0,\n\t34270 - 11904: 0xF2D9,\n\t34271 - 11904: 0xF2D2,\n\t34272 - 11904: 0x99C6,\n\t34273 - 11904: 0xF2CA,\n\t34274 - 11904: 0xF2DA,\n\t34275 - 11904: 0xF2D3,\n\t34276 - 11904: 0xC3C3,\n\t34277 - 11904: 0xC3C4,\n\t34278 - 11904: 0xF2D7,\n\t34280 - 11904: 0xF2CB,\n\t34281 - 11904: 0xC3BF,\n\t34282 - 11904: 0xC3C1,\n\t34283 - 11904: 0xF2C6,\n\t34284 - 11904: 0xF2CE,\n\t34285 - 11904: 0xF2C8,\n\t34286 - 11904: 0x96CD,\n\t34287 - 11904: 0xF2D8,\n\t34288 - 11904: 0xF2D6,\n\t34289 - 11904: 0xF2C7,\n\t34290 - 11904: 0xF2CF,\n\t34294 - 11904: 0xF4BE,\n\t34295 - 11904: 0xC3C5,\n\t34296 - 11904: 0xF2D0,\n\t34297 - 11904: 0xC4A7,\n\t34298 - 11904: 0xC4A9,\n\t34299 - 11904: 0xC4A6,\n\t34300 - 11904: 0x96C7,\n\t34301 - 11904: 0xF4C3,\n\t34302 - 11904: 0xF4BB,\n\t34303 - 11904: 0xF4B9,\n\t34304 - 11904: 0xF4BD,\n\t34305 - 11904: 0xF4BA,\n\t34306 - 11904: 0x8FA5,\n\t34308 - 11904: 0xF4BF,\n\t34309 - 11904: 0xF4C1,\n\t34310 - 11904: 0xC4AA,\n\t34311 - 11904: 0xC4AC,\n\t34313 - 11904: 0xF4C0,\n\t34314 - 11904: 0xC4AD,\n\t34315 - 11904: 0xC4AB,\n\t34316 - 11904: 0xF4C2,\n\t34317 - 11904: 0xFABB,\n\t34319 - 11904: 0x8C61,\n\t34320 - 11904: 0x9570,\n\t34321 - 11904: 0xC4A8,\n\t34323 - 11904: 0x87AF,\n\t34324 - 11904: 0x9368,\n\t34326 - 11904: 0x8F7E,\n\t34327 - 11904: 0xC4F4,\n\t34328 - 11904: 0xF5F1,\n\t34329 - 11904: 0xF5F7,\n\t34330 - 11904: 0xC4F6,\n\t34331 - 11904: 0xF4BC,\n\t34332 - 11904: 0xF5F6,\n\t34334 - 11904: 0xF5FD,\n\t34335 - 11904: 0xF5F4,\n\t34336 - 11904: 0xF5FB,\n\t34337 - 11904: 0xF5FA,\n\t34338 - 11904: 0xF4B8,\n\t34339 - 11904: 0xF5F5,\n\t34340 - 11904: 0xF0B6,\n\t34341 - 11904: 0xF5FE,\n\t34342 - 11904: 0xF5F3,\n\t34343 - 11904: 0xF5F8,\n\t34344 - 11904: 0x8FAA,\n\t34345 - 11904: 0xF5FC,\n\t34346 - 11904: 0xF5F2,\n\t34348 - 11904: 0xF74A,\n\t34349 - 11904: 0xC4F5,\n\t34350 - 11904: 0xF5F9,\n\t34351 - 11904: 0xA050,\n\t34353 - 11904: 0xF7F4,\n\t34354 - 11904: 0xF74B,\n\t34355 - 11904: 0xF749,\n\t34356 - 11904: 0xF747,\n\t34357 - 11904: 0xF748,\n\t34358 - 11904: 0xF74C,\n\t34360 - 11904: 0xC5D9,\n\t34361 - 11904: 0xF7F2,\n\t34362 - 11904: 0xF7F0,\n\t34363 - 11904: 0xF7F5,\n\t34364 - 11904: 0xF7F3,\n\t34366 - 11904: 0xF7F6,\n\t34367 - 11904: 0xC5DA,\n\t34368 - 11904: 0xF7F1,\n\t34370 - 11904: 0x90D3,\n\t34371 - 11904: 0xF8BC,\n\t34373 - 11904: 0x9556,\n\t34374 - 11904: 0xF945,\n\t34375 - 11904: 0xF946,\n\t34376 - 11904: 0xF947,\n\t34379 - 11904: 0xF9C7,\n\t34380 - 11904: 0xF9BD,\n\t34381 - 11904: 0xCA4F,\n\t34382 - 11904: 0xAAEA,\n\t34384 - 11904: 0xAD68,\n\t34386 - 11904: 0xD3B8,\n\t34387 - 11904: 0xD3B7,\n\t34388 - 11904: 0xB040,\n\t34389 - 11904: 0xB342,\n\t34390 - 11904: 0xD77C,\n\t34393 - 11904: 0xD77B,\n\t34395 - 11904: 0xB5EA,\n\t34396 - 11904: 0xB8B8,\n\t34398 - 11904: 0xB8B7,\n\t34399 - 11904: 0xB8B9,\n\t34401 - 11904: 0xE3D4,\n\t34402 - 11904: 0xE77E,\n\t34403 - 11904: 0xEB58,\n\t34404 - 11904: 0xEB5A,\n\t34405 - 11904: 0xEB59,\n\t34407 - 11904: 0xC1AB,\n\t34408 - 11904: 0xEE57,\n\t34409 - 11904: 0xF0BA,\n\t34410 - 11904: 0xF9A5,\n\t34411 - 11904: 0xA6E4,\n\t34412 - 11904: 0x8FB8,\n\t34413 - 11904: 0xCDC9,\n\t34414 - 11904: 0xCDCA,\n\t34415 - 11904: 0xCDC8,\n\t34416 - 11904: 0xCDC7,\n\t34417 - 11904: 0xAAEB,\n\t34418 - 11904: 0x99C8,\n\t34419 - 11904: 0xD0A9,\n\t34420 - 11904: 0xD0A7,\n\t34423 - 11904: 0xD0A6,\n\t34425 - 11904: 0xAD69,\n\t34426 - 11904: 0xAD6B,\n\t34427 - 11904: 0xAD6A,\n\t34428 - 11904: 0xD0A8,\n\t34430 - 11904: 0x8FAF,\n\t34437 - 11904: 0xD3C4,\n\t34438 - 11904: 0xD3C1,\n\t34439 - 11904: 0xD3BF,\n\t34442 - 11904: 0xB041,\n\t34443 - 11904: 0xD3C2,\n\t34444 - 11904: 0xB046,\n\t34445 - 11904: 0xD3BC,\n\t34446 - 11904: 0xD3CB,\n\t34448 - 11904: 0xD3CD,\n\t34449 - 11904: 0xD3BD,\n\t34450 - 11904: 0x99C9,\n\t34451 - 11904: 0xB043,\n\t34452 - 11904: 0xD3CE,\n\t34453 - 11904: 0xD3C9,\n\t34454 - 11904: 0xD3BB,\n\t34455 - 11904: 0xD3C0,\n\t34456 - 11904: 0xD3CA,\n\t34457 - 11904: 0xD3C6,\n\t34458 - 11904: 0xD3C3,\n\t34460 - 11904: 0xB048,\n\t34461 - 11904: 0xD3CC,\n\t34462 - 11904: 0xD3BE,\n\t34464 - 11904: 0x9579,\n\t34465 - 11904: 0xD3C7,\n\t34466 - 11904: 0xD3B9,\n\t34467 - 11904: 0xB047,\n\t34468 - 11904: 0xB044,\n\t34469 - 11904: 0xD3C5,\n\t34471 - 11904: 0xD3C8,\n\t34472 - 11904: 0xD3BA,\n\t34473 - 11904: 0xB045,\n\t34474 - 11904: 0xB042,\n\t34477 - 11904: 0x9F49,\n\t34479 - 11904: 0xB34C,\n\t34480 - 11904: 0xD7A5,\n\t34481 - 11904: 0xB34B,\n\t34482 - 11904: 0x99CA,\n\t34483 - 11904: 0xD7A8,\n\t34484 - 11904: 0xD7AB,\n\t34485 - 11904: 0xB348,\n\t34486 - 11904: 0xB346,\n\t34487 - 11904: 0xD77E,\n\t34488 - 11904: 0xD7A9,\n\t34489 - 11904: 0xD7A7,\n\t34490 - 11904: 0xD7A4,\n\t34491 - 11904: 0xD7AC,\n\t34492 - 11904: 0xD7AD,\n\t34493 - 11904: 0xD7AF,\n\t34494 - 11904: 0xD7B0,\n\t34495 - 11904: 0xD77D,\n\t34496 - 11904: 0xB345,\n\t34497 - 11904: 0xD7A2,\n\t34498 - 11904: 0xD7A1,\n\t34499 - 11904: 0xD7AE,\n\t34500 - 11904: 0xB347,\n\t34501 - 11904: 0xD7A3,\n\t34502 - 11904: 0xB349,\n\t34503 - 11904: 0xB344,\n\t34504 - 11904: 0xD7A6,\n\t34505 - 11904: 0xB34D,\n\t34507 - 11904: 0xB34A,\n\t34508 - 11904: 0xD7AA,\n\t34512 - 11904: 0xB5F1,\n\t34513 - 11904: 0xDBBF,\n\t34515 - 11904: 0xDBB4,\n\t34516 - 11904: 0xB5EE,\n\t34518 - 11904: 0xDFE7,\n\t34519 - 11904: 0xDBBD,\n\t34520 - 11904: 0xDBB1,\n\t34521 - 11904: 0xB5EC,\n\t34522 - 11904: 0xDBB6,\n\t34523 - 11904: 0xB5EF,\n\t34524 - 11904: 0xDBBA,\n\t34525 - 11904: 0xDBB8,\n\t34526 - 11904: 0xB5F2,\n\t34527 - 11904: 0xB5EB,\n\t34530 - 11904: 0xDBB2,\n\t34531 - 11904: 0xDBB5,\n\t34532 - 11904: 0xB5F0,\n\t34534 - 11904: 0xDBB3,\n\t34536 - 11904: 0xDBBE,\n\t34537 - 11904: 0xDBBC,\n\t34538 - 11904: 0xDBB7,\n\t34539 - 11904: 0xDBB9,\n\t34540 - 11904: 0xDBBB,\n\t34541 - 11904: 0xB5ED,\n\t34543 - 11904: 0x99CB,\n\t34549 - 11904: 0xDFE8,\n\t34550 - 11904: 0xDFEE,\n\t34551 - 11904: 0xDFE4,\n\t34552 - 11904: 0xDFEA,\n\t34553 - 11904: 0xB8BA,\n\t34554 - 11904: 0xDFE6,\n\t34555 - 11904: 0xB8C0,\n\t34558 - 11904: 0xB8BF,\n\t34560 - 11904: 0xB8BE,\n\t34561 - 11904: 0xDFED,\n\t34562 - 11904: 0xB8C1,\n\t34563 - 11904: 0xB8C2,\n\t34564 - 11904: 0xDFE3,\n\t34565 - 11904: 0xDFF0,\n\t34566 - 11904: 0xB8C3,\n\t34567 - 11904: 0xB8BD,\n\t34568 - 11904: 0xB8BC,\n\t34569 - 11904: 0xDFEC,\n\t34570 - 11904: 0xB8C4,\n\t34571 - 11904: 0xDFE2,\n\t34572 - 11904: 0xDFE5,\n\t34573 - 11904: 0xDFEF,\n\t34574 - 11904: 0xDFEB,\n\t34577 - 11904: 0xE3F4,\n\t34578 - 11904: 0xE3E9,\n\t34579 - 11904: 0xB8BB,\n\t34584 - 11904: 0xBB6A,\n\t34585 - 11904: 0xE3DD,\n\t34586 - 11904: 0xE3F2,\n\t34587 - 11904: 0xE3DE,\n\t34588 - 11904: 0xBB65,\n\t34590 - 11904: 0xE3DB,\n\t34592 - 11904: 0xE3E4,\n\t34593 - 11904: 0xE3DC,\n\t34594 - 11904: 0xBB67,\n\t34595 - 11904: 0xE3D6,\n\t34596 - 11904: 0xE3F1,\n\t34597 - 11904: 0xBB68,\n\t34598 - 11904: 0xE3EE,\n\t34599 - 11904: 0xE3EF,\n\t34600 - 11904: 0xE3D7,\n\t34601 - 11904: 0xBB6D,\n\t34602 - 11904: 0xE3E6,\n\t34604 - 11904: 0xE3E0,\n\t34605 - 11904: 0xE3E7,\n\t34606 - 11904: 0xE3DA,\n\t34608 - 11904: 0xE3F3,\n\t34609 - 11904: 0xE3EB,\n\t34610 - 11904: 0xE3E5,\n\t34611 - 11904: 0xE3D5,\n\t34612 - 11904: 0xBB69,\n\t34613 - 11904: 0xE3EC,\n\t34615 - 11904: 0xBB6C,\n\t34616 - 11904: 0xE3F0,\n\t34618 - 11904: 0xE3EA,\n\t34619 - 11904: 0xBB66,\n\t34620 - 11904: 0xE3E8,\n\t34622 - 11904: 0xE3E2,\n\t34623 - 11904: 0xBB64,\n\t34624 - 11904: 0xE3D9,\n\t34625 - 11904: 0xE3E1,\n\t34626 - 11904: 0xE3ED,\n\t34627 - 11904: 0xE3DF,\n\t34630 - 11904: 0xE3E3,\n\t34636 - 11904: 0xBDC1,\n\t34637 - 11904: 0xDFE9,\n\t34638 - 11904: 0xE7B2,\n\t34639 - 11904: 0xE7BB,\n\t34640 - 11904: 0xE7B1,\n\t34641 - 11904: 0xE7AD,\n\t34642 - 11904: 0xE7AA,\n\t34643 - 11904: 0xBDC2,\n\t34644 - 11904: 0xE7A8,\n\t34645 - 11904: 0xBB6B,\n\t34646 - 11904: 0xE7A1,\n\t34647 - 11904: 0xBDC0,\n\t34648 - 11904: 0xE7A7,\n\t34649 - 11904: 0xBDBF,\n\t34650 - 11904: 0xE7AC,\n\t34651 - 11904: 0xE7A9,\n\t34652 - 11904: 0xE7B9,\n\t34653 - 11904: 0xE7B4,\n\t34654 - 11904: 0xE7AE,\n\t34655 - 11904: 0xE7B3,\n\t34656 - 11904: 0xBDBB,\n\t34657 - 11904: 0xE7AB,\n\t34658 - 11904: 0xE7BE,\n\t34659 - 11904: 0xE7A2,\n\t34660 - 11904: 0xE7A3,\n\t34661 - 11904: 0xE7BA,\n\t34662 - 11904: 0xBDBC,\n\t34663 - 11904: 0xE7BF,\n\t34664 - 11904: 0xBDBE,\n\t34665 - 11904: 0xE7C0,\n\t34666 - 11904: 0xE7B0,\n\t34667 - 11904: 0xE3D8,\n\t34668 - 11904: 0xE7B6,\n\t34669 - 11904: 0xE7AF,\n\t34670 - 11904: 0xE7B8,\n\t34671 - 11904: 0xE7B5,\n\t34672 - 11904: 0x9DD5,\n\t34673 - 11904: 0x8FB0,\n\t34675 - 11904: 0xE7A6,\n\t34676 - 11904: 0xBDB9,\n\t34677 - 11904: 0xE7BD,\n\t34678 - 11904: 0xBDBA,\n\t34679 - 11904: 0xE7A4,\n\t34680 - 11904: 0xBDBD,\n\t34681 - 11904: 0xEB64,\n\t34682 - 11904: 0xE7B7,\n\t34683 - 11904: 0xE7BC,\n\t34685 - 11904: 0xFA7A,\n\t34689 - 11904: 0xEB61,\n\t34690 - 11904: 0xBDB8,\n\t34691 - 11904: 0xBFC0,\n\t34692 - 11904: 0xEB6B,\n\t34693 - 11904: 0xEB67,\n\t34694 - 11904: 0x9E5F,\n\t34695 - 11904: 0xEB65,\n\t34696 - 11904: 0xEB60,\n\t34697 - 11904: 0xEB6F,\n\t34699 - 11904: 0x99CD,\n\t34700 - 11904: 0xA0C9,\n\t34701 - 11904: 0xBFC4,\n\t34703 - 11904: 0xEB5C,\n\t34704 - 11904: 0xEB68,\n\t34705 - 11904: 0xEB69,\n\t34706 - 11904: 0xEB5F,\n\t34707 - 11904: 0xEB5E,\n\t34708 - 11904: 0xEB6C,\n\t34710 - 11904: 0xEB62,\n\t34711 - 11904: 0xEB5D,\n\t34712 - 11904: 0xEB63,\n\t34714 - 11904: 0xEB6E,\n\t34715 - 11904: 0xEB5B,\n\t34716 - 11904: 0xEB6D,\n\t34717 - 11904: 0xEB6A,\n\t34718 - 11904: 0xBFC2,\n\t34719 - 11904: 0xBFC1,\n\t34722 - 11904: 0xBFC3,\n\t34723 - 11904: 0xEB66,\n\t34724 - 11904: 0xF0CB,\n\t34725 - 11904: 0x9ADB,\n\t34729 - 11904: 0xA0C6,\n\t34730 - 11904: 0xEE59,\n\t34731 - 11904: 0xC1B1,\n\t34732 - 11904: 0xEE5D,\n\t34733 - 11904: 0xEE5A,\n\t34734 - 11904: 0xEE61,\n\t34735 - 11904: 0xEE67,\n\t34736 - 11904: 0xEE5C,\n\t34737 - 11904: 0x8FB4,\n\t34738 - 11904: 0xEE70,\n\t34739 - 11904: 0xC1AE,\n\t34740 - 11904: 0xEE6A,\n\t34741 - 11904: 0xEE5F,\n\t34742 - 11904: 0xEE6B,\n\t34743 - 11904: 0xEE66,\n\t34744 - 11904: 0xEE6D,\n\t34745 - 11904: 0xEE5E,\n\t34746 - 11904: 0xC1B3,\n\t34747 - 11904: 0xC1B2,\n\t34748 - 11904: 0xEE60,\n\t34749 - 11904: 0xEE6E,\n\t34750 - 11904: 0xEE58,\n\t34751 - 11904: 0xEE6C,\n\t34752 - 11904: 0xC1AC,\n\t34753 - 11904: 0xA0D7,\n\t34754 - 11904: 0xEE64,\n\t34755 - 11904: 0xEE63,\n\t34756 - 11904: 0xEE68,\n\t34757 - 11904: 0xEE5B,\n\t34758 - 11904: 0xC1B0,\n\t34760 - 11904: 0xC1B4,\n\t34761 - 11904: 0xEE62,\n\t34762 - 11904: 0xEE69,\n\t34763 - 11904: 0xC1B5,\n\t34764 - 11904: 0xEE65,\n\t34766 - 11904: 0xA0C7,\n\t34769 - 11904: 0xC1AD,\n\t34770 - 11904: 0xC1AF,\n\t34771 - 11904: 0xF0C7,\n\t34772 - 11904: 0xF0C5,\n\t34774 - 11904: 0xA043,\n\t34775 - 11904: 0xF0CC,\n\t34776 - 11904: 0xF0C9,\n\t34777 - 11904: 0xF0CD,\n\t34778 - 11904: 0x8FB5,\n\t34779 - 11904: 0xF0BE,\n\t34780 - 11904: 0xF0C6,\n\t34781 - 11904: 0xF0D1,\n\t34782 - 11904: 0xEE6F,\n\t34783 - 11904: 0xF0C2,\n\t34784 - 11904: 0xC2CF,\n\t34785 - 11904: 0xE7A5,\n\t34786 - 11904: 0xF0BD,\n\t34787 - 11904: 0xF0CA,\n\t34788 - 11904: 0xF0C4,\n\t34789 - 11904: 0xF0C1,\n\t34790 - 11904: 0xF0BC,\n\t34791 - 11904: 0xF0BB,\n\t34792 - 11904: 0xF0D0,\n\t34794 - 11904: 0xF0C0,\n\t34795 - 11904: 0xF0BF,\n\t34796 - 11904: 0xC2CD,\n\t34797 - 11904: 0xF0C8,\n\t34798 - 11904: 0x8FB2,\n\t34799 - 11904: 0xC2CC,\n\t34802 - 11904: 0xC2CE,\n\t34803 - 11904: 0xF0C3,\n\t34804 - 11904: 0xF0CF,\n\t34805 - 11904: 0xA061,\n\t34806 - 11904: 0xF2DE,\n\t34807 - 11904: 0xF2DF,\n\t34809 - 11904: 0xC3C9,\n\t34810 - 11904: 0xF2DC,\n\t34811 - 11904: 0xC3C6,\n\t34812 - 11904: 0xF2E4,\n\t34814 - 11904: 0xC3CA,\n\t34815 - 11904: 0xF2E6,\n\t34816 - 11904: 0xF2DB,\n\t34817 - 11904: 0xF0CE,\n\t34818 - 11904: 0xF2E8,\n\t34819 - 11904: 0xF2DD,\n\t34820 - 11904: 0x9E5E,\n\t34821 - 11904: 0xC3C7,\n\t34822 - 11904: 0xF2E3,\n\t34824 - 11904: 0xF2E5,\n\t34825 - 11904: 0xF2E0,\n\t34826 - 11904: 0xF2E7,\n\t34827 - 11904: 0xF2E2,\n\t34828 - 11904: 0xF2E1,\n\t34829 - 11904: 0xC3C8,\n\t34831 - 11904: 0xA063,\n\t34832 - 11904: 0xF4C5,\n\t34833 - 11904: 0xF4C6,\n\t34835 - 11904: 0xF4C8,\n\t34836 - 11904: 0xC4AE,\n\t34837 - 11904: 0xC4AF,\n\t34838 - 11904: 0xF4C9,\n\t34839 - 11904: 0xF4C7,\n\t34840 - 11904: 0x9FE8,\n\t34841 - 11904: 0xF4C4,\n\t34843 - 11904: 0xF642,\n\t34844 - 11904: 0xF645,\n\t34845 - 11904: 0xF641,\n\t34847 - 11904: 0xC4FA,\n\t34848 - 11904: 0xF643,\n\t34849 - 11904: 0xC4F9,\n\t34850 - 11904: 0xC4F8,\n\t34851 - 11904: 0xC4F7,\n\t34852 - 11904: 0xF644,\n\t34853 - 11904: 0xF751,\n\t34854 - 11904: 0xF74F,\n\t34855 - 11904: 0x9CB2,\n\t34856 - 11904: 0xF74E,\n\t34857 - 11904: 0xF640,\n\t34858 - 11904: 0xF750,\n\t34859 - 11904: 0xF646,\n\t34860 - 11904: 0xF74D,\n\t34861 - 11904: 0x957C,\n\t34862 - 11904: 0xF7F9,\n\t34863 - 11904: 0xF7D7,\n\t34864 - 11904: 0xF7F7,\n\t34865 - 11904: 0xC5DB,\n\t34866 - 11904: 0xF7F8,\n\t34867 - 11904: 0xF7FA,\n\t34869 - 11904: 0xF8BF,\n\t34870 - 11904: 0xC5FA,\n\t34871 - 11904: 0xF8BE,\n\t34872 - 11904: 0xF8BD,\n\t34873 - 11904: 0xC5FB,\n\t34875 - 11904: 0xC65A,\n\t34876 - 11904: 0xF96E,\n\t34877 - 11904: 0xF9A7,\n\t34878 - 11904: 0xF9A6,\n\t34879 - 11904: 0xF9A8,\n\t34880 - 11904: 0xA6E5,\n\t34881 - 11904: 0xD0AA,\n\t34882 - 11904: 0x9FC7,\n\t34883 - 11904: 0xD3CF,\n\t34884 - 11904: 0xD3D0,\n\t34885 - 11904: 0x8FBB,\n\t34886 - 11904: 0x8FBC,\n\t34888 - 11904: 0xDBC0,\n\t34890 - 11904: 0xF647,\n\t34891 - 11904: 0xF8C0,\n\t34892 - 11904: 0xA6E6,\n\t34893 - 11904: 0xAD6C,\n\t34894 - 11904: 0xD0AB,\n\t34895 - 11904: 0x8FEC,\n\t34898 - 11904: 0xD7B1,\n\t34899 - 11904: 0xB34E,\n\t34901 - 11904: 0xDBC2,\n\t34902 - 11904: 0xDBC1,\n\t34903 - 11904: 0xB5F3,\n\t34905 - 11904: 0xB8C5,\n\t34906 - 11904: 0xE7C1,\n\t34907 - 11904: 0xBDC3,\n\t34909 - 11904: 0xBDC4,\n\t34910 - 11904: 0x8FC0,\n\t34912 - 11904: 0x936A,\n\t34913 - 11904: 0xBFC5,\n\t34914 - 11904: 0xC5FC,\n\t34915 - 11904: 0xA6E7,\n\t34916 - 11904: 0x8BE4,\n\t34917 - 11904: 0x9C7C,\n\t34919 - 11904: 0xD0AC,\n\t34920 - 11904: 0xAAED,\n\t34921 - 11904: 0xD0AE,\n\t34922 - 11904: 0xD0AD,\n\t34923 - 11904: 0xAD6D,\n\t34925 - 11904: 0xD3D1,\n\t34926 - 11904: 0x95A1,\n\t34927 - 11904: 0xD3D8,\n\t34928 - 11904: 0xB049,\n\t34929 - 11904: 0xD3D6,\n\t34930 - 11904: 0xD3D4,\n\t34932 - 11904: 0xD3DB,\n\t34933 - 11904: 0xD3D2,\n\t34934 - 11904: 0xD3D3,\n\t34935 - 11904: 0xB04A,\n\t34937 - 11904: 0xB04E,\n\t34940 - 11904: 0xD3DC,\n\t34941 - 11904: 0xB04D,\n\t34942 - 11904: 0xD3DA,\n\t34943 - 11904: 0xD3D7,\n\t34944 - 11904: 0xD3D5,\n\t34945 - 11904: 0xB04B,\n\t34946 - 11904: 0xB04C,\n\t34947 - 11904: 0xD3D9,\n\t34948 - 11904: 0xFEEC,\n\t34951 - 11904: 0x95A3,\n\t34952 - 11904: 0xB350,\n\t34953 - 11904: 0xD7B2,\n\t34955 - 11904: 0xB355,\n\t34956 - 11904: 0xD7C2,\n\t34957 - 11904: 0xB354,\n\t34958 - 11904: 0xD7C4,\n\t34959 - 11904: 0x8C45,\n\t34960 - 11904: 0x8CB8,\n\t34961 - 11904: 0xD7B8,\n\t34962 - 11904: 0xB352,\n\t34963 - 11904: 0xD7C3,\n\t34965 - 11904: 0xD7B3,\n\t34966 - 11904: 0xB353,\n\t34967 - 11904: 0xD7BF,\n\t34968 - 11904: 0xD7BB,\n\t34969 - 11904: 0xD7BD,\n\t34970 - 11904: 0xD7B7,\n\t34971 - 11904: 0xD7BE,\n\t34972 - 11904: 0x8FC1,\n\t34973 - 11904: 0x87B7,\n\t34974 - 11904: 0xB34F,\n\t34975 - 11904: 0xD7BA,\n\t34976 - 11904: 0xA052,\n\t34977 - 11904: 0xD7B9,\n\t34978 - 11904: 0xD7B5,\n\t34980 - 11904: 0xD7C0,\n\t34983 - 11904: 0xD7BC,\n\t34984 - 11904: 0xD7B4,\n\t34986 - 11904: 0xD7B6,\n\t34987 - 11904: 0xB351,\n\t34988 - 11904: 0xD7C1,\n\t34990 - 11904: 0x99D0,\n\t34993 - 11904: 0xB5F6,\n\t34994 - 11904: 0xDBCD,\n\t34996 - 11904: 0x8FC3,\n\t34997 - 11904: 0x8FC4,\n\t34998 - 11904: 0xDBC9,\n\t34999 - 11904: 0xDBCB,\n\t35000 - 11904: 0xDBC6,\n\t35001 - 11904: 0xDBC5,\n\t35002 - 11904: 0xDBC3,\n\t35004 - 11904: 0xDBCA,\n\t35005 - 11904: 0xDBCC,\n\t35006 - 11904: 0xDBC8,\n\t35007 - 11904: 0x95A4,\n\t35008 - 11904: 0xDBC7,\n\t35009 - 11904: 0xB5F4,\n\t35010 - 11904: 0xB5F5,\n\t35013 - 11904: 0x8FC6,\n\t35015 - 11904: 0x9E60,\n\t35017 - 11904: 0xDBCF,\n\t35018 - 11904: 0xB8CD,\n\t35019 - 11904: 0xDFF2,\n\t35020 - 11904: 0xDFF8,\n\t35021 - 11904: 0xDFF3,\n\t35022 - 11904: 0xDFF4,\n\t35023 - 11904: 0xF9D8,\n\t35024 - 11904: 0xDFF9,\n\t35026 - 11904: 0xB8CF,\n\t35028 - 11904: 0xB8C7,\n\t35029 - 11904: 0xB8CE,\n\t35030 - 11904: 0xDFF1,\n\t35031 - 11904: 0xDBC4,\n\t35032 - 11904: 0xB8CA,\n\t35033 - 11904: 0xB8C8,\n\t35034 - 11904: 0xDFF7,\n\t35035 - 11904: 0xDFF6,\n\t35036 - 11904: 0xB8C9,\n\t35037 - 11904: 0xB8CB,\n\t35038 - 11904: 0xDFF5,\n\t35039 - 11904: 0xB8C6,\n\t35041 - 11904: 0xB8CC,\n\t35046 - 11904: 0x95A5,\n\t35047 - 11904: 0xE3F6,\n\t35048 - 11904: 0xBB74,\n\t35051 - 11904: 0xE442,\n\t35052 - 11904: 0xE441,\n\t35054 - 11904: 0xE3FB,\n\t35055 - 11904: 0xBB76,\n\t35056 - 11904: 0xE440,\n\t35057 - 11904: 0xE3F7,\n\t35058 - 11904: 0xE3F8,\n\t35059 - 11904: 0xBB6E,\n\t35060 - 11904: 0xBB70,\n\t35061 - 11904: 0x9CB3,\n\t35062 - 11904: 0xE3FD,\n\t35063 - 11904: 0xE3F5,\n\t35064 - 11904: 0xBB72,\n\t35065 - 11904: 0xBB71,\n\t35066 - 11904: 0xE3F9,\n\t35067 - 11904: 0xE3FE,\n\t35068 - 11904: 0xE3FC,\n\t35069 - 11904: 0xBB73,\n\t35070 - 11904: 0xE3FA,\n\t35071 - 11904: 0x99D1,\n\t35072 - 11904: 0xFEF1,\n\t35073 - 11904: 0xDBCE,\n\t35074 - 11904: 0xBB6F,\n\t35077 - 11904: 0xE7C2,\n\t35078 - 11904: 0xE7C9,\n\t35079 - 11904: 0xBDC6,\n\t35081 - 11904: 0xE7CD,\n\t35082 - 11904: 0xBDCA,\n\t35083 - 11904: 0xE7C5,\n\t35084 - 11904: 0xE7C3,\n\t35086 - 11904: 0xE7CC,\n\t35088 - 11904: 0xBDC5,\n\t35089 - 11904: 0xE7CB,\n\t35090 - 11904: 0xBDC7,\n\t35091 - 11904: 0xBDC8,\n\t35092 - 11904: 0xE7C4,\n\t35093 - 11904: 0xBDC9,\n\t35094 - 11904: 0xE7CA,\n\t35095 - 11904: 0xE7C6,\n\t35096 - 11904: 0xE7C7,\n\t35097 - 11904: 0xE7C8,\n\t35098 - 11904: 0xBB75,\n\t35102 - 11904: 0xEB70,\n\t35103 - 11904: 0xEB7C,\n\t35105 - 11904: 0xBFCA,\n\t35106 - 11904: 0xEB77,\n\t35107 - 11904: 0xEB79,\n\t35108 - 11904: 0x99D2,\n\t35109 - 11904: 0xBFC8,\n\t35110 - 11904: 0xEB71,\n\t35111 - 11904: 0xEB75,\n\t35113 - 11904: 0xEB78,\n\t35114 - 11904: 0xBFC6,\n\t35115 - 11904: 0xBFC9,\n\t35116 - 11904: 0xEB7B,\n\t35117 - 11904: 0xEB73,\n\t35118 - 11904: 0xEB74,\n\t35119 - 11904: 0xEB7A,\n\t35120 - 11904: 0xEB72,\n\t35121 - 11904: 0xEB76,\n\t35122 - 11904: 0xBFC7,\n\t35123 - 11904: 0xEE72,\n\t35125 - 11904: 0xEE71,\n\t35126 - 11904: 0xC1B7,\n\t35127 - 11904: 0xEE77,\n\t35128 - 11904: 0xC1B9,\n\t35131 - 11904: 0xC1B6,\n\t35132 - 11904: 0xEE73,\n\t35133 - 11904: 0xC1BA,\n\t35134 - 11904: 0xEE74,\n\t35137 - 11904: 0xEE75,\n\t35138 - 11904: 0xEE78,\n\t35139 - 11904: 0x9CC2,\n\t35140 - 11904: 0xC1B8,\n\t35142 - 11904: 0xF0D6,\n\t35143 - 11904: 0x99D3,\n\t35145 - 11904: 0xF0D9,\n\t35147 - 11904: 0xF0D3,\n\t35148 - 11904: 0xF0D5,\n\t35149 - 11904: 0x95A7,\n\t35151 - 11904: 0xF0D4,\n\t35152 - 11904: 0xF0D7,\n\t35153 - 11904: 0xF0D8,\n\t35154 - 11904: 0xEE76,\n\t35155 - 11904: 0xF0D2,\n\t35156 - 11904: 0x95A9,\n\t35158 - 11904: 0xC3CD,\n\t35159 - 11904: 0xF2EC,\n\t35160 - 11904: 0xF2EF,\n\t35161 - 11904: 0xF2F1,\n\t35162 - 11904: 0xF2EA,\n\t35163 - 11904: 0xF2EB,\n\t35164 - 11904: 0xF2EE,\n\t35165 - 11904: 0xF2F0,\n\t35166 - 11904: 0xC3CE,\n\t35167 - 11904: 0xC3CC,\n\t35168 - 11904: 0xC3CB,\n\t35169 - 11904: 0xF2ED,\n\t35170 - 11904: 0xF2E9,\n\t35171 - 11904: 0xF4CA,\n\t35172 - 11904: 0xC4B0,\n\t35173 - 11904: 0x95A6,\n\t35174 - 11904: 0xF4CB,\n\t35177 - 11904: 0xF649,\n\t35178 - 11904: 0xC4FB,\n\t35179 - 11904: 0xF64B,\n\t35180 - 11904: 0xC4FC,\n\t35181 - 11904: 0xF648,\n\t35182 - 11904: 0xF64A,\n\t35183 - 11904: 0xC5A8,\n\t35185 - 11904: 0xF752,\n\t35186 - 11904: 0xC5A7,\n\t35187 - 11904: 0xF7FD,\n\t35188 - 11904: 0xF7FC,\n\t35190 - 11904: 0xF7FB,\n\t35191 - 11904: 0x9C5D,\n\t35193 - 11904: 0xF948,\n\t35194 - 11904: 0xF949,\n\t35195 - 11904: 0xF94B,\n\t35196 - 11904: 0xF94A,\n\t35198 - 11904: 0xCA50,\n\t35199 - 11904: 0xA6E8,\n\t35200 - 11904: 0x98E2,\n\t35201 - 11904: 0xAD6E,\n\t35202 - 11904: 0xD7C5,\n\t35203 - 11904: 0xB5F7,\n\t35205 - 11904: 0xDFFA,\n\t35206 - 11904: 0xC2D0,\n\t35207 - 11904: 0x8FC9,\n\t35208 - 11904: 0xF2F2,\n\t35209 - 11904: 0xA0C2,\n\t35210 - 11904: 0x8FCA,\n\t35211 - 11904: 0xA8A3,\n\t35215 - 11904: 0xB357,\n\t35217 - 11904: 0x99D4,\n\t35219 - 11904: 0xB356,\n\t35220 - 11904: 0xA0B9,\n\t35221 - 11904: 0xDBD0,\n\t35222 - 11904: 0xB5F8,\n\t35223 - 11904: 0xDBD2,\n\t35224 - 11904: 0xDBD1,\n\t35227 - 11904: 0xDFFB,\n\t35228 - 11904: 0xB8D0,\n\t35229 - 11904: 0xE443,\n\t35230 - 11904: 0xE446,\n\t35231 - 11904: 0xE445,\n\t35233 - 11904: 0xE444,\n\t35234 - 11904: 0xE7CE,\n\t35235 - 11904: 0xE7D0,\n\t35236 - 11904: 0xE7CF,\n\t35237 - 11904: 0x9B58,\n\t35238 - 11904: 0xBFCC,\n\t35239 - 11904: 0x8FCD,\n\t35241 - 11904: 0xA0D4,\n\t35242 - 11904: 0xBFCB,\n\t35244 - 11904: 0xC1BB,\n\t35245 - 11904: 0xEE79,\n\t35246 - 11904: 0xEE7B,\n\t35247 - 11904: 0xEE7A,\n\t35250 - 11904: 0xC2D1,\n\t35254 - 11904: 0xF2F4,\n\t35255 - 11904: 0xF2F3,\n\t35257 - 11904: 0xF4CC,\n\t35258 - 11904: 0xC4B1,\n\t35260 - 11904: 0x8FCE,\n\t35261 - 11904: 0xC4FD,\n\t35262 - 11904: 0xF754,\n\t35263 - 11904: 0xF753,\n\t35264 - 11904: 0xC65B,\n\t35265 - 11904: 0x8BE5,\n\t35270 - 11904: 0x8979,\n\t35282 - 11904: 0xA8A4,\n\t35283 - 11904: 0xD0AF,\n\t35284 - 11904: 0xAD6F,\n\t35285 - 11904: 0xD7C8,\n\t35286 - 11904: 0xD7C6,\n\t35289 - 11904: 0xD7C7,\n\t35290 - 11904: 0xDBD4,\n\t35291 - 11904: 0xDBD5,\n\t35292 - 11904: 0xE043,\n\t35293 - 11904: 0xDBD3,\n\t35295 - 11904: 0xDFFC,\n\t35296 - 11904: 0xE041,\n\t35297 - 11904: 0xE040,\n\t35298 - 11904: 0xE042,\n\t35299 - 11904: 0xB8D1,\n\t35300 - 11904: 0xDFFE,\n\t35301 - 11904: 0xDFFD,\n\t35302 - 11904: 0xE044,\n\t35303 - 11904: 0x8FD0,\n\t35304 - 11904: 0xE449,\n\t35305 - 11904: 0xE447,\n\t35307 - 11904: 0xE448,\n\t35308 - 11904: 0xE7D3,\n\t35309 - 11904: 0xE7D1,\n\t35312 - 11904: 0xE7D2,\n\t35313 - 11904: 0xEB7D,\n\t35314 - 11904: 0xEE7C,\n\t35315 - 11904: 0xEE7D,\n\t35316 - 11904: 0xC2D2,\n\t35318 - 11904: 0xF2F5,\n\t35319 - 11904: 0xF4CD,\n\t35320 - 11904: 0xC4B2,\n\t35322 - 11904: 0xF64C,\n\t35323 - 11904: 0xF755,\n\t35324 - 11904: 0xC5A9,\n\t35326 - 11904: 0xF7FE,\n\t35327 - 11904: 0xF94C,\n\t35328 - 11904: 0xA8A5,\n\t35330 - 11904: 0xAD71,\n\t35331 - 11904: 0xAD72,\n\t35332 - 11904: 0xD0B0,\n\t35335 - 11904: 0xD0B1,\n\t35336 - 11904: 0xAD70,\n\t35338 - 11904: 0xB054,\n\t35340 - 11904: 0xB052,\n\t35342 - 11904: 0xB051,\n\t35343 - 11904: 0xB058,\n\t35344 - 11904: 0xB050,\n\t35345 - 11904: 0xB059,\n\t35346 - 11904: 0xD3DD,\n\t35347 - 11904: 0xB056,\n\t35349 - 11904: 0xB053,\n\t35350 - 11904: 0xB057,\n\t35351 - 11904: 0xB055,\n\t35352 - 11904: 0xB04F,\n\t35355 - 11904: 0xB35F,\n\t35356 - 11904: 0x95B6,\n\t35357 - 11904: 0xB359,\n\t35358 - 11904: 0xD7CC,\n\t35359 - 11904: 0xB35E,\n\t35362 - 11904: 0xB360,\n\t35363 - 11904: 0xB35A,\n\t35365 - 11904: 0xB35B,\n\t35367 - 11904: 0xD7CA,\n\t35369 - 11904: 0x99D6,\n\t35370 - 11904: 0xB358,\n\t35371 - 11904: 0x95E5,\n\t35372 - 11904: 0xD7CB,\n\t35373 - 11904: 0xB35D,\n\t35376 - 11904: 0xD7C9,\n\t35377 - 11904: 0xB35C,\n\t35380 - 11904: 0xB644,\n\t35382 - 11904: 0xB646,\n\t35384 - 11904: 0x99D7,\n\t35385 - 11904: 0xDBD8,\n\t35386 - 11904: 0xB645,\n\t35387 - 11904: 0xB5F9,\n\t35388 - 11904: 0xB5FD,\n\t35389 - 11904: 0x95B5,\n\t35390 - 11904: 0xB8E4,\n\t35391 - 11904: 0xE049,\n\t35392 - 11904: 0xDBDA,\n\t35393 - 11904: 0xB5FE,\n\t35396 - 11904: 0xDBDD,\n\t35397 - 11904: 0xDBDE,\n\t35398 - 11904: 0xB643,\n\t35400 - 11904: 0xDBE0,\n\t35401 - 11904: 0xA0CA,\n\t35402 - 11904: 0xDBE2,\n\t35404 - 11904: 0xDBE3,\n\t35405 - 11904: 0xDBD7,\n\t35406 - 11904: 0xDBD6,\n\t35407 - 11904: 0xDBE4,\n\t35408 - 11904: 0xB642,\n\t35409 - 11904: 0xDBE1,\n\t35410 - 11904: 0xDBDF,\n\t35412 - 11904: 0xB640,\n\t35413 - 11904: 0xB5FB,\n\t35414 - 11904: 0xB647,\n\t35415 - 11904: 0xDBDB,\n\t35416 - 11904: 0xDBDC,\n\t35417 - 11904: 0xDBD9,\n\t35419 - 11904: 0xB641,\n\t35422 - 11904: 0xB5FC,\n\t35424 - 11904: 0xB5FA,\n\t35425 - 11904: 0xE048,\n\t35426 - 11904: 0xB8DF,\n\t35427 - 11904: 0xB8DA,\n\t35430 - 11904: 0xB8D5,\n\t35431 - 11904: 0x9FFD,\n\t35432 - 11904: 0xB8E5,\n\t35433 - 11904: 0xB8D6,\n\t35435 - 11904: 0xB8D2,\n\t35436 - 11904: 0xB8E1,\n\t35437 - 11904: 0xB8DE,\n\t35438 - 11904: 0xB8E0,\n\t35440 - 11904: 0xB8D7,\n\t35441 - 11904: 0xB8DC,\n\t35442 - 11904: 0xB8D3,\n\t35443 - 11904: 0xB8D4,\n\t35444 - 11904: 0xE050,\n\t35445 - 11904: 0xE04D,\n\t35446 - 11904: 0xE045,\n\t35447 - 11904: 0xE04A,\n\t35449 - 11904: 0xB8E2,\n\t35450 - 11904: 0xE051,\n\t35451 - 11904: 0xB8E3,\n\t35452 - 11904: 0xB8D9,\n\t35454 - 11904: 0xA058,\n\t35455 - 11904: 0xE047,\n\t35457 - 11904: 0xE04F,\n\t35458 - 11904: 0xE04B,\n\t35459 - 11904: 0xE04E,\n\t35460 - 11904: 0xE04C,\n\t35461 - 11904: 0xB8DD,\n\t35462 - 11904: 0xE046,\n\t35463 - 11904: 0xB8D8,\n\t35467 - 11904: 0xE44C,\n\t35468 - 11904: 0xBB78,\n\t35469 - 11904: 0xBB7B,\n\t35471 - 11904: 0xE44E,\n\t35472 - 11904: 0x8FD6,\n\t35473 - 11904: 0xBBA5,\n\t35474 - 11904: 0xE44D,\n\t35475 - 11904: 0xBB7D,\n\t35476 - 11904: 0x99D8,\n\t35477 - 11904: 0xBDCF,\n\t35478 - 11904: 0xE44F,\n\t35480 - 11904: 0xBBA4,\n\t35481 - 11904: 0xE44B,\n\t35482 - 11904: 0xBBA6,\n\t35484 - 11904: 0x8FD3,\n\t35486 - 11904: 0xBB79,\n\t35488 - 11904: 0xB8DB,\n\t35489 - 11904: 0xBB7C,\n\t35491 - 11904: 0xBB7A,\n\t35492 - 11904: 0xBB7E,\n\t35493 - 11904: 0xBBA2,\n\t35494 - 11904: 0xBB77,\n\t35495 - 11904: 0xBBA7,\n\t35496 - 11904: 0xBBA3,\n\t35497 - 11904: 0x8FE5,\n\t35498 - 11904: 0xBBA1,\n\t35499 - 11904: 0xE44A,\n\t35503 - 11904: 0x8FE9,\n\t35504 - 11904: 0xBDD6,\n\t35506 - 11904: 0xBDD2,\n\t35508 - 11904: 0x99D9,\n\t35510 - 11904: 0xBDD9,\n\t35512 - 11904: 0xE7D6,\n\t35513 - 11904: 0xBDDA,\n\t35514 - 11904: 0xE7E2,\n\t35515 - 11904: 0xE7DB,\n\t35516 - 11904: 0xBDCB,\n\t35517 - 11904: 0xE7E3,\n\t35518 - 11904: 0xE7DD,\n\t35519 - 11904: 0xBDD5,\n\t35520 - 11904: 0xE7DE,\n\t35522 - 11904: 0xBDD4,\n\t35523 - 11904: 0xE7E1,\n\t35524 - 11904: 0xBDCE,\n\t35525 - 11904: 0xE7DF,\n\t35526 - 11904: 0xE7D5,\n\t35527 - 11904: 0xBDCD,\n\t35528 - 11904: 0xEBAA,\n\t35529 - 11904: 0xBDD3,\n\t35531 - 11904: 0xBDD0,\n\t35532 - 11904: 0x8CF7,\n\t35533 - 11904: 0xBDD8,\n\t35535 - 11904: 0xE7D4,\n\t35537 - 11904: 0xE7D8,\n\t35538 - 11904: 0xBDCC,\n\t35539 - 11904: 0xE7D7,\n\t35540 - 11904: 0xE7D9,\n\t35541 - 11904: 0xE7DA,\n\t35542 - 11904: 0xBDD7,\n\t35543 - 11904: 0xE7DC,\n\t35544 - 11904: 0xE7E0,\n\t35545 - 11904: 0xE7E4,\n\t35546 - 11904: 0x927C,\n\t35547 - 11904: 0xBDDB,\n\t35548 - 11904: 0xBFD2,\n\t35549 - 11904: 0xEBA5,\n\t35550 - 11904: 0xEBAB,\n\t35551 - 11904: 0xEBA8,\n\t35552 - 11904: 0xEB7E,\n\t35553 - 11904: 0xEBAC,\n\t35554 - 11904: 0xEBA1,\n\t35556 - 11904: 0xEBA7,\n\t35558 - 11904: 0xBFCD,\n\t35559 - 11904: 0xBFD3,\n\t35560 - 11904: 0xEBAD,\n\t35562 - 11904: 0x9C45,\n\t35563 - 11904: 0xBFCF,\n\t35565 - 11904: 0xBFD9,\n\t35566 - 11904: 0xBFD4,\n\t35567 - 11904: 0xEBAF,\n\t35568 - 11904: 0xEBA9,\n\t35569 - 11904: 0xBFD0,\n\t35570 - 11904: 0xEBA2,\n\t35571 - 11904: 0xBFDA,\n\t35572 - 11904: 0xEBA3,\n\t35573 - 11904: 0xEBA4,\n\t35574 - 11904: 0xBFDB,\n\t35575 - 11904: 0xBFD8,\n\t35576 - 11904: 0xBDD1,\n\t35577 - 11904: 0x8CE8,\n\t35578 - 11904: 0xBFCE,\n\t35579 - 11904: 0xEBB0,\n\t35580 - 11904: 0xBFDC,\n\t35582 - 11904: 0xBFD5,\n\t35583 - 11904: 0xEBAE,\n\t35584 - 11904: 0xBFD1,\n\t35585 - 11904: 0xBFD6,\n\t35586 - 11904: 0xBFD7,\n\t35588 - 11904: 0xC1C3,\n\t35589 - 11904: 0xEEA4,\n\t35590 - 11904: 0xEEAD,\n\t35591 - 11904: 0xEEAA,\n\t35592 - 11904: 0xEEAC,\n\t35594 - 11904: 0xC1C0,\n\t35595 - 11904: 0xEEA5,\n\t35596 - 11904: 0x8FDE,\n\t35597 - 11904: 0xEEAB,\n\t35598 - 11904: 0xC1BC,\n\t35599 - 11904: 0xEEA7,\n\t35600 - 11904: 0xC1C4,\n\t35601 - 11904: 0xEEA3,\n\t35602 - 11904: 0xEEA8,\n\t35603 - 11904: 0xEEAF,\n\t35604 - 11904: 0xEBA6,\n\t35605 - 11904: 0xEEA9,\n\t35606 - 11904: 0xEEA2,\n\t35607 - 11904: 0xC1BD,\n\t35608 - 11904: 0xEEA1,\n\t35609 - 11904: 0xC1BE,\n\t35610 - 11904: 0xEEB0,\n\t35611 - 11904: 0xC1BF,\n\t35612 - 11904: 0xEEAE,\n\t35613 - 11904: 0xC1C2,\n\t35614 - 11904: 0xEE7E,\n\t35615 - 11904: 0x8FDF,\n\t35616 - 11904: 0xC1C1,\n\t35618 - 11904: 0xEEA6,\n\t35619 - 11904: 0xF0DC,\n\t35620 - 11904: 0xF0EA,\n\t35621 - 11904: 0xF0E5,\n\t35622 - 11904: 0xF0E7,\n\t35623 - 11904: 0xF0DB,\n\t35624 - 11904: 0xC2D3,\n\t35626 - 11904: 0xF0DA,\n\t35627 - 11904: 0xC2D6,\n\t35628 - 11904: 0xC2D5,\n\t35629 - 11904: 0xA04B,\n\t35630 - 11904: 0xF0E9,\n\t35631 - 11904: 0xF0E1,\n\t35632 - 11904: 0xF0DE,\n\t35633 - 11904: 0xF0E4,\n\t35635 - 11904: 0xF0DD,\n\t35637 - 11904: 0xF0DF,\n\t35638 - 11904: 0xF0E8,\n\t35639 - 11904: 0xF0E6,\n\t35641 - 11904: 0xC2D4,\n\t35642 - 11904: 0xF0ED,\n\t35643 - 11904: 0xF0EB,\n\t35644 - 11904: 0xF0E2,\n\t35645 - 11904: 0xF0EC,\n\t35646 - 11904: 0xF0E3,\n\t35647 - 11904: 0x8FE2,\n\t35648 - 11904: 0xF2F9,\n\t35649 - 11904: 0xC3CF,\n\t35650 - 11904: 0xF341,\n\t35651 - 11904: 0xA0CC,\n\t35653 - 11904: 0xF64F,\n\t35654 - 11904: 0xC3D6,\n\t35655 - 11904: 0xF0E0,\n\t35656 - 11904: 0xF2F7,\n\t35657 - 11904: 0xC3D2,\n\t35658 - 11904: 0xF2F8,\n\t35659 - 11904: 0xF2FD,\n\t35660 - 11904: 0x8FE3,\n\t35661 - 11904: 0x8FE4,\n\t35662 - 11904: 0xC3D4,\n\t35663 - 11904: 0xC3D5,\n\t35664 - 11904: 0xF2F6,\n\t35665 - 11904: 0xF340,\n\t35666 - 11904: 0xF342,\n\t35667 - 11904: 0xF2FA,\n\t35668 - 11904: 0xF2FC,\n\t35669 - 11904: 0xF2FE,\n\t35670 - 11904: 0xF2FB,\n\t35671 - 11904: 0xF343,\n\t35672 - 11904: 0xC3D1,\n\t35673 - 11904: 0xC3D7,\n\t35674 - 11904: 0xC3D3,\n\t35676 - 11904: 0xC3D0,\n\t35677 - 11904: 0xF4D0,\n\t35678 - 11904: 0x9BC4,\n\t35679 - 11904: 0xC4B7,\n\t35680 - 11904: 0xF4CE,\n\t35682 - 11904: 0x9BFC,\n\t35683 - 11904: 0xF4D2,\n\t35685 - 11904: 0xF4D3,\n\t35686 - 11904: 0xC4B5,\n\t35687 - 11904: 0xF4D4,\n\t35688 - 11904: 0xF4D1,\n\t35689 - 11904: 0x964C,\n\t35690 - 11904: 0xF4CF,\n\t35691 - 11904: 0xC4B8,\n\t35692 - 11904: 0xC4B4,\n\t35693 - 11904: 0xF4D5,\n\t35695 - 11904: 0xC4B6,\n\t35696 - 11904: 0xC4B3,\n\t35700 - 11904: 0xC4FE,\n\t35703 - 11904: 0xC540,\n\t35704 - 11904: 0xF64E,\n\t35705 - 11904: 0xF64D,\n\t35706 - 11904: 0xF650,\n\t35707 - 11904: 0xF651,\n\t35709 - 11904: 0xC541,\n\t35710 - 11904: 0xF756,\n\t35711 - 11904: 0xF75B,\n\t35712 - 11904: 0xC5AA,\n\t35713 - 11904: 0x9AF6,\n\t35714 - 11904: 0xF758,\n\t35715 - 11904: 0x8CAE,\n\t35716 - 11904: 0xF757,\n\t35717 - 11904: 0xF75A,\n\t35718 - 11904: 0xF759,\n\t35720 - 11904: 0xF843,\n\t35722 - 11904: 0xC5DC,\n\t35723 - 11904: 0xF842,\n\t35724 - 11904: 0xF840,\n\t35726 - 11904: 0xF841,\n\t35727 - 11904: 0x87CB,\n\t35728 - 11904: 0x8FE7,\n\t35730 - 11904: 0xC5FE,\n\t35731 - 11904: 0xC5FD,\n\t35732 - 11904: 0xF8C1,\n\t35733 - 11904: 0xF8C2,\n\t35734 - 11904: 0xC640,\n\t35736 - 11904: 0xF94D,\n\t35737 - 11904: 0xF94E,\n\t35738 - 11904: 0xC667,\n\t35739 - 11904: 0x8FE8,\n\t35740 - 11904: 0xC66D,\n\t35742 - 11904: 0xF9A9,\n\t35743 - 11904: 0xF9C8,\n\t35744 - 11904: 0x8BE7,\n\t35774 - 11904: 0x897A,\n\t35810 - 11904: 0x897B,\n\t35895 - 11904: 0xA8A6,\n\t35897 - 11904: 0xD7CD,\n\t35899 - 11904: 0xD7CE,\n\t35900 - 11904: 0xE052,\n\t35901 - 11904: 0xE450,\n\t35902 - 11904: 0xE7E5,\n\t35903 - 11904: 0xC1C6,\n\t35905 - 11904: 0xC1C5,\n\t35906 - 11904: 0xF0EE,\n\t35907 - 11904: 0xF344,\n\t35909 - 11904: 0xF844,\n\t35910 - 11904: 0xA8A7,\n\t35911 - 11904: 0xD3DE,\n\t35912 - 11904: 0xB05A,\n\t35913 - 11904: 0xB361,\n\t35914 - 11904: 0xE054,\n\t35915 - 11904: 0xE053,\n\t35916 - 11904: 0xBDDC,\n\t35917 - 11904: 0xE7E6,\n\t35918 - 11904: 0xBDDD,\n\t35919 - 11904: 0xEEB1,\n\t35920 - 11904: 0xC2D7,\n\t35921 - 11904: 0x99DA,\n\t35924 - 11904: 0xC676,\n\t35925 - 11904: 0xA8A8,\n\t35926 - 11904: 0xCDCB,\n\t35927 - 11904: 0xD3DF,\n\t35930 - 11904: 0xB362,\n\t35932 - 11904: 0xD7CF,\n\t35933 - 11904: 0xD7D0,\n\t35935 - 11904: 0xDBE5,\n\t35937 - 11904: 0xB648,\n\t35938 - 11904: 0xB8E6,\n\t35940 - 11904: 0xE056,\n\t35941 - 11904: 0xE055,\n\t35942 - 11904: 0xE057,\n\t35944 - 11904: 0xE451,\n\t35945 - 11904: 0xE452,\n\t35946 - 11904: 0xBBA8,\n\t35947 - 11904: 0xBFDD,\n\t35948 - 11904: 0xBDDE,\n\t35949 - 11904: 0xBFDE,\n\t35951 - 11904: 0xEEB5,\n\t35952 - 11904: 0xEEB2,\n\t35953 - 11904: 0xEEB4,\n\t35954 - 11904: 0xEEB3,\n\t35955 - 11904: 0xC1C7,\n\t35957 - 11904: 0xF0EF,\n\t35958 - 11904: 0xF346,\n\t35959 - 11904: 0xF345,\n\t35960 - 11904: 0xCBA4,\n\t35961 - 11904: 0xB05C,\n\t35962 - 11904: 0xB05B,\n\t35963 - 11904: 0xD3E0,\n\t35965 - 11904: 0xD7D1,\n\t35968 - 11904: 0xDBE7,\n\t35969 - 11904: 0xDBE6,\n\t35970 - 11904: 0xB649,\n\t35972 - 11904: 0xE059,\n\t35973 - 11904: 0xE05A,\n\t35974 - 11904: 0xE058,\n\t35977 - 11904: 0xB8E8,\n\t35978 - 11904: 0xB8E7,\n\t35980 - 11904: 0xBBAA,\n\t35981 - 11904: 0xBBA9,\n\t35983 - 11904: 0xE7E7,\n\t35984 - 11904: 0xEBB3,\n\t35985 - 11904: 0xEBB1,\n\t35986 - 11904: 0xEBB2,\n\t35987 - 11904: 0xBFDF,\n\t35988 - 11904: 0xEEB7,\n\t35989 - 11904: 0xEEB6,\n\t35991 - 11904: 0xF0F2,\n\t35992 - 11904: 0xF0F1,\n\t35993 - 11904: 0xF0F0,\n\t35994 - 11904: 0xF347,\n\t35995 - 11904: 0x8FED,\n\t35996 - 11904: 0xF9AA,\n\t35997 - 11904: 0xA8A9,\n\t35998 - 11904: 0xAD73,\n\t35999 - 11904: 0x95C0,\n\t36000 - 11904: 0xAD74,\n\t36001 - 11904: 0xB05D,\n\t36002 - 11904: 0xB05E,\n\t36003 - 11904: 0xD3E2,\n\t36004 - 11904: 0xD3E1,\n\t36005 - 11904: 0xD7D2,\n\t36007 - 11904: 0xB368,\n\t36008 - 11904: 0xB366,\n\t36009 - 11904: 0xB363,\n\t36010 - 11904: 0xB367,\n\t36011 - 11904: 0xB365,\n\t36012 - 11904: 0xB364,\n\t36013 - 11904: 0xA0CB,\n\t36015 - 11904: 0xB64A,\n\t36016 - 11904: 0xDBEA,\n\t36018 - 11904: 0xB8ED,\n\t36019 - 11904: 0xB64C,\n\t36020 - 11904: 0xB651,\n\t36021 - 11904: 0xDBEC,\n\t36022 - 11904: 0xB653,\n\t36023 - 11904: 0xB652,\n\t36024 - 11904: 0xB655,\n\t36025 - 11904: 0xDBEB,\n\t36026 - 11904: 0xDBE8,\n\t36027 - 11904: 0xB64F,\n\t36028 - 11904: 0xB64B,\n\t36029 - 11904: 0xB64D,\n\t36030 - 11904: 0xDBE9,\n\t36031 - 11904: 0xB654,\n\t36032 - 11904: 0xB650,\n\t36033 - 11904: 0xB64E,\n\t36034 - 11904: 0xB8EF,\n\t36035 - 11904: 0xB8EE,\n\t36036 - 11904: 0xB8EC,\n\t36037 - 11904: 0xB8F0,\n\t36039 - 11904: 0xB8EA,\n\t36040 - 11904: 0xB8EB,\n\t36042 - 11904: 0xB8E9,\n\t36044 - 11904: 0xE05B,\n\t36045 - 11904: 0x9E48,\n\t36047 - 11904: 0xE454,\n\t36049 - 11904: 0xBBAC,\n\t36050 - 11904: 0xBBAD,\n\t36051 - 11904: 0xBBAB,\n\t36052 - 11904: 0x99DB,\n\t36053 - 11904: 0xE453,\n\t36054 - 11904: 0x8FF3,\n\t36055 - 11904: 0xE455,\n\t36057 - 11904: 0xE7EA,\n\t36058 - 11904: 0xE7EC,\n\t36059 - 11904: 0x8FF9,\n\t36060 - 11904: 0xBDE7,\n\t36061 - 11904: 0xE7ED,\n\t36062 - 11904: 0xBDE0,\n\t36063 - 11904: 0xE7E9,\n\t36064 - 11904: 0xBDDF,\n\t36065 - 11904: 0xBDE9,\n\t36066 - 11904: 0xBDE5,\n\t36067 - 11904: 0xBDE6,\n\t36068 - 11904: 0xBDE2,\n\t36069 - 11904: 0xE7E8,\n\t36070 - 11904: 0xBDE1,\n\t36071 - 11904: 0xE7EE,\n\t36072 - 11904: 0xE7EB,\n\t36073 - 11904: 0x95C1,\n\t36074 - 11904: 0xBDE8,\n\t36075 - 11904: 0xA04E,\n\t36076 - 11904: 0xBDE3,\n\t36077 - 11904: 0xBDE4,\n\t36078 - 11904: 0xEBB5,\n\t36080 - 11904: 0xEBB7,\n\t36081 - 11904: 0xEBB6,\n\t36082 - 11904: 0x99DC,\n\t36083 - 11904: 0xEBB8,\n\t36084 - 11904: 0xBFE0,\n\t36085 - 11904: 0xEBB4,\n\t36087 - 11904: 0xA064,\n\t36088 - 11904: 0xC1CB,\n\t36089 - 11904: 0xEEB8,\n\t36090 - 11904: 0xC1C8,\n\t36091 - 11904: 0xC1CC,\n\t36092 - 11904: 0xC1CA,\n\t36093 - 11904: 0xC1C9,\n\t36094 - 11904: 0xF0F3,\n\t36096 - 11904: 0xF0F6,\n\t36098 - 11904: 0xF0F5,\n\t36099 - 11904: 0x8FF7,\n\t36100 - 11904: 0xF0F4,\n\t36101 - 11904: 0xC2D8,\n\t36102 - 11904: 0xF348,\n\t36103 - 11904: 0xF349,\n\t36104 - 11904: 0xC3D8,\n\t36105 - 11904: 0xF34A,\n\t36106 - 11904: 0xC3D9,\n\t36107 - 11904: 0x89B0,\n\t36108 - 11904: 0xA048,\n\t36109 - 11904: 0xC4BA,\n\t36111 - 11904: 0xC4B9,\n\t36112 - 11904: 0xF652,\n\t36113 - 11904: 0x8FFB,\n\t36114 - 11904: 0x8FF6,\n\t36115 - 11904: 0xC542,\n\t36116 - 11904: 0xF653,\n\t36117 - 11904: 0xF75C,\n\t36118 - 11904: 0xC5AB,\n\t36119 - 11904: 0xC5AC,\n\t36120 - 11904: 0x9DDC,\n\t36121 - 11904: 0xF845,\n\t36123 - 11904: 0xC642,\n\t36124 - 11904: 0x99DD,\n\t36125 - 11904: 0x8BE8,\n\t36196 - 11904: 0xA8AA,\n\t36198 - 11904: 0xB36A,\n\t36199 - 11904: 0xB369,\n\t36200 - 11904: 0xE05C,\n\t36201 - 11904: 0xE05D,\n\t36203 - 11904: 0xBBAE,\n\t36204 - 11904: 0xEBB9,\n\t36205 - 11904: 0xBDEA,\n\t36206 - 11904: 0xEBBA,\n\t36207 - 11904: 0xEEB9,\n\t36208 - 11904: 0xA8AB,\n\t36210 - 11904: 0xD0B2,\n\t36211 - 11904: 0xAD76,\n\t36212 - 11904: 0xAD75,\n\t36214 - 11904: 0xD3E3,\n\t36215 - 11904: 0xB05F,\n\t36216 - 11904: 0xD3E4,\n\t36217 - 11904: 0xD7D5,\n\t36218 - 11904: 0x92C1,\n\t36219 - 11904: 0xD7D4,\n\t36221 - 11904: 0xD7D3,\n\t36224 - 11904: 0xDBEE,\n\t36225 - 11904: 0xB658,\n\t36226 - 11904: 0x9FD6,\n\t36228 - 11904: 0xDBED,\n\t36229 - 11904: 0xB657,\n\t36233 - 11904: 0xDBEF,\n\t36234 - 11904: 0xB656,\n\t36236 - 11904: 0xE05F,\n\t36237 - 11904: 0xE062,\n\t36238 - 11904: 0xE060,\n\t36239 - 11904: 0xE061,\n\t36240 - 11904: 0xE065,\n\t36241 - 11904: 0xE05E,\n\t36242 - 11904: 0xE066,\n\t36243 - 11904: 0xE063,\n\t36244 - 11904: 0xE064,\n\t36245 - 11904: 0xBBB0,\n\t36246 - 11904: 0xE456,\n\t36249 - 11904: 0xBBAF,\n\t36251 - 11904: 0xE7F2,\n\t36252 - 11904: 0xE7F0,\n\t36255 - 11904: 0xBDEB,\n\t36256 - 11904: 0xE7EF,\n\t36257 - 11904: 0xE7F1,\n\t36259 - 11904: 0xBDEC,\n\t36261 - 11904: 0xEBBB,\n\t36262 - 11904: 0xA0D2,\n\t36263 - 11904: 0xEBBC,\n\t36264 - 11904: 0xC1CD,\n\t36265 - 11904: 0x9040,\n\t36266 - 11904: 0xF34C,\n\t36267 - 11904: 0xF34E,\n\t36268 - 11904: 0xF34B,\n\t36269 - 11904: 0xF34D,\n\t36270 - 11904: 0xF4D6,\n\t36271 - 11904: 0xF654,\n\t36274 - 11904: 0xF96F,\n\t36275 - 11904: 0xA8AC,\n\t36276 - 11904: 0xAD77,\n\t36277 - 11904: 0xD3E5,\n\t36278 - 11904: 0xD3E7,\n\t36279 - 11904: 0xD3E6,\n\t36281 - 11904: 0xD7D8,\n\t36282 - 11904: 0xB36C,\n\t36284 - 11904: 0xD7D6,\n\t36286 - 11904: 0xB36B,\n\t36287 - 11904: 0xD7D9,\n\t36288 - 11904: 0x8AC4,\n\t36289 - 11904: 0xD7DA,\n\t36290 - 11904: 0xD7D7,\n\t36291 - 11904: 0x99E0,\n\t36293 - 11904: 0xDBFB,\n\t36294 - 11904: 0xB660,\n\t36295 - 11904: 0xDBF3,\n\t36296 - 11904: 0xDBF9,\n\t36299 - 11904: 0xB65B,\n\t36300 - 11904: 0xB65E,\n\t36301 - 11904: 0xDBF2,\n\t36302 - 11904: 0xB659,\n\t36303 - 11904: 0xDBF6,\n\t36304 - 11904: 0xE06C,\n\t36305 - 11904: 0xB65D,\n\t36307 - 11904: 0xDBF1,\n\t36308 - 11904: 0x9FF0,\n\t36309 - 11904: 0xDBF7,\n\t36310 - 11904: 0xDBF4,\n\t36311 - 11904: 0xDBFA,\n\t36312 - 11904: 0xDBF0,\n\t36313 - 11904: 0xDBF8,\n\t36314 - 11904: 0xB65C,\n\t36315 - 11904: 0xB65F,\n\t36316 - 11904: 0xDBF5,\n\t36317 - 11904: 0xB65A,\n\t36319 - 11904: 0xB8F2,\n\t36320 - 11904: 0xE068,\n\t36321 - 11904: 0xB8F1,\n\t36322 - 11904: 0xE06F,\n\t36323 - 11904: 0xE06E,\n\t36324 - 11904: 0xB8F8,\n\t36326 - 11904: 0xB8F9,\n\t36327 - 11904: 0xE070,\n\t36328 - 11904: 0xB8F3,\n\t36329 - 11904: 0xE06D,\n\t36330 - 11904: 0xB8F7,\n\t36331 - 11904: 0xE072,\n\t36332 - 11904: 0xE069,\n\t36334 - 11904: 0xE06B,\n\t36335 - 11904: 0xB8F4,\n\t36336 - 11904: 0xE067,\n\t36337 - 11904: 0xE06A,\n\t36338 - 11904: 0xE071,\n\t36339 - 11904: 0xB8F5,\n\t36340 - 11904: 0xE073,\n\t36346 - 11904: 0xB8F6,\n\t36348 - 11904: 0xBBB1,\n\t36349 - 11904: 0xE45B,\n\t36350 - 11904: 0xE461,\n\t36351 - 11904: 0xE459,\n\t36352 - 11904: 0xE462,\n\t36353 - 11904: 0x9FF3,\n\t36354 - 11904: 0xE458,\n\t36355 - 11904: 0xE45D,\n\t36356 - 11904: 0xE463,\n\t36357 - 11904: 0xE460,\n\t36358 - 11904: 0xE45F,\n\t36359 - 11904: 0xE45E,\n\t36361 - 11904: 0xE457,\n\t36362 - 11904: 0xE45C,\n\t36365 - 11904: 0xE45A,\n\t36366 - 11904: 0x9DBF,\n\t36367 - 11904: 0xBDF1,\n\t36368 - 11904: 0xBDEE,\n\t36369 - 11904: 0xE7FB,\n\t36370 - 11904: 0xE841,\n\t36371 - 11904: 0xE843,\n\t36372 - 11904: 0xE840,\n\t36373 - 11904: 0xE7F8,\n\t36374 - 11904: 0xE7FA,\n\t36375 - 11904: 0xE845,\n\t36376 - 11904: 0xE842,\n\t36377 - 11904: 0xE7FC,\n\t36378 - 11904: 0xE846,\n\t36379 - 11904: 0xE7F9,\n\t36380 - 11904: 0xE844,\n\t36381 - 11904: 0xBDEF,\n\t36382 - 11904: 0xBDF5,\n\t36383 - 11904: 0xBDF3,\n\t36384 - 11904: 0xE7F3,\n\t36385 - 11904: 0xBDF4,\n\t36386 - 11904: 0xBDF0,\n\t36387 - 11904: 0xE7F4,\n\t36388 - 11904: 0xE7F6,\n\t36389 - 11904: 0xE7F5,\n\t36390 - 11904: 0xE7FD,\n\t36391 - 11904: 0xE7FE,\n\t36392 - 11904: 0x9FF6,\n\t36393 - 11904: 0xBDF2,\n\t36394 - 11904: 0x95C8,\n\t36395 - 11904: 0xBDED,\n\t36397 - 11904: 0x9E5A,\n\t36398 - 11904: 0xE7F7,\n\t36400 - 11904: 0xEBC6,\n\t36401 - 11904: 0xBFE2,\n\t36403 - 11904: 0xEBBD,\n\t36404 - 11904: 0xBFE3,\n\t36405 - 11904: 0xBFE6,\n\t36406 - 11904: 0xEBC2,\n\t36408 - 11904: 0xEBBF,\n\t36409 - 11904: 0xBFE5,\n\t36410 - 11904: 0x99E3,\n\t36412 - 11904: 0xEBC3,\n\t36413 - 11904: 0xEBC4,\n\t36414 - 11904: 0xEBBE,\n\t36415 - 11904: 0xEBC7,\n\t36416 - 11904: 0xEBC0,\n\t36417 - 11904: 0xEBC5,\n\t36418 - 11904: 0xBFE4,\n\t36420 - 11904: 0xBFE1,\n\t36421 - 11904: 0xEBC1,\n\t36422 - 11904: 0x8A4A,\n\t36423 - 11904: 0xEEBF,\n\t36424 - 11904: 0xC1D0,\n\t36425 - 11904: 0xC1CE,\n\t36426 - 11904: 0xC1D1,\n\t36427 - 11904: 0xC1CF,\n\t36428 - 11904: 0xEEBE,\n\t36429 - 11904: 0xEEBB,\n\t36430 - 11904: 0xEEBA,\n\t36431 - 11904: 0x9FF1,\n\t36432 - 11904: 0xEEBD,\n\t36435 - 11904: 0xEEBC,\n\t36436 - 11904: 0xF145,\n\t36437 - 11904: 0xC2DE,\n\t36438 - 11904: 0xF0FB,\n\t36439 - 11904: 0xF0FA,\n\t36441 - 11904: 0xC2D9,\n\t36442 - 11904: 0xF141,\n\t36443 - 11904: 0xF140,\n\t36444 - 11904: 0xF0F7,\n\t36445 - 11904: 0xF143,\n\t36446 - 11904: 0xF0FC,\n\t36447 - 11904: 0xC2DD,\n\t36448 - 11904: 0xF0F9,\n\t36449 - 11904: 0xF142,\n\t36450 - 11904: 0xF0F8,\n\t36451 - 11904: 0xC2DA,\n\t36452 - 11904: 0xC2DC,\n\t36453 - 11904: 0xF0FD,\n\t36454 - 11904: 0xC2DB,\n\t36455 - 11904: 0xF0FE,\n\t36456 - 11904: 0x8AA7,\n\t36457 - 11904: 0xF144,\n\t36458 - 11904: 0xF352,\n\t36460 - 11904: 0xC3DE,\n\t36461 - 11904: 0xF34F,\n\t36463 - 11904: 0xF353,\n\t36465 - 11904: 0x99E6,\n\t36466 - 11904: 0xC3DB,\n\t36467 - 11904: 0xF351,\n\t36468 - 11904: 0xC3E0,\n\t36469 - 11904: 0x9FF7,\n\t36470 - 11904: 0xC3DD,\n\t36471 - 11904: 0x9FED,\n\t36472 - 11904: 0xF350,\n\t36474 - 11904: 0xC3DF,\n\t36475 - 11904: 0xF354,\n\t36476 - 11904: 0xC3DA,\n\t36478 - 11904: 0x8A5C,\n\t36480 - 11904: 0x9DAE,\n\t36481 - 11904: 0xC4BC,\n\t36482 - 11904: 0xC4BE,\n\t36484 - 11904: 0xF4D9,\n\t36485 - 11904: 0xC4BD,\n\t36486 - 11904: 0xF4D7,\n\t36487 - 11904: 0xC3DC,\n\t36488 - 11904: 0xF4D8,\n\t36489 - 11904: 0xC4BB,\n\t36490 - 11904: 0xC543,\n\t36491 - 11904: 0xC545,\n\t36492 - 11904: 0xF656,\n\t36493 - 11904: 0xC544,\n\t36494 - 11904: 0xF655,\n\t36496 - 11904: 0xF761,\n\t36497 - 11904: 0xC5AD,\n\t36498 - 11904: 0xF760,\n\t36499 - 11904: 0xC5AE,\n\t36500 - 11904: 0xF75E,\n\t36501 - 11904: 0xF75D,\n\t36502 - 11904: 0xF762,\n\t36503 - 11904: 0xF763,\n\t36504 - 11904: 0xF846,\n\t36506 - 11904: 0xF75F,\n\t36509 - 11904: 0xF8C6,\n\t36510 - 11904: 0xF8C3,\n\t36511 - 11904: 0xF8C4,\n\t36512 - 11904: 0xF8C5,\n\t36513 - 11904: 0xC65C,\n\t36515 - 11904: 0xF951,\n\t36516 - 11904: 0xF950,\n\t36517 - 11904: 0xF94F,\n\t36518 - 11904: 0xF970,\n\t36519 - 11904: 0x95C9,\n\t36520 - 11904: 0xF9BE,\n\t36521 - 11904: 0xF9AB,\n\t36522 - 11904: 0xC66E,\n\t36523 - 11904: 0xA8AD,\n\t36524 - 11904: 0xB060,\n\t36525 - 11904: 0x9048,\n\t36528 - 11904: 0x99E8,\n\t36530 - 11904: 0xB8FA,\n\t36534 - 11904: 0x9049,\n\t36537 - 11904: 0x8CBA,\n\t36538 - 11904: 0xBDF6,\n\t36540 - 11904: 0x90B1,\n\t36541 - 11904: 0xEBC8,\n\t36544 - 11904: 0xC2DF,\n\t36546 - 11904: 0xF355,\n\t36547 - 11904: 0x904A,\n\t36553 - 11904: 0xF9AC,\n\t36554 - 11904: 0xA8AE,\n\t36555 - 11904: 0xAAEE,\n\t36556 - 11904: 0xAD79,\n\t36557 - 11904: 0xAD78,\n\t36558 - 11904: 0x99EA,\n\t36559 - 11904: 0xB063,\n\t36561 - 11904: 0xD3E8,\n\t36562 - 11904: 0xB061,\n\t36563 - 11904: 0xD3E9,\n\t36564 - 11904: 0xB062,\n\t36567 - 11904: 0xD7DF,\n\t36568 - 11904: 0xD7DB,\n\t36570 - 11904: 0x9BD1,\n\t36571 - 11904: 0xB36D,\n\t36572 - 11904: 0xD7DE,\n\t36573 - 11904: 0xD7DD,\n\t36574 - 11904: 0xD7DC,\n\t36575 - 11904: 0xB36E,\n\t36576 - 11904: 0xD7E0,\n\t36577 - 11904: 0xD7E1,\n\t36578 - 11904: 0x99EB,\n\t36580 - 11904: 0x99EC,\n\t36581 - 11904: 0xDC43,\n\t36582 - 11904: 0xDC41,\n\t36583 - 11904: 0xDC45,\n\t36584 - 11904: 0xDC46,\n\t36585 - 11904: 0xDC4C,\n\t36587 - 11904: 0xDC48,\n\t36588 - 11904: 0xDC4A,\n\t36589 - 11904: 0x99ED,\n\t36590 - 11904: 0xDC42,\n\t36591 - 11904: 0xDBFC,\n\t36593 - 11904: 0xDC49,\n\t36594 - 11904: 0x99EE,\n\t36596 - 11904: 0xDC4B,\n\t36597 - 11904: 0xDC44,\n\t36598 - 11904: 0xDC47,\n\t36599 - 11904: 0xDBFD,\n\t36600 - 11904: 0xB662,\n\t36601 - 11904: 0xDC40,\n\t36602 - 11904: 0xDBFE,\n\t36603 - 11904: 0xB661,\n\t36604 - 11904: 0xB663,\n\t36606 - 11904: 0xB8FD,\n\t36607 - 11904: 0xE075,\n\t36608 - 11904: 0xE077,\n\t36609 - 11904: 0xE076,\n\t36610 - 11904: 0xE07B,\n\t36611 - 11904: 0xB8FB,\n\t36613 - 11904: 0xE078,\n\t36614 - 11904: 0xE074,\n\t36615 - 11904: 0xE079,\n\t36616 - 11904: 0xE07A,\n\t36617 - 11904: 0xB8FC,\n\t36618 - 11904: 0xB8FE,\n\t36619 - 11904: 0xE07C,\n\t36621 - 11904: 0xE467,\n\t36622 - 11904: 0xE466,\n\t36624 - 11904: 0xE464,\n\t36625 - 11904: 0xE465,\n\t36626 - 11904: 0xBBB3,\n\t36627 - 11904: 0xBBB5,\n\t36628 - 11904: 0xBBB2,\n\t36629 - 11904: 0xBBB4,\n\t36630 - 11904: 0xE84D,\n\t36631 - 11904: 0xE84E,\n\t36632 - 11904: 0xE849,\n\t36633 - 11904: 0x904C,\n\t36634 - 11904: 0xE84A,\n\t36635 - 11904: 0xBDF8,\n\t36636 - 11904: 0xBDFD,\n\t36637 - 11904: 0xBDF7,\n\t36638 - 11904: 0xBDFE,\n\t36639 - 11904: 0xBDF9,\n\t36640 - 11904: 0xE84B,\n\t36643 - 11904: 0xE84C,\n\t36644 - 11904: 0xE848,\n\t36645 - 11904: 0xBE40,\n\t36646 - 11904: 0xBDFB,\n\t36649 - 11904: 0xBDFA,\n\t36650 - 11904: 0xBDFC,\n\t36652 - 11904: 0xE847,\n\t36653 - 11904: 0x904D,\n\t36654 - 11904: 0xEBCA,\n\t36655 - 11904: 0xBFE8,\n\t36656 - 11904: 0x95CB,\n\t36658 - 11904: 0xEBCC,\n\t36659 - 11904: 0xBFEA,\n\t36660 - 11904: 0xEBCF,\n\t36661 - 11904: 0xEBCB,\n\t36662 - 11904: 0xEBC9,\n\t36663 - 11904: 0xEBCE,\n\t36664 - 11904: 0xBFE9,\n\t36665 - 11904: 0xEBCD,\n\t36667 - 11904: 0xBFE7,\n\t36670 - 11904: 0xC1D3,\n\t36671 - 11904: 0xC1D6,\n\t36672 - 11904: 0xEEC1,\n\t36673 - 11904: 0x97E2,\n\t36674 - 11904: 0xC1D4,\n\t36675 - 11904: 0xEEC0,\n\t36676 - 11904: 0xC1D2,\n\t36677 - 11904: 0xC1D5,\n\t36678 - 11904: 0xF146,\n\t36679 - 11904: 0xF147,\n\t36680 - 11904: 0xF148,\n\t36681 - 11904: 0xC2E0,\n\t36682 - 11904: 0x95CC,\n\t36683 - 11904: 0xF149,\n\t36685 - 11904: 0xC2E1,\n\t36686 - 11904: 0xC3E2,\n\t36687 - 11904: 0xF358,\n\t36688 - 11904: 0xF359,\n\t36689 - 11904: 0xF357,\n\t36690 - 11904: 0xF356,\n\t36691 - 11904: 0xF35A,\n\t36692 - 11904: 0xC3E1,\n\t36693 - 11904: 0xF4DD,\n\t36694 - 11904: 0xF4DB,\n\t36695 - 11904: 0xF4DC,\n\t36696 - 11904: 0xF4DE,\n\t36697 - 11904: 0xF4DA,\n\t36698 - 11904: 0xF4DF,\n\t36699 - 11904: 0xF658,\n\t36700 - 11904: 0x9F78,\n\t36701 - 11904: 0xF659,\n\t36702 - 11904: 0xF657,\n\t36703 - 11904: 0xC546,\n\t36704 - 11904: 0xF764,\n\t36705 - 11904: 0xC5AF,\n\t36706 - 11904: 0xF765,\n\t36707 - 11904: 0xF848,\n\t36708 - 11904: 0xF847,\n\t36710 - 11904: 0x897C,\n\t36711 - 11904: 0x897D,\n\t36718 - 11904: 0x897E,\n\t36755 - 11904: 0x995D,\n\t36763 - 11904: 0xA8AF,\n\t36764 - 11904: 0xB664,\n\t36767 - 11904: 0xB940,\n\t36768 - 11904: 0x9B5A,\n\t36771 - 11904: 0xBBB6,\n\t36773 - 11904: 0x9050,\n\t36774 - 11904: 0xBFEC,\n\t36775 - 11904: 0x8C4F,\n\t36776 - 11904: 0xBFEB,\n\t36781 - 11904: 0xC3E3,\n\t36782 - 11904: 0xC47C,\n\t36783 - 11904: 0xC547,\n\t36784 - 11904: 0xA8B0,\n\t36785 - 11904: 0xB064,\n\t36786 - 11904: 0xB941,\n\t36787 - 11904: 0x9054,\n\t36788 - 11904: 0xF35B,\n\t36789 - 11904: 0xC6D6,\n\t36790 - 11904: 0x9AA8,\n\t36791 - 11904: 0x99EF,\n\t36792 - 11904: 0xFEEB,\n\t36793 - 11904: 0x9DA3,\n\t36794 - 11904: 0x9DA1,\n\t36795 - 11904: 0x9943,\n\t36796 - 11904: 0x9945,\n\t36798 - 11904: 0x9D7D,\n\t36799 - 11904: 0xCBA6,\n\t36801 - 11904: 0x99F0,\n\t36802 - 11904: 0xA8B1,\n\t36804 - 11904: 0xA8B4,\n\t36805 - 11904: 0xA8B3,\n\t36806 - 11904: 0xA8B2,\n\t36809 - 11904: 0xCBA5,\n\t36810 - 11904: 0x99F1,\n\t36811 - 11904: 0xCDCD,\n\t36812 - 11904: 0x99F2,\n\t36813 - 11904: 0xCDCF,\n\t36814 - 11904: 0xAAEF,\n\t36815 - 11904: 0x8CBC,\n\t36816 - 11904: 0x9D60,\n\t36817 - 11904: 0xAAF1,\n\t36818 - 11904: 0xCDCC,\n\t36819 - 11904: 0xCDCE,\n\t36820 - 11904: 0xAAF0,\n\t36821 - 11904: 0xCDD1,\n\t36822 - 11904: 0xCDD0,\n\t36823 - 11904: 0xCDD2,\n\t36826 - 11904: 0xA0A3,\n\t36832 - 11904: 0xD0B6,\n\t36833 - 11904: 0xD0B4,\n\t36834 - 11904: 0xAD7C,\n\t36835 - 11904: 0xD0B3,\n\t36836 - 11904: 0xADA3,\n\t36837 - 11904: 0xAD7E,\n\t36838 - 11904: 0xAD7B,\n\t36840 - 11904: 0xADA4,\n\t36842 - 11904: 0xAD7D,\n\t36843 - 11904: 0xADA2,\n\t36845 - 11904: 0xADA1,\n\t36846 - 11904: 0xD0B5,\n\t36848 - 11904: 0xAD7A,\n\t36852 - 11904: 0xB06A,\n\t36853 - 11904: 0xD3EB,\n\t36854 - 11904: 0xD3F1,\n\t36855 - 11904: 0xB067,\n\t36856 - 11904: 0xB06E,\n\t36857 - 11904: 0x905B,\n\t36858 - 11904: 0xB069,\n\t36859 - 11904: 0xD3EE,\n\t36860 - 11904: 0xD3F0,\n\t36861 - 11904: 0xB06C,\n\t36862 - 11904: 0xD3EA,\n\t36863 - 11904: 0xD3ED,\n\t36864 - 11904: 0xB068,\n\t36865 - 11904: 0xB065,\n\t36866 - 11904: 0xD3EC,\n\t36867 - 11904: 0xB06B,\n\t36868 - 11904: 0xD3EF,\n\t36869 - 11904: 0xB06D,\n\t36870 - 11904: 0xB066,\n\t36872 - 11904: 0x9EDB,\n\t36875 - 11904: 0xD7E3,\n\t36876 - 11904: 0xD7E6,\n\t36877 - 11904: 0xB370,\n\t36879 - 11904: 0xB37A,\n\t36880 - 11904: 0xB376,\n\t36881 - 11904: 0xD7E4,\n\t36882 - 11904: 0x9D79,\n\t36884 - 11904: 0xB37E,\n\t36885 - 11904: 0xB377,\n\t36886 - 11904: 0xB37C,\n\t36887 - 11904: 0xB372,\n\t36889 - 11904: 0xB36F,\n\t36890 - 11904: 0xB371,\n\t36891 - 11904: 0xB37D,\n\t36892 - 11904: 0xD7E5,\n\t36893 - 11904: 0xB375,\n\t36894 - 11904: 0xB378,\n\t36895 - 11904: 0xB374,\n\t36896 - 11904: 0xB379,\n\t36897 - 11904: 0xD7E7,\n\t36898 - 11904: 0xB37B,\n\t36899 - 11904: 0xB373,\n\t36900 - 11904: 0xD7E2,\n\t36909 - 11904: 0xDC4D,\n\t36910 - 11904: 0xB665,\n\t36911 - 11904: 0xDC4F,\n\t36913 - 11904: 0xB667,\n\t36914 - 11904: 0xB669,\n\t36915 - 11904: 0x99F3,\n\t36916 - 11904: 0xDC4E,\n\t36917 - 11904: 0xB666,\n\t36918 - 11904: 0xB66A,\n\t36919 - 11904: 0x9062,\n\t36920 - 11904: 0xB668,\n\t36924 - 11904: 0xB947,\n\t36925 - 11904: 0xE0A3,\n\t36926 - 11904: 0xB94F,\n\t36927 - 11904: 0xE07E,\n\t36929 - 11904: 0xB950,\n\t36930 - 11904: 0xB945,\n\t36932 - 11904: 0xE0A1,\n\t36934 - 11904: 0x87BD,\n\t36935 - 11904: 0xB94A,\n\t36937 - 11904: 0xE0A2,\n\t36938 - 11904: 0xB943,\n\t36939 - 11904: 0xB942,\n\t36940 - 11904: 0x9F55,\n\t36941 - 11904: 0xB94D,\n\t36942 - 11904: 0xB94C,\n\t36943 - 11904: 0xB94B,\n\t36944 - 11904: 0xB949,\n\t36945 - 11904: 0xB94E,\n\t36946 - 11904: 0xE07D,\n\t36947 - 11904: 0xB944,\n\t36948 - 11904: 0xB946,\n\t36949 - 11904: 0xB948,\n\t36950 - 11904: 0x9BF9,\n\t36952 - 11904: 0xBBB8,\n\t36953 - 11904: 0xBBBB,\n\t36955 - 11904: 0xBBBF,\n\t36956 - 11904: 0xBBB9,\n\t36957 - 11904: 0xBBBE,\n\t36958 - 11904: 0xBBBC,\n\t36960 - 11904: 0xBBB7,\n\t36961 - 11904: 0x9065,\n\t36962 - 11904: 0xBBBD,\n\t36963 - 11904: 0xBBBA,\n\t36964 - 11904: 0x96E0,\n\t36967 - 11904: 0xE852,\n\t36968 - 11904: 0xBE43,\n\t36969 - 11904: 0xBE41,\n\t36971 - 11904: 0xE853,\n\t36972 - 11904: 0x98BE,\n\t36973 - 11904: 0xBE44,\n\t36974 - 11904: 0xBE42,\n\t36975 - 11904: 0xE851,\n\t36976 - 11904: 0xE850,\n\t36978 - 11904: 0xBFF0,\n\t36979 - 11904: 0xE84F,\n\t36980 - 11904: 0xBFEE,\n\t36981 - 11904: 0xBFED,\n\t36982 - 11904: 0xEBD0,\n\t36983 - 11904: 0xBE45,\n\t36984 - 11904: 0xBFEF,\n\t36985 - 11904: 0xEBD1,\n\t36986 - 11904: 0xBFF2,\n\t36987 - 11904: 0xEBD2,\n\t36988 - 11904: 0xBFF1,\n\t36989 - 11904: 0xC1D8,\n\t36990 - 11904: 0xEEC3,\n\t36991 - 11904: 0xC1D7,\n\t36992 - 11904: 0xC1DC,\n\t36993 - 11904: 0xC1DA,\n\t36994 - 11904: 0xC1DB,\n\t36995 - 11904: 0xC2E3,\n\t36996 - 11904: 0xC1D9,\n\t36997 - 11904: 0xEEC2,\n\t36998 - 11904: 0xEBD3,\n\t36999 - 11904: 0xC2E2,\n\t37000 - 11904: 0xC2E4,\n\t37002 - 11904: 0xC3E4,\n\t37003 - 11904: 0xC3E5,\n\t37005 - 11904: 0xF4E0,\n\t37007 - 11904: 0xC5DE,\n\t37008 - 11904: 0xC5DD,\n\t37009 - 11904: 0xA8B6,\n\t37012 - 11904: 0xCA55,\n\t37013 - 11904: 0xB06F,\n\t37015 - 11904: 0xCA52,\n\t37016 - 11904: 0xCA53,\n\t37017 - 11904: 0xCA51,\n\t37019 - 11904: 0xCA54,\n\t37022 - 11904: 0xCBAA,\n\t37023 - 11904: 0xCBA7,\n\t37024 - 11904: 0xCBAC,\n\t37025 - 11904: 0xCBA8,\n\t37026 - 11904: 0xA8B7,\n\t37027 - 11904: 0xA8BA,\n\t37029 - 11904: 0xCBA9,\n\t37030 - 11904: 0xA8B9,\n\t37031 - 11904: 0xCBAB,\n\t37032 - 11904: 0x9068,\n\t37034 - 11904: 0xA8B8,\n\t37038 - 11904: 0x906C,\n\t37039 - 11904: 0xCDD5,\n\t37040 - 11904: 0xCDD7,\n\t37041 - 11904: 0xAAF4,\n\t37042 - 11904: 0xCDD3,\n\t37043 - 11904: 0xCDD6,\n\t37044 - 11904: 0xCDD4,\n\t37045 - 11904: 0xAAF2,\n\t37046 - 11904: 0xAAF5,\n\t37048 - 11904: 0xAAF3,\n\t37051 - 11904: 0x95D8,\n\t37053 - 11904: 0xD0B8,\n\t37054 - 11904: 0xD0BC,\n\t37055 - 11904: 0xD0B9,\n\t37057 - 11904: 0xADA7,\n\t37059 - 11904: 0xADA8,\n\t37060 - 11904: 0x906A,\n\t37061 - 11904: 0xD0BB,\n\t37063 - 11904: 0xD0BD,\n\t37064 - 11904: 0xD0BF,\n\t37066 - 11904: 0xADA5,\n\t37067 - 11904: 0xD0BE,\n\t37070 - 11904: 0xADA6,\n\t37076 - 11904: 0xD7EE,\n\t37077 - 11904: 0xD0BA,\n\t37078 - 11904: 0xD3F2,\n\t37079 - 11904: 0xD3FB,\n\t37080 - 11904: 0xD3F9,\n\t37081 - 11904: 0xD3F4,\n\t37082 - 11904: 0xD3F5,\n\t37083 - 11904: 0xD3FA,\n\t37084 - 11904: 0xD3FC,\n\t37085 - 11904: 0xB071,\n\t37087 - 11904: 0xD3F7,\n\t37088 - 11904: 0xD3F3,\n\t37089 - 11904: 0xB070,\n\t37090 - 11904: 0xB072,\n\t37091 - 11904: 0xD3F6,\n\t37092 - 11904: 0xD3FD,\n\t37093 - 11904: 0xD3F8,\n\t37096 - 11904: 0xB3A1,\n\t37097 - 11904: 0xD7F1,\n\t37098 - 11904: 0xD7E9,\n\t37099 - 11904: 0xD7EF,\n\t37100 - 11904: 0xD7F0,\n\t37101 - 11904: 0xB3A2,\n\t37103 - 11904: 0xD7E8,\n\t37104 - 11904: 0xD7EA,\n\t37105 - 11904: 0xD0B7,\n\t37106 - 11904: 0xD7EC,\n\t37107 - 11904: 0xD7ED,\n\t37108 - 11904: 0xD7EB,\n\t37109 - 11904: 0xB66C,\n\t37113 - 11904: 0xDC56,\n\t37114 - 11904: 0xEBD4,\n\t37115 - 11904: 0xDC57,\n\t37116 - 11904: 0xDC54,\n\t37117 - 11904: 0xB3A3,\n\t37118 - 11904: 0xB66E,\n\t37119 - 11904: 0xDC53,\n\t37120 - 11904: 0xDC59,\n\t37121 - 11904: 0xDC58,\n\t37122 - 11904: 0xB66B,\n\t37123 - 11904: 0xDC5C,\n\t37124 - 11904: 0xDC52,\n\t37125 - 11904: 0xDC5B,\n\t37126 - 11904: 0xDC50,\n\t37127 - 11904: 0xDC5A,\n\t37128 - 11904: 0xDC55,\n\t37129 - 11904: 0xB66D,\n\t37131 - 11904: 0xE0AA,\n\t37133 - 11904: 0xE0A5,\n\t37134 - 11904: 0xE0AB,\n\t37135 - 11904: 0xE0A6,\n\t37136 - 11904: 0xE0A4,\n\t37137 - 11904: 0xE0A7,\n\t37138 - 11904: 0xB951,\n\t37140 - 11904: 0xE0A9,\n\t37142 - 11904: 0xE0A8,\n\t37143 - 11904: 0xB952,\n\t37144 - 11904: 0xBBC1,\n\t37145 - 11904: 0xBBC0,\n\t37146 - 11904: 0xE46E,\n\t37147 - 11904: 0xE471,\n\t37148 - 11904: 0xE469,\n\t37149 - 11904: 0xE46D,\n\t37150 - 11904: 0xBBC2,\n\t37151 - 11904: 0xE46C,\n\t37152 - 11904: 0xE46A,\n\t37153 - 11904: 0xE470,\n\t37154 - 11904: 0xE46B,\n\t37155 - 11904: 0xE468,\n\t37156 - 11904: 0xE46F,\n\t37158 - 11904: 0xE859,\n\t37159 - 11904: 0xBE48,\n\t37160 - 11904: 0xF14A,\n\t37161 - 11904: 0xE856,\n\t37162 - 11904: 0xE857,\n\t37163 - 11904: 0xE855,\n\t37164 - 11904: 0xDC51,\n\t37165 - 11904: 0xBE47,\n\t37166 - 11904: 0xE85A,\n\t37167 - 11904: 0xE854,\n\t37168 - 11904: 0xBE46,\n\t37169 - 11904: 0xBE49,\n\t37170 - 11904: 0xE858,\n\t37171 - 11904: 0xEBD5,\n\t37172 - 11904: 0xBFF3,\n\t37173 - 11904: 0xEBD6,\n\t37174 - 11904: 0xEBD7,\n\t37176 - 11904: 0xEEC4,\n\t37177 - 11904: 0xC1DD,\n\t37178 - 11904: 0xF14B,\n\t37179 - 11904: 0xF14C,\n\t37182 - 11904: 0xF14D,\n\t37183 - 11904: 0xF35D,\n\t37184 - 11904: 0xF35C,\n\t37185 - 11904: 0xF4E2,\n\t37187 - 11904: 0xF4E1,\n\t37188 - 11904: 0xF65B,\n\t37189 - 11904: 0xF65C,\n\t37190 - 11904: 0xF65A,\n\t37191 - 11904: 0xF766,\n\t37192 - 11904: 0xC5B0,\n\t37193 - 11904: 0xA8BB,\n\t37194 - 11904: 0xADAA,\n\t37195 - 11904: 0xADA9,\n\t37196 - 11904: 0xB075,\n\t37197 - 11904: 0xB074,\n\t37198 - 11904: 0xD440,\n\t37199 - 11904: 0xD441,\n\t37200 - 11904: 0xD3FE,\n\t37201 - 11904: 0x9FB2,\n\t37202 - 11904: 0xB073,\n\t37203 - 11904: 0xD7F5,\n\t37205 - 11904: 0xD7F6,\n\t37206 - 11904: 0xD7F2,\n\t37207 - 11904: 0xB3A4,\n\t37208 - 11904: 0xD7F3,\n\t37209 - 11904: 0x9FAE,\n\t37210 - 11904: 0xD7F4,\n\t37212 - 11904: 0x9FB0,\n\t37214 - 11904: 0x89AD,\n\t37215 - 11904: 0xDC5F,\n\t37216 - 11904: 0xDC61,\n\t37217 - 11904: 0xDC5D,\n\t37218 - 11904: 0xDC60,\n\t37219 - 11904: 0xB66F,\n\t37220 - 11904: 0xDC5E,\n\t37221 - 11904: 0xB670,\n\t37223 - 11904: 0x906E,\n\t37224 - 11904: 0xDD73,\n\t37225 - 11904: 0xB955,\n\t37226 - 11904: 0xB954,\n\t37228 - 11904: 0xB953,\n\t37230 - 11904: 0xE0AC,\n\t37231 - 11904: 0xE0AD,\n\t37232 - 11904: 0x9E71,\n\t37234 - 11904: 0xE473,\n\t37235 - 11904: 0xE475,\n\t37236 - 11904: 0xBBC6,\n\t37237 - 11904: 0xBBC3,\n\t37238 - 11904: 0x9E4A,\n\t37239 - 11904: 0xBBC5,\n\t37240 - 11904: 0xBBC4,\n\t37241 - 11904: 0xE474,\n\t37242 - 11904: 0xE472,\n\t37244 - 11904: 0x9FDC,\n\t37248 - 11904: 0xE861,\n\t37249 - 11904: 0xE85E,\n\t37250 - 11904: 0xE85F,\n\t37251 - 11904: 0xBE4D,\n\t37252 - 11904: 0xE860,\n\t37253 - 11904: 0xE85B,\n\t37254 - 11904: 0xE85C,\n\t37255 - 11904: 0xBE4A,\n\t37257 - 11904: 0xBE4B,\n\t37258 - 11904: 0xE85D,\n\t37259 - 11904: 0xBE4C,\n\t37260 - 11904: 0x89AB,\n\t37261 - 11904: 0xEBDB,\n\t37262 - 11904: 0x9FB8,\n\t37263 - 11904: 0xEBDC,\n\t37264 - 11904: 0xEBD9,\n\t37265 - 11904: 0xEBDA,\n\t37266 - 11904: 0xBFF4,\n\t37267 - 11904: 0xEBD8,\n\t37273 - 11904: 0xEEC8,\n\t37274 - 11904: 0xEEC5,\n\t37275 - 11904: 0xEEC7,\n\t37276 - 11904: 0xC1E0,\n\t37277 - 11904: 0xEECB,\n\t37278 - 11904: 0xC1DF,\n\t37279 - 11904: 0xEEC9,\n\t37280 - 11904: 0xEECC,\n\t37281 - 11904: 0xEECA,\n\t37282 - 11904: 0xEEC6,\n\t37283 - 11904: 0xC1DE,\n\t37285 - 11904: 0xF14F,\n\t37287 - 11904: 0xF150,\n\t37288 - 11904: 0xF14E,\n\t37289 - 11904: 0x9070,\n\t37290 - 11904: 0xF152,\n\t37291 - 11904: 0xC2E5,\n\t37292 - 11904: 0xC2E6,\n\t37293 - 11904: 0xF35F,\n\t37294 - 11904: 0xC3E7,\n\t37295 - 11904: 0xF151,\n\t37296 - 11904: 0xF35E,\n\t37297 - 11904: 0xC3E6,\n\t37298 - 11904: 0xF4E5,\n\t37299 - 11904: 0xF4E6,\n\t37300 - 11904: 0xC4BF,\n\t37301 - 11904: 0xF4E4,\n\t37302 - 11904: 0x8B63,\n\t37303 - 11904: 0xF4E3,\n\t37305 - 11904: 0xF65D,\n\t37306 - 11904: 0xC548,\n\t37307 - 11904: 0x95DC,\n\t37308 - 11904: 0xF849,\n\t37309 - 11904: 0xF8C8,\n\t37310 - 11904: 0xF8C7,\n\t37312 - 11904: 0xC643,\n\t37313 - 11904: 0xC65D,\n\t37314 - 11904: 0xF8C9,\n\t37315 - 11904: 0xF971,\n\t37316 - 11904: 0x9071,\n\t37317 - 11904: 0xC66F,\n\t37318 - 11904: 0xA8BC,\n\t37319 - 11904: 0xAAF6,\n\t37321 - 11904: 0xB956,\n\t37323 - 11904: 0xC4C0,\n\t37324 - 11904: 0xA8BD,\n\t37325 - 11904: 0xADAB,\n\t37326 - 11904: 0xB3A5,\n\t37327 - 11904: 0xB671,\n\t37328 - 11904: 0xC2E7,\n\t37329 - 11904: 0xAAF7,\n\t37331 - 11904: 0xD0C1,\n\t37332 - 11904: 0xD0C0,\n\t37333 - 11904: 0xD442,\n\t37334 - 11904: 0xFC5E,\n\t37335 - 11904: 0xB078,\n\t37336 - 11904: 0xB076,\n\t37337 - 11904: 0xB07A,\n\t37338 - 11904: 0xD444,\n\t37340 - 11904: 0xB079,\n\t37341 - 11904: 0xB077,\n\t37343 - 11904: 0x8949,\n\t37346 - 11904: 0xD443,\n\t37347 - 11904: 0xB3A8,\n\t37348 - 11904: 0xD7FC,\n\t37349 - 11904: 0x965B,\n\t37350 - 11904: 0xB3A7,\n\t37351 - 11904: 0xB3A9,\n\t37352 - 11904: 0xD842,\n\t37353 - 11904: 0xB3AB,\n\t37354 - 11904: 0xD7FE,\n\t37355 - 11904: 0xD840,\n\t37356 - 11904: 0xD7F7,\n\t37357 - 11904: 0xB3AA,\n\t37358 - 11904: 0xD843,\n\t37361 - 11904: 0xD7F9,\n\t37363 - 11904: 0xD7FA,\n\t37364 - 11904: 0xD7F8,\n\t37365 - 11904: 0xB3A6,\n\t37366 - 11904: 0x8C50,\n\t37367 - 11904: 0xD841,\n\t37368 - 11904: 0xD7FB,\n\t37369 - 11904: 0xD7FD,\n\t37370 - 11904: 0x94A6,\n\t37373 - 11904: 0xDC6D,\n\t37374 - 11904: 0x8FD5,\n\t37375 - 11904: 0xDC6C,\n\t37376 - 11904: 0xDC6A,\n\t37377 - 11904: 0xDC62,\n\t37378 - 11904: 0xDC71,\n\t37379 - 11904: 0xDC65,\n\t37380 - 11904: 0xDC6F,\n\t37381 - 11904: 0xDC76,\n\t37382 - 11904: 0xDC6E,\n\t37383 - 11904: 0xB679,\n\t37384 - 11904: 0x9E73,\n\t37385 - 11904: 0xB675,\n\t37386 - 11904: 0xDC63,\n\t37388 - 11904: 0xDC69,\n\t37389 - 11904: 0xB677,\n\t37390 - 11904: 0x9075,\n\t37391 - 11904: 0xDC68,\n\t37392 - 11904: 0xB678,\n\t37393 - 11904: 0xB67A,\n\t37394 - 11904: 0xDC6B,\n\t37395 - 11904: 0x99F7,\n\t37396 - 11904: 0xB672,\n\t37397 - 11904: 0xB673,\n\t37398 - 11904: 0xDC77,\n\t37399 - 11904: 0xDC75,\n\t37400 - 11904: 0x87B2,\n\t37401 - 11904: 0xDC74,\n\t37402 - 11904: 0xDC66,\n\t37404 - 11904: 0xDC72,\n\t37406 - 11904: 0xB676,\n\t37409 - 11904: 0x8CBF,\n\t37411 - 11904: 0xB674,\n\t37412 - 11904: 0xDC73,\n\t37413 - 11904: 0xDC64,\n\t37414 - 11904: 0xDC67,\n\t37415 - 11904: 0xDC70,\n\t37416 - 11904: 0x99F9,\n\t37418 - 11904: 0x9663,\n\t37419 - 11904: 0x95B9,\n\t37421 - 11904: 0xE4BA,\n\t37422 - 11904: 0xE0B7,\n\t37424 - 11904: 0xE0B0,\n\t37425 - 11904: 0xE0C3,\n\t37426 - 11904: 0xE0CC,\n\t37427 - 11904: 0xE0B3,\n\t37428 - 11904: 0xB961,\n\t37429 - 11904: 0x94D4,\n\t37430 - 11904: 0xE0C0,\n\t37431 - 11904: 0xB957,\n\t37432 - 11904: 0xB959,\n\t37433 - 11904: 0xB965,\n\t37434 - 11904: 0xE0B1,\n\t37436 - 11904: 0xFCFA,\n\t37437 - 11904: 0xB95A,\n\t37438 - 11904: 0xB95C,\n\t37439 - 11904: 0xB966,\n\t37440 - 11904: 0xB95B,\n\t37441 - 11904: 0x9077,\n\t37444 - 11904: 0x90AB,\n\t37445 - 11904: 0xB964,\n\t37446 - 11904: 0xE0B9,\n\t37448 - 11904: 0xE0AE,\n\t37449 - 11904: 0xB962,\n\t37450 - 11904: 0xE0B8,\n\t37451 - 11904: 0xB95E,\n\t37452 - 11904: 0xE0CA,\n\t37453 - 11904: 0xB963,\n\t37454 - 11904: 0xE0C8,\n\t37455 - 11904: 0xE0BC,\n\t37456 - 11904: 0xE0C6,\n\t37457 - 11904: 0xB960,\n\t37458 - 11904: 0xE0AF,\n\t37459 - 11904: 0xE0C9,\n\t37460 - 11904: 0xE0C4,\n\t37461 - 11904: 0x9D4D,\n\t37462 - 11904: 0xE0CB,\n\t37463 - 11904: 0xB958,\n\t37464 - 11904: 0x99FA,\n\t37466 - 11904: 0xB967,\n\t37467 - 11904: 0xB95D,\n\t37469 - 11904: 0x92E3,\n\t37470 - 11904: 0xE0B5,\n\t37471 - 11904: 0x97BB,\n\t37472 - 11904: 0xE0BD,\n\t37473 - 11904: 0xE0C1,\n\t37474 - 11904: 0x9078,\n\t37475 - 11904: 0xE0C5,\n\t37476 - 11904: 0xB95F,\n\t37477 - 11904: 0xE0B4,\n\t37478 - 11904: 0xE0B2,\n\t37479 - 11904: 0xE0BE,\n\t37483 - 11904: 0x99FB,\n\t37484 - 11904: 0xE0BB,\n\t37485 - 11904: 0xE0BA,\n\t37486 - 11904: 0x97E0,\n\t37487 - 11904: 0xE0BF,\n\t37488 - 11904: 0xE0C2,\n\t37490 - 11904: 0xE0C7,\n\t37494 - 11904: 0xE478,\n\t37495 - 11904: 0x96DC,\n\t37496 - 11904: 0xBBC7,\n\t37497 - 11904: 0xE4A4,\n\t37498 - 11904: 0xE47A,\n\t37499 - 11904: 0xBBCC,\n\t37500 - 11904: 0xBBD0,\n\t37501 - 11904: 0xE4AD,\n\t37502 - 11904: 0xE4B5,\n\t37503 - 11904: 0xE4A6,\n\t37504 - 11904: 0xBBC8,\n\t37505 - 11904: 0x9CA8,\n\t37506 - 11904: 0xE4AA,\n\t37507 - 11904: 0xE0B6,\n\t37508 - 11904: 0x9772,\n\t37509 - 11904: 0xBBC9,\n\t37510 - 11904: 0xE4B1,\n\t37511 - 11904: 0xE4B6,\n\t37512 - 11904: 0xE4AE,\n\t37513 - 11904: 0x9440,\n\t37514 - 11904: 0xE4B0,\n\t37515 - 11904: 0xE4B9,\n\t37516 - 11904: 0xE4B2,\n\t37517 - 11904: 0xE47E,\n\t37518 - 11904: 0xE4A9,\n\t37519 - 11904: 0x92F2,\n\t37521 - 11904: 0xBBD1,\n\t37523 - 11904: 0xBBCD,\n\t37524 - 11904: 0xE47C,\n\t37525 - 11904: 0xE4AB,\n\t37526 - 11904: 0xBBCB,\n\t37527 - 11904: 0xE4A5,\n\t37528 - 11904: 0xBBCA,\n\t37529 - 11904: 0xE4B3,\n\t37530 - 11904: 0xE4A2,\n\t37531 - 11904: 0xE479,\n\t37532 - 11904: 0xBBCE,\n\t37533 - 11904: 0xE4B8,\n\t37536 - 11904: 0xE47B,\n\t37537 - 11904: 0xE4AF,\n\t37538 - 11904: 0xE4AC,\n\t37539 - 11904: 0xE4A7,\n\t37540 - 11904: 0xE477,\n\t37541 - 11904: 0xE476,\n\t37542 - 11904: 0xE4A1,\n\t37543 - 11904: 0xE4B4,\n\t37544 - 11904: 0xBBCF,\n\t37545 - 11904: 0xE4B7,\n\t37546 - 11904: 0xE47D,\n\t37547 - 11904: 0xE4A3,\n\t37548 - 11904: 0xBE52,\n\t37550 - 11904: 0x99FD,\n\t37553 - 11904: 0x99FC,\n\t37554 - 11904: 0xBE5A,\n\t37555 - 11904: 0xBE55,\n\t37556 - 11904: 0xE8A4,\n\t37557 - 11904: 0xE8A1,\n\t37558 - 11904: 0xE867,\n\t37559 - 11904: 0xBE50,\n\t37561 - 11904: 0xF9D7,\n\t37562 - 11904: 0x964A,\n\t37563 - 11904: 0xBE4F,\n\t37564 - 11904: 0xBE56,\n\t37566 - 11904: 0x96D8,\n\t37567 - 11904: 0x99FE,\n\t37568 - 11904: 0xE865,\n\t37569 - 11904: 0xBE54,\n\t37570 - 11904: 0xE871,\n\t37571 - 11904: 0xE863,\n\t37572 - 11904: 0xE864,\n\t37573 - 11904: 0xBE4E,\n\t37574 - 11904: 0xE8A3,\n\t37575 - 11904: 0xBE58,\n\t37576 - 11904: 0xE874,\n\t37577 - 11904: 0xE879,\n\t37578 - 11904: 0xE873,\n\t37579 - 11904: 0xEBEE,\n\t37580 - 11904: 0xE86F,\n\t37581 - 11904: 0xE877,\n\t37582 - 11904: 0xE875,\n\t37583 - 11904: 0xE868,\n\t37584 - 11904: 0xE862,\n\t37585 - 11904: 0xE87D,\n\t37586 - 11904: 0xBE57,\n\t37587 - 11904: 0xE87E,\n\t37588 - 11904: 0x904B,\n\t37589 - 11904: 0xE878,\n\t37591 - 11904: 0xE86D,\n\t37592 - 11904: 0xE86B,\n\t37593 - 11904: 0xE866,\n\t37595 - 11904: 0xFA41,\n\t37597 - 11904: 0xE86E,\n\t37598 - 11904: 0xE87B,\n\t37599 - 11904: 0xE86A,\n\t37600 - 11904: 0xE87A,\n\t37601 - 11904: 0xE8A2,\n\t37603 - 11904: 0x9A40,\n\t37604 - 11904: 0xBE53,\n\t37605 - 11904: 0x975B,\n\t37606 - 11904: 0xE876,\n\t37607 - 11904: 0xE87C,\n\t37608 - 11904: 0xE872,\n\t37609 - 11904: 0xE86C,\n\t37610 - 11904: 0xBE51,\n\t37611 - 11904: 0x9A41,\n\t37612 - 11904: 0x91DD,\n\t37614 - 11904: 0xE4A8,\n\t37615 - 11904: 0xE870,\n\t37616 - 11904: 0xBE59,\n\t37617 - 11904: 0xE869,\n\t37618 - 11904: 0x93FC,\n\t37619 - 11904: 0x9A42,\n\t37620 - 11904: 0x9A43,\n\t37622 - 11904: 0x9659,\n\t37623 - 11904: 0xEBF4,\n\t37624 - 11904: 0xBFF7,\n\t37625 - 11904: 0xEBF3,\n\t37626 - 11904: 0xEBF0,\n\t37627 - 11904: 0xEC44,\n\t37628 - 11904: 0xBFFB,\n\t37629 - 11904: 0x9A44,\n\t37630 - 11904: 0xEC41,\n\t37631 - 11904: 0xEBF8,\n\t37632 - 11904: 0xEC43,\n\t37633 - 11904: 0xEBE9,\n\t37634 - 11904: 0xEBF6,\n\t37635 - 11904: 0x9051,\n\t37636 - 11904: 0xBFFD,\n\t37638 - 11904: 0xEBE1,\n\t37639 - 11904: 0x94BF,\n\t37640 - 11904: 0xEBDF,\n\t37641 - 11904: 0xEC42,\n\t37643 - 11904: 0xEC40,\n\t37644 - 11904: 0xEBFE,\n\t37645 - 11904: 0xEBED,\n\t37646 - 11904: 0xEBEC,\n\t37647 - 11904: 0xEBE2,\n\t37648 - 11904: 0xC040,\n\t37650 - 11904: 0xEBE8,\n\t37651 - 11904: 0xEBF2,\n\t37652 - 11904: 0xEBFD,\n\t37653 - 11904: 0xC043,\n\t37654 - 11904: 0xEC45,\n\t37656 - 11904: 0xC1E8,\n\t37657 - 11904: 0xC045,\n\t37658 - 11904: 0xBFFE,\n\t37659 - 11904: 0xEBE6,\n\t37661 - 11904: 0xEBEF,\n\t37662 - 11904: 0xEBDE,\n\t37663 - 11904: 0xEBE0,\n\t37664 - 11904: 0xBFF5,\n\t37665 - 11904: 0xC042,\n\t37666 - 11904: 0xBFFA,\n\t37667 - 11904: 0xEBE7,\n\t37668 - 11904: 0xEBF7,\n\t37669 - 11904: 0xEBF1,\n\t37670 - 11904: 0xC041,\n\t37671 - 11904: 0xEBDD,\n\t37672 - 11904: 0xC1E3,\n\t37673 - 11904: 0xEBF9,\n\t37674 - 11904: 0xEBFC,\n\t37675 - 11904: 0xBFFC,\n\t37676 - 11904: 0x90A2,\n\t37677 - 11904: 0xEBEB,\n\t37678 - 11904: 0xC044,\n\t37679 - 11904: 0xBFF9,\n\t37680 - 11904: 0x9CAB,\n\t37681 - 11904: 0x9776,\n\t37683 - 11904: 0xBFF8,\n\t37684 - 11904: 0xEBF5,\n\t37685 - 11904: 0xEBFB,\n\t37686 - 11904: 0xBFF6,\n\t37688 - 11904: 0xEBE4,\n\t37689 - 11904: 0xEBFA,\n\t37692 - 11904: 0xEBE5,\n\t37696 - 11904: 0xFC55,\n\t37697 - 11904: 0xFE45,\n\t37698 - 11904: 0x94A8,\n\t37699 - 11904: 0x9A45,\n\t37700 - 11904: 0xFA4B,\n\t37701 - 11904: 0x9DE1,\n\t37702 - 11904: 0xEBEA,\n\t37703 - 11904: 0xEED2,\n\t37704 - 11904: 0x96D9,\n\t37705 - 11904: 0xEED7,\n\t37706 - 11904: 0xC1E5,\n\t37707 - 11904: 0xC1E7,\n\t37708 - 11904: 0xEEDD,\n\t37709 - 11904: 0xC1E1,\n\t37710 - 11904: 0xEEEC,\n\t37711 - 11904: 0xEEE3,\n\t37712 - 11904: 0xEED8,\n\t37713 - 11904: 0xEED9,\n\t37714 - 11904: 0xEEE2,\n\t37716 - 11904: 0xC1EE,\n\t37717 - 11904: 0xEEE1,\n\t37718 - 11904: 0xEED1,\n\t37719 - 11904: 0xEEE0,\n\t37720 - 11904: 0xEED4,\n\t37721 - 11904: 0xEEED,\n\t37722 - 11904: 0xC1ED,\n\t37723 - 11904: 0xC1EB,\n\t37724 - 11904: 0xEED5,\n\t37726 - 11904: 0xEEE8,\n\t37727 - 11904: 0x9774,\n\t37728 - 11904: 0xEEDA,\n\t37729 - 11904: 0xEEE7,\n\t37730 - 11904: 0xFDF5,\n\t37731 - 11904: 0xEEE9,\n\t37732 - 11904: 0xEED0,\n\t37733 - 11904: 0xC1E6,\n\t37734 - 11904: 0x92E5,\n\t37735 - 11904: 0xEEEA,\n\t37736 - 11904: 0x9645,\n\t37737 - 11904: 0x91DA,\n\t37738 - 11904: 0xEEDE,\n\t37739 - 11904: 0x90A3,\n\t37740 - 11904: 0xC1EA,\n\t37741 - 11904: 0xEEDB,\n\t37742 - 11904: 0xA05F,\n\t37744 - 11904: 0xC1EC,\n\t37745 - 11904: 0xEEE4,\n\t37747 - 11904: 0x90AF,\n\t37748 - 11904: 0x97BF,\n\t37749 - 11904: 0xC1E4,\n\t37750 - 11904: 0xEED6,\n\t37751 - 11904: 0xEEE5,\n\t37752 - 11904: 0x914C,\n\t37753 - 11904: 0xEEDF,\n\t37754 - 11904: 0xEBE3,\n\t37755 - 11904: 0xEEE6,\n\t37756 - 11904: 0xEED3,\n\t37757 - 11904: 0x967A,\n\t37758 - 11904: 0xC1E9,\n\t37760 - 11904: 0xEEEB,\n\t37761 - 11904: 0x91DE,\n\t37762 - 11904: 0xC1E2,\n\t37763 - 11904: 0xEECE,\n\t37764 - 11904: 0x9A46,\n\t37765 - 11904: 0xFEB0,\n\t37766 - 11904: 0x9779,\n\t37767 - 11904: 0x946C,\n\t37768 - 11904: 0xF160,\n\t37769 - 11904: 0xF159,\n\t37770 - 11904: 0xC2E9,\n\t37772 - 11904: 0xF154,\n\t37773 - 11904: 0xF163,\n\t37774 - 11904: 0xF15B,\n\t37775 - 11904: 0xEEDC,\n\t37776 - 11904: 0x9858,\n\t37777 - 11904: 0xF165,\n\t37778 - 11904: 0xF155,\n\t37780 - 11904: 0xC2E8,\n\t37781 - 11904: 0xF15F,\n\t37782 - 11904: 0xC2EA,\n\t37783 - 11904: 0xC2F2,\n\t37784 - 11904: 0xC2F0,\n\t37785 - 11904: 0xF161,\n\t37786 - 11904: 0xC2F1,\n\t37787 - 11904: 0xF157,\n\t37788 - 11904: 0x9266,\n\t37789 - 11904: 0xF158,\n\t37790 - 11904: 0xF15D,\n\t37791 - 11904: 0xF162,\n\t37792 - 11904: 0x93FB,\n\t37793 - 11904: 0xEECD,\n\t37794 - 11904: 0xC2EB,\n\t37795 - 11904: 0xF16A,\n\t37796 - 11904: 0xF167,\n\t37797 - 11904: 0xF16B,\n\t37798 - 11904: 0xF15E,\n\t37799 - 11904: 0xF15A,\n\t37800 - 11904: 0xF168,\n\t37801 - 11904: 0xF36A,\n\t37802 - 11904: 0xF15C,\n\t37804 - 11904: 0xC2EE,\n\t37805 - 11904: 0x9A47,\n\t37806 - 11904: 0xC2ED,\n\t37807 - 11904: 0xEECF,\n\t37808 - 11904: 0xC2EF,\n\t37809 - 11904: 0xF164,\n\t37810 - 11904: 0xF166,\n\t37811 - 11904: 0xC2EC,\n\t37812 - 11904: 0xF169,\n\t37813 - 11904: 0xF153,\n\t37815 - 11904: 0xF156,\n\t37816 - 11904: 0x9749,\n\t37819 - 11904: 0x9748,\n\t37821 - 11904: 0x934A,\n\t37823 - 11904: 0x9CE2,\n\t37824 - 11904: 0xF373,\n\t37826 - 11904: 0xF363,\n\t37827 - 11904: 0xC3EB,\n\t37828 - 11904: 0xF371,\n\t37830 - 11904: 0x9264,\n\t37831 - 11904: 0xF361,\n\t37832 - 11904: 0xC3EC,\n\t37834 - 11904: 0xF36C,\n\t37835 - 11904: 0x91DF,\n\t37836 - 11904: 0xF368,\n\t37837 - 11904: 0xC3F1,\n\t37838 - 11904: 0xF372,\n\t37839 - 11904: 0xF362,\n\t37840 - 11904: 0xF365,\n\t37841 - 11904: 0xC3E9,\n\t37842 - 11904: 0xF374,\n\t37843 - 11904: 0xFB79,\n\t37844 - 11904: 0xF36D,\n\t37845 - 11904: 0xF370,\n\t37846 - 11904: 0xC3EF,\n\t37847 - 11904: 0xC3F4,\n\t37848 - 11904: 0xC3F2,\n\t37849 - 11904: 0xF369,\n\t37850 - 11904: 0xF364,\n\t37851 - 11904: 0x96D7,\n\t37852 - 11904: 0xC3ED,\n\t37853 - 11904: 0xC3EE,\n\t37854 - 11904: 0xF360,\n\t37855 - 11904: 0xC3EA,\n\t37856 - 11904: 0x9343,\n\t37857 - 11904: 0xC3E8,\n\t37858 - 11904: 0xC3F0,\n\t37859 - 11904: 0xF36F,\n\t37860 - 11904: 0xC3F3,\n\t37862 - 11904: 0xF36B,\n\t37863 - 11904: 0xF375,\n\t37864 - 11904: 0xC3F5,\n\t37868 - 11904: 0xF367,\n\t37870 - 11904: 0xF36E,\n\t37872 - 11904: 0xFDCB,\n\t37873 - 11904: 0xFE7A,\n\t37875 - 11904: 0x91DB,\n\t37876 - 11904: 0x8C6A,\n\t37877 - 11904: 0xF4F3,\n\t37878 - 11904: 0xF542,\n\t37879 - 11904: 0xF4F5,\n\t37880 - 11904: 0xF4FC,\n\t37881 - 11904: 0xF366,\n\t37882 - 11904: 0xF4FA,\n\t37883 - 11904: 0xF4E9,\n\t37884 - 11904: 0xF540,\n\t37885 - 11904: 0xC4C3,\n\t37886 - 11904: 0xF4ED,\n\t37887 - 11904: 0xF4FE,\n\t37888 - 11904: 0xF4F4,\n\t37889 - 11904: 0x97AF,\n\t37891 - 11904: 0xC4C2,\n\t37892 - 11904: 0x95DD,\n\t37894 - 11904: 0xF544,\n\t37895 - 11904: 0xF4F6,\n\t37896 - 11904: 0x9348,\n\t37897 - 11904: 0xF4FB,\n\t37898 - 11904: 0xF4FD,\n\t37899 - 11904: 0xF4E7,\n\t37900 - 11904: 0xF541,\n\t37901 - 11904: 0xF4F2,\n\t37902 - 11904: 0xF4F7,\n\t37903 - 11904: 0xF4EB,\n\t37904 - 11904: 0xF4EF,\n\t37905 - 11904: 0xF543,\n\t37906 - 11904: 0xF4F9,\n\t37907 - 11904: 0xF4E8,\n\t37908 - 11904: 0xF4EC,\n\t37909 - 11904: 0xF4EE,\n\t37910 - 11904: 0xF4F8,\n\t37911 - 11904: 0x9A4B,\n\t37912 - 11904: 0xC4C1,\n\t37913 - 11904: 0xF4F1,\n\t37915 - 11904: 0xFC45,\n\t37917 - 11904: 0x9A4D,\n\t37920 - 11904: 0xF4EA,\n\t37924 - 11904: 0x91BC,\n\t37925 - 11904: 0x90E2,\n\t37926 - 11904: 0x90B4,\n\t37927 - 11904: 0x95E1,\n\t37928 - 11904: 0xF4F0,\n\t37929 - 11904: 0xF661,\n\t37930 - 11904: 0xF666,\n\t37931 - 11904: 0xC54F,\n\t37932 - 11904: 0xF668,\n\t37933 - 11904: 0x9A4E,\n\t37934 - 11904: 0xC549,\n\t37935 - 11904: 0x87AD,\n\t37936 - 11904: 0xF664,\n\t37937 - 11904: 0xF66A,\n\t37938 - 11904: 0xC54E,\n\t37939 - 11904: 0xC54A,\n\t37941 - 11904: 0xC54B,\n\t37942 - 11904: 0xF660,\n\t37943 - 11904: 0xF667,\n\t37944 - 11904: 0xC54D,\n\t37945 - 11904: 0xF665,\n\t37946 - 11904: 0xC54C,\n\t37947 - 11904: 0xF65F,\n\t37948 - 11904: 0xF663,\n\t37949 - 11904: 0xF662,\n\t37950 - 11904: 0x9A4F,\n\t37951 - 11904: 0xF65E,\n\t37952 - 11904: 0xF669,\n\t37954 - 11904: 0xFE40,\n\t37955 - 11904: 0xFE43,\n\t37956 - 11904: 0xC5B1,\n\t37957 - 11904: 0xF76D,\n\t37958 - 11904: 0xF770,\n\t37959 - 11904: 0xF76C,\n\t37960 - 11904: 0xF76E,\n\t37961 - 11904: 0xF76F,\n\t37962 - 11904: 0xF769,\n\t37963 - 11904: 0xF76A,\n\t37964 - 11904: 0xF767,\n\t37965 - 11904: 0x96DD,\n\t37967 - 11904: 0xF76B,\n\t37968 - 11904: 0xF768,\n\t37969 - 11904: 0xC5B2,\n\t37970 - 11904: 0xC5B3,\n\t37972 - 11904: 0x9A51,\n\t37973 - 11904: 0xF84B,\n\t37975 - 11904: 0xF84D,\n\t37976 - 11904: 0x96A7,\n\t37979 - 11904: 0x90B0,\n\t37981 - 11904: 0xF84C,\n\t37982 - 11904: 0xF84E,\n\t37984 - 11904: 0xC5E0,\n\t37986 - 11904: 0xF84A,\n\t37987 - 11904: 0xC5DF,\n\t37988 - 11904: 0xC5E1,\n\t37989 - 11904: 0x9C4E,\n\t37991 - 11904: 0x9443,\n\t37992 - 11904: 0xF8CB,\n\t37993 - 11904: 0xF8CC,\n\t37994 - 11904: 0xC644,\n\t37995 - 11904: 0xF8CA,\n\t37996 - 11904: 0x8EBA,\n\t37997 - 11904: 0xF953,\n\t37998 - 11904: 0xF952,\n\t37999 - 11904: 0xF954,\n\t38000 - 11904: 0xC65F,\n\t38001 - 11904: 0xF955,\n\t38002 - 11904: 0xC65E,\n\t38003 - 11904: 0xF956,\n\t38004 - 11904: 0xF972,\n\t38005 - 11904: 0xF975,\n\t38006 - 11904: 0xF974,\n\t38007 - 11904: 0xC668,\n\t38008 - 11904: 0xF973,\n\t38009 - 11904: 0x9A52,\n\t38011 - 11904: 0xFCC1,\n\t38012 - 11904: 0xC672,\n\t38013 - 11904: 0xC670,\n\t38014 - 11904: 0xC671,\n\t38015 - 11904: 0xC677,\n\t38016 - 11904: 0xF9C0,\n\t38017 - 11904: 0xF9C1,\n\t38018 - 11904: 0xF9BF,\n\t38019 - 11904: 0xF9C9,\n\t38021 - 11904: 0x8BE9,\n\t38047 - 11904: 0x9CAF,\n\t38050 - 11904: 0x8BFD,\n\t38081 - 11904: 0x9ABC,\n\t38083 - 11904: 0x9AB8,\n\t38108 - 11904: 0x9AAE,\n\t38134 - 11904: 0x9AA7,\n\t38189 - 11904: 0x9A53,\n\t38215 - 11904: 0x9D74,\n\t38263 - 11904: 0xAAF8,\n\t38264 - 11904: 0x8BEA,\n\t38266 - 11904: 0xD844,\n\t38267 - 11904: 0xDC78,\n\t38268 - 11904: 0xE8A5,\n\t38269 - 11904: 0xF376,\n\t38271 - 11904: 0x8BEB,\n\t38272 - 11904: 0xAAF9,\n\t38274 - 11904: 0xADAC,\n\t38275 - 11904: 0xB07B,\n\t38277 - 11904: 0x90B2,\n\t38278 - 11904: 0xD845,\n\t38280 - 11904: 0xD846,\n\t38281 - 11904: 0xB3AC,\n\t38283 - 11904: 0xB67D,\n\t38284 - 11904: 0xDC7A,\n\t38285 - 11904: 0xDC79,\n\t38286 - 11904: 0xB6A3,\n\t38287 - 11904: 0xB67C,\n\t38288 - 11904: 0xDC7B,\n\t38289 - 11904: 0xB67E,\n\t38290 - 11904: 0xB6A2,\n\t38291 - 11904: 0xB6A1,\n\t38292 - 11904: 0xB67B,\n\t38294 - 11904: 0x95E9,\n\t38295 - 11904: 0x95E8,\n\t38296 - 11904: 0xB968,\n\t38297 - 11904: 0x95E6,\n\t38299 - 11904: 0xE0D0,\n\t38300 - 11904: 0xE0CE,\n\t38302 - 11904: 0xE0CF,\n\t38303 - 11904: 0xE0CD,\n\t38304 - 11904: 0x90B5,\n\t38305 - 11904: 0xBBD2,\n\t38306 - 11904: 0x9A54,\n\t38307 - 11904: 0xBBD5,\n\t38308 - 11904: 0xBBD7,\n\t38309 - 11904: 0xBBD6,\n\t38310 - 11904: 0x90B3,\n\t38311 - 11904: 0x95E7,\n\t38312 - 11904: 0xBBD3,\n\t38313 - 11904: 0xBBD4,\n\t38314 - 11904: 0x8B50,\n\t38315 - 11904: 0xE8A7,\n\t38316 - 11904: 0xE8A6,\n\t38317 - 11904: 0xBE5B,\n\t38318 - 11904: 0xE8A8,\n\t38320 - 11904: 0xE8A9,\n\t38321 - 11904: 0xBE5C,\n\t38325 - 11904: 0xEC4D,\n\t38326 - 11904: 0xEC4B,\n\t38327 - 11904: 0xEEF3,\n\t38329 - 11904: 0xEC49,\n\t38330 - 11904: 0xEC4A,\n\t38331 - 11904: 0xC046,\n\t38332 - 11904: 0xEC46,\n\t38333 - 11904: 0xEC4E,\n\t38334 - 11904: 0xEC48,\n\t38335 - 11904: 0xEC4C,\n\t38336 - 11904: 0xEEEF,\n\t38339 - 11904: 0xEEF1,\n\t38341 - 11904: 0xEEF2,\n\t38342 - 11904: 0xC1F3,\n\t38343 - 11904: 0xEEEE,\n\t38344 - 11904: 0xC1F2,\n\t38345 - 11904: 0xEEF0,\n\t38346 - 11904: 0xC1EF,\n\t38347 - 11904: 0xC1F0,\n\t38348 - 11904: 0xC1F1,\n\t38349 - 11904: 0xEC47,\n\t38352 - 11904: 0xC2F5,\n\t38353 - 11904: 0xF16E,\n\t38354 - 11904: 0xF16C,\n\t38355 - 11904: 0xF16D,\n\t38356 - 11904: 0xC2F3,\n\t38357 - 11904: 0xC2F6,\n\t38358 - 11904: 0xC2F4,\n\t38362 - 11904: 0xF377,\n\t38363 - 11904: 0xF378,\n\t38364 - 11904: 0xC3F6,\n\t38366 - 11904: 0xF545,\n\t38367 - 11904: 0xF547,\n\t38368 - 11904: 0xF546,\n\t38369 - 11904: 0xC4C4,\n\t38370 - 11904: 0xC550,\n\t38371 - 11904: 0xF66D,\n\t38372 - 11904: 0xF66C,\n\t38373 - 11904: 0xF66B,\n\t38376 - 11904: 0x8BEC,\n\t38388 - 11904: 0x9A56,\n\t38428 - 11904: 0xAAFA,\n\t38429 - 11904: 0x8BFB,\n\t38430 - 11904: 0xC9AA,\n\t38432 - 11904: 0xCA58,\n\t38433 - 11904: 0xA6E9,\n\t38434 - 11904: 0xCA56,\n\t38435 - 11904: 0xCA59,\n\t38436 - 11904: 0xCA57,\n\t38440 - 11904: 0xCBAE,\n\t38442 - 11904: 0xA8C1,\n\t38444 - 11904: 0xA8C2,\n\t38445 - 11904: 0xCBB0,\n\t38446 - 11904: 0xA8BF,\n\t38447 - 11904: 0xCBAF,\n\t38448 - 11904: 0xCBAD,\n\t38449 - 11904: 0xA8C0,\n\t38450 - 11904: 0xA8BE,\n\t38451 - 11904: 0x9A57,\n\t38456 - 11904: 0xA0AA,\n\t38457 - 11904: 0xCDD8,\n\t38458 - 11904: 0xCDDB,\n\t38459 - 11904: 0xAAFD,\n\t38460 - 11904: 0xCDDA,\n\t38461 - 11904: 0xCDD9,\n\t38463 - 11904: 0xAAFC,\n\t38464 - 11904: 0xAAFB,\n\t38465 - 11904: 0x9FA6,\n\t38466 - 11904: 0xAB40,\n\t38467 - 11904: 0xCDDC,\n\t38468 - 11904: 0xAAFE,\n\t38469 - 11904: 0x99CC,\n\t38474 - 11904: 0xD0C6,\n\t38475 - 11904: 0xADAE,\n\t38476 - 11904: 0xADAF,\n\t38477 - 11904: 0xADB0,\n\t38478 - 11904: 0xD0C7,\n\t38479 - 11904: 0xD0C3,\n\t38480 - 11904: 0xADAD,\n\t38481 - 11904: 0xD0C4,\n\t38483 - 11904: 0xD0C5,\n\t38484 - 11904: 0xD0C2,\n\t38486 - 11904: 0x9C59,\n\t38488 - 11904: 0xB0A4,\n\t38491 - 11904: 0xB0A1,\n\t38492 - 11904: 0xD445,\n\t38493 - 11904: 0xB0A2,\n\t38494 - 11904: 0xB0A5,\n\t38495 - 11904: 0xD446,\n\t38497 - 11904: 0xB07E,\n\t38498 - 11904: 0xB07C,\n\t38499 - 11904: 0xB07D,\n\t38500 - 11904: 0xB0A3,\n\t38505 - 11904: 0x99B5,\n\t38506 - 11904: 0xB3AD,\n\t38507 - 11904: 0xD849,\n\t38508 - 11904: 0xB3B5,\n\t38509 - 11904: 0xD848,\n\t38511 - 11904: 0xD84B,\n\t38512 - 11904: 0xB3B1,\n\t38513 - 11904: 0xD84A,\n\t38514 - 11904: 0xB6AB,\n\t38515 - 11904: 0xB3AF,\n\t38516 - 11904: 0xB3B2,\n\t38517 - 11904: 0xB3AE,\n\t38518 - 11904: 0xB3B3,\n\t38519 - 11904: 0xB3B4,\n\t38520 - 11904: 0xB3B0,\n\t38523 - 11904: 0x90BE,\n\t38524 - 11904: 0xD847,\n\t38525 - 11904: 0xB6A7,\n\t38526 - 11904: 0xDC7D,\n\t38528 - 11904: 0xDCA3,\n\t38529 - 11904: 0x9FAF,\n\t38531 - 11904: 0xDCA2,\n\t38532 - 11904: 0xB6AC,\n\t38533 - 11904: 0xB6A8,\n\t38534 - 11904: 0xB6A9,\n\t38535 - 11904: 0xDC7C,\n\t38536 - 11904: 0xDC7E,\n\t38537 - 11904: 0xDCA1,\n\t38538 - 11904: 0xB6A4,\n\t38539 - 11904: 0xB6A6,\n\t38541 - 11904: 0xB6AA,\n\t38542 - 11904: 0xB6A5,\n\t38543 - 11904: 0x95F2,\n\t38545 - 11904: 0xE0D3,\n\t38546 - 11904: 0xE0D1,\n\t38547 - 11904: 0xE0D2,\n\t38548 - 11904: 0xB96A,\n\t38549 - 11904: 0xB96B,\n\t38550 - 11904: 0x90BF,\n\t38551 - 11904: 0xE0D4,\n\t38552 - 11904: 0xB969,\n\t38553 - 11904: 0xBBD8,\n\t38555 - 11904: 0xBBDA,\n\t38556 - 11904: 0xBBD9,\n\t38558 - 11904: 0xE4BB,\n\t38561 - 11904: 0xE4BC,\n\t38562 - 11904: 0xE8AB,\n\t38563 - 11904: 0x90C1,\n\t38564 - 11904: 0xE8AA,\n\t38565 - 11904: 0xFEE4,\n\t38567 - 11904: 0xC047,\n\t38568 - 11904: 0xC048,\n\t38569 - 11904: 0xEC4F,\n\t38570 - 11904: 0xC049,\n\t38572 - 11904: 0xEEF6,\n\t38574 - 11904: 0xEEF4,\n\t38576 - 11904: 0xEEF5,\n\t38577 - 11904: 0xC1F4,\n\t38579 - 11904: 0xF16F,\n\t38580 - 11904: 0xC3F7,\n\t38582 - 11904: 0xC6D7,\n\t38584 - 11904: 0xC1F5,\n\t38585 - 11904: 0xAB41,\n\t38587 - 11904: 0xB0A6,\n\t38588 - 11904: 0xD447,\n\t38589 - 11904: 0x90C7,\n\t38591 - 11904: 0xD84C,\n\t38592 - 11904: 0xB3B6,\n\t38593 - 11904: 0xB6AD,\n\t38594 - 11904: 0xDCA4,\n\t38595 - 11904: 0xDCA6,\n\t38596 - 11904: 0xB6AF,\n\t38597 - 11904: 0xB6AE,\n\t38598 - 11904: 0xB6B0,\n\t38599 - 11904: 0xB6B1,\n\t38600 - 11904: 0xDCA5,\n\t38601 - 11904: 0xB96E,\n\t38602 - 11904: 0xB96F,\n\t38603 - 11904: 0xB96D,\n\t38604 - 11904: 0xBBDB,\n\t38605 - 11904: 0xB96C,\n\t38606 - 11904: 0xE0D5,\n\t38610 - 11904: 0xBBDC,\n\t38611 - 11904: 0xE8AC,\n\t38612 - 11904: 0xEC50,\n\t38613 - 11904: 0xC04A,\n\t38614 - 11904: 0xC1F6,\n\t38615 - 11904: 0xF170,\n\t38616 - 11904: 0xF174,\n\t38617 - 11904: 0xC2F9,\n\t38618 - 11904: 0xF171,\n\t38619 - 11904: 0xC2FA,\n\t38620 - 11904: 0xC2F8,\n\t38621 - 11904: 0xF175,\n\t38622 - 11904: 0xC2FB,\n\t38623 - 11904: 0xF173,\n\t38625 - 11904: 0xF379,\n\t38626 - 11904: 0xC2F7,\n\t38627 - 11904: 0xC3F8,\n\t38629 - 11904: 0xF8CD,\n\t38632 - 11904: 0xAB42,\n\t38633 - 11904: 0xB3B8,\n\t38634 - 11904: 0xB3B7,\n\t38639 - 11904: 0xB6B2,\n\t38640 - 11904: 0xDCA8,\n\t38641 - 11904: 0xDCA7,\n\t38642 - 11904: 0xB6B3,\n\t38644 - 11904: 0x92E4,\n\t38645 - 11904: 0xE0D9,\n\t38646 - 11904: 0xB973,\n\t38647 - 11904: 0xB970,\n\t38648 - 11904: 0xE0D8,\n\t38649 - 11904: 0xB972,\n\t38650 - 11904: 0xE0D6,\n\t38651 - 11904: 0xB971,\n\t38653 - 11904: 0xE0D7,\n\t38655 - 11904: 0xE4BD,\n\t38656 - 11904: 0xBBDD,\n\t38658 - 11904: 0xE8AF,\n\t38659 - 11904: 0x9F52,\n\t38660 - 11904: 0xBE5D,\n\t38661 - 11904: 0xE8AD,\n\t38662 - 11904: 0xBE5E,\n\t38663 - 11904: 0xBE5F,\n\t38664 - 11904: 0xE8AE,\n\t38665 - 11904: 0xBE60,\n\t38667 - 11904: 0xEC51,\n\t38669 - 11904: 0xC04E,\n\t38670 - 11904: 0xC04B,\n\t38671 - 11904: 0xC050,\n\t38672 - 11904: 0xEC53,\n\t38673 - 11904: 0xC04C,\n\t38674 - 11904: 0xEC52,\n\t38675 - 11904: 0xC04F,\n\t38678 - 11904: 0xC04D,\n\t38680 - 11904: 0xEEF9,\n\t38681 - 11904: 0xEEFB,\n\t38683 - 11904: 0x90DB,\n\t38684 - 11904: 0xC1F7,\n\t38685 - 11904: 0xEEFA,\n\t38686 - 11904: 0xC1F8,\n\t38687 - 11904: 0xEEF8,\n\t38688 - 11904: 0xEEF7,\n\t38689 - 11904: 0xA066,\n\t38690 - 11904: 0xF177,\n\t38691 - 11904: 0xF176,\n\t38692 - 11904: 0xC2FC,\n\t38693 - 11904: 0xF178,\n\t38694 - 11904: 0xF37E,\n\t38695 - 11904: 0xC3FA,\n\t38696 - 11904: 0xF37D,\n\t38697 - 11904: 0xF37A,\n\t38698 - 11904: 0xC3F9,\n\t38699 - 11904: 0xF37B,\n\t38700 - 11904: 0xF37C,\n\t38702 - 11904: 0xF548,\n\t38703 - 11904: 0xF549,\n\t38704 - 11904: 0xC4C5,\n\t38705 - 11904: 0x90D2,\n\t38706 - 11904: 0xC553,\n\t38708 - 11904: 0x876B,\n\t38709 - 11904: 0xF66E,\n\t38710 - 11904: 0x90D4,\n\t38712 - 11904: 0xC551,\n\t38713 - 11904: 0xC552,\n\t38714 - 11904: 0xF66F,\n\t38717 - 11904: 0xC5B4,\n\t38718 - 11904: 0xC5B5,\n\t38719 - 11904: 0xF771,\n\t38720 - 11904: 0x9A5B,\n\t38721 - 11904: 0x95FD,\n\t38722 - 11904: 0xC645,\n\t38723 - 11904: 0xF8CF,\n\t38724 - 11904: 0xC647,\n\t38726 - 11904: 0xF8CE,\n\t38727 - 11904: 0xF8D0,\n\t38728 - 11904: 0xC646,\n\t38729 - 11904: 0xF957,\n\t38730 - 11904: 0x87B1,\n\t38731 - 11904: 0xF9AD,\n\t38737 - 11904: 0x8BC4,\n\t38738 - 11904: 0xAB43,\n\t38741 - 11904: 0x8C66,\n\t38742 - 11904: 0xB974,\n\t38743 - 11904: 0x90DE,\n\t38744 - 11904: 0xE4BE,\n\t38746 - 11904: 0xE8B0,\n\t38747 - 11904: 0xC051,\n\t38748 - 11904: 0xC052,\n\t38749 - 11904: 0x9CE4,\n\t38750 - 11904: 0xAB44,\n\t38751 - 11904: 0x90E1,\n\t38752 - 11904: 0xBE61,\n\t38753 - 11904: 0xC3FB,\n\t38754 - 11904: 0xADB1,\n\t38758 - 11904: 0xC053,\n\t38760 - 11904: 0xC5E2,\n\t38761 - 11904: 0xADB2,\n\t38762 - 11904: 0xD84D,\n\t38764 - 11904: 0xDCA9,\n\t38765 - 11904: 0x9E46,\n\t38766 - 11904: 0xDCAB,\n\t38768 - 11904: 0xDCAA,\n\t38769 - 11904: 0x9651,\n\t38770 - 11904: 0xE0DD,\n\t38771 - 11904: 0xE0DA,\n\t38772 - 11904: 0xB975,\n\t38774 - 11904: 0xB976,\n\t38775 - 11904: 0xE0DB,\n\t38776 - 11904: 0xE0DC,\n\t38778 - 11904: 0xE4C0,\n\t38779 - 11904: 0xE4C5,\n\t38780 - 11904: 0xBBDE,\n\t38781 - 11904: 0xE4BF,\n\t38782 - 11904: 0xE4C1,\n\t38783 - 11904: 0xE4C8,\n\t38784 - 11904: 0xE4C3,\n\t38785 - 11904: 0xE4C7,\n\t38786 - 11904: 0xE4C4,\n\t38787 - 11904: 0xE4C2,\n\t38788 - 11904: 0xE4C6,\n\t38789 - 11904: 0xBBDF,\n\t38791 - 11904: 0xFB58,\n\t38792 - 11904: 0xE8B3,\n\t38793 - 11904: 0x90E6,\n\t38794 - 11904: 0xE8B1,\n\t38795 - 11904: 0xBE63,\n\t38797 - 11904: 0xBE62,\n\t38798 - 11904: 0xE8B2,\n\t38799 - 11904: 0xBE64,\n\t38804 - 11904: 0xEC56,\n\t38807 - 11904: 0xEC55,\n\t38808 - 11904: 0xC054,\n\t38809 - 11904: 0xEC54,\n\t38810 - 11904: 0xEEFC,\n\t38811 - 11904: 0x9650,\n\t38812 - 11904: 0xEEFE,\n\t38813 - 11904: 0xEF41,\n\t38814 - 11904: 0xEF40,\n\t38815 - 11904: 0x90E7,\n\t38816 - 11904: 0xC1F9,\n\t38817 - 11904: 0xEEFD,\n\t38818 - 11904: 0xF1A1,\n\t38819 - 11904: 0xC2FD,\n\t38820 - 11904: 0xF17D,\n\t38821 - 11904: 0xF1A2,\n\t38822 - 11904: 0xC2FE,\n\t38824 - 11904: 0xF17B,\n\t38826 - 11904: 0xF17E,\n\t38827 - 11904: 0xF17C,\n\t38828 - 11904: 0xF179,\n\t38829 - 11904: 0xC340,\n\t38830 - 11904: 0xF17A,\n\t38833 - 11904: 0x90E8,\n\t38834 - 11904: 0x9A5D,\n\t38835 - 11904: 0xF3A1,\n\t38836 - 11904: 0x9F7A,\n\t38838 - 11904: 0xF3A3,\n\t38839 - 11904: 0xF3A2,\n\t38840 - 11904: 0x9B5C,\n\t38841 - 11904: 0xF54A,\n\t38842 - 11904: 0x9F7C,\n\t38843 - 11904: 0xF54B,\n\t38845 - 11904: 0xFC52,\n\t38846 - 11904: 0x90E9,\n\t38847 - 11904: 0xF670,\n\t38848 - 11904: 0x90EA,\n\t38849 - 11904: 0xC5B7,\n\t38850 - 11904: 0x9A5E,\n\t38851 - 11904: 0xC5B6,\n\t38852 - 11904: 0xF84F,\n\t38853 - 11904: 0xF850,\n\t38854 - 11904: 0xC648,\n\t38855 - 11904: 0xF8D1,\n\t38856 - 11904: 0x9F76,\n\t38857 - 11904: 0xC669,\n\t38859 - 11904: 0xADB3,\n\t38860 - 11904: 0xB6B4,\n\t38861 - 11904: 0xE4CA,\n\t38862 - 11904: 0xE4C9,\n\t38863 - 11904: 0xE8B5,\n\t38864 - 11904: 0xE8B4,\n\t38866 - 11904: 0x90EB,\n\t38867 - 11904: 0xC1FA,\n\t38868 - 11904: 0xEF43,\n\t38869 - 11904: 0xEF42,\n\t38870 - 11904: 0xF1A5,\n\t38871 - 11904: 0xF1A3,\n\t38872 - 11904: 0xF1A6,\n\t38873 - 11904: 0xF1A4,\n\t38876 - 11904: 0xC3FC,\n\t38877 - 11904: 0xF3A4,\n\t38878 - 11904: 0xF3A5,\n\t38879 - 11904: 0xF3A6,\n\t38880 - 11904: 0x90EC,\n\t38881 - 11904: 0xF671,\n\t38883 - 11904: 0xF772,\n\t38885 - 11904: 0xF8D2,\n\t38886 - 11904: 0x8BEE,\n\t38893 - 11904: 0xADB4,\n\t38894 - 11904: 0x90EE,\n\t38896 - 11904: 0xEC57,\n\t38897 - 11904: 0xEF44,\n\t38898 - 11904: 0x91C6,\n\t38899 - 11904: 0xADB5,\n\t38901 - 11904: 0x90F2,\n\t38902 - 11904: 0xBBE0,\n\t38904 - 11904: 0xEC58,\n\t38905 - 11904: 0xC341,\n\t38906 - 11904: 0xF1A7,\n\t38907 - 11904: 0xC3FD,\n\t38909 - 11904: 0xF54C,\n\t38910 - 11904: 0xF54D,\n\t38911 - 11904: 0xC554,\n\t38912 - 11904: 0xF851,\n\t38913 - 11904: 0xADB6,\n\t38914 - 11904: 0xB3BB,\n\t38915 - 11904: 0xB3BC,\n\t38916 - 11904: 0xD84E,\n\t38917 - 11904: 0xB6B5,\n\t38918 - 11904: 0xB6B6,\n\t38919 - 11904: 0xDCAC,\n\t38920 - 11904: 0xB6B7,\n\t38922 - 11904: 0xB97A,\n\t38924 - 11904: 0xB97C,\n\t38925 - 11904: 0xE0DF,\n\t38926 - 11904: 0xE0E0,\n\t38927 - 11904: 0xE0DE,\n\t38928 - 11904: 0xB977,\n\t38929 - 11904: 0xB978,\n\t38930 - 11904: 0xB97B,\n\t38931 - 11904: 0xB979,\n\t38932 - 11904: 0xFCBC,\n\t38933 - 11904: 0x8A74,\n\t38934 - 11904: 0xE4CB,\n\t38935 - 11904: 0xBBE1,\n\t38936 - 11904: 0xBBE2,\n\t38939 - 11904: 0xE8BC,\n\t38940 - 11904: 0xBE67,\n\t38941 - 11904: 0xE8B7,\n\t38942 - 11904: 0xE8B6,\n\t38943 - 11904: 0x9657,\n\t38944 - 11904: 0xE8BB,\n\t38945 - 11904: 0xBE65,\n\t38947 - 11904: 0x9CEF,\n\t38948 - 11904: 0xC05B,\n\t38950 - 11904: 0xE8B8,\n\t38951 - 11904: 0xE8BD,\n\t38952 - 11904: 0xE8BA,\n\t38953 - 11904: 0xE8B9,\n\t38955 - 11904: 0xBE66,\n\t38957 - 11904: 0xC059,\n\t38958 - 11904: 0x9FDF,\n\t38959 - 11904: 0xEC5A,\n\t38960 - 11904: 0xC055,\n\t38962 - 11904: 0xEC5B,\n\t38963 - 11904: 0x90F7,\n\t38964 - 11904: 0x90F6,\n\t38965 - 11904: 0xEC59,\n\t38967 - 11904: 0xC058,\n\t38968 - 11904: 0xC056,\n\t38969 - 11904: 0xC05A,\n\t38971 - 11904: 0xC057,\n\t38977 - 11904: 0xEF45,\n\t38979 - 11904: 0xEF4A,\n\t38980 - 11904: 0xEF46,\n\t38981 - 11904: 0xEF49,\n\t38982 - 11904: 0xC1FB,\n\t38983 - 11904: 0x9B5E,\n\t38984 - 11904: 0xEDD4,\n\t38985 - 11904: 0xEF48,\n\t38986 - 11904: 0xEF47,\n\t38987 - 11904: 0x90F8,\n\t38988 - 11904: 0xC344,\n\t38989 - 11904: 0xC342,\n\t38990 - 11904: 0xC345,\n\t38991 - 11904: 0xC343,\n\t38992 - 11904: 0xF1A8,\n\t38993 - 11904: 0xF1A9,\n\t38994 - 11904: 0xF1AA,\n\t38995 - 11904: 0xC346,\n\t38998 - 11904: 0x8CFC,\n\t38999 - 11904: 0xF3AA,\n\t39000 - 11904: 0xC440,\n\t39001 - 11904: 0xF3A8,\n\t39003 - 11904: 0xC441,\n\t39004 - 11904: 0xF3A7,\n\t39005 - 11904: 0xF3A9,\n\t39006 - 11904: 0xC3FE,\n\t39007 - 11904: 0xF551,\n\t39008 - 11904: 0xF54E,\n\t39010 - 11904: 0xF54F,\n\t39011 - 11904: 0xF550,\n\t39012 - 11904: 0xF672,\n\t39013 - 11904: 0xC556,\n\t39014 - 11904: 0x90F9,\n\t39015 - 11904: 0xC555,\n\t39016 - 11904: 0x8CC9,\n\t39017 - 11904: 0xF774,\n\t39018 - 11904: 0xF773,\n\t39019 - 11904: 0xC5B8,\n\t39020 - 11904: 0xFA6A,\n\t39023 - 11904: 0xC5E3,\n\t39024 - 11904: 0xC649,\n\t39025 - 11904: 0xC660,\n\t39026 - 11904: 0xF958,\n\t39027 - 11904: 0xF9AE,\n\t39028 - 11904: 0xF9AF,\n\t39029 - 11904: 0x8BEF,\n\t39080 - 11904: 0xADB7,\n\t39081 - 11904: 0xDCAD,\n\t39084 - 11904: 0xE0E1,\n\t39085 - 11904: 0xE4CC,\n\t39086 - 11904: 0xE4CD,\n\t39087 - 11904: 0xBBE3,\n\t39089 - 11904: 0xBBE4,\n\t39090 - 11904: 0xE8BE,\n\t39091 - 11904: 0xBE68,\n\t39092 - 11904: 0x9FE0,\n\t39094 - 11904: 0xC1FC,\n\t39095 - 11904: 0x9142,\n\t39096 - 11904: 0xF1AB,\n\t39097 - 11904: 0x9A62,\n\t39098 - 11904: 0xC347,\n\t39099 - 11904: 0xF3AD,\n\t39100 - 11904: 0xC442,\n\t39101 - 11904: 0xF3AC,\n\t39102 - 11904: 0xF3AE,\n\t39103 - 11904: 0xF3AB,\n\t39104 - 11904: 0xF675,\n\t39105 - 11904: 0xF552,\n\t39106 - 11904: 0xF553,\n\t39107 - 11904: 0x9569,\n\t39108 - 11904: 0xC4C6,\n\t39110 - 11904: 0xF674,\n\t39111 - 11904: 0x9144,\n\t39112 - 11904: 0x9143,\n\t39113 - 11904: 0xF673,\n\t39114 - 11904: 0x9141,\n\t39115 - 11904: 0xF775,\n\t39116 - 11904: 0xF9B0,\n\t39118 - 11904: 0x8BF0,\n\t39131 - 11904: 0xADB8,\n\t39132 - 11904: 0x9660,\n\t39134 - 11904: 0x8BF1,\n\t39135 - 11904: 0xADB9,\n\t39136 - 11904: 0x99F6,\n\t39137 - 11904: 0x9149,\n\t39138 - 11904: 0xB0A7,\n\t39139 - 11904: 0xD448,\n\t39141 - 11904: 0xD84F,\n\t39142 - 11904: 0x914A,\n\t39143 - 11904: 0xB6B8,\n\t39145 - 11904: 0xB6BB,\n\t39146 - 11904: 0xB6B9,\n\t39147 - 11904: 0xDCAE,\n\t39148 - 11904: 0x914B,\n\t39149 - 11904: 0xB6BD,\n\t39151 - 11904: 0xB6BA,\n\t39153 - 11904: 0x9A64,\n\t39154 - 11904: 0xB6BC,\n\t39156 - 11904: 0xB97E,\n\t39157 - 11904: 0x8ABF,\n\t39158 - 11904: 0xE0E2,\n\t39161 - 11904: 0xE0E3,\n\t39162 - 11904: 0xE8C0,\n\t39164 - 11904: 0xB97D,\n\t39165 - 11904: 0xB9A1,\n\t39166 - 11904: 0xB9A2,\n\t39168 - 11904: 0xE4CF,\n\t39170 - 11904: 0xE4CE,\n\t39171 - 11904: 0xBBE5,\n\t39173 - 11904: 0xBBE6,\n\t39175 - 11904: 0xE4D0,\n\t39176 - 11904: 0xE8BF,\n\t39177 - 11904: 0xBBE8,\n\t39178 - 11904: 0xBE69,\n\t39180 - 11904: 0xBBE7,\n\t39182 - 11904: 0x9A66,\n\t39184 - 11904: 0xC05C,\n\t39185 - 11904: 0xE8C1,\n\t39186 - 11904: 0xBE6B,\n\t39187 - 11904: 0xBE6A,\n\t39188 - 11904: 0xE8C2,\n\t39189 - 11904: 0xE8C5,\n\t39190 - 11904: 0xE8C3,\n\t39191 - 11904: 0xE8C4,\n\t39192 - 11904: 0xBE6C,\n\t39193 - 11904: 0x9A67,\n\t39194 - 11904: 0xC061,\n\t39195 - 11904: 0xC05F,\n\t39196 - 11904: 0x9A69,\n\t39198 - 11904: 0xC05E,\n\t39199 - 11904: 0xEC5D,\n\t39201 - 11904: 0xC060,\n\t39204 - 11904: 0xEC5C,\n\t39205 - 11904: 0xEF4B,\n\t39207 - 11904: 0xEC5E,\n\t39208 - 11904: 0xC05D,\n\t39209 - 11904: 0xEC5F,\n\t39210 - 11904: 0xEF4E,\n\t39211 - 11904: 0xEF4C,\n\t39212 - 11904: 0xEF4D,\n\t39213 - 11904: 0xEF52,\n\t39214 - 11904: 0xC34B,\n\t39215 - 11904: 0xEF51,\n\t39216 - 11904: 0xEF54,\n\t39217 - 11904: 0xEF53,\n\t39218 - 11904: 0xEF50,\n\t39219 - 11904: 0xEF4F,\n\t39221 - 11904: 0xC1FD,\n\t39223 - 11904: 0x9A6A,\n\t39224 - 11904: 0x9652,\n\t39225 - 11904: 0x914D,\n\t39226 - 11904: 0xF1AE,\n\t39227 - 11904: 0x9666,\n\t39228 - 11904: 0xF1AD,\n\t39229 - 11904: 0xC34A,\n\t39230 - 11904: 0xC348,\n\t39231 - 11904: 0xC349,\n\t39232 - 11904: 0x9F7B,\n\t39233 - 11904: 0xF1AC,\n\t39234 - 11904: 0x9A6B,\n\t39235 - 11904: 0xF3B1,\n\t39237 - 11904: 0xC443,\n\t39239 - 11904: 0xF3B0,\n\t39240 - 11904: 0xF3AF,\n\t39241 - 11904: 0xC444,\n\t39242 - 11904: 0xA06C,\n\t39243 - 11904: 0xF558,\n\t39244 - 11904: 0xF557,\n\t39245 - 11904: 0x9667,\n\t39246 - 11904: 0xF555,\n\t39248 - 11904: 0xF554,\n\t39249 - 11904: 0xC4C8,\n\t39250 - 11904: 0xC4C7,\n\t39251 - 11904: 0xF559,\n\t39252 - 11904: 0xF776,\n\t39253 - 11904: 0xC5B9,\n\t39254 - 11904: 0xF677,\n\t39255 - 11904: 0xC557,\n\t39256 - 11904: 0xF676,\n\t39257 - 11904: 0xF556,\n\t39259 - 11904: 0xF777,\n\t39260 - 11904: 0xC5E4,\n\t39261 - 11904: 0x9A6C,\n\t39262 - 11904: 0xC661,\n\t39263 - 11904: 0xF959,\n\t39265 - 11904: 0xF9B1,\n\t39266 - 11904: 0x9A6D,\n\t39267 - 11904: 0x8BF2,\n\t39318 - 11904: 0xADBA,\n\t39319 - 11904: 0xD850,\n\t39320 - 11904: 0xEF55,\n\t39321 - 11904: 0xADBB,\n\t39323 - 11904: 0x966A,\n\t39324 - 11904: 0xE4D2,\n\t39325 - 11904: 0xE4D1,\n\t39326 - 11904: 0xEC60,\n\t39329 - 11904: 0xEF57,\n\t39331 - 11904: 0xEF56,\n\t39332 - 11904: 0xFCEA,\n\t39333 - 11904: 0xC34C,\n\t39334 - 11904: 0xF3B2,\n\t39335 - 11904: 0xF3B3,\n\t39336 - 11904: 0xC4C9,\n\t39338 - 11904: 0x966C,\n\t39339 - 11904: 0xF9B2,\n\t39340 - 11904: 0xB0A8,\n\t39341 - 11904: 0xB6BF,\n\t39342 - 11904: 0xB6BE,\n\t39343 - 11904: 0xE0E4,\n\t39344 - 11904: 0xE0E6,\n\t39345 - 11904: 0xB9A4,\n\t39346 - 11904: 0xE0E5,\n\t39347 - 11904: 0xB9A3,\n\t39348 - 11904: 0xB9A5,\n\t39349 - 11904: 0xE0E7,\n\t39352 - 11904: 0x91C4,\n\t39353 - 11904: 0xE4D4,\n\t39354 - 11904: 0xE4D6,\n\t39355 - 11904: 0xE4D5,\n\t39356 - 11904: 0x9677,\n\t39357 - 11904: 0xE4D8,\n\t39361 - 11904: 0xBBE9,\n\t39362 - 11904: 0xE4D7,\n\t39363 - 11904: 0xE4D3,\n\t39364 - 11904: 0x99F4,\n\t39365 - 11904: 0x9A6F,\n\t39367 - 11904: 0xE4D9,\n\t39369 - 11904: 0xE8CC,\n\t39371 - 11904: 0xE8CF,\n\t39372 - 11904: 0xE8D1,\n\t39373 - 11904: 0xE8C7,\n\t39374 - 11904: 0xE8CB,\n\t39375 - 11904: 0xE8C8,\n\t39376 - 11904: 0xBE6E,\n\t39377 - 11904: 0xBE71,\n\t39378 - 11904: 0xBE73,\n\t39379 - 11904: 0xE8C9,\n\t39380 - 11904: 0xE8CA,\n\t39381 - 11904: 0xBE72,\n\t39382 - 11904: 0xE8CD,\n\t39383 - 11904: 0xE8D0,\n\t39384 - 11904: 0xE8CE,\n\t39385 - 11904: 0xBE74,\n\t39386 - 11904: 0x9FAB,\n\t39387 - 11904: 0xBE70,\n\t39388 - 11904: 0xE8C6,\n\t39389 - 11904: 0xBE6D,\n\t39391 - 11904: 0xBE6F,\n\t39392 - 11904: 0x8CBE,\n\t39393 - 11904: 0x8EC1,\n\t39394 - 11904: 0xC063,\n\t39395 - 11904: 0xEC66,\n\t39396 - 11904: 0xEC64,\n\t39397 - 11904: 0xEC63,\n\t39398 - 11904: 0x9555,\n\t39399 - 11904: 0xEC69,\n\t39401 - 11904: 0xEC68,\n\t39402 - 11904: 0xEC67,\n\t39404 - 11904: 0xEC62,\n\t39405 - 11904: 0xC062,\n\t39406 - 11904: 0xEC61,\n\t39408 - 11904: 0xEC65,\n\t39409 - 11904: 0xC064,\n\t39412 - 11904: 0xEF5A,\n\t39413 - 11904: 0x9152,\n\t39414 - 11904: 0xEF5E,\n\t39415 - 11904: 0xEF5B,\n\t39416 - 11904: 0xEF5D,\n\t39417 - 11904: 0xEF5C,\n\t39418 - 11904: 0xEF59,\n\t39419 - 11904: 0xEF5F,\n\t39420 - 11904: 0xEF62,\n\t39421 - 11904: 0xEF60,\n\t39422 - 11904: 0xEF61,\n\t39423 - 11904: 0xC240,\n\t39425 - 11904: 0xC1FE,\n\t39426 - 11904: 0xEF58,\n\t39427 - 11904: 0xEF63,\n\t39428 - 11904: 0xF1B3,\n\t39429 - 11904: 0xF1B6,\n\t39430 - 11904: 0xF1B8,\n\t39431 - 11904: 0xF1B7,\n\t39433 - 11904: 0xF1B1,\n\t39434 - 11904: 0xF1B5,\n\t39435 - 11904: 0xF1B0,\n\t39436 - 11904: 0x9153,\n\t39437 - 11904: 0xF1B2,\n\t39438 - 11904: 0xC34D,\n\t39439 - 11904: 0xF1AF,\n\t39440 - 11904: 0x9155,\n\t39441 - 11904: 0xF1B4,\n\t39444 - 11904: 0xF3C0,\n\t39445 - 11904: 0xF3B5,\n\t39446 - 11904: 0xC445,\n\t39449 - 11904: 0xC446,\n\t39450 - 11904: 0xF3B4,\n\t39451 - 11904: 0xF3B9,\n\t39452 - 11904: 0xF3BF,\n\t39453 - 11904: 0xF3B7,\n\t39454 - 11904: 0xF3BE,\n\t39455 - 11904: 0x955D,\n\t39456 - 11904: 0xF3BB,\n\t39457 - 11904: 0x9671,\n\t39458 - 11904: 0xF3BA,\n\t39459 - 11904: 0xF3BD,\n\t39460 - 11904: 0xF3B8,\n\t39461 - 11904: 0xF3B6,\n\t39462 - 11904: 0x9C6D,\n\t39463 - 11904: 0xF3BC,\n\t39465 - 11904: 0xF560,\n\t39466 - 11904: 0xF55E,\n\t39467 - 11904: 0xC4CA,\n\t39468 - 11904: 0xF55D,\n\t39469 - 11904: 0xF563,\n\t39470 - 11904: 0xF561,\n\t39471 - 11904: 0x9673,\n\t39472 - 11904: 0xC4CB,\n\t39473 - 11904: 0xF55C,\n\t39474 - 11904: 0xF55A,\n\t39476 - 11904: 0xF55B,\n\t39477 - 11904: 0xC4CD,\n\t39478 - 11904: 0xF55F,\n\t39479 - 11904: 0xC4CC,\n\t39480 - 11904: 0xF562,\n\t39481 - 11904: 0xF678,\n\t39482 - 11904: 0xF67E,\n\t39483 - 11904: 0x9154,\n\t39484 - 11904: 0x9A71,\n\t39485 - 11904: 0xF679,\n\t39486 - 11904: 0xC55B,\n\t39487 - 11904: 0xF6A1,\n\t39488 - 11904: 0xC55A,\n\t39489 - 11904: 0xF67D,\n\t39490 - 11904: 0xF67C,\n\t39491 - 11904: 0xC559,\n\t39492 - 11904: 0xF67B,\n\t39493 - 11904: 0xC558,\n\t39494 - 11904: 0xF67A,\n\t39496 - 11904: 0xF77D,\n\t39497 - 11904: 0xF7A1,\n\t39498 - 11904: 0xF77E,\n\t39500 - 11904: 0xF77B,\n\t39501 - 11904: 0xC5BB,\n\t39502 - 11904: 0xF778,\n\t39503 - 11904: 0xF77C,\n\t39504 - 11904: 0xF7A3,\n\t39506 - 11904: 0xF7A2,\n\t39507 - 11904: 0xF779,\n\t39508 - 11904: 0xF77A,\n\t39509 - 11904: 0xC5BA,\n\t39510 - 11904: 0xF852,\n\t39511 - 11904: 0xC5E7,\n\t39512 - 11904: 0x9156,\n\t39513 - 11904: 0xF853,\n\t39514 - 11904: 0xC5E5,\n\t39515 - 11904: 0xC5E6,\n\t39516 - 11904: 0x966D,\n\t39518 - 11904: 0xF8D3,\n\t39519 - 11904: 0xC64A,\n\t39520 - 11904: 0xF976,\n\t39522 - 11904: 0xC66A,\n\t39523 - 11904: 0x9557,\n\t39524 - 11904: 0xF9B3,\n\t39525 - 11904: 0xC66B,\n\t39526 - 11904: 0xF9B4,\n\t39527 - 11904: 0xF9B5,\n\t39528 - 11904: 0xF9C3,\n\t39529 - 11904: 0xF9C2,\n\t39530 - 11904: 0xC67A,\n\t39531 - 11904: 0xF9CD,\n\t39532 - 11904: 0x89C6,\n\t39567 - 11904: 0x89C7,\n\t39592 - 11904: 0xB0A9,\n\t39595 - 11904: 0xE0E9,\n\t39597 - 11904: 0xE0E8,\n\t39599 - 11904: 0xBBEA,\n\t39600 - 11904: 0xBBEB,\n\t39601 - 11904: 0xE4DA,\n\t39602 - 11904: 0x8A6A,\n\t39603 - 11904: 0xE8D2,\n\t39604 - 11904: 0xEC6C,\n\t39606 - 11904: 0x8B57,\n\t39607 - 11904: 0xBE75,\n\t39608 - 11904: 0xC065,\n\t39609 - 11904: 0xEC6A,\n\t39610 - 11904: 0x9FE1,\n\t39611 - 11904: 0xEC6D,\n\t39612 - 11904: 0xC066,\n\t39613 - 11904: 0x9B5F,\n\t39614 - 11904: 0xEF64,\n\t39615 - 11904: 0xEC6B,\n\t39616 - 11904: 0xF1B9,\n\t39617 - 11904: 0xC34E,\n\t39618 - 11904: 0xF3C1,\n\t39622 - 11904: 0xF566,\n\t39623 - 11904: 0xF564,\n\t39626 - 11904: 0xF565,\n\t39629 - 11904: 0xF6A2,\n\t39631 - 11904: 0xC55C,\n\t39632 - 11904: 0xF7A4,\n\t39633 - 11904: 0xC5EA,\n\t39634 - 11904: 0xC5BC,\n\t39635 - 11904: 0xC5E8,\n\t39636 - 11904: 0xC5E9,\n\t39637 - 11904: 0xF8D4,\n\t39638 - 11904: 0xC662,\n\t39639 - 11904: 0xA05D,\n\t39640 - 11904: 0xB0AA,\n\t39644 - 11904: 0xF1BA,\n\t39647 - 11904: 0xD449,\n\t39648 - 11904: 0x915B,\n\t39649 - 11904: 0xB9A6,\n\t39650 - 11904: 0x915C,\n\t39651 - 11904: 0xE4DB,\n\t39654 - 11904: 0xBBEC,\n\t39655 - 11904: 0xE4DC,\n\t39659 - 11904: 0xE8D4,\n\t39660 - 11904: 0xE8D3,\n\t39661 - 11904: 0xC068,\n\t39662 - 11904: 0xBE76,\n\t39663 - 11904: 0xBE77,\n\t39665 - 11904: 0xE8D7,\n\t39666 - 11904: 0xE8D6,\n\t39667 - 11904: 0xE8D5,\n\t39668 - 11904: 0x915E,\n\t39670 - 11904: 0xEC6E,\n\t39671 - 11904: 0xEC71,\n\t39673 - 11904: 0xEC70,\n\t39674 - 11904: 0xEC6F,\n\t39675 - 11904: 0xC067,\n\t39676 - 11904: 0xEF68,\n\t39677 - 11904: 0xEF66,\n\t39678 - 11904: 0xEF65,\n\t39679 - 11904: 0x9F5C,\n\t39681 - 11904: 0xEF67,\n\t39682 - 11904: 0x9F57,\n\t39683 - 11904: 0xC34F,\n\t39684 - 11904: 0xF1BC,\n\t39685 - 11904: 0xF1BD,\n\t39686 - 11904: 0xC350,\n\t39688 - 11904: 0xF1BB,\n\t39689 - 11904: 0x9F65,\n\t39690 - 11904: 0xF3C3,\n\t39691 - 11904: 0xF3C2,\n\t39692 - 11904: 0xF3C5,\n\t39693 - 11904: 0xC447,\n\t39694 - 11904: 0xF3C4,\n\t39695 - 11904: 0x9A72,\n\t39696 - 11904: 0xF567,\n\t39697 - 11904: 0xF569,\n\t39698 - 11904: 0xF568,\n\t39700 - 11904: 0x9160,\n\t39701 - 11904: 0xF6A3,\n\t39702 - 11904: 0xF6A6,\n\t39703 - 11904: 0xF6A4,\n\t39704 - 11904: 0xF6A5,\n\t39705 - 11904: 0xF7A5,\n\t39706 - 11904: 0xC5BD,\n\t39710 - 11904: 0xF854,\n\t39711 - 11904: 0xF855,\n\t39712 - 11904: 0xF856,\n\t39714 - 11904: 0xC64B,\n\t39715 - 11904: 0xC663,\n\t39716 - 11904: 0xF9B6,\n\t39717 - 11904: 0xB0AB,\n\t39719 - 11904: 0xBE78,\n\t39720 - 11904: 0xC069,\n\t39721 - 11904: 0xF1BE,\n\t39722 - 11904: 0x9F5E,\n\t39723 - 11904: 0xF7A6,\n\t39725 - 11904: 0x9161,\n\t39726 - 11904: 0xF9C4,\n\t39727 - 11904: 0xD44A,\n\t39729 - 11904: 0xC67B,\n\t39730 - 11904: 0xB0AC,\n\t39731 - 11904: 0xEC72,\n\t39732 - 11904: 0x9164,\n\t39733 - 11904: 0xF1BF,\n\t39735 - 11904: 0xF3C6,\n\t39737 - 11904: 0x9F41,\n\t39738 - 11904: 0xF6A7,\n\t39739 - 11904: 0xF7A7,\n\t39740 - 11904: 0xB0AD,\n\t39742 - 11904: 0xE4DD,\n\t39743 - 11904: 0xE4DE,\n\t39744 - 11904: 0x9169,\n\t39745 - 11904: 0xBBED,\n\t39746 - 11904: 0xBBEE,\n\t39747 - 11904: 0xE8D9,\n\t39748 - 11904: 0xBE7A,\n\t39749 - 11904: 0xBE79,\n\t39750 - 11904: 0xE8D8,\n\t39752 - 11904: 0xEF69,\n\t39754 - 11904: 0xF1C0,\n\t39755 - 11904: 0xF1C2,\n\t39756 - 11904: 0xF1C1,\n\t39757 - 11904: 0xC353,\n\t39758 - 11904: 0xC352,\n\t39759 - 11904: 0xC351,\n\t39760 - 11904: 0x9168,\n\t39761 - 11904: 0xC55E,\n\t39762 - 11904: 0xF6A8,\n\t39764 - 11904: 0xC55D,\n\t39765 - 11904: 0xF7A9,\n\t39766 - 11904: 0xF7A8,\n\t39768 - 11904: 0xC64C,\n\t39769 - 11904: 0xF8D5,\n\t39770 - 11904: 0xB3BD,\n\t39771 - 11904: 0xE0EA,\n\t39775 - 11904: 0xE4E1,\n\t39776 - 11904: 0xE4DF,\n\t39777 - 11904: 0xE4E0,\n\t39780 - 11904: 0xE8E2,\n\t39782 - 11904: 0xE8DD,\n\t39783 - 11904: 0xE8DA,\n\t39784 - 11904: 0xE8E1,\n\t39785 - 11904: 0x9A74,\n\t39788 - 11904: 0xE8E3,\n\t39791 - 11904: 0xBE7C,\n\t39792 - 11904: 0xE8E0,\n\t39793 - 11904: 0xE8DC,\n\t39796 - 11904: 0xE8DB,\n\t39797 - 11904: 0xE8DF,\n\t39798 - 11904: 0xE8DE,\n\t39799 - 11904: 0xBE7B,\n\t39802 - 11904: 0xEC7D,\n\t39803 - 11904: 0xEC78,\n\t39804 - 11904: 0xEC76,\n\t39805 - 11904: 0xECA1,\n\t39806 - 11904: 0xEC77,\n\t39807 - 11904: 0x96B2,\n\t39808 - 11904: 0xEC73,\n\t39809 - 11904: 0x9A75,\n\t39810 - 11904: 0xEC79,\n\t39811 - 11904: 0xFDA5,\n\t39813 - 11904: 0xEC74,\n\t39814 - 11904: 0xEF72,\n\t39815 - 11904: 0xEC75,\n\t39816 - 11904: 0xECA2,\n\t39819 - 11904: 0x9EE9,\n\t39821 - 11904: 0x8BBA,\n\t39822 - 11904: 0x916D,\n\t39823 - 11904: 0xA060,\n\t39824 - 11904: 0xEC7C,\n\t39825 - 11904: 0xC06A,\n\t39826 - 11904: 0xEC7B,\n\t39827 - 11904: 0xEC7A,\n\t39829 - 11904: 0xEC7E,\n\t39831 - 11904: 0x9FDE,\n\t39834 - 11904: 0xEF6A,\n\t39835 - 11904: 0xEF6D,\n\t39837 - 11904: 0x9FC3,\n\t39838 - 11904: 0xEF6C,\n\t39839 - 11904: 0x96B5,\n\t39840 - 11904: 0xEF74,\n\t39841 - 11904: 0xEF6F,\n\t39842 - 11904: 0xEF73,\n\t39844 - 11904: 0xEF71,\n\t39845 - 11904: 0xEF70,\n\t39846 - 11904: 0xEF6E,\n\t39848 - 11904: 0xEF6B,\n\t39850 - 11904: 0xC243,\n\t39851 - 11904: 0xC242,\n\t39853 - 11904: 0xC244,\n\t39854 - 11904: 0xC241,\n\t39855 - 11904: 0xEF75,\n\t39856 - 11904: 0xA067,\n\t39861 - 11904: 0xF1C8,\n\t39862 - 11904: 0xF1CB,\n\t39864 - 11904: 0xF1C9,\n\t39865 - 11904: 0xF1CD,\n\t39869 - 11904: 0xF1CE,\n\t39871 - 11904: 0xF1C6,\n\t39872 - 11904: 0xC358,\n\t39873 - 11904: 0xF1C7,\n\t39875 - 11904: 0xF1C5,\n\t39876 - 11904: 0xF1CC,\n\t39878 - 11904: 0xF1C4,\n\t39879 - 11904: 0xF1C3,\n\t39880 - 11904: 0xC357,\n\t39881 - 11904: 0xC355,\n\t39882 - 11904: 0xC354,\n\t39887 - 11904: 0x96B3,\n\t39891 - 11904: 0xF1CA,\n\t39892 - 11904: 0xF3CF,\n\t39893 - 11904: 0xF3D5,\n\t39894 - 11904: 0xC44A,\n\t39895 - 11904: 0xF3D0,\n\t39897 - 11904: 0xF3D3,\n\t39898 - 11904: 0xF3D7,\n\t39899 - 11904: 0xC44B,\n\t39900 - 11904: 0xF3D2,\n\t39901 - 11904: 0x9A76,\n\t39902 - 11904: 0xF3CA,\n\t39904 - 11904: 0xF3C9,\n\t39905 - 11904: 0xF3D6,\n\t39906 - 11904: 0xF3CD,\n\t39908 - 11904: 0xF3CB,\n\t39909 - 11904: 0xF3D4,\n\t39910 - 11904: 0xF3CC,\n\t39911 - 11904: 0xC449,\n\t39912 - 11904: 0xC448,\n\t39913 - 11904: 0x95D5,\n\t39914 - 11904: 0xF3C7,\n\t39915 - 11904: 0xF3C8,\n\t39916 - 11904: 0xF3D1,\n\t39917 - 11904: 0x9ECA,\n\t39920 - 11904: 0xF3CE,\n\t39921 - 11904: 0x9A77,\n\t39924 - 11904: 0x9A78,\n\t39927 - 11904: 0xF56C,\n\t39928 - 11904: 0xF56F,\n\t39933 - 11904: 0xC356,\n\t39935 - 11904: 0x9170,\n\t39938 - 11904: 0x916F,\n\t39941 - 11904: 0xF56D,\n\t39942 - 11904: 0xF573,\n\t39943 - 11904: 0xF571,\n\t39944 - 11904: 0xF56B,\n\t39945 - 11904: 0xF576,\n\t39946 - 11904: 0x9FA3,\n\t39947 - 11904: 0xF56A,\n\t39948 - 11904: 0x9171,\n\t39949 - 11904: 0xC4CF,\n\t39950 - 11904: 0xF572,\n\t39952 - 11904: 0x96B1,\n\t39954 - 11904: 0xF56E,\n\t39955 - 11904: 0xC4CE,\n\t39956 - 11904: 0xF575,\n\t39957 - 11904: 0x9F63,\n\t39959 - 11904: 0xF574,\n\t39963 - 11904: 0x9F67,\n\t39964 - 11904: 0xF6AB,\n\t39965 - 11904: 0xF6AA,\n\t39967 - 11904: 0x8BB9,\n\t39968 - 11904: 0x9A7A,\n\t39969 - 11904: 0xF6B1,\n\t39971 - 11904: 0xF6AD,\n\t39972 - 11904: 0xF6B0,\n\t39973 - 11904: 0xC560,\n\t39974 - 11904: 0x8B56,\n\t39976 - 11904: 0xF6AE,\n\t39977 - 11904: 0xF6AF,\n\t39979 - 11904: 0xF6A9,\n\t39980 - 11904: 0xF6AC,\n\t39981 - 11904: 0xC55F,\n\t39983 - 11904: 0x9ADA,\n\t39985 - 11904: 0xC5BF,\n\t39986 - 11904: 0xF7B4,\n\t39987 - 11904: 0xF7AF,\n\t39988 - 11904: 0xF7B3,\n\t39989 - 11904: 0x96B0,\n\t39990 - 11904: 0xF7B6,\n\t39991 - 11904: 0xF7B2,\n\t39993 - 11904: 0xF7AE,\n\t39994 - 11904: 0x9A7E,\n\t39995 - 11904: 0xC5C1,\n\t39996 - 11904: 0xF7B1,\n\t39997 - 11904: 0xF7B5,\n\t39998 - 11904: 0xC5C0,\n\t39999 - 11904: 0xF7AC,\n\t40000 - 11904: 0xF570,\n\t40001 - 11904: 0xF7B0,\n\t40004 - 11904: 0xF7AD,\n\t40005 - 11904: 0x9DDE,\n\t40006 - 11904: 0xF7AA,\n\t40008 - 11904: 0xF7AB,\n\t40009 - 11904: 0xC5BE,\n\t40010 - 11904: 0xF85A,\n\t40011 - 11904: 0xF85C,\n\t40012 - 11904: 0xF85F,\n\t40013 - 11904: 0xF85B,\n\t40014 - 11904: 0xF860,\n\t40015 - 11904: 0x96AD,\n\t40016 - 11904: 0xF859,\n\t40018 - 11904: 0xF857,\n\t40019 - 11904: 0x96AE,\n\t40020 - 11904: 0xC5EB,\n\t40021 - 11904: 0xF85D,\n\t40022 - 11904: 0xC5ED,\n\t40023 - 11904: 0xC5EC,\n\t40024 - 11904: 0xF858,\n\t40025 - 11904: 0xF85E,\n\t40029 - 11904: 0x9EA1,\n\t40030 - 11904: 0xF8DA,\n\t40031 - 11904: 0xC64D,\n\t40032 - 11904: 0xF8DB,\n\t40034 - 11904: 0xF8D9,\n\t40035 - 11904: 0xF8D6,\n\t40038 - 11904: 0xF8D8,\n\t40039 - 11904: 0xF8D7,\n\t40040 - 11904: 0xF95A,\n\t40045 - 11904: 0xF95C,\n\t40046 - 11904: 0xF95B,\n\t40049 - 11904: 0xF979,\n\t40050 - 11904: 0x9E50,\n\t40051 - 11904: 0xF978,\n\t40052 - 11904: 0xF977,\n\t40053 - 11904: 0xF97A,\n\t40055 - 11904: 0xC673,\n\t40056 - 11904: 0xC674,\n\t40057 - 11904: 0xF9CA,\n\t40058 - 11904: 0xF9CE,\n\t40059 - 11904: 0x96AF,\n\t40060 - 11904: 0x8BF4,\n\t40165 - 11904: 0xB3BE,\n\t40166 - 11904: 0xDCAF,\n\t40167 - 11904: 0xE0ED,\n\t40169 - 11904: 0xB9A7,\n\t40170 - 11904: 0xE0EB,\n\t40173 - 11904: 0xE0EC,\n\t40177 - 11904: 0xE4E2,\n\t40178 - 11904: 0xE4E3,\n\t40179 - 11904: 0xBBF1,\n\t40180 - 11904: 0xBBEF,\n\t40181 - 11904: 0xE4E4,\n\t40182 - 11904: 0xBBF0,\n\t40183 - 11904: 0xE8E8,\n\t40185 - 11904: 0xE8EB,\n\t40186 - 11904: 0xE8E5,\n\t40187 - 11904: 0xE8EC,\n\t40188 - 11904: 0xE8E4,\n\t40189 - 11904: 0xE8E6,\n\t40191 - 11904: 0xE8E7,\n\t40192 - 11904: 0xE8EA,\n\t40194 - 11904: 0x9FA4,\n\t40195 - 11904: 0xBEA1,\n\t40196 - 11904: 0xE8EF,\n\t40197 - 11904: 0xE8EE,\n\t40198 - 11904: 0xBE7D,\n\t40199 - 11904: 0xE8E9,\n\t40200 - 11904: 0xE8ED,\n\t40201 - 11904: 0xBE7E,\n\t40204 - 11904: 0x96BD,\n\t40208 - 11904: 0xECAC,\n\t40210 - 11904: 0xC06F,\n\t40212 - 11904: 0xECA7,\n\t40213 - 11904: 0xC06B,\n\t40214 - 11904: 0x96F4,\n\t40215 - 11904: 0xECA4,\n\t40216 - 11904: 0xECAA,\n\t40217 - 11904: 0xECAD,\n\t40219 - 11904: 0xC070,\n\t40221 - 11904: 0xECA9,\n\t40222 - 11904: 0xECA6,\n\t40223 - 11904: 0xECAE,\n\t40224 - 11904: 0xECA5,\n\t40225 - 11904: 0x96B8,\n\t40226 - 11904: 0xECAB,\n\t40227 - 11904: 0xC06C,\n\t40229 - 11904: 0xECA3,\n\t40230 - 11904: 0xC06D,\n\t40232 - 11904: 0xC06E,\n\t40233 - 11904: 0xECA8,\n\t40237 - 11904: 0xEFA9,\n\t40238 - 11904: 0xEF7A,\n\t40239 - 11904: 0xEF7B,\n\t40240 - 11904: 0xEF7E,\n\t40241 - 11904: 0xEF7C,\n\t40243 - 11904: 0xEF76,\n\t40244 - 11904: 0xFAA1,\n\t40246 - 11904: 0xEF79,\n\t40247 - 11904: 0xEFA5,\n\t40248 - 11904: 0xEF7D,\n\t40249 - 11904: 0x91A7,\n\t40251 - 11904: 0xC245,\n\t40253 - 11904: 0xEFA7,\n\t40254 - 11904: 0xEFA4,\n\t40255 - 11904: 0xC246,\n\t40256 - 11904: 0xEFA6,\n\t40257 - 11904: 0xEF77,\n\t40258 - 11904: 0xEFA2,\n\t40259 - 11904: 0xEFA3,\n\t40260 - 11904: 0xA05E,\n\t40261 - 11904: 0xEFA1,\n\t40265 - 11904: 0x9A7D,\n\t40266 - 11904: 0xF1D2,\n\t40267 - 11904: 0xF1D4,\n\t40268 - 11904: 0xF1D7,\n\t40270 - 11904: 0x8948,\n\t40271 - 11904: 0xF1D1,\n\t40272 - 11904: 0x9EB1,\n\t40273 - 11904: 0xC359,\n\t40274 - 11904: 0xF1D9,\n\t40275 - 11904: 0xF1D0,\n\t40276 - 11904: 0xF1DA,\n\t40278 - 11904: 0xF1D6,\n\t40279 - 11904: 0xF1D8,\n\t40280 - 11904: 0xF1DC,\n\t40281 - 11904: 0xF1D5,\n\t40282 - 11904: 0xF1DD,\n\t40283 - 11904: 0xF1D3,\n\t40284 - 11904: 0xF1CF,\n\t40285 - 11904: 0xC35A,\n\t40286 - 11904: 0x9DDB,\n\t40287 - 11904: 0xF1DB,\n\t40288 - 11904: 0xC35B,\n\t40289 - 11904: 0xC44D,\n\t40295 - 11904: 0xEF78,\n\t40296 - 11904: 0xF3F1,\n\t40297 - 11904: 0xF3E8,\n\t40298 - 11904: 0xC44F,\n\t40299 - 11904: 0xF3E4,\n\t40300 - 11904: 0xC450,\n\t40301 - 11904: 0x95BF,\n\t40302 - 11904: 0x8A73,\n\t40303 - 11904: 0xF3ED,\n\t40304 - 11904: 0xF3E7,\n\t40305 - 11904: 0xF3DD,\n\t40306 - 11904: 0xC44E,\n\t40307 - 11904: 0xF3EA,\n\t40308 - 11904: 0xF3E5,\n\t40309 - 11904: 0xF3E6,\n\t40311 - 11904: 0xF3D8,\n\t40312 - 11904: 0xF3DF,\n\t40313 - 11904: 0xF3EE,\n\t40315 - 11904: 0xF3EB,\n\t40316 - 11904: 0x9EFE,\n\t40317 - 11904: 0xF3E3,\n\t40318 - 11904: 0x917A,\n\t40319 - 11904: 0xF3EF,\n\t40320 - 11904: 0xF3DE,\n\t40321 - 11904: 0xF3D9,\n\t40322 - 11904: 0xF3EC,\n\t40323 - 11904: 0x917B,\n\t40324 - 11904: 0xF3DB,\n\t40325 - 11904: 0xF3E9,\n\t40326 - 11904: 0xF3E0,\n\t40327 - 11904: 0xF3F0,\n\t40328 - 11904: 0xF3DC,\n\t40329 - 11904: 0xC44C,\n\t40330 - 11904: 0xF3DA,\n\t40331 - 11904: 0xF3E1,\n\t40332 - 11904: 0xF3E2,\n\t40336 - 11904: 0xF57D,\n\t40338 - 11904: 0xF57B,\n\t40339 - 11904: 0x9AA3,\n\t40340 - 11904: 0xF5A2,\n\t40342 - 11904: 0xF5AE,\n\t40343 - 11904: 0xF5A5,\n\t40344 - 11904: 0xF57C,\n\t40345 - 11904: 0xF578,\n\t40346 - 11904: 0xF5A7,\n\t40347 - 11904: 0xF57E,\n\t40348 - 11904: 0xF5A3,\n\t40349 - 11904: 0xF57A,\n\t40350 - 11904: 0xF5AA,\n\t40351 - 11904: 0xF577,\n\t40352 - 11904: 0xF5A1,\n\t40353 - 11904: 0xF5A6,\n\t40354 - 11904: 0xF5A8,\n\t40355 - 11904: 0xF5AB,\n\t40356 - 11904: 0xF579,\n\t40357 - 11904: 0x96C2,\n\t40358 - 11904: 0xF5AF,\n\t40359 - 11904: 0xF5B0,\n\t40360 - 11904: 0xF5A9,\n\t40361 - 11904: 0xF5AD,\n\t40362 - 11904: 0xF5A4,\n\t40363 - 11904: 0x9F77,\n\t40364 - 11904: 0xF6C1,\n\t40365 - 11904: 0xF6C4,\n\t40367 - 11904: 0xC561,\n\t40369 - 11904: 0xF6C3,\n\t40370 - 11904: 0xF6C8,\n\t40371 - 11904: 0xF6C6,\n\t40372 - 11904: 0xC562,\n\t40373 - 11904: 0xF6BD,\n\t40374 - 11904: 0xF6B3,\n\t40375 - 11904: 0xF6B2,\n\t40376 - 11904: 0xC564,\n\t40377 - 11904: 0xF6BF,\n\t40378 - 11904: 0xF6C0,\n\t40379 - 11904: 0xF6BC,\n\t40380 - 11904: 0xF6B4,\n\t40381 - 11904: 0x9AA4,\n\t40382 - 11904: 0xF6B9,\n\t40383 - 11904: 0xF5AC,\n\t40384 - 11904: 0x9AA5,\n\t40385 - 11904: 0xF6B5,\n\t40386 - 11904: 0xC563,\n\t40387 - 11904: 0xF6BB,\n\t40388 - 11904: 0x91A1,\n\t40389 - 11904: 0xF6BA,\n\t40391 - 11904: 0xF6B6,\n\t40392 - 11904: 0xF6C2,\n\t40393 - 11904: 0x89B8,\n\t40394 - 11904: 0xF6B7,\n\t40395 - 11904: 0xF7BB,\n\t40396 - 11904: 0xF6C5,\n\t40397 - 11904: 0xF6C7,\n\t40398 - 11904: 0xF6BE,\n\t40399 - 11904: 0xF6B8,\n\t40400 - 11904: 0xF7BC,\n\t40401 - 11904: 0xF7BE,\n\t40402 - 11904: 0xF7B8,\n\t40403 - 11904: 0xC5C2,\n\t40404 - 11904: 0x9173,\n\t40405 - 11904: 0xF7C5,\n\t40406 - 11904: 0xF7C3,\n\t40407 - 11904: 0xC5C3,\n\t40408 - 11904: 0xF7C2,\n\t40409 - 11904: 0xF7C1,\n\t40410 - 11904: 0xF7BA,\n\t40411 - 11904: 0xF7B7,\n\t40412 - 11904: 0xF7BD,\n\t40413 - 11904: 0xF7C6,\n\t40414 - 11904: 0xF7B9,\n\t40415 - 11904: 0xF7BF,\n\t40417 - 11904: 0xF869,\n\t40418 - 11904: 0xF86E,\n\t40419 - 11904: 0xF864,\n\t40420 - 11904: 0xF867,\n\t40421 - 11904: 0xC5EE,\n\t40422 - 11904: 0xF86B,\n\t40424 - 11904: 0xF872,\n\t40425 - 11904: 0xF7C0,\n\t40427 - 11904: 0xF865,\n\t40428 - 11904: 0xF86F,\n\t40429 - 11904: 0xF873,\n\t40430 - 11904: 0xF86A,\n\t40431 - 11904: 0xF863,\n\t40432 - 11904: 0xF86D,\n\t40434 - 11904: 0xF86C,\n\t40435 - 11904: 0xF871,\n\t40436 - 11904: 0xF870,\n\t40437 - 11904: 0xF7C4,\n\t40438 - 11904: 0xF868,\n\t40439 - 11904: 0xF862,\n\t40440 - 11904: 0xF866,\n\t40441 - 11904: 0xC64E,\n\t40442 - 11904: 0xC64F,\n\t40443 - 11904: 0xF861,\n\t40444 - 11904: 0x9AA6,\n\t40445 - 11904: 0xF8E6,\n\t40446 - 11904: 0xF8DD,\n\t40447 - 11904: 0xF8E5,\n\t40448 - 11904: 0xF8E2,\n\t40449 - 11904: 0xF8E3,\n\t40450 - 11904: 0xF8DC,\n\t40451 - 11904: 0xF8DF,\n\t40452 - 11904: 0xF8E7,\n\t40453 - 11904: 0xF8E1,\n\t40454 - 11904: 0xF8E0,\n\t40455 - 11904: 0xF8DE,\n\t40457 - 11904: 0xF8E4,\n\t40458 - 11904: 0x89BD,\n\t40459 - 11904: 0xF95D,\n\t40460 - 11904: 0x89B9,\n\t40461 - 11904: 0xF95E,\n\t40462 - 11904: 0x917D,\n\t40463 - 11904: 0xF960,\n\t40464 - 11904: 0xF95F,\n\t40465 - 11904: 0xF962,\n\t40466 - 11904: 0xF961,\n\t40467 - 11904: 0xF97C,\n\t40468 - 11904: 0xF97B,\n\t40469 - 11904: 0xF9B7,\n\t40471 - 11904: 0xF9B8,\n\t40472 - 11904: 0x96BB,\n\t40473 - 11904: 0xF9C5,\n\t40474 - 11904: 0xC678,\n\t40475 - 11904: 0xC67C,\n\t40476 - 11904: 0x9FF2,\n\t40477 - 11904: 0xF9CF,\n\t40478 - 11904: 0xC67D,\n\t40479 - 11904: 0x8BF5,\n\t40565 - 11904: 0xB3BF,\n\t40569 - 11904: 0xC4D0,\n\t40570 - 11904: 0xF6C9,\n\t40571 - 11904: 0x9AA9,\n\t40572 - 11904: 0xC650,\n\t40573 - 11904: 0xC651,\n\t40575 - 11904: 0xB3C0,\n\t40576 - 11904: 0xE0EE,\n\t40577 - 11904: 0x9F54,\n\t40578 - 11904: 0xB9A8,\n\t40579 - 11904: 0xE8F0,\n\t40580 - 11904: 0x9FE3,\n\t40581 - 11904: 0x9EED,\n\t40582 - 11904: 0xECB0,\n\t40583 - 11904: 0xECB1,\n\t40584 - 11904: 0xECAF,\n\t40585 - 11904: 0xEFAB,\n\t40586 - 11904: 0xEFAA,\n\t40587 - 11904: 0xC247,\n\t40588 - 11904: 0xF1DF,\n\t40589 - 11904: 0xEFAC,\n\t40590 - 11904: 0xF1DE,\n\t40592 - 11904: 0x91AA,\n\t40593 - 11904: 0xF3F3,\n\t40594 - 11904: 0xC451,\n\t40595 - 11904: 0xC453,\n\t40596 - 11904: 0xF3F2,\n\t40597 - 11904: 0x91AB,\n\t40598 - 11904: 0xA070,\n\t40599 - 11904: 0xC452,\n\t40600 - 11904: 0x9F6D,\n\t40601 - 11904: 0xF5B1,\n\t40602 - 11904: 0xF5B3,\n\t40603 - 11904: 0xF5B2,\n\t40604 - 11904: 0xF6CA,\n\t40605 - 11904: 0xC565,\n\t40606 - 11904: 0x91AC,\n\t40607 - 11904: 0xC5EF,\n\t40608 - 11904: 0xF8E8,\n\t40609 - 11904: 0xF963,\n\t40610 - 11904: 0x91AD,\n\t40612 - 11904: 0xF9D2,\n\t40613 - 11904: 0xB3C1,\n\t40614 - 11904: 0xA0FD,\n\t40615 - 11904: 0xE4E5,\n\t40616 - 11904: 0x9FE2,\n\t40617 - 11904: 0xBEA2,\n\t40618 - 11904: 0x91AF,\n\t40619 - 11904: 0x9E41,\n\t40620 - 11904: 0x9AAA,\n\t40621 - 11904: 0xECB3,\n\t40622 - 11904: 0xECB2,\n\t40623 - 11904: 0x91B0,\n\t40624 - 11904: 0xEFAD,\n\t40625 - 11904: 0x9AAB,\n\t40628 - 11904: 0xC454,\n\t40629 - 11904: 0xC4D1,\n\t40630 - 11904: 0xF7C7,\n\t40631 - 11904: 0xF9CB,\n\t40635 - 11904: 0xB3C2,\n\t40636 - 11904: 0xBBF2,\n\t40637 - 11904: 0x9AAC,\n\t40638 - 11904: 0xBEA3,\n\t40639 - 11904: 0x9A4A,\n\t40640 - 11904: 0xF3F4,\n\t40641 - 11904: 0x91B2,\n\t40642 - 11904: 0xF874,\n\t40643 - 11904: 0xB6C0,\n\t40644 - 11904: 0x8BF6,\n\t40646 - 11904: 0x9AAD,\n\t40647 - 11904: 0x89B6,\n\t40648 - 11904: 0xEFAE,\n\t40652 - 11904: 0xC664,\n\t40653 - 11904: 0xB6C1,\n\t40654 - 11904: 0xBEA4,\n\t40655 - 11904: 0xC248,\n\t40656 - 11904: 0xF875,\n\t40657 - 11904: 0xB6C2,\n\t40659 - 11904: 0xE8F1,\n\t40660 - 11904: 0xC072,\n\t40661 - 11904: 0xECB4,\n\t40662 - 11904: 0xECB5,\n\t40664 - 11904: 0xC071,\n\t40666 - 11904: 0xEFAF,\n\t40667 - 11904: 0xC24C,\n\t40668 - 11904: 0xC24A,\n\t40669 - 11904: 0xC24B,\n\t40670 - 11904: 0xC249,\n\t40671 - 11904: 0xF1E0,\n\t40672 - 11904: 0xC35C,\n\t40674 - 11904: 0x9AAF,\n\t40676 - 11904: 0xF5B5,\n\t40677 - 11904: 0xF5B4,\n\t40678 - 11904: 0xF5B7,\n\t40679 - 11904: 0xF5B6,\n\t40680 - 11904: 0xC4D2,\n\t40683 - 11904: 0xF6CB,\n\t40685 - 11904: 0xF6CD,\n\t40686 - 11904: 0xF6CC,\n\t40687 - 11904: 0xC566,\n\t40688 - 11904: 0xF7C8,\n\t40689 - 11904: 0x9AB0,\n\t40690 - 11904: 0xF876,\n\t40691 - 11904: 0xF877,\n\t40692 - 11904: 0xC5F0,\n\t40693 - 11904: 0xF964,\n\t40694 - 11904: 0xF97D,\n\t40695 - 11904: 0xC675,\n\t40696 - 11904: 0x9AB1,\n\t40697 - 11904: 0xDCB0,\n\t40698 - 11904: 0xECB6,\n\t40699 - 11904: 0xEFB0,\n\t40700 - 11904: 0xF3F5,\n\t40701 - 11904: 0xE0EF,\n\t40702 - 11904: 0x9AA1,\n\t40703 - 11904: 0xEFB1,\n\t40704 - 11904: 0xF1E2,\n\t40705 - 11904: 0xF1E1,\n\t40706 - 11904: 0x91B9,\n\t40710 - 11904: 0xF878,\n\t40711 - 11904: 0xC652,\n\t40712 - 11904: 0x91BA,\n\t40713 - 11904: 0xF965,\n\t40714 - 11904: 0xF97E,\n\t40718 - 11904: 0xB9A9,\n\t40719 - 11904: 0xE8F2,\n\t40720 - 11904: 0xE8F3,\n\t40722 - 11904: 0xECB7,\n\t40723 - 11904: 0xB9AA,\n\t40725 - 11904: 0xC35D,\n\t40726 - 11904: 0xF1E3,\n\t40727 - 11904: 0x9F66,\n\t40728 - 11904: 0xF6CF,\n\t40729 - 11904: 0xC567,\n\t40730 - 11904: 0xF6D0,\n\t40731 - 11904: 0xF6CE,\n\t40732 - 11904: 0xF879,\n\t40734 - 11904: 0xF8E9,\n\t40736 - 11904: 0xB9AB,\n\t40738 - 11904: 0xEFB4,\n\t40739 - 11904: 0xEFB3,\n\t40740 - 11904: 0xEFB2,\n\t40741 - 11904: 0xF1E4,\n\t40742 - 11904: 0xA041,\n\t40743 - 11904: 0x8BB7,\n\t40744 - 11904: 0xF1E8,\n\t40745 - 11904: 0xF1E7,\n\t40746 - 11904: 0xF1E6,\n\t40747 - 11904: 0xF1E5,\n\t40748 - 11904: 0xC35E,\n\t40749 - 11904: 0xF3F6,\n\t40750 - 11904: 0xF5B9,\n\t40751 - 11904: 0xC4D3,\n\t40752 - 11904: 0xF5B8,\n\t40753 - 11904: 0xF6D1,\n\t40754 - 11904: 0xF7CB,\n\t40755 - 11904: 0xF7CA,\n\t40756 - 11904: 0xC5C4,\n\t40757 - 11904: 0xF7C9,\n\t40758 - 11904: 0xF87C,\n\t40759 - 11904: 0xF87B,\n\t40760 - 11904: 0xF87A,\n\t40761 - 11904: 0x91C0,\n\t40763 - 11904: 0xBBF3,\n\t40765 - 11904: 0xECB8,\n\t40766 - 11904: 0xC24D,\n\t40768 - 11904: 0xF3F7,\n\t40769 - 11904: 0xF3F8,\n\t40770 - 11904: 0xF7CC,\n\t40771 - 11904: 0xF87D,\n\t40772 - 11904: 0x9AB3,\n\t40773 - 11904: 0x91C3,\n\t40774 - 11904: 0xF8EA,\n\t40775 - 11904: 0xF966,\n\t40776 - 11904: 0xF9B9,\n\t40777 - 11904: 0xF9D4,\n\t40778 - 11904: 0xBBF4,\n\t40779 - 11904: 0xC24E,\n\t40780 - 11904: 0xF1E9,\n\t40781 - 11904: 0xF3F9,\n\t40782 - 11904: 0xF6D2,\n\t40783 - 11904: 0xF87E,\n\t40784 - 11904: 0xA0FC,\n\t40786 - 11904: 0xBEA6,\n\t40787 - 11904: 0x9FEE,\n\t40788 - 11904: 0xEFB5,\n\t40789 - 11904: 0xF1EA,\n\t40790 - 11904: 0xF3FA,\n\t40791 - 11904: 0xF3FB,\n\t40792 - 11904: 0xF3FC,\n\t40793 - 11904: 0xF5BE,\n\t40794 - 11904: 0x9F69,\n\t40795 - 11904: 0xF5BA,\n\t40796 - 11904: 0xC568,\n\t40797 - 11904: 0xF5BD,\n\t40798 - 11904: 0xF5BC,\n\t40799 - 11904: 0xC4D4,\n\t40800 - 11904: 0xF5BB,\n\t40801 - 11904: 0xC4D6,\n\t40802 - 11904: 0x91C8,\n\t40803 - 11904: 0xC4D5,\n\t40804 - 11904: 0xF6D4,\n\t40805 - 11904: 0xF6D3,\n\t40806 - 11904: 0xC569,\n\t40807 - 11904: 0xC56A,\n\t40809 - 11904: 0x91C9,\n\t40810 - 11904: 0xC5C6,\n\t40811 - 11904: 0xF7CD,\n\t40812 - 11904: 0xC5C5,\n\t40814 - 11904: 0xF8A3,\n\t40815 - 11904: 0xF8A4,\n\t40816 - 11904: 0xF8A2,\n\t40817 - 11904: 0xF8A1,\n\t40818 - 11904: 0xC654,\n\t40820 - 11904: 0xF8EB,\n\t40821 - 11904: 0xF8EC,\n\t40822 - 11904: 0xF8ED,\n\t40823 - 11904: 0xC653,\n\t40824 - 11904: 0xF967,\n\t40825 - 11904: 0xF96A,\n\t40826 - 11904: 0xF969,\n\t40827 - 11904: 0xF968,\n\t40830 - 11904: 0xF9D3,\n\t40831 - 11904: 0x8DE6,\n\t40845 - 11904: 0xC073,\n\t40846 - 11904: 0x91CB,\n\t40848 - 11904: 0xC365,\n\t40849 - 11904: 0xF5BF,\n\t40850 - 11904: 0xF6D5,\n\t40852 - 11904: 0xC5C7,\n\t40853 - 11904: 0xF7CE,\n\t40854 - 11904: 0x87AC,\n\t40855 - 11904: 0x87A4,\n\t40856 - 11904: 0xF9D5,\n\t40857 - 11904: 0x89C8,\n\t40860 - 11904: 0xC074,\n\t40863 - 11904: 0x8DAA,\n\t40864 - 11904: 0xEFB6,\n\t40866 - 11904: 0xF7CF,\n\t40868 - 11904: 0xF9A1,\n\t40869 - 11904: 0x9FDD,\n\t40870 - 11904: 0x8C43,\n\t40871 - 11904: 0x8C6D,\n\t40872 - 11904: 0x8C74,\n\t40873 - 11904: 0x8CB7,\n\t40874 - 11904: 0x8CB9,\n\t40875 - 11904: 0x8CBB,\n\t40876 - 11904: 0x8CC0,\n\t40877 - 11904: 0x8CD7,\n\t40878 - 11904: 0x8CD8,\n\t40879 - 11904: 0x8CDA,\n\t40880 - 11904: 0xC8A1,\n\t40881 - 11904: 0xC8A3,\n\t40882 - 11904: 0x8CED,\n\t40883 - 11904: 0x8D48,\n\t40903 - 11904: 0x87C2,\n\t40904 - 11904: 0x87D2,\n\t40905 - 11904: 0x87D6,\n\t40906 - 11904: 0x87DA,\n\t40907 - 11904: 0x87DF,\n}\n\nconst encode2Low, encode2High = 7870, 10046\n\nvar encode2 = [...]uint16{\n\t7870 - 7870:  0x8863,\n\t7871 - 7870:  0x88A4,\n\t7872 - 7870:  0x8865,\n\t7873 - 7870:  0x88A6,\n\t8211 - 7870:  0xA156,\n\t8212 - 7870:  0xA158,\n\t8216 - 7870:  0xA1A5,\n\t8217 - 7870:  0xA1A6,\n\t8220 - 7870:  0xA1A7,\n\t8221 - 7870:  0xA1A8,\n\t8229 - 7870:  0xA14C,\n\t8230 - 7870:  0xA14B,\n\t8231 - 7870:  0xA145,\n\t8242 - 7870:  0xA1AC,\n\t8245 - 7870:  0xA1AB,\n\t8251 - 7870:  0xA1B0,\n\t8364 - 7870:  0xA3E1,\n\t8451 - 7870:  0xA24A,\n\t8453 - 7870:  0xA1C1,\n\t8457 - 7870:  0xA24B,\n\t8470 - 7870:  0xC8D2,\n\t8481 - 7870:  0xC8D3,\n\t8544 - 7870:  0xA2B9,\n\t8545 - 7870:  0xA2BA,\n\t8546 - 7870:  0xA2BB,\n\t8547 - 7870:  0xA2BC,\n\t8548 - 7870:  0xA2BD,\n\t8549 - 7870:  0xA2BE,\n\t8550 - 7870:  0xA2BF,\n\t8551 - 7870:  0xA2C0,\n\t8552 - 7870:  0xA2C1,\n\t8553 - 7870:  0xA2C2,\n\t8560 - 7870:  0xC6B5,\n\t8561 - 7870:  0xC6B6,\n\t8562 - 7870:  0xC6B7,\n\t8563 - 7870:  0xC6B8,\n\t8564 - 7870:  0xC6B9,\n\t8565 - 7870:  0xC6BA,\n\t8566 - 7870:  0xC6BB,\n\t8567 - 7870:  0xC6BC,\n\t8568 - 7870:  0xC6BD,\n\t8569 - 7870:  0xC6BE,\n\t8592 - 7870:  0xA1F6,\n\t8593 - 7870:  0xA1F4,\n\t8594 - 7870:  0xA1F7,\n\t8595 - 7870:  0xA1F5,\n\t8598 - 7870:  0xA1F8,\n\t8599 - 7870:  0xA1F9,\n\t8600 - 7870:  0xA1FB,\n\t8601 - 7870:  0xA1FA,\n\t8632 - 7870:  0xC877,\n\t8633 - 7870:  0xC878,\n\t8679 - 7870:  0xC876,\n\t8725 - 7870:  0xA241,\n\t8730 - 7870:  0xA1D4,\n\t8734 - 7870:  0xA1DB,\n\t8735 - 7870:  0xA1E8,\n\t8736 - 7870:  0xA1E7,\n\t8739 - 7870:  0xA1FD,\n\t8741 - 7870:  0xA1FC,\n\t8745 - 7870:  0xA1E4,\n\t8746 - 7870:  0xA1E5,\n\t8747 - 7870:  0xA1EC,\n\t8750 - 7870:  0xA1ED,\n\t8756 - 7870:  0xA1EF,\n\t8757 - 7870:  0xA1EE,\n\t8786 - 7870:  0xA1DC,\n\t8800 - 7870:  0xA1DA,\n\t8801 - 7870:  0xA1DD,\n\t8806 - 7870:  0xA1D8,\n\t8807 - 7870:  0xA1D9,\n\t8853 - 7870:  0xA1F2,\n\t8857 - 7870:  0xA1F3,\n\t8869 - 7870:  0xA1E6,\n\t8895 - 7870:  0xA1E9,\n\t9178 - 7870:  0x88A9,\n\t9179 - 7870:  0x88AA,\n\t9216 - 7870:  0xA3C0,\n\t9217 - 7870:  0xA3C1,\n\t9218 - 7870:  0xA3C2,\n\t9219 - 7870:  0xA3C3,\n\t9220 - 7870:  0xA3C4,\n\t9221 - 7870:  0xA3C5,\n\t9222 - 7870:  0xA3C6,\n\t9223 - 7870:  0xA3C7,\n\t9224 - 7870:  0xA3C8,\n\t9225 - 7870:  0xA3C9,\n\t9226 - 7870:  0xA3CA,\n\t9227 - 7870:  0xA3CB,\n\t9228 - 7870:  0xA3CC,\n\t9229 - 7870:  0xA3CD,\n\t9230 - 7870:  0xA3CE,\n\t9231 - 7870:  0xA3CF,\n\t9232 - 7870:  0xA3D0,\n\t9233 - 7870:  0xA3D1,\n\t9234 - 7870:  0xA3D2,\n\t9235 - 7870:  0xA3D3,\n\t9236 - 7870:  0xA3D4,\n\t9237 - 7870:  0xA3D5,\n\t9238 - 7870:  0xA3D6,\n\t9239 - 7870:  0xA3D7,\n\t9240 - 7870:  0xA3D8,\n\t9241 - 7870:  0xA3D9,\n\t9242 - 7870:  0xA3DA,\n\t9243 - 7870:  0xA3DB,\n\t9244 - 7870:  0xA3DC,\n\t9245 - 7870:  0xA3DD,\n\t9246 - 7870:  0xA3DE,\n\t9247 - 7870:  0xA3DF,\n\t9249 - 7870:  0xA3E0,\n\t9312 - 7870:  0xC6A1,\n\t9313 - 7870:  0xC6A2,\n\t9314 - 7870:  0xC6A3,\n\t9315 - 7870:  0xC6A4,\n\t9316 - 7870:  0xC6A5,\n\t9317 - 7870:  0xC6A6,\n\t9318 - 7870:  0xC6A7,\n\t9319 - 7870:  0xC6A8,\n\t9320 - 7870:  0xC6A9,\n\t9321 - 7870:  0xC6AA,\n\t9332 - 7870:  0xC6AB,\n\t9333 - 7870:  0xC6AC,\n\t9334 - 7870:  0xC6AD,\n\t9335 - 7870:  0xC6AE,\n\t9336 - 7870:  0xC6AF,\n\t9337 - 7870:  0xC6B0,\n\t9338 - 7870:  0xC6B1,\n\t9339 - 7870:  0xC6B2,\n\t9340 - 7870:  0xC6B3,\n\t9341 - 7870:  0xC6B4,\n\t9472 - 7870:  0xA277,\n\t9474 - 7870:  0xA278,\n\t9484 - 7870:  0xA27A,\n\t9488 - 7870:  0xA27B,\n\t9492 - 7870:  0xA27C,\n\t9496 - 7870:  0xA27D,\n\t9500 - 7870:  0xA275,\n\t9508 - 7870:  0xA274,\n\t9516 - 7870:  0xA273,\n\t9524 - 7870:  0xA272,\n\t9532 - 7870:  0xA271,\n\t9552 - 7870:  0xF9F9,\n\t9553 - 7870:  0xF9F8,\n\t9554 - 7870:  0xF9E6,\n\t9555 - 7870:  0xF9EF,\n\t9556 - 7870:  0xF9DD,\n\t9557 - 7870:  0xF9E8,\n\t9558 - 7870:  0xF9F1,\n\t9559 - 7870:  0xF9DF,\n\t9560 - 7870:  0xF9EC,\n\t9561 - 7870:  0xF9F5,\n\t9562 - 7870:  0xF9E3,\n\t9563 - 7870:  0xF9EE,\n\t9564 - 7870:  0xF9F7,\n\t9565 - 7870:  0xF9E5,\n\t9566 - 7870:  0xF9E9,\n\t9567 - 7870:  0xF9F2,\n\t9568 - 7870:  0xF9E0,\n\t9569 - 7870:  0xF9EB,\n\t9570 - 7870:  0xF9F4,\n\t9571 - 7870:  0xF9E2,\n\t9572 - 7870:  0xF9E7,\n\t9573 - 7870:  0xF9F0,\n\t9574 - 7870:  0xF9DE,\n\t9575 - 7870:  0xF9ED,\n\t9576 - 7870:  0xF9F6,\n\t9577 - 7870:  0xF9E4,\n\t9578 - 7870:  0xF9EA,\n\t9579 - 7870:  0xF9F3,\n\t9580 - 7870:  0xF9E1,\n\t9581 - 7870:  0xF9FA,\n\t9582 - 7870:  0xF9FB,\n\t9583 - 7870:  0xF9FD,\n\t9584 - 7870:  0xF9FC,\n\t9585 - 7870:  0xA2AC,\n\t9586 - 7870:  0xA2AD,\n\t9587 - 7870:  0xA2AE,\n\t9588 - 7870:  0xA15A,\n\t9601 - 7870:  0xA262,\n\t9602 - 7870:  0xA263,\n\t9603 - 7870:  0xA264,\n\t9604 - 7870:  0xA265,\n\t9605 - 7870:  0xA266,\n\t9606 - 7870:  0xA267,\n\t9607 - 7870:  0xA268,\n\t9608 - 7870:  0xA269,\n\t9609 - 7870:  0xA270,\n\t9610 - 7870:  0xA26F,\n\t9611 - 7870:  0xA26E,\n\t9612 - 7870:  0xA26D,\n\t9613 - 7870:  0xA26C,\n\t9614 - 7870:  0xA26B,\n\t9615 - 7870:  0xA26A,\n\t9620 - 7870:  0xA276,\n\t9621 - 7870:  0xA279,\n\t9632 - 7870:  0xA1BD,\n\t9633 - 7870:  0xA1BC,\n\t9650 - 7870:  0xA1B6,\n\t9651 - 7870:  0xA1B5,\n\t9660 - 7870:  0xA1BF,\n\t9661 - 7870:  0xA1BE,\n\t9670 - 7870:  0xA1BB,\n\t9671 - 7870:  0xA1BA,\n\t9675 - 7870:  0xA1B3,\n\t9678 - 7870:  0xA1B7,\n\t9679 - 7870:  0xA1B4,\n\t9698 - 7870:  0xA2A8,\n\t9699 - 7870:  0xA2A9,\n\t9700 - 7870:  0xA2AB,\n\t9701 - 7870:  0xA2AA,\n\t9733 - 7870:  0xA1B9,\n\t9734 - 7870:  0xA1B8,\n\t9792 - 7870:  0xA1F0,\n\t9794 - 7870:  0xA1F1,\n\t10045 - 7870: 0xC6E6,\n}\n\nconst encode3Low, encode3High = 167, 1106\n\nvar encode3 = [...]uint16{\n\t167 - 167:  0xA1B1,\n\t168 - 167:  0xC6D8,\n\t175 - 167:  0xA1C2,\n\t176 - 167:  0xA258,\n\t177 - 167:  0xA1D3,\n\t183 - 167:  0xA150,\n\t192 - 167:  0x8859,\n\t193 - 167:  0x8857,\n\t200 - 167:  0x885D,\n\t201 - 167:  0x885B,\n\t202 - 167:  0x8866,\n\t210 - 167:  0x8861,\n\t211 - 167:  0x885F,\n\t215 - 167:  0xA1D1,\n\t224 - 167:  0x886A,\n\t225 - 167:  0x8868,\n\t232 - 167:  0x886F,\n\t233 - 167:  0x886D,\n\t234 - 167:  0x88A7,\n\t236 - 167:  0x8873,\n\t237 - 167:  0x8871,\n\t242 - 167:  0x8877,\n\t243 - 167:  0x8875,\n\t247 - 167:  0xA1D2,\n\t248 - 167:  0xC8FB,\n\t249 - 167:  0x887B,\n\t250 - 167:  0x8879,\n\t252 - 167:  0x88A2,\n\t256 - 167:  0x8856,\n\t257 - 167:  0x8867,\n\t274 - 167:  0x885A,\n\t275 - 167:  0x886C,\n\t282 - 167:  0x885C,\n\t283 - 167:  0x886E,\n\t299 - 167:  0x8870,\n\t331 - 167:  0xC8FC,\n\t332 - 167:  0x885E,\n\t333 - 167:  0x8874,\n\t339 - 167:  0xC8FA,\n\t363 - 167:  0x8878,\n\t461 - 167:  0x8858,\n\t462 - 167:  0x8869,\n\t464 - 167:  0x8872,\n\t465 - 167:  0x8860,\n\t466 - 167:  0x8876,\n\t468 - 167:  0x887A,\n\t470 - 167:  0x887C,\n\t472 - 167:  0x887D,\n\t474 - 167:  0x887E,\n\t476 - 167:  0x88A1,\n\t592 - 167:  0xC8F6,\n\t593 - 167:  0x886B,\n\t596 - 167:  0xC8F8,\n\t603 - 167:  0xC8F7,\n\t609 - 167:  0x88A8,\n\t618 - 167:  0xC8FE,\n\t629 - 167:  0xC8F9,\n\t643 - 167:  0xC8F5,\n\t650 - 167:  0xC8FD,\n\t710 - 167:  0xC6D9,\n\t711 - 167:  0xA3BE,\n\t713 - 167:  0xA3BC,\n\t714 - 167:  0xA3BD,\n\t715 - 167:  0xA3BF,\n\t717 - 167:  0xA1C5,\n\t729 - 167:  0xA3BB,\n\t913 - 167:  0xA344,\n\t914 - 167:  0xA345,\n\t915 - 167:  0xA346,\n\t916 - 167:  0xA347,\n\t917 - 167:  0xA348,\n\t918 - 167:  0xA349,\n\t919 - 167:  0xA34A,\n\t920 - 167:  0xA34B,\n\t921 - 167:  0xA34C,\n\t922 - 167:  0xA34D,\n\t923 - 167:  0xA34E,\n\t924 - 167:  0xA34F,\n\t925 - 167:  0xA350,\n\t926 - 167:  0xA351,\n\t927 - 167:  0xA352,\n\t928 - 167:  0xA353,\n\t929 - 167:  0xA354,\n\t931 - 167:  0xA355,\n\t932 - 167:  0xA356,\n\t933 - 167:  0xA357,\n\t934 - 167:  0xA358,\n\t935 - 167:  0xA359,\n\t936 - 167:  0xA35A,\n\t937 - 167:  0xA35B,\n\t945 - 167:  0xA35C,\n\t946 - 167:  0xA35D,\n\t947 - 167:  0xA35E,\n\t948 - 167:  0xA35F,\n\t949 - 167:  0xA360,\n\t950 - 167:  0xA361,\n\t951 - 167:  0xA362,\n\t952 - 167:  0xA363,\n\t953 - 167:  0xA364,\n\t954 - 167:  0xA365,\n\t955 - 167:  0xA366,\n\t956 - 167:  0xA367,\n\t957 - 167:  0xA368,\n\t958 - 167:  0xA369,\n\t959 - 167:  0xA36A,\n\t960 - 167:  0xA36B,\n\t961 - 167:  0xA36C,\n\t963 - 167:  0xA36D,\n\t964 - 167:  0xA36E,\n\t965 - 167:  0xA36F,\n\t966 - 167:  0xA370,\n\t967 - 167:  0xA371,\n\t968 - 167:  0xA372,\n\t969 - 167:  0xA373,\n\t1025 - 167: 0xC7F9,\n\t1040 - 167: 0xC7F3,\n\t1041 - 167: 0xC7F4,\n\t1042 - 167: 0xC7F5,\n\t1043 - 167: 0xC7F6,\n\t1044 - 167: 0xC7F7,\n\t1045 - 167: 0xC7F8,\n\t1046 - 167: 0xC7FA,\n\t1047 - 167: 0xC7FB,\n\t1048 - 167: 0xC7FC,\n\t1049 - 167: 0xC7FD,\n\t1050 - 167: 0xC7FE,\n\t1051 - 167: 0xC840,\n\t1052 - 167: 0xC841,\n\t1053 - 167: 0xC842,\n\t1054 - 167: 0xC843,\n\t1055 - 167: 0xC844,\n\t1056 - 167: 0xC845,\n\t1057 - 167: 0xC846,\n\t1058 - 167: 0xC847,\n\t1059 - 167: 0xC848,\n\t1060 - 167: 0xC849,\n\t1061 - 167: 0xC84A,\n\t1062 - 167: 0xC84B,\n\t1063 - 167: 0xC84C,\n\t1064 - 167: 0xC84D,\n\t1065 - 167: 0xC84E,\n\t1066 - 167: 0xC84F,\n\t1067 - 167: 0xC850,\n\t1068 - 167: 0xC851,\n\t1069 - 167: 0xC852,\n\t1070 - 167: 0xC853,\n\t1071 - 167: 0xC854,\n\t1072 - 167: 0xC855,\n\t1073 - 167: 0xC856,\n\t1074 - 167: 0xC857,\n\t1075 - 167: 0xC858,\n\t1076 - 167: 0xC859,\n\t1077 - 167: 0xC85A,\n\t1078 - 167: 0xC85C,\n\t1079 - 167: 0xC85D,\n\t1080 - 167: 0xC85E,\n\t1081 - 167: 0xC85F,\n\t1082 - 167: 0xC860,\n\t1083 - 167: 0xC861,\n\t1084 - 167: 0xC862,\n\t1085 - 167: 0xC863,\n\t1086 - 167: 0xC864,\n\t1087 - 167: 0xC865,\n\t1088 - 167: 0xC866,\n\t1089 - 167: 0xC867,\n\t1090 - 167: 0xC868,\n\t1091 - 167: 0xC869,\n\t1092 - 167: 0xC86A,\n\t1093 - 167: 0xC86B,\n\t1094 - 167: 0xC86C,\n\t1095 - 167: 0xC86D,\n\t1096 - 167: 0xC86E,\n\t1097 - 167: 0xC86F,\n\t1098 - 167: 0xC870,\n\t1099 - 167: 0xC871,\n\t1100 - 167: 0xC872,\n\t1101 - 167: 0xC873,\n\t1102 - 167: 0xC874,\n\t1103 - 167: 0xC875,\n\t1105 - 167: 0xC85B,\n}\n\nconst encode4Low, encode4High = 65072, 65518\n\nvar encode4 = [...]uint16{\n\t65072 - 65072: 0xA14A,\n\t65073 - 65072: 0xA157,\n\t65075 - 65072: 0xA159,\n\t65076 - 65072: 0xA15B,\n\t65077 - 65072: 0xA15F,\n\t65078 - 65072: 0xA160,\n\t65079 - 65072: 0xA163,\n\t65080 - 65072: 0xA164,\n\t65081 - 65072: 0xA167,\n\t65082 - 65072: 0xA168,\n\t65083 - 65072: 0xA16B,\n\t65084 - 65072: 0xA16C,\n\t65085 - 65072: 0xA16F,\n\t65086 - 65072: 0xA170,\n\t65087 - 65072: 0xA173,\n\t65088 - 65072: 0xA174,\n\t65089 - 65072: 0xA177,\n\t65090 - 65072: 0xA178,\n\t65091 - 65072: 0xA17B,\n\t65092 - 65072: 0xA17C,\n\t65097 - 65072: 0xA1C6,\n\t65098 - 65072: 0xA1C7,\n\t65099 - 65072: 0xA1CA,\n\t65100 - 65072: 0xA1CB,\n\t65101 - 65072: 0xA1C8,\n\t65102 - 65072: 0xA1C9,\n\t65103 - 65072: 0xA15C,\n\t65104 - 65072: 0xA14D,\n\t65105 - 65072: 0xA14E,\n\t65106 - 65072: 0xA14F,\n\t65108 - 65072: 0xA151,\n\t65109 - 65072: 0xA152,\n\t65110 - 65072: 0xA153,\n\t65111 - 65072: 0xA154,\n\t65113 - 65072: 0xA17D,\n\t65114 - 65072: 0xA17E,\n\t65115 - 65072: 0xA1A1,\n\t65116 - 65072: 0xA1A2,\n\t65117 - 65072: 0xA1A3,\n\t65118 - 65072: 0xA1A4,\n\t65119 - 65072: 0xA1CC,\n\t65120 - 65072: 0xA1CD,\n\t65121 - 65072: 0xA1CE,\n\t65122 - 65072: 0xA1DE,\n\t65123 - 65072: 0xA1DF,\n\t65124 - 65072: 0xA1E0,\n\t65125 - 65072: 0xA1E1,\n\t65126 - 65072: 0xA1E2,\n\t65128 - 65072: 0xA242,\n\t65129 - 65072: 0xA24C,\n\t65130 - 65072: 0xA24D,\n\t65131 - 65072: 0xA24E,\n\t65281 - 65072: 0xA149,\n\t65282 - 65072: 0xC8D0,\n\t65283 - 65072: 0xA1AD,\n\t65284 - 65072: 0xA243,\n\t65285 - 65072: 0xA248,\n\t65286 - 65072: 0xA1AE,\n\t65287 - 65072: 0xC8CF,\n\t65288 - 65072: 0xA15D,\n\t65289 - 65072: 0xA15E,\n\t65290 - 65072: 0xA1AF,\n\t65291 - 65072: 0xA1CF,\n\t65292 - 65072: 0xA141,\n\t65293 - 65072: 0xA1D0,\n\t65294 - 65072: 0xA144,\n\t65295 - 65072: 0xA1FE,\n\t65296 - 65072: 0xA2AF,\n\t65297 - 65072: 0xA2B0,\n\t65298 - 65072: 0xA2B1,\n\t65299 - 65072: 0xA2B2,\n\t65300 - 65072: 0xA2B3,\n\t65301 - 65072: 0xA2B4,\n\t65302 - 65072: 0xA2B5,\n\t65303 - 65072: 0xA2B6,\n\t65304 - 65072: 0xA2B7,\n\t65305 - 65072: 0xA2B8,\n\t65306 - 65072: 0xA147,\n\t65307 - 65072: 0xA146,\n\t65308 - 65072: 0xA1D5,\n\t65309 - 65072: 0xA1D7,\n\t65310 - 65072: 0xA1D6,\n\t65311 - 65072: 0xA148,\n\t65312 - 65072: 0xA249,\n\t65313 - 65072: 0xA2CF,\n\t65314 - 65072: 0xA2D0,\n\t65315 - 65072: 0xA2D1,\n\t65316 - 65072: 0xA2D2,\n\t65317 - 65072: 0xA2D3,\n\t65318 - 65072: 0xA2D4,\n\t65319 - 65072: 0xA2D5,\n\t65320 - 65072: 0xA2D6,\n\t65321 - 65072: 0xA2D7,\n\t65322 - 65072: 0xA2D8,\n\t65323 - 65072: 0xA2D9,\n\t65324 - 65072: 0xA2DA,\n\t65325 - 65072: 0xA2DB,\n\t65326 - 65072: 0xA2DC,\n\t65327 - 65072: 0xA2DD,\n\t65328 - 65072: 0xA2DE,\n\t65329 - 65072: 0xA2DF,\n\t65330 - 65072: 0xA2E0,\n\t65331 - 65072: 0xA2E1,\n\t65332 - 65072: 0xA2E2,\n\t65333 - 65072: 0xA2E3,\n\t65334 - 65072: 0xA2E4,\n\t65335 - 65072: 0xA2E5,\n\t65336 - 65072: 0xA2E6,\n\t65337 - 65072: 0xA2E7,\n\t65338 - 65072: 0xA2E8,\n\t65339 - 65072: 0xC6E4,\n\t65340 - 65072: 0xA240,\n\t65341 - 65072: 0xC6E5,\n\t65343 - 65072: 0xA1C4,\n\t65345 - 65072: 0xA2E9,\n\t65346 - 65072: 0xA2EA,\n\t65347 - 65072: 0xA2EB,\n\t65348 - 65072: 0xA2EC,\n\t65349 - 65072: 0xA2ED,\n\t65350 - 65072: 0xA2EE,\n\t65351 - 65072: 0xA2EF,\n\t65352 - 65072: 0xA2F0,\n\t65353 - 65072: 0xA2F1,\n\t65354 - 65072: 0xA2F2,\n\t65355 - 65072: 0xA2F3,\n\t65356 - 65072: 0xA2F4,\n\t65357 - 65072: 0xA2F5,\n\t65358 - 65072: 0xA2F6,\n\t65359 - 65072: 0xA2F7,\n\t65360 - 65072: 0xA2F8,\n\t65361 - 65072: 0xA2F9,\n\t65362 - 65072: 0xA2FA,\n\t65363 - 65072: 0xA2FB,\n\t65364 - 65072: 0xA2FC,\n\t65365 - 65072: 0xA2FD,\n\t65366 - 65072: 0xA2FE,\n\t65367 - 65072: 0xA340,\n\t65368 - 65072: 0xA341,\n\t65369 - 65072: 0xA342,\n\t65370 - 65072: 0xA343,\n\t65371 - 65072: 0xA161,\n\t65372 - 65072: 0xA155,\n\t65373 - 65072: 0xA162,\n\t65374 - 65072: 0xA1E3,\n\t65504 - 65072: 0xA246,\n\t65505 - 65072: 0xA247,\n\t65506 - 65072: 0xC8CD,\n\t65507 - 65072: 0xA1C3,\n\t65508 - 65072: 0xC8CE,\n\t65509 - 65072: 0xA244,\n\t65517 - 65072: 0xF9FE,\n}\n\nconst encode5Low, encode5High = 194597, 195029\n\nvar encode5 = [...]uint16{\n\t194597 - 194597: 0x9874,\n\t194619 - 194597: 0x9AC8,\n\t194624 - 194597: 0xA047,\n\t194680 - 194597: 0x8BC3,\n\t194708 - 194597: 0xFC48,\n\t194726 - 194597: 0xFC77,\n\t194765 - 194597: 0x9C52,\n\t194964 - 194597: 0x8EFD,\n\t194994 - 194597: 0x8FA8,\n\t195004 - 194597: 0x957A,\n\t195028 - 194597: 0x8FF0,\n}\n\nconst encode6Low, encode6High = 63751, 64014\n\nvar encode6 = [...]uint16{\n\t63751 - 63751: 0x8BF8,\n\t64012 - 63751: 0xC94A,\n\t64013 - 63751: 0xDDFC,\n}\n\nconst encode7Low, encode7High = 175615, 175616\n\nvar encode7 = [...]uint16{\n\t175615 - 175615: 0x87DC,\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/unicode/override.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage unicode\n\nimport (\n\t\"golang.org/x/text/transform\"\n)\n\n// BOMOverride returns a new decoder transformer that is identical to fallback,\n// except that the presence of a Byte Order Mark at the start of the input\n// causes it to switch to the corresponding Unicode decoding. It will only\n// consider BOMs for UTF-8, UTF-16BE, and UTF-16LE.\n//\n// This differs from using ExpectBOM by allowing a BOM to switch to UTF-8, not\n// just UTF-16 variants, and allowing falling back to any encoding scheme.\n//\n// This technique is recommended by the W3C for use in HTML 5: \"For\n// compatibility with deployed content, the byte order mark (also known as BOM)\n// is considered more authoritative than anything else.\"\n// http://www.w3.org/TR/encoding/#specification-hooks\n//\n// Using BOMOverride is mostly intended for use cases where the first characters\n// of a fallback encoding are known to not be a BOM, for example, for valid HTML\n// and most encodings.\nfunc BOMOverride(fallback transform.Transformer) transform.Transformer {\n\t// TODO: possibly allow a variadic argument of unicode encodings to allow\n\t// specifying details of which fallbacks are supported as well as\n\t// specifying the details of the implementations. This would also allow for\n\t// support for UTF-32, which should not be supported by default.\n\treturn &bomOverride{fallback: fallback}\n}\n\ntype bomOverride struct {\n\tfallback transform.Transformer\n\tcurrent  transform.Transformer\n}\n\nfunc (d *bomOverride) Reset() {\n\td.current = nil\n\td.fallback.Reset()\n}\n\nvar (\n\t// TODO: we could use decode functions here, instead of allocating a new\n\t// decoder on every NewDecoder as IgnoreBOM decoders can be stateless.\n\tutf16le = UTF16(LittleEndian, IgnoreBOM)\n\tutf16be = UTF16(BigEndian, IgnoreBOM)\n)\n\nconst utf8BOM = \"\\ufeff\"\n\nfunc (d *bomOverride) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tif d.current != nil {\n\t\treturn d.current.Transform(dst, src, atEOF)\n\t}\n\tif len(src) < 3 && !atEOF {\n\t\treturn 0, 0, transform.ErrShortSrc\n\t}\n\td.current = d.fallback\n\tbomSize := 0\n\tif len(src) >= 2 {\n\t\tif src[0] == 0xFF && src[1] == 0xFE {\n\t\t\td.current = utf16le.NewDecoder()\n\t\t\tbomSize = 2\n\t\t} else if src[0] == 0xFE && src[1] == 0xFF {\n\t\t\td.current = utf16be.NewDecoder()\n\t\t\tbomSize = 2\n\t\t} else if len(src) >= 3 &&\n\t\t\tsrc[0] == utf8BOM[0] &&\n\t\t\tsrc[1] == utf8BOM[1] &&\n\t\t\tsrc[2] == utf8BOM[2] {\n\t\t\td.current = transform.Nop\n\t\t\tbomSize = 3\n\t\t}\n\t}\n\tif bomSize < len(src) {\n\t\tnDst, nSrc, err = d.current.Transform(dst, src[bomSize:], atEOF)\n\t}\n\treturn nDst, nSrc + bomSize, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/encoding/unicode/unicode.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package unicode provides Unicode encodings such as UTF-16.\npackage unicode // import \"golang.org/x/text/encoding/unicode\"\n\nimport (\n\t\"errors\"\n\t\"unicode/utf16\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/encoding\"\n\t\"golang.org/x/text/encoding/internal\"\n\t\"golang.org/x/text/encoding/internal/identifier\"\n\t\"golang.org/x/text/internal/utf8internal\"\n\t\"golang.org/x/text/runes\"\n\t\"golang.org/x/text/transform\"\n)\n\n// TODO: I think the Transformers really should return errors on unmatched\n// surrogate pairs and odd numbers of bytes. This is not required by RFC 2781,\n// which leaves it open, but is suggested by WhatWG. It will allow for all error\n// modes as defined by WhatWG: fatal, HTML and Replacement. This would require\n// the introduction of some kind of error type for conveying the erroneous code\n// point.\n\n// UTF8 is the UTF-8 encoding.\nvar UTF8 encoding.Encoding = utf8enc\n\nvar utf8enc = &internal.Encoding{\n\t&internal.SimpleEncoding{utf8Decoder{}, runes.ReplaceIllFormed()},\n\t\"UTF-8\",\n\tidentifier.UTF8,\n}\n\ntype utf8Decoder struct{ transform.NopResetter }\n\nfunc (utf8Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tvar pSrc int // point from which to start copy in src\n\tvar accept utf8internal.AcceptRange\n\n\t// The decoder can only make the input larger, not smaller.\n\tn := len(src)\n\tif len(dst) < n {\n\t\terr = transform.ErrShortDst\n\t\tn = len(dst)\n\t\tatEOF = false\n\t}\n\tfor nSrc < n {\n\t\tc := src[nSrc]\n\t\tif c < utf8.RuneSelf {\n\t\t\tnSrc++\n\t\t\tcontinue\n\t\t}\n\t\tfirst := utf8internal.First[c]\n\t\tsize := int(first & utf8internal.SizeMask)\n\t\tif first == utf8internal.FirstInvalid {\n\t\t\tgoto handleInvalid // invalid starter byte\n\t\t}\n\t\taccept = utf8internal.AcceptRanges[first>>utf8internal.AcceptShift]\n\t\tif nSrc+size > n {\n\t\t\tif !atEOF {\n\t\t\t\t// We may stop earlier than necessary here if the short sequence\n\t\t\t\t// has invalid bytes. Not checking for this simplifies the code\n\t\t\t\t// and may avoid duplicate computations in certain conditions.\n\t\t\t\tif err == nil {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Determine the maximal subpart of an ill-formed subsequence.\n\t\t\tswitch {\n\t\t\tcase nSrc+1 >= n || src[nSrc+1] < accept.Lo || accept.Hi < src[nSrc+1]:\n\t\t\t\tsize = 1\n\t\t\tcase nSrc+2 >= n || src[nSrc+2] < utf8internal.LoCB || utf8internal.HiCB < src[nSrc+2]:\n\t\t\t\tsize = 2\n\t\t\tdefault:\n\t\t\t\tsize = 3 // As we are short, the maximum is 3.\n\t\t\t}\n\t\t\tgoto handleInvalid\n\t\t}\n\t\tif c = src[nSrc+1]; c < accept.Lo || accept.Hi < c {\n\t\t\tsize = 1\n\t\t\tgoto handleInvalid // invalid continuation byte\n\t\t} else if size == 2 {\n\t\t} else if c = src[nSrc+2]; c < utf8internal.LoCB || utf8internal.HiCB < c {\n\t\t\tsize = 2\n\t\t\tgoto handleInvalid // invalid continuation byte\n\t\t} else if size == 3 {\n\t\t} else if c = src[nSrc+3]; c < utf8internal.LoCB || utf8internal.HiCB < c {\n\t\t\tsize = 3\n\t\t\tgoto handleInvalid // invalid continuation byte\n\t\t}\n\t\tnSrc += size\n\t\tcontinue\n\n\thandleInvalid:\n\t\t// Copy the scanned input so far.\n\t\tnDst += copy(dst[nDst:], src[pSrc:nSrc])\n\n\t\t// Append RuneError to the destination.\n\t\tconst runeError = \"\\ufffd\"\n\t\tif nDst+len(runeError) > len(dst) {\n\t\t\treturn nDst, nSrc, transform.ErrShortDst\n\t\t}\n\t\tnDst += copy(dst[nDst:], runeError)\n\n\t\t// Skip the maximal subpart of an ill-formed subsequence according to\n\t\t// the W3C standard way instead of the Go way. This Transform is\n\t\t// probably the only place in the text repo where it is warranted.\n\t\tnSrc += size\n\t\tpSrc = nSrc\n\n\t\t// Recompute the maximum source length.\n\t\tif sz := len(dst) - nDst; sz < len(src)-nSrc {\n\t\t\terr = transform.ErrShortDst\n\t\t\tn = nSrc + sz\n\t\t\tatEOF = false\n\t\t}\n\t}\n\treturn nDst + copy(dst[nDst:], src[pSrc:nSrc]), nSrc, err\n}\n\n// UTF16 returns a UTF-16 Encoding for the given default endianness and byte\n// order mark (BOM) policy.\n//\n// When decoding from UTF-16 to UTF-8, if the BOMPolicy is IgnoreBOM then\n// neither BOMs U+FEFF nor noncharacters U+FFFE in the input stream will affect\n// the endianness used for decoding, and will instead be output as their\n// standard UTF-8 encodings: \"\\xef\\xbb\\xbf\" and \"\\xef\\xbf\\xbe\". If the BOMPolicy\n// is UseBOM or ExpectBOM a staring BOM is not written to the UTF-8 output.\n// Instead, it overrides the default endianness e for the remainder of the\n// transformation. Any subsequent BOMs U+FEFF or noncharacters U+FFFE will not\n// affect the endianness used, and will instead be output as their standard\n// UTF-8 encodings. For UseBOM, if there is no starting BOM, it will proceed\n// with the default Endianness. For ExpectBOM, in that case, the transformation\n// will return early with an ErrMissingBOM error.\n//\n// When encoding from UTF-8 to UTF-16, a BOM will be inserted at the start of\n// the output if the BOMPolicy is UseBOM or ExpectBOM. Otherwise, a BOM will not\n// be inserted. The UTF-8 input does not need to contain a BOM.\n//\n// There is no concept of a 'native' endianness. If the UTF-16 data is produced\n// and consumed in a greater context that implies a certain endianness, use\n// IgnoreBOM. Otherwise, use ExpectBOM and always produce and consume a BOM.\n//\n// In the language of http://www.unicode.org/faq/utf_bom.html#bom10, IgnoreBOM\n// corresponds to \"Where the precise type of the data stream is known... the\n// BOM should not be used\" and ExpectBOM corresponds to \"A particular\n// protocol... may require use of the BOM\".\nfunc UTF16(e Endianness, b BOMPolicy) encoding.Encoding {\n\treturn utf16Encoding{config{e, b}, mibValue[e][b&bomMask]}\n}\n\n// mibValue maps Endianness and BOMPolicy settings to MIB constants. Note that\n// some configurations map to the same MIB identifier. RFC 2781 has requirements\n// and recommendations. Some of the \"configurations\" are merely recommendations,\n// so multiple configurations could match.\nvar mibValue = map[Endianness][numBOMValues]identifier.MIB{\n\tBigEndian: [numBOMValues]identifier.MIB{\n\t\tIgnoreBOM: identifier.UTF16BE,\n\t\tUseBOM:    identifier.UTF16, // BigEnding default is preferred by RFC 2781.\n\t\t// TODO: acceptBOM | strictBOM would map to UTF16BE as well.\n\t},\n\tLittleEndian: [numBOMValues]identifier.MIB{\n\t\tIgnoreBOM: identifier.UTF16LE,\n\t\tUseBOM:    identifier.UTF16, // LittleEndian default is allowed and preferred on Windows.\n\t\t// TODO: acceptBOM | strictBOM would map to UTF16LE as well.\n\t},\n\t// ExpectBOM is not widely used and has no valid MIB identifier.\n}\n\n// All lists a configuration for each IANA-defined UTF-16 variant.\nvar All = []encoding.Encoding{\n\tUTF8,\n\tUTF16(BigEndian, UseBOM),\n\tUTF16(BigEndian, IgnoreBOM),\n\tUTF16(LittleEndian, IgnoreBOM),\n}\n\n// BOMPolicy is a UTF-16 encoding's byte order mark policy.\ntype BOMPolicy uint8\n\nconst (\n\twriteBOM   BOMPolicy = 0x01\n\tacceptBOM  BOMPolicy = 0x02\n\trequireBOM BOMPolicy = 0x04\n\tbomMask    BOMPolicy = 0x07\n\n\t// HACK: numBOMValues == 8 triggers a bug in the 1.4 compiler (cannot have a\n\t// map of an array of length 8 of a type that is also used as a key or value\n\t// in another map). See golang.org/issue/11354.\n\t// TODO: consider changing this value back to 8 if the use of 1.4.* has\n\t// been minimized.\n\tnumBOMValues = 8 + 1\n\n\t// IgnoreBOM means to ignore any byte order marks.\n\tIgnoreBOM BOMPolicy = 0\n\t// Common and RFC 2781-compliant interpretation for UTF-16BE/LE.\n\n\t// UseBOM means that the UTF-16 form may start with a byte order mark, which\n\t// will be used to override the default encoding.\n\tUseBOM BOMPolicy = writeBOM | acceptBOM\n\t// Common and RFC 2781-compliant interpretation for UTF-16.\n\n\t// ExpectBOM means that the UTF-16 form must start with a byte order mark,\n\t// which will be used to override the default encoding.\n\tExpectBOM BOMPolicy = writeBOM | acceptBOM | requireBOM\n\t// Used in Java as Unicode (not to be confused with Java's UTF-16) and\n\t// ICU's UTF-16,version=1. Not compliant with RFC 2781.\n\n\t// TODO (maybe): strictBOM: BOM must match Endianness. This would allow:\n\t// - UTF-16(B|L)E,version=1: writeBOM | acceptBOM | requireBOM | strictBOM\n\t//    (UnicodeBig and UnicodeLittle in Java)\n\t// - RFC 2781-compliant, but less common interpretation for UTF-16(B|L)E:\n\t//    acceptBOM | strictBOM (e.g. assigned to CheckBOM).\n\t// This addition would be consistent with supporting ExpectBOM.\n)\n\n// Endianness is a UTF-16 encoding's default endianness.\ntype Endianness bool\n\nconst (\n\t// BigEndian is UTF-16BE.\n\tBigEndian Endianness = false\n\t// LittleEndian is UTF-16LE.\n\tLittleEndian Endianness = true\n)\n\n// ErrMissingBOM means that decoding UTF-16 input with ExpectBOM did not find a\n// starting byte order mark.\nvar ErrMissingBOM = errors.New(\"encoding: missing byte order mark\")\n\ntype utf16Encoding struct {\n\tconfig\n\tmib identifier.MIB\n}\n\ntype config struct {\n\tendianness Endianness\n\tbomPolicy  BOMPolicy\n}\n\nfunc (u utf16Encoding) NewDecoder() *encoding.Decoder {\n\treturn &encoding.Decoder{Transformer: &utf16Decoder{\n\t\tinitial: u.config,\n\t\tcurrent: u.config,\n\t}}\n}\n\nfunc (u utf16Encoding) NewEncoder() *encoding.Encoder {\n\treturn &encoding.Encoder{Transformer: &utf16Encoder{\n\t\tendianness:       u.endianness,\n\t\tinitialBOMPolicy: u.bomPolicy,\n\t\tcurrentBOMPolicy: u.bomPolicy,\n\t}}\n}\n\nfunc (u utf16Encoding) ID() (mib identifier.MIB, other string) {\n\treturn u.mib, \"\"\n}\n\nfunc (u utf16Encoding) String() string {\n\te, b := \"B\", \"\"\n\tif u.endianness == LittleEndian {\n\t\te = \"L\"\n\t}\n\tswitch u.bomPolicy {\n\tcase ExpectBOM:\n\t\tb = \"Expect\"\n\tcase UseBOM:\n\t\tb = \"Use\"\n\tcase IgnoreBOM:\n\t\tb = \"Ignore\"\n\t}\n\treturn \"UTF-16\" + e + \"E (\" + b + \" BOM)\"\n}\n\ntype utf16Decoder struct {\n\tinitial config\n\tcurrent config\n}\n\nfunc (u *utf16Decoder) Reset() {\n\tu.current = u.initial\n}\n\nfunc (u *utf16Decoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tif len(src) == 0 {\n\t\tif atEOF && u.current.bomPolicy&requireBOM != 0 {\n\t\t\treturn 0, 0, ErrMissingBOM\n\t\t}\n\t\treturn 0, 0, nil\n\t}\n\tif u.current.bomPolicy&acceptBOM != 0 {\n\t\tif len(src) < 2 {\n\t\t\treturn 0, 0, transform.ErrShortSrc\n\t\t}\n\t\tswitch {\n\t\tcase src[0] == 0xfe && src[1] == 0xff:\n\t\t\tu.current.endianness = BigEndian\n\t\t\tnSrc = 2\n\t\tcase src[0] == 0xff && src[1] == 0xfe:\n\t\t\tu.current.endianness = LittleEndian\n\t\t\tnSrc = 2\n\t\tdefault:\n\t\t\tif u.current.bomPolicy&requireBOM != 0 {\n\t\t\t\treturn 0, 0, ErrMissingBOM\n\t\t\t}\n\t\t}\n\t\tu.current.bomPolicy = IgnoreBOM\n\t}\n\n\tvar r rune\n\tvar dSize, sSize int\n\tfor nSrc < len(src) {\n\t\tif nSrc+1 < len(src) {\n\t\t\tx := uint16(src[nSrc+0])<<8 | uint16(src[nSrc+1])\n\t\t\tif u.current.endianness == LittleEndian {\n\t\t\t\tx = x>>8 | x<<8\n\t\t\t}\n\t\t\tr, sSize = rune(x), 2\n\t\t\tif utf16.IsSurrogate(r) {\n\t\t\t\tif nSrc+3 < len(src) {\n\t\t\t\t\tx = uint16(src[nSrc+2])<<8 | uint16(src[nSrc+3])\n\t\t\t\t\tif u.current.endianness == LittleEndian {\n\t\t\t\t\t\tx = x>>8 | x<<8\n\t\t\t\t\t}\n\t\t\t\t\t// Save for next iteration if it is not a high surrogate.\n\t\t\t\t\tif isHighSurrogate(rune(x)) {\n\t\t\t\t\t\tr, sSize = utf16.DecodeRune(r, rune(x)), 4\n\t\t\t\t\t}\n\t\t\t\t} else if !atEOF {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif dSize = utf8.RuneLen(r); dSize < 0 {\n\t\t\t\tr, dSize = utf8.RuneError, 3\n\t\t\t}\n\t\t} else if atEOF {\n\t\t\t// Single trailing byte.\n\t\t\tr, dSize, sSize = utf8.RuneError, 3, 1\n\t\t} else {\n\t\t\terr = transform.ErrShortSrc\n\t\t\tbreak\n\t\t}\n\t\tif nDst+dSize > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tnDst += utf8.EncodeRune(dst[nDst:], r)\n\t\tnSrc += sSize\n\t}\n\treturn nDst, nSrc, err\n}\n\nfunc isHighSurrogate(r rune) bool {\n\treturn 0xDC00 <= r && r <= 0xDFFF\n}\n\ntype utf16Encoder struct {\n\tendianness       Endianness\n\tinitialBOMPolicy BOMPolicy\n\tcurrentBOMPolicy BOMPolicy\n}\n\nfunc (u *utf16Encoder) Reset() {\n\tu.currentBOMPolicy = u.initialBOMPolicy\n}\n\nfunc (u *utf16Encoder) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tif u.currentBOMPolicy&writeBOM != 0 {\n\t\tif len(dst) < 2 {\n\t\t\treturn 0, 0, transform.ErrShortDst\n\t\t}\n\t\tdst[0], dst[1] = 0xfe, 0xff\n\t\tu.currentBOMPolicy = IgnoreBOM\n\t\tnDst = 2\n\t}\n\n\tr, size := rune(0), 0\n\tfor nSrc < len(src) {\n\t\tr = rune(src[nSrc])\n\n\t\t// Decode a 1-byte rune.\n\t\tif r < utf8.RuneSelf {\n\t\t\tsize = 1\n\n\t\t} else {\n\t\t\t// Decode a multi-byte rune.\n\t\t\tr, size = utf8.DecodeRune(src[nSrc:])\n\t\t\tif size == 1 {\n\t\t\t\t// All valid runes of size 1 (those below utf8.RuneSelf) were\n\t\t\t\t// handled above. We have invalid UTF-8 or we haven't seen the\n\t\t\t\t// full character yet.\n\t\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif r <= 0xffff {\n\t\t\tif nDst+2 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst+0] = uint8(r >> 8)\n\t\t\tdst[nDst+1] = uint8(r)\n\t\t\tnDst += 2\n\t\t} else {\n\t\t\tif nDst+4 > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tr1, r2 := utf16.EncodeRune(r)\n\t\t\tdst[nDst+0] = uint8(r1 >> 8)\n\t\t\tdst[nDst+1] = uint8(r1)\n\t\t\tdst[nDst+2] = uint8(r2 >> 8)\n\t\t\tdst[nDst+3] = uint8(r2)\n\t\t\tnDst += 4\n\t\t}\n\t\tnSrc += size\n\t}\n\n\tif u.endianness == LittleEndian {\n\t\tfor i := 0; i < nDst; i += 2 {\n\t\t\tdst[i], dst[i+1] = dst[i+1], dst[i]\n\t\t}\n\t}\n\treturn nDst, nSrc, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/internal/tag/tag.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package tag contains functionality handling tags and related data.\npackage tag // import \"golang.org/x/text/internal/tag\"\n\nimport \"sort\"\n\n// An Index converts tags to a compact numeric value.\n//\n// All elements are of size 4. Tags may be up to 4 bytes long. Excess bytes can\n// be used to store additional information about the tag.\ntype Index string\n\n// Elem returns the element data at the given index.\nfunc (s Index) Elem(x int) string {\n\treturn string(s[x*4 : x*4+4])\n}\n\n// Index reports the index of the given key or -1 if it could not be found.\n// Only the first len(key) bytes from the start of the 4-byte entries will be\n// considered for the search and the first match in Index will be returned.\nfunc (s Index) Index(key []byte) int {\n\tn := len(key)\n\t// search the index of the first entry with an equal or higher value than\n\t// key in s.\n\tindex := sort.Search(len(s)/4, func(i int) bool {\n\t\treturn cmp(s[i*4:i*4+n], key) != -1\n\t})\n\ti := index * 4\n\tif cmp(s[i:i+len(key)], key) != 0 {\n\t\treturn -1\n\t}\n\treturn index\n}\n\n// Next finds the next occurrence of key after index x, which must have been\n// obtained from a call to Index using the same key. It returns x+1 or -1.\nfunc (s Index) Next(key []byte, x int) int {\n\tif x++; x*4 < len(s) && cmp(s[x*4:x*4+len(key)], key) == 0 {\n\t\treturn x\n\t}\n\treturn -1\n}\n\n// cmp returns an integer comparing a and b lexicographically.\nfunc cmp(a Index, b []byte) int {\n\tn := len(a)\n\tif len(b) < n {\n\t\tn = len(b)\n\t}\n\tfor i, c := range b[:n] {\n\t\tswitch {\n\t\tcase a[i] > c:\n\t\t\treturn 1\n\t\tcase a[i] < c:\n\t\t\treturn -1\n\t\t}\n\t}\n\tswitch {\n\tcase len(a) < len(b):\n\t\treturn -1\n\tcase len(a) > len(b):\n\t\treturn 1\n\t}\n\treturn 0\n}\n\n// Compare returns an integer comparing a and b lexicographically.\nfunc Compare(a string, b []byte) int {\n\treturn cmp(Index(a), b)\n}\n\n// FixCase reformats b to the same pattern of cases as form.\n// If returns false if string b is malformed.\nfunc FixCase(form string, b []byte) bool {\n\tif len(form) != len(b) {\n\t\treturn false\n\t}\n\tfor i, c := range b {\n\t\tif form[i] <= 'Z' {\n\t\t\tif c >= 'a' {\n\t\t\t\tc -= 'z' - 'Z'\n\t\t\t}\n\t\t\tif c < 'A' || 'Z' < c {\n\t\t\t\treturn false\n\t\t\t}\n\t\t} else {\n\t\t\tif c <= 'Z' {\n\t\t\t\tc += 'z' - 'Z'\n\t\t\t}\n\t\t\tif c < 'a' || 'z' < c {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\tb[i] = c\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/internal/utf8internal/utf8internal.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package utf8internal contains low-level utf8-related constants, tables, etc.\n// that are used internally by the text package.\npackage utf8internal\n\n// The default lowest and highest continuation byte.\nconst (\n\tLoCB = 0x80 // 1000 0000\n\tHiCB = 0xBF // 1011 1111\n)\n\n// Constants related to getting information of first bytes of UTF-8 sequences.\nconst (\n\t// ASCII identifies a UTF-8 byte as ASCII.\n\tASCII = as\n\n\t// FirstInvalid indicates a byte is invalid as a first byte of a UTF-8\n\t// sequence.\n\tFirstInvalid = xx\n\n\t// SizeMask is a mask for the size bits. Use use x&SizeMask to get the size.\n\tSizeMask = 7\n\n\t// AcceptShift is the right-shift count for the first byte info byte to get\n\t// the index into the AcceptRanges table. See AcceptRanges.\n\tAcceptShift = 4\n\n\t// The names of these constants are chosen to give nice alignment in the\n\t// table below. The first nibble is an index into acceptRanges or F for\n\t// special one-byte cases. The second nibble is the Rune length or the\n\t// Status for the special one-byte case.\n\txx = 0xF1 // invalid: size 1\n\tas = 0xF0 // ASCII: size 1\n\ts1 = 0x02 // accept 0, size 2\n\ts2 = 0x13 // accept 1, size 3\n\ts3 = 0x03 // accept 0, size 3\n\ts4 = 0x23 // accept 2, size 3\n\ts5 = 0x34 // accept 3, size 4\n\ts6 = 0x04 // accept 0, size 4\n\ts7 = 0x44 // accept 4, size 4\n)\n\n// First is information about the first byte in a UTF-8 sequence.\nvar First = [256]uint8{\n\t//   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F\n\tas, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x70-0x7F\n\t//   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\n\txx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F\n\txx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F\n\txx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF\n\txx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF\n\txx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF\n\ts1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF\n\ts2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF\n\ts5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF\n}\n\n// AcceptRange gives the range of valid values for the second byte in a UTF-8\n// sequence for any value for First that is not ASCII or FirstInvalid.\ntype AcceptRange struct {\n\tLo uint8 // lowest value for second byte.\n\tHi uint8 // highest value for second byte.\n}\n\n// AcceptRanges is a slice of AcceptRange values. For a given byte sequence b\n//\n//\t\tAcceptRanges[First[b[0]]>>AcceptShift]\n//\n// will give the value of AcceptRange for the multi-byte UTF-8 sequence starting\n// at b[0].\nvar AcceptRanges = [...]AcceptRange{\n\t0: {LoCB, HiCB},\n\t1: {0xA0, HiCB},\n\t2: {LoCB, 0x9F},\n\t3: {0x90, HiCB},\n\t4: {LoCB, 0x8F},\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/Makefile",
    "content": "# Copyright 2013 The Go Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style\n# license that can be found in the LICENSE file.\n\nCLEANFILES+=maketables\n\nmaketables: maketables.go\n\tgo build $^\n\ntables:\tmaketables\n\t./maketables > tables.go\n\tgofmt -w -s tables.go\n\n# Build (but do not run) maketables during testing,\n# just to make sure it still compiles.\ntestshort: maketables\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/common.go",
    "content": "// This file was generated by go generate; DO NOT EDIT\n\npackage language\n\n// This file contains code common to the maketables.go and the package code.\n\n// langAliasType is the type of an alias in langAliasMap.\ntype langAliasType int8\n\nconst (\n\tlangDeprecated langAliasType = iota\n\tlangMacro\n\tlangLegacy\n\n\tlangAliasTypeUnknown langAliasType = -1\n)\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/coverage.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n)\n\n// The Coverage interface is used to define the level of coverage of an\n// internationalization service. Note that not all types are supported by all\n// services. As lists may be generated on the fly, it is recommended that users\n// of a Coverage cache the results.\ntype Coverage interface {\n\t// Tags returns the list of supported tags.\n\tTags() []Tag\n\n\t// BaseLanguages returns the list of supported base languages.\n\tBaseLanguages() []Base\n\n\t// Scripts returns the list of supported scripts.\n\tScripts() []Script\n\n\t// Regions returns the list of supported regions.\n\tRegions() []Region\n}\n\nvar (\n\t// Supported defines a Coverage that lists all supported subtags. Tags\n\t// always returns nil.\n\tSupported Coverage = allSubtags{}\n)\n\n// TODO:\n// - Support Variants, numbering systems.\n// - CLDR coverage levels.\n// - Set of common tags defined in this package.\n\ntype allSubtags struct{}\n\n// Regions returns the list of supported regions. As all regions are in a\n// consecutive range, it simply returns a slice of numbers in increasing order.\n// The \"undefined\" region is not returned.\nfunc (s allSubtags) Regions() []Region {\n\treg := make([]Region, numRegions)\n\tfor i := range reg {\n\t\treg[i] = Region{regionID(i + 1)}\n\t}\n\treturn reg\n}\n\n// Scripts returns the list of supported scripts. As all scripts are in a\n// consecutive range, it simply returns a slice of numbers in increasing order.\n// The \"undefined\" script is not returned.\nfunc (s allSubtags) Scripts() []Script {\n\tscr := make([]Script, numScripts)\n\tfor i := range scr {\n\t\tscr[i] = Script{scriptID(i + 1)}\n\t}\n\treturn scr\n}\n\n// BaseLanguages returns the list of all supported base languages. It generates\n// the list by traversing the internal structures.\nfunc (s allSubtags) BaseLanguages() []Base {\n\tbase := make([]Base, 0, numLanguages)\n\tfor i := 0; i < langNoIndexOffset; i++ {\n\t\t// We included \"und\" already for the value 0.\n\t\tif i != nonCanonicalUnd {\n\t\t\tbase = append(base, Base{langID(i)})\n\t\t}\n\t}\n\ti := langNoIndexOffset\n\tfor _, v := range langNoIndex {\n\t\tfor k := 0; k < 8; k++ {\n\t\t\tif v&1 == 1 {\n\t\t\t\tbase = append(base, Base{langID(i)})\n\t\t\t}\n\t\t\tv >>= 1\n\t\t\ti++\n\t\t}\n\t}\n\treturn base\n}\n\n// Tags always returns nil.\nfunc (s allSubtags) Tags() []Tag {\n\treturn nil\n}\n\n// coverage is used used by NewCoverage which is used as a convenient way for\n// creating Coverage implementations for partially defined data. Very often a\n// package will only need to define a subset of slices. coverage provides a\n// convenient way to do this. Moreover, packages using NewCoverage, instead of\n// their own implementation, will not break if later new slice types are added.\ntype coverage struct {\n\ttags    func() []Tag\n\tbases   func() []Base\n\tscripts func() []Script\n\tregions func() []Region\n}\n\nfunc (s *coverage) Tags() []Tag {\n\tif s.tags == nil {\n\t\treturn nil\n\t}\n\treturn s.tags()\n}\n\n// bases implements sort.Interface and is used to sort base languages.\ntype bases []Base\n\nfunc (b bases) Len() int {\n\treturn len(b)\n}\n\nfunc (b bases) Swap(i, j int) {\n\tb[i], b[j] = b[j], b[i]\n}\n\nfunc (b bases) Less(i, j int) bool {\n\treturn b[i].langID < b[j].langID\n}\n\n// BaseLanguages returns the result from calling s.bases if it is specified or\n// otherwise derives the set of supported base languages from tags.\nfunc (s *coverage) BaseLanguages() []Base {\n\tif s.bases == nil {\n\t\ttags := s.Tags()\n\t\tif len(tags) == 0 {\n\t\t\treturn nil\n\t\t}\n\t\ta := make([]Base, len(tags))\n\t\tfor i, t := range tags {\n\t\t\ta[i] = Base{langID(t.lang)}\n\t\t}\n\t\tsort.Sort(bases(a))\n\t\tk := 0\n\t\tfor i := 1; i < len(a); i++ {\n\t\t\tif a[k] != a[i] {\n\t\t\t\tk++\n\t\t\t\ta[k] = a[i]\n\t\t\t}\n\t\t}\n\t\treturn a[:k+1]\n\t}\n\treturn s.bases()\n}\n\nfunc (s *coverage) Scripts() []Script {\n\tif s.scripts == nil {\n\t\treturn nil\n\t}\n\treturn s.scripts()\n}\n\nfunc (s *coverage) Regions() []Region {\n\tif s.regions == nil {\n\t\treturn nil\n\t}\n\treturn s.regions()\n}\n\n// NewCoverage returns a Coverage for the given lists. It is typically used by\n// packages providing internationalization services to define their level of\n// coverage. A list may be of type []T or func() []T, where T is either Tag,\n// Base, Script or Region. The returned Coverage derives the value for Bases\n// from Tags if no func or slice for []Base is specified. For other unspecified\n// types the returned Coverage will return nil for the respective methods.\nfunc NewCoverage(list ...interface{}) Coverage {\n\ts := &coverage{}\n\tfor _, x := range list {\n\t\tswitch v := x.(type) {\n\t\tcase func() []Base:\n\t\t\ts.bases = v\n\t\tcase func() []Script:\n\t\t\ts.scripts = v\n\t\tcase func() []Region:\n\t\t\ts.regions = v\n\t\tcase func() []Tag:\n\t\t\ts.tags = v\n\t\tcase []Base:\n\t\t\ts.bases = func() []Base { return v }\n\t\tcase []Script:\n\t\t\ts.scripts = func() []Script { return v }\n\t\tcase []Region:\n\t\t\ts.regions = func() []Region { return v }\n\t\tcase []Tag:\n\t\t\ts.tags = func() []Tag { return v }\n\t\tdefault:\n\t\t\tpanic(fmt.Sprintf(\"language: unsupported set type %T\", v))\n\t\t}\n\t}\n\treturn s\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/gen_common.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\n// This file contains code common to the maketables.go and the package code.\n\n// langAliasType is the type of an alias in langAliasMap.\ntype langAliasType int8\n\nconst (\n\tlangDeprecated langAliasType = iota\n\tlangMacro\n\tlangLegacy\n\n\tlangAliasTypeUnknown langAliasType = -1\n)\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/gen_index.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\npackage main\n\n// This file generates derivative tables based on the language package itself.\n\nimport (\n\t\"bytes\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"golang.org/x/text/internal/gen\"\n\t\"golang.org/x/text/language\"\n\t\"golang.org/x/text/unicode/cldr\"\n)\n\nvar (\n\ttest = flag.Bool(\"test\", false,\n\t\t\"test existing tables; can be used to compare web data with package data.\")\n\n\tdraft = flag.String(\"draft\",\n\t\t\"contributed\",\n\t\t`Minimal draft requirements (approved, contributed, provisional, unconfirmed).`)\n)\n\nfunc main() {\n\tgen.Init()\n\n\t// Read the CLDR zip file.\n\tr := gen.OpenCLDRCoreZip()\n\tdefer r.Close()\n\n\td := &cldr.Decoder{}\n\tdata, err := d.DecodeZip(r)\n\tif err != nil {\n\t\tlog.Fatalf(\"DecodeZip: %v\", err)\n\t}\n\n\tw := gen.NewCodeWriter()\n\tdefer func() {\n\t\tbuf := &bytes.Buffer{}\n\n\t\tif _, err = w.WriteGo(buf, \"language\"); err != nil {\n\t\t\tlog.Fatalf(\"Error formatting file index.go: %v\", err)\n\t\t}\n\n\t\t// Since we're generating a table for our own package we need to rewrite\n\t\t// doing the equivalent of go fmt -r 'language.b -> b'. Using\n\t\t// bytes.Replace will do.\n\t\tout := bytes.Replace(buf.Bytes(), []byte(\"language.\"), nil, -1)\n\t\tif err := ioutil.WriteFile(\"index.go\", out, 0600); err != nil {\n\t\t\tlog.Fatalf(\"Could not create file index.go: %v\", err)\n\t\t}\n\t}()\n\n\tm := map[language.Tag]bool{}\n\tfor _, lang := range data.Locales() {\n\t\t// We include all locales unconditionally to be consistent with en_US.\n\t\t// We want en_US, even though it has no data associated with it.\n\n\t\t// TODO: put any of the languages for which no data exists at the end\n\t\t// of the index. This allows all components based on ICU to use that\n\t\t// as the cutoff point.\n\t\t// if x := data.RawLDML(lang); false ||\n\t\t// \tx.LocaleDisplayNames != nil ||\n\t\t// \tx.Characters != nil ||\n\t\t// \tx.Delimiters != nil ||\n\t\t// \tx.Measurement != nil ||\n\t\t// \tx.Dates != nil ||\n\t\t// \tx.Numbers != nil ||\n\t\t// \tx.Units != nil ||\n\t\t// \tx.ListPatterns != nil ||\n\t\t// \tx.Collations != nil ||\n\t\t// \tx.Segmentations != nil ||\n\t\t// \tx.Rbnf != nil ||\n\t\t// \tx.Annotations != nil ||\n\t\t// \tx.Metadata != nil {\n\n\t\t// TODO: support POSIX natively, albeit non-standard.\n\t\ttag := language.Make(strings.Replace(lang, \"_POSIX\", \"-u-va-posix\", 1))\n\t\tm[tag] = true\n\t\t// }\n\t}\n\t// Include locales for plural rules, which uses a different structure.\n\tfor _, plurals := range data.Supplemental().Plurals {\n\t\tfor _, rules := range plurals.PluralRules {\n\t\t\tfor _, lang := range strings.Split(rules.Locales, \" \") {\n\t\t\t\tm[language.Make(lang)] = true\n\t\t\t}\n\t\t}\n\t}\n\n\tvar core, special []language.Tag\n\n\tfor t := range m {\n\t\tif x := t.Extensions(); len(x) != 0 && fmt.Sprint(x) != \"[u-va-posix]\" {\n\t\t\tlog.Fatalf(\"Unexpected extension %v in %v\", x, t)\n\t\t}\n\t\tif len(t.Variants()) == 0 && len(t.Extensions()) == 0 {\n\t\t\tcore = append(core, t)\n\t\t} else {\n\t\t\tspecial = append(special, t)\n\t\t}\n\t}\n\n\tw.WriteComment(`\n\tNumCompactTags is the number of common tags. The maximum tag is\n\tNumCompactTags-1.`)\n\tw.WriteConst(\"NumCompactTags\", len(core)+len(special))\n\n\tsort.Sort(byAlpha(special))\n\tw.WriteVar(\"specialTags\", special)\n\n\t// TODO: order by frequency?\n\tsort.Sort(byAlpha(core))\n\n\t// Size computations are just an estimate.\n\tw.Size += int(reflect.TypeOf(map[uint32]uint16{}).Size())\n\tw.Size += len(core) * 6 // size of uint32 and uint16\n\n\tfmt.Fprintln(w)\n\tfmt.Fprintln(w, \"var coreTags = map[uint32]uint16{\")\n\tfmt.Fprintln(w, \"0x0: 0, // und\")\n\ti := len(special) + 1 // Und and special tags already written.\n\tfor _, t := range core {\n\t\tif t == language.Und {\n\t\t\tcontinue\n\t\t}\n\t\tfmt.Fprint(w.Hash, t, i)\n\t\tb, s, r := t.Raw()\n\t\tfmt.Fprintf(w, \"0x%s%s%s: %d, // %s\\n\",\n\t\t\tgetIndex(b, 3), // 3 is enough as it is guaranteed to be a compact number\n\t\t\tgetIndex(s, 2),\n\t\t\tgetIndex(r, 3),\n\t\t\ti, t)\n\t\ti++\n\t}\n\tfmt.Fprintln(w, \"}\")\n}\n\n// getIndex prints the subtag type and extracts its index of size nibble.\n// If the index is less than n nibbles, the result is prefixed with 0s.\nfunc getIndex(x interface{}, n int) string {\n\ts := fmt.Sprintf(\"%#v\", x) // s is of form Type{typeID: 0x00}\n\ts = s[strings.Index(s, \"0x\")+2 : len(s)-1]\n\treturn strings.Repeat(\"0\", n-len(s)) + s\n}\n\ntype byAlpha []language.Tag\n\nfunc (a byAlpha) Len() int           { return len(a) }\nfunc (a byAlpha) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }\nfunc (a byAlpha) Less(i, j int) bool { return a[i].String() < a[j].String() }\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/go1_1.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !go1.2\n\npackage language\n\nimport \"sort\"\n\nfunc sortStable(s sort.Interface) {\n\tss := stableSort{\n\t\ts:   s,\n\t\tpos: make([]int, s.Len()),\n\t}\n\tfor i := range ss.pos {\n\t\tss.pos[i] = i\n\t}\n\tsort.Sort(&ss)\n}\n\ntype stableSort struct {\n\ts   sort.Interface\n\tpos []int\n}\n\nfunc (s *stableSort) Len() int {\n\treturn len(s.pos)\n}\n\nfunc (s *stableSort) Less(i, j int) bool {\n\treturn s.s.Less(i, j) || !s.s.Less(j, i) && s.pos[i] < s.pos[j]\n}\n\nfunc (s *stableSort) Swap(i, j int) {\n\ts.s.Swap(i, j)\n\ts.pos[i], s.pos[j] = s.pos[j], s.pos[i]\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/go1_2.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build go1.2\n\npackage language\n\nimport \"sort\"\n\nvar sortStable = sort.Stable\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/index.go",
    "content": "// This file was generated by go generate; DO NOT EDIT\n\npackage language\n\n// NumCompactTags is the number of common tags. The maximum tag is\n// NumCompactTags-1.\nconst NumCompactTags = 752\n\nvar specialTags = []Tag{ // 2 elements\n\t0: {lang: 0xd5, region: 0x6d, script: 0x0, pVariant: 0x5, pExt: 0xe, str: \"ca-ES-valencia\"},\n\t1: {lang: 0x134, region: 0x134, script: 0x0, pVariant: 0x5, pExt: 0x5, str: \"en-US-u-va-posix\"},\n} // Size: 72 bytes\n\nvar coreTags = map[uint32]uint16{\n\t0x0:        0,   // und\n\t0x01500000: 3,   // af\n\t0x015000d1: 4,   // af-NA\n\t0x01500160: 5,   // af-ZA\n\t0x01b00000: 6,   // agq\n\t0x01b00051: 7,   // agq-CM\n\t0x02000000: 8,   // ak\n\t0x0200007f: 9,   // ak-GH\n\t0x02600000: 10,  // am\n\t0x0260006e: 11,  // am-ET\n\t0x03900000: 12,  // ar\n\t0x03900001: 13,  // ar-001\n\t0x03900022: 14,  // ar-AE\n\t0x03900038: 15,  // ar-BH\n\t0x03900061: 16,  // ar-DJ\n\t0x03900066: 17,  // ar-DZ\n\t0x0390006a: 18,  // ar-EG\n\t0x0390006b: 19,  // ar-EH\n\t0x0390006c: 20,  // ar-ER\n\t0x03900096: 21,  // ar-IL\n\t0x0390009a: 22,  // ar-IQ\n\t0x039000a0: 23,  // ar-JO\n\t0x039000a7: 24,  // ar-KM\n\t0x039000ab: 25,  // ar-KW\n\t0x039000af: 26,  // ar-LB\n\t0x039000b8: 27,  // ar-LY\n\t0x039000b9: 28,  // ar-MA\n\t0x039000c8: 29,  // ar-MR\n\t0x039000e0: 30,  // ar-OM\n\t0x039000ec: 31,  // ar-PS\n\t0x039000f2: 32,  // ar-QA\n\t0x03900107: 33,  // ar-SA\n\t0x0390010a: 34,  // ar-SD\n\t0x03900114: 35,  // ar-SO\n\t0x03900116: 36,  // ar-SS\n\t0x0390011b: 37,  // ar-SY\n\t0x0390011f: 38,  // ar-TD\n\t0x03900127: 39,  // ar-TN\n\t0x0390015d: 40,  // ar-YE\n\t0x03f00000: 41,  // ars\n\t0x04200000: 42,  // as\n\t0x04200098: 43,  // as-IN\n\t0x04300000: 44,  // asa\n\t0x0430012e: 45,  // asa-TZ\n\t0x04700000: 46,  // ast\n\t0x0470006d: 47,  // ast-ES\n\t0x05700000: 48,  // az\n\t0x0571e000: 49,  // az-Cyrl\n\t0x0571e031: 50,  // az-Cyrl-AZ\n\t0x05752000: 51,  // az-Latn\n\t0x05752031: 52,  // az-Latn-AZ\n\t0x05d00000: 53,  // bas\n\t0x05d00051: 54,  // bas-CM\n\t0x07000000: 55,  // be\n\t0x07000046: 56,  // be-BY\n\t0x07400000: 57,  // bem\n\t0x07400161: 58,  // bem-ZM\n\t0x07800000: 59,  // bez\n\t0x0780012e: 60,  // bez-TZ\n\t0x07d00000: 61,  // bg\n\t0x07d00037: 62,  // bg-BG\n\t0x08100000: 63,  // bh\n\t0x09e00000: 64,  // bm\n\t0x09e000c2: 65,  // bm-ML\n\t0x0a300000: 66,  // bn\n\t0x0a300034: 67,  // bn-BD\n\t0x0a300098: 68,  // bn-IN\n\t0x0a700000: 69,  // bo\n\t0x0a700052: 70,  // bo-CN\n\t0x0a700098: 71,  // bo-IN\n\t0x0b000000: 72,  // br\n\t0x0b000077: 73,  // br-FR\n\t0x0b300000: 74,  // brx\n\t0x0b300098: 75,  // brx-IN\n\t0x0b500000: 76,  // bs\n\t0x0b51e000: 77,  // bs-Cyrl\n\t0x0b51e032: 78,  // bs-Cyrl-BA\n\t0x0b552000: 79,  // bs-Latn\n\t0x0b552032: 80,  // bs-Latn-BA\n\t0x0d500000: 81,  // ca\n\t0x0d500021: 82,  // ca-AD\n\t0x0d50006d: 83,  // ca-ES\n\t0x0d500077: 84,  // ca-FR\n\t0x0d50009d: 85,  // ca-IT\n\t0x0da00000: 86,  // ce\n\t0x0da00105: 87,  // ce-RU\n\t0x0dd00000: 88,  // cgg\n\t0x0dd00130: 89,  // cgg-UG\n\t0x0e300000: 90,  // chr\n\t0x0e300134: 91,  // chr-US\n\t0x0e700000: 92,  // ckb\n\t0x0e70009a: 93,  // ckb-IQ\n\t0x0e70009b: 94,  // ckb-IR\n\t0x0f600000: 95,  // cs\n\t0x0f60005d: 96,  // cs-CZ\n\t0x0fa00000: 97,  // cu\n\t0x0fa00105: 98,  // cu-RU\n\t0x0fc00000: 99,  // cy\n\t0x0fc0007a: 100, // cy-GB\n\t0x0fd00000: 101, // da\n\t0x0fd00062: 102, // da-DK\n\t0x0fd00081: 103, // da-GL\n\t0x10400000: 104, // dav\n\t0x104000a3: 105, // dav-KE\n\t0x10900000: 106, // de\n\t0x1090002d: 107, // de-AT\n\t0x10900035: 108, // de-BE\n\t0x1090004d: 109, // de-CH\n\t0x1090005f: 110, // de-DE\n\t0x1090009d: 111, // de-IT\n\t0x109000b1: 112, // de-LI\n\t0x109000b6: 113, // de-LU\n\t0x11300000: 114, // dje\n\t0x113000d3: 115, // dje-NE\n\t0x11b00000: 116, // dsb\n\t0x11b0005f: 117, // dsb-DE\n\t0x12000000: 118, // dua\n\t0x12000051: 119, // dua-CM\n\t0x12400000: 120, // dv\n\t0x12700000: 121, // dyo\n\t0x12700113: 122, // dyo-SN\n\t0x12900000: 123, // dz\n\t0x12900042: 124, // dz-BT\n\t0x12b00000: 125, // ebu\n\t0x12b000a3: 126, // ebu-KE\n\t0x12c00000: 127, // ee\n\t0x12c0007f: 128, // ee-GH\n\t0x12c00121: 129, // ee-TG\n\t0x13100000: 130, // el\n\t0x1310005c: 131, // el-CY\n\t0x13100086: 132, // el-GR\n\t0x13400000: 133, // en\n\t0x13400001: 134, // en-001\n\t0x1340001a: 135, // en-150\n\t0x13400024: 136, // en-AG\n\t0x13400025: 137, // en-AI\n\t0x1340002c: 138, // en-AS\n\t0x1340002d: 139, // en-AT\n\t0x1340002e: 140, // en-AU\n\t0x13400033: 141, // en-BB\n\t0x13400035: 142, // en-BE\n\t0x13400039: 143, // en-BI\n\t0x1340003c: 144, // en-BM\n\t0x13400041: 145, // en-BS\n\t0x13400045: 146, // en-BW\n\t0x13400047: 147, // en-BZ\n\t0x13400048: 148, // en-CA\n\t0x13400049: 149, // en-CC\n\t0x1340004d: 150, // en-CH\n\t0x1340004f: 151, // en-CK\n\t0x13400051: 152, // en-CM\n\t0x1340005b: 153, // en-CX\n\t0x1340005c: 154, // en-CY\n\t0x1340005f: 155, // en-DE\n\t0x13400060: 156, // en-DG\n\t0x13400062: 157, // en-DK\n\t0x13400063: 158, // en-DM\n\t0x1340006c: 159, // en-ER\n\t0x13400071: 160, // en-FI\n\t0x13400072: 161, // en-FJ\n\t0x13400073: 162, // en-FK\n\t0x13400074: 163, // en-FM\n\t0x1340007a: 164, // en-GB\n\t0x1340007b: 165, // en-GD\n\t0x1340007e: 166, // en-GG\n\t0x1340007f: 167, // en-GH\n\t0x13400080: 168, // en-GI\n\t0x13400082: 169, // en-GM\n\t0x13400089: 170, // en-GU\n\t0x1340008b: 171, // en-GY\n\t0x1340008c: 172, // en-HK\n\t0x13400095: 173, // en-IE\n\t0x13400096: 174, // en-IL\n\t0x13400097: 175, // en-IM\n\t0x13400098: 176, // en-IN\n\t0x13400099: 177, // en-IO\n\t0x1340009e: 178, // en-JE\n\t0x1340009f: 179, // en-JM\n\t0x134000a3: 180, // en-KE\n\t0x134000a6: 181, // en-KI\n\t0x134000a8: 182, // en-KN\n\t0x134000ac: 183, // en-KY\n\t0x134000b0: 184, // en-LC\n\t0x134000b3: 185, // en-LR\n\t0x134000b4: 186, // en-LS\n\t0x134000be: 187, // en-MG\n\t0x134000bf: 188, // en-MH\n\t0x134000c5: 189, // en-MO\n\t0x134000c6: 190, // en-MP\n\t0x134000c9: 191, // en-MS\n\t0x134000ca: 192, // en-MT\n\t0x134000cb: 193, // en-MU\n\t0x134000cd: 194, // en-MW\n\t0x134000cf: 195, // en-MY\n\t0x134000d1: 196, // en-NA\n\t0x134000d4: 197, // en-NF\n\t0x134000d5: 198, // en-NG\n\t0x134000d8: 199, // en-NL\n\t0x134000dc: 200, // en-NR\n\t0x134000de: 201, // en-NU\n\t0x134000df: 202, // en-NZ\n\t0x134000e5: 203, // en-PG\n\t0x134000e6: 204, // en-PH\n\t0x134000e7: 205, // en-PK\n\t0x134000ea: 206, // en-PN\n\t0x134000eb: 207, // en-PR\n\t0x134000ef: 208, // en-PW\n\t0x13400106: 209, // en-RW\n\t0x13400108: 210, // en-SB\n\t0x13400109: 211, // en-SC\n\t0x1340010a: 212, // en-SD\n\t0x1340010b: 213, // en-SE\n\t0x1340010c: 214, // en-SG\n\t0x1340010d: 215, // en-SH\n\t0x1340010e: 216, // en-SI\n\t0x13400111: 217, // en-SL\n\t0x13400116: 218, // en-SS\n\t0x1340011a: 219, // en-SX\n\t0x1340011c: 220, // en-SZ\n\t0x1340011e: 221, // en-TC\n\t0x13400124: 222, // en-TK\n\t0x13400128: 223, // en-TO\n\t0x1340012b: 224, // en-TT\n\t0x1340012c: 225, // en-TV\n\t0x1340012e: 226, // en-TZ\n\t0x13400130: 227, // en-UG\n\t0x13400132: 228, // en-UM\n\t0x13400134: 229, // en-US\n\t0x13400138: 230, // en-VC\n\t0x1340013b: 231, // en-VG\n\t0x1340013c: 232, // en-VI\n\t0x1340013e: 233, // en-VU\n\t0x13400141: 234, // en-WS\n\t0x13400160: 235, // en-ZA\n\t0x13400161: 236, // en-ZM\n\t0x13400163: 237, // en-ZW\n\t0x13700000: 238, // eo\n\t0x13700001: 239, // eo-001\n\t0x13900000: 240, // es\n\t0x1390001e: 241, // es-419\n\t0x1390002b: 242, // es-AR\n\t0x1390003e: 243, // es-BO\n\t0x13900040: 244, // es-BR\n\t0x13900050: 245, // es-CL\n\t0x13900053: 246, // es-CO\n\t0x13900055: 247, // es-CR\n\t0x13900058: 248, // es-CU\n\t0x13900064: 249, // es-DO\n\t0x13900067: 250, // es-EA\n\t0x13900068: 251, // es-EC\n\t0x1390006d: 252, // es-ES\n\t0x13900085: 253, // es-GQ\n\t0x13900088: 254, // es-GT\n\t0x1390008e: 255, // es-HN\n\t0x13900093: 256, // es-IC\n\t0x139000ce: 257, // es-MX\n\t0x139000d7: 258, // es-NI\n\t0x139000e1: 259, // es-PA\n\t0x139000e3: 260, // es-PE\n\t0x139000e6: 261, // es-PH\n\t0x139000eb: 262, // es-PR\n\t0x139000f0: 263, // es-PY\n\t0x13900119: 264, // es-SV\n\t0x13900134: 265, // es-US\n\t0x13900135: 266, // es-UY\n\t0x1390013a: 267, // es-VE\n\t0x13b00000: 268, // et\n\t0x13b00069: 269, // et-EE\n\t0x14000000: 270, // eu\n\t0x1400006d: 271, // eu-ES\n\t0x14100000: 272, // ewo\n\t0x14100051: 273, // ewo-CM\n\t0x14300000: 274, // fa\n\t0x14300023: 275, // fa-AF\n\t0x1430009b: 276, // fa-IR\n\t0x14900000: 277, // ff\n\t0x14900051: 278, // ff-CM\n\t0x14900083: 279, // ff-GN\n\t0x149000c8: 280, // ff-MR\n\t0x14900113: 281, // ff-SN\n\t0x14c00000: 282, // fi\n\t0x14c00071: 283, // fi-FI\n\t0x14e00000: 284, // fil\n\t0x14e000e6: 285, // fil-PH\n\t0x15300000: 286, // fo\n\t0x15300062: 287, // fo-DK\n\t0x15300075: 288, // fo-FO\n\t0x15900000: 289, // fr\n\t0x15900035: 290, // fr-BE\n\t0x15900036: 291, // fr-BF\n\t0x15900039: 292, // fr-BI\n\t0x1590003a: 293, // fr-BJ\n\t0x1590003b: 294, // fr-BL\n\t0x15900048: 295, // fr-CA\n\t0x1590004a: 296, // fr-CD\n\t0x1590004b: 297, // fr-CF\n\t0x1590004c: 298, // fr-CG\n\t0x1590004d: 299, // fr-CH\n\t0x1590004e: 300, // fr-CI\n\t0x15900051: 301, // fr-CM\n\t0x15900061: 302, // fr-DJ\n\t0x15900066: 303, // fr-DZ\n\t0x15900077: 304, // fr-FR\n\t0x15900079: 305, // fr-GA\n\t0x1590007d: 306, // fr-GF\n\t0x15900083: 307, // fr-GN\n\t0x15900084: 308, // fr-GP\n\t0x15900085: 309, // fr-GQ\n\t0x15900090: 310, // fr-HT\n\t0x159000a7: 311, // fr-KM\n\t0x159000b6: 312, // fr-LU\n\t0x159000b9: 313, // fr-MA\n\t0x159000ba: 314, // fr-MC\n\t0x159000bd: 315, // fr-MF\n\t0x159000be: 316, // fr-MG\n\t0x159000c2: 317, // fr-ML\n\t0x159000c7: 318, // fr-MQ\n\t0x159000c8: 319, // fr-MR\n\t0x159000cb: 320, // fr-MU\n\t0x159000d2: 321, // fr-NC\n\t0x159000d3: 322, // fr-NE\n\t0x159000e4: 323, // fr-PF\n\t0x159000e9: 324, // fr-PM\n\t0x15900101: 325, // fr-RE\n\t0x15900106: 326, // fr-RW\n\t0x15900109: 327, // fr-SC\n\t0x15900113: 328, // fr-SN\n\t0x1590011b: 329, // fr-SY\n\t0x1590011f: 330, // fr-TD\n\t0x15900121: 331, // fr-TG\n\t0x15900127: 332, // fr-TN\n\t0x1590013e: 333, // fr-VU\n\t0x1590013f: 334, // fr-WF\n\t0x1590015e: 335, // fr-YT\n\t0x16400000: 336, // fur\n\t0x1640009d: 337, // fur-IT\n\t0x16800000: 338, // fy\n\t0x168000d8: 339, // fy-NL\n\t0x16900000: 340, // ga\n\t0x16900095: 341, // ga-IE\n\t0x17800000: 342, // gd\n\t0x1780007a: 343, // gd-GB\n\t0x18a00000: 344, // gl\n\t0x18a0006d: 345, // gl-ES\n\t0x19c00000: 346, // gsw\n\t0x19c0004d: 347, // gsw-CH\n\t0x19c00077: 348, // gsw-FR\n\t0x19c000b1: 349, // gsw-LI\n\t0x19d00000: 350, // gu\n\t0x19d00098: 351, // gu-IN\n\t0x1a200000: 352, // guw\n\t0x1a400000: 353, // guz\n\t0x1a4000a3: 354, // guz-KE\n\t0x1a500000: 355, // gv\n\t0x1a500097: 356, // gv-IM\n\t0x1ad00000: 357, // ha\n\t0x1ad0007f: 358, // ha-GH\n\t0x1ad000d3: 359, // ha-NE\n\t0x1ad000d5: 360, // ha-NG\n\t0x1b100000: 361, // haw\n\t0x1b100134: 362, // haw-US\n\t0x1b500000: 363, // he\n\t0x1b500096: 364, // he-IL\n\t0x1b700000: 365, // hi\n\t0x1b700098: 366, // hi-IN\n\t0x1ca00000: 367, // hr\n\t0x1ca00032: 368, // hr-BA\n\t0x1ca0008f: 369, // hr-HR\n\t0x1cb00000: 370, // hsb\n\t0x1cb0005f: 371, // hsb-DE\n\t0x1ce00000: 372, // hu\n\t0x1ce00091: 373, // hu-HU\n\t0x1d000000: 374, // hy\n\t0x1d000027: 375, // hy-AM\n\t0x1da00000: 376, // id\n\t0x1da00094: 377, // id-ID\n\t0x1df00000: 378, // ig\n\t0x1df000d5: 379, // ig-NG\n\t0x1e200000: 380, // ii\n\t0x1e200052: 381, // ii-CN\n\t0x1f000000: 382, // is\n\t0x1f00009c: 383, // is-IS\n\t0x1f100000: 384, // it\n\t0x1f10004d: 385, // it-CH\n\t0x1f10009d: 386, // it-IT\n\t0x1f100112: 387, // it-SM\n\t0x1f200000: 388, // iu\n\t0x1f800000: 389, // ja\n\t0x1f8000a1: 390, // ja-JP\n\t0x1fb00000: 391, // jbo\n\t0x1ff00000: 392, // jgo\n\t0x1ff00051: 393, // jgo-CM\n\t0x20200000: 394, // jmc\n\t0x2020012e: 395, // jmc-TZ\n\t0x20600000: 396, // jv\n\t0x20800000: 397, // ka\n\t0x2080007c: 398, // ka-GE\n\t0x20a00000: 399, // kab\n\t0x20a00066: 400, // kab-DZ\n\t0x20e00000: 401, // kaj\n\t0x20f00000: 402, // kam\n\t0x20f000a3: 403, // kam-KE\n\t0x21700000: 404, // kcg\n\t0x21b00000: 405, // kde\n\t0x21b0012e: 406, // kde-TZ\n\t0x21f00000: 407, // kea\n\t0x21f00059: 408, // kea-CV\n\t0x22c00000: 409, // khq\n\t0x22c000c2: 410, // khq-ML\n\t0x23100000: 411, // ki\n\t0x231000a3: 412, // ki-KE\n\t0x23a00000: 413, // kk\n\t0x23a000ad: 414, // kk-KZ\n\t0x23c00000: 415, // kkj\n\t0x23c00051: 416, // kkj-CM\n\t0x23d00000: 417, // kl\n\t0x23d00081: 418, // kl-GL\n\t0x23e00000: 419, // kln\n\t0x23e000a3: 420, // kln-KE\n\t0x24200000: 421, // km\n\t0x242000a5: 422, // km-KH\n\t0x24900000: 423, // kn\n\t0x24900098: 424, // kn-IN\n\t0x24b00000: 425, // ko\n\t0x24b000a9: 426, // ko-KP\n\t0x24b000aa: 427, // ko-KR\n\t0x24d00000: 428, // kok\n\t0x24d00098: 429, // kok-IN\n\t0x26100000: 430, // ks\n\t0x26100098: 431, // ks-IN\n\t0x26200000: 432, // ksb\n\t0x2620012e: 433, // ksb-TZ\n\t0x26400000: 434, // ksf\n\t0x26400051: 435, // ksf-CM\n\t0x26500000: 436, // ksh\n\t0x2650005f: 437, // ksh-DE\n\t0x26b00000: 438, // ku\n\t0x27800000: 439, // kw\n\t0x2780007a: 440, // kw-GB\n\t0x28100000: 441, // ky\n\t0x281000a4: 442, // ky-KG\n\t0x28800000: 443, // lag\n\t0x2880012e: 444, // lag-TZ\n\t0x28c00000: 445, // lb\n\t0x28c000b6: 446, // lb-LU\n\t0x29a00000: 447, // lg\n\t0x29a00130: 448, // lg-UG\n\t0x2a600000: 449, // lkt\n\t0x2a600134: 450, // lkt-US\n\t0x2ac00000: 451, // ln\n\t0x2ac00029: 452, // ln-AO\n\t0x2ac0004a: 453, // ln-CD\n\t0x2ac0004b: 454, // ln-CF\n\t0x2ac0004c: 455, // ln-CG\n\t0x2af00000: 456, // lo\n\t0x2af000ae: 457, // lo-LA\n\t0x2b600000: 458, // lrc\n\t0x2b60009a: 459, // lrc-IQ\n\t0x2b60009b: 460, // lrc-IR\n\t0x2b700000: 461, // lt\n\t0x2b7000b5: 462, // lt-LT\n\t0x2b900000: 463, // lu\n\t0x2b90004a: 464, // lu-CD\n\t0x2bb00000: 465, // luo\n\t0x2bb000a3: 466, // luo-KE\n\t0x2bc00000: 467, // luy\n\t0x2bc000a3: 468, // luy-KE\n\t0x2be00000: 469, // lv\n\t0x2be000b7: 470, // lv-LV\n\t0x2c800000: 471, // mas\n\t0x2c8000a3: 472, // mas-KE\n\t0x2c80012e: 473, // mas-TZ\n\t0x2e000000: 474, // mer\n\t0x2e0000a3: 475, // mer-KE\n\t0x2e400000: 476, // mfe\n\t0x2e4000cb: 477, // mfe-MU\n\t0x2e800000: 478, // mg\n\t0x2e8000be: 479, // mg-MG\n\t0x2e900000: 480, // mgh\n\t0x2e9000d0: 481, // mgh-MZ\n\t0x2eb00000: 482, // mgo\n\t0x2eb00051: 483, // mgo-CM\n\t0x2f600000: 484, // mk\n\t0x2f6000c1: 485, // mk-MK\n\t0x2fb00000: 486, // ml\n\t0x2fb00098: 487, // ml-IN\n\t0x30200000: 488, // mn\n\t0x302000c4: 489, // mn-MN\n\t0x31200000: 490, // mr\n\t0x31200098: 491, // mr-IN\n\t0x31600000: 492, // ms\n\t0x3160003d: 493, // ms-BN\n\t0x316000cf: 494, // ms-MY\n\t0x3160010c: 495, // ms-SG\n\t0x31700000: 496, // mt\n\t0x317000ca: 497, // mt-MT\n\t0x31c00000: 498, // mua\n\t0x31c00051: 499, // mua-CM\n\t0x32800000: 500, // my\n\t0x328000c3: 501, // my-MM\n\t0x33100000: 502, // mzn\n\t0x3310009b: 503, // mzn-IR\n\t0x33800000: 504, // nah\n\t0x33c00000: 505, // naq\n\t0x33c000d1: 506, // naq-NA\n\t0x33e00000: 507, // nb\n\t0x33e000d9: 508, // nb-NO\n\t0x33e0010f: 509, // nb-SJ\n\t0x34500000: 510, // nd\n\t0x34500163: 511, // nd-ZW\n\t0x34700000: 512, // nds\n\t0x3470005f: 513, // nds-DE\n\t0x347000d8: 514, // nds-NL\n\t0x34800000: 515, // ne\n\t0x34800098: 516, // ne-IN\n\t0x348000da: 517, // ne-NP\n\t0x35e00000: 518, // nl\n\t0x35e0002f: 519, // nl-AW\n\t0x35e00035: 520, // nl-BE\n\t0x35e0003f: 521, // nl-BQ\n\t0x35e0005a: 522, // nl-CW\n\t0x35e000d8: 523, // nl-NL\n\t0x35e00115: 524, // nl-SR\n\t0x35e0011a: 525, // nl-SX\n\t0x35f00000: 526, // nmg\n\t0x35f00051: 527, // nmg-CM\n\t0x36100000: 528, // nn\n\t0x361000d9: 529, // nn-NO\n\t0x36300000: 530, // nnh\n\t0x36300051: 531, // nnh-CM\n\t0x36600000: 532, // no\n\t0x36c00000: 533, // nqo\n\t0x36d00000: 534, // nr\n\t0x37100000: 535, // nso\n\t0x37700000: 536, // nus\n\t0x37700116: 537, // nus-SS\n\t0x37e00000: 538, // ny\n\t0x38000000: 539, // nyn\n\t0x38000130: 540, // nyn-UG\n\t0x38700000: 541, // om\n\t0x3870006e: 542, // om-ET\n\t0x387000a3: 543, // om-KE\n\t0x38c00000: 544, // or\n\t0x38c00098: 545, // or-IN\n\t0x38f00000: 546, // os\n\t0x38f0007c: 547, // os-GE\n\t0x38f00105: 548, // os-RU\n\t0x39400000: 549, // pa\n\t0x39405000: 550, // pa-Arab\n\t0x394050e7: 551, // pa-Arab-PK\n\t0x3942f000: 552, // pa-Guru\n\t0x3942f098: 553, // pa-Guru-IN\n\t0x39800000: 554, // pap\n\t0x3aa00000: 555, // pl\n\t0x3aa000e8: 556, // pl-PL\n\t0x3b400000: 557, // prg\n\t0x3b400001: 558, // prg-001\n\t0x3b500000: 559, // ps\n\t0x3b500023: 560, // ps-AF\n\t0x3b700000: 561, // pt\n\t0x3b700029: 562, // pt-AO\n\t0x3b700040: 563, // pt-BR\n\t0x3b70004d: 564, // pt-CH\n\t0x3b700059: 565, // pt-CV\n\t0x3b700085: 566, // pt-GQ\n\t0x3b70008a: 567, // pt-GW\n\t0x3b7000b6: 568, // pt-LU\n\t0x3b7000c5: 569, // pt-MO\n\t0x3b7000d0: 570, // pt-MZ\n\t0x3b7000ed: 571, // pt-PT\n\t0x3b700117: 572, // pt-ST\n\t0x3b700125: 573, // pt-TL\n\t0x3bb00000: 574, // qu\n\t0x3bb0003e: 575, // qu-BO\n\t0x3bb00068: 576, // qu-EC\n\t0x3bb000e3: 577, // qu-PE\n\t0x3cb00000: 578, // rm\n\t0x3cb0004d: 579, // rm-CH\n\t0x3d000000: 580, // rn\n\t0x3d000039: 581, // rn-BI\n\t0x3d300000: 582, // ro\n\t0x3d3000bb: 583, // ro-MD\n\t0x3d300103: 584, // ro-RO\n\t0x3d500000: 585, // rof\n\t0x3d50012e: 586, // rof-TZ\n\t0x3d900000: 587, // ru\n\t0x3d900046: 588, // ru-BY\n\t0x3d9000a4: 589, // ru-KG\n\t0x3d9000ad: 590, // ru-KZ\n\t0x3d9000bb: 591, // ru-MD\n\t0x3d900105: 592, // ru-RU\n\t0x3d90012f: 593, // ru-UA\n\t0x3dc00000: 594, // rw\n\t0x3dc00106: 595, // rw-RW\n\t0x3dd00000: 596, // rwk\n\t0x3dd0012e: 597, // rwk-TZ\n\t0x3e200000: 598, // sah\n\t0x3e200105: 599, // sah-RU\n\t0x3e300000: 600, // saq\n\t0x3e3000a3: 601, // saq-KE\n\t0x3e900000: 602, // sbp\n\t0x3e90012e: 603, // sbp-TZ\n\t0x3f200000: 604, // sdh\n\t0x3f300000: 605, // se\n\t0x3f300071: 606, // se-FI\n\t0x3f3000d9: 607, // se-NO\n\t0x3f30010b: 608, // se-SE\n\t0x3f500000: 609, // seh\n\t0x3f5000d0: 610, // seh-MZ\n\t0x3f700000: 611, // ses\n\t0x3f7000c2: 612, // ses-ML\n\t0x3f800000: 613, // sg\n\t0x3f80004b: 614, // sg-CF\n\t0x3fe00000: 615, // shi\n\t0x3fe52000: 616, // shi-Latn\n\t0x3fe520b9: 617, // shi-Latn-MA\n\t0x3fed2000: 618, // shi-Tfng\n\t0x3fed20b9: 619, // shi-Tfng-MA\n\t0x40200000: 620, // si\n\t0x402000b2: 621, // si-LK\n\t0x40800000: 622, // sk\n\t0x40800110: 623, // sk-SK\n\t0x40c00000: 624, // sl\n\t0x40c0010e: 625, // sl-SI\n\t0x41200000: 626, // sma\n\t0x41300000: 627, // smi\n\t0x41400000: 628, // smj\n\t0x41500000: 629, // smn\n\t0x41500071: 630, // smn-FI\n\t0x41800000: 631, // sms\n\t0x41900000: 632, // sn\n\t0x41900163: 633, // sn-ZW\n\t0x41f00000: 634, // so\n\t0x41f00061: 635, // so-DJ\n\t0x41f0006e: 636, // so-ET\n\t0x41f000a3: 637, // so-KE\n\t0x41f00114: 638, // so-SO\n\t0x42700000: 639, // sq\n\t0x42700026: 640, // sq-AL\n\t0x427000c1: 641, // sq-MK\n\t0x4270014c: 642, // sq-XK\n\t0x42800000: 643, // sr\n\t0x4281e000: 644, // sr-Cyrl\n\t0x4281e032: 645, // sr-Cyrl-BA\n\t0x4281e0bc: 646, // sr-Cyrl-ME\n\t0x4281e104: 647, // sr-Cyrl-RS\n\t0x4281e14c: 648, // sr-Cyrl-XK\n\t0x42852000: 649, // sr-Latn\n\t0x42852032: 650, // sr-Latn-BA\n\t0x428520bc: 651, // sr-Latn-ME\n\t0x42852104: 652, // sr-Latn-RS\n\t0x4285214c: 653, // sr-Latn-XK\n\t0x42d00000: 654, // ss\n\t0x43000000: 655, // ssy\n\t0x43100000: 656, // st\n\t0x43a00000: 657, // sv\n\t0x43a00030: 658, // sv-AX\n\t0x43a00071: 659, // sv-FI\n\t0x43a0010b: 660, // sv-SE\n\t0x43b00000: 661, // sw\n\t0x43b0004a: 662, // sw-CD\n\t0x43b000a3: 663, // sw-KE\n\t0x43b0012e: 664, // sw-TZ\n\t0x43b00130: 665, // sw-UG\n\t0x44400000: 666, // syr\n\t0x44600000: 667, // ta\n\t0x44600098: 668, // ta-IN\n\t0x446000b2: 669, // ta-LK\n\t0x446000cf: 670, // ta-MY\n\t0x4460010c: 671, // ta-SG\n\t0x45700000: 672, // te\n\t0x45700098: 673, // te-IN\n\t0x45a00000: 674, // teo\n\t0x45a000a3: 675, // teo-KE\n\t0x45a00130: 676, // teo-UG\n\t0x46100000: 677, // th\n\t0x46100122: 678, // th-TH\n\t0x46500000: 679, // ti\n\t0x4650006c: 680, // ti-ER\n\t0x4650006e: 681, // ti-ET\n\t0x46700000: 682, // tig\n\t0x46c00000: 683, // tk\n\t0x46c00126: 684, // tk-TM\n\t0x47600000: 685, // tn\n\t0x47800000: 686, // to\n\t0x47800128: 687, // to-TO\n\t0x48000000: 688, // tr\n\t0x4800005c: 689, // tr-CY\n\t0x4800012a: 690, // tr-TR\n\t0x48400000: 691, // ts\n\t0x49a00000: 692, // twq\n\t0x49a000d3: 693, // twq-NE\n\t0x49f00000: 694, // tzm\n\t0x49f000b9: 695, // tzm-MA\n\t0x4a200000: 696, // ug\n\t0x4a200052: 697, // ug-CN\n\t0x4a400000: 698, // uk\n\t0x4a40012f: 699, // uk-UA\n\t0x4aa00000: 700, // ur\n\t0x4aa00098: 701, // ur-IN\n\t0x4aa000e7: 702, // ur-PK\n\t0x4b200000: 703, // uz\n\t0x4b205000: 704, // uz-Arab\n\t0x4b205023: 705, // uz-Arab-AF\n\t0x4b21e000: 706, // uz-Cyrl\n\t0x4b21e136: 707, // uz-Cyrl-UZ\n\t0x4b252000: 708, // uz-Latn\n\t0x4b252136: 709, // uz-Latn-UZ\n\t0x4b400000: 710, // vai\n\t0x4b452000: 711, // vai-Latn\n\t0x4b4520b3: 712, // vai-Latn-LR\n\t0x4b4d9000: 713, // vai-Vaii\n\t0x4b4d90b3: 714, // vai-Vaii-LR\n\t0x4b600000: 715, // ve\n\t0x4b900000: 716, // vi\n\t0x4b90013d: 717, // vi-VN\n\t0x4bf00000: 718, // vo\n\t0x4bf00001: 719, // vo-001\n\t0x4c200000: 720, // vun\n\t0x4c20012e: 721, // vun-TZ\n\t0x4c400000: 722, // wa\n\t0x4c500000: 723, // wae\n\t0x4c50004d: 724, // wae-CH\n\t0x4db00000: 725, // wo\n\t0x4e800000: 726, // xh\n\t0x4f100000: 727, // xog\n\t0x4f100130: 728, // xog-UG\n\t0x4ff00000: 729, // yav\n\t0x4ff00051: 730, // yav-CM\n\t0x50800000: 731, // yi\n\t0x50800001: 732, // yi-001\n\t0x50e00000: 733, // yo\n\t0x50e0003a: 734, // yo-BJ\n\t0x50e000d5: 735, // yo-NG\n\t0x51500000: 736, // yue\n\t0x5150008c: 737, // yue-HK\n\t0x51e00000: 738, // zgh\n\t0x51e000b9: 739, // zgh-MA\n\t0x51f00000: 740, // zh\n\t0x51f34000: 741, // zh-Hans\n\t0x51f34052: 742, // zh-Hans-CN\n\t0x51f3408c: 743, // zh-Hans-HK\n\t0x51f340c5: 744, // zh-Hans-MO\n\t0x51f3410c: 745, // zh-Hans-SG\n\t0x51f35000: 746, // zh-Hant\n\t0x51f3508c: 747, // zh-Hant-HK\n\t0x51f350c5: 748, // zh-Hant-MO\n\t0x51f3512d: 749, // zh-Hant-TW\n\t0x52400000: 750, // zu\n\t0x52400160: 751, // zu-ZA\n}\n\n// Total table size 4580 bytes (4KiB); checksum: A7F72A2A\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/language.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:generate go run maketables.go gen_common.go -output tables.go\n//go:generate go run gen_index.go\n\n// Package language implements BCP 47 language tags and related functionality.\n//\n// The Tag type, which is used to represent languages, is agnostic to the\n// meaning of its subtags. Tags are not fully canonicalized to preserve\n// information that may be valuable in certain contexts. As a consequence, two\n// different tags may represent identical languages.\n//\n// Initializing language- or locale-specific components usually consists of\n// two steps. The first step is to select a display language based on the\n// preferred languages of the user and the languages supported by an application.\n// The second step is to create the language-specific services based on\n// this selection. Each is discussed in more details below.\n//\n// Matching preferred against supported languages\n//\n// An application may support various languages. This list is typically limited\n// by the languages for which there exists translations of the user interface.\n// Similarly, a user may provide a list of preferred languages which is limited\n// by the languages understood by this user.\n// An application should use a Matcher to find the best supported language based\n// on the user's preferred list.\n// Matchers are aware of the intricacies of equivalence between languages.\n// The default Matcher implementation takes into account things such as\n// deprecated subtags, legacy tags, and mutual intelligibility between scripts\n// and languages.\n//\n// A Matcher for English, Australian English, Danish, and standard Mandarin can\n// be defined as follows:\n//\n//\t\tvar matcher = language.NewMatcher([]language.Tag{\n//\t\t\tlanguage.English,   // The first language is used as fallback.\n// \t\t\tlanguage.MustParse(\"en-AU\"),\n//\t\t\tlanguage.Danish,\n//\t\t\tlanguage.Chinese,\n//\t\t})\n//\n// The following code selects the best match for someone speaking Spanish and\n// Norwegian:\n//\n// \t\tpreferred := []language.Tag{ language.Spanish, language.Norwegian }\n//\t\ttag, _, _ := matcher.Match(preferred...)\n//\n// In this case, the best match is Danish, as Danish is sufficiently a match to\n// Norwegian to not have to fall back to the default.\n// See ParseAcceptLanguage on how to handle the Accept-Language HTTP header.\n//\n// Selecting language-specific services\n//\n// One should always use the Tag returned by the Matcher to create an instance\n// of any of the language-specific services provided by the text repository.\n// This prevents the mixing of languages, such as having a different language for\n// messages and display names, as well as improper casing or sorting order for\n// the selected language.\n// Using the returned Tag also allows user-defined settings, such as collation\n// order or numbering system to be transparently passed as options.\n//\n// If you have language-specific data in your application, however, it will in\n// most cases suffice to use the index returned by the matcher to identify\n// the user language.\n// The following loop provides an alternative in case this is not sufficient:\n//\n// \t\tsupported := map[language.Tag]data{\n//\t\t\tlanguage.English:            enData,\n// \t\t\tlanguage.MustParse(\"en-AU\"): enAUData,\n//\t\t\tlanguage.Danish:             daData,\n//\t\t\tlanguage.Chinese:            zhData,\n// \t\t}\n//\t\ttag, _, _ := matcher.Match(preferred...)\n//\t\tfor ; tag != language.Und; tag = tag.Parent() {\n//\t\t\tif v, ok := supported[tag]; ok {\n//\t\t\t\treturn v\n//\t\t\t}\n//\t\t}\n// \t\treturn enData // should not reach here\n//\n// Repeatedly taking the Parent of the tag returned by Match will eventually\n// match one of the tags used to initialize the Matcher.\n//\n// Canonicalization\n//\n// By default, only legacy and deprecated tags are converted into their\n// canonical equivalent. All other information is preserved. This approach makes\n// the confidence scores more accurate and allows matchers to distinguish\n// between variants that are otherwise lost.\n//\n// As a consequence, two tags that should be treated as identical according to\n// BCP 47 or CLDR, like \"en-Latn\" and \"en\", will be represented differently. The\n// Matchers will handle such distinctions, though, and are aware of the\n// equivalence relations. The CanonType type can be used to alter the\n// canonicalization form.\n//\n// References\n//\n// BCP 47 - Tags for Identifying Languages\n// http://tools.ietf.org/html/bcp47\npackage language // import \"golang.org/x/text/language\"\n\n// TODO: Remove above NOTE after:\n// - verifying that tables are dropped correctly (most notably matcher tables).\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n)\n\nconst (\n\t// maxCoreSize is the maximum size of a BCP 47 tag without variants and\n\t// extensions. Equals max lang (3) + script (4) + max reg (3) + 2 dashes.\n\tmaxCoreSize = 12\n\n\t// max99thPercentileSize is a somewhat arbitrary buffer size that presumably\n\t// is large enough to hold at least 99% of the BCP 47 tags.\n\tmax99thPercentileSize = 32\n\n\t// maxSimpleUExtensionSize is the maximum size of a -u extension with one\n\t// key-type pair. Equals len(\"-u-\") + key (2) + dash + max value (8).\n\tmaxSimpleUExtensionSize = 14\n)\n\n// Tag represents a BCP 47 language tag. It is used to specify an instance of a\n// specific language or locale. All language tag values are guaranteed to be\n// well-formed.\ntype Tag struct {\n\tlang     langID\n\tregion   regionID\n\tscript   scriptID\n\tpVariant byte   // offset in str, includes preceding '-'\n\tpExt     uint16 // offset of first extension, includes preceding '-'\n\n\t// str is the string representation of the Tag. It will only be used if the\n\t// tag has variants or extensions.\n\tstr string\n}\n\n// Make is a convenience wrapper for Parse that omits the error.\n// In case of an error, a sensible default is returned.\nfunc Make(s string) Tag {\n\treturn Default.Make(s)\n}\n\n// Make is a convenience wrapper for c.Parse that omits the error.\n// In case of an error, a sensible default is returned.\nfunc (c CanonType) Make(s string) Tag {\n\tt, _ := c.Parse(s)\n\treturn t\n}\n\n// Raw returns the raw base language, script and region, without making an\n// attempt to infer their values.\nfunc (t Tag) Raw() (b Base, s Script, r Region) {\n\treturn Base{t.lang}, Script{t.script}, Region{t.region}\n}\n\n// equalTags compares language, script and region subtags only.\nfunc (t Tag) equalTags(a Tag) bool {\n\treturn t.lang == a.lang && t.script == a.script && t.region == a.region\n}\n\n// IsRoot returns true if t is equal to language \"und\".\nfunc (t Tag) IsRoot() bool {\n\tif int(t.pVariant) < len(t.str) {\n\t\treturn false\n\t}\n\treturn t.equalTags(und)\n}\n\n// private reports whether the Tag consists solely of a private use tag.\nfunc (t Tag) private() bool {\n\treturn t.str != \"\" && t.pVariant == 0\n}\n\n// CanonType can be used to enable or disable various types of canonicalization.\ntype CanonType int\n\nconst (\n\t// Replace deprecated base languages with their preferred replacements.\n\tDeprecatedBase CanonType = 1 << iota\n\t// Replace deprecated scripts with their preferred replacements.\n\tDeprecatedScript\n\t// Replace deprecated regions with their preferred replacements.\n\tDeprecatedRegion\n\t// Remove redundant scripts.\n\tSuppressScript\n\t// Normalize legacy encodings. This includes legacy languages defined in\n\t// CLDR as well as bibliographic codes defined in ISO-639.\n\tLegacy\n\t// Map the dominant language of a macro language group to the macro language\n\t// subtag. For example cmn -> zh.\n\tMacro\n\t// The CLDR flag should be used if full compatibility with CLDR is required.\n\t// There are a few cases where language.Tag may differ from CLDR. To follow all\n\t// of CLDR's suggestions, use All|CLDR.\n\tCLDR\n\n\t// Raw can be used to Compose or Parse without Canonicalization.\n\tRaw CanonType = 0\n\n\t// Replace all deprecated tags with their preferred replacements.\n\tDeprecated = DeprecatedBase | DeprecatedScript | DeprecatedRegion\n\n\t// All canonicalizations recommended by BCP 47.\n\tBCP47 = Deprecated | SuppressScript\n\n\t// All canonicalizations.\n\tAll = BCP47 | Legacy | Macro\n\n\t// Default is the canonicalization used by Parse, Make and Compose. To\n\t// preserve as much information as possible, canonicalizations that remove\n\t// potentially valuable information are not included. The Matcher is\n\t// designed to recognize similar tags that would be the same if\n\t// they were canonicalized using All.\n\tDefault = Deprecated | Legacy\n\n\tcanonLang = DeprecatedBase | Legacy | Macro\n\n\t// TODO: LikelyScript, LikelyRegion: suppress similar to ICU.\n)\n\n// canonicalize returns the canonicalized equivalent of the tag and\n// whether there was any change.\nfunc (t Tag) canonicalize(c CanonType) (Tag, bool) {\n\tif c == Raw {\n\t\treturn t, false\n\t}\n\tchanged := false\n\tif c&SuppressScript != 0 {\n\t\tif t.lang < langNoIndexOffset && uint8(t.script) == suppressScript[t.lang] {\n\t\t\tt.script = 0\n\t\t\tchanged = true\n\t\t}\n\t}\n\tif c&canonLang != 0 {\n\t\tfor {\n\t\t\tif l, aliasType := normLang(t.lang); l != t.lang {\n\t\t\t\tswitch aliasType {\n\t\t\t\tcase langLegacy:\n\t\t\t\t\tif c&Legacy != 0 {\n\t\t\t\t\t\tif t.lang == _sh && t.script == 0 {\n\t\t\t\t\t\t\tt.script = _Latn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tt.lang = l\n\t\t\t\t\t\tchanged = true\n\t\t\t\t\t}\n\t\t\t\tcase langMacro:\n\t\t\t\t\tif c&Macro != 0 {\n\t\t\t\t\t\t// We deviate here from CLDR. The mapping \"nb\" -> \"no\"\n\t\t\t\t\t\t// qualifies as a typical Macro language mapping.  However,\n\t\t\t\t\t\t// for legacy reasons, CLDR maps \"no\", the macro language\n\t\t\t\t\t\t// code for Norwegian, to the dominant variant \"nb\". This\n\t\t\t\t\t\t// change is currently under consideration for CLDR as well.\n\t\t\t\t\t\t// See http://unicode.org/cldr/trac/ticket/2698 and also\n\t\t\t\t\t\t// http://unicode.org/cldr/trac/ticket/1790 for some of the\n\t\t\t\t\t\t// practical implications. TODO: this check could be removed\n\t\t\t\t\t\t// if CLDR adopts this change.\n\t\t\t\t\t\tif c&CLDR == 0 || t.lang != _nb {\n\t\t\t\t\t\t\tchanged = true\n\t\t\t\t\t\t\tt.lang = l\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tcase langDeprecated:\n\t\t\t\t\tif c&DeprecatedBase != 0 {\n\t\t\t\t\t\tif t.lang == _mo && t.region == 0 {\n\t\t\t\t\t\t\tt.region = _MD\n\t\t\t\t\t\t}\n\t\t\t\t\t\tt.lang = l\n\t\t\t\t\t\tchanged = true\n\t\t\t\t\t\t// Other canonicalization types may still apply.\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if c&Legacy != 0 && t.lang == _no && c&CLDR != 0 {\n\t\t\t\tt.lang = _nb\n\t\t\t\tchanged = true\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\tif c&DeprecatedScript != 0 {\n\t\tif t.script == _Qaai {\n\t\t\tchanged = true\n\t\t\tt.script = _Zinh\n\t\t}\n\t}\n\tif c&DeprecatedRegion != 0 {\n\t\tif r := normRegion(t.region); r != 0 {\n\t\t\tchanged = true\n\t\t\tt.region = r\n\t\t}\n\t}\n\treturn t, changed\n}\n\n// Canonicalize returns the canonicalized equivalent of the tag.\nfunc (c CanonType) Canonicalize(t Tag) (Tag, error) {\n\tt, changed := t.canonicalize(c)\n\tif changed {\n\t\tt.remakeString()\n\t}\n\treturn t, nil\n}\n\n// Confidence indicates the level of certainty for a given return value.\n// For example, Serbian may be written in Cyrillic or Latin script.\n// The confidence level indicates whether a value was explicitly specified,\n// whether it is typically the only possible value, or whether there is\n// an ambiguity.\ntype Confidence int\n\nconst (\n\tNo    Confidence = iota // full confidence that there was no match\n\tLow                     // most likely value picked out of a set of alternatives\n\tHigh                    // value is generally assumed to be the correct match\n\tExact                   // exact match or explicitly specified value\n)\n\nvar confName = []string{\"No\", \"Low\", \"High\", \"Exact\"}\n\nfunc (c Confidence) String() string {\n\treturn confName[c]\n}\n\n// remakeString is used to update t.str in case lang, script or region changed.\n// It is assumed that pExt and pVariant still point to the start of the\n// respective parts.\nfunc (t *Tag) remakeString() {\n\tif t.str == \"\" {\n\t\treturn\n\t}\n\textra := t.str[t.pVariant:]\n\tif t.pVariant > 0 {\n\t\textra = extra[1:]\n\t}\n\tif t.equalTags(und) && strings.HasPrefix(extra, \"x-\") {\n\t\tt.str = extra\n\t\tt.pVariant = 0\n\t\tt.pExt = 0\n\t\treturn\n\t}\n\tvar buf [max99thPercentileSize]byte // avoid extra memory allocation in most cases.\n\tb := buf[:t.genCoreBytes(buf[:])]\n\tif extra != \"\" {\n\t\tdiff := len(b) - int(t.pVariant)\n\t\tb = append(b, '-')\n\t\tb = append(b, extra...)\n\t\tt.pVariant = uint8(int(t.pVariant) + diff)\n\t\tt.pExt = uint16(int(t.pExt) + diff)\n\t} else {\n\t\tt.pVariant = uint8(len(b))\n\t\tt.pExt = uint16(len(b))\n\t}\n\tt.str = string(b)\n}\n\n// genCoreBytes writes a string for the base languages, script and region tags\n// to the given buffer and returns the number of bytes written. It will never\n// write more than maxCoreSize bytes.\nfunc (t *Tag) genCoreBytes(buf []byte) int {\n\tn := t.lang.stringToBuf(buf[:])\n\tif t.script != 0 {\n\t\tn += copy(buf[n:], \"-\")\n\t\tn += copy(buf[n:], t.script.String())\n\t}\n\tif t.region != 0 {\n\t\tn += copy(buf[n:], \"-\")\n\t\tn += copy(buf[n:], t.region.String())\n\t}\n\treturn n\n}\n\n// String returns the canonical string representation of the language tag.\nfunc (t Tag) String() string {\n\tif t.str != \"\" {\n\t\treturn t.str\n\t}\n\tif t.script == 0 && t.region == 0 {\n\t\treturn t.lang.String()\n\t}\n\tbuf := [maxCoreSize]byte{}\n\treturn string(buf[:t.genCoreBytes(buf[:])])\n}\n\n// Base returns the base language of the language tag. If the base language is\n// unspecified, an attempt will be made to infer it from the context.\n// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.\nfunc (t Tag) Base() (Base, Confidence) {\n\tif t.lang != 0 {\n\t\treturn Base{t.lang}, Exact\n\t}\n\tc := High\n\tif t.script == 0 && !(Region{t.region}).IsCountry() {\n\t\tc = Low\n\t}\n\tif tag, err := addTags(t); err == nil && tag.lang != 0 {\n\t\treturn Base{tag.lang}, c\n\t}\n\treturn Base{0}, No\n}\n\n// Script infers the script for the language tag. If it was not explicitly given, it will infer\n// a most likely candidate.\n// If more than one script is commonly used for a language, the most likely one\n// is returned with a low confidence indication. For example, it returns (Cyrl, Low)\n// for Serbian.\n// If a script cannot be inferred (Zzzz, No) is returned. We do not use Zyyy (undetermined)\n// as one would suspect from the IANA registry for BCP 47. In a Unicode context Zyyy marks\n// common characters (like 1, 2, 3, '.', etc.) and is therefore more like multiple scripts.\n// See http://www.unicode.org/reports/tr24/#Values for more details. Zzzz is also used for\n// unknown value in CLDR.  (Zzzz, Exact) is returned if Zzzz was explicitly specified.\n// Note that an inferred script is never guaranteed to be the correct one. Latin is\n// almost exclusively used for Afrikaans, but Arabic has been used for some texts\n// in the past.  Also, the script that is commonly used may change over time.\n// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.\nfunc (t Tag) Script() (Script, Confidence) {\n\tif t.script != 0 {\n\t\treturn Script{t.script}, Exact\n\t}\n\tsc, c := scriptID(_Zzzz), No\n\tif t.lang < langNoIndexOffset {\n\t\tif scr := scriptID(suppressScript[t.lang]); scr != 0 {\n\t\t\t// Note: it is not always the case that a language with a suppress\n\t\t\t// script value is only written in one script (e.g. kk, ms, pa).\n\t\t\tif t.region == 0 {\n\t\t\t\treturn Script{scriptID(scr)}, High\n\t\t\t}\n\t\t\tsc, c = scr, High\n\t\t}\n\t}\n\tif tag, err := addTags(t); err == nil {\n\t\tif tag.script != sc {\n\t\t\tsc, c = tag.script, Low\n\t\t}\n\t} else {\n\t\tt, _ = (Deprecated | Macro).Canonicalize(t)\n\t\tif tag, err := addTags(t); err == nil && tag.script != sc {\n\t\t\tsc, c = tag.script, Low\n\t\t}\n\t}\n\treturn Script{sc}, c\n}\n\n// Region returns the region for the language tag. If it was not explicitly given, it will\n// infer a most likely candidate from the context.\n// It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change.\nfunc (t Tag) Region() (Region, Confidence) {\n\tif t.region != 0 {\n\t\treturn Region{t.region}, Exact\n\t}\n\tif t, err := addTags(t); err == nil {\n\t\treturn Region{t.region}, Low // TODO: differentiate between high and low.\n\t}\n\tt, _ = (Deprecated | Macro).Canonicalize(t)\n\tif tag, err := addTags(t); err == nil {\n\t\treturn Region{tag.region}, Low\n\t}\n\treturn Region{_ZZ}, No // TODO: return world instead of undetermined?\n}\n\n// Variant returns the variants specified explicitly for this language tag.\n// or nil if no variant was specified.\nfunc (t Tag) Variants() []Variant {\n\tv := []Variant{}\n\tif int(t.pVariant) < int(t.pExt) {\n\t\tfor x, str := \"\", t.str[t.pVariant:t.pExt]; str != \"\"; {\n\t\t\tx, str = nextToken(str)\n\t\t\tv = append(v, Variant{x})\n\t\t}\n\t}\n\treturn v\n}\n\n// Parent returns the CLDR parent of t. In CLDR, missing fields in data for a\n// specific language are substituted with fields from the parent language.\n// The parent for a language may change for newer versions of CLDR.\nfunc (t Tag) Parent() Tag {\n\tif t.str != \"\" {\n\t\t// Strip the variants and extensions.\n\t\tt, _ = Raw.Compose(t.Raw())\n\t\tif t.region == 0 && t.script != 0 && t.lang != 0 {\n\t\t\tbase, _ := addTags(Tag{lang: t.lang})\n\t\t\tif base.script == t.script {\n\t\t\t\treturn Tag{lang: t.lang}\n\t\t\t}\n\t\t}\n\t\treturn t\n\t}\n\tif t.lang != 0 {\n\t\tif t.region != 0 {\n\t\t\tmaxScript := t.script\n\t\t\tif maxScript == 0 {\n\t\t\t\tmax, _ := addTags(t)\n\t\t\t\tmaxScript = max.script\n\t\t\t}\n\n\t\t\tfor i := range parents {\n\t\t\t\tif langID(parents[i].lang) == t.lang && scriptID(parents[i].maxScript) == maxScript {\n\t\t\t\t\tfor _, r := range parents[i].fromRegion {\n\t\t\t\t\t\tif regionID(r) == t.region {\n\t\t\t\t\t\t\treturn Tag{\n\t\t\t\t\t\t\t\tlang:   t.lang,\n\t\t\t\t\t\t\t\tscript: scriptID(parents[i].script),\n\t\t\t\t\t\t\t\tregion: regionID(parents[i].toRegion),\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\n\t\t\t// Strip the script if it is the default one.\n\t\t\tbase, _ := addTags(Tag{lang: t.lang})\n\t\t\tif base.script != maxScript {\n\t\t\t\treturn Tag{lang: t.lang, script: maxScript}\n\t\t\t}\n\t\t\treturn Tag{lang: t.lang}\n\t\t} else if t.script != 0 {\n\t\t\t// The parent for an base-script pair with a non-default script is\n\t\t\t// \"und\" instead of the base language.\n\t\t\tbase, _ := addTags(Tag{lang: t.lang})\n\t\t\tif base.script != t.script {\n\t\t\t\treturn und\n\t\t\t}\n\t\t\treturn Tag{lang: t.lang}\n\t\t}\n\t}\n\treturn und\n}\n\n// returns token t and the rest of the string.\nfunc nextToken(s string) (t, tail string) {\n\tp := strings.Index(s[1:], \"-\")\n\tif p == -1 {\n\t\treturn s[1:], \"\"\n\t}\n\tp++\n\treturn s[1:p], s[p:]\n}\n\n// Extension is a single BCP 47 extension.\ntype Extension struct {\n\ts string\n}\n\n// String returns the string representation of the extension, including the\n// type tag.\nfunc (e Extension) String() string {\n\treturn e.s\n}\n\n// ParseExtension parses s as an extension and returns it on success.\nfunc ParseExtension(s string) (e Extension, err error) {\n\tscan := makeScannerString(s)\n\tvar end int\n\tif n := len(scan.token); n != 1 {\n\t\treturn Extension{}, errSyntax\n\t}\n\tscan.toLower(0, len(scan.b))\n\tend = parseExtension(&scan)\n\tif end != len(s) {\n\t\treturn Extension{}, errSyntax\n\t}\n\treturn Extension{string(scan.b)}, nil\n}\n\n// Type returns the one-byte extension type of e. It returns 0 for the zero\n// exception.\nfunc (e Extension) Type() byte {\n\tif e.s == \"\" {\n\t\treturn 0\n\t}\n\treturn e.s[0]\n}\n\n// Tokens returns the list of tokens of e.\nfunc (e Extension) Tokens() []string {\n\treturn strings.Split(e.s, \"-\")\n}\n\n// Extension returns the extension of type x for tag t. It will return\n// false for ok if t does not have the requested extension. The returned\n// extension will be invalid in this case.\nfunc (t Tag) Extension(x byte) (ext Extension, ok bool) {\n\tfor i := int(t.pExt); i < len(t.str)-1; {\n\t\tvar ext string\n\t\ti, ext = getExtension(t.str, i)\n\t\tif ext[0] == x {\n\t\t\treturn Extension{ext}, true\n\t\t}\n\t}\n\treturn Extension{}, false\n}\n\n// Extensions returns all extensions of t.\nfunc (t Tag) Extensions() []Extension {\n\te := []Extension{}\n\tfor i := int(t.pExt); i < len(t.str)-1; {\n\t\tvar ext string\n\t\ti, ext = getExtension(t.str, i)\n\t\te = append(e, Extension{ext})\n\t}\n\treturn e\n}\n\n// TypeForKey returns the type associated with the given key, where key and type\n// are of the allowed values defined for the Unicode locale extension ('u') in\n// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.\n// TypeForKey will traverse the inheritance chain to get the correct value.\nfunc (t Tag) TypeForKey(key string) string {\n\tif start, end, _ := t.findTypeForKey(key); end != start {\n\t\treturn t.str[start:end]\n\t}\n\treturn \"\"\n}\n\nvar (\n\terrPrivateUse       = errors.New(\"cannot set a key on a private use tag\")\n\terrInvalidArguments = errors.New(\"invalid key or type\")\n)\n\n// SetTypeForKey returns a new Tag with the key set to type, where key and type\n// are of the allowed values defined for the Unicode locale extension ('u') in\n// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.\n// An empty value removes an existing pair with the same key.\nfunc (t Tag) SetTypeForKey(key, value string) (Tag, error) {\n\tif t.private() {\n\t\treturn t, errPrivateUse\n\t}\n\tif len(key) != 2 {\n\t\treturn t, errInvalidArguments\n\t}\n\n\t// Remove the setting if value is \"\".\n\tif value == \"\" {\n\t\tstart, end, _ := t.findTypeForKey(key)\n\t\tif start != end {\n\t\t\t// Remove key tag and leading '-'.\n\t\t\tstart -= 4\n\n\t\t\t// Remove a possible empty extension.\n\t\t\tif (end == len(t.str) || t.str[end+2] == '-') && t.str[start-2] == '-' {\n\t\t\t\tstart -= 2\n\t\t\t}\n\t\t\tif start == int(t.pVariant) && end == len(t.str) {\n\t\t\t\tt.str = \"\"\n\t\t\t\tt.pVariant, t.pExt = 0, 0\n\t\t\t} else {\n\t\t\t\tt.str = fmt.Sprintf(\"%s%s\", t.str[:start], t.str[end:])\n\t\t\t}\n\t\t}\n\t\treturn t, nil\n\t}\n\n\tif len(value) < 3 || len(value) > 8 {\n\t\treturn t, errInvalidArguments\n\t}\n\n\tvar (\n\t\tbuf    [maxCoreSize + maxSimpleUExtensionSize]byte\n\t\tuStart int // start of the -u extension.\n\t)\n\n\t// Generate the tag string if needed.\n\tif t.str == \"\" {\n\t\tuStart = t.genCoreBytes(buf[:])\n\t\tbuf[uStart] = '-'\n\t\tuStart++\n\t}\n\n\t// Create new key-type pair and parse it to verify.\n\tb := buf[uStart:]\n\tcopy(b, \"u-\")\n\tcopy(b[2:], key)\n\tb[4] = '-'\n\tb = b[:5+copy(b[5:], value)]\n\tscan := makeScanner(b)\n\tif parseExtensions(&scan); scan.err != nil {\n\t\treturn t, scan.err\n\t}\n\n\t// Assemble the replacement string.\n\tif t.str == \"\" {\n\t\tt.pVariant, t.pExt = byte(uStart-1), uint16(uStart-1)\n\t\tt.str = string(buf[:uStart+len(b)])\n\t} else {\n\t\ts := t.str\n\t\tstart, end, hasExt := t.findTypeForKey(key)\n\t\tif start == end {\n\t\t\tif hasExt {\n\t\t\t\tb = b[2:]\n\t\t\t}\n\t\t\tt.str = fmt.Sprintf(\"%s-%s%s\", s[:start], b, s[end:])\n\t\t} else {\n\t\t\tt.str = fmt.Sprintf(\"%s%s%s\", s[:start], value, s[end:])\n\t\t}\n\t}\n\treturn t, nil\n}\n\n// findKeyAndType returns the start and end position for the type corresponding\n// to key or the point at which to insert the key-value pair if the type\n// wasn't found. The hasExt return value reports whether an -u extension was present.\n// Note: the extensions are typically very small and are likely to contain\n// only one key-type pair.\nfunc (t Tag) findTypeForKey(key string) (start, end int, hasExt bool) {\n\tp := int(t.pExt)\n\tif len(key) != 2 || p == len(t.str) || p == 0 {\n\t\treturn p, p, false\n\t}\n\ts := t.str\n\n\t// Find the correct extension.\n\tfor p++; s[p] != 'u'; p++ {\n\t\tif s[p] > 'u' {\n\t\t\tp--\n\t\t\treturn p, p, false\n\t\t}\n\t\tif p = nextExtension(s, p); p == len(s) {\n\t\t\treturn len(s), len(s), false\n\t\t}\n\t}\n\t// Proceed to the hyphen following the extension name.\n\tp++\n\n\t// curKey is the key currently being processed.\n\tcurKey := \"\"\n\n\t// Iterate over keys until we get the end of a section.\n\tfor {\n\t\t// p points to the hyphen preceding the current token.\n\t\tif p3 := p + 3; s[p3] == '-' {\n\t\t\t// Found a key.\n\t\t\t// Check whether we just processed the key that was requested.\n\t\t\tif curKey == key {\n\t\t\t\treturn start, p, true\n\t\t\t}\n\t\t\t// Set to the next key and continue scanning type tokens.\n\t\t\tcurKey = s[p+1 : p3]\n\t\t\tif curKey > key {\n\t\t\t\treturn p, p, true\n\t\t\t}\n\t\t\t// Start of the type token sequence.\n\t\t\tstart = p + 4\n\t\t\t// A type is at least 3 characters long.\n\t\t\tp += 7 // 4 + 3\n\t\t} else {\n\t\t\t// Attribute or type, which is at least 3 characters long.\n\t\t\tp += 4\n\t\t}\n\t\t// p points past the third character of a type or attribute.\n\t\tmax := p + 5 // maximum length of token plus hyphen.\n\t\tif len(s) < max {\n\t\t\tmax = len(s)\n\t\t}\n\t\tfor ; p < max && s[p] != '-'; p++ {\n\t\t}\n\t\t// Bail if we have exhausted all tokens or if the next token starts\n\t\t// a new extension.\n\t\tif p == len(s) || s[p+2] == '-' {\n\t\t\tif curKey == key {\n\t\t\t\treturn start, p, true\n\t\t\t}\n\t\t\treturn p, p, true\n\t\t}\n\t}\n}\n\n// CompactIndex returns an index, where 0 <= index < NumCompactTags, for tags\n// for which data exists in the text repository. The index will change over time\n// and should not be stored in persistent storage. Extensions, except for the\n// 'va' type of the 'u' extension, are ignored. It will return 0, false if no\n// compact tag exists, where 0 is the index for the root language (Und).\nfunc CompactIndex(t Tag) (index int, ok bool) {\n\t// TODO: perhaps give more frequent tags a lower index.\n\t// TODO: we could make the indexes stable. This will excluded some\n\t//       possibilities for optimization, so don't do this quite yet.\n\tb, s, r := t.Raw()\n\tif len(t.str) > 0 {\n\t\tif strings.HasPrefix(t.str, \"x-\") {\n\t\t\t// We have no entries for user-defined tags.\n\t\t\treturn 0, false\n\t\t}\n\t\tif uint16(t.pVariant) != t.pExt {\n\t\t\t// There are no tags with variants and an u-va type.\n\t\t\tif t.TypeForKey(\"va\") != \"\" {\n\t\t\t\treturn 0, false\n\t\t\t}\n\t\t\tt, _ = Raw.Compose(b, s, r, t.Variants())\n\t\t} else if _, ok := t.Extension('u'); ok {\n\t\t\t// Strip all but the 'va' entry.\n\t\t\tvariant := t.TypeForKey(\"va\")\n\t\t\tt, _ = Raw.Compose(b, s, r)\n\t\t\tt, _ = t.SetTypeForKey(\"va\", variant)\n\t\t}\n\t\tif len(t.str) > 0 {\n\t\t\t// We have some variants.\n\t\t\tfor i, s := range specialTags {\n\t\t\t\tif s == t {\n\t\t\t\t\treturn i + 1, true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 0, false\n\t\t}\n\t}\n\t// No variants specified: just compare core components.\n\t// The key has the form lllssrrr, where l, s, and r are nibbles for\n\t// respectively the langID, scriptID, and regionID.\n\tkey := uint32(b.langID) << (8 + 12)\n\tkey |= uint32(s.scriptID) << 12\n\tkey |= uint32(r.regionID)\n\tx, ok := coreTags[key]\n\treturn int(x), ok\n}\n\n// Base is an ISO 639 language code, used for encoding the base language\n// of a language tag.\ntype Base struct {\n\tlangID\n}\n\n// ParseBase parses a 2- or 3-letter ISO 639 code.\n// It returns a ValueError if s is a well-formed but unknown language identifier\n// or another error if another error occurred.\nfunc ParseBase(s string) (Base, error) {\n\tif n := len(s); n < 2 || 3 < n {\n\t\treturn Base{}, errSyntax\n\t}\n\tvar buf [3]byte\n\tl, err := getLangID(buf[:copy(buf[:], s)])\n\treturn Base{l}, err\n}\n\n// Script is a 4-letter ISO 15924 code for representing scripts.\n// It is idiomatically represented in title case.\ntype Script struct {\n\tscriptID\n}\n\n// ParseScript parses a 4-letter ISO 15924 code.\n// It returns a ValueError if s is a well-formed but unknown script identifier\n// or another error if another error occurred.\nfunc ParseScript(s string) (Script, error) {\n\tif len(s) != 4 {\n\t\treturn Script{}, errSyntax\n\t}\n\tvar buf [4]byte\n\tsc, err := getScriptID(script, buf[:copy(buf[:], s)])\n\treturn Script{sc}, err\n}\n\n// Region is an ISO 3166-1 or UN M.49 code for representing countries and regions.\ntype Region struct {\n\tregionID\n}\n\n// EncodeM49 returns the Region for the given UN M.49 code.\n// It returns an error if r is not a valid code.\nfunc EncodeM49(r int) (Region, error) {\n\trid, err := getRegionM49(r)\n\treturn Region{rid}, err\n}\n\n// ParseRegion parses a 2- or 3-letter ISO 3166-1 or a UN M.49 code.\n// It returns a ValueError if s is a well-formed but unknown region identifier\n// or another error if another error occurred.\nfunc ParseRegion(s string) (Region, error) {\n\tif n := len(s); n < 2 || 3 < n {\n\t\treturn Region{}, errSyntax\n\t}\n\tvar buf [3]byte\n\tr, err := getRegionID(buf[:copy(buf[:], s)])\n\treturn Region{r}, err\n}\n\n// IsCountry returns whether this region is a country or autonomous area. This\n// includes non-standard definitions from CLDR.\nfunc (r Region) IsCountry() bool {\n\tif r.regionID == 0 || r.IsGroup() || r.IsPrivateUse() && r.regionID != _XK {\n\t\treturn false\n\t}\n\treturn true\n}\n\n// IsGroup returns whether this region defines a collection of regions. This\n// includes non-standard definitions from CLDR.\nfunc (r Region) IsGroup() bool {\n\tif r.regionID == 0 {\n\t\treturn false\n\t}\n\treturn int(regionInclusion[r.regionID]) < len(regionContainment)\n}\n\n// Contains returns whether Region c is contained by Region r. It returns true\n// if c == r.\nfunc (r Region) Contains(c Region) bool {\n\treturn r.regionID.contains(c.regionID)\n}\n\nfunc (r regionID) contains(c regionID) bool {\n\tif r == c {\n\t\treturn true\n\t}\n\tg := regionInclusion[r]\n\tif g >= nRegionGroups {\n\t\treturn false\n\t}\n\tm := regionContainment[g]\n\n\td := regionInclusion[c]\n\tb := regionInclusionBits[d]\n\n\t// A contained country may belong to multiple disjoint groups. Matching any\n\t// of these indicates containment. If the contained region is a group, it\n\t// must strictly be a subset.\n\tif d >= nRegionGroups {\n\t\treturn b&m != 0\n\t}\n\treturn b&^m == 0\n}\n\nvar errNoTLD = errors.New(\"language: region is not a valid ccTLD\")\n\n// TLD returns the country code top-level domain (ccTLD). UK is returned for GB.\n// In all other cases it returns either the region itself or an error.\n//\n// This method may return an error for a region for which there exists a\n// canonical form with a ccTLD. To get that ccTLD canonicalize r first. The\n// region will already be canonicalized it was obtained from a Tag that was\n// obtained using any of the default methods.\nfunc (r Region) TLD() (Region, error) {\n\t// See http://en.wikipedia.org/wiki/Country_code_top-level_domain for the\n\t// difference between ISO 3166-1 and IANA ccTLD.\n\tif r.regionID == _GB {\n\t\tr = Region{_UK}\n\t}\n\tif (r.typ() & ccTLD) == 0 {\n\t\treturn Region{}, errNoTLD\n\t}\n\treturn r, nil\n}\n\n// Canonicalize returns the region or a possible replacement if the region is\n// deprecated. It will not return a replacement for deprecated regions that\n// are split into multiple regions.\nfunc (r Region) Canonicalize() Region {\n\tif cr := normRegion(r.regionID); cr != 0 {\n\t\treturn Region{cr}\n\t}\n\treturn r\n}\n\n// Variant represents a registered variant of a language as defined by BCP 47.\ntype Variant struct {\n\tvariant string\n}\n\n// ParseVariant parses and returns a Variant. An error is returned if s is not\n// a valid variant.\nfunc ParseVariant(s string) (Variant, error) {\n\ts = strings.ToLower(s)\n\tif _, ok := variantIndex[s]; ok {\n\t\treturn Variant{s}, nil\n\t}\n\treturn Variant{}, mkErrInvalid([]byte(s))\n}\n\n// String returns the string representation of the variant.\nfunc (v Variant) String() string {\n\treturn v.variant\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/lookup.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\n\t\"golang.org/x/text/internal/tag\"\n)\n\n// findIndex tries to find the given tag in idx and returns a standardized error\n// if it could not be found.\nfunc findIndex(idx tag.Index, key []byte, form string) (index int, err error) {\n\tif !tag.FixCase(form, key) {\n\t\treturn 0, errSyntax\n\t}\n\ti := idx.Index(key)\n\tif i == -1 {\n\t\treturn 0, mkErrInvalid(key)\n\t}\n\treturn i, nil\n}\n\nfunc searchUint(imap []uint16, key uint16) int {\n\treturn sort.Search(len(imap), func(i int) bool {\n\t\treturn imap[i] >= key\n\t})\n}\n\ntype langID uint16\n\n// getLangID returns the langID of s if s is a canonical subtag\n// or langUnknown if s is not a canonical subtag.\nfunc getLangID(s []byte) (langID, error) {\n\tif len(s) == 2 {\n\t\treturn getLangISO2(s)\n\t}\n\treturn getLangISO3(s)\n}\n\n// mapLang returns the mapped langID of id according to mapping m.\nfunc normLang(id langID) (langID, langAliasType) {\n\tk := sort.Search(len(langAliasMap), func(i int) bool {\n\t\treturn langAliasMap[i].from >= uint16(id)\n\t})\n\tif k < len(langAliasMap) && langAliasMap[k].from == uint16(id) {\n\t\treturn langID(langAliasMap[k].to), langAliasTypes[k]\n\t}\n\treturn id, langAliasTypeUnknown\n}\n\n// getLangISO2 returns the langID for the given 2-letter ISO language code\n// or unknownLang if this does not exist.\nfunc getLangISO2(s []byte) (langID, error) {\n\tif !tag.FixCase(\"zz\", s) {\n\t\treturn 0, errSyntax\n\t}\n\tif i := lang.Index(s); i != -1 && lang.Elem(i)[3] != 0 {\n\t\treturn langID(i), nil\n\t}\n\treturn 0, mkErrInvalid(s)\n}\n\nconst base = 'z' - 'a' + 1\n\nfunc strToInt(s []byte) uint {\n\tv := uint(0)\n\tfor i := 0; i < len(s); i++ {\n\t\tv *= base\n\t\tv += uint(s[i] - 'a')\n\t}\n\treturn v\n}\n\n// converts the given integer to the original ASCII string passed to strToInt.\n// len(s) must match the number of characters obtained.\nfunc intToStr(v uint, s []byte) {\n\tfor i := len(s) - 1; i >= 0; i-- {\n\t\ts[i] = byte(v%base) + 'a'\n\t\tv /= base\n\t}\n}\n\n// getLangISO3 returns the langID for the given 3-letter ISO language code\n// or unknownLang if this does not exist.\nfunc getLangISO3(s []byte) (langID, error) {\n\tif tag.FixCase(\"und\", s) {\n\t\t// first try to match canonical 3-letter entries\n\t\tfor i := lang.Index(s[:2]); i != -1; i = lang.Next(s[:2], i) {\n\t\t\tif e := lang.Elem(i); e[3] == 0 && e[2] == s[2] {\n\t\t\t\t// We treat \"und\" as special and always translate it to \"unspecified\".\n\t\t\t\t// Note that ZZ and Zzzz are private use and are not treated as\n\t\t\t\t// unspecified by default.\n\t\t\t\tid := langID(i)\n\t\t\t\tif id == nonCanonicalUnd {\n\t\t\t\t\treturn 0, nil\n\t\t\t\t}\n\t\t\t\treturn id, nil\n\t\t\t}\n\t\t}\n\t\tif i := altLangISO3.Index(s); i != -1 {\n\t\t\treturn langID(altLangIndex[altLangISO3.Elem(i)[3]]), nil\n\t\t}\n\t\tn := strToInt(s)\n\t\tif langNoIndex[n/8]&(1<<(n%8)) != 0 {\n\t\t\treturn langID(n) + langNoIndexOffset, nil\n\t\t}\n\t\t// Check for non-canonical uses of ISO3.\n\t\tfor i := lang.Index(s[:1]); i != -1; i = lang.Next(s[:1], i) {\n\t\t\tif e := lang.Elem(i); e[2] == s[1] && e[3] == s[2] {\n\t\t\t\treturn langID(i), nil\n\t\t\t}\n\t\t}\n\t\treturn 0, mkErrInvalid(s)\n\t}\n\treturn 0, errSyntax\n}\n\n// stringToBuf writes the string to b and returns the number of bytes\n// written.  cap(b) must be >= 3.\nfunc (id langID) stringToBuf(b []byte) int {\n\tif id >= langNoIndexOffset {\n\t\tintToStr(uint(id)-langNoIndexOffset, b[:3])\n\t\treturn 3\n\t} else if id == 0 {\n\t\treturn copy(b, \"und\")\n\t}\n\tl := lang[id<<2:]\n\tif l[3] == 0 {\n\t\treturn copy(b, l[:3])\n\t}\n\treturn copy(b, l[:2])\n}\n\n// String returns the BCP 47 representation of the langID.\n// Use b as variable name, instead of id, to ensure the variable\n// used is consistent with that of Base in which this type is embedded.\nfunc (b langID) String() string {\n\tif b == 0 {\n\t\treturn \"und\"\n\t} else if b >= langNoIndexOffset {\n\t\tb -= langNoIndexOffset\n\t\tbuf := [3]byte{}\n\t\tintToStr(uint(b), buf[:])\n\t\treturn string(buf[:])\n\t}\n\tl := lang.Elem(int(b))\n\tif l[3] == 0 {\n\t\treturn l[:3]\n\t}\n\treturn l[:2]\n}\n\n// ISO3 returns the ISO 639-3 language code.\nfunc (b langID) ISO3() string {\n\tif b == 0 || b >= langNoIndexOffset {\n\t\treturn b.String()\n\t}\n\tl := lang.Elem(int(b))\n\tif l[3] == 0 {\n\t\treturn l[:3]\n\t} else if l[2] == 0 {\n\t\treturn altLangISO3.Elem(int(l[3]))[:3]\n\t}\n\t// This allocation will only happen for 3-letter ISO codes\n\t// that are non-canonical BCP 47 language identifiers.\n\treturn l[0:1] + l[2:4]\n}\n\n// IsPrivateUse reports whether this language code is reserved for private use.\nfunc (b langID) IsPrivateUse() bool {\n\treturn langPrivateStart <= b && b <= langPrivateEnd\n}\n\ntype regionID uint16\n\n// getRegionID returns the region id for s if s is a valid 2-letter region code\n// or unknownRegion.\nfunc getRegionID(s []byte) (regionID, error) {\n\tif len(s) == 3 {\n\t\tif isAlpha(s[0]) {\n\t\t\treturn getRegionISO3(s)\n\t\t}\n\t\tif i, err := strconv.ParseUint(string(s), 10, 10); err == nil {\n\t\t\treturn getRegionM49(int(i))\n\t\t}\n\t}\n\treturn getRegionISO2(s)\n}\n\n// getRegionISO2 returns the regionID for the given 2-letter ISO country code\n// or unknownRegion if this does not exist.\nfunc getRegionISO2(s []byte) (regionID, error) {\n\ti, err := findIndex(regionISO, s, \"ZZ\")\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn regionID(i) + isoRegionOffset, nil\n}\n\n// getRegionISO3 returns the regionID for the given 3-letter ISO country code\n// or unknownRegion if this does not exist.\nfunc getRegionISO3(s []byte) (regionID, error) {\n\tif tag.FixCase(\"ZZZ\", s) {\n\t\tfor i := regionISO.Index(s[:1]); i != -1; i = regionISO.Next(s[:1], i) {\n\t\t\tif e := regionISO.Elem(i); e[2] == s[1] && e[3] == s[2] {\n\t\t\t\treturn regionID(i) + isoRegionOffset, nil\n\t\t\t}\n\t\t}\n\t\tfor i := 0; i < len(altRegionISO3); i += 3 {\n\t\t\tif tag.Compare(altRegionISO3[i:i+3], s) == 0 {\n\t\t\t\treturn regionID(altRegionIDs[i/3]), nil\n\t\t\t}\n\t\t}\n\t\treturn 0, mkErrInvalid(s)\n\t}\n\treturn 0, errSyntax\n}\n\nfunc getRegionM49(n int) (regionID, error) {\n\tif 0 < n && n <= 999 {\n\t\tconst (\n\t\t\tsearchBits = 7\n\t\t\tregionBits = 9\n\t\t\tregionMask = 1<<regionBits - 1\n\t\t)\n\t\tidx := n >> searchBits\n\t\tbuf := fromM49[m49Index[idx]:m49Index[idx+1]]\n\t\tval := uint16(n) << regionBits // we rely on bits shifting out\n\t\ti := sort.Search(len(buf), func(i int) bool {\n\t\t\treturn buf[i] >= val\n\t\t})\n\t\tif r := fromM49[int(m49Index[idx])+i]; r&^regionMask == val {\n\t\t\treturn regionID(r & regionMask), nil\n\t\t}\n\t}\n\tvar e ValueError\n\tfmt.Fprint(bytes.NewBuffer([]byte(e.v[:])), n)\n\treturn 0, e\n}\n\n// normRegion returns a region if r is deprecated or 0 otherwise.\n// TODO: consider supporting BYS (-> BLR), CSK (-> 200 or CZ), PHI (-> PHL) and AFI (-> DJ).\n// TODO: consider mapping split up regions to new most populous one (like CLDR).\nfunc normRegion(r regionID) regionID {\n\tm := regionOldMap\n\tk := sort.Search(len(m), func(i int) bool {\n\t\treturn m[i].from >= uint16(r)\n\t})\n\tif k < len(m) && m[k].from == uint16(r) {\n\t\treturn regionID(m[k].to)\n\t}\n\treturn 0\n}\n\nconst (\n\tiso3166UserAssigned = 1 << iota\n\tccTLD\n\tbcp47Region\n)\n\nfunc (r regionID) typ() byte {\n\treturn regionTypes[r]\n}\n\n// String returns the BCP 47 representation for the region.\n// It returns \"ZZ\" for an unspecified region.\nfunc (r regionID) String() string {\n\tif r < isoRegionOffset {\n\t\tif r == 0 {\n\t\t\treturn \"ZZ\"\n\t\t}\n\t\treturn fmt.Sprintf(\"%03d\", r.M49())\n\t}\n\tr -= isoRegionOffset\n\treturn regionISO.Elem(int(r))[:2]\n}\n\n// ISO3 returns the 3-letter ISO code of r.\n// Note that not all regions have a 3-letter ISO code.\n// In such cases this method returns \"ZZZ\".\nfunc (r regionID) ISO3() string {\n\tif r < isoRegionOffset {\n\t\treturn \"ZZZ\"\n\t}\n\tr -= isoRegionOffset\n\treg := regionISO.Elem(int(r))\n\tswitch reg[2] {\n\tcase 0:\n\t\treturn altRegionISO3[reg[3]:][:3]\n\tcase ' ':\n\t\treturn \"ZZZ\"\n\t}\n\treturn reg[0:1] + reg[2:4]\n}\n\n// M49 returns the UN M.49 encoding of r, or 0 if this encoding\n// is not defined for r.\nfunc (r regionID) M49() int {\n\treturn int(m49[r])\n}\n\n// IsPrivateUse reports whether r has the ISO 3166 User-assigned status. This\n// may include private-use tags that are assigned by CLDR and used in this\n// implementation. So IsPrivateUse and IsCountry can be simultaneously true.\nfunc (r regionID) IsPrivateUse() bool {\n\treturn r.typ()&iso3166UserAssigned != 0\n}\n\ntype scriptID uint8\n\n// getScriptID returns the script id for string s. It assumes that s\n// is of the format [A-Z][a-z]{3}.\nfunc getScriptID(idx tag.Index, s []byte) (scriptID, error) {\n\ti, err := findIndex(idx, s, \"Zzzz\")\n\treturn scriptID(i), err\n}\n\n// String returns the script code in title case.\n// It returns \"Zzzz\" for an unspecified script.\nfunc (s scriptID) String() string {\n\tif s == 0 {\n\t\treturn \"Zzzz\"\n\t}\n\treturn script.Elem(int(s))\n}\n\n// IsPrivateUse reports whether this script code is reserved for private use.\nfunc (s scriptID) IsPrivateUse() bool {\n\treturn _Qaaa <= s && s <= _Qabx\n}\n\nconst (\n\tmaxAltTaglen = len(\"en-US-POSIX\")\n\tmaxLen       = maxAltTaglen\n)\n\nvar (\n\t// grandfatheredMap holds a mapping from legacy and grandfathered tags to\n\t// their base language or index to more elaborate tag.\n\tgrandfatheredMap = map[[maxLen]byte]int16{\n\t\t[maxLen]byte{'a', 'r', 't', '-', 'l', 'o', 'j', 'b', 'a', 'n'}: _jbo, // art-lojban\n\t\t[maxLen]byte{'i', '-', 'a', 'm', 'i'}:                          _ami, // i-ami\n\t\t[maxLen]byte{'i', '-', 'b', 'n', 'n'}:                          _bnn, // i-bnn\n\t\t[maxLen]byte{'i', '-', 'h', 'a', 'k'}:                          _hak, // i-hak\n\t\t[maxLen]byte{'i', '-', 'k', 'l', 'i', 'n', 'g', 'o', 'n'}:      _tlh, // i-klingon\n\t\t[maxLen]byte{'i', '-', 'l', 'u', 'x'}:                          _lb,  // i-lux\n\t\t[maxLen]byte{'i', '-', 'n', 'a', 'v', 'a', 'j', 'o'}:           _nv,  // i-navajo\n\t\t[maxLen]byte{'i', '-', 'p', 'w', 'n'}:                          _pwn, // i-pwn\n\t\t[maxLen]byte{'i', '-', 't', 'a', 'o'}:                          _tao, // i-tao\n\t\t[maxLen]byte{'i', '-', 't', 'a', 'y'}:                          _tay, // i-tay\n\t\t[maxLen]byte{'i', '-', 't', 's', 'u'}:                          _tsu, // i-tsu\n\t\t[maxLen]byte{'n', 'o', '-', 'b', 'o', 'k'}:                     _nb,  // no-bok\n\t\t[maxLen]byte{'n', 'o', '-', 'n', 'y', 'n'}:                     _nn,  // no-nyn\n\t\t[maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'f', 'r'}:      _sfb, // sgn-BE-FR\n\t\t[maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'n', 'l'}:      _vgt, // sgn-BE-NL\n\t\t[maxLen]byte{'s', 'g', 'n', '-', 'c', 'h', '-', 'd', 'e'}:      _sgg, // sgn-CH-DE\n\t\t[maxLen]byte{'z', 'h', '-', 'g', 'u', 'o', 'y', 'u'}:           _cmn, // zh-guoyu\n\t\t[maxLen]byte{'z', 'h', '-', 'h', 'a', 'k', 'k', 'a'}:           _hak, // zh-hakka\n\t\t[maxLen]byte{'z', 'h', '-', 'm', 'i', 'n', '-', 'n', 'a', 'n'}: _nan, // zh-min-nan\n\t\t[maxLen]byte{'z', 'h', '-', 'x', 'i', 'a', 'n', 'g'}:           _hsn, // zh-xiang\n\n\t\t// Grandfathered tags with no modern replacement will be converted as\n\t\t// follows:\n\t\t[maxLen]byte{'c', 'e', 'l', '-', 'g', 'a', 'u', 'l', 'i', 's', 'h'}: -1, // cel-gaulish\n\t\t[maxLen]byte{'e', 'n', '-', 'g', 'b', '-', 'o', 'e', 'd'}:           -2, // en-GB-oed\n\t\t[maxLen]byte{'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}:           -3, // i-default\n\t\t[maxLen]byte{'i', '-', 'e', 'n', 'o', 'c', 'h', 'i', 'a', 'n'}:      -4, // i-enochian\n\t\t[maxLen]byte{'i', '-', 'm', 'i', 'n', 'g', 'o'}:                     -5, // i-mingo\n\t\t[maxLen]byte{'z', 'h', '-', 'm', 'i', 'n'}:                          -6, // zh-min\n\n\t\t// CLDR-specific tag.\n\t\t[maxLen]byte{'r', 'o', 'o', 't'}:                                    0,  // root\n\t\t[maxLen]byte{'e', 'n', '-', 'u', 's', '-', 'p', 'o', 's', 'i', 'x'}: -7, // en_US_POSIX\"\n\t}\n\n\taltTagIndex = [...]uint8{0, 17, 31, 45, 61, 74, 86, 102}\n\n\taltTags = \"xtg-x-cel-gaulishen-GB-oxendicten-x-i-defaultund-x-i-enochiansee-x-i-mingonan-x-zh-minen-US-u-va-posix\"\n)\n\nfunc grandfathered(s [maxAltTaglen]byte) (t Tag, ok bool) {\n\tif v, ok := grandfatheredMap[s]; ok {\n\t\tif v < 0 {\n\t\t\treturn Make(altTags[altTagIndex[-v-1]:altTagIndex[-v]]), true\n\t\t}\n\t\tt.lang = langID(v)\n\t\treturn t, true\n\t}\n\treturn t, false\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/maketables.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build ignore\n\n// Language tag table generator.\n// Data read from the web.\n\npackage main\n\nimport (\n\t\"bufio\"\n\t\"flag\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"math\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"golang.org/x/text/internal/gen\"\n\t\"golang.org/x/text/internal/tag\"\n\t\"golang.org/x/text/unicode/cldr\"\n)\n\nvar (\n\ttest = flag.Bool(\"test\",\n\t\tfalse,\n\t\t\"test existing tables; can be used to compare web data with package data.\")\n\toutputFile = flag.String(\"output\",\n\t\t\"tables.go\",\n\t\t\"output file for generated tables\")\n)\n\nvar comment = []string{\n\t`\nlang holds an alphabetically sorted list of ISO-639 language identifiers.\nAll entries are 4 bytes. The index of the identifier (divided by 4) is the language tag.\nFor 2-byte language identifiers, the two successive bytes have the following meaning:\n    - if the first letter of the 2- and 3-letter ISO codes are the same:\n      the second and third letter of the 3-letter ISO code.\n    - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3.\nFor 3-byte language identifiers the 4th byte is 0.`,\n\t`\nlangNoIndex is a bit vector of all 3-letter language codes that are not used as an index\nin lookup tables. The language ids for these language codes are derived directly\nfrom the letters and are not consecutive.`,\n\t`\naltLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives\nto 2-letter language codes that cannot be derived using the method described above.\nEach 3-letter code is followed by its 1-byte langID.`,\n\t`\naltLangIndex is used to convert indexes in altLangISO3 to langIDs.`,\n\t`\nlangAliasMap maps langIDs to their suggested replacements.`,\n\t`\nscript is an alphabetically sorted list of ISO 15924 codes. The index\nof the script in the string, divided by 4, is the internal scriptID.`,\n\t`\nisoRegionOffset needs to be added to the index of regionISO to obtain the regionID\nfor 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for\nthe UN.M49 codes used for groups.)`,\n\t`\nregionISO holds a list of alphabetically sorted 2-letter ISO region codes.\nEach 2-letter codes is followed by two bytes with the following meaning:\n    - [A-Z}{2}: the first letter of the 2-letter code plus these two \n                letters form the 3-letter ISO code.\n    - 0, n:     index into altRegionISO3.`,\n\t`\nregionTypes defines the status of a region for various standards.`,\n\t`\nm49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are\ncodes indicating collections of regions.`,\n\t`\nm49Index gives indexes into fromM49 based on the three most significant bits\nof a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in\n   fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]]\nfor an entry where the first 7 bits match the 7 lsb of the UN.M49 code.\nThe region code is stored in the 9 lsb of the indexed value.`,\n\t`\nfromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.`,\n\t`\naltRegionISO3 holds a list of 3-letter region codes that cannot be\nmapped to 2-letter codes using the default algorithm. This is a short list.`,\n\t`\naltRegionIDs holds a list of regionIDs the positions of which match those\nof the 3-letter ISO codes in altRegionISO3.`,\n\t`\nvariantNumSpecialized is the number of specialized variants in variants.`,\n\t`\nsuppressScript is an index from langID to the dominant script for that language,\nif it exists.  If a script is given, it should be suppressed from the language tag.`,\n\t`\nlikelyLang is a lookup table, indexed by langID, for the most likely\nscripts and regions given incomplete information. If more entries exist for a\ngiven language, region and script are the index and size respectively\nof the list in likelyLangList.`,\n\t`\nlikelyLangList holds lists info associated with likelyLang.`,\n\t`\nlikelyRegion is a lookup table, indexed by regionID, for the most likely\nlanguages and scripts given incomplete information. If more entries exist\nfor a given regionID, lang and script are the index and size respectively\nof the list in likelyRegionList.\nTODO: exclude containers and user-definable regions from the list.`,\n\t`\nlikelyRegionList holds lists info associated with likelyRegion.`,\n\t`\nlikelyScript is a lookup table, indexed by scriptID, for the most likely\nlanguages and regions given a script.`,\n\t`\nmatchLang holds pairs of langIDs of base languages that are typically\nmutually intelligible. Each pair is associated with a confidence and\nwhether the intelligibility goes one or both ways.`,\n\t`\nmatchScript holds pairs of scriptIDs where readers of one script\ncan typically also read the other. Each is associated with a confidence.`,\n\t`\nnRegionGroups is the number of region groups.`,\n\t`\nregionInclusion maps region identifiers to sets of regions in regionInclusionBits,\nwhere each set holds all groupings that are directly connected in a region\ncontainment graph.`,\n\t`\nregionInclusionBits is an array of bit vectors where every vector represents\na set of region groupings.  These sets are used to compute the distance\nbetween two regions for the purpose of language matching.`,\n\t`\nregionInclusionNext marks, for each entry in regionInclusionBits, the set of\nall groups that are reachable from the groups set in the respective entry.`,\n}\n\n// TODO: consider changing some of these structures to tries. This can reduce\n// memory, but may increase the need for memory allocations. This could be\n// mitigated if we can piggyback on language tags for common cases.\n\nfunc failOnError(e error) {\n\tif e != nil {\n\t\tlog.Panic(e)\n\t}\n}\n\ntype setType int\n\nconst (\n\tIndexed setType = 1 + iota // all elements must be of same size\n\tLinear\n)\n\ntype stringSet struct {\n\ts              []string\n\tsorted, frozen bool\n\n\t// We often need to update values after the creation of an index is completed.\n\t// We include a convenience map for keeping track of this.\n\tupdate map[string]string\n\ttyp    setType // used for checking.\n}\n\nfunc (ss *stringSet) clone() stringSet {\n\tc := *ss\n\tc.s = append([]string(nil), c.s...)\n\treturn c\n}\n\nfunc (ss *stringSet) setType(t setType) {\n\tif ss.typ != t && ss.typ != 0 {\n\t\tlog.Panicf(\"type %d cannot be assigned as it was already %d\", t, ss.typ)\n\t}\n}\n\n// parse parses a whitespace-separated string and initializes ss with its\n// components.\nfunc (ss *stringSet) parse(s string) {\n\tscan := bufio.NewScanner(strings.NewReader(s))\n\tscan.Split(bufio.ScanWords)\n\tfor scan.Scan() {\n\t\tss.add(scan.Text())\n\t}\n}\n\nfunc (ss *stringSet) assertChangeable() {\n\tif ss.frozen {\n\t\tlog.Panic(\"attempt to modify a frozen stringSet\")\n\t}\n}\n\nfunc (ss *stringSet) add(s string) {\n\tss.assertChangeable()\n\tss.s = append(ss.s, s)\n\tss.sorted = ss.frozen\n}\n\nfunc (ss *stringSet) freeze() {\n\tss.compact()\n\tss.frozen = true\n}\n\nfunc (ss *stringSet) compact() {\n\tif ss.sorted {\n\t\treturn\n\t}\n\ta := ss.s\n\tsort.Strings(a)\n\tk := 0\n\tfor i := 1; i < len(a); i++ {\n\t\tif a[k] != a[i] {\n\t\t\ta[k+1] = a[i]\n\t\t\tk++\n\t\t}\n\t}\n\tss.s = a[:k+1]\n\tss.sorted = ss.frozen\n}\n\ntype funcSorter struct {\n\tfn func(a, b string) bool\n\tsort.StringSlice\n}\n\nfunc (s funcSorter) Less(i, j int) bool {\n\treturn s.fn(s.StringSlice[i], s.StringSlice[j])\n}\n\nfunc (ss *stringSet) sortFunc(f func(a, b string) bool) {\n\tss.compact()\n\tsort.Sort(funcSorter{f, sort.StringSlice(ss.s)})\n}\n\nfunc (ss *stringSet) remove(s string) {\n\tss.assertChangeable()\n\tif i, ok := ss.find(s); ok {\n\t\tcopy(ss.s[i:], ss.s[i+1:])\n\t\tss.s = ss.s[:len(ss.s)-1]\n\t}\n}\n\nfunc (ss *stringSet) replace(ol, nu string) {\n\tss.s[ss.index(ol)] = nu\n\tss.sorted = ss.frozen\n}\n\nfunc (ss *stringSet) index(s string) int {\n\tss.setType(Indexed)\n\ti, ok := ss.find(s)\n\tif !ok {\n\t\tif i < len(ss.s) {\n\t\t\tlog.Panicf(\"find: item %q is not in list. Closest match is %q.\", s, ss.s[i])\n\t\t}\n\t\tlog.Panicf(\"find: item %q is not in list\", s)\n\n\t}\n\treturn i\n}\n\nfunc (ss *stringSet) find(s string) (int, bool) {\n\tss.compact()\n\ti := sort.SearchStrings(ss.s, s)\n\treturn i, i != len(ss.s) && ss.s[i] == s\n}\n\nfunc (ss *stringSet) slice() []string {\n\tss.compact()\n\treturn ss.s\n}\n\nfunc (ss *stringSet) updateLater(v, key string) {\n\tif ss.update == nil {\n\t\tss.update = map[string]string{}\n\t}\n\tss.update[v] = key\n}\n\n// join joins the string and ensures that all entries are of the same length.\nfunc (ss *stringSet) join() string {\n\tss.setType(Indexed)\n\tn := len(ss.s[0])\n\tfor _, s := range ss.s {\n\t\tif len(s) != n {\n\t\t\tlog.Panicf(\"join: not all entries are of the same length: %q\", s)\n\t\t}\n\t}\n\tss.s = append(ss.s, strings.Repeat(\"\\xff\", n))\n\treturn strings.Join(ss.s, \"\")\n}\n\n// ianaEntry holds information for an entry in the IANA Language Subtag Repository.\n// All types use the same entry.\n// See http://tools.ietf.org/html/bcp47#section-5.1 for a description of the various\n// fields.\ntype ianaEntry struct {\n\ttyp            string\n\tdescription    []string\n\tscope          string\n\tadded          string\n\tpreferred      string\n\tdeprecated     string\n\tsuppressScript string\n\tmacro          string\n\tprefix         []string\n}\n\ntype builder struct {\n\tw    *gen.CodeWriter\n\thw   io.Writer // MultiWriter for w and w.Hash\n\tdata *cldr.CLDR\n\tsupp *cldr.SupplementalData\n\n\t// indices\n\tlocale      stringSet // common locales\n\tlang        stringSet // canonical language ids (2 or 3 letter ISO codes) with data\n\tlangNoIndex stringSet // 3-letter ISO codes with no associated data\n\tscript      stringSet // 4-letter ISO codes\n\tregion      stringSet // 2-letter ISO or 3-digit UN M49 codes\n\tvariant     stringSet // 4-8-alphanumeric variant code.\n\n\t// Region codes that are groups with their corresponding group IDs.\n\tgroups map[int]index\n\n\t// langInfo\n\tregistry map[string]*ianaEntry\n}\n\ntype index uint\n\nfunc newBuilder(w *gen.CodeWriter) *builder {\n\tr := gen.OpenCLDRCoreZip()\n\tdefer r.Close()\n\td := &cldr.Decoder{}\n\tdata, err := d.DecodeZip(r)\n\tfailOnError(err)\n\tb := builder{\n\t\tw:    w,\n\t\thw:   io.MultiWriter(w, w.Hash),\n\t\tdata: data,\n\t\tsupp: data.Supplemental(),\n\t}\n\tb.parseRegistry()\n\treturn &b\n}\n\nfunc (b *builder) parseRegistry() {\n\tr := gen.OpenIANAFile(\"assignments/language-subtag-registry\")\n\tdefer r.Close()\n\tb.registry = make(map[string]*ianaEntry)\n\n\tscan := bufio.NewScanner(r)\n\tscan.Split(bufio.ScanWords)\n\tvar record *ianaEntry\n\tfor more := scan.Scan(); more; {\n\t\tkey := scan.Text()\n\t\tmore = scan.Scan()\n\t\tvalue := scan.Text()\n\t\tswitch key {\n\t\tcase \"Type:\":\n\t\t\trecord = &ianaEntry{typ: value}\n\t\tcase \"Subtag:\", \"Tag:\":\n\t\t\tif s := strings.SplitN(value, \"..\", 2); len(s) > 1 {\n\t\t\t\tfor a := s[0]; a <= s[1]; a = inc(a) {\n\t\t\t\t\tb.addToRegistry(a, record)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tb.addToRegistry(value, record)\n\t\t\t}\n\t\tcase \"Suppress-Script:\":\n\t\t\trecord.suppressScript = value\n\t\tcase \"Added:\":\n\t\t\trecord.added = value\n\t\tcase \"Deprecated:\":\n\t\t\trecord.deprecated = value\n\t\tcase \"Macrolanguage:\":\n\t\t\trecord.macro = value\n\t\tcase \"Preferred-Value:\":\n\t\t\trecord.preferred = value\n\t\tcase \"Prefix:\":\n\t\t\trecord.prefix = append(record.prefix, value)\n\t\tcase \"Scope:\":\n\t\t\trecord.scope = value\n\t\tcase \"Description:\":\n\t\t\tbuf := []byte(value)\n\t\t\tfor more = scan.Scan(); more; more = scan.Scan() {\n\t\t\t\tb := scan.Bytes()\n\t\t\t\tif b[0] == '%' || b[len(b)-1] == ':' {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tbuf = append(buf, ' ')\n\t\t\t\tbuf = append(buf, b...)\n\t\t\t}\n\t\t\trecord.description = append(record.description, string(buf))\n\t\t\tcontinue\n\t\tdefault:\n\t\t\tcontinue\n\t\t}\n\t\tmore = scan.Scan()\n\t}\n\tif scan.Err() != nil {\n\t\tlog.Panic(scan.Err())\n\t}\n}\n\nfunc (b *builder) addToRegistry(key string, entry *ianaEntry) {\n\tif info, ok := b.registry[key]; ok {\n\t\tif info.typ != \"language\" || entry.typ != \"extlang\" {\n\t\t\tlog.Fatalf(\"parseRegistry: tag %q already exists\", key)\n\t\t}\n\t} else {\n\t\tb.registry[key] = entry\n\t}\n}\n\nvar commentIndex = make(map[string]string)\n\nfunc init() {\n\tfor _, s := range comment {\n\t\tkey := strings.TrimSpace(strings.SplitN(s, \" \", 2)[0])\n\t\tcommentIndex[key] = s\n\t}\n}\n\nfunc (b *builder) comment(name string) {\n\tif s := commentIndex[name]; len(s) > 0 {\n\t\tb.w.WriteComment(s)\n\t} else {\n\t\tfmt.Fprintln(b.w)\n\t}\n}\n\nfunc (b *builder) pf(f string, x ...interface{}) {\n\tfmt.Fprintf(b.hw, f, x...)\n\tfmt.Fprint(b.hw, \"\\n\")\n}\n\nfunc (b *builder) p(x ...interface{}) {\n\tfmt.Fprintln(b.hw, x...)\n}\n\nfunc (b *builder) addSize(s int) {\n\tb.w.Size += s\n\tb.pf(\"// Size: %d bytes\", s)\n}\n\nfunc (b *builder) writeConst(name string, x interface{}) {\n\tb.comment(name)\n\tb.w.WriteConst(name, x)\n}\n\n// writeConsts computes f(v) for all v in values and writes the results\n// as constants named _v to a single constant block.\nfunc (b *builder) writeConsts(f func(string) int, values ...string) {\n\tb.pf(\"const (\")\n\tfor _, v := range values {\n\t\tb.pf(\"\\t_%s = %v\", v, f(v))\n\t}\n\tb.pf(\")\")\n}\n\n// writeType writes the type of the given value, which must be a struct.\nfunc (b *builder) writeType(value interface{}) {\n\tb.comment(reflect.TypeOf(value).Name())\n\tb.w.WriteType(value)\n}\n\nfunc (b *builder) writeSlice(name string, ss interface{}) {\n\tb.writeSliceAddSize(name, 0, ss)\n}\n\nfunc (b *builder) writeSliceAddSize(name string, extraSize int, ss interface{}) {\n\tb.comment(name)\n\tb.w.Size += extraSize\n\tv := reflect.ValueOf(ss)\n\tt := v.Type().Elem()\n\tb.pf(\"// Size: %d bytes, %d elements\", v.Len()*int(t.Size())+extraSize, v.Len())\n\n\tfmt.Fprintf(b.w, \"var %s = \", name)\n\tb.w.WriteArray(ss)\n\tb.p()\n}\n\ntype fromTo struct {\n\tfrom, to uint16\n}\n\nfunc (b *builder) writeSortedMap(name string, ss *stringSet, index func(s string) uint16) {\n\tss.sortFunc(func(a, b string) bool {\n\t\treturn index(a) < index(b)\n\t})\n\tm := []fromTo{}\n\tfor _, s := range ss.s {\n\t\tm = append(m, fromTo{index(s), index(ss.update[s])})\n\t}\n\tb.writeSlice(name, m)\n}\n\nconst base = 'z' - 'a' + 1\n\nfunc strToInt(s string) uint {\n\tv := uint(0)\n\tfor i := 0; i < len(s); i++ {\n\t\tv *= base\n\t\tv += uint(s[i] - 'a')\n\t}\n\treturn v\n}\n\n// converts the given integer to the original ASCII string passed to strToInt.\n// len(s) must match the number of characters obtained.\nfunc intToStr(v uint, s []byte) {\n\tfor i := len(s) - 1; i >= 0; i-- {\n\t\ts[i] = byte(v%base) + 'a'\n\t\tv /= base\n\t}\n}\n\nfunc (b *builder) writeBitVector(name string, ss []string) {\n\tvec := make([]uint8, int(math.Ceil(math.Pow(base, float64(len(ss[0])))/8)))\n\tfor _, s := range ss {\n\t\tv := strToInt(s)\n\t\tvec[v/8] |= 1 << (v % 8)\n\t}\n\tb.writeSlice(name, vec)\n}\n\n// TODO: convert this type into a list or two-stage trie.\nfunc (b *builder) writeMapFunc(name string, m map[string]string, f func(string) uint16) {\n\tb.comment(name)\n\tv := reflect.ValueOf(m)\n\tsz := v.Len() * (2 + int(v.Type().Key().Size()))\n\tfor _, k := range m {\n\t\tsz += len(k)\n\t}\n\tb.addSize(sz)\n\tkeys := []string{}\n\tb.pf(`var %s = map[string]uint16{`, name)\n\tfor k := range m {\n\t\tkeys = append(keys, k)\n\t}\n\tsort.Strings(keys)\n\tfor _, k := range keys {\n\t\tb.pf(\"\\t%q: %v,\", k, f(m[k]))\n\t}\n\tb.p(\"}\")\n}\n\nfunc (b *builder) writeMap(name string, m interface{}) {\n\tb.comment(name)\n\tv := reflect.ValueOf(m)\n\tsz := v.Len() * (2 + int(v.Type().Key().Size()) + int(v.Type().Elem().Size()))\n\tb.addSize(sz)\n\tf := strings.FieldsFunc(fmt.Sprintf(\"%#v\", m), func(r rune) bool {\n\t\treturn strings.IndexRune(\"{}, \", r) != -1\n\t})\n\tsort.Strings(f[1:])\n\tb.pf(`var %s = %s{`, name, f[0])\n\tfor _, kv := range f[1:] {\n\t\tb.pf(\"\\t%s,\", kv)\n\t}\n\tb.p(\"}\")\n}\n\nfunc (b *builder) langIndex(s string) uint16 {\n\tif s == \"und\" {\n\t\treturn 0\n\t}\n\tif i, ok := b.lang.find(s); ok {\n\t\treturn uint16(i)\n\t}\n\treturn uint16(strToInt(s)) + uint16(len(b.lang.s))\n}\n\n// inc advances the string to its lexicographical successor.\nfunc inc(s string) string {\n\tconst maxTagLength = 4\n\tvar buf [maxTagLength]byte\n\tintToStr(strToInt(strings.ToLower(s))+1, buf[:len(s)])\n\tfor i := 0; i < len(s); i++ {\n\t\tif s[i] <= 'Z' {\n\t\t\tbuf[i] -= 'a' - 'A'\n\t\t}\n\t}\n\treturn string(buf[:len(s)])\n}\n\nfunc (b *builder) parseIndices() {\n\tmeta := b.supp.Metadata\n\n\tfor k, v := range b.registry {\n\t\tvar ss *stringSet\n\t\tswitch v.typ {\n\t\tcase \"language\":\n\t\t\tif len(k) == 2 || v.suppressScript != \"\" || v.scope == \"special\" {\n\t\t\t\tb.lang.add(k)\n\t\t\t\tcontinue\n\t\t\t} else {\n\t\t\t\tss = &b.langNoIndex\n\t\t\t}\n\t\tcase \"region\":\n\t\t\tss = &b.region\n\t\tcase \"script\":\n\t\t\tss = &b.script\n\t\tcase \"variant\":\n\t\t\tss = &b.variant\n\t\tdefault:\n\t\t\tcontinue\n\t\t}\n\t\tss.add(k)\n\t}\n\t// Include any language for which there is data.\n\tfor _, lang := range b.data.Locales() {\n\t\tif x := b.data.RawLDML(lang); false ||\n\t\t\tx.LocaleDisplayNames != nil ||\n\t\t\tx.Characters != nil ||\n\t\t\tx.Delimiters != nil ||\n\t\t\tx.Measurement != nil ||\n\t\t\tx.Dates != nil ||\n\t\t\tx.Numbers != nil ||\n\t\t\tx.Units != nil ||\n\t\t\tx.ListPatterns != nil ||\n\t\t\tx.Collations != nil ||\n\t\t\tx.Segmentations != nil ||\n\t\t\tx.Rbnf != nil ||\n\t\t\tx.Annotations != nil ||\n\t\t\tx.Metadata != nil {\n\n\t\t\tfrom := strings.Split(lang, \"_\")\n\t\t\tif lang := from[0]; lang != \"root\" {\n\t\t\t\tb.lang.add(lang)\n\t\t\t}\n\t\t}\n\t}\n\t// Include locales for plural rules, which uses a different structure.\n\tfor _, plurals := range b.data.Supplemental().Plurals {\n\t\tfor _, rules := range plurals.PluralRules {\n\t\t\tfor _, lang := range strings.Split(rules.Locales, \" \") {\n\t\t\t\tif lang = strings.Split(lang, \"_\")[0]; lang != \"root\" {\n\t\t\t\t\tb.lang.add(lang)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Include languages in likely subtags.\n\tfor _, m := range b.supp.LikelySubtags.LikelySubtag {\n\t\tfrom := strings.Split(m.From, \"_\")\n\t\tb.lang.add(from[0])\n\t}\n\t// Include ISO-639 alpha-3 bibliographic entries.\n\tfor _, a := range meta.Alias.LanguageAlias {\n\t\tif a.Reason == \"bibliographic\" {\n\t\t\tb.langNoIndex.add(a.Type)\n\t\t}\n\t}\n\t// Include regions in territoryAlias (not all are in the IANA registry!)\n\tfor _, reg := range b.supp.Metadata.Alias.TerritoryAlias {\n\t\tif len(reg.Type) == 2 {\n\t\t\tb.region.add(reg.Type)\n\t\t}\n\t}\n\n\tfor _, s := range b.lang.s {\n\t\tif len(s) == 3 {\n\t\t\tb.langNoIndex.remove(s)\n\t\t}\n\t}\n\tb.writeConst(\"numLanguages\", len(b.lang.slice())+len(b.langNoIndex.slice()))\n\tb.writeConst(\"numScripts\", len(b.script.slice()))\n\tb.writeConst(\"numRegions\", len(b.region.slice()))\n\n\t// Add dummy codes at the start of each list to represent \"unspecified\".\n\tb.lang.add(\"---\")\n\tb.script.add(\"----\")\n\tb.region.add(\"---\")\n\n\t// common locales\n\tb.locale.parse(meta.DefaultContent.Locales)\n}\n\n// TODO: region inclusion data will probably not be use used in future matchers.\n\nfunc (b *builder) computeRegionGroups() {\n\tb.groups = make(map[int]index)\n\n\t// Create group indices.\n\tfor i := 1; b.region.s[i][0] < 'A'; i++ { // Base M49 indices on regionID.\n\t\tb.groups[i] = index(len(b.groups))\n\t}\n\tfor _, g := range b.supp.TerritoryContainment.Group {\n\t\t// Skip UN and EURO zone as they are flattening the containment\n\t\t// relationship.\n\t\tif g.Type == \"EZ\" || g.Type == \"UN\" {\n\t\t\tcontinue\n\t\t}\n\t\tgroup := b.region.index(g.Type)\n\t\tif _, ok := b.groups[group]; !ok {\n\t\t\tb.groups[group] = index(len(b.groups))\n\t\t}\n\t}\n\tif len(b.groups) > 32 {\n\t\tlog.Fatalf(\"only 32 groups supported, found %d\", len(b.groups))\n\t}\n\tb.writeConst(\"nRegionGroups\", len(b.groups))\n}\n\nvar langConsts = []string{\n\t\"af\", \"am\", \"ar\", \"az\", \"bg\", \"bn\", \"ca\", \"cs\", \"da\", \"de\", \"el\", \"en\", \"es\",\n\t\"et\", \"fa\", \"fi\", \"fil\", \"fr\", \"gu\", \"he\", \"hi\", \"hr\", \"hu\", \"hy\", \"id\", \"is\",\n\t\"it\", \"ja\", \"ka\", \"kk\", \"km\", \"kn\", \"ko\", \"ky\", \"lo\", \"lt\", \"lv\", \"mk\", \"ml\",\n\t\"mn\", \"mo\", \"mr\", \"ms\", \"mul\", \"my\", \"nb\", \"ne\", \"nl\", \"no\", \"pa\", \"pl\", \"pt\",\n\t\"ro\", \"ru\", \"sh\", \"si\", \"sk\", \"sl\", \"sq\", \"sr\", \"sv\", \"sw\", \"ta\", \"te\", \"th\",\n\t\"tl\", \"tn\", \"tr\", \"uk\", \"ur\", \"uz\", \"vi\", \"zh\", \"zu\",\n\n\t// constants for grandfathered tags (if not already defined)\n\t\"jbo\", \"ami\", \"bnn\", \"hak\", \"tlh\", \"lb\", \"nv\", \"pwn\", \"tao\", \"tay\", \"tsu\",\n\t\"nn\", \"sfb\", \"vgt\", \"sgg\", \"cmn\", \"nan\", \"hsn\",\n}\n\n// writeLanguage generates all tables needed for language canonicalization.\nfunc (b *builder) writeLanguage() {\n\tmeta := b.supp.Metadata\n\n\tb.writeConst(\"nonCanonicalUnd\", b.lang.index(\"und\"))\n\tb.writeConsts(func(s string) int { return int(b.langIndex(s)) }, langConsts...)\n\tb.writeConst(\"langPrivateStart\", b.langIndex(\"qaa\"))\n\tb.writeConst(\"langPrivateEnd\", b.langIndex(\"qtz\"))\n\n\t// Get language codes that need to be mapped (overlong 3-letter codes,\n\t// deprecated 2-letter codes, legacy and grandfathered tags.)\n\tlangAliasMap := stringSet{}\n\taliasTypeMap := map[string]langAliasType{}\n\n\t// altLangISO3 get the alternative ISO3 names that need to be mapped.\n\taltLangISO3 := stringSet{}\n\t// Add dummy start to avoid the use of index 0.\n\taltLangISO3.add(\"---\")\n\taltLangISO3.updateLater(\"---\", \"aa\")\n\n\tlang := b.lang.clone()\n\tfor _, a := range meta.Alias.LanguageAlias {\n\t\tif a.Replacement == \"\" {\n\t\t\ta.Replacement = \"und\"\n\t\t}\n\t\t// TODO: support mapping to tags\n\t\trepl := strings.SplitN(a.Replacement, \"_\", 2)[0]\n\t\tif a.Reason == \"overlong\" {\n\t\t\tif len(a.Replacement) == 2 && len(a.Type) == 3 {\n\t\t\t\tlang.updateLater(a.Replacement, a.Type)\n\t\t\t}\n\t\t} else if len(a.Type) <= 3 {\n\t\t\tswitch a.Reason {\n\t\t\tcase \"macrolanguage\":\n\t\t\t\taliasTypeMap[a.Type] = langMacro\n\t\t\tcase \"deprecated\":\n\t\t\t\t// handled elsewhere\n\t\t\t\tcontinue\n\t\t\tcase \"bibliographic\", \"legacy\":\n\t\t\t\tif a.Type == \"no\" {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\taliasTypeMap[a.Type] = langLegacy\n\t\t\tdefault:\n\t\t\t\tlog.Fatalf(\"new %s alias: %s\", a.Reason, a.Type)\n\t\t\t}\n\t\t\tlangAliasMap.add(a.Type)\n\t\t\tlangAliasMap.updateLater(a.Type, repl)\n\t\t}\n\t}\n\t// Manually add the mapping of \"nb\" (Norwegian) to its macro language.\n\t// This can be removed if CLDR adopts this change.\n\tlangAliasMap.add(\"nb\")\n\tlangAliasMap.updateLater(\"nb\", \"no\")\n\taliasTypeMap[\"nb\"] = langMacro\n\n\tfor k, v := range b.registry {\n\t\t// Also add deprecated values for 3-letter ISO codes, which CLDR omits.\n\t\tif v.typ == \"language\" && v.deprecated != \"\" && v.preferred != \"\" {\n\t\t\tlangAliasMap.add(k)\n\t\t\tlangAliasMap.updateLater(k, v.preferred)\n\t\t\taliasTypeMap[k] = langDeprecated\n\t\t}\n\t}\n\t// Fix CLDR mappings.\n\tlang.updateLater(\"tl\", \"tgl\")\n\tlang.updateLater(\"sh\", \"hbs\")\n\tlang.updateLater(\"mo\", \"mol\")\n\tlang.updateLater(\"no\", \"nor\")\n\tlang.updateLater(\"tw\", \"twi\")\n\tlang.updateLater(\"nb\", \"nob\")\n\tlang.updateLater(\"ak\", \"aka\")\n\tlang.updateLater(\"bh\", \"bih\")\n\n\t// Ensure that each 2-letter code is matched with a 3-letter code.\n\tfor _, v := range lang.s[1:] {\n\t\ts, ok := lang.update[v]\n\t\tif !ok {\n\t\t\tif s, ok = lang.update[langAliasMap.update[v]]; !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlang.update[v] = s\n\t\t}\n\t\tif v[0] != s[0] {\n\t\t\taltLangISO3.add(s)\n\t\t\taltLangISO3.updateLater(s, v)\n\t\t}\n\t}\n\n\t// Complete canonialized language tags.\n\tlang.freeze()\n\tfor i, v := range lang.s {\n\t\t// We can avoid these manual entries by using the IANI registry directly.\n\t\t// Seems easier to update the list manually, as changes are rare.\n\t\t// The panic in this loop will trigger if we miss an entry.\n\t\tadd := \"\"\n\t\tif s, ok := lang.update[v]; ok {\n\t\t\tif s[0] == v[0] {\n\t\t\t\tadd = s[1:]\n\t\t\t} else {\n\t\t\t\tadd = string([]byte{0, byte(altLangISO3.index(s))})\n\t\t\t}\n\t\t} else if len(v) == 3 {\n\t\t\tadd = \"\\x00\"\n\t\t} else {\n\t\t\tlog.Panicf(\"no data for long form of %q\", v)\n\t\t}\n\t\tlang.s[i] += add\n\t}\n\tb.writeConst(\"lang\", tag.Index(lang.join()))\n\n\tb.writeConst(\"langNoIndexOffset\", len(b.lang.s))\n\n\t// space of all valid 3-letter language identifiers.\n\tb.writeBitVector(\"langNoIndex\", b.langNoIndex.slice())\n\n\taltLangIndex := []uint16{}\n\tfor i, s := range altLangISO3.slice() {\n\t\taltLangISO3.s[i] += string([]byte{byte(len(altLangIndex))})\n\t\tif i > 0 {\n\t\t\tidx := b.lang.index(altLangISO3.update[s])\n\t\t\taltLangIndex = append(altLangIndex, uint16(idx))\n\t\t}\n\t}\n\tb.writeConst(\"altLangISO3\", tag.Index(altLangISO3.join()))\n\tb.writeSlice(\"altLangIndex\", altLangIndex)\n\n\tb.writeSortedMap(\"langAliasMap\", &langAliasMap, b.langIndex)\n\ttypes := make([]langAliasType, len(langAliasMap.s))\n\tfor i, s := range langAliasMap.s {\n\t\ttypes[i] = aliasTypeMap[s]\n\t}\n\tb.writeSlice(\"langAliasTypes\", types)\n}\n\nvar scriptConsts = []string{\n\t\"Latn\", \"Hani\", \"Hans\", \"Hant\", \"Qaaa\", \"Qaai\", \"Qabx\", \"Zinh\", \"Zyyy\",\n\t\"Zzzz\",\n}\n\nfunc (b *builder) writeScript() {\n\tb.writeConsts(b.script.index, scriptConsts...)\n\tb.writeConst(\"script\", tag.Index(b.script.join()))\n\n\tsupp := make([]uint8, len(b.lang.slice()))\n\tfor i, v := range b.lang.slice()[1:] {\n\t\tif sc := b.registry[v].suppressScript; sc != \"\" {\n\t\t\tsupp[i+1] = uint8(b.script.index(sc))\n\t\t}\n\t}\n\tb.writeSlice(\"suppressScript\", supp)\n\n\t// There is only one deprecated script in CLDR. This value is hard-coded.\n\t// We check here if the code must be updated.\n\tfor _, a := range b.supp.Metadata.Alias.ScriptAlias {\n\t\tif a.Type != \"Qaai\" {\n\t\t\tlog.Panicf(\"unexpected deprecated stript %q\", a.Type)\n\t\t}\n\t}\n}\n\nfunc parseM49(s string) int16 {\n\tif len(s) == 0 {\n\t\treturn 0\n\t}\n\tv, err := strconv.ParseUint(s, 10, 10)\n\tfailOnError(err)\n\treturn int16(v)\n}\n\nvar regionConsts = []string{\n\t\"001\", \"419\", \"BR\", \"CA\", \"ES\", \"GB\", \"MD\", \"PT\", \"UK\", \"US\",\n\t\"ZZ\", \"XA\", \"XC\", \"XK\", // Unofficial tag for Kosovo.\n}\n\nfunc (b *builder) writeRegion() {\n\tb.writeConsts(b.region.index, regionConsts...)\n\n\tisoOffset := b.region.index(\"AA\")\n\tm49map := make([]int16, len(b.region.slice()))\n\tfromM49map := make(map[int16]int)\n\taltRegionISO3 := \"\"\n\taltRegionIDs := []uint16{}\n\n\tb.writeConst(\"isoRegionOffset\", isoOffset)\n\n\t// 2-letter region lookup and mapping to numeric codes.\n\tregionISO := b.region.clone()\n\tregionISO.s = regionISO.s[isoOffset:]\n\tregionISO.sorted = false\n\n\tregionTypes := make([]byte, len(b.region.s))\n\n\t// Is the region valid BCP 47?\n\tfor s, e := range b.registry {\n\t\tif len(s) == 2 && s == strings.ToUpper(s) {\n\t\t\ti := b.region.index(s)\n\t\t\tfor _, d := range e.description {\n\t\t\t\tif strings.Contains(d, \"Private use\") {\n\t\t\t\t\tregionTypes[i] = iso3166UserAssgined\n\t\t\t\t}\n\t\t\t}\n\t\t\tregionTypes[i] |= bcp47Region\n\t\t}\n\t}\n\n\t// Is the region a valid ccTLD?\n\tr := gen.OpenIANAFile(\"domains/root/db\")\n\tdefer r.Close()\n\n\tbuf, err := ioutil.ReadAll(r)\n\tfailOnError(err)\n\tre := regexp.MustCompile(`\"/domains/root/db/([a-z]{2}).html\"`)\n\tfor _, m := range re.FindAllSubmatch(buf, -1) {\n\t\ti := b.region.index(strings.ToUpper(string(m[1])))\n\t\tregionTypes[i] |= ccTLD\n\t}\n\n\tb.writeSlice(\"regionTypes\", regionTypes)\n\n\tiso3Set := make(map[string]int)\n\tupdate := func(iso2, iso3 string) {\n\t\ti := regionISO.index(iso2)\n\t\tif j, ok := iso3Set[iso3]; !ok && iso3[0] == iso2[0] {\n\t\t\tregionISO.s[i] += iso3[1:]\n\t\t\tiso3Set[iso3] = -1\n\t\t} else {\n\t\t\tif ok && j >= 0 {\n\t\t\t\tregionISO.s[i] += string([]byte{0, byte(j)})\n\t\t\t} else {\n\t\t\t\tiso3Set[iso3] = len(altRegionISO3)\n\t\t\t\tregionISO.s[i] += string([]byte{0, byte(len(altRegionISO3))})\n\t\t\t\taltRegionISO3 += iso3\n\t\t\t\taltRegionIDs = append(altRegionIDs, uint16(isoOffset+i))\n\t\t\t}\n\t\t}\n\t}\n\tfor _, tc := range b.supp.CodeMappings.TerritoryCodes {\n\t\ti := regionISO.index(tc.Type) + isoOffset\n\t\tif d := m49map[i]; d != 0 {\n\t\t\tlog.Panicf(\"%s found as a duplicate UN.M49 code of %03d\", tc.Numeric, d)\n\t\t}\n\t\tm49 := parseM49(tc.Numeric)\n\t\tm49map[i] = m49\n\t\tif r := fromM49map[m49]; r == 0 {\n\t\t\tfromM49map[m49] = i\n\t\t} else if r != i {\n\t\t\tdep := b.registry[regionISO.s[r-isoOffset]].deprecated\n\t\t\tif t := b.registry[tc.Type]; t != nil && dep != \"\" && (t.deprecated == \"\" || t.deprecated > dep) {\n\t\t\t\tfromM49map[m49] = i\n\t\t\t}\n\t\t}\n\t}\n\tfor _, ta := range b.supp.Metadata.Alias.TerritoryAlias {\n\t\tif len(ta.Type) == 3 && ta.Type[0] <= '9' && len(ta.Replacement) == 2 {\n\t\t\tfrom := parseM49(ta.Type)\n\t\t\tif r := fromM49map[from]; r == 0 {\n\t\t\t\tfromM49map[from] = regionISO.index(ta.Replacement) + isoOffset\n\t\t\t}\n\t\t}\n\t}\n\tfor _, tc := range b.supp.CodeMappings.TerritoryCodes {\n\t\tif len(tc.Alpha3) == 3 {\n\t\t\tupdate(tc.Type, tc.Alpha3)\n\t\t}\n\t}\n\t// This entries are not included in territoryCodes. Mostly 3-letter variants\n\t// of deleted codes and an entry for QU.\n\tfor _, m := range []struct{ iso2, iso3 string }{\n\t\t{\"CT\", \"CTE\"},\n\t\t{\"DY\", \"DHY\"},\n\t\t{\"HV\", \"HVO\"},\n\t\t{\"JT\", \"JTN\"},\n\t\t{\"MI\", \"MID\"},\n\t\t{\"NH\", \"NHB\"},\n\t\t{\"NQ\", \"ATN\"},\n\t\t{\"PC\", \"PCI\"},\n\t\t{\"PU\", \"PUS\"},\n\t\t{\"PZ\", \"PCZ\"},\n\t\t{\"RH\", \"RHO\"},\n\t\t{\"VD\", \"VDR\"},\n\t\t{\"WK\", \"WAK\"},\n\t\t// These three-letter codes are used for others as well.\n\t\t{\"FQ\", \"ATF\"},\n\t} {\n\t\tupdate(m.iso2, m.iso3)\n\t}\n\tfor i, s := range regionISO.s {\n\t\tif len(s) != 4 {\n\t\t\tregionISO.s[i] = s + \"  \"\n\t\t}\n\t}\n\tb.writeConst(\"regionISO\", tag.Index(regionISO.join()))\n\tb.writeConst(\"altRegionISO3\", altRegionISO3)\n\tb.writeSlice(\"altRegionIDs\", altRegionIDs)\n\n\t// Create list of deprecated regions.\n\t// TODO: consider inserting SF -> FI. Not included by CLDR, but is the only\n\t// Transitionally-reserved mapping not included.\n\tregionOldMap := stringSet{}\n\t// Include regions in territoryAlias (not all are in the IANA registry!)\n\tfor _, reg := range b.supp.Metadata.Alias.TerritoryAlias {\n\t\tif len(reg.Type) == 2 && reg.Reason == \"deprecated\" && len(reg.Replacement) == 2 {\n\t\t\tregionOldMap.add(reg.Type)\n\t\t\tregionOldMap.updateLater(reg.Type, reg.Replacement)\n\t\t\ti, _ := regionISO.find(reg.Type)\n\t\t\tj, _ := regionISO.find(reg.Replacement)\n\t\t\tif k := m49map[i+isoOffset]; k == 0 {\n\t\t\t\tm49map[i+isoOffset] = m49map[j+isoOffset]\n\t\t\t}\n\t\t}\n\t}\n\tb.writeSortedMap(\"regionOldMap\", &regionOldMap, func(s string) uint16 {\n\t\treturn uint16(b.region.index(s))\n\t})\n\t// 3-digit region lookup, groupings.\n\tfor i := 1; i < isoOffset; i++ {\n\t\tm := parseM49(b.region.s[i])\n\t\tm49map[i] = m\n\t\tfromM49map[m] = i\n\t}\n\tb.writeSlice(\"m49\", m49map)\n\n\tconst (\n\t\tsearchBits = 7\n\t\tregionBits = 9\n\t)\n\tif len(m49map) >= 1<<regionBits {\n\t\tlog.Fatalf(\"Maximum number of regions exceeded: %d > %d\", len(m49map), 1<<regionBits)\n\t}\n\tm49Index := [9]int16{}\n\tfromM49 := []uint16{}\n\tm49 := []int{}\n\tfor k, _ := range fromM49map {\n\t\tm49 = append(m49, int(k))\n\t}\n\tsort.Ints(m49)\n\tfor _, k := range m49[1:] {\n\t\tval := (k & (1<<searchBits - 1)) << regionBits\n\t\tfromM49 = append(fromM49, uint16(val|fromM49map[int16(k)]))\n\t\tm49Index[1:][k>>searchBits] = int16(len(fromM49))\n\t}\n\tb.writeSlice(\"m49Index\", m49Index)\n\tb.writeSlice(\"fromM49\", fromM49)\n}\n\nconst (\n\t// TODO: put these lists in regionTypes as user data? Could be used for\n\t// various optimizations and refinements and could be exposed in the API.\n\tiso3166Except = \"AC CP DG EA EU FX IC SU TA UK\"\n\tiso3166Trans  = \"AN BU CS NT TP YU ZR\" // SF is not in our set of Regions.\n\t// DY and RH are actually not deleted, but indeterminately reserved.\n\tiso3166DelCLDR = \"CT DD DY FQ HV JT MI NH NQ PC PU PZ RH VD WK YD\"\n)\n\nconst (\n\tiso3166UserAssgined = 1 << iota\n\tccTLD\n\tbcp47Region\n)\n\nfunc find(list []string, s string) int {\n\tfor i, t := range list {\n\t\tif t == s {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\n// writeVariants generates per-variant information and creates a map from variant\n// name to index value. We assign index values such that sorting multiple\n// variants by index value will result in the correct order.\n// There are two types of variants: specialized and general. Specialized variants\n// are only applicable to certain language or language-script pairs. Generalized\n// variants apply to any language. Generalized variants always sort after\n// specialized variants.  We will therefore always assign a higher index value\n// to a generalized variant than any other variant. Generalized variants are\n// sorted alphabetically among themselves.\n// Specialized variants may also sort after other specialized variants. Such\n// variants will be ordered after any of the variants they may follow.\n// We assume that if a variant x is followed by a variant y, then for any prefix\n// p of x, p-x is a prefix of y. This allows us to order tags based on the\n// maximum of the length of any of its prefixes.\n// TODO: it is possible to define a set of Prefix values on variants such that\n// a total order cannot be defined to the point that this algorithm breaks.\n// In other words, we cannot guarantee the same order of variants for the\n// future using the same algorithm or for non-compliant combinations of\n// variants. For this reason, consider using simple alphabetic sorting\n// of variants and ignore Prefix restrictions altogether.\nfunc (b *builder) writeVariant() {\n\tgeneralized := stringSet{}\n\tspecialized := stringSet{}\n\tspecializedExtend := stringSet{}\n\t// Collate the variants by type and check assumptions.\n\tfor _, v := range b.variant.slice() {\n\t\te := b.registry[v]\n\t\tif len(e.prefix) == 0 {\n\t\t\tgeneralized.add(v)\n\t\t\tcontinue\n\t\t}\n\t\tc := strings.Split(e.prefix[0], \"-\")\n\t\thasScriptOrRegion := false\n\t\tif len(c) > 1 {\n\t\t\t_, hasScriptOrRegion = b.script.find(c[1])\n\t\t\tif !hasScriptOrRegion {\n\t\t\t\t_, hasScriptOrRegion = b.region.find(c[1])\n\n\t\t\t}\n\t\t}\n\t\tif len(c) == 1 || len(c) == 2 && hasScriptOrRegion {\n\t\t\t// Variant is preceded by a language.\n\t\t\tspecialized.add(v)\n\t\t\tcontinue\n\t\t}\n\t\t// Variant is preceded by another variant.\n\t\tspecializedExtend.add(v)\n\t\tprefix := c[0] + \"-\"\n\t\tif hasScriptOrRegion {\n\t\t\tprefix += c[1]\n\t\t}\n\t\tfor _, p := range e.prefix {\n\t\t\t// Verify that the prefix minus the last element is a prefix of the\n\t\t\t// predecessor element.\n\t\t\ti := strings.LastIndex(p, \"-\")\n\t\t\tpred := b.registry[p[i+1:]]\n\t\t\tif find(pred.prefix, p[:i]) < 0 {\n\t\t\t\tlog.Fatalf(\"prefix %q for variant %q not consistent with predecessor spec\", p, v)\n\t\t\t}\n\t\t\t// The sorting used below does not work in the general case. It works\n\t\t\t// if we assume that variants that may be followed by others only have\n\t\t\t// prefixes of the same length. Verify this.\n\t\t\tcount := strings.Count(p[:i], \"-\")\n\t\t\tfor _, q := range pred.prefix {\n\t\t\t\tif c := strings.Count(q, \"-\"); c != count {\n\t\t\t\t\tlog.Fatalf(\"variant %q preceding %q has a prefix %q of size %d; want %d\", p[i+1:], v, q, c, count)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !strings.HasPrefix(p, prefix) {\n\t\t\t\tlog.Fatalf(\"prefix %q of variant %q should start with %q\", p, v, prefix)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sort extended variants.\n\ta := specializedExtend.s\n\tless := func(v, w string) bool {\n\t\t// Sort by the maximum number of elements.\n\t\tmaxCount := func(s string) (max int) {\n\t\t\tfor _, p := range b.registry[s].prefix {\n\t\t\t\tif c := strings.Count(p, \"-\"); c > max {\n\t\t\t\t\tmax = c\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tif cv, cw := maxCount(v), maxCount(w); cv != cw {\n\t\t\treturn cv < cw\n\t\t}\n\t\t// Sort by name as tie breaker.\n\t\treturn v < w\n\t}\n\tsort.Sort(funcSorter{less, sort.StringSlice(a)})\n\tspecializedExtend.frozen = true\n\n\t// Create index from variant name to index.\n\tvariantIndex := make(map[string]uint8)\n\tadd := func(s []string) {\n\t\tfor _, v := range s {\n\t\t\tvariantIndex[v] = uint8(len(variantIndex))\n\t\t}\n\t}\n\tadd(specialized.slice())\n\tadd(specializedExtend.s)\n\tnumSpecialized := len(variantIndex)\n\tadd(generalized.slice())\n\tif n := len(variantIndex); n > 255 {\n\t\tlog.Fatalf(\"maximum number of variants exceeded: was %d; want <= 255\", n)\n\t}\n\tb.writeMap(\"variantIndex\", variantIndex)\n\tb.writeConst(\"variantNumSpecialized\", numSpecialized)\n}\n\nfunc (b *builder) writeLanguageInfo() {\n}\n\n// writeLikelyData writes tables that are used both for finding parent relations and for\n// language matching.  Each entry contains additional bits to indicate the status of the\n// data to know when it cannot be used for parent relations.\nfunc (b *builder) writeLikelyData() {\n\tconst (\n\t\tisList = 1 << iota\n\t\tscriptInFrom\n\t\tregionInFrom\n\t)\n\ttype ( // generated types\n\t\tlikelyScriptRegion struct {\n\t\t\tregion uint16\n\t\t\tscript uint8\n\t\t\tflags  uint8\n\t\t}\n\t\tlikelyLangScript struct {\n\t\t\tlang   uint16\n\t\t\tscript uint8\n\t\t\tflags  uint8\n\t\t}\n\t\tlikelyLangRegion struct {\n\t\t\tlang   uint16\n\t\t\tregion uint16\n\t\t}\n\t\t// likelyTag is used for getting likely tags for group regions, where\n\t\t// the likely region might be a region contained in the group.\n\t\tlikelyTag struct {\n\t\t\tlang   uint16\n\t\t\tregion uint16\n\t\t\tscript uint8\n\t\t}\n\t)\n\tvar ( // generated variables\n\t\tlikelyRegionGroup = make([]likelyTag, len(b.groups))\n\t\tlikelyLang        = make([]likelyScriptRegion, len(b.lang.s))\n\t\tlikelyRegion      = make([]likelyLangScript, len(b.region.s))\n\t\tlikelyScript      = make([]likelyLangRegion, len(b.script.s))\n\t\tlikelyLangList    = []likelyScriptRegion{}\n\t\tlikelyRegionList  = []likelyLangScript{}\n\t)\n\ttype fromTo struct {\n\t\tfrom, to []string\n\t}\n\tlangToOther := map[int][]fromTo{}\n\tregionToOther := map[int][]fromTo{}\n\tfor _, m := range b.supp.LikelySubtags.LikelySubtag {\n\t\tfrom := strings.Split(m.From, \"_\")\n\t\tto := strings.Split(m.To, \"_\")\n\t\tif len(to) != 3 {\n\t\t\tlog.Fatalf(\"invalid number of subtags in %q: found %d, want 3\", m.To, len(to))\n\t\t}\n\t\tif len(from) > 3 {\n\t\t\tlog.Fatalf(\"invalid number of subtags: found %d, want 1-3\", len(from))\n\t\t}\n\t\tif from[0] != to[0] && from[0] != \"und\" {\n\t\t\tlog.Fatalf(\"unexpected language change in expansion: %s -> %s\", from, to)\n\t\t}\n\t\tif len(from) == 3 {\n\t\t\tif from[2] != to[2] {\n\t\t\t\tlog.Fatalf(\"unexpected region change in expansion: %s -> %s\", from, to)\n\t\t\t}\n\t\t\tif from[0] != \"und\" {\n\t\t\t\tlog.Fatalf(\"unexpected fully specified from tag: %s -> %s\", from, to)\n\t\t\t}\n\t\t}\n\t\tif len(from) == 1 || from[0] != \"und\" {\n\t\t\tid := 0\n\t\t\tif from[0] != \"und\" {\n\t\t\t\tid = b.lang.index(from[0])\n\t\t\t}\n\t\t\tlangToOther[id] = append(langToOther[id], fromTo{from, to})\n\t\t} else if len(from) == 2 && len(from[1]) == 4 {\n\t\t\tsid := b.script.index(from[1])\n\t\t\tlikelyScript[sid].lang = uint16(b.langIndex(to[0]))\n\t\t\tlikelyScript[sid].region = uint16(b.region.index(to[2]))\n\t\t} else {\n\t\t\tr := b.region.index(from[len(from)-1])\n\t\t\tif id, ok := b.groups[r]; ok {\n\t\t\t\tif from[0] != \"und\" {\n\t\t\t\t\tlog.Fatalf(\"region changed unexpectedly: %s -> %s\", from, to)\n\t\t\t\t}\n\t\t\t\tlikelyRegionGroup[id].lang = uint16(b.langIndex(to[0]))\n\t\t\t\tlikelyRegionGroup[id].script = uint8(b.script.index(to[1]))\n\t\t\t\tlikelyRegionGroup[id].region = uint16(b.region.index(to[2]))\n\t\t\t} else {\n\t\t\t\tregionToOther[r] = append(regionToOther[r], fromTo{from, to})\n\t\t\t}\n\t\t}\n\t}\n\tb.writeType(likelyLangRegion{})\n\tb.writeSlice(\"likelyScript\", likelyScript)\n\n\tfor id := range b.lang.s {\n\t\tlist := langToOther[id]\n\t\tif len(list) == 1 {\n\t\t\tlikelyLang[id].region = uint16(b.region.index(list[0].to[2]))\n\t\t\tlikelyLang[id].script = uint8(b.script.index(list[0].to[1]))\n\t\t} else if len(list) > 1 {\n\t\t\tlikelyLang[id].flags = isList\n\t\t\tlikelyLang[id].region = uint16(len(likelyLangList))\n\t\t\tlikelyLang[id].script = uint8(len(list))\n\t\t\tfor _, x := range list {\n\t\t\t\tflags := uint8(0)\n\t\t\t\tif len(x.from) > 1 {\n\t\t\t\t\tif x.from[1] == x.to[2] {\n\t\t\t\t\t\tflags = regionInFrom\n\t\t\t\t\t} else {\n\t\t\t\t\t\tflags = scriptInFrom\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlikelyLangList = append(likelyLangList, likelyScriptRegion{\n\t\t\t\t\tregion: uint16(b.region.index(x.to[2])),\n\t\t\t\t\tscript: uint8(b.script.index(x.to[1])),\n\t\t\t\t\tflags:  flags,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\t// TODO: merge suppressScript data with this table.\n\tb.writeType(likelyScriptRegion{})\n\tb.writeSlice(\"likelyLang\", likelyLang)\n\tb.writeSlice(\"likelyLangList\", likelyLangList)\n\n\tfor id := range b.region.s {\n\t\tlist := regionToOther[id]\n\t\tif len(list) == 1 {\n\t\t\tlikelyRegion[id].lang = uint16(b.langIndex(list[0].to[0]))\n\t\t\tlikelyRegion[id].script = uint8(b.script.index(list[0].to[1]))\n\t\t\tif len(list[0].from) > 2 {\n\t\t\t\tlikelyRegion[id].flags = scriptInFrom\n\t\t\t}\n\t\t} else if len(list) > 1 {\n\t\t\tlikelyRegion[id].flags = isList\n\t\t\tlikelyRegion[id].lang = uint16(len(likelyRegionList))\n\t\t\tlikelyRegion[id].script = uint8(len(list))\n\t\t\tfor i, x := range list {\n\t\t\t\tif len(x.from) == 2 && i != 0 || i > 0 && len(x.from) != 3 {\n\t\t\t\t\tlog.Fatalf(\"unspecified script must be first in list: %v at %d\", x.from, i)\n\t\t\t\t}\n\t\t\t\tx := likelyLangScript{\n\t\t\t\t\tlang:   uint16(b.langIndex(x.to[0])),\n\t\t\t\t\tscript: uint8(b.script.index(x.to[1])),\n\t\t\t\t}\n\t\t\t\tif len(list[0].from) > 2 {\n\t\t\t\t\tx.flags = scriptInFrom\n\t\t\t\t}\n\t\t\t\tlikelyRegionList = append(likelyRegionList, x)\n\t\t\t}\n\t\t}\n\t}\n\tb.writeType(likelyLangScript{})\n\tb.writeSlice(\"likelyRegion\", likelyRegion)\n\tb.writeSlice(\"likelyRegionList\", likelyRegionList)\n\n\tb.writeType(likelyTag{})\n\tb.writeSlice(\"likelyRegionGroup\", likelyRegionGroup)\n}\n\ntype mutualIntelligibility struct {\n\twant, have uint16\n\tconf       uint8\n\toneway     bool\n}\n\ntype scriptIntelligibility struct {\n\tlang       uint16 // langID or 0 if *\n\twant, have uint8\n\tconf       uint8\n}\n\ntype sortByConf []mutualIntelligibility\n\nfunc (l sortByConf) Less(a, b int) bool {\n\treturn l[a].conf > l[b].conf\n}\n\nfunc (l sortByConf) Swap(a, b int) {\n\tl[a], l[b] = l[b], l[a]\n}\n\nfunc (l sortByConf) Len() int {\n\treturn len(l)\n}\n\n// toConf converts a percentage value [0, 100] to a confidence class.\nfunc toConf(pct uint8) uint8 {\n\tswitch {\n\tcase pct == 100:\n\t\treturn 3 // Exact\n\tcase pct >= 90:\n\t\treturn 2 // High\n\tcase pct > 50:\n\t\treturn 1 // Low\n\tdefault:\n\t\treturn 0 // No\n\t}\n}\n\n// writeMatchData writes tables with languages and scripts for which there is\n// mutual intelligibility. The data is based on CLDR's languageMatching data.\n// Note that we use a different algorithm than the one defined by CLDR and that\n// we slightly modify the data. For example, we convert scores to confidence levels.\n// We also drop all region-related data as we use a different algorithm to\n// determine region equivalence.\nfunc (b *builder) writeMatchData() {\n\tb.writeType(mutualIntelligibility{})\n\tb.writeType(scriptIntelligibility{})\n\tlm := b.supp.LanguageMatching.LanguageMatches\n\tcldr.MakeSlice(&lm).SelectAnyOf(\"type\", \"written\")\n\n\tmatchLang := []mutualIntelligibility{}\n\tmatchScript := []scriptIntelligibility{}\n\t// Convert the languageMatch entries in lists keyed by desired language.\n\tfor _, m := range lm[0].LanguageMatch {\n\t\t// Different versions of CLDR use different separators.\n\t\tdesired := strings.Replace(m.Desired, \"-\", \"_\", -1)\n\t\tsupported := strings.Replace(m.Supported, \"-\", \"_\", -1)\n\t\td := strings.Split(desired, \"_\")\n\t\ts := strings.Split(supported, \"_\")\n\t\tif len(d) != len(s) || len(d) > 2 {\n\t\t\t// Skip all entries with regions and work around CLDR bug.\n\t\t\tcontinue\n\t\t}\n\t\tpct, _ := strconv.ParseInt(m.Percent, 10, 8)\n\t\tif len(d) == 2 && d[0] == s[0] && len(d[1]) == 4 {\n\t\t\t// language-script pair.\n\t\t\tlang := uint16(0)\n\t\t\tif d[0] != \"*\" {\n\t\t\t\tlang = uint16(b.langIndex(d[0]))\n\t\t\t}\n\t\t\tmatchScript = append(matchScript, scriptIntelligibility{\n\t\t\t\tlang: lang,\n\t\t\t\twant: uint8(b.script.index(d[1])),\n\t\t\t\thave: uint8(b.script.index(s[1])),\n\t\t\t\tconf: toConf(uint8(pct)),\n\t\t\t})\n\t\t\tif m.Oneway != \"true\" {\n\t\t\t\tmatchScript = append(matchScript, scriptIntelligibility{\n\t\t\t\t\tlang: lang,\n\t\t\t\t\twant: uint8(b.script.index(s[1])),\n\t\t\t\t\thave: uint8(b.script.index(d[1])),\n\t\t\t\t\tconf: toConf(uint8(pct)),\n\t\t\t\t})\n\t\t\t}\n\t\t} else if len(d) == 1 && d[0] != \"*\" {\n\t\t\tif pct == 100 {\n\t\t\t\t// nb == no is already handled by macro mapping. Check there\n\t\t\t\t// really is only this case.\n\t\t\t\tif d[0] != \"no\" || s[0] != \"nb\" {\n\t\t\t\t\tlog.Fatalf(\"unhandled equivalence %s == %s\", s[0], d[0])\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmatchLang = append(matchLang, mutualIntelligibility{\n\t\t\t\twant:   uint16(b.langIndex(d[0])),\n\t\t\t\thave:   uint16(b.langIndex(s[0])),\n\t\t\t\tconf:   uint8(pct),\n\t\t\t\toneway: m.Oneway == \"true\",\n\t\t\t})\n\t\t} else {\n\t\t\t// TODO: Handle other mappings.\n\t\t\ta := []string{\"*;*\", \"*_*;*_*\", \"es_MX;es_419\"}\n\t\t\ts := strings.Join([]string{desired, supported}, \";\")\n\t\t\tif i := sort.SearchStrings(a, s); i == len(a) || a[i] != s {\n\t\t\t\tlog.Printf(\"%q not handled\", s)\n\t\t\t}\n\t\t}\n\t}\n\tsort.Stable(sortByConf(matchLang))\n\t// collapse percentage into confidence classes\n\tfor i, m := range matchLang {\n\t\tmatchLang[i].conf = toConf(m.conf)\n\t}\n\tb.writeSlice(\"matchLang\", matchLang)\n\tb.writeSlice(\"matchScript\", matchScript)\n}\n\nfunc (b *builder) writeRegionInclusionData() {\n\tvar (\n\t\t// mm holds for each group the set of groups with a distance of 1.\n\t\tmm = make(map[int][]index)\n\n\t\t// containment holds for each group the transitive closure of\n\t\t// containment of other groups.\n\t\tcontainment = make(map[index][]index)\n\t)\n\tfor _, g := range b.supp.TerritoryContainment.Group {\n\t\t// Skip UN and EURO zone as they are flattening the containment\n\t\t// relationship.\n\t\tif g.Type == \"EZ\" || g.Type == \"UN\" {\n\t\t\tcontinue\n\t\t}\n\t\tgroup := b.region.index(g.Type)\n\t\tgroupIdx := b.groups[group]\n\t\tfor _, mem := range strings.Split(g.Contains, \" \") {\n\t\t\tr := b.region.index(mem)\n\t\t\tmm[r] = append(mm[r], groupIdx)\n\t\t\tif g, ok := b.groups[r]; ok {\n\t\t\t\tmm[group] = append(mm[group], g)\n\t\t\t\tcontainment[groupIdx] = append(containment[groupIdx], g)\n\t\t\t}\n\t\t}\n\t}\n\n\tregionContainment := make([]uint32, len(b.groups))\n\tfor _, g := range b.groups {\n\t\tl := containment[g]\n\n\t\t// Compute the transitive closure of containment.\n\t\tfor i := 0; i < len(l); i++ {\n\t\t\tl = append(l, containment[l[i]]...)\n\t\t}\n\n\t\t// Compute the bitmask.\n\t\tregionContainment[g] = 1 << g\n\t\tfor _, v := range l {\n\t\t\tregionContainment[g] |= 1 << v\n\t\t}\n\t\t// log.Printf(\"%d: %X\", g, regionContainment[g])\n\t}\n\tb.writeSlice(\"regionContainment\", regionContainment)\n\n\tregionInclusion := make([]uint8, len(b.region.s))\n\tbvs := make(map[uint32]index)\n\t// Make the first bitvector positions correspond with the groups.\n\tfor r, i := range b.groups {\n\t\tbv := uint32(1 << i)\n\t\tfor _, g := range mm[r] {\n\t\t\tbv |= 1 << g\n\t\t}\n\t\tbvs[bv] = i\n\t\tregionInclusion[r] = uint8(bvs[bv])\n\t}\n\tfor r := 1; r < len(b.region.s); r++ {\n\t\tif _, ok := b.groups[r]; !ok {\n\t\t\tbv := uint32(0)\n\t\t\tfor _, g := range mm[r] {\n\t\t\t\tbv |= 1 << g\n\t\t\t}\n\t\t\tif bv == 0 {\n\t\t\t\t// Pick the world for unspecified regions.\n\t\t\t\tbv = 1 << b.groups[b.region.index(\"001\")]\n\t\t\t}\n\t\t\tif _, ok := bvs[bv]; !ok {\n\t\t\t\tbvs[bv] = index(len(bvs))\n\t\t\t}\n\t\t\tregionInclusion[r] = uint8(bvs[bv])\n\t\t}\n\t}\n\tb.writeSlice(\"regionInclusion\", regionInclusion)\n\tregionInclusionBits := make([]uint32, len(bvs))\n\tfor k, v := range bvs {\n\t\tregionInclusionBits[v] = uint32(k)\n\t}\n\t// Add bit vectors for increasingly large distances until a fixed point is reached.\n\tregionInclusionNext := []uint8{}\n\tfor i := 0; i < len(regionInclusionBits); i++ {\n\t\tbits := regionInclusionBits[i]\n\t\tnext := bits\n\t\tfor i := uint(0); i < uint(len(b.groups)); i++ {\n\t\t\tif bits&(1<<i) != 0 {\n\t\t\t\tnext |= regionInclusionBits[i]\n\t\t\t}\n\t\t}\n\t\tif _, ok := bvs[next]; !ok {\n\t\t\tbvs[next] = index(len(bvs))\n\t\t\tregionInclusionBits = append(regionInclusionBits, next)\n\t\t}\n\t\tregionInclusionNext = append(regionInclusionNext, uint8(bvs[next]))\n\t}\n\tb.writeSlice(\"regionInclusionBits\", regionInclusionBits)\n\tb.writeSlice(\"regionInclusionNext\", regionInclusionNext)\n}\n\ntype parentRel struct {\n\tlang       uint16\n\tscript     uint8\n\tmaxScript  uint8\n\ttoRegion   uint16\n\tfromRegion []uint16\n}\n\nfunc (b *builder) writeParents() {\n\tb.writeType(parentRel{})\n\n\tparents := []parentRel{}\n\n\t// Construct parent overrides.\n\tn := 0\n\tfor _, p := range b.data.Supplemental().ParentLocales.ParentLocale {\n\t\t// Skipping non-standard scripts to root is implemented using addTags.\n\t\tif p.Parent == \"root\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tsub := strings.Split(p.Parent, \"_\")\n\t\tparent := parentRel{lang: b.langIndex(sub[0])}\n\t\tif len(sub) == 2 {\n\t\t\t// TODO: check that all undefined scripts are indeed Latn in these\n\t\t\t// cases.\n\t\t\tparent.maxScript = uint8(b.script.index(\"Latn\"))\n\t\t\tparent.toRegion = uint16(b.region.index(sub[1]))\n\t\t} else {\n\t\t\tparent.script = uint8(b.script.index(sub[1]))\n\t\t\tparent.maxScript = parent.script\n\t\t\tparent.toRegion = uint16(b.region.index(sub[2]))\n\t\t}\n\t\tfor _, c := range strings.Split(p.Locales, \" \") {\n\t\t\tregion := b.region.index(c[strings.LastIndex(c, \"_\")+1:])\n\t\t\tparent.fromRegion = append(parent.fromRegion, uint16(region))\n\t\t}\n\t\tparents = append(parents, parent)\n\t\tn += len(parent.fromRegion)\n\t}\n\tb.writeSliceAddSize(\"parents\", n*2, parents)\n}\n\nfunc main() {\n\tgen.Init()\n\n\tgen.Repackage(\"gen_common.go\", \"common.go\", \"language\")\n\n\tw := gen.NewCodeWriter()\n\tdefer w.WriteGoFile(\"tables.go\", \"language\")\n\n\tfmt.Fprintln(w, `import \"golang.org/x/text/internal/tag\"`)\n\n\tb := newBuilder(w)\n\tgen.WriteCLDRVersion(w)\n\n\tb.parseIndices()\n\tb.writeType(fromTo{})\n\tb.writeLanguage()\n\tb.writeScript()\n\tb.writeRegion()\n\tb.writeVariant()\n\t// TODO: b.writeLocale()\n\tb.computeRegionGroups()\n\tb.writeLikelyData()\n\tb.writeMatchData()\n\tb.writeRegionInclusionData()\n\tb.writeParents()\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/match.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport \"errors\"\n\n// Matcher is the interface that wraps the Match method.\n//\n// Match returns the best match for any of the given tags, along with\n// a unique index associated with the returned tag and a confidence\n// score.\ntype Matcher interface {\n\tMatch(t ...Tag) (tag Tag, index int, c Confidence)\n}\n\n// Comprehends reports the confidence score for a speaker of a given language\n// to being able to comprehend the written form of an alternative language.\nfunc Comprehends(speaker, alternative Tag) Confidence {\n\t_, _, c := NewMatcher([]Tag{alternative}).Match(speaker)\n\treturn c\n}\n\n// NewMatcher returns a Matcher that matches an ordered list of preferred tags\n// against a list of supported tags based on written intelligibility, closeness\n// of dialect, equivalence of subtags and various other rules. It is initialized\n// with the list of supported tags. The first element is used as the default\n// value in case no match is found.\n//\n// Its Match method matches the first of the given Tags to reach a certain\n// confidence threshold. The tags passed to Match should therefore be specified\n// in order of preference. Extensions are ignored for matching.\n//\n// The index returned by the Match method corresponds to the index of the\n// matched tag in t, but is augmented with the Unicode extension ('u')of the\n// corresponding preferred tag. This allows user locale options to be passed\n// transparently.\nfunc NewMatcher(t []Tag) Matcher {\n\treturn newMatcher(t)\n}\n\nfunc (m *matcher) Match(want ...Tag) (t Tag, index int, c Confidence) {\n\tmatch, w, c := m.getBest(want...)\n\tif match == nil {\n\t\tt = m.default_.tag\n\t} else {\n\t\tt, index = match.tag, match.index\n\t}\n\t// Copy options from the user-provided tag into the result tag. This is hard\n\t// to do after the fact, so we do it here.\n\t// TODO: consider also adding in variants that are compatible with the\n\t// matched language.\n\t// TODO: Add back region if it is non-ambiguous? Or create another tag to\n\t// preserve the region?\n\tif u, ok := w.Extension('u'); ok {\n\t\tt, _ = Raw.Compose(t, u)\n\t}\n\treturn t, index, c\n}\n\ntype scriptRegionFlags uint8\n\nconst (\n\tisList = 1 << iota\n\tscriptInFrom\n\tregionInFrom\n)\n\nfunc (t *Tag) setUndefinedLang(id langID) {\n\tif t.lang == 0 {\n\t\tt.lang = id\n\t}\n}\n\nfunc (t *Tag) setUndefinedScript(id scriptID) {\n\tif t.script == 0 {\n\t\tt.script = id\n\t}\n}\n\nfunc (t *Tag) setUndefinedRegion(id regionID) {\n\tif t.region == 0 || t.region.contains(id) {\n\t\tt.region = id\n\t}\n}\n\n// ErrMissingLikelyTagsData indicates no information was available\n// to compute likely values of missing tags.\nvar ErrMissingLikelyTagsData = errors.New(\"missing likely tags data\")\n\n// addLikelySubtags sets subtags to their most likely value, given the locale.\n// In most cases this means setting fields for unknown values, but in some\n// cases it may alter a value.  It returns a ErrMissingLikelyTagsData error\n// if the given locale cannot be expanded.\nfunc (t Tag) addLikelySubtags() (Tag, error) {\n\tid, err := addTags(t)\n\tif err != nil {\n\t\treturn t, err\n\t} else if id.equalTags(t) {\n\t\treturn t, nil\n\t}\n\tid.remakeString()\n\treturn id, nil\n}\n\n// specializeRegion attempts to specialize a group region.\nfunc specializeRegion(t *Tag) bool {\n\tif i := regionInclusion[t.region]; i < nRegionGroups {\n\t\tx := likelyRegionGroup[i]\n\t\tif langID(x.lang) == t.lang && scriptID(x.script) == t.script {\n\t\t\tt.region = regionID(x.region)\n\t\t}\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc addTags(t Tag) (Tag, error) {\n\t// We leave private use identifiers alone.\n\tif t.private() {\n\t\treturn t, nil\n\t}\n\tif t.script != 0 && t.region != 0 {\n\t\tif t.lang != 0 {\n\t\t\t// already fully specified\n\t\t\tspecializeRegion(&t)\n\t\t\treturn t, nil\n\t\t}\n\t\t// Search matches for und-script-region. Note that for these cases\n\t\t// region will never be a group so there is no need to check for this.\n\t\tlist := likelyRegion[t.region : t.region+1]\n\t\tif x := list[0]; x.flags&isList != 0 {\n\t\t\tlist = likelyRegionList[x.lang : x.lang+uint16(x.script)]\n\t\t}\n\t\tfor _, x := range list {\n\t\t\t// Deviating from the spec. See match_test.go for details.\n\t\t\tif scriptID(x.script) == t.script {\n\t\t\t\tt.setUndefinedLang(langID(x.lang))\n\t\t\t\treturn t, nil\n\t\t\t}\n\t\t}\n\t}\n\tif t.lang != 0 {\n\t\t// Search matches for lang-script and lang-region, where lang != und.\n\t\tif t.lang < langNoIndexOffset {\n\t\t\tx := likelyLang[t.lang]\n\t\t\tif x.flags&isList != 0 {\n\t\t\t\tlist := likelyLangList[x.region : x.region+uint16(x.script)]\n\t\t\t\tif t.script != 0 {\n\t\t\t\t\tfor _, x := range list {\n\t\t\t\t\t\tif scriptID(x.script) == t.script && x.flags&scriptInFrom != 0 {\n\t\t\t\t\t\t\tt.setUndefinedRegion(regionID(x.region))\n\t\t\t\t\t\t\treturn t, nil\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if t.region != 0 {\n\t\t\t\t\tcount := 0\n\t\t\t\t\tgoodScript := true\n\t\t\t\t\ttt := t\n\t\t\t\t\tfor _, x := range list {\n\t\t\t\t\t\t// We visit all entries for which the script was not\n\t\t\t\t\t\t// defined, including the ones where the region was not\n\t\t\t\t\t\t// defined. This allows for proper disambiguation within\n\t\t\t\t\t\t// regions.\n\t\t\t\t\t\tif x.flags&scriptInFrom == 0 && t.region.contains(regionID(x.region)) {\n\t\t\t\t\t\t\ttt.region = regionID(x.region)\n\t\t\t\t\t\t\ttt.setUndefinedScript(scriptID(x.script))\n\t\t\t\t\t\t\tgoodScript = goodScript && tt.script == scriptID(x.script)\n\t\t\t\t\t\t\tcount++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif count == 1 {\n\t\t\t\t\t\treturn tt, nil\n\t\t\t\t\t}\n\t\t\t\t\t// Even if we fail to find a unique Region, we might have\n\t\t\t\t\t// an unambiguous script.\n\t\t\t\t\tif goodScript {\n\t\t\t\t\t\tt.script = tt.script\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Search matches for und-script.\n\t\tif t.script != 0 {\n\t\t\tx := likelyScript[t.script]\n\t\t\tif x.region != 0 {\n\t\t\t\tt.setUndefinedRegion(regionID(x.region))\n\t\t\t\tt.setUndefinedLang(langID(x.lang))\n\t\t\t\treturn t, nil\n\t\t\t}\n\t\t}\n\t\t// Search matches for und-region. If und-script-region exists, it would\n\t\t// have been found earlier.\n\t\tif t.region != 0 {\n\t\t\tif i := regionInclusion[t.region]; i < nRegionGroups {\n\t\t\t\tx := likelyRegionGroup[i]\n\t\t\t\tif x.region != 0 {\n\t\t\t\t\tt.setUndefinedLang(langID(x.lang))\n\t\t\t\t\tt.setUndefinedScript(scriptID(x.script))\n\t\t\t\t\tt.region = regionID(x.region)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tx := likelyRegion[t.region]\n\t\t\t\tif x.flags&isList != 0 {\n\t\t\t\t\tx = likelyRegionList[x.lang]\n\t\t\t\t}\n\t\t\t\tif x.script != 0 && x.flags != scriptInFrom {\n\t\t\t\t\tt.setUndefinedLang(langID(x.lang))\n\t\t\t\t\tt.setUndefinedScript(scriptID(x.script))\n\t\t\t\t\treturn t, nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Search matches for lang.\n\tif t.lang < langNoIndexOffset {\n\t\tx := likelyLang[t.lang]\n\t\tif x.flags&isList != 0 {\n\t\t\tx = likelyLangList[x.region]\n\t\t}\n\t\tif x.region != 0 {\n\t\t\tt.setUndefinedScript(scriptID(x.script))\n\t\t\tt.setUndefinedRegion(regionID(x.region))\n\t\t}\n\t\tspecializeRegion(&t)\n\t\tif t.lang == 0 {\n\t\t\tt.lang = _en // default language\n\t\t}\n\t\treturn t, nil\n\t}\n\treturn t, ErrMissingLikelyTagsData\n}\n\nfunc (t *Tag) setTagsFrom(id Tag) {\n\tt.lang = id.lang\n\tt.script = id.script\n\tt.region = id.region\n}\n\n// minimize removes the region or script subtags from t such that\n// t.addLikelySubtags() == t.minimize().addLikelySubtags().\nfunc (t Tag) minimize() (Tag, error) {\n\tt, err := minimizeTags(t)\n\tif err != nil {\n\t\treturn t, err\n\t}\n\tt.remakeString()\n\treturn t, nil\n}\n\n// minimizeTags mimics the behavior of the ICU 51 C implementation.\nfunc minimizeTags(t Tag) (Tag, error) {\n\tif t.equalTags(und) {\n\t\treturn t, nil\n\t}\n\tmax, err := addTags(t)\n\tif err != nil {\n\t\treturn t, err\n\t}\n\tfor _, id := range [...]Tag{\n\t\t{lang: t.lang},\n\t\t{lang: t.lang, region: t.region},\n\t\t{lang: t.lang, script: t.script},\n\t} {\n\t\tif x, err := addTags(id); err == nil && max.equalTags(x) {\n\t\t\tt.setTagsFrom(id)\n\t\t\tbreak\n\t\t}\n\t}\n\treturn t, nil\n}\n\n// Tag Matching\n// CLDR defines an algorithm for finding the best match between two sets of language\n// tags. The basic algorithm defines how to score a possible match and then find\n// the match with the best score\n// (see http://www.unicode.org/reports/tr35/#LanguageMatching).\n// Using scoring has several disadvantages. The scoring obfuscates the importance of\n// the various factors considered, making the algorithm harder to understand. Using\n// scoring also requires the full score to be computed for each pair of tags.\n//\n// We will use a different algorithm which aims to have the following properties:\n// - clarity on the precedence of the various selection factors, and\n// - improved performance by allowing early termination of a comparison.\n//\n// Matching algorithm (overview)\n// Input:\n//   - supported: a set of supported tags\n//   - default:   the default tag to return in case there is no match\n//   - desired:   list of desired tags, ordered by preference, starting with\n//                the most-preferred.\n//\n// Algorithm:\n//   1) Set the best match to the lowest confidence level\n//   2) For each tag in \"desired\":\n//     a) For each tag in \"supported\":\n//        1) compute the match between the two tags.\n//        2) if the match is better than the previous best match, replace it\n//           with the new match. (see next section)\n//     b) if the current best match is above a certain threshold, return this\n//        match without proceeding to the next tag in \"desired\". [See Note 1]\n//   3) If the best match so far is below a certain threshold, return \"default\".\n//\n// Ranking:\n// We use two phases to determine whether one pair of tags are a better match\n// than another pair of tags. First, we determine a rough confidence level. If the\n// levels are different, the one with the highest confidence wins.\n// Second, if the rough confidence levels are identical, we use a set of tie-breaker\n// rules.\n//\n// The confidence level of matching a pair of tags is determined by finding the\n// lowest confidence level of any matches of the corresponding subtags (the\n// result is deemed as good as its weakest link).\n// We define the following levels:\n//   Exact    - An exact match of a subtag, before adding likely subtags.\n//   MaxExact - An exact match of a subtag, after adding likely subtags.\n//              [See Note 2].\n//   High     - High level of mutual intelligibility between different subtag\n//              variants.\n//   Low      - Low level of mutual intelligibility between different subtag\n//              variants.\n//   No       - No mutual intelligibility.\n//\n// The following levels can occur for each type of subtag:\n//   Base:    Exact, MaxExact, High, Low, No\n//   Script:  Exact, MaxExact [see Note 3], Low, No\n//   Region:  Exact, MaxExact, High\n//   Variant: Exact, High\n//   Private: Exact, No\n//\n// Any result with a confidence level of Low or higher is deemed a possible match.\n// Once a desired tag matches any of the supported tags with a level of MaxExact\n// or higher, the next desired tag is not considered (see Step 2.b).\n// Note that CLDR provides languageMatching data that defines close equivalence\n// classes for base languages, scripts and regions.\n//\n// Tie-breaking\n// If we get the same confidence level for two matches, we apply a sequence of\n// tie-breaking rules. The first that succeeds defines the result. The rules are\n// applied in the following order.\n//   1) Original language was defined and was identical.\n//   2) Original region was defined and was identical.\n//   3) Distance between two maximized regions was the smallest.\n//   4) Original script was defined and was identical.\n//   5) Distance from want tag to have tag using the parent relation [see Note 5.]\n// If there is still no winner after these rules are applied, the first match\n// found wins.\n//\n// Notes:\n// [1] Note that even if we may not have a perfect match, if a match is above a\n//     certain threshold, it is considered a better match than any other match\n//     to a tag later in the list of preferred language tags.\n// [2] In practice, as matching of Exact is done in a separate phase from\n//     matching the other levels, we reuse the Exact level to mean MaxExact in\n//     the second phase. As a consequence, we only need the levels defined by\n//     the Confidence type. The MaxExact confidence level is mapped to High in\n//     the public API.\n// [3] We do not differentiate between maximized script values that were derived\n//     from suppressScript versus most likely tag data. We determined that in\n//     ranking the two, one ranks just after the other. Moreover, the two cannot\n//     occur concurrently. As a consequence, they are identical for practical\n//     purposes.\n// [4] In case of deprecated, macro-equivalents and legacy mappings, we assign\n//     the MaxExact level to allow iw vs he to still be a closer match than\n//     en-AU vs en-US, for example.\n// [5] In CLDR a locale inherits fields that are unspecified for this locale\n//     from its parent. Therefore, if a locale is a parent of another locale,\n//     it is a strong measure for closeness, especially when no other tie\n//     breaker rule applies. One could also argue it is inconsistent, for\n//     example, when pt-AO matches pt (which CLDR equates with pt-BR), even\n//     though its parent is pt-PT according to the inheritance rules.\n//\n// Implementation Details:\n// There are several performance considerations worth pointing out. Most notably,\n// we preprocess as much as possible (within reason) at the time of creation of a\n// matcher. This includes:\n//   - creating a per-language map, which includes data for the raw base language\n//     and its canonicalized variant (if applicable),\n//   - expanding entries for the equivalence classes defined in CLDR's\n//     languageMatch data.\n// The per-language map ensures that typically only a very small number of tags\n// need to be considered. The pre-expansion of canonicalized subtags and\n// equivalence classes reduces the amount of map lookups that need to be done at\n// runtime.\n\n// matcher keeps a set of supported language tags, indexed by language.\ntype matcher struct {\n\tdefault_     *haveTag\n\tindex        map[langID]*matchHeader\n\tpassSettings bool\n}\n\n// matchHeader has the lists of tags for exact matches and matches based on\n// maximized and canonicalized tags for a given language.\ntype matchHeader struct {\n\texact []*haveTag\n\tmax   []*haveTag\n}\n\n// haveTag holds a supported Tag and its maximized script and region. The maximized\n// or canonicalized language is not stored as it is not needed during matching.\ntype haveTag struct {\n\ttag Tag\n\n\t// index of this tag in the original list of supported tags.\n\tindex int\n\n\t// conf is the maximum confidence that can result from matching this haveTag.\n\t// When conf < Exact this means it was inserted after applying a CLDR equivalence rule.\n\tconf Confidence\n\n\t// Maximized region and script.\n\tmaxRegion regionID\n\tmaxScript scriptID\n\n\t// altScript may be checked as an alternative match to maxScript. If altScript\n\t// matches, the confidence level for this match is Low. Theoretically there\n\t// could be multiple alternative scripts. This does not occur in practice.\n\taltScript scriptID\n\n\t// nextMax is the index of the next haveTag with the same maximized tags.\n\tnextMax uint16\n}\n\nfunc makeHaveTag(tag Tag, index int) (haveTag, langID) {\n\tmax := tag\n\tif tag.lang != 0 {\n\t\tmax, _ = max.canonicalize(All)\n\t\tmax, _ = addTags(max)\n\t\tmax.remakeString()\n\t}\n\treturn haveTag{tag, index, Exact, max.region, max.script, altScript(max.lang, max.script), 0}, max.lang\n}\n\n// altScript returns an alternative script that may match the given script with\n// a low confidence.  At the moment, the langMatch data allows for at most one\n// script to map to another and we rely on this to keep the code simple.\nfunc altScript(l langID, s scriptID) scriptID {\n\tfor _, alt := range matchScript {\n\t\tif (alt.lang == 0 || langID(alt.lang) == l) && scriptID(alt.have) == s {\n\t\t\treturn scriptID(alt.want)\n\t\t}\n\t}\n\treturn 0\n}\n\n// addIfNew adds a haveTag to the list of tags only if it is a unique tag.\n// Tags that have the same maximized values are linked by index.\nfunc (h *matchHeader) addIfNew(n haveTag, exact bool) {\n\t// Don't add new exact matches.\n\tfor _, v := range h.exact {\n\t\tif v.tag.equalsRest(n.tag) {\n\t\t\treturn\n\t\t}\n\t}\n\tif exact {\n\t\th.exact = append(h.exact, &n)\n\t}\n\t// Allow duplicate maximized tags, but create a linked list to allow quickly\n\t// comparing the equivalents and bail out.\n\tfor i, v := range h.max {\n\t\tif v.maxScript == n.maxScript &&\n\t\t\tv.maxRegion == n.maxRegion &&\n\t\t\tv.tag.variantOrPrivateTagStr() == n.tag.variantOrPrivateTagStr() {\n\t\t\tfor h.max[i].nextMax != 0 {\n\t\t\t\ti = int(h.max[i].nextMax)\n\t\t\t}\n\t\t\th.max[i].nextMax = uint16(len(h.max))\n\t\t\tbreak\n\t\t}\n\t}\n\th.max = append(h.max, &n)\n}\n\n// header returns the matchHeader for the given language. It creates one if\n// it doesn't already exist.\nfunc (m *matcher) header(l langID) *matchHeader {\n\tif h := m.index[l]; h != nil {\n\t\treturn h\n\t}\n\th := &matchHeader{}\n\tm.index[l] = h\n\treturn h\n}\n\n// newMatcher builds an index for the given supported tags and returns it as\n// a matcher. It also expands the index by considering various equivalence classes\n// for a given tag.\nfunc newMatcher(supported []Tag) *matcher {\n\tm := &matcher{\n\t\tindex: make(map[langID]*matchHeader),\n\t}\n\tif len(supported) == 0 {\n\t\tm.default_ = &haveTag{}\n\t\treturn m\n\t}\n\t// Add supported languages to the index. Add exact matches first to give\n\t// them precedence.\n\tfor i, tag := range supported {\n\t\tpair, _ := makeHaveTag(tag, i)\n\t\tm.header(tag.lang).addIfNew(pair, true)\n\t}\n\tm.default_ = m.header(supported[0].lang).exact[0]\n\tfor i, tag := range supported {\n\t\tpair, max := makeHaveTag(tag, i)\n\t\tif max != tag.lang {\n\t\t\tm.header(max).addIfNew(pair, false)\n\t\t}\n\t}\n\n\t// update is used to add indexes in the map for equivalent languages.\n\t// If force is true, the update will also apply to derived entries. To\n\t// avoid applying a \"transitive closure\", use false.\n\tupdate := func(want, have uint16, conf Confidence, force bool) {\n\t\tif hh := m.index[langID(have)]; hh != nil {\n\t\t\tif !force && len(hh.exact) == 0 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\thw := m.header(langID(want))\n\t\t\tfor _, ht := range hh.max {\n\t\t\t\tv := *ht\n\t\t\t\tif conf < v.conf {\n\t\t\t\t\tv.conf = conf\n\t\t\t\t}\n\t\t\t\tv.nextMax = 0 // this value needs to be recomputed\n\t\t\t\tif v.altScript != 0 {\n\t\t\t\t\tv.altScript = altScript(langID(want), v.maxScript)\n\t\t\t\t}\n\t\t\t\thw.addIfNew(v, conf == Exact && len(hh.exact) > 0)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Add entries for languages with mutual intelligibility as defined by CLDR's\n\t// languageMatch data.\n\tfor _, ml := range matchLang {\n\t\tupdate(ml.want, ml.have, Confidence(ml.conf), false)\n\t\tif !ml.oneway {\n\t\t\tupdate(ml.have, ml.want, Confidence(ml.conf), false)\n\t\t}\n\t}\n\n\t// Add entries for possible canonicalizations. This is an optimization to\n\t// ensure that only one map lookup needs to be done at runtime per desired tag.\n\t// First we match deprecated equivalents. If they are perfect equivalents\n\t// (their canonicalization simply substitutes a different language code, but\n\t// nothing else), the match confidence is Exact, otherwise it is High.\n\tfor i, lm := range langAliasMap {\n\t\tif lm.from == _sh {\n\t\t\tcontinue\n\t\t}\n\n\t\t// If deprecated codes match and there is no fiddling with the script or\n\t\t// or region, we consider it an exact match.\n\t\tconf := Exact\n\t\tif langAliasTypes[i] != langMacro {\n\t\t\tif !isExactEquivalent(langID(lm.from)) {\n\t\t\t\tconf = High\n\t\t\t}\n\t\t\tupdate(lm.to, lm.from, conf, true)\n\t\t}\n\t\tupdate(lm.from, lm.to, conf, true)\n\t}\n\treturn m\n}\n\n// getBest gets the best matching tag in m for any of the given tags, taking into\n// account the order of preference of the given tags.\nfunc (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) {\n\tbest := bestMatch{}\n\tfor _, w := range want {\n\t\tvar max Tag\n\t\t// Check for exact match first.\n\t\th := m.index[w.lang]\n\t\tif w.lang != 0 {\n\t\t\t// Base language is defined.\n\t\t\tif h == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tfor i := range h.exact {\n\t\t\t\thave := h.exact[i]\n\t\t\t\tif have.tag.equalsRest(w) {\n\t\t\t\t\treturn have, w, Exact\n\t\t\t\t}\n\t\t\t}\n\t\t\tmax, _ = w.canonicalize(Legacy | Deprecated)\n\t\t\tmax, _ = addTags(max)\n\t\t} else {\n\t\t\t// Base language is not defined.\n\t\t\tif h != nil {\n\t\t\t\tfor i := range h.exact {\n\t\t\t\t\thave := h.exact[i]\n\t\t\t\t\tif have.tag.equalsRest(w) {\n\t\t\t\t\t\treturn have, w, Exact\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif w.script == 0 && w.region == 0 {\n\t\t\t\t// We skip all tags matching und for approximate matching, including\n\t\t\t\t// private tags.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmax, _ = addTags(w)\n\t\t\tif h = m.index[max.lang]; h == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\t// Check for match based on maximized tag.\n\t\tfor i := range h.max {\n\t\t\thave := h.max[i]\n\t\t\tbest.update(have, w, max.script, max.region)\n\t\t\tif best.conf == Exact {\n\t\t\t\tfor have.nextMax != 0 {\n\t\t\t\t\thave = h.max[have.nextMax]\n\t\t\t\t\tbest.update(have, w, max.script, max.region)\n\t\t\t\t}\n\t\t\t\treturn best.have, best.want, High\n\t\t\t}\n\t\t}\n\t}\n\tif best.conf <= No {\n\t\tif len(want) != 0 {\n\t\t\treturn nil, want[0], No\n\t\t}\n\t\treturn nil, Tag{}, No\n\t}\n\treturn best.have, best.want, best.conf\n}\n\n// bestMatch accumulates the best match so far.\ntype bestMatch struct {\n\thave *haveTag\n\twant Tag\n\tconf Confidence\n\t// Cached results from applying tie-breaking rules.\n\torigLang   bool\n\torigReg    bool\n\tregDist    uint8\n\torigScript bool\n\tparentDist uint8 // 255 if have is not an ancestor of want tag.\n}\n\n// update updates the existing best match if the new pair is considered to be a\n// better match.\n// To determine if the given pair is a better match, it first computes the rough\n// confidence level. If this surpasses the current match, it will replace it and\n// update the tie-breaker rule cache. If there is a tie, it proceeds with applying\n// a series of tie-breaker rules. If there is no conclusive winner after applying\n// the tie-breaker rules, it leaves the current match as the preferred match.\nfunc (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion regionID) {\n\t// Bail if the maximum attainable confidence is below that of the current best match.\n\tc := have.conf\n\tif c < m.conf {\n\t\treturn\n\t}\n\tif have.maxScript != maxScript {\n\t\t// There is usually very little comprehension between different scripts.\n\t\t// In a few cases there may still be Low comprehension. This possibility is\n\t\t// pre-computed and stored in have.altScript.\n\t\tif Low < m.conf || have.altScript != maxScript {\n\t\t\treturn\n\t\t}\n\t\tc = Low\n\t} else if have.maxRegion != maxRegion {\n\t\t// There is usually a small difference between languages across regions.\n\t\t// We use the region distance (below) to disambiguate between equal matches.\n\t\tif High < c {\n\t\t\tc = High\n\t\t}\n\t}\n\n\t// We store the results of the computations of the tie-breaker rules along\n\t// with the best match. There is no need to do the checks once we determine\n\t// we have a winner, but we do still need to do the tie-breaker computations.\n\t// We use \"beaten\" to keep track if we still need to do the checks.\n\tbeaten := false // true if the new pair defeats the current one.\n\tif c != m.conf {\n\t\tif c < m.conf {\n\t\t\treturn\n\t\t}\n\t\tbeaten = true\n\t}\n\n\t// Tie-breaker rules:\n\t// We prefer if the pre-maximized language was specified and identical.\n\torigLang := have.tag.lang == tag.lang && tag.lang != 0\n\tif !beaten && m.origLang != origLang {\n\t\tif m.origLang {\n\t\t\treturn\n\t\t}\n\t\tbeaten = true\n\t}\n\n\t// We prefer if the pre-maximized region was specified and identical.\n\torigReg := have.tag.region == tag.region && tag.region != 0\n\tif !beaten && m.origReg != origReg {\n\t\tif m.origReg {\n\t\t\treturn\n\t\t}\n\t\tbeaten = true\n\t}\n\n\t// Next we prefer smaller distances between regions, as defined by regionDist.\n\tregDist := regionDist(have.maxRegion, maxRegion, tag.lang)\n\tif !beaten && m.regDist != regDist {\n\t\tif regDist > m.regDist {\n\t\t\treturn\n\t\t}\n\t\tbeaten = true\n\t}\n\n\t// Next we prefer if the pre-maximized script was specified and identical.\n\torigScript := have.tag.script == tag.script && tag.script != 0\n\tif !beaten && m.origScript != origScript {\n\t\tif m.origScript {\n\t\t\treturn\n\t\t}\n\t\tbeaten = true\n\t}\n\n\t// Finally we prefer tags which have a closer parent relationship.\n\tparentDist := parentDistance(have.tag.region, tag)\n\tif !beaten && m.parentDist != parentDist {\n\t\tif parentDist > m.parentDist {\n\t\t\treturn\n\t\t}\n\t\tbeaten = true\n\t}\n\n\t// Update m to the newly found best match.\n\tif beaten {\n\t\tm.have = have\n\t\tm.want = tag\n\t\tm.conf = c\n\t\tm.origLang = origLang\n\t\tm.origReg = origReg\n\t\tm.origScript = origScript\n\t\tm.regDist = regDist\n\t\tm.parentDist = parentDist\n\t}\n}\n\n// parentDistance returns the number of times Parent must be called before the\n// regions match. It is assumed that it has already been checked that lang and\n// script are identical. If haveRegion does not occur in the ancestor chain of\n// tag, it returns 255.\nfunc parentDistance(haveRegion regionID, tag Tag) uint8 {\n\tp := tag.Parent()\n\td := uint8(1)\n\tfor haveRegion != p.region {\n\t\tif p.region == 0 {\n\t\t\treturn 255\n\t\t}\n\t\tp = p.Parent()\n\t\td++\n\t}\n\treturn d\n}\n\n// regionDist wraps regionDistance with some exceptions to the algorithmic distance.\nfunc regionDist(a, b regionID, lang langID) uint8 {\n\tif lang == _en {\n\t\t// Two variants of non-US English are close to each other, regardless of distance.\n\t\tif a != _US && b != _US {\n\t\t\treturn 2\n\t\t}\n\t}\n\treturn uint8(regionDistance(a, b))\n}\n\n// regionDistance computes the distance between two regions based on the\n// distance in the graph of region containments as defined in CLDR. It iterates\n// over increasingly inclusive sets of groups, represented as bit vectors, until\n// the source bit vector has bits in common with the destination vector.\nfunc regionDistance(a, b regionID) int {\n\tif a == b {\n\t\treturn 0\n\t}\n\tp, q := regionInclusion[a], regionInclusion[b]\n\tif p < nRegionGroups {\n\t\tp, q = q, p\n\t}\n\tset := regionInclusionBits\n\tif q < nRegionGroups && set[p]&(1<<q) != 0 {\n\t\treturn 1\n\t}\n\td := 2\n\tfor goal := set[q]; set[p]&goal == 0; p = regionInclusionNext[p] {\n\t\td++\n\t}\n\treturn d\n}\n\nfunc (t Tag) variants() string {\n\tif t.pVariant == 0 {\n\t\treturn \"\"\n\t}\n\treturn t.str[t.pVariant:t.pExt]\n}\n\n// variantOrPrivateTagStr returns variants or private use tags.\nfunc (t Tag) variantOrPrivateTagStr() string {\n\tif t.pExt > 0 {\n\t\treturn t.str[t.pVariant:t.pExt]\n\t}\n\treturn t.str[t.pVariant:]\n}\n\n// equalsRest compares everything except the language.\nfunc (a Tag) equalsRest(b Tag) bool {\n\t// TODO: don't include extensions in this comparison. To do this efficiently,\n\t// though, we should handle private tags separately.\n\treturn a.script == b.script && a.region == b.region && a.variantOrPrivateTagStr() == b.variantOrPrivateTagStr()\n}\n\n// isExactEquivalent returns true if canonicalizing the language will not alter\n// the script or region of a tag.\nfunc isExactEquivalent(l langID) bool {\n\tfor _, o := range notEquivalent {\n\t\tif o == l {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nvar notEquivalent []langID\n\nfunc init() {\n\t// Create a list of all languages for which canonicalization may alter the\n\t// script or region.\n\tfor _, lm := range langAliasMap {\n\t\ttag := Tag{lang: langID(lm.from)}\n\t\tif tag, _ = tag.canonicalize(All); tag.script != 0 || tag.region != 0 {\n\t\t\tnotEquivalent = append(notEquivalent, langID(lm.from))\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/parse.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage language\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"golang.org/x/text/internal/tag\"\n)\n\n// isAlpha returns true if the byte is not a digit.\n// b must be an ASCII letter or digit.\nfunc isAlpha(b byte) bool {\n\treturn b > '9'\n}\n\n// isAlphaNum returns true if the string contains only ASCII letters or digits.\nfunc isAlphaNum(s []byte) bool {\n\tfor _, c := range s {\n\t\tif !('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9') {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\n// errSyntax is returned by any of the parsing functions when the\n// input is not well-formed, according to BCP 47.\n// TODO: return the position at which the syntax error occurred?\nvar errSyntax = errors.New(\"language: tag is not well-formed\")\n\n// ValueError is returned by any of the parsing functions when the\n// input is well-formed but the respective subtag is not recognized\n// as a valid value.\ntype ValueError struct {\n\tv [8]byte\n}\n\nfunc mkErrInvalid(s []byte) error {\n\tvar e ValueError\n\tcopy(e.v[:], s)\n\treturn e\n}\n\nfunc (e ValueError) tag() []byte {\n\tn := bytes.IndexByte(e.v[:], 0)\n\tif n == -1 {\n\t\tn = 8\n\t}\n\treturn e.v[:n]\n}\n\n// Error implements the error interface.\nfunc (e ValueError) Error() string {\n\treturn fmt.Sprintf(\"language: subtag %q is well-formed but unknown\", e.tag())\n}\n\n// Subtag returns the subtag for which the error occurred.\nfunc (e ValueError) Subtag() string {\n\treturn string(e.tag())\n}\n\n// scanner is used to scan BCP 47 tokens, which are separated by _ or -.\ntype scanner struct {\n\tb     []byte\n\tbytes [max99thPercentileSize]byte\n\ttoken []byte\n\tstart int // start position of the current token\n\tend   int // end position of the current token\n\tnext  int // next point for scan\n\terr   error\n\tdone  bool\n}\n\nfunc makeScannerString(s string) scanner {\n\tscan := scanner{}\n\tif len(s) <= len(scan.bytes) {\n\t\tscan.b = scan.bytes[:copy(scan.bytes[:], s)]\n\t} else {\n\t\tscan.b = []byte(s)\n\t}\n\tscan.init()\n\treturn scan\n}\n\n// makeScanner returns a scanner using b as the input buffer.\n// b is not copied and may be modified by the scanner routines.\nfunc makeScanner(b []byte) scanner {\n\tscan := scanner{b: b}\n\tscan.init()\n\treturn scan\n}\n\nfunc (s *scanner) init() {\n\tfor i, c := range s.b {\n\t\tif c == '_' {\n\t\t\ts.b[i] = '-'\n\t\t}\n\t}\n\ts.scan()\n}\n\n// restToLower converts the string between start and end to lower case.\nfunc (s *scanner) toLower(start, end int) {\n\tfor i := start; i < end; i++ {\n\t\tc := s.b[i]\n\t\tif 'A' <= c && c <= 'Z' {\n\t\t\ts.b[i] += 'a' - 'A'\n\t\t}\n\t}\n}\n\nfunc (s *scanner) setError(e error) {\n\tif s.err == nil || (e == errSyntax && s.err != errSyntax) {\n\t\ts.err = e\n\t}\n}\n\n// resizeRange shrinks or grows the array at position oldStart such that\n// a new string of size newSize can fit between oldStart and oldEnd.\n// Sets the scan point to after the resized range.\nfunc (s *scanner) resizeRange(oldStart, oldEnd, newSize int) {\n\ts.start = oldStart\n\tif end := oldStart + newSize; end != oldEnd {\n\t\tdiff := end - oldEnd\n\t\tif end < cap(s.b) {\n\t\t\tb := make([]byte, len(s.b)+diff)\n\t\t\tcopy(b, s.b[:oldStart])\n\t\t\tcopy(b[end:], s.b[oldEnd:])\n\t\t\ts.b = b\n\t\t} else {\n\t\t\ts.b = append(s.b[end:], s.b[oldEnd:]...)\n\t\t}\n\t\ts.next = end + (s.next - s.end)\n\t\ts.end = end\n\t}\n}\n\n// replace replaces the current token with repl.\nfunc (s *scanner) replace(repl string) {\n\ts.resizeRange(s.start, s.end, len(repl))\n\tcopy(s.b[s.start:], repl)\n}\n\n// gobble removes the current token from the input.\n// Caller must call scan after calling gobble.\nfunc (s *scanner) gobble(e error) {\n\ts.setError(e)\n\tif s.start == 0 {\n\t\ts.b = s.b[:+copy(s.b, s.b[s.next:])]\n\t\ts.end = 0\n\t} else {\n\t\ts.b = s.b[:s.start-1+copy(s.b[s.start-1:], s.b[s.end:])]\n\t\ts.end = s.start - 1\n\t}\n\ts.next = s.start\n}\n\n// deleteRange removes the given range from s.b before the current token.\nfunc (s *scanner) deleteRange(start, end int) {\n\ts.setError(errSyntax)\n\ts.b = s.b[:start+copy(s.b[start:], s.b[end:])]\n\tdiff := end - start\n\ts.next -= diff\n\ts.start -= diff\n\ts.end -= diff\n}\n\n// scan parses the next token of a BCP 47 string.  Tokens that are larger\n// than 8 characters or include non-alphanumeric characters result in an error\n// and are gobbled and removed from the output.\n// It returns the end position of the last token consumed.\nfunc (s *scanner) scan() (end int) {\n\tend = s.end\n\ts.token = nil\n\tfor s.start = s.next; s.next < len(s.b); {\n\t\ti := bytes.IndexByte(s.b[s.next:], '-')\n\t\tif i == -1 {\n\t\t\ts.end = len(s.b)\n\t\t\ts.next = len(s.b)\n\t\t\ti = s.end - s.start\n\t\t} else {\n\t\t\ts.end = s.next + i\n\t\t\ts.next = s.end + 1\n\t\t}\n\t\ttoken := s.b[s.start:s.end]\n\t\tif i < 1 || i > 8 || !isAlphaNum(token) {\n\t\t\ts.gobble(errSyntax)\n\t\t\tcontinue\n\t\t}\n\t\ts.token = token\n\t\treturn end\n\t}\n\tif n := len(s.b); n > 0 && s.b[n-1] == '-' {\n\t\ts.setError(errSyntax)\n\t\ts.b = s.b[:len(s.b)-1]\n\t}\n\ts.done = true\n\treturn end\n}\n\n// acceptMinSize parses multiple tokens of the given size or greater.\n// It returns the end position of the last token consumed.\nfunc (s *scanner) acceptMinSize(min int) (end int) {\n\tend = s.end\n\ts.scan()\n\tfor ; len(s.token) >= min; s.scan() {\n\t\tend = s.end\n\t}\n\treturn end\n}\n\n// Parse parses the given BCP 47 string and returns a valid Tag. If parsing\n// failed it returns an error and any part of the tag that could be parsed.\n// If parsing succeeded but an unknown value was found, it returns\n// ValueError. The Tag returned in this case is just stripped of the unknown\n// value. All other values are preserved. It accepts tags in the BCP 47 format\n// and extensions to this standard defined in\n// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.\n// The resulting tag is canonicalized using the default canonicalization type.\nfunc Parse(s string) (t Tag, err error) {\n\treturn Default.Parse(s)\n}\n\n// Parse parses the given BCP 47 string and returns a valid Tag. If parsing\n// failed it returns an error and any part of the tag that could be parsed.\n// If parsing succeeded but an unknown value was found, it returns\n// ValueError. The Tag returned in this case is just stripped of the unknown\n// value. All other values are preserved. It accepts tags in the BCP 47 format\n// and extensions to this standard defined in\n// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers.\n// The resulting tag is canonicalized using the the canonicalization type c.\nfunc (c CanonType) Parse(s string) (t Tag, err error) {\n\t// TODO: consider supporting old-style locale key-value pairs.\n\tif s == \"\" {\n\t\treturn und, errSyntax\n\t}\n\tif len(s) <= maxAltTaglen {\n\t\tb := [maxAltTaglen]byte{}\n\t\tfor i, c := range s {\n\t\t\t// Generating invalid UTF-8 is okay as it won't match.\n\t\t\tif 'A' <= c && c <= 'Z' {\n\t\t\t\tc += 'a' - 'A'\n\t\t\t} else if c == '_' {\n\t\t\t\tc = '-'\n\t\t\t}\n\t\t\tb[i] = byte(c)\n\t\t}\n\t\tif t, ok := grandfathered(b); ok {\n\t\t\treturn t, nil\n\t\t}\n\t}\n\tscan := makeScannerString(s)\n\tt, err = parse(&scan, s)\n\tt, changed := t.canonicalize(c)\n\tif changed {\n\t\tt.remakeString()\n\t}\n\treturn t, err\n}\n\nfunc parse(scan *scanner, s string) (t Tag, err error) {\n\tt = und\n\tvar end int\n\tif n := len(scan.token); n <= 1 {\n\t\tscan.toLower(0, len(scan.b))\n\t\tif n == 0 || scan.token[0] != 'x' {\n\t\t\treturn t, errSyntax\n\t\t}\n\t\tend = parseExtensions(scan)\n\t} else if n >= 4 {\n\t\treturn und, errSyntax\n\t} else { // the usual case\n\t\tt, end = parseTag(scan)\n\t\tif n := len(scan.token); n == 1 {\n\t\t\tt.pExt = uint16(end)\n\t\t\tend = parseExtensions(scan)\n\t\t} else if end < len(scan.b) {\n\t\t\tscan.setError(errSyntax)\n\t\t\tscan.b = scan.b[:end]\n\t\t}\n\t}\n\tif int(t.pVariant) < len(scan.b) {\n\t\tif end < len(s) {\n\t\t\ts = s[:end]\n\t\t}\n\t\tif len(s) > 0 && tag.Compare(s, scan.b) == 0 {\n\t\t\tt.str = s\n\t\t} else {\n\t\t\tt.str = string(scan.b)\n\t\t}\n\t} else {\n\t\tt.pVariant, t.pExt = 0, 0\n\t}\n\treturn t, scan.err\n}\n\n// parseTag parses language, script, region and variants.\n// It returns a Tag and the end position in the input that was parsed.\nfunc parseTag(scan *scanner) (t Tag, end int) {\n\tvar e error\n\t// TODO: set an error if an unknown lang, script or region is encountered.\n\tt.lang, e = getLangID(scan.token)\n\tscan.setError(e)\n\tscan.replace(t.lang.String())\n\tlangStart := scan.start\n\tend = scan.scan()\n\tfor len(scan.token) == 3 && isAlpha(scan.token[0]) {\n\t\t// From http://tools.ietf.org/html/bcp47, <lang>-<extlang> tags are equivalent\n\t\t// to a tag of the form <extlang>.\n\t\tlang, e := getLangID(scan.token)\n\t\tif lang != 0 {\n\t\t\tt.lang = lang\n\t\t\tcopy(scan.b[langStart:], lang.String())\n\t\t\tscan.b[langStart+3] = '-'\n\t\t\tscan.start = langStart + 4\n\t\t}\n\t\tscan.gobble(e)\n\t\tend = scan.scan()\n\t}\n\tif len(scan.token) == 4 && isAlpha(scan.token[0]) {\n\t\tt.script, e = getScriptID(script, scan.token)\n\t\tif t.script == 0 {\n\t\t\tscan.gobble(e)\n\t\t}\n\t\tend = scan.scan()\n\t}\n\tif n := len(scan.token); n >= 2 && n <= 3 {\n\t\tt.region, e = getRegionID(scan.token)\n\t\tif t.region == 0 {\n\t\t\tscan.gobble(e)\n\t\t} else {\n\t\t\tscan.replace(t.region.String())\n\t\t}\n\t\tend = scan.scan()\n\t}\n\tscan.toLower(scan.start, len(scan.b))\n\tt.pVariant = byte(end)\n\tend = parseVariants(scan, end, t)\n\tt.pExt = uint16(end)\n\treturn t, end\n}\n\nvar separator = []byte{'-'}\n\n// parseVariants scans tokens as long as each token is a valid variant string.\n// Duplicate variants are removed.\nfunc parseVariants(scan *scanner, end int, t Tag) int {\n\tstart := scan.start\n\tvarIDBuf := [4]uint8{}\n\tvariantBuf := [4][]byte{}\n\tvarID := varIDBuf[:0]\n\tvariant := variantBuf[:0]\n\tlast := -1\n\tneedSort := false\n\tfor ; len(scan.token) >= 4; scan.scan() {\n\t\t// TODO: measure the impact of needing this conversion and redesign\n\t\t// the data structure if there is an issue.\n\t\tv, ok := variantIndex[string(scan.token)]\n\t\tif !ok {\n\t\t\t// unknown variant\n\t\t\t// TODO: allow user-defined variants?\n\t\t\tscan.gobble(mkErrInvalid(scan.token))\n\t\t\tcontinue\n\t\t}\n\t\tvarID = append(varID, v)\n\t\tvariant = append(variant, scan.token)\n\t\tif !needSort {\n\t\t\tif last < int(v) {\n\t\t\t\tlast = int(v)\n\t\t\t} else {\n\t\t\t\tneedSort = true\n\t\t\t\t// There is no legal combinations of more than 7 variants\n\t\t\t\t// (and this is by no means a useful sequence).\n\t\t\t\tconst maxVariants = 8\n\t\t\t\tif len(varID) > maxVariants {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tend = scan.end\n\t}\n\tif needSort {\n\t\tsort.Sort(variantsSort{varID, variant})\n\t\tk, l := 0, -1\n\t\tfor i, v := range varID {\n\t\t\tw := int(v)\n\t\t\tif l == w {\n\t\t\t\t// Remove duplicates.\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tvarID[k] = varID[i]\n\t\t\tvariant[k] = variant[i]\n\t\t\tk++\n\t\t\tl = w\n\t\t}\n\t\tif str := bytes.Join(variant[:k], separator); len(str) == 0 {\n\t\t\tend = start - 1\n\t\t} else {\n\t\t\tscan.resizeRange(start, end, len(str))\n\t\t\tcopy(scan.b[scan.start:], str)\n\t\t\tend = scan.end\n\t\t}\n\t}\n\treturn end\n}\n\ntype variantsSort struct {\n\ti []uint8\n\tv [][]byte\n}\n\nfunc (s variantsSort) Len() int {\n\treturn len(s.i)\n}\n\nfunc (s variantsSort) Swap(i, j int) {\n\ts.i[i], s.i[j] = s.i[j], s.i[i]\n\ts.v[i], s.v[j] = s.v[j], s.v[i]\n}\n\nfunc (s variantsSort) Less(i, j int) bool {\n\treturn s.i[i] < s.i[j]\n}\n\ntype bytesSort [][]byte\n\nfunc (b bytesSort) Len() int {\n\treturn len(b)\n}\n\nfunc (b bytesSort) Swap(i, j int) {\n\tb[i], b[j] = b[j], b[i]\n}\n\nfunc (b bytesSort) Less(i, j int) bool {\n\treturn bytes.Compare(b[i], b[j]) == -1\n}\n\n// parseExtensions parses and normalizes the extensions in the buffer.\n// It returns the last position of scan.b that is part of any extension.\n// It also trims scan.b to remove excess parts accordingly.\nfunc parseExtensions(scan *scanner) int {\n\tstart := scan.start\n\texts := [][]byte{}\n\tprivate := []byte{}\n\tend := scan.end\n\tfor len(scan.token) == 1 {\n\t\textStart := scan.start\n\t\text := scan.token[0]\n\t\tend = parseExtension(scan)\n\t\textension := scan.b[extStart:end]\n\t\tif len(extension) < 3 || (ext != 'x' && len(extension) < 4) {\n\t\t\tscan.setError(errSyntax)\n\t\t\tend = extStart\n\t\t\tcontinue\n\t\t} else if start == extStart && (ext == 'x' || scan.start == len(scan.b)) {\n\t\t\tscan.b = scan.b[:end]\n\t\t\treturn end\n\t\t} else if ext == 'x' {\n\t\t\tprivate = extension\n\t\t\tbreak\n\t\t}\n\t\texts = append(exts, extension)\n\t}\n\tsort.Sort(bytesSort(exts))\n\tif len(private) > 0 {\n\t\texts = append(exts, private)\n\t}\n\tscan.b = scan.b[:start]\n\tif len(exts) > 0 {\n\t\tscan.b = append(scan.b, bytes.Join(exts, separator)...)\n\t} else if start > 0 {\n\t\t// Strip trailing '-'.\n\t\tscan.b = scan.b[:start-1]\n\t}\n\treturn end\n}\n\n// parseExtension parses a single extension and returns the position of\n// the extension end.\nfunc parseExtension(scan *scanner) int {\n\tstart, end := scan.start, scan.end\n\tswitch scan.token[0] {\n\tcase 'u':\n\t\tattrStart := end\n\t\tscan.scan()\n\t\tfor last := []byte{}; len(scan.token) > 2; scan.scan() {\n\t\t\tif bytes.Compare(scan.token, last) != -1 {\n\t\t\t\t// Attributes are unsorted. Start over from scratch.\n\t\t\t\tp := attrStart + 1\n\t\t\t\tscan.next = p\n\t\t\t\tattrs := [][]byte{}\n\t\t\t\tfor scan.scan(); len(scan.token) > 2; scan.scan() {\n\t\t\t\t\tattrs = append(attrs, scan.token)\n\t\t\t\t\tend = scan.end\n\t\t\t\t}\n\t\t\t\tsort.Sort(bytesSort(attrs))\n\t\t\t\tcopy(scan.b[p:], bytes.Join(attrs, separator))\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tlast = scan.token\n\t\t\tend = scan.end\n\t\t}\n\t\tvar last, key []byte\n\t\tfor attrEnd := end; len(scan.token) == 2; last = key {\n\t\t\tkey = scan.token\n\t\t\tkeyEnd := scan.end\n\t\t\tend = scan.acceptMinSize(3)\n\t\t\t// TODO: check key value validity\n\t\t\tif keyEnd == end || bytes.Compare(key, last) != 1 {\n\t\t\t\t// We have an invalid key or the keys are not sorted.\n\t\t\t\t// Start scanning keys from scratch and reorder.\n\t\t\t\tp := attrEnd + 1\n\t\t\t\tscan.next = p\n\t\t\t\tkeys := [][]byte{}\n\t\t\t\tfor scan.scan(); len(scan.token) == 2; {\n\t\t\t\t\tkeyStart, keyEnd := scan.start, scan.end\n\t\t\t\t\tend = scan.acceptMinSize(3)\n\t\t\t\t\tif keyEnd != end {\n\t\t\t\t\t\tkeys = append(keys, scan.b[keyStart:end])\n\t\t\t\t\t} else {\n\t\t\t\t\t\tscan.setError(errSyntax)\n\t\t\t\t\t\tend = keyStart\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsort.Sort(bytesSort(keys))\n\t\t\t\treordered := bytes.Join(keys, separator)\n\t\t\t\tif e := p + len(reordered); e < end {\n\t\t\t\t\tscan.deleteRange(e, end)\n\t\t\t\t\tend = e\n\t\t\t\t}\n\t\t\t\tcopy(scan.b[p:], bytes.Join(keys, separator))\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\tcase 't':\n\t\tscan.scan()\n\t\tif n := len(scan.token); n >= 2 && n <= 3 && isAlpha(scan.token[1]) {\n\t\t\t_, end = parseTag(scan)\n\t\t\tscan.toLower(start, end)\n\t\t}\n\t\tfor len(scan.token) == 2 && !isAlpha(scan.token[1]) {\n\t\t\tend = scan.acceptMinSize(3)\n\t\t}\n\tcase 'x':\n\t\tend = scan.acceptMinSize(1)\n\tdefault:\n\t\tend = scan.acceptMinSize(2)\n\t}\n\treturn end\n}\n\n// Compose creates a Tag from individual parts, which may be of type Tag, Base,\n// Script, Region, Variant, []Variant, Extension, []Extension or error. If a\n// Base, Script or Region or slice of type Variant or Extension is passed more\n// than once, the latter will overwrite the former. Variants and Extensions are\n// accumulated, but if two extensions of the same type are passed, the latter\n// will replace the former. A Tag overwrites all former values and typically\n// only makes sense as the first argument. The resulting tag is returned after\n// canonicalizing using the Default CanonType. If one or more errors are\n// encountered, one of the errors is returned.\nfunc Compose(part ...interface{}) (t Tag, err error) {\n\treturn Default.Compose(part...)\n}\n\n// Compose creates a Tag from individual parts, which may be of type Tag, Base,\n// Script, Region, Variant, []Variant, Extension, []Extension or error. If a\n// Base, Script or Region or slice of type Variant or Extension is passed more\n// than once, the latter will overwrite the former. Variants and Extensions are\n// accumulated, but if two extensions of the same type are passed, the latter\n// will replace the former. A Tag overwrites all former values and typically\n// only makes sense as the first argument. The resulting tag is returned after\n// canonicalizing using CanonType c. If one or more errors are encountered,\n// one of the errors is returned.\nfunc (c CanonType) Compose(part ...interface{}) (t Tag, err error) {\n\tvar b builder\n\tif err = b.update(part...); err != nil {\n\t\treturn und, err\n\t}\n\tt, _ = b.tag.canonicalize(c)\n\n\tif len(b.ext) > 0 || len(b.variant) > 0 {\n\t\tsort.Sort(sortVariant(b.variant))\n\t\tsort.Strings(b.ext)\n\t\tif b.private != \"\" {\n\t\t\tb.ext = append(b.ext, b.private)\n\t\t}\n\t\tn := maxCoreSize + tokenLen(b.variant...) + tokenLen(b.ext...)\n\t\tbuf := make([]byte, n)\n\t\tp := t.genCoreBytes(buf)\n\t\tt.pVariant = byte(p)\n\t\tp += appendTokens(buf[p:], b.variant...)\n\t\tt.pExt = uint16(p)\n\t\tp += appendTokens(buf[p:], b.ext...)\n\t\tt.str = string(buf[:p])\n\t} else if b.private != \"\" {\n\t\tt.str = b.private\n\t\tt.remakeString()\n\t}\n\treturn\n}\n\ntype builder struct {\n\ttag Tag\n\n\tprivate string // the x extension\n\text     []string\n\tvariant []string\n\n\terr error\n}\n\nfunc (b *builder) addExt(e string) {\n\tif e == \"\" {\n\t} else if e[0] == 'x' {\n\t\tb.private = e\n\t} else {\n\t\tb.ext = append(b.ext, e)\n\t}\n}\n\nvar errInvalidArgument = errors.New(\"invalid Extension or Variant\")\n\nfunc (b *builder) update(part ...interface{}) (err error) {\n\treplace := func(l *[]string, s string, eq func(a, b string) bool) bool {\n\t\tif s == \"\" {\n\t\t\tb.err = errInvalidArgument\n\t\t\treturn true\n\t\t}\n\t\tfor i, v := range *l {\n\t\t\tif eq(v, s) {\n\t\t\t\t(*l)[i] = s\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\tfor _, x := range part {\n\t\tswitch v := x.(type) {\n\t\tcase Tag:\n\t\t\tb.tag.lang = v.lang\n\t\t\tb.tag.region = v.region\n\t\t\tb.tag.script = v.script\n\t\t\tif v.str != \"\" {\n\t\t\t\tb.variant = nil\n\t\t\t\tfor x, s := \"\", v.str[v.pVariant:v.pExt]; s != \"\"; {\n\t\t\t\t\tx, s = nextToken(s)\n\t\t\t\t\tb.variant = append(b.variant, x)\n\t\t\t\t}\n\t\t\t\tb.ext, b.private = nil, \"\"\n\t\t\t\tfor i, e := int(v.pExt), \"\"; i < len(v.str); {\n\t\t\t\t\ti, e = getExtension(v.str, i)\n\t\t\t\t\tb.addExt(e)\n\t\t\t\t}\n\t\t\t}\n\t\tcase Base:\n\t\t\tb.tag.lang = v.langID\n\t\tcase Script:\n\t\t\tb.tag.script = v.scriptID\n\t\tcase Region:\n\t\t\tb.tag.region = v.regionID\n\t\tcase Variant:\n\t\t\tif !replace(&b.variant, v.variant, func(a, b string) bool { return a == b }) {\n\t\t\t\tb.variant = append(b.variant, v.variant)\n\t\t\t}\n\t\tcase Extension:\n\t\t\tif !replace(&b.ext, v.s, func(a, b string) bool { return a[0] == b[0] }) {\n\t\t\t\tb.addExt(v.s)\n\t\t\t}\n\t\tcase []Variant:\n\t\t\tb.variant = nil\n\t\t\tfor _, x := range v {\n\t\t\t\tb.update(x)\n\t\t\t}\n\t\tcase []Extension:\n\t\t\tb.ext, b.private = nil, \"\"\n\t\t\tfor _, e := range v {\n\t\t\t\tb.update(e)\n\t\t\t}\n\t\t// TODO: support parsing of raw strings based on morphology or just extensions?\n\t\tcase error:\n\t\t\terr = v\n\t\t}\n\t}\n\treturn\n}\n\nfunc tokenLen(token ...string) (n int) {\n\tfor _, t := range token {\n\t\tn += len(t) + 1\n\t}\n\treturn\n}\n\nfunc appendTokens(b []byte, token ...string) int {\n\tp := 0\n\tfor _, t := range token {\n\t\tb[p] = '-'\n\t\tcopy(b[p+1:], t)\n\t\tp += 1 + len(t)\n\t}\n\treturn p\n}\n\ntype sortVariant []string\n\nfunc (s sortVariant) Len() int {\n\treturn len(s)\n}\n\nfunc (s sortVariant) Swap(i, j int) {\n\ts[j], s[i] = s[i], s[j]\n}\n\nfunc (s sortVariant) Less(i, j int) bool {\n\treturn variantIndex[s[i]] < variantIndex[s[j]]\n}\n\nfunc findExt(list []string, x byte) int {\n\tfor i, e := range list {\n\t\tif e[0] == x {\n\t\t\treturn i\n\t\t}\n\t}\n\treturn -1\n}\n\n// getExtension returns the name, body and end position of the extension.\nfunc getExtension(s string, p int) (end int, ext string) {\n\tif s[p] == '-' {\n\t\tp++\n\t}\n\tif s[p] == 'x' {\n\t\treturn len(s), s[p:]\n\t}\n\tend = nextExtension(s, p)\n\treturn end, s[p:end]\n}\n\n// nextExtension finds the next extension within the string, searching\n// for the -<char>- pattern from position p.\n// In the fast majority of cases, language tags will have at most\n// one extension and extensions tend to be small.\nfunc nextExtension(s string, p int) int {\n\tfor n := len(s) - 3; p < n; {\n\t\tif s[p] == '-' {\n\t\t\tif s[p+2] == '-' {\n\t\t\t\treturn p\n\t\t\t}\n\t\t\tp += 3\n\t\t} else {\n\t\t\tp++\n\t\t}\n\t}\n\treturn len(s)\n}\n\nvar errInvalidWeight = errors.New(\"ParseAcceptLanguage: invalid weight\")\n\n// ParseAcceptLanguage parses the contents of a Accept-Language header as\n// defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and\n// a list of corresponding quality weights. It is more permissive than RFC 2616\n// and may return non-nil slices even if the input is not valid.\n// The Tags will be sorted by highest weight first and then by first occurrence.\n// Tags with a weight of zero will be dropped. An error will be returned if the\n// input could not be parsed.\nfunc ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) {\n\tvar entry string\n\tfor s != \"\" {\n\t\tif entry, s = split(s, ','); entry == \"\" {\n\t\t\tcontinue\n\t\t}\n\n\t\tentry, weight := split(entry, ';')\n\n\t\t// Scan the language.\n\t\tt, err := Parse(entry)\n\t\tif err != nil {\n\t\t\tid, ok := acceptFallback[entry]\n\t\t\tif !ok {\n\t\t\t\treturn nil, nil, err\n\t\t\t}\n\t\t\tt = Tag{lang: id}\n\t\t}\n\n\t\t// Scan the optional weight.\n\t\tw := 1.0\n\t\tif weight != \"\" {\n\t\t\tweight = consume(weight, 'q')\n\t\t\tweight = consume(weight, '=')\n\t\t\t// consume returns the empty string when a token could not be\n\t\t\t// consumed, resulting in an error for ParseFloat.\n\t\t\tif w, err = strconv.ParseFloat(weight, 32); err != nil {\n\t\t\t\treturn nil, nil, errInvalidWeight\n\t\t\t}\n\t\t\t// Drop tags with a quality weight of 0.\n\t\t\tif w <= 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\ttag = append(tag, t)\n\t\tq = append(q, float32(w))\n\t}\n\tsortStable(&tagSort{tag, q})\n\treturn tag, q, nil\n}\n\n// consume removes a leading token c from s and returns the result or the empty\n// string if there is no such token.\nfunc consume(s string, c byte) string {\n\tif s == \"\" || s[0] != c {\n\t\treturn \"\"\n\t}\n\treturn strings.TrimSpace(s[1:])\n}\n\nfunc split(s string, c byte) (head, tail string) {\n\tif i := strings.IndexByte(s, c); i >= 0 {\n\t\treturn strings.TrimSpace(s[:i]), strings.TrimSpace(s[i+1:])\n\t}\n\treturn strings.TrimSpace(s), \"\"\n}\n\n// Add hack mapping to deal with a small number of cases that that occur\n// in Accept-Language (with reasonable frequency).\nvar acceptFallback = map[string]langID{\n\t\"english\": _en,\n\t\"deutsch\": _de,\n\t\"italian\": _it,\n\t\"french\":  _fr,\n\t\"*\":       _mul, // defined in the spec to match all languages.\n}\n\ntype tagSort struct {\n\ttag []Tag\n\tq   []float32\n}\n\nfunc (s *tagSort) Len() int {\n\treturn len(s.q)\n}\n\nfunc (s *tagSort) Less(i, j int) bool {\n\treturn s.q[i] > s.q[j]\n}\n\nfunc (s *tagSort) Swap(i, j int) {\n\ts.tag[i], s.tag[j] = s.tag[j], s.tag[i]\n\ts.q[i], s.q[j] = s.q[j], s.q[i]\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/tables.go",
    "content": "// This file was generated by go generate; DO NOT EDIT\n\npackage language\n\nimport \"golang.org/x/text/internal/tag\"\n\n// CLDRVersion is the CLDR version from which the tables in this package are derived.\nconst CLDRVersion = \"30\"\n\nconst numLanguages = 8654\n\nconst numScripts = 230\n\nconst numRegions = 356\n\ntype fromTo struct {\n\tfrom uint16\n\tto   uint16\n}\n\nconst nonCanonicalUnd = 1191\nconst (\n\t_af  = 21\n\t_am  = 38\n\t_ar  = 57\n\t_az  = 87\n\t_bg  = 125\n\t_bn  = 163\n\t_ca  = 213\n\t_cs  = 246\n\t_da  = 253\n\t_de  = 265\n\t_el  = 305\n\t_en  = 308\n\t_es  = 313\n\t_et  = 315\n\t_fa  = 323\n\t_fi  = 332\n\t_fil = 334\n\t_fr  = 345\n\t_gu  = 413\n\t_he  = 437\n\t_hi  = 439\n\t_hr  = 458\n\t_hu  = 462\n\t_hy  = 464\n\t_id  = 474\n\t_is  = 496\n\t_it  = 497\n\t_ja  = 504\n\t_ka  = 520\n\t_kk  = 570\n\t_km  = 578\n\t_kn  = 585\n\t_ko  = 587\n\t_ky  = 641\n\t_lo  = 687\n\t_lt  = 695\n\t_lv  = 702\n\t_mk  = 758\n\t_ml  = 763\n\t_mn  = 770\n\t_mo  = 775\n\t_mr  = 786\n\t_ms  = 790\n\t_mul = 797\n\t_my  = 808\n\t_nb  = 830\n\t_ne  = 840\n\t_nl  = 862\n\t_no  = 870\n\t_pa  = 916\n\t_pl  = 938\n\t_pt  = 951\n\t_ro  = 979\n\t_ru  = 985\n\t_sh  = 1021\n\t_si  = 1026\n\t_sk  = 1032\n\t_sl  = 1036\n\t_sq  = 1063\n\t_sr  = 1064\n\t_sv  = 1082\n\t_sw  = 1083\n\t_ta  = 1094\n\t_te  = 1111\n\t_th  = 1121\n\t_tl  = 1136\n\t_tn  = 1142\n\t_tr  = 1152\n\t_uk  = 1188\n\t_ur  = 1194\n\t_uz  = 1202\n\t_vi  = 1209\n\t_zh  = 1311\n\t_zu  = 1316\n\t_jbo = 507\n\t_ami = 1639\n\t_bnn = 2346\n\t_hak = 431\n\t_tlh = 14456\n\t_lb  = 652\n\t_nv  = 890\n\t_pwn = 12044\n\t_tao = 14177\n\t_tay = 14187\n\t_tsu = 14651\n\t_nn  = 865\n\t_sfb = 13618\n\t_vgt = 15690\n\t_sgg = 13649\n\t_cmn = 2996\n\t_nan = 826\n\t_hsn = 460\n)\n\nconst langPrivateStart = 0x2f67\n\nconst langPrivateEnd = 0x316e\n\n// lang holds an alphabetically sorted list of ISO-639 language identifiers.\n// All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag.\n// For 2-byte language identifiers, the two successive bytes have the following meaning:\n//     - if the first letter of the 2- and 3-letter ISO codes are the same:\n//       the second and third letter of the 3-letter ISO code.\n//     - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3.\n// For 3-byte language identifiers the 4th byte is 0.\nconst lang tag.Index = \"\" + // Size: 5280 bytes\n\t\"---\\x00aaaraai\\x00aak\\x00aau\\x00abbkabi\\x00abr\\x00abt\\x00aby\\x00acd\\x00a\" +\n\t\"ce\\x00ach\\x00ada\\x00ade\\x00adj\\x00ady\\x00adz\\x00aeveaeb\\x00aey\\x00affrag\" +\n\t\"c\\x00agd\\x00agg\\x00agm\\x00ago\\x00agq\\x00aha\\x00ahl\\x00aho\\x00ajg\\x00akka\" +\n\t\"akk\\x00ala\\x00ali\\x00aln\\x00alt\\x00ammhamm\\x00amn\\x00amo\\x00amp\\x00anrga\" +\n\t\"nc\\x00ank\\x00ann\\x00any\\x00aoj\\x00aom\\x00aoz\\x00apc\\x00apd\\x00ape\\x00apr\" +\n\t\"\\x00aps\\x00apz\\x00arraarc\\x00arh\\x00arn\\x00aro\\x00arq\\x00ars\\x00ary\\x00a\" +\n\t\"rz\\x00assmasa\\x00ase\\x00asg\\x00aso\\x00ast\\x00ata\\x00atg\\x00atj\\x00auy\" +\n\t\"\\x00avvaavl\\x00avn\\x00avt\\x00avu\\x00awa\\x00awb\\x00awo\\x00awx\\x00ayymayb\" +\n\t\"\\x00azzebaakbal\\x00ban\\x00bap\\x00bar\\x00bas\\x00bav\\x00bax\\x00bba\\x00bbb\" +\n\t\"\\x00bbc\\x00bbd\\x00bbj\\x00bbp\\x00bbr\\x00bcf\\x00bch\\x00bci\\x00bcm\\x00bcn\" +\n\t\"\\x00bco\\x00bcq\\x00bcu\\x00bdd\\x00beelbef\\x00beh\\x00bej\\x00bem\\x00bet\\x00b\" +\n\t\"ew\\x00bex\\x00bez\\x00bfd\\x00bfq\\x00bft\\x00bfy\\x00bgulbgc\\x00bgn\\x00bgx\" +\n\t\"\\x00bhihbhb\\x00bhg\\x00bhi\\x00bhk\\x00bhl\\x00bho\\x00bhy\\x00biisbib\\x00big\" +\n\t\"\\x00bik\\x00bim\\x00bin\\x00bio\\x00biq\\x00bjh\\x00bji\\x00bjj\\x00bjn\\x00bjo\" +\n\t\"\\x00bjr\\x00bjz\\x00bkc\\x00bkm\\x00bkq\\x00bku\\x00bkv\\x00blt\\x00bmambmh\\x00b\" +\n\t\"mk\\x00bmq\\x00bmu\\x00bnenbng\\x00bnm\\x00bnp\\x00boodboj\\x00bom\\x00bon\\x00bp\" +\n\t\"y\\x00bqc\\x00bqi\\x00bqp\\x00bqv\\x00brrebra\\x00brh\\x00brx\\x00brz\\x00bsosbsj\" +\n\t\"\\x00bsq\\x00bss\\x00bst\\x00bto\\x00btt\\x00btv\\x00bua\\x00buc\\x00bud\\x00bug\" +\n\t\"\\x00buk\\x00bum\\x00buo\\x00bus\\x00buu\\x00bvb\\x00bwd\\x00bwr\\x00bxh\\x00bye\" +\n\t\"\\x00byn\\x00byr\\x00bys\\x00byv\\x00byx\\x00bza\\x00bze\\x00bzf\\x00bzh\\x00bzw\" +\n\t\"\\x00caatcan\\x00cbj\\x00cch\\x00ccp\\x00ceheceb\\x00cfa\\x00cgg\\x00chhachk\\x00\" +\n\t\"chm\\x00cho\\x00chp\\x00chr\\x00cja\\x00cjm\\x00cjv\\x00ckb\\x00ckl\\x00cko\\x00ck\" +\n\t\"y\\x00cla\\x00cme\\x00cooscop\\x00cps\\x00crrecrj\\x00crk\\x00crl\\x00crm\\x00crs\" +\n\t\"\\x00csescsb\\x00csw\\x00ctd\\x00cuhucvhvcyymdaandad\\x00daf\\x00dag\\x00dah\" +\n\t\"\\x00dak\\x00dar\\x00dav\\x00dbd\\x00dbq\\x00dcc\\x00ddn\\x00deeuded\\x00den\\x00d\" +\n\t\"ga\\x00dgh\\x00dgi\\x00dgl\\x00dgr\\x00dgz\\x00dia\\x00dje\\x00dnj\\x00dob\\x00doi\" +\n\t\"\\x00dop\\x00dow\\x00dri\\x00drs\\x00dsb\\x00dtm\\x00dtp\\x00dts\\x00dty\\x00dua\" +\n\t\"\\x00duc\\x00dud\\x00dug\\x00dvivdva\\x00dww\\x00dyo\\x00dyu\\x00dzzodzg\\x00ebu\" +\n\t\"\\x00eeweefi\\x00egl\\x00egy\\x00eky\\x00elllema\\x00emi\\x00enngenn\\x00enq\\x00\" +\n\t\"eopoeri\\x00es\\x00\\x05esu\\x00etstetr\\x00ett\\x00etu\\x00etx\\x00euusewo\\x00e\" +\n\t\"xt\\x00faasfaa\\x00fab\\x00fag\\x00fai\\x00fan\\x00ffulffi\\x00ffm\\x00fiinfia\" +\n\t\"\\x00fil\\x00fit\\x00fjijflr\\x00fmp\\x00foaofod\\x00fon\\x00for\\x00fpe\\x00fqs\" +\n\t\"\\x00frrafrc\\x00frp\\x00frr\\x00frs\\x00fub\\x00fud\\x00fue\\x00fuf\\x00fuh\\x00f\" +\n\t\"uq\\x00fur\\x00fuv\\x00fuy\\x00fvr\\x00fyrygalegaa\\x00gaf\\x00gag\\x00gah\\x00ga\" +\n\t\"j\\x00gam\\x00gan\\x00gaw\\x00gay\\x00gbf\\x00gbm\\x00gby\\x00gbz\\x00gcr\\x00gdla\" +\n\t\"gde\\x00gdn\\x00gdr\\x00geb\\x00gej\\x00gel\\x00gez\\x00gfk\\x00ggn\\x00ghs\\x00gi\" +\n\t\"l\\x00gim\\x00gjk\\x00gjn\\x00gju\\x00gkn\\x00gkp\\x00gllgglk\\x00gmm\\x00gmv\\x00\" +\n\t\"gnrngnd\\x00gng\\x00god\\x00gof\\x00goi\\x00gom\\x00gon\\x00gor\\x00gos\\x00got\" +\n\t\"\\x00grc\\x00grt\\x00grw\\x00gsw\\x00guujgub\\x00guc\\x00gud\\x00gur\\x00guw\\x00g\" +\n\t\"ux\\x00guz\\x00gvlvgvf\\x00gvr\\x00gvs\\x00gwc\\x00gwi\\x00gwt\\x00gyi\\x00haauha\" +\n\t\"g\\x00hak\\x00ham\\x00haw\\x00haz\\x00hbb\\x00hdy\\x00heebhhy\\x00hiinhia\\x00hif\" +\n\t\"\\x00hig\\x00hih\\x00hil\\x00hla\\x00hlu\\x00hmd\\x00hmt\\x00hnd\\x00hne\\x00hnj\" +\n\t\"\\x00hnn\\x00hno\\x00homohoc\\x00hoj\\x00hot\\x00hrrvhsb\\x00hsn\\x00htathuunhui\" +\n\t\"\\x00hyyehzerianaian\\x00iar\\x00iba\\x00ibb\\x00iby\\x00ica\\x00ich\\x00idndidd\" +\n\t\"\\x00idi\\x00idu\\x00ieleigboigb\\x00ige\\x00iiiiijj\\x00ikpkikk\\x00ikt\\x00ikw\" +\n\t\"\\x00ikx\\x00ilo\\x00imo\\x00inndinh\\x00iodoiou\\x00iri\\x00isslittaiukuiw\\x00\" +\n\t\"\\x03iwm\\x00iws\\x00izh\\x00izi\\x00japnjab\\x00jam\\x00jbo\\x00jbu\\x00jen\\x00j\" +\n\t\"gk\\x00jgo\\x00ji\\x00\\x06jib\\x00jmc\\x00jml\\x00jra\\x00jut\\x00jvavjwavkaatka\" +\n\t\"a\\x00kab\\x00kac\\x00kad\\x00kai\\x00kaj\\x00kam\\x00kao\\x00kbd\\x00kbm\\x00kbp\" +\n\t\"\\x00kbq\\x00kbx\\x00kby\\x00kcg\\x00kck\\x00kcl\\x00kct\\x00kde\\x00kdh\\x00kdl\" +\n\t\"\\x00kdt\\x00kea\\x00ken\\x00kez\\x00kfo\\x00kfr\\x00kfy\\x00kgonkge\\x00kgf\\x00k\" +\n\t\"gp\\x00kha\\x00khb\\x00khn\\x00khq\\x00khs\\x00kht\\x00khw\\x00khz\\x00kiikkij\" +\n\t\"\\x00kiu\\x00kiw\\x00kjuakjd\\x00kjg\\x00kjs\\x00kjy\\x00kkazkkc\\x00kkj\\x00klal\" +\n\t\"kln\\x00klq\\x00klt\\x00klx\\x00kmhmkmb\\x00kmh\\x00kmo\\x00kms\\x00kmu\\x00kmw\" +\n\t\"\\x00knanknp\\x00koorkoi\\x00kok\\x00kol\\x00kos\\x00koz\\x00kpe\\x00kpf\\x00kpo\" +\n\t\"\\x00kpr\\x00kpx\\x00kqb\\x00kqf\\x00kqs\\x00kqy\\x00kraukrc\\x00kri\\x00krj\\x00k\" +\n\t\"rl\\x00krs\\x00kru\\x00ksasksb\\x00ksd\\x00ksf\\x00ksh\\x00ksj\\x00ksr\\x00ktb\" +\n\t\"\\x00ktm\\x00kto\\x00kuurkub\\x00kud\\x00kue\\x00kuj\\x00kum\\x00kun\\x00kup\\x00k\" +\n\t\"us\\x00kvomkvg\\x00kvr\\x00kvx\\x00kw\\x00\\x01kwj\\x00kwo\\x00kxa\\x00kxc\\x00kxm\" +\n\t\"\\x00kxp\\x00kxw\\x00kxz\\x00kyirkye\\x00kyx\\x00kzr\\x00laatlab\\x00lad\\x00lag\" +\n\t\"\\x00lah\\x00laj\\x00las\\x00lbtzlbe\\x00lbu\\x00lbw\\x00lcm\\x00lcp\\x00ldb\\x00l\" +\n\t\"ed\\x00lee\\x00lem\\x00lep\\x00leq\\x00leu\\x00lez\\x00lguglgg\\x00liimlia\\x00li\" +\n\t\"d\\x00lif\\x00lig\\x00lih\\x00lij\\x00lis\\x00ljp\\x00lki\\x00lkt\\x00lle\\x00lln\" +\n\t\"\\x00lmn\\x00lmo\\x00lmp\\x00lninlns\\x00lnu\\x00loaoloj\\x00lok\\x00lol\\x00lor\" +\n\t\"\\x00los\\x00loz\\x00lrc\\x00ltitltg\\x00luublua\\x00luo\\x00luy\\x00luz\\x00lvav\" +\n\t\"lwl\\x00lzh\\x00lzz\\x00mad\\x00maf\\x00mag\\x00mai\\x00mak\\x00man\\x00mas\\x00ma\" +\n\t\"w\\x00maz\\x00mbh\\x00mbo\\x00mbq\\x00mbu\\x00mbw\\x00mci\\x00mcp\\x00mcq\\x00mcr\" +\n\t\"\\x00mcu\\x00mda\\x00mde\\x00mdf\\x00mdh\\x00mdj\\x00mdr\\x00mdx\\x00med\\x00mee\" +\n\t\"\\x00mek\\x00men\\x00mer\\x00met\\x00meu\\x00mfa\\x00mfe\\x00mfn\\x00mfo\\x00mfq\" +\n\t\"\\x00mglgmgh\\x00mgl\\x00mgo\\x00mgp\\x00mgy\\x00mhahmhi\\x00mhl\\x00mirimif\\x00\" +\n\t\"min\\x00mis\\x00miw\\x00mkkdmki\\x00mkl\\x00mkp\\x00mkw\\x00mlalmle\\x00mlp\\x00m\" +\n\t\"ls\\x00mmo\\x00mmu\\x00mmx\\x00mnonmna\\x00mnf\\x00mni\\x00mnw\\x00moolmoa\\x00mo\" +\n\t\"e\\x00moh\\x00mos\\x00mox\\x00mpp\\x00mps\\x00mpt\\x00mpx\\x00mql\\x00mrarmrd\\x00\" +\n\t\"mrj\\x00mro\\x00mssamtltmtc\\x00mtf\\x00mti\\x00mtr\\x00mua\\x00mul\\x00mur\\x00m\" +\n\t\"us\\x00mva\\x00mvn\\x00mvy\\x00mwk\\x00mwr\\x00mwv\\x00mxc\\x00mxm\\x00myyamyk\" +\n\t\"\\x00mym\\x00myv\\x00myw\\x00myx\\x00myz\\x00mzk\\x00mzm\\x00mzn\\x00mzp\\x00mzw\" +\n\t\"\\x00mzz\\x00naaunac\\x00naf\\x00nah\\x00nak\\x00nan\\x00nap\\x00naq\\x00nas\\x00n\" +\n\t\"bobnca\\x00nce\\x00ncf\\x00nch\\x00nco\\x00ncu\\x00nddendc\\x00nds\\x00neepneb\" +\n\t\"\\x00new\\x00nex\\x00nfr\\x00ngdonga\\x00ngb\\x00ngl\\x00nhb\\x00nhe\\x00nhw\\x00n\" +\n\t\"if\\x00nii\\x00nij\\x00nin\\x00niu\\x00niy\\x00niz\\x00njo\\x00nkg\\x00nko\\x00nll\" +\n\t\"dnmg\\x00nmz\\x00nnnonnf\\x00nnh\\x00nnk\\x00nnm\\x00noornod\\x00noe\\x00non\\x00\" +\n\t\"nop\\x00nou\\x00nqo\\x00nrblnrb\\x00nsk\\x00nsn\\x00nso\\x00nss\\x00ntm\\x00ntr\" +\n\t\"\\x00nui\\x00nup\\x00nus\\x00nuv\\x00nux\\x00nvavnwb\\x00nxq\\x00nxr\\x00nyyanym\" +\n\t\"\\x00nyn\\x00nzi\\x00occiogc\\x00ojjiokr\\x00okv\\x00omrmong\\x00onn\\x00ons\\x00\" +\n\t\"opm\\x00orrioro\\x00oru\\x00osssosa\\x00ota\\x00otk\\x00ozm\\x00paanpag\\x00pal\" +\n\t\"\\x00pam\\x00pap\\x00pau\\x00pbi\\x00pcd\\x00pcm\\x00pdc\\x00pdt\\x00ped\\x00peo\" +\n\t\"\\x00pex\\x00pfl\\x00phl\\x00phn\\x00pilipil\\x00pip\\x00pka\\x00pko\\x00plolpla\" +\n\t\"\\x00pms\\x00png\\x00pnn\\x00pnt\\x00pon\\x00ppo\\x00pra\\x00prd\\x00prg\\x00psusp\" +\n\t\"ss\\x00ptorptp\\x00puu\\x00pwa\\x00quuequc\\x00qug\\x00rai\\x00raj\\x00rao\\x00rc\" +\n\t\"f\\x00rej\\x00rel\\x00res\\x00rgn\\x00rhg\\x00ria\\x00rif\\x00rjs\\x00rkt\\x00rmoh\" +\n\t\"rmf\\x00rmo\\x00rmt\\x00rmu\\x00rnunrna\\x00rng\\x00roonrob\\x00rof\\x00roo\\x00r\" +\n\t\"ro\\x00rtm\\x00ruusrue\\x00rug\\x00rw\\x00\\x04rwk\\x00rwo\\x00ryu\\x00saansaf\" +\n\t\"\\x00sah\\x00saq\\x00sas\\x00sat\\x00saz\\x00sba\\x00sbe\\x00sbp\\x00scrdsck\\x00s\" +\n\t\"cl\\x00scn\\x00sco\\x00scs\\x00sdndsdc\\x00sdh\\x00semesef\\x00seh\\x00sei\\x00se\" +\n\t\"s\\x00sgagsga\\x00sgs\\x00sgw\\x00sgz\\x00sh\\x00\\x02shi\\x00shk\\x00shn\\x00shu\" +\n\t\"\\x00siinsid\\x00sig\\x00sil\\x00sim\\x00sjr\\x00sklkskc\\x00skr\\x00sks\\x00sllv\" +\n\t\"sld\\x00sli\\x00sll\\x00sly\\x00smmosma\\x00smi\\x00smj\\x00smn\\x00smp\\x00smq\" +\n\t\"\\x00sms\\x00snnasnc\\x00snk\\x00snp\\x00snx\\x00sny\\x00soomsok\\x00soq\\x00sou\" +\n\t\"\\x00soy\\x00spd\\x00spl\\x00sps\\x00sqqisrrpsrb\\x00srn\\x00srr\\x00srx\\x00sssw\" +\n\t\"ssd\\x00ssg\\x00ssy\\x00stotstk\\x00stq\\x00suunsua\\x00sue\\x00suk\\x00sur\\x00s\" +\n\t\"us\\x00svweswwaswb\\x00swc\\x00swg\\x00swp\\x00swv\\x00sxn\\x00sxw\\x00syl\\x00sy\" +\n\t\"r\\x00szl\\x00taamtaj\\x00tal\\x00tan\\x00taq\\x00tbc\\x00tbd\\x00tbf\\x00tbg\\x00\" +\n\t\"tbo\\x00tbw\\x00tbz\\x00tci\\x00tcy\\x00tdd\\x00tdg\\x00tdh\\x00teelted\\x00tem\" +\n\t\"\\x00teo\\x00tet\\x00tfi\\x00tggktgc\\x00tgo\\x00tgu\\x00thhathl\\x00thq\\x00thr\" +\n\t\"\\x00tiirtif\\x00tig\\x00tik\\x00tim\\x00tio\\x00tiv\\x00tkuktkl\\x00tkr\\x00tkt\" +\n\t\"\\x00tlgltlf\\x00tlx\\x00tly\\x00tmh\\x00tmy\\x00tnsntnh\\x00toontof\\x00tog\\x00\" +\n\t\"toq\\x00tpi\\x00tpm\\x00tpz\\x00tqo\\x00trurtru\\x00trv\\x00trw\\x00tssotsd\\x00t\" +\n\t\"sf\\x00tsg\\x00tsj\\x00tsw\\x00ttatttd\\x00tte\\x00ttj\\x00ttr\\x00tts\\x00ttt\" +\n\t\"\\x00tuh\\x00tul\\x00tum\\x00tuq\\x00tvd\\x00tvl\\x00tvu\\x00twwitwh\\x00twq\\x00t\" +\n\t\"xg\\x00tyahtya\\x00tyv\\x00tzm\\x00ubu\\x00udm\\x00ugiguga\\x00ukkruli\\x00umb\" +\n\t\"\\x00und\\x00unr\\x00unx\\x00urrduri\\x00urt\\x00urw\\x00usa\\x00utr\\x00uvh\\x00u\" +\n\t\"vl\\x00uzzbvag\\x00vai\\x00van\\x00veenvec\\x00vep\\x00viievic\\x00viv\\x00vls\" +\n\t\"\\x00vmf\\x00vmw\\x00voolvot\\x00vro\\x00vun\\x00vut\\x00walnwae\\x00waj\\x00wal\" +\n\t\"\\x00wan\\x00war\\x00wbp\\x00wbq\\x00wbr\\x00wci\\x00wer\\x00wgi\\x00whg\\x00wib\" +\n\t\"\\x00wiu\\x00wiv\\x00wja\\x00wji\\x00wls\\x00wmo\\x00wnc\\x00wni\\x00wnu\\x00woolw\" +\n\t\"ob\\x00wos\\x00wrs\\x00wsk\\x00wtm\\x00wuu\\x00wuv\\x00wwa\\x00xav\\x00xbi\\x00xcr\" +\n\t\"\\x00xes\\x00xhhoxla\\x00xlc\\x00xld\\x00xmf\\x00xmn\\x00xmr\\x00xna\\x00xnr\\x00x\" +\n\t\"og\\x00xon\\x00xpr\\x00xrb\\x00xsa\\x00xsi\\x00xsm\\x00xsr\\x00xwe\\x00yam\\x00yao\" +\n\t\"\\x00yap\\x00yas\\x00yat\\x00yav\\x00yay\\x00yaz\\x00yba\\x00ybb\\x00yby\\x00yer\" +\n\t\"\\x00ygr\\x00ygw\\x00yiidyko\\x00yle\\x00ylg\\x00yll\\x00yml\\x00yooryon\\x00yrb\" +\n\t\"\\x00yre\\x00yrl\\x00yss\\x00yua\\x00yue\\x00yuj\\x00yut\\x00yuw\\x00zahazag\\x00z\" +\n\t\"bl\\x00zdj\\x00zea\\x00zgh\\x00zhhozia\\x00zlm\\x00zmi\\x00zne\\x00zuulzxx\\x00zz\" +\n\t\"a\\x00\\xff\\xff\\xff\\xff\"\n\nconst langNoIndexOffset = 1319\n\n// langNoIndex is a bit vector of all 3-letter language codes that are not used as an index\n// in lookup tables. The language ids for these language codes are derived directly\n// from the letters and are not consecutive.\n// Size: 2197 bytes, 2197 elements\nvar langNoIndex = [2197]uint8{\n\t// Entry 0 - 3F\n\t0xff, 0xf8, 0xed, 0xfe, 0xeb, 0xd7, 0x3b, 0xd2,\n\t0xfb, 0xbf, 0x7a, 0xfa, 0x37, 0x1d, 0x3c, 0x57,\n\t0x6e, 0x97, 0x73, 0x38, 0xfb, 0xea, 0xbf, 0x70,\n\t0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x62,\n\t0xe9, 0xbf, 0xfd, 0xbf, 0xbf, 0xf7, 0xfd, 0x77,\n\t0x0f, 0xff, 0xef, 0x6f, 0xff, 0xfb, 0xdf, 0xe2,\n\t0xc9, 0xf8, 0x7f, 0x7e, 0x4d, 0xb8, 0x0a, 0x6a,\n\t0x7c, 0xea, 0xe3, 0xfa, 0x7a, 0xbf, 0x67, 0xff,\n\t// Entry 40 - 7F\n\t0xff, 0xff, 0xff, 0xdf, 0x2a, 0x54, 0x91, 0xc0,\n\t0x5d, 0xe3, 0x97, 0x14, 0x07, 0x20, 0xdd, 0xed,\n\t0x9f, 0x3f, 0xc9, 0x21, 0xf8, 0x3f, 0x94, 0x35,\n\t0x7c, 0x5f, 0xff, 0x5f, 0x8e, 0x6e, 0xdf, 0xff,\n\t0xff, 0xff, 0x55, 0x7c, 0xd3, 0xfd, 0xbf, 0xb5,\n\t0x7b, 0xdf, 0x7f, 0xf7, 0xca, 0xfe, 0xdb, 0xa3,\n\t0xa8, 0xff, 0x1f, 0x67, 0x7f, 0xeb, 0xef, 0xce,\n\t0xff, 0xff, 0x9f, 0xff, 0xb7, 0xef, 0xfe, 0xcf,\n\t// Entry 80 - BF\n\t0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x2f, 0xff, 0xff,\n\t0xbb, 0xee, 0xf7, 0xbd, 0xdb, 0xff, 0x5f, 0xf7,\n\t0xfd, 0xf2, 0xfd, 0xff, 0x5e, 0x2f, 0x3b, 0xba,\n\t0x7e, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xdd, 0xff,\n\t0xfd, 0xdf, 0xfb, 0xfe, 0x9d, 0xb4, 0xd3, 0xff,\n\t0xef, 0xff, 0xdf, 0xf7, 0x7f, 0xb7, 0xfd, 0xd5,\n\t0xa5, 0x77, 0x40, 0xff, 0x9c, 0xc1, 0x41, 0x2c,\n\t0x08, 0x20, 0x41, 0x00, 0x50, 0x40, 0x00, 0x80,\n\t// Entry C0 - FF\n\t0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96,\n\t0x1b, 0x14, 0x08, 0xf2, 0x2b, 0xe7, 0x17, 0x56,\n\t0x45, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef,\n\t0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10,\n\t0xbc, 0x87, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35,\n\t0x3e, 0x87, 0xc7, 0xdf, 0xff, 0x00, 0x81, 0x00,\n\t0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03,\n\t0x40, 0x00, 0x40, 0x92, 0x21, 0x50, 0xb1, 0x5d,\n\t// Entry 100 - 13F\n\t0xfd, 0xdc, 0xbe, 0x5e, 0x00, 0x00, 0x02, 0x64,\n\t0x0d, 0x19, 0x41, 0xdf, 0x79, 0x22, 0x00, 0x00,\n\t0x00, 0x5e, 0x64, 0xdc, 0x24, 0xe5, 0xd9, 0xe3,\n\t0xfe, 0xff, 0xfd, 0xcb, 0x9f, 0x14, 0x01, 0x0c,\n\t0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc5, 0x67, 0x5f,\n\t0x56, 0x89, 0x5e, 0xb5, 0x6c, 0xaf, 0x03, 0x00,\n\t0x02, 0x00, 0x00, 0x00, 0xc0, 0x37, 0xda, 0x56,\n\t0x90, 0x69, 0x01, 0x2c, 0x96, 0x69, 0x20, 0xfb,\n\t// Entry 140 - 17F\n\t0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x08, 0x16,\n\t0x01, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x06,\n\t0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x09,\n\t0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10,\n\t0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04,\n\t0x08, 0x00, 0x00, 0x04, 0x00, 0x80, 0x28, 0x04,\n\t0x00, 0x00, 0x50, 0xd5, 0x2d, 0x00, 0x64, 0x35,\n\t0x24, 0x52, 0xf4, 0xd4, 0xbd, 0x62, 0xc9, 0x03,\n\t// Entry 180 - 1BF\n\t0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x04, 0x13, 0x39, 0x01, 0xdd, 0x57, 0x98,\n\t0x21, 0x18, 0x81, 0x00, 0x00, 0x01, 0x40, 0x82,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0x80, 0xea,\n\t0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n\t// Entry 1C0 - 1FF\n\t0x00, 0x01, 0x28, 0x05, 0x00, 0x00, 0x00, 0x00,\n\t0x04, 0x20, 0x04, 0xa6, 0x00, 0x04, 0x00, 0x00,\n\t0x81, 0x50, 0x00, 0x00, 0x00, 0x11, 0x84, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x55,\n\t0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x40,\n\t0x30, 0x83, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x1e, 0xcd, 0xbf, 0x7e, 0xbf,\n\t// Entry 200 - 23F\n\t0xdf, 0xc3, 0x83, 0x82, 0xc0, 0xfb, 0x57, 0x27,\n\t0xcd, 0x55, 0xe7, 0x01, 0x00, 0x20, 0xb2, 0xc5,\n\t0xa4, 0x45, 0x25, 0x9b, 0x02, 0xcf, 0xe0, 0xdf,\n\t0x03, 0x44, 0x08, 0x10, 0x01, 0x04, 0x01, 0xe3,\n\t0x92, 0x54, 0xdb, 0x28, 0xd1, 0x5f, 0xf6, 0x6d,\n\t0x79, 0xed, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01,\n\t0x21, 0x12, 0x6c, 0x5f, 0xdd, 0x0e, 0x85, 0x4f,\n\t0x40, 0x40, 0x00, 0x04, 0xf1, 0xfd, 0x3d, 0x54,\n\t// Entry 240 - 27F\n\t0xe8, 0x03, 0xb4, 0x27, 0x23, 0x0d, 0x00, 0x00,\n\t0x20, 0x7b, 0x38, 0x02, 0x05, 0x84, 0x00, 0xf0,\n\t0xbb, 0x7e, 0x5a, 0x00, 0x18, 0x04, 0x81, 0x00,\n\t0x00, 0x00, 0x80, 0x10, 0x90, 0x1c, 0x01, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x04,\n\t0x08, 0xa0, 0x70, 0xa5, 0x0c, 0x40, 0x00, 0x00,\n\t0x11, 0x04, 0x04, 0x68, 0x00, 0x20, 0x70, 0xff,\n\t0x7b, 0x7f, 0x60, 0x00, 0x05, 0x9b, 0xdd, 0x66,\n\t// Entry 280 - 2BF\n\t0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x40, 0x05,\n\t0xb5, 0xb6, 0x80, 0x08, 0x04, 0x00, 0x04, 0x51,\n\t0xe2, 0xef, 0xfd, 0x3f, 0x05, 0x09, 0x08, 0x05,\n\t0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,\n\t0x08, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x60,\n\t0xe5, 0x48, 0x00, 0x81, 0x20, 0xc0, 0x05, 0x80,\n\t0x03, 0x00, 0x00, 0x00, 0xcc, 0x50, 0x40, 0x04,\n\t0x84, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20,\n\t// Entry 2C0 - 2FF\n\t0x02, 0x50, 0x80, 0x11, 0x00, 0x91, 0x6c, 0xe2,\n\t0x50, 0x27, 0x1d, 0x11, 0x29, 0x06, 0x59, 0xe9,\n\t0x33, 0x08, 0x00, 0x20, 0x04, 0x40, 0x10, 0x00,\n\t0x00, 0x00, 0x50, 0x44, 0x92, 0x49, 0xd6, 0x5d,\n\t0xa7, 0x81, 0x47, 0x97, 0xfb, 0x00, 0x10, 0x00,\n\t0x08, 0x00, 0x80, 0x00, 0x40, 0x04, 0x00, 0x01,\n\t0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x08,\n\t0xd8, 0xeb, 0xf6, 0x39, 0xc4, 0x89, 0x12, 0x00,\n\t// Entry 300 - 33F\n\t0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa0,\n\t0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,\n\t0x04, 0x10, 0xd0, 0x9d, 0x95, 0x13, 0x04, 0x80,\n\t0x00, 0x01, 0xd0, 0x12, 0x40, 0x00, 0x10, 0xb0,\n\t0x10, 0x62, 0x4c, 0xd2, 0x02, 0x01, 0x4a, 0x00,\n\t0x46, 0x04, 0x00, 0x08, 0x02, 0x00, 0x20, 0x80,\n\t0x00, 0x80, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00,\n\t0x00, 0xf0, 0xd8, 0x6f, 0x15, 0x02, 0x08, 0x00,\n\t// Entry 340 - 37F\n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01,\n\t0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x84, 0xe3,\n\t0xdd, 0xbf, 0xf9, 0xf9, 0x3b, 0x7f, 0x7f, 0xdb,\n\t0xfd, 0xfc, 0xfe, 0xdf, 0xff, 0xfd, 0xff, 0xf6,\n\t0xfb, 0xfc, 0xf7, 0x1f, 0xff, 0xb3, 0x6c, 0xff,\n\t0xd9, 0xad, 0xdf, 0xfe, 0xef, 0xba, 0xdf, 0xff,\n\t0xff, 0xff, 0xb7, 0xdd, 0x7d, 0xbf, 0xab, 0xff,\n\t0xfd, 0xfd, 0xdf, 0x2f, 0x9c, 0xdf, 0xf3, 0x6f,\n\t// Entry 380 - 3BF\n\t0xdf, 0xdd, 0xff, 0xfb, 0xee, 0xd2, 0xab, 0x5f,\n\t0xd5, 0xdf, 0x7f, 0xff, 0xeb, 0xff, 0xe4, 0x4d,\n\t0xf9, 0xff, 0xfe, 0xf7, 0xfd, 0xdf, 0xfb, 0xbf,\n\t0xee, 0xdb, 0x6f, 0xef, 0xff, 0x7f, 0xff, 0xff,\n\t0xf7, 0x5f, 0xd3, 0x3b, 0xfd, 0xd9, 0xdf, 0xeb,\n\t0xbc, 0x08, 0x05, 0x24, 0xff, 0x07, 0x70, 0xfe,\n\t0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x3d, 0x1b,\n\t0x06, 0xe6, 0x72, 0x60, 0xd1, 0x3c, 0x7f, 0x44,\n\t// Entry 3C0 - 3FF\n\t0x02, 0x30, 0x9f, 0x7a, 0x16, 0xbd, 0x7f, 0x57,\n\t0xf2, 0xff, 0x31, 0xff, 0xf2, 0x1e, 0x90, 0xf7,\n\t0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00,\n\t0x40, 0x54, 0x9f, 0x8a, 0xd9, 0xd9, 0x0e, 0x11,\n\t0x84, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x00, 0x01,\n\t0x05, 0xd1, 0x50, 0x58, 0x00, 0x00, 0x00, 0x10,\n\t0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2,\n\t0xb9, 0xfd, 0xfc, 0xba, 0xfe, 0xef, 0xc7, 0xbe,\n\t// Entry 400 - 43F\n\t0x53, 0x6f, 0xdf, 0xe7, 0xdb, 0x65, 0xbb, 0x7f,\n\t0xfa, 0xff, 0x77, 0xf3, 0xef, 0xbf, 0xfd, 0xf7,\n\t0xdf, 0xdf, 0x9b, 0x7f, 0xff, 0xff, 0x7f, 0x6f,\n\t0xf7, 0xfb, 0xeb, 0xdf, 0xbc, 0xff, 0xbf, 0x6b,\n\t0x7b, 0xfb, 0xff, 0xce, 0x76, 0xbd, 0xf7, 0xf7,\n\t0xdf, 0xdc, 0xf7, 0xf7, 0xff, 0xdf, 0xf3, 0xfe,\n\t0xef, 0xff, 0xff, 0xff, 0xb6, 0x7f, 0x7f, 0xde,\n\t0xf7, 0xb9, 0xeb, 0x77, 0xff, 0xfb, 0xbf, 0xdf,\n\t// Entry 440 - 47F\n\t0xfd, 0xfe, 0xfb, 0xff, 0xfe, 0xeb, 0x1f, 0x7d,\n\t0x2f, 0xfd, 0xb6, 0xb5, 0xa5, 0xfc, 0xff, 0xfd,\n\t0x7f, 0x4e, 0xbf, 0x8e, 0xae, 0xff, 0xee, 0xdf,\n\t0x7f, 0xf7, 0x73, 0x02, 0x02, 0x04, 0xfc, 0xf7,\n\t0xff, 0xb7, 0xd7, 0xef, 0xfe, 0xcd, 0xf5, 0xce,\n\t0xe2, 0x8e, 0xe7, 0xbf, 0xb7, 0xff, 0x56, 0xbd,\n\t0xcd, 0xff, 0xfb, 0xff, 0xdf, 0xd7, 0xea, 0xff,\n\t0xe5, 0x5f, 0x6d, 0x0f, 0xa7, 0x51, 0x04, 0x44,\n\t// Entry 480 - 4BF\n\t0x13, 0x50, 0x5d, 0xaf, 0xa6, 0xfd, 0x99, 0xfb,\n\t0x63, 0x1d, 0x53, 0xff, 0xef, 0xb7, 0x35, 0x20,\n\t0x14, 0x00, 0x55, 0x51, 0x82, 0x65, 0xf5, 0x41,\n\t0xe2, 0xff, 0xfc, 0xdf, 0x00, 0x05, 0xc5, 0x05,\n\t0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x04,\n\t0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x51, 0x20, 0x05, 0x04, 0x01, 0x00, 0x00,\n\t0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xb1,\n\t// Entry 4C0 - 4FF\n\t0xfd, 0x47, 0x49, 0x06, 0x95, 0x06, 0x57, 0xed,\n\t0xfb, 0x4c, 0x1c, 0x6b, 0x83, 0x04, 0x62, 0x40,\n\t0x00, 0x11, 0x42, 0x00, 0x00, 0x00, 0x54, 0x83,\n\t0xb8, 0x4f, 0x10, 0x8c, 0x89, 0x46, 0xde, 0xf7,\n\t0x13, 0x31, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00,\n\t0x01, 0x00, 0x00, 0xf0, 0x5b, 0xf4, 0xbe, 0x3d,\n\t0xba, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41,\n\t// Entry 500 - 53F\n\t0x30, 0xff, 0x79, 0x72, 0x04, 0x00, 0x00, 0x49,\n\t0x2d, 0x14, 0x27, 0x57, 0xed, 0xf1, 0x3f, 0xe7,\n\t0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xf8,\n\t0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xe5, 0xf7,\n\t0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7e, 0x10,\n\t0x01, 0x01, 0x84, 0x6d, 0xff, 0xf7, 0xdd, 0xf9,\n\t0x5b, 0x05, 0x86, 0xed, 0xf5, 0x77, 0xbd, 0x3c,\n\t0x00, 0x00, 0x00, 0x42, 0x71, 0x42, 0x00, 0x40,\n\t// Entry 540 - 57F\n\t0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00,\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t// Entry 580 - 5BF\n\t0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n\t0xff, 0xab, 0xbd, 0xe7, 0x57, 0xee, 0x13, 0x5d,\n\t0x09, 0xc1, 0x40, 0x21, 0xfa, 0x17, 0x01, 0x80,\n\t0x00, 0x00, 0x00, 0x00, 0xf0, 0xce, 0xfb, 0xbf,\n\t0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,\n\t0x00, 0x30, 0x15, 0xa3, 0x10, 0x00, 0x00, 0x00,\n\t0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x00, 0x81,\n\t0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40,\n\t// Entry 5C0 - 5FF\n\t0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x3e, 0x02,\n\t0xaa, 0x10, 0x5d, 0x98, 0x52, 0x00, 0x80, 0x20,\n\t0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x02,\n\t0x19, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d,\n\t0x31, 0x00, 0x00, 0x00, 0x01, 0x10, 0x02, 0x20,\n\t0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00,\n\t0x00, 0x1f, 0xdf, 0xf2, 0xb9, 0xff, 0xfd, 0x3f,\n\t0x1f, 0x18, 0xcf, 0x9c, 0xbf, 0xaf, 0x5f, 0xfe,\n\t// Entry 600 - 63F\n\t0x7b, 0x4b, 0x40, 0x10, 0xe1, 0xfd, 0xaf, 0xd9,\n\t0xb7, 0xf6, 0xfb, 0xb3, 0xc7, 0xff, 0x6f, 0xf1,\n\t0x73, 0xb1, 0x7f, 0x9f, 0x7f, 0xbd, 0xfc, 0xb7,\n\t0xee, 0x1c, 0xfa, 0xcb, 0xef, 0xdd, 0xf9, 0xbd,\n\t0x6e, 0xae, 0x55, 0xfd, 0x6e, 0x81, 0x76, 0x1f,\n\t0xd4, 0x77, 0xf5, 0x7d, 0xfb, 0xff, 0xeb, 0xfe,\n\t0xbe, 0x5f, 0x46, 0x1b, 0xe9, 0x5f, 0x50, 0x18,\n\t0x02, 0xfa, 0xf7, 0x9d, 0x15, 0x97, 0x05, 0x0f,\n\t// Entry 640 - 67F\n\t0x75, 0xc4, 0x7d, 0x81, 0x82, 0xf1, 0x57, 0x6c,\n\t0xff, 0xe4, 0xef, 0x6f, 0xff, 0xfc, 0xdd, 0xde,\n\t0xfc, 0xfd, 0x76, 0x5f, 0x7a, 0x1f, 0x00, 0x98,\n\t0x02, 0xfb, 0xa3, 0xef, 0xf3, 0xd6, 0xf2, 0xff,\n\t0xb9, 0xda, 0x7d, 0x50, 0x1e, 0x15, 0x7b, 0xb4,\n\t0xf5, 0x3e, 0xff, 0xff, 0xf1, 0xf7, 0xff, 0xe7,\n\t0x5f, 0xff, 0xff, 0x9e, 0xdb, 0xf6, 0xd7, 0xb9,\n\t0xef, 0x27, 0x80, 0xbb, 0xc5, 0xff, 0xff, 0xe3,\n\t// Entry 680 - 6BF\n\t0x97, 0x9d, 0xbf, 0x9f, 0xf7, 0xc7, 0xfd, 0x37,\n\t0xce, 0x7f, 0x04, 0x1d, 0x53, 0x7f, 0xf8, 0xda,\n\t0x5d, 0xce, 0x7d, 0x06, 0xb9, 0xea, 0x69, 0xa0,\n\t0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x08,\n\t0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00,\n\t0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06,\n\t0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00,\n\t0x04, 0x00, 0x10, 0x8c, 0x58, 0xd5, 0x0d, 0x0f,\n\t// Entry 6C0 - 6FF\n\t0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd1, 0x42, 0x08,\n\t0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00,\n\t0x00, 0xdc, 0xfb, 0xcb, 0x0e, 0x58, 0x08, 0x41,\n\t0x04, 0x20, 0x04, 0x00, 0x30, 0x12, 0x40, 0x00,\n\t0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x01, 0x00, 0x00, 0x00, 0x80, 0x10, 0x10, 0xab,\n\t0x6d, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00,\n\t// Entry 700 - 73F\n\t0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,\n\t0x80, 0x86, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01,\n\t0xdf, 0x18, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0x79,\n\t0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,\n\t0x03, 0x00, 0x09, 0x20, 0x00, 0x00, 0x01, 0x00,\n\t0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 740 - 77F\n\t0x00, 0x00, 0x00, 0xef, 0xd5, 0xfd, 0xcf, 0x7e,\n\t0xa0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x44,\n\t0xcd, 0xf9, 0x5c, 0x00, 0x01, 0x00, 0x30, 0x04,\n\t0x04, 0x55, 0x00, 0x01, 0x04, 0xf4, 0x3f, 0x4a,\n\t0x01, 0x00, 0x00, 0xb0, 0x80, 0x00, 0x55, 0x55,\n\t0x97, 0x7c, 0x9f, 0x31, 0xcc, 0x68, 0xd1, 0x03,\n\t0xd5, 0x57, 0x27, 0x14, 0x01, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x2c, 0xf7, 0xcb, 0x1f, 0x14, 0x60,\n\t// Entry 780 - 7BF\n\t0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01,\n\t0x00, 0x00, 0x20, 0x00, 0x24, 0x44, 0x00, 0x00,\n\t0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0,\n\t0xf5, 0xff, 0xd5, 0x97, 0xbc, 0x70, 0xd6, 0x78,\n\t0x78, 0x15, 0x50, 0x00, 0xa4, 0x84, 0xa9, 0x41,\n\t0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00,\n\t0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02,\n\t0xff, 0xef, 0xff, 0x4b, 0x85, 0x53, 0xf4, 0xed,\n\t// Entry 7C0 - 7FF\n\t0xdd, 0xbf, 0x72, 0x19, 0xc7, 0x0c, 0xd5, 0x42,\n\t0x54, 0xdd, 0x77, 0x14, 0x00, 0x80, 0x40, 0x56,\n\t0xcc, 0x16, 0x9e, 0xea, 0x35, 0x7d, 0xef, 0xff,\n\t0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x4d,\n\t0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80,\n\t0x10, 0x20, 0x24, 0x00, 0xff, 0x2f, 0xd3, 0x60,\n\t0xfe, 0x01, 0x02, 0x88, 0x0a, 0x40, 0x16, 0x01,\n\t0x01, 0x15, 0x2b, 0x3c, 0x01, 0x00, 0x00, 0x10,\n\t// Entry 800 - 83F\n\t0x90, 0x49, 0x41, 0x02, 0x02, 0x01, 0xe1, 0xbf,\n\t0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0xd1,\n\t0x40, 0x9c, 0x44, 0xdf, 0xf5, 0x8f, 0x66, 0xb3,\n\t0x55, 0x20, 0xd4, 0xc1, 0xd8, 0x30, 0x3d, 0x80,\n\t0x00, 0x00, 0x00, 0x04, 0xd4, 0x11, 0xc5, 0x84,\n\t0x2e, 0x50, 0x00, 0x22, 0x50, 0x6e, 0xbd, 0x93,\n\t0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10,\n\t0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00,\n\t// Entry 840 - 87F\n\t0xf0, 0xfb, 0xfd, 0x3f, 0x05, 0x00, 0x12, 0x81,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02,\n\t0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28,\n\t0x84, 0x00, 0x23, 0xc0, 0x23, 0x24, 0x00, 0x00,\n\t0x00, 0xcb, 0xe4, 0x3a, 0x42, 0x88, 0x14, 0xf1,\n\t0xef, 0xff, 0x7f, 0x12, 0x01, 0x01, 0x84, 0x50,\n\t0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40,\n\t0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1,\n\t// Entry 880 - 8BF\n\t0x76, 0x16, 0x08, 0x03, 0x10, 0x00, 0x00, 0x00,\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x24,\n\t0x0a, 0x00, 0x80, 0x00, 0x00,\n}\n\n// altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives\n// to 2-letter language codes that cannot be derived using the method described above.\n// Each 3-letter code is followed by its 1-byte langID.\nconst altLangISO3 tag.Index = \"---\\x00cor\\x00hbs\\x01heb\\x02kin\\x03spa\\x04yid\\x05\\xff\\xff\\xff\\xff\"\n\n// altLangIndex is used to convert indexes in altLangISO3 to langIDs.\n// Size: 12 bytes, 6 elements\nvar altLangIndex = [6]uint16{\n\t0x0278, 0x03fd, 0x01f3, 0x03dc, 0x0139, 0x0200,\n}\n\n// langAliasMap maps langIDs to their suggested replacements.\n// Size: 644 bytes, 161 elements\nvar langAliasMap = [161]fromTo{\n\t0:   {from: 0x81, to: 0x87},\n\t1:   {from: 0x181, to: 0x1a7},\n\t2:   {from: 0x1eb, to: 0x1da},\n\t3:   {from: 0x1f3, to: 0x1b5},\n\t4:   {from: 0x200, to: 0x508},\n\t5:   {from: 0x207, to: 0x206},\n\t6:   {from: 0x307, to: 0x3d3},\n\t7:   {from: 0x33e, to: 0x366},\n\t8:   {from: 0x3fd, to: 0x428},\n\t9:   {from: 0x470, to: 0x14e},\n\t10:  {from: 0x486, to: 0x447},\n\t11:  {from: 0x498, to: 0x20},\n\t12:  {from: 0x533, to: 0x539},\n\t13:  {from: 0x584, to: 0x129},\n\t14:  {from: 0x625, to: 0x1ea6},\n\t15:  {from: 0x646, to: 0x427},\n\t16:  {from: 0x657, to: 0x427},\n\t17:  {from: 0x6e2, to: 0x39},\n\t18:  {from: 0x6ed, to: 0x1d0},\n\t19:  {from: 0x733, to: 0x2196},\n\t20:  {from: 0x7a8, to: 0x55},\n\t21:  {from: 0x7ae, to: 0x2990},\n\t22:  {from: 0x7ba, to: 0x57},\n\t23:  {from: 0x7db, to: 0x140},\n\t24:  {from: 0x801, to: 0x59},\n\t25:  {from: 0x80a, to: 0x8c},\n\t26:  {from: 0x873, to: 0x805},\n\t27:  {from: 0x8b8, to: 0xed8},\n\t28:  {from: 0x9e4, to: 0x328},\n\t29:  {from: 0xa2b, to: 0x2bc},\n\t30:  {from: 0xa32, to: 0xbd},\n\t31:  {from: 0xab3, to: 0x3317},\n\t32:  {from: 0xb2d, to: 0x51f},\n\t33:  {from: 0xb6a, to: 0x264f},\n\t34:  {from: 0xb73, to: 0xbb8},\n\t35:  {from: 0xb90, to: 0x444},\n\t36:  {from: 0xbb1, to: 0x421e},\n\t37:  {from: 0xbb4, to: 0x51f},\n\t38:  {from: 0xbf3, to: 0x2d9c},\n\t39:  {from: 0xc23, to: 0x3176},\n\t40:  {from: 0xcae, to: 0xf0},\n\t41:  {from: 0xcfd, to: 0xf6},\n\t42:  {from: 0xdbd, to: 0x116},\n\t43:  {from: 0xdcc, to: 0x324},\n\t44:  {from: 0xded, to: 0xdf0},\n\t45:  {from: 0xdf3, to: 0x526},\n\t46:  {from: 0xed4, to: 0x204f},\n\t47:  {from: 0xee3, to: 0x2e8f},\n\t48:  {from: 0xf2e, to: 0x35e},\n\t49:  {from: 0x10c5, to: 0x13b},\n\t50:  {from: 0x10f9, to: 0x2c7},\n\t51:  {from: 0x1195, to: 0x1e4},\n\t52:  {from: 0x126e, to: 0x20},\n\t53:  {from: 0x1419, to: 0x159},\n\t54:  {from: 0x1465, to: 0x149},\n\t55:  {from: 0x1514, to: 0xd90},\n\t56:  {from: 0x1518, to: 0x387},\n\t57:  {from: 0x1527, to: 0x16ba},\n\t58:  {from: 0x1575, to: 0x208},\n\t59:  {from: 0x1578, to: 0x109},\n\t60:  {from: 0x1598, to: 0x3ca4},\n\t61:  {from: 0x165f, to: 0x195},\n\t62:  {from: 0x16bd, to: 0x131},\n\t63:  {from: 0x16f5, to: 0x29ed},\n\t64:  {from: 0x170d, to: 0x18e},\n\t65:  {from: 0x171c, to: 0xf34},\n\t66:  {from: 0x176f, to: 0x1519},\n\t67:  {from: 0x17fe, to: 0x17ab},\n\t68:  {from: 0x180b, to: 0x18e8},\n\t69:  {from: 0x187f, to: 0x42c},\n\t70:  {from: 0x196e, to: 0x1cf6},\n\t71:  {from: 0x1a69, to: 0x2ba5},\n\t72:  {from: 0x1a7f, to: 0x1f0},\n\t73:  {from: 0x1b4f, to: 0x1f2},\n\t74:  {from: 0x1b7b, to: 0x150a},\n\t75:  {from: 0x202d, to: 0x37a6},\n\t76:  {from: 0x2032, to: 0x20d2},\n\t77:  {from: 0x204f, to: 0x302},\n\t78:  {from: 0x20d8, to: 0x26b},\n\t79:  {from: 0x20e3, to: 0x25a},\n\t80:  {from: 0x20e7, to: 0x225},\n\t81:  {from: 0x20ee, to: 0x24d},\n\t82:  {from: 0x2104, to: 0x21e0},\n\t83:  {from: 0x212a, to: 0x274},\n\t84:  {from: 0x218e, to: 0x11d},\n\t85:  {from: 0x21c3, to: 0x1556},\n\t86:  {from: 0x21db, to: 0x4fa},\n\t87:  {from: 0x21e9, to: 0x495},\n\t88:  {from: 0x2222, to: 0x11d},\n\t89:  {from: 0x222c, to: 0x11d},\n\t90:  {from: 0x2257, to: 0x91f},\n\t91:  {from: 0x230b, to: 0x321b},\n\t92:  {from: 0x2377, to: 0x335a},\n\t93:  {from: 0x2467, to: 0x2be},\n\t94:  {from: 0x24d9, to: 0x2f6},\n\t95:  {from: 0x24e5, to: 0x2f1},\n\t96:  {from: 0x24ef, to: 0x316},\n\t97:  {from: 0x2545, to: 0xb50},\n\t98:  {from: 0x259e, to: 0xe0},\n\t99:  {from: 0x2633, to: 0x2c7},\n\t100: {from: 0x26be, to: 0x26a9},\n\t101: {from: 0x26ee, to: 0x3bf},\n\t102: {from: 0x271c, to: 0x3ca4},\n\t103: {from: 0x275a, to: 0x26a9},\n\t104: {from: 0x277e, to: 0x434d},\n\t105: {from: 0x28e4, to: 0x282c},\n\t106: {from: 0x2909, to: 0x348},\n\t107: {from: 0x297b, to: 0x2d9c},\n\t108: {from: 0x2b0f, to: 0x384},\n\t109: {from: 0x2bf1, to: 0x38c},\n\t110: {from: 0x2c34, to: 0x3ca4},\n\t111: {from: 0x2cf1, to: 0x3b5},\n\t112: {from: 0x2d08, to: 0x58c},\n\t113: {from: 0x2d3c, to: 0x143},\n\t114: {from: 0x2d3d, to: 0x143},\n\t115: {from: 0x2df4, to: 0x2e8},\n\t116: {from: 0x2dfd, to: 0x19c1},\n\t117: {from: 0x2e0f, to: 0x2d8a},\n\t118: {from: 0x2e16, to: 0x289},\n\t119: {from: 0x2e49, to: 0x7c},\n\t120: {from: 0x2e5a, to: 0x2277},\n\t121: {from: 0x2e95, to: 0x2e90},\n\t122: {from: 0x2ee4, to: 0x2ecc},\n\t123: {from: 0x3188, to: 0x3bb},\n\t124: {from: 0x335b, to: 0x3383},\n\t125: {from: 0x341f, to: 0x3d3},\n\t126: {from: 0x34e3, to: 0x18c5},\n\t127: {from: 0x35db, to: 0x408},\n\t128: {from: 0x364d, to: 0x23e},\n\t129: {from: 0x366b, to: 0x3ea},\n\t130: {from: 0x36f2, to: 0x43b},\n\t131: {from: 0x37b5, to: 0x11d},\n\t132: {from: 0x380b, to: 0x38e7},\n\t133: {from: 0x3820, to: 0x2c90},\n\t134: {from: 0x3824, to: 0xa7},\n\t135: {from: 0x3827, to: 0x321d},\n\t136: {from: 0x3861, to: 0x399b},\n\t137: {from: 0x3887, to: 0x3fb5},\n\t138: {from: 0x389a, to: 0x39cc},\n\t139: {from: 0x38a9, to: 0x1f99},\n\t140: {from: 0x38aa, to: 0x2e8f},\n\t141: {from: 0x3951, to: 0x474},\n\t142: {from: 0x3b43, to: 0xd86},\n\t143: {from: 0x3b6d, to: 0x132},\n\t144: {from: 0x3c8e, to: 0x4b2},\n\t145: {from: 0x3fb2, to: 0xfc},\n\t146: {from: 0x41fd, to: 0xa86},\n\t147: {from: 0x42b3, to: 0x568},\n\t148: {from: 0x42ee, to: 0x3f55},\n\t149: {from: 0x436d, to: 0x251},\n\t150: {from: 0x43c0, to: 0x36c0},\n\t151: {from: 0x43c2, to: 0x10b},\n\t152: {from: 0x44a4, to: 0x3317},\n\t153: {from: 0x44d8, to: 0x508},\n\t154: {from: 0x45bf, to: 0x23fe},\n\t155: {from: 0x45d2, to: 0x26d1},\n\t156: {from: 0x4605, to: 0x48a3},\n\t157: {from: 0x46a3, to: 0x4695},\n\t158: {from: 0x4733, to: 0x473a},\n\t159: {from: 0x490b, to: 0x316},\n\t160: {from: 0x499c, to: 0x519},\n}\n\n// Size: 161 bytes, 161 elements\nvar langAliasTypes = [161]langAliasType{\n\t// Entry 0 - 3F\n\t1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2,\n\t1, 1, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 0,\n\t2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, 1, 0, 0,\n\t2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 0, 1, 2, 0,\n\t// Entry 40 - 7F\n\t1, 0, 1, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1,\n\t1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 2,\n\t2, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1,\n\t0, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2,\n\t// Entry 80 - BF\n\t1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0,\n\t1, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1,\n\t1,\n}\n\nconst (\n\t_Latn = 82\n\t_Hani = 50\n\t_Hans = 52\n\t_Hant = 53\n\t_Qaaa = 131\n\t_Qaai = 139\n\t_Qabx = 180\n\t_Zinh = 224\n\t_Zyyy = 229\n\t_Zzzz = 230\n)\n\n// script is an alphabetically sorted list of ISO 15924 codes. The index\n// of the script in the string, divided by 4, is the internal scriptID.\nconst script tag.Index = \"\" + // Size: 928 bytes\n\t\"----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo\" +\n\t\"BrahBraiBugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgyd\" +\n\t\"EgyhEgypElbaEthiGeokGeorGlagGothGranGrekGujrGuruHanbHangHaniHanoHansHant\" +\n\t\"HatrHebrHiraHluwHmngHrktHungIndsItalJamoJavaJpanJurcKaliKanaKharKhmrKhoj\" +\n\t\"KitlKitsKndaKoreKpelKthiLanaLaooLatfLatgLatnLekeLepcLimbLinaLinbLisuLoma\" +\n\t\"LyciLydiMahjMandManiMarcMayaMendMercMeroMlymModiMongMoonMrooMteiMultMymr\" +\n\t\"NarbNbatNewaNkgbNkooNshuOgamOlckOrkhOryaOsgeOsmaPalmPaucPermPhagPhliPhlp\" +\n\t\"PhlvPhnxPiqdPlrdPrtiQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaam\" +\n\t\"QaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabe\" +\n\t\"QabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabw\" +\n\t\"QabxRjngRoroRunrSamrSaraSarbSaurSgnwShawShrdSiddSindSinhSoraSundSyloSyrc\" +\n\t\"SyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglgThaaThaiTibtTirh\" +\n\t\"UgarVaiiVispWaraWoleXpeoXsuxYiiiZinhZmthZsyeZsymZxxxZyyyZzzz\\xff\\xff\\xff\" +\n\t\"\\xff\"\n\n// suppressScript is an index from langID to the dominant script for that language,\n// if it exists.  If a script is given, it should be suppressed from the language tag.\n// Size: 1319 bytes, 1319 elements\nvar suppressScript = [1319]uint8{\n\t// Entry 0 - 3F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 40 - 7F\n\t0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,\n\t// Entry 80 - BF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry C0 - FF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00,\n\t// Entry 100 - 13F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00,\n\t0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x2d, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52,\n\t0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 140 - 17F\n\t0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x52, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 180 - 1BF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x52, 0x2e, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x20,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 1C0 - 1FF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x52, 0x52, 0x00, 0x52, 0x52, 0x00,\n\t0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x52, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00,\n\t0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 200 - 23F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t// Entry 240 - 27F\n\t0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x4a, 0x00, 0x4b, 0x00, 0x20, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 280 - 2BF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x4f,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t// Entry 2C0 - 2FF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,\n\t0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 300 - 33F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x52, 0x52,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t// Entry 340 - 37F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52,\n\t0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x70, 0x52, 0x00, 0x00,\n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t// Entry 380 - 3BF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,\n\t0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x52,\n\t0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 3C0 - 3FF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 400 - 43F\n\t0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,\n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 440 - 47F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0,\n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0xd5, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00,\n\t0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,\n\t// Entry 480 - 4BF\n\t0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,\n\t0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 4C0 - 4FF\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t// Entry 500 - 53F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00,\n}\n\nconst (\n\t_001 = 1\n\t_419 = 30\n\t_BR  = 64\n\t_CA  = 72\n\t_ES  = 109\n\t_GB  = 122\n\t_MD  = 187\n\t_PT  = 237\n\t_UK  = 305\n\t_US  = 308\n\t_ZZ  = 356\n\t_XA  = 322\n\t_XC  = 324\n\t_XK  = 332\n)\n\n// isoRegionOffset needs to be added to the index of regionISO to obtain the regionID\n// for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for\n// the UN.M49 codes used for groups.)\nconst isoRegionOffset = 31\n\n// regionTypes defines the status of a region for various standards.\n// Size: 357 bytes, 357 elements\nvar regionTypes = [357]uint8{\n\t// Entry 0 - 3F\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t// Entry 40 - 7F\n\t0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x00,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06,\n\t0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06,\n\t0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t// Entry 80 - BF\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t// Entry C0 - FF\n\t0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06,\n\t0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06,\n\t0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06,\n\t0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05,\n\t0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,\n\t// Entry 100 - 13F\n\t0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x02, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06,\n\t0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n\t// Entry 140 - 17F\n\t0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,\n\t0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,\n\t0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,\n\t0x05, 0x05, 0x05, 0x05, 0x04, 0x06, 0x06, 0x04,\n\t0x06, 0x06, 0x04, 0x06, 0x05,\n}\n\n// regionISO holds a list of alphabetically sorted 2-letter ISO region codes.\n// Each 2-letter codes is followed by two bytes with the following meaning:\n//     - [A-Z}{2}: the first letter of the 2-letter code plus these two\n//                 letters form the 3-letter ISO code.\n//     - 0, n:     index into altRegionISO3.\nconst regionISO tag.Index = \"\" + // Size: 1308 bytes\n\t\"AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA\" +\n\t\"AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN\" +\n\t\"BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT\" +\n\t\"CRRICS\\x00\\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY\" +\n\t\"HYDZZAEA  ECCUEESTEGGYEHSHERRIESSPETTHEU\\x00\\x03EZ  FIINFJJIFKLKFMSMFORO\" +\n\t\"FQ\\x00\\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGR\" +\n\t\"RCGS\\x00\\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC  IDDNIERLILSR\" +\n\t\"IMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\\x00\" +\n\t\"\\x09KNNAKP\\x00\\x0cKRORKWWTKY\\x00\\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTU\" +\n\t\"LUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQ\" +\n\t\"MRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOOR\" +\n\t\"NPPLNQ\\x00\\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\\x00\" +\n\t\"\\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTT\" +\n\t\"QU\\x00\\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\\x00\\x15RUUSRWWASAAUSBLBSCYC\" +\n\t\"SDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYR\" +\n\t\"SZWZTAAATCCATDCDTF\\x00\\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTV\" +\n\t\"UVTWWNTZZAUAKRUGGAUK  UMMIUN  USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVU\" +\n\t\"UTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXO\" +\n\t\"OOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\\x00\\x1bYUUGZAAF\" +\n\t\"ZMMBZRARZWWEZZZZ\\xff\\xff\\xff\\xff\"\n\n// altRegionISO3 holds a list of 3-letter region codes that cannot be\n// mapped to 2-letter codes using the default algorithm. This is a short list.\nconst altRegionISO3 string = \"SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN\"\n\n// altRegionIDs holds a list of regionIDs the positions of which match those\n// of the 3-letter ISO codes in altRegionISO3.\n// Size: 22 bytes, 11 elements\nvar altRegionIDs = [11]uint16{\n\t0x0056, 0x006f, 0x0087, 0x00a7, 0x00a9, 0x00ac, 0x00e9, 0x0104,\n\t0x0120, 0x015e, 0x00db,\n}\n\n// Size: 80 bytes, 20 elements\nvar regionOldMap = [20]fromTo{\n\t0:  {from: 0x43, to: 0xc3},\n\t1:  {from: 0x57, to: 0xa6},\n\t2:  {from: 0x5e, to: 0x5f},\n\t3:  {from: 0x65, to: 0x3a},\n\t4:  {from: 0x78, to: 0x77},\n\t5:  {from: 0x92, to: 0x36},\n\t6:  {from: 0xa2, to: 0x132},\n\t7:  {from: 0xc0, to: 0x132},\n\t8:  {from: 0xd6, to: 0x13e},\n\t9:  {from: 0xdb, to: 0x2a},\n\t10: {from: 0xee, to: 0x132},\n\t11: {from: 0xf1, to: 0xe1},\n\t12: {from: 0xfb, to: 0x6f},\n\t13: {from: 0x102, to: 0x163},\n\t14: {from: 0x129, to: 0x125},\n\t15: {from: 0x131, to: 0x7a},\n\t16: {from: 0x139, to: 0x13d},\n\t17: {from: 0x140, to: 0x132},\n\t18: {from: 0x15c, to: 0x15d},\n\t19: {from: 0x162, to: 0x4a},\n}\n\n// m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are\n// codes indicating collections of regions.\n// Size: 714 bytes, 357 elements\nvar m49 = [357]int16{\n\t// Entry 0 - 3F\n\t0, 1, 2, 3, 5, 9, 11, 13,\n\t14, 15, 17, 18, 19, 21, 29, 30,\n\t34, 35, 39, 53, 54, 57, 61, 142,\n\t143, 145, 150, 151, 154, 155, 419, 958,\n\t0, 20, 784, 4, 28, 660, 8, 51,\n\t530, 24, 10, 32, 16, 40, 36, 533,\n\t248, 31, 70, 52, 50, 56, 854, 100,\n\t48, 108, 204, 652, 60, 96, 68, 535,\n\t// Entry 40 - 7F\n\t76, 44, 64, 104, 74, 72, 112, 84,\n\t124, 166, 180, 140, 178, 756, 384, 184,\n\t152, 120, 156, 170, 0, 188, 891, 296,\n\t192, 132, 531, 162, 196, 203, 278, 276,\n\t0, 262, 208, 212, 214, 204, 12, 0,\n\t218, 233, 818, 732, 232, 724, 231, 967,\n\t0, 246, 242, 238, 583, 234, 0, 250,\n\t249, 266, 826, 308, 268, 254, 831, 288,\n\t// Entry 80 - BF\n\t292, 304, 270, 324, 312, 226, 300, 239,\n\t320, 316, 624, 328, 344, 334, 340, 191,\n\t332, 348, 854, 0, 360, 372, 376, 833,\n\t356, 86, 368, 364, 352, 380, 832, 388,\n\t400, 392, 581, 404, 417, 116, 296, 174,\n\t659, 408, 410, 414, 136, 398, 418, 422,\n\t662, 438, 144, 430, 426, 440, 442, 428,\n\t434, 504, 492, 498, 499, 663, 450, 584,\n\t// Entry C0 - FF\n\t581, 807, 466, 104, 496, 446, 580, 474,\n\t478, 500, 470, 480, 462, 454, 484, 458,\n\t508, 516, 540, 562, 574, 566, 548, 558,\n\t528, 578, 524, 10, 520, 536, 570, 554,\n\t512, 591, 0, 604, 258, 598, 608, 586,\n\t616, 666, 612, 630, 275, 620, 581, 585,\n\t600, 591, 634, 959, 960, 961, 962, 963,\n\t964, 965, 966, 967, 968, 969, 970, 971,\n\t// Entry 100 - 13F\n\t972, 638, 716, 642, 688, 643, 646, 682,\n\t90, 690, 729, 752, 702, 654, 705, 744,\n\t703, 694, 674, 686, 706, 740, 728, 678,\n\t810, 222, 534, 760, 748, 0, 796, 148,\n\t260, 768, 764, 762, 772, 626, 795, 788,\n\t776, 626, 792, 780, 798, 158, 834, 804,\n\t800, 826, 581, 0, 840, 858, 860, 336,\n\t670, 704, 862, 92, 850, 704, 548, 876,\n\t// Entry 140 - 17F\n\t581, 882, 973, 974, 975, 976, 977, 978,\n\t979, 980, 981, 982, 983, 984, 985, 986,\n\t987, 988, 989, 990, 991, 992, 993, 994,\n\t995, 996, 997, 998, 720, 887, 175, 891,\n\t710, 894, 180, 716, 999,\n}\n\n// m49Index gives indexes into fromM49 based on the three most significant bits\n// of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in\n//    fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]]\n// for an entry where the first 7 bits match the 7 lsb of the UN.M49 code.\n// The region code is stored in the 9 lsb of the indexed value.\n// Size: 18 bytes, 9 elements\nvar m49Index = [9]int16{\n\t0, 59, 107, 142, 180, 219, 258, 290,\n\t332,\n}\n\n// fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details.\n// Size: 664 bytes, 332 elements\nvar fromM49 = [332]uint16{\n\t// Entry 0 - 3F\n\t0x0201, 0x0402, 0x0603, 0x0823, 0x0a04, 0x1026, 0x1205, 0x142a,\n\t0x1606, 0x1866, 0x1a07, 0x1c08, 0x1e09, 0x202c, 0x220a, 0x240b,\n\t0x260c, 0x2821, 0x2a0d, 0x3029, 0x3824, 0x3a0e, 0x3c0f, 0x3e31,\n\t0x402b, 0x4410, 0x4611, 0x482e, 0x4e12, 0x502d, 0x5841, 0x6038,\n\t0x6434, 0x6627, 0x6833, 0x6a13, 0x6c14, 0x7035, 0x7215, 0x783c,\n\t0x7a16, 0x8042, 0x883e, 0x8c32, 0x9045, 0x9444, 0x9840, 0xa847,\n\t0xac99, 0xb508, 0xb93b, 0xc03d, 0xc837, 0xd0c3, 0xd839, 0xe046,\n\t0xe8a5, 0xf051, 0xf848, 0x0859, 0x10ac, 0x184b, 0x1c17, 0x1e18,\n\t// Entry 40 - 7F\n\t0x20b2, 0x2219, 0x291f, 0x2c1a, 0x2e1b, 0x3050, 0x341c, 0x361d,\n\t0x3852, 0x3d2d, 0x445b, 0x4c49, 0x5453, 0x5ca7, 0x5f5e, 0x644c,\n\t0x684a, 0x704f, 0x7855, 0x7e8f, 0x8058, 0x885c, 0x965d, 0x983a,\n\t0xa062, 0xa863, 0xac64, 0xb468, 0xbd19, 0xc485, 0xcc6e, 0xce6e,\n\t0xd06c, 0xd269, 0xd475, 0xdc73, 0xde87, 0xe472, 0xec71, 0xf030,\n\t0xf278, 0xf477, 0xfc7d, 0x04e4, 0x0920, 0x0c61, 0x1479, 0x187c,\n\t0x1c82, 0x26ec, 0x285f, 0x2c5e, 0x305f, 0x407f, 0x4880, 0x50a6,\n\t0x5886, 0x6081, 0x687b, 0x7084, 0x7889, 0x8088, 0x8883, 0x908b,\n\t// Entry 80 - BF\n\t0x9890, 0x9c8d, 0xa137, 0xa88e, 0xb08c, 0xb891, 0xc09c, 0xc898,\n\t0xd094, 0xd89b, 0xe09a, 0xe895, 0xf096, 0xf89d, 0x004e, 0x089f,\n\t0x10a1, 0x1cad, 0x20a0, 0x28a3, 0x30a9, 0x34aa, 0x3cab, 0x42a4,\n\t0x44ae, 0x461e, 0x4caf, 0x54b4, 0x58b7, 0x5cb3, 0x64b8, 0x6cb1,\n\t0x70b5, 0x74b6, 0x7cc5, 0x84be, 0x8ccd, 0x94cf, 0x9ccc, 0xa4c2,\n\t0xacca, 0xb4c7, 0xbcc8, 0xc0cb, 0xc8ce, 0xd8ba, 0xe0c4, 0xe4bb,\n\t0xe6bc, 0xe8c9, 0xf0b9, 0xf8d0, 0x00e0, 0x08d1, 0x10dc, 0x18da,\n\t0x20d8, 0x2428, 0x265a, 0x2a2f, 0x2d1a, 0x2e3f, 0x30dd, 0x38d2,\n\t// Entry C0 - FF\n\t0x493e, 0x54df, 0x5cd7, 0x64d3, 0x6cd5, 0x74de, 0x7cd4, 0x84d9,\n\t0x88c6, 0x8b32, 0x8e74, 0x90bf, 0x92ef, 0x94e7, 0x9ee1, 0xace5,\n\t0xb0f0, 0xb8e3, 0xc0e6, 0xc8ea, 0xd0e8, 0xd8ed, 0xe08a, 0xe525,\n\t0xeceb, 0xf4f2, 0xfd01, 0x0503, 0x0705, 0x0d06, 0x183b, 0x1d0d,\n\t0x26a8, 0x2825, 0x2cb0, 0x2ebd, 0x34e9, 0x3d38, 0x4512, 0x4d17,\n\t0x5507, 0x5d13, 0x6104, 0x6509, 0x6d11, 0x7d0c, 0x7f10, 0x813d,\n\t0x830e, 0x8514, 0x8d60, 0x9963, 0xa15c, 0xa86d, 0xb116, 0xb30a,\n\t0xb86b, 0xc10a, 0xc915, 0xd10f, 0xd91c, 0xe10b, 0xe84d, 0xf11b,\n\t// Entry 100 - 13F\n\t0xf523, 0xf922, 0x0121, 0x0924, 0x1128, 0x192b, 0x2022, 0x2927,\n\t0x312a, 0x3726, 0x391e, 0x3d2c, 0x4130, 0x492f, 0x4ec1, 0x5518,\n\t0x646a, 0x747a, 0x7e7e, 0x809e, 0x8297, 0x852e, 0x9134, 0xa53c,\n\t0xac36, 0xb535, 0xb936, 0xbd3a, 0xd93f, 0xe541, 0xed5d, 0xef5d,\n\t0xf656, 0xfd61, 0x7c1f, 0x7ef3, 0x80f4, 0x82f5, 0x84f6, 0x86f7,\n\t0x88f8, 0x8af9, 0x8cfa, 0x8e6f, 0x90fc, 0x92fd, 0x94fe, 0x96ff,\n\t0x9900, 0x9b42, 0x9d43, 0x9f44, 0xa145, 0xa346, 0xa547, 0xa748,\n\t0xa949, 0xab4a, 0xad4b, 0xaf4c, 0xb14d, 0xb34e, 0xb54f, 0xb750,\n\t// Entry 140 - 17F\n\t0xb951, 0xbb52, 0xbd53, 0xbf54, 0xc155, 0xc356, 0xc557, 0xc758,\n\t0xc959, 0xcb5a, 0xcd5b, 0xcf64,\n}\n\n// Size: 1463 bytes\nvar variantIndex = map[string]uint8{\n\t\"1606nict\": 0x0,\n\t\"1694acad\": 0x1,\n\t\"1901\":     0x2,\n\t\"1959acad\": 0x3,\n\t\"1994\":     0x45,\n\t\"1996\":     0x4,\n\t\"abl1943\":  0x5,\n\t\"alalc97\":  0x47,\n\t\"aluku\":    0x6,\n\t\"ao1990\":   0x7,\n\t\"arevela\":  0x8,\n\t\"arevmda\":  0x9,\n\t\"baku1926\": 0xa,\n\t\"balanka\":  0xb,\n\t\"barla\":    0xc,\n\t\"basiceng\": 0xd,\n\t\"bauddha\":  0xe,\n\t\"biscayan\": 0xf,\n\t\"biske\":    0x40,\n\t\"bohoric\":  0x10,\n\t\"boont\":    0x11,\n\t\"colb1945\": 0x12,\n\t\"cornu\":    0x13,\n\t\"dajnko\":   0x14,\n\t\"ekavsk\":   0x15,\n\t\"emodeng\":  0x16,\n\t\"fonipa\":   0x48,\n\t\"fonnapa\":  0x49,\n\t\"fonupa\":   0x4a,\n\t\"fonxsamp\": 0x4b,\n\t\"hepburn\":  0x17,\n\t\"heploc\":   0x46,\n\t\"hognorsk\": 0x18,\n\t\"ijekavsk\": 0x19,\n\t\"itihasa\":  0x1a,\n\t\"jauer\":    0x1b,\n\t\"jyutping\": 0x1c,\n\t\"kkcor\":    0x1d,\n\t\"kociewie\": 0x1e,\n\t\"kscor\":    0x1f,\n\t\"laukika\":  0x20,\n\t\"lipaw\":    0x41,\n\t\"luna1918\": 0x21,\n\t\"metelko\":  0x22,\n\t\"monoton\":  0x23,\n\t\"ndyuka\":   0x24,\n\t\"nedis\":    0x25,\n\t\"newfound\": 0x26,\n\t\"njiva\":    0x42,\n\t\"nulik\":    0x27,\n\t\"osojs\":    0x43,\n\t\"oxendict\": 0x28,\n\t\"pamaka\":   0x29,\n\t\"petr1708\": 0x2a,\n\t\"pinyin\":   0x2b,\n\t\"polyton\":  0x2c,\n\t\"puter\":    0x2d,\n\t\"rigik\":    0x2e,\n\t\"rozaj\":    0x2f,\n\t\"rumgr\":    0x30,\n\t\"scotland\": 0x31,\n\t\"scouse\":   0x32,\n\t\"simple\":   0x4c,\n\t\"solba\":    0x44,\n\t\"sotav\":    0x33,\n\t\"surmiran\": 0x34,\n\t\"sursilv\":  0x35,\n\t\"sutsilv\":  0x36,\n\t\"tarask\":   0x37,\n\t\"uccor\":    0x38,\n\t\"ucrcor\":   0x39,\n\t\"ulster\":   0x3a,\n\t\"unifon\":   0x3b,\n\t\"vaidika\":  0x3c,\n\t\"valencia\": 0x3d,\n\t\"vallader\": 0x3e,\n\t\"wadegile\": 0x3f,\n}\n\n// variantNumSpecialized is the number of specialized variants in variants.\nconst variantNumSpecialized = 71\n\n// nRegionGroups is the number of region groups.\nconst nRegionGroups = 32\n\ntype likelyLangRegion struct {\n\tlang   uint16\n\tregion uint16\n}\n\n// likelyScript is a lookup table, indexed by scriptID, for the most likely\n// languages and regions given a script.\n// Size: 928 bytes, 232 elements\nvar likelyScript = [232]likelyLangRegion{\n\t1:   {lang: 0x149, region: 0x83},\n\t3:   {lang: 0x299, region: 0x105},\n\t4:   {lang: 0x1e, region: 0x98},\n\t5:   {lang: 0x39, region: 0x6a},\n\t7:   {lang: 0x3a, region: 0x9b},\n\t8:   {lang: 0x1d0, region: 0x27},\n\t9:   {lang: 0x12, region: 0x9b},\n\t10:  {lang: 0x5a, region: 0x94},\n\t11:  {lang: 0x5f, region: 0x51},\n\t12:  {lang: 0xb7, region: 0xb3},\n\t13:  {lang: 0x62, region: 0x94},\n\t14:  {lang: 0xa3, region: 0x34},\n\t15:  {lang: 0x3e0, region: 0x98},\n\t17:  {lang: 0x51f, region: 0x12d},\n\t18:  {lang: 0x3a8, region: 0x98},\n\t19:  {lang: 0x159, region: 0x77},\n\t20:  {lang: 0xc0, region: 0x94},\n\t21:  {lang: 0x9b, region: 0xe6},\n\t22:  {lang: 0xd9, region: 0x34},\n\t23:  {lang: 0xf0, region: 0x48},\n\t24:  {lang: 0x4e6, region: 0x12a},\n\t25:  {lang: 0xe5, region: 0x13d},\n\t26:  {lang: 0xe3, region: 0x134},\n\t28:  {lang: 0xee, region: 0x6a},\n\t29:  {lang: 0x199, region: 0x5c},\n\t30:  {lang: 0x3d9, region: 0x105},\n\t32:  {lang: 0x1b7, region: 0x98},\n\t34:  {lang: 0x159, region: 0x77},\n\t37:  {lang: 0x12f, region: 0x6a},\n\t38:  {lang: 0x427, region: 0x26},\n\t39:  {lang: 0x26, region: 0x6e},\n\t41:  {lang: 0x208, region: 0x7c},\n\t42:  {lang: 0xfa, region: 0x37},\n\t43:  {lang: 0x198, region: 0x12f},\n\t44:  {lang: 0x3e0, region: 0x98},\n\t45:  {lang: 0x131, region: 0x86},\n\t46:  {lang: 0x19d, region: 0x98},\n\t47:  {lang: 0x394, region: 0x98},\n\t48:  {lang: 0x51f, region: 0x12d},\n\t49:  {lang: 0x24b, region: 0xaa},\n\t50:  {lang: 0x51f, region: 0x52},\n\t51:  {lang: 0x1c4, region: 0xe6},\n\t52:  {lang: 0x51f, region: 0x52},\n\t53:  {lang: 0x51f, region: 0x12d},\n\t54:  {lang: 0x2f4, region: 0x9a},\n\t55:  {lang: 0x1b5, region: 0x96},\n\t56:  {lang: 0x1f8, region: 0xa1},\n\t57:  {lang: 0x1be, region: 0x12a},\n\t58:  {lang: 0x1c3, region: 0xae},\n\t60:  {lang: 0x1ce, region: 0x91},\n\t62:  {lang: 0x13d, region: 0x9d},\n\t63:  {lang: 0x24b, region: 0xaa},\n\t64:  {lang: 0x206, region: 0x94},\n\t65:  {lang: 0x1f8, region: 0xa1},\n\t67:  {lang: 0x130, region: 0xc3},\n\t68:  {lang: 0x1f8, region: 0xa1},\n\t69:  {lang: 0x3b2, region: 0xe7},\n\t70:  {lang: 0x242, region: 0xa5},\n\t71:  {lang: 0x3f0, region: 0x98},\n\t74:  {lang: 0x249, region: 0x98},\n\t75:  {lang: 0x24b, region: 0xaa},\n\t77:  {lang: 0x87, region: 0x98},\n\t78:  {lang: 0x367, region: 0x122},\n\t79:  {lang: 0x2af, region: 0xae},\n\t84:  {lang: 0x296, region: 0x98},\n\t85:  {lang: 0x29f, region: 0x98},\n\t86:  {lang: 0x286, region: 0x86},\n\t87:  {lang: 0x199, region: 0x86},\n\t88:  {lang: 0x2a3, region: 0x52},\n\t90:  {lang: 0x4ea, region: 0x12a},\n\t91:  {lang: 0x4eb, region: 0x12a},\n\t92:  {lang: 0x1b7, region: 0x98},\n\t93:  {lang: 0x32e, region: 0x9b},\n\t94:  {lang: 0x4ed, region: 0x52},\n\t95:  {lang: 0xa7, region: 0x52},\n\t97:  {lang: 0x2df, region: 0x111},\n\t98:  {lang: 0x4ee, region: 0x10a},\n\t99:  {lang: 0x4ee, region: 0x10a},\n\t100: {lang: 0x2fb, region: 0x98},\n\t101: {lang: 0x312, region: 0x98},\n\t102: {lang: 0x302, region: 0x52},\n\t104: {lang: 0x315, region: 0x34},\n\t105: {lang: 0x305, region: 0x98},\n\t106: {lang: 0x40a, region: 0xe7},\n\t107: {lang: 0x328, region: 0xc3},\n\t108: {lang: 0x4ef, region: 0x107},\n\t109: {lang: 0x3a, region: 0xa0},\n\t110: {lang: 0x34a, region: 0xda},\n\t112: {lang: 0x2c7, region: 0x83},\n\t114: {lang: 0x3f9, region: 0x95},\n\t115: {lang: 0x3e5, region: 0x98},\n\t116: {lang: 0x392, region: 0xc4},\n\t117: {lang: 0x38c, region: 0x98},\n\t118: {lang: 0x390, region: 0x134},\n\t119: {lang: 0x41f, region: 0x114},\n\t120: {lang: 0x3a, region: 0x11b},\n\t121: {lang: 0xf9, region: 0xc3},\n\t122: {lang: 0x274, region: 0x105},\n\t123: {lang: 0x2c0, region: 0x52},\n\t124: {lang: 0x396, region: 0x9b},\n\t125: {lang: 0x396, region: 0x52},\n\t127: {lang: 0x3a4, region: 0xaf},\n\t129: {lang: 0x1bf, region: 0x52},\n\t130: {lang: 0x4f3, region: 0x9b},\n\t181: {lang: 0x3c2, region: 0x94},\n\t183: {lang: 0x369, region: 0x10b},\n\t184: {lang: 0x416, region: 0x96},\n\t186: {lang: 0x4f5, region: 0x15d},\n\t187: {lang: 0x3e6, region: 0x98},\n\t188: {lang: 0x44, region: 0x134},\n\t189: {lang: 0x134, region: 0x7a},\n\t190: {lang: 0x3e0, region: 0x98},\n\t191: {lang: 0x3e0, region: 0x98},\n\t192: {lang: 0x3f0, region: 0x98},\n\t193: {lang: 0x402, region: 0xb2},\n\t194: {lang: 0x429, region: 0x98},\n\t195: {lang: 0x434, region: 0x94},\n\t196: {lang: 0x443, region: 0x34},\n\t197: {lang: 0x444, region: 0x9a},\n\t201: {lang: 0x450, region: 0xe6},\n\t202: {lang: 0x116, region: 0x98},\n\t203: {lang: 0x454, region: 0x52},\n\t204: {lang: 0x22a, region: 0x52},\n\t205: {lang: 0x446, region: 0x98},\n\t206: {lang: 0x49b, region: 0x52},\n\t207: {lang: 0x9d, region: 0x13d},\n\t208: {lang: 0x457, region: 0x98},\n\t210: {lang: 0x51e, region: 0xb9},\n\t211: {lang: 0x14e, region: 0xe6},\n\t212: {lang: 0x124, region: 0xcc},\n\t213: {lang: 0x461, region: 0x122},\n\t214: {lang: 0xa7, region: 0x52},\n\t215: {lang: 0x2c5, region: 0x98},\n\t216: {lang: 0x4a3, region: 0x11b},\n\t217: {lang: 0x4b4, region: 0xb3},\n\t219: {lang: 0x1c7, region: 0x98},\n\t221: {lang: 0x3a0, region: 0x9b},\n\t222: {lang: 0x21, region: 0x9a},\n\t223: {lang: 0x1e2, region: 0x52},\n}\n\ntype likelyScriptRegion struct {\n\tregion uint16\n\tscript uint8\n\tflags  uint8\n}\n\n// likelyLang is a lookup table, indexed by langID, for the most likely\n// scripts and regions given incomplete information. If more entries exist for a\n// given language, region and script are the index and size respectively\n// of the list in likelyLangList.\n// Size: 5276 bytes, 1319 elements\nvar likelyLang = [1319]likelyScriptRegion{\n\t0:    {region: 0x134, script: 0x52, flags: 0x0},\n\t1:    {region: 0x6e, script: 0x52, flags: 0x0},\n\t2:    {region: 0x164, script: 0x52, flags: 0x0},\n\t3:    {region: 0x164, script: 0x52, flags: 0x0},\n\t4:    {region: 0x164, script: 0x52, flags: 0x0},\n\t5:    {region: 0x7c, script: 0x1e, flags: 0x0},\n\t6:    {region: 0x164, script: 0x52, flags: 0x0},\n\t7:    {region: 0x7f, script: 0x52, flags: 0x0},\n\t8:    {region: 0x164, script: 0x52, flags: 0x0},\n\t9:    {region: 0x164, script: 0x52, flags: 0x0},\n\t10:   {region: 0x164, script: 0x52, flags: 0x0},\n\t11:   {region: 0x94, script: 0x52, flags: 0x0},\n\t12:   {region: 0x130, script: 0x52, flags: 0x0},\n\t13:   {region: 0x7f, script: 0x52, flags: 0x0},\n\t14:   {region: 0x164, script: 0x52, flags: 0x0},\n\t15:   {region: 0x164, script: 0x52, flags: 0x0},\n\t16:   {region: 0x105, script: 0x1e, flags: 0x0},\n\t17:   {region: 0x164, script: 0x52, flags: 0x0},\n\t18:   {region: 0x9b, script: 0x9, flags: 0x0},\n\t19:   {region: 0x127, script: 0x5, flags: 0x0},\n\t20:   {region: 0x164, script: 0x52, flags: 0x0},\n\t21:   {region: 0x160, script: 0x52, flags: 0x0},\n\t22:   {region: 0x164, script: 0x52, flags: 0x0},\n\t23:   {region: 0x164, script: 0x52, flags: 0x0},\n\t24:   {region: 0x164, script: 0x52, flags: 0x0},\n\t25:   {region: 0x164, script: 0x52, flags: 0x0},\n\t26:   {region: 0x164, script: 0x52, flags: 0x0},\n\t27:   {region: 0x51, script: 0x52, flags: 0x0},\n\t28:   {region: 0x164, script: 0x52, flags: 0x0},\n\t29:   {region: 0x164, script: 0x52, flags: 0x0},\n\t30:   {region: 0x98, script: 0x4, flags: 0x0},\n\t31:   {region: 0x164, script: 0x52, flags: 0x0},\n\t32:   {region: 0x7f, script: 0x52, flags: 0x0},\n\t33:   {region: 0x9a, script: 0xde, flags: 0x0},\n\t34:   {region: 0x164, script: 0x52, flags: 0x0},\n\t35:   {region: 0x164, script: 0x52, flags: 0x0},\n\t36:   {region: 0x14c, script: 0x52, flags: 0x0},\n\t37:   {region: 0x105, script: 0x1e, flags: 0x0},\n\t38:   {region: 0x6e, script: 0x27, flags: 0x0},\n\t39:   {region: 0x164, script: 0x52, flags: 0x0},\n\t40:   {region: 0x164, script: 0x52, flags: 0x0},\n\t41:   {region: 0xd5, script: 0x52, flags: 0x0},\n\t42:   {region: 0x164, script: 0x52, flags: 0x0},\n\t44:   {region: 0x164, script: 0x52, flags: 0x0},\n\t45:   {region: 0x164, script: 0x52, flags: 0x0},\n\t46:   {region: 0x164, script: 0x52, flags: 0x0},\n\t47:   {region: 0x164, script: 0x52, flags: 0x0},\n\t48:   {region: 0x164, script: 0x52, flags: 0x0},\n\t49:   {region: 0x164, script: 0x52, flags: 0x0},\n\t50:   {region: 0x94, script: 0x52, flags: 0x0},\n\t51:   {region: 0x164, script: 0x5, flags: 0x0},\n\t52:   {region: 0x121, script: 0x5, flags: 0x0},\n\t53:   {region: 0x164, script: 0x52, flags: 0x0},\n\t54:   {region: 0x164, script: 0x52, flags: 0x0},\n\t55:   {region: 0x164, script: 0x52, flags: 0x0},\n\t56:   {region: 0x164, script: 0x52, flags: 0x0},\n\t57:   {region: 0x6a, script: 0x5, flags: 0x0},\n\t58:   {region: 0x0, script: 0x3, flags: 0x1},\n\t59:   {region: 0x164, script: 0x52, flags: 0x0},\n\t60:   {region: 0x50, script: 0x52, flags: 0x0},\n\t61:   {region: 0x3e, script: 0x52, flags: 0x0},\n\t62:   {region: 0x66, script: 0x5, flags: 0x0},\n\t64:   {region: 0xb9, script: 0x5, flags: 0x0},\n\t65:   {region: 0x6a, script: 0x5, flags: 0x0},\n\t66:   {region: 0x98, script: 0xe, flags: 0x0},\n\t67:   {region: 0x12e, script: 0x52, flags: 0x0},\n\t68:   {region: 0x134, script: 0xbc, flags: 0x0},\n\t69:   {region: 0x164, script: 0x52, flags: 0x0},\n\t70:   {region: 0x164, script: 0x52, flags: 0x0},\n\t71:   {region: 0x6d, script: 0x52, flags: 0x0},\n\t72:   {region: 0x164, script: 0x52, flags: 0x0},\n\t73:   {region: 0x164, script: 0x52, flags: 0x0},\n\t74:   {region: 0x48, script: 0x52, flags: 0x0},\n\t75:   {region: 0x164, script: 0x52, flags: 0x0},\n\t76:   {region: 0x105, script: 0x1e, flags: 0x0},\n\t77:   {region: 0x164, script: 0x5, flags: 0x0},\n\t78:   {region: 0x164, script: 0x52, flags: 0x0},\n\t79:   {region: 0x164, script: 0x52, flags: 0x0},\n\t80:   {region: 0x164, script: 0x52, flags: 0x0},\n\t81:   {region: 0x98, script: 0x20, flags: 0x0},\n\t82:   {region: 0x164, script: 0x52, flags: 0x0},\n\t83:   {region: 0x164, script: 0x52, flags: 0x0},\n\t84:   {region: 0x164, script: 0x52, flags: 0x0},\n\t85:   {region: 0x3e, script: 0x52, flags: 0x0},\n\t86:   {region: 0x164, script: 0x52, flags: 0x0},\n\t87:   {region: 0x3, script: 0x5, flags: 0x1},\n\t88:   {region: 0x105, script: 0x1e, flags: 0x0},\n\t89:   {region: 0xe7, script: 0x5, flags: 0x0},\n\t90:   {region: 0x94, script: 0x52, flags: 0x0},\n\t91:   {region: 0xda, script: 0x20, flags: 0x0},\n\t92:   {region: 0x2d, script: 0x52, flags: 0x0},\n\t93:   {region: 0x51, script: 0x52, flags: 0x0},\n\t94:   {region: 0x164, script: 0x52, flags: 0x0},\n\t95:   {region: 0x51, script: 0xb, flags: 0x0},\n\t96:   {region: 0x164, script: 0x52, flags: 0x0},\n\t97:   {region: 0x164, script: 0x52, flags: 0x0},\n\t98:   {region: 0x94, script: 0x52, flags: 0x0},\n\t99:   {region: 0x164, script: 0x52, flags: 0x0},\n\t100:  {region: 0x51, script: 0x52, flags: 0x0},\n\t101:  {region: 0x164, script: 0x52, flags: 0x0},\n\t102:  {region: 0x164, script: 0x52, flags: 0x0},\n\t103:  {region: 0x164, script: 0x52, flags: 0x0},\n\t104:  {region: 0x164, script: 0x52, flags: 0x0},\n\t105:  {region: 0x4e, script: 0x52, flags: 0x0},\n\t106:  {region: 0x164, script: 0x52, flags: 0x0},\n\t107:  {region: 0x164, script: 0x52, flags: 0x0},\n\t108:  {region: 0x164, script: 0x52, flags: 0x0},\n\t109:  {region: 0x164, script: 0x27, flags: 0x0},\n\t110:  {region: 0x164, script: 0x52, flags: 0x0},\n\t111:  {region: 0x164, script: 0x52, flags: 0x0},\n\t112:  {region: 0x46, script: 0x1e, flags: 0x0},\n\t113:  {region: 0x164, script: 0x52, flags: 0x0},\n\t114:  {region: 0x164, script: 0x52, flags: 0x0},\n\t115:  {region: 0x10a, script: 0x5, flags: 0x0},\n\t116:  {region: 0x161, script: 0x52, flags: 0x0},\n\t117:  {region: 0x164, script: 0x52, flags: 0x0},\n\t118:  {region: 0x94, script: 0x52, flags: 0x0},\n\t119:  {region: 0x164, script: 0x52, flags: 0x0},\n\t120:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t121:  {region: 0x51, script: 0x52, flags: 0x0},\n\t122:  {region: 0x98, script: 0xcd, flags: 0x0},\n\t123:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t124:  {region: 0x98, script: 0x20, flags: 0x0},\n\t125:  {region: 0x37, script: 0x1e, flags: 0x0},\n\t126:  {region: 0x98, script: 0x20, flags: 0x0},\n\t127:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t128:  {region: 0x12a, script: 0x2d, flags: 0x0},\n\t130:  {region: 0x98, script: 0x20, flags: 0x0},\n\t131:  {region: 0x164, script: 0x52, flags: 0x0},\n\t132:  {region: 0x98, script: 0x20, flags: 0x0},\n\t133:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t134:  {region: 0x164, script: 0x52, flags: 0x0},\n\t135:  {region: 0x98, script: 0x20, flags: 0x0},\n\t136:  {region: 0x164, script: 0x52, flags: 0x0},\n\t137:  {region: 0x13e, script: 0x52, flags: 0x0},\n\t138:  {region: 0x164, script: 0x52, flags: 0x0},\n\t139:  {region: 0x164, script: 0x52, flags: 0x0},\n\t140:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t141:  {region: 0x164, script: 0x52, flags: 0x0},\n\t142:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t143:  {region: 0x164, script: 0x52, flags: 0x0},\n\t144:  {region: 0x164, script: 0x52, flags: 0x0},\n\t145:  {region: 0x164, script: 0x52, flags: 0x0},\n\t146:  {region: 0x164, script: 0x27, flags: 0x0},\n\t147:  {region: 0x98, script: 0x20, flags: 0x0},\n\t148:  {region: 0x94, script: 0x52, flags: 0x0},\n\t149:  {region: 0x164, script: 0x52, flags: 0x0},\n\t150:  {region: 0x164, script: 0x52, flags: 0x0},\n\t151:  {region: 0x164, script: 0x52, flags: 0x0},\n\t152:  {region: 0x164, script: 0x52, flags: 0x0},\n\t153:  {region: 0x51, script: 0x52, flags: 0x0},\n\t154:  {region: 0x164, script: 0x52, flags: 0x0},\n\t155:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t156:  {region: 0x164, script: 0x52, flags: 0x0},\n\t157:  {region: 0x13d, script: 0xcf, flags: 0x0},\n\t158:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t159:  {region: 0x164, script: 0x52, flags: 0x0},\n\t160:  {region: 0x164, script: 0x52, flags: 0x0},\n\t161:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t162:  {region: 0x164, script: 0x52, flags: 0x0},\n\t163:  {region: 0x34, script: 0xe, flags: 0x0},\n\t164:  {region: 0x164, script: 0x52, flags: 0x0},\n\t165:  {region: 0x164, script: 0x52, flags: 0x0},\n\t166:  {region: 0x164, script: 0x52, flags: 0x0},\n\t167:  {region: 0x52, script: 0xd6, flags: 0x0},\n\t168:  {region: 0x164, script: 0x52, flags: 0x0},\n\t169:  {region: 0x164, script: 0x52, flags: 0x0},\n\t170:  {region: 0x164, script: 0x52, flags: 0x0},\n\t171:  {region: 0x98, script: 0xe, flags: 0x0},\n\t172:  {region: 0x164, script: 0x52, flags: 0x0},\n\t173:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t174:  {region: 0x164, script: 0x52, flags: 0x0},\n\t175:  {region: 0x4e, script: 0x52, flags: 0x0},\n\t176:  {region: 0x77, script: 0x52, flags: 0x0},\n\t177:  {region: 0x98, script: 0x20, flags: 0x0},\n\t178:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t179:  {region: 0x98, script: 0x20, flags: 0x0},\n\t180:  {region: 0x164, script: 0x52, flags: 0x0},\n\t181:  {region: 0x32, script: 0x52, flags: 0x0},\n\t182:  {region: 0x164, script: 0x52, flags: 0x0},\n\t183:  {region: 0xb3, script: 0xc, flags: 0x0},\n\t184:  {region: 0x51, script: 0x52, flags: 0x0},\n\t185:  {region: 0x164, script: 0x27, flags: 0x0},\n\t186:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t187:  {region: 0x164, script: 0x52, flags: 0x0},\n\t188:  {region: 0xe7, script: 0x20, flags: 0x0},\n\t189:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t190:  {region: 0x15e, script: 0x52, flags: 0x0},\n\t191:  {region: 0x164, script: 0x52, flags: 0x0},\n\t192:  {region: 0x94, script: 0x52, flags: 0x0},\n\t193:  {region: 0x164, script: 0x52, flags: 0x0},\n\t194:  {region: 0x51, script: 0x52, flags: 0x0},\n\t195:  {region: 0x164, script: 0x52, flags: 0x0},\n\t196:  {region: 0x164, script: 0x52, flags: 0x0},\n\t197:  {region: 0x164, script: 0x52, flags: 0x0},\n\t198:  {region: 0x85, script: 0x52, flags: 0x0},\n\t199:  {region: 0x164, script: 0x52, flags: 0x0},\n\t200:  {region: 0x164, script: 0x52, flags: 0x0},\n\t201:  {region: 0x164, script: 0x52, flags: 0x0},\n\t202:  {region: 0x164, script: 0x52, flags: 0x0},\n\t203:  {region: 0x6c, script: 0x27, flags: 0x0},\n\t204:  {region: 0x164, script: 0x52, flags: 0x0},\n\t205:  {region: 0x164, script: 0x52, flags: 0x0},\n\t206:  {region: 0x51, script: 0x52, flags: 0x0},\n\t207:  {region: 0x164, script: 0x52, flags: 0x0},\n\t208:  {region: 0x164, script: 0x52, flags: 0x0},\n\t209:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t210:  {region: 0x164, script: 0x52, flags: 0x0},\n\t211:  {region: 0x164, script: 0x52, flags: 0x0},\n\t212:  {region: 0x164, script: 0x52, flags: 0x0},\n\t213:  {region: 0x6d, script: 0x52, flags: 0x0},\n\t214:  {region: 0x164, script: 0x52, flags: 0x0},\n\t215:  {region: 0x164, script: 0x52, flags: 0x0},\n\t216:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t217:  {region: 0x8, script: 0x2, flags: 0x1},\n\t218:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t219:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t220:  {region: 0x164, script: 0x52, flags: 0x0},\n\t221:  {region: 0x130, script: 0x52, flags: 0x0},\n\t222:  {region: 0x89, script: 0x52, flags: 0x0},\n\t223:  {region: 0x74, script: 0x52, flags: 0x0},\n\t224:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t225:  {region: 0x134, script: 0x52, flags: 0x0},\n\t226:  {region: 0x48, script: 0x52, flags: 0x0},\n\t227:  {region: 0x134, script: 0x1a, flags: 0x0},\n\t228:  {region: 0xa5, script: 0x5, flags: 0x0},\n\t229:  {region: 0x13d, script: 0x19, flags: 0x0},\n\t230:  {region: 0x164, script: 0x52, flags: 0x0},\n\t231:  {region: 0x9a, script: 0x5, flags: 0x0},\n\t232:  {region: 0x164, script: 0x52, flags: 0x0},\n\t233:  {region: 0x164, script: 0x52, flags: 0x0},\n\t234:  {region: 0x164, script: 0x52, flags: 0x0},\n\t235:  {region: 0x164, script: 0x52, flags: 0x0},\n\t236:  {region: 0x164, script: 0x52, flags: 0x0},\n\t237:  {region: 0x77, script: 0x52, flags: 0x0},\n\t238:  {region: 0x6a, script: 0x1c, flags: 0x0},\n\t239:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t240:  {region: 0x48, script: 0x17, flags: 0x0},\n\t241:  {region: 0x48, script: 0x17, flags: 0x0},\n\t242:  {region: 0x48, script: 0x17, flags: 0x0},\n\t243:  {region: 0x48, script: 0x17, flags: 0x0},\n\t244:  {region: 0x48, script: 0x17, flags: 0x0},\n\t245:  {region: 0x109, script: 0x52, flags: 0x0},\n\t246:  {region: 0x5d, script: 0x52, flags: 0x0},\n\t247:  {region: 0xe8, script: 0x52, flags: 0x0},\n\t248:  {region: 0x48, script: 0x17, flags: 0x0},\n\t249:  {region: 0xc3, script: 0x79, flags: 0x0},\n\t250:  {region: 0xa, script: 0x2, flags: 0x1},\n\t251:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t252:  {region: 0x7a, script: 0x52, flags: 0x0},\n\t253:  {region: 0x62, script: 0x52, flags: 0x0},\n\t254:  {region: 0x164, script: 0x52, flags: 0x0},\n\t255:  {region: 0x164, script: 0x52, flags: 0x0},\n\t256:  {region: 0x164, script: 0x52, flags: 0x0},\n\t257:  {region: 0x164, script: 0x52, flags: 0x0},\n\t258:  {region: 0x134, script: 0x52, flags: 0x0},\n\t259:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t260:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t261:  {region: 0x164, script: 0x52, flags: 0x0},\n\t262:  {region: 0x164, script: 0x52, flags: 0x0},\n\t263:  {region: 0x98, script: 0x5, flags: 0x0},\n\t264:  {region: 0x164, script: 0x52, flags: 0x0},\n\t265:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t266:  {region: 0x164, script: 0x52, flags: 0x0},\n\t267:  {region: 0x48, script: 0x52, flags: 0x0},\n\t268:  {region: 0x164, script: 0x52, flags: 0x0},\n\t269:  {region: 0x164, script: 0x52, flags: 0x0},\n\t270:  {region: 0x164, script: 0x52, flags: 0x0},\n\t271:  {region: 0x164, script: 0x5, flags: 0x0},\n\t272:  {region: 0x48, script: 0x52, flags: 0x0},\n\t273:  {region: 0x164, script: 0x52, flags: 0x0},\n\t274:  {region: 0x164, script: 0x52, flags: 0x0},\n\t275:  {region: 0xd3, script: 0x52, flags: 0x0},\n\t276:  {region: 0x4e, script: 0x52, flags: 0x0},\n\t277:  {region: 0x164, script: 0x52, flags: 0x0},\n\t278:  {region: 0x98, script: 0x5, flags: 0x0},\n\t279:  {region: 0x164, script: 0x52, flags: 0x0},\n\t280:  {region: 0x164, script: 0x52, flags: 0x0},\n\t281:  {region: 0x164, script: 0x52, flags: 0x0},\n\t282:  {region: 0x164, script: 0x27, flags: 0x0},\n\t283:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t284:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t285:  {region: 0xcf, script: 0x52, flags: 0x0},\n\t286:  {region: 0x164, script: 0x52, flags: 0x0},\n\t287:  {region: 0xda, script: 0x20, flags: 0x0},\n\t288:  {region: 0x51, script: 0x52, flags: 0x0},\n\t289:  {region: 0x164, script: 0x52, flags: 0x0},\n\t290:  {region: 0x164, script: 0x52, flags: 0x0},\n\t291:  {region: 0x164, script: 0x52, flags: 0x0},\n\t292:  {region: 0xcc, script: 0xd4, flags: 0x0},\n\t293:  {region: 0x164, script: 0x52, flags: 0x0},\n\t294:  {region: 0x164, script: 0x52, flags: 0x0},\n\t295:  {region: 0x113, script: 0x52, flags: 0x0},\n\t296:  {region: 0x36, script: 0x52, flags: 0x0},\n\t297:  {region: 0x42, script: 0xd6, flags: 0x0},\n\t298:  {region: 0x164, script: 0x52, flags: 0x0},\n\t299:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t300:  {region: 0x7f, script: 0x52, flags: 0x0},\n\t301:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t302:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t303:  {region: 0x6a, script: 0x25, flags: 0x0},\n\t304:  {region: 0xc3, script: 0x43, flags: 0x0},\n\t305:  {region: 0x86, script: 0x2d, flags: 0x0},\n\t306:  {region: 0x164, script: 0x52, flags: 0x0},\n\t307:  {region: 0x164, script: 0x52, flags: 0x0},\n\t308:  {region: 0xc, script: 0x2, flags: 0x1},\n\t309:  {region: 0x164, script: 0x52, flags: 0x0},\n\t310:  {region: 0x164, script: 0x52, flags: 0x0},\n\t311:  {region: 0x1, script: 0x52, flags: 0x0},\n\t312:  {region: 0x164, script: 0x52, flags: 0x0},\n\t313:  {region: 0x6d, script: 0x52, flags: 0x0},\n\t314:  {region: 0x134, script: 0x52, flags: 0x0},\n\t315:  {region: 0x69, script: 0x52, flags: 0x0},\n\t316:  {region: 0x164, script: 0x52, flags: 0x0},\n\t317:  {region: 0x9d, script: 0x3e, flags: 0x0},\n\t318:  {region: 0x164, script: 0x52, flags: 0x0},\n\t319:  {region: 0x164, script: 0x52, flags: 0x0},\n\t320:  {region: 0x6d, script: 0x52, flags: 0x0},\n\t321:  {region: 0x51, script: 0x52, flags: 0x0},\n\t322:  {region: 0x6d, script: 0x52, flags: 0x0},\n\t323:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t324:  {region: 0x164, script: 0x52, flags: 0x0},\n\t325:  {region: 0x164, script: 0x52, flags: 0x0},\n\t326:  {region: 0x164, script: 0x52, flags: 0x0},\n\t327:  {region: 0x164, script: 0x52, flags: 0x0},\n\t328:  {region: 0x85, script: 0x52, flags: 0x0},\n\t329:  {region: 0xe, script: 0x2, flags: 0x1},\n\t330:  {region: 0x164, script: 0x52, flags: 0x0},\n\t331:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t332:  {region: 0x71, script: 0x52, flags: 0x0},\n\t333:  {region: 0x10a, script: 0x5, flags: 0x0},\n\t334:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t335:  {region: 0x10b, script: 0x52, flags: 0x0},\n\t336:  {region: 0x72, script: 0x52, flags: 0x0},\n\t337:  {region: 0x164, script: 0x52, flags: 0x0},\n\t338:  {region: 0x164, script: 0x52, flags: 0x0},\n\t339:  {region: 0x75, script: 0x52, flags: 0x0},\n\t340:  {region: 0x164, script: 0x52, flags: 0x0},\n\t341:  {region: 0x3a, script: 0x52, flags: 0x0},\n\t342:  {region: 0x164, script: 0x52, flags: 0x0},\n\t343:  {region: 0x164, script: 0x52, flags: 0x0},\n\t344:  {region: 0x164, script: 0x52, flags: 0x0},\n\t345:  {region: 0x77, script: 0x52, flags: 0x0},\n\t346:  {region: 0x134, script: 0x52, flags: 0x0},\n\t347:  {region: 0x77, script: 0x52, flags: 0x0},\n\t348:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t349:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t350:  {region: 0x51, script: 0x5, flags: 0x0},\n\t351:  {region: 0x13f, script: 0x52, flags: 0x0},\n\t352:  {region: 0x164, script: 0x52, flags: 0x0},\n\t353:  {region: 0x83, script: 0x52, flags: 0x0},\n\t354:  {region: 0x164, script: 0x52, flags: 0x0},\n\t355:  {region: 0xd3, script: 0x52, flags: 0x0},\n\t356:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t357:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t358:  {region: 0x164, script: 0x52, flags: 0x0},\n\t359:  {region: 0x10a, script: 0x52, flags: 0x0},\n\t360:  {region: 0xd8, script: 0x52, flags: 0x0},\n\t361:  {region: 0x95, script: 0x52, flags: 0x0},\n\t362:  {region: 0x7f, script: 0x52, flags: 0x0},\n\t363:  {region: 0x164, script: 0x52, flags: 0x0},\n\t364:  {region: 0xbb, script: 0x52, flags: 0x0},\n\t365:  {region: 0x164, script: 0x52, flags: 0x0},\n\t366:  {region: 0x164, script: 0x52, flags: 0x0},\n\t367:  {region: 0x164, script: 0x52, flags: 0x0},\n\t368:  {region: 0x52, script: 0x34, flags: 0x0},\n\t369:  {region: 0x164, script: 0x52, flags: 0x0},\n\t370:  {region: 0x94, script: 0x52, flags: 0x0},\n\t371:  {region: 0x164, script: 0x52, flags: 0x0},\n\t372:  {region: 0x98, script: 0x20, flags: 0x0},\n\t373:  {region: 0x164, script: 0x52, flags: 0x0},\n\t374:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t375:  {region: 0x7d, script: 0x52, flags: 0x0},\n\t376:  {region: 0x7a, script: 0x52, flags: 0x0},\n\t377:  {region: 0x164, script: 0x52, flags: 0x0},\n\t378:  {region: 0x164, script: 0x52, flags: 0x0},\n\t379:  {region: 0x164, script: 0x52, flags: 0x0},\n\t380:  {region: 0x164, script: 0x52, flags: 0x0},\n\t381:  {region: 0x164, script: 0x52, flags: 0x0},\n\t382:  {region: 0x164, script: 0x52, flags: 0x0},\n\t383:  {region: 0x6e, script: 0x27, flags: 0x0},\n\t384:  {region: 0x164, script: 0x52, flags: 0x0},\n\t385:  {region: 0xda, script: 0x20, flags: 0x0},\n\t386:  {region: 0x164, script: 0x52, flags: 0x0},\n\t387:  {region: 0xa6, script: 0x52, flags: 0x0},\n\t388:  {region: 0x164, script: 0x52, flags: 0x0},\n\t389:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t390:  {region: 0x164, script: 0x52, flags: 0x0},\n\t391:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t392:  {region: 0x164, script: 0x52, flags: 0x0},\n\t393:  {region: 0x164, script: 0x52, flags: 0x0},\n\t394:  {region: 0x6d, script: 0x52, flags: 0x0},\n\t395:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t396:  {region: 0x164, script: 0x52, flags: 0x0},\n\t397:  {region: 0x164, script: 0x27, flags: 0x0},\n\t398:  {region: 0xf0, script: 0x52, flags: 0x0},\n\t399:  {region: 0x164, script: 0x52, flags: 0x0},\n\t400:  {region: 0x164, script: 0x52, flags: 0x0},\n\t401:  {region: 0x164, script: 0x52, flags: 0x0},\n\t402:  {region: 0x164, script: 0x27, flags: 0x0},\n\t403:  {region: 0x164, script: 0x52, flags: 0x0},\n\t404:  {region: 0x98, script: 0x20, flags: 0x0},\n\t405:  {region: 0x98, script: 0xd0, flags: 0x0},\n\t406:  {region: 0x94, script: 0x52, flags: 0x0},\n\t407:  {region: 0xd8, script: 0x52, flags: 0x0},\n\t408:  {region: 0x12f, script: 0x2b, flags: 0x0},\n\t409:  {region: 0x10, script: 0x2, flags: 0x1},\n\t410:  {region: 0x98, script: 0xe, flags: 0x0},\n\t411:  {region: 0x164, script: 0x52, flags: 0x0},\n\t412:  {region: 0x4d, script: 0x52, flags: 0x0},\n\t413:  {region: 0x98, script: 0x2e, flags: 0x0},\n\t414:  {region: 0x40, script: 0x52, flags: 0x0},\n\t415:  {region: 0x53, script: 0x52, flags: 0x0},\n\t416:  {region: 0x164, script: 0x52, flags: 0x0},\n\t417:  {region: 0x7f, script: 0x52, flags: 0x0},\n\t418:  {region: 0x164, script: 0x52, flags: 0x0},\n\t419:  {region: 0x164, script: 0x52, flags: 0x0},\n\t420:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t421:  {region: 0x97, script: 0x52, flags: 0x0},\n\t422:  {region: 0x164, script: 0x52, flags: 0x0},\n\t423:  {region: 0xda, script: 0x20, flags: 0x0},\n\t424:  {region: 0x164, script: 0x52, flags: 0x0},\n\t425:  {region: 0x164, script: 0x5, flags: 0x0},\n\t426:  {region: 0x48, script: 0x52, flags: 0x0},\n\t427:  {region: 0x164, script: 0x5, flags: 0x0},\n\t428:  {region: 0x164, script: 0x52, flags: 0x0},\n\t429:  {region: 0x12, script: 0x3, flags: 0x1},\n\t430:  {region: 0x164, script: 0x52, flags: 0x0},\n\t431:  {region: 0x52, script: 0x34, flags: 0x0},\n\t432:  {region: 0x164, script: 0x52, flags: 0x0},\n\t433:  {region: 0x134, script: 0x52, flags: 0x0},\n\t434:  {region: 0x23, script: 0x5, flags: 0x0},\n\t435:  {region: 0x164, script: 0x52, flags: 0x0},\n\t436:  {region: 0x164, script: 0x27, flags: 0x0},\n\t437:  {region: 0x96, script: 0x37, flags: 0x0},\n\t438:  {region: 0x164, script: 0x52, flags: 0x0},\n\t439:  {region: 0x98, script: 0x20, flags: 0x0},\n\t440:  {region: 0x164, script: 0x52, flags: 0x0},\n\t441:  {region: 0x72, script: 0x52, flags: 0x0},\n\t442:  {region: 0x164, script: 0x52, flags: 0x0},\n\t443:  {region: 0x164, script: 0x52, flags: 0x0},\n\t444:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t445:  {region: 0x164, script: 0x52, flags: 0x0},\n\t446:  {region: 0x12a, script: 0x39, flags: 0x0},\n\t447:  {region: 0x52, script: 0x81, flags: 0x0},\n\t448:  {region: 0x164, script: 0x52, flags: 0x0},\n\t449:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t450:  {region: 0x98, script: 0x20, flags: 0x0},\n\t451:  {region: 0xae, script: 0x3a, flags: 0x0},\n\t452:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t453:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t454:  {region: 0xe5, script: 0x52, flags: 0x0},\n\t455:  {region: 0x98, script: 0x20, flags: 0x0},\n\t456:  {region: 0x98, script: 0x20, flags: 0x0},\n\t457:  {region: 0x164, script: 0x52, flags: 0x0},\n\t458:  {region: 0x8f, script: 0x52, flags: 0x0},\n\t459:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t460:  {region: 0x52, script: 0x34, flags: 0x0},\n\t461:  {region: 0x90, script: 0x52, flags: 0x0},\n\t462:  {region: 0x91, script: 0x52, flags: 0x0},\n\t463:  {region: 0x164, script: 0x52, flags: 0x0},\n\t464:  {region: 0x27, script: 0x8, flags: 0x0},\n\t465:  {region: 0xd1, script: 0x52, flags: 0x0},\n\t466:  {region: 0x77, script: 0x52, flags: 0x0},\n\t467:  {region: 0x164, script: 0x52, flags: 0x0},\n\t468:  {region: 0x164, script: 0x52, flags: 0x0},\n\t469:  {region: 0xcf, script: 0x52, flags: 0x0},\n\t470:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t471:  {region: 0x164, script: 0x52, flags: 0x0},\n\t472:  {region: 0x164, script: 0x52, flags: 0x0},\n\t473:  {region: 0x164, script: 0x52, flags: 0x0},\n\t474:  {region: 0x94, script: 0x52, flags: 0x0},\n\t475:  {region: 0x164, script: 0x52, flags: 0x0},\n\t476:  {region: 0x164, script: 0x52, flags: 0x0},\n\t477:  {region: 0x164, script: 0x52, flags: 0x0},\n\t479:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t480:  {region: 0x164, script: 0x52, flags: 0x0},\n\t481:  {region: 0x164, script: 0x52, flags: 0x0},\n\t482:  {region: 0x52, script: 0xdf, flags: 0x0},\n\t483:  {region: 0x164, script: 0x52, flags: 0x0},\n\t484:  {region: 0x134, script: 0x52, flags: 0x0},\n\t485:  {region: 0x164, script: 0x52, flags: 0x0},\n\t486:  {region: 0x48, script: 0x52, flags: 0x0},\n\t487:  {region: 0x164, script: 0x52, flags: 0x0},\n\t488:  {region: 0x164, script: 0x52, flags: 0x0},\n\t489:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t490:  {region: 0x164, script: 0x52, flags: 0x0},\n\t491:  {region: 0x94, script: 0x52, flags: 0x0},\n\t492:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t494:  {region: 0x164, script: 0x52, flags: 0x0},\n\t495:  {region: 0x164, script: 0x52, flags: 0x0},\n\t496:  {region: 0x9c, script: 0x52, flags: 0x0},\n\t497:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t498:  {region: 0x48, script: 0x17, flags: 0x0},\n\t499:  {region: 0x96, script: 0x37, flags: 0x0},\n\t500:  {region: 0x164, script: 0x52, flags: 0x0},\n\t501:  {region: 0x164, script: 0x52, flags: 0x0},\n\t502:  {region: 0x105, script: 0x52, flags: 0x0},\n\t503:  {region: 0x164, script: 0x52, flags: 0x0},\n\t504:  {region: 0xa1, script: 0x41, flags: 0x0},\n\t505:  {region: 0x164, script: 0x52, flags: 0x0},\n\t506:  {region: 0x9f, script: 0x52, flags: 0x0},\n\t508:  {region: 0x164, script: 0x52, flags: 0x0},\n\t509:  {region: 0x164, script: 0x52, flags: 0x0},\n\t510:  {region: 0x164, script: 0x52, flags: 0x0},\n\t511:  {region: 0x51, script: 0x52, flags: 0x0},\n\t512:  {region: 0x12f, script: 0x37, flags: 0x0},\n\t513:  {region: 0x164, script: 0x52, flags: 0x0},\n\t514:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t515:  {region: 0xda, script: 0x20, flags: 0x0},\n\t516:  {region: 0x164, script: 0x52, flags: 0x0},\n\t517:  {region: 0x62, script: 0x52, flags: 0x0},\n\t518:  {region: 0x94, script: 0x52, flags: 0x0},\n\t519:  {region: 0x94, script: 0x52, flags: 0x0},\n\t520:  {region: 0x7c, script: 0x29, flags: 0x0},\n\t521:  {region: 0x136, script: 0x1e, flags: 0x0},\n\t522:  {region: 0x66, script: 0x52, flags: 0x0},\n\t523:  {region: 0xc3, script: 0x52, flags: 0x0},\n\t524:  {region: 0x164, script: 0x52, flags: 0x0},\n\t525:  {region: 0x164, script: 0x52, flags: 0x0},\n\t526:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t527:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t528:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t529:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t530:  {region: 0x164, script: 0x52, flags: 0x0},\n\t531:  {region: 0x164, script: 0x52, flags: 0x0},\n\t532:  {region: 0x164, script: 0x52, flags: 0x0},\n\t533:  {region: 0x164, script: 0x52, flags: 0x0},\n\t534:  {region: 0xd3, script: 0x5, flags: 0x0},\n\t535:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t536:  {region: 0x163, script: 0x52, flags: 0x0},\n\t537:  {region: 0x164, script: 0x52, flags: 0x0},\n\t538:  {region: 0x164, script: 0x52, flags: 0x0},\n\t539:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t540:  {region: 0x121, script: 0x5, flags: 0x0},\n\t541:  {region: 0x164, script: 0x52, flags: 0x0},\n\t542:  {region: 0x122, script: 0xd5, flags: 0x0},\n\t543:  {region: 0x59, script: 0x52, flags: 0x0},\n\t544:  {region: 0x51, script: 0x52, flags: 0x0},\n\t545:  {region: 0x164, script: 0x52, flags: 0x0},\n\t546:  {region: 0x4e, script: 0x52, flags: 0x0},\n\t547:  {region: 0x98, script: 0x20, flags: 0x0},\n\t548:  {region: 0x98, script: 0x20, flags: 0x0},\n\t549:  {region: 0x4a, script: 0x52, flags: 0x0},\n\t550:  {region: 0x94, script: 0x52, flags: 0x0},\n\t551:  {region: 0x164, script: 0x52, flags: 0x0},\n\t552:  {region: 0x40, script: 0x52, flags: 0x0},\n\t553:  {region: 0x98, script: 0x52, flags: 0x0},\n\t554:  {region: 0x52, script: 0xcc, flags: 0x0},\n\t555:  {region: 0x98, script: 0x20, flags: 0x0},\n\t556:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t557:  {region: 0x164, script: 0x52, flags: 0x0},\n\t558:  {region: 0x98, script: 0x6b, flags: 0x0},\n\t559:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t560:  {region: 0x164, script: 0x52, flags: 0x0},\n\t561:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t562:  {region: 0x164, script: 0x52, flags: 0x0},\n\t563:  {region: 0x12a, script: 0x52, flags: 0x0},\n\t564:  {region: 0x164, script: 0x52, flags: 0x0},\n\t565:  {region: 0xd1, script: 0x52, flags: 0x0},\n\t566:  {region: 0x164, script: 0x52, flags: 0x0},\n\t567:  {region: 0xae, script: 0x4f, flags: 0x0},\n\t568:  {region: 0x164, script: 0x52, flags: 0x0},\n\t569:  {region: 0x164, script: 0x52, flags: 0x0},\n\t570:  {region: 0x15, script: 0x6, flags: 0x1},\n\t571:  {region: 0x164, script: 0x52, flags: 0x0},\n\t572:  {region: 0x51, script: 0x52, flags: 0x0},\n\t573:  {region: 0x81, script: 0x52, flags: 0x0},\n\t574:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t575:  {region: 0x164, script: 0x52, flags: 0x0},\n\t576:  {region: 0x164, script: 0x52, flags: 0x0},\n\t577:  {region: 0x164, script: 0x52, flags: 0x0},\n\t578:  {region: 0xa5, script: 0x46, flags: 0x0},\n\t579:  {region: 0x29, script: 0x52, flags: 0x0},\n\t580:  {region: 0x164, script: 0x52, flags: 0x0},\n\t581:  {region: 0x164, script: 0x52, flags: 0x0},\n\t582:  {region: 0x164, script: 0x52, flags: 0x0},\n\t583:  {region: 0x164, script: 0x52, flags: 0x0},\n\t584:  {region: 0x164, script: 0x52, flags: 0x0},\n\t585:  {region: 0x98, script: 0x4a, flags: 0x0},\n\t586:  {region: 0x164, script: 0x52, flags: 0x0},\n\t587:  {region: 0xaa, script: 0x4b, flags: 0x0},\n\t588:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t589:  {region: 0x98, script: 0x20, flags: 0x0},\n\t590:  {region: 0x164, script: 0x52, flags: 0x0},\n\t591:  {region: 0x74, script: 0x52, flags: 0x0},\n\t592:  {region: 0x164, script: 0x52, flags: 0x0},\n\t593:  {region: 0xb3, script: 0x52, flags: 0x0},\n\t594:  {region: 0x164, script: 0x52, flags: 0x0},\n\t595:  {region: 0x164, script: 0x52, flags: 0x0},\n\t596:  {region: 0x164, script: 0x52, flags: 0x0},\n\t597:  {region: 0x164, script: 0x52, flags: 0x0},\n\t598:  {region: 0x164, script: 0x52, flags: 0x0},\n\t599:  {region: 0x164, script: 0x52, flags: 0x0},\n\t600:  {region: 0x164, script: 0x52, flags: 0x0},\n\t601:  {region: 0x164, script: 0x27, flags: 0x0},\n\t603:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t604:  {region: 0x111, script: 0x52, flags: 0x0},\n\t605:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t606:  {region: 0x105, script: 0x52, flags: 0x0},\n\t607:  {region: 0x164, script: 0x52, flags: 0x0},\n\t608:  {region: 0x98, script: 0x20, flags: 0x0},\n\t609:  {region: 0x98, script: 0x5, flags: 0x0},\n\t610:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t611:  {region: 0x164, script: 0x52, flags: 0x0},\n\t612:  {region: 0x51, script: 0x52, flags: 0x0},\n\t613:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t614:  {region: 0x164, script: 0x52, flags: 0x0},\n\t615:  {region: 0x164, script: 0x52, flags: 0x0},\n\t616:  {region: 0x164, script: 0x27, flags: 0x0},\n\t617:  {region: 0x164, script: 0x52, flags: 0x0},\n\t618:  {region: 0x164, script: 0x52, flags: 0x0},\n\t619:  {region: 0x1b, script: 0x3, flags: 0x1},\n\t620:  {region: 0x164, script: 0x52, flags: 0x0},\n\t621:  {region: 0x164, script: 0x52, flags: 0x0},\n\t622:  {region: 0x164, script: 0x52, flags: 0x0},\n\t623:  {region: 0x164, script: 0x52, flags: 0x0},\n\t624:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t625:  {region: 0x164, script: 0x52, flags: 0x0},\n\t626:  {region: 0x164, script: 0x52, flags: 0x0},\n\t627:  {region: 0x164, script: 0x52, flags: 0x0},\n\t628:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t629:  {region: 0x164, script: 0x52, flags: 0x0},\n\t630:  {region: 0x94, script: 0x52, flags: 0x0},\n\t631:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t632:  {region: 0x7a, script: 0x52, flags: 0x0},\n\t633:  {region: 0x164, script: 0x52, flags: 0x0},\n\t634:  {region: 0x164, script: 0x52, flags: 0x0},\n\t635:  {region: 0x164, script: 0x52, flags: 0x0},\n\t636:  {region: 0x164, script: 0x27, flags: 0x0},\n\t637:  {region: 0x122, script: 0xd5, flags: 0x0},\n\t638:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t639:  {region: 0x164, script: 0x52, flags: 0x0},\n\t640:  {region: 0x164, script: 0x52, flags: 0x0},\n\t641:  {region: 0x1e, script: 0x5, flags: 0x1},\n\t642:  {region: 0x164, script: 0x52, flags: 0x0},\n\t643:  {region: 0x164, script: 0x52, flags: 0x0},\n\t644:  {region: 0x164, script: 0x52, flags: 0x0},\n\t645:  {region: 0x137, script: 0x52, flags: 0x0},\n\t646:  {region: 0x86, script: 0x56, flags: 0x0},\n\t647:  {region: 0x96, script: 0x37, flags: 0x0},\n\t648:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t649:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t650:  {region: 0x130, script: 0x52, flags: 0x0},\n\t651:  {region: 0x164, script: 0x52, flags: 0x0},\n\t652:  {region: 0xb6, script: 0x52, flags: 0x0},\n\t653:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t654:  {region: 0x164, script: 0x52, flags: 0x0},\n\t655:  {region: 0x94, script: 0x52, flags: 0x0},\n\t656:  {region: 0x164, script: 0x52, flags: 0x0},\n\t657:  {region: 0x52, script: 0xd5, flags: 0x0},\n\t658:  {region: 0x164, script: 0x52, flags: 0x0},\n\t659:  {region: 0x164, script: 0x52, flags: 0x0},\n\t660:  {region: 0x164, script: 0x52, flags: 0x0},\n\t661:  {region: 0x164, script: 0x52, flags: 0x0},\n\t662:  {region: 0x98, script: 0x54, flags: 0x0},\n\t663:  {region: 0x164, script: 0x52, flags: 0x0},\n\t664:  {region: 0x164, script: 0x52, flags: 0x0},\n\t665:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t666:  {region: 0x130, script: 0x52, flags: 0x0},\n\t667:  {region: 0x164, script: 0x52, flags: 0x0},\n\t668:  {region: 0xd8, script: 0x52, flags: 0x0},\n\t669:  {region: 0x164, script: 0x52, flags: 0x0},\n\t670:  {region: 0x164, script: 0x52, flags: 0x0},\n\t671:  {region: 0x23, script: 0x2, flags: 0x1},\n\t672:  {region: 0x164, script: 0x52, flags: 0x0},\n\t673:  {region: 0x164, script: 0x52, flags: 0x0},\n\t674:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t675:  {region: 0x52, script: 0x58, flags: 0x0},\n\t676:  {region: 0x94, script: 0x52, flags: 0x0},\n\t677:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t678:  {region: 0x134, script: 0x52, flags: 0x0},\n\t679:  {region: 0x164, script: 0x52, flags: 0x0},\n\t680:  {region: 0x164, script: 0x52, flags: 0x0},\n\t681:  {region: 0x98, script: 0xd0, flags: 0x0},\n\t682:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t683:  {region: 0x164, script: 0x52, flags: 0x0},\n\t684:  {region: 0x4a, script: 0x52, flags: 0x0},\n\t685:  {region: 0x164, script: 0x52, flags: 0x0},\n\t686:  {region: 0x164, script: 0x52, flags: 0x0},\n\t687:  {region: 0xae, script: 0x4f, flags: 0x0},\n\t688:  {region: 0x164, script: 0x52, flags: 0x0},\n\t689:  {region: 0x164, script: 0x52, flags: 0x0},\n\t690:  {region: 0x4a, script: 0x52, flags: 0x0},\n\t691:  {region: 0x164, script: 0x52, flags: 0x0},\n\t692:  {region: 0x164, script: 0x52, flags: 0x0},\n\t693:  {region: 0x161, script: 0x52, flags: 0x0},\n\t694:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t695:  {region: 0xb5, script: 0x52, flags: 0x0},\n\t696:  {region: 0xb7, script: 0x52, flags: 0x0},\n\t697:  {region: 0x4a, script: 0x52, flags: 0x0},\n\t698:  {region: 0x4a, script: 0x52, flags: 0x0},\n\t699:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t700:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t701:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t702:  {region: 0xb7, script: 0x52, flags: 0x0},\n\t703:  {region: 0x122, script: 0xd5, flags: 0x0},\n\t704:  {region: 0x52, script: 0x34, flags: 0x0},\n\t705:  {region: 0x12a, script: 0x52, flags: 0x0},\n\t706:  {region: 0x94, script: 0x52, flags: 0x0},\n\t707:  {region: 0x51, script: 0x52, flags: 0x0},\n\t708:  {region: 0x98, script: 0x20, flags: 0x0},\n\t709:  {region: 0x98, script: 0x20, flags: 0x0},\n\t710:  {region: 0x94, script: 0x52, flags: 0x0},\n\t711:  {region: 0x25, script: 0x3, flags: 0x1},\n\t712:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t713:  {region: 0x164, script: 0x52, flags: 0x0},\n\t714:  {region: 0xce, script: 0x52, flags: 0x0},\n\t715:  {region: 0x164, script: 0x52, flags: 0x0},\n\t716:  {region: 0x164, script: 0x52, flags: 0x0},\n\t717:  {region: 0x164, script: 0x52, flags: 0x0},\n\t718:  {region: 0x164, script: 0x52, flags: 0x0},\n\t719:  {region: 0x164, script: 0x52, flags: 0x0},\n\t720:  {region: 0x164, script: 0x52, flags: 0x0},\n\t721:  {region: 0x164, script: 0x52, flags: 0x0},\n\t722:  {region: 0x164, script: 0x52, flags: 0x0},\n\t723:  {region: 0x164, script: 0x52, flags: 0x0},\n\t724:  {region: 0x164, script: 0x52, flags: 0x0},\n\t725:  {region: 0x164, script: 0x52, flags: 0x0},\n\t726:  {region: 0x164, script: 0x5, flags: 0x0},\n\t727:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t728:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t729:  {region: 0x164, script: 0x52, flags: 0x0},\n\t730:  {region: 0x94, script: 0x52, flags: 0x0},\n\t731:  {region: 0x164, script: 0x27, flags: 0x0},\n\t732:  {region: 0x164, script: 0x52, flags: 0x0},\n\t733:  {region: 0x164, script: 0x52, flags: 0x0},\n\t734:  {region: 0x164, script: 0x52, flags: 0x0},\n\t735:  {region: 0x111, script: 0x52, flags: 0x0},\n\t736:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t737:  {region: 0x164, script: 0x52, flags: 0x0},\n\t738:  {region: 0x164, script: 0x52, flags: 0x0},\n\t739:  {region: 0x122, script: 0x5, flags: 0x0},\n\t740:  {region: 0xcb, script: 0x52, flags: 0x0},\n\t741:  {region: 0x164, script: 0x52, flags: 0x0},\n\t742:  {region: 0x164, script: 0x52, flags: 0x0},\n\t743:  {region: 0x164, script: 0x52, flags: 0x0},\n\t744:  {region: 0xbe, script: 0x52, flags: 0x0},\n\t745:  {region: 0xd0, script: 0x52, flags: 0x0},\n\t746:  {region: 0x164, script: 0x52, flags: 0x0},\n\t747:  {region: 0x51, script: 0x52, flags: 0x0},\n\t748:  {region: 0xda, script: 0x20, flags: 0x0},\n\t749:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t750:  {region: 0xbf, script: 0x52, flags: 0x0},\n\t751:  {region: 0x164, script: 0x52, flags: 0x0},\n\t752:  {region: 0x164, script: 0x52, flags: 0x0},\n\t753:  {region: 0xdf, script: 0x52, flags: 0x0},\n\t754:  {region: 0x164, script: 0x52, flags: 0x0},\n\t755:  {region: 0x94, script: 0x52, flags: 0x0},\n\t756:  {region: 0x9a, script: 0x36, flags: 0x0},\n\t757:  {region: 0x164, script: 0x52, flags: 0x0},\n\t758:  {region: 0xc1, script: 0x1e, flags: 0x0},\n\t759:  {region: 0x164, script: 0x5, flags: 0x0},\n\t760:  {region: 0x164, script: 0x52, flags: 0x0},\n\t761:  {region: 0x164, script: 0x52, flags: 0x0},\n\t762:  {region: 0x164, script: 0x52, flags: 0x0},\n\t763:  {region: 0x98, script: 0x64, flags: 0x0},\n\t764:  {region: 0x164, script: 0x52, flags: 0x0},\n\t765:  {region: 0x164, script: 0x52, flags: 0x0},\n\t766:  {region: 0x10a, script: 0x52, flags: 0x0},\n\t767:  {region: 0x164, script: 0x52, flags: 0x0},\n\t768:  {region: 0x164, script: 0x52, flags: 0x0},\n\t769:  {region: 0x164, script: 0x52, flags: 0x0},\n\t770:  {region: 0x28, script: 0x3, flags: 0x1},\n\t771:  {region: 0x164, script: 0x52, flags: 0x0},\n\t772:  {region: 0x164, script: 0x52, flags: 0x0},\n\t773:  {region: 0x98, script: 0xe, flags: 0x0},\n\t774:  {region: 0xc3, script: 0x6b, flags: 0x0},\n\t776:  {region: 0x164, script: 0x52, flags: 0x0},\n\t777:  {region: 0x48, script: 0x52, flags: 0x0},\n\t778:  {region: 0x48, script: 0x52, flags: 0x0},\n\t779:  {region: 0x36, script: 0x52, flags: 0x0},\n\t780:  {region: 0x164, script: 0x52, flags: 0x0},\n\t781:  {region: 0x164, script: 0x52, flags: 0x0},\n\t782:  {region: 0x164, script: 0x52, flags: 0x0},\n\t783:  {region: 0x164, script: 0x52, flags: 0x0},\n\t784:  {region: 0x164, script: 0x52, flags: 0x0},\n\t785:  {region: 0x164, script: 0x52, flags: 0x0},\n\t786:  {region: 0x98, script: 0x20, flags: 0x0},\n\t787:  {region: 0xda, script: 0x20, flags: 0x0},\n\t788:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t789:  {region: 0x34, script: 0x68, flags: 0x0},\n\t790:  {region: 0x2b, script: 0x3, flags: 0x1},\n\t791:  {region: 0xca, script: 0x52, flags: 0x0},\n\t792:  {region: 0x164, script: 0x52, flags: 0x0},\n\t793:  {region: 0x164, script: 0x52, flags: 0x0},\n\t794:  {region: 0x164, script: 0x52, flags: 0x0},\n\t795:  {region: 0x98, script: 0x20, flags: 0x0},\n\t796:  {region: 0x51, script: 0x52, flags: 0x0},\n\t798:  {region: 0x164, script: 0x52, flags: 0x0},\n\t799:  {region: 0x134, script: 0x52, flags: 0x0},\n\t800:  {region: 0x164, script: 0x52, flags: 0x0},\n\t801:  {region: 0x164, script: 0x52, flags: 0x0},\n\t802:  {region: 0xe7, script: 0x5, flags: 0x0},\n\t803:  {region: 0xc2, script: 0x52, flags: 0x0},\n\t804:  {region: 0x98, script: 0x20, flags: 0x0},\n\t805:  {region: 0x94, script: 0x52, flags: 0x0},\n\t806:  {region: 0x163, script: 0x52, flags: 0x0},\n\t807:  {region: 0x164, script: 0x52, flags: 0x0},\n\t808:  {region: 0xc3, script: 0x6b, flags: 0x0},\n\t809:  {region: 0x164, script: 0x52, flags: 0x0},\n\t810:  {region: 0x164, script: 0x27, flags: 0x0},\n\t811:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t812:  {region: 0x164, script: 0x52, flags: 0x0},\n\t813:  {region: 0x130, script: 0x52, flags: 0x0},\n\t814:  {region: 0x9b, script: 0x5d, flags: 0x0},\n\t815:  {region: 0x164, script: 0x52, flags: 0x0},\n\t816:  {region: 0x164, script: 0x52, flags: 0x0},\n\t817:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t818:  {region: 0x164, script: 0x52, flags: 0x0},\n\t819:  {region: 0x164, script: 0x52, flags: 0x0},\n\t820:  {region: 0x164, script: 0x52, flags: 0x0},\n\t821:  {region: 0xdc, script: 0x52, flags: 0x0},\n\t822:  {region: 0x164, script: 0x52, flags: 0x0},\n\t823:  {region: 0x164, script: 0x52, flags: 0x0},\n\t825:  {region: 0x164, script: 0x52, flags: 0x0},\n\t826:  {region: 0x52, script: 0x34, flags: 0x0},\n\t827:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t828:  {region: 0xd1, script: 0x52, flags: 0x0},\n\t829:  {region: 0x164, script: 0x52, flags: 0x0},\n\t830:  {region: 0xd9, script: 0x52, flags: 0x0},\n\t831:  {region: 0x164, script: 0x52, flags: 0x0},\n\t832:  {region: 0x164, script: 0x52, flags: 0x0},\n\t833:  {region: 0x164, script: 0x52, flags: 0x0},\n\t834:  {region: 0xce, script: 0x52, flags: 0x0},\n\t835:  {region: 0x164, script: 0x52, flags: 0x0},\n\t836:  {region: 0x164, script: 0x52, flags: 0x0},\n\t837:  {region: 0x163, script: 0x52, flags: 0x0},\n\t838:  {region: 0xd0, script: 0x52, flags: 0x0},\n\t839:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t840:  {region: 0xda, script: 0x20, flags: 0x0},\n\t841:  {region: 0x164, script: 0x52, flags: 0x0},\n\t842:  {region: 0xda, script: 0x20, flags: 0x0},\n\t843:  {region: 0x164, script: 0x52, flags: 0x0},\n\t844:  {region: 0x164, script: 0x52, flags: 0x0},\n\t845:  {region: 0xd1, script: 0x52, flags: 0x0},\n\t846:  {region: 0x164, script: 0x52, flags: 0x0},\n\t847:  {region: 0x164, script: 0x52, flags: 0x0},\n\t848:  {region: 0xd0, script: 0x52, flags: 0x0},\n\t849:  {region: 0x164, script: 0x52, flags: 0x0},\n\t850:  {region: 0xce, script: 0x52, flags: 0x0},\n\t851:  {region: 0xce, script: 0x52, flags: 0x0},\n\t852:  {region: 0x164, script: 0x52, flags: 0x0},\n\t853:  {region: 0x164, script: 0x52, flags: 0x0},\n\t854:  {region: 0x94, script: 0x52, flags: 0x0},\n\t855:  {region: 0x164, script: 0x52, flags: 0x0},\n\t856:  {region: 0xde, script: 0x52, flags: 0x0},\n\t857:  {region: 0x164, script: 0x52, flags: 0x0},\n\t858:  {region: 0x164, script: 0x52, flags: 0x0},\n\t859:  {region: 0x98, script: 0x52, flags: 0x0},\n\t860:  {region: 0x164, script: 0x52, flags: 0x0},\n\t861:  {region: 0x164, script: 0x52, flags: 0x0},\n\t862:  {region: 0xd8, script: 0x52, flags: 0x0},\n\t863:  {region: 0x51, script: 0x52, flags: 0x0},\n\t864:  {region: 0x164, script: 0x52, flags: 0x0},\n\t865:  {region: 0xd9, script: 0x52, flags: 0x0},\n\t866:  {region: 0x164, script: 0x52, flags: 0x0},\n\t867:  {region: 0x51, script: 0x52, flags: 0x0},\n\t868:  {region: 0x164, script: 0x52, flags: 0x0},\n\t869:  {region: 0x164, script: 0x52, flags: 0x0},\n\t870:  {region: 0xd9, script: 0x52, flags: 0x0},\n\t871:  {region: 0x122, script: 0x4e, flags: 0x0},\n\t872:  {region: 0x98, script: 0x20, flags: 0x0},\n\t873:  {region: 0x10b, script: 0xb7, flags: 0x0},\n\t874:  {region: 0x164, script: 0x52, flags: 0x0},\n\t875:  {region: 0x164, script: 0x52, flags: 0x0},\n\t876:  {region: 0x83, script: 0x70, flags: 0x0},\n\t877:  {region: 0x160, script: 0x52, flags: 0x0},\n\t878:  {region: 0x164, script: 0x52, flags: 0x0},\n\t879:  {region: 0x48, script: 0x17, flags: 0x0},\n\t880:  {region: 0x164, script: 0x52, flags: 0x0},\n\t881:  {region: 0x160, script: 0x52, flags: 0x0},\n\t882:  {region: 0x164, script: 0x52, flags: 0x0},\n\t883:  {region: 0x164, script: 0x52, flags: 0x0},\n\t884:  {region: 0x164, script: 0x52, flags: 0x0},\n\t885:  {region: 0x164, script: 0x52, flags: 0x0},\n\t886:  {region: 0x164, script: 0x52, flags: 0x0},\n\t887:  {region: 0x116, script: 0x52, flags: 0x0},\n\t888:  {region: 0x164, script: 0x52, flags: 0x0},\n\t889:  {region: 0x164, script: 0x52, flags: 0x0},\n\t890:  {region: 0x134, script: 0x52, flags: 0x0},\n\t891:  {region: 0x164, script: 0x52, flags: 0x0},\n\t892:  {region: 0x52, script: 0x52, flags: 0x0},\n\t893:  {region: 0x164, script: 0x52, flags: 0x0},\n\t894:  {region: 0xcd, script: 0x52, flags: 0x0},\n\t895:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t896:  {region: 0x130, script: 0x52, flags: 0x0},\n\t897:  {region: 0x7f, script: 0x52, flags: 0x0},\n\t898:  {region: 0x77, script: 0x52, flags: 0x0},\n\t899:  {region: 0x164, script: 0x52, flags: 0x0},\n\t901:  {region: 0x164, script: 0x52, flags: 0x0},\n\t902:  {region: 0x164, script: 0x52, flags: 0x0},\n\t903:  {region: 0x6e, script: 0x52, flags: 0x0},\n\t904:  {region: 0x164, script: 0x52, flags: 0x0},\n\t905:  {region: 0x164, script: 0x52, flags: 0x0},\n\t906:  {region: 0x164, script: 0x52, flags: 0x0},\n\t907:  {region: 0x164, script: 0x52, flags: 0x0},\n\t908:  {region: 0x98, script: 0x75, flags: 0x0},\n\t909:  {region: 0x164, script: 0x52, flags: 0x0},\n\t910:  {region: 0x164, script: 0x5, flags: 0x0},\n\t911:  {region: 0x7c, script: 0x1e, flags: 0x0},\n\t912:  {region: 0x134, script: 0x76, flags: 0x0},\n\t913:  {region: 0x164, script: 0x5, flags: 0x0},\n\t914:  {region: 0xc4, script: 0x74, flags: 0x0},\n\t915:  {region: 0x164, script: 0x52, flags: 0x0},\n\t916:  {region: 0x2e, script: 0x3, flags: 0x1},\n\t917:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t918:  {region: 0x31, script: 0x2, flags: 0x1},\n\t919:  {region: 0xe6, script: 0x52, flags: 0x0},\n\t920:  {region: 0x2f, script: 0x52, flags: 0x0},\n\t921:  {region: 0xef, script: 0x52, flags: 0x0},\n\t922:  {region: 0x164, script: 0x52, flags: 0x0},\n\t923:  {region: 0x77, script: 0x52, flags: 0x0},\n\t924:  {region: 0xd5, script: 0x52, flags: 0x0},\n\t925:  {region: 0x134, script: 0x52, flags: 0x0},\n\t926:  {region: 0x48, script: 0x52, flags: 0x0},\n\t927:  {region: 0x164, script: 0x52, flags: 0x0},\n\t928:  {region: 0x9b, script: 0xdd, flags: 0x0},\n\t929:  {region: 0x164, script: 0x52, flags: 0x0},\n\t930:  {region: 0x5f, script: 0x52, flags: 0x0},\n\t931:  {region: 0x164, script: 0x5, flags: 0x0},\n\t932:  {region: 0xaf, script: 0x7f, flags: 0x0},\n\t934:  {region: 0x164, script: 0x52, flags: 0x0},\n\t935:  {region: 0x164, script: 0x52, flags: 0x0},\n\t936:  {region: 0x98, script: 0x12, flags: 0x0},\n\t937:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t938:  {region: 0xe8, script: 0x52, flags: 0x0},\n\t939:  {region: 0x164, script: 0x52, flags: 0x0},\n\t940:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t941:  {region: 0x164, script: 0x52, flags: 0x0},\n\t942:  {region: 0x164, script: 0x52, flags: 0x0},\n\t943:  {region: 0x86, script: 0x2d, flags: 0x0},\n\t944:  {region: 0x74, script: 0x52, flags: 0x0},\n\t945:  {region: 0x164, script: 0x52, flags: 0x0},\n\t946:  {region: 0xe7, script: 0x45, flags: 0x0},\n\t947:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t948:  {region: 0x1, script: 0x52, flags: 0x0},\n\t949:  {region: 0x23, script: 0x5, flags: 0x0},\n\t950:  {region: 0x164, script: 0x52, flags: 0x0},\n\t951:  {region: 0x40, script: 0x52, flags: 0x0},\n\t952:  {region: 0x164, script: 0x52, flags: 0x0},\n\t953:  {region: 0x79, script: 0x52, flags: 0x0},\n\t954:  {region: 0x164, script: 0x52, flags: 0x0},\n\t955:  {region: 0xe3, script: 0x52, flags: 0x0},\n\t956:  {region: 0x88, script: 0x52, flags: 0x0},\n\t957:  {region: 0x68, script: 0x52, flags: 0x0},\n\t958:  {region: 0x164, script: 0x52, flags: 0x0},\n\t959:  {region: 0x98, script: 0x20, flags: 0x0},\n\t960:  {region: 0x164, script: 0x52, flags: 0x0},\n\t961:  {region: 0x101, script: 0x52, flags: 0x0},\n\t962:  {region: 0x94, script: 0x52, flags: 0x0},\n\t963:  {region: 0x164, script: 0x52, flags: 0x0},\n\t964:  {region: 0x164, script: 0x52, flags: 0x0},\n\t965:  {region: 0x9d, script: 0x52, flags: 0x0},\n\t966:  {region: 0x164, script: 0x5, flags: 0x0},\n\t967:  {region: 0x98, script: 0x52, flags: 0x0},\n\t968:  {region: 0x33, script: 0x2, flags: 0x1},\n\t969:  {region: 0xda, script: 0x20, flags: 0x0},\n\t970:  {region: 0x34, script: 0xe, flags: 0x0},\n\t971:  {region: 0x4d, script: 0x52, flags: 0x0},\n\t972:  {region: 0x71, script: 0x52, flags: 0x0},\n\t973:  {region: 0x4d, script: 0x52, flags: 0x0},\n\t974:  {region: 0x9b, script: 0x5, flags: 0x0},\n\t975:  {region: 0x10b, script: 0x52, flags: 0x0},\n\t976:  {region: 0x39, script: 0x52, flags: 0x0},\n\t977:  {region: 0x164, script: 0x52, flags: 0x0},\n\t978:  {region: 0xd0, script: 0x52, flags: 0x0},\n\t979:  {region: 0x103, script: 0x52, flags: 0x0},\n\t980:  {region: 0x94, script: 0x52, flags: 0x0},\n\t981:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t982:  {region: 0x164, script: 0x52, flags: 0x0},\n\t983:  {region: 0x164, script: 0x52, flags: 0x0},\n\t984:  {region: 0x72, script: 0x52, flags: 0x0},\n\t985:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t986:  {region: 0x12f, script: 0x1e, flags: 0x0},\n\t987:  {region: 0x108, script: 0x52, flags: 0x0},\n\t988:  {region: 0x106, script: 0x52, flags: 0x0},\n\t989:  {region: 0x12e, script: 0x52, flags: 0x0},\n\t990:  {region: 0x164, script: 0x52, flags: 0x0},\n\t991:  {region: 0xa1, script: 0x44, flags: 0x0},\n\t992:  {region: 0x98, script: 0x20, flags: 0x0},\n\t993:  {region: 0x7f, script: 0x52, flags: 0x0},\n\t994:  {region: 0x105, script: 0x1e, flags: 0x0},\n\t995:  {region: 0xa3, script: 0x52, flags: 0x0},\n\t996:  {region: 0x94, script: 0x52, flags: 0x0},\n\t997:  {region: 0x98, script: 0x52, flags: 0x0},\n\t998:  {region: 0x98, script: 0xbb, flags: 0x0},\n\t999:  {region: 0x164, script: 0x52, flags: 0x0},\n\t1000: {region: 0x164, script: 0x52, flags: 0x0},\n\t1001: {region: 0x12e, script: 0x52, flags: 0x0},\n\t1002: {region: 0x9d, script: 0x52, flags: 0x0},\n\t1003: {region: 0x98, script: 0x20, flags: 0x0},\n\t1004: {region: 0x164, script: 0x5, flags: 0x0},\n\t1005: {region: 0x9d, script: 0x52, flags: 0x0},\n\t1006: {region: 0x7a, script: 0x52, flags: 0x0},\n\t1007: {region: 0x48, script: 0x52, flags: 0x0},\n\t1008: {region: 0x35, script: 0x4, flags: 0x1},\n\t1009: {region: 0x9d, script: 0x52, flags: 0x0},\n\t1010: {region: 0x9b, script: 0x5, flags: 0x0},\n\t1011: {region: 0xd9, script: 0x52, flags: 0x0},\n\t1012: {region: 0x4e, script: 0x52, flags: 0x0},\n\t1013: {region: 0xd0, script: 0x52, flags: 0x0},\n\t1014: {region: 0xce, script: 0x52, flags: 0x0},\n\t1015: {region: 0xc2, script: 0x52, flags: 0x0},\n\t1016: {region: 0x4b, script: 0x52, flags: 0x0},\n\t1017: {region: 0x95, script: 0x72, flags: 0x0},\n\t1018: {region: 0xb5, script: 0x52, flags: 0x0},\n\t1019: {region: 0x164, script: 0x27, flags: 0x0},\n\t1020: {region: 0x164, script: 0x52, flags: 0x0},\n\t1022: {region: 0xb9, script: 0xd2, flags: 0x0},\n\t1023: {region: 0x164, script: 0x52, flags: 0x0},\n\t1024: {region: 0xc3, script: 0x6b, flags: 0x0},\n\t1025: {region: 0x164, script: 0x5, flags: 0x0},\n\t1026: {region: 0xb2, script: 0xc1, flags: 0x0},\n\t1027: {region: 0x6e, script: 0x52, flags: 0x0},\n\t1028: {region: 0x164, script: 0x52, flags: 0x0},\n\t1029: {region: 0x164, script: 0x52, flags: 0x0},\n\t1030: {region: 0x164, script: 0x52, flags: 0x0},\n\t1031: {region: 0x164, script: 0x52, flags: 0x0},\n\t1032: {region: 0x110, script: 0x52, flags: 0x0},\n\t1033: {region: 0x164, script: 0x52, flags: 0x0},\n\t1034: {region: 0xe7, script: 0x5, flags: 0x0},\n\t1035: {region: 0x164, script: 0x52, flags: 0x0},\n\t1036: {region: 0x10e, script: 0x52, flags: 0x0},\n\t1037: {region: 0x164, script: 0x52, flags: 0x0},\n\t1038: {region: 0xe8, script: 0x52, flags: 0x0},\n\t1039: {region: 0x164, script: 0x52, flags: 0x0},\n\t1040: {region: 0x94, script: 0x52, flags: 0x0},\n\t1041: {region: 0x141, script: 0x52, flags: 0x0},\n\t1042: {region: 0x10b, script: 0x52, flags: 0x0},\n\t1044: {region: 0x10b, script: 0x52, flags: 0x0},\n\t1045: {region: 0x71, script: 0x52, flags: 0x0},\n\t1046: {region: 0x96, script: 0xb8, flags: 0x0},\n\t1047: {region: 0x164, script: 0x52, flags: 0x0},\n\t1048: {region: 0x71, script: 0x52, flags: 0x0},\n\t1049: {region: 0x163, script: 0x52, flags: 0x0},\n\t1050: {region: 0x164, script: 0x52, flags: 0x0},\n\t1051: {region: 0xc2, script: 0x52, flags: 0x0},\n\t1052: {region: 0x164, script: 0x52, flags: 0x0},\n\t1053: {region: 0x164, script: 0x52, flags: 0x0},\n\t1054: {region: 0x164, script: 0x52, flags: 0x0},\n\t1055: {region: 0x114, script: 0x52, flags: 0x0},\n\t1056: {region: 0x164, script: 0x52, flags: 0x0},\n\t1057: {region: 0x164, script: 0x52, flags: 0x0},\n\t1058: {region: 0x122, script: 0xd5, flags: 0x0},\n\t1059: {region: 0x164, script: 0x52, flags: 0x0},\n\t1060: {region: 0x164, script: 0x52, flags: 0x0},\n\t1061: {region: 0x164, script: 0x52, flags: 0x0},\n\t1062: {region: 0x164, script: 0x52, flags: 0x0},\n\t1063: {region: 0x26, script: 0x52, flags: 0x0},\n\t1064: {region: 0x39, script: 0x5, flags: 0x1},\n\t1065: {region: 0x98, script: 0xc2, flags: 0x0},\n\t1066: {region: 0x115, script: 0x52, flags: 0x0},\n\t1067: {region: 0x113, script: 0x52, flags: 0x0},\n\t1068: {region: 0x98, script: 0x20, flags: 0x0},\n\t1069: {region: 0x160, script: 0x52, flags: 0x0},\n\t1070: {region: 0x164, script: 0x52, flags: 0x0},\n\t1071: {region: 0x164, script: 0x52, flags: 0x0},\n\t1072: {region: 0x6c, script: 0x52, flags: 0x0},\n\t1073: {region: 0x160, script: 0x52, flags: 0x0},\n\t1074: {region: 0x164, script: 0x52, flags: 0x0},\n\t1075: {region: 0x5f, script: 0x52, flags: 0x0},\n\t1076: {region: 0x94, script: 0x52, flags: 0x0},\n\t1077: {region: 0x164, script: 0x52, flags: 0x0},\n\t1078: {region: 0x164, script: 0x52, flags: 0x0},\n\t1079: {region: 0x12e, script: 0x52, flags: 0x0},\n\t1080: {region: 0x164, script: 0x52, flags: 0x0},\n\t1081: {region: 0x83, script: 0x52, flags: 0x0},\n\t1082: {region: 0x10b, script: 0x52, flags: 0x0},\n\t1083: {region: 0x12e, script: 0x52, flags: 0x0},\n\t1084: {region: 0x15e, script: 0x5, flags: 0x0},\n\t1085: {region: 0x4a, script: 0x52, flags: 0x0},\n\t1086: {region: 0x5f, script: 0x52, flags: 0x0},\n\t1087: {region: 0x164, script: 0x52, flags: 0x0},\n\t1088: {region: 0x98, script: 0x20, flags: 0x0},\n\t1089: {region: 0x94, script: 0x52, flags: 0x0},\n\t1090: {region: 0x164, script: 0x52, flags: 0x0},\n\t1091: {region: 0x34, script: 0xe, flags: 0x0},\n\t1092: {region: 0x9a, script: 0xc5, flags: 0x0},\n\t1093: {region: 0xe8, script: 0x52, flags: 0x0},\n\t1094: {region: 0x98, script: 0xcd, flags: 0x0},\n\t1095: {region: 0xda, script: 0x20, flags: 0x0},\n\t1096: {region: 0x164, script: 0x52, flags: 0x0},\n\t1097: {region: 0x164, script: 0x52, flags: 0x0},\n\t1098: {region: 0x164, script: 0x52, flags: 0x0},\n\t1099: {region: 0x164, script: 0x52, flags: 0x0},\n\t1100: {region: 0x164, script: 0x52, flags: 0x0},\n\t1101: {region: 0x164, script: 0x52, flags: 0x0},\n\t1102: {region: 0x164, script: 0x52, flags: 0x0},\n\t1103: {region: 0x164, script: 0x52, flags: 0x0},\n\t1104: {region: 0xe6, script: 0x52, flags: 0x0},\n\t1105: {region: 0x164, script: 0x52, flags: 0x0},\n\t1106: {region: 0x164, script: 0x52, flags: 0x0},\n\t1107: {region: 0x98, script: 0x4a, flags: 0x0},\n\t1108: {region: 0x52, script: 0xcb, flags: 0x0},\n\t1109: {region: 0xda, script: 0x20, flags: 0x0},\n\t1110: {region: 0xda, script: 0x20, flags: 0x0},\n\t1111: {region: 0x98, script: 0xd0, flags: 0x0},\n\t1112: {region: 0x164, script: 0x52, flags: 0x0},\n\t1113: {region: 0x111, script: 0x52, flags: 0x0},\n\t1114: {region: 0x130, script: 0x52, flags: 0x0},\n\t1115: {region: 0x125, script: 0x52, flags: 0x0},\n\t1116: {region: 0x164, script: 0x52, flags: 0x0},\n\t1117: {region: 0x3e, script: 0x3, flags: 0x1},\n\t1118: {region: 0x164, script: 0x52, flags: 0x0},\n\t1119: {region: 0x164, script: 0x52, flags: 0x0},\n\t1120: {region: 0x164, script: 0x52, flags: 0x0},\n\t1121: {region: 0x122, script: 0xd5, flags: 0x0},\n\t1122: {region: 0xda, script: 0x20, flags: 0x0},\n\t1123: {region: 0xda, script: 0x20, flags: 0x0},\n\t1124: {region: 0xda, script: 0x20, flags: 0x0},\n\t1125: {region: 0x6e, script: 0x27, flags: 0x0},\n\t1126: {region: 0x164, script: 0x52, flags: 0x0},\n\t1127: {region: 0x6c, script: 0x27, flags: 0x0},\n\t1128: {region: 0x164, script: 0x52, flags: 0x0},\n\t1129: {region: 0x164, script: 0x52, flags: 0x0},\n\t1130: {region: 0x164, script: 0x52, flags: 0x0},\n\t1131: {region: 0xd5, script: 0x52, flags: 0x0},\n\t1132: {region: 0x126, script: 0x52, flags: 0x0},\n\t1133: {region: 0x124, script: 0x52, flags: 0x0},\n\t1134: {region: 0x31, script: 0x52, flags: 0x0},\n\t1135: {region: 0xda, script: 0x20, flags: 0x0},\n\t1136: {region: 0xe6, script: 0x52, flags: 0x0},\n\t1137: {region: 0x164, script: 0x52, flags: 0x0},\n\t1138: {region: 0x164, script: 0x52, flags: 0x0},\n\t1139: {region: 0x31, script: 0x52, flags: 0x0},\n\t1140: {region: 0xd3, script: 0x52, flags: 0x0},\n\t1141: {region: 0x164, script: 0x52, flags: 0x0},\n\t1142: {region: 0x160, script: 0x52, flags: 0x0},\n\t1143: {region: 0x164, script: 0x52, flags: 0x0},\n\t1144: {region: 0x128, script: 0x52, flags: 0x0},\n\t1145: {region: 0x164, script: 0x52, flags: 0x0},\n\t1146: {region: 0xcd, script: 0x52, flags: 0x0},\n\t1147: {region: 0x164, script: 0x52, flags: 0x0},\n\t1148: {region: 0xe5, script: 0x52, flags: 0x0},\n\t1149: {region: 0x164, script: 0x52, flags: 0x0},\n\t1150: {region: 0x164, script: 0x52, flags: 0x0},\n\t1151: {region: 0x164, script: 0x52, flags: 0x0},\n\t1152: {region: 0x12a, script: 0x52, flags: 0x0},\n\t1153: {region: 0x12a, script: 0x52, flags: 0x0},\n\t1154: {region: 0x12d, script: 0x52, flags: 0x0},\n\t1155: {region: 0x164, script: 0x5, flags: 0x0},\n\t1156: {region: 0x160, script: 0x52, flags: 0x0},\n\t1157: {region: 0x86, script: 0x2d, flags: 0x0},\n\t1158: {region: 0xda, script: 0x20, flags: 0x0},\n\t1159: {region: 0xe6, script: 0x52, flags: 0x0},\n\t1160: {region: 0x42, script: 0xd6, flags: 0x0},\n\t1161: {region: 0x164, script: 0x52, flags: 0x0},\n\t1162: {region: 0x105, script: 0x1e, flags: 0x0},\n\t1163: {region: 0x164, script: 0x52, flags: 0x0},\n\t1164: {region: 0x164, script: 0x52, flags: 0x0},\n\t1165: {region: 0x130, script: 0x52, flags: 0x0},\n\t1166: {region: 0x164, script: 0x52, flags: 0x0},\n\t1167: {region: 0x122, script: 0xd5, flags: 0x0},\n\t1168: {region: 0x31, script: 0x52, flags: 0x0},\n\t1169: {region: 0x164, script: 0x52, flags: 0x0},\n\t1170: {region: 0x164, script: 0x52, flags: 0x0},\n\t1171: {region: 0xcd, script: 0x52, flags: 0x0},\n\t1172: {region: 0x164, script: 0x52, flags: 0x0},\n\t1173: {region: 0x164, script: 0x52, flags: 0x0},\n\t1174: {region: 0x12c, script: 0x52, flags: 0x0},\n\t1175: {region: 0x164, script: 0x52, flags: 0x0},\n\t1177: {region: 0x164, script: 0x52, flags: 0x0},\n\t1178: {region: 0xd3, script: 0x52, flags: 0x0},\n\t1179: {region: 0x52, script: 0xce, flags: 0x0},\n\t1180: {region: 0xe4, script: 0x52, flags: 0x0},\n\t1181: {region: 0x164, script: 0x52, flags: 0x0},\n\t1182: {region: 0x105, script: 0x1e, flags: 0x0},\n\t1183: {region: 0xb9, script: 0x52, flags: 0x0},\n\t1184: {region: 0x164, script: 0x52, flags: 0x0},\n\t1185: {region: 0x105, script: 0x1e, flags: 0x0},\n\t1186: {region: 0x41, script: 0x4, flags: 0x1},\n\t1187: {region: 0x11b, script: 0xd8, flags: 0x0},\n\t1188: {region: 0x12f, script: 0x1e, flags: 0x0},\n\t1189: {region: 0x74, script: 0x52, flags: 0x0},\n\t1190: {region: 0x29, script: 0x52, flags: 0x0},\n\t1192: {region: 0x45, script: 0x3, flags: 0x1},\n\t1193: {region: 0x98, script: 0xe, flags: 0x0},\n\t1194: {region: 0xe7, script: 0x5, flags: 0x0},\n\t1195: {region: 0x164, script: 0x52, flags: 0x0},\n\t1196: {region: 0x164, script: 0x52, flags: 0x0},\n\t1197: {region: 0x164, script: 0x52, flags: 0x0},\n\t1198: {region: 0x164, script: 0x52, flags: 0x0},\n\t1199: {region: 0x164, script: 0x52, flags: 0x0},\n\t1200: {region: 0x164, script: 0x52, flags: 0x0},\n\t1201: {region: 0x164, script: 0x52, flags: 0x0},\n\t1202: {region: 0x48, script: 0x4, flags: 0x1},\n\t1203: {region: 0x164, script: 0x52, flags: 0x0},\n\t1204: {region: 0xb3, script: 0xd9, flags: 0x0},\n\t1205: {region: 0x164, script: 0x52, flags: 0x0},\n\t1206: {region: 0x160, script: 0x52, flags: 0x0},\n\t1207: {region: 0x9d, script: 0x52, flags: 0x0},\n\t1208: {region: 0x105, script: 0x52, flags: 0x0},\n\t1209: {region: 0x13d, script: 0x52, flags: 0x0},\n\t1210: {region: 0x11a, script: 0x52, flags: 0x0},\n\t1211: {region: 0x164, script: 0x52, flags: 0x0},\n\t1212: {region: 0x35, script: 0x52, flags: 0x0},\n\t1213: {region: 0x5f, script: 0x52, flags: 0x0},\n\t1214: {region: 0xd0, script: 0x52, flags: 0x0},\n\t1215: {region: 0x1, script: 0x52, flags: 0x0},\n\t1216: {region: 0x105, script: 0x52, flags: 0x0},\n\t1217: {region: 0x69, script: 0x52, flags: 0x0},\n\t1218: {region: 0x12e, script: 0x52, flags: 0x0},\n\t1219: {region: 0x164, script: 0x52, flags: 0x0},\n\t1220: {region: 0x35, script: 0x52, flags: 0x0},\n\t1221: {region: 0x4d, script: 0x52, flags: 0x0},\n\t1222: {region: 0x164, script: 0x52, flags: 0x0},\n\t1223: {region: 0x6e, script: 0x27, flags: 0x0},\n\t1224: {region: 0x164, script: 0x52, flags: 0x0},\n\t1225: {region: 0xe6, script: 0x52, flags: 0x0},\n\t1226: {region: 0x2e, script: 0x52, flags: 0x0},\n\t1227: {region: 0x98, script: 0xd0, flags: 0x0},\n\t1228: {region: 0x98, script: 0x20, flags: 0x0},\n\t1229: {region: 0x164, script: 0x52, flags: 0x0},\n\t1230: {region: 0x164, script: 0x52, flags: 0x0},\n\t1231: {region: 0x164, script: 0x52, flags: 0x0},\n\t1232: {region: 0x164, script: 0x52, flags: 0x0},\n\t1233: {region: 0x164, script: 0x52, flags: 0x0},\n\t1234: {region: 0x164, script: 0x52, flags: 0x0},\n\t1235: {region: 0x164, script: 0x52, flags: 0x0},\n\t1236: {region: 0x164, script: 0x52, flags: 0x0},\n\t1237: {region: 0x164, script: 0x52, flags: 0x0},\n\t1238: {region: 0x13f, script: 0x52, flags: 0x0},\n\t1239: {region: 0x164, script: 0x52, flags: 0x0},\n\t1240: {region: 0x164, script: 0x52, flags: 0x0},\n\t1241: {region: 0xa7, script: 0x5, flags: 0x0},\n\t1242: {region: 0x164, script: 0x52, flags: 0x0},\n\t1243: {region: 0x113, script: 0x52, flags: 0x0},\n\t1244: {region: 0x164, script: 0x52, flags: 0x0},\n\t1245: {region: 0x164, script: 0x52, flags: 0x0},\n\t1246: {region: 0x164, script: 0x52, flags: 0x0},\n\t1247: {region: 0x164, script: 0x52, flags: 0x0},\n\t1248: {region: 0x98, script: 0x20, flags: 0x0},\n\t1249: {region: 0x52, script: 0x34, flags: 0x0},\n\t1250: {region: 0x164, script: 0x52, flags: 0x0},\n\t1251: {region: 0x164, script: 0x52, flags: 0x0},\n\t1252: {region: 0x40, script: 0x52, flags: 0x0},\n\t1253: {region: 0x164, script: 0x52, flags: 0x0},\n\t1254: {region: 0x12a, script: 0x18, flags: 0x0},\n\t1255: {region: 0x164, script: 0x52, flags: 0x0},\n\t1256: {region: 0x160, script: 0x52, flags: 0x0},\n\t1257: {region: 0x164, script: 0x52, flags: 0x0},\n\t1258: {region: 0x12a, script: 0x5a, flags: 0x0},\n\t1259: {region: 0x12a, script: 0x5b, flags: 0x0},\n\t1260: {region: 0x7c, script: 0x29, flags: 0x0},\n\t1261: {region: 0x52, script: 0x5e, flags: 0x0},\n\t1262: {region: 0x10a, script: 0x62, flags: 0x0},\n\t1263: {region: 0x107, script: 0x6c, flags: 0x0},\n\t1264: {region: 0x98, script: 0x20, flags: 0x0},\n\t1265: {region: 0x130, script: 0x52, flags: 0x0},\n\t1266: {region: 0x164, script: 0x52, flags: 0x0},\n\t1267: {region: 0x9b, script: 0x82, flags: 0x0},\n\t1268: {region: 0x164, script: 0x52, flags: 0x0},\n\t1269: {region: 0x15d, script: 0xba, flags: 0x0},\n\t1270: {region: 0x164, script: 0x52, flags: 0x0},\n\t1271: {region: 0x164, script: 0x52, flags: 0x0},\n\t1272: {region: 0xda, script: 0x20, flags: 0x0},\n\t1273: {region: 0x164, script: 0x52, flags: 0x0},\n\t1274: {region: 0x164, script: 0x52, flags: 0x0},\n\t1275: {region: 0xd0, script: 0x52, flags: 0x0},\n\t1276: {region: 0x74, script: 0x52, flags: 0x0},\n\t1277: {region: 0x164, script: 0x52, flags: 0x0},\n\t1278: {region: 0x164, script: 0x52, flags: 0x0},\n\t1279: {region: 0x51, script: 0x52, flags: 0x0},\n\t1280: {region: 0x164, script: 0x52, flags: 0x0},\n\t1281: {region: 0x164, script: 0x52, flags: 0x0},\n\t1282: {region: 0x164, script: 0x52, flags: 0x0},\n\t1283: {region: 0x51, script: 0x52, flags: 0x0},\n\t1284: {region: 0x164, script: 0x52, flags: 0x0},\n\t1285: {region: 0x164, script: 0x52, flags: 0x0},\n\t1286: {region: 0x164, script: 0x52, flags: 0x0},\n\t1287: {region: 0x164, script: 0x52, flags: 0x0},\n\t1288: {region: 0x1, script: 0x37, flags: 0x0},\n\t1289: {region: 0x164, script: 0x52, flags: 0x0},\n\t1290: {region: 0x164, script: 0x52, flags: 0x0},\n\t1291: {region: 0x164, script: 0x52, flags: 0x0},\n\t1292: {region: 0x164, script: 0x52, flags: 0x0},\n\t1293: {region: 0x164, script: 0x52, flags: 0x0},\n\t1294: {region: 0xd5, script: 0x52, flags: 0x0},\n\t1295: {region: 0x164, script: 0x52, flags: 0x0},\n\t1296: {region: 0x164, script: 0x52, flags: 0x0},\n\t1297: {region: 0x164, script: 0x52, flags: 0x0},\n\t1298: {region: 0x40, script: 0x52, flags: 0x0},\n\t1299: {region: 0x164, script: 0x52, flags: 0x0},\n\t1300: {region: 0xce, script: 0x52, flags: 0x0},\n\t1301: {region: 0x4c, script: 0x3, flags: 0x1},\n\t1302: {region: 0x164, script: 0x52, flags: 0x0},\n\t1303: {region: 0x164, script: 0x52, flags: 0x0},\n\t1304: {region: 0x164, script: 0x52, flags: 0x0},\n\t1305: {region: 0x52, script: 0x52, flags: 0x0},\n\t1306: {region: 0x10a, script: 0x52, flags: 0x0},\n\t1308: {region: 0xa7, script: 0x5, flags: 0x0},\n\t1309: {region: 0xd8, script: 0x52, flags: 0x0},\n\t1310: {region: 0xb9, script: 0xd2, flags: 0x0},\n\t1311: {region: 0x4f, script: 0x14, flags: 0x1},\n\t1312: {region: 0x164, script: 0x52, flags: 0x0},\n\t1313: {region: 0x121, script: 0x52, flags: 0x0},\n\t1314: {region: 0xcf, script: 0x52, flags: 0x0},\n\t1315: {region: 0x164, script: 0x52, flags: 0x0},\n\t1316: {region: 0x160, script: 0x52, flags: 0x0},\n\t1318: {region: 0x12a, script: 0x52, flags: 0x0},\n}\n\n// likelyLangList holds lists info associated with likelyLang.\n// Size: 396 bytes, 99 elements\nvar likelyLangList = [99]likelyScriptRegion{\n\t0:  {region: 0x9b, script: 0x7, flags: 0x0},\n\t1:  {region: 0xa0, script: 0x6d, flags: 0x2},\n\t2:  {region: 0x11b, script: 0x78, flags: 0x2},\n\t3:  {region: 0x31, script: 0x52, flags: 0x0},\n\t4:  {region: 0x9a, script: 0x5, flags: 0x4},\n\t5:  {region: 0x9b, script: 0x5, flags: 0x4},\n\t6:  {region: 0x105, script: 0x1e, flags: 0x4},\n\t7:  {region: 0x9b, script: 0x5, flags: 0x2},\n\t8:  {region: 0x98, script: 0xe, flags: 0x0},\n\t9:  {region: 0x34, script: 0x16, flags: 0x2},\n\t10: {region: 0x105, script: 0x1e, flags: 0x0},\n\t11: {region: 0x37, script: 0x2a, flags: 0x2},\n\t12: {region: 0x134, script: 0x52, flags: 0x0},\n\t13: {region: 0x7a, script: 0xbd, flags: 0x2},\n\t14: {region: 0x113, script: 0x52, flags: 0x0},\n\t15: {region: 0x83, script: 0x1, flags: 0x2},\n\t16: {region: 0x5c, script: 0x1d, flags: 0x0},\n\t17: {region: 0x86, script: 0x57, flags: 0x2},\n\t18: {region: 0xd5, script: 0x52, flags: 0x0},\n\t19: {region: 0x51, script: 0x5, flags: 0x4},\n\t20: {region: 0x10a, script: 0x5, flags: 0x4},\n\t21: {region: 0xad, script: 0x1e, flags: 0x0},\n\t22: {region: 0x23, script: 0x5, flags: 0x4},\n\t23: {region: 0x52, script: 0x5, flags: 0x4},\n\t24: {region: 0x9b, script: 0x5, flags: 0x4},\n\t25: {region: 0xc4, script: 0x5, flags: 0x4},\n\t26: {region: 0x52, script: 0x5, flags: 0x2},\n\t27: {region: 0x12a, script: 0x52, flags: 0x0},\n\t28: {region: 0xaf, script: 0x5, flags: 0x4},\n\t29: {region: 0x9a, script: 0x5, flags: 0x2},\n\t30: {region: 0xa4, script: 0x1e, flags: 0x0},\n\t31: {region: 0x52, script: 0x5, flags: 0x4},\n\t32: {region: 0x12a, script: 0x52, flags: 0x4},\n\t33: {region: 0x52, script: 0x5, flags: 0x2},\n\t34: {region: 0x12a, script: 0x52, flags: 0x2},\n\t35: {region: 0xda, script: 0x20, flags: 0x0},\n\t36: {region: 0x98, script: 0x55, flags: 0x2},\n\t37: {region: 0x82, script: 0x52, flags: 0x0},\n\t38: {region: 0x83, script: 0x70, flags: 0x4},\n\t39: {region: 0x83, script: 0x70, flags: 0x2},\n\t40: {region: 0xc4, script: 0x1e, flags: 0x0},\n\t41: {region: 0x52, script: 0x66, flags: 0x4},\n\t42: {region: 0x52, script: 0x66, flags: 0x2},\n\t43: {region: 0xcf, script: 0x52, flags: 0x0},\n\t44: {region: 0x49, script: 0x5, flags: 0x4},\n\t45: {region: 0x94, script: 0x5, flags: 0x4},\n\t46: {region: 0x98, script: 0x2f, flags: 0x0},\n\t47: {region: 0xe7, script: 0x5, flags: 0x4},\n\t48: {region: 0xe7, script: 0x5, flags: 0x2},\n\t49: {region: 0x9b, script: 0x7c, flags: 0x0},\n\t50: {region: 0x52, script: 0x7d, flags: 0x2},\n\t51: {region: 0xb9, script: 0xd2, flags: 0x0},\n\t52: {region: 0xd8, script: 0x52, flags: 0x4},\n\t53: {region: 0xe7, script: 0x5, flags: 0x0},\n\t54: {region: 0x98, script: 0x20, flags: 0x2},\n\t55: {region: 0x98, script: 0x47, flags: 0x2},\n\t56: {region: 0x98, script: 0xc0, flags: 0x2},\n\t57: {region: 0x104, script: 0x1e, flags: 0x0},\n\t58: {region: 0xbc, script: 0x52, flags: 0x4},\n\t59: {region: 0x103, script: 0x52, flags: 0x4},\n\t60: {region: 0x105, script: 0x52, flags: 0x4},\n\t61: {region: 0x12a, script: 0x52, flags: 0x4},\n\t62: {region: 0x123, script: 0x1e, flags: 0x0},\n\t63: {region: 0xe7, script: 0x5, flags: 0x4},\n\t64: {region: 0xe7, script: 0x5, flags: 0x2},\n\t65: {region: 0x52, script: 0x5, flags: 0x0},\n\t66: {region: 0xad, script: 0x1e, flags: 0x4},\n\t67: {region: 0xc4, script: 0x1e, flags: 0x4},\n\t68: {region: 0xad, script: 0x1e, flags: 0x2},\n\t69: {region: 0x98, script: 0xe, flags: 0x0},\n\t70: {region: 0xda, script: 0x20, flags: 0x4},\n\t71: {region: 0xda, script: 0x20, flags: 0x2},\n\t72: {region: 0x136, script: 0x52, flags: 0x0},\n\t73: {region: 0x23, script: 0x5, flags: 0x4},\n\t74: {region: 0x52, script: 0x1e, flags: 0x4},\n\t75: {region: 0x23, script: 0x5, flags: 0x2},\n\t76: {region: 0x8c, script: 0x35, flags: 0x0},\n\t77: {region: 0x52, script: 0x34, flags: 0x4},\n\t78: {region: 0x52, script: 0x34, flags: 0x2},\n\t79: {region: 0x52, script: 0x34, flags: 0x0},\n\t80: {region: 0x2e, script: 0x35, flags: 0x4},\n\t81: {region: 0x3d, script: 0x35, flags: 0x4},\n\t82: {region: 0x7a, script: 0x35, flags: 0x4},\n\t83: {region: 0x7d, script: 0x35, flags: 0x4},\n\t84: {region: 0x8c, script: 0x35, flags: 0x4},\n\t85: {region: 0x94, script: 0x35, flags: 0x4},\n\t86: {region: 0xc5, script: 0x35, flags: 0x4},\n\t87: {region: 0xcf, script: 0x35, flags: 0x4},\n\t88: {region: 0xe1, script: 0x35, flags: 0x4},\n\t89: {region: 0xe4, script: 0x35, flags: 0x4},\n\t90: {region: 0xe6, script: 0x35, flags: 0x4},\n\t91: {region: 0x115, script: 0x35, flags: 0x4},\n\t92: {region: 0x122, script: 0x35, flags: 0x4},\n\t93: {region: 0x12d, script: 0x35, flags: 0x4},\n\t94: {region: 0x134, script: 0x35, flags: 0x4},\n\t95: {region: 0x13d, script: 0x35, flags: 0x4},\n\t96: {region: 0x12d, script: 0x11, flags: 0x2},\n\t97: {region: 0x12d, script: 0x30, flags: 0x2},\n\t98: {region: 0x12d, script: 0x35, flags: 0x2},\n}\n\ntype likelyLangScript struct {\n\tlang   uint16\n\tscript uint8\n\tflags  uint8\n}\n\n// likelyRegion is a lookup table, indexed by regionID, for the most likely\n// languages and scripts given incomplete information. If more entries exist\n// for a given regionID, lang and script are the index and size respectively\n// of the list in likelyRegionList.\n// TODO: exclude containers and user-definable regions from the list.\n// Size: 1428 bytes, 357 elements\nvar likelyRegion = [357]likelyLangScript{\n\t33:  {lang: 0xd5, script: 0x52, flags: 0x0},\n\t34:  {lang: 0x39, script: 0x5, flags: 0x0},\n\t35:  {lang: 0x0, script: 0x2, flags: 0x1},\n\t38:  {lang: 0x2, script: 0x2, flags: 0x1},\n\t39:  {lang: 0x4, script: 0x2, flags: 0x1},\n\t41:  {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t42:  {lang: 0x0, script: 0x52, flags: 0x0},\n\t43:  {lang: 0x139, script: 0x52, flags: 0x0},\n\t44:  {lang: 0x411, script: 0x52, flags: 0x0},\n\t45:  {lang: 0x109, script: 0x52, flags: 0x0},\n\t47:  {lang: 0x35e, script: 0x52, flags: 0x0},\n\t48:  {lang: 0x43a, script: 0x52, flags: 0x0},\n\t49:  {lang: 0x57, script: 0x52, flags: 0x0},\n\t50:  {lang: 0x6, script: 0x2, flags: 0x1},\n\t52:  {lang: 0xa3, script: 0xe, flags: 0x0},\n\t53:  {lang: 0x35e, script: 0x52, flags: 0x0},\n\t54:  {lang: 0x159, script: 0x52, flags: 0x0},\n\t55:  {lang: 0x7d, script: 0x1e, flags: 0x0},\n\t56:  {lang: 0x39, script: 0x5, flags: 0x0},\n\t57:  {lang: 0x3d0, script: 0x52, flags: 0x0},\n\t58:  {lang: 0x159, script: 0x52, flags: 0x0},\n\t59:  {lang: 0x159, script: 0x52, flags: 0x0},\n\t61:  {lang: 0x316, script: 0x52, flags: 0x0},\n\t62:  {lang: 0x139, script: 0x52, flags: 0x0},\n\t63:  {lang: 0x398, script: 0x52, flags: 0x0},\n\t64:  {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t66:  {lang: 0x8, script: 0x2, flags: 0x1},\n\t68:  {lang: 0x0, script: 0x52, flags: 0x0},\n\t70:  {lang: 0x70, script: 0x1e, flags: 0x0},\n\t72:  {lang: 0x508, script: 0x37, flags: 0x2},\n\t73:  {lang: 0x316, script: 0x5, flags: 0x2},\n\t74:  {lang: 0x43b, script: 0x52, flags: 0x0},\n\t75:  {lang: 0x159, script: 0x52, flags: 0x0},\n\t76:  {lang: 0x159, script: 0x52, flags: 0x0},\n\t77:  {lang: 0x109, script: 0x52, flags: 0x0},\n\t78:  {lang: 0x159, script: 0x52, flags: 0x0},\n\t80:  {lang: 0x139, script: 0x52, flags: 0x0},\n\t81:  {lang: 0x159, script: 0x52, flags: 0x0},\n\t82:  {lang: 0xa, script: 0x5, flags: 0x1},\n\t83:  {lang: 0x139, script: 0x52, flags: 0x0},\n\t84:  {lang: 0x0, script: 0x52, flags: 0x0},\n\t85:  {lang: 0x139, script: 0x52, flags: 0x0},\n\t88:  {lang: 0x139, script: 0x52, flags: 0x0},\n\t89:  {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t90:  {lang: 0x398, script: 0x52, flags: 0x0},\n\t92:  {lang: 0xf, script: 0x2, flags: 0x1},\n\t93:  {lang: 0xf6, script: 0x52, flags: 0x0},\n\t95:  {lang: 0x109, script: 0x52, flags: 0x0},\n\t97:  {lang: 0x1, script: 0x52, flags: 0x0},\n\t98:  {lang: 0xfd, script: 0x52, flags: 0x0},\n\t100: {lang: 0x139, script: 0x52, flags: 0x0},\n\t102: {lang: 0x11, script: 0x2, flags: 0x1},\n\t103: {lang: 0x139, script: 0x52, flags: 0x0},\n\t104: {lang: 0x139, script: 0x52, flags: 0x0},\n\t105: {lang: 0x13b, script: 0x52, flags: 0x0},\n\t106: {lang: 0x39, script: 0x5, flags: 0x0},\n\t107: {lang: 0x39, script: 0x5, flags: 0x0},\n\t108: {lang: 0x465, script: 0x27, flags: 0x0},\n\t109: {lang: 0x139, script: 0x52, flags: 0x0},\n\t110: {lang: 0x13, script: 0x2, flags: 0x1},\n\t112: {lang: 0x109, script: 0x52, flags: 0x0},\n\t113: {lang: 0x14c, script: 0x52, flags: 0x0},\n\t114: {lang: 0x1b9, script: 0x20, flags: 0x2},\n\t117: {lang: 0x153, script: 0x52, flags: 0x0},\n\t119: {lang: 0x159, script: 0x52, flags: 0x0},\n\t121: {lang: 0x159, script: 0x52, flags: 0x0},\n\t122: {lang: 0x15, script: 0x2, flags: 0x1},\n\t124: {lang: 0x17, script: 0x3, flags: 0x1},\n\t125: {lang: 0x159, script: 0x52, flags: 0x0},\n\t127: {lang: 0x20, script: 0x52, flags: 0x0},\n\t129: {lang: 0x23d, script: 0x52, flags: 0x0},\n\t131: {lang: 0x159, script: 0x52, flags: 0x0},\n\t132: {lang: 0x159, script: 0x52, flags: 0x0},\n\t133: {lang: 0x139, script: 0x52, flags: 0x0},\n\t134: {lang: 0x1a, script: 0x2, flags: 0x1},\n\t135: {lang: 0x0, script: 0x52, flags: 0x0},\n\t136: {lang: 0x139, script: 0x52, flags: 0x0},\n\t138: {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t140: {lang: 0x51f, script: 0x35, flags: 0x0},\n\t141: {lang: 0x0, script: 0x52, flags: 0x0},\n\t142: {lang: 0x139, script: 0x52, flags: 0x0},\n\t143: {lang: 0x1ca, script: 0x52, flags: 0x0},\n\t144: {lang: 0x1cd, script: 0x52, flags: 0x0},\n\t145: {lang: 0x1ce, script: 0x52, flags: 0x0},\n\t147: {lang: 0x139, script: 0x52, flags: 0x0},\n\t148: {lang: 0x1c, script: 0x2, flags: 0x1},\n\t150: {lang: 0x1b5, script: 0x37, flags: 0x0},\n\t152: {lang: 0x1e, script: 0x3, flags: 0x1},\n\t154: {lang: 0x39, script: 0x5, flags: 0x0},\n\t155: {lang: 0x21, script: 0x2, flags: 0x1},\n\t156: {lang: 0x1f0, script: 0x52, flags: 0x0},\n\t157: {lang: 0x1f1, script: 0x52, flags: 0x0},\n\t160: {lang: 0x39, script: 0x5, flags: 0x0},\n\t161: {lang: 0x1f8, script: 0x41, flags: 0x0},\n\t163: {lang: 0x43b, script: 0x52, flags: 0x0},\n\t164: {lang: 0x281, script: 0x1e, flags: 0x0},\n\t165: {lang: 0x23, script: 0x3, flags: 0x1},\n\t167: {lang: 0x26, script: 0x2, flags: 0x1},\n\t169: {lang: 0x24b, script: 0x4b, flags: 0x0},\n\t170: {lang: 0x24b, script: 0x4b, flags: 0x0},\n\t171: {lang: 0x39, script: 0x5, flags: 0x0},\n\t173: {lang: 0x3d9, script: 0x1e, flags: 0x0},\n\t174: {lang: 0x28, script: 0x2, flags: 0x1},\n\t175: {lang: 0x39, script: 0x5, flags: 0x0},\n\t177: {lang: 0x109, script: 0x52, flags: 0x0},\n\t178: {lang: 0x402, script: 0xc1, flags: 0x0},\n\t180: {lang: 0x431, script: 0x52, flags: 0x0},\n\t181: {lang: 0x2b7, script: 0x52, flags: 0x0},\n\t182: {lang: 0x159, script: 0x52, flags: 0x0},\n\t183: {lang: 0x2be, script: 0x52, flags: 0x0},\n\t184: {lang: 0x39, script: 0x5, flags: 0x0},\n\t185: {lang: 0x2a, script: 0x2, flags: 0x1},\n\t186: {lang: 0x159, script: 0x52, flags: 0x0},\n\t187: {lang: 0x2c, script: 0x2, flags: 0x1},\n\t188: {lang: 0x428, script: 0x52, flags: 0x0},\n\t189: {lang: 0x159, script: 0x52, flags: 0x0},\n\t190: {lang: 0x2e8, script: 0x52, flags: 0x0},\n\t193: {lang: 0x2e, script: 0x2, flags: 0x1},\n\t194: {lang: 0x9e, script: 0x52, flags: 0x0},\n\t195: {lang: 0x30, script: 0x2, flags: 0x1},\n\t196: {lang: 0x32, script: 0x2, flags: 0x1},\n\t197: {lang: 0x34, script: 0x2, flags: 0x1},\n\t199: {lang: 0x159, script: 0x52, flags: 0x0},\n\t200: {lang: 0x36, script: 0x2, flags: 0x1},\n\t202: {lang: 0x317, script: 0x52, flags: 0x0},\n\t203: {lang: 0x38, script: 0x3, flags: 0x1},\n\t204: {lang: 0x124, script: 0xd4, flags: 0x0},\n\t206: {lang: 0x139, script: 0x52, flags: 0x0},\n\t207: {lang: 0x316, script: 0x52, flags: 0x0},\n\t208: {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t209: {lang: 0x15, script: 0x52, flags: 0x0},\n\t210: {lang: 0x159, script: 0x52, flags: 0x0},\n\t211: {lang: 0x1ad, script: 0x52, flags: 0x0},\n\t213: {lang: 0x1ad, script: 0x5, flags: 0x2},\n\t215: {lang: 0x139, script: 0x52, flags: 0x0},\n\t216: {lang: 0x35e, script: 0x52, flags: 0x0},\n\t217: {lang: 0x33e, script: 0x52, flags: 0x0},\n\t218: {lang: 0x348, script: 0x20, flags: 0x0},\n\t224: {lang: 0x39, script: 0x5, flags: 0x0},\n\t225: {lang: 0x139, script: 0x52, flags: 0x0},\n\t227: {lang: 0x139, script: 0x52, flags: 0x0},\n\t228: {lang: 0x159, script: 0x52, flags: 0x0},\n\t229: {lang: 0x47c, script: 0x52, flags: 0x0},\n\t230: {lang: 0x14e, script: 0x52, flags: 0x0},\n\t231: {lang: 0x3b, script: 0x3, flags: 0x1},\n\t232: {lang: 0x3e, script: 0x2, flags: 0x1},\n\t233: {lang: 0x159, script: 0x52, flags: 0x0},\n\t235: {lang: 0x139, script: 0x52, flags: 0x0},\n\t236: {lang: 0x39, script: 0x5, flags: 0x0},\n\t237: {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t239: {lang: 0x399, script: 0x52, flags: 0x0},\n\t240: {lang: 0x18e, script: 0x52, flags: 0x0},\n\t242: {lang: 0x39, script: 0x5, flags: 0x0},\n\t257: {lang: 0x159, script: 0x52, flags: 0x0},\n\t259: {lang: 0x40, script: 0x2, flags: 0x1},\n\t260: {lang: 0x428, script: 0x1e, flags: 0x0},\n\t261: {lang: 0x42, script: 0x2, flags: 0x1},\n\t262: {lang: 0x3dc, script: 0x52, flags: 0x0},\n\t263: {lang: 0x39, script: 0x5, flags: 0x0},\n\t265: {lang: 0x159, script: 0x52, flags: 0x0},\n\t266: {lang: 0x39, script: 0x5, flags: 0x0},\n\t267: {lang: 0x44, script: 0x2, flags: 0x1},\n\t270: {lang: 0x40c, script: 0x52, flags: 0x0},\n\t271: {lang: 0x33e, script: 0x52, flags: 0x0},\n\t272: {lang: 0x46, script: 0x2, flags: 0x1},\n\t274: {lang: 0x1f1, script: 0x52, flags: 0x0},\n\t275: {lang: 0x159, script: 0x52, flags: 0x0},\n\t276: {lang: 0x41f, script: 0x52, flags: 0x0},\n\t277: {lang: 0x35e, script: 0x52, flags: 0x0},\n\t279: {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t281: {lang: 0x139, script: 0x52, flags: 0x0},\n\t283: {lang: 0x48, script: 0x2, flags: 0x1},\n\t287: {lang: 0x159, script: 0x52, flags: 0x0},\n\t288: {lang: 0x159, script: 0x52, flags: 0x0},\n\t289: {lang: 0x4a, script: 0x2, flags: 0x1},\n\t290: {lang: 0x4c, script: 0x3, flags: 0x1},\n\t291: {lang: 0x4f, script: 0x2, flags: 0x1},\n\t292: {lang: 0x46d, script: 0x52, flags: 0x0},\n\t293: {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t294: {lang: 0x46c, script: 0x52, flags: 0x0},\n\t295: {lang: 0x51, script: 0x2, flags: 0x1},\n\t296: {lang: 0x478, script: 0x52, flags: 0x0},\n\t298: {lang: 0x53, script: 0x4, flags: 0x1},\n\t300: {lang: 0x496, script: 0x52, flags: 0x0},\n\t301: {lang: 0x57, script: 0x2, flags: 0x1},\n\t302: {lang: 0x43b, script: 0x52, flags: 0x0},\n\t303: {lang: 0x59, script: 0x3, flags: 0x1},\n\t304: {lang: 0x43b, script: 0x52, flags: 0x0},\n\t308: {lang: 0x508, script: 0x37, flags: 0x2},\n\t309: {lang: 0x139, script: 0x52, flags: 0x0},\n\t310: {lang: 0x4b2, script: 0x52, flags: 0x0},\n\t311: {lang: 0x1f1, script: 0x52, flags: 0x0},\n\t314: {lang: 0x139, script: 0x52, flags: 0x0},\n\t317: {lang: 0x4b9, script: 0x52, flags: 0x0},\n\t318: {lang: 0x89, script: 0x52, flags: 0x0},\n\t319: {lang: 0x159, script: 0x52, flags: 0x0},\n\t321: {lang: 0x411, script: 0x52, flags: 0x0},\n\t332: {lang: 0x5c, script: 0x2, flags: 0x1},\n\t349: {lang: 0x39, script: 0x5, flags: 0x0},\n\t350: {lang: 0x5e, script: 0x2, flags: 0x1},\n\t355: {lang: 0x419, script: 0x52, flags: 0x0},\n}\n\n// likelyRegionList holds lists info associated with likelyRegion.\n// Size: 384 bytes, 96 elements\nvar likelyRegionList = [96]likelyLangScript{\n\t0:  {lang: 0x143, script: 0x5, flags: 0x0},\n\t1:  {lang: 0x46c, script: 0x52, flags: 0x0},\n\t2:  {lang: 0x427, script: 0x52, flags: 0x0},\n\t3:  {lang: 0x2f6, script: 0x1e, flags: 0x0},\n\t4:  {lang: 0x1d0, script: 0x8, flags: 0x0},\n\t5:  {lang: 0x26b, script: 0x52, flags: 0x0},\n\t6:  {lang: 0xb5, script: 0x52, flags: 0x0},\n\t7:  {lang: 0x428, script: 0x1e, flags: 0x0},\n\t8:  {lang: 0x129, script: 0xd6, flags: 0x0},\n\t9:  {lang: 0x348, script: 0x20, flags: 0x0},\n\t10: {lang: 0x51f, script: 0x34, flags: 0x0},\n\t11: {lang: 0x4a2, script: 0x5, flags: 0x0},\n\t12: {lang: 0x515, script: 0x35, flags: 0x0},\n\t13: {lang: 0x519, script: 0x52, flags: 0x0},\n\t14: {lang: 0x291, script: 0xd5, flags: 0x0},\n\t15: {lang: 0x131, script: 0x2d, flags: 0x0},\n\t16: {lang: 0x480, script: 0x52, flags: 0x0},\n\t17: {lang: 0x39, script: 0x5, flags: 0x0},\n\t18: {lang: 0x159, script: 0x52, flags: 0x0},\n\t19: {lang: 0x26, script: 0x27, flags: 0x0},\n\t20: {lang: 0x134, script: 0x52, flags: 0x0},\n\t21: {lang: 0x261, script: 0x5, flags: 0x2},\n\t22: {lang: 0x508, script: 0x37, flags: 0x2},\n\t23: {lang: 0x208, script: 0x29, flags: 0x0},\n\t24: {lang: 0x5, script: 0x1e, flags: 0x0},\n\t25: {lang: 0x26b, script: 0x52, flags: 0x0},\n\t26: {lang: 0x131, script: 0x2d, flags: 0x0},\n\t27: {lang: 0x2f6, script: 0x1e, flags: 0x0},\n\t28: {lang: 0x1da, script: 0x52, flags: 0x0},\n\t29: {lang: 0x316, script: 0x5, flags: 0x0},\n\t30: {lang: 0x1b7, script: 0x20, flags: 0x0},\n\t31: {lang: 0x4aa, script: 0x5, flags: 0x0},\n\t32: {lang: 0x22e, script: 0x6b, flags: 0x0},\n\t33: {lang: 0x143, script: 0x5, flags: 0x0},\n\t34: {lang: 0x46c, script: 0x52, flags: 0x0},\n\t35: {lang: 0x242, script: 0x46, flags: 0x0},\n\t36: {lang: 0xe4, script: 0x5, flags: 0x0},\n\t37: {lang: 0x21e, script: 0xd5, flags: 0x0},\n\t38: {lang: 0x39, script: 0x5, flags: 0x0},\n\t39: {lang: 0x159, script: 0x52, flags: 0x0},\n\t40: {lang: 0x2af, script: 0x4f, flags: 0x0},\n\t41: {lang: 0x21e, script: 0xd5, flags: 0x0},\n\t42: {lang: 0x39, script: 0x5, flags: 0x0},\n\t43: {lang: 0x159, script: 0x52, flags: 0x0},\n\t44: {lang: 0x3d3, script: 0x52, flags: 0x0},\n\t45: {lang: 0x4a4, script: 0x1e, flags: 0x0},\n\t46: {lang: 0x2f6, script: 0x1e, flags: 0x0},\n\t47: {lang: 0x427, script: 0x52, flags: 0x0},\n\t48: {lang: 0x328, script: 0x6b, flags: 0x0},\n\t49: {lang: 0x20b, script: 0x52, flags: 0x0},\n\t50: {lang: 0x302, script: 0x1e, flags: 0x0},\n\t51: {lang: 0x23a, script: 0x5, flags: 0x0},\n\t52: {lang: 0x51f, script: 0x35, flags: 0x0},\n\t53: {lang: 0x3b7, script: 0x52, flags: 0x0},\n\t54: {lang: 0x39, script: 0x5, flags: 0x0},\n\t55: {lang: 0x159, script: 0x52, flags: 0x0},\n\t56: {lang: 0x2e4, script: 0x52, flags: 0x0},\n\t57: {lang: 0x4aa, script: 0x5, flags: 0x0},\n\t58: {lang: 0x87, script: 0x20, flags: 0x0},\n\t59: {lang: 0x4aa, script: 0x5, flags: 0x0},\n\t60: {lang: 0x4aa, script: 0x5, flags: 0x0},\n\t61: {lang: 0xbc, script: 0x20, flags: 0x0},\n\t62: {lang: 0x3aa, script: 0x52, flags: 0x0},\n\t63: {lang: 0x70, script: 0x1e, flags: 0x0},\n\t64: {lang: 0x3d3, script: 0x52, flags: 0x0},\n\t65: {lang: 0x7d, script: 0x1e, flags: 0x0},\n\t66: {lang: 0x3d9, script: 0x1e, flags: 0x0},\n\t67: {lang: 0x25e, script: 0x52, flags: 0x0},\n\t68: {lang: 0x43a, script: 0x52, flags: 0x0},\n\t69: {lang: 0x508, script: 0x37, flags: 0x0},\n\t70: {lang: 0x408, script: 0x52, flags: 0x0},\n\t71: {lang: 0x4a4, script: 0x1e, flags: 0x0},\n\t72: {lang: 0x39, script: 0x5, flags: 0x0},\n\t73: {lang: 0x159, script: 0x52, flags: 0x0},\n\t74: {lang: 0x159, script: 0x52, flags: 0x0},\n\t75: {lang: 0x34, script: 0x5, flags: 0x0},\n\t76: {lang: 0x461, script: 0xd5, flags: 0x0},\n\t77: {lang: 0x2e3, script: 0x5, flags: 0x0},\n\t78: {lang: 0x306, script: 0x6b, flags: 0x0},\n\t79: {lang: 0x45d, script: 0x1e, flags: 0x0},\n\t80: {lang: 0x143, script: 0x5, flags: 0x0},\n\t81: {lang: 0x39, script: 0x5, flags: 0x0},\n\t82: {lang: 0x159, script: 0x52, flags: 0x0},\n\t83: {lang: 0x480, script: 0x52, flags: 0x0},\n\t84: {lang: 0x57, script: 0x5, flags: 0x0},\n\t85: {lang: 0x211, script: 0x1e, flags: 0x0},\n\t86: {lang: 0x80, script: 0x2d, flags: 0x0},\n\t87: {lang: 0x51f, script: 0x35, flags: 0x0},\n\t88: {lang: 0x482, script: 0x52, flags: 0x0},\n\t89: {lang: 0x4a4, script: 0x1e, flags: 0x0},\n\t90: {lang: 0x508, script: 0x37, flags: 0x0},\n\t91: {lang: 0x3aa, script: 0x52, flags: 0x0},\n\t92: {lang: 0x427, script: 0x52, flags: 0x0},\n\t93: {lang: 0x428, script: 0x1e, flags: 0x0},\n\t94: {lang: 0x159, script: 0x52, flags: 0x0},\n\t95: {lang: 0x43c, script: 0x5, flags: 0x0},\n}\n\ntype likelyTag struct {\n\tlang   uint16\n\tregion uint16\n\tscript uint8\n}\n\n// Size: 192 bytes, 32 elements\nvar likelyRegionGroup = [32]likelyTag{\n\t1:  {lang: 0x134, region: 0xd5, script: 0x52},\n\t2:  {lang: 0x134, region: 0x134, script: 0x52},\n\t3:  {lang: 0x3b7, region: 0x40, script: 0x52},\n\t4:  {lang: 0x134, region: 0x2e, script: 0x52},\n\t5:  {lang: 0x134, region: 0xd5, script: 0x52},\n\t6:  {lang: 0x139, region: 0xce, script: 0x52},\n\t7:  {lang: 0x43b, region: 0x12e, script: 0x52},\n\t8:  {lang: 0x39, region: 0x6a, script: 0x5},\n\t9:  {lang: 0x43b, region: 0x4a, script: 0x52},\n\t10: {lang: 0x134, region: 0x160, script: 0x52},\n\t11: {lang: 0x134, region: 0x134, script: 0x52},\n\t12: {lang: 0x134, region: 0x134, script: 0x52},\n\t13: {lang: 0x139, region: 0x58, script: 0x52},\n\t14: {lang: 0x51f, region: 0x52, script: 0x34},\n\t15: {lang: 0x1b7, region: 0x98, script: 0x20},\n\t16: {lang: 0x1da, region: 0x94, script: 0x52},\n\t17: {lang: 0x1f1, region: 0x9d, script: 0x52},\n\t18: {lang: 0x134, region: 0x2e, script: 0x52},\n\t19: {lang: 0x134, region: 0xe5, script: 0x52},\n\t20: {lang: 0x134, region: 0x89, script: 0x52},\n\t21: {lang: 0x411, region: 0x141, script: 0x52},\n\t22: {lang: 0x51f, region: 0x52, script: 0x34},\n\t23: {lang: 0x4b2, region: 0x136, script: 0x52},\n\t24: {lang: 0x39, region: 0x107, script: 0x5},\n\t25: {lang: 0x3d9, region: 0x105, script: 0x1e},\n\t26: {lang: 0x3d9, region: 0x105, script: 0x1e},\n\t27: {lang: 0x134, region: 0x7a, script: 0x52},\n\t28: {lang: 0x109, region: 0x5f, script: 0x52},\n\t29: {lang: 0x139, region: 0x1e, script: 0x52},\n\t30: {lang: 0x134, region: 0x99, script: 0x52},\n\t31: {lang: 0x134, region: 0x7a, script: 0x52},\n}\n\ntype mutualIntelligibility struct {\n\twant   uint16\n\thave   uint16\n\tconf   uint8\n\toneway bool\n}\n\ntype scriptIntelligibility struct {\n\tlang uint16\n\twant uint8\n\thave uint8\n\tconf uint8\n}\n\n// matchLang holds pairs of langIDs of base languages that are typically\n// mutually intelligible. Each pair is associated with a confidence and\n// whether the intelligibility goes one or both ways.\n// Size: 708 bytes, 118 elements\nvar matchLang = [118]mutualIntelligibility{\n\t0:   {want: 0x366, have: 0x33e, conf: 0x2, oneway: false},\n\t1:   {want: 0x26b, have: 0xe7, conf: 0x2, oneway: false},\n\t2:   {want: 0x1ca, have: 0xb5, conf: 0x2, oneway: false},\n\t3:   {want: 0x3fd, have: 0xb5, conf: 0x2, oneway: false},\n\t4:   {want: 0x428, have: 0xb5, conf: 0x2, oneway: false},\n\t5:   {want: 0x3fd, have: 0x1ca, conf: 0x2, oneway: false},\n\t6:   {want: 0x428, have: 0x1ca, conf: 0x2, oneway: false},\n\t7:   {want: 0x3fd, have: 0x428, conf: 0x2, oneway: false},\n\t8:   {want: 0x430, have: 0x1, conf: 0x2, oneway: false},\n\t9:   {want: 0x19c, have: 0x109, conf: 0x2, oneway: true},\n\t10:  {want: 0x28c, have: 0x109, conf: 0x2, oneway: true},\n\t11:  {want: 0xfd, have: 0x366, conf: 0x2, oneway: false},\n\t12:  {want: 0xfd, have: 0x33e, conf: 0x2, oneway: false},\n\t13:  {want: 0xe7, have: 0x26b, conf: 0x2, oneway: false},\n\t14:  {want: 0x5, have: 0x3d9, conf: 0x2, oneway: true},\n\t15:  {want: 0xc, have: 0x134, conf: 0x2, oneway: true},\n\t16:  {want: 0x15, have: 0x35e, conf: 0x2, oneway: true},\n\t17:  {want: 0x20, have: 0x134, conf: 0x2, oneway: true},\n\t18:  {want: 0x55, have: 0x139, conf: 0x2, oneway: true},\n\t19:  {want: 0x57, have: 0x3d9, conf: 0x2, oneway: true},\n\t20:  {want: 0x70, have: 0x3d9, conf: 0x2, oneway: true},\n\t21:  {want: 0x74, have: 0x134, conf: 0x2, oneway: true},\n\t22:  {want: 0x81, have: 0x1b7, conf: 0x2, oneway: true},\n\t23:  {want: 0xa3, have: 0x134, conf: 0x2, oneway: true},\n\t24:  {want: 0xb0, have: 0x159, conf: 0x2, oneway: true},\n\t25:  {want: 0xdb, have: 0x14e, conf: 0x2, oneway: true},\n\t26:  {want: 0xe3, have: 0x134, conf: 0x2, oneway: true},\n\t27:  {want: 0xe7, have: 0x39, conf: 0x2, oneway: true},\n\t28:  {want: 0xed, have: 0x159, conf: 0x2, oneway: true},\n\t29:  {want: 0xf5, have: 0x159, conf: 0x2, oneway: true},\n\t30:  {want: 0xfc, have: 0x134, conf: 0x2, oneway: true},\n\t31:  {want: 0x12c, have: 0x134, conf: 0x2, oneway: true},\n\t32:  {want: 0x137, have: 0x134, conf: 0x2, oneway: true},\n\t33:  {want: 0x13b, have: 0x14c, conf: 0x2, oneway: true},\n\t34:  {want: 0x140, have: 0x139, conf: 0x2, oneway: true},\n\t35:  {want: 0x153, have: 0xfd, conf: 0x2, oneway: true},\n\t36:  {want: 0x168, have: 0x35e, conf: 0x2, oneway: true},\n\t37:  {want: 0x169, have: 0x134, conf: 0x2, oneway: true},\n\t38:  {want: 0x16a, have: 0x134, conf: 0x2, oneway: true},\n\t39:  {want: 0x178, have: 0x134, conf: 0x2, oneway: true},\n\t40:  {want: 0x18a, have: 0x139, conf: 0x2, oneway: true},\n\t41:  {want: 0x18e, have: 0x139, conf: 0x2, oneway: true},\n\t42:  {want: 0x19d, have: 0x1b7, conf: 0x2, oneway: true},\n\t43:  {want: 0x1ad, have: 0x134, conf: 0x2, oneway: true},\n\t44:  {want: 0x1b1, have: 0x134, conf: 0x2, oneway: true},\n\t45:  {want: 0x1cd, have: 0x159, conf: 0x2, oneway: true},\n\t46:  {want: 0x1d0, have: 0x3d9, conf: 0x2, oneway: true},\n\t47:  {want: 0x1d2, have: 0x134, conf: 0x2, oneway: true},\n\t48:  {want: 0x1df, have: 0x134, conf: 0x2, oneway: true},\n\t49:  {want: 0x1f0, have: 0x134, conf: 0x2, oneway: true},\n\t50:  {want: 0x206, have: 0x1da, conf: 0x2, oneway: true},\n\t51:  {want: 0x208, have: 0x134, conf: 0x2, oneway: true},\n\t52:  {want: 0x225, have: 0x159, conf: 0x2, oneway: true},\n\t53:  {want: 0x23a, have: 0x3d9, conf: 0x2, oneway: true},\n\t54:  {want: 0x242, have: 0x134, conf: 0x2, oneway: true},\n\t55:  {want: 0x249, have: 0x134, conf: 0x2, oneway: true},\n\t56:  {want: 0x25c, have: 0x134, conf: 0x2, oneway: true},\n\t57:  {want: 0x26b, have: 0x480, conf: 0x2, oneway: true},\n\t58:  {want: 0x281, have: 0x3d9, conf: 0x2, oneway: true},\n\t59:  {want: 0x285, have: 0x1f1, conf: 0x2, oneway: true},\n\t60:  {want: 0x29a, have: 0x134, conf: 0x2, oneway: true},\n\t61:  {want: 0x2ac, have: 0x159, conf: 0x2, oneway: true},\n\t62:  {want: 0x2af, have: 0x134, conf: 0x2, oneway: true},\n\t63:  {want: 0x2b5, have: 0x134, conf: 0x2, oneway: true},\n\t64:  {want: 0x2ba, have: 0x159, conf: 0x2, oneway: true},\n\t65:  {want: 0x2e4, have: 0x134, conf: 0x2, oneway: true},\n\t66:  {want: 0x2e8, have: 0x159, conf: 0x2, oneway: true},\n\t67:  {want: 0x2f1, have: 0x134, conf: 0x2, oneway: true},\n\t68:  {want: 0x2f6, have: 0x7d, conf: 0x2, oneway: true},\n\t69:  {want: 0x2fb, have: 0x134, conf: 0x2, oneway: true},\n\t70:  {want: 0x302, have: 0x3d9, conf: 0x2, oneway: true},\n\t71:  {want: 0x312, have: 0x1b7, conf: 0x2, oneway: true},\n\t72:  {want: 0x316, have: 0x1da, conf: 0x2, oneway: true},\n\t73:  {want: 0x317, have: 0x134, conf: 0x2, oneway: true},\n\t74:  {want: 0x328, have: 0x134, conf: 0x2, oneway: true},\n\t75:  {want: 0x348, have: 0x134, conf: 0x2, oneway: true},\n\t76:  {want: 0x361, have: 0x33e, conf: 0x2, oneway: false},\n\t77:  {want: 0x361, have: 0x366, conf: 0x2, oneway: true},\n\t78:  {want: 0x371, have: 0x134, conf: 0x2, oneway: true},\n\t79:  {want: 0x37e, have: 0x134, conf: 0x2, oneway: true},\n\t80:  {want: 0x380, have: 0x134, conf: 0x2, oneway: true},\n\t81:  {want: 0x382, have: 0x159, conf: 0x2, oneway: true},\n\t82:  {want: 0x387, have: 0x134, conf: 0x2, oneway: true},\n\t83:  {want: 0x38c, have: 0x134, conf: 0x2, oneway: true},\n\t84:  {want: 0x394, have: 0x134, conf: 0x2, oneway: true},\n\t85:  {want: 0x39c, have: 0x134, conf: 0x2, oneway: true},\n\t86:  {want: 0x3b5, have: 0x134, conf: 0x2, oneway: true},\n\t87:  {want: 0x3bb, have: 0x139, conf: 0x2, oneway: true},\n\t88:  {want: 0x3cb, have: 0x109, conf: 0x2, oneway: true},\n\t89:  {want: 0x3d0, have: 0x134, conf: 0x2, oneway: true},\n\t90:  {want: 0x3dc, have: 0x159, conf: 0x2, oneway: true},\n\t91:  {want: 0x3e0, have: 0x1b7, conf: 0x2, oneway: true},\n\t92:  {want: 0x3f0, have: 0x134, conf: 0x2, oneway: true},\n\t93:  {want: 0x402, have: 0x134, conf: 0x2, oneway: true},\n\t94:  {want: 0x419, have: 0x134, conf: 0x2, oneway: true},\n\t95:  {want: 0x41f, have: 0x134, conf: 0x2, oneway: true},\n\t96:  {want: 0x427, have: 0x134, conf: 0x2, oneway: true},\n\t97:  {want: 0x431, have: 0x134, conf: 0x2, oneway: true},\n\t98:  {want: 0x434, have: 0x1da, conf: 0x2, oneway: true},\n\t99:  {want: 0x43b, have: 0x134, conf: 0x2, oneway: true},\n\t100: {want: 0x446, have: 0x134, conf: 0x2, oneway: true},\n\t101: {want: 0x457, have: 0x134, conf: 0x2, oneway: true},\n\t102: {want: 0x45d, have: 0x3d9, conf: 0x2, oneway: true},\n\t103: {want: 0x465, have: 0x134, conf: 0x2, oneway: true},\n\t104: {want: 0x46c, have: 0x3d9, conf: 0x2, oneway: true},\n\t105: {want: 0x3878, have: 0x134, conf: 0x2, oneway: true},\n\t106: {want: 0x476, have: 0x134, conf: 0x2, oneway: true},\n\t107: {want: 0x478, have: 0x134, conf: 0x2, oneway: true},\n\t108: {want: 0x48a, have: 0x3d9, conf: 0x2, oneway: true},\n\t109: {want: 0x493, have: 0x134, conf: 0x2, oneway: true},\n\t110: {want: 0x4a2, have: 0x51f, conf: 0x2, oneway: true},\n\t111: {want: 0x4aa, have: 0x134, conf: 0x2, oneway: true},\n\t112: {want: 0x4b2, have: 0x3d9, conf: 0x2, oneway: true},\n\t113: {want: 0x4db, have: 0x159, conf: 0x2, oneway: true},\n\t114: {want: 0x4e8, have: 0x134, conf: 0x2, oneway: true},\n\t115: {want: 0x508, have: 0x134, conf: 0x2, oneway: true},\n\t116: {want: 0x50e, have: 0x134, conf: 0x2, oneway: true},\n\t117: {want: 0x524, have: 0x134, conf: 0x2, oneway: true},\n}\n\n// matchScript holds pairs of scriptIDs where readers of one script\n// can typically also read the other. Each is associated with a confidence.\n// Size: 24 bytes, 4 elements\nvar matchScript = [4]scriptIntelligibility{\n\t0: {lang: 0x428, want: 0x52, have: 0x1e, conf: 0x2},\n\t1: {lang: 0x428, want: 0x1e, have: 0x52, conf: 0x2},\n\t2: {lang: 0x0, want: 0x34, have: 0x35, conf: 0x1},\n\t3: {lang: 0x0, want: 0x35, have: 0x34, conf: 0x1},\n}\n\n// Size: 128 bytes, 32 elements\nvar regionContainment = [32]uint32{\n\t0xffffffff, 0x000007a2, 0x00003044, 0x00000008,\n\t0x403c0010, 0x00000020, 0x00000040, 0x00000080,\n\t0x00000100, 0x00000200, 0x00000400, 0x2000384c,\n\t0x00001000, 0x00002000, 0x00004000, 0x00008000,\n\t0x00010000, 0x00020000, 0x00040000, 0x00080000,\n\t0x00100000, 0x00200000, 0x01c1c000, 0x00800000,\n\t0x01000000, 0x1e020000, 0x04000000, 0x08000000,\n\t0x10000000, 0x20002048, 0x40000000, 0x80000000,\n}\n\n// regionInclusion maps region identifiers to sets of regions in regionInclusionBits,\n// where each set holds all groupings that are directly connected in a region\n// containment graph.\n// Size: 357 bytes, 357 elements\nvar regionInclusion = [357]uint8{\n\t// Entry 0 - 3F\n\t0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,\n\t0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,\n\t0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n\t0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20,\n\t0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x22, 0x23,\n\t0x25, 0x26, 0x21, 0x27, 0x28, 0x29, 0x2a, 0x25,\n\t0x2b, 0x23, 0x22, 0x25, 0x24, 0x29, 0x2c, 0x2d,\n\t0x23, 0x2e, 0x2c, 0x25, 0x2f, 0x30, 0x27, 0x25,\n\t// Entry 40 - 7F\n\t0x27, 0x25, 0x24, 0x30, 0x21, 0x31, 0x32, 0x33,\n\t0x2f, 0x21, 0x26, 0x26, 0x26, 0x34, 0x2c, 0x28,\n\t0x27, 0x26, 0x35, 0x27, 0x21, 0x33, 0x22, 0x20,\n\t0x25, 0x2c, 0x25, 0x21, 0x36, 0x2d, 0x34, 0x29,\n\t0x21, 0x2e, 0x37, 0x25, 0x25, 0x20, 0x38, 0x38,\n\t0x27, 0x37, 0x38, 0x38, 0x2e, 0x39, 0x2e, 0x1f,\n\t0x20, 0x37, 0x3a, 0x27, 0x3b, 0x2b, 0x20, 0x29,\n\t0x34, 0x26, 0x37, 0x25, 0x23, 0x27, 0x2b, 0x2c,\n\t// Entry 80 - BF\n\t0x22, 0x2f, 0x2c, 0x2c, 0x25, 0x26, 0x39, 0x21,\n\t0x33, 0x3b, 0x2c, 0x27, 0x35, 0x21, 0x33, 0x39,\n\t0x25, 0x2d, 0x20, 0x38, 0x30, 0x37, 0x23, 0x2b,\n\t0x24, 0x21, 0x23, 0x24, 0x2b, 0x39, 0x2b, 0x25,\n\t0x23, 0x35, 0x20, 0x2e, 0x3c, 0x30, 0x3b, 0x2e,\n\t0x25, 0x35, 0x35, 0x23, 0x25, 0x3c, 0x30, 0x23,\n\t0x25, 0x34, 0x24, 0x2c, 0x31, 0x37, 0x29, 0x37,\n\t0x38, 0x38, 0x34, 0x32, 0x22, 0x25, 0x2e, 0x3b,\n\t// Entry C0 - FF\n\t0x20, 0x22, 0x2c, 0x30, 0x35, 0x35, 0x3b, 0x25,\n\t0x2c, 0x25, 0x39, 0x2e, 0x24, 0x2e, 0x33, 0x30,\n\t0x2e, 0x31, 0x3a, 0x2c, 0x2a, 0x2c, 0x20, 0x33,\n\t0x29, 0x2b, 0x24, 0x20, 0x3b, 0x23, 0x28, 0x2a,\n\t0x23, 0x33, 0x20, 0x27, 0x28, 0x3a, 0x30, 0x24,\n\t0x2d, 0x2f, 0x28, 0x25, 0x23, 0x39, 0x20, 0x3b,\n\t0x27, 0x20, 0x23, 0x20, 0x20, 0x1e, 0x20, 0x20,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n\t// Entry 100 - 13F\n\t0x20, 0x2e, 0x20, 0x2d, 0x22, 0x32, 0x2e, 0x23,\n\t0x3a, 0x2e, 0x38, 0x37, 0x30, 0x2c, 0x39, 0x2b,\n\t0x2d, 0x2c, 0x22, 0x2c, 0x2e, 0x27, 0x2e, 0x26,\n\t0x32, 0x33, 0x25, 0x23, 0x31, 0x21, 0x25, 0x26,\n\t0x21, 0x2c, 0x30, 0x3c, 0x28, 0x30, 0x3c, 0x38,\n\t0x28, 0x30, 0x23, 0x25, 0x28, 0x35, 0x2e, 0x32,\n\t0x2e, 0x20, 0x21, 0x20, 0x2f, 0x27, 0x3c, 0x22,\n\t0x25, 0x20, 0x27, 0x25, 0x25, 0x30, 0x3a, 0x28,\n\t// Entry 140 - 17F\n\t0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n\t0x20, 0x20, 0x20, 0x20, 0x22, 0x20, 0x20, 0x20,\n\t0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n\t0x20, 0x20, 0x20, 0x20, 0x23, 0x23, 0x2e, 0x22,\n\t0x31, 0x2e, 0x26, 0x2e, 0x20,\n}\n\n// regionInclusionBits is an array of bit vectors where every vector represents\n// a set of region groupings.  These sets are used to compute the distance\n// between two regions for the purpose of language matching.\n// Size: 288 bytes, 72 elements\nvar regionInclusionBits = [72]uint32{\n\t// Entry 0 - 1F\n\t0x82400813, 0x000007a3, 0x00003844, 0x20000808,\n\t0x403c0011, 0x00000022, 0x20000844, 0x00000082,\n\t0x00000102, 0x00000202, 0x00000402, 0x2000384d,\n\t0x00001804, 0x20002804, 0x00404000, 0x00408000,\n\t0x00410000, 0x02020000, 0x00040010, 0x00080010,\n\t0x00100010, 0x00200010, 0x01c1c001, 0x00c00000,\n\t0x01400000, 0x1e020001, 0x06000000, 0x0a000000,\n\t0x12000000, 0x20002848, 0x40000010, 0x80000001,\n\t// Entry 20 - 3F\n\t0x00000001, 0x40000000, 0x00020000, 0x01000000,\n\t0x00008000, 0x00002000, 0x00000200, 0x00000008,\n\t0x00200000, 0x90000000, 0x00040000, 0x08000000,\n\t0x00000020, 0x84000000, 0x00000080, 0x00001000,\n\t0x00010000, 0x00000400, 0x04000000, 0x00000040,\n\t0x10000000, 0x00004000, 0x81000000, 0x88000000,\n\t0x00000100, 0x80020000, 0x00080000, 0x00100000,\n\t0x00800000, 0xffffffff, 0x82400fb3, 0xc27c0813,\n\t// Entry 40 - 5F\n\t0xa240385f, 0x83c1c813, 0x9e420813, 0x92000001,\n\t0x86000001, 0x81400001, 0x8a000001, 0x82020001,\n}\n\n// regionInclusionNext marks, for each entry in regionInclusionBits, the set of\n// all groups that are reachable from the groups set in the respective entry.\n// Size: 72 bytes, 72 elements\nvar regionInclusionNext = [72]uint8{\n\t// Entry 0 - 3F\n\t0x3d, 0x3e, 0x0b, 0x0b, 0x3f, 0x01, 0x0b, 0x01,\n\t0x01, 0x01, 0x01, 0x40, 0x0b, 0x0b, 0x16, 0x16,\n\t0x16, 0x19, 0x04, 0x04, 0x04, 0x04, 0x41, 0x16,\n\t0x16, 0x42, 0x19, 0x19, 0x19, 0x0b, 0x04, 0x00,\n\t0x00, 0x1e, 0x11, 0x18, 0x0f, 0x0d, 0x09, 0x03,\n\t0x15, 0x43, 0x12, 0x1b, 0x05, 0x44, 0x07, 0x0c,\n\t0x10, 0x0a, 0x1a, 0x06, 0x1c, 0x0e, 0x45, 0x46,\n\t0x08, 0x47, 0x13, 0x14, 0x17, 0x3d, 0x3d, 0x3d,\n\t// Entry 40 - 7F\n\t0x3d, 0x3d, 0x3d, 0x42, 0x42, 0x41, 0x42, 0x42,\n}\n\ntype parentRel struct {\n\tlang       uint16\n\tscript     uint8\n\tmaxScript  uint8\n\ttoRegion   uint16\n\tfromRegion []uint16\n}\n\n// Size: 412 bytes, 5 elements\nvar parents = [5]parentRel{\n\t0: {lang: 0x134, script: 0x0, maxScript: 0x52, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x24, 0x25, 0x2e, 0x33, 0x35, 0x3c, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4f, 0x51, 0x5b, 0x5c, 0x60, 0x63, 0x6c, 0x72, 0x73, 0x74, 0x7a, 0x7b, 0x7e, 0x7f, 0x80, 0x82, 0x8b, 0x8c, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9e, 0x9f, 0xa3, 0xa6, 0xa8, 0xac, 0xb0, 0xb3, 0xb4, 0xbe, 0xc5, 0xc9, 0xca, 0xcb, 0xcd, 0xcf, 0xd1, 0xd4, 0xd5, 0xdc, 0xde, 0xdf, 0xe5, 0xe6, 0xe7, 0xea, 0xef, 0x106, 0x108, 0x109, 0x10a, 0x10c, 0x10d, 0x111, 0x116, 0x11a, 0x11c, 0x11e, 0x124, 0x128, 0x12b, 0x12c, 0x12e, 0x130, 0x138, 0x13b, 0x13e, 0x141, 0x160, 0x161, 0x163}},\n\t1: {lang: 0x134, script: 0x0, maxScript: 0x52, toRegion: 0x1a, fromRegion: []uint16{0x2d, 0x4d, 0x5f, 0x62, 0x71, 0xd8, 0x10b, 0x10e}},\n\t2: {lang: 0x139, script: 0x0, maxScript: 0x52, toRegion: 0x1e, fromRegion: []uint16{0x2b, 0x3e, 0x40, 0x50, 0x53, 0x55, 0x58, 0x64, 0x68, 0x88, 0x8e, 0xce, 0xd7, 0xe1, 0xe3, 0xeb, 0xf0, 0x119, 0x134, 0x135, 0x13a}},\n\t3: {lang: 0x3b7, script: 0x0, maxScript: 0x52, toRegion: 0xed, fromRegion: []uint16{0x29, 0x4d, 0x59, 0x85, 0x8a, 0xb6, 0xc5, 0xd0, 0x117, 0x125}},\n\t4: {lang: 0x51f, script: 0x35, maxScript: 0x35, toRegion: 0x8c, fromRegion: []uint16{0xc5}},\n}\n\n// Total table size 25825 bytes (25KiB); checksum: 4E97CC5E\n"
  },
  {
    "path": "vendor/golang.org/x/text/language/tags.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage language\n\n// TODO: Various sets of commonly use tags and regions.\n\n// MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed.\n// It simplifies safe initialization of Tag values.\nfunc MustParse(s string) Tag {\n\tt, err := Parse(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed.\n// It simplifies safe initialization of Tag values.\nfunc (c CanonType) MustParse(s string) Tag {\n\tt, err := c.Parse(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn t\n}\n\n// MustParseBase is like ParseBase, but panics if the given base cannot be parsed.\n// It simplifies safe initialization of Base values.\nfunc MustParseBase(s string) Base {\n\tb, err := ParseBase(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn b\n}\n\n// MustParseScript is like ParseScript, but panics if the given script cannot be\n// parsed. It simplifies safe initialization of Script values.\nfunc MustParseScript(s string) Script {\n\tscr, err := ParseScript(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn scr\n}\n\n// MustParseRegion is like ParseRegion, but panics if the given region cannot be\n// parsed. It simplifies safe initialization of Region values.\nfunc MustParseRegion(s string) Region {\n\tr, err := ParseRegion(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn r\n}\n\nvar (\n\tund = Tag{}\n\n\tUnd Tag = Tag{}\n\n\tAfrikaans            Tag = Tag{lang: _af}                //  af\n\tAmharic              Tag = Tag{lang: _am}                //  am\n\tArabic               Tag = Tag{lang: _ar}                //  ar\n\tModernStandardArabic Tag = Tag{lang: _ar, region: _001}  //  ar-001\n\tAzerbaijani          Tag = Tag{lang: _az}                //  az\n\tBulgarian            Tag = Tag{lang: _bg}                //  bg\n\tBengali              Tag = Tag{lang: _bn}                //  bn\n\tCatalan              Tag = Tag{lang: _ca}                //  ca\n\tCzech                Tag = Tag{lang: _cs}                //  cs\n\tDanish               Tag = Tag{lang: _da}                //  da\n\tGerman               Tag = Tag{lang: _de}                //  de\n\tGreek                Tag = Tag{lang: _el}                //  el\n\tEnglish              Tag = Tag{lang: _en}                //  en\n\tAmericanEnglish      Tag = Tag{lang: _en, region: _US}   //  en-US\n\tBritishEnglish       Tag = Tag{lang: _en, region: _GB}   //  en-GB\n\tSpanish              Tag = Tag{lang: _es}                //  es\n\tEuropeanSpanish      Tag = Tag{lang: _es, region: _ES}   //  es-ES\n\tLatinAmericanSpanish Tag = Tag{lang: _es, region: _419}  //  es-419\n\tEstonian             Tag = Tag{lang: _et}                //  et\n\tPersian              Tag = Tag{lang: _fa}                //  fa\n\tFinnish              Tag = Tag{lang: _fi}                //  fi\n\tFilipino             Tag = Tag{lang: _fil}               //  fil\n\tFrench               Tag = Tag{lang: _fr}                //  fr\n\tCanadianFrench       Tag = Tag{lang: _fr, region: _CA}   //  fr-CA\n\tGujarati             Tag = Tag{lang: _gu}                //  gu\n\tHebrew               Tag = Tag{lang: _he}                //  he\n\tHindi                Tag = Tag{lang: _hi}                //  hi\n\tCroatian             Tag = Tag{lang: _hr}                //  hr\n\tHungarian            Tag = Tag{lang: _hu}                //  hu\n\tArmenian             Tag = Tag{lang: _hy}                //  hy\n\tIndonesian           Tag = Tag{lang: _id}                //  id\n\tIcelandic            Tag = Tag{lang: _is}                //  is\n\tItalian              Tag = Tag{lang: _it}                //  it\n\tJapanese             Tag = Tag{lang: _ja}                //  ja\n\tGeorgian             Tag = Tag{lang: _ka}                //  ka\n\tKazakh               Tag = Tag{lang: _kk}                //  kk\n\tKhmer                Tag = Tag{lang: _km}                //  km\n\tKannada              Tag = Tag{lang: _kn}                //  kn\n\tKorean               Tag = Tag{lang: _ko}                //  ko\n\tKirghiz              Tag = Tag{lang: _ky}                //  ky\n\tLao                  Tag = Tag{lang: _lo}                //  lo\n\tLithuanian           Tag = Tag{lang: _lt}                //  lt\n\tLatvian              Tag = Tag{lang: _lv}                //  lv\n\tMacedonian           Tag = Tag{lang: _mk}                //  mk\n\tMalayalam            Tag = Tag{lang: _ml}                //  ml\n\tMongolian            Tag = Tag{lang: _mn}                //  mn\n\tMarathi              Tag = Tag{lang: _mr}                //  mr\n\tMalay                Tag = Tag{lang: _ms}                //  ms\n\tBurmese              Tag = Tag{lang: _my}                //  my\n\tNepali               Tag = Tag{lang: _ne}                //  ne\n\tDutch                Tag = Tag{lang: _nl}                //  nl\n\tNorwegian            Tag = Tag{lang: _no}                //  no\n\tPunjabi              Tag = Tag{lang: _pa}                //  pa\n\tPolish               Tag = Tag{lang: _pl}                //  pl\n\tPortuguese           Tag = Tag{lang: _pt}                //  pt\n\tBrazilianPortuguese  Tag = Tag{lang: _pt, region: _BR}   //  pt-BR\n\tEuropeanPortuguese   Tag = Tag{lang: _pt, region: _PT}   //  pt-PT\n\tRomanian             Tag = Tag{lang: _ro}                //  ro\n\tRussian              Tag = Tag{lang: _ru}                //  ru\n\tSinhala              Tag = Tag{lang: _si}                //  si\n\tSlovak               Tag = Tag{lang: _sk}                //  sk\n\tSlovenian            Tag = Tag{lang: _sl}                //  sl\n\tAlbanian             Tag = Tag{lang: _sq}                //  sq\n\tSerbian              Tag = Tag{lang: _sr}                //  sr\n\tSerbianLatin         Tag = Tag{lang: _sr, script: _Latn} //  sr-Latn\n\tSwedish              Tag = Tag{lang: _sv}                //  sv\n\tSwahili              Tag = Tag{lang: _sw}                //  sw\n\tTamil                Tag = Tag{lang: _ta}                //  ta\n\tTelugu               Tag = Tag{lang: _te}                //  te\n\tThai                 Tag = Tag{lang: _th}                //  th\n\tTurkish              Tag = Tag{lang: _tr}                //  tr\n\tUkrainian            Tag = Tag{lang: _uk}                //  uk\n\tUrdu                 Tag = Tag{lang: _ur}                //  ur\n\tUzbek                Tag = Tag{lang: _uz}                //  uz\n\tVietnamese           Tag = Tag{lang: _vi}                //  vi\n\tChinese              Tag = Tag{lang: _zh}                //  zh\n\tSimplifiedChinese    Tag = Tag{lang: _zh, script: _Hans} //  zh-Hans\n\tTraditionalChinese   Tag = Tag{lang: _zh, script: _Hant} //  zh-Hant\n\tZulu                 Tag = Tag{lang: _zu}                //  zu\n)\n"
  },
  {
    "path": "vendor/golang.org/x/text/runes/cond.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage runes\n\nimport (\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/transform\"\n)\n\n// Note: below we pass invalid UTF-8 to the tIn and tNotIn transformers as is.\n// This is done for various reasons:\n// - To retain the semantics of the Nop transformer: if input is passed to a Nop\n//   one would expect it to be unchanged.\n// - It would be very expensive to pass a converted RuneError to a transformer:\n//   a transformer might need more source bytes after RuneError, meaning that\n//   the only way to pass it safely is to create a new buffer and manage the\n//   intermingling of RuneErrors and normal input.\n// - Many transformers leave ill-formed UTF-8 as is, so this is not\n//   inconsistent. Generally ill-formed UTF-8 is only replaced if it is a\n//   logical consequence of the operation (as for Map) or if it otherwise would\n//   pose security concerns (as for Remove).\n// - An alternative would be to return an error on ill-formed UTF-8, but this\n//   would be inconsistent with other operations.\n\n// If returns a transformer that applies tIn to consecutive runes for which\n// s.Contains(r) and tNotIn to consecutive runes for which !s.Contains(r). Reset\n// is called on tIn and tNotIn at the start of each run. A Nop transformer will\n// substitute a nil value passed to tIn or tNotIn. Invalid UTF-8 is translated\n// to RuneError to determine which transformer to apply, but is passed as is to\n// the respective transformer.\nfunc If(s Set, tIn, tNotIn transform.Transformer) Transformer {\n\tif tIn == nil && tNotIn == nil {\n\t\treturn Transformer{transform.Nop}\n\t}\n\tif tIn == nil {\n\t\ttIn = transform.Nop\n\t}\n\tif tNotIn == nil {\n\t\ttNotIn = transform.Nop\n\t}\n\tsIn, ok := tIn.(transform.SpanningTransformer)\n\tif !ok {\n\t\tsIn = dummySpan{tIn}\n\t}\n\tsNotIn, ok := tNotIn.(transform.SpanningTransformer)\n\tif !ok {\n\t\tsNotIn = dummySpan{tNotIn}\n\t}\n\n\ta := &cond{\n\t\ttIn:    sIn,\n\t\ttNotIn: sNotIn,\n\t\tf:      s.Contains,\n\t}\n\ta.Reset()\n\treturn Transformer{a}\n}\n\ntype dummySpan struct{ transform.Transformer }\n\nfunc (d dummySpan) Span(src []byte, atEOF bool) (n int, err error) {\n\treturn 0, transform.ErrEndOfSpan\n}\n\ntype cond struct {\n\ttIn, tNotIn transform.SpanningTransformer\n\tf           func(rune) bool\n\tcheck       func(rune) bool               // current check to perform\n\tt           transform.SpanningTransformer // current transformer to use\n}\n\n// Reset implements transform.Transformer.\nfunc (t *cond) Reset() {\n\tt.check = t.is\n\tt.t = t.tIn\n\tt.t.Reset() // notIn will be reset on first usage.\n}\n\nfunc (t *cond) is(r rune) bool {\n\tif t.f(r) {\n\t\treturn true\n\t}\n\tt.check = t.isNot\n\tt.t = t.tNotIn\n\tt.tNotIn.Reset()\n\treturn false\n}\n\nfunc (t *cond) isNot(r rune) bool {\n\tif !t.f(r) {\n\t\treturn true\n\t}\n\tt.check = t.is\n\tt.t = t.tIn\n\tt.tIn.Reset()\n\treturn false\n}\n\n// This implementation of Span doesn't help all too much, but it needs to be\n// there to satisfy this package's Transformer interface.\n// TODO: there are certainly room for improvements, though. For example, if\n// t.t == transform.Nop (which will a common occurrence) it will save a bundle\n// to special-case that loop.\nfunc (t *cond) Span(src []byte, atEOF bool) (n int, err error) {\n\tp := 0\n\tfor n < len(src) && err == nil {\n\t\t// Don't process too much at a time as the Spanner that will be\n\t\t// called on this block may terminate early.\n\t\tconst maxChunk = 4096\n\t\tmax := len(src)\n\t\tif v := n + maxChunk; v < max {\n\t\t\tmax = v\n\t\t}\n\t\tatEnd := false\n\t\tsize := 0\n\t\tcurrent := t.t\n\t\tfor ; p < max; p += size {\n\t\t\tr := rune(src[p])\n\t\t\tif r < utf8.RuneSelf {\n\t\t\t\tsize = 1\n\t\t\t} else if r, size = utf8.DecodeRune(src[p:]); size == 1 {\n\t\t\t\tif !atEOF && !utf8.FullRune(src[p:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !t.check(r) {\n\t\t\t\t// The next rune will be the start of a new run.\n\t\t\t\tatEnd = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tn2, err2 := current.Span(src[n:p], atEnd || (atEOF && p == len(src)))\n\t\tn += n2\n\t\tif err2 != nil {\n\t\t\treturn n, err2\n\t\t}\n\t\t// At this point either err != nil or t.check will pass for the rune at p.\n\t\tp = n + size\n\t}\n\treturn n, err\n}\n\nfunc (t *cond) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tp := 0\n\tfor nSrc < len(src) && err == nil {\n\t\t// Don't process too much at a time, as the work might be wasted if the\n\t\t// destination buffer isn't large enough to hold the result or a\n\t\t// transform returns an error early.\n\t\tconst maxChunk = 4096\n\t\tmax := len(src)\n\t\tif n := nSrc + maxChunk; n < len(src) {\n\t\t\tmax = n\n\t\t}\n\t\tatEnd := false\n\t\tsize := 0\n\t\tcurrent := t.t\n\t\tfor ; p < max; p += size {\n\t\t\tr := rune(src[p])\n\t\t\tif r < utf8.RuneSelf {\n\t\t\t\tsize = 1\n\t\t\t} else if r, size = utf8.DecodeRune(src[p:]); size == 1 {\n\t\t\t\tif !atEOF && !utf8.FullRune(src[p:]) {\n\t\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif !t.check(r) {\n\t\t\t\t// The next rune will be the start of a new run.\n\t\t\t\tatEnd = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tnDst2, nSrc2, err2 := current.Transform(dst[nDst:], src[nSrc:p], atEnd || (atEOF && p == len(src)))\n\t\tnDst += nDst2\n\t\tnSrc += nSrc2\n\t\tif err2 != nil {\n\t\t\treturn nDst, nSrc, err2\n\t\t}\n\t\t// At this point either err != nil or t.check will pass for the rune at p.\n\t\tp = nSrc + size\n\t}\n\treturn nDst, nSrc, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/runes/runes.go",
    "content": "// Copyright 2014 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package runes provide transforms for UTF-8 encoded text.\npackage runes // import \"golang.org/x/text/runes\"\n\nimport (\n\t\"unicode\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/transform\"\n)\n\n// A Set is a collection of runes.\ntype Set interface {\n\t// Contains returns true if r is contained in the set.\n\tContains(r rune) bool\n}\n\ntype setFunc func(rune) bool\n\nfunc (s setFunc) Contains(r rune) bool {\n\treturn s(r)\n}\n\n// Note: using funcs here instead of wrapping types result in cleaner\n// documentation and a smaller API.\n\n// In creates a Set with a Contains method that returns true for all runes in\n// the given RangeTable.\nfunc In(rt *unicode.RangeTable) Set {\n\treturn setFunc(func(r rune) bool { return unicode.Is(rt, r) })\n}\n\n// In creates a Set with a Contains method that returns true for all runes not\n// in the given RangeTable.\nfunc NotIn(rt *unicode.RangeTable) Set {\n\treturn setFunc(func(r rune) bool { return !unicode.Is(rt, r) })\n}\n\n// Predicate creates a Set with a Contains method that returns f(r).\nfunc Predicate(f func(rune) bool) Set {\n\treturn setFunc(f)\n}\n\n// Transformer implements the transform.Transformer interface.\ntype Transformer struct {\n\tt transform.SpanningTransformer\n}\n\nfunc (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\treturn t.t.Transform(dst, src, atEOF)\n}\n\nfunc (t Transformer) Span(b []byte, atEOF bool) (n int, err error) {\n\treturn t.t.Span(b, atEOF)\n}\n\nfunc (t Transformer) Reset() { t.t.Reset() }\n\n// Bytes returns a new byte slice with the result of converting b using t.  It\n// calls Reset on t. It returns nil if any error was found. This can only happen\n// if an error-producing Transformer is passed to If.\nfunc (t Transformer) Bytes(b []byte) []byte {\n\tb, _, err := transform.Bytes(t, b)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn b\n}\n\n// String returns a string with the result of converting s using t. It calls\n// Reset on t. It returns the empty string if any error was found. This can only\n// happen if an error-producing Transformer is passed to If.\nfunc (t Transformer) String(s string) string {\n\ts, _, err := transform.String(t, s)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn s\n}\n\n// TODO:\n// - Copy: copying strings and bytes in whole-rune units.\n// - Validation (maybe)\n// - Well-formed-ness (maybe)\n\nconst runeErrorString = string(utf8.RuneError)\n\n// Remove returns a Transformer that removes runes r for which s.Contains(r).\n// Illegal input bytes are replaced by RuneError before being passed to f.\nfunc Remove(s Set) Transformer {\n\tif f, ok := s.(setFunc); ok {\n\t\t// This little trick cuts the running time of BenchmarkRemove for sets\n\t\t// created by Predicate roughly in half.\n\t\t// TODO: special-case RangeTables as well.\n\t\treturn Transformer{remove(f)}\n\t}\n\treturn Transformer{remove(s.Contains)}\n}\n\n// TODO: remove transform.RemoveFunc.\n\ntype remove func(r rune) bool\n\nfunc (remove) Reset() {}\n\n// Span implements transform.Spanner.\nfunc (t remove) Span(src []byte, atEOF bool) (n int, err error) {\n\tfor r, size := rune(0), 0; n < len(src); {\n\t\tif r = rune(src[n]); r < utf8.RuneSelf {\n\t\t\tsize = 1\n\t\t} else if r, size = utf8.DecodeRune(src[n:]); size == 1 {\n\t\t\t// Invalid rune.\n\t\t\tif !atEOF && !utf8.FullRune(src[n:]) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t} else {\n\t\t\t\terr = transform.ErrEndOfSpan\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tif t(r) {\n\t\t\terr = transform.ErrEndOfSpan\n\t\t\tbreak\n\t\t}\n\t\tn += size\n\t}\n\treturn\n}\n\n// Transform implements transform.Transformer.\nfunc (t remove) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tfor r, size := rune(0), 0; nSrc < len(src); {\n\t\tif r = rune(src[nSrc]); r < utf8.RuneSelf {\n\t\t\tsize = 1\n\t\t} else if r, size = utf8.DecodeRune(src[nSrc:]); size == 1 {\n\t\t\t// Invalid rune.\n\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// We replace illegal bytes with RuneError. Not doing so might\n\t\t\t// otherwise turn a sequence of invalid UTF-8 into valid UTF-8.\n\t\t\t// The resulting byte sequence may subsequently contain runes\n\t\t\t// for which t(r) is true that were passed unnoticed.\n\t\t\tif !t(utf8.RuneError) {\n\t\t\t\tif nDst+3 > len(dst) {\n\t\t\t\t\terr = transform.ErrShortDst\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tdst[nDst+0] = runeErrorString[0]\n\t\t\t\tdst[nDst+1] = runeErrorString[1]\n\t\t\t\tdst[nDst+2] = runeErrorString[2]\n\t\t\t\tnDst += 3\n\t\t\t}\n\t\t\tnSrc++\n\t\t\tcontinue\n\t\t}\n\t\tif t(r) {\n\t\t\tnSrc += size\n\t\t\tcontinue\n\t\t}\n\t\tif nDst+size > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tfor i := 0; i < size; i++ {\n\t\t\tdst[nDst] = src[nSrc]\n\t\t\tnDst++\n\t\t\tnSrc++\n\t\t}\n\t}\n\treturn\n}\n\n// Map returns a Transformer that maps the runes in the input using the given\n// mapping. Illegal bytes in the input are converted to utf8.RuneError before\n// being passed to the mapping func.\nfunc Map(mapping func(rune) rune) Transformer {\n\treturn Transformer{mapper(mapping)}\n}\n\ntype mapper func(rune) rune\n\nfunc (mapper) Reset() {}\n\n// Span implements transform.Spanner.\nfunc (t mapper) Span(src []byte, atEOF bool) (n int, err error) {\n\tfor r, size := rune(0), 0; n < len(src); n += size {\n\t\tif r = rune(src[n]); r < utf8.RuneSelf {\n\t\t\tsize = 1\n\t\t} else if r, size = utf8.DecodeRune(src[n:]); size == 1 {\n\t\t\t// Invalid rune.\n\t\t\tif !atEOF && !utf8.FullRune(src[n:]) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t} else {\n\t\t\t\terr = transform.ErrEndOfSpan\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tif t(r) != r {\n\t\t\terr = transform.ErrEndOfSpan\n\t\t\tbreak\n\t\t}\n\t}\n\treturn n, err\n}\n\n// Transform implements transform.Transformer.\nfunc (t mapper) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tvar replacement rune\n\tvar b [utf8.UTFMax]byte\n\n\tfor r, size := rune(0), 0; nSrc < len(src); {\n\t\tif r = rune(src[nSrc]); r < utf8.RuneSelf {\n\t\t\tif replacement = t(r); replacement < utf8.RuneSelf {\n\t\t\t\tif nDst == len(dst) {\n\t\t\t\t\terr = transform.ErrShortDst\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tdst[nDst] = byte(replacement)\n\t\t\t\tnDst++\n\t\t\t\tnSrc++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tsize = 1\n\t\t} else if r, size = utf8.DecodeRune(src[nSrc:]); size == 1 {\n\t\t\t// Invalid rune.\n\t\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tif replacement = t(utf8.RuneError); replacement == utf8.RuneError {\n\t\t\t\tif nDst+3 > len(dst) {\n\t\t\t\t\terr = transform.ErrShortDst\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tdst[nDst+0] = runeErrorString[0]\n\t\t\t\tdst[nDst+1] = runeErrorString[1]\n\t\t\t\tdst[nDst+2] = runeErrorString[2]\n\t\t\t\tnDst += 3\n\t\t\t\tnSrc++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else if replacement = t(r); replacement == r {\n\t\t\tif nDst+size > len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tfor i := 0; i < size; i++ {\n\t\t\t\tdst[nDst] = src[nSrc]\n\t\t\t\tnDst++\n\t\t\t\tnSrc++\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tn := utf8.EncodeRune(b[:], replacement)\n\n\t\tif nDst+n > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tfor i := 0; i < n; i++ {\n\t\t\tdst[nDst] = b[i]\n\t\t\tnDst++\n\t\t}\n\t\tnSrc += size\n\t}\n\treturn\n}\n\n// ReplaceIllFormed returns a transformer that replaces all input bytes that are\n// not part of a well-formed UTF-8 code sequence with utf8.RuneError.\nfunc ReplaceIllFormed() Transformer {\n\treturn Transformer{&replaceIllFormed{}}\n}\n\ntype replaceIllFormed struct{ transform.NopResetter }\n\nfunc (t replaceIllFormed) Span(src []byte, atEOF bool) (n int, err error) {\n\tfor n < len(src) {\n\t\t// ASCII fast path.\n\t\tif src[n] < utf8.RuneSelf {\n\t\t\tn++\n\t\t\tcontinue\n\t\t}\n\n\t\tr, size := utf8.DecodeRune(src[n:])\n\n\t\t// Look for a valid non-ASCII rune.\n\t\tif r != utf8.RuneError || size != 1 {\n\t\t\tn += size\n\t\t\tcontinue\n\t\t}\n\n\t\t// Look for short source data.\n\t\tif !atEOF && !utf8.FullRune(src[n:]) {\n\t\t\terr = transform.ErrShortSrc\n\t\t\tbreak\n\t\t}\n\n\t\t// We have an invalid rune.\n\t\terr = transform.ErrEndOfSpan\n\t\tbreak\n\t}\n\treturn n, err\n}\n\nfunc (t replaceIllFormed) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tfor nSrc < len(src) {\n\t\t// ASCII fast path.\n\t\tif r := src[nSrc]; r < utf8.RuneSelf {\n\t\t\tif nDst == len(dst) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tdst[nDst] = r\n\t\t\tnDst++\n\t\t\tnSrc++\n\t\t\tcontinue\n\t\t}\n\n\t\t// Look for a valid non-ASCII rune.\n\t\tif _, size := utf8.DecodeRune(src[nSrc:]); size != 1 {\n\t\t\tif size != copy(dst[nDst:], src[nSrc:nSrc+size]) {\n\t\t\t\terr = transform.ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tnDst += size\n\t\t\tnSrc += size\n\t\t\tcontinue\n\t\t}\n\n\t\t// Look for short source data.\n\t\tif !atEOF && !utf8.FullRune(src[nSrc:]) {\n\t\t\terr = transform.ErrShortSrc\n\t\t\tbreak\n\t\t}\n\n\t\t// We have an invalid rune.\n\t\tif nDst+3 > len(dst) {\n\t\t\terr = transform.ErrShortDst\n\t\t\tbreak\n\t\t}\n\t\tdst[nDst+0] = runeErrorString[0]\n\t\tdst[nDst+1] = runeErrorString[1]\n\t\tdst[nDst+2] = runeErrorString[2]\n\t\tnDst += 3\n\t\tnSrc++\n\t}\n\treturn nDst, nSrc, err\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/secure/bidirule/bidirule.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package bidirule implements the Bidi Rule defined by RFC 5893.\n//\n// This package is under development. The API may change without notice and\n// without preserving backward compatibility.\npackage bidirule\n\nimport (\n\t\"errors\"\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/transform\"\n\t\"golang.org/x/text/unicode/bidi\"\n)\n\n// This file contains an implementation of RFC 5893: Right-to-Left Scripts for\n// Internationalized Domain Names for Applications (IDNA)\n//\n// A label is an individual component of a domain name.  Labels are usually\n// shown separated by dots; for example, the domain name \"www.example.com\" is\n// composed of three labels: \"www\", \"example\", and \"com\".\n//\n// An RTL label is a label that contains at least one character of class R, AL,\n// or AN. An LTR label is any label that is not an RTL label.\n//\n// A \"Bidi domain name\" is a domain name that contains at least one RTL label.\n//\n//  The following guarantees can be made based on the above:\n//\n//  o  In a domain name consisting of only labels that satisfy the rule,\n//     the requirements of Section 3 are satisfied.  Note that even LTR\n//     labels and pure ASCII labels have to be tested.\n//\n//  o  In a domain name consisting of only LDH labels (as defined in the\n//     Definitions document [RFC5890]) and labels that satisfy the rule,\n//     the requirements of Section 3 are satisfied as long as a label\n//     that starts with an ASCII digit does not come after a\n//     right-to-left label.\n//\n//  No guarantee is given for other combinations.\n\n// ErrInvalid indicates a label is invalid according to the Bidi Rule.\nvar ErrInvalid = errors.New(\"bidirule: failed Bidi Rule\")\n\ntype ruleState uint8\n\nconst (\n\truleInitial ruleState = iota\n\truleLTR\n\truleLTRFinal\n\truleRTL\n\truleRTLFinal\n\truleInvalid\n)\n\ntype ruleTransition struct {\n\tnext ruleState\n\tmask uint16\n}\n\nvar transitions = [...][2]ruleTransition{\n\t// [2.1] The first character must be a character with Bidi property L, R, or\n\t// AL. If it has the R or AL property, it is an RTL label; if it has the L\n\t// property, it is an LTR label.\n\truleInitial: {\n\t\t{ruleLTRFinal, 1 << bidi.L},\n\t\t{ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL},\n\t},\n\truleRTL: {\n\t\t// [2.3] In an RTL label, the end of the label must be a character with\n\t\t// Bidi property R, AL, EN, or AN, followed by zero or more characters\n\t\t// with Bidi property NSM.\n\t\t{ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN},\n\n\t\t// [2.2] In an RTL label, only characters with the Bidi properties R,\n\t\t// AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.\n\t\t// We exclude the entries from [2.3]\n\t\t{ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},\n\t},\n\truleRTLFinal: {\n\t\t// [2.3] In an RTL label, the end of the label must be a character with\n\t\t// Bidi property R, AL, EN, or AN, followed by zero or more characters\n\t\t// with Bidi property NSM.\n\t\t{ruleRTLFinal, 1<<bidi.R | 1<<bidi.AL | 1<<bidi.EN | 1<<bidi.AN | 1<<bidi.NSM},\n\n\t\t// [2.2] In an RTL label, only characters with the Bidi properties R,\n\t\t// AL, AN, EN, ES, CS, ET, ON, BN, or NSM are allowed.\n\t\t// We exclude the entries from [2.3] and NSM.\n\t\t{ruleRTL, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},\n\t},\n\truleLTR: {\n\t\t// [2.6] In an LTR label, the end of the label must be a character with\n\t\t// Bidi property L or EN, followed by zero or more characters with Bidi\n\t\t// property NSM.\n\t\t{ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN},\n\n\t\t// [2.5] In an LTR label, only characters with the Bidi properties L,\n\t\t// EN, ES, CS, ET, ON, BN, or NSM are allowed.\n\t\t// We exclude the entries from [2.6].\n\t\t{ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN | 1<<bidi.NSM},\n\t},\n\truleLTRFinal: {\n\t\t// [2.6] In an LTR label, the end of the label must be a character with\n\t\t// Bidi property L or EN, followed by zero or more characters with Bidi\n\t\t// property NSM.\n\t\t{ruleLTRFinal, 1<<bidi.L | 1<<bidi.EN | 1<<bidi.NSM},\n\n\t\t// [2.5] In an LTR label, only characters with the Bidi properties L,\n\t\t// EN, ES, CS, ET, ON, BN, or NSM are allowed.\n\t\t// We exclude the entries from [2.6].\n\t\t{ruleLTR, 1<<bidi.ES | 1<<bidi.CS | 1<<bidi.ET | 1<<bidi.ON | 1<<bidi.BN},\n\t},\n\truleInvalid: {\n\t\t{ruleInvalid, 0},\n\t\t{ruleInvalid, 0},\n\t},\n}\n\n// [2.4] In an RTL label, if an EN is present, no AN may be present, and\n// vice versa.\nconst exclusiveRTL = uint16(1<<bidi.EN | 1<<bidi.AN)\n\n// From RFC 5893\n// An RTL label is a label that contains at least one character of type\n// R, AL, or AN.\n//\n// An LTR label is any label that is not an RTL label.\n\n// Direction reports the direction of the given label as defined by RFC 5893.\n// The Bidi Rule does not have to be applied to labels of the category\n// LeftToRight.\nfunc Direction(b []byte) bidi.Direction {\n\tfor i := 0; i < len(b); {\n\t\te, sz := bidi.Lookup(b[i:])\n\t\tif sz == 0 {\n\t\t\ti++\n\t\t}\n\t\tc := e.Class()\n\t\tif c == bidi.R || c == bidi.AL || c == bidi.AN {\n\t\t\treturn bidi.RightToLeft\n\t\t}\n\t\ti += sz\n\t}\n\treturn bidi.LeftToRight\n}\n\n// DirectionString reports the direction of the given label as defined by RFC\n// 5893. The Bidi Rule does not have to be applied to labels of the category\n// LeftToRight.\nfunc DirectionString(s string) bidi.Direction {\n\tfor i := 0; i < len(s); {\n\t\te, sz := bidi.LookupString(s[i:])\n\t\tif sz == 0 {\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\t\tc := e.Class()\n\t\tif c == bidi.R || c == bidi.AL || c == bidi.AN {\n\t\t\treturn bidi.RightToLeft\n\t\t}\n\t\ti += sz\n\t}\n\treturn bidi.LeftToRight\n}\n\n// Valid reports whether b conforms to the BiDi rule.\nfunc Valid(b []byte) bool {\n\tvar t Transformer\n\tif n, ok := t.advance(b); !ok || n < len(b) {\n\t\treturn false\n\t}\n\treturn t.isFinal()\n}\n\n// ValidString reports whether s conforms to the BiDi rule.\nfunc ValidString(s string) bool {\n\tvar t Transformer\n\tif n, ok := t.advanceString(s); !ok || n < len(s) {\n\t\treturn false\n\t}\n\treturn t.isFinal()\n}\n\n// New returns a Transformer that verifies that input adheres to the Bidi Rule.\nfunc New() *Transformer {\n\treturn &Transformer{}\n}\n\n// Transformer implements transform.Transform.\ntype Transformer struct {\n\tstate  ruleState\n\thasRTL bool\n\tseen   uint16\n}\n\n// A rule can only be violated for \"Bidi Domain names\", meaning if one of the\n// following categories has been observed.\nfunc (t *Transformer) isRTL() bool {\n\tconst isRTL = 1<<bidi.R | 1<<bidi.AL | 1<<bidi.AN\n\treturn t.seen&isRTL != 0\n}\n\n// Reset implements transform.Transformer.\nfunc (t *Transformer) Reset() { *t = Transformer{} }\n\n// Transform implements transform.Transformer. This Transformer has state and\n// needs to be reset between uses.\nfunc (t *Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tif len(dst) < len(src) {\n\t\tsrc = src[:len(dst)]\n\t\tatEOF = false\n\t\terr = transform.ErrShortDst\n\t}\n\tn, err1 := t.Span(src, atEOF)\n\tcopy(dst, src[:n])\n\tif err == nil || err1 != nil && err1 != transform.ErrShortSrc {\n\t\terr = err1\n\t}\n\treturn n, n, err\n}\n\n// Span returns the first n bytes of src that conform to the Bidi rule.\nfunc (t *Transformer) Span(src []byte, atEOF bool) (n int, err error) {\n\tif t.state == ruleInvalid && t.isRTL() {\n\t\treturn 0, ErrInvalid\n\t}\n\tn, ok := t.advance(src)\n\tswitch {\n\tcase !ok:\n\t\terr = ErrInvalid\n\tcase n < len(src):\n\t\tif !atEOF {\n\t\t\terr = transform.ErrShortSrc\n\t\t\tbreak\n\t\t}\n\t\terr = ErrInvalid\n\tcase !t.isFinal():\n\t\terr = ErrInvalid\n\t}\n\treturn n, err\n}\n\n// Precomputing the ASCII values decreases running time for the ASCII fast path\n// by about 30%.\nvar asciiTable [128]bidi.Properties\n\nfunc init() {\n\tfor i := range asciiTable {\n\t\tp, _ := bidi.LookupRune(rune(i))\n\t\tasciiTable[i] = p\n\t}\n}\n\nfunc (t *Transformer) advance(s []byte) (n int, ok bool) {\n\tvar e bidi.Properties\n\tvar sz int\n\tfor n < len(s) {\n\t\tif s[n] < utf8.RuneSelf {\n\t\t\te, sz = asciiTable[s[n]], 1\n\t\t} else {\n\t\t\te, sz = bidi.Lookup(s[n:])\n\t\t\tif sz <= 1 {\n\t\t\t\tif sz == 1 {\n\t\t\t\t\t// We always consider invalid UTF-8 to be invalid, even if\n\t\t\t\t\t// the string has not yet been determined to be RTL.\n\t\t\t\t\t// TODO: is this correct?\n\t\t\t\t\treturn n, false\n\t\t\t\t}\n\t\t\t\treturn n, true // incomplete UTF-8 encoding\n\t\t\t}\n\t\t}\n\t\t// TODO: using CompactClass would result in noticeable speedup.\n\t\t// See unicode/bidi/prop.go:Properties.CompactClass.\n\t\tc := uint16(1 << e.Class())\n\t\tt.seen |= c\n\t\tif t.seen&exclusiveRTL == exclusiveRTL {\n\t\t\tt.state = ruleInvalid\n\t\t\treturn n, false\n\t\t}\n\t\tswitch tr := transitions[t.state]; {\n\t\tcase tr[0].mask&c != 0:\n\t\t\tt.state = tr[0].next\n\t\tcase tr[1].mask&c != 0:\n\t\t\tt.state = tr[1].next\n\t\tdefault:\n\t\t\tt.state = ruleInvalid\n\t\t\tif t.isRTL() {\n\t\t\t\treturn n, false\n\t\t\t}\n\t\t}\n\t\tn += sz\n\t}\n\treturn n, true\n}\n\nfunc (t *Transformer) advanceString(s string) (n int, ok bool) {\n\tvar e bidi.Properties\n\tvar sz int\n\tfor n < len(s) {\n\t\tif s[n] < utf8.RuneSelf {\n\t\t\te, sz = asciiTable[s[n]], 1\n\t\t} else {\n\t\t\te, sz = bidi.LookupString(s[n:])\n\t\t\tif sz <= 1 {\n\t\t\t\tif sz == 1 {\n\t\t\t\t\treturn n, false // invalid UTF-8\n\t\t\t\t}\n\t\t\t\treturn n, true // incomplete UTF-8 encoding\n\t\t\t}\n\t\t}\n\t\t// TODO: using CompactClass results in noticeable speedup.\n\t\t// See unicode/bidi/prop.go:Properties.CompactClass.\n\t\tc := uint16(1 << e.Class())\n\t\tt.seen |= c\n\t\tif t.seen&exclusiveRTL == exclusiveRTL {\n\t\t\tt.state = ruleInvalid\n\t\t\treturn n, false\n\t\t}\n\t\tswitch tr := transitions[t.state]; {\n\t\tcase tr[0].mask&c != 0:\n\t\t\tt.state = tr[0].next\n\t\tcase tr[1].mask&c != 0:\n\t\t\tt.state = tr[1].next\n\t\tdefault:\n\t\t\tt.state = ruleInvalid\n\t\t\tif t.isRTL() {\n\t\t\t\treturn n, false\n\t\t\t}\n\t\t}\n\t\tn += sz\n\t}\n\treturn n, true\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build go1.10\n\npackage bidirule\n\nfunc (t *Transformer) isFinal() bool {\n\treturn t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build !go1.10\n\npackage bidirule\n\nfunc (t *Transformer) isFinal() bool {\n\tif !t.isRTL() {\n\t\treturn true\n\t}\n\treturn t.state == ruleLTRFinal || t.state == ruleRTLFinal || t.state == ruleInitial\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/transform/transform.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package transform provides reader and writer wrappers that transform the\n// bytes passing through as well as various transformations. Example\n// transformations provided by other packages include normalization and\n// conversion between character sets.\npackage transform // import \"golang.org/x/text/transform\"\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n\t\"unicode/utf8\"\n)\n\nvar (\n\t// ErrShortDst means that the destination buffer was too short to\n\t// receive all of the transformed bytes.\n\tErrShortDst = errors.New(\"transform: short destination buffer\")\n\n\t// ErrShortSrc means that the source buffer has insufficient data to\n\t// complete the transformation.\n\tErrShortSrc = errors.New(\"transform: short source buffer\")\n\n\t// ErrEndOfSpan means that the input and output (the transformed input)\n\t// are not identical.\n\tErrEndOfSpan = errors.New(\"transform: input and output are not identical\")\n\n\t// errInconsistentByteCount means that Transform returned success (nil\n\t// error) but also returned nSrc inconsistent with the src argument.\n\terrInconsistentByteCount = errors.New(\"transform: inconsistent byte count returned\")\n\n\t// errShortInternal means that an internal buffer is not large enough\n\t// to make progress and the Transform operation must be aborted.\n\terrShortInternal = errors.New(\"transform: short internal buffer\")\n)\n\n// Transformer transforms bytes.\ntype Transformer interface {\n\t// Transform writes to dst the transformed bytes read from src, and\n\t// returns the number of dst bytes written and src bytes read. The\n\t// atEOF argument tells whether src represents the last bytes of the\n\t// input.\n\t//\n\t// Callers should always process the nDst bytes produced and account\n\t// for the nSrc bytes consumed before considering the error err.\n\t//\n\t// A nil error means that all of the transformed bytes (whether freshly\n\t// transformed from src or left over from previous Transform calls)\n\t// were written to dst. A nil error can be returned regardless of\n\t// whether atEOF is true. If err is nil then nSrc must equal len(src);\n\t// the converse is not necessarily true.\n\t//\n\t// ErrShortDst means that dst was too short to receive all of the\n\t// transformed bytes. ErrShortSrc means that src had insufficient data\n\t// to complete the transformation. If both conditions apply, then\n\t// either error may be returned. Other than the error conditions listed\n\t// here, implementations are free to report other errors that arise.\n\tTransform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error)\n\n\t// Reset resets the state and allows a Transformer to be reused.\n\tReset()\n}\n\n// SpanningTransformer extends the Transformer interface with a Span method\n// that determines how much of the input already conforms to the Transformer.\ntype SpanningTransformer interface {\n\tTransformer\n\n\t// Span returns a position in src such that transforming src[:n] results in\n\t// identical output src[:n] for these bytes. It does not necessarily return\n\t// the largest such n. The atEOF argument tells whether src represents the\n\t// last bytes of the input.\n\t//\n\t// Callers should always account for the n bytes consumed before\n\t// considering the error err.\n\t//\n\t// A nil error means that all input bytes are known to be identical to the\n\t// output produced by the Transformer. A nil error can be be returned\n\t// regardless of whether atEOF is true. If err is nil, then then n must\n\t// equal len(src); the converse is not necessarily true.\n\t//\n\t// ErrEndOfSpan means that the Transformer output may differ from the\n\t// input after n bytes. Note that n may be len(src), meaning that the output\n\t// would contain additional bytes after otherwise identical output.\n\t// ErrShortSrc means that src had insufficient data to determine whether the\n\t// remaining bytes would change. Other than the error conditions listed\n\t// here, implementations are free to report other errors that arise.\n\t//\n\t// Calling Span can modify the Transformer state as a side effect. In\n\t// effect, it does the transformation just as calling Transform would, only\n\t// without copying to a destination buffer and only up to a point it can\n\t// determine the input and output bytes are the same. This is obviously more\n\t// limited than calling Transform, but can be more efficient in terms of\n\t// copying and allocating buffers. Calls to Span and Transform may be\n\t// interleaved.\n\tSpan(src []byte, atEOF bool) (n int, err error)\n}\n\n// NopResetter can be embedded by implementations of Transformer to add a nop\n// Reset method.\ntype NopResetter struct{}\n\n// Reset implements the Reset method of the Transformer interface.\nfunc (NopResetter) Reset() {}\n\n// Reader wraps another io.Reader by transforming the bytes read.\ntype Reader struct {\n\tr   io.Reader\n\tt   Transformer\n\terr error\n\n\t// dst[dst0:dst1] contains bytes that have been transformed by t but\n\t// not yet copied out via Read.\n\tdst        []byte\n\tdst0, dst1 int\n\n\t// src[src0:src1] contains bytes that have been read from r but not\n\t// yet transformed through t.\n\tsrc        []byte\n\tsrc0, src1 int\n\n\t// transformComplete is whether the transformation is complete,\n\t// regardless of whether or not it was successful.\n\ttransformComplete bool\n}\n\nconst defaultBufSize = 4096\n\n// NewReader returns a new Reader that wraps r by transforming the bytes read\n// via t. It calls Reset on t.\nfunc NewReader(r io.Reader, t Transformer) *Reader {\n\tt.Reset()\n\treturn &Reader{\n\t\tr:   r,\n\t\tt:   t,\n\t\tdst: make([]byte, defaultBufSize),\n\t\tsrc: make([]byte, defaultBufSize),\n\t}\n}\n\n// Read implements the io.Reader interface.\nfunc (r *Reader) Read(p []byte) (int, error) {\n\tn, err := 0, error(nil)\n\tfor {\n\t\t// Copy out any transformed bytes and return the final error if we are done.\n\t\tif r.dst0 != r.dst1 {\n\t\t\tn = copy(p, r.dst[r.dst0:r.dst1])\n\t\t\tr.dst0 += n\n\t\t\tif r.dst0 == r.dst1 && r.transformComplete {\n\t\t\t\treturn n, r.err\n\t\t\t}\n\t\t\treturn n, nil\n\t\t} else if r.transformComplete {\n\t\t\treturn 0, r.err\n\t\t}\n\n\t\t// Try to transform some source bytes, or to flush the transformer if we\n\t\t// are out of source bytes. We do this even if r.r.Read returned an error.\n\t\t// As the io.Reader documentation says, \"process the n > 0 bytes returned\n\t\t// before considering the error\".\n\t\tif r.src0 != r.src1 || r.err != nil {\n\t\t\tr.dst0 = 0\n\t\t\tr.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF)\n\t\t\tr.src0 += n\n\n\t\t\tswitch {\n\t\t\tcase err == nil:\n\t\t\t\tif r.src0 != r.src1 {\n\t\t\t\t\tr.err = errInconsistentByteCount\n\t\t\t\t}\n\t\t\t\t// The Transform call was successful; we are complete if we\n\t\t\t\t// cannot read more bytes into src.\n\t\t\t\tr.transformComplete = r.err != nil\n\t\t\t\tcontinue\n\t\t\tcase err == ErrShortDst && (r.dst1 != 0 || n != 0):\n\t\t\t\t// Make room in dst by copying out, and try again.\n\t\t\t\tcontinue\n\t\t\tcase err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil:\n\t\t\t\t// Read more bytes into src via the code below, and try again.\n\t\t\tdefault:\n\t\t\t\tr.transformComplete = true\n\t\t\t\t// The reader error (r.err) takes precedence over the\n\t\t\t\t// transformer error (err) unless r.err is nil or io.EOF.\n\t\t\t\tif r.err == nil || r.err == io.EOF {\n\t\t\t\t\tr.err = err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t// Move any untransformed source bytes to the start of the buffer\n\t\t// and read more bytes.\n\t\tif r.src0 != 0 {\n\t\t\tr.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1])\n\t\t}\n\t\tn, r.err = r.r.Read(r.src[r.src1:])\n\t\tr.src1 += n\n\t}\n}\n\n// TODO: implement ReadByte (and ReadRune??).\n\n// Writer wraps another io.Writer by transforming the bytes read.\n// The user needs to call Close to flush unwritten bytes that may\n// be buffered.\ntype Writer struct {\n\tw   io.Writer\n\tt   Transformer\n\tdst []byte\n\n\t// src[:n] contains bytes that have not yet passed through t.\n\tsrc []byte\n\tn   int\n}\n\n// NewWriter returns a new Writer that wraps w by transforming the bytes written\n// via t. It calls Reset on t.\nfunc NewWriter(w io.Writer, t Transformer) *Writer {\n\tt.Reset()\n\treturn &Writer{\n\t\tw:   w,\n\t\tt:   t,\n\t\tdst: make([]byte, defaultBufSize),\n\t\tsrc: make([]byte, defaultBufSize),\n\t}\n}\n\n// Write implements the io.Writer interface. If there are not enough\n// bytes available to complete a Transform, the bytes will be buffered\n// for the next write. Call Close to convert the remaining bytes.\nfunc (w *Writer) Write(data []byte) (n int, err error) {\n\tsrc := data\n\tif w.n > 0 {\n\t\t// Append bytes from data to the last remainder.\n\t\t// TODO: limit the amount copied on first try.\n\t\tn = copy(w.src[w.n:], data)\n\t\tw.n += n\n\t\tsrc = w.src[:w.n]\n\t}\n\tfor {\n\t\tnDst, nSrc, err := w.t.Transform(w.dst, src, false)\n\t\tif _, werr := w.w.Write(w.dst[:nDst]); werr != nil {\n\t\t\treturn n, werr\n\t\t}\n\t\tsrc = src[nSrc:]\n\t\tif w.n == 0 {\n\t\t\tn += nSrc\n\t\t} else if len(src) <= n {\n\t\t\t// Enough bytes from w.src have been consumed. We make src point\n\t\t\t// to data instead to reduce the copying.\n\t\t\tw.n = 0\n\t\t\tn -= len(src)\n\t\t\tsrc = data[n:]\n\t\t\tif n < len(data) && (err == nil || err == ErrShortSrc) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t\tswitch err {\n\t\tcase ErrShortDst:\n\t\t\t// This error is okay as long as we are making progress.\n\t\t\tif nDst > 0 || nSrc > 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\t\tcase ErrShortSrc:\n\t\t\tif len(src) < len(w.src) {\n\t\t\t\tm := copy(w.src, src)\n\t\t\t\t// If w.n > 0, bytes from data were already copied to w.src and n\n\t\t\t\t// was already set to the number of bytes consumed.\n\t\t\t\tif w.n == 0 {\n\t\t\t\t\tn += m\n\t\t\t\t}\n\t\t\t\tw.n = m\n\t\t\t\terr = nil\n\t\t\t} else if nDst > 0 || nSrc > 0 {\n\t\t\t\t// Not enough buffer to store the remainder. Keep processing as\n\t\t\t\t// long as there is progress. Without this case, transforms that\n\t\t\t\t// require a lookahead larger than the buffer may result in an\n\t\t\t\t// error. This is not something one may expect to be common in\n\t\t\t\t// practice, but it may occur when buffers are set to small\n\t\t\t\t// sizes during testing.\n\t\t\t\tcontinue\n\t\t\t}\n\t\tcase nil:\n\t\t\tif w.n > 0 {\n\t\t\t\terr = errInconsistentByteCount\n\t\t\t}\n\t\t}\n\t\treturn n, err\n\t}\n}\n\n// Close implements the io.Closer interface.\nfunc (w *Writer) Close() error {\n\tsrc := w.src[:w.n]\n\tfor {\n\t\tnDst, nSrc, err := w.t.Transform(w.dst, src, true)\n\t\tif _, werr := w.w.Write(w.dst[:nDst]); werr != nil {\n\t\t\treturn werr\n\t\t}\n\t\tif err != ErrShortDst {\n\t\t\treturn err\n\t\t}\n\t\tsrc = src[nSrc:]\n\t}\n}\n\ntype nop struct{ NopResetter }\n\nfunc (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tn := copy(dst, src)\n\tif n < len(src) {\n\t\terr = ErrShortDst\n\t}\n\treturn n, n, err\n}\n\nfunc (nop) Span(src []byte, atEOF bool) (n int, err error) {\n\treturn len(src), nil\n}\n\ntype discard struct{ NopResetter }\n\nfunc (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\treturn 0, len(src), nil\n}\n\nvar (\n\t// Discard is a Transformer for which all Transform calls succeed\n\t// by consuming all bytes and writing nothing.\n\tDiscard Transformer = discard{}\n\n\t// Nop is a SpanningTransformer that copies src to dst.\n\tNop SpanningTransformer = nop{}\n)\n\n// chain is a sequence of links. A chain with N Transformers has N+1 links and\n// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst\n// buffers given to chain.Transform and the middle N-1 buffers are intermediate\n// buffers owned by the chain. The i'th link transforms bytes from the i'th\n// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer\n// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N).\ntype chain struct {\n\tlink []link\n\terr  error\n\t// errStart is the index at which the error occurred plus 1. Processing\n\t// errStart at this level at the next call to Transform. As long as\n\t// errStart > 0, chain will not consume any more source bytes.\n\terrStart int\n}\n\nfunc (c *chain) fatalError(errIndex int, err error) {\n\tif i := errIndex + 1; i > c.errStart {\n\t\tc.errStart = i\n\t\tc.err = err\n\t}\n}\n\ntype link struct {\n\tt Transformer\n\t// b[p:n] holds the bytes to be transformed by t.\n\tb []byte\n\tp int\n\tn int\n}\n\nfunc (l *link) src() []byte {\n\treturn l.b[l.p:l.n]\n}\n\nfunc (l *link) dst() []byte {\n\treturn l.b[l.n:]\n}\n\n// Chain returns a Transformer that applies t in sequence.\nfunc Chain(t ...Transformer) Transformer {\n\tif len(t) == 0 {\n\t\treturn nop{}\n\t}\n\tc := &chain{link: make([]link, len(t)+1)}\n\tfor i, tt := range t {\n\t\tc.link[i].t = tt\n\t}\n\t// Allocate intermediate buffers.\n\tb := make([][defaultBufSize]byte, len(t)-1)\n\tfor i := range b {\n\t\tc.link[i+1].b = b[i][:]\n\t}\n\treturn c\n}\n\n// Reset resets the state of Chain. It calls Reset on all the Transformers.\nfunc (c *chain) Reset() {\n\tfor i, l := range c.link {\n\t\tif l.t != nil {\n\t\t\tl.t.Reset()\n\t\t}\n\t\tc.link[i].p, c.link[i].n = 0, 0\n\t}\n}\n\n// TODO: make chain use Span (is going to be fun to implement!)\n\n// Transform applies the transformers of c in sequence.\nfunc (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\t// Set up src and dst in the chain.\n\tsrcL := &c.link[0]\n\tdstL := &c.link[len(c.link)-1]\n\tsrcL.b, srcL.p, srcL.n = src, 0, len(src)\n\tdstL.b, dstL.n = dst, 0\n\tvar lastFull, needProgress bool // for detecting progress\n\n\t// i is the index of the next Transformer to apply, for i in [low, high].\n\t// low is the lowest index for which c.link[low] may still produce bytes.\n\t// high is the highest index for which c.link[high] has a Transformer.\n\t// The error returned by Transform determines whether to increase or\n\t// decrease i. We try to completely fill a buffer before converting it.\n\tfor low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; {\n\t\tin, out := &c.link[i], &c.link[i+1]\n\t\tnDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i)\n\t\tout.n += nDst\n\t\tin.p += nSrc\n\t\tif i > 0 && in.p == in.n {\n\t\t\tin.p, in.n = 0, 0\n\t\t}\n\t\tneedProgress, lastFull = lastFull, false\n\t\tswitch err0 {\n\t\tcase ErrShortDst:\n\t\t\t// Process the destination buffer next. Return if we are already\n\t\t\t// at the high index.\n\t\t\tif i == high {\n\t\t\t\treturn dstL.n, srcL.p, ErrShortDst\n\t\t\t}\n\t\t\tif out.n != 0 {\n\t\t\t\ti++\n\t\t\t\t// If the Transformer at the next index is not able to process any\n\t\t\t\t// source bytes there is nothing that can be done to make progress\n\t\t\t\t// and the bytes will remain unprocessed. lastFull is used to\n\t\t\t\t// detect this and break out of the loop with a fatal error.\n\t\t\t\tlastFull = true\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// The destination buffer was too small, but is completely empty.\n\t\t\t// Return a fatal error as this transformation can never complete.\n\t\t\tc.fatalError(i, errShortInternal)\n\t\tcase ErrShortSrc:\n\t\t\tif i == 0 {\n\t\t\t\t// Save ErrShortSrc in err. All other errors take precedence.\n\t\t\t\terr = ErrShortSrc\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Source bytes were depleted before filling up the destination buffer.\n\t\t\t// Verify we made some progress, move the remaining bytes to the errStart\n\t\t\t// and try to get more source bytes.\n\t\t\tif needProgress && nSrc == 0 || in.n-in.p == len(in.b) {\n\t\t\t\t// There were not enough source bytes to proceed while the source\n\t\t\t\t// buffer cannot hold any more bytes. Return a fatal error as this\n\t\t\t\t// transformation can never complete.\n\t\t\t\tc.fatalError(i, errShortInternal)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// in.b is an internal buffer and we can make progress.\n\t\t\tin.p, in.n = 0, copy(in.b, in.src())\n\t\t\tfallthrough\n\t\tcase nil:\n\t\t\t// if i == low, we have depleted the bytes at index i or any lower levels.\n\t\t\t// In that case we increase low and i. In all other cases we decrease i to\n\t\t\t// fetch more bytes before proceeding to the next index.\n\t\t\tif i > low {\n\t\t\t\ti--\n\t\t\t\tcontinue\n\t\t\t}\n\t\tdefault:\n\t\t\tc.fatalError(i, err0)\n\t\t}\n\t\t// Exhausted level low or fatal error: increase low and continue\n\t\t// to process the bytes accepted so far.\n\t\ti++\n\t\tlow = i\n\t}\n\n\t// If c.errStart > 0, this means we found a fatal error.  We will clear\n\t// all upstream buffers. At this point, no more progress can be made\n\t// downstream, as Transform would have bailed while handling ErrShortDst.\n\tif c.errStart > 0 {\n\t\tfor i := 1; i < c.errStart; i++ {\n\t\t\tc.link[i].p, c.link[i].n = 0, 0\n\t\t}\n\t\terr, c.errStart, c.err = c.err, 0, nil\n\t}\n\treturn dstL.n, srcL.p, err\n}\n\n// Deprecated: use runes.Remove instead.\nfunc RemoveFunc(f func(r rune) bool) Transformer {\n\treturn removeF(f)\n}\n\ntype removeF func(r rune) bool\n\nfunc (removeF) Reset() {}\n\n// Transform implements the Transformer interface.\nfunc (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tfor r, sz := rune(0), 0; len(src) > 0; src = src[sz:] {\n\n\t\tif r = rune(src[0]); r < utf8.RuneSelf {\n\t\t\tsz = 1\n\t\t} else {\n\t\t\tr, sz = utf8.DecodeRune(src)\n\n\t\t\tif sz == 1 {\n\t\t\t\t// Invalid rune.\n\t\t\t\tif !atEOF && !utf8.FullRune(src) {\n\t\t\t\t\terr = ErrShortSrc\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\t// We replace illegal bytes with RuneError. Not doing so might\n\t\t\t\t// otherwise turn a sequence of invalid UTF-8 into valid UTF-8.\n\t\t\t\t// The resulting byte sequence may subsequently contain runes\n\t\t\t\t// for which t(r) is true that were passed unnoticed.\n\t\t\t\tif !t(r) {\n\t\t\t\t\tif nDst+3 > len(dst) {\n\t\t\t\t\t\terr = ErrShortDst\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tnDst += copy(dst[nDst:], \"\\uFFFD\")\n\t\t\t\t}\n\t\t\t\tnSrc++\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tif !t(r) {\n\t\t\tif nDst+sz > len(dst) {\n\t\t\t\terr = ErrShortDst\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tnDst += copy(dst[nDst:], src[:sz])\n\t\t}\n\t\tnSrc += sz\n\t}\n\treturn\n}\n\n// grow returns a new []byte that is longer than b, and copies the first n bytes\n// of b to the start of the new slice.\nfunc grow(b []byte, n int) []byte {\n\tm := len(b)\n\tif m <= 32 {\n\t\tm = 64\n\t} else if m <= 256 {\n\t\tm *= 2\n\t} else {\n\t\tm += m >> 1\n\t}\n\tbuf := make([]byte, m)\n\tcopy(buf, b[:n])\n\treturn buf\n}\n\nconst initialBufSize = 128\n\n// String returns a string with the result of converting s[:n] using t, where\n// n <= len(s). If err == nil, n will be len(s). It calls Reset on t.\nfunc String(t Transformer, s string) (result string, n int, err error) {\n\tt.Reset()\n\tif s == \"\" {\n\t\t// Fast path for the common case for empty input. Results in about a\n\t\t// 86% reduction of running time for BenchmarkStringLowerEmpty.\n\t\tif _, _, err := t.Transform(nil, nil, true); err == nil {\n\t\t\treturn \"\", 0, nil\n\t\t}\n\t}\n\n\t// Allocate only once. Note that both dst and src escape when passed to\n\t// Transform.\n\tbuf := [2 * initialBufSize]byte{}\n\tdst := buf[:initialBufSize:initialBufSize]\n\tsrc := buf[initialBufSize : 2*initialBufSize]\n\n\t// The input string s is transformed in multiple chunks (starting with a\n\t// chunk size of initialBufSize). nDst and nSrc are per-chunk (or\n\t// per-Transform-call) indexes, pDst and pSrc are overall indexes.\n\tnDst, nSrc := 0, 0\n\tpDst, pSrc := 0, 0\n\n\t// pPrefix is the length of a common prefix: the first pPrefix bytes of the\n\t// result will equal the first pPrefix bytes of s. It is not guaranteed to\n\t// be the largest such value, but if pPrefix, len(result) and len(s) are\n\t// all equal after the final transform (i.e. calling Transform with atEOF\n\t// being true returned nil error) then we don't need to allocate a new\n\t// result string.\n\tpPrefix := 0\n\tfor {\n\t\t// Invariant: pDst == pPrefix && pSrc == pPrefix.\n\n\t\tn := copy(src, s[pSrc:])\n\t\tnDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s))\n\t\tpDst += nDst\n\t\tpSrc += nSrc\n\n\t\t// TODO:  let transformers implement an optional Spanner interface, akin\n\t\t// to norm's QuickSpan. This would even allow us to avoid any allocation.\n\t\tif !bytes.Equal(dst[:nDst], src[:nSrc]) {\n\t\t\tbreak\n\t\t}\n\t\tpPrefix = pSrc\n\t\tif err == ErrShortDst {\n\t\t\t// A buffer can only be short if a transformer modifies its input.\n\t\t\tbreak\n\t\t} else if err == ErrShortSrc {\n\t\t\tif nSrc == 0 {\n\t\t\t\t// No progress was made.\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// Equal so far and !atEOF, so continue checking.\n\t\t} else if err != nil || pPrefix == len(s) {\n\t\t\treturn string(s[:pPrefix]), pPrefix, err\n\t\t}\n\t}\n\t// Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc.\n\n\t// We have transformed the first pSrc bytes of the input s to become pDst\n\t// transformed bytes. Those transformed bytes are discontiguous: the first\n\t// pPrefix of them equal s[:pPrefix] and the last nDst of them equal\n\t// dst[:nDst]. We copy them around, into a new dst buffer if necessary, so\n\t// that they become one contiguous slice: dst[:pDst].\n\tif pPrefix != 0 {\n\t\tnewDst := dst\n\t\tif pDst > len(newDst) {\n\t\t\tnewDst = make([]byte, len(s)+nDst-nSrc)\n\t\t}\n\t\tcopy(newDst[pPrefix:pDst], dst[:nDst])\n\t\tcopy(newDst[:pPrefix], s[:pPrefix])\n\t\tdst = newDst\n\t}\n\n\t// Prevent duplicate Transform calls with atEOF being true at the end of\n\t// the input. Also return if we have an unrecoverable error.\n\tif (err == nil && pSrc == len(s)) ||\n\t\t(err != nil && err != ErrShortDst && err != ErrShortSrc) {\n\t\treturn string(dst[:pDst]), pSrc, err\n\t}\n\n\t// Transform the remaining input, growing dst and src buffers as necessary.\n\tfor {\n\t\tn := copy(src, s[pSrc:])\n\t\tnDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s))\n\t\tpDst += nDst\n\t\tpSrc += nSrc\n\n\t\t// If we got ErrShortDst or ErrShortSrc, do not grow as long as we can\n\t\t// make progress. This may avoid excessive allocations.\n\t\tif err == ErrShortDst {\n\t\t\tif nDst == 0 {\n\t\t\t\tdst = grow(dst, pDst)\n\t\t\t}\n\t\t} else if err == ErrShortSrc {\n\t\t\tif nSrc == 0 {\n\t\t\t\tsrc = grow(src, 0)\n\t\t\t}\n\t\t} else if err != nil || pSrc == len(s) {\n\t\t\treturn string(dst[:pDst]), pSrc, err\n\t\t}\n\t}\n}\n\n// Bytes returns a new byte slice with the result of converting b[:n] using t,\n// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t.\nfunc Bytes(t Transformer, b []byte) (result []byte, n int, err error) {\n\treturn doAppend(t, 0, make([]byte, len(b)), b)\n}\n\n// Append appends the result of converting src[:n] using t to dst, where\n// n <= len(src), If err == nil, n will be len(src). It calls Reset on t.\nfunc Append(t Transformer, dst, src []byte) (result []byte, n int, err error) {\n\tif len(dst) == cap(dst) {\n\t\tn := len(src) + len(dst) // It is okay for this to be 0.\n\t\tb := make([]byte, n)\n\t\tdst = b[:copy(b, dst)]\n\t}\n\treturn doAppend(t, len(dst), dst[:cap(dst)], src)\n}\n\nfunc doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) {\n\tt.Reset()\n\tpSrc := 0\n\tfor {\n\t\tnDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true)\n\t\tpDst += nDst\n\t\tpSrc += nSrc\n\t\tif err != ErrShortDst {\n\t\t\treturn dst[:pDst], pSrc, err\n\t\t}\n\n\t\t// Grow the destination buffer, but do not grow as long as we can make\n\t\t// progress. This may avoid excessive allocations.\n\t\tif nDst == 0 {\n\t\t\tdst = grow(dst, pDst)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/bidi/bidi.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:generate go run gen.go gen_trieval.go gen_ranges.go\n\n// Package bidi contains functionality for bidirectional text support.\n//\n// See http://www.unicode.org/reports/tr9.\n//\n// NOTE: UNDER CONSTRUCTION. This API may change in backwards incompatible ways\n// and without notice.\npackage bidi // import \"golang.org/x/text/unicode/bidi\"\n\n// TODO:\n// The following functionality would not be hard to implement, but hinges on\n// the definition of a Segmenter interface. For now this is up to the user.\n// - Iterate over paragraphs\n// - Segmenter to iterate over runs directly from a given text.\n// Also:\n// - Transformer for reordering?\n// - Transformer (validator, really) for Bidi Rule.\n\n// This API tries to avoid dealing with embedding levels for now. Under the hood\n// these will be computed, but the question is to which extent the user should\n// know they exist. We should at some point allow the user to specify an\n// embedding hierarchy, though.\n\n// A Direction indicates the overall flow of text.\ntype Direction int\n\nconst (\n\t// LeftToRight indicates the text contains no right-to-left characters and\n\t// that either there are some left-to-right characters or the option\n\t// DefaultDirection(LeftToRight) was passed.\n\tLeftToRight Direction = iota\n\n\t// RightToLeft indicates the text contains no left-to-right characters and\n\t// that either there are some right-to-left characters or the option\n\t// DefaultDirection(RightToLeft) was passed.\n\tRightToLeft\n\n\t// Mixed indicates text contains both left-to-right and right-to-left\n\t// characters.\n\tMixed\n\n\t// Neutral means that text contains no left-to-right and right-to-left\n\t// characters and that no default direction has been set.\n\tNeutral\n)\n\ntype options struct{}\n\n// An Option is an option for Bidi processing.\ntype Option func(*options)\n\n// ICU allows the user to define embedding levels. This may be used, for example,\n// to use hierarchical structure of markup languages to define embeddings.\n// The following option may be a way to expose this functionality in this API.\n// // LevelFunc sets a function that associates nesting levels with the given text.\n// // The levels function will be called with monotonically increasing values for p.\n// func LevelFunc(levels func(p int) int) Option {\n// \tpanic(\"unimplemented\")\n// }\n\n// DefaultDirection sets the default direction for a Paragraph. The direction is\n// overridden if the text contains directional characters.\nfunc DefaultDirection(d Direction) Option {\n\tpanic(\"unimplemented\")\n}\n\n// A Paragraph holds a single Paragraph for Bidi processing.\ntype Paragraph struct {\n\t// buffers\n}\n\n// SetBytes configures p for the given paragraph text. It replaces text\n// previously set by SetBytes or SetString. If b contains a paragraph separator\n// it will only process the first paragraph and report the number of bytes\n// consumed from b including this separator. Error may be non-nil if options are\n// given.\nfunc (p *Paragraph) SetBytes(b []byte, opts ...Option) (n int, err error) {\n\tpanic(\"unimplemented\")\n}\n\n// SetString configures p for the given paragraph text. It replaces text\n// previously set by SetBytes or SetString. If b contains a paragraph separator\n// it will only process the first paragraph and report the number of bytes\n// consumed from b including this separator. Error may be non-nil if options are\n// given.\nfunc (p *Paragraph) SetString(s string, opts ...Option) (n int, err error) {\n\tpanic(\"unimplemented\")\n}\n\n// IsLeftToRight reports whether the principle direction of rendering for this\n// paragraphs is left-to-right. If this returns false, the principle direction\n// of rendering is right-to-left.\nfunc (p *Paragraph) IsLeftToRight() bool {\n\tpanic(\"unimplemented\")\n}\n\n// Direction returns the direction of the text of this paragraph.\n//\n// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.\nfunc (p *Paragraph) Direction() Direction {\n\tpanic(\"unimplemented\")\n}\n\n// RunAt reports the Run at the given position of the input text.\n//\n// This method can be used for computing line breaks on paragraphs.\nfunc (p *Paragraph) RunAt(pos int) Run {\n\tpanic(\"unimplemented\")\n}\n\n// Order computes the visual ordering of all the runs in a Paragraph.\nfunc (p *Paragraph) Order() (Ordering, error) {\n\tpanic(\"unimplemented\")\n}\n\n// Line computes the visual ordering of runs for a single line starting and\n// ending at the given positions in the original text.\nfunc (p *Paragraph) Line(start, end int) (Ordering, error) {\n\tpanic(\"unimplemented\")\n}\n\n// An Ordering holds the computed visual order of runs of a Paragraph. Calling\n// SetBytes or SetString on the originating Paragraph invalidates an Ordering.\n// The methods of an Ordering should only be called by one goroutine at a time.\ntype Ordering struct{}\n\n// Direction reports the directionality of the runs.\n//\n// The direction may be LeftToRight, RightToLeft, Mixed, or Neutral.\nfunc (o *Ordering) Direction() Direction {\n\tpanic(\"unimplemented\")\n}\n\n// NumRuns returns the number of runs.\nfunc (o *Ordering) NumRuns() int {\n\tpanic(\"unimplemented\")\n}\n\n// Run returns the ith run within the ordering.\nfunc (o *Ordering) Run(i int) Run {\n\tpanic(\"unimplemented\")\n}\n\n// TODO: perhaps with options.\n// // Reorder creates a reader that reads the runes in visual order per character.\n// // Modifiers remain after the runes they modify.\n// func (l *Runs) Reorder() io.Reader {\n// \tpanic(\"unimplemented\")\n// }\n\n// A Run is a continuous sequence of characters of a single direction.\ntype Run struct {\n}\n\n// String returns the text of the run in its original order.\nfunc (r *Run) String() string {\n\tpanic(\"unimplemented\")\n}\n\n// Bytes returns the text of the run in its original order.\nfunc (r *Run) Bytes() []byte {\n\tpanic(\"unimplemented\")\n}\n\n// TODO: methods for\n// - Display order\n// - headers and footers\n// - bracket replacement.\n\n// Direction reports the direction of the run.\nfunc (r *Run) Direction() Direction {\n\tpanic(\"unimplemented\")\n}\n\n// Position of the Run within the text passed to SetBytes or SetString of the\n// originating Paragraph value.\nfunc (r *Run) Pos() (start, end int) {\n\tpanic(\"unimplemented\")\n}\n\n// AppendReverse reverses the order of characters of in, appends them to out,\n// and returns the result. Modifiers will still follow the runes they modify.\n// Brackets are replaced with their counterparts.\nfunc AppendReverse(out, in []byte) []byte {\n\tpanic(\"unimplemented\")\n}\n\n// ReverseString reverses the order of characters in s and returns a new string.\n// Modifiers will still follow the runes they modify. Brackets are replaced with\n// their counterparts.\nfunc ReverseString(s string) string {\n\tpanic(\"unimplemented\")\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/bidi/bracket.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage bidi\n\nimport (\n\t\"container/list\"\n\t\"fmt\"\n\t\"sort\"\n)\n\n// This file contains a port of the reference implementation of the\n// Bidi Parentheses Algorithm:\n// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/BidiPBAReference.java\n//\n// The implementation in this file covers definitions BD14-BD16 and rule N0\n// of UAX#9.\n//\n// Some preprocessing is done for each rune before data is passed to this\n// algorithm:\n//  - opening and closing brackets are identified\n//  - a bracket pair type, like '(' and ')' is assigned a unique identifier that\n//    is identical for the opening and closing bracket. It is left to do these\n//    mappings.\n//  - The BPA algorithm requires that bracket characters that are canonical\n//    equivalents of each other be able to be substituted for each other.\n//    It is the responsibility of the caller to do this canonicalization.\n//\n// In implementing BD16, this implementation departs slightly from the \"logical\"\n// algorithm defined in UAX#9. In particular, the stack referenced there\n// supports operations that go beyond a \"basic\" stack. An equivalent\n// implementation based on a linked list is used here.\n\n// Bidi_Paired_Bracket_Type\n// BD14. An opening paired bracket is a character whose\n// Bidi_Paired_Bracket_Type property value is Open.\n//\n// BD15. A closing paired bracket is a character whose\n// Bidi_Paired_Bracket_Type property value is Close.\ntype bracketType byte\n\nconst (\n\tbpNone bracketType = iota\n\tbpOpen\n\tbpClose\n)\n\n// bracketPair holds a pair of index values for opening and closing bracket\n// location of a bracket pair.\ntype bracketPair struct {\n\topener int\n\tcloser int\n}\n\nfunc (b *bracketPair) String() string {\n\treturn fmt.Sprintf(\"(%v, %v)\", b.opener, b.closer)\n}\n\n// bracketPairs is a slice of bracketPairs with a sort.Interface implementation.\ntype bracketPairs []bracketPair\n\nfunc (b bracketPairs) Len() int           { return len(b) }\nfunc (b bracketPairs) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }\nfunc (b bracketPairs) Less(i, j int) bool { return b[i].opener < b[j].opener }\n\n// resolvePairedBrackets runs the paired bracket part of the UBA algorithm.\n//\n// For each rune, it takes the indexes into the original string, the class the\n// bracket type (in pairTypes) and the bracket identifier (pairValues). It also\n// takes the direction type for the start-of-sentence and the embedding level.\n//\n// The identifiers for bracket types are the rune of the canonicalized opening\n// bracket for brackets (open or close) or 0 for runes that are not brackets.\nfunc resolvePairedBrackets(s *isolatingRunSequence) {\n\tp := bracketPairer{\n\t\tsos:              s.sos,\n\t\topeners:          list.New(),\n\t\tcodesIsolatedRun: s.types,\n\t\tindexes:          s.indexes,\n\t}\n\tdirEmbed := L\n\tif s.level&1 != 0 {\n\t\tdirEmbed = R\n\t}\n\tp.locateBrackets(s.p.pairTypes, s.p.pairValues)\n\tp.resolveBrackets(dirEmbed, s.p.initialTypes)\n}\n\ntype bracketPairer struct {\n\tsos Class // direction corresponding to start of sequence\n\n\t// The following is a restatement of BD 16 using non-algorithmic language.\n\t//\n\t// A bracket pair is a pair of characters consisting of an opening\n\t// paired bracket and a closing paired bracket such that the\n\t// Bidi_Paired_Bracket property value of the former equals the latter,\n\t// subject to the following constraints.\n\t// - both characters of a pair occur in the same isolating run sequence\n\t// - the closing character of a pair follows the opening character\n\t// - any bracket character can belong at most to one pair, the earliest possible one\n\t// - any bracket character not part of a pair is treated like an ordinary character\n\t// - pairs may nest properly, but their spans may not overlap otherwise\n\n\t// Bracket characters with canonical decompositions are supposed to be\n\t// treated as if they had been normalized, to allow normalized and non-\n\t// normalized text to give the same result. In this implementation that step\n\t// is pushed out to the caller. The caller has to ensure that the pairValue\n\t// slices contain the rune of the opening bracket after normalization for\n\t// any opening or closing bracket.\n\n\topeners *list.List // list of positions for opening brackets\n\n\t// bracket pair positions sorted by location of opening bracket\n\tpairPositions bracketPairs\n\n\tcodesIsolatedRun []Class // directional bidi codes for an isolated run\n\tindexes          []int   // array of index values into the original string\n\n}\n\n// matchOpener reports whether characters at given positions form a matching\n// bracket pair.\nfunc (p *bracketPairer) matchOpener(pairValues []rune, opener, closer int) bool {\n\treturn pairValues[p.indexes[opener]] == pairValues[p.indexes[closer]]\n}\n\nconst maxPairingDepth = 63\n\n// locateBrackets locates matching bracket pairs according to BD16.\n//\n// This implementation uses a linked list instead of a stack, because, while\n// elements are added at the front (like a push) they are not generally removed\n// in atomic 'pop' operations, reducing the benefit of the stack archetype.\nfunc (p *bracketPairer) locateBrackets(pairTypes []bracketType, pairValues []rune) {\n\t// traverse the run\n\t// do that explicitly (not in a for-each) so we can record position\n\tfor i, index := range p.indexes {\n\n\t\t// look at the bracket type for each character\n\t\tif pairTypes[index] == bpNone || p.codesIsolatedRun[i] != ON {\n\t\t\t// continue scanning\n\t\t\tcontinue\n\t\t}\n\t\tswitch pairTypes[index] {\n\t\tcase bpOpen:\n\t\t\t// check if maximum pairing depth reached\n\t\t\tif p.openers.Len() == maxPairingDepth {\n\t\t\t\tp.openers.Init()\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// remember opener location, most recent first\n\t\t\tp.openers.PushFront(i)\n\n\t\tcase bpClose:\n\t\t\t// see if there is a match\n\t\t\tcount := 0\n\t\t\tfor elem := p.openers.Front(); elem != nil; elem = elem.Next() {\n\t\t\t\tcount++\n\t\t\t\topener := elem.Value.(int)\n\t\t\t\tif p.matchOpener(pairValues, opener, i) {\n\t\t\t\t\t// if the opener matches, add nested pair to the ordered list\n\t\t\t\t\tp.pairPositions = append(p.pairPositions, bracketPair{opener, i})\n\t\t\t\t\t// remove up to and including matched opener\n\t\t\t\t\tfor ; count > 0; count-- {\n\t\t\t\t\t\tp.openers.Remove(p.openers.Front())\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tsort.Sort(p.pairPositions)\n\t\t\t// if we get here, the closing bracket matched no openers\n\t\t\t// and gets ignored\n\t\t}\n\t}\n}\n\n// Bracket pairs within an isolating run sequence are processed as units so\n// that both the opening and the closing paired bracket in a pair resolve to\n// the same direction.\n//\n// N0. Process bracket pairs in an isolating run sequence sequentially in\n// the logical order of the text positions of the opening paired brackets\n// using the logic given below. Within this scope, bidirectional types EN\n// and AN are treated as R.\n//\n// Identify the bracket pairs in the current isolating run sequence\n// according to BD16. For each bracket-pair element in the list of pairs of\n// text positions:\n//\n// a Inspect the bidirectional types of the characters enclosed within the\n// bracket pair.\n//\n// b If any strong type (either L or R) matching the embedding direction is\n// found, set the type for both brackets in the pair to match the embedding\n// direction.\n//\n// o [ e ] o -> o e e e o\n//\n// o [ o e ] -> o e o e e\n//\n// o [ NI e ] -> o e NI e e\n//\n// c Otherwise, if a strong type (opposite the embedding direction) is\n// found, test for adjacent strong types as follows: 1 First, check\n// backwards before the opening paired bracket until the first strong type\n// (L, R, or sos) is found. If that first preceding strong type is opposite\n// the embedding direction, then set the type for both brackets in the pair\n// to that type. 2 Otherwise, set the type for both brackets in the pair to\n// the embedding direction.\n//\n// o [ o ] e -> o o o o e\n//\n// o [ o NI ] o -> o o o NI o o\n//\n// e [ o ] o -> e e o e o\n//\n// e [ o ] e -> e e o e e\n//\n// e ( o [ o ] NI ) e -> e e o o o o NI e e\n//\n// d Otherwise, do not set the type for the current bracket pair. Note that\n// if the enclosed text contains no strong types the paired brackets will\n// both resolve to the same level when resolved individually using rules N1\n// and N2.\n//\n// e ( NI ) o -> e ( NI ) o\n\n// getStrongTypeN0 maps character's directional code to strong type as required\n// by rule N0.\n//\n// TODO: have separate type for \"strong\" directionality.\nfunc (p *bracketPairer) getStrongTypeN0(index int) Class {\n\tswitch p.codesIsolatedRun[index] {\n\t// in the scope of N0, number types are treated as R\n\tcase EN, AN, AL, R:\n\t\treturn R\n\tcase L:\n\t\treturn L\n\tdefault:\n\t\treturn ON\n\t}\n}\n\n// classifyPairContent reports the strong types contained inside a Bracket Pair,\n// assuming the given embedding direction.\n//\n// It returns ON if no strong type is found. If a single strong type is found,\n// it returns this this type. Otherwise it returns the embedding direction.\n//\n// TODO: use separate type for \"strong\" directionality.\nfunc (p *bracketPairer) classifyPairContent(loc bracketPair, dirEmbed Class) Class {\n\tdirOpposite := ON\n\tfor i := loc.opener + 1; i < loc.closer; i++ {\n\t\tdir := p.getStrongTypeN0(i)\n\t\tif dir == ON {\n\t\t\tcontinue\n\t\t}\n\t\tif dir == dirEmbed {\n\t\t\treturn dir // type matching embedding direction found\n\t\t}\n\t\tdirOpposite = dir\n\t}\n\t// return ON if no strong type found, or class opposite to dirEmbed\n\treturn dirOpposite\n}\n\n// classBeforePair determines which strong types are present before a Bracket\n// Pair. Return R or L if strong type found, otherwise ON.\nfunc (p *bracketPairer) classBeforePair(loc bracketPair) Class {\n\tfor i := loc.opener - 1; i >= 0; i-- {\n\t\tif dir := p.getStrongTypeN0(i); dir != ON {\n\t\t\treturn dir\n\t\t}\n\t}\n\t// no strong types found, return sos\n\treturn p.sos\n}\n\n// assignBracketType implements rule N0 for a single bracket pair.\nfunc (p *bracketPairer) assignBracketType(loc bracketPair, dirEmbed Class, initialTypes []Class) {\n\t// rule \"N0, a\", inspect contents of pair\n\tdirPair := p.classifyPairContent(loc, dirEmbed)\n\n\t// dirPair is now L, R, or N (no strong type found)\n\n\t// the following logical tests are performed out of order compared to\n\t// the statement of the rules but yield the same results\n\tif dirPair == ON {\n\t\treturn // case \"d\" - nothing to do\n\t}\n\n\tif dirPair != dirEmbed {\n\t\t// case \"c\": strong type found, opposite - check before (c.1)\n\t\tdirPair = p.classBeforePair(loc)\n\t\tif dirPair == dirEmbed || dirPair == ON {\n\t\t\t// no strong opposite type found before - use embedding (c.2)\n\t\t\tdirPair = dirEmbed\n\t\t}\n\t}\n\t// else: case \"b\", strong type found matching embedding,\n\t// no explicit action needed, as dirPair is already set to embedding\n\t// direction\n\n\t// set the bracket types to the type found\n\tp.setBracketsToType(loc, dirPair, initialTypes)\n}\n\nfunc (p *bracketPairer) setBracketsToType(loc bracketPair, dirPair Class, initialTypes []Class) {\n\tp.codesIsolatedRun[loc.opener] = dirPair\n\tp.codesIsolatedRun[loc.closer] = dirPair\n\n\tfor i := loc.opener + 1; i < loc.closer; i++ {\n\t\tindex := p.indexes[i]\n\t\tif initialTypes[index] != NSM {\n\t\t\tbreak\n\t\t}\n\t\tp.codesIsolatedRun[i] = dirPair\n\t}\n\n\tfor i := loc.closer + 1; i < len(p.indexes); i++ {\n\t\tindex := p.indexes[i]\n\t\tif initialTypes[index] != NSM {\n\t\t\tbreak\n\t\t}\n\t\tp.codesIsolatedRun[i] = dirPair\n\t}\n}\n\n// resolveBrackets implements rule N0 for a list of pairs.\nfunc (p *bracketPairer) resolveBrackets(dirEmbed Class, initialTypes []Class) {\n\tfor _, loc := range p.pairPositions {\n\t\tp.assignBracketType(loc, dirEmbed, initialTypes)\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/bidi/core.go",
    "content": "// Copyright 2015 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage bidi\n\nimport \"log\"\n\n// This implementation is a port based on the reference implementation found at:\n// http://www.unicode.org/Public/PROGRAMS/BidiReferenceJava/\n//\n// described in Unicode Bidirectional Algorithm (UAX #9).\n//\n// Input:\n// There are two levels of input to the algorithm, since clients may prefer to\n// supply some information from out-of-band sources rather than relying on the\n// default behavior.\n//\n// - Bidi class array\n// - Bidi class array, with externally supplied base line direction\n//\n// Output:\n// Output is separated into several stages:\n//\n//  - levels array over entire paragraph\n//  - reordering array over entire paragraph\n//  - levels array over line\n//  - reordering array over line\n//\n// Note that for conformance to the Unicode Bidirectional Algorithm,\n// implementations are only required to generate correct reordering and\n// character directionality (odd or even levels) over a line. Generating\n// identical level arrays over a line is not required. Bidi explicit format\n// codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned arbitrary levels and\n// positions as long as the rest of the input is properly reordered.\n//\n// As the algorithm is defined to operate on a single paragraph at a time, this\n// implementation is written to handle single paragraphs. Thus rule P1 is\n// presumed by this implementation-- the data provided to the implementation is\n// assumed to be a single paragraph, and either contains no 'B' codes, or a\n// single 'B' code at the end of the input. 'B' is allowed as input to\n// illustrate how the algorithm assigns it a level.\n//\n// Also note that rules L3 and L4 depend on the rendering engine that uses the\n// result of the bidi algorithm. This implementation assumes that the rendering\n// engine expects combining marks in visual order (e.g. to the left of their\n// base character in RTL runs) and that it adjusts the glyphs used to render\n// mirrored characters that are in RTL runs so that they render appropriately.\n\n// level is the embedding level of a character. Even embedding levels indicate\n// left-to-right order and odd levels indicate right-to-left order. The special\n// level of -1 is reserved for undefined order.\ntype level int8\n\nconst implicitLevel level = -1\n\n// in returns if x is equal to any of the values in set.\nfunc (c Class) in(set ...Class) bool {\n\tfor _, s := range set {\n\t\tif c == s {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// A paragraph contains the state of a paragraph.\ntype paragraph struct {\n\tinitialTypes []Class\n\n\t// Arrays of properties needed for paired bracket evaluation in N0\n\tpairTypes  []bracketType // paired Bracket types for paragraph\n\tpairValues []rune        // rune for opening bracket or pbOpen and pbClose; 0 for pbNone\n\n\tembeddingLevel level // default: = implicitLevel;\n\n\t// at the paragraph levels\n\tresultTypes  []Class\n\tresultLevels []level\n\n\t// Index of matching PDI for isolate initiator characters. For other\n\t// characters, the value of matchingPDI will be set to -1. For isolate\n\t// initiators with no matching PDI, matchingPDI will be set to the length of\n\t// the input string.\n\tmatchingPDI []int\n\n\t// Index of matching isolate initiator for PDI characters. For other\n\t// characters, and for PDIs with no matching isolate initiator, the value of\n\t// matchingIsolateInitiator will be set to -1.\n\tmatchingIsolateInitiator []int\n}\n\n// newParagraph initializes a paragraph. The user needs to supply a few arrays\n// corresponding to the preprocessed text input. The types correspond to the\n// Unicode BiDi classes for each rune. pairTypes indicates the bracket type for\n// each rune. pairValues provides a unique bracket class identifier for each\n// rune (suggested is the rune of the open bracket for opening and matching\n// close brackets, after normalization). The embedding levels are optional, but\n// may be supplied to encode embedding levels of styled text.\n//\n// TODO: return an error.\nfunc newParagraph(types []Class, pairTypes []bracketType, pairValues []rune, levels level) *paragraph {\n\tvalidateTypes(types)\n\tvalidatePbTypes(pairTypes)\n\tvalidatePbValues(pairValues, pairTypes)\n\tvalidateParagraphEmbeddingLevel(levels)\n\n\tp := &paragraph{\n\t\tinitialTypes:   append([]Class(nil), types...),\n\t\tembeddingLevel: levels,\n\n\t\tpairTypes:  pairTypes,\n\t\tpairValues: pairValues,\n\n\t\tresultTypes: append([]Class(nil), types...),\n\t}\n\tp.run()\n\treturn p\n}\n\nfunc (p *paragraph) Len() int { return len(p.initialTypes) }\n\n// The algorithm. Does not include line-based processing (Rules L1, L2).\n// These are applied later in the line-based phase of the algorithm.\nfunc (p *paragraph) run() {\n\tp.determineMatchingIsolates()\n\n\t// 1) determining the paragraph level\n\t// Rule P1 is the requirement for entering this algorithm.\n\t// Rules P2, P3.\n\t// If no externally supplied paragraph embedding level, use default.\n\tif p.embeddingLevel == implicitLevel {\n\t\tp.embeddingLevel = p.determineParagraphEmbeddingLevel(0, p.Len())\n\t}\n\n\t// Initialize result levels to paragraph embedding level.\n\tp.resultLevels = make([]level, p.Len())\n\tsetLevels(p.resultLevels, p.embeddingLevel)\n\n\t// 2) Explicit levels and directions\n\t// Rules X1-X8.\n\tp.determineExplicitEmbeddingLevels()\n\n\t// Rule X9.\n\t// We do not remove the embeddings, the overrides, the PDFs, and the BNs\n\t// from the string explicitly. But they are not copied into isolating run\n\t// sequences when they are created, so they are removed for all\n\t// practical purposes.\n\n\t// Rule X10.\n\t// Run remainder of algorithm one isolating run sequence at a time\n\tfor _, seq := range p.determineIsolatingRunSequences() {\n\t\t// 3) resolving weak types\n\t\t// Rules W1-W7.\n\t\tseq.resolveWeakTypes()\n\n\t\t// 4a) resolving paired brackets\n\t\t// Rule N0\n\t\tresolvePairedBrackets(seq)\n\n\t\t// 4b) resolving neutral types\n\t\t// Rules N1-N3.\n\t\tseq.resolveNeutralTypes()\n\n\t\t// 5) resolving implicit embedding levels\n\t\t// Rules I1, I2.\n\t\tseq.resolveImplicitLevels()\n\n\t\t// Apply the computed levels and types\n\t\tseq.applyLevelsAndTypes()\n\t}\n\n\t// Assign appropriate levels to 'hide' LREs, RLEs, LROs, RLOs, PDFs, and\n\t// BNs. This is for convenience, so the resulting level array will have\n\t// a value for every character.\n\tp.assignLevelsToCharactersRemovedByX9()\n}\n\n// determineMatchingIsolates determines the matching PDI for each isolate\n// initiator and vice versa.\n//\n// Definition BD9.\n//\n// At the end of this function:\n//\n//  - The member variable matchingPDI is set to point to the index of the\n//    matching PDI character for each isolate initiator character. If there is\n//    no matching PDI, it is set to the length of the input text. For other\n//    characters, it is set to -1.\n//  - The member variable matchingIsolateInitiator is set to point to the\n//    index of the matching isolate initiator character for each PDI character.\n//    If there is no matching isolate initiator, or the character is not a PDI,\n//    it is set to -1.\nfunc (p *paragraph) determineMatchingIsolates() {\n\tp.matchingPDI = make([]int, p.Len())\n\tp.matchingIsolateInitiator = make([]int, p.Len())\n\n\tfor i := range p.matchingIsolateInitiator {\n\t\tp.matchingIsolateInitiator[i] = -1\n\t}\n\n\tfor i := range p.matchingPDI {\n\t\tp.matchingPDI[i] = -1\n\n\t\tif t := p.resultTypes[i]; t.in(LRI, RLI, FSI) {\n\t\t\tdepthCounter := 1\n\t\t\tfor j := i + 1; j < p.Len(); j++ {\n\t\t\t\tif u := p.resultTypes[j]; u.in(LRI, RLI, FSI) {\n\t\t\t\t\tdepthCounter++\n\t\t\t\t} else if u == PDI {\n\t\t\t\t\tif depthCounter--; depthCounter == 0 {\n\t\t\t\t\t\tp.matchingPDI[i] = j\n\t\t\t\t\t\tp.matchingIsolateInitiator[j] = i\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif p.matchingPDI[i] == -1 {\n\t\t\t\tp.matchingPDI[i] = p.Len()\n\t\t\t}\n\t\t}\n\t}\n}\n\n// determineParagraphEmbeddingLevel reports the resolved paragraph direction of\n// the substring limited by the given range [start, end).\n//\n// Determines the paragraph level based on rules P2, P3. This is also used\n// in rule X5c to find if an FSI should resolve to LRI or RLI.\nfunc (p *paragraph) determineParagraphEmbeddingLevel(start, end int) level {\n\tvar strongType Class = unknownClass\n\n\t// Rule P2.\n\tfor i := start; i < end; i++ {\n\t\tif t := p.resultTypes[i]; t.in(L, AL, R) {\n\t\t\tstrongType = t\n\t\t\tbreak\n\t\t} else if t.in(FSI, LRI, RLI) {\n\t\t\ti = p.matchingPDI[i] // skip over to the matching PDI\n\t\t\tif i > end {\n\t\t\t\tlog.Panic(\"assert (i <= end)\")\n\t\t\t}\n\t\t}\n\t}\n\t// Rule P3.\n\tswitch strongType {\n\tcase unknownClass: // none found\n\t\t// default embedding level when no strong types found is 0.\n\t\treturn 0\n\tcase L:\n\t\treturn 0\n\tdefault: // AL, R\n\t\treturn 1\n\t}\n}\n\nconst maxDepth = 125\n\n// This stack will store the embedding levels and override and isolated\n// statuses\ntype directionalStatusStack struct {\n\tstackCounter        int\n\tembeddingLevelStack [maxDepth + 1]level\n\toverrideStatusStack [maxDepth + 1]Class\n\tisolateStatusStack  [maxDepth + 1]bool\n}\n\nfunc (s *directionalStatusStack) empty()     { s.stackCounter = 0 }\nfunc (s *directionalStatusStack) pop()       { s.stackCounter-- }\nfunc (s *directionalStatusStack) depth() int { return s.stackCounter }\n\nfunc (s *directionalStatusStack) push(level level, overrideStatus Class, isolateStatus bool) {\n\ts.embeddingLevelStack[s.stackCounter] = level\n\ts.overrideStatusStack[s.stackCounter] = overrideStatus\n\ts.isolateStatusStack[s.stackCounter] = isolateStatus\n\ts.stackCounter++\n}\n\nfunc (s *directionalStatusStack) lastEmbeddingLevel() level {\n\treturn s.embeddingLevelStack[s.stackCounter-1]\n}\n\nfunc (s *directionalStatusStack) lastDirectionalOverrideStatus() Class {\n\treturn s.overrideStatusStack[s.stackCounter-1]\n}\n\nfunc (s *directionalStatusStack) lastDirectionalIsolateStatus() bool {\n\treturn s.isolateStatusStack[s.stackCounter-1]\n}\n\n// Determine explicit levels using rules X1 - X8\nfunc (p *paragraph) determineExplicitEmbeddingLevels() {\n\tvar stack directionalStatusStack\n\tvar overflowIsolateCount, overflowEmbeddingCount, validIsolateCount int\n\n\t// Rule X1.\n\tstack.push(p.embeddingLevel, ON, false)\n\n\tfor i, t := range p.resultTypes {\n\t\t// Rules X2, X3, X4, X5, X5a, X5b, X5c\n\t\tswitch t {\n\t\tcase RLE, LRE, RLO, LRO, RLI, LRI, FSI:\n\t\t\tisIsolate := t.in(RLI, LRI, FSI)\n\t\t\tisRTL := t.in(RLE, RLO, RLI)\n\n\t\t\t// override if this is an FSI that resolves to RLI\n\t\t\tif t == FSI {\n\t\t\t\tisRTL = (p.determineParagraphEmbeddingLevel(i+1, p.matchingPDI[i]) == 1)\n\t\t\t}\n\t\t\tif isIsolate {\n\t\t\t\tp.resultLevels[i] = stack.lastEmbeddingLevel()\n\t\t\t\tif stack.lastDirectionalOverrideStatus() != ON {\n\t\t\t\t\tp.resultTypes[i] = stack.lastDirectionalOverrideStatus()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar newLevel level\n\t\t\tif isRTL {\n\t\t\t\t// least greater odd\n\t\t\t\tnewLevel = (stack.lastEmbeddingLevel() + 1) | 1\n\t\t\t} else {\n\t\t\t\t// least greater even\n\t\t\t\tnewLevel = (stack.lastEmbeddingLevel() + 2) &^ 1\n\t\t\t}\n\n\t\t\tif newLevel <= maxDepth && overflowIsolateCount == 0 && overflowEmbeddingCount == 0 {\n\t\t\t\tif isIsolate {\n\t\t\t\t\tvalidIsolateCount++\n\t\t\t\t}\n\t\t\t\t// Push new embedding level, override status, and isolated\n\t\t\t\t// status.\n\t\t\t\t// No check for valid stack counter, since the level check\n\t\t\t\t// suffices.\n\t\t\t\tswitch t {\n\t\t\t\tcase LRO:\n\t\t\t\t\tstack.push(newLevel, L, isIsolate)\n\t\t\t\tcase RLO:\n\t\t\t\t\tstack.push(newLevel, R, isIsolate)\n\t\t\t\tdefault:\n\t\t\t\t\tstack.push(newLevel, ON, isIsolate)\n\t\t\t\t}\n\t\t\t\t// Not really part of the spec\n\t\t\t\tif !isIsolate {\n\t\t\t\t\tp.resultLevels[i] = newLevel\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// This is an invalid explicit formatting character,\n\t\t\t\t// so apply the \"Otherwise\" part of rules X2-X5b.\n\t\t\t\tif isIsolate {\n\t\t\t\t\toverflowIsolateCount++\n\t\t\t\t} else { // !isIsolate\n\t\t\t\t\tif overflowIsolateCount == 0 {\n\t\t\t\t\t\toverflowEmbeddingCount++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Rule X6a\n\t\tcase PDI:\n\t\t\tif overflowIsolateCount > 0 {\n\t\t\t\toverflowIsolateCount--\n\t\t\t} else if validIsolateCount == 0 {\n\t\t\t\t// do nothing\n\t\t\t} else {\n\t\t\t\toverflowEmbeddingCount = 0\n\t\t\t\tfor !stack.lastDirectionalIsolateStatus() {\n\t\t\t\t\tstack.pop()\n\t\t\t\t}\n\t\t\t\tstack.pop()\n\t\t\t\tvalidIsolateCount--\n\t\t\t}\n\t\t\tp.resultLevels[i] = stack.lastEmbeddingLevel()\n\n\t\t// Rule X7\n\t\tcase PDF:\n\t\t\t// Not really part of the spec\n\t\t\tp.resultLevels[i] = stack.lastEmbeddingLevel()\n\n\t\t\tif overflowIsolateCount > 0 {\n\t\t\t\t// do nothing\n\t\t\t} else if overflowEmbeddingCount > 0 {\n\t\t\t\toverflowEmbeddingCount--\n\t\t\t} else if !stack.lastDirectionalIsolateStatus() && stack.depth() >= 2 {\n\t\t\t\tstack.pop()\n\t\t\t}\n\n\t\tcase B: // paragraph separator.\n\t\t\t// Rule X8.\n\n\t\t\t// These values are reset for clarity, in this implementation B\n\t\t\t// can only occur as the last code in the array.\n\t\t\tstack.empty()\n\t\t\toverflowIsolateCount = 0\n\t\t\toverflowEmbeddingCount = 0\n\t\t\tvalidIsolateCount = 0\n\t\t\tp.resultLevels[i] = p.embeddingLevel\n\n\t\tdefault:\n\t\t\tp.resultLevels[i] = stack.lastEmbeddingLevel()\n\t\t\tif stack.lastDirectionalOverrideStatus() != ON {\n\t\t\t\tp.resultTypes[i] = stack.lastDirectionalOverrideStatus()\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype isolatingRunSequence struct {\n\tp *paragraph\n\n\tindexes []int // indexes to the original string\n\n\ttypes          []Class // type of each character using the index\n\tresolvedLevels []level // resolved levels after application of rules\n\tlevel          level\n\tsos, eos       Class\n}\n\nfunc (i *isolatingRunSequence) Len() int { return len(i.indexes) }\n\nfunc maxLevel(a, b level) level {\n\tif a > b {\n\t\treturn a\n\t}\n\treturn b\n}\n\n// Rule X10, second bullet: Determine the start-of-sequence (sos) and end-of-sequence (eos) types,\n// \t\t\t either L or R, for each isolating run sequence.\nfunc (p *paragraph) isolatingRunSequence(indexes []int) *isolatingRunSequence {\n\tlength := len(indexes)\n\ttypes := make([]Class, length)\n\tfor i, x := range indexes {\n\t\ttypes[i] = p.resultTypes[x]\n\t}\n\n\t// assign level, sos and eos\n\tprevChar := indexes[0] - 1\n\tfor prevChar >= 0 && isRemovedByX9(p.initialTypes[prevChar]) {\n\t\tprevChar--\n\t}\n\tprevLevel := p.embeddingLevel\n\tif prevChar >= 0 {\n\t\tprevLevel = p.resultLevels[prevChar]\n\t}\n\n\tvar succLevel level\n\tlastType := types[length-1]\n\tif lastType.in(LRI, RLI, FSI) {\n\t\tsuccLevel = p.embeddingLevel\n\t} else {\n\t\t// the first character after the end of run sequence\n\t\tlimit := indexes[length-1] + 1\n\t\tfor ; limit < p.Len() && isRemovedByX9(p.initialTypes[limit]); limit++ {\n\n\t\t}\n\t\tsuccLevel = p.embeddingLevel\n\t\tif limit < p.Len() {\n\t\t\tsuccLevel = p.resultLevels[limit]\n\t\t}\n\t}\n\tlevel := p.resultLevels[indexes[0]]\n\treturn &isolatingRunSequence{\n\t\tp:       p,\n\t\tindexes: indexes,\n\t\ttypes:   types,\n\t\tlevel:   level,\n\t\tsos:     typeForLevel(maxLevel(prevLevel, level)),\n\t\teos:     typeForLevel(maxLevel(succLevel, level)),\n\t}\n}\n\n// Resolving weak types Rules W1-W7.\n//\n// Note that some weak types (EN, AN) remain after this processing is\n// complete.\nfunc (s *isolatingRunSequence) resolveWeakTypes() {\n\n\t// on entry, only these types remain\n\ts.assertOnly(L, R, AL, EN, ES, ET, AN, CS, B, S, WS, ON, NSM, LRI, RLI, FSI, PDI)\n\n\t// Rule W1.\n\t// Changes all NSMs.\n\tpreceedingCharacterType := s.sos\n\tfor i, t := range s.types {\n\t\tif t == NSM {\n\t\t\ts.types[i] = preceedingCharacterType\n\t\t} else {\n\t\t\tif t.in(LRI, RLI, FSI, PDI) {\n\t\t\t\tpreceedingCharacterType = ON\n\t\t\t}\n\t\t\tpreceedingCharacterType = t\n\t\t}\n\t}\n\n\t// Rule W2.\n\t// EN does not change at the start of the run, because sos != AL.\n\tfor i, t := range s.types {\n\t\tif t == EN {\n\t\t\tfor j := i - 1; j >= 0; j-- {\n\t\t\t\tif t := s.types[j]; t.in(L, R, AL) {\n\t\t\t\t\tif t == AL {\n\t\t\t\t\t\ts.types[i] = AN\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Rule W3.\n\tfor i, t := range s.types {\n\t\tif t == AL {\n\t\t\ts.types[i] = R\n\t\t}\n\t}\n\n\t// Rule W4.\n\t// Since there must be values on both sides for this rule to have an\n\t// effect, the scan skips the first and last value.\n\t//\n\t// Although the scan proceeds left to right, and changes the type\n\t// values in a way that would appear to affect the computations\n\t// later in the scan, there is actually no problem. A change in the\n\t// current value can only affect the value to its immediate right,\n\t// and only affect it if it is ES or CS. But the current value can\n\t// only change if the value to its right is not ES or CS. Thus\n\t// either the current value will not change, or its change will have\n\t// no effect on the remainder of the analysis.\n\n\tfor i := 1; i < s.Len()-1; i++ {\n\t\tt := s.types[i]\n\t\tif t == ES || t == CS {\n\t\t\tprevSepType := s.types[i-1]\n\t\t\tsuccSepType := s.types[i+1]\n\t\t\tif prevSepType == EN && succSepType == EN {\n\t\t\t\ts.types[i] = EN\n\t\t\t} else if s.types[i] == CS && prevSepType == AN && succSepType == AN {\n\t\t\t\ts.types[i] = AN\n\t\t\t}\n\t\t}\n\t}\n\n\t// Rule W5.\n\tfor i, t := range s.types {\n\t\tif t == ET {\n\t\t\t// locate end of sequence\n\t\t\trunStart := i\n\t\t\trunEnd := s.findRunLimit(runStart, ET)\n\n\t\t\t// check values at ends of sequence\n\t\t\tt := s.sos\n\t\t\tif runStart > 0 {\n\t\t\t\tt = s.types[runStart-1]\n\t\t\t}\n\t\t\tif t != EN {\n\t\t\t\tt = s.eos\n\t\t\t\tif runEnd < len(s.types) {\n\t\t\t\t\tt = s.types[runEnd]\n\t\t\t\t}\n\t\t\t}\n\t\t\tif t == EN {\n\t\t\t\tsetTypes(s.types[runStart:runEnd], EN)\n\t\t\t}\n\t\t\t// continue at end of sequence\n\t\t\ti = runEnd\n\t\t}\n\t}\n\n\t// Rule W6.\n\tfor i, t := range s.types {\n\t\tif t.in(ES, ET, CS) {\n\t\t\ts.types[i] = ON\n\t\t}\n\t}\n\n\t// Rule W7.\n\tfor i, t := range s.types {\n\t\tif t == EN {\n\t\t\t// set default if we reach start of run\n\t\t\tprevStrongType := s.sos\n\t\t\tfor j := i - 1; j >= 0; j-- {\n\t\t\t\tt = s.types[j]\n\t\t\t\tif t == L || t == R { // AL's have been changed to R\n\t\t\t\t\tprevStrongType = t\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif prevStrongType == L {\n\t\t\t\ts.types[i] = L\n\t\t\t}\n\t\t}\n\t}\n}\n\n// 6) resolving neutral types Rules N1-N2.\nfunc (s *isolatingRunSequence) resolveNeutralTypes() {\n\n\t// on entry, only these types can be in resultTypes\n\ts.assertOnly(L, R, EN, AN, B, S, WS, ON, RLI, LRI, FSI, PDI)\n\n\tfor i, t := range s.types {\n\t\tswitch t {\n\t\tcase WS, ON, B, S, RLI, LRI, FSI, PDI:\n\t\t\t// find bounds of run of neutrals\n\t\t\trunStart := i\n\t\t\trunEnd := s.findRunLimit(runStart, B, S, WS, ON, RLI, LRI, FSI, PDI)\n\n\t\t\t// determine effective types at ends of run\n\t\t\tvar leadType, trailType Class\n\n\t\t\t// Note that the character found can only be L, R, AN, or\n\t\t\t// EN.\n\t\t\tif runStart == 0 {\n\t\t\t\tleadType = s.sos\n\t\t\t} else {\n\t\t\t\tleadType = s.types[runStart-1]\n\t\t\t\tif leadType.in(AN, EN) {\n\t\t\t\t\tleadType = R\n\t\t\t\t}\n\t\t\t}\n\t\t\tif runEnd == len(s.types) {\n\t\t\t\ttrailType = s.eos\n\t\t\t} else {\n\t\t\t\ttrailType = s.types[runEnd]\n\t\t\t\tif trailType.in(AN, EN) {\n\t\t\t\t\ttrailType = R\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar resolvedType Class\n\t\t\tif leadType == trailType {\n\t\t\t\t// Rule N1.\n\t\t\t\tresolvedType = leadType\n\t\t\t} else {\n\t\t\t\t// Rule N2.\n\t\t\t\t// Notice the embedding level of the run is used, not\n\t\t\t\t// the paragraph embedding level.\n\t\t\t\tresolvedType = typeForLevel(s.level)\n\t\t\t}\n\n\t\t\tsetTypes(s.types[runStart:runEnd], resolvedType)\n\n\t\t\t// skip over run of (former) neutrals\n\t\t\ti = runEnd\n\t\t}\n\t}\n}\n\nfunc setLevels(levels []level, newLevel level) {\n\tfor i := range levels {\n\t\tlevels[i] = newLevel\n\t}\n}\n\nfunc setTypes(types []Class, newType Class) {\n\tfor i := range types {\n\t\ttypes[i] = newType\n\t}\n}\n\n// 7) resolving implicit embedding levels Rules I1, I2.\nfunc (s *isolatingRunSequence) resolveImplicitLevels() {\n\n\t// on entry, only these types can be in resultTypes\n\ts.assertOnly(L, R, EN, AN)\n\n\ts.resolvedLevels = make([]level, len(s.types))\n\tsetLevels(s.resolvedLevels, s.level)\n\n\tif (s.level & 1) == 0 { // even level\n\t\tfor i, t := range s.types {\n\t\t\t// Rule I1.\n\t\t\tif t == L {\n\t\t\t\t// no change\n\t\t\t} else if t == R {\n\t\t\t\ts.resolvedLevels[i] += 1\n\t\t\t} else { // t == AN || t == EN\n\t\t\t\ts.resolvedLevels[i] += 2\n\t\t\t}\n\t\t}\n\t} else { // odd level\n\t\tfor i, t := range s.types {\n\t\t\t// Rule I2.\n\t\t\tif t == R {\n\t\t\t\t// no change\n\t\t\t} else { // t == L || t == AN || t == EN\n\t\t\t\ts.resolvedLevels[i] += 1\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Applies the levels and types resolved in rules W1-I2 to the\n// resultLevels array.\nfunc (s *isolatingRunSequence) applyLevelsAndTypes() {\n\tfor i, x := range s.indexes {\n\t\ts.p.resultTypes[x] = s.types[i]\n\t\ts.p.resultLevels[x] = s.resolvedLevels[i]\n\t}\n}\n\n// Return the limit of the run consisting only of the types in validSet\n// starting at index. This checks the value at index, and will return\n// index if that value is not in validSet.\nfunc (s *isolatingRunSequence) findRunLimit(index int, validSet ...Class) int {\nloop:\n\tfor ; index < len(s.types); index++ {\n\t\tt := s.types[index]\n\t\tfor _, valid := range validSet {\n\t\t\tif t == valid {\n\t\t\t\tcontinue loop\n\t\t\t}\n\t\t}\n\t\treturn index // didn't find a match in validSet\n\t}\n\treturn len(s.types)\n}\n\n// Algorithm validation. Assert that all values in types are in the\n// provided set.\nfunc (s *isolatingRunSequence) assertOnly(codes ...Class) {\nloop:\n\tfor i, t := range s.types {\n\t\tfor _, c := range codes {\n\t\t\tif t == c {\n\t\t\t\tcontinue loop\n\t\t\t}\n\t\t}\n\t\tlog.Panicf(\"invalid bidi code %v present in assertOnly at position %d\", t, s.indexes[i])\n\t}\n}\n\n// determineLevelRuns returns an array of level runs. Each level run is\n// described as an array of indexes into the input string.\n//\n// Determines the level runs. Rule X9 will be applied in determining the\n// runs, in the way that makes sure the characters that are supposed to be\n// removed are not included in the runs.\nfunc (p *paragraph) determineLevelRuns() [][]int {\n\trun := []int{}\n\tallRuns := [][]int{}\n\tcurrentLevel := implicitLevel\n\n\tfor i := range p.initialTypes {\n\t\tif !isRemovedByX9(p.initialTypes[i]) {\n\t\t\tif p.resultLevels[i] != currentLevel {\n\t\t\t\t// we just encountered a new run; wrap up last run\n\t\t\t\tif currentLevel >= 0 { // only wrap it up if there was a run\n\t\t\t\t\tallRuns = append(allRuns, run)\n\t\t\t\t\trun = nil\n\t\t\t\t}\n\t\t\t\t// Start new run\n\t\t\t\tcurrentLevel = p.resultLevels[i]\n\t\t\t}\n\t\t\trun = append(run, i)\n\t\t}\n\t}\n\t// Wrap up the final run, if any\n\tif len(run) > 0 {\n\t\tallRuns = append(allRuns, run)\n\t}\n\treturn allRuns\n}\n\n// Definition BD13. Determine isolating run sequences.\nfunc (p *paragraph) determineIsolatingRunSequences() []*isolatingRunSequence {\n\tlevelRuns := p.determineLevelRuns()\n\n\t// Compute the run that each character belongs to\n\trunForCharacter := make([]int, p.Len())\n\tfor i, run := range levelRuns {\n\t\tfor _, index := range run {\n\t\t\trunForCharacter[index] = i\n\t\t}\n\t}\n\n\tsequences := []*isolatingRunSequence{}\n\n\tvar currentRunSequence []int\n\n\tfor _, run := range levelRuns {\n\t\tfirst := run[0]\n\t\tif p.initialTypes[first] != PDI || p.matchingIsolateInitiator[first] == -1 {\n\t\t\tcurrentRunSequence = nil\n\t\t\t// int run = i;\n\t\t\tfor {\n\t\t\t\t// Copy this level run into currentRunSequence\n\t\t\t\tcurrentRunSequence = append(currentRunSequence, run...)\n\n\t\t\t\tlast := currentRunSequence[len(currentRunSequence)-1]\n\t\t\t\tlastT := p.initialTypes[last]\n\t\t\t\tif lastT.in(LRI, RLI, FSI) && p.matchingPDI[last] != p.Len() {\n\t\t\t\t\trun = levelRuns[runForCharacter[p.matchingPDI[last]]]\n\t\t\t\t} else {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tsequences = append(sequences, p.isolatingRunSequence(currentRunSequence))\n\t\t}\n\t}\n\treturn sequences\n}\n\n// Assign level information to characters removed by rule X9. This is for\n// ease of relating the level information to the original input data. Note\n// that the levels assigned to these codes are arbitrary, they're chosen so\n// as to avoid breaking level runs.\nfunc (p *paragraph) assignLevelsToCharactersRemovedByX9() {\n\tfor i, t := range p.initialTypes {\n\t\tif t.in(LRE, RLE, LRO, RLO, PDF, BN) {\n\t\t\tp.resultTypes[i] = t\n\t\t\tp.resultLevels[i] = -1\n\t\t}\n\t}\n\t// now propagate forward the levels information (could have\n\t// propagated backward, the main thing is not to introduce a level\n\t// break where one doesn't already exist).\n\n\tif p.resultLevels[0] == -1 {\n\t\tp.resultLevels[0] = p.embeddingLevel\n\t}\n\tfor i := 1; i < len(p.initialTypes); i++ {\n\t\tif p.resultLevels[i] == -1 {\n\t\t\tp.resultLevels[i] = p.resultLevels[i-1]\n\t\t}\n\t}\n\t// Embedding information is for informational purposes only so need not be\n\t// adjusted.\n}\n\n//\n// Output\n//\n\n// getLevels computes levels array breaking lines at offsets in linebreaks.\n// Rule L1.\n//\n// The linebreaks array must include at least one value. The values must be\n// in strictly increasing order (no duplicates) between 1 and the length of\n// the text, inclusive. The last value must be the length of the text.\nfunc (p *paragraph) getLevels(linebreaks []int) []level {\n\t// Note that since the previous processing has removed all\n\t// P, S, and WS values from resultTypes, the values referred to\n\t// in these rules are the initial types, before any processing\n\t// has been applied (including processing of overrides).\n\t//\n\t// This example implementation has reinserted explicit format codes\n\t// and BN, in order that the levels array correspond to the\n\t// initial text. Their final placement is not normative.\n\t// These codes are treated like WS in this implementation,\n\t// so they don't interrupt sequences of WS.\n\n\tvalidateLineBreaks(linebreaks, p.Len())\n\n\tresult := append([]level(nil), p.resultLevels...)\n\n\t// don't worry about linebreaks since if there is a break within\n\t// a series of WS values preceding S, the linebreak itself\n\t// causes the reset.\n\tfor i, t := range p.initialTypes {\n\t\tif t.in(B, S) {\n\t\t\t// Rule L1, clauses one and two.\n\t\t\tresult[i] = p.embeddingLevel\n\n\t\t\t// Rule L1, clause three.\n\t\t\tfor j := i - 1; j >= 0; j-- {\n\t\t\t\tif isWhitespace(p.initialTypes[j]) { // including format codes\n\t\t\t\t\tresult[j] = p.embeddingLevel\n\t\t\t\t} else {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Rule L1, clause four.\n\tstart := 0\n\tfor _, limit := range linebreaks {\n\t\tfor j := limit - 1; j >= start; j-- {\n\t\t\tif isWhitespace(p.initialTypes[j]) { // including format codes\n\t\t\t\tresult[j] = p.embeddingLevel\n\t\t\t} else {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tstart = limit\n\t}\n\n\treturn result\n}\n\n// getReordering returns the reordering of lines from a visual index to a\n// logical index for line breaks at the given offsets.\n//\n// Lines are concatenated from left to right. So for example, the fifth\n// character from the left on the third line is\n//\n// \t\tgetReordering(linebreaks)[linebreaks[1] + 4]\n//\n// (linebreaks[1] is the position after the last character of the second\n// line, which is also the index of the first character on the third line,\n// and adding four gets the fifth character from the left).\n//\n// The linebreaks array must include at least one value. The values must be\n// in strictly increasing order (no duplicates) between 1 and the length of\n// the text, inclusive. The last value must be the length of the text.\nfunc (p *paragraph) getReordering(linebreaks []int) []int {\n\tvalidateLineBreaks(linebreaks, p.Len())\n\n\treturn computeMultilineReordering(p.getLevels(linebreaks), linebreaks)\n}\n\n// Return multiline reordering array for a given level array. Reordering\n// does not occur across a line break.\nfunc computeMultilineReordering(levels []level, linebreaks []int) []int {\n\tresult := make([]int, len(levels))\n\n\tstart := 0\n\tfor _, limit := range linebreaks {\n\t\ttempLevels := make([]level, limit-start)\n\t\tcopy(tempLevels, levels[start:])\n\n\t\tfor j, order := range computeReordering(tempLevels) {\n\t\t\tresult[start+j] = order + start\n\t\t}\n\t\tstart = limit\n\t}\n\treturn result\n}\n\n// Return reordering array for a given level array. This reorders a single\n// line. The reordering is a visual to logical map. For example, the\n// leftmost char is string.charAt(order[0]). Rule L2.\nfunc computeReordering(levels []level) []int {\n\tresult := make([]int, len(levels))\n\t// initialize order\n\tfor i := range result {\n\t\tresult[i] = i\n\t}\n\n\t// locate highest level found on line.\n\t// Note the rules say text, but no reordering across line bounds is\n\t// performed, so this is sufficient.\n\thighestLevel := level(0)\n\tlowestOddLevel := level(maxDepth + 2)\n\tfor _, level := range levels {\n\t\tif level > highestLevel {\n\t\t\thighestLevel = level\n\t\t}\n\t\tif level&1 != 0 && level < lowestOddLevel {\n\t\t\tlowestOddLevel = level\n\t\t}\n\t}\n\n\tfor level := highestLevel; level >= lowestOddLevel; level-- {\n\t\tfor i := 0; i < len(levels); i++ {\n\t\t\tif levels[i] >= level {\n\t\t\t\t// find range of text at or above this level\n\t\t\t\tstart := i\n\t\t\t\tlimit := i + 1\n\t\t\t\tfor limit < len(levels) && levels[limit] >= level {\n\t\t\t\t\tlimit++\n\t\t\t\t}\n\n\t\t\t\tfor j, k := start, limit-1; j < k; j, k = j+1, k-1 {\n\t\t\t\t\tresult[j], result[k] = result[k], result[j]\n\t\t\t\t}\n\t\t\t\t// skip to end of level run\n\t\t\t\ti = limit\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result\n}\n\n// isWhitespace reports whether the type is considered a whitespace type for the\n// line break rules.\nfunc isWhitespace(c Class) bool {\n\tswitch c {\n\tcase LRE, RLE, LRO, RLO, PDF, LRI, RLI, FSI, PDI, BN, WS:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// isRemovedByX9 reports whether the type is one of the types removed in X9.\nfunc isRemovedByX9(c Class) bool {\n\tswitch c {\n\tcase LRE, RLE, LRO, RLO, PDF, BN:\n\t\treturn true\n\t}\n\treturn false\n}\n\n// typeForLevel reports the strong type (L or R) corresponding to the level.\nfunc typeForLevel(level level) Class {\n\tif (level & 0x1) == 0 {\n\t\treturn L\n\t}\n\treturn R\n}\n\n// TODO: change validation to not panic\n\nfunc validateTypes(types []Class) {\n\tif len(types) == 0 {\n\t\tlog.Panic(\"types is null\")\n\t}\n\tfor i, t := range types[:len(types)-1] {\n\t\tif t == B {\n\t\t\tlog.Panicf(\"B type before end of paragraph at index: %d\", i)\n\t\t}\n\t}\n}\n\nfunc validateParagraphEmbeddingLevel(embeddingLevel level) {\n\tif embeddingLevel != implicitLevel &&\n\t\tembeddingLevel != 0 &&\n\t\tembeddingLevel != 1 {\n\t\tlog.Panicf(\"illegal paragraph embedding level: %d\", embeddingLevel)\n\t}\n}\n\nfunc validateLineBreaks(linebreaks []int, textLength int) {\n\tprev := 0\n\tfor i, next := range linebreaks {\n\t\tif next <= prev {\n\t\t\tlog.Panicf(\"bad linebreak: %d at index: %d\", next, i)\n\t\t}\n\t\tprev = next\n\t}\n\tif prev != textLength {\n\t\tlog.Panicf(\"last linebreak was %d, want %d\", prev, textLength)\n\t}\n}\n\nfunc validatePbTypes(pairTypes []bracketType) {\n\tif len(pairTypes) == 0 {\n\t\tlog.Panic(\"pairTypes is null\")\n\t}\n\tfor i, pt := range pairTypes {\n\t\tswitch pt {\n\t\tcase bpNone, bpOpen, bpClose:\n\t\tdefault:\n\t\t\tlog.Panicf(\"illegal pairType value at %d: %v\", i, pairTypes[i])\n\t\t}\n\t}\n}\n\nfunc validatePbValues(pairValues []rune, pairTypes []bracketType) {\n\tif pairValues == nil {\n\t\tlog.Panic(\"pairValues is null\")\n\t}\n\tif len(pairTypes) != len(pairValues) {\n\t\tlog.Panic(\"pairTypes is different length from pairValues\")\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/bidi/prop.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage bidi\n\nimport \"unicode/utf8\"\n\n// Properties provides access to BiDi properties of runes.\ntype Properties struct {\n\tentry uint8\n\tlast  uint8\n}\n\nvar trie = newBidiTrie(0)\n\n// TODO: using this for bidirule reduces the running time by about 5%. Consider\n// if this is worth exposing or if we can find a way to speed up the Class\n// method.\n//\n// // CompactClass is like Class, but maps all of the BiDi control classes\n// // (LRO, RLO, LRE, RLE, PDF, LRI, RLI, FSI, PDI) to the class Control.\n// func (p Properties) CompactClass() Class {\n// \treturn Class(p.entry & 0x0F)\n// }\n\n// Class returns the Bidi class for p.\nfunc (p Properties) Class() Class {\n\tc := Class(p.entry & 0x0F)\n\tif c == Control {\n\t\tc = controlByteToClass[p.last&0xF]\n\t}\n\treturn c\n}\n\n// IsBracket reports whether the rune is a bracket.\nfunc (p Properties) IsBracket() bool { return p.entry&0xF0 != 0 }\n\n// IsOpeningBracket reports whether the rune is an opening bracket.\n// IsBracket must return true.\nfunc (p Properties) IsOpeningBracket() bool { return p.entry&openMask != 0 }\n\n// TODO: find a better API and expose.\nfunc (p Properties) reverseBracket(r rune) rune {\n\treturn xorMasks[p.entry>>xorMaskShift] ^ r\n}\n\nvar controlByteToClass = [16]Class{\n\t0xD: LRO, // U+202D LeftToRightOverride,\n\t0xE: RLO, // U+202E RightToLeftOverride,\n\t0xA: LRE, // U+202A LeftToRightEmbedding,\n\t0xB: RLE, // U+202B RightToLeftEmbedding,\n\t0xC: PDF, // U+202C PopDirectionalFormat,\n\t0x6: LRI, // U+2066 LeftToRightIsolate,\n\t0x7: RLI, // U+2067 RightToLeftIsolate,\n\t0x8: FSI, // U+2068 FirstStrongIsolate,\n\t0x9: PDI, // U+2069 PopDirectionalIsolate,\n}\n\n// LookupRune returns properties for r.\nfunc LookupRune(r rune) (p Properties, size int) {\n\tvar buf [4]byte\n\tn := utf8.EncodeRune(buf[:], r)\n\treturn Lookup(buf[:n])\n}\n\n// TODO: these lookup methods are based on the generated trie code. The returned\n// sizes have slightly different semantics from the generated code, in that it\n// always returns size==1 for an illegal UTF-8 byte (instead of the length\n// of the maximum invalid subsequence). Most Transformers, like unicode/norm,\n// leave invalid UTF-8 untouched, in which case it has performance benefits to\n// do so (without changing the semantics). Bidi requires the semantics used here\n// for the bidirule implementation to be compatible with the Go semantics.\n//  They ultimately should perhaps be adopted by all trie implementations, for\n// convenience sake.\n// This unrolled code also boosts performance of the secure/bidirule package by\n// about 30%.\n// So, to remove this code:\n//   - add option to trie generator to define return type.\n//   - always return 1 byte size for ill-formed UTF-8 runes.\n\n// Lookup returns properties for the first rune in s and the width in bytes of\n// its encoding. The size will be 0 if s does not hold enough bytes to complete\n// the encoding.\nfunc Lookup(s []byte) (p Properties, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn Properties{entry: bidiValues[c0]}, 1\n\tcase c0 < 0xC2:\n\t\treturn Properties{}, 1\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn Properties{}, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\treturn Properties{entry: trie.lookupValue(uint32(i), c1)}, 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn Properties{}, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\treturn Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn Properties{}, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = bidiIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\treturn Properties{entry: trie.lookupValue(uint32(i), c3)}, 4\n\t}\n\t// Illegal rune\n\treturn Properties{}, 1\n}\n\n// LookupString returns properties for the first rune in s and the width in\n// bytes of its encoding. The size will be 0 if s does not hold enough bytes to\n// complete the encoding.\nfunc LookupString(s string) (p Properties, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn Properties{entry: bidiValues[c0]}, 1\n\tcase c0 < 0xC2:\n\t\treturn Properties{}, 1\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn Properties{}, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\treturn Properties{entry: trie.lookupValue(uint32(i), c1)}, 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn Properties{}, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\treturn Properties{entry: trie.lookupValue(uint32(i), c2), last: c2}, 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn Properties{}, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = bidiIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn Properties{}, 1\n\t\t}\n\t\treturn Properties{entry: trie.lookupValue(uint32(i), c3)}, 4\n\t}\n\t// Illegal rune\n\treturn Properties{}, 1\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n// +build go1.10\n\npackage bidi\n\n// UnicodeVersion is the Unicode version from which the tables in this package are derived.\nconst UnicodeVersion = \"10.0.0\"\n\n// xorMasks contains masks to be xor-ed with brackets to get the reverse\n// version.\nvar xorMasks = []int32{ // 8 elements\n\t0, 1, 6, 7, 3, 15, 29, 63,\n} // Size: 56 bytes\n\n// lookup returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn bidiValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = bidiIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *bidiTrie) lookupUnsafe(s []byte) uint8 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn bidiValues[c0]\n\t}\n\ti := bidiIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// lookupString returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *bidiTrie) lookupString(s string) (v uint8, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn bidiValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = bidiIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *bidiTrie) lookupStringUnsafe(s string) uint8 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn bidiValues[c0]\n\t}\n\ti := bidiIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// bidiTrie. Total size: 16128 bytes (15.75 KiB). Checksum: 8122d83e461996f.\ntype bidiTrie struct{}\n\nfunc newBidiTrie(i int) *bidiTrie {\n\treturn &bidiTrie{}\n}\n\n// lookupValue determines the type of block n and looks up the value for b.\nfunc (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {\n\tswitch {\n\tdefault:\n\t\treturn uint8(bidiValues[n<<6+uint32(b)])\n\t}\n}\n\n// bidiValues: 228 blocks, 14592 entries, 14592 bytes\n// The third block is the zero block.\nvar bidiValues = [14592]uint8{\n\t// Block 0x0, offset 0x0\n\t0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,\n\t0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,\n\t0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,\n\t0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,\n\t0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,\n\t0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,\n\t0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,\n\t0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,\n\t0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,\n\t0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,\n\t0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,\n\t// Block 0x1, offset 0x40\n\t0x40: 0x000a,\n\t0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,\n\t0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,\n\t0x7b: 0x005a,\n\t0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,\n\t0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,\n\t0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,\n\t0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,\n\t0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,\n\t0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,\n\t0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,\n\t0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,\n\t0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,\n\t0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,\n\t0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,\n\t// Block 0x4, offset 0x100\n\t0x117: 0x000a,\n\t0x137: 0x000a,\n\t// Block 0x5, offset 0x140\n\t0x179: 0x000a, 0x17a: 0x000a,\n\t// Block 0x6, offset 0x180\n\t0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,\n\t0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,\n\t0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,\n\t0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,\n\t0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,\n\t0x19e: 0x000a, 0x19f: 0x000a,\n\t0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,\n\t0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,\n\t0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,\n\t0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,\n\t0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,\n\t0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,\n\t0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,\n\t0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,\n\t0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,\n\t0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,\n\t0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,\n\t0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,\n\t0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,\n\t0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,\n\t0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,\n\t// Block 0x8, offset 0x200\n\t0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,\n\t0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,\n\t0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,\n\t0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,\n\t0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,\n\t0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,\n\t0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,\n\t0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,\n\t0x234: 0x000a, 0x235: 0x000a,\n\t0x23e: 0x000a,\n\t// Block 0x9, offset 0x240\n\t0x244: 0x000a, 0x245: 0x000a,\n\t0x247: 0x000a,\n\t// Block 0xa, offset 0x280\n\t0x2b6: 0x000a,\n\t// Block 0xb, offset 0x2c0\n\t0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,\n\t0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,\n\t// Block 0xc, offset 0x300\n\t0x30a: 0x000a,\n\t0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,\n\t0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,\n\t0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,\n\t0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,\n\t0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,\n\t0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,\n\t0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,\n\t0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,\n\t0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,\n\t// Block 0xd, offset 0x340\n\t0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,\n\t0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,\n\t0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,\n\t0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,\n\t0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,\n\t0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,\n\t0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,\n\t0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,\n\t0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,\n\t0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,\n\t0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,\n\t// Block 0xe, offset 0x380\n\t0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,\n\t0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,\n\t0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,\n\t0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,\n\t0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,\n\t0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,\n\t0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,\n\t0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,\n\t0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,\n\t0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,\n\t0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,\n\t// Block 0xf, offset 0x3c0\n\t0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,\n\t0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,\n\t0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,\n\t0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,\n\t0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,\n\t0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,\n\t0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,\n\t0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,\n\t0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,\n\t0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,\n\t0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,\n\t// Block 0x10, offset 0x400\n\t0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,\n\t0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,\n\t0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,\n\t0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,\n\t0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,\n\t0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,\n\t0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,\n\t0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,\n\t0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,\n\t0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,\n\t0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,\n\t0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,\n\t0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,\n\t0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,\n\t0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,\n\t0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,\n\t0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,\n\t0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,\n\t0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,\n\t0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,\n\t0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,\n\t// Block 0x12, offset 0x480\n\t0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,\n\t0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,\n\t0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,\n\t0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,\n\t0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,\n\t0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,\n\t0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,\n\t0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,\n\t0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,\n\t0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,\n\t0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,\n\t0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,\n\t0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,\n\t0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,\n\t0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,\n\t0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,\n\t0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,\n\t0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,\n\t0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,\n\t0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,\n\t0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,\n\t// Block 0x14, offset 0x500\n\t0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,\n\t0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,\n\t0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,\n\t0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,\n\t0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,\n\t0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,\n\t0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,\n\t0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,\n\t0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,\n\t0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,\n\t0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,\n\t0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,\n\t0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,\n\t0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,\n\t0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,\n\t0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,\n\t0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,\n\t0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,\n\t0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,\n\t0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,\n\t0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,\n\t0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,\n\t0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,\n\t0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,\n\t0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,\n\t0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,\n\t0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,\n\t0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,\n\t0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,\n\t0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,\n\t0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,\n\t0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,\n\t0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,\n\t0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,\n\t0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,\n\t0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d,\n\t0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d,\n\t0x5ea: 0x000d, 0x5eb: 0x000d, 0x5ec: 0x000d, 0x5ed: 0x000d, 0x5ee: 0x000d, 0x5ef: 0x000d,\n\t0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001,\n\t0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001,\n\t0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001,\n\t// Block 0x18, offset 0x600\n\t0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001,\n\t0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001,\n\t0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001,\n\t0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,\n\t0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001,\n\t0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,\n\t0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,\n\t0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,\n\t0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,\n\t0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,\n\t0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,\n\t// Block 0x19, offset 0x640\n\t0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,\n\t0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d,\n\t0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d,\n\t0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,\n\t0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,\n\t0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,\n\t0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,\n\t0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,\n\t0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,\n\t0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,\n\t0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,\n\t// Block 0x1a, offset 0x680\n\t0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,\n\t0x6ba: 0x000c,\n\t0x6bc: 0x000c,\n\t// Block 0x1b, offset 0x6c0\n\t0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,\n\t0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,\n\t0x6cd: 0x000c, 0x6d1: 0x000c,\n\t0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,\n\t0x6e2: 0x000c, 0x6e3: 0x000c,\n\t// Block 0x1c, offset 0x700\n\t0x701: 0x000c,\n\t0x73c: 0x000c,\n\t// Block 0x1d, offset 0x740\n\t0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,\n\t0x74d: 0x000c,\n\t0x762: 0x000c, 0x763: 0x000c,\n\t0x772: 0x0004, 0x773: 0x0004,\n\t0x77b: 0x0004,\n\t// Block 0x1e, offset 0x780\n\t0x781: 0x000c, 0x782: 0x000c,\n\t0x7bc: 0x000c,\n\t// Block 0x1f, offset 0x7c0\n\t0x7c1: 0x000c, 0x7c2: 0x000c,\n\t0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,\n\t0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,\n\t0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,\n\t// Block 0x20, offset 0x800\n\t0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,\n\t0x807: 0x000c, 0x808: 0x000c,\n\t0x80d: 0x000c,\n\t0x822: 0x000c, 0x823: 0x000c,\n\t0x831: 0x0004,\n\t0x83a: 0x000c, 0x83b: 0x000c,\n\t0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c,\n\t// Block 0x21, offset 0x840\n\t0x841: 0x000c,\n\t0x87c: 0x000c, 0x87f: 0x000c,\n\t// Block 0x22, offset 0x880\n\t0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,\n\t0x88d: 0x000c,\n\t0x896: 0x000c,\n\t0x8a2: 0x000c, 0x8a3: 0x000c,\n\t// Block 0x23, offset 0x8c0\n\t0x8c2: 0x000c,\n\t// Block 0x24, offset 0x900\n\t0x900: 0x000c,\n\t0x90d: 0x000c,\n\t0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,\n\t0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,\n\t// Block 0x25, offset 0x940\n\t0x940: 0x000c,\n\t0x97e: 0x000c, 0x97f: 0x000c,\n\t// Block 0x26, offset 0x980\n\t0x980: 0x000c,\n\t0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,\n\t0x98c: 0x000c, 0x98d: 0x000c,\n\t0x995: 0x000c, 0x996: 0x000c,\n\t0x9a2: 0x000c, 0x9a3: 0x000c,\n\t0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,\n\t0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,\n\t// Block 0x27, offset 0x9c0\n\t0x9cc: 0x000c, 0x9cd: 0x000c,\n\t0x9e2: 0x000c, 0x9e3: 0x000c,\n\t// Block 0x28, offset 0xa00\n\t0xa00: 0x000c, 0xa01: 0x000c,\n\t0xa3b: 0x000c,\n\t0xa3c: 0x000c,\n\t// Block 0x29, offset 0xa40\n\t0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,\n\t0xa4d: 0x000c,\n\t0xa62: 0x000c, 0xa63: 0x000c,\n\t// Block 0x2a, offset 0xa80\n\t0xa8a: 0x000c,\n\t0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c,\n\t// Block 0x2b, offset 0xac0\n\t0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c,\n\t0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c,\n\t0xaff: 0x0004,\n\t// Block 0x2c, offset 0xb00\n\t0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c,\n\t0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c,\n\t// Block 0x2d, offset 0xb40\n\t0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c,\n\t0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c,\n\t0xb7c: 0x000c,\n\t// Block 0x2e, offset 0xb80\n\t0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c,\n\t0xb8c: 0x000c, 0xb8d: 0x000c,\n\t// Block 0x2f, offset 0xbc0\n\t0xbd8: 0x000c, 0xbd9: 0x000c,\n\t0xbf5: 0x000c,\n\t0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a,\n\t0xbfc: 0x003a, 0xbfd: 0x002a,\n\t// Block 0x30, offset 0xc00\n\t0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c,\n\t0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c,\n\t0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c,\n\t// Block 0x31, offset 0xc40\n\t0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c,\n\t0xc46: 0x000c, 0xc47: 0x000c,\n\t0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c,\n\t0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c,\n\t0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c,\n\t0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c,\n\t0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c,\n\t0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c,\n\t0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,\n\t0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,\n\t0xc7c: 0x000c,\n\t// Block 0x32, offset 0xc80\n\t0xc86: 0x000c,\n\t// Block 0x33, offset 0xcc0\n\t0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c,\n\t0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c,\n\t0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c,\n\t0xcfd: 0x000c, 0xcfe: 0x000c,\n\t// Block 0x34, offset 0xd00\n\t0xd18: 0x000c, 0xd19: 0x000c,\n\t0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c,\n\t0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c,\n\t// Block 0x35, offset 0xd40\n\t0xd42: 0x000c, 0xd45: 0x000c,\n\t0xd46: 0x000c,\n\t0xd4d: 0x000c,\n\t0xd5d: 0x000c,\n\t// Block 0x36, offset 0xd80\n\t0xd9d: 0x000c,\n\t0xd9e: 0x000c, 0xd9f: 0x000c,\n\t// Block 0x37, offset 0xdc0\n\t0xdd0: 0x000a, 0xdd1: 0x000a,\n\t0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a,\n\t0xdd8: 0x000a, 0xdd9: 0x000a,\n\t// Block 0x38, offset 0xe00\n\t0xe00: 0x000a,\n\t// Block 0x39, offset 0xe40\n\t0xe40: 0x0009,\n\t0xe5b: 0x007a, 0xe5c: 0x006a,\n\t// Block 0x3a, offset 0xe80\n\t0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c,\n\t0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c,\n\t// Block 0x3b, offset 0xec0\n\t0xed2: 0x000c, 0xed3: 0x000c,\n\t0xef2: 0x000c, 0xef3: 0x000c,\n\t// Block 0x3c, offset 0xf00\n\t0xf34: 0x000c, 0xf35: 0x000c,\n\t0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c,\n\t0xf3c: 0x000c, 0xf3d: 0x000c,\n\t// Block 0x3d, offset 0xf40\n\t0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c,\n\t0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c,\n\t0xf52: 0x000c, 0xf53: 0x000c,\n\t0xf5b: 0x0004, 0xf5d: 0x000c,\n\t0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a,\n\t0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a,\n\t// Block 0x3e, offset 0xf80\n\t0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a,\n\t0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c,\n\t0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b,\n\t// Block 0x3f, offset 0xfc0\n\t0xfc5: 0x000c,\n\t0xfc6: 0x000c,\n\t0xfe9: 0x000c,\n\t// Block 0x40, offset 0x1000\n\t0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c,\n\t0x1027: 0x000c, 0x1028: 0x000c,\n\t0x1032: 0x000c,\n\t0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c,\n\t// Block 0x41, offset 0x1040\n\t0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a,\n\t// Block 0x42, offset 0x1080\n\t0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a,\n\t0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a,\n\t0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a,\n\t0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a,\n\t0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a,\n\t0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a,\n\t// Block 0x43, offset 0x10c0\n\t0x10d7: 0x000c,\n\t0x10d8: 0x000c, 0x10db: 0x000c,\n\t// Block 0x44, offset 0x1100\n\t0x1116: 0x000c,\n\t0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c,\n\t0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c,\n\t0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c,\n\t0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c,\n\t0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c,\n\t0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c,\n\t0x113c: 0x000c, 0x113f: 0x000c,\n\t// Block 0x45, offset 0x1140\n\t0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,\n\t0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,\n\t0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c,\n\t// Block 0x46, offset 0x1180\n\t0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c,\n\t0x11b4: 0x000c,\n\t0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c,\n\t0x11bc: 0x000c,\n\t// Block 0x47, offset 0x11c0\n\t0x11c2: 0x000c,\n\t0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c,\n\t0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c,\n\t// Block 0x48, offset 0x1200\n\t0x1200: 0x000c, 0x1201: 0x000c,\n\t0x1222: 0x000c, 0x1223: 0x000c,\n\t0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c,\n\t0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c,\n\t// Block 0x49, offset 0x1240\n\t0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c,\n\t0x126d: 0x000c, 0x126f: 0x000c,\n\t0x1270: 0x000c, 0x1271: 0x000c,\n\t// Block 0x4a, offset 0x1280\n\t0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c,\n\t0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c,\n\t0x12b6: 0x000c, 0x12b7: 0x000c,\n\t// Block 0x4b, offset 0x12c0\n\t0x12d0: 0x000c, 0x12d1: 0x000c,\n\t0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c,\n\t0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c,\n\t0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c,\n\t0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c,\n\t0x12ed: 0x000c,\n\t0x12f4: 0x000c,\n\t0x12f8: 0x000c, 0x12f9: 0x000c,\n\t// Block 0x4c, offset 0x1300\n\t0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c,\n\t0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c,\n\t0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c,\n\t0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c,\n\t0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c,\n\t0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c,\n\t0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c,\n\t0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,\n\t0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c,\n\t0x1336: 0x000c, 0x1337: 0x000c, 0x1338: 0x000c, 0x1339: 0x000c, 0x133b: 0x000c,\n\t0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c,\n\t// Block 0x4d, offset 0x1340\n\t0x137d: 0x000a, 0x137f: 0x000a,\n\t// Block 0x4e, offset 0x1380\n\t0x1380: 0x000a, 0x1381: 0x000a,\n\t0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a,\n\t0x139d: 0x000a,\n\t0x139e: 0x000a, 0x139f: 0x000a,\n\t0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a,\n\t0x13bd: 0x000a, 0x13be: 0x000a,\n\t// Block 0x4f, offset 0x13c0\n\t0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009,\n\t0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b,\n\t0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a,\n\t0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a,\n\t0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a,\n\t0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a,\n\t0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007,\n\t0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006,\n\t0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a,\n\t0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a,\n\t0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a,\n\t// Block 0x50, offset 0x1400\n\t0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a,\n\t0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a,\n\t0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a,\n\t0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,\n\t0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,\n\t0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b,\n\t0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e,\n\t0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b,\n\t0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002,\n\t0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003,\n\t0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a,\n\t// Block 0x51, offset 0x1440\n\t0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002,\n\t0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003,\n\t0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a,\n\t0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004,\n\t0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004,\n\t0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004,\n\t0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004,\n\t0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004,\n\t0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004,\n\t// Block 0x52, offset 0x1480\n\t0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004,\n\t0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004,\n\t0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c,\n\t0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c,\n\t0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c,\n\t0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c,\n\t0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c,\n\t0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c,\n\t0x14b0: 0x000c,\n\t// Block 0x53, offset 0x14c0\n\t0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a,\n\t0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a,\n\t0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a,\n\t0x14d8: 0x000a,\n\t0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a,\n\t0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a,\n\t0x14ee: 0x0004,\n\t0x14fa: 0x000a, 0x14fb: 0x000a,\n\t// Block 0x54, offset 0x1500\n\t0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a,\n\t0x150a: 0x000a, 0x150b: 0x000a,\n\t0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a,\n\t0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,\n\t0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a,\n\t0x151e: 0x000a, 0x151f: 0x000a,\n\t// Block 0x55, offset 0x1540\n\t0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a,\n\t0x1550: 0x000a, 0x1551: 0x000a,\n\t0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,\n\t0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,\n\t0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a,\n\t0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a,\n\t0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a,\n\t0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a,\n\t0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a,\n\t0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a,\n\t// Block 0x56, offset 0x1580\n\t0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a,\n\t0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,\n\t0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a,\n\t0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,\n\t0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,\n\t0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,\n\t0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,\n\t0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,\n\t0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,\n\t0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,\n\t0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,\n\t// Block 0x57, offset 0x15c0\n\t0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,\n\t0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,\n\t0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,\n\t0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,\n\t0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,\n\t0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,\n\t0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,\n\t0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,\n\t0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,\n\t0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,\n\t0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,\n\t// Block 0x58, offset 0x1600\n\t0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,\n\t0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a,\n\t0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,\n\t0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,\n\t0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,\n\t0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,\n\t0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a,\n\t0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,\n\t0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,\n\t// Block 0x59, offset 0x1640\n\t0x167b: 0x000a,\n\t0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a,\n\t// Block 0x5a, offset 0x1680\n\t0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a,\n\t0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a,\n\t0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a,\n\t0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a,\n\t0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a,\n\t0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a,\n\t0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a,\n\t0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a,\n\t0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a,\n\t0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a,\n\t0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,\n\t// Block 0x5b, offset 0x16c0\n\t0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,\n\t0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,\n\t0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,\n\t0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,\n\t0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,\n\t0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,\n\t0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a,\n\t// Block 0x5c, offset 0x1700\n\t0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,\n\t0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a,\n\t0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,\n\t0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, 0x1727: 0x000a, 0x1728: 0x000a, 0x1729: 0x000a,\n\t0x172a: 0x000a, 0x172b: 0x000a, 0x172c: 0x000a, 0x172d: 0x000a, 0x172e: 0x000a, 0x172f: 0x000a,\n\t0x1730: 0x000a, 0x1731: 0x000a, 0x1732: 0x000a, 0x1733: 0x000a, 0x1734: 0x000a, 0x1735: 0x000a,\n\t0x1736: 0x000a, 0x1737: 0x000a, 0x1738: 0x000a, 0x1739: 0x000a, 0x173a: 0x000a, 0x173b: 0x000a,\n\t0x173c: 0x000a, 0x173d: 0x000a, 0x173e: 0x000a, 0x173f: 0x000a,\n\t// Block 0x5d, offset 0x1740\n\t0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,\n\t0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x0002, 0x1749: 0x0002, 0x174a: 0x0002, 0x174b: 0x0002,\n\t0x174c: 0x0002, 0x174d: 0x0002, 0x174e: 0x0002, 0x174f: 0x0002, 0x1750: 0x0002, 0x1751: 0x0002,\n\t0x1752: 0x0002, 0x1753: 0x0002, 0x1754: 0x0002, 0x1755: 0x0002, 0x1756: 0x0002, 0x1757: 0x0002,\n\t0x1758: 0x0002, 0x1759: 0x0002, 0x175a: 0x0002, 0x175b: 0x0002,\n\t// Block 0x5e, offset 0x1780\n\t0x17aa: 0x000a, 0x17ab: 0x000a, 0x17ac: 0x000a, 0x17ad: 0x000a, 0x17ae: 0x000a, 0x17af: 0x000a,\n\t0x17b0: 0x000a, 0x17b1: 0x000a, 0x17b2: 0x000a, 0x17b3: 0x000a, 0x17b4: 0x000a, 0x17b5: 0x000a,\n\t0x17b6: 0x000a, 0x17b7: 0x000a, 0x17b8: 0x000a, 0x17b9: 0x000a, 0x17ba: 0x000a, 0x17bb: 0x000a,\n\t0x17bc: 0x000a, 0x17bd: 0x000a, 0x17be: 0x000a, 0x17bf: 0x000a,\n\t// Block 0x5f, offset 0x17c0\n\t0x17c0: 0x000a, 0x17c1: 0x000a, 0x17c2: 0x000a, 0x17c3: 0x000a, 0x17c4: 0x000a, 0x17c5: 0x000a,\n\t0x17c6: 0x000a, 0x17c7: 0x000a, 0x17c8: 0x000a, 0x17c9: 0x000a, 0x17ca: 0x000a, 0x17cb: 0x000a,\n\t0x17cc: 0x000a, 0x17cd: 0x000a, 0x17ce: 0x000a, 0x17cf: 0x000a, 0x17d0: 0x000a, 0x17d1: 0x000a,\n\t0x17d2: 0x000a, 0x17d3: 0x000a, 0x17d4: 0x000a, 0x17d5: 0x000a, 0x17d6: 0x000a, 0x17d7: 0x000a,\n\t0x17d8: 0x000a, 0x17d9: 0x000a, 0x17da: 0x000a, 0x17db: 0x000a, 0x17dc: 0x000a, 0x17dd: 0x000a,\n\t0x17de: 0x000a, 0x17df: 0x000a, 0x17e0: 0x000a, 0x17e1: 0x000a, 0x17e2: 0x000a, 0x17e3: 0x000a,\n\t0x17e4: 0x000a, 0x17e5: 0x000a, 0x17e6: 0x000a, 0x17e7: 0x000a, 0x17e8: 0x000a, 0x17e9: 0x000a,\n\t0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,\n\t0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,\n\t0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,\n\t0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,\n\t// Block 0x60, offset 0x1800\n\t0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,\n\t0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,\n\t0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,\n\t0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,\n\t0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,\n\t0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,\n\t0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x003a, 0x1829: 0x002a,\n\t0x182a: 0x003a, 0x182b: 0x002a, 0x182c: 0x003a, 0x182d: 0x002a, 0x182e: 0x003a, 0x182f: 0x002a,\n\t0x1830: 0x003a, 0x1831: 0x002a, 0x1832: 0x003a, 0x1833: 0x002a, 0x1834: 0x003a, 0x1835: 0x002a,\n\t0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,\n\t0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,\n\t// Block 0x61, offset 0x1840\n\t0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x009a,\n\t0x1846: 0x008a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,\n\t0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,\n\t0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,\n\t0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,\n\t0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,\n\t0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x003a, 0x1867: 0x002a, 0x1868: 0x003a, 0x1869: 0x002a,\n\t0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,\n\t0x1870: 0x000a, 0x1871: 0x000a, 0x1872: 0x000a, 0x1873: 0x000a, 0x1874: 0x000a, 0x1875: 0x000a,\n\t0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,\n\t0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,\n\t// Block 0x62, offset 0x1880\n\t0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x007a, 0x1884: 0x006a, 0x1885: 0x009a,\n\t0x1886: 0x008a, 0x1887: 0x00ba, 0x1888: 0x00aa, 0x1889: 0x009a, 0x188a: 0x008a, 0x188b: 0x007a,\n\t0x188c: 0x006a, 0x188d: 0x00da, 0x188e: 0x002a, 0x188f: 0x003a, 0x1890: 0x00ca, 0x1891: 0x009a,\n\t0x1892: 0x008a, 0x1893: 0x007a, 0x1894: 0x006a, 0x1895: 0x009a, 0x1896: 0x008a, 0x1897: 0x00ba,\n\t0x1898: 0x00aa, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,\n\t0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,\n\t0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x000a, 0x18a7: 0x000a, 0x18a8: 0x000a, 0x18a9: 0x000a,\n\t0x18aa: 0x000a, 0x18ab: 0x000a, 0x18ac: 0x000a, 0x18ad: 0x000a, 0x18ae: 0x000a, 0x18af: 0x000a,\n\t0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,\n\t0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,\n\t0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,\n\t// Block 0x63, offset 0x18c0\n\t0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x000a, 0x18c4: 0x000a, 0x18c5: 0x000a,\n\t0x18c6: 0x000a, 0x18c7: 0x000a, 0x18c8: 0x000a, 0x18c9: 0x000a, 0x18ca: 0x000a, 0x18cb: 0x000a,\n\t0x18cc: 0x000a, 0x18cd: 0x000a, 0x18ce: 0x000a, 0x18cf: 0x000a, 0x18d0: 0x000a, 0x18d1: 0x000a,\n\t0x18d2: 0x000a, 0x18d3: 0x000a, 0x18d4: 0x000a, 0x18d5: 0x000a, 0x18d6: 0x000a, 0x18d7: 0x000a,\n\t0x18d8: 0x003a, 0x18d9: 0x002a, 0x18da: 0x003a, 0x18db: 0x002a, 0x18dc: 0x000a, 0x18dd: 0x000a,\n\t0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,\n\t0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,\n\t0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,\n\t0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,\n\t0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,\n\t0x18fc: 0x003a, 0x18fd: 0x002a, 0x18fe: 0x000a, 0x18ff: 0x000a,\n\t// Block 0x64, offset 0x1900\n\t0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,\n\t0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,\n\t0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,\n\t0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,\n\t0x1918: 0x000a, 0x1919: 0x000a, 0x191a: 0x000a, 0x191b: 0x000a, 0x191c: 0x000a, 0x191d: 0x000a,\n\t0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,\n\t0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,\n\t0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,\n\t0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a,\n\t0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,\n\t0x193c: 0x000a, 0x193d: 0x000a, 0x193e: 0x000a, 0x193f: 0x000a,\n\t// Block 0x65, offset 0x1940\n\t0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,\n\t0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,\n\t0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,\n\t0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a,\n\t0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,\n\t0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,\n\t0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,\n\t0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,\n\t0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, 0x1974: 0x000a, 0x1975: 0x000a,\n\t0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a,\n\t0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,\n\t// Block 0x66, offset 0x1980\n\t0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,\n\t0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,\n\t0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,\n\t0x1992: 0x000a,\n\t0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,\n\t// Block 0x67, offset 0x19c0\n\t0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a,\n\t0x19ea: 0x000a, 0x19ef: 0x000c,\n\t0x19f0: 0x000c, 0x19f1: 0x000c,\n\t0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a,\n\t0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a,\n\t// Block 0x68, offset 0x1a00\n\t0x1a3f: 0x000c,\n\t// Block 0x69, offset 0x1a40\n\t0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c,\n\t0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c,\n\t0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c,\n\t0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c,\n\t0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c,\n\t0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c,\n\t// Block 0x6a, offset 0x1a80\n\t0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a,\n\t0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a,\n\t0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a,\n\t0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a,\n\t0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a,\n\t0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a,\n\t0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a,\n\t0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a,\n\t0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a,\n\t0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a,\n\t0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a,\n\t// Block 0x6b, offset 0x1ac0\n\t0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,\n\t0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a,\n\t// Block 0x6c, offset 0x1b00\n\t0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a,\n\t0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a,\n\t0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a,\n\t0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a,\n\t0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a,\n\t0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a,\n\t0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a,\n\t0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a,\n\t0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a,\n\t0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a,\n\t0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a,\n\t// Block 0x6d, offset 0x1b40\n\t0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,\n\t0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,\n\t0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,\n\t0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,\n\t0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,\n\t0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,\n\t0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,\n\t0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,\n\t0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a,\n\t// Block 0x6e, offset 0x1b80\n\t0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,\n\t0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,\n\t0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,\n\t0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a,\n\t0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a,\n\t0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a,\n\t// Block 0x6f, offset 0x1bc0\n\t0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a,\n\t0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a,\n\t0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a,\n\t0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a,\n\t0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a,\n\t0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a,\n\t0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c,\n\t0x1bf0: 0x000a,\n\t0x1bf6: 0x000a, 0x1bf7: 0x000a,\n\t0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a,\n\t// Block 0x70, offset 0x1c00\n\t0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a,\n\t0x1c20: 0x000a,\n\t// Block 0x71, offset 0x1c40\n\t0x1c7b: 0x000a,\n\t// Block 0x72, offset 0x1c80\n\t0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a,\n\t0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a,\n\t0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a,\n\t0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a,\n\t0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a,\n\t0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a,\n\t// Block 0x73, offset 0x1cc0\n\t0x1cdd: 0x000a,\n\t0x1cde: 0x000a,\n\t// Block 0x74, offset 0x1d00\n\t0x1d10: 0x000a, 0x1d11: 0x000a,\n\t0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a,\n\t0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a,\n\t0x1d1e: 0x000a, 0x1d1f: 0x000a,\n\t0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a,\n\t// Block 0x75, offset 0x1d40\n\t0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a,\n\t0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a,\n\t0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a,\n\t// Block 0x76, offset 0x1d80\n\t0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a,\n\t// Block 0x77, offset 0x1dc0\n\t0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a,\n\t// Block 0x78, offset 0x1e00\n\t0x1e1e: 0x000a, 0x1e1f: 0x000a,\n\t0x1e3f: 0x000a,\n\t// Block 0x79, offset 0x1e40\n\t0x1e50: 0x000a, 0x1e51: 0x000a,\n\t0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a,\n\t0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a,\n\t0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a,\n\t0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a,\n\t0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a,\n\t0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a,\n\t0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a,\n\t0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a,\n\t// Block 0x7a, offset 0x1e80\n\t0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a,\n\t0x1e86: 0x000a,\n\t// Block 0x7b, offset 0x1ec0\n\t0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a,\n\t// Block 0x7c, offset 0x1f00\n\t0x1f2f: 0x000c,\n\t0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c,\n\t0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c,\n\t0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a,\n\t// Block 0x7d, offset 0x1f40\n\t0x1f5e: 0x000c, 0x1f5f: 0x000c,\n\t// Block 0x7e, offset 0x1f80\n\t0x1fb0: 0x000c, 0x1fb1: 0x000c,\n\t// Block 0x7f, offset 0x1fc0\n\t0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a,\n\t0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a,\n\t0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a,\n\t0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a,\n\t0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a,\n\t0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a,\n\t// Block 0x80, offset 0x2000\n\t0x2008: 0x000a,\n\t// Block 0x81, offset 0x2040\n\t0x2042: 0x000c,\n\t0x2046: 0x000c, 0x204b: 0x000c,\n\t0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a,\n\t0x206a: 0x000a, 0x206b: 0x000a,\n\t0x2078: 0x0004, 0x2079: 0x0004,\n\t// Block 0x82, offset 0x2080\n\t0x20b4: 0x000a, 0x20b5: 0x000a,\n\t0x20b6: 0x000a, 0x20b7: 0x000a,\n\t// Block 0x83, offset 0x20c0\n\t0x20c4: 0x000c, 0x20c5: 0x000c,\n\t0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c,\n\t0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c,\n\t0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c,\n\t0x20f0: 0x000c, 0x20f1: 0x000c,\n\t// Block 0x84, offset 0x2100\n\t0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,\n\t0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c,\n\t// Block 0x85, offset 0x2140\n\t0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c,\n\t0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c,\n\t// Block 0x86, offset 0x2180\n\t0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c,\n\t0x21b3: 0x000c,\n\t0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c,\n\t0x21bc: 0x000c,\n\t// Block 0x87, offset 0x21c0\n\t0x21e5: 0x000c,\n\t// Block 0x88, offset 0x2200\n\t0x2229: 0x000c,\n\t0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c,\n\t0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c,\n\t0x2236: 0x000c,\n\t// Block 0x89, offset 0x2240\n\t0x2243: 0x000c,\n\t0x224c: 0x000c,\n\t0x227c: 0x000c,\n\t// Block 0x8a, offset 0x2280\n\t0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c,\n\t0x22b7: 0x000c, 0x22b8: 0x000c,\n\t0x22be: 0x000c, 0x22bf: 0x000c,\n\t// Block 0x8b, offset 0x22c0\n\t0x22c1: 0x000c,\n\t0x22ec: 0x000c, 0x22ed: 0x000c,\n\t0x22f6: 0x000c,\n\t// Block 0x8c, offset 0x2300\n\t0x2325: 0x000c, 0x2328: 0x000c,\n\t0x232d: 0x000c,\n\t// Block 0x8d, offset 0x2340\n\t0x235d: 0x0001,\n\t0x235e: 0x000c, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001,\n\t0x2364: 0x0001, 0x2365: 0x0001, 0x2366: 0x0001, 0x2367: 0x0001, 0x2368: 0x0001, 0x2369: 0x0003,\n\t0x236a: 0x0001, 0x236b: 0x0001, 0x236c: 0x0001, 0x236d: 0x0001, 0x236e: 0x0001, 0x236f: 0x0001,\n\t0x2370: 0x0001, 0x2371: 0x0001, 0x2372: 0x0001, 0x2373: 0x0001, 0x2374: 0x0001, 0x2375: 0x0001,\n\t0x2376: 0x0001, 0x2377: 0x0001, 0x2378: 0x0001, 0x2379: 0x0001, 0x237a: 0x0001, 0x237b: 0x0001,\n\t0x237c: 0x0001, 0x237d: 0x0001, 0x237e: 0x0001, 0x237f: 0x0001,\n\t// Block 0x8e, offset 0x2380\n\t0x2380: 0x0001, 0x2381: 0x0001, 0x2382: 0x0001, 0x2383: 0x0001, 0x2384: 0x0001, 0x2385: 0x0001,\n\t0x2386: 0x0001, 0x2387: 0x0001, 0x2388: 0x0001, 0x2389: 0x0001, 0x238a: 0x0001, 0x238b: 0x0001,\n\t0x238c: 0x0001, 0x238d: 0x0001, 0x238e: 0x0001, 0x238f: 0x0001, 0x2390: 0x000d, 0x2391: 0x000d,\n\t0x2392: 0x000d, 0x2393: 0x000d, 0x2394: 0x000d, 0x2395: 0x000d, 0x2396: 0x000d, 0x2397: 0x000d,\n\t0x2398: 0x000d, 0x2399: 0x000d, 0x239a: 0x000d, 0x239b: 0x000d, 0x239c: 0x000d, 0x239d: 0x000d,\n\t0x239e: 0x000d, 0x239f: 0x000d, 0x23a0: 0x000d, 0x23a1: 0x000d, 0x23a2: 0x000d, 0x23a3: 0x000d,\n\t0x23a4: 0x000d, 0x23a5: 0x000d, 0x23a6: 0x000d, 0x23a7: 0x000d, 0x23a8: 0x000d, 0x23a9: 0x000d,\n\t0x23aa: 0x000d, 0x23ab: 0x000d, 0x23ac: 0x000d, 0x23ad: 0x000d, 0x23ae: 0x000d, 0x23af: 0x000d,\n\t0x23b0: 0x000d, 0x23b1: 0x000d, 0x23b2: 0x000d, 0x23b3: 0x000d, 0x23b4: 0x000d, 0x23b5: 0x000d,\n\t0x23b6: 0x000d, 0x23b7: 0x000d, 0x23b8: 0x000d, 0x23b9: 0x000d, 0x23ba: 0x000d, 0x23bb: 0x000d,\n\t0x23bc: 0x000d, 0x23bd: 0x000d, 0x23be: 0x000d, 0x23bf: 0x000d,\n\t// Block 0x8f, offset 0x23c0\n\t0x23c0: 0x000d, 0x23c1: 0x000d, 0x23c2: 0x000d, 0x23c3: 0x000d, 0x23c4: 0x000d, 0x23c5: 0x000d,\n\t0x23c6: 0x000d, 0x23c7: 0x000d, 0x23c8: 0x000d, 0x23c9: 0x000d, 0x23ca: 0x000d, 0x23cb: 0x000d,\n\t0x23cc: 0x000d, 0x23cd: 0x000d, 0x23ce: 0x000d, 0x23cf: 0x000d, 0x23d0: 0x000d, 0x23d1: 0x000d,\n\t0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,\n\t0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,\n\t0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,\n\t0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,\n\t0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,\n\t0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,\n\t0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,\n\t0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000a, 0x23ff: 0x000a,\n\t// Block 0x90, offset 0x2400\n\t0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,\n\t0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,\n\t0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000b, 0x2411: 0x000b,\n\t0x2412: 0x000b, 0x2413: 0x000b, 0x2414: 0x000b, 0x2415: 0x000b, 0x2416: 0x000b, 0x2417: 0x000b,\n\t0x2418: 0x000b, 0x2419: 0x000b, 0x241a: 0x000b, 0x241b: 0x000b, 0x241c: 0x000b, 0x241d: 0x000b,\n\t0x241e: 0x000b, 0x241f: 0x000b, 0x2420: 0x000b, 0x2421: 0x000b, 0x2422: 0x000b, 0x2423: 0x000b,\n\t0x2424: 0x000b, 0x2425: 0x000b, 0x2426: 0x000b, 0x2427: 0x000b, 0x2428: 0x000b, 0x2429: 0x000b,\n\t0x242a: 0x000b, 0x242b: 0x000b, 0x242c: 0x000b, 0x242d: 0x000b, 0x242e: 0x000b, 0x242f: 0x000b,\n\t0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,\n\t0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,\n\t0x243c: 0x000d, 0x243d: 0x000a, 0x243e: 0x000d, 0x243f: 0x000d,\n\t// Block 0x91, offset 0x2440\n\t0x2440: 0x000c, 0x2441: 0x000c, 0x2442: 0x000c, 0x2443: 0x000c, 0x2444: 0x000c, 0x2445: 0x000c,\n\t0x2446: 0x000c, 0x2447: 0x000c, 0x2448: 0x000c, 0x2449: 0x000c, 0x244a: 0x000c, 0x244b: 0x000c,\n\t0x244c: 0x000c, 0x244d: 0x000c, 0x244e: 0x000c, 0x244f: 0x000c, 0x2450: 0x000a, 0x2451: 0x000a,\n\t0x2452: 0x000a, 0x2453: 0x000a, 0x2454: 0x000a, 0x2455: 0x000a, 0x2456: 0x000a, 0x2457: 0x000a,\n\t0x2458: 0x000a, 0x2459: 0x000a,\n\t0x2460: 0x000c, 0x2461: 0x000c, 0x2462: 0x000c, 0x2463: 0x000c,\n\t0x2464: 0x000c, 0x2465: 0x000c, 0x2466: 0x000c, 0x2467: 0x000c, 0x2468: 0x000c, 0x2469: 0x000c,\n\t0x246a: 0x000c, 0x246b: 0x000c, 0x246c: 0x000c, 0x246d: 0x000c, 0x246e: 0x000c, 0x246f: 0x000c,\n\t0x2470: 0x000a, 0x2471: 0x000a, 0x2472: 0x000a, 0x2473: 0x000a, 0x2474: 0x000a, 0x2475: 0x000a,\n\t0x2476: 0x000a, 0x2477: 0x000a, 0x2478: 0x000a, 0x2479: 0x000a, 0x247a: 0x000a, 0x247b: 0x000a,\n\t0x247c: 0x000a, 0x247d: 0x000a, 0x247e: 0x000a, 0x247f: 0x000a,\n\t// Block 0x92, offset 0x2480\n\t0x2480: 0x000a, 0x2481: 0x000a, 0x2482: 0x000a, 0x2483: 0x000a, 0x2484: 0x000a, 0x2485: 0x000a,\n\t0x2486: 0x000a, 0x2487: 0x000a, 0x2488: 0x000a, 0x2489: 0x000a, 0x248a: 0x000a, 0x248b: 0x000a,\n\t0x248c: 0x000a, 0x248d: 0x000a, 0x248e: 0x000a, 0x248f: 0x000a, 0x2490: 0x0006, 0x2491: 0x000a,\n\t0x2492: 0x0006, 0x2494: 0x000a, 0x2495: 0x0006, 0x2496: 0x000a, 0x2497: 0x000a,\n\t0x2498: 0x000a, 0x2499: 0x009a, 0x249a: 0x008a, 0x249b: 0x007a, 0x249c: 0x006a, 0x249d: 0x009a,\n\t0x249e: 0x008a, 0x249f: 0x0004, 0x24a0: 0x000a, 0x24a1: 0x000a, 0x24a2: 0x0003, 0x24a3: 0x0003,\n\t0x24a4: 0x000a, 0x24a5: 0x000a, 0x24a6: 0x000a, 0x24a8: 0x000a, 0x24a9: 0x0004,\n\t0x24aa: 0x0004, 0x24ab: 0x000a,\n\t0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d,\n\t0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d,\n\t0x24bc: 0x000d, 0x24bd: 0x000d, 0x24be: 0x000d, 0x24bf: 0x000d,\n\t// Block 0x93, offset 0x24c0\n\t0x24c0: 0x000d, 0x24c1: 0x000d, 0x24c2: 0x000d, 0x24c3: 0x000d, 0x24c4: 0x000d, 0x24c5: 0x000d,\n\t0x24c6: 0x000d, 0x24c7: 0x000d, 0x24c8: 0x000d, 0x24c9: 0x000d, 0x24ca: 0x000d, 0x24cb: 0x000d,\n\t0x24cc: 0x000d, 0x24cd: 0x000d, 0x24ce: 0x000d, 0x24cf: 0x000d, 0x24d0: 0x000d, 0x24d1: 0x000d,\n\t0x24d2: 0x000d, 0x24d3: 0x000d, 0x24d4: 0x000d, 0x24d5: 0x000d, 0x24d6: 0x000d, 0x24d7: 0x000d,\n\t0x24d8: 0x000d, 0x24d9: 0x000d, 0x24da: 0x000d, 0x24db: 0x000d, 0x24dc: 0x000d, 0x24dd: 0x000d,\n\t0x24de: 0x000d, 0x24df: 0x000d, 0x24e0: 0x000d, 0x24e1: 0x000d, 0x24e2: 0x000d, 0x24e3: 0x000d,\n\t0x24e4: 0x000d, 0x24e5: 0x000d, 0x24e6: 0x000d, 0x24e7: 0x000d, 0x24e8: 0x000d, 0x24e9: 0x000d,\n\t0x24ea: 0x000d, 0x24eb: 0x000d, 0x24ec: 0x000d, 0x24ed: 0x000d, 0x24ee: 0x000d, 0x24ef: 0x000d,\n\t0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d,\n\t0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d,\n\t0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000b,\n\t// Block 0x94, offset 0x2500\n\t0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x0004, 0x2504: 0x0004, 0x2505: 0x0004,\n\t0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x003a, 0x2509: 0x002a, 0x250a: 0x000a, 0x250b: 0x0003,\n\t0x250c: 0x0006, 0x250d: 0x0003, 0x250e: 0x0006, 0x250f: 0x0006, 0x2510: 0x0002, 0x2511: 0x0002,\n\t0x2512: 0x0002, 0x2513: 0x0002, 0x2514: 0x0002, 0x2515: 0x0002, 0x2516: 0x0002, 0x2517: 0x0002,\n\t0x2518: 0x0002, 0x2519: 0x0002, 0x251a: 0x0006, 0x251b: 0x000a, 0x251c: 0x000a, 0x251d: 0x000a,\n\t0x251e: 0x000a, 0x251f: 0x000a, 0x2520: 0x000a,\n\t0x253b: 0x005a,\n\t0x253c: 0x000a, 0x253d: 0x004a, 0x253e: 0x000a, 0x253f: 0x000a,\n\t// Block 0x95, offset 0x2540\n\t0x2540: 0x000a,\n\t0x255b: 0x005a, 0x255c: 0x000a, 0x255d: 0x004a,\n\t0x255e: 0x000a, 0x255f: 0x00fa, 0x2560: 0x00ea, 0x2561: 0x000a, 0x2562: 0x003a, 0x2563: 0x002a,\n\t0x2564: 0x000a, 0x2565: 0x000a,\n\t// Block 0x96, offset 0x2580\n\t0x25a0: 0x0004, 0x25a1: 0x0004, 0x25a2: 0x000a, 0x25a3: 0x000a,\n\t0x25a4: 0x000a, 0x25a5: 0x0004, 0x25a6: 0x0004, 0x25a8: 0x000a, 0x25a9: 0x000a,\n\t0x25aa: 0x000a, 0x25ab: 0x000a, 0x25ac: 0x000a, 0x25ad: 0x000a, 0x25ae: 0x000a,\n\t0x25b0: 0x000b, 0x25b1: 0x000b, 0x25b2: 0x000b, 0x25b3: 0x000b, 0x25b4: 0x000b, 0x25b5: 0x000b,\n\t0x25b6: 0x000b, 0x25b7: 0x000b, 0x25b8: 0x000b, 0x25b9: 0x000a, 0x25ba: 0x000a, 0x25bb: 0x000a,\n\t0x25bc: 0x000a, 0x25bd: 0x000a, 0x25be: 0x000b, 0x25bf: 0x000b,\n\t// Block 0x97, offset 0x25c0\n\t0x25c1: 0x000a,\n\t// Block 0x98, offset 0x2600\n\t0x2600: 0x000a, 0x2601: 0x000a, 0x2602: 0x000a, 0x2603: 0x000a, 0x2604: 0x000a, 0x2605: 0x000a,\n\t0x2606: 0x000a, 0x2607: 0x000a, 0x2608: 0x000a, 0x2609: 0x000a, 0x260a: 0x000a, 0x260b: 0x000a,\n\t0x260c: 0x000a, 0x2610: 0x000a, 0x2611: 0x000a,\n\t0x2612: 0x000a, 0x2613: 0x000a, 0x2614: 0x000a, 0x2615: 0x000a, 0x2616: 0x000a, 0x2617: 0x000a,\n\t0x2618: 0x000a, 0x2619: 0x000a, 0x261a: 0x000a, 0x261b: 0x000a,\n\t0x2620: 0x000a,\n\t// Block 0x99, offset 0x2640\n\t0x267d: 0x000c,\n\t// Block 0x9a, offset 0x2680\n\t0x26a0: 0x000c, 0x26a1: 0x0002, 0x26a2: 0x0002, 0x26a3: 0x0002,\n\t0x26a4: 0x0002, 0x26a5: 0x0002, 0x26a6: 0x0002, 0x26a7: 0x0002, 0x26a8: 0x0002, 0x26a9: 0x0002,\n\t0x26aa: 0x0002, 0x26ab: 0x0002, 0x26ac: 0x0002, 0x26ad: 0x0002, 0x26ae: 0x0002, 0x26af: 0x0002,\n\t0x26b0: 0x0002, 0x26b1: 0x0002, 0x26b2: 0x0002, 0x26b3: 0x0002, 0x26b4: 0x0002, 0x26b5: 0x0002,\n\t0x26b6: 0x0002, 0x26b7: 0x0002, 0x26b8: 0x0002, 0x26b9: 0x0002, 0x26ba: 0x0002, 0x26bb: 0x0002,\n\t// Block 0x9b, offset 0x26c0\n\t0x26f6: 0x000c, 0x26f7: 0x000c, 0x26f8: 0x000c, 0x26f9: 0x000c, 0x26fa: 0x000c,\n\t// Block 0x9c, offset 0x2700\n\t0x2700: 0x0001, 0x2701: 0x0001, 0x2702: 0x0001, 0x2703: 0x0001, 0x2704: 0x0001, 0x2705: 0x0001,\n\t0x2706: 0x0001, 0x2707: 0x0001, 0x2708: 0x0001, 0x2709: 0x0001, 0x270a: 0x0001, 0x270b: 0x0001,\n\t0x270c: 0x0001, 0x270d: 0x0001, 0x270e: 0x0001, 0x270f: 0x0001, 0x2710: 0x0001, 0x2711: 0x0001,\n\t0x2712: 0x0001, 0x2713: 0x0001, 0x2714: 0x0001, 0x2715: 0x0001, 0x2716: 0x0001, 0x2717: 0x0001,\n\t0x2718: 0x0001, 0x2719: 0x0001, 0x271a: 0x0001, 0x271b: 0x0001, 0x271c: 0x0001, 0x271d: 0x0001,\n\t0x271e: 0x0001, 0x271f: 0x0001, 0x2720: 0x0001, 0x2721: 0x0001, 0x2722: 0x0001, 0x2723: 0x0001,\n\t0x2724: 0x0001, 0x2725: 0x0001, 0x2726: 0x0001, 0x2727: 0x0001, 0x2728: 0x0001, 0x2729: 0x0001,\n\t0x272a: 0x0001, 0x272b: 0x0001, 0x272c: 0x0001, 0x272d: 0x0001, 0x272e: 0x0001, 0x272f: 0x0001,\n\t0x2730: 0x0001, 0x2731: 0x0001, 0x2732: 0x0001, 0x2733: 0x0001, 0x2734: 0x0001, 0x2735: 0x0001,\n\t0x2736: 0x0001, 0x2737: 0x0001, 0x2738: 0x0001, 0x2739: 0x0001, 0x273a: 0x0001, 0x273b: 0x0001,\n\t0x273c: 0x0001, 0x273d: 0x0001, 0x273e: 0x0001, 0x273f: 0x0001,\n\t// Block 0x9d, offset 0x2740\n\t0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001,\n\t0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001,\n\t0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001,\n\t0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001,\n\t0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001,\n\t0x275e: 0x0001, 0x275f: 0x000a, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001,\n\t0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001,\n\t0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001,\n\t0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001,\n\t0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001,\n\t0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001,\n\t// Block 0x9e, offset 0x2780\n\t0x2780: 0x0001, 0x2781: 0x000c, 0x2782: 0x000c, 0x2783: 0x000c, 0x2784: 0x0001, 0x2785: 0x000c,\n\t0x2786: 0x000c, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,\n\t0x278c: 0x000c, 0x278d: 0x000c, 0x278e: 0x000c, 0x278f: 0x000c, 0x2790: 0x0001, 0x2791: 0x0001,\n\t0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,\n\t0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,\n\t0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,\n\t0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,\n\t0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,\n\t0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,\n\t0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x000c, 0x27b9: 0x000c, 0x27ba: 0x000c, 0x27bb: 0x0001,\n\t0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x000c,\n\t// Block 0x9f, offset 0x27c0\n\t0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001,\n\t0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,\n\t0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001,\n\t0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,\n\t0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,\n\t0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,\n\t0x27e4: 0x0001, 0x27e5: 0x000c, 0x27e6: 0x000c, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,\n\t0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,\n\t0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,\n\t0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001,\n\t0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001,\n\t// Block 0xa0, offset 0x2800\n\t0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001,\n\t0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,\n\t0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001,\n\t0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,\n\t0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,\n\t0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,\n\t0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,\n\t0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,\n\t0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,\n\t0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x000a, 0x283a: 0x000a, 0x283b: 0x000a,\n\t0x283c: 0x000a, 0x283d: 0x000a, 0x283e: 0x000a, 0x283f: 0x000a,\n\t// Block 0xa1, offset 0x2840\n\t0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001,\n\t0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001,\n\t0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001,\n\t0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001,\n\t0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001,\n\t0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0005, 0x2861: 0x0005, 0x2862: 0x0005, 0x2863: 0x0005,\n\t0x2864: 0x0005, 0x2865: 0x0005, 0x2866: 0x0005, 0x2867: 0x0005, 0x2868: 0x0005, 0x2869: 0x0005,\n\t0x286a: 0x0005, 0x286b: 0x0005, 0x286c: 0x0005, 0x286d: 0x0005, 0x286e: 0x0005, 0x286f: 0x0005,\n\t0x2870: 0x0005, 0x2871: 0x0005, 0x2872: 0x0005, 0x2873: 0x0005, 0x2874: 0x0005, 0x2875: 0x0005,\n\t0x2876: 0x0005, 0x2877: 0x0005, 0x2878: 0x0005, 0x2879: 0x0005, 0x287a: 0x0005, 0x287b: 0x0005,\n\t0x287c: 0x0005, 0x287d: 0x0005, 0x287e: 0x0005, 0x287f: 0x0001,\n\t// Block 0xa2, offset 0x2880\n\t0x2881: 0x000c,\n\t0x28b8: 0x000c, 0x28b9: 0x000c, 0x28ba: 0x000c, 0x28bb: 0x000c,\n\t0x28bc: 0x000c, 0x28bd: 0x000c, 0x28be: 0x000c, 0x28bf: 0x000c,\n\t// Block 0xa3, offset 0x28c0\n\t0x28c0: 0x000c, 0x28c1: 0x000c, 0x28c2: 0x000c, 0x28c3: 0x000c, 0x28c4: 0x000c, 0x28c5: 0x000c,\n\t0x28c6: 0x000c,\n\t0x28d2: 0x000a, 0x28d3: 0x000a, 0x28d4: 0x000a, 0x28d5: 0x000a, 0x28d6: 0x000a, 0x28d7: 0x000a,\n\t0x28d8: 0x000a, 0x28d9: 0x000a, 0x28da: 0x000a, 0x28db: 0x000a, 0x28dc: 0x000a, 0x28dd: 0x000a,\n\t0x28de: 0x000a, 0x28df: 0x000a, 0x28e0: 0x000a, 0x28e1: 0x000a, 0x28e2: 0x000a, 0x28e3: 0x000a,\n\t0x28e4: 0x000a, 0x28e5: 0x000a,\n\t0x28ff: 0x000c,\n\t// Block 0xa4, offset 0x2900\n\t0x2900: 0x000c, 0x2901: 0x000c,\n\t0x2933: 0x000c, 0x2934: 0x000c, 0x2935: 0x000c,\n\t0x2936: 0x000c, 0x2939: 0x000c, 0x293a: 0x000c,\n\t// Block 0xa5, offset 0x2940\n\t0x2940: 0x000c, 0x2941: 0x000c, 0x2942: 0x000c,\n\t0x2967: 0x000c, 0x2968: 0x000c, 0x2969: 0x000c,\n\t0x296a: 0x000c, 0x296b: 0x000c, 0x296d: 0x000c, 0x296e: 0x000c, 0x296f: 0x000c,\n\t0x2970: 0x000c, 0x2971: 0x000c, 0x2972: 0x000c, 0x2973: 0x000c, 0x2974: 0x000c,\n\t// Block 0xa6, offset 0x2980\n\t0x29b3: 0x000c,\n\t// Block 0xa7, offset 0x29c0\n\t0x29c0: 0x000c, 0x29c1: 0x000c,\n\t0x29f6: 0x000c, 0x29f7: 0x000c, 0x29f8: 0x000c, 0x29f9: 0x000c, 0x29fa: 0x000c, 0x29fb: 0x000c,\n\t0x29fc: 0x000c, 0x29fd: 0x000c, 0x29fe: 0x000c,\n\t// Block 0xa8, offset 0x2a00\n\t0x2a0a: 0x000c, 0x2a0b: 0x000c,\n\t0x2a0c: 0x000c,\n\t// Block 0xa9, offset 0x2a40\n\t0x2a6f: 0x000c,\n\t0x2a70: 0x000c, 0x2a71: 0x000c, 0x2a74: 0x000c,\n\t0x2a76: 0x000c, 0x2a77: 0x000c,\n\t0x2a7e: 0x000c,\n\t// Block 0xaa, offset 0x2a80\n\t0x2a9f: 0x000c, 0x2aa3: 0x000c,\n\t0x2aa4: 0x000c, 0x2aa5: 0x000c, 0x2aa6: 0x000c, 0x2aa7: 0x000c, 0x2aa8: 0x000c, 0x2aa9: 0x000c,\n\t0x2aaa: 0x000c,\n\t// Block 0xab, offset 0x2ac0\n\t0x2ac0: 0x000c, 0x2ac1: 0x000c,\n\t0x2afc: 0x000c,\n\t// Block 0xac, offset 0x2b00\n\t0x2b00: 0x000c,\n\t0x2b26: 0x000c, 0x2b27: 0x000c, 0x2b28: 0x000c, 0x2b29: 0x000c,\n\t0x2b2a: 0x000c, 0x2b2b: 0x000c, 0x2b2c: 0x000c,\n\t0x2b30: 0x000c, 0x2b31: 0x000c, 0x2b32: 0x000c, 0x2b33: 0x000c, 0x2b34: 0x000c,\n\t// Block 0xad, offset 0x2b40\n\t0x2b78: 0x000c, 0x2b79: 0x000c, 0x2b7a: 0x000c, 0x2b7b: 0x000c,\n\t0x2b7c: 0x000c, 0x2b7d: 0x000c, 0x2b7e: 0x000c, 0x2b7f: 0x000c,\n\t// Block 0xae, offset 0x2b80\n\t0x2b82: 0x000c, 0x2b83: 0x000c, 0x2b84: 0x000c,\n\t0x2b86: 0x000c,\n\t// Block 0xaf, offset 0x2bc0\n\t0x2bf3: 0x000c, 0x2bf4: 0x000c, 0x2bf5: 0x000c,\n\t0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bfa: 0x000c,\n\t0x2bff: 0x000c,\n\t// Block 0xb0, offset 0x2c00\n\t0x2c00: 0x000c, 0x2c02: 0x000c, 0x2c03: 0x000c,\n\t// Block 0xb1, offset 0x2c40\n\t0x2c72: 0x000c, 0x2c73: 0x000c, 0x2c74: 0x000c, 0x2c75: 0x000c,\n\t0x2c7c: 0x000c, 0x2c7d: 0x000c, 0x2c7f: 0x000c,\n\t// Block 0xb2, offset 0x2c80\n\t0x2c80: 0x000c,\n\t0x2c9c: 0x000c, 0x2c9d: 0x000c,\n\t// Block 0xb3, offset 0x2cc0\n\t0x2cf3: 0x000c, 0x2cf4: 0x000c, 0x2cf5: 0x000c,\n\t0x2cf6: 0x000c, 0x2cf7: 0x000c, 0x2cf8: 0x000c, 0x2cf9: 0x000c, 0x2cfa: 0x000c,\n\t0x2cfd: 0x000c, 0x2cff: 0x000c,\n\t// Block 0xb4, offset 0x2d00\n\t0x2d00: 0x000c,\n\t0x2d20: 0x000a, 0x2d21: 0x000a, 0x2d22: 0x000a, 0x2d23: 0x000a,\n\t0x2d24: 0x000a, 0x2d25: 0x000a, 0x2d26: 0x000a, 0x2d27: 0x000a, 0x2d28: 0x000a, 0x2d29: 0x000a,\n\t0x2d2a: 0x000a, 0x2d2b: 0x000a, 0x2d2c: 0x000a,\n\t// Block 0xb5, offset 0x2d40\n\t0x2d6b: 0x000c, 0x2d6d: 0x000c,\n\t0x2d70: 0x000c, 0x2d71: 0x000c, 0x2d72: 0x000c, 0x2d73: 0x000c, 0x2d74: 0x000c, 0x2d75: 0x000c,\n\t0x2d77: 0x000c,\n\t// Block 0xb6, offset 0x2d80\n\t0x2d9d: 0x000c,\n\t0x2d9e: 0x000c, 0x2d9f: 0x000c, 0x2da2: 0x000c, 0x2da3: 0x000c,\n\t0x2da4: 0x000c, 0x2da5: 0x000c, 0x2da7: 0x000c, 0x2da8: 0x000c, 0x2da9: 0x000c,\n\t0x2daa: 0x000c, 0x2dab: 0x000c,\n\t// Block 0xb7, offset 0x2dc0\n\t0x2dc1: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, 0x2dc4: 0x000c, 0x2dc5: 0x000c,\n\t0x2dc6: 0x000c, 0x2dc9: 0x000c, 0x2dca: 0x000c,\n\t0x2df3: 0x000c, 0x2df4: 0x000c, 0x2df5: 0x000c,\n\t0x2df6: 0x000c, 0x2df7: 0x000c, 0x2df8: 0x000c, 0x2dfb: 0x000c,\n\t0x2dfc: 0x000c, 0x2dfd: 0x000c, 0x2dfe: 0x000c,\n\t// Block 0xb8, offset 0x2e00\n\t0x2e07: 0x000c,\n\t0x2e11: 0x000c,\n\t0x2e12: 0x000c, 0x2e13: 0x000c, 0x2e14: 0x000c, 0x2e15: 0x000c, 0x2e16: 0x000c,\n\t0x2e19: 0x000c, 0x2e1a: 0x000c, 0x2e1b: 0x000c,\n\t// Block 0xb9, offset 0x2e40\n\t0x2e4a: 0x000c, 0x2e4b: 0x000c,\n\t0x2e4c: 0x000c, 0x2e4d: 0x000c, 0x2e4e: 0x000c, 0x2e4f: 0x000c, 0x2e50: 0x000c, 0x2e51: 0x000c,\n\t0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c,\n\t0x2e58: 0x000c, 0x2e59: 0x000c,\n\t// Block 0xba, offset 0x2e80\n\t0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c,\n\t0x2eb6: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, 0x2ebb: 0x000c,\n\t0x2ebc: 0x000c, 0x2ebd: 0x000c,\n\t// Block 0xbb, offset 0x2ec0\n\t0x2ed2: 0x000c, 0x2ed3: 0x000c, 0x2ed4: 0x000c, 0x2ed5: 0x000c, 0x2ed6: 0x000c, 0x2ed7: 0x000c,\n\t0x2ed8: 0x000c, 0x2ed9: 0x000c, 0x2eda: 0x000c, 0x2edb: 0x000c, 0x2edc: 0x000c, 0x2edd: 0x000c,\n\t0x2ede: 0x000c, 0x2edf: 0x000c, 0x2ee0: 0x000c, 0x2ee1: 0x000c, 0x2ee2: 0x000c, 0x2ee3: 0x000c,\n\t0x2ee4: 0x000c, 0x2ee5: 0x000c, 0x2ee6: 0x000c, 0x2ee7: 0x000c,\n\t0x2eea: 0x000c, 0x2eeb: 0x000c, 0x2eec: 0x000c, 0x2eed: 0x000c, 0x2eee: 0x000c, 0x2eef: 0x000c,\n\t0x2ef0: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef5: 0x000c,\n\t0x2ef6: 0x000c,\n\t// Block 0xbc, offset 0x2f00\n\t0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c,\n\t0x2f36: 0x000c, 0x2f3a: 0x000c,\n\t0x2f3c: 0x000c, 0x2f3d: 0x000c, 0x2f3f: 0x000c,\n\t// Block 0xbd, offset 0x2f40\n\t0x2f40: 0x000c, 0x2f41: 0x000c, 0x2f42: 0x000c, 0x2f43: 0x000c, 0x2f44: 0x000c, 0x2f45: 0x000c,\n\t0x2f47: 0x000c,\n\t// Block 0xbe, offset 0x2f80\n\t0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c,\n\t// Block 0xbf, offset 0x2fc0\n\t0x2ff0: 0x000c, 0x2ff1: 0x000c, 0x2ff2: 0x000c, 0x2ff3: 0x000c, 0x2ff4: 0x000c, 0x2ff5: 0x000c,\n\t0x2ff6: 0x000c,\n\t// Block 0xc0, offset 0x3000\n\t0x300f: 0x000c, 0x3010: 0x000c, 0x3011: 0x000c,\n\t0x3012: 0x000c,\n\t// Block 0xc1, offset 0x3040\n\t0x305d: 0x000c,\n\t0x305e: 0x000c, 0x3060: 0x000b, 0x3061: 0x000b, 0x3062: 0x000b, 0x3063: 0x000b,\n\t// Block 0xc2, offset 0x3080\n\t0x30a7: 0x000c, 0x30a8: 0x000c, 0x30a9: 0x000c,\n\t0x30b3: 0x000b, 0x30b4: 0x000b, 0x30b5: 0x000b,\n\t0x30b6: 0x000b, 0x30b7: 0x000b, 0x30b8: 0x000b, 0x30b9: 0x000b, 0x30ba: 0x000b, 0x30bb: 0x000c,\n\t0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, 0x30bf: 0x000c,\n\t// Block 0xc3, offset 0x30c0\n\t0x30c0: 0x000c, 0x30c1: 0x000c, 0x30c2: 0x000c, 0x30c5: 0x000c,\n\t0x30c6: 0x000c, 0x30c7: 0x000c, 0x30c8: 0x000c, 0x30c9: 0x000c, 0x30ca: 0x000c, 0x30cb: 0x000c,\n\t0x30ea: 0x000c, 0x30eb: 0x000c, 0x30ec: 0x000c, 0x30ed: 0x000c,\n\t// Block 0xc4, offset 0x3100\n\t0x3100: 0x000a, 0x3101: 0x000a, 0x3102: 0x000c, 0x3103: 0x000c, 0x3104: 0x000c, 0x3105: 0x000a,\n\t// Block 0xc5, offset 0x3140\n\t0x3140: 0x000a, 0x3141: 0x000a, 0x3142: 0x000a, 0x3143: 0x000a, 0x3144: 0x000a, 0x3145: 0x000a,\n\t0x3146: 0x000a, 0x3147: 0x000a, 0x3148: 0x000a, 0x3149: 0x000a, 0x314a: 0x000a, 0x314b: 0x000a,\n\t0x314c: 0x000a, 0x314d: 0x000a, 0x314e: 0x000a, 0x314f: 0x000a, 0x3150: 0x000a, 0x3151: 0x000a,\n\t0x3152: 0x000a, 0x3153: 0x000a, 0x3154: 0x000a, 0x3155: 0x000a, 0x3156: 0x000a,\n\t// Block 0xc6, offset 0x3180\n\t0x319b: 0x000a,\n\t// Block 0xc7, offset 0x31c0\n\t0x31d5: 0x000a,\n\t// Block 0xc8, offset 0x3200\n\t0x320f: 0x000a,\n\t// Block 0xc9, offset 0x3240\n\t0x3249: 0x000a,\n\t// Block 0xca, offset 0x3280\n\t0x3283: 0x000a,\n\t0x328e: 0x0002, 0x328f: 0x0002, 0x3290: 0x0002, 0x3291: 0x0002,\n\t0x3292: 0x0002, 0x3293: 0x0002, 0x3294: 0x0002, 0x3295: 0x0002, 0x3296: 0x0002, 0x3297: 0x0002,\n\t0x3298: 0x0002, 0x3299: 0x0002, 0x329a: 0x0002, 0x329b: 0x0002, 0x329c: 0x0002, 0x329d: 0x0002,\n\t0x329e: 0x0002, 0x329f: 0x0002, 0x32a0: 0x0002, 0x32a1: 0x0002, 0x32a2: 0x0002, 0x32a3: 0x0002,\n\t0x32a4: 0x0002, 0x32a5: 0x0002, 0x32a6: 0x0002, 0x32a7: 0x0002, 0x32a8: 0x0002, 0x32a9: 0x0002,\n\t0x32aa: 0x0002, 0x32ab: 0x0002, 0x32ac: 0x0002, 0x32ad: 0x0002, 0x32ae: 0x0002, 0x32af: 0x0002,\n\t0x32b0: 0x0002, 0x32b1: 0x0002, 0x32b2: 0x0002, 0x32b3: 0x0002, 0x32b4: 0x0002, 0x32b5: 0x0002,\n\t0x32b6: 0x0002, 0x32b7: 0x0002, 0x32b8: 0x0002, 0x32b9: 0x0002, 0x32ba: 0x0002, 0x32bb: 0x0002,\n\t0x32bc: 0x0002, 0x32bd: 0x0002, 0x32be: 0x0002, 0x32bf: 0x0002,\n\t// Block 0xcb, offset 0x32c0\n\t0x32c0: 0x000c, 0x32c1: 0x000c, 0x32c2: 0x000c, 0x32c3: 0x000c, 0x32c4: 0x000c, 0x32c5: 0x000c,\n\t0x32c6: 0x000c, 0x32c7: 0x000c, 0x32c8: 0x000c, 0x32c9: 0x000c, 0x32ca: 0x000c, 0x32cb: 0x000c,\n\t0x32cc: 0x000c, 0x32cd: 0x000c, 0x32ce: 0x000c, 0x32cf: 0x000c, 0x32d0: 0x000c, 0x32d1: 0x000c,\n\t0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x000c,\n\t0x32d8: 0x000c, 0x32d9: 0x000c, 0x32da: 0x000c, 0x32db: 0x000c, 0x32dc: 0x000c, 0x32dd: 0x000c,\n\t0x32de: 0x000c, 0x32df: 0x000c, 0x32e0: 0x000c, 0x32e1: 0x000c, 0x32e2: 0x000c, 0x32e3: 0x000c,\n\t0x32e4: 0x000c, 0x32e5: 0x000c, 0x32e6: 0x000c, 0x32e7: 0x000c, 0x32e8: 0x000c, 0x32e9: 0x000c,\n\t0x32ea: 0x000c, 0x32eb: 0x000c, 0x32ec: 0x000c, 0x32ed: 0x000c, 0x32ee: 0x000c, 0x32ef: 0x000c,\n\t0x32f0: 0x000c, 0x32f1: 0x000c, 0x32f2: 0x000c, 0x32f3: 0x000c, 0x32f4: 0x000c, 0x32f5: 0x000c,\n\t0x32f6: 0x000c, 0x32fb: 0x000c,\n\t0x32fc: 0x000c, 0x32fd: 0x000c, 0x32fe: 0x000c, 0x32ff: 0x000c,\n\t// Block 0xcc, offset 0x3300\n\t0x3300: 0x000c, 0x3301: 0x000c, 0x3302: 0x000c, 0x3303: 0x000c, 0x3304: 0x000c, 0x3305: 0x000c,\n\t0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x000c,\n\t0x330c: 0x000c, 0x330d: 0x000c, 0x330e: 0x000c, 0x330f: 0x000c, 0x3310: 0x000c, 0x3311: 0x000c,\n\t0x3312: 0x000c, 0x3313: 0x000c, 0x3314: 0x000c, 0x3315: 0x000c, 0x3316: 0x000c, 0x3317: 0x000c,\n\t0x3318: 0x000c, 0x3319: 0x000c, 0x331a: 0x000c, 0x331b: 0x000c, 0x331c: 0x000c, 0x331d: 0x000c,\n\t0x331e: 0x000c, 0x331f: 0x000c, 0x3320: 0x000c, 0x3321: 0x000c, 0x3322: 0x000c, 0x3323: 0x000c,\n\t0x3324: 0x000c, 0x3325: 0x000c, 0x3326: 0x000c, 0x3327: 0x000c, 0x3328: 0x000c, 0x3329: 0x000c,\n\t0x332a: 0x000c, 0x332b: 0x000c, 0x332c: 0x000c,\n\t0x3335: 0x000c,\n\t// Block 0xcd, offset 0x3340\n\t0x3344: 0x000c,\n\t0x335b: 0x000c, 0x335c: 0x000c, 0x335d: 0x000c,\n\t0x335e: 0x000c, 0x335f: 0x000c, 0x3361: 0x000c, 0x3362: 0x000c, 0x3363: 0x000c,\n\t0x3364: 0x000c, 0x3365: 0x000c, 0x3366: 0x000c, 0x3367: 0x000c, 0x3368: 0x000c, 0x3369: 0x000c,\n\t0x336a: 0x000c, 0x336b: 0x000c, 0x336c: 0x000c, 0x336d: 0x000c, 0x336e: 0x000c, 0x336f: 0x000c,\n\t// Block 0xce, offset 0x3380\n\t0x3380: 0x000c, 0x3381: 0x000c, 0x3382: 0x000c, 0x3383: 0x000c, 0x3384: 0x000c, 0x3385: 0x000c,\n\t0x3386: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c,\n\t0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c,\n\t0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, 0x3396: 0x000c, 0x3397: 0x000c,\n\t0x3398: 0x000c, 0x339b: 0x000c, 0x339c: 0x000c, 0x339d: 0x000c,\n\t0x339e: 0x000c, 0x339f: 0x000c, 0x33a0: 0x000c, 0x33a1: 0x000c, 0x33a3: 0x000c,\n\t0x33a4: 0x000c, 0x33a6: 0x000c, 0x33a7: 0x000c, 0x33a8: 0x000c, 0x33a9: 0x000c,\n\t0x33aa: 0x000c,\n\t// Block 0xcf, offset 0x33c0\n\t0x33c0: 0x0001, 0x33c1: 0x0001, 0x33c2: 0x0001, 0x33c3: 0x0001, 0x33c4: 0x0001, 0x33c5: 0x0001,\n\t0x33c6: 0x0001, 0x33c7: 0x0001, 0x33c8: 0x0001, 0x33c9: 0x0001, 0x33ca: 0x0001, 0x33cb: 0x0001,\n\t0x33cc: 0x0001, 0x33cd: 0x0001, 0x33ce: 0x0001, 0x33cf: 0x0001, 0x33d0: 0x000c, 0x33d1: 0x000c,\n\t0x33d2: 0x000c, 0x33d3: 0x000c, 0x33d4: 0x000c, 0x33d5: 0x000c, 0x33d6: 0x000c, 0x33d7: 0x0001,\n\t0x33d8: 0x0001, 0x33d9: 0x0001, 0x33da: 0x0001, 0x33db: 0x0001, 0x33dc: 0x0001, 0x33dd: 0x0001,\n\t0x33de: 0x0001, 0x33df: 0x0001, 0x33e0: 0x0001, 0x33e1: 0x0001, 0x33e2: 0x0001, 0x33e3: 0x0001,\n\t0x33e4: 0x0001, 0x33e5: 0x0001, 0x33e6: 0x0001, 0x33e7: 0x0001, 0x33e8: 0x0001, 0x33e9: 0x0001,\n\t0x33ea: 0x0001, 0x33eb: 0x0001, 0x33ec: 0x0001, 0x33ed: 0x0001, 0x33ee: 0x0001, 0x33ef: 0x0001,\n\t0x33f0: 0x0001, 0x33f1: 0x0001, 0x33f2: 0x0001, 0x33f3: 0x0001, 0x33f4: 0x0001, 0x33f5: 0x0001,\n\t0x33f6: 0x0001, 0x33f7: 0x0001, 0x33f8: 0x0001, 0x33f9: 0x0001, 0x33fa: 0x0001, 0x33fb: 0x0001,\n\t0x33fc: 0x0001, 0x33fd: 0x0001, 0x33fe: 0x0001, 0x33ff: 0x0001,\n\t// Block 0xd0, offset 0x3400\n\t0x3400: 0x0001, 0x3401: 0x0001, 0x3402: 0x0001, 0x3403: 0x0001, 0x3404: 0x000c, 0x3405: 0x000c,\n\t0x3406: 0x000c, 0x3407: 0x000c, 0x3408: 0x000c, 0x3409: 0x000c, 0x340a: 0x000c, 0x340b: 0x0001,\n\t0x340c: 0x0001, 0x340d: 0x0001, 0x340e: 0x0001, 0x340f: 0x0001, 0x3410: 0x0001, 0x3411: 0x0001,\n\t0x3412: 0x0001, 0x3413: 0x0001, 0x3414: 0x0001, 0x3415: 0x0001, 0x3416: 0x0001, 0x3417: 0x0001,\n\t0x3418: 0x0001, 0x3419: 0x0001, 0x341a: 0x0001, 0x341b: 0x0001, 0x341c: 0x0001, 0x341d: 0x0001,\n\t0x341e: 0x0001, 0x341f: 0x0001, 0x3420: 0x0001, 0x3421: 0x0001, 0x3422: 0x0001, 0x3423: 0x0001,\n\t0x3424: 0x0001, 0x3425: 0x0001, 0x3426: 0x0001, 0x3427: 0x0001, 0x3428: 0x0001, 0x3429: 0x0001,\n\t0x342a: 0x0001, 0x342b: 0x0001, 0x342c: 0x0001, 0x342d: 0x0001, 0x342e: 0x0001, 0x342f: 0x0001,\n\t0x3430: 0x0001, 0x3431: 0x0001, 0x3432: 0x0001, 0x3433: 0x0001, 0x3434: 0x0001, 0x3435: 0x0001,\n\t0x3436: 0x0001, 0x3437: 0x0001, 0x3438: 0x0001, 0x3439: 0x0001, 0x343a: 0x0001, 0x343b: 0x0001,\n\t0x343c: 0x0001, 0x343d: 0x0001, 0x343e: 0x0001, 0x343f: 0x0001,\n\t// Block 0xd1, offset 0x3440\n\t0x3440: 0x000d, 0x3441: 0x000d, 0x3442: 0x000d, 0x3443: 0x000d, 0x3444: 0x000d, 0x3445: 0x000d,\n\t0x3446: 0x000d, 0x3447: 0x000d, 0x3448: 0x000d, 0x3449: 0x000d, 0x344a: 0x000d, 0x344b: 0x000d,\n\t0x344c: 0x000d, 0x344d: 0x000d, 0x344e: 0x000d, 0x344f: 0x000d, 0x3450: 0x000d, 0x3451: 0x000d,\n\t0x3452: 0x000d, 0x3453: 0x000d, 0x3454: 0x000d, 0x3455: 0x000d, 0x3456: 0x000d, 0x3457: 0x000d,\n\t0x3458: 0x000d, 0x3459: 0x000d, 0x345a: 0x000d, 0x345b: 0x000d, 0x345c: 0x000d, 0x345d: 0x000d,\n\t0x345e: 0x000d, 0x345f: 0x000d, 0x3460: 0x000d, 0x3461: 0x000d, 0x3462: 0x000d, 0x3463: 0x000d,\n\t0x3464: 0x000d, 0x3465: 0x000d, 0x3466: 0x000d, 0x3467: 0x000d, 0x3468: 0x000d, 0x3469: 0x000d,\n\t0x346a: 0x000d, 0x346b: 0x000d, 0x346c: 0x000d, 0x346d: 0x000d, 0x346e: 0x000d, 0x346f: 0x000d,\n\t0x3470: 0x000a, 0x3471: 0x000a, 0x3472: 0x000d, 0x3473: 0x000d, 0x3474: 0x000d, 0x3475: 0x000d,\n\t0x3476: 0x000d, 0x3477: 0x000d, 0x3478: 0x000d, 0x3479: 0x000d, 0x347a: 0x000d, 0x347b: 0x000d,\n\t0x347c: 0x000d, 0x347d: 0x000d, 0x347e: 0x000d, 0x347f: 0x000d,\n\t// Block 0xd2, offset 0x3480\n\t0x3480: 0x000a, 0x3481: 0x000a, 0x3482: 0x000a, 0x3483: 0x000a, 0x3484: 0x000a, 0x3485: 0x000a,\n\t0x3486: 0x000a, 0x3487: 0x000a, 0x3488: 0x000a, 0x3489: 0x000a, 0x348a: 0x000a, 0x348b: 0x000a,\n\t0x348c: 0x000a, 0x348d: 0x000a, 0x348e: 0x000a, 0x348f: 0x000a, 0x3490: 0x000a, 0x3491: 0x000a,\n\t0x3492: 0x000a, 0x3493: 0x000a, 0x3494: 0x000a, 0x3495: 0x000a, 0x3496: 0x000a, 0x3497: 0x000a,\n\t0x3498: 0x000a, 0x3499: 0x000a, 0x349a: 0x000a, 0x349b: 0x000a, 0x349c: 0x000a, 0x349d: 0x000a,\n\t0x349e: 0x000a, 0x349f: 0x000a, 0x34a0: 0x000a, 0x34a1: 0x000a, 0x34a2: 0x000a, 0x34a3: 0x000a,\n\t0x34a4: 0x000a, 0x34a5: 0x000a, 0x34a6: 0x000a, 0x34a7: 0x000a, 0x34a8: 0x000a, 0x34a9: 0x000a,\n\t0x34aa: 0x000a, 0x34ab: 0x000a,\n\t0x34b0: 0x000a, 0x34b1: 0x000a, 0x34b2: 0x000a, 0x34b3: 0x000a, 0x34b4: 0x000a, 0x34b5: 0x000a,\n\t0x34b6: 0x000a, 0x34b7: 0x000a, 0x34b8: 0x000a, 0x34b9: 0x000a, 0x34ba: 0x000a, 0x34bb: 0x000a,\n\t0x34bc: 0x000a, 0x34bd: 0x000a, 0x34be: 0x000a, 0x34bf: 0x000a,\n\t// Block 0xd3, offset 0x34c0\n\t0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a,\n\t0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a,\n\t0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a,\n\t0x34d2: 0x000a, 0x34d3: 0x000a,\n\t0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a,\n\t0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a,\n\t0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a, 0x34ed: 0x000a, 0x34ee: 0x000a,\n\t0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a,\n\t0x34f6: 0x000a, 0x34f7: 0x000a, 0x34f8: 0x000a, 0x34f9: 0x000a, 0x34fa: 0x000a, 0x34fb: 0x000a,\n\t0x34fc: 0x000a, 0x34fd: 0x000a, 0x34fe: 0x000a, 0x34ff: 0x000a,\n\t// Block 0xd4, offset 0x3500\n\t0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a,\n\t0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a,\n\t0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3511: 0x000a,\n\t0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a, 0x3515: 0x000a, 0x3516: 0x000a, 0x3517: 0x000a,\n\t0x3518: 0x000a, 0x3519: 0x000a, 0x351a: 0x000a, 0x351b: 0x000a, 0x351c: 0x000a, 0x351d: 0x000a,\n\t0x351e: 0x000a, 0x351f: 0x000a, 0x3520: 0x000a, 0x3521: 0x000a, 0x3522: 0x000a, 0x3523: 0x000a,\n\t0x3524: 0x000a, 0x3525: 0x000a, 0x3526: 0x000a, 0x3527: 0x000a, 0x3528: 0x000a, 0x3529: 0x000a,\n\t0x352a: 0x000a, 0x352b: 0x000a, 0x352c: 0x000a, 0x352d: 0x000a, 0x352e: 0x000a, 0x352f: 0x000a,\n\t0x3530: 0x000a, 0x3531: 0x000a, 0x3532: 0x000a, 0x3533: 0x000a, 0x3534: 0x000a, 0x3535: 0x000a,\n\t// Block 0xd5, offset 0x3540\n\t0x3540: 0x0002, 0x3541: 0x0002, 0x3542: 0x0002, 0x3543: 0x0002, 0x3544: 0x0002, 0x3545: 0x0002,\n\t0x3546: 0x0002, 0x3547: 0x0002, 0x3548: 0x0002, 0x3549: 0x0002, 0x354a: 0x0002, 0x354b: 0x000a,\n\t0x354c: 0x000a,\n\t// Block 0xd6, offset 0x3580\n\t0x35aa: 0x000a, 0x35ab: 0x000a,\n\t// Block 0xd7, offset 0x35c0\n\t0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a,\n\t0x35e4: 0x000a, 0x35e5: 0x000a,\n\t// Block 0xd8, offset 0x3600\n\t0x3600: 0x000a, 0x3601: 0x000a, 0x3602: 0x000a, 0x3603: 0x000a, 0x3604: 0x000a, 0x3605: 0x000a,\n\t0x3606: 0x000a, 0x3607: 0x000a, 0x3608: 0x000a, 0x3609: 0x000a, 0x360a: 0x000a, 0x360b: 0x000a,\n\t0x360c: 0x000a, 0x360d: 0x000a, 0x360e: 0x000a, 0x360f: 0x000a, 0x3610: 0x000a, 0x3611: 0x000a,\n\t0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a,\n\t0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a,\n\t0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a, 0x3628: 0x000a, 0x3629: 0x000a,\n\t0x362a: 0x000a, 0x362b: 0x000a, 0x362c: 0x000a,\n\t0x3630: 0x000a, 0x3631: 0x000a, 0x3632: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a,\n\t0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a,\n\t// Block 0xd9, offset 0x3640\n\t0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a,\n\t0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a,\n\t0x364c: 0x000a, 0x364d: 0x000a, 0x364e: 0x000a, 0x364f: 0x000a, 0x3650: 0x000a, 0x3651: 0x000a,\n\t0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a,\n\t// Block 0xda, offset 0x3680\n\t0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a,\n\t0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a,\n\t0x3690: 0x000a, 0x3691: 0x000a,\n\t0x3692: 0x000a, 0x3693: 0x000a, 0x3694: 0x000a, 0x3695: 0x000a, 0x3696: 0x000a, 0x3697: 0x000a,\n\t0x3698: 0x000a, 0x3699: 0x000a, 0x369a: 0x000a, 0x369b: 0x000a, 0x369c: 0x000a, 0x369d: 0x000a,\n\t0x369e: 0x000a, 0x369f: 0x000a, 0x36a0: 0x000a, 0x36a1: 0x000a, 0x36a2: 0x000a, 0x36a3: 0x000a,\n\t0x36a4: 0x000a, 0x36a5: 0x000a, 0x36a6: 0x000a, 0x36a7: 0x000a, 0x36a8: 0x000a, 0x36a9: 0x000a,\n\t0x36aa: 0x000a, 0x36ab: 0x000a, 0x36ac: 0x000a, 0x36ad: 0x000a, 0x36ae: 0x000a, 0x36af: 0x000a,\n\t0x36b0: 0x000a, 0x36b1: 0x000a, 0x36b2: 0x000a, 0x36b3: 0x000a, 0x36b4: 0x000a, 0x36b5: 0x000a,\n\t0x36b6: 0x000a, 0x36b7: 0x000a, 0x36b8: 0x000a, 0x36b9: 0x000a, 0x36ba: 0x000a, 0x36bb: 0x000a,\n\t0x36bc: 0x000a, 0x36bd: 0x000a, 0x36be: 0x000a, 0x36bf: 0x000a,\n\t// Block 0xdb, offset 0x36c0\n\t0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a,\n\t0x36c6: 0x000a, 0x36c7: 0x000a,\n\t0x36d0: 0x000a, 0x36d1: 0x000a,\n\t0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, 0x36d7: 0x000a,\n\t0x36d8: 0x000a, 0x36d9: 0x000a,\n\t0x36e0: 0x000a, 0x36e1: 0x000a, 0x36e2: 0x000a, 0x36e3: 0x000a,\n\t0x36e4: 0x000a, 0x36e5: 0x000a, 0x36e6: 0x000a, 0x36e7: 0x000a, 0x36e8: 0x000a, 0x36e9: 0x000a,\n\t0x36ea: 0x000a, 0x36eb: 0x000a, 0x36ec: 0x000a, 0x36ed: 0x000a, 0x36ee: 0x000a, 0x36ef: 0x000a,\n\t0x36f0: 0x000a, 0x36f1: 0x000a, 0x36f2: 0x000a, 0x36f3: 0x000a, 0x36f4: 0x000a, 0x36f5: 0x000a,\n\t0x36f6: 0x000a, 0x36f7: 0x000a, 0x36f8: 0x000a, 0x36f9: 0x000a, 0x36fa: 0x000a, 0x36fb: 0x000a,\n\t0x36fc: 0x000a, 0x36fd: 0x000a, 0x36fe: 0x000a, 0x36ff: 0x000a,\n\t// Block 0xdc, offset 0x3700\n\t0x3700: 0x000a, 0x3701: 0x000a, 0x3702: 0x000a, 0x3703: 0x000a, 0x3704: 0x000a, 0x3705: 0x000a,\n\t0x3706: 0x000a, 0x3707: 0x000a,\n\t0x3710: 0x000a, 0x3711: 0x000a,\n\t0x3712: 0x000a, 0x3713: 0x000a, 0x3714: 0x000a, 0x3715: 0x000a, 0x3716: 0x000a, 0x3717: 0x000a,\n\t0x3718: 0x000a, 0x3719: 0x000a, 0x371a: 0x000a, 0x371b: 0x000a, 0x371c: 0x000a, 0x371d: 0x000a,\n\t0x371e: 0x000a, 0x371f: 0x000a, 0x3720: 0x000a, 0x3721: 0x000a, 0x3722: 0x000a, 0x3723: 0x000a,\n\t0x3724: 0x000a, 0x3725: 0x000a, 0x3726: 0x000a, 0x3727: 0x000a, 0x3728: 0x000a, 0x3729: 0x000a,\n\t0x372a: 0x000a, 0x372b: 0x000a, 0x372c: 0x000a, 0x372d: 0x000a,\n\t// Block 0xdd, offset 0x3740\n\t0x3740: 0x000a, 0x3741: 0x000a, 0x3742: 0x000a, 0x3743: 0x000a, 0x3744: 0x000a, 0x3745: 0x000a,\n\t0x3746: 0x000a, 0x3747: 0x000a, 0x3748: 0x000a, 0x3749: 0x000a, 0x374a: 0x000a, 0x374b: 0x000a,\n\t0x3750: 0x000a, 0x3751: 0x000a,\n\t0x3752: 0x000a, 0x3753: 0x000a, 0x3754: 0x000a, 0x3755: 0x000a, 0x3756: 0x000a, 0x3757: 0x000a,\n\t0x3758: 0x000a, 0x3759: 0x000a, 0x375a: 0x000a, 0x375b: 0x000a, 0x375c: 0x000a, 0x375d: 0x000a,\n\t0x375e: 0x000a, 0x375f: 0x000a, 0x3760: 0x000a, 0x3761: 0x000a, 0x3762: 0x000a, 0x3763: 0x000a,\n\t0x3764: 0x000a, 0x3765: 0x000a, 0x3766: 0x000a, 0x3767: 0x000a, 0x3768: 0x000a, 0x3769: 0x000a,\n\t0x376a: 0x000a, 0x376b: 0x000a, 0x376c: 0x000a, 0x376d: 0x000a, 0x376e: 0x000a, 0x376f: 0x000a,\n\t0x3770: 0x000a, 0x3771: 0x000a, 0x3772: 0x000a, 0x3773: 0x000a, 0x3774: 0x000a, 0x3775: 0x000a,\n\t0x3776: 0x000a, 0x3777: 0x000a, 0x3778: 0x000a, 0x3779: 0x000a, 0x377a: 0x000a, 0x377b: 0x000a,\n\t0x377c: 0x000a, 0x377d: 0x000a, 0x377e: 0x000a,\n\t// Block 0xde, offset 0x3780\n\t0x3780: 0x000a, 0x3781: 0x000a, 0x3782: 0x000a, 0x3783: 0x000a, 0x3784: 0x000a, 0x3785: 0x000a,\n\t0x3786: 0x000a, 0x3787: 0x000a, 0x3788: 0x000a, 0x3789: 0x000a, 0x378a: 0x000a, 0x378b: 0x000a,\n\t0x378c: 0x000a, 0x3790: 0x000a, 0x3791: 0x000a,\n\t0x3792: 0x000a, 0x3793: 0x000a, 0x3794: 0x000a, 0x3795: 0x000a, 0x3796: 0x000a, 0x3797: 0x000a,\n\t0x3798: 0x000a, 0x3799: 0x000a, 0x379a: 0x000a, 0x379b: 0x000a, 0x379c: 0x000a, 0x379d: 0x000a,\n\t0x379e: 0x000a, 0x379f: 0x000a, 0x37a0: 0x000a, 0x37a1: 0x000a, 0x37a2: 0x000a, 0x37a3: 0x000a,\n\t0x37a4: 0x000a, 0x37a5: 0x000a, 0x37a6: 0x000a, 0x37a7: 0x000a, 0x37a8: 0x000a, 0x37a9: 0x000a,\n\t0x37aa: 0x000a, 0x37ab: 0x000a,\n\t// Block 0xdf, offset 0x37c0\n\t0x37c0: 0x000a, 0x37c1: 0x000a, 0x37c2: 0x000a, 0x37c3: 0x000a, 0x37c4: 0x000a, 0x37c5: 0x000a,\n\t0x37c6: 0x000a, 0x37c7: 0x000a, 0x37c8: 0x000a, 0x37c9: 0x000a, 0x37ca: 0x000a, 0x37cb: 0x000a,\n\t0x37cc: 0x000a, 0x37cd: 0x000a, 0x37ce: 0x000a, 0x37cf: 0x000a, 0x37d0: 0x000a, 0x37d1: 0x000a,\n\t0x37d2: 0x000a, 0x37d3: 0x000a, 0x37d4: 0x000a, 0x37d5: 0x000a, 0x37d6: 0x000a, 0x37d7: 0x000a,\n\t// Block 0xe0, offset 0x3800\n\t0x3800: 0x000a,\n\t0x3810: 0x000a, 0x3811: 0x000a,\n\t0x3812: 0x000a, 0x3813: 0x000a, 0x3814: 0x000a, 0x3815: 0x000a, 0x3816: 0x000a, 0x3817: 0x000a,\n\t0x3818: 0x000a, 0x3819: 0x000a, 0x381a: 0x000a, 0x381b: 0x000a, 0x381c: 0x000a, 0x381d: 0x000a,\n\t0x381e: 0x000a, 0x381f: 0x000a, 0x3820: 0x000a, 0x3821: 0x000a, 0x3822: 0x000a, 0x3823: 0x000a,\n\t0x3824: 0x000a, 0x3825: 0x000a, 0x3826: 0x000a,\n\t// Block 0xe1, offset 0x3840\n\t0x387e: 0x000b, 0x387f: 0x000b,\n\t// Block 0xe2, offset 0x3880\n\t0x3880: 0x000b, 0x3881: 0x000b, 0x3882: 0x000b, 0x3883: 0x000b, 0x3884: 0x000b, 0x3885: 0x000b,\n\t0x3886: 0x000b, 0x3887: 0x000b, 0x3888: 0x000b, 0x3889: 0x000b, 0x388a: 0x000b, 0x388b: 0x000b,\n\t0x388c: 0x000b, 0x388d: 0x000b, 0x388e: 0x000b, 0x388f: 0x000b, 0x3890: 0x000b, 0x3891: 0x000b,\n\t0x3892: 0x000b, 0x3893: 0x000b, 0x3894: 0x000b, 0x3895: 0x000b, 0x3896: 0x000b, 0x3897: 0x000b,\n\t0x3898: 0x000b, 0x3899: 0x000b, 0x389a: 0x000b, 0x389b: 0x000b, 0x389c: 0x000b, 0x389d: 0x000b,\n\t0x389e: 0x000b, 0x389f: 0x000b, 0x38a0: 0x000b, 0x38a1: 0x000b, 0x38a2: 0x000b, 0x38a3: 0x000b,\n\t0x38a4: 0x000b, 0x38a5: 0x000b, 0x38a6: 0x000b, 0x38a7: 0x000b, 0x38a8: 0x000b, 0x38a9: 0x000b,\n\t0x38aa: 0x000b, 0x38ab: 0x000b, 0x38ac: 0x000b, 0x38ad: 0x000b, 0x38ae: 0x000b, 0x38af: 0x000b,\n\t0x38b0: 0x000b, 0x38b1: 0x000b, 0x38b2: 0x000b, 0x38b3: 0x000b, 0x38b4: 0x000b, 0x38b5: 0x000b,\n\t0x38b6: 0x000b, 0x38b7: 0x000b, 0x38b8: 0x000b, 0x38b9: 0x000b, 0x38ba: 0x000b, 0x38bb: 0x000b,\n\t0x38bc: 0x000b, 0x38bd: 0x000b, 0x38be: 0x000b, 0x38bf: 0x000b,\n\t// Block 0xe3, offset 0x38c0\n\t0x38c0: 0x000c, 0x38c1: 0x000c, 0x38c2: 0x000c, 0x38c3: 0x000c, 0x38c4: 0x000c, 0x38c5: 0x000c,\n\t0x38c6: 0x000c, 0x38c7: 0x000c, 0x38c8: 0x000c, 0x38c9: 0x000c, 0x38ca: 0x000c, 0x38cb: 0x000c,\n\t0x38cc: 0x000c, 0x38cd: 0x000c, 0x38ce: 0x000c, 0x38cf: 0x000c, 0x38d0: 0x000c, 0x38d1: 0x000c,\n\t0x38d2: 0x000c, 0x38d3: 0x000c, 0x38d4: 0x000c, 0x38d5: 0x000c, 0x38d6: 0x000c, 0x38d7: 0x000c,\n\t0x38d8: 0x000c, 0x38d9: 0x000c, 0x38da: 0x000c, 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c,\n\t0x38de: 0x000c, 0x38df: 0x000c, 0x38e0: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c,\n\t0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c,\n\t0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c,\n\t0x38f0: 0x000b, 0x38f1: 0x000b, 0x38f2: 0x000b, 0x38f3: 0x000b, 0x38f4: 0x000b, 0x38f5: 0x000b,\n\t0x38f6: 0x000b, 0x38f7: 0x000b, 0x38f8: 0x000b, 0x38f9: 0x000b, 0x38fa: 0x000b, 0x38fb: 0x000b,\n\t0x38fc: 0x000b, 0x38fd: 0x000b, 0x38fe: 0x000b, 0x38ff: 0x000b,\n}\n\n// bidiIndex: 24 blocks, 1536 entries, 1536 bytes\n// Block 0 is the zero block.\nvar bidiIndex = [1536]uint8{\n\t// Block 0x0, offset 0x0\n\t// Block 0x1, offset 0x40\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc2: 0x01, 0xc3: 0x02,\n\t0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,\n\t0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,\n\t0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,\n\t0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,\n\t0xea: 0x07, 0xef: 0x08,\n\t0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15,\n\t// Block 0x4, offset 0x100\n\t0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,\n\t0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,\n\t0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28,\n\t0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x31, 0x141: 0x32, 0x142: 0x33,\n\t0x14d: 0x34, 0x14e: 0x35,\n\t0x150: 0x36,\n\t0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b,\n\t0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40,\n\t0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47,\n\t0x170: 0x48, 0x173: 0x49, 0x177: 0x4a,\n\t0x17e: 0x4b, 0x17f: 0x4c,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54,\n\t0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x54,\n\t0x190: 0x59, 0x191: 0x5a, 0x192: 0x5b, 0x193: 0x5c, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54,\n\t0x198: 0x54, 0x199: 0x54, 0x19a: 0x5d, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5e, 0x19e: 0x54, 0x19f: 0x5f,\n\t0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x60, 0x1a7: 0x61,\n\t0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x62, 0x1ae: 0x63, 0x1af: 0x64,\n\t0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67,\n\t0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6c,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70,\n\t0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76,\n\t// Block 0x8, offset 0x200\n\t0x237: 0x54,\n\t// Block 0x9, offset 0x240\n\t0x252: 0x77, 0x253: 0x78,\n\t0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e,\n\t0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85,\n\t0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26f: 0x8a,\n\t// Block 0xa, offset 0x280\n\t0x2ac: 0x8b, 0x2ad: 0x8c, 0x2ae: 0x0e, 0x2af: 0x0e,\n\t0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8d, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8e,\n\t0x2b8: 0x8f, 0x2b9: 0x90, 0x2ba: 0x0e, 0x2bb: 0x91, 0x2bc: 0x92, 0x2bd: 0x93, 0x2bf: 0x94,\n\t// Block 0xb, offset 0x2c0\n\t0x2c4: 0x95, 0x2c5: 0x54, 0x2c6: 0x96, 0x2c7: 0x97,\n\t0x2cb: 0x98, 0x2cd: 0x99,\n\t0x2e0: 0x9a, 0x2e1: 0x9a, 0x2e2: 0x9a, 0x2e3: 0x9a, 0x2e4: 0x9b, 0x2e5: 0x9a, 0x2e6: 0x9a, 0x2e7: 0x9a,\n\t0x2e8: 0x9c, 0x2e9: 0x9a, 0x2ea: 0x9a, 0x2eb: 0x9d, 0x2ec: 0x9e, 0x2ed: 0x9a, 0x2ee: 0x9a, 0x2ef: 0x9a,\n\t0x2f0: 0x9a, 0x2f1: 0x9a, 0x2f2: 0x9a, 0x2f3: 0x9a, 0x2f4: 0x9a, 0x2f5: 0x9a, 0x2f6: 0x9a, 0x2f7: 0x9a,\n\t0x2f8: 0x9a, 0x2f9: 0x9f, 0x2fa: 0x9a, 0x2fb: 0x9a, 0x2fc: 0x9a, 0x2fd: 0x9a, 0x2fe: 0x9a, 0x2ff: 0x9a,\n\t// Block 0xc, offset 0x300\n\t0x300: 0xa0, 0x301: 0xa1, 0x302: 0xa2, 0x304: 0xa3, 0x305: 0xa4, 0x306: 0xa5, 0x307: 0xa6,\n\t0x308: 0xa7, 0x30b: 0xa8, 0x30c: 0xa9, 0x30d: 0xaa,\n\t0x310: 0xab, 0x311: 0xac, 0x312: 0xad, 0x313: 0xae, 0x316: 0xaf, 0x317: 0xb0,\n\t0x318: 0xb1, 0x319: 0xb2, 0x31a: 0xb3, 0x31c: 0xb4,\n\t0x328: 0xb5, 0x329: 0xb6, 0x32a: 0xb7,\n\t0x330: 0xb8, 0x332: 0xb9, 0x334: 0xba, 0x335: 0xbb,\n\t// Block 0xd, offset 0x340\n\t0x36b: 0xbc, 0x36c: 0xbd,\n\t0x37e: 0xbe,\n\t// Block 0xe, offset 0x380\n\t0x3b2: 0xbf,\n\t// Block 0xf, offset 0x3c0\n\t0x3c5: 0xc0, 0x3c6: 0xc1,\n\t0x3c8: 0x54, 0x3c9: 0xc2, 0x3cc: 0x54, 0x3cd: 0xc3,\n\t0x3db: 0xc4, 0x3dc: 0xc5, 0x3dd: 0xc6, 0x3de: 0xc7, 0x3df: 0xc8,\n\t0x3e8: 0xc9, 0x3e9: 0xca, 0x3ea: 0xcb,\n\t// Block 0x10, offset 0x400\n\t0x400: 0xcc,\n\t0x420: 0x9a, 0x421: 0x9a, 0x422: 0x9a, 0x423: 0xcd, 0x424: 0x9a, 0x425: 0xce, 0x426: 0x9a, 0x427: 0x9a,\n\t0x428: 0x9a, 0x429: 0x9a, 0x42a: 0x9a, 0x42b: 0x9a, 0x42c: 0x9a, 0x42d: 0x9a, 0x42e: 0x9a, 0x42f: 0x9a,\n\t0x430: 0x9a, 0x431: 0x9a, 0x432: 0x9a, 0x433: 0x9a, 0x434: 0x9a, 0x435: 0x9a, 0x436: 0x9a, 0x437: 0x9a,\n\t0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcf, 0x43c: 0x9a, 0x43d: 0x9a, 0x43e: 0x9a, 0x43f: 0x9a,\n\t// Block 0x11, offset 0x440\n\t0x440: 0xd0, 0x441: 0x54, 0x442: 0xd1, 0x443: 0xd2, 0x444: 0xd3, 0x445: 0xd4,\n\t0x449: 0xd5, 0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54,\n\t0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54,\n\t0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd6, 0x45c: 0x54, 0x45d: 0x6b, 0x45e: 0x54, 0x45f: 0xd7,\n\t0x460: 0xd8, 0x461: 0xd9, 0x462: 0xda, 0x464: 0xdb, 0x465: 0xdc, 0x466: 0xdd, 0x467: 0xde,\n\t0x47f: 0xdf,\n\t// Block 0x12, offset 0x480\n\t0x4bf: 0xdf,\n\t// Block 0x13, offset 0x4c0\n\t0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b,\n\t0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f,\n\t0x4ef: 0x10,\n\t0x4ff: 0x10,\n\t// Block 0x14, offset 0x500\n\t0x50f: 0x10,\n\t0x51f: 0x10,\n\t0x52f: 0x10,\n\t0x53f: 0x10,\n\t// Block 0x15, offset 0x540\n\t0x540: 0xe0, 0x541: 0xe0, 0x542: 0xe0, 0x543: 0xe0, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xe1,\n\t0x548: 0xe0, 0x549: 0xe0, 0x54a: 0xe0, 0x54b: 0xe0, 0x54c: 0xe0, 0x54d: 0xe0, 0x54e: 0xe0, 0x54f: 0xe0,\n\t0x550: 0xe0, 0x551: 0xe0, 0x552: 0xe0, 0x553: 0xe0, 0x554: 0xe0, 0x555: 0xe0, 0x556: 0xe0, 0x557: 0xe0,\n\t0x558: 0xe0, 0x559: 0xe0, 0x55a: 0xe0, 0x55b: 0xe0, 0x55c: 0xe0, 0x55d: 0xe0, 0x55e: 0xe0, 0x55f: 0xe0,\n\t0x560: 0xe0, 0x561: 0xe0, 0x562: 0xe0, 0x563: 0xe0, 0x564: 0xe0, 0x565: 0xe0, 0x566: 0xe0, 0x567: 0xe0,\n\t0x568: 0xe0, 0x569: 0xe0, 0x56a: 0xe0, 0x56b: 0xe0, 0x56c: 0xe0, 0x56d: 0xe0, 0x56e: 0xe0, 0x56f: 0xe0,\n\t0x570: 0xe0, 0x571: 0xe0, 0x572: 0xe0, 0x573: 0xe0, 0x574: 0xe0, 0x575: 0xe0, 0x576: 0xe0, 0x577: 0xe0,\n\t0x578: 0xe0, 0x579: 0xe0, 0x57a: 0xe0, 0x57b: 0xe0, 0x57c: 0xe0, 0x57d: 0xe0, 0x57e: 0xe0, 0x57f: 0xe0,\n\t// Block 0x16, offset 0x580\n\t0x58f: 0x10,\n\t0x59f: 0x10,\n\t0x5a0: 0x13,\n\t0x5af: 0x10,\n\t0x5bf: 0x10,\n\t// Block 0x17, offset 0x5c0\n\t0x5cf: 0x10,\n}\n\n// Total table size 16184 bytes (15KiB); checksum: F50EF68C\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n// +build !go1.10\n\npackage bidi\n\n// UnicodeVersion is the Unicode version from which the tables in this package are derived.\nconst UnicodeVersion = \"9.0.0\"\n\n// xorMasks contains masks to be xor-ed with brackets to get the reverse\n// version.\nvar xorMasks = []int32{ // 8 elements\n\t0, 1, 6, 7, 3, 15, 29, 63,\n} // Size: 56 bytes\n\n// lookup returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *bidiTrie) lookup(s []byte) (v uint8, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn bidiValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = bidiIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *bidiTrie) lookupUnsafe(s []byte) uint8 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn bidiValues[c0]\n\t}\n\ti := bidiIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// lookupString returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *bidiTrie) lookupString(s string) (v uint8, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn bidiValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := bidiIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = bidiIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = bidiIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *bidiTrie) lookupStringUnsafe(s string) uint8 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn bidiValues[c0]\n\t}\n\ti := bidiIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = bidiIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// bidiTrie. Total size: 15744 bytes (15.38 KiB). Checksum: b4c3b70954803b86.\ntype bidiTrie struct{}\n\nfunc newBidiTrie(i int) *bidiTrie {\n\treturn &bidiTrie{}\n}\n\n// lookupValue determines the type of block n and looks up the value for b.\nfunc (t *bidiTrie) lookupValue(n uint32, b byte) uint8 {\n\tswitch {\n\tdefault:\n\t\treturn uint8(bidiValues[n<<6+uint32(b)])\n\t}\n}\n\n// bidiValues: 222 blocks, 14208 entries, 14208 bytes\n// The third block is the zero block.\nvar bidiValues = [14208]uint8{\n\t// Block 0x0, offset 0x0\n\t0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b,\n\t0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008,\n\t0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b,\n\t0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b,\n\t0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007,\n\t0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004,\n\t0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a,\n\t0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006,\n\t0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002,\n\t0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a,\n\t0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a,\n\t// Block 0x1, offset 0x40\n\t0x40: 0x000a,\n\t0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a,\n\t0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a,\n\t0x7b: 0x005a,\n\t0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b,\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007,\n\t0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b,\n\t0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b,\n\t0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b,\n\t0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b,\n\t0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004,\n\t0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a,\n\t0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a,\n\t0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a,\n\t0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a,\n\t0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a,\n\t// Block 0x4, offset 0x100\n\t0x117: 0x000a,\n\t0x137: 0x000a,\n\t// Block 0x5, offset 0x140\n\t0x179: 0x000a, 0x17a: 0x000a,\n\t// Block 0x6, offset 0x180\n\t0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a,\n\t0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a,\n\t0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a,\n\t0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a,\n\t0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a,\n\t0x19e: 0x000a, 0x19f: 0x000a,\n\t0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a,\n\t0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a,\n\t0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a,\n\t0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a,\n\t0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c,\n\t0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c,\n\t0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c,\n\t0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c,\n\t0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c,\n\t0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c,\n\t0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c,\n\t0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c,\n\t0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c,\n\t0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c,\n\t0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c,\n\t// Block 0x8, offset 0x200\n\t0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c,\n\t0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c,\n\t0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c,\n\t0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c,\n\t0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c,\n\t0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c,\n\t0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c,\n\t0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c,\n\t0x234: 0x000a, 0x235: 0x000a,\n\t0x23e: 0x000a,\n\t// Block 0x9, offset 0x240\n\t0x244: 0x000a, 0x245: 0x000a,\n\t0x247: 0x000a,\n\t// Block 0xa, offset 0x280\n\t0x2b6: 0x000a,\n\t// Block 0xb, offset 0x2c0\n\t0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c,\n\t0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c,\n\t// Block 0xc, offset 0x300\n\t0x30a: 0x000a,\n\t0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c,\n\t0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c,\n\t0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c,\n\t0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c,\n\t0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c,\n\t0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c,\n\t0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c,\n\t0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c,\n\t0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c,\n\t// Block 0xd, offset 0x340\n\t0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c,\n\t0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001,\n\t0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001,\n\t0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001,\n\t0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001,\n\t0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001,\n\t0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001,\n\t0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001,\n\t0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001,\n\t0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001,\n\t0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001,\n\t// Block 0xe, offset 0x380\n\t0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005,\n\t0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d,\n\t0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c,\n\t0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c,\n\t0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d,\n\t0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d,\n\t0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d,\n\t0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d,\n\t0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d,\n\t0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d,\n\t0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d,\n\t// Block 0xf, offset 0x3c0\n\t0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d,\n\t0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c,\n\t0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c,\n\t0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c,\n\t0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c,\n\t0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005,\n\t0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005,\n\t0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d,\n\t0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d,\n\t0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d,\n\t0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d,\n\t// Block 0x10, offset 0x400\n\t0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d,\n\t0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d,\n\t0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d,\n\t0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d,\n\t0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d,\n\t0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d,\n\t0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d,\n\t0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d,\n\t0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d,\n\t0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d,\n\t0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d,\n\t0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d,\n\t0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d,\n\t0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c,\n\t0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005,\n\t0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c,\n\t0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a,\n\t0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d,\n\t0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002,\n\t0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d,\n\t0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d,\n\t// Block 0x12, offset 0x480\n\t0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d,\n\t0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d,\n\t0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c,\n\t0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d,\n\t0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d,\n\t0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d,\n\t0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d,\n\t0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d,\n\t0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c,\n\t0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c,\n\t0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c,\n\t0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d,\n\t0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d,\n\t0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d,\n\t0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d,\n\t0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d,\n\t0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d,\n\t0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d,\n\t0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d,\n\t0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d,\n\t0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d,\n\t// Block 0x14, offset 0x500\n\t0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d,\n\t0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d,\n\t0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d,\n\t0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d,\n\t0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d,\n\t0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d,\n\t0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c,\n\t0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c,\n\t0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d,\n\t0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d,\n\t0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001,\n\t0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001,\n\t0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001,\n\t0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001,\n\t0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001,\n\t0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001,\n\t0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001,\n\t0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c,\n\t0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001,\n\t0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001,\n\t0x57c: 0x0001, 0x57d: 0x0001, 0x57e: 0x0001, 0x57f: 0x0001,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001,\n\t0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001,\n\t0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001,\n\t0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c,\n\t0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c,\n\t0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c,\n\t0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c,\n\t0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001,\n\t0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001,\n\t0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001,\n\t0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001,\n\t0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001,\n\t0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001,\n\t0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001,\n\t0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001,\n\t0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x0001, 0x5e1: 0x0001, 0x5e2: 0x0001, 0x5e3: 0x0001,\n\t0x5e4: 0x0001, 0x5e5: 0x0001, 0x5e6: 0x0001, 0x5e7: 0x0001, 0x5e8: 0x0001, 0x5e9: 0x0001,\n\t0x5ea: 0x0001, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001,\n\t0x5f0: 0x0001, 0x5f1: 0x0001, 0x5f2: 0x0001, 0x5f3: 0x0001, 0x5f4: 0x0001, 0x5f5: 0x0001,\n\t0x5f6: 0x0001, 0x5f7: 0x0001, 0x5f8: 0x0001, 0x5f9: 0x0001, 0x5fa: 0x0001, 0x5fb: 0x0001,\n\t0x5fc: 0x0001, 0x5fd: 0x0001, 0x5fe: 0x0001, 0x5ff: 0x0001,\n\t// Block 0x18, offset 0x600\n\t0x600: 0x0001, 0x601: 0x0001, 0x602: 0x0001, 0x603: 0x0001, 0x604: 0x0001, 0x605: 0x0001,\n\t0x606: 0x0001, 0x607: 0x0001, 0x608: 0x0001, 0x609: 0x0001, 0x60a: 0x0001, 0x60b: 0x0001,\n\t0x60c: 0x0001, 0x60d: 0x0001, 0x60e: 0x0001, 0x60f: 0x0001, 0x610: 0x0001, 0x611: 0x0001,\n\t0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001,\n\t0x618: 0x0001, 0x619: 0x0001, 0x61a: 0x0001, 0x61b: 0x0001, 0x61c: 0x0001, 0x61d: 0x0001,\n\t0x61e: 0x0001, 0x61f: 0x0001, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d,\n\t0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d,\n\t0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d,\n\t0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d,\n\t0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d,\n\t0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d,\n\t// Block 0x19, offset 0x640\n\t0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d,\n\t0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000d, 0x64b: 0x000d,\n\t0x64c: 0x000d, 0x64d: 0x000d, 0x64e: 0x000d, 0x64f: 0x000d, 0x650: 0x000d, 0x651: 0x000d,\n\t0x652: 0x000d, 0x653: 0x000d, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c,\n\t0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c,\n\t0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c,\n\t0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c,\n\t0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c,\n\t0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c,\n\t0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c,\n\t0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c,\n\t// Block 0x1a, offset 0x680\n\t0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c,\n\t0x6ba: 0x000c,\n\t0x6bc: 0x000c,\n\t// Block 0x1b, offset 0x6c0\n\t0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c,\n\t0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c,\n\t0x6cd: 0x000c, 0x6d1: 0x000c,\n\t0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c,\n\t0x6e2: 0x000c, 0x6e3: 0x000c,\n\t// Block 0x1c, offset 0x700\n\t0x701: 0x000c,\n\t0x73c: 0x000c,\n\t// Block 0x1d, offset 0x740\n\t0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c,\n\t0x74d: 0x000c,\n\t0x762: 0x000c, 0x763: 0x000c,\n\t0x772: 0x0004, 0x773: 0x0004,\n\t0x77b: 0x0004,\n\t// Block 0x1e, offset 0x780\n\t0x781: 0x000c, 0x782: 0x000c,\n\t0x7bc: 0x000c,\n\t// Block 0x1f, offset 0x7c0\n\t0x7c1: 0x000c, 0x7c2: 0x000c,\n\t0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c,\n\t0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c,\n\t0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c,\n\t// Block 0x20, offset 0x800\n\t0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c,\n\t0x807: 0x000c, 0x808: 0x000c,\n\t0x80d: 0x000c,\n\t0x822: 0x000c, 0x823: 0x000c,\n\t0x831: 0x0004,\n\t// Block 0x21, offset 0x840\n\t0x841: 0x000c,\n\t0x87c: 0x000c, 0x87f: 0x000c,\n\t// Block 0x22, offset 0x880\n\t0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c,\n\t0x88d: 0x000c,\n\t0x896: 0x000c,\n\t0x8a2: 0x000c, 0x8a3: 0x000c,\n\t// Block 0x23, offset 0x8c0\n\t0x8c2: 0x000c,\n\t// Block 0x24, offset 0x900\n\t0x900: 0x000c,\n\t0x90d: 0x000c,\n\t0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a,\n\t0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a,\n\t// Block 0x25, offset 0x940\n\t0x940: 0x000c,\n\t0x97e: 0x000c, 0x97f: 0x000c,\n\t// Block 0x26, offset 0x980\n\t0x980: 0x000c,\n\t0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c,\n\t0x98c: 0x000c, 0x98d: 0x000c,\n\t0x995: 0x000c, 0x996: 0x000c,\n\t0x9a2: 0x000c, 0x9a3: 0x000c,\n\t0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a,\n\t0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a,\n\t// Block 0x27, offset 0x9c0\n\t0x9cc: 0x000c, 0x9cd: 0x000c,\n\t0x9e2: 0x000c, 0x9e3: 0x000c,\n\t// Block 0x28, offset 0xa00\n\t0xa01: 0x000c,\n\t// Block 0x29, offset 0xa40\n\t0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c,\n\t0xa4d: 0x000c,\n\t0xa62: 0x000c, 0xa63: 0x000c,\n\t// Block 0x2a, offset 0xa80\n\t0xa8a: 0x000c,\n\t0xa92: 0x000c, 0xa93: 0x000c, 0xa94: 0x000c, 0xa96: 0x000c,\n\t// Block 0x2b, offset 0xac0\n\t0xaf1: 0x000c, 0xaf4: 0x000c, 0xaf5: 0x000c,\n\t0xaf6: 0x000c, 0xaf7: 0x000c, 0xaf8: 0x000c, 0xaf9: 0x000c, 0xafa: 0x000c,\n\t0xaff: 0x0004,\n\t// Block 0x2c, offset 0xb00\n\t0xb07: 0x000c, 0xb08: 0x000c, 0xb09: 0x000c, 0xb0a: 0x000c, 0xb0b: 0x000c,\n\t0xb0c: 0x000c, 0xb0d: 0x000c, 0xb0e: 0x000c,\n\t// Block 0x2d, offset 0xb40\n\t0xb71: 0x000c, 0xb74: 0x000c, 0xb75: 0x000c,\n\t0xb76: 0x000c, 0xb77: 0x000c, 0xb78: 0x000c, 0xb79: 0x000c, 0xb7b: 0x000c,\n\t0xb7c: 0x000c,\n\t// Block 0x2e, offset 0xb80\n\t0xb88: 0x000c, 0xb89: 0x000c, 0xb8a: 0x000c, 0xb8b: 0x000c,\n\t0xb8c: 0x000c, 0xb8d: 0x000c,\n\t// Block 0x2f, offset 0xbc0\n\t0xbd8: 0x000c, 0xbd9: 0x000c,\n\t0xbf5: 0x000c,\n\t0xbf7: 0x000c, 0xbf9: 0x000c, 0xbfa: 0x003a, 0xbfb: 0x002a,\n\t0xbfc: 0x003a, 0xbfd: 0x002a,\n\t// Block 0x30, offset 0xc00\n\t0xc31: 0x000c, 0xc32: 0x000c, 0xc33: 0x000c, 0xc34: 0x000c, 0xc35: 0x000c,\n\t0xc36: 0x000c, 0xc37: 0x000c, 0xc38: 0x000c, 0xc39: 0x000c, 0xc3a: 0x000c, 0xc3b: 0x000c,\n\t0xc3c: 0x000c, 0xc3d: 0x000c, 0xc3e: 0x000c,\n\t// Block 0x31, offset 0xc40\n\t0xc40: 0x000c, 0xc41: 0x000c, 0xc42: 0x000c, 0xc43: 0x000c, 0xc44: 0x000c,\n\t0xc46: 0x000c, 0xc47: 0x000c,\n\t0xc4d: 0x000c, 0xc4e: 0x000c, 0xc4f: 0x000c, 0xc50: 0x000c, 0xc51: 0x000c,\n\t0xc52: 0x000c, 0xc53: 0x000c, 0xc54: 0x000c, 0xc55: 0x000c, 0xc56: 0x000c, 0xc57: 0x000c,\n\t0xc59: 0x000c, 0xc5a: 0x000c, 0xc5b: 0x000c, 0xc5c: 0x000c, 0xc5d: 0x000c,\n\t0xc5e: 0x000c, 0xc5f: 0x000c, 0xc60: 0x000c, 0xc61: 0x000c, 0xc62: 0x000c, 0xc63: 0x000c,\n\t0xc64: 0x000c, 0xc65: 0x000c, 0xc66: 0x000c, 0xc67: 0x000c, 0xc68: 0x000c, 0xc69: 0x000c,\n\t0xc6a: 0x000c, 0xc6b: 0x000c, 0xc6c: 0x000c, 0xc6d: 0x000c, 0xc6e: 0x000c, 0xc6f: 0x000c,\n\t0xc70: 0x000c, 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c,\n\t0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c,\n\t0xc7c: 0x000c,\n\t// Block 0x32, offset 0xc80\n\t0xc86: 0x000c,\n\t// Block 0x33, offset 0xcc0\n\t0xced: 0x000c, 0xcee: 0x000c, 0xcef: 0x000c,\n\t0xcf0: 0x000c, 0xcf2: 0x000c, 0xcf3: 0x000c, 0xcf4: 0x000c, 0xcf5: 0x000c,\n\t0xcf6: 0x000c, 0xcf7: 0x000c, 0xcf9: 0x000c, 0xcfa: 0x000c,\n\t0xcfd: 0x000c, 0xcfe: 0x000c,\n\t// Block 0x34, offset 0xd00\n\t0xd18: 0x000c, 0xd19: 0x000c,\n\t0xd1e: 0x000c, 0xd1f: 0x000c, 0xd20: 0x000c,\n\t0xd31: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c,\n\t// Block 0x35, offset 0xd40\n\t0xd42: 0x000c, 0xd45: 0x000c,\n\t0xd46: 0x000c,\n\t0xd4d: 0x000c,\n\t0xd5d: 0x000c,\n\t// Block 0x36, offset 0xd80\n\t0xd9d: 0x000c,\n\t0xd9e: 0x000c, 0xd9f: 0x000c,\n\t// Block 0x37, offset 0xdc0\n\t0xdd0: 0x000a, 0xdd1: 0x000a,\n\t0xdd2: 0x000a, 0xdd3: 0x000a, 0xdd4: 0x000a, 0xdd5: 0x000a, 0xdd6: 0x000a, 0xdd7: 0x000a,\n\t0xdd8: 0x000a, 0xdd9: 0x000a,\n\t// Block 0x38, offset 0xe00\n\t0xe00: 0x000a,\n\t// Block 0x39, offset 0xe40\n\t0xe40: 0x0009,\n\t0xe5b: 0x007a, 0xe5c: 0x006a,\n\t// Block 0x3a, offset 0xe80\n\t0xe92: 0x000c, 0xe93: 0x000c, 0xe94: 0x000c,\n\t0xeb2: 0x000c, 0xeb3: 0x000c, 0xeb4: 0x000c,\n\t// Block 0x3b, offset 0xec0\n\t0xed2: 0x000c, 0xed3: 0x000c,\n\t0xef2: 0x000c, 0xef3: 0x000c,\n\t// Block 0x3c, offset 0xf00\n\t0xf34: 0x000c, 0xf35: 0x000c,\n\t0xf37: 0x000c, 0xf38: 0x000c, 0xf39: 0x000c, 0xf3a: 0x000c, 0xf3b: 0x000c,\n\t0xf3c: 0x000c, 0xf3d: 0x000c,\n\t// Block 0x3d, offset 0xf40\n\t0xf46: 0x000c, 0xf49: 0x000c, 0xf4a: 0x000c, 0xf4b: 0x000c,\n\t0xf4c: 0x000c, 0xf4d: 0x000c, 0xf4e: 0x000c, 0xf4f: 0x000c, 0xf50: 0x000c, 0xf51: 0x000c,\n\t0xf52: 0x000c, 0xf53: 0x000c,\n\t0xf5b: 0x0004, 0xf5d: 0x000c,\n\t0xf70: 0x000a, 0xf71: 0x000a, 0xf72: 0x000a, 0xf73: 0x000a, 0xf74: 0x000a, 0xf75: 0x000a,\n\t0xf76: 0x000a, 0xf77: 0x000a, 0xf78: 0x000a, 0xf79: 0x000a,\n\t// Block 0x3e, offset 0xf80\n\t0xf80: 0x000a, 0xf81: 0x000a, 0xf82: 0x000a, 0xf83: 0x000a, 0xf84: 0x000a, 0xf85: 0x000a,\n\t0xf86: 0x000a, 0xf87: 0x000a, 0xf88: 0x000a, 0xf89: 0x000a, 0xf8a: 0x000a, 0xf8b: 0x000c,\n\t0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000b,\n\t// Block 0x3f, offset 0xfc0\n\t0xfc5: 0x000c,\n\t0xfc6: 0x000c,\n\t0xfe9: 0x000c,\n\t// Block 0x40, offset 0x1000\n\t0x1020: 0x000c, 0x1021: 0x000c, 0x1022: 0x000c,\n\t0x1027: 0x000c, 0x1028: 0x000c,\n\t0x1032: 0x000c,\n\t0x1039: 0x000c, 0x103a: 0x000c, 0x103b: 0x000c,\n\t// Block 0x41, offset 0x1040\n\t0x1040: 0x000a, 0x1044: 0x000a, 0x1045: 0x000a,\n\t// Block 0x42, offset 0x1080\n\t0x109e: 0x000a, 0x109f: 0x000a, 0x10a0: 0x000a, 0x10a1: 0x000a, 0x10a2: 0x000a, 0x10a3: 0x000a,\n\t0x10a4: 0x000a, 0x10a5: 0x000a, 0x10a6: 0x000a, 0x10a7: 0x000a, 0x10a8: 0x000a, 0x10a9: 0x000a,\n\t0x10aa: 0x000a, 0x10ab: 0x000a, 0x10ac: 0x000a, 0x10ad: 0x000a, 0x10ae: 0x000a, 0x10af: 0x000a,\n\t0x10b0: 0x000a, 0x10b1: 0x000a, 0x10b2: 0x000a, 0x10b3: 0x000a, 0x10b4: 0x000a, 0x10b5: 0x000a,\n\t0x10b6: 0x000a, 0x10b7: 0x000a, 0x10b8: 0x000a, 0x10b9: 0x000a, 0x10ba: 0x000a, 0x10bb: 0x000a,\n\t0x10bc: 0x000a, 0x10bd: 0x000a, 0x10be: 0x000a, 0x10bf: 0x000a,\n\t// Block 0x43, offset 0x10c0\n\t0x10d7: 0x000c,\n\t0x10d8: 0x000c, 0x10db: 0x000c,\n\t// Block 0x44, offset 0x1100\n\t0x1116: 0x000c,\n\t0x1118: 0x000c, 0x1119: 0x000c, 0x111a: 0x000c, 0x111b: 0x000c, 0x111c: 0x000c, 0x111d: 0x000c,\n\t0x111e: 0x000c, 0x1120: 0x000c, 0x1122: 0x000c,\n\t0x1125: 0x000c, 0x1126: 0x000c, 0x1127: 0x000c, 0x1128: 0x000c, 0x1129: 0x000c,\n\t0x112a: 0x000c, 0x112b: 0x000c, 0x112c: 0x000c,\n\t0x1133: 0x000c, 0x1134: 0x000c, 0x1135: 0x000c,\n\t0x1136: 0x000c, 0x1137: 0x000c, 0x1138: 0x000c, 0x1139: 0x000c, 0x113a: 0x000c, 0x113b: 0x000c,\n\t0x113c: 0x000c, 0x113f: 0x000c,\n\t// Block 0x45, offset 0x1140\n\t0x1170: 0x000c, 0x1171: 0x000c, 0x1172: 0x000c, 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c,\n\t0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c,\n\t0x117c: 0x000c, 0x117d: 0x000c, 0x117e: 0x000c,\n\t// Block 0x46, offset 0x1180\n\t0x1180: 0x000c, 0x1181: 0x000c, 0x1182: 0x000c, 0x1183: 0x000c,\n\t0x11b4: 0x000c,\n\t0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c,\n\t0x11bc: 0x000c,\n\t// Block 0x47, offset 0x11c0\n\t0x11c2: 0x000c,\n\t0x11eb: 0x000c, 0x11ec: 0x000c, 0x11ed: 0x000c, 0x11ee: 0x000c, 0x11ef: 0x000c,\n\t0x11f0: 0x000c, 0x11f1: 0x000c, 0x11f2: 0x000c, 0x11f3: 0x000c,\n\t// Block 0x48, offset 0x1200\n\t0x1200: 0x000c, 0x1201: 0x000c,\n\t0x1222: 0x000c, 0x1223: 0x000c,\n\t0x1224: 0x000c, 0x1225: 0x000c, 0x1228: 0x000c, 0x1229: 0x000c,\n\t0x122b: 0x000c, 0x122c: 0x000c, 0x122d: 0x000c,\n\t// Block 0x49, offset 0x1240\n\t0x1266: 0x000c, 0x1268: 0x000c, 0x1269: 0x000c,\n\t0x126d: 0x000c, 0x126f: 0x000c,\n\t0x1270: 0x000c, 0x1271: 0x000c,\n\t// Block 0x4a, offset 0x1280\n\t0x12ac: 0x000c, 0x12ad: 0x000c, 0x12ae: 0x000c, 0x12af: 0x000c,\n\t0x12b0: 0x000c, 0x12b1: 0x000c, 0x12b2: 0x000c, 0x12b3: 0x000c,\n\t0x12b6: 0x000c, 0x12b7: 0x000c,\n\t// Block 0x4b, offset 0x12c0\n\t0x12d0: 0x000c, 0x12d1: 0x000c,\n\t0x12d2: 0x000c, 0x12d4: 0x000c, 0x12d5: 0x000c, 0x12d6: 0x000c, 0x12d7: 0x000c,\n\t0x12d8: 0x000c, 0x12d9: 0x000c, 0x12da: 0x000c, 0x12db: 0x000c, 0x12dc: 0x000c, 0x12dd: 0x000c,\n\t0x12de: 0x000c, 0x12df: 0x000c, 0x12e0: 0x000c, 0x12e2: 0x000c, 0x12e3: 0x000c,\n\t0x12e4: 0x000c, 0x12e5: 0x000c, 0x12e6: 0x000c, 0x12e7: 0x000c, 0x12e8: 0x000c,\n\t0x12ed: 0x000c,\n\t0x12f4: 0x000c,\n\t0x12f8: 0x000c, 0x12f9: 0x000c,\n\t// Block 0x4c, offset 0x1300\n\t0x1300: 0x000c, 0x1301: 0x000c, 0x1302: 0x000c, 0x1303: 0x000c, 0x1304: 0x000c, 0x1305: 0x000c,\n\t0x1306: 0x000c, 0x1307: 0x000c, 0x1308: 0x000c, 0x1309: 0x000c, 0x130a: 0x000c, 0x130b: 0x000c,\n\t0x130c: 0x000c, 0x130d: 0x000c, 0x130e: 0x000c, 0x130f: 0x000c, 0x1310: 0x000c, 0x1311: 0x000c,\n\t0x1312: 0x000c, 0x1313: 0x000c, 0x1314: 0x000c, 0x1315: 0x000c, 0x1316: 0x000c, 0x1317: 0x000c,\n\t0x1318: 0x000c, 0x1319: 0x000c, 0x131a: 0x000c, 0x131b: 0x000c, 0x131c: 0x000c, 0x131d: 0x000c,\n\t0x131e: 0x000c, 0x131f: 0x000c, 0x1320: 0x000c, 0x1321: 0x000c, 0x1322: 0x000c, 0x1323: 0x000c,\n\t0x1324: 0x000c, 0x1325: 0x000c, 0x1326: 0x000c, 0x1327: 0x000c, 0x1328: 0x000c, 0x1329: 0x000c,\n\t0x132a: 0x000c, 0x132b: 0x000c, 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c,\n\t0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, 0x1334: 0x000c, 0x1335: 0x000c,\n\t0x133b: 0x000c,\n\t0x133c: 0x000c, 0x133d: 0x000c, 0x133e: 0x000c, 0x133f: 0x000c,\n\t// Block 0x4d, offset 0x1340\n\t0x137d: 0x000a, 0x137f: 0x000a,\n\t// Block 0x4e, offset 0x1380\n\t0x1380: 0x000a, 0x1381: 0x000a,\n\t0x138d: 0x000a, 0x138e: 0x000a, 0x138f: 0x000a,\n\t0x139d: 0x000a,\n\t0x139e: 0x000a, 0x139f: 0x000a,\n\t0x13ad: 0x000a, 0x13ae: 0x000a, 0x13af: 0x000a,\n\t0x13bd: 0x000a, 0x13be: 0x000a,\n\t// Block 0x4f, offset 0x13c0\n\t0x13c0: 0x0009, 0x13c1: 0x0009, 0x13c2: 0x0009, 0x13c3: 0x0009, 0x13c4: 0x0009, 0x13c5: 0x0009,\n\t0x13c6: 0x0009, 0x13c7: 0x0009, 0x13c8: 0x0009, 0x13c9: 0x0009, 0x13ca: 0x0009, 0x13cb: 0x000b,\n\t0x13cc: 0x000b, 0x13cd: 0x000b, 0x13cf: 0x0001, 0x13d0: 0x000a, 0x13d1: 0x000a,\n\t0x13d2: 0x000a, 0x13d3: 0x000a, 0x13d4: 0x000a, 0x13d5: 0x000a, 0x13d6: 0x000a, 0x13d7: 0x000a,\n\t0x13d8: 0x000a, 0x13d9: 0x000a, 0x13da: 0x000a, 0x13db: 0x000a, 0x13dc: 0x000a, 0x13dd: 0x000a,\n\t0x13de: 0x000a, 0x13df: 0x000a, 0x13e0: 0x000a, 0x13e1: 0x000a, 0x13e2: 0x000a, 0x13e3: 0x000a,\n\t0x13e4: 0x000a, 0x13e5: 0x000a, 0x13e6: 0x000a, 0x13e7: 0x000a, 0x13e8: 0x0009, 0x13e9: 0x0007,\n\t0x13ea: 0x000e, 0x13eb: 0x000e, 0x13ec: 0x000e, 0x13ed: 0x000e, 0x13ee: 0x000e, 0x13ef: 0x0006,\n\t0x13f0: 0x0004, 0x13f1: 0x0004, 0x13f2: 0x0004, 0x13f3: 0x0004, 0x13f4: 0x0004, 0x13f5: 0x000a,\n\t0x13f6: 0x000a, 0x13f7: 0x000a, 0x13f8: 0x000a, 0x13f9: 0x000a, 0x13fa: 0x000a, 0x13fb: 0x000a,\n\t0x13fc: 0x000a, 0x13fd: 0x000a, 0x13fe: 0x000a, 0x13ff: 0x000a,\n\t// Block 0x50, offset 0x1400\n\t0x1400: 0x000a, 0x1401: 0x000a, 0x1402: 0x000a, 0x1403: 0x000a, 0x1404: 0x0006, 0x1405: 0x009a,\n\t0x1406: 0x008a, 0x1407: 0x000a, 0x1408: 0x000a, 0x1409: 0x000a, 0x140a: 0x000a, 0x140b: 0x000a,\n\t0x140c: 0x000a, 0x140d: 0x000a, 0x140e: 0x000a, 0x140f: 0x000a, 0x1410: 0x000a, 0x1411: 0x000a,\n\t0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a,\n\t0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a,\n\t0x141e: 0x000a, 0x141f: 0x0009, 0x1420: 0x000b, 0x1421: 0x000b, 0x1422: 0x000b, 0x1423: 0x000b,\n\t0x1424: 0x000b, 0x1425: 0x000b, 0x1426: 0x000e, 0x1427: 0x000e, 0x1428: 0x000e, 0x1429: 0x000e,\n\t0x142a: 0x000b, 0x142b: 0x000b, 0x142c: 0x000b, 0x142d: 0x000b, 0x142e: 0x000b, 0x142f: 0x000b,\n\t0x1430: 0x0002, 0x1434: 0x0002, 0x1435: 0x0002,\n\t0x1436: 0x0002, 0x1437: 0x0002, 0x1438: 0x0002, 0x1439: 0x0002, 0x143a: 0x0003, 0x143b: 0x0003,\n\t0x143c: 0x000a, 0x143d: 0x009a, 0x143e: 0x008a,\n\t// Block 0x51, offset 0x1440\n\t0x1440: 0x0002, 0x1441: 0x0002, 0x1442: 0x0002, 0x1443: 0x0002, 0x1444: 0x0002, 0x1445: 0x0002,\n\t0x1446: 0x0002, 0x1447: 0x0002, 0x1448: 0x0002, 0x1449: 0x0002, 0x144a: 0x0003, 0x144b: 0x0003,\n\t0x144c: 0x000a, 0x144d: 0x009a, 0x144e: 0x008a,\n\t0x1460: 0x0004, 0x1461: 0x0004, 0x1462: 0x0004, 0x1463: 0x0004,\n\t0x1464: 0x0004, 0x1465: 0x0004, 0x1466: 0x0004, 0x1467: 0x0004, 0x1468: 0x0004, 0x1469: 0x0004,\n\t0x146a: 0x0004, 0x146b: 0x0004, 0x146c: 0x0004, 0x146d: 0x0004, 0x146e: 0x0004, 0x146f: 0x0004,\n\t0x1470: 0x0004, 0x1471: 0x0004, 0x1472: 0x0004, 0x1473: 0x0004, 0x1474: 0x0004, 0x1475: 0x0004,\n\t0x1476: 0x0004, 0x1477: 0x0004, 0x1478: 0x0004, 0x1479: 0x0004, 0x147a: 0x0004, 0x147b: 0x0004,\n\t0x147c: 0x0004, 0x147d: 0x0004, 0x147e: 0x0004, 0x147f: 0x0004,\n\t// Block 0x52, offset 0x1480\n\t0x1480: 0x0004, 0x1481: 0x0004, 0x1482: 0x0004, 0x1483: 0x0004, 0x1484: 0x0004, 0x1485: 0x0004,\n\t0x1486: 0x0004, 0x1487: 0x0004, 0x1488: 0x0004, 0x1489: 0x0004, 0x148a: 0x0004, 0x148b: 0x0004,\n\t0x148c: 0x0004, 0x148d: 0x0004, 0x148e: 0x0004, 0x148f: 0x0004, 0x1490: 0x000c, 0x1491: 0x000c,\n\t0x1492: 0x000c, 0x1493: 0x000c, 0x1494: 0x000c, 0x1495: 0x000c, 0x1496: 0x000c, 0x1497: 0x000c,\n\t0x1498: 0x000c, 0x1499: 0x000c, 0x149a: 0x000c, 0x149b: 0x000c, 0x149c: 0x000c, 0x149d: 0x000c,\n\t0x149e: 0x000c, 0x149f: 0x000c, 0x14a0: 0x000c, 0x14a1: 0x000c, 0x14a2: 0x000c, 0x14a3: 0x000c,\n\t0x14a4: 0x000c, 0x14a5: 0x000c, 0x14a6: 0x000c, 0x14a7: 0x000c, 0x14a8: 0x000c, 0x14a9: 0x000c,\n\t0x14aa: 0x000c, 0x14ab: 0x000c, 0x14ac: 0x000c, 0x14ad: 0x000c, 0x14ae: 0x000c, 0x14af: 0x000c,\n\t0x14b0: 0x000c,\n\t// Block 0x53, offset 0x14c0\n\t0x14c0: 0x000a, 0x14c1: 0x000a, 0x14c3: 0x000a, 0x14c4: 0x000a, 0x14c5: 0x000a,\n\t0x14c6: 0x000a, 0x14c8: 0x000a, 0x14c9: 0x000a,\n\t0x14d4: 0x000a, 0x14d6: 0x000a, 0x14d7: 0x000a,\n\t0x14d8: 0x000a,\n\t0x14de: 0x000a, 0x14df: 0x000a, 0x14e0: 0x000a, 0x14e1: 0x000a, 0x14e2: 0x000a, 0x14e3: 0x000a,\n\t0x14e5: 0x000a, 0x14e7: 0x000a, 0x14e9: 0x000a,\n\t0x14ee: 0x0004,\n\t0x14fa: 0x000a, 0x14fb: 0x000a,\n\t// Block 0x54, offset 0x1500\n\t0x1500: 0x000a, 0x1501: 0x000a, 0x1502: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a,\n\t0x150a: 0x000a, 0x150b: 0x000a,\n\t0x150c: 0x000a, 0x150d: 0x000a, 0x1510: 0x000a, 0x1511: 0x000a,\n\t0x1512: 0x000a, 0x1513: 0x000a, 0x1514: 0x000a, 0x1515: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a,\n\t0x1518: 0x000a, 0x1519: 0x000a, 0x151a: 0x000a, 0x151b: 0x000a, 0x151c: 0x000a, 0x151d: 0x000a,\n\t0x151e: 0x000a, 0x151f: 0x000a,\n\t// Block 0x55, offset 0x1540\n\t0x1549: 0x000a, 0x154a: 0x000a, 0x154b: 0x000a,\n\t0x1550: 0x000a, 0x1551: 0x000a,\n\t0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a,\n\t0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a,\n\t0x155e: 0x000a, 0x155f: 0x000a, 0x1560: 0x000a, 0x1561: 0x000a, 0x1562: 0x000a, 0x1563: 0x000a,\n\t0x1564: 0x000a, 0x1565: 0x000a, 0x1566: 0x000a, 0x1567: 0x000a, 0x1568: 0x000a, 0x1569: 0x000a,\n\t0x156a: 0x000a, 0x156b: 0x000a, 0x156c: 0x000a, 0x156d: 0x000a, 0x156e: 0x000a, 0x156f: 0x000a,\n\t0x1570: 0x000a, 0x1571: 0x000a, 0x1572: 0x000a, 0x1573: 0x000a, 0x1574: 0x000a, 0x1575: 0x000a,\n\t0x1576: 0x000a, 0x1577: 0x000a, 0x1578: 0x000a, 0x1579: 0x000a, 0x157a: 0x000a, 0x157b: 0x000a,\n\t0x157c: 0x000a, 0x157d: 0x000a, 0x157e: 0x000a, 0x157f: 0x000a,\n\t// Block 0x56, offset 0x1580\n\t0x1580: 0x000a, 0x1581: 0x000a, 0x1582: 0x000a, 0x1583: 0x000a, 0x1584: 0x000a, 0x1585: 0x000a,\n\t0x1586: 0x000a, 0x1587: 0x000a, 0x1588: 0x000a, 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a,\n\t0x158c: 0x000a, 0x158d: 0x000a, 0x158e: 0x000a, 0x158f: 0x000a, 0x1590: 0x000a, 0x1591: 0x000a,\n\t0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a,\n\t0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a,\n\t0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a,\n\t0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a,\n\t0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a,\n\t0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a,\n\t0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a,\n\t0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a,\n\t// Block 0x57, offset 0x15c0\n\t0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a,\n\t0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a,\n\t0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a,\n\t0x15d2: 0x0003, 0x15d3: 0x0004, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a,\n\t0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a,\n\t0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a,\n\t0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a,\n\t0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a,\n\t0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a,\n\t0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a,\n\t0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a,\n\t// Block 0x58, offset 0x1600\n\t0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a,\n\t0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x003a, 0x1609: 0x002a, 0x160a: 0x003a, 0x160b: 0x002a,\n\t0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a,\n\t0x1612: 0x000a, 0x1613: 0x000a, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a,\n\t0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a,\n\t0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a,\n\t0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x009a,\n\t0x162a: 0x008a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a,\n\t0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a,\n\t// Block 0x59, offset 0x1640\n\t0x167b: 0x000a,\n\t0x167c: 0x000a, 0x167d: 0x000a, 0x167e: 0x000a, 0x167f: 0x000a,\n\t// Block 0x5a, offset 0x1680\n\t0x1680: 0x000a, 0x1681: 0x000a, 0x1682: 0x000a, 0x1683: 0x000a, 0x1684: 0x000a, 0x1685: 0x000a,\n\t0x1686: 0x000a, 0x1687: 0x000a, 0x1688: 0x000a, 0x1689: 0x000a, 0x168a: 0x000a, 0x168b: 0x000a,\n\t0x168c: 0x000a, 0x168d: 0x000a, 0x168e: 0x000a, 0x168f: 0x000a, 0x1690: 0x000a, 0x1691: 0x000a,\n\t0x1692: 0x000a, 0x1693: 0x000a, 0x1694: 0x000a, 0x1696: 0x000a, 0x1697: 0x000a,\n\t0x1698: 0x000a, 0x1699: 0x000a, 0x169a: 0x000a, 0x169b: 0x000a, 0x169c: 0x000a, 0x169d: 0x000a,\n\t0x169e: 0x000a, 0x169f: 0x000a, 0x16a0: 0x000a, 0x16a1: 0x000a, 0x16a2: 0x000a, 0x16a3: 0x000a,\n\t0x16a4: 0x000a, 0x16a5: 0x000a, 0x16a6: 0x000a, 0x16a7: 0x000a, 0x16a8: 0x000a, 0x16a9: 0x000a,\n\t0x16aa: 0x000a, 0x16ab: 0x000a, 0x16ac: 0x000a, 0x16ad: 0x000a, 0x16ae: 0x000a, 0x16af: 0x000a,\n\t0x16b0: 0x000a, 0x16b1: 0x000a, 0x16b2: 0x000a, 0x16b3: 0x000a, 0x16b4: 0x000a, 0x16b5: 0x000a,\n\t0x16b6: 0x000a, 0x16b7: 0x000a, 0x16b8: 0x000a, 0x16b9: 0x000a, 0x16ba: 0x000a, 0x16bb: 0x000a,\n\t0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a,\n\t// Block 0x5b, offset 0x16c0\n\t0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a,\n\t0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a,\n\t0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a,\n\t0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d5: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a,\n\t0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a,\n\t0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a,\n\t0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a,\n\t0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a,\n\t0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a,\n\t0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a,\n\t0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a,\n\t// Block 0x5c, offset 0x1700\n\t0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a,\n\t0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a,\n\t0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a,\n\t0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a,\n\t0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a,\n\t0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a,\n\t0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a,\n\t// Block 0x5d, offset 0x1740\n\t0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a,\n\t0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a,\n\t0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a,\n\t0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a,\n\t0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a,\n\t0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a,\n\t0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a,\n\t0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a,\n\t// Block 0x5e, offset 0x1780\n\t0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a,\n\t0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002,\n\t0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002,\n\t0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002,\n\t0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002,\n\t// Block 0x5f, offset 0x17c0\n\t0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a,\n\t0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a,\n\t0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a,\n\t0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a,\n\t// Block 0x60, offset 0x1800\n\t0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a,\n\t0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a,\n\t0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a,\n\t0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a,\n\t0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a,\n\t0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a,\n\t0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a,\n\t0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a,\n\t0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a,\n\t0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a,\n\t0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a,\n\t// Block 0x61, offset 0x1840\n\t0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a,\n\t0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a,\n\t0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a,\n\t0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a,\n\t0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a,\n\t0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a,\n\t0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a,\n\t0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a,\n\t0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a,\n\t0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a,\n\t0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a,\n\t// Block 0x62, offset 0x1880\n\t0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a,\n\t0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a,\n\t0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a,\n\t0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a,\n\t0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a,\n\t0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a,\n\t0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a,\n\t0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a,\n\t0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a,\n\t0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a,\n\t0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a,\n\t// Block 0x63, offset 0x18c0\n\t0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a,\n\t0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a,\n\t0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a,\n\t0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba,\n\t0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a,\n\t0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a,\n\t0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a,\n\t0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a,\n\t0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a,\n\t0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a,\n\t0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a,\n\t// Block 0x64, offset 0x1900\n\t0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a,\n\t0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a,\n\t0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a,\n\t0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a,\n\t0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a,\n\t0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a,\n\t0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a,\n\t0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a,\n\t0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a,\n\t0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a,\n\t0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a,\n\t// Block 0x65, offset 0x1940\n\t0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a,\n\t0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a,\n\t0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a,\n\t0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a,\n\t0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a,\n\t0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a,\n\t0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a,\n\t0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a,\n\t0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a,\n\t0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a,\n\t0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a,\n\t// Block 0x66, offset 0x1980\n\t0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a,\n\t0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a,\n\t0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a,\n\t0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a,\n\t0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a,\n\t0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a,\n\t0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a,\n\t0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a,\n\t0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a,\n\t0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a,\n\t0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a,\n\t// Block 0x67, offset 0x19c0\n\t0x19c0: 0x000a, 0x19c1: 0x000a, 0x19c2: 0x000a, 0x19c3: 0x000a, 0x19c4: 0x000a, 0x19c5: 0x000a,\n\t0x19c6: 0x000a, 0x19c7: 0x000a, 0x19c8: 0x000a, 0x19ca: 0x000a, 0x19cb: 0x000a,\n\t0x19cc: 0x000a, 0x19cd: 0x000a, 0x19ce: 0x000a, 0x19cf: 0x000a, 0x19d0: 0x000a, 0x19d1: 0x000a,\n\t0x19ec: 0x000a, 0x19ed: 0x000a, 0x19ee: 0x000a, 0x19ef: 0x000a,\n\t// Block 0x68, offset 0x1a00\n\t0x1a25: 0x000a, 0x1a26: 0x000a, 0x1a27: 0x000a, 0x1a28: 0x000a, 0x1a29: 0x000a,\n\t0x1a2a: 0x000a, 0x1a2f: 0x000c,\n\t0x1a30: 0x000c, 0x1a31: 0x000c,\n\t0x1a39: 0x000a, 0x1a3a: 0x000a, 0x1a3b: 0x000a,\n\t0x1a3c: 0x000a, 0x1a3d: 0x000a, 0x1a3e: 0x000a, 0x1a3f: 0x000a,\n\t// Block 0x69, offset 0x1a40\n\t0x1a7f: 0x000c,\n\t// Block 0x6a, offset 0x1a80\n\t0x1aa0: 0x000c, 0x1aa1: 0x000c, 0x1aa2: 0x000c, 0x1aa3: 0x000c,\n\t0x1aa4: 0x000c, 0x1aa5: 0x000c, 0x1aa6: 0x000c, 0x1aa7: 0x000c, 0x1aa8: 0x000c, 0x1aa9: 0x000c,\n\t0x1aaa: 0x000c, 0x1aab: 0x000c, 0x1aac: 0x000c, 0x1aad: 0x000c, 0x1aae: 0x000c, 0x1aaf: 0x000c,\n\t0x1ab0: 0x000c, 0x1ab1: 0x000c, 0x1ab2: 0x000c, 0x1ab3: 0x000c, 0x1ab4: 0x000c, 0x1ab5: 0x000c,\n\t0x1ab6: 0x000c, 0x1ab7: 0x000c, 0x1ab8: 0x000c, 0x1ab9: 0x000c, 0x1aba: 0x000c, 0x1abb: 0x000c,\n\t0x1abc: 0x000c, 0x1abd: 0x000c, 0x1abe: 0x000c, 0x1abf: 0x000c,\n\t// Block 0x6b, offset 0x1ac0\n\t0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a,\n\t0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a,\n\t0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a,\n\t0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x000a, 0x1ad6: 0x000a, 0x1ad7: 0x000a,\n\t0x1ad8: 0x000a, 0x1ad9: 0x000a, 0x1ada: 0x000a, 0x1adb: 0x000a, 0x1adc: 0x000a, 0x1add: 0x000a,\n\t0x1ade: 0x000a, 0x1adf: 0x000a, 0x1ae0: 0x000a, 0x1ae1: 0x000a, 0x1ae2: 0x003a, 0x1ae3: 0x002a,\n\t0x1ae4: 0x003a, 0x1ae5: 0x002a, 0x1ae6: 0x003a, 0x1ae7: 0x002a, 0x1ae8: 0x003a, 0x1ae9: 0x002a,\n\t0x1aea: 0x000a, 0x1aeb: 0x000a, 0x1aec: 0x000a, 0x1aed: 0x000a, 0x1aee: 0x000a, 0x1aef: 0x000a,\n\t0x1af0: 0x000a, 0x1af1: 0x000a, 0x1af2: 0x000a, 0x1af3: 0x000a, 0x1af4: 0x000a, 0x1af5: 0x000a,\n\t0x1af6: 0x000a, 0x1af7: 0x000a, 0x1af8: 0x000a, 0x1af9: 0x000a, 0x1afa: 0x000a, 0x1afb: 0x000a,\n\t0x1afc: 0x000a, 0x1afd: 0x000a, 0x1afe: 0x000a, 0x1aff: 0x000a,\n\t// Block 0x6c, offset 0x1b00\n\t0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a,\n\t// Block 0x6d, offset 0x1b40\n\t0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a,\n\t0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a,\n\t0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a,\n\t0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a,\n\t0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a,\n\t0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a,\n\t0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a,\n\t0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a,\n\t0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, 0x1b74: 0x000a, 0x1b75: 0x000a,\n\t0x1b76: 0x000a, 0x1b77: 0x000a, 0x1b78: 0x000a, 0x1b79: 0x000a, 0x1b7a: 0x000a, 0x1b7b: 0x000a,\n\t0x1b7c: 0x000a, 0x1b7d: 0x000a, 0x1b7e: 0x000a, 0x1b7f: 0x000a,\n\t// Block 0x6e, offset 0x1b80\n\t0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a,\n\t0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a,\n\t0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a,\n\t0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, 0x1b96: 0x000a, 0x1b97: 0x000a,\n\t0x1b98: 0x000a, 0x1b99: 0x000a, 0x1b9a: 0x000a, 0x1b9b: 0x000a, 0x1b9c: 0x000a, 0x1b9d: 0x000a,\n\t0x1b9e: 0x000a, 0x1b9f: 0x000a, 0x1ba0: 0x000a, 0x1ba1: 0x000a, 0x1ba2: 0x000a, 0x1ba3: 0x000a,\n\t0x1ba4: 0x000a, 0x1ba5: 0x000a, 0x1ba6: 0x000a, 0x1ba7: 0x000a, 0x1ba8: 0x000a, 0x1ba9: 0x000a,\n\t0x1baa: 0x000a, 0x1bab: 0x000a, 0x1bac: 0x000a, 0x1bad: 0x000a, 0x1bae: 0x000a, 0x1baf: 0x000a,\n\t0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a,\n\t// Block 0x6f, offset 0x1bc0\n\t0x1bc0: 0x000a, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, 0x1bc5: 0x000a,\n\t0x1bc6: 0x000a, 0x1bc7: 0x000a, 0x1bc8: 0x000a, 0x1bc9: 0x000a, 0x1bca: 0x000a, 0x1bcb: 0x000a,\n\t0x1bcc: 0x000a, 0x1bcd: 0x000a, 0x1bce: 0x000a, 0x1bcf: 0x000a, 0x1bd0: 0x000a, 0x1bd1: 0x000a,\n\t0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x000a, 0x1bd5: 0x000a,\n\t0x1bf0: 0x000a, 0x1bf1: 0x000a, 0x1bf2: 0x000a, 0x1bf3: 0x000a, 0x1bf4: 0x000a, 0x1bf5: 0x000a,\n\t0x1bf6: 0x000a, 0x1bf7: 0x000a, 0x1bf8: 0x000a, 0x1bf9: 0x000a, 0x1bfa: 0x000a, 0x1bfb: 0x000a,\n\t// Block 0x70, offset 0x1c00\n\t0x1c00: 0x0009, 0x1c01: 0x000a, 0x1c02: 0x000a, 0x1c03: 0x000a, 0x1c04: 0x000a,\n\t0x1c08: 0x003a, 0x1c09: 0x002a, 0x1c0a: 0x003a, 0x1c0b: 0x002a,\n\t0x1c0c: 0x003a, 0x1c0d: 0x002a, 0x1c0e: 0x003a, 0x1c0f: 0x002a, 0x1c10: 0x003a, 0x1c11: 0x002a,\n\t0x1c12: 0x000a, 0x1c13: 0x000a, 0x1c14: 0x003a, 0x1c15: 0x002a, 0x1c16: 0x003a, 0x1c17: 0x002a,\n\t0x1c18: 0x003a, 0x1c19: 0x002a, 0x1c1a: 0x003a, 0x1c1b: 0x002a, 0x1c1c: 0x000a, 0x1c1d: 0x000a,\n\t0x1c1e: 0x000a, 0x1c1f: 0x000a, 0x1c20: 0x000a,\n\t0x1c2a: 0x000c, 0x1c2b: 0x000c, 0x1c2c: 0x000c, 0x1c2d: 0x000c,\n\t0x1c30: 0x000a,\n\t0x1c36: 0x000a, 0x1c37: 0x000a,\n\t0x1c3d: 0x000a, 0x1c3e: 0x000a, 0x1c3f: 0x000a,\n\t// Block 0x71, offset 0x1c40\n\t0x1c59: 0x000c, 0x1c5a: 0x000c, 0x1c5b: 0x000a, 0x1c5c: 0x000a,\n\t0x1c60: 0x000a,\n\t// Block 0x72, offset 0x1c80\n\t0x1cbb: 0x000a,\n\t// Block 0x73, offset 0x1cc0\n\t0x1cc0: 0x000a, 0x1cc1: 0x000a, 0x1cc2: 0x000a, 0x1cc3: 0x000a, 0x1cc4: 0x000a, 0x1cc5: 0x000a,\n\t0x1cc6: 0x000a, 0x1cc7: 0x000a, 0x1cc8: 0x000a, 0x1cc9: 0x000a, 0x1cca: 0x000a, 0x1ccb: 0x000a,\n\t0x1ccc: 0x000a, 0x1ccd: 0x000a, 0x1cce: 0x000a, 0x1ccf: 0x000a, 0x1cd0: 0x000a, 0x1cd1: 0x000a,\n\t0x1cd2: 0x000a, 0x1cd3: 0x000a, 0x1cd4: 0x000a, 0x1cd5: 0x000a, 0x1cd6: 0x000a, 0x1cd7: 0x000a,\n\t0x1cd8: 0x000a, 0x1cd9: 0x000a, 0x1cda: 0x000a, 0x1cdb: 0x000a, 0x1cdc: 0x000a, 0x1cdd: 0x000a,\n\t0x1cde: 0x000a, 0x1cdf: 0x000a, 0x1ce0: 0x000a, 0x1ce1: 0x000a, 0x1ce2: 0x000a, 0x1ce3: 0x000a,\n\t// Block 0x74, offset 0x1d00\n\t0x1d1d: 0x000a,\n\t0x1d1e: 0x000a,\n\t// Block 0x75, offset 0x1d40\n\t0x1d50: 0x000a, 0x1d51: 0x000a,\n\t0x1d52: 0x000a, 0x1d53: 0x000a, 0x1d54: 0x000a, 0x1d55: 0x000a, 0x1d56: 0x000a, 0x1d57: 0x000a,\n\t0x1d58: 0x000a, 0x1d59: 0x000a, 0x1d5a: 0x000a, 0x1d5b: 0x000a, 0x1d5c: 0x000a, 0x1d5d: 0x000a,\n\t0x1d5e: 0x000a, 0x1d5f: 0x000a,\n\t0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a,\n\t// Block 0x76, offset 0x1d80\n\t0x1db1: 0x000a, 0x1db2: 0x000a, 0x1db3: 0x000a, 0x1db4: 0x000a, 0x1db5: 0x000a,\n\t0x1db6: 0x000a, 0x1db7: 0x000a, 0x1db8: 0x000a, 0x1db9: 0x000a, 0x1dba: 0x000a, 0x1dbb: 0x000a,\n\t0x1dbc: 0x000a, 0x1dbd: 0x000a, 0x1dbe: 0x000a, 0x1dbf: 0x000a,\n\t// Block 0x77, offset 0x1dc0\n\t0x1dcc: 0x000a, 0x1dcd: 0x000a, 0x1dce: 0x000a, 0x1dcf: 0x000a,\n\t// Block 0x78, offset 0x1e00\n\t0x1e37: 0x000a, 0x1e38: 0x000a, 0x1e39: 0x000a, 0x1e3a: 0x000a,\n\t// Block 0x79, offset 0x1e40\n\t0x1e5e: 0x000a, 0x1e5f: 0x000a,\n\t0x1e7f: 0x000a,\n\t// Block 0x7a, offset 0x1e80\n\t0x1e90: 0x000a, 0x1e91: 0x000a,\n\t0x1e92: 0x000a, 0x1e93: 0x000a, 0x1e94: 0x000a, 0x1e95: 0x000a, 0x1e96: 0x000a, 0x1e97: 0x000a,\n\t0x1e98: 0x000a, 0x1e99: 0x000a, 0x1e9a: 0x000a, 0x1e9b: 0x000a, 0x1e9c: 0x000a, 0x1e9d: 0x000a,\n\t0x1e9e: 0x000a, 0x1e9f: 0x000a, 0x1ea0: 0x000a, 0x1ea1: 0x000a, 0x1ea2: 0x000a, 0x1ea3: 0x000a,\n\t0x1ea4: 0x000a, 0x1ea5: 0x000a, 0x1ea6: 0x000a, 0x1ea7: 0x000a, 0x1ea8: 0x000a, 0x1ea9: 0x000a,\n\t0x1eaa: 0x000a, 0x1eab: 0x000a, 0x1eac: 0x000a, 0x1ead: 0x000a, 0x1eae: 0x000a, 0x1eaf: 0x000a,\n\t0x1eb0: 0x000a, 0x1eb1: 0x000a, 0x1eb2: 0x000a, 0x1eb3: 0x000a, 0x1eb4: 0x000a, 0x1eb5: 0x000a,\n\t0x1eb6: 0x000a, 0x1eb7: 0x000a, 0x1eb8: 0x000a, 0x1eb9: 0x000a, 0x1eba: 0x000a, 0x1ebb: 0x000a,\n\t0x1ebc: 0x000a, 0x1ebd: 0x000a, 0x1ebe: 0x000a, 0x1ebf: 0x000a,\n\t// Block 0x7b, offset 0x1ec0\n\t0x1ec0: 0x000a, 0x1ec1: 0x000a, 0x1ec2: 0x000a, 0x1ec3: 0x000a, 0x1ec4: 0x000a, 0x1ec5: 0x000a,\n\t0x1ec6: 0x000a,\n\t// Block 0x7c, offset 0x1f00\n\t0x1f0d: 0x000a, 0x1f0e: 0x000a, 0x1f0f: 0x000a,\n\t// Block 0x7d, offset 0x1f40\n\t0x1f6f: 0x000c,\n\t0x1f70: 0x000c, 0x1f71: 0x000c, 0x1f72: 0x000c, 0x1f73: 0x000a, 0x1f74: 0x000c, 0x1f75: 0x000c,\n\t0x1f76: 0x000c, 0x1f77: 0x000c, 0x1f78: 0x000c, 0x1f79: 0x000c, 0x1f7a: 0x000c, 0x1f7b: 0x000c,\n\t0x1f7c: 0x000c, 0x1f7d: 0x000c, 0x1f7e: 0x000a, 0x1f7f: 0x000a,\n\t// Block 0x7e, offset 0x1f80\n\t0x1f9e: 0x000c, 0x1f9f: 0x000c,\n\t// Block 0x7f, offset 0x1fc0\n\t0x1ff0: 0x000c, 0x1ff1: 0x000c,\n\t// Block 0x80, offset 0x2000\n\t0x2000: 0x000a, 0x2001: 0x000a, 0x2002: 0x000a, 0x2003: 0x000a, 0x2004: 0x000a, 0x2005: 0x000a,\n\t0x2006: 0x000a, 0x2007: 0x000a, 0x2008: 0x000a, 0x2009: 0x000a, 0x200a: 0x000a, 0x200b: 0x000a,\n\t0x200c: 0x000a, 0x200d: 0x000a, 0x200e: 0x000a, 0x200f: 0x000a, 0x2010: 0x000a, 0x2011: 0x000a,\n\t0x2012: 0x000a, 0x2013: 0x000a, 0x2014: 0x000a, 0x2015: 0x000a, 0x2016: 0x000a, 0x2017: 0x000a,\n\t0x2018: 0x000a, 0x2019: 0x000a, 0x201a: 0x000a, 0x201b: 0x000a, 0x201c: 0x000a, 0x201d: 0x000a,\n\t0x201e: 0x000a, 0x201f: 0x000a, 0x2020: 0x000a, 0x2021: 0x000a,\n\t// Block 0x81, offset 0x2040\n\t0x2048: 0x000a,\n\t// Block 0x82, offset 0x2080\n\t0x2082: 0x000c,\n\t0x2086: 0x000c, 0x208b: 0x000c,\n\t0x20a5: 0x000c, 0x20a6: 0x000c, 0x20a8: 0x000a, 0x20a9: 0x000a,\n\t0x20aa: 0x000a, 0x20ab: 0x000a,\n\t0x20b8: 0x0004, 0x20b9: 0x0004,\n\t// Block 0x83, offset 0x20c0\n\t0x20f4: 0x000a, 0x20f5: 0x000a,\n\t0x20f6: 0x000a, 0x20f7: 0x000a,\n\t// Block 0x84, offset 0x2100\n\t0x2104: 0x000c, 0x2105: 0x000c,\n\t0x2120: 0x000c, 0x2121: 0x000c, 0x2122: 0x000c, 0x2123: 0x000c,\n\t0x2124: 0x000c, 0x2125: 0x000c, 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c,\n\t0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, 0x212e: 0x000c, 0x212f: 0x000c,\n\t0x2130: 0x000c, 0x2131: 0x000c,\n\t// Block 0x85, offset 0x2140\n\t0x2166: 0x000c, 0x2167: 0x000c, 0x2168: 0x000c, 0x2169: 0x000c,\n\t0x216a: 0x000c, 0x216b: 0x000c, 0x216c: 0x000c, 0x216d: 0x000c,\n\t// Block 0x86, offset 0x2180\n\t0x2187: 0x000c, 0x2188: 0x000c, 0x2189: 0x000c, 0x218a: 0x000c, 0x218b: 0x000c,\n\t0x218c: 0x000c, 0x218d: 0x000c, 0x218e: 0x000c, 0x218f: 0x000c, 0x2190: 0x000c, 0x2191: 0x000c,\n\t// Block 0x87, offset 0x21c0\n\t0x21c0: 0x000c, 0x21c1: 0x000c, 0x21c2: 0x000c,\n\t0x21f3: 0x000c,\n\t0x21f6: 0x000c, 0x21f7: 0x000c, 0x21f8: 0x000c, 0x21f9: 0x000c,\n\t0x21fc: 0x000c,\n\t// Block 0x88, offset 0x2200\n\t0x2225: 0x000c,\n\t// Block 0x89, offset 0x2240\n\t0x2269: 0x000c,\n\t0x226a: 0x000c, 0x226b: 0x000c, 0x226c: 0x000c, 0x226d: 0x000c, 0x226e: 0x000c,\n\t0x2271: 0x000c, 0x2272: 0x000c, 0x2275: 0x000c,\n\t0x2276: 0x000c,\n\t// Block 0x8a, offset 0x2280\n\t0x2283: 0x000c,\n\t0x228c: 0x000c,\n\t0x22bc: 0x000c,\n\t// Block 0x8b, offset 0x22c0\n\t0x22f0: 0x000c, 0x22f2: 0x000c, 0x22f3: 0x000c, 0x22f4: 0x000c,\n\t0x22f7: 0x000c, 0x22f8: 0x000c,\n\t0x22fe: 0x000c, 0x22ff: 0x000c,\n\t// Block 0x8c, offset 0x2300\n\t0x2301: 0x000c,\n\t0x232c: 0x000c, 0x232d: 0x000c,\n\t0x2336: 0x000c,\n\t// Block 0x8d, offset 0x2340\n\t0x2365: 0x000c, 0x2368: 0x000c,\n\t0x236d: 0x000c,\n\t// Block 0x8e, offset 0x2380\n\t0x239d: 0x0001,\n\t0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001,\n\t0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003,\n\t0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001,\n\t0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001,\n\t0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001,\n\t0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001,\n\t// Block 0x8f, offset 0x23c0\n\t0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001,\n\t0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001,\n\t0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d,\n\t0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d,\n\t0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d,\n\t0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d,\n\t0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d,\n\t0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d,\n\t0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d,\n\t0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d,\n\t0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d,\n\t// Block 0x90, offset 0x2400\n\t0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d,\n\t0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d,\n\t0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d,\n\t0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d,\n\t0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d,\n\t0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d,\n\t0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d,\n\t0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d,\n\t0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d,\n\t0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d,\n\t0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a,\n\t// Block 0x91, offset 0x2440\n\t0x2440: 0x000d, 0x2441: 0x000d, 0x2442: 0x000d, 0x2443: 0x000d, 0x2444: 0x000d, 0x2445: 0x000d,\n\t0x2446: 0x000d, 0x2447: 0x000d, 0x2448: 0x000d, 0x2449: 0x000d, 0x244a: 0x000d, 0x244b: 0x000d,\n\t0x244c: 0x000d, 0x244d: 0x000d, 0x244e: 0x000d, 0x244f: 0x000d, 0x2450: 0x000b, 0x2451: 0x000b,\n\t0x2452: 0x000b, 0x2453: 0x000b, 0x2454: 0x000b, 0x2455: 0x000b, 0x2456: 0x000b, 0x2457: 0x000b,\n\t0x2458: 0x000b, 0x2459: 0x000b, 0x245a: 0x000b, 0x245b: 0x000b, 0x245c: 0x000b, 0x245d: 0x000b,\n\t0x245e: 0x000b, 0x245f: 0x000b, 0x2460: 0x000b, 0x2461: 0x000b, 0x2462: 0x000b, 0x2463: 0x000b,\n\t0x2464: 0x000b, 0x2465: 0x000b, 0x2466: 0x000b, 0x2467: 0x000b, 0x2468: 0x000b, 0x2469: 0x000b,\n\t0x246a: 0x000b, 0x246b: 0x000b, 0x246c: 0x000b, 0x246d: 0x000b, 0x246e: 0x000b, 0x246f: 0x000b,\n\t0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d,\n\t0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d,\n\t0x247c: 0x000d, 0x247d: 0x000a, 0x247e: 0x000d, 0x247f: 0x000d,\n\t// Block 0x92, offset 0x2480\n\t0x2480: 0x000c, 0x2481: 0x000c, 0x2482: 0x000c, 0x2483: 0x000c, 0x2484: 0x000c, 0x2485: 0x000c,\n\t0x2486: 0x000c, 0x2487: 0x000c, 0x2488: 0x000c, 0x2489: 0x000c, 0x248a: 0x000c, 0x248b: 0x000c,\n\t0x248c: 0x000c, 0x248d: 0x000c, 0x248e: 0x000c, 0x248f: 0x000c, 0x2490: 0x000a, 0x2491: 0x000a,\n\t0x2492: 0x000a, 0x2493: 0x000a, 0x2494: 0x000a, 0x2495: 0x000a, 0x2496: 0x000a, 0x2497: 0x000a,\n\t0x2498: 0x000a, 0x2499: 0x000a,\n\t0x24a0: 0x000c, 0x24a1: 0x000c, 0x24a2: 0x000c, 0x24a3: 0x000c,\n\t0x24a4: 0x000c, 0x24a5: 0x000c, 0x24a6: 0x000c, 0x24a7: 0x000c, 0x24a8: 0x000c, 0x24a9: 0x000c,\n\t0x24aa: 0x000c, 0x24ab: 0x000c, 0x24ac: 0x000c, 0x24ad: 0x000c, 0x24ae: 0x000c, 0x24af: 0x000c,\n\t0x24b0: 0x000a, 0x24b1: 0x000a, 0x24b2: 0x000a, 0x24b3: 0x000a, 0x24b4: 0x000a, 0x24b5: 0x000a,\n\t0x24b6: 0x000a, 0x24b7: 0x000a, 0x24b8: 0x000a, 0x24b9: 0x000a, 0x24ba: 0x000a, 0x24bb: 0x000a,\n\t0x24bc: 0x000a, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a,\n\t// Block 0x93, offset 0x24c0\n\t0x24c0: 0x000a, 0x24c1: 0x000a, 0x24c2: 0x000a, 0x24c3: 0x000a, 0x24c4: 0x000a, 0x24c5: 0x000a,\n\t0x24c6: 0x000a, 0x24c7: 0x000a, 0x24c8: 0x000a, 0x24c9: 0x000a, 0x24ca: 0x000a, 0x24cb: 0x000a,\n\t0x24cc: 0x000a, 0x24cd: 0x000a, 0x24ce: 0x000a, 0x24cf: 0x000a, 0x24d0: 0x0006, 0x24d1: 0x000a,\n\t0x24d2: 0x0006, 0x24d4: 0x000a, 0x24d5: 0x0006, 0x24d6: 0x000a, 0x24d7: 0x000a,\n\t0x24d8: 0x000a, 0x24d9: 0x009a, 0x24da: 0x008a, 0x24db: 0x007a, 0x24dc: 0x006a, 0x24dd: 0x009a,\n\t0x24de: 0x008a, 0x24df: 0x0004, 0x24e0: 0x000a, 0x24e1: 0x000a, 0x24e2: 0x0003, 0x24e3: 0x0003,\n\t0x24e4: 0x000a, 0x24e5: 0x000a, 0x24e6: 0x000a, 0x24e8: 0x000a, 0x24e9: 0x0004,\n\t0x24ea: 0x0004, 0x24eb: 0x000a,\n\t0x24f0: 0x000d, 0x24f1: 0x000d, 0x24f2: 0x000d, 0x24f3: 0x000d, 0x24f4: 0x000d, 0x24f5: 0x000d,\n\t0x24f6: 0x000d, 0x24f7: 0x000d, 0x24f8: 0x000d, 0x24f9: 0x000d, 0x24fa: 0x000d, 0x24fb: 0x000d,\n\t0x24fc: 0x000d, 0x24fd: 0x000d, 0x24fe: 0x000d, 0x24ff: 0x000d,\n\t// Block 0x94, offset 0x2500\n\t0x2500: 0x000d, 0x2501: 0x000d, 0x2502: 0x000d, 0x2503: 0x000d, 0x2504: 0x000d, 0x2505: 0x000d,\n\t0x2506: 0x000d, 0x2507: 0x000d, 0x2508: 0x000d, 0x2509: 0x000d, 0x250a: 0x000d, 0x250b: 0x000d,\n\t0x250c: 0x000d, 0x250d: 0x000d, 0x250e: 0x000d, 0x250f: 0x000d, 0x2510: 0x000d, 0x2511: 0x000d,\n\t0x2512: 0x000d, 0x2513: 0x000d, 0x2514: 0x000d, 0x2515: 0x000d, 0x2516: 0x000d, 0x2517: 0x000d,\n\t0x2518: 0x000d, 0x2519: 0x000d, 0x251a: 0x000d, 0x251b: 0x000d, 0x251c: 0x000d, 0x251d: 0x000d,\n\t0x251e: 0x000d, 0x251f: 0x000d, 0x2520: 0x000d, 0x2521: 0x000d, 0x2522: 0x000d, 0x2523: 0x000d,\n\t0x2524: 0x000d, 0x2525: 0x000d, 0x2526: 0x000d, 0x2527: 0x000d, 0x2528: 0x000d, 0x2529: 0x000d,\n\t0x252a: 0x000d, 0x252b: 0x000d, 0x252c: 0x000d, 0x252d: 0x000d, 0x252e: 0x000d, 0x252f: 0x000d,\n\t0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d,\n\t0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d,\n\t0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000b,\n\t// Block 0x95, offset 0x2540\n\t0x2541: 0x000a, 0x2542: 0x000a, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0004,\n\t0x2546: 0x000a, 0x2547: 0x000a, 0x2548: 0x003a, 0x2549: 0x002a, 0x254a: 0x000a, 0x254b: 0x0003,\n\t0x254c: 0x0006, 0x254d: 0x0003, 0x254e: 0x0006, 0x254f: 0x0006, 0x2550: 0x0002, 0x2551: 0x0002,\n\t0x2552: 0x0002, 0x2553: 0x0002, 0x2554: 0x0002, 0x2555: 0x0002, 0x2556: 0x0002, 0x2557: 0x0002,\n\t0x2558: 0x0002, 0x2559: 0x0002, 0x255a: 0x0006, 0x255b: 0x000a, 0x255c: 0x000a, 0x255d: 0x000a,\n\t0x255e: 0x000a, 0x255f: 0x000a, 0x2560: 0x000a,\n\t0x257b: 0x005a,\n\t0x257c: 0x000a, 0x257d: 0x004a, 0x257e: 0x000a, 0x257f: 0x000a,\n\t// Block 0x96, offset 0x2580\n\t0x2580: 0x000a,\n\t0x259b: 0x005a, 0x259c: 0x000a, 0x259d: 0x004a,\n\t0x259e: 0x000a, 0x259f: 0x00fa, 0x25a0: 0x00ea, 0x25a1: 0x000a, 0x25a2: 0x003a, 0x25a3: 0x002a,\n\t0x25a4: 0x000a, 0x25a5: 0x000a,\n\t// Block 0x97, offset 0x25c0\n\t0x25e0: 0x0004, 0x25e1: 0x0004, 0x25e2: 0x000a, 0x25e3: 0x000a,\n\t0x25e4: 0x000a, 0x25e5: 0x0004, 0x25e6: 0x0004, 0x25e8: 0x000a, 0x25e9: 0x000a,\n\t0x25ea: 0x000a, 0x25eb: 0x000a, 0x25ec: 0x000a, 0x25ed: 0x000a, 0x25ee: 0x000a,\n\t0x25f0: 0x000b, 0x25f1: 0x000b, 0x25f2: 0x000b, 0x25f3: 0x000b, 0x25f4: 0x000b, 0x25f5: 0x000b,\n\t0x25f6: 0x000b, 0x25f7: 0x000b, 0x25f8: 0x000b, 0x25f9: 0x000a, 0x25fa: 0x000a, 0x25fb: 0x000a,\n\t0x25fc: 0x000a, 0x25fd: 0x000a, 0x25fe: 0x000b, 0x25ff: 0x000b,\n\t// Block 0x98, offset 0x2600\n\t0x2601: 0x000a,\n\t// Block 0x99, offset 0x2640\n\t0x2640: 0x000a, 0x2641: 0x000a, 0x2642: 0x000a, 0x2643: 0x000a, 0x2644: 0x000a, 0x2645: 0x000a,\n\t0x2646: 0x000a, 0x2647: 0x000a, 0x2648: 0x000a, 0x2649: 0x000a, 0x264a: 0x000a, 0x264b: 0x000a,\n\t0x264c: 0x000a, 0x2650: 0x000a, 0x2651: 0x000a,\n\t0x2652: 0x000a, 0x2653: 0x000a, 0x2654: 0x000a, 0x2655: 0x000a, 0x2656: 0x000a, 0x2657: 0x000a,\n\t0x2658: 0x000a, 0x2659: 0x000a, 0x265a: 0x000a, 0x265b: 0x000a,\n\t0x2660: 0x000a,\n\t// Block 0x9a, offset 0x2680\n\t0x26bd: 0x000c,\n\t// Block 0x9b, offset 0x26c0\n\t0x26e0: 0x000c, 0x26e1: 0x0002, 0x26e2: 0x0002, 0x26e3: 0x0002,\n\t0x26e4: 0x0002, 0x26e5: 0x0002, 0x26e6: 0x0002, 0x26e7: 0x0002, 0x26e8: 0x0002, 0x26e9: 0x0002,\n\t0x26ea: 0x0002, 0x26eb: 0x0002, 0x26ec: 0x0002, 0x26ed: 0x0002, 0x26ee: 0x0002, 0x26ef: 0x0002,\n\t0x26f0: 0x0002, 0x26f1: 0x0002, 0x26f2: 0x0002, 0x26f3: 0x0002, 0x26f4: 0x0002, 0x26f5: 0x0002,\n\t0x26f6: 0x0002, 0x26f7: 0x0002, 0x26f8: 0x0002, 0x26f9: 0x0002, 0x26fa: 0x0002, 0x26fb: 0x0002,\n\t// Block 0x9c, offset 0x2700\n\t0x2736: 0x000c, 0x2737: 0x000c, 0x2738: 0x000c, 0x2739: 0x000c, 0x273a: 0x000c,\n\t// Block 0x9d, offset 0x2740\n\t0x2740: 0x0001, 0x2741: 0x0001, 0x2742: 0x0001, 0x2743: 0x0001, 0x2744: 0x0001, 0x2745: 0x0001,\n\t0x2746: 0x0001, 0x2747: 0x0001, 0x2748: 0x0001, 0x2749: 0x0001, 0x274a: 0x0001, 0x274b: 0x0001,\n\t0x274c: 0x0001, 0x274d: 0x0001, 0x274e: 0x0001, 0x274f: 0x0001, 0x2750: 0x0001, 0x2751: 0x0001,\n\t0x2752: 0x0001, 0x2753: 0x0001, 0x2754: 0x0001, 0x2755: 0x0001, 0x2756: 0x0001, 0x2757: 0x0001,\n\t0x2758: 0x0001, 0x2759: 0x0001, 0x275a: 0x0001, 0x275b: 0x0001, 0x275c: 0x0001, 0x275d: 0x0001,\n\t0x275e: 0x0001, 0x275f: 0x0001, 0x2760: 0x0001, 0x2761: 0x0001, 0x2762: 0x0001, 0x2763: 0x0001,\n\t0x2764: 0x0001, 0x2765: 0x0001, 0x2766: 0x0001, 0x2767: 0x0001, 0x2768: 0x0001, 0x2769: 0x0001,\n\t0x276a: 0x0001, 0x276b: 0x0001, 0x276c: 0x0001, 0x276d: 0x0001, 0x276e: 0x0001, 0x276f: 0x0001,\n\t0x2770: 0x0001, 0x2771: 0x0001, 0x2772: 0x0001, 0x2773: 0x0001, 0x2774: 0x0001, 0x2775: 0x0001,\n\t0x2776: 0x0001, 0x2777: 0x0001, 0x2778: 0x0001, 0x2779: 0x0001, 0x277a: 0x0001, 0x277b: 0x0001,\n\t0x277c: 0x0001, 0x277d: 0x0001, 0x277e: 0x0001, 0x277f: 0x0001,\n\t// Block 0x9e, offset 0x2780\n\t0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001,\n\t0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001,\n\t0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001,\n\t0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001,\n\t0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001,\n\t0x279e: 0x0001, 0x279f: 0x000a, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001,\n\t0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001,\n\t0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001,\n\t0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001,\n\t0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001,\n\t0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001,\n\t// Block 0x9f, offset 0x27c0\n\t0x27c0: 0x0001, 0x27c1: 0x000c, 0x27c2: 0x000c, 0x27c3: 0x000c, 0x27c4: 0x0001, 0x27c5: 0x000c,\n\t0x27c6: 0x000c, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001,\n\t0x27cc: 0x000c, 0x27cd: 0x000c, 0x27ce: 0x000c, 0x27cf: 0x000c, 0x27d0: 0x0001, 0x27d1: 0x0001,\n\t0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001,\n\t0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001,\n\t0x27de: 0x0001, 0x27df: 0x0001, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001,\n\t0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001,\n\t0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001,\n\t0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001,\n\t0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x000c, 0x27f9: 0x000c, 0x27fa: 0x000c, 0x27fb: 0x0001,\n\t0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x000c,\n\t// Block 0xa0, offset 0x2800\n\t0x2800: 0x0001, 0x2801: 0x0001, 0x2802: 0x0001, 0x2803: 0x0001, 0x2804: 0x0001, 0x2805: 0x0001,\n\t0x2806: 0x0001, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001,\n\t0x280c: 0x0001, 0x280d: 0x0001, 0x280e: 0x0001, 0x280f: 0x0001, 0x2810: 0x0001, 0x2811: 0x0001,\n\t0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001,\n\t0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001,\n\t0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001,\n\t0x2824: 0x0001, 0x2825: 0x000c, 0x2826: 0x000c, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001,\n\t0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001,\n\t0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001,\n\t0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x0001, 0x2839: 0x0001, 0x283a: 0x0001, 0x283b: 0x0001,\n\t0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x0001,\n\t// Block 0xa1, offset 0x2840\n\t0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001,\n\t0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001,\n\t0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001,\n\t0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001,\n\t0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001,\n\t0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001,\n\t0x2864: 0x0001, 0x2865: 0x0001, 0x2866: 0x0001, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001,\n\t0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001,\n\t0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001,\n\t0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x000a, 0x287a: 0x000a, 0x287b: 0x000a,\n\t0x287c: 0x000a, 0x287d: 0x000a, 0x287e: 0x000a, 0x287f: 0x000a,\n\t// Block 0xa2, offset 0x2880\n\t0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001,\n\t0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001,\n\t0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001,\n\t0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001,\n\t0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001,\n\t0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0005, 0x28a1: 0x0005, 0x28a2: 0x0005, 0x28a3: 0x0005,\n\t0x28a4: 0x0005, 0x28a5: 0x0005, 0x28a6: 0x0005, 0x28a7: 0x0005, 0x28a8: 0x0005, 0x28a9: 0x0005,\n\t0x28aa: 0x0005, 0x28ab: 0x0005, 0x28ac: 0x0005, 0x28ad: 0x0005, 0x28ae: 0x0005, 0x28af: 0x0005,\n\t0x28b0: 0x0005, 0x28b1: 0x0005, 0x28b2: 0x0005, 0x28b3: 0x0005, 0x28b4: 0x0005, 0x28b5: 0x0005,\n\t0x28b6: 0x0005, 0x28b7: 0x0005, 0x28b8: 0x0005, 0x28b9: 0x0005, 0x28ba: 0x0005, 0x28bb: 0x0005,\n\t0x28bc: 0x0005, 0x28bd: 0x0005, 0x28be: 0x0005, 0x28bf: 0x0001,\n\t// Block 0xa3, offset 0x28c0\n\t0x28c1: 0x000c,\n\t0x28f8: 0x000c, 0x28f9: 0x000c, 0x28fa: 0x000c, 0x28fb: 0x000c,\n\t0x28fc: 0x000c, 0x28fd: 0x000c, 0x28fe: 0x000c, 0x28ff: 0x000c,\n\t// Block 0xa4, offset 0x2900\n\t0x2900: 0x000c, 0x2901: 0x000c, 0x2902: 0x000c, 0x2903: 0x000c, 0x2904: 0x000c, 0x2905: 0x000c,\n\t0x2906: 0x000c,\n\t0x2912: 0x000a, 0x2913: 0x000a, 0x2914: 0x000a, 0x2915: 0x000a, 0x2916: 0x000a, 0x2917: 0x000a,\n\t0x2918: 0x000a, 0x2919: 0x000a, 0x291a: 0x000a, 0x291b: 0x000a, 0x291c: 0x000a, 0x291d: 0x000a,\n\t0x291e: 0x000a, 0x291f: 0x000a, 0x2920: 0x000a, 0x2921: 0x000a, 0x2922: 0x000a, 0x2923: 0x000a,\n\t0x2924: 0x000a, 0x2925: 0x000a,\n\t0x293f: 0x000c,\n\t// Block 0xa5, offset 0x2940\n\t0x2940: 0x000c, 0x2941: 0x000c,\n\t0x2973: 0x000c, 0x2974: 0x000c, 0x2975: 0x000c,\n\t0x2976: 0x000c, 0x2979: 0x000c, 0x297a: 0x000c,\n\t// Block 0xa6, offset 0x2980\n\t0x2980: 0x000c, 0x2981: 0x000c, 0x2982: 0x000c,\n\t0x29a7: 0x000c, 0x29a8: 0x000c, 0x29a9: 0x000c,\n\t0x29aa: 0x000c, 0x29ab: 0x000c, 0x29ad: 0x000c, 0x29ae: 0x000c, 0x29af: 0x000c,\n\t0x29b0: 0x000c, 0x29b1: 0x000c, 0x29b2: 0x000c, 0x29b3: 0x000c, 0x29b4: 0x000c,\n\t// Block 0xa7, offset 0x29c0\n\t0x29f3: 0x000c,\n\t// Block 0xa8, offset 0x2a00\n\t0x2a00: 0x000c, 0x2a01: 0x000c,\n\t0x2a36: 0x000c, 0x2a37: 0x000c, 0x2a38: 0x000c, 0x2a39: 0x000c, 0x2a3a: 0x000c, 0x2a3b: 0x000c,\n\t0x2a3c: 0x000c, 0x2a3d: 0x000c, 0x2a3e: 0x000c,\n\t// Block 0xa9, offset 0x2a40\n\t0x2a4a: 0x000c, 0x2a4b: 0x000c,\n\t0x2a4c: 0x000c,\n\t// Block 0xaa, offset 0x2a80\n\t0x2aaf: 0x000c,\n\t0x2ab0: 0x000c, 0x2ab1: 0x000c, 0x2ab4: 0x000c,\n\t0x2ab6: 0x000c, 0x2ab7: 0x000c,\n\t0x2abe: 0x000c,\n\t// Block 0xab, offset 0x2ac0\n\t0x2adf: 0x000c, 0x2ae3: 0x000c,\n\t0x2ae4: 0x000c, 0x2ae5: 0x000c, 0x2ae6: 0x000c, 0x2ae7: 0x000c, 0x2ae8: 0x000c, 0x2ae9: 0x000c,\n\t0x2aea: 0x000c,\n\t// Block 0xac, offset 0x2b00\n\t0x2b00: 0x000c, 0x2b01: 0x000c,\n\t0x2b3c: 0x000c,\n\t// Block 0xad, offset 0x2b40\n\t0x2b40: 0x000c,\n\t0x2b66: 0x000c, 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c,\n\t0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6c: 0x000c,\n\t0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c,\n\t// Block 0xae, offset 0x2b80\n\t0x2bb8: 0x000c, 0x2bb9: 0x000c, 0x2bba: 0x000c, 0x2bbb: 0x000c,\n\t0x2bbc: 0x000c, 0x2bbd: 0x000c, 0x2bbe: 0x000c, 0x2bbf: 0x000c,\n\t// Block 0xaf, offset 0x2bc0\n\t0x2bc2: 0x000c, 0x2bc3: 0x000c, 0x2bc4: 0x000c,\n\t0x2bc6: 0x000c,\n\t// Block 0xb0, offset 0x2c00\n\t0x2c33: 0x000c, 0x2c34: 0x000c, 0x2c35: 0x000c,\n\t0x2c36: 0x000c, 0x2c37: 0x000c, 0x2c38: 0x000c, 0x2c3a: 0x000c,\n\t0x2c3f: 0x000c,\n\t// Block 0xb1, offset 0x2c40\n\t0x2c40: 0x000c, 0x2c42: 0x000c, 0x2c43: 0x000c,\n\t// Block 0xb2, offset 0x2c80\n\t0x2cb2: 0x000c, 0x2cb3: 0x000c, 0x2cb4: 0x000c, 0x2cb5: 0x000c,\n\t0x2cbc: 0x000c, 0x2cbd: 0x000c, 0x2cbf: 0x000c,\n\t// Block 0xb3, offset 0x2cc0\n\t0x2cc0: 0x000c,\n\t0x2cdc: 0x000c, 0x2cdd: 0x000c,\n\t// Block 0xb4, offset 0x2d00\n\t0x2d33: 0x000c, 0x2d34: 0x000c, 0x2d35: 0x000c,\n\t0x2d36: 0x000c, 0x2d37: 0x000c, 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c,\n\t0x2d3d: 0x000c, 0x2d3f: 0x000c,\n\t// Block 0xb5, offset 0x2d40\n\t0x2d40: 0x000c,\n\t0x2d60: 0x000a, 0x2d61: 0x000a, 0x2d62: 0x000a, 0x2d63: 0x000a,\n\t0x2d64: 0x000a, 0x2d65: 0x000a, 0x2d66: 0x000a, 0x2d67: 0x000a, 0x2d68: 0x000a, 0x2d69: 0x000a,\n\t0x2d6a: 0x000a, 0x2d6b: 0x000a, 0x2d6c: 0x000a,\n\t// Block 0xb6, offset 0x2d80\n\t0x2dab: 0x000c, 0x2dad: 0x000c,\n\t0x2db0: 0x000c, 0x2db1: 0x000c, 0x2db2: 0x000c, 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c,\n\t0x2db7: 0x000c,\n\t// Block 0xb7, offset 0x2dc0\n\t0x2ddd: 0x000c,\n\t0x2dde: 0x000c, 0x2ddf: 0x000c, 0x2de2: 0x000c, 0x2de3: 0x000c,\n\t0x2de4: 0x000c, 0x2de5: 0x000c, 0x2de7: 0x000c, 0x2de8: 0x000c, 0x2de9: 0x000c,\n\t0x2dea: 0x000c, 0x2deb: 0x000c,\n\t// Block 0xb8, offset 0x2e00\n\t0x2e30: 0x000c, 0x2e31: 0x000c, 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c,\n\t0x2e36: 0x000c, 0x2e38: 0x000c, 0x2e39: 0x000c, 0x2e3a: 0x000c, 0x2e3b: 0x000c,\n\t0x2e3c: 0x000c, 0x2e3d: 0x000c,\n\t// Block 0xb9, offset 0x2e40\n\t0x2e52: 0x000c, 0x2e53: 0x000c, 0x2e54: 0x000c, 0x2e55: 0x000c, 0x2e56: 0x000c, 0x2e57: 0x000c,\n\t0x2e58: 0x000c, 0x2e59: 0x000c, 0x2e5a: 0x000c, 0x2e5b: 0x000c, 0x2e5c: 0x000c, 0x2e5d: 0x000c,\n\t0x2e5e: 0x000c, 0x2e5f: 0x000c, 0x2e60: 0x000c, 0x2e61: 0x000c, 0x2e62: 0x000c, 0x2e63: 0x000c,\n\t0x2e64: 0x000c, 0x2e65: 0x000c, 0x2e66: 0x000c, 0x2e67: 0x000c,\n\t0x2e6a: 0x000c, 0x2e6b: 0x000c, 0x2e6c: 0x000c, 0x2e6d: 0x000c, 0x2e6e: 0x000c, 0x2e6f: 0x000c,\n\t0x2e70: 0x000c, 0x2e72: 0x000c, 0x2e73: 0x000c, 0x2e75: 0x000c,\n\t0x2e76: 0x000c,\n\t// Block 0xba, offset 0x2e80\n\t0x2eb0: 0x000c, 0x2eb1: 0x000c, 0x2eb2: 0x000c, 0x2eb3: 0x000c, 0x2eb4: 0x000c,\n\t// Block 0xbb, offset 0x2ec0\n\t0x2ef0: 0x000c, 0x2ef1: 0x000c, 0x2ef2: 0x000c, 0x2ef3: 0x000c, 0x2ef4: 0x000c, 0x2ef5: 0x000c,\n\t0x2ef6: 0x000c,\n\t// Block 0xbc, offset 0x2f00\n\t0x2f0f: 0x000c, 0x2f10: 0x000c, 0x2f11: 0x000c,\n\t0x2f12: 0x000c,\n\t// Block 0xbd, offset 0x2f40\n\t0x2f5d: 0x000c,\n\t0x2f5e: 0x000c, 0x2f60: 0x000b, 0x2f61: 0x000b, 0x2f62: 0x000b, 0x2f63: 0x000b,\n\t// Block 0xbe, offset 0x2f80\n\t0x2fa7: 0x000c, 0x2fa8: 0x000c, 0x2fa9: 0x000c,\n\t0x2fb3: 0x000b, 0x2fb4: 0x000b, 0x2fb5: 0x000b,\n\t0x2fb6: 0x000b, 0x2fb7: 0x000b, 0x2fb8: 0x000b, 0x2fb9: 0x000b, 0x2fba: 0x000b, 0x2fbb: 0x000c,\n\t0x2fbc: 0x000c, 0x2fbd: 0x000c, 0x2fbe: 0x000c, 0x2fbf: 0x000c,\n\t// Block 0xbf, offset 0x2fc0\n\t0x2fc0: 0x000c, 0x2fc1: 0x000c, 0x2fc2: 0x000c, 0x2fc5: 0x000c,\n\t0x2fc6: 0x000c, 0x2fc7: 0x000c, 0x2fc8: 0x000c, 0x2fc9: 0x000c, 0x2fca: 0x000c, 0x2fcb: 0x000c,\n\t0x2fea: 0x000c, 0x2feb: 0x000c, 0x2fec: 0x000c, 0x2fed: 0x000c,\n\t// Block 0xc0, offset 0x3000\n\t0x3000: 0x000a, 0x3001: 0x000a, 0x3002: 0x000c, 0x3003: 0x000c, 0x3004: 0x000c, 0x3005: 0x000a,\n\t// Block 0xc1, offset 0x3040\n\t0x3040: 0x000a, 0x3041: 0x000a, 0x3042: 0x000a, 0x3043: 0x000a, 0x3044: 0x000a, 0x3045: 0x000a,\n\t0x3046: 0x000a, 0x3047: 0x000a, 0x3048: 0x000a, 0x3049: 0x000a, 0x304a: 0x000a, 0x304b: 0x000a,\n\t0x304c: 0x000a, 0x304d: 0x000a, 0x304e: 0x000a, 0x304f: 0x000a, 0x3050: 0x000a, 0x3051: 0x000a,\n\t0x3052: 0x000a, 0x3053: 0x000a, 0x3054: 0x000a, 0x3055: 0x000a, 0x3056: 0x000a,\n\t// Block 0xc2, offset 0x3080\n\t0x309b: 0x000a,\n\t// Block 0xc3, offset 0x30c0\n\t0x30d5: 0x000a,\n\t// Block 0xc4, offset 0x3100\n\t0x310f: 0x000a,\n\t// Block 0xc5, offset 0x3140\n\t0x3149: 0x000a,\n\t// Block 0xc6, offset 0x3180\n\t0x3183: 0x000a,\n\t0x318e: 0x0002, 0x318f: 0x0002, 0x3190: 0x0002, 0x3191: 0x0002,\n\t0x3192: 0x0002, 0x3193: 0x0002, 0x3194: 0x0002, 0x3195: 0x0002, 0x3196: 0x0002, 0x3197: 0x0002,\n\t0x3198: 0x0002, 0x3199: 0x0002, 0x319a: 0x0002, 0x319b: 0x0002, 0x319c: 0x0002, 0x319d: 0x0002,\n\t0x319e: 0x0002, 0x319f: 0x0002, 0x31a0: 0x0002, 0x31a1: 0x0002, 0x31a2: 0x0002, 0x31a3: 0x0002,\n\t0x31a4: 0x0002, 0x31a5: 0x0002, 0x31a6: 0x0002, 0x31a7: 0x0002, 0x31a8: 0x0002, 0x31a9: 0x0002,\n\t0x31aa: 0x0002, 0x31ab: 0x0002, 0x31ac: 0x0002, 0x31ad: 0x0002, 0x31ae: 0x0002, 0x31af: 0x0002,\n\t0x31b0: 0x0002, 0x31b1: 0x0002, 0x31b2: 0x0002, 0x31b3: 0x0002, 0x31b4: 0x0002, 0x31b5: 0x0002,\n\t0x31b6: 0x0002, 0x31b7: 0x0002, 0x31b8: 0x0002, 0x31b9: 0x0002, 0x31ba: 0x0002, 0x31bb: 0x0002,\n\t0x31bc: 0x0002, 0x31bd: 0x0002, 0x31be: 0x0002, 0x31bf: 0x0002,\n\t// Block 0xc7, offset 0x31c0\n\t0x31c0: 0x000c, 0x31c1: 0x000c, 0x31c2: 0x000c, 0x31c3: 0x000c, 0x31c4: 0x000c, 0x31c5: 0x000c,\n\t0x31c6: 0x000c, 0x31c7: 0x000c, 0x31c8: 0x000c, 0x31c9: 0x000c, 0x31ca: 0x000c, 0x31cb: 0x000c,\n\t0x31cc: 0x000c, 0x31cd: 0x000c, 0x31ce: 0x000c, 0x31cf: 0x000c, 0x31d0: 0x000c, 0x31d1: 0x000c,\n\t0x31d2: 0x000c, 0x31d3: 0x000c, 0x31d4: 0x000c, 0x31d5: 0x000c, 0x31d6: 0x000c, 0x31d7: 0x000c,\n\t0x31d8: 0x000c, 0x31d9: 0x000c, 0x31da: 0x000c, 0x31db: 0x000c, 0x31dc: 0x000c, 0x31dd: 0x000c,\n\t0x31de: 0x000c, 0x31df: 0x000c, 0x31e0: 0x000c, 0x31e1: 0x000c, 0x31e2: 0x000c, 0x31e3: 0x000c,\n\t0x31e4: 0x000c, 0x31e5: 0x000c, 0x31e6: 0x000c, 0x31e7: 0x000c, 0x31e8: 0x000c, 0x31e9: 0x000c,\n\t0x31ea: 0x000c, 0x31eb: 0x000c, 0x31ec: 0x000c, 0x31ed: 0x000c, 0x31ee: 0x000c, 0x31ef: 0x000c,\n\t0x31f0: 0x000c, 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c,\n\t0x31f6: 0x000c, 0x31fb: 0x000c,\n\t0x31fc: 0x000c, 0x31fd: 0x000c, 0x31fe: 0x000c, 0x31ff: 0x000c,\n\t// Block 0xc8, offset 0x3200\n\t0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c,\n\t0x3206: 0x000c, 0x3207: 0x000c, 0x3208: 0x000c, 0x3209: 0x000c, 0x320a: 0x000c, 0x320b: 0x000c,\n\t0x320c: 0x000c, 0x320d: 0x000c, 0x320e: 0x000c, 0x320f: 0x000c, 0x3210: 0x000c, 0x3211: 0x000c,\n\t0x3212: 0x000c, 0x3213: 0x000c, 0x3214: 0x000c, 0x3215: 0x000c, 0x3216: 0x000c, 0x3217: 0x000c,\n\t0x3218: 0x000c, 0x3219: 0x000c, 0x321a: 0x000c, 0x321b: 0x000c, 0x321c: 0x000c, 0x321d: 0x000c,\n\t0x321e: 0x000c, 0x321f: 0x000c, 0x3220: 0x000c, 0x3221: 0x000c, 0x3222: 0x000c, 0x3223: 0x000c,\n\t0x3224: 0x000c, 0x3225: 0x000c, 0x3226: 0x000c, 0x3227: 0x000c, 0x3228: 0x000c, 0x3229: 0x000c,\n\t0x322a: 0x000c, 0x322b: 0x000c, 0x322c: 0x000c,\n\t0x3235: 0x000c,\n\t// Block 0xc9, offset 0x3240\n\t0x3244: 0x000c,\n\t0x325b: 0x000c, 0x325c: 0x000c, 0x325d: 0x000c,\n\t0x325e: 0x000c, 0x325f: 0x000c, 0x3261: 0x000c, 0x3262: 0x000c, 0x3263: 0x000c,\n\t0x3264: 0x000c, 0x3265: 0x000c, 0x3266: 0x000c, 0x3267: 0x000c, 0x3268: 0x000c, 0x3269: 0x000c,\n\t0x326a: 0x000c, 0x326b: 0x000c, 0x326c: 0x000c, 0x326d: 0x000c, 0x326e: 0x000c, 0x326f: 0x000c,\n\t// Block 0xca, offset 0x3280\n\t0x3280: 0x000c, 0x3281: 0x000c, 0x3282: 0x000c, 0x3283: 0x000c, 0x3284: 0x000c, 0x3285: 0x000c,\n\t0x3286: 0x000c, 0x3288: 0x000c, 0x3289: 0x000c, 0x328a: 0x000c, 0x328b: 0x000c,\n\t0x328c: 0x000c, 0x328d: 0x000c, 0x328e: 0x000c, 0x328f: 0x000c, 0x3290: 0x000c, 0x3291: 0x000c,\n\t0x3292: 0x000c, 0x3293: 0x000c, 0x3294: 0x000c, 0x3295: 0x000c, 0x3296: 0x000c, 0x3297: 0x000c,\n\t0x3298: 0x000c, 0x329b: 0x000c, 0x329c: 0x000c, 0x329d: 0x000c,\n\t0x329e: 0x000c, 0x329f: 0x000c, 0x32a0: 0x000c, 0x32a1: 0x000c, 0x32a3: 0x000c,\n\t0x32a4: 0x000c, 0x32a6: 0x000c, 0x32a7: 0x000c, 0x32a8: 0x000c, 0x32a9: 0x000c,\n\t0x32aa: 0x000c,\n\t// Block 0xcb, offset 0x32c0\n\t0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001,\n\t0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001,\n\t0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x000c, 0x32d1: 0x000c,\n\t0x32d2: 0x000c, 0x32d3: 0x000c, 0x32d4: 0x000c, 0x32d5: 0x000c, 0x32d6: 0x000c, 0x32d7: 0x0001,\n\t0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001,\n\t0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, 0x32e3: 0x0001,\n\t0x32e4: 0x0001, 0x32e5: 0x0001, 0x32e6: 0x0001, 0x32e7: 0x0001, 0x32e8: 0x0001, 0x32e9: 0x0001,\n\t0x32ea: 0x0001, 0x32eb: 0x0001, 0x32ec: 0x0001, 0x32ed: 0x0001, 0x32ee: 0x0001, 0x32ef: 0x0001,\n\t0x32f0: 0x0001, 0x32f1: 0x0001, 0x32f2: 0x0001, 0x32f3: 0x0001, 0x32f4: 0x0001, 0x32f5: 0x0001,\n\t0x32f6: 0x0001, 0x32f7: 0x0001, 0x32f8: 0x0001, 0x32f9: 0x0001, 0x32fa: 0x0001, 0x32fb: 0x0001,\n\t0x32fc: 0x0001, 0x32fd: 0x0001, 0x32fe: 0x0001, 0x32ff: 0x0001,\n\t// Block 0xcc, offset 0x3300\n\t0x3300: 0x0001, 0x3301: 0x0001, 0x3302: 0x0001, 0x3303: 0x0001, 0x3304: 0x000c, 0x3305: 0x000c,\n\t0x3306: 0x000c, 0x3307: 0x000c, 0x3308: 0x000c, 0x3309: 0x000c, 0x330a: 0x000c, 0x330b: 0x0001,\n\t0x330c: 0x0001, 0x330d: 0x0001, 0x330e: 0x0001, 0x330f: 0x0001, 0x3310: 0x0001, 0x3311: 0x0001,\n\t0x3312: 0x0001, 0x3313: 0x0001, 0x3314: 0x0001, 0x3315: 0x0001, 0x3316: 0x0001, 0x3317: 0x0001,\n\t0x3318: 0x0001, 0x3319: 0x0001, 0x331a: 0x0001, 0x331b: 0x0001, 0x331c: 0x0001, 0x331d: 0x0001,\n\t0x331e: 0x0001, 0x331f: 0x0001, 0x3320: 0x0001, 0x3321: 0x0001, 0x3322: 0x0001, 0x3323: 0x0001,\n\t0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, 0x3328: 0x0001, 0x3329: 0x0001,\n\t0x332a: 0x0001, 0x332b: 0x0001, 0x332c: 0x0001, 0x332d: 0x0001, 0x332e: 0x0001, 0x332f: 0x0001,\n\t0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001,\n\t0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001,\n\t0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001,\n\t// Block 0xcd, offset 0x3340\n\t0x3340: 0x000d, 0x3341: 0x000d, 0x3342: 0x000d, 0x3343: 0x000d, 0x3344: 0x000d, 0x3345: 0x000d,\n\t0x3346: 0x000d, 0x3347: 0x000d, 0x3348: 0x000d, 0x3349: 0x000d, 0x334a: 0x000d, 0x334b: 0x000d,\n\t0x334c: 0x000d, 0x334d: 0x000d, 0x334e: 0x000d, 0x334f: 0x000d, 0x3350: 0x000d, 0x3351: 0x000d,\n\t0x3352: 0x000d, 0x3353: 0x000d, 0x3354: 0x000d, 0x3355: 0x000d, 0x3356: 0x000d, 0x3357: 0x000d,\n\t0x3358: 0x000d, 0x3359: 0x000d, 0x335a: 0x000d, 0x335b: 0x000d, 0x335c: 0x000d, 0x335d: 0x000d,\n\t0x335e: 0x000d, 0x335f: 0x000d, 0x3360: 0x000d, 0x3361: 0x000d, 0x3362: 0x000d, 0x3363: 0x000d,\n\t0x3364: 0x000d, 0x3365: 0x000d, 0x3366: 0x000d, 0x3367: 0x000d, 0x3368: 0x000d, 0x3369: 0x000d,\n\t0x336a: 0x000d, 0x336b: 0x000d, 0x336c: 0x000d, 0x336d: 0x000d, 0x336e: 0x000d, 0x336f: 0x000d,\n\t0x3370: 0x000a, 0x3371: 0x000a, 0x3372: 0x000d, 0x3373: 0x000d, 0x3374: 0x000d, 0x3375: 0x000d,\n\t0x3376: 0x000d, 0x3377: 0x000d, 0x3378: 0x000d, 0x3379: 0x000d, 0x337a: 0x000d, 0x337b: 0x000d,\n\t0x337c: 0x000d, 0x337d: 0x000d, 0x337e: 0x000d, 0x337f: 0x000d,\n\t// Block 0xce, offset 0x3380\n\t0x3380: 0x000a, 0x3381: 0x000a, 0x3382: 0x000a, 0x3383: 0x000a, 0x3384: 0x000a, 0x3385: 0x000a,\n\t0x3386: 0x000a, 0x3387: 0x000a, 0x3388: 0x000a, 0x3389: 0x000a, 0x338a: 0x000a, 0x338b: 0x000a,\n\t0x338c: 0x000a, 0x338d: 0x000a, 0x338e: 0x000a, 0x338f: 0x000a, 0x3390: 0x000a, 0x3391: 0x000a,\n\t0x3392: 0x000a, 0x3393: 0x000a, 0x3394: 0x000a, 0x3395: 0x000a, 0x3396: 0x000a, 0x3397: 0x000a,\n\t0x3398: 0x000a, 0x3399: 0x000a, 0x339a: 0x000a, 0x339b: 0x000a, 0x339c: 0x000a, 0x339d: 0x000a,\n\t0x339e: 0x000a, 0x339f: 0x000a, 0x33a0: 0x000a, 0x33a1: 0x000a, 0x33a2: 0x000a, 0x33a3: 0x000a,\n\t0x33a4: 0x000a, 0x33a5: 0x000a, 0x33a6: 0x000a, 0x33a7: 0x000a, 0x33a8: 0x000a, 0x33a9: 0x000a,\n\t0x33aa: 0x000a, 0x33ab: 0x000a,\n\t0x33b0: 0x000a, 0x33b1: 0x000a, 0x33b2: 0x000a, 0x33b3: 0x000a, 0x33b4: 0x000a, 0x33b5: 0x000a,\n\t0x33b6: 0x000a, 0x33b7: 0x000a, 0x33b8: 0x000a, 0x33b9: 0x000a, 0x33ba: 0x000a, 0x33bb: 0x000a,\n\t0x33bc: 0x000a, 0x33bd: 0x000a, 0x33be: 0x000a, 0x33bf: 0x000a,\n\t// Block 0xcf, offset 0x33c0\n\t0x33c0: 0x000a, 0x33c1: 0x000a, 0x33c2: 0x000a, 0x33c3: 0x000a, 0x33c4: 0x000a, 0x33c5: 0x000a,\n\t0x33c6: 0x000a, 0x33c7: 0x000a, 0x33c8: 0x000a, 0x33c9: 0x000a, 0x33ca: 0x000a, 0x33cb: 0x000a,\n\t0x33cc: 0x000a, 0x33cd: 0x000a, 0x33ce: 0x000a, 0x33cf: 0x000a, 0x33d0: 0x000a, 0x33d1: 0x000a,\n\t0x33d2: 0x000a, 0x33d3: 0x000a,\n\t0x33e0: 0x000a, 0x33e1: 0x000a, 0x33e2: 0x000a, 0x33e3: 0x000a,\n\t0x33e4: 0x000a, 0x33e5: 0x000a, 0x33e6: 0x000a, 0x33e7: 0x000a, 0x33e8: 0x000a, 0x33e9: 0x000a,\n\t0x33ea: 0x000a, 0x33eb: 0x000a, 0x33ec: 0x000a, 0x33ed: 0x000a, 0x33ee: 0x000a,\n\t0x33f1: 0x000a, 0x33f2: 0x000a, 0x33f3: 0x000a, 0x33f4: 0x000a, 0x33f5: 0x000a,\n\t0x33f6: 0x000a, 0x33f7: 0x000a, 0x33f8: 0x000a, 0x33f9: 0x000a, 0x33fa: 0x000a, 0x33fb: 0x000a,\n\t0x33fc: 0x000a, 0x33fd: 0x000a, 0x33fe: 0x000a, 0x33ff: 0x000a,\n\t// Block 0xd0, offset 0x3400\n\t0x3401: 0x000a, 0x3402: 0x000a, 0x3403: 0x000a, 0x3404: 0x000a, 0x3405: 0x000a,\n\t0x3406: 0x000a, 0x3407: 0x000a, 0x3408: 0x000a, 0x3409: 0x000a, 0x340a: 0x000a, 0x340b: 0x000a,\n\t0x340c: 0x000a, 0x340d: 0x000a, 0x340e: 0x000a, 0x340f: 0x000a, 0x3411: 0x000a,\n\t0x3412: 0x000a, 0x3413: 0x000a, 0x3414: 0x000a, 0x3415: 0x000a, 0x3416: 0x000a, 0x3417: 0x000a,\n\t0x3418: 0x000a, 0x3419: 0x000a, 0x341a: 0x000a, 0x341b: 0x000a, 0x341c: 0x000a, 0x341d: 0x000a,\n\t0x341e: 0x000a, 0x341f: 0x000a, 0x3420: 0x000a, 0x3421: 0x000a, 0x3422: 0x000a, 0x3423: 0x000a,\n\t0x3424: 0x000a, 0x3425: 0x000a, 0x3426: 0x000a, 0x3427: 0x000a, 0x3428: 0x000a, 0x3429: 0x000a,\n\t0x342a: 0x000a, 0x342b: 0x000a, 0x342c: 0x000a, 0x342d: 0x000a, 0x342e: 0x000a, 0x342f: 0x000a,\n\t0x3430: 0x000a, 0x3431: 0x000a, 0x3432: 0x000a, 0x3433: 0x000a, 0x3434: 0x000a, 0x3435: 0x000a,\n\t// Block 0xd1, offset 0x3440\n\t0x3440: 0x0002, 0x3441: 0x0002, 0x3442: 0x0002, 0x3443: 0x0002, 0x3444: 0x0002, 0x3445: 0x0002,\n\t0x3446: 0x0002, 0x3447: 0x0002, 0x3448: 0x0002, 0x3449: 0x0002, 0x344a: 0x0002, 0x344b: 0x000a,\n\t0x344c: 0x000a,\n\t// Block 0xd2, offset 0x3480\n\t0x34aa: 0x000a, 0x34ab: 0x000a,\n\t// Block 0xd3, offset 0x34c0\n\t0x34c0: 0x000a, 0x34c1: 0x000a, 0x34c2: 0x000a, 0x34c3: 0x000a, 0x34c4: 0x000a, 0x34c5: 0x000a,\n\t0x34c6: 0x000a, 0x34c7: 0x000a, 0x34c8: 0x000a, 0x34c9: 0x000a, 0x34ca: 0x000a, 0x34cb: 0x000a,\n\t0x34cc: 0x000a, 0x34cd: 0x000a, 0x34ce: 0x000a, 0x34cf: 0x000a, 0x34d0: 0x000a, 0x34d1: 0x000a,\n\t0x34d2: 0x000a,\n\t0x34e0: 0x000a, 0x34e1: 0x000a, 0x34e2: 0x000a, 0x34e3: 0x000a,\n\t0x34e4: 0x000a, 0x34e5: 0x000a, 0x34e6: 0x000a, 0x34e7: 0x000a, 0x34e8: 0x000a, 0x34e9: 0x000a,\n\t0x34ea: 0x000a, 0x34eb: 0x000a, 0x34ec: 0x000a,\n\t0x34f0: 0x000a, 0x34f1: 0x000a, 0x34f2: 0x000a, 0x34f3: 0x000a, 0x34f4: 0x000a, 0x34f5: 0x000a,\n\t0x34f6: 0x000a,\n\t// Block 0xd4, offset 0x3500\n\t0x3500: 0x000a, 0x3501: 0x000a, 0x3502: 0x000a, 0x3503: 0x000a, 0x3504: 0x000a, 0x3505: 0x000a,\n\t0x3506: 0x000a, 0x3507: 0x000a, 0x3508: 0x000a, 0x3509: 0x000a, 0x350a: 0x000a, 0x350b: 0x000a,\n\t0x350c: 0x000a, 0x350d: 0x000a, 0x350e: 0x000a, 0x350f: 0x000a, 0x3510: 0x000a, 0x3511: 0x000a,\n\t0x3512: 0x000a, 0x3513: 0x000a, 0x3514: 0x000a,\n\t// Block 0xd5, offset 0x3540\n\t0x3540: 0x000a, 0x3541: 0x000a, 0x3542: 0x000a, 0x3543: 0x000a, 0x3544: 0x000a, 0x3545: 0x000a,\n\t0x3546: 0x000a, 0x3547: 0x000a, 0x3548: 0x000a, 0x3549: 0x000a, 0x354a: 0x000a, 0x354b: 0x000a,\n\t0x3550: 0x000a, 0x3551: 0x000a,\n\t0x3552: 0x000a, 0x3553: 0x000a, 0x3554: 0x000a, 0x3555: 0x000a, 0x3556: 0x000a, 0x3557: 0x000a,\n\t0x3558: 0x000a, 0x3559: 0x000a, 0x355a: 0x000a, 0x355b: 0x000a, 0x355c: 0x000a, 0x355d: 0x000a,\n\t0x355e: 0x000a, 0x355f: 0x000a, 0x3560: 0x000a, 0x3561: 0x000a, 0x3562: 0x000a, 0x3563: 0x000a,\n\t0x3564: 0x000a, 0x3565: 0x000a, 0x3566: 0x000a, 0x3567: 0x000a, 0x3568: 0x000a, 0x3569: 0x000a,\n\t0x356a: 0x000a, 0x356b: 0x000a, 0x356c: 0x000a, 0x356d: 0x000a, 0x356e: 0x000a, 0x356f: 0x000a,\n\t0x3570: 0x000a, 0x3571: 0x000a, 0x3572: 0x000a, 0x3573: 0x000a, 0x3574: 0x000a, 0x3575: 0x000a,\n\t0x3576: 0x000a, 0x3577: 0x000a, 0x3578: 0x000a, 0x3579: 0x000a, 0x357a: 0x000a, 0x357b: 0x000a,\n\t0x357c: 0x000a, 0x357d: 0x000a, 0x357e: 0x000a, 0x357f: 0x000a,\n\t// Block 0xd6, offset 0x3580\n\t0x3580: 0x000a, 0x3581: 0x000a, 0x3582: 0x000a, 0x3583: 0x000a, 0x3584: 0x000a, 0x3585: 0x000a,\n\t0x3586: 0x000a, 0x3587: 0x000a,\n\t0x3590: 0x000a, 0x3591: 0x000a,\n\t0x3592: 0x000a, 0x3593: 0x000a, 0x3594: 0x000a, 0x3595: 0x000a, 0x3596: 0x000a, 0x3597: 0x000a,\n\t0x3598: 0x000a, 0x3599: 0x000a,\n\t0x35a0: 0x000a, 0x35a1: 0x000a, 0x35a2: 0x000a, 0x35a3: 0x000a,\n\t0x35a4: 0x000a, 0x35a5: 0x000a, 0x35a6: 0x000a, 0x35a7: 0x000a, 0x35a8: 0x000a, 0x35a9: 0x000a,\n\t0x35aa: 0x000a, 0x35ab: 0x000a, 0x35ac: 0x000a, 0x35ad: 0x000a, 0x35ae: 0x000a, 0x35af: 0x000a,\n\t0x35b0: 0x000a, 0x35b1: 0x000a, 0x35b2: 0x000a, 0x35b3: 0x000a, 0x35b4: 0x000a, 0x35b5: 0x000a,\n\t0x35b6: 0x000a, 0x35b7: 0x000a, 0x35b8: 0x000a, 0x35b9: 0x000a, 0x35ba: 0x000a, 0x35bb: 0x000a,\n\t0x35bc: 0x000a, 0x35bd: 0x000a, 0x35be: 0x000a, 0x35bf: 0x000a,\n\t// Block 0xd7, offset 0x35c0\n\t0x35c0: 0x000a, 0x35c1: 0x000a, 0x35c2: 0x000a, 0x35c3: 0x000a, 0x35c4: 0x000a, 0x35c5: 0x000a,\n\t0x35c6: 0x000a, 0x35c7: 0x000a,\n\t0x35d0: 0x000a, 0x35d1: 0x000a,\n\t0x35d2: 0x000a, 0x35d3: 0x000a, 0x35d4: 0x000a, 0x35d5: 0x000a, 0x35d6: 0x000a, 0x35d7: 0x000a,\n\t0x35d8: 0x000a, 0x35d9: 0x000a, 0x35da: 0x000a, 0x35db: 0x000a, 0x35dc: 0x000a, 0x35dd: 0x000a,\n\t0x35de: 0x000a, 0x35df: 0x000a, 0x35e0: 0x000a, 0x35e1: 0x000a, 0x35e2: 0x000a, 0x35e3: 0x000a,\n\t0x35e4: 0x000a, 0x35e5: 0x000a, 0x35e6: 0x000a, 0x35e7: 0x000a, 0x35e8: 0x000a, 0x35e9: 0x000a,\n\t0x35ea: 0x000a, 0x35eb: 0x000a, 0x35ec: 0x000a, 0x35ed: 0x000a,\n\t// Block 0xd8, offset 0x3600\n\t0x3610: 0x000a, 0x3611: 0x000a,\n\t0x3612: 0x000a, 0x3613: 0x000a, 0x3614: 0x000a, 0x3615: 0x000a, 0x3616: 0x000a, 0x3617: 0x000a,\n\t0x3618: 0x000a, 0x3619: 0x000a, 0x361a: 0x000a, 0x361b: 0x000a, 0x361c: 0x000a, 0x361d: 0x000a,\n\t0x361e: 0x000a, 0x3620: 0x000a, 0x3621: 0x000a, 0x3622: 0x000a, 0x3623: 0x000a,\n\t0x3624: 0x000a, 0x3625: 0x000a, 0x3626: 0x000a, 0x3627: 0x000a,\n\t0x3630: 0x000a, 0x3633: 0x000a, 0x3634: 0x000a, 0x3635: 0x000a,\n\t0x3636: 0x000a, 0x3637: 0x000a, 0x3638: 0x000a, 0x3639: 0x000a, 0x363a: 0x000a, 0x363b: 0x000a,\n\t0x363c: 0x000a, 0x363d: 0x000a, 0x363e: 0x000a,\n\t// Block 0xd9, offset 0x3640\n\t0x3640: 0x000a, 0x3641: 0x000a, 0x3642: 0x000a, 0x3643: 0x000a, 0x3644: 0x000a, 0x3645: 0x000a,\n\t0x3646: 0x000a, 0x3647: 0x000a, 0x3648: 0x000a, 0x3649: 0x000a, 0x364a: 0x000a, 0x364b: 0x000a,\n\t0x3650: 0x000a, 0x3651: 0x000a,\n\t0x3652: 0x000a, 0x3653: 0x000a, 0x3654: 0x000a, 0x3655: 0x000a, 0x3656: 0x000a, 0x3657: 0x000a,\n\t0x3658: 0x000a, 0x3659: 0x000a, 0x365a: 0x000a, 0x365b: 0x000a, 0x365c: 0x000a, 0x365d: 0x000a,\n\t0x365e: 0x000a,\n\t// Block 0xda, offset 0x3680\n\t0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000a, 0x3683: 0x000a, 0x3684: 0x000a, 0x3685: 0x000a,\n\t0x3686: 0x000a, 0x3687: 0x000a, 0x3688: 0x000a, 0x3689: 0x000a, 0x368a: 0x000a, 0x368b: 0x000a,\n\t0x368c: 0x000a, 0x368d: 0x000a, 0x368e: 0x000a, 0x368f: 0x000a, 0x3690: 0x000a, 0x3691: 0x000a,\n\t// Block 0xdb, offset 0x36c0\n\t0x36fe: 0x000b, 0x36ff: 0x000b,\n\t// Block 0xdc, offset 0x3700\n\t0x3700: 0x000b, 0x3701: 0x000b, 0x3702: 0x000b, 0x3703: 0x000b, 0x3704: 0x000b, 0x3705: 0x000b,\n\t0x3706: 0x000b, 0x3707: 0x000b, 0x3708: 0x000b, 0x3709: 0x000b, 0x370a: 0x000b, 0x370b: 0x000b,\n\t0x370c: 0x000b, 0x370d: 0x000b, 0x370e: 0x000b, 0x370f: 0x000b, 0x3710: 0x000b, 0x3711: 0x000b,\n\t0x3712: 0x000b, 0x3713: 0x000b, 0x3714: 0x000b, 0x3715: 0x000b, 0x3716: 0x000b, 0x3717: 0x000b,\n\t0x3718: 0x000b, 0x3719: 0x000b, 0x371a: 0x000b, 0x371b: 0x000b, 0x371c: 0x000b, 0x371d: 0x000b,\n\t0x371e: 0x000b, 0x371f: 0x000b, 0x3720: 0x000b, 0x3721: 0x000b, 0x3722: 0x000b, 0x3723: 0x000b,\n\t0x3724: 0x000b, 0x3725: 0x000b, 0x3726: 0x000b, 0x3727: 0x000b, 0x3728: 0x000b, 0x3729: 0x000b,\n\t0x372a: 0x000b, 0x372b: 0x000b, 0x372c: 0x000b, 0x372d: 0x000b, 0x372e: 0x000b, 0x372f: 0x000b,\n\t0x3730: 0x000b, 0x3731: 0x000b, 0x3732: 0x000b, 0x3733: 0x000b, 0x3734: 0x000b, 0x3735: 0x000b,\n\t0x3736: 0x000b, 0x3737: 0x000b, 0x3738: 0x000b, 0x3739: 0x000b, 0x373a: 0x000b, 0x373b: 0x000b,\n\t0x373c: 0x000b, 0x373d: 0x000b, 0x373e: 0x000b, 0x373f: 0x000b,\n\t// Block 0xdd, offset 0x3740\n\t0x3740: 0x000c, 0x3741: 0x000c, 0x3742: 0x000c, 0x3743: 0x000c, 0x3744: 0x000c, 0x3745: 0x000c,\n\t0x3746: 0x000c, 0x3747: 0x000c, 0x3748: 0x000c, 0x3749: 0x000c, 0x374a: 0x000c, 0x374b: 0x000c,\n\t0x374c: 0x000c, 0x374d: 0x000c, 0x374e: 0x000c, 0x374f: 0x000c, 0x3750: 0x000c, 0x3751: 0x000c,\n\t0x3752: 0x000c, 0x3753: 0x000c, 0x3754: 0x000c, 0x3755: 0x000c, 0x3756: 0x000c, 0x3757: 0x000c,\n\t0x3758: 0x000c, 0x3759: 0x000c, 0x375a: 0x000c, 0x375b: 0x000c, 0x375c: 0x000c, 0x375d: 0x000c,\n\t0x375e: 0x000c, 0x375f: 0x000c, 0x3760: 0x000c, 0x3761: 0x000c, 0x3762: 0x000c, 0x3763: 0x000c,\n\t0x3764: 0x000c, 0x3765: 0x000c, 0x3766: 0x000c, 0x3767: 0x000c, 0x3768: 0x000c, 0x3769: 0x000c,\n\t0x376a: 0x000c, 0x376b: 0x000c, 0x376c: 0x000c, 0x376d: 0x000c, 0x376e: 0x000c, 0x376f: 0x000c,\n\t0x3770: 0x000b, 0x3771: 0x000b, 0x3772: 0x000b, 0x3773: 0x000b, 0x3774: 0x000b, 0x3775: 0x000b,\n\t0x3776: 0x000b, 0x3777: 0x000b, 0x3778: 0x000b, 0x3779: 0x000b, 0x377a: 0x000b, 0x377b: 0x000b,\n\t0x377c: 0x000b, 0x377d: 0x000b, 0x377e: 0x000b, 0x377f: 0x000b,\n}\n\n// bidiIndex: 24 blocks, 1536 entries, 1536 bytes\n// Block 0 is the zero block.\nvar bidiIndex = [1536]uint8{\n\t// Block 0x0, offset 0x0\n\t// Block 0x1, offset 0x40\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc2: 0x01, 0xc3: 0x02,\n\t0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08,\n\t0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b,\n\t0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13,\n\t0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06,\n\t0xea: 0x07, 0xef: 0x08,\n\t0xf0: 0x11, 0xf1: 0x12, 0xf2: 0x12, 0xf3: 0x14, 0xf4: 0x15,\n\t// Block 0x4, offset 0x100\n\t0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b,\n\t0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22,\n\t0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x137: 0x28,\n\t0x138: 0x29, 0x139: 0x2a, 0x13a: 0x2b, 0x13b: 0x2c, 0x13c: 0x2d, 0x13d: 0x2e, 0x13e: 0x2f, 0x13f: 0x30,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x31, 0x141: 0x32, 0x142: 0x33,\n\t0x14d: 0x34, 0x14e: 0x35,\n\t0x150: 0x36,\n\t0x15a: 0x37, 0x15c: 0x38, 0x15d: 0x39, 0x15e: 0x3a, 0x15f: 0x3b,\n\t0x160: 0x3c, 0x162: 0x3d, 0x164: 0x3e, 0x165: 0x3f, 0x167: 0x40,\n\t0x168: 0x41, 0x169: 0x42, 0x16a: 0x43, 0x16c: 0x44, 0x16d: 0x45, 0x16e: 0x46, 0x16f: 0x47,\n\t0x170: 0x48, 0x173: 0x49, 0x177: 0x4a,\n\t0x17e: 0x4b, 0x17f: 0x4c,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x4d, 0x181: 0x4e, 0x182: 0x4f, 0x183: 0x50, 0x184: 0x51, 0x185: 0x52, 0x186: 0x53, 0x187: 0x54,\n\t0x188: 0x55, 0x189: 0x54, 0x18a: 0x54, 0x18b: 0x54, 0x18c: 0x56, 0x18d: 0x57, 0x18e: 0x58, 0x18f: 0x59,\n\t0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x54, 0x195: 0x54, 0x196: 0x54, 0x197: 0x54,\n\t0x198: 0x54, 0x199: 0x54, 0x19a: 0x5e, 0x19b: 0x54, 0x19c: 0x54, 0x19d: 0x5f, 0x19e: 0x54, 0x19f: 0x60,\n\t0x1a4: 0x54, 0x1a5: 0x54, 0x1a6: 0x61, 0x1a7: 0x62,\n\t0x1a8: 0x54, 0x1a9: 0x54, 0x1aa: 0x54, 0x1ab: 0x54, 0x1ac: 0x54, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x65,\n\t0x1b3: 0x66, 0x1b5: 0x67, 0x1b7: 0x68,\n\t0x1b8: 0x69, 0x1b9: 0x6a, 0x1ba: 0x6b, 0x1bb: 0x6c, 0x1bc: 0x54, 0x1bd: 0x54, 0x1be: 0x54, 0x1bf: 0x6d,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x6e, 0x1c2: 0x6f, 0x1c3: 0x70, 0x1c7: 0x71,\n\t0x1c8: 0x72, 0x1c9: 0x73, 0x1ca: 0x74, 0x1cb: 0x75, 0x1cd: 0x76, 0x1cf: 0x77,\n\t// Block 0x8, offset 0x200\n\t0x237: 0x54,\n\t// Block 0x9, offset 0x240\n\t0x252: 0x78, 0x253: 0x79,\n\t0x258: 0x7a, 0x259: 0x7b, 0x25a: 0x7c, 0x25b: 0x7d, 0x25c: 0x7e, 0x25e: 0x7f,\n\t0x260: 0x80, 0x261: 0x81, 0x263: 0x82, 0x264: 0x83, 0x265: 0x84, 0x266: 0x85, 0x267: 0x86,\n\t0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26f: 0x8b,\n\t// Block 0xa, offset 0x280\n\t0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e,\n\t0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x0e, 0x2b6: 0x0e, 0x2b7: 0x8f,\n\t0x2b8: 0x90, 0x2b9: 0x91, 0x2ba: 0x0e, 0x2bb: 0x92, 0x2bc: 0x93, 0x2bd: 0x94, 0x2bf: 0x95,\n\t// Block 0xb, offset 0x2c0\n\t0x2c4: 0x96, 0x2c5: 0x54, 0x2c6: 0x97, 0x2c7: 0x98,\n\t0x2cb: 0x99, 0x2cd: 0x9a,\n\t0x2e0: 0x9b, 0x2e1: 0x9b, 0x2e2: 0x9b, 0x2e3: 0x9b, 0x2e4: 0x9c, 0x2e5: 0x9b, 0x2e6: 0x9b, 0x2e7: 0x9b,\n\t0x2e8: 0x9d, 0x2e9: 0x9b, 0x2ea: 0x9b, 0x2eb: 0x9e, 0x2ec: 0x9f, 0x2ed: 0x9b, 0x2ee: 0x9b, 0x2ef: 0x9b,\n\t0x2f0: 0x9b, 0x2f1: 0x9b, 0x2f2: 0x9b, 0x2f3: 0x9b, 0x2f4: 0x9b, 0x2f5: 0x9b, 0x2f6: 0x9b, 0x2f7: 0x9b,\n\t0x2f8: 0x9b, 0x2f9: 0xa0, 0x2fa: 0x9b, 0x2fb: 0x9b, 0x2fc: 0x9b, 0x2fd: 0x9b, 0x2fe: 0x9b, 0x2ff: 0x9b,\n\t// Block 0xc, offset 0x300\n\t0x300: 0xa1, 0x301: 0xa2, 0x302: 0xa3, 0x304: 0xa4, 0x305: 0xa5, 0x306: 0xa6, 0x307: 0xa7,\n\t0x308: 0xa8, 0x30b: 0xa9, 0x30c: 0xaa, 0x30d: 0xab,\n\t0x310: 0xac, 0x311: 0xad, 0x312: 0xae, 0x313: 0xaf, 0x316: 0xb0, 0x317: 0xb1,\n\t0x318: 0xb2, 0x319: 0xb3, 0x31a: 0xb4, 0x31c: 0xb5,\n\t0x330: 0xb6, 0x332: 0xb7,\n\t// Block 0xd, offset 0x340\n\t0x36b: 0xb8, 0x36c: 0xb9,\n\t0x37e: 0xba,\n\t// Block 0xe, offset 0x380\n\t0x3b2: 0xbb,\n\t// Block 0xf, offset 0x3c0\n\t0x3c5: 0xbc, 0x3c6: 0xbd,\n\t0x3c8: 0x54, 0x3c9: 0xbe, 0x3cc: 0x54, 0x3cd: 0xbf,\n\t0x3db: 0xc0, 0x3dc: 0xc1, 0x3dd: 0xc2, 0x3de: 0xc3, 0x3df: 0xc4,\n\t0x3e8: 0xc5, 0x3e9: 0xc6, 0x3ea: 0xc7,\n\t// Block 0x10, offset 0x400\n\t0x400: 0xc8,\n\t0x420: 0x9b, 0x421: 0x9b, 0x422: 0x9b, 0x423: 0xc9, 0x424: 0x9b, 0x425: 0xca, 0x426: 0x9b, 0x427: 0x9b,\n\t0x428: 0x9b, 0x429: 0x9b, 0x42a: 0x9b, 0x42b: 0x9b, 0x42c: 0x9b, 0x42d: 0x9b, 0x42e: 0x9b, 0x42f: 0x9b,\n\t0x430: 0x9b, 0x431: 0x9b, 0x432: 0x9b, 0x433: 0x9b, 0x434: 0x9b, 0x435: 0x9b, 0x436: 0x9b, 0x437: 0x9b,\n\t0x438: 0x0e, 0x439: 0x0e, 0x43a: 0x0e, 0x43b: 0xcb, 0x43c: 0x9b, 0x43d: 0x9b, 0x43e: 0x9b, 0x43f: 0x9b,\n\t// Block 0x11, offset 0x440\n\t0x440: 0xcc, 0x441: 0x54, 0x442: 0xcd, 0x443: 0xce, 0x444: 0xcf, 0x445: 0xd0,\n\t0x44c: 0x54, 0x44d: 0x54, 0x44e: 0x54, 0x44f: 0x54,\n\t0x450: 0x54, 0x451: 0x54, 0x452: 0x54, 0x453: 0x54, 0x454: 0x54, 0x455: 0x54, 0x456: 0x54, 0x457: 0x54,\n\t0x458: 0x54, 0x459: 0x54, 0x45a: 0x54, 0x45b: 0xd1, 0x45c: 0x54, 0x45d: 0x6c, 0x45e: 0x54, 0x45f: 0xd2,\n\t0x460: 0xd3, 0x461: 0xd4, 0x462: 0xd5, 0x464: 0xd6, 0x465: 0xd7, 0x466: 0xd8, 0x467: 0x36,\n\t0x47f: 0xd9,\n\t// Block 0x12, offset 0x480\n\t0x4bf: 0xd9,\n\t// Block 0x13, offset 0x4c0\n\t0x4d0: 0x09, 0x4d1: 0x0a, 0x4d6: 0x0b,\n\t0x4db: 0x0c, 0x4dd: 0x0d, 0x4de: 0x0e, 0x4df: 0x0f,\n\t0x4ef: 0x10,\n\t0x4ff: 0x10,\n\t// Block 0x14, offset 0x500\n\t0x50f: 0x10,\n\t0x51f: 0x10,\n\t0x52f: 0x10,\n\t0x53f: 0x10,\n\t// Block 0x15, offset 0x540\n\t0x540: 0xda, 0x541: 0xda, 0x542: 0xda, 0x543: 0xda, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0xdb,\n\t0x548: 0xda, 0x549: 0xda, 0x54a: 0xda, 0x54b: 0xda, 0x54c: 0xda, 0x54d: 0xda, 0x54e: 0xda, 0x54f: 0xda,\n\t0x550: 0xda, 0x551: 0xda, 0x552: 0xda, 0x553: 0xda, 0x554: 0xda, 0x555: 0xda, 0x556: 0xda, 0x557: 0xda,\n\t0x558: 0xda, 0x559: 0xda, 0x55a: 0xda, 0x55b: 0xda, 0x55c: 0xda, 0x55d: 0xda, 0x55e: 0xda, 0x55f: 0xda,\n\t0x560: 0xda, 0x561: 0xda, 0x562: 0xda, 0x563: 0xda, 0x564: 0xda, 0x565: 0xda, 0x566: 0xda, 0x567: 0xda,\n\t0x568: 0xda, 0x569: 0xda, 0x56a: 0xda, 0x56b: 0xda, 0x56c: 0xda, 0x56d: 0xda, 0x56e: 0xda, 0x56f: 0xda,\n\t0x570: 0xda, 0x571: 0xda, 0x572: 0xda, 0x573: 0xda, 0x574: 0xda, 0x575: 0xda, 0x576: 0xda, 0x577: 0xda,\n\t0x578: 0xda, 0x579: 0xda, 0x57a: 0xda, 0x57b: 0xda, 0x57c: 0xda, 0x57d: 0xda, 0x57e: 0xda, 0x57f: 0xda,\n\t// Block 0x16, offset 0x580\n\t0x58f: 0x10,\n\t0x59f: 0x10,\n\t0x5a0: 0x13,\n\t0x5af: 0x10,\n\t0x5bf: 0x10,\n\t// Block 0x17, offset 0x5c0\n\t0x5cf: 0x10,\n}\n\n// Total table size 15800 bytes (15KiB); checksum: F50EF68C\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/bidi/trieval.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\npackage bidi\n\n// Class is the Unicode BiDi class. Each rune has a single class.\ntype Class uint\n\nconst (\n\tL       Class = iota // LeftToRight\n\tR                    // RightToLeft\n\tEN                   // EuropeanNumber\n\tES                   // EuropeanSeparator\n\tET                   // EuropeanTerminator\n\tAN                   // ArabicNumber\n\tCS                   // CommonSeparator\n\tB                    // ParagraphSeparator\n\tS                    // SegmentSeparator\n\tWS                   // WhiteSpace\n\tON                   // OtherNeutral\n\tBN                   // BoundaryNeutral\n\tNSM                  // NonspacingMark\n\tAL                   // ArabicLetter\n\tControl              // Control LRO - PDI\n\n\tnumClass\n\n\tLRO // LeftToRightOverride\n\tRLO // RightToLeftOverride\n\tLRE // LeftToRightEmbedding\n\tRLE // RightToLeftEmbedding\n\tPDF // PopDirectionalFormat\n\tLRI // LeftToRightIsolate\n\tRLI // RightToLeftIsolate\n\tFSI // FirstStrongIsolate\n\tPDI // PopDirectionalIsolate\n\n\tunknownClass = ^Class(0)\n)\n\nvar controlToClass = map[rune]Class{\n\t0x202D: LRO, // LeftToRightOverride,\n\t0x202E: RLO, // RightToLeftOverride,\n\t0x202A: LRE, // LeftToRightEmbedding,\n\t0x202B: RLE, // RightToLeftEmbedding,\n\t0x202C: PDF, // PopDirectionalFormat,\n\t0x2066: LRI, // LeftToRightIsolate,\n\t0x2067: RLI, // RightToLeftIsolate,\n\t0x2068: FSI, // FirstStrongIsolate,\n\t0x2069: PDI, // PopDirectionalIsolate,\n}\n\n// A trie entry has the following bits:\n// 7..5  XOR mask for brackets\n// 4     1: Bracket open, 0: Bracket close\n// 3..0  Class type\n\nconst (\n\topenMask     = 0x10\n\txorMaskShift = 5\n)\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/composition.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage norm\n\nimport \"unicode/utf8\"\n\nconst (\n\tmaxNonStarters = 30\n\t// The maximum number of characters needed for a buffer is\n\t// maxNonStarters + 1 for the starter + 1 for the GCJ\n\tmaxBufferSize    = maxNonStarters + 2\n\tmaxNFCExpansion  = 3  // NFC(0x1D160)\n\tmaxNFKCExpansion = 18 // NFKC(0xFDFA)\n\n\tmaxByteBufferSize = utf8.UTFMax * maxBufferSize // 128\n)\n\n// ssState is used for reporting the segment state after inserting a rune.\n// It is returned by streamSafe.next.\ntype ssState int\n\nconst (\n\t// Indicates a rune was successfully added to the segment.\n\tssSuccess ssState = iota\n\t// Indicates a rune starts a new segment and should not be added.\n\tssStarter\n\t// Indicates a rune caused a segment overflow and a CGJ should be inserted.\n\tssOverflow\n)\n\n// streamSafe implements the policy of when a CGJ should be inserted.\ntype streamSafe uint8\n\n// first inserts the first rune of a segment. It is a faster version of next if\n// it is known p represents the first rune in a segment.\nfunc (ss *streamSafe) first(p Properties) {\n\t*ss = streamSafe(p.nTrailingNonStarters())\n}\n\n// insert returns a ssState value to indicate whether a rune represented by p\n// can be inserted.\nfunc (ss *streamSafe) next(p Properties) ssState {\n\tif *ss > maxNonStarters {\n\t\tpanic(\"streamSafe was not reset\")\n\t}\n\tn := p.nLeadingNonStarters()\n\tif *ss += streamSafe(n); *ss > maxNonStarters {\n\t\t*ss = 0\n\t\treturn ssOverflow\n\t}\n\t// The Stream-Safe Text Processing prescribes that the counting can stop\n\t// as soon as a starter is encountered. However, there are some starters,\n\t// like Jamo V and T, that can combine with other runes, leaving their\n\t// successive non-starters appended to the previous, possibly causing an\n\t// overflow. We will therefore consider any rune with a non-zero nLead to\n\t// be a non-starter. Note that it always hold that if nLead > 0 then\n\t// nLead == nTrail.\n\tif n == 0 {\n\t\t*ss = streamSafe(p.nTrailingNonStarters())\n\t\treturn ssStarter\n\t}\n\treturn ssSuccess\n}\n\n// backwards is used for checking for overflow and segment starts\n// when traversing a string backwards. Users do not need to call first\n// for the first rune. The state of the streamSafe retains the count of\n// the non-starters loaded.\nfunc (ss *streamSafe) backwards(p Properties) ssState {\n\tif *ss > maxNonStarters {\n\t\tpanic(\"streamSafe was not reset\")\n\t}\n\tc := *ss + streamSafe(p.nTrailingNonStarters())\n\tif c > maxNonStarters {\n\t\treturn ssOverflow\n\t}\n\t*ss = c\n\tif p.nLeadingNonStarters() == 0 {\n\t\treturn ssStarter\n\t}\n\treturn ssSuccess\n}\n\nfunc (ss streamSafe) isMax() bool {\n\treturn ss == maxNonStarters\n}\n\n// GraphemeJoiner is inserted after maxNonStarters non-starter runes.\nconst GraphemeJoiner = \"\\u034F\"\n\n// reorderBuffer is used to normalize a single segment.  Characters inserted with\n// insert are decomposed and reordered based on CCC. The compose method can\n// be used to recombine characters.  Note that the byte buffer does not hold\n// the UTF-8 characters in order.  Only the rune array is maintained in sorted\n// order. flush writes the resulting segment to a byte array.\ntype reorderBuffer struct {\n\trune  [maxBufferSize]Properties // Per character info.\n\tbyte  [maxByteBufferSize]byte   // UTF-8 buffer. Referenced by runeInfo.pos.\n\tnbyte uint8                     // Number or bytes.\n\tss    streamSafe                // For limiting length of non-starter sequence.\n\tnrune int                       // Number of runeInfos.\n\tf     formInfo\n\n\tsrc      input\n\tnsrc     int\n\ttmpBytes input\n\n\tout    []byte\n\tflushF func(*reorderBuffer) bool\n}\n\nfunc (rb *reorderBuffer) init(f Form, src []byte) {\n\trb.f = *formTable[f]\n\trb.src.setBytes(src)\n\trb.nsrc = len(src)\n\trb.ss = 0\n}\n\nfunc (rb *reorderBuffer) initString(f Form, src string) {\n\trb.f = *formTable[f]\n\trb.src.setString(src)\n\trb.nsrc = len(src)\n\trb.ss = 0\n}\n\nfunc (rb *reorderBuffer) setFlusher(out []byte, f func(*reorderBuffer) bool) {\n\trb.out = out\n\trb.flushF = f\n}\n\n// reset discards all characters from the buffer.\nfunc (rb *reorderBuffer) reset() {\n\trb.nrune = 0\n\trb.nbyte = 0\n}\n\nfunc (rb *reorderBuffer) doFlush() bool {\n\tif rb.f.composing {\n\t\trb.compose()\n\t}\n\tres := rb.flushF(rb)\n\trb.reset()\n\treturn res\n}\n\n// appendFlush appends the normalized segment to rb.out.\nfunc appendFlush(rb *reorderBuffer) bool {\n\tfor i := 0; i < rb.nrune; i++ {\n\t\tstart := rb.rune[i].pos\n\t\tend := start + rb.rune[i].size\n\t\trb.out = append(rb.out, rb.byte[start:end]...)\n\t}\n\treturn true\n}\n\n// flush appends the normalized segment to out and resets rb.\nfunc (rb *reorderBuffer) flush(out []byte) []byte {\n\tfor i := 0; i < rb.nrune; i++ {\n\t\tstart := rb.rune[i].pos\n\t\tend := start + rb.rune[i].size\n\t\tout = append(out, rb.byte[start:end]...)\n\t}\n\trb.reset()\n\treturn out\n}\n\n// flushCopy copies the normalized segment to buf and resets rb.\n// It returns the number of bytes written to buf.\nfunc (rb *reorderBuffer) flushCopy(buf []byte) int {\n\tp := 0\n\tfor i := 0; i < rb.nrune; i++ {\n\t\trunep := rb.rune[i]\n\t\tp += copy(buf[p:], rb.byte[runep.pos:runep.pos+runep.size])\n\t}\n\trb.reset()\n\treturn p\n}\n\n// insertOrdered inserts a rune in the buffer, ordered by Canonical Combining Class.\n// It returns false if the buffer is not large enough to hold the rune.\n// It is used internally by insert and insertString only.\nfunc (rb *reorderBuffer) insertOrdered(info Properties) {\n\tn := rb.nrune\n\tb := rb.rune[:]\n\tcc := info.ccc\n\tif cc > 0 {\n\t\t// Find insertion position + move elements to make room.\n\t\tfor ; n > 0; n-- {\n\t\t\tif b[n-1].ccc <= cc {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tb[n] = b[n-1]\n\t\t}\n\t}\n\trb.nrune += 1\n\tpos := uint8(rb.nbyte)\n\trb.nbyte += utf8.UTFMax\n\tinfo.pos = pos\n\tb[n] = info\n}\n\n// insertErr is an error code returned by insert. Using this type instead\n// of error improves performance up to 20% for many of the benchmarks.\ntype insertErr int\n\nconst (\n\tiSuccess insertErr = -iota\n\tiShortDst\n\tiShortSrc\n)\n\n// insertFlush inserts the given rune in the buffer ordered by CCC.\n// If a decomposition with multiple segments are encountered, they leading\n// ones are flushed.\n// It returns a non-zero error code if the rune was not inserted.\nfunc (rb *reorderBuffer) insertFlush(src input, i int, info Properties) insertErr {\n\tif rune := src.hangul(i); rune != 0 {\n\t\trb.decomposeHangul(rune)\n\t\treturn iSuccess\n\t}\n\tif info.hasDecomposition() {\n\t\treturn rb.insertDecomposed(info.Decomposition())\n\t}\n\trb.insertSingle(src, i, info)\n\treturn iSuccess\n}\n\n// insertUnsafe inserts the given rune in the buffer ordered by CCC.\n// It is assumed there is sufficient space to hold the runes. It is the\n// responsibility of the caller to ensure this. This can be done by checking\n// the state returned by the streamSafe type.\nfunc (rb *reorderBuffer) insertUnsafe(src input, i int, info Properties) {\n\tif rune := src.hangul(i); rune != 0 {\n\t\trb.decomposeHangul(rune)\n\t}\n\tif info.hasDecomposition() {\n\t\t// TODO: inline.\n\t\trb.insertDecomposed(info.Decomposition())\n\t} else {\n\t\trb.insertSingle(src, i, info)\n\t}\n}\n\n// insertDecomposed inserts an entry in to the reorderBuffer for each rune\n// in dcomp. dcomp must be a sequence of decomposed UTF-8-encoded runes.\n// It flushes the buffer on each new segment start.\nfunc (rb *reorderBuffer) insertDecomposed(dcomp []byte) insertErr {\n\trb.tmpBytes.setBytes(dcomp)\n\t// As the streamSafe accounting already handles the counting for modifiers,\n\t// we don't have to call next. However, we do need to keep the accounting\n\t// intact when flushing the buffer.\n\tfor i := 0; i < len(dcomp); {\n\t\tinfo := rb.f.info(rb.tmpBytes, i)\n\t\tif info.BoundaryBefore() && rb.nrune > 0 && !rb.doFlush() {\n\t\t\treturn iShortDst\n\t\t}\n\t\ti += copy(rb.byte[rb.nbyte:], dcomp[i:i+int(info.size)])\n\t\trb.insertOrdered(info)\n\t}\n\treturn iSuccess\n}\n\n// insertSingle inserts an entry in the reorderBuffer for the rune at\n// position i. info is the runeInfo for the rune at position i.\nfunc (rb *reorderBuffer) insertSingle(src input, i int, info Properties) {\n\tsrc.copySlice(rb.byte[rb.nbyte:], i, i+int(info.size))\n\trb.insertOrdered(info)\n}\n\n// insertCGJ inserts a Combining Grapheme Joiner (0x034f) into rb.\nfunc (rb *reorderBuffer) insertCGJ() {\n\trb.insertSingle(input{str: GraphemeJoiner}, 0, Properties{size: uint8(len(GraphemeJoiner))})\n}\n\n// appendRune inserts a rune at the end of the buffer. It is used for Hangul.\nfunc (rb *reorderBuffer) appendRune(r rune) {\n\tbn := rb.nbyte\n\tsz := utf8.EncodeRune(rb.byte[bn:], rune(r))\n\trb.nbyte += utf8.UTFMax\n\trb.rune[rb.nrune] = Properties{pos: bn, size: uint8(sz)}\n\trb.nrune++\n}\n\n// assignRune sets a rune at position pos. It is used for Hangul and recomposition.\nfunc (rb *reorderBuffer) assignRune(pos int, r rune) {\n\tbn := rb.rune[pos].pos\n\tsz := utf8.EncodeRune(rb.byte[bn:], rune(r))\n\trb.rune[pos] = Properties{pos: bn, size: uint8(sz)}\n}\n\n// runeAt returns the rune at position n. It is used for Hangul and recomposition.\nfunc (rb *reorderBuffer) runeAt(n int) rune {\n\tinf := rb.rune[n]\n\tr, _ := utf8.DecodeRune(rb.byte[inf.pos : inf.pos+inf.size])\n\treturn r\n}\n\n// bytesAt returns the UTF-8 encoding of the rune at position n.\n// It is used for Hangul and recomposition.\nfunc (rb *reorderBuffer) bytesAt(n int) []byte {\n\tinf := rb.rune[n]\n\treturn rb.byte[inf.pos : int(inf.pos)+int(inf.size)]\n}\n\n// For Hangul we combine algorithmically, instead of using tables.\nconst (\n\thangulBase  = 0xAC00 // UTF-8(hangulBase) -> EA B0 80\n\thangulBase0 = 0xEA\n\thangulBase1 = 0xB0\n\thangulBase2 = 0x80\n\n\thangulEnd  = hangulBase + jamoLVTCount // UTF-8(0xD7A4) -> ED 9E A4\n\thangulEnd0 = 0xED\n\thangulEnd1 = 0x9E\n\thangulEnd2 = 0xA4\n\n\tjamoLBase  = 0x1100 // UTF-8(jamoLBase) -> E1 84 00\n\tjamoLBase0 = 0xE1\n\tjamoLBase1 = 0x84\n\tjamoLEnd   = 0x1113\n\tjamoVBase  = 0x1161\n\tjamoVEnd   = 0x1176\n\tjamoTBase  = 0x11A7\n\tjamoTEnd   = 0x11C3\n\n\tjamoTCount   = 28\n\tjamoVCount   = 21\n\tjamoVTCount  = 21 * 28\n\tjamoLVTCount = 19 * 21 * 28\n)\n\nconst hangulUTF8Size = 3\n\nfunc isHangul(b []byte) bool {\n\tif len(b) < hangulUTF8Size {\n\t\treturn false\n\t}\n\tb0 := b[0]\n\tif b0 < hangulBase0 {\n\t\treturn false\n\t}\n\tb1 := b[1]\n\tswitch {\n\tcase b0 == hangulBase0:\n\t\treturn b1 >= hangulBase1\n\tcase b0 < hangulEnd0:\n\t\treturn true\n\tcase b0 > hangulEnd0:\n\t\treturn false\n\tcase b1 < hangulEnd1:\n\t\treturn true\n\t}\n\treturn b1 == hangulEnd1 && b[2] < hangulEnd2\n}\n\nfunc isHangulString(b string) bool {\n\tif len(b) < hangulUTF8Size {\n\t\treturn false\n\t}\n\tb0 := b[0]\n\tif b0 < hangulBase0 {\n\t\treturn false\n\t}\n\tb1 := b[1]\n\tswitch {\n\tcase b0 == hangulBase0:\n\t\treturn b1 >= hangulBase1\n\tcase b0 < hangulEnd0:\n\t\treturn true\n\tcase b0 > hangulEnd0:\n\t\treturn false\n\tcase b1 < hangulEnd1:\n\t\treturn true\n\t}\n\treturn b1 == hangulEnd1 && b[2] < hangulEnd2\n}\n\n// Caller must ensure len(b) >= 2.\nfunc isJamoVT(b []byte) bool {\n\t// True if (rune & 0xff00) == jamoLBase\n\treturn b[0] == jamoLBase0 && (b[1]&0xFC) == jamoLBase1\n}\n\nfunc isHangulWithoutJamoT(b []byte) bool {\n\tc, _ := utf8.DecodeRune(b)\n\tc -= hangulBase\n\treturn c < jamoLVTCount && c%jamoTCount == 0\n}\n\n// decomposeHangul writes the decomposed Hangul to buf and returns the number\n// of bytes written.  len(buf) should be at least 9.\nfunc decomposeHangul(buf []byte, r rune) int {\n\tconst JamoUTF8Len = 3\n\tr -= hangulBase\n\tx := r % jamoTCount\n\tr /= jamoTCount\n\tutf8.EncodeRune(buf, jamoLBase+r/jamoVCount)\n\tutf8.EncodeRune(buf[JamoUTF8Len:], jamoVBase+r%jamoVCount)\n\tif x != 0 {\n\t\tutf8.EncodeRune(buf[2*JamoUTF8Len:], jamoTBase+x)\n\t\treturn 3 * JamoUTF8Len\n\t}\n\treturn 2 * JamoUTF8Len\n}\n\n// decomposeHangul algorithmically decomposes a Hangul rune into\n// its Jamo components.\n// See http://unicode.org/reports/tr15/#Hangul for details on decomposing Hangul.\nfunc (rb *reorderBuffer) decomposeHangul(r rune) {\n\tr -= hangulBase\n\tx := r % jamoTCount\n\tr /= jamoTCount\n\trb.appendRune(jamoLBase + r/jamoVCount)\n\trb.appendRune(jamoVBase + r%jamoVCount)\n\tif x != 0 {\n\t\trb.appendRune(jamoTBase + x)\n\t}\n}\n\n// combineHangul algorithmically combines Jamo character components into Hangul.\n// See http://unicode.org/reports/tr15/#Hangul for details on combining Hangul.\nfunc (rb *reorderBuffer) combineHangul(s, i, k int) {\n\tb := rb.rune[:]\n\tbn := rb.nrune\n\tfor ; i < bn; i++ {\n\t\tcccB := b[k-1].ccc\n\t\tcccC := b[i].ccc\n\t\tif cccB == 0 {\n\t\t\ts = k - 1\n\t\t}\n\t\tif s != k-1 && cccB >= cccC {\n\t\t\t// b[i] is blocked by greater-equal cccX below it\n\t\t\tb[k] = b[i]\n\t\t\tk++\n\t\t} else {\n\t\t\tl := rb.runeAt(s) // also used to compare to hangulBase\n\t\t\tv := rb.runeAt(i) // also used to compare to jamoT\n\t\t\tswitch {\n\t\t\tcase jamoLBase <= l && l < jamoLEnd &&\n\t\t\t\tjamoVBase <= v && v < jamoVEnd:\n\t\t\t\t// 11xx plus 116x to LV\n\t\t\t\trb.assignRune(s, hangulBase+\n\t\t\t\t\t(l-jamoLBase)*jamoVTCount+(v-jamoVBase)*jamoTCount)\n\t\t\tcase hangulBase <= l && l < hangulEnd &&\n\t\t\t\tjamoTBase < v && v < jamoTEnd &&\n\t\t\t\t((l-hangulBase)%jamoTCount) == 0:\n\t\t\t\t// ACxx plus 11Ax to LVT\n\t\t\t\trb.assignRune(s, l+v-jamoTBase)\n\t\t\tdefault:\n\t\t\t\tb[k] = b[i]\n\t\t\t\tk++\n\t\t\t}\n\t\t}\n\t}\n\trb.nrune = k\n}\n\n// compose recombines the runes in the buffer.\n// It should only be used to recompose a single segment, as it will not\n// handle alternations between Hangul and non-Hangul characters correctly.\nfunc (rb *reorderBuffer) compose() {\n\t// UAX #15, section X5 , including Corrigendum #5\n\t// \"In any character sequence beginning with starter S, a character C is\n\t//  blocked from S if and only if there is some character B between S\n\t//  and C, and either B is a starter or it has the same or higher\n\t//  combining class as C.\"\n\tbn := rb.nrune\n\tif bn == 0 {\n\t\treturn\n\t}\n\tk := 1\n\tb := rb.rune[:]\n\tfor s, i := 0, 1; i < bn; i++ {\n\t\tif isJamoVT(rb.bytesAt(i)) {\n\t\t\t// Redo from start in Hangul mode. Necessary to support\n\t\t\t// U+320E..U+321E in NFKC mode.\n\t\t\trb.combineHangul(s, i, k)\n\t\t\treturn\n\t\t}\n\t\tii := b[i]\n\t\t// We can only use combineForward as a filter if we later\n\t\t// get the info for the combined character. This is more\n\t\t// expensive than using the filter. Using combinesBackward()\n\t\t// is safe.\n\t\tif ii.combinesBackward() {\n\t\t\tcccB := b[k-1].ccc\n\t\t\tcccC := ii.ccc\n\t\t\tblocked := false // b[i] blocked by starter or greater or equal CCC?\n\t\t\tif cccB == 0 {\n\t\t\t\ts = k - 1\n\t\t\t} else {\n\t\t\t\tblocked = s != k-1 && cccB >= cccC\n\t\t\t}\n\t\t\tif !blocked {\n\t\t\t\tcombined := combine(rb.runeAt(s), rb.runeAt(i))\n\t\t\t\tif combined != 0 {\n\t\t\t\t\trb.assignRune(s, combined)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tb[k] = b[i]\n\t\tk++\n\t}\n\trb.nrune = k\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/forminfo.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage norm\n\n// This file contains Form-specific logic and wrappers for data in tables.go.\n\n// Rune info is stored in a separate trie per composing form. A composing form\n// and its corresponding decomposing form share the same trie.  Each trie maps\n// a rune to a uint16. The values take two forms.  For v >= 0x8000:\n//   bits\n//   15:    1 (inverse of NFD_QC bit of qcInfo)\n//   13..7: qcInfo (see below). isYesD is always true (no decompostion).\n//    6..0: ccc (compressed CCC value).\n// For v < 0x8000, the respective rune has a decomposition and v is an index\n// into a byte array of UTF-8 decomposition sequences and additional info and\n// has the form:\n//    <header> <decomp_byte>* [<tccc> [<lccc>]]\n// The header contains the number of bytes in the decomposition (excluding this\n// length byte). The two most significant bits of this length byte correspond\n// to bit 5 and 4 of qcInfo (see below).  The byte sequence itself starts at v+1.\n// The byte sequence is followed by a trailing and leading CCC if the values\n// for these are not zero.  The value of v determines which ccc are appended\n// to the sequences.  For v < firstCCC, there are none, for v >= firstCCC,\n// the sequence is followed by a trailing ccc, and for v >= firstLeadingCC\n// there is an additional leading ccc. The value of tccc itself is the\n// trailing CCC shifted left 2 bits. The two least-significant bits of tccc\n// are the number of trailing non-starters.\n\nconst (\n\tqcInfoMask      = 0x3F // to clear all but the relevant bits in a qcInfo\n\theaderLenMask   = 0x3F // extract the length value from the header byte\n\theaderFlagsMask = 0xC0 // extract the qcInfo bits from the header byte\n)\n\n// Properties provides access to normalization properties of a rune.\ntype Properties struct {\n\tpos   uint8  // start position in reorderBuffer; used in composition.go\n\tsize  uint8  // length of UTF-8 encoding of this rune\n\tccc   uint8  // leading canonical combining class (ccc if not decomposition)\n\ttccc  uint8  // trailing canonical combining class (ccc if not decomposition)\n\tnLead uint8  // number of leading non-starters.\n\tflags qcInfo // quick check flags\n\tindex uint16\n}\n\n// functions dispatchable per form\ntype lookupFunc func(b input, i int) Properties\n\n// formInfo holds Form-specific functions and tables.\ntype formInfo struct {\n\tform                     Form\n\tcomposing, compatibility bool // form type\n\tinfo                     lookupFunc\n\tnextMain                 iterFunc\n}\n\nvar formTable = []*formInfo{{\n\tform:          NFC,\n\tcomposing:     true,\n\tcompatibility: false,\n\tinfo:          lookupInfoNFC,\n\tnextMain:      nextComposed,\n}, {\n\tform:          NFD,\n\tcomposing:     false,\n\tcompatibility: false,\n\tinfo:          lookupInfoNFC,\n\tnextMain:      nextDecomposed,\n}, {\n\tform:          NFKC,\n\tcomposing:     true,\n\tcompatibility: true,\n\tinfo:          lookupInfoNFKC,\n\tnextMain:      nextComposed,\n}, {\n\tform:          NFKD,\n\tcomposing:     false,\n\tcompatibility: true,\n\tinfo:          lookupInfoNFKC,\n\tnextMain:      nextDecomposed,\n}}\n\n// We do not distinguish between boundaries for NFC, NFD, etc. to avoid\n// unexpected behavior for the user.  For example, in NFD, there is a boundary\n// after 'a'.  However, 'a' might combine with modifiers, so from the application's\n// perspective it is not a good boundary. We will therefore always use the\n// boundaries for the combining variants.\n\n// BoundaryBefore returns true if this rune starts a new segment and\n// cannot combine with any rune on the left.\nfunc (p Properties) BoundaryBefore() bool {\n\tif p.ccc == 0 && !p.combinesBackward() {\n\t\treturn true\n\t}\n\t// We assume that the CCC of the first character in a decomposition\n\t// is always non-zero if different from info.ccc and that we can return\n\t// false at this point. This is verified by maketables.\n\treturn false\n}\n\n// BoundaryAfter returns true if runes cannot combine with or otherwise\n// interact with this or previous runes.\nfunc (p Properties) BoundaryAfter() bool {\n\t// TODO: loosen these conditions.\n\treturn p.isInert()\n}\n\n// We pack quick check data in 4 bits:\n//   5:    Combines forward  (0 == false, 1 == true)\n//   4..3: NFC_QC Yes(00), No (10), or Maybe (11)\n//   2:    NFD_QC Yes (0) or No (1). No also means there is a decomposition.\n//   1..0: Number of trailing non-starters.\n//\n// When all 4 bits are zero, the character is inert, meaning it is never\n// influenced by normalization.\ntype qcInfo uint8\n\nfunc (p Properties) isYesC() bool { return p.flags&0x10 == 0 }\nfunc (p Properties) isYesD() bool { return p.flags&0x4 == 0 }\n\nfunc (p Properties) combinesForward() bool  { return p.flags&0x20 != 0 }\nfunc (p Properties) combinesBackward() bool { return p.flags&0x8 != 0 } // == isMaybe\nfunc (p Properties) hasDecomposition() bool { return p.flags&0x4 != 0 } // == isNoD\n\nfunc (p Properties) isInert() bool {\n\treturn p.flags&qcInfoMask == 0 && p.ccc == 0\n}\n\nfunc (p Properties) multiSegment() bool {\n\treturn p.index >= firstMulti && p.index < endMulti\n}\n\nfunc (p Properties) nLeadingNonStarters() uint8 {\n\treturn p.nLead\n}\n\nfunc (p Properties) nTrailingNonStarters() uint8 {\n\treturn uint8(p.flags & 0x03)\n}\n\n// Decomposition returns the decomposition for the underlying rune\n// or nil if there is none.\nfunc (p Properties) Decomposition() []byte {\n\t// TODO: create the decomposition for Hangul?\n\tif p.index == 0 {\n\t\treturn nil\n\t}\n\ti := p.index\n\tn := decomps[i] & headerLenMask\n\ti++\n\treturn decomps[i : i+uint16(n)]\n}\n\n// Size returns the length of UTF-8 encoding of the rune.\nfunc (p Properties) Size() int {\n\treturn int(p.size)\n}\n\n// CCC returns the canonical combining class of the underlying rune.\nfunc (p Properties) CCC() uint8 {\n\tif p.index >= firstCCCZeroExcept {\n\t\treturn 0\n\t}\n\treturn ccc[p.ccc]\n}\n\n// LeadCCC returns the CCC of the first rune in the decomposition.\n// If there is no decomposition, LeadCCC equals CCC.\nfunc (p Properties) LeadCCC() uint8 {\n\treturn ccc[p.ccc]\n}\n\n// TrailCCC returns the CCC of the last rune in the decomposition.\n// If there is no decomposition, TrailCCC equals CCC.\nfunc (p Properties) TrailCCC() uint8 {\n\treturn ccc[p.tccc]\n}\n\n// Recomposition\n// We use 32-bit keys instead of 64-bit for the two codepoint keys.\n// This clips off the bits of three entries, but we know this will not\n// result in a collision. In the unlikely event that changes to\n// UnicodeData.txt introduce collisions, the compiler will catch it.\n// Note that the recomposition map for NFC and NFKC are identical.\n\n// combine returns the combined rune or 0 if it doesn't exist.\nfunc combine(a, b rune) rune {\n\tkey := uint32(uint16(a))<<16 + uint32(uint16(b))\n\treturn recompMap[key]\n}\n\nfunc lookupInfoNFC(b input, i int) Properties {\n\tv, sz := b.charinfoNFC(i)\n\treturn compInfo(v, sz)\n}\n\nfunc lookupInfoNFKC(b input, i int) Properties {\n\tv, sz := b.charinfoNFKC(i)\n\treturn compInfo(v, sz)\n}\n\n// Properties returns properties for the first rune in s.\nfunc (f Form) Properties(s []byte) Properties {\n\tif f == NFC || f == NFD {\n\t\treturn compInfo(nfcData.lookup(s))\n\t}\n\treturn compInfo(nfkcData.lookup(s))\n}\n\n// PropertiesString returns properties for the first rune in s.\nfunc (f Form) PropertiesString(s string) Properties {\n\tif f == NFC || f == NFD {\n\t\treturn compInfo(nfcData.lookupString(s))\n\t}\n\treturn compInfo(nfkcData.lookupString(s))\n}\n\n// compInfo converts the information contained in v and sz\n// to a Properties.  See the comment at the top of the file\n// for more information on the format.\nfunc compInfo(v uint16, sz int) Properties {\n\tif v == 0 {\n\t\treturn Properties{size: uint8(sz)}\n\t} else if v >= 0x8000 {\n\t\tp := Properties{\n\t\t\tsize:  uint8(sz),\n\t\t\tccc:   uint8(v),\n\t\t\ttccc:  uint8(v),\n\t\t\tflags: qcInfo(v >> 8),\n\t\t}\n\t\tif p.ccc > 0 || p.combinesBackward() {\n\t\t\tp.nLead = uint8(p.flags & 0x3)\n\t\t}\n\t\treturn p\n\t}\n\t// has decomposition\n\th := decomps[v]\n\tf := (qcInfo(h&headerFlagsMask) >> 2) | 0x4\n\tp := Properties{size: uint8(sz), flags: f, index: v}\n\tif v >= firstCCC {\n\t\tv += uint16(h&headerLenMask) + 1\n\t\tc := decomps[v]\n\t\tp.tccc = c >> 2\n\t\tp.flags |= qcInfo(c & 0x3)\n\t\tif v >= firstLeadingCCC {\n\t\t\tp.nLead = c & 0x3\n\t\t\tif v >= firstStarterWithNLead {\n\t\t\t\t// We were tricked. Remove the decomposition.\n\t\t\t\tp.flags &= 0x03\n\t\t\t\tp.index = 0\n\t\t\t\treturn p\n\t\t\t}\n\t\t\tp.ccc = decomps[v+1]\n\t\t}\n\t}\n\treturn p\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/input.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage norm\n\nimport \"unicode/utf8\"\n\ntype input struct {\n\tstr   string\n\tbytes []byte\n}\n\nfunc inputBytes(str []byte) input {\n\treturn input{bytes: str}\n}\n\nfunc inputString(str string) input {\n\treturn input{str: str}\n}\n\nfunc (in *input) setBytes(str []byte) {\n\tin.str = \"\"\n\tin.bytes = str\n}\n\nfunc (in *input) setString(str string) {\n\tin.str = str\n\tin.bytes = nil\n}\n\nfunc (in *input) _byte(p int) byte {\n\tif in.bytes == nil {\n\t\treturn in.str[p]\n\t}\n\treturn in.bytes[p]\n}\n\nfunc (in *input) skipASCII(p, max int) int {\n\tif in.bytes == nil {\n\t\tfor ; p < max && in.str[p] < utf8.RuneSelf; p++ {\n\t\t}\n\t} else {\n\t\tfor ; p < max && in.bytes[p] < utf8.RuneSelf; p++ {\n\t\t}\n\t}\n\treturn p\n}\n\nfunc (in *input) skipContinuationBytes(p int) int {\n\tif in.bytes == nil {\n\t\tfor ; p < len(in.str) && !utf8.RuneStart(in.str[p]); p++ {\n\t\t}\n\t} else {\n\t\tfor ; p < len(in.bytes) && !utf8.RuneStart(in.bytes[p]); p++ {\n\t\t}\n\t}\n\treturn p\n}\n\nfunc (in *input) appendSlice(buf []byte, b, e int) []byte {\n\tif in.bytes != nil {\n\t\treturn append(buf, in.bytes[b:e]...)\n\t}\n\tfor i := b; i < e; i++ {\n\t\tbuf = append(buf, in.str[i])\n\t}\n\treturn buf\n}\n\nfunc (in *input) copySlice(buf []byte, b, e int) int {\n\tif in.bytes == nil {\n\t\treturn copy(buf, in.str[b:e])\n\t}\n\treturn copy(buf, in.bytes[b:e])\n}\n\nfunc (in *input) charinfoNFC(p int) (uint16, int) {\n\tif in.bytes == nil {\n\t\treturn nfcData.lookupString(in.str[p:])\n\t}\n\treturn nfcData.lookup(in.bytes[p:])\n}\n\nfunc (in *input) charinfoNFKC(p int) (uint16, int) {\n\tif in.bytes == nil {\n\t\treturn nfkcData.lookupString(in.str[p:])\n\t}\n\treturn nfkcData.lookup(in.bytes[p:])\n}\n\nfunc (in *input) hangul(p int) (r rune) {\n\tvar size int\n\tif in.bytes == nil {\n\t\tif !isHangulString(in.str[p:]) {\n\t\t\treturn 0\n\t\t}\n\t\tr, size = utf8.DecodeRuneInString(in.str[p:])\n\t} else {\n\t\tif !isHangul(in.bytes[p:]) {\n\t\t\treturn 0\n\t\t}\n\t\tr, size = utf8.DecodeRune(in.bytes[p:])\n\t}\n\tif size != hangulUTF8Size {\n\t\treturn 0\n\t}\n\treturn r\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/iter.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage norm\n\nimport (\n\t\"fmt\"\n\t\"unicode/utf8\"\n)\n\n// MaxSegmentSize is the maximum size of a byte buffer needed to consider any\n// sequence of starter and non-starter runes for the purpose of normalization.\nconst MaxSegmentSize = maxByteBufferSize\n\n// An Iter iterates over a string or byte slice, while normalizing it\n// to a given Form.\ntype Iter struct {\n\trb     reorderBuffer\n\tbuf    [maxByteBufferSize]byte\n\tinfo   Properties // first character saved from previous iteration\n\tnext   iterFunc   // implementation of next depends on form\n\tasciiF iterFunc\n\n\tp        int    // current position in input source\n\tmultiSeg []byte // remainder of multi-segment decomposition\n}\n\ntype iterFunc func(*Iter) []byte\n\n// Init initializes i to iterate over src after normalizing it to Form f.\nfunc (i *Iter) Init(f Form, src []byte) {\n\ti.p = 0\n\tif len(src) == 0 {\n\t\ti.setDone()\n\t\ti.rb.nsrc = 0\n\t\treturn\n\t}\n\ti.multiSeg = nil\n\ti.rb.init(f, src)\n\ti.next = i.rb.f.nextMain\n\ti.asciiF = nextASCIIBytes\n\ti.info = i.rb.f.info(i.rb.src, i.p)\n\ti.rb.ss.first(i.info)\n}\n\n// InitString initializes i to iterate over src after normalizing it to Form f.\nfunc (i *Iter) InitString(f Form, src string) {\n\ti.p = 0\n\tif len(src) == 0 {\n\t\ti.setDone()\n\t\ti.rb.nsrc = 0\n\t\treturn\n\t}\n\ti.multiSeg = nil\n\ti.rb.initString(f, src)\n\ti.next = i.rb.f.nextMain\n\ti.asciiF = nextASCIIString\n\ti.info = i.rb.f.info(i.rb.src, i.p)\n\ti.rb.ss.first(i.info)\n}\n\n// Seek sets the segment to be returned by the next call to Next to start\n// at position p.  It is the responsibility of the caller to set p to the\n// start of a segment.\nfunc (i *Iter) Seek(offset int64, whence int) (int64, error) {\n\tvar abs int64\n\tswitch whence {\n\tcase 0:\n\t\tabs = offset\n\tcase 1:\n\t\tabs = int64(i.p) + offset\n\tcase 2:\n\t\tabs = int64(i.rb.nsrc) + offset\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"norm: invalid whence\")\n\t}\n\tif abs < 0 {\n\t\treturn 0, fmt.Errorf(\"norm: negative position\")\n\t}\n\tif int(abs) >= i.rb.nsrc {\n\t\ti.setDone()\n\t\treturn int64(i.p), nil\n\t}\n\ti.p = int(abs)\n\ti.multiSeg = nil\n\ti.next = i.rb.f.nextMain\n\ti.info = i.rb.f.info(i.rb.src, i.p)\n\ti.rb.ss.first(i.info)\n\treturn abs, nil\n}\n\n// returnSlice returns a slice of the underlying input type as a byte slice.\n// If the underlying is of type []byte, it will simply return a slice.\n// If the underlying is of type string, it will copy the slice to the buffer\n// and return that.\nfunc (i *Iter) returnSlice(a, b int) []byte {\n\tif i.rb.src.bytes == nil {\n\t\treturn i.buf[:copy(i.buf[:], i.rb.src.str[a:b])]\n\t}\n\treturn i.rb.src.bytes[a:b]\n}\n\n// Pos returns the byte position at which the next call to Next will commence processing.\nfunc (i *Iter) Pos() int {\n\treturn i.p\n}\n\nfunc (i *Iter) setDone() {\n\ti.next = nextDone\n\ti.p = i.rb.nsrc\n}\n\n// Done returns true if there is no more input to process.\nfunc (i *Iter) Done() bool {\n\treturn i.p >= i.rb.nsrc\n}\n\n// Next returns f(i.input[i.Pos():n]), where n is a boundary of i.input.\n// For any input a and b for which f(a) == f(b), subsequent calls\n// to Next will return the same segments.\n// Modifying runes are grouped together with the preceding starter, if such a starter exists.\n// Although not guaranteed, n will typically be the smallest possible n.\nfunc (i *Iter) Next() []byte {\n\treturn i.next(i)\n}\n\nfunc nextASCIIBytes(i *Iter) []byte {\n\tp := i.p + 1\n\tif p >= i.rb.nsrc {\n\t\ti.setDone()\n\t\treturn i.rb.src.bytes[i.p:p]\n\t}\n\tif i.rb.src.bytes[p] < utf8.RuneSelf {\n\t\tp0 := i.p\n\t\ti.p = p\n\t\treturn i.rb.src.bytes[p0:p]\n\t}\n\ti.info = i.rb.f.info(i.rb.src, i.p)\n\ti.next = i.rb.f.nextMain\n\treturn i.next(i)\n}\n\nfunc nextASCIIString(i *Iter) []byte {\n\tp := i.p + 1\n\tif p >= i.rb.nsrc {\n\t\ti.buf[0] = i.rb.src.str[i.p]\n\t\ti.setDone()\n\t\treturn i.buf[:1]\n\t}\n\tif i.rb.src.str[p] < utf8.RuneSelf {\n\t\ti.buf[0] = i.rb.src.str[i.p]\n\t\ti.p = p\n\t\treturn i.buf[:1]\n\t}\n\ti.info = i.rb.f.info(i.rb.src, i.p)\n\ti.next = i.rb.f.nextMain\n\treturn i.next(i)\n}\n\nfunc nextHangul(i *Iter) []byte {\n\tp := i.p\n\tnext := p + hangulUTF8Size\n\tif next >= i.rb.nsrc {\n\t\ti.setDone()\n\t} else if i.rb.src.hangul(next) == 0 {\n\t\ti.rb.ss.next(i.info)\n\t\ti.info = i.rb.f.info(i.rb.src, i.p)\n\t\ti.next = i.rb.f.nextMain\n\t\treturn i.next(i)\n\t}\n\ti.p = next\n\treturn i.buf[:decomposeHangul(i.buf[:], i.rb.src.hangul(p))]\n}\n\nfunc nextDone(i *Iter) []byte {\n\treturn nil\n}\n\n// nextMulti is used for iterating over multi-segment decompositions\n// for decomposing normal forms.\nfunc nextMulti(i *Iter) []byte {\n\tj := 0\n\td := i.multiSeg\n\t// skip first rune\n\tfor j = 1; j < len(d) && !utf8.RuneStart(d[j]); j++ {\n\t}\n\tfor j < len(d) {\n\t\tinfo := i.rb.f.info(input{bytes: d}, j)\n\t\tif info.BoundaryBefore() {\n\t\t\ti.multiSeg = d[j:]\n\t\t\treturn d[:j]\n\t\t}\n\t\tj += int(info.size)\n\t}\n\t// treat last segment as normal decomposition\n\ti.next = i.rb.f.nextMain\n\treturn i.next(i)\n}\n\n// nextMultiNorm is used for iterating over multi-segment decompositions\n// for composing normal forms.\nfunc nextMultiNorm(i *Iter) []byte {\n\tj := 0\n\td := i.multiSeg\n\tfor j < len(d) {\n\t\tinfo := i.rb.f.info(input{bytes: d}, j)\n\t\tif info.BoundaryBefore() {\n\t\t\ti.rb.compose()\n\t\t\tseg := i.buf[:i.rb.flushCopy(i.buf[:])]\n\t\t\ti.rb.insertUnsafe(input{bytes: d}, j, info)\n\t\t\ti.multiSeg = d[j+int(info.size):]\n\t\t\treturn seg\n\t\t}\n\t\ti.rb.insertUnsafe(input{bytes: d}, j, info)\n\t\tj += int(info.size)\n\t}\n\ti.multiSeg = nil\n\ti.next = nextComposed\n\treturn doNormComposed(i)\n}\n\n// nextDecomposed is the implementation of Next for forms NFD and NFKD.\nfunc nextDecomposed(i *Iter) (next []byte) {\n\toutp := 0\n\tinCopyStart, outCopyStart := i.p, 0\n\tfor {\n\t\tif sz := int(i.info.size); sz <= 1 {\n\t\t\ti.rb.ss = 0\n\t\t\tp := i.p\n\t\t\ti.p++ // ASCII or illegal byte.  Either way, advance by 1.\n\t\t\tif i.p >= i.rb.nsrc {\n\t\t\t\ti.setDone()\n\t\t\t\treturn i.returnSlice(p, i.p)\n\t\t\t} else if i.rb.src._byte(i.p) < utf8.RuneSelf {\n\t\t\t\ti.next = i.asciiF\n\t\t\t\treturn i.returnSlice(p, i.p)\n\t\t\t}\n\t\t\toutp++\n\t\t} else if d := i.info.Decomposition(); d != nil {\n\t\t\t// Note: If leading CCC != 0, then len(d) == 2 and last is also non-zero.\n\t\t\t// Case 1: there is a leftover to copy.  In this case the decomposition\n\t\t\t// must begin with a modifier and should always be appended.\n\t\t\t// Case 2: no leftover. Simply return d if followed by a ccc == 0 value.\n\t\t\tp := outp + len(d)\n\t\t\tif outp > 0 {\n\t\t\t\ti.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)\n\t\t\t\t// TODO: this condition should not be possible, but we leave it\n\t\t\t\t// in for defensive purposes.\n\t\t\t\tif p > len(i.buf) {\n\t\t\t\t\treturn i.buf[:outp]\n\t\t\t\t}\n\t\t\t} else if i.info.multiSegment() {\n\t\t\t\t// outp must be 0 as multi-segment decompositions always\n\t\t\t\t// start a new segment.\n\t\t\t\tif i.multiSeg == nil {\n\t\t\t\t\ti.multiSeg = d\n\t\t\t\t\ti.next = nextMulti\n\t\t\t\t\treturn nextMulti(i)\n\t\t\t\t}\n\t\t\t\t// We are in the last segment.  Treat as normal decomposition.\n\t\t\t\td = i.multiSeg\n\t\t\t\ti.multiSeg = nil\n\t\t\t\tp = len(d)\n\t\t\t}\n\t\t\tprevCC := i.info.tccc\n\t\t\tif i.p += sz; i.p >= i.rb.nsrc {\n\t\t\t\ti.setDone()\n\t\t\t\ti.info = Properties{} // Force BoundaryBefore to succeed.\n\t\t\t} else {\n\t\t\t\ti.info = i.rb.f.info(i.rb.src, i.p)\n\t\t\t}\n\t\t\tswitch i.rb.ss.next(i.info) {\n\t\t\tcase ssOverflow:\n\t\t\t\ti.next = nextCGJDecompose\n\t\t\t\tfallthrough\n\t\t\tcase ssStarter:\n\t\t\t\tif outp > 0 {\n\t\t\t\t\tcopy(i.buf[outp:], d)\n\t\t\t\t\treturn i.buf[:p]\n\t\t\t\t}\n\t\t\t\treturn d\n\t\t\t}\n\t\t\tcopy(i.buf[outp:], d)\n\t\t\toutp = p\n\t\t\tinCopyStart, outCopyStart = i.p, outp\n\t\t\tif i.info.ccc < prevCC {\n\t\t\t\tgoto doNorm\n\t\t\t}\n\t\t\tcontinue\n\t\t} else if r := i.rb.src.hangul(i.p); r != 0 {\n\t\t\toutp = decomposeHangul(i.buf[:], r)\n\t\t\ti.p += hangulUTF8Size\n\t\t\tinCopyStart, outCopyStart = i.p, outp\n\t\t\tif i.p >= i.rb.nsrc {\n\t\t\t\ti.setDone()\n\t\t\t\tbreak\n\t\t\t} else if i.rb.src.hangul(i.p) != 0 {\n\t\t\t\ti.next = nextHangul\n\t\t\t\treturn i.buf[:outp]\n\t\t\t}\n\t\t} else {\n\t\t\tp := outp + sz\n\t\t\tif p > len(i.buf) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\toutp = p\n\t\t\ti.p += sz\n\t\t}\n\t\tif i.p >= i.rb.nsrc {\n\t\t\ti.setDone()\n\t\t\tbreak\n\t\t}\n\t\tprevCC := i.info.tccc\n\t\ti.info = i.rb.f.info(i.rb.src, i.p)\n\t\tif v := i.rb.ss.next(i.info); v == ssStarter {\n\t\t\tbreak\n\t\t} else if v == ssOverflow {\n\t\t\ti.next = nextCGJDecompose\n\t\t\tbreak\n\t\t}\n\t\tif i.info.ccc < prevCC {\n\t\t\tgoto doNorm\n\t\t}\n\t}\n\tif outCopyStart == 0 {\n\t\treturn i.returnSlice(inCopyStart, i.p)\n\t} else if inCopyStart < i.p {\n\t\ti.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)\n\t}\n\treturn i.buf[:outp]\ndoNorm:\n\t// Insert what we have decomposed so far in the reorderBuffer.\n\t// As we will only reorder, there will always be enough room.\n\ti.rb.src.copySlice(i.buf[outCopyStart:], inCopyStart, i.p)\n\ti.rb.insertDecomposed(i.buf[0:outp])\n\treturn doNormDecomposed(i)\n}\n\nfunc doNormDecomposed(i *Iter) []byte {\n\tfor {\n\t\ti.rb.insertUnsafe(i.rb.src, i.p, i.info)\n\t\tif i.p += int(i.info.size); i.p >= i.rb.nsrc {\n\t\t\ti.setDone()\n\t\t\tbreak\n\t\t}\n\t\ti.info = i.rb.f.info(i.rb.src, i.p)\n\t\tif i.info.ccc == 0 {\n\t\t\tbreak\n\t\t}\n\t\tif s := i.rb.ss.next(i.info); s == ssOverflow {\n\t\t\ti.next = nextCGJDecompose\n\t\t\tbreak\n\t\t}\n\t}\n\t// new segment or too many combining characters: exit normalization\n\treturn i.buf[:i.rb.flushCopy(i.buf[:])]\n}\n\nfunc nextCGJDecompose(i *Iter) []byte {\n\ti.rb.ss = 0\n\ti.rb.insertCGJ()\n\ti.next = nextDecomposed\n\ti.rb.ss.first(i.info)\n\tbuf := doNormDecomposed(i)\n\treturn buf\n}\n\n// nextComposed is the implementation of Next for forms NFC and NFKC.\nfunc nextComposed(i *Iter) []byte {\n\toutp, startp := 0, i.p\n\tvar prevCC uint8\n\tfor {\n\t\tif !i.info.isYesC() {\n\t\t\tgoto doNorm\n\t\t}\n\t\tprevCC = i.info.tccc\n\t\tsz := int(i.info.size)\n\t\tif sz == 0 {\n\t\t\tsz = 1 // illegal rune: copy byte-by-byte\n\t\t}\n\t\tp := outp + sz\n\t\tif p > len(i.buf) {\n\t\t\tbreak\n\t\t}\n\t\toutp = p\n\t\ti.p += sz\n\t\tif i.p >= i.rb.nsrc {\n\t\t\ti.setDone()\n\t\t\tbreak\n\t\t} else if i.rb.src._byte(i.p) < utf8.RuneSelf {\n\t\t\ti.rb.ss = 0\n\t\t\ti.next = i.asciiF\n\t\t\tbreak\n\t\t}\n\t\ti.info = i.rb.f.info(i.rb.src, i.p)\n\t\tif v := i.rb.ss.next(i.info); v == ssStarter {\n\t\t\tbreak\n\t\t} else if v == ssOverflow {\n\t\t\ti.next = nextCGJCompose\n\t\t\tbreak\n\t\t}\n\t\tif i.info.ccc < prevCC {\n\t\t\tgoto doNorm\n\t\t}\n\t}\n\treturn i.returnSlice(startp, i.p)\ndoNorm:\n\t// reset to start position\n\ti.p = startp\n\ti.info = i.rb.f.info(i.rb.src, i.p)\n\ti.rb.ss.first(i.info)\n\tif i.info.multiSegment() {\n\t\td := i.info.Decomposition()\n\t\tinfo := i.rb.f.info(input{bytes: d}, 0)\n\t\ti.rb.insertUnsafe(input{bytes: d}, 0, info)\n\t\ti.multiSeg = d[int(info.size):]\n\t\ti.next = nextMultiNorm\n\t\treturn nextMultiNorm(i)\n\t}\n\ti.rb.ss.first(i.info)\n\ti.rb.insertUnsafe(i.rb.src, i.p, i.info)\n\treturn doNormComposed(i)\n}\n\nfunc doNormComposed(i *Iter) []byte {\n\t// First rune should already be inserted.\n\tfor {\n\t\tif i.p += int(i.info.size); i.p >= i.rb.nsrc {\n\t\t\ti.setDone()\n\t\t\tbreak\n\t\t}\n\t\ti.info = i.rb.f.info(i.rb.src, i.p)\n\t\tif s := i.rb.ss.next(i.info); s == ssStarter {\n\t\t\tbreak\n\t\t} else if s == ssOverflow {\n\t\t\ti.next = nextCGJCompose\n\t\t\tbreak\n\t\t}\n\t\ti.rb.insertUnsafe(i.rb.src, i.p, i.info)\n\t}\n\ti.rb.compose()\n\tseg := i.buf[:i.rb.flushCopy(i.buf[:])]\n\treturn seg\n}\n\nfunc nextCGJCompose(i *Iter) []byte {\n\ti.rb.ss = 0 // instead of first\n\ti.rb.insertCGJ()\n\ti.next = nextComposed\n\t// Note that we treat any rune with nLeadingNonStarters > 0 as a non-starter,\n\t// even if they are not. This is particularly dubious for U+FF9E and UFF9A.\n\t// If we ever change that, insert a check here.\n\ti.rb.ss.first(i.info)\n\ti.rb.insertUnsafe(i.rb.src, i.p, i.info)\n\treturn doNormComposed(i)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/normalize.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Note: the file data_test.go that is generated should not be checked in.\n//go:generate go run maketables.go triegen.go\n//go:generate go test -tags test\n\n// Package norm contains types and functions for normalizing Unicode strings.\npackage norm // import \"golang.org/x/text/unicode/norm\"\n\nimport (\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/transform\"\n)\n\n// A Form denotes a canonical representation of Unicode code points.\n// The Unicode-defined normalization and equivalence forms are:\n//\n//   NFC   Unicode Normalization Form C\n//   NFD   Unicode Normalization Form D\n//   NFKC  Unicode Normalization Form KC\n//   NFKD  Unicode Normalization Form KD\n//\n// For a Form f, this documentation uses the notation f(x) to mean\n// the bytes or string x converted to the given form.\n// A position n in x is called a boundary if conversion to the form can\n// proceed independently on both sides:\n//   f(x) == append(f(x[0:n]), f(x[n:])...)\n//\n// References: http://unicode.org/reports/tr15/ and\n// http://unicode.org/notes/tn5/.\ntype Form int\n\nconst (\n\tNFC Form = iota\n\tNFD\n\tNFKC\n\tNFKD\n)\n\n// Bytes returns f(b). May return b if f(b) = b.\nfunc (f Form) Bytes(b []byte) []byte {\n\tsrc := inputBytes(b)\n\tft := formTable[f]\n\tn, ok := ft.quickSpan(src, 0, len(b), true)\n\tif ok {\n\t\treturn b\n\t}\n\tout := make([]byte, n, len(b))\n\tcopy(out, b[0:n])\n\trb := reorderBuffer{f: *ft, src: src, nsrc: len(b), out: out, flushF: appendFlush}\n\treturn doAppendInner(&rb, n)\n}\n\n// String returns f(s).\nfunc (f Form) String(s string) string {\n\tsrc := inputString(s)\n\tft := formTable[f]\n\tn, ok := ft.quickSpan(src, 0, len(s), true)\n\tif ok {\n\t\treturn s\n\t}\n\tout := make([]byte, n, len(s))\n\tcopy(out, s[0:n])\n\trb := reorderBuffer{f: *ft, src: src, nsrc: len(s), out: out, flushF: appendFlush}\n\treturn string(doAppendInner(&rb, n))\n}\n\n// IsNormal returns true if b == f(b).\nfunc (f Form) IsNormal(b []byte) bool {\n\tsrc := inputBytes(b)\n\tft := formTable[f]\n\tbp, ok := ft.quickSpan(src, 0, len(b), true)\n\tif ok {\n\t\treturn true\n\t}\n\trb := reorderBuffer{f: *ft, src: src, nsrc: len(b)}\n\trb.setFlusher(nil, cmpNormalBytes)\n\tfor bp < len(b) {\n\t\trb.out = b[bp:]\n\t\tif bp = decomposeSegment(&rb, bp, true); bp < 0 {\n\t\t\treturn false\n\t\t}\n\t\tbp, _ = rb.f.quickSpan(rb.src, bp, len(b), true)\n\t}\n\treturn true\n}\n\nfunc cmpNormalBytes(rb *reorderBuffer) bool {\n\tb := rb.out\n\tfor i := 0; i < rb.nrune; i++ {\n\t\tinfo := rb.rune[i]\n\t\tif int(info.size) > len(b) {\n\t\t\treturn false\n\t\t}\n\t\tp := info.pos\n\t\tpe := p + info.size\n\t\tfor ; p < pe; p++ {\n\t\t\tif b[0] != rb.byte[p] {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tb = b[1:]\n\t\t}\n\t}\n\treturn true\n}\n\n// IsNormalString returns true if s == f(s).\nfunc (f Form) IsNormalString(s string) bool {\n\tsrc := inputString(s)\n\tft := formTable[f]\n\tbp, ok := ft.quickSpan(src, 0, len(s), true)\n\tif ok {\n\t\treturn true\n\t}\n\trb := reorderBuffer{f: *ft, src: src, nsrc: len(s)}\n\trb.setFlusher(nil, func(rb *reorderBuffer) bool {\n\t\tfor i := 0; i < rb.nrune; i++ {\n\t\t\tinfo := rb.rune[i]\n\t\t\tif bp+int(info.size) > len(s) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tp := info.pos\n\t\t\tpe := p + info.size\n\t\t\tfor ; p < pe; p++ {\n\t\t\t\tif s[bp] != rb.byte[p] {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tbp++\n\t\t\t}\n\t\t}\n\t\treturn true\n\t})\n\tfor bp < len(s) {\n\t\tif bp = decomposeSegment(&rb, bp, true); bp < 0 {\n\t\t\treturn false\n\t\t}\n\t\tbp, _ = rb.f.quickSpan(rb.src, bp, len(s), true)\n\t}\n\treturn true\n}\n\n// patchTail fixes a case where a rune may be incorrectly normalized\n// if it is followed by illegal continuation bytes. It returns the\n// patched buffer and whether the decomposition is still in progress.\nfunc patchTail(rb *reorderBuffer) bool {\n\tinfo, p := lastRuneStart(&rb.f, rb.out)\n\tif p == -1 || info.size == 0 {\n\t\treturn true\n\t}\n\tend := p + int(info.size)\n\textra := len(rb.out) - end\n\tif extra > 0 {\n\t\t// Potentially allocating memory. However, this only\n\t\t// happens with ill-formed UTF-8.\n\t\tx := make([]byte, 0)\n\t\tx = append(x, rb.out[len(rb.out)-extra:]...)\n\t\trb.out = rb.out[:end]\n\t\tdecomposeToLastBoundary(rb)\n\t\trb.doFlush()\n\t\trb.out = append(rb.out, x...)\n\t\treturn false\n\t}\n\tbuf := rb.out[p:]\n\trb.out = rb.out[:p]\n\tdecomposeToLastBoundary(rb)\n\tif s := rb.ss.next(info); s == ssStarter {\n\t\trb.doFlush()\n\t\trb.ss.first(info)\n\t} else if s == ssOverflow {\n\t\trb.doFlush()\n\t\trb.insertCGJ()\n\t\trb.ss = 0\n\t}\n\trb.insertUnsafe(inputBytes(buf), 0, info)\n\treturn true\n}\n\nfunc appendQuick(rb *reorderBuffer, i int) int {\n\tif rb.nsrc == i {\n\t\treturn i\n\t}\n\tend, _ := rb.f.quickSpan(rb.src, i, rb.nsrc, true)\n\trb.out = rb.src.appendSlice(rb.out, i, end)\n\treturn end\n}\n\n// Append returns f(append(out, b...)).\n// The buffer out must be nil, empty, or equal to f(out).\nfunc (f Form) Append(out []byte, src ...byte) []byte {\n\treturn f.doAppend(out, inputBytes(src), len(src))\n}\n\nfunc (f Form) doAppend(out []byte, src input, n int) []byte {\n\tif n == 0 {\n\t\treturn out\n\t}\n\tft := formTable[f]\n\t// Attempt to do a quickSpan first so we can avoid initializing the reorderBuffer.\n\tif len(out) == 0 {\n\t\tp, _ := ft.quickSpan(src, 0, n, true)\n\t\tout = src.appendSlice(out, 0, p)\n\t\tif p == n {\n\t\t\treturn out\n\t\t}\n\t\trb := reorderBuffer{f: *ft, src: src, nsrc: n, out: out, flushF: appendFlush}\n\t\treturn doAppendInner(&rb, p)\n\t}\n\trb := reorderBuffer{f: *ft, src: src, nsrc: n}\n\treturn doAppend(&rb, out, 0)\n}\n\nfunc doAppend(rb *reorderBuffer, out []byte, p int) []byte {\n\trb.setFlusher(out, appendFlush)\n\tsrc, n := rb.src, rb.nsrc\n\tdoMerge := len(out) > 0\n\tif q := src.skipContinuationBytes(p); q > p {\n\t\t// Move leading non-starters to destination.\n\t\trb.out = src.appendSlice(rb.out, p, q)\n\t\tp = q\n\t\tdoMerge = patchTail(rb)\n\t}\n\tfd := &rb.f\n\tif doMerge {\n\t\tvar info Properties\n\t\tif p < n {\n\t\t\tinfo = fd.info(src, p)\n\t\t\tif !info.BoundaryBefore() || info.nLeadingNonStarters() > 0 {\n\t\t\t\tif p == 0 {\n\t\t\t\t\tdecomposeToLastBoundary(rb)\n\t\t\t\t}\n\t\t\t\tp = decomposeSegment(rb, p, true)\n\t\t\t}\n\t\t}\n\t\tif info.size == 0 {\n\t\t\trb.doFlush()\n\t\t\t// Append incomplete UTF-8 encoding.\n\t\t\treturn src.appendSlice(rb.out, p, n)\n\t\t}\n\t\tif rb.nrune > 0 {\n\t\t\treturn doAppendInner(rb, p)\n\t\t}\n\t}\n\tp = appendQuick(rb, p)\n\treturn doAppendInner(rb, p)\n}\n\nfunc doAppendInner(rb *reorderBuffer, p int) []byte {\n\tfor n := rb.nsrc; p < n; {\n\t\tp = decomposeSegment(rb, p, true)\n\t\tp = appendQuick(rb, p)\n\t}\n\treturn rb.out\n}\n\n// AppendString returns f(append(out, []byte(s))).\n// The buffer out must be nil, empty, or equal to f(out).\nfunc (f Form) AppendString(out []byte, src string) []byte {\n\treturn f.doAppend(out, inputString(src), len(src))\n}\n\n// QuickSpan returns a boundary n such that b[0:n] == f(b[0:n]).\n// It is not guaranteed to return the largest such n.\nfunc (f Form) QuickSpan(b []byte) int {\n\tn, _ := formTable[f].quickSpan(inputBytes(b), 0, len(b), true)\n\treturn n\n}\n\n// Span implements transform.SpanningTransformer. It returns a boundary n such\n// that b[0:n] == f(b[0:n]). It is not guaranteed to return the largest such n.\nfunc (f Form) Span(b []byte, atEOF bool) (n int, err error) {\n\tn, ok := formTable[f].quickSpan(inputBytes(b), 0, len(b), atEOF)\n\tif n < len(b) {\n\t\tif !ok {\n\t\t\terr = transform.ErrEndOfSpan\n\t\t} else {\n\t\t\terr = transform.ErrShortSrc\n\t\t}\n\t}\n\treturn n, err\n}\n\n// SpanString returns a boundary n such that s[0:n] == f(s[0:n]).\n// It is not guaranteed to return the largest such n.\nfunc (f Form) SpanString(s string, atEOF bool) (n int, err error) {\n\tn, ok := formTable[f].quickSpan(inputString(s), 0, len(s), atEOF)\n\tif n < len(s) {\n\t\tif !ok {\n\t\t\terr = transform.ErrEndOfSpan\n\t\t} else {\n\t\t\terr = transform.ErrShortSrc\n\t\t}\n\t}\n\treturn n, err\n}\n\n// quickSpan returns a boundary n such that src[0:n] == f(src[0:n]) and\n// whether any non-normalized parts were found. If atEOF is false, n will\n// not point past the last segment if this segment might be become\n// non-normalized by appending other runes.\nfunc (f *formInfo) quickSpan(src input, i, end int, atEOF bool) (n int, ok bool) {\n\tvar lastCC uint8\n\tss := streamSafe(0)\n\tlastSegStart := i\n\tfor n = end; i < n; {\n\t\tif j := src.skipASCII(i, n); i != j {\n\t\t\ti = j\n\t\t\tlastSegStart = i - 1\n\t\t\tlastCC = 0\n\t\t\tss = 0\n\t\t\tcontinue\n\t\t}\n\t\tinfo := f.info(src, i)\n\t\tif info.size == 0 {\n\t\t\tif atEOF {\n\t\t\t\t// include incomplete runes\n\t\t\t\treturn n, true\n\t\t\t}\n\t\t\treturn lastSegStart, true\n\t\t}\n\t\t// This block needs to be before the next, because it is possible to\n\t\t// have an overflow for runes that are starters (e.g. with U+FF9E).\n\t\tswitch ss.next(info) {\n\t\tcase ssStarter:\n\t\t\tlastSegStart = i\n\t\tcase ssOverflow:\n\t\t\treturn lastSegStart, false\n\t\tcase ssSuccess:\n\t\t\tif lastCC > info.ccc {\n\t\t\t\treturn lastSegStart, false\n\t\t\t}\n\t\t}\n\t\tif f.composing {\n\t\t\tif !info.isYesC() {\n\t\t\t\tbreak\n\t\t\t}\n\t\t} else {\n\t\t\tif !info.isYesD() {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tlastCC = info.ccc\n\t\ti += int(info.size)\n\t}\n\tif i == n {\n\t\tif !atEOF {\n\t\t\tn = lastSegStart\n\t\t}\n\t\treturn n, true\n\t}\n\treturn lastSegStart, false\n}\n\n// QuickSpanString returns a boundary n such that s[0:n] == f(s[0:n]).\n// It is not guaranteed to return the largest such n.\nfunc (f Form) QuickSpanString(s string) int {\n\tn, _ := formTable[f].quickSpan(inputString(s), 0, len(s), true)\n\treturn n\n}\n\n// FirstBoundary returns the position i of the first boundary in b\n// or -1 if b contains no boundary.\nfunc (f Form) FirstBoundary(b []byte) int {\n\treturn f.firstBoundary(inputBytes(b), len(b))\n}\n\nfunc (f Form) firstBoundary(src input, nsrc int) int {\n\ti := src.skipContinuationBytes(0)\n\tif i >= nsrc {\n\t\treturn -1\n\t}\n\tfd := formTable[f]\n\tss := streamSafe(0)\n\t// We should call ss.first here, but we can't as the first rune is\n\t// skipped already. This means FirstBoundary can't really determine\n\t// CGJ insertion points correctly. Luckily it doesn't have to.\n\tfor {\n\t\tinfo := fd.info(src, i)\n\t\tif info.size == 0 {\n\t\t\treturn -1\n\t\t}\n\t\tif s := ss.next(info); s != ssSuccess {\n\t\t\treturn i\n\t\t}\n\t\ti += int(info.size)\n\t\tif i >= nsrc {\n\t\t\tif !info.BoundaryAfter() && !ss.isMax() {\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\treturn nsrc\n\t\t}\n\t}\n}\n\n// FirstBoundaryInString returns the position i of the first boundary in s\n// or -1 if s contains no boundary.\nfunc (f Form) FirstBoundaryInString(s string) int {\n\treturn f.firstBoundary(inputString(s), len(s))\n}\n\n// NextBoundary reports the index of the boundary between the first and next\n// segment in b or -1 if atEOF is false and there are not enough bytes to\n// determine this boundary.\nfunc (f Form) NextBoundary(b []byte, atEOF bool) int {\n\treturn f.nextBoundary(inputBytes(b), len(b), atEOF)\n}\n\n// NextBoundaryInString reports the index of the boundary between the first and\n// next segment in b or -1 if atEOF is false and there are not enough bytes to\n// determine this boundary.\nfunc (f Form) NextBoundaryInString(s string, atEOF bool) int {\n\treturn f.nextBoundary(inputString(s), len(s), atEOF)\n}\n\nfunc (f Form) nextBoundary(src input, nsrc int, atEOF bool) int {\n\tif nsrc == 0 {\n\t\tif atEOF {\n\t\t\treturn 0\n\t\t}\n\t\treturn -1\n\t}\n\tfd := formTable[f]\n\tinfo := fd.info(src, 0)\n\tif info.size == 0 {\n\t\tif atEOF {\n\t\t\treturn 1\n\t\t}\n\t\treturn -1\n\t}\n\tss := streamSafe(0)\n\tss.first(info)\n\n\tfor i := int(info.size); i < nsrc; i += int(info.size) {\n\t\tinfo = fd.info(src, i)\n\t\tif info.size == 0 {\n\t\t\tif atEOF {\n\t\t\t\treturn i\n\t\t\t}\n\t\t\treturn -1\n\t\t}\n\t\t// TODO: Using streamSafe to determine the boundary isn't the same as\n\t\t// using BoundaryBefore. Determine which should be used.\n\t\tif s := ss.next(info); s != ssSuccess {\n\t\t\treturn i\n\t\t}\n\t}\n\tif !atEOF && !info.BoundaryAfter() && !ss.isMax() {\n\t\treturn -1\n\t}\n\treturn nsrc\n}\n\n// LastBoundary returns the position i of the last boundary in b\n// or -1 if b contains no boundary.\nfunc (f Form) LastBoundary(b []byte) int {\n\treturn lastBoundary(formTable[f], b)\n}\n\nfunc lastBoundary(fd *formInfo, b []byte) int {\n\ti := len(b)\n\tinfo, p := lastRuneStart(fd, b)\n\tif p == -1 {\n\t\treturn -1\n\t}\n\tif info.size == 0 { // ends with incomplete rune\n\t\tif p == 0 { // starts with incomplete rune\n\t\t\treturn -1\n\t\t}\n\t\ti = p\n\t\tinfo, p = lastRuneStart(fd, b[:i])\n\t\tif p == -1 { // incomplete UTF-8 encoding or non-starter bytes without a starter\n\t\t\treturn i\n\t\t}\n\t}\n\tif p+int(info.size) != i { // trailing non-starter bytes: illegal UTF-8\n\t\treturn i\n\t}\n\tif info.BoundaryAfter() {\n\t\treturn i\n\t}\n\tss := streamSafe(0)\n\tv := ss.backwards(info)\n\tfor i = p; i >= 0 && v != ssStarter; i = p {\n\t\tinfo, p = lastRuneStart(fd, b[:i])\n\t\tif v = ss.backwards(info); v == ssOverflow {\n\t\t\tbreak\n\t\t}\n\t\tif p+int(info.size) != i {\n\t\t\tif p == -1 { // no boundary found\n\t\t\t\treturn -1\n\t\t\t}\n\t\t\treturn i // boundary after an illegal UTF-8 encoding\n\t\t}\n\t}\n\treturn i\n}\n\n// decomposeSegment scans the first segment in src into rb. It inserts 0x034f\n// (Grapheme Joiner) when it encounters a sequence of more than 30 non-starters\n// and returns the number of bytes consumed from src or iShortDst or iShortSrc.\nfunc decomposeSegment(rb *reorderBuffer, sp int, atEOF bool) int {\n\t// Force one character to be consumed.\n\tinfo := rb.f.info(rb.src, sp)\n\tif info.size == 0 {\n\t\treturn 0\n\t}\n\tif s := rb.ss.next(info); s == ssStarter {\n\t\t// TODO: this could be removed if we don't support merging.\n\t\tif rb.nrune > 0 {\n\t\t\tgoto end\n\t\t}\n\t} else if s == ssOverflow {\n\t\trb.insertCGJ()\n\t\tgoto end\n\t}\n\tif err := rb.insertFlush(rb.src, sp, info); err != iSuccess {\n\t\treturn int(err)\n\t}\n\tfor {\n\t\tsp += int(info.size)\n\t\tif sp >= rb.nsrc {\n\t\t\tif !atEOF && !info.BoundaryAfter() {\n\t\t\t\treturn int(iShortSrc)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tinfo = rb.f.info(rb.src, sp)\n\t\tif info.size == 0 {\n\t\t\tif !atEOF {\n\t\t\t\treturn int(iShortSrc)\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t\tif s := rb.ss.next(info); s == ssStarter {\n\t\t\tbreak\n\t\t} else if s == ssOverflow {\n\t\t\trb.insertCGJ()\n\t\t\tbreak\n\t\t}\n\t\tif err := rb.insertFlush(rb.src, sp, info); err != iSuccess {\n\t\t\treturn int(err)\n\t\t}\n\t}\nend:\n\tif !rb.doFlush() {\n\t\treturn int(iShortDst)\n\t}\n\treturn sp\n}\n\n// lastRuneStart returns the runeInfo and position of the last\n// rune in buf or the zero runeInfo and -1 if no rune was found.\nfunc lastRuneStart(fd *formInfo, buf []byte) (Properties, int) {\n\tp := len(buf) - 1\n\tfor ; p >= 0 && !utf8.RuneStart(buf[p]); p-- {\n\t}\n\tif p < 0 {\n\t\treturn Properties{}, -1\n\t}\n\treturn fd.info(inputBytes(buf), p), p\n}\n\n// decomposeToLastBoundary finds an open segment at the end of the buffer\n// and scans it into rb. Returns the buffer minus the last segment.\nfunc decomposeToLastBoundary(rb *reorderBuffer) {\n\tfd := &rb.f\n\tinfo, i := lastRuneStart(fd, rb.out)\n\tif int(info.size) != len(rb.out)-i {\n\t\t// illegal trailing continuation bytes\n\t\treturn\n\t}\n\tif info.BoundaryAfter() {\n\t\treturn\n\t}\n\tvar add [maxNonStarters + 1]Properties // stores runeInfo in reverse order\n\tpadd := 0\n\tss := streamSafe(0)\n\tp := len(rb.out)\n\tfor {\n\t\tadd[padd] = info\n\t\tv := ss.backwards(info)\n\t\tif v == ssOverflow {\n\t\t\t// Note that if we have an overflow, it the string we are appending to\n\t\t\t// is not correctly normalized. In this case the behavior is undefined.\n\t\t\tbreak\n\t\t}\n\t\tpadd++\n\t\tp -= int(info.size)\n\t\tif v == ssStarter || p < 0 {\n\t\t\tbreak\n\t\t}\n\t\tinfo, i = lastRuneStart(fd, rb.out[:p])\n\t\tif int(info.size) != p-i {\n\t\t\tbreak\n\t\t}\n\t}\n\trb.ss = ss\n\t// Copy bytes for insertion as we may need to overwrite rb.out.\n\tvar buf [maxBufferSize * utf8.UTFMax]byte\n\tcp := buf[:copy(buf[:], rb.out[p:])]\n\trb.out = rb.out[:p]\n\tfor padd--; padd >= 0; padd-- {\n\t\tinfo = add[padd]\n\t\trb.insertUnsafe(inputBytes(cp), 0, info)\n\t\tcp = cp[info.size:]\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/readwriter.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage norm\n\nimport \"io\"\n\ntype normWriter struct {\n\trb  reorderBuffer\n\tw   io.Writer\n\tbuf []byte\n}\n\n// Write implements the standard write interface.  If the last characters are\n// not at a normalization boundary, the bytes will be buffered for the next\n// write. The remaining bytes will be written on close.\nfunc (w *normWriter) Write(data []byte) (n int, err error) {\n\t// Process data in pieces to keep w.buf size bounded.\n\tconst chunk = 4000\n\n\tfor len(data) > 0 {\n\t\t// Normalize into w.buf.\n\t\tm := len(data)\n\t\tif m > chunk {\n\t\t\tm = chunk\n\t\t}\n\t\tw.rb.src = inputBytes(data[:m])\n\t\tw.rb.nsrc = m\n\t\tw.buf = doAppend(&w.rb, w.buf, 0)\n\t\tdata = data[m:]\n\t\tn += m\n\n\t\t// Write out complete prefix, save remainder.\n\t\t// Note that lastBoundary looks back at most 31 runes.\n\t\ti := lastBoundary(&w.rb.f, w.buf)\n\t\tif i == -1 {\n\t\t\ti = 0\n\t\t}\n\t\tif i > 0 {\n\t\t\tif _, err = w.w.Write(w.buf[:i]); err != nil {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbn := copy(w.buf, w.buf[i:])\n\t\t\tw.buf = w.buf[:bn]\n\t\t}\n\t}\n\treturn n, err\n}\n\n// Close forces data that remains in the buffer to be written.\nfunc (w *normWriter) Close() error {\n\tif len(w.buf) > 0 {\n\t\t_, err := w.w.Write(w.buf)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Writer returns a new writer that implements Write(b)\n// by writing f(b) to w.  The returned writer may use an\n// an internal buffer to maintain state across Write calls.\n// Calling its Close method writes any buffered data to w.\nfunc (f Form) Writer(w io.Writer) io.WriteCloser {\n\twr := &normWriter{rb: reorderBuffer{}, w: w}\n\twr.rb.init(f, nil)\n\treturn wr\n}\n\ntype normReader struct {\n\trb           reorderBuffer\n\tr            io.Reader\n\tinbuf        []byte\n\toutbuf       []byte\n\tbufStart     int\n\tlastBoundary int\n\terr          error\n}\n\n// Read implements the standard read interface.\nfunc (r *normReader) Read(p []byte) (int, error) {\n\tfor {\n\t\tif r.lastBoundary-r.bufStart > 0 {\n\t\t\tn := copy(p, r.outbuf[r.bufStart:r.lastBoundary])\n\t\t\tr.bufStart += n\n\t\t\tif r.lastBoundary-r.bufStart > 0 {\n\t\t\t\treturn n, nil\n\t\t\t}\n\t\t\treturn n, r.err\n\t\t}\n\t\tif r.err != nil {\n\t\t\treturn 0, r.err\n\t\t}\n\t\toutn := copy(r.outbuf, r.outbuf[r.lastBoundary:])\n\t\tr.outbuf = r.outbuf[0:outn]\n\t\tr.bufStart = 0\n\n\t\tn, err := r.r.Read(r.inbuf)\n\t\tr.rb.src = inputBytes(r.inbuf[0:n])\n\t\tr.rb.nsrc, r.err = n, err\n\t\tif n > 0 {\n\t\t\tr.outbuf = doAppend(&r.rb, r.outbuf, 0)\n\t\t}\n\t\tif err == io.EOF {\n\t\t\tr.lastBoundary = len(r.outbuf)\n\t\t} else {\n\t\t\tr.lastBoundary = lastBoundary(&r.rb.f, r.outbuf)\n\t\t\tif r.lastBoundary == -1 {\n\t\t\t\tr.lastBoundary = 0\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Reader returns a new reader that implements Read\n// by reading data from r and returning f(data).\nfunc (f Form) Reader(r io.Reader) io.Reader {\n\tconst chunk = 4000\n\tbuf := make([]byte, chunk)\n\trr := &normReader{rb: reorderBuffer{}, r: r, inbuf: buf}\n\trr.rb.init(f, buf)\n\treturn rr\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/tables10.0.0.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n// +build go1.10\n\npackage norm\n\nconst (\n\t// Version is the Unicode edition from which the tables are derived.\n\tVersion = \"10.0.0\"\n\n\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform\n\t// may need to write atomically for any Form. Making a destination buffer at\n\t// least this size ensures that Transform can always make progress and that\n\t// the user does not need to grow the buffer on an ErrShortDst.\n\tMaxTransformChunkSize = 35 + maxNonStarters*4\n)\n\nvar ccc = [55]uint8{\n\t0, 1, 7, 8, 9, 10, 11, 12,\n\t13, 14, 15, 16, 17, 18, 19, 20,\n\t21, 22, 23, 24, 25, 26, 27, 28,\n\t29, 30, 31, 32, 33, 34, 35, 36,\n\t84, 91, 103, 107, 118, 122, 129, 130,\n\t132, 202, 214, 216, 218, 220, 222, 224,\n\t226, 228, 230, 232, 233, 234, 240,\n}\n\nconst (\n\tfirstMulti            = 0x186D\n\tfirstCCC              = 0x2C9E\n\tendMulti              = 0x2F60\n\tfirstLeadingCCC       = 0x49AE\n\tfirstCCCZeroExcept    = 0x4A78\n\tfirstStarterWithNLead = 0x4A9F\n\tlastDecomp            = 0x4AA1\n\tmaxDecomp             = 0x8000\n)\n\n// decomps: 19105 bytes\nvar decomps = [...]byte{\n\t// Bytes 0 - 3f\n\t0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,\n\t0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,\n\t0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,\n\t0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,\n\t0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,\n\t0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,\n\t0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,\n\t0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,\n\t// Bytes 40 - 7f\n\t0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,\n\t0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,\n\t0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,\n\t0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,\n\t0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,\n\t0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,\n\t0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,\n\t0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,\n\t// Bytes 80 - bf\n\t0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,\n\t0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,\n\t0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,\n\t0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,\n\t0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,\n\t0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,\n\t0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,\n\t0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,\n\t// Bytes c0 - ff\n\t0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,\n\t0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,\n\t0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42,\n\t0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1,\n\t0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6,\n\t0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42,\n\t0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90,\n\t0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9,\n\t// Bytes 100 - 13f\n\t0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42,\n\t0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F,\n\t0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9,\n\t0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42,\n\t0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB,\n\t0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9,\n\t0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,\n\t0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,\n\t// Bytes 140 - 17f\n\t0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9,\n\t0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42,\n\t0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,\n\t0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,\n\t0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42,\n\t0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F,\n\t0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE,\n\t0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42,\n\t// Bytes 180 - 1bf\n\t0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97,\n\t0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE,\n\t0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42,\n\t0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F,\n\t0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE,\n\t0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42,\n\t0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8,\n\t0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE,\n\t// Bytes 1c0 - 1ff\n\t0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42,\n\t0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7,\n\t0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE,\n\t0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42,\n\t0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF,\n\t0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF,\n\t0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42,\n\t0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87,\n\t// Bytes 200 - 23f\n\t0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF,\n\t0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42,\n\t0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90,\n\t0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7,\n\t0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42,\n\t0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2,\n\t0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8,\n\t0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42,\n\t// Bytes 240 - 27f\n\t0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB,\n\t0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8,\n\t0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42,\n\t0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3,\n\t0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8,\n\t0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42,\n\t0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81,\n\t0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9,\n\t// Bytes 280 - 2bf\n\t0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42,\n\t0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89,\n\t0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9,\n\t0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42,\n\t0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE,\n\t0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA,\n\t0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42,\n\t0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C,\n\t// Bytes 2c0 - 2ff\n\t0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA,\n\t0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42,\n\t0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9,\n\t0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA,\n\t0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42,\n\t0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81,\n\t0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB,\n\t0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42,\n\t// Bytes 300 - 33f\n\t0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90,\n\t0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43,\n\t0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43,\n\t0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43,\n\t0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43,\n\t0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43,\n\t0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43,\n\t0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43,\n\t// Bytes 340 - 37f\n\t0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43,\n\t0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43,\n\t0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43,\n\t0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43,\n\t0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43,\n\t0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43,\n\t0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43,\n\t0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43,\n\t// Bytes 380 - 3bf\n\t0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43,\n\t0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43,\n\t0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43,\n\t0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43,\n\t0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43,\n\t0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43,\n\t0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43,\n\t0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43,\n\t// Bytes 3c0 - 3ff\n\t0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43,\n\t0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43,\n\t0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43,\n\t0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43,\n\t0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43,\n\t0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43,\n\t0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43,\n\t0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43,\n\t// Bytes 400 - 43f\n\t0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43,\n\t0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43,\n\t0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43,\n\t0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43,\n\t0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43,\n\t0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43,\n\t0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43,\n\t0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43,\n\t// Bytes 440 - 47f\n\t0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43,\n\t0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43,\n\t0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43,\n\t0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43,\n\t0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43,\n\t0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43,\n\t0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43,\n\t0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43,\n\t// Bytes 480 - 4bf\n\t0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43,\n\t0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43,\n\t0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43,\n\t0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43,\n\t0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43,\n\t0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43,\n\t0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43,\n\t0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43,\n\t// Bytes 4c0 - 4ff\n\t0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43,\n\t0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43,\n\t0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43,\n\t0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43,\n\t0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43,\n\t0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43,\n\t0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43,\n\t0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43,\n\t// Bytes 500 - 53f\n\t0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43,\n\t0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43,\n\t0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43,\n\t0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43,\n\t0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43,\n\t0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43,\n\t0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43,\n\t0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43,\n\t// Bytes 540 - 57f\n\t0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43,\n\t0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43,\n\t0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43,\n\t0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43,\n\t0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43,\n\t0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43,\n\t0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43,\n\t0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43,\n\t// Bytes 580 - 5bf\n\t0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43,\n\t0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43,\n\t0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43,\n\t0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43,\n\t0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43,\n\t0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43,\n\t0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43,\n\t0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43,\n\t// Bytes 5c0 - 5ff\n\t0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43,\n\t0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43,\n\t0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43,\n\t0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43,\n\t0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43,\n\t0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43,\n\t0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43,\n\t0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43,\n\t// Bytes 600 - 63f\n\t0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43,\n\t0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43,\n\t0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43,\n\t0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43,\n\t0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43,\n\t0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43,\n\t0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43,\n\t0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43,\n\t// Bytes 640 - 67f\n\t0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43,\n\t0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43,\n\t0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43,\n\t0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43,\n\t0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43,\n\t0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43,\n\t0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43,\n\t0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43,\n\t// Bytes 680 - 6bf\n\t0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43,\n\t0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43,\n\t0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43,\n\t0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43,\n\t0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43,\n\t0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43,\n\t0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43,\n\t0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43,\n\t// Bytes 6c0 - 6ff\n\t0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43,\n\t0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43,\n\t0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43,\n\t0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43,\n\t0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43,\n\t0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43,\n\t0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43,\n\t0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43,\n\t// Bytes 700 - 73f\n\t0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43,\n\t0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43,\n\t0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43,\n\t0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43,\n\t0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43,\n\t0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43,\n\t0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43,\n\t0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43,\n\t// Bytes 740 - 77f\n\t0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43,\n\t0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43,\n\t0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43,\n\t0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43,\n\t0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43,\n\t0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43,\n\t0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43,\n\t0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43,\n\t// Bytes 780 - 7bf\n\t0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43,\n\t0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43,\n\t0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43,\n\t0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43,\n\t0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43,\n\t0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43,\n\t0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43,\n\t0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43,\n\t// Bytes 7c0 - 7ff\n\t0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43,\n\t0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43,\n\t0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43,\n\t0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43,\n\t0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43,\n\t0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43,\n\t0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43,\n\t0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43,\n\t// Bytes 800 - 83f\n\t0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43,\n\t0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43,\n\t0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43,\n\t0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43,\n\t0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43,\n\t0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43,\n\t0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43,\n\t0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43,\n\t// Bytes 840 - 87f\n\t0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43,\n\t0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43,\n\t0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43,\n\t0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43,\n\t0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43,\n\t0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43,\n\t0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43,\n\t0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43,\n\t// Bytes 880 - 8bf\n\t0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43,\n\t0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43,\n\t0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43,\n\t0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43,\n\t0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43,\n\t0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43,\n\t0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43,\n\t0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43,\n\t// Bytes 8c0 - 8ff\n\t0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43,\n\t0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43,\n\t0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43,\n\t0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43,\n\t0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43,\n\t0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43,\n\t0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43,\n\t0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43,\n\t// Bytes 900 - 93f\n\t0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43,\n\t0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43,\n\t0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43,\n\t0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43,\n\t0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43,\n\t0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43,\n\t0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43,\n\t0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43,\n\t// Bytes 940 - 97f\n\t0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43,\n\t0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43,\n\t0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43,\n\t0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43,\n\t0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43,\n\t0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43,\n\t0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43,\n\t0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43,\n\t// Bytes 980 - 9bf\n\t0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43,\n\t0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43,\n\t0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43,\n\t0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43,\n\t0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43,\n\t0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43,\n\t0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43,\n\t0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43,\n\t// Bytes 9c0 - 9ff\n\t0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43,\n\t0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43,\n\t0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43,\n\t0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43,\n\t0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43,\n\t0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43,\n\t0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43,\n\t0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43,\n\t// Bytes a00 - a3f\n\t0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43,\n\t0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43,\n\t0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43,\n\t0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43,\n\t0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43,\n\t0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43,\n\t0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43,\n\t0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43,\n\t// Bytes a40 - a7f\n\t0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43,\n\t0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43,\n\t0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43,\n\t0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43,\n\t0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43,\n\t0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43,\n\t0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43,\n\t0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43,\n\t// Bytes a80 - abf\n\t0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43,\n\t0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43,\n\t0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43,\n\t0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43,\n\t0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43,\n\t0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43,\n\t0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43,\n\t0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43,\n\t// Bytes ac0 - aff\n\t0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43,\n\t0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43,\n\t0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43,\n\t0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43,\n\t0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43,\n\t0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43,\n\t0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43,\n\t0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43,\n\t// Bytes b00 - b3f\n\t0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43,\n\t0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43,\n\t0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43,\n\t0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43,\n\t0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43,\n\t0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43,\n\t0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43,\n\t0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43,\n\t// Bytes b40 - b7f\n\t0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43,\n\t0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43,\n\t0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43,\n\t0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43,\n\t0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43,\n\t0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43,\n\t0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43,\n\t0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43,\n\t// Bytes b80 - bbf\n\t0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43,\n\t0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43,\n\t0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43,\n\t0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43,\n\t0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43,\n\t0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43,\n\t0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43,\n\t0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43,\n\t// Bytes bc0 - bff\n\t0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43,\n\t0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43,\n\t0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43,\n\t0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43,\n\t0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43,\n\t0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43,\n\t0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43,\n\t0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43,\n\t// Bytes c00 - c3f\n\t0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43,\n\t0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43,\n\t0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43,\n\t0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43,\n\t0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43,\n\t0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43,\n\t0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43,\n\t0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43,\n\t// Bytes c40 - c7f\n\t0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43,\n\t0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43,\n\t0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43,\n\t0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43,\n\t0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43,\n\t0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43,\n\t0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43,\n\t0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43,\n\t// Bytes c80 - cbf\n\t0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43,\n\t0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43,\n\t0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43,\n\t0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43,\n\t0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43,\n\t0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43,\n\t0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43,\n\t0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43,\n\t// Bytes cc0 - cff\n\t0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43,\n\t0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43,\n\t0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43,\n\t0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43,\n\t0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43,\n\t0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43,\n\t0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43,\n\t0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43,\n\t// Bytes d00 - d3f\n\t0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43,\n\t0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43,\n\t0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43,\n\t0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43,\n\t0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43,\n\t0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43,\n\t0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43,\n\t0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43,\n\t// Bytes d40 - d7f\n\t0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43,\n\t0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43,\n\t0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43,\n\t0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43,\n\t0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43,\n\t0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43,\n\t0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43,\n\t0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43,\n\t// Bytes d80 - dbf\n\t0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43,\n\t0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43,\n\t0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43,\n\t0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43,\n\t0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43,\n\t0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43,\n\t0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43,\n\t0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43,\n\t// Bytes dc0 - dff\n\t0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43,\n\t0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43,\n\t0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43,\n\t0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43,\n\t0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43,\n\t0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43,\n\t0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43,\n\t0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43,\n\t// Bytes e00 - e3f\n\t0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43,\n\t0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43,\n\t0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43,\n\t0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43,\n\t0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43,\n\t0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43,\n\t0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43,\n\t0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43,\n\t// Bytes e40 - e7f\n\t0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43,\n\t0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43,\n\t0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43,\n\t0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43,\n\t0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43,\n\t0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43,\n\t0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43,\n\t0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43,\n\t// Bytes e80 - ebf\n\t0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43,\n\t0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43,\n\t0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43,\n\t0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43,\n\t0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43,\n\t0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43,\n\t0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43,\n\t0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43,\n\t// Bytes ec0 - eff\n\t0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43,\n\t0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43,\n\t0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43,\n\t0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43,\n\t0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43,\n\t0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43,\n\t0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43,\n\t0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43,\n\t// Bytes f00 - f3f\n\t0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43,\n\t0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43,\n\t0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43,\n\t0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43,\n\t0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43,\n\t0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43,\n\t0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43,\n\t0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43,\n\t// Bytes f40 - f7f\n\t0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43,\n\t0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43,\n\t0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43,\n\t0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43,\n\t0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43,\n\t0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43,\n\t0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43,\n\t0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43,\n\t// Bytes f80 - fbf\n\t0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43,\n\t0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43,\n\t0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43,\n\t0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43,\n\t0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43,\n\t0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43,\n\t0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43,\n\t0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43,\n\t// Bytes fc0 - fff\n\t0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43,\n\t0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43,\n\t0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43,\n\t0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43,\n\t0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43,\n\t0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43,\n\t0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43,\n\t0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43,\n\t// Bytes 1000 - 103f\n\t0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43,\n\t0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43,\n\t0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43,\n\t0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43,\n\t0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43,\n\t0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43,\n\t0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43,\n\t0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43,\n\t// Bytes 1040 - 107f\n\t0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43,\n\t0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43,\n\t0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43,\n\t0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43,\n\t0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43,\n\t0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43,\n\t0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43,\n\t0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43,\n\t// Bytes 1080 - 10bf\n\t0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43,\n\t0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43,\n\t0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43,\n\t0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43,\n\t0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43,\n\t0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43,\n\t0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43,\n\t0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43,\n\t// Bytes 10c0 - 10ff\n\t0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43,\n\t0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43,\n\t0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43,\n\t0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43,\n\t0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43,\n\t0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43,\n\t0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43,\n\t0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43,\n\t// Bytes 1100 - 113f\n\t0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43,\n\t0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43,\n\t0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43,\n\t0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43,\n\t0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43,\n\t0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43,\n\t0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43,\n\t0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43,\n\t// Bytes 1140 - 117f\n\t0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43,\n\t0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43,\n\t0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43,\n\t0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43,\n\t0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43,\n\t0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43,\n\t0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43,\n\t0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43,\n\t// Bytes 1180 - 11bf\n\t0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43,\n\t0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43,\n\t0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43,\n\t0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43,\n\t0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43,\n\t0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43,\n\t0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43,\n\t0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43,\n\t// Bytes 11c0 - 11ff\n\t0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43,\n\t0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43,\n\t0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43,\n\t0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43,\n\t0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43,\n\t0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43,\n\t0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43,\n\t0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43,\n\t// Bytes 1200 - 123f\n\t0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43,\n\t0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43,\n\t0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43,\n\t0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43,\n\t0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43,\n\t0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43,\n\t0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43,\n\t0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43,\n\t// Bytes 1240 - 127f\n\t0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43,\n\t0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43,\n\t0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43,\n\t0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43,\n\t0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43,\n\t0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43,\n\t0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43,\n\t0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43,\n\t// Bytes 1280 - 12bf\n\t0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43,\n\t0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43,\n\t0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43,\n\t0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43,\n\t0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43,\n\t0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43,\n\t0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43,\n\t0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43,\n\t// Bytes 12c0 - 12ff\n\t0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43,\n\t0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43,\n\t0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43,\n\t0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43,\n\t0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43,\n\t0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43,\n\t0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43,\n\t0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43,\n\t// Bytes 1300 - 133f\n\t0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43,\n\t0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43,\n\t0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43,\n\t0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43,\n\t0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43,\n\t0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43,\n\t0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43,\n\t0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43,\n\t// Bytes 1340 - 137f\n\t0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43,\n\t0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43,\n\t0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43,\n\t0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43,\n\t0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43,\n\t0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43,\n\t0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43,\n\t0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43,\n\t// Bytes 1380 - 13bf\n\t0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43,\n\t0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43,\n\t0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43,\n\t0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43,\n\t0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43,\n\t0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43,\n\t0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43,\n\t0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43,\n\t// Bytes 13c0 - 13ff\n\t0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43,\n\t0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43,\n\t0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43,\n\t0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43,\n\t0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43,\n\t0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43,\n\t0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43,\n\t0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43,\n\t// Bytes 1400 - 143f\n\t0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43,\n\t0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43,\n\t0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43,\n\t0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43,\n\t0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43,\n\t0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43,\n\t0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43,\n\t0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43,\n\t// Bytes 1440 - 147f\n\t0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43,\n\t0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43,\n\t0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43,\n\t0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43,\n\t0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43,\n\t0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43,\n\t0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43,\n\t0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43,\n\t// Bytes 1480 - 14bf\n\t0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43,\n\t0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43,\n\t0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43,\n\t0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43,\n\t0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43,\n\t0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43,\n\t0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43,\n\t0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43,\n\t// Bytes 14c0 - 14ff\n\t0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43,\n\t0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43,\n\t0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43,\n\t0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43,\n\t0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43,\n\t0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43,\n\t0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43,\n\t0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43,\n\t// Bytes 1500 - 153f\n\t0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43,\n\t0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43,\n\t0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43,\n\t0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43,\n\t0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43,\n\t0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43,\n\t0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43,\n\t0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43,\n\t// Bytes 1540 - 157f\n\t0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43,\n\t0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43,\n\t0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43,\n\t0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43,\n\t0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43,\n\t0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43,\n\t0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43,\n\t0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43,\n\t// Bytes 1580 - 15bf\n\t0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43,\n\t0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43,\n\t0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43,\n\t0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43,\n\t0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43,\n\t0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43,\n\t0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43,\n\t0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43,\n\t// Bytes 15c0 - 15ff\n\t0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43,\n\t0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43,\n\t0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43,\n\t0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43,\n\t0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43,\n\t0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43,\n\t0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43,\n\t0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43,\n\t// Bytes 1600 - 163f\n\t0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43,\n\t0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43,\n\t0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43,\n\t0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43,\n\t0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43,\n\t0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43,\n\t0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43,\n\t0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43,\n\t// Bytes 1640 - 167f\n\t0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44,\n\t0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94,\n\t0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0,\n\t0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA,\n\t0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0,\n\t0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44,\n\t0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93,\n\t0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0,\n\t// Bytes 1680 - 16bf\n\t0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88,\n\t0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1,\n\t0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44,\n\t0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86,\n\t0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0,\n\t0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94,\n\t0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2,\n\t0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44,\n\t// Bytes 16c0 - 16ff\n\t0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80,\n\t0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0,\n\t0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93,\n\t0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3,\n\t0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44,\n\t0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A,\n\t0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0,\n\t0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA,\n\t// Bytes 1700 - 173f\n\t0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3,\n\t0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44,\n\t0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE,\n\t0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0,\n\t0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB,\n\t0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4,\n\t0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44,\n\t0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2,\n\t// Bytes 1740 - 177f\n\t0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0,\n\t0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84,\n\t0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5,\n\t0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44,\n\t0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89,\n\t0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0,\n\t0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A,\n\t0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5,\n\t// Bytes 1780 - 17bf\n\t0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44,\n\t0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2,\n\t0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0,\n\t0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A,\n\t0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6,\n\t0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44,\n\t0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93,\n\t0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0,\n\t// Bytes 17c0 - 17ff\n\t0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7,\n\t0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6,\n\t0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44,\n\t0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5,\n\t0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0,\n\t0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92,\n\t0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7,\n\t0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44,\n\t// Bytes 1800 - 183f\n\t0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2,\n\t0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0,\n\t0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92,\n\t0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8,\n\t0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44,\n\t0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85,\n\t0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0,\n\t0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A,\n\t// Bytes 1840 - 187f\n\t0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9,\n\t0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44,\n\t0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84,\n\t0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0,\n\t0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92,\n\t0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21,\n\t0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30,\n\t0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42,\n\t// Bytes 1880 - 18bf\n\t0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31,\n\t0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31,\n\t0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42,\n\t0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39,\n\t0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32,\n\t0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42,\n\t0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35,\n\t0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32,\n\t// Bytes 18c0 - 18ff\n\t0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42,\n\t0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31,\n\t0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33,\n\t0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42,\n\t0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39,\n\t0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34,\n\t0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42,\n\t0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35,\n\t// Bytes 1900 - 193f\n\t0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34,\n\t0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42,\n\t0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C,\n\t0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37,\n\t0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42,\n\t0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D,\n\t0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41,\n\t0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42,\n\t// Bytes 1940 - 197f\n\t0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A,\n\t0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48,\n\t0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42,\n\t0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A,\n\t0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49,\n\t0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42,\n\t0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A,\n\t0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D,\n\t// Bytes 1980 - 19bf\n\t0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,\n\t0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,\n\t0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,\n\t0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,\n\t0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,\n\t0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,\n\t0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,\n\t0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,\n\t// Bytes 19c0 - 19ff\n\t0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,\n\t0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,\n\t0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,\n\t0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,\n\t0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,\n\t0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,\n\t0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,\n\t0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,\n\t// Bytes 1a00 - 1a3f\n\t0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,\n\t0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,\n\t0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,\n\t0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,\n\t0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,\n\t0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,\n\t0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,\n\t0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,\n\t// Bytes 1a40 - 1a7f\n\t0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,\n\t0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,\n\t0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,\n\t0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,\n\t0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,\n\t0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,\n\t0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,\n\t0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,\n\t// Bytes 1a80 - 1abf\n\t0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,\n\t0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,\n\t0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,\n\t0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,\n\t0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,\n\t0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,\n\t0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,\n\t0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,\n\t// Bytes 1ac0 - 1aff\n\t0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,\n\t0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,\n\t0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,\n\t0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,\n\t0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,\n\t0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,\n\t0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,\n\t0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,\n\t// Bytes 1b00 - 1b3f\n\t0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,\n\t0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,\n\t0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,\n\t0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,\n\t0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,\n\t0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,\n\t0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,\n\t0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,\n\t// Bytes 1b40 - 1b7f\n\t0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,\n\t0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,\n\t0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,\n\t0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,\n\t0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,\n\t0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,\n\t0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,\n\t0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,\n\t// Bytes 1b80 - 1bbf\n\t0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,\n\t0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,\n\t0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,\n\t0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,\n\t0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,\n\t0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,\n\t0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,\n\t0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,\n\t// Bytes 1bc0 - 1bff\n\t0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,\n\t0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,\n\t0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,\n\t0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,\n\t0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,\n\t0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,\n\t0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,\n\t0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,\n\t// Bytes 1c00 - 1c3f\n\t0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,\n\t0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,\n\t0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,\n\t0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,\n\t0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,\n\t0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,\n\t0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,\n\t0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,\n\t// Bytes 1c40 - 1c7f\n\t0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,\n\t0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,\n\t0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,\n\t0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,\n\t0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,\n\t0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,\n\t0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,\n\t0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,\n\t// Bytes 1c80 - 1cbf\n\t0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,\n\t0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,\n\t0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,\n\t0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,\n\t0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,\n\t0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,\n\t0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,\n\t0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,\n\t// Bytes 1cc0 - 1cff\n\t0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,\n\t0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,\n\t0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,\n\t0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,\n\t0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,\n\t0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,\n\t0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,\n\t0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,\n\t// Bytes 1d00 - 1d3f\n\t0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,\n\t0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,\n\t0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,\n\t0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,\n\t0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,\n\t0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,\n\t0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,\n\t0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,\n\t// Bytes 1d40 - 1d7f\n\t0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,\n\t0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,\n\t0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,\n\t0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,\n\t0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,\n\t0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,\n\t0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,\n\t0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,\n\t// Bytes 1d80 - 1dbf\n\t0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,\n\t0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,\n\t0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,\n\t0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,\n\t0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,\n\t0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,\n\t0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,\n\t0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,\n\t// Bytes 1dc0 - 1dff\n\t0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,\n\t0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,\n\t0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,\n\t0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,\n\t0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,\n\t0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,\n\t0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,\n\t0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,\n\t// Bytes 1e00 - 1e3f\n\t0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,\n\t0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,\n\t0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,\n\t0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,\n\t0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,\n\t0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,\n\t0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,\n\t0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,\n\t// Bytes 1e40 - 1e7f\n\t0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,\n\t0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,\n\t0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,\n\t0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,\n\t0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,\n\t0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,\n\t0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,\n\t0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,\n\t// Bytes 1e80 - 1ebf\n\t0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,\n\t0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,\n\t0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,\n\t0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,\n\t0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,\n\t0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,\n\t0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,\n\t0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,\n\t// Bytes 1ec0 - 1eff\n\t0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,\n\t0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,\n\t0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,\n\t0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,\n\t0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,\n\t0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,\n\t0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,\n\t0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,\n\t// Bytes 1f00 - 1f3f\n\t0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,\n\t0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,\n\t0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,\n\t0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,\n\t0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,\n\t0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,\n\t0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,\n\t0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,\n\t// Bytes 1f40 - 1f7f\n\t0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,\n\t0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,\n\t0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,\n\t0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,\n\t0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,\n\t0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,\n\t0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,\n\t0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,\n\t// Bytes 1f80 - 1fbf\n\t0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,\n\t0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,\n\t0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,\n\t0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,\n\t0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,\n\t0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,\n\t0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,\n\t0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,\n\t// Bytes 1fc0 - 1fff\n\t0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,\n\t0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,\n\t0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,\n\t0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,\n\t0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,\n\t0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,\n\t0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,\n\t0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,\n\t// Bytes 2000 - 203f\n\t0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,\n\t0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,\n\t0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,\n\t0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,\n\t0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,\n\t0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,\n\t0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,\n\t0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,\n\t// Bytes 2040 - 207f\n\t0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,\n\t0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,\n\t0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,\n\t0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,\n\t0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,\n\t0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,\n\t0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,\n\t0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,\n\t// Bytes 2080 - 20bf\n\t0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,\n\t0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,\n\t0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,\n\t0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,\n\t0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,\n\t0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,\n\t0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,\n\t0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,\n\t// Bytes 20c0 - 20ff\n\t0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,\n\t0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,\n\t0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,\n\t0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,\n\t0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,\n\t0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,\n\t0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,\n\t0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,\n\t// Bytes 2100 - 213f\n\t0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,\n\t0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,\n\t0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,\n\t0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,\n\t0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,\n\t0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,\n\t0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,\n\t0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,\n\t// Bytes 2140 - 217f\n\t0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,\n\t0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,\n\t0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,\n\t0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,\n\t0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,\n\t0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,\n\t0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,\n\t0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,\n\t// Bytes 2180 - 21bf\n\t0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,\n\t0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,\n\t0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,\n\t0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,\n\t0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,\n\t0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,\n\t// Bytes 21c0 - 21ff\n\t0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,\n\t0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,\n\t0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t// Bytes 2200 - 223f\n\t0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,\n\t0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,\n\t0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,\n\t0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,\n\t0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,\n\t0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,\n\t0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,\n\t// Bytes 2240 - 227f\n\t0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,\n\t0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,\n\t0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,\n\t0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,\n\t0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,\n\t// Bytes 2280 - 22bf\n\t0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,\n\t0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,\n\t0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,\n\t0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,\n\t0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,\n\t0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,\n\t0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,\n\t// Bytes 22c0 - 22ff\n\t0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,\n\t0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,\n\t0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,\n\t0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,\n\t0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,\n\t0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,\n\t0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,\n\t0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,\n\t// Bytes 2300 - 233f\n\t0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,\n\t0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,\n\t0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,\n\t0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,\n\t0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,\n\t0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,\n\t0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,\n\t0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,\n\t// Bytes 2340 - 237f\n\t0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,\n\t0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,\n\t0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,\n\t0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,\n\t0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,\n\t0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,\n\t0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,\n\t// Bytes 2380 - 23bf\n\t0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,\n\t0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,\n\t0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,\n\t0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,\n\t0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,\n\t0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,\n\t0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,\n\t// Bytes 23c0 - 23ff\n\t0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,\n\t0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,\n\t0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,\n\t0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,\n\t0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,\n\t0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,\n\t0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,\n\t0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,\n\t// Bytes 2400 - 243f\n\t0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,\n\t0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,\n\t0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,\n\t0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,\n\t0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,\n\t0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,\n\t0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,\n\t0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,\n\t// Bytes 2440 - 247f\n\t0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,\n\t0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,\n\t0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,\n\t0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,\n\t0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,\n\t0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,\n\t0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,\n\t// Bytes 2480 - 24bf\n\t0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,\n\t0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,\n\t0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,\n\t0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,\n\t0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,\n\t0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,\n\t0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,\n\t0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,\n\t// Bytes 24c0 - 24ff\n\t0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,\n\t0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,\n\t0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,\n\t0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,\n\t0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,\n\t0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,\n\t// Bytes 2500 - 253f\n\t0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,\n\t0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,\n\t0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,\n\t0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,\n\t0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,\n\t0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,\n\t0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,\n\t// Bytes 2540 - 257f\n\t0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,\n\t0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,\n\t0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,\n\t0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,\n\t0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,\n\t0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,\n\t0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,\n\t// Bytes 2580 - 25bf\n\t0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,\n\t0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,\n\t0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,\n\t0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,\n\t0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,\n\t0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,\n\t0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,\n\t// Bytes 25c0 - 25ff\n\t0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,\n\t0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,\n\t0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,\n\t0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,\n\t0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,\n\t0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,\n\t0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,\n\t0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,\n\t// Bytes 2600 - 263f\n\t0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,\n\t0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,\n\t0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,\n\t0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,\n\t0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,\n\t0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,\n\t0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,\n\t0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,\n\t// Bytes 2640 - 267f\n\t0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,\n\t0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,\n\t0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,\n\t0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,\n\t0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,\n\t0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,\n\t0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,\n\t0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,\n\t// Bytes 2680 - 26bf\n\t0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,\n\t0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,\n\t0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,\n\t0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,\n\t0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,\n\t0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,\n\t0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,\n\t0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,\n\t// Bytes 26c0 - 26ff\n\t0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,\n\t0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,\n\t0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,\n\t0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,\n\t0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,\n\t0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,\n\t0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,\n\t0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD,\n\t// Bytes 2700 - 273f\n\t0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90,\n\t0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46,\n\t0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72,\n\t0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3,\n\t0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28,\n\t0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48,\n\t0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29,\n\t0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,\n\t// Bytes 2740 - 277f\n\t0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85,\n\t0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1,\n\t0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87,\n\t0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,\n\t0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,\n\t0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,\n\t0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48,\n\t0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29,\n\t// Bytes 2780 - 27bf\n\t0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,\n\t0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85,\n\t0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1,\n\t0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91,\n\t0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,\n\t0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61,\n\t0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8,\n\t0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48,\n\t// Bytes 27c0 - 27ff\n\t0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87,\n\t0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9,\n\t0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7,\n\t0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8,\n\t0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84,\n\t0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8,\n\t0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88,\n\t0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2,\n\t// Bytes 2800 - 283f\n\t0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,\n\t0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2,\n\t0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88,\n\t0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE,\n\t0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3,\n\t0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95,\n\t0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3,\n\t0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B,\n\t// Bytes 2840 - 287f\n\t0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,\n\t0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3,\n\t0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95,\n\t0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3,\n\t0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C,\n\t0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,\n\t0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3,\n\t0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95,\n\t// Bytes 2880 - 28bf\n\t0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6,\n\t0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3,\n\t0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9,\n\t0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1,\n\t// Bytes 28c0 - 28ff\n\t0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3,\n\t0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A,\n\t0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3,\n\t0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86,\n\t0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3,\n\t0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,\n\t0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3,\n\t// Bytes 2900 - 293f\n\t0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92,\n\t0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3,\n\t0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3,\n\t0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3,\n\t0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82,\n\t0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98,\n\t0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3,\n\t// Bytes 2940 - 297f\n\t0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,\n\t0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E,\n\t0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3,\n\t0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF,\n\t0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82,\n\t// Bytes 2980 - 29bf\n\t0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF,\n\t0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2,\n\t0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,\n\t0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2,\n\t0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,\n\t0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3,\n\t0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82,\n\t0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3,\n\t// Bytes 29c0 - 29ff\n\t0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C,\n\t0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB,\n\t0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83,\n\t0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD,\n\t0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3,\n\t0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B,\n\t// Bytes 2a00 - 2a3f\n\t0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3,\n\t0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC,\n\t0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3,\n\t0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82,\n\t0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C,\n\t0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t// Bytes 2a40 - 2a7f\n\t0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F,\n\t0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,\n\t0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC,\n\t0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3,\n\t0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF,\n\t0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3,\n\t// Bytes 2a80 - 2abf\n\t0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83,\n\t0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3,\n\t0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C,\n\t0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82,\n\t0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83,\n\t0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,\n\t// Bytes 2ac0 - 2aff\n\t0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,\n\t0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,\n\t0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3,\n\t0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,\n\t0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4,\n\t0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1,\n\t0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92,\n\t0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9,\n\t// Bytes 2b00 - 2b3f\n\t0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7,\n\t0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2,\n\t0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2,\n\t0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82,\n\t0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD,\n\t0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83,\n\t0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5,\n\t// Bytes 2b40 - 2b7f\n\t0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F,\n\t0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B,\n\t0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E,\n\t// Bytes 2b80 - 2bbf\n\t0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83,\n\t0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1,\n\t0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB,\n\t0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84,\n\t0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1,\n\t0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3,\n\t// Bytes 2bc0 - 2bff\n\t0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,\n\t0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD,\n\t0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t// Bytes 2c00 - 2c3f\n\t0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3,\n\t0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83,\n\t0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3,\n\t0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83,\n\t0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88,\n\t0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,\n\t0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88,\n\t// Bytes 2c40 - 2c7f\n\t0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3,\n\t0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7,\n\t0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3,\n\t0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F,\n\t0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3,\n\t0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9,\n\t// Bytes 2c80 - 2cbf\n\t0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84,\n\t0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9,\n\t0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88,\n\t0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0,\n\t0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0,\n\t0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0,\n\t0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0,\n\t0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0,\n\t// Bytes 2cc0 - 2cff\n\t0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0,\n\t0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,\n\t0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,\n\t0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,\n\t0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,\n\t0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,\n\t0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,\n\t0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0,\n\t// Bytes 2d00 - 2d3f\n\t0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,\n\t0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0,\n\t0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,\n\t0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1,\n\t0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1,\n\t0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t// Bytes 2d40 - 2d7f\n\t0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0,\n\t// Bytes 2d80 - 2dbf\n\t0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01,\n\t0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84,\n\t0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0,\n\t0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D,\n\t0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0,\n\t0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01,\n\t0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92,\n\t0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0,\n\t// Bytes 2dc0 - 2dff\n\t0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96,\n\t0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0,\n\t0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01,\n\t0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0,\n\t0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0,\n\t0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44,\n\t0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC,\n\t0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9,\n\t// Bytes 2e00 - 2e3f\n\t0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9,\n\t0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9,\n\t0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,\n\t0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01,\n\t// Bytes 2e40 - 2e7f\n\t0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01,\n\t0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01,\n\t// Bytes 2e80 - 2ebf\n\t0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01,\n\t0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3,\n\t0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1,\n\t0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4,\n\t0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,\n\t0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C,\n\t0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t// Bytes 2ec0 - 2eff\n\t0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83,\n\t0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3,\n\t0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1,\n\t0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80,\n\t0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4,\n\t0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82,\n\t0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82,\n\t0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3,\n\t// Bytes 2f00 - 2f3f\n\t0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3,\n\t0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,\n\t0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F,\n\t0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,\n\t0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3,\n\t0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,\n\t0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95,\n\t// Bytes 2f40 - 2f7f\n\t0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83,\n\t0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,\n\t0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01,\n\t0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01,\n\t0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC,\n\t0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03,\n\t0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81,\n\t0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41,\n\t// Bytes 2f80 - 2fbf\n\t0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9,\n\t0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC,\n\t0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03,\n\t0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8,\n\t0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42,\n\t0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5,\n\t0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC,\n\t0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03,\n\t// Bytes 2fc0 - 2fff\n\t0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87,\n\t0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44,\n\t0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5,\n\t0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC,\n\t0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03,\n\t0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83,\n\t0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45,\n\t0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9,\n\t// Bytes 3000 - 303f\n\t0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03,\n\t0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8,\n\t0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45,\n\t0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9,\n\t0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC,\n\t0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03,\n\t0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87,\n\t// Bytes 3040 - 307f\n\t0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47,\n\t0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9,\n\t0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC,\n\t0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03,\n\t0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49,\n\t0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9,\n\t0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC,\n\t// Bytes 3080 - 30bf\n\t0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03,\n\t0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87,\n\t0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9,\n\t0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC,\n\t0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03,\n\t0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82,\n\t0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B,\n\t// Bytes 30c0 - 30ff\n\t0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC,\n\t0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03,\n\t0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9,\n\t0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC,\n\t0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03,\n\t// Bytes 3100 - 313f\n\t0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83,\n\t0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC,\n\t0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03,\n\t0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81,\n\t0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F,\n\t0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9,\n\t// Bytes 3140 - 317f\n\t0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC,\n\t0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03,\n\t0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87,\n\t0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52,\n\t0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9,\n\t0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC,\n\t0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03,\n\t0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82,\n\t// Bytes 3180 - 31bf\n\t0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53,\n\t0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5,\n\t0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03,\n\t0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9,\n\t0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC,\n\t// Bytes 31c0 - 31ff\n\t0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03,\n\t0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A,\n\t0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9,\n\t0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC,\n\t0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03,\n\t0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD,\n\t0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56,\n\t// Bytes 3200 - 323f\n\t0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC,\n\t0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03,\n\t0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88,\n\t0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58,\n\t0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9,\n\t0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC,\n\t0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03,\n\t// Bytes 3240 - 327f\n\t0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84,\n\t0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59,\n\t0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9,\n\t0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC,\n\t0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03,\n\t0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9,\n\t// Bytes 3280 - 32bf\n\t0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC,\n\t0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03,\n\t0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61,\n\t0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5,\n\t0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC,\n\t0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03,\n\t0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81,\n\t// Bytes 32c0 - 32ff\n\t0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63,\n\t0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9,\n\t0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03,\n\t0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD,\n\t0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65,\n\t0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9,\n\t0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC,\n\t// Bytes 3300 - 333f\n\t0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03,\n\t0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89,\n\t0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65,\n\t0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9,\n\t0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC,\n\t0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03,\n\t0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81,\n\t0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67,\n\t// Bytes 3340 - 337f\n\t0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9,\n\t0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03,\n\t0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87,\n\t0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC,\n\t0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03,\n\t// Bytes 3380 - 33bf\n\t0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81,\n\t0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69,\n\t0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9,\n\t0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC,\n\t0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03,\n\t0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91,\n\t0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69,\n\t0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5,\n\t// Bytes 33c0 - 33ff\n\t0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03,\n\t0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3,\n\t0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9,\n\t0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC,\n\t0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03,\n\t0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81,\n\t// Bytes 3400 - 343f\n\t0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D,\n\t0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9,\n\t0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC,\n\t0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03,\n\t0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3,\n\t0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E,\n\t0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5,\n\t0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC,\n\t// Bytes 3440 - 347f\n\t0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03,\n\t0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B,\n\t0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F,\n\t0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9,\n\t0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC,\n\t0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03,\n\t0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72,\n\t// Bytes 3480 - 34bf\n\t0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5,\n\t0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC,\n\t0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03,\n\t0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74,\n\t0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9,\n\t0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC,\n\t0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03,\n\t// Bytes 34c0 - 34ff\n\t0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1,\n\t0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75,\n\t0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9,\n\t0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC,\n\t0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03,\n\t0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75,\n\t0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5,\n\t// Bytes 3500 - 353f\n\t0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC,\n\t0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03,\n\t0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83,\n\t0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77,\n\t0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9,\n\t0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC,\n\t0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03,\n\t0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3,\n\t// Bytes 3540 - 357f\n\t0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78,\n\t0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9,\n\t0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC,\n\t0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03,\n\t0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87,\n\t0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79,\n\t0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9,\n\t0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC,\n\t// Bytes 3580 - 35bf\n\t0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03,\n\t0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A,\n\t0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80,\n\t0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04,\n\t0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86,\n\t0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84,\n\t0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04,\n\t// Bytes 35c0 - 35ff\n\t0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6,\n\t0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81,\n\t0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04,\n\t0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92,\n\t0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80,\n\t0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04,\n\t0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91,\n\t0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85,\n\t// Bytes 3600 - 363f\n\t0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97,\n\t0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81,\n\t0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04,\n\t0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99,\n\t0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84,\n\t0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04,\n\t0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F,\n\t// Bytes 3640 - 367f\n\t0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81,\n\t0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04,\n\t0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5,\n\t0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84,\n\t0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04,\n\t0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9,\n\t0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81,\n\t0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04,\n\t// Bytes 3680 - 36bf\n\t0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1,\n\t0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85,\n\t0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7,\n\t0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80,\n\t0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04,\n\t0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9,\n\t0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82,\n\t// Bytes 36c0 - 36ff\n\t0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81,\n\t0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94,\n\t0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85,\n\t0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86,\n\t0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04,\n\t0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92,\n\t// Bytes 3700 - 373f\n\t0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81,\n\t0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04,\n\t0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04,\n\t// Bytes 3740 - 377f\n\t0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98,\n\t0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84,\n\t0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04,\n\t0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A,\n\t0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04,\n\t0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B,\n\t// Bytes 3780 - 37bf\n\t0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5,\n\t0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6,\n\t// Bytes 37c0 - 37ff\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04,\n\t0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8,\n\t0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04,\n\t0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83,\n\t0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04,\n\t// Bytes 3800 - 383f\n\t0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4,\n\t0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F,\n\t0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88,\n\t// Bytes 3840 - 387f\n\t0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04,\n\t0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7,\n\t0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94,\n\t0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04,\n\t0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92,\n\t0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94,\n\t0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA,\n\t0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,\n\t// Bytes 3880 - 38bf\n\t0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41,\n\t0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC,\n\t0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86,\n\t0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC,\n\t0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89,\n\t0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA,\n\t0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05,\n\t0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41,\n\t// Bytes 38c0 - 38ff\n\t0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC,\n\t0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7,\n\t0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC,\n\t0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81,\n\t0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA,\n\t0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05,\n\t0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45,\n\t0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC,\n\t// Bytes 3900 - 393f\n\t0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7,\n\t0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC,\n\t0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84,\n\t0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA,\n\t0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,\n\t0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F,\n\t0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC,\n\t0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83,\n\t// Bytes 3940 - 397f\n\t0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC,\n\t0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80,\n\t0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA,\n\t0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,\n\t0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F,\n\t0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC,\n\t0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B,\n\t0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,\n\t// Bytes 3980 - 39bf\n\t0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3,\n\t0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA,\n\t0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05,\n\t0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53,\n\t0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC,\n\t0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3,\n\t0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC,\n\t0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88,\n\t// Bytes 39c0 - 39ff\n\t0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA,\n\t0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05,\n\t0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55,\n\t0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC,\n\t0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B,\n\t0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC,\n\t0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89,\n\t0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,\n\t// Bytes 3a00 - 3a3f\n\t0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,\n\t0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61,\n\t0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC,\n\t0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86,\n\t0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC,\n\t0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83,\n\t0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA,\n\t0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,\n\t// Bytes 3a40 - 3a7f\n\t0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61,\n\t0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC,\n\t0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3,\n\t0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC,\n\t0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80,\n\t0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA,\n\t0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05,\n\t0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65,\n\t// Bytes 3a80 - 3abf\n\t0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC,\n\t0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3,\n\t0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC,\n\t0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81,\n\t0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA,\n\t0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,\n\t0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F,\n\t0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC,\n\t// Bytes 3ac0 - 3aff\n\t0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83,\n\t0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC,\n\t0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88,\n\t0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA,\n\t0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05,\n\t0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F,\n\t0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC,\n\t0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B,\n\t// Bytes 3b00 - 3b3f\n\t0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,\n\t0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89,\n\t0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,\n\t0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05,\n\t0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72,\n\t0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC,\n\t0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C,\n\t0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC,\n\t// Bytes 3b40 - 3b7f\n\t0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81,\n\t0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA,\n\t0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05,\n\t0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75,\n\t0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC,\n\t0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B,\n\t0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC,\n\t0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83,\n\t// Bytes 3b80 - 3bbf\n\t0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA,\n\t0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05,\n\t0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1,\n\t0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE,\n\t0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE,\n\t0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC,\n\t0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82,\n\t0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05,\n\t// Bytes 3bc0 - 3bff\n\t0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,\n\t0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05,\n\t// Bytes 3c00 - 3c3f\n\t0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,\n\t0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t// Bytes 3c40 - 3c7f\n\t0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,\n\t0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,\n\t// Bytes 3c80 - 3cbf\n\t0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,\n\t0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2,\n\t// Bytes 3cc0 - 3cff\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05,\n\t0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t// Bytes 3d00 - 3d3f\n\t0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t// Bytes 3d40 - 3d7f\n\t0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t// Bytes 3d80 - 3dbf\n\t0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t// Bytes 3dc0 - 3dff\n\t0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA,\n\t// Bytes 3e00 - 3e3f\n\t0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t// Bytes 3e40 - 3e7f\n\t0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA,\n\t// Bytes 3e80 - 3ebf\n\t0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA,\n\t// Bytes 3ec0 - 3eff\n\t0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA,\n\t0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09,\n\t0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09,\n\t0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09,\n\t0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85,\n\t0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11,\n\t// Bytes 3f00 - 3f3f\n\t0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 3f40 - 3f7f\n\t0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 3f80 - 3fbf\n\t0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D,\n\t// Bytes 3fc0 - 3fff\n\t0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 4000 - 403f\n\t0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 4040 - 407f\n\t0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 4080 - 40bf\n\t0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 40c0 - 40ff\n\t0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D,\n\t0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC,\n\t0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC,\n\t0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD,\n\t// Bytes 4100 - 413f\n\t0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD,\n\t0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,\n\t0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC,\n\t0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t// Bytes 4140 - 417f\n\t0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC,\n\t0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC,\n\t0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD,\n\t// Bytes 4180 - 41bf\n\t0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,\n\t0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC,\n\t0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,\n\t// Bytes 41c0 - 41ff\n\t0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC,\n\t0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC,\n\t0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD,\n\t0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,\n\t// Bytes 4200 - 423f\n\t0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF,\n\t0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC,\n\t0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,\n\t0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82,\n\t// Bytes 4240 - 427f\n\t0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0,\n\t0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82,\n\t0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2,\n\t0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43,\n\t0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84,\n\t0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20,\n\t0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9,\n\t0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC,\n\t// Bytes 4280 - 42bf\n\t0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43,\n\t0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94,\n\t0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20,\n\t0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5,\n\t0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD,\n\t0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43,\n\t0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D,\n\t0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20,\n\t// Bytes 42c0 - 42ff\n\t0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D,\n\t0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9,\n\t0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43,\n\t0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82,\n\t0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE,\n\t0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC,\n\t0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9,\n\t// Bytes 4300 - 433f\n\t0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE,\n\t0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC,\n\t0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9,\n\t0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,\n\t0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC,\n\t0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9,\n\t0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,\n\t0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC,\n\t// Bytes 4340 - 437f\n\t0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9,\n\t0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7,\n\t0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7,\n\t0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7,\n\t// Bytes 4380 - 43bf\n\t0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7,\n\t0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7,\n\t0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41,\n\t// Bytes 43c0 - 43ff\n\t0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7,\n\t0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49,\n\t0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7,\n\t0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7,\n\t0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6,\n\t// Bytes 4400 - 443f\n\t0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31,\n\t0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8,\n\t0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9,\n\t0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,\n\t0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8,\n\t0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9,\n\t0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65,\n\t0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9,\n\t// Bytes 4440 - 447f\n\t0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9,\n\t0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75,\n\t0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9,\n\t0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9,\n\t0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9,\n\t0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB,\n\t0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88,\n\t0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC,\n\t// Bytes 4480 - 44bf\n\t0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82,\n\t0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45,\n\t0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20,\n\t0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94,\n\t0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9,\n\t0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91,\n\t// Bytes 44c0 - 44ff\n\t0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72,\n\t0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45,\n\t0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20,\n\t0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB,\n\t0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC,\n\t0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC,\n\t0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6,\n\t0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6,\n\t// Bytes 4500 - 453f\n\t0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9,\n\t0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,\n\t0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,\n\t0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1,\n\t// Bytes 4540 - 457f\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1,\n\t0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2,\n\t0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF,\n\t0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97,\n\t// Bytes 4580 - 45bf\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1,\n\t0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2,\n\t0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2,\n\t0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3,\n\t// Bytes 45c0 - 45ff\n\t0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86,\n\t0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85,\n\t0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0,\n\t0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD,\n\t0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,\n\t0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,\n\t0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2,\n\t0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49,\n\t// Bytes 4600 - 463f\n\t0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE,\n\t0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,\n\t0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE,\n\t0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85,\n\t0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0,\n\t0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,\n\t0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85,\n\t0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,\n\t// Bytes 4640 - 467f\n\t0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,\n\t0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE,\n\t0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,\n\t0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0,\n\t0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,\n\t0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86,\n\t0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,\n\t0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,\n\t// Bytes 4680 - 46bf\n\t0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE,\n\t0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC,\n\t0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83,\n\t0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A,\n\t0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43,\n\t0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9,\n\t0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC,\n\t0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83,\n\t// Bytes 46c0 - 46ff\n\t0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3,\n\t0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F,\n\t0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9,\n\t0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC,\n\t0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83,\n\t0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8,\n\t0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53,\n\t0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9,\n\t// Bytes 4700 - 473f\n\t0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC,\n\t0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83,\n\t0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B,\n\t0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61,\n\t0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9,\n\t0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC,\n\t0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83,\n\t0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82,\n\t// Bytes 4740 - 477f\n\t0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65,\n\t0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5,\n\t0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC,\n\t0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83,\n\t0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84,\n\t0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F,\n\t0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD,\n\t0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC,\n\t// Bytes 4780 - 47bf\n\t0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83,\n\t0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C,\n\t0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75,\n\t0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9,\n\t0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC,\n\t0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE,\n\t0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC,\n\t// Bytes 47c0 - 47ff\n\t0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE,\n\t0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE,\n\t0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC,\n\t0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE,\n\t// Bytes 4800 - 483f\n\t0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC,\n\t0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE,\n\t0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9,\n\t0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9,\n\t// Bytes 4840 - 487f\n\t0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE,\n\t0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF,\n\t0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC,\n\t0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF,\n\t0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC,\n\t// Bytes 4880 - 48bf\n\t0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE,\n\t0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t// Bytes 48c0 - 48ff\n\t0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t// Bytes 4900 - 493f\n\t0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t// Bytes 4940 - 497f\n\t0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF,\n\t// Bytes 4980 - 49bf\n\t0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC,\n\t0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32,\n\t0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85,\n\t// Bytes 49c0 - 49ff\n\t0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43,\n\t// Bytes 4a00 - 4a3f\n\t0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01,\n\t// Bytes 4a40 - 4a7f\n\t0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43,\n\t0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86,\n\t0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01,\n\t0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43,\n\t0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86,\n\t0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01,\n\t0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32,\n\t0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3,\n\t// Bytes 4a80 - 4abf\n\t0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1,\n\t0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD,\n\t0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0,\n\t0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00,\n\t0x01,\n}\n\n// lookup returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfcTrie) lookupUnsafe(s []byte) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfcValues[c0]\n\t}\n\ti := nfcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// lookupString returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfcTrie) lookupString(s string) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfcTrie) lookupStringUnsafe(s string) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfcValues[c0]\n\t}\n\ti := nfcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// nfcTrie. Total size: 10442 bytes (10.20 KiB). Checksum: 4ba400a9d8208e03.\ntype nfcTrie struct{}\n\nfunc newNfcTrie(i int) *nfcTrie {\n\treturn &nfcTrie{}\n}\n\n// lookupValue determines the type of block n and looks up the value for b.\nfunc (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {\n\tswitch {\n\tcase n < 45:\n\t\treturn uint16(nfcValues[n<<6+uint32(b)])\n\tdefault:\n\t\tn -= 45\n\t\treturn uint16(nfcSparse.lookup(n, b))\n\t}\n}\n\n// nfcValues: 47 blocks, 3008 entries, 6016 bytes\n// The third block is the zero block.\nvar nfcValues = [3008]uint16{\n\t// Block 0x0, offset 0x0\n\t0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,\n\t// Block 0x1, offset 0x40\n\t0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,\n\t0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,\n\t0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,\n\t0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,\n\t0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,\n\t0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,\n\t0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,\n\t0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,\n\t0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,\n\t0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,\n\t0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,\n\t0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,\n\t0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,\n\t0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,\n\t0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,\n\t0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,\n\t0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,\n\t0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,\n\t0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,\n\t0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,\n\t// Block 0x4, offset 0x100\n\t0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,\n\t0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,\n\t0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,\n\t0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,\n\t0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,\n\t0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,\n\t0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,\n\t0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,\n\t0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0,\n\t0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,\n\t0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8,\n\t// Block 0x5, offset 0x140\n\t0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,\n\t0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f,\n\t0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,\n\t0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,\n\t0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,\n\t0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,\n\t0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,\n\t0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,\n\t0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,\n\t0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,\n\t0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000,\n\t// Block 0x6, offset 0x180\n\t0x184: 0x8100, 0x185: 0x8100,\n\t0x186: 0x8100,\n\t0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,\n\t0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,\n\t0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,\n\t0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,\n\t0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,\n\t0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,\n\t0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334,\n\t0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,\n\t0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,\n\t0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,\n\t0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,\n\t0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,\n\t0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,\n\t0x1de: 0x305a, 0x1df: 0x3366,\n\t0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,\n\t0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,\n\t0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,\n\t// Block 0x8, offset 0x200\n\t0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,\n\t0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,\n\t0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,\n\t0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,\n\t0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,\n\t0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,\n\t0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,\n\t0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,\n\t0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,\n\t0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,\n\t0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,\n\t0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,\n\t0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,\n\t0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,\n\t0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,\n\t0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,\n\t0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,\n\t0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,\n\t0x274: 0x0170,\n\t0x27a: 0x8100,\n\t0x27e: 0x0037,\n\t// Block 0xa, offset 0x280\n\t0x284: 0x8100, 0x285: 0x35a1,\n\t0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,\n\t0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,\n\t0x295: 0xa000, 0x297: 0xa000,\n\t0x299: 0xa000,\n\t0x29f: 0xa000, 0x2a1: 0xa000,\n\t0x2a5: 0xa000, 0x2a9: 0xa000,\n\t0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,\n\t0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,\n\t0x2b7: 0xa000, 0x2b9: 0xa000,\n\t0x2bf: 0xa000,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b,\n\t0x2c6: 0xa000, 0x2c7: 0x3709,\n\t0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000,\n\t0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,\n\t0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000,\n\t0x2de: 0xa000, 0x2e3: 0xa000,\n\t0x2e7: 0xa000,\n\t0x2eb: 0xa000, 0x2ed: 0xa000,\n\t0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,\n\t0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000,\n\t0x2fe: 0xa000,\n\t// Block 0xc, offset 0x300\n\t0x301: 0x3733, 0x302: 0x37b7,\n\t0x310: 0x370f, 0x311: 0x3793,\n\t0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab,\n\t0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd,\n\t0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf,\n\t0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000,\n\t0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed,\n\t0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805,\n\t0x338: 0x3787, 0x339: 0x380b,\n\t// Block 0xd, offset 0x340\n\t0x351: 0x812d,\n\t0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132,\n\t0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132,\n\t0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d,\n\t0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132,\n\t0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132,\n\t0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a,\n\t0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f,\n\t0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112,\n\t// Block 0xe, offset 0x380\n\t0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116,\n\t0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c,\n\t0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132,\n\t0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132,\n\t0x39e: 0x8132, 0x39f: 0x812d,\n\t0x3b0: 0x811e,\n\t// Block 0xf, offset 0x3c0\n\t0x3c5: 0xa000,\n\t0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000,\n\t0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000,\n\t0x3d2: 0x2d4e,\n\t0x3f4: 0x8102, 0x3f5: 0x9900,\n\t0x3fa: 0xa000, 0x3fb: 0x2d56,\n\t0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000,\n\t// Block 0x10, offset 0x400\n\t0x400: 0x8132, 0x401: 0x8132, 0x402: 0x812d, 0x403: 0x8132, 0x404: 0x8132, 0x405: 0x8132,\n\t0x406: 0x8132, 0x407: 0x8132, 0x408: 0x8132, 0x409: 0x8132, 0x40a: 0x812d, 0x40b: 0x8132,\n\t0x40c: 0x8132, 0x40d: 0x8135, 0x40e: 0x812a, 0x40f: 0x812d, 0x410: 0x8129, 0x411: 0x8132,\n\t0x412: 0x8132, 0x413: 0x8132, 0x414: 0x8132, 0x415: 0x8132, 0x416: 0x8132, 0x417: 0x8132,\n\t0x418: 0x8132, 0x419: 0x8132, 0x41a: 0x8132, 0x41b: 0x8132, 0x41c: 0x8132, 0x41d: 0x8132,\n\t0x41e: 0x8132, 0x41f: 0x8132, 0x420: 0x8132, 0x421: 0x8132, 0x422: 0x8132, 0x423: 0x8132,\n\t0x424: 0x8132, 0x425: 0x8132, 0x426: 0x8132, 0x427: 0x8132, 0x428: 0x8132, 0x429: 0x8132,\n\t0x42a: 0x8132, 0x42b: 0x8132, 0x42c: 0x8132, 0x42d: 0x8132, 0x42e: 0x8132, 0x42f: 0x8132,\n\t0x430: 0x8132, 0x431: 0x8132, 0x432: 0x8132, 0x433: 0x8132, 0x434: 0x8132, 0x435: 0x8132,\n\t0x436: 0x8133, 0x437: 0x8131, 0x438: 0x8131, 0x439: 0x812d, 0x43b: 0x8132,\n\t0x43c: 0x8134, 0x43d: 0x812d, 0x43e: 0x8132, 0x43f: 0x812d,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x2f97, 0x441: 0x32a3, 0x442: 0x2fa1, 0x443: 0x32ad, 0x444: 0x2fa6, 0x445: 0x32b2,\n\t0x446: 0x2fab, 0x447: 0x32b7, 0x448: 0x38cc, 0x449: 0x3a5b, 0x44a: 0x2fc4, 0x44b: 0x32d0,\n\t0x44c: 0x2fce, 0x44d: 0x32da, 0x44e: 0x2fdd, 0x44f: 0x32e9, 0x450: 0x2fd3, 0x451: 0x32df,\n\t0x452: 0x2fd8, 0x453: 0x32e4, 0x454: 0x38ef, 0x455: 0x3a7e, 0x456: 0x38f6, 0x457: 0x3a85,\n\t0x458: 0x3019, 0x459: 0x3325, 0x45a: 0x301e, 0x45b: 0x332a, 0x45c: 0x3904, 0x45d: 0x3a93,\n\t0x45e: 0x3023, 0x45f: 0x332f, 0x460: 0x3032, 0x461: 0x333e, 0x462: 0x3050, 0x463: 0x335c,\n\t0x464: 0x305f, 0x465: 0x336b, 0x466: 0x3055, 0x467: 0x3361, 0x468: 0x3064, 0x469: 0x3370,\n\t0x46a: 0x3069, 0x46b: 0x3375, 0x46c: 0x30af, 0x46d: 0x33bb, 0x46e: 0x390b, 0x46f: 0x3a9a,\n\t0x470: 0x30b9, 0x471: 0x33ca, 0x472: 0x30c3, 0x473: 0x33d4, 0x474: 0x30cd, 0x475: 0x33de,\n\t0x476: 0x46c4, 0x477: 0x4755, 0x478: 0x3912, 0x479: 0x3aa1, 0x47a: 0x30e6, 0x47b: 0x33f7,\n\t0x47c: 0x30e1, 0x47d: 0x33f2, 0x47e: 0x30eb, 0x47f: 0x33fc,\n\t// Block 0x12, offset 0x480\n\t0x480: 0x30f0, 0x481: 0x3401, 0x482: 0x30f5, 0x483: 0x3406, 0x484: 0x3109, 0x485: 0x341a,\n\t0x486: 0x3113, 0x487: 0x3424, 0x488: 0x3122, 0x489: 0x3433, 0x48a: 0x311d, 0x48b: 0x342e,\n\t0x48c: 0x3935, 0x48d: 0x3ac4, 0x48e: 0x3943, 0x48f: 0x3ad2, 0x490: 0x394a, 0x491: 0x3ad9,\n\t0x492: 0x3951, 0x493: 0x3ae0, 0x494: 0x314f, 0x495: 0x3460, 0x496: 0x3154, 0x497: 0x3465,\n\t0x498: 0x315e, 0x499: 0x346f, 0x49a: 0x46f1, 0x49b: 0x4782, 0x49c: 0x3997, 0x49d: 0x3b26,\n\t0x49e: 0x3177, 0x49f: 0x3488, 0x4a0: 0x3181, 0x4a1: 0x3492, 0x4a2: 0x4700, 0x4a3: 0x4791,\n\t0x4a4: 0x399e, 0x4a5: 0x3b2d, 0x4a6: 0x39a5, 0x4a7: 0x3b34, 0x4a8: 0x39ac, 0x4a9: 0x3b3b,\n\t0x4aa: 0x3190, 0x4ab: 0x34a1, 0x4ac: 0x319a, 0x4ad: 0x34b0, 0x4ae: 0x31ae, 0x4af: 0x34c4,\n\t0x4b0: 0x31a9, 0x4b1: 0x34bf, 0x4b2: 0x31ea, 0x4b3: 0x3500, 0x4b4: 0x31f9, 0x4b5: 0x350f,\n\t0x4b6: 0x31f4, 0x4b7: 0x350a, 0x4b8: 0x39b3, 0x4b9: 0x3b42, 0x4ba: 0x39ba, 0x4bb: 0x3b49,\n\t0x4bc: 0x31fe, 0x4bd: 0x3514, 0x4be: 0x3203, 0x4bf: 0x3519,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0x3208, 0x4c1: 0x351e, 0x4c2: 0x320d, 0x4c3: 0x3523, 0x4c4: 0x321c, 0x4c5: 0x3532,\n\t0x4c6: 0x3217, 0x4c7: 0x352d, 0x4c8: 0x3221, 0x4c9: 0x353c, 0x4ca: 0x3226, 0x4cb: 0x3541,\n\t0x4cc: 0x322b, 0x4cd: 0x3546, 0x4ce: 0x3249, 0x4cf: 0x3564, 0x4d0: 0x3262, 0x4d1: 0x3582,\n\t0x4d2: 0x3271, 0x4d3: 0x3591, 0x4d4: 0x3276, 0x4d5: 0x3596, 0x4d6: 0x337a, 0x4d7: 0x34a6,\n\t0x4d8: 0x3537, 0x4d9: 0x3573, 0x4db: 0x35d1,\n\t0x4e0: 0x46a1, 0x4e1: 0x4732, 0x4e2: 0x2f83, 0x4e3: 0x328f,\n\t0x4e4: 0x3878, 0x4e5: 0x3a07, 0x4e6: 0x3871, 0x4e7: 0x3a00, 0x4e8: 0x3886, 0x4e9: 0x3a15,\n\t0x4ea: 0x387f, 0x4eb: 0x3a0e, 0x4ec: 0x38be, 0x4ed: 0x3a4d, 0x4ee: 0x3894, 0x4ef: 0x3a23,\n\t0x4f0: 0x388d, 0x4f1: 0x3a1c, 0x4f2: 0x38a2, 0x4f3: 0x3a31, 0x4f4: 0x389b, 0x4f5: 0x3a2a,\n\t0x4f6: 0x38c5, 0x4f7: 0x3a54, 0x4f8: 0x46b5, 0x4f9: 0x4746, 0x4fa: 0x3000, 0x4fb: 0x330c,\n\t0x4fc: 0x2fec, 0x4fd: 0x32f8, 0x4fe: 0x38da, 0x4ff: 0x3a69,\n\t// Block 0x14, offset 0x500\n\t0x500: 0x38d3, 0x501: 0x3a62, 0x502: 0x38e8, 0x503: 0x3a77, 0x504: 0x38e1, 0x505: 0x3a70,\n\t0x506: 0x38fd, 0x507: 0x3a8c, 0x508: 0x3091, 0x509: 0x339d, 0x50a: 0x30a5, 0x50b: 0x33b1,\n\t0x50c: 0x46e7, 0x50d: 0x4778, 0x50e: 0x3136, 0x50f: 0x3447, 0x510: 0x3920, 0x511: 0x3aaf,\n\t0x512: 0x3919, 0x513: 0x3aa8, 0x514: 0x392e, 0x515: 0x3abd, 0x516: 0x3927, 0x517: 0x3ab6,\n\t0x518: 0x3989, 0x519: 0x3b18, 0x51a: 0x396d, 0x51b: 0x3afc, 0x51c: 0x3966, 0x51d: 0x3af5,\n\t0x51e: 0x397b, 0x51f: 0x3b0a, 0x520: 0x3974, 0x521: 0x3b03, 0x522: 0x3982, 0x523: 0x3b11,\n\t0x524: 0x31e5, 0x525: 0x34fb, 0x526: 0x31c7, 0x527: 0x34dd, 0x528: 0x39e4, 0x529: 0x3b73,\n\t0x52a: 0x39dd, 0x52b: 0x3b6c, 0x52c: 0x39f2, 0x52d: 0x3b81, 0x52e: 0x39eb, 0x52f: 0x3b7a,\n\t0x530: 0x39f9, 0x531: 0x3b88, 0x532: 0x3230, 0x533: 0x354b, 0x534: 0x3258, 0x535: 0x3578,\n\t0x536: 0x3253, 0x537: 0x356e, 0x538: 0x323f, 0x539: 0x355a,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x4804, 0x541: 0x480a, 0x542: 0x491e, 0x543: 0x4936, 0x544: 0x4926, 0x545: 0x493e,\n\t0x546: 0x492e, 0x547: 0x4946, 0x548: 0x47aa, 0x549: 0x47b0, 0x54a: 0x488e, 0x54b: 0x48a6,\n\t0x54c: 0x4896, 0x54d: 0x48ae, 0x54e: 0x489e, 0x54f: 0x48b6, 0x550: 0x4816, 0x551: 0x481c,\n\t0x552: 0x3db8, 0x553: 0x3dc8, 0x554: 0x3dc0, 0x555: 0x3dd0,\n\t0x558: 0x47b6, 0x559: 0x47bc, 0x55a: 0x3ce8, 0x55b: 0x3cf8, 0x55c: 0x3cf0, 0x55d: 0x3d00,\n\t0x560: 0x482e, 0x561: 0x4834, 0x562: 0x494e, 0x563: 0x4966,\n\t0x564: 0x4956, 0x565: 0x496e, 0x566: 0x495e, 0x567: 0x4976, 0x568: 0x47c2, 0x569: 0x47c8,\n\t0x56a: 0x48be, 0x56b: 0x48d6, 0x56c: 0x48c6, 0x56d: 0x48de, 0x56e: 0x48ce, 0x56f: 0x48e6,\n\t0x570: 0x4846, 0x571: 0x484c, 0x572: 0x3e18, 0x573: 0x3e30, 0x574: 0x3e20, 0x575: 0x3e38,\n\t0x576: 0x3e28, 0x577: 0x3e40, 0x578: 0x47ce, 0x579: 0x47d4, 0x57a: 0x3d18, 0x57b: 0x3d30,\n\t0x57c: 0x3d20, 0x57d: 0x3d38, 0x57e: 0x3d28, 0x57f: 0x3d40,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x4852, 0x581: 0x4858, 0x582: 0x3e48, 0x583: 0x3e58, 0x584: 0x3e50, 0x585: 0x3e60,\n\t0x588: 0x47da, 0x589: 0x47e0, 0x58a: 0x3d48, 0x58b: 0x3d58,\n\t0x58c: 0x3d50, 0x58d: 0x3d60, 0x590: 0x4864, 0x591: 0x486a,\n\t0x592: 0x3e80, 0x593: 0x3e98, 0x594: 0x3e88, 0x595: 0x3ea0, 0x596: 0x3e90, 0x597: 0x3ea8,\n\t0x599: 0x47e6, 0x59b: 0x3d68, 0x59d: 0x3d70,\n\t0x59f: 0x3d78, 0x5a0: 0x487c, 0x5a1: 0x4882, 0x5a2: 0x497e, 0x5a3: 0x4996,\n\t0x5a4: 0x4986, 0x5a5: 0x499e, 0x5a6: 0x498e, 0x5a7: 0x49a6, 0x5a8: 0x47ec, 0x5a9: 0x47f2,\n\t0x5aa: 0x48ee, 0x5ab: 0x4906, 0x5ac: 0x48f6, 0x5ad: 0x490e, 0x5ae: 0x48fe, 0x5af: 0x4916,\n\t0x5b0: 0x47f8, 0x5b1: 0x431e, 0x5b2: 0x3691, 0x5b3: 0x4324, 0x5b4: 0x4822, 0x5b5: 0x432a,\n\t0x5b6: 0x36a3, 0x5b7: 0x4330, 0x5b8: 0x36c1, 0x5b9: 0x4336, 0x5ba: 0x36d9, 0x5bb: 0x433c,\n\t0x5bc: 0x4870, 0x5bd: 0x4342,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x3da0, 0x5c1: 0x3da8, 0x5c2: 0x4184, 0x5c3: 0x41a2, 0x5c4: 0x418e, 0x5c5: 0x41ac,\n\t0x5c6: 0x4198, 0x5c7: 0x41b6, 0x5c8: 0x3cd8, 0x5c9: 0x3ce0, 0x5ca: 0x40d0, 0x5cb: 0x40ee,\n\t0x5cc: 0x40da, 0x5cd: 0x40f8, 0x5ce: 0x40e4, 0x5cf: 0x4102, 0x5d0: 0x3de8, 0x5d1: 0x3df0,\n\t0x5d2: 0x41c0, 0x5d3: 0x41de, 0x5d4: 0x41ca, 0x5d5: 0x41e8, 0x5d6: 0x41d4, 0x5d7: 0x41f2,\n\t0x5d8: 0x3d08, 0x5d9: 0x3d10, 0x5da: 0x410c, 0x5db: 0x412a, 0x5dc: 0x4116, 0x5dd: 0x4134,\n\t0x5de: 0x4120, 0x5df: 0x413e, 0x5e0: 0x3ec0, 0x5e1: 0x3ec8, 0x5e2: 0x41fc, 0x5e3: 0x421a,\n\t0x5e4: 0x4206, 0x5e5: 0x4224, 0x5e6: 0x4210, 0x5e7: 0x422e, 0x5e8: 0x3d80, 0x5e9: 0x3d88,\n\t0x5ea: 0x4148, 0x5eb: 0x4166, 0x5ec: 0x4152, 0x5ed: 0x4170, 0x5ee: 0x415c, 0x5ef: 0x417a,\n\t0x5f0: 0x3685, 0x5f1: 0x367f, 0x5f2: 0x3d90, 0x5f3: 0x368b, 0x5f4: 0x3d98,\n\t0x5f6: 0x4810, 0x5f7: 0x3db0, 0x5f8: 0x35f5, 0x5f9: 0x35ef, 0x5fa: 0x35e3, 0x5fb: 0x42ee,\n\t0x5fc: 0x35fb, 0x5fd: 0x8100, 0x5fe: 0x01d3, 0x5ff: 0xa100,\n\t// Block 0x18, offset 0x600\n\t0x600: 0x8100, 0x601: 0x35a7, 0x602: 0x3dd8, 0x603: 0x369d, 0x604: 0x3de0,\n\t0x606: 0x483a, 0x607: 0x3df8, 0x608: 0x3601, 0x609: 0x42f4, 0x60a: 0x360d, 0x60b: 0x42fa,\n\t0x60c: 0x3619, 0x60d: 0x3b8f, 0x60e: 0x3b96, 0x60f: 0x3b9d, 0x610: 0x36b5, 0x611: 0x36af,\n\t0x612: 0x3e00, 0x613: 0x44e4, 0x616: 0x36bb, 0x617: 0x3e10,\n\t0x618: 0x3631, 0x619: 0x362b, 0x61a: 0x361f, 0x61b: 0x4300, 0x61d: 0x3ba4,\n\t0x61e: 0x3bab, 0x61f: 0x3bb2, 0x620: 0x36eb, 0x621: 0x36e5, 0x622: 0x3e68, 0x623: 0x44ec,\n\t0x624: 0x36cd, 0x625: 0x36d3, 0x626: 0x36f1, 0x627: 0x3e78, 0x628: 0x3661, 0x629: 0x365b,\n\t0x62a: 0x364f, 0x62b: 0x430c, 0x62c: 0x3649, 0x62d: 0x359b, 0x62e: 0x42e8, 0x62f: 0x0081,\n\t0x632: 0x3eb0, 0x633: 0x36f7, 0x634: 0x3eb8,\n\t0x636: 0x4888, 0x637: 0x3ed0, 0x638: 0x363d, 0x639: 0x4306, 0x63a: 0x366d, 0x63b: 0x4318,\n\t0x63c: 0x3679, 0x63d: 0x4256, 0x63e: 0xa100,\n\t// Block 0x19, offset 0x640\n\t0x641: 0x3c06, 0x643: 0xa000, 0x644: 0x3c0d, 0x645: 0xa000,\n\t0x647: 0x3c14, 0x648: 0xa000, 0x649: 0x3c1b,\n\t0x64d: 0xa000,\n\t0x660: 0x2f65, 0x661: 0xa000, 0x662: 0x3c29,\n\t0x664: 0xa000, 0x665: 0xa000,\n\t0x66d: 0x3c22, 0x66e: 0x2f60, 0x66f: 0x2f6a,\n\t0x670: 0x3c30, 0x671: 0x3c37, 0x672: 0xa000, 0x673: 0xa000, 0x674: 0x3c3e, 0x675: 0x3c45,\n\t0x676: 0xa000, 0x677: 0xa000, 0x678: 0x3c4c, 0x679: 0x3c53, 0x67a: 0xa000, 0x67b: 0xa000,\n\t0x67c: 0xa000, 0x67d: 0xa000,\n\t// Block 0x1a, offset 0x680\n\t0x680: 0x3c5a, 0x681: 0x3c61, 0x682: 0xa000, 0x683: 0xa000, 0x684: 0x3c76, 0x685: 0x3c7d,\n\t0x686: 0xa000, 0x687: 0xa000, 0x688: 0x3c84, 0x689: 0x3c8b,\n\t0x691: 0xa000,\n\t0x692: 0xa000,\n\t0x6a2: 0xa000,\n\t0x6a8: 0xa000, 0x6a9: 0xa000,\n\t0x6ab: 0xa000, 0x6ac: 0x3ca0, 0x6ad: 0x3ca7, 0x6ae: 0x3cae, 0x6af: 0x3cb5,\n\t0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0xa000, 0x6b5: 0xa000,\n\t// Block 0x1b, offset 0x6c0\n\t0x6c6: 0xa000, 0x6cb: 0xa000,\n\t0x6cc: 0x3f08, 0x6cd: 0xa000, 0x6ce: 0x3f10, 0x6cf: 0xa000, 0x6d0: 0x3f18, 0x6d1: 0xa000,\n\t0x6d2: 0x3f20, 0x6d3: 0xa000, 0x6d4: 0x3f28, 0x6d5: 0xa000, 0x6d6: 0x3f30, 0x6d7: 0xa000,\n\t0x6d8: 0x3f38, 0x6d9: 0xa000, 0x6da: 0x3f40, 0x6db: 0xa000, 0x6dc: 0x3f48, 0x6dd: 0xa000,\n\t0x6de: 0x3f50, 0x6df: 0xa000, 0x6e0: 0x3f58, 0x6e1: 0xa000, 0x6e2: 0x3f60,\n\t0x6e4: 0xa000, 0x6e5: 0x3f68, 0x6e6: 0xa000, 0x6e7: 0x3f70, 0x6e8: 0xa000, 0x6e9: 0x3f78,\n\t0x6ef: 0xa000,\n\t0x6f0: 0x3f80, 0x6f1: 0x3f88, 0x6f2: 0xa000, 0x6f3: 0x3f90, 0x6f4: 0x3f98, 0x6f5: 0xa000,\n\t0x6f6: 0x3fa0, 0x6f7: 0x3fa8, 0x6f8: 0xa000, 0x6f9: 0x3fb0, 0x6fa: 0x3fb8, 0x6fb: 0xa000,\n\t0x6fc: 0x3fc0, 0x6fd: 0x3fc8,\n\t// Block 0x1c, offset 0x700\n\t0x714: 0x3f00,\n\t0x719: 0x9903, 0x71a: 0x9903, 0x71b: 0x8100, 0x71c: 0x8100, 0x71d: 0xa000,\n\t0x71e: 0x3fd0,\n\t0x726: 0xa000,\n\t0x72b: 0xa000, 0x72c: 0x3fe0, 0x72d: 0xa000, 0x72e: 0x3fe8, 0x72f: 0xa000,\n\t0x730: 0x3ff0, 0x731: 0xa000, 0x732: 0x3ff8, 0x733: 0xa000, 0x734: 0x4000, 0x735: 0xa000,\n\t0x736: 0x4008, 0x737: 0xa000, 0x738: 0x4010, 0x739: 0xa000, 0x73a: 0x4018, 0x73b: 0xa000,\n\t0x73c: 0x4020, 0x73d: 0xa000, 0x73e: 0x4028, 0x73f: 0xa000,\n\t// Block 0x1d, offset 0x740\n\t0x740: 0x4030, 0x741: 0xa000, 0x742: 0x4038, 0x744: 0xa000, 0x745: 0x4040,\n\t0x746: 0xa000, 0x747: 0x4048, 0x748: 0xa000, 0x749: 0x4050,\n\t0x74f: 0xa000, 0x750: 0x4058, 0x751: 0x4060,\n\t0x752: 0xa000, 0x753: 0x4068, 0x754: 0x4070, 0x755: 0xa000, 0x756: 0x4078, 0x757: 0x4080,\n\t0x758: 0xa000, 0x759: 0x4088, 0x75a: 0x4090, 0x75b: 0xa000, 0x75c: 0x4098, 0x75d: 0x40a0,\n\t0x76f: 0xa000,\n\t0x770: 0xa000, 0x771: 0xa000, 0x772: 0xa000, 0x774: 0x3fd8,\n\t0x777: 0x40a8, 0x778: 0x40b0, 0x779: 0x40b8, 0x77a: 0x40c0,\n\t0x77d: 0xa000, 0x77e: 0x40c8,\n\t// Block 0x1e, offset 0x780\n\t0x780: 0x1377, 0x781: 0x0cfb, 0x782: 0x13d3, 0x783: 0x139f, 0x784: 0x0e57, 0x785: 0x06eb,\n\t0x786: 0x08df, 0x787: 0x162b, 0x788: 0x162b, 0x789: 0x0a0b, 0x78a: 0x145f, 0x78b: 0x0943,\n\t0x78c: 0x0a07, 0x78d: 0x0bef, 0x78e: 0x0fcf, 0x78f: 0x115f, 0x790: 0x1297, 0x791: 0x12d3,\n\t0x792: 0x1307, 0x793: 0x141b, 0x794: 0x0d73, 0x795: 0x0dff, 0x796: 0x0eab, 0x797: 0x0f43,\n\t0x798: 0x125f, 0x799: 0x1447, 0x79a: 0x1573, 0x79b: 0x070f, 0x79c: 0x08b3, 0x79d: 0x0d87,\n\t0x79e: 0x0ecf, 0x79f: 0x1293, 0x7a0: 0x15c3, 0x7a1: 0x0ab3, 0x7a2: 0x0e77, 0x7a3: 0x1283,\n\t0x7a4: 0x1317, 0x7a5: 0x0c23, 0x7a6: 0x11bb, 0x7a7: 0x12df, 0x7a8: 0x0b1f, 0x7a9: 0x0d0f,\n\t0x7aa: 0x0e17, 0x7ab: 0x0f1b, 0x7ac: 0x1427, 0x7ad: 0x074f, 0x7ae: 0x07e7, 0x7af: 0x0853,\n\t0x7b0: 0x0c8b, 0x7b1: 0x0d7f, 0x7b2: 0x0ecb, 0x7b3: 0x0fef, 0x7b4: 0x1177, 0x7b5: 0x128b,\n\t0x7b6: 0x12a3, 0x7b7: 0x13c7, 0x7b8: 0x14ef, 0x7b9: 0x15a3, 0x7ba: 0x15bf, 0x7bb: 0x102b,\n\t0x7bc: 0x106b, 0x7bd: 0x1123, 0x7be: 0x1243, 0x7bf: 0x147b,\n\t// Block 0x1f, offset 0x7c0\n\t0x7c0: 0x15cb, 0x7c1: 0x134b, 0x7c2: 0x09c7, 0x7c3: 0x0b3b, 0x7c4: 0x10db, 0x7c5: 0x119b,\n\t0x7c6: 0x0eff, 0x7c7: 0x1033, 0x7c8: 0x1397, 0x7c9: 0x14e7, 0x7ca: 0x09c3, 0x7cb: 0x0a8f,\n\t0x7cc: 0x0d77, 0x7cd: 0x0e2b, 0x7ce: 0x0e5f, 0x7cf: 0x1113, 0x7d0: 0x113b, 0x7d1: 0x14a7,\n\t0x7d2: 0x084f, 0x7d3: 0x11a7, 0x7d4: 0x07f3, 0x7d5: 0x07ef, 0x7d6: 0x1097, 0x7d7: 0x1127,\n\t0x7d8: 0x125b, 0x7d9: 0x14af, 0x7da: 0x1367, 0x7db: 0x0c27, 0x7dc: 0x0d73, 0x7dd: 0x1357,\n\t0x7de: 0x06f7, 0x7df: 0x0a63, 0x7e0: 0x0b93, 0x7e1: 0x0f2f, 0x7e2: 0x0faf, 0x7e3: 0x0873,\n\t0x7e4: 0x103b, 0x7e5: 0x075f, 0x7e6: 0x0b77, 0x7e7: 0x06d7, 0x7e8: 0x0deb, 0x7e9: 0x0ca3,\n\t0x7ea: 0x110f, 0x7eb: 0x08c7, 0x7ec: 0x09b3, 0x7ed: 0x0ffb, 0x7ee: 0x1263, 0x7ef: 0x133b,\n\t0x7f0: 0x0db7, 0x7f1: 0x13f7, 0x7f2: 0x0de3, 0x7f3: 0x0c37, 0x7f4: 0x121b, 0x7f5: 0x0c57,\n\t0x7f6: 0x0fab, 0x7f7: 0x072b, 0x7f8: 0x07a7, 0x7f9: 0x07eb, 0x7fa: 0x0d53, 0x7fb: 0x10fb,\n\t0x7fc: 0x11f3, 0x7fd: 0x1347, 0x7fe: 0x145b, 0x7ff: 0x085b,\n\t// Block 0x20, offset 0x800\n\t0x800: 0x090f, 0x801: 0x0a17, 0x802: 0x0b2f, 0x803: 0x0cbf, 0x804: 0x0e7b, 0x805: 0x103f,\n\t0x806: 0x1497, 0x807: 0x157b, 0x808: 0x15cf, 0x809: 0x15e7, 0x80a: 0x0837, 0x80b: 0x0cf3,\n\t0x80c: 0x0da3, 0x80d: 0x13eb, 0x80e: 0x0afb, 0x80f: 0x0bd7, 0x810: 0x0bf3, 0x811: 0x0c83,\n\t0x812: 0x0e6b, 0x813: 0x0eb7, 0x814: 0x0f67, 0x815: 0x108b, 0x816: 0x112f, 0x817: 0x1193,\n\t0x818: 0x13db, 0x819: 0x126b, 0x81a: 0x1403, 0x81b: 0x147f, 0x81c: 0x080f, 0x81d: 0x083b,\n\t0x81e: 0x0923, 0x81f: 0x0ea7, 0x820: 0x12f3, 0x821: 0x133b, 0x822: 0x0b1b, 0x823: 0x0b8b,\n\t0x824: 0x0c4f, 0x825: 0x0daf, 0x826: 0x10d7, 0x827: 0x0f23, 0x828: 0x073b, 0x829: 0x097f,\n\t0x82a: 0x0a63, 0x82b: 0x0ac7, 0x82c: 0x0b97, 0x82d: 0x0f3f, 0x82e: 0x0f5b, 0x82f: 0x116b,\n\t0x830: 0x118b, 0x831: 0x1463, 0x832: 0x14e3, 0x833: 0x14f3, 0x834: 0x152f, 0x835: 0x0753,\n\t0x836: 0x107f, 0x837: 0x144f, 0x838: 0x14cb, 0x839: 0x0baf, 0x83a: 0x0717, 0x83b: 0x0777,\n\t0x83c: 0x0a67, 0x83d: 0x0a87, 0x83e: 0x0caf, 0x83f: 0x0d73,\n\t// Block 0x21, offset 0x840\n\t0x840: 0x0ec3, 0x841: 0x0fcb, 0x842: 0x1277, 0x843: 0x1417, 0x844: 0x1623, 0x845: 0x0ce3,\n\t0x846: 0x14a3, 0x847: 0x0833, 0x848: 0x0d2f, 0x849: 0x0d3b, 0x84a: 0x0e0f, 0x84b: 0x0e47,\n\t0x84c: 0x0f4b, 0x84d: 0x0fa7, 0x84e: 0x1027, 0x84f: 0x110b, 0x850: 0x153b, 0x851: 0x07af,\n\t0x852: 0x0c03, 0x853: 0x14b3, 0x854: 0x0767, 0x855: 0x0aab, 0x856: 0x0e2f, 0x857: 0x13df,\n\t0x858: 0x0b67, 0x859: 0x0bb7, 0x85a: 0x0d43, 0x85b: 0x0f2f, 0x85c: 0x14bb, 0x85d: 0x0817,\n\t0x85e: 0x08ff, 0x85f: 0x0a97, 0x860: 0x0cd3, 0x861: 0x0d1f, 0x862: 0x0d5f, 0x863: 0x0df3,\n\t0x864: 0x0f47, 0x865: 0x0fbb, 0x866: 0x1157, 0x867: 0x12f7, 0x868: 0x1303, 0x869: 0x1457,\n\t0x86a: 0x14d7, 0x86b: 0x0883, 0x86c: 0x0e4b, 0x86d: 0x0903, 0x86e: 0x0ec7, 0x86f: 0x0f6b,\n\t0x870: 0x1287, 0x871: 0x14bf, 0x872: 0x15ab, 0x873: 0x15d3, 0x874: 0x0d37, 0x875: 0x0e27,\n\t0x876: 0x11c3, 0x877: 0x10b7, 0x878: 0x10c3, 0x879: 0x10e7, 0x87a: 0x0f17, 0x87b: 0x0e9f,\n\t0x87c: 0x1363, 0x87d: 0x0733, 0x87e: 0x122b, 0x87f: 0x081b,\n\t// Block 0x22, offset 0x880\n\t0x880: 0x080b, 0x881: 0x0b0b, 0x882: 0x0c2b, 0x883: 0x10f3, 0x884: 0x0a53, 0x885: 0x0e03,\n\t0x886: 0x0cef, 0x887: 0x13e7, 0x888: 0x12e7, 0x889: 0x14ab, 0x88a: 0x1323, 0x88b: 0x0b27,\n\t0x88c: 0x0787, 0x88d: 0x095b, 0x890: 0x09af,\n\t0x892: 0x0cdf, 0x895: 0x07f7, 0x896: 0x0f1f, 0x897: 0x0fe3,\n\t0x898: 0x1047, 0x899: 0x1063, 0x89a: 0x1067, 0x89b: 0x107b, 0x89c: 0x14fb, 0x89d: 0x10eb,\n\t0x89e: 0x116f, 0x8a0: 0x128f, 0x8a2: 0x1353,\n\t0x8a5: 0x1407, 0x8a6: 0x1433,\n\t0x8aa: 0x154f, 0x8ab: 0x1553, 0x8ac: 0x1557, 0x8ad: 0x15bb, 0x8ae: 0x142b, 0x8af: 0x14c7,\n\t0x8b0: 0x0757, 0x8b1: 0x077b, 0x8b2: 0x078f, 0x8b3: 0x084b, 0x8b4: 0x0857, 0x8b5: 0x0897,\n\t0x8b6: 0x094b, 0x8b7: 0x0967, 0x8b8: 0x096f, 0x8b9: 0x09ab, 0x8ba: 0x09b7, 0x8bb: 0x0a93,\n\t0x8bc: 0x0a9b, 0x8bd: 0x0ba3, 0x8be: 0x0bcb, 0x8bf: 0x0bd3,\n\t// Block 0x23, offset 0x8c0\n\t0x8c0: 0x0beb, 0x8c1: 0x0c97, 0x8c2: 0x0cc7, 0x8c3: 0x0ce7, 0x8c4: 0x0d57, 0x8c5: 0x0e1b,\n\t0x8c6: 0x0e37, 0x8c7: 0x0e67, 0x8c8: 0x0ebb, 0x8c9: 0x0edb, 0x8ca: 0x0f4f, 0x8cb: 0x102f,\n\t0x8cc: 0x104b, 0x8cd: 0x1053, 0x8ce: 0x104f, 0x8cf: 0x1057, 0x8d0: 0x105b, 0x8d1: 0x105f,\n\t0x8d2: 0x1073, 0x8d3: 0x1077, 0x8d4: 0x109b, 0x8d5: 0x10af, 0x8d6: 0x10cb, 0x8d7: 0x112f,\n\t0x8d8: 0x1137, 0x8d9: 0x113f, 0x8da: 0x1153, 0x8db: 0x117b, 0x8dc: 0x11cb, 0x8dd: 0x11ff,\n\t0x8de: 0x11ff, 0x8df: 0x1267, 0x8e0: 0x130f, 0x8e1: 0x1327, 0x8e2: 0x135b, 0x8e3: 0x135f,\n\t0x8e4: 0x13a3, 0x8e5: 0x13a7, 0x8e6: 0x13ff, 0x8e7: 0x1407, 0x8e8: 0x14db, 0x8e9: 0x151f,\n\t0x8ea: 0x1537, 0x8eb: 0x0b9b, 0x8ec: 0x171e, 0x8ed: 0x11e3,\n\t0x8f0: 0x06df, 0x8f1: 0x07e3, 0x8f2: 0x07a3, 0x8f3: 0x074b, 0x8f4: 0x078b, 0x8f5: 0x07b7,\n\t0x8f6: 0x0847, 0x8f7: 0x0863, 0x8f8: 0x094b, 0x8f9: 0x0937, 0x8fa: 0x0947, 0x8fb: 0x0963,\n\t0x8fc: 0x09af, 0x8fd: 0x09bf, 0x8fe: 0x0a03, 0x8ff: 0x0a0f,\n\t// Block 0x24, offset 0x900\n\t0x900: 0x0a2b, 0x901: 0x0a3b, 0x902: 0x0b23, 0x903: 0x0b2b, 0x904: 0x0b5b, 0x905: 0x0b7b,\n\t0x906: 0x0bab, 0x907: 0x0bc3, 0x908: 0x0bb3, 0x909: 0x0bd3, 0x90a: 0x0bc7, 0x90b: 0x0beb,\n\t0x90c: 0x0c07, 0x90d: 0x0c5f, 0x90e: 0x0c6b, 0x90f: 0x0c73, 0x910: 0x0c9b, 0x911: 0x0cdf,\n\t0x912: 0x0d0f, 0x913: 0x0d13, 0x914: 0x0d27, 0x915: 0x0da7, 0x916: 0x0db7, 0x917: 0x0e0f,\n\t0x918: 0x0e5b, 0x919: 0x0e53, 0x91a: 0x0e67, 0x91b: 0x0e83, 0x91c: 0x0ebb, 0x91d: 0x1013,\n\t0x91e: 0x0edf, 0x91f: 0x0f13, 0x920: 0x0f1f, 0x921: 0x0f5f, 0x922: 0x0f7b, 0x923: 0x0f9f,\n\t0x924: 0x0fc3, 0x925: 0x0fc7, 0x926: 0x0fe3, 0x927: 0x0fe7, 0x928: 0x0ff7, 0x929: 0x100b,\n\t0x92a: 0x1007, 0x92b: 0x1037, 0x92c: 0x10b3, 0x92d: 0x10cb, 0x92e: 0x10e3, 0x92f: 0x111b,\n\t0x930: 0x112f, 0x931: 0x114b, 0x932: 0x117b, 0x933: 0x122f, 0x934: 0x1257, 0x935: 0x12cb,\n\t0x936: 0x1313, 0x937: 0x131f, 0x938: 0x1327, 0x939: 0x133f, 0x93a: 0x1353, 0x93b: 0x1343,\n\t0x93c: 0x135b, 0x93d: 0x1357, 0x93e: 0x134f, 0x93f: 0x135f,\n\t// Block 0x25, offset 0x940\n\t0x940: 0x136b, 0x941: 0x13a7, 0x942: 0x13e3, 0x943: 0x1413, 0x944: 0x144b, 0x945: 0x146b,\n\t0x946: 0x14b7, 0x947: 0x14db, 0x948: 0x14fb, 0x949: 0x150f, 0x94a: 0x151f, 0x94b: 0x152b,\n\t0x94c: 0x1537, 0x94d: 0x158b, 0x94e: 0x162b, 0x94f: 0x16b5, 0x950: 0x16b0, 0x951: 0x16e2,\n\t0x952: 0x0607, 0x953: 0x062f, 0x954: 0x0633, 0x955: 0x1764, 0x956: 0x1791, 0x957: 0x1809,\n\t0x958: 0x1617, 0x959: 0x1627,\n\t// Block 0x26, offset 0x980\n\t0x980: 0x06fb, 0x981: 0x06f3, 0x982: 0x0703, 0x983: 0x1647, 0x984: 0x0747, 0x985: 0x0757,\n\t0x986: 0x075b, 0x987: 0x0763, 0x988: 0x076b, 0x989: 0x076f, 0x98a: 0x077b, 0x98b: 0x0773,\n\t0x98c: 0x05b3, 0x98d: 0x165b, 0x98e: 0x078f, 0x98f: 0x0793, 0x990: 0x0797, 0x991: 0x07b3,\n\t0x992: 0x164c, 0x993: 0x05b7, 0x994: 0x079f, 0x995: 0x07bf, 0x996: 0x1656, 0x997: 0x07cf,\n\t0x998: 0x07d7, 0x999: 0x0737, 0x99a: 0x07df, 0x99b: 0x07e3, 0x99c: 0x1831, 0x99d: 0x07ff,\n\t0x99e: 0x0807, 0x99f: 0x05bf, 0x9a0: 0x081f, 0x9a1: 0x0823, 0x9a2: 0x082b, 0x9a3: 0x082f,\n\t0x9a4: 0x05c3, 0x9a5: 0x0847, 0x9a6: 0x084b, 0x9a7: 0x0857, 0x9a8: 0x0863, 0x9a9: 0x0867,\n\t0x9aa: 0x086b, 0x9ab: 0x0873, 0x9ac: 0x0893, 0x9ad: 0x0897, 0x9ae: 0x089f, 0x9af: 0x08af,\n\t0x9b0: 0x08b7, 0x9b1: 0x08bb, 0x9b2: 0x08bb, 0x9b3: 0x08bb, 0x9b4: 0x166a, 0x9b5: 0x0e93,\n\t0x9b6: 0x08cf, 0x9b7: 0x08d7, 0x9b8: 0x166f, 0x9b9: 0x08e3, 0x9ba: 0x08eb, 0x9bb: 0x08f3,\n\t0x9bc: 0x091b, 0x9bd: 0x0907, 0x9be: 0x0913, 0x9bf: 0x0917,\n\t// Block 0x27, offset 0x9c0\n\t0x9c0: 0x091f, 0x9c1: 0x0927, 0x9c2: 0x092b, 0x9c3: 0x0933, 0x9c4: 0x093b, 0x9c5: 0x093f,\n\t0x9c6: 0x093f, 0x9c7: 0x0947, 0x9c8: 0x094f, 0x9c9: 0x0953, 0x9ca: 0x095f, 0x9cb: 0x0983,\n\t0x9cc: 0x0967, 0x9cd: 0x0987, 0x9ce: 0x096b, 0x9cf: 0x0973, 0x9d0: 0x080b, 0x9d1: 0x09cf,\n\t0x9d2: 0x0997, 0x9d3: 0x099b, 0x9d4: 0x099f, 0x9d5: 0x0993, 0x9d6: 0x09a7, 0x9d7: 0x09a3,\n\t0x9d8: 0x09bb, 0x9d9: 0x1674, 0x9da: 0x09d7, 0x9db: 0x09db, 0x9dc: 0x09e3, 0x9dd: 0x09ef,\n\t0x9de: 0x09f7, 0x9df: 0x0a13, 0x9e0: 0x1679, 0x9e1: 0x167e, 0x9e2: 0x0a1f, 0x9e3: 0x0a23,\n\t0x9e4: 0x0a27, 0x9e5: 0x0a1b, 0x9e6: 0x0a2f, 0x9e7: 0x05c7, 0x9e8: 0x05cb, 0x9e9: 0x0a37,\n\t0x9ea: 0x0a3f, 0x9eb: 0x0a3f, 0x9ec: 0x1683, 0x9ed: 0x0a5b, 0x9ee: 0x0a5f, 0x9ef: 0x0a63,\n\t0x9f0: 0x0a6b, 0x9f1: 0x1688, 0x9f2: 0x0a73, 0x9f3: 0x0a77, 0x9f4: 0x0b4f, 0x9f5: 0x0a7f,\n\t0x9f6: 0x05cf, 0x9f7: 0x0a8b, 0x9f8: 0x0a9b, 0x9f9: 0x0aa7, 0x9fa: 0x0aa3, 0x9fb: 0x1692,\n\t0x9fc: 0x0aaf, 0x9fd: 0x1697, 0x9fe: 0x0abb, 0x9ff: 0x0ab7,\n\t// Block 0x28, offset 0xa00\n\t0xa00: 0x0abf, 0xa01: 0x0acf, 0xa02: 0x0ad3, 0xa03: 0x05d3, 0xa04: 0x0ae3, 0xa05: 0x0aeb,\n\t0xa06: 0x0aef, 0xa07: 0x0af3, 0xa08: 0x05d7, 0xa09: 0x169c, 0xa0a: 0x05db, 0xa0b: 0x0b0f,\n\t0xa0c: 0x0b13, 0xa0d: 0x0b17, 0xa0e: 0x0b1f, 0xa0f: 0x1863, 0xa10: 0x0b37, 0xa11: 0x16a6,\n\t0xa12: 0x16a6, 0xa13: 0x11d7, 0xa14: 0x0b47, 0xa15: 0x0b47, 0xa16: 0x05df, 0xa17: 0x16c9,\n\t0xa18: 0x179b, 0xa19: 0x0b57, 0xa1a: 0x0b5f, 0xa1b: 0x05e3, 0xa1c: 0x0b73, 0xa1d: 0x0b83,\n\t0xa1e: 0x0b87, 0xa1f: 0x0b8f, 0xa20: 0x0b9f, 0xa21: 0x05eb, 0xa22: 0x05e7, 0xa23: 0x0ba3,\n\t0xa24: 0x16ab, 0xa25: 0x0ba7, 0xa26: 0x0bbb, 0xa27: 0x0bbf, 0xa28: 0x0bc3, 0xa29: 0x0bbf,\n\t0xa2a: 0x0bcf, 0xa2b: 0x0bd3, 0xa2c: 0x0be3, 0xa2d: 0x0bdb, 0xa2e: 0x0bdf, 0xa2f: 0x0be7,\n\t0xa30: 0x0beb, 0xa31: 0x0bef, 0xa32: 0x0bfb, 0xa33: 0x0bff, 0xa34: 0x0c17, 0xa35: 0x0c1f,\n\t0xa36: 0x0c2f, 0xa37: 0x0c43, 0xa38: 0x16ba, 0xa39: 0x0c3f, 0xa3a: 0x0c33, 0xa3b: 0x0c4b,\n\t0xa3c: 0x0c53, 0xa3d: 0x0c67, 0xa3e: 0x16bf, 0xa3f: 0x0c6f,\n\t// Block 0x29, offset 0xa40\n\t0xa40: 0x0c63, 0xa41: 0x0c5b, 0xa42: 0x05ef, 0xa43: 0x0c77, 0xa44: 0x0c7f, 0xa45: 0x0c87,\n\t0xa46: 0x0c7b, 0xa47: 0x05f3, 0xa48: 0x0c97, 0xa49: 0x0c9f, 0xa4a: 0x16c4, 0xa4b: 0x0ccb,\n\t0xa4c: 0x0cff, 0xa4d: 0x0cdb, 0xa4e: 0x05ff, 0xa4f: 0x0ce7, 0xa50: 0x05fb, 0xa51: 0x05f7,\n\t0xa52: 0x07c3, 0xa53: 0x07c7, 0xa54: 0x0d03, 0xa55: 0x0ceb, 0xa56: 0x11ab, 0xa57: 0x0663,\n\t0xa58: 0x0d0f, 0xa59: 0x0d13, 0xa5a: 0x0d17, 0xa5b: 0x0d2b, 0xa5c: 0x0d23, 0xa5d: 0x16dd,\n\t0xa5e: 0x0603, 0xa5f: 0x0d3f, 0xa60: 0x0d33, 0xa61: 0x0d4f, 0xa62: 0x0d57, 0xa63: 0x16e7,\n\t0xa64: 0x0d5b, 0xa65: 0x0d47, 0xa66: 0x0d63, 0xa67: 0x0607, 0xa68: 0x0d67, 0xa69: 0x0d6b,\n\t0xa6a: 0x0d6f, 0xa6b: 0x0d7b, 0xa6c: 0x16ec, 0xa6d: 0x0d83, 0xa6e: 0x060b, 0xa6f: 0x0d8f,\n\t0xa70: 0x16f1, 0xa71: 0x0d93, 0xa72: 0x060f, 0xa73: 0x0d9f, 0xa74: 0x0dab, 0xa75: 0x0db7,\n\t0xa76: 0x0dbb, 0xa77: 0x16f6, 0xa78: 0x168d, 0xa79: 0x16fb, 0xa7a: 0x0ddb, 0xa7b: 0x1700,\n\t0xa7c: 0x0de7, 0xa7d: 0x0def, 0xa7e: 0x0ddf, 0xa7f: 0x0dfb,\n\t// Block 0x2a, offset 0xa80\n\t0xa80: 0x0e0b, 0xa81: 0x0e1b, 0xa82: 0x0e0f, 0xa83: 0x0e13, 0xa84: 0x0e1f, 0xa85: 0x0e23,\n\t0xa86: 0x1705, 0xa87: 0x0e07, 0xa88: 0x0e3b, 0xa89: 0x0e3f, 0xa8a: 0x0613, 0xa8b: 0x0e53,\n\t0xa8c: 0x0e4f, 0xa8d: 0x170a, 0xa8e: 0x0e33, 0xa8f: 0x0e6f, 0xa90: 0x170f, 0xa91: 0x1714,\n\t0xa92: 0x0e73, 0xa93: 0x0e87, 0xa94: 0x0e83, 0xa95: 0x0e7f, 0xa96: 0x0617, 0xa97: 0x0e8b,\n\t0xa98: 0x0e9b, 0xa99: 0x0e97, 0xa9a: 0x0ea3, 0xa9b: 0x1651, 0xa9c: 0x0eb3, 0xa9d: 0x1719,\n\t0xa9e: 0x0ebf, 0xa9f: 0x1723, 0xaa0: 0x0ed3, 0xaa1: 0x0edf, 0xaa2: 0x0ef3, 0xaa3: 0x1728,\n\t0xaa4: 0x0f07, 0xaa5: 0x0f0b, 0xaa6: 0x172d, 0xaa7: 0x1732, 0xaa8: 0x0f27, 0xaa9: 0x0f37,\n\t0xaaa: 0x061b, 0xaab: 0x0f3b, 0xaac: 0x061f, 0xaad: 0x061f, 0xaae: 0x0f53, 0xaaf: 0x0f57,\n\t0xab0: 0x0f5f, 0xab1: 0x0f63, 0xab2: 0x0f6f, 0xab3: 0x0623, 0xab4: 0x0f87, 0xab5: 0x1737,\n\t0xab6: 0x0fa3, 0xab7: 0x173c, 0xab8: 0x0faf, 0xab9: 0x16a1, 0xaba: 0x0fbf, 0xabb: 0x1741,\n\t0xabc: 0x1746, 0xabd: 0x174b, 0xabe: 0x0627, 0xabf: 0x062b,\n\t// Block 0x2b, offset 0xac0\n\t0xac0: 0x0ff7, 0xac1: 0x1755, 0xac2: 0x1750, 0xac3: 0x175a, 0xac4: 0x175f, 0xac5: 0x0fff,\n\t0xac6: 0x1003, 0xac7: 0x1003, 0xac8: 0x100b, 0xac9: 0x0633, 0xaca: 0x100f, 0xacb: 0x0637,\n\t0xacc: 0x063b, 0xacd: 0x1769, 0xace: 0x1023, 0xacf: 0x102b, 0xad0: 0x1037, 0xad1: 0x063f,\n\t0xad2: 0x176e, 0xad3: 0x105b, 0xad4: 0x1773, 0xad5: 0x1778, 0xad6: 0x107b, 0xad7: 0x1093,\n\t0xad8: 0x0643, 0xad9: 0x109b, 0xada: 0x109f, 0xadb: 0x10a3, 0xadc: 0x177d, 0xadd: 0x1782,\n\t0xade: 0x1782, 0xadf: 0x10bb, 0xae0: 0x0647, 0xae1: 0x1787, 0xae2: 0x10cf, 0xae3: 0x10d3,\n\t0xae4: 0x064b, 0xae5: 0x178c, 0xae6: 0x10ef, 0xae7: 0x064f, 0xae8: 0x10ff, 0xae9: 0x10f7,\n\t0xaea: 0x1107, 0xaeb: 0x1796, 0xaec: 0x111f, 0xaed: 0x0653, 0xaee: 0x112b, 0xaef: 0x1133,\n\t0xaf0: 0x1143, 0xaf1: 0x0657, 0xaf2: 0x17a0, 0xaf3: 0x17a5, 0xaf4: 0x065b, 0xaf5: 0x17aa,\n\t0xaf6: 0x115b, 0xaf7: 0x17af, 0xaf8: 0x1167, 0xaf9: 0x1173, 0xafa: 0x117b, 0xafb: 0x17b4,\n\t0xafc: 0x17b9, 0xafd: 0x118f, 0xafe: 0x17be, 0xaff: 0x1197,\n\t// Block 0x2c, offset 0xb00\n\t0xb00: 0x16ce, 0xb01: 0x065f, 0xb02: 0x11af, 0xb03: 0x11b3, 0xb04: 0x0667, 0xb05: 0x11b7,\n\t0xb06: 0x0a33, 0xb07: 0x17c3, 0xb08: 0x17c8, 0xb09: 0x16d3, 0xb0a: 0x16d8, 0xb0b: 0x11d7,\n\t0xb0c: 0x11db, 0xb0d: 0x13f3, 0xb0e: 0x066b, 0xb0f: 0x1207, 0xb10: 0x1203, 0xb11: 0x120b,\n\t0xb12: 0x083f, 0xb13: 0x120f, 0xb14: 0x1213, 0xb15: 0x1217, 0xb16: 0x121f, 0xb17: 0x17cd,\n\t0xb18: 0x121b, 0xb19: 0x1223, 0xb1a: 0x1237, 0xb1b: 0x123b, 0xb1c: 0x1227, 0xb1d: 0x123f,\n\t0xb1e: 0x1253, 0xb1f: 0x1267, 0xb20: 0x1233, 0xb21: 0x1247, 0xb22: 0x124b, 0xb23: 0x124f,\n\t0xb24: 0x17d2, 0xb25: 0x17dc, 0xb26: 0x17d7, 0xb27: 0x066f, 0xb28: 0x126f, 0xb29: 0x1273,\n\t0xb2a: 0x127b, 0xb2b: 0x17f0, 0xb2c: 0x127f, 0xb2d: 0x17e1, 0xb2e: 0x0673, 0xb2f: 0x0677,\n\t0xb30: 0x17e6, 0xb31: 0x17eb, 0xb32: 0x067b, 0xb33: 0x129f, 0xb34: 0x12a3, 0xb35: 0x12a7,\n\t0xb36: 0x12ab, 0xb37: 0x12b7, 0xb38: 0x12b3, 0xb39: 0x12bf, 0xb3a: 0x12bb, 0xb3b: 0x12cb,\n\t0xb3c: 0x12c3, 0xb3d: 0x12c7, 0xb3e: 0x12cf, 0xb3f: 0x067f,\n\t// Block 0x2d, offset 0xb40\n\t0xb40: 0x12d7, 0xb41: 0x12db, 0xb42: 0x0683, 0xb43: 0x12eb, 0xb44: 0x12ef, 0xb45: 0x17f5,\n\t0xb46: 0x12fb, 0xb47: 0x12ff, 0xb48: 0x0687, 0xb49: 0x130b, 0xb4a: 0x05bb, 0xb4b: 0x17fa,\n\t0xb4c: 0x17ff, 0xb4d: 0x068b, 0xb4e: 0x068f, 0xb4f: 0x1337, 0xb50: 0x134f, 0xb51: 0x136b,\n\t0xb52: 0x137b, 0xb53: 0x1804, 0xb54: 0x138f, 0xb55: 0x1393, 0xb56: 0x13ab, 0xb57: 0x13b7,\n\t0xb58: 0x180e, 0xb59: 0x1660, 0xb5a: 0x13c3, 0xb5b: 0x13bf, 0xb5c: 0x13cb, 0xb5d: 0x1665,\n\t0xb5e: 0x13d7, 0xb5f: 0x13e3, 0xb60: 0x1813, 0xb61: 0x1818, 0xb62: 0x1423, 0xb63: 0x142f,\n\t0xb64: 0x1437, 0xb65: 0x181d, 0xb66: 0x143b, 0xb67: 0x1467, 0xb68: 0x1473, 0xb69: 0x1477,\n\t0xb6a: 0x146f, 0xb6b: 0x1483, 0xb6c: 0x1487, 0xb6d: 0x1822, 0xb6e: 0x1493, 0xb6f: 0x0693,\n\t0xb70: 0x149b, 0xb71: 0x1827, 0xb72: 0x0697, 0xb73: 0x14d3, 0xb74: 0x0ac3, 0xb75: 0x14eb,\n\t0xb76: 0x182c, 0xb77: 0x1836, 0xb78: 0x069b, 0xb79: 0x069f, 0xb7a: 0x1513, 0xb7b: 0x183b,\n\t0xb7c: 0x06a3, 0xb7d: 0x1840, 0xb7e: 0x152b, 0xb7f: 0x152b,\n\t// Block 0x2e, offset 0xb80\n\t0xb80: 0x1533, 0xb81: 0x1845, 0xb82: 0x154b, 0xb83: 0x06a7, 0xb84: 0x155b, 0xb85: 0x1567,\n\t0xb86: 0x156f, 0xb87: 0x1577, 0xb88: 0x06ab, 0xb89: 0x184a, 0xb8a: 0x158b, 0xb8b: 0x15a7,\n\t0xb8c: 0x15b3, 0xb8d: 0x06af, 0xb8e: 0x06b3, 0xb8f: 0x15b7, 0xb90: 0x184f, 0xb91: 0x06b7,\n\t0xb92: 0x1854, 0xb93: 0x1859, 0xb94: 0x185e, 0xb95: 0x15db, 0xb96: 0x06bb, 0xb97: 0x15ef,\n\t0xb98: 0x15f7, 0xb99: 0x15fb, 0xb9a: 0x1603, 0xb9b: 0x160b, 0xb9c: 0x1613, 0xb9d: 0x1868,\n}\n\n// nfcIndex: 22 blocks, 1408 entries, 1408 bytes\n// Block 0 is the zero block.\nvar nfcIndex = [1408]uint8{\n\t// Block 0x0, offset 0x0\n\t// Block 0x1, offset 0x40\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc2: 0x2d, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2e, 0xc7: 0x04,\n\t0xc8: 0x05, 0xca: 0x2f, 0xcb: 0x30, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x31,\n\t0xd0: 0x09, 0xd1: 0x32, 0xd2: 0x33, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x34,\n\t0xd8: 0x35, 0xd9: 0x0c, 0xdb: 0x36, 0xdc: 0x37, 0xdd: 0x38, 0xdf: 0x39,\n\t0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,\n\t0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,\n\t0xf0: 0x13,\n\t// Block 0x4, offset 0x100\n\t0x120: 0x3a, 0x121: 0x3b, 0x123: 0x3c, 0x124: 0x3d, 0x125: 0x3e, 0x126: 0x3f, 0x127: 0x40,\n\t0x128: 0x41, 0x129: 0x42, 0x12a: 0x43, 0x12b: 0x44, 0x12c: 0x3f, 0x12d: 0x45, 0x12e: 0x46, 0x12f: 0x47,\n\t0x131: 0x48, 0x132: 0x49, 0x133: 0x4a, 0x134: 0x4b, 0x135: 0x4c, 0x137: 0x4d,\n\t0x138: 0x4e, 0x139: 0x4f, 0x13a: 0x50, 0x13b: 0x51, 0x13c: 0x52, 0x13d: 0x53, 0x13e: 0x54, 0x13f: 0x55,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x56, 0x142: 0x57, 0x144: 0x58, 0x145: 0x59, 0x146: 0x5a, 0x147: 0x5b,\n\t0x14d: 0x5c,\n\t0x15c: 0x5d, 0x15f: 0x5e,\n\t0x162: 0x5f, 0x164: 0x60,\n\t0x168: 0x61, 0x169: 0x62, 0x16a: 0x63, 0x16c: 0x0d, 0x16d: 0x64, 0x16e: 0x65, 0x16f: 0x66,\n\t0x170: 0x67, 0x173: 0x68, 0x177: 0x0e,\n\t0x178: 0x0f, 0x179: 0x10, 0x17a: 0x11, 0x17b: 0x12, 0x17c: 0x13, 0x17d: 0x14, 0x17e: 0x15, 0x17f: 0x16,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d,\n\t0x188: 0x6e, 0x189: 0x17, 0x18a: 0x18, 0x18b: 0x6f, 0x18c: 0x70,\n\t0x1ab: 0x71,\n\t0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x75, 0x1c1: 0x19, 0x1c2: 0x1a, 0x1c3: 0x1b, 0x1c4: 0x76, 0x1c5: 0x77,\n\t0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a,\n\t// Block 0x8, offset 0x200\n\t0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d,\n\t0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83,\n\t0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86,\n\t0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87,\n\t0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89,\n\t0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a,\n\t0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b,\n\t0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c,\n\t0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d,\n\t0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87,\n\t0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88,\n\t0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89,\n\t// Block 0xa, offset 0x280\n\t0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a,\n\t0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b,\n\t0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c,\n\t0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d,\n\t0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87,\n\t0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88,\n\t0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89,\n\t0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b,\n\t0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c,\n\t0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d,\n\t0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e,\n\t// Block 0xc, offset 0x300\n\t0x324: 0x1c, 0x325: 0x1d, 0x326: 0x1e, 0x327: 0x1f,\n\t0x328: 0x20, 0x329: 0x21, 0x32a: 0x22, 0x32b: 0x23, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91,\n\t0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95,\n\t0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b,\n\t// Block 0xd, offset 0x340\n\t0x347: 0x9c,\n\t0x34b: 0x9d, 0x34d: 0x9e,\n\t0x368: 0x9f, 0x36b: 0xa0,\n\t// Block 0xe, offset 0x380\n\t0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4,\n\t0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3f, 0x38d: 0xa7,\n\t0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac,\n\t0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae,\n\t0x3a8: 0xaf, 0x3a9: 0xb0, 0x3aa: 0xb1,\n\t0x3b0: 0x73, 0x3b5: 0xb2,\n\t// Block 0xf, offset 0x3c0\n\t0x3eb: 0xb3, 0x3ec: 0xb4,\n\t// Block 0x10, offset 0x400\n\t0x432: 0xb5,\n\t// Block 0x11, offset 0x440\n\t0x445: 0xb6, 0x446: 0xb7, 0x447: 0xb8,\n\t0x449: 0xb9,\n\t// Block 0x12, offset 0x480\n\t0x480: 0xba,\n\t0x4a3: 0xbb, 0x4a5: 0xbc,\n\t// Block 0x13, offset 0x4c0\n\t0x4c8: 0xbd,\n\t// Block 0x14, offset 0x500\n\t0x520: 0x24, 0x521: 0x25, 0x522: 0x26, 0x523: 0x27, 0x524: 0x28, 0x525: 0x29, 0x526: 0x2a, 0x527: 0x2b,\n\t0x528: 0x2c,\n\t// Block 0x15, offset 0x540\n\t0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,\n\t0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,\n\t0x56f: 0x12,\n}\n\n// nfcSparseOffset: 145 entries, 290 bytes\nvar nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc8, 0xcf, 0xd7, 0xda, 0xdc, 0xde, 0xe0, 0xe5, 0xf6, 0x102, 0x104, 0x10a, 0x10c, 0x10e, 0x110, 0x112, 0x114, 0x116, 0x119, 0x11c, 0x11e, 0x121, 0x124, 0x128, 0x12d, 0x136, 0x138, 0x13b, 0x13d, 0x148, 0x14c, 0x15a, 0x15d, 0x163, 0x169, 0x174, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x182, 0x188, 0x18c, 0x18e, 0x190, 0x198, 0x19c, 0x19f, 0x1a1, 0x1a3, 0x1a5, 0x1a8, 0x1aa, 0x1ac, 0x1ae, 0x1b0, 0x1b6, 0x1b9, 0x1bb, 0x1c2, 0x1c8, 0x1ce, 0x1d6, 0x1dc, 0x1e2, 0x1e8, 0x1ec, 0x1fa, 0x203, 0x206, 0x209, 0x20b, 0x20e, 0x210, 0x214, 0x219, 0x21b, 0x21d, 0x222, 0x228, 0x22a, 0x22c, 0x22e, 0x234, 0x237, 0x23a, 0x242, 0x249, 0x24c, 0x24f, 0x251, 0x259, 0x25c, 0x263, 0x266, 0x26c, 0x26e, 0x271, 0x273, 0x275, 0x277, 0x279, 0x27c, 0x27e, 0x280, 0x282, 0x28f, 0x299, 0x29b, 0x29d, 0x2a3, 0x2a5, 0x2a8}\n\n// nfcSparseValues: 682 entries, 2728 bytes\nvar nfcSparseValues = [682]valueRange{\n\t// Block 0x0, offset 0x0\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0xa100, lo: 0xa8, hi: 0xa8},\n\t{value: 0x8100, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8100, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8100, lo: 0xb8, hi: 0xb8},\n\t// Block 0x1, offset 0x5\n\t{value: 0x0091, lo: 0x03},\n\t{value: 0x46e2, lo: 0xa0, hi: 0xa1},\n\t{value: 0x4714, lo: 0xaf, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb7, hi: 0xb7},\n\t// Block 0x2, offset 0x9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t// Block 0x3, offset 0xb\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x98, hi: 0x9d},\n\t// Block 0x4, offset 0xd\n\t{value: 0x0006, lo: 0x0a},\n\t{value: 0xa000, lo: 0x81, hi: 0x81},\n\t{value: 0xa000, lo: 0x85, hi: 0x85},\n\t{value: 0xa000, lo: 0x89, hi: 0x89},\n\t{value: 0x4840, lo: 0x8a, hi: 0x8a},\n\t{value: 0x485e, lo: 0x8b, hi: 0x8b},\n\t{value: 0x36c7, lo: 0x8c, hi: 0x8c},\n\t{value: 0x36df, lo: 0x8d, hi: 0x8d},\n\t{value: 0x4876, lo: 0x8e, hi: 0x8e},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x36fd, lo: 0x93, hi: 0x94},\n\t// Block 0x5, offset 0x18\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0xa000, lo: 0x8d, hi: 0x8d},\n\t{value: 0x37a5, lo: 0x90, hi: 0x90},\n\t{value: 0x37b1, lo: 0x91, hi: 0x91},\n\t{value: 0x379f, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x96, hi: 0x96},\n\t{value: 0x3817, lo: 0x97, hi: 0x97},\n\t{value: 0x37e1, lo: 0x9c, hi: 0x9c},\n\t{value: 0x37c9, lo: 0x9d, hi: 0x9d},\n\t{value: 0x37f3, lo: 0x9e, hi: 0x9e},\n\t{value: 0xa000, lo: 0xb4, hi: 0xb5},\n\t{value: 0x381d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x3823, lo: 0xb7, hi: 0xb7},\n\t// Block 0x6, offset 0x28\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x83, hi: 0x87},\n\t// Block 0x7, offset 0x2a\n\t{value: 0x0001, lo: 0x04},\n\t{value: 0x8113, lo: 0x81, hi: 0x82},\n\t{value: 0x8132, lo: 0x84, hi: 0x84},\n\t{value: 0x812d, lo: 0x85, hi: 0x85},\n\t{value: 0x810d, lo: 0x87, hi: 0x87},\n\t// Block 0x8, offset 0x2f\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x97},\n\t{value: 0x8119, lo: 0x98, hi: 0x98},\n\t{value: 0x811a, lo: 0x99, hi: 0x99},\n\t{value: 0x811b, lo: 0x9a, hi: 0x9a},\n\t{value: 0x3841, lo: 0xa2, hi: 0xa2},\n\t{value: 0x3847, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3853, lo: 0xa4, hi: 0xa4},\n\t{value: 0x384d, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3859, lo: 0xa6, hi: 0xa6},\n\t{value: 0xa000, lo: 0xa7, hi: 0xa7},\n\t// Block 0x9, offset 0x3a\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x386b, lo: 0x80, hi: 0x80},\n\t{value: 0xa000, lo: 0x81, hi: 0x81},\n\t{value: 0x385f, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x3865, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x95, hi: 0x95},\n\t{value: 0x8132, lo: 0x96, hi: 0x9c},\n\t{value: 0x8132, lo: 0x9f, hi: 0xa2},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8132, lo: 0xab, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t// Block 0xa, offset 0x49\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x811f, lo: 0x91, hi: 0x91},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x812d, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb5, hi: 0xb6},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb9},\n\t{value: 0x8132, lo: 0xba, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbc},\n\t{value: 0x8132, lo: 0xbd, hi: 0xbd},\n\t{value: 0x812d, lo: 0xbe, hi: 0xbe},\n\t{value: 0x8132, lo: 0xbf, hi: 0xbf},\n\t// Block 0xb, offset 0x56\n\t{value: 0x0005, lo: 0x07},\n\t{value: 0x8132, lo: 0x80, hi: 0x80},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x812d, lo: 0x82, hi: 0x83},\n\t{value: 0x812d, lo: 0x84, hi: 0x85},\n\t{value: 0x812d, lo: 0x86, hi: 0x87},\n\t{value: 0x812d, lo: 0x88, hi: 0x89},\n\t{value: 0x8132, lo: 0x8a, hi: 0x8a},\n\t// Block 0xc, offset 0x5e\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8132, lo: 0xab, hi: 0xb1},\n\t{value: 0x812d, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb3},\n\t// Block 0xd, offset 0x62\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0x96, hi: 0x99},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa7},\n\t{value: 0x8132, lo: 0xa9, hi: 0xad},\n\t// Block 0xe, offset 0x67\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x99, hi: 0x9b},\n\t// Block 0xf, offset 0x69\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x8132, lo: 0x94, hi: 0xa1},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8132, lo: 0xaa, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xaf},\n\t{value: 0x8116, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8117, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8118, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x812d, lo: 0xb9, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbf},\n\t// Block 0x10, offset 0x7a\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0xa8, hi: 0xa8},\n\t{value: 0x3ed8, lo: 0xa9, hi: 0xa9},\n\t{value: 0xa000, lo: 0xb0, hi: 0xb0},\n\t{value: 0x3ee0, lo: 0xb1, hi: 0xb1},\n\t{value: 0xa000, lo: 0xb3, hi: 0xb3},\n\t{value: 0x3ee8, lo: 0xb4, hi: 0xb4},\n\t{value: 0x9902, lo: 0xbc, hi: 0xbc},\n\t// Block 0x11, offset 0x82\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x91, hi: 0x91},\n\t{value: 0x812d, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x93, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x94},\n\t{value: 0x451c, lo: 0x98, hi: 0x9f},\n\t// Block 0x12, offset 0x89\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x13, offset 0x8c\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2c9e, lo: 0x8b, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x455c, lo: 0x9c, hi: 0x9d},\n\t{value: 0x456c, lo: 0x9f, hi: 0x9f},\n\t// Block 0x14, offset 0x93\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x4594, lo: 0xb3, hi: 0xb3},\n\t{value: 0x459c, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x15, offset 0x97\n\t{value: 0x0008, lo: 0x03},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x4574, lo: 0x99, hi: 0x9b},\n\t{value: 0x458c, lo: 0x9e, hi: 0x9e},\n\t// Block 0x16, offset 0x9b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x17, offset 0x9d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t// Block 0x18, offset 0x9f\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2cb6, lo: 0x88, hi: 0x88},\n\t{value: 0x2cae, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cbe, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x96, hi: 0x97},\n\t{value: 0x45a4, lo: 0x9c, hi: 0x9c},\n\t{value: 0x45ac, lo: 0x9d, hi: 0x9d},\n\t// Block 0x19, offset 0xa8\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x2cc6, lo: 0x94, hi: 0x94},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1a, offset 0xac\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cce, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2cde, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cd6, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x1b, offset 0xb3\n\t{value: 0x1801, lo: 0x04},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x3ef0, lo: 0x88, hi: 0x88},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8120, lo: 0x95, hi: 0x96},\n\t// Block 0x1c, offset 0xb8\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0xa000, lo: 0xbf, hi: 0xbf},\n\t// Block 0x1d, offset 0xbb\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x2ce6, lo: 0x80, hi: 0x80},\n\t{value: 0x9900, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x2cee, lo: 0x87, hi: 0x87},\n\t{value: 0x2cf6, lo: 0x88, hi: 0x88},\n\t{value: 0x2f50, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2dd8, lo: 0x8b, hi: 0x8b},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x95, hi: 0x96},\n\t// Block 0x1e, offset 0xc5\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xbb, hi: 0xbc},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1f, offset 0xc8\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cfe, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2d0e, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d06, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x20, offset 0xcf\n\t{value: 0x6bea, lo: 0x07},\n\t{value: 0x9904, lo: 0x8a, hi: 0x8a},\n\t{value: 0x9900, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x3ef8, lo: 0x9a, hi: 0x9a},\n\t{value: 0x2f58, lo: 0x9c, hi: 0x9c},\n\t{value: 0x2de3, lo: 0x9d, hi: 0x9d},\n\t{value: 0x2d16, lo: 0x9e, hi: 0x9f},\n\t// Block 0x21, offset 0xd7\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8122, lo: 0xb8, hi: 0xb9},\n\t{value: 0x8104, lo: 0xba, hi: 0xba},\n\t// Block 0x22, offset 0xda\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8123, lo: 0x88, hi: 0x8b},\n\t// Block 0x23, offset 0xdc\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8124, lo: 0xb8, hi: 0xb9},\n\t// Block 0x24, offset 0xde\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8125, lo: 0x88, hi: 0x8b},\n\t// Block 0x25, offset 0xe0\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x812d, lo: 0x98, hi: 0x99},\n\t{value: 0x812d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb7},\n\t{value: 0x812b, lo: 0xb9, hi: 0xb9},\n\t// Block 0x26, offset 0xe5\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x2644, lo: 0x83, hi: 0x83},\n\t{value: 0x264b, lo: 0x8d, hi: 0x8d},\n\t{value: 0x2652, lo: 0x92, hi: 0x92},\n\t{value: 0x2659, lo: 0x97, hi: 0x97},\n\t{value: 0x2660, lo: 0x9c, hi: 0x9c},\n\t{value: 0x263d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8126, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8127, lo: 0xb2, hi: 0xb2},\n\t{value: 0x4a84, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8128, lo: 0xb4, hi: 0xb4},\n\t{value: 0x4a8d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x45b4, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8200, lo: 0xb7, hi: 0xb7},\n\t{value: 0x45bc, lo: 0xb8, hi: 0xb8},\n\t{value: 0x8200, lo: 0xb9, hi: 0xb9},\n\t{value: 0x8127, lo: 0xba, hi: 0xbd},\n\t// Block 0x27, offset 0xf6\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x8127, lo: 0x80, hi: 0x80},\n\t{value: 0x4a96, lo: 0x81, hi: 0x81},\n\t{value: 0x8132, lo: 0x82, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0x86, hi: 0x87},\n\t{value: 0x266e, lo: 0x93, hi: 0x93},\n\t{value: 0x2675, lo: 0x9d, hi: 0x9d},\n\t{value: 0x267c, lo: 0xa2, hi: 0xa2},\n\t{value: 0x2683, lo: 0xa7, hi: 0xa7},\n\t{value: 0x268a, lo: 0xac, hi: 0xac},\n\t{value: 0x2667, lo: 0xb9, hi: 0xb9},\n\t// Block 0x28, offset 0x102\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x86, hi: 0x86},\n\t// Block 0x29, offset 0x104\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x2d1e, lo: 0xa6, hi: 0xa6},\n\t{value: 0x9900, lo: 0xae, hi: 0xae},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x2a, offset 0x10a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t// Block 0x2b, offset 0x10c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xa000, lo: 0x80, hi: 0x92},\n\t// Block 0x2c, offset 0x10e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xb900, lo: 0xa1, hi: 0xb5},\n\t// Block 0x2d, offset 0x110\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0xa8, hi: 0xbf},\n\t// Block 0x2e, offset 0x112\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0x80, hi: 0x82},\n\t// Block 0x2f, offset 0x114\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9f},\n\t// Block 0x30, offset 0x116\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x94, hi: 0x94},\n\t{value: 0x8104, lo: 0xb4, hi: 0xb4},\n\t// Block 0x31, offset 0x119\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9d},\n\t// Block 0x32, offset 0x11c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8131, lo: 0xa9, hi: 0xa9},\n\t// Block 0x33, offset 0x11e\n\t{value: 0x0004, lo: 0x02},\n\t{value: 0x812e, lo: 0xb9, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbb},\n\t// Block 0x34, offset 0x121\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x97, hi: 0x97},\n\t{value: 0x812d, lo: 0x98, hi: 0x98},\n\t// Block 0x35, offset 0x124\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8104, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8132, lo: 0xb5, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x36, offset 0x128\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t{value: 0x812d, lo: 0xb5, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x37, offset 0x12d\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x2d66, lo: 0x80, hi: 0x80},\n\t{value: 0x2d6e, lo: 0x81, hi: 0x81},\n\t{value: 0xa000, lo: 0x82, hi: 0x82},\n\t{value: 0x2d76, lo: 0x83, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xab, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xac},\n\t{value: 0x8132, lo: 0xad, hi: 0xb3},\n\t// Block 0x38, offset 0x136\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xaa, hi: 0xab},\n\t// Block 0x39, offset 0x138\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8104, lo: 0xb2, hi: 0xb3},\n\t// Block 0x3a, offset 0x13b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x3b, offset 0x13d\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x92},\n\t{value: 0x8101, lo: 0x94, hi: 0x94},\n\t{value: 0x812d, lo: 0x95, hi: 0x99},\n\t{value: 0x8132, lo: 0x9a, hi: 0x9b},\n\t{value: 0x812d, lo: 0x9c, hi: 0x9f},\n\t{value: 0x8132, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8101, lo: 0xa2, hi: 0xa8},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t{value: 0x8132, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb9},\n\t// Block 0x3c, offset 0x148\n\t{value: 0x0004, lo: 0x03},\n\t{value: 0x0433, lo: 0x80, hi: 0x81},\n\t{value: 0x8100, lo: 0x97, hi: 0x97},\n\t{value: 0x8100, lo: 0xbe, hi: 0xbe},\n\t// Block 0x3d, offset 0x14c\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x8132, lo: 0x90, hi: 0x91},\n\t{value: 0x8101, lo: 0x92, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x97},\n\t{value: 0x8101, lo: 0x98, hi: 0x9a},\n\t{value: 0x8132, lo: 0x9b, hi: 0x9c},\n\t{value: 0x8132, lo: 0xa1, hi: 0xa1},\n\t{value: 0x8101, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa7},\n\t{value: 0x812d, lo: 0xa8, hi: 0xa8},\n\t{value: 0x8132, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8101, lo: 0xaa, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t// Block 0x3e, offset 0x15a\n\t{value: 0x427b, lo: 0x02},\n\t{value: 0x01b8, lo: 0xa6, hi: 0xa6},\n\t{value: 0x0057, lo: 0xaa, hi: 0xab},\n\t// Block 0x3f, offset 0x15d\n\t{value: 0x0007, lo: 0x05},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t{value: 0x3bb9, lo: 0x9a, hi: 0x9b},\n\t{value: 0x3bc7, lo: 0xae, hi: 0xae},\n\t// Block 0x40, offset 0x163\n\t{value: 0x000e, lo: 0x05},\n\t{value: 0x3bce, lo: 0x8d, hi: 0x8e},\n\t{value: 0x3bd5, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t// Block 0x41, offset 0x169\n\t{value: 0x6408, lo: 0x0a},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0x3be3, lo: 0x84, hi: 0x84},\n\t{value: 0xa000, lo: 0x88, hi: 0x88},\n\t{value: 0x3bea, lo: 0x89, hi: 0x89},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0x3bf1, lo: 0x8c, hi: 0x8c},\n\t{value: 0xa000, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3bf8, lo: 0xa4, hi: 0xa5},\n\t{value: 0x3bff, lo: 0xa6, hi: 0xa6},\n\t{value: 0xa000, lo: 0xbc, hi: 0xbc},\n\t// Block 0x42, offset 0x174\n\t{value: 0x0007, lo: 0x03},\n\t{value: 0x3c68, lo: 0xa0, hi: 0xa1},\n\t{value: 0x3c92, lo: 0xa2, hi: 0xa3},\n\t{value: 0x3cbc, lo: 0xaa, hi: 0xad},\n\t// Block 0x43, offset 0x178\n\t{value: 0x0004, lo: 0x01},\n\t{value: 0x048b, lo: 0xa9, hi: 0xaa},\n\t// Block 0x44, offset 0x17a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x44dd, lo: 0x9c, hi: 0x9c},\n\t// Block 0x45, offset 0x17c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xaf, hi: 0xb1},\n\t// Block 0x46, offset 0x17e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x47, offset 0x180\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xa0, hi: 0xbf},\n\t// Block 0x48, offset 0x182\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x812c, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8131, lo: 0xab, hi: 0xab},\n\t{value: 0x8133, lo: 0xac, hi: 0xac},\n\t{value: 0x812e, lo: 0xad, hi: 0xad},\n\t{value: 0x812f, lo: 0xae, hi: 0xaf},\n\t// Block 0x49, offset 0x188\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x4a9f, lo: 0xb3, hi: 0xb3},\n\t{value: 0x4a9f, lo: 0xb5, hi: 0xb6},\n\t{value: 0x4a9f, lo: 0xba, hi: 0xbf},\n\t// Block 0x4a, offset 0x18c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x4a9f, lo: 0x8f, hi: 0xa3},\n\t// Block 0x4b, offset 0x18e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0xae, hi: 0xbe},\n\t// Block 0x4c, offset 0x190\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x8100, lo: 0x84, hi: 0x84},\n\t{value: 0x8100, lo: 0x87, hi: 0x87},\n\t{value: 0x8100, lo: 0x90, hi: 0x90},\n\t{value: 0x8100, lo: 0x9e, hi: 0x9e},\n\t{value: 0x8100, lo: 0xa1, hi: 0xa1},\n\t{value: 0x8100, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8100, lo: 0xbb, hi: 0xbb},\n\t// Block 0x4d, offset 0x198\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8100, lo: 0x80, hi: 0x80},\n\t{value: 0x8100, lo: 0x8b, hi: 0x8b},\n\t{value: 0x8100, lo: 0x8e, hi: 0x8e},\n\t// Block 0x4e, offset 0x19c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb4, hi: 0xbd},\n\t// Block 0x4f, offset 0x19f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x9e, hi: 0x9f},\n\t// Block 0x50, offset 0x1a1\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb1},\n\t// Block 0x51, offset 0x1a3\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t// Block 0x52, offset 0x1a5\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xa0, hi: 0xb1},\n\t// Block 0x53, offset 0x1a8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xab, hi: 0xad},\n\t// Block 0x54, offset 0x1aa\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x93, hi: 0x93},\n\t// Block 0x55, offset 0x1ac\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb3, hi: 0xb3},\n\t// Block 0x56, offset 0x1ae\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t// Block 0x57, offset 0x1b0\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x8132, lo: 0xbe, hi: 0xbf},\n\t// Block 0x58, offset 0x1b6\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t// Block 0x59, offset 0x1b9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xad, hi: 0xad},\n\t// Block 0x5a, offset 0x1bb\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xe500, lo: 0x80, hi: 0x80},\n\t{value: 0xc600, lo: 0x81, hi: 0x9b},\n\t{value: 0xe500, lo: 0x9c, hi: 0x9c},\n\t{value: 0xc600, lo: 0x9d, hi: 0xb7},\n\t{value: 0xe500, lo: 0xb8, hi: 0xb8},\n\t{value: 0xc600, lo: 0xb9, hi: 0xbf},\n\t// Block 0x5b, offset 0x1c2\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x93},\n\t{value: 0xe500, lo: 0x94, hi: 0x94},\n\t{value: 0xc600, lo: 0x95, hi: 0xaf},\n\t{value: 0xe500, lo: 0xb0, hi: 0xb0},\n\t{value: 0xc600, lo: 0xb1, hi: 0xbf},\n\t// Block 0x5c, offset 0x1c8\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8b},\n\t{value: 0xe500, lo: 0x8c, hi: 0x8c},\n\t{value: 0xc600, lo: 0x8d, hi: 0xa7},\n\t{value: 0xe500, lo: 0xa8, hi: 0xa8},\n\t{value: 0xc600, lo: 0xa9, hi: 0xbf},\n\t// Block 0x5d, offset 0x1ce\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xc600, lo: 0x80, hi: 0x83},\n\t{value: 0xe500, lo: 0x84, hi: 0x84},\n\t{value: 0xc600, lo: 0x85, hi: 0x9f},\n\t{value: 0xe500, lo: 0xa0, hi: 0xa0},\n\t{value: 0xc600, lo: 0xa1, hi: 0xbb},\n\t{value: 0xe500, lo: 0xbc, hi: 0xbc},\n\t{value: 0xc600, lo: 0xbd, hi: 0xbf},\n\t// Block 0x5e, offset 0x1d6\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x97},\n\t{value: 0xe500, lo: 0x98, hi: 0x98},\n\t{value: 0xc600, lo: 0x99, hi: 0xb3},\n\t{value: 0xe500, lo: 0xb4, hi: 0xb4},\n\t{value: 0xc600, lo: 0xb5, hi: 0xbf},\n\t// Block 0x5f, offset 0x1dc\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8f},\n\t{value: 0xe500, lo: 0x90, hi: 0x90},\n\t{value: 0xc600, lo: 0x91, hi: 0xab},\n\t{value: 0xe500, lo: 0xac, hi: 0xac},\n\t{value: 0xc600, lo: 0xad, hi: 0xbf},\n\t// Block 0x60, offset 0x1e2\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t{value: 0xe500, lo: 0xa4, hi: 0xa4},\n\t{value: 0xc600, lo: 0xa5, hi: 0xbf},\n\t// Block 0x61, offset 0x1e8\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t// Block 0x62, offset 0x1ec\n\t{value: 0x0006, lo: 0x0d},\n\t{value: 0x4390, lo: 0x9d, hi: 0x9d},\n\t{value: 0x8115, lo: 0x9e, hi: 0x9e},\n\t{value: 0x4402, lo: 0x9f, hi: 0x9f},\n\t{value: 0x43f0, lo: 0xaa, hi: 0xab},\n\t{value: 0x44f4, lo: 0xac, hi: 0xac},\n\t{value: 0x44fc, lo: 0xad, hi: 0xad},\n\t{value: 0x4348, lo: 0xae, hi: 0xb1},\n\t{value: 0x4366, lo: 0xb2, hi: 0xb4},\n\t{value: 0x437e, lo: 0xb5, hi: 0xb6},\n\t{value: 0x438a, lo: 0xb8, hi: 0xb8},\n\t{value: 0x4396, lo: 0xb9, hi: 0xbb},\n\t{value: 0x43ae, lo: 0xbc, hi: 0xbc},\n\t{value: 0x43b4, lo: 0xbe, hi: 0xbe},\n\t// Block 0x63, offset 0x1fa\n\t{value: 0x0006, lo: 0x08},\n\t{value: 0x43ba, lo: 0x80, hi: 0x81},\n\t{value: 0x43c6, lo: 0x83, hi: 0x84},\n\t{value: 0x43d8, lo: 0x86, hi: 0x89},\n\t{value: 0x43fc, lo: 0x8a, hi: 0x8a},\n\t{value: 0x4378, lo: 0x8b, hi: 0x8b},\n\t{value: 0x4360, lo: 0x8c, hi: 0x8c},\n\t{value: 0x43a8, lo: 0x8d, hi: 0x8d},\n\t{value: 0x43d2, lo: 0x8e, hi: 0x8e},\n\t// Block 0x64, offset 0x203\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8100, lo: 0xa4, hi: 0xa5},\n\t{value: 0x8100, lo: 0xb0, hi: 0xb1},\n\t// Block 0x65, offset 0x206\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8100, lo: 0x9b, hi: 0x9d},\n\t{value: 0x8200, lo: 0x9e, hi: 0xa3},\n\t// Block 0x66, offset 0x209\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x90, hi: 0x90},\n\t// Block 0x67, offset 0x20b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8100, lo: 0x99, hi: 0x99},\n\t{value: 0x8200, lo: 0xb2, hi: 0xb4},\n\t// Block 0x68, offset 0x20e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0xbc, hi: 0xbd},\n\t// Block 0x69, offset 0x210\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8132, lo: 0xa0, hi: 0xa6},\n\t{value: 0x812d, lo: 0xa7, hi: 0xad},\n\t{value: 0x8132, lo: 0xae, hi: 0xaf},\n\t// Block 0x6a, offset 0x214\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8100, lo: 0x89, hi: 0x8c},\n\t{value: 0x8100, lo: 0xb0, hi: 0xb2},\n\t{value: 0x8100, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8100, lo: 0xb6, hi: 0xbf},\n\t// Block 0x6b, offset 0x219\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x81, hi: 0x8c},\n\t// Block 0x6c, offset 0x21b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0xb5, hi: 0xba},\n\t// Block 0x6d, offset 0x21d\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x4a9f, lo: 0x9e, hi: 0x9f},\n\t{value: 0x4a9f, lo: 0xa3, hi: 0xa3},\n\t{value: 0x4a9f, lo: 0xa5, hi: 0xa6},\n\t{value: 0x4a9f, lo: 0xaa, hi: 0xaf},\n\t// Block 0x6e, offset 0x222\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x4a9f, lo: 0x82, hi: 0x87},\n\t{value: 0x4a9f, lo: 0x8a, hi: 0x8f},\n\t{value: 0x4a9f, lo: 0x92, hi: 0x97},\n\t{value: 0x4a9f, lo: 0x9a, hi: 0x9c},\n\t{value: 0x8100, lo: 0xa3, hi: 0xa3},\n\t// Block 0x6f, offset 0x228\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x70, offset 0x22a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xa0, hi: 0xa0},\n\t// Block 0x71, offset 0x22c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb6, hi: 0xba},\n\t// Block 0x72, offset 0x22e\n\t{value: 0x002c, lo: 0x05},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x8f, hi: 0x8f},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb8},\n\t{value: 0x8101, lo: 0xb9, hi: 0xba},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x73, offset 0x234\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t// Block 0x74, offset 0x237\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x75, offset 0x23a\n\t{value: 0x17fe, lo: 0x07},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x4238, lo: 0x9a, hi: 0x9a},\n\t{value: 0xa000, lo: 0x9b, hi: 0x9b},\n\t{value: 0x4242, lo: 0x9c, hi: 0x9c},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x424c, lo: 0xab, hi: 0xab},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x76, offset 0x242\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x8132, lo: 0x80, hi: 0x82},\n\t{value: 0x9900, lo: 0xa7, hi: 0xa7},\n\t{value: 0x2d7e, lo: 0xae, hi: 0xae},\n\t{value: 0x2d88, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb1, hi: 0xb2},\n\t{value: 0x8104, lo: 0xb3, hi: 0xb4},\n\t// Block 0x77, offset 0x249\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x78, offset 0x24c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb5, hi: 0xb5},\n\t{value: 0x8102, lo: 0xb6, hi: 0xb6},\n\t// Block 0x79, offset 0x24f\n\t{value: 0x0002, lo: 0x01},\n\t{value: 0x8102, lo: 0xa9, hi: 0xaa},\n\t// Block 0x7a, offset 0x251\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2d92, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d9c, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x8132, lo: 0xa6, hi: 0xac},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t// Block 0x7b, offset 0x259\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x86, hi: 0x86},\n\t// Block 0x7c, offset 0x25c\n\t{value: 0x6b5a, lo: 0x06},\n\t{value: 0x9900, lo: 0xb0, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb9, hi: 0xb9},\n\t{value: 0x9900, lo: 0xba, hi: 0xba},\n\t{value: 0x2db0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x2da6, lo: 0xbc, hi: 0xbd},\n\t{value: 0x2dba, lo: 0xbe, hi: 0xbe},\n\t// Block 0x7d, offset 0x263\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x83, hi: 0x83},\n\t// Block 0x7e, offset 0x266\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x9900, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb8, hi: 0xb9},\n\t{value: 0x2dc4, lo: 0xba, hi: 0xba},\n\t{value: 0x2dce, lo: 0xbb, hi: 0xbb},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x7f, offset 0x26c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0x80, hi: 0x80},\n\t// Block 0x80, offset 0x26e\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x81, offset 0x271\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xab, hi: 0xab},\n\t// Block 0x82, offset 0x273\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xb4, hi: 0xb4},\n\t// Block 0x83, offset 0x275\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x87, hi: 0x87},\n\t// Block 0x84, offset 0x277\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x99, hi: 0x99},\n\t// Block 0x85, offset 0x279\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0x82, hi: 0x82},\n\t{value: 0x8104, lo: 0x84, hi: 0x85},\n\t// Block 0x86, offset 0x27c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0xb0, hi: 0xb4},\n\t// Block 0x87, offset 0x27e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb6},\n\t// Block 0x88, offset 0x280\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0x9e, hi: 0x9e},\n\t// Block 0x89, offset 0x282\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x45cc, lo: 0x9e, hi: 0x9e},\n\t{value: 0x45d6, lo: 0x9f, hi: 0x9f},\n\t{value: 0x460a, lo: 0xa0, hi: 0xa0},\n\t{value: 0x4618, lo: 0xa1, hi: 0xa1},\n\t{value: 0x4626, lo: 0xa2, hi: 0xa2},\n\t{value: 0x4634, lo: 0xa3, hi: 0xa3},\n\t{value: 0x4642, lo: 0xa4, hi: 0xa4},\n\t{value: 0x812b, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8101, lo: 0xa7, hi: 0xa9},\n\t{value: 0x8130, lo: 0xad, hi: 0xad},\n\t{value: 0x812b, lo: 0xae, hi: 0xb2},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbf},\n\t// Block 0x8a, offset 0x28f\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x812d, lo: 0x80, hi: 0x82},\n\t{value: 0x8132, lo: 0x85, hi: 0x89},\n\t{value: 0x812d, lo: 0x8a, hi: 0x8b},\n\t{value: 0x8132, lo: 0xaa, hi: 0xad},\n\t{value: 0x45e0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x45ea, lo: 0xbc, hi: 0xbc},\n\t{value: 0x4650, lo: 0xbd, hi: 0xbd},\n\t{value: 0x466c, lo: 0xbe, hi: 0xbe},\n\t{value: 0x465e, lo: 0xbf, hi: 0xbf},\n\t// Block 0x8b, offset 0x299\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x467a, lo: 0x80, hi: 0x80},\n\t// Block 0x8c, offset 0x29b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x82, hi: 0x84},\n\t// Block 0x8d, offset 0x29d\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0x80, hi: 0x86},\n\t{value: 0x8132, lo: 0x88, hi: 0x98},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa1},\n\t{value: 0x8132, lo: 0xa3, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa6, hi: 0xaa},\n\t// Block 0x8e, offset 0x2a3\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x90, hi: 0x96},\n\t// Block 0x8f, offset 0x2a5\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x84, hi: 0x89},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x90, offset 0x2a8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x93, hi: 0x93},\n}\n\n// lookup returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfkcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfkcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfkcValues[c0]\n\t}\n\ti := nfkcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// lookupString returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfkcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfkcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfkcValues[c0]\n\t}\n\ti := nfkcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// nfkcTrie. Total size: 17104 bytes (16.70 KiB). Checksum: d985061cf5307b35.\ntype nfkcTrie struct{}\n\nfunc newNfkcTrie(i int) *nfkcTrie {\n\treturn &nfkcTrie{}\n}\n\n// lookupValue determines the type of block n and looks up the value for b.\nfunc (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {\n\tswitch {\n\tcase n < 91:\n\t\treturn uint16(nfkcValues[n<<6+uint32(b)])\n\tdefault:\n\t\tn -= 91\n\t\treturn uint16(nfkcSparse.lookup(n, b))\n\t}\n}\n\n// nfkcValues: 93 blocks, 5952 entries, 11904 bytes\n// The third block is the zero block.\nvar nfkcValues = [5952]uint16{\n\t// Block 0x0, offset 0x0\n\t0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,\n\t// Block 0x1, offset 0x40\n\t0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,\n\t0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,\n\t0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,\n\t0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,\n\t0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,\n\t0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,\n\t0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,\n\t0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,\n\t0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,\n\t0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,\n\t0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,\n\t0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,\n\t0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,\n\t0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,\n\t0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,\n\t0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,\n\t0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,\n\t0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,\n\t0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,\n\t0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,\n\t// Block 0x4, offset 0x100\n\t0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,\n\t0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,\n\t0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,\n\t0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,\n\t0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,\n\t0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,\n\t0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,\n\t0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,\n\t0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0,\n\t0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,\n\t0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,\n\t0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c,\n\t0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,\n\t0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,\n\t0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,\n\t0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,\n\t0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,\n\t0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,\n\t0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,\n\t0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,\n\t0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7,\n\t// Block 0x6, offset 0x180\n\t0x184: 0x2dee, 0x185: 0x2df4,\n\t0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a,\n\t0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,\n\t0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,\n\t0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,\n\t0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,\n\t0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,\n\t0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,\n\t0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334,\n\t0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,\n\t0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,\n\t0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,\n\t0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,\n\t0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,\n\t0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,\n\t0x1de: 0x305a, 0x1df: 0x3366,\n\t0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,\n\t0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,\n\t0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,\n\t// Block 0x8, offset 0x200\n\t0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,\n\t0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,\n\t0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,\n\t0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,\n\t0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,\n\t0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,\n\t0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,\n\t0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,\n\t0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,\n\t0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,\n\t0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,\n\t0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,\n\t0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,\n\t0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,\n\t0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,\n\t0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,\n\t0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,\n\t0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,\n\t0x274: 0x0170,\n\t0x27a: 0x42a5,\n\t0x27e: 0x0037,\n\t// Block 0xa, offset 0x280\n\t0x284: 0x425a, 0x285: 0x447b,\n\t0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,\n\t0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,\n\t0x295: 0xa000, 0x297: 0xa000,\n\t0x299: 0xa000,\n\t0x29f: 0xa000, 0x2a1: 0xa000,\n\t0x2a5: 0xa000, 0x2a9: 0xa000,\n\t0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,\n\t0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,\n\t0x2b7: 0xa000, 0x2b9: 0xa000,\n\t0x2bf: 0xa000,\n\t// Block 0xb, offset 0x2c0\n\t0x2c1: 0xa000, 0x2c5: 0xa000,\n\t0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e,\n\t0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0,\n\t0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8,\n\t0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7,\n\t0x2f9: 0x01a6,\n\t// Block 0xc, offset 0x300\n\t0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b,\n\t0x306: 0xa000, 0x307: 0x3709,\n\t0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000,\n\t0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,\n\t0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000,\n\t0x31e: 0xa000, 0x323: 0xa000,\n\t0x327: 0xa000,\n\t0x32b: 0xa000, 0x32d: 0xa000,\n\t0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,\n\t0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000,\n\t0x33e: 0xa000,\n\t// Block 0xd, offset 0x340\n\t0x341: 0x3733, 0x342: 0x37b7,\n\t0x350: 0x370f, 0x351: 0x3793,\n\t0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab,\n\t0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd,\n\t0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf,\n\t0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000,\n\t0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed,\n\t0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805,\n\t0x378: 0x3787, 0x379: 0x380b,\n\t// Block 0xe, offset 0x380\n\t0x387: 0x1d61,\n\t0x391: 0x812d,\n\t0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132,\n\t0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132,\n\t0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d,\n\t0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132,\n\t0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132,\n\t0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a,\n\t0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f,\n\t0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112,\n\t// Block 0xf, offset 0x3c0\n\t0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116,\n\t0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c,\n\t0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132,\n\t0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132,\n\t0x3de: 0x8132, 0x3df: 0x812d,\n\t0x3f0: 0x811e, 0x3f5: 0x1d84,\n\t0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a,\n\t// Block 0x10, offset 0x400\n\t0x405: 0xa000,\n\t0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000,\n\t0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000,\n\t0x412: 0x2d4e,\n\t0x434: 0x8102, 0x435: 0x9900,\n\t0x43a: 0xa000, 0x43b: 0x2d56,\n\t0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8,\n\t0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107,\n\t0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0,\n\t0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9,\n\t0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be,\n\t0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5,\n\t0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa,\n\t0x46a: 0x01fd,\n\t0x478: 0x020c,\n\t// Block 0x12, offset 0x480\n\t0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101,\n\t0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116,\n\t0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128,\n\t0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137,\n\t0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec,\n\t0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5,\n\t0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0x8132, 0x4c1: 0x8132, 0x4c2: 0x812d, 0x4c3: 0x8132, 0x4c4: 0x8132, 0x4c5: 0x8132,\n\t0x4c6: 0x8132, 0x4c7: 0x8132, 0x4c8: 0x8132, 0x4c9: 0x8132, 0x4ca: 0x812d, 0x4cb: 0x8132,\n\t0x4cc: 0x8132, 0x4cd: 0x8135, 0x4ce: 0x812a, 0x4cf: 0x812d, 0x4d0: 0x8129, 0x4d1: 0x8132,\n\t0x4d2: 0x8132, 0x4d3: 0x8132, 0x4d4: 0x8132, 0x4d5: 0x8132, 0x4d6: 0x8132, 0x4d7: 0x8132,\n\t0x4d8: 0x8132, 0x4d9: 0x8132, 0x4da: 0x8132, 0x4db: 0x8132, 0x4dc: 0x8132, 0x4dd: 0x8132,\n\t0x4de: 0x8132, 0x4df: 0x8132, 0x4e0: 0x8132, 0x4e1: 0x8132, 0x4e2: 0x8132, 0x4e3: 0x8132,\n\t0x4e4: 0x8132, 0x4e5: 0x8132, 0x4e6: 0x8132, 0x4e7: 0x8132, 0x4e8: 0x8132, 0x4e9: 0x8132,\n\t0x4ea: 0x8132, 0x4eb: 0x8132, 0x4ec: 0x8132, 0x4ed: 0x8132, 0x4ee: 0x8132, 0x4ef: 0x8132,\n\t0x4f0: 0x8132, 0x4f1: 0x8132, 0x4f2: 0x8132, 0x4f3: 0x8132, 0x4f4: 0x8132, 0x4f5: 0x8132,\n\t0x4f6: 0x8133, 0x4f7: 0x8131, 0x4f8: 0x8131, 0x4f9: 0x812d, 0x4fb: 0x8132,\n\t0x4fc: 0x8134, 0x4fd: 0x812d, 0x4fe: 0x8132, 0x4ff: 0x812d,\n\t// Block 0x14, offset 0x500\n\t0x500: 0x2f97, 0x501: 0x32a3, 0x502: 0x2fa1, 0x503: 0x32ad, 0x504: 0x2fa6, 0x505: 0x32b2,\n\t0x506: 0x2fab, 0x507: 0x32b7, 0x508: 0x38cc, 0x509: 0x3a5b, 0x50a: 0x2fc4, 0x50b: 0x32d0,\n\t0x50c: 0x2fce, 0x50d: 0x32da, 0x50e: 0x2fdd, 0x50f: 0x32e9, 0x510: 0x2fd3, 0x511: 0x32df,\n\t0x512: 0x2fd8, 0x513: 0x32e4, 0x514: 0x38ef, 0x515: 0x3a7e, 0x516: 0x38f6, 0x517: 0x3a85,\n\t0x518: 0x3019, 0x519: 0x3325, 0x51a: 0x301e, 0x51b: 0x332a, 0x51c: 0x3904, 0x51d: 0x3a93,\n\t0x51e: 0x3023, 0x51f: 0x332f, 0x520: 0x3032, 0x521: 0x333e, 0x522: 0x3050, 0x523: 0x335c,\n\t0x524: 0x305f, 0x525: 0x336b, 0x526: 0x3055, 0x527: 0x3361, 0x528: 0x3064, 0x529: 0x3370,\n\t0x52a: 0x3069, 0x52b: 0x3375, 0x52c: 0x30af, 0x52d: 0x33bb, 0x52e: 0x390b, 0x52f: 0x3a9a,\n\t0x530: 0x30b9, 0x531: 0x33ca, 0x532: 0x30c3, 0x533: 0x33d4, 0x534: 0x30cd, 0x535: 0x33de,\n\t0x536: 0x46c4, 0x537: 0x4755, 0x538: 0x3912, 0x539: 0x3aa1, 0x53a: 0x30e6, 0x53b: 0x33f7,\n\t0x53c: 0x30e1, 0x53d: 0x33f2, 0x53e: 0x30eb, 0x53f: 0x33fc,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x30f0, 0x541: 0x3401, 0x542: 0x30f5, 0x543: 0x3406, 0x544: 0x3109, 0x545: 0x341a,\n\t0x546: 0x3113, 0x547: 0x3424, 0x548: 0x3122, 0x549: 0x3433, 0x54a: 0x311d, 0x54b: 0x342e,\n\t0x54c: 0x3935, 0x54d: 0x3ac4, 0x54e: 0x3943, 0x54f: 0x3ad2, 0x550: 0x394a, 0x551: 0x3ad9,\n\t0x552: 0x3951, 0x553: 0x3ae0, 0x554: 0x314f, 0x555: 0x3460, 0x556: 0x3154, 0x557: 0x3465,\n\t0x558: 0x315e, 0x559: 0x346f, 0x55a: 0x46f1, 0x55b: 0x4782, 0x55c: 0x3997, 0x55d: 0x3b26,\n\t0x55e: 0x3177, 0x55f: 0x3488, 0x560: 0x3181, 0x561: 0x3492, 0x562: 0x4700, 0x563: 0x4791,\n\t0x564: 0x399e, 0x565: 0x3b2d, 0x566: 0x39a5, 0x567: 0x3b34, 0x568: 0x39ac, 0x569: 0x3b3b,\n\t0x56a: 0x3190, 0x56b: 0x34a1, 0x56c: 0x319a, 0x56d: 0x34b0, 0x56e: 0x31ae, 0x56f: 0x34c4,\n\t0x570: 0x31a9, 0x571: 0x34bf, 0x572: 0x31ea, 0x573: 0x3500, 0x574: 0x31f9, 0x575: 0x350f,\n\t0x576: 0x31f4, 0x577: 0x350a, 0x578: 0x39b3, 0x579: 0x3b42, 0x57a: 0x39ba, 0x57b: 0x3b49,\n\t0x57c: 0x31fe, 0x57d: 0x3514, 0x57e: 0x3203, 0x57f: 0x3519,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x3208, 0x581: 0x351e, 0x582: 0x320d, 0x583: 0x3523, 0x584: 0x321c, 0x585: 0x3532,\n\t0x586: 0x3217, 0x587: 0x352d, 0x588: 0x3221, 0x589: 0x353c, 0x58a: 0x3226, 0x58b: 0x3541,\n\t0x58c: 0x322b, 0x58d: 0x3546, 0x58e: 0x3249, 0x58f: 0x3564, 0x590: 0x3262, 0x591: 0x3582,\n\t0x592: 0x3271, 0x593: 0x3591, 0x594: 0x3276, 0x595: 0x3596, 0x596: 0x337a, 0x597: 0x34a6,\n\t0x598: 0x3537, 0x599: 0x3573, 0x59a: 0x1be0, 0x59b: 0x42d7,\n\t0x5a0: 0x46a1, 0x5a1: 0x4732, 0x5a2: 0x2f83, 0x5a3: 0x328f,\n\t0x5a4: 0x3878, 0x5a5: 0x3a07, 0x5a6: 0x3871, 0x5a7: 0x3a00, 0x5a8: 0x3886, 0x5a9: 0x3a15,\n\t0x5aa: 0x387f, 0x5ab: 0x3a0e, 0x5ac: 0x38be, 0x5ad: 0x3a4d, 0x5ae: 0x3894, 0x5af: 0x3a23,\n\t0x5b0: 0x388d, 0x5b1: 0x3a1c, 0x5b2: 0x38a2, 0x5b3: 0x3a31, 0x5b4: 0x389b, 0x5b5: 0x3a2a,\n\t0x5b6: 0x38c5, 0x5b7: 0x3a54, 0x5b8: 0x46b5, 0x5b9: 0x4746, 0x5ba: 0x3000, 0x5bb: 0x330c,\n\t0x5bc: 0x2fec, 0x5bd: 0x32f8, 0x5be: 0x38da, 0x5bf: 0x3a69,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x38d3, 0x5c1: 0x3a62, 0x5c2: 0x38e8, 0x5c3: 0x3a77, 0x5c4: 0x38e1, 0x5c5: 0x3a70,\n\t0x5c6: 0x38fd, 0x5c7: 0x3a8c, 0x5c8: 0x3091, 0x5c9: 0x339d, 0x5ca: 0x30a5, 0x5cb: 0x33b1,\n\t0x5cc: 0x46e7, 0x5cd: 0x4778, 0x5ce: 0x3136, 0x5cf: 0x3447, 0x5d0: 0x3920, 0x5d1: 0x3aaf,\n\t0x5d2: 0x3919, 0x5d3: 0x3aa8, 0x5d4: 0x392e, 0x5d5: 0x3abd, 0x5d6: 0x3927, 0x5d7: 0x3ab6,\n\t0x5d8: 0x3989, 0x5d9: 0x3b18, 0x5da: 0x396d, 0x5db: 0x3afc, 0x5dc: 0x3966, 0x5dd: 0x3af5,\n\t0x5de: 0x397b, 0x5df: 0x3b0a, 0x5e0: 0x3974, 0x5e1: 0x3b03, 0x5e2: 0x3982, 0x5e3: 0x3b11,\n\t0x5e4: 0x31e5, 0x5e5: 0x34fb, 0x5e6: 0x31c7, 0x5e7: 0x34dd, 0x5e8: 0x39e4, 0x5e9: 0x3b73,\n\t0x5ea: 0x39dd, 0x5eb: 0x3b6c, 0x5ec: 0x39f2, 0x5ed: 0x3b81, 0x5ee: 0x39eb, 0x5ef: 0x3b7a,\n\t0x5f0: 0x39f9, 0x5f1: 0x3b88, 0x5f2: 0x3230, 0x5f3: 0x354b, 0x5f4: 0x3258, 0x5f5: 0x3578,\n\t0x5f6: 0x3253, 0x5f7: 0x356e, 0x5f8: 0x323f, 0x5f9: 0x355a,\n\t// Block 0x18, offset 0x600\n\t0x600: 0x4804, 0x601: 0x480a, 0x602: 0x491e, 0x603: 0x4936, 0x604: 0x4926, 0x605: 0x493e,\n\t0x606: 0x492e, 0x607: 0x4946, 0x608: 0x47aa, 0x609: 0x47b0, 0x60a: 0x488e, 0x60b: 0x48a6,\n\t0x60c: 0x4896, 0x60d: 0x48ae, 0x60e: 0x489e, 0x60f: 0x48b6, 0x610: 0x4816, 0x611: 0x481c,\n\t0x612: 0x3db8, 0x613: 0x3dc8, 0x614: 0x3dc0, 0x615: 0x3dd0,\n\t0x618: 0x47b6, 0x619: 0x47bc, 0x61a: 0x3ce8, 0x61b: 0x3cf8, 0x61c: 0x3cf0, 0x61d: 0x3d00,\n\t0x620: 0x482e, 0x621: 0x4834, 0x622: 0x494e, 0x623: 0x4966,\n\t0x624: 0x4956, 0x625: 0x496e, 0x626: 0x495e, 0x627: 0x4976, 0x628: 0x47c2, 0x629: 0x47c8,\n\t0x62a: 0x48be, 0x62b: 0x48d6, 0x62c: 0x48c6, 0x62d: 0x48de, 0x62e: 0x48ce, 0x62f: 0x48e6,\n\t0x630: 0x4846, 0x631: 0x484c, 0x632: 0x3e18, 0x633: 0x3e30, 0x634: 0x3e20, 0x635: 0x3e38,\n\t0x636: 0x3e28, 0x637: 0x3e40, 0x638: 0x47ce, 0x639: 0x47d4, 0x63a: 0x3d18, 0x63b: 0x3d30,\n\t0x63c: 0x3d20, 0x63d: 0x3d38, 0x63e: 0x3d28, 0x63f: 0x3d40,\n\t// Block 0x19, offset 0x640\n\t0x640: 0x4852, 0x641: 0x4858, 0x642: 0x3e48, 0x643: 0x3e58, 0x644: 0x3e50, 0x645: 0x3e60,\n\t0x648: 0x47da, 0x649: 0x47e0, 0x64a: 0x3d48, 0x64b: 0x3d58,\n\t0x64c: 0x3d50, 0x64d: 0x3d60, 0x650: 0x4864, 0x651: 0x486a,\n\t0x652: 0x3e80, 0x653: 0x3e98, 0x654: 0x3e88, 0x655: 0x3ea0, 0x656: 0x3e90, 0x657: 0x3ea8,\n\t0x659: 0x47e6, 0x65b: 0x3d68, 0x65d: 0x3d70,\n\t0x65f: 0x3d78, 0x660: 0x487c, 0x661: 0x4882, 0x662: 0x497e, 0x663: 0x4996,\n\t0x664: 0x4986, 0x665: 0x499e, 0x666: 0x498e, 0x667: 0x49a6, 0x668: 0x47ec, 0x669: 0x47f2,\n\t0x66a: 0x48ee, 0x66b: 0x4906, 0x66c: 0x48f6, 0x66d: 0x490e, 0x66e: 0x48fe, 0x66f: 0x4916,\n\t0x670: 0x47f8, 0x671: 0x431e, 0x672: 0x3691, 0x673: 0x4324, 0x674: 0x4822, 0x675: 0x432a,\n\t0x676: 0x36a3, 0x677: 0x4330, 0x678: 0x36c1, 0x679: 0x4336, 0x67a: 0x36d9, 0x67b: 0x433c,\n\t0x67c: 0x4870, 0x67d: 0x4342,\n\t// Block 0x1a, offset 0x680\n\t0x680: 0x3da0, 0x681: 0x3da8, 0x682: 0x4184, 0x683: 0x41a2, 0x684: 0x418e, 0x685: 0x41ac,\n\t0x686: 0x4198, 0x687: 0x41b6, 0x688: 0x3cd8, 0x689: 0x3ce0, 0x68a: 0x40d0, 0x68b: 0x40ee,\n\t0x68c: 0x40da, 0x68d: 0x40f8, 0x68e: 0x40e4, 0x68f: 0x4102, 0x690: 0x3de8, 0x691: 0x3df0,\n\t0x692: 0x41c0, 0x693: 0x41de, 0x694: 0x41ca, 0x695: 0x41e8, 0x696: 0x41d4, 0x697: 0x41f2,\n\t0x698: 0x3d08, 0x699: 0x3d10, 0x69a: 0x410c, 0x69b: 0x412a, 0x69c: 0x4116, 0x69d: 0x4134,\n\t0x69e: 0x4120, 0x69f: 0x413e, 0x6a0: 0x3ec0, 0x6a1: 0x3ec8, 0x6a2: 0x41fc, 0x6a3: 0x421a,\n\t0x6a4: 0x4206, 0x6a5: 0x4224, 0x6a6: 0x4210, 0x6a7: 0x422e, 0x6a8: 0x3d80, 0x6a9: 0x3d88,\n\t0x6aa: 0x4148, 0x6ab: 0x4166, 0x6ac: 0x4152, 0x6ad: 0x4170, 0x6ae: 0x415c, 0x6af: 0x417a,\n\t0x6b0: 0x3685, 0x6b1: 0x367f, 0x6b2: 0x3d90, 0x6b3: 0x368b, 0x6b4: 0x3d98,\n\t0x6b6: 0x4810, 0x6b7: 0x3db0, 0x6b8: 0x35f5, 0x6b9: 0x35ef, 0x6ba: 0x35e3, 0x6bb: 0x42ee,\n\t0x6bc: 0x35fb, 0x6bd: 0x4287, 0x6be: 0x01d3, 0x6bf: 0x4287,\n\t// Block 0x1b, offset 0x6c0\n\t0x6c0: 0x42a0, 0x6c1: 0x4482, 0x6c2: 0x3dd8, 0x6c3: 0x369d, 0x6c4: 0x3de0,\n\t0x6c6: 0x483a, 0x6c7: 0x3df8, 0x6c8: 0x3601, 0x6c9: 0x42f4, 0x6ca: 0x360d, 0x6cb: 0x42fa,\n\t0x6cc: 0x3619, 0x6cd: 0x4489, 0x6ce: 0x4490, 0x6cf: 0x4497, 0x6d0: 0x36b5, 0x6d1: 0x36af,\n\t0x6d2: 0x3e00, 0x6d3: 0x44e4, 0x6d6: 0x36bb, 0x6d7: 0x3e10,\n\t0x6d8: 0x3631, 0x6d9: 0x362b, 0x6da: 0x361f, 0x6db: 0x4300, 0x6dd: 0x449e,\n\t0x6de: 0x44a5, 0x6df: 0x44ac, 0x6e0: 0x36eb, 0x6e1: 0x36e5, 0x6e2: 0x3e68, 0x6e3: 0x44ec,\n\t0x6e4: 0x36cd, 0x6e5: 0x36d3, 0x6e6: 0x36f1, 0x6e7: 0x3e78, 0x6e8: 0x3661, 0x6e9: 0x365b,\n\t0x6ea: 0x364f, 0x6eb: 0x430c, 0x6ec: 0x3649, 0x6ed: 0x4474, 0x6ee: 0x447b, 0x6ef: 0x0081,\n\t0x6f2: 0x3eb0, 0x6f3: 0x36f7, 0x6f4: 0x3eb8,\n\t0x6f6: 0x4888, 0x6f7: 0x3ed0, 0x6f8: 0x363d, 0x6f9: 0x4306, 0x6fa: 0x366d, 0x6fb: 0x4318,\n\t0x6fc: 0x3679, 0x6fd: 0x425a, 0x6fe: 0x428c,\n\t// Block 0x1c, offset 0x700\n\t0x700: 0x1bd8, 0x701: 0x1bdc, 0x702: 0x0047, 0x703: 0x1c54, 0x705: 0x1be8,\n\t0x706: 0x1bec, 0x707: 0x00e9, 0x709: 0x1c58, 0x70a: 0x008f, 0x70b: 0x0051,\n\t0x70c: 0x0051, 0x70d: 0x0051, 0x70e: 0x0091, 0x70f: 0x00da, 0x710: 0x0053, 0x711: 0x0053,\n\t0x712: 0x0059, 0x713: 0x0099, 0x715: 0x005d, 0x716: 0x198d,\n\t0x719: 0x0061, 0x71a: 0x0063, 0x71b: 0x0065, 0x71c: 0x0065, 0x71d: 0x0065,\n\t0x720: 0x199f, 0x721: 0x1bc8, 0x722: 0x19a8,\n\t0x724: 0x0075, 0x726: 0x01b8, 0x728: 0x0075,\n\t0x72a: 0x0057, 0x72b: 0x42d2, 0x72c: 0x0045, 0x72d: 0x0047, 0x72f: 0x008b,\n\t0x730: 0x004b, 0x731: 0x004d, 0x733: 0x005b, 0x734: 0x009f, 0x735: 0x0215,\n\t0x736: 0x0218, 0x737: 0x021b, 0x738: 0x021e, 0x739: 0x0093, 0x73b: 0x1b98,\n\t0x73c: 0x01e8, 0x73d: 0x01c1, 0x73e: 0x0179, 0x73f: 0x01a0,\n\t// Block 0x1d, offset 0x740\n\t0x740: 0x0463, 0x745: 0x0049,\n\t0x746: 0x0089, 0x747: 0x008b, 0x748: 0x0093, 0x749: 0x0095,\n\t0x750: 0x222e, 0x751: 0x223a,\n\t0x752: 0x22ee, 0x753: 0x2216, 0x754: 0x229a, 0x755: 0x2222, 0x756: 0x22a0, 0x757: 0x22b8,\n\t0x758: 0x22c4, 0x759: 0x2228, 0x75a: 0x22ca, 0x75b: 0x2234, 0x75c: 0x22be, 0x75d: 0x22d0,\n\t0x75e: 0x22d6, 0x75f: 0x1cbc, 0x760: 0x0053, 0x761: 0x195a, 0x762: 0x1ba4, 0x763: 0x1963,\n\t0x764: 0x006d, 0x765: 0x19ab, 0x766: 0x1bd0, 0x767: 0x1d48, 0x768: 0x1966, 0x769: 0x0071,\n\t0x76a: 0x19b7, 0x76b: 0x1bd4, 0x76c: 0x0059, 0x76d: 0x0047, 0x76e: 0x0049, 0x76f: 0x005b,\n\t0x770: 0x0093, 0x771: 0x19e4, 0x772: 0x1c18, 0x773: 0x19ed, 0x774: 0x00ad, 0x775: 0x1a62,\n\t0x776: 0x1c4c, 0x777: 0x1d5c, 0x778: 0x19f0, 0x779: 0x00b1, 0x77a: 0x1a65, 0x77b: 0x1c50,\n\t0x77c: 0x0099, 0x77d: 0x0087, 0x77e: 0x0089, 0x77f: 0x009b,\n\t// Block 0x1e, offset 0x780\n\t0x781: 0x3c06, 0x783: 0xa000, 0x784: 0x3c0d, 0x785: 0xa000,\n\t0x787: 0x3c14, 0x788: 0xa000, 0x789: 0x3c1b,\n\t0x78d: 0xa000,\n\t0x7a0: 0x2f65, 0x7a1: 0xa000, 0x7a2: 0x3c29,\n\t0x7a4: 0xa000, 0x7a5: 0xa000,\n\t0x7ad: 0x3c22, 0x7ae: 0x2f60, 0x7af: 0x2f6a,\n\t0x7b0: 0x3c30, 0x7b1: 0x3c37, 0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0x3c3e, 0x7b5: 0x3c45,\n\t0x7b6: 0xa000, 0x7b7: 0xa000, 0x7b8: 0x3c4c, 0x7b9: 0x3c53, 0x7ba: 0xa000, 0x7bb: 0xa000,\n\t0x7bc: 0xa000, 0x7bd: 0xa000,\n\t// Block 0x1f, offset 0x7c0\n\t0x7c0: 0x3c5a, 0x7c1: 0x3c61, 0x7c2: 0xa000, 0x7c3: 0xa000, 0x7c4: 0x3c76, 0x7c5: 0x3c7d,\n\t0x7c6: 0xa000, 0x7c7: 0xa000, 0x7c8: 0x3c84, 0x7c9: 0x3c8b,\n\t0x7d1: 0xa000,\n\t0x7d2: 0xa000,\n\t0x7e2: 0xa000,\n\t0x7e8: 0xa000, 0x7e9: 0xa000,\n\t0x7eb: 0xa000, 0x7ec: 0x3ca0, 0x7ed: 0x3ca7, 0x7ee: 0x3cae, 0x7ef: 0x3cb5,\n\t0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0xa000, 0x7f5: 0xa000,\n\t// Block 0x20, offset 0x800\n\t0x820: 0x0023, 0x821: 0x0025, 0x822: 0x0027, 0x823: 0x0029,\n\t0x824: 0x002b, 0x825: 0x002d, 0x826: 0x002f, 0x827: 0x0031, 0x828: 0x0033, 0x829: 0x1882,\n\t0x82a: 0x1885, 0x82b: 0x1888, 0x82c: 0x188b, 0x82d: 0x188e, 0x82e: 0x1891, 0x82f: 0x1894,\n\t0x830: 0x1897, 0x831: 0x189a, 0x832: 0x189d, 0x833: 0x18a6, 0x834: 0x1a68, 0x835: 0x1a6c,\n\t0x836: 0x1a70, 0x837: 0x1a74, 0x838: 0x1a78, 0x839: 0x1a7c, 0x83a: 0x1a80, 0x83b: 0x1a84,\n\t0x83c: 0x1a88, 0x83d: 0x1c80, 0x83e: 0x1c85, 0x83f: 0x1c8a,\n\t// Block 0x21, offset 0x840\n\t0x840: 0x1c8f, 0x841: 0x1c94, 0x842: 0x1c99, 0x843: 0x1c9e, 0x844: 0x1ca3, 0x845: 0x1ca8,\n\t0x846: 0x1cad, 0x847: 0x1cb2, 0x848: 0x187f, 0x849: 0x18a3, 0x84a: 0x18c7, 0x84b: 0x18eb,\n\t0x84c: 0x190f, 0x84d: 0x1918, 0x84e: 0x191e, 0x84f: 0x1924, 0x850: 0x192a, 0x851: 0x1b60,\n\t0x852: 0x1b64, 0x853: 0x1b68, 0x854: 0x1b6c, 0x855: 0x1b70, 0x856: 0x1b74, 0x857: 0x1b78,\n\t0x858: 0x1b7c, 0x859: 0x1b80, 0x85a: 0x1b84, 0x85b: 0x1b88, 0x85c: 0x1af4, 0x85d: 0x1af8,\n\t0x85e: 0x1afc, 0x85f: 0x1b00, 0x860: 0x1b04, 0x861: 0x1b08, 0x862: 0x1b0c, 0x863: 0x1b10,\n\t0x864: 0x1b14, 0x865: 0x1b18, 0x866: 0x1b1c, 0x867: 0x1b20, 0x868: 0x1b24, 0x869: 0x1b28,\n\t0x86a: 0x1b2c, 0x86b: 0x1b30, 0x86c: 0x1b34, 0x86d: 0x1b38, 0x86e: 0x1b3c, 0x86f: 0x1b40,\n\t0x870: 0x1b44, 0x871: 0x1b48, 0x872: 0x1b4c, 0x873: 0x1b50, 0x874: 0x1b54, 0x875: 0x1b58,\n\t0x876: 0x0043, 0x877: 0x0045, 0x878: 0x0047, 0x879: 0x0049, 0x87a: 0x004b, 0x87b: 0x004d,\n\t0x87c: 0x004f, 0x87d: 0x0051, 0x87e: 0x0053, 0x87f: 0x0055,\n\t// Block 0x22, offset 0x880\n\t0x880: 0x06bf, 0x881: 0x06e3, 0x882: 0x06ef, 0x883: 0x06ff, 0x884: 0x0707, 0x885: 0x0713,\n\t0x886: 0x071b, 0x887: 0x0723, 0x888: 0x072f, 0x889: 0x0783, 0x88a: 0x079b, 0x88b: 0x07ab,\n\t0x88c: 0x07bb, 0x88d: 0x07cb, 0x88e: 0x07db, 0x88f: 0x07fb, 0x890: 0x07ff, 0x891: 0x0803,\n\t0x892: 0x0837, 0x893: 0x085f, 0x894: 0x086f, 0x895: 0x0877, 0x896: 0x087b, 0x897: 0x0887,\n\t0x898: 0x08a3, 0x899: 0x08a7, 0x89a: 0x08bf, 0x89b: 0x08c3, 0x89c: 0x08cb, 0x89d: 0x08db,\n\t0x89e: 0x0977, 0x89f: 0x098b, 0x8a0: 0x09cb, 0x8a1: 0x09df, 0x8a2: 0x09e7, 0x8a3: 0x09eb,\n\t0x8a4: 0x09fb, 0x8a5: 0x0a17, 0x8a6: 0x0a43, 0x8a7: 0x0a4f, 0x8a8: 0x0a6f, 0x8a9: 0x0a7b,\n\t0x8aa: 0x0a7f, 0x8ab: 0x0a83, 0x8ac: 0x0a9b, 0x8ad: 0x0a9f, 0x8ae: 0x0acb, 0x8af: 0x0ad7,\n\t0x8b0: 0x0adf, 0x8b1: 0x0ae7, 0x8b2: 0x0af7, 0x8b3: 0x0aff, 0x8b4: 0x0b07, 0x8b5: 0x0b33,\n\t0x8b6: 0x0b37, 0x8b7: 0x0b3f, 0x8b8: 0x0b43, 0x8b9: 0x0b4b, 0x8ba: 0x0b53, 0x8bb: 0x0b63,\n\t0x8bc: 0x0b7f, 0x8bd: 0x0bf7, 0x8be: 0x0c0b, 0x8bf: 0x0c0f,\n\t// Block 0x23, offset 0x8c0\n\t0x8c0: 0x0c8f, 0x8c1: 0x0c93, 0x8c2: 0x0ca7, 0x8c3: 0x0cab, 0x8c4: 0x0cb3, 0x8c5: 0x0cbb,\n\t0x8c6: 0x0cc3, 0x8c7: 0x0ccf, 0x8c8: 0x0cf7, 0x8c9: 0x0d07, 0x8ca: 0x0d1b, 0x8cb: 0x0d8b,\n\t0x8cc: 0x0d97, 0x8cd: 0x0da7, 0x8ce: 0x0db3, 0x8cf: 0x0dbf, 0x8d0: 0x0dc7, 0x8d1: 0x0dcb,\n\t0x8d2: 0x0dcf, 0x8d3: 0x0dd3, 0x8d4: 0x0dd7, 0x8d5: 0x0e8f, 0x8d6: 0x0ed7, 0x8d7: 0x0ee3,\n\t0x8d8: 0x0ee7, 0x8d9: 0x0eeb, 0x8da: 0x0eef, 0x8db: 0x0ef7, 0x8dc: 0x0efb, 0x8dd: 0x0f0f,\n\t0x8de: 0x0f2b, 0x8df: 0x0f33, 0x8e0: 0x0f73, 0x8e1: 0x0f77, 0x8e2: 0x0f7f, 0x8e3: 0x0f83,\n\t0x8e4: 0x0f8b, 0x8e5: 0x0f8f, 0x8e6: 0x0fb3, 0x8e7: 0x0fb7, 0x8e8: 0x0fd3, 0x8e9: 0x0fd7,\n\t0x8ea: 0x0fdb, 0x8eb: 0x0fdf, 0x8ec: 0x0ff3, 0x8ed: 0x1017, 0x8ee: 0x101b, 0x8ef: 0x101f,\n\t0x8f0: 0x1043, 0x8f1: 0x1083, 0x8f2: 0x1087, 0x8f3: 0x10a7, 0x8f4: 0x10b7, 0x8f5: 0x10bf,\n\t0x8f6: 0x10df, 0x8f7: 0x1103, 0x8f8: 0x1147, 0x8f9: 0x114f, 0x8fa: 0x1163, 0x8fb: 0x116f,\n\t0x8fc: 0x1177, 0x8fd: 0x117f, 0x8fe: 0x1183, 0x8ff: 0x1187,\n\t// Block 0x24, offset 0x900\n\t0x900: 0x119f, 0x901: 0x11a3, 0x902: 0x11bf, 0x903: 0x11c7, 0x904: 0x11cf, 0x905: 0x11d3,\n\t0x906: 0x11df, 0x907: 0x11e7, 0x908: 0x11eb, 0x909: 0x11ef, 0x90a: 0x11f7, 0x90b: 0x11fb,\n\t0x90c: 0x129b, 0x90d: 0x12af, 0x90e: 0x12e3, 0x90f: 0x12e7, 0x910: 0x12ef, 0x911: 0x131b,\n\t0x912: 0x1323, 0x913: 0x132b, 0x914: 0x1333, 0x915: 0x136f, 0x916: 0x1373, 0x917: 0x137b,\n\t0x918: 0x137f, 0x919: 0x1383, 0x91a: 0x13af, 0x91b: 0x13b3, 0x91c: 0x13bb, 0x91d: 0x13cf,\n\t0x91e: 0x13d3, 0x91f: 0x13ef, 0x920: 0x13f7, 0x921: 0x13fb, 0x922: 0x141f, 0x923: 0x143f,\n\t0x924: 0x1453, 0x925: 0x1457, 0x926: 0x145f, 0x927: 0x148b, 0x928: 0x148f, 0x929: 0x149f,\n\t0x92a: 0x14c3, 0x92b: 0x14cf, 0x92c: 0x14df, 0x92d: 0x14f7, 0x92e: 0x14ff, 0x92f: 0x1503,\n\t0x930: 0x1507, 0x931: 0x150b, 0x932: 0x1517, 0x933: 0x151b, 0x934: 0x1523, 0x935: 0x153f,\n\t0x936: 0x1543, 0x937: 0x1547, 0x938: 0x155f, 0x939: 0x1563, 0x93a: 0x156b, 0x93b: 0x157f,\n\t0x93c: 0x1583, 0x93d: 0x1587, 0x93e: 0x158f, 0x93f: 0x1593,\n\t// Block 0x25, offset 0x940\n\t0x946: 0xa000, 0x94b: 0xa000,\n\t0x94c: 0x3f08, 0x94d: 0xa000, 0x94e: 0x3f10, 0x94f: 0xa000, 0x950: 0x3f18, 0x951: 0xa000,\n\t0x952: 0x3f20, 0x953: 0xa000, 0x954: 0x3f28, 0x955: 0xa000, 0x956: 0x3f30, 0x957: 0xa000,\n\t0x958: 0x3f38, 0x959: 0xa000, 0x95a: 0x3f40, 0x95b: 0xa000, 0x95c: 0x3f48, 0x95d: 0xa000,\n\t0x95e: 0x3f50, 0x95f: 0xa000, 0x960: 0x3f58, 0x961: 0xa000, 0x962: 0x3f60,\n\t0x964: 0xa000, 0x965: 0x3f68, 0x966: 0xa000, 0x967: 0x3f70, 0x968: 0xa000, 0x969: 0x3f78,\n\t0x96f: 0xa000,\n\t0x970: 0x3f80, 0x971: 0x3f88, 0x972: 0xa000, 0x973: 0x3f90, 0x974: 0x3f98, 0x975: 0xa000,\n\t0x976: 0x3fa0, 0x977: 0x3fa8, 0x978: 0xa000, 0x979: 0x3fb0, 0x97a: 0x3fb8, 0x97b: 0xa000,\n\t0x97c: 0x3fc0, 0x97d: 0x3fc8,\n\t// Block 0x26, offset 0x980\n\t0x994: 0x3f00,\n\t0x999: 0x9903, 0x99a: 0x9903, 0x99b: 0x42dc, 0x99c: 0x42e2, 0x99d: 0xa000,\n\t0x99e: 0x3fd0, 0x99f: 0x26b4,\n\t0x9a6: 0xa000,\n\t0x9ab: 0xa000, 0x9ac: 0x3fe0, 0x9ad: 0xa000, 0x9ae: 0x3fe8, 0x9af: 0xa000,\n\t0x9b0: 0x3ff0, 0x9b1: 0xa000, 0x9b2: 0x3ff8, 0x9b3: 0xa000, 0x9b4: 0x4000, 0x9b5: 0xa000,\n\t0x9b6: 0x4008, 0x9b7: 0xa000, 0x9b8: 0x4010, 0x9b9: 0xa000, 0x9ba: 0x4018, 0x9bb: 0xa000,\n\t0x9bc: 0x4020, 0x9bd: 0xa000, 0x9be: 0x4028, 0x9bf: 0xa000,\n\t// Block 0x27, offset 0x9c0\n\t0x9c0: 0x4030, 0x9c1: 0xa000, 0x9c2: 0x4038, 0x9c4: 0xa000, 0x9c5: 0x4040,\n\t0x9c6: 0xa000, 0x9c7: 0x4048, 0x9c8: 0xa000, 0x9c9: 0x4050,\n\t0x9cf: 0xa000, 0x9d0: 0x4058, 0x9d1: 0x4060,\n\t0x9d2: 0xa000, 0x9d3: 0x4068, 0x9d4: 0x4070, 0x9d5: 0xa000, 0x9d6: 0x4078, 0x9d7: 0x4080,\n\t0x9d8: 0xa000, 0x9d9: 0x4088, 0x9da: 0x4090, 0x9db: 0xa000, 0x9dc: 0x4098, 0x9dd: 0x40a0,\n\t0x9ef: 0xa000,\n\t0x9f0: 0xa000, 0x9f1: 0xa000, 0x9f2: 0xa000, 0x9f4: 0x3fd8,\n\t0x9f7: 0x40a8, 0x9f8: 0x40b0, 0x9f9: 0x40b8, 0x9fa: 0x40c0,\n\t0x9fd: 0xa000, 0x9fe: 0x40c8, 0x9ff: 0x26c9,\n\t// Block 0x28, offset 0xa00\n\t0xa00: 0x0367, 0xa01: 0x032b, 0xa02: 0x032f, 0xa03: 0x0333, 0xa04: 0x037b, 0xa05: 0x0337,\n\t0xa06: 0x033b, 0xa07: 0x033f, 0xa08: 0x0343, 0xa09: 0x0347, 0xa0a: 0x034b, 0xa0b: 0x034f,\n\t0xa0c: 0x0353, 0xa0d: 0x0357, 0xa0e: 0x035b, 0xa0f: 0x49bd, 0xa10: 0x49c3, 0xa11: 0x49c9,\n\t0xa12: 0x49cf, 0xa13: 0x49d5, 0xa14: 0x49db, 0xa15: 0x49e1, 0xa16: 0x49e7, 0xa17: 0x49ed,\n\t0xa18: 0x49f3, 0xa19: 0x49f9, 0xa1a: 0x49ff, 0xa1b: 0x4a05, 0xa1c: 0x4a0b, 0xa1d: 0x4a11,\n\t0xa1e: 0x4a17, 0xa1f: 0x4a1d, 0xa20: 0x4a23, 0xa21: 0x4a29, 0xa22: 0x4a2f, 0xa23: 0x4a35,\n\t0xa24: 0x03c3, 0xa25: 0x035f, 0xa26: 0x0363, 0xa27: 0x03e7, 0xa28: 0x03eb, 0xa29: 0x03ef,\n\t0xa2a: 0x03f3, 0xa2b: 0x03f7, 0xa2c: 0x03fb, 0xa2d: 0x03ff, 0xa2e: 0x036b, 0xa2f: 0x0403,\n\t0xa30: 0x0407, 0xa31: 0x036f, 0xa32: 0x0373, 0xa33: 0x0377, 0xa34: 0x037f, 0xa35: 0x0383,\n\t0xa36: 0x0387, 0xa37: 0x038b, 0xa38: 0x038f, 0xa39: 0x0393, 0xa3a: 0x0397, 0xa3b: 0x039b,\n\t0xa3c: 0x039f, 0xa3d: 0x03a3, 0xa3e: 0x03a7, 0xa3f: 0x03ab,\n\t// Block 0x29, offset 0xa40\n\t0xa40: 0x03af, 0xa41: 0x03b3, 0xa42: 0x040b, 0xa43: 0x040f, 0xa44: 0x03b7, 0xa45: 0x03bb,\n\t0xa46: 0x03bf, 0xa47: 0x03c7, 0xa48: 0x03cb, 0xa49: 0x03cf, 0xa4a: 0x03d3, 0xa4b: 0x03d7,\n\t0xa4c: 0x03db, 0xa4d: 0x03df, 0xa4e: 0x03e3,\n\t0xa52: 0x06bf, 0xa53: 0x071b, 0xa54: 0x06cb, 0xa55: 0x097b, 0xa56: 0x06cf, 0xa57: 0x06e7,\n\t0xa58: 0x06d3, 0xa59: 0x0f93, 0xa5a: 0x0707, 0xa5b: 0x06db, 0xa5c: 0x06c3, 0xa5d: 0x09ff,\n\t0xa5e: 0x098f, 0xa5f: 0x072f,\n\t// Block 0x2a, offset 0xa80\n\t0xa80: 0x2054, 0xa81: 0x205a, 0xa82: 0x2060, 0xa83: 0x2066, 0xa84: 0x206c, 0xa85: 0x2072,\n\t0xa86: 0x2078, 0xa87: 0x207e, 0xa88: 0x2084, 0xa89: 0x208a, 0xa8a: 0x2090, 0xa8b: 0x2096,\n\t0xa8c: 0x209c, 0xa8d: 0x20a2, 0xa8e: 0x2726, 0xa8f: 0x272f, 0xa90: 0x2738, 0xa91: 0x2741,\n\t0xa92: 0x274a, 0xa93: 0x2753, 0xa94: 0x275c, 0xa95: 0x2765, 0xa96: 0x276e, 0xa97: 0x2780,\n\t0xa98: 0x2789, 0xa99: 0x2792, 0xa9a: 0x279b, 0xa9b: 0x27a4, 0xa9c: 0x2777, 0xa9d: 0x2bac,\n\t0xa9e: 0x2aed, 0xaa0: 0x20a8, 0xaa1: 0x20c0, 0xaa2: 0x20b4, 0xaa3: 0x2108,\n\t0xaa4: 0x20c6, 0xaa5: 0x20e4, 0xaa6: 0x20ae, 0xaa7: 0x20de, 0xaa8: 0x20ba, 0xaa9: 0x20f0,\n\t0xaaa: 0x2120, 0xaab: 0x213e, 0xaac: 0x2138, 0xaad: 0x212c, 0xaae: 0x217a, 0xaaf: 0x210e,\n\t0xab0: 0x211a, 0xab1: 0x2132, 0xab2: 0x2126, 0xab3: 0x2150, 0xab4: 0x20fc, 0xab5: 0x2144,\n\t0xab6: 0x216e, 0xab7: 0x2156, 0xab8: 0x20ea, 0xab9: 0x20cc, 0xaba: 0x2102, 0xabb: 0x2114,\n\t0xabc: 0x214a, 0xabd: 0x20d2, 0xabe: 0x2174, 0xabf: 0x20f6,\n\t// Block 0x2b, offset 0xac0\n\t0xac0: 0x215c, 0xac1: 0x20d8, 0xac2: 0x2162, 0xac3: 0x2168, 0xac4: 0x092f, 0xac5: 0x0b03,\n\t0xac6: 0x0ca7, 0xac7: 0x10c7,\n\t0xad0: 0x1bc4, 0xad1: 0x18a9,\n\t0xad2: 0x18ac, 0xad3: 0x18af, 0xad4: 0x18b2, 0xad5: 0x18b5, 0xad6: 0x18b8, 0xad7: 0x18bb,\n\t0xad8: 0x18be, 0xad9: 0x18c1, 0xada: 0x18ca, 0xadb: 0x18cd, 0xadc: 0x18d0, 0xadd: 0x18d3,\n\t0xade: 0x18d6, 0xadf: 0x18d9, 0xae0: 0x0313, 0xae1: 0x031b, 0xae2: 0x031f, 0xae3: 0x0327,\n\t0xae4: 0x032b, 0xae5: 0x032f, 0xae6: 0x0337, 0xae7: 0x033f, 0xae8: 0x0343, 0xae9: 0x034b,\n\t0xaea: 0x034f, 0xaeb: 0x0353, 0xaec: 0x0357, 0xaed: 0x035b, 0xaee: 0x2e18, 0xaef: 0x2e20,\n\t0xaf0: 0x2e28, 0xaf1: 0x2e30, 0xaf2: 0x2e38, 0xaf3: 0x2e40, 0xaf4: 0x2e48, 0xaf5: 0x2e50,\n\t0xaf6: 0x2e60, 0xaf7: 0x2e68, 0xaf8: 0x2e70, 0xaf9: 0x2e78, 0xafa: 0x2e80, 0xafb: 0x2e88,\n\t0xafc: 0x2ed3, 0xafd: 0x2e9b, 0xafe: 0x2e58,\n\t// Block 0x2c, offset 0xb00\n\t0xb00: 0x06bf, 0xb01: 0x071b, 0xb02: 0x06cb, 0xb03: 0x097b, 0xb04: 0x071f, 0xb05: 0x07af,\n\t0xb06: 0x06c7, 0xb07: 0x07ab, 0xb08: 0x070b, 0xb09: 0x0887, 0xb0a: 0x0d07, 0xb0b: 0x0e8f,\n\t0xb0c: 0x0dd7, 0xb0d: 0x0d1b, 0xb0e: 0x145f, 0xb0f: 0x098b, 0xb10: 0x0ccf, 0xb11: 0x0d4b,\n\t0xb12: 0x0d0b, 0xb13: 0x104b, 0xb14: 0x08fb, 0xb15: 0x0f03, 0xb16: 0x1387, 0xb17: 0x105f,\n\t0xb18: 0x0843, 0xb19: 0x108f, 0xb1a: 0x0f9b, 0xb1b: 0x0a17, 0xb1c: 0x140f, 0xb1d: 0x077f,\n\t0xb1e: 0x08ab, 0xb1f: 0x0df7, 0xb20: 0x1527, 0xb21: 0x0743, 0xb22: 0x07d3, 0xb23: 0x0d9b,\n\t0xb24: 0x06cf, 0xb25: 0x06e7, 0xb26: 0x06d3, 0xb27: 0x0adb, 0xb28: 0x08ef, 0xb29: 0x087f,\n\t0xb2a: 0x0a57, 0xb2b: 0x0a4b, 0xb2c: 0x0feb, 0xb2d: 0x073f, 0xb2e: 0x139b, 0xb2f: 0x089b,\n\t0xb30: 0x09f3, 0xb31: 0x18dc, 0xb32: 0x18df, 0xb33: 0x18e2, 0xb34: 0x18e5, 0xb35: 0x18ee,\n\t0xb36: 0x18f1, 0xb37: 0x18f4, 0xb38: 0x18f7, 0xb39: 0x18fa, 0xb3a: 0x18fd, 0xb3b: 0x1900,\n\t0xb3c: 0x1903, 0xb3d: 0x1906, 0xb3e: 0x1909, 0xb3f: 0x1912,\n\t// Block 0x2d, offset 0xb40\n\t0xb40: 0x1cc6, 0xb41: 0x1cd5, 0xb42: 0x1ce4, 0xb43: 0x1cf3, 0xb44: 0x1d02, 0xb45: 0x1d11,\n\t0xb46: 0x1d20, 0xb47: 0x1d2f, 0xb48: 0x1d3e, 0xb49: 0x218c, 0xb4a: 0x219e, 0xb4b: 0x21b0,\n\t0xb4c: 0x1954, 0xb4d: 0x1c04, 0xb4e: 0x19d2, 0xb4f: 0x1ba8, 0xb50: 0x04cb, 0xb51: 0x04d3,\n\t0xb52: 0x04db, 0xb53: 0x04e3, 0xb54: 0x04eb, 0xb55: 0x04ef, 0xb56: 0x04f3, 0xb57: 0x04f7,\n\t0xb58: 0x04fb, 0xb59: 0x04ff, 0xb5a: 0x0503, 0xb5b: 0x0507, 0xb5c: 0x050b, 0xb5d: 0x050f,\n\t0xb5e: 0x0513, 0xb5f: 0x0517, 0xb60: 0x051b, 0xb61: 0x0523, 0xb62: 0x0527, 0xb63: 0x052b,\n\t0xb64: 0x052f, 0xb65: 0x0533, 0xb66: 0x0537, 0xb67: 0x053b, 0xb68: 0x053f, 0xb69: 0x0543,\n\t0xb6a: 0x0547, 0xb6b: 0x054b, 0xb6c: 0x054f, 0xb6d: 0x0553, 0xb6e: 0x0557, 0xb6f: 0x055b,\n\t0xb70: 0x055f, 0xb71: 0x0563, 0xb72: 0x0567, 0xb73: 0x056f, 0xb74: 0x0577, 0xb75: 0x057f,\n\t0xb76: 0x0583, 0xb77: 0x0587, 0xb78: 0x058b, 0xb79: 0x058f, 0xb7a: 0x0593, 0xb7b: 0x0597,\n\t0xb7c: 0x059b, 0xb7d: 0x059f, 0xb7e: 0x05a3,\n\t// Block 0x2e, offset 0xb80\n\t0xb80: 0x2b0c, 0xb81: 0x29a8, 0xb82: 0x2b1c, 0xb83: 0x2880, 0xb84: 0x2ee4, 0xb85: 0x288a,\n\t0xb86: 0x2894, 0xb87: 0x2f28, 0xb88: 0x29b5, 0xb89: 0x289e, 0xb8a: 0x28a8, 0xb8b: 0x28b2,\n\t0xb8c: 0x29dc, 0xb8d: 0x29e9, 0xb8e: 0x29c2, 0xb8f: 0x29cf, 0xb90: 0x2ea9, 0xb91: 0x29f6,\n\t0xb92: 0x2a03, 0xb93: 0x2bbe, 0xb94: 0x26bb, 0xb95: 0x2bd1, 0xb96: 0x2be4, 0xb97: 0x2b2c,\n\t0xb98: 0x2a10, 0xb99: 0x2bf7, 0xb9a: 0x2c0a, 0xb9b: 0x2a1d, 0xb9c: 0x28bc, 0xb9d: 0x28c6,\n\t0xb9e: 0x2eb7, 0xb9f: 0x2a2a, 0xba0: 0x2b3c, 0xba1: 0x2ef5, 0xba2: 0x28d0, 0xba3: 0x28da,\n\t0xba4: 0x2a37, 0xba5: 0x28e4, 0xba6: 0x28ee, 0xba7: 0x26d0, 0xba8: 0x26d7, 0xba9: 0x28f8,\n\t0xbaa: 0x2902, 0xbab: 0x2c1d, 0xbac: 0x2a44, 0xbad: 0x2b4c, 0xbae: 0x2c30, 0xbaf: 0x2a51,\n\t0xbb0: 0x2916, 0xbb1: 0x290c, 0xbb2: 0x2f3c, 0xbb3: 0x2a5e, 0xbb4: 0x2c43, 0xbb5: 0x2920,\n\t0xbb6: 0x2b5c, 0xbb7: 0x292a, 0xbb8: 0x2a78, 0xbb9: 0x2934, 0xbba: 0x2a85, 0xbbb: 0x2f06,\n\t0xbbc: 0x2a6b, 0xbbd: 0x2b6c, 0xbbe: 0x2a92, 0xbbf: 0x26de,\n\t// Block 0x2f, offset 0xbc0\n\t0xbc0: 0x2f17, 0xbc1: 0x293e, 0xbc2: 0x2948, 0xbc3: 0x2a9f, 0xbc4: 0x2952, 0xbc5: 0x295c,\n\t0xbc6: 0x2966, 0xbc7: 0x2b7c, 0xbc8: 0x2aac, 0xbc9: 0x26e5, 0xbca: 0x2c56, 0xbcb: 0x2e90,\n\t0xbcc: 0x2b8c, 0xbcd: 0x2ab9, 0xbce: 0x2ec5, 0xbcf: 0x2970, 0xbd0: 0x297a, 0xbd1: 0x2ac6,\n\t0xbd2: 0x26ec, 0xbd3: 0x2ad3, 0xbd4: 0x2b9c, 0xbd5: 0x26f3, 0xbd6: 0x2c69, 0xbd7: 0x2984,\n\t0xbd8: 0x1cb7, 0xbd9: 0x1ccb, 0xbda: 0x1cda, 0xbdb: 0x1ce9, 0xbdc: 0x1cf8, 0xbdd: 0x1d07,\n\t0xbde: 0x1d16, 0xbdf: 0x1d25, 0xbe0: 0x1d34, 0xbe1: 0x1d43, 0xbe2: 0x2192, 0xbe3: 0x21a4,\n\t0xbe4: 0x21b6, 0xbe5: 0x21c2, 0xbe6: 0x21ce, 0xbe7: 0x21da, 0xbe8: 0x21e6, 0xbe9: 0x21f2,\n\t0xbea: 0x21fe, 0xbeb: 0x220a, 0xbec: 0x2246, 0xbed: 0x2252, 0xbee: 0x225e, 0xbef: 0x226a,\n\t0xbf0: 0x2276, 0xbf1: 0x1c14, 0xbf2: 0x19c6, 0xbf3: 0x1936, 0xbf4: 0x1be4, 0xbf5: 0x1a47,\n\t0xbf6: 0x1a56, 0xbf7: 0x19cc, 0xbf8: 0x1bfc, 0xbf9: 0x1c00, 0xbfa: 0x1960, 0xbfb: 0x2701,\n\t0xbfc: 0x270f, 0xbfd: 0x26fa, 0xbfe: 0x2708, 0xbff: 0x2ae0,\n\t// Block 0x30, offset 0xc00\n\t0xc00: 0x1a4a, 0xc01: 0x1a32, 0xc02: 0x1c60, 0xc03: 0x1a1a, 0xc04: 0x19f3, 0xc05: 0x1969,\n\t0xc06: 0x1978, 0xc07: 0x1948, 0xc08: 0x1bf0, 0xc09: 0x1d52, 0xc0a: 0x1a4d, 0xc0b: 0x1a35,\n\t0xc0c: 0x1c64, 0xc0d: 0x1c70, 0xc0e: 0x1a26, 0xc0f: 0x19fc, 0xc10: 0x1957, 0xc11: 0x1c1c,\n\t0xc12: 0x1bb0, 0xc13: 0x1b9c, 0xc14: 0x1bcc, 0xc15: 0x1c74, 0xc16: 0x1a29, 0xc17: 0x19c9,\n\t0xc18: 0x19ff, 0xc19: 0x19de, 0xc1a: 0x1a41, 0xc1b: 0x1c78, 0xc1c: 0x1a2c, 0xc1d: 0x19c0,\n\t0xc1e: 0x1a02, 0xc1f: 0x1c3c, 0xc20: 0x1bf4, 0xc21: 0x1a14, 0xc22: 0x1c24, 0xc23: 0x1c40,\n\t0xc24: 0x1bf8, 0xc25: 0x1a17, 0xc26: 0x1c28, 0xc27: 0x22e8, 0xc28: 0x22fc, 0xc29: 0x1996,\n\t0xc2a: 0x1c20, 0xc2b: 0x1bb4, 0xc2c: 0x1ba0, 0xc2d: 0x1c48, 0xc2e: 0x2716, 0xc2f: 0x27ad,\n\t0xc30: 0x1a59, 0xc31: 0x1a44, 0xc32: 0x1c7c, 0xc33: 0x1a2f, 0xc34: 0x1a50, 0xc35: 0x1a38,\n\t0xc36: 0x1c68, 0xc37: 0x1a1d, 0xc38: 0x19f6, 0xc39: 0x1981, 0xc3a: 0x1a53, 0xc3b: 0x1a3b,\n\t0xc3c: 0x1c6c, 0xc3d: 0x1a20, 0xc3e: 0x19f9, 0xc3f: 0x1984,\n\t// Block 0x31, offset 0xc40\n\t0xc40: 0x1c2c, 0xc41: 0x1bb8, 0xc42: 0x1d4d, 0xc43: 0x1939, 0xc44: 0x19ba, 0xc45: 0x19bd,\n\t0xc46: 0x22f5, 0xc47: 0x1b94, 0xc48: 0x19c3, 0xc49: 0x194b, 0xc4a: 0x19e1, 0xc4b: 0x194e,\n\t0xc4c: 0x19ea, 0xc4d: 0x196c, 0xc4e: 0x196f, 0xc4f: 0x1a05, 0xc50: 0x1a0b, 0xc51: 0x1a0e,\n\t0xc52: 0x1c30, 0xc53: 0x1a11, 0xc54: 0x1a23, 0xc55: 0x1c38, 0xc56: 0x1c44, 0xc57: 0x1990,\n\t0xc58: 0x1d57, 0xc59: 0x1bbc, 0xc5a: 0x1993, 0xc5b: 0x1a5c, 0xc5c: 0x19a5, 0xc5d: 0x19b4,\n\t0xc5e: 0x22e2, 0xc5f: 0x22dc, 0xc60: 0x1cc1, 0xc61: 0x1cd0, 0xc62: 0x1cdf, 0xc63: 0x1cee,\n\t0xc64: 0x1cfd, 0xc65: 0x1d0c, 0xc66: 0x1d1b, 0xc67: 0x1d2a, 0xc68: 0x1d39, 0xc69: 0x2186,\n\t0xc6a: 0x2198, 0xc6b: 0x21aa, 0xc6c: 0x21bc, 0xc6d: 0x21c8, 0xc6e: 0x21d4, 0xc6f: 0x21e0,\n\t0xc70: 0x21ec, 0xc71: 0x21f8, 0xc72: 0x2204, 0xc73: 0x2240, 0xc74: 0x224c, 0xc75: 0x2258,\n\t0xc76: 0x2264, 0xc77: 0x2270, 0xc78: 0x227c, 0xc79: 0x2282, 0xc7a: 0x2288, 0xc7b: 0x228e,\n\t0xc7c: 0x2294, 0xc7d: 0x22a6, 0xc7e: 0x22ac, 0xc7f: 0x1c10,\n\t// Block 0x32, offset 0xc80\n\t0xc80: 0x1377, 0xc81: 0x0cfb, 0xc82: 0x13d3, 0xc83: 0x139f, 0xc84: 0x0e57, 0xc85: 0x06eb,\n\t0xc86: 0x08df, 0xc87: 0x162b, 0xc88: 0x162b, 0xc89: 0x0a0b, 0xc8a: 0x145f, 0xc8b: 0x0943,\n\t0xc8c: 0x0a07, 0xc8d: 0x0bef, 0xc8e: 0x0fcf, 0xc8f: 0x115f, 0xc90: 0x1297, 0xc91: 0x12d3,\n\t0xc92: 0x1307, 0xc93: 0x141b, 0xc94: 0x0d73, 0xc95: 0x0dff, 0xc96: 0x0eab, 0xc97: 0x0f43,\n\t0xc98: 0x125f, 0xc99: 0x1447, 0xc9a: 0x1573, 0xc9b: 0x070f, 0xc9c: 0x08b3, 0xc9d: 0x0d87,\n\t0xc9e: 0x0ecf, 0xc9f: 0x1293, 0xca0: 0x15c3, 0xca1: 0x0ab3, 0xca2: 0x0e77, 0xca3: 0x1283,\n\t0xca4: 0x1317, 0xca5: 0x0c23, 0xca6: 0x11bb, 0xca7: 0x12df, 0xca8: 0x0b1f, 0xca9: 0x0d0f,\n\t0xcaa: 0x0e17, 0xcab: 0x0f1b, 0xcac: 0x1427, 0xcad: 0x074f, 0xcae: 0x07e7, 0xcaf: 0x0853,\n\t0xcb0: 0x0c8b, 0xcb1: 0x0d7f, 0xcb2: 0x0ecb, 0xcb3: 0x0fef, 0xcb4: 0x1177, 0xcb5: 0x128b,\n\t0xcb6: 0x12a3, 0xcb7: 0x13c7, 0xcb8: 0x14ef, 0xcb9: 0x15a3, 0xcba: 0x15bf, 0xcbb: 0x102b,\n\t0xcbc: 0x106b, 0xcbd: 0x1123, 0xcbe: 0x1243, 0xcbf: 0x147b,\n\t// Block 0x33, offset 0xcc0\n\t0xcc0: 0x15cb, 0xcc1: 0x134b, 0xcc2: 0x09c7, 0xcc3: 0x0b3b, 0xcc4: 0x10db, 0xcc5: 0x119b,\n\t0xcc6: 0x0eff, 0xcc7: 0x1033, 0xcc8: 0x1397, 0xcc9: 0x14e7, 0xcca: 0x09c3, 0xccb: 0x0a8f,\n\t0xccc: 0x0d77, 0xccd: 0x0e2b, 0xcce: 0x0e5f, 0xccf: 0x1113, 0xcd0: 0x113b, 0xcd1: 0x14a7,\n\t0xcd2: 0x084f, 0xcd3: 0x11a7, 0xcd4: 0x07f3, 0xcd5: 0x07ef, 0xcd6: 0x1097, 0xcd7: 0x1127,\n\t0xcd8: 0x125b, 0xcd9: 0x14af, 0xcda: 0x1367, 0xcdb: 0x0c27, 0xcdc: 0x0d73, 0xcdd: 0x1357,\n\t0xcde: 0x06f7, 0xcdf: 0x0a63, 0xce0: 0x0b93, 0xce1: 0x0f2f, 0xce2: 0x0faf, 0xce3: 0x0873,\n\t0xce4: 0x103b, 0xce5: 0x075f, 0xce6: 0x0b77, 0xce7: 0x06d7, 0xce8: 0x0deb, 0xce9: 0x0ca3,\n\t0xcea: 0x110f, 0xceb: 0x08c7, 0xcec: 0x09b3, 0xced: 0x0ffb, 0xcee: 0x1263, 0xcef: 0x133b,\n\t0xcf0: 0x0db7, 0xcf1: 0x13f7, 0xcf2: 0x0de3, 0xcf3: 0x0c37, 0xcf4: 0x121b, 0xcf5: 0x0c57,\n\t0xcf6: 0x0fab, 0xcf7: 0x072b, 0xcf8: 0x07a7, 0xcf9: 0x07eb, 0xcfa: 0x0d53, 0xcfb: 0x10fb,\n\t0xcfc: 0x11f3, 0xcfd: 0x1347, 0xcfe: 0x145b, 0xcff: 0x085b,\n\t// Block 0x34, offset 0xd00\n\t0xd00: 0x090f, 0xd01: 0x0a17, 0xd02: 0x0b2f, 0xd03: 0x0cbf, 0xd04: 0x0e7b, 0xd05: 0x103f,\n\t0xd06: 0x1497, 0xd07: 0x157b, 0xd08: 0x15cf, 0xd09: 0x15e7, 0xd0a: 0x0837, 0xd0b: 0x0cf3,\n\t0xd0c: 0x0da3, 0xd0d: 0x13eb, 0xd0e: 0x0afb, 0xd0f: 0x0bd7, 0xd10: 0x0bf3, 0xd11: 0x0c83,\n\t0xd12: 0x0e6b, 0xd13: 0x0eb7, 0xd14: 0x0f67, 0xd15: 0x108b, 0xd16: 0x112f, 0xd17: 0x1193,\n\t0xd18: 0x13db, 0xd19: 0x126b, 0xd1a: 0x1403, 0xd1b: 0x147f, 0xd1c: 0x080f, 0xd1d: 0x083b,\n\t0xd1e: 0x0923, 0xd1f: 0x0ea7, 0xd20: 0x12f3, 0xd21: 0x133b, 0xd22: 0x0b1b, 0xd23: 0x0b8b,\n\t0xd24: 0x0c4f, 0xd25: 0x0daf, 0xd26: 0x10d7, 0xd27: 0x0f23, 0xd28: 0x073b, 0xd29: 0x097f,\n\t0xd2a: 0x0a63, 0xd2b: 0x0ac7, 0xd2c: 0x0b97, 0xd2d: 0x0f3f, 0xd2e: 0x0f5b, 0xd2f: 0x116b,\n\t0xd30: 0x118b, 0xd31: 0x1463, 0xd32: 0x14e3, 0xd33: 0x14f3, 0xd34: 0x152f, 0xd35: 0x0753,\n\t0xd36: 0x107f, 0xd37: 0x144f, 0xd38: 0x14cb, 0xd39: 0x0baf, 0xd3a: 0x0717, 0xd3b: 0x0777,\n\t0xd3c: 0x0a67, 0xd3d: 0x0a87, 0xd3e: 0x0caf, 0xd3f: 0x0d73,\n\t// Block 0x35, offset 0xd40\n\t0xd40: 0x0ec3, 0xd41: 0x0fcb, 0xd42: 0x1277, 0xd43: 0x1417, 0xd44: 0x1623, 0xd45: 0x0ce3,\n\t0xd46: 0x14a3, 0xd47: 0x0833, 0xd48: 0x0d2f, 0xd49: 0x0d3b, 0xd4a: 0x0e0f, 0xd4b: 0x0e47,\n\t0xd4c: 0x0f4b, 0xd4d: 0x0fa7, 0xd4e: 0x1027, 0xd4f: 0x110b, 0xd50: 0x153b, 0xd51: 0x07af,\n\t0xd52: 0x0c03, 0xd53: 0x14b3, 0xd54: 0x0767, 0xd55: 0x0aab, 0xd56: 0x0e2f, 0xd57: 0x13df,\n\t0xd58: 0x0b67, 0xd59: 0x0bb7, 0xd5a: 0x0d43, 0xd5b: 0x0f2f, 0xd5c: 0x14bb, 0xd5d: 0x0817,\n\t0xd5e: 0x08ff, 0xd5f: 0x0a97, 0xd60: 0x0cd3, 0xd61: 0x0d1f, 0xd62: 0x0d5f, 0xd63: 0x0df3,\n\t0xd64: 0x0f47, 0xd65: 0x0fbb, 0xd66: 0x1157, 0xd67: 0x12f7, 0xd68: 0x1303, 0xd69: 0x1457,\n\t0xd6a: 0x14d7, 0xd6b: 0x0883, 0xd6c: 0x0e4b, 0xd6d: 0x0903, 0xd6e: 0x0ec7, 0xd6f: 0x0f6b,\n\t0xd70: 0x1287, 0xd71: 0x14bf, 0xd72: 0x15ab, 0xd73: 0x15d3, 0xd74: 0x0d37, 0xd75: 0x0e27,\n\t0xd76: 0x11c3, 0xd77: 0x10b7, 0xd78: 0x10c3, 0xd79: 0x10e7, 0xd7a: 0x0f17, 0xd7b: 0x0e9f,\n\t0xd7c: 0x1363, 0xd7d: 0x0733, 0xd7e: 0x122b, 0xd7f: 0x081b,\n\t// Block 0x36, offset 0xd80\n\t0xd80: 0x080b, 0xd81: 0x0b0b, 0xd82: 0x0c2b, 0xd83: 0x10f3, 0xd84: 0x0a53, 0xd85: 0x0e03,\n\t0xd86: 0x0cef, 0xd87: 0x13e7, 0xd88: 0x12e7, 0xd89: 0x14ab, 0xd8a: 0x1323, 0xd8b: 0x0b27,\n\t0xd8c: 0x0787, 0xd8d: 0x095b, 0xd90: 0x09af,\n\t0xd92: 0x0cdf, 0xd95: 0x07f7, 0xd96: 0x0f1f, 0xd97: 0x0fe3,\n\t0xd98: 0x1047, 0xd99: 0x1063, 0xd9a: 0x1067, 0xd9b: 0x107b, 0xd9c: 0x14fb, 0xd9d: 0x10eb,\n\t0xd9e: 0x116f, 0xda0: 0x128f, 0xda2: 0x1353,\n\t0xda5: 0x1407, 0xda6: 0x1433,\n\t0xdaa: 0x154f, 0xdab: 0x1553, 0xdac: 0x1557, 0xdad: 0x15bb, 0xdae: 0x142b, 0xdaf: 0x14c7,\n\t0xdb0: 0x0757, 0xdb1: 0x077b, 0xdb2: 0x078f, 0xdb3: 0x084b, 0xdb4: 0x0857, 0xdb5: 0x0897,\n\t0xdb6: 0x094b, 0xdb7: 0x0967, 0xdb8: 0x096f, 0xdb9: 0x09ab, 0xdba: 0x09b7, 0xdbb: 0x0a93,\n\t0xdbc: 0x0a9b, 0xdbd: 0x0ba3, 0xdbe: 0x0bcb, 0xdbf: 0x0bd3,\n\t// Block 0x37, offset 0xdc0\n\t0xdc0: 0x0beb, 0xdc1: 0x0c97, 0xdc2: 0x0cc7, 0xdc3: 0x0ce7, 0xdc4: 0x0d57, 0xdc5: 0x0e1b,\n\t0xdc6: 0x0e37, 0xdc7: 0x0e67, 0xdc8: 0x0ebb, 0xdc9: 0x0edb, 0xdca: 0x0f4f, 0xdcb: 0x102f,\n\t0xdcc: 0x104b, 0xdcd: 0x1053, 0xdce: 0x104f, 0xdcf: 0x1057, 0xdd0: 0x105b, 0xdd1: 0x105f,\n\t0xdd2: 0x1073, 0xdd3: 0x1077, 0xdd4: 0x109b, 0xdd5: 0x10af, 0xdd6: 0x10cb, 0xdd7: 0x112f,\n\t0xdd8: 0x1137, 0xdd9: 0x113f, 0xdda: 0x1153, 0xddb: 0x117b, 0xddc: 0x11cb, 0xddd: 0x11ff,\n\t0xdde: 0x11ff, 0xddf: 0x1267, 0xde0: 0x130f, 0xde1: 0x1327, 0xde2: 0x135b, 0xde3: 0x135f,\n\t0xde4: 0x13a3, 0xde5: 0x13a7, 0xde6: 0x13ff, 0xde7: 0x1407, 0xde8: 0x14db, 0xde9: 0x151f,\n\t0xdea: 0x1537, 0xdeb: 0x0b9b, 0xdec: 0x171e, 0xded: 0x11e3,\n\t0xdf0: 0x06df, 0xdf1: 0x07e3, 0xdf2: 0x07a3, 0xdf3: 0x074b, 0xdf4: 0x078b, 0xdf5: 0x07b7,\n\t0xdf6: 0x0847, 0xdf7: 0x0863, 0xdf8: 0x094b, 0xdf9: 0x0937, 0xdfa: 0x0947, 0xdfb: 0x0963,\n\t0xdfc: 0x09af, 0xdfd: 0x09bf, 0xdfe: 0x0a03, 0xdff: 0x0a0f,\n\t// Block 0x38, offset 0xe00\n\t0xe00: 0x0a2b, 0xe01: 0x0a3b, 0xe02: 0x0b23, 0xe03: 0x0b2b, 0xe04: 0x0b5b, 0xe05: 0x0b7b,\n\t0xe06: 0x0bab, 0xe07: 0x0bc3, 0xe08: 0x0bb3, 0xe09: 0x0bd3, 0xe0a: 0x0bc7, 0xe0b: 0x0beb,\n\t0xe0c: 0x0c07, 0xe0d: 0x0c5f, 0xe0e: 0x0c6b, 0xe0f: 0x0c73, 0xe10: 0x0c9b, 0xe11: 0x0cdf,\n\t0xe12: 0x0d0f, 0xe13: 0x0d13, 0xe14: 0x0d27, 0xe15: 0x0da7, 0xe16: 0x0db7, 0xe17: 0x0e0f,\n\t0xe18: 0x0e5b, 0xe19: 0x0e53, 0xe1a: 0x0e67, 0xe1b: 0x0e83, 0xe1c: 0x0ebb, 0xe1d: 0x1013,\n\t0xe1e: 0x0edf, 0xe1f: 0x0f13, 0xe20: 0x0f1f, 0xe21: 0x0f5f, 0xe22: 0x0f7b, 0xe23: 0x0f9f,\n\t0xe24: 0x0fc3, 0xe25: 0x0fc7, 0xe26: 0x0fe3, 0xe27: 0x0fe7, 0xe28: 0x0ff7, 0xe29: 0x100b,\n\t0xe2a: 0x1007, 0xe2b: 0x1037, 0xe2c: 0x10b3, 0xe2d: 0x10cb, 0xe2e: 0x10e3, 0xe2f: 0x111b,\n\t0xe30: 0x112f, 0xe31: 0x114b, 0xe32: 0x117b, 0xe33: 0x122f, 0xe34: 0x1257, 0xe35: 0x12cb,\n\t0xe36: 0x1313, 0xe37: 0x131f, 0xe38: 0x1327, 0xe39: 0x133f, 0xe3a: 0x1353, 0xe3b: 0x1343,\n\t0xe3c: 0x135b, 0xe3d: 0x1357, 0xe3e: 0x134f, 0xe3f: 0x135f,\n\t// Block 0x39, offset 0xe40\n\t0xe40: 0x136b, 0xe41: 0x13a7, 0xe42: 0x13e3, 0xe43: 0x1413, 0xe44: 0x144b, 0xe45: 0x146b,\n\t0xe46: 0x14b7, 0xe47: 0x14db, 0xe48: 0x14fb, 0xe49: 0x150f, 0xe4a: 0x151f, 0xe4b: 0x152b,\n\t0xe4c: 0x1537, 0xe4d: 0x158b, 0xe4e: 0x162b, 0xe4f: 0x16b5, 0xe50: 0x16b0, 0xe51: 0x16e2,\n\t0xe52: 0x0607, 0xe53: 0x062f, 0xe54: 0x0633, 0xe55: 0x1764, 0xe56: 0x1791, 0xe57: 0x1809,\n\t0xe58: 0x1617, 0xe59: 0x1627,\n\t// Block 0x3a, offset 0xe80\n\t0xe80: 0x19d5, 0xe81: 0x19d8, 0xe82: 0x19db, 0xe83: 0x1c08, 0xe84: 0x1c0c, 0xe85: 0x1a5f,\n\t0xe86: 0x1a5f,\n\t0xe93: 0x1d75, 0xe94: 0x1d66, 0xe95: 0x1d6b, 0xe96: 0x1d7a, 0xe97: 0x1d70,\n\t0xe9d: 0x4390,\n\t0xe9e: 0x8115, 0xe9f: 0x4402, 0xea0: 0x022d, 0xea1: 0x0215, 0xea2: 0x021e, 0xea3: 0x0221,\n\t0xea4: 0x0224, 0xea5: 0x0227, 0xea6: 0x022a, 0xea7: 0x0230, 0xea8: 0x0233, 0xea9: 0x0017,\n\t0xeaa: 0x43f0, 0xeab: 0x43f6, 0xeac: 0x44f4, 0xead: 0x44fc, 0xeae: 0x4348, 0xeaf: 0x434e,\n\t0xeb0: 0x4354, 0xeb1: 0x435a, 0xeb2: 0x4366, 0xeb3: 0x436c, 0xeb4: 0x4372, 0xeb5: 0x437e,\n\t0xeb6: 0x4384, 0xeb8: 0x438a, 0xeb9: 0x4396, 0xeba: 0x439c, 0xebb: 0x43a2,\n\t0xebc: 0x43ae, 0xebe: 0x43b4,\n\t// Block 0x3b, offset 0xec0\n\t0xec0: 0x43ba, 0xec1: 0x43c0, 0xec3: 0x43c6, 0xec4: 0x43cc,\n\t0xec6: 0x43d8, 0xec7: 0x43de, 0xec8: 0x43e4, 0xec9: 0x43ea, 0xeca: 0x43fc, 0xecb: 0x4378,\n\t0xecc: 0x4360, 0xecd: 0x43a8, 0xece: 0x43d2, 0xecf: 0x1d7f, 0xed0: 0x0299, 0xed1: 0x0299,\n\t0xed2: 0x02a2, 0xed3: 0x02a2, 0xed4: 0x02a2, 0xed5: 0x02a2, 0xed6: 0x02a5, 0xed7: 0x02a5,\n\t0xed8: 0x02a5, 0xed9: 0x02a5, 0xeda: 0x02ab, 0xedb: 0x02ab, 0xedc: 0x02ab, 0xedd: 0x02ab,\n\t0xede: 0x029f, 0xedf: 0x029f, 0xee0: 0x029f, 0xee1: 0x029f, 0xee2: 0x02a8, 0xee3: 0x02a8,\n\t0xee4: 0x02a8, 0xee5: 0x02a8, 0xee6: 0x029c, 0xee7: 0x029c, 0xee8: 0x029c, 0xee9: 0x029c,\n\t0xeea: 0x02cf, 0xeeb: 0x02cf, 0xeec: 0x02cf, 0xeed: 0x02cf, 0xeee: 0x02d2, 0xeef: 0x02d2,\n\t0xef0: 0x02d2, 0xef1: 0x02d2, 0xef2: 0x02b1, 0xef3: 0x02b1, 0xef4: 0x02b1, 0xef5: 0x02b1,\n\t0xef6: 0x02ae, 0xef7: 0x02ae, 0xef8: 0x02ae, 0xef9: 0x02ae, 0xefa: 0x02b4, 0xefb: 0x02b4,\n\t0xefc: 0x02b4, 0xefd: 0x02b4, 0xefe: 0x02b7, 0xeff: 0x02b7,\n\t// Block 0x3c, offset 0xf00\n\t0xf00: 0x02b7, 0xf01: 0x02b7, 0xf02: 0x02c0, 0xf03: 0x02c0, 0xf04: 0x02bd, 0xf05: 0x02bd,\n\t0xf06: 0x02c3, 0xf07: 0x02c3, 0xf08: 0x02ba, 0xf09: 0x02ba, 0xf0a: 0x02c9, 0xf0b: 0x02c9,\n\t0xf0c: 0x02c6, 0xf0d: 0x02c6, 0xf0e: 0x02d5, 0xf0f: 0x02d5, 0xf10: 0x02d5, 0xf11: 0x02d5,\n\t0xf12: 0x02db, 0xf13: 0x02db, 0xf14: 0x02db, 0xf15: 0x02db, 0xf16: 0x02e1, 0xf17: 0x02e1,\n\t0xf18: 0x02e1, 0xf19: 0x02e1, 0xf1a: 0x02de, 0xf1b: 0x02de, 0xf1c: 0x02de, 0xf1d: 0x02de,\n\t0xf1e: 0x02e4, 0xf1f: 0x02e4, 0xf20: 0x02e7, 0xf21: 0x02e7, 0xf22: 0x02e7, 0xf23: 0x02e7,\n\t0xf24: 0x446e, 0xf25: 0x446e, 0xf26: 0x02ed, 0xf27: 0x02ed, 0xf28: 0x02ed, 0xf29: 0x02ed,\n\t0xf2a: 0x02ea, 0xf2b: 0x02ea, 0xf2c: 0x02ea, 0xf2d: 0x02ea, 0xf2e: 0x0308, 0xf2f: 0x0308,\n\t0xf30: 0x4468, 0xf31: 0x4468,\n\t// Block 0x3d, offset 0xf40\n\t0xf53: 0x02d8, 0xf54: 0x02d8, 0xf55: 0x02d8, 0xf56: 0x02d8, 0xf57: 0x02f6,\n\t0xf58: 0x02f6, 0xf59: 0x02f3, 0xf5a: 0x02f3, 0xf5b: 0x02f9, 0xf5c: 0x02f9, 0xf5d: 0x204f,\n\t0xf5e: 0x02ff, 0xf5f: 0x02ff, 0xf60: 0x02f0, 0xf61: 0x02f0, 0xf62: 0x02fc, 0xf63: 0x02fc,\n\t0xf64: 0x0305, 0xf65: 0x0305, 0xf66: 0x0305, 0xf67: 0x0305, 0xf68: 0x028d, 0xf69: 0x028d,\n\t0xf6a: 0x25aa, 0xf6b: 0x25aa, 0xf6c: 0x261a, 0xf6d: 0x261a, 0xf6e: 0x25e9, 0xf6f: 0x25e9,\n\t0xf70: 0x2605, 0xf71: 0x2605, 0xf72: 0x25fe, 0xf73: 0x25fe, 0xf74: 0x260c, 0xf75: 0x260c,\n\t0xf76: 0x2613, 0xf77: 0x2613, 0xf78: 0x2613, 0xf79: 0x25f0, 0xf7a: 0x25f0, 0xf7b: 0x25f0,\n\t0xf7c: 0x0302, 0xf7d: 0x0302, 0xf7e: 0x0302, 0xf7f: 0x0302,\n\t// Block 0x3e, offset 0xf80\n\t0xf80: 0x25b1, 0xf81: 0x25b8, 0xf82: 0x25d4, 0xf83: 0x25f0, 0xf84: 0x25f7, 0xf85: 0x1d89,\n\t0xf86: 0x1d8e, 0xf87: 0x1d93, 0xf88: 0x1da2, 0xf89: 0x1db1, 0xf8a: 0x1db6, 0xf8b: 0x1dbb,\n\t0xf8c: 0x1dc0, 0xf8d: 0x1dc5, 0xf8e: 0x1dd4, 0xf8f: 0x1de3, 0xf90: 0x1de8, 0xf91: 0x1ded,\n\t0xf92: 0x1dfc, 0xf93: 0x1e0b, 0xf94: 0x1e10, 0xf95: 0x1e15, 0xf96: 0x1e1a, 0xf97: 0x1e29,\n\t0xf98: 0x1e2e, 0xf99: 0x1e3d, 0xf9a: 0x1e42, 0xf9b: 0x1e47, 0xf9c: 0x1e56, 0xf9d: 0x1e5b,\n\t0xf9e: 0x1e60, 0xf9f: 0x1e6a, 0xfa0: 0x1ea6, 0xfa1: 0x1eb5, 0xfa2: 0x1ec4, 0xfa3: 0x1ec9,\n\t0xfa4: 0x1ece, 0xfa5: 0x1ed8, 0xfa6: 0x1ee7, 0xfa7: 0x1eec, 0xfa8: 0x1efb, 0xfa9: 0x1f00,\n\t0xfaa: 0x1f05, 0xfab: 0x1f14, 0xfac: 0x1f19, 0xfad: 0x1f28, 0xfae: 0x1f2d, 0xfaf: 0x1f32,\n\t0xfb0: 0x1f37, 0xfb1: 0x1f3c, 0xfb2: 0x1f41, 0xfb3: 0x1f46, 0xfb4: 0x1f4b, 0xfb5: 0x1f50,\n\t0xfb6: 0x1f55, 0xfb7: 0x1f5a, 0xfb8: 0x1f5f, 0xfb9: 0x1f64, 0xfba: 0x1f69, 0xfbb: 0x1f6e,\n\t0xfbc: 0x1f73, 0xfbd: 0x1f78, 0xfbe: 0x1f7d, 0xfbf: 0x1f87,\n\t// Block 0x3f, offset 0xfc0\n\t0xfc0: 0x1f8c, 0xfc1: 0x1f91, 0xfc2: 0x1f96, 0xfc3: 0x1fa0, 0xfc4: 0x1fa5, 0xfc5: 0x1faf,\n\t0xfc6: 0x1fb4, 0xfc7: 0x1fb9, 0xfc8: 0x1fbe, 0xfc9: 0x1fc3, 0xfca: 0x1fc8, 0xfcb: 0x1fcd,\n\t0xfcc: 0x1fd2, 0xfcd: 0x1fd7, 0xfce: 0x1fe6, 0xfcf: 0x1ff5, 0xfd0: 0x1ffa, 0xfd1: 0x1fff,\n\t0xfd2: 0x2004, 0xfd3: 0x2009, 0xfd4: 0x200e, 0xfd5: 0x2018, 0xfd6: 0x201d, 0xfd7: 0x2022,\n\t0xfd8: 0x2031, 0xfd9: 0x2040, 0xfda: 0x2045, 0xfdb: 0x4420, 0xfdc: 0x4426, 0xfdd: 0x445c,\n\t0xfde: 0x44b3, 0xfdf: 0x44ba, 0xfe0: 0x44c1, 0xfe1: 0x44c8, 0xfe2: 0x44cf, 0xfe3: 0x44d6,\n\t0xfe4: 0x25c6, 0xfe5: 0x25cd, 0xfe6: 0x25d4, 0xfe7: 0x25db, 0xfe8: 0x25f0, 0xfe9: 0x25f7,\n\t0xfea: 0x1d98, 0xfeb: 0x1d9d, 0xfec: 0x1da2, 0xfed: 0x1da7, 0xfee: 0x1db1, 0xfef: 0x1db6,\n\t0xff0: 0x1dca, 0xff1: 0x1dcf, 0xff2: 0x1dd4, 0xff3: 0x1dd9, 0xff4: 0x1de3, 0xff5: 0x1de8,\n\t0xff6: 0x1df2, 0xff7: 0x1df7, 0xff8: 0x1dfc, 0xff9: 0x1e01, 0xffa: 0x1e0b, 0xffb: 0x1e10,\n\t0xffc: 0x1f3c, 0xffd: 0x1f41, 0xffe: 0x1f50, 0xfff: 0x1f55,\n\t// Block 0x40, offset 0x1000\n\t0x1000: 0x1f5a, 0x1001: 0x1f6e, 0x1002: 0x1f73, 0x1003: 0x1f78, 0x1004: 0x1f7d, 0x1005: 0x1f96,\n\t0x1006: 0x1fa0, 0x1007: 0x1fa5, 0x1008: 0x1faa, 0x1009: 0x1fbe, 0x100a: 0x1fdc, 0x100b: 0x1fe1,\n\t0x100c: 0x1fe6, 0x100d: 0x1feb, 0x100e: 0x1ff5, 0x100f: 0x1ffa, 0x1010: 0x445c, 0x1011: 0x2027,\n\t0x1012: 0x202c, 0x1013: 0x2031, 0x1014: 0x2036, 0x1015: 0x2040, 0x1016: 0x2045, 0x1017: 0x25b1,\n\t0x1018: 0x25b8, 0x1019: 0x25bf, 0x101a: 0x25d4, 0x101b: 0x25e2, 0x101c: 0x1d89, 0x101d: 0x1d8e,\n\t0x101e: 0x1d93, 0x101f: 0x1da2, 0x1020: 0x1dac, 0x1021: 0x1dbb, 0x1022: 0x1dc0, 0x1023: 0x1dc5,\n\t0x1024: 0x1dd4, 0x1025: 0x1dde, 0x1026: 0x1dfc, 0x1027: 0x1e15, 0x1028: 0x1e1a, 0x1029: 0x1e29,\n\t0x102a: 0x1e2e, 0x102b: 0x1e3d, 0x102c: 0x1e47, 0x102d: 0x1e56, 0x102e: 0x1e5b, 0x102f: 0x1e60,\n\t0x1030: 0x1e6a, 0x1031: 0x1ea6, 0x1032: 0x1eab, 0x1033: 0x1eb5, 0x1034: 0x1ec4, 0x1035: 0x1ec9,\n\t0x1036: 0x1ece, 0x1037: 0x1ed8, 0x1038: 0x1ee7, 0x1039: 0x1efb, 0x103a: 0x1f00, 0x103b: 0x1f05,\n\t0x103c: 0x1f14, 0x103d: 0x1f19, 0x103e: 0x1f28, 0x103f: 0x1f2d,\n\t// Block 0x41, offset 0x1040\n\t0x1040: 0x1f32, 0x1041: 0x1f37, 0x1042: 0x1f46, 0x1043: 0x1f4b, 0x1044: 0x1f5f, 0x1045: 0x1f64,\n\t0x1046: 0x1f69, 0x1047: 0x1f6e, 0x1048: 0x1f73, 0x1049: 0x1f87, 0x104a: 0x1f8c, 0x104b: 0x1f91,\n\t0x104c: 0x1f96, 0x104d: 0x1f9b, 0x104e: 0x1faf, 0x104f: 0x1fb4, 0x1050: 0x1fb9, 0x1051: 0x1fbe,\n\t0x1052: 0x1fcd, 0x1053: 0x1fd2, 0x1054: 0x1fd7, 0x1055: 0x1fe6, 0x1056: 0x1ff0, 0x1057: 0x1fff,\n\t0x1058: 0x2004, 0x1059: 0x4450, 0x105a: 0x2018, 0x105b: 0x201d, 0x105c: 0x2022, 0x105d: 0x2031,\n\t0x105e: 0x203b, 0x105f: 0x25d4, 0x1060: 0x25e2, 0x1061: 0x1da2, 0x1062: 0x1dac, 0x1063: 0x1dd4,\n\t0x1064: 0x1dde, 0x1065: 0x1dfc, 0x1066: 0x1e06, 0x1067: 0x1e6a, 0x1068: 0x1e6f, 0x1069: 0x1e92,\n\t0x106a: 0x1e97, 0x106b: 0x1f6e, 0x106c: 0x1f73, 0x106d: 0x1f96, 0x106e: 0x1fe6, 0x106f: 0x1ff0,\n\t0x1070: 0x2031, 0x1071: 0x203b, 0x1072: 0x4504, 0x1073: 0x450c, 0x1074: 0x4514, 0x1075: 0x1ef1,\n\t0x1076: 0x1ef6, 0x1077: 0x1f0a, 0x1078: 0x1f0f, 0x1079: 0x1f1e, 0x107a: 0x1f23, 0x107b: 0x1e74,\n\t0x107c: 0x1e79, 0x107d: 0x1e9c, 0x107e: 0x1ea1, 0x107f: 0x1e33,\n\t// Block 0x42, offset 0x1080\n\t0x1080: 0x1e38, 0x1081: 0x1e1f, 0x1082: 0x1e24, 0x1083: 0x1e4c, 0x1084: 0x1e51, 0x1085: 0x1eba,\n\t0x1086: 0x1ebf, 0x1087: 0x1edd, 0x1088: 0x1ee2, 0x1089: 0x1e7e, 0x108a: 0x1e83, 0x108b: 0x1e88,\n\t0x108c: 0x1e92, 0x108d: 0x1e8d, 0x108e: 0x1e65, 0x108f: 0x1eb0, 0x1090: 0x1ed3, 0x1091: 0x1ef1,\n\t0x1092: 0x1ef6, 0x1093: 0x1f0a, 0x1094: 0x1f0f, 0x1095: 0x1f1e, 0x1096: 0x1f23, 0x1097: 0x1e74,\n\t0x1098: 0x1e79, 0x1099: 0x1e9c, 0x109a: 0x1ea1, 0x109b: 0x1e33, 0x109c: 0x1e38, 0x109d: 0x1e1f,\n\t0x109e: 0x1e24, 0x109f: 0x1e4c, 0x10a0: 0x1e51, 0x10a1: 0x1eba, 0x10a2: 0x1ebf, 0x10a3: 0x1edd,\n\t0x10a4: 0x1ee2, 0x10a5: 0x1e7e, 0x10a6: 0x1e83, 0x10a7: 0x1e88, 0x10a8: 0x1e92, 0x10a9: 0x1e8d,\n\t0x10aa: 0x1e65, 0x10ab: 0x1eb0, 0x10ac: 0x1ed3, 0x10ad: 0x1e7e, 0x10ae: 0x1e83, 0x10af: 0x1e88,\n\t0x10b0: 0x1e92, 0x10b1: 0x1e6f, 0x10b2: 0x1e97, 0x10b3: 0x1eec, 0x10b4: 0x1e56, 0x10b5: 0x1e5b,\n\t0x10b6: 0x1e60, 0x10b7: 0x1e7e, 0x10b8: 0x1e83, 0x10b9: 0x1e88, 0x10ba: 0x1eec, 0x10bb: 0x1efb,\n\t0x10bc: 0x4408, 0x10bd: 0x4408,\n\t// Block 0x43, offset 0x10c0\n\t0x10d0: 0x2311, 0x10d1: 0x2326,\n\t0x10d2: 0x2326, 0x10d3: 0x232d, 0x10d4: 0x2334, 0x10d5: 0x2349, 0x10d6: 0x2350, 0x10d7: 0x2357,\n\t0x10d8: 0x237a, 0x10d9: 0x237a, 0x10da: 0x239d, 0x10db: 0x2396, 0x10dc: 0x23b2, 0x10dd: 0x23a4,\n\t0x10de: 0x23ab, 0x10df: 0x23ce, 0x10e0: 0x23ce, 0x10e1: 0x23c7, 0x10e2: 0x23d5, 0x10e3: 0x23d5,\n\t0x10e4: 0x23ff, 0x10e5: 0x23ff, 0x10e6: 0x241b, 0x10e7: 0x23e3, 0x10e8: 0x23e3, 0x10e9: 0x23dc,\n\t0x10ea: 0x23f1, 0x10eb: 0x23f1, 0x10ec: 0x23f8, 0x10ed: 0x23f8, 0x10ee: 0x2422, 0x10ef: 0x2430,\n\t0x10f0: 0x2430, 0x10f1: 0x2437, 0x10f2: 0x2437, 0x10f3: 0x243e, 0x10f4: 0x2445, 0x10f5: 0x244c,\n\t0x10f6: 0x2453, 0x10f7: 0x2453, 0x10f8: 0x245a, 0x10f9: 0x2468, 0x10fa: 0x2476, 0x10fb: 0x246f,\n\t0x10fc: 0x247d, 0x10fd: 0x247d, 0x10fe: 0x2492, 0x10ff: 0x2499,\n\t// Block 0x44, offset 0x1100\n\t0x1100: 0x24ca, 0x1101: 0x24d8, 0x1102: 0x24d1, 0x1103: 0x24b5, 0x1104: 0x24b5, 0x1105: 0x24df,\n\t0x1106: 0x24df, 0x1107: 0x24e6, 0x1108: 0x24e6, 0x1109: 0x2510, 0x110a: 0x2517, 0x110b: 0x251e,\n\t0x110c: 0x24f4, 0x110d: 0x2502, 0x110e: 0x2525, 0x110f: 0x252c,\n\t0x1112: 0x24fb, 0x1113: 0x2580, 0x1114: 0x2587, 0x1115: 0x255d, 0x1116: 0x2564, 0x1117: 0x2548,\n\t0x1118: 0x2548, 0x1119: 0x254f, 0x111a: 0x2579, 0x111b: 0x2572, 0x111c: 0x259c, 0x111d: 0x259c,\n\t0x111e: 0x230a, 0x111f: 0x231f, 0x1120: 0x2318, 0x1121: 0x2342, 0x1122: 0x233b, 0x1123: 0x2365,\n\t0x1124: 0x235e, 0x1125: 0x2388, 0x1126: 0x236c, 0x1127: 0x2381, 0x1128: 0x23b9, 0x1129: 0x2406,\n\t0x112a: 0x23ea, 0x112b: 0x2429, 0x112c: 0x24c3, 0x112d: 0x24ed, 0x112e: 0x2595, 0x112f: 0x258e,\n\t0x1130: 0x25a3, 0x1131: 0x253a, 0x1132: 0x24a0, 0x1133: 0x256b, 0x1134: 0x2492, 0x1135: 0x24ca,\n\t0x1136: 0x2461, 0x1137: 0x24ae, 0x1138: 0x2541, 0x1139: 0x2533, 0x113a: 0x24bc, 0x113b: 0x24a7,\n\t0x113c: 0x24bc, 0x113d: 0x2541, 0x113e: 0x2373, 0x113f: 0x238f,\n\t// Block 0x45, offset 0x1140\n\t0x1140: 0x2509, 0x1141: 0x2484, 0x1142: 0x2303, 0x1143: 0x24a7, 0x1144: 0x244c, 0x1145: 0x241b,\n\t0x1146: 0x23c0, 0x1147: 0x2556,\n\t0x1170: 0x2414, 0x1171: 0x248b, 0x1172: 0x27bf, 0x1173: 0x27b6, 0x1174: 0x27ec, 0x1175: 0x27da,\n\t0x1176: 0x27c8, 0x1177: 0x27e3, 0x1178: 0x27f5, 0x1179: 0x240d, 0x117a: 0x2c7c, 0x117b: 0x2afc,\n\t0x117c: 0x27d1,\n\t// Block 0x46, offset 0x1180\n\t0x1190: 0x0019, 0x1191: 0x0483,\n\t0x1192: 0x0487, 0x1193: 0x0035, 0x1194: 0x0037, 0x1195: 0x0003, 0x1196: 0x003f, 0x1197: 0x04bf,\n\t0x1198: 0x04c3, 0x1199: 0x1b5c,\n\t0x11a0: 0x8132, 0x11a1: 0x8132, 0x11a2: 0x8132, 0x11a3: 0x8132,\n\t0x11a4: 0x8132, 0x11a5: 0x8132, 0x11a6: 0x8132, 0x11a7: 0x812d, 0x11a8: 0x812d, 0x11a9: 0x812d,\n\t0x11aa: 0x812d, 0x11ab: 0x812d, 0x11ac: 0x812d, 0x11ad: 0x812d, 0x11ae: 0x8132, 0x11af: 0x8132,\n\t0x11b0: 0x1873, 0x11b1: 0x0443, 0x11b2: 0x043f, 0x11b3: 0x007f, 0x11b4: 0x007f, 0x11b5: 0x0011,\n\t0x11b6: 0x0013, 0x11b7: 0x00b7, 0x11b8: 0x00bb, 0x11b9: 0x04b7, 0x11ba: 0x04bb, 0x11bb: 0x04ab,\n\t0x11bc: 0x04af, 0x11bd: 0x0493, 0x11be: 0x0497, 0x11bf: 0x048b,\n\t// Block 0x47, offset 0x11c0\n\t0x11c0: 0x048f, 0x11c1: 0x049b, 0x11c2: 0x049f, 0x11c3: 0x04a3, 0x11c4: 0x04a7,\n\t0x11c7: 0x0077, 0x11c8: 0x007b, 0x11c9: 0x4269, 0x11ca: 0x4269, 0x11cb: 0x4269,\n\t0x11cc: 0x4269, 0x11cd: 0x007f, 0x11ce: 0x007f, 0x11cf: 0x007f, 0x11d0: 0x0019, 0x11d1: 0x0483,\n\t0x11d2: 0x001d, 0x11d4: 0x0037, 0x11d5: 0x0035, 0x11d6: 0x003f, 0x11d7: 0x0003,\n\t0x11d8: 0x0443, 0x11d9: 0x0011, 0x11da: 0x0013, 0x11db: 0x00b7, 0x11dc: 0x00bb, 0x11dd: 0x04b7,\n\t0x11de: 0x04bb, 0x11df: 0x0007, 0x11e0: 0x000d, 0x11e1: 0x0015, 0x11e2: 0x0017, 0x11e3: 0x001b,\n\t0x11e4: 0x0039, 0x11e5: 0x003d, 0x11e6: 0x003b, 0x11e8: 0x0079, 0x11e9: 0x0009,\n\t0x11ea: 0x000b, 0x11eb: 0x0041,\n\t0x11f0: 0x42aa, 0x11f1: 0x442c, 0x11f2: 0x42af, 0x11f4: 0x42b4,\n\t0x11f6: 0x42b9, 0x11f7: 0x4432, 0x11f8: 0x42be, 0x11f9: 0x4438, 0x11fa: 0x42c3, 0x11fb: 0x443e,\n\t0x11fc: 0x42c8, 0x11fd: 0x4444, 0x11fe: 0x42cd, 0x11ff: 0x444a,\n\t// Block 0x48, offset 0x1200\n\t0x1200: 0x0236, 0x1201: 0x440e, 0x1202: 0x440e, 0x1203: 0x4414, 0x1204: 0x4414, 0x1205: 0x4456,\n\t0x1206: 0x4456, 0x1207: 0x441a, 0x1208: 0x441a, 0x1209: 0x4462, 0x120a: 0x4462, 0x120b: 0x4462,\n\t0x120c: 0x4462, 0x120d: 0x0239, 0x120e: 0x0239, 0x120f: 0x023c, 0x1210: 0x023c, 0x1211: 0x023c,\n\t0x1212: 0x023c, 0x1213: 0x023f, 0x1214: 0x023f, 0x1215: 0x0242, 0x1216: 0x0242, 0x1217: 0x0242,\n\t0x1218: 0x0242, 0x1219: 0x0245, 0x121a: 0x0245, 0x121b: 0x0245, 0x121c: 0x0245, 0x121d: 0x0248,\n\t0x121e: 0x0248, 0x121f: 0x0248, 0x1220: 0x0248, 0x1221: 0x024b, 0x1222: 0x024b, 0x1223: 0x024b,\n\t0x1224: 0x024b, 0x1225: 0x024e, 0x1226: 0x024e, 0x1227: 0x024e, 0x1228: 0x024e, 0x1229: 0x0251,\n\t0x122a: 0x0251, 0x122b: 0x0254, 0x122c: 0x0254, 0x122d: 0x0257, 0x122e: 0x0257, 0x122f: 0x025a,\n\t0x1230: 0x025a, 0x1231: 0x025d, 0x1232: 0x025d, 0x1233: 0x025d, 0x1234: 0x025d, 0x1235: 0x0260,\n\t0x1236: 0x0260, 0x1237: 0x0260, 0x1238: 0x0260, 0x1239: 0x0263, 0x123a: 0x0263, 0x123b: 0x0263,\n\t0x123c: 0x0263, 0x123d: 0x0266, 0x123e: 0x0266, 0x123f: 0x0266,\n\t// Block 0x49, offset 0x1240\n\t0x1240: 0x0266, 0x1241: 0x0269, 0x1242: 0x0269, 0x1243: 0x0269, 0x1244: 0x0269, 0x1245: 0x026c,\n\t0x1246: 0x026c, 0x1247: 0x026c, 0x1248: 0x026c, 0x1249: 0x026f, 0x124a: 0x026f, 0x124b: 0x026f,\n\t0x124c: 0x026f, 0x124d: 0x0272, 0x124e: 0x0272, 0x124f: 0x0272, 0x1250: 0x0272, 0x1251: 0x0275,\n\t0x1252: 0x0275, 0x1253: 0x0275, 0x1254: 0x0275, 0x1255: 0x0278, 0x1256: 0x0278, 0x1257: 0x0278,\n\t0x1258: 0x0278, 0x1259: 0x027b, 0x125a: 0x027b, 0x125b: 0x027b, 0x125c: 0x027b, 0x125d: 0x027e,\n\t0x125e: 0x027e, 0x125f: 0x027e, 0x1260: 0x027e, 0x1261: 0x0281, 0x1262: 0x0281, 0x1263: 0x0281,\n\t0x1264: 0x0281, 0x1265: 0x0284, 0x1266: 0x0284, 0x1267: 0x0284, 0x1268: 0x0284, 0x1269: 0x0287,\n\t0x126a: 0x0287, 0x126b: 0x0287, 0x126c: 0x0287, 0x126d: 0x028a, 0x126e: 0x028a, 0x126f: 0x028d,\n\t0x1270: 0x028d, 0x1271: 0x0290, 0x1272: 0x0290, 0x1273: 0x0290, 0x1274: 0x0290, 0x1275: 0x2e00,\n\t0x1276: 0x2e00, 0x1277: 0x2e08, 0x1278: 0x2e08, 0x1279: 0x2e10, 0x127a: 0x2e10, 0x127b: 0x1f82,\n\t0x127c: 0x1f82,\n\t// Block 0x4a, offset 0x1280\n\t0x1280: 0x0081, 0x1281: 0x0083, 0x1282: 0x0085, 0x1283: 0x0087, 0x1284: 0x0089, 0x1285: 0x008b,\n\t0x1286: 0x008d, 0x1287: 0x008f, 0x1288: 0x0091, 0x1289: 0x0093, 0x128a: 0x0095, 0x128b: 0x0097,\n\t0x128c: 0x0099, 0x128d: 0x009b, 0x128e: 0x009d, 0x128f: 0x009f, 0x1290: 0x00a1, 0x1291: 0x00a3,\n\t0x1292: 0x00a5, 0x1293: 0x00a7, 0x1294: 0x00a9, 0x1295: 0x00ab, 0x1296: 0x00ad, 0x1297: 0x00af,\n\t0x1298: 0x00b1, 0x1299: 0x00b3, 0x129a: 0x00b5, 0x129b: 0x00b7, 0x129c: 0x00b9, 0x129d: 0x00bb,\n\t0x129e: 0x00bd, 0x129f: 0x0477, 0x12a0: 0x047b, 0x12a1: 0x0487, 0x12a2: 0x049b, 0x12a3: 0x049f,\n\t0x12a4: 0x0483, 0x12a5: 0x05ab, 0x12a6: 0x05a3, 0x12a7: 0x04c7, 0x12a8: 0x04cf, 0x12a9: 0x04d7,\n\t0x12aa: 0x04df, 0x12ab: 0x04e7, 0x12ac: 0x056b, 0x12ad: 0x0573, 0x12ae: 0x057b, 0x12af: 0x051f,\n\t0x12b0: 0x05af, 0x12b1: 0x04cb, 0x12b2: 0x04d3, 0x12b3: 0x04db, 0x12b4: 0x04e3, 0x12b5: 0x04eb,\n\t0x12b6: 0x04ef, 0x12b7: 0x04f3, 0x12b8: 0x04f7, 0x12b9: 0x04fb, 0x12ba: 0x04ff, 0x12bb: 0x0503,\n\t0x12bc: 0x0507, 0x12bd: 0x050b, 0x12be: 0x050f, 0x12bf: 0x0513,\n\t// Block 0x4b, offset 0x12c0\n\t0x12c0: 0x0517, 0x12c1: 0x051b, 0x12c2: 0x0523, 0x12c3: 0x0527, 0x12c4: 0x052b, 0x12c5: 0x052f,\n\t0x12c6: 0x0533, 0x12c7: 0x0537, 0x12c8: 0x053b, 0x12c9: 0x053f, 0x12ca: 0x0543, 0x12cb: 0x0547,\n\t0x12cc: 0x054b, 0x12cd: 0x054f, 0x12ce: 0x0553, 0x12cf: 0x0557, 0x12d0: 0x055b, 0x12d1: 0x055f,\n\t0x12d2: 0x0563, 0x12d3: 0x0567, 0x12d4: 0x056f, 0x12d5: 0x0577, 0x12d6: 0x057f, 0x12d7: 0x0583,\n\t0x12d8: 0x0587, 0x12d9: 0x058b, 0x12da: 0x058f, 0x12db: 0x0593, 0x12dc: 0x0597, 0x12dd: 0x05a7,\n\t0x12de: 0x4a78, 0x12df: 0x4a7e, 0x12e0: 0x03c3, 0x12e1: 0x0313, 0x12e2: 0x0317, 0x12e3: 0x4a3b,\n\t0x12e4: 0x031b, 0x12e5: 0x4a41, 0x12e6: 0x4a47, 0x12e7: 0x031f, 0x12e8: 0x0323, 0x12e9: 0x0327,\n\t0x12ea: 0x4a4d, 0x12eb: 0x4a53, 0x12ec: 0x4a59, 0x12ed: 0x4a5f, 0x12ee: 0x4a65, 0x12ef: 0x4a6b,\n\t0x12f0: 0x0367, 0x12f1: 0x032b, 0x12f2: 0x032f, 0x12f3: 0x0333, 0x12f4: 0x037b, 0x12f5: 0x0337,\n\t0x12f6: 0x033b, 0x12f7: 0x033f, 0x12f8: 0x0343, 0x12f9: 0x0347, 0x12fa: 0x034b, 0x12fb: 0x034f,\n\t0x12fc: 0x0353, 0x12fd: 0x0357, 0x12fe: 0x035b,\n\t// Block 0x4c, offset 0x1300\n\t0x1302: 0x49bd, 0x1303: 0x49c3, 0x1304: 0x49c9, 0x1305: 0x49cf,\n\t0x1306: 0x49d5, 0x1307: 0x49db, 0x130a: 0x49e1, 0x130b: 0x49e7,\n\t0x130c: 0x49ed, 0x130d: 0x49f3, 0x130e: 0x49f9, 0x130f: 0x49ff,\n\t0x1312: 0x4a05, 0x1313: 0x4a0b, 0x1314: 0x4a11, 0x1315: 0x4a17, 0x1316: 0x4a1d, 0x1317: 0x4a23,\n\t0x131a: 0x4a29, 0x131b: 0x4a2f, 0x131c: 0x4a35,\n\t0x1320: 0x00bf, 0x1321: 0x00c2, 0x1322: 0x00cb, 0x1323: 0x4264,\n\t0x1324: 0x00c8, 0x1325: 0x00c5, 0x1326: 0x0447, 0x1328: 0x046b, 0x1329: 0x044b,\n\t0x132a: 0x044f, 0x132b: 0x0453, 0x132c: 0x0457, 0x132d: 0x046f, 0x132e: 0x0473,\n\t// Block 0x4d, offset 0x1340\n\t0x1340: 0x0063, 0x1341: 0x0065, 0x1342: 0x0067, 0x1343: 0x0069, 0x1344: 0x006b, 0x1345: 0x006d,\n\t0x1346: 0x006f, 0x1347: 0x0071, 0x1348: 0x0073, 0x1349: 0x0075, 0x134a: 0x0083, 0x134b: 0x0085,\n\t0x134c: 0x0087, 0x134d: 0x0089, 0x134e: 0x008b, 0x134f: 0x008d, 0x1350: 0x008f, 0x1351: 0x0091,\n\t0x1352: 0x0093, 0x1353: 0x0095, 0x1354: 0x0097, 0x1355: 0x0099, 0x1356: 0x009b, 0x1357: 0x009d,\n\t0x1358: 0x009f, 0x1359: 0x00a1, 0x135a: 0x00a3, 0x135b: 0x00a5, 0x135c: 0x00a7, 0x135d: 0x00a9,\n\t0x135e: 0x00ab, 0x135f: 0x00ad, 0x1360: 0x00af, 0x1361: 0x00b1, 0x1362: 0x00b3, 0x1363: 0x00b5,\n\t0x1364: 0x00dd, 0x1365: 0x00f2, 0x1368: 0x0173, 0x1369: 0x0176,\n\t0x136a: 0x0179, 0x136b: 0x017c, 0x136c: 0x017f, 0x136d: 0x0182, 0x136e: 0x0185, 0x136f: 0x0188,\n\t0x1370: 0x018b, 0x1371: 0x018e, 0x1372: 0x0191, 0x1373: 0x0194, 0x1374: 0x0197, 0x1375: 0x019a,\n\t0x1376: 0x019d, 0x1377: 0x01a0, 0x1378: 0x01a3, 0x1379: 0x0188, 0x137a: 0x01a6, 0x137b: 0x01a9,\n\t0x137c: 0x01ac, 0x137d: 0x01af, 0x137e: 0x01b2, 0x137f: 0x01b5,\n\t// Block 0x4e, offset 0x1380\n\t0x1380: 0x01fd, 0x1381: 0x0200, 0x1382: 0x0203, 0x1383: 0x045b, 0x1384: 0x01c7, 0x1385: 0x01d0,\n\t0x1386: 0x01d6, 0x1387: 0x01fa, 0x1388: 0x01eb, 0x1389: 0x01e8, 0x138a: 0x0206, 0x138b: 0x0209,\n\t0x138e: 0x0021, 0x138f: 0x0023, 0x1390: 0x0025, 0x1391: 0x0027,\n\t0x1392: 0x0029, 0x1393: 0x002b, 0x1394: 0x002d, 0x1395: 0x002f, 0x1396: 0x0031, 0x1397: 0x0033,\n\t0x1398: 0x0021, 0x1399: 0x0023, 0x139a: 0x0025, 0x139b: 0x0027, 0x139c: 0x0029, 0x139d: 0x002b,\n\t0x139e: 0x002d, 0x139f: 0x002f, 0x13a0: 0x0031, 0x13a1: 0x0033, 0x13a2: 0x0021, 0x13a3: 0x0023,\n\t0x13a4: 0x0025, 0x13a5: 0x0027, 0x13a6: 0x0029, 0x13a7: 0x002b, 0x13a8: 0x002d, 0x13a9: 0x002f,\n\t0x13aa: 0x0031, 0x13ab: 0x0033, 0x13ac: 0x0021, 0x13ad: 0x0023, 0x13ae: 0x0025, 0x13af: 0x0027,\n\t0x13b0: 0x0029, 0x13b1: 0x002b, 0x13b2: 0x002d, 0x13b3: 0x002f, 0x13b4: 0x0031, 0x13b5: 0x0033,\n\t0x13b6: 0x0021, 0x13b7: 0x0023, 0x13b8: 0x0025, 0x13b9: 0x0027, 0x13ba: 0x0029, 0x13bb: 0x002b,\n\t0x13bc: 0x002d, 0x13bd: 0x002f, 0x13be: 0x0031, 0x13bf: 0x0033,\n\t// Block 0x4f, offset 0x13c0\n\t0x13c0: 0x0239, 0x13c1: 0x023c, 0x13c2: 0x0248, 0x13c3: 0x0251, 0x13c5: 0x028a,\n\t0x13c6: 0x025a, 0x13c7: 0x024b, 0x13c8: 0x0269, 0x13c9: 0x0290, 0x13ca: 0x027b, 0x13cb: 0x027e,\n\t0x13cc: 0x0281, 0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d0: 0x0275, 0x13d1: 0x0263,\n\t0x13d2: 0x0278, 0x13d3: 0x0257, 0x13d4: 0x0260, 0x13d5: 0x0242, 0x13d6: 0x0245, 0x13d7: 0x024e,\n\t0x13d8: 0x0254, 0x13d9: 0x0266, 0x13da: 0x026c, 0x13db: 0x0272, 0x13dc: 0x0293, 0x13dd: 0x02e4,\n\t0x13de: 0x02cc, 0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248,\n\t0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e9: 0x0290,\n\t0x13ea: 0x027b, 0x13eb: 0x027e, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f,\n\t0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242,\n\t0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fb: 0x0272,\n\t// Block 0x50, offset 0x1400\n\t0x1402: 0x0248,\n\t0x1407: 0x024b, 0x1409: 0x0290, 0x140b: 0x027e,\n\t0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1411: 0x0263,\n\t0x1412: 0x0278, 0x1414: 0x0260, 0x1417: 0x024e,\n\t0x1419: 0x0266, 0x141b: 0x0272, 0x141d: 0x02e4,\n\t0x141f: 0x0296, 0x1421: 0x023c, 0x1422: 0x0248,\n\t0x1424: 0x0287, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290,\n\t0x142a: 0x027b, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f,\n\t0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1434: 0x0260, 0x1435: 0x0242,\n\t0x1436: 0x0245, 0x1437: 0x024e, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272,\n\t0x143c: 0x0293, 0x143e: 0x02cc,\n\t// Block 0x51, offset 0x1440\n\t0x1440: 0x0239, 0x1441: 0x023c, 0x1442: 0x0248, 0x1443: 0x0251, 0x1444: 0x0287, 0x1445: 0x028a,\n\t0x1446: 0x025a, 0x1447: 0x024b, 0x1448: 0x0269, 0x1449: 0x0290, 0x144b: 0x027e,\n\t0x144c: 0x0281, 0x144d: 0x0284, 0x144e: 0x025d, 0x144f: 0x026f, 0x1450: 0x0275, 0x1451: 0x0263,\n\t0x1452: 0x0278, 0x1453: 0x0257, 0x1454: 0x0260, 0x1455: 0x0242, 0x1456: 0x0245, 0x1457: 0x024e,\n\t0x1458: 0x0254, 0x1459: 0x0266, 0x145a: 0x026c, 0x145b: 0x0272,\n\t0x1461: 0x023c, 0x1462: 0x0248, 0x1463: 0x0251,\n\t0x1465: 0x028a, 0x1466: 0x025a, 0x1467: 0x024b, 0x1468: 0x0269, 0x1469: 0x0290,\n\t0x146b: 0x027e, 0x146c: 0x0281, 0x146d: 0x0284, 0x146e: 0x025d, 0x146f: 0x026f,\n\t0x1470: 0x0275, 0x1471: 0x0263, 0x1472: 0x0278, 0x1473: 0x0257, 0x1474: 0x0260, 0x1475: 0x0242,\n\t0x1476: 0x0245, 0x1477: 0x024e, 0x1478: 0x0254, 0x1479: 0x0266, 0x147a: 0x026c, 0x147b: 0x0272,\n\t// Block 0x52, offset 0x1480\n\t0x1480: 0x1879, 0x1481: 0x1876, 0x1482: 0x187c, 0x1483: 0x18a0, 0x1484: 0x18c4, 0x1485: 0x18e8,\n\t0x1486: 0x190c, 0x1487: 0x1915, 0x1488: 0x191b, 0x1489: 0x1921, 0x148a: 0x1927,\n\t0x1490: 0x1a8c, 0x1491: 0x1a90,\n\t0x1492: 0x1a94, 0x1493: 0x1a98, 0x1494: 0x1a9c, 0x1495: 0x1aa0, 0x1496: 0x1aa4, 0x1497: 0x1aa8,\n\t0x1498: 0x1aac, 0x1499: 0x1ab0, 0x149a: 0x1ab4, 0x149b: 0x1ab8, 0x149c: 0x1abc, 0x149d: 0x1ac0,\n\t0x149e: 0x1ac4, 0x149f: 0x1ac8, 0x14a0: 0x1acc, 0x14a1: 0x1ad0, 0x14a2: 0x1ad4, 0x14a3: 0x1ad8,\n\t0x14a4: 0x1adc, 0x14a5: 0x1ae0, 0x14a6: 0x1ae4, 0x14a7: 0x1ae8, 0x14a8: 0x1aec, 0x14a9: 0x1af0,\n\t0x14aa: 0x271e, 0x14ab: 0x0047, 0x14ac: 0x0065, 0x14ad: 0x193c, 0x14ae: 0x19b1,\n\t0x14b0: 0x0043, 0x14b1: 0x0045, 0x14b2: 0x0047, 0x14b3: 0x0049, 0x14b4: 0x004b, 0x14b5: 0x004d,\n\t0x14b6: 0x004f, 0x14b7: 0x0051, 0x14b8: 0x0053, 0x14b9: 0x0055, 0x14ba: 0x0057, 0x14bb: 0x0059,\n\t0x14bc: 0x005b, 0x14bd: 0x005d, 0x14be: 0x005f, 0x14bf: 0x0061,\n\t// Block 0x53, offset 0x14c0\n\t0x14c0: 0x26ad, 0x14c1: 0x26c2, 0x14c2: 0x0503,\n\t0x14d0: 0x0c0f, 0x14d1: 0x0a47,\n\t0x14d2: 0x08d3, 0x14d3: 0x45c4, 0x14d4: 0x071b, 0x14d5: 0x09ef, 0x14d6: 0x132f, 0x14d7: 0x09ff,\n\t0x14d8: 0x0727, 0x14d9: 0x0cd7, 0x14da: 0x0eaf, 0x14db: 0x0caf, 0x14dc: 0x0827, 0x14dd: 0x0b6b,\n\t0x14de: 0x07bf, 0x14df: 0x0cb7, 0x14e0: 0x0813, 0x14e1: 0x1117, 0x14e2: 0x0f83, 0x14e3: 0x138b,\n\t0x14e4: 0x09d3, 0x14e5: 0x090b, 0x14e6: 0x0e63, 0x14e7: 0x0c1b, 0x14e8: 0x0c47, 0x14e9: 0x06bf,\n\t0x14ea: 0x06cb, 0x14eb: 0x140b, 0x14ec: 0x0adb, 0x14ed: 0x06e7, 0x14ee: 0x08ef, 0x14ef: 0x0c3b,\n\t0x14f0: 0x13b3, 0x14f1: 0x0c13, 0x14f2: 0x106f, 0x14f3: 0x10ab, 0x14f4: 0x08f7, 0x14f5: 0x0e43,\n\t0x14f6: 0x0d0b, 0x14f7: 0x0d07, 0x14f8: 0x0f97, 0x14f9: 0x082b, 0x14fa: 0x0957, 0x14fb: 0x1443,\n\t// Block 0x54, offset 0x1500\n\t0x1500: 0x06fb, 0x1501: 0x06f3, 0x1502: 0x0703, 0x1503: 0x1647, 0x1504: 0x0747, 0x1505: 0x0757,\n\t0x1506: 0x075b, 0x1507: 0x0763, 0x1508: 0x076b, 0x1509: 0x076f, 0x150a: 0x077b, 0x150b: 0x0773,\n\t0x150c: 0x05b3, 0x150d: 0x165b, 0x150e: 0x078f, 0x150f: 0x0793, 0x1510: 0x0797, 0x1511: 0x07b3,\n\t0x1512: 0x164c, 0x1513: 0x05b7, 0x1514: 0x079f, 0x1515: 0x07bf, 0x1516: 0x1656, 0x1517: 0x07cf,\n\t0x1518: 0x07d7, 0x1519: 0x0737, 0x151a: 0x07df, 0x151b: 0x07e3, 0x151c: 0x1831, 0x151d: 0x07ff,\n\t0x151e: 0x0807, 0x151f: 0x05bf, 0x1520: 0x081f, 0x1521: 0x0823, 0x1522: 0x082b, 0x1523: 0x082f,\n\t0x1524: 0x05c3, 0x1525: 0x0847, 0x1526: 0x084b, 0x1527: 0x0857, 0x1528: 0x0863, 0x1529: 0x0867,\n\t0x152a: 0x086b, 0x152b: 0x0873, 0x152c: 0x0893, 0x152d: 0x0897, 0x152e: 0x089f, 0x152f: 0x08af,\n\t0x1530: 0x08b7, 0x1531: 0x08bb, 0x1532: 0x08bb, 0x1533: 0x08bb, 0x1534: 0x166a, 0x1535: 0x0e93,\n\t0x1536: 0x08cf, 0x1537: 0x08d7, 0x1538: 0x166f, 0x1539: 0x08e3, 0x153a: 0x08eb, 0x153b: 0x08f3,\n\t0x153c: 0x091b, 0x153d: 0x0907, 0x153e: 0x0913, 0x153f: 0x0917,\n\t// Block 0x55, offset 0x1540\n\t0x1540: 0x091f, 0x1541: 0x0927, 0x1542: 0x092b, 0x1543: 0x0933, 0x1544: 0x093b, 0x1545: 0x093f,\n\t0x1546: 0x093f, 0x1547: 0x0947, 0x1548: 0x094f, 0x1549: 0x0953, 0x154a: 0x095f, 0x154b: 0x0983,\n\t0x154c: 0x0967, 0x154d: 0x0987, 0x154e: 0x096b, 0x154f: 0x0973, 0x1550: 0x080b, 0x1551: 0x09cf,\n\t0x1552: 0x0997, 0x1553: 0x099b, 0x1554: 0x099f, 0x1555: 0x0993, 0x1556: 0x09a7, 0x1557: 0x09a3,\n\t0x1558: 0x09bb, 0x1559: 0x1674, 0x155a: 0x09d7, 0x155b: 0x09db, 0x155c: 0x09e3, 0x155d: 0x09ef,\n\t0x155e: 0x09f7, 0x155f: 0x0a13, 0x1560: 0x1679, 0x1561: 0x167e, 0x1562: 0x0a1f, 0x1563: 0x0a23,\n\t0x1564: 0x0a27, 0x1565: 0x0a1b, 0x1566: 0x0a2f, 0x1567: 0x05c7, 0x1568: 0x05cb, 0x1569: 0x0a37,\n\t0x156a: 0x0a3f, 0x156b: 0x0a3f, 0x156c: 0x1683, 0x156d: 0x0a5b, 0x156e: 0x0a5f, 0x156f: 0x0a63,\n\t0x1570: 0x0a6b, 0x1571: 0x1688, 0x1572: 0x0a73, 0x1573: 0x0a77, 0x1574: 0x0b4f, 0x1575: 0x0a7f,\n\t0x1576: 0x05cf, 0x1577: 0x0a8b, 0x1578: 0x0a9b, 0x1579: 0x0aa7, 0x157a: 0x0aa3, 0x157b: 0x1692,\n\t0x157c: 0x0aaf, 0x157d: 0x1697, 0x157e: 0x0abb, 0x157f: 0x0ab7,\n\t// Block 0x56, offset 0x1580\n\t0x1580: 0x0abf, 0x1581: 0x0acf, 0x1582: 0x0ad3, 0x1583: 0x05d3, 0x1584: 0x0ae3, 0x1585: 0x0aeb,\n\t0x1586: 0x0aef, 0x1587: 0x0af3, 0x1588: 0x05d7, 0x1589: 0x169c, 0x158a: 0x05db, 0x158b: 0x0b0f,\n\t0x158c: 0x0b13, 0x158d: 0x0b17, 0x158e: 0x0b1f, 0x158f: 0x1863, 0x1590: 0x0b37, 0x1591: 0x16a6,\n\t0x1592: 0x16a6, 0x1593: 0x11d7, 0x1594: 0x0b47, 0x1595: 0x0b47, 0x1596: 0x05df, 0x1597: 0x16c9,\n\t0x1598: 0x179b, 0x1599: 0x0b57, 0x159a: 0x0b5f, 0x159b: 0x05e3, 0x159c: 0x0b73, 0x159d: 0x0b83,\n\t0x159e: 0x0b87, 0x159f: 0x0b8f, 0x15a0: 0x0b9f, 0x15a1: 0x05eb, 0x15a2: 0x05e7, 0x15a3: 0x0ba3,\n\t0x15a4: 0x16ab, 0x15a5: 0x0ba7, 0x15a6: 0x0bbb, 0x15a7: 0x0bbf, 0x15a8: 0x0bc3, 0x15a9: 0x0bbf,\n\t0x15aa: 0x0bcf, 0x15ab: 0x0bd3, 0x15ac: 0x0be3, 0x15ad: 0x0bdb, 0x15ae: 0x0bdf, 0x15af: 0x0be7,\n\t0x15b0: 0x0beb, 0x15b1: 0x0bef, 0x15b2: 0x0bfb, 0x15b3: 0x0bff, 0x15b4: 0x0c17, 0x15b5: 0x0c1f,\n\t0x15b6: 0x0c2f, 0x15b7: 0x0c43, 0x15b8: 0x16ba, 0x15b9: 0x0c3f, 0x15ba: 0x0c33, 0x15bb: 0x0c4b,\n\t0x15bc: 0x0c53, 0x15bd: 0x0c67, 0x15be: 0x16bf, 0x15bf: 0x0c6f,\n\t// Block 0x57, offset 0x15c0\n\t0x15c0: 0x0c63, 0x15c1: 0x0c5b, 0x15c2: 0x05ef, 0x15c3: 0x0c77, 0x15c4: 0x0c7f, 0x15c5: 0x0c87,\n\t0x15c6: 0x0c7b, 0x15c7: 0x05f3, 0x15c8: 0x0c97, 0x15c9: 0x0c9f, 0x15ca: 0x16c4, 0x15cb: 0x0ccb,\n\t0x15cc: 0x0cff, 0x15cd: 0x0cdb, 0x15ce: 0x05ff, 0x15cf: 0x0ce7, 0x15d0: 0x05fb, 0x15d1: 0x05f7,\n\t0x15d2: 0x07c3, 0x15d3: 0x07c7, 0x15d4: 0x0d03, 0x15d5: 0x0ceb, 0x15d6: 0x11ab, 0x15d7: 0x0663,\n\t0x15d8: 0x0d0f, 0x15d9: 0x0d13, 0x15da: 0x0d17, 0x15db: 0x0d2b, 0x15dc: 0x0d23, 0x15dd: 0x16dd,\n\t0x15de: 0x0603, 0x15df: 0x0d3f, 0x15e0: 0x0d33, 0x15e1: 0x0d4f, 0x15e2: 0x0d57, 0x15e3: 0x16e7,\n\t0x15e4: 0x0d5b, 0x15e5: 0x0d47, 0x15e6: 0x0d63, 0x15e7: 0x0607, 0x15e8: 0x0d67, 0x15e9: 0x0d6b,\n\t0x15ea: 0x0d6f, 0x15eb: 0x0d7b, 0x15ec: 0x16ec, 0x15ed: 0x0d83, 0x15ee: 0x060b, 0x15ef: 0x0d8f,\n\t0x15f0: 0x16f1, 0x15f1: 0x0d93, 0x15f2: 0x060f, 0x15f3: 0x0d9f, 0x15f4: 0x0dab, 0x15f5: 0x0db7,\n\t0x15f6: 0x0dbb, 0x15f7: 0x16f6, 0x15f8: 0x168d, 0x15f9: 0x16fb, 0x15fa: 0x0ddb, 0x15fb: 0x1700,\n\t0x15fc: 0x0de7, 0x15fd: 0x0def, 0x15fe: 0x0ddf, 0x15ff: 0x0dfb,\n\t// Block 0x58, offset 0x1600\n\t0x1600: 0x0e0b, 0x1601: 0x0e1b, 0x1602: 0x0e0f, 0x1603: 0x0e13, 0x1604: 0x0e1f, 0x1605: 0x0e23,\n\t0x1606: 0x1705, 0x1607: 0x0e07, 0x1608: 0x0e3b, 0x1609: 0x0e3f, 0x160a: 0x0613, 0x160b: 0x0e53,\n\t0x160c: 0x0e4f, 0x160d: 0x170a, 0x160e: 0x0e33, 0x160f: 0x0e6f, 0x1610: 0x170f, 0x1611: 0x1714,\n\t0x1612: 0x0e73, 0x1613: 0x0e87, 0x1614: 0x0e83, 0x1615: 0x0e7f, 0x1616: 0x0617, 0x1617: 0x0e8b,\n\t0x1618: 0x0e9b, 0x1619: 0x0e97, 0x161a: 0x0ea3, 0x161b: 0x1651, 0x161c: 0x0eb3, 0x161d: 0x1719,\n\t0x161e: 0x0ebf, 0x161f: 0x1723, 0x1620: 0x0ed3, 0x1621: 0x0edf, 0x1622: 0x0ef3, 0x1623: 0x1728,\n\t0x1624: 0x0f07, 0x1625: 0x0f0b, 0x1626: 0x172d, 0x1627: 0x1732, 0x1628: 0x0f27, 0x1629: 0x0f37,\n\t0x162a: 0x061b, 0x162b: 0x0f3b, 0x162c: 0x061f, 0x162d: 0x061f, 0x162e: 0x0f53, 0x162f: 0x0f57,\n\t0x1630: 0x0f5f, 0x1631: 0x0f63, 0x1632: 0x0f6f, 0x1633: 0x0623, 0x1634: 0x0f87, 0x1635: 0x1737,\n\t0x1636: 0x0fa3, 0x1637: 0x173c, 0x1638: 0x0faf, 0x1639: 0x16a1, 0x163a: 0x0fbf, 0x163b: 0x1741,\n\t0x163c: 0x1746, 0x163d: 0x174b, 0x163e: 0x0627, 0x163f: 0x062b,\n\t// Block 0x59, offset 0x1640\n\t0x1640: 0x0ff7, 0x1641: 0x1755, 0x1642: 0x1750, 0x1643: 0x175a, 0x1644: 0x175f, 0x1645: 0x0fff,\n\t0x1646: 0x1003, 0x1647: 0x1003, 0x1648: 0x100b, 0x1649: 0x0633, 0x164a: 0x100f, 0x164b: 0x0637,\n\t0x164c: 0x063b, 0x164d: 0x1769, 0x164e: 0x1023, 0x164f: 0x102b, 0x1650: 0x1037, 0x1651: 0x063f,\n\t0x1652: 0x176e, 0x1653: 0x105b, 0x1654: 0x1773, 0x1655: 0x1778, 0x1656: 0x107b, 0x1657: 0x1093,\n\t0x1658: 0x0643, 0x1659: 0x109b, 0x165a: 0x109f, 0x165b: 0x10a3, 0x165c: 0x177d, 0x165d: 0x1782,\n\t0x165e: 0x1782, 0x165f: 0x10bb, 0x1660: 0x0647, 0x1661: 0x1787, 0x1662: 0x10cf, 0x1663: 0x10d3,\n\t0x1664: 0x064b, 0x1665: 0x178c, 0x1666: 0x10ef, 0x1667: 0x064f, 0x1668: 0x10ff, 0x1669: 0x10f7,\n\t0x166a: 0x1107, 0x166b: 0x1796, 0x166c: 0x111f, 0x166d: 0x0653, 0x166e: 0x112b, 0x166f: 0x1133,\n\t0x1670: 0x1143, 0x1671: 0x0657, 0x1672: 0x17a0, 0x1673: 0x17a5, 0x1674: 0x065b, 0x1675: 0x17aa,\n\t0x1676: 0x115b, 0x1677: 0x17af, 0x1678: 0x1167, 0x1679: 0x1173, 0x167a: 0x117b, 0x167b: 0x17b4,\n\t0x167c: 0x17b9, 0x167d: 0x118f, 0x167e: 0x17be, 0x167f: 0x1197,\n\t// Block 0x5a, offset 0x1680\n\t0x1680: 0x16ce, 0x1681: 0x065f, 0x1682: 0x11af, 0x1683: 0x11b3, 0x1684: 0x0667, 0x1685: 0x11b7,\n\t0x1686: 0x0a33, 0x1687: 0x17c3, 0x1688: 0x17c8, 0x1689: 0x16d3, 0x168a: 0x16d8, 0x168b: 0x11d7,\n\t0x168c: 0x11db, 0x168d: 0x13f3, 0x168e: 0x066b, 0x168f: 0x1207, 0x1690: 0x1203, 0x1691: 0x120b,\n\t0x1692: 0x083f, 0x1693: 0x120f, 0x1694: 0x1213, 0x1695: 0x1217, 0x1696: 0x121f, 0x1697: 0x17cd,\n\t0x1698: 0x121b, 0x1699: 0x1223, 0x169a: 0x1237, 0x169b: 0x123b, 0x169c: 0x1227, 0x169d: 0x123f,\n\t0x169e: 0x1253, 0x169f: 0x1267, 0x16a0: 0x1233, 0x16a1: 0x1247, 0x16a2: 0x124b, 0x16a3: 0x124f,\n\t0x16a4: 0x17d2, 0x16a5: 0x17dc, 0x16a6: 0x17d7, 0x16a7: 0x066f, 0x16a8: 0x126f, 0x16a9: 0x1273,\n\t0x16aa: 0x127b, 0x16ab: 0x17f0, 0x16ac: 0x127f, 0x16ad: 0x17e1, 0x16ae: 0x0673, 0x16af: 0x0677,\n\t0x16b0: 0x17e6, 0x16b1: 0x17eb, 0x16b2: 0x067b, 0x16b3: 0x129f, 0x16b4: 0x12a3, 0x16b5: 0x12a7,\n\t0x16b6: 0x12ab, 0x16b7: 0x12b7, 0x16b8: 0x12b3, 0x16b9: 0x12bf, 0x16ba: 0x12bb, 0x16bb: 0x12cb,\n\t0x16bc: 0x12c3, 0x16bd: 0x12c7, 0x16be: 0x12cf, 0x16bf: 0x067f,\n\t// Block 0x5b, offset 0x16c0\n\t0x16c0: 0x12d7, 0x16c1: 0x12db, 0x16c2: 0x0683, 0x16c3: 0x12eb, 0x16c4: 0x12ef, 0x16c5: 0x17f5,\n\t0x16c6: 0x12fb, 0x16c7: 0x12ff, 0x16c8: 0x0687, 0x16c9: 0x130b, 0x16ca: 0x05bb, 0x16cb: 0x17fa,\n\t0x16cc: 0x17ff, 0x16cd: 0x068b, 0x16ce: 0x068f, 0x16cf: 0x1337, 0x16d0: 0x134f, 0x16d1: 0x136b,\n\t0x16d2: 0x137b, 0x16d3: 0x1804, 0x16d4: 0x138f, 0x16d5: 0x1393, 0x16d6: 0x13ab, 0x16d7: 0x13b7,\n\t0x16d8: 0x180e, 0x16d9: 0x1660, 0x16da: 0x13c3, 0x16db: 0x13bf, 0x16dc: 0x13cb, 0x16dd: 0x1665,\n\t0x16de: 0x13d7, 0x16df: 0x13e3, 0x16e0: 0x1813, 0x16e1: 0x1818, 0x16e2: 0x1423, 0x16e3: 0x142f,\n\t0x16e4: 0x1437, 0x16e5: 0x181d, 0x16e6: 0x143b, 0x16e7: 0x1467, 0x16e8: 0x1473, 0x16e9: 0x1477,\n\t0x16ea: 0x146f, 0x16eb: 0x1483, 0x16ec: 0x1487, 0x16ed: 0x1822, 0x16ee: 0x1493, 0x16ef: 0x0693,\n\t0x16f0: 0x149b, 0x16f1: 0x1827, 0x16f2: 0x0697, 0x16f3: 0x14d3, 0x16f4: 0x0ac3, 0x16f5: 0x14eb,\n\t0x16f6: 0x182c, 0x16f7: 0x1836, 0x16f8: 0x069b, 0x16f9: 0x069f, 0x16fa: 0x1513, 0x16fb: 0x183b,\n\t0x16fc: 0x06a3, 0x16fd: 0x1840, 0x16fe: 0x152b, 0x16ff: 0x152b,\n\t// Block 0x5c, offset 0x1700\n\t0x1700: 0x1533, 0x1701: 0x1845, 0x1702: 0x154b, 0x1703: 0x06a7, 0x1704: 0x155b, 0x1705: 0x1567,\n\t0x1706: 0x156f, 0x1707: 0x1577, 0x1708: 0x06ab, 0x1709: 0x184a, 0x170a: 0x158b, 0x170b: 0x15a7,\n\t0x170c: 0x15b3, 0x170d: 0x06af, 0x170e: 0x06b3, 0x170f: 0x15b7, 0x1710: 0x184f, 0x1711: 0x06b7,\n\t0x1712: 0x1854, 0x1713: 0x1859, 0x1714: 0x185e, 0x1715: 0x15db, 0x1716: 0x06bb, 0x1717: 0x15ef,\n\t0x1718: 0x15f7, 0x1719: 0x15fb, 0x171a: 0x1603, 0x171b: 0x160b, 0x171c: 0x1613, 0x171d: 0x1868,\n}\n\n// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes\n// Block 0 is the zero block.\nvar nfkcIndex = [1408]uint8{\n\t// Block 0x0, offset 0x0\n\t// Block 0x1, offset 0x40\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc2: 0x5b, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5c, 0xc7: 0x04,\n\t0xc8: 0x05, 0xca: 0x5d, 0xcb: 0x5e, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,\n\t0xd0: 0x0a, 0xd1: 0x5f, 0xd2: 0x60, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x61,\n\t0xd8: 0x62, 0xd9: 0x0d, 0xdb: 0x63, 0xdc: 0x64, 0xdd: 0x65, 0xdf: 0x66,\n\t0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,\n\t0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,\n\t0xf0: 0x13,\n\t// Block 0x4, offset 0x100\n\t0x120: 0x67, 0x121: 0x68, 0x123: 0x69, 0x124: 0x6a, 0x125: 0x6b, 0x126: 0x6c, 0x127: 0x6d,\n\t0x128: 0x6e, 0x129: 0x6f, 0x12a: 0x70, 0x12b: 0x71, 0x12c: 0x6c, 0x12d: 0x72, 0x12e: 0x73, 0x12f: 0x74,\n\t0x131: 0x75, 0x132: 0x76, 0x133: 0x77, 0x134: 0x78, 0x135: 0x79, 0x137: 0x7a,\n\t0x138: 0x7b, 0x139: 0x7c, 0x13a: 0x7d, 0x13b: 0x7e, 0x13c: 0x7f, 0x13d: 0x80, 0x13e: 0x81, 0x13f: 0x82,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x83, 0x142: 0x84, 0x143: 0x85, 0x144: 0x86, 0x145: 0x87, 0x146: 0x88, 0x147: 0x89,\n\t0x14d: 0x8a,\n\t0x15c: 0x8b, 0x15f: 0x8c,\n\t0x162: 0x8d, 0x164: 0x8e,\n\t0x168: 0x8f, 0x169: 0x90, 0x16a: 0x91, 0x16c: 0x0e, 0x16d: 0x92, 0x16e: 0x93, 0x16f: 0x94,\n\t0x170: 0x95, 0x173: 0x96, 0x174: 0x97, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x11,\n\t0x178: 0x12, 0x179: 0x13, 0x17a: 0x14, 0x17b: 0x15, 0x17c: 0x16, 0x17d: 0x17, 0x17e: 0x18, 0x17f: 0x19,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x1a, 0x185: 0x1b, 0x186: 0x9c, 0x187: 0x9d,\n\t0x188: 0x9e, 0x189: 0x1c, 0x18a: 0x1d, 0x18b: 0x9f, 0x18c: 0xa0,\n\t0x191: 0x1e, 0x192: 0x1f, 0x193: 0xa1,\n\t0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4,\n\t0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8,\n\t0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x20, 0x1bd: 0x21, 0x1be: 0x22, 0x1bf: 0xab,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0xac, 0x1c1: 0x23, 0x1c2: 0x24, 0x1c3: 0x25, 0x1c4: 0xad, 0x1c5: 0x26, 0x1c6: 0x27,\n\t0x1c8: 0x28, 0x1c9: 0x29, 0x1ca: 0x2a, 0x1cb: 0x2b, 0x1cc: 0x2c, 0x1cd: 0x2d, 0x1ce: 0x2e, 0x1cf: 0x2f,\n\t// Block 0x8, offset 0x200\n\t0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2,\n\t0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8,\n\t0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc,\n\t0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd,\n\t0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe,\n\t// Block 0x9, offset 0x240\n\t0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf,\n\t0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0,\n\t0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1,\n\t0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2,\n\t0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3,\n\t0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd,\n\t0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe,\n\t0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf,\n\t// Block 0xa, offset 0x280\n\t0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0,\n\t0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1,\n\t0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2,\n\t0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3,\n\t0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd,\n\t0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe,\n\t0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf,\n\t0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1,\n\t0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2,\n\t0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3,\n\t0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4,\n\t// Block 0xc, offset 0x300\n\t0x324: 0x30, 0x325: 0x31, 0x326: 0x32, 0x327: 0x33,\n\t0x328: 0x34, 0x329: 0x35, 0x32a: 0x36, 0x32b: 0x37, 0x32c: 0x38, 0x32d: 0x39, 0x32e: 0x3a, 0x32f: 0x3b,\n\t0x330: 0x3c, 0x331: 0x3d, 0x332: 0x3e, 0x333: 0x3f, 0x334: 0x40, 0x335: 0x41, 0x336: 0x42, 0x337: 0x43,\n\t0x338: 0x44, 0x339: 0x45, 0x33a: 0x46, 0x33b: 0x47, 0x33c: 0xc5, 0x33d: 0x48, 0x33e: 0x49, 0x33f: 0x4a,\n\t// Block 0xd, offset 0x340\n\t0x347: 0xc6,\n\t0x34b: 0xc7, 0x34d: 0xc8,\n\t0x368: 0xc9, 0x36b: 0xca,\n\t// Block 0xe, offset 0x380\n\t0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce,\n\t0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6c, 0x38d: 0xd1,\n\t0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6,\n\t0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9,\n\t0x3a8: 0xda, 0x3a9: 0xdb, 0x3aa: 0xdc,\n\t0x3b0: 0xd7, 0x3b5: 0xdd,\n\t// Block 0xf, offset 0x3c0\n\t0x3eb: 0xde, 0x3ec: 0xdf,\n\t// Block 0x10, offset 0x400\n\t0x432: 0xe0,\n\t// Block 0x11, offset 0x440\n\t0x445: 0xe1, 0x446: 0xe2, 0x447: 0xe3,\n\t0x449: 0xe4,\n\t0x450: 0xe5, 0x451: 0xe6, 0x452: 0xe7, 0x453: 0xe8, 0x454: 0xe9, 0x455: 0xea, 0x456: 0xeb, 0x457: 0xec,\n\t0x458: 0xed, 0x459: 0xee, 0x45a: 0x4b, 0x45b: 0xef, 0x45c: 0xf0, 0x45d: 0xf1, 0x45e: 0xf2, 0x45f: 0x4c,\n\t// Block 0x12, offset 0x480\n\t0x480: 0xf3,\n\t0x4a3: 0xf4, 0x4a5: 0xf5,\n\t0x4b8: 0x4d, 0x4b9: 0x4e, 0x4ba: 0x4f,\n\t// Block 0x13, offset 0x4c0\n\t0x4c4: 0x50, 0x4c5: 0xf6, 0x4c6: 0xf7,\n\t0x4c8: 0x51, 0x4c9: 0xf8,\n\t// Block 0x14, offset 0x500\n\t0x520: 0x52, 0x521: 0x53, 0x522: 0x54, 0x523: 0x55, 0x524: 0x56, 0x525: 0x57, 0x526: 0x58, 0x527: 0x59,\n\t0x528: 0x5a,\n\t// Block 0x15, offset 0x540\n\t0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,\n\t0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,\n\t0x56f: 0x12,\n}\n\n// nfkcSparseOffset: 158 entries, 316 bytes\nvar nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd5, 0xdc, 0xe4, 0xe8, 0xea, 0xed, 0xf1, 0xf7, 0x108, 0x114, 0x116, 0x11c, 0x11e, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12a, 0x12d, 0x130, 0x132, 0x135, 0x138, 0x13c, 0x141, 0x14a, 0x14c, 0x14f, 0x151, 0x15c, 0x167, 0x175, 0x183, 0x193, 0x1a1, 0x1a8, 0x1ae, 0x1bd, 0x1c1, 0x1c3, 0x1c7, 0x1c9, 0x1cc, 0x1ce, 0x1d1, 0x1d3, 0x1d6, 0x1d8, 0x1da, 0x1dc, 0x1e8, 0x1f2, 0x1fc, 0x1ff, 0x203, 0x205, 0x207, 0x209, 0x20b, 0x20e, 0x210, 0x212, 0x214, 0x216, 0x21c, 0x21f, 0x223, 0x225, 0x22c, 0x232, 0x238, 0x240, 0x246, 0x24c, 0x252, 0x256, 0x258, 0x25a, 0x25c, 0x25e, 0x264, 0x267, 0x26a, 0x272, 0x279, 0x27c, 0x27f, 0x281, 0x289, 0x28c, 0x293, 0x296, 0x29c, 0x29e, 0x2a0, 0x2a3, 0x2a5, 0x2a7, 0x2a9, 0x2ab, 0x2ae, 0x2b0, 0x2b2, 0x2b4, 0x2c1, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d8, 0x2e4, 0x2e9, 0x2f2, 0x2f8, 0x2fd, 0x301, 0x306, 0x30a, 0x31a, 0x328, 0x336, 0x344, 0x34a, 0x34c, 0x34f, 0x359, 0x35b}\n\n// nfkcSparseValues: 869 entries, 3476 bytes\nvar nfkcSparseValues = [869]valueRange{\n\t// Block 0x0, offset 0x0\n\t{value: 0x0002, lo: 0x0d},\n\t{value: 0x0001, lo: 0xa0, hi: 0xa0},\n\t{value: 0x4278, lo: 0xa8, hi: 0xa8},\n\t{value: 0x0083, lo: 0xaa, hi: 0xaa},\n\t{value: 0x4264, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0025, lo: 0xb2, hi: 0xb3},\n\t{value: 0x425a, lo: 0xb4, hi: 0xb4},\n\t{value: 0x01dc, lo: 0xb5, hi: 0xb5},\n\t{value: 0x4291, lo: 0xb8, hi: 0xb8},\n\t{value: 0x0023, lo: 0xb9, hi: 0xb9},\n\t{value: 0x009f, lo: 0xba, hi: 0xba},\n\t{value: 0x221c, lo: 0xbc, hi: 0xbc},\n\t{value: 0x2210, lo: 0xbd, hi: 0xbd},\n\t{value: 0x22b2, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1, offset 0xe\n\t{value: 0x0091, lo: 0x03},\n\t{value: 0x46e2, lo: 0xa0, hi: 0xa1},\n\t{value: 0x4714, lo: 0xaf, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb7, hi: 0xb7},\n\t// Block 0x2, offset 0x12\n\t{value: 0x0003, lo: 0x08},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x0091, lo: 0xb0, hi: 0xb0},\n\t{value: 0x0119, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0095, lo: 0xb2, hi: 0xb2},\n\t{value: 0x00a5, lo: 0xb3, hi: 0xb3},\n\t{value: 0x0143, lo: 0xb4, hi: 0xb6},\n\t{value: 0x00af, lo: 0xb7, hi: 0xb7},\n\t{value: 0x00b3, lo: 0xb8, hi: 0xb8},\n\t// Block 0x3, offset 0x1b\n\t{value: 0x000a, lo: 0x09},\n\t{value: 0x426e, lo: 0x98, hi: 0x98},\n\t{value: 0x4273, lo: 0x99, hi: 0x9a},\n\t{value: 0x4296, lo: 0x9b, hi: 0x9b},\n\t{value: 0x425f, lo: 0x9c, hi: 0x9c},\n\t{value: 0x4282, lo: 0x9d, hi: 0x9d},\n\t{value: 0x0113, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0099, lo: 0xa1, hi: 0xa1},\n\t{value: 0x00a7, lo: 0xa2, hi: 0xa3},\n\t{value: 0x0167, lo: 0xa4, hi: 0xa4},\n\t// Block 0x4, offset 0x25\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0xa000, lo: 0x8d, hi: 0x8d},\n\t{value: 0x37a5, lo: 0x90, hi: 0x90},\n\t{value: 0x37b1, lo: 0x91, hi: 0x91},\n\t{value: 0x379f, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x96, hi: 0x96},\n\t{value: 0x3817, lo: 0x97, hi: 0x97},\n\t{value: 0x37e1, lo: 0x9c, hi: 0x9c},\n\t{value: 0x37c9, lo: 0x9d, hi: 0x9d},\n\t{value: 0x37f3, lo: 0x9e, hi: 0x9e},\n\t{value: 0xa000, lo: 0xb4, hi: 0xb5},\n\t{value: 0x381d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x3823, lo: 0xb7, hi: 0xb7},\n\t// Block 0x5, offset 0x35\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x83, hi: 0x87},\n\t// Block 0x6, offset 0x37\n\t{value: 0x0001, lo: 0x04},\n\t{value: 0x8113, lo: 0x81, hi: 0x82},\n\t{value: 0x8132, lo: 0x84, hi: 0x84},\n\t{value: 0x812d, lo: 0x85, hi: 0x85},\n\t{value: 0x810d, lo: 0x87, hi: 0x87},\n\t// Block 0x7, offset 0x3c\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x97},\n\t{value: 0x8119, lo: 0x98, hi: 0x98},\n\t{value: 0x811a, lo: 0x99, hi: 0x99},\n\t{value: 0x811b, lo: 0x9a, hi: 0x9a},\n\t{value: 0x3841, lo: 0xa2, hi: 0xa2},\n\t{value: 0x3847, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3853, lo: 0xa4, hi: 0xa4},\n\t{value: 0x384d, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3859, lo: 0xa6, hi: 0xa6},\n\t{value: 0xa000, lo: 0xa7, hi: 0xa7},\n\t// Block 0x8, offset 0x47\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x386b, lo: 0x80, hi: 0x80},\n\t{value: 0xa000, lo: 0x81, hi: 0x81},\n\t{value: 0x385f, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x3865, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x95, hi: 0x95},\n\t{value: 0x8132, lo: 0x96, hi: 0x9c},\n\t{value: 0x8132, lo: 0x9f, hi: 0xa2},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8132, lo: 0xab, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t// Block 0x9, offset 0x56\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x811f, lo: 0x91, hi: 0x91},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x812d, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb5, hi: 0xb6},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb9},\n\t{value: 0x8132, lo: 0xba, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbc},\n\t{value: 0x8132, lo: 0xbd, hi: 0xbd},\n\t{value: 0x812d, lo: 0xbe, hi: 0xbe},\n\t{value: 0x8132, lo: 0xbf, hi: 0xbf},\n\t// Block 0xa, offset 0x63\n\t{value: 0x0005, lo: 0x07},\n\t{value: 0x8132, lo: 0x80, hi: 0x80},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x812d, lo: 0x82, hi: 0x83},\n\t{value: 0x812d, lo: 0x84, hi: 0x85},\n\t{value: 0x812d, lo: 0x86, hi: 0x87},\n\t{value: 0x812d, lo: 0x88, hi: 0x89},\n\t{value: 0x8132, lo: 0x8a, hi: 0x8a},\n\t// Block 0xb, offset 0x6b\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8132, lo: 0xab, hi: 0xb1},\n\t{value: 0x812d, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb3},\n\t// Block 0xc, offset 0x6f\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0x96, hi: 0x99},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa7},\n\t{value: 0x8132, lo: 0xa9, hi: 0xad},\n\t// Block 0xd, offset 0x74\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x99, hi: 0x9b},\n\t// Block 0xe, offset 0x76\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x8132, lo: 0x94, hi: 0xa1},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8132, lo: 0xaa, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xaf},\n\t{value: 0x8116, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8117, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8118, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x812d, lo: 0xb9, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbf},\n\t// Block 0xf, offset 0x87\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0xa8, hi: 0xa8},\n\t{value: 0x3ed8, lo: 0xa9, hi: 0xa9},\n\t{value: 0xa000, lo: 0xb0, hi: 0xb0},\n\t{value: 0x3ee0, lo: 0xb1, hi: 0xb1},\n\t{value: 0xa000, lo: 0xb3, hi: 0xb3},\n\t{value: 0x3ee8, lo: 0xb4, hi: 0xb4},\n\t{value: 0x9902, lo: 0xbc, hi: 0xbc},\n\t// Block 0x10, offset 0x8f\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x91, hi: 0x91},\n\t{value: 0x812d, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x93, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x94},\n\t{value: 0x451c, lo: 0x98, hi: 0x9f},\n\t// Block 0x11, offset 0x96\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x12, offset 0x99\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2c9e, lo: 0x8b, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x455c, lo: 0x9c, hi: 0x9d},\n\t{value: 0x456c, lo: 0x9f, hi: 0x9f},\n\t// Block 0x13, offset 0xa0\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x4594, lo: 0xb3, hi: 0xb3},\n\t{value: 0x459c, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x14, offset 0xa4\n\t{value: 0x0008, lo: 0x03},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x4574, lo: 0x99, hi: 0x9b},\n\t{value: 0x458c, lo: 0x9e, hi: 0x9e},\n\t// Block 0x15, offset 0xa8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x16, offset 0xaa\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t// Block 0x17, offset 0xac\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2cb6, lo: 0x88, hi: 0x88},\n\t{value: 0x2cae, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cbe, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x96, hi: 0x97},\n\t{value: 0x45a4, lo: 0x9c, hi: 0x9c},\n\t{value: 0x45ac, lo: 0x9d, hi: 0x9d},\n\t// Block 0x18, offset 0xb5\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x2cc6, lo: 0x94, hi: 0x94},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x19, offset 0xb9\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cce, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2cde, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cd6, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x1a, offset 0xc0\n\t{value: 0x1801, lo: 0x04},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x3ef0, lo: 0x88, hi: 0x88},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8120, lo: 0x95, hi: 0x96},\n\t// Block 0x1b, offset 0xc5\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0xa000, lo: 0xbf, hi: 0xbf},\n\t// Block 0x1c, offset 0xc8\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x2ce6, lo: 0x80, hi: 0x80},\n\t{value: 0x9900, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x2cee, lo: 0x87, hi: 0x87},\n\t{value: 0x2cf6, lo: 0x88, hi: 0x88},\n\t{value: 0x2f50, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2dd8, lo: 0x8b, hi: 0x8b},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x95, hi: 0x96},\n\t// Block 0x1d, offset 0xd2\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xbb, hi: 0xbc},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1e, offset 0xd5\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cfe, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2d0e, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d06, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x1f, offset 0xdc\n\t{value: 0x6bea, lo: 0x07},\n\t{value: 0x9904, lo: 0x8a, hi: 0x8a},\n\t{value: 0x9900, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x3ef8, lo: 0x9a, hi: 0x9a},\n\t{value: 0x2f58, lo: 0x9c, hi: 0x9c},\n\t{value: 0x2de3, lo: 0x9d, hi: 0x9d},\n\t{value: 0x2d16, lo: 0x9e, hi: 0x9f},\n\t// Block 0x20, offset 0xe4\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x2621, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8122, lo: 0xb8, hi: 0xb9},\n\t{value: 0x8104, lo: 0xba, hi: 0xba},\n\t// Block 0x21, offset 0xe8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8123, lo: 0x88, hi: 0x8b},\n\t// Block 0x22, offset 0xea\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x2636, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8124, lo: 0xb8, hi: 0xb9},\n\t// Block 0x23, offset 0xed\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8125, lo: 0x88, hi: 0x8b},\n\t{value: 0x2628, lo: 0x9c, hi: 0x9c},\n\t{value: 0x262f, lo: 0x9d, hi: 0x9d},\n\t// Block 0x24, offset 0xf1\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x030b, lo: 0x8c, hi: 0x8c},\n\t{value: 0x812d, lo: 0x98, hi: 0x99},\n\t{value: 0x812d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb7},\n\t{value: 0x812b, lo: 0xb9, hi: 0xb9},\n\t// Block 0x25, offset 0xf7\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x2644, lo: 0x83, hi: 0x83},\n\t{value: 0x264b, lo: 0x8d, hi: 0x8d},\n\t{value: 0x2652, lo: 0x92, hi: 0x92},\n\t{value: 0x2659, lo: 0x97, hi: 0x97},\n\t{value: 0x2660, lo: 0x9c, hi: 0x9c},\n\t{value: 0x263d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8126, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8127, lo: 0xb2, hi: 0xb2},\n\t{value: 0x4a84, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8128, lo: 0xb4, hi: 0xb4},\n\t{value: 0x4a8d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x45b4, lo: 0xb6, hi: 0xb6},\n\t{value: 0x45f4, lo: 0xb7, hi: 0xb7},\n\t{value: 0x45bc, lo: 0xb8, hi: 0xb8},\n\t{value: 0x45ff, lo: 0xb9, hi: 0xb9},\n\t{value: 0x8127, lo: 0xba, hi: 0xbd},\n\t// Block 0x26, offset 0x108\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x8127, lo: 0x80, hi: 0x80},\n\t{value: 0x4a96, lo: 0x81, hi: 0x81},\n\t{value: 0x8132, lo: 0x82, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0x86, hi: 0x87},\n\t{value: 0x266e, lo: 0x93, hi: 0x93},\n\t{value: 0x2675, lo: 0x9d, hi: 0x9d},\n\t{value: 0x267c, lo: 0xa2, hi: 0xa2},\n\t{value: 0x2683, lo: 0xa7, hi: 0xa7},\n\t{value: 0x268a, lo: 0xac, hi: 0xac},\n\t{value: 0x2667, lo: 0xb9, hi: 0xb9},\n\t// Block 0x27, offset 0x114\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x86, hi: 0x86},\n\t// Block 0x28, offset 0x116\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x2d1e, lo: 0xa6, hi: 0xa6},\n\t{value: 0x9900, lo: 0xae, hi: 0xae},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x29, offset 0x11c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t// Block 0x2a, offset 0x11e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x030f, lo: 0xbc, hi: 0xbc},\n\t// Block 0x2b, offset 0x120\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xa000, lo: 0x80, hi: 0x92},\n\t// Block 0x2c, offset 0x122\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xb900, lo: 0xa1, hi: 0xb5},\n\t// Block 0x2d, offset 0x124\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0xa8, hi: 0xbf},\n\t// Block 0x2e, offset 0x126\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0x80, hi: 0x82},\n\t// Block 0x2f, offset 0x128\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9f},\n\t// Block 0x30, offset 0x12a\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x94, hi: 0x94},\n\t{value: 0x8104, lo: 0xb4, hi: 0xb4},\n\t// Block 0x31, offset 0x12d\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9d},\n\t// Block 0x32, offset 0x130\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8131, lo: 0xa9, hi: 0xa9},\n\t// Block 0x33, offset 0x132\n\t{value: 0x0004, lo: 0x02},\n\t{value: 0x812e, lo: 0xb9, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbb},\n\t// Block 0x34, offset 0x135\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x97, hi: 0x97},\n\t{value: 0x812d, lo: 0x98, hi: 0x98},\n\t// Block 0x35, offset 0x138\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8104, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8132, lo: 0xb5, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x36, offset 0x13c\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t{value: 0x812d, lo: 0xb5, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x37, offset 0x141\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x2d66, lo: 0x80, hi: 0x80},\n\t{value: 0x2d6e, lo: 0x81, hi: 0x81},\n\t{value: 0xa000, lo: 0x82, hi: 0x82},\n\t{value: 0x2d76, lo: 0x83, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xab, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xac},\n\t{value: 0x8132, lo: 0xad, hi: 0xb3},\n\t// Block 0x38, offset 0x14a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xaa, hi: 0xab},\n\t// Block 0x39, offset 0x14c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8104, lo: 0xb2, hi: 0xb3},\n\t// Block 0x3a, offset 0x14f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x3b, offset 0x151\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x92},\n\t{value: 0x8101, lo: 0x94, hi: 0x94},\n\t{value: 0x812d, lo: 0x95, hi: 0x99},\n\t{value: 0x8132, lo: 0x9a, hi: 0x9b},\n\t{value: 0x812d, lo: 0x9c, hi: 0x9f},\n\t{value: 0x8132, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8101, lo: 0xa2, hi: 0xa8},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t{value: 0x8132, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb9},\n\t// Block 0x3c, offset 0x15c\n\t{value: 0x0002, lo: 0x0a},\n\t{value: 0x0043, lo: 0xac, hi: 0xac},\n\t{value: 0x00d1, lo: 0xad, hi: 0xad},\n\t{value: 0x0045, lo: 0xae, hi: 0xae},\n\t{value: 0x0049, lo: 0xb0, hi: 0xb1},\n\t{value: 0x00e6, lo: 0xb2, hi: 0xb2},\n\t{value: 0x004f, lo: 0xb3, hi: 0xba},\n\t{value: 0x005f, lo: 0xbc, hi: 0xbc},\n\t{value: 0x00ef, lo: 0xbd, hi: 0xbd},\n\t{value: 0x0061, lo: 0xbe, hi: 0xbe},\n\t{value: 0x0065, lo: 0xbf, hi: 0xbf},\n\t// Block 0x3d, offset 0x167\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x0001, lo: 0x80, hi: 0x8a},\n\t{value: 0x043b, lo: 0x91, hi: 0x91},\n\t{value: 0x429b, lo: 0x97, hi: 0x97},\n\t{value: 0x001d, lo: 0xa4, hi: 0xa4},\n\t{value: 0x1873, lo: 0xa5, hi: 0xa5},\n\t{value: 0x1b5c, lo: 0xa6, hi: 0xa6},\n\t{value: 0x0001, lo: 0xaf, hi: 0xaf},\n\t{value: 0x2691, lo: 0xb3, hi: 0xb3},\n\t{value: 0x27fe, lo: 0xb4, hi: 0xb4},\n\t{value: 0x2698, lo: 0xb6, hi: 0xb6},\n\t{value: 0x2808, lo: 0xb7, hi: 0xb7},\n\t{value: 0x186d, lo: 0xbc, hi: 0xbc},\n\t{value: 0x4269, lo: 0xbe, hi: 0xbe},\n\t// Block 0x3e, offset 0x175\n\t{value: 0x0002, lo: 0x0d},\n\t{value: 0x1933, lo: 0x87, hi: 0x87},\n\t{value: 0x1930, lo: 0x88, hi: 0x88},\n\t{value: 0x1870, lo: 0x89, hi: 0x89},\n\t{value: 0x298e, lo: 0x97, hi: 0x97},\n\t{value: 0x0001, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0021, lo: 0xb0, hi: 0xb0},\n\t{value: 0x0093, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0029, lo: 0xb4, hi: 0xb9},\n\t{value: 0x0017, lo: 0xba, hi: 0xba},\n\t{value: 0x0467, lo: 0xbb, hi: 0xbb},\n\t{value: 0x003b, lo: 0xbc, hi: 0xbc},\n\t{value: 0x0011, lo: 0xbd, hi: 0xbe},\n\t{value: 0x009d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x3f, offset 0x183\n\t{value: 0x0002, lo: 0x0f},\n\t{value: 0x0021, lo: 0x80, hi: 0x89},\n\t{value: 0x0017, lo: 0x8a, hi: 0x8a},\n\t{value: 0x0467, lo: 0x8b, hi: 0x8b},\n\t{value: 0x003b, lo: 0x8c, hi: 0x8c},\n\t{value: 0x0011, lo: 0x8d, hi: 0x8e},\n\t{value: 0x0083, lo: 0x90, hi: 0x90},\n\t{value: 0x008b, lo: 0x91, hi: 0x91},\n\t{value: 0x009f, lo: 0x92, hi: 0x92},\n\t{value: 0x00b1, lo: 0x93, hi: 0x93},\n\t{value: 0x0104, lo: 0x94, hi: 0x94},\n\t{value: 0x0091, lo: 0x95, hi: 0x95},\n\t{value: 0x0097, lo: 0x96, hi: 0x99},\n\t{value: 0x00a1, lo: 0x9a, hi: 0x9a},\n\t{value: 0x00a7, lo: 0x9b, hi: 0x9c},\n\t{value: 0x1999, lo: 0xa8, hi: 0xa8},\n\t// Block 0x40, offset 0x193\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x8132, lo: 0x90, hi: 0x91},\n\t{value: 0x8101, lo: 0x92, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x97},\n\t{value: 0x8101, lo: 0x98, hi: 0x9a},\n\t{value: 0x8132, lo: 0x9b, hi: 0x9c},\n\t{value: 0x8132, lo: 0xa1, hi: 0xa1},\n\t{value: 0x8101, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa7},\n\t{value: 0x812d, lo: 0xa8, hi: 0xa8},\n\t{value: 0x8132, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8101, lo: 0xaa, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t// Block 0x41, offset 0x1a1\n\t{value: 0x0007, lo: 0x06},\n\t{value: 0x2180, lo: 0x89, hi: 0x89},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t{value: 0x3bb9, lo: 0x9a, hi: 0x9b},\n\t{value: 0x3bc7, lo: 0xae, hi: 0xae},\n\t// Block 0x42, offset 0x1a8\n\t{value: 0x000e, lo: 0x05},\n\t{value: 0x3bce, lo: 0x8d, hi: 0x8e},\n\t{value: 0x3bd5, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t// Block 0x43, offset 0x1ae\n\t{value: 0x0173, lo: 0x0e},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0x3be3, lo: 0x84, hi: 0x84},\n\t{value: 0xa000, lo: 0x88, hi: 0x88},\n\t{value: 0x3bea, lo: 0x89, hi: 0x89},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0x3bf1, lo: 0x8c, hi: 0x8c},\n\t{value: 0xa000, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3bf8, lo: 0xa4, hi: 0xa4},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3bff, lo: 0xa6, hi: 0xa6},\n\t{value: 0x269f, lo: 0xac, hi: 0xad},\n\t{value: 0x26a6, lo: 0xaf, hi: 0xaf},\n\t{value: 0x281c, lo: 0xb0, hi: 0xb0},\n\t{value: 0xa000, lo: 0xbc, hi: 0xbc},\n\t// Block 0x44, offset 0x1bd\n\t{value: 0x0007, lo: 0x03},\n\t{value: 0x3c68, lo: 0xa0, hi: 0xa1},\n\t{value: 0x3c92, lo: 0xa2, hi: 0xa3},\n\t{value: 0x3cbc, lo: 0xaa, hi: 0xad},\n\t// Block 0x45, offset 0x1c1\n\t{value: 0x0004, lo: 0x01},\n\t{value: 0x048b, lo: 0xa9, hi: 0xaa},\n\t// Block 0x46, offset 0x1c3\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x0057, lo: 0x80, hi: 0x8f},\n\t{value: 0x0083, lo: 0x90, hi: 0xa9},\n\t{value: 0x0021, lo: 0xaa, hi: 0xaa},\n\t// Block 0x47, offset 0x1c7\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x299b, lo: 0x8c, hi: 0x8c},\n\t// Block 0x48, offset 0x1c9\n\t{value: 0x0263, lo: 0x02},\n\t{value: 0x1b8c, lo: 0xb4, hi: 0xb4},\n\t{value: 0x192d, lo: 0xb5, hi: 0xb6},\n\t// Block 0x49, offset 0x1cc\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x44dd, lo: 0x9c, hi: 0x9c},\n\t// Block 0x4a, offset 0x1ce\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0095, lo: 0xbc, hi: 0xbc},\n\t{value: 0x006d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x4b, offset 0x1d1\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xaf, hi: 0xb1},\n\t// Block 0x4c, offset 0x1d3\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x047f, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x4d, offset 0x1d6\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xa0, hi: 0xbf},\n\t// Block 0x4e, offset 0x1d8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x0dc3, lo: 0x9f, hi: 0x9f},\n\t// Block 0x4f, offset 0x1da\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x162f, lo: 0xb3, hi: 0xb3},\n\t// Block 0x50, offset 0x1dc\n\t{value: 0x0004, lo: 0x0b},\n\t{value: 0x1597, lo: 0x80, hi: 0x82},\n\t{value: 0x15af, lo: 0x83, hi: 0x83},\n\t{value: 0x15c7, lo: 0x84, hi: 0x85},\n\t{value: 0x15d7, lo: 0x86, hi: 0x89},\n\t{value: 0x15eb, lo: 0x8a, hi: 0x8c},\n\t{value: 0x15ff, lo: 0x8d, hi: 0x8d},\n\t{value: 0x1607, lo: 0x8e, hi: 0x8e},\n\t{value: 0x160f, lo: 0x8f, hi: 0x90},\n\t{value: 0x161b, lo: 0x91, hi: 0x93},\n\t{value: 0x162b, lo: 0x94, hi: 0x94},\n\t{value: 0x1633, lo: 0x95, hi: 0x95},\n\t// Block 0x51, offset 0x1e8\n\t{value: 0x0004, lo: 0x09},\n\t{value: 0x0001, lo: 0x80, hi: 0x80},\n\t{value: 0x812c, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8131, lo: 0xab, hi: 0xab},\n\t{value: 0x8133, lo: 0xac, hi: 0xac},\n\t{value: 0x812e, lo: 0xad, hi: 0xad},\n\t{value: 0x812f, lo: 0xae, hi: 0xae},\n\t{value: 0x812f, lo: 0xaf, hi: 0xaf},\n\t{value: 0x04b3, lo: 0xb6, hi: 0xb6},\n\t{value: 0x0887, lo: 0xb8, hi: 0xba},\n\t// Block 0x52, offset 0x1f2\n\t{value: 0x0006, lo: 0x09},\n\t{value: 0x0313, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0317, lo: 0xb2, hi: 0xb2},\n\t{value: 0x4a3b, lo: 0xb3, hi: 0xb3},\n\t{value: 0x031b, lo: 0xb4, hi: 0xb4},\n\t{value: 0x4a41, lo: 0xb5, hi: 0xb6},\n\t{value: 0x031f, lo: 0xb7, hi: 0xb7},\n\t{value: 0x0323, lo: 0xb8, hi: 0xb8},\n\t{value: 0x0327, lo: 0xb9, hi: 0xb9},\n\t{value: 0x4a4d, lo: 0xba, hi: 0xbf},\n\t// Block 0x53, offset 0x1fc\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb4, hi: 0xbd},\n\t// Block 0x54, offset 0x1ff\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x020f, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0212, lo: 0x9d, hi: 0x9d},\n\t{value: 0x8132, lo: 0x9e, hi: 0x9f},\n\t// Block 0x55, offset 0x203\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb1},\n\t// Block 0x56, offset 0x205\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x163b, lo: 0xb0, hi: 0xb0},\n\t// Block 0x57, offset 0x207\n\t{value: 0x000c, lo: 0x01},\n\t{value: 0x00d7, lo: 0xb8, hi: 0xb9},\n\t// Block 0x58, offset 0x209\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t// Block 0x59, offset 0x20b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xa0, hi: 0xb1},\n\t// Block 0x5a, offset 0x20e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xab, hi: 0xad},\n\t// Block 0x5b, offset 0x210\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x93, hi: 0x93},\n\t// Block 0x5c, offset 0x212\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb3, hi: 0xb3},\n\t// Block 0x5d, offset 0x214\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t// Block 0x5e, offset 0x216\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x8132, lo: 0xbe, hi: 0xbf},\n\t// Block 0x5f, offset 0x21c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t// Block 0x60, offset 0x21f\n\t{value: 0x0008, lo: 0x03},\n\t{value: 0x1637, lo: 0x9c, hi: 0x9d},\n\t{value: 0x0125, lo: 0x9e, hi: 0x9e},\n\t{value: 0x1643, lo: 0x9f, hi: 0x9f},\n\t// Block 0x61, offset 0x223\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xad, hi: 0xad},\n\t// Block 0x62, offset 0x225\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xe500, lo: 0x80, hi: 0x80},\n\t{value: 0xc600, lo: 0x81, hi: 0x9b},\n\t{value: 0xe500, lo: 0x9c, hi: 0x9c},\n\t{value: 0xc600, lo: 0x9d, hi: 0xb7},\n\t{value: 0xe500, lo: 0xb8, hi: 0xb8},\n\t{value: 0xc600, lo: 0xb9, hi: 0xbf},\n\t// Block 0x63, offset 0x22c\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x93},\n\t{value: 0xe500, lo: 0x94, hi: 0x94},\n\t{value: 0xc600, lo: 0x95, hi: 0xaf},\n\t{value: 0xe500, lo: 0xb0, hi: 0xb0},\n\t{value: 0xc600, lo: 0xb1, hi: 0xbf},\n\t// Block 0x64, offset 0x232\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8b},\n\t{value: 0xe500, lo: 0x8c, hi: 0x8c},\n\t{value: 0xc600, lo: 0x8d, hi: 0xa7},\n\t{value: 0xe500, lo: 0xa8, hi: 0xa8},\n\t{value: 0xc600, lo: 0xa9, hi: 0xbf},\n\t// Block 0x65, offset 0x238\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xc600, lo: 0x80, hi: 0x83},\n\t{value: 0xe500, lo: 0x84, hi: 0x84},\n\t{value: 0xc600, lo: 0x85, hi: 0x9f},\n\t{value: 0xe500, lo: 0xa0, hi: 0xa0},\n\t{value: 0xc600, lo: 0xa1, hi: 0xbb},\n\t{value: 0xe500, lo: 0xbc, hi: 0xbc},\n\t{value: 0xc600, lo: 0xbd, hi: 0xbf},\n\t// Block 0x66, offset 0x240\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x97},\n\t{value: 0xe500, lo: 0x98, hi: 0x98},\n\t{value: 0xc600, lo: 0x99, hi: 0xb3},\n\t{value: 0xe500, lo: 0xb4, hi: 0xb4},\n\t{value: 0xc600, lo: 0xb5, hi: 0xbf},\n\t// Block 0x67, offset 0x246\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8f},\n\t{value: 0xe500, lo: 0x90, hi: 0x90},\n\t{value: 0xc600, lo: 0x91, hi: 0xab},\n\t{value: 0xe500, lo: 0xac, hi: 0xac},\n\t{value: 0xc600, lo: 0xad, hi: 0xbf},\n\t// Block 0x68, offset 0x24c\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t{value: 0xe500, lo: 0xa4, hi: 0xa4},\n\t{value: 0xc600, lo: 0xa5, hi: 0xbf},\n\t// Block 0x69, offset 0x252\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t// Block 0x6a, offset 0x256\n\t{value: 0x0002, lo: 0x01},\n\t{value: 0x0003, lo: 0x81, hi: 0xbf},\n\t// Block 0x6b, offset 0x258\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x6c, offset 0x25a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xa0, hi: 0xa0},\n\t// Block 0x6d, offset 0x25c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb6, hi: 0xba},\n\t// Block 0x6e, offset 0x25e\n\t{value: 0x002c, lo: 0x05},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x8f, hi: 0x8f},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb8},\n\t{value: 0x8101, lo: 0xb9, hi: 0xba},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x6f, offset 0x264\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t// Block 0x70, offset 0x267\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x71, offset 0x26a\n\t{value: 0x17fe, lo: 0x07},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x4238, lo: 0x9a, hi: 0x9a},\n\t{value: 0xa000, lo: 0x9b, hi: 0x9b},\n\t{value: 0x4242, lo: 0x9c, hi: 0x9c},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x424c, lo: 0xab, hi: 0xab},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x72, offset 0x272\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x8132, lo: 0x80, hi: 0x82},\n\t{value: 0x9900, lo: 0xa7, hi: 0xa7},\n\t{value: 0x2d7e, lo: 0xae, hi: 0xae},\n\t{value: 0x2d88, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb1, hi: 0xb2},\n\t{value: 0x8104, lo: 0xb3, hi: 0xb4},\n\t// Block 0x73, offset 0x279\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x74, offset 0x27c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb5, hi: 0xb5},\n\t{value: 0x8102, lo: 0xb6, hi: 0xb6},\n\t// Block 0x75, offset 0x27f\n\t{value: 0x0002, lo: 0x01},\n\t{value: 0x8102, lo: 0xa9, hi: 0xaa},\n\t// Block 0x76, offset 0x281\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2d92, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d9c, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x8132, lo: 0xa6, hi: 0xac},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t// Block 0x77, offset 0x289\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x86, hi: 0x86},\n\t// Block 0x78, offset 0x28c\n\t{value: 0x6b5a, lo: 0x06},\n\t{value: 0x9900, lo: 0xb0, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb9, hi: 0xb9},\n\t{value: 0x9900, lo: 0xba, hi: 0xba},\n\t{value: 0x2db0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x2da6, lo: 0xbc, hi: 0xbd},\n\t{value: 0x2dba, lo: 0xbe, hi: 0xbe},\n\t// Block 0x79, offset 0x293\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x83, hi: 0x83},\n\t// Block 0x7a, offset 0x296\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x9900, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb8, hi: 0xb9},\n\t{value: 0x2dc4, lo: 0xba, hi: 0xba},\n\t{value: 0x2dce, lo: 0xbb, hi: 0xbb},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x7b, offset 0x29c\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0x80, hi: 0x80},\n\t// Block 0x7c, offset 0x29e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x7d, offset 0x2a0\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x7e, offset 0x2a3\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xab, hi: 0xab},\n\t// Block 0x7f, offset 0x2a5\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xb4, hi: 0xb4},\n\t// Block 0x80, offset 0x2a7\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x87, hi: 0x87},\n\t// Block 0x81, offset 0x2a9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x99, hi: 0x99},\n\t// Block 0x82, offset 0x2ab\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0x82, hi: 0x82},\n\t{value: 0x8104, lo: 0x84, hi: 0x85},\n\t// Block 0x83, offset 0x2ae\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0xb0, hi: 0xb4},\n\t// Block 0x84, offset 0x2b0\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb6},\n\t// Block 0x85, offset 0x2b2\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0x9e, hi: 0x9e},\n\t// Block 0x86, offset 0x2b4\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x45cc, lo: 0x9e, hi: 0x9e},\n\t{value: 0x45d6, lo: 0x9f, hi: 0x9f},\n\t{value: 0x460a, lo: 0xa0, hi: 0xa0},\n\t{value: 0x4618, lo: 0xa1, hi: 0xa1},\n\t{value: 0x4626, lo: 0xa2, hi: 0xa2},\n\t{value: 0x4634, lo: 0xa3, hi: 0xa3},\n\t{value: 0x4642, lo: 0xa4, hi: 0xa4},\n\t{value: 0x812b, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8101, lo: 0xa7, hi: 0xa9},\n\t{value: 0x8130, lo: 0xad, hi: 0xad},\n\t{value: 0x812b, lo: 0xae, hi: 0xb2},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbf},\n\t// Block 0x87, offset 0x2c1\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x812d, lo: 0x80, hi: 0x82},\n\t{value: 0x8132, lo: 0x85, hi: 0x89},\n\t{value: 0x812d, lo: 0x8a, hi: 0x8b},\n\t{value: 0x8132, lo: 0xaa, hi: 0xad},\n\t{value: 0x45e0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x45ea, lo: 0xbc, hi: 0xbc},\n\t{value: 0x4650, lo: 0xbd, hi: 0xbd},\n\t{value: 0x466c, lo: 0xbe, hi: 0xbe},\n\t{value: 0x465e, lo: 0xbf, hi: 0xbf},\n\t// Block 0x88, offset 0x2cb\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x467a, lo: 0x80, hi: 0x80},\n\t// Block 0x89, offset 0x2cd\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x82, hi: 0x84},\n\t// Block 0x8a, offset 0x2cf\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x0043, lo: 0x80, hi: 0x99},\n\t{value: 0x0083, lo: 0x9a, hi: 0xb3},\n\t{value: 0x0043, lo: 0xb4, hi: 0xbf},\n\t// Block 0x8b, offset 0x2d3\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x005b, lo: 0x80, hi: 0x8d},\n\t{value: 0x0083, lo: 0x8e, hi: 0x94},\n\t{value: 0x0093, lo: 0x96, hi: 0xa7},\n\t{value: 0x0043, lo: 0xa8, hi: 0xbf},\n\t// Block 0x8c, offset 0x2d8\n\t{value: 0x0002, lo: 0x0b},\n\t{value: 0x0073, lo: 0x80, hi: 0x81},\n\t{value: 0x0083, lo: 0x82, hi: 0x9b},\n\t{value: 0x0043, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0047, lo: 0x9e, hi: 0x9f},\n\t{value: 0x004f, lo: 0xa2, hi: 0xa2},\n\t{value: 0x0055, lo: 0xa5, hi: 0xa6},\n\t{value: 0x005d, lo: 0xa9, hi: 0xac},\n\t{value: 0x0067, lo: 0xae, hi: 0xb5},\n\t{value: 0x0083, lo: 0xb6, hi: 0xb9},\n\t{value: 0x008d, lo: 0xbb, hi: 0xbb},\n\t{value: 0x0091, lo: 0xbd, hi: 0xbf},\n\t// Block 0x8d, offset 0x2e4\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x0097, lo: 0x80, hi: 0x83},\n\t{value: 0x00a1, lo: 0x85, hi: 0x8f},\n\t{value: 0x0043, lo: 0x90, hi: 0xa9},\n\t{value: 0x0083, lo: 0xaa, hi: 0xbf},\n\t// Block 0x8e, offset 0x2e9\n\t{value: 0x0002, lo: 0x08},\n\t{value: 0x00af, lo: 0x80, hi: 0x83},\n\t{value: 0x0043, lo: 0x84, hi: 0x85},\n\t{value: 0x0049, lo: 0x87, hi: 0x8a},\n\t{value: 0x0055, lo: 0x8d, hi: 0x94},\n\t{value: 0x0067, lo: 0x96, hi: 0x9c},\n\t{value: 0x0083, lo: 0x9e, hi: 0xb7},\n\t{value: 0x0043, lo: 0xb8, hi: 0xb9},\n\t{value: 0x0049, lo: 0xbb, hi: 0xbe},\n\t// Block 0x8f, offset 0x2f2\n\t{value: 0x0002, lo: 0x05},\n\t{value: 0x0053, lo: 0x80, hi: 0x84},\n\t{value: 0x005f, lo: 0x86, hi: 0x86},\n\t{value: 0x0067, lo: 0x8a, hi: 0x90},\n\t{value: 0x0083, lo: 0x92, hi: 0xab},\n\t{value: 0x0043, lo: 0xac, hi: 0xbf},\n\t// Block 0x90, offset 0x2f8\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x006b, lo: 0x80, hi: 0x85},\n\t{value: 0x0083, lo: 0x86, hi: 0x9f},\n\t{value: 0x0043, lo: 0xa0, hi: 0xb9},\n\t{value: 0x0083, lo: 0xba, hi: 0xbf},\n\t// Block 0x91, offset 0x2fd\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x008f, lo: 0x80, hi: 0x93},\n\t{value: 0x0043, lo: 0x94, hi: 0xad},\n\t{value: 0x0083, lo: 0xae, hi: 0xbf},\n\t// Block 0x92, offset 0x301\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x00a7, lo: 0x80, hi: 0x87},\n\t{value: 0x0043, lo: 0x88, hi: 0xa1},\n\t{value: 0x0083, lo: 0xa2, hi: 0xbb},\n\t{value: 0x0043, lo: 0xbc, hi: 0xbf},\n\t// Block 0x93, offset 0x306\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x004b, lo: 0x80, hi: 0x95},\n\t{value: 0x0083, lo: 0x96, hi: 0xaf},\n\t{value: 0x0043, lo: 0xb0, hi: 0xbf},\n\t// Block 0x94, offset 0x30a\n\t{value: 0x0003, lo: 0x0f},\n\t{value: 0x01b8, lo: 0x80, hi: 0x80},\n\t{value: 0x045f, lo: 0x81, hi: 0x81},\n\t{value: 0x01bb, lo: 0x82, hi: 0x9a},\n\t{value: 0x045b, lo: 0x9b, hi: 0x9b},\n\t{value: 0x01c7, lo: 0x9c, hi: 0x9c},\n\t{value: 0x01d0, lo: 0x9d, hi: 0x9d},\n\t{value: 0x01d6, lo: 0x9e, hi: 0x9e},\n\t{value: 0x01fa, lo: 0x9f, hi: 0x9f},\n\t{value: 0x01eb, lo: 0xa0, hi: 0xa0},\n\t{value: 0x01e8, lo: 0xa1, hi: 0xa1},\n\t{value: 0x0173, lo: 0xa2, hi: 0xb2},\n\t{value: 0x0188, lo: 0xb3, hi: 0xb3},\n\t{value: 0x01a6, lo: 0xb4, hi: 0xba},\n\t{value: 0x045f, lo: 0xbb, hi: 0xbb},\n\t{value: 0x01bb, lo: 0xbc, hi: 0xbf},\n\t// Block 0x95, offset 0x31a\n\t{value: 0x0003, lo: 0x0d},\n\t{value: 0x01c7, lo: 0x80, hi: 0x94},\n\t{value: 0x045b, lo: 0x95, hi: 0x95},\n\t{value: 0x01c7, lo: 0x96, hi: 0x96},\n\t{value: 0x01d0, lo: 0x97, hi: 0x97},\n\t{value: 0x01d6, lo: 0x98, hi: 0x98},\n\t{value: 0x01fa, lo: 0x99, hi: 0x99},\n\t{value: 0x01eb, lo: 0x9a, hi: 0x9a},\n\t{value: 0x01e8, lo: 0x9b, hi: 0x9b},\n\t{value: 0x0173, lo: 0x9c, hi: 0xac},\n\t{value: 0x0188, lo: 0xad, hi: 0xad},\n\t{value: 0x01a6, lo: 0xae, hi: 0xb4},\n\t{value: 0x045f, lo: 0xb5, hi: 0xb5},\n\t{value: 0x01bb, lo: 0xb6, hi: 0xbf},\n\t// Block 0x96, offset 0x328\n\t{value: 0x0003, lo: 0x0d},\n\t{value: 0x01d9, lo: 0x80, hi: 0x8e},\n\t{value: 0x045b, lo: 0x8f, hi: 0x8f},\n\t{value: 0x01c7, lo: 0x90, hi: 0x90},\n\t{value: 0x01d0, lo: 0x91, hi: 0x91},\n\t{value: 0x01d6, lo: 0x92, hi: 0x92},\n\t{value: 0x01fa, lo: 0x93, hi: 0x93},\n\t{value: 0x01eb, lo: 0x94, hi: 0x94},\n\t{value: 0x01e8, lo: 0x95, hi: 0x95},\n\t{value: 0x0173, lo: 0x96, hi: 0xa6},\n\t{value: 0x0188, lo: 0xa7, hi: 0xa7},\n\t{value: 0x01a6, lo: 0xa8, hi: 0xae},\n\t{value: 0x045f, lo: 0xaf, hi: 0xaf},\n\t{value: 0x01bb, lo: 0xb0, hi: 0xbf},\n\t// Block 0x97, offset 0x336\n\t{value: 0x0003, lo: 0x0d},\n\t{value: 0x01eb, lo: 0x80, hi: 0x88},\n\t{value: 0x045b, lo: 0x89, hi: 0x89},\n\t{value: 0x01c7, lo: 0x8a, hi: 0x8a},\n\t{value: 0x01d0, lo: 0x8b, hi: 0x8b},\n\t{value: 0x01d6, lo: 0x8c, hi: 0x8c},\n\t{value: 0x01fa, lo: 0x8d, hi: 0x8d},\n\t{value: 0x01eb, lo: 0x8e, hi: 0x8e},\n\t{value: 0x01e8, lo: 0x8f, hi: 0x8f},\n\t{value: 0x0173, lo: 0x90, hi: 0xa0},\n\t{value: 0x0188, lo: 0xa1, hi: 0xa1},\n\t{value: 0x01a6, lo: 0xa2, hi: 0xa8},\n\t{value: 0x045f, lo: 0xa9, hi: 0xa9},\n\t{value: 0x01bb, lo: 0xaa, hi: 0xbf},\n\t// Block 0x98, offset 0x344\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0x80, hi: 0x86},\n\t{value: 0x8132, lo: 0x88, hi: 0x98},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa1},\n\t{value: 0x8132, lo: 0xa3, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa6, hi: 0xaa},\n\t// Block 0x99, offset 0x34a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x90, hi: 0x96},\n\t// Block 0x9a, offset 0x34c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x84, hi: 0x89},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x9b, offset 0x34f\n\t{value: 0x0002, lo: 0x09},\n\t{value: 0x0063, lo: 0x80, hi: 0x89},\n\t{value: 0x1951, lo: 0x8a, hi: 0x8a},\n\t{value: 0x1981, lo: 0x8b, hi: 0x8b},\n\t{value: 0x199c, lo: 0x8c, hi: 0x8c},\n\t{value: 0x19a2, lo: 0x8d, hi: 0x8d},\n\t{value: 0x1bc0, lo: 0x8e, hi: 0x8e},\n\t{value: 0x19ae, lo: 0x8f, hi: 0x8f},\n\t{value: 0x197b, lo: 0xaa, hi: 0xaa},\n\t{value: 0x197e, lo: 0xab, hi: 0xab},\n\t// Block 0x9c, offset 0x359\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x193f, lo: 0x90, hi: 0x90},\n\t// Block 0x9d, offset 0x35b\n\t{value: 0x0028, lo: 0x09},\n\t{value: 0x2862, lo: 0x80, hi: 0x80},\n\t{value: 0x2826, lo: 0x81, hi: 0x81},\n\t{value: 0x2830, lo: 0x82, hi: 0x82},\n\t{value: 0x2844, lo: 0x83, hi: 0x84},\n\t{value: 0x284e, lo: 0x85, hi: 0x86},\n\t{value: 0x283a, lo: 0x87, hi: 0x87},\n\t{value: 0x2858, lo: 0x88, hi: 0x88},\n\t{value: 0x0b6f, lo: 0x90, hi: 0x90},\n\t{value: 0x08e7, lo: 0x91, hi: 0x91},\n}\n\n// recompMap: 7520 bytes (entries only)\nvar recompMap = map[uint32]rune{\n\t0x00410300: 0x00C0,\n\t0x00410301: 0x00C1,\n\t0x00410302: 0x00C2,\n\t0x00410303: 0x00C3,\n\t0x00410308: 0x00C4,\n\t0x0041030A: 0x00C5,\n\t0x00430327: 0x00C7,\n\t0x00450300: 0x00C8,\n\t0x00450301: 0x00C9,\n\t0x00450302: 0x00CA,\n\t0x00450308: 0x00CB,\n\t0x00490300: 0x00CC,\n\t0x00490301: 0x00CD,\n\t0x00490302: 0x00CE,\n\t0x00490308: 0x00CF,\n\t0x004E0303: 0x00D1,\n\t0x004F0300: 0x00D2,\n\t0x004F0301: 0x00D3,\n\t0x004F0302: 0x00D4,\n\t0x004F0303: 0x00D5,\n\t0x004F0308: 0x00D6,\n\t0x00550300: 0x00D9,\n\t0x00550301: 0x00DA,\n\t0x00550302: 0x00DB,\n\t0x00550308: 0x00DC,\n\t0x00590301: 0x00DD,\n\t0x00610300: 0x00E0,\n\t0x00610301: 0x00E1,\n\t0x00610302: 0x00E2,\n\t0x00610303: 0x00E3,\n\t0x00610308: 0x00E4,\n\t0x0061030A: 0x00E5,\n\t0x00630327: 0x00E7,\n\t0x00650300: 0x00E8,\n\t0x00650301: 0x00E9,\n\t0x00650302: 0x00EA,\n\t0x00650308: 0x00EB,\n\t0x00690300: 0x00EC,\n\t0x00690301: 0x00ED,\n\t0x00690302: 0x00EE,\n\t0x00690308: 0x00EF,\n\t0x006E0303: 0x00F1,\n\t0x006F0300: 0x00F2,\n\t0x006F0301: 0x00F3,\n\t0x006F0302: 0x00F4,\n\t0x006F0303: 0x00F5,\n\t0x006F0308: 0x00F6,\n\t0x00750300: 0x00F9,\n\t0x00750301: 0x00FA,\n\t0x00750302: 0x00FB,\n\t0x00750308: 0x00FC,\n\t0x00790301: 0x00FD,\n\t0x00790308: 0x00FF,\n\t0x00410304: 0x0100,\n\t0x00610304: 0x0101,\n\t0x00410306: 0x0102,\n\t0x00610306: 0x0103,\n\t0x00410328: 0x0104,\n\t0x00610328: 0x0105,\n\t0x00430301: 0x0106,\n\t0x00630301: 0x0107,\n\t0x00430302: 0x0108,\n\t0x00630302: 0x0109,\n\t0x00430307: 0x010A,\n\t0x00630307: 0x010B,\n\t0x0043030C: 0x010C,\n\t0x0063030C: 0x010D,\n\t0x0044030C: 0x010E,\n\t0x0064030C: 0x010F,\n\t0x00450304: 0x0112,\n\t0x00650304: 0x0113,\n\t0x00450306: 0x0114,\n\t0x00650306: 0x0115,\n\t0x00450307: 0x0116,\n\t0x00650307: 0x0117,\n\t0x00450328: 0x0118,\n\t0x00650328: 0x0119,\n\t0x0045030C: 0x011A,\n\t0x0065030C: 0x011B,\n\t0x00470302: 0x011C,\n\t0x00670302: 0x011D,\n\t0x00470306: 0x011E,\n\t0x00670306: 0x011F,\n\t0x00470307: 0x0120,\n\t0x00670307: 0x0121,\n\t0x00470327: 0x0122,\n\t0x00670327: 0x0123,\n\t0x00480302: 0x0124,\n\t0x00680302: 0x0125,\n\t0x00490303: 0x0128,\n\t0x00690303: 0x0129,\n\t0x00490304: 0x012A,\n\t0x00690304: 0x012B,\n\t0x00490306: 0x012C,\n\t0x00690306: 0x012D,\n\t0x00490328: 0x012E,\n\t0x00690328: 0x012F,\n\t0x00490307: 0x0130,\n\t0x004A0302: 0x0134,\n\t0x006A0302: 0x0135,\n\t0x004B0327: 0x0136,\n\t0x006B0327: 0x0137,\n\t0x004C0301: 0x0139,\n\t0x006C0301: 0x013A,\n\t0x004C0327: 0x013B,\n\t0x006C0327: 0x013C,\n\t0x004C030C: 0x013D,\n\t0x006C030C: 0x013E,\n\t0x004E0301: 0x0143,\n\t0x006E0301: 0x0144,\n\t0x004E0327: 0x0145,\n\t0x006E0327: 0x0146,\n\t0x004E030C: 0x0147,\n\t0x006E030C: 0x0148,\n\t0x004F0304: 0x014C,\n\t0x006F0304: 0x014D,\n\t0x004F0306: 0x014E,\n\t0x006F0306: 0x014F,\n\t0x004F030B: 0x0150,\n\t0x006F030B: 0x0151,\n\t0x00520301: 0x0154,\n\t0x00720301: 0x0155,\n\t0x00520327: 0x0156,\n\t0x00720327: 0x0157,\n\t0x0052030C: 0x0158,\n\t0x0072030C: 0x0159,\n\t0x00530301: 0x015A,\n\t0x00730301: 0x015B,\n\t0x00530302: 0x015C,\n\t0x00730302: 0x015D,\n\t0x00530327: 0x015E,\n\t0x00730327: 0x015F,\n\t0x0053030C: 0x0160,\n\t0x0073030C: 0x0161,\n\t0x00540327: 0x0162,\n\t0x00740327: 0x0163,\n\t0x0054030C: 0x0164,\n\t0x0074030C: 0x0165,\n\t0x00550303: 0x0168,\n\t0x00750303: 0x0169,\n\t0x00550304: 0x016A,\n\t0x00750304: 0x016B,\n\t0x00550306: 0x016C,\n\t0x00750306: 0x016D,\n\t0x0055030A: 0x016E,\n\t0x0075030A: 0x016F,\n\t0x0055030B: 0x0170,\n\t0x0075030B: 0x0171,\n\t0x00550328: 0x0172,\n\t0x00750328: 0x0173,\n\t0x00570302: 0x0174,\n\t0x00770302: 0x0175,\n\t0x00590302: 0x0176,\n\t0x00790302: 0x0177,\n\t0x00590308: 0x0178,\n\t0x005A0301: 0x0179,\n\t0x007A0301: 0x017A,\n\t0x005A0307: 0x017B,\n\t0x007A0307: 0x017C,\n\t0x005A030C: 0x017D,\n\t0x007A030C: 0x017E,\n\t0x004F031B: 0x01A0,\n\t0x006F031B: 0x01A1,\n\t0x0055031B: 0x01AF,\n\t0x0075031B: 0x01B0,\n\t0x0041030C: 0x01CD,\n\t0x0061030C: 0x01CE,\n\t0x0049030C: 0x01CF,\n\t0x0069030C: 0x01D0,\n\t0x004F030C: 0x01D1,\n\t0x006F030C: 0x01D2,\n\t0x0055030C: 0x01D3,\n\t0x0075030C: 0x01D4,\n\t0x00DC0304: 0x01D5,\n\t0x00FC0304: 0x01D6,\n\t0x00DC0301: 0x01D7,\n\t0x00FC0301: 0x01D8,\n\t0x00DC030C: 0x01D9,\n\t0x00FC030C: 0x01DA,\n\t0x00DC0300: 0x01DB,\n\t0x00FC0300: 0x01DC,\n\t0x00C40304: 0x01DE,\n\t0x00E40304: 0x01DF,\n\t0x02260304: 0x01E0,\n\t0x02270304: 0x01E1,\n\t0x00C60304: 0x01E2,\n\t0x00E60304: 0x01E3,\n\t0x0047030C: 0x01E6,\n\t0x0067030C: 0x01E7,\n\t0x004B030C: 0x01E8,\n\t0x006B030C: 0x01E9,\n\t0x004F0328: 0x01EA,\n\t0x006F0328: 0x01EB,\n\t0x01EA0304: 0x01EC,\n\t0x01EB0304: 0x01ED,\n\t0x01B7030C: 0x01EE,\n\t0x0292030C: 0x01EF,\n\t0x006A030C: 0x01F0,\n\t0x00470301: 0x01F4,\n\t0x00670301: 0x01F5,\n\t0x004E0300: 0x01F8,\n\t0x006E0300: 0x01F9,\n\t0x00C50301: 0x01FA,\n\t0x00E50301: 0x01FB,\n\t0x00C60301: 0x01FC,\n\t0x00E60301: 0x01FD,\n\t0x00D80301: 0x01FE,\n\t0x00F80301: 0x01FF,\n\t0x0041030F: 0x0200,\n\t0x0061030F: 0x0201,\n\t0x00410311: 0x0202,\n\t0x00610311: 0x0203,\n\t0x0045030F: 0x0204,\n\t0x0065030F: 0x0205,\n\t0x00450311: 0x0206,\n\t0x00650311: 0x0207,\n\t0x0049030F: 0x0208,\n\t0x0069030F: 0x0209,\n\t0x00490311: 0x020A,\n\t0x00690311: 0x020B,\n\t0x004F030F: 0x020C,\n\t0x006F030F: 0x020D,\n\t0x004F0311: 0x020E,\n\t0x006F0311: 0x020F,\n\t0x0052030F: 0x0210,\n\t0x0072030F: 0x0211,\n\t0x00520311: 0x0212,\n\t0x00720311: 0x0213,\n\t0x0055030F: 0x0214,\n\t0x0075030F: 0x0215,\n\t0x00550311: 0x0216,\n\t0x00750311: 0x0217,\n\t0x00530326: 0x0218,\n\t0x00730326: 0x0219,\n\t0x00540326: 0x021A,\n\t0x00740326: 0x021B,\n\t0x0048030C: 0x021E,\n\t0x0068030C: 0x021F,\n\t0x00410307: 0x0226,\n\t0x00610307: 0x0227,\n\t0x00450327: 0x0228,\n\t0x00650327: 0x0229,\n\t0x00D60304: 0x022A,\n\t0x00F60304: 0x022B,\n\t0x00D50304: 0x022C,\n\t0x00F50304: 0x022D,\n\t0x004F0307: 0x022E,\n\t0x006F0307: 0x022F,\n\t0x022E0304: 0x0230,\n\t0x022F0304: 0x0231,\n\t0x00590304: 0x0232,\n\t0x00790304: 0x0233,\n\t0x00A80301: 0x0385,\n\t0x03910301: 0x0386,\n\t0x03950301: 0x0388,\n\t0x03970301: 0x0389,\n\t0x03990301: 0x038A,\n\t0x039F0301: 0x038C,\n\t0x03A50301: 0x038E,\n\t0x03A90301: 0x038F,\n\t0x03CA0301: 0x0390,\n\t0x03990308: 0x03AA,\n\t0x03A50308: 0x03AB,\n\t0x03B10301: 0x03AC,\n\t0x03B50301: 0x03AD,\n\t0x03B70301: 0x03AE,\n\t0x03B90301: 0x03AF,\n\t0x03CB0301: 0x03B0,\n\t0x03B90308: 0x03CA,\n\t0x03C50308: 0x03CB,\n\t0x03BF0301: 0x03CC,\n\t0x03C50301: 0x03CD,\n\t0x03C90301: 0x03CE,\n\t0x03D20301: 0x03D3,\n\t0x03D20308: 0x03D4,\n\t0x04150300: 0x0400,\n\t0x04150308: 0x0401,\n\t0x04130301: 0x0403,\n\t0x04060308: 0x0407,\n\t0x041A0301: 0x040C,\n\t0x04180300: 0x040D,\n\t0x04230306: 0x040E,\n\t0x04180306: 0x0419,\n\t0x04380306: 0x0439,\n\t0x04350300: 0x0450,\n\t0x04350308: 0x0451,\n\t0x04330301: 0x0453,\n\t0x04560308: 0x0457,\n\t0x043A0301: 0x045C,\n\t0x04380300: 0x045D,\n\t0x04430306: 0x045E,\n\t0x0474030F: 0x0476,\n\t0x0475030F: 0x0477,\n\t0x04160306: 0x04C1,\n\t0x04360306: 0x04C2,\n\t0x04100306: 0x04D0,\n\t0x04300306: 0x04D1,\n\t0x04100308: 0x04D2,\n\t0x04300308: 0x04D3,\n\t0x04150306: 0x04D6,\n\t0x04350306: 0x04D7,\n\t0x04D80308: 0x04DA,\n\t0x04D90308: 0x04DB,\n\t0x04160308: 0x04DC,\n\t0x04360308: 0x04DD,\n\t0x04170308: 0x04DE,\n\t0x04370308: 0x04DF,\n\t0x04180304: 0x04E2,\n\t0x04380304: 0x04E3,\n\t0x04180308: 0x04E4,\n\t0x04380308: 0x04E5,\n\t0x041E0308: 0x04E6,\n\t0x043E0308: 0x04E7,\n\t0x04E80308: 0x04EA,\n\t0x04E90308: 0x04EB,\n\t0x042D0308: 0x04EC,\n\t0x044D0308: 0x04ED,\n\t0x04230304: 0x04EE,\n\t0x04430304: 0x04EF,\n\t0x04230308: 0x04F0,\n\t0x04430308: 0x04F1,\n\t0x0423030B: 0x04F2,\n\t0x0443030B: 0x04F3,\n\t0x04270308: 0x04F4,\n\t0x04470308: 0x04F5,\n\t0x042B0308: 0x04F8,\n\t0x044B0308: 0x04F9,\n\t0x06270653: 0x0622,\n\t0x06270654: 0x0623,\n\t0x06480654: 0x0624,\n\t0x06270655: 0x0625,\n\t0x064A0654: 0x0626,\n\t0x06D50654: 0x06C0,\n\t0x06C10654: 0x06C2,\n\t0x06D20654: 0x06D3,\n\t0x0928093C: 0x0929,\n\t0x0930093C: 0x0931,\n\t0x0933093C: 0x0934,\n\t0x09C709BE: 0x09CB,\n\t0x09C709D7: 0x09CC,\n\t0x0B470B56: 0x0B48,\n\t0x0B470B3E: 0x0B4B,\n\t0x0B470B57: 0x0B4C,\n\t0x0B920BD7: 0x0B94,\n\t0x0BC60BBE: 0x0BCA,\n\t0x0BC70BBE: 0x0BCB,\n\t0x0BC60BD7: 0x0BCC,\n\t0x0C460C56: 0x0C48,\n\t0x0CBF0CD5: 0x0CC0,\n\t0x0CC60CD5: 0x0CC7,\n\t0x0CC60CD6: 0x0CC8,\n\t0x0CC60CC2: 0x0CCA,\n\t0x0CCA0CD5: 0x0CCB,\n\t0x0D460D3E: 0x0D4A,\n\t0x0D470D3E: 0x0D4B,\n\t0x0D460D57: 0x0D4C,\n\t0x0DD90DCA: 0x0DDA,\n\t0x0DD90DCF: 0x0DDC,\n\t0x0DDC0DCA: 0x0DDD,\n\t0x0DD90DDF: 0x0DDE,\n\t0x1025102E: 0x1026,\n\t0x1B051B35: 0x1B06,\n\t0x1B071B35: 0x1B08,\n\t0x1B091B35: 0x1B0A,\n\t0x1B0B1B35: 0x1B0C,\n\t0x1B0D1B35: 0x1B0E,\n\t0x1B111B35: 0x1B12,\n\t0x1B3A1B35: 0x1B3B,\n\t0x1B3C1B35: 0x1B3D,\n\t0x1B3E1B35: 0x1B40,\n\t0x1B3F1B35: 0x1B41,\n\t0x1B421B35: 0x1B43,\n\t0x00410325: 0x1E00,\n\t0x00610325: 0x1E01,\n\t0x00420307: 0x1E02,\n\t0x00620307: 0x1E03,\n\t0x00420323: 0x1E04,\n\t0x00620323: 0x1E05,\n\t0x00420331: 0x1E06,\n\t0x00620331: 0x1E07,\n\t0x00C70301: 0x1E08,\n\t0x00E70301: 0x1E09,\n\t0x00440307: 0x1E0A,\n\t0x00640307: 0x1E0B,\n\t0x00440323: 0x1E0C,\n\t0x00640323: 0x1E0D,\n\t0x00440331: 0x1E0E,\n\t0x00640331: 0x1E0F,\n\t0x00440327: 0x1E10,\n\t0x00640327: 0x1E11,\n\t0x0044032D: 0x1E12,\n\t0x0064032D: 0x1E13,\n\t0x01120300: 0x1E14,\n\t0x01130300: 0x1E15,\n\t0x01120301: 0x1E16,\n\t0x01130301: 0x1E17,\n\t0x0045032D: 0x1E18,\n\t0x0065032D: 0x1E19,\n\t0x00450330: 0x1E1A,\n\t0x00650330: 0x1E1B,\n\t0x02280306: 0x1E1C,\n\t0x02290306: 0x1E1D,\n\t0x00460307: 0x1E1E,\n\t0x00660307: 0x1E1F,\n\t0x00470304: 0x1E20,\n\t0x00670304: 0x1E21,\n\t0x00480307: 0x1E22,\n\t0x00680307: 0x1E23,\n\t0x00480323: 0x1E24,\n\t0x00680323: 0x1E25,\n\t0x00480308: 0x1E26,\n\t0x00680308: 0x1E27,\n\t0x00480327: 0x1E28,\n\t0x00680327: 0x1E29,\n\t0x0048032E: 0x1E2A,\n\t0x0068032E: 0x1E2B,\n\t0x00490330: 0x1E2C,\n\t0x00690330: 0x1E2D,\n\t0x00CF0301: 0x1E2E,\n\t0x00EF0301: 0x1E2F,\n\t0x004B0301: 0x1E30,\n\t0x006B0301: 0x1E31,\n\t0x004B0323: 0x1E32,\n\t0x006B0323: 0x1E33,\n\t0x004B0331: 0x1E34,\n\t0x006B0331: 0x1E35,\n\t0x004C0323: 0x1E36,\n\t0x006C0323: 0x1E37,\n\t0x1E360304: 0x1E38,\n\t0x1E370304: 0x1E39,\n\t0x004C0331: 0x1E3A,\n\t0x006C0331: 0x1E3B,\n\t0x004C032D: 0x1E3C,\n\t0x006C032D: 0x1E3D,\n\t0x004D0301: 0x1E3E,\n\t0x006D0301: 0x1E3F,\n\t0x004D0307: 0x1E40,\n\t0x006D0307: 0x1E41,\n\t0x004D0323: 0x1E42,\n\t0x006D0323: 0x1E43,\n\t0x004E0307: 0x1E44,\n\t0x006E0307: 0x1E45,\n\t0x004E0323: 0x1E46,\n\t0x006E0323: 0x1E47,\n\t0x004E0331: 0x1E48,\n\t0x006E0331: 0x1E49,\n\t0x004E032D: 0x1E4A,\n\t0x006E032D: 0x1E4B,\n\t0x00D50301: 0x1E4C,\n\t0x00F50301: 0x1E4D,\n\t0x00D50308: 0x1E4E,\n\t0x00F50308: 0x1E4F,\n\t0x014C0300: 0x1E50,\n\t0x014D0300: 0x1E51,\n\t0x014C0301: 0x1E52,\n\t0x014D0301: 0x1E53,\n\t0x00500301: 0x1E54,\n\t0x00700301: 0x1E55,\n\t0x00500307: 0x1E56,\n\t0x00700307: 0x1E57,\n\t0x00520307: 0x1E58,\n\t0x00720307: 0x1E59,\n\t0x00520323: 0x1E5A,\n\t0x00720323: 0x1E5B,\n\t0x1E5A0304: 0x1E5C,\n\t0x1E5B0304: 0x1E5D,\n\t0x00520331: 0x1E5E,\n\t0x00720331: 0x1E5F,\n\t0x00530307: 0x1E60,\n\t0x00730307: 0x1E61,\n\t0x00530323: 0x1E62,\n\t0x00730323: 0x1E63,\n\t0x015A0307: 0x1E64,\n\t0x015B0307: 0x1E65,\n\t0x01600307: 0x1E66,\n\t0x01610307: 0x1E67,\n\t0x1E620307: 0x1E68,\n\t0x1E630307: 0x1E69,\n\t0x00540307: 0x1E6A,\n\t0x00740307: 0x1E6B,\n\t0x00540323: 0x1E6C,\n\t0x00740323: 0x1E6D,\n\t0x00540331: 0x1E6E,\n\t0x00740331: 0x1E6F,\n\t0x0054032D: 0x1E70,\n\t0x0074032D: 0x1E71,\n\t0x00550324: 0x1E72,\n\t0x00750324: 0x1E73,\n\t0x00550330: 0x1E74,\n\t0x00750330: 0x1E75,\n\t0x0055032D: 0x1E76,\n\t0x0075032D: 0x1E77,\n\t0x01680301: 0x1E78,\n\t0x01690301: 0x1E79,\n\t0x016A0308: 0x1E7A,\n\t0x016B0308: 0x1E7B,\n\t0x00560303: 0x1E7C,\n\t0x00760303: 0x1E7D,\n\t0x00560323: 0x1E7E,\n\t0x00760323: 0x1E7F,\n\t0x00570300: 0x1E80,\n\t0x00770300: 0x1E81,\n\t0x00570301: 0x1E82,\n\t0x00770301: 0x1E83,\n\t0x00570308: 0x1E84,\n\t0x00770308: 0x1E85,\n\t0x00570307: 0x1E86,\n\t0x00770307: 0x1E87,\n\t0x00570323: 0x1E88,\n\t0x00770323: 0x1E89,\n\t0x00580307: 0x1E8A,\n\t0x00780307: 0x1E8B,\n\t0x00580308: 0x1E8C,\n\t0x00780308: 0x1E8D,\n\t0x00590307: 0x1E8E,\n\t0x00790307: 0x1E8F,\n\t0x005A0302: 0x1E90,\n\t0x007A0302: 0x1E91,\n\t0x005A0323: 0x1E92,\n\t0x007A0323: 0x1E93,\n\t0x005A0331: 0x1E94,\n\t0x007A0331: 0x1E95,\n\t0x00680331: 0x1E96,\n\t0x00740308: 0x1E97,\n\t0x0077030A: 0x1E98,\n\t0x0079030A: 0x1E99,\n\t0x017F0307: 0x1E9B,\n\t0x00410323: 0x1EA0,\n\t0x00610323: 0x1EA1,\n\t0x00410309: 0x1EA2,\n\t0x00610309: 0x1EA3,\n\t0x00C20301: 0x1EA4,\n\t0x00E20301: 0x1EA5,\n\t0x00C20300: 0x1EA6,\n\t0x00E20300: 0x1EA7,\n\t0x00C20309: 0x1EA8,\n\t0x00E20309: 0x1EA9,\n\t0x00C20303: 0x1EAA,\n\t0x00E20303: 0x1EAB,\n\t0x1EA00302: 0x1EAC,\n\t0x1EA10302: 0x1EAD,\n\t0x01020301: 0x1EAE,\n\t0x01030301: 0x1EAF,\n\t0x01020300: 0x1EB0,\n\t0x01030300: 0x1EB1,\n\t0x01020309: 0x1EB2,\n\t0x01030309: 0x1EB3,\n\t0x01020303: 0x1EB4,\n\t0x01030303: 0x1EB5,\n\t0x1EA00306: 0x1EB6,\n\t0x1EA10306: 0x1EB7,\n\t0x00450323: 0x1EB8,\n\t0x00650323: 0x1EB9,\n\t0x00450309: 0x1EBA,\n\t0x00650309: 0x1EBB,\n\t0x00450303: 0x1EBC,\n\t0x00650303: 0x1EBD,\n\t0x00CA0301: 0x1EBE,\n\t0x00EA0301: 0x1EBF,\n\t0x00CA0300: 0x1EC0,\n\t0x00EA0300: 0x1EC1,\n\t0x00CA0309: 0x1EC2,\n\t0x00EA0309: 0x1EC3,\n\t0x00CA0303: 0x1EC4,\n\t0x00EA0303: 0x1EC5,\n\t0x1EB80302: 0x1EC6,\n\t0x1EB90302: 0x1EC7,\n\t0x00490309: 0x1EC8,\n\t0x00690309: 0x1EC9,\n\t0x00490323: 0x1ECA,\n\t0x00690323: 0x1ECB,\n\t0x004F0323: 0x1ECC,\n\t0x006F0323: 0x1ECD,\n\t0x004F0309: 0x1ECE,\n\t0x006F0309: 0x1ECF,\n\t0x00D40301: 0x1ED0,\n\t0x00F40301: 0x1ED1,\n\t0x00D40300: 0x1ED2,\n\t0x00F40300: 0x1ED3,\n\t0x00D40309: 0x1ED4,\n\t0x00F40309: 0x1ED5,\n\t0x00D40303: 0x1ED6,\n\t0x00F40303: 0x1ED7,\n\t0x1ECC0302: 0x1ED8,\n\t0x1ECD0302: 0x1ED9,\n\t0x01A00301: 0x1EDA,\n\t0x01A10301: 0x1EDB,\n\t0x01A00300: 0x1EDC,\n\t0x01A10300: 0x1EDD,\n\t0x01A00309: 0x1EDE,\n\t0x01A10309: 0x1EDF,\n\t0x01A00303: 0x1EE0,\n\t0x01A10303: 0x1EE1,\n\t0x01A00323: 0x1EE2,\n\t0x01A10323: 0x1EE3,\n\t0x00550323: 0x1EE4,\n\t0x00750323: 0x1EE5,\n\t0x00550309: 0x1EE6,\n\t0x00750309: 0x1EE7,\n\t0x01AF0301: 0x1EE8,\n\t0x01B00301: 0x1EE9,\n\t0x01AF0300: 0x1EEA,\n\t0x01B00300: 0x1EEB,\n\t0x01AF0309: 0x1EEC,\n\t0x01B00309: 0x1EED,\n\t0x01AF0303: 0x1EEE,\n\t0x01B00303: 0x1EEF,\n\t0x01AF0323: 0x1EF0,\n\t0x01B00323: 0x1EF1,\n\t0x00590300: 0x1EF2,\n\t0x00790300: 0x1EF3,\n\t0x00590323: 0x1EF4,\n\t0x00790323: 0x1EF5,\n\t0x00590309: 0x1EF6,\n\t0x00790309: 0x1EF7,\n\t0x00590303: 0x1EF8,\n\t0x00790303: 0x1EF9,\n\t0x03B10313: 0x1F00,\n\t0x03B10314: 0x1F01,\n\t0x1F000300: 0x1F02,\n\t0x1F010300: 0x1F03,\n\t0x1F000301: 0x1F04,\n\t0x1F010301: 0x1F05,\n\t0x1F000342: 0x1F06,\n\t0x1F010342: 0x1F07,\n\t0x03910313: 0x1F08,\n\t0x03910314: 0x1F09,\n\t0x1F080300: 0x1F0A,\n\t0x1F090300: 0x1F0B,\n\t0x1F080301: 0x1F0C,\n\t0x1F090301: 0x1F0D,\n\t0x1F080342: 0x1F0E,\n\t0x1F090342: 0x1F0F,\n\t0x03B50313: 0x1F10,\n\t0x03B50314: 0x1F11,\n\t0x1F100300: 0x1F12,\n\t0x1F110300: 0x1F13,\n\t0x1F100301: 0x1F14,\n\t0x1F110301: 0x1F15,\n\t0x03950313: 0x1F18,\n\t0x03950314: 0x1F19,\n\t0x1F180300: 0x1F1A,\n\t0x1F190300: 0x1F1B,\n\t0x1F180301: 0x1F1C,\n\t0x1F190301: 0x1F1D,\n\t0x03B70313: 0x1F20,\n\t0x03B70314: 0x1F21,\n\t0x1F200300: 0x1F22,\n\t0x1F210300: 0x1F23,\n\t0x1F200301: 0x1F24,\n\t0x1F210301: 0x1F25,\n\t0x1F200342: 0x1F26,\n\t0x1F210342: 0x1F27,\n\t0x03970313: 0x1F28,\n\t0x03970314: 0x1F29,\n\t0x1F280300: 0x1F2A,\n\t0x1F290300: 0x1F2B,\n\t0x1F280301: 0x1F2C,\n\t0x1F290301: 0x1F2D,\n\t0x1F280342: 0x1F2E,\n\t0x1F290342: 0x1F2F,\n\t0x03B90313: 0x1F30,\n\t0x03B90314: 0x1F31,\n\t0x1F300300: 0x1F32,\n\t0x1F310300: 0x1F33,\n\t0x1F300301: 0x1F34,\n\t0x1F310301: 0x1F35,\n\t0x1F300342: 0x1F36,\n\t0x1F310342: 0x1F37,\n\t0x03990313: 0x1F38,\n\t0x03990314: 0x1F39,\n\t0x1F380300: 0x1F3A,\n\t0x1F390300: 0x1F3B,\n\t0x1F380301: 0x1F3C,\n\t0x1F390301: 0x1F3D,\n\t0x1F380342: 0x1F3E,\n\t0x1F390342: 0x1F3F,\n\t0x03BF0313: 0x1F40,\n\t0x03BF0314: 0x1F41,\n\t0x1F400300: 0x1F42,\n\t0x1F410300: 0x1F43,\n\t0x1F400301: 0x1F44,\n\t0x1F410301: 0x1F45,\n\t0x039F0313: 0x1F48,\n\t0x039F0314: 0x1F49,\n\t0x1F480300: 0x1F4A,\n\t0x1F490300: 0x1F4B,\n\t0x1F480301: 0x1F4C,\n\t0x1F490301: 0x1F4D,\n\t0x03C50313: 0x1F50,\n\t0x03C50314: 0x1F51,\n\t0x1F500300: 0x1F52,\n\t0x1F510300: 0x1F53,\n\t0x1F500301: 0x1F54,\n\t0x1F510301: 0x1F55,\n\t0x1F500342: 0x1F56,\n\t0x1F510342: 0x1F57,\n\t0x03A50314: 0x1F59,\n\t0x1F590300: 0x1F5B,\n\t0x1F590301: 0x1F5D,\n\t0x1F590342: 0x1F5F,\n\t0x03C90313: 0x1F60,\n\t0x03C90314: 0x1F61,\n\t0x1F600300: 0x1F62,\n\t0x1F610300: 0x1F63,\n\t0x1F600301: 0x1F64,\n\t0x1F610301: 0x1F65,\n\t0x1F600342: 0x1F66,\n\t0x1F610342: 0x1F67,\n\t0x03A90313: 0x1F68,\n\t0x03A90314: 0x1F69,\n\t0x1F680300: 0x1F6A,\n\t0x1F690300: 0x1F6B,\n\t0x1F680301: 0x1F6C,\n\t0x1F690301: 0x1F6D,\n\t0x1F680342: 0x1F6E,\n\t0x1F690342: 0x1F6F,\n\t0x03B10300: 0x1F70,\n\t0x03B50300: 0x1F72,\n\t0x03B70300: 0x1F74,\n\t0x03B90300: 0x1F76,\n\t0x03BF0300: 0x1F78,\n\t0x03C50300: 0x1F7A,\n\t0x03C90300: 0x1F7C,\n\t0x1F000345: 0x1F80,\n\t0x1F010345: 0x1F81,\n\t0x1F020345: 0x1F82,\n\t0x1F030345: 0x1F83,\n\t0x1F040345: 0x1F84,\n\t0x1F050345: 0x1F85,\n\t0x1F060345: 0x1F86,\n\t0x1F070345: 0x1F87,\n\t0x1F080345: 0x1F88,\n\t0x1F090345: 0x1F89,\n\t0x1F0A0345: 0x1F8A,\n\t0x1F0B0345: 0x1F8B,\n\t0x1F0C0345: 0x1F8C,\n\t0x1F0D0345: 0x1F8D,\n\t0x1F0E0345: 0x1F8E,\n\t0x1F0F0345: 0x1F8F,\n\t0x1F200345: 0x1F90,\n\t0x1F210345: 0x1F91,\n\t0x1F220345: 0x1F92,\n\t0x1F230345: 0x1F93,\n\t0x1F240345: 0x1F94,\n\t0x1F250345: 0x1F95,\n\t0x1F260345: 0x1F96,\n\t0x1F270345: 0x1F97,\n\t0x1F280345: 0x1F98,\n\t0x1F290345: 0x1F99,\n\t0x1F2A0345: 0x1F9A,\n\t0x1F2B0345: 0x1F9B,\n\t0x1F2C0345: 0x1F9C,\n\t0x1F2D0345: 0x1F9D,\n\t0x1F2E0345: 0x1F9E,\n\t0x1F2F0345: 0x1F9F,\n\t0x1F600345: 0x1FA0,\n\t0x1F610345: 0x1FA1,\n\t0x1F620345: 0x1FA2,\n\t0x1F630345: 0x1FA3,\n\t0x1F640345: 0x1FA4,\n\t0x1F650345: 0x1FA5,\n\t0x1F660345: 0x1FA6,\n\t0x1F670345: 0x1FA7,\n\t0x1F680345: 0x1FA8,\n\t0x1F690345: 0x1FA9,\n\t0x1F6A0345: 0x1FAA,\n\t0x1F6B0345: 0x1FAB,\n\t0x1F6C0345: 0x1FAC,\n\t0x1F6D0345: 0x1FAD,\n\t0x1F6E0345: 0x1FAE,\n\t0x1F6F0345: 0x1FAF,\n\t0x03B10306: 0x1FB0,\n\t0x03B10304: 0x1FB1,\n\t0x1F700345: 0x1FB2,\n\t0x03B10345: 0x1FB3,\n\t0x03AC0345: 0x1FB4,\n\t0x03B10342: 0x1FB6,\n\t0x1FB60345: 0x1FB7,\n\t0x03910306: 0x1FB8,\n\t0x03910304: 0x1FB9,\n\t0x03910300: 0x1FBA,\n\t0x03910345: 0x1FBC,\n\t0x00A80342: 0x1FC1,\n\t0x1F740345: 0x1FC2,\n\t0x03B70345: 0x1FC3,\n\t0x03AE0345: 0x1FC4,\n\t0x03B70342: 0x1FC6,\n\t0x1FC60345: 0x1FC7,\n\t0x03950300: 0x1FC8,\n\t0x03970300: 0x1FCA,\n\t0x03970345: 0x1FCC,\n\t0x1FBF0300: 0x1FCD,\n\t0x1FBF0301: 0x1FCE,\n\t0x1FBF0342: 0x1FCF,\n\t0x03B90306: 0x1FD0,\n\t0x03B90304: 0x1FD1,\n\t0x03CA0300: 0x1FD2,\n\t0x03B90342: 0x1FD6,\n\t0x03CA0342: 0x1FD7,\n\t0x03990306: 0x1FD8,\n\t0x03990304: 0x1FD9,\n\t0x03990300: 0x1FDA,\n\t0x1FFE0300: 0x1FDD,\n\t0x1FFE0301: 0x1FDE,\n\t0x1FFE0342: 0x1FDF,\n\t0x03C50306: 0x1FE0,\n\t0x03C50304: 0x1FE1,\n\t0x03CB0300: 0x1FE2,\n\t0x03C10313: 0x1FE4,\n\t0x03C10314: 0x1FE5,\n\t0x03C50342: 0x1FE6,\n\t0x03CB0342: 0x1FE7,\n\t0x03A50306: 0x1FE8,\n\t0x03A50304: 0x1FE9,\n\t0x03A50300: 0x1FEA,\n\t0x03A10314: 0x1FEC,\n\t0x00A80300: 0x1FED,\n\t0x1F7C0345: 0x1FF2,\n\t0x03C90345: 0x1FF3,\n\t0x03CE0345: 0x1FF4,\n\t0x03C90342: 0x1FF6,\n\t0x1FF60345: 0x1FF7,\n\t0x039F0300: 0x1FF8,\n\t0x03A90300: 0x1FFA,\n\t0x03A90345: 0x1FFC,\n\t0x21900338: 0x219A,\n\t0x21920338: 0x219B,\n\t0x21940338: 0x21AE,\n\t0x21D00338: 0x21CD,\n\t0x21D40338: 0x21CE,\n\t0x21D20338: 0x21CF,\n\t0x22030338: 0x2204,\n\t0x22080338: 0x2209,\n\t0x220B0338: 0x220C,\n\t0x22230338: 0x2224,\n\t0x22250338: 0x2226,\n\t0x223C0338: 0x2241,\n\t0x22430338: 0x2244,\n\t0x22450338: 0x2247,\n\t0x22480338: 0x2249,\n\t0x003D0338: 0x2260,\n\t0x22610338: 0x2262,\n\t0x224D0338: 0x226D,\n\t0x003C0338: 0x226E,\n\t0x003E0338: 0x226F,\n\t0x22640338: 0x2270,\n\t0x22650338: 0x2271,\n\t0x22720338: 0x2274,\n\t0x22730338: 0x2275,\n\t0x22760338: 0x2278,\n\t0x22770338: 0x2279,\n\t0x227A0338: 0x2280,\n\t0x227B0338: 0x2281,\n\t0x22820338: 0x2284,\n\t0x22830338: 0x2285,\n\t0x22860338: 0x2288,\n\t0x22870338: 0x2289,\n\t0x22A20338: 0x22AC,\n\t0x22A80338: 0x22AD,\n\t0x22A90338: 0x22AE,\n\t0x22AB0338: 0x22AF,\n\t0x227C0338: 0x22E0,\n\t0x227D0338: 0x22E1,\n\t0x22910338: 0x22E2,\n\t0x22920338: 0x22E3,\n\t0x22B20338: 0x22EA,\n\t0x22B30338: 0x22EB,\n\t0x22B40338: 0x22EC,\n\t0x22B50338: 0x22ED,\n\t0x304B3099: 0x304C,\n\t0x304D3099: 0x304E,\n\t0x304F3099: 0x3050,\n\t0x30513099: 0x3052,\n\t0x30533099: 0x3054,\n\t0x30553099: 0x3056,\n\t0x30573099: 0x3058,\n\t0x30593099: 0x305A,\n\t0x305B3099: 0x305C,\n\t0x305D3099: 0x305E,\n\t0x305F3099: 0x3060,\n\t0x30613099: 0x3062,\n\t0x30643099: 0x3065,\n\t0x30663099: 0x3067,\n\t0x30683099: 0x3069,\n\t0x306F3099: 0x3070,\n\t0x306F309A: 0x3071,\n\t0x30723099: 0x3073,\n\t0x3072309A: 0x3074,\n\t0x30753099: 0x3076,\n\t0x3075309A: 0x3077,\n\t0x30783099: 0x3079,\n\t0x3078309A: 0x307A,\n\t0x307B3099: 0x307C,\n\t0x307B309A: 0x307D,\n\t0x30463099: 0x3094,\n\t0x309D3099: 0x309E,\n\t0x30AB3099: 0x30AC,\n\t0x30AD3099: 0x30AE,\n\t0x30AF3099: 0x30B0,\n\t0x30B13099: 0x30B2,\n\t0x30B33099: 0x30B4,\n\t0x30B53099: 0x30B6,\n\t0x30B73099: 0x30B8,\n\t0x30B93099: 0x30BA,\n\t0x30BB3099: 0x30BC,\n\t0x30BD3099: 0x30BE,\n\t0x30BF3099: 0x30C0,\n\t0x30C13099: 0x30C2,\n\t0x30C43099: 0x30C5,\n\t0x30C63099: 0x30C7,\n\t0x30C83099: 0x30C9,\n\t0x30CF3099: 0x30D0,\n\t0x30CF309A: 0x30D1,\n\t0x30D23099: 0x30D3,\n\t0x30D2309A: 0x30D4,\n\t0x30D53099: 0x30D6,\n\t0x30D5309A: 0x30D7,\n\t0x30D83099: 0x30D9,\n\t0x30D8309A: 0x30DA,\n\t0x30DB3099: 0x30DC,\n\t0x30DB309A: 0x30DD,\n\t0x30A63099: 0x30F4,\n\t0x30EF3099: 0x30F7,\n\t0x30F03099: 0x30F8,\n\t0x30F13099: 0x30F9,\n\t0x30F23099: 0x30FA,\n\t0x30FD3099: 0x30FE,\n\t0x109910BA: 0x1109A,\n\t0x109B10BA: 0x1109C,\n\t0x10A510BA: 0x110AB,\n\t0x11311127: 0x1112E,\n\t0x11321127: 0x1112F,\n\t0x1347133E: 0x1134B,\n\t0x13471357: 0x1134C,\n\t0x14B914BA: 0x114BB,\n\t0x14B914B0: 0x114BC,\n\t0x14B914BD: 0x114BE,\n\t0x15B815AF: 0x115BA,\n\t0x15B915AF: 0x115BB,\n}\n\n// Total size of tables: 53KB (54226 bytes)\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/tables9.0.0.go",
    "content": "// Code generated by running \"go generate\" in golang.org/x/text. DO NOT EDIT.\n\n// +build !go1.10\n\npackage norm\n\nconst (\n\t// Version is the Unicode edition from which the tables are derived.\n\tVersion = \"9.0.0\"\n\n\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform\n\t// may need to write atomically for any Form. Making a destination buffer at\n\t// least this size ensures that Transform can always make progress and that\n\t// the user does not need to grow the buffer on an ErrShortDst.\n\tMaxTransformChunkSize = 35 + maxNonStarters*4\n)\n\nvar ccc = [55]uint8{\n\t0, 1, 7, 8, 9, 10, 11, 12,\n\t13, 14, 15, 16, 17, 18, 19, 20,\n\t21, 22, 23, 24, 25, 26, 27, 28,\n\t29, 30, 31, 32, 33, 34, 35, 36,\n\t84, 91, 103, 107, 118, 122, 129, 130,\n\t132, 202, 214, 216, 218, 220, 222, 224,\n\t226, 228, 230, 232, 233, 234, 240,\n}\n\nconst (\n\tfirstMulti            = 0x186D\n\tfirstCCC              = 0x2C9E\n\tendMulti              = 0x2F60\n\tfirstLeadingCCC       = 0x49AE\n\tfirstCCCZeroExcept    = 0x4A78\n\tfirstStarterWithNLead = 0x4A9F\n\tlastDecomp            = 0x4AA1\n\tmaxDecomp             = 0x8000\n)\n\n// decomps: 19105 bytes\nvar decomps = [...]byte{\n\t// Bytes 0 - 3f\n\t0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41,\n\t0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41,\n\t0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41,\n\t0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41,\n\t0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41,\n\t0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41,\n\t0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41,\n\t0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41,\n\t// Bytes 40 - 7f\n\t0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41,\n\t0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41,\n\t0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41,\n\t0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41,\n\t0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41,\n\t0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41,\n\t0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41,\n\t0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41,\n\t// Bytes 80 - bf\n\t0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41,\n\t0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41,\n\t0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41,\n\t0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41,\n\t0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41,\n\t0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41,\n\t0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41,\n\t0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42,\n\t// Bytes c0 - ff\n\t0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5,\n\t0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2,\n\t0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xB0, 0x42,\n\t0xC4, 0xA6, 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1,\n\t0x42, 0xC5, 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6,\n\t0x8E, 0x42, 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42,\n\t0xC8, 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90,\n\t0x42, 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9,\n\t// Bytes 100 - 13f\n\t0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, 0x99, 0x42,\n\t0xC9, 0x9B, 0x42, 0xC9, 0x9C, 0x42, 0xC9, 0x9F,\n\t0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA3, 0x42, 0xC9,\n\t0xA5, 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA8, 0x42,\n\t0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, 0xC9, 0xAB,\n\t0x42, 0xC9, 0xAD, 0x42, 0xC9, 0xAF, 0x42, 0xC9,\n\t0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42,\n\t0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5,\n\t// Bytes 140 - 17f\n\t0x42, 0xC9, 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9,\n\t0xBB, 0x42, 0xCA, 0x81, 0x42, 0xCA, 0x82, 0x42,\n\t0xCA, 0x83, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A,\n\t0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA,\n\t0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, 0x42,\n\t0xCA, 0x95, 0x42, 0xCA, 0x9D, 0x42, 0xCA, 0x9F,\n\t0x42, 0xCA, 0xB9, 0x42, 0xCE, 0x91, 0x42, 0xCE,\n\t0x92, 0x42, 0xCE, 0x93, 0x42, 0xCE, 0x94, 0x42,\n\t// Bytes 180 - 1bf\n\t0xCE, 0x95, 0x42, 0xCE, 0x96, 0x42, 0xCE, 0x97,\n\t0x42, 0xCE, 0x98, 0x42, 0xCE, 0x99, 0x42, 0xCE,\n\t0x9A, 0x42, 0xCE, 0x9B, 0x42, 0xCE, 0x9C, 0x42,\n\t0xCE, 0x9D, 0x42, 0xCE, 0x9E, 0x42, 0xCE, 0x9F,\n\t0x42, 0xCE, 0xA0, 0x42, 0xCE, 0xA1, 0x42, 0xCE,\n\t0xA3, 0x42, 0xCE, 0xA4, 0x42, 0xCE, 0xA5, 0x42,\n\t0xCE, 0xA6, 0x42, 0xCE, 0xA7, 0x42, 0xCE, 0xA8,\n\t0x42, 0xCE, 0xA9, 0x42, 0xCE, 0xB1, 0x42, 0xCE,\n\t// Bytes 1c0 - 1ff\n\t0xB2, 0x42, 0xCE, 0xB3, 0x42, 0xCE, 0xB4, 0x42,\n\t0xCE, 0xB5, 0x42, 0xCE, 0xB6, 0x42, 0xCE, 0xB7,\n\t0x42, 0xCE, 0xB8, 0x42, 0xCE, 0xB9, 0x42, 0xCE,\n\t0xBA, 0x42, 0xCE, 0xBB, 0x42, 0xCE, 0xBC, 0x42,\n\t0xCE, 0xBD, 0x42, 0xCE, 0xBE, 0x42, 0xCE, 0xBF,\n\t0x42, 0xCF, 0x80, 0x42, 0xCF, 0x81, 0x42, 0xCF,\n\t0x82, 0x42, 0xCF, 0x83, 0x42, 0xCF, 0x84, 0x42,\n\t0xCF, 0x85, 0x42, 0xCF, 0x86, 0x42, 0xCF, 0x87,\n\t// Bytes 200 - 23f\n\t0x42, 0xCF, 0x88, 0x42, 0xCF, 0x89, 0x42, 0xCF,\n\t0x9C, 0x42, 0xCF, 0x9D, 0x42, 0xD0, 0xBD, 0x42,\n\t0xD1, 0x8A, 0x42, 0xD1, 0x8C, 0x42, 0xD7, 0x90,\n\t0x42, 0xD7, 0x91, 0x42, 0xD7, 0x92, 0x42, 0xD7,\n\t0x93, 0x42, 0xD7, 0x94, 0x42, 0xD7, 0x9B, 0x42,\n\t0xD7, 0x9C, 0x42, 0xD7, 0x9D, 0x42, 0xD7, 0xA2,\n\t0x42, 0xD7, 0xA8, 0x42, 0xD7, 0xAA, 0x42, 0xD8,\n\t0xA1, 0x42, 0xD8, 0xA7, 0x42, 0xD8, 0xA8, 0x42,\n\t// Bytes 240 - 27f\n\t0xD8, 0xA9, 0x42, 0xD8, 0xAA, 0x42, 0xD8, 0xAB,\n\t0x42, 0xD8, 0xAC, 0x42, 0xD8, 0xAD, 0x42, 0xD8,\n\t0xAE, 0x42, 0xD8, 0xAF, 0x42, 0xD8, 0xB0, 0x42,\n\t0xD8, 0xB1, 0x42, 0xD8, 0xB2, 0x42, 0xD8, 0xB3,\n\t0x42, 0xD8, 0xB4, 0x42, 0xD8, 0xB5, 0x42, 0xD8,\n\t0xB6, 0x42, 0xD8, 0xB7, 0x42, 0xD8, 0xB8, 0x42,\n\t0xD8, 0xB9, 0x42, 0xD8, 0xBA, 0x42, 0xD9, 0x81,\n\t0x42, 0xD9, 0x82, 0x42, 0xD9, 0x83, 0x42, 0xD9,\n\t// Bytes 280 - 2bf\n\t0x84, 0x42, 0xD9, 0x85, 0x42, 0xD9, 0x86, 0x42,\n\t0xD9, 0x87, 0x42, 0xD9, 0x88, 0x42, 0xD9, 0x89,\n\t0x42, 0xD9, 0x8A, 0x42, 0xD9, 0xAE, 0x42, 0xD9,\n\t0xAF, 0x42, 0xD9, 0xB1, 0x42, 0xD9, 0xB9, 0x42,\n\t0xD9, 0xBA, 0x42, 0xD9, 0xBB, 0x42, 0xD9, 0xBE,\n\t0x42, 0xD9, 0xBF, 0x42, 0xDA, 0x80, 0x42, 0xDA,\n\t0x83, 0x42, 0xDA, 0x84, 0x42, 0xDA, 0x86, 0x42,\n\t0xDA, 0x87, 0x42, 0xDA, 0x88, 0x42, 0xDA, 0x8C,\n\t// Bytes 2c0 - 2ff\n\t0x42, 0xDA, 0x8D, 0x42, 0xDA, 0x8E, 0x42, 0xDA,\n\t0x91, 0x42, 0xDA, 0x98, 0x42, 0xDA, 0xA1, 0x42,\n\t0xDA, 0xA4, 0x42, 0xDA, 0xA6, 0x42, 0xDA, 0xA9,\n\t0x42, 0xDA, 0xAD, 0x42, 0xDA, 0xAF, 0x42, 0xDA,\n\t0xB1, 0x42, 0xDA, 0xB3, 0x42, 0xDA, 0xBA, 0x42,\n\t0xDA, 0xBB, 0x42, 0xDA, 0xBE, 0x42, 0xDB, 0x81,\n\t0x42, 0xDB, 0x85, 0x42, 0xDB, 0x86, 0x42, 0xDB,\n\t0x87, 0x42, 0xDB, 0x88, 0x42, 0xDB, 0x89, 0x42,\n\t// Bytes 300 - 33f\n\t0xDB, 0x8B, 0x42, 0xDB, 0x8C, 0x42, 0xDB, 0x90,\n\t0x42, 0xDB, 0x92, 0x43, 0xE0, 0xBC, 0x8B, 0x43,\n\t0xE1, 0x83, 0x9C, 0x43, 0xE1, 0x84, 0x80, 0x43,\n\t0xE1, 0x84, 0x81, 0x43, 0xE1, 0x84, 0x82, 0x43,\n\t0xE1, 0x84, 0x83, 0x43, 0xE1, 0x84, 0x84, 0x43,\n\t0xE1, 0x84, 0x85, 0x43, 0xE1, 0x84, 0x86, 0x43,\n\t0xE1, 0x84, 0x87, 0x43, 0xE1, 0x84, 0x88, 0x43,\n\t0xE1, 0x84, 0x89, 0x43, 0xE1, 0x84, 0x8A, 0x43,\n\t// Bytes 340 - 37f\n\t0xE1, 0x84, 0x8B, 0x43, 0xE1, 0x84, 0x8C, 0x43,\n\t0xE1, 0x84, 0x8D, 0x43, 0xE1, 0x84, 0x8E, 0x43,\n\t0xE1, 0x84, 0x8F, 0x43, 0xE1, 0x84, 0x90, 0x43,\n\t0xE1, 0x84, 0x91, 0x43, 0xE1, 0x84, 0x92, 0x43,\n\t0xE1, 0x84, 0x94, 0x43, 0xE1, 0x84, 0x95, 0x43,\n\t0xE1, 0x84, 0x9A, 0x43, 0xE1, 0x84, 0x9C, 0x43,\n\t0xE1, 0x84, 0x9D, 0x43, 0xE1, 0x84, 0x9E, 0x43,\n\t0xE1, 0x84, 0xA0, 0x43, 0xE1, 0x84, 0xA1, 0x43,\n\t// Bytes 380 - 3bf\n\t0xE1, 0x84, 0xA2, 0x43, 0xE1, 0x84, 0xA3, 0x43,\n\t0xE1, 0x84, 0xA7, 0x43, 0xE1, 0x84, 0xA9, 0x43,\n\t0xE1, 0x84, 0xAB, 0x43, 0xE1, 0x84, 0xAC, 0x43,\n\t0xE1, 0x84, 0xAD, 0x43, 0xE1, 0x84, 0xAE, 0x43,\n\t0xE1, 0x84, 0xAF, 0x43, 0xE1, 0x84, 0xB2, 0x43,\n\t0xE1, 0x84, 0xB6, 0x43, 0xE1, 0x85, 0x80, 0x43,\n\t0xE1, 0x85, 0x87, 0x43, 0xE1, 0x85, 0x8C, 0x43,\n\t0xE1, 0x85, 0x97, 0x43, 0xE1, 0x85, 0x98, 0x43,\n\t// Bytes 3c0 - 3ff\n\t0xE1, 0x85, 0x99, 0x43, 0xE1, 0x85, 0xA0, 0x43,\n\t0xE1, 0x86, 0x84, 0x43, 0xE1, 0x86, 0x85, 0x43,\n\t0xE1, 0x86, 0x88, 0x43, 0xE1, 0x86, 0x91, 0x43,\n\t0xE1, 0x86, 0x92, 0x43, 0xE1, 0x86, 0x94, 0x43,\n\t0xE1, 0x86, 0x9E, 0x43, 0xE1, 0x86, 0xA1, 0x43,\n\t0xE1, 0x87, 0x87, 0x43, 0xE1, 0x87, 0x88, 0x43,\n\t0xE1, 0x87, 0x8C, 0x43, 0xE1, 0x87, 0x8E, 0x43,\n\t0xE1, 0x87, 0x93, 0x43, 0xE1, 0x87, 0x97, 0x43,\n\t// Bytes 400 - 43f\n\t0xE1, 0x87, 0x99, 0x43, 0xE1, 0x87, 0x9D, 0x43,\n\t0xE1, 0x87, 0x9F, 0x43, 0xE1, 0x87, 0xB1, 0x43,\n\t0xE1, 0x87, 0xB2, 0x43, 0xE1, 0xB4, 0x82, 0x43,\n\t0xE1, 0xB4, 0x96, 0x43, 0xE1, 0xB4, 0x97, 0x43,\n\t0xE1, 0xB4, 0x9C, 0x43, 0xE1, 0xB4, 0x9D, 0x43,\n\t0xE1, 0xB4, 0xA5, 0x43, 0xE1, 0xB5, 0xBB, 0x43,\n\t0xE1, 0xB6, 0x85, 0x43, 0xE2, 0x80, 0x82, 0x43,\n\t0xE2, 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43,\n\t// Bytes 440 - 47f\n\t0xE2, 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43,\n\t0xE2, 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43,\n\t0xE2, 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43,\n\t0xE2, 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43,\n\t0xE2, 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43,\n\t0xE2, 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43,\n\t0xE2, 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43,\n\t0xE2, 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43,\n\t// Bytes 480 - 4bf\n\t0xE2, 0xB5, 0xA1, 0x43, 0xE3, 0x80, 0x81, 0x43,\n\t0xE3, 0x80, 0x82, 0x43, 0xE3, 0x80, 0x88, 0x43,\n\t0xE3, 0x80, 0x89, 0x43, 0xE3, 0x80, 0x8A, 0x43,\n\t0xE3, 0x80, 0x8B, 0x43, 0xE3, 0x80, 0x8C, 0x43,\n\t0xE3, 0x80, 0x8D, 0x43, 0xE3, 0x80, 0x8E, 0x43,\n\t0xE3, 0x80, 0x8F, 0x43, 0xE3, 0x80, 0x90, 0x43,\n\t0xE3, 0x80, 0x91, 0x43, 0xE3, 0x80, 0x92, 0x43,\n\t0xE3, 0x80, 0x94, 0x43, 0xE3, 0x80, 0x95, 0x43,\n\t// Bytes 4c0 - 4ff\n\t0xE3, 0x80, 0x96, 0x43, 0xE3, 0x80, 0x97, 0x43,\n\t0xE3, 0x82, 0xA1, 0x43, 0xE3, 0x82, 0xA2, 0x43,\n\t0xE3, 0x82, 0xA3, 0x43, 0xE3, 0x82, 0xA4, 0x43,\n\t0xE3, 0x82, 0xA5, 0x43, 0xE3, 0x82, 0xA6, 0x43,\n\t0xE3, 0x82, 0xA7, 0x43, 0xE3, 0x82, 0xA8, 0x43,\n\t0xE3, 0x82, 0xA9, 0x43, 0xE3, 0x82, 0xAA, 0x43,\n\t0xE3, 0x82, 0xAB, 0x43, 0xE3, 0x82, 0xAD, 0x43,\n\t0xE3, 0x82, 0xAF, 0x43, 0xE3, 0x82, 0xB1, 0x43,\n\t// Bytes 500 - 53f\n\t0xE3, 0x82, 0xB3, 0x43, 0xE3, 0x82, 0xB5, 0x43,\n\t0xE3, 0x82, 0xB7, 0x43, 0xE3, 0x82, 0xB9, 0x43,\n\t0xE3, 0x82, 0xBB, 0x43, 0xE3, 0x82, 0xBD, 0x43,\n\t0xE3, 0x82, 0xBF, 0x43, 0xE3, 0x83, 0x81, 0x43,\n\t0xE3, 0x83, 0x83, 0x43, 0xE3, 0x83, 0x84, 0x43,\n\t0xE3, 0x83, 0x86, 0x43, 0xE3, 0x83, 0x88, 0x43,\n\t0xE3, 0x83, 0x8A, 0x43, 0xE3, 0x83, 0x8B, 0x43,\n\t0xE3, 0x83, 0x8C, 0x43, 0xE3, 0x83, 0x8D, 0x43,\n\t// Bytes 540 - 57f\n\t0xE3, 0x83, 0x8E, 0x43, 0xE3, 0x83, 0x8F, 0x43,\n\t0xE3, 0x83, 0x92, 0x43, 0xE3, 0x83, 0x95, 0x43,\n\t0xE3, 0x83, 0x98, 0x43, 0xE3, 0x83, 0x9B, 0x43,\n\t0xE3, 0x83, 0x9E, 0x43, 0xE3, 0x83, 0x9F, 0x43,\n\t0xE3, 0x83, 0xA0, 0x43, 0xE3, 0x83, 0xA1, 0x43,\n\t0xE3, 0x83, 0xA2, 0x43, 0xE3, 0x83, 0xA3, 0x43,\n\t0xE3, 0x83, 0xA4, 0x43, 0xE3, 0x83, 0xA5, 0x43,\n\t0xE3, 0x83, 0xA6, 0x43, 0xE3, 0x83, 0xA7, 0x43,\n\t// Bytes 580 - 5bf\n\t0xE3, 0x83, 0xA8, 0x43, 0xE3, 0x83, 0xA9, 0x43,\n\t0xE3, 0x83, 0xAA, 0x43, 0xE3, 0x83, 0xAB, 0x43,\n\t0xE3, 0x83, 0xAC, 0x43, 0xE3, 0x83, 0xAD, 0x43,\n\t0xE3, 0x83, 0xAF, 0x43, 0xE3, 0x83, 0xB0, 0x43,\n\t0xE3, 0x83, 0xB1, 0x43, 0xE3, 0x83, 0xB2, 0x43,\n\t0xE3, 0x83, 0xB3, 0x43, 0xE3, 0x83, 0xBB, 0x43,\n\t0xE3, 0x83, 0xBC, 0x43, 0xE3, 0x92, 0x9E, 0x43,\n\t0xE3, 0x92, 0xB9, 0x43, 0xE3, 0x92, 0xBB, 0x43,\n\t// Bytes 5c0 - 5ff\n\t0xE3, 0x93, 0x9F, 0x43, 0xE3, 0x94, 0x95, 0x43,\n\t0xE3, 0x9B, 0xAE, 0x43, 0xE3, 0x9B, 0xBC, 0x43,\n\t0xE3, 0x9E, 0x81, 0x43, 0xE3, 0xA0, 0xAF, 0x43,\n\t0xE3, 0xA1, 0xA2, 0x43, 0xE3, 0xA1, 0xBC, 0x43,\n\t0xE3, 0xA3, 0x87, 0x43, 0xE3, 0xA3, 0xA3, 0x43,\n\t0xE3, 0xA4, 0x9C, 0x43, 0xE3, 0xA4, 0xBA, 0x43,\n\t0xE3, 0xA8, 0xAE, 0x43, 0xE3, 0xA9, 0xAC, 0x43,\n\t0xE3, 0xAB, 0xA4, 0x43, 0xE3, 0xAC, 0x88, 0x43,\n\t// Bytes 600 - 63f\n\t0xE3, 0xAC, 0x99, 0x43, 0xE3, 0xAD, 0x89, 0x43,\n\t0xE3, 0xAE, 0x9D, 0x43, 0xE3, 0xB0, 0x98, 0x43,\n\t0xE3, 0xB1, 0x8E, 0x43, 0xE3, 0xB4, 0xB3, 0x43,\n\t0xE3, 0xB6, 0x96, 0x43, 0xE3, 0xBA, 0xAC, 0x43,\n\t0xE3, 0xBA, 0xB8, 0x43, 0xE3, 0xBC, 0x9B, 0x43,\n\t0xE3, 0xBF, 0xBC, 0x43, 0xE4, 0x80, 0x88, 0x43,\n\t0xE4, 0x80, 0x98, 0x43, 0xE4, 0x80, 0xB9, 0x43,\n\t0xE4, 0x81, 0x86, 0x43, 0xE4, 0x82, 0x96, 0x43,\n\t// Bytes 640 - 67f\n\t0xE4, 0x83, 0xA3, 0x43, 0xE4, 0x84, 0xAF, 0x43,\n\t0xE4, 0x88, 0x82, 0x43, 0xE4, 0x88, 0xA7, 0x43,\n\t0xE4, 0x8A, 0xA0, 0x43, 0xE4, 0x8C, 0x81, 0x43,\n\t0xE4, 0x8C, 0xB4, 0x43, 0xE4, 0x8D, 0x99, 0x43,\n\t0xE4, 0x8F, 0x95, 0x43, 0xE4, 0x8F, 0x99, 0x43,\n\t0xE4, 0x90, 0x8B, 0x43, 0xE4, 0x91, 0xAB, 0x43,\n\t0xE4, 0x94, 0xAB, 0x43, 0xE4, 0x95, 0x9D, 0x43,\n\t0xE4, 0x95, 0xA1, 0x43, 0xE4, 0x95, 0xAB, 0x43,\n\t// Bytes 680 - 6bf\n\t0xE4, 0x97, 0x97, 0x43, 0xE4, 0x97, 0xB9, 0x43,\n\t0xE4, 0x98, 0xB5, 0x43, 0xE4, 0x9A, 0xBE, 0x43,\n\t0xE4, 0x9B, 0x87, 0x43, 0xE4, 0xA6, 0x95, 0x43,\n\t0xE4, 0xA7, 0xA6, 0x43, 0xE4, 0xA9, 0xAE, 0x43,\n\t0xE4, 0xA9, 0xB6, 0x43, 0xE4, 0xAA, 0xB2, 0x43,\n\t0xE4, 0xAC, 0xB3, 0x43, 0xE4, 0xAF, 0x8E, 0x43,\n\t0xE4, 0xB3, 0x8E, 0x43, 0xE4, 0xB3, 0xAD, 0x43,\n\t0xE4, 0xB3, 0xB8, 0x43, 0xE4, 0xB5, 0x96, 0x43,\n\t// Bytes 6c0 - 6ff\n\t0xE4, 0xB8, 0x80, 0x43, 0xE4, 0xB8, 0x81, 0x43,\n\t0xE4, 0xB8, 0x83, 0x43, 0xE4, 0xB8, 0x89, 0x43,\n\t0xE4, 0xB8, 0x8A, 0x43, 0xE4, 0xB8, 0x8B, 0x43,\n\t0xE4, 0xB8, 0x8D, 0x43, 0xE4, 0xB8, 0x99, 0x43,\n\t0xE4, 0xB8, 0xA6, 0x43, 0xE4, 0xB8, 0xA8, 0x43,\n\t0xE4, 0xB8, 0xAD, 0x43, 0xE4, 0xB8, 0xB2, 0x43,\n\t0xE4, 0xB8, 0xB6, 0x43, 0xE4, 0xB8, 0xB8, 0x43,\n\t0xE4, 0xB8, 0xB9, 0x43, 0xE4, 0xB8, 0xBD, 0x43,\n\t// Bytes 700 - 73f\n\t0xE4, 0xB8, 0xBF, 0x43, 0xE4, 0xB9, 0x81, 0x43,\n\t0xE4, 0xB9, 0x99, 0x43, 0xE4, 0xB9, 0x9D, 0x43,\n\t0xE4, 0xBA, 0x82, 0x43, 0xE4, 0xBA, 0x85, 0x43,\n\t0xE4, 0xBA, 0x86, 0x43, 0xE4, 0xBA, 0x8C, 0x43,\n\t0xE4, 0xBA, 0x94, 0x43, 0xE4, 0xBA, 0xA0, 0x43,\n\t0xE4, 0xBA, 0xA4, 0x43, 0xE4, 0xBA, 0xAE, 0x43,\n\t0xE4, 0xBA, 0xBA, 0x43, 0xE4, 0xBB, 0x80, 0x43,\n\t0xE4, 0xBB, 0x8C, 0x43, 0xE4, 0xBB, 0xA4, 0x43,\n\t// Bytes 740 - 77f\n\t0xE4, 0xBC, 0x81, 0x43, 0xE4, 0xBC, 0x91, 0x43,\n\t0xE4, 0xBD, 0xA0, 0x43, 0xE4, 0xBE, 0x80, 0x43,\n\t0xE4, 0xBE, 0x86, 0x43, 0xE4, 0xBE, 0x8B, 0x43,\n\t0xE4, 0xBE, 0xAE, 0x43, 0xE4, 0xBE, 0xBB, 0x43,\n\t0xE4, 0xBE, 0xBF, 0x43, 0xE5, 0x80, 0x82, 0x43,\n\t0xE5, 0x80, 0xAB, 0x43, 0xE5, 0x81, 0xBA, 0x43,\n\t0xE5, 0x82, 0x99, 0x43, 0xE5, 0x83, 0x8F, 0x43,\n\t0xE5, 0x83, 0x9A, 0x43, 0xE5, 0x83, 0xA7, 0x43,\n\t// Bytes 780 - 7bf\n\t0xE5, 0x84, 0xAA, 0x43, 0xE5, 0x84, 0xBF, 0x43,\n\t0xE5, 0x85, 0x80, 0x43, 0xE5, 0x85, 0x85, 0x43,\n\t0xE5, 0x85, 0x8D, 0x43, 0xE5, 0x85, 0x94, 0x43,\n\t0xE5, 0x85, 0xA4, 0x43, 0xE5, 0x85, 0xA5, 0x43,\n\t0xE5, 0x85, 0xA7, 0x43, 0xE5, 0x85, 0xA8, 0x43,\n\t0xE5, 0x85, 0xA9, 0x43, 0xE5, 0x85, 0xAB, 0x43,\n\t0xE5, 0x85, 0xAD, 0x43, 0xE5, 0x85, 0xB7, 0x43,\n\t0xE5, 0x86, 0x80, 0x43, 0xE5, 0x86, 0x82, 0x43,\n\t// Bytes 7c0 - 7ff\n\t0xE5, 0x86, 0x8D, 0x43, 0xE5, 0x86, 0x92, 0x43,\n\t0xE5, 0x86, 0x95, 0x43, 0xE5, 0x86, 0x96, 0x43,\n\t0xE5, 0x86, 0x97, 0x43, 0xE5, 0x86, 0x99, 0x43,\n\t0xE5, 0x86, 0xA4, 0x43, 0xE5, 0x86, 0xAB, 0x43,\n\t0xE5, 0x86, 0xAC, 0x43, 0xE5, 0x86, 0xB5, 0x43,\n\t0xE5, 0x86, 0xB7, 0x43, 0xE5, 0x87, 0x89, 0x43,\n\t0xE5, 0x87, 0x8C, 0x43, 0xE5, 0x87, 0x9C, 0x43,\n\t0xE5, 0x87, 0x9E, 0x43, 0xE5, 0x87, 0xA0, 0x43,\n\t// Bytes 800 - 83f\n\t0xE5, 0x87, 0xB5, 0x43, 0xE5, 0x88, 0x80, 0x43,\n\t0xE5, 0x88, 0x83, 0x43, 0xE5, 0x88, 0x87, 0x43,\n\t0xE5, 0x88, 0x97, 0x43, 0xE5, 0x88, 0x9D, 0x43,\n\t0xE5, 0x88, 0xA9, 0x43, 0xE5, 0x88, 0xBA, 0x43,\n\t0xE5, 0x88, 0xBB, 0x43, 0xE5, 0x89, 0x86, 0x43,\n\t0xE5, 0x89, 0x8D, 0x43, 0xE5, 0x89, 0xB2, 0x43,\n\t0xE5, 0x89, 0xB7, 0x43, 0xE5, 0x8A, 0x89, 0x43,\n\t0xE5, 0x8A, 0x9B, 0x43, 0xE5, 0x8A, 0xA3, 0x43,\n\t// Bytes 840 - 87f\n\t0xE5, 0x8A, 0xB3, 0x43, 0xE5, 0x8A, 0xB4, 0x43,\n\t0xE5, 0x8B, 0x87, 0x43, 0xE5, 0x8B, 0x89, 0x43,\n\t0xE5, 0x8B, 0x92, 0x43, 0xE5, 0x8B, 0x9E, 0x43,\n\t0xE5, 0x8B, 0xA4, 0x43, 0xE5, 0x8B, 0xB5, 0x43,\n\t0xE5, 0x8B, 0xB9, 0x43, 0xE5, 0x8B, 0xBA, 0x43,\n\t0xE5, 0x8C, 0x85, 0x43, 0xE5, 0x8C, 0x86, 0x43,\n\t0xE5, 0x8C, 0x95, 0x43, 0xE5, 0x8C, 0x97, 0x43,\n\t0xE5, 0x8C, 0x9A, 0x43, 0xE5, 0x8C, 0xB8, 0x43,\n\t// Bytes 880 - 8bf\n\t0xE5, 0x8C, 0xBB, 0x43, 0xE5, 0x8C, 0xBF, 0x43,\n\t0xE5, 0x8D, 0x81, 0x43, 0xE5, 0x8D, 0x84, 0x43,\n\t0xE5, 0x8D, 0x85, 0x43, 0xE5, 0x8D, 0x89, 0x43,\n\t0xE5, 0x8D, 0x91, 0x43, 0xE5, 0x8D, 0x94, 0x43,\n\t0xE5, 0x8D, 0x9A, 0x43, 0xE5, 0x8D, 0x9C, 0x43,\n\t0xE5, 0x8D, 0xA9, 0x43, 0xE5, 0x8D, 0xB0, 0x43,\n\t0xE5, 0x8D, 0xB3, 0x43, 0xE5, 0x8D, 0xB5, 0x43,\n\t0xE5, 0x8D, 0xBD, 0x43, 0xE5, 0x8D, 0xBF, 0x43,\n\t// Bytes 8c0 - 8ff\n\t0xE5, 0x8E, 0x82, 0x43, 0xE5, 0x8E, 0xB6, 0x43,\n\t0xE5, 0x8F, 0x83, 0x43, 0xE5, 0x8F, 0x88, 0x43,\n\t0xE5, 0x8F, 0x8A, 0x43, 0xE5, 0x8F, 0x8C, 0x43,\n\t0xE5, 0x8F, 0x9F, 0x43, 0xE5, 0x8F, 0xA3, 0x43,\n\t0xE5, 0x8F, 0xA5, 0x43, 0xE5, 0x8F, 0xAB, 0x43,\n\t0xE5, 0x8F, 0xAF, 0x43, 0xE5, 0x8F, 0xB1, 0x43,\n\t0xE5, 0x8F, 0xB3, 0x43, 0xE5, 0x90, 0x86, 0x43,\n\t0xE5, 0x90, 0x88, 0x43, 0xE5, 0x90, 0x8D, 0x43,\n\t// Bytes 900 - 93f\n\t0xE5, 0x90, 0x8F, 0x43, 0xE5, 0x90, 0x9D, 0x43,\n\t0xE5, 0x90, 0xB8, 0x43, 0xE5, 0x90, 0xB9, 0x43,\n\t0xE5, 0x91, 0x82, 0x43, 0xE5, 0x91, 0x88, 0x43,\n\t0xE5, 0x91, 0xA8, 0x43, 0xE5, 0x92, 0x9E, 0x43,\n\t0xE5, 0x92, 0xA2, 0x43, 0xE5, 0x92, 0xBD, 0x43,\n\t0xE5, 0x93, 0xB6, 0x43, 0xE5, 0x94, 0x90, 0x43,\n\t0xE5, 0x95, 0x8F, 0x43, 0xE5, 0x95, 0x93, 0x43,\n\t0xE5, 0x95, 0x95, 0x43, 0xE5, 0x95, 0xA3, 0x43,\n\t// Bytes 940 - 97f\n\t0xE5, 0x96, 0x84, 0x43, 0xE5, 0x96, 0x87, 0x43,\n\t0xE5, 0x96, 0x99, 0x43, 0xE5, 0x96, 0x9D, 0x43,\n\t0xE5, 0x96, 0xAB, 0x43, 0xE5, 0x96, 0xB3, 0x43,\n\t0xE5, 0x96, 0xB6, 0x43, 0xE5, 0x97, 0x80, 0x43,\n\t0xE5, 0x97, 0x82, 0x43, 0xE5, 0x97, 0xA2, 0x43,\n\t0xE5, 0x98, 0x86, 0x43, 0xE5, 0x99, 0x91, 0x43,\n\t0xE5, 0x99, 0xA8, 0x43, 0xE5, 0x99, 0xB4, 0x43,\n\t0xE5, 0x9B, 0x97, 0x43, 0xE5, 0x9B, 0x9B, 0x43,\n\t// Bytes 980 - 9bf\n\t0xE5, 0x9B, 0xB9, 0x43, 0xE5, 0x9C, 0x96, 0x43,\n\t0xE5, 0x9C, 0x97, 0x43, 0xE5, 0x9C, 0x9F, 0x43,\n\t0xE5, 0x9C, 0xB0, 0x43, 0xE5, 0x9E, 0x8B, 0x43,\n\t0xE5, 0x9F, 0x8E, 0x43, 0xE5, 0x9F, 0xB4, 0x43,\n\t0xE5, 0xA0, 0x8D, 0x43, 0xE5, 0xA0, 0xB1, 0x43,\n\t0xE5, 0xA0, 0xB2, 0x43, 0xE5, 0xA1, 0x80, 0x43,\n\t0xE5, 0xA1, 0x9A, 0x43, 0xE5, 0xA1, 0x9E, 0x43,\n\t0xE5, 0xA2, 0xA8, 0x43, 0xE5, 0xA2, 0xAC, 0x43,\n\t// Bytes 9c0 - 9ff\n\t0xE5, 0xA2, 0xB3, 0x43, 0xE5, 0xA3, 0x98, 0x43,\n\t0xE5, 0xA3, 0x9F, 0x43, 0xE5, 0xA3, 0xAB, 0x43,\n\t0xE5, 0xA3, 0xAE, 0x43, 0xE5, 0xA3, 0xB0, 0x43,\n\t0xE5, 0xA3, 0xB2, 0x43, 0xE5, 0xA3, 0xB7, 0x43,\n\t0xE5, 0xA4, 0x82, 0x43, 0xE5, 0xA4, 0x86, 0x43,\n\t0xE5, 0xA4, 0x8A, 0x43, 0xE5, 0xA4, 0x95, 0x43,\n\t0xE5, 0xA4, 0x9A, 0x43, 0xE5, 0xA4, 0x9C, 0x43,\n\t0xE5, 0xA4, 0xA2, 0x43, 0xE5, 0xA4, 0xA7, 0x43,\n\t// Bytes a00 - a3f\n\t0xE5, 0xA4, 0xA9, 0x43, 0xE5, 0xA5, 0x84, 0x43,\n\t0xE5, 0xA5, 0x88, 0x43, 0xE5, 0xA5, 0x91, 0x43,\n\t0xE5, 0xA5, 0x94, 0x43, 0xE5, 0xA5, 0xA2, 0x43,\n\t0xE5, 0xA5, 0xB3, 0x43, 0xE5, 0xA7, 0x98, 0x43,\n\t0xE5, 0xA7, 0xAC, 0x43, 0xE5, 0xA8, 0x9B, 0x43,\n\t0xE5, 0xA8, 0xA7, 0x43, 0xE5, 0xA9, 0xA2, 0x43,\n\t0xE5, 0xA9, 0xA6, 0x43, 0xE5, 0xAA, 0xB5, 0x43,\n\t0xE5, 0xAC, 0x88, 0x43, 0xE5, 0xAC, 0xA8, 0x43,\n\t// Bytes a40 - a7f\n\t0xE5, 0xAC, 0xBE, 0x43, 0xE5, 0xAD, 0x90, 0x43,\n\t0xE5, 0xAD, 0x97, 0x43, 0xE5, 0xAD, 0xA6, 0x43,\n\t0xE5, 0xAE, 0x80, 0x43, 0xE5, 0xAE, 0x85, 0x43,\n\t0xE5, 0xAE, 0x97, 0x43, 0xE5, 0xAF, 0x83, 0x43,\n\t0xE5, 0xAF, 0x98, 0x43, 0xE5, 0xAF, 0xA7, 0x43,\n\t0xE5, 0xAF, 0xAE, 0x43, 0xE5, 0xAF, 0xB3, 0x43,\n\t0xE5, 0xAF, 0xB8, 0x43, 0xE5, 0xAF, 0xBF, 0x43,\n\t0xE5, 0xB0, 0x86, 0x43, 0xE5, 0xB0, 0x8F, 0x43,\n\t// Bytes a80 - abf\n\t0xE5, 0xB0, 0xA2, 0x43, 0xE5, 0xB0, 0xB8, 0x43,\n\t0xE5, 0xB0, 0xBF, 0x43, 0xE5, 0xB1, 0xA0, 0x43,\n\t0xE5, 0xB1, 0xA2, 0x43, 0xE5, 0xB1, 0xA4, 0x43,\n\t0xE5, 0xB1, 0xA5, 0x43, 0xE5, 0xB1, 0xAE, 0x43,\n\t0xE5, 0xB1, 0xB1, 0x43, 0xE5, 0xB2, 0x8D, 0x43,\n\t0xE5, 0xB3, 0x80, 0x43, 0xE5, 0xB4, 0x99, 0x43,\n\t0xE5, 0xB5, 0x83, 0x43, 0xE5, 0xB5, 0x90, 0x43,\n\t0xE5, 0xB5, 0xAB, 0x43, 0xE5, 0xB5, 0xAE, 0x43,\n\t// Bytes ac0 - aff\n\t0xE5, 0xB5, 0xBC, 0x43, 0xE5, 0xB6, 0xB2, 0x43,\n\t0xE5, 0xB6, 0xBA, 0x43, 0xE5, 0xB7, 0x9B, 0x43,\n\t0xE5, 0xB7, 0xA1, 0x43, 0xE5, 0xB7, 0xA2, 0x43,\n\t0xE5, 0xB7, 0xA5, 0x43, 0xE5, 0xB7, 0xA6, 0x43,\n\t0xE5, 0xB7, 0xB1, 0x43, 0xE5, 0xB7, 0xBD, 0x43,\n\t0xE5, 0xB7, 0xBE, 0x43, 0xE5, 0xB8, 0xA8, 0x43,\n\t0xE5, 0xB8, 0xBD, 0x43, 0xE5, 0xB9, 0xA9, 0x43,\n\t0xE5, 0xB9, 0xB2, 0x43, 0xE5, 0xB9, 0xB4, 0x43,\n\t// Bytes b00 - b3f\n\t0xE5, 0xB9, 0xBA, 0x43, 0xE5, 0xB9, 0xBC, 0x43,\n\t0xE5, 0xB9, 0xBF, 0x43, 0xE5, 0xBA, 0xA6, 0x43,\n\t0xE5, 0xBA, 0xB0, 0x43, 0xE5, 0xBA, 0xB3, 0x43,\n\t0xE5, 0xBA, 0xB6, 0x43, 0xE5, 0xBB, 0x89, 0x43,\n\t0xE5, 0xBB, 0x8A, 0x43, 0xE5, 0xBB, 0x92, 0x43,\n\t0xE5, 0xBB, 0x93, 0x43, 0xE5, 0xBB, 0x99, 0x43,\n\t0xE5, 0xBB, 0xAC, 0x43, 0xE5, 0xBB, 0xB4, 0x43,\n\t0xE5, 0xBB, 0xBE, 0x43, 0xE5, 0xBC, 0x84, 0x43,\n\t// Bytes b40 - b7f\n\t0xE5, 0xBC, 0x8B, 0x43, 0xE5, 0xBC, 0x93, 0x43,\n\t0xE5, 0xBC, 0xA2, 0x43, 0xE5, 0xBD, 0x90, 0x43,\n\t0xE5, 0xBD, 0x93, 0x43, 0xE5, 0xBD, 0xA1, 0x43,\n\t0xE5, 0xBD, 0xA2, 0x43, 0xE5, 0xBD, 0xA9, 0x43,\n\t0xE5, 0xBD, 0xAB, 0x43, 0xE5, 0xBD, 0xB3, 0x43,\n\t0xE5, 0xBE, 0x8B, 0x43, 0xE5, 0xBE, 0x8C, 0x43,\n\t0xE5, 0xBE, 0x97, 0x43, 0xE5, 0xBE, 0x9A, 0x43,\n\t0xE5, 0xBE, 0xA9, 0x43, 0xE5, 0xBE, 0xAD, 0x43,\n\t// Bytes b80 - bbf\n\t0xE5, 0xBF, 0x83, 0x43, 0xE5, 0xBF, 0x8D, 0x43,\n\t0xE5, 0xBF, 0x97, 0x43, 0xE5, 0xBF, 0xB5, 0x43,\n\t0xE5, 0xBF, 0xB9, 0x43, 0xE6, 0x80, 0x92, 0x43,\n\t0xE6, 0x80, 0x9C, 0x43, 0xE6, 0x81, 0xB5, 0x43,\n\t0xE6, 0x82, 0x81, 0x43, 0xE6, 0x82, 0x94, 0x43,\n\t0xE6, 0x83, 0x87, 0x43, 0xE6, 0x83, 0x98, 0x43,\n\t0xE6, 0x83, 0xA1, 0x43, 0xE6, 0x84, 0x88, 0x43,\n\t0xE6, 0x85, 0x84, 0x43, 0xE6, 0x85, 0x88, 0x43,\n\t// Bytes bc0 - bff\n\t0xE6, 0x85, 0x8C, 0x43, 0xE6, 0x85, 0x8E, 0x43,\n\t0xE6, 0x85, 0xA0, 0x43, 0xE6, 0x85, 0xA8, 0x43,\n\t0xE6, 0x85, 0xBA, 0x43, 0xE6, 0x86, 0x8E, 0x43,\n\t0xE6, 0x86, 0x90, 0x43, 0xE6, 0x86, 0xA4, 0x43,\n\t0xE6, 0x86, 0xAF, 0x43, 0xE6, 0x86, 0xB2, 0x43,\n\t0xE6, 0x87, 0x9E, 0x43, 0xE6, 0x87, 0xB2, 0x43,\n\t0xE6, 0x87, 0xB6, 0x43, 0xE6, 0x88, 0x80, 0x43,\n\t0xE6, 0x88, 0x88, 0x43, 0xE6, 0x88, 0x90, 0x43,\n\t// Bytes c00 - c3f\n\t0xE6, 0x88, 0x9B, 0x43, 0xE6, 0x88, 0xAE, 0x43,\n\t0xE6, 0x88, 0xB4, 0x43, 0xE6, 0x88, 0xB6, 0x43,\n\t0xE6, 0x89, 0x8B, 0x43, 0xE6, 0x89, 0x93, 0x43,\n\t0xE6, 0x89, 0x9D, 0x43, 0xE6, 0x8A, 0x95, 0x43,\n\t0xE6, 0x8A, 0xB1, 0x43, 0xE6, 0x8B, 0x89, 0x43,\n\t0xE6, 0x8B, 0x8F, 0x43, 0xE6, 0x8B, 0x93, 0x43,\n\t0xE6, 0x8B, 0x94, 0x43, 0xE6, 0x8B, 0xBC, 0x43,\n\t0xE6, 0x8B, 0xBE, 0x43, 0xE6, 0x8C, 0x87, 0x43,\n\t// Bytes c40 - c7f\n\t0xE6, 0x8C, 0xBD, 0x43, 0xE6, 0x8D, 0x90, 0x43,\n\t0xE6, 0x8D, 0x95, 0x43, 0xE6, 0x8D, 0xA8, 0x43,\n\t0xE6, 0x8D, 0xBB, 0x43, 0xE6, 0x8E, 0x83, 0x43,\n\t0xE6, 0x8E, 0xA0, 0x43, 0xE6, 0x8E, 0xA9, 0x43,\n\t0xE6, 0x8F, 0x84, 0x43, 0xE6, 0x8F, 0x85, 0x43,\n\t0xE6, 0x8F, 0xA4, 0x43, 0xE6, 0x90, 0x9C, 0x43,\n\t0xE6, 0x90, 0xA2, 0x43, 0xE6, 0x91, 0x92, 0x43,\n\t0xE6, 0x91, 0xA9, 0x43, 0xE6, 0x91, 0xB7, 0x43,\n\t// Bytes c80 - cbf\n\t0xE6, 0x91, 0xBE, 0x43, 0xE6, 0x92, 0x9A, 0x43,\n\t0xE6, 0x92, 0x9D, 0x43, 0xE6, 0x93, 0x84, 0x43,\n\t0xE6, 0x94, 0xAF, 0x43, 0xE6, 0x94, 0xB4, 0x43,\n\t0xE6, 0x95, 0x8F, 0x43, 0xE6, 0x95, 0x96, 0x43,\n\t0xE6, 0x95, 0xAC, 0x43, 0xE6, 0x95, 0xB8, 0x43,\n\t0xE6, 0x96, 0x87, 0x43, 0xE6, 0x96, 0x97, 0x43,\n\t0xE6, 0x96, 0x99, 0x43, 0xE6, 0x96, 0xA4, 0x43,\n\t0xE6, 0x96, 0xB0, 0x43, 0xE6, 0x96, 0xB9, 0x43,\n\t// Bytes cc0 - cff\n\t0xE6, 0x97, 0x85, 0x43, 0xE6, 0x97, 0xA0, 0x43,\n\t0xE6, 0x97, 0xA2, 0x43, 0xE6, 0x97, 0xA3, 0x43,\n\t0xE6, 0x97, 0xA5, 0x43, 0xE6, 0x98, 0x93, 0x43,\n\t0xE6, 0x98, 0xA0, 0x43, 0xE6, 0x99, 0x89, 0x43,\n\t0xE6, 0x99, 0xB4, 0x43, 0xE6, 0x9A, 0x88, 0x43,\n\t0xE6, 0x9A, 0x91, 0x43, 0xE6, 0x9A, 0x9C, 0x43,\n\t0xE6, 0x9A, 0xB4, 0x43, 0xE6, 0x9B, 0x86, 0x43,\n\t0xE6, 0x9B, 0xB0, 0x43, 0xE6, 0x9B, 0xB4, 0x43,\n\t// Bytes d00 - d3f\n\t0xE6, 0x9B, 0xB8, 0x43, 0xE6, 0x9C, 0x80, 0x43,\n\t0xE6, 0x9C, 0x88, 0x43, 0xE6, 0x9C, 0x89, 0x43,\n\t0xE6, 0x9C, 0x97, 0x43, 0xE6, 0x9C, 0x9B, 0x43,\n\t0xE6, 0x9C, 0xA1, 0x43, 0xE6, 0x9C, 0xA8, 0x43,\n\t0xE6, 0x9D, 0x8E, 0x43, 0xE6, 0x9D, 0x93, 0x43,\n\t0xE6, 0x9D, 0x96, 0x43, 0xE6, 0x9D, 0x9E, 0x43,\n\t0xE6, 0x9D, 0xBB, 0x43, 0xE6, 0x9E, 0x85, 0x43,\n\t0xE6, 0x9E, 0x97, 0x43, 0xE6, 0x9F, 0xB3, 0x43,\n\t// Bytes d40 - d7f\n\t0xE6, 0x9F, 0xBA, 0x43, 0xE6, 0xA0, 0x97, 0x43,\n\t0xE6, 0xA0, 0x9F, 0x43, 0xE6, 0xA0, 0xAA, 0x43,\n\t0xE6, 0xA1, 0x92, 0x43, 0xE6, 0xA2, 0x81, 0x43,\n\t0xE6, 0xA2, 0x85, 0x43, 0xE6, 0xA2, 0x8E, 0x43,\n\t0xE6, 0xA2, 0xA8, 0x43, 0xE6, 0xA4, 0x94, 0x43,\n\t0xE6, 0xA5, 0x82, 0x43, 0xE6, 0xA6, 0xA3, 0x43,\n\t0xE6, 0xA7, 0xAA, 0x43, 0xE6, 0xA8, 0x82, 0x43,\n\t0xE6, 0xA8, 0x93, 0x43, 0xE6, 0xAA, 0xA8, 0x43,\n\t// Bytes d80 - dbf\n\t0xE6, 0xAB, 0x93, 0x43, 0xE6, 0xAB, 0x9B, 0x43,\n\t0xE6, 0xAC, 0x84, 0x43, 0xE6, 0xAC, 0xA0, 0x43,\n\t0xE6, 0xAC, 0xA1, 0x43, 0xE6, 0xAD, 0x94, 0x43,\n\t0xE6, 0xAD, 0xA2, 0x43, 0xE6, 0xAD, 0xA3, 0x43,\n\t0xE6, 0xAD, 0xB2, 0x43, 0xE6, 0xAD, 0xB7, 0x43,\n\t0xE6, 0xAD, 0xB9, 0x43, 0xE6, 0xAE, 0x9F, 0x43,\n\t0xE6, 0xAE, 0xAE, 0x43, 0xE6, 0xAE, 0xB3, 0x43,\n\t0xE6, 0xAE, 0xBA, 0x43, 0xE6, 0xAE, 0xBB, 0x43,\n\t// Bytes dc0 - dff\n\t0xE6, 0xAF, 0x8B, 0x43, 0xE6, 0xAF, 0x8D, 0x43,\n\t0xE6, 0xAF, 0x94, 0x43, 0xE6, 0xAF, 0x9B, 0x43,\n\t0xE6, 0xB0, 0x8F, 0x43, 0xE6, 0xB0, 0x94, 0x43,\n\t0xE6, 0xB0, 0xB4, 0x43, 0xE6, 0xB1, 0x8E, 0x43,\n\t0xE6, 0xB1, 0xA7, 0x43, 0xE6, 0xB2, 0x88, 0x43,\n\t0xE6, 0xB2, 0xBF, 0x43, 0xE6, 0xB3, 0x8C, 0x43,\n\t0xE6, 0xB3, 0x8D, 0x43, 0xE6, 0xB3, 0xA5, 0x43,\n\t0xE6, 0xB3, 0xA8, 0x43, 0xE6, 0xB4, 0x96, 0x43,\n\t// Bytes e00 - e3f\n\t0xE6, 0xB4, 0x9B, 0x43, 0xE6, 0xB4, 0x9E, 0x43,\n\t0xE6, 0xB4, 0xB4, 0x43, 0xE6, 0xB4, 0xBE, 0x43,\n\t0xE6, 0xB5, 0x81, 0x43, 0xE6, 0xB5, 0xA9, 0x43,\n\t0xE6, 0xB5, 0xAA, 0x43, 0xE6, 0xB5, 0xB7, 0x43,\n\t0xE6, 0xB5, 0xB8, 0x43, 0xE6, 0xB6, 0x85, 0x43,\n\t0xE6, 0xB7, 0x8B, 0x43, 0xE6, 0xB7, 0x9A, 0x43,\n\t0xE6, 0xB7, 0xAA, 0x43, 0xE6, 0xB7, 0xB9, 0x43,\n\t0xE6, 0xB8, 0x9A, 0x43, 0xE6, 0xB8, 0xAF, 0x43,\n\t// Bytes e40 - e7f\n\t0xE6, 0xB9, 0xAE, 0x43, 0xE6, 0xBA, 0x80, 0x43,\n\t0xE6, 0xBA, 0x9C, 0x43, 0xE6, 0xBA, 0xBA, 0x43,\n\t0xE6, 0xBB, 0x87, 0x43, 0xE6, 0xBB, 0x8B, 0x43,\n\t0xE6, 0xBB, 0x91, 0x43, 0xE6, 0xBB, 0x9B, 0x43,\n\t0xE6, 0xBC, 0x8F, 0x43, 0xE6, 0xBC, 0x94, 0x43,\n\t0xE6, 0xBC, 0xA2, 0x43, 0xE6, 0xBC, 0xA3, 0x43,\n\t0xE6, 0xBD, 0xAE, 0x43, 0xE6, 0xBF, 0x86, 0x43,\n\t0xE6, 0xBF, 0xAB, 0x43, 0xE6, 0xBF, 0xBE, 0x43,\n\t// Bytes e80 - ebf\n\t0xE7, 0x80, 0x9B, 0x43, 0xE7, 0x80, 0x9E, 0x43,\n\t0xE7, 0x80, 0xB9, 0x43, 0xE7, 0x81, 0x8A, 0x43,\n\t0xE7, 0x81, 0xAB, 0x43, 0xE7, 0x81, 0xB0, 0x43,\n\t0xE7, 0x81, 0xB7, 0x43, 0xE7, 0x81, 0xBD, 0x43,\n\t0xE7, 0x82, 0x99, 0x43, 0xE7, 0x82, 0xAD, 0x43,\n\t0xE7, 0x83, 0x88, 0x43, 0xE7, 0x83, 0x99, 0x43,\n\t0xE7, 0x84, 0xA1, 0x43, 0xE7, 0x85, 0x85, 0x43,\n\t0xE7, 0x85, 0x89, 0x43, 0xE7, 0x85, 0xAE, 0x43,\n\t// Bytes ec0 - eff\n\t0xE7, 0x86, 0x9C, 0x43, 0xE7, 0x87, 0x8E, 0x43,\n\t0xE7, 0x87, 0x90, 0x43, 0xE7, 0x88, 0x90, 0x43,\n\t0xE7, 0x88, 0x9B, 0x43, 0xE7, 0x88, 0xA8, 0x43,\n\t0xE7, 0x88, 0xAA, 0x43, 0xE7, 0x88, 0xAB, 0x43,\n\t0xE7, 0x88, 0xB5, 0x43, 0xE7, 0x88, 0xB6, 0x43,\n\t0xE7, 0x88, 0xBB, 0x43, 0xE7, 0x88, 0xBF, 0x43,\n\t0xE7, 0x89, 0x87, 0x43, 0xE7, 0x89, 0x90, 0x43,\n\t0xE7, 0x89, 0x99, 0x43, 0xE7, 0x89, 0x9B, 0x43,\n\t// Bytes f00 - f3f\n\t0xE7, 0x89, 0xA2, 0x43, 0xE7, 0x89, 0xB9, 0x43,\n\t0xE7, 0x8A, 0x80, 0x43, 0xE7, 0x8A, 0x95, 0x43,\n\t0xE7, 0x8A, 0xAC, 0x43, 0xE7, 0x8A, 0xAF, 0x43,\n\t0xE7, 0x8B, 0x80, 0x43, 0xE7, 0x8B, 0xBC, 0x43,\n\t0xE7, 0x8C, 0xAA, 0x43, 0xE7, 0x8D, 0xB5, 0x43,\n\t0xE7, 0x8D, 0xBA, 0x43, 0xE7, 0x8E, 0x84, 0x43,\n\t0xE7, 0x8E, 0x87, 0x43, 0xE7, 0x8E, 0x89, 0x43,\n\t0xE7, 0x8E, 0x8B, 0x43, 0xE7, 0x8E, 0xA5, 0x43,\n\t// Bytes f40 - f7f\n\t0xE7, 0x8E, 0xB2, 0x43, 0xE7, 0x8F, 0x9E, 0x43,\n\t0xE7, 0x90, 0x86, 0x43, 0xE7, 0x90, 0x89, 0x43,\n\t0xE7, 0x90, 0xA2, 0x43, 0xE7, 0x91, 0x87, 0x43,\n\t0xE7, 0x91, 0x9C, 0x43, 0xE7, 0x91, 0xA9, 0x43,\n\t0xE7, 0x91, 0xB1, 0x43, 0xE7, 0x92, 0x85, 0x43,\n\t0xE7, 0x92, 0x89, 0x43, 0xE7, 0x92, 0x98, 0x43,\n\t0xE7, 0x93, 0x8A, 0x43, 0xE7, 0x93, 0x9C, 0x43,\n\t0xE7, 0x93, 0xA6, 0x43, 0xE7, 0x94, 0x86, 0x43,\n\t// Bytes f80 - fbf\n\t0xE7, 0x94, 0x98, 0x43, 0xE7, 0x94, 0x9F, 0x43,\n\t0xE7, 0x94, 0xA4, 0x43, 0xE7, 0x94, 0xA8, 0x43,\n\t0xE7, 0x94, 0xB0, 0x43, 0xE7, 0x94, 0xB2, 0x43,\n\t0xE7, 0x94, 0xB3, 0x43, 0xE7, 0x94, 0xB7, 0x43,\n\t0xE7, 0x94, 0xBB, 0x43, 0xE7, 0x94, 0xBE, 0x43,\n\t0xE7, 0x95, 0x99, 0x43, 0xE7, 0x95, 0xA5, 0x43,\n\t0xE7, 0x95, 0xB0, 0x43, 0xE7, 0x96, 0x8B, 0x43,\n\t0xE7, 0x96, 0x92, 0x43, 0xE7, 0x97, 0xA2, 0x43,\n\t// Bytes fc0 - fff\n\t0xE7, 0x98, 0x90, 0x43, 0xE7, 0x98, 0x9D, 0x43,\n\t0xE7, 0x98, 0x9F, 0x43, 0xE7, 0x99, 0x82, 0x43,\n\t0xE7, 0x99, 0xA9, 0x43, 0xE7, 0x99, 0xB6, 0x43,\n\t0xE7, 0x99, 0xBD, 0x43, 0xE7, 0x9A, 0xAE, 0x43,\n\t0xE7, 0x9A, 0xBF, 0x43, 0xE7, 0x9B, 0x8A, 0x43,\n\t0xE7, 0x9B, 0x9B, 0x43, 0xE7, 0x9B, 0xA3, 0x43,\n\t0xE7, 0x9B, 0xA7, 0x43, 0xE7, 0x9B, 0xAE, 0x43,\n\t0xE7, 0x9B, 0xB4, 0x43, 0xE7, 0x9C, 0x81, 0x43,\n\t// Bytes 1000 - 103f\n\t0xE7, 0x9C, 0x9E, 0x43, 0xE7, 0x9C, 0x9F, 0x43,\n\t0xE7, 0x9D, 0x80, 0x43, 0xE7, 0x9D, 0x8A, 0x43,\n\t0xE7, 0x9E, 0x8B, 0x43, 0xE7, 0x9E, 0xA7, 0x43,\n\t0xE7, 0x9F, 0x9B, 0x43, 0xE7, 0x9F, 0xA2, 0x43,\n\t0xE7, 0x9F, 0xB3, 0x43, 0xE7, 0xA1, 0x8E, 0x43,\n\t0xE7, 0xA1, 0xAB, 0x43, 0xE7, 0xA2, 0x8C, 0x43,\n\t0xE7, 0xA2, 0x91, 0x43, 0xE7, 0xA3, 0x8A, 0x43,\n\t0xE7, 0xA3, 0x8C, 0x43, 0xE7, 0xA3, 0xBB, 0x43,\n\t// Bytes 1040 - 107f\n\t0xE7, 0xA4, 0xAA, 0x43, 0xE7, 0xA4, 0xBA, 0x43,\n\t0xE7, 0xA4, 0xBC, 0x43, 0xE7, 0xA4, 0xBE, 0x43,\n\t0xE7, 0xA5, 0x88, 0x43, 0xE7, 0xA5, 0x89, 0x43,\n\t0xE7, 0xA5, 0x90, 0x43, 0xE7, 0xA5, 0x96, 0x43,\n\t0xE7, 0xA5, 0x9D, 0x43, 0xE7, 0xA5, 0x9E, 0x43,\n\t0xE7, 0xA5, 0xA5, 0x43, 0xE7, 0xA5, 0xBF, 0x43,\n\t0xE7, 0xA6, 0x81, 0x43, 0xE7, 0xA6, 0x8D, 0x43,\n\t0xE7, 0xA6, 0x8E, 0x43, 0xE7, 0xA6, 0x8F, 0x43,\n\t// Bytes 1080 - 10bf\n\t0xE7, 0xA6, 0xAE, 0x43, 0xE7, 0xA6, 0xB8, 0x43,\n\t0xE7, 0xA6, 0xBE, 0x43, 0xE7, 0xA7, 0x8A, 0x43,\n\t0xE7, 0xA7, 0x98, 0x43, 0xE7, 0xA7, 0xAB, 0x43,\n\t0xE7, 0xA8, 0x9C, 0x43, 0xE7, 0xA9, 0x80, 0x43,\n\t0xE7, 0xA9, 0x8A, 0x43, 0xE7, 0xA9, 0x8F, 0x43,\n\t0xE7, 0xA9, 0xB4, 0x43, 0xE7, 0xA9, 0xBA, 0x43,\n\t0xE7, 0xAA, 0x81, 0x43, 0xE7, 0xAA, 0xB1, 0x43,\n\t0xE7, 0xAB, 0x8B, 0x43, 0xE7, 0xAB, 0xAE, 0x43,\n\t// Bytes 10c0 - 10ff\n\t0xE7, 0xAB, 0xB9, 0x43, 0xE7, 0xAC, 0xA0, 0x43,\n\t0xE7, 0xAE, 0x8F, 0x43, 0xE7, 0xAF, 0x80, 0x43,\n\t0xE7, 0xAF, 0x86, 0x43, 0xE7, 0xAF, 0x89, 0x43,\n\t0xE7, 0xB0, 0xBE, 0x43, 0xE7, 0xB1, 0xA0, 0x43,\n\t0xE7, 0xB1, 0xB3, 0x43, 0xE7, 0xB1, 0xBB, 0x43,\n\t0xE7, 0xB2, 0x92, 0x43, 0xE7, 0xB2, 0xBE, 0x43,\n\t0xE7, 0xB3, 0x92, 0x43, 0xE7, 0xB3, 0x96, 0x43,\n\t0xE7, 0xB3, 0xA3, 0x43, 0xE7, 0xB3, 0xA7, 0x43,\n\t// Bytes 1100 - 113f\n\t0xE7, 0xB3, 0xA8, 0x43, 0xE7, 0xB3, 0xB8, 0x43,\n\t0xE7, 0xB4, 0x80, 0x43, 0xE7, 0xB4, 0x90, 0x43,\n\t0xE7, 0xB4, 0xA2, 0x43, 0xE7, 0xB4, 0xAF, 0x43,\n\t0xE7, 0xB5, 0x82, 0x43, 0xE7, 0xB5, 0x9B, 0x43,\n\t0xE7, 0xB5, 0xA3, 0x43, 0xE7, 0xB6, 0xA0, 0x43,\n\t0xE7, 0xB6, 0xBE, 0x43, 0xE7, 0xB7, 0x87, 0x43,\n\t0xE7, 0xB7, 0xB4, 0x43, 0xE7, 0xB8, 0x82, 0x43,\n\t0xE7, 0xB8, 0x89, 0x43, 0xE7, 0xB8, 0xB7, 0x43,\n\t// Bytes 1140 - 117f\n\t0xE7, 0xB9, 0x81, 0x43, 0xE7, 0xB9, 0x85, 0x43,\n\t0xE7, 0xBC, 0xB6, 0x43, 0xE7, 0xBC, 0xBE, 0x43,\n\t0xE7, 0xBD, 0x91, 0x43, 0xE7, 0xBD, 0xB2, 0x43,\n\t0xE7, 0xBD, 0xB9, 0x43, 0xE7, 0xBD, 0xBA, 0x43,\n\t0xE7, 0xBE, 0x85, 0x43, 0xE7, 0xBE, 0x8A, 0x43,\n\t0xE7, 0xBE, 0x95, 0x43, 0xE7, 0xBE, 0x9A, 0x43,\n\t0xE7, 0xBE, 0xBD, 0x43, 0xE7, 0xBF, 0xBA, 0x43,\n\t0xE8, 0x80, 0x81, 0x43, 0xE8, 0x80, 0x85, 0x43,\n\t// Bytes 1180 - 11bf\n\t0xE8, 0x80, 0x8C, 0x43, 0xE8, 0x80, 0x92, 0x43,\n\t0xE8, 0x80, 0xB3, 0x43, 0xE8, 0x81, 0x86, 0x43,\n\t0xE8, 0x81, 0xA0, 0x43, 0xE8, 0x81, 0xAF, 0x43,\n\t0xE8, 0x81, 0xB0, 0x43, 0xE8, 0x81, 0xBE, 0x43,\n\t0xE8, 0x81, 0xBF, 0x43, 0xE8, 0x82, 0x89, 0x43,\n\t0xE8, 0x82, 0x8B, 0x43, 0xE8, 0x82, 0xAD, 0x43,\n\t0xE8, 0x82, 0xB2, 0x43, 0xE8, 0x84, 0x83, 0x43,\n\t0xE8, 0x84, 0xBE, 0x43, 0xE8, 0x87, 0x98, 0x43,\n\t// Bytes 11c0 - 11ff\n\t0xE8, 0x87, 0xA3, 0x43, 0xE8, 0x87, 0xA8, 0x43,\n\t0xE8, 0x87, 0xAA, 0x43, 0xE8, 0x87, 0xAD, 0x43,\n\t0xE8, 0x87, 0xB3, 0x43, 0xE8, 0x87, 0xBC, 0x43,\n\t0xE8, 0x88, 0x81, 0x43, 0xE8, 0x88, 0x84, 0x43,\n\t0xE8, 0x88, 0x8C, 0x43, 0xE8, 0x88, 0x98, 0x43,\n\t0xE8, 0x88, 0x9B, 0x43, 0xE8, 0x88, 0x9F, 0x43,\n\t0xE8, 0x89, 0xAE, 0x43, 0xE8, 0x89, 0xAF, 0x43,\n\t0xE8, 0x89, 0xB2, 0x43, 0xE8, 0x89, 0xB8, 0x43,\n\t// Bytes 1200 - 123f\n\t0xE8, 0x89, 0xB9, 0x43, 0xE8, 0x8A, 0x8B, 0x43,\n\t0xE8, 0x8A, 0x91, 0x43, 0xE8, 0x8A, 0x9D, 0x43,\n\t0xE8, 0x8A, 0xB1, 0x43, 0xE8, 0x8A, 0xB3, 0x43,\n\t0xE8, 0x8A, 0xBD, 0x43, 0xE8, 0x8B, 0xA5, 0x43,\n\t0xE8, 0x8B, 0xA6, 0x43, 0xE8, 0x8C, 0x9D, 0x43,\n\t0xE8, 0x8C, 0xA3, 0x43, 0xE8, 0x8C, 0xB6, 0x43,\n\t0xE8, 0x8D, 0x92, 0x43, 0xE8, 0x8D, 0x93, 0x43,\n\t0xE8, 0x8D, 0xA3, 0x43, 0xE8, 0x8E, 0xAD, 0x43,\n\t// Bytes 1240 - 127f\n\t0xE8, 0x8E, 0xBD, 0x43, 0xE8, 0x8F, 0x89, 0x43,\n\t0xE8, 0x8F, 0x8A, 0x43, 0xE8, 0x8F, 0x8C, 0x43,\n\t0xE8, 0x8F, 0x9C, 0x43, 0xE8, 0x8F, 0xA7, 0x43,\n\t0xE8, 0x8F, 0xAF, 0x43, 0xE8, 0x8F, 0xB1, 0x43,\n\t0xE8, 0x90, 0xBD, 0x43, 0xE8, 0x91, 0x89, 0x43,\n\t0xE8, 0x91, 0x97, 0x43, 0xE8, 0x93, 0xAE, 0x43,\n\t0xE8, 0x93, 0xB1, 0x43, 0xE8, 0x93, 0xB3, 0x43,\n\t0xE8, 0x93, 0xBC, 0x43, 0xE8, 0x94, 0x96, 0x43,\n\t// Bytes 1280 - 12bf\n\t0xE8, 0x95, 0xA4, 0x43, 0xE8, 0x97, 0x8D, 0x43,\n\t0xE8, 0x97, 0xBA, 0x43, 0xE8, 0x98, 0x86, 0x43,\n\t0xE8, 0x98, 0x92, 0x43, 0xE8, 0x98, 0xAD, 0x43,\n\t0xE8, 0x98, 0xBF, 0x43, 0xE8, 0x99, 0x8D, 0x43,\n\t0xE8, 0x99, 0x90, 0x43, 0xE8, 0x99, 0x9C, 0x43,\n\t0xE8, 0x99, 0xA7, 0x43, 0xE8, 0x99, 0xA9, 0x43,\n\t0xE8, 0x99, 0xAB, 0x43, 0xE8, 0x9A, 0x88, 0x43,\n\t0xE8, 0x9A, 0xA9, 0x43, 0xE8, 0x9B, 0xA2, 0x43,\n\t// Bytes 12c0 - 12ff\n\t0xE8, 0x9C, 0x8E, 0x43, 0xE8, 0x9C, 0xA8, 0x43,\n\t0xE8, 0x9D, 0xAB, 0x43, 0xE8, 0x9D, 0xB9, 0x43,\n\t0xE8, 0x9E, 0x86, 0x43, 0xE8, 0x9E, 0xBA, 0x43,\n\t0xE8, 0x9F, 0xA1, 0x43, 0xE8, 0xA0, 0x81, 0x43,\n\t0xE8, 0xA0, 0x9F, 0x43, 0xE8, 0xA1, 0x80, 0x43,\n\t0xE8, 0xA1, 0x8C, 0x43, 0xE8, 0xA1, 0xA0, 0x43,\n\t0xE8, 0xA1, 0xA3, 0x43, 0xE8, 0xA3, 0x82, 0x43,\n\t0xE8, 0xA3, 0x8F, 0x43, 0xE8, 0xA3, 0x97, 0x43,\n\t// Bytes 1300 - 133f\n\t0xE8, 0xA3, 0x9E, 0x43, 0xE8, 0xA3, 0xA1, 0x43,\n\t0xE8, 0xA3, 0xB8, 0x43, 0xE8, 0xA3, 0xBA, 0x43,\n\t0xE8, 0xA4, 0x90, 0x43, 0xE8, 0xA5, 0x81, 0x43,\n\t0xE8, 0xA5, 0xA4, 0x43, 0xE8, 0xA5, 0xBE, 0x43,\n\t0xE8, 0xA6, 0x86, 0x43, 0xE8, 0xA6, 0x8B, 0x43,\n\t0xE8, 0xA6, 0x96, 0x43, 0xE8, 0xA7, 0x92, 0x43,\n\t0xE8, 0xA7, 0xA3, 0x43, 0xE8, 0xA8, 0x80, 0x43,\n\t0xE8, 0xAA, 0xA0, 0x43, 0xE8, 0xAA, 0xAA, 0x43,\n\t// Bytes 1340 - 137f\n\t0xE8, 0xAA, 0xBF, 0x43, 0xE8, 0xAB, 0x8B, 0x43,\n\t0xE8, 0xAB, 0x92, 0x43, 0xE8, 0xAB, 0x96, 0x43,\n\t0xE8, 0xAB, 0xAD, 0x43, 0xE8, 0xAB, 0xB8, 0x43,\n\t0xE8, 0xAB, 0xBE, 0x43, 0xE8, 0xAC, 0x81, 0x43,\n\t0xE8, 0xAC, 0xB9, 0x43, 0xE8, 0xAD, 0x98, 0x43,\n\t0xE8, 0xAE, 0x80, 0x43, 0xE8, 0xAE, 0x8A, 0x43,\n\t0xE8, 0xB0, 0xB7, 0x43, 0xE8, 0xB1, 0x86, 0x43,\n\t0xE8, 0xB1, 0x88, 0x43, 0xE8, 0xB1, 0x95, 0x43,\n\t// Bytes 1380 - 13bf\n\t0xE8, 0xB1, 0xB8, 0x43, 0xE8, 0xB2, 0x9D, 0x43,\n\t0xE8, 0xB2, 0xA1, 0x43, 0xE8, 0xB2, 0xA9, 0x43,\n\t0xE8, 0xB2, 0xAB, 0x43, 0xE8, 0xB3, 0x81, 0x43,\n\t0xE8, 0xB3, 0x82, 0x43, 0xE8, 0xB3, 0x87, 0x43,\n\t0xE8, 0xB3, 0x88, 0x43, 0xE8, 0xB3, 0x93, 0x43,\n\t0xE8, 0xB4, 0x88, 0x43, 0xE8, 0xB4, 0x9B, 0x43,\n\t0xE8, 0xB5, 0xA4, 0x43, 0xE8, 0xB5, 0xB0, 0x43,\n\t0xE8, 0xB5, 0xB7, 0x43, 0xE8, 0xB6, 0xB3, 0x43,\n\t// Bytes 13c0 - 13ff\n\t0xE8, 0xB6, 0xBC, 0x43, 0xE8, 0xB7, 0x8B, 0x43,\n\t0xE8, 0xB7, 0xAF, 0x43, 0xE8, 0xB7, 0xB0, 0x43,\n\t0xE8, 0xBA, 0xAB, 0x43, 0xE8, 0xBB, 0x8A, 0x43,\n\t0xE8, 0xBB, 0x94, 0x43, 0xE8, 0xBC, 0xA6, 0x43,\n\t0xE8, 0xBC, 0xAA, 0x43, 0xE8, 0xBC, 0xB8, 0x43,\n\t0xE8, 0xBC, 0xBB, 0x43, 0xE8, 0xBD, 0xA2, 0x43,\n\t0xE8, 0xBE, 0x9B, 0x43, 0xE8, 0xBE, 0x9E, 0x43,\n\t0xE8, 0xBE, 0xB0, 0x43, 0xE8, 0xBE, 0xB5, 0x43,\n\t// Bytes 1400 - 143f\n\t0xE8, 0xBE, 0xB6, 0x43, 0xE9, 0x80, 0xA3, 0x43,\n\t0xE9, 0x80, 0xB8, 0x43, 0xE9, 0x81, 0x8A, 0x43,\n\t0xE9, 0x81, 0xA9, 0x43, 0xE9, 0x81, 0xB2, 0x43,\n\t0xE9, 0x81, 0xBC, 0x43, 0xE9, 0x82, 0x8F, 0x43,\n\t0xE9, 0x82, 0x91, 0x43, 0xE9, 0x82, 0x94, 0x43,\n\t0xE9, 0x83, 0x8E, 0x43, 0xE9, 0x83, 0x9E, 0x43,\n\t0xE9, 0x83, 0xB1, 0x43, 0xE9, 0x83, 0xBD, 0x43,\n\t0xE9, 0x84, 0x91, 0x43, 0xE9, 0x84, 0x9B, 0x43,\n\t// Bytes 1440 - 147f\n\t0xE9, 0x85, 0x89, 0x43, 0xE9, 0x85, 0x8D, 0x43,\n\t0xE9, 0x85, 0xAA, 0x43, 0xE9, 0x86, 0x99, 0x43,\n\t0xE9, 0x86, 0xB4, 0x43, 0xE9, 0x87, 0x86, 0x43,\n\t0xE9, 0x87, 0x8C, 0x43, 0xE9, 0x87, 0x8F, 0x43,\n\t0xE9, 0x87, 0x91, 0x43, 0xE9, 0x88, 0xB4, 0x43,\n\t0xE9, 0x88, 0xB8, 0x43, 0xE9, 0x89, 0xB6, 0x43,\n\t0xE9, 0x89, 0xBC, 0x43, 0xE9, 0x8B, 0x97, 0x43,\n\t0xE9, 0x8B, 0x98, 0x43, 0xE9, 0x8C, 0x84, 0x43,\n\t// Bytes 1480 - 14bf\n\t0xE9, 0x8D, 0x8A, 0x43, 0xE9, 0x8F, 0xB9, 0x43,\n\t0xE9, 0x90, 0x95, 0x43, 0xE9, 0x95, 0xB7, 0x43,\n\t0xE9, 0x96, 0x80, 0x43, 0xE9, 0x96, 0x8B, 0x43,\n\t0xE9, 0x96, 0xAD, 0x43, 0xE9, 0x96, 0xB7, 0x43,\n\t0xE9, 0x98, 0x9C, 0x43, 0xE9, 0x98, 0xAE, 0x43,\n\t0xE9, 0x99, 0x8B, 0x43, 0xE9, 0x99, 0x8D, 0x43,\n\t0xE9, 0x99, 0xB5, 0x43, 0xE9, 0x99, 0xB8, 0x43,\n\t0xE9, 0x99, 0xBC, 0x43, 0xE9, 0x9A, 0x86, 0x43,\n\t// Bytes 14c0 - 14ff\n\t0xE9, 0x9A, 0xA3, 0x43, 0xE9, 0x9A, 0xB6, 0x43,\n\t0xE9, 0x9A, 0xB7, 0x43, 0xE9, 0x9A, 0xB8, 0x43,\n\t0xE9, 0x9A, 0xB9, 0x43, 0xE9, 0x9B, 0x83, 0x43,\n\t0xE9, 0x9B, 0xA2, 0x43, 0xE9, 0x9B, 0xA3, 0x43,\n\t0xE9, 0x9B, 0xA8, 0x43, 0xE9, 0x9B, 0xB6, 0x43,\n\t0xE9, 0x9B, 0xB7, 0x43, 0xE9, 0x9C, 0xA3, 0x43,\n\t0xE9, 0x9C, 0xB2, 0x43, 0xE9, 0x9D, 0x88, 0x43,\n\t0xE9, 0x9D, 0x91, 0x43, 0xE9, 0x9D, 0x96, 0x43,\n\t// Bytes 1500 - 153f\n\t0xE9, 0x9D, 0x9E, 0x43, 0xE9, 0x9D, 0xA2, 0x43,\n\t0xE9, 0x9D, 0xA9, 0x43, 0xE9, 0x9F, 0x8B, 0x43,\n\t0xE9, 0x9F, 0x9B, 0x43, 0xE9, 0x9F, 0xA0, 0x43,\n\t0xE9, 0x9F, 0xAD, 0x43, 0xE9, 0x9F, 0xB3, 0x43,\n\t0xE9, 0x9F, 0xBF, 0x43, 0xE9, 0xA0, 0x81, 0x43,\n\t0xE9, 0xA0, 0x85, 0x43, 0xE9, 0xA0, 0x8B, 0x43,\n\t0xE9, 0xA0, 0x98, 0x43, 0xE9, 0xA0, 0xA9, 0x43,\n\t0xE9, 0xA0, 0xBB, 0x43, 0xE9, 0xA1, 0x9E, 0x43,\n\t// Bytes 1540 - 157f\n\t0xE9, 0xA2, 0xA8, 0x43, 0xE9, 0xA3, 0x9B, 0x43,\n\t0xE9, 0xA3, 0x9F, 0x43, 0xE9, 0xA3, 0xA2, 0x43,\n\t0xE9, 0xA3, 0xAF, 0x43, 0xE9, 0xA3, 0xBC, 0x43,\n\t0xE9, 0xA4, 0xA8, 0x43, 0xE9, 0xA4, 0xA9, 0x43,\n\t0xE9, 0xA6, 0x96, 0x43, 0xE9, 0xA6, 0x99, 0x43,\n\t0xE9, 0xA6, 0xA7, 0x43, 0xE9, 0xA6, 0xAC, 0x43,\n\t0xE9, 0xA7, 0x82, 0x43, 0xE9, 0xA7, 0xB1, 0x43,\n\t0xE9, 0xA7, 0xBE, 0x43, 0xE9, 0xA9, 0xAA, 0x43,\n\t// Bytes 1580 - 15bf\n\t0xE9, 0xAA, 0xA8, 0x43, 0xE9, 0xAB, 0x98, 0x43,\n\t0xE9, 0xAB, 0x9F, 0x43, 0xE9, 0xAC, 0x92, 0x43,\n\t0xE9, 0xAC, 0xA5, 0x43, 0xE9, 0xAC, 0xAF, 0x43,\n\t0xE9, 0xAC, 0xB2, 0x43, 0xE9, 0xAC, 0xBC, 0x43,\n\t0xE9, 0xAD, 0x9A, 0x43, 0xE9, 0xAD, 0xAF, 0x43,\n\t0xE9, 0xB1, 0x80, 0x43, 0xE9, 0xB1, 0x97, 0x43,\n\t0xE9, 0xB3, 0xA5, 0x43, 0xE9, 0xB3, 0xBD, 0x43,\n\t0xE9, 0xB5, 0xA7, 0x43, 0xE9, 0xB6, 0xB4, 0x43,\n\t// Bytes 15c0 - 15ff\n\t0xE9, 0xB7, 0xBA, 0x43, 0xE9, 0xB8, 0x9E, 0x43,\n\t0xE9, 0xB9, 0xB5, 0x43, 0xE9, 0xB9, 0xBF, 0x43,\n\t0xE9, 0xBA, 0x97, 0x43, 0xE9, 0xBA, 0x9F, 0x43,\n\t0xE9, 0xBA, 0xA5, 0x43, 0xE9, 0xBA, 0xBB, 0x43,\n\t0xE9, 0xBB, 0x83, 0x43, 0xE9, 0xBB, 0x8D, 0x43,\n\t0xE9, 0xBB, 0x8E, 0x43, 0xE9, 0xBB, 0x91, 0x43,\n\t0xE9, 0xBB, 0xB9, 0x43, 0xE9, 0xBB, 0xBD, 0x43,\n\t0xE9, 0xBB, 0xBE, 0x43, 0xE9, 0xBC, 0x85, 0x43,\n\t// Bytes 1600 - 163f\n\t0xE9, 0xBC, 0x8E, 0x43, 0xE9, 0xBC, 0x8F, 0x43,\n\t0xE9, 0xBC, 0x93, 0x43, 0xE9, 0xBC, 0x96, 0x43,\n\t0xE9, 0xBC, 0xA0, 0x43, 0xE9, 0xBC, 0xBB, 0x43,\n\t0xE9, 0xBD, 0x83, 0x43, 0xE9, 0xBD, 0x8A, 0x43,\n\t0xE9, 0xBD, 0x92, 0x43, 0xE9, 0xBE, 0x8D, 0x43,\n\t0xE9, 0xBE, 0x8E, 0x43, 0xE9, 0xBE, 0x9C, 0x43,\n\t0xE9, 0xBE, 0x9F, 0x43, 0xE9, 0xBE, 0xA0, 0x43,\n\t0xEA, 0x9C, 0xA7, 0x43, 0xEA, 0x9D, 0xAF, 0x43,\n\t// Bytes 1640 - 167f\n\t0xEA, 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x44,\n\t0xF0, 0xA0, 0x84, 0xA2, 0x44, 0xF0, 0xA0, 0x94,\n\t0x9C, 0x44, 0xF0, 0xA0, 0x94, 0xA5, 0x44, 0xF0,\n\t0xA0, 0x95, 0x8B, 0x44, 0xF0, 0xA0, 0x98, 0xBA,\n\t0x44, 0xF0, 0xA0, 0xA0, 0x84, 0x44, 0xF0, 0xA0,\n\t0xA3, 0x9E, 0x44, 0xF0, 0xA0, 0xA8, 0xAC, 0x44,\n\t0xF0, 0xA0, 0xAD, 0xA3, 0x44, 0xF0, 0xA1, 0x93,\n\t0xA4, 0x44, 0xF0, 0xA1, 0x9A, 0xA8, 0x44, 0xF0,\n\t// Bytes 1680 - 16bf\n\t0xA1, 0x9B, 0xAA, 0x44, 0xF0, 0xA1, 0xA7, 0x88,\n\t0x44, 0xF0, 0xA1, 0xAC, 0x98, 0x44, 0xF0, 0xA1,\n\t0xB4, 0x8B, 0x44, 0xF0, 0xA1, 0xB7, 0xA4, 0x44,\n\t0xF0, 0xA1, 0xB7, 0xA6, 0x44, 0xF0, 0xA2, 0x86,\n\t0x83, 0x44, 0xF0, 0xA2, 0x86, 0x9F, 0x44, 0xF0,\n\t0xA2, 0x8C, 0xB1, 0x44, 0xF0, 0xA2, 0x9B, 0x94,\n\t0x44, 0xF0, 0xA2, 0xA1, 0x84, 0x44, 0xF0, 0xA2,\n\t0xA1, 0x8A, 0x44, 0xF0, 0xA2, 0xAC, 0x8C, 0x44,\n\t// Bytes 16c0 - 16ff\n\t0xF0, 0xA2, 0xAF, 0xB1, 0x44, 0xF0, 0xA3, 0x80,\n\t0x8A, 0x44, 0xF0, 0xA3, 0x8A, 0xB8, 0x44, 0xF0,\n\t0xA3, 0x8D, 0x9F, 0x44, 0xF0, 0xA3, 0x8E, 0x93,\n\t0x44, 0xF0, 0xA3, 0x8E, 0x9C, 0x44, 0xF0, 0xA3,\n\t0x8F, 0x83, 0x44, 0xF0, 0xA3, 0x8F, 0x95, 0x44,\n\t0xF0, 0xA3, 0x91, 0xAD, 0x44, 0xF0, 0xA3, 0x9A,\n\t0xA3, 0x44, 0xF0, 0xA3, 0xA2, 0xA7, 0x44, 0xF0,\n\t0xA3, 0xAA, 0x8D, 0x44, 0xF0, 0xA3, 0xAB, 0xBA,\n\t// Bytes 1700 - 173f\n\t0x44, 0xF0, 0xA3, 0xB2, 0xBC, 0x44, 0xF0, 0xA3,\n\t0xB4, 0x9E, 0x44, 0xF0, 0xA3, 0xBB, 0x91, 0x44,\n\t0xF0, 0xA3, 0xBD, 0x9E, 0x44, 0xF0, 0xA3, 0xBE,\n\t0x8E, 0x44, 0xF0, 0xA4, 0x89, 0xA3, 0x44, 0xF0,\n\t0xA4, 0x8B, 0xAE, 0x44, 0xF0, 0xA4, 0x8E, 0xAB,\n\t0x44, 0xF0, 0xA4, 0x98, 0x88, 0x44, 0xF0, 0xA4,\n\t0x9C, 0xB5, 0x44, 0xF0, 0xA4, 0xA0, 0x94, 0x44,\n\t0xF0, 0xA4, 0xB0, 0xB6, 0x44, 0xF0, 0xA4, 0xB2,\n\t// Bytes 1740 - 177f\n\t0x92, 0x44, 0xF0, 0xA4, 0xBE, 0xA1, 0x44, 0xF0,\n\t0xA4, 0xBE, 0xB8, 0x44, 0xF0, 0xA5, 0x81, 0x84,\n\t0x44, 0xF0, 0xA5, 0x83, 0xB2, 0x44, 0xF0, 0xA5,\n\t0x83, 0xB3, 0x44, 0xF0, 0xA5, 0x84, 0x99, 0x44,\n\t0xF0, 0xA5, 0x84, 0xB3, 0x44, 0xF0, 0xA5, 0x89,\n\t0x89, 0x44, 0xF0, 0xA5, 0x90, 0x9D, 0x44, 0xF0,\n\t0xA5, 0x98, 0xA6, 0x44, 0xF0, 0xA5, 0x9A, 0x9A,\n\t0x44, 0xF0, 0xA5, 0x9B, 0x85, 0x44, 0xF0, 0xA5,\n\t// Bytes 1780 - 17bf\n\t0xA5, 0xBC, 0x44, 0xF0, 0xA5, 0xAA, 0xA7, 0x44,\n\t0xF0, 0xA5, 0xAE, 0xAB, 0x44, 0xF0, 0xA5, 0xB2,\n\t0x80, 0x44, 0xF0, 0xA5, 0xB3, 0x90, 0x44, 0xF0,\n\t0xA5, 0xBE, 0x86, 0x44, 0xF0, 0xA6, 0x87, 0x9A,\n\t0x44, 0xF0, 0xA6, 0x88, 0xA8, 0x44, 0xF0, 0xA6,\n\t0x89, 0x87, 0x44, 0xF0, 0xA6, 0x8B, 0x99, 0x44,\n\t0xF0, 0xA6, 0x8C, 0xBE, 0x44, 0xF0, 0xA6, 0x93,\n\t0x9A, 0x44, 0xF0, 0xA6, 0x94, 0xA3, 0x44, 0xF0,\n\t// Bytes 17c0 - 17ff\n\t0xA6, 0x96, 0xA8, 0x44, 0xF0, 0xA6, 0x9E, 0xA7,\n\t0x44, 0xF0, 0xA6, 0x9E, 0xB5, 0x44, 0xF0, 0xA6,\n\t0xAC, 0xBC, 0x44, 0xF0, 0xA6, 0xB0, 0xB6, 0x44,\n\t0xF0, 0xA6, 0xB3, 0x95, 0x44, 0xF0, 0xA6, 0xB5,\n\t0xAB, 0x44, 0xF0, 0xA6, 0xBC, 0xAC, 0x44, 0xF0,\n\t0xA6, 0xBE, 0xB1, 0x44, 0xF0, 0xA7, 0x83, 0x92,\n\t0x44, 0xF0, 0xA7, 0x8F, 0x8A, 0x44, 0xF0, 0xA7,\n\t0x99, 0xA7, 0x44, 0xF0, 0xA7, 0xA2, 0xAE, 0x44,\n\t// Bytes 1800 - 183f\n\t0xF0, 0xA7, 0xA5, 0xA6, 0x44, 0xF0, 0xA7, 0xB2,\n\t0xA8, 0x44, 0xF0, 0xA7, 0xBB, 0x93, 0x44, 0xF0,\n\t0xA7, 0xBC, 0xAF, 0x44, 0xF0, 0xA8, 0x97, 0x92,\n\t0x44, 0xF0, 0xA8, 0x97, 0xAD, 0x44, 0xF0, 0xA8,\n\t0x9C, 0xAE, 0x44, 0xF0, 0xA8, 0xAF, 0xBA, 0x44,\n\t0xF0, 0xA8, 0xB5, 0xB7, 0x44, 0xF0, 0xA9, 0x85,\n\t0x85, 0x44, 0xF0, 0xA9, 0x87, 0x9F, 0x44, 0xF0,\n\t0xA9, 0x88, 0x9A, 0x44, 0xF0, 0xA9, 0x90, 0x8A,\n\t// Bytes 1840 - 187f\n\t0x44, 0xF0, 0xA9, 0x92, 0x96, 0x44, 0xF0, 0xA9,\n\t0x96, 0xB6, 0x44, 0xF0, 0xA9, 0xAC, 0xB0, 0x44,\n\t0xF0, 0xAA, 0x83, 0x8E, 0x44, 0xF0, 0xAA, 0x84,\n\t0x85, 0x44, 0xF0, 0xAA, 0x88, 0x8E, 0x44, 0xF0,\n\t0xAA, 0x8A, 0x91, 0x44, 0xF0, 0xAA, 0x8E, 0x92,\n\t0x44, 0xF0, 0xAA, 0x98, 0x80, 0x42, 0x21, 0x21,\n\t0x42, 0x21, 0x3F, 0x42, 0x2E, 0x2E, 0x42, 0x30,\n\t0x2C, 0x42, 0x30, 0x2E, 0x42, 0x31, 0x2C, 0x42,\n\t// Bytes 1880 - 18bf\n\t0x31, 0x2E, 0x42, 0x31, 0x30, 0x42, 0x31, 0x31,\n\t0x42, 0x31, 0x32, 0x42, 0x31, 0x33, 0x42, 0x31,\n\t0x34, 0x42, 0x31, 0x35, 0x42, 0x31, 0x36, 0x42,\n\t0x31, 0x37, 0x42, 0x31, 0x38, 0x42, 0x31, 0x39,\n\t0x42, 0x32, 0x2C, 0x42, 0x32, 0x2E, 0x42, 0x32,\n\t0x30, 0x42, 0x32, 0x31, 0x42, 0x32, 0x32, 0x42,\n\t0x32, 0x33, 0x42, 0x32, 0x34, 0x42, 0x32, 0x35,\n\t0x42, 0x32, 0x36, 0x42, 0x32, 0x37, 0x42, 0x32,\n\t// Bytes 18c0 - 18ff\n\t0x38, 0x42, 0x32, 0x39, 0x42, 0x33, 0x2C, 0x42,\n\t0x33, 0x2E, 0x42, 0x33, 0x30, 0x42, 0x33, 0x31,\n\t0x42, 0x33, 0x32, 0x42, 0x33, 0x33, 0x42, 0x33,\n\t0x34, 0x42, 0x33, 0x35, 0x42, 0x33, 0x36, 0x42,\n\t0x33, 0x37, 0x42, 0x33, 0x38, 0x42, 0x33, 0x39,\n\t0x42, 0x34, 0x2C, 0x42, 0x34, 0x2E, 0x42, 0x34,\n\t0x30, 0x42, 0x34, 0x31, 0x42, 0x34, 0x32, 0x42,\n\t0x34, 0x33, 0x42, 0x34, 0x34, 0x42, 0x34, 0x35,\n\t// Bytes 1900 - 193f\n\t0x42, 0x34, 0x36, 0x42, 0x34, 0x37, 0x42, 0x34,\n\t0x38, 0x42, 0x34, 0x39, 0x42, 0x35, 0x2C, 0x42,\n\t0x35, 0x2E, 0x42, 0x35, 0x30, 0x42, 0x36, 0x2C,\n\t0x42, 0x36, 0x2E, 0x42, 0x37, 0x2C, 0x42, 0x37,\n\t0x2E, 0x42, 0x38, 0x2C, 0x42, 0x38, 0x2E, 0x42,\n\t0x39, 0x2C, 0x42, 0x39, 0x2E, 0x42, 0x3D, 0x3D,\n\t0x42, 0x3F, 0x21, 0x42, 0x3F, 0x3F, 0x42, 0x41,\n\t0x55, 0x42, 0x42, 0x71, 0x42, 0x43, 0x44, 0x42,\n\t// Bytes 1940 - 197f\n\t0x44, 0x4A, 0x42, 0x44, 0x5A, 0x42, 0x44, 0x7A,\n\t0x42, 0x47, 0x42, 0x42, 0x47, 0x79, 0x42, 0x48,\n\t0x50, 0x42, 0x48, 0x56, 0x42, 0x48, 0x67, 0x42,\n\t0x48, 0x7A, 0x42, 0x49, 0x49, 0x42, 0x49, 0x4A,\n\t0x42, 0x49, 0x55, 0x42, 0x49, 0x56, 0x42, 0x49,\n\t0x58, 0x42, 0x4B, 0x42, 0x42, 0x4B, 0x4B, 0x42,\n\t0x4B, 0x4D, 0x42, 0x4C, 0x4A, 0x42, 0x4C, 0x6A,\n\t0x42, 0x4D, 0x42, 0x42, 0x4D, 0x43, 0x42, 0x4D,\n\t// Bytes 1980 - 19bf\n\t0x44, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42,\n\t0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F,\n\t0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50,\n\t0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42,\n\t0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76,\n\t0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57,\n\t0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42,\n\t0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64,\n\t// Bytes 19c0 - 19ff\n\t0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64,\n\t0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42,\n\t0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66,\n\t0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66,\n\t0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42,\n\t0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76,\n\t0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B,\n\t0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42,\n\t// Bytes 1a00 - 1a3f\n\t0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74,\n\t0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C,\n\t0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42,\n\t0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56,\n\t0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D,\n\t0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42,\n\t0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46,\n\t0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E,\n\t// Bytes 1a40 - 1a7f\n\t0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42,\n\t0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46,\n\t0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70,\n\t0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42,\n\t0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69,\n\t0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29,\n\t0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29,\n\t0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29,\n\t// Bytes 1a80 - 1abf\n\t0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29,\n\t0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29,\n\t0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29,\n\t0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29,\n\t0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29,\n\t0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29,\n\t0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29,\n\t0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29,\n\t// Bytes 1ac0 - 1aff\n\t0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29,\n\t0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29,\n\t0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29,\n\t0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29,\n\t0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29,\n\t0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29,\n\t0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29,\n\t0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29,\n\t// Bytes 1b00 - 1b3f\n\t0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29,\n\t0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29,\n\t0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29,\n\t0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29,\n\t0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29,\n\t0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29,\n\t0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29,\n\t0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29,\n\t// Bytes 1b40 - 1b7f\n\t0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29,\n\t0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29,\n\t0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29,\n\t0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E,\n\t0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E,\n\t0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E,\n\t0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E,\n\t0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E,\n\t// Bytes 1b80 - 1bbf\n\t0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E,\n\t0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D,\n\t0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E,\n\t0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A,\n\t0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49,\n\t0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7,\n\t0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61,\n\t0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D,\n\t// Bytes 1bc0 - 1bff\n\t0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45,\n\t0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A,\n\t0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49,\n\t0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73,\n\t0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72,\n\t0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75,\n\t0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32,\n\t0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32,\n\t// Bytes 1c00 - 1c3f\n\t0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67,\n\t0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C,\n\t0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61,\n\t0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A,\n\t0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32,\n\t0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9,\n\t0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7,\n\t0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32,\n\t// Bytes 1c40 - 1c7f\n\t0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C,\n\t0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69,\n\t0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43,\n\t0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E,\n\t0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46,\n\t0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57,\n\t0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C,\n\t0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73,\n\t// Bytes 1c80 - 1cbf\n\t0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31,\n\t0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44,\n\t0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34,\n\t0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28,\n\t0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29,\n\t0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31,\n\t0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44,\n\t0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81,\n\t// Bytes 1cc0 - 1cff\n\t0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31,\n\t0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9,\n\t0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6,\n\t0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44,\n\t0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C,\n\t0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34,\n\t0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88,\n\t0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6,\n\t// Bytes 1d00 - 1d3f\n\t0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44,\n\t0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97,\n\t0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36,\n\t0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5,\n\t0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7,\n\t0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44,\n\t0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82,\n\t0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39,\n\t// Bytes 1d40 - 1d7f\n\t0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9,\n\t0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E,\n\t0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44,\n\t0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69,\n\t0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5,\n\t0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB,\n\t0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4,\n\t0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44,\n\t// Bytes 1d80 - 1dbf\n\t0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9,\n\t0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8,\n\t0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE,\n\t0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8,\n\t0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44,\n\t0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9,\n\t0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8,\n\t0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC,\n\t// Bytes 1dc0 - 1dff\n\t0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA,\n\t0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44,\n\t0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9,\n\t0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8,\n\t0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89,\n\t0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB,\n\t0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44,\n\t0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9,\n\t// Bytes 1e00 - 1e3f\n\t0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8,\n\t0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89,\n\t0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC,\n\t0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44,\n\t0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9,\n\t0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8,\n\t0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89,\n\t0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE,\n\t// Bytes 1e40 - 1e7f\n\t0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44,\n\t0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9,\n\t0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8,\n\t0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD,\n\t0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3,\n\t0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44,\n\t0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9,\n\t0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8,\n\t// Bytes 1e80 - 1ebf\n\t0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD,\n\t0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4,\n\t0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44,\n\t0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9,\n\t0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8,\n\t0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE,\n\t0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5,\n\t0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44,\n\t// Bytes 1ec0 - 1eff\n\t0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8,\n\t0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8,\n\t0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1,\n\t0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6,\n\t0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44,\n\t0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9,\n\t0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8,\n\t0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85,\n\t// Bytes 1f00 - 1f3f\n\t0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9,\n\t0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44,\n\t0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8,\n\t0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8,\n\t0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A,\n\t0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81,\n\t0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44,\n\t0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9,\n\t// Bytes 1f40 - 1f7f\n\t0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9,\n\t0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85,\n\t0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82,\n\t0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44,\n\t0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8,\n\t0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9,\n\t0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85,\n\t0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83,\n\t// Bytes 1f80 - 1fbf\n\t0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44,\n\t0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8,\n\t0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9,\n\t0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87,\n\t0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84,\n\t0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44,\n\t0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8,\n\t0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9,\n\t// Bytes 1fc0 - 1fff\n\t0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89,\n\t0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86,\n\t0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44,\n\t0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8,\n\t0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9,\n\t0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86,\n\t0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86,\n\t0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44,\n\t// Bytes 2000 - 203f\n\t0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9,\n\t0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9,\n\t0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4,\n\t0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A,\n\t0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44,\n\t0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8,\n\t0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9,\n\t0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87,\n\t// Bytes 2040 - 207f\n\t0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A,\n\t0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44,\n\t0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84,\n\t0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29,\n\t0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28,\n\t0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84,\n\t0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29,\n\t0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28,\n\t// Bytes 2080 - 20bf\n\t0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84,\n\t0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29,\n\t0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28,\n\t0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84,\n\t0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29,\n\t0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28,\n\t0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8,\n\t0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29,\n\t// Bytes 20c0 - 20ff\n\t0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28,\n\t0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB,\n\t0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29,\n\t0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28,\n\t0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85,\n\t0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29,\n\t0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28,\n\t0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90,\n\t// Bytes 2100 - 213f\n\t0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29,\n\t0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28,\n\t0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD,\n\t0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29,\n\t0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28,\n\t0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C,\n\t0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29,\n\t0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28,\n\t// Bytes 2140 - 217f\n\t0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89,\n\t0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29,\n\t0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28,\n\t0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5,\n\t0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29,\n\t0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28,\n\t0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3,\n\t0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29,\n\t// Bytes 2180 - 21bf\n\t0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31,\n\t0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6,\n\t0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7,\n\t0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5,\n\t0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31,\n\t0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6,\n\t// Bytes 21c0 - 21ff\n\t0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6,\n\t0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6,\n\t0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31,\n\t// Bytes 2200 - 223f\n\t0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6,\n\t0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9,\n\t0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31,\n\t0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81,\n\t0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35,\n\t0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31,\n\t0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81,\n\t0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39,\n\t// Bytes 2240 - 227f\n\t0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6,\n\t0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9,\n\t0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6,\n\t0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9,\n\t0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6,\n\t// Bytes 2280 - 22bf\n\t0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5,\n\t0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32,\n\t0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6,\n\t0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33,\n\t0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,\n\t0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6,\n\t0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34,\n\t0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33,\n\t// Bytes 22c0 - 22ff\n\t0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81,\n\t0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36,\n\t0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37,\n\t0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88,\n\t0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D,\n\t0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31,\n\t0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2,\n\t0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88,\n\t// Bytes 2300 - 233f\n\t0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD,\n\t0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9,\n\t0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85,\n\t0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46,\n\t0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,\n\t0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA,\n\t0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8,\n\t0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE,\n\t// Bytes 2340 - 237f\n\t0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9,\n\t0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC,\n\t0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46,\n\t0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8,\n\t0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8,\n\t0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD,\n\t0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8,\n\t// Bytes 2380 - 23bf\n\t0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89,\n\t0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46,\n\t0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8,\n\t0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8,\n\t0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC,\n\t0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8,\n\t0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89,\n\t// Bytes 23c0 - 23ff\n\t0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46,\n\t0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8,\n\t0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3,\n\t0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8,\n\t0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD,\n\t0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9,\n\t0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE,\n\t0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46,\n\t// Bytes 2400 - 243f\n\t0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8,\n\t0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5,\n\t0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9,\n\t0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85,\n\t0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9,\n\t0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A,\n\t0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46,\n\t0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8,\n\t// Bytes 2440 - 247f\n\t0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8,\n\t0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85,\n\t0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9,\n\t0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A,\n\t0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46,\n\t0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8,\n\t0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81,\n\t// Bytes 2480 - 24bf\n\t0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9,\n\t0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84,\n\t0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8,\n\t0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85,\n\t0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46,\n\t0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,\n\t0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84,\n\t0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8,\n\t// Bytes 24c0 - 24ff\n\t0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9,\n\t0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89,\n\t0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46,\n\t0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9,\n\t0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84,\n\t0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8,\n\t0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC,\n\t// Bytes 2500 - 253f\n\t0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9,\n\t0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A,\n\t0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46,\n\t0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9,\n\t0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85,\n\t0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8,\n\t0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9,\n\t// Bytes 2540 - 257f\n\t0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD,\n\t0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46,\n\t0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9,\n\t0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86,\n\t0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8,\n\t0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9,\n\t0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A,\n\t// Bytes 2580 - 25bf\n\t0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46,\n\t0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9,\n\t0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A,\n\t0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9,\n\t0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85,\n\t0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8,\n\t0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC,\n\t0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46,\n\t// Bytes 25c0 - 25ff\n\t0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9,\n\t0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A,\n\t0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9,\n\t0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94,\n\t0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9,\n\t0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88,\n\t0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46,\n\t0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9,\n\t// Bytes 2600 - 263f\n\t0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A,\n\t0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9,\n\t0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94,\n\t0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB,\n\t0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2,\n\t0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46,\n\t0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0,\n\t0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD,\n\t// Bytes 2640 - 267f\n\t0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82,\n\t0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0,\n\t0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE,\n\t0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7,\n\t0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46,\n\t0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0,\n\t0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE,\n\t0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1,\n\t// Bytes 2680 - 26bf\n\t0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0,\n\t0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE,\n\t0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,\n\t0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46,\n\t0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2,\n\t0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81,\n\t0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88,\n\t0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3,\n\t// Bytes 26c0 - 26ff\n\t0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82,\n\t0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88,\n\t0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46,\n\t0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3,\n\t0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83,\n\t0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA,\n\t0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3,\n\t0x83, 0xA0, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD,\n\t// Bytes 2700 - 273f\n\t0xA3, 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90,\n\t0x46, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46,\n\t0xE6, 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72,\n\t0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3,\n\t0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28,\n\t0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48,\n\t0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29,\n\t0x48, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1,\n\t// Bytes 2740 - 277f\n\t0x29, 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85,\n\t0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1,\n\t0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87,\n\t0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,\n\t0x89, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1,\n\t0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28,\n\t0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48,\n\t0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29,\n\t// Bytes 2780 - 27bf\n\t0x48, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1,\n\t0x29, 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85,\n\t0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1,\n\t0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91,\n\t0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84,\n\t0x92, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61,\n\t0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8,\n\t0xA7, 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48,\n\t// Bytes 27c0 - 27ff\n\t0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87,\n\t0x48, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9,\n\t0x84, 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7,\n\t0xD9, 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8,\n\t0xB9, 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84,\n\t0xD9, 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8,\n\t0xAD, 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88,\n\t0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2,\n\t// Bytes 2800 - 283f\n\t0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,\n\t0x49, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2,\n\t0x80, 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88,\n\t0xAB, 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE,\n\t0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3,\n\t0x80, 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95,\n\t0x49, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3,\n\t0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B,\n\t// Bytes 2840 - 287f\n\t0x9D, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,\n\t0xE5, 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3,\n\t0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95,\n\t0x49, 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3,\n\t0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C,\n\t0xAC, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94,\n\t0xE7, 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3,\n\t0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95,\n\t// Bytes 2880 - 28bf\n\t0x49, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6,\n\t0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3,\n\t0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9,\n\t0x49, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1,\n\t// Bytes 28c0 - 28ff\n\t0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3,\n\t0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A,\n\t0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3,\n\t0x83, 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86,\n\t0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3,\n\t0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,\n\t0x49, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3,\n\t// Bytes 2900 - 293f\n\t0x83, 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92,\n\t0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3,\n\t0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3,\n\t0x49, 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3,\n\t0x83, 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82,\n\t0x9A, 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98,\n\t0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3,\n\t// Bytes 2940 - 297f\n\t0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB,\n\t0x49, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E,\n\t0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3,\n\t0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF,\n\t0x49, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82,\n\t// Bytes 2980 - 29bf\n\t0xA2, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF,\n\t0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2,\n\t0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2,\n\t0xE2, 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2,\n\t0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB,\n\t0x4C, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3,\n\t0x83, 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82,\n\t0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3,\n\t// Bytes 29c0 - 29ff\n\t0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C,\n\t0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB,\n\t0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83,\n\t0x88, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD,\n\t0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3,\n\t0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B,\n\t// Bytes 2a00 - 2a3f\n\t0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3,\n\t0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC,\n\t0x4C, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3,\n\t0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82,\n\t0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x83, 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82,\n\t0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C,\n\t0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t// Bytes 2a40 - 2a7f\n\t0xBC, 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F,\n\t0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t0x84, 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,\n\t0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC,\n\t0xE3, 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3,\n\t0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF,\n\t0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3,\n\t// Bytes 2a80 - 2abf\n\t0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83,\n\t0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3,\n\t0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C,\n\t0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82,\n\t0xAF, 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83,\n\t0xB3, 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC,\n\t// Bytes 2ac0 - 2aff\n\t0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3,\n\t0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88,\n\t0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3,\n\t0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,\n\t0x4C, 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4,\n\t0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1,\n\t0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92,\n\t0xE1, 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9,\n\t// Bytes 2b00 - 2b3f\n\t0x84, 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7,\n\t0xD9, 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2,\n\t0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2,\n\t0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82,\n\t0x9A, 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD,\n\t0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83,\n\t0x83, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5,\n\t// Bytes 2b40 - 2b7f\n\t0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F,\n\t0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t0xAC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B,\n\t0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E,\n\t// Bytes 2b80 - 2bbf\n\t0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83,\n\t0xA7, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1,\n\t0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0x88, 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB,\n\t0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84,\n\t0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1,\n\t0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3,\n\t// Bytes 2bc0 - 2bff\n\t0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB,\n\t0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0xBC, 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t0xA9, 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD,\n\t0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83,\n\t0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52,\n\t0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83,\n\t// Bytes 2c00 - 2c3f\n\t0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3,\n\t0x83, 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83,\n\t0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3,\n\t0x82, 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83,\n\t0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3,\n\t0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88,\n\t0x52, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3,\n\t0x82, 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88,\n\t// Bytes 2c40 - 2c7f\n\t0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3,\n\t0x82, 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7,\n\t0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3,\n\t0x83, 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F,\n\t0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t0xAB, 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3,\n\t0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82,\n\t0x99, 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9,\n\t// Bytes 2c80 - 2cbf\n\t0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84,\n\t0xD9, 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9,\n\t0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88,\n\t0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0,\n\t0xA7, 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0,\n\t0xA7, 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0,\n\t0xAD, 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0,\n\t0xAD, 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0,\n\t// Bytes 2cc0 - 2cff\n\t0xAD, 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0,\n\t0xAE, 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,\n\t0xAF, 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,\n\t0xAF, 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0,\n\t0xAF, 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0,\n\t0xB2, 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,\n\t0xB3, 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0,\n\t0xB3, 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0,\n\t// Bytes 2d00 - 2d3f\n\t0xB5, 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,\n\t0xB5, 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0,\n\t0xB5, 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0,\n\t0xB7, 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1,\n\t0x80, 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1,\n\t0xAC, 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t// Bytes 2d40 - 2d7f\n\t0xAC, 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAC, 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1,\n\t0xAD, 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0,\n\t// Bytes 2d80 - 2dbf\n\t0x91, 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01,\n\t0x08, 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84,\n\t0xA7, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0,\n\t0x91, 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D,\n\t0x87, 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0,\n\t0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01,\n\t0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92,\n\t0xBA, 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0,\n\t// Bytes 2dc0 - 2dff\n\t0x91, 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96,\n\t0xB8, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0,\n\t0x91, 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01,\n\t0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0xE0,\n\t0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, 0xE0,\n\t0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x12, 0x44, 0x44,\n\t0x5A, 0xCC, 0x8C, 0xC9, 0x44, 0x44, 0x7A, 0xCC,\n\t0x8C, 0xC9, 0x44, 0x64, 0x7A, 0xCC, 0x8C, 0xC9,\n\t// Bytes 2e00 - 2e3f\n\t0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, 0xC9,\n\t0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0xC9,\n\t0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,\n\t0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x01,\n\t// Bytes 2e40 - 2e7f\n\t0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x01,\n\t0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, 0x01,\n\t// Bytes 2e80 - 2ebf\n\t0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x01,\n\t0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x01,\n\t0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3,\n\t0x82, 0x99, 0x0D, 0x4C, 0xE1, 0x84, 0x8C, 0xE1,\n\t0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4,\n\t0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99,\n\t0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D, 0x4C,\n\t0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, 0x83,\n\t// Bytes 2ec0 - 2eff\n\t0x9B, 0xE3, 0x82, 0x9A, 0x0D, 0x4C, 0xE3, 0x83,\n\t0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3,\n\t0x82, 0x99, 0x0D, 0x4F, 0xE1, 0x84, 0x8E, 0xE1,\n\t0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80,\n\t0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, 0xA4,\n\t0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, 0x82,\n\t0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3, 0x82,\n\t0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, 0xE3,\n\t// Bytes 2f00 - 2f3f\n\t0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D, 0x4F, 0xE3,\n\t0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC,\n\t0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D, 0x4F,\n\t0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, 0x83,\n\t0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,\n\t0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3,\n\t0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88,\n\t0xE3, 0x82, 0x99, 0x0D, 0x52, 0xE3, 0x83, 0x95,\n\t// Bytes 2f40 - 2f7f\n\t0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83,\n\t0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,\n\t0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, 0x01,\n\t0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, 0x01,\n\t0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, 0xCC,\n\t0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, 0x03,\n\t0x41, 0xCC, 0x80, 0xC9, 0x03, 0x41, 0xCC, 0x81,\n\t0xC9, 0x03, 0x41, 0xCC, 0x83, 0xC9, 0x03, 0x41,\n\t// Bytes 2f80 - 2fbf\n\t0xCC, 0x84, 0xC9, 0x03, 0x41, 0xCC, 0x89, 0xC9,\n\t0x03, 0x41, 0xCC, 0x8C, 0xC9, 0x03, 0x41, 0xCC,\n\t0x8F, 0xC9, 0x03, 0x41, 0xCC, 0x91, 0xC9, 0x03,\n\t0x41, 0xCC, 0xA5, 0xB5, 0x03, 0x41, 0xCC, 0xA8,\n\t0xA5, 0x03, 0x42, 0xCC, 0x87, 0xC9, 0x03, 0x42,\n\t0xCC, 0xA3, 0xB5, 0x03, 0x42, 0xCC, 0xB1, 0xB5,\n\t0x03, 0x43, 0xCC, 0x81, 0xC9, 0x03, 0x43, 0xCC,\n\t0x82, 0xC9, 0x03, 0x43, 0xCC, 0x87, 0xC9, 0x03,\n\t// Bytes 2fc0 - 2fff\n\t0x43, 0xCC, 0x8C, 0xC9, 0x03, 0x44, 0xCC, 0x87,\n\t0xC9, 0x03, 0x44, 0xCC, 0x8C, 0xC9, 0x03, 0x44,\n\t0xCC, 0xA3, 0xB5, 0x03, 0x44, 0xCC, 0xA7, 0xA5,\n\t0x03, 0x44, 0xCC, 0xAD, 0xB5, 0x03, 0x44, 0xCC,\n\t0xB1, 0xB5, 0x03, 0x45, 0xCC, 0x80, 0xC9, 0x03,\n\t0x45, 0xCC, 0x81, 0xC9, 0x03, 0x45, 0xCC, 0x83,\n\t0xC9, 0x03, 0x45, 0xCC, 0x86, 0xC9, 0x03, 0x45,\n\t0xCC, 0x87, 0xC9, 0x03, 0x45, 0xCC, 0x88, 0xC9,\n\t// Bytes 3000 - 303f\n\t0x03, 0x45, 0xCC, 0x89, 0xC9, 0x03, 0x45, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x45, 0xCC, 0x8F, 0xC9, 0x03,\n\t0x45, 0xCC, 0x91, 0xC9, 0x03, 0x45, 0xCC, 0xA8,\n\t0xA5, 0x03, 0x45, 0xCC, 0xAD, 0xB5, 0x03, 0x45,\n\t0xCC, 0xB0, 0xB5, 0x03, 0x46, 0xCC, 0x87, 0xC9,\n\t0x03, 0x47, 0xCC, 0x81, 0xC9, 0x03, 0x47, 0xCC,\n\t0x82, 0xC9, 0x03, 0x47, 0xCC, 0x84, 0xC9, 0x03,\n\t0x47, 0xCC, 0x86, 0xC9, 0x03, 0x47, 0xCC, 0x87,\n\t// Bytes 3040 - 307f\n\t0xC9, 0x03, 0x47, 0xCC, 0x8C, 0xC9, 0x03, 0x47,\n\t0xCC, 0xA7, 0xA5, 0x03, 0x48, 0xCC, 0x82, 0xC9,\n\t0x03, 0x48, 0xCC, 0x87, 0xC9, 0x03, 0x48, 0xCC,\n\t0x88, 0xC9, 0x03, 0x48, 0xCC, 0x8C, 0xC9, 0x03,\n\t0x48, 0xCC, 0xA3, 0xB5, 0x03, 0x48, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x48, 0xCC, 0xAE, 0xB5, 0x03, 0x49,\n\t0xCC, 0x80, 0xC9, 0x03, 0x49, 0xCC, 0x81, 0xC9,\n\t0x03, 0x49, 0xCC, 0x82, 0xC9, 0x03, 0x49, 0xCC,\n\t// Bytes 3080 - 30bf\n\t0x83, 0xC9, 0x03, 0x49, 0xCC, 0x84, 0xC9, 0x03,\n\t0x49, 0xCC, 0x86, 0xC9, 0x03, 0x49, 0xCC, 0x87,\n\t0xC9, 0x03, 0x49, 0xCC, 0x89, 0xC9, 0x03, 0x49,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x49, 0xCC, 0x8F, 0xC9,\n\t0x03, 0x49, 0xCC, 0x91, 0xC9, 0x03, 0x49, 0xCC,\n\t0xA3, 0xB5, 0x03, 0x49, 0xCC, 0xA8, 0xA5, 0x03,\n\t0x49, 0xCC, 0xB0, 0xB5, 0x03, 0x4A, 0xCC, 0x82,\n\t0xC9, 0x03, 0x4B, 0xCC, 0x81, 0xC9, 0x03, 0x4B,\n\t// Bytes 30c0 - 30ff\n\t0xCC, 0x8C, 0xC9, 0x03, 0x4B, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x4B, 0xCC, 0xA7, 0xA5, 0x03, 0x4B, 0xCC,\n\t0xB1, 0xB5, 0x03, 0x4C, 0xCC, 0x81, 0xC9, 0x03,\n\t0x4C, 0xCC, 0x8C, 0xC9, 0x03, 0x4C, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x4C, 0xCC, 0xAD, 0xB5, 0x03, 0x4C,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x4D, 0xCC, 0x81, 0xC9,\n\t0x03, 0x4D, 0xCC, 0x87, 0xC9, 0x03, 0x4D, 0xCC,\n\t0xA3, 0xB5, 0x03, 0x4E, 0xCC, 0x80, 0xC9, 0x03,\n\t// Bytes 3100 - 313f\n\t0x4E, 0xCC, 0x81, 0xC9, 0x03, 0x4E, 0xCC, 0x83,\n\t0xC9, 0x03, 0x4E, 0xCC, 0x87, 0xC9, 0x03, 0x4E,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x4E, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x4E, 0xCC, 0xA7, 0xA5, 0x03, 0x4E, 0xCC,\n\t0xAD, 0xB5, 0x03, 0x4E, 0xCC, 0xB1, 0xB5, 0x03,\n\t0x4F, 0xCC, 0x80, 0xC9, 0x03, 0x4F, 0xCC, 0x81,\n\t0xC9, 0x03, 0x4F, 0xCC, 0x86, 0xC9, 0x03, 0x4F,\n\t0xCC, 0x89, 0xC9, 0x03, 0x4F, 0xCC, 0x8B, 0xC9,\n\t// Bytes 3140 - 317f\n\t0x03, 0x4F, 0xCC, 0x8C, 0xC9, 0x03, 0x4F, 0xCC,\n\t0x8F, 0xC9, 0x03, 0x4F, 0xCC, 0x91, 0xC9, 0x03,\n\t0x50, 0xCC, 0x81, 0xC9, 0x03, 0x50, 0xCC, 0x87,\n\t0xC9, 0x03, 0x52, 0xCC, 0x81, 0xC9, 0x03, 0x52,\n\t0xCC, 0x87, 0xC9, 0x03, 0x52, 0xCC, 0x8C, 0xC9,\n\t0x03, 0x52, 0xCC, 0x8F, 0xC9, 0x03, 0x52, 0xCC,\n\t0x91, 0xC9, 0x03, 0x52, 0xCC, 0xA7, 0xA5, 0x03,\n\t0x52, 0xCC, 0xB1, 0xB5, 0x03, 0x53, 0xCC, 0x82,\n\t// Bytes 3180 - 31bf\n\t0xC9, 0x03, 0x53, 0xCC, 0x87, 0xC9, 0x03, 0x53,\n\t0xCC, 0xA6, 0xB5, 0x03, 0x53, 0xCC, 0xA7, 0xA5,\n\t0x03, 0x54, 0xCC, 0x87, 0xC9, 0x03, 0x54, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x54, 0xCC, 0xA3, 0xB5, 0x03,\n\t0x54, 0xCC, 0xA6, 0xB5, 0x03, 0x54, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x54, 0xCC, 0xAD, 0xB5, 0x03, 0x54,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x55, 0xCC, 0x80, 0xC9,\n\t0x03, 0x55, 0xCC, 0x81, 0xC9, 0x03, 0x55, 0xCC,\n\t// Bytes 31c0 - 31ff\n\t0x82, 0xC9, 0x03, 0x55, 0xCC, 0x86, 0xC9, 0x03,\n\t0x55, 0xCC, 0x89, 0xC9, 0x03, 0x55, 0xCC, 0x8A,\n\t0xC9, 0x03, 0x55, 0xCC, 0x8B, 0xC9, 0x03, 0x55,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x55, 0xCC, 0x8F, 0xC9,\n\t0x03, 0x55, 0xCC, 0x91, 0xC9, 0x03, 0x55, 0xCC,\n\t0xA3, 0xB5, 0x03, 0x55, 0xCC, 0xA4, 0xB5, 0x03,\n\t0x55, 0xCC, 0xA8, 0xA5, 0x03, 0x55, 0xCC, 0xAD,\n\t0xB5, 0x03, 0x55, 0xCC, 0xB0, 0xB5, 0x03, 0x56,\n\t// Bytes 3200 - 323f\n\t0xCC, 0x83, 0xC9, 0x03, 0x56, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x57, 0xCC, 0x80, 0xC9, 0x03, 0x57, 0xCC,\n\t0x81, 0xC9, 0x03, 0x57, 0xCC, 0x82, 0xC9, 0x03,\n\t0x57, 0xCC, 0x87, 0xC9, 0x03, 0x57, 0xCC, 0x88,\n\t0xC9, 0x03, 0x57, 0xCC, 0xA3, 0xB5, 0x03, 0x58,\n\t0xCC, 0x87, 0xC9, 0x03, 0x58, 0xCC, 0x88, 0xC9,\n\t0x03, 0x59, 0xCC, 0x80, 0xC9, 0x03, 0x59, 0xCC,\n\t0x81, 0xC9, 0x03, 0x59, 0xCC, 0x82, 0xC9, 0x03,\n\t// Bytes 3240 - 327f\n\t0x59, 0xCC, 0x83, 0xC9, 0x03, 0x59, 0xCC, 0x84,\n\t0xC9, 0x03, 0x59, 0xCC, 0x87, 0xC9, 0x03, 0x59,\n\t0xCC, 0x88, 0xC9, 0x03, 0x59, 0xCC, 0x89, 0xC9,\n\t0x03, 0x59, 0xCC, 0xA3, 0xB5, 0x03, 0x5A, 0xCC,\n\t0x81, 0xC9, 0x03, 0x5A, 0xCC, 0x82, 0xC9, 0x03,\n\t0x5A, 0xCC, 0x87, 0xC9, 0x03, 0x5A, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x5A, 0xCC, 0xA3, 0xB5, 0x03, 0x5A,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x61, 0xCC, 0x80, 0xC9,\n\t// Bytes 3280 - 32bf\n\t0x03, 0x61, 0xCC, 0x81, 0xC9, 0x03, 0x61, 0xCC,\n\t0x83, 0xC9, 0x03, 0x61, 0xCC, 0x84, 0xC9, 0x03,\n\t0x61, 0xCC, 0x89, 0xC9, 0x03, 0x61, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x61, 0xCC, 0x8F, 0xC9, 0x03, 0x61,\n\t0xCC, 0x91, 0xC9, 0x03, 0x61, 0xCC, 0xA5, 0xB5,\n\t0x03, 0x61, 0xCC, 0xA8, 0xA5, 0x03, 0x62, 0xCC,\n\t0x87, 0xC9, 0x03, 0x62, 0xCC, 0xA3, 0xB5, 0x03,\n\t0x62, 0xCC, 0xB1, 0xB5, 0x03, 0x63, 0xCC, 0x81,\n\t// Bytes 32c0 - 32ff\n\t0xC9, 0x03, 0x63, 0xCC, 0x82, 0xC9, 0x03, 0x63,\n\t0xCC, 0x87, 0xC9, 0x03, 0x63, 0xCC, 0x8C, 0xC9,\n\t0x03, 0x64, 0xCC, 0x87, 0xC9, 0x03, 0x64, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x64, 0xCC, 0xA3, 0xB5, 0x03,\n\t0x64, 0xCC, 0xA7, 0xA5, 0x03, 0x64, 0xCC, 0xAD,\n\t0xB5, 0x03, 0x64, 0xCC, 0xB1, 0xB5, 0x03, 0x65,\n\t0xCC, 0x80, 0xC9, 0x03, 0x65, 0xCC, 0x81, 0xC9,\n\t0x03, 0x65, 0xCC, 0x83, 0xC9, 0x03, 0x65, 0xCC,\n\t// Bytes 3300 - 333f\n\t0x86, 0xC9, 0x03, 0x65, 0xCC, 0x87, 0xC9, 0x03,\n\t0x65, 0xCC, 0x88, 0xC9, 0x03, 0x65, 0xCC, 0x89,\n\t0xC9, 0x03, 0x65, 0xCC, 0x8C, 0xC9, 0x03, 0x65,\n\t0xCC, 0x8F, 0xC9, 0x03, 0x65, 0xCC, 0x91, 0xC9,\n\t0x03, 0x65, 0xCC, 0xA8, 0xA5, 0x03, 0x65, 0xCC,\n\t0xAD, 0xB5, 0x03, 0x65, 0xCC, 0xB0, 0xB5, 0x03,\n\t0x66, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC, 0x81,\n\t0xC9, 0x03, 0x67, 0xCC, 0x82, 0xC9, 0x03, 0x67,\n\t// Bytes 3340 - 337f\n\t0xCC, 0x84, 0xC9, 0x03, 0x67, 0xCC, 0x86, 0xC9,\n\t0x03, 0x67, 0xCC, 0x87, 0xC9, 0x03, 0x67, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x67, 0xCC, 0xA7, 0xA5, 0x03,\n\t0x68, 0xCC, 0x82, 0xC9, 0x03, 0x68, 0xCC, 0x87,\n\t0xC9, 0x03, 0x68, 0xCC, 0x88, 0xC9, 0x03, 0x68,\n\t0xCC, 0x8C, 0xC9, 0x03, 0x68, 0xCC, 0xA3, 0xB5,\n\t0x03, 0x68, 0xCC, 0xA7, 0xA5, 0x03, 0x68, 0xCC,\n\t0xAE, 0xB5, 0x03, 0x68, 0xCC, 0xB1, 0xB5, 0x03,\n\t// Bytes 3380 - 33bf\n\t0x69, 0xCC, 0x80, 0xC9, 0x03, 0x69, 0xCC, 0x81,\n\t0xC9, 0x03, 0x69, 0xCC, 0x82, 0xC9, 0x03, 0x69,\n\t0xCC, 0x83, 0xC9, 0x03, 0x69, 0xCC, 0x84, 0xC9,\n\t0x03, 0x69, 0xCC, 0x86, 0xC9, 0x03, 0x69, 0xCC,\n\t0x89, 0xC9, 0x03, 0x69, 0xCC, 0x8C, 0xC9, 0x03,\n\t0x69, 0xCC, 0x8F, 0xC9, 0x03, 0x69, 0xCC, 0x91,\n\t0xC9, 0x03, 0x69, 0xCC, 0xA3, 0xB5, 0x03, 0x69,\n\t0xCC, 0xA8, 0xA5, 0x03, 0x69, 0xCC, 0xB0, 0xB5,\n\t// Bytes 33c0 - 33ff\n\t0x03, 0x6A, 0xCC, 0x82, 0xC9, 0x03, 0x6A, 0xCC,\n\t0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0x81, 0xC9, 0x03,\n\t0x6B, 0xCC, 0x8C, 0xC9, 0x03, 0x6B, 0xCC, 0xA3,\n\t0xB5, 0x03, 0x6B, 0xCC, 0xA7, 0xA5, 0x03, 0x6B,\n\t0xCC, 0xB1, 0xB5, 0x03, 0x6C, 0xCC, 0x81, 0xC9,\n\t0x03, 0x6C, 0xCC, 0x8C, 0xC9, 0x03, 0x6C, 0xCC,\n\t0xA7, 0xA5, 0x03, 0x6C, 0xCC, 0xAD, 0xB5, 0x03,\n\t0x6C, 0xCC, 0xB1, 0xB5, 0x03, 0x6D, 0xCC, 0x81,\n\t// Bytes 3400 - 343f\n\t0xC9, 0x03, 0x6D, 0xCC, 0x87, 0xC9, 0x03, 0x6D,\n\t0xCC, 0xA3, 0xB5, 0x03, 0x6E, 0xCC, 0x80, 0xC9,\n\t0x03, 0x6E, 0xCC, 0x81, 0xC9, 0x03, 0x6E, 0xCC,\n\t0x83, 0xC9, 0x03, 0x6E, 0xCC, 0x87, 0xC9, 0x03,\n\t0x6E, 0xCC, 0x8C, 0xC9, 0x03, 0x6E, 0xCC, 0xA3,\n\t0xB5, 0x03, 0x6E, 0xCC, 0xA7, 0xA5, 0x03, 0x6E,\n\t0xCC, 0xAD, 0xB5, 0x03, 0x6E, 0xCC, 0xB1, 0xB5,\n\t0x03, 0x6F, 0xCC, 0x80, 0xC9, 0x03, 0x6F, 0xCC,\n\t// Bytes 3440 - 347f\n\t0x81, 0xC9, 0x03, 0x6F, 0xCC, 0x86, 0xC9, 0x03,\n\t0x6F, 0xCC, 0x89, 0xC9, 0x03, 0x6F, 0xCC, 0x8B,\n\t0xC9, 0x03, 0x6F, 0xCC, 0x8C, 0xC9, 0x03, 0x6F,\n\t0xCC, 0x8F, 0xC9, 0x03, 0x6F, 0xCC, 0x91, 0xC9,\n\t0x03, 0x70, 0xCC, 0x81, 0xC9, 0x03, 0x70, 0xCC,\n\t0x87, 0xC9, 0x03, 0x72, 0xCC, 0x81, 0xC9, 0x03,\n\t0x72, 0xCC, 0x87, 0xC9, 0x03, 0x72, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x72, 0xCC, 0x8F, 0xC9, 0x03, 0x72,\n\t// Bytes 3480 - 34bf\n\t0xCC, 0x91, 0xC9, 0x03, 0x72, 0xCC, 0xA7, 0xA5,\n\t0x03, 0x72, 0xCC, 0xB1, 0xB5, 0x03, 0x73, 0xCC,\n\t0x82, 0xC9, 0x03, 0x73, 0xCC, 0x87, 0xC9, 0x03,\n\t0x73, 0xCC, 0xA6, 0xB5, 0x03, 0x73, 0xCC, 0xA7,\n\t0xA5, 0x03, 0x74, 0xCC, 0x87, 0xC9, 0x03, 0x74,\n\t0xCC, 0x88, 0xC9, 0x03, 0x74, 0xCC, 0x8C, 0xC9,\n\t0x03, 0x74, 0xCC, 0xA3, 0xB5, 0x03, 0x74, 0xCC,\n\t0xA6, 0xB5, 0x03, 0x74, 0xCC, 0xA7, 0xA5, 0x03,\n\t// Bytes 34c0 - 34ff\n\t0x74, 0xCC, 0xAD, 0xB5, 0x03, 0x74, 0xCC, 0xB1,\n\t0xB5, 0x03, 0x75, 0xCC, 0x80, 0xC9, 0x03, 0x75,\n\t0xCC, 0x81, 0xC9, 0x03, 0x75, 0xCC, 0x82, 0xC9,\n\t0x03, 0x75, 0xCC, 0x86, 0xC9, 0x03, 0x75, 0xCC,\n\t0x89, 0xC9, 0x03, 0x75, 0xCC, 0x8A, 0xC9, 0x03,\n\t0x75, 0xCC, 0x8B, 0xC9, 0x03, 0x75, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x75, 0xCC, 0x8F, 0xC9, 0x03, 0x75,\n\t0xCC, 0x91, 0xC9, 0x03, 0x75, 0xCC, 0xA3, 0xB5,\n\t// Bytes 3500 - 353f\n\t0x03, 0x75, 0xCC, 0xA4, 0xB5, 0x03, 0x75, 0xCC,\n\t0xA8, 0xA5, 0x03, 0x75, 0xCC, 0xAD, 0xB5, 0x03,\n\t0x75, 0xCC, 0xB0, 0xB5, 0x03, 0x76, 0xCC, 0x83,\n\t0xC9, 0x03, 0x76, 0xCC, 0xA3, 0xB5, 0x03, 0x77,\n\t0xCC, 0x80, 0xC9, 0x03, 0x77, 0xCC, 0x81, 0xC9,\n\t0x03, 0x77, 0xCC, 0x82, 0xC9, 0x03, 0x77, 0xCC,\n\t0x87, 0xC9, 0x03, 0x77, 0xCC, 0x88, 0xC9, 0x03,\n\t0x77, 0xCC, 0x8A, 0xC9, 0x03, 0x77, 0xCC, 0xA3,\n\t// Bytes 3540 - 357f\n\t0xB5, 0x03, 0x78, 0xCC, 0x87, 0xC9, 0x03, 0x78,\n\t0xCC, 0x88, 0xC9, 0x03, 0x79, 0xCC, 0x80, 0xC9,\n\t0x03, 0x79, 0xCC, 0x81, 0xC9, 0x03, 0x79, 0xCC,\n\t0x82, 0xC9, 0x03, 0x79, 0xCC, 0x83, 0xC9, 0x03,\n\t0x79, 0xCC, 0x84, 0xC9, 0x03, 0x79, 0xCC, 0x87,\n\t0xC9, 0x03, 0x79, 0xCC, 0x88, 0xC9, 0x03, 0x79,\n\t0xCC, 0x89, 0xC9, 0x03, 0x79, 0xCC, 0x8A, 0xC9,\n\t0x03, 0x79, 0xCC, 0xA3, 0xB5, 0x03, 0x7A, 0xCC,\n\t// Bytes 3580 - 35bf\n\t0x81, 0xC9, 0x03, 0x7A, 0xCC, 0x82, 0xC9, 0x03,\n\t0x7A, 0xCC, 0x87, 0xC9, 0x03, 0x7A, 0xCC, 0x8C,\n\t0xC9, 0x03, 0x7A, 0xCC, 0xA3, 0xB5, 0x03, 0x7A,\n\t0xCC, 0xB1, 0xB5, 0x04, 0xC2, 0xA8, 0xCC, 0x80,\n\t0xCA, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x04,\n\t0xC2, 0xA8, 0xCD, 0x82, 0xCA, 0x04, 0xC3, 0x86,\n\t0xCC, 0x81, 0xC9, 0x04, 0xC3, 0x86, 0xCC, 0x84,\n\t0xC9, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xC9, 0x04,\n\t// Bytes 35c0 - 35ff\n\t0xC3, 0xA6, 0xCC, 0x81, 0xC9, 0x04, 0xC3, 0xA6,\n\t0xCC, 0x84, 0xC9, 0x04, 0xC3, 0xB8, 0xCC, 0x81,\n\t0xC9, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xC9, 0x04,\n\t0xC6, 0xB7, 0xCC, 0x8C, 0xC9, 0x04, 0xCA, 0x92,\n\t0xCC, 0x8C, 0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x80,\n\t0xC9, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xC9, 0x04,\n\t0xCE, 0x91, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0x91,\n\t0xCC, 0x86, 0xC9, 0x04, 0xCE, 0x91, 0xCD, 0x85,\n\t// Bytes 3600 - 363f\n\t0xD9, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCE, 0x95, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x97,\n\t0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x97, 0xCC, 0x81,\n\t0xC9, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xD9, 0x04,\n\t0xCE, 0x99, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x99,\n\t0xCC, 0x81, 0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x84,\n\t0xC9, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xC9, 0x04,\n\t0xCE, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0x9F,\n\t// Bytes 3640 - 367f\n\t0xCC, 0x80, 0xC9, 0x04, 0xCE, 0x9F, 0xCC, 0x81,\n\t0xC9, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xC9, 0x04,\n\t0xCE, 0xA5, 0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA5,\n\t0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x84,\n\t0xC9, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xC9, 0x04,\n\t0xCE, 0xA5, 0xCC, 0x88, 0xC9, 0x04, 0xCE, 0xA9,\n\t0xCC, 0x80, 0xC9, 0x04, 0xCE, 0xA9, 0xCC, 0x81,\n\t0xC9, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xD9, 0x04,\n\t// Bytes 3680 - 36bf\n\t0xCE, 0xB1, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB1,\n\t0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB1, 0xCD, 0x85,\n\t0xD9, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCE, 0xB5, 0xCC, 0x81, 0xC9, 0x04, 0xCE, 0xB7,\n\t0xCD, 0x85, 0xD9, 0x04, 0xCE, 0xB9, 0xCC, 0x80,\n\t0xC9, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x04,\n\t0xCE, 0xB9, 0xCC, 0x84, 0xC9, 0x04, 0xCE, 0xB9,\n\t0xCC, 0x86, 0xC9, 0x04, 0xCE, 0xB9, 0xCD, 0x82,\n\t// Bytes 36c0 - 36ff\n\t0xC9, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCE, 0xBF, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x81,\n\t0xCC, 0x93, 0xC9, 0x04, 0xCF, 0x81, 0xCC, 0x94,\n\t0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xC9, 0x04,\n\t0xCF, 0x85, 0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x85,\n\t0xCC, 0x84, 0xC9, 0x04, 0xCF, 0x85, 0xCC, 0x86,\n\t0xC9, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xC9, 0x04,\n\t0xCF, 0x89, 0xCD, 0x85, 0xD9, 0x04, 0xCF, 0x92,\n\t// Bytes 3700 - 373f\n\t0xCC, 0x81, 0xC9, 0x04, 0xCF, 0x92, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0x90, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x90,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x93, 0xCC, 0x81,\n\t0xC9, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xC9, 0x04,\n\t0xD0, 0x95, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0x95,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xC9, 0x04,\n\t// Bytes 3740 - 377f\n\t0xD0, 0x97, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x98,\n\t0xCC, 0x80, 0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x84,\n\t0xC9, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xC9, 0x04,\n\t0xD0, 0x98, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0x9A,\n\t0xCC, 0x81, 0xC9, 0x04, 0xD0, 0x9E, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xC9, 0x04,\n\t0xD0, 0xA3, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xA3,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xA3, 0xCC, 0x8B,\n\t// Bytes 3780 - 37bf\n\t0xC9, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0xAB, 0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xAD,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0xB3, 0xCC, 0x81, 0xC9, 0x04, 0xD0, 0xB5,\n\t0xCC, 0x80, 0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD0, 0xB6, 0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB6,\n\t// Bytes 37c0 - 37ff\n\t0xCC, 0x88, 0xC9, 0x04, 0xD0, 0xB7, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xC9, 0x04,\n\t0xD0, 0xB8, 0xCC, 0x84, 0xC9, 0x04, 0xD0, 0xB8,\n\t0xCC, 0x86, 0xC9, 0x04, 0xD0, 0xB8, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xC9, 0x04,\n\t0xD0, 0xBE, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x83,\n\t0xCC, 0x84, 0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x86,\n\t0xC9, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xC9, 0x04,\n\t// Bytes 3800 - 383f\n\t0xD1, 0x83, 0xCC, 0x8B, 0xC9, 0x04, 0xD1, 0x87,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD1, 0x8B, 0xCC, 0x88,\n\t0xC9, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD1, 0x96, 0xCC, 0x88, 0xC9, 0x04, 0xD1, 0xB4,\n\t0xCC, 0x8F, 0xC9, 0x04, 0xD1, 0xB5, 0xCC, 0x8F,\n\t0xC9, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xC9, 0x04,\n\t0xD3, 0x99, 0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA8,\n\t0xCC, 0x88, 0xC9, 0x04, 0xD3, 0xA9, 0xCC, 0x88,\n\t// Bytes 3840 - 387f\n\t0xC9, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xC9, 0x04,\n\t0xD8, 0xA7, 0xD9, 0x94, 0xC9, 0x04, 0xD8, 0xA7,\n\t0xD9, 0x95, 0xB5, 0x04, 0xD9, 0x88, 0xD9, 0x94,\n\t0xC9, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xC9, 0x04,\n\t0xDB, 0x81, 0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x92,\n\t0xD9, 0x94, 0xC9, 0x04, 0xDB, 0x95, 0xD9, 0x94,\n\t0xC9, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, 0xCA,\n\t0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,\n\t// Bytes 3880 - 38bf\n\t0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x41,\n\t0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x41, 0xCC,\n\t0x86, 0xCC, 0x80, 0xCA, 0x05, 0x41, 0xCC, 0x86,\n\t0xCC, 0x81, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC,\n\t0x83, 0xCA, 0x05, 0x41, 0xCC, 0x86, 0xCC, 0x89,\n\t0xCA, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, 0xCA,\n\t0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05,\n\t0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x41,\n\t// Bytes 38c0 - 38ff\n\t0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x41, 0xCC,\n\t0xA3, 0xCC, 0x86, 0xCA, 0x05, 0x43, 0xCC, 0xA7,\n\t0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC,\n\t0x80, 0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x81,\n\t0xCA, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, 0xCA,\n\t0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05,\n\t0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x45,\n\t0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05, 0x45, 0xCC,\n\t// Bytes 3900 - 393f\n\t0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x45, 0xCC, 0xA7,\n\t0xCC, 0x86, 0xCA, 0x05, 0x49, 0xCC, 0x88, 0xCC,\n\t0x81, 0xCA, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, 0x84,\n\t0xCA, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, 0xCA,\n\t0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05,\n\t0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x4F,\n\t0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x4F, 0xCC,\n\t0x83, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x83,\n\t// Bytes 3940 - 397f\n\t0xCC, 0x84, 0xCA, 0x05, 0x4F, 0xCC, 0x83, 0xCC,\n\t0x88, 0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x80,\n\t0xCA, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, 0xCA,\n\t0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,\n\t0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x4F,\n\t0xCC, 0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x4F, 0xCC,\n\t0x9B, 0xCC, 0x81, 0xCA, 0x05, 0x4F, 0xCC, 0x9B,\n\t0xCC, 0x83, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC,\n\t// Bytes 3980 - 39bf\n\t0x89, 0xCA, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, 0xA3,\n\t0xB6, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA,\n\t0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05,\n\t0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x53,\n\t0xCC, 0x81, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC,\n\t0x8C, 0xCC, 0x87, 0xCA, 0x05, 0x53, 0xCC, 0xA3,\n\t0xCC, 0x87, 0xCA, 0x05, 0x55, 0xCC, 0x83, 0xCC,\n\t0x81, 0xCA, 0x05, 0x55, 0xCC, 0x84, 0xCC, 0x88,\n\t// Bytes 39c0 - 39ff\n\t0xCA, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, 0xCA,\n\t0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05,\n\t0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x55,\n\t0xCC, 0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x55, 0xCC,\n\t0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x55, 0xCC, 0x9B,\n\t0xCC, 0x81, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC,\n\t0x83, 0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0x89,\n\t0xCA, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,\n\t// Bytes 3a00 - 3a3f\n\t0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,\n\t0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x61,\n\t0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x61, 0xCC,\n\t0x82, 0xCC, 0x89, 0xCA, 0x05, 0x61, 0xCC, 0x86,\n\t0xCC, 0x80, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC,\n\t0x81, 0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x83,\n\t0xCA, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, 0xCA,\n\t0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05,\n\t// Bytes 3a40 - 3a7f\n\t0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x61,\n\t0xCC, 0x8A, 0xCC, 0x81, 0xCA, 0x05, 0x61, 0xCC,\n\t0xA3, 0xCC, 0x82, 0xCA, 0x05, 0x61, 0xCC, 0xA3,\n\t0xCC, 0x86, 0xCA, 0x05, 0x63, 0xCC, 0xA7, 0xCC,\n\t0x81, 0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x80,\n\t0xCA, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, 0xCA,\n\t0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05,\n\t0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCA, 0x05, 0x65,\n\t// Bytes 3a80 - 3abf\n\t0xCC, 0x84, 0xCC, 0x80, 0xCA, 0x05, 0x65, 0xCC,\n\t0x84, 0xCC, 0x81, 0xCA, 0x05, 0x65, 0xCC, 0xA3,\n\t0xCC, 0x82, 0xCA, 0x05, 0x65, 0xCC, 0xA7, 0xCC,\n\t0x86, 0xCA, 0x05, 0x69, 0xCC, 0x88, 0xCC, 0x81,\n\t0xCA, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, 0xCA,\n\t0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCA, 0x05,\n\t0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCA, 0x05, 0x6F,\n\t0xCC, 0x82, 0xCC, 0x83, 0xCA, 0x05, 0x6F, 0xCC,\n\t// Bytes 3ac0 - 3aff\n\t0x82, 0xCC, 0x89, 0xCA, 0x05, 0x6F, 0xCC, 0x83,\n\t0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC,\n\t0x84, 0xCA, 0x05, 0x6F, 0xCC, 0x83, 0xCC, 0x88,\n\t0xCA, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, 0xCA,\n\t0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCA, 0x05,\n\t0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCA, 0x05, 0x6F,\n\t0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x6F, 0xCC,\n\t0x9B, 0xCC, 0x80, 0xCA, 0x05, 0x6F, 0xCC, 0x9B,\n\t// Bytes 3b00 - 3b3f\n\t0xCC, 0x81, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC,\n\t0x83, 0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0x89,\n\t0xCA, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6,\n\t0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCA, 0x05,\n\t0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCA, 0x05, 0x72,\n\t0xCC, 0xA3, 0xCC, 0x84, 0xCA, 0x05, 0x73, 0xCC,\n\t0x81, 0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0x8C,\n\t0xCC, 0x87, 0xCA, 0x05, 0x73, 0xCC, 0xA3, 0xCC,\n\t// Bytes 3b40 - 3b7f\n\t0x87, 0xCA, 0x05, 0x75, 0xCC, 0x83, 0xCC, 0x81,\n\t0xCA, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, 0xCA,\n\t0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCA, 0x05,\n\t0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x05, 0x75,\n\t0xCC, 0x88, 0xCC, 0x84, 0xCA, 0x05, 0x75, 0xCC,\n\t0x88, 0xCC, 0x8C, 0xCA, 0x05, 0x75, 0xCC, 0x9B,\n\t0xCC, 0x80, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC,\n\t0x81, 0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x83,\n\t// Bytes 3b80 - 3bbf\n\t0xCA, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, 0xCA,\n\t0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xB6, 0x05,\n\t0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCA, 0x05, 0xE1,\n\t0xBE, 0xBF, 0xCC, 0x81, 0xCA, 0x05, 0xE1, 0xBE,\n\t0xBF, 0xCD, 0x82, 0xCA, 0x05, 0xE1, 0xBF, 0xBE,\n\t0xCC, 0x80, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCC,\n\t0x81, 0xCA, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, 0x82,\n\t0xCA, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, 0x05,\n\t// Bytes 3bc0 - 3bff\n\t0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87,\n\t0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, 0x94,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, 0x05,\n\t// Bytes 3c00 - 3c3f\n\t0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,\n\t0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x85,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t// Bytes 3c40 - 3c7f\n\t0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89,\n\t0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB6,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,\n\t// Bytes 3c80 - 3cbf\n\t0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x86,\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, 0x05,\n\t0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, 0x05,\n\t0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, 0xE2,\n\t0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A,\n\t0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB2,\n\t// Bytes 3cc0 - 3cff\n\t0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, 0xCC,\n\t0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, 0xB8,\n\t0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, 0x05,\n\t0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t// Bytes 3d00 - 3d3f\n\t0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t// Bytes 3d40 - 3d7f\n\t0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t// Bytes 3d80 - 3dbf\n\t0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t// Bytes 3dc0 - 3dff\n\t0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, 0xDA,\n\t// Bytes 3e00 - 3e3f\n\t0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t// Bytes 3e40 - 3e7f\n\t0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, 0xCA,\n\t// Bytes 3e80 - 3ebf\n\t0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, 0xCA,\n\t0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, 0xCA,\n\t0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, 0xDA,\n\t// Bytes 3ec0 - 3eff\n\t0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, 0xDA,\n\t0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, 0xDA,\n\t0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, 0x09,\n\t0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, 0x09,\n\t0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, 0x09,\n\t0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, 0x85,\n\t0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, 0x11,\n\t// Bytes 3f00 - 3f3f\n\t0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 3f40 - 3f7f\n\t0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 3f80 - 3fbf\n\t0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, 0x0D,\n\t// Bytes 3fc0 - 3fff\n\t0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 4000 - 403f\n\t0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 4040 - 407f\n\t0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 4080 - 40bf\n\t0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, 0x0D,\n\t// Bytes 40c0 - 40ff\n\t0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, 0x0D,\n\t0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, 0x0D,\n\t0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC,\n\t0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC,\n\t0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCD,\n\t// Bytes 4100 - 413f\n\t0x85, 0xDB, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCD,\n\t0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,\n\t0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC, 0x94, 0xCC,\n\t0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0x97, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t// Bytes 4140 - 417f\n\t0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC,\n\t0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC,\n\t0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCD,\n\t// Bytes 4180 - 41bf\n\t0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,\n\t0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC, 0x94, 0xCC,\n\t0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB1, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,\n\t// Bytes 41c0 - 41ff\n\t0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC,\n\t0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC,\n\t0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCD,\n\t0x82, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,\n\t// Bytes 4200 - 423f\n\t0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF,\n\t0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, 0xDB,\n\t0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCD,\n\t0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC, 0x94, 0xCC,\n\t0x80, 0xCD, 0x85, 0xDB, 0x08, 0xCF, 0x89, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDB, 0x08, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, 0xDB,\n\t0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, 0x82,\n\t// Bytes 4240 - 427f\n\t0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82, 0x9B, 0xF0,\n\t0x91, 0x82, 0xBA, 0x09, 0x08, 0xF0, 0x91, 0x82,\n\t0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x09, 0x42, 0xC2,\n\t0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xC9, 0x43,\n\t0x20, 0xCC, 0x83, 0xC9, 0x43, 0x20, 0xCC, 0x84,\n\t0xC9, 0x43, 0x20, 0xCC, 0x85, 0xC9, 0x43, 0x20,\n\t0xCC, 0x86, 0xC9, 0x43, 0x20, 0xCC, 0x87, 0xC9,\n\t0x43, 0x20, 0xCC, 0x88, 0xC9, 0x43, 0x20, 0xCC,\n\t// Bytes 4280 - 42bf\n\t0x8A, 0xC9, 0x43, 0x20, 0xCC, 0x8B, 0xC9, 0x43,\n\t0x20, 0xCC, 0x93, 0xC9, 0x43, 0x20, 0xCC, 0x94,\n\t0xC9, 0x43, 0x20, 0xCC, 0xA7, 0xA5, 0x43, 0x20,\n\t0xCC, 0xA8, 0xA5, 0x43, 0x20, 0xCC, 0xB3, 0xB5,\n\t0x43, 0x20, 0xCD, 0x82, 0xC9, 0x43, 0x20, 0xCD,\n\t0x85, 0xD9, 0x43, 0x20, 0xD9, 0x8B, 0x59, 0x43,\n\t0x20, 0xD9, 0x8C, 0x5D, 0x43, 0x20, 0xD9, 0x8D,\n\t0x61, 0x43, 0x20, 0xD9, 0x8E, 0x65, 0x43, 0x20,\n\t// Bytes 42c0 - 42ff\n\t0xD9, 0x8F, 0x69, 0x43, 0x20, 0xD9, 0x90, 0x6D,\n\t0x43, 0x20, 0xD9, 0x91, 0x71, 0x43, 0x20, 0xD9,\n\t0x92, 0x75, 0x43, 0x41, 0xCC, 0x8A, 0xC9, 0x43,\n\t0x73, 0xCC, 0x87, 0xC9, 0x44, 0x20, 0xE3, 0x82,\n\t0x99, 0x0D, 0x44, 0x20, 0xE3, 0x82, 0x9A, 0x0D,\n\t0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCA, 0x44, 0xCE,\n\t0x91, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0x95, 0xCC,\n\t0x81, 0xC9, 0x44, 0xCE, 0x97, 0xCC, 0x81, 0xC9,\n\t// Bytes 4300 - 433f\n\t0x44, 0xCE, 0x99, 0xCC, 0x81, 0xC9, 0x44, 0xCE,\n\t0x9F, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC,\n\t0x81, 0xC9, 0x44, 0xCE, 0xA5, 0xCC, 0x88, 0xC9,\n\t0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,\n\t0xB1, 0xCC, 0x81, 0xC9, 0x44, 0xCE, 0xB5, 0xCC,\n\t0x81, 0xC9, 0x44, 0xCE, 0xB7, 0xCC, 0x81, 0xC9,\n\t0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xC9, 0x44, 0xCE,\n\t0xBF, 0xCC, 0x81, 0xC9, 0x44, 0xCF, 0x85, 0xCC,\n\t// Bytes 4340 - 437f\n\t0x81, 0xC9, 0x44, 0xCF, 0x89, 0xCC, 0x81, 0xC9,\n\t0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x31, 0x44, 0xD7,\n\t0x90, 0xD6, 0xB8, 0x35, 0x44, 0xD7, 0x90, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x91, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x49, 0x44, 0xD7,\n\t0x92, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x93, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x94, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x39, 0x44, 0xD7,\n\t// Bytes 4380 - 43bf\n\t0x95, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x96, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x98, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x25, 0x44, 0xD7,\n\t0x99, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9A, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x49, 0x44, 0xD7,\n\t0x9C, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0x9E, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, 0x41,\n\t// Bytes 43c0 - 43ff\n\t0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x41, 0x44, 0xD7,\n\t0xA3, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, 0x49,\n\t0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x41, 0x44, 0xD7,\n\t0xA7, 0xD6, 0xBC, 0x41, 0x44, 0xD7, 0xA8, 0xD6,\n\t0xBC, 0x41, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, 0x41,\n\t0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x4D, 0x44, 0xD7,\n\t0xA9, 0xD7, 0x82, 0x51, 0x44, 0xD7, 0xAA, 0xD6,\n\t// Bytes 4400 - 443f\n\t0xBC, 0x41, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, 0x31,\n\t0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x59, 0x44, 0xD8,\n\t0xA7, 0xD9, 0x93, 0xC9, 0x44, 0xD8, 0xA7, 0xD9,\n\t0x94, 0xC9, 0x44, 0xD8, 0xA7, 0xD9, 0x95, 0xB5,\n\t0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x79, 0x44, 0xD8,\n\t0xB1, 0xD9, 0xB0, 0x79, 0x44, 0xD9, 0x80, 0xD9,\n\t0x8B, 0x59, 0x44, 0xD9, 0x80, 0xD9, 0x8E, 0x65,\n\t0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x69, 0x44, 0xD9,\n\t// Bytes 4440 - 447f\n\t0x80, 0xD9, 0x90, 0x6D, 0x44, 0xD9, 0x80, 0xD9,\n\t0x91, 0x71, 0x44, 0xD9, 0x80, 0xD9, 0x92, 0x75,\n\t0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x79, 0x44, 0xD9,\n\t0x88, 0xD9, 0x94, 0xC9, 0x44, 0xD9, 0x89, 0xD9,\n\t0xB0, 0x79, 0x44, 0xD9, 0x8A, 0xD9, 0x94, 0xC9,\n\t0x44, 0xDB, 0x92, 0xD9, 0x94, 0xC9, 0x44, 0xDB,\n\t0x95, 0xD9, 0x94, 0xC9, 0x45, 0x20, 0xCC, 0x88,\n\t0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCC,\n\t// Bytes 4480 - 44bf\n\t0x81, 0xCA, 0x45, 0x20, 0xCC, 0x88, 0xCD, 0x82,\n\t0xCA, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0xCA,\n\t0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x45,\n\t0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x45, 0x20,\n\t0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x45, 0x20, 0xCC,\n\t0x94, 0xCC, 0x81, 0xCA, 0x45, 0x20, 0xCC, 0x94,\n\t0xCD, 0x82, 0xCA, 0x45, 0x20, 0xD9, 0x8C, 0xD9,\n\t0x91, 0x72, 0x45, 0x20, 0xD9, 0x8D, 0xD9, 0x91,\n\t// Bytes 44c0 - 44ff\n\t0x72, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, 0x72,\n\t0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x72, 0x45,\n\t0x20, 0xD9, 0x90, 0xD9, 0x91, 0x72, 0x45, 0x20,\n\t0xD9, 0x91, 0xD9, 0xB0, 0x7A, 0x45, 0xE2, 0xAB,\n\t0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, 0xCC,\n\t0x88, 0xCC, 0x81, 0xCA, 0x46, 0xCF, 0x85, 0xCC,\n\t0x88, 0xCC, 0x81, 0xCA, 0x46, 0xD7, 0xA9, 0xD6,\n\t0xBC, 0xD7, 0x81, 0x4E, 0x46, 0xD7, 0xA9, 0xD6,\n\t// Bytes 4500 - 453f\n\t0xBC, 0xD7, 0x82, 0x52, 0x46, 0xD9, 0x80, 0xD9,\n\t0x8E, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,\n\t0x8F, 0xD9, 0x91, 0x72, 0x46, 0xD9, 0x80, 0xD9,\n\t0x90, 0xD9, 0x91, 0x72, 0x46, 0xE0, 0xA4, 0x95,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x96,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x97,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0x9C,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA1,\n\t// Bytes 4540 - 457f\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xA2,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAB,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA4, 0xAF,\n\t0xE0, 0xA4, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA1,\n\t0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xA2,\n\t0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA6, 0xAF,\n\t0xE0, 0xA6, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x96,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x97,\n\t// Bytes 4580 - 45bf\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0x9C,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xAB,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB2,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xA8, 0xB8,\n\t0xE0, 0xA8, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA1,\n\t0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xAC, 0xA2,\n\t0xE0, 0xAC, 0xBC, 0x09, 0x46, 0xE0, 0xBE, 0xB2,\n\t0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE0, 0xBE, 0xB3,\n\t// Bytes 45c0 - 45ff\n\t0xE0, 0xBE, 0x80, 0x9D, 0x46, 0xE3, 0x83, 0x86,\n\t0xE3, 0x82, 0x99, 0x0D, 0x48, 0xF0, 0x9D, 0x85,\n\t0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xAD, 0x48, 0xF0,\n\t0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xAD,\n\t0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,\n\t0xA5, 0xAD, 0x48, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,\n\t0x9D, 0x85, 0xA5, 0xAD, 0x49, 0xE0, 0xBE, 0xB2,\n\t0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x49,\n\t// Bytes 4600 - 463f\n\t0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE,\n\t0x80, 0x9E, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,\n\t0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE,\n\t0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85,\n\t0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0,\n\t0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,\n\t0x9D, 0x85, 0xB0, 0xAE, 0x4C, 0xF0, 0x9D, 0x85,\n\t0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,\n\t// Bytes 4640 - 467f\n\t0xB1, 0xAE, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0,\n\t0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, 0xAE,\n\t0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85,\n\t0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xAE, 0x4C, 0xF0,\n\t0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, 0xF0,\n\t0x9D, 0x85, 0xAF, 0xAE, 0x4C, 0xF0, 0x9D, 0x86,\n\t0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85,\n\t0xAE, 0xAE, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, 0xF0,\n\t// Bytes 4680 - 46bf\n\t0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xAE,\n\t0x83, 0x41, 0xCC, 0x82, 0xC9, 0x83, 0x41, 0xCC,\n\t0x86, 0xC9, 0x83, 0x41, 0xCC, 0x87, 0xC9, 0x83,\n\t0x41, 0xCC, 0x88, 0xC9, 0x83, 0x41, 0xCC, 0x8A,\n\t0xC9, 0x83, 0x41, 0xCC, 0xA3, 0xB5, 0x83, 0x43,\n\t0xCC, 0xA7, 0xA5, 0x83, 0x45, 0xCC, 0x82, 0xC9,\n\t0x83, 0x45, 0xCC, 0x84, 0xC9, 0x83, 0x45, 0xCC,\n\t0xA3, 0xB5, 0x83, 0x45, 0xCC, 0xA7, 0xA5, 0x83,\n\t// Bytes 46c0 - 46ff\n\t0x49, 0xCC, 0x88, 0xC9, 0x83, 0x4C, 0xCC, 0xA3,\n\t0xB5, 0x83, 0x4F, 0xCC, 0x82, 0xC9, 0x83, 0x4F,\n\t0xCC, 0x83, 0xC9, 0x83, 0x4F, 0xCC, 0x84, 0xC9,\n\t0x83, 0x4F, 0xCC, 0x87, 0xC9, 0x83, 0x4F, 0xCC,\n\t0x88, 0xC9, 0x83, 0x4F, 0xCC, 0x9B, 0xAD, 0x83,\n\t0x4F, 0xCC, 0xA3, 0xB5, 0x83, 0x4F, 0xCC, 0xA8,\n\t0xA5, 0x83, 0x52, 0xCC, 0xA3, 0xB5, 0x83, 0x53,\n\t0xCC, 0x81, 0xC9, 0x83, 0x53, 0xCC, 0x8C, 0xC9,\n\t// Bytes 4700 - 473f\n\t0x83, 0x53, 0xCC, 0xA3, 0xB5, 0x83, 0x55, 0xCC,\n\t0x83, 0xC9, 0x83, 0x55, 0xCC, 0x84, 0xC9, 0x83,\n\t0x55, 0xCC, 0x88, 0xC9, 0x83, 0x55, 0xCC, 0x9B,\n\t0xAD, 0x83, 0x61, 0xCC, 0x82, 0xC9, 0x83, 0x61,\n\t0xCC, 0x86, 0xC9, 0x83, 0x61, 0xCC, 0x87, 0xC9,\n\t0x83, 0x61, 0xCC, 0x88, 0xC9, 0x83, 0x61, 0xCC,\n\t0x8A, 0xC9, 0x83, 0x61, 0xCC, 0xA3, 0xB5, 0x83,\n\t0x63, 0xCC, 0xA7, 0xA5, 0x83, 0x65, 0xCC, 0x82,\n\t// Bytes 4740 - 477f\n\t0xC9, 0x83, 0x65, 0xCC, 0x84, 0xC9, 0x83, 0x65,\n\t0xCC, 0xA3, 0xB5, 0x83, 0x65, 0xCC, 0xA7, 0xA5,\n\t0x83, 0x69, 0xCC, 0x88, 0xC9, 0x83, 0x6C, 0xCC,\n\t0xA3, 0xB5, 0x83, 0x6F, 0xCC, 0x82, 0xC9, 0x83,\n\t0x6F, 0xCC, 0x83, 0xC9, 0x83, 0x6F, 0xCC, 0x84,\n\t0xC9, 0x83, 0x6F, 0xCC, 0x87, 0xC9, 0x83, 0x6F,\n\t0xCC, 0x88, 0xC9, 0x83, 0x6F, 0xCC, 0x9B, 0xAD,\n\t0x83, 0x6F, 0xCC, 0xA3, 0xB5, 0x83, 0x6F, 0xCC,\n\t// Bytes 4780 - 47bf\n\t0xA8, 0xA5, 0x83, 0x72, 0xCC, 0xA3, 0xB5, 0x83,\n\t0x73, 0xCC, 0x81, 0xC9, 0x83, 0x73, 0xCC, 0x8C,\n\t0xC9, 0x83, 0x73, 0xCC, 0xA3, 0xB5, 0x83, 0x75,\n\t0xCC, 0x83, 0xC9, 0x83, 0x75, 0xCC, 0x84, 0xC9,\n\t0x83, 0x75, 0xCC, 0x88, 0xC9, 0x83, 0x75, 0xCC,\n\t0x9B, 0xAD, 0x84, 0xCE, 0x91, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0x91, 0xCC, 0x94, 0xC9, 0x84, 0xCE,\n\t0x95, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x95, 0xCC,\n\t// Bytes 47c0 - 47ff\n\t0x94, 0xC9, 0x84, 0xCE, 0x97, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0x97, 0xCC, 0x94, 0xC9, 0x84, 0xCE,\n\t0x99, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0x99, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0x9F, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xC9, 0x84, 0xCE,\n\t0xA5, 0xCC, 0x94, 0xC9, 0x84, 0xCE, 0xA9, 0xCC,\n\t0x93, 0xC9, 0x84, 0xCE, 0xA9, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xC9, 0x84, 0xCE,\n\t// Bytes 4800 - 483f\n\t0xB1, 0xCC, 0x81, 0xC9, 0x84, 0xCE, 0xB1, 0xCC,\n\t0x93, 0xC9, 0x84, 0xCE, 0xB1, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xC9, 0x84, 0xCE,\n\t0xB5, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB5, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCC, 0x80, 0xC9,\n\t0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xC9, 0x84, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB7, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0xB7, 0xCD, 0x82, 0xC9,\n\t// Bytes 4840 - 487f\n\t0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xC9, 0x84, 0xCE,\n\t0xB9, 0xCC, 0x93, 0xC9, 0x84, 0xCE, 0xB9, 0xCC,\n\t0x94, 0xC9, 0x84, 0xCE, 0xBF, 0xCC, 0x93, 0xC9,\n\t0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xC9, 0x84, 0xCF,\n\t0x85, 0xCC, 0x88, 0xC9, 0x84, 0xCF, 0x85, 0xCC,\n\t0x93, 0xC9, 0x84, 0xCF, 0x85, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCF, 0x89, 0xCC, 0x80, 0xC9, 0x84, 0xCF,\n\t0x89, 0xCC, 0x81, 0xC9, 0x84, 0xCF, 0x89, 0xCC,\n\t// Bytes 4880 - 48bf\n\t0x93, 0xC9, 0x84, 0xCF, 0x89, 0xCC, 0x94, 0xC9,\n\t0x84, 0xCF, 0x89, 0xCD, 0x82, 0xC9, 0x86, 0xCE,\n\t0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t// Bytes 48c0 - 48ff\n\t0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t// Bytes 4900 - 493f\n\t0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t// Bytes 4940 - 497f\n\t0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCE,\n\t0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x86, 0xCF,\n\t// Bytes 4980 - 49bf\n\t0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCA, 0x86, 0xCF,\n\t0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCA, 0x42, 0xCC,\n\t0x80, 0xC9, 0x32, 0x42, 0xCC, 0x81, 0xC9, 0x32,\n\t0x42, 0xCC, 0x93, 0xC9, 0x32, 0x43, 0xE1, 0x85,\n\t// Bytes 49c0 - 49ff\n\t0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, 0x43,\n\t// Bytes 4a00 - 4a3f\n\t0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, 0x01,\n\t0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, 0x43,\n\t0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x85,\n\t0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, 0x01,\n\t// Bytes 4a40 - 4a7f\n\t0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, 0x43,\n\t0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x86,\n\t0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, 0x01,\n\t0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, 0x43,\n\t0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, 0x86,\n\t0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, 0x01,\n\t0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCA, 0x32,\n\t0x43, 0xE3, 0x82, 0x99, 0x0D, 0x03, 0x43, 0xE3,\n\t// Bytes 4a80 - 4abf\n\t0x82, 0x9A, 0x0D, 0x03, 0x46, 0xE0, 0xBD, 0xB1,\n\t0xE0, 0xBD, 0xB2, 0x9E, 0x26, 0x46, 0xE0, 0xBD,\n\t0xB1, 0xE0, 0xBD, 0xB4, 0xA2, 0x26, 0x46, 0xE0,\n\t0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x9E, 0x26, 0x00,\n\t0x01,\n}\n\n// lookup returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfcTrie) lookup(s []byte) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfcTrie) lookupUnsafe(s []byte) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfcValues[c0]\n\t}\n\ti := nfcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// lookupString returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfcTrie) lookupString(s string) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfcTrie) lookupStringUnsafe(s string) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfcValues[c0]\n\t}\n\ti := nfcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// nfcTrie. Total size: 10332 bytes (10.09 KiB). Checksum: 51cc525b297fc970.\ntype nfcTrie struct{}\n\nfunc newNfcTrie(i int) *nfcTrie {\n\treturn &nfcTrie{}\n}\n\n// lookupValue determines the type of block n and looks up the value for b.\nfunc (t *nfcTrie) lookupValue(n uint32, b byte) uint16 {\n\tswitch {\n\tcase n < 44:\n\t\treturn uint16(nfcValues[n<<6+uint32(b)])\n\tdefault:\n\t\tn -= 44\n\t\treturn uint16(nfcSparse.lookup(n, b))\n\t}\n}\n\n// nfcValues: 46 blocks, 2944 entries, 5888 bytes\n// The third block is the zero block.\nvar nfcValues = [2944]uint16{\n\t// Block 0x0, offset 0x0\n\t0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,\n\t// Block 0x1, offset 0x40\n\t0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,\n\t0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,\n\t0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,\n\t0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,\n\t0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,\n\t0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,\n\t0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,\n\t0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,\n\t0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,\n\t0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,\n\t0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,\n\t0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,\n\t0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,\n\t0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,\n\t0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,\n\t0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,\n\t0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,\n\t0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,\n\t0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,\n\t0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,\n\t// Block 0x4, offset 0x100\n\t0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,\n\t0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,\n\t0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,\n\t0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,\n\t0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,\n\t0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,\n\t0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,\n\t0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,\n\t0x130: 0x308c, 0x134: 0x30b4, 0x135: 0x33c0,\n\t0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,\n\t0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8,\n\t// Block 0x5, offset 0x140\n\t0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,\n\t0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f,\n\t0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,\n\t0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,\n\t0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,\n\t0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,\n\t0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,\n\t0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,\n\t0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,\n\t0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,\n\t0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0xa000,\n\t// Block 0x6, offset 0x180\n\t0x184: 0x8100, 0x185: 0x8100,\n\t0x186: 0x8100,\n\t0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,\n\t0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,\n\t0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,\n\t0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,\n\t0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,\n\t0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,\n\t0x1b0: 0x33c5, 0x1b4: 0x3028, 0x1b5: 0x3334,\n\t0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,\n\t0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,\n\t0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,\n\t0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,\n\t0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,\n\t0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,\n\t0x1de: 0x305a, 0x1df: 0x3366,\n\t0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,\n\t0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,\n\t0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,\n\t// Block 0x8, offset 0x200\n\t0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,\n\t0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,\n\t0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,\n\t0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,\n\t0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,\n\t0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,\n\t0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,\n\t0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,\n\t0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,\n\t0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,\n\t0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,\n\t0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,\n\t0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,\n\t0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,\n\t0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,\n\t0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,\n\t0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,\n\t0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,\n\t0x274: 0x0170,\n\t0x27a: 0x8100,\n\t0x27e: 0x0037,\n\t// Block 0xa, offset 0x280\n\t0x284: 0x8100, 0x285: 0x35a1,\n\t0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,\n\t0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,\n\t0x295: 0xa000, 0x297: 0xa000,\n\t0x299: 0xa000,\n\t0x29f: 0xa000, 0x2a1: 0xa000,\n\t0x2a5: 0xa000, 0x2a9: 0xa000,\n\t0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,\n\t0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,\n\t0x2b7: 0xa000, 0x2b9: 0xa000,\n\t0x2bf: 0xa000,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0x3721, 0x2c1: 0x372d, 0x2c3: 0x371b,\n\t0x2c6: 0xa000, 0x2c7: 0x3709,\n\t0x2cc: 0x375d, 0x2cd: 0x3745, 0x2ce: 0x376f, 0x2d0: 0xa000,\n\t0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000,\n\t0x2d8: 0xa000, 0x2d9: 0x3751, 0x2da: 0xa000,\n\t0x2de: 0xa000, 0x2e3: 0xa000,\n\t0x2e7: 0xa000,\n\t0x2eb: 0xa000, 0x2ed: 0xa000,\n\t0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000,\n\t0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x37d5, 0x2fa: 0xa000,\n\t0x2fe: 0xa000,\n\t// Block 0xc, offset 0x300\n\t0x301: 0x3733, 0x302: 0x37b7,\n\t0x310: 0x370f, 0x311: 0x3793,\n\t0x312: 0x3715, 0x313: 0x3799, 0x316: 0x3727, 0x317: 0x37ab,\n\t0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x3829, 0x31b: 0x382f, 0x31c: 0x3739, 0x31d: 0x37bd,\n\t0x31e: 0x373f, 0x31f: 0x37c3, 0x322: 0x374b, 0x323: 0x37cf,\n\t0x324: 0x3757, 0x325: 0x37db, 0x326: 0x3763, 0x327: 0x37e7, 0x328: 0xa000, 0x329: 0xa000,\n\t0x32a: 0x3835, 0x32b: 0x383b, 0x32c: 0x378d, 0x32d: 0x3811, 0x32e: 0x3769, 0x32f: 0x37ed,\n\t0x330: 0x3775, 0x331: 0x37f9, 0x332: 0x377b, 0x333: 0x37ff, 0x334: 0x3781, 0x335: 0x3805,\n\t0x338: 0x3787, 0x339: 0x380b,\n\t// Block 0xd, offset 0x340\n\t0x351: 0x812d,\n\t0x352: 0x8132, 0x353: 0x8132, 0x354: 0x8132, 0x355: 0x8132, 0x356: 0x812d, 0x357: 0x8132,\n\t0x358: 0x8132, 0x359: 0x8132, 0x35a: 0x812e, 0x35b: 0x812d, 0x35c: 0x8132, 0x35d: 0x8132,\n\t0x35e: 0x8132, 0x35f: 0x8132, 0x360: 0x8132, 0x361: 0x8132, 0x362: 0x812d, 0x363: 0x812d,\n\t0x364: 0x812d, 0x365: 0x812d, 0x366: 0x812d, 0x367: 0x812d, 0x368: 0x8132, 0x369: 0x8132,\n\t0x36a: 0x812d, 0x36b: 0x8132, 0x36c: 0x8132, 0x36d: 0x812e, 0x36e: 0x8131, 0x36f: 0x8132,\n\t0x370: 0x8105, 0x371: 0x8106, 0x372: 0x8107, 0x373: 0x8108, 0x374: 0x8109, 0x375: 0x810a,\n\t0x376: 0x810b, 0x377: 0x810c, 0x378: 0x810d, 0x379: 0x810e, 0x37a: 0x810e, 0x37b: 0x810f,\n\t0x37c: 0x8110, 0x37d: 0x8111, 0x37f: 0x8112,\n\t// Block 0xe, offset 0x380\n\t0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8116,\n\t0x38c: 0x8117, 0x38d: 0x8118, 0x38e: 0x8119, 0x38f: 0x811a, 0x390: 0x811b, 0x391: 0x811c,\n\t0x392: 0x811d, 0x393: 0x9932, 0x394: 0x9932, 0x395: 0x992d, 0x396: 0x812d, 0x397: 0x8132,\n\t0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x8132, 0x39b: 0x8132, 0x39c: 0x812d, 0x39d: 0x8132,\n\t0x39e: 0x8132, 0x39f: 0x812d,\n\t0x3b0: 0x811e,\n\t// Block 0xf, offset 0x3c0\n\t0x3c5: 0xa000,\n\t0x3c6: 0x2d26, 0x3c7: 0xa000, 0x3c8: 0x2d2e, 0x3c9: 0xa000, 0x3ca: 0x2d36, 0x3cb: 0xa000,\n\t0x3cc: 0x2d3e, 0x3cd: 0xa000, 0x3ce: 0x2d46, 0x3d1: 0xa000,\n\t0x3d2: 0x2d4e,\n\t0x3f4: 0x8102, 0x3f5: 0x9900,\n\t0x3fa: 0xa000, 0x3fb: 0x2d56,\n\t0x3fc: 0xa000, 0x3fd: 0x2d5e, 0x3fe: 0xa000, 0x3ff: 0xa000,\n\t// Block 0x10, offset 0x400\n\t0x400: 0x2f97, 0x401: 0x32a3, 0x402: 0x2fa1, 0x403: 0x32ad, 0x404: 0x2fa6, 0x405: 0x32b2,\n\t0x406: 0x2fab, 0x407: 0x32b7, 0x408: 0x38cc, 0x409: 0x3a5b, 0x40a: 0x2fc4, 0x40b: 0x32d0,\n\t0x40c: 0x2fce, 0x40d: 0x32da, 0x40e: 0x2fdd, 0x40f: 0x32e9, 0x410: 0x2fd3, 0x411: 0x32df,\n\t0x412: 0x2fd8, 0x413: 0x32e4, 0x414: 0x38ef, 0x415: 0x3a7e, 0x416: 0x38f6, 0x417: 0x3a85,\n\t0x418: 0x3019, 0x419: 0x3325, 0x41a: 0x301e, 0x41b: 0x332a, 0x41c: 0x3904, 0x41d: 0x3a93,\n\t0x41e: 0x3023, 0x41f: 0x332f, 0x420: 0x3032, 0x421: 0x333e, 0x422: 0x3050, 0x423: 0x335c,\n\t0x424: 0x305f, 0x425: 0x336b, 0x426: 0x3055, 0x427: 0x3361, 0x428: 0x3064, 0x429: 0x3370,\n\t0x42a: 0x3069, 0x42b: 0x3375, 0x42c: 0x30af, 0x42d: 0x33bb, 0x42e: 0x390b, 0x42f: 0x3a9a,\n\t0x430: 0x30b9, 0x431: 0x33ca, 0x432: 0x30c3, 0x433: 0x33d4, 0x434: 0x30cd, 0x435: 0x33de,\n\t0x436: 0x46c4, 0x437: 0x4755, 0x438: 0x3912, 0x439: 0x3aa1, 0x43a: 0x30e6, 0x43b: 0x33f7,\n\t0x43c: 0x30e1, 0x43d: 0x33f2, 0x43e: 0x30eb, 0x43f: 0x33fc,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x30f0, 0x441: 0x3401, 0x442: 0x30f5, 0x443: 0x3406, 0x444: 0x3109, 0x445: 0x341a,\n\t0x446: 0x3113, 0x447: 0x3424, 0x448: 0x3122, 0x449: 0x3433, 0x44a: 0x311d, 0x44b: 0x342e,\n\t0x44c: 0x3935, 0x44d: 0x3ac4, 0x44e: 0x3943, 0x44f: 0x3ad2, 0x450: 0x394a, 0x451: 0x3ad9,\n\t0x452: 0x3951, 0x453: 0x3ae0, 0x454: 0x314f, 0x455: 0x3460, 0x456: 0x3154, 0x457: 0x3465,\n\t0x458: 0x315e, 0x459: 0x346f, 0x45a: 0x46f1, 0x45b: 0x4782, 0x45c: 0x3997, 0x45d: 0x3b26,\n\t0x45e: 0x3177, 0x45f: 0x3488, 0x460: 0x3181, 0x461: 0x3492, 0x462: 0x4700, 0x463: 0x4791,\n\t0x464: 0x399e, 0x465: 0x3b2d, 0x466: 0x39a5, 0x467: 0x3b34, 0x468: 0x39ac, 0x469: 0x3b3b,\n\t0x46a: 0x3190, 0x46b: 0x34a1, 0x46c: 0x319a, 0x46d: 0x34b0, 0x46e: 0x31ae, 0x46f: 0x34c4,\n\t0x470: 0x31a9, 0x471: 0x34bf, 0x472: 0x31ea, 0x473: 0x3500, 0x474: 0x31f9, 0x475: 0x350f,\n\t0x476: 0x31f4, 0x477: 0x350a, 0x478: 0x39b3, 0x479: 0x3b42, 0x47a: 0x39ba, 0x47b: 0x3b49,\n\t0x47c: 0x31fe, 0x47d: 0x3514, 0x47e: 0x3203, 0x47f: 0x3519,\n\t// Block 0x12, offset 0x480\n\t0x480: 0x3208, 0x481: 0x351e, 0x482: 0x320d, 0x483: 0x3523, 0x484: 0x321c, 0x485: 0x3532,\n\t0x486: 0x3217, 0x487: 0x352d, 0x488: 0x3221, 0x489: 0x353c, 0x48a: 0x3226, 0x48b: 0x3541,\n\t0x48c: 0x322b, 0x48d: 0x3546, 0x48e: 0x3249, 0x48f: 0x3564, 0x490: 0x3262, 0x491: 0x3582,\n\t0x492: 0x3271, 0x493: 0x3591, 0x494: 0x3276, 0x495: 0x3596, 0x496: 0x337a, 0x497: 0x34a6,\n\t0x498: 0x3537, 0x499: 0x3573, 0x49b: 0x35d1,\n\t0x4a0: 0x46a1, 0x4a1: 0x4732, 0x4a2: 0x2f83, 0x4a3: 0x328f,\n\t0x4a4: 0x3878, 0x4a5: 0x3a07, 0x4a6: 0x3871, 0x4a7: 0x3a00, 0x4a8: 0x3886, 0x4a9: 0x3a15,\n\t0x4aa: 0x387f, 0x4ab: 0x3a0e, 0x4ac: 0x38be, 0x4ad: 0x3a4d, 0x4ae: 0x3894, 0x4af: 0x3a23,\n\t0x4b0: 0x388d, 0x4b1: 0x3a1c, 0x4b2: 0x38a2, 0x4b3: 0x3a31, 0x4b4: 0x389b, 0x4b5: 0x3a2a,\n\t0x4b6: 0x38c5, 0x4b7: 0x3a54, 0x4b8: 0x46b5, 0x4b9: 0x4746, 0x4ba: 0x3000, 0x4bb: 0x330c,\n\t0x4bc: 0x2fec, 0x4bd: 0x32f8, 0x4be: 0x38da, 0x4bf: 0x3a69,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0x38d3, 0x4c1: 0x3a62, 0x4c2: 0x38e8, 0x4c3: 0x3a77, 0x4c4: 0x38e1, 0x4c5: 0x3a70,\n\t0x4c6: 0x38fd, 0x4c7: 0x3a8c, 0x4c8: 0x3091, 0x4c9: 0x339d, 0x4ca: 0x30a5, 0x4cb: 0x33b1,\n\t0x4cc: 0x46e7, 0x4cd: 0x4778, 0x4ce: 0x3136, 0x4cf: 0x3447, 0x4d0: 0x3920, 0x4d1: 0x3aaf,\n\t0x4d2: 0x3919, 0x4d3: 0x3aa8, 0x4d4: 0x392e, 0x4d5: 0x3abd, 0x4d6: 0x3927, 0x4d7: 0x3ab6,\n\t0x4d8: 0x3989, 0x4d9: 0x3b18, 0x4da: 0x396d, 0x4db: 0x3afc, 0x4dc: 0x3966, 0x4dd: 0x3af5,\n\t0x4de: 0x397b, 0x4df: 0x3b0a, 0x4e0: 0x3974, 0x4e1: 0x3b03, 0x4e2: 0x3982, 0x4e3: 0x3b11,\n\t0x4e4: 0x31e5, 0x4e5: 0x34fb, 0x4e6: 0x31c7, 0x4e7: 0x34dd, 0x4e8: 0x39e4, 0x4e9: 0x3b73,\n\t0x4ea: 0x39dd, 0x4eb: 0x3b6c, 0x4ec: 0x39f2, 0x4ed: 0x3b81, 0x4ee: 0x39eb, 0x4ef: 0x3b7a,\n\t0x4f0: 0x39f9, 0x4f1: 0x3b88, 0x4f2: 0x3230, 0x4f3: 0x354b, 0x4f4: 0x3258, 0x4f5: 0x3578,\n\t0x4f6: 0x3253, 0x4f7: 0x356e, 0x4f8: 0x323f, 0x4f9: 0x355a,\n\t// Block 0x14, offset 0x500\n\t0x500: 0x4804, 0x501: 0x480a, 0x502: 0x491e, 0x503: 0x4936, 0x504: 0x4926, 0x505: 0x493e,\n\t0x506: 0x492e, 0x507: 0x4946, 0x508: 0x47aa, 0x509: 0x47b0, 0x50a: 0x488e, 0x50b: 0x48a6,\n\t0x50c: 0x4896, 0x50d: 0x48ae, 0x50e: 0x489e, 0x50f: 0x48b6, 0x510: 0x4816, 0x511: 0x481c,\n\t0x512: 0x3db8, 0x513: 0x3dc8, 0x514: 0x3dc0, 0x515: 0x3dd0,\n\t0x518: 0x47b6, 0x519: 0x47bc, 0x51a: 0x3ce8, 0x51b: 0x3cf8, 0x51c: 0x3cf0, 0x51d: 0x3d00,\n\t0x520: 0x482e, 0x521: 0x4834, 0x522: 0x494e, 0x523: 0x4966,\n\t0x524: 0x4956, 0x525: 0x496e, 0x526: 0x495e, 0x527: 0x4976, 0x528: 0x47c2, 0x529: 0x47c8,\n\t0x52a: 0x48be, 0x52b: 0x48d6, 0x52c: 0x48c6, 0x52d: 0x48de, 0x52e: 0x48ce, 0x52f: 0x48e6,\n\t0x530: 0x4846, 0x531: 0x484c, 0x532: 0x3e18, 0x533: 0x3e30, 0x534: 0x3e20, 0x535: 0x3e38,\n\t0x536: 0x3e28, 0x537: 0x3e40, 0x538: 0x47ce, 0x539: 0x47d4, 0x53a: 0x3d18, 0x53b: 0x3d30,\n\t0x53c: 0x3d20, 0x53d: 0x3d38, 0x53e: 0x3d28, 0x53f: 0x3d40,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x4852, 0x541: 0x4858, 0x542: 0x3e48, 0x543: 0x3e58, 0x544: 0x3e50, 0x545: 0x3e60,\n\t0x548: 0x47da, 0x549: 0x47e0, 0x54a: 0x3d48, 0x54b: 0x3d58,\n\t0x54c: 0x3d50, 0x54d: 0x3d60, 0x550: 0x4864, 0x551: 0x486a,\n\t0x552: 0x3e80, 0x553: 0x3e98, 0x554: 0x3e88, 0x555: 0x3ea0, 0x556: 0x3e90, 0x557: 0x3ea8,\n\t0x559: 0x47e6, 0x55b: 0x3d68, 0x55d: 0x3d70,\n\t0x55f: 0x3d78, 0x560: 0x487c, 0x561: 0x4882, 0x562: 0x497e, 0x563: 0x4996,\n\t0x564: 0x4986, 0x565: 0x499e, 0x566: 0x498e, 0x567: 0x49a6, 0x568: 0x47ec, 0x569: 0x47f2,\n\t0x56a: 0x48ee, 0x56b: 0x4906, 0x56c: 0x48f6, 0x56d: 0x490e, 0x56e: 0x48fe, 0x56f: 0x4916,\n\t0x570: 0x47f8, 0x571: 0x431e, 0x572: 0x3691, 0x573: 0x4324, 0x574: 0x4822, 0x575: 0x432a,\n\t0x576: 0x36a3, 0x577: 0x4330, 0x578: 0x36c1, 0x579: 0x4336, 0x57a: 0x36d9, 0x57b: 0x433c,\n\t0x57c: 0x4870, 0x57d: 0x4342,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x3da0, 0x581: 0x3da8, 0x582: 0x4184, 0x583: 0x41a2, 0x584: 0x418e, 0x585: 0x41ac,\n\t0x586: 0x4198, 0x587: 0x41b6, 0x588: 0x3cd8, 0x589: 0x3ce0, 0x58a: 0x40d0, 0x58b: 0x40ee,\n\t0x58c: 0x40da, 0x58d: 0x40f8, 0x58e: 0x40e4, 0x58f: 0x4102, 0x590: 0x3de8, 0x591: 0x3df0,\n\t0x592: 0x41c0, 0x593: 0x41de, 0x594: 0x41ca, 0x595: 0x41e8, 0x596: 0x41d4, 0x597: 0x41f2,\n\t0x598: 0x3d08, 0x599: 0x3d10, 0x59a: 0x410c, 0x59b: 0x412a, 0x59c: 0x4116, 0x59d: 0x4134,\n\t0x59e: 0x4120, 0x59f: 0x413e, 0x5a0: 0x3ec0, 0x5a1: 0x3ec8, 0x5a2: 0x41fc, 0x5a3: 0x421a,\n\t0x5a4: 0x4206, 0x5a5: 0x4224, 0x5a6: 0x4210, 0x5a7: 0x422e, 0x5a8: 0x3d80, 0x5a9: 0x3d88,\n\t0x5aa: 0x4148, 0x5ab: 0x4166, 0x5ac: 0x4152, 0x5ad: 0x4170, 0x5ae: 0x415c, 0x5af: 0x417a,\n\t0x5b0: 0x3685, 0x5b1: 0x367f, 0x5b2: 0x3d90, 0x5b3: 0x368b, 0x5b4: 0x3d98,\n\t0x5b6: 0x4810, 0x5b7: 0x3db0, 0x5b8: 0x35f5, 0x5b9: 0x35ef, 0x5ba: 0x35e3, 0x5bb: 0x42ee,\n\t0x5bc: 0x35fb, 0x5bd: 0x8100, 0x5be: 0x01d3, 0x5bf: 0xa100,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x8100, 0x5c1: 0x35a7, 0x5c2: 0x3dd8, 0x5c3: 0x369d, 0x5c4: 0x3de0,\n\t0x5c6: 0x483a, 0x5c7: 0x3df8, 0x5c8: 0x3601, 0x5c9: 0x42f4, 0x5ca: 0x360d, 0x5cb: 0x42fa,\n\t0x5cc: 0x3619, 0x5cd: 0x3b8f, 0x5ce: 0x3b96, 0x5cf: 0x3b9d, 0x5d0: 0x36b5, 0x5d1: 0x36af,\n\t0x5d2: 0x3e00, 0x5d3: 0x44e4, 0x5d6: 0x36bb, 0x5d7: 0x3e10,\n\t0x5d8: 0x3631, 0x5d9: 0x362b, 0x5da: 0x361f, 0x5db: 0x4300, 0x5dd: 0x3ba4,\n\t0x5de: 0x3bab, 0x5df: 0x3bb2, 0x5e0: 0x36eb, 0x5e1: 0x36e5, 0x5e2: 0x3e68, 0x5e3: 0x44ec,\n\t0x5e4: 0x36cd, 0x5e5: 0x36d3, 0x5e6: 0x36f1, 0x5e7: 0x3e78, 0x5e8: 0x3661, 0x5e9: 0x365b,\n\t0x5ea: 0x364f, 0x5eb: 0x430c, 0x5ec: 0x3649, 0x5ed: 0x359b, 0x5ee: 0x42e8, 0x5ef: 0x0081,\n\t0x5f2: 0x3eb0, 0x5f3: 0x36f7, 0x5f4: 0x3eb8,\n\t0x5f6: 0x4888, 0x5f7: 0x3ed0, 0x5f8: 0x363d, 0x5f9: 0x4306, 0x5fa: 0x366d, 0x5fb: 0x4318,\n\t0x5fc: 0x3679, 0x5fd: 0x4256, 0x5fe: 0xa100,\n\t// Block 0x18, offset 0x600\n\t0x601: 0x3c06, 0x603: 0xa000, 0x604: 0x3c0d, 0x605: 0xa000,\n\t0x607: 0x3c14, 0x608: 0xa000, 0x609: 0x3c1b,\n\t0x60d: 0xa000,\n\t0x620: 0x2f65, 0x621: 0xa000, 0x622: 0x3c29,\n\t0x624: 0xa000, 0x625: 0xa000,\n\t0x62d: 0x3c22, 0x62e: 0x2f60, 0x62f: 0x2f6a,\n\t0x630: 0x3c30, 0x631: 0x3c37, 0x632: 0xa000, 0x633: 0xa000, 0x634: 0x3c3e, 0x635: 0x3c45,\n\t0x636: 0xa000, 0x637: 0xa000, 0x638: 0x3c4c, 0x639: 0x3c53, 0x63a: 0xa000, 0x63b: 0xa000,\n\t0x63c: 0xa000, 0x63d: 0xa000,\n\t// Block 0x19, offset 0x640\n\t0x640: 0x3c5a, 0x641: 0x3c61, 0x642: 0xa000, 0x643: 0xa000, 0x644: 0x3c76, 0x645: 0x3c7d,\n\t0x646: 0xa000, 0x647: 0xa000, 0x648: 0x3c84, 0x649: 0x3c8b,\n\t0x651: 0xa000,\n\t0x652: 0xa000,\n\t0x662: 0xa000,\n\t0x668: 0xa000, 0x669: 0xa000,\n\t0x66b: 0xa000, 0x66c: 0x3ca0, 0x66d: 0x3ca7, 0x66e: 0x3cae, 0x66f: 0x3cb5,\n\t0x672: 0xa000, 0x673: 0xa000, 0x674: 0xa000, 0x675: 0xa000,\n\t// Block 0x1a, offset 0x680\n\t0x686: 0xa000, 0x68b: 0xa000,\n\t0x68c: 0x3f08, 0x68d: 0xa000, 0x68e: 0x3f10, 0x68f: 0xa000, 0x690: 0x3f18, 0x691: 0xa000,\n\t0x692: 0x3f20, 0x693: 0xa000, 0x694: 0x3f28, 0x695: 0xa000, 0x696: 0x3f30, 0x697: 0xa000,\n\t0x698: 0x3f38, 0x699: 0xa000, 0x69a: 0x3f40, 0x69b: 0xa000, 0x69c: 0x3f48, 0x69d: 0xa000,\n\t0x69e: 0x3f50, 0x69f: 0xa000, 0x6a0: 0x3f58, 0x6a1: 0xa000, 0x6a2: 0x3f60,\n\t0x6a4: 0xa000, 0x6a5: 0x3f68, 0x6a6: 0xa000, 0x6a7: 0x3f70, 0x6a8: 0xa000, 0x6a9: 0x3f78,\n\t0x6af: 0xa000,\n\t0x6b0: 0x3f80, 0x6b1: 0x3f88, 0x6b2: 0xa000, 0x6b3: 0x3f90, 0x6b4: 0x3f98, 0x6b5: 0xa000,\n\t0x6b6: 0x3fa0, 0x6b7: 0x3fa8, 0x6b8: 0xa000, 0x6b9: 0x3fb0, 0x6ba: 0x3fb8, 0x6bb: 0xa000,\n\t0x6bc: 0x3fc0, 0x6bd: 0x3fc8,\n\t// Block 0x1b, offset 0x6c0\n\t0x6d4: 0x3f00,\n\t0x6d9: 0x9903, 0x6da: 0x9903, 0x6db: 0x8100, 0x6dc: 0x8100, 0x6dd: 0xa000,\n\t0x6de: 0x3fd0,\n\t0x6e6: 0xa000,\n\t0x6eb: 0xa000, 0x6ec: 0x3fe0, 0x6ed: 0xa000, 0x6ee: 0x3fe8, 0x6ef: 0xa000,\n\t0x6f0: 0x3ff0, 0x6f1: 0xa000, 0x6f2: 0x3ff8, 0x6f3: 0xa000, 0x6f4: 0x4000, 0x6f5: 0xa000,\n\t0x6f6: 0x4008, 0x6f7: 0xa000, 0x6f8: 0x4010, 0x6f9: 0xa000, 0x6fa: 0x4018, 0x6fb: 0xa000,\n\t0x6fc: 0x4020, 0x6fd: 0xa000, 0x6fe: 0x4028, 0x6ff: 0xa000,\n\t// Block 0x1c, offset 0x700\n\t0x700: 0x4030, 0x701: 0xa000, 0x702: 0x4038, 0x704: 0xa000, 0x705: 0x4040,\n\t0x706: 0xa000, 0x707: 0x4048, 0x708: 0xa000, 0x709: 0x4050,\n\t0x70f: 0xa000, 0x710: 0x4058, 0x711: 0x4060,\n\t0x712: 0xa000, 0x713: 0x4068, 0x714: 0x4070, 0x715: 0xa000, 0x716: 0x4078, 0x717: 0x4080,\n\t0x718: 0xa000, 0x719: 0x4088, 0x71a: 0x4090, 0x71b: 0xa000, 0x71c: 0x4098, 0x71d: 0x40a0,\n\t0x72f: 0xa000,\n\t0x730: 0xa000, 0x731: 0xa000, 0x732: 0xa000, 0x734: 0x3fd8,\n\t0x737: 0x40a8, 0x738: 0x40b0, 0x739: 0x40b8, 0x73a: 0x40c0,\n\t0x73d: 0xa000, 0x73e: 0x40c8,\n\t// Block 0x1d, offset 0x740\n\t0x740: 0x1377, 0x741: 0x0cfb, 0x742: 0x13d3, 0x743: 0x139f, 0x744: 0x0e57, 0x745: 0x06eb,\n\t0x746: 0x08df, 0x747: 0x162b, 0x748: 0x162b, 0x749: 0x0a0b, 0x74a: 0x145f, 0x74b: 0x0943,\n\t0x74c: 0x0a07, 0x74d: 0x0bef, 0x74e: 0x0fcf, 0x74f: 0x115f, 0x750: 0x1297, 0x751: 0x12d3,\n\t0x752: 0x1307, 0x753: 0x141b, 0x754: 0x0d73, 0x755: 0x0dff, 0x756: 0x0eab, 0x757: 0x0f43,\n\t0x758: 0x125f, 0x759: 0x1447, 0x75a: 0x1573, 0x75b: 0x070f, 0x75c: 0x08b3, 0x75d: 0x0d87,\n\t0x75e: 0x0ecf, 0x75f: 0x1293, 0x760: 0x15c3, 0x761: 0x0ab3, 0x762: 0x0e77, 0x763: 0x1283,\n\t0x764: 0x1317, 0x765: 0x0c23, 0x766: 0x11bb, 0x767: 0x12df, 0x768: 0x0b1f, 0x769: 0x0d0f,\n\t0x76a: 0x0e17, 0x76b: 0x0f1b, 0x76c: 0x1427, 0x76d: 0x074f, 0x76e: 0x07e7, 0x76f: 0x0853,\n\t0x770: 0x0c8b, 0x771: 0x0d7f, 0x772: 0x0ecb, 0x773: 0x0fef, 0x774: 0x1177, 0x775: 0x128b,\n\t0x776: 0x12a3, 0x777: 0x13c7, 0x778: 0x14ef, 0x779: 0x15a3, 0x77a: 0x15bf, 0x77b: 0x102b,\n\t0x77c: 0x106b, 0x77d: 0x1123, 0x77e: 0x1243, 0x77f: 0x147b,\n\t// Block 0x1e, offset 0x780\n\t0x780: 0x15cb, 0x781: 0x134b, 0x782: 0x09c7, 0x783: 0x0b3b, 0x784: 0x10db, 0x785: 0x119b,\n\t0x786: 0x0eff, 0x787: 0x1033, 0x788: 0x1397, 0x789: 0x14e7, 0x78a: 0x09c3, 0x78b: 0x0a8f,\n\t0x78c: 0x0d77, 0x78d: 0x0e2b, 0x78e: 0x0e5f, 0x78f: 0x1113, 0x790: 0x113b, 0x791: 0x14a7,\n\t0x792: 0x084f, 0x793: 0x11a7, 0x794: 0x07f3, 0x795: 0x07ef, 0x796: 0x1097, 0x797: 0x1127,\n\t0x798: 0x125b, 0x799: 0x14af, 0x79a: 0x1367, 0x79b: 0x0c27, 0x79c: 0x0d73, 0x79d: 0x1357,\n\t0x79e: 0x06f7, 0x79f: 0x0a63, 0x7a0: 0x0b93, 0x7a1: 0x0f2f, 0x7a2: 0x0faf, 0x7a3: 0x0873,\n\t0x7a4: 0x103b, 0x7a5: 0x075f, 0x7a6: 0x0b77, 0x7a7: 0x06d7, 0x7a8: 0x0deb, 0x7a9: 0x0ca3,\n\t0x7aa: 0x110f, 0x7ab: 0x08c7, 0x7ac: 0x09b3, 0x7ad: 0x0ffb, 0x7ae: 0x1263, 0x7af: 0x133b,\n\t0x7b0: 0x0db7, 0x7b1: 0x13f7, 0x7b2: 0x0de3, 0x7b3: 0x0c37, 0x7b4: 0x121b, 0x7b5: 0x0c57,\n\t0x7b6: 0x0fab, 0x7b7: 0x072b, 0x7b8: 0x07a7, 0x7b9: 0x07eb, 0x7ba: 0x0d53, 0x7bb: 0x10fb,\n\t0x7bc: 0x11f3, 0x7bd: 0x1347, 0x7be: 0x145b, 0x7bf: 0x085b,\n\t// Block 0x1f, offset 0x7c0\n\t0x7c0: 0x090f, 0x7c1: 0x0a17, 0x7c2: 0x0b2f, 0x7c3: 0x0cbf, 0x7c4: 0x0e7b, 0x7c5: 0x103f,\n\t0x7c6: 0x1497, 0x7c7: 0x157b, 0x7c8: 0x15cf, 0x7c9: 0x15e7, 0x7ca: 0x0837, 0x7cb: 0x0cf3,\n\t0x7cc: 0x0da3, 0x7cd: 0x13eb, 0x7ce: 0x0afb, 0x7cf: 0x0bd7, 0x7d0: 0x0bf3, 0x7d1: 0x0c83,\n\t0x7d2: 0x0e6b, 0x7d3: 0x0eb7, 0x7d4: 0x0f67, 0x7d5: 0x108b, 0x7d6: 0x112f, 0x7d7: 0x1193,\n\t0x7d8: 0x13db, 0x7d9: 0x126b, 0x7da: 0x1403, 0x7db: 0x147f, 0x7dc: 0x080f, 0x7dd: 0x083b,\n\t0x7de: 0x0923, 0x7df: 0x0ea7, 0x7e0: 0x12f3, 0x7e1: 0x133b, 0x7e2: 0x0b1b, 0x7e3: 0x0b8b,\n\t0x7e4: 0x0c4f, 0x7e5: 0x0daf, 0x7e6: 0x10d7, 0x7e7: 0x0f23, 0x7e8: 0x073b, 0x7e9: 0x097f,\n\t0x7ea: 0x0a63, 0x7eb: 0x0ac7, 0x7ec: 0x0b97, 0x7ed: 0x0f3f, 0x7ee: 0x0f5b, 0x7ef: 0x116b,\n\t0x7f0: 0x118b, 0x7f1: 0x1463, 0x7f2: 0x14e3, 0x7f3: 0x14f3, 0x7f4: 0x152f, 0x7f5: 0x0753,\n\t0x7f6: 0x107f, 0x7f7: 0x144f, 0x7f8: 0x14cb, 0x7f9: 0x0baf, 0x7fa: 0x0717, 0x7fb: 0x0777,\n\t0x7fc: 0x0a67, 0x7fd: 0x0a87, 0x7fe: 0x0caf, 0x7ff: 0x0d73,\n\t// Block 0x20, offset 0x800\n\t0x800: 0x0ec3, 0x801: 0x0fcb, 0x802: 0x1277, 0x803: 0x1417, 0x804: 0x1623, 0x805: 0x0ce3,\n\t0x806: 0x14a3, 0x807: 0x0833, 0x808: 0x0d2f, 0x809: 0x0d3b, 0x80a: 0x0e0f, 0x80b: 0x0e47,\n\t0x80c: 0x0f4b, 0x80d: 0x0fa7, 0x80e: 0x1027, 0x80f: 0x110b, 0x810: 0x153b, 0x811: 0x07af,\n\t0x812: 0x0c03, 0x813: 0x14b3, 0x814: 0x0767, 0x815: 0x0aab, 0x816: 0x0e2f, 0x817: 0x13df,\n\t0x818: 0x0b67, 0x819: 0x0bb7, 0x81a: 0x0d43, 0x81b: 0x0f2f, 0x81c: 0x14bb, 0x81d: 0x0817,\n\t0x81e: 0x08ff, 0x81f: 0x0a97, 0x820: 0x0cd3, 0x821: 0x0d1f, 0x822: 0x0d5f, 0x823: 0x0df3,\n\t0x824: 0x0f47, 0x825: 0x0fbb, 0x826: 0x1157, 0x827: 0x12f7, 0x828: 0x1303, 0x829: 0x1457,\n\t0x82a: 0x14d7, 0x82b: 0x0883, 0x82c: 0x0e4b, 0x82d: 0x0903, 0x82e: 0x0ec7, 0x82f: 0x0f6b,\n\t0x830: 0x1287, 0x831: 0x14bf, 0x832: 0x15ab, 0x833: 0x15d3, 0x834: 0x0d37, 0x835: 0x0e27,\n\t0x836: 0x11c3, 0x837: 0x10b7, 0x838: 0x10c3, 0x839: 0x10e7, 0x83a: 0x0f17, 0x83b: 0x0e9f,\n\t0x83c: 0x1363, 0x83d: 0x0733, 0x83e: 0x122b, 0x83f: 0x081b,\n\t// Block 0x21, offset 0x840\n\t0x840: 0x080b, 0x841: 0x0b0b, 0x842: 0x0c2b, 0x843: 0x10f3, 0x844: 0x0a53, 0x845: 0x0e03,\n\t0x846: 0x0cef, 0x847: 0x13e7, 0x848: 0x12e7, 0x849: 0x14ab, 0x84a: 0x1323, 0x84b: 0x0b27,\n\t0x84c: 0x0787, 0x84d: 0x095b, 0x850: 0x09af,\n\t0x852: 0x0cdf, 0x855: 0x07f7, 0x856: 0x0f1f, 0x857: 0x0fe3,\n\t0x858: 0x1047, 0x859: 0x1063, 0x85a: 0x1067, 0x85b: 0x107b, 0x85c: 0x14fb, 0x85d: 0x10eb,\n\t0x85e: 0x116f, 0x860: 0x128f, 0x862: 0x1353,\n\t0x865: 0x1407, 0x866: 0x1433,\n\t0x86a: 0x154f, 0x86b: 0x1553, 0x86c: 0x1557, 0x86d: 0x15bb, 0x86e: 0x142b, 0x86f: 0x14c7,\n\t0x870: 0x0757, 0x871: 0x077b, 0x872: 0x078f, 0x873: 0x084b, 0x874: 0x0857, 0x875: 0x0897,\n\t0x876: 0x094b, 0x877: 0x0967, 0x878: 0x096f, 0x879: 0x09ab, 0x87a: 0x09b7, 0x87b: 0x0a93,\n\t0x87c: 0x0a9b, 0x87d: 0x0ba3, 0x87e: 0x0bcb, 0x87f: 0x0bd3,\n\t// Block 0x22, offset 0x880\n\t0x880: 0x0beb, 0x881: 0x0c97, 0x882: 0x0cc7, 0x883: 0x0ce7, 0x884: 0x0d57, 0x885: 0x0e1b,\n\t0x886: 0x0e37, 0x887: 0x0e67, 0x888: 0x0ebb, 0x889: 0x0edb, 0x88a: 0x0f4f, 0x88b: 0x102f,\n\t0x88c: 0x104b, 0x88d: 0x1053, 0x88e: 0x104f, 0x88f: 0x1057, 0x890: 0x105b, 0x891: 0x105f,\n\t0x892: 0x1073, 0x893: 0x1077, 0x894: 0x109b, 0x895: 0x10af, 0x896: 0x10cb, 0x897: 0x112f,\n\t0x898: 0x1137, 0x899: 0x113f, 0x89a: 0x1153, 0x89b: 0x117b, 0x89c: 0x11cb, 0x89d: 0x11ff,\n\t0x89e: 0x11ff, 0x89f: 0x1267, 0x8a0: 0x130f, 0x8a1: 0x1327, 0x8a2: 0x135b, 0x8a3: 0x135f,\n\t0x8a4: 0x13a3, 0x8a5: 0x13a7, 0x8a6: 0x13ff, 0x8a7: 0x1407, 0x8a8: 0x14db, 0x8a9: 0x151f,\n\t0x8aa: 0x1537, 0x8ab: 0x0b9b, 0x8ac: 0x171e, 0x8ad: 0x11e3,\n\t0x8b0: 0x06df, 0x8b1: 0x07e3, 0x8b2: 0x07a3, 0x8b3: 0x074b, 0x8b4: 0x078b, 0x8b5: 0x07b7,\n\t0x8b6: 0x0847, 0x8b7: 0x0863, 0x8b8: 0x094b, 0x8b9: 0x0937, 0x8ba: 0x0947, 0x8bb: 0x0963,\n\t0x8bc: 0x09af, 0x8bd: 0x09bf, 0x8be: 0x0a03, 0x8bf: 0x0a0f,\n\t// Block 0x23, offset 0x8c0\n\t0x8c0: 0x0a2b, 0x8c1: 0x0a3b, 0x8c2: 0x0b23, 0x8c3: 0x0b2b, 0x8c4: 0x0b5b, 0x8c5: 0x0b7b,\n\t0x8c6: 0x0bab, 0x8c7: 0x0bc3, 0x8c8: 0x0bb3, 0x8c9: 0x0bd3, 0x8ca: 0x0bc7, 0x8cb: 0x0beb,\n\t0x8cc: 0x0c07, 0x8cd: 0x0c5f, 0x8ce: 0x0c6b, 0x8cf: 0x0c73, 0x8d0: 0x0c9b, 0x8d1: 0x0cdf,\n\t0x8d2: 0x0d0f, 0x8d3: 0x0d13, 0x8d4: 0x0d27, 0x8d5: 0x0da7, 0x8d6: 0x0db7, 0x8d7: 0x0e0f,\n\t0x8d8: 0x0e5b, 0x8d9: 0x0e53, 0x8da: 0x0e67, 0x8db: 0x0e83, 0x8dc: 0x0ebb, 0x8dd: 0x1013,\n\t0x8de: 0x0edf, 0x8df: 0x0f13, 0x8e0: 0x0f1f, 0x8e1: 0x0f5f, 0x8e2: 0x0f7b, 0x8e3: 0x0f9f,\n\t0x8e4: 0x0fc3, 0x8e5: 0x0fc7, 0x8e6: 0x0fe3, 0x8e7: 0x0fe7, 0x8e8: 0x0ff7, 0x8e9: 0x100b,\n\t0x8ea: 0x1007, 0x8eb: 0x1037, 0x8ec: 0x10b3, 0x8ed: 0x10cb, 0x8ee: 0x10e3, 0x8ef: 0x111b,\n\t0x8f0: 0x112f, 0x8f1: 0x114b, 0x8f2: 0x117b, 0x8f3: 0x122f, 0x8f4: 0x1257, 0x8f5: 0x12cb,\n\t0x8f6: 0x1313, 0x8f7: 0x131f, 0x8f8: 0x1327, 0x8f9: 0x133f, 0x8fa: 0x1353, 0x8fb: 0x1343,\n\t0x8fc: 0x135b, 0x8fd: 0x1357, 0x8fe: 0x134f, 0x8ff: 0x135f,\n\t// Block 0x24, offset 0x900\n\t0x900: 0x136b, 0x901: 0x13a7, 0x902: 0x13e3, 0x903: 0x1413, 0x904: 0x144b, 0x905: 0x146b,\n\t0x906: 0x14b7, 0x907: 0x14db, 0x908: 0x14fb, 0x909: 0x150f, 0x90a: 0x151f, 0x90b: 0x152b,\n\t0x90c: 0x1537, 0x90d: 0x158b, 0x90e: 0x162b, 0x90f: 0x16b5, 0x910: 0x16b0, 0x911: 0x16e2,\n\t0x912: 0x0607, 0x913: 0x062f, 0x914: 0x0633, 0x915: 0x1764, 0x916: 0x1791, 0x917: 0x1809,\n\t0x918: 0x1617, 0x919: 0x1627,\n\t// Block 0x25, offset 0x940\n\t0x940: 0x06fb, 0x941: 0x06f3, 0x942: 0x0703, 0x943: 0x1647, 0x944: 0x0747, 0x945: 0x0757,\n\t0x946: 0x075b, 0x947: 0x0763, 0x948: 0x076b, 0x949: 0x076f, 0x94a: 0x077b, 0x94b: 0x0773,\n\t0x94c: 0x05b3, 0x94d: 0x165b, 0x94e: 0x078f, 0x94f: 0x0793, 0x950: 0x0797, 0x951: 0x07b3,\n\t0x952: 0x164c, 0x953: 0x05b7, 0x954: 0x079f, 0x955: 0x07bf, 0x956: 0x1656, 0x957: 0x07cf,\n\t0x958: 0x07d7, 0x959: 0x0737, 0x95a: 0x07df, 0x95b: 0x07e3, 0x95c: 0x1831, 0x95d: 0x07ff,\n\t0x95e: 0x0807, 0x95f: 0x05bf, 0x960: 0x081f, 0x961: 0x0823, 0x962: 0x082b, 0x963: 0x082f,\n\t0x964: 0x05c3, 0x965: 0x0847, 0x966: 0x084b, 0x967: 0x0857, 0x968: 0x0863, 0x969: 0x0867,\n\t0x96a: 0x086b, 0x96b: 0x0873, 0x96c: 0x0893, 0x96d: 0x0897, 0x96e: 0x089f, 0x96f: 0x08af,\n\t0x970: 0x08b7, 0x971: 0x08bb, 0x972: 0x08bb, 0x973: 0x08bb, 0x974: 0x166a, 0x975: 0x0e93,\n\t0x976: 0x08cf, 0x977: 0x08d7, 0x978: 0x166f, 0x979: 0x08e3, 0x97a: 0x08eb, 0x97b: 0x08f3,\n\t0x97c: 0x091b, 0x97d: 0x0907, 0x97e: 0x0913, 0x97f: 0x0917,\n\t// Block 0x26, offset 0x980\n\t0x980: 0x091f, 0x981: 0x0927, 0x982: 0x092b, 0x983: 0x0933, 0x984: 0x093b, 0x985: 0x093f,\n\t0x986: 0x093f, 0x987: 0x0947, 0x988: 0x094f, 0x989: 0x0953, 0x98a: 0x095f, 0x98b: 0x0983,\n\t0x98c: 0x0967, 0x98d: 0x0987, 0x98e: 0x096b, 0x98f: 0x0973, 0x990: 0x080b, 0x991: 0x09cf,\n\t0x992: 0x0997, 0x993: 0x099b, 0x994: 0x099f, 0x995: 0x0993, 0x996: 0x09a7, 0x997: 0x09a3,\n\t0x998: 0x09bb, 0x999: 0x1674, 0x99a: 0x09d7, 0x99b: 0x09db, 0x99c: 0x09e3, 0x99d: 0x09ef,\n\t0x99e: 0x09f7, 0x99f: 0x0a13, 0x9a0: 0x1679, 0x9a1: 0x167e, 0x9a2: 0x0a1f, 0x9a3: 0x0a23,\n\t0x9a4: 0x0a27, 0x9a5: 0x0a1b, 0x9a6: 0x0a2f, 0x9a7: 0x05c7, 0x9a8: 0x05cb, 0x9a9: 0x0a37,\n\t0x9aa: 0x0a3f, 0x9ab: 0x0a3f, 0x9ac: 0x1683, 0x9ad: 0x0a5b, 0x9ae: 0x0a5f, 0x9af: 0x0a63,\n\t0x9b0: 0x0a6b, 0x9b1: 0x1688, 0x9b2: 0x0a73, 0x9b3: 0x0a77, 0x9b4: 0x0b4f, 0x9b5: 0x0a7f,\n\t0x9b6: 0x05cf, 0x9b7: 0x0a8b, 0x9b8: 0x0a9b, 0x9b9: 0x0aa7, 0x9ba: 0x0aa3, 0x9bb: 0x1692,\n\t0x9bc: 0x0aaf, 0x9bd: 0x1697, 0x9be: 0x0abb, 0x9bf: 0x0ab7,\n\t// Block 0x27, offset 0x9c0\n\t0x9c0: 0x0abf, 0x9c1: 0x0acf, 0x9c2: 0x0ad3, 0x9c3: 0x05d3, 0x9c4: 0x0ae3, 0x9c5: 0x0aeb,\n\t0x9c6: 0x0aef, 0x9c7: 0x0af3, 0x9c8: 0x05d7, 0x9c9: 0x169c, 0x9ca: 0x05db, 0x9cb: 0x0b0f,\n\t0x9cc: 0x0b13, 0x9cd: 0x0b17, 0x9ce: 0x0b1f, 0x9cf: 0x1863, 0x9d0: 0x0b37, 0x9d1: 0x16a6,\n\t0x9d2: 0x16a6, 0x9d3: 0x11d7, 0x9d4: 0x0b47, 0x9d5: 0x0b47, 0x9d6: 0x05df, 0x9d7: 0x16c9,\n\t0x9d8: 0x179b, 0x9d9: 0x0b57, 0x9da: 0x0b5f, 0x9db: 0x05e3, 0x9dc: 0x0b73, 0x9dd: 0x0b83,\n\t0x9de: 0x0b87, 0x9df: 0x0b8f, 0x9e0: 0x0b9f, 0x9e1: 0x05eb, 0x9e2: 0x05e7, 0x9e3: 0x0ba3,\n\t0x9e4: 0x16ab, 0x9e5: 0x0ba7, 0x9e6: 0x0bbb, 0x9e7: 0x0bbf, 0x9e8: 0x0bc3, 0x9e9: 0x0bbf,\n\t0x9ea: 0x0bcf, 0x9eb: 0x0bd3, 0x9ec: 0x0be3, 0x9ed: 0x0bdb, 0x9ee: 0x0bdf, 0x9ef: 0x0be7,\n\t0x9f0: 0x0beb, 0x9f1: 0x0bef, 0x9f2: 0x0bfb, 0x9f3: 0x0bff, 0x9f4: 0x0c17, 0x9f5: 0x0c1f,\n\t0x9f6: 0x0c2f, 0x9f7: 0x0c43, 0x9f8: 0x16ba, 0x9f9: 0x0c3f, 0x9fa: 0x0c33, 0x9fb: 0x0c4b,\n\t0x9fc: 0x0c53, 0x9fd: 0x0c67, 0x9fe: 0x16bf, 0x9ff: 0x0c6f,\n\t// Block 0x28, offset 0xa00\n\t0xa00: 0x0c63, 0xa01: 0x0c5b, 0xa02: 0x05ef, 0xa03: 0x0c77, 0xa04: 0x0c7f, 0xa05: 0x0c87,\n\t0xa06: 0x0c7b, 0xa07: 0x05f3, 0xa08: 0x0c97, 0xa09: 0x0c9f, 0xa0a: 0x16c4, 0xa0b: 0x0ccb,\n\t0xa0c: 0x0cff, 0xa0d: 0x0cdb, 0xa0e: 0x05ff, 0xa0f: 0x0ce7, 0xa10: 0x05fb, 0xa11: 0x05f7,\n\t0xa12: 0x07c3, 0xa13: 0x07c7, 0xa14: 0x0d03, 0xa15: 0x0ceb, 0xa16: 0x11ab, 0xa17: 0x0663,\n\t0xa18: 0x0d0f, 0xa19: 0x0d13, 0xa1a: 0x0d17, 0xa1b: 0x0d2b, 0xa1c: 0x0d23, 0xa1d: 0x16dd,\n\t0xa1e: 0x0603, 0xa1f: 0x0d3f, 0xa20: 0x0d33, 0xa21: 0x0d4f, 0xa22: 0x0d57, 0xa23: 0x16e7,\n\t0xa24: 0x0d5b, 0xa25: 0x0d47, 0xa26: 0x0d63, 0xa27: 0x0607, 0xa28: 0x0d67, 0xa29: 0x0d6b,\n\t0xa2a: 0x0d6f, 0xa2b: 0x0d7b, 0xa2c: 0x16ec, 0xa2d: 0x0d83, 0xa2e: 0x060b, 0xa2f: 0x0d8f,\n\t0xa30: 0x16f1, 0xa31: 0x0d93, 0xa32: 0x060f, 0xa33: 0x0d9f, 0xa34: 0x0dab, 0xa35: 0x0db7,\n\t0xa36: 0x0dbb, 0xa37: 0x16f6, 0xa38: 0x168d, 0xa39: 0x16fb, 0xa3a: 0x0ddb, 0xa3b: 0x1700,\n\t0xa3c: 0x0de7, 0xa3d: 0x0def, 0xa3e: 0x0ddf, 0xa3f: 0x0dfb,\n\t// Block 0x29, offset 0xa40\n\t0xa40: 0x0e0b, 0xa41: 0x0e1b, 0xa42: 0x0e0f, 0xa43: 0x0e13, 0xa44: 0x0e1f, 0xa45: 0x0e23,\n\t0xa46: 0x1705, 0xa47: 0x0e07, 0xa48: 0x0e3b, 0xa49: 0x0e3f, 0xa4a: 0x0613, 0xa4b: 0x0e53,\n\t0xa4c: 0x0e4f, 0xa4d: 0x170a, 0xa4e: 0x0e33, 0xa4f: 0x0e6f, 0xa50: 0x170f, 0xa51: 0x1714,\n\t0xa52: 0x0e73, 0xa53: 0x0e87, 0xa54: 0x0e83, 0xa55: 0x0e7f, 0xa56: 0x0617, 0xa57: 0x0e8b,\n\t0xa58: 0x0e9b, 0xa59: 0x0e97, 0xa5a: 0x0ea3, 0xa5b: 0x1651, 0xa5c: 0x0eb3, 0xa5d: 0x1719,\n\t0xa5e: 0x0ebf, 0xa5f: 0x1723, 0xa60: 0x0ed3, 0xa61: 0x0edf, 0xa62: 0x0ef3, 0xa63: 0x1728,\n\t0xa64: 0x0f07, 0xa65: 0x0f0b, 0xa66: 0x172d, 0xa67: 0x1732, 0xa68: 0x0f27, 0xa69: 0x0f37,\n\t0xa6a: 0x061b, 0xa6b: 0x0f3b, 0xa6c: 0x061f, 0xa6d: 0x061f, 0xa6e: 0x0f53, 0xa6f: 0x0f57,\n\t0xa70: 0x0f5f, 0xa71: 0x0f63, 0xa72: 0x0f6f, 0xa73: 0x0623, 0xa74: 0x0f87, 0xa75: 0x1737,\n\t0xa76: 0x0fa3, 0xa77: 0x173c, 0xa78: 0x0faf, 0xa79: 0x16a1, 0xa7a: 0x0fbf, 0xa7b: 0x1741,\n\t0xa7c: 0x1746, 0xa7d: 0x174b, 0xa7e: 0x0627, 0xa7f: 0x062b,\n\t// Block 0x2a, offset 0xa80\n\t0xa80: 0x0ff7, 0xa81: 0x1755, 0xa82: 0x1750, 0xa83: 0x175a, 0xa84: 0x175f, 0xa85: 0x0fff,\n\t0xa86: 0x1003, 0xa87: 0x1003, 0xa88: 0x100b, 0xa89: 0x0633, 0xa8a: 0x100f, 0xa8b: 0x0637,\n\t0xa8c: 0x063b, 0xa8d: 0x1769, 0xa8e: 0x1023, 0xa8f: 0x102b, 0xa90: 0x1037, 0xa91: 0x063f,\n\t0xa92: 0x176e, 0xa93: 0x105b, 0xa94: 0x1773, 0xa95: 0x1778, 0xa96: 0x107b, 0xa97: 0x1093,\n\t0xa98: 0x0643, 0xa99: 0x109b, 0xa9a: 0x109f, 0xa9b: 0x10a3, 0xa9c: 0x177d, 0xa9d: 0x1782,\n\t0xa9e: 0x1782, 0xa9f: 0x10bb, 0xaa0: 0x0647, 0xaa1: 0x1787, 0xaa2: 0x10cf, 0xaa3: 0x10d3,\n\t0xaa4: 0x064b, 0xaa5: 0x178c, 0xaa6: 0x10ef, 0xaa7: 0x064f, 0xaa8: 0x10ff, 0xaa9: 0x10f7,\n\t0xaaa: 0x1107, 0xaab: 0x1796, 0xaac: 0x111f, 0xaad: 0x0653, 0xaae: 0x112b, 0xaaf: 0x1133,\n\t0xab0: 0x1143, 0xab1: 0x0657, 0xab2: 0x17a0, 0xab3: 0x17a5, 0xab4: 0x065b, 0xab5: 0x17aa,\n\t0xab6: 0x115b, 0xab7: 0x17af, 0xab8: 0x1167, 0xab9: 0x1173, 0xaba: 0x117b, 0xabb: 0x17b4,\n\t0xabc: 0x17b9, 0xabd: 0x118f, 0xabe: 0x17be, 0xabf: 0x1197,\n\t// Block 0x2b, offset 0xac0\n\t0xac0: 0x16ce, 0xac1: 0x065f, 0xac2: 0x11af, 0xac3: 0x11b3, 0xac4: 0x0667, 0xac5: 0x11b7,\n\t0xac6: 0x0a33, 0xac7: 0x17c3, 0xac8: 0x17c8, 0xac9: 0x16d3, 0xaca: 0x16d8, 0xacb: 0x11d7,\n\t0xacc: 0x11db, 0xacd: 0x13f3, 0xace: 0x066b, 0xacf: 0x1207, 0xad0: 0x1203, 0xad1: 0x120b,\n\t0xad2: 0x083f, 0xad3: 0x120f, 0xad4: 0x1213, 0xad5: 0x1217, 0xad6: 0x121f, 0xad7: 0x17cd,\n\t0xad8: 0x121b, 0xad9: 0x1223, 0xada: 0x1237, 0xadb: 0x123b, 0xadc: 0x1227, 0xadd: 0x123f,\n\t0xade: 0x1253, 0xadf: 0x1267, 0xae0: 0x1233, 0xae1: 0x1247, 0xae2: 0x124b, 0xae3: 0x124f,\n\t0xae4: 0x17d2, 0xae5: 0x17dc, 0xae6: 0x17d7, 0xae7: 0x066f, 0xae8: 0x126f, 0xae9: 0x1273,\n\t0xaea: 0x127b, 0xaeb: 0x17f0, 0xaec: 0x127f, 0xaed: 0x17e1, 0xaee: 0x0673, 0xaef: 0x0677,\n\t0xaf0: 0x17e6, 0xaf1: 0x17eb, 0xaf2: 0x067b, 0xaf3: 0x129f, 0xaf4: 0x12a3, 0xaf5: 0x12a7,\n\t0xaf6: 0x12ab, 0xaf7: 0x12b7, 0xaf8: 0x12b3, 0xaf9: 0x12bf, 0xafa: 0x12bb, 0xafb: 0x12cb,\n\t0xafc: 0x12c3, 0xafd: 0x12c7, 0xafe: 0x12cf, 0xaff: 0x067f,\n\t// Block 0x2c, offset 0xb00\n\t0xb00: 0x12d7, 0xb01: 0x12db, 0xb02: 0x0683, 0xb03: 0x12eb, 0xb04: 0x12ef, 0xb05: 0x17f5,\n\t0xb06: 0x12fb, 0xb07: 0x12ff, 0xb08: 0x0687, 0xb09: 0x130b, 0xb0a: 0x05bb, 0xb0b: 0x17fa,\n\t0xb0c: 0x17ff, 0xb0d: 0x068b, 0xb0e: 0x068f, 0xb0f: 0x1337, 0xb10: 0x134f, 0xb11: 0x136b,\n\t0xb12: 0x137b, 0xb13: 0x1804, 0xb14: 0x138f, 0xb15: 0x1393, 0xb16: 0x13ab, 0xb17: 0x13b7,\n\t0xb18: 0x180e, 0xb19: 0x1660, 0xb1a: 0x13c3, 0xb1b: 0x13bf, 0xb1c: 0x13cb, 0xb1d: 0x1665,\n\t0xb1e: 0x13d7, 0xb1f: 0x13e3, 0xb20: 0x1813, 0xb21: 0x1818, 0xb22: 0x1423, 0xb23: 0x142f,\n\t0xb24: 0x1437, 0xb25: 0x181d, 0xb26: 0x143b, 0xb27: 0x1467, 0xb28: 0x1473, 0xb29: 0x1477,\n\t0xb2a: 0x146f, 0xb2b: 0x1483, 0xb2c: 0x1487, 0xb2d: 0x1822, 0xb2e: 0x1493, 0xb2f: 0x0693,\n\t0xb30: 0x149b, 0xb31: 0x1827, 0xb32: 0x0697, 0xb33: 0x14d3, 0xb34: 0x0ac3, 0xb35: 0x14eb,\n\t0xb36: 0x182c, 0xb37: 0x1836, 0xb38: 0x069b, 0xb39: 0x069f, 0xb3a: 0x1513, 0xb3b: 0x183b,\n\t0xb3c: 0x06a3, 0xb3d: 0x1840, 0xb3e: 0x152b, 0xb3f: 0x152b,\n\t// Block 0x2d, offset 0xb40\n\t0xb40: 0x1533, 0xb41: 0x1845, 0xb42: 0x154b, 0xb43: 0x06a7, 0xb44: 0x155b, 0xb45: 0x1567,\n\t0xb46: 0x156f, 0xb47: 0x1577, 0xb48: 0x06ab, 0xb49: 0x184a, 0xb4a: 0x158b, 0xb4b: 0x15a7,\n\t0xb4c: 0x15b3, 0xb4d: 0x06af, 0xb4e: 0x06b3, 0xb4f: 0x15b7, 0xb50: 0x184f, 0xb51: 0x06b7,\n\t0xb52: 0x1854, 0xb53: 0x1859, 0xb54: 0x185e, 0xb55: 0x15db, 0xb56: 0x06bb, 0xb57: 0x15ef,\n\t0xb58: 0x15f7, 0xb59: 0x15fb, 0xb5a: 0x1603, 0xb5b: 0x160b, 0xb5c: 0x1613, 0xb5d: 0x1868,\n}\n\n// nfcIndex: 22 blocks, 1408 entries, 1408 bytes\n// Block 0 is the zero block.\nvar nfcIndex = [1408]uint8{\n\t// Block 0x0, offset 0x0\n\t// Block 0x1, offset 0x40\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc2: 0x2c, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2d, 0xc7: 0x04,\n\t0xc8: 0x05, 0xca: 0x2e, 0xcb: 0x2f, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x30,\n\t0xd0: 0x09, 0xd1: 0x31, 0xd2: 0x32, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x33,\n\t0xd8: 0x34, 0xd9: 0x0c, 0xdb: 0x35, 0xdc: 0x36, 0xdd: 0x37, 0xdf: 0x38,\n\t0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,\n\t0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,\n\t0xf0: 0x13,\n\t// Block 0x4, offset 0x100\n\t0x120: 0x39, 0x121: 0x3a, 0x123: 0x3b, 0x124: 0x3c, 0x125: 0x3d, 0x126: 0x3e, 0x127: 0x3f,\n\t0x128: 0x40, 0x129: 0x41, 0x12a: 0x42, 0x12b: 0x43, 0x12c: 0x3e, 0x12d: 0x44, 0x12e: 0x45, 0x12f: 0x46,\n\t0x131: 0x47, 0x132: 0x48, 0x133: 0x49, 0x134: 0x4a, 0x135: 0x4b, 0x137: 0x4c,\n\t0x138: 0x4d, 0x139: 0x4e, 0x13a: 0x4f, 0x13b: 0x50, 0x13c: 0x51, 0x13d: 0x52, 0x13e: 0x53, 0x13f: 0x54,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x55, 0x142: 0x56, 0x144: 0x57, 0x145: 0x58, 0x146: 0x59, 0x147: 0x5a,\n\t0x14d: 0x5b,\n\t0x15c: 0x5c, 0x15f: 0x5d,\n\t0x162: 0x5e, 0x164: 0x5f,\n\t0x168: 0x60, 0x169: 0x61, 0x16a: 0x62, 0x16c: 0x0d, 0x16d: 0x63, 0x16e: 0x64, 0x16f: 0x65,\n\t0x170: 0x66, 0x173: 0x67, 0x177: 0x68,\n\t0x178: 0x0e, 0x179: 0x0f, 0x17a: 0x10, 0x17b: 0x11, 0x17c: 0x12, 0x17d: 0x13, 0x17e: 0x14, 0x17f: 0x15,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x69, 0x183: 0x6a, 0x184: 0x6b, 0x186: 0x6c, 0x187: 0x6d,\n\t0x188: 0x6e, 0x189: 0x16, 0x18a: 0x17, 0x18b: 0x6f, 0x18c: 0x70,\n\t0x1ab: 0x71,\n\t0x1b3: 0x72, 0x1b5: 0x73, 0x1b7: 0x74,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x75, 0x1c1: 0x18, 0x1c2: 0x19, 0x1c3: 0x1a, 0x1c4: 0x76, 0x1c5: 0x77,\n\t0x1c9: 0x78, 0x1cc: 0x79, 0x1cd: 0x7a,\n\t// Block 0x8, offset 0x200\n\t0x219: 0x7b, 0x21a: 0x7c, 0x21b: 0x7d,\n\t0x220: 0x7e, 0x223: 0x7f, 0x224: 0x80, 0x225: 0x81, 0x226: 0x82, 0x227: 0x83,\n\t0x22a: 0x84, 0x22b: 0x85, 0x22f: 0x86,\n\t0x230: 0x87, 0x231: 0x88, 0x232: 0x89, 0x233: 0x8a, 0x234: 0x8b, 0x235: 0x8c, 0x236: 0x8d, 0x237: 0x87,\n\t0x238: 0x88, 0x239: 0x89, 0x23a: 0x8a, 0x23b: 0x8b, 0x23c: 0x8c, 0x23d: 0x8d, 0x23e: 0x87, 0x23f: 0x88,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x89, 0x241: 0x8a, 0x242: 0x8b, 0x243: 0x8c, 0x244: 0x8d, 0x245: 0x87, 0x246: 0x88, 0x247: 0x89,\n\t0x248: 0x8a, 0x249: 0x8b, 0x24a: 0x8c, 0x24b: 0x8d, 0x24c: 0x87, 0x24d: 0x88, 0x24e: 0x89, 0x24f: 0x8a,\n\t0x250: 0x8b, 0x251: 0x8c, 0x252: 0x8d, 0x253: 0x87, 0x254: 0x88, 0x255: 0x89, 0x256: 0x8a, 0x257: 0x8b,\n\t0x258: 0x8c, 0x259: 0x8d, 0x25a: 0x87, 0x25b: 0x88, 0x25c: 0x89, 0x25d: 0x8a, 0x25e: 0x8b, 0x25f: 0x8c,\n\t0x260: 0x8d, 0x261: 0x87, 0x262: 0x88, 0x263: 0x89, 0x264: 0x8a, 0x265: 0x8b, 0x266: 0x8c, 0x267: 0x8d,\n\t0x268: 0x87, 0x269: 0x88, 0x26a: 0x89, 0x26b: 0x8a, 0x26c: 0x8b, 0x26d: 0x8c, 0x26e: 0x8d, 0x26f: 0x87,\n\t0x270: 0x88, 0x271: 0x89, 0x272: 0x8a, 0x273: 0x8b, 0x274: 0x8c, 0x275: 0x8d, 0x276: 0x87, 0x277: 0x88,\n\t0x278: 0x89, 0x279: 0x8a, 0x27a: 0x8b, 0x27b: 0x8c, 0x27c: 0x8d, 0x27d: 0x87, 0x27e: 0x88, 0x27f: 0x89,\n\t// Block 0xa, offset 0x280\n\t0x280: 0x8a, 0x281: 0x8b, 0x282: 0x8c, 0x283: 0x8d, 0x284: 0x87, 0x285: 0x88, 0x286: 0x89, 0x287: 0x8a,\n\t0x288: 0x8b, 0x289: 0x8c, 0x28a: 0x8d, 0x28b: 0x87, 0x28c: 0x88, 0x28d: 0x89, 0x28e: 0x8a, 0x28f: 0x8b,\n\t0x290: 0x8c, 0x291: 0x8d, 0x292: 0x87, 0x293: 0x88, 0x294: 0x89, 0x295: 0x8a, 0x296: 0x8b, 0x297: 0x8c,\n\t0x298: 0x8d, 0x299: 0x87, 0x29a: 0x88, 0x29b: 0x89, 0x29c: 0x8a, 0x29d: 0x8b, 0x29e: 0x8c, 0x29f: 0x8d,\n\t0x2a0: 0x87, 0x2a1: 0x88, 0x2a2: 0x89, 0x2a3: 0x8a, 0x2a4: 0x8b, 0x2a5: 0x8c, 0x2a6: 0x8d, 0x2a7: 0x87,\n\t0x2a8: 0x88, 0x2a9: 0x89, 0x2aa: 0x8a, 0x2ab: 0x8b, 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x87, 0x2af: 0x88,\n\t0x2b0: 0x89, 0x2b1: 0x8a, 0x2b2: 0x8b, 0x2b3: 0x8c, 0x2b4: 0x8d, 0x2b5: 0x87, 0x2b6: 0x88, 0x2b7: 0x89,\n\t0x2b8: 0x8a, 0x2b9: 0x8b, 0x2ba: 0x8c, 0x2bb: 0x8d, 0x2bc: 0x87, 0x2bd: 0x88, 0x2be: 0x89, 0x2bf: 0x8a,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0x8b, 0x2c1: 0x8c, 0x2c2: 0x8d, 0x2c3: 0x87, 0x2c4: 0x88, 0x2c5: 0x89, 0x2c6: 0x8a, 0x2c7: 0x8b,\n\t0x2c8: 0x8c, 0x2c9: 0x8d, 0x2ca: 0x87, 0x2cb: 0x88, 0x2cc: 0x89, 0x2cd: 0x8a, 0x2ce: 0x8b, 0x2cf: 0x8c,\n\t0x2d0: 0x8d, 0x2d1: 0x87, 0x2d2: 0x88, 0x2d3: 0x89, 0x2d4: 0x8a, 0x2d5: 0x8b, 0x2d6: 0x8c, 0x2d7: 0x8d,\n\t0x2d8: 0x87, 0x2d9: 0x88, 0x2da: 0x89, 0x2db: 0x8a, 0x2dc: 0x8b, 0x2dd: 0x8c, 0x2de: 0x8e,\n\t// Block 0xc, offset 0x300\n\t0x324: 0x1b, 0x325: 0x1c, 0x326: 0x1d, 0x327: 0x1e,\n\t0x328: 0x1f, 0x329: 0x20, 0x32a: 0x21, 0x32b: 0x22, 0x32c: 0x8f, 0x32d: 0x90, 0x32e: 0x91,\n\t0x331: 0x92, 0x332: 0x93, 0x333: 0x94, 0x334: 0x95,\n\t0x338: 0x96, 0x339: 0x97, 0x33a: 0x98, 0x33b: 0x99, 0x33e: 0x9a, 0x33f: 0x9b,\n\t// Block 0xd, offset 0x340\n\t0x347: 0x9c,\n\t0x34b: 0x9d, 0x34d: 0x9e,\n\t0x368: 0x9f, 0x36b: 0xa0,\n\t// Block 0xe, offset 0x380\n\t0x381: 0xa1, 0x382: 0xa2, 0x384: 0xa3, 0x385: 0x82, 0x387: 0xa4,\n\t0x388: 0xa5, 0x38b: 0xa6, 0x38c: 0x3e, 0x38d: 0xa7,\n\t0x391: 0xa8, 0x392: 0xa9, 0x393: 0xaa, 0x396: 0xab, 0x397: 0xac,\n\t0x398: 0x73, 0x39a: 0xad, 0x39c: 0xae,\n\t0x3b0: 0x73,\n\t// Block 0xf, offset 0x3c0\n\t0x3eb: 0xaf, 0x3ec: 0xb0,\n\t// Block 0x10, offset 0x400\n\t0x432: 0xb1,\n\t// Block 0x11, offset 0x440\n\t0x445: 0xb2, 0x446: 0xb3, 0x447: 0xb4,\n\t0x449: 0xb5,\n\t// Block 0x12, offset 0x480\n\t0x480: 0xb6,\n\t0x4a3: 0xb7, 0x4a5: 0xb8,\n\t// Block 0x13, offset 0x4c0\n\t0x4c8: 0xb9,\n\t// Block 0x14, offset 0x500\n\t0x520: 0x23, 0x521: 0x24, 0x522: 0x25, 0x523: 0x26, 0x524: 0x27, 0x525: 0x28, 0x526: 0x29, 0x527: 0x2a,\n\t0x528: 0x2b,\n\t// Block 0x15, offset 0x540\n\t0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,\n\t0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,\n\t0x56f: 0x12,\n}\n\n// nfcSparseOffset: 142 entries, 284 bytes\nvar nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x62, 0x67, 0x69, 0x7a, 0x82, 0x89, 0x8c, 0x93, 0x97, 0x9b, 0x9d, 0x9f, 0xa8, 0xac, 0xb3, 0xb8, 0xbb, 0xc5, 0xc7, 0xce, 0xd6, 0xd9, 0xdb, 0xdd, 0xdf, 0xe4, 0xf5, 0x101, 0x103, 0x109, 0x10b, 0x10d, 0x10f, 0x111, 0x113, 0x115, 0x118, 0x11b, 0x11d, 0x120, 0x123, 0x127, 0x12c, 0x135, 0x137, 0x13a, 0x13c, 0x147, 0x157, 0x15b, 0x169, 0x16c, 0x172, 0x178, 0x183, 0x187, 0x189, 0x18b, 0x18d, 0x18f, 0x191, 0x197, 0x19b, 0x19d, 0x19f, 0x1a7, 0x1ab, 0x1ae, 0x1b0, 0x1b2, 0x1b4, 0x1b7, 0x1b9, 0x1bb, 0x1bd, 0x1bf, 0x1c5, 0x1c8, 0x1ca, 0x1d1, 0x1d7, 0x1dd, 0x1e5, 0x1eb, 0x1f1, 0x1f7, 0x1fb, 0x209, 0x212, 0x215, 0x218, 0x21a, 0x21d, 0x21f, 0x223, 0x228, 0x22a, 0x22c, 0x231, 0x237, 0x239, 0x23b, 0x23d, 0x243, 0x246, 0x249, 0x251, 0x258, 0x25b, 0x25e, 0x260, 0x268, 0x26b, 0x272, 0x275, 0x27b, 0x27d, 0x280, 0x282, 0x284, 0x286, 0x288, 0x295, 0x29f, 0x2a1, 0x2a3, 0x2a9, 0x2ab, 0x2ae}\n\n// nfcSparseValues: 688 entries, 2752 bytes\nvar nfcSparseValues = [688]valueRange{\n\t// Block 0x0, offset 0x0\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0xa100, lo: 0xa8, hi: 0xa8},\n\t{value: 0x8100, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8100, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8100, lo: 0xb8, hi: 0xb8},\n\t// Block 0x1, offset 0x5\n\t{value: 0x0091, lo: 0x03},\n\t{value: 0x46e2, lo: 0xa0, hi: 0xa1},\n\t{value: 0x4714, lo: 0xaf, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb7, hi: 0xb7},\n\t// Block 0x2, offset 0x9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t// Block 0x3, offset 0xb\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x98, hi: 0x9d},\n\t// Block 0x4, offset 0xd\n\t{value: 0x0006, lo: 0x0a},\n\t{value: 0xa000, lo: 0x81, hi: 0x81},\n\t{value: 0xa000, lo: 0x85, hi: 0x85},\n\t{value: 0xa000, lo: 0x89, hi: 0x89},\n\t{value: 0x4840, lo: 0x8a, hi: 0x8a},\n\t{value: 0x485e, lo: 0x8b, hi: 0x8b},\n\t{value: 0x36c7, lo: 0x8c, hi: 0x8c},\n\t{value: 0x36df, lo: 0x8d, hi: 0x8d},\n\t{value: 0x4876, lo: 0x8e, hi: 0x8e},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x36fd, lo: 0x93, hi: 0x94},\n\t// Block 0x5, offset 0x18\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0xa000, lo: 0x8d, hi: 0x8d},\n\t{value: 0x37a5, lo: 0x90, hi: 0x90},\n\t{value: 0x37b1, lo: 0x91, hi: 0x91},\n\t{value: 0x379f, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x96, hi: 0x96},\n\t{value: 0x3817, lo: 0x97, hi: 0x97},\n\t{value: 0x37e1, lo: 0x9c, hi: 0x9c},\n\t{value: 0x37c9, lo: 0x9d, hi: 0x9d},\n\t{value: 0x37f3, lo: 0x9e, hi: 0x9e},\n\t{value: 0xa000, lo: 0xb4, hi: 0xb5},\n\t{value: 0x381d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x3823, lo: 0xb7, hi: 0xb7},\n\t// Block 0x6, offset 0x28\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x83, hi: 0x87},\n\t// Block 0x7, offset 0x2a\n\t{value: 0x0001, lo: 0x04},\n\t{value: 0x8113, lo: 0x81, hi: 0x82},\n\t{value: 0x8132, lo: 0x84, hi: 0x84},\n\t{value: 0x812d, lo: 0x85, hi: 0x85},\n\t{value: 0x810d, lo: 0x87, hi: 0x87},\n\t// Block 0x8, offset 0x2f\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x97},\n\t{value: 0x8119, lo: 0x98, hi: 0x98},\n\t{value: 0x811a, lo: 0x99, hi: 0x99},\n\t{value: 0x811b, lo: 0x9a, hi: 0x9a},\n\t{value: 0x3841, lo: 0xa2, hi: 0xa2},\n\t{value: 0x3847, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3853, lo: 0xa4, hi: 0xa4},\n\t{value: 0x384d, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3859, lo: 0xa6, hi: 0xa6},\n\t{value: 0xa000, lo: 0xa7, hi: 0xa7},\n\t// Block 0x9, offset 0x3a\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x386b, lo: 0x80, hi: 0x80},\n\t{value: 0xa000, lo: 0x81, hi: 0x81},\n\t{value: 0x385f, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x3865, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x95, hi: 0x95},\n\t{value: 0x8132, lo: 0x96, hi: 0x9c},\n\t{value: 0x8132, lo: 0x9f, hi: 0xa2},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8132, lo: 0xab, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t// Block 0xa, offset 0x49\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x811f, lo: 0x91, hi: 0x91},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x812d, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb5, hi: 0xb6},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb9},\n\t{value: 0x8132, lo: 0xba, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbc},\n\t{value: 0x8132, lo: 0xbd, hi: 0xbd},\n\t{value: 0x812d, lo: 0xbe, hi: 0xbe},\n\t{value: 0x8132, lo: 0xbf, hi: 0xbf},\n\t// Block 0xb, offset 0x56\n\t{value: 0x0005, lo: 0x07},\n\t{value: 0x8132, lo: 0x80, hi: 0x80},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x812d, lo: 0x82, hi: 0x83},\n\t{value: 0x812d, lo: 0x84, hi: 0x85},\n\t{value: 0x812d, lo: 0x86, hi: 0x87},\n\t{value: 0x812d, lo: 0x88, hi: 0x89},\n\t{value: 0x8132, lo: 0x8a, hi: 0x8a},\n\t// Block 0xc, offset 0x5e\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8132, lo: 0xab, hi: 0xb1},\n\t{value: 0x812d, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb3},\n\t// Block 0xd, offset 0x62\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0x96, hi: 0x99},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa7},\n\t{value: 0x8132, lo: 0xa9, hi: 0xad},\n\t// Block 0xe, offset 0x67\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x99, hi: 0x9b},\n\t// Block 0xf, offset 0x69\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x8132, lo: 0x94, hi: 0xa1},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8132, lo: 0xaa, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xaf},\n\t{value: 0x8116, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8117, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8118, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x812d, lo: 0xb9, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbf},\n\t// Block 0x10, offset 0x7a\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0xa8, hi: 0xa8},\n\t{value: 0x3ed8, lo: 0xa9, hi: 0xa9},\n\t{value: 0xa000, lo: 0xb0, hi: 0xb0},\n\t{value: 0x3ee0, lo: 0xb1, hi: 0xb1},\n\t{value: 0xa000, lo: 0xb3, hi: 0xb3},\n\t{value: 0x3ee8, lo: 0xb4, hi: 0xb4},\n\t{value: 0x9902, lo: 0xbc, hi: 0xbc},\n\t// Block 0x11, offset 0x82\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x91, hi: 0x91},\n\t{value: 0x812d, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x93, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x94},\n\t{value: 0x451c, lo: 0x98, hi: 0x9f},\n\t// Block 0x12, offset 0x89\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x13, offset 0x8c\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2c9e, lo: 0x8b, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x455c, lo: 0x9c, hi: 0x9d},\n\t{value: 0x456c, lo: 0x9f, hi: 0x9f},\n\t// Block 0x14, offset 0x93\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x4594, lo: 0xb3, hi: 0xb3},\n\t{value: 0x459c, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x15, offset 0x97\n\t{value: 0x0008, lo: 0x03},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x4574, lo: 0x99, hi: 0x9b},\n\t{value: 0x458c, lo: 0x9e, hi: 0x9e},\n\t// Block 0x16, offset 0x9b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x17, offset 0x9d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t// Block 0x18, offset 0x9f\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2cb6, lo: 0x88, hi: 0x88},\n\t{value: 0x2cae, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cbe, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x96, hi: 0x97},\n\t{value: 0x45a4, lo: 0x9c, hi: 0x9c},\n\t{value: 0x45ac, lo: 0x9d, hi: 0x9d},\n\t// Block 0x19, offset 0xa8\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x2cc6, lo: 0x94, hi: 0x94},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1a, offset 0xac\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cce, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2cde, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cd6, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x1b, offset 0xb3\n\t{value: 0x1801, lo: 0x04},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x3ef0, lo: 0x88, hi: 0x88},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8120, lo: 0x95, hi: 0x96},\n\t// Block 0x1c, offset 0xb8\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0xa000, lo: 0xbf, hi: 0xbf},\n\t// Block 0x1d, offset 0xbb\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x2ce6, lo: 0x80, hi: 0x80},\n\t{value: 0x9900, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x2cee, lo: 0x87, hi: 0x87},\n\t{value: 0x2cf6, lo: 0x88, hi: 0x88},\n\t{value: 0x2f50, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2dd8, lo: 0x8b, hi: 0x8b},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x95, hi: 0x96},\n\t// Block 0x1e, offset 0xc5\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1f, offset 0xc7\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cfe, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2d0e, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d06, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x20, offset 0xce\n\t{value: 0x6bea, lo: 0x07},\n\t{value: 0x9904, lo: 0x8a, hi: 0x8a},\n\t{value: 0x9900, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x3ef8, lo: 0x9a, hi: 0x9a},\n\t{value: 0x2f58, lo: 0x9c, hi: 0x9c},\n\t{value: 0x2de3, lo: 0x9d, hi: 0x9d},\n\t{value: 0x2d16, lo: 0x9e, hi: 0x9f},\n\t// Block 0x21, offset 0xd6\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8122, lo: 0xb8, hi: 0xb9},\n\t{value: 0x8104, lo: 0xba, hi: 0xba},\n\t// Block 0x22, offset 0xd9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8123, lo: 0x88, hi: 0x8b},\n\t// Block 0x23, offset 0xdb\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8124, lo: 0xb8, hi: 0xb9},\n\t// Block 0x24, offset 0xdd\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8125, lo: 0x88, hi: 0x8b},\n\t// Block 0x25, offset 0xdf\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x812d, lo: 0x98, hi: 0x99},\n\t{value: 0x812d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb7},\n\t{value: 0x812b, lo: 0xb9, hi: 0xb9},\n\t// Block 0x26, offset 0xe4\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x2644, lo: 0x83, hi: 0x83},\n\t{value: 0x264b, lo: 0x8d, hi: 0x8d},\n\t{value: 0x2652, lo: 0x92, hi: 0x92},\n\t{value: 0x2659, lo: 0x97, hi: 0x97},\n\t{value: 0x2660, lo: 0x9c, hi: 0x9c},\n\t{value: 0x263d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8126, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8127, lo: 0xb2, hi: 0xb2},\n\t{value: 0x4a84, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8128, lo: 0xb4, hi: 0xb4},\n\t{value: 0x4a8d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x45b4, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8200, lo: 0xb7, hi: 0xb7},\n\t{value: 0x45bc, lo: 0xb8, hi: 0xb8},\n\t{value: 0x8200, lo: 0xb9, hi: 0xb9},\n\t{value: 0x8127, lo: 0xba, hi: 0xbd},\n\t// Block 0x27, offset 0xf5\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x8127, lo: 0x80, hi: 0x80},\n\t{value: 0x4a96, lo: 0x81, hi: 0x81},\n\t{value: 0x8132, lo: 0x82, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0x86, hi: 0x87},\n\t{value: 0x266e, lo: 0x93, hi: 0x93},\n\t{value: 0x2675, lo: 0x9d, hi: 0x9d},\n\t{value: 0x267c, lo: 0xa2, hi: 0xa2},\n\t{value: 0x2683, lo: 0xa7, hi: 0xa7},\n\t{value: 0x268a, lo: 0xac, hi: 0xac},\n\t{value: 0x2667, lo: 0xb9, hi: 0xb9},\n\t// Block 0x28, offset 0x101\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x86, hi: 0x86},\n\t// Block 0x29, offset 0x103\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x2d1e, lo: 0xa6, hi: 0xa6},\n\t{value: 0x9900, lo: 0xae, hi: 0xae},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x2a, offset 0x109\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t// Block 0x2b, offset 0x10b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xa000, lo: 0x80, hi: 0x92},\n\t// Block 0x2c, offset 0x10d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xb900, lo: 0xa1, hi: 0xb5},\n\t// Block 0x2d, offset 0x10f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0xa8, hi: 0xbf},\n\t// Block 0x2e, offset 0x111\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0x80, hi: 0x82},\n\t// Block 0x2f, offset 0x113\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9f},\n\t// Block 0x30, offset 0x115\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x94, hi: 0x94},\n\t{value: 0x8104, lo: 0xb4, hi: 0xb4},\n\t// Block 0x31, offset 0x118\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9d},\n\t// Block 0x32, offset 0x11b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8131, lo: 0xa9, hi: 0xa9},\n\t// Block 0x33, offset 0x11d\n\t{value: 0x0004, lo: 0x02},\n\t{value: 0x812e, lo: 0xb9, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbb},\n\t// Block 0x34, offset 0x120\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x97, hi: 0x97},\n\t{value: 0x812d, lo: 0x98, hi: 0x98},\n\t// Block 0x35, offset 0x123\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8104, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8132, lo: 0xb5, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x36, offset 0x127\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t{value: 0x812d, lo: 0xb5, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x37, offset 0x12c\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x2d66, lo: 0x80, hi: 0x80},\n\t{value: 0x2d6e, lo: 0x81, hi: 0x81},\n\t{value: 0xa000, lo: 0x82, hi: 0x82},\n\t{value: 0x2d76, lo: 0x83, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xab, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xac},\n\t{value: 0x8132, lo: 0xad, hi: 0xb3},\n\t// Block 0x38, offset 0x135\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xaa, hi: 0xab},\n\t// Block 0x39, offset 0x137\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8104, lo: 0xb2, hi: 0xb3},\n\t// Block 0x3a, offset 0x13a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x3b, offset 0x13c\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x92},\n\t{value: 0x8101, lo: 0x94, hi: 0x94},\n\t{value: 0x812d, lo: 0x95, hi: 0x99},\n\t{value: 0x8132, lo: 0x9a, hi: 0x9b},\n\t{value: 0x812d, lo: 0x9c, hi: 0x9f},\n\t{value: 0x8132, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8101, lo: 0xa2, hi: 0xa8},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t{value: 0x8132, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb9},\n\t// Block 0x3c, offset 0x147\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0x8132, lo: 0x80, hi: 0x81},\n\t{value: 0x812d, lo: 0x82, hi: 0x82},\n\t{value: 0x8132, lo: 0x83, hi: 0x89},\n\t{value: 0x812d, lo: 0x8a, hi: 0x8a},\n\t{value: 0x8132, lo: 0x8b, hi: 0x8c},\n\t{value: 0x8135, lo: 0x8d, hi: 0x8d},\n\t{value: 0x812a, lo: 0x8e, hi: 0x8e},\n\t{value: 0x812d, lo: 0x8f, hi: 0x8f},\n\t{value: 0x8129, lo: 0x90, hi: 0x90},\n\t{value: 0x8132, lo: 0x91, hi: 0xb5},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbb},\n\t{value: 0x8134, lo: 0xbc, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t{value: 0x8132, lo: 0xbe, hi: 0xbe},\n\t{value: 0x812d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x3d, offset 0x157\n\t{value: 0x0004, lo: 0x03},\n\t{value: 0x0433, lo: 0x80, hi: 0x81},\n\t{value: 0x8100, lo: 0x97, hi: 0x97},\n\t{value: 0x8100, lo: 0xbe, hi: 0xbe},\n\t// Block 0x3e, offset 0x15b\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x8132, lo: 0x90, hi: 0x91},\n\t{value: 0x8101, lo: 0x92, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x97},\n\t{value: 0x8101, lo: 0x98, hi: 0x9a},\n\t{value: 0x8132, lo: 0x9b, hi: 0x9c},\n\t{value: 0x8132, lo: 0xa1, hi: 0xa1},\n\t{value: 0x8101, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa7},\n\t{value: 0x812d, lo: 0xa8, hi: 0xa8},\n\t{value: 0x8132, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8101, lo: 0xaa, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t// Block 0x3f, offset 0x169\n\t{value: 0x427b, lo: 0x02},\n\t{value: 0x01b8, lo: 0xa6, hi: 0xa6},\n\t{value: 0x0057, lo: 0xaa, hi: 0xab},\n\t// Block 0x40, offset 0x16c\n\t{value: 0x0007, lo: 0x05},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t{value: 0x3bb9, lo: 0x9a, hi: 0x9b},\n\t{value: 0x3bc7, lo: 0xae, hi: 0xae},\n\t// Block 0x41, offset 0x172\n\t{value: 0x000e, lo: 0x05},\n\t{value: 0x3bce, lo: 0x8d, hi: 0x8e},\n\t{value: 0x3bd5, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t// Block 0x42, offset 0x178\n\t{value: 0x6408, lo: 0x0a},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0x3be3, lo: 0x84, hi: 0x84},\n\t{value: 0xa000, lo: 0x88, hi: 0x88},\n\t{value: 0x3bea, lo: 0x89, hi: 0x89},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0x3bf1, lo: 0x8c, hi: 0x8c},\n\t{value: 0xa000, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3bf8, lo: 0xa4, hi: 0xa5},\n\t{value: 0x3bff, lo: 0xa6, hi: 0xa6},\n\t{value: 0xa000, lo: 0xbc, hi: 0xbc},\n\t// Block 0x43, offset 0x183\n\t{value: 0x0007, lo: 0x03},\n\t{value: 0x3c68, lo: 0xa0, hi: 0xa1},\n\t{value: 0x3c92, lo: 0xa2, hi: 0xa3},\n\t{value: 0x3cbc, lo: 0xaa, hi: 0xad},\n\t// Block 0x44, offset 0x187\n\t{value: 0x0004, lo: 0x01},\n\t{value: 0x048b, lo: 0xa9, hi: 0xaa},\n\t// Block 0x45, offset 0x189\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x44dd, lo: 0x9c, hi: 0x9c},\n\t// Block 0x46, offset 0x18b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xaf, hi: 0xb1},\n\t// Block 0x47, offset 0x18d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x48, offset 0x18f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xa0, hi: 0xbf},\n\t// Block 0x49, offset 0x191\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x812c, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8131, lo: 0xab, hi: 0xab},\n\t{value: 0x8133, lo: 0xac, hi: 0xac},\n\t{value: 0x812e, lo: 0xad, hi: 0xad},\n\t{value: 0x812f, lo: 0xae, hi: 0xaf},\n\t// Block 0x4a, offset 0x197\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x4a9f, lo: 0xb3, hi: 0xb3},\n\t{value: 0x4a9f, lo: 0xb5, hi: 0xb6},\n\t{value: 0x4a9f, lo: 0xba, hi: 0xbf},\n\t// Block 0x4b, offset 0x19b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x4a9f, lo: 0x8f, hi: 0xa3},\n\t// Block 0x4c, offset 0x19d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0xae, hi: 0xbe},\n\t// Block 0x4d, offset 0x19f\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0x8100, lo: 0x84, hi: 0x84},\n\t{value: 0x8100, lo: 0x87, hi: 0x87},\n\t{value: 0x8100, lo: 0x90, hi: 0x90},\n\t{value: 0x8100, lo: 0x9e, hi: 0x9e},\n\t{value: 0x8100, lo: 0xa1, hi: 0xa1},\n\t{value: 0x8100, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8100, lo: 0xbb, hi: 0xbb},\n\t// Block 0x4e, offset 0x1a7\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8100, lo: 0x80, hi: 0x80},\n\t{value: 0x8100, lo: 0x8b, hi: 0x8b},\n\t{value: 0x8100, lo: 0x8e, hi: 0x8e},\n\t// Block 0x4f, offset 0x1ab\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb4, hi: 0xbd},\n\t// Block 0x50, offset 0x1ae\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x9e, hi: 0x9f},\n\t// Block 0x51, offset 0x1b0\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb1},\n\t// Block 0x52, offset 0x1b2\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t// Block 0x53, offset 0x1b4\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xa0, hi: 0xb1},\n\t// Block 0x54, offset 0x1b7\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xab, hi: 0xad},\n\t// Block 0x55, offset 0x1b9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x93, hi: 0x93},\n\t// Block 0x56, offset 0x1bb\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb3, hi: 0xb3},\n\t// Block 0x57, offset 0x1bd\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t// Block 0x58, offset 0x1bf\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x8132, lo: 0xbe, hi: 0xbf},\n\t// Block 0x59, offset 0x1c5\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t// Block 0x5a, offset 0x1c8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xad, hi: 0xad},\n\t// Block 0x5b, offset 0x1ca\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xe500, lo: 0x80, hi: 0x80},\n\t{value: 0xc600, lo: 0x81, hi: 0x9b},\n\t{value: 0xe500, lo: 0x9c, hi: 0x9c},\n\t{value: 0xc600, lo: 0x9d, hi: 0xb7},\n\t{value: 0xe500, lo: 0xb8, hi: 0xb8},\n\t{value: 0xc600, lo: 0xb9, hi: 0xbf},\n\t// Block 0x5c, offset 0x1d1\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x93},\n\t{value: 0xe500, lo: 0x94, hi: 0x94},\n\t{value: 0xc600, lo: 0x95, hi: 0xaf},\n\t{value: 0xe500, lo: 0xb0, hi: 0xb0},\n\t{value: 0xc600, lo: 0xb1, hi: 0xbf},\n\t// Block 0x5d, offset 0x1d7\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8b},\n\t{value: 0xe500, lo: 0x8c, hi: 0x8c},\n\t{value: 0xc600, lo: 0x8d, hi: 0xa7},\n\t{value: 0xe500, lo: 0xa8, hi: 0xa8},\n\t{value: 0xc600, lo: 0xa9, hi: 0xbf},\n\t// Block 0x5e, offset 0x1dd\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xc600, lo: 0x80, hi: 0x83},\n\t{value: 0xe500, lo: 0x84, hi: 0x84},\n\t{value: 0xc600, lo: 0x85, hi: 0x9f},\n\t{value: 0xe500, lo: 0xa0, hi: 0xa0},\n\t{value: 0xc600, lo: 0xa1, hi: 0xbb},\n\t{value: 0xe500, lo: 0xbc, hi: 0xbc},\n\t{value: 0xc600, lo: 0xbd, hi: 0xbf},\n\t// Block 0x5f, offset 0x1e5\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x97},\n\t{value: 0xe500, lo: 0x98, hi: 0x98},\n\t{value: 0xc600, lo: 0x99, hi: 0xb3},\n\t{value: 0xe500, lo: 0xb4, hi: 0xb4},\n\t{value: 0xc600, lo: 0xb5, hi: 0xbf},\n\t// Block 0x60, offset 0x1eb\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8f},\n\t{value: 0xe500, lo: 0x90, hi: 0x90},\n\t{value: 0xc600, lo: 0x91, hi: 0xab},\n\t{value: 0xe500, lo: 0xac, hi: 0xac},\n\t{value: 0xc600, lo: 0xad, hi: 0xbf},\n\t// Block 0x61, offset 0x1f1\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t{value: 0xe500, lo: 0xa4, hi: 0xa4},\n\t{value: 0xc600, lo: 0xa5, hi: 0xbf},\n\t// Block 0x62, offset 0x1f7\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t// Block 0x63, offset 0x1fb\n\t{value: 0x0006, lo: 0x0d},\n\t{value: 0x4390, lo: 0x9d, hi: 0x9d},\n\t{value: 0x8115, lo: 0x9e, hi: 0x9e},\n\t{value: 0x4402, lo: 0x9f, hi: 0x9f},\n\t{value: 0x43f0, lo: 0xaa, hi: 0xab},\n\t{value: 0x44f4, lo: 0xac, hi: 0xac},\n\t{value: 0x44fc, lo: 0xad, hi: 0xad},\n\t{value: 0x4348, lo: 0xae, hi: 0xb1},\n\t{value: 0x4366, lo: 0xb2, hi: 0xb4},\n\t{value: 0x437e, lo: 0xb5, hi: 0xb6},\n\t{value: 0x438a, lo: 0xb8, hi: 0xb8},\n\t{value: 0x4396, lo: 0xb9, hi: 0xbb},\n\t{value: 0x43ae, lo: 0xbc, hi: 0xbc},\n\t{value: 0x43b4, lo: 0xbe, hi: 0xbe},\n\t// Block 0x64, offset 0x209\n\t{value: 0x0006, lo: 0x08},\n\t{value: 0x43ba, lo: 0x80, hi: 0x81},\n\t{value: 0x43c6, lo: 0x83, hi: 0x84},\n\t{value: 0x43d8, lo: 0x86, hi: 0x89},\n\t{value: 0x43fc, lo: 0x8a, hi: 0x8a},\n\t{value: 0x4378, lo: 0x8b, hi: 0x8b},\n\t{value: 0x4360, lo: 0x8c, hi: 0x8c},\n\t{value: 0x43a8, lo: 0x8d, hi: 0x8d},\n\t{value: 0x43d2, lo: 0x8e, hi: 0x8e},\n\t// Block 0x65, offset 0x212\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8100, lo: 0xa4, hi: 0xa5},\n\t{value: 0x8100, lo: 0xb0, hi: 0xb1},\n\t// Block 0x66, offset 0x215\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8100, lo: 0x9b, hi: 0x9d},\n\t{value: 0x8200, lo: 0x9e, hi: 0xa3},\n\t// Block 0x67, offset 0x218\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x90, hi: 0x90},\n\t// Block 0x68, offset 0x21a\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8100, lo: 0x99, hi: 0x99},\n\t{value: 0x8200, lo: 0xb2, hi: 0xb4},\n\t// Block 0x69, offset 0x21d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0xbc, hi: 0xbd},\n\t// Block 0x6a, offset 0x21f\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8132, lo: 0xa0, hi: 0xa6},\n\t{value: 0x812d, lo: 0xa7, hi: 0xad},\n\t{value: 0x8132, lo: 0xae, hi: 0xaf},\n\t// Block 0x6b, offset 0x223\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8100, lo: 0x89, hi: 0x8c},\n\t{value: 0x8100, lo: 0xb0, hi: 0xb2},\n\t{value: 0x8100, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8100, lo: 0xb6, hi: 0xbf},\n\t// Block 0x6c, offset 0x228\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x81, hi: 0x8c},\n\t// Block 0x6d, offset 0x22a\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0xb5, hi: 0xba},\n\t// Block 0x6e, offset 0x22c\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x4a9f, lo: 0x9e, hi: 0x9f},\n\t{value: 0x4a9f, lo: 0xa3, hi: 0xa3},\n\t{value: 0x4a9f, lo: 0xa5, hi: 0xa6},\n\t{value: 0x4a9f, lo: 0xaa, hi: 0xaf},\n\t// Block 0x6f, offset 0x231\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x4a9f, lo: 0x82, hi: 0x87},\n\t{value: 0x4a9f, lo: 0x8a, hi: 0x8f},\n\t{value: 0x4a9f, lo: 0x92, hi: 0x97},\n\t{value: 0x4a9f, lo: 0x9a, hi: 0x9c},\n\t{value: 0x8100, lo: 0xa3, hi: 0xa3},\n\t// Block 0x70, offset 0x237\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x71, offset 0x239\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xa0, hi: 0xa0},\n\t// Block 0x72, offset 0x23b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb6, hi: 0xba},\n\t// Block 0x73, offset 0x23d\n\t{value: 0x002c, lo: 0x05},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x8f, hi: 0x8f},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb8},\n\t{value: 0x8101, lo: 0xb9, hi: 0xba},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x74, offset 0x243\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t// Block 0x75, offset 0x246\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x76, offset 0x249\n\t{value: 0x17fe, lo: 0x07},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x4238, lo: 0x9a, hi: 0x9a},\n\t{value: 0xa000, lo: 0x9b, hi: 0x9b},\n\t{value: 0x4242, lo: 0x9c, hi: 0x9c},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x424c, lo: 0xab, hi: 0xab},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x77, offset 0x251\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x8132, lo: 0x80, hi: 0x82},\n\t{value: 0x9900, lo: 0xa7, hi: 0xa7},\n\t{value: 0x2d7e, lo: 0xae, hi: 0xae},\n\t{value: 0x2d88, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb1, hi: 0xb2},\n\t{value: 0x8104, lo: 0xb3, hi: 0xb4},\n\t// Block 0x78, offset 0x258\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x79, offset 0x25b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb5, hi: 0xb5},\n\t{value: 0x8102, lo: 0xb6, hi: 0xb6},\n\t// Block 0x7a, offset 0x25e\n\t{value: 0x0002, lo: 0x01},\n\t{value: 0x8102, lo: 0xa9, hi: 0xaa},\n\t// Block 0x7b, offset 0x260\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2d92, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d9c, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x8132, lo: 0xa6, hi: 0xac},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t// Block 0x7c, offset 0x268\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x86, hi: 0x86},\n\t// Block 0x7d, offset 0x26b\n\t{value: 0x6b5a, lo: 0x06},\n\t{value: 0x9900, lo: 0xb0, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb9, hi: 0xb9},\n\t{value: 0x9900, lo: 0xba, hi: 0xba},\n\t{value: 0x2db0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x2da6, lo: 0xbc, hi: 0xbd},\n\t{value: 0x2dba, lo: 0xbe, hi: 0xbe},\n\t// Block 0x7e, offset 0x272\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x83, hi: 0x83},\n\t// Block 0x7f, offset 0x275\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x9900, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb8, hi: 0xb9},\n\t{value: 0x2dc4, lo: 0xba, hi: 0xba},\n\t{value: 0x2dce, lo: 0xbb, hi: 0xbb},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x80, offset 0x27b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0x80, hi: 0x80},\n\t// Block 0x81, offset 0x27d\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x82, offset 0x280\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xab, hi: 0xab},\n\t// Block 0x83, offset 0x282\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0xb0, hi: 0xb4},\n\t// Block 0x84, offset 0x284\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb6},\n\t// Block 0x85, offset 0x286\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0x9e, hi: 0x9e},\n\t// Block 0x86, offset 0x288\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x45cc, lo: 0x9e, hi: 0x9e},\n\t{value: 0x45d6, lo: 0x9f, hi: 0x9f},\n\t{value: 0x460a, lo: 0xa0, hi: 0xa0},\n\t{value: 0x4618, lo: 0xa1, hi: 0xa1},\n\t{value: 0x4626, lo: 0xa2, hi: 0xa2},\n\t{value: 0x4634, lo: 0xa3, hi: 0xa3},\n\t{value: 0x4642, lo: 0xa4, hi: 0xa4},\n\t{value: 0x812b, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8101, lo: 0xa7, hi: 0xa9},\n\t{value: 0x8130, lo: 0xad, hi: 0xad},\n\t{value: 0x812b, lo: 0xae, hi: 0xb2},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbf},\n\t// Block 0x87, offset 0x295\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x812d, lo: 0x80, hi: 0x82},\n\t{value: 0x8132, lo: 0x85, hi: 0x89},\n\t{value: 0x812d, lo: 0x8a, hi: 0x8b},\n\t{value: 0x8132, lo: 0xaa, hi: 0xad},\n\t{value: 0x45e0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x45ea, lo: 0xbc, hi: 0xbc},\n\t{value: 0x4650, lo: 0xbd, hi: 0xbd},\n\t{value: 0x466c, lo: 0xbe, hi: 0xbe},\n\t{value: 0x465e, lo: 0xbf, hi: 0xbf},\n\t// Block 0x88, offset 0x29f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x467a, lo: 0x80, hi: 0x80},\n\t// Block 0x89, offset 0x2a1\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x82, hi: 0x84},\n\t// Block 0x8a, offset 0x2a3\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0x80, hi: 0x86},\n\t{value: 0x8132, lo: 0x88, hi: 0x98},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa1},\n\t{value: 0x8132, lo: 0xa3, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa6, hi: 0xaa},\n\t// Block 0x8b, offset 0x2a9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x90, hi: 0x96},\n\t// Block 0x8c, offset 0x2ab\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x84, hi: 0x89},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x8d, offset 0x2ae\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8100, lo: 0x93, hi: 0x93},\n}\n\n// lookup returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfkcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfkcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfkcTrie) lookupUnsafe(s []byte) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfkcValues[c0]\n\t}\n\ti := nfkcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// lookupString returns the trie value for the first UTF-8 encoding in s and\n// the width in bytes of this encoding. The size will be 0 if s does not\n// hold enough bytes to complete the encoding. len(s) must be greater than 0.\nfunc (t *nfkcTrie) lookupString(s string) (v uint16, sz int) {\n\tc0 := s[0]\n\tswitch {\n\tcase c0 < 0x80: // is ASCII\n\t\treturn nfkcValues[c0], 1\n\tcase c0 < 0xC2:\n\t\treturn 0, 1 // Illegal UTF-8: not a starter, not ASCII.\n\tcase c0 < 0xE0: // 2-byte UTF-8\n\t\tif len(s) < 2 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c1), 2\n\tcase c0 < 0xF0: // 3-byte UTF-8\n\t\tif len(s) < 3 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c2), 3\n\tcase c0 < 0xF8: // 4-byte UTF-8\n\t\tif len(s) < 4 {\n\t\t\treturn 0, 0\n\t\t}\n\t\ti := nfkcIndex[c0]\n\t\tc1 := s[1]\n\t\tif c1 < 0x80 || 0xC0 <= c1 {\n\t\t\treturn 0, 1 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to := uint32(i)<<6 + uint32(c1)\n\t\ti = nfkcIndex[o]\n\t\tc2 := s[2]\n\t\tif c2 < 0x80 || 0xC0 <= c2 {\n\t\t\treturn 0, 2 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\to = uint32(i)<<6 + uint32(c2)\n\t\ti = nfkcIndex[o]\n\t\tc3 := s[3]\n\t\tif c3 < 0x80 || 0xC0 <= c3 {\n\t\t\treturn 0, 3 // Illegal UTF-8: not a continuation byte.\n\t\t}\n\t\treturn t.lookupValue(uint32(i), c3), 4\n\t}\n\t// Illegal rune\n\treturn 0, 1\n}\n\n// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.\n// s must start with a full and valid UTF-8 encoded rune.\nfunc (t *nfkcTrie) lookupStringUnsafe(s string) uint16 {\n\tc0 := s[0]\n\tif c0 < 0x80 { // is ASCII\n\t\treturn nfkcValues[c0]\n\t}\n\ti := nfkcIndex[c0]\n\tif c0 < 0xE0 { // 2-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[1])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[1])]\n\tif c0 < 0xF0 { // 3-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[2])\n\t}\n\ti = nfkcIndex[uint32(i)<<6+uint32(s[2])]\n\tif c0 < 0xF8 { // 4-byte UTF-8\n\t\treturn t.lookupValue(uint32(i), s[3])\n\t}\n\treturn 0\n}\n\n// nfkcTrie. Total size: 16994 bytes (16.60 KiB). Checksum: c3ed54ee046f3c46.\ntype nfkcTrie struct{}\n\nfunc newNfkcTrie(i int) *nfkcTrie {\n\treturn &nfkcTrie{}\n}\n\n// lookupValue determines the type of block n and looks up the value for b.\nfunc (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 {\n\tswitch {\n\tcase n < 90:\n\t\treturn uint16(nfkcValues[n<<6+uint32(b)])\n\tdefault:\n\t\tn -= 90\n\t\treturn uint16(nfkcSparse.lookup(n, b))\n\t}\n}\n\n// nfkcValues: 92 blocks, 5888 entries, 11776 bytes\n// The third block is the zero block.\nvar nfkcValues = [5888]uint16{\n\t// Block 0x0, offset 0x0\n\t0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000,\n\t// Block 0x1, offset 0x40\n\t0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000,\n\t0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000,\n\t0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000,\n\t0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000,\n\t0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000,\n\t0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000,\n\t0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000,\n\t0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000,\n\t0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000,\n\t0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000,\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc0: 0x2f6f, 0xc1: 0x2f74, 0xc2: 0x4688, 0xc3: 0x2f79, 0xc4: 0x4697, 0xc5: 0x469c,\n\t0xc6: 0xa000, 0xc7: 0x46a6, 0xc8: 0x2fe2, 0xc9: 0x2fe7, 0xca: 0x46ab, 0xcb: 0x2ffb,\n\t0xcc: 0x306e, 0xcd: 0x3073, 0xce: 0x3078, 0xcf: 0x46bf, 0xd1: 0x3104,\n\t0xd2: 0x3127, 0xd3: 0x312c, 0xd4: 0x46c9, 0xd5: 0x46ce, 0xd6: 0x46dd,\n\t0xd8: 0xa000, 0xd9: 0x31b3, 0xda: 0x31b8, 0xdb: 0x31bd, 0xdc: 0x470f, 0xdd: 0x3235,\n\t0xe0: 0x327b, 0xe1: 0x3280, 0xe2: 0x4719, 0xe3: 0x3285,\n\t0xe4: 0x4728, 0xe5: 0x472d, 0xe6: 0xa000, 0xe7: 0x4737, 0xe8: 0x32ee, 0xe9: 0x32f3,\n\t0xea: 0x473c, 0xeb: 0x3307, 0xec: 0x337f, 0xed: 0x3384, 0xee: 0x3389, 0xef: 0x4750,\n\t0xf1: 0x3415, 0xf2: 0x3438, 0xf3: 0x343d, 0xf4: 0x475a, 0xf5: 0x475f,\n\t0xf6: 0x476e, 0xf8: 0xa000, 0xf9: 0x34c9, 0xfa: 0x34ce, 0xfb: 0x34d3,\n\t0xfc: 0x47a0, 0xfd: 0x3550, 0xff: 0x3569,\n\t// Block 0x4, offset 0x100\n\t0x100: 0x2f7e, 0x101: 0x328a, 0x102: 0x468d, 0x103: 0x471e, 0x104: 0x2f9c, 0x105: 0x32a8,\n\t0x106: 0x2fb0, 0x107: 0x32bc, 0x108: 0x2fb5, 0x109: 0x32c1, 0x10a: 0x2fba, 0x10b: 0x32c6,\n\t0x10c: 0x2fbf, 0x10d: 0x32cb, 0x10e: 0x2fc9, 0x10f: 0x32d5,\n\t0x112: 0x46b0, 0x113: 0x4741, 0x114: 0x2ff1, 0x115: 0x32fd, 0x116: 0x2ff6, 0x117: 0x3302,\n\t0x118: 0x3014, 0x119: 0x3320, 0x11a: 0x3005, 0x11b: 0x3311, 0x11c: 0x302d, 0x11d: 0x3339,\n\t0x11e: 0x3037, 0x11f: 0x3343, 0x120: 0x303c, 0x121: 0x3348, 0x122: 0x3046, 0x123: 0x3352,\n\t0x124: 0x304b, 0x125: 0x3357, 0x128: 0x307d, 0x129: 0x338e,\n\t0x12a: 0x3082, 0x12b: 0x3393, 0x12c: 0x3087, 0x12d: 0x3398, 0x12e: 0x30aa, 0x12f: 0x33b6,\n\t0x130: 0x308c, 0x132: 0x195d, 0x133: 0x19e7, 0x134: 0x30b4, 0x135: 0x33c0,\n\t0x136: 0x30c8, 0x137: 0x33d9, 0x139: 0x30d2, 0x13a: 0x33e3, 0x13b: 0x30dc,\n\t0x13c: 0x33ed, 0x13d: 0x30d7, 0x13e: 0x33e8, 0x13f: 0x1bac,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x1c34, 0x143: 0x30ff, 0x144: 0x3410, 0x145: 0x3118,\n\t0x146: 0x3429, 0x147: 0x310e, 0x148: 0x341f, 0x149: 0x1c5c,\n\t0x14c: 0x46d3, 0x14d: 0x4764, 0x14e: 0x3131, 0x14f: 0x3442, 0x150: 0x313b, 0x151: 0x344c,\n\t0x154: 0x3159, 0x155: 0x346a, 0x156: 0x3172, 0x157: 0x3483,\n\t0x158: 0x3163, 0x159: 0x3474, 0x15a: 0x46f6, 0x15b: 0x4787, 0x15c: 0x317c, 0x15d: 0x348d,\n\t0x15e: 0x318b, 0x15f: 0x349c, 0x160: 0x46fb, 0x161: 0x478c, 0x162: 0x31a4, 0x163: 0x34ba,\n\t0x164: 0x3195, 0x165: 0x34ab, 0x168: 0x4705, 0x169: 0x4796,\n\t0x16a: 0x470a, 0x16b: 0x479b, 0x16c: 0x31c2, 0x16d: 0x34d8, 0x16e: 0x31cc, 0x16f: 0x34e2,\n\t0x170: 0x31d1, 0x171: 0x34e7, 0x172: 0x31ef, 0x173: 0x3505, 0x174: 0x3212, 0x175: 0x3528,\n\t0x176: 0x323a, 0x177: 0x3555, 0x178: 0x324e, 0x179: 0x325d, 0x17a: 0x357d, 0x17b: 0x3267,\n\t0x17c: 0x3587, 0x17d: 0x326c, 0x17e: 0x358c, 0x17f: 0x00a7,\n\t// Block 0x6, offset 0x180\n\t0x184: 0x2dee, 0x185: 0x2df4,\n\t0x186: 0x2dfa, 0x187: 0x1972, 0x188: 0x1975, 0x189: 0x1a08, 0x18a: 0x1987, 0x18b: 0x198a,\n\t0x18c: 0x1a3e, 0x18d: 0x2f88, 0x18e: 0x3294, 0x18f: 0x3096, 0x190: 0x33a2, 0x191: 0x3140,\n\t0x192: 0x3451, 0x193: 0x31d6, 0x194: 0x34ec, 0x195: 0x39cf, 0x196: 0x3b5e, 0x197: 0x39c8,\n\t0x198: 0x3b57, 0x199: 0x39d6, 0x19a: 0x3b65, 0x19b: 0x39c1, 0x19c: 0x3b50,\n\t0x19e: 0x38b0, 0x19f: 0x3a3f, 0x1a0: 0x38a9, 0x1a1: 0x3a38, 0x1a2: 0x35b3, 0x1a3: 0x35c5,\n\t0x1a6: 0x3041, 0x1a7: 0x334d, 0x1a8: 0x30be, 0x1a9: 0x33cf,\n\t0x1aa: 0x46ec, 0x1ab: 0x477d, 0x1ac: 0x3990, 0x1ad: 0x3b1f, 0x1ae: 0x35d7, 0x1af: 0x35dd,\n\t0x1b0: 0x33c5, 0x1b1: 0x1942, 0x1b2: 0x1945, 0x1b3: 0x19cf, 0x1b4: 0x3028, 0x1b5: 0x3334,\n\t0x1b8: 0x30fa, 0x1b9: 0x340b, 0x1ba: 0x38b7, 0x1bb: 0x3a46,\n\t0x1bc: 0x35ad, 0x1bd: 0x35bf, 0x1be: 0x35b9, 0x1bf: 0x35cb,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0x2f8d, 0x1c1: 0x3299, 0x1c2: 0x2f92, 0x1c3: 0x329e, 0x1c4: 0x300a, 0x1c5: 0x3316,\n\t0x1c6: 0x300f, 0x1c7: 0x331b, 0x1c8: 0x309b, 0x1c9: 0x33a7, 0x1ca: 0x30a0, 0x1cb: 0x33ac,\n\t0x1cc: 0x3145, 0x1cd: 0x3456, 0x1ce: 0x314a, 0x1cf: 0x345b, 0x1d0: 0x3168, 0x1d1: 0x3479,\n\t0x1d2: 0x316d, 0x1d3: 0x347e, 0x1d4: 0x31db, 0x1d5: 0x34f1, 0x1d6: 0x31e0, 0x1d7: 0x34f6,\n\t0x1d8: 0x3186, 0x1d9: 0x3497, 0x1da: 0x319f, 0x1db: 0x34b5,\n\t0x1de: 0x305a, 0x1df: 0x3366,\n\t0x1e6: 0x4692, 0x1e7: 0x4723, 0x1e8: 0x46ba, 0x1e9: 0x474b,\n\t0x1ea: 0x395f, 0x1eb: 0x3aee, 0x1ec: 0x393c, 0x1ed: 0x3acb, 0x1ee: 0x46d8, 0x1ef: 0x4769,\n\t0x1f0: 0x3958, 0x1f1: 0x3ae7, 0x1f2: 0x3244, 0x1f3: 0x355f,\n\t// Block 0x8, offset 0x200\n\t0x200: 0x9932, 0x201: 0x9932, 0x202: 0x9932, 0x203: 0x9932, 0x204: 0x9932, 0x205: 0x8132,\n\t0x206: 0x9932, 0x207: 0x9932, 0x208: 0x9932, 0x209: 0x9932, 0x20a: 0x9932, 0x20b: 0x9932,\n\t0x20c: 0x9932, 0x20d: 0x8132, 0x20e: 0x8132, 0x20f: 0x9932, 0x210: 0x8132, 0x211: 0x9932,\n\t0x212: 0x8132, 0x213: 0x9932, 0x214: 0x9932, 0x215: 0x8133, 0x216: 0x812d, 0x217: 0x812d,\n\t0x218: 0x812d, 0x219: 0x812d, 0x21a: 0x8133, 0x21b: 0x992b, 0x21c: 0x812d, 0x21d: 0x812d,\n\t0x21e: 0x812d, 0x21f: 0x812d, 0x220: 0x812d, 0x221: 0x8129, 0x222: 0x8129, 0x223: 0x992d,\n\t0x224: 0x992d, 0x225: 0x992d, 0x226: 0x992d, 0x227: 0x9929, 0x228: 0x9929, 0x229: 0x812d,\n\t0x22a: 0x812d, 0x22b: 0x812d, 0x22c: 0x812d, 0x22d: 0x992d, 0x22e: 0x992d, 0x22f: 0x812d,\n\t0x230: 0x992d, 0x231: 0x992d, 0x232: 0x812d, 0x233: 0x812d, 0x234: 0x8101, 0x235: 0x8101,\n\t0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812d, 0x23a: 0x812d, 0x23b: 0x812d,\n\t0x23c: 0x812d, 0x23d: 0x8132, 0x23e: 0x8132, 0x23f: 0x8132,\n\t// Block 0x9, offset 0x240\n\t0x240: 0x49ae, 0x241: 0x49b3, 0x242: 0x9932, 0x243: 0x49b8, 0x244: 0x4a71, 0x245: 0x9936,\n\t0x246: 0x8132, 0x247: 0x812d, 0x248: 0x812d, 0x249: 0x812d, 0x24a: 0x8132, 0x24b: 0x8132,\n\t0x24c: 0x8132, 0x24d: 0x812d, 0x24e: 0x812d, 0x250: 0x8132, 0x251: 0x8132,\n\t0x252: 0x8132, 0x253: 0x812d, 0x254: 0x812d, 0x255: 0x812d, 0x256: 0x812d, 0x257: 0x8132,\n\t0x258: 0x8133, 0x259: 0x812d, 0x25a: 0x812d, 0x25b: 0x8132, 0x25c: 0x8134, 0x25d: 0x8135,\n\t0x25e: 0x8135, 0x25f: 0x8134, 0x260: 0x8135, 0x261: 0x8135, 0x262: 0x8134, 0x263: 0x8132,\n\t0x264: 0x8132, 0x265: 0x8132, 0x266: 0x8132, 0x267: 0x8132, 0x268: 0x8132, 0x269: 0x8132,\n\t0x26a: 0x8132, 0x26b: 0x8132, 0x26c: 0x8132, 0x26d: 0x8132, 0x26e: 0x8132, 0x26f: 0x8132,\n\t0x274: 0x0170,\n\t0x27a: 0x42a5,\n\t0x27e: 0x0037,\n\t// Block 0xa, offset 0x280\n\t0x284: 0x425a, 0x285: 0x447b,\n\t0x286: 0x35e9, 0x287: 0x00ce, 0x288: 0x3607, 0x289: 0x3613, 0x28a: 0x3625,\n\t0x28c: 0x3643, 0x28e: 0x3655, 0x28f: 0x3673, 0x290: 0x3e08, 0x291: 0xa000,\n\t0x295: 0xa000, 0x297: 0xa000,\n\t0x299: 0xa000,\n\t0x29f: 0xa000, 0x2a1: 0xa000,\n\t0x2a5: 0xa000, 0x2a9: 0xa000,\n\t0x2aa: 0x3637, 0x2ab: 0x3667, 0x2ac: 0x47fe, 0x2ad: 0x3697, 0x2ae: 0x4828, 0x2af: 0x36a9,\n\t0x2b0: 0x3e70, 0x2b1: 0xa000, 0x2b5: 0xa000,\n\t0x2b7: 0xa000, 0x2b9: 0xa000,\n\t0x2bf: 0xa000,\n\t// Block 0xb, offset 0x2c0\n\t0x2c1: 0xa000, 0x2c5: 0xa000,\n\t0x2c9: 0xa000, 0x2ca: 0x4840, 0x2cb: 0x485e,\n\t0x2cc: 0x36c7, 0x2cd: 0x36df, 0x2ce: 0x4876, 0x2d0: 0x01be, 0x2d1: 0x01d0,\n\t0x2d2: 0x01ac, 0x2d3: 0x430c, 0x2d4: 0x4312, 0x2d5: 0x01fa, 0x2d6: 0x01e8,\n\t0x2f0: 0x01d6, 0x2f1: 0x01eb, 0x2f2: 0x01ee, 0x2f4: 0x0188, 0x2f5: 0x01c7,\n\t0x2f9: 0x01a6,\n\t// Block 0xc, offset 0x300\n\t0x300: 0x3721, 0x301: 0x372d, 0x303: 0x371b,\n\t0x306: 0xa000, 0x307: 0x3709,\n\t0x30c: 0x375d, 0x30d: 0x3745, 0x30e: 0x376f, 0x310: 0xa000,\n\t0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000,\n\t0x318: 0xa000, 0x319: 0x3751, 0x31a: 0xa000,\n\t0x31e: 0xa000, 0x323: 0xa000,\n\t0x327: 0xa000,\n\t0x32b: 0xa000, 0x32d: 0xa000,\n\t0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000,\n\t0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x37d5, 0x33a: 0xa000,\n\t0x33e: 0xa000,\n\t// Block 0xd, offset 0x340\n\t0x341: 0x3733, 0x342: 0x37b7,\n\t0x350: 0x370f, 0x351: 0x3793,\n\t0x352: 0x3715, 0x353: 0x3799, 0x356: 0x3727, 0x357: 0x37ab,\n\t0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x3829, 0x35b: 0x382f, 0x35c: 0x3739, 0x35d: 0x37bd,\n\t0x35e: 0x373f, 0x35f: 0x37c3, 0x362: 0x374b, 0x363: 0x37cf,\n\t0x364: 0x3757, 0x365: 0x37db, 0x366: 0x3763, 0x367: 0x37e7, 0x368: 0xa000, 0x369: 0xa000,\n\t0x36a: 0x3835, 0x36b: 0x383b, 0x36c: 0x378d, 0x36d: 0x3811, 0x36e: 0x3769, 0x36f: 0x37ed,\n\t0x370: 0x3775, 0x371: 0x37f9, 0x372: 0x377b, 0x373: 0x37ff, 0x374: 0x3781, 0x375: 0x3805,\n\t0x378: 0x3787, 0x379: 0x380b,\n\t// Block 0xe, offset 0x380\n\t0x387: 0x1d61,\n\t0x391: 0x812d,\n\t0x392: 0x8132, 0x393: 0x8132, 0x394: 0x8132, 0x395: 0x8132, 0x396: 0x812d, 0x397: 0x8132,\n\t0x398: 0x8132, 0x399: 0x8132, 0x39a: 0x812e, 0x39b: 0x812d, 0x39c: 0x8132, 0x39d: 0x8132,\n\t0x39e: 0x8132, 0x39f: 0x8132, 0x3a0: 0x8132, 0x3a1: 0x8132, 0x3a2: 0x812d, 0x3a3: 0x812d,\n\t0x3a4: 0x812d, 0x3a5: 0x812d, 0x3a6: 0x812d, 0x3a7: 0x812d, 0x3a8: 0x8132, 0x3a9: 0x8132,\n\t0x3aa: 0x812d, 0x3ab: 0x8132, 0x3ac: 0x8132, 0x3ad: 0x812e, 0x3ae: 0x8131, 0x3af: 0x8132,\n\t0x3b0: 0x8105, 0x3b1: 0x8106, 0x3b2: 0x8107, 0x3b3: 0x8108, 0x3b4: 0x8109, 0x3b5: 0x810a,\n\t0x3b6: 0x810b, 0x3b7: 0x810c, 0x3b8: 0x810d, 0x3b9: 0x810e, 0x3ba: 0x810e, 0x3bb: 0x810f,\n\t0x3bc: 0x8110, 0x3bd: 0x8111, 0x3bf: 0x8112,\n\t// Block 0xf, offset 0x3c0\n\t0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8116,\n\t0x3cc: 0x8117, 0x3cd: 0x8118, 0x3ce: 0x8119, 0x3cf: 0x811a, 0x3d0: 0x811b, 0x3d1: 0x811c,\n\t0x3d2: 0x811d, 0x3d3: 0x9932, 0x3d4: 0x9932, 0x3d5: 0x992d, 0x3d6: 0x812d, 0x3d7: 0x8132,\n\t0x3d8: 0x8132, 0x3d9: 0x8132, 0x3da: 0x8132, 0x3db: 0x8132, 0x3dc: 0x812d, 0x3dd: 0x8132,\n\t0x3de: 0x8132, 0x3df: 0x812d,\n\t0x3f0: 0x811e, 0x3f5: 0x1d84,\n\t0x3f6: 0x2013, 0x3f7: 0x204f, 0x3f8: 0x204a,\n\t// Block 0x10, offset 0x400\n\t0x405: 0xa000,\n\t0x406: 0x2d26, 0x407: 0xa000, 0x408: 0x2d2e, 0x409: 0xa000, 0x40a: 0x2d36, 0x40b: 0xa000,\n\t0x40c: 0x2d3e, 0x40d: 0xa000, 0x40e: 0x2d46, 0x411: 0xa000,\n\t0x412: 0x2d4e,\n\t0x434: 0x8102, 0x435: 0x9900,\n\t0x43a: 0xa000, 0x43b: 0x2d56,\n\t0x43c: 0xa000, 0x43d: 0x2d5e, 0x43e: 0xa000, 0x43f: 0xa000,\n\t// Block 0x11, offset 0x440\n\t0x440: 0x0069, 0x441: 0x006b, 0x442: 0x006f, 0x443: 0x0083, 0x444: 0x00f5, 0x445: 0x00f8,\n\t0x446: 0x0413, 0x447: 0x0085, 0x448: 0x0089, 0x449: 0x008b, 0x44a: 0x0104, 0x44b: 0x0107,\n\t0x44c: 0x010a, 0x44d: 0x008f, 0x44f: 0x0097, 0x450: 0x009b, 0x451: 0x00e0,\n\t0x452: 0x009f, 0x453: 0x00fe, 0x454: 0x0417, 0x455: 0x041b, 0x456: 0x00a1, 0x457: 0x00a9,\n\t0x458: 0x00ab, 0x459: 0x0423, 0x45a: 0x012b, 0x45b: 0x00ad, 0x45c: 0x0427, 0x45d: 0x01be,\n\t0x45e: 0x01c1, 0x45f: 0x01c4, 0x460: 0x01fa, 0x461: 0x01fd, 0x462: 0x0093, 0x463: 0x00a5,\n\t0x464: 0x00ab, 0x465: 0x00ad, 0x466: 0x01be, 0x467: 0x01c1, 0x468: 0x01eb, 0x469: 0x01fa,\n\t0x46a: 0x01fd,\n\t0x478: 0x020c,\n\t// Block 0x12, offset 0x480\n\t0x49b: 0x00fb, 0x49c: 0x0087, 0x49d: 0x0101,\n\t0x49e: 0x00d4, 0x49f: 0x010a, 0x4a0: 0x008d, 0x4a1: 0x010d, 0x4a2: 0x0110, 0x4a3: 0x0116,\n\t0x4a4: 0x011c, 0x4a5: 0x011f, 0x4a6: 0x0122, 0x4a7: 0x042b, 0x4a8: 0x016a, 0x4a9: 0x0128,\n\t0x4aa: 0x042f, 0x4ab: 0x016d, 0x4ac: 0x0131, 0x4ad: 0x012e, 0x4ae: 0x0134, 0x4af: 0x0137,\n\t0x4b0: 0x013a, 0x4b1: 0x013d, 0x4b2: 0x0140, 0x4b3: 0x014c, 0x4b4: 0x014f, 0x4b5: 0x00ec,\n\t0x4b6: 0x0152, 0x4b7: 0x0155, 0x4b8: 0x041f, 0x4b9: 0x0158, 0x4ba: 0x015b, 0x4bb: 0x00b5,\n\t0x4bc: 0x015e, 0x4bd: 0x0161, 0x4be: 0x0164, 0x4bf: 0x01d0,\n\t// Block 0x13, offset 0x4c0\n\t0x4c0: 0x2f97, 0x4c1: 0x32a3, 0x4c2: 0x2fa1, 0x4c3: 0x32ad, 0x4c4: 0x2fa6, 0x4c5: 0x32b2,\n\t0x4c6: 0x2fab, 0x4c7: 0x32b7, 0x4c8: 0x38cc, 0x4c9: 0x3a5b, 0x4ca: 0x2fc4, 0x4cb: 0x32d0,\n\t0x4cc: 0x2fce, 0x4cd: 0x32da, 0x4ce: 0x2fdd, 0x4cf: 0x32e9, 0x4d0: 0x2fd3, 0x4d1: 0x32df,\n\t0x4d2: 0x2fd8, 0x4d3: 0x32e4, 0x4d4: 0x38ef, 0x4d5: 0x3a7e, 0x4d6: 0x38f6, 0x4d7: 0x3a85,\n\t0x4d8: 0x3019, 0x4d9: 0x3325, 0x4da: 0x301e, 0x4db: 0x332a, 0x4dc: 0x3904, 0x4dd: 0x3a93,\n\t0x4de: 0x3023, 0x4df: 0x332f, 0x4e0: 0x3032, 0x4e1: 0x333e, 0x4e2: 0x3050, 0x4e3: 0x335c,\n\t0x4e4: 0x305f, 0x4e5: 0x336b, 0x4e6: 0x3055, 0x4e7: 0x3361, 0x4e8: 0x3064, 0x4e9: 0x3370,\n\t0x4ea: 0x3069, 0x4eb: 0x3375, 0x4ec: 0x30af, 0x4ed: 0x33bb, 0x4ee: 0x390b, 0x4ef: 0x3a9a,\n\t0x4f0: 0x30b9, 0x4f1: 0x33ca, 0x4f2: 0x30c3, 0x4f3: 0x33d4, 0x4f4: 0x30cd, 0x4f5: 0x33de,\n\t0x4f6: 0x46c4, 0x4f7: 0x4755, 0x4f8: 0x3912, 0x4f9: 0x3aa1, 0x4fa: 0x30e6, 0x4fb: 0x33f7,\n\t0x4fc: 0x30e1, 0x4fd: 0x33f2, 0x4fe: 0x30eb, 0x4ff: 0x33fc,\n\t// Block 0x14, offset 0x500\n\t0x500: 0x30f0, 0x501: 0x3401, 0x502: 0x30f5, 0x503: 0x3406, 0x504: 0x3109, 0x505: 0x341a,\n\t0x506: 0x3113, 0x507: 0x3424, 0x508: 0x3122, 0x509: 0x3433, 0x50a: 0x311d, 0x50b: 0x342e,\n\t0x50c: 0x3935, 0x50d: 0x3ac4, 0x50e: 0x3943, 0x50f: 0x3ad2, 0x510: 0x394a, 0x511: 0x3ad9,\n\t0x512: 0x3951, 0x513: 0x3ae0, 0x514: 0x314f, 0x515: 0x3460, 0x516: 0x3154, 0x517: 0x3465,\n\t0x518: 0x315e, 0x519: 0x346f, 0x51a: 0x46f1, 0x51b: 0x4782, 0x51c: 0x3997, 0x51d: 0x3b26,\n\t0x51e: 0x3177, 0x51f: 0x3488, 0x520: 0x3181, 0x521: 0x3492, 0x522: 0x4700, 0x523: 0x4791,\n\t0x524: 0x399e, 0x525: 0x3b2d, 0x526: 0x39a5, 0x527: 0x3b34, 0x528: 0x39ac, 0x529: 0x3b3b,\n\t0x52a: 0x3190, 0x52b: 0x34a1, 0x52c: 0x319a, 0x52d: 0x34b0, 0x52e: 0x31ae, 0x52f: 0x34c4,\n\t0x530: 0x31a9, 0x531: 0x34bf, 0x532: 0x31ea, 0x533: 0x3500, 0x534: 0x31f9, 0x535: 0x350f,\n\t0x536: 0x31f4, 0x537: 0x350a, 0x538: 0x39b3, 0x539: 0x3b42, 0x53a: 0x39ba, 0x53b: 0x3b49,\n\t0x53c: 0x31fe, 0x53d: 0x3514, 0x53e: 0x3203, 0x53f: 0x3519,\n\t// Block 0x15, offset 0x540\n\t0x540: 0x3208, 0x541: 0x351e, 0x542: 0x320d, 0x543: 0x3523, 0x544: 0x321c, 0x545: 0x3532,\n\t0x546: 0x3217, 0x547: 0x352d, 0x548: 0x3221, 0x549: 0x353c, 0x54a: 0x3226, 0x54b: 0x3541,\n\t0x54c: 0x322b, 0x54d: 0x3546, 0x54e: 0x3249, 0x54f: 0x3564, 0x550: 0x3262, 0x551: 0x3582,\n\t0x552: 0x3271, 0x553: 0x3591, 0x554: 0x3276, 0x555: 0x3596, 0x556: 0x337a, 0x557: 0x34a6,\n\t0x558: 0x3537, 0x559: 0x3573, 0x55a: 0x1be0, 0x55b: 0x42d7,\n\t0x560: 0x46a1, 0x561: 0x4732, 0x562: 0x2f83, 0x563: 0x328f,\n\t0x564: 0x3878, 0x565: 0x3a07, 0x566: 0x3871, 0x567: 0x3a00, 0x568: 0x3886, 0x569: 0x3a15,\n\t0x56a: 0x387f, 0x56b: 0x3a0e, 0x56c: 0x38be, 0x56d: 0x3a4d, 0x56e: 0x3894, 0x56f: 0x3a23,\n\t0x570: 0x388d, 0x571: 0x3a1c, 0x572: 0x38a2, 0x573: 0x3a31, 0x574: 0x389b, 0x575: 0x3a2a,\n\t0x576: 0x38c5, 0x577: 0x3a54, 0x578: 0x46b5, 0x579: 0x4746, 0x57a: 0x3000, 0x57b: 0x330c,\n\t0x57c: 0x2fec, 0x57d: 0x32f8, 0x57e: 0x38da, 0x57f: 0x3a69,\n\t// Block 0x16, offset 0x580\n\t0x580: 0x38d3, 0x581: 0x3a62, 0x582: 0x38e8, 0x583: 0x3a77, 0x584: 0x38e1, 0x585: 0x3a70,\n\t0x586: 0x38fd, 0x587: 0x3a8c, 0x588: 0x3091, 0x589: 0x339d, 0x58a: 0x30a5, 0x58b: 0x33b1,\n\t0x58c: 0x46e7, 0x58d: 0x4778, 0x58e: 0x3136, 0x58f: 0x3447, 0x590: 0x3920, 0x591: 0x3aaf,\n\t0x592: 0x3919, 0x593: 0x3aa8, 0x594: 0x392e, 0x595: 0x3abd, 0x596: 0x3927, 0x597: 0x3ab6,\n\t0x598: 0x3989, 0x599: 0x3b18, 0x59a: 0x396d, 0x59b: 0x3afc, 0x59c: 0x3966, 0x59d: 0x3af5,\n\t0x59e: 0x397b, 0x59f: 0x3b0a, 0x5a0: 0x3974, 0x5a1: 0x3b03, 0x5a2: 0x3982, 0x5a3: 0x3b11,\n\t0x5a4: 0x31e5, 0x5a5: 0x34fb, 0x5a6: 0x31c7, 0x5a7: 0x34dd, 0x5a8: 0x39e4, 0x5a9: 0x3b73,\n\t0x5aa: 0x39dd, 0x5ab: 0x3b6c, 0x5ac: 0x39f2, 0x5ad: 0x3b81, 0x5ae: 0x39eb, 0x5af: 0x3b7a,\n\t0x5b0: 0x39f9, 0x5b1: 0x3b88, 0x5b2: 0x3230, 0x5b3: 0x354b, 0x5b4: 0x3258, 0x5b5: 0x3578,\n\t0x5b6: 0x3253, 0x5b7: 0x356e, 0x5b8: 0x323f, 0x5b9: 0x355a,\n\t// Block 0x17, offset 0x5c0\n\t0x5c0: 0x4804, 0x5c1: 0x480a, 0x5c2: 0x491e, 0x5c3: 0x4936, 0x5c4: 0x4926, 0x5c5: 0x493e,\n\t0x5c6: 0x492e, 0x5c7: 0x4946, 0x5c8: 0x47aa, 0x5c9: 0x47b0, 0x5ca: 0x488e, 0x5cb: 0x48a6,\n\t0x5cc: 0x4896, 0x5cd: 0x48ae, 0x5ce: 0x489e, 0x5cf: 0x48b6, 0x5d0: 0x4816, 0x5d1: 0x481c,\n\t0x5d2: 0x3db8, 0x5d3: 0x3dc8, 0x5d4: 0x3dc0, 0x5d5: 0x3dd0,\n\t0x5d8: 0x47b6, 0x5d9: 0x47bc, 0x5da: 0x3ce8, 0x5db: 0x3cf8, 0x5dc: 0x3cf0, 0x5dd: 0x3d00,\n\t0x5e0: 0x482e, 0x5e1: 0x4834, 0x5e2: 0x494e, 0x5e3: 0x4966,\n\t0x5e4: 0x4956, 0x5e5: 0x496e, 0x5e6: 0x495e, 0x5e7: 0x4976, 0x5e8: 0x47c2, 0x5e9: 0x47c8,\n\t0x5ea: 0x48be, 0x5eb: 0x48d6, 0x5ec: 0x48c6, 0x5ed: 0x48de, 0x5ee: 0x48ce, 0x5ef: 0x48e6,\n\t0x5f0: 0x4846, 0x5f1: 0x484c, 0x5f2: 0x3e18, 0x5f3: 0x3e30, 0x5f4: 0x3e20, 0x5f5: 0x3e38,\n\t0x5f6: 0x3e28, 0x5f7: 0x3e40, 0x5f8: 0x47ce, 0x5f9: 0x47d4, 0x5fa: 0x3d18, 0x5fb: 0x3d30,\n\t0x5fc: 0x3d20, 0x5fd: 0x3d38, 0x5fe: 0x3d28, 0x5ff: 0x3d40,\n\t// Block 0x18, offset 0x600\n\t0x600: 0x4852, 0x601: 0x4858, 0x602: 0x3e48, 0x603: 0x3e58, 0x604: 0x3e50, 0x605: 0x3e60,\n\t0x608: 0x47da, 0x609: 0x47e0, 0x60a: 0x3d48, 0x60b: 0x3d58,\n\t0x60c: 0x3d50, 0x60d: 0x3d60, 0x610: 0x4864, 0x611: 0x486a,\n\t0x612: 0x3e80, 0x613: 0x3e98, 0x614: 0x3e88, 0x615: 0x3ea0, 0x616: 0x3e90, 0x617: 0x3ea8,\n\t0x619: 0x47e6, 0x61b: 0x3d68, 0x61d: 0x3d70,\n\t0x61f: 0x3d78, 0x620: 0x487c, 0x621: 0x4882, 0x622: 0x497e, 0x623: 0x4996,\n\t0x624: 0x4986, 0x625: 0x499e, 0x626: 0x498e, 0x627: 0x49a6, 0x628: 0x47ec, 0x629: 0x47f2,\n\t0x62a: 0x48ee, 0x62b: 0x4906, 0x62c: 0x48f6, 0x62d: 0x490e, 0x62e: 0x48fe, 0x62f: 0x4916,\n\t0x630: 0x47f8, 0x631: 0x431e, 0x632: 0x3691, 0x633: 0x4324, 0x634: 0x4822, 0x635: 0x432a,\n\t0x636: 0x36a3, 0x637: 0x4330, 0x638: 0x36c1, 0x639: 0x4336, 0x63a: 0x36d9, 0x63b: 0x433c,\n\t0x63c: 0x4870, 0x63d: 0x4342,\n\t// Block 0x19, offset 0x640\n\t0x640: 0x3da0, 0x641: 0x3da8, 0x642: 0x4184, 0x643: 0x41a2, 0x644: 0x418e, 0x645: 0x41ac,\n\t0x646: 0x4198, 0x647: 0x41b6, 0x648: 0x3cd8, 0x649: 0x3ce0, 0x64a: 0x40d0, 0x64b: 0x40ee,\n\t0x64c: 0x40da, 0x64d: 0x40f8, 0x64e: 0x40e4, 0x64f: 0x4102, 0x650: 0x3de8, 0x651: 0x3df0,\n\t0x652: 0x41c0, 0x653: 0x41de, 0x654: 0x41ca, 0x655: 0x41e8, 0x656: 0x41d4, 0x657: 0x41f2,\n\t0x658: 0x3d08, 0x659: 0x3d10, 0x65a: 0x410c, 0x65b: 0x412a, 0x65c: 0x4116, 0x65d: 0x4134,\n\t0x65e: 0x4120, 0x65f: 0x413e, 0x660: 0x3ec0, 0x661: 0x3ec8, 0x662: 0x41fc, 0x663: 0x421a,\n\t0x664: 0x4206, 0x665: 0x4224, 0x666: 0x4210, 0x667: 0x422e, 0x668: 0x3d80, 0x669: 0x3d88,\n\t0x66a: 0x4148, 0x66b: 0x4166, 0x66c: 0x4152, 0x66d: 0x4170, 0x66e: 0x415c, 0x66f: 0x417a,\n\t0x670: 0x3685, 0x671: 0x367f, 0x672: 0x3d90, 0x673: 0x368b, 0x674: 0x3d98,\n\t0x676: 0x4810, 0x677: 0x3db0, 0x678: 0x35f5, 0x679: 0x35ef, 0x67a: 0x35e3, 0x67b: 0x42ee,\n\t0x67c: 0x35fb, 0x67d: 0x4287, 0x67e: 0x01d3, 0x67f: 0x4287,\n\t// Block 0x1a, offset 0x680\n\t0x680: 0x42a0, 0x681: 0x4482, 0x682: 0x3dd8, 0x683: 0x369d, 0x684: 0x3de0,\n\t0x686: 0x483a, 0x687: 0x3df8, 0x688: 0x3601, 0x689: 0x42f4, 0x68a: 0x360d, 0x68b: 0x42fa,\n\t0x68c: 0x3619, 0x68d: 0x4489, 0x68e: 0x4490, 0x68f: 0x4497, 0x690: 0x36b5, 0x691: 0x36af,\n\t0x692: 0x3e00, 0x693: 0x44e4, 0x696: 0x36bb, 0x697: 0x3e10,\n\t0x698: 0x3631, 0x699: 0x362b, 0x69a: 0x361f, 0x69b: 0x4300, 0x69d: 0x449e,\n\t0x69e: 0x44a5, 0x69f: 0x44ac, 0x6a0: 0x36eb, 0x6a1: 0x36e5, 0x6a2: 0x3e68, 0x6a3: 0x44ec,\n\t0x6a4: 0x36cd, 0x6a5: 0x36d3, 0x6a6: 0x36f1, 0x6a7: 0x3e78, 0x6a8: 0x3661, 0x6a9: 0x365b,\n\t0x6aa: 0x364f, 0x6ab: 0x430c, 0x6ac: 0x3649, 0x6ad: 0x4474, 0x6ae: 0x447b, 0x6af: 0x0081,\n\t0x6b2: 0x3eb0, 0x6b3: 0x36f7, 0x6b4: 0x3eb8,\n\t0x6b6: 0x4888, 0x6b7: 0x3ed0, 0x6b8: 0x363d, 0x6b9: 0x4306, 0x6ba: 0x366d, 0x6bb: 0x4318,\n\t0x6bc: 0x3679, 0x6bd: 0x425a, 0x6be: 0x428c,\n\t// Block 0x1b, offset 0x6c0\n\t0x6c0: 0x1bd8, 0x6c1: 0x1bdc, 0x6c2: 0x0047, 0x6c3: 0x1c54, 0x6c5: 0x1be8,\n\t0x6c6: 0x1bec, 0x6c7: 0x00e9, 0x6c9: 0x1c58, 0x6ca: 0x008f, 0x6cb: 0x0051,\n\t0x6cc: 0x0051, 0x6cd: 0x0051, 0x6ce: 0x0091, 0x6cf: 0x00da, 0x6d0: 0x0053, 0x6d1: 0x0053,\n\t0x6d2: 0x0059, 0x6d3: 0x0099, 0x6d5: 0x005d, 0x6d6: 0x198d,\n\t0x6d9: 0x0061, 0x6da: 0x0063, 0x6db: 0x0065, 0x6dc: 0x0065, 0x6dd: 0x0065,\n\t0x6e0: 0x199f, 0x6e1: 0x1bc8, 0x6e2: 0x19a8,\n\t0x6e4: 0x0075, 0x6e6: 0x01b8, 0x6e8: 0x0075,\n\t0x6ea: 0x0057, 0x6eb: 0x42d2, 0x6ec: 0x0045, 0x6ed: 0x0047, 0x6ef: 0x008b,\n\t0x6f0: 0x004b, 0x6f1: 0x004d, 0x6f3: 0x005b, 0x6f4: 0x009f, 0x6f5: 0x0215,\n\t0x6f6: 0x0218, 0x6f7: 0x021b, 0x6f8: 0x021e, 0x6f9: 0x0093, 0x6fb: 0x1b98,\n\t0x6fc: 0x01e8, 0x6fd: 0x01c1, 0x6fe: 0x0179, 0x6ff: 0x01a0,\n\t// Block 0x1c, offset 0x700\n\t0x700: 0x0463, 0x705: 0x0049,\n\t0x706: 0x0089, 0x707: 0x008b, 0x708: 0x0093, 0x709: 0x0095,\n\t0x710: 0x222e, 0x711: 0x223a,\n\t0x712: 0x22ee, 0x713: 0x2216, 0x714: 0x229a, 0x715: 0x2222, 0x716: 0x22a0, 0x717: 0x22b8,\n\t0x718: 0x22c4, 0x719: 0x2228, 0x71a: 0x22ca, 0x71b: 0x2234, 0x71c: 0x22be, 0x71d: 0x22d0,\n\t0x71e: 0x22d6, 0x71f: 0x1cbc, 0x720: 0x0053, 0x721: 0x195a, 0x722: 0x1ba4, 0x723: 0x1963,\n\t0x724: 0x006d, 0x725: 0x19ab, 0x726: 0x1bd0, 0x727: 0x1d48, 0x728: 0x1966, 0x729: 0x0071,\n\t0x72a: 0x19b7, 0x72b: 0x1bd4, 0x72c: 0x0059, 0x72d: 0x0047, 0x72e: 0x0049, 0x72f: 0x005b,\n\t0x730: 0x0093, 0x731: 0x19e4, 0x732: 0x1c18, 0x733: 0x19ed, 0x734: 0x00ad, 0x735: 0x1a62,\n\t0x736: 0x1c4c, 0x737: 0x1d5c, 0x738: 0x19f0, 0x739: 0x00b1, 0x73a: 0x1a65, 0x73b: 0x1c50,\n\t0x73c: 0x0099, 0x73d: 0x0087, 0x73e: 0x0089, 0x73f: 0x009b,\n\t// Block 0x1d, offset 0x740\n\t0x741: 0x3c06, 0x743: 0xa000, 0x744: 0x3c0d, 0x745: 0xa000,\n\t0x747: 0x3c14, 0x748: 0xa000, 0x749: 0x3c1b,\n\t0x74d: 0xa000,\n\t0x760: 0x2f65, 0x761: 0xa000, 0x762: 0x3c29,\n\t0x764: 0xa000, 0x765: 0xa000,\n\t0x76d: 0x3c22, 0x76e: 0x2f60, 0x76f: 0x2f6a,\n\t0x770: 0x3c30, 0x771: 0x3c37, 0x772: 0xa000, 0x773: 0xa000, 0x774: 0x3c3e, 0x775: 0x3c45,\n\t0x776: 0xa000, 0x777: 0xa000, 0x778: 0x3c4c, 0x779: 0x3c53, 0x77a: 0xa000, 0x77b: 0xa000,\n\t0x77c: 0xa000, 0x77d: 0xa000,\n\t// Block 0x1e, offset 0x780\n\t0x780: 0x3c5a, 0x781: 0x3c61, 0x782: 0xa000, 0x783: 0xa000, 0x784: 0x3c76, 0x785: 0x3c7d,\n\t0x786: 0xa000, 0x787: 0xa000, 0x788: 0x3c84, 0x789: 0x3c8b,\n\t0x791: 0xa000,\n\t0x792: 0xa000,\n\t0x7a2: 0xa000,\n\t0x7a8: 0xa000, 0x7a9: 0xa000,\n\t0x7ab: 0xa000, 0x7ac: 0x3ca0, 0x7ad: 0x3ca7, 0x7ae: 0x3cae, 0x7af: 0x3cb5,\n\t0x7b2: 0xa000, 0x7b3: 0xa000, 0x7b4: 0xa000, 0x7b5: 0xa000,\n\t// Block 0x1f, offset 0x7c0\n\t0x7e0: 0x0023, 0x7e1: 0x0025, 0x7e2: 0x0027, 0x7e3: 0x0029,\n\t0x7e4: 0x002b, 0x7e5: 0x002d, 0x7e6: 0x002f, 0x7e7: 0x0031, 0x7e8: 0x0033, 0x7e9: 0x1882,\n\t0x7ea: 0x1885, 0x7eb: 0x1888, 0x7ec: 0x188b, 0x7ed: 0x188e, 0x7ee: 0x1891, 0x7ef: 0x1894,\n\t0x7f0: 0x1897, 0x7f1: 0x189a, 0x7f2: 0x189d, 0x7f3: 0x18a6, 0x7f4: 0x1a68, 0x7f5: 0x1a6c,\n\t0x7f6: 0x1a70, 0x7f7: 0x1a74, 0x7f8: 0x1a78, 0x7f9: 0x1a7c, 0x7fa: 0x1a80, 0x7fb: 0x1a84,\n\t0x7fc: 0x1a88, 0x7fd: 0x1c80, 0x7fe: 0x1c85, 0x7ff: 0x1c8a,\n\t// Block 0x20, offset 0x800\n\t0x800: 0x1c8f, 0x801: 0x1c94, 0x802: 0x1c99, 0x803: 0x1c9e, 0x804: 0x1ca3, 0x805: 0x1ca8,\n\t0x806: 0x1cad, 0x807: 0x1cb2, 0x808: 0x187f, 0x809: 0x18a3, 0x80a: 0x18c7, 0x80b: 0x18eb,\n\t0x80c: 0x190f, 0x80d: 0x1918, 0x80e: 0x191e, 0x80f: 0x1924, 0x810: 0x192a, 0x811: 0x1b60,\n\t0x812: 0x1b64, 0x813: 0x1b68, 0x814: 0x1b6c, 0x815: 0x1b70, 0x816: 0x1b74, 0x817: 0x1b78,\n\t0x818: 0x1b7c, 0x819: 0x1b80, 0x81a: 0x1b84, 0x81b: 0x1b88, 0x81c: 0x1af4, 0x81d: 0x1af8,\n\t0x81e: 0x1afc, 0x81f: 0x1b00, 0x820: 0x1b04, 0x821: 0x1b08, 0x822: 0x1b0c, 0x823: 0x1b10,\n\t0x824: 0x1b14, 0x825: 0x1b18, 0x826: 0x1b1c, 0x827: 0x1b20, 0x828: 0x1b24, 0x829: 0x1b28,\n\t0x82a: 0x1b2c, 0x82b: 0x1b30, 0x82c: 0x1b34, 0x82d: 0x1b38, 0x82e: 0x1b3c, 0x82f: 0x1b40,\n\t0x830: 0x1b44, 0x831: 0x1b48, 0x832: 0x1b4c, 0x833: 0x1b50, 0x834: 0x1b54, 0x835: 0x1b58,\n\t0x836: 0x0043, 0x837: 0x0045, 0x838: 0x0047, 0x839: 0x0049, 0x83a: 0x004b, 0x83b: 0x004d,\n\t0x83c: 0x004f, 0x83d: 0x0051, 0x83e: 0x0053, 0x83f: 0x0055,\n\t// Block 0x21, offset 0x840\n\t0x840: 0x06bf, 0x841: 0x06e3, 0x842: 0x06ef, 0x843: 0x06ff, 0x844: 0x0707, 0x845: 0x0713,\n\t0x846: 0x071b, 0x847: 0x0723, 0x848: 0x072f, 0x849: 0x0783, 0x84a: 0x079b, 0x84b: 0x07ab,\n\t0x84c: 0x07bb, 0x84d: 0x07cb, 0x84e: 0x07db, 0x84f: 0x07fb, 0x850: 0x07ff, 0x851: 0x0803,\n\t0x852: 0x0837, 0x853: 0x085f, 0x854: 0x086f, 0x855: 0x0877, 0x856: 0x087b, 0x857: 0x0887,\n\t0x858: 0x08a3, 0x859: 0x08a7, 0x85a: 0x08bf, 0x85b: 0x08c3, 0x85c: 0x08cb, 0x85d: 0x08db,\n\t0x85e: 0x0977, 0x85f: 0x098b, 0x860: 0x09cb, 0x861: 0x09df, 0x862: 0x09e7, 0x863: 0x09eb,\n\t0x864: 0x09fb, 0x865: 0x0a17, 0x866: 0x0a43, 0x867: 0x0a4f, 0x868: 0x0a6f, 0x869: 0x0a7b,\n\t0x86a: 0x0a7f, 0x86b: 0x0a83, 0x86c: 0x0a9b, 0x86d: 0x0a9f, 0x86e: 0x0acb, 0x86f: 0x0ad7,\n\t0x870: 0x0adf, 0x871: 0x0ae7, 0x872: 0x0af7, 0x873: 0x0aff, 0x874: 0x0b07, 0x875: 0x0b33,\n\t0x876: 0x0b37, 0x877: 0x0b3f, 0x878: 0x0b43, 0x879: 0x0b4b, 0x87a: 0x0b53, 0x87b: 0x0b63,\n\t0x87c: 0x0b7f, 0x87d: 0x0bf7, 0x87e: 0x0c0b, 0x87f: 0x0c0f,\n\t// Block 0x22, offset 0x880\n\t0x880: 0x0c8f, 0x881: 0x0c93, 0x882: 0x0ca7, 0x883: 0x0cab, 0x884: 0x0cb3, 0x885: 0x0cbb,\n\t0x886: 0x0cc3, 0x887: 0x0ccf, 0x888: 0x0cf7, 0x889: 0x0d07, 0x88a: 0x0d1b, 0x88b: 0x0d8b,\n\t0x88c: 0x0d97, 0x88d: 0x0da7, 0x88e: 0x0db3, 0x88f: 0x0dbf, 0x890: 0x0dc7, 0x891: 0x0dcb,\n\t0x892: 0x0dcf, 0x893: 0x0dd3, 0x894: 0x0dd7, 0x895: 0x0e8f, 0x896: 0x0ed7, 0x897: 0x0ee3,\n\t0x898: 0x0ee7, 0x899: 0x0eeb, 0x89a: 0x0eef, 0x89b: 0x0ef7, 0x89c: 0x0efb, 0x89d: 0x0f0f,\n\t0x89e: 0x0f2b, 0x89f: 0x0f33, 0x8a0: 0x0f73, 0x8a1: 0x0f77, 0x8a2: 0x0f7f, 0x8a3: 0x0f83,\n\t0x8a4: 0x0f8b, 0x8a5: 0x0f8f, 0x8a6: 0x0fb3, 0x8a7: 0x0fb7, 0x8a8: 0x0fd3, 0x8a9: 0x0fd7,\n\t0x8aa: 0x0fdb, 0x8ab: 0x0fdf, 0x8ac: 0x0ff3, 0x8ad: 0x1017, 0x8ae: 0x101b, 0x8af: 0x101f,\n\t0x8b0: 0x1043, 0x8b1: 0x1083, 0x8b2: 0x1087, 0x8b3: 0x10a7, 0x8b4: 0x10b7, 0x8b5: 0x10bf,\n\t0x8b6: 0x10df, 0x8b7: 0x1103, 0x8b8: 0x1147, 0x8b9: 0x114f, 0x8ba: 0x1163, 0x8bb: 0x116f,\n\t0x8bc: 0x1177, 0x8bd: 0x117f, 0x8be: 0x1183, 0x8bf: 0x1187,\n\t// Block 0x23, offset 0x8c0\n\t0x8c0: 0x119f, 0x8c1: 0x11a3, 0x8c2: 0x11bf, 0x8c3: 0x11c7, 0x8c4: 0x11cf, 0x8c5: 0x11d3,\n\t0x8c6: 0x11df, 0x8c7: 0x11e7, 0x8c8: 0x11eb, 0x8c9: 0x11ef, 0x8ca: 0x11f7, 0x8cb: 0x11fb,\n\t0x8cc: 0x129b, 0x8cd: 0x12af, 0x8ce: 0x12e3, 0x8cf: 0x12e7, 0x8d0: 0x12ef, 0x8d1: 0x131b,\n\t0x8d2: 0x1323, 0x8d3: 0x132b, 0x8d4: 0x1333, 0x8d5: 0x136f, 0x8d6: 0x1373, 0x8d7: 0x137b,\n\t0x8d8: 0x137f, 0x8d9: 0x1383, 0x8da: 0x13af, 0x8db: 0x13b3, 0x8dc: 0x13bb, 0x8dd: 0x13cf,\n\t0x8de: 0x13d3, 0x8df: 0x13ef, 0x8e0: 0x13f7, 0x8e1: 0x13fb, 0x8e2: 0x141f, 0x8e3: 0x143f,\n\t0x8e4: 0x1453, 0x8e5: 0x1457, 0x8e6: 0x145f, 0x8e7: 0x148b, 0x8e8: 0x148f, 0x8e9: 0x149f,\n\t0x8ea: 0x14c3, 0x8eb: 0x14cf, 0x8ec: 0x14df, 0x8ed: 0x14f7, 0x8ee: 0x14ff, 0x8ef: 0x1503,\n\t0x8f0: 0x1507, 0x8f1: 0x150b, 0x8f2: 0x1517, 0x8f3: 0x151b, 0x8f4: 0x1523, 0x8f5: 0x153f,\n\t0x8f6: 0x1543, 0x8f7: 0x1547, 0x8f8: 0x155f, 0x8f9: 0x1563, 0x8fa: 0x156b, 0x8fb: 0x157f,\n\t0x8fc: 0x1583, 0x8fd: 0x1587, 0x8fe: 0x158f, 0x8ff: 0x1593,\n\t// Block 0x24, offset 0x900\n\t0x906: 0xa000, 0x90b: 0xa000,\n\t0x90c: 0x3f08, 0x90d: 0xa000, 0x90e: 0x3f10, 0x90f: 0xa000, 0x910: 0x3f18, 0x911: 0xa000,\n\t0x912: 0x3f20, 0x913: 0xa000, 0x914: 0x3f28, 0x915: 0xa000, 0x916: 0x3f30, 0x917: 0xa000,\n\t0x918: 0x3f38, 0x919: 0xa000, 0x91a: 0x3f40, 0x91b: 0xa000, 0x91c: 0x3f48, 0x91d: 0xa000,\n\t0x91e: 0x3f50, 0x91f: 0xa000, 0x920: 0x3f58, 0x921: 0xa000, 0x922: 0x3f60,\n\t0x924: 0xa000, 0x925: 0x3f68, 0x926: 0xa000, 0x927: 0x3f70, 0x928: 0xa000, 0x929: 0x3f78,\n\t0x92f: 0xa000,\n\t0x930: 0x3f80, 0x931: 0x3f88, 0x932: 0xa000, 0x933: 0x3f90, 0x934: 0x3f98, 0x935: 0xa000,\n\t0x936: 0x3fa0, 0x937: 0x3fa8, 0x938: 0xa000, 0x939: 0x3fb0, 0x93a: 0x3fb8, 0x93b: 0xa000,\n\t0x93c: 0x3fc0, 0x93d: 0x3fc8,\n\t// Block 0x25, offset 0x940\n\t0x954: 0x3f00,\n\t0x959: 0x9903, 0x95a: 0x9903, 0x95b: 0x42dc, 0x95c: 0x42e2, 0x95d: 0xa000,\n\t0x95e: 0x3fd0, 0x95f: 0x26b4,\n\t0x966: 0xa000,\n\t0x96b: 0xa000, 0x96c: 0x3fe0, 0x96d: 0xa000, 0x96e: 0x3fe8, 0x96f: 0xa000,\n\t0x970: 0x3ff0, 0x971: 0xa000, 0x972: 0x3ff8, 0x973: 0xa000, 0x974: 0x4000, 0x975: 0xa000,\n\t0x976: 0x4008, 0x977: 0xa000, 0x978: 0x4010, 0x979: 0xa000, 0x97a: 0x4018, 0x97b: 0xa000,\n\t0x97c: 0x4020, 0x97d: 0xa000, 0x97e: 0x4028, 0x97f: 0xa000,\n\t// Block 0x26, offset 0x980\n\t0x980: 0x4030, 0x981: 0xa000, 0x982: 0x4038, 0x984: 0xa000, 0x985: 0x4040,\n\t0x986: 0xa000, 0x987: 0x4048, 0x988: 0xa000, 0x989: 0x4050,\n\t0x98f: 0xa000, 0x990: 0x4058, 0x991: 0x4060,\n\t0x992: 0xa000, 0x993: 0x4068, 0x994: 0x4070, 0x995: 0xa000, 0x996: 0x4078, 0x997: 0x4080,\n\t0x998: 0xa000, 0x999: 0x4088, 0x99a: 0x4090, 0x99b: 0xa000, 0x99c: 0x4098, 0x99d: 0x40a0,\n\t0x9af: 0xa000,\n\t0x9b0: 0xa000, 0x9b1: 0xa000, 0x9b2: 0xa000, 0x9b4: 0x3fd8,\n\t0x9b7: 0x40a8, 0x9b8: 0x40b0, 0x9b9: 0x40b8, 0x9ba: 0x40c0,\n\t0x9bd: 0xa000, 0x9be: 0x40c8, 0x9bf: 0x26c9,\n\t// Block 0x27, offset 0x9c0\n\t0x9c0: 0x0367, 0x9c1: 0x032b, 0x9c2: 0x032f, 0x9c3: 0x0333, 0x9c4: 0x037b, 0x9c5: 0x0337,\n\t0x9c6: 0x033b, 0x9c7: 0x033f, 0x9c8: 0x0343, 0x9c9: 0x0347, 0x9ca: 0x034b, 0x9cb: 0x034f,\n\t0x9cc: 0x0353, 0x9cd: 0x0357, 0x9ce: 0x035b, 0x9cf: 0x49bd, 0x9d0: 0x49c3, 0x9d1: 0x49c9,\n\t0x9d2: 0x49cf, 0x9d3: 0x49d5, 0x9d4: 0x49db, 0x9d5: 0x49e1, 0x9d6: 0x49e7, 0x9d7: 0x49ed,\n\t0x9d8: 0x49f3, 0x9d9: 0x49f9, 0x9da: 0x49ff, 0x9db: 0x4a05, 0x9dc: 0x4a0b, 0x9dd: 0x4a11,\n\t0x9de: 0x4a17, 0x9df: 0x4a1d, 0x9e0: 0x4a23, 0x9e1: 0x4a29, 0x9e2: 0x4a2f, 0x9e3: 0x4a35,\n\t0x9e4: 0x03c3, 0x9e5: 0x035f, 0x9e6: 0x0363, 0x9e7: 0x03e7, 0x9e8: 0x03eb, 0x9e9: 0x03ef,\n\t0x9ea: 0x03f3, 0x9eb: 0x03f7, 0x9ec: 0x03fb, 0x9ed: 0x03ff, 0x9ee: 0x036b, 0x9ef: 0x0403,\n\t0x9f0: 0x0407, 0x9f1: 0x036f, 0x9f2: 0x0373, 0x9f3: 0x0377, 0x9f4: 0x037f, 0x9f5: 0x0383,\n\t0x9f6: 0x0387, 0x9f7: 0x038b, 0x9f8: 0x038f, 0x9f9: 0x0393, 0x9fa: 0x0397, 0x9fb: 0x039b,\n\t0x9fc: 0x039f, 0x9fd: 0x03a3, 0x9fe: 0x03a7, 0x9ff: 0x03ab,\n\t// Block 0x28, offset 0xa00\n\t0xa00: 0x03af, 0xa01: 0x03b3, 0xa02: 0x040b, 0xa03: 0x040f, 0xa04: 0x03b7, 0xa05: 0x03bb,\n\t0xa06: 0x03bf, 0xa07: 0x03c7, 0xa08: 0x03cb, 0xa09: 0x03cf, 0xa0a: 0x03d3, 0xa0b: 0x03d7,\n\t0xa0c: 0x03db, 0xa0d: 0x03df, 0xa0e: 0x03e3,\n\t0xa12: 0x06bf, 0xa13: 0x071b, 0xa14: 0x06cb, 0xa15: 0x097b, 0xa16: 0x06cf, 0xa17: 0x06e7,\n\t0xa18: 0x06d3, 0xa19: 0x0f93, 0xa1a: 0x0707, 0xa1b: 0x06db, 0xa1c: 0x06c3, 0xa1d: 0x09ff,\n\t0xa1e: 0x098f, 0xa1f: 0x072f,\n\t// Block 0x29, offset 0xa40\n\t0xa40: 0x2054, 0xa41: 0x205a, 0xa42: 0x2060, 0xa43: 0x2066, 0xa44: 0x206c, 0xa45: 0x2072,\n\t0xa46: 0x2078, 0xa47: 0x207e, 0xa48: 0x2084, 0xa49: 0x208a, 0xa4a: 0x2090, 0xa4b: 0x2096,\n\t0xa4c: 0x209c, 0xa4d: 0x20a2, 0xa4e: 0x2726, 0xa4f: 0x272f, 0xa50: 0x2738, 0xa51: 0x2741,\n\t0xa52: 0x274a, 0xa53: 0x2753, 0xa54: 0x275c, 0xa55: 0x2765, 0xa56: 0x276e, 0xa57: 0x2780,\n\t0xa58: 0x2789, 0xa59: 0x2792, 0xa5a: 0x279b, 0xa5b: 0x27a4, 0xa5c: 0x2777, 0xa5d: 0x2bac,\n\t0xa5e: 0x2aed, 0xa60: 0x20a8, 0xa61: 0x20c0, 0xa62: 0x20b4, 0xa63: 0x2108,\n\t0xa64: 0x20c6, 0xa65: 0x20e4, 0xa66: 0x20ae, 0xa67: 0x20de, 0xa68: 0x20ba, 0xa69: 0x20f0,\n\t0xa6a: 0x2120, 0xa6b: 0x213e, 0xa6c: 0x2138, 0xa6d: 0x212c, 0xa6e: 0x217a, 0xa6f: 0x210e,\n\t0xa70: 0x211a, 0xa71: 0x2132, 0xa72: 0x2126, 0xa73: 0x2150, 0xa74: 0x20fc, 0xa75: 0x2144,\n\t0xa76: 0x216e, 0xa77: 0x2156, 0xa78: 0x20ea, 0xa79: 0x20cc, 0xa7a: 0x2102, 0xa7b: 0x2114,\n\t0xa7c: 0x214a, 0xa7d: 0x20d2, 0xa7e: 0x2174, 0xa7f: 0x20f6,\n\t// Block 0x2a, offset 0xa80\n\t0xa80: 0x215c, 0xa81: 0x20d8, 0xa82: 0x2162, 0xa83: 0x2168, 0xa84: 0x092f, 0xa85: 0x0b03,\n\t0xa86: 0x0ca7, 0xa87: 0x10c7,\n\t0xa90: 0x1bc4, 0xa91: 0x18a9,\n\t0xa92: 0x18ac, 0xa93: 0x18af, 0xa94: 0x18b2, 0xa95: 0x18b5, 0xa96: 0x18b8, 0xa97: 0x18bb,\n\t0xa98: 0x18be, 0xa99: 0x18c1, 0xa9a: 0x18ca, 0xa9b: 0x18cd, 0xa9c: 0x18d0, 0xa9d: 0x18d3,\n\t0xa9e: 0x18d6, 0xa9f: 0x18d9, 0xaa0: 0x0313, 0xaa1: 0x031b, 0xaa2: 0x031f, 0xaa3: 0x0327,\n\t0xaa4: 0x032b, 0xaa5: 0x032f, 0xaa6: 0x0337, 0xaa7: 0x033f, 0xaa8: 0x0343, 0xaa9: 0x034b,\n\t0xaaa: 0x034f, 0xaab: 0x0353, 0xaac: 0x0357, 0xaad: 0x035b, 0xaae: 0x2e18, 0xaaf: 0x2e20,\n\t0xab0: 0x2e28, 0xab1: 0x2e30, 0xab2: 0x2e38, 0xab3: 0x2e40, 0xab4: 0x2e48, 0xab5: 0x2e50,\n\t0xab6: 0x2e60, 0xab7: 0x2e68, 0xab8: 0x2e70, 0xab9: 0x2e78, 0xaba: 0x2e80, 0xabb: 0x2e88,\n\t0xabc: 0x2ed3, 0xabd: 0x2e9b, 0xabe: 0x2e58,\n\t// Block 0x2b, offset 0xac0\n\t0xac0: 0x06bf, 0xac1: 0x071b, 0xac2: 0x06cb, 0xac3: 0x097b, 0xac4: 0x071f, 0xac5: 0x07af,\n\t0xac6: 0x06c7, 0xac7: 0x07ab, 0xac8: 0x070b, 0xac9: 0x0887, 0xaca: 0x0d07, 0xacb: 0x0e8f,\n\t0xacc: 0x0dd7, 0xacd: 0x0d1b, 0xace: 0x145f, 0xacf: 0x098b, 0xad0: 0x0ccf, 0xad1: 0x0d4b,\n\t0xad2: 0x0d0b, 0xad3: 0x104b, 0xad4: 0x08fb, 0xad5: 0x0f03, 0xad6: 0x1387, 0xad7: 0x105f,\n\t0xad8: 0x0843, 0xad9: 0x108f, 0xada: 0x0f9b, 0xadb: 0x0a17, 0xadc: 0x140f, 0xadd: 0x077f,\n\t0xade: 0x08ab, 0xadf: 0x0df7, 0xae0: 0x1527, 0xae1: 0x0743, 0xae2: 0x07d3, 0xae3: 0x0d9b,\n\t0xae4: 0x06cf, 0xae5: 0x06e7, 0xae6: 0x06d3, 0xae7: 0x0adb, 0xae8: 0x08ef, 0xae9: 0x087f,\n\t0xaea: 0x0a57, 0xaeb: 0x0a4b, 0xaec: 0x0feb, 0xaed: 0x073f, 0xaee: 0x139b, 0xaef: 0x089b,\n\t0xaf0: 0x09f3, 0xaf1: 0x18dc, 0xaf2: 0x18df, 0xaf3: 0x18e2, 0xaf4: 0x18e5, 0xaf5: 0x18ee,\n\t0xaf6: 0x18f1, 0xaf7: 0x18f4, 0xaf8: 0x18f7, 0xaf9: 0x18fa, 0xafa: 0x18fd, 0xafb: 0x1900,\n\t0xafc: 0x1903, 0xafd: 0x1906, 0xafe: 0x1909, 0xaff: 0x1912,\n\t// Block 0x2c, offset 0xb00\n\t0xb00: 0x1cc6, 0xb01: 0x1cd5, 0xb02: 0x1ce4, 0xb03: 0x1cf3, 0xb04: 0x1d02, 0xb05: 0x1d11,\n\t0xb06: 0x1d20, 0xb07: 0x1d2f, 0xb08: 0x1d3e, 0xb09: 0x218c, 0xb0a: 0x219e, 0xb0b: 0x21b0,\n\t0xb0c: 0x1954, 0xb0d: 0x1c04, 0xb0e: 0x19d2, 0xb0f: 0x1ba8, 0xb10: 0x04cb, 0xb11: 0x04d3,\n\t0xb12: 0x04db, 0xb13: 0x04e3, 0xb14: 0x04eb, 0xb15: 0x04ef, 0xb16: 0x04f3, 0xb17: 0x04f7,\n\t0xb18: 0x04fb, 0xb19: 0x04ff, 0xb1a: 0x0503, 0xb1b: 0x0507, 0xb1c: 0x050b, 0xb1d: 0x050f,\n\t0xb1e: 0x0513, 0xb1f: 0x0517, 0xb20: 0x051b, 0xb21: 0x0523, 0xb22: 0x0527, 0xb23: 0x052b,\n\t0xb24: 0x052f, 0xb25: 0x0533, 0xb26: 0x0537, 0xb27: 0x053b, 0xb28: 0x053f, 0xb29: 0x0543,\n\t0xb2a: 0x0547, 0xb2b: 0x054b, 0xb2c: 0x054f, 0xb2d: 0x0553, 0xb2e: 0x0557, 0xb2f: 0x055b,\n\t0xb30: 0x055f, 0xb31: 0x0563, 0xb32: 0x0567, 0xb33: 0x056f, 0xb34: 0x0577, 0xb35: 0x057f,\n\t0xb36: 0x0583, 0xb37: 0x0587, 0xb38: 0x058b, 0xb39: 0x058f, 0xb3a: 0x0593, 0xb3b: 0x0597,\n\t0xb3c: 0x059b, 0xb3d: 0x059f, 0xb3e: 0x05a3,\n\t// Block 0x2d, offset 0xb40\n\t0xb40: 0x2b0c, 0xb41: 0x29a8, 0xb42: 0x2b1c, 0xb43: 0x2880, 0xb44: 0x2ee4, 0xb45: 0x288a,\n\t0xb46: 0x2894, 0xb47: 0x2f28, 0xb48: 0x29b5, 0xb49: 0x289e, 0xb4a: 0x28a8, 0xb4b: 0x28b2,\n\t0xb4c: 0x29dc, 0xb4d: 0x29e9, 0xb4e: 0x29c2, 0xb4f: 0x29cf, 0xb50: 0x2ea9, 0xb51: 0x29f6,\n\t0xb52: 0x2a03, 0xb53: 0x2bbe, 0xb54: 0x26bb, 0xb55: 0x2bd1, 0xb56: 0x2be4, 0xb57: 0x2b2c,\n\t0xb58: 0x2a10, 0xb59: 0x2bf7, 0xb5a: 0x2c0a, 0xb5b: 0x2a1d, 0xb5c: 0x28bc, 0xb5d: 0x28c6,\n\t0xb5e: 0x2eb7, 0xb5f: 0x2a2a, 0xb60: 0x2b3c, 0xb61: 0x2ef5, 0xb62: 0x28d0, 0xb63: 0x28da,\n\t0xb64: 0x2a37, 0xb65: 0x28e4, 0xb66: 0x28ee, 0xb67: 0x26d0, 0xb68: 0x26d7, 0xb69: 0x28f8,\n\t0xb6a: 0x2902, 0xb6b: 0x2c1d, 0xb6c: 0x2a44, 0xb6d: 0x2b4c, 0xb6e: 0x2c30, 0xb6f: 0x2a51,\n\t0xb70: 0x2916, 0xb71: 0x290c, 0xb72: 0x2f3c, 0xb73: 0x2a5e, 0xb74: 0x2c43, 0xb75: 0x2920,\n\t0xb76: 0x2b5c, 0xb77: 0x292a, 0xb78: 0x2a78, 0xb79: 0x2934, 0xb7a: 0x2a85, 0xb7b: 0x2f06,\n\t0xb7c: 0x2a6b, 0xb7d: 0x2b6c, 0xb7e: 0x2a92, 0xb7f: 0x26de,\n\t// Block 0x2e, offset 0xb80\n\t0xb80: 0x2f17, 0xb81: 0x293e, 0xb82: 0x2948, 0xb83: 0x2a9f, 0xb84: 0x2952, 0xb85: 0x295c,\n\t0xb86: 0x2966, 0xb87: 0x2b7c, 0xb88: 0x2aac, 0xb89: 0x26e5, 0xb8a: 0x2c56, 0xb8b: 0x2e90,\n\t0xb8c: 0x2b8c, 0xb8d: 0x2ab9, 0xb8e: 0x2ec5, 0xb8f: 0x2970, 0xb90: 0x297a, 0xb91: 0x2ac6,\n\t0xb92: 0x26ec, 0xb93: 0x2ad3, 0xb94: 0x2b9c, 0xb95: 0x26f3, 0xb96: 0x2c69, 0xb97: 0x2984,\n\t0xb98: 0x1cb7, 0xb99: 0x1ccb, 0xb9a: 0x1cda, 0xb9b: 0x1ce9, 0xb9c: 0x1cf8, 0xb9d: 0x1d07,\n\t0xb9e: 0x1d16, 0xb9f: 0x1d25, 0xba0: 0x1d34, 0xba1: 0x1d43, 0xba2: 0x2192, 0xba3: 0x21a4,\n\t0xba4: 0x21b6, 0xba5: 0x21c2, 0xba6: 0x21ce, 0xba7: 0x21da, 0xba8: 0x21e6, 0xba9: 0x21f2,\n\t0xbaa: 0x21fe, 0xbab: 0x220a, 0xbac: 0x2246, 0xbad: 0x2252, 0xbae: 0x225e, 0xbaf: 0x226a,\n\t0xbb0: 0x2276, 0xbb1: 0x1c14, 0xbb2: 0x19c6, 0xbb3: 0x1936, 0xbb4: 0x1be4, 0xbb5: 0x1a47,\n\t0xbb6: 0x1a56, 0xbb7: 0x19cc, 0xbb8: 0x1bfc, 0xbb9: 0x1c00, 0xbba: 0x1960, 0xbbb: 0x2701,\n\t0xbbc: 0x270f, 0xbbd: 0x26fa, 0xbbe: 0x2708, 0xbbf: 0x2ae0,\n\t// Block 0x2f, offset 0xbc0\n\t0xbc0: 0x1a4a, 0xbc1: 0x1a32, 0xbc2: 0x1c60, 0xbc3: 0x1a1a, 0xbc4: 0x19f3, 0xbc5: 0x1969,\n\t0xbc6: 0x1978, 0xbc7: 0x1948, 0xbc8: 0x1bf0, 0xbc9: 0x1d52, 0xbca: 0x1a4d, 0xbcb: 0x1a35,\n\t0xbcc: 0x1c64, 0xbcd: 0x1c70, 0xbce: 0x1a26, 0xbcf: 0x19fc, 0xbd0: 0x1957, 0xbd1: 0x1c1c,\n\t0xbd2: 0x1bb0, 0xbd3: 0x1b9c, 0xbd4: 0x1bcc, 0xbd5: 0x1c74, 0xbd6: 0x1a29, 0xbd7: 0x19c9,\n\t0xbd8: 0x19ff, 0xbd9: 0x19de, 0xbda: 0x1a41, 0xbdb: 0x1c78, 0xbdc: 0x1a2c, 0xbdd: 0x19c0,\n\t0xbde: 0x1a02, 0xbdf: 0x1c3c, 0xbe0: 0x1bf4, 0xbe1: 0x1a14, 0xbe2: 0x1c24, 0xbe3: 0x1c40,\n\t0xbe4: 0x1bf8, 0xbe5: 0x1a17, 0xbe6: 0x1c28, 0xbe7: 0x22e8, 0xbe8: 0x22fc, 0xbe9: 0x1996,\n\t0xbea: 0x1c20, 0xbeb: 0x1bb4, 0xbec: 0x1ba0, 0xbed: 0x1c48, 0xbee: 0x2716, 0xbef: 0x27ad,\n\t0xbf0: 0x1a59, 0xbf1: 0x1a44, 0xbf2: 0x1c7c, 0xbf3: 0x1a2f, 0xbf4: 0x1a50, 0xbf5: 0x1a38,\n\t0xbf6: 0x1c68, 0xbf7: 0x1a1d, 0xbf8: 0x19f6, 0xbf9: 0x1981, 0xbfa: 0x1a53, 0xbfb: 0x1a3b,\n\t0xbfc: 0x1c6c, 0xbfd: 0x1a20, 0xbfe: 0x19f9, 0xbff: 0x1984,\n\t// Block 0x30, offset 0xc00\n\t0xc00: 0x1c2c, 0xc01: 0x1bb8, 0xc02: 0x1d4d, 0xc03: 0x1939, 0xc04: 0x19ba, 0xc05: 0x19bd,\n\t0xc06: 0x22f5, 0xc07: 0x1b94, 0xc08: 0x19c3, 0xc09: 0x194b, 0xc0a: 0x19e1, 0xc0b: 0x194e,\n\t0xc0c: 0x19ea, 0xc0d: 0x196c, 0xc0e: 0x196f, 0xc0f: 0x1a05, 0xc10: 0x1a0b, 0xc11: 0x1a0e,\n\t0xc12: 0x1c30, 0xc13: 0x1a11, 0xc14: 0x1a23, 0xc15: 0x1c38, 0xc16: 0x1c44, 0xc17: 0x1990,\n\t0xc18: 0x1d57, 0xc19: 0x1bbc, 0xc1a: 0x1993, 0xc1b: 0x1a5c, 0xc1c: 0x19a5, 0xc1d: 0x19b4,\n\t0xc1e: 0x22e2, 0xc1f: 0x22dc, 0xc20: 0x1cc1, 0xc21: 0x1cd0, 0xc22: 0x1cdf, 0xc23: 0x1cee,\n\t0xc24: 0x1cfd, 0xc25: 0x1d0c, 0xc26: 0x1d1b, 0xc27: 0x1d2a, 0xc28: 0x1d39, 0xc29: 0x2186,\n\t0xc2a: 0x2198, 0xc2b: 0x21aa, 0xc2c: 0x21bc, 0xc2d: 0x21c8, 0xc2e: 0x21d4, 0xc2f: 0x21e0,\n\t0xc30: 0x21ec, 0xc31: 0x21f8, 0xc32: 0x2204, 0xc33: 0x2240, 0xc34: 0x224c, 0xc35: 0x2258,\n\t0xc36: 0x2264, 0xc37: 0x2270, 0xc38: 0x227c, 0xc39: 0x2282, 0xc3a: 0x2288, 0xc3b: 0x228e,\n\t0xc3c: 0x2294, 0xc3d: 0x22a6, 0xc3e: 0x22ac, 0xc3f: 0x1c10,\n\t// Block 0x31, offset 0xc40\n\t0xc40: 0x1377, 0xc41: 0x0cfb, 0xc42: 0x13d3, 0xc43: 0x139f, 0xc44: 0x0e57, 0xc45: 0x06eb,\n\t0xc46: 0x08df, 0xc47: 0x162b, 0xc48: 0x162b, 0xc49: 0x0a0b, 0xc4a: 0x145f, 0xc4b: 0x0943,\n\t0xc4c: 0x0a07, 0xc4d: 0x0bef, 0xc4e: 0x0fcf, 0xc4f: 0x115f, 0xc50: 0x1297, 0xc51: 0x12d3,\n\t0xc52: 0x1307, 0xc53: 0x141b, 0xc54: 0x0d73, 0xc55: 0x0dff, 0xc56: 0x0eab, 0xc57: 0x0f43,\n\t0xc58: 0x125f, 0xc59: 0x1447, 0xc5a: 0x1573, 0xc5b: 0x070f, 0xc5c: 0x08b3, 0xc5d: 0x0d87,\n\t0xc5e: 0x0ecf, 0xc5f: 0x1293, 0xc60: 0x15c3, 0xc61: 0x0ab3, 0xc62: 0x0e77, 0xc63: 0x1283,\n\t0xc64: 0x1317, 0xc65: 0x0c23, 0xc66: 0x11bb, 0xc67: 0x12df, 0xc68: 0x0b1f, 0xc69: 0x0d0f,\n\t0xc6a: 0x0e17, 0xc6b: 0x0f1b, 0xc6c: 0x1427, 0xc6d: 0x074f, 0xc6e: 0x07e7, 0xc6f: 0x0853,\n\t0xc70: 0x0c8b, 0xc71: 0x0d7f, 0xc72: 0x0ecb, 0xc73: 0x0fef, 0xc74: 0x1177, 0xc75: 0x128b,\n\t0xc76: 0x12a3, 0xc77: 0x13c7, 0xc78: 0x14ef, 0xc79: 0x15a3, 0xc7a: 0x15bf, 0xc7b: 0x102b,\n\t0xc7c: 0x106b, 0xc7d: 0x1123, 0xc7e: 0x1243, 0xc7f: 0x147b,\n\t// Block 0x32, offset 0xc80\n\t0xc80: 0x15cb, 0xc81: 0x134b, 0xc82: 0x09c7, 0xc83: 0x0b3b, 0xc84: 0x10db, 0xc85: 0x119b,\n\t0xc86: 0x0eff, 0xc87: 0x1033, 0xc88: 0x1397, 0xc89: 0x14e7, 0xc8a: 0x09c3, 0xc8b: 0x0a8f,\n\t0xc8c: 0x0d77, 0xc8d: 0x0e2b, 0xc8e: 0x0e5f, 0xc8f: 0x1113, 0xc90: 0x113b, 0xc91: 0x14a7,\n\t0xc92: 0x084f, 0xc93: 0x11a7, 0xc94: 0x07f3, 0xc95: 0x07ef, 0xc96: 0x1097, 0xc97: 0x1127,\n\t0xc98: 0x125b, 0xc99: 0x14af, 0xc9a: 0x1367, 0xc9b: 0x0c27, 0xc9c: 0x0d73, 0xc9d: 0x1357,\n\t0xc9e: 0x06f7, 0xc9f: 0x0a63, 0xca0: 0x0b93, 0xca1: 0x0f2f, 0xca2: 0x0faf, 0xca3: 0x0873,\n\t0xca4: 0x103b, 0xca5: 0x075f, 0xca6: 0x0b77, 0xca7: 0x06d7, 0xca8: 0x0deb, 0xca9: 0x0ca3,\n\t0xcaa: 0x110f, 0xcab: 0x08c7, 0xcac: 0x09b3, 0xcad: 0x0ffb, 0xcae: 0x1263, 0xcaf: 0x133b,\n\t0xcb0: 0x0db7, 0xcb1: 0x13f7, 0xcb2: 0x0de3, 0xcb3: 0x0c37, 0xcb4: 0x121b, 0xcb5: 0x0c57,\n\t0xcb6: 0x0fab, 0xcb7: 0x072b, 0xcb8: 0x07a7, 0xcb9: 0x07eb, 0xcba: 0x0d53, 0xcbb: 0x10fb,\n\t0xcbc: 0x11f3, 0xcbd: 0x1347, 0xcbe: 0x145b, 0xcbf: 0x085b,\n\t// Block 0x33, offset 0xcc0\n\t0xcc0: 0x090f, 0xcc1: 0x0a17, 0xcc2: 0x0b2f, 0xcc3: 0x0cbf, 0xcc4: 0x0e7b, 0xcc5: 0x103f,\n\t0xcc6: 0x1497, 0xcc7: 0x157b, 0xcc8: 0x15cf, 0xcc9: 0x15e7, 0xcca: 0x0837, 0xccb: 0x0cf3,\n\t0xccc: 0x0da3, 0xccd: 0x13eb, 0xcce: 0x0afb, 0xccf: 0x0bd7, 0xcd0: 0x0bf3, 0xcd1: 0x0c83,\n\t0xcd2: 0x0e6b, 0xcd3: 0x0eb7, 0xcd4: 0x0f67, 0xcd5: 0x108b, 0xcd6: 0x112f, 0xcd7: 0x1193,\n\t0xcd8: 0x13db, 0xcd9: 0x126b, 0xcda: 0x1403, 0xcdb: 0x147f, 0xcdc: 0x080f, 0xcdd: 0x083b,\n\t0xcde: 0x0923, 0xcdf: 0x0ea7, 0xce0: 0x12f3, 0xce1: 0x133b, 0xce2: 0x0b1b, 0xce3: 0x0b8b,\n\t0xce4: 0x0c4f, 0xce5: 0x0daf, 0xce6: 0x10d7, 0xce7: 0x0f23, 0xce8: 0x073b, 0xce9: 0x097f,\n\t0xcea: 0x0a63, 0xceb: 0x0ac7, 0xcec: 0x0b97, 0xced: 0x0f3f, 0xcee: 0x0f5b, 0xcef: 0x116b,\n\t0xcf0: 0x118b, 0xcf1: 0x1463, 0xcf2: 0x14e3, 0xcf3: 0x14f3, 0xcf4: 0x152f, 0xcf5: 0x0753,\n\t0xcf6: 0x107f, 0xcf7: 0x144f, 0xcf8: 0x14cb, 0xcf9: 0x0baf, 0xcfa: 0x0717, 0xcfb: 0x0777,\n\t0xcfc: 0x0a67, 0xcfd: 0x0a87, 0xcfe: 0x0caf, 0xcff: 0x0d73,\n\t// Block 0x34, offset 0xd00\n\t0xd00: 0x0ec3, 0xd01: 0x0fcb, 0xd02: 0x1277, 0xd03: 0x1417, 0xd04: 0x1623, 0xd05: 0x0ce3,\n\t0xd06: 0x14a3, 0xd07: 0x0833, 0xd08: 0x0d2f, 0xd09: 0x0d3b, 0xd0a: 0x0e0f, 0xd0b: 0x0e47,\n\t0xd0c: 0x0f4b, 0xd0d: 0x0fa7, 0xd0e: 0x1027, 0xd0f: 0x110b, 0xd10: 0x153b, 0xd11: 0x07af,\n\t0xd12: 0x0c03, 0xd13: 0x14b3, 0xd14: 0x0767, 0xd15: 0x0aab, 0xd16: 0x0e2f, 0xd17: 0x13df,\n\t0xd18: 0x0b67, 0xd19: 0x0bb7, 0xd1a: 0x0d43, 0xd1b: 0x0f2f, 0xd1c: 0x14bb, 0xd1d: 0x0817,\n\t0xd1e: 0x08ff, 0xd1f: 0x0a97, 0xd20: 0x0cd3, 0xd21: 0x0d1f, 0xd22: 0x0d5f, 0xd23: 0x0df3,\n\t0xd24: 0x0f47, 0xd25: 0x0fbb, 0xd26: 0x1157, 0xd27: 0x12f7, 0xd28: 0x1303, 0xd29: 0x1457,\n\t0xd2a: 0x14d7, 0xd2b: 0x0883, 0xd2c: 0x0e4b, 0xd2d: 0x0903, 0xd2e: 0x0ec7, 0xd2f: 0x0f6b,\n\t0xd30: 0x1287, 0xd31: 0x14bf, 0xd32: 0x15ab, 0xd33: 0x15d3, 0xd34: 0x0d37, 0xd35: 0x0e27,\n\t0xd36: 0x11c3, 0xd37: 0x10b7, 0xd38: 0x10c3, 0xd39: 0x10e7, 0xd3a: 0x0f17, 0xd3b: 0x0e9f,\n\t0xd3c: 0x1363, 0xd3d: 0x0733, 0xd3e: 0x122b, 0xd3f: 0x081b,\n\t// Block 0x35, offset 0xd40\n\t0xd40: 0x080b, 0xd41: 0x0b0b, 0xd42: 0x0c2b, 0xd43: 0x10f3, 0xd44: 0x0a53, 0xd45: 0x0e03,\n\t0xd46: 0x0cef, 0xd47: 0x13e7, 0xd48: 0x12e7, 0xd49: 0x14ab, 0xd4a: 0x1323, 0xd4b: 0x0b27,\n\t0xd4c: 0x0787, 0xd4d: 0x095b, 0xd50: 0x09af,\n\t0xd52: 0x0cdf, 0xd55: 0x07f7, 0xd56: 0x0f1f, 0xd57: 0x0fe3,\n\t0xd58: 0x1047, 0xd59: 0x1063, 0xd5a: 0x1067, 0xd5b: 0x107b, 0xd5c: 0x14fb, 0xd5d: 0x10eb,\n\t0xd5e: 0x116f, 0xd60: 0x128f, 0xd62: 0x1353,\n\t0xd65: 0x1407, 0xd66: 0x1433,\n\t0xd6a: 0x154f, 0xd6b: 0x1553, 0xd6c: 0x1557, 0xd6d: 0x15bb, 0xd6e: 0x142b, 0xd6f: 0x14c7,\n\t0xd70: 0x0757, 0xd71: 0x077b, 0xd72: 0x078f, 0xd73: 0x084b, 0xd74: 0x0857, 0xd75: 0x0897,\n\t0xd76: 0x094b, 0xd77: 0x0967, 0xd78: 0x096f, 0xd79: 0x09ab, 0xd7a: 0x09b7, 0xd7b: 0x0a93,\n\t0xd7c: 0x0a9b, 0xd7d: 0x0ba3, 0xd7e: 0x0bcb, 0xd7f: 0x0bd3,\n\t// Block 0x36, offset 0xd80\n\t0xd80: 0x0beb, 0xd81: 0x0c97, 0xd82: 0x0cc7, 0xd83: 0x0ce7, 0xd84: 0x0d57, 0xd85: 0x0e1b,\n\t0xd86: 0x0e37, 0xd87: 0x0e67, 0xd88: 0x0ebb, 0xd89: 0x0edb, 0xd8a: 0x0f4f, 0xd8b: 0x102f,\n\t0xd8c: 0x104b, 0xd8d: 0x1053, 0xd8e: 0x104f, 0xd8f: 0x1057, 0xd90: 0x105b, 0xd91: 0x105f,\n\t0xd92: 0x1073, 0xd93: 0x1077, 0xd94: 0x109b, 0xd95: 0x10af, 0xd96: 0x10cb, 0xd97: 0x112f,\n\t0xd98: 0x1137, 0xd99: 0x113f, 0xd9a: 0x1153, 0xd9b: 0x117b, 0xd9c: 0x11cb, 0xd9d: 0x11ff,\n\t0xd9e: 0x11ff, 0xd9f: 0x1267, 0xda0: 0x130f, 0xda1: 0x1327, 0xda2: 0x135b, 0xda3: 0x135f,\n\t0xda4: 0x13a3, 0xda5: 0x13a7, 0xda6: 0x13ff, 0xda7: 0x1407, 0xda8: 0x14db, 0xda9: 0x151f,\n\t0xdaa: 0x1537, 0xdab: 0x0b9b, 0xdac: 0x171e, 0xdad: 0x11e3,\n\t0xdb0: 0x06df, 0xdb1: 0x07e3, 0xdb2: 0x07a3, 0xdb3: 0x074b, 0xdb4: 0x078b, 0xdb5: 0x07b7,\n\t0xdb6: 0x0847, 0xdb7: 0x0863, 0xdb8: 0x094b, 0xdb9: 0x0937, 0xdba: 0x0947, 0xdbb: 0x0963,\n\t0xdbc: 0x09af, 0xdbd: 0x09bf, 0xdbe: 0x0a03, 0xdbf: 0x0a0f,\n\t// Block 0x37, offset 0xdc0\n\t0xdc0: 0x0a2b, 0xdc1: 0x0a3b, 0xdc2: 0x0b23, 0xdc3: 0x0b2b, 0xdc4: 0x0b5b, 0xdc5: 0x0b7b,\n\t0xdc6: 0x0bab, 0xdc7: 0x0bc3, 0xdc8: 0x0bb3, 0xdc9: 0x0bd3, 0xdca: 0x0bc7, 0xdcb: 0x0beb,\n\t0xdcc: 0x0c07, 0xdcd: 0x0c5f, 0xdce: 0x0c6b, 0xdcf: 0x0c73, 0xdd0: 0x0c9b, 0xdd1: 0x0cdf,\n\t0xdd2: 0x0d0f, 0xdd3: 0x0d13, 0xdd4: 0x0d27, 0xdd5: 0x0da7, 0xdd6: 0x0db7, 0xdd7: 0x0e0f,\n\t0xdd8: 0x0e5b, 0xdd9: 0x0e53, 0xdda: 0x0e67, 0xddb: 0x0e83, 0xddc: 0x0ebb, 0xddd: 0x1013,\n\t0xdde: 0x0edf, 0xddf: 0x0f13, 0xde0: 0x0f1f, 0xde1: 0x0f5f, 0xde2: 0x0f7b, 0xde3: 0x0f9f,\n\t0xde4: 0x0fc3, 0xde5: 0x0fc7, 0xde6: 0x0fe3, 0xde7: 0x0fe7, 0xde8: 0x0ff7, 0xde9: 0x100b,\n\t0xdea: 0x1007, 0xdeb: 0x1037, 0xdec: 0x10b3, 0xded: 0x10cb, 0xdee: 0x10e3, 0xdef: 0x111b,\n\t0xdf0: 0x112f, 0xdf1: 0x114b, 0xdf2: 0x117b, 0xdf3: 0x122f, 0xdf4: 0x1257, 0xdf5: 0x12cb,\n\t0xdf6: 0x1313, 0xdf7: 0x131f, 0xdf8: 0x1327, 0xdf9: 0x133f, 0xdfa: 0x1353, 0xdfb: 0x1343,\n\t0xdfc: 0x135b, 0xdfd: 0x1357, 0xdfe: 0x134f, 0xdff: 0x135f,\n\t// Block 0x38, offset 0xe00\n\t0xe00: 0x136b, 0xe01: 0x13a7, 0xe02: 0x13e3, 0xe03: 0x1413, 0xe04: 0x144b, 0xe05: 0x146b,\n\t0xe06: 0x14b7, 0xe07: 0x14db, 0xe08: 0x14fb, 0xe09: 0x150f, 0xe0a: 0x151f, 0xe0b: 0x152b,\n\t0xe0c: 0x1537, 0xe0d: 0x158b, 0xe0e: 0x162b, 0xe0f: 0x16b5, 0xe10: 0x16b0, 0xe11: 0x16e2,\n\t0xe12: 0x0607, 0xe13: 0x062f, 0xe14: 0x0633, 0xe15: 0x1764, 0xe16: 0x1791, 0xe17: 0x1809,\n\t0xe18: 0x1617, 0xe19: 0x1627,\n\t// Block 0x39, offset 0xe40\n\t0xe40: 0x19d5, 0xe41: 0x19d8, 0xe42: 0x19db, 0xe43: 0x1c08, 0xe44: 0x1c0c, 0xe45: 0x1a5f,\n\t0xe46: 0x1a5f,\n\t0xe53: 0x1d75, 0xe54: 0x1d66, 0xe55: 0x1d6b, 0xe56: 0x1d7a, 0xe57: 0x1d70,\n\t0xe5d: 0x4390,\n\t0xe5e: 0x8115, 0xe5f: 0x4402, 0xe60: 0x022d, 0xe61: 0x0215, 0xe62: 0x021e, 0xe63: 0x0221,\n\t0xe64: 0x0224, 0xe65: 0x0227, 0xe66: 0x022a, 0xe67: 0x0230, 0xe68: 0x0233, 0xe69: 0x0017,\n\t0xe6a: 0x43f0, 0xe6b: 0x43f6, 0xe6c: 0x44f4, 0xe6d: 0x44fc, 0xe6e: 0x4348, 0xe6f: 0x434e,\n\t0xe70: 0x4354, 0xe71: 0x435a, 0xe72: 0x4366, 0xe73: 0x436c, 0xe74: 0x4372, 0xe75: 0x437e,\n\t0xe76: 0x4384, 0xe78: 0x438a, 0xe79: 0x4396, 0xe7a: 0x439c, 0xe7b: 0x43a2,\n\t0xe7c: 0x43ae, 0xe7e: 0x43b4,\n\t// Block 0x3a, offset 0xe80\n\t0xe80: 0x43ba, 0xe81: 0x43c0, 0xe83: 0x43c6, 0xe84: 0x43cc,\n\t0xe86: 0x43d8, 0xe87: 0x43de, 0xe88: 0x43e4, 0xe89: 0x43ea, 0xe8a: 0x43fc, 0xe8b: 0x4378,\n\t0xe8c: 0x4360, 0xe8d: 0x43a8, 0xe8e: 0x43d2, 0xe8f: 0x1d7f, 0xe90: 0x0299, 0xe91: 0x0299,\n\t0xe92: 0x02a2, 0xe93: 0x02a2, 0xe94: 0x02a2, 0xe95: 0x02a2, 0xe96: 0x02a5, 0xe97: 0x02a5,\n\t0xe98: 0x02a5, 0xe99: 0x02a5, 0xe9a: 0x02ab, 0xe9b: 0x02ab, 0xe9c: 0x02ab, 0xe9d: 0x02ab,\n\t0xe9e: 0x029f, 0xe9f: 0x029f, 0xea0: 0x029f, 0xea1: 0x029f, 0xea2: 0x02a8, 0xea3: 0x02a8,\n\t0xea4: 0x02a8, 0xea5: 0x02a8, 0xea6: 0x029c, 0xea7: 0x029c, 0xea8: 0x029c, 0xea9: 0x029c,\n\t0xeaa: 0x02cf, 0xeab: 0x02cf, 0xeac: 0x02cf, 0xead: 0x02cf, 0xeae: 0x02d2, 0xeaf: 0x02d2,\n\t0xeb0: 0x02d2, 0xeb1: 0x02d2, 0xeb2: 0x02b1, 0xeb3: 0x02b1, 0xeb4: 0x02b1, 0xeb5: 0x02b1,\n\t0xeb6: 0x02ae, 0xeb7: 0x02ae, 0xeb8: 0x02ae, 0xeb9: 0x02ae, 0xeba: 0x02b4, 0xebb: 0x02b4,\n\t0xebc: 0x02b4, 0xebd: 0x02b4, 0xebe: 0x02b7, 0xebf: 0x02b7,\n\t// Block 0x3b, offset 0xec0\n\t0xec0: 0x02b7, 0xec1: 0x02b7, 0xec2: 0x02c0, 0xec3: 0x02c0, 0xec4: 0x02bd, 0xec5: 0x02bd,\n\t0xec6: 0x02c3, 0xec7: 0x02c3, 0xec8: 0x02ba, 0xec9: 0x02ba, 0xeca: 0x02c9, 0xecb: 0x02c9,\n\t0xecc: 0x02c6, 0xecd: 0x02c6, 0xece: 0x02d5, 0xecf: 0x02d5, 0xed0: 0x02d5, 0xed1: 0x02d5,\n\t0xed2: 0x02db, 0xed3: 0x02db, 0xed4: 0x02db, 0xed5: 0x02db, 0xed6: 0x02e1, 0xed7: 0x02e1,\n\t0xed8: 0x02e1, 0xed9: 0x02e1, 0xeda: 0x02de, 0xedb: 0x02de, 0xedc: 0x02de, 0xedd: 0x02de,\n\t0xede: 0x02e4, 0xedf: 0x02e4, 0xee0: 0x02e7, 0xee1: 0x02e7, 0xee2: 0x02e7, 0xee3: 0x02e7,\n\t0xee4: 0x446e, 0xee5: 0x446e, 0xee6: 0x02ed, 0xee7: 0x02ed, 0xee8: 0x02ed, 0xee9: 0x02ed,\n\t0xeea: 0x02ea, 0xeeb: 0x02ea, 0xeec: 0x02ea, 0xeed: 0x02ea, 0xeee: 0x0308, 0xeef: 0x0308,\n\t0xef0: 0x4468, 0xef1: 0x4468,\n\t// Block 0x3c, offset 0xf00\n\t0xf13: 0x02d8, 0xf14: 0x02d8, 0xf15: 0x02d8, 0xf16: 0x02d8, 0xf17: 0x02f6,\n\t0xf18: 0x02f6, 0xf19: 0x02f3, 0xf1a: 0x02f3, 0xf1b: 0x02f9, 0xf1c: 0x02f9, 0xf1d: 0x204f,\n\t0xf1e: 0x02ff, 0xf1f: 0x02ff, 0xf20: 0x02f0, 0xf21: 0x02f0, 0xf22: 0x02fc, 0xf23: 0x02fc,\n\t0xf24: 0x0305, 0xf25: 0x0305, 0xf26: 0x0305, 0xf27: 0x0305, 0xf28: 0x028d, 0xf29: 0x028d,\n\t0xf2a: 0x25aa, 0xf2b: 0x25aa, 0xf2c: 0x261a, 0xf2d: 0x261a, 0xf2e: 0x25e9, 0xf2f: 0x25e9,\n\t0xf30: 0x2605, 0xf31: 0x2605, 0xf32: 0x25fe, 0xf33: 0x25fe, 0xf34: 0x260c, 0xf35: 0x260c,\n\t0xf36: 0x2613, 0xf37: 0x2613, 0xf38: 0x2613, 0xf39: 0x25f0, 0xf3a: 0x25f0, 0xf3b: 0x25f0,\n\t0xf3c: 0x0302, 0xf3d: 0x0302, 0xf3e: 0x0302, 0xf3f: 0x0302,\n\t// Block 0x3d, offset 0xf40\n\t0xf40: 0x25b1, 0xf41: 0x25b8, 0xf42: 0x25d4, 0xf43: 0x25f0, 0xf44: 0x25f7, 0xf45: 0x1d89,\n\t0xf46: 0x1d8e, 0xf47: 0x1d93, 0xf48: 0x1da2, 0xf49: 0x1db1, 0xf4a: 0x1db6, 0xf4b: 0x1dbb,\n\t0xf4c: 0x1dc0, 0xf4d: 0x1dc5, 0xf4e: 0x1dd4, 0xf4f: 0x1de3, 0xf50: 0x1de8, 0xf51: 0x1ded,\n\t0xf52: 0x1dfc, 0xf53: 0x1e0b, 0xf54: 0x1e10, 0xf55: 0x1e15, 0xf56: 0x1e1a, 0xf57: 0x1e29,\n\t0xf58: 0x1e2e, 0xf59: 0x1e3d, 0xf5a: 0x1e42, 0xf5b: 0x1e47, 0xf5c: 0x1e56, 0xf5d: 0x1e5b,\n\t0xf5e: 0x1e60, 0xf5f: 0x1e6a, 0xf60: 0x1ea6, 0xf61: 0x1eb5, 0xf62: 0x1ec4, 0xf63: 0x1ec9,\n\t0xf64: 0x1ece, 0xf65: 0x1ed8, 0xf66: 0x1ee7, 0xf67: 0x1eec, 0xf68: 0x1efb, 0xf69: 0x1f00,\n\t0xf6a: 0x1f05, 0xf6b: 0x1f14, 0xf6c: 0x1f19, 0xf6d: 0x1f28, 0xf6e: 0x1f2d, 0xf6f: 0x1f32,\n\t0xf70: 0x1f37, 0xf71: 0x1f3c, 0xf72: 0x1f41, 0xf73: 0x1f46, 0xf74: 0x1f4b, 0xf75: 0x1f50,\n\t0xf76: 0x1f55, 0xf77: 0x1f5a, 0xf78: 0x1f5f, 0xf79: 0x1f64, 0xf7a: 0x1f69, 0xf7b: 0x1f6e,\n\t0xf7c: 0x1f73, 0xf7d: 0x1f78, 0xf7e: 0x1f7d, 0xf7f: 0x1f87,\n\t// Block 0x3e, offset 0xf80\n\t0xf80: 0x1f8c, 0xf81: 0x1f91, 0xf82: 0x1f96, 0xf83: 0x1fa0, 0xf84: 0x1fa5, 0xf85: 0x1faf,\n\t0xf86: 0x1fb4, 0xf87: 0x1fb9, 0xf88: 0x1fbe, 0xf89: 0x1fc3, 0xf8a: 0x1fc8, 0xf8b: 0x1fcd,\n\t0xf8c: 0x1fd2, 0xf8d: 0x1fd7, 0xf8e: 0x1fe6, 0xf8f: 0x1ff5, 0xf90: 0x1ffa, 0xf91: 0x1fff,\n\t0xf92: 0x2004, 0xf93: 0x2009, 0xf94: 0x200e, 0xf95: 0x2018, 0xf96: 0x201d, 0xf97: 0x2022,\n\t0xf98: 0x2031, 0xf99: 0x2040, 0xf9a: 0x2045, 0xf9b: 0x4420, 0xf9c: 0x4426, 0xf9d: 0x445c,\n\t0xf9e: 0x44b3, 0xf9f: 0x44ba, 0xfa0: 0x44c1, 0xfa1: 0x44c8, 0xfa2: 0x44cf, 0xfa3: 0x44d6,\n\t0xfa4: 0x25c6, 0xfa5: 0x25cd, 0xfa6: 0x25d4, 0xfa7: 0x25db, 0xfa8: 0x25f0, 0xfa9: 0x25f7,\n\t0xfaa: 0x1d98, 0xfab: 0x1d9d, 0xfac: 0x1da2, 0xfad: 0x1da7, 0xfae: 0x1db1, 0xfaf: 0x1db6,\n\t0xfb0: 0x1dca, 0xfb1: 0x1dcf, 0xfb2: 0x1dd4, 0xfb3: 0x1dd9, 0xfb4: 0x1de3, 0xfb5: 0x1de8,\n\t0xfb6: 0x1df2, 0xfb7: 0x1df7, 0xfb8: 0x1dfc, 0xfb9: 0x1e01, 0xfba: 0x1e0b, 0xfbb: 0x1e10,\n\t0xfbc: 0x1f3c, 0xfbd: 0x1f41, 0xfbe: 0x1f50, 0xfbf: 0x1f55,\n\t// Block 0x3f, offset 0xfc0\n\t0xfc0: 0x1f5a, 0xfc1: 0x1f6e, 0xfc2: 0x1f73, 0xfc3: 0x1f78, 0xfc4: 0x1f7d, 0xfc5: 0x1f96,\n\t0xfc6: 0x1fa0, 0xfc7: 0x1fa5, 0xfc8: 0x1faa, 0xfc9: 0x1fbe, 0xfca: 0x1fdc, 0xfcb: 0x1fe1,\n\t0xfcc: 0x1fe6, 0xfcd: 0x1feb, 0xfce: 0x1ff5, 0xfcf: 0x1ffa, 0xfd0: 0x445c, 0xfd1: 0x2027,\n\t0xfd2: 0x202c, 0xfd3: 0x2031, 0xfd4: 0x2036, 0xfd5: 0x2040, 0xfd6: 0x2045, 0xfd7: 0x25b1,\n\t0xfd8: 0x25b8, 0xfd9: 0x25bf, 0xfda: 0x25d4, 0xfdb: 0x25e2, 0xfdc: 0x1d89, 0xfdd: 0x1d8e,\n\t0xfde: 0x1d93, 0xfdf: 0x1da2, 0xfe0: 0x1dac, 0xfe1: 0x1dbb, 0xfe2: 0x1dc0, 0xfe3: 0x1dc5,\n\t0xfe4: 0x1dd4, 0xfe5: 0x1dde, 0xfe6: 0x1dfc, 0xfe7: 0x1e15, 0xfe8: 0x1e1a, 0xfe9: 0x1e29,\n\t0xfea: 0x1e2e, 0xfeb: 0x1e3d, 0xfec: 0x1e47, 0xfed: 0x1e56, 0xfee: 0x1e5b, 0xfef: 0x1e60,\n\t0xff0: 0x1e6a, 0xff1: 0x1ea6, 0xff2: 0x1eab, 0xff3: 0x1eb5, 0xff4: 0x1ec4, 0xff5: 0x1ec9,\n\t0xff6: 0x1ece, 0xff7: 0x1ed8, 0xff8: 0x1ee7, 0xff9: 0x1efb, 0xffa: 0x1f00, 0xffb: 0x1f05,\n\t0xffc: 0x1f14, 0xffd: 0x1f19, 0xffe: 0x1f28, 0xfff: 0x1f2d,\n\t// Block 0x40, offset 0x1000\n\t0x1000: 0x1f32, 0x1001: 0x1f37, 0x1002: 0x1f46, 0x1003: 0x1f4b, 0x1004: 0x1f5f, 0x1005: 0x1f64,\n\t0x1006: 0x1f69, 0x1007: 0x1f6e, 0x1008: 0x1f73, 0x1009: 0x1f87, 0x100a: 0x1f8c, 0x100b: 0x1f91,\n\t0x100c: 0x1f96, 0x100d: 0x1f9b, 0x100e: 0x1faf, 0x100f: 0x1fb4, 0x1010: 0x1fb9, 0x1011: 0x1fbe,\n\t0x1012: 0x1fcd, 0x1013: 0x1fd2, 0x1014: 0x1fd7, 0x1015: 0x1fe6, 0x1016: 0x1ff0, 0x1017: 0x1fff,\n\t0x1018: 0x2004, 0x1019: 0x4450, 0x101a: 0x2018, 0x101b: 0x201d, 0x101c: 0x2022, 0x101d: 0x2031,\n\t0x101e: 0x203b, 0x101f: 0x25d4, 0x1020: 0x25e2, 0x1021: 0x1da2, 0x1022: 0x1dac, 0x1023: 0x1dd4,\n\t0x1024: 0x1dde, 0x1025: 0x1dfc, 0x1026: 0x1e06, 0x1027: 0x1e6a, 0x1028: 0x1e6f, 0x1029: 0x1e92,\n\t0x102a: 0x1e97, 0x102b: 0x1f6e, 0x102c: 0x1f73, 0x102d: 0x1f96, 0x102e: 0x1fe6, 0x102f: 0x1ff0,\n\t0x1030: 0x2031, 0x1031: 0x203b, 0x1032: 0x4504, 0x1033: 0x450c, 0x1034: 0x4514, 0x1035: 0x1ef1,\n\t0x1036: 0x1ef6, 0x1037: 0x1f0a, 0x1038: 0x1f0f, 0x1039: 0x1f1e, 0x103a: 0x1f23, 0x103b: 0x1e74,\n\t0x103c: 0x1e79, 0x103d: 0x1e9c, 0x103e: 0x1ea1, 0x103f: 0x1e33,\n\t// Block 0x41, offset 0x1040\n\t0x1040: 0x1e38, 0x1041: 0x1e1f, 0x1042: 0x1e24, 0x1043: 0x1e4c, 0x1044: 0x1e51, 0x1045: 0x1eba,\n\t0x1046: 0x1ebf, 0x1047: 0x1edd, 0x1048: 0x1ee2, 0x1049: 0x1e7e, 0x104a: 0x1e83, 0x104b: 0x1e88,\n\t0x104c: 0x1e92, 0x104d: 0x1e8d, 0x104e: 0x1e65, 0x104f: 0x1eb0, 0x1050: 0x1ed3, 0x1051: 0x1ef1,\n\t0x1052: 0x1ef6, 0x1053: 0x1f0a, 0x1054: 0x1f0f, 0x1055: 0x1f1e, 0x1056: 0x1f23, 0x1057: 0x1e74,\n\t0x1058: 0x1e79, 0x1059: 0x1e9c, 0x105a: 0x1ea1, 0x105b: 0x1e33, 0x105c: 0x1e38, 0x105d: 0x1e1f,\n\t0x105e: 0x1e24, 0x105f: 0x1e4c, 0x1060: 0x1e51, 0x1061: 0x1eba, 0x1062: 0x1ebf, 0x1063: 0x1edd,\n\t0x1064: 0x1ee2, 0x1065: 0x1e7e, 0x1066: 0x1e83, 0x1067: 0x1e88, 0x1068: 0x1e92, 0x1069: 0x1e8d,\n\t0x106a: 0x1e65, 0x106b: 0x1eb0, 0x106c: 0x1ed3, 0x106d: 0x1e7e, 0x106e: 0x1e83, 0x106f: 0x1e88,\n\t0x1070: 0x1e92, 0x1071: 0x1e6f, 0x1072: 0x1e97, 0x1073: 0x1eec, 0x1074: 0x1e56, 0x1075: 0x1e5b,\n\t0x1076: 0x1e60, 0x1077: 0x1e7e, 0x1078: 0x1e83, 0x1079: 0x1e88, 0x107a: 0x1eec, 0x107b: 0x1efb,\n\t0x107c: 0x4408, 0x107d: 0x4408,\n\t// Block 0x42, offset 0x1080\n\t0x1090: 0x2311, 0x1091: 0x2326,\n\t0x1092: 0x2326, 0x1093: 0x232d, 0x1094: 0x2334, 0x1095: 0x2349, 0x1096: 0x2350, 0x1097: 0x2357,\n\t0x1098: 0x237a, 0x1099: 0x237a, 0x109a: 0x239d, 0x109b: 0x2396, 0x109c: 0x23b2, 0x109d: 0x23a4,\n\t0x109e: 0x23ab, 0x109f: 0x23ce, 0x10a0: 0x23ce, 0x10a1: 0x23c7, 0x10a2: 0x23d5, 0x10a3: 0x23d5,\n\t0x10a4: 0x23ff, 0x10a5: 0x23ff, 0x10a6: 0x241b, 0x10a7: 0x23e3, 0x10a8: 0x23e3, 0x10a9: 0x23dc,\n\t0x10aa: 0x23f1, 0x10ab: 0x23f1, 0x10ac: 0x23f8, 0x10ad: 0x23f8, 0x10ae: 0x2422, 0x10af: 0x2430,\n\t0x10b0: 0x2430, 0x10b1: 0x2437, 0x10b2: 0x2437, 0x10b3: 0x243e, 0x10b4: 0x2445, 0x10b5: 0x244c,\n\t0x10b6: 0x2453, 0x10b7: 0x2453, 0x10b8: 0x245a, 0x10b9: 0x2468, 0x10ba: 0x2476, 0x10bb: 0x246f,\n\t0x10bc: 0x247d, 0x10bd: 0x247d, 0x10be: 0x2492, 0x10bf: 0x2499,\n\t// Block 0x43, offset 0x10c0\n\t0x10c0: 0x24ca, 0x10c1: 0x24d8, 0x10c2: 0x24d1, 0x10c3: 0x24b5, 0x10c4: 0x24b5, 0x10c5: 0x24df,\n\t0x10c6: 0x24df, 0x10c7: 0x24e6, 0x10c8: 0x24e6, 0x10c9: 0x2510, 0x10ca: 0x2517, 0x10cb: 0x251e,\n\t0x10cc: 0x24f4, 0x10cd: 0x2502, 0x10ce: 0x2525, 0x10cf: 0x252c,\n\t0x10d2: 0x24fb, 0x10d3: 0x2580, 0x10d4: 0x2587, 0x10d5: 0x255d, 0x10d6: 0x2564, 0x10d7: 0x2548,\n\t0x10d8: 0x2548, 0x10d9: 0x254f, 0x10da: 0x2579, 0x10db: 0x2572, 0x10dc: 0x259c, 0x10dd: 0x259c,\n\t0x10de: 0x230a, 0x10df: 0x231f, 0x10e0: 0x2318, 0x10e1: 0x2342, 0x10e2: 0x233b, 0x10e3: 0x2365,\n\t0x10e4: 0x235e, 0x10e5: 0x2388, 0x10e6: 0x236c, 0x10e7: 0x2381, 0x10e8: 0x23b9, 0x10e9: 0x2406,\n\t0x10ea: 0x23ea, 0x10eb: 0x2429, 0x10ec: 0x24c3, 0x10ed: 0x24ed, 0x10ee: 0x2595, 0x10ef: 0x258e,\n\t0x10f0: 0x25a3, 0x10f1: 0x253a, 0x10f2: 0x24a0, 0x10f3: 0x256b, 0x10f4: 0x2492, 0x10f5: 0x24ca,\n\t0x10f6: 0x2461, 0x10f7: 0x24ae, 0x10f8: 0x2541, 0x10f9: 0x2533, 0x10fa: 0x24bc, 0x10fb: 0x24a7,\n\t0x10fc: 0x24bc, 0x10fd: 0x2541, 0x10fe: 0x2373, 0x10ff: 0x238f,\n\t// Block 0x44, offset 0x1100\n\t0x1100: 0x2509, 0x1101: 0x2484, 0x1102: 0x2303, 0x1103: 0x24a7, 0x1104: 0x244c, 0x1105: 0x241b,\n\t0x1106: 0x23c0, 0x1107: 0x2556,\n\t0x1130: 0x2414, 0x1131: 0x248b, 0x1132: 0x27bf, 0x1133: 0x27b6, 0x1134: 0x27ec, 0x1135: 0x27da,\n\t0x1136: 0x27c8, 0x1137: 0x27e3, 0x1138: 0x27f5, 0x1139: 0x240d, 0x113a: 0x2c7c, 0x113b: 0x2afc,\n\t0x113c: 0x27d1,\n\t// Block 0x45, offset 0x1140\n\t0x1150: 0x0019, 0x1151: 0x0483,\n\t0x1152: 0x0487, 0x1153: 0x0035, 0x1154: 0x0037, 0x1155: 0x0003, 0x1156: 0x003f, 0x1157: 0x04bf,\n\t0x1158: 0x04c3, 0x1159: 0x1b5c,\n\t0x1160: 0x8132, 0x1161: 0x8132, 0x1162: 0x8132, 0x1163: 0x8132,\n\t0x1164: 0x8132, 0x1165: 0x8132, 0x1166: 0x8132, 0x1167: 0x812d, 0x1168: 0x812d, 0x1169: 0x812d,\n\t0x116a: 0x812d, 0x116b: 0x812d, 0x116c: 0x812d, 0x116d: 0x812d, 0x116e: 0x8132, 0x116f: 0x8132,\n\t0x1170: 0x1873, 0x1171: 0x0443, 0x1172: 0x043f, 0x1173: 0x007f, 0x1174: 0x007f, 0x1175: 0x0011,\n\t0x1176: 0x0013, 0x1177: 0x00b7, 0x1178: 0x00bb, 0x1179: 0x04b7, 0x117a: 0x04bb, 0x117b: 0x04ab,\n\t0x117c: 0x04af, 0x117d: 0x0493, 0x117e: 0x0497, 0x117f: 0x048b,\n\t// Block 0x46, offset 0x1180\n\t0x1180: 0x048f, 0x1181: 0x049b, 0x1182: 0x049f, 0x1183: 0x04a3, 0x1184: 0x04a7,\n\t0x1187: 0x0077, 0x1188: 0x007b, 0x1189: 0x4269, 0x118a: 0x4269, 0x118b: 0x4269,\n\t0x118c: 0x4269, 0x118d: 0x007f, 0x118e: 0x007f, 0x118f: 0x007f, 0x1190: 0x0019, 0x1191: 0x0483,\n\t0x1192: 0x001d, 0x1194: 0x0037, 0x1195: 0x0035, 0x1196: 0x003f, 0x1197: 0x0003,\n\t0x1198: 0x0443, 0x1199: 0x0011, 0x119a: 0x0013, 0x119b: 0x00b7, 0x119c: 0x00bb, 0x119d: 0x04b7,\n\t0x119e: 0x04bb, 0x119f: 0x0007, 0x11a0: 0x000d, 0x11a1: 0x0015, 0x11a2: 0x0017, 0x11a3: 0x001b,\n\t0x11a4: 0x0039, 0x11a5: 0x003d, 0x11a6: 0x003b, 0x11a8: 0x0079, 0x11a9: 0x0009,\n\t0x11aa: 0x000b, 0x11ab: 0x0041,\n\t0x11b0: 0x42aa, 0x11b1: 0x442c, 0x11b2: 0x42af, 0x11b4: 0x42b4,\n\t0x11b6: 0x42b9, 0x11b7: 0x4432, 0x11b8: 0x42be, 0x11b9: 0x4438, 0x11ba: 0x42c3, 0x11bb: 0x443e,\n\t0x11bc: 0x42c8, 0x11bd: 0x4444, 0x11be: 0x42cd, 0x11bf: 0x444a,\n\t// Block 0x47, offset 0x11c0\n\t0x11c0: 0x0236, 0x11c1: 0x440e, 0x11c2: 0x440e, 0x11c3: 0x4414, 0x11c4: 0x4414, 0x11c5: 0x4456,\n\t0x11c6: 0x4456, 0x11c7: 0x441a, 0x11c8: 0x441a, 0x11c9: 0x4462, 0x11ca: 0x4462, 0x11cb: 0x4462,\n\t0x11cc: 0x4462, 0x11cd: 0x0239, 0x11ce: 0x0239, 0x11cf: 0x023c, 0x11d0: 0x023c, 0x11d1: 0x023c,\n\t0x11d2: 0x023c, 0x11d3: 0x023f, 0x11d4: 0x023f, 0x11d5: 0x0242, 0x11d6: 0x0242, 0x11d7: 0x0242,\n\t0x11d8: 0x0242, 0x11d9: 0x0245, 0x11da: 0x0245, 0x11db: 0x0245, 0x11dc: 0x0245, 0x11dd: 0x0248,\n\t0x11de: 0x0248, 0x11df: 0x0248, 0x11e0: 0x0248, 0x11e1: 0x024b, 0x11e2: 0x024b, 0x11e3: 0x024b,\n\t0x11e4: 0x024b, 0x11e5: 0x024e, 0x11e6: 0x024e, 0x11e7: 0x024e, 0x11e8: 0x024e, 0x11e9: 0x0251,\n\t0x11ea: 0x0251, 0x11eb: 0x0254, 0x11ec: 0x0254, 0x11ed: 0x0257, 0x11ee: 0x0257, 0x11ef: 0x025a,\n\t0x11f0: 0x025a, 0x11f1: 0x025d, 0x11f2: 0x025d, 0x11f3: 0x025d, 0x11f4: 0x025d, 0x11f5: 0x0260,\n\t0x11f6: 0x0260, 0x11f7: 0x0260, 0x11f8: 0x0260, 0x11f9: 0x0263, 0x11fa: 0x0263, 0x11fb: 0x0263,\n\t0x11fc: 0x0263, 0x11fd: 0x0266, 0x11fe: 0x0266, 0x11ff: 0x0266,\n\t// Block 0x48, offset 0x1200\n\t0x1200: 0x0266, 0x1201: 0x0269, 0x1202: 0x0269, 0x1203: 0x0269, 0x1204: 0x0269, 0x1205: 0x026c,\n\t0x1206: 0x026c, 0x1207: 0x026c, 0x1208: 0x026c, 0x1209: 0x026f, 0x120a: 0x026f, 0x120b: 0x026f,\n\t0x120c: 0x026f, 0x120d: 0x0272, 0x120e: 0x0272, 0x120f: 0x0272, 0x1210: 0x0272, 0x1211: 0x0275,\n\t0x1212: 0x0275, 0x1213: 0x0275, 0x1214: 0x0275, 0x1215: 0x0278, 0x1216: 0x0278, 0x1217: 0x0278,\n\t0x1218: 0x0278, 0x1219: 0x027b, 0x121a: 0x027b, 0x121b: 0x027b, 0x121c: 0x027b, 0x121d: 0x027e,\n\t0x121e: 0x027e, 0x121f: 0x027e, 0x1220: 0x027e, 0x1221: 0x0281, 0x1222: 0x0281, 0x1223: 0x0281,\n\t0x1224: 0x0281, 0x1225: 0x0284, 0x1226: 0x0284, 0x1227: 0x0284, 0x1228: 0x0284, 0x1229: 0x0287,\n\t0x122a: 0x0287, 0x122b: 0x0287, 0x122c: 0x0287, 0x122d: 0x028a, 0x122e: 0x028a, 0x122f: 0x028d,\n\t0x1230: 0x028d, 0x1231: 0x0290, 0x1232: 0x0290, 0x1233: 0x0290, 0x1234: 0x0290, 0x1235: 0x2e00,\n\t0x1236: 0x2e00, 0x1237: 0x2e08, 0x1238: 0x2e08, 0x1239: 0x2e10, 0x123a: 0x2e10, 0x123b: 0x1f82,\n\t0x123c: 0x1f82,\n\t// Block 0x49, offset 0x1240\n\t0x1240: 0x0081, 0x1241: 0x0083, 0x1242: 0x0085, 0x1243: 0x0087, 0x1244: 0x0089, 0x1245: 0x008b,\n\t0x1246: 0x008d, 0x1247: 0x008f, 0x1248: 0x0091, 0x1249: 0x0093, 0x124a: 0x0095, 0x124b: 0x0097,\n\t0x124c: 0x0099, 0x124d: 0x009b, 0x124e: 0x009d, 0x124f: 0x009f, 0x1250: 0x00a1, 0x1251: 0x00a3,\n\t0x1252: 0x00a5, 0x1253: 0x00a7, 0x1254: 0x00a9, 0x1255: 0x00ab, 0x1256: 0x00ad, 0x1257: 0x00af,\n\t0x1258: 0x00b1, 0x1259: 0x00b3, 0x125a: 0x00b5, 0x125b: 0x00b7, 0x125c: 0x00b9, 0x125d: 0x00bb,\n\t0x125e: 0x00bd, 0x125f: 0x0477, 0x1260: 0x047b, 0x1261: 0x0487, 0x1262: 0x049b, 0x1263: 0x049f,\n\t0x1264: 0x0483, 0x1265: 0x05ab, 0x1266: 0x05a3, 0x1267: 0x04c7, 0x1268: 0x04cf, 0x1269: 0x04d7,\n\t0x126a: 0x04df, 0x126b: 0x04e7, 0x126c: 0x056b, 0x126d: 0x0573, 0x126e: 0x057b, 0x126f: 0x051f,\n\t0x1270: 0x05af, 0x1271: 0x04cb, 0x1272: 0x04d3, 0x1273: 0x04db, 0x1274: 0x04e3, 0x1275: 0x04eb,\n\t0x1276: 0x04ef, 0x1277: 0x04f3, 0x1278: 0x04f7, 0x1279: 0x04fb, 0x127a: 0x04ff, 0x127b: 0x0503,\n\t0x127c: 0x0507, 0x127d: 0x050b, 0x127e: 0x050f, 0x127f: 0x0513,\n\t// Block 0x4a, offset 0x1280\n\t0x1280: 0x0517, 0x1281: 0x051b, 0x1282: 0x0523, 0x1283: 0x0527, 0x1284: 0x052b, 0x1285: 0x052f,\n\t0x1286: 0x0533, 0x1287: 0x0537, 0x1288: 0x053b, 0x1289: 0x053f, 0x128a: 0x0543, 0x128b: 0x0547,\n\t0x128c: 0x054b, 0x128d: 0x054f, 0x128e: 0x0553, 0x128f: 0x0557, 0x1290: 0x055b, 0x1291: 0x055f,\n\t0x1292: 0x0563, 0x1293: 0x0567, 0x1294: 0x056f, 0x1295: 0x0577, 0x1296: 0x057f, 0x1297: 0x0583,\n\t0x1298: 0x0587, 0x1299: 0x058b, 0x129a: 0x058f, 0x129b: 0x0593, 0x129c: 0x0597, 0x129d: 0x05a7,\n\t0x129e: 0x4a78, 0x129f: 0x4a7e, 0x12a0: 0x03c3, 0x12a1: 0x0313, 0x12a2: 0x0317, 0x12a3: 0x4a3b,\n\t0x12a4: 0x031b, 0x12a5: 0x4a41, 0x12a6: 0x4a47, 0x12a7: 0x031f, 0x12a8: 0x0323, 0x12a9: 0x0327,\n\t0x12aa: 0x4a4d, 0x12ab: 0x4a53, 0x12ac: 0x4a59, 0x12ad: 0x4a5f, 0x12ae: 0x4a65, 0x12af: 0x4a6b,\n\t0x12b0: 0x0367, 0x12b1: 0x032b, 0x12b2: 0x032f, 0x12b3: 0x0333, 0x12b4: 0x037b, 0x12b5: 0x0337,\n\t0x12b6: 0x033b, 0x12b7: 0x033f, 0x12b8: 0x0343, 0x12b9: 0x0347, 0x12ba: 0x034b, 0x12bb: 0x034f,\n\t0x12bc: 0x0353, 0x12bd: 0x0357, 0x12be: 0x035b,\n\t// Block 0x4b, offset 0x12c0\n\t0x12c2: 0x49bd, 0x12c3: 0x49c3, 0x12c4: 0x49c9, 0x12c5: 0x49cf,\n\t0x12c6: 0x49d5, 0x12c7: 0x49db, 0x12ca: 0x49e1, 0x12cb: 0x49e7,\n\t0x12cc: 0x49ed, 0x12cd: 0x49f3, 0x12ce: 0x49f9, 0x12cf: 0x49ff,\n\t0x12d2: 0x4a05, 0x12d3: 0x4a0b, 0x12d4: 0x4a11, 0x12d5: 0x4a17, 0x12d6: 0x4a1d, 0x12d7: 0x4a23,\n\t0x12da: 0x4a29, 0x12db: 0x4a2f, 0x12dc: 0x4a35,\n\t0x12e0: 0x00bf, 0x12e1: 0x00c2, 0x12e2: 0x00cb, 0x12e3: 0x4264,\n\t0x12e4: 0x00c8, 0x12e5: 0x00c5, 0x12e6: 0x0447, 0x12e8: 0x046b, 0x12e9: 0x044b,\n\t0x12ea: 0x044f, 0x12eb: 0x0453, 0x12ec: 0x0457, 0x12ed: 0x046f, 0x12ee: 0x0473,\n\t// Block 0x4c, offset 0x1300\n\t0x1300: 0x0063, 0x1301: 0x0065, 0x1302: 0x0067, 0x1303: 0x0069, 0x1304: 0x006b, 0x1305: 0x006d,\n\t0x1306: 0x006f, 0x1307: 0x0071, 0x1308: 0x0073, 0x1309: 0x0075, 0x130a: 0x0083, 0x130b: 0x0085,\n\t0x130c: 0x0087, 0x130d: 0x0089, 0x130e: 0x008b, 0x130f: 0x008d, 0x1310: 0x008f, 0x1311: 0x0091,\n\t0x1312: 0x0093, 0x1313: 0x0095, 0x1314: 0x0097, 0x1315: 0x0099, 0x1316: 0x009b, 0x1317: 0x009d,\n\t0x1318: 0x009f, 0x1319: 0x00a1, 0x131a: 0x00a3, 0x131b: 0x00a5, 0x131c: 0x00a7, 0x131d: 0x00a9,\n\t0x131e: 0x00ab, 0x131f: 0x00ad, 0x1320: 0x00af, 0x1321: 0x00b1, 0x1322: 0x00b3, 0x1323: 0x00b5,\n\t0x1324: 0x00dd, 0x1325: 0x00f2, 0x1328: 0x0173, 0x1329: 0x0176,\n\t0x132a: 0x0179, 0x132b: 0x017c, 0x132c: 0x017f, 0x132d: 0x0182, 0x132e: 0x0185, 0x132f: 0x0188,\n\t0x1330: 0x018b, 0x1331: 0x018e, 0x1332: 0x0191, 0x1333: 0x0194, 0x1334: 0x0197, 0x1335: 0x019a,\n\t0x1336: 0x019d, 0x1337: 0x01a0, 0x1338: 0x01a3, 0x1339: 0x0188, 0x133a: 0x01a6, 0x133b: 0x01a9,\n\t0x133c: 0x01ac, 0x133d: 0x01af, 0x133e: 0x01b2, 0x133f: 0x01b5,\n\t// Block 0x4d, offset 0x1340\n\t0x1340: 0x01fd, 0x1341: 0x0200, 0x1342: 0x0203, 0x1343: 0x045b, 0x1344: 0x01c7, 0x1345: 0x01d0,\n\t0x1346: 0x01d6, 0x1347: 0x01fa, 0x1348: 0x01eb, 0x1349: 0x01e8, 0x134a: 0x0206, 0x134b: 0x0209,\n\t0x134e: 0x0021, 0x134f: 0x0023, 0x1350: 0x0025, 0x1351: 0x0027,\n\t0x1352: 0x0029, 0x1353: 0x002b, 0x1354: 0x002d, 0x1355: 0x002f, 0x1356: 0x0031, 0x1357: 0x0033,\n\t0x1358: 0x0021, 0x1359: 0x0023, 0x135a: 0x0025, 0x135b: 0x0027, 0x135c: 0x0029, 0x135d: 0x002b,\n\t0x135e: 0x002d, 0x135f: 0x002f, 0x1360: 0x0031, 0x1361: 0x0033, 0x1362: 0x0021, 0x1363: 0x0023,\n\t0x1364: 0x0025, 0x1365: 0x0027, 0x1366: 0x0029, 0x1367: 0x002b, 0x1368: 0x002d, 0x1369: 0x002f,\n\t0x136a: 0x0031, 0x136b: 0x0033, 0x136c: 0x0021, 0x136d: 0x0023, 0x136e: 0x0025, 0x136f: 0x0027,\n\t0x1370: 0x0029, 0x1371: 0x002b, 0x1372: 0x002d, 0x1373: 0x002f, 0x1374: 0x0031, 0x1375: 0x0033,\n\t0x1376: 0x0021, 0x1377: 0x0023, 0x1378: 0x0025, 0x1379: 0x0027, 0x137a: 0x0029, 0x137b: 0x002b,\n\t0x137c: 0x002d, 0x137d: 0x002f, 0x137e: 0x0031, 0x137f: 0x0033,\n\t// Block 0x4e, offset 0x1380\n\t0x1380: 0x0239, 0x1381: 0x023c, 0x1382: 0x0248, 0x1383: 0x0251, 0x1385: 0x028a,\n\t0x1386: 0x025a, 0x1387: 0x024b, 0x1388: 0x0269, 0x1389: 0x0290, 0x138a: 0x027b, 0x138b: 0x027e,\n\t0x138c: 0x0281, 0x138d: 0x0284, 0x138e: 0x025d, 0x138f: 0x026f, 0x1390: 0x0275, 0x1391: 0x0263,\n\t0x1392: 0x0278, 0x1393: 0x0257, 0x1394: 0x0260, 0x1395: 0x0242, 0x1396: 0x0245, 0x1397: 0x024e,\n\t0x1398: 0x0254, 0x1399: 0x0266, 0x139a: 0x026c, 0x139b: 0x0272, 0x139c: 0x0293, 0x139d: 0x02e4,\n\t0x139e: 0x02cc, 0x139f: 0x0296, 0x13a1: 0x023c, 0x13a2: 0x0248,\n\t0x13a4: 0x0287, 0x13a7: 0x024b, 0x13a9: 0x0290,\n\t0x13aa: 0x027b, 0x13ab: 0x027e, 0x13ac: 0x0281, 0x13ad: 0x0284, 0x13ae: 0x025d, 0x13af: 0x026f,\n\t0x13b0: 0x0275, 0x13b1: 0x0263, 0x13b2: 0x0278, 0x13b4: 0x0260, 0x13b5: 0x0242,\n\t0x13b6: 0x0245, 0x13b7: 0x024e, 0x13b9: 0x0266, 0x13bb: 0x0272,\n\t// Block 0x4f, offset 0x13c0\n\t0x13c2: 0x0248,\n\t0x13c7: 0x024b, 0x13c9: 0x0290, 0x13cb: 0x027e,\n\t0x13cd: 0x0284, 0x13ce: 0x025d, 0x13cf: 0x026f, 0x13d1: 0x0263,\n\t0x13d2: 0x0278, 0x13d4: 0x0260, 0x13d7: 0x024e,\n\t0x13d9: 0x0266, 0x13db: 0x0272, 0x13dd: 0x02e4,\n\t0x13df: 0x0296, 0x13e1: 0x023c, 0x13e2: 0x0248,\n\t0x13e4: 0x0287, 0x13e7: 0x024b, 0x13e8: 0x0269, 0x13e9: 0x0290,\n\t0x13ea: 0x027b, 0x13ec: 0x0281, 0x13ed: 0x0284, 0x13ee: 0x025d, 0x13ef: 0x026f,\n\t0x13f0: 0x0275, 0x13f1: 0x0263, 0x13f2: 0x0278, 0x13f4: 0x0260, 0x13f5: 0x0242,\n\t0x13f6: 0x0245, 0x13f7: 0x024e, 0x13f9: 0x0266, 0x13fa: 0x026c, 0x13fb: 0x0272,\n\t0x13fc: 0x0293, 0x13fe: 0x02cc,\n\t// Block 0x50, offset 0x1400\n\t0x1400: 0x0239, 0x1401: 0x023c, 0x1402: 0x0248, 0x1403: 0x0251, 0x1404: 0x0287, 0x1405: 0x028a,\n\t0x1406: 0x025a, 0x1407: 0x024b, 0x1408: 0x0269, 0x1409: 0x0290, 0x140b: 0x027e,\n\t0x140c: 0x0281, 0x140d: 0x0284, 0x140e: 0x025d, 0x140f: 0x026f, 0x1410: 0x0275, 0x1411: 0x0263,\n\t0x1412: 0x0278, 0x1413: 0x0257, 0x1414: 0x0260, 0x1415: 0x0242, 0x1416: 0x0245, 0x1417: 0x024e,\n\t0x1418: 0x0254, 0x1419: 0x0266, 0x141a: 0x026c, 0x141b: 0x0272,\n\t0x1421: 0x023c, 0x1422: 0x0248, 0x1423: 0x0251,\n\t0x1425: 0x028a, 0x1426: 0x025a, 0x1427: 0x024b, 0x1428: 0x0269, 0x1429: 0x0290,\n\t0x142b: 0x027e, 0x142c: 0x0281, 0x142d: 0x0284, 0x142e: 0x025d, 0x142f: 0x026f,\n\t0x1430: 0x0275, 0x1431: 0x0263, 0x1432: 0x0278, 0x1433: 0x0257, 0x1434: 0x0260, 0x1435: 0x0242,\n\t0x1436: 0x0245, 0x1437: 0x024e, 0x1438: 0x0254, 0x1439: 0x0266, 0x143a: 0x026c, 0x143b: 0x0272,\n\t// Block 0x51, offset 0x1440\n\t0x1440: 0x1879, 0x1441: 0x1876, 0x1442: 0x187c, 0x1443: 0x18a0, 0x1444: 0x18c4, 0x1445: 0x18e8,\n\t0x1446: 0x190c, 0x1447: 0x1915, 0x1448: 0x191b, 0x1449: 0x1921, 0x144a: 0x1927,\n\t0x1450: 0x1a8c, 0x1451: 0x1a90,\n\t0x1452: 0x1a94, 0x1453: 0x1a98, 0x1454: 0x1a9c, 0x1455: 0x1aa0, 0x1456: 0x1aa4, 0x1457: 0x1aa8,\n\t0x1458: 0x1aac, 0x1459: 0x1ab0, 0x145a: 0x1ab4, 0x145b: 0x1ab8, 0x145c: 0x1abc, 0x145d: 0x1ac0,\n\t0x145e: 0x1ac4, 0x145f: 0x1ac8, 0x1460: 0x1acc, 0x1461: 0x1ad0, 0x1462: 0x1ad4, 0x1463: 0x1ad8,\n\t0x1464: 0x1adc, 0x1465: 0x1ae0, 0x1466: 0x1ae4, 0x1467: 0x1ae8, 0x1468: 0x1aec, 0x1469: 0x1af0,\n\t0x146a: 0x271e, 0x146b: 0x0047, 0x146c: 0x0065, 0x146d: 0x193c, 0x146e: 0x19b1,\n\t0x1470: 0x0043, 0x1471: 0x0045, 0x1472: 0x0047, 0x1473: 0x0049, 0x1474: 0x004b, 0x1475: 0x004d,\n\t0x1476: 0x004f, 0x1477: 0x0051, 0x1478: 0x0053, 0x1479: 0x0055, 0x147a: 0x0057, 0x147b: 0x0059,\n\t0x147c: 0x005b, 0x147d: 0x005d, 0x147e: 0x005f, 0x147f: 0x0061,\n\t// Block 0x52, offset 0x1480\n\t0x1480: 0x26ad, 0x1481: 0x26c2, 0x1482: 0x0503,\n\t0x1490: 0x0c0f, 0x1491: 0x0a47,\n\t0x1492: 0x08d3, 0x1493: 0x45c4, 0x1494: 0x071b, 0x1495: 0x09ef, 0x1496: 0x132f, 0x1497: 0x09ff,\n\t0x1498: 0x0727, 0x1499: 0x0cd7, 0x149a: 0x0eaf, 0x149b: 0x0caf, 0x149c: 0x0827, 0x149d: 0x0b6b,\n\t0x149e: 0x07bf, 0x149f: 0x0cb7, 0x14a0: 0x0813, 0x14a1: 0x1117, 0x14a2: 0x0f83, 0x14a3: 0x138b,\n\t0x14a4: 0x09d3, 0x14a5: 0x090b, 0x14a6: 0x0e63, 0x14a7: 0x0c1b, 0x14a8: 0x0c47, 0x14a9: 0x06bf,\n\t0x14aa: 0x06cb, 0x14ab: 0x140b, 0x14ac: 0x0adb, 0x14ad: 0x06e7, 0x14ae: 0x08ef, 0x14af: 0x0c3b,\n\t0x14b0: 0x13b3, 0x14b1: 0x0c13, 0x14b2: 0x106f, 0x14b3: 0x10ab, 0x14b4: 0x08f7, 0x14b5: 0x0e43,\n\t0x14b6: 0x0d0b, 0x14b7: 0x0d07, 0x14b8: 0x0f97, 0x14b9: 0x082b, 0x14ba: 0x0957, 0x14bb: 0x1443,\n\t// Block 0x53, offset 0x14c0\n\t0x14c0: 0x06fb, 0x14c1: 0x06f3, 0x14c2: 0x0703, 0x14c3: 0x1647, 0x14c4: 0x0747, 0x14c5: 0x0757,\n\t0x14c6: 0x075b, 0x14c7: 0x0763, 0x14c8: 0x076b, 0x14c9: 0x076f, 0x14ca: 0x077b, 0x14cb: 0x0773,\n\t0x14cc: 0x05b3, 0x14cd: 0x165b, 0x14ce: 0x078f, 0x14cf: 0x0793, 0x14d0: 0x0797, 0x14d1: 0x07b3,\n\t0x14d2: 0x164c, 0x14d3: 0x05b7, 0x14d4: 0x079f, 0x14d5: 0x07bf, 0x14d6: 0x1656, 0x14d7: 0x07cf,\n\t0x14d8: 0x07d7, 0x14d9: 0x0737, 0x14da: 0x07df, 0x14db: 0x07e3, 0x14dc: 0x1831, 0x14dd: 0x07ff,\n\t0x14de: 0x0807, 0x14df: 0x05bf, 0x14e0: 0x081f, 0x14e1: 0x0823, 0x14e2: 0x082b, 0x14e3: 0x082f,\n\t0x14e4: 0x05c3, 0x14e5: 0x0847, 0x14e6: 0x084b, 0x14e7: 0x0857, 0x14e8: 0x0863, 0x14e9: 0x0867,\n\t0x14ea: 0x086b, 0x14eb: 0x0873, 0x14ec: 0x0893, 0x14ed: 0x0897, 0x14ee: 0x089f, 0x14ef: 0x08af,\n\t0x14f0: 0x08b7, 0x14f1: 0x08bb, 0x14f2: 0x08bb, 0x14f3: 0x08bb, 0x14f4: 0x166a, 0x14f5: 0x0e93,\n\t0x14f6: 0x08cf, 0x14f7: 0x08d7, 0x14f8: 0x166f, 0x14f9: 0x08e3, 0x14fa: 0x08eb, 0x14fb: 0x08f3,\n\t0x14fc: 0x091b, 0x14fd: 0x0907, 0x14fe: 0x0913, 0x14ff: 0x0917,\n\t// Block 0x54, offset 0x1500\n\t0x1500: 0x091f, 0x1501: 0x0927, 0x1502: 0x092b, 0x1503: 0x0933, 0x1504: 0x093b, 0x1505: 0x093f,\n\t0x1506: 0x093f, 0x1507: 0x0947, 0x1508: 0x094f, 0x1509: 0x0953, 0x150a: 0x095f, 0x150b: 0x0983,\n\t0x150c: 0x0967, 0x150d: 0x0987, 0x150e: 0x096b, 0x150f: 0x0973, 0x1510: 0x080b, 0x1511: 0x09cf,\n\t0x1512: 0x0997, 0x1513: 0x099b, 0x1514: 0x099f, 0x1515: 0x0993, 0x1516: 0x09a7, 0x1517: 0x09a3,\n\t0x1518: 0x09bb, 0x1519: 0x1674, 0x151a: 0x09d7, 0x151b: 0x09db, 0x151c: 0x09e3, 0x151d: 0x09ef,\n\t0x151e: 0x09f7, 0x151f: 0x0a13, 0x1520: 0x1679, 0x1521: 0x167e, 0x1522: 0x0a1f, 0x1523: 0x0a23,\n\t0x1524: 0x0a27, 0x1525: 0x0a1b, 0x1526: 0x0a2f, 0x1527: 0x05c7, 0x1528: 0x05cb, 0x1529: 0x0a37,\n\t0x152a: 0x0a3f, 0x152b: 0x0a3f, 0x152c: 0x1683, 0x152d: 0x0a5b, 0x152e: 0x0a5f, 0x152f: 0x0a63,\n\t0x1530: 0x0a6b, 0x1531: 0x1688, 0x1532: 0x0a73, 0x1533: 0x0a77, 0x1534: 0x0b4f, 0x1535: 0x0a7f,\n\t0x1536: 0x05cf, 0x1537: 0x0a8b, 0x1538: 0x0a9b, 0x1539: 0x0aa7, 0x153a: 0x0aa3, 0x153b: 0x1692,\n\t0x153c: 0x0aaf, 0x153d: 0x1697, 0x153e: 0x0abb, 0x153f: 0x0ab7,\n\t// Block 0x55, offset 0x1540\n\t0x1540: 0x0abf, 0x1541: 0x0acf, 0x1542: 0x0ad3, 0x1543: 0x05d3, 0x1544: 0x0ae3, 0x1545: 0x0aeb,\n\t0x1546: 0x0aef, 0x1547: 0x0af3, 0x1548: 0x05d7, 0x1549: 0x169c, 0x154a: 0x05db, 0x154b: 0x0b0f,\n\t0x154c: 0x0b13, 0x154d: 0x0b17, 0x154e: 0x0b1f, 0x154f: 0x1863, 0x1550: 0x0b37, 0x1551: 0x16a6,\n\t0x1552: 0x16a6, 0x1553: 0x11d7, 0x1554: 0x0b47, 0x1555: 0x0b47, 0x1556: 0x05df, 0x1557: 0x16c9,\n\t0x1558: 0x179b, 0x1559: 0x0b57, 0x155a: 0x0b5f, 0x155b: 0x05e3, 0x155c: 0x0b73, 0x155d: 0x0b83,\n\t0x155e: 0x0b87, 0x155f: 0x0b8f, 0x1560: 0x0b9f, 0x1561: 0x05eb, 0x1562: 0x05e7, 0x1563: 0x0ba3,\n\t0x1564: 0x16ab, 0x1565: 0x0ba7, 0x1566: 0x0bbb, 0x1567: 0x0bbf, 0x1568: 0x0bc3, 0x1569: 0x0bbf,\n\t0x156a: 0x0bcf, 0x156b: 0x0bd3, 0x156c: 0x0be3, 0x156d: 0x0bdb, 0x156e: 0x0bdf, 0x156f: 0x0be7,\n\t0x1570: 0x0beb, 0x1571: 0x0bef, 0x1572: 0x0bfb, 0x1573: 0x0bff, 0x1574: 0x0c17, 0x1575: 0x0c1f,\n\t0x1576: 0x0c2f, 0x1577: 0x0c43, 0x1578: 0x16ba, 0x1579: 0x0c3f, 0x157a: 0x0c33, 0x157b: 0x0c4b,\n\t0x157c: 0x0c53, 0x157d: 0x0c67, 0x157e: 0x16bf, 0x157f: 0x0c6f,\n\t// Block 0x56, offset 0x1580\n\t0x1580: 0x0c63, 0x1581: 0x0c5b, 0x1582: 0x05ef, 0x1583: 0x0c77, 0x1584: 0x0c7f, 0x1585: 0x0c87,\n\t0x1586: 0x0c7b, 0x1587: 0x05f3, 0x1588: 0x0c97, 0x1589: 0x0c9f, 0x158a: 0x16c4, 0x158b: 0x0ccb,\n\t0x158c: 0x0cff, 0x158d: 0x0cdb, 0x158e: 0x05ff, 0x158f: 0x0ce7, 0x1590: 0x05fb, 0x1591: 0x05f7,\n\t0x1592: 0x07c3, 0x1593: 0x07c7, 0x1594: 0x0d03, 0x1595: 0x0ceb, 0x1596: 0x11ab, 0x1597: 0x0663,\n\t0x1598: 0x0d0f, 0x1599: 0x0d13, 0x159a: 0x0d17, 0x159b: 0x0d2b, 0x159c: 0x0d23, 0x159d: 0x16dd,\n\t0x159e: 0x0603, 0x159f: 0x0d3f, 0x15a0: 0x0d33, 0x15a1: 0x0d4f, 0x15a2: 0x0d57, 0x15a3: 0x16e7,\n\t0x15a4: 0x0d5b, 0x15a5: 0x0d47, 0x15a6: 0x0d63, 0x15a7: 0x0607, 0x15a8: 0x0d67, 0x15a9: 0x0d6b,\n\t0x15aa: 0x0d6f, 0x15ab: 0x0d7b, 0x15ac: 0x16ec, 0x15ad: 0x0d83, 0x15ae: 0x060b, 0x15af: 0x0d8f,\n\t0x15b0: 0x16f1, 0x15b1: 0x0d93, 0x15b2: 0x060f, 0x15b3: 0x0d9f, 0x15b4: 0x0dab, 0x15b5: 0x0db7,\n\t0x15b6: 0x0dbb, 0x15b7: 0x16f6, 0x15b8: 0x168d, 0x15b9: 0x16fb, 0x15ba: 0x0ddb, 0x15bb: 0x1700,\n\t0x15bc: 0x0de7, 0x15bd: 0x0def, 0x15be: 0x0ddf, 0x15bf: 0x0dfb,\n\t// Block 0x57, offset 0x15c0\n\t0x15c0: 0x0e0b, 0x15c1: 0x0e1b, 0x15c2: 0x0e0f, 0x15c3: 0x0e13, 0x15c4: 0x0e1f, 0x15c5: 0x0e23,\n\t0x15c6: 0x1705, 0x15c7: 0x0e07, 0x15c8: 0x0e3b, 0x15c9: 0x0e3f, 0x15ca: 0x0613, 0x15cb: 0x0e53,\n\t0x15cc: 0x0e4f, 0x15cd: 0x170a, 0x15ce: 0x0e33, 0x15cf: 0x0e6f, 0x15d0: 0x170f, 0x15d1: 0x1714,\n\t0x15d2: 0x0e73, 0x15d3: 0x0e87, 0x15d4: 0x0e83, 0x15d5: 0x0e7f, 0x15d6: 0x0617, 0x15d7: 0x0e8b,\n\t0x15d8: 0x0e9b, 0x15d9: 0x0e97, 0x15da: 0x0ea3, 0x15db: 0x1651, 0x15dc: 0x0eb3, 0x15dd: 0x1719,\n\t0x15de: 0x0ebf, 0x15df: 0x1723, 0x15e0: 0x0ed3, 0x15e1: 0x0edf, 0x15e2: 0x0ef3, 0x15e3: 0x1728,\n\t0x15e4: 0x0f07, 0x15e5: 0x0f0b, 0x15e6: 0x172d, 0x15e7: 0x1732, 0x15e8: 0x0f27, 0x15e9: 0x0f37,\n\t0x15ea: 0x061b, 0x15eb: 0x0f3b, 0x15ec: 0x061f, 0x15ed: 0x061f, 0x15ee: 0x0f53, 0x15ef: 0x0f57,\n\t0x15f0: 0x0f5f, 0x15f1: 0x0f63, 0x15f2: 0x0f6f, 0x15f3: 0x0623, 0x15f4: 0x0f87, 0x15f5: 0x1737,\n\t0x15f6: 0x0fa3, 0x15f7: 0x173c, 0x15f8: 0x0faf, 0x15f9: 0x16a1, 0x15fa: 0x0fbf, 0x15fb: 0x1741,\n\t0x15fc: 0x1746, 0x15fd: 0x174b, 0x15fe: 0x0627, 0x15ff: 0x062b,\n\t// Block 0x58, offset 0x1600\n\t0x1600: 0x0ff7, 0x1601: 0x1755, 0x1602: 0x1750, 0x1603: 0x175a, 0x1604: 0x175f, 0x1605: 0x0fff,\n\t0x1606: 0x1003, 0x1607: 0x1003, 0x1608: 0x100b, 0x1609: 0x0633, 0x160a: 0x100f, 0x160b: 0x0637,\n\t0x160c: 0x063b, 0x160d: 0x1769, 0x160e: 0x1023, 0x160f: 0x102b, 0x1610: 0x1037, 0x1611: 0x063f,\n\t0x1612: 0x176e, 0x1613: 0x105b, 0x1614: 0x1773, 0x1615: 0x1778, 0x1616: 0x107b, 0x1617: 0x1093,\n\t0x1618: 0x0643, 0x1619: 0x109b, 0x161a: 0x109f, 0x161b: 0x10a3, 0x161c: 0x177d, 0x161d: 0x1782,\n\t0x161e: 0x1782, 0x161f: 0x10bb, 0x1620: 0x0647, 0x1621: 0x1787, 0x1622: 0x10cf, 0x1623: 0x10d3,\n\t0x1624: 0x064b, 0x1625: 0x178c, 0x1626: 0x10ef, 0x1627: 0x064f, 0x1628: 0x10ff, 0x1629: 0x10f7,\n\t0x162a: 0x1107, 0x162b: 0x1796, 0x162c: 0x111f, 0x162d: 0x0653, 0x162e: 0x112b, 0x162f: 0x1133,\n\t0x1630: 0x1143, 0x1631: 0x0657, 0x1632: 0x17a0, 0x1633: 0x17a5, 0x1634: 0x065b, 0x1635: 0x17aa,\n\t0x1636: 0x115b, 0x1637: 0x17af, 0x1638: 0x1167, 0x1639: 0x1173, 0x163a: 0x117b, 0x163b: 0x17b4,\n\t0x163c: 0x17b9, 0x163d: 0x118f, 0x163e: 0x17be, 0x163f: 0x1197,\n\t// Block 0x59, offset 0x1640\n\t0x1640: 0x16ce, 0x1641: 0x065f, 0x1642: 0x11af, 0x1643: 0x11b3, 0x1644: 0x0667, 0x1645: 0x11b7,\n\t0x1646: 0x0a33, 0x1647: 0x17c3, 0x1648: 0x17c8, 0x1649: 0x16d3, 0x164a: 0x16d8, 0x164b: 0x11d7,\n\t0x164c: 0x11db, 0x164d: 0x13f3, 0x164e: 0x066b, 0x164f: 0x1207, 0x1650: 0x1203, 0x1651: 0x120b,\n\t0x1652: 0x083f, 0x1653: 0x120f, 0x1654: 0x1213, 0x1655: 0x1217, 0x1656: 0x121f, 0x1657: 0x17cd,\n\t0x1658: 0x121b, 0x1659: 0x1223, 0x165a: 0x1237, 0x165b: 0x123b, 0x165c: 0x1227, 0x165d: 0x123f,\n\t0x165e: 0x1253, 0x165f: 0x1267, 0x1660: 0x1233, 0x1661: 0x1247, 0x1662: 0x124b, 0x1663: 0x124f,\n\t0x1664: 0x17d2, 0x1665: 0x17dc, 0x1666: 0x17d7, 0x1667: 0x066f, 0x1668: 0x126f, 0x1669: 0x1273,\n\t0x166a: 0x127b, 0x166b: 0x17f0, 0x166c: 0x127f, 0x166d: 0x17e1, 0x166e: 0x0673, 0x166f: 0x0677,\n\t0x1670: 0x17e6, 0x1671: 0x17eb, 0x1672: 0x067b, 0x1673: 0x129f, 0x1674: 0x12a3, 0x1675: 0x12a7,\n\t0x1676: 0x12ab, 0x1677: 0x12b7, 0x1678: 0x12b3, 0x1679: 0x12bf, 0x167a: 0x12bb, 0x167b: 0x12cb,\n\t0x167c: 0x12c3, 0x167d: 0x12c7, 0x167e: 0x12cf, 0x167f: 0x067f,\n\t// Block 0x5a, offset 0x1680\n\t0x1680: 0x12d7, 0x1681: 0x12db, 0x1682: 0x0683, 0x1683: 0x12eb, 0x1684: 0x12ef, 0x1685: 0x17f5,\n\t0x1686: 0x12fb, 0x1687: 0x12ff, 0x1688: 0x0687, 0x1689: 0x130b, 0x168a: 0x05bb, 0x168b: 0x17fa,\n\t0x168c: 0x17ff, 0x168d: 0x068b, 0x168e: 0x068f, 0x168f: 0x1337, 0x1690: 0x134f, 0x1691: 0x136b,\n\t0x1692: 0x137b, 0x1693: 0x1804, 0x1694: 0x138f, 0x1695: 0x1393, 0x1696: 0x13ab, 0x1697: 0x13b7,\n\t0x1698: 0x180e, 0x1699: 0x1660, 0x169a: 0x13c3, 0x169b: 0x13bf, 0x169c: 0x13cb, 0x169d: 0x1665,\n\t0x169e: 0x13d7, 0x169f: 0x13e3, 0x16a0: 0x1813, 0x16a1: 0x1818, 0x16a2: 0x1423, 0x16a3: 0x142f,\n\t0x16a4: 0x1437, 0x16a5: 0x181d, 0x16a6: 0x143b, 0x16a7: 0x1467, 0x16a8: 0x1473, 0x16a9: 0x1477,\n\t0x16aa: 0x146f, 0x16ab: 0x1483, 0x16ac: 0x1487, 0x16ad: 0x1822, 0x16ae: 0x1493, 0x16af: 0x0693,\n\t0x16b0: 0x149b, 0x16b1: 0x1827, 0x16b2: 0x0697, 0x16b3: 0x14d3, 0x16b4: 0x0ac3, 0x16b5: 0x14eb,\n\t0x16b6: 0x182c, 0x16b7: 0x1836, 0x16b8: 0x069b, 0x16b9: 0x069f, 0x16ba: 0x1513, 0x16bb: 0x183b,\n\t0x16bc: 0x06a3, 0x16bd: 0x1840, 0x16be: 0x152b, 0x16bf: 0x152b,\n\t// Block 0x5b, offset 0x16c0\n\t0x16c0: 0x1533, 0x16c1: 0x1845, 0x16c2: 0x154b, 0x16c3: 0x06a7, 0x16c4: 0x155b, 0x16c5: 0x1567,\n\t0x16c6: 0x156f, 0x16c7: 0x1577, 0x16c8: 0x06ab, 0x16c9: 0x184a, 0x16ca: 0x158b, 0x16cb: 0x15a7,\n\t0x16cc: 0x15b3, 0x16cd: 0x06af, 0x16ce: 0x06b3, 0x16cf: 0x15b7, 0x16d0: 0x184f, 0x16d1: 0x06b7,\n\t0x16d2: 0x1854, 0x16d3: 0x1859, 0x16d4: 0x185e, 0x16d5: 0x15db, 0x16d6: 0x06bb, 0x16d7: 0x15ef,\n\t0x16d8: 0x15f7, 0x16d9: 0x15fb, 0x16da: 0x1603, 0x16db: 0x160b, 0x16dc: 0x1613, 0x16dd: 0x1868,\n}\n\n// nfkcIndex: 22 blocks, 1408 entries, 1408 bytes\n// Block 0 is the zero block.\nvar nfkcIndex = [1408]uint8{\n\t// Block 0x0, offset 0x0\n\t// Block 0x1, offset 0x40\n\t// Block 0x2, offset 0x80\n\t// Block 0x3, offset 0xc0\n\t0xc2: 0x5a, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x5b, 0xc7: 0x04,\n\t0xc8: 0x05, 0xca: 0x5c, 0xcb: 0x5d, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09,\n\t0xd0: 0x0a, 0xd1: 0x5e, 0xd2: 0x5f, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x60,\n\t0xd8: 0x61, 0xd9: 0x0d, 0xdb: 0x62, 0xdc: 0x63, 0xdd: 0x64, 0xdf: 0x65,\n\t0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05,\n\t0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a,\n\t0xf0: 0x13,\n\t// Block 0x4, offset 0x100\n\t0x120: 0x66, 0x121: 0x67, 0x123: 0x68, 0x124: 0x69, 0x125: 0x6a, 0x126: 0x6b, 0x127: 0x6c,\n\t0x128: 0x6d, 0x129: 0x6e, 0x12a: 0x6f, 0x12b: 0x70, 0x12c: 0x6b, 0x12d: 0x71, 0x12e: 0x72, 0x12f: 0x73,\n\t0x131: 0x74, 0x132: 0x75, 0x133: 0x76, 0x134: 0x77, 0x135: 0x78, 0x137: 0x79,\n\t0x138: 0x7a, 0x139: 0x7b, 0x13a: 0x7c, 0x13b: 0x7d, 0x13c: 0x7e, 0x13d: 0x7f, 0x13e: 0x80, 0x13f: 0x81,\n\t// Block 0x5, offset 0x140\n\t0x140: 0x82, 0x142: 0x83, 0x143: 0x84, 0x144: 0x85, 0x145: 0x86, 0x146: 0x87, 0x147: 0x88,\n\t0x14d: 0x89,\n\t0x15c: 0x8a, 0x15f: 0x8b,\n\t0x162: 0x8c, 0x164: 0x8d,\n\t0x168: 0x8e, 0x169: 0x8f, 0x16a: 0x90, 0x16c: 0x0e, 0x16d: 0x91, 0x16e: 0x92, 0x16f: 0x93,\n\t0x170: 0x94, 0x173: 0x95, 0x174: 0x96, 0x175: 0x0f, 0x176: 0x10, 0x177: 0x97,\n\t0x178: 0x11, 0x179: 0x12, 0x17a: 0x13, 0x17b: 0x14, 0x17c: 0x15, 0x17d: 0x16, 0x17e: 0x17, 0x17f: 0x18,\n\t// Block 0x6, offset 0x180\n\t0x180: 0x98, 0x181: 0x99, 0x182: 0x9a, 0x183: 0x9b, 0x184: 0x19, 0x185: 0x1a, 0x186: 0x9c, 0x187: 0x9d,\n\t0x188: 0x9e, 0x189: 0x1b, 0x18a: 0x1c, 0x18b: 0x9f, 0x18c: 0xa0,\n\t0x191: 0x1d, 0x192: 0x1e, 0x193: 0xa1,\n\t0x1a8: 0xa2, 0x1a9: 0xa3, 0x1ab: 0xa4,\n\t0x1b1: 0xa5, 0x1b3: 0xa6, 0x1b5: 0xa7, 0x1b7: 0xa8,\n\t0x1ba: 0xa9, 0x1bb: 0xaa, 0x1bc: 0x1f, 0x1bd: 0x20, 0x1be: 0x21, 0x1bf: 0xab,\n\t// Block 0x7, offset 0x1c0\n\t0x1c0: 0xac, 0x1c1: 0x22, 0x1c2: 0x23, 0x1c3: 0x24, 0x1c4: 0xad, 0x1c5: 0x25, 0x1c6: 0x26,\n\t0x1c8: 0x27, 0x1c9: 0x28, 0x1ca: 0x29, 0x1cb: 0x2a, 0x1cc: 0x2b, 0x1cd: 0x2c, 0x1ce: 0x2d, 0x1cf: 0x2e,\n\t// Block 0x8, offset 0x200\n\t0x219: 0xae, 0x21a: 0xaf, 0x21b: 0xb0, 0x21d: 0xb1, 0x21f: 0xb2,\n\t0x220: 0xb3, 0x223: 0xb4, 0x224: 0xb5, 0x225: 0xb6, 0x226: 0xb7, 0x227: 0xb8,\n\t0x22a: 0xb9, 0x22b: 0xba, 0x22d: 0xbb, 0x22f: 0xbc,\n\t0x230: 0xbd, 0x231: 0xbe, 0x232: 0xbf, 0x233: 0xc0, 0x234: 0xc1, 0x235: 0xc2, 0x236: 0xc3, 0x237: 0xbd,\n\t0x238: 0xbe, 0x239: 0xbf, 0x23a: 0xc0, 0x23b: 0xc1, 0x23c: 0xc2, 0x23d: 0xc3, 0x23e: 0xbd, 0x23f: 0xbe,\n\t// Block 0x9, offset 0x240\n\t0x240: 0xbf, 0x241: 0xc0, 0x242: 0xc1, 0x243: 0xc2, 0x244: 0xc3, 0x245: 0xbd, 0x246: 0xbe, 0x247: 0xbf,\n\t0x248: 0xc0, 0x249: 0xc1, 0x24a: 0xc2, 0x24b: 0xc3, 0x24c: 0xbd, 0x24d: 0xbe, 0x24e: 0xbf, 0x24f: 0xc0,\n\t0x250: 0xc1, 0x251: 0xc2, 0x252: 0xc3, 0x253: 0xbd, 0x254: 0xbe, 0x255: 0xbf, 0x256: 0xc0, 0x257: 0xc1,\n\t0x258: 0xc2, 0x259: 0xc3, 0x25a: 0xbd, 0x25b: 0xbe, 0x25c: 0xbf, 0x25d: 0xc0, 0x25e: 0xc1, 0x25f: 0xc2,\n\t0x260: 0xc3, 0x261: 0xbd, 0x262: 0xbe, 0x263: 0xbf, 0x264: 0xc0, 0x265: 0xc1, 0x266: 0xc2, 0x267: 0xc3,\n\t0x268: 0xbd, 0x269: 0xbe, 0x26a: 0xbf, 0x26b: 0xc0, 0x26c: 0xc1, 0x26d: 0xc2, 0x26e: 0xc3, 0x26f: 0xbd,\n\t0x270: 0xbe, 0x271: 0xbf, 0x272: 0xc0, 0x273: 0xc1, 0x274: 0xc2, 0x275: 0xc3, 0x276: 0xbd, 0x277: 0xbe,\n\t0x278: 0xbf, 0x279: 0xc0, 0x27a: 0xc1, 0x27b: 0xc2, 0x27c: 0xc3, 0x27d: 0xbd, 0x27e: 0xbe, 0x27f: 0xbf,\n\t// Block 0xa, offset 0x280\n\t0x280: 0xc0, 0x281: 0xc1, 0x282: 0xc2, 0x283: 0xc3, 0x284: 0xbd, 0x285: 0xbe, 0x286: 0xbf, 0x287: 0xc0,\n\t0x288: 0xc1, 0x289: 0xc2, 0x28a: 0xc3, 0x28b: 0xbd, 0x28c: 0xbe, 0x28d: 0xbf, 0x28e: 0xc0, 0x28f: 0xc1,\n\t0x290: 0xc2, 0x291: 0xc3, 0x292: 0xbd, 0x293: 0xbe, 0x294: 0xbf, 0x295: 0xc0, 0x296: 0xc1, 0x297: 0xc2,\n\t0x298: 0xc3, 0x299: 0xbd, 0x29a: 0xbe, 0x29b: 0xbf, 0x29c: 0xc0, 0x29d: 0xc1, 0x29e: 0xc2, 0x29f: 0xc3,\n\t0x2a0: 0xbd, 0x2a1: 0xbe, 0x2a2: 0xbf, 0x2a3: 0xc0, 0x2a4: 0xc1, 0x2a5: 0xc2, 0x2a6: 0xc3, 0x2a7: 0xbd,\n\t0x2a8: 0xbe, 0x2a9: 0xbf, 0x2aa: 0xc0, 0x2ab: 0xc1, 0x2ac: 0xc2, 0x2ad: 0xc3, 0x2ae: 0xbd, 0x2af: 0xbe,\n\t0x2b0: 0xbf, 0x2b1: 0xc0, 0x2b2: 0xc1, 0x2b3: 0xc2, 0x2b4: 0xc3, 0x2b5: 0xbd, 0x2b6: 0xbe, 0x2b7: 0xbf,\n\t0x2b8: 0xc0, 0x2b9: 0xc1, 0x2ba: 0xc2, 0x2bb: 0xc3, 0x2bc: 0xbd, 0x2bd: 0xbe, 0x2be: 0xbf, 0x2bf: 0xc0,\n\t// Block 0xb, offset 0x2c0\n\t0x2c0: 0xc1, 0x2c1: 0xc2, 0x2c2: 0xc3, 0x2c3: 0xbd, 0x2c4: 0xbe, 0x2c5: 0xbf, 0x2c6: 0xc0, 0x2c7: 0xc1,\n\t0x2c8: 0xc2, 0x2c9: 0xc3, 0x2ca: 0xbd, 0x2cb: 0xbe, 0x2cc: 0xbf, 0x2cd: 0xc0, 0x2ce: 0xc1, 0x2cf: 0xc2,\n\t0x2d0: 0xc3, 0x2d1: 0xbd, 0x2d2: 0xbe, 0x2d3: 0xbf, 0x2d4: 0xc0, 0x2d5: 0xc1, 0x2d6: 0xc2, 0x2d7: 0xc3,\n\t0x2d8: 0xbd, 0x2d9: 0xbe, 0x2da: 0xbf, 0x2db: 0xc0, 0x2dc: 0xc1, 0x2dd: 0xc2, 0x2de: 0xc4,\n\t// Block 0xc, offset 0x300\n\t0x324: 0x2f, 0x325: 0x30, 0x326: 0x31, 0x327: 0x32,\n\t0x328: 0x33, 0x329: 0x34, 0x32a: 0x35, 0x32b: 0x36, 0x32c: 0x37, 0x32d: 0x38, 0x32e: 0x39, 0x32f: 0x3a,\n\t0x330: 0x3b, 0x331: 0x3c, 0x332: 0x3d, 0x333: 0x3e, 0x334: 0x3f, 0x335: 0x40, 0x336: 0x41, 0x337: 0x42,\n\t0x338: 0x43, 0x339: 0x44, 0x33a: 0x45, 0x33b: 0x46, 0x33c: 0xc5, 0x33d: 0x47, 0x33e: 0x48, 0x33f: 0x49,\n\t// Block 0xd, offset 0x340\n\t0x347: 0xc6,\n\t0x34b: 0xc7, 0x34d: 0xc8,\n\t0x368: 0xc9, 0x36b: 0xca,\n\t// Block 0xe, offset 0x380\n\t0x381: 0xcb, 0x382: 0xcc, 0x384: 0xcd, 0x385: 0xb7, 0x387: 0xce,\n\t0x388: 0xcf, 0x38b: 0xd0, 0x38c: 0x6b, 0x38d: 0xd1,\n\t0x391: 0xd2, 0x392: 0xd3, 0x393: 0xd4, 0x396: 0xd5, 0x397: 0xd6,\n\t0x398: 0xd7, 0x39a: 0xd8, 0x39c: 0xd9,\n\t0x3b0: 0xd7,\n\t// Block 0xf, offset 0x3c0\n\t0x3eb: 0xda, 0x3ec: 0xdb,\n\t// Block 0x10, offset 0x400\n\t0x432: 0xdc,\n\t// Block 0x11, offset 0x440\n\t0x445: 0xdd, 0x446: 0xde, 0x447: 0xdf,\n\t0x449: 0xe0,\n\t0x450: 0xe1, 0x451: 0xe2, 0x452: 0xe3, 0x453: 0xe4, 0x454: 0xe5, 0x455: 0xe6, 0x456: 0xe7, 0x457: 0xe8,\n\t0x458: 0xe9, 0x459: 0xea, 0x45a: 0x4a, 0x45b: 0xeb, 0x45c: 0xec, 0x45d: 0xed, 0x45e: 0xee, 0x45f: 0x4b,\n\t// Block 0x12, offset 0x480\n\t0x480: 0xef,\n\t0x4a3: 0xf0, 0x4a5: 0xf1,\n\t0x4b8: 0x4c, 0x4b9: 0x4d, 0x4ba: 0x4e,\n\t// Block 0x13, offset 0x4c0\n\t0x4c4: 0x4f, 0x4c5: 0xf2, 0x4c6: 0xf3,\n\t0x4c8: 0x50, 0x4c9: 0xf4,\n\t// Block 0x14, offset 0x500\n\t0x520: 0x51, 0x521: 0x52, 0x522: 0x53, 0x523: 0x54, 0x524: 0x55, 0x525: 0x56, 0x526: 0x57, 0x527: 0x58,\n\t0x528: 0x59,\n\t// Block 0x15, offset 0x540\n\t0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d,\n\t0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11,\n\t0x56f: 0x12,\n}\n\n// nfkcSparseOffset: 155 entries, 310 bytes\nvar nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1b, 0x25, 0x35, 0x37, 0x3c, 0x47, 0x56, 0x63, 0x6b, 0x6f, 0x74, 0x76, 0x87, 0x8f, 0x96, 0x99, 0xa0, 0xa4, 0xa8, 0xaa, 0xac, 0xb5, 0xb9, 0xc0, 0xc5, 0xc8, 0xd2, 0xd4, 0xdb, 0xe3, 0xe7, 0xe9, 0xec, 0xf0, 0xf6, 0x107, 0x113, 0x115, 0x11b, 0x11d, 0x11f, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12c, 0x12f, 0x131, 0x134, 0x137, 0x13b, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x176, 0x184, 0x192, 0x1a2, 0x1b0, 0x1b7, 0x1bd, 0x1cc, 0x1d0, 0x1d2, 0x1d6, 0x1d8, 0x1db, 0x1dd, 0x1e0, 0x1e2, 0x1e5, 0x1e7, 0x1e9, 0x1eb, 0x1f7, 0x201, 0x20b, 0x20e, 0x212, 0x214, 0x216, 0x218, 0x21a, 0x21d, 0x21f, 0x221, 0x223, 0x225, 0x22b, 0x22e, 0x232, 0x234, 0x23b, 0x241, 0x247, 0x24f, 0x255, 0x25b, 0x261, 0x265, 0x267, 0x269, 0x26b, 0x26d, 0x273, 0x276, 0x279, 0x281, 0x288, 0x28b, 0x28e, 0x290, 0x298, 0x29b, 0x2a2, 0x2a5, 0x2ab, 0x2ad, 0x2af, 0x2b2, 0x2b4, 0x2b6, 0x2b8, 0x2ba, 0x2c7, 0x2d1, 0x2d3, 0x2d5, 0x2d9, 0x2de, 0x2ea, 0x2ef, 0x2f8, 0x2fe, 0x303, 0x307, 0x30c, 0x310, 0x320, 0x32e, 0x33c, 0x34a, 0x350, 0x352, 0x355, 0x35f, 0x361}\n\n// nfkcSparseValues: 875 entries, 3500 bytes\nvar nfkcSparseValues = [875]valueRange{\n\t// Block 0x0, offset 0x0\n\t{value: 0x0002, lo: 0x0d},\n\t{value: 0x0001, lo: 0xa0, hi: 0xa0},\n\t{value: 0x4278, lo: 0xa8, hi: 0xa8},\n\t{value: 0x0083, lo: 0xaa, hi: 0xaa},\n\t{value: 0x4264, lo: 0xaf, hi: 0xaf},\n\t{value: 0x0025, lo: 0xb2, hi: 0xb3},\n\t{value: 0x425a, lo: 0xb4, hi: 0xb4},\n\t{value: 0x01dc, lo: 0xb5, hi: 0xb5},\n\t{value: 0x4291, lo: 0xb8, hi: 0xb8},\n\t{value: 0x0023, lo: 0xb9, hi: 0xb9},\n\t{value: 0x009f, lo: 0xba, hi: 0xba},\n\t{value: 0x221c, lo: 0xbc, hi: 0xbc},\n\t{value: 0x2210, lo: 0xbd, hi: 0xbd},\n\t{value: 0x22b2, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1, offset 0xe\n\t{value: 0x0091, lo: 0x03},\n\t{value: 0x46e2, lo: 0xa0, hi: 0xa1},\n\t{value: 0x4714, lo: 0xaf, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb7, hi: 0xb7},\n\t// Block 0x2, offset 0x12\n\t{value: 0x0003, lo: 0x08},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x0091, lo: 0xb0, hi: 0xb0},\n\t{value: 0x0119, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0095, lo: 0xb2, hi: 0xb2},\n\t{value: 0x00a5, lo: 0xb3, hi: 0xb3},\n\t{value: 0x0143, lo: 0xb4, hi: 0xb6},\n\t{value: 0x00af, lo: 0xb7, hi: 0xb7},\n\t{value: 0x00b3, lo: 0xb8, hi: 0xb8},\n\t// Block 0x3, offset 0x1b\n\t{value: 0x000a, lo: 0x09},\n\t{value: 0x426e, lo: 0x98, hi: 0x98},\n\t{value: 0x4273, lo: 0x99, hi: 0x9a},\n\t{value: 0x4296, lo: 0x9b, hi: 0x9b},\n\t{value: 0x425f, lo: 0x9c, hi: 0x9c},\n\t{value: 0x4282, lo: 0x9d, hi: 0x9d},\n\t{value: 0x0113, lo: 0xa0, hi: 0xa0},\n\t{value: 0x0099, lo: 0xa1, hi: 0xa1},\n\t{value: 0x00a7, lo: 0xa2, hi: 0xa3},\n\t{value: 0x0167, lo: 0xa4, hi: 0xa4},\n\t// Block 0x4, offset 0x25\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0xa000, lo: 0x8d, hi: 0x8d},\n\t{value: 0x37a5, lo: 0x90, hi: 0x90},\n\t{value: 0x37b1, lo: 0x91, hi: 0x91},\n\t{value: 0x379f, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x96, hi: 0x96},\n\t{value: 0x3817, lo: 0x97, hi: 0x97},\n\t{value: 0x37e1, lo: 0x9c, hi: 0x9c},\n\t{value: 0x37c9, lo: 0x9d, hi: 0x9d},\n\t{value: 0x37f3, lo: 0x9e, hi: 0x9e},\n\t{value: 0xa000, lo: 0xb4, hi: 0xb5},\n\t{value: 0x381d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x3823, lo: 0xb7, hi: 0xb7},\n\t// Block 0x5, offset 0x35\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x83, hi: 0x87},\n\t// Block 0x6, offset 0x37\n\t{value: 0x0001, lo: 0x04},\n\t{value: 0x8113, lo: 0x81, hi: 0x82},\n\t{value: 0x8132, lo: 0x84, hi: 0x84},\n\t{value: 0x812d, lo: 0x85, hi: 0x85},\n\t{value: 0x810d, lo: 0x87, hi: 0x87},\n\t// Block 0x7, offset 0x3c\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x97},\n\t{value: 0x8119, lo: 0x98, hi: 0x98},\n\t{value: 0x811a, lo: 0x99, hi: 0x99},\n\t{value: 0x811b, lo: 0x9a, hi: 0x9a},\n\t{value: 0x3841, lo: 0xa2, hi: 0xa2},\n\t{value: 0x3847, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3853, lo: 0xa4, hi: 0xa4},\n\t{value: 0x384d, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3859, lo: 0xa6, hi: 0xa6},\n\t{value: 0xa000, lo: 0xa7, hi: 0xa7},\n\t// Block 0x8, offset 0x47\n\t{value: 0x0000, lo: 0x0e},\n\t{value: 0x386b, lo: 0x80, hi: 0x80},\n\t{value: 0xa000, lo: 0x81, hi: 0x81},\n\t{value: 0x385f, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x3865, lo: 0x93, hi: 0x93},\n\t{value: 0xa000, lo: 0x95, hi: 0x95},\n\t{value: 0x8132, lo: 0x96, hi: 0x9c},\n\t{value: 0x8132, lo: 0x9f, hi: 0xa2},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8132, lo: 0xab, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t// Block 0x9, offset 0x56\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x811f, lo: 0x91, hi: 0x91},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x812d, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb5, hi: 0xb6},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb9},\n\t{value: 0x8132, lo: 0xba, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbc},\n\t{value: 0x8132, lo: 0xbd, hi: 0xbd},\n\t{value: 0x812d, lo: 0xbe, hi: 0xbe},\n\t{value: 0x8132, lo: 0xbf, hi: 0xbf},\n\t// Block 0xa, offset 0x63\n\t{value: 0x0005, lo: 0x07},\n\t{value: 0x8132, lo: 0x80, hi: 0x80},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x812d, lo: 0x82, hi: 0x83},\n\t{value: 0x812d, lo: 0x84, hi: 0x85},\n\t{value: 0x812d, lo: 0x86, hi: 0x87},\n\t{value: 0x812d, lo: 0x88, hi: 0x89},\n\t{value: 0x8132, lo: 0x8a, hi: 0x8a},\n\t// Block 0xb, offset 0x6b\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8132, lo: 0xab, hi: 0xb1},\n\t{value: 0x812d, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb3},\n\t// Block 0xc, offset 0x6f\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0x96, hi: 0x99},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa7},\n\t{value: 0x8132, lo: 0xa9, hi: 0xad},\n\t// Block 0xd, offset 0x74\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x99, hi: 0x9b},\n\t// Block 0xe, offset 0x76\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x8132, lo: 0x94, hi: 0xa1},\n\t{value: 0x812d, lo: 0xa3, hi: 0xa3},\n\t{value: 0x8132, lo: 0xa4, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa8},\n\t{value: 0x812d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8132, lo: 0xaa, hi: 0xac},\n\t{value: 0x812d, lo: 0xad, hi: 0xaf},\n\t{value: 0x8116, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8117, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8118, lo: 0xb2, hi: 0xb2},\n\t{value: 0x8132, lo: 0xb3, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x812d, lo: 0xb9, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbf},\n\t// Block 0xf, offset 0x87\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0xa8, hi: 0xa8},\n\t{value: 0x3ed8, lo: 0xa9, hi: 0xa9},\n\t{value: 0xa000, lo: 0xb0, hi: 0xb0},\n\t{value: 0x3ee0, lo: 0xb1, hi: 0xb1},\n\t{value: 0xa000, lo: 0xb3, hi: 0xb3},\n\t{value: 0x3ee8, lo: 0xb4, hi: 0xb4},\n\t{value: 0x9902, lo: 0xbc, hi: 0xbc},\n\t// Block 0x10, offset 0x8f\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x91, hi: 0x91},\n\t{value: 0x812d, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x93, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x94},\n\t{value: 0x451c, lo: 0x98, hi: 0x9f},\n\t// Block 0x11, offset 0x96\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x12, offset 0x99\n\t{value: 0x0008, lo: 0x06},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2c9e, lo: 0x8b, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x455c, lo: 0x9c, hi: 0x9d},\n\t{value: 0x456c, lo: 0x9f, hi: 0x9f},\n\t// Block 0x13, offset 0xa0\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x4594, lo: 0xb3, hi: 0xb3},\n\t{value: 0x459c, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x14, offset 0xa4\n\t{value: 0x0008, lo: 0x03},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x4574, lo: 0x99, hi: 0x9b},\n\t{value: 0x458c, lo: 0x9e, hi: 0x9e},\n\t// Block 0x15, offset 0xa8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t// Block 0x16, offset 0xaa\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t// Block 0x17, offset 0xac\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2cb6, lo: 0x88, hi: 0x88},\n\t{value: 0x2cae, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cbe, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x96, hi: 0x97},\n\t{value: 0x45a4, lo: 0x9c, hi: 0x9c},\n\t{value: 0x45ac, lo: 0x9d, hi: 0x9d},\n\t// Block 0x18, offset 0xb5\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0x2cc6, lo: 0x94, hi: 0x94},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x19, offset 0xb9\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cce, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2cde, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2cd6, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x1a, offset 0xc0\n\t{value: 0x1801, lo: 0x04},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x3ef0, lo: 0x88, hi: 0x88},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8120, lo: 0x95, hi: 0x96},\n\t// Block 0x1b, offset 0xc5\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xbc, hi: 0xbc},\n\t{value: 0xa000, lo: 0xbf, hi: 0xbf},\n\t// Block 0x1c, offset 0xc8\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x2ce6, lo: 0x80, hi: 0x80},\n\t{value: 0x9900, lo: 0x82, hi: 0x82},\n\t{value: 0xa000, lo: 0x86, hi: 0x86},\n\t{value: 0x2cee, lo: 0x87, hi: 0x87},\n\t{value: 0x2cf6, lo: 0x88, hi: 0x88},\n\t{value: 0x2f50, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2dd8, lo: 0x8b, hi: 0x8b},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x95, hi: 0x96},\n\t// Block 0x1d, offset 0xd2\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0xbe, hi: 0xbe},\n\t// Block 0x1e, offset 0xd4\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xa000, lo: 0x86, hi: 0x87},\n\t{value: 0x2cfe, lo: 0x8a, hi: 0x8a},\n\t{value: 0x2d0e, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d06, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t// Block 0x1f, offset 0xdb\n\t{value: 0x6bea, lo: 0x07},\n\t{value: 0x9904, lo: 0x8a, hi: 0x8a},\n\t{value: 0x9900, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x3ef8, lo: 0x9a, hi: 0x9a},\n\t{value: 0x2f58, lo: 0x9c, hi: 0x9c},\n\t{value: 0x2de3, lo: 0x9d, hi: 0x9d},\n\t{value: 0x2d16, lo: 0x9e, hi: 0x9f},\n\t// Block 0x20, offset 0xe3\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x2621, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8122, lo: 0xb8, hi: 0xb9},\n\t{value: 0x8104, lo: 0xba, hi: 0xba},\n\t// Block 0x21, offset 0xe7\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8123, lo: 0x88, hi: 0x8b},\n\t// Block 0x22, offset 0xe9\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x2636, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8124, lo: 0xb8, hi: 0xb9},\n\t// Block 0x23, offset 0xec\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8125, lo: 0x88, hi: 0x8b},\n\t{value: 0x2628, lo: 0x9c, hi: 0x9c},\n\t{value: 0x262f, lo: 0x9d, hi: 0x9d},\n\t// Block 0x24, offset 0xf0\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x030b, lo: 0x8c, hi: 0x8c},\n\t{value: 0x812d, lo: 0x98, hi: 0x99},\n\t{value: 0x812d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x812d, lo: 0xb7, hi: 0xb7},\n\t{value: 0x812b, lo: 0xb9, hi: 0xb9},\n\t// Block 0x25, offset 0xf6\n\t{value: 0x0000, lo: 0x10},\n\t{value: 0x2644, lo: 0x83, hi: 0x83},\n\t{value: 0x264b, lo: 0x8d, hi: 0x8d},\n\t{value: 0x2652, lo: 0x92, hi: 0x92},\n\t{value: 0x2659, lo: 0x97, hi: 0x97},\n\t{value: 0x2660, lo: 0x9c, hi: 0x9c},\n\t{value: 0x263d, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8126, lo: 0xb1, hi: 0xb1},\n\t{value: 0x8127, lo: 0xb2, hi: 0xb2},\n\t{value: 0x4a84, lo: 0xb3, hi: 0xb3},\n\t{value: 0x8128, lo: 0xb4, hi: 0xb4},\n\t{value: 0x4a8d, lo: 0xb5, hi: 0xb5},\n\t{value: 0x45b4, lo: 0xb6, hi: 0xb6},\n\t{value: 0x45f4, lo: 0xb7, hi: 0xb7},\n\t{value: 0x45bc, lo: 0xb8, hi: 0xb8},\n\t{value: 0x45ff, lo: 0xb9, hi: 0xb9},\n\t{value: 0x8127, lo: 0xba, hi: 0xbd},\n\t// Block 0x26, offset 0x107\n\t{value: 0x0000, lo: 0x0b},\n\t{value: 0x8127, lo: 0x80, hi: 0x80},\n\t{value: 0x4a96, lo: 0x81, hi: 0x81},\n\t{value: 0x8132, lo: 0x82, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0x86, hi: 0x87},\n\t{value: 0x266e, lo: 0x93, hi: 0x93},\n\t{value: 0x2675, lo: 0x9d, hi: 0x9d},\n\t{value: 0x267c, lo: 0xa2, hi: 0xa2},\n\t{value: 0x2683, lo: 0xa7, hi: 0xa7},\n\t{value: 0x268a, lo: 0xac, hi: 0xac},\n\t{value: 0x2667, lo: 0xb9, hi: 0xb9},\n\t// Block 0x27, offset 0x113\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x86, hi: 0x86},\n\t// Block 0x28, offset 0x115\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x2d1e, lo: 0xa6, hi: 0xa6},\n\t{value: 0x9900, lo: 0xae, hi: 0xae},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x29, offset 0x11b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t// Block 0x2a, offset 0x11d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x030f, lo: 0xbc, hi: 0xbc},\n\t// Block 0x2b, offset 0x11f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xa000, lo: 0x80, hi: 0x92},\n\t// Block 0x2c, offset 0x121\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0xb900, lo: 0xa1, hi: 0xb5},\n\t// Block 0x2d, offset 0x123\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0xa8, hi: 0xbf},\n\t// Block 0x2e, offset 0x125\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x9900, lo: 0x80, hi: 0x82},\n\t// Block 0x2f, offset 0x127\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9f},\n\t// Block 0x30, offset 0x129\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x94, hi: 0x94},\n\t{value: 0x8104, lo: 0xb4, hi: 0xb4},\n\t// Block 0x31, offset 0x12c\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x92, hi: 0x92},\n\t{value: 0x8132, lo: 0x9d, hi: 0x9d},\n\t// Block 0x32, offset 0x12f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8131, lo: 0xa9, hi: 0xa9},\n\t// Block 0x33, offset 0x131\n\t{value: 0x0004, lo: 0x02},\n\t{value: 0x812e, lo: 0xb9, hi: 0xba},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbb},\n\t// Block 0x34, offset 0x134\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x97, hi: 0x97},\n\t{value: 0x812d, lo: 0x98, hi: 0x98},\n\t// Block 0x35, offset 0x137\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x8104, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8132, lo: 0xb5, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x36, offset 0x13b\n\t{value: 0x0000, lo: 0x04},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t{value: 0x812d, lo: 0xb5, hi: 0xba},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x37, offset 0x140\n\t{value: 0x0000, lo: 0x08},\n\t{value: 0x2d66, lo: 0x80, hi: 0x80},\n\t{value: 0x2d6e, lo: 0x81, hi: 0x81},\n\t{value: 0xa000, lo: 0x82, hi: 0x82},\n\t{value: 0x2d76, lo: 0x83, hi: 0x83},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xab, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xac},\n\t{value: 0x8132, lo: 0xad, hi: 0xb3},\n\t// Block 0x38, offset 0x149\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xaa, hi: 0xab},\n\t// Block 0x39, offset 0x14b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8102, lo: 0xa6, hi: 0xa6},\n\t{value: 0x8104, lo: 0xb2, hi: 0xb3},\n\t// Block 0x3a, offset 0x14e\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x3b, offset 0x150\n\t{value: 0x0000, lo: 0x0a},\n\t{value: 0x8132, lo: 0x90, hi: 0x92},\n\t{value: 0x8101, lo: 0x94, hi: 0x94},\n\t{value: 0x812d, lo: 0x95, hi: 0x99},\n\t{value: 0x8132, lo: 0x9a, hi: 0x9b},\n\t{value: 0x812d, lo: 0x9c, hi: 0x9f},\n\t{value: 0x8132, lo: 0xa0, hi: 0xa0},\n\t{value: 0x8101, lo: 0xa2, hi: 0xa8},\n\t{value: 0x812d, lo: 0xad, hi: 0xad},\n\t{value: 0x8132, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb9},\n\t// Block 0x3c, offset 0x15b\n\t{value: 0x0002, lo: 0x0a},\n\t{value: 0x0043, lo: 0xac, hi: 0xac},\n\t{value: 0x00d1, lo: 0xad, hi: 0xad},\n\t{value: 0x0045, lo: 0xae, hi: 0xae},\n\t{value: 0x0049, lo: 0xb0, hi: 0xb1},\n\t{value: 0x00e6, lo: 0xb2, hi: 0xb2},\n\t{value: 0x004f, lo: 0xb3, hi: 0xba},\n\t{value: 0x005f, lo: 0xbc, hi: 0xbc},\n\t{value: 0x00ef, lo: 0xbd, hi: 0xbd},\n\t{value: 0x0061, lo: 0xbe, hi: 0xbe},\n\t{value: 0x0065, lo: 0xbf, hi: 0xbf},\n\t// Block 0x3d, offset 0x166\n\t{value: 0x0000, lo: 0x0f},\n\t{value: 0x8132, lo: 0x80, hi: 0x81},\n\t{value: 0x812d, lo: 0x82, hi: 0x82},\n\t{value: 0x8132, lo: 0x83, hi: 0x89},\n\t{value: 0x812d, lo: 0x8a, hi: 0x8a},\n\t{value: 0x8132, lo: 0x8b, hi: 0x8c},\n\t{value: 0x8135, lo: 0x8d, hi: 0x8d},\n\t{value: 0x812a, lo: 0x8e, hi: 0x8e},\n\t{value: 0x812d, lo: 0x8f, hi: 0x8f},\n\t{value: 0x8129, lo: 0x90, hi: 0x90},\n\t{value: 0x8132, lo: 0x91, hi: 0xb5},\n\t{value: 0x8132, lo: 0xbb, hi: 0xbb},\n\t{value: 0x8134, lo: 0xbc, hi: 0xbc},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t{value: 0x8132, lo: 0xbe, hi: 0xbe},\n\t{value: 0x812d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x3e, offset 0x176\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x0001, lo: 0x80, hi: 0x8a},\n\t{value: 0x043b, lo: 0x91, hi: 0x91},\n\t{value: 0x429b, lo: 0x97, hi: 0x97},\n\t{value: 0x001d, lo: 0xa4, hi: 0xa4},\n\t{value: 0x1873, lo: 0xa5, hi: 0xa5},\n\t{value: 0x1b5c, lo: 0xa6, hi: 0xa6},\n\t{value: 0x0001, lo: 0xaf, hi: 0xaf},\n\t{value: 0x2691, lo: 0xb3, hi: 0xb3},\n\t{value: 0x27fe, lo: 0xb4, hi: 0xb4},\n\t{value: 0x2698, lo: 0xb6, hi: 0xb6},\n\t{value: 0x2808, lo: 0xb7, hi: 0xb7},\n\t{value: 0x186d, lo: 0xbc, hi: 0xbc},\n\t{value: 0x4269, lo: 0xbe, hi: 0xbe},\n\t// Block 0x3f, offset 0x184\n\t{value: 0x0002, lo: 0x0d},\n\t{value: 0x1933, lo: 0x87, hi: 0x87},\n\t{value: 0x1930, lo: 0x88, hi: 0x88},\n\t{value: 0x1870, lo: 0x89, hi: 0x89},\n\t{value: 0x298e, lo: 0x97, hi: 0x97},\n\t{value: 0x0001, lo: 0x9f, hi: 0x9f},\n\t{value: 0x0021, lo: 0xb0, hi: 0xb0},\n\t{value: 0x0093, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0029, lo: 0xb4, hi: 0xb9},\n\t{value: 0x0017, lo: 0xba, hi: 0xba},\n\t{value: 0x0467, lo: 0xbb, hi: 0xbb},\n\t{value: 0x003b, lo: 0xbc, hi: 0xbc},\n\t{value: 0x0011, lo: 0xbd, hi: 0xbe},\n\t{value: 0x009d, lo: 0xbf, hi: 0xbf},\n\t// Block 0x40, offset 0x192\n\t{value: 0x0002, lo: 0x0f},\n\t{value: 0x0021, lo: 0x80, hi: 0x89},\n\t{value: 0x0017, lo: 0x8a, hi: 0x8a},\n\t{value: 0x0467, lo: 0x8b, hi: 0x8b},\n\t{value: 0x003b, lo: 0x8c, hi: 0x8c},\n\t{value: 0x0011, lo: 0x8d, hi: 0x8e},\n\t{value: 0x0083, lo: 0x90, hi: 0x90},\n\t{value: 0x008b, lo: 0x91, hi: 0x91},\n\t{value: 0x009f, lo: 0x92, hi: 0x92},\n\t{value: 0x00b1, lo: 0x93, hi: 0x93},\n\t{value: 0x0104, lo: 0x94, hi: 0x94},\n\t{value: 0x0091, lo: 0x95, hi: 0x95},\n\t{value: 0x0097, lo: 0x96, hi: 0x99},\n\t{value: 0x00a1, lo: 0x9a, hi: 0x9a},\n\t{value: 0x00a7, lo: 0x9b, hi: 0x9c},\n\t{value: 0x1999, lo: 0xa8, hi: 0xa8},\n\t// Block 0x41, offset 0x1a2\n\t{value: 0x0000, lo: 0x0d},\n\t{value: 0x8132, lo: 0x90, hi: 0x91},\n\t{value: 0x8101, lo: 0x92, hi: 0x93},\n\t{value: 0x8132, lo: 0x94, hi: 0x97},\n\t{value: 0x8101, lo: 0x98, hi: 0x9a},\n\t{value: 0x8132, lo: 0x9b, hi: 0x9c},\n\t{value: 0x8132, lo: 0xa1, hi: 0xa1},\n\t{value: 0x8101, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8132, lo: 0xa7, hi: 0xa7},\n\t{value: 0x812d, lo: 0xa8, hi: 0xa8},\n\t{value: 0x8132, lo: 0xa9, hi: 0xa9},\n\t{value: 0x8101, lo: 0xaa, hi: 0xab},\n\t{value: 0x812d, lo: 0xac, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t// Block 0x42, offset 0x1b0\n\t{value: 0x0007, lo: 0x06},\n\t{value: 0x2180, lo: 0x89, hi: 0x89},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t{value: 0x3bb9, lo: 0x9a, hi: 0x9b},\n\t{value: 0x3bc7, lo: 0xae, hi: 0xae},\n\t// Block 0x43, offset 0x1b7\n\t{value: 0x000e, lo: 0x05},\n\t{value: 0x3bce, lo: 0x8d, hi: 0x8e},\n\t{value: 0x3bd5, lo: 0x8f, hi: 0x8f},\n\t{value: 0xa000, lo: 0x90, hi: 0x90},\n\t{value: 0xa000, lo: 0x92, hi: 0x92},\n\t{value: 0xa000, lo: 0x94, hi: 0x94},\n\t// Block 0x44, offset 0x1bd\n\t{value: 0x0173, lo: 0x0e},\n\t{value: 0xa000, lo: 0x83, hi: 0x83},\n\t{value: 0x3be3, lo: 0x84, hi: 0x84},\n\t{value: 0xa000, lo: 0x88, hi: 0x88},\n\t{value: 0x3bea, lo: 0x89, hi: 0x89},\n\t{value: 0xa000, lo: 0x8b, hi: 0x8b},\n\t{value: 0x3bf1, lo: 0x8c, hi: 0x8c},\n\t{value: 0xa000, lo: 0xa3, hi: 0xa3},\n\t{value: 0x3bf8, lo: 0xa4, hi: 0xa4},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x3bff, lo: 0xa6, hi: 0xa6},\n\t{value: 0x269f, lo: 0xac, hi: 0xad},\n\t{value: 0x26a6, lo: 0xaf, hi: 0xaf},\n\t{value: 0x281c, lo: 0xb0, hi: 0xb0},\n\t{value: 0xa000, lo: 0xbc, hi: 0xbc},\n\t// Block 0x45, offset 0x1cc\n\t{value: 0x0007, lo: 0x03},\n\t{value: 0x3c68, lo: 0xa0, hi: 0xa1},\n\t{value: 0x3c92, lo: 0xa2, hi: 0xa3},\n\t{value: 0x3cbc, lo: 0xaa, hi: 0xad},\n\t// Block 0x46, offset 0x1d0\n\t{value: 0x0004, lo: 0x01},\n\t{value: 0x048b, lo: 0xa9, hi: 0xaa},\n\t// Block 0x47, offset 0x1d2\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x0057, lo: 0x80, hi: 0x8f},\n\t{value: 0x0083, lo: 0x90, hi: 0xa9},\n\t{value: 0x0021, lo: 0xaa, hi: 0xaa},\n\t// Block 0x48, offset 0x1d6\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x299b, lo: 0x8c, hi: 0x8c},\n\t// Block 0x49, offset 0x1d8\n\t{value: 0x0263, lo: 0x02},\n\t{value: 0x1b8c, lo: 0xb4, hi: 0xb4},\n\t{value: 0x192d, lo: 0xb5, hi: 0xb6},\n\t// Block 0x4a, offset 0x1db\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x44dd, lo: 0x9c, hi: 0x9c},\n\t// Block 0x4b, offset 0x1dd\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x0095, lo: 0xbc, hi: 0xbc},\n\t{value: 0x006d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x4c, offset 0x1e0\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xaf, hi: 0xb1},\n\t// Block 0x4d, offset 0x1e2\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x047f, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x4e, offset 0x1e5\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xa0, hi: 0xbf},\n\t// Block 0x4f, offset 0x1e7\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x0dc3, lo: 0x9f, hi: 0x9f},\n\t// Block 0x50, offset 0x1e9\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x162f, lo: 0xb3, hi: 0xb3},\n\t// Block 0x51, offset 0x1eb\n\t{value: 0x0004, lo: 0x0b},\n\t{value: 0x1597, lo: 0x80, hi: 0x82},\n\t{value: 0x15af, lo: 0x83, hi: 0x83},\n\t{value: 0x15c7, lo: 0x84, hi: 0x85},\n\t{value: 0x15d7, lo: 0x86, hi: 0x89},\n\t{value: 0x15eb, lo: 0x8a, hi: 0x8c},\n\t{value: 0x15ff, lo: 0x8d, hi: 0x8d},\n\t{value: 0x1607, lo: 0x8e, hi: 0x8e},\n\t{value: 0x160f, lo: 0x8f, hi: 0x90},\n\t{value: 0x161b, lo: 0x91, hi: 0x93},\n\t{value: 0x162b, lo: 0x94, hi: 0x94},\n\t{value: 0x1633, lo: 0x95, hi: 0x95},\n\t// Block 0x52, offset 0x1f7\n\t{value: 0x0004, lo: 0x09},\n\t{value: 0x0001, lo: 0x80, hi: 0x80},\n\t{value: 0x812c, lo: 0xaa, hi: 0xaa},\n\t{value: 0x8131, lo: 0xab, hi: 0xab},\n\t{value: 0x8133, lo: 0xac, hi: 0xac},\n\t{value: 0x812e, lo: 0xad, hi: 0xad},\n\t{value: 0x812f, lo: 0xae, hi: 0xae},\n\t{value: 0x812f, lo: 0xaf, hi: 0xaf},\n\t{value: 0x04b3, lo: 0xb6, hi: 0xb6},\n\t{value: 0x0887, lo: 0xb8, hi: 0xba},\n\t// Block 0x53, offset 0x201\n\t{value: 0x0006, lo: 0x09},\n\t{value: 0x0313, lo: 0xb1, hi: 0xb1},\n\t{value: 0x0317, lo: 0xb2, hi: 0xb2},\n\t{value: 0x4a3b, lo: 0xb3, hi: 0xb3},\n\t{value: 0x031b, lo: 0xb4, hi: 0xb4},\n\t{value: 0x4a41, lo: 0xb5, hi: 0xb6},\n\t{value: 0x031f, lo: 0xb7, hi: 0xb7},\n\t{value: 0x0323, lo: 0xb8, hi: 0xb8},\n\t{value: 0x0327, lo: 0xb9, hi: 0xb9},\n\t{value: 0x4a4d, lo: 0xba, hi: 0xbf},\n\t// Block 0x54, offset 0x20b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xaf, hi: 0xaf},\n\t{value: 0x8132, lo: 0xb4, hi: 0xbd},\n\t// Block 0x55, offset 0x20e\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0x020f, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0212, lo: 0x9d, hi: 0x9d},\n\t{value: 0x8132, lo: 0x9e, hi: 0x9f},\n\t// Block 0x56, offset 0x212\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb1},\n\t// Block 0x57, offset 0x214\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x163b, lo: 0xb0, hi: 0xb0},\n\t// Block 0x58, offset 0x216\n\t{value: 0x000c, lo: 0x01},\n\t{value: 0x00d7, lo: 0xb8, hi: 0xb9},\n\t// Block 0x59, offset 0x218\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t// Block 0x5a, offset 0x21a\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x84, hi: 0x84},\n\t{value: 0x8132, lo: 0xa0, hi: 0xb1},\n\t// Block 0x5b, offset 0x21d\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xab, hi: 0xad},\n\t// Block 0x5c, offset 0x21f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x93, hi: 0x93},\n\t// Block 0x5d, offset 0x221\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0xb3, hi: 0xb3},\n\t// Block 0x5e, offset 0x223\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t// Block 0x5f, offset 0x225\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb0},\n\t{value: 0x8132, lo: 0xb2, hi: 0xb3},\n\t{value: 0x812d, lo: 0xb4, hi: 0xb4},\n\t{value: 0x8132, lo: 0xb7, hi: 0xb8},\n\t{value: 0x8132, lo: 0xbe, hi: 0xbf},\n\t// Block 0x60, offset 0x22b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x81, hi: 0x81},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t// Block 0x61, offset 0x22e\n\t{value: 0x0008, lo: 0x03},\n\t{value: 0x1637, lo: 0x9c, hi: 0x9d},\n\t{value: 0x0125, lo: 0x9e, hi: 0x9e},\n\t{value: 0x1643, lo: 0x9f, hi: 0x9f},\n\t// Block 0x62, offset 0x232\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xad, hi: 0xad},\n\t// Block 0x63, offset 0x234\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0xe500, lo: 0x80, hi: 0x80},\n\t{value: 0xc600, lo: 0x81, hi: 0x9b},\n\t{value: 0xe500, lo: 0x9c, hi: 0x9c},\n\t{value: 0xc600, lo: 0x9d, hi: 0xb7},\n\t{value: 0xe500, lo: 0xb8, hi: 0xb8},\n\t{value: 0xc600, lo: 0xb9, hi: 0xbf},\n\t// Block 0x64, offset 0x23b\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x93},\n\t{value: 0xe500, lo: 0x94, hi: 0x94},\n\t{value: 0xc600, lo: 0x95, hi: 0xaf},\n\t{value: 0xe500, lo: 0xb0, hi: 0xb0},\n\t{value: 0xc600, lo: 0xb1, hi: 0xbf},\n\t// Block 0x65, offset 0x241\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8b},\n\t{value: 0xe500, lo: 0x8c, hi: 0x8c},\n\t{value: 0xc600, lo: 0x8d, hi: 0xa7},\n\t{value: 0xe500, lo: 0xa8, hi: 0xa8},\n\t{value: 0xc600, lo: 0xa9, hi: 0xbf},\n\t// Block 0x66, offset 0x247\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xc600, lo: 0x80, hi: 0x83},\n\t{value: 0xe500, lo: 0x84, hi: 0x84},\n\t{value: 0xc600, lo: 0x85, hi: 0x9f},\n\t{value: 0xe500, lo: 0xa0, hi: 0xa0},\n\t{value: 0xc600, lo: 0xa1, hi: 0xbb},\n\t{value: 0xe500, lo: 0xbc, hi: 0xbc},\n\t{value: 0xc600, lo: 0xbd, hi: 0xbf},\n\t// Block 0x67, offset 0x24f\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x97},\n\t{value: 0xe500, lo: 0x98, hi: 0x98},\n\t{value: 0xc600, lo: 0x99, hi: 0xb3},\n\t{value: 0xe500, lo: 0xb4, hi: 0xb4},\n\t{value: 0xc600, lo: 0xb5, hi: 0xbf},\n\t// Block 0x68, offset 0x255\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x8f},\n\t{value: 0xe500, lo: 0x90, hi: 0x90},\n\t{value: 0xc600, lo: 0x91, hi: 0xab},\n\t{value: 0xe500, lo: 0xac, hi: 0xac},\n\t{value: 0xc600, lo: 0xad, hi: 0xbf},\n\t// Block 0x69, offset 0x25b\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t{value: 0xe500, lo: 0xa4, hi: 0xa4},\n\t{value: 0xc600, lo: 0xa5, hi: 0xbf},\n\t// Block 0x6a, offset 0x261\n\t{value: 0x0000, lo: 0x03},\n\t{value: 0xc600, lo: 0x80, hi: 0x87},\n\t{value: 0xe500, lo: 0x88, hi: 0x88},\n\t{value: 0xc600, lo: 0x89, hi: 0xa3},\n\t// Block 0x6b, offset 0x265\n\t{value: 0x0002, lo: 0x01},\n\t{value: 0x0003, lo: 0x81, hi: 0xbf},\n\t// Block 0x6c, offset 0x267\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xbd, hi: 0xbd},\n\t// Block 0x6d, offset 0x269\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0xa0, hi: 0xa0},\n\t// Block 0x6e, offset 0x26b\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb6, hi: 0xba},\n\t// Block 0x6f, offset 0x26d\n\t{value: 0x002c, lo: 0x05},\n\t{value: 0x812d, lo: 0x8d, hi: 0x8d},\n\t{value: 0x8132, lo: 0x8f, hi: 0x8f},\n\t{value: 0x8132, lo: 0xb8, hi: 0xb8},\n\t{value: 0x8101, lo: 0xb9, hi: 0xba},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x70, offset 0x273\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0xa5, hi: 0xa5},\n\t{value: 0x812d, lo: 0xa6, hi: 0xa6},\n\t// Block 0x71, offset 0x276\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x86, hi: 0x86},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x72, offset 0x279\n\t{value: 0x17fe, lo: 0x07},\n\t{value: 0xa000, lo: 0x99, hi: 0x99},\n\t{value: 0x4238, lo: 0x9a, hi: 0x9a},\n\t{value: 0xa000, lo: 0x9b, hi: 0x9b},\n\t{value: 0x4242, lo: 0x9c, hi: 0x9c},\n\t{value: 0xa000, lo: 0xa5, hi: 0xa5},\n\t{value: 0x424c, lo: 0xab, hi: 0xab},\n\t{value: 0x8104, lo: 0xb9, hi: 0xba},\n\t// Block 0x73, offset 0x281\n\t{value: 0x0000, lo: 0x06},\n\t{value: 0x8132, lo: 0x80, hi: 0x82},\n\t{value: 0x9900, lo: 0xa7, hi: 0xa7},\n\t{value: 0x2d7e, lo: 0xae, hi: 0xae},\n\t{value: 0x2d88, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb1, hi: 0xb2},\n\t{value: 0x8104, lo: 0xb3, hi: 0xb4},\n\t// Block 0x74, offset 0x288\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x80, hi: 0x80},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x75, offset 0x28b\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb5, hi: 0xb5},\n\t{value: 0x8102, lo: 0xb6, hi: 0xb6},\n\t// Block 0x76, offset 0x28e\n\t{value: 0x0002, lo: 0x01},\n\t{value: 0x8102, lo: 0xa9, hi: 0xaa},\n\t// Block 0x77, offset 0x290\n\t{value: 0x0000, lo: 0x07},\n\t{value: 0xa000, lo: 0x87, hi: 0x87},\n\t{value: 0x2d92, lo: 0x8b, hi: 0x8b},\n\t{value: 0x2d9c, lo: 0x8c, hi: 0x8c},\n\t{value: 0x8104, lo: 0x8d, hi: 0x8d},\n\t{value: 0x9900, lo: 0x97, hi: 0x97},\n\t{value: 0x8132, lo: 0xa6, hi: 0xac},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb4},\n\t// Block 0x78, offset 0x298\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x86, hi: 0x86},\n\t// Block 0x79, offset 0x29b\n\t{value: 0x6b5a, lo: 0x06},\n\t{value: 0x9900, lo: 0xb0, hi: 0xb0},\n\t{value: 0xa000, lo: 0xb9, hi: 0xb9},\n\t{value: 0x9900, lo: 0xba, hi: 0xba},\n\t{value: 0x2db0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x2da6, lo: 0xbc, hi: 0xbd},\n\t{value: 0x2dba, lo: 0xbe, hi: 0xbe},\n\t// Block 0x7a, offset 0x2a2\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0x82, hi: 0x82},\n\t{value: 0x8102, lo: 0x83, hi: 0x83},\n\t// Block 0x7b, offset 0x2a5\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x9900, lo: 0xaf, hi: 0xaf},\n\t{value: 0xa000, lo: 0xb8, hi: 0xb9},\n\t{value: 0x2dc4, lo: 0xba, hi: 0xba},\n\t{value: 0x2dce, lo: 0xbb, hi: 0xbb},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x7c, offset 0x2ab\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8102, lo: 0x80, hi: 0x80},\n\t// Block 0x7d, offset 0x2ad\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xbf, hi: 0xbf},\n\t// Block 0x7e, offset 0x2af\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8104, lo: 0xb6, hi: 0xb6},\n\t{value: 0x8102, lo: 0xb7, hi: 0xb7},\n\t// Block 0x7f, offset 0x2b2\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8104, lo: 0xab, hi: 0xab},\n\t// Block 0x80, offset 0x2b4\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0xb0, hi: 0xb4},\n\t// Block 0x81, offset 0x2b6\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0xb0, hi: 0xb6},\n\t// Block 0x82, offset 0x2b8\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8101, lo: 0x9e, hi: 0x9e},\n\t// Block 0x83, offset 0x2ba\n\t{value: 0x0000, lo: 0x0c},\n\t{value: 0x45cc, lo: 0x9e, hi: 0x9e},\n\t{value: 0x45d6, lo: 0x9f, hi: 0x9f},\n\t{value: 0x460a, lo: 0xa0, hi: 0xa0},\n\t{value: 0x4618, lo: 0xa1, hi: 0xa1},\n\t{value: 0x4626, lo: 0xa2, hi: 0xa2},\n\t{value: 0x4634, lo: 0xa3, hi: 0xa3},\n\t{value: 0x4642, lo: 0xa4, hi: 0xa4},\n\t{value: 0x812b, lo: 0xa5, hi: 0xa6},\n\t{value: 0x8101, lo: 0xa7, hi: 0xa9},\n\t{value: 0x8130, lo: 0xad, hi: 0xad},\n\t{value: 0x812b, lo: 0xae, hi: 0xb2},\n\t{value: 0x812d, lo: 0xbb, hi: 0xbf},\n\t// Block 0x84, offset 0x2c7\n\t{value: 0x0000, lo: 0x09},\n\t{value: 0x812d, lo: 0x80, hi: 0x82},\n\t{value: 0x8132, lo: 0x85, hi: 0x89},\n\t{value: 0x812d, lo: 0x8a, hi: 0x8b},\n\t{value: 0x8132, lo: 0xaa, hi: 0xad},\n\t{value: 0x45e0, lo: 0xbb, hi: 0xbb},\n\t{value: 0x45ea, lo: 0xbc, hi: 0xbc},\n\t{value: 0x4650, lo: 0xbd, hi: 0xbd},\n\t{value: 0x466c, lo: 0xbe, hi: 0xbe},\n\t{value: 0x465e, lo: 0xbf, hi: 0xbf},\n\t// Block 0x85, offset 0x2d1\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x467a, lo: 0x80, hi: 0x80},\n\t// Block 0x86, offset 0x2d3\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x8132, lo: 0x82, hi: 0x84},\n\t// Block 0x87, offset 0x2d5\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x0043, lo: 0x80, hi: 0x99},\n\t{value: 0x0083, lo: 0x9a, hi: 0xb3},\n\t{value: 0x0043, lo: 0xb4, hi: 0xbf},\n\t// Block 0x88, offset 0x2d9\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x005b, lo: 0x80, hi: 0x8d},\n\t{value: 0x0083, lo: 0x8e, hi: 0x94},\n\t{value: 0x0093, lo: 0x96, hi: 0xa7},\n\t{value: 0x0043, lo: 0xa8, hi: 0xbf},\n\t// Block 0x89, offset 0x2de\n\t{value: 0x0002, lo: 0x0b},\n\t{value: 0x0073, lo: 0x80, hi: 0x81},\n\t{value: 0x0083, lo: 0x82, hi: 0x9b},\n\t{value: 0x0043, lo: 0x9c, hi: 0x9c},\n\t{value: 0x0047, lo: 0x9e, hi: 0x9f},\n\t{value: 0x004f, lo: 0xa2, hi: 0xa2},\n\t{value: 0x0055, lo: 0xa5, hi: 0xa6},\n\t{value: 0x005d, lo: 0xa9, hi: 0xac},\n\t{value: 0x0067, lo: 0xae, hi: 0xb5},\n\t{value: 0x0083, lo: 0xb6, hi: 0xb9},\n\t{value: 0x008d, lo: 0xbb, hi: 0xbb},\n\t{value: 0x0091, lo: 0xbd, hi: 0xbf},\n\t// Block 0x8a, offset 0x2ea\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x0097, lo: 0x80, hi: 0x83},\n\t{value: 0x00a1, lo: 0x85, hi: 0x8f},\n\t{value: 0x0043, lo: 0x90, hi: 0xa9},\n\t{value: 0x0083, lo: 0xaa, hi: 0xbf},\n\t// Block 0x8b, offset 0x2ef\n\t{value: 0x0002, lo: 0x08},\n\t{value: 0x00af, lo: 0x80, hi: 0x83},\n\t{value: 0x0043, lo: 0x84, hi: 0x85},\n\t{value: 0x0049, lo: 0x87, hi: 0x8a},\n\t{value: 0x0055, lo: 0x8d, hi: 0x94},\n\t{value: 0x0067, lo: 0x96, hi: 0x9c},\n\t{value: 0x0083, lo: 0x9e, hi: 0xb7},\n\t{value: 0x0043, lo: 0xb8, hi: 0xb9},\n\t{value: 0x0049, lo: 0xbb, hi: 0xbe},\n\t// Block 0x8c, offset 0x2f8\n\t{value: 0x0002, lo: 0x05},\n\t{value: 0x0053, lo: 0x80, hi: 0x84},\n\t{value: 0x005f, lo: 0x86, hi: 0x86},\n\t{value: 0x0067, lo: 0x8a, hi: 0x90},\n\t{value: 0x0083, lo: 0x92, hi: 0xab},\n\t{value: 0x0043, lo: 0xac, hi: 0xbf},\n\t// Block 0x8d, offset 0x2fe\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x006b, lo: 0x80, hi: 0x85},\n\t{value: 0x0083, lo: 0x86, hi: 0x9f},\n\t{value: 0x0043, lo: 0xa0, hi: 0xb9},\n\t{value: 0x0083, lo: 0xba, hi: 0xbf},\n\t// Block 0x8e, offset 0x303\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x008f, lo: 0x80, hi: 0x93},\n\t{value: 0x0043, lo: 0x94, hi: 0xad},\n\t{value: 0x0083, lo: 0xae, hi: 0xbf},\n\t// Block 0x8f, offset 0x307\n\t{value: 0x0002, lo: 0x04},\n\t{value: 0x00a7, lo: 0x80, hi: 0x87},\n\t{value: 0x0043, lo: 0x88, hi: 0xa1},\n\t{value: 0x0083, lo: 0xa2, hi: 0xbb},\n\t{value: 0x0043, lo: 0xbc, hi: 0xbf},\n\t// Block 0x90, offset 0x30c\n\t{value: 0x0002, lo: 0x03},\n\t{value: 0x004b, lo: 0x80, hi: 0x95},\n\t{value: 0x0083, lo: 0x96, hi: 0xaf},\n\t{value: 0x0043, lo: 0xb0, hi: 0xbf},\n\t// Block 0x91, offset 0x310\n\t{value: 0x0003, lo: 0x0f},\n\t{value: 0x01b8, lo: 0x80, hi: 0x80},\n\t{value: 0x045f, lo: 0x81, hi: 0x81},\n\t{value: 0x01bb, lo: 0x82, hi: 0x9a},\n\t{value: 0x045b, lo: 0x9b, hi: 0x9b},\n\t{value: 0x01c7, lo: 0x9c, hi: 0x9c},\n\t{value: 0x01d0, lo: 0x9d, hi: 0x9d},\n\t{value: 0x01d6, lo: 0x9e, hi: 0x9e},\n\t{value: 0x01fa, lo: 0x9f, hi: 0x9f},\n\t{value: 0x01eb, lo: 0xa0, hi: 0xa0},\n\t{value: 0x01e8, lo: 0xa1, hi: 0xa1},\n\t{value: 0x0173, lo: 0xa2, hi: 0xb2},\n\t{value: 0x0188, lo: 0xb3, hi: 0xb3},\n\t{value: 0x01a6, lo: 0xb4, hi: 0xba},\n\t{value: 0x045f, lo: 0xbb, hi: 0xbb},\n\t{value: 0x01bb, lo: 0xbc, hi: 0xbf},\n\t// Block 0x92, offset 0x320\n\t{value: 0x0003, lo: 0x0d},\n\t{value: 0x01c7, lo: 0x80, hi: 0x94},\n\t{value: 0x045b, lo: 0x95, hi: 0x95},\n\t{value: 0x01c7, lo: 0x96, hi: 0x96},\n\t{value: 0x01d0, lo: 0x97, hi: 0x97},\n\t{value: 0x01d6, lo: 0x98, hi: 0x98},\n\t{value: 0x01fa, lo: 0x99, hi: 0x99},\n\t{value: 0x01eb, lo: 0x9a, hi: 0x9a},\n\t{value: 0x01e8, lo: 0x9b, hi: 0x9b},\n\t{value: 0x0173, lo: 0x9c, hi: 0xac},\n\t{value: 0x0188, lo: 0xad, hi: 0xad},\n\t{value: 0x01a6, lo: 0xae, hi: 0xb4},\n\t{value: 0x045f, lo: 0xb5, hi: 0xb5},\n\t{value: 0x01bb, lo: 0xb6, hi: 0xbf},\n\t// Block 0x93, offset 0x32e\n\t{value: 0x0003, lo: 0x0d},\n\t{value: 0x01d9, lo: 0x80, hi: 0x8e},\n\t{value: 0x045b, lo: 0x8f, hi: 0x8f},\n\t{value: 0x01c7, lo: 0x90, hi: 0x90},\n\t{value: 0x01d0, lo: 0x91, hi: 0x91},\n\t{value: 0x01d6, lo: 0x92, hi: 0x92},\n\t{value: 0x01fa, lo: 0x93, hi: 0x93},\n\t{value: 0x01eb, lo: 0x94, hi: 0x94},\n\t{value: 0x01e8, lo: 0x95, hi: 0x95},\n\t{value: 0x0173, lo: 0x96, hi: 0xa6},\n\t{value: 0x0188, lo: 0xa7, hi: 0xa7},\n\t{value: 0x01a6, lo: 0xa8, hi: 0xae},\n\t{value: 0x045f, lo: 0xaf, hi: 0xaf},\n\t{value: 0x01bb, lo: 0xb0, hi: 0xbf},\n\t// Block 0x94, offset 0x33c\n\t{value: 0x0003, lo: 0x0d},\n\t{value: 0x01eb, lo: 0x80, hi: 0x88},\n\t{value: 0x045b, lo: 0x89, hi: 0x89},\n\t{value: 0x01c7, lo: 0x8a, hi: 0x8a},\n\t{value: 0x01d0, lo: 0x8b, hi: 0x8b},\n\t{value: 0x01d6, lo: 0x8c, hi: 0x8c},\n\t{value: 0x01fa, lo: 0x8d, hi: 0x8d},\n\t{value: 0x01eb, lo: 0x8e, hi: 0x8e},\n\t{value: 0x01e8, lo: 0x8f, hi: 0x8f},\n\t{value: 0x0173, lo: 0x90, hi: 0xa0},\n\t{value: 0x0188, lo: 0xa1, hi: 0xa1},\n\t{value: 0x01a6, lo: 0xa2, hi: 0xa8},\n\t{value: 0x045f, lo: 0xa9, hi: 0xa9},\n\t{value: 0x01bb, lo: 0xaa, hi: 0xbf},\n\t// Block 0x95, offset 0x34a\n\t{value: 0x0000, lo: 0x05},\n\t{value: 0x8132, lo: 0x80, hi: 0x86},\n\t{value: 0x8132, lo: 0x88, hi: 0x98},\n\t{value: 0x8132, lo: 0x9b, hi: 0xa1},\n\t{value: 0x8132, lo: 0xa3, hi: 0xa4},\n\t{value: 0x8132, lo: 0xa6, hi: 0xaa},\n\t// Block 0x96, offset 0x350\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x812d, lo: 0x90, hi: 0x96},\n\t// Block 0x97, offset 0x352\n\t{value: 0x0000, lo: 0x02},\n\t{value: 0x8132, lo: 0x84, hi: 0x89},\n\t{value: 0x8102, lo: 0x8a, hi: 0x8a},\n\t// Block 0x98, offset 0x355\n\t{value: 0x0002, lo: 0x09},\n\t{value: 0x0063, lo: 0x80, hi: 0x89},\n\t{value: 0x1951, lo: 0x8a, hi: 0x8a},\n\t{value: 0x1981, lo: 0x8b, hi: 0x8b},\n\t{value: 0x199c, lo: 0x8c, hi: 0x8c},\n\t{value: 0x19a2, lo: 0x8d, hi: 0x8d},\n\t{value: 0x1bc0, lo: 0x8e, hi: 0x8e},\n\t{value: 0x19ae, lo: 0x8f, hi: 0x8f},\n\t{value: 0x197b, lo: 0xaa, hi: 0xaa},\n\t{value: 0x197e, lo: 0xab, hi: 0xab},\n\t// Block 0x99, offset 0x35f\n\t{value: 0x0000, lo: 0x01},\n\t{value: 0x193f, lo: 0x90, hi: 0x90},\n\t// Block 0x9a, offset 0x361\n\t{value: 0x0028, lo: 0x09},\n\t{value: 0x2862, lo: 0x80, hi: 0x80},\n\t{value: 0x2826, lo: 0x81, hi: 0x81},\n\t{value: 0x2830, lo: 0x82, hi: 0x82},\n\t{value: 0x2844, lo: 0x83, hi: 0x84},\n\t{value: 0x284e, lo: 0x85, hi: 0x86},\n\t{value: 0x283a, lo: 0x87, hi: 0x87},\n\t{value: 0x2858, lo: 0x88, hi: 0x88},\n\t{value: 0x0b6f, lo: 0x90, hi: 0x90},\n\t{value: 0x08e7, lo: 0x91, hi: 0x91},\n}\n\n// recompMap: 7520 bytes (entries only)\nvar recompMap = map[uint32]rune{\n\t0x00410300: 0x00C0,\n\t0x00410301: 0x00C1,\n\t0x00410302: 0x00C2,\n\t0x00410303: 0x00C3,\n\t0x00410308: 0x00C4,\n\t0x0041030A: 0x00C5,\n\t0x00430327: 0x00C7,\n\t0x00450300: 0x00C8,\n\t0x00450301: 0x00C9,\n\t0x00450302: 0x00CA,\n\t0x00450308: 0x00CB,\n\t0x00490300: 0x00CC,\n\t0x00490301: 0x00CD,\n\t0x00490302: 0x00CE,\n\t0x00490308: 0x00CF,\n\t0x004E0303: 0x00D1,\n\t0x004F0300: 0x00D2,\n\t0x004F0301: 0x00D3,\n\t0x004F0302: 0x00D4,\n\t0x004F0303: 0x00D5,\n\t0x004F0308: 0x00D6,\n\t0x00550300: 0x00D9,\n\t0x00550301: 0x00DA,\n\t0x00550302: 0x00DB,\n\t0x00550308: 0x00DC,\n\t0x00590301: 0x00DD,\n\t0x00610300: 0x00E0,\n\t0x00610301: 0x00E1,\n\t0x00610302: 0x00E2,\n\t0x00610303: 0x00E3,\n\t0x00610308: 0x00E4,\n\t0x0061030A: 0x00E5,\n\t0x00630327: 0x00E7,\n\t0x00650300: 0x00E8,\n\t0x00650301: 0x00E9,\n\t0x00650302: 0x00EA,\n\t0x00650308: 0x00EB,\n\t0x00690300: 0x00EC,\n\t0x00690301: 0x00ED,\n\t0x00690302: 0x00EE,\n\t0x00690308: 0x00EF,\n\t0x006E0303: 0x00F1,\n\t0x006F0300: 0x00F2,\n\t0x006F0301: 0x00F3,\n\t0x006F0302: 0x00F4,\n\t0x006F0303: 0x00F5,\n\t0x006F0308: 0x00F6,\n\t0x00750300: 0x00F9,\n\t0x00750301: 0x00FA,\n\t0x00750302: 0x00FB,\n\t0x00750308: 0x00FC,\n\t0x00790301: 0x00FD,\n\t0x00790308: 0x00FF,\n\t0x00410304: 0x0100,\n\t0x00610304: 0x0101,\n\t0x00410306: 0x0102,\n\t0x00610306: 0x0103,\n\t0x00410328: 0x0104,\n\t0x00610328: 0x0105,\n\t0x00430301: 0x0106,\n\t0x00630301: 0x0107,\n\t0x00430302: 0x0108,\n\t0x00630302: 0x0109,\n\t0x00430307: 0x010A,\n\t0x00630307: 0x010B,\n\t0x0043030C: 0x010C,\n\t0x0063030C: 0x010D,\n\t0x0044030C: 0x010E,\n\t0x0064030C: 0x010F,\n\t0x00450304: 0x0112,\n\t0x00650304: 0x0113,\n\t0x00450306: 0x0114,\n\t0x00650306: 0x0115,\n\t0x00450307: 0x0116,\n\t0x00650307: 0x0117,\n\t0x00450328: 0x0118,\n\t0x00650328: 0x0119,\n\t0x0045030C: 0x011A,\n\t0x0065030C: 0x011B,\n\t0x00470302: 0x011C,\n\t0x00670302: 0x011D,\n\t0x00470306: 0x011E,\n\t0x00670306: 0x011F,\n\t0x00470307: 0x0120,\n\t0x00670307: 0x0121,\n\t0x00470327: 0x0122,\n\t0x00670327: 0x0123,\n\t0x00480302: 0x0124,\n\t0x00680302: 0x0125,\n\t0x00490303: 0x0128,\n\t0x00690303: 0x0129,\n\t0x00490304: 0x012A,\n\t0x00690304: 0x012B,\n\t0x00490306: 0x012C,\n\t0x00690306: 0x012D,\n\t0x00490328: 0x012E,\n\t0x00690328: 0x012F,\n\t0x00490307: 0x0130,\n\t0x004A0302: 0x0134,\n\t0x006A0302: 0x0135,\n\t0x004B0327: 0x0136,\n\t0x006B0327: 0x0137,\n\t0x004C0301: 0x0139,\n\t0x006C0301: 0x013A,\n\t0x004C0327: 0x013B,\n\t0x006C0327: 0x013C,\n\t0x004C030C: 0x013D,\n\t0x006C030C: 0x013E,\n\t0x004E0301: 0x0143,\n\t0x006E0301: 0x0144,\n\t0x004E0327: 0x0145,\n\t0x006E0327: 0x0146,\n\t0x004E030C: 0x0147,\n\t0x006E030C: 0x0148,\n\t0x004F0304: 0x014C,\n\t0x006F0304: 0x014D,\n\t0x004F0306: 0x014E,\n\t0x006F0306: 0x014F,\n\t0x004F030B: 0x0150,\n\t0x006F030B: 0x0151,\n\t0x00520301: 0x0154,\n\t0x00720301: 0x0155,\n\t0x00520327: 0x0156,\n\t0x00720327: 0x0157,\n\t0x0052030C: 0x0158,\n\t0x0072030C: 0x0159,\n\t0x00530301: 0x015A,\n\t0x00730301: 0x015B,\n\t0x00530302: 0x015C,\n\t0x00730302: 0x015D,\n\t0x00530327: 0x015E,\n\t0x00730327: 0x015F,\n\t0x0053030C: 0x0160,\n\t0x0073030C: 0x0161,\n\t0x00540327: 0x0162,\n\t0x00740327: 0x0163,\n\t0x0054030C: 0x0164,\n\t0x0074030C: 0x0165,\n\t0x00550303: 0x0168,\n\t0x00750303: 0x0169,\n\t0x00550304: 0x016A,\n\t0x00750304: 0x016B,\n\t0x00550306: 0x016C,\n\t0x00750306: 0x016D,\n\t0x0055030A: 0x016E,\n\t0x0075030A: 0x016F,\n\t0x0055030B: 0x0170,\n\t0x0075030B: 0x0171,\n\t0x00550328: 0x0172,\n\t0x00750328: 0x0173,\n\t0x00570302: 0x0174,\n\t0x00770302: 0x0175,\n\t0x00590302: 0x0176,\n\t0x00790302: 0x0177,\n\t0x00590308: 0x0178,\n\t0x005A0301: 0x0179,\n\t0x007A0301: 0x017A,\n\t0x005A0307: 0x017B,\n\t0x007A0307: 0x017C,\n\t0x005A030C: 0x017D,\n\t0x007A030C: 0x017E,\n\t0x004F031B: 0x01A0,\n\t0x006F031B: 0x01A1,\n\t0x0055031B: 0x01AF,\n\t0x0075031B: 0x01B0,\n\t0x0041030C: 0x01CD,\n\t0x0061030C: 0x01CE,\n\t0x0049030C: 0x01CF,\n\t0x0069030C: 0x01D0,\n\t0x004F030C: 0x01D1,\n\t0x006F030C: 0x01D2,\n\t0x0055030C: 0x01D3,\n\t0x0075030C: 0x01D4,\n\t0x00DC0304: 0x01D5,\n\t0x00FC0304: 0x01D6,\n\t0x00DC0301: 0x01D7,\n\t0x00FC0301: 0x01D8,\n\t0x00DC030C: 0x01D9,\n\t0x00FC030C: 0x01DA,\n\t0x00DC0300: 0x01DB,\n\t0x00FC0300: 0x01DC,\n\t0x00C40304: 0x01DE,\n\t0x00E40304: 0x01DF,\n\t0x02260304: 0x01E0,\n\t0x02270304: 0x01E1,\n\t0x00C60304: 0x01E2,\n\t0x00E60304: 0x01E3,\n\t0x0047030C: 0x01E6,\n\t0x0067030C: 0x01E7,\n\t0x004B030C: 0x01E8,\n\t0x006B030C: 0x01E9,\n\t0x004F0328: 0x01EA,\n\t0x006F0328: 0x01EB,\n\t0x01EA0304: 0x01EC,\n\t0x01EB0304: 0x01ED,\n\t0x01B7030C: 0x01EE,\n\t0x0292030C: 0x01EF,\n\t0x006A030C: 0x01F0,\n\t0x00470301: 0x01F4,\n\t0x00670301: 0x01F5,\n\t0x004E0300: 0x01F8,\n\t0x006E0300: 0x01F9,\n\t0x00C50301: 0x01FA,\n\t0x00E50301: 0x01FB,\n\t0x00C60301: 0x01FC,\n\t0x00E60301: 0x01FD,\n\t0x00D80301: 0x01FE,\n\t0x00F80301: 0x01FF,\n\t0x0041030F: 0x0200,\n\t0x0061030F: 0x0201,\n\t0x00410311: 0x0202,\n\t0x00610311: 0x0203,\n\t0x0045030F: 0x0204,\n\t0x0065030F: 0x0205,\n\t0x00450311: 0x0206,\n\t0x00650311: 0x0207,\n\t0x0049030F: 0x0208,\n\t0x0069030F: 0x0209,\n\t0x00490311: 0x020A,\n\t0x00690311: 0x020B,\n\t0x004F030F: 0x020C,\n\t0x006F030F: 0x020D,\n\t0x004F0311: 0x020E,\n\t0x006F0311: 0x020F,\n\t0x0052030F: 0x0210,\n\t0x0072030F: 0x0211,\n\t0x00520311: 0x0212,\n\t0x00720311: 0x0213,\n\t0x0055030F: 0x0214,\n\t0x0075030F: 0x0215,\n\t0x00550311: 0x0216,\n\t0x00750311: 0x0217,\n\t0x00530326: 0x0218,\n\t0x00730326: 0x0219,\n\t0x00540326: 0x021A,\n\t0x00740326: 0x021B,\n\t0x0048030C: 0x021E,\n\t0x0068030C: 0x021F,\n\t0x00410307: 0x0226,\n\t0x00610307: 0x0227,\n\t0x00450327: 0x0228,\n\t0x00650327: 0x0229,\n\t0x00D60304: 0x022A,\n\t0x00F60304: 0x022B,\n\t0x00D50304: 0x022C,\n\t0x00F50304: 0x022D,\n\t0x004F0307: 0x022E,\n\t0x006F0307: 0x022F,\n\t0x022E0304: 0x0230,\n\t0x022F0304: 0x0231,\n\t0x00590304: 0x0232,\n\t0x00790304: 0x0233,\n\t0x00A80301: 0x0385,\n\t0x03910301: 0x0386,\n\t0x03950301: 0x0388,\n\t0x03970301: 0x0389,\n\t0x03990301: 0x038A,\n\t0x039F0301: 0x038C,\n\t0x03A50301: 0x038E,\n\t0x03A90301: 0x038F,\n\t0x03CA0301: 0x0390,\n\t0x03990308: 0x03AA,\n\t0x03A50308: 0x03AB,\n\t0x03B10301: 0x03AC,\n\t0x03B50301: 0x03AD,\n\t0x03B70301: 0x03AE,\n\t0x03B90301: 0x03AF,\n\t0x03CB0301: 0x03B0,\n\t0x03B90308: 0x03CA,\n\t0x03C50308: 0x03CB,\n\t0x03BF0301: 0x03CC,\n\t0x03C50301: 0x03CD,\n\t0x03C90301: 0x03CE,\n\t0x03D20301: 0x03D3,\n\t0x03D20308: 0x03D4,\n\t0x04150300: 0x0400,\n\t0x04150308: 0x0401,\n\t0x04130301: 0x0403,\n\t0x04060308: 0x0407,\n\t0x041A0301: 0x040C,\n\t0x04180300: 0x040D,\n\t0x04230306: 0x040E,\n\t0x04180306: 0x0419,\n\t0x04380306: 0x0439,\n\t0x04350300: 0x0450,\n\t0x04350308: 0x0451,\n\t0x04330301: 0x0453,\n\t0x04560308: 0x0457,\n\t0x043A0301: 0x045C,\n\t0x04380300: 0x045D,\n\t0x04430306: 0x045E,\n\t0x0474030F: 0x0476,\n\t0x0475030F: 0x0477,\n\t0x04160306: 0x04C1,\n\t0x04360306: 0x04C2,\n\t0x04100306: 0x04D0,\n\t0x04300306: 0x04D1,\n\t0x04100308: 0x04D2,\n\t0x04300308: 0x04D3,\n\t0x04150306: 0x04D6,\n\t0x04350306: 0x04D7,\n\t0x04D80308: 0x04DA,\n\t0x04D90308: 0x04DB,\n\t0x04160308: 0x04DC,\n\t0x04360308: 0x04DD,\n\t0x04170308: 0x04DE,\n\t0x04370308: 0x04DF,\n\t0x04180304: 0x04E2,\n\t0x04380304: 0x04E3,\n\t0x04180308: 0x04E4,\n\t0x04380308: 0x04E5,\n\t0x041E0308: 0x04E6,\n\t0x043E0308: 0x04E7,\n\t0x04E80308: 0x04EA,\n\t0x04E90308: 0x04EB,\n\t0x042D0308: 0x04EC,\n\t0x044D0308: 0x04ED,\n\t0x04230304: 0x04EE,\n\t0x04430304: 0x04EF,\n\t0x04230308: 0x04F0,\n\t0x04430308: 0x04F1,\n\t0x0423030B: 0x04F2,\n\t0x0443030B: 0x04F3,\n\t0x04270308: 0x04F4,\n\t0x04470308: 0x04F5,\n\t0x042B0308: 0x04F8,\n\t0x044B0308: 0x04F9,\n\t0x06270653: 0x0622,\n\t0x06270654: 0x0623,\n\t0x06480654: 0x0624,\n\t0x06270655: 0x0625,\n\t0x064A0654: 0x0626,\n\t0x06D50654: 0x06C0,\n\t0x06C10654: 0x06C2,\n\t0x06D20654: 0x06D3,\n\t0x0928093C: 0x0929,\n\t0x0930093C: 0x0931,\n\t0x0933093C: 0x0934,\n\t0x09C709BE: 0x09CB,\n\t0x09C709D7: 0x09CC,\n\t0x0B470B56: 0x0B48,\n\t0x0B470B3E: 0x0B4B,\n\t0x0B470B57: 0x0B4C,\n\t0x0B920BD7: 0x0B94,\n\t0x0BC60BBE: 0x0BCA,\n\t0x0BC70BBE: 0x0BCB,\n\t0x0BC60BD7: 0x0BCC,\n\t0x0C460C56: 0x0C48,\n\t0x0CBF0CD5: 0x0CC0,\n\t0x0CC60CD5: 0x0CC7,\n\t0x0CC60CD6: 0x0CC8,\n\t0x0CC60CC2: 0x0CCA,\n\t0x0CCA0CD5: 0x0CCB,\n\t0x0D460D3E: 0x0D4A,\n\t0x0D470D3E: 0x0D4B,\n\t0x0D460D57: 0x0D4C,\n\t0x0DD90DCA: 0x0DDA,\n\t0x0DD90DCF: 0x0DDC,\n\t0x0DDC0DCA: 0x0DDD,\n\t0x0DD90DDF: 0x0DDE,\n\t0x1025102E: 0x1026,\n\t0x1B051B35: 0x1B06,\n\t0x1B071B35: 0x1B08,\n\t0x1B091B35: 0x1B0A,\n\t0x1B0B1B35: 0x1B0C,\n\t0x1B0D1B35: 0x1B0E,\n\t0x1B111B35: 0x1B12,\n\t0x1B3A1B35: 0x1B3B,\n\t0x1B3C1B35: 0x1B3D,\n\t0x1B3E1B35: 0x1B40,\n\t0x1B3F1B35: 0x1B41,\n\t0x1B421B35: 0x1B43,\n\t0x00410325: 0x1E00,\n\t0x00610325: 0x1E01,\n\t0x00420307: 0x1E02,\n\t0x00620307: 0x1E03,\n\t0x00420323: 0x1E04,\n\t0x00620323: 0x1E05,\n\t0x00420331: 0x1E06,\n\t0x00620331: 0x1E07,\n\t0x00C70301: 0x1E08,\n\t0x00E70301: 0x1E09,\n\t0x00440307: 0x1E0A,\n\t0x00640307: 0x1E0B,\n\t0x00440323: 0x1E0C,\n\t0x00640323: 0x1E0D,\n\t0x00440331: 0x1E0E,\n\t0x00640331: 0x1E0F,\n\t0x00440327: 0x1E10,\n\t0x00640327: 0x1E11,\n\t0x0044032D: 0x1E12,\n\t0x0064032D: 0x1E13,\n\t0x01120300: 0x1E14,\n\t0x01130300: 0x1E15,\n\t0x01120301: 0x1E16,\n\t0x01130301: 0x1E17,\n\t0x0045032D: 0x1E18,\n\t0x0065032D: 0x1E19,\n\t0x00450330: 0x1E1A,\n\t0x00650330: 0x1E1B,\n\t0x02280306: 0x1E1C,\n\t0x02290306: 0x1E1D,\n\t0x00460307: 0x1E1E,\n\t0x00660307: 0x1E1F,\n\t0x00470304: 0x1E20,\n\t0x00670304: 0x1E21,\n\t0x00480307: 0x1E22,\n\t0x00680307: 0x1E23,\n\t0x00480323: 0x1E24,\n\t0x00680323: 0x1E25,\n\t0x00480308: 0x1E26,\n\t0x00680308: 0x1E27,\n\t0x00480327: 0x1E28,\n\t0x00680327: 0x1E29,\n\t0x0048032E: 0x1E2A,\n\t0x0068032E: 0x1E2B,\n\t0x00490330: 0x1E2C,\n\t0x00690330: 0x1E2D,\n\t0x00CF0301: 0x1E2E,\n\t0x00EF0301: 0x1E2F,\n\t0x004B0301: 0x1E30,\n\t0x006B0301: 0x1E31,\n\t0x004B0323: 0x1E32,\n\t0x006B0323: 0x1E33,\n\t0x004B0331: 0x1E34,\n\t0x006B0331: 0x1E35,\n\t0x004C0323: 0x1E36,\n\t0x006C0323: 0x1E37,\n\t0x1E360304: 0x1E38,\n\t0x1E370304: 0x1E39,\n\t0x004C0331: 0x1E3A,\n\t0x006C0331: 0x1E3B,\n\t0x004C032D: 0x1E3C,\n\t0x006C032D: 0x1E3D,\n\t0x004D0301: 0x1E3E,\n\t0x006D0301: 0x1E3F,\n\t0x004D0307: 0x1E40,\n\t0x006D0307: 0x1E41,\n\t0x004D0323: 0x1E42,\n\t0x006D0323: 0x1E43,\n\t0x004E0307: 0x1E44,\n\t0x006E0307: 0x1E45,\n\t0x004E0323: 0x1E46,\n\t0x006E0323: 0x1E47,\n\t0x004E0331: 0x1E48,\n\t0x006E0331: 0x1E49,\n\t0x004E032D: 0x1E4A,\n\t0x006E032D: 0x1E4B,\n\t0x00D50301: 0x1E4C,\n\t0x00F50301: 0x1E4D,\n\t0x00D50308: 0x1E4E,\n\t0x00F50308: 0x1E4F,\n\t0x014C0300: 0x1E50,\n\t0x014D0300: 0x1E51,\n\t0x014C0301: 0x1E52,\n\t0x014D0301: 0x1E53,\n\t0x00500301: 0x1E54,\n\t0x00700301: 0x1E55,\n\t0x00500307: 0x1E56,\n\t0x00700307: 0x1E57,\n\t0x00520307: 0x1E58,\n\t0x00720307: 0x1E59,\n\t0x00520323: 0x1E5A,\n\t0x00720323: 0x1E5B,\n\t0x1E5A0304: 0x1E5C,\n\t0x1E5B0304: 0x1E5D,\n\t0x00520331: 0x1E5E,\n\t0x00720331: 0x1E5F,\n\t0x00530307: 0x1E60,\n\t0x00730307: 0x1E61,\n\t0x00530323: 0x1E62,\n\t0x00730323: 0x1E63,\n\t0x015A0307: 0x1E64,\n\t0x015B0307: 0x1E65,\n\t0x01600307: 0x1E66,\n\t0x01610307: 0x1E67,\n\t0x1E620307: 0x1E68,\n\t0x1E630307: 0x1E69,\n\t0x00540307: 0x1E6A,\n\t0x00740307: 0x1E6B,\n\t0x00540323: 0x1E6C,\n\t0x00740323: 0x1E6D,\n\t0x00540331: 0x1E6E,\n\t0x00740331: 0x1E6F,\n\t0x0054032D: 0x1E70,\n\t0x0074032D: 0x1E71,\n\t0x00550324: 0x1E72,\n\t0x00750324: 0x1E73,\n\t0x00550330: 0x1E74,\n\t0x00750330: 0x1E75,\n\t0x0055032D: 0x1E76,\n\t0x0075032D: 0x1E77,\n\t0x01680301: 0x1E78,\n\t0x01690301: 0x1E79,\n\t0x016A0308: 0x1E7A,\n\t0x016B0308: 0x1E7B,\n\t0x00560303: 0x1E7C,\n\t0x00760303: 0x1E7D,\n\t0x00560323: 0x1E7E,\n\t0x00760323: 0x1E7F,\n\t0x00570300: 0x1E80,\n\t0x00770300: 0x1E81,\n\t0x00570301: 0x1E82,\n\t0x00770301: 0x1E83,\n\t0x00570308: 0x1E84,\n\t0x00770308: 0x1E85,\n\t0x00570307: 0x1E86,\n\t0x00770307: 0x1E87,\n\t0x00570323: 0x1E88,\n\t0x00770323: 0x1E89,\n\t0x00580307: 0x1E8A,\n\t0x00780307: 0x1E8B,\n\t0x00580308: 0x1E8C,\n\t0x00780308: 0x1E8D,\n\t0x00590307: 0x1E8E,\n\t0x00790307: 0x1E8F,\n\t0x005A0302: 0x1E90,\n\t0x007A0302: 0x1E91,\n\t0x005A0323: 0x1E92,\n\t0x007A0323: 0x1E93,\n\t0x005A0331: 0x1E94,\n\t0x007A0331: 0x1E95,\n\t0x00680331: 0x1E96,\n\t0x00740308: 0x1E97,\n\t0x0077030A: 0x1E98,\n\t0x0079030A: 0x1E99,\n\t0x017F0307: 0x1E9B,\n\t0x00410323: 0x1EA0,\n\t0x00610323: 0x1EA1,\n\t0x00410309: 0x1EA2,\n\t0x00610309: 0x1EA3,\n\t0x00C20301: 0x1EA4,\n\t0x00E20301: 0x1EA5,\n\t0x00C20300: 0x1EA6,\n\t0x00E20300: 0x1EA7,\n\t0x00C20309: 0x1EA8,\n\t0x00E20309: 0x1EA9,\n\t0x00C20303: 0x1EAA,\n\t0x00E20303: 0x1EAB,\n\t0x1EA00302: 0x1EAC,\n\t0x1EA10302: 0x1EAD,\n\t0x01020301: 0x1EAE,\n\t0x01030301: 0x1EAF,\n\t0x01020300: 0x1EB0,\n\t0x01030300: 0x1EB1,\n\t0x01020309: 0x1EB2,\n\t0x01030309: 0x1EB3,\n\t0x01020303: 0x1EB4,\n\t0x01030303: 0x1EB5,\n\t0x1EA00306: 0x1EB6,\n\t0x1EA10306: 0x1EB7,\n\t0x00450323: 0x1EB8,\n\t0x00650323: 0x1EB9,\n\t0x00450309: 0x1EBA,\n\t0x00650309: 0x1EBB,\n\t0x00450303: 0x1EBC,\n\t0x00650303: 0x1EBD,\n\t0x00CA0301: 0x1EBE,\n\t0x00EA0301: 0x1EBF,\n\t0x00CA0300: 0x1EC0,\n\t0x00EA0300: 0x1EC1,\n\t0x00CA0309: 0x1EC2,\n\t0x00EA0309: 0x1EC3,\n\t0x00CA0303: 0x1EC4,\n\t0x00EA0303: 0x1EC5,\n\t0x1EB80302: 0x1EC6,\n\t0x1EB90302: 0x1EC7,\n\t0x00490309: 0x1EC8,\n\t0x00690309: 0x1EC9,\n\t0x00490323: 0x1ECA,\n\t0x00690323: 0x1ECB,\n\t0x004F0323: 0x1ECC,\n\t0x006F0323: 0x1ECD,\n\t0x004F0309: 0x1ECE,\n\t0x006F0309: 0x1ECF,\n\t0x00D40301: 0x1ED0,\n\t0x00F40301: 0x1ED1,\n\t0x00D40300: 0x1ED2,\n\t0x00F40300: 0x1ED3,\n\t0x00D40309: 0x1ED4,\n\t0x00F40309: 0x1ED5,\n\t0x00D40303: 0x1ED6,\n\t0x00F40303: 0x1ED7,\n\t0x1ECC0302: 0x1ED8,\n\t0x1ECD0302: 0x1ED9,\n\t0x01A00301: 0x1EDA,\n\t0x01A10301: 0x1EDB,\n\t0x01A00300: 0x1EDC,\n\t0x01A10300: 0x1EDD,\n\t0x01A00309: 0x1EDE,\n\t0x01A10309: 0x1EDF,\n\t0x01A00303: 0x1EE0,\n\t0x01A10303: 0x1EE1,\n\t0x01A00323: 0x1EE2,\n\t0x01A10323: 0x1EE3,\n\t0x00550323: 0x1EE4,\n\t0x00750323: 0x1EE5,\n\t0x00550309: 0x1EE6,\n\t0x00750309: 0x1EE7,\n\t0x01AF0301: 0x1EE8,\n\t0x01B00301: 0x1EE9,\n\t0x01AF0300: 0x1EEA,\n\t0x01B00300: 0x1EEB,\n\t0x01AF0309: 0x1EEC,\n\t0x01B00309: 0x1EED,\n\t0x01AF0303: 0x1EEE,\n\t0x01B00303: 0x1EEF,\n\t0x01AF0323: 0x1EF0,\n\t0x01B00323: 0x1EF1,\n\t0x00590300: 0x1EF2,\n\t0x00790300: 0x1EF3,\n\t0x00590323: 0x1EF4,\n\t0x00790323: 0x1EF5,\n\t0x00590309: 0x1EF6,\n\t0x00790309: 0x1EF7,\n\t0x00590303: 0x1EF8,\n\t0x00790303: 0x1EF9,\n\t0x03B10313: 0x1F00,\n\t0x03B10314: 0x1F01,\n\t0x1F000300: 0x1F02,\n\t0x1F010300: 0x1F03,\n\t0x1F000301: 0x1F04,\n\t0x1F010301: 0x1F05,\n\t0x1F000342: 0x1F06,\n\t0x1F010342: 0x1F07,\n\t0x03910313: 0x1F08,\n\t0x03910314: 0x1F09,\n\t0x1F080300: 0x1F0A,\n\t0x1F090300: 0x1F0B,\n\t0x1F080301: 0x1F0C,\n\t0x1F090301: 0x1F0D,\n\t0x1F080342: 0x1F0E,\n\t0x1F090342: 0x1F0F,\n\t0x03B50313: 0x1F10,\n\t0x03B50314: 0x1F11,\n\t0x1F100300: 0x1F12,\n\t0x1F110300: 0x1F13,\n\t0x1F100301: 0x1F14,\n\t0x1F110301: 0x1F15,\n\t0x03950313: 0x1F18,\n\t0x03950314: 0x1F19,\n\t0x1F180300: 0x1F1A,\n\t0x1F190300: 0x1F1B,\n\t0x1F180301: 0x1F1C,\n\t0x1F190301: 0x1F1D,\n\t0x03B70313: 0x1F20,\n\t0x03B70314: 0x1F21,\n\t0x1F200300: 0x1F22,\n\t0x1F210300: 0x1F23,\n\t0x1F200301: 0x1F24,\n\t0x1F210301: 0x1F25,\n\t0x1F200342: 0x1F26,\n\t0x1F210342: 0x1F27,\n\t0x03970313: 0x1F28,\n\t0x03970314: 0x1F29,\n\t0x1F280300: 0x1F2A,\n\t0x1F290300: 0x1F2B,\n\t0x1F280301: 0x1F2C,\n\t0x1F290301: 0x1F2D,\n\t0x1F280342: 0x1F2E,\n\t0x1F290342: 0x1F2F,\n\t0x03B90313: 0x1F30,\n\t0x03B90314: 0x1F31,\n\t0x1F300300: 0x1F32,\n\t0x1F310300: 0x1F33,\n\t0x1F300301: 0x1F34,\n\t0x1F310301: 0x1F35,\n\t0x1F300342: 0x1F36,\n\t0x1F310342: 0x1F37,\n\t0x03990313: 0x1F38,\n\t0x03990314: 0x1F39,\n\t0x1F380300: 0x1F3A,\n\t0x1F390300: 0x1F3B,\n\t0x1F380301: 0x1F3C,\n\t0x1F390301: 0x1F3D,\n\t0x1F380342: 0x1F3E,\n\t0x1F390342: 0x1F3F,\n\t0x03BF0313: 0x1F40,\n\t0x03BF0314: 0x1F41,\n\t0x1F400300: 0x1F42,\n\t0x1F410300: 0x1F43,\n\t0x1F400301: 0x1F44,\n\t0x1F410301: 0x1F45,\n\t0x039F0313: 0x1F48,\n\t0x039F0314: 0x1F49,\n\t0x1F480300: 0x1F4A,\n\t0x1F490300: 0x1F4B,\n\t0x1F480301: 0x1F4C,\n\t0x1F490301: 0x1F4D,\n\t0x03C50313: 0x1F50,\n\t0x03C50314: 0x1F51,\n\t0x1F500300: 0x1F52,\n\t0x1F510300: 0x1F53,\n\t0x1F500301: 0x1F54,\n\t0x1F510301: 0x1F55,\n\t0x1F500342: 0x1F56,\n\t0x1F510342: 0x1F57,\n\t0x03A50314: 0x1F59,\n\t0x1F590300: 0x1F5B,\n\t0x1F590301: 0x1F5D,\n\t0x1F590342: 0x1F5F,\n\t0x03C90313: 0x1F60,\n\t0x03C90314: 0x1F61,\n\t0x1F600300: 0x1F62,\n\t0x1F610300: 0x1F63,\n\t0x1F600301: 0x1F64,\n\t0x1F610301: 0x1F65,\n\t0x1F600342: 0x1F66,\n\t0x1F610342: 0x1F67,\n\t0x03A90313: 0x1F68,\n\t0x03A90314: 0x1F69,\n\t0x1F680300: 0x1F6A,\n\t0x1F690300: 0x1F6B,\n\t0x1F680301: 0x1F6C,\n\t0x1F690301: 0x1F6D,\n\t0x1F680342: 0x1F6E,\n\t0x1F690342: 0x1F6F,\n\t0x03B10300: 0x1F70,\n\t0x03B50300: 0x1F72,\n\t0x03B70300: 0x1F74,\n\t0x03B90300: 0x1F76,\n\t0x03BF0300: 0x1F78,\n\t0x03C50300: 0x1F7A,\n\t0x03C90300: 0x1F7C,\n\t0x1F000345: 0x1F80,\n\t0x1F010345: 0x1F81,\n\t0x1F020345: 0x1F82,\n\t0x1F030345: 0x1F83,\n\t0x1F040345: 0x1F84,\n\t0x1F050345: 0x1F85,\n\t0x1F060345: 0x1F86,\n\t0x1F070345: 0x1F87,\n\t0x1F080345: 0x1F88,\n\t0x1F090345: 0x1F89,\n\t0x1F0A0345: 0x1F8A,\n\t0x1F0B0345: 0x1F8B,\n\t0x1F0C0345: 0x1F8C,\n\t0x1F0D0345: 0x1F8D,\n\t0x1F0E0345: 0x1F8E,\n\t0x1F0F0345: 0x1F8F,\n\t0x1F200345: 0x1F90,\n\t0x1F210345: 0x1F91,\n\t0x1F220345: 0x1F92,\n\t0x1F230345: 0x1F93,\n\t0x1F240345: 0x1F94,\n\t0x1F250345: 0x1F95,\n\t0x1F260345: 0x1F96,\n\t0x1F270345: 0x1F97,\n\t0x1F280345: 0x1F98,\n\t0x1F290345: 0x1F99,\n\t0x1F2A0345: 0x1F9A,\n\t0x1F2B0345: 0x1F9B,\n\t0x1F2C0345: 0x1F9C,\n\t0x1F2D0345: 0x1F9D,\n\t0x1F2E0345: 0x1F9E,\n\t0x1F2F0345: 0x1F9F,\n\t0x1F600345: 0x1FA0,\n\t0x1F610345: 0x1FA1,\n\t0x1F620345: 0x1FA2,\n\t0x1F630345: 0x1FA3,\n\t0x1F640345: 0x1FA4,\n\t0x1F650345: 0x1FA5,\n\t0x1F660345: 0x1FA6,\n\t0x1F670345: 0x1FA7,\n\t0x1F680345: 0x1FA8,\n\t0x1F690345: 0x1FA9,\n\t0x1F6A0345: 0x1FAA,\n\t0x1F6B0345: 0x1FAB,\n\t0x1F6C0345: 0x1FAC,\n\t0x1F6D0345: 0x1FAD,\n\t0x1F6E0345: 0x1FAE,\n\t0x1F6F0345: 0x1FAF,\n\t0x03B10306: 0x1FB0,\n\t0x03B10304: 0x1FB1,\n\t0x1F700345: 0x1FB2,\n\t0x03B10345: 0x1FB3,\n\t0x03AC0345: 0x1FB4,\n\t0x03B10342: 0x1FB6,\n\t0x1FB60345: 0x1FB7,\n\t0x03910306: 0x1FB8,\n\t0x03910304: 0x1FB9,\n\t0x03910300: 0x1FBA,\n\t0x03910345: 0x1FBC,\n\t0x00A80342: 0x1FC1,\n\t0x1F740345: 0x1FC2,\n\t0x03B70345: 0x1FC3,\n\t0x03AE0345: 0x1FC4,\n\t0x03B70342: 0x1FC6,\n\t0x1FC60345: 0x1FC7,\n\t0x03950300: 0x1FC8,\n\t0x03970300: 0x1FCA,\n\t0x03970345: 0x1FCC,\n\t0x1FBF0300: 0x1FCD,\n\t0x1FBF0301: 0x1FCE,\n\t0x1FBF0342: 0x1FCF,\n\t0x03B90306: 0x1FD0,\n\t0x03B90304: 0x1FD1,\n\t0x03CA0300: 0x1FD2,\n\t0x03B90342: 0x1FD6,\n\t0x03CA0342: 0x1FD7,\n\t0x03990306: 0x1FD8,\n\t0x03990304: 0x1FD9,\n\t0x03990300: 0x1FDA,\n\t0x1FFE0300: 0x1FDD,\n\t0x1FFE0301: 0x1FDE,\n\t0x1FFE0342: 0x1FDF,\n\t0x03C50306: 0x1FE0,\n\t0x03C50304: 0x1FE1,\n\t0x03CB0300: 0x1FE2,\n\t0x03C10313: 0x1FE4,\n\t0x03C10314: 0x1FE5,\n\t0x03C50342: 0x1FE6,\n\t0x03CB0342: 0x1FE7,\n\t0x03A50306: 0x1FE8,\n\t0x03A50304: 0x1FE9,\n\t0x03A50300: 0x1FEA,\n\t0x03A10314: 0x1FEC,\n\t0x00A80300: 0x1FED,\n\t0x1F7C0345: 0x1FF2,\n\t0x03C90345: 0x1FF3,\n\t0x03CE0345: 0x1FF4,\n\t0x03C90342: 0x1FF6,\n\t0x1FF60345: 0x1FF7,\n\t0x039F0300: 0x1FF8,\n\t0x03A90300: 0x1FFA,\n\t0x03A90345: 0x1FFC,\n\t0x21900338: 0x219A,\n\t0x21920338: 0x219B,\n\t0x21940338: 0x21AE,\n\t0x21D00338: 0x21CD,\n\t0x21D40338: 0x21CE,\n\t0x21D20338: 0x21CF,\n\t0x22030338: 0x2204,\n\t0x22080338: 0x2209,\n\t0x220B0338: 0x220C,\n\t0x22230338: 0x2224,\n\t0x22250338: 0x2226,\n\t0x223C0338: 0x2241,\n\t0x22430338: 0x2244,\n\t0x22450338: 0x2247,\n\t0x22480338: 0x2249,\n\t0x003D0338: 0x2260,\n\t0x22610338: 0x2262,\n\t0x224D0338: 0x226D,\n\t0x003C0338: 0x226E,\n\t0x003E0338: 0x226F,\n\t0x22640338: 0x2270,\n\t0x22650338: 0x2271,\n\t0x22720338: 0x2274,\n\t0x22730338: 0x2275,\n\t0x22760338: 0x2278,\n\t0x22770338: 0x2279,\n\t0x227A0338: 0x2280,\n\t0x227B0338: 0x2281,\n\t0x22820338: 0x2284,\n\t0x22830338: 0x2285,\n\t0x22860338: 0x2288,\n\t0x22870338: 0x2289,\n\t0x22A20338: 0x22AC,\n\t0x22A80338: 0x22AD,\n\t0x22A90338: 0x22AE,\n\t0x22AB0338: 0x22AF,\n\t0x227C0338: 0x22E0,\n\t0x227D0338: 0x22E1,\n\t0x22910338: 0x22E2,\n\t0x22920338: 0x22E3,\n\t0x22B20338: 0x22EA,\n\t0x22B30338: 0x22EB,\n\t0x22B40338: 0x22EC,\n\t0x22B50338: 0x22ED,\n\t0x304B3099: 0x304C,\n\t0x304D3099: 0x304E,\n\t0x304F3099: 0x3050,\n\t0x30513099: 0x3052,\n\t0x30533099: 0x3054,\n\t0x30553099: 0x3056,\n\t0x30573099: 0x3058,\n\t0x30593099: 0x305A,\n\t0x305B3099: 0x305C,\n\t0x305D3099: 0x305E,\n\t0x305F3099: 0x3060,\n\t0x30613099: 0x3062,\n\t0x30643099: 0x3065,\n\t0x30663099: 0x3067,\n\t0x30683099: 0x3069,\n\t0x306F3099: 0x3070,\n\t0x306F309A: 0x3071,\n\t0x30723099: 0x3073,\n\t0x3072309A: 0x3074,\n\t0x30753099: 0x3076,\n\t0x3075309A: 0x3077,\n\t0x30783099: 0x3079,\n\t0x3078309A: 0x307A,\n\t0x307B3099: 0x307C,\n\t0x307B309A: 0x307D,\n\t0x30463099: 0x3094,\n\t0x309D3099: 0x309E,\n\t0x30AB3099: 0x30AC,\n\t0x30AD3099: 0x30AE,\n\t0x30AF3099: 0x30B0,\n\t0x30B13099: 0x30B2,\n\t0x30B33099: 0x30B4,\n\t0x30B53099: 0x30B6,\n\t0x30B73099: 0x30B8,\n\t0x30B93099: 0x30BA,\n\t0x30BB3099: 0x30BC,\n\t0x30BD3099: 0x30BE,\n\t0x30BF3099: 0x30C0,\n\t0x30C13099: 0x30C2,\n\t0x30C43099: 0x30C5,\n\t0x30C63099: 0x30C7,\n\t0x30C83099: 0x30C9,\n\t0x30CF3099: 0x30D0,\n\t0x30CF309A: 0x30D1,\n\t0x30D23099: 0x30D3,\n\t0x30D2309A: 0x30D4,\n\t0x30D53099: 0x30D6,\n\t0x30D5309A: 0x30D7,\n\t0x30D83099: 0x30D9,\n\t0x30D8309A: 0x30DA,\n\t0x30DB3099: 0x30DC,\n\t0x30DB309A: 0x30DD,\n\t0x30A63099: 0x30F4,\n\t0x30EF3099: 0x30F7,\n\t0x30F03099: 0x30F8,\n\t0x30F13099: 0x30F9,\n\t0x30F23099: 0x30FA,\n\t0x30FD3099: 0x30FE,\n\t0x109910BA: 0x1109A,\n\t0x109B10BA: 0x1109C,\n\t0x10A510BA: 0x110AB,\n\t0x11311127: 0x1112E,\n\t0x11321127: 0x1112F,\n\t0x1347133E: 0x1134B,\n\t0x13471357: 0x1134C,\n\t0x14B914BA: 0x114BB,\n\t0x14B914B0: 0x114BC,\n\t0x14B914BD: 0x114BE,\n\t0x15B815AF: 0x115BA,\n\t0x15B915AF: 0x115BB,\n}\n\n// Total size of tables: 53KB (54006 bytes)\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/transform.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage norm\n\nimport (\n\t\"unicode/utf8\"\n\n\t\"golang.org/x/text/transform\"\n)\n\n// Reset implements the Reset method of the transform.Transformer interface.\nfunc (Form) Reset() {}\n\n// Transform implements the Transform method of the transform.Transformer\n// interface. It may need to write segments of up to MaxSegmentSize at once.\n// Users should either catch ErrShortDst and allow dst to grow or have dst be at\n// least of size MaxTransformChunkSize to be guaranteed of progress.\nfunc (f Form) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\tn := 0\n\t// Cap the maximum number of src bytes to check.\n\tb := src\n\teof := atEOF\n\tif ns := len(dst); ns < len(b) {\n\t\terr = transform.ErrShortDst\n\t\teof = false\n\t\tb = b[:ns]\n\t}\n\ti, ok := formTable[f].quickSpan(inputBytes(b), n, len(b), eof)\n\tn += copy(dst[n:], b[n:i])\n\tif !ok {\n\t\tnDst, nSrc, err = f.transform(dst[n:], src[n:], atEOF)\n\t\treturn nDst + n, nSrc + n, err\n\t}\n\tif n < len(src) && !atEOF {\n\t\terr = transform.ErrShortSrc\n\t}\n\treturn n, n, err\n}\n\nfunc flushTransform(rb *reorderBuffer) bool {\n\t// Write out (must fully fit in dst, or else it is an ErrShortDst).\n\tif len(rb.out) < rb.nrune*utf8.UTFMax {\n\t\treturn false\n\t}\n\trb.out = rb.out[rb.flushCopy(rb.out):]\n\treturn true\n}\n\nvar errs = []error{nil, transform.ErrShortDst, transform.ErrShortSrc}\n\n// transform implements the transform.Transformer interface. It is only called\n// when quickSpan does not pass for a given string.\nfunc (f Form) transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {\n\t// TODO: get rid of reorderBuffer. See CL 23460044.\n\trb := reorderBuffer{}\n\trb.init(f, src)\n\tfor {\n\t\t// Load segment into reorder buffer.\n\t\trb.setFlusher(dst[nDst:], flushTransform)\n\t\tend := decomposeSegment(&rb, nSrc, atEOF)\n\t\tif end < 0 {\n\t\t\treturn nDst, nSrc, errs[-end]\n\t\t}\n\t\tnDst = len(dst) - len(rb.out)\n\t\tnSrc = end\n\n\t\t// Next quickSpan.\n\t\tend = rb.nsrc\n\t\teof := atEOF\n\t\tif n := nSrc + len(dst) - nDst; n < end {\n\t\t\terr = transform.ErrShortDst\n\t\t\tend = n\n\t\t\teof = false\n\t\t}\n\t\tend, ok := rb.f.quickSpan(rb.src, nSrc, end, eof)\n\t\tn := copy(dst[nDst:], rb.src.bytes[nSrc:end])\n\t\tnSrc += n\n\t\tnDst += n\n\t\tif ok {\n\t\t\tif n < rb.nsrc && !atEOF {\n\t\t\t\terr = transform.ErrShortSrc\n\t\t\t}\n\t\t\treturn nDst, nSrc, err\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/text/unicode/norm/trie.go",
    "content": "// Copyright 2011 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage norm\n\ntype valueRange struct {\n\tvalue  uint16 // header: value:stride\n\tlo, hi byte   // header: lo:n\n}\n\ntype sparseBlocks struct {\n\tvalues []valueRange\n\toffset []uint16\n}\n\nvar nfcSparse = sparseBlocks{\n\tvalues: nfcSparseValues[:],\n\toffset: nfcSparseOffset[:],\n}\n\nvar nfkcSparse = sparseBlocks{\n\tvalues: nfkcSparseValues[:],\n\toffset: nfkcSparseOffset[:],\n}\n\nvar (\n\tnfcData  = newNfcTrie(0)\n\tnfkcData = newNfkcTrie(0)\n)\n\n// lookupValue determines the type of block n and looks up the value for b.\n// For n < t.cutoff, the block is a simple lookup table. Otherwise, the block\n// is a list of ranges with an accompanying value. Given a matching range r,\n// the value for b is by r.value + (b - r.lo) * stride.\nfunc (t *sparseBlocks) lookup(n uint32, b byte) uint16 {\n\toffset := t.offset[n]\n\theader := t.values[offset]\n\tlo := offset + 1\n\thi := lo + uint16(header.lo)\n\tfor lo < hi {\n\t\tm := lo + (hi-lo)/2\n\t\tr := t.values[m]\n\t\tif r.lo <= b && b <= r.hi {\n\t\t\treturn r.value + uint16(b-r.lo)*header.value\n\t\t}\n\t\tif b < r.lo {\n\t\t\thi = m\n\t\t} else {\n\t\t\tlo = m + 1\n\t\t}\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/.gitattributes",
    "content": "# Treat all files in this repo as binary, with no git magic updating\n# line endings. Windows users contributing to Go will need to use a\n# modern version of git and editors capable of LF line endings.\n#\n# We'll prevent accidental CRLF line endings from entering the repo\n# via the git-review gofmt checks.\n#\n# See golang.org/issue/9281\n\n* -text\n"
  },
  {
    "path": "vendor/golang.org/x/tools/.gitignore",
    "content": "# Add no patterns to .gitignore except for files generated by the build.\nlast-change\n"
  },
  {
    "path": "vendor/golang.org/x/tools/AUTHORS",
    "content": "# This source code refers to The Go Authors for copyright purposes.\n# The master list of authors is in the main Go distribution,\n# visible at http://tip.golang.org/AUTHORS.\n"
  },
  {
    "path": "vendor/golang.org/x/tools/CONTRIBUTING.md",
    "content": "# Contributing to Go\n\nGo is an open source project.\n\nIt is the work of hundreds of contributors. We appreciate your help!\n\n\n## Filing issues\n\nWhen [filing an issue](https://golang.org/issue/new), make sure to answer these five questions:\n\n1. What version of Go are you using (`go version`)?\n2. What operating system and processor architecture are you using?\n3. What did you do?\n4. What did you expect to see?\n5. What did you see instead?\n\nGeneral questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker.\nThe gophers there will answer or ask you to file an issue if you've tripped over a bug.\n\n## Contributing code\n\nPlease read the [Contribution Guidelines](https://golang.org/doc/contribute.html)\nbefore sending patches.\n\n**We do not accept GitHub pull requests**\n(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review).\n\nUnless otherwise noted, the Go source files are distributed under\nthe BSD-style license found in the LICENSE file.\n\n"
  },
  {
    "path": "vendor/golang.org/x/tools/CONTRIBUTORS",
    "content": "# This source code was written by the Go contributors.\n# The master list of contributors is in the main Go distribution,\n# visible at http://tip.golang.org/CONTRIBUTORS.\n"
  },
  {
    "path": "vendor/golang.org/x/tools/LICENSE",
    "content": "Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n   * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/golang.org/x/tools/PATENTS",
    "content": "Additional IP Rights Grant (Patents)\n\n\"This implementation\" means the copyrightable works distributed by\nGoogle as part of the Go project.\n\nGoogle hereby grants to You a perpetual, worldwide, non-exclusive,\nno-charge, royalty-free, irrevocable (except as stated in this section)\npatent license to make, have made, use, offer to sell, sell, import,\ntransfer and otherwise run, modify and propagate the contents of this\nimplementation of Go, where such license applies only to those patent\nclaims, both currently owned or controlled by Google and acquired in\nthe future, licensable by Google that are necessarily infringed by this\nimplementation of Go.  This grant does not include claims that would be\ninfringed only as a consequence of further modification of this\nimplementation.  If you or your agent or exclusive licensee institute or\norder or agree to the institution of patent litigation against any\nentity (including a cross-claim or counterclaim in a lawsuit) alleging\nthat this implementation of Go or any code incorporated within this\nimplementation of Go constitutes direct or contributory patent\ninfringement, or inducement of patent infringement, then any patent\nrights granted to you under this License for this implementation of Go\nshall terminate as of the date such litigation is filed.\n"
  },
  {
    "path": "vendor/golang.org/x/tools/README",
    "content": "This subrepository holds the source for various packages and tools that support\nthe Go programming language.\n\nSome of the tools, godoc and vet for example, are included in binary Go distributions.\nOthers, including the Go guru and the test coverage tool, can be fetched with \"go get\".\n\nPackages include a type-checker for Go and an implementation of the\nStatic Single Assignment form (SSA) representation for Go programs.\n\nTo submit changes to this repository, see http://golang.org/doc/contribute.html.\n"
  },
  {
    "path": "vendor/golang.org/x/tools/codereview.cfg",
    "content": "issuerepo: golang/go\n"
  },
  {
    "path": "vendor/golang.org/x/tools/go/ast/astutil/enclosing.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage astutil\n\n// This file defines utilities for working with source positions.\n\nimport (\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/token\"\n\t\"sort\"\n)\n\n// PathEnclosingInterval returns the node that encloses the source\n// interval [start, end), and all its ancestors up to the AST root.\n//\n// The definition of \"enclosing\" used by this function considers\n// additional whitespace abutting a node to be enclosed by it.\n// In this example:\n//\n//              z := x + y // add them\n//                   <-A->\n//                  <----B----->\n//\n// the ast.BinaryExpr(+) node is considered to enclose interval B\n// even though its [Pos()..End()) is actually only interval A.\n// This behaviour makes user interfaces more tolerant of imperfect\n// input.\n//\n// This function treats tokens as nodes, though they are not included\n// in the result. e.g. PathEnclosingInterval(\"+\") returns the\n// enclosing ast.BinaryExpr(\"x + y\").\n//\n// If start==end, the 1-char interval following start is used instead.\n//\n// The 'exact' result is true if the interval contains only path[0]\n// and perhaps some adjacent whitespace.  It is false if the interval\n// overlaps multiple children of path[0], or if it contains only\n// interior whitespace of path[0].\n// In this example:\n//\n//              z := x + y // add them\n//                <--C-->     <---E-->\n//                  ^\n//                  D\n//\n// intervals C, D and E are inexact.  C is contained by the\n// z-assignment statement, because it spans three of its children (:=,\n// x, +).  So too is the 1-char interval D, because it contains only\n// interior whitespace of the assignment.  E is considered interior\n// whitespace of the BlockStmt containing the assignment.\n//\n// Precondition: [start, end) both lie within the same file as root.\n// TODO(adonovan): return (nil, false) in this case and remove precond.\n// Requires FileSet; see loader.tokenFileContainsPos.\n//\n// Postcondition: path is never nil; it always contains at least 'root'.\n//\nfunc PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) {\n\t// fmt.Printf(\"EnclosingInterval %d %d\\n\", start, end) // debugging\n\n\t// Precondition: node.[Pos..End) and adjoining whitespace contain [start, end).\n\tvar visit func(node ast.Node) bool\n\tvisit = func(node ast.Node) bool {\n\t\tpath = append(path, node)\n\n\t\tnodePos := node.Pos()\n\t\tnodeEnd := node.End()\n\n\t\t// fmt.Printf(\"visit(%T, %d, %d)\\n\", node, nodePos, nodeEnd) // debugging\n\n\t\t// Intersect [start, end) with interval of node.\n\t\tif start < nodePos {\n\t\t\tstart = nodePos\n\t\t}\n\t\tif end > nodeEnd {\n\t\t\tend = nodeEnd\n\t\t}\n\n\t\t// Find sole child that contains [start, end).\n\t\tchildren := childrenOf(node)\n\t\tl := len(children)\n\t\tfor i, child := range children {\n\t\t\t// [childPos, childEnd) is unaugmented interval of child.\n\t\t\tchildPos := child.Pos()\n\t\t\tchildEnd := child.End()\n\n\t\t\t// [augPos, augEnd) is whitespace-augmented interval of child.\n\t\t\taugPos := childPos\n\t\t\taugEnd := childEnd\n\t\t\tif i > 0 {\n\t\t\t\taugPos = children[i-1].End() // start of preceding whitespace\n\t\t\t}\n\t\t\tif i < l-1 {\n\t\t\t\tnextChildPos := children[i+1].Pos()\n\t\t\t\t// Does [start, end) lie between child and next child?\n\t\t\t\tif start >= augEnd && end <= nextChildPos {\n\t\t\t\t\treturn false // inexact match\n\t\t\t\t}\n\t\t\t\taugEnd = nextChildPos // end of following whitespace\n\t\t\t}\n\n\t\t\t// fmt.Printf(\"\\tchild %d: [%d..%d)\\tcontains interval [%d..%d)?\\n\",\n\t\t\t// \ti, augPos, augEnd, start, end) // debugging\n\n\t\t\t// Does augmented child strictly contain [start, end)?\n\t\t\tif augPos <= start && end <= augEnd {\n\t\t\t\t_, isToken := child.(tokenNode)\n\t\t\t\treturn isToken || visit(child)\n\t\t\t}\n\n\t\t\t// Does [start, end) overlap multiple children?\n\t\t\t// i.e. left-augmented child contains start\n\t\t\t// but LR-augmented child does not contain end.\n\t\t\tif start < childEnd && end > augEnd {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\t// No single child contained [start, end),\n\t\t// so node is the result.  Is it exact?\n\n\t\t// (It's tempting to put this condition before the\n\t\t// child loop, but it gives the wrong result in the\n\t\t// case where a node (e.g. ExprStmt) and its sole\n\t\t// child have equal intervals.)\n\t\tif start == nodePos && end == nodeEnd {\n\t\t\treturn true // exact match\n\t\t}\n\n\t\treturn false // inexact: overlaps multiple children\n\t}\n\n\tif start > end {\n\t\tstart, end = end, start\n\t}\n\n\tif start < root.End() && end > root.Pos() {\n\t\tif start == end {\n\t\t\tend = start + 1 // empty interval => interval of size 1\n\t\t}\n\t\texact = visit(root)\n\n\t\t// Reverse the path:\n\t\tfor i, l := 0, len(path); i < l/2; i++ {\n\t\t\tpath[i], path[l-1-i] = path[l-1-i], path[i]\n\t\t}\n\t} else {\n\t\t// Selection lies within whitespace preceding the\n\t\t// first (or following the last) declaration in the file.\n\t\t// The result nonetheless always includes the ast.File.\n\t\tpath = append(path, root)\n\t}\n\n\treturn\n}\n\n// tokenNode is a dummy implementation of ast.Node for a single token.\n// They are used transiently by PathEnclosingInterval but never escape\n// this package.\n//\ntype tokenNode struct {\n\tpos token.Pos\n\tend token.Pos\n}\n\nfunc (n tokenNode) Pos() token.Pos {\n\treturn n.pos\n}\n\nfunc (n tokenNode) End() token.Pos {\n\treturn n.end\n}\n\nfunc tok(pos token.Pos, len int) ast.Node {\n\treturn tokenNode{pos, pos + token.Pos(len)}\n}\n\n// childrenOf returns the direct non-nil children of ast.Node n.\n// It may include fake ast.Node implementations for bare tokens.\n// it is not safe to call (e.g.) ast.Walk on such nodes.\n//\nfunc childrenOf(n ast.Node) []ast.Node {\n\tvar children []ast.Node\n\n\t// First add nodes for all true subtrees.\n\tast.Inspect(n, func(node ast.Node) bool {\n\t\tif node == n { // push n\n\t\t\treturn true // recur\n\t\t}\n\t\tif node != nil { // push child\n\t\t\tchildren = append(children, node)\n\t\t}\n\t\treturn false // no recursion\n\t})\n\n\t// Then add fake Nodes for bare tokens.\n\tswitch n := n.(type) {\n\tcase *ast.ArrayType:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lbrack, len(\"[\")),\n\t\t\ttok(n.Elt.End(), len(\"]\")))\n\n\tcase *ast.AssignStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.TokPos, len(n.Tok.String())))\n\n\tcase *ast.BasicLit:\n\t\tchildren = append(children,\n\t\t\ttok(n.ValuePos, len(n.Value)))\n\n\tcase *ast.BinaryExpr:\n\t\tchildren = append(children, tok(n.OpPos, len(n.Op.String())))\n\n\tcase *ast.BlockStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lbrace, len(\"{\")),\n\t\t\ttok(n.Rbrace, len(\"}\")))\n\n\tcase *ast.BranchStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.TokPos, len(n.Tok.String())))\n\n\tcase *ast.CallExpr:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lparen, len(\"(\")),\n\t\t\ttok(n.Rparen, len(\")\")))\n\t\tif n.Ellipsis != 0 {\n\t\t\tchildren = append(children, tok(n.Ellipsis, len(\"...\")))\n\t\t}\n\n\tcase *ast.CaseClause:\n\t\tif n.List == nil {\n\t\t\tchildren = append(children,\n\t\t\t\ttok(n.Case, len(\"default\")))\n\t\t} else {\n\t\t\tchildren = append(children,\n\t\t\t\ttok(n.Case, len(\"case\")))\n\t\t}\n\t\tchildren = append(children, tok(n.Colon, len(\":\")))\n\n\tcase *ast.ChanType:\n\t\tswitch n.Dir {\n\t\tcase ast.RECV:\n\t\t\tchildren = append(children, tok(n.Begin, len(\"<-chan\")))\n\t\tcase ast.SEND:\n\t\t\tchildren = append(children, tok(n.Begin, len(\"chan<-\")))\n\t\tcase ast.RECV | ast.SEND:\n\t\t\tchildren = append(children, tok(n.Begin, len(\"chan\")))\n\t\t}\n\n\tcase *ast.CommClause:\n\t\tif n.Comm == nil {\n\t\t\tchildren = append(children,\n\t\t\t\ttok(n.Case, len(\"default\")))\n\t\t} else {\n\t\t\tchildren = append(children,\n\t\t\t\ttok(n.Case, len(\"case\")))\n\t\t}\n\t\tchildren = append(children, tok(n.Colon, len(\":\")))\n\n\tcase *ast.Comment:\n\t\t// nop\n\n\tcase *ast.CommentGroup:\n\t\t// nop\n\n\tcase *ast.CompositeLit:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lbrace, len(\"{\")),\n\t\t\ttok(n.Rbrace, len(\"{\")))\n\n\tcase *ast.DeclStmt:\n\t\t// nop\n\n\tcase *ast.DeferStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.Defer, len(\"defer\")))\n\n\tcase *ast.Ellipsis:\n\t\tchildren = append(children,\n\t\t\ttok(n.Ellipsis, len(\"...\")))\n\n\tcase *ast.EmptyStmt:\n\t\t// nop\n\n\tcase *ast.ExprStmt:\n\t\t// nop\n\n\tcase *ast.Field:\n\t\t// TODO(adonovan): Field.{Doc,Comment,Tag}?\n\n\tcase *ast.FieldList:\n\t\tchildren = append(children,\n\t\t\ttok(n.Opening, len(\"(\")),\n\t\t\ttok(n.Closing, len(\")\")))\n\n\tcase *ast.File:\n\t\t// TODO test: Doc\n\t\tchildren = append(children,\n\t\t\ttok(n.Package, len(\"package\")))\n\n\tcase *ast.ForStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.For, len(\"for\")))\n\n\tcase *ast.FuncDecl:\n\t\t// TODO(adonovan): FuncDecl.Comment?\n\n\t\t// Uniquely, FuncDecl breaks the invariant that\n\t\t// preorder traversal yields tokens in lexical order:\n\t\t// in fact, FuncDecl.Recv precedes FuncDecl.Type.Func.\n\t\t//\n\t\t// As a workaround, we inline the case for FuncType\n\t\t// here and order things correctly.\n\t\t//\n\t\tchildren = nil // discard ast.Walk(FuncDecl) info subtrees\n\t\tchildren = append(children, tok(n.Type.Func, len(\"func\")))\n\t\tif n.Recv != nil {\n\t\t\tchildren = append(children, n.Recv)\n\t\t}\n\t\tchildren = append(children, n.Name)\n\t\tif n.Type.Params != nil {\n\t\t\tchildren = append(children, n.Type.Params)\n\t\t}\n\t\tif n.Type.Results != nil {\n\t\t\tchildren = append(children, n.Type.Results)\n\t\t}\n\t\tif n.Body != nil {\n\t\t\tchildren = append(children, n.Body)\n\t\t}\n\n\tcase *ast.FuncLit:\n\t\t// nop\n\n\tcase *ast.FuncType:\n\t\tif n.Func != 0 {\n\t\t\tchildren = append(children,\n\t\t\t\ttok(n.Func, len(\"func\")))\n\t\t}\n\n\tcase *ast.GenDecl:\n\t\tchildren = append(children,\n\t\t\ttok(n.TokPos, len(n.Tok.String())))\n\t\tif n.Lparen != 0 {\n\t\t\tchildren = append(children,\n\t\t\t\ttok(n.Lparen, len(\"(\")),\n\t\t\t\ttok(n.Rparen, len(\")\")))\n\t\t}\n\n\tcase *ast.GoStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.Go, len(\"go\")))\n\n\tcase *ast.Ident:\n\t\tchildren = append(children,\n\t\t\ttok(n.NamePos, len(n.Name)))\n\n\tcase *ast.IfStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.If, len(\"if\")))\n\n\tcase *ast.ImportSpec:\n\t\t// TODO(adonovan): ImportSpec.{Doc,EndPos}?\n\n\tcase *ast.IncDecStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.TokPos, len(n.Tok.String())))\n\n\tcase *ast.IndexExpr:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lbrack, len(\"{\")),\n\t\t\ttok(n.Rbrack, len(\"}\")))\n\n\tcase *ast.InterfaceType:\n\t\tchildren = append(children,\n\t\t\ttok(n.Interface, len(\"interface\")))\n\n\tcase *ast.KeyValueExpr:\n\t\tchildren = append(children,\n\t\t\ttok(n.Colon, len(\":\")))\n\n\tcase *ast.LabeledStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.Colon, len(\":\")))\n\n\tcase *ast.MapType:\n\t\tchildren = append(children,\n\t\t\ttok(n.Map, len(\"map\")))\n\n\tcase *ast.ParenExpr:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lparen, len(\"(\")),\n\t\t\ttok(n.Rparen, len(\")\")))\n\n\tcase *ast.RangeStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.For, len(\"for\")),\n\t\t\ttok(n.TokPos, len(n.Tok.String())))\n\n\tcase *ast.ReturnStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.Return, len(\"return\")))\n\n\tcase *ast.SelectStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.Select, len(\"select\")))\n\n\tcase *ast.SelectorExpr:\n\t\t// nop\n\n\tcase *ast.SendStmt:\n\t\tchildren = append(children,\n\t\t\ttok(n.Arrow, len(\"<-\")))\n\n\tcase *ast.SliceExpr:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lbrack, len(\"[\")),\n\t\t\ttok(n.Rbrack, len(\"]\")))\n\n\tcase *ast.StarExpr:\n\t\tchildren = append(children, tok(n.Star, len(\"*\")))\n\n\tcase *ast.StructType:\n\t\tchildren = append(children, tok(n.Struct, len(\"struct\")))\n\n\tcase *ast.SwitchStmt:\n\t\tchildren = append(children, tok(n.Switch, len(\"switch\")))\n\n\tcase *ast.TypeAssertExpr:\n\t\tchildren = append(children,\n\t\t\ttok(n.Lparen-1, len(\".\")),\n\t\t\ttok(n.Lparen, len(\"(\")),\n\t\t\ttok(n.Rparen, len(\")\")))\n\n\tcase *ast.TypeSpec:\n\t\t// TODO(adonovan): TypeSpec.{Doc,Comment}?\n\n\tcase *ast.TypeSwitchStmt:\n\t\tchildren = append(children, tok(n.Switch, len(\"switch\")))\n\n\tcase *ast.UnaryExpr:\n\t\tchildren = append(children, tok(n.OpPos, len(n.Op.String())))\n\n\tcase *ast.ValueSpec:\n\t\t// TODO(adonovan): ValueSpec.{Doc,Comment}?\n\n\tcase *ast.BadDecl, *ast.BadExpr, *ast.BadStmt:\n\t\t// nop\n\t}\n\n\t// TODO(adonovan): opt: merge the logic of ast.Inspect() into\n\t// the switch above so we can make interleaved callbacks for\n\t// both Nodes and Tokens in the right order and avoid the need\n\t// to sort.\n\tsort.Sort(byPos(children))\n\n\treturn children\n}\n\ntype byPos []ast.Node\n\nfunc (sl byPos) Len() int {\n\treturn len(sl)\n}\nfunc (sl byPos) Less(i, j int) bool {\n\treturn sl[i].Pos() < sl[j].Pos()\n}\nfunc (sl byPos) Swap(i, j int) {\n\tsl[i], sl[j] = sl[j], sl[i]\n}\n\n// NodeDescription returns a description of the concrete type of n suitable\n// for a user interface.\n//\n// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident,\n// StarExpr) we could be much more specific given the path to the AST\n// root.  Perhaps we should do that.\n//\nfunc NodeDescription(n ast.Node) string {\n\tswitch n := n.(type) {\n\tcase *ast.ArrayType:\n\t\treturn \"array type\"\n\tcase *ast.AssignStmt:\n\t\treturn \"assignment\"\n\tcase *ast.BadDecl:\n\t\treturn \"bad declaration\"\n\tcase *ast.BadExpr:\n\t\treturn \"bad expression\"\n\tcase *ast.BadStmt:\n\t\treturn \"bad statement\"\n\tcase *ast.BasicLit:\n\t\treturn \"basic literal\"\n\tcase *ast.BinaryExpr:\n\t\treturn fmt.Sprintf(\"binary %s operation\", n.Op)\n\tcase *ast.BlockStmt:\n\t\treturn \"block\"\n\tcase *ast.BranchStmt:\n\t\tswitch n.Tok {\n\t\tcase token.BREAK:\n\t\t\treturn \"break statement\"\n\t\tcase token.CONTINUE:\n\t\t\treturn \"continue statement\"\n\t\tcase token.GOTO:\n\t\t\treturn \"goto statement\"\n\t\tcase token.FALLTHROUGH:\n\t\t\treturn \"fall-through statement\"\n\t\t}\n\tcase *ast.CallExpr:\n\t\tif len(n.Args) == 1 && !n.Ellipsis.IsValid() {\n\t\t\treturn \"function call (or conversion)\"\n\t\t}\n\t\treturn \"function call\"\n\tcase *ast.CaseClause:\n\t\treturn \"case clause\"\n\tcase *ast.ChanType:\n\t\treturn \"channel type\"\n\tcase *ast.CommClause:\n\t\treturn \"communication clause\"\n\tcase *ast.Comment:\n\t\treturn \"comment\"\n\tcase *ast.CommentGroup:\n\t\treturn \"comment group\"\n\tcase *ast.CompositeLit:\n\t\treturn \"composite literal\"\n\tcase *ast.DeclStmt:\n\t\treturn NodeDescription(n.Decl) + \" statement\"\n\tcase *ast.DeferStmt:\n\t\treturn \"defer statement\"\n\tcase *ast.Ellipsis:\n\t\treturn \"ellipsis\"\n\tcase *ast.EmptyStmt:\n\t\treturn \"empty statement\"\n\tcase *ast.ExprStmt:\n\t\treturn \"expression statement\"\n\tcase *ast.Field:\n\t\t// Can be any of these:\n\t\t// struct {x, y int}  -- struct field(s)\n\t\t// struct {T}         -- anon struct field\n\t\t// interface {I}      -- interface embedding\n\t\t// interface {f()}    -- interface method\n\t\t// func (A) func(B) C -- receiver, param(s), result(s)\n\t\treturn \"field/method/parameter\"\n\tcase *ast.FieldList:\n\t\treturn \"field/method/parameter list\"\n\tcase *ast.File:\n\t\treturn \"source file\"\n\tcase *ast.ForStmt:\n\t\treturn \"for loop\"\n\tcase *ast.FuncDecl:\n\t\treturn \"function declaration\"\n\tcase *ast.FuncLit:\n\t\treturn \"function literal\"\n\tcase *ast.FuncType:\n\t\treturn \"function type\"\n\tcase *ast.GenDecl:\n\t\tswitch n.Tok {\n\t\tcase token.IMPORT:\n\t\t\treturn \"import declaration\"\n\t\tcase token.CONST:\n\t\t\treturn \"constant declaration\"\n\t\tcase token.TYPE:\n\t\t\treturn \"type declaration\"\n\t\tcase token.VAR:\n\t\t\treturn \"variable declaration\"\n\t\t}\n\tcase *ast.GoStmt:\n\t\treturn \"go statement\"\n\tcase *ast.Ident:\n\t\treturn \"identifier\"\n\tcase *ast.IfStmt:\n\t\treturn \"if statement\"\n\tcase *ast.ImportSpec:\n\t\treturn \"import specification\"\n\tcase *ast.IncDecStmt:\n\t\tif n.Tok == token.INC {\n\t\t\treturn \"increment statement\"\n\t\t}\n\t\treturn \"decrement statement\"\n\tcase *ast.IndexExpr:\n\t\treturn \"index expression\"\n\tcase *ast.InterfaceType:\n\t\treturn \"interface type\"\n\tcase *ast.KeyValueExpr:\n\t\treturn \"key/value association\"\n\tcase *ast.LabeledStmt:\n\t\treturn \"statement label\"\n\tcase *ast.MapType:\n\t\treturn \"map type\"\n\tcase *ast.Package:\n\t\treturn \"package\"\n\tcase *ast.ParenExpr:\n\t\treturn \"parenthesized \" + NodeDescription(n.X)\n\tcase *ast.RangeStmt:\n\t\treturn \"range loop\"\n\tcase *ast.ReturnStmt:\n\t\treturn \"return statement\"\n\tcase *ast.SelectStmt:\n\t\treturn \"select statement\"\n\tcase *ast.SelectorExpr:\n\t\treturn \"selector\"\n\tcase *ast.SendStmt:\n\t\treturn \"channel send\"\n\tcase *ast.SliceExpr:\n\t\treturn \"slice expression\"\n\tcase *ast.StarExpr:\n\t\treturn \"*-operation\" // load/store expr or pointer type\n\tcase *ast.StructType:\n\t\treturn \"struct type\"\n\tcase *ast.SwitchStmt:\n\t\treturn \"switch statement\"\n\tcase *ast.TypeAssertExpr:\n\t\treturn \"type assertion\"\n\tcase *ast.TypeSpec:\n\t\treturn \"type specification\"\n\tcase *ast.TypeSwitchStmt:\n\t\treturn \"type switch\"\n\tcase *ast.UnaryExpr:\n\t\treturn fmt.Sprintf(\"unary %s operation\", n.Op)\n\tcase *ast.ValueSpec:\n\t\treturn \"value specification\"\n\n\t}\n\tpanic(fmt.Sprintf(\"unexpected node type: %T\", n))\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/go/ast/astutil/imports.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package astutil contains common utilities for working with the Go AST.\npackage astutil // import \"golang.org/x/tools/go/ast/astutil\"\n\nimport (\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/token\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// AddImport adds the import path to the file f, if absent.\nfunc AddImport(fset *token.FileSet, f *ast.File, ipath string) (added bool) {\n\treturn AddNamedImport(fset, f, \"\", ipath)\n}\n\n// AddNamedImport adds the import path to the file f, if absent.\n// If name is not empty, it is used to rename the import.\n//\n// For example, calling\n//\tAddNamedImport(fset, f, \"pathpkg\", \"path\")\n// adds\n//\timport pathpkg \"path\"\nfunc AddNamedImport(fset *token.FileSet, f *ast.File, name, ipath string) (added bool) {\n\tif imports(f, ipath) {\n\t\treturn false\n\t}\n\n\tnewImport := &ast.ImportSpec{\n\t\tPath: &ast.BasicLit{\n\t\t\tKind:  token.STRING,\n\t\t\tValue: strconv.Quote(ipath),\n\t\t},\n\t}\n\tif name != \"\" {\n\t\tnewImport.Name = &ast.Ident{Name: name}\n\t}\n\n\t// Find an import decl to add to.\n\t// The goal is to find an existing import\n\t// whose import path has the longest shared\n\t// prefix with ipath.\n\tvar (\n\t\tbestMatch  = -1         // length of longest shared prefix\n\t\tlastImport = -1         // index in f.Decls of the file's final import decl\n\t\timpDecl    *ast.GenDecl // import decl containing the best match\n\t\timpIndex   = -1         // spec index in impDecl containing the best match\n\t)\n\tfor i, decl := range f.Decls {\n\t\tgen, ok := decl.(*ast.GenDecl)\n\t\tif ok && gen.Tok == token.IMPORT {\n\t\t\tlastImport = i\n\t\t\t// Do not add to import \"C\", to avoid disrupting the\n\t\t\t// association with its doc comment, breaking cgo.\n\t\t\tif declImports(gen, \"C\") {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Match an empty import decl if that's all that is available.\n\t\t\tif len(gen.Specs) == 0 && bestMatch == -1 {\n\t\t\t\timpDecl = gen\n\t\t\t}\n\n\t\t\t// Compute longest shared prefix with imports in this group.\n\t\t\tfor j, spec := range gen.Specs {\n\t\t\t\timpspec := spec.(*ast.ImportSpec)\n\t\t\t\tn := matchLen(importPath(impspec), ipath)\n\t\t\t\tif n > bestMatch {\n\t\t\t\t\tbestMatch = n\n\t\t\t\t\timpDecl = gen\n\t\t\t\t\timpIndex = j\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// If no import decl found, add one after the last import.\n\tif impDecl == nil {\n\t\timpDecl = &ast.GenDecl{\n\t\t\tTok: token.IMPORT,\n\t\t}\n\t\tif lastImport >= 0 {\n\t\t\timpDecl.TokPos = f.Decls[lastImport].End()\n\t\t} else {\n\t\t\t// There are no existing imports.\n\t\t\t// Our new import goes after the package declaration and after\n\t\t\t// the comment, if any, that starts on the same line as the\n\t\t\t// package declaration.\n\t\t\timpDecl.TokPos = f.Package\n\n\t\t\tfile := fset.File(f.Package)\n\t\t\tpkgLine := file.Line(f.Package)\n\t\t\tfor _, c := range f.Comments {\n\t\t\t\tif file.Line(c.Pos()) > pkgLine {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\timpDecl.TokPos = c.End()\n\t\t\t}\n\t\t}\n\t\tf.Decls = append(f.Decls, nil)\n\t\tcopy(f.Decls[lastImport+2:], f.Decls[lastImport+1:])\n\t\tf.Decls[lastImport+1] = impDecl\n\t}\n\n\t// Insert new import at insertAt.\n\tinsertAt := 0\n\tif impIndex >= 0 {\n\t\t// insert after the found import\n\t\tinsertAt = impIndex + 1\n\t}\n\timpDecl.Specs = append(impDecl.Specs, nil)\n\tcopy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:])\n\timpDecl.Specs[insertAt] = newImport\n\tpos := impDecl.Pos()\n\tif insertAt > 0 {\n\t\t// If there is a comment after an existing import, preserve the comment\n\t\t// position by adding the new import after the comment.\n\t\tif spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil {\n\t\t\tpos = spec.Comment.End()\n\t\t} else {\n\t\t\t// Assign same position as the previous import,\n\t\t\t// so that the sorter sees it as being in the same block.\n\t\t\tpos = impDecl.Specs[insertAt-1].Pos()\n\t\t}\n\t}\n\tif newImport.Name != nil {\n\t\tnewImport.Name.NamePos = pos\n\t}\n\tnewImport.Path.ValuePos = pos\n\tnewImport.EndPos = pos\n\n\t// Clean up parens. impDecl contains at least one spec.\n\tif len(impDecl.Specs) == 1 {\n\t\t// Remove unneeded parens.\n\t\timpDecl.Lparen = token.NoPos\n\t} else if !impDecl.Lparen.IsValid() {\n\t\t// impDecl needs parens added.\n\t\timpDecl.Lparen = impDecl.Specs[0].Pos()\n\t}\n\n\tf.Imports = append(f.Imports, newImport)\n\n\tif len(f.Decls) <= 1 {\n\t\treturn true\n\t}\n\n\t// Merge all the import declarations into the first one.\n\tvar first *ast.GenDecl\n\tfor i := 0; i < len(f.Decls); i++ {\n\t\tdecl := f.Decls[i]\n\t\tgen, ok := decl.(*ast.GenDecl)\n\t\tif !ok || gen.Tok != token.IMPORT || declImports(gen, \"C\") {\n\t\t\tcontinue\n\t\t}\n\t\tif first == nil {\n\t\t\tfirst = gen\n\t\t\tcontinue // Don't touch the first one.\n\t\t}\n\t\t// We now know there is more than one package in this import\n\t\t// declaration. Ensure that it ends up parenthesized.\n\t\tfirst.Lparen = first.Pos()\n\t\t// Move the imports of the other import declaration to the first one.\n\t\tfor _, spec := range gen.Specs {\n\t\t\tspec.(*ast.ImportSpec).Path.ValuePos = first.Pos()\n\t\t\tfirst.Specs = append(first.Specs, spec)\n\t\t}\n\t\tf.Decls = append(f.Decls[:i], f.Decls[i+1:]...)\n\t\ti--\n\t}\n\n\treturn true\n}\n\n// DeleteImport deletes the import path from the file f, if present.\nfunc DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) {\n\treturn DeleteNamedImport(fset, f, \"\", path)\n}\n\n// DeleteNamedImport deletes the import with the given name and path from the file f, if present.\nfunc DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) {\n\tvar delspecs []*ast.ImportSpec\n\tvar delcomments []*ast.CommentGroup\n\n\t// Find the import nodes that import path, if any.\n\tfor i := 0; i < len(f.Decls); i++ {\n\t\tdecl := f.Decls[i]\n\t\tgen, ok := decl.(*ast.GenDecl)\n\t\tif !ok || gen.Tok != token.IMPORT {\n\t\t\tcontinue\n\t\t}\n\t\tfor j := 0; j < len(gen.Specs); j++ {\n\t\t\tspec := gen.Specs[j]\n\t\t\timpspec := spec.(*ast.ImportSpec)\n\t\t\tif impspec.Name == nil && name != \"\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif impspec.Name != nil && impspec.Name.Name != name {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif importPath(impspec) != path {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// We found an import spec that imports path.\n\t\t\t// Delete it.\n\t\t\tdelspecs = append(delspecs, impspec)\n\t\t\tdeleted = true\n\t\t\tcopy(gen.Specs[j:], gen.Specs[j+1:])\n\t\t\tgen.Specs = gen.Specs[:len(gen.Specs)-1]\n\n\t\t\t// If this was the last import spec in this decl,\n\t\t\t// delete the decl, too.\n\t\t\tif len(gen.Specs) == 0 {\n\t\t\t\tcopy(f.Decls[i:], f.Decls[i+1:])\n\t\t\t\tf.Decls = f.Decls[:len(f.Decls)-1]\n\t\t\t\ti--\n\t\t\t\tbreak\n\t\t\t} else if len(gen.Specs) == 1 {\n\t\t\t\tif impspec.Doc != nil {\n\t\t\t\t\tdelcomments = append(delcomments, impspec.Doc)\n\t\t\t\t}\n\t\t\t\tif impspec.Comment != nil {\n\t\t\t\t\tdelcomments = append(delcomments, impspec.Comment)\n\t\t\t\t}\n\t\t\t\tfor _, cg := range f.Comments {\n\t\t\t\t\t// Found comment on the same line as the import spec.\n\t\t\t\t\tif cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line {\n\t\t\t\t\t\tdelcomments = append(delcomments, cg)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tspec := gen.Specs[0].(*ast.ImportSpec)\n\n\t\t\t\t// Move the documentation right after the import decl.\n\t\t\t\tif spec.Doc != nil {\n\t\t\t\t\tfor fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Doc.Pos()).Line {\n\t\t\t\t\t\tfset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor _, cg := range f.Comments {\n\t\t\t\t\tif cg.End() < spec.Pos() && fset.Position(cg.End()).Line == fset.Position(spec.Pos()).Line {\n\t\t\t\t\t\tfor fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Pos()).Line {\n\t\t\t\t\t\t\tfset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif j > 0 {\n\t\t\t\tlastImpspec := gen.Specs[j-1].(*ast.ImportSpec)\n\t\t\t\tlastLine := fset.Position(lastImpspec.Path.ValuePos).Line\n\t\t\t\tline := fset.Position(impspec.Path.ValuePos).Line\n\n\t\t\t\t// We deleted an entry but now there may be\n\t\t\t\t// a blank line-sized hole where the import was.\n\t\t\t\tif line-lastLine > 1 {\n\t\t\t\t\t// There was a blank line immediately preceding the deleted import,\n\t\t\t\t\t// so there's no need to close the hole.\n\t\t\t\t\t// Do nothing.\n\t\t\t\t} else {\n\t\t\t\t\t// There was no blank line. Close the hole.\n\t\t\t\t\tfset.File(gen.Rparen).MergeLine(line)\n\t\t\t\t}\n\t\t\t}\n\t\t\tj--\n\t\t}\n\t}\n\n\t// Delete imports from f.Imports.\n\tfor i := 0; i < len(f.Imports); i++ {\n\t\timp := f.Imports[i]\n\t\tfor j, del := range delspecs {\n\t\t\tif imp == del {\n\t\t\t\tcopy(f.Imports[i:], f.Imports[i+1:])\n\t\t\t\tf.Imports = f.Imports[:len(f.Imports)-1]\n\t\t\t\tcopy(delspecs[j:], delspecs[j+1:])\n\t\t\t\tdelspecs = delspecs[:len(delspecs)-1]\n\t\t\t\ti--\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// Delete comments from f.Comments.\n\tfor i := 0; i < len(f.Comments); i++ {\n\t\tcg := f.Comments[i]\n\t\tfor j, del := range delcomments {\n\t\t\tif cg == del {\n\t\t\t\tcopy(f.Comments[i:], f.Comments[i+1:])\n\t\t\t\tf.Comments = f.Comments[:len(f.Comments)-1]\n\t\t\t\tcopy(delcomments[j:], delcomments[j+1:])\n\t\t\t\tdelcomments = delcomments[:len(delcomments)-1]\n\t\t\t\ti--\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(delspecs) > 0 {\n\t\tpanic(fmt.Sprintf(\"deleted specs from Decls but not Imports: %v\", delspecs))\n\t}\n\n\treturn\n}\n\n// RewriteImport rewrites any import of path oldPath to path newPath.\nfunc RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) {\n\tfor _, imp := range f.Imports {\n\t\tif importPath(imp) == oldPath {\n\t\t\trewrote = true\n\t\t\t// record old End, because the default is to compute\n\t\t\t// it using the length of imp.Path.Value.\n\t\t\timp.EndPos = imp.End()\n\t\t\timp.Path.Value = strconv.Quote(newPath)\n\t\t}\n\t}\n\treturn\n}\n\n// UsesImport reports whether a given import is used.\nfunc UsesImport(f *ast.File, path string) (used bool) {\n\tspec := importSpec(f, path)\n\tif spec == nil {\n\t\treturn\n\t}\n\n\tname := spec.Name.String()\n\tswitch name {\n\tcase \"<nil>\":\n\t\t// If the package name is not explicitly specified,\n\t\t// make an educated guess. This is not guaranteed to be correct.\n\t\tlastSlash := strings.LastIndex(path, \"/\")\n\t\tif lastSlash == -1 {\n\t\t\tname = path\n\t\t} else {\n\t\t\tname = path[lastSlash+1:]\n\t\t}\n\tcase \"_\", \".\":\n\t\t// Not sure if this import is used - err on the side of caution.\n\t\treturn true\n\t}\n\n\tast.Walk(visitFn(func(n ast.Node) {\n\t\tsel, ok := n.(*ast.SelectorExpr)\n\t\tif ok && isTopName(sel.X, name) {\n\t\t\tused = true\n\t\t}\n\t}), f)\n\n\treturn\n}\n\ntype visitFn func(node ast.Node)\n\nfunc (fn visitFn) Visit(node ast.Node) ast.Visitor {\n\tfn(node)\n\treturn fn\n}\n\n// imports returns true if f imports path.\nfunc imports(f *ast.File, path string) bool {\n\treturn importSpec(f, path) != nil\n}\n\n// importSpec returns the import spec if f imports path,\n// or nil otherwise.\nfunc importSpec(f *ast.File, path string) *ast.ImportSpec {\n\tfor _, s := range f.Imports {\n\t\tif importPath(s) == path {\n\t\t\treturn s\n\t\t}\n\t}\n\treturn nil\n}\n\n// importPath returns the unquoted import path of s,\n// or \"\" if the path is not properly quoted.\nfunc importPath(s *ast.ImportSpec) string {\n\tt, err := strconv.Unquote(s.Path.Value)\n\tif err == nil {\n\t\treturn t\n\t}\n\treturn \"\"\n}\n\n// declImports reports whether gen contains an import of path.\nfunc declImports(gen *ast.GenDecl, path string) bool {\n\tif gen.Tok != token.IMPORT {\n\t\treturn false\n\t}\n\tfor _, spec := range gen.Specs {\n\t\timpspec := spec.(*ast.ImportSpec)\n\t\tif importPath(impspec) == path {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// matchLen returns the length of the longest path segment prefix shared by x and y.\nfunc matchLen(x, y string) int {\n\tn := 0\n\tfor i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ {\n\t\tif x[i] == '/' {\n\t\t\tn++\n\t\t}\n\t}\n\treturn n\n}\n\n// isTopName returns true if n is a top-level unresolved identifier with the given name.\nfunc isTopName(n ast.Expr, name string) bool {\n\tid, ok := n.(*ast.Ident)\n\treturn ok && id.Name == name && id.Obj == nil\n}\n\n// Imports returns the file imports grouped by paragraph.\nfunc Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec {\n\tvar groups [][]*ast.ImportSpec\n\n\tfor _, decl := range f.Decls {\n\t\tgenDecl, ok := decl.(*ast.GenDecl)\n\t\tif !ok || genDecl.Tok != token.IMPORT {\n\t\t\tbreak\n\t\t}\n\n\t\tgroup := []*ast.ImportSpec{}\n\n\t\tvar lastLine int\n\t\tfor _, spec := range genDecl.Specs {\n\t\t\timportSpec := spec.(*ast.ImportSpec)\n\t\t\tpos := importSpec.Path.ValuePos\n\t\t\tline := fset.Position(pos).Line\n\t\t\tif lastLine > 0 && pos > 0 && line-lastLine > 1 {\n\t\t\t\tgroups = append(groups, group)\n\t\t\t\tgroup = []*ast.ImportSpec{}\n\t\t\t}\n\t\t\tgroup = append(group, importSpec)\n\t\t\tlastLine = line\n\t\t}\n\t\tgroups = append(groups, group)\n\t}\n\n\treturn groups\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/go/ast/astutil/util.go",
    "content": "package astutil\n\nimport \"go/ast\"\n\n// Unparen returns e with any enclosing parentheses stripped.\nfunc Unparen(e ast.Expr) ast.Expr {\n\tfor {\n\t\tp, ok := e.(*ast.ParenExpr)\n\t\tif !ok {\n\t\t\treturn e\n\t\t}\n\t\te = p.X\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/fastwalk.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// A faster implementation of filepath.Walk.\n//\n// filepath.Walk's design necessarily calls os.Lstat on each file,\n// even if the caller needs less info. And goimports only need to know\n// the type of each file. The kernel interface provides the type in\n// the Readdir call but the standard library ignored it.\n// fastwalk_unix.go contains a fork of the syscall routines.\n//\n// See golang.org/issue/16399\n\npackage imports\n\nimport (\n\t\"errors\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"runtime\"\n)\n\n// traverseLink is a sentinel error for fastWalk, similar to filepath.SkipDir.\nvar traverseLink = errors.New(\"traverse symlink, assuming target is a directory\")\n\n// fastWalk walks the file tree rooted at root, calling walkFn for\n// each file or directory in the tree, including root.\n//\n// If fastWalk returns filepath.SkipDir, the directory is skipped.\n//\n// Unlike filepath.Walk:\n//   * file stat calls must be done by the user.\n//     The only provided metadata is the file type, which does not include\n//     any permission bits.\n//   * multiple goroutines stat the filesystem concurrently. The provided\n//     walkFn must be safe for concurrent use.\n//   * fastWalk can follow symlinks if walkFn returns the traverseLink\n//     sentinel error. It is the walkFn's responsibility to prevent\n//     fastWalk from going into symlink cycles.\nfunc fastWalk(root string, walkFn func(path string, typ os.FileMode) error) error {\n\t// TODO(bradfitz): make numWorkers configurable? We used a\n\t// minimum of 4 to give the kernel more info about multiple\n\t// things we want, in hopes its I/O scheduling can take\n\t// advantage of that. Hopefully most are in cache. Maybe 4 is\n\t// even too low of a minimum. Profile more.\n\tnumWorkers := 4\n\tif n := runtime.NumCPU(); n > numWorkers {\n\t\tnumWorkers = n\n\t}\n\tw := &walker{\n\t\tfn:       walkFn,\n\t\tenqueuec: make(chan walkItem, numWorkers), // buffered for performance\n\t\tworkc:    make(chan walkItem, numWorkers), // buffered for performance\n\t\tdonec:    make(chan struct{}),\n\n\t\t// buffered for correctness & not leaking goroutines:\n\t\tresc: make(chan error, numWorkers),\n\t}\n\tdefer close(w.donec)\n\t// TODO(bradfitz): start the workers as needed? maybe not worth it.\n\tfor i := 0; i < numWorkers; i++ {\n\t\tgo w.doWork()\n\t}\n\ttodo := []walkItem{{dir: root}}\n\tout := 0\n\tfor {\n\t\tworkc := w.workc\n\t\tvar workItem walkItem\n\t\tif len(todo) == 0 {\n\t\t\tworkc = nil\n\t\t} else {\n\t\t\tworkItem = todo[len(todo)-1]\n\t\t}\n\t\tselect {\n\t\tcase workc <- workItem:\n\t\t\ttodo = todo[:len(todo)-1]\n\t\t\tout++\n\t\tcase it := <-w.enqueuec:\n\t\t\ttodo = append(todo, it)\n\t\tcase err := <-w.resc:\n\t\t\tout--\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif out == 0 && len(todo) == 0 {\n\t\t\t\t// It's safe to quit here, as long as the buffered\n\t\t\t\t// enqueue channel isn't also readable, which might\n\t\t\t\t// happen if the worker sends both another unit of\n\t\t\t\t// work and its result before the other select was\n\t\t\t\t// scheduled and both w.resc and w.enqueuec were\n\t\t\t\t// readable.\n\t\t\t\tselect {\n\t\t\t\tcase it := <-w.enqueuec:\n\t\t\t\t\ttodo = append(todo, it)\n\t\t\t\tdefault:\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// doWork reads directories as instructed (via workc) and runs the\n// user's callback function.\nfunc (w *walker) doWork() {\n\tfor {\n\t\tselect {\n\t\tcase <-w.donec:\n\t\t\treturn\n\t\tcase it := <-w.workc:\n\t\t\tw.resc <- w.walk(it.dir, !it.callbackDone)\n\t\t}\n\t}\n}\n\ntype walker struct {\n\tfn func(path string, typ os.FileMode) error\n\n\tdonec    chan struct{} // closed on fastWalk's return\n\tworkc    chan walkItem // to workers\n\tenqueuec chan walkItem // from workers\n\tresc     chan error    // from workers\n}\n\ntype walkItem struct {\n\tdir          string\n\tcallbackDone bool // callback already called; don't do it again\n}\n\nfunc (w *walker) enqueue(it walkItem) {\n\tselect {\n\tcase w.enqueuec <- it:\n\tcase <-w.donec:\n\t}\n}\n\nfunc (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error {\n\tjoined := dirName + string(os.PathSeparator) + baseName\n\tif typ == os.ModeDir {\n\t\tw.enqueue(walkItem{dir: joined})\n\t\treturn nil\n\t}\n\n\terr := w.fn(joined, typ)\n\tif typ == os.ModeSymlink {\n\t\tif err == traverseLink {\n\t\t\t// Set callbackDone so we don't call it twice for both the\n\t\t\t// symlink-as-symlink and the symlink-as-directory later:\n\t\t\tw.enqueue(walkItem{dir: joined, callbackDone: true})\n\t\t\treturn nil\n\t\t}\n\t\tif err == filepath.SkipDir {\n\t\t\t// Permit SkipDir on symlinks too.\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn err\n}\nfunc (w *walker) walk(root string, runUserCallback bool) error {\n\tif runUserCallback {\n\t\terr := w.fn(root, os.ModeDir)\n\t\tif err == filepath.SkipDir {\n\t\t\treturn nil\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn readDir(root, w.onDirEnt)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/fastwalk_dirent_fileno.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build freebsd openbsd netbsd\n\npackage imports\n\nimport \"syscall\"\n\nfunc direntInode(dirent *syscall.Dirent) uint64 {\n\treturn uint64(dirent.Fileno)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/fastwalk_dirent_ino.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux,!appengine darwin\n\npackage imports\n\nimport \"syscall\"\n\nfunc direntInode(dirent *syscall.Dirent) uint64 {\n\treturn uint64(dirent.Ino)\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/fastwalk_portable.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build appengine !linux,!darwin,!freebsd,!openbsd,!netbsd\n\npackage imports\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n)\n\n// readDir calls fn for each directory entry in dirName.\n// It does not descend into directories or follow symlinks.\n// If fn returns a non-nil error, readDir returns with that error\n// immediately.\nfunc readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error {\n\tfis, err := ioutil.ReadDir(dirName)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfor _, fi := range fis {\n\t\tif err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/fastwalk_unix.go",
    "content": "// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// +build linux,!appengine darwin freebsd openbsd netbsd\n\npackage imports\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"os\"\n\t\"syscall\"\n\t\"unsafe\"\n)\n\nconst blockSize = 8 << 10\n\n// unknownFileMode is a sentinel (and bogus) os.FileMode\n// value used to represent a syscall.DT_UNKNOWN Dirent.Type.\nconst unknownFileMode os.FileMode = os.ModeNamedPipe | os.ModeSocket | os.ModeDevice\n\nfunc readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error {\n\tfd, err := syscall.Open(dirName, 0, 0)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer syscall.Close(fd)\n\n\t// The buffer must be at least a block long.\n\tbuf := make([]byte, blockSize) // stack-allocated; doesn't escape\n\tbufp := 0                      // starting read position in buf\n\tnbuf := 0                      // end valid data in buf\n\tfor {\n\t\tif bufp >= nbuf {\n\t\t\tbufp = 0\n\t\t\tnbuf, err = syscall.ReadDirent(fd, buf)\n\t\t\tif err != nil {\n\t\t\t\treturn os.NewSyscallError(\"readdirent\", err)\n\t\t\t}\n\t\t\tif nbuf <= 0 {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tconsumed, name, typ := parseDirEnt(buf[bufp:nbuf])\n\t\tbufp += consumed\n\t\tif name == \"\" || name == \".\" || name == \"..\" {\n\t\t\tcontinue\n\t\t}\n\t\t// Fallback for filesystems (like old XFS) that don't\n\t\t// support Dirent.Type and have DT_UNKNOWN (0) there\n\t\t// instead.\n\t\tif typ == unknownFileMode {\n\t\t\tfi, err := os.Lstat(dirName + \"/\" + name)\n\t\t\tif err != nil {\n\t\t\t\t// It got deleted in the meantime.\n\t\t\t\tif os.IsNotExist(err) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\ttyp = fi.Mode() & os.ModeType\n\t\t}\n\t\tif err := fn(dirName, name, typ); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n}\n\nfunc parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) {\n\t// golang.org/issue/15653\n\tdirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0]))\n\tif v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v {\n\t\tpanic(fmt.Sprintf(\"buf size of %d smaller than dirent header size %d\", len(buf), v))\n\t}\n\tif len(buf) < int(dirent.Reclen) {\n\t\tpanic(fmt.Sprintf(\"buf size %d < record length %d\", len(buf), dirent.Reclen))\n\t}\n\tconsumed = int(dirent.Reclen)\n\tif direntInode(dirent) == 0 { // File absent in directory.\n\t\treturn\n\t}\n\tswitch dirent.Type {\n\tcase syscall.DT_REG:\n\t\ttyp = 0\n\tcase syscall.DT_DIR:\n\t\ttyp = os.ModeDir\n\tcase syscall.DT_LNK:\n\t\ttyp = os.ModeSymlink\n\tcase syscall.DT_BLK:\n\t\ttyp = os.ModeDevice\n\tcase syscall.DT_FIFO:\n\t\ttyp = os.ModeNamedPipe\n\tcase syscall.DT_SOCK:\n\t\ttyp = os.ModeSocket\n\tcase syscall.DT_UNKNOWN:\n\t\ttyp = unknownFileMode\n\tdefault:\n\t\t// Skip weird things.\n\t\t// It's probably a DT_WHT (http://lwn.net/Articles/325369/)\n\t\t// or something. Revisit if/when this package is moved outside\n\t\t// of goimports. goimports only cares about regular files,\n\t\t// symlinks, and directories.\n\t\treturn\n\t}\n\n\tnameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0]))\n\tnameLen := bytes.IndexByte(nameBuf[:], 0)\n\tif nameLen < 0 {\n\t\tpanic(\"failed to find terminating 0 byte in dirent\")\n\t}\n\n\t// Special cases for common things:\n\tif nameLen == 1 && nameBuf[0] == '.' {\n\t\tname = \".\"\n\t} else if nameLen == 2 && nameBuf[0] == '.' && nameBuf[1] == '.' {\n\t\tname = \"..\"\n\t} else {\n\t\tname = string(nameBuf[:nameLen])\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/fix.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage imports\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/build\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"golang.org/x/tools/go/ast/astutil\"\n)\n\n// Debug controls verbose logging.\nvar Debug = false\n\nvar (\n\tinTests = false      // set true by fix_test.go; if false, no need to use testMu\n\ttestMu  sync.RWMutex // guards globals reset by tests; used only if inTests\n)\n\n// If set, LocalPrefix instructs Process to sort import paths with the given\n// prefix into another group after 3rd-party packages.\nvar LocalPrefix string\n\n// importToGroup is a list of functions which map from an import path to\n// a group number.\nvar importToGroup = []func(importPath string) (num int, ok bool){\n\tfunc(importPath string) (num int, ok bool) {\n\t\tif LocalPrefix != \"\" && strings.HasPrefix(importPath, LocalPrefix) {\n\t\t\treturn 3, true\n\t\t}\n\t\treturn\n\t},\n\tfunc(importPath string) (num int, ok bool) {\n\t\tif strings.HasPrefix(importPath, \"appengine\") {\n\t\t\treturn 2, true\n\t\t}\n\t\treturn\n\t},\n\tfunc(importPath string) (num int, ok bool) {\n\t\tif strings.Contains(importPath, \".\") {\n\t\t\treturn 1, true\n\t\t}\n\t\treturn\n\t},\n}\n\nfunc importGroup(importPath string) int {\n\tfor _, fn := range importToGroup {\n\t\tif n, ok := fn(importPath); ok {\n\t\t\treturn n\n\t\t}\n\t}\n\treturn 0\n}\n\n// packageInfo is a summary of features found in a package.\ntype packageInfo struct {\n\tGlobals map[string]bool // symbol => true\n}\n\n// dirPackageInfo gets information from other files in the package.\nfunc dirPackageInfo(srcDir, filename string) (*packageInfo, error) {\n\tconsiderTests := strings.HasSuffix(filename, \"_test.go\")\n\n\t// Handle file from stdin\n\tif _, err := os.Stat(filename); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn &packageInfo{}, nil\n\t\t}\n\t\treturn nil, err\n\t}\n\n\tfileBase := filepath.Base(filename)\n\tpackageFileInfos, err := ioutil.ReadDir(srcDir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tinfo := &packageInfo{Globals: make(map[string]bool)}\n\tfor _, fi := range packageFileInfos {\n\t\tif fi.Name() == fileBase || !strings.HasSuffix(fi.Name(), \".go\") {\n\t\t\tcontinue\n\t\t}\n\t\tif !considerTests && strings.HasSuffix(fi.Name(), \"_test.go\") {\n\t\t\tcontinue\n\t\t}\n\n\t\tfileSet := token.NewFileSet()\n\t\troot, err := parser.ParseFile(fileSet, filepath.Join(srcDir, fi.Name()), nil, 0)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfor _, decl := range root.Decls {\n\t\t\tgenDecl, ok := decl.(*ast.GenDecl)\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tfor _, spec := range genDecl.Specs {\n\t\t\t\tvalueSpec, ok := spec.(*ast.ValueSpec)\n\t\t\t\tif !ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tinfo.Globals[valueSpec.Names[0].Name] = true\n\t\t\t}\n\t\t}\n\t}\n\treturn info, nil\n}\n\nfunc fixImports(fset *token.FileSet, f *ast.File, filename string) (added []string, err error) {\n\t// refs are a set of possible package references currently unsatisfied by imports.\n\t// first key: either base package (e.g. \"fmt\") or renamed package\n\t// second key: referenced package symbol (e.g. \"Println\")\n\trefs := make(map[string]map[string]bool)\n\n\t// decls are the current package imports. key is base package or renamed package.\n\tdecls := make(map[string]*ast.ImportSpec)\n\n\tabs, err := filepath.Abs(filename)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsrcDir := filepath.Dir(abs)\n\tif Debug {\n\t\tlog.Printf(\"fixImports(filename=%q), abs=%q, srcDir=%q ...\", filename, abs, srcDir)\n\t}\n\n\tvar packageInfo *packageInfo\n\tvar loadedPackageInfo bool\n\n\t// collect potential uses of packages.\n\tvar visitor visitFn\n\tvisitor = visitFn(func(node ast.Node) ast.Visitor {\n\t\tif node == nil {\n\t\t\treturn visitor\n\t\t}\n\t\tswitch v := node.(type) {\n\t\tcase *ast.ImportSpec:\n\t\t\tif v.Name != nil {\n\t\t\t\tdecls[v.Name.Name] = v\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tipath := strings.Trim(v.Path.Value, `\"`)\n\t\t\tif ipath == \"C\" {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tlocal := importPathToName(ipath, srcDir)\n\t\t\tdecls[local] = v\n\t\tcase *ast.SelectorExpr:\n\t\t\txident, ok := v.X.(*ast.Ident)\n\t\t\tif !ok {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif xident.Obj != nil {\n\t\t\t\t// if the parser can resolve it, it's not a package ref\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tpkgName := xident.Name\n\t\t\tif refs[pkgName] == nil {\n\t\t\t\trefs[pkgName] = make(map[string]bool)\n\t\t\t}\n\t\t\tif !loadedPackageInfo {\n\t\t\t\tloadedPackageInfo = true\n\t\t\t\tpackageInfo, _ = dirPackageInfo(srcDir, filename)\n\t\t\t}\n\t\t\tif decls[pkgName] == nil && (packageInfo == nil || !packageInfo.Globals[pkgName]) {\n\t\t\t\trefs[pkgName][v.Sel.Name] = true\n\t\t\t}\n\t\t}\n\t\treturn visitor\n\t})\n\tast.Walk(visitor, f)\n\n\t// Nil out any unused ImportSpecs, to be removed in following passes\n\tunusedImport := map[string]string{}\n\tfor pkg, is := range decls {\n\t\tif refs[pkg] == nil && pkg != \"_\" && pkg != \".\" {\n\t\t\tname := \"\"\n\t\t\tif is.Name != nil {\n\t\t\t\tname = is.Name.Name\n\t\t\t}\n\t\t\tunusedImport[strings.Trim(is.Path.Value, `\"`)] = name\n\t\t}\n\t}\n\tfor ipath, name := range unusedImport {\n\t\tif ipath == \"C\" {\n\t\t\t// Don't remove cgo stuff.\n\t\t\tcontinue\n\t\t}\n\t\tastutil.DeleteNamedImport(fset, f, name, ipath)\n\t}\n\n\tfor pkgName, symbols := range refs {\n\t\tif len(symbols) == 0 {\n\t\t\t// skip over packages already imported\n\t\t\tdelete(refs, pkgName)\n\t\t}\n\t}\n\n\t// Search for imports matching potential package references.\n\tsearches := 0\n\ttype result struct {\n\t\tipath string // import path (if err == nil)\n\t\tname  string // optional name to rename import as\n\t\terr   error\n\t}\n\tresults := make(chan result)\n\tfor pkgName, symbols := range refs {\n\t\tgo func(pkgName string, symbols map[string]bool) {\n\t\t\tipath, rename, err := findImport(pkgName, symbols, filename)\n\t\t\tr := result{ipath: ipath, err: err}\n\t\t\tif rename {\n\t\t\t\tr.name = pkgName\n\t\t\t}\n\t\t\tresults <- r\n\t\t}(pkgName, symbols)\n\t\tsearches++\n\t}\n\tfor i := 0; i < searches; i++ {\n\t\tresult := <-results\n\t\tif result.err != nil {\n\t\t\treturn nil, result.err\n\t\t}\n\t\tif result.ipath != \"\" {\n\t\t\tif result.name != \"\" {\n\t\t\t\tastutil.AddNamedImport(fset, f, result.name, result.ipath)\n\t\t\t} else {\n\t\t\t\tastutil.AddImport(fset, f, result.ipath)\n\t\t\t}\n\t\t\tadded = append(added, result.ipath)\n\t\t}\n\t}\n\n\treturn added, nil\n}\n\n// importPathToName returns the package name for the given import path.\nvar importPathToName func(importPath, srcDir string) (packageName string) = importPathToNameGoPath\n\n// importPathToNameBasic assumes the package name is the base of import path.\nfunc importPathToNameBasic(importPath, srcDir string) (packageName string) {\n\treturn path.Base(importPath)\n}\n\n// importPathToNameGoPath finds out the actual package name, as declared in its .go files.\n// If there's a problem, it falls back to using importPathToNameBasic.\nfunc importPathToNameGoPath(importPath, srcDir string) (packageName string) {\n\t// Fast path for standard library without going to disk.\n\tif pkg, ok := stdImportPackage[importPath]; ok {\n\t\treturn pkg\n\t}\n\n\tpkgName, err := importPathToNameGoPathParse(importPath, srcDir)\n\tif Debug {\n\t\tlog.Printf(\"importPathToNameGoPathParse(%q, srcDir=%q) = %q, %v\", importPath, srcDir, pkgName, err)\n\t}\n\tif err == nil {\n\t\treturn pkgName\n\t}\n\treturn importPathToNameBasic(importPath, srcDir)\n}\n\n// importPathToNameGoPathParse is a faster version of build.Import if\n// the only thing desired is the package name. It uses build.FindOnly\n// to find the directory and then only parses one file in the package,\n// trusting that the files in the directory are consistent.\nfunc importPathToNameGoPathParse(importPath, srcDir string) (packageName string, err error) {\n\tbuildPkg, err := build.Import(importPath, srcDir, build.FindOnly)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\td, err := os.Open(buildPkg.Dir)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tnames, err := d.Readdirnames(-1)\n\td.Close()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tsort.Strings(names) // to have predictable behavior\n\tvar lastErr error\n\tvar nfile int\n\tfor _, name := range names {\n\t\tif !strings.HasSuffix(name, \".go\") {\n\t\t\tcontinue\n\t\t}\n\t\tif strings.HasSuffix(name, \"_test.go\") {\n\t\t\tcontinue\n\t\t}\n\t\tnfile++\n\t\tfullFile := filepath.Join(buildPkg.Dir, name)\n\n\t\tfset := token.NewFileSet()\n\t\tf, err := parser.ParseFile(fset, fullFile, nil, parser.PackageClauseOnly)\n\t\tif err != nil {\n\t\t\tlastErr = err\n\t\t\tcontinue\n\t\t}\n\t\tpkgName := f.Name.Name\n\t\tif pkgName == \"documentation\" {\n\t\t\t// Special case from go/build.ImportDir, not\n\t\t\t// handled by ctx.MatchFile.\n\t\t\tcontinue\n\t\t}\n\t\tif pkgName == \"main\" {\n\t\t\t// Also skip package main, assuming it's a +build ignore generator or example.\n\t\t\t// Since you can't import a package main anyway, there's no harm here.\n\t\t\tcontinue\n\t\t}\n\t\treturn pkgName, nil\n\t}\n\tif lastErr != nil {\n\t\treturn \"\", lastErr\n\t}\n\treturn \"\", fmt.Errorf(\"no importable package found in %d Go files\", nfile)\n}\n\nvar stdImportPackage = map[string]string{} // \"net/http\" => \"http\"\n\nfunc init() {\n\t// Nothing in the standard library has a package name not\n\t// matching its import base name.\n\tfor _, pkg := range stdlib {\n\t\tif _, ok := stdImportPackage[pkg]; !ok {\n\t\t\tstdImportPackage[pkg] = path.Base(pkg)\n\t\t}\n\t}\n}\n\n// Directory-scanning state.\nvar (\n\t// scanGoRootOnce guards calling scanGoRoot (for $GOROOT)\n\tscanGoRootOnce sync.Once\n\t// scanGoPathOnce guards calling scanGoPath (for $GOPATH)\n\tscanGoPathOnce sync.Once\n\n\t// populateIgnoreOnce guards calling populateIgnore\n\tpopulateIgnoreOnce sync.Once\n\tignoredDirs        []os.FileInfo\n\n\tdirScanMu sync.RWMutex\n\tdirScan   map[string]*pkg // abs dir path => *pkg\n)\n\ntype pkg struct {\n\tdir             string // absolute file path to pkg directory (\"/usr/lib/go/src/net/http\")\n\timportPath      string // full pkg import path (\"net/http\", \"foo/bar/vendor/a/b\")\n\timportPathShort string // vendorless import path (\"net/http\", \"a/b\")\n}\n\n// byImportPathShortLength sorts by the short import path length, breaking ties on the\n// import string itself.\ntype byImportPathShortLength []*pkg\n\nfunc (s byImportPathShortLength) Len() int { return len(s) }\nfunc (s byImportPathShortLength) Less(i, j int) bool {\n\tvi, vj := s[i].importPathShort, s[j].importPathShort\n\treturn len(vi) < len(vj) || (len(vi) == len(vj) && vi < vj)\n\n}\nfunc (s byImportPathShortLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] }\n\n// gate is a semaphore for limiting concurrency.\ntype gate chan struct{}\n\nfunc (g gate) enter() { g <- struct{}{} }\nfunc (g gate) leave() { <-g }\n\nvar visitedSymlinks struct {\n\tsync.Mutex\n\tm map[string]struct{}\n}\n\n// guarded by populateIgnoreOnce; populates ignoredDirs.\nfunc populateIgnore() {\n\tfor _, srcDir := range build.Default.SrcDirs() {\n\t\tif srcDir == filepath.Join(build.Default.GOROOT, \"src\") {\n\t\t\tcontinue\n\t\t}\n\t\tpopulateIgnoredDirs(srcDir)\n\t}\n}\n\n// populateIgnoredDirs reads an optional config file at <path>/.goimportsignore\n// of relative directories to ignore when scanning for go files.\n// The provided path is one of the $GOPATH entries with \"src\" appended.\nfunc populateIgnoredDirs(path string) {\n\tfile := filepath.Join(path, \".goimportsignore\")\n\tslurp, err := ioutil.ReadFile(file)\n\tif Debug {\n\t\tif err != nil {\n\t\t\tlog.Print(err)\n\t\t} else {\n\t\t\tlog.Printf(\"Read %s\", file)\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn\n\t}\n\tbs := bufio.NewScanner(bytes.NewReader(slurp))\n\tfor bs.Scan() {\n\t\tline := strings.TrimSpace(bs.Text())\n\t\tif line == \"\" || strings.HasPrefix(line, \"#\") {\n\t\t\tcontinue\n\t\t}\n\t\tfull := filepath.Join(path, line)\n\t\tif fi, err := os.Stat(full); err == nil {\n\t\t\tignoredDirs = append(ignoredDirs, fi)\n\t\t\tif Debug {\n\t\t\t\tlog.Printf(\"Directory added to ignore list: %s\", full)\n\t\t\t}\n\t\t} else if Debug {\n\t\t\tlog.Printf(\"Error statting entry in .goimportsignore: %v\", err)\n\t\t}\n\t}\n}\n\nfunc skipDir(fi os.FileInfo) bool {\n\tfor _, ignoredDir := range ignoredDirs {\n\t\tif os.SameFile(fi, ignoredDir) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// shouldTraverse reports whether the symlink fi should, found in dir,\n// should be followed.  It makes sure symlinks were never visited\n// before to avoid symlink loops.\nfunc shouldTraverse(dir string, fi os.FileInfo) bool {\n\tpath := filepath.Join(dir, fi.Name())\n\ttarget, err := filepath.EvalSymlinks(path)\n\tif err != nil {\n\t\tif !os.IsNotExist(err) {\n\t\t\tfmt.Fprintln(os.Stderr, err)\n\t\t}\n\t\treturn false\n\t}\n\tts, err := os.Stat(target)\n\tif err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t\treturn false\n\t}\n\tif !ts.IsDir() {\n\t\treturn false\n\t}\n\tif skipDir(ts) {\n\t\treturn false\n\t}\n\n\trealParent, err := filepath.EvalSymlinks(dir)\n\tif err != nil {\n\t\tfmt.Fprint(os.Stderr, err)\n\t\treturn false\n\t}\n\trealPath := filepath.Join(realParent, fi.Name())\n\tvisitedSymlinks.Lock()\n\tdefer visitedSymlinks.Unlock()\n\tif visitedSymlinks.m == nil {\n\t\tvisitedSymlinks.m = make(map[string]struct{})\n\t}\n\tif _, ok := visitedSymlinks.m[realPath]; ok {\n\t\treturn false\n\t}\n\tvisitedSymlinks.m[realPath] = struct{}{}\n\treturn true\n}\n\nvar testHookScanDir = func(dir string) {}\n\nvar scanGoRootDone = make(chan struct{}) // closed when scanGoRoot is done\n\nfunc scanGoRoot() {\n\tgo func() {\n\t\tscanGoDirs(true)\n\t\tclose(scanGoRootDone)\n\t}()\n}\n\nfunc scanGoPath() { scanGoDirs(false) }\n\nfunc scanGoDirs(goRoot bool) {\n\tif Debug {\n\t\twhich := \"$GOROOT\"\n\t\tif !goRoot {\n\t\t\twhich = \"$GOPATH\"\n\t\t}\n\t\tlog.Printf(\"scanning \" + which)\n\t\tdefer log.Printf(\"scanned \" + which)\n\t}\n\tdirScanMu.Lock()\n\tif dirScan == nil {\n\t\tdirScan = make(map[string]*pkg)\n\t}\n\tdirScanMu.Unlock()\n\n\tfor _, srcDir := range build.Default.SrcDirs() {\n\t\tisGoroot := srcDir == filepath.Join(build.Default.GOROOT, \"src\")\n\t\tif isGoroot != goRoot {\n\t\t\tcontinue\n\t\t}\n\t\ttestHookScanDir(srcDir)\n\t\twalkFn := func(path string, typ os.FileMode) error {\n\t\t\tdir := filepath.Dir(path)\n\t\t\tif typ.IsRegular() {\n\t\t\t\tif dir == srcDir {\n\t\t\t\t\t// Doesn't make sense to have regular files\n\t\t\t\t\t// directly in your $GOPATH/src or $GOROOT/src.\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tif !strings.HasSuffix(path, \".go\") {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdirScanMu.Lock()\n\t\t\t\tif _, dup := dirScan[dir]; !dup {\n\t\t\t\t\timportpath := filepath.ToSlash(dir[len(srcDir)+len(\"/\"):])\n\t\t\t\t\tdirScan[dir] = &pkg{\n\t\t\t\t\t\timportPath:      importpath,\n\t\t\t\t\t\timportPathShort: vendorlessImportPath(importpath),\n\t\t\t\t\t\tdir:             dir,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdirScanMu.Unlock()\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif typ == os.ModeDir {\n\t\t\t\tbase := filepath.Base(path)\n\t\t\t\tif base == \"\" || base[0] == '.' || base[0] == '_' ||\n\t\t\t\t\tbase == \"testdata\" || base == \"node_modules\" {\n\t\t\t\t\treturn filepath.SkipDir\n\t\t\t\t}\n\t\t\t\tfi, err := os.Lstat(path)\n\t\t\t\tif err == nil && skipDir(fi) {\n\t\t\t\t\tif Debug {\n\t\t\t\t\t\tlog.Printf(\"skipping directory %q under %s\", fi.Name(), dir)\n\t\t\t\t\t}\n\t\t\t\t\treturn filepath.SkipDir\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif typ == os.ModeSymlink {\n\t\t\t\tbase := filepath.Base(path)\n\t\t\t\tif strings.HasPrefix(base, \".#\") {\n\t\t\t\t\t// Emacs noise.\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tfi, err := os.Lstat(path)\n\t\t\t\tif err != nil {\n\t\t\t\t\t// Just ignore it.\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tif shouldTraverse(dir, fi) {\n\t\t\t\t\treturn traverseLink\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\tif err := fastWalk(srcDir, walkFn); err != nil {\n\t\t\tlog.Printf(\"goimports: scanning directory %v: %v\", srcDir, err)\n\t\t}\n\t}\n}\n\n// vendorlessImportPath returns the devendorized version of the provided import path.\n// e.g. \"foo/bar/vendor/a/b\" => \"a/b\"\nfunc vendorlessImportPath(ipath string) string {\n\t// Devendorize for use in import statement.\n\tif i := strings.LastIndex(ipath, \"/vendor/\"); i >= 0 {\n\t\treturn ipath[i+len(\"/vendor/\"):]\n\t}\n\tif strings.HasPrefix(ipath, \"vendor/\") {\n\t\treturn ipath[len(\"vendor/\"):]\n\t}\n\treturn ipath\n}\n\n// loadExports returns the set of exported symbols in the package at dir.\n// It returns nil on error or if the package name in dir does not match expectPackage.\nvar loadExports func(expectPackage, dir string) map[string]bool = loadExportsGoPath\n\nfunc loadExportsGoPath(expectPackage, dir string) map[string]bool {\n\tif Debug {\n\t\tlog.Printf(\"loading exports in dir %s (seeking package %s)\", dir, expectPackage)\n\t}\n\texports := make(map[string]bool)\n\n\tctx := build.Default\n\n\t// ReadDir is like ioutil.ReadDir, but only returns *.go files\n\t// and filters out _test.go files since they're not relevant\n\t// and only slow things down.\n\tctx.ReadDir = func(dir string) (notTests []os.FileInfo, err error) {\n\t\tall, err := ioutil.ReadDir(dir)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tnotTests = all[:0]\n\t\tfor _, fi := range all {\n\t\t\tname := fi.Name()\n\t\t\tif strings.HasSuffix(name, \".go\") && !strings.HasSuffix(name, \"_test.go\") {\n\t\t\t\tnotTests = append(notTests, fi)\n\t\t\t}\n\t\t}\n\t\treturn notTests, nil\n\t}\n\n\tfiles, err := ctx.ReadDir(dir)\n\tif err != nil {\n\t\tlog.Print(err)\n\t\treturn nil\n\t}\n\n\tfset := token.NewFileSet()\n\n\tfor _, fi := range files {\n\t\tmatch, err := ctx.MatchFile(dir, fi.Name())\n\t\tif err != nil || !match {\n\t\t\tcontinue\n\t\t}\n\t\tfullFile := filepath.Join(dir, fi.Name())\n\t\tf, err := parser.ParseFile(fset, fullFile, nil, 0)\n\t\tif err != nil {\n\t\t\tif Debug {\n\t\t\t\tlog.Printf(\"Parsing %s: %v\", fullFile, err)\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\tpkgName := f.Name.Name\n\t\tif pkgName == \"documentation\" {\n\t\t\t// Special case from go/build.ImportDir, not\n\t\t\t// handled by ctx.MatchFile.\n\t\t\tcontinue\n\t\t}\n\t\tif pkgName != expectPackage {\n\t\t\tif Debug {\n\t\t\t\tlog.Printf(\"scan of dir %v is not expected package %v (actually %v)\", dir, expectPackage, pkgName)\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t\tfor name := range f.Scope.Objects {\n\t\t\tif ast.IsExported(name) {\n\t\t\t\texports[name] = true\n\t\t\t}\n\t\t}\n\t}\n\n\tif Debug {\n\t\texportList := make([]string, 0, len(exports))\n\t\tfor k := range exports {\n\t\t\texportList = append(exportList, k)\n\t\t}\n\t\tsort.Strings(exportList)\n\t\tlog.Printf(\"loaded exports in dir %v (package %v): %v\", dir, expectPackage, strings.Join(exportList, \", \"))\n\t}\n\treturn exports\n}\n\n// findImport searches for a package with the given symbols.\n// If no package is found, findImport returns (\"\", false, nil)\n//\n// This is declared as a variable rather than a function so goimports\n// can be easily extended by adding a file with an init function.\n//\n// The rename value tells goimports whether to use the package name as\n// a local qualifier in an import. For example, if findImports(\"pkg\",\n// \"X\") returns (\"foo/bar\", rename=true), then goimports adds the\n// import line:\n// \timport pkg \"foo/bar\"\n// to satisfy uses of pkg.X in the file.\nvar findImport func(pkgName string, symbols map[string]bool, filename string) (foundPkg string, rename bool, err error) = findImportGoPath\n\n// findImportGoPath is the normal implementation of findImport.\n// (Some companies have their own internally.)\nfunc findImportGoPath(pkgName string, symbols map[string]bool, filename string) (foundPkg string, rename bool, err error) {\n\tif inTests {\n\t\ttestMu.RLock()\n\t\tdefer testMu.RUnlock()\n\t}\n\n\t// Fast path for the standard library.\n\t// In the common case we hopefully never have to scan the GOPATH, which can\n\t// be slow with moving disks.\n\tif pkg, rename, ok := findImportStdlib(pkgName, symbols); ok {\n\t\treturn pkg, rename, nil\n\t}\n\tif pkgName == \"rand\" && symbols[\"Read\"] {\n\t\t// Special-case rand.Read.\n\t\t//\n\t\t// If findImportStdlib didn't find it above, don't go\n\t\t// searching for it, lest it find and pick math/rand\n\t\t// in GOROOT (new as of Go 1.6)\n\t\t//\n\t\t// crypto/rand is the safer choice.\n\t\treturn \"\", false, nil\n\t}\n\n\t// TODO(sameer): look at the import lines for other Go files in the\n\t// local directory, since the user is likely to import the same packages\n\t// in the current Go file.  Return rename=true when the other Go files\n\t// use a renamed package that's also used in the current file.\n\n\t// Read all the $GOPATH/src/.goimportsignore files before scanning directories.\n\tpopulateIgnoreOnce.Do(populateIgnore)\n\n\t// Start scanning the $GOROOT asynchronously, then run the\n\t// GOPATH scan synchronously if needed, and then wait for the\n\t// $GOROOT to finish.\n\t//\n\t// TODO(bradfitz): run each $GOPATH entry async. But nobody\n\t// really has more than one anyway, so low priority.\n\tscanGoRootOnce.Do(scanGoRoot) // async\n\tif !fileInDir(filename, build.Default.GOROOT) {\n\t\tscanGoPathOnce.Do(scanGoPath) // blocking\n\t}\n\t<-scanGoRootDone\n\n\t// Find candidate packages, looking only at their directory names first.\n\tvar candidates []*pkg\n\tfor _, pkg := range dirScan {\n\t\tif pkgIsCandidate(filename, pkgName, pkg) {\n\t\t\tcandidates = append(candidates, pkg)\n\t\t}\n\t}\n\n\t// Sort the candidates by their import package length,\n\t// assuming that shorter package names are better than long\n\t// ones.  Note that this sorts by the de-vendored name, so\n\t// there's no \"penalty\" for vendoring.\n\tsort.Sort(byImportPathShortLength(candidates))\n\tif Debug {\n\t\tfor i, pkg := range candidates {\n\t\t\tlog.Printf(\"%s candidate %d/%d: %v\", pkgName, i+1, len(candidates), pkg.importPathShort)\n\t\t}\n\t}\n\n\t// Collect exports for packages with matching names.\n\n\tdone := make(chan struct{}) // closed when we find the answer\n\tdefer close(done)\n\n\trescv := make([]chan *pkg, len(candidates))\n\tfor i := range candidates {\n\t\trescv[i] = make(chan *pkg)\n\t}\n\tconst maxConcurrentPackageImport = 4\n\tloadExportsSem := make(chan struct{}, maxConcurrentPackageImport)\n\n\tgo func() {\n\t\tfor i, pkg := range candidates {\n\t\t\tselect {\n\t\t\tcase loadExportsSem <- struct{}{}:\n\t\t\t\tselect {\n\t\t\t\tcase <-done:\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\tcase <-done:\n\t\t\t\treturn\n\t\t\t}\n\t\t\tpkg := pkg\n\t\t\tresc := rescv[i]\n\t\t\tgo func() {\n\t\t\t\tif inTests {\n\t\t\t\t\ttestMu.RLock()\n\t\t\t\t\tdefer testMu.RUnlock()\n\t\t\t\t}\n\t\t\t\tdefer func() { <-loadExportsSem }()\n\t\t\t\texports := loadExports(pkgName, pkg.dir)\n\n\t\t\t\t// If it doesn't have the right\n\t\t\t\t// symbols, send nil to mean no match.\n\t\t\t\tfor symbol := range symbols {\n\t\t\t\t\tif !exports[symbol] {\n\t\t\t\t\t\tpkg = nil\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tselect {\n\t\t\t\tcase resc <- pkg:\n\t\t\t\tcase <-done:\n\t\t\t\t}\n\t\t\t}()\n\t\t}\n\t}()\n\tfor _, resc := range rescv {\n\t\tpkg := <-resc\n\t\tif pkg == nil {\n\t\t\tcontinue\n\t\t}\n\t\t// If the package name in the source doesn't match the import path's base,\n\t\t// return true so the rewriter adds a name (import foo \"github.com/bar/go-foo\")\n\t\tneedsRename := path.Base(pkg.importPath) != pkgName\n\t\treturn pkg.importPathShort, needsRename, nil\n\t}\n\treturn \"\", false, nil\n}\n\n// pkgIsCandidate reports whether pkg is a candidate for satisfying the\n// finding which package pkgIdent in the file named by filename is trying\n// to refer to.\n//\n// This check is purely lexical and is meant to be as fast as possible\n// because it's run over all $GOPATH directories to filter out poor\n// candidates in order to limit the CPU and I/O later parsing the\n// exports in candidate packages.\n//\n// filename is the file being formatted.\n// pkgIdent is the package being searched for, like \"client\" (if\n// searching for \"client.New\")\nfunc pkgIsCandidate(filename, pkgIdent string, pkg *pkg) bool {\n\t// Check \"internal\" and \"vendor\" visibility:\n\tif !canUse(filename, pkg.dir) {\n\t\treturn false\n\t}\n\n\t// Speed optimization to minimize disk I/O:\n\t// the last two components on disk must contain the\n\t// package name somewhere.\n\t//\n\t// This permits mismatch naming like directory\n\t// \"go-foo\" being package \"foo\", or \"pkg.v3\" being \"pkg\",\n\t// or directory \"google.golang.org/api/cloudbilling/v1\"\n\t// being package \"cloudbilling\", but doesn't\n\t// permit a directory \"foo\" to be package\n\t// \"bar\", which is strongly discouraged\n\t// anyway. There's no reason goimports needs\n\t// to be slow just to accomodate that.\n\tlastTwo := lastTwoComponents(pkg.importPathShort)\n\tif strings.Contains(lastTwo, pkgIdent) {\n\t\treturn true\n\t}\n\tif hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(pkgIdent) {\n\t\tlastTwo = lowerASCIIAndRemoveHyphen(lastTwo)\n\t\tif strings.Contains(lastTwo, pkgIdent) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc hasHyphenOrUpperASCII(s string) bool {\n\tfor i := 0; i < len(s); i++ {\n\t\tb := s[i]\n\t\tif b == '-' || ('A' <= b && b <= 'Z') {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc lowerASCIIAndRemoveHyphen(s string) (ret string) {\n\tbuf := make([]byte, 0, len(s))\n\tfor i := 0; i < len(s); i++ {\n\t\tb := s[i]\n\t\tswitch {\n\t\tcase b == '-':\n\t\t\tcontinue\n\t\tcase 'A' <= b && b <= 'Z':\n\t\t\tbuf = append(buf, b+('a'-'A'))\n\t\tdefault:\n\t\t\tbuf = append(buf, b)\n\t\t}\n\t}\n\treturn string(buf)\n}\n\n// canUse reports whether the package in dir is usable from filename,\n// respecting the Go \"internal\" and \"vendor\" visibility rules.\nfunc canUse(filename, dir string) bool {\n\t// Fast path check, before any allocations. If it doesn't contain vendor\n\t// or internal, it's not tricky:\n\t// Note that this can false-negative on directories like \"notinternal\",\n\t// but we check it correctly below. This is just a fast path.\n\tif !strings.Contains(dir, \"vendor\") && !strings.Contains(dir, \"internal\") {\n\t\treturn true\n\t}\n\n\tdirSlash := filepath.ToSlash(dir)\n\tif !strings.Contains(dirSlash, \"/vendor/\") && !strings.Contains(dirSlash, \"/internal/\") && !strings.HasSuffix(dirSlash, \"/internal\") {\n\t\treturn true\n\t}\n\t// Vendor or internal directory only visible from children of parent.\n\t// That means the path from the current directory to the target directory\n\t// can contain ../vendor or ../internal but not ../foo/vendor or ../foo/internal\n\t// or bar/vendor or bar/internal.\n\t// After stripping all the leading ../, the only okay place to see vendor or internal\n\t// is at the very beginning of the path.\n\tabsfile, err := filepath.Abs(filename)\n\tif err != nil {\n\t\treturn false\n\t}\n\tabsdir, err := filepath.Abs(dir)\n\tif err != nil {\n\t\treturn false\n\t}\n\trel, err := filepath.Rel(absfile, absdir)\n\tif err != nil {\n\t\treturn false\n\t}\n\trelSlash := filepath.ToSlash(rel)\n\tif i := strings.LastIndex(relSlash, \"../\"); i >= 0 {\n\t\trelSlash = relSlash[i+len(\"../\"):]\n\t}\n\treturn !strings.Contains(relSlash, \"/vendor/\") && !strings.Contains(relSlash, \"/internal/\") && !strings.HasSuffix(relSlash, \"/internal\")\n}\n\n// lastTwoComponents returns at most the last two path components\n// of v, using either / or \\ as the path separator.\nfunc lastTwoComponents(v string) string {\n\tnslash := 0\n\tfor i := len(v) - 1; i >= 0; i-- {\n\t\tif v[i] == '/' || v[i] == '\\\\' {\n\t\t\tnslash++\n\t\t\tif nslash == 2 {\n\t\t\t\treturn v[i:]\n\t\t\t}\n\t\t}\n\t}\n\treturn v\n}\n\ntype visitFn func(node ast.Node) ast.Visitor\n\nfunc (fn visitFn) Visit(node ast.Node) ast.Visitor {\n\treturn fn(node)\n}\n\nfunc findImportStdlib(shortPkg string, symbols map[string]bool) (importPath string, rename, ok bool) {\n\tfor symbol := range symbols {\n\t\tkey := shortPkg + \".\" + symbol\n\t\tpath := stdlib[key]\n\t\tif path == \"\" {\n\t\t\tif key == \"rand.Read\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn \"\", false, false\n\t\t}\n\t\tif importPath != \"\" && importPath != path {\n\t\t\t// Ambiguous. Symbols pointed to different things.\n\t\t\treturn \"\", false, false\n\t\t}\n\t\timportPath = path\n\t}\n\tif importPath == \"\" && shortPkg == \"rand\" && symbols[\"Read\"] {\n\t\treturn \"crypto/rand\", false, true\n\t}\n\treturn importPath, false, importPath != \"\"\n}\n\n// fileInDir reports whether the provided file path looks like\n// it's in dir. (without hitting the filesystem)\nfunc fileInDir(file, dir string) bool {\n\trest := strings.TrimPrefix(file, dir)\n\tif len(rest) == len(file) {\n\t\t// dir is not a prefix of file.\n\t\treturn false\n\t}\n\t// Check for boundary: either nothing (file == dir), or a slash.\n\treturn len(rest) == 0 || rest[0] == '/' || rest[0] == '\\\\'\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/imports.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n//go:generate go run mkstdlib.go\n\n// Package imports implements a Go pretty-printer (like package \"go/format\")\n// that also adds or removes import statements as necessary.\npackage imports // import \"golang.org/x/tools/imports\"\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/format\"\n\t\"go/parser\"\n\t\"go/printer\"\n\t\"go/token\"\n\t\"io\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"golang.org/x/tools/go/ast/astutil\"\n)\n\n// Options specifies options for processing files.\ntype Options struct {\n\tFragment  bool // Accept fragment of a source file (no package statement)\n\tAllErrors bool // Report all errors (not just the first 10 on different lines)\n\n\tComments  bool // Print comments (true if nil *Options provided)\n\tTabIndent bool // Use tabs for indent (true if nil *Options provided)\n\tTabWidth  int  // Tab width (8 if nil *Options provided)\n\n\tFormatOnly bool // Disable the insertion and deletion of imports\n}\n\n// Process formats and adjusts imports for the provided file.\n// If opt is nil the defaults are used.\n//\n// Note that filename's directory influences which imports can be chosen,\n// so it is important that filename be accurate.\n// To process data ``as if'' it were in filename, pass the data as a non-nil src.\nfunc Process(filename string, src []byte, opt *Options) ([]byte, error) {\n\tif opt == nil {\n\t\topt = &Options{Comments: true, TabIndent: true, TabWidth: 8}\n\t}\n\n\tfileSet := token.NewFileSet()\n\tfile, adjust, err := parse(fileSet, filename, src, opt)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif !opt.FormatOnly {\n\t\t_, err = fixImports(fileSet, file, filename)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\tsortImports(fileSet, file)\n\timps := astutil.Imports(fileSet, file)\n\n\tvar spacesBefore []string // import paths we need spaces before\n\tfor _, impSection := range imps {\n\t\t// Within each block of contiguous imports, see if any\n\t\t// import lines are in different group numbers. If so,\n\t\t// we'll need to put a space between them so it's\n\t\t// compatible with gofmt.\n\t\tlastGroup := -1\n\t\tfor _, importSpec := range impSection {\n\t\t\timportPath, _ := strconv.Unquote(importSpec.Path.Value)\n\t\t\tgroupNum := importGroup(importPath)\n\t\t\tif groupNum != lastGroup && lastGroup != -1 {\n\t\t\t\tspacesBefore = append(spacesBefore, importPath)\n\t\t\t}\n\t\t\tlastGroup = groupNum\n\t\t}\n\n\t}\n\n\tprinterMode := printer.UseSpaces\n\tif opt.TabIndent {\n\t\tprinterMode |= printer.TabIndent\n\t}\n\tprintConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth}\n\n\tvar buf bytes.Buffer\n\terr = printConfig.Fprint(&buf, fileSet, file)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tout := buf.Bytes()\n\tif adjust != nil {\n\t\tout = adjust(src, out)\n\t}\n\tif len(spacesBefore) > 0 {\n\t\tout = addImportSpaces(bytes.NewReader(out), spacesBefore)\n\t}\n\n\tout, err = format.Source(out)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn out, nil\n}\n\n// parse parses src, which was read from filename,\n// as a Go source file or statement list.\nfunc parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) {\n\tparserMode := parser.Mode(0)\n\tif opt.Comments {\n\t\tparserMode |= parser.ParseComments\n\t}\n\tif opt.AllErrors {\n\t\tparserMode |= parser.AllErrors\n\t}\n\n\t// Try as whole source file.\n\tfile, err := parser.ParseFile(fset, filename, src, parserMode)\n\tif err == nil {\n\t\treturn file, nil, nil\n\t}\n\t// If the error is that the source file didn't begin with a\n\t// package line and we accept fragmented input, fall through to\n\t// try as a source fragment.  Stop and return on any other error.\n\tif !opt.Fragment || !strings.Contains(err.Error(), \"expected 'package'\") {\n\t\treturn nil, nil, err\n\t}\n\n\t// If this is a declaration list, make it a source file\n\t// by inserting a package clause.\n\t// Insert using a ;, not a newline, so that the line numbers\n\t// in psrc match the ones in src.\n\tpsrc := append([]byte(\"package main;\"), src...)\n\tfile, err = parser.ParseFile(fset, filename, psrc, parserMode)\n\tif err == nil {\n\t\t// If a main function exists, we will assume this is a main\n\t\t// package and leave the file.\n\t\tif containsMainFunc(file) {\n\t\t\treturn file, nil, nil\n\t\t}\n\n\t\tadjust := func(orig, src []byte) []byte {\n\t\t\t// Remove the package clause.\n\t\t\t// Gofmt has turned the ; into a \\n.\n\t\t\tsrc = src[len(\"package main\\n\"):]\n\t\t\treturn matchSpace(orig, src)\n\t\t}\n\t\treturn file, adjust, nil\n\t}\n\t// If the error is that the source file didn't begin with a\n\t// declaration, fall through to try as a statement list.\n\t// Stop and return on any other error.\n\tif !strings.Contains(err.Error(), \"expected declaration\") {\n\t\treturn nil, nil, err\n\t}\n\n\t// If this is a statement list, make it a source file\n\t// by inserting a package clause and turning the list\n\t// into a function body.  This handles expressions too.\n\t// Insert using a ;, not a newline, so that the line numbers\n\t// in fsrc match the ones in src.\n\tfsrc := append(append([]byte(\"package p; func _() {\"), src...), '}')\n\tfile, err = parser.ParseFile(fset, filename, fsrc, parserMode)\n\tif err == nil {\n\t\tadjust := func(orig, src []byte) []byte {\n\t\t\t// Remove the wrapping.\n\t\t\t// Gofmt has turned the ; into a \\n\\n.\n\t\t\tsrc = src[len(\"package p\\n\\nfunc _() {\"):]\n\t\t\tsrc = src[:len(src)-len(\"}\\n\")]\n\t\t\t// Gofmt has also indented the function body one level.\n\t\t\t// Remove that indent.\n\t\t\tsrc = bytes.Replace(src, []byte(\"\\n\\t\"), []byte(\"\\n\"), -1)\n\t\t\treturn matchSpace(orig, src)\n\t\t}\n\t\treturn file, adjust, nil\n\t}\n\n\t// Failed, and out of options.\n\treturn nil, nil, err\n}\n\n// containsMainFunc checks if a file contains a function declaration with the\n// function signature 'func main()'\nfunc containsMainFunc(file *ast.File) bool {\n\tfor _, decl := range file.Decls {\n\t\tif f, ok := decl.(*ast.FuncDecl); ok {\n\t\t\tif f.Name.Name != \"main\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif len(f.Type.Params.List) != 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif f.Type.Results != nil && len(f.Type.Results.List) != 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc cutSpace(b []byte) (before, middle, after []byte) {\n\ti := 0\n\tfor i < len(b) && (b[i] == ' ' || b[i] == '\\t' || b[i] == '\\n') {\n\t\ti++\n\t}\n\tj := len(b)\n\tfor j > 0 && (b[j-1] == ' ' || b[j-1] == '\\t' || b[j-1] == '\\n') {\n\t\tj--\n\t}\n\tif i <= j {\n\t\treturn b[:i], b[i:j], b[j:]\n\t}\n\treturn nil, nil, b[j:]\n}\n\n// matchSpace reformats src to use the same space context as orig.\n// 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src.\n// 2) matchSpace copies the indentation of the first non-blank line in orig\n//    to every non-blank line in src.\n// 3) matchSpace copies the trailing space from orig and uses it in place\n//   of src's trailing space.\nfunc matchSpace(orig []byte, src []byte) []byte {\n\tbefore, _, after := cutSpace(orig)\n\ti := bytes.LastIndex(before, []byte{'\\n'})\n\tbefore, indent := before[:i+1], before[i+1:]\n\n\t_, src, _ = cutSpace(src)\n\n\tvar b bytes.Buffer\n\tb.Write(before)\n\tfor len(src) > 0 {\n\t\tline := src\n\t\tif i := bytes.IndexByte(line, '\\n'); i >= 0 {\n\t\t\tline, src = line[:i+1], line[i+1:]\n\t\t} else {\n\t\t\tsrc = nil\n\t\t}\n\t\tif len(line) > 0 && line[0] != '\\n' { // not blank\n\t\t\tb.Write(indent)\n\t\t}\n\t\tb.Write(line)\n\t}\n\tb.Write(after)\n\treturn b.Bytes()\n}\n\nvar impLine = regexp.MustCompile(`^\\s+(?:[\\w\\.]+\\s+)?\"(.+)\"`)\n\nfunc addImportSpaces(r io.Reader, breaks []string) []byte {\n\tvar out bytes.Buffer\n\tsc := bufio.NewScanner(r)\n\tinImports := false\n\tdone := false\n\tfor sc.Scan() {\n\t\ts := sc.Text()\n\n\t\tif !inImports && !done && strings.HasPrefix(s, \"import\") {\n\t\t\tinImports = true\n\t\t}\n\t\tif inImports && (strings.HasPrefix(s, \"var\") ||\n\t\t\tstrings.HasPrefix(s, \"func\") ||\n\t\t\tstrings.HasPrefix(s, \"const\") ||\n\t\t\tstrings.HasPrefix(s, \"type\")) {\n\t\t\tdone = true\n\t\t\tinImports = false\n\t\t}\n\t\tif inImports && len(breaks) > 0 {\n\t\t\tif m := impLine.FindStringSubmatch(s); m != nil {\n\t\t\t\tif m[1] == breaks[0] {\n\t\t\t\t\tout.WriteByte('\\n')\n\t\t\t\t\tbreaks = breaks[1:]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfmt.Fprintln(&out, s)\n\t}\n\treturn out.Bytes()\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/mkindex.go",
    "content": "// +build ignore\n\n// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Command mkindex creates the file \"pkgindex.go\" containing an index of the Go\n// standard library. The file is intended to be built as part of the imports\n// package, so that the package may be used in environments where a GOROOT is\n// not available (such as App Engine).\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/build\"\n\t\"go/format\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\nvar (\n\tpkgIndex = make(map[string][]pkg)\n\texports  = make(map[string]map[string]bool)\n)\n\nfunc main() {\n\t// Don't use GOPATH.\n\tctx := build.Default\n\tctx.GOPATH = \"\"\n\n\t// Populate pkgIndex global from GOROOT.\n\tfor _, path := range ctx.SrcDirs() {\n\t\tf, err := os.Open(path)\n\t\tif err != nil {\n\t\t\tlog.Print(err)\n\t\t\tcontinue\n\t\t}\n\t\tchildren, err := f.Readdir(-1)\n\t\tf.Close()\n\t\tif err != nil {\n\t\t\tlog.Print(err)\n\t\t\tcontinue\n\t\t}\n\t\tfor _, child := range children {\n\t\t\tif child.IsDir() {\n\t\t\t\tloadPkg(path, child.Name())\n\t\t\t}\n\t\t}\n\t}\n\t// Populate exports global.\n\tfor _, ps := range pkgIndex {\n\t\tfor _, p := range ps {\n\t\t\te := loadExports(p.dir)\n\t\t\tif e != nil {\n\t\t\t\texports[p.dir] = e\n\t\t\t}\n\t\t}\n\t}\n\n\t// Construct source file.\n\tvar buf bytes.Buffer\n\tfmt.Fprint(&buf, pkgIndexHead)\n\tfmt.Fprintf(&buf, \"var pkgIndexMaster = %#v\\n\", pkgIndex)\n\tfmt.Fprintf(&buf, \"var exportsMaster = %#v\\n\", exports)\n\tsrc := buf.Bytes()\n\n\t// Replace main.pkg type name with pkg.\n\tsrc = bytes.Replace(src, []byte(\"main.pkg\"), []byte(\"pkg\"), -1)\n\t// Replace actual GOROOT with \"/go\".\n\tsrc = bytes.Replace(src, []byte(ctx.GOROOT), []byte(\"/go\"), -1)\n\t// Add some line wrapping.\n\tsrc = bytes.Replace(src, []byte(\"}, \"), []byte(\"},\\n\"), -1)\n\tsrc = bytes.Replace(src, []byte(\"true, \"), []byte(\"true,\\n\"), -1)\n\n\tvar err error\n\tsrc, err = format.Source(src)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Write out source file.\n\terr = ioutil.WriteFile(\"pkgindex.go\", src, 0644)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nconst pkgIndexHead = `package imports\n\nfunc init() {\n\tpkgIndexOnce.Do(func() {\n\t\tpkgIndex.m = pkgIndexMaster\n\t})\n\tloadExports = func(dir string) map[string]bool {\n\t\treturn exportsMaster[dir]\n\t}\n}\n`\n\ntype pkg struct {\n\timportpath string // full pkg import path, e.g. \"net/http\"\n\tdir        string // absolute file path to pkg directory e.g. \"/usr/lib/go/src/fmt\"\n}\n\nvar fset = token.NewFileSet()\n\nfunc loadPkg(root, importpath string) {\n\tshortName := path.Base(importpath)\n\tif shortName == \"testdata\" {\n\t\treturn\n\t}\n\n\tdir := filepath.Join(root, importpath)\n\tpkgIndex[shortName] = append(pkgIndex[shortName], pkg{\n\t\timportpath: importpath,\n\t\tdir:        dir,\n\t})\n\n\tpkgDir, err := os.Open(dir)\n\tif err != nil {\n\t\treturn\n\t}\n\tchildren, err := pkgDir.Readdir(-1)\n\tpkgDir.Close()\n\tif err != nil {\n\t\treturn\n\t}\n\tfor _, child := range children {\n\t\tname := child.Name()\n\t\tif name == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tif c := name[0]; c == '.' || ('0' <= c && c <= '9') {\n\t\t\tcontinue\n\t\t}\n\t\tif child.IsDir() {\n\t\t\tloadPkg(root, filepath.Join(importpath, name))\n\t\t}\n\t}\n}\n\nfunc loadExports(dir string) map[string]bool {\n\texports := make(map[string]bool)\n\tbuildPkg, err := build.ImportDir(dir, 0)\n\tif err != nil {\n\t\tif strings.Contains(err.Error(), \"no buildable Go source files in\") {\n\t\t\treturn nil\n\t\t}\n\t\tlog.Printf(\"could not import %q: %v\", dir, err)\n\t\treturn nil\n\t}\n\tfor _, file := range buildPkg.GoFiles {\n\t\tf, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"could not parse %q: %v\", file, err)\n\t\t\tcontinue\n\t\t}\n\t\tfor name := range f.Scope.Objects {\n\t\t\tif ast.IsExported(name) {\n\t\t\t\texports[name] = true\n\t\t\t}\n\t\t}\n\t}\n\treturn exports\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/mkstdlib.go",
    "content": "// +build ignore\n\n// mkstdlib generates the zstdlib.go file, containing the Go standard\n// library API symbols. It's baked into the binary to avoid scanning\n// GOPATH in the common case.\npackage main\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n)\n\nfunc mustOpen(name string) io.Reader {\n\tf, err := os.Open(name)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\treturn f\n}\n\nfunc api(base string) string {\n\treturn filepath.Join(os.Getenv(\"GOROOT\"), \"api\", base)\n}\n\nvar sym = regexp.MustCompile(`^pkg (\\S+).*?, (?:var|func|type|const) ([A-Z]\\w*)`)\n\nfunc main() {\n\tvar buf bytes.Buffer\n\toutf := func(format string, args ...interface{}) {\n\t\tfmt.Fprintf(&buf, format, args...)\n\t}\n\toutf(\"// AUTO-GENERATED BY mkstdlib.go\\n\\n\")\n\toutf(\"package imports\\n\")\n\toutf(\"var stdlib = map[string]string{\\n\")\n\tf := io.MultiReader(\n\t\tmustOpen(api(\"go1.txt\")),\n\t\tmustOpen(api(\"go1.1.txt\")),\n\t\tmustOpen(api(\"go1.2.txt\")),\n\t\tmustOpen(api(\"go1.3.txt\")),\n\t\tmustOpen(api(\"go1.4.txt\")),\n\t\tmustOpen(api(\"go1.5.txt\")),\n\t\tmustOpen(api(\"go1.6.txt\")),\n\t\tmustOpen(api(\"go1.7.txt\")),\n\t)\n\tsc := bufio.NewScanner(f)\n\tfullImport := map[string]string{} // \"zip.NewReader\" => \"archive/zip\"\n\tambiguous := map[string]bool{}\n\tvar keys []string\n\tfor sc.Scan() {\n\t\tl := sc.Text()\n\t\thas := func(v string) bool { return strings.Contains(l, v) }\n\t\tif has(\"struct, \") || has(\"interface, \") || has(\", method (\") {\n\t\t\tcontinue\n\t\t}\n\t\tif m := sym.FindStringSubmatch(l); m != nil {\n\t\t\tfull := m[1]\n\t\t\tkey := path.Base(full) + \".\" + m[2]\n\t\t\tif exist, ok := fullImport[key]; ok {\n\t\t\t\tif exist != full {\n\t\t\t\t\tambiguous[key] = true\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfullImport[key] = full\n\t\t\t\tkeys = append(keys, key)\n\t\t\t}\n\t\t}\n\t}\n\tif err := sc.Err(); err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tsort.Strings(keys)\n\tfor _, key := range keys {\n\t\tif ambiguous[key] {\n\t\t\toutf(\"\\t// %q is ambiguous\\n\", key)\n\t\t} else {\n\t\t\toutf(\"\\t%q: %q,\\n\", key, fullImport[key])\n\t\t}\n\t}\n\toutf(\"\\n\")\n\tfor _, sym := range [...]string{\"Alignof\", \"ArbitraryType\", \"Offsetof\", \"Pointer\", \"Sizeof\"} {\n\t\toutf(\"\\t%q: %q,\\n\", \"unsafe.\"+sym, \"unsafe\")\n\t}\n\toutf(\"}\\n\")\n\tfmtbuf, err := format.Source(buf.Bytes())\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\terr = ioutil.WriteFile(\"zstdlib.go\", fmtbuf, 0666)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/sortimports.go",
    "content": "// Copyright 2013 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Hacked up copy of go/ast/import.go\n\npackage imports\n\nimport (\n\t\"go/ast\"\n\t\"go/token\"\n\t\"sort\"\n\t\"strconv\"\n)\n\n// sortImports sorts runs of consecutive import lines in import blocks in f.\n// It also removes duplicate imports when it is possible to do so without data loss.\nfunc sortImports(fset *token.FileSet, f *ast.File) {\n\tfor i, d := range f.Decls {\n\t\td, ok := d.(*ast.GenDecl)\n\t\tif !ok || d.Tok != token.IMPORT {\n\t\t\t// Not an import declaration, so we're done.\n\t\t\t// Imports are always first.\n\t\t\tbreak\n\t\t}\n\n\t\tif len(d.Specs) == 0 {\n\t\t\t// Empty import block, remove it.\n\t\t\tf.Decls = append(f.Decls[:i], f.Decls[i+1:]...)\n\t\t}\n\n\t\tif !d.Lparen.IsValid() {\n\t\t\t// Not a block: sorted by default.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Identify and sort runs of specs on successive lines.\n\t\ti := 0\n\t\tspecs := d.Specs[:0]\n\t\tfor j, s := range d.Specs {\n\t\t\tif j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line {\n\t\t\t\t// j begins a new run.  End this one.\n\t\t\t\tspecs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...)\n\t\t\t\ti = j\n\t\t\t}\n\t\t}\n\t\tspecs = append(specs, sortSpecs(fset, f, d.Specs[i:])...)\n\t\td.Specs = specs\n\n\t\t// Deduping can leave a blank line before the rparen; clean that up.\n\t\tif len(d.Specs) > 0 {\n\t\t\tlastSpec := d.Specs[len(d.Specs)-1]\n\t\t\tlastLine := fset.Position(lastSpec.Pos()).Line\n\t\t\tif rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 {\n\t\t\t\tfset.File(d.Rparen).MergeLine(rParenLine - 1)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc importPath(s ast.Spec) string {\n\tt, err := strconv.Unquote(s.(*ast.ImportSpec).Path.Value)\n\tif err == nil {\n\t\treturn t\n\t}\n\treturn \"\"\n}\n\nfunc importName(s ast.Spec) string {\n\tn := s.(*ast.ImportSpec).Name\n\tif n == nil {\n\t\treturn \"\"\n\t}\n\treturn n.Name\n}\n\nfunc importComment(s ast.Spec) string {\n\tc := s.(*ast.ImportSpec).Comment\n\tif c == nil {\n\t\treturn \"\"\n\t}\n\treturn c.Text()\n}\n\n// collapse indicates whether prev may be removed, leaving only next.\nfunc collapse(prev, next ast.Spec) bool {\n\tif importPath(next) != importPath(prev) || importName(next) != importName(prev) {\n\t\treturn false\n\t}\n\treturn prev.(*ast.ImportSpec).Comment == nil\n}\n\ntype posSpan struct {\n\tStart token.Pos\n\tEnd   token.Pos\n}\n\nfunc sortSpecs(fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec {\n\t// Can't short-circuit here even if specs are already sorted,\n\t// since they might yet need deduplication.\n\t// A lone import, however, may be safely ignored.\n\tif len(specs) <= 1 {\n\t\treturn specs\n\t}\n\n\t// Record positions for specs.\n\tpos := make([]posSpan, len(specs))\n\tfor i, s := range specs {\n\t\tpos[i] = posSpan{s.Pos(), s.End()}\n\t}\n\n\t// Identify comments in this range.\n\t// Any comment from pos[0].Start to the final line counts.\n\tlastLine := fset.Position(pos[len(pos)-1].End).Line\n\tcstart := len(f.Comments)\n\tcend := len(f.Comments)\n\tfor i, g := range f.Comments {\n\t\tif g.Pos() < pos[0].Start {\n\t\t\tcontinue\n\t\t}\n\t\tif i < cstart {\n\t\t\tcstart = i\n\t\t}\n\t\tif fset.Position(g.End()).Line > lastLine {\n\t\t\tcend = i\n\t\t\tbreak\n\t\t}\n\t}\n\tcomments := f.Comments[cstart:cend]\n\n\t// Assign each comment to the import spec preceding it.\n\timportComment := map[*ast.ImportSpec][]*ast.CommentGroup{}\n\tspecIndex := 0\n\tfor _, g := range comments {\n\t\tfor specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() {\n\t\t\tspecIndex++\n\t\t}\n\t\ts := specs[specIndex].(*ast.ImportSpec)\n\t\timportComment[s] = append(importComment[s], g)\n\t}\n\n\t// Sort the import specs by import path.\n\t// Remove duplicates, when possible without data loss.\n\t// Reassign the import paths to have the same position sequence.\n\t// Reassign each comment to abut the end of its spec.\n\t// Sort the comments by new position.\n\tsort.Sort(byImportSpec(specs))\n\n\t// Dedup. Thanks to our sorting, we can just consider\n\t// adjacent pairs of imports.\n\tdeduped := specs[:0]\n\tfor i, s := range specs {\n\t\tif i == len(specs)-1 || !collapse(s, specs[i+1]) {\n\t\t\tdeduped = append(deduped, s)\n\t\t} else {\n\t\t\tp := s.Pos()\n\t\t\tfset.File(p).MergeLine(fset.Position(p).Line)\n\t\t}\n\t}\n\tspecs = deduped\n\n\t// Fix up comment positions\n\tfor i, s := range specs {\n\t\ts := s.(*ast.ImportSpec)\n\t\tif s.Name != nil {\n\t\t\ts.Name.NamePos = pos[i].Start\n\t\t}\n\t\ts.Path.ValuePos = pos[i].Start\n\t\ts.EndPos = pos[i].End\n\t\tfor _, g := range importComment[s] {\n\t\t\tfor _, c := range g.List {\n\t\t\t\tc.Slash = pos[i].End\n\t\t\t}\n\t\t}\n\t}\n\n\tsort.Sort(byCommentPos(comments))\n\n\treturn specs\n}\n\ntype byImportSpec []ast.Spec // slice of *ast.ImportSpec\n\nfunc (x byImportSpec) Len() int      { return len(x) }\nfunc (x byImportSpec) Swap(i, j int) { x[i], x[j] = x[j], x[i] }\nfunc (x byImportSpec) Less(i, j int) bool {\n\tipath := importPath(x[i])\n\tjpath := importPath(x[j])\n\n\tigroup := importGroup(ipath)\n\tjgroup := importGroup(jpath)\n\tif igroup != jgroup {\n\t\treturn igroup < jgroup\n\t}\n\n\tif ipath != jpath {\n\t\treturn ipath < jpath\n\t}\n\tiname := importName(x[i])\n\tjname := importName(x[j])\n\n\tif iname != jname {\n\t\treturn iname < jname\n\t}\n\treturn importComment(x[i]) < importComment(x[j])\n}\n\ntype byCommentPos []*ast.CommentGroup\n\nfunc (x byCommentPos) Len() int           { return len(x) }\nfunc (x byCommentPos) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }\nfunc (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() }\n"
  },
  {
    "path": "vendor/golang.org/x/tools/imports/zstdlib.go",
    "content": "// AUTO-GENERATED BY mkstdlib.go\n\npackage imports\n\nvar stdlib = map[string]string{\n\t\"adler32.Checksum\":                              \"hash/adler32\",\n\t\"adler32.New\":                                   \"hash/adler32\",\n\t\"adler32.Size\":                                  \"hash/adler32\",\n\t\"aes.BlockSize\":                                 \"crypto/aes\",\n\t\"aes.KeySizeError\":                              \"crypto/aes\",\n\t\"aes.NewCipher\":                                 \"crypto/aes\",\n\t\"ascii85.CorruptInputError\":                     \"encoding/ascii85\",\n\t\"ascii85.Decode\":                                \"encoding/ascii85\",\n\t\"ascii85.Encode\":                                \"encoding/ascii85\",\n\t\"ascii85.MaxEncodedLen\":                         \"encoding/ascii85\",\n\t\"ascii85.NewDecoder\":                            \"encoding/ascii85\",\n\t\"ascii85.NewEncoder\":                            \"encoding/ascii85\",\n\t\"asn1.BitString\":                                \"encoding/asn1\",\n\t\"asn1.ClassApplication\":                         \"encoding/asn1\",\n\t\"asn1.ClassContextSpecific\":                     \"encoding/asn1\",\n\t\"asn1.ClassPrivate\":                             \"encoding/asn1\",\n\t\"asn1.ClassUniversal\":                           \"encoding/asn1\",\n\t\"asn1.Enumerated\":                               \"encoding/asn1\",\n\t\"asn1.Flag\":                                     \"encoding/asn1\",\n\t\"asn1.Marshal\":                                  \"encoding/asn1\",\n\t\"asn1.ObjectIdentifier\":                         \"encoding/asn1\",\n\t\"asn1.RawContent\":                               \"encoding/asn1\",\n\t\"asn1.RawValue\":                                 \"encoding/asn1\",\n\t\"asn1.StructuralError\":                          \"encoding/asn1\",\n\t\"asn1.SyntaxError\":                              \"encoding/asn1\",\n\t\"asn1.TagBitString\":                             \"encoding/asn1\",\n\t\"asn1.TagBoolean\":                               \"encoding/asn1\",\n\t\"asn1.TagEnum\":                                  \"encoding/asn1\",\n\t\"asn1.TagGeneralString\":                         \"encoding/asn1\",\n\t\"asn1.TagGeneralizedTime\":                       \"encoding/asn1\",\n\t\"asn1.TagIA5String\":                             \"encoding/asn1\",\n\t\"asn1.TagInteger\":                               \"encoding/asn1\",\n\t\"asn1.TagOID\":                                   \"encoding/asn1\",\n\t\"asn1.TagOctetString\":                           \"encoding/asn1\",\n\t\"asn1.TagPrintableString\":                       \"encoding/asn1\",\n\t\"asn1.TagSequence\":                              \"encoding/asn1\",\n\t\"asn1.TagSet\":                                   \"encoding/asn1\",\n\t\"asn1.TagT61String\":                             \"encoding/asn1\",\n\t\"asn1.TagUTCTime\":                               \"encoding/asn1\",\n\t\"asn1.TagUTF8String\":                            \"encoding/asn1\",\n\t\"asn1.Unmarshal\":                                \"encoding/asn1\",\n\t\"asn1.UnmarshalWithParams\":                      \"encoding/asn1\",\n\t\"ast.ArrayType\":                                 \"go/ast\",\n\t\"ast.AssignStmt\":                                \"go/ast\",\n\t\"ast.Bad\":                                       \"go/ast\",\n\t\"ast.BadDecl\":                                   \"go/ast\",\n\t\"ast.BadExpr\":                                   \"go/ast\",\n\t\"ast.BadStmt\":                                   \"go/ast\",\n\t\"ast.BasicLit\":                                  \"go/ast\",\n\t\"ast.BinaryExpr\":                                \"go/ast\",\n\t\"ast.BlockStmt\":                                 \"go/ast\",\n\t\"ast.BranchStmt\":                                \"go/ast\",\n\t\"ast.CallExpr\":                                  \"go/ast\",\n\t\"ast.CaseClause\":                                \"go/ast\",\n\t\"ast.ChanDir\":                                   \"go/ast\",\n\t\"ast.ChanType\":                                  \"go/ast\",\n\t\"ast.CommClause\":                                \"go/ast\",\n\t\"ast.Comment\":                                   \"go/ast\",\n\t\"ast.CommentGroup\":                              \"go/ast\",\n\t\"ast.CommentMap\":                                \"go/ast\",\n\t\"ast.CompositeLit\":                              \"go/ast\",\n\t\"ast.Con\":                                       \"go/ast\",\n\t\"ast.DeclStmt\":                                  \"go/ast\",\n\t\"ast.DeferStmt\":                                 \"go/ast\",\n\t\"ast.Ellipsis\":                                  \"go/ast\",\n\t\"ast.EmptyStmt\":                                 \"go/ast\",\n\t\"ast.ExprStmt\":                                  \"go/ast\",\n\t\"ast.Field\":                                     \"go/ast\",\n\t\"ast.FieldFilter\":                               \"go/ast\",\n\t\"ast.FieldList\":                                 \"go/ast\",\n\t\"ast.File\":                                      \"go/ast\",\n\t\"ast.FileExports\":                               \"go/ast\",\n\t\"ast.Filter\":                                    \"go/ast\",\n\t\"ast.FilterDecl\":                                \"go/ast\",\n\t\"ast.FilterFile\":                                \"go/ast\",\n\t\"ast.FilterFuncDuplicates\":                      \"go/ast\",\n\t\"ast.FilterImportDuplicates\":                    \"go/ast\",\n\t\"ast.FilterPackage\":                             \"go/ast\",\n\t\"ast.FilterUnassociatedComments\":                \"go/ast\",\n\t\"ast.ForStmt\":                                   \"go/ast\",\n\t\"ast.Fprint\":                                    \"go/ast\",\n\t\"ast.Fun\":                                       \"go/ast\",\n\t\"ast.FuncDecl\":                                  \"go/ast\",\n\t\"ast.FuncLit\":                                   \"go/ast\",\n\t\"ast.FuncType\":                                  \"go/ast\",\n\t\"ast.GenDecl\":                                   \"go/ast\",\n\t\"ast.GoStmt\":                                    \"go/ast\",\n\t\"ast.Ident\":                                     \"go/ast\",\n\t\"ast.IfStmt\":                                    \"go/ast\",\n\t\"ast.ImportSpec\":                                \"go/ast\",\n\t\"ast.Importer\":                                  \"go/ast\",\n\t\"ast.IncDecStmt\":                                \"go/ast\",\n\t\"ast.IndexExpr\":                                 \"go/ast\",\n\t\"ast.Inspect\":                                   \"go/ast\",\n\t\"ast.InterfaceType\":                             \"go/ast\",\n\t\"ast.IsExported\":                                \"go/ast\",\n\t\"ast.KeyValueExpr\":                              \"go/ast\",\n\t\"ast.LabeledStmt\":                               \"go/ast\",\n\t\"ast.Lbl\":                                       \"go/ast\",\n\t\"ast.MapType\":                                   \"go/ast\",\n\t\"ast.MergeMode\":                                 \"go/ast\",\n\t\"ast.MergePackageFiles\":                         \"go/ast\",\n\t\"ast.NewCommentMap\":                             \"go/ast\",\n\t\"ast.NewIdent\":                                  \"go/ast\",\n\t\"ast.NewObj\":                                    \"go/ast\",\n\t\"ast.NewPackage\":                                \"go/ast\",\n\t\"ast.NewScope\":                                  \"go/ast\",\n\t\"ast.Node\":                                      \"go/ast\",\n\t\"ast.NotNilFilter\":                              \"go/ast\",\n\t\"ast.ObjKind\":                                   \"go/ast\",\n\t\"ast.Object\":                                    \"go/ast\",\n\t\"ast.Package\":                                   \"go/ast\",\n\t\"ast.PackageExports\":                            \"go/ast\",\n\t\"ast.ParenExpr\":                                 \"go/ast\",\n\t\"ast.Pkg\":                                       \"go/ast\",\n\t\"ast.Print\":                                     \"go/ast\",\n\t\"ast.RECV\":                                      \"go/ast\",\n\t\"ast.RangeStmt\":                                 \"go/ast\",\n\t\"ast.ReturnStmt\":                                \"go/ast\",\n\t\"ast.SEND\":                                      \"go/ast\",\n\t\"ast.Scope\":                                     \"go/ast\",\n\t\"ast.SelectStmt\":                                \"go/ast\",\n\t\"ast.SelectorExpr\":                              \"go/ast\",\n\t\"ast.SendStmt\":                                  \"go/ast\",\n\t\"ast.SliceExpr\":                                 \"go/ast\",\n\t\"ast.SortImports\":                               \"go/ast\",\n\t\"ast.StarExpr\":                                  \"go/ast\",\n\t\"ast.StructType\":                                \"go/ast\",\n\t\"ast.SwitchStmt\":                                \"go/ast\",\n\t\"ast.Typ\":                                       \"go/ast\",\n\t\"ast.TypeAssertExpr\":                            \"go/ast\",\n\t\"ast.TypeSpec\":                                  \"go/ast\",\n\t\"ast.TypeSwitchStmt\":                            \"go/ast\",\n\t\"ast.UnaryExpr\":                                 \"go/ast\",\n\t\"ast.ValueSpec\":                                 \"go/ast\",\n\t\"ast.Var\":                                       \"go/ast\",\n\t\"ast.Visitor\":                                   \"go/ast\",\n\t\"ast.Walk\":                                      \"go/ast\",\n\t\"atomic.AddInt32\":                               \"sync/atomic\",\n\t\"atomic.AddInt64\":                               \"sync/atomic\",\n\t\"atomic.AddUint32\":                              \"sync/atomic\",\n\t\"atomic.AddUint64\":                              \"sync/atomic\",\n\t\"atomic.AddUintptr\":                             \"sync/atomic\",\n\t\"atomic.CompareAndSwapInt32\":                    \"sync/atomic\",\n\t\"atomic.CompareAndSwapInt64\":                    \"sync/atomic\",\n\t\"atomic.CompareAndSwapPointer\":                  \"sync/atomic\",\n\t\"atomic.CompareAndSwapUint32\":                   \"sync/atomic\",\n\t\"atomic.CompareAndSwapUint64\":                   \"sync/atomic\",\n\t\"atomic.CompareAndSwapUintptr\":                  \"sync/atomic\",\n\t\"atomic.LoadInt32\":                              \"sync/atomic\",\n\t\"atomic.LoadInt64\":                              \"sync/atomic\",\n\t\"atomic.LoadPointer\":                            \"sync/atomic\",\n\t\"atomic.LoadUint32\":                             \"sync/atomic\",\n\t\"atomic.LoadUint64\":                             \"sync/atomic\",\n\t\"atomic.LoadUintptr\":                            \"sync/atomic\",\n\t\"atomic.StoreInt32\":                             \"sync/atomic\",\n\t\"atomic.StoreInt64\":                             \"sync/atomic\",\n\t\"atomic.StorePointer\":                           \"sync/atomic\",\n\t\"atomic.StoreUint32\":                            \"sync/atomic\",\n\t\"atomic.StoreUint64\":                            \"sync/atomic\",\n\t\"atomic.StoreUintptr\":                           \"sync/atomic\",\n\t\"atomic.SwapInt32\":                              \"sync/atomic\",\n\t\"atomic.SwapInt64\":                              \"sync/atomic\",\n\t\"atomic.SwapPointer\":                            \"sync/atomic\",\n\t\"atomic.SwapUint32\":                             \"sync/atomic\",\n\t\"atomic.SwapUint64\":                             \"sync/atomic\",\n\t\"atomic.SwapUintptr\":                            \"sync/atomic\",\n\t\"atomic.Value\":                                  \"sync/atomic\",\n\t\"base32.CorruptInputError\":                      \"encoding/base32\",\n\t\"base32.Encoding\":                               \"encoding/base32\",\n\t\"base32.HexEncoding\":                            \"encoding/base32\",\n\t\"base32.NewDecoder\":                             \"encoding/base32\",\n\t\"base32.NewEncoder\":                             \"encoding/base32\",\n\t\"base32.NewEncoding\":                            \"encoding/base32\",\n\t\"base32.StdEncoding\":                            \"encoding/base32\",\n\t\"base64.CorruptInputError\":                      \"encoding/base64\",\n\t\"base64.Encoding\":                               \"encoding/base64\",\n\t\"base64.NewDecoder\":                             \"encoding/base64\",\n\t\"base64.NewEncoder\":                             \"encoding/base64\",\n\t\"base64.NewEncoding\":                            \"encoding/base64\",\n\t\"base64.NoPadding\":                              \"encoding/base64\",\n\t\"base64.RawStdEncoding\":                         \"encoding/base64\",\n\t\"base64.RawURLEncoding\":                         \"encoding/base64\",\n\t\"base64.StdEncoding\":                            \"encoding/base64\",\n\t\"base64.StdPadding\":                             \"encoding/base64\",\n\t\"base64.URLEncoding\":                            \"encoding/base64\",\n\t\"big.Above\":                                     \"math/big\",\n\t\"big.Accuracy\":                                  \"math/big\",\n\t\"big.AwayFromZero\":                              \"math/big\",\n\t\"big.Below\":                                     \"math/big\",\n\t\"big.ErrNaN\":                                    \"math/big\",\n\t\"big.Exact\":                                     \"math/big\",\n\t\"big.Float\":                                     \"math/big\",\n\t\"big.Int\":                                       \"math/big\",\n\t\"big.Jacobi\":                                    \"math/big\",\n\t\"big.MaxBase\":                                   \"math/big\",\n\t\"big.MaxExp\":                                    \"math/big\",\n\t\"big.MaxPrec\":                                   \"math/big\",\n\t\"big.MinExp\":                                    \"math/big\",\n\t\"big.NewFloat\":                                  \"math/big\",\n\t\"big.NewInt\":                                    \"math/big\",\n\t\"big.NewRat\":                                    \"math/big\",\n\t\"big.ParseFloat\":                                \"math/big\",\n\t\"big.Rat\":                                       \"math/big\",\n\t\"big.RoundingMode\":                              \"math/big\",\n\t\"big.ToNearestAway\":                             \"math/big\",\n\t\"big.ToNearestEven\":                             \"math/big\",\n\t\"big.ToNegativeInf\":                             \"math/big\",\n\t\"big.ToPositiveInf\":                             \"math/big\",\n\t\"big.ToZero\":                                    \"math/big\",\n\t\"big.Word\":                                      \"math/big\",\n\t\"binary.BigEndian\":                              \"encoding/binary\",\n\t\"binary.ByteOrder\":                              \"encoding/binary\",\n\t\"binary.LittleEndian\":                           \"encoding/binary\",\n\t\"binary.MaxVarintLen16\":                         \"encoding/binary\",\n\t\"binary.MaxVarintLen32\":                         \"encoding/binary\",\n\t\"binary.MaxVarintLen64\":                         \"encoding/binary\",\n\t\"binary.PutUvarint\":                             \"encoding/binary\",\n\t\"binary.PutVarint\":                              \"encoding/binary\",\n\t\"binary.Read\":                                   \"encoding/binary\",\n\t\"binary.ReadUvarint\":                            \"encoding/binary\",\n\t\"binary.ReadVarint\":                             \"encoding/binary\",\n\t\"binary.Size\":                                   \"encoding/binary\",\n\t\"binary.Uvarint\":                                \"encoding/binary\",\n\t\"binary.Varint\":                                 \"encoding/binary\",\n\t\"binary.Write\":                                  \"encoding/binary\",\n\t\"bufio.ErrAdvanceTooFar\":                        \"bufio\",\n\t\"bufio.ErrBufferFull\":                           \"bufio\",\n\t\"bufio.ErrFinalToken\":                           \"bufio\",\n\t\"bufio.ErrInvalidUnreadByte\":                    \"bufio\",\n\t\"bufio.ErrInvalidUnreadRune\":                    \"bufio\",\n\t\"bufio.ErrNegativeAdvance\":                      \"bufio\",\n\t\"bufio.ErrNegativeCount\":                        \"bufio\",\n\t\"bufio.ErrTooLong\":                              \"bufio\",\n\t\"bufio.MaxScanTokenSize\":                        \"bufio\",\n\t\"bufio.NewReadWriter\":                           \"bufio\",\n\t\"bufio.NewReader\":                               \"bufio\",\n\t\"bufio.NewReaderSize\":                           \"bufio\",\n\t\"bufio.NewScanner\":                              \"bufio\",\n\t\"bufio.NewWriter\":                               \"bufio\",\n\t\"bufio.NewWriterSize\":                           \"bufio\",\n\t\"bufio.ReadWriter\":                              \"bufio\",\n\t\"bufio.Reader\":                                  \"bufio\",\n\t\"bufio.ScanBytes\":                               \"bufio\",\n\t\"bufio.ScanLines\":                               \"bufio\",\n\t\"bufio.ScanRunes\":                               \"bufio\",\n\t\"bufio.ScanWords\":                               \"bufio\",\n\t\"bufio.Scanner\":                                 \"bufio\",\n\t\"bufio.SplitFunc\":                               \"bufio\",\n\t\"bufio.Writer\":                                  \"bufio\",\n\t\"build.AllowBinary\":                             \"go/build\",\n\t\"build.ArchChar\":                                \"go/build\",\n\t\"build.Context\":                                 \"go/build\",\n\t\"build.Default\":                                 \"go/build\",\n\t\"build.FindOnly\":                                \"go/build\",\n\t\"build.IgnoreVendor\":                            \"go/build\",\n\t\"build.Import\":                                  \"go/build\",\n\t\"build.ImportComment\":                           \"go/build\",\n\t\"build.ImportDir\":                               \"go/build\",\n\t\"build.ImportMode\":                              \"go/build\",\n\t\"build.IsLocalImport\":                           \"go/build\",\n\t\"build.MultiplePackageError\":                    \"go/build\",\n\t\"build.NoGoError\":                               \"go/build\",\n\t\"build.Package\":                                 \"go/build\",\n\t\"build.ToolDir\":                                 \"go/build\",\n\t\"bytes.Buffer\":                                  \"bytes\",\n\t\"bytes.Compare\":                                 \"bytes\",\n\t\"bytes.Contains\":                                \"bytes\",\n\t\"bytes.ContainsAny\":                             \"bytes\",\n\t\"bytes.ContainsRune\":                            \"bytes\",\n\t\"bytes.Count\":                                   \"bytes\",\n\t\"bytes.Equal\":                                   \"bytes\",\n\t\"bytes.EqualFold\":                               \"bytes\",\n\t\"bytes.ErrTooLarge\":                             \"bytes\",\n\t\"bytes.Fields\":                                  \"bytes\",\n\t\"bytes.FieldsFunc\":                              \"bytes\",\n\t\"bytes.HasPrefix\":                               \"bytes\",\n\t\"bytes.HasSuffix\":                               \"bytes\",\n\t\"bytes.Index\":                                   \"bytes\",\n\t\"bytes.IndexAny\":                                \"bytes\",\n\t\"bytes.IndexByte\":                               \"bytes\",\n\t\"bytes.IndexFunc\":                               \"bytes\",\n\t\"bytes.IndexRune\":                               \"bytes\",\n\t\"bytes.Join\":                                    \"bytes\",\n\t\"bytes.LastIndex\":                               \"bytes\",\n\t\"bytes.LastIndexAny\":                            \"bytes\",\n\t\"bytes.LastIndexByte\":                           \"bytes\",\n\t\"bytes.LastIndexFunc\":                           \"bytes\",\n\t\"bytes.Map\":                                     \"bytes\",\n\t\"bytes.MinRead\":                                 \"bytes\",\n\t\"bytes.NewBuffer\":                               \"bytes\",\n\t\"bytes.NewBufferString\":                         \"bytes\",\n\t\"bytes.NewReader\":                               \"bytes\",\n\t\"bytes.Reader\":                                  \"bytes\",\n\t\"bytes.Repeat\":                                  \"bytes\",\n\t\"bytes.Replace\":                                 \"bytes\",\n\t\"bytes.Runes\":                                   \"bytes\",\n\t\"bytes.Split\":                                   \"bytes\",\n\t\"bytes.SplitAfter\":                              \"bytes\",\n\t\"bytes.SplitAfterN\":                             \"bytes\",\n\t\"bytes.SplitN\":                                  \"bytes\",\n\t\"bytes.Title\":                                   \"bytes\",\n\t\"bytes.ToLower\":                                 \"bytes\",\n\t\"bytes.ToLowerSpecial\":                          \"bytes\",\n\t\"bytes.ToTitle\":                                 \"bytes\",\n\t\"bytes.ToTitleSpecial\":                          \"bytes\",\n\t\"bytes.ToUpper\":                                 \"bytes\",\n\t\"bytes.ToUpperSpecial\":                          \"bytes\",\n\t\"bytes.Trim\":                                    \"bytes\",\n\t\"bytes.TrimFunc\":                                \"bytes\",\n\t\"bytes.TrimLeft\":                                \"bytes\",\n\t\"bytes.TrimLeftFunc\":                            \"bytes\",\n\t\"bytes.TrimPrefix\":                              \"bytes\",\n\t\"bytes.TrimRight\":                               \"bytes\",\n\t\"bytes.TrimRightFunc\":                           \"bytes\",\n\t\"bytes.TrimSpace\":                               \"bytes\",\n\t\"bytes.TrimSuffix\":                              \"bytes\",\n\t\"bzip2.NewReader\":                               \"compress/bzip2\",\n\t\"bzip2.StructuralError\":                         \"compress/bzip2\",\n\t\"cgi.Handler\":                                   \"net/http/cgi\",\n\t\"cgi.Request\":                                   \"net/http/cgi\",\n\t\"cgi.RequestFromMap\":                            \"net/http/cgi\",\n\t\"cgi.Serve\":                                     \"net/http/cgi\",\n\t\"cipher.AEAD\":                                   \"crypto/cipher\",\n\t\"cipher.Block\":                                  \"crypto/cipher\",\n\t\"cipher.BlockMode\":                              \"crypto/cipher\",\n\t\"cipher.NewCBCDecrypter\":                        \"crypto/cipher\",\n\t\"cipher.NewCBCEncrypter\":                        \"crypto/cipher\",\n\t\"cipher.NewCFBDecrypter\":                        \"crypto/cipher\",\n\t\"cipher.NewCFBEncrypter\":                        \"crypto/cipher\",\n\t\"cipher.NewCTR\":                                 \"crypto/cipher\",\n\t\"cipher.NewGCM\":                                 \"crypto/cipher\",\n\t\"cipher.NewGCMWithNonceSize\":                    \"crypto/cipher\",\n\t\"cipher.NewOFB\":                                 \"crypto/cipher\",\n\t\"cipher.Stream\":                                 \"crypto/cipher\",\n\t\"cipher.StreamReader\":                           \"crypto/cipher\",\n\t\"cipher.StreamWriter\":                           \"crypto/cipher\",\n\t\"cmplx.Abs\":                                     \"math/cmplx\",\n\t\"cmplx.Acos\":                                    \"math/cmplx\",\n\t\"cmplx.Acosh\":                                   \"math/cmplx\",\n\t\"cmplx.Asin\":                                    \"math/cmplx\",\n\t\"cmplx.Asinh\":                                   \"math/cmplx\",\n\t\"cmplx.Atan\":                                    \"math/cmplx\",\n\t\"cmplx.Atanh\":                                   \"math/cmplx\",\n\t\"cmplx.Conj\":                                    \"math/cmplx\",\n\t\"cmplx.Cos\":                                     \"math/cmplx\",\n\t\"cmplx.Cosh\":                                    \"math/cmplx\",\n\t\"cmplx.Cot\":                                     \"math/cmplx\",\n\t\"cmplx.Exp\":                                     \"math/cmplx\",\n\t\"cmplx.Inf\":                                     \"math/cmplx\",\n\t\"cmplx.IsInf\":                                   \"math/cmplx\",\n\t\"cmplx.IsNaN\":                                   \"math/cmplx\",\n\t\"cmplx.Log\":                                     \"math/cmplx\",\n\t\"cmplx.Log10\":                                   \"math/cmplx\",\n\t\"cmplx.NaN\":                                     \"math/cmplx\",\n\t\"cmplx.Phase\":                                   \"math/cmplx\",\n\t\"cmplx.Polar\":                                   \"math/cmplx\",\n\t\"cmplx.Pow\":                                     \"math/cmplx\",\n\t\"cmplx.Rect\":                                    \"math/cmplx\",\n\t\"cmplx.Sin\":                                     \"math/cmplx\",\n\t\"cmplx.Sinh\":                                    \"math/cmplx\",\n\t\"cmplx.Sqrt\":                                    \"math/cmplx\",\n\t\"cmplx.Tan\":                                     \"math/cmplx\",\n\t\"cmplx.Tanh\":                                    \"math/cmplx\",\n\t\"color.Alpha\":                                   \"image/color\",\n\t\"color.Alpha16\":                                 \"image/color\",\n\t\"color.Alpha16Model\":                            \"image/color\",\n\t\"color.AlphaModel\":                              \"image/color\",\n\t\"color.Black\":                                   \"image/color\",\n\t\"color.CMYK\":                                    \"image/color\",\n\t\"color.CMYKModel\":                               \"image/color\",\n\t\"color.CMYKToRGB\":                               \"image/color\",\n\t\"color.Color\":                                   \"image/color\",\n\t\"color.Gray\":                                    \"image/color\",\n\t\"color.Gray16\":                                  \"image/color\",\n\t\"color.Gray16Model\":                             \"image/color\",\n\t\"color.GrayModel\":                               \"image/color\",\n\t\"color.Model\":                                   \"image/color\",\n\t\"color.ModelFunc\":                               \"image/color\",\n\t\"color.NRGBA\":                                   \"image/color\",\n\t\"color.NRGBA64\":                                 \"image/color\",\n\t\"color.NRGBA64Model\":                            \"image/color\",\n\t\"color.NRGBAModel\":                              \"image/color\",\n\t\"color.NYCbCrA\":                                 \"image/color\",\n\t\"color.NYCbCrAModel\":                            \"image/color\",\n\t\"color.Opaque\":                                  \"image/color\",\n\t\"color.Palette\":                                 \"image/color\",\n\t\"color.RGBA\":                                    \"image/color\",\n\t\"color.RGBA64\":                                  \"image/color\",\n\t\"color.RGBA64Model\":                             \"image/color\",\n\t\"color.RGBAModel\":                               \"image/color\",\n\t\"color.RGBToCMYK\":                               \"image/color\",\n\t\"color.RGBToYCbCr\":                              \"image/color\",\n\t\"color.Transparent\":                             \"image/color\",\n\t\"color.White\":                                   \"image/color\",\n\t\"color.YCbCr\":                                   \"image/color\",\n\t\"color.YCbCrModel\":                              \"image/color\",\n\t\"color.YCbCrToRGB\":                              \"image/color\",\n\t\"constant.BinaryOp\":                             \"go/constant\",\n\t\"constant.BitLen\":                               \"go/constant\",\n\t\"constant.Bool\":                                 \"go/constant\",\n\t\"constant.BoolVal\":                              \"go/constant\",\n\t\"constant.Bytes\":                                \"go/constant\",\n\t\"constant.Compare\":                              \"go/constant\",\n\t\"constant.Complex\":                              \"go/constant\",\n\t\"constant.Denom\":                                \"go/constant\",\n\t\"constant.Float\":                                \"go/constant\",\n\t\"constant.Float32Val\":                           \"go/constant\",\n\t\"constant.Float64Val\":                           \"go/constant\",\n\t\"constant.Imag\":                                 \"go/constant\",\n\t\"constant.Int\":                                  \"go/constant\",\n\t\"constant.Int64Val\":                             \"go/constant\",\n\t\"constant.Kind\":                                 \"go/constant\",\n\t\"constant.MakeBool\":                             \"go/constant\",\n\t\"constant.MakeFloat64\":                          \"go/constant\",\n\t\"constant.MakeFromBytes\":                        \"go/constant\",\n\t\"constant.MakeFromLiteral\":                      \"go/constant\",\n\t\"constant.MakeImag\":                             \"go/constant\",\n\t\"constant.MakeInt64\":                            \"go/constant\",\n\t\"constant.MakeString\":                           \"go/constant\",\n\t\"constant.MakeUint64\":                           \"go/constant\",\n\t\"constant.MakeUnknown\":                          \"go/constant\",\n\t\"constant.Num\":                                  \"go/constant\",\n\t\"constant.Real\":                                 \"go/constant\",\n\t\"constant.Shift\":                                \"go/constant\",\n\t\"constant.Sign\":                                 \"go/constant\",\n\t\"constant.String\":                               \"go/constant\",\n\t\"constant.StringVal\":                            \"go/constant\",\n\t\"constant.ToComplex\":                            \"go/constant\",\n\t\"constant.ToFloat\":                              \"go/constant\",\n\t\"constant.ToInt\":                                \"go/constant\",\n\t\"constant.Uint64Val\":                            \"go/constant\",\n\t\"constant.UnaryOp\":                              \"go/constant\",\n\t\"constant.Unknown\":                              \"go/constant\",\n\t\"context.Background\":                            \"context\",\n\t\"context.CancelFunc\":                            \"context\",\n\t\"context.Canceled\":                              \"context\",\n\t\"context.Context\":                               \"context\",\n\t\"context.DeadlineExceeded\":                      \"context\",\n\t\"context.TODO\":                                  \"context\",\n\t\"context.WithCancel\":                            \"context\",\n\t\"context.WithDeadline\":                          \"context\",\n\t\"context.WithTimeout\":                           \"context\",\n\t\"context.WithValue\":                             \"context\",\n\t\"cookiejar.Jar\":                                 \"net/http/cookiejar\",\n\t\"cookiejar.New\":                                 \"net/http/cookiejar\",\n\t\"cookiejar.Options\":                             \"net/http/cookiejar\",\n\t\"cookiejar.PublicSuffixList\":                    \"net/http/cookiejar\",\n\t\"crc32.Castagnoli\":                              \"hash/crc32\",\n\t\"crc32.Checksum\":                                \"hash/crc32\",\n\t\"crc32.ChecksumIEEE\":                            \"hash/crc32\",\n\t\"crc32.IEEE\":                                    \"hash/crc32\",\n\t\"crc32.IEEETable\":                               \"hash/crc32\",\n\t\"crc32.Koopman\":                                 \"hash/crc32\",\n\t\"crc32.MakeTable\":                               \"hash/crc32\",\n\t\"crc32.New\":                                     \"hash/crc32\",\n\t\"crc32.NewIEEE\":                                 \"hash/crc32\",\n\t\"crc32.Size\":                                    \"hash/crc32\",\n\t\"crc32.Table\":                                   \"hash/crc32\",\n\t\"crc32.Update\":                                  \"hash/crc32\",\n\t\"crc64.Checksum\":                                \"hash/crc64\",\n\t\"crc64.ECMA\":                                    \"hash/crc64\",\n\t\"crc64.ISO\":                                     \"hash/crc64\",\n\t\"crc64.MakeTable\":                               \"hash/crc64\",\n\t\"crc64.New\":                                     \"hash/crc64\",\n\t\"crc64.Size\":                                    \"hash/crc64\",\n\t\"crc64.Table\":                                   \"hash/crc64\",\n\t\"crc64.Update\":                                  \"hash/crc64\",\n\t\"crypto.Decrypter\":                              \"crypto\",\n\t\"crypto.DecrypterOpts\":                          \"crypto\",\n\t\"crypto.Hash\":                                   \"crypto\",\n\t\"crypto.MD4\":                                    \"crypto\",\n\t\"crypto.MD5\":                                    \"crypto\",\n\t\"crypto.MD5SHA1\":                                \"crypto\",\n\t\"crypto.PrivateKey\":                             \"crypto\",\n\t\"crypto.PublicKey\":                              \"crypto\",\n\t\"crypto.RIPEMD160\":                              \"crypto\",\n\t\"crypto.RegisterHash\":                           \"crypto\",\n\t\"crypto.SHA1\":                                   \"crypto\",\n\t\"crypto.SHA224\":                                 \"crypto\",\n\t\"crypto.SHA256\":                                 \"crypto\",\n\t\"crypto.SHA384\":                                 \"crypto\",\n\t\"crypto.SHA3_224\":                               \"crypto\",\n\t\"crypto.SHA3_256\":                               \"crypto\",\n\t\"crypto.SHA3_384\":                               \"crypto\",\n\t\"crypto.SHA3_512\":                               \"crypto\",\n\t\"crypto.SHA512\":                                 \"crypto\",\n\t\"crypto.SHA512_224\":                             \"crypto\",\n\t\"crypto.SHA512_256\":                             \"crypto\",\n\t\"crypto.Signer\":                                 \"crypto\",\n\t\"crypto.SignerOpts\":                             \"crypto\",\n\t\"csv.ErrBareQuote\":                              \"encoding/csv\",\n\t\"csv.ErrFieldCount\":                             \"encoding/csv\",\n\t\"csv.ErrQuote\":                                  \"encoding/csv\",\n\t\"csv.ErrTrailingComma\":                          \"encoding/csv\",\n\t\"csv.NewReader\":                                 \"encoding/csv\",\n\t\"csv.NewWriter\":                                 \"encoding/csv\",\n\t\"csv.ParseError\":                                \"encoding/csv\",\n\t\"csv.Reader\":                                    \"encoding/csv\",\n\t\"csv.Writer\":                                    \"encoding/csv\",\n\t\"debug.FreeOSMemory\":                            \"runtime/debug\",\n\t\"debug.GCStats\":                                 \"runtime/debug\",\n\t\"debug.PrintStack\":                              \"runtime/debug\",\n\t\"debug.ReadGCStats\":                             \"runtime/debug\",\n\t\"debug.SetGCPercent\":                            \"runtime/debug\",\n\t\"debug.SetMaxStack\":                             \"runtime/debug\",\n\t\"debug.SetMaxThreads\":                           \"runtime/debug\",\n\t\"debug.SetPanicOnFault\":                         \"runtime/debug\",\n\t\"debug.SetTraceback\":                            \"runtime/debug\",\n\t\"debug.Stack\":                                   \"runtime/debug\",\n\t\"debug.WriteHeapDump\":                           \"runtime/debug\",\n\t\"des.BlockSize\":                                 \"crypto/des\",\n\t\"des.KeySizeError\":                              \"crypto/des\",\n\t\"des.NewCipher\":                                 \"crypto/des\",\n\t\"des.NewTripleDESCipher\":                        \"crypto/des\",\n\t\"doc.AllDecls\":                                  \"go/doc\",\n\t\"doc.AllMethods\":                                \"go/doc\",\n\t\"doc.Example\":                                   \"go/doc\",\n\t\"doc.Examples\":                                  \"go/doc\",\n\t\"doc.Filter\":                                    \"go/doc\",\n\t\"doc.Func\":                                      \"go/doc\",\n\t\"doc.IllegalPrefixes\":                           \"go/doc\",\n\t\"doc.Mode\":                                      \"go/doc\",\n\t\"doc.New\":                                       \"go/doc\",\n\t\"doc.Note\":                                      \"go/doc\",\n\t\"doc.Package\":                                   \"go/doc\",\n\t\"doc.Synopsis\":                                  \"go/doc\",\n\t\"doc.ToHTML\":                                    \"go/doc\",\n\t\"doc.ToText\":                                    \"go/doc\",\n\t\"doc.Type\":                                      \"go/doc\",\n\t\"doc.Value\":                                     \"go/doc\",\n\t\"draw.Draw\":                                     \"image/draw\",\n\t\"draw.DrawMask\":                                 \"image/draw\",\n\t\"draw.Drawer\":                                   \"image/draw\",\n\t\"draw.FloydSteinberg\":                           \"image/draw\",\n\t\"draw.Image\":                                    \"image/draw\",\n\t\"draw.Op\":                                       \"image/draw\",\n\t\"draw.Over\":                                     \"image/draw\",\n\t\"draw.Quantizer\":                                \"image/draw\",\n\t\"draw.Src\":                                      \"image/draw\",\n\t\"driver.Bool\":                                   \"database/sql/driver\",\n\t\"driver.ColumnConverter\":                        \"database/sql/driver\",\n\t\"driver.Conn\":                                   \"database/sql/driver\",\n\t\"driver.DefaultParameterConverter\":              \"database/sql/driver\",\n\t\"driver.Driver\":                                 \"database/sql/driver\",\n\t\"driver.ErrBadConn\":                             \"database/sql/driver\",\n\t\"driver.ErrSkip\":                                \"database/sql/driver\",\n\t\"driver.Execer\":                                 \"database/sql/driver\",\n\t\"driver.Int32\":                                  \"database/sql/driver\",\n\t\"driver.IsScanValue\":                            \"database/sql/driver\",\n\t\"driver.IsValue\":                                \"database/sql/driver\",\n\t\"driver.NotNull\":                                \"database/sql/driver\",\n\t\"driver.Null\":                                   \"database/sql/driver\",\n\t\"driver.Queryer\":                                \"database/sql/driver\",\n\t\"driver.Result\":                                 \"database/sql/driver\",\n\t\"driver.ResultNoRows\":                           \"database/sql/driver\",\n\t\"driver.Rows\":                                   \"database/sql/driver\",\n\t\"driver.RowsAffected\":                           \"database/sql/driver\",\n\t\"driver.Stmt\":                                   \"database/sql/driver\",\n\t\"driver.String\":                                 \"database/sql/driver\",\n\t\"driver.Tx\":                                     \"database/sql/driver\",\n\t\"driver.Value\":                                  \"database/sql/driver\",\n\t\"driver.ValueConverter\":                         \"database/sql/driver\",\n\t\"driver.Valuer\":                                 \"database/sql/driver\",\n\t\"dsa.ErrInvalidPublicKey\":                       \"crypto/dsa\",\n\t\"dsa.GenerateKey\":                               \"crypto/dsa\",\n\t\"dsa.GenerateParameters\":                        \"crypto/dsa\",\n\t\"dsa.L1024N160\":                                 \"crypto/dsa\",\n\t\"dsa.L2048N224\":                                 \"crypto/dsa\",\n\t\"dsa.L2048N256\":                                 \"crypto/dsa\",\n\t\"dsa.L3072N256\":                                 \"crypto/dsa\",\n\t\"dsa.ParameterSizes\":                            \"crypto/dsa\",\n\t\"dsa.Parameters\":                                \"crypto/dsa\",\n\t\"dsa.PrivateKey\":                                \"crypto/dsa\",\n\t\"dsa.PublicKey\":                                 \"crypto/dsa\",\n\t\"dsa.Sign\":                                      \"crypto/dsa\",\n\t\"dsa.Verify\":                                    \"crypto/dsa\",\n\t\"dwarf.AddrType\":                                \"debug/dwarf\",\n\t\"dwarf.ArrayType\":                               \"debug/dwarf\",\n\t\"dwarf.Attr\":                                    \"debug/dwarf\",\n\t\"dwarf.AttrAbstractOrigin\":                      \"debug/dwarf\",\n\t\"dwarf.AttrAccessibility\":                       \"debug/dwarf\",\n\t\"dwarf.AttrAddrClass\":                           \"debug/dwarf\",\n\t\"dwarf.AttrAllocated\":                           \"debug/dwarf\",\n\t\"dwarf.AttrArtificial\":                          \"debug/dwarf\",\n\t\"dwarf.AttrAssociated\":                          \"debug/dwarf\",\n\t\"dwarf.AttrBaseTypes\":                           \"debug/dwarf\",\n\t\"dwarf.AttrBitOffset\":                           \"debug/dwarf\",\n\t\"dwarf.AttrBitSize\":                             \"debug/dwarf\",\n\t\"dwarf.AttrByteSize\":                            \"debug/dwarf\",\n\t\"dwarf.AttrCallColumn\":                          \"debug/dwarf\",\n\t\"dwarf.AttrCallFile\":                            \"debug/dwarf\",\n\t\"dwarf.AttrCallLine\":                            \"debug/dwarf\",\n\t\"dwarf.AttrCalling\":                             \"debug/dwarf\",\n\t\"dwarf.AttrCommonRef\":                           \"debug/dwarf\",\n\t\"dwarf.AttrCompDir\":                             \"debug/dwarf\",\n\t\"dwarf.AttrConstValue\":                          \"debug/dwarf\",\n\t\"dwarf.AttrContainingType\":                      \"debug/dwarf\",\n\t\"dwarf.AttrCount\":                               \"debug/dwarf\",\n\t\"dwarf.AttrDataLocation\":                        \"debug/dwarf\",\n\t\"dwarf.AttrDataMemberLoc\":                       \"debug/dwarf\",\n\t\"dwarf.AttrDeclColumn\":                          \"debug/dwarf\",\n\t\"dwarf.AttrDeclFile\":                            \"debug/dwarf\",\n\t\"dwarf.AttrDeclLine\":                            \"debug/dwarf\",\n\t\"dwarf.AttrDeclaration\":                         \"debug/dwarf\",\n\t\"dwarf.AttrDefaultValue\":                        \"debug/dwarf\",\n\t\"dwarf.AttrDescription\":                         \"debug/dwarf\",\n\t\"dwarf.AttrDiscr\":                               \"debug/dwarf\",\n\t\"dwarf.AttrDiscrList\":                           \"debug/dwarf\",\n\t\"dwarf.AttrDiscrValue\":                          \"debug/dwarf\",\n\t\"dwarf.AttrEncoding\":                            \"debug/dwarf\",\n\t\"dwarf.AttrEntrypc\":                             \"debug/dwarf\",\n\t\"dwarf.AttrExtension\":                           \"debug/dwarf\",\n\t\"dwarf.AttrExternal\":                            \"debug/dwarf\",\n\t\"dwarf.AttrFrameBase\":                           \"debug/dwarf\",\n\t\"dwarf.AttrFriend\":                              \"debug/dwarf\",\n\t\"dwarf.AttrHighpc\":                              \"debug/dwarf\",\n\t\"dwarf.AttrIdentifierCase\":                      \"debug/dwarf\",\n\t\"dwarf.AttrImport\":                              \"debug/dwarf\",\n\t\"dwarf.AttrInline\":                              \"debug/dwarf\",\n\t\"dwarf.AttrIsOptional\":                          \"debug/dwarf\",\n\t\"dwarf.AttrLanguage\":                            \"debug/dwarf\",\n\t\"dwarf.AttrLocation\":                            \"debug/dwarf\",\n\t\"dwarf.AttrLowerBound\":                          \"debug/dwarf\",\n\t\"dwarf.AttrLowpc\":                               \"debug/dwarf\",\n\t\"dwarf.AttrMacroInfo\":                           \"debug/dwarf\",\n\t\"dwarf.AttrName\":                                \"debug/dwarf\",\n\t\"dwarf.AttrNamelistItem\":                        \"debug/dwarf\",\n\t\"dwarf.AttrOrdering\":                            \"debug/dwarf\",\n\t\"dwarf.AttrPriority\":                            \"debug/dwarf\",\n\t\"dwarf.AttrProducer\":                            \"debug/dwarf\",\n\t\"dwarf.AttrPrototyped\":                          \"debug/dwarf\",\n\t\"dwarf.AttrRanges\":                              \"debug/dwarf\",\n\t\"dwarf.AttrReturnAddr\":                          \"debug/dwarf\",\n\t\"dwarf.AttrSegment\":                             \"debug/dwarf\",\n\t\"dwarf.AttrSibling\":                             \"debug/dwarf\",\n\t\"dwarf.AttrSpecification\":                       \"debug/dwarf\",\n\t\"dwarf.AttrStartScope\":                          \"debug/dwarf\",\n\t\"dwarf.AttrStaticLink\":                          \"debug/dwarf\",\n\t\"dwarf.AttrStmtList\":                            \"debug/dwarf\",\n\t\"dwarf.AttrStride\":                              \"debug/dwarf\",\n\t\"dwarf.AttrStrideSize\":                          \"debug/dwarf\",\n\t\"dwarf.AttrStringLength\":                        \"debug/dwarf\",\n\t\"dwarf.AttrTrampoline\":                          \"debug/dwarf\",\n\t\"dwarf.AttrType\":                                \"debug/dwarf\",\n\t\"dwarf.AttrUpperBound\":                          \"debug/dwarf\",\n\t\"dwarf.AttrUseLocation\":                         \"debug/dwarf\",\n\t\"dwarf.AttrUseUTF8\":                             \"debug/dwarf\",\n\t\"dwarf.AttrVarParam\":                            \"debug/dwarf\",\n\t\"dwarf.AttrVirtuality\":                          \"debug/dwarf\",\n\t\"dwarf.AttrVisibility\":                          \"debug/dwarf\",\n\t\"dwarf.AttrVtableElemLoc\":                       \"debug/dwarf\",\n\t\"dwarf.BasicType\":                               \"debug/dwarf\",\n\t\"dwarf.BoolType\":                                \"debug/dwarf\",\n\t\"dwarf.CharType\":                                \"debug/dwarf\",\n\t\"dwarf.Class\":                                   \"debug/dwarf\",\n\t\"dwarf.ClassAddress\":                            \"debug/dwarf\",\n\t\"dwarf.ClassBlock\":                              \"debug/dwarf\",\n\t\"dwarf.ClassConstant\":                           \"debug/dwarf\",\n\t\"dwarf.ClassExprLoc\":                            \"debug/dwarf\",\n\t\"dwarf.ClassFlag\":                               \"debug/dwarf\",\n\t\"dwarf.ClassLinePtr\":                            \"debug/dwarf\",\n\t\"dwarf.ClassLocListPtr\":                         \"debug/dwarf\",\n\t\"dwarf.ClassMacPtr\":                             \"debug/dwarf\",\n\t\"dwarf.ClassRangeListPtr\":                       \"debug/dwarf\",\n\t\"dwarf.ClassReference\":                          \"debug/dwarf\",\n\t\"dwarf.ClassReferenceAlt\":                       \"debug/dwarf\",\n\t\"dwarf.ClassReferenceSig\":                       \"debug/dwarf\",\n\t\"dwarf.ClassString\":                             \"debug/dwarf\",\n\t\"dwarf.ClassStringAlt\":                          \"debug/dwarf\",\n\t\"dwarf.ClassUnknown\":                            \"debug/dwarf\",\n\t\"dwarf.CommonType\":                              \"debug/dwarf\",\n\t\"dwarf.ComplexType\":                             \"debug/dwarf\",\n\t\"dwarf.Data\":                                    \"debug/dwarf\",\n\t\"dwarf.DecodeError\":                             \"debug/dwarf\",\n\t\"dwarf.DotDotDotType\":                           \"debug/dwarf\",\n\t\"dwarf.Entry\":                                   \"debug/dwarf\",\n\t\"dwarf.EnumType\":                                \"debug/dwarf\",\n\t\"dwarf.EnumValue\":                               \"debug/dwarf\",\n\t\"dwarf.ErrUnknownPC\":                            \"debug/dwarf\",\n\t\"dwarf.Field\":                                   \"debug/dwarf\",\n\t\"dwarf.FloatType\":                               \"debug/dwarf\",\n\t\"dwarf.FuncType\":                                \"debug/dwarf\",\n\t\"dwarf.IntType\":                                 \"debug/dwarf\",\n\t\"dwarf.LineEntry\":                               \"debug/dwarf\",\n\t\"dwarf.LineFile\":                                \"debug/dwarf\",\n\t\"dwarf.LineReader\":                              \"debug/dwarf\",\n\t\"dwarf.LineReaderPos\":                           \"debug/dwarf\",\n\t\"dwarf.New\":                                     \"debug/dwarf\",\n\t\"dwarf.Offset\":                                  \"debug/dwarf\",\n\t\"dwarf.PtrType\":                                 \"debug/dwarf\",\n\t\"dwarf.QualType\":                                \"debug/dwarf\",\n\t\"dwarf.Reader\":                                  \"debug/dwarf\",\n\t\"dwarf.StructField\":                             \"debug/dwarf\",\n\t\"dwarf.StructType\":                              \"debug/dwarf\",\n\t\"dwarf.Tag\":                                     \"debug/dwarf\",\n\t\"dwarf.TagAccessDeclaration\":                    \"debug/dwarf\",\n\t\"dwarf.TagArrayType\":                            \"debug/dwarf\",\n\t\"dwarf.TagBaseType\":                             \"debug/dwarf\",\n\t\"dwarf.TagCatchDwarfBlock\":                      \"debug/dwarf\",\n\t\"dwarf.TagClassType\":                            \"debug/dwarf\",\n\t\"dwarf.TagCommonDwarfBlock\":                     \"debug/dwarf\",\n\t\"dwarf.TagCommonInclusion\":                      \"debug/dwarf\",\n\t\"dwarf.TagCompileUnit\":                          \"debug/dwarf\",\n\t\"dwarf.TagCondition\":                            \"debug/dwarf\",\n\t\"dwarf.TagConstType\":                            \"debug/dwarf\",\n\t\"dwarf.TagConstant\":                             \"debug/dwarf\",\n\t\"dwarf.TagDwarfProcedure\":                       \"debug/dwarf\",\n\t\"dwarf.TagEntryPoint\":                           \"debug/dwarf\",\n\t\"dwarf.TagEnumerationType\":                      \"debug/dwarf\",\n\t\"dwarf.TagEnumerator\":                           \"debug/dwarf\",\n\t\"dwarf.TagFileType\":                             \"debug/dwarf\",\n\t\"dwarf.TagFormalParameter\":                      \"debug/dwarf\",\n\t\"dwarf.TagFriend\":                               \"debug/dwarf\",\n\t\"dwarf.TagImportedDeclaration\":                  \"debug/dwarf\",\n\t\"dwarf.TagImportedModule\":                       \"debug/dwarf\",\n\t\"dwarf.TagImportedUnit\":                         \"debug/dwarf\",\n\t\"dwarf.TagInheritance\":                          \"debug/dwarf\",\n\t\"dwarf.TagInlinedSubroutine\":                    \"debug/dwarf\",\n\t\"dwarf.TagInterfaceType\":                        \"debug/dwarf\",\n\t\"dwarf.TagLabel\":                                \"debug/dwarf\",\n\t\"dwarf.TagLexDwarfBlock\":                        \"debug/dwarf\",\n\t\"dwarf.TagMember\":                               \"debug/dwarf\",\n\t\"dwarf.TagModule\":                               \"debug/dwarf\",\n\t\"dwarf.TagMutableType\":                          \"debug/dwarf\",\n\t\"dwarf.TagNamelist\":                             \"debug/dwarf\",\n\t\"dwarf.TagNamelistItem\":                         \"debug/dwarf\",\n\t\"dwarf.TagNamespace\":                            \"debug/dwarf\",\n\t\"dwarf.TagPackedType\":                           \"debug/dwarf\",\n\t\"dwarf.TagPartialUnit\":                          \"debug/dwarf\",\n\t\"dwarf.TagPointerType\":                          \"debug/dwarf\",\n\t\"dwarf.TagPtrToMemberType\":                      \"debug/dwarf\",\n\t\"dwarf.TagReferenceType\":                        \"debug/dwarf\",\n\t\"dwarf.TagRestrictType\":                         \"debug/dwarf\",\n\t\"dwarf.TagRvalueReferenceType\":                  \"debug/dwarf\",\n\t\"dwarf.TagSetType\":                              \"debug/dwarf\",\n\t\"dwarf.TagSharedType\":                           \"debug/dwarf\",\n\t\"dwarf.TagStringType\":                           \"debug/dwarf\",\n\t\"dwarf.TagStructType\":                           \"debug/dwarf\",\n\t\"dwarf.TagSubprogram\":                           \"debug/dwarf\",\n\t\"dwarf.TagSubrangeType\":                         \"debug/dwarf\",\n\t\"dwarf.TagSubroutineType\":                       \"debug/dwarf\",\n\t\"dwarf.TagTemplateAlias\":                        \"debug/dwarf\",\n\t\"dwarf.TagTemplateTypeParameter\":                \"debug/dwarf\",\n\t\"dwarf.TagTemplateValueParameter\":               \"debug/dwarf\",\n\t\"dwarf.TagThrownType\":                           \"debug/dwarf\",\n\t\"dwarf.TagTryDwarfBlock\":                        \"debug/dwarf\",\n\t\"dwarf.TagTypeUnit\":                             \"debug/dwarf\",\n\t\"dwarf.TagTypedef\":                              \"debug/dwarf\",\n\t\"dwarf.TagUnionType\":                            \"debug/dwarf\",\n\t\"dwarf.TagUnspecifiedParameters\":                \"debug/dwarf\",\n\t\"dwarf.TagUnspecifiedType\":                      \"debug/dwarf\",\n\t\"dwarf.TagVariable\":                             \"debug/dwarf\",\n\t\"dwarf.TagVariant\":                              \"debug/dwarf\",\n\t\"dwarf.TagVariantPart\":                          \"debug/dwarf\",\n\t\"dwarf.TagVolatileType\":                         \"debug/dwarf\",\n\t\"dwarf.TagWithStmt\":                             \"debug/dwarf\",\n\t\"dwarf.Type\":                                    \"debug/dwarf\",\n\t\"dwarf.TypedefType\":                             \"debug/dwarf\",\n\t\"dwarf.UcharType\":                               \"debug/dwarf\",\n\t\"dwarf.UintType\":                                \"debug/dwarf\",\n\t\"dwarf.UnspecifiedType\":                         \"debug/dwarf\",\n\t\"dwarf.VoidType\":                                \"debug/dwarf\",\n\t\"ecdsa.GenerateKey\":                             \"crypto/ecdsa\",\n\t\"ecdsa.PrivateKey\":                              \"crypto/ecdsa\",\n\t\"ecdsa.PublicKey\":                               \"crypto/ecdsa\",\n\t\"ecdsa.Sign\":                                    \"crypto/ecdsa\",\n\t\"ecdsa.Verify\":                                  \"crypto/ecdsa\",\n\t\"elf.ARM_MAGIC_TRAMP_NUMBER\":                    \"debug/elf\",\n\t\"elf.COMPRESS_HIOS\":                             \"debug/elf\",\n\t\"elf.COMPRESS_HIPROC\":                           \"debug/elf\",\n\t\"elf.COMPRESS_LOOS\":                             \"debug/elf\",\n\t\"elf.COMPRESS_LOPROC\":                           \"debug/elf\",\n\t\"elf.COMPRESS_ZLIB\":                             \"debug/elf\",\n\t\"elf.Chdr32\":                                    \"debug/elf\",\n\t\"elf.Chdr64\":                                    \"debug/elf\",\n\t\"elf.Class\":                                     \"debug/elf\",\n\t\"elf.CompressionType\":                           \"debug/elf\",\n\t\"elf.DF_BIND_NOW\":                               \"debug/elf\",\n\t\"elf.DF_ORIGIN\":                                 \"debug/elf\",\n\t\"elf.DF_STATIC_TLS\":                             \"debug/elf\",\n\t\"elf.DF_SYMBOLIC\":                               \"debug/elf\",\n\t\"elf.DF_TEXTREL\":                                \"debug/elf\",\n\t\"elf.DT_BIND_NOW\":                               \"debug/elf\",\n\t\"elf.DT_DEBUG\":                                  \"debug/elf\",\n\t\"elf.DT_ENCODING\":                               \"debug/elf\",\n\t\"elf.DT_FINI\":                                   \"debug/elf\",\n\t\"elf.DT_FINI_ARRAY\":                             \"debug/elf\",\n\t\"elf.DT_FINI_ARRAYSZ\":                           \"debug/elf\",\n\t\"elf.DT_FLAGS\":                                  \"debug/elf\",\n\t\"elf.DT_HASH\":                                   \"debug/elf\",\n\t\"elf.DT_HIOS\":                                   \"debug/elf\",\n\t\"elf.DT_HIPROC\":                                 \"debug/elf\",\n\t\"elf.DT_INIT\":                                   \"debug/elf\",\n\t\"elf.DT_INIT_ARRAY\":                             \"debug/elf\",\n\t\"elf.DT_INIT_ARRAYSZ\":                           \"debug/elf\",\n\t\"elf.DT_JMPREL\":                                 \"debug/elf\",\n\t\"elf.DT_LOOS\":                                   \"debug/elf\",\n\t\"elf.DT_LOPROC\":                                 \"debug/elf\",\n\t\"elf.DT_NEEDED\":                                 \"debug/elf\",\n\t\"elf.DT_NULL\":                                   \"debug/elf\",\n\t\"elf.DT_PLTGOT\":                                 \"debug/elf\",\n\t\"elf.DT_PLTREL\":                                 \"debug/elf\",\n\t\"elf.DT_PLTRELSZ\":                               \"debug/elf\",\n\t\"elf.DT_PREINIT_ARRAY\":                          \"debug/elf\",\n\t\"elf.DT_PREINIT_ARRAYSZ\":                        \"debug/elf\",\n\t\"elf.DT_REL\":                                    \"debug/elf\",\n\t\"elf.DT_RELA\":                                   \"debug/elf\",\n\t\"elf.DT_RELAENT\":                                \"debug/elf\",\n\t\"elf.DT_RELASZ\":                                 \"debug/elf\",\n\t\"elf.DT_RELENT\":                                 \"debug/elf\",\n\t\"elf.DT_RELSZ\":                                  \"debug/elf\",\n\t\"elf.DT_RPATH\":                                  \"debug/elf\",\n\t\"elf.DT_RUNPATH\":                                \"debug/elf\",\n\t\"elf.DT_SONAME\":                                 \"debug/elf\",\n\t\"elf.DT_STRSZ\":                                  \"debug/elf\",\n\t\"elf.DT_STRTAB\":                                 \"debug/elf\",\n\t\"elf.DT_SYMBOLIC\":                               \"debug/elf\",\n\t\"elf.DT_SYMENT\":                                 \"debug/elf\",\n\t\"elf.DT_SYMTAB\":                                 \"debug/elf\",\n\t\"elf.DT_TEXTREL\":                                \"debug/elf\",\n\t\"elf.DT_VERNEED\":                                \"debug/elf\",\n\t\"elf.DT_VERNEEDNUM\":                             \"debug/elf\",\n\t\"elf.DT_VERSYM\":                                 \"debug/elf\",\n\t\"elf.Data\":                                      \"debug/elf\",\n\t\"elf.Dyn32\":                                     \"debug/elf\",\n\t\"elf.Dyn64\":                                     \"debug/elf\",\n\t\"elf.DynFlag\":                                   \"debug/elf\",\n\t\"elf.DynTag\":                                    \"debug/elf\",\n\t\"elf.EI_ABIVERSION\":                             \"debug/elf\",\n\t\"elf.EI_CLASS\":                                  \"debug/elf\",\n\t\"elf.EI_DATA\":                                   \"debug/elf\",\n\t\"elf.EI_NIDENT\":                                 \"debug/elf\",\n\t\"elf.EI_OSABI\":                                  \"debug/elf\",\n\t\"elf.EI_PAD\":                                    \"debug/elf\",\n\t\"elf.EI_VERSION\":                                \"debug/elf\",\n\t\"elf.ELFCLASS32\":                                \"debug/elf\",\n\t\"elf.ELFCLASS64\":                                \"debug/elf\",\n\t\"elf.ELFCLASSNONE\":                              \"debug/elf\",\n\t\"elf.ELFDATA2LSB\":                               \"debug/elf\",\n\t\"elf.ELFDATA2MSB\":                               \"debug/elf\",\n\t\"elf.ELFDATANONE\":                               \"debug/elf\",\n\t\"elf.ELFMAG\":                                    \"debug/elf\",\n\t\"elf.ELFOSABI_86OPEN\":                           \"debug/elf\",\n\t\"elf.ELFOSABI_AIX\":                              \"debug/elf\",\n\t\"elf.ELFOSABI_ARM\":                              \"debug/elf\",\n\t\"elf.ELFOSABI_FREEBSD\":                          \"debug/elf\",\n\t\"elf.ELFOSABI_HPUX\":                             \"debug/elf\",\n\t\"elf.ELFOSABI_HURD\":                             \"debug/elf\",\n\t\"elf.ELFOSABI_IRIX\":                             \"debug/elf\",\n\t\"elf.ELFOSABI_LINUX\":                            \"debug/elf\",\n\t\"elf.ELFOSABI_MODESTO\":                          \"debug/elf\",\n\t\"elf.ELFOSABI_NETBSD\":                           \"debug/elf\",\n\t\"elf.ELFOSABI_NONE\":                             \"debug/elf\",\n\t\"elf.ELFOSABI_NSK\":                              \"debug/elf\",\n\t\"elf.ELFOSABI_OPENBSD\":                          \"debug/elf\",\n\t\"elf.ELFOSABI_OPENVMS\":                          \"debug/elf\",\n\t\"elf.ELFOSABI_SOLARIS\":                          \"debug/elf\",\n\t\"elf.ELFOSABI_STANDALONE\":                       \"debug/elf\",\n\t\"elf.ELFOSABI_TRU64\":                            \"debug/elf\",\n\t\"elf.EM_386\":                                    \"debug/elf\",\n\t\"elf.EM_486\":                                    \"debug/elf\",\n\t\"elf.EM_68HC12\":                                 \"debug/elf\",\n\t\"elf.EM_68K\":                                    \"debug/elf\",\n\t\"elf.EM_860\":                                    \"debug/elf\",\n\t\"elf.EM_88K\":                                    \"debug/elf\",\n\t\"elf.EM_960\":                                    \"debug/elf\",\n\t\"elf.EM_AARCH64\":                                \"debug/elf\",\n\t\"elf.EM_ALPHA\":                                  \"debug/elf\",\n\t\"elf.EM_ALPHA_STD\":                              \"debug/elf\",\n\t\"elf.EM_ARC\":                                    \"debug/elf\",\n\t\"elf.EM_ARM\":                                    \"debug/elf\",\n\t\"elf.EM_COLDFIRE\":                               \"debug/elf\",\n\t\"elf.EM_FR20\":                                   \"debug/elf\",\n\t\"elf.EM_H8S\":                                    \"debug/elf\",\n\t\"elf.EM_H8_300\":                                 \"debug/elf\",\n\t\"elf.EM_H8_300H\":                                \"debug/elf\",\n\t\"elf.EM_H8_500\":                                 \"debug/elf\",\n\t\"elf.EM_IA_64\":                                  \"debug/elf\",\n\t\"elf.EM_M32\":                                    \"debug/elf\",\n\t\"elf.EM_ME16\":                                   \"debug/elf\",\n\t\"elf.EM_MIPS\":                                   \"debug/elf\",\n\t\"elf.EM_MIPS_RS3_LE\":                            \"debug/elf\",\n\t\"elf.EM_MIPS_RS4_BE\":                            \"debug/elf\",\n\t\"elf.EM_MIPS_X\":                                 \"debug/elf\",\n\t\"elf.EM_MMA\":                                    \"debug/elf\",\n\t\"elf.EM_NCPU\":                                   \"debug/elf\",\n\t\"elf.EM_NDR1\":                                   \"debug/elf\",\n\t\"elf.EM_NONE\":                                   \"debug/elf\",\n\t\"elf.EM_PARISC\":                                 \"debug/elf\",\n\t\"elf.EM_PCP\":                                    \"debug/elf\",\n\t\"elf.EM_PPC\":                                    \"debug/elf\",\n\t\"elf.EM_PPC64\":                                  \"debug/elf\",\n\t\"elf.EM_RCE\":                                    \"debug/elf\",\n\t\"elf.EM_RH32\":                                   \"debug/elf\",\n\t\"elf.EM_S370\":                                   \"debug/elf\",\n\t\"elf.EM_S390\":                                   \"debug/elf\",\n\t\"elf.EM_SH\":                                     \"debug/elf\",\n\t\"elf.EM_SPARC\":                                  \"debug/elf\",\n\t\"elf.EM_SPARC32PLUS\":                            \"debug/elf\",\n\t\"elf.EM_SPARCV9\":                                \"debug/elf\",\n\t\"elf.EM_ST100\":                                  \"debug/elf\",\n\t\"elf.EM_STARCORE\":                               \"debug/elf\",\n\t\"elf.EM_TINYJ\":                                  \"debug/elf\",\n\t\"elf.EM_TRICORE\":                                \"debug/elf\",\n\t\"elf.EM_V800\":                                   \"debug/elf\",\n\t\"elf.EM_VPP500\":                                 \"debug/elf\",\n\t\"elf.EM_X86_64\":                                 \"debug/elf\",\n\t\"elf.ET_CORE\":                                   \"debug/elf\",\n\t\"elf.ET_DYN\":                                    \"debug/elf\",\n\t\"elf.ET_EXEC\":                                   \"debug/elf\",\n\t\"elf.ET_HIOS\":                                   \"debug/elf\",\n\t\"elf.ET_HIPROC\":                                 \"debug/elf\",\n\t\"elf.ET_LOOS\":                                   \"debug/elf\",\n\t\"elf.ET_LOPROC\":                                 \"debug/elf\",\n\t\"elf.ET_NONE\":                                   \"debug/elf\",\n\t\"elf.ET_REL\":                                    \"debug/elf\",\n\t\"elf.EV_CURRENT\":                                \"debug/elf\",\n\t\"elf.EV_NONE\":                                   \"debug/elf\",\n\t\"elf.ErrNoSymbols\":                              \"debug/elf\",\n\t\"elf.File\":                                      \"debug/elf\",\n\t\"elf.FileHeader\":                                \"debug/elf\",\n\t\"elf.FormatError\":                               \"debug/elf\",\n\t\"elf.Header32\":                                  \"debug/elf\",\n\t\"elf.Header64\":                                  \"debug/elf\",\n\t\"elf.ImportedSymbol\":                            \"debug/elf\",\n\t\"elf.Machine\":                                   \"debug/elf\",\n\t\"elf.NT_FPREGSET\":                               \"debug/elf\",\n\t\"elf.NT_PRPSINFO\":                               \"debug/elf\",\n\t\"elf.NT_PRSTATUS\":                               \"debug/elf\",\n\t\"elf.NType\":                                     \"debug/elf\",\n\t\"elf.NewFile\":                                   \"debug/elf\",\n\t\"elf.OSABI\":                                     \"debug/elf\",\n\t\"elf.Open\":                                      \"debug/elf\",\n\t\"elf.PF_MASKOS\":                                 \"debug/elf\",\n\t\"elf.PF_MASKPROC\":                               \"debug/elf\",\n\t\"elf.PF_R\":                                      \"debug/elf\",\n\t\"elf.PF_W\":                                      \"debug/elf\",\n\t\"elf.PF_X\":                                      \"debug/elf\",\n\t\"elf.PT_DYNAMIC\":                                \"debug/elf\",\n\t\"elf.PT_HIOS\":                                   \"debug/elf\",\n\t\"elf.PT_HIPROC\":                                 \"debug/elf\",\n\t\"elf.PT_INTERP\":                                 \"debug/elf\",\n\t\"elf.PT_LOAD\":                                   \"debug/elf\",\n\t\"elf.PT_LOOS\":                                   \"debug/elf\",\n\t\"elf.PT_LOPROC\":                                 \"debug/elf\",\n\t\"elf.PT_NOTE\":                                   \"debug/elf\",\n\t\"elf.PT_NULL\":                                   \"debug/elf\",\n\t\"elf.PT_PHDR\":                                   \"debug/elf\",\n\t\"elf.PT_SHLIB\":                                  \"debug/elf\",\n\t\"elf.PT_TLS\":                                    \"debug/elf\",\n\t\"elf.Prog\":                                      \"debug/elf\",\n\t\"elf.Prog32\":                                    \"debug/elf\",\n\t\"elf.Prog64\":                                    \"debug/elf\",\n\t\"elf.ProgFlag\":                                  \"debug/elf\",\n\t\"elf.ProgHeader\":                                \"debug/elf\",\n\t\"elf.ProgType\":                                  \"debug/elf\",\n\t\"elf.R_386\":                                     \"debug/elf\",\n\t\"elf.R_386_32\":                                  \"debug/elf\",\n\t\"elf.R_386_COPY\":                                \"debug/elf\",\n\t\"elf.R_386_GLOB_DAT\":                            \"debug/elf\",\n\t\"elf.R_386_GOT32\":                               \"debug/elf\",\n\t\"elf.R_386_GOTOFF\":                              \"debug/elf\",\n\t\"elf.R_386_GOTPC\":                               \"debug/elf\",\n\t\"elf.R_386_JMP_SLOT\":                            \"debug/elf\",\n\t\"elf.R_386_NONE\":                                \"debug/elf\",\n\t\"elf.R_386_PC32\":                                \"debug/elf\",\n\t\"elf.R_386_PLT32\":                               \"debug/elf\",\n\t\"elf.R_386_RELATIVE\":                            \"debug/elf\",\n\t\"elf.R_386_TLS_DTPMOD32\":                        \"debug/elf\",\n\t\"elf.R_386_TLS_DTPOFF32\":                        \"debug/elf\",\n\t\"elf.R_386_TLS_GD\":                              \"debug/elf\",\n\t\"elf.R_386_TLS_GD_32\":                           \"debug/elf\",\n\t\"elf.R_386_TLS_GD_CALL\":                         \"debug/elf\",\n\t\"elf.R_386_TLS_GD_POP\":                          \"debug/elf\",\n\t\"elf.R_386_TLS_GD_PUSH\":                         \"debug/elf\",\n\t\"elf.R_386_TLS_GOTIE\":                           \"debug/elf\",\n\t\"elf.R_386_TLS_IE\":                              \"debug/elf\",\n\t\"elf.R_386_TLS_IE_32\":                           \"debug/elf\",\n\t\"elf.R_386_TLS_LDM\":                             \"debug/elf\",\n\t\"elf.R_386_TLS_LDM_32\":                          \"debug/elf\",\n\t\"elf.R_386_TLS_LDM_CALL\":                        \"debug/elf\",\n\t\"elf.R_386_TLS_LDM_POP\":                         \"debug/elf\",\n\t\"elf.R_386_TLS_LDM_PUSH\":                        \"debug/elf\",\n\t\"elf.R_386_TLS_LDO_32\":                          \"debug/elf\",\n\t\"elf.R_386_TLS_LE\":                              \"debug/elf\",\n\t\"elf.R_386_TLS_LE_32\":                           \"debug/elf\",\n\t\"elf.R_386_TLS_TPOFF\":                           \"debug/elf\",\n\t\"elf.R_386_TLS_TPOFF32\":                         \"debug/elf\",\n\t\"elf.R_390\":                                     \"debug/elf\",\n\t\"elf.R_390_12\":                                  \"debug/elf\",\n\t\"elf.R_390_16\":                                  \"debug/elf\",\n\t\"elf.R_390_20\":                                  \"debug/elf\",\n\t\"elf.R_390_32\":                                  \"debug/elf\",\n\t\"elf.R_390_64\":                                  \"debug/elf\",\n\t\"elf.R_390_8\":                                   \"debug/elf\",\n\t\"elf.R_390_COPY\":                                \"debug/elf\",\n\t\"elf.R_390_GLOB_DAT\":                            \"debug/elf\",\n\t\"elf.R_390_GOT12\":                               \"debug/elf\",\n\t\"elf.R_390_GOT16\":                               \"debug/elf\",\n\t\"elf.R_390_GOT20\":                               \"debug/elf\",\n\t\"elf.R_390_GOT32\":                               \"debug/elf\",\n\t\"elf.R_390_GOT64\":                               \"debug/elf\",\n\t\"elf.R_390_GOTENT\":                              \"debug/elf\",\n\t\"elf.R_390_GOTOFF\":                              \"debug/elf\",\n\t\"elf.R_390_GOTOFF16\":                            \"debug/elf\",\n\t\"elf.R_390_GOTOFF64\":                            \"debug/elf\",\n\t\"elf.R_390_GOTPC\":                               \"debug/elf\",\n\t\"elf.R_390_GOTPCDBL\":                            \"debug/elf\",\n\t\"elf.R_390_GOTPLT12\":                            \"debug/elf\",\n\t\"elf.R_390_GOTPLT16\":                            \"debug/elf\",\n\t\"elf.R_390_GOTPLT20\":                            \"debug/elf\",\n\t\"elf.R_390_GOTPLT32\":                            \"debug/elf\",\n\t\"elf.R_390_GOTPLT64\":                            \"debug/elf\",\n\t\"elf.R_390_GOTPLTENT\":                           \"debug/elf\",\n\t\"elf.R_390_GOTPLTOFF16\":                         \"debug/elf\",\n\t\"elf.R_390_GOTPLTOFF32\":                         \"debug/elf\",\n\t\"elf.R_390_GOTPLTOFF64\":                         \"debug/elf\",\n\t\"elf.R_390_JMP_SLOT\":                            \"debug/elf\",\n\t\"elf.R_390_NONE\":                                \"debug/elf\",\n\t\"elf.R_390_PC16\":                                \"debug/elf\",\n\t\"elf.R_390_PC16DBL\":                             \"debug/elf\",\n\t\"elf.R_390_PC32\":                                \"debug/elf\",\n\t\"elf.R_390_PC32DBL\":                             \"debug/elf\",\n\t\"elf.R_390_PC64\":                                \"debug/elf\",\n\t\"elf.R_390_PLT16DBL\":                            \"debug/elf\",\n\t\"elf.R_390_PLT32\":                               \"debug/elf\",\n\t\"elf.R_390_PLT32DBL\":                            \"debug/elf\",\n\t\"elf.R_390_PLT64\":                               \"debug/elf\",\n\t\"elf.R_390_RELATIVE\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_DTPMOD\":                          \"debug/elf\",\n\t\"elf.R_390_TLS_DTPOFF\":                          \"debug/elf\",\n\t\"elf.R_390_TLS_GD32\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_GD64\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_GDCALL\":                          \"debug/elf\",\n\t\"elf.R_390_TLS_GOTIE12\":                         \"debug/elf\",\n\t\"elf.R_390_TLS_GOTIE20\":                         \"debug/elf\",\n\t\"elf.R_390_TLS_GOTIE32\":                         \"debug/elf\",\n\t\"elf.R_390_TLS_GOTIE64\":                         \"debug/elf\",\n\t\"elf.R_390_TLS_IE32\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_IE64\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_IEENT\":                           \"debug/elf\",\n\t\"elf.R_390_TLS_LDCALL\":                          \"debug/elf\",\n\t\"elf.R_390_TLS_LDM32\":                           \"debug/elf\",\n\t\"elf.R_390_TLS_LDM64\":                           \"debug/elf\",\n\t\"elf.R_390_TLS_LDO32\":                           \"debug/elf\",\n\t\"elf.R_390_TLS_LDO64\":                           \"debug/elf\",\n\t\"elf.R_390_TLS_LE32\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_LE64\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_LOAD\":                            \"debug/elf\",\n\t\"elf.R_390_TLS_TPOFF\":                           \"debug/elf\",\n\t\"elf.R_AARCH64\":                                 \"debug/elf\",\n\t\"elf.R_AARCH64_ABS16\":                           \"debug/elf\",\n\t\"elf.R_AARCH64_ABS32\":                           \"debug/elf\",\n\t\"elf.R_AARCH64_ABS64\":                           \"debug/elf\",\n\t\"elf.R_AARCH64_ADD_ABS_LO12_NC\":                 \"debug/elf\",\n\t\"elf.R_AARCH64_ADR_GOT_PAGE\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_ADR_PREL_LO21\":                   \"debug/elf\",\n\t\"elf.R_AARCH64_ADR_PREL_PG_HI21\":                \"debug/elf\",\n\t\"elf.R_AARCH64_ADR_PREL_PG_HI21_NC\":             \"debug/elf\",\n\t\"elf.R_AARCH64_CALL26\":                          \"debug/elf\",\n\t\"elf.R_AARCH64_CONDBR19\":                        \"debug/elf\",\n\t\"elf.R_AARCH64_COPY\":                            \"debug/elf\",\n\t\"elf.R_AARCH64_GLOB_DAT\":                        \"debug/elf\",\n\t\"elf.R_AARCH64_GOT_LD_PREL19\":                   \"debug/elf\",\n\t\"elf.R_AARCH64_IRELATIVE\":                       \"debug/elf\",\n\t\"elf.R_AARCH64_JUMP26\":                          \"debug/elf\",\n\t\"elf.R_AARCH64_JUMP_SLOT\":                       \"debug/elf\",\n\t\"elf.R_AARCH64_LD64_GOT_LO12_NC\":                \"debug/elf\",\n\t\"elf.R_AARCH64_LDST128_ABS_LO12_NC\":             \"debug/elf\",\n\t\"elf.R_AARCH64_LDST16_ABS_LO12_NC\":              \"debug/elf\",\n\t\"elf.R_AARCH64_LDST32_ABS_LO12_NC\":              \"debug/elf\",\n\t\"elf.R_AARCH64_LDST64_ABS_LO12_NC\":              \"debug/elf\",\n\t\"elf.R_AARCH64_LDST8_ABS_LO12_NC\":               \"debug/elf\",\n\t\"elf.R_AARCH64_LD_PREL_LO19\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_SABS_G0\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_SABS_G1\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_SABS_G2\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_UABS_G0\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_UABS_G0_NC\":                 \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_UABS_G1\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_UABS_G1_NC\":                 \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_UABS_G2\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_UABS_G2_NC\":                 \"debug/elf\",\n\t\"elf.R_AARCH64_MOVW_UABS_G3\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_NONE\":                            \"debug/elf\",\n\t\"elf.R_AARCH64_NULL\":                            \"debug/elf\",\n\t\"elf.R_AARCH64_P32_ABS16\":                       \"debug/elf\",\n\t\"elf.R_AARCH64_P32_ABS32\":                       \"debug/elf\",\n\t\"elf.R_AARCH64_P32_ADD_ABS_LO12_NC\":             \"debug/elf\",\n\t\"elf.R_AARCH64_P32_ADR_GOT_PAGE\":                \"debug/elf\",\n\t\"elf.R_AARCH64_P32_ADR_PREL_LO21\":               \"debug/elf\",\n\t\"elf.R_AARCH64_P32_ADR_PREL_PG_HI21\":            \"debug/elf\",\n\t\"elf.R_AARCH64_P32_CALL26\":                      \"debug/elf\",\n\t\"elf.R_AARCH64_P32_CONDBR19\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_P32_COPY\":                        \"debug/elf\",\n\t\"elf.R_AARCH64_P32_GLOB_DAT\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_P32_GOT_LD_PREL19\":               \"debug/elf\",\n\t\"elf.R_AARCH64_P32_IRELATIVE\":                   \"debug/elf\",\n\t\"elf.R_AARCH64_P32_JUMP26\":                      \"debug/elf\",\n\t\"elf.R_AARCH64_P32_JUMP_SLOT\":                   \"debug/elf\",\n\t\"elf.R_AARCH64_P32_LD32_GOT_LO12_NC\":            \"debug/elf\",\n\t\"elf.R_AARCH64_P32_LDST128_ABS_LO12_NC\":         \"debug/elf\",\n\t\"elf.R_AARCH64_P32_LDST16_ABS_LO12_NC\":          \"debug/elf\",\n\t\"elf.R_AARCH64_P32_LDST32_ABS_LO12_NC\":          \"debug/elf\",\n\t\"elf.R_AARCH64_P32_LDST64_ABS_LO12_NC\":          \"debug/elf\",\n\t\"elf.R_AARCH64_P32_LDST8_ABS_LO12_NC\":           \"debug/elf\",\n\t\"elf.R_AARCH64_P32_LD_PREL_LO19\":                \"debug/elf\",\n\t\"elf.R_AARCH64_P32_MOVW_SABS_G0\":                \"debug/elf\",\n\t\"elf.R_AARCH64_P32_MOVW_UABS_G0\":                \"debug/elf\",\n\t\"elf.R_AARCH64_P32_MOVW_UABS_G0_NC\":             \"debug/elf\",\n\t\"elf.R_AARCH64_P32_MOVW_UABS_G1\":                \"debug/elf\",\n\t\"elf.R_AARCH64_P32_PREL16\":                      \"debug/elf\",\n\t\"elf.R_AARCH64_P32_PREL32\":                      \"debug/elf\",\n\t\"elf.R_AARCH64_P32_RELATIVE\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSDESC\":                     \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSDESC_ADD_LO12_NC\":         \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSDESC_ADR_PAGE21\":          \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSDESC_ADR_PREL21\":          \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSDESC_CALL\":                \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSDESC_LD32_LO12_NC\":        \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSDESC_LD_PREL19\":           \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSGD_ADD_LO12_NC\":           \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSGD_ADR_PAGE21\":            \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21\":   \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC\": \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19\":    \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSLE_ADD_TPREL_HI12\":        \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12\":        \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC\":     \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0\":         \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC\":      \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLSLE_MOVW_TPREL_G1\":         \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLS_DTPMOD\":                  \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLS_DTPREL\":                  \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TLS_TPREL\":                   \"debug/elf\",\n\t\"elf.R_AARCH64_P32_TSTBR14\":                     \"debug/elf\",\n\t\"elf.R_AARCH64_PREL16\":                          \"debug/elf\",\n\t\"elf.R_AARCH64_PREL32\":                          \"debug/elf\",\n\t\"elf.R_AARCH64_PREL64\":                          \"debug/elf\",\n\t\"elf.R_AARCH64_RELATIVE\":                        \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC\":                         \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_ADD\":                     \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_ADD_LO12_NC\":             \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_ADR_PAGE21\":              \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_ADR_PREL21\":              \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_CALL\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_LD64_LO12_NC\":            \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_LDR\":                     \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_LD_PREL19\":               \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_OFF_G0_NC\":               \"debug/elf\",\n\t\"elf.R_AARCH64_TLSDESC_OFF_G1\":                  \"debug/elf\",\n\t\"elf.R_AARCH64_TLSGD_ADD_LO12_NC\":               \"debug/elf\",\n\t\"elf.R_AARCH64_TLSGD_ADR_PAGE21\":                \"debug/elf\",\n\t\"elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21\":       \"debug/elf\",\n\t\"elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC\":     \"debug/elf\",\n\t\"elf.R_AARCH64_TLSIE_LD_GOTTPREL_PREL19\":        \"debug/elf\",\n\t\"elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC\":       \"debug/elf\",\n\t\"elf.R_AARCH64_TLSIE_MOVW_GOTTPREL_G1\":          \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_ADD_TPREL_HI12\":            \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_ADD_TPREL_LO12\":            \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_ADD_TPREL_LO12_NC\":         \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_MOVW_TPREL_G0\":             \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_MOVW_TPREL_G0_NC\":          \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_MOVW_TPREL_G1\":             \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_MOVW_TPREL_G1_NC\":          \"debug/elf\",\n\t\"elf.R_AARCH64_TLSLE_MOVW_TPREL_G2\":             \"debug/elf\",\n\t\"elf.R_AARCH64_TLS_DTPMOD64\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_TLS_DTPREL64\":                    \"debug/elf\",\n\t\"elf.R_AARCH64_TLS_TPREL64\":                     \"debug/elf\",\n\t\"elf.R_AARCH64_TSTBR14\":                         \"debug/elf\",\n\t\"elf.R_ALPHA\":                                   \"debug/elf\",\n\t\"elf.R_ALPHA_BRADDR\":                            \"debug/elf\",\n\t\"elf.R_ALPHA_COPY\":                              \"debug/elf\",\n\t\"elf.R_ALPHA_GLOB_DAT\":                          \"debug/elf\",\n\t\"elf.R_ALPHA_GPDISP\":                            \"debug/elf\",\n\t\"elf.R_ALPHA_GPREL32\":                           \"debug/elf\",\n\t\"elf.R_ALPHA_GPRELHIGH\":                         \"debug/elf\",\n\t\"elf.R_ALPHA_GPRELLOW\":                          \"debug/elf\",\n\t\"elf.R_ALPHA_GPVALUE\":                           \"debug/elf\",\n\t\"elf.R_ALPHA_HINT\":                              \"debug/elf\",\n\t\"elf.R_ALPHA_IMMED_BR_HI32\":                     \"debug/elf\",\n\t\"elf.R_ALPHA_IMMED_GP_16\":                       \"debug/elf\",\n\t\"elf.R_ALPHA_IMMED_GP_HI32\":                     \"debug/elf\",\n\t\"elf.R_ALPHA_IMMED_LO32\":                        \"debug/elf\",\n\t\"elf.R_ALPHA_IMMED_SCN_HI32\":                    \"debug/elf\",\n\t\"elf.R_ALPHA_JMP_SLOT\":                          \"debug/elf\",\n\t\"elf.R_ALPHA_LITERAL\":                           \"debug/elf\",\n\t\"elf.R_ALPHA_LITUSE\":                            \"debug/elf\",\n\t\"elf.R_ALPHA_NONE\":                              \"debug/elf\",\n\t\"elf.R_ALPHA_OP_PRSHIFT\":                        \"debug/elf\",\n\t\"elf.R_ALPHA_OP_PSUB\":                           \"debug/elf\",\n\t\"elf.R_ALPHA_OP_PUSH\":                           \"debug/elf\",\n\t\"elf.R_ALPHA_OP_STORE\":                          \"debug/elf\",\n\t\"elf.R_ALPHA_REFLONG\":                           \"debug/elf\",\n\t\"elf.R_ALPHA_REFQUAD\":                           \"debug/elf\",\n\t\"elf.R_ALPHA_RELATIVE\":                          \"debug/elf\",\n\t\"elf.R_ALPHA_SREL16\":                            \"debug/elf\",\n\t\"elf.R_ALPHA_SREL32\":                            \"debug/elf\",\n\t\"elf.R_ALPHA_SREL64\":                            \"debug/elf\",\n\t\"elf.R_ARM\":                                     \"debug/elf\",\n\t\"elf.R_ARM_ABS12\":                               \"debug/elf\",\n\t\"elf.R_ARM_ABS16\":                               \"debug/elf\",\n\t\"elf.R_ARM_ABS32\":                               \"debug/elf\",\n\t\"elf.R_ARM_ABS8\":                                \"debug/elf\",\n\t\"elf.R_ARM_AMP_VCALL9\":                          \"debug/elf\",\n\t\"elf.R_ARM_COPY\":                                \"debug/elf\",\n\t\"elf.R_ARM_GLOB_DAT\":                            \"debug/elf\",\n\t\"elf.R_ARM_GNU_VTENTRY\":                         \"debug/elf\",\n\t\"elf.R_ARM_GNU_VTINHERIT\":                       \"debug/elf\",\n\t\"elf.R_ARM_GOT32\":                               \"debug/elf\",\n\t\"elf.R_ARM_GOTOFF\":                              \"debug/elf\",\n\t\"elf.R_ARM_GOTPC\":                               \"debug/elf\",\n\t\"elf.R_ARM_JUMP_SLOT\":                           \"debug/elf\",\n\t\"elf.R_ARM_NONE\":                                \"debug/elf\",\n\t\"elf.R_ARM_PC13\":                                \"debug/elf\",\n\t\"elf.R_ARM_PC24\":                                \"debug/elf\",\n\t\"elf.R_ARM_PLT32\":                               \"debug/elf\",\n\t\"elf.R_ARM_RABS32\":                              \"debug/elf\",\n\t\"elf.R_ARM_RBASE\":                               \"debug/elf\",\n\t\"elf.R_ARM_REL32\":                               \"debug/elf\",\n\t\"elf.R_ARM_RELATIVE\":                            \"debug/elf\",\n\t\"elf.R_ARM_RPC24\":                               \"debug/elf\",\n\t\"elf.R_ARM_RREL32\":                              \"debug/elf\",\n\t\"elf.R_ARM_RSBREL32\":                            \"debug/elf\",\n\t\"elf.R_ARM_SBREL32\":                             \"debug/elf\",\n\t\"elf.R_ARM_SWI24\":                               \"debug/elf\",\n\t\"elf.R_ARM_THM_ABS5\":                            \"debug/elf\",\n\t\"elf.R_ARM_THM_PC22\":                            \"debug/elf\",\n\t\"elf.R_ARM_THM_PC8\":                             \"debug/elf\",\n\t\"elf.R_ARM_THM_RPC22\":                           \"debug/elf\",\n\t\"elf.R_ARM_THM_SWI8\":                            \"debug/elf\",\n\t\"elf.R_ARM_THM_XPC22\":                           \"debug/elf\",\n\t\"elf.R_ARM_XPC25\":                               \"debug/elf\",\n\t\"elf.R_INFO\":                                    \"debug/elf\",\n\t\"elf.R_INFO32\":                                  \"debug/elf\",\n\t\"elf.R_MIPS\":                                    \"debug/elf\",\n\t\"elf.R_MIPS_16\":                                 \"debug/elf\",\n\t\"elf.R_MIPS_26\":                                 \"debug/elf\",\n\t\"elf.R_MIPS_32\":                                 \"debug/elf\",\n\t\"elf.R_MIPS_64\":                                 \"debug/elf\",\n\t\"elf.R_MIPS_ADD_IMMEDIATE\":                      \"debug/elf\",\n\t\"elf.R_MIPS_CALL16\":                             \"debug/elf\",\n\t\"elf.R_MIPS_CALL_HI16\":                          \"debug/elf\",\n\t\"elf.R_MIPS_CALL_LO16\":                          \"debug/elf\",\n\t\"elf.R_MIPS_DELETE\":                             \"debug/elf\",\n\t\"elf.R_MIPS_GOT16\":                              \"debug/elf\",\n\t\"elf.R_MIPS_GOT_DISP\":                           \"debug/elf\",\n\t\"elf.R_MIPS_GOT_HI16\":                           \"debug/elf\",\n\t\"elf.R_MIPS_GOT_LO16\":                           \"debug/elf\",\n\t\"elf.R_MIPS_GOT_OFST\":                           \"debug/elf\",\n\t\"elf.R_MIPS_GOT_PAGE\":                           \"debug/elf\",\n\t\"elf.R_MIPS_GPREL16\":                            \"debug/elf\",\n\t\"elf.R_MIPS_GPREL32\":                            \"debug/elf\",\n\t\"elf.R_MIPS_HI16\":                               \"debug/elf\",\n\t\"elf.R_MIPS_HIGHER\":                             \"debug/elf\",\n\t\"elf.R_MIPS_HIGHEST\":                            \"debug/elf\",\n\t\"elf.R_MIPS_INSERT_A\":                           \"debug/elf\",\n\t\"elf.R_MIPS_INSERT_B\":                           \"debug/elf\",\n\t\"elf.R_MIPS_JALR\":                               \"debug/elf\",\n\t\"elf.R_MIPS_LITERAL\":                            \"debug/elf\",\n\t\"elf.R_MIPS_LO16\":                               \"debug/elf\",\n\t\"elf.R_MIPS_NONE\":                               \"debug/elf\",\n\t\"elf.R_MIPS_PC16\":                               \"debug/elf\",\n\t\"elf.R_MIPS_PJUMP\":                              \"debug/elf\",\n\t\"elf.R_MIPS_REL16\":                              \"debug/elf\",\n\t\"elf.R_MIPS_REL32\":                              \"debug/elf\",\n\t\"elf.R_MIPS_RELGOT\":                             \"debug/elf\",\n\t\"elf.R_MIPS_SCN_DISP\":                           \"debug/elf\",\n\t\"elf.R_MIPS_SHIFT5\":                             \"debug/elf\",\n\t\"elf.R_MIPS_SHIFT6\":                             \"debug/elf\",\n\t\"elf.R_MIPS_SUB\":                                \"debug/elf\",\n\t\"elf.R_MIPS_TLS_DTPMOD32\":                       \"debug/elf\",\n\t\"elf.R_MIPS_TLS_DTPMOD64\":                       \"debug/elf\",\n\t\"elf.R_MIPS_TLS_DTPREL32\":                       \"debug/elf\",\n\t\"elf.R_MIPS_TLS_DTPREL64\":                       \"debug/elf\",\n\t\"elf.R_MIPS_TLS_DTPREL_HI16\":                    \"debug/elf\",\n\t\"elf.R_MIPS_TLS_DTPREL_LO16\":                    \"debug/elf\",\n\t\"elf.R_MIPS_TLS_GD\":                             \"debug/elf\",\n\t\"elf.R_MIPS_TLS_GOTTPREL\":                       \"debug/elf\",\n\t\"elf.R_MIPS_TLS_LDM\":                            \"debug/elf\",\n\t\"elf.R_MIPS_TLS_TPREL32\":                        \"debug/elf\",\n\t\"elf.R_MIPS_TLS_TPREL64\":                        \"debug/elf\",\n\t\"elf.R_MIPS_TLS_TPREL_HI16\":                     \"debug/elf\",\n\t\"elf.R_MIPS_TLS_TPREL_LO16\":                     \"debug/elf\",\n\t\"elf.R_PPC\":                                     \"debug/elf\",\n\t\"elf.R_PPC64\":                                   \"debug/elf\",\n\t\"elf.R_PPC64_ADDR14\":                            \"debug/elf\",\n\t\"elf.R_PPC64_ADDR14_BRNTAKEN\":                   \"debug/elf\",\n\t\"elf.R_PPC64_ADDR14_BRTAKEN\":                    \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16\":                            \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_DS\":                         \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_HA\":                         \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_HI\":                         \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_HIGHER\":                     \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_HIGHERA\":                    \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_HIGHEST\":                    \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_HIGHESTA\":                   \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_LO\":                         \"debug/elf\",\n\t\"elf.R_PPC64_ADDR16_LO_DS\":                      \"debug/elf\",\n\t\"elf.R_PPC64_ADDR24\":                            \"debug/elf\",\n\t\"elf.R_PPC64_ADDR32\":                            \"debug/elf\",\n\t\"elf.R_PPC64_ADDR64\":                            \"debug/elf\",\n\t\"elf.R_PPC64_DTPMOD64\":                          \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16\":                          \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_DS\":                       \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_HA\":                       \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_HI\":                       \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_HIGHER\":                   \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_HIGHERA\":                  \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_HIGHEST\":                  \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_HIGHESTA\":                 \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_LO\":                       \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL16_LO_DS\":                    \"debug/elf\",\n\t\"elf.R_PPC64_DTPREL64\":                          \"debug/elf\",\n\t\"elf.R_PPC64_GOT16\":                             \"debug/elf\",\n\t\"elf.R_PPC64_GOT16_DS\":                          \"debug/elf\",\n\t\"elf.R_PPC64_GOT16_HA\":                          \"debug/elf\",\n\t\"elf.R_PPC64_GOT16_HI\":                          \"debug/elf\",\n\t\"elf.R_PPC64_GOT16_LO\":                          \"debug/elf\",\n\t\"elf.R_PPC64_GOT16_LO_DS\":                       \"debug/elf\",\n\t\"elf.R_PPC64_GOT_DTPREL16_DS\":                   \"debug/elf\",\n\t\"elf.R_PPC64_GOT_DTPREL16_HA\":                   \"debug/elf\",\n\t\"elf.R_PPC64_GOT_DTPREL16_HI\":                   \"debug/elf\",\n\t\"elf.R_PPC64_GOT_DTPREL16_LO_DS\":                \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSGD16\":                       \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSGD16_HA\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSGD16_HI\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSGD16_LO\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSLD16\":                       \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSLD16_HA\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSLD16_HI\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TLSLD16_LO\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TPREL16_DS\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TPREL16_HA\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TPREL16_HI\":                    \"debug/elf\",\n\t\"elf.R_PPC64_GOT_TPREL16_LO_DS\":                 \"debug/elf\",\n\t\"elf.R_PPC64_JMP_SLOT\":                          \"debug/elf\",\n\t\"elf.R_PPC64_NONE\":                              \"debug/elf\",\n\t\"elf.R_PPC64_REL14\":                             \"debug/elf\",\n\t\"elf.R_PPC64_REL14_BRNTAKEN\":                    \"debug/elf\",\n\t\"elf.R_PPC64_REL14_BRTAKEN\":                     \"debug/elf\",\n\t\"elf.R_PPC64_REL16\":                             \"debug/elf\",\n\t\"elf.R_PPC64_REL16_HA\":                          \"debug/elf\",\n\t\"elf.R_PPC64_REL16_HI\":                          \"debug/elf\",\n\t\"elf.R_PPC64_REL16_LO\":                          \"debug/elf\",\n\t\"elf.R_PPC64_REL24\":                             \"debug/elf\",\n\t\"elf.R_PPC64_REL32\":                             \"debug/elf\",\n\t\"elf.R_PPC64_REL64\":                             \"debug/elf\",\n\t\"elf.R_PPC64_TLS\":                               \"debug/elf\",\n\t\"elf.R_PPC64_TLSGD\":                             \"debug/elf\",\n\t\"elf.R_PPC64_TLSLD\":                             \"debug/elf\",\n\t\"elf.R_PPC64_TOC\":                               \"debug/elf\",\n\t\"elf.R_PPC64_TOC16\":                             \"debug/elf\",\n\t\"elf.R_PPC64_TOC16_DS\":                          \"debug/elf\",\n\t\"elf.R_PPC64_TOC16_HA\":                          \"debug/elf\",\n\t\"elf.R_PPC64_TOC16_HI\":                          \"debug/elf\",\n\t\"elf.R_PPC64_TOC16_LO\":                          \"debug/elf\",\n\t\"elf.R_PPC64_TOC16_LO_DS\":                       \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16\":                           \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_DS\":                        \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_HA\":                        \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_HI\":                        \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_HIGHER\":                    \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_HIGHERA\":                   \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_HIGHEST\":                   \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_HIGHESTA\":                  \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_LO\":                        \"debug/elf\",\n\t\"elf.R_PPC64_TPREL16_LO_DS\":                     \"debug/elf\",\n\t\"elf.R_PPC64_TPREL64\":                           \"debug/elf\",\n\t\"elf.R_PPC_ADDR14\":                              \"debug/elf\",\n\t\"elf.R_PPC_ADDR14_BRNTAKEN\":                     \"debug/elf\",\n\t\"elf.R_PPC_ADDR14_BRTAKEN\":                      \"debug/elf\",\n\t\"elf.R_PPC_ADDR16\":                              \"debug/elf\",\n\t\"elf.R_PPC_ADDR16_HA\":                           \"debug/elf\",\n\t\"elf.R_PPC_ADDR16_HI\":                           \"debug/elf\",\n\t\"elf.R_PPC_ADDR16_LO\":                           \"debug/elf\",\n\t\"elf.R_PPC_ADDR24\":                              \"debug/elf\",\n\t\"elf.R_PPC_ADDR32\":                              \"debug/elf\",\n\t\"elf.R_PPC_COPY\":                                \"debug/elf\",\n\t\"elf.R_PPC_DTPMOD32\":                            \"debug/elf\",\n\t\"elf.R_PPC_DTPREL16\":                            \"debug/elf\",\n\t\"elf.R_PPC_DTPREL16_HA\":                         \"debug/elf\",\n\t\"elf.R_PPC_DTPREL16_HI\":                         \"debug/elf\",\n\t\"elf.R_PPC_DTPREL16_LO\":                         \"debug/elf\",\n\t\"elf.R_PPC_DTPREL32\":                            \"debug/elf\",\n\t\"elf.R_PPC_EMB_BIT_FLD\":                         \"debug/elf\",\n\t\"elf.R_PPC_EMB_MRKREF\":                          \"debug/elf\",\n\t\"elf.R_PPC_EMB_NADDR16\":                         \"debug/elf\",\n\t\"elf.R_PPC_EMB_NADDR16_HA\":                      \"debug/elf\",\n\t\"elf.R_PPC_EMB_NADDR16_HI\":                      \"debug/elf\",\n\t\"elf.R_PPC_EMB_NADDR16_LO\":                      \"debug/elf\",\n\t\"elf.R_PPC_EMB_NADDR32\":                         \"debug/elf\",\n\t\"elf.R_PPC_EMB_RELSDA\":                          \"debug/elf\",\n\t\"elf.R_PPC_EMB_RELSEC16\":                        \"debug/elf\",\n\t\"elf.R_PPC_EMB_RELST_HA\":                        \"debug/elf\",\n\t\"elf.R_PPC_EMB_RELST_HI\":                        \"debug/elf\",\n\t\"elf.R_PPC_EMB_RELST_LO\":                        \"debug/elf\",\n\t\"elf.R_PPC_EMB_SDA21\":                           \"debug/elf\",\n\t\"elf.R_PPC_EMB_SDA2I16\":                         \"debug/elf\",\n\t\"elf.R_PPC_EMB_SDA2REL\":                         \"debug/elf\",\n\t\"elf.R_PPC_EMB_SDAI16\":                          \"debug/elf\",\n\t\"elf.R_PPC_GLOB_DAT\":                            \"debug/elf\",\n\t\"elf.R_PPC_GOT16\":                               \"debug/elf\",\n\t\"elf.R_PPC_GOT16_HA\":                            \"debug/elf\",\n\t\"elf.R_PPC_GOT16_HI\":                            \"debug/elf\",\n\t\"elf.R_PPC_GOT16_LO\":                            \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSGD16\":                         \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSGD16_HA\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSGD16_HI\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSGD16_LO\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSLD16\":                         \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSLD16_HA\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSLD16_HI\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TLSLD16_LO\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TPREL16\":                         \"debug/elf\",\n\t\"elf.R_PPC_GOT_TPREL16_HA\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TPREL16_HI\":                      \"debug/elf\",\n\t\"elf.R_PPC_GOT_TPREL16_LO\":                      \"debug/elf\",\n\t\"elf.R_PPC_JMP_SLOT\":                            \"debug/elf\",\n\t\"elf.R_PPC_LOCAL24PC\":                           \"debug/elf\",\n\t\"elf.R_PPC_NONE\":                                \"debug/elf\",\n\t\"elf.R_PPC_PLT16_HA\":                            \"debug/elf\",\n\t\"elf.R_PPC_PLT16_HI\":                            \"debug/elf\",\n\t\"elf.R_PPC_PLT16_LO\":                            \"debug/elf\",\n\t\"elf.R_PPC_PLT32\":                               \"debug/elf\",\n\t\"elf.R_PPC_PLTREL24\":                            \"debug/elf\",\n\t\"elf.R_PPC_PLTREL32\":                            \"debug/elf\",\n\t\"elf.R_PPC_REL14\":                               \"debug/elf\",\n\t\"elf.R_PPC_REL14_BRNTAKEN\":                      \"debug/elf\",\n\t\"elf.R_PPC_REL14_BRTAKEN\":                       \"debug/elf\",\n\t\"elf.R_PPC_REL24\":                               \"debug/elf\",\n\t\"elf.R_PPC_REL32\":                               \"debug/elf\",\n\t\"elf.R_PPC_RELATIVE\":                            \"debug/elf\",\n\t\"elf.R_PPC_SDAREL16\":                            \"debug/elf\",\n\t\"elf.R_PPC_SECTOFF\":                             \"debug/elf\",\n\t\"elf.R_PPC_SECTOFF_HA\":                          \"debug/elf\",\n\t\"elf.R_PPC_SECTOFF_HI\":                          \"debug/elf\",\n\t\"elf.R_PPC_SECTOFF_LO\":                          \"debug/elf\",\n\t\"elf.R_PPC_TLS\":                                 \"debug/elf\",\n\t\"elf.R_PPC_TPREL16\":                             \"debug/elf\",\n\t\"elf.R_PPC_TPREL16_HA\":                          \"debug/elf\",\n\t\"elf.R_PPC_TPREL16_HI\":                          \"debug/elf\",\n\t\"elf.R_PPC_TPREL16_LO\":                          \"debug/elf\",\n\t\"elf.R_PPC_TPREL32\":                             \"debug/elf\",\n\t\"elf.R_PPC_UADDR16\":                             \"debug/elf\",\n\t\"elf.R_PPC_UADDR32\":                             \"debug/elf\",\n\t\"elf.R_SPARC\":                                   \"debug/elf\",\n\t\"elf.R_SPARC_10\":                                \"debug/elf\",\n\t\"elf.R_SPARC_11\":                                \"debug/elf\",\n\t\"elf.R_SPARC_13\":                                \"debug/elf\",\n\t\"elf.R_SPARC_16\":                                \"debug/elf\",\n\t\"elf.R_SPARC_22\":                                \"debug/elf\",\n\t\"elf.R_SPARC_32\":                                \"debug/elf\",\n\t\"elf.R_SPARC_5\":                                 \"debug/elf\",\n\t\"elf.R_SPARC_6\":                                 \"debug/elf\",\n\t\"elf.R_SPARC_64\":                                \"debug/elf\",\n\t\"elf.R_SPARC_7\":                                 \"debug/elf\",\n\t\"elf.R_SPARC_8\":                                 \"debug/elf\",\n\t\"elf.R_SPARC_COPY\":                              \"debug/elf\",\n\t\"elf.R_SPARC_DISP16\":                            \"debug/elf\",\n\t\"elf.R_SPARC_DISP32\":                            \"debug/elf\",\n\t\"elf.R_SPARC_DISP64\":                            \"debug/elf\",\n\t\"elf.R_SPARC_DISP8\":                             \"debug/elf\",\n\t\"elf.R_SPARC_GLOB_DAT\":                          \"debug/elf\",\n\t\"elf.R_SPARC_GLOB_JMP\":                          \"debug/elf\",\n\t\"elf.R_SPARC_GOT10\":                             \"debug/elf\",\n\t\"elf.R_SPARC_GOT13\":                             \"debug/elf\",\n\t\"elf.R_SPARC_GOT22\":                             \"debug/elf\",\n\t\"elf.R_SPARC_H44\":                               \"debug/elf\",\n\t\"elf.R_SPARC_HH22\":                              \"debug/elf\",\n\t\"elf.R_SPARC_HI22\":                              \"debug/elf\",\n\t\"elf.R_SPARC_HIPLT22\":                           \"debug/elf\",\n\t\"elf.R_SPARC_HIX22\":                             \"debug/elf\",\n\t\"elf.R_SPARC_HM10\":                              \"debug/elf\",\n\t\"elf.R_SPARC_JMP_SLOT\":                          \"debug/elf\",\n\t\"elf.R_SPARC_L44\":                               \"debug/elf\",\n\t\"elf.R_SPARC_LM22\":                              \"debug/elf\",\n\t\"elf.R_SPARC_LO10\":                              \"debug/elf\",\n\t\"elf.R_SPARC_LOPLT10\":                           \"debug/elf\",\n\t\"elf.R_SPARC_LOX10\":                             \"debug/elf\",\n\t\"elf.R_SPARC_M44\":                               \"debug/elf\",\n\t\"elf.R_SPARC_NONE\":                              \"debug/elf\",\n\t\"elf.R_SPARC_OLO10\":                             \"debug/elf\",\n\t\"elf.R_SPARC_PC10\":                              \"debug/elf\",\n\t\"elf.R_SPARC_PC22\":                              \"debug/elf\",\n\t\"elf.R_SPARC_PCPLT10\":                           \"debug/elf\",\n\t\"elf.R_SPARC_PCPLT22\":                           \"debug/elf\",\n\t\"elf.R_SPARC_PCPLT32\":                           \"debug/elf\",\n\t\"elf.R_SPARC_PC_HH22\":                           \"debug/elf\",\n\t\"elf.R_SPARC_PC_HM10\":                           \"debug/elf\",\n\t\"elf.R_SPARC_PC_LM22\":                           \"debug/elf\",\n\t\"elf.R_SPARC_PLT32\":                             \"debug/elf\",\n\t\"elf.R_SPARC_PLT64\":                             \"debug/elf\",\n\t\"elf.R_SPARC_REGISTER\":                          \"debug/elf\",\n\t\"elf.R_SPARC_RELATIVE\":                          \"debug/elf\",\n\t\"elf.R_SPARC_UA16\":                              \"debug/elf\",\n\t\"elf.R_SPARC_UA32\":                              \"debug/elf\",\n\t\"elf.R_SPARC_UA64\":                              \"debug/elf\",\n\t\"elf.R_SPARC_WDISP16\":                           \"debug/elf\",\n\t\"elf.R_SPARC_WDISP19\":                           \"debug/elf\",\n\t\"elf.R_SPARC_WDISP22\":                           \"debug/elf\",\n\t\"elf.R_SPARC_WDISP30\":                           \"debug/elf\",\n\t\"elf.R_SPARC_WPLT30\":                            \"debug/elf\",\n\t\"elf.R_SYM32\":                                   \"debug/elf\",\n\t\"elf.R_SYM64\":                                   \"debug/elf\",\n\t\"elf.R_TYPE32\":                                  \"debug/elf\",\n\t\"elf.R_TYPE64\":                                  \"debug/elf\",\n\t\"elf.R_X86_64\":                                  \"debug/elf\",\n\t\"elf.R_X86_64_16\":                               \"debug/elf\",\n\t\"elf.R_X86_64_32\":                               \"debug/elf\",\n\t\"elf.R_X86_64_32S\":                              \"debug/elf\",\n\t\"elf.R_X86_64_64\":                               \"debug/elf\",\n\t\"elf.R_X86_64_8\":                                \"debug/elf\",\n\t\"elf.R_X86_64_COPY\":                             \"debug/elf\",\n\t\"elf.R_X86_64_DTPMOD64\":                         \"debug/elf\",\n\t\"elf.R_X86_64_DTPOFF32\":                         \"debug/elf\",\n\t\"elf.R_X86_64_DTPOFF64\":                         \"debug/elf\",\n\t\"elf.R_X86_64_GLOB_DAT\":                         \"debug/elf\",\n\t\"elf.R_X86_64_GOT32\":                            \"debug/elf\",\n\t\"elf.R_X86_64_GOTPCREL\":                         \"debug/elf\",\n\t\"elf.R_X86_64_GOTTPOFF\":                         \"debug/elf\",\n\t\"elf.R_X86_64_JMP_SLOT\":                         \"debug/elf\",\n\t\"elf.R_X86_64_NONE\":                             \"debug/elf\",\n\t\"elf.R_X86_64_PC16\":                             \"debug/elf\",\n\t\"elf.R_X86_64_PC32\":                             \"debug/elf\",\n\t\"elf.R_X86_64_PC8\":                              \"debug/elf\",\n\t\"elf.R_X86_64_PLT32\":                            \"debug/elf\",\n\t\"elf.R_X86_64_RELATIVE\":                         \"debug/elf\",\n\t\"elf.R_X86_64_TLSGD\":                            \"debug/elf\",\n\t\"elf.R_X86_64_TLSLD\":                            \"debug/elf\",\n\t\"elf.R_X86_64_TPOFF32\":                          \"debug/elf\",\n\t\"elf.R_X86_64_TPOFF64\":                          \"debug/elf\",\n\t\"elf.Rel32\":                                     \"debug/elf\",\n\t\"elf.Rel64\":                                     \"debug/elf\",\n\t\"elf.Rela32\":                                    \"debug/elf\",\n\t\"elf.Rela64\":                                    \"debug/elf\",\n\t\"elf.SHF_ALLOC\":                                 \"debug/elf\",\n\t\"elf.SHF_COMPRESSED\":                            \"debug/elf\",\n\t\"elf.SHF_EXECINSTR\":                             \"debug/elf\",\n\t\"elf.SHF_GROUP\":                                 \"debug/elf\",\n\t\"elf.SHF_INFO_LINK\":                             \"debug/elf\",\n\t\"elf.SHF_LINK_ORDER\":                            \"debug/elf\",\n\t\"elf.SHF_MASKOS\":                                \"debug/elf\",\n\t\"elf.SHF_MASKPROC\":                              \"debug/elf\",\n\t\"elf.SHF_MERGE\":                                 \"debug/elf\",\n\t\"elf.SHF_OS_NONCONFORMING\":                      \"debug/elf\",\n\t\"elf.SHF_STRINGS\":                               \"debug/elf\",\n\t\"elf.SHF_TLS\":                                   \"debug/elf\",\n\t\"elf.SHF_WRITE\":                                 \"debug/elf\",\n\t\"elf.SHN_ABS\":                                   \"debug/elf\",\n\t\"elf.SHN_COMMON\":                                \"debug/elf\",\n\t\"elf.SHN_HIOS\":                                  \"debug/elf\",\n\t\"elf.SHN_HIPROC\":                                \"debug/elf\",\n\t\"elf.SHN_HIRESERVE\":                             \"debug/elf\",\n\t\"elf.SHN_LOOS\":                                  \"debug/elf\",\n\t\"elf.SHN_LOPROC\":                                \"debug/elf\",\n\t\"elf.SHN_LORESERVE\":                             \"debug/elf\",\n\t\"elf.SHN_UNDEF\":                                 \"debug/elf\",\n\t\"elf.SHN_XINDEX\":                                \"debug/elf\",\n\t\"elf.SHT_DYNAMIC\":                               \"debug/elf\",\n\t\"elf.SHT_DYNSYM\":                                \"debug/elf\",\n\t\"elf.SHT_FINI_ARRAY\":                            \"debug/elf\",\n\t\"elf.SHT_GNU_ATTRIBUTES\":                        \"debug/elf\",\n\t\"elf.SHT_GNU_HASH\":                              \"debug/elf\",\n\t\"elf.SHT_GNU_LIBLIST\":                           \"debug/elf\",\n\t\"elf.SHT_GNU_VERDEF\":                            \"debug/elf\",\n\t\"elf.SHT_GNU_VERNEED\":                           \"debug/elf\",\n\t\"elf.SHT_GNU_VERSYM\":                            \"debug/elf\",\n\t\"elf.SHT_GROUP\":                                 \"debug/elf\",\n\t\"elf.SHT_HASH\":                                  \"debug/elf\",\n\t\"elf.SHT_HIOS\":                                  \"debug/elf\",\n\t\"elf.SHT_HIPROC\":                                \"debug/elf\",\n\t\"elf.SHT_HIUSER\":                                \"debug/elf\",\n\t\"elf.SHT_INIT_ARRAY\":                            \"debug/elf\",\n\t\"elf.SHT_LOOS\":                                  \"debug/elf\",\n\t\"elf.SHT_LOPROC\":                                \"debug/elf\",\n\t\"elf.SHT_LOUSER\":                                \"debug/elf\",\n\t\"elf.SHT_NOBITS\":                                \"debug/elf\",\n\t\"elf.SHT_NOTE\":                                  \"debug/elf\",\n\t\"elf.SHT_NULL\":                                  \"debug/elf\",\n\t\"elf.SHT_PREINIT_ARRAY\":                         \"debug/elf\",\n\t\"elf.SHT_PROGBITS\":                              \"debug/elf\",\n\t\"elf.SHT_REL\":                                   \"debug/elf\",\n\t\"elf.SHT_RELA\":                                  \"debug/elf\",\n\t\"elf.SHT_SHLIB\":                                 \"debug/elf\",\n\t\"elf.SHT_STRTAB\":                                \"debug/elf\",\n\t\"elf.SHT_SYMTAB\":                                \"debug/elf\",\n\t\"elf.SHT_SYMTAB_SHNDX\":                          \"debug/elf\",\n\t\"elf.STB_GLOBAL\":                                \"debug/elf\",\n\t\"elf.STB_HIOS\":                                  \"debug/elf\",\n\t\"elf.STB_HIPROC\":                                \"debug/elf\",\n\t\"elf.STB_LOCAL\":                                 \"debug/elf\",\n\t\"elf.STB_LOOS\":                                  \"debug/elf\",\n\t\"elf.STB_LOPROC\":                                \"debug/elf\",\n\t\"elf.STB_WEAK\":                                  \"debug/elf\",\n\t\"elf.STT_COMMON\":                                \"debug/elf\",\n\t\"elf.STT_FILE\":                                  \"debug/elf\",\n\t\"elf.STT_FUNC\":                                  \"debug/elf\",\n\t\"elf.STT_HIOS\":                                  \"debug/elf\",\n\t\"elf.STT_HIPROC\":                                \"debug/elf\",\n\t\"elf.STT_LOOS\":                                  \"debug/elf\",\n\t\"elf.STT_LOPROC\":                                \"debug/elf\",\n\t\"elf.STT_NOTYPE\":                                \"debug/elf\",\n\t\"elf.STT_OBJECT\":                                \"debug/elf\",\n\t\"elf.STT_SECTION\":                               \"debug/elf\",\n\t\"elf.STT_TLS\":                                   \"debug/elf\",\n\t\"elf.STV_DEFAULT\":                               \"debug/elf\",\n\t\"elf.STV_HIDDEN\":                                \"debug/elf\",\n\t\"elf.STV_INTERNAL\":                              \"debug/elf\",\n\t\"elf.STV_PROTECTED\":                             \"debug/elf\",\n\t\"elf.ST_BIND\":                                   \"debug/elf\",\n\t\"elf.ST_INFO\":                                   \"debug/elf\",\n\t\"elf.ST_TYPE\":                                   \"debug/elf\",\n\t\"elf.ST_VISIBILITY\":                             \"debug/elf\",\n\t\"elf.Section\":                                   \"debug/elf\",\n\t\"elf.Section32\":                                 \"debug/elf\",\n\t\"elf.Section64\":                                 \"debug/elf\",\n\t\"elf.SectionFlag\":                               \"debug/elf\",\n\t\"elf.SectionHeader\":                             \"debug/elf\",\n\t\"elf.SectionIndex\":                              \"debug/elf\",\n\t\"elf.SectionType\":                               \"debug/elf\",\n\t\"elf.Sym32\":                                     \"debug/elf\",\n\t\"elf.Sym32Size\":                                 \"debug/elf\",\n\t\"elf.Sym64\":                                     \"debug/elf\",\n\t\"elf.Sym64Size\":                                 \"debug/elf\",\n\t\"elf.SymBind\":                                   \"debug/elf\",\n\t\"elf.SymType\":                                   \"debug/elf\",\n\t\"elf.SymVis\":                                    \"debug/elf\",\n\t\"elf.Symbol\":                                    \"debug/elf\",\n\t\"elf.Type\":                                      \"debug/elf\",\n\t\"elf.Version\":                                   \"debug/elf\",\n\t\"elliptic.Curve\":                                \"crypto/elliptic\",\n\t\"elliptic.CurveParams\":                          \"crypto/elliptic\",\n\t\"elliptic.GenerateKey\":                          \"crypto/elliptic\",\n\t\"elliptic.Marshal\":                              \"crypto/elliptic\",\n\t\"elliptic.P224\":                                 \"crypto/elliptic\",\n\t\"elliptic.P256\":                                 \"crypto/elliptic\",\n\t\"elliptic.P384\":                                 \"crypto/elliptic\",\n\t\"elliptic.P521\":                                 \"crypto/elliptic\",\n\t\"elliptic.Unmarshal\":                            \"crypto/elliptic\",\n\t\"encoding.BinaryMarshaler\":                      \"encoding\",\n\t\"encoding.BinaryUnmarshaler\":                    \"encoding\",\n\t\"encoding.TextMarshaler\":                        \"encoding\",\n\t\"encoding.TextUnmarshaler\":                      \"encoding\",\n\t\"errors.New\":                                    \"errors\",\n\t\"exec.Cmd\":                                      \"os/exec\",\n\t\"exec.Command\":                                  \"os/exec\",\n\t\"exec.CommandContext\":                           \"os/exec\",\n\t\"exec.ErrNotFound\":                              \"os/exec\",\n\t\"exec.Error\":                                    \"os/exec\",\n\t\"exec.ExitError\":                                \"os/exec\",\n\t\"exec.LookPath\":                                 \"os/exec\",\n\t\"expvar.Do\":                                     \"expvar\",\n\t\"expvar.Float\":                                  \"expvar\",\n\t\"expvar.Func\":                                   \"expvar\",\n\t\"expvar.Get\":                                    \"expvar\",\n\t\"expvar.Int\":                                    \"expvar\",\n\t\"expvar.KeyValue\":                               \"expvar\",\n\t\"expvar.Map\":                                    \"expvar\",\n\t\"expvar.NewFloat\":                               \"expvar\",\n\t\"expvar.NewInt\":                                 \"expvar\",\n\t\"expvar.NewMap\":                                 \"expvar\",\n\t\"expvar.NewString\":                              \"expvar\",\n\t\"expvar.Publish\":                                \"expvar\",\n\t\"expvar.String\":                                 \"expvar\",\n\t\"expvar.Var\":                                    \"expvar\",\n\t\"fcgi.ErrConnClosed\":                            \"net/http/fcgi\",\n\t\"fcgi.ErrRequestAborted\":                        \"net/http/fcgi\",\n\t\"fcgi.Serve\":                                    \"net/http/fcgi\",\n\t\"filepath.Abs\":                                  \"path/filepath\",\n\t\"filepath.Base\":                                 \"path/filepath\",\n\t\"filepath.Clean\":                                \"path/filepath\",\n\t\"filepath.Dir\":                                  \"path/filepath\",\n\t\"filepath.ErrBadPattern\":                        \"path/filepath\",\n\t\"filepath.EvalSymlinks\":                         \"path/filepath\",\n\t\"filepath.Ext\":                                  \"path/filepath\",\n\t\"filepath.FromSlash\":                            \"path/filepath\",\n\t\"filepath.Glob\":                                 \"path/filepath\",\n\t\"filepath.HasPrefix\":                            \"path/filepath\",\n\t\"filepath.IsAbs\":                                \"path/filepath\",\n\t\"filepath.Join\":                                 \"path/filepath\",\n\t\"filepath.ListSeparator\":                        \"path/filepath\",\n\t\"filepath.Match\":                                \"path/filepath\",\n\t\"filepath.Rel\":                                  \"path/filepath\",\n\t\"filepath.Separator\":                            \"path/filepath\",\n\t\"filepath.SkipDir\":                              \"path/filepath\",\n\t\"filepath.Split\":                                \"path/filepath\",\n\t\"filepath.SplitList\":                            \"path/filepath\",\n\t\"filepath.ToSlash\":                              \"path/filepath\",\n\t\"filepath.VolumeName\":                           \"path/filepath\",\n\t\"filepath.Walk\":                                 \"path/filepath\",\n\t\"filepath.WalkFunc\":                             \"path/filepath\",\n\t\"flag.Arg\":                                      \"flag\",\n\t\"flag.Args\":                                     \"flag\",\n\t\"flag.Bool\":                                     \"flag\",\n\t\"flag.BoolVar\":                                  \"flag\",\n\t\"flag.CommandLine\":                              \"flag\",\n\t\"flag.ContinueOnError\":                          \"flag\",\n\t\"flag.Duration\":                                 \"flag\",\n\t\"flag.DurationVar\":                              \"flag\",\n\t\"flag.ErrHelp\":                                  \"flag\",\n\t\"flag.ErrorHandling\":                            \"flag\",\n\t\"flag.ExitOnError\":                              \"flag\",\n\t\"flag.Flag\":                                     \"flag\",\n\t\"flag.FlagSet\":                                  \"flag\",\n\t\"flag.Float64\":                                  \"flag\",\n\t\"flag.Float64Var\":                               \"flag\",\n\t\"flag.Getter\":                                   \"flag\",\n\t\"flag.Int\":                                      \"flag\",\n\t\"flag.Int64\":                                    \"flag\",\n\t\"flag.Int64Var\":                                 \"flag\",\n\t\"flag.IntVar\":                                   \"flag\",\n\t\"flag.Lookup\":                                   \"flag\",\n\t\"flag.NArg\":                                     \"flag\",\n\t\"flag.NFlag\":                                    \"flag\",\n\t\"flag.NewFlagSet\":                               \"flag\",\n\t\"flag.PanicOnError\":                             \"flag\",\n\t\"flag.Parse\":                                    \"flag\",\n\t\"flag.Parsed\":                                   \"flag\",\n\t\"flag.PrintDefaults\":                            \"flag\",\n\t\"flag.Set\":                                      \"flag\",\n\t\"flag.String\":                                   \"flag\",\n\t\"flag.StringVar\":                                \"flag\",\n\t\"flag.Uint\":                                     \"flag\",\n\t\"flag.Uint64\":                                   \"flag\",\n\t\"flag.Uint64Var\":                                \"flag\",\n\t\"flag.UintVar\":                                  \"flag\",\n\t\"flag.UnquoteUsage\":                             \"flag\",\n\t\"flag.Usage\":                                    \"flag\",\n\t\"flag.Value\":                                    \"flag\",\n\t\"flag.Var\":                                      \"flag\",\n\t\"flag.Visit\":                                    \"flag\",\n\t\"flag.VisitAll\":                                 \"flag\",\n\t\"flate.BestCompression\":                         \"compress/flate\",\n\t\"flate.BestSpeed\":                               \"compress/flate\",\n\t\"flate.CorruptInputError\":                       \"compress/flate\",\n\t\"flate.DefaultCompression\":                      \"compress/flate\",\n\t\"flate.HuffmanOnly\":                             \"compress/flate\",\n\t\"flate.InternalError\":                           \"compress/flate\",\n\t\"flate.NewReader\":                               \"compress/flate\",\n\t\"flate.NewReaderDict\":                           \"compress/flate\",\n\t\"flate.NewWriter\":                               \"compress/flate\",\n\t\"flate.NewWriterDict\":                           \"compress/flate\",\n\t\"flate.NoCompression\":                           \"compress/flate\",\n\t\"flate.ReadError\":                               \"compress/flate\",\n\t\"flate.Reader\":                                  \"compress/flate\",\n\t\"flate.Resetter\":                                \"compress/flate\",\n\t\"flate.WriteError\":                              \"compress/flate\",\n\t\"flate.Writer\":                                  \"compress/flate\",\n\t\"fmt.Errorf\":                                    \"fmt\",\n\t\"fmt.Formatter\":                                 \"fmt\",\n\t\"fmt.Fprint\":                                    \"fmt\",\n\t\"fmt.Fprintf\":                                   \"fmt\",\n\t\"fmt.Fprintln\":                                  \"fmt\",\n\t\"fmt.Fscan\":                                     \"fmt\",\n\t\"fmt.Fscanf\":                                    \"fmt\",\n\t\"fmt.Fscanln\":                                   \"fmt\",\n\t\"fmt.GoStringer\":                                \"fmt\",\n\t\"fmt.Print\":                                     \"fmt\",\n\t\"fmt.Printf\":                                    \"fmt\",\n\t\"fmt.Println\":                                   \"fmt\",\n\t\"fmt.Scan\":                                      \"fmt\",\n\t\"fmt.ScanState\":                                 \"fmt\",\n\t\"fmt.Scanf\":                                     \"fmt\",\n\t\"fmt.Scanln\":                                    \"fmt\",\n\t\"fmt.Scanner\":                                   \"fmt\",\n\t\"fmt.Sprint\":                                    \"fmt\",\n\t\"fmt.Sprintf\":                                   \"fmt\",\n\t\"fmt.Sprintln\":                                  \"fmt\",\n\t\"fmt.Sscan\":                                     \"fmt\",\n\t\"fmt.Sscanf\":                                    \"fmt\",\n\t\"fmt.Sscanln\":                                   \"fmt\",\n\t\"fmt.State\":                                     \"fmt\",\n\t\"fmt.Stringer\":                                  \"fmt\",\n\t\"fnv.New32\":                                     \"hash/fnv\",\n\t\"fnv.New32a\":                                    \"hash/fnv\",\n\t\"fnv.New64\":                                     \"hash/fnv\",\n\t\"fnv.New64a\":                                    \"hash/fnv\",\n\t\"format.Node\":                                   \"go/format\",\n\t\"format.Source\":                                 \"go/format\",\n\t\"gif.Decode\":                                    \"image/gif\",\n\t\"gif.DecodeAll\":                                 \"image/gif\",\n\t\"gif.DecodeConfig\":                              \"image/gif\",\n\t\"gif.DisposalBackground\":                        \"image/gif\",\n\t\"gif.DisposalNone\":                              \"image/gif\",\n\t\"gif.DisposalPrevious\":                          \"image/gif\",\n\t\"gif.Encode\":                                    \"image/gif\",\n\t\"gif.EncodeAll\":                                 \"image/gif\",\n\t\"gif.GIF\":                                       \"image/gif\",\n\t\"gif.Options\":                                   \"image/gif\",\n\t\"gob.CommonType\":                                \"encoding/gob\",\n\t\"gob.Decoder\":                                   \"encoding/gob\",\n\t\"gob.Encoder\":                                   \"encoding/gob\",\n\t\"gob.GobDecoder\":                                \"encoding/gob\",\n\t\"gob.GobEncoder\":                                \"encoding/gob\",\n\t\"gob.NewDecoder\":                                \"encoding/gob\",\n\t\"gob.NewEncoder\":                                \"encoding/gob\",\n\t\"gob.Register\":                                  \"encoding/gob\",\n\t\"gob.RegisterName\":                              \"encoding/gob\",\n\t\"gosym.DecodingError\":                           \"debug/gosym\",\n\t\"gosym.Func\":                                    \"debug/gosym\",\n\t\"gosym.LineTable\":                               \"debug/gosym\",\n\t\"gosym.NewLineTable\":                            \"debug/gosym\",\n\t\"gosym.NewTable\":                                \"debug/gosym\",\n\t\"gosym.Obj\":                                     \"debug/gosym\",\n\t\"gosym.Sym\":                                     \"debug/gosym\",\n\t\"gosym.Table\":                                   \"debug/gosym\",\n\t\"gosym.UnknownFileError\":                        \"debug/gosym\",\n\t\"gosym.UnknownLineError\":                        \"debug/gosym\",\n\t\"gzip.BestCompression\":                          \"compress/gzip\",\n\t\"gzip.BestSpeed\":                                \"compress/gzip\",\n\t\"gzip.DefaultCompression\":                       \"compress/gzip\",\n\t\"gzip.ErrChecksum\":                              \"compress/gzip\",\n\t\"gzip.ErrHeader\":                                \"compress/gzip\",\n\t\"gzip.Header\":                                   \"compress/gzip\",\n\t\"gzip.NewReader\":                                \"compress/gzip\",\n\t\"gzip.NewWriter\":                                \"compress/gzip\",\n\t\"gzip.NewWriterLevel\":                           \"compress/gzip\",\n\t\"gzip.NoCompression\":                            \"compress/gzip\",\n\t\"gzip.Reader\":                                   \"compress/gzip\",\n\t\"gzip.Writer\":                                   \"compress/gzip\",\n\t\"hash.Hash\":                                     \"hash\",\n\t\"hash.Hash32\":                                   \"hash\",\n\t\"hash.Hash64\":                                   \"hash\",\n\t\"heap.Fix\":                                      \"container/heap\",\n\t\"heap.Init\":                                     \"container/heap\",\n\t\"heap.Interface\":                                \"container/heap\",\n\t\"heap.Pop\":                                      \"container/heap\",\n\t\"heap.Push\":                                     \"container/heap\",\n\t\"heap.Remove\":                                   \"container/heap\",\n\t\"hex.Decode\":                                    \"encoding/hex\",\n\t\"hex.DecodeString\":                              \"encoding/hex\",\n\t\"hex.DecodedLen\":                                \"encoding/hex\",\n\t\"hex.Dump\":                                      \"encoding/hex\",\n\t\"hex.Dumper\":                                    \"encoding/hex\",\n\t\"hex.Encode\":                                    \"encoding/hex\",\n\t\"hex.EncodeToString\":                            \"encoding/hex\",\n\t\"hex.EncodedLen\":                                \"encoding/hex\",\n\t\"hex.ErrLength\":                                 \"encoding/hex\",\n\t\"hex.InvalidByteError\":                          \"encoding/hex\",\n\t\"hmac.Equal\":                                    \"crypto/hmac\",\n\t\"hmac.New\":                                      \"crypto/hmac\",\n\t\"html.EscapeString\":                             \"html\",\n\t\"html.UnescapeString\":                           \"html\",\n\t\"http.CanonicalHeaderKey\":                       \"net/http\",\n\t\"http.Client\":                                   \"net/http\",\n\t\"http.CloseNotifier\":                            \"net/http\",\n\t\"http.ConnState\":                                \"net/http\",\n\t\"http.Cookie\":                                   \"net/http\",\n\t\"http.CookieJar\":                                \"net/http\",\n\t\"http.DefaultClient\":                            \"net/http\",\n\t\"http.DefaultMaxHeaderBytes\":                    \"net/http\",\n\t\"http.DefaultMaxIdleConnsPerHost\":               \"net/http\",\n\t\"http.DefaultServeMux\":                          \"net/http\",\n\t\"http.DefaultTransport\":                         \"net/http\",\n\t\"http.DetectContentType\":                        \"net/http\",\n\t\"http.Dir\":                                      \"net/http\",\n\t\"http.ErrBodyNotAllowed\":                        \"net/http\",\n\t\"http.ErrBodyReadAfterClose\":                    \"net/http\",\n\t\"http.ErrContentLength\":                         \"net/http\",\n\t\"http.ErrHandlerTimeout\":                        \"net/http\",\n\t\"http.ErrHeaderTooLong\":                         \"net/http\",\n\t\"http.ErrHijacked\":                              \"net/http\",\n\t\"http.ErrLineTooLong\":                           \"net/http\",\n\t\"http.ErrMissingBoundary\":                       \"net/http\",\n\t\"http.ErrMissingContentLength\":                  \"net/http\",\n\t\"http.ErrMissingFile\":                           \"net/http\",\n\t\"http.ErrNoCookie\":                              \"net/http\",\n\t\"http.ErrNoLocation\":                            \"net/http\",\n\t\"http.ErrNotMultipart\":                          \"net/http\",\n\t\"http.ErrNotSupported\":                          \"net/http\",\n\t\"http.ErrShortBody\":                             \"net/http\",\n\t\"http.ErrSkipAltProtocol\":                       \"net/http\",\n\t\"http.ErrUnexpectedTrailer\":                     \"net/http\",\n\t\"http.ErrUseLastResponse\":                       \"net/http\",\n\t\"http.ErrWriteAfterFlush\":                       \"net/http\",\n\t\"http.Error\":                                    \"net/http\",\n\t\"http.File\":                                     \"net/http\",\n\t\"http.FileServer\":                               \"net/http\",\n\t\"http.FileSystem\":                               \"net/http\",\n\t\"http.Flusher\":                                  \"net/http\",\n\t\"http.Get\":                                      \"net/http\",\n\t\"http.Handle\":                                   \"net/http\",\n\t\"http.HandleFunc\":                               \"net/http\",\n\t\"http.Handler\":                                  \"net/http\",\n\t\"http.HandlerFunc\":                              \"net/http\",\n\t\"http.Head\":                                     \"net/http\",\n\t\"http.Header\":                                   \"net/http\",\n\t\"http.Hijacker\":                                 \"net/http\",\n\t\"http.ListenAndServe\":                           \"net/http\",\n\t\"http.ListenAndServeTLS\":                        \"net/http\",\n\t\"http.LocalAddrContextKey\":                      \"net/http\",\n\t\"http.MaxBytesReader\":                           \"net/http\",\n\t\"http.MethodConnect\":                            \"net/http\",\n\t\"http.MethodDelete\":                             \"net/http\",\n\t\"http.MethodGet\":                                \"net/http\",\n\t\"http.MethodHead\":                               \"net/http\",\n\t\"http.MethodOptions\":                            \"net/http\",\n\t\"http.MethodPatch\":                              \"net/http\",\n\t\"http.MethodPost\":                               \"net/http\",\n\t\"http.MethodPut\":                                \"net/http\",\n\t\"http.MethodTrace\":                              \"net/http\",\n\t\"http.NewFileTransport\":                         \"net/http\",\n\t\"http.NewRequest\":                               \"net/http\",\n\t\"http.NewServeMux\":                              \"net/http\",\n\t\"http.NotFound\":                                 \"net/http\",\n\t\"http.NotFoundHandler\":                          \"net/http\",\n\t\"http.ParseHTTPVersion\":                         \"net/http\",\n\t\"http.ParseTime\":                                \"net/http\",\n\t\"http.Post\":                                     \"net/http\",\n\t\"http.PostForm\":                                 \"net/http\",\n\t\"http.ProtocolError\":                            \"net/http\",\n\t\"http.ProxyFromEnvironment\":                     \"net/http\",\n\t\"http.ProxyURL\":                                 \"net/http\",\n\t\"http.ReadRequest\":                              \"net/http\",\n\t\"http.ReadResponse\":                             \"net/http\",\n\t\"http.Redirect\":                                 \"net/http\",\n\t\"http.RedirectHandler\":                          \"net/http\",\n\t\"http.Request\":                                  \"net/http\",\n\t\"http.Response\":                                 \"net/http\",\n\t\"http.ResponseWriter\":                           \"net/http\",\n\t\"http.RoundTripper\":                             \"net/http\",\n\t\"http.Serve\":                                    \"net/http\",\n\t\"http.ServeContent\":                             \"net/http\",\n\t\"http.ServeFile\":                                \"net/http\",\n\t\"http.ServeMux\":                                 \"net/http\",\n\t\"http.Server\":                                   \"net/http\",\n\t\"http.ServerContextKey\":                         \"net/http\",\n\t\"http.SetCookie\":                                \"net/http\",\n\t\"http.StateActive\":                              \"net/http\",\n\t\"http.StateClosed\":                              \"net/http\",\n\t\"http.StateHijacked\":                            \"net/http\",\n\t\"http.StateIdle\":                                \"net/http\",\n\t\"http.StateNew\":                                 \"net/http\",\n\t\"http.StatusAccepted\":                           \"net/http\",\n\t\"http.StatusAlreadyReported\":                    \"net/http\",\n\t\"http.StatusBadGateway\":                         \"net/http\",\n\t\"http.StatusBadRequest\":                         \"net/http\",\n\t\"http.StatusConflict\":                           \"net/http\",\n\t\"http.StatusContinue\":                           \"net/http\",\n\t\"http.StatusCreated\":                            \"net/http\",\n\t\"http.StatusExpectationFailed\":                  \"net/http\",\n\t\"http.StatusFailedDependency\":                   \"net/http\",\n\t\"http.StatusForbidden\":                          \"net/http\",\n\t\"http.StatusFound\":                              \"net/http\",\n\t\"http.StatusGatewayTimeout\":                     \"net/http\",\n\t\"http.StatusGone\":                               \"net/http\",\n\t\"http.StatusHTTPVersionNotSupported\":            \"net/http\",\n\t\"http.StatusIMUsed\":                             \"net/http\",\n\t\"http.StatusInsufficientStorage\":                \"net/http\",\n\t\"http.StatusInternalServerError\":                \"net/http\",\n\t\"http.StatusLengthRequired\":                     \"net/http\",\n\t\"http.StatusLocked\":                             \"net/http\",\n\t\"http.StatusLoopDetected\":                       \"net/http\",\n\t\"http.StatusMethodNotAllowed\":                   \"net/http\",\n\t\"http.StatusMovedPermanently\":                   \"net/http\",\n\t\"http.StatusMultiStatus\":                        \"net/http\",\n\t\"http.StatusMultipleChoices\":                    \"net/http\",\n\t\"http.StatusNetworkAuthenticationRequired\":      \"net/http\",\n\t\"http.StatusNoContent\":                          \"net/http\",\n\t\"http.StatusNonAuthoritativeInfo\":               \"net/http\",\n\t\"http.StatusNotAcceptable\":                      \"net/http\",\n\t\"http.StatusNotExtended\":                        \"net/http\",\n\t\"http.StatusNotFound\":                           \"net/http\",\n\t\"http.StatusNotImplemented\":                     \"net/http\",\n\t\"http.StatusNotModified\":                        \"net/http\",\n\t\"http.StatusOK\":                                 \"net/http\",\n\t\"http.StatusPartialContent\":                     \"net/http\",\n\t\"http.StatusPaymentRequired\":                    \"net/http\",\n\t\"http.StatusPermanentRedirect\":                  \"net/http\",\n\t\"http.StatusPreconditionFailed\":                 \"net/http\",\n\t\"http.StatusPreconditionRequired\":               \"net/http\",\n\t\"http.StatusProcessing\":                         \"net/http\",\n\t\"http.StatusProxyAuthRequired\":                  \"net/http\",\n\t\"http.StatusRequestEntityTooLarge\":              \"net/http\",\n\t\"http.StatusRequestHeaderFieldsTooLarge\":        \"net/http\",\n\t\"http.StatusRequestTimeout\":                     \"net/http\",\n\t\"http.StatusRequestURITooLong\":                  \"net/http\",\n\t\"http.StatusRequestedRangeNotSatisfiable\":       \"net/http\",\n\t\"http.StatusResetContent\":                       \"net/http\",\n\t\"http.StatusSeeOther\":                           \"net/http\",\n\t\"http.StatusServiceUnavailable\":                 \"net/http\",\n\t\"http.StatusSwitchingProtocols\":                 \"net/http\",\n\t\"http.StatusTeapot\":                             \"net/http\",\n\t\"http.StatusTemporaryRedirect\":                  \"net/http\",\n\t\"http.StatusText\":                               \"net/http\",\n\t\"http.StatusTooManyRequests\":                    \"net/http\",\n\t\"http.StatusUnauthorized\":                       \"net/http\",\n\t\"http.StatusUnavailableForLegalReasons\":         \"net/http\",\n\t\"http.StatusUnprocessableEntity\":                \"net/http\",\n\t\"http.StatusUnsupportedMediaType\":               \"net/http\",\n\t\"http.StatusUpgradeRequired\":                    \"net/http\",\n\t\"http.StatusUseProxy\":                           \"net/http\",\n\t\"http.StatusVariantAlsoNegotiates\":              \"net/http\",\n\t\"http.StripPrefix\":                              \"net/http\",\n\t\"http.TimeFormat\":                               \"net/http\",\n\t\"http.TimeoutHandler\":                           \"net/http\",\n\t\"http.Transport\":                                \"net/http\",\n\t\"httptest.DefaultRemoteAddr\":                    \"net/http/httptest\",\n\t\"httptest.NewRecorder\":                          \"net/http/httptest\",\n\t\"httptest.NewRequest\":                           \"net/http/httptest\",\n\t\"httptest.NewServer\":                            \"net/http/httptest\",\n\t\"httptest.NewTLSServer\":                         \"net/http/httptest\",\n\t\"httptest.NewUnstartedServer\":                   \"net/http/httptest\",\n\t\"httptest.ResponseRecorder\":                     \"net/http/httptest\",\n\t\"httptest.Server\":                               \"net/http/httptest\",\n\t\"httptrace.ClientTrace\":                         \"net/http/httptrace\",\n\t\"httptrace.ContextClientTrace\":                  \"net/http/httptrace\",\n\t\"httptrace.DNSDoneInfo\":                         \"net/http/httptrace\",\n\t\"httptrace.DNSStartInfo\":                        \"net/http/httptrace\",\n\t\"httptrace.GotConnInfo\":                         \"net/http/httptrace\",\n\t\"httptrace.WithClientTrace\":                     \"net/http/httptrace\",\n\t\"httptrace.WroteRequestInfo\":                    \"net/http/httptrace\",\n\t\"httputil.BufferPool\":                           \"net/http/httputil\",\n\t\"httputil.ClientConn\":                           \"net/http/httputil\",\n\t\"httputil.DumpRequest\":                          \"net/http/httputil\",\n\t\"httputil.DumpRequestOut\":                       \"net/http/httputil\",\n\t\"httputil.DumpResponse\":                         \"net/http/httputil\",\n\t\"httputil.ErrClosed\":                            \"net/http/httputil\",\n\t\"httputil.ErrLineTooLong\":                       \"net/http/httputil\",\n\t\"httputil.ErrPersistEOF\":                        \"net/http/httputil\",\n\t\"httputil.ErrPipeline\":                          \"net/http/httputil\",\n\t\"httputil.NewChunkedReader\":                     \"net/http/httputil\",\n\t\"httputil.NewChunkedWriter\":                     \"net/http/httputil\",\n\t\"httputil.NewClientConn\":                        \"net/http/httputil\",\n\t\"httputil.NewProxyClientConn\":                   \"net/http/httputil\",\n\t\"httputil.NewServerConn\":                        \"net/http/httputil\",\n\t\"httputil.NewSingleHostReverseProxy\":            \"net/http/httputil\",\n\t\"httputil.ReverseProxy\":                         \"net/http/httputil\",\n\t\"httputil.ServerConn\":                           \"net/http/httputil\",\n\t\"image.Alpha\":                                   \"image\",\n\t\"image.Alpha16\":                                 \"image\",\n\t\"image.Black\":                                   \"image\",\n\t\"image.CMYK\":                                    \"image\",\n\t\"image.Config\":                                  \"image\",\n\t\"image.Decode\":                                  \"image\",\n\t\"image.DecodeConfig\":                            \"image\",\n\t\"image.ErrFormat\":                               \"image\",\n\t\"image.Gray\":                                    \"image\",\n\t\"image.Gray16\":                                  \"image\",\n\t\"image.Image\":                                   \"image\",\n\t\"image.NRGBA\":                                   \"image\",\n\t\"image.NRGBA64\":                                 \"image\",\n\t\"image.NYCbCrA\":                                 \"image\",\n\t\"image.NewAlpha\":                                \"image\",\n\t\"image.NewAlpha16\":                              \"image\",\n\t\"image.NewCMYK\":                                 \"image\",\n\t\"image.NewGray\":                                 \"image\",\n\t\"image.NewGray16\":                               \"image\",\n\t\"image.NewNRGBA\":                                \"image\",\n\t\"image.NewNRGBA64\":                              \"image\",\n\t\"image.NewNYCbCrA\":                              \"image\",\n\t\"image.NewPaletted\":                             \"image\",\n\t\"image.NewRGBA\":                                 \"image\",\n\t\"image.NewRGBA64\":                               \"image\",\n\t\"image.NewUniform\":                              \"image\",\n\t\"image.NewYCbCr\":                                \"image\",\n\t\"image.Opaque\":                                  \"image\",\n\t\"image.Paletted\":                                \"image\",\n\t\"image.PalettedImage\":                           \"image\",\n\t\"image.Point\":                                   \"image\",\n\t\"image.Pt\":                                      \"image\",\n\t\"image.RGBA\":                                    \"image\",\n\t\"image.RGBA64\":                                  \"image\",\n\t\"image.Rect\":                                    \"image\",\n\t\"image.Rectangle\":                               \"image\",\n\t\"image.RegisterFormat\":                          \"image\",\n\t\"image.Transparent\":                             \"image\",\n\t\"image.Uniform\":                                 \"image\",\n\t\"image.White\":                                   \"image\",\n\t\"image.YCbCr\":                                   \"image\",\n\t\"image.YCbCrSubsampleRatio\":                     \"image\",\n\t\"image.YCbCrSubsampleRatio410\":                  \"image\",\n\t\"image.YCbCrSubsampleRatio411\":                  \"image\",\n\t\"image.YCbCrSubsampleRatio420\":                  \"image\",\n\t\"image.YCbCrSubsampleRatio422\":                  \"image\",\n\t\"image.YCbCrSubsampleRatio440\":                  \"image\",\n\t\"image.YCbCrSubsampleRatio444\":                  \"image\",\n\t\"image.ZP\":                                      \"image\",\n\t\"image.ZR\":                                      \"image\",\n\t\"importer.Default\":                              \"go/importer\",\n\t\"importer.For\":                                  \"go/importer\",\n\t\"importer.Lookup\":                               \"go/importer\",\n\t\"io.ByteReader\":                                 \"io\",\n\t\"io.ByteScanner\":                                \"io\",\n\t\"io.ByteWriter\":                                 \"io\",\n\t\"io.Closer\":                                     \"io\",\n\t\"io.Copy\":                                       \"io\",\n\t\"io.CopyBuffer\":                                 \"io\",\n\t\"io.CopyN\":                                      \"io\",\n\t\"io.EOF\":                                        \"io\",\n\t\"io.ErrClosedPipe\":                              \"io\",\n\t\"io.ErrNoProgress\":                              \"io\",\n\t\"io.ErrShortBuffer\":                             \"io\",\n\t\"io.ErrShortWrite\":                              \"io\",\n\t\"io.ErrUnexpectedEOF\":                           \"io\",\n\t\"io.LimitReader\":                                \"io\",\n\t\"io.LimitedReader\":                              \"io\",\n\t\"io.MultiReader\":                                \"io\",\n\t\"io.MultiWriter\":                                \"io\",\n\t\"io.NewSectionReader\":                           \"io\",\n\t\"io.Pipe\":                                       \"io\",\n\t\"io.PipeReader\":                                 \"io\",\n\t\"io.PipeWriter\":                                 \"io\",\n\t\"io.ReadAtLeast\":                                \"io\",\n\t\"io.ReadCloser\":                                 \"io\",\n\t\"io.ReadFull\":                                   \"io\",\n\t\"io.ReadSeeker\":                                 \"io\",\n\t\"io.ReadWriteCloser\":                            \"io\",\n\t\"io.ReadWriteSeeker\":                            \"io\",\n\t\"io.ReadWriter\":                                 \"io\",\n\t\"io.Reader\":                                     \"io\",\n\t\"io.ReaderAt\":                                   \"io\",\n\t\"io.ReaderFrom\":                                 \"io\",\n\t\"io.RuneReader\":                                 \"io\",\n\t\"io.RuneScanner\":                                \"io\",\n\t\"io.SectionReader\":                              \"io\",\n\t\"io.SeekCurrent\":                                \"io\",\n\t\"io.SeekEnd\":                                    \"io\",\n\t\"io.SeekStart\":                                  \"io\",\n\t\"io.Seeker\":                                     \"io\",\n\t\"io.TeeReader\":                                  \"io\",\n\t\"io.WriteCloser\":                                \"io\",\n\t\"io.WriteSeeker\":                                \"io\",\n\t\"io.WriteString\":                                \"io\",\n\t\"io.Writer\":                                     \"io\",\n\t\"io.WriterAt\":                                   \"io\",\n\t\"io.WriterTo\":                                   \"io\",\n\t\"iotest.DataErrReader\":                          \"testing/iotest\",\n\t\"iotest.ErrTimeout\":                             \"testing/iotest\",\n\t\"iotest.HalfReader\":                             \"testing/iotest\",\n\t\"iotest.NewReadLogger\":                          \"testing/iotest\",\n\t\"iotest.NewWriteLogger\":                         \"testing/iotest\",\n\t\"iotest.OneByteReader\":                          \"testing/iotest\",\n\t\"iotest.TimeoutReader\":                          \"testing/iotest\",\n\t\"iotest.TruncateWriter\":                         \"testing/iotest\",\n\t\"ioutil.Discard\":                                \"io/ioutil\",\n\t\"ioutil.NopCloser\":                              \"io/ioutil\",\n\t\"ioutil.ReadAll\":                                \"io/ioutil\",\n\t\"ioutil.ReadDir\":                                \"io/ioutil\",\n\t\"ioutil.ReadFile\":                               \"io/ioutil\",\n\t\"ioutil.TempDir\":                                \"io/ioutil\",\n\t\"ioutil.TempFile\":                               \"io/ioutil\",\n\t\"ioutil.WriteFile\":                              \"io/ioutil\",\n\t\"jpeg.Decode\":                                   \"image/jpeg\",\n\t\"jpeg.DecodeConfig\":                             \"image/jpeg\",\n\t\"jpeg.DefaultQuality\":                           \"image/jpeg\",\n\t\"jpeg.Encode\":                                   \"image/jpeg\",\n\t\"jpeg.FormatError\":                              \"image/jpeg\",\n\t\"jpeg.Options\":                                  \"image/jpeg\",\n\t\"jpeg.Reader\":                                   \"image/jpeg\",\n\t\"jpeg.UnsupportedError\":                         \"image/jpeg\",\n\t\"json.Compact\":                                  \"encoding/json\",\n\t\"json.Decoder\":                                  \"encoding/json\",\n\t\"json.Delim\":                                    \"encoding/json\",\n\t\"json.Encoder\":                                  \"encoding/json\",\n\t\"json.HTMLEscape\":                               \"encoding/json\",\n\t\"json.Indent\":                                   \"encoding/json\",\n\t\"json.InvalidUTF8Error\":                         \"encoding/json\",\n\t\"json.InvalidUnmarshalError\":                    \"encoding/json\",\n\t\"json.Marshal\":                                  \"encoding/json\",\n\t\"json.MarshalIndent\":                            \"encoding/json\",\n\t\"json.Marshaler\":                                \"encoding/json\",\n\t\"json.MarshalerError\":                           \"encoding/json\",\n\t\"json.NewDecoder\":                               \"encoding/json\",\n\t\"json.NewEncoder\":                               \"encoding/json\",\n\t\"json.Number\":                                   \"encoding/json\",\n\t\"json.RawMessage\":                               \"encoding/json\",\n\t\"json.SyntaxError\":                              \"encoding/json\",\n\t\"json.Token\":                                    \"encoding/json\",\n\t\"json.Unmarshal\":                                \"encoding/json\",\n\t\"json.UnmarshalFieldError\":                      \"encoding/json\",\n\t\"json.UnmarshalTypeError\":                       \"encoding/json\",\n\t\"json.Unmarshaler\":                              \"encoding/json\",\n\t\"json.UnsupportedTypeError\":                     \"encoding/json\",\n\t\"json.UnsupportedValueError\":                    \"encoding/json\",\n\t\"jsonrpc.Dial\":                                  \"net/rpc/jsonrpc\",\n\t\"jsonrpc.NewClient\":                             \"net/rpc/jsonrpc\",\n\t\"jsonrpc.NewClientCodec\":                        \"net/rpc/jsonrpc\",\n\t\"jsonrpc.NewServerCodec\":                        \"net/rpc/jsonrpc\",\n\t\"jsonrpc.ServeConn\":                             \"net/rpc/jsonrpc\",\n\t\"list.Element\":                                  \"container/list\",\n\t\"list.List\":                                     \"container/list\",\n\t\"list.New\":                                      \"container/list\",\n\t\"log.Fatal\":                                     \"log\",\n\t\"log.Fatalf\":                                    \"log\",\n\t\"log.Fatalln\":                                   \"log\",\n\t\"log.Flags\":                                     \"log\",\n\t\"log.LUTC\":                                      \"log\",\n\t\"log.Ldate\":                                     \"log\",\n\t\"log.Llongfile\":                                 \"log\",\n\t\"log.Lmicroseconds\":                             \"log\",\n\t\"log.Logger\":                                    \"log\",\n\t\"log.Lshortfile\":                                \"log\",\n\t\"log.LstdFlags\":                                 \"log\",\n\t\"log.Ltime\":                                     \"log\",\n\t\"log.New\":                                       \"log\",\n\t\"log.Output\":                                    \"log\",\n\t\"log.Panic\":                                     \"log\",\n\t\"log.Panicf\":                                    \"log\",\n\t\"log.Panicln\":                                   \"log\",\n\t\"log.Prefix\":                                    \"log\",\n\t\"log.Print\":                                     \"log\",\n\t\"log.Printf\":                                    \"log\",\n\t\"log.Println\":                                   \"log\",\n\t\"log.SetFlags\":                                  \"log\",\n\t\"log.SetOutput\":                                 \"log\",\n\t\"log.SetPrefix\":                                 \"log\",\n\t\"lzw.LSB\":                                       \"compress/lzw\",\n\t\"lzw.MSB\":                                       \"compress/lzw\",\n\t\"lzw.NewReader\":                                 \"compress/lzw\",\n\t\"lzw.NewWriter\":                                 \"compress/lzw\",\n\t\"lzw.Order\":                                     \"compress/lzw\",\n\t\"macho.Cpu\":                                     \"debug/macho\",\n\t\"macho.Cpu386\":                                  \"debug/macho\",\n\t\"macho.CpuAmd64\":                                \"debug/macho\",\n\t\"macho.CpuArm\":                                  \"debug/macho\",\n\t\"macho.CpuPpc\":                                  \"debug/macho\",\n\t\"macho.CpuPpc64\":                                \"debug/macho\",\n\t\"macho.Dylib\":                                   \"debug/macho\",\n\t\"macho.DylibCmd\":                                \"debug/macho\",\n\t\"macho.Dysymtab\":                                \"debug/macho\",\n\t\"macho.DysymtabCmd\":                             \"debug/macho\",\n\t\"macho.ErrNotFat\":                               \"debug/macho\",\n\t\"macho.FatArch\":                                 \"debug/macho\",\n\t\"macho.FatArchHeader\":                           \"debug/macho\",\n\t\"macho.FatFile\":                                 \"debug/macho\",\n\t\"macho.File\":                                    \"debug/macho\",\n\t\"macho.FileHeader\":                              \"debug/macho\",\n\t\"macho.FormatError\":                             \"debug/macho\",\n\t\"macho.Load\":                                    \"debug/macho\",\n\t\"macho.LoadBytes\":                               \"debug/macho\",\n\t\"macho.LoadCmd\":                                 \"debug/macho\",\n\t\"macho.LoadCmdDylib\":                            \"debug/macho\",\n\t\"macho.LoadCmdDylinker\":                         \"debug/macho\",\n\t\"macho.LoadCmdDysymtab\":                         \"debug/macho\",\n\t\"macho.LoadCmdSegment\":                          \"debug/macho\",\n\t\"macho.LoadCmdSegment64\":                        \"debug/macho\",\n\t\"macho.LoadCmdSymtab\":                           \"debug/macho\",\n\t\"macho.LoadCmdThread\":                           \"debug/macho\",\n\t\"macho.LoadCmdUnixThread\":                       \"debug/macho\",\n\t\"macho.Magic32\":                                 \"debug/macho\",\n\t\"macho.Magic64\":                                 \"debug/macho\",\n\t\"macho.MagicFat\":                                \"debug/macho\",\n\t\"macho.NewFatFile\":                              \"debug/macho\",\n\t\"macho.NewFile\":                                 \"debug/macho\",\n\t\"macho.Nlist32\":                                 \"debug/macho\",\n\t\"macho.Nlist64\":                                 \"debug/macho\",\n\t\"macho.Open\":                                    \"debug/macho\",\n\t\"macho.OpenFat\":                                 \"debug/macho\",\n\t\"macho.Regs386\":                                 \"debug/macho\",\n\t\"macho.RegsAMD64\":                               \"debug/macho\",\n\t\"macho.Section\":                                 \"debug/macho\",\n\t\"macho.Section32\":                               \"debug/macho\",\n\t\"macho.Section64\":                               \"debug/macho\",\n\t\"macho.SectionHeader\":                           \"debug/macho\",\n\t\"macho.Segment\":                                 \"debug/macho\",\n\t\"macho.Segment32\":                               \"debug/macho\",\n\t\"macho.Segment64\":                               \"debug/macho\",\n\t\"macho.SegmentHeader\":                           \"debug/macho\",\n\t\"macho.Symbol\":                                  \"debug/macho\",\n\t\"macho.Symtab\":                                  \"debug/macho\",\n\t\"macho.SymtabCmd\":                               \"debug/macho\",\n\t\"macho.Thread\":                                  \"debug/macho\",\n\t\"macho.Type\":                                    \"debug/macho\",\n\t\"macho.TypeBundle\":                              \"debug/macho\",\n\t\"macho.TypeDylib\":                               \"debug/macho\",\n\t\"macho.TypeExec\":                                \"debug/macho\",\n\t\"macho.TypeObj\":                                 \"debug/macho\",\n\t\"mail.Address\":                                  \"net/mail\",\n\t\"mail.AddressParser\":                            \"net/mail\",\n\t\"mail.ErrHeaderNotPresent\":                      \"net/mail\",\n\t\"mail.Header\":                                   \"net/mail\",\n\t\"mail.Message\":                                  \"net/mail\",\n\t\"mail.ParseAddress\":                             \"net/mail\",\n\t\"mail.ParseAddressList\":                         \"net/mail\",\n\t\"mail.ReadMessage\":                              \"net/mail\",\n\t\"math.Abs\":                                      \"math\",\n\t\"math.Acos\":                                     \"math\",\n\t\"math.Acosh\":                                    \"math\",\n\t\"math.Asin\":                                     \"math\",\n\t\"math.Asinh\":                                    \"math\",\n\t\"math.Atan\":                                     \"math\",\n\t\"math.Atan2\":                                    \"math\",\n\t\"math.Atanh\":                                    \"math\",\n\t\"math.Cbrt\":                                     \"math\",\n\t\"math.Ceil\":                                     \"math\",\n\t\"math.Copysign\":                                 \"math\",\n\t\"math.Cos\":                                      \"math\",\n\t\"math.Cosh\":                                     \"math\",\n\t\"math.Dim\":                                      \"math\",\n\t\"math.E\":                                        \"math\",\n\t\"math.Erf\":                                      \"math\",\n\t\"math.Erfc\":                                     \"math\",\n\t\"math.Exp\":                                      \"math\",\n\t\"math.Exp2\":                                     \"math\",\n\t\"math.Expm1\":                                    \"math\",\n\t\"math.Float32bits\":                              \"math\",\n\t\"math.Float32frombits\":                          \"math\",\n\t\"math.Float64bits\":                              \"math\",\n\t\"math.Float64frombits\":                          \"math\",\n\t\"math.Floor\":                                    \"math\",\n\t\"math.Frexp\":                                    \"math\",\n\t\"math.Gamma\":                                    \"math\",\n\t\"math.Hypot\":                                    \"math\",\n\t\"math.Ilogb\":                                    \"math\",\n\t\"math.Inf\":                                      \"math\",\n\t\"math.IsInf\":                                    \"math\",\n\t\"math.IsNaN\":                                    \"math\",\n\t\"math.J0\":                                       \"math\",\n\t\"math.J1\":                                       \"math\",\n\t\"math.Jn\":                                       \"math\",\n\t\"math.Ldexp\":                                    \"math\",\n\t\"math.Lgamma\":                                   \"math\",\n\t\"math.Ln10\":                                     \"math\",\n\t\"math.Ln2\":                                      \"math\",\n\t\"math.Log\":                                      \"math\",\n\t\"math.Log10\":                                    \"math\",\n\t\"math.Log10E\":                                   \"math\",\n\t\"math.Log1p\":                                    \"math\",\n\t\"math.Log2\":                                     \"math\",\n\t\"math.Log2E\":                                    \"math\",\n\t\"math.Logb\":                                     \"math\",\n\t\"math.Max\":                                      \"math\",\n\t\"math.MaxFloat32\":                               \"math\",\n\t\"math.MaxFloat64\":                               \"math\",\n\t\"math.MaxInt16\":                                 \"math\",\n\t\"math.MaxInt32\":                                 \"math\",\n\t\"math.MaxInt64\":                                 \"math\",\n\t\"math.MaxInt8\":                                  \"math\",\n\t\"math.MaxUint16\":                                \"math\",\n\t\"math.MaxUint32\":                                \"math\",\n\t\"math.MaxUint64\":                                \"math\",\n\t\"math.MaxUint8\":                                 \"math\",\n\t\"math.Min\":                                      \"math\",\n\t\"math.MinInt16\":                                 \"math\",\n\t\"math.MinInt32\":                                 \"math\",\n\t\"math.MinInt64\":                                 \"math\",\n\t\"math.MinInt8\":                                  \"math\",\n\t\"math.Mod\":                                      \"math\",\n\t\"math.Modf\":                                     \"math\",\n\t\"math.NaN\":                                      \"math\",\n\t\"math.Nextafter\":                                \"math\",\n\t\"math.Nextafter32\":                              \"math\",\n\t\"math.Phi\":                                      \"math\",\n\t\"math.Pi\":                                       \"math\",\n\t\"math.Pow\":                                      \"math\",\n\t\"math.Pow10\":                                    \"math\",\n\t\"math.Remainder\":                                \"math\",\n\t\"math.Signbit\":                                  \"math\",\n\t\"math.Sin\":                                      \"math\",\n\t\"math.Sincos\":                                   \"math\",\n\t\"math.Sinh\":                                     \"math\",\n\t\"math.SmallestNonzeroFloat32\":                   \"math\",\n\t\"math.SmallestNonzeroFloat64\":                   \"math\",\n\t\"math.Sqrt\":                                     \"math\",\n\t\"math.Sqrt2\":                                    \"math\",\n\t\"math.SqrtE\":                                    \"math\",\n\t\"math.SqrtPhi\":                                  \"math\",\n\t\"math.SqrtPi\":                                   \"math\",\n\t\"math.Tan\":                                      \"math\",\n\t\"math.Tanh\":                                     \"math\",\n\t\"math.Trunc\":                                    \"math\",\n\t\"math.Y0\":                                       \"math\",\n\t\"math.Y1\":                                       \"math\",\n\t\"math.Yn\":                                       \"math\",\n\t\"md5.BlockSize\":                                 \"crypto/md5\",\n\t\"md5.New\":                                       \"crypto/md5\",\n\t\"md5.Size\":                                      \"crypto/md5\",\n\t\"md5.Sum\":                                       \"crypto/md5\",\n\t\"mime.AddExtensionType\":                         \"mime\",\n\t\"mime.BEncoding\":                                \"mime\",\n\t\"mime.ExtensionsByType\":                         \"mime\",\n\t\"mime.FormatMediaType\":                          \"mime\",\n\t\"mime.ParseMediaType\":                           \"mime\",\n\t\"mime.QEncoding\":                                \"mime\",\n\t\"mime.TypeByExtension\":                          \"mime\",\n\t\"mime.WordDecoder\":                              \"mime\",\n\t\"mime.WordEncoder\":                              \"mime\",\n\t\"multipart.File\":                                \"mime/multipart\",\n\t\"multipart.FileHeader\":                          \"mime/multipart\",\n\t\"multipart.Form\":                                \"mime/multipart\",\n\t\"multipart.NewReader\":                           \"mime/multipart\",\n\t\"multipart.NewWriter\":                           \"mime/multipart\",\n\t\"multipart.Part\":                                \"mime/multipart\",\n\t\"multipart.Reader\":                              \"mime/multipart\",\n\t\"multipart.Writer\":                              \"mime/multipart\",\n\t\"net.Addr\":                                      \"net\",\n\t\"net.AddrError\":                                 \"net\",\n\t\"net.CIDRMask\":                                  \"net\",\n\t\"net.Conn\":                                      \"net\",\n\t\"net.DNSConfigError\":                            \"net\",\n\t\"net.DNSError\":                                  \"net\",\n\t\"net.Dial\":                                      \"net\",\n\t\"net.DialIP\":                                    \"net\",\n\t\"net.DialTCP\":                                   \"net\",\n\t\"net.DialTimeout\":                               \"net\",\n\t\"net.DialUDP\":                                   \"net\",\n\t\"net.DialUnix\":                                  \"net\",\n\t\"net.Dialer\":                                    \"net\",\n\t\"net.ErrWriteToConnected\":                       \"net\",\n\t\"net.Error\":                                     \"net\",\n\t\"net.FileConn\":                                  \"net\",\n\t\"net.FileListener\":                              \"net\",\n\t\"net.FilePacketConn\":                            \"net\",\n\t\"net.FlagBroadcast\":                             \"net\",\n\t\"net.FlagLoopback\":                              \"net\",\n\t\"net.FlagMulticast\":                             \"net\",\n\t\"net.FlagPointToPoint\":                          \"net\",\n\t\"net.FlagUp\":                                    \"net\",\n\t\"net.Flags\":                                     \"net\",\n\t\"net.HardwareAddr\":                              \"net\",\n\t\"net.IP\":                                        \"net\",\n\t\"net.IPAddr\":                                    \"net\",\n\t\"net.IPConn\":                                    \"net\",\n\t\"net.IPMask\":                                    \"net\",\n\t\"net.IPNet\":                                     \"net\",\n\t\"net.IPv4\":                                      \"net\",\n\t\"net.IPv4Mask\":                                  \"net\",\n\t\"net.IPv4allrouter\":                             \"net\",\n\t\"net.IPv4allsys\":                                \"net\",\n\t\"net.IPv4bcast\":                                 \"net\",\n\t\"net.IPv4len\":                                   \"net\",\n\t\"net.IPv4zero\":                                  \"net\",\n\t\"net.IPv6interfacelocalallnodes\":                \"net\",\n\t\"net.IPv6len\":                                   \"net\",\n\t\"net.IPv6linklocalallnodes\":                     \"net\",\n\t\"net.IPv6linklocalallrouters\":                   \"net\",\n\t\"net.IPv6loopback\":                              \"net\",\n\t\"net.IPv6unspecified\":                           \"net\",\n\t\"net.IPv6zero\":                                  \"net\",\n\t\"net.Interface\":                                 \"net\",\n\t\"net.InterfaceAddrs\":                            \"net\",\n\t\"net.InterfaceByIndex\":                          \"net\",\n\t\"net.InterfaceByName\":                           \"net\",\n\t\"net.Interfaces\":                                \"net\",\n\t\"net.InvalidAddrError\":                          \"net\",\n\t\"net.JoinHostPort\":                              \"net\",\n\t\"net.Listen\":                                    \"net\",\n\t\"net.ListenIP\":                                  \"net\",\n\t\"net.ListenMulticastUDP\":                        \"net\",\n\t\"net.ListenPacket\":                              \"net\",\n\t\"net.ListenTCP\":                                 \"net\",\n\t\"net.ListenUDP\":                                 \"net\",\n\t\"net.ListenUnix\":                                \"net\",\n\t\"net.ListenUnixgram\":                            \"net\",\n\t\"net.Listener\":                                  \"net\",\n\t\"net.LookupAddr\":                                \"net\",\n\t\"net.LookupCNAME\":                               \"net\",\n\t\"net.LookupHost\":                                \"net\",\n\t\"net.LookupIP\":                                  \"net\",\n\t\"net.LookupMX\":                                  \"net\",\n\t\"net.LookupNS\":                                  \"net\",\n\t\"net.LookupPort\":                                \"net\",\n\t\"net.LookupSRV\":                                 \"net\",\n\t\"net.LookupTXT\":                                 \"net\",\n\t\"net.MX\":                                        \"net\",\n\t\"net.NS\":                                        \"net\",\n\t\"net.OpError\":                                   \"net\",\n\t\"net.PacketConn\":                                \"net\",\n\t\"net.ParseCIDR\":                                 \"net\",\n\t\"net.ParseError\":                                \"net\",\n\t\"net.ParseIP\":                                   \"net\",\n\t\"net.ParseMAC\":                                  \"net\",\n\t\"net.Pipe\":                                      \"net\",\n\t\"net.ResolveIPAddr\":                             \"net\",\n\t\"net.ResolveTCPAddr\":                            \"net\",\n\t\"net.ResolveUDPAddr\":                            \"net\",\n\t\"net.ResolveUnixAddr\":                           \"net\",\n\t\"net.SRV\":                                       \"net\",\n\t\"net.SplitHostPort\":                             \"net\",\n\t\"net.TCPAddr\":                                   \"net\",\n\t\"net.TCPConn\":                                   \"net\",\n\t\"net.TCPListener\":                               \"net\",\n\t\"net.UDPAddr\":                                   \"net\",\n\t\"net.UDPConn\":                                   \"net\",\n\t\"net.UnixAddr\":                                  \"net\",\n\t\"net.UnixConn\":                                  \"net\",\n\t\"net.UnixListener\":                              \"net\",\n\t\"net.UnknownNetworkError\":                       \"net\",\n\t\"os.Args\":                                       \"os\",\n\t\"os.Chdir\":                                      \"os\",\n\t\"os.Chmod\":                                      \"os\",\n\t\"os.Chown\":                                      \"os\",\n\t\"os.Chtimes\":                                    \"os\",\n\t\"os.Clearenv\":                                   \"os\",\n\t\"os.Create\":                                     \"os\",\n\t\"os.DevNull\":                                    \"os\",\n\t\"os.Environ\":                                    \"os\",\n\t\"os.ErrExist\":                                   \"os\",\n\t\"os.ErrInvalid\":                                 \"os\",\n\t\"os.ErrNotExist\":                                \"os\",\n\t\"os.ErrPermission\":                              \"os\",\n\t\"os.Exit\":                                       \"os\",\n\t\"os.Expand\":                                     \"os\",\n\t\"os.ExpandEnv\":                                  \"os\",\n\t\"os.File\":                                       \"os\",\n\t\"os.FileInfo\":                                   \"os\",\n\t\"os.FileMode\":                                   \"os\",\n\t\"os.FindProcess\":                                \"os\",\n\t\"os.Getegid\":                                    \"os\",\n\t\"os.Getenv\":                                     \"os\",\n\t\"os.Geteuid\":                                    \"os\",\n\t\"os.Getgid\":                                     \"os\",\n\t\"os.Getgroups\":                                  \"os\",\n\t\"os.Getpagesize\":                                \"os\",\n\t\"os.Getpid\":                                     \"os\",\n\t\"os.Getppid\":                                    \"os\",\n\t\"os.Getuid\":                                     \"os\",\n\t\"os.Getwd\":                                      \"os\",\n\t\"os.Hostname\":                                   \"os\",\n\t\"os.Interrupt\":                                  \"os\",\n\t\"os.IsExist\":                                    \"os\",\n\t\"os.IsNotExist\":                                 \"os\",\n\t\"os.IsPathSeparator\":                            \"os\",\n\t\"os.IsPermission\":                               \"os\",\n\t\"os.Kill\":                                       \"os\",\n\t\"os.Lchown\":                                     \"os\",\n\t\"os.Link\":                                       \"os\",\n\t\"os.LinkError\":                                  \"os\",\n\t\"os.LookupEnv\":                                  \"os\",\n\t\"os.Lstat\":                                      \"os\",\n\t\"os.Mkdir\":                                      \"os\",\n\t\"os.MkdirAll\":                                   \"os\",\n\t\"os.ModeAppend\":                                 \"os\",\n\t\"os.ModeCharDevice\":                             \"os\",\n\t\"os.ModeDevice\":                                 \"os\",\n\t\"os.ModeDir\":                                    \"os\",\n\t\"os.ModeExclusive\":                              \"os\",\n\t\"os.ModeNamedPipe\":                              \"os\",\n\t\"os.ModePerm\":                                   \"os\",\n\t\"os.ModeSetgid\":                                 \"os\",\n\t\"os.ModeSetuid\":                                 \"os\",\n\t\"os.ModeSocket\":                                 \"os\",\n\t\"os.ModeSticky\":                                 \"os\",\n\t\"os.ModeSymlink\":                                \"os\",\n\t\"os.ModeTemporary\":                              \"os\",\n\t\"os.ModeType\":                                   \"os\",\n\t\"os.NewFile\":                                    \"os\",\n\t\"os.NewSyscallError\":                            \"os\",\n\t\"os.O_APPEND\":                                   \"os\",\n\t\"os.O_CREATE\":                                   \"os\",\n\t\"os.O_EXCL\":                                     \"os\",\n\t\"os.O_RDONLY\":                                   \"os\",\n\t\"os.O_RDWR\":                                     \"os\",\n\t\"os.O_SYNC\":                                     \"os\",\n\t\"os.O_TRUNC\":                                    \"os\",\n\t\"os.O_WRONLY\":                                   \"os\",\n\t\"os.Open\":                                       \"os\",\n\t\"os.OpenFile\":                                   \"os\",\n\t\"os.PathError\":                                  \"os\",\n\t\"os.PathListSeparator\":                          \"os\",\n\t\"os.PathSeparator\":                              \"os\",\n\t\"os.Pipe\":                                       \"os\",\n\t\"os.ProcAttr\":                                   \"os\",\n\t\"os.Process\":                                    \"os\",\n\t\"os.ProcessState\":                               \"os\",\n\t\"os.Readlink\":                                   \"os\",\n\t\"os.Remove\":                                     \"os\",\n\t\"os.RemoveAll\":                                  \"os\",\n\t\"os.Rename\":                                     \"os\",\n\t\"os.SEEK_CUR\":                                   \"os\",\n\t\"os.SEEK_END\":                                   \"os\",\n\t\"os.SEEK_SET\":                                   \"os\",\n\t\"os.SameFile\":                                   \"os\",\n\t\"os.Setenv\":                                     \"os\",\n\t\"os.Signal\":                                     \"os\",\n\t\"os.StartProcess\":                               \"os\",\n\t\"os.Stat\":                                       \"os\",\n\t\"os.Stderr\":                                     \"os\",\n\t\"os.Stdin\":                                      \"os\",\n\t\"os.Stdout\":                                     \"os\",\n\t\"os.Symlink\":                                    \"os\",\n\t\"os.SyscallError\":                               \"os\",\n\t\"os.TempDir\":                                    \"os\",\n\t\"os.Truncate\":                                   \"os\",\n\t\"os.Unsetenv\":                                   \"os\",\n\t\"palette.Plan9\":                                 \"image/color/palette\",\n\t\"palette.WebSafe\":                               \"image/color/palette\",\n\t\"parse.ActionNode\":                              \"text/template/parse\",\n\t\"parse.BoolNode\":                                \"text/template/parse\",\n\t\"parse.BranchNode\":                              \"text/template/parse\",\n\t\"parse.ChainNode\":                               \"text/template/parse\",\n\t\"parse.CommandNode\":                             \"text/template/parse\",\n\t\"parse.DotNode\":                                 \"text/template/parse\",\n\t\"parse.FieldNode\":                               \"text/template/parse\",\n\t\"parse.IdentifierNode\":                          \"text/template/parse\",\n\t\"parse.IfNode\":                                  \"text/template/parse\",\n\t\"parse.IsEmptyTree\":                             \"text/template/parse\",\n\t\"parse.ListNode\":                                \"text/template/parse\",\n\t\"parse.New\":                                     \"text/template/parse\",\n\t\"parse.NewIdentifier\":                           \"text/template/parse\",\n\t\"parse.NilNode\":                                 \"text/template/parse\",\n\t\"parse.Node\":                                    \"text/template/parse\",\n\t\"parse.NodeAction\":                              \"text/template/parse\",\n\t\"parse.NodeBool\":                                \"text/template/parse\",\n\t\"parse.NodeChain\":                               \"text/template/parse\",\n\t\"parse.NodeCommand\":                             \"text/template/parse\",\n\t\"parse.NodeDot\":                                 \"text/template/parse\",\n\t\"parse.NodeField\":                               \"text/template/parse\",\n\t\"parse.NodeIdentifier\":                          \"text/template/parse\",\n\t\"parse.NodeIf\":                                  \"text/template/parse\",\n\t\"parse.NodeList\":                                \"text/template/parse\",\n\t\"parse.NodeNil\":                                 \"text/template/parse\",\n\t\"parse.NodeNumber\":                              \"text/template/parse\",\n\t\"parse.NodePipe\":                                \"text/template/parse\",\n\t\"parse.NodeRange\":                               \"text/template/parse\",\n\t\"parse.NodeString\":                              \"text/template/parse\",\n\t\"parse.NodeTemplate\":                            \"text/template/parse\",\n\t\"parse.NodeText\":                                \"text/template/parse\",\n\t\"parse.NodeType\":                                \"text/template/parse\",\n\t\"parse.NodeVariable\":                            \"text/template/parse\",\n\t\"parse.NodeWith\":                                \"text/template/parse\",\n\t\"parse.NumberNode\":                              \"text/template/parse\",\n\t\"parse.Parse\":                                   \"text/template/parse\",\n\t\"parse.PipeNode\":                                \"text/template/parse\",\n\t\"parse.Pos\":                                     \"text/template/parse\",\n\t\"parse.RangeNode\":                               \"text/template/parse\",\n\t\"parse.StringNode\":                              \"text/template/parse\",\n\t\"parse.TemplateNode\":                            \"text/template/parse\",\n\t\"parse.TextNode\":                                \"text/template/parse\",\n\t\"parse.Tree\":                                    \"text/template/parse\",\n\t\"parse.VariableNode\":                            \"text/template/parse\",\n\t\"parse.WithNode\":                                \"text/template/parse\",\n\t\"parser.AllErrors\":                              \"go/parser\",\n\t\"parser.DeclarationErrors\":                      \"go/parser\",\n\t\"parser.ImportsOnly\":                            \"go/parser\",\n\t\"parser.Mode\":                                   \"go/parser\",\n\t\"parser.PackageClauseOnly\":                      \"go/parser\",\n\t\"parser.ParseComments\":                          \"go/parser\",\n\t\"parser.ParseDir\":                               \"go/parser\",\n\t\"parser.ParseExpr\":                              \"go/parser\",\n\t\"parser.ParseExprFrom\":                          \"go/parser\",\n\t\"parser.ParseFile\":                              \"go/parser\",\n\t\"parser.SpuriousErrors\":                         \"go/parser\",\n\t\"parser.Trace\":                                  \"go/parser\",\n\t\"path.Base\":                                     \"path\",\n\t\"path.Clean\":                                    \"path\",\n\t\"path.Dir\":                                      \"path\",\n\t\"path.ErrBadPattern\":                            \"path\",\n\t\"path.Ext\":                                      \"path\",\n\t\"path.IsAbs\":                                    \"path\",\n\t\"path.Join\":                                     \"path\",\n\t\"path.Match\":                                    \"path\",\n\t\"path.Split\":                                    \"path\",\n\t\"pe.COFFSymbol\":                                 \"debug/pe\",\n\t\"pe.COFFSymbolSize\":                             \"debug/pe\",\n\t\"pe.DataDirectory\":                              \"debug/pe\",\n\t\"pe.File\":                                       \"debug/pe\",\n\t\"pe.FileHeader\":                                 \"debug/pe\",\n\t\"pe.FormatError\":                                \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_AM33\":                    \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_AMD64\":                   \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_ARM\":                     \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_EBC\":                     \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_I386\":                    \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_IA64\":                    \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_M32R\":                    \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_MIPS16\":                  \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_MIPSFPU\":                 \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_MIPSFPU16\":               \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_POWERPC\":                 \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_POWERPCFP\":               \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_R4000\":                   \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_SH3\":                     \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_SH3DSP\":                  \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_SH4\":                     \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_SH5\":                     \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_THUMB\":                   \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_UNKNOWN\":                 \"debug/pe\",\n\t\"pe.IMAGE_FILE_MACHINE_WCEMIPSV2\":               \"debug/pe\",\n\t\"pe.ImportDirectory\":                            \"debug/pe\",\n\t\"pe.NewFile\":                                    \"debug/pe\",\n\t\"pe.Open\":                                       \"debug/pe\",\n\t\"pe.OptionalHeader32\":                           \"debug/pe\",\n\t\"pe.OptionalHeader64\":                           \"debug/pe\",\n\t\"pe.Section\":                                    \"debug/pe\",\n\t\"pe.SectionHeader\":                              \"debug/pe\",\n\t\"pe.SectionHeader32\":                            \"debug/pe\",\n\t\"pe.Symbol\":                                     \"debug/pe\",\n\t\"pem.Block\":                                     \"encoding/pem\",\n\t\"pem.Decode\":                                    \"encoding/pem\",\n\t\"pem.Encode\":                                    \"encoding/pem\",\n\t\"pem.EncodeToMemory\":                            \"encoding/pem\",\n\t\"pkix.AlgorithmIdentifier\":                      \"crypto/x509/pkix\",\n\t\"pkix.AttributeTypeAndValue\":                    \"crypto/x509/pkix\",\n\t\"pkix.AttributeTypeAndValueSET\":                 \"crypto/x509/pkix\",\n\t\"pkix.CertificateList\":                          \"crypto/x509/pkix\",\n\t\"pkix.Extension\":                                \"crypto/x509/pkix\",\n\t\"pkix.Name\":                                     \"crypto/x509/pkix\",\n\t\"pkix.RDNSequence\":                              \"crypto/x509/pkix\",\n\t\"pkix.RelativeDistinguishedNameSET\":             \"crypto/x509/pkix\",\n\t\"pkix.RevokedCertificate\":                       \"crypto/x509/pkix\",\n\t\"pkix.TBSCertificateList\":                       \"crypto/x509/pkix\",\n\t\"plan9obj.File\":                                 \"debug/plan9obj\",\n\t\"plan9obj.FileHeader\":                           \"debug/plan9obj\",\n\t\"plan9obj.Magic386\":                             \"debug/plan9obj\",\n\t\"plan9obj.Magic64\":                              \"debug/plan9obj\",\n\t\"plan9obj.MagicAMD64\":                           \"debug/plan9obj\",\n\t\"plan9obj.MagicARM\":                             \"debug/plan9obj\",\n\t\"plan9obj.NewFile\":                              \"debug/plan9obj\",\n\t\"plan9obj.Open\":                                 \"debug/plan9obj\",\n\t\"plan9obj.Section\":                              \"debug/plan9obj\",\n\t\"plan9obj.SectionHeader\":                        \"debug/plan9obj\",\n\t\"plan9obj.Sym\":                                  \"debug/plan9obj\",\n\t\"png.BestCompression\":                           \"image/png\",\n\t\"png.BestSpeed\":                                 \"image/png\",\n\t\"png.CompressionLevel\":                          \"image/png\",\n\t\"png.Decode\":                                    \"image/png\",\n\t\"png.DecodeConfig\":                              \"image/png\",\n\t\"png.DefaultCompression\":                        \"image/png\",\n\t\"png.Encode\":                                    \"image/png\",\n\t\"png.Encoder\":                                   \"image/png\",\n\t\"png.FormatError\":                               \"image/png\",\n\t\"png.NoCompression\":                             \"image/png\",\n\t\"png.UnsupportedError\":                          \"image/png\",\n\t\"pprof.Cmdline\":                                 \"net/http/pprof\",\n\t\"pprof.Handler\":                                 \"net/http/pprof\",\n\t\"pprof.Index\":                                   \"net/http/pprof\",\n\t\"pprof.Lookup\":                                  \"runtime/pprof\",\n\t\"pprof.NewProfile\":                              \"runtime/pprof\",\n\t// \"pprof.Profile\" is ambiguous\n\t\"pprof.Profiles\":            \"runtime/pprof\",\n\t\"pprof.StartCPUProfile\":     \"runtime/pprof\",\n\t\"pprof.StopCPUProfile\":      \"runtime/pprof\",\n\t\"pprof.Symbol\":              \"net/http/pprof\",\n\t\"pprof.Trace\":               \"net/http/pprof\",\n\t\"pprof.WriteHeapProfile\":    \"runtime/pprof\",\n\t\"printer.CommentedNode\":     \"go/printer\",\n\t\"printer.Config\":            \"go/printer\",\n\t\"printer.Fprint\":            \"go/printer\",\n\t\"printer.Mode\":              \"go/printer\",\n\t\"printer.RawFormat\":         \"go/printer\",\n\t\"printer.SourcePos\":         \"go/printer\",\n\t\"printer.TabIndent\":         \"go/printer\",\n\t\"printer.UseSpaces\":         \"go/printer\",\n\t\"quick.Check\":               \"testing/quick\",\n\t\"quick.CheckEqual\":          \"testing/quick\",\n\t\"quick.CheckEqualError\":     \"testing/quick\",\n\t\"quick.CheckError\":          \"testing/quick\",\n\t\"quick.Config\":              \"testing/quick\",\n\t\"quick.Generator\":           \"testing/quick\",\n\t\"quick.SetupError\":          \"testing/quick\",\n\t\"quick.Value\":               \"testing/quick\",\n\t\"quotedprintable.NewReader\": \"mime/quotedprintable\",\n\t\"quotedprintable.NewWriter\": \"mime/quotedprintable\",\n\t\"quotedprintable.Reader\":    \"mime/quotedprintable\",\n\t\"quotedprintable.Writer\":    \"mime/quotedprintable\",\n\t\"rand.ExpFloat64\":           \"math/rand\",\n\t\"rand.Float32\":              \"math/rand\",\n\t\"rand.Float64\":              \"math/rand\",\n\t// \"rand.Int\" is ambiguous\n\t\"rand.Int31\":       \"math/rand\",\n\t\"rand.Int31n\":      \"math/rand\",\n\t\"rand.Int63\":       \"math/rand\",\n\t\"rand.Int63n\":      \"math/rand\",\n\t\"rand.Intn\":        \"math/rand\",\n\t\"rand.New\":         \"math/rand\",\n\t\"rand.NewSource\":   \"math/rand\",\n\t\"rand.NewZipf\":     \"math/rand\",\n\t\"rand.NormFloat64\": \"math/rand\",\n\t\"rand.Perm\":        \"math/rand\",\n\t\"rand.Prime\":       \"crypto/rand\",\n\t\"rand.Rand\":        \"math/rand\",\n\t// \"rand.Read\" is ambiguous\n\t\"rand.Reader\":                   \"crypto/rand\",\n\t\"rand.Seed\":                     \"math/rand\",\n\t\"rand.Source\":                   \"math/rand\",\n\t\"rand.Uint32\":                   \"math/rand\",\n\t\"rand.Zipf\":                     \"math/rand\",\n\t\"rc4.Cipher\":                    \"crypto/rc4\",\n\t\"rc4.KeySizeError\":              \"crypto/rc4\",\n\t\"rc4.NewCipher\":                 \"crypto/rc4\",\n\t\"reflect.Append\":                \"reflect\",\n\t\"reflect.AppendSlice\":           \"reflect\",\n\t\"reflect.Array\":                 \"reflect\",\n\t\"reflect.ArrayOf\":               \"reflect\",\n\t\"reflect.Bool\":                  \"reflect\",\n\t\"reflect.BothDir\":               \"reflect\",\n\t\"reflect.Chan\":                  \"reflect\",\n\t\"reflect.ChanDir\":               \"reflect\",\n\t\"reflect.ChanOf\":                \"reflect\",\n\t\"reflect.Complex128\":            \"reflect\",\n\t\"reflect.Complex64\":             \"reflect\",\n\t\"reflect.Copy\":                  \"reflect\",\n\t\"reflect.DeepEqual\":             \"reflect\",\n\t\"reflect.Float32\":               \"reflect\",\n\t\"reflect.Float64\":               \"reflect\",\n\t\"reflect.Func\":                  \"reflect\",\n\t\"reflect.FuncOf\":                \"reflect\",\n\t\"reflect.Indirect\":              \"reflect\",\n\t\"reflect.Int\":                   \"reflect\",\n\t\"reflect.Int16\":                 \"reflect\",\n\t\"reflect.Int32\":                 \"reflect\",\n\t\"reflect.Int64\":                 \"reflect\",\n\t\"reflect.Int8\":                  \"reflect\",\n\t\"reflect.Interface\":             \"reflect\",\n\t\"reflect.Invalid\":               \"reflect\",\n\t\"reflect.Kind\":                  \"reflect\",\n\t\"reflect.MakeChan\":              \"reflect\",\n\t\"reflect.MakeFunc\":              \"reflect\",\n\t\"reflect.MakeMap\":               \"reflect\",\n\t\"reflect.MakeSlice\":             \"reflect\",\n\t\"reflect.Map\":                   \"reflect\",\n\t\"reflect.MapOf\":                 \"reflect\",\n\t\"reflect.Method\":                \"reflect\",\n\t\"reflect.New\":                   \"reflect\",\n\t\"reflect.NewAt\":                 \"reflect\",\n\t\"reflect.Ptr\":                   \"reflect\",\n\t\"reflect.PtrTo\":                 \"reflect\",\n\t\"reflect.RecvDir\":               \"reflect\",\n\t\"reflect.Select\":                \"reflect\",\n\t\"reflect.SelectCase\":            \"reflect\",\n\t\"reflect.SelectDefault\":         \"reflect\",\n\t\"reflect.SelectDir\":             \"reflect\",\n\t\"reflect.SelectRecv\":            \"reflect\",\n\t\"reflect.SelectSend\":            \"reflect\",\n\t\"reflect.SendDir\":               \"reflect\",\n\t\"reflect.Slice\":                 \"reflect\",\n\t\"reflect.SliceHeader\":           \"reflect\",\n\t\"reflect.SliceOf\":               \"reflect\",\n\t\"reflect.String\":                \"reflect\",\n\t\"reflect.StringHeader\":          \"reflect\",\n\t\"reflect.Struct\":                \"reflect\",\n\t\"reflect.StructField\":           \"reflect\",\n\t\"reflect.StructOf\":              \"reflect\",\n\t\"reflect.StructTag\":             \"reflect\",\n\t\"reflect.TypeOf\":                \"reflect\",\n\t\"reflect.Uint\":                  \"reflect\",\n\t\"reflect.Uint16\":                \"reflect\",\n\t\"reflect.Uint32\":                \"reflect\",\n\t\"reflect.Uint64\":                \"reflect\",\n\t\"reflect.Uint8\":                 \"reflect\",\n\t\"reflect.Uintptr\":               \"reflect\",\n\t\"reflect.UnsafePointer\":         \"reflect\",\n\t\"reflect.Value\":                 \"reflect\",\n\t\"reflect.ValueError\":            \"reflect\",\n\t\"reflect.ValueOf\":               \"reflect\",\n\t\"reflect.Zero\":                  \"reflect\",\n\t\"regexp.Compile\":                \"regexp\",\n\t\"regexp.CompilePOSIX\":           \"regexp\",\n\t\"regexp.Match\":                  \"regexp\",\n\t\"regexp.MatchReader\":            \"regexp\",\n\t\"regexp.MatchString\":            \"regexp\",\n\t\"regexp.MustCompile\":            \"regexp\",\n\t\"regexp.MustCompilePOSIX\":       \"regexp\",\n\t\"regexp.QuoteMeta\":              \"regexp\",\n\t\"regexp.Regexp\":                 \"regexp\",\n\t\"ring.New\":                      \"container/ring\",\n\t\"ring.Ring\":                     \"container/ring\",\n\t\"rpc.Accept\":                    \"net/rpc\",\n\t\"rpc.Call\":                      \"net/rpc\",\n\t\"rpc.Client\":                    \"net/rpc\",\n\t\"rpc.ClientCodec\":               \"net/rpc\",\n\t\"rpc.DefaultDebugPath\":          \"net/rpc\",\n\t\"rpc.DefaultRPCPath\":            \"net/rpc\",\n\t\"rpc.DefaultServer\":             \"net/rpc\",\n\t\"rpc.Dial\":                      \"net/rpc\",\n\t\"rpc.DialHTTP\":                  \"net/rpc\",\n\t\"rpc.DialHTTPPath\":              \"net/rpc\",\n\t\"rpc.ErrShutdown\":               \"net/rpc\",\n\t\"rpc.HandleHTTP\":                \"net/rpc\",\n\t\"rpc.NewClient\":                 \"net/rpc\",\n\t\"rpc.NewClientWithCodec\":        \"net/rpc\",\n\t\"rpc.NewServer\":                 \"net/rpc\",\n\t\"rpc.Register\":                  \"net/rpc\",\n\t\"rpc.RegisterName\":              \"net/rpc\",\n\t\"rpc.Request\":                   \"net/rpc\",\n\t\"rpc.Response\":                  \"net/rpc\",\n\t\"rpc.ServeCodec\":                \"net/rpc\",\n\t\"rpc.ServeConn\":                 \"net/rpc\",\n\t\"rpc.ServeRequest\":              \"net/rpc\",\n\t\"rpc.Server\":                    \"net/rpc\",\n\t\"rpc.ServerCodec\":               \"net/rpc\",\n\t\"rpc.ServerError\":               \"net/rpc\",\n\t\"rsa.CRTValue\":                  \"crypto/rsa\",\n\t\"rsa.DecryptOAEP\":               \"crypto/rsa\",\n\t\"rsa.DecryptPKCS1v15\":           \"crypto/rsa\",\n\t\"rsa.DecryptPKCS1v15SessionKey\": \"crypto/rsa\",\n\t\"rsa.EncryptOAEP\":               \"crypto/rsa\",\n\t\"rsa.EncryptPKCS1v15\":           \"crypto/rsa\",\n\t\"rsa.ErrDecryption\":             \"crypto/rsa\",\n\t\"rsa.ErrMessageTooLong\":         \"crypto/rsa\",\n\t\"rsa.ErrVerification\":           \"crypto/rsa\",\n\t\"rsa.GenerateKey\":               \"crypto/rsa\",\n\t\"rsa.GenerateMultiPrimeKey\":     \"crypto/rsa\",\n\t\"rsa.OAEPOptions\":               \"crypto/rsa\",\n\t\"rsa.PKCS1v15DecryptOptions\":    \"crypto/rsa\",\n\t\"rsa.PSSOptions\":                \"crypto/rsa\",\n\t\"rsa.PSSSaltLengthAuto\":         \"crypto/rsa\",\n\t\"rsa.PSSSaltLengthEqualsHash\":   \"crypto/rsa\",\n\t\"rsa.PrecomputedValues\":         \"crypto/rsa\",\n\t\"rsa.PrivateKey\":                \"crypto/rsa\",\n\t\"rsa.PublicKey\":                 \"crypto/rsa\",\n\t\"rsa.SignPKCS1v15\":              \"crypto/rsa\",\n\t\"rsa.SignPSS\":                   \"crypto/rsa\",\n\t\"rsa.VerifyPKCS1v15\":            \"crypto/rsa\",\n\t\"rsa.VerifyPSS\":                 \"crypto/rsa\",\n\t\"runtime.BlockProfile\":          \"runtime\",\n\t\"runtime.BlockProfileRecord\":    \"runtime\",\n\t\"runtime.Breakpoint\":            \"runtime\",\n\t\"runtime.CPUProfile\":            \"runtime\",\n\t\"runtime.Caller\":                \"runtime\",\n\t\"runtime.Callers\":               \"runtime\",\n\t\"runtime.CallersFrames\":         \"runtime\",\n\t\"runtime.Compiler\":              \"runtime\",\n\t\"runtime.Error\":                 \"runtime\",\n\t\"runtime.Frame\":                 \"runtime\",\n\t\"runtime.Frames\":                \"runtime\",\n\t\"runtime.Func\":                  \"runtime\",\n\t\"runtime.FuncForPC\":             \"runtime\",\n\t\"runtime.GC\":                    \"runtime\",\n\t\"runtime.GOARCH\":                \"runtime\",\n\t\"runtime.GOMAXPROCS\":            \"runtime\",\n\t\"runtime.GOOS\":                  \"runtime\",\n\t\"runtime.GOROOT\":                \"runtime\",\n\t\"runtime.Goexit\":                \"runtime\",\n\t\"runtime.GoroutineProfile\":      \"runtime\",\n\t\"runtime.Gosched\":               \"runtime\",\n\t\"runtime.KeepAlive\":             \"runtime\",\n\t\"runtime.LockOSThread\":          \"runtime\",\n\t\"runtime.MemProfile\":            \"runtime\",\n\t\"runtime.MemProfileRate\":        \"runtime\",\n\t\"runtime.MemProfileRecord\":      \"runtime\",\n\t\"runtime.MemStats\":              \"runtime\",\n\t\"runtime.NumCPU\":                \"runtime\",\n\t\"runtime.NumCgoCall\":            \"runtime\",\n\t\"runtime.NumGoroutine\":          \"runtime\",\n\t\"runtime.ReadMemStats\":          \"runtime\",\n\t\"runtime.ReadTrace\":             \"runtime\",\n\t\"runtime.SetBlockProfileRate\":   \"runtime\",\n\t\"runtime.SetCPUProfileRate\":     \"runtime\",\n\t\"runtime.SetCgoTraceback\":       \"runtime\",\n\t\"runtime.SetFinalizer\":          \"runtime\",\n\t\"runtime.Stack\":                 \"runtime\",\n\t\"runtime.StackRecord\":           \"runtime\",\n\t\"runtime.StartTrace\":            \"runtime\",\n\t\"runtime.StopTrace\":             \"runtime\",\n\t\"runtime.ThreadCreateProfile\":   \"runtime\",\n\t\"runtime.TypeAssertionError\":    \"runtime\",\n\t\"runtime.UnlockOSThread\":        \"runtime\",\n\t\"runtime.Version\":               \"runtime\",\n\t\"scanner.Char\":                  \"text/scanner\",\n\t\"scanner.Comment\":               \"text/scanner\",\n\t\"scanner.EOF\":                   \"text/scanner\",\n\t\"scanner.Error\":                 \"go/scanner\",\n\t\"scanner.ErrorHandler\":          \"go/scanner\",\n\t\"scanner.ErrorList\":             \"go/scanner\",\n\t\"scanner.Float\":                 \"text/scanner\",\n\t\"scanner.GoTokens\":              \"text/scanner\",\n\t\"scanner.GoWhitespace\":          \"text/scanner\",\n\t\"scanner.Ident\":                 \"text/scanner\",\n\t\"scanner.Int\":                   \"text/scanner\",\n\t\"scanner.Mode\":                  \"go/scanner\",\n\t\"scanner.Position\":              \"text/scanner\",\n\t\"scanner.PrintError\":            \"go/scanner\",\n\t\"scanner.RawString\":             \"text/scanner\",\n\t\"scanner.ScanChars\":             \"text/scanner\",\n\t// \"scanner.ScanComments\" is ambiguous\n\t\"scanner.ScanFloats\":     \"text/scanner\",\n\t\"scanner.ScanIdents\":     \"text/scanner\",\n\t\"scanner.ScanInts\":       \"text/scanner\",\n\t\"scanner.ScanRawStrings\": \"text/scanner\",\n\t\"scanner.ScanStrings\":    \"text/scanner\",\n\t// \"scanner.Scanner\" is ambiguous\n\t\"scanner.SkipComments\":                                 \"text/scanner\",\n\t\"scanner.String\":                                       \"text/scanner\",\n\t\"scanner.TokenString\":                                  \"text/scanner\",\n\t\"sha1.BlockSize\":                                       \"crypto/sha1\",\n\t\"sha1.New\":                                             \"crypto/sha1\",\n\t\"sha1.Size\":                                            \"crypto/sha1\",\n\t\"sha1.Sum\":                                             \"crypto/sha1\",\n\t\"sha256.BlockSize\":                                     \"crypto/sha256\",\n\t\"sha256.New\":                                           \"crypto/sha256\",\n\t\"sha256.New224\":                                        \"crypto/sha256\",\n\t\"sha256.Size\":                                          \"crypto/sha256\",\n\t\"sha256.Size224\":                                       \"crypto/sha256\",\n\t\"sha256.Sum224\":                                        \"crypto/sha256\",\n\t\"sha256.Sum256\":                                        \"crypto/sha256\",\n\t\"sha512.BlockSize\":                                     \"crypto/sha512\",\n\t\"sha512.New\":                                           \"crypto/sha512\",\n\t\"sha512.New384\":                                        \"crypto/sha512\",\n\t\"sha512.New512_224\":                                    \"crypto/sha512\",\n\t\"sha512.New512_256\":                                    \"crypto/sha512\",\n\t\"sha512.Size\":                                          \"crypto/sha512\",\n\t\"sha512.Size224\":                                       \"crypto/sha512\",\n\t\"sha512.Size256\":                                       \"crypto/sha512\",\n\t\"sha512.Size384\":                                       \"crypto/sha512\",\n\t\"sha512.Sum384\":                                        \"crypto/sha512\",\n\t\"sha512.Sum512\":                                        \"crypto/sha512\",\n\t\"sha512.Sum512_224\":                                    \"crypto/sha512\",\n\t\"sha512.Sum512_256\":                                    \"crypto/sha512\",\n\t\"signal.Ignore\":                                        \"os/signal\",\n\t\"signal.Notify\":                                        \"os/signal\",\n\t\"signal.Reset\":                                         \"os/signal\",\n\t\"signal.Stop\":                                          \"os/signal\",\n\t\"smtp.Auth\":                                            \"net/smtp\",\n\t\"smtp.CRAMMD5Auth\":                                     \"net/smtp\",\n\t\"smtp.Client\":                                          \"net/smtp\",\n\t\"smtp.Dial\":                                            \"net/smtp\",\n\t\"smtp.NewClient\":                                       \"net/smtp\",\n\t\"smtp.PlainAuth\":                                       \"net/smtp\",\n\t\"smtp.SendMail\":                                        \"net/smtp\",\n\t\"smtp.ServerInfo\":                                      \"net/smtp\",\n\t\"sort.Float64Slice\":                                    \"sort\",\n\t\"sort.Float64s\":                                        \"sort\",\n\t\"sort.Float64sAreSorted\":                               \"sort\",\n\t\"sort.IntSlice\":                                        \"sort\",\n\t\"sort.Interface\":                                       \"sort\",\n\t\"sort.Ints\":                                            \"sort\",\n\t\"sort.IntsAreSorted\":                                   \"sort\",\n\t\"sort.IsSorted\":                                        \"sort\",\n\t\"sort.Reverse\":                                         \"sort\",\n\t\"sort.Search\":                                          \"sort\",\n\t\"sort.SearchFloat64s\":                                  \"sort\",\n\t\"sort.SearchInts\":                                      \"sort\",\n\t\"sort.SearchStrings\":                                   \"sort\",\n\t\"sort.Sort\":                                            \"sort\",\n\t\"sort.Stable\":                                          \"sort\",\n\t\"sort.StringSlice\":                                     \"sort\",\n\t\"sort.Strings\":                                         \"sort\",\n\t\"sort.StringsAreSorted\":                                \"sort\",\n\t\"sql.DB\":                                               \"database/sql\",\n\t\"sql.DBStats\":                                          \"database/sql\",\n\t\"sql.Drivers\":                                          \"database/sql\",\n\t\"sql.ErrNoRows\":                                        \"database/sql\",\n\t\"sql.ErrTxDone\":                                        \"database/sql\",\n\t\"sql.NullBool\":                                         \"database/sql\",\n\t\"sql.NullFloat64\":                                      \"database/sql\",\n\t\"sql.NullInt64\":                                        \"database/sql\",\n\t\"sql.NullString\":                                       \"database/sql\",\n\t\"sql.Open\":                                             \"database/sql\",\n\t\"sql.RawBytes\":                                         \"database/sql\",\n\t\"sql.Register\":                                         \"database/sql\",\n\t\"sql.Result\":                                           \"database/sql\",\n\t\"sql.Row\":                                              \"database/sql\",\n\t\"sql.Rows\":                                             \"database/sql\",\n\t\"sql.Scanner\":                                          \"database/sql\",\n\t\"sql.Stmt\":                                             \"database/sql\",\n\t\"sql.Tx\":                                               \"database/sql\",\n\t\"strconv.AppendBool\":                                   \"strconv\",\n\t\"strconv.AppendFloat\":                                  \"strconv\",\n\t\"strconv.AppendInt\":                                    \"strconv\",\n\t\"strconv.AppendQuote\":                                  \"strconv\",\n\t\"strconv.AppendQuoteRune\":                              \"strconv\",\n\t\"strconv.AppendQuoteRuneToASCII\":                       \"strconv\",\n\t\"strconv.AppendQuoteRuneToGraphic\":                     \"strconv\",\n\t\"strconv.AppendQuoteToASCII\":                           \"strconv\",\n\t\"strconv.AppendQuoteToGraphic\":                         \"strconv\",\n\t\"strconv.AppendUint\":                                   \"strconv\",\n\t\"strconv.Atoi\":                                         \"strconv\",\n\t\"strconv.CanBackquote\":                                 \"strconv\",\n\t\"strconv.ErrRange\":                                     \"strconv\",\n\t\"strconv.ErrSyntax\":                                    \"strconv\",\n\t\"strconv.FormatBool\":                                   \"strconv\",\n\t\"strconv.FormatFloat\":                                  \"strconv\",\n\t\"strconv.FormatInt\":                                    \"strconv\",\n\t\"strconv.FormatUint\":                                   \"strconv\",\n\t\"strconv.IntSize\":                                      \"strconv\",\n\t\"strconv.IsGraphic\":                                    \"strconv\",\n\t\"strconv.IsPrint\":                                      \"strconv\",\n\t\"strconv.Itoa\":                                         \"strconv\",\n\t\"strconv.NumError\":                                     \"strconv\",\n\t\"strconv.ParseBool\":                                    \"strconv\",\n\t\"strconv.ParseFloat\":                                   \"strconv\",\n\t\"strconv.ParseInt\":                                     \"strconv\",\n\t\"strconv.ParseUint\":                                    \"strconv\",\n\t\"strconv.Quote\":                                        \"strconv\",\n\t\"strconv.QuoteRune\":                                    \"strconv\",\n\t\"strconv.QuoteRuneToASCII\":                             \"strconv\",\n\t\"strconv.QuoteRuneToGraphic\":                           \"strconv\",\n\t\"strconv.QuoteToASCII\":                                 \"strconv\",\n\t\"strconv.QuoteToGraphic\":                               \"strconv\",\n\t\"strconv.Unquote\":                                      \"strconv\",\n\t\"strconv.UnquoteChar\":                                  \"strconv\",\n\t\"strings.Compare\":                                      \"strings\",\n\t\"strings.Contains\":                                     \"strings\",\n\t\"strings.ContainsAny\":                                  \"strings\",\n\t\"strings.ContainsRune\":                                 \"strings\",\n\t\"strings.Count\":                                        \"strings\",\n\t\"strings.EqualFold\":                                    \"strings\",\n\t\"strings.Fields\":                                       \"strings\",\n\t\"strings.FieldsFunc\":                                   \"strings\",\n\t\"strings.HasPrefix\":                                    \"strings\",\n\t\"strings.HasSuffix\":                                    \"strings\",\n\t\"strings.Index\":                                        \"strings\",\n\t\"strings.IndexAny\":                                     \"strings\",\n\t\"strings.IndexByte\":                                    \"strings\",\n\t\"strings.IndexFunc\":                                    \"strings\",\n\t\"strings.IndexRune\":                                    \"strings\",\n\t\"strings.Join\":                                         \"strings\",\n\t\"strings.LastIndex\":                                    \"strings\",\n\t\"strings.LastIndexAny\":                                 \"strings\",\n\t\"strings.LastIndexByte\":                                \"strings\",\n\t\"strings.LastIndexFunc\":                                \"strings\",\n\t\"strings.Map\":                                          \"strings\",\n\t\"strings.NewReader\":                                    \"strings\",\n\t\"strings.NewReplacer\":                                  \"strings\",\n\t\"strings.Reader\":                                       \"strings\",\n\t\"strings.Repeat\":                                       \"strings\",\n\t\"strings.Replace\":                                      \"strings\",\n\t\"strings.Replacer\":                                     \"strings\",\n\t\"strings.Split\":                                        \"strings\",\n\t\"strings.SplitAfter\":                                   \"strings\",\n\t\"strings.SplitAfterN\":                                  \"strings\",\n\t\"strings.SplitN\":                                       \"strings\",\n\t\"strings.Title\":                                        \"strings\",\n\t\"strings.ToLower\":                                      \"strings\",\n\t\"strings.ToLowerSpecial\":                               \"strings\",\n\t\"strings.ToTitle\":                                      \"strings\",\n\t\"strings.ToTitleSpecial\":                               \"strings\",\n\t\"strings.ToUpper\":                                      \"strings\",\n\t\"strings.ToUpperSpecial\":                               \"strings\",\n\t\"strings.Trim\":                                         \"strings\",\n\t\"strings.TrimFunc\":                                     \"strings\",\n\t\"strings.TrimLeft\":                                     \"strings\",\n\t\"strings.TrimLeftFunc\":                                 \"strings\",\n\t\"strings.TrimPrefix\":                                   \"strings\",\n\t\"strings.TrimRight\":                                    \"strings\",\n\t\"strings.TrimRightFunc\":                                \"strings\",\n\t\"strings.TrimSpace\":                                    \"strings\",\n\t\"strings.TrimSuffix\":                                   \"strings\",\n\t\"subtle.ConstantTimeByteEq\":                            \"crypto/subtle\",\n\t\"subtle.ConstantTimeCompare\":                           \"crypto/subtle\",\n\t\"subtle.ConstantTimeCopy\":                              \"crypto/subtle\",\n\t\"subtle.ConstantTimeEq\":                                \"crypto/subtle\",\n\t\"subtle.ConstantTimeLessOrEq\":                          \"crypto/subtle\",\n\t\"subtle.ConstantTimeSelect\":                            \"crypto/subtle\",\n\t\"suffixarray.Index\":                                    \"index/suffixarray\",\n\t\"suffixarray.New\":                                      \"index/suffixarray\",\n\t\"sync.Cond\":                                            \"sync\",\n\t\"sync.Locker\":                                          \"sync\",\n\t\"sync.Mutex\":                                           \"sync\",\n\t\"sync.NewCond\":                                         \"sync\",\n\t\"sync.Once\":                                            \"sync\",\n\t\"sync.Pool\":                                            \"sync\",\n\t\"sync.RWMutex\":                                         \"sync\",\n\t\"sync.WaitGroup\":                                       \"sync\",\n\t\"syntax.ClassNL\":                                       \"regexp/syntax\",\n\t\"syntax.Compile\":                                       \"regexp/syntax\",\n\t\"syntax.DotNL\":                                         \"regexp/syntax\",\n\t\"syntax.EmptyBeginLine\":                                \"regexp/syntax\",\n\t\"syntax.EmptyBeginText\":                                \"regexp/syntax\",\n\t\"syntax.EmptyEndLine\":                                  \"regexp/syntax\",\n\t\"syntax.EmptyEndText\":                                  \"regexp/syntax\",\n\t\"syntax.EmptyNoWordBoundary\":                           \"regexp/syntax\",\n\t\"syntax.EmptyOp\":                                       \"regexp/syntax\",\n\t\"syntax.EmptyOpContext\":                                \"regexp/syntax\",\n\t\"syntax.EmptyWordBoundary\":                             \"regexp/syntax\",\n\t\"syntax.ErrInternalError\":                              \"regexp/syntax\",\n\t\"syntax.ErrInvalidCharClass\":                           \"regexp/syntax\",\n\t\"syntax.ErrInvalidCharRange\":                           \"regexp/syntax\",\n\t\"syntax.ErrInvalidEscape\":                              \"regexp/syntax\",\n\t\"syntax.ErrInvalidNamedCapture\":                        \"regexp/syntax\",\n\t\"syntax.ErrInvalidPerlOp\":                              \"regexp/syntax\",\n\t\"syntax.ErrInvalidRepeatOp\":                            \"regexp/syntax\",\n\t\"syntax.ErrInvalidRepeatSize\":                          \"regexp/syntax\",\n\t\"syntax.ErrInvalidUTF8\":                                \"regexp/syntax\",\n\t\"syntax.ErrMissingBracket\":                             \"regexp/syntax\",\n\t\"syntax.ErrMissingParen\":                               \"regexp/syntax\",\n\t\"syntax.ErrMissingRepeatArgument\":                      \"regexp/syntax\",\n\t\"syntax.ErrTrailingBackslash\":                          \"regexp/syntax\",\n\t\"syntax.ErrUnexpectedParen\":                            \"regexp/syntax\",\n\t\"syntax.Error\":                                         \"regexp/syntax\",\n\t\"syntax.ErrorCode\":                                     \"regexp/syntax\",\n\t\"syntax.Flags\":                                         \"regexp/syntax\",\n\t\"syntax.FoldCase\":                                      \"regexp/syntax\",\n\t\"syntax.Inst\":                                          \"regexp/syntax\",\n\t\"syntax.InstAlt\":                                       \"regexp/syntax\",\n\t\"syntax.InstAltMatch\":                                  \"regexp/syntax\",\n\t\"syntax.InstCapture\":                                   \"regexp/syntax\",\n\t\"syntax.InstEmptyWidth\":                                \"regexp/syntax\",\n\t\"syntax.InstFail\":                                      \"regexp/syntax\",\n\t\"syntax.InstMatch\":                                     \"regexp/syntax\",\n\t\"syntax.InstNop\":                                       \"regexp/syntax\",\n\t\"syntax.InstOp\":                                        \"regexp/syntax\",\n\t\"syntax.InstRune\":                                      \"regexp/syntax\",\n\t\"syntax.InstRune1\":                                     \"regexp/syntax\",\n\t\"syntax.InstRuneAny\":                                   \"regexp/syntax\",\n\t\"syntax.InstRuneAnyNotNL\":                              \"regexp/syntax\",\n\t\"syntax.IsWordChar\":                                    \"regexp/syntax\",\n\t\"syntax.Literal\":                                       \"regexp/syntax\",\n\t\"syntax.MatchNL\":                                       \"regexp/syntax\",\n\t\"syntax.NonGreedy\":                                     \"regexp/syntax\",\n\t\"syntax.OneLine\":                                       \"regexp/syntax\",\n\t\"syntax.Op\":                                            \"regexp/syntax\",\n\t\"syntax.OpAlternate\":                                   \"regexp/syntax\",\n\t\"syntax.OpAnyChar\":                                     \"regexp/syntax\",\n\t\"syntax.OpAnyCharNotNL\":                                \"regexp/syntax\",\n\t\"syntax.OpBeginLine\":                                   \"regexp/syntax\",\n\t\"syntax.OpBeginText\":                                   \"regexp/syntax\",\n\t\"syntax.OpCapture\":                                     \"regexp/syntax\",\n\t\"syntax.OpCharClass\":                                   \"regexp/syntax\",\n\t\"syntax.OpConcat\":                                      \"regexp/syntax\",\n\t\"syntax.OpEmptyMatch\":                                  \"regexp/syntax\",\n\t\"syntax.OpEndLine\":                                     \"regexp/syntax\",\n\t\"syntax.OpEndText\":                                     \"regexp/syntax\",\n\t\"syntax.OpLiteral\":                                     \"regexp/syntax\",\n\t\"syntax.OpNoMatch\":                                     \"regexp/syntax\",\n\t\"syntax.OpNoWordBoundary\":                              \"regexp/syntax\",\n\t\"syntax.OpPlus\":                                        \"regexp/syntax\",\n\t\"syntax.OpQuest\":                                       \"regexp/syntax\",\n\t\"syntax.OpRepeat\":                                      \"regexp/syntax\",\n\t\"syntax.OpStar\":                                        \"regexp/syntax\",\n\t\"syntax.OpWordBoundary\":                                \"regexp/syntax\",\n\t\"syntax.POSIX\":                                         \"regexp/syntax\",\n\t\"syntax.Parse\":                                         \"regexp/syntax\",\n\t\"syntax.Perl\":                                          \"regexp/syntax\",\n\t\"syntax.PerlX\":                                         \"regexp/syntax\",\n\t\"syntax.Prog\":                                          \"regexp/syntax\",\n\t\"syntax.Regexp\":                                        \"regexp/syntax\",\n\t\"syntax.Simple\":                                        \"regexp/syntax\",\n\t\"syntax.UnicodeGroups\":                                 \"regexp/syntax\",\n\t\"syntax.WasDollar\":                                     \"regexp/syntax\",\n\t\"syscall.AF_ALG\":                                       \"syscall\",\n\t\"syscall.AF_APPLETALK\":                                 \"syscall\",\n\t\"syscall.AF_ARP\":                                       \"syscall\",\n\t\"syscall.AF_ASH\":                                       \"syscall\",\n\t\"syscall.AF_ATM\":                                       \"syscall\",\n\t\"syscall.AF_ATMPVC\":                                    \"syscall\",\n\t\"syscall.AF_ATMSVC\":                                    \"syscall\",\n\t\"syscall.AF_AX25\":                                      \"syscall\",\n\t\"syscall.AF_BLUETOOTH\":                                 \"syscall\",\n\t\"syscall.AF_BRIDGE\":                                    \"syscall\",\n\t\"syscall.AF_CAIF\":                                      \"syscall\",\n\t\"syscall.AF_CAN\":                                       \"syscall\",\n\t\"syscall.AF_CCITT\":                                     \"syscall\",\n\t\"syscall.AF_CHAOS\":                                     \"syscall\",\n\t\"syscall.AF_CNT\":                                       \"syscall\",\n\t\"syscall.AF_COIP\":                                      \"syscall\",\n\t\"syscall.AF_DATAKIT\":                                   \"syscall\",\n\t\"syscall.AF_DECnet\":                                    \"syscall\",\n\t\"syscall.AF_DLI\":                                       \"syscall\",\n\t\"syscall.AF_E164\":                                      \"syscall\",\n\t\"syscall.AF_ECMA\":                                      \"syscall\",\n\t\"syscall.AF_ECONET\":                                    \"syscall\",\n\t\"syscall.AF_ENCAP\":                                     \"syscall\",\n\t\"syscall.AF_FILE\":                                      \"syscall\",\n\t\"syscall.AF_HYLINK\":                                    \"syscall\",\n\t\"syscall.AF_IEEE80211\":                                 \"syscall\",\n\t\"syscall.AF_IEEE802154\":                                \"syscall\",\n\t\"syscall.AF_IMPLINK\":                                   \"syscall\",\n\t\"syscall.AF_INET\":                                      \"syscall\",\n\t\"syscall.AF_INET6\":                                     \"syscall\",\n\t\"syscall.AF_INET6_SDP\":                                 \"syscall\",\n\t\"syscall.AF_INET_SDP\":                                  \"syscall\",\n\t\"syscall.AF_IPX\":                                       \"syscall\",\n\t\"syscall.AF_IRDA\":                                      \"syscall\",\n\t\"syscall.AF_ISDN\":                                      \"syscall\",\n\t\"syscall.AF_ISO\":                                       \"syscall\",\n\t\"syscall.AF_IUCV\":                                      \"syscall\",\n\t\"syscall.AF_KEY\":                                       \"syscall\",\n\t\"syscall.AF_LAT\":                                       \"syscall\",\n\t\"syscall.AF_LINK\":                                      \"syscall\",\n\t\"syscall.AF_LLC\":                                       \"syscall\",\n\t\"syscall.AF_LOCAL\":                                     \"syscall\",\n\t\"syscall.AF_MAX\":                                       \"syscall\",\n\t\"syscall.AF_MPLS\":                                      \"syscall\",\n\t\"syscall.AF_NATM\":                                      \"syscall\",\n\t\"syscall.AF_NDRV\":                                      \"syscall\",\n\t\"syscall.AF_NETBEUI\":                                   \"syscall\",\n\t\"syscall.AF_NETBIOS\":                                   \"syscall\",\n\t\"syscall.AF_NETGRAPH\":                                  \"syscall\",\n\t\"syscall.AF_NETLINK\":                                   \"syscall\",\n\t\"syscall.AF_NETROM\":                                    \"syscall\",\n\t\"syscall.AF_NS\":                                        \"syscall\",\n\t\"syscall.AF_OROUTE\":                                    \"syscall\",\n\t\"syscall.AF_OSI\":                                       \"syscall\",\n\t\"syscall.AF_PACKET\":                                    \"syscall\",\n\t\"syscall.AF_PHONET\":                                    \"syscall\",\n\t\"syscall.AF_PPP\":                                       \"syscall\",\n\t\"syscall.AF_PPPOX\":                                     \"syscall\",\n\t\"syscall.AF_PUP\":                                       \"syscall\",\n\t\"syscall.AF_RDS\":                                       \"syscall\",\n\t\"syscall.AF_RESERVED_36\":                               \"syscall\",\n\t\"syscall.AF_ROSE\":                                      \"syscall\",\n\t\"syscall.AF_ROUTE\":                                     \"syscall\",\n\t\"syscall.AF_RXRPC\":                                     \"syscall\",\n\t\"syscall.AF_SCLUSTER\":                                  \"syscall\",\n\t\"syscall.AF_SECURITY\":                                  \"syscall\",\n\t\"syscall.AF_SIP\":                                       \"syscall\",\n\t\"syscall.AF_SLOW\":                                      \"syscall\",\n\t\"syscall.AF_SNA\":                                       \"syscall\",\n\t\"syscall.AF_SYSTEM\":                                    \"syscall\",\n\t\"syscall.AF_TIPC\":                                      \"syscall\",\n\t\"syscall.AF_UNIX\":                                      \"syscall\",\n\t\"syscall.AF_UNSPEC\":                                    \"syscall\",\n\t\"syscall.AF_VENDOR00\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR01\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR02\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR03\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR04\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR05\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR06\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR07\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR08\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR09\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR10\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR11\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR12\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR13\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR14\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR15\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR16\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR17\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR18\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR19\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR20\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR21\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR22\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR23\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR24\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR25\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR26\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR27\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR28\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR29\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR30\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR31\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR32\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR33\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR34\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR35\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR36\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR37\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR38\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR39\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR40\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR41\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR42\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR43\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR44\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR45\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR46\":                                  \"syscall\",\n\t\"syscall.AF_VENDOR47\":                                  \"syscall\",\n\t\"syscall.AF_WANPIPE\":                                   \"syscall\",\n\t\"syscall.AF_X25\":                                       \"syscall\",\n\t\"syscall.AI_CANONNAME\":                                 \"syscall\",\n\t\"syscall.AI_NUMERICHOST\":                               \"syscall\",\n\t\"syscall.AI_PASSIVE\":                                   \"syscall\",\n\t\"syscall.APPLICATION_ERROR\":                            \"syscall\",\n\t\"syscall.ARPHRD_ADAPT\":                                 \"syscall\",\n\t\"syscall.ARPHRD_APPLETLK\":                              \"syscall\",\n\t\"syscall.ARPHRD_ARCNET\":                                \"syscall\",\n\t\"syscall.ARPHRD_ASH\":                                   \"syscall\",\n\t\"syscall.ARPHRD_ATM\":                                   \"syscall\",\n\t\"syscall.ARPHRD_AX25\":                                  \"syscall\",\n\t\"syscall.ARPHRD_BIF\":                                   \"syscall\",\n\t\"syscall.ARPHRD_CHAOS\":                                 \"syscall\",\n\t\"syscall.ARPHRD_CISCO\":                                 \"syscall\",\n\t\"syscall.ARPHRD_CSLIP\":                                 \"syscall\",\n\t\"syscall.ARPHRD_CSLIP6\":                                \"syscall\",\n\t\"syscall.ARPHRD_DDCMP\":                                 \"syscall\",\n\t\"syscall.ARPHRD_DLCI\":                                  \"syscall\",\n\t\"syscall.ARPHRD_ECONET\":                                \"syscall\",\n\t\"syscall.ARPHRD_EETHER\":                                \"syscall\",\n\t\"syscall.ARPHRD_ETHER\":                                 \"syscall\",\n\t\"syscall.ARPHRD_EUI64\":                                 \"syscall\",\n\t\"syscall.ARPHRD_FCAL\":                                  \"syscall\",\n\t\"syscall.ARPHRD_FCFABRIC\":                              \"syscall\",\n\t\"syscall.ARPHRD_FCPL\":                                  \"syscall\",\n\t\"syscall.ARPHRD_FCPP\":                                  \"syscall\",\n\t\"syscall.ARPHRD_FDDI\":                                  \"syscall\",\n\t\"syscall.ARPHRD_FRAD\":                                  \"syscall\",\n\t\"syscall.ARPHRD_FRELAY\":                                \"syscall\",\n\t\"syscall.ARPHRD_HDLC\":                                  \"syscall\",\n\t\"syscall.ARPHRD_HIPPI\":                                 \"syscall\",\n\t\"syscall.ARPHRD_HWX25\":                                 \"syscall\",\n\t\"syscall.ARPHRD_IEEE1394\":                              \"syscall\",\n\t\"syscall.ARPHRD_IEEE802\":                               \"syscall\",\n\t\"syscall.ARPHRD_IEEE80211\":                             \"syscall\",\n\t\"syscall.ARPHRD_IEEE80211_PRISM\":                       \"syscall\",\n\t\"syscall.ARPHRD_IEEE80211_RADIOTAP\":                    \"syscall\",\n\t\"syscall.ARPHRD_IEEE802154\":                            \"syscall\",\n\t\"syscall.ARPHRD_IEEE802154_PHY\":                        \"syscall\",\n\t\"syscall.ARPHRD_IEEE802_TR\":                            \"syscall\",\n\t\"syscall.ARPHRD_INFINIBAND\":                            \"syscall\",\n\t\"syscall.ARPHRD_IPDDP\":                                 \"syscall\",\n\t\"syscall.ARPHRD_IPGRE\":                                 \"syscall\",\n\t\"syscall.ARPHRD_IRDA\":                                  \"syscall\",\n\t\"syscall.ARPHRD_LAPB\":                                  \"syscall\",\n\t\"syscall.ARPHRD_LOCALTLK\":                              \"syscall\",\n\t\"syscall.ARPHRD_LOOPBACK\":                              \"syscall\",\n\t\"syscall.ARPHRD_METRICOM\":                              \"syscall\",\n\t\"syscall.ARPHRD_NETROM\":                                \"syscall\",\n\t\"syscall.ARPHRD_NONE\":                                  \"syscall\",\n\t\"syscall.ARPHRD_PIMREG\":                                \"syscall\",\n\t\"syscall.ARPHRD_PPP\":                                   \"syscall\",\n\t\"syscall.ARPHRD_PRONET\":                                \"syscall\",\n\t\"syscall.ARPHRD_RAWHDLC\":                               \"syscall\",\n\t\"syscall.ARPHRD_ROSE\":                                  \"syscall\",\n\t\"syscall.ARPHRD_RSRVD\":                                 \"syscall\",\n\t\"syscall.ARPHRD_SIT\":                                   \"syscall\",\n\t\"syscall.ARPHRD_SKIP\":                                  \"syscall\",\n\t\"syscall.ARPHRD_SLIP\":                                  \"syscall\",\n\t\"syscall.ARPHRD_SLIP6\":                                 \"syscall\",\n\t\"syscall.ARPHRD_STRIP\":                                 \"syscall\",\n\t\"syscall.ARPHRD_TUNNEL\":                                \"syscall\",\n\t\"syscall.ARPHRD_TUNNEL6\":                               \"syscall\",\n\t\"syscall.ARPHRD_VOID\":                                  \"syscall\",\n\t\"syscall.ARPHRD_X25\":                                   \"syscall\",\n\t\"syscall.AUTHTYPE_CLIENT\":                              \"syscall\",\n\t\"syscall.AUTHTYPE_SERVER\":                              \"syscall\",\n\t\"syscall.Accept\":                                       \"syscall\",\n\t\"syscall.Accept4\":                                      \"syscall\",\n\t\"syscall.AcceptEx\":                                     \"syscall\",\n\t\"syscall.Access\":                                       \"syscall\",\n\t\"syscall.Acct\":                                         \"syscall\",\n\t\"syscall.AddrinfoW\":                                    \"syscall\",\n\t\"syscall.Adjtime\":                                      \"syscall\",\n\t\"syscall.Adjtimex\":                                     \"syscall\",\n\t\"syscall.AttachLsf\":                                    \"syscall\",\n\t\"syscall.B0\":                                           \"syscall\",\n\t\"syscall.B1000000\":                                     \"syscall\",\n\t\"syscall.B110\":                                         \"syscall\",\n\t\"syscall.B115200\":                                      \"syscall\",\n\t\"syscall.B1152000\":                                     \"syscall\",\n\t\"syscall.B1200\":                                        \"syscall\",\n\t\"syscall.B134\":                                         \"syscall\",\n\t\"syscall.B14400\":                                       \"syscall\",\n\t\"syscall.B150\":                                         \"syscall\",\n\t\"syscall.B1500000\":                                     \"syscall\",\n\t\"syscall.B1800\":                                        \"syscall\",\n\t\"syscall.B19200\":                                       \"syscall\",\n\t\"syscall.B200\":                                         \"syscall\",\n\t\"syscall.B2000000\":                                     \"syscall\",\n\t\"syscall.B230400\":                                      \"syscall\",\n\t\"syscall.B2400\":                                        \"syscall\",\n\t\"syscall.B2500000\":                                     \"syscall\",\n\t\"syscall.B28800\":                                       \"syscall\",\n\t\"syscall.B300\":                                         \"syscall\",\n\t\"syscall.B3000000\":                                     \"syscall\",\n\t\"syscall.B3500000\":                                     \"syscall\",\n\t\"syscall.B38400\":                                       \"syscall\",\n\t\"syscall.B4000000\":                                     \"syscall\",\n\t\"syscall.B460800\":                                      \"syscall\",\n\t\"syscall.B4800\":                                        \"syscall\",\n\t\"syscall.B50\":                                          \"syscall\",\n\t\"syscall.B500000\":                                      \"syscall\",\n\t\"syscall.B57600\":                                       \"syscall\",\n\t\"syscall.B576000\":                                      \"syscall\",\n\t\"syscall.B600\":                                         \"syscall\",\n\t\"syscall.B7200\":                                        \"syscall\",\n\t\"syscall.B75\":                                          \"syscall\",\n\t\"syscall.B76800\":                                       \"syscall\",\n\t\"syscall.B921600\":                                      \"syscall\",\n\t\"syscall.B9600\":                                        \"syscall\",\n\t\"syscall.BASE_PROTOCOL\":                                \"syscall\",\n\t\"syscall.BIOCFEEDBACK\":                                 \"syscall\",\n\t\"syscall.BIOCFLUSH\":                                    \"syscall\",\n\t\"syscall.BIOCGBLEN\":                                    \"syscall\",\n\t\"syscall.BIOCGDIRECTION\":                               \"syscall\",\n\t\"syscall.BIOCGDIRFILT\":                                 \"syscall\",\n\t\"syscall.BIOCGDLT\":                                     \"syscall\",\n\t\"syscall.BIOCGDLTLIST\":                                 \"syscall\",\n\t\"syscall.BIOCGETBUFMODE\":                               \"syscall\",\n\t\"syscall.BIOCGETIF\":                                    \"syscall\",\n\t\"syscall.BIOCGETZMAX\":                                  \"syscall\",\n\t\"syscall.BIOCGFEEDBACK\":                                \"syscall\",\n\t\"syscall.BIOCGFILDROP\":                                 \"syscall\",\n\t\"syscall.BIOCGHDRCMPLT\":                                \"syscall\",\n\t\"syscall.BIOCGRSIG\":                                    \"syscall\",\n\t\"syscall.BIOCGRTIMEOUT\":                                \"syscall\",\n\t\"syscall.BIOCGSEESENT\":                                 \"syscall\",\n\t\"syscall.BIOCGSTATS\":                                   \"syscall\",\n\t\"syscall.BIOCGSTATSOLD\":                                \"syscall\",\n\t\"syscall.BIOCGTSTAMP\":                                  \"syscall\",\n\t\"syscall.BIOCIMMEDIATE\":                                \"syscall\",\n\t\"syscall.BIOCLOCK\":                                     \"syscall\",\n\t\"syscall.BIOCPROMISC\":                                  \"syscall\",\n\t\"syscall.BIOCROTZBUF\":                                  \"syscall\",\n\t\"syscall.BIOCSBLEN\":                                    \"syscall\",\n\t\"syscall.BIOCSDIRECTION\":                               \"syscall\",\n\t\"syscall.BIOCSDIRFILT\":                                 \"syscall\",\n\t\"syscall.BIOCSDLT\":                                     \"syscall\",\n\t\"syscall.BIOCSETBUFMODE\":                               \"syscall\",\n\t\"syscall.BIOCSETF\":                                     \"syscall\",\n\t\"syscall.BIOCSETFNR\":                                   \"syscall\",\n\t\"syscall.BIOCSETIF\":                                    \"syscall\",\n\t\"syscall.BIOCSETWF\":                                    \"syscall\",\n\t\"syscall.BIOCSETZBUF\":                                  \"syscall\",\n\t\"syscall.BIOCSFEEDBACK\":                                \"syscall\",\n\t\"syscall.BIOCSFILDROP\":                                 \"syscall\",\n\t\"syscall.BIOCSHDRCMPLT\":                                \"syscall\",\n\t\"syscall.BIOCSRSIG\":                                    \"syscall\",\n\t\"syscall.BIOCSRTIMEOUT\":                                \"syscall\",\n\t\"syscall.BIOCSSEESENT\":                                 \"syscall\",\n\t\"syscall.BIOCSTCPF\":                                    \"syscall\",\n\t\"syscall.BIOCSTSTAMP\":                                  \"syscall\",\n\t\"syscall.BIOCSUDPF\":                                    \"syscall\",\n\t\"syscall.BIOCVERSION\":                                  \"syscall\",\n\t\"syscall.BPF_A\":                                        \"syscall\",\n\t\"syscall.BPF_ABS\":                                      \"syscall\",\n\t\"syscall.BPF_ADD\":                                      \"syscall\",\n\t\"syscall.BPF_ALIGNMENT\":                                \"syscall\",\n\t\"syscall.BPF_ALIGNMENT32\":                              \"syscall\",\n\t\"syscall.BPF_ALU\":                                      \"syscall\",\n\t\"syscall.BPF_AND\":                                      \"syscall\",\n\t\"syscall.BPF_B\":                                        \"syscall\",\n\t\"syscall.BPF_BUFMODE_BUFFER\":                           \"syscall\",\n\t\"syscall.BPF_BUFMODE_ZBUF\":                             \"syscall\",\n\t\"syscall.BPF_DFLTBUFSIZE\":                              \"syscall\",\n\t\"syscall.BPF_DIRECTION_IN\":                             \"syscall\",\n\t\"syscall.BPF_DIRECTION_OUT\":                            \"syscall\",\n\t\"syscall.BPF_DIV\":                                      \"syscall\",\n\t\"syscall.BPF_H\":                                        \"syscall\",\n\t\"syscall.BPF_IMM\":                                      \"syscall\",\n\t\"syscall.BPF_IND\":                                      \"syscall\",\n\t\"syscall.BPF_JA\":                                       \"syscall\",\n\t\"syscall.BPF_JEQ\":                                      \"syscall\",\n\t\"syscall.BPF_JGE\":                                      \"syscall\",\n\t\"syscall.BPF_JGT\":                                      \"syscall\",\n\t\"syscall.BPF_JMP\":                                      \"syscall\",\n\t\"syscall.BPF_JSET\":                                     \"syscall\",\n\t\"syscall.BPF_K\":                                        \"syscall\",\n\t\"syscall.BPF_LD\":                                       \"syscall\",\n\t\"syscall.BPF_LDX\":                                      \"syscall\",\n\t\"syscall.BPF_LEN\":                                      \"syscall\",\n\t\"syscall.BPF_LSH\":                                      \"syscall\",\n\t\"syscall.BPF_MAJOR_VERSION\":                            \"syscall\",\n\t\"syscall.BPF_MAXBUFSIZE\":                               \"syscall\",\n\t\"syscall.BPF_MAXINSNS\":                                 \"syscall\",\n\t\"syscall.BPF_MEM\":                                      \"syscall\",\n\t\"syscall.BPF_MEMWORDS\":                                 \"syscall\",\n\t\"syscall.BPF_MINBUFSIZE\":                               \"syscall\",\n\t\"syscall.BPF_MINOR_VERSION\":                            \"syscall\",\n\t\"syscall.BPF_MISC\":                                     \"syscall\",\n\t\"syscall.BPF_MSH\":                                      \"syscall\",\n\t\"syscall.BPF_MUL\":                                      \"syscall\",\n\t\"syscall.BPF_NEG\":                                      \"syscall\",\n\t\"syscall.BPF_OR\":                                       \"syscall\",\n\t\"syscall.BPF_RELEASE\":                                  \"syscall\",\n\t\"syscall.BPF_RET\":                                      \"syscall\",\n\t\"syscall.BPF_RSH\":                                      \"syscall\",\n\t\"syscall.BPF_ST\":                                       \"syscall\",\n\t\"syscall.BPF_STX\":                                      \"syscall\",\n\t\"syscall.BPF_SUB\":                                      \"syscall\",\n\t\"syscall.BPF_TAX\":                                      \"syscall\",\n\t\"syscall.BPF_TXA\":                                      \"syscall\",\n\t\"syscall.BPF_T_BINTIME\":                                \"syscall\",\n\t\"syscall.BPF_T_BINTIME_FAST\":                           \"syscall\",\n\t\"syscall.BPF_T_BINTIME_MONOTONIC\":                      \"syscall\",\n\t\"syscall.BPF_T_BINTIME_MONOTONIC_FAST\":                 \"syscall\",\n\t\"syscall.BPF_T_FAST\":                                   \"syscall\",\n\t\"syscall.BPF_T_FLAG_MASK\":                              \"syscall\",\n\t\"syscall.BPF_T_FORMAT_MASK\":                            \"syscall\",\n\t\"syscall.BPF_T_MICROTIME\":                              \"syscall\",\n\t\"syscall.BPF_T_MICROTIME_FAST\":                         \"syscall\",\n\t\"syscall.BPF_T_MICROTIME_MONOTONIC\":                    \"syscall\",\n\t\"syscall.BPF_T_MICROTIME_MONOTONIC_FAST\":               \"syscall\",\n\t\"syscall.BPF_T_MONOTONIC\":                              \"syscall\",\n\t\"syscall.BPF_T_MONOTONIC_FAST\":                         \"syscall\",\n\t\"syscall.BPF_T_NANOTIME\":                               \"syscall\",\n\t\"syscall.BPF_T_NANOTIME_FAST\":                          \"syscall\",\n\t\"syscall.BPF_T_NANOTIME_MONOTONIC\":                     \"syscall\",\n\t\"syscall.BPF_T_NANOTIME_MONOTONIC_FAST\":                \"syscall\",\n\t\"syscall.BPF_T_NONE\":                                   \"syscall\",\n\t\"syscall.BPF_T_NORMAL\":                                 \"syscall\",\n\t\"syscall.BPF_W\":                                        \"syscall\",\n\t\"syscall.BPF_X\":                                        \"syscall\",\n\t\"syscall.BRKINT\":                                       \"syscall\",\n\t\"syscall.Bind\":                                         \"syscall\",\n\t\"syscall.BindToDevice\":                                 \"syscall\",\n\t\"syscall.BpfBuflen\":                                    \"syscall\",\n\t\"syscall.BpfDatalink\":                                  \"syscall\",\n\t\"syscall.BpfHdr\":                                       \"syscall\",\n\t\"syscall.BpfHeadercmpl\":                                \"syscall\",\n\t\"syscall.BpfInsn\":                                      \"syscall\",\n\t\"syscall.BpfInterface\":                                 \"syscall\",\n\t\"syscall.BpfJump\":                                      \"syscall\",\n\t\"syscall.BpfProgram\":                                   \"syscall\",\n\t\"syscall.BpfStat\":                                      \"syscall\",\n\t\"syscall.BpfStats\":                                     \"syscall\",\n\t\"syscall.BpfStmt\":                                      \"syscall\",\n\t\"syscall.BpfTimeout\":                                   \"syscall\",\n\t\"syscall.BpfTimeval\":                                   \"syscall\",\n\t\"syscall.BpfVersion\":                                   \"syscall\",\n\t\"syscall.BpfZbuf\":                                      \"syscall\",\n\t\"syscall.BpfZbufHeader\":                                \"syscall\",\n\t\"syscall.ByHandleFileInformation\":                      \"syscall\",\n\t\"syscall.BytePtrFromString\":                            \"syscall\",\n\t\"syscall.ByteSliceFromString\":                          \"syscall\",\n\t\"syscall.CCR0_FLUSH\":                                   \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_AUTHENTICODE\":               \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_AUTHENTICODE_TS\":            \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_BASE\":                       \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_BASIC_CONSTRAINTS\":          \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_EV\":                         \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_MICROSOFT_ROOT\":             \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_NT_AUTH\":                    \"syscall\",\n\t\"syscall.CERT_CHAIN_POLICY_SSL\":                        \"syscall\",\n\t\"syscall.CERT_E_CN_NO_MATCH\":                           \"syscall\",\n\t\"syscall.CERT_E_EXPIRED\":                               \"syscall\",\n\t\"syscall.CERT_E_PURPOSE\":                               \"syscall\",\n\t\"syscall.CERT_E_ROLE\":                                  \"syscall\",\n\t\"syscall.CERT_E_UNTRUSTEDROOT\":                         \"syscall\",\n\t\"syscall.CERT_STORE_ADD_ALWAYS\":                        \"syscall\",\n\t\"syscall.CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG\":  \"syscall\",\n\t\"syscall.CERT_STORE_PROV_MEMORY\":                       \"syscall\",\n\t\"syscall.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT\":      \"syscall\",\n\t\"syscall.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT\":   \"syscall\",\n\t\"syscall.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT\": \"syscall\",\n\t\"syscall.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT\":    \"syscall\",\n\t\"syscall.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT\": \"syscall\",\n\t\"syscall.CERT_TRUST_INVALID_BASIC_CONSTRAINTS\":         \"syscall\",\n\t\"syscall.CERT_TRUST_INVALID_EXTENSION\":                 \"syscall\",\n\t\"syscall.CERT_TRUST_INVALID_NAME_CONSTRAINTS\":          \"syscall\",\n\t\"syscall.CERT_TRUST_INVALID_POLICY_CONSTRAINTS\":        \"syscall\",\n\t\"syscall.CERT_TRUST_IS_CYCLIC\":                         \"syscall\",\n\t\"syscall.CERT_TRUST_IS_EXPLICIT_DISTRUST\":              \"syscall\",\n\t\"syscall.CERT_TRUST_IS_NOT_SIGNATURE_VALID\":            \"syscall\",\n\t\"syscall.CERT_TRUST_IS_NOT_TIME_VALID\":                 \"syscall\",\n\t\"syscall.CERT_TRUST_IS_NOT_VALID_FOR_USAGE\":            \"syscall\",\n\t\"syscall.CERT_TRUST_IS_OFFLINE_REVOCATION\":             \"syscall\",\n\t\"syscall.CERT_TRUST_IS_REVOKED\":                        \"syscall\",\n\t\"syscall.CERT_TRUST_IS_UNTRUSTED_ROOT\":                 \"syscall\",\n\t\"syscall.CERT_TRUST_NO_ERROR\":                          \"syscall\",\n\t\"syscall.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY\":          \"syscall\",\n\t\"syscall.CERT_TRUST_REVOCATION_STATUS_UNKNOWN\":         \"syscall\",\n\t\"syscall.CFLUSH\":                                       \"syscall\",\n\t\"syscall.CLOCAL\":                                       \"syscall\",\n\t\"syscall.CLONE_CHILD_CLEARTID\":                         \"syscall\",\n\t\"syscall.CLONE_CHILD_SETTID\":                           \"syscall\",\n\t\"syscall.CLONE_CSIGNAL\":                                \"syscall\",\n\t\"syscall.CLONE_DETACHED\":                               \"syscall\",\n\t\"syscall.CLONE_FILES\":                                  \"syscall\",\n\t\"syscall.CLONE_FS\":                                     \"syscall\",\n\t\"syscall.CLONE_IO\":                                     \"syscall\",\n\t\"syscall.CLONE_NEWIPC\":                                 \"syscall\",\n\t\"syscall.CLONE_NEWNET\":                                 \"syscall\",\n\t\"syscall.CLONE_NEWNS\":                                  \"syscall\",\n\t\"syscall.CLONE_NEWPID\":                                 \"syscall\",\n\t\"syscall.CLONE_NEWUSER\":                                \"syscall\",\n\t\"syscall.CLONE_NEWUTS\":                                 \"syscall\",\n\t\"syscall.CLONE_PARENT\":                                 \"syscall\",\n\t\"syscall.CLONE_PARENT_SETTID\":                          \"syscall\",\n\t\"syscall.CLONE_PID\":                                    \"syscall\",\n\t\"syscall.CLONE_PTRACE\":                                 \"syscall\",\n\t\"syscall.CLONE_SETTLS\":                                 \"syscall\",\n\t\"syscall.CLONE_SIGHAND\":                                \"syscall\",\n\t\"syscall.CLONE_SYSVSEM\":                                \"syscall\",\n\t\"syscall.CLONE_THREAD\":                                 \"syscall\",\n\t\"syscall.CLONE_UNTRACED\":                               \"syscall\",\n\t\"syscall.CLONE_VFORK\":                                  \"syscall\",\n\t\"syscall.CLONE_VM\":                                     \"syscall\",\n\t\"syscall.CPUID_CFLUSH\":                                 \"syscall\",\n\t\"syscall.CREAD\":                                        \"syscall\",\n\t\"syscall.CREATE_ALWAYS\":                                \"syscall\",\n\t\"syscall.CREATE_NEW\":                                   \"syscall\",\n\t\"syscall.CREATE_NEW_PROCESS_GROUP\":                     \"syscall\",\n\t\"syscall.CREATE_UNICODE_ENVIRONMENT\":                   \"syscall\",\n\t\"syscall.CRYPT_DEFAULT_CONTAINER_OPTIONAL\":             \"syscall\",\n\t\"syscall.CRYPT_DELETEKEYSET\":                           \"syscall\",\n\t\"syscall.CRYPT_MACHINE_KEYSET\":                         \"syscall\",\n\t\"syscall.CRYPT_NEWKEYSET\":                              \"syscall\",\n\t\"syscall.CRYPT_SILENT\":                                 \"syscall\",\n\t\"syscall.CRYPT_VERIFYCONTEXT\":                          \"syscall\",\n\t\"syscall.CS5\":                                          \"syscall\",\n\t\"syscall.CS6\":                                          \"syscall\",\n\t\"syscall.CS7\":                                          \"syscall\",\n\t\"syscall.CS8\":                                          \"syscall\",\n\t\"syscall.CSIZE\":                                        \"syscall\",\n\t\"syscall.CSTART\":                                       \"syscall\",\n\t\"syscall.CSTATUS\":                                      \"syscall\",\n\t\"syscall.CSTOP\":                                        \"syscall\",\n\t\"syscall.CSTOPB\":                                       \"syscall\",\n\t\"syscall.CSUSP\":                                        \"syscall\",\n\t\"syscall.CTL_MAXNAME\":                                  \"syscall\",\n\t\"syscall.CTL_NET\":                                      \"syscall\",\n\t\"syscall.CTL_QUERY\":                                    \"syscall\",\n\t\"syscall.CTRL_BREAK_EVENT\":                             \"syscall\",\n\t\"syscall.CTRL_C_EVENT\":                                 \"syscall\",\n\t\"syscall.CancelIo\":                                     \"syscall\",\n\t\"syscall.CancelIoEx\":                                   \"syscall\",\n\t\"syscall.CertAddCertificateContextToStore\":             \"syscall\",\n\t\"syscall.CertChainContext\":                             \"syscall\",\n\t\"syscall.CertChainElement\":                             \"syscall\",\n\t\"syscall.CertChainPara\":                                \"syscall\",\n\t\"syscall.CertChainPolicyPara\":                          \"syscall\",\n\t\"syscall.CertChainPolicyStatus\":                        \"syscall\",\n\t\"syscall.CertCloseStore\":                               \"syscall\",\n\t\"syscall.CertContext\":                                  \"syscall\",\n\t\"syscall.CertCreateCertificateContext\":                 \"syscall\",\n\t\"syscall.CertEnhKeyUsage\":                              \"syscall\",\n\t\"syscall.CertEnumCertificatesInStore\":                  \"syscall\",\n\t\"syscall.CertFreeCertificateChain\":                     \"syscall\",\n\t\"syscall.CertFreeCertificateContext\":                   \"syscall\",\n\t\"syscall.CertGetCertificateChain\":                      \"syscall\",\n\t\"syscall.CertOpenStore\":                                \"syscall\",\n\t\"syscall.CertOpenSystemStore\":                          \"syscall\",\n\t\"syscall.CertRevocationInfo\":                           \"syscall\",\n\t\"syscall.CertSimpleChain\":                              \"syscall\",\n\t\"syscall.CertTrustStatus\":                              \"syscall\",\n\t\"syscall.CertUsageMatch\":                               \"syscall\",\n\t\"syscall.CertVerifyCertificateChainPolicy\":             \"syscall\",\n\t\"syscall.Chdir\":                                        \"syscall\",\n\t\"syscall.CheckBpfVersion\":                              \"syscall\",\n\t\"syscall.Chflags\":                                      \"syscall\",\n\t\"syscall.Chmod\":                                        \"syscall\",\n\t\"syscall.Chown\":                                        \"syscall\",\n\t\"syscall.Chroot\":                                       \"syscall\",\n\t\"syscall.Clearenv\":                                     \"syscall\",\n\t\"syscall.Close\":                                        \"syscall\",\n\t\"syscall.CloseHandle\":                                  \"syscall\",\n\t\"syscall.CloseOnExec\":                                  \"syscall\",\n\t\"syscall.Closesocket\":                                  \"syscall\",\n\t\"syscall.CmsgLen\":                                      \"syscall\",\n\t\"syscall.CmsgSpace\":                                    \"syscall\",\n\t\"syscall.Cmsghdr\":                                      \"syscall\",\n\t\"syscall.CommandLineToArgv\":                            \"syscall\",\n\t\"syscall.ComputerName\":                                 \"syscall\",\n\t\"syscall.Connect\":                                      \"syscall\",\n\t\"syscall.ConnectEx\":                                    \"syscall\",\n\t\"syscall.ConvertSidToStringSid\":                        \"syscall\",\n\t\"syscall.ConvertStringSidToSid\":                        \"syscall\",\n\t\"syscall.CopySid\":                                      \"syscall\",\n\t\"syscall.Creat\":                                        \"syscall\",\n\t\"syscall.CreateDirectory\":                              \"syscall\",\n\t\"syscall.CreateFile\":                                   \"syscall\",\n\t\"syscall.CreateFileMapping\":                            \"syscall\",\n\t\"syscall.CreateHardLink\":                               \"syscall\",\n\t\"syscall.CreateIoCompletionPort\":                       \"syscall\",\n\t\"syscall.CreatePipe\":                                   \"syscall\",\n\t\"syscall.CreateProcess\":                                \"syscall\",\n\t\"syscall.CreateSymbolicLink\":                           \"syscall\",\n\t\"syscall.CreateToolhelp32Snapshot\":                     \"syscall\",\n\t\"syscall.Credential\":                                   \"syscall\",\n\t\"syscall.CryptAcquireContext\":                          \"syscall\",\n\t\"syscall.CryptGenRandom\":                               \"syscall\",\n\t\"syscall.CryptReleaseContext\":                          \"syscall\",\n\t\"syscall.DIOCBSFLUSH\":                                  \"syscall\",\n\t\"syscall.DIOCOSFPFLUSH\":                                \"syscall\",\n\t\"syscall.DLL\":                                          \"syscall\",\n\t\"syscall.DLLError\":                                     \"syscall\",\n\t\"syscall.DLT_A429\":                                     \"syscall\",\n\t\"syscall.DLT_A653_ICM\":                                 \"syscall\",\n\t\"syscall.DLT_AIRONET_HEADER\":                           \"syscall\",\n\t\"syscall.DLT_AOS\":                                      \"syscall\",\n\t\"syscall.DLT_APPLE_IP_OVER_IEEE1394\":                   \"syscall\",\n\t\"syscall.DLT_ARCNET\":                                   \"syscall\",\n\t\"syscall.DLT_ARCNET_LINUX\":                             \"syscall\",\n\t\"syscall.DLT_ATM_CLIP\":                                 \"syscall\",\n\t\"syscall.DLT_ATM_RFC1483\":                              \"syscall\",\n\t\"syscall.DLT_AURORA\":                                   \"syscall\",\n\t\"syscall.DLT_AX25\":                                     \"syscall\",\n\t\"syscall.DLT_AX25_KISS\":                                \"syscall\",\n\t\"syscall.DLT_BACNET_MS_TP\":                             \"syscall\",\n\t\"syscall.DLT_BLUETOOTH_HCI_H4\":                         \"syscall\",\n\t\"syscall.DLT_BLUETOOTH_HCI_H4_WITH_PHDR\":               \"syscall\",\n\t\"syscall.DLT_CAN20B\":                                   \"syscall\",\n\t\"syscall.DLT_CAN_SOCKETCAN\":                            \"syscall\",\n\t\"syscall.DLT_CHAOS\":                                    \"syscall\",\n\t\"syscall.DLT_CHDLC\":                                    \"syscall\",\n\t\"syscall.DLT_CISCO_IOS\":                                \"syscall\",\n\t\"syscall.DLT_C_HDLC\":                                   \"syscall\",\n\t\"syscall.DLT_C_HDLC_WITH_DIR\":                          \"syscall\",\n\t\"syscall.DLT_DBUS\":                                     \"syscall\",\n\t\"syscall.DLT_DECT\":                                     \"syscall\",\n\t\"syscall.DLT_DOCSIS\":                                   \"syscall\",\n\t\"syscall.DLT_DVB_CI\":                                   \"syscall\",\n\t\"syscall.DLT_ECONET\":                                   \"syscall\",\n\t\"syscall.DLT_EN10MB\":                                   \"syscall\",\n\t\"syscall.DLT_EN3MB\":                                    \"syscall\",\n\t\"syscall.DLT_ENC\":                                      \"syscall\",\n\t\"syscall.DLT_ERF\":                                      \"syscall\",\n\t\"syscall.DLT_ERF_ETH\":                                  \"syscall\",\n\t\"syscall.DLT_ERF_POS\":                                  \"syscall\",\n\t\"syscall.DLT_FC_2\":                                     \"syscall\",\n\t\"syscall.DLT_FC_2_WITH_FRAME_DELIMS\":                   \"syscall\",\n\t\"syscall.DLT_FDDI\":                                     \"syscall\",\n\t\"syscall.DLT_FLEXRAY\":                                  \"syscall\",\n\t\"syscall.DLT_FRELAY\":                                   \"syscall\",\n\t\"syscall.DLT_FRELAY_WITH_DIR\":                          \"syscall\",\n\t\"syscall.DLT_GCOM_SERIAL\":                              \"syscall\",\n\t\"syscall.DLT_GCOM_T1E1\":                                \"syscall\",\n\t\"syscall.DLT_GPF_F\":                                    \"syscall\",\n\t\"syscall.DLT_GPF_T\":                                    \"syscall\",\n\t\"syscall.DLT_GPRS_LLC\":                                 \"syscall\",\n\t\"syscall.DLT_GSMTAP_ABIS\":                              \"syscall\",\n\t\"syscall.DLT_GSMTAP_UM\":                                \"syscall\",\n\t\"syscall.DLT_HDLC\":                                     \"syscall\",\n\t\"syscall.DLT_HHDLC\":                                    \"syscall\",\n\t\"syscall.DLT_HIPPI\":                                    \"syscall\",\n\t\"syscall.DLT_IBM_SN\":                                   \"syscall\",\n\t\"syscall.DLT_IBM_SP\":                                   \"syscall\",\n\t\"syscall.DLT_IEEE802\":                                  \"syscall\",\n\t\"syscall.DLT_IEEE802_11\":                               \"syscall\",\n\t\"syscall.DLT_IEEE802_11_RADIO\":                         \"syscall\",\n\t\"syscall.DLT_IEEE802_11_RADIO_AVS\":                     \"syscall\",\n\t\"syscall.DLT_IEEE802_15_4\":                             \"syscall\",\n\t\"syscall.DLT_IEEE802_15_4_LINUX\":                       \"syscall\",\n\t\"syscall.DLT_IEEE802_15_4_NOFCS\":                       \"syscall\",\n\t\"syscall.DLT_IEEE802_15_4_NONASK_PHY\":                  \"syscall\",\n\t\"syscall.DLT_IEEE802_16_MAC_CPS\":                       \"syscall\",\n\t\"syscall.DLT_IEEE802_16_MAC_CPS_RADIO\":                 \"syscall\",\n\t\"syscall.DLT_IPFILTER\":                                 \"syscall\",\n\t\"syscall.DLT_IPMB\":                                     \"syscall\",\n\t\"syscall.DLT_IPMB_LINUX\":                               \"syscall\",\n\t\"syscall.DLT_IPNET\":                                    \"syscall\",\n\t\"syscall.DLT_IPOIB\":                                    \"syscall\",\n\t\"syscall.DLT_IPV4\":                                     \"syscall\",\n\t\"syscall.DLT_IPV6\":                                     \"syscall\",\n\t\"syscall.DLT_IP_OVER_FC\":                               \"syscall\",\n\t\"syscall.DLT_JUNIPER_ATM1\":                             \"syscall\",\n\t\"syscall.DLT_JUNIPER_ATM2\":                             \"syscall\",\n\t\"syscall.DLT_JUNIPER_ATM_CEMIC\":                        \"syscall\",\n\t\"syscall.DLT_JUNIPER_CHDLC\":                            \"syscall\",\n\t\"syscall.DLT_JUNIPER_ES\":                               \"syscall\",\n\t\"syscall.DLT_JUNIPER_ETHER\":                            \"syscall\",\n\t\"syscall.DLT_JUNIPER_FIBRECHANNEL\":                     \"syscall\",\n\t\"syscall.DLT_JUNIPER_FRELAY\":                           \"syscall\",\n\t\"syscall.DLT_JUNIPER_GGSN\":                             \"syscall\",\n\t\"syscall.DLT_JUNIPER_ISM\":                              \"syscall\",\n\t\"syscall.DLT_JUNIPER_MFR\":                              \"syscall\",\n\t\"syscall.DLT_JUNIPER_MLFR\":                             \"syscall\",\n\t\"syscall.DLT_JUNIPER_MLPPP\":                            \"syscall\",\n\t\"syscall.DLT_JUNIPER_MONITOR\":                          \"syscall\",\n\t\"syscall.DLT_JUNIPER_PIC_PEER\":                         \"syscall\",\n\t\"syscall.DLT_JUNIPER_PPP\":                              \"syscall\",\n\t\"syscall.DLT_JUNIPER_PPPOE\":                            \"syscall\",\n\t\"syscall.DLT_JUNIPER_PPPOE_ATM\":                        \"syscall\",\n\t\"syscall.DLT_JUNIPER_SERVICES\":                         \"syscall\",\n\t\"syscall.DLT_JUNIPER_SRX_E2E\":                          \"syscall\",\n\t\"syscall.DLT_JUNIPER_ST\":                               \"syscall\",\n\t\"syscall.DLT_JUNIPER_VP\":                               \"syscall\",\n\t\"syscall.DLT_JUNIPER_VS\":                               \"syscall\",\n\t\"syscall.DLT_LAPB_WITH_DIR\":                            \"syscall\",\n\t\"syscall.DLT_LAPD\":                                     \"syscall\",\n\t\"syscall.DLT_LIN\":                                      \"syscall\",\n\t\"syscall.DLT_LINUX_EVDEV\":                              \"syscall\",\n\t\"syscall.DLT_LINUX_IRDA\":                               \"syscall\",\n\t\"syscall.DLT_LINUX_LAPD\":                               \"syscall\",\n\t\"syscall.DLT_LINUX_PPP_WITHDIRECTION\":                  \"syscall\",\n\t\"syscall.DLT_LINUX_SLL\":                                \"syscall\",\n\t\"syscall.DLT_LOOP\":                                     \"syscall\",\n\t\"syscall.DLT_LTALK\":                                    \"syscall\",\n\t\"syscall.DLT_MATCHING_MAX\":                             \"syscall\",\n\t\"syscall.DLT_MATCHING_MIN\":                             \"syscall\",\n\t\"syscall.DLT_MFR\":                                      \"syscall\",\n\t\"syscall.DLT_MOST\":                                     \"syscall\",\n\t\"syscall.DLT_MPEG_2_TS\":                                \"syscall\",\n\t\"syscall.DLT_MPLS\":                                     \"syscall\",\n\t\"syscall.DLT_MTP2\":                                     \"syscall\",\n\t\"syscall.DLT_MTP2_WITH_PHDR\":                           \"syscall\",\n\t\"syscall.DLT_MTP3\":                                     \"syscall\",\n\t\"syscall.DLT_MUX27010\":                                 \"syscall\",\n\t\"syscall.DLT_NETANALYZER\":                              \"syscall\",\n\t\"syscall.DLT_NETANALYZER_TRANSPARENT\":                  \"syscall\",\n\t\"syscall.DLT_NFC_LLCP\":                                 \"syscall\",\n\t\"syscall.DLT_NFLOG\":                                    \"syscall\",\n\t\"syscall.DLT_NG40\":                                     \"syscall\",\n\t\"syscall.DLT_NULL\":                                     \"syscall\",\n\t\"syscall.DLT_PCI_EXP\":                                  \"syscall\",\n\t\"syscall.DLT_PFLOG\":                                    \"syscall\",\n\t\"syscall.DLT_PFSYNC\":                                   \"syscall\",\n\t\"syscall.DLT_PPI\":                                      \"syscall\",\n\t\"syscall.DLT_PPP\":                                      \"syscall\",\n\t\"syscall.DLT_PPP_BSDOS\":                                \"syscall\",\n\t\"syscall.DLT_PPP_ETHER\":                                \"syscall\",\n\t\"syscall.DLT_PPP_PPPD\":                                 \"syscall\",\n\t\"syscall.DLT_PPP_SERIAL\":                               \"syscall\",\n\t\"syscall.DLT_PPP_WITH_DIR\":                             \"syscall\",\n\t\"syscall.DLT_PPP_WITH_DIRECTION\":                       \"syscall\",\n\t\"syscall.DLT_PRISM_HEADER\":                             \"syscall\",\n\t\"syscall.DLT_PRONET\":                                   \"syscall\",\n\t\"syscall.DLT_RAIF1\":                                    \"syscall\",\n\t\"syscall.DLT_RAW\":                                      \"syscall\",\n\t\"syscall.DLT_RAWAF_MASK\":                               \"syscall\",\n\t\"syscall.DLT_RIO\":                                      \"syscall\",\n\t\"syscall.DLT_SCCP\":                                     \"syscall\",\n\t\"syscall.DLT_SITA\":                                     \"syscall\",\n\t\"syscall.DLT_SLIP\":                                     \"syscall\",\n\t\"syscall.DLT_SLIP_BSDOS\":                               \"syscall\",\n\t\"syscall.DLT_STANAG_5066_D_PDU\":                        \"syscall\",\n\t\"syscall.DLT_SUNATM\":                                   \"syscall\",\n\t\"syscall.DLT_SYMANTEC_FIREWALL\":                        \"syscall\",\n\t\"syscall.DLT_TZSP\":                                     \"syscall\",\n\t\"syscall.DLT_USB\":                                      \"syscall\",\n\t\"syscall.DLT_USB_LINUX\":                                \"syscall\",\n\t\"syscall.DLT_USB_LINUX_MMAPPED\":                        \"syscall\",\n\t\"syscall.DLT_USER0\":                                    \"syscall\",\n\t\"syscall.DLT_USER1\":                                    \"syscall\",\n\t\"syscall.DLT_USER10\":                                   \"syscall\",\n\t\"syscall.DLT_USER11\":                                   \"syscall\",\n\t\"syscall.DLT_USER12\":                                   \"syscall\",\n\t\"syscall.DLT_USER13\":                                   \"syscall\",\n\t\"syscall.DLT_USER14\":                                   \"syscall\",\n\t\"syscall.DLT_USER15\":                                   \"syscall\",\n\t\"syscall.DLT_USER2\":                                    \"syscall\",\n\t\"syscall.DLT_USER3\":                                    \"syscall\",\n\t\"syscall.DLT_USER4\":                                    \"syscall\",\n\t\"syscall.DLT_USER5\":                                    \"syscall\",\n\t\"syscall.DLT_USER6\":                                    \"syscall\",\n\t\"syscall.DLT_USER7\":                                    \"syscall\",\n\t\"syscall.DLT_USER8\":                                    \"syscall\",\n\t\"syscall.DLT_USER9\":                                    \"syscall\",\n\t\"syscall.DLT_WIHART\":                                   \"syscall\",\n\t\"syscall.DLT_X2E_SERIAL\":                               \"syscall\",\n\t\"syscall.DLT_X2E_XORAYA\":                               \"syscall\",\n\t\"syscall.DNSMXData\":                                    \"syscall\",\n\t\"syscall.DNSPTRData\":                                   \"syscall\",\n\t\"syscall.DNSRecord\":                                    \"syscall\",\n\t\"syscall.DNSSRVData\":                                   \"syscall\",\n\t\"syscall.DNSTXTData\":                                   \"syscall\",\n\t\"syscall.DNS_INFO_NO_RECORDS\":                          \"syscall\",\n\t\"syscall.DNS_TYPE_A\":                                   \"syscall\",\n\t\"syscall.DNS_TYPE_A6\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_AAAA\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_ADDRS\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_AFSDB\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_ALL\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_ANY\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_ATMA\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_AXFR\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_CERT\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_CNAME\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_DHCID\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_DNAME\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_DNSKEY\":                              \"syscall\",\n\t\"syscall.DNS_TYPE_DS\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_EID\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_GID\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_GPOS\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_HINFO\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_ISDN\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_IXFR\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_KEY\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_KX\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_LOC\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_MAILA\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_MAILB\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_MB\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_MD\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_MF\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_MG\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_MINFO\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_MR\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_MX\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_NAPTR\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_NBSTAT\":                              \"syscall\",\n\t\"syscall.DNS_TYPE_NIMLOC\":                              \"syscall\",\n\t\"syscall.DNS_TYPE_NS\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_NSAP\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_NSAPPTR\":                             \"syscall\",\n\t\"syscall.DNS_TYPE_NSEC\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_NULL\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_NXT\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_OPT\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_PTR\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_PX\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_RP\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_RRSIG\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_RT\":                                  \"syscall\",\n\t\"syscall.DNS_TYPE_SIG\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_SINK\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_SOA\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_SRV\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_TEXT\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_TKEY\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_TSIG\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_UID\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_UINFO\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_UNSPEC\":                              \"syscall\",\n\t\"syscall.DNS_TYPE_WINS\":                                \"syscall\",\n\t\"syscall.DNS_TYPE_WINSR\":                               \"syscall\",\n\t\"syscall.DNS_TYPE_WKS\":                                 \"syscall\",\n\t\"syscall.DNS_TYPE_X25\":                                 \"syscall\",\n\t\"syscall.DT_BLK\":                                       \"syscall\",\n\t\"syscall.DT_CHR\":                                       \"syscall\",\n\t\"syscall.DT_DIR\":                                       \"syscall\",\n\t\"syscall.DT_FIFO\":                                      \"syscall\",\n\t\"syscall.DT_LNK\":                                       \"syscall\",\n\t\"syscall.DT_REG\":                                       \"syscall\",\n\t\"syscall.DT_SOCK\":                                      \"syscall\",\n\t\"syscall.DT_UNKNOWN\":                                   \"syscall\",\n\t\"syscall.DT_WHT\":                                       \"syscall\",\n\t\"syscall.DUPLICATE_CLOSE_SOURCE\":                       \"syscall\",\n\t\"syscall.DUPLICATE_SAME_ACCESS\":                        \"syscall\",\n\t\"syscall.DeleteFile\":                                   \"syscall\",\n\t\"syscall.DetachLsf\":                                    \"syscall\",\n\t\"syscall.DeviceIoControl\":                              \"syscall\",\n\t\"syscall.Dirent\":                                       \"syscall\",\n\t\"syscall.DnsNameCompare\":                               \"syscall\",\n\t\"syscall.DnsQuery\":                                     \"syscall\",\n\t\"syscall.DnsRecordListFree\":                            \"syscall\",\n\t\"syscall.DnsSectionAdditional\":                         \"syscall\",\n\t\"syscall.DnsSectionAnswer\":                             \"syscall\",\n\t\"syscall.DnsSectionAuthority\":                          \"syscall\",\n\t\"syscall.DnsSectionQuestion\":                           \"syscall\",\n\t\"syscall.Dup\":                                          \"syscall\",\n\t\"syscall.Dup2\":                                         \"syscall\",\n\t\"syscall.Dup3\":                                         \"syscall\",\n\t\"syscall.DuplicateHandle\":                              \"syscall\",\n\t\"syscall.E2BIG\":                                        \"syscall\",\n\t\"syscall.EACCES\":                                       \"syscall\",\n\t\"syscall.EADDRINUSE\":                                   \"syscall\",\n\t\"syscall.EADDRNOTAVAIL\":                                \"syscall\",\n\t\"syscall.EADV\":                                         \"syscall\",\n\t\"syscall.EAFNOSUPPORT\":                                 \"syscall\",\n\t\"syscall.EAGAIN\":                                       \"syscall\",\n\t\"syscall.EALREADY\":                                     \"syscall\",\n\t\"syscall.EAUTH\":                                        \"syscall\",\n\t\"syscall.EBADARCH\":                                     \"syscall\",\n\t\"syscall.EBADE\":                                        \"syscall\",\n\t\"syscall.EBADEXEC\":                                     \"syscall\",\n\t\"syscall.EBADF\":                                        \"syscall\",\n\t\"syscall.EBADFD\":                                       \"syscall\",\n\t\"syscall.EBADMACHO\":                                    \"syscall\",\n\t\"syscall.EBADMSG\":                                      \"syscall\",\n\t\"syscall.EBADR\":                                        \"syscall\",\n\t\"syscall.EBADRPC\":                                      \"syscall\",\n\t\"syscall.EBADRQC\":                                      \"syscall\",\n\t\"syscall.EBADSLT\":                                      \"syscall\",\n\t\"syscall.EBFONT\":                                       \"syscall\",\n\t\"syscall.EBUSY\":                                        \"syscall\",\n\t\"syscall.ECANCELED\":                                    \"syscall\",\n\t\"syscall.ECAPMODE\":                                     \"syscall\",\n\t\"syscall.ECHILD\":                                       \"syscall\",\n\t\"syscall.ECHO\":                                         \"syscall\",\n\t\"syscall.ECHOCTL\":                                      \"syscall\",\n\t\"syscall.ECHOE\":                                        \"syscall\",\n\t\"syscall.ECHOK\":                                        \"syscall\",\n\t\"syscall.ECHOKE\":                                       \"syscall\",\n\t\"syscall.ECHONL\":                                       \"syscall\",\n\t\"syscall.ECHOPRT\":                                      \"syscall\",\n\t\"syscall.ECHRNG\":                                       \"syscall\",\n\t\"syscall.ECOMM\":                                        \"syscall\",\n\t\"syscall.ECONNABORTED\":                                 \"syscall\",\n\t\"syscall.ECONNREFUSED\":                                 \"syscall\",\n\t\"syscall.ECONNRESET\":                                   \"syscall\",\n\t\"syscall.EDEADLK\":                                      \"syscall\",\n\t\"syscall.EDEADLOCK\":                                    \"syscall\",\n\t\"syscall.EDESTADDRREQ\":                                 \"syscall\",\n\t\"syscall.EDEVERR\":                                      \"syscall\",\n\t\"syscall.EDOM\":                                         \"syscall\",\n\t\"syscall.EDOOFUS\":                                      \"syscall\",\n\t\"syscall.EDOTDOT\":                                      \"syscall\",\n\t\"syscall.EDQUOT\":                                       \"syscall\",\n\t\"syscall.EEXIST\":                                       \"syscall\",\n\t\"syscall.EFAULT\":                                       \"syscall\",\n\t\"syscall.EFBIG\":                                        \"syscall\",\n\t\"syscall.EFER_LMA\":                                     \"syscall\",\n\t\"syscall.EFER_LME\":                                     \"syscall\",\n\t\"syscall.EFER_NXE\":                                     \"syscall\",\n\t\"syscall.EFER_SCE\":                                     \"syscall\",\n\t\"syscall.EFTYPE\":                                       \"syscall\",\n\t\"syscall.EHOSTDOWN\":                                    \"syscall\",\n\t\"syscall.EHOSTUNREACH\":                                 \"syscall\",\n\t\"syscall.EHWPOISON\":                                    \"syscall\",\n\t\"syscall.EIDRM\":                                        \"syscall\",\n\t\"syscall.EILSEQ\":                                       \"syscall\",\n\t\"syscall.EINPROGRESS\":                                  \"syscall\",\n\t\"syscall.EINTR\":                                        \"syscall\",\n\t\"syscall.EINVAL\":                                       \"syscall\",\n\t\"syscall.EIO\":                                          \"syscall\",\n\t\"syscall.EIPSEC\":                                       \"syscall\",\n\t\"syscall.EISCONN\":                                      \"syscall\",\n\t\"syscall.EISDIR\":                                       \"syscall\",\n\t\"syscall.EISNAM\":                                       \"syscall\",\n\t\"syscall.EKEYEXPIRED\":                                  \"syscall\",\n\t\"syscall.EKEYREJECTED\":                                 \"syscall\",\n\t\"syscall.EKEYREVOKED\":                                  \"syscall\",\n\t\"syscall.EL2HLT\":                                       \"syscall\",\n\t\"syscall.EL2NSYNC\":                                     \"syscall\",\n\t\"syscall.EL3HLT\":                                       \"syscall\",\n\t\"syscall.EL3RST\":                                       \"syscall\",\n\t\"syscall.ELAST\":                                        \"syscall\",\n\t\"syscall.ELF_NGREG\":                                    \"syscall\",\n\t\"syscall.ELF_PRARGSZ\":                                  \"syscall\",\n\t\"syscall.ELIBACC\":                                      \"syscall\",\n\t\"syscall.ELIBBAD\":                                      \"syscall\",\n\t\"syscall.ELIBEXEC\":                                     \"syscall\",\n\t\"syscall.ELIBMAX\":                                      \"syscall\",\n\t\"syscall.ELIBSCN\":                                      \"syscall\",\n\t\"syscall.ELNRNG\":                                       \"syscall\",\n\t\"syscall.ELOOP\":                                        \"syscall\",\n\t\"syscall.EMEDIUMTYPE\":                                  \"syscall\",\n\t\"syscall.EMFILE\":                                       \"syscall\",\n\t\"syscall.EMLINK\":                                       \"syscall\",\n\t\"syscall.EMSGSIZE\":                                     \"syscall\",\n\t\"syscall.EMT_TAGOVF\":                                   \"syscall\",\n\t\"syscall.EMULTIHOP\":                                    \"syscall\",\n\t\"syscall.EMUL_ENABLED\":                                 \"syscall\",\n\t\"syscall.EMUL_LINUX\":                                   \"syscall\",\n\t\"syscall.EMUL_LINUX32\":                                 \"syscall\",\n\t\"syscall.EMUL_MAXID\":                                   \"syscall\",\n\t\"syscall.EMUL_NATIVE\":                                  \"syscall\",\n\t\"syscall.ENAMETOOLONG\":                                 \"syscall\",\n\t\"syscall.ENAVAIL\":                                      \"syscall\",\n\t\"syscall.ENDRUNDISC\":                                   \"syscall\",\n\t\"syscall.ENEEDAUTH\":                                    \"syscall\",\n\t\"syscall.ENETDOWN\":                                     \"syscall\",\n\t\"syscall.ENETRESET\":                                    \"syscall\",\n\t\"syscall.ENETUNREACH\":                                  \"syscall\",\n\t\"syscall.ENFILE\":                                       \"syscall\",\n\t\"syscall.ENOANO\":                                       \"syscall\",\n\t\"syscall.ENOATTR\":                                      \"syscall\",\n\t\"syscall.ENOBUFS\":                                      \"syscall\",\n\t\"syscall.ENOCSI\":                                       \"syscall\",\n\t\"syscall.ENODATA\":                                      \"syscall\",\n\t\"syscall.ENODEV\":                                       \"syscall\",\n\t\"syscall.ENOENT\":                                       \"syscall\",\n\t\"syscall.ENOEXEC\":                                      \"syscall\",\n\t\"syscall.ENOKEY\":                                       \"syscall\",\n\t\"syscall.ENOLCK\":                                       \"syscall\",\n\t\"syscall.ENOLINK\":                                      \"syscall\",\n\t\"syscall.ENOMEDIUM\":                                    \"syscall\",\n\t\"syscall.ENOMEM\":                                       \"syscall\",\n\t\"syscall.ENOMSG\":                                       \"syscall\",\n\t\"syscall.ENONET\":                                       \"syscall\",\n\t\"syscall.ENOPKG\":                                       \"syscall\",\n\t\"syscall.ENOPOLICY\":                                    \"syscall\",\n\t\"syscall.ENOPROTOOPT\":                                  \"syscall\",\n\t\"syscall.ENOSPC\":                                       \"syscall\",\n\t\"syscall.ENOSR\":                                        \"syscall\",\n\t\"syscall.ENOSTR\":                                       \"syscall\",\n\t\"syscall.ENOSYS\":                                       \"syscall\",\n\t\"syscall.ENOTBLK\":                                      \"syscall\",\n\t\"syscall.ENOTCAPABLE\":                                  \"syscall\",\n\t\"syscall.ENOTCONN\":                                     \"syscall\",\n\t\"syscall.ENOTDIR\":                                      \"syscall\",\n\t\"syscall.ENOTEMPTY\":                                    \"syscall\",\n\t\"syscall.ENOTNAM\":                                      \"syscall\",\n\t\"syscall.ENOTRECOVERABLE\":                              \"syscall\",\n\t\"syscall.ENOTSOCK\":                                     \"syscall\",\n\t\"syscall.ENOTSUP\":                                      \"syscall\",\n\t\"syscall.ENOTTY\":                                       \"syscall\",\n\t\"syscall.ENOTUNIQ\":                                     \"syscall\",\n\t\"syscall.ENXIO\":                                        \"syscall\",\n\t\"syscall.EN_SW_CTL_INF\":                                \"syscall\",\n\t\"syscall.EN_SW_CTL_PREC\":                               \"syscall\",\n\t\"syscall.EN_SW_CTL_ROUND\":                              \"syscall\",\n\t\"syscall.EN_SW_DATACHAIN\":                              \"syscall\",\n\t\"syscall.EN_SW_DENORM\":                                 \"syscall\",\n\t\"syscall.EN_SW_INVOP\":                                  \"syscall\",\n\t\"syscall.EN_SW_OVERFLOW\":                               \"syscall\",\n\t\"syscall.EN_SW_PRECLOSS\":                               \"syscall\",\n\t\"syscall.EN_SW_UNDERFLOW\":                              \"syscall\",\n\t\"syscall.EN_SW_ZERODIV\":                                \"syscall\",\n\t\"syscall.EOPNOTSUPP\":                                   \"syscall\",\n\t\"syscall.EOVERFLOW\":                                    \"syscall\",\n\t\"syscall.EOWNERDEAD\":                                   \"syscall\",\n\t\"syscall.EPERM\":                                        \"syscall\",\n\t\"syscall.EPFNOSUPPORT\":                                 \"syscall\",\n\t\"syscall.EPIPE\":                                        \"syscall\",\n\t\"syscall.EPOLLERR\":                                     \"syscall\",\n\t\"syscall.EPOLLET\":                                      \"syscall\",\n\t\"syscall.EPOLLHUP\":                                     \"syscall\",\n\t\"syscall.EPOLLIN\":                                      \"syscall\",\n\t\"syscall.EPOLLMSG\":                                     \"syscall\",\n\t\"syscall.EPOLLONESHOT\":                                 \"syscall\",\n\t\"syscall.EPOLLOUT\":                                     \"syscall\",\n\t\"syscall.EPOLLPRI\":                                     \"syscall\",\n\t\"syscall.EPOLLRDBAND\":                                  \"syscall\",\n\t\"syscall.EPOLLRDHUP\":                                   \"syscall\",\n\t\"syscall.EPOLLRDNORM\":                                  \"syscall\",\n\t\"syscall.EPOLLWRBAND\":                                  \"syscall\",\n\t\"syscall.EPOLLWRNORM\":                                  \"syscall\",\n\t\"syscall.EPOLL_CLOEXEC\":                                \"syscall\",\n\t\"syscall.EPOLL_CTL_ADD\":                                \"syscall\",\n\t\"syscall.EPOLL_CTL_DEL\":                                \"syscall\",\n\t\"syscall.EPOLL_CTL_MOD\":                                \"syscall\",\n\t\"syscall.EPOLL_NONBLOCK\":                               \"syscall\",\n\t\"syscall.EPROCLIM\":                                     \"syscall\",\n\t\"syscall.EPROCUNAVAIL\":                                 \"syscall\",\n\t\"syscall.EPROGMISMATCH\":                                \"syscall\",\n\t\"syscall.EPROGUNAVAIL\":                                 \"syscall\",\n\t\"syscall.EPROTO\":                                       \"syscall\",\n\t\"syscall.EPROTONOSUPPORT\":                              \"syscall\",\n\t\"syscall.EPROTOTYPE\":                                   \"syscall\",\n\t\"syscall.EPWROFF\":                                      \"syscall\",\n\t\"syscall.ERANGE\":                                       \"syscall\",\n\t\"syscall.EREMCHG\":                                      \"syscall\",\n\t\"syscall.EREMOTE\":                                      \"syscall\",\n\t\"syscall.EREMOTEIO\":                                    \"syscall\",\n\t\"syscall.ERESTART\":                                     \"syscall\",\n\t\"syscall.ERFKILL\":                                      \"syscall\",\n\t\"syscall.EROFS\":                                        \"syscall\",\n\t\"syscall.ERPCMISMATCH\":                                 \"syscall\",\n\t\"syscall.ERROR_ACCESS_DENIED\":                          \"syscall\",\n\t\"syscall.ERROR_ALREADY_EXISTS\":                         \"syscall\",\n\t\"syscall.ERROR_BROKEN_PIPE\":                            \"syscall\",\n\t\"syscall.ERROR_BUFFER_OVERFLOW\":                        \"syscall\",\n\t\"syscall.ERROR_ENVVAR_NOT_FOUND\":                       \"syscall\",\n\t\"syscall.ERROR_FILE_EXISTS\":                            \"syscall\",\n\t\"syscall.ERROR_FILE_NOT_FOUND\":                         \"syscall\",\n\t\"syscall.ERROR_HANDLE_EOF\":                             \"syscall\",\n\t\"syscall.ERROR_INSUFFICIENT_BUFFER\":                    \"syscall\",\n\t\"syscall.ERROR_IO_PENDING\":                             \"syscall\",\n\t\"syscall.ERROR_MOD_NOT_FOUND\":                          \"syscall\",\n\t\"syscall.ERROR_MORE_DATA\":                              \"syscall\",\n\t\"syscall.ERROR_NETNAME_DELETED\":                        \"syscall\",\n\t\"syscall.ERROR_NOT_FOUND\":                              \"syscall\",\n\t\"syscall.ERROR_NO_MORE_FILES\":                          \"syscall\",\n\t\"syscall.ERROR_OPERATION_ABORTED\":                      \"syscall\",\n\t\"syscall.ERROR_PATH_NOT_FOUND\":                         \"syscall\",\n\t\"syscall.ERROR_PRIVILEGE_NOT_HELD\":                     \"syscall\",\n\t\"syscall.ERROR_PROC_NOT_FOUND\":                         \"syscall\",\n\t\"syscall.ESHLIBVERS\":                                   \"syscall\",\n\t\"syscall.ESHUTDOWN\":                                    \"syscall\",\n\t\"syscall.ESOCKTNOSUPPORT\":                              \"syscall\",\n\t\"syscall.ESPIPE\":                                       \"syscall\",\n\t\"syscall.ESRCH\":                                        \"syscall\",\n\t\"syscall.ESRMNT\":                                       \"syscall\",\n\t\"syscall.ESTALE\":                                       \"syscall\",\n\t\"syscall.ESTRPIPE\":                                     \"syscall\",\n\t\"syscall.ETHERCAP_JUMBO_MTU\":                           \"syscall\",\n\t\"syscall.ETHERCAP_VLAN_HWTAGGING\":                      \"syscall\",\n\t\"syscall.ETHERCAP_VLAN_MTU\":                            \"syscall\",\n\t\"syscall.ETHERMIN\":                                     \"syscall\",\n\t\"syscall.ETHERMTU\":                                     \"syscall\",\n\t\"syscall.ETHERMTU_JUMBO\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_8023\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_AARP\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_ACCTON\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_AEONIC\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_ALPHA\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_AMBER\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_AMOEBA\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_AOE\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_APOLLO\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_APOLLODOMAIN\":                       \"syscall\",\n\t\"syscall.ETHERTYPE_APPLETALK\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_APPLITEK\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_ARGONAUT\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_ARP\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_AT\":                                 \"syscall\",\n\t\"syscall.ETHERTYPE_ATALK\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_ATOMIC\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_ATT\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_ATTSTANFORD\":                        \"syscall\",\n\t\"syscall.ETHERTYPE_AUTOPHON\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_AXIS\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_BCLOOP\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_BOFL\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_CABLETRON\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_CHAOS\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_COMDESIGN\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_COMPUGRAPHIC\":                       \"syscall\",\n\t\"syscall.ETHERTYPE_COUNTERPOINT\":                       \"syscall\",\n\t\"syscall.ETHERTYPE_CRONUS\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_CRONUSVLN\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_DCA\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_DDE\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_DEBNI\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_DECAM\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_DECCUST\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_DECDIAG\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_DECDNS\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_DECDTS\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_DECEXPER\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_DECLAST\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_DECLTM\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_DECMUMPS\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_DECNETBIOS\":                         \"syscall\",\n\t\"syscall.ETHERTYPE_DELTACON\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_DIDDLE\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_DLOG1\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_DLOG2\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_DN\":                                 \"syscall\",\n\t\"syscall.ETHERTYPE_DOGFIGHT\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_DSMD\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_ECMA\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_ENCRYPT\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_ES\":                                 \"syscall\",\n\t\"syscall.ETHERTYPE_EXCELAN\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_EXPERDATA\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_FLIP\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_FLOWCONTROL\":                        \"syscall\",\n\t\"syscall.ETHERTYPE_FRARP\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_GENDYN\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_HAYES\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_HIPPI_FP\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_HITACHI\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_HP\":                                 \"syscall\",\n\t\"syscall.ETHERTYPE_IEEEPUP\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_IEEEPUPAT\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_IMLBL\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_IMLBLDIAG\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_IP\":                                 \"syscall\",\n\t\"syscall.ETHERTYPE_IPAS\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_IPV6\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_IPX\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_IPXNEW\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_KALPANA\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_LANBRIDGE\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_LANPROBE\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_LAT\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_LBACK\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_LITTLE\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_LLDP\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_LOGICRAFT\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_LOOPBACK\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_MATRA\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_MAX\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_MERIT\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_MICP\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_MOPDL\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_MOPRC\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_MOTOROLA\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_MPLS\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_MPLS_MCAST\":                         \"syscall\",\n\t\"syscall.ETHERTYPE_MUMPS\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_NBPCC\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_NBPCLAIM\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_NBPCLREQ\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_NBPCLRSP\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_NBPCREQ\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_NBPCRSP\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_NBPDG\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_NBPDGB\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NBPDLTE\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_NBPRAR\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NBPRAS\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NBPRST\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NBPSCD\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NBPVCD\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NBS\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_NCD\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_NESTAR\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NETBEUI\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_NOVELL\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_NS\":                                 \"syscall\",\n\t\"syscall.ETHERTYPE_NSAT\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_NSCOMPAT\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_NTRAILER\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_OS9\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_OS9NET\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_PACER\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_PAE\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_PCS\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_PLANNING\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_PPP\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_PPPOE\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_PPPOEDISC\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_PRIMENTS\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_PUP\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_PUPAT\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_QINQ\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_RACAL\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_RATIONAL\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_RAWFR\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_RCL\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_RDP\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_RETIX\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_REVARP\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_SCA\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_SECTRA\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_SECUREDATA\":                         \"syscall\",\n\t\"syscall.ETHERTYPE_SGITW\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_SG_BOUNCE\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_SG_DIAG\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_SG_NETGAMES\":                        \"syscall\",\n\t\"syscall.ETHERTYPE_SG_RESV\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_SIMNET\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_SLOW\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_SLOWPROTOCOLS\":                      \"syscall\",\n\t\"syscall.ETHERTYPE_SNA\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_SNMP\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_SONIX\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_SPIDER\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_SPRITE\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_STP\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_TALARIS\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_TALARISMC\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_TCPCOMP\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_TCPSM\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_TEC\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_TIGAN\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_TRAIL\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_TRANSETHER\":                         \"syscall\",\n\t\"syscall.ETHERTYPE_TYMSHARE\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_UBBST\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_UBDEBUG\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_UBDIAGLOOP\":                         \"syscall\",\n\t\"syscall.ETHERTYPE_UBDL\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_UBNIU\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_UBNMC\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_VALID\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_VARIAN\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_VAXELN\":                             \"syscall\",\n\t\"syscall.ETHERTYPE_VEECO\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_VEXP\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_VGLAB\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_VINES\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_VINESECHO\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_VINESLOOP\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_VITAL\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_VLAN\":                               \"syscall\",\n\t\"syscall.ETHERTYPE_VLTLMAN\":                            \"syscall\",\n\t\"syscall.ETHERTYPE_VPROD\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_VURESERVED\":                         \"syscall\",\n\t\"syscall.ETHERTYPE_WATERLOO\":                           \"syscall\",\n\t\"syscall.ETHERTYPE_WELLFLEET\":                          \"syscall\",\n\t\"syscall.ETHERTYPE_X25\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_X75\":                                \"syscall\",\n\t\"syscall.ETHERTYPE_XNSSM\":                              \"syscall\",\n\t\"syscall.ETHERTYPE_XTP\":                                \"syscall\",\n\t\"syscall.ETHER_ADDR_LEN\":                               \"syscall\",\n\t\"syscall.ETHER_ALIGN\":                                  \"syscall\",\n\t\"syscall.ETHER_CRC_LEN\":                                \"syscall\",\n\t\"syscall.ETHER_CRC_POLY_BE\":                            \"syscall\",\n\t\"syscall.ETHER_CRC_POLY_LE\":                            \"syscall\",\n\t\"syscall.ETHER_HDR_LEN\":                                \"syscall\",\n\t\"syscall.ETHER_MAX_DIX_LEN\":                            \"syscall\",\n\t\"syscall.ETHER_MAX_LEN\":                                \"syscall\",\n\t\"syscall.ETHER_MAX_LEN_JUMBO\":                          \"syscall\",\n\t\"syscall.ETHER_MIN_LEN\":                                \"syscall\",\n\t\"syscall.ETHER_PPPOE_ENCAP_LEN\":                        \"syscall\",\n\t\"syscall.ETHER_TYPE_LEN\":                               \"syscall\",\n\t\"syscall.ETHER_VLAN_ENCAP_LEN\":                         \"syscall\",\n\t\"syscall.ETH_P_1588\":                                   \"syscall\",\n\t\"syscall.ETH_P_8021Q\":                                  \"syscall\",\n\t\"syscall.ETH_P_802_2\":                                  \"syscall\",\n\t\"syscall.ETH_P_802_3\":                                  \"syscall\",\n\t\"syscall.ETH_P_AARP\":                                   \"syscall\",\n\t\"syscall.ETH_P_ALL\":                                    \"syscall\",\n\t\"syscall.ETH_P_AOE\":                                    \"syscall\",\n\t\"syscall.ETH_P_ARCNET\":                                 \"syscall\",\n\t\"syscall.ETH_P_ARP\":                                    \"syscall\",\n\t\"syscall.ETH_P_ATALK\":                                  \"syscall\",\n\t\"syscall.ETH_P_ATMFATE\":                                \"syscall\",\n\t\"syscall.ETH_P_ATMMPOA\":                                \"syscall\",\n\t\"syscall.ETH_P_AX25\":                                   \"syscall\",\n\t\"syscall.ETH_P_BPQ\":                                    \"syscall\",\n\t\"syscall.ETH_P_CAIF\":                                   \"syscall\",\n\t\"syscall.ETH_P_CAN\":                                    \"syscall\",\n\t\"syscall.ETH_P_CONTROL\":                                \"syscall\",\n\t\"syscall.ETH_P_CUST\":                                   \"syscall\",\n\t\"syscall.ETH_P_DDCMP\":                                  \"syscall\",\n\t\"syscall.ETH_P_DEC\":                                    \"syscall\",\n\t\"syscall.ETH_P_DIAG\":                                   \"syscall\",\n\t\"syscall.ETH_P_DNA_DL\":                                 \"syscall\",\n\t\"syscall.ETH_P_DNA_RC\":                                 \"syscall\",\n\t\"syscall.ETH_P_DNA_RT\":                                 \"syscall\",\n\t\"syscall.ETH_P_DSA\":                                    \"syscall\",\n\t\"syscall.ETH_P_ECONET\":                                 \"syscall\",\n\t\"syscall.ETH_P_EDSA\":                                   \"syscall\",\n\t\"syscall.ETH_P_FCOE\":                                   \"syscall\",\n\t\"syscall.ETH_P_FIP\":                                    \"syscall\",\n\t\"syscall.ETH_P_HDLC\":                                   \"syscall\",\n\t\"syscall.ETH_P_IEEE802154\":                             \"syscall\",\n\t\"syscall.ETH_P_IEEEPUP\":                                \"syscall\",\n\t\"syscall.ETH_P_IEEEPUPAT\":                              \"syscall\",\n\t\"syscall.ETH_P_IP\":                                     \"syscall\",\n\t\"syscall.ETH_P_IPV6\":                                   \"syscall\",\n\t\"syscall.ETH_P_IPX\":                                    \"syscall\",\n\t\"syscall.ETH_P_IRDA\":                                   \"syscall\",\n\t\"syscall.ETH_P_LAT\":                                    \"syscall\",\n\t\"syscall.ETH_P_LINK_CTL\":                               \"syscall\",\n\t\"syscall.ETH_P_LOCALTALK\":                              \"syscall\",\n\t\"syscall.ETH_P_LOOP\":                                   \"syscall\",\n\t\"syscall.ETH_P_MOBITEX\":                                \"syscall\",\n\t\"syscall.ETH_P_MPLS_MC\":                                \"syscall\",\n\t\"syscall.ETH_P_MPLS_UC\":                                \"syscall\",\n\t\"syscall.ETH_P_PAE\":                                    \"syscall\",\n\t\"syscall.ETH_P_PAUSE\":                                  \"syscall\",\n\t\"syscall.ETH_P_PHONET\":                                 \"syscall\",\n\t\"syscall.ETH_P_PPPTALK\":                                \"syscall\",\n\t\"syscall.ETH_P_PPP_DISC\":                               \"syscall\",\n\t\"syscall.ETH_P_PPP_MP\":                                 \"syscall\",\n\t\"syscall.ETH_P_PPP_SES\":                                \"syscall\",\n\t\"syscall.ETH_P_PUP\":                                    \"syscall\",\n\t\"syscall.ETH_P_PUPAT\":                                  \"syscall\",\n\t\"syscall.ETH_P_RARP\":                                   \"syscall\",\n\t\"syscall.ETH_P_SCA\":                                    \"syscall\",\n\t\"syscall.ETH_P_SLOW\":                                   \"syscall\",\n\t\"syscall.ETH_P_SNAP\":                                   \"syscall\",\n\t\"syscall.ETH_P_TEB\":                                    \"syscall\",\n\t\"syscall.ETH_P_TIPC\":                                   \"syscall\",\n\t\"syscall.ETH_P_TRAILER\":                                \"syscall\",\n\t\"syscall.ETH_P_TR_802_2\":                               \"syscall\",\n\t\"syscall.ETH_P_WAN_PPP\":                                \"syscall\",\n\t\"syscall.ETH_P_WCCP\":                                   \"syscall\",\n\t\"syscall.ETH_P_X25\":                                    \"syscall\",\n\t\"syscall.ETIME\":                                        \"syscall\",\n\t\"syscall.ETIMEDOUT\":                                    \"syscall\",\n\t\"syscall.ETOOMANYREFS\":                                 \"syscall\",\n\t\"syscall.ETXTBSY\":                                      \"syscall\",\n\t\"syscall.EUCLEAN\":                                      \"syscall\",\n\t\"syscall.EUNATCH\":                                      \"syscall\",\n\t\"syscall.EUSERS\":                                       \"syscall\",\n\t\"syscall.EVFILT_AIO\":                                   \"syscall\",\n\t\"syscall.EVFILT_FS\":                                    \"syscall\",\n\t\"syscall.EVFILT_LIO\":                                   \"syscall\",\n\t\"syscall.EVFILT_MACHPORT\":                              \"syscall\",\n\t\"syscall.EVFILT_PROC\":                                  \"syscall\",\n\t\"syscall.EVFILT_READ\":                                  \"syscall\",\n\t\"syscall.EVFILT_SIGNAL\":                                \"syscall\",\n\t\"syscall.EVFILT_SYSCOUNT\":                              \"syscall\",\n\t\"syscall.EVFILT_THREADMARKER\":                          \"syscall\",\n\t\"syscall.EVFILT_TIMER\":                                 \"syscall\",\n\t\"syscall.EVFILT_USER\":                                  \"syscall\",\n\t\"syscall.EVFILT_VM\":                                    \"syscall\",\n\t\"syscall.EVFILT_VNODE\":                                 \"syscall\",\n\t\"syscall.EVFILT_WRITE\":                                 \"syscall\",\n\t\"syscall.EV_ADD\":                                       \"syscall\",\n\t\"syscall.EV_CLEAR\":                                     \"syscall\",\n\t\"syscall.EV_DELETE\":                                    \"syscall\",\n\t\"syscall.EV_DISABLE\":                                   \"syscall\",\n\t\"syscall.EV_DISPATCH\":                                  \"syscall\",\n\t\"syscall.EV_DROP\":                                      \"syscall\",\n\t\"syscall.EV_ENABLE\":                                    \"syscall\",\n\t\"syscall.EV_EOF\":                                       \"syscall\",\n\t\"syscall.EV_ERROR\":                                     \"syscall\",\n\t\"syscall.EV_FLAG0\":                                     \"syscall\",\n\t\"syscall.EV_FLAG1\":                                     \"syscall\",\n\t\"syscall.EV_ONESHOT\":                                   \"syscall\",\n\t\"syscall.EV_OOBAND\":                                    \"syscall\",\n\t\"syscall.EV_POLL\":                                      \"syscall\",\n\t\"syscall.EV_RECEIPT\":                                   \"syscall\",\n\t\"syscall.EV_SYSFLAGS\":                                  \"syscall\",\n\t\"syscall.EWINDOWS\":                                     \"syscall\",\n\t\"syscall.EWOULDBLOCK\":                                  \"syscall\",\n\t\"syscall.EXDEV\":                                        \"syscall\",\n\t\"syscall.EXFULL\":                                       \"syscall\",\n\t\"syscall.EXTA\":                                         \"syscall\",\n\t\"syscall.EXTB\":                                         \"syscall\",\n\t\"syscall.EXTPROC\":                                      \"syscall\",\n\t\"syscall.Environ\":                                      \"syscall\",\n\t\"syscall.EpollCreate\":                                  \"syscall\",\n\t\"syscall.EpollCreate1\":                                 \"syscall\",\n\t\"syscall.EpollCtl\":                                     \"syscall\",\n\t\"syscall.EpollEvent\":                                   \"syscall\",\n\t\"syscall.EpollWait\":                                    \"syscall\",\n\t\"syscall.Errno\":                                        \"syscall\",\n\t\"syscall.EscapeArg\":                                    \"syscall\",\n\t\"syscall.Exchangedata\":                                 \"syscall\",\n\t\"syscall.Exec\":                                         \"syscall\",\n\t\"syscall.Exit\":                                         \"syscall\",\n\t\"syscall.ExitProcess\":                                  \"syscall\",\n\t\"syscall.FD_CLOEXEC\":                                   \"syscall\",\n\t\"syscall.FD_SETSIZE\":                                   \"syscall\",\n\t\"syscall.FILE_ACTION_ADDED\":                            \"syscall\",\n\t\"syscall.FILE_ACTION_MODIFIED\":                         \"syscall\",\n\t\"syscall.FILE_ACTION_REMOVED\":                          \"syscall\",\n\t\"syscall.FILE_ACTION_RENAMED_NEW_NAME\":                 \"syscall\",\n\t\"syscall.FILE_ACTION_RENAMED_OLD_NAME\":                 \"syscall\",\n\t\"syscall.FILE_APPEND_DATA\":                             \"syscall\",\n\t\"syscall.FILE_ATTRIBUTE_ARCHIVE\":                       \"syscall\",\n\t\"syscall.FILE_ATTRIBUTE_DIRECTORY\":                     \"syscall\",\n\t\"syscall.FILE_ATTRIBUTE_HIDDEN\":                        \"syscall\",\n\t\"syscall.FILE_ATTRIBUTE_NORMAL\":                        \"syscall\",\n\t\"syscall.FILE_ATTRIBUTE_READONLY\":                      \"syscall\",\n\t\"syscall.FILE_ATTRIBUTE_REPARSE_POINT\":                 \"syscall\",\n\t\"syscall.FILE_ATTRIBUTE_SYSTEM\":                        \"syscall\",\n\t\"syscall.FILE_BEGIN\":                                   \"syscall\",\n\t\"syscall.FILE_CURRENT\":                                 \"syscall\",\n\t\"syscall.FILE_END\":                                     \"syscall\",\n\t\"syscall.FILE_FLAG_BACKUP_SEMANTICS\":                   \"syscall\",\n\t\"syscall.FILE_FLAG_OPEN_REPARSE_POINT\":                 \"syscall\",\n\t\"syscall.FILE_FLAG_OVERLAPPED\":                         \"syscall\",\n\t\"syscall.FILE_LIST_DIRECTORY\":                          \"syscall\",\n\t\"syscall.FILE_MAP_COPY\":                                \"syscall\",\n\t\"syscall.FILE_MAP_EXECUTE\":                             \"syscall\",\n\t\"syscall.FILE_MAP_READ\":                                \"syscall\",\n\t\"syscall.FILE_MAP_WRITE\":                               \"syscall\",\n\t\"syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES\":                \"syscall\",\n\t\"syscall.FILE_NOTIFY_CHANGE_CREATION\":                  \"syscall\",\n\t\"syscall.FILE_NOTIFY_CHANGE_DIR_NAME\":                  \"syscall\",\n\t\"syscall.FILE_NOTIFY_CHANGE_FILE_NAME\":                 \"syscall\",\n\t\"syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS\":               \"syscall\",\n\t\"syscall.FILE_NOTIFY_CHANGE_LAST_WRITE\":                \"syscall\",\n\t\"syscall.FILE_NOTIFY_CHANGE_SIZE\":                      \"syscall\",\n\t\"syscall.FILE_SHARE_DELETE\":                            \"syscall\",\n\t\"syscall.FILE_SHARE_READ\":                              \"syscall\",\n\t\"syscall.FILE_SHARE_WRITE\":                             \"syscall\",\n\t\"syscall.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS\":         \"syscall\",\n\t\"syscall.FILE_SKIP_SET_EVENT_ON_HANDLE\":                \"syscall\",\n\t\"syscall.FILE_TYPE_CHAR\":                               \"syscall\",\n\t\"syscall.FILE_TYPE_DISK\":                               \"syscall\",\n\t\"syscall.FILE_TYPE_PIPE\":                               \"syscall\",\n\t\"syscall.FILE_TYPE_REMOTE\":                             \"syscall\",\n\t\"syscall.FILE_TYPE_UNKNOWN\":                            \"syscall\",\n\t\"syscall.FILE_WRITE_ATTRIBUTES\":                        \"syscall\",\n\t\"syscall.FLUSHO\":                                       \"syscall\",\n\t\"syscall.FORMAT_MESSAGE_ALLOCATE_BUFFER\":               \"syscall\",\n\t\"syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY\":                \"syscall\",\n\t\"syscall.FORMAT_MESSAGE_FROM_HMODULE\":                  \"syscall\",\n\t\"syscall.FORMAT_MESSAGE_FROM_STRING\":                   \"syscall\",\n\t\"syscall.FORMAT_MESSAGE_FROM_SYSTEM\":                   \"syscall\",\n\t\"syscall.FORMAT_MESSAGE_IGNORE_INSERTS\":                \"syscall\",\n\t\"syscall.FORMAT_MESSAGE_MAX_WIDTH_MASK\":                \"syscall\",\n\t\"syscall.FSCTL_GET_REPARSE_POINT\":                      \"syscall\",\n\t\"syscall.F_ADDFILESIGS\":                                \"syscall\",\n\t\"syscall.F_ADDSIGS\":                                    \"syscall\",\n\t\"syscall.F_ALLOCATEALL\":                                \"syscall\",\n\t\"syscall.F_ALLOCATECONTIG\":                             \"syscall\",\n\t\"syscall.F_CANCEL\":                                     \"syscall\",\n\t\"syscall.F_CHKCLEAN\":                                   \"syscall\",\n\t\"syscall.F_CLOSEM\":                                     \"syscall\",\n\t\"syscall.F_DUP2FD\":                                     \"syscall\",\n\t\"syscall.F_DUP2FD_CLOEXEC\":                             \"syscall\",\n\t\"syscall.F_DUPFD\":                                      \"syscall\",\n\t\"syscall.F_DUPFD_CLOEXEC\":                              \"syscall\",\n\t\"syscall.F_EXLCK\":                                      \"syscall\",\n\t\"syscall.F_FLUSH_DATA\":                                 \"syscall\",\n\t\"syscall.F_FREEZE_FS\":                                  \"syscall\",\n\t\"syscall.F_FSCTL\":                                      \"syscall\",\n\t\"syscall.F_FSDIRMASK\":                                  \"syscall\",\n\t\"syscall.F_FSIN\":                                       \"syscall\",\n\t\"syscall.F_FSINOUT\":                                    \"syscall\",\n\t\"syscall.F_FSOUT\":                                      \"syscall\",\n\t\"syscall.F_FSPRIV\":                                     \"syscall\",\n\t\"syscall.F_FSVOID\":                                     \"syscall\",\n\t\"syscall.F_FULLFSYNC\":                                  \"syscall\",\n\t\"syscall.F_GETFD\":                                      \"syscall\",\n\t\"syscall.F_GETFL\":                                      \"syscall\",\n\t\"syscall.F_GETLEASE\":                                   \"syscall\",\n\t\"syscall.F_GETLK\":                                      \"syscall\",\n\t\"syscall.F_GETLK64\":                                    \"syscall\",\n\t\"syscall.F_GETLKPID\":                                   \"syscall\",\n\t\"syscall.F_GETNOSIGPIPE\":                               \"syscall\",\n\t\"syscall.F_GETOWN\":                                     \"syscall\",\n\t\"syscall.F_GETOWN_EX\":                                  \"syscall\",\n\t\"syscall.F_GETPATH\":                                    \"syscall\",\n\t\"syscall.F_GETPATH_MTMINFO\":                            \"syscall\",\n\t\"syscall.F_GETPIPE_SZ\":                                 \"syscall\",\n\t\"syscall.F_GETPROTECTIONCLASS\":                         \"syscall\",\n\t\"syscall.F_GETSIG\":                                     \"syscall\",\n\t\"syscall.F_GLOBAL_NOCACHE\":                             \"syscall\",\n\t\"syscall.F_LOCK\":                                       \"syscall\",\n\t\"syscall.F_LOG2PHYS\":                                   \"syscall\",\n\t\"syscall.F_LOG2PHYS_EXT\":                               \"syscall\",\n\t\"syscall.F_MARKDEPENDENCY\":                             \"syscall\",\n\t\"syscall.F_MAXFD\":                                      \"syscall\",\n\t\"syscall.F_NOCACHE\":                                    \"syscall\",\n\t\"syscall.F_NODIRECT\":                                   \"syscall\",\n\t\"syscall.F_NOTIFY\":                                     \"syscall\",\n\t\"syscall.F_OGETLK\":                                     \"syscall\",\n\t\"syscall.F_OK\":                                         \"syscall\",\n\t\"syscall.F_OSETLK\":                                     \"syscall\",\n\t\"syscall.F_OSETLKW\":                                    \"syscall\",\n\t\"syscall.F_PARAM_MASK\":                                 \"syscall\",\n\t\"syscall.F_PARAM_MAX\":                                  \"syscall\",\n\t\"syscall.F_PATHPKG_CHECK\":                              \"syscall\",\n\t\"syscall.F_PEOFPOSMODE\":                                \"syscall\",\n\t\"syscall.F_PREALLOCATE\":                                \"syscall\",\n\t\"syscall.F_RDADVISE\":                                   \"syscall\",\n\t\"syscall.F_RDAHEAD\":                                    \"syscall\",\n\t\"syscall.F_RDLCK\":                                      \"syscall\",\n\t\"syscall.F_READAHEAD\":                                  \"syscall\",\n\t\"syscall.F_READBOOTSTRAP\":                              \"syscall\",\n\t\"syscall.F_SETBACKINGSTORE\":                            \"syscall\",\n\t\"syscall.F_SETFD\":                                      \"syscall\",\n\t\"syscall.F_SETFL\":                                      \"syscall\",\n\t\"syscall.F_SETLEASE\":                                   \"syscall\",\n\t\"syscall.F_SETLK\":                                      \"syscall\",\n\t\"syscall.F_SETLK64\":                                    \"syscall\",\n\t\"syscall.F_SETLKW\":                                     \"syscall\",\n\t\"syscall.F_SETLKW64\":                                   \"syscall\",\n\t\"syscall.F_SETLK_REMOTE\":                               \"syscall\",\n\t\"syscall.F_SETNOSIGPIPE\":                               \"syscall\",\n\t\"syscall.F_SETOWN\":                                     \"syscall\",\n\t\"syscall.F_SETOWN_EX\":                                  \"syscall\",\n\t\"syscall.F_SETPIPE_SZ\":                                 \"syscall\",\n\t\"syscall.F_SETPROTECTIONCLASS\":                         \"syscall\",\n\t\"syscall.F_SETSIG\":                                     \"syscall\",\n\t\"syscall.F_SETSIZE\":                                    \"syscall\",\n\t\"syscall.F_SHLCK\":                                      \"syscall\",\n\t\"syscall.F_TEST\":                                       \"syscall\",\n\t\"syscall.F_THAW_FS\":                                    \"syscall\",\n\t\"syscall.F_TLOCK\":                                      \"syscall\",\n\t\"syscall.F_ULOCK\":                                      \"syscall\",\n\t\"syscall.F_UNLCK\":                                      \"syscall\",\n\t\"syscall.F_UNLCKSYS\":                                   \"syscall\",\n\t\"syscall.F_VOLPOSMODE\":                                 \"syscall\",\n\t\"syscall.F_WRITEBOOTSTRAP\":                             \"syscall\",\n\t\"syscall.F_WRLCK\":                                      \"syscall\",\n\t\"syscall.Faccessat\":                                    \"syscall\",\n\t\"syscall.Fallocate\":                                    \"syscall\",\n\t\"syscall.Fbootstraptransfer_t\":                         \"syscall\",\n\t\"syscall.Fchdir\":                                       \"syscall\",\n\t\"syscall.Fchflags\":                                     \"syscall\",\n\t\"syscall.Fchmod\":                                       \"syscall\",\n\t\"syscall.Fchmodat\":                                     \"syscall\",\n\t\"syscall.Fchown\":                                       \"syscall\",\n\t\"syscall.Fchownat\":                                     \"syscall\",\n\t\"syscall.FcntlFlock\":                                   \"syscall\",\n\t\"syscall.FdSet\":                                        \"syscall\",\n\t\"syscall.Fdatasync\":                                    \"syscall\",\n\t\"syscall.FileNotifyInformation\":                        \"syscall\",\n\t\"syscall.Filetime\":                                     \"syscall\",\n\t\"syscall.FindClose\":                                    \"syscall\",\n\t\"syscall.FindFirstFile\":                                \"syscall\",\n\t\"syscall.FindNextFile\":                                 \"syscall\",\n\t\"syscall.Flock\":                                        \"syscall\",\n\t\"syscall.Flock_t\":                                      \"syscall\",\n\t\"syscall.FlushBpf\":                                     \"syscall\",\n\t\"syscall.FlushFileBuffers\":                             \"syscall\",\n\t\"syscall.FlushViewOfFile\":                              \"syscall\",\n\t\"syscall.ForkExec\":                                     \"syscall\",\n\t\"syscall.ForkLock\":                                     \"syscall\",\n\t\"syscall.FormatMessage\":                                \"syscall\",\n\t\"syscall.Fpathconf\":                                    \"syscall\",\n\t\"syscall.FreeAddrInfoW\":                                \"syscall\",\n\t\"syscall.FreeEnvironmentStrings\":                       \"syscall\",\n\t\"syscall.FreeLibrary\":                                  \"syscall\",\n\t\"syscall.Fsid\":                                         \"syscall\",\n\t\"syscall.Fstat\":                                        \"syscall\",\n\t\"syscall.Fstatfs\":                                      \"syscall\",\n\t\"syscall.Fstore_t\":                                     \"syscall\",\n\t\"syscall.Fsync\":                                        \"syscall\",\n\t\"syscall.Ftruncate\":                                    \"syscall\",\n\t\"syscall.FullPath\":                                     \"syscall\",\n\t\"syscall.Futimes\":                                      \"syscall\",\n\t\"syscall.Futimesat\":                                    \"syscall\",\n\t\"syscall.GENERIC_ALL\":                                  \"syscall\",\n\t\"syscall.GENERIC_EXECUTE\":                              \"syscall\",\n\t\"syscall.GENERIC_READ\":                                 \"syscall\",\n\t\"syscall.GENERIC_WRITE\":                                \"syscall\",\n\t\"syscall.GUID\":                                         \"syscall\",\n\t\"syscall.GetAcceptExSockaddrs\":                         \"syscall\",\n\t\"syscall.GetAdaptersInfo\":                              \"syscall\",\n\t\"syscall.GetAddrInfoW\":                                 \"syscall\",\n\t\"syscall.GetCommandLine\":                               \"syscall\",\n\t\"syscall.GetComputerName\":                              \"syscall\",\n\t\"syscall.GetConsoleMode\":                               \"syscall\",\n\t\"syscall.GetCurrentDirectory\":                          \"syscall\",\n\t\"syscall.GetCurrentProcess\":                            \"syscall\",\n\t\"syscall.GetEnvironmentStrings\":                        \"syscall\",\n\t\"syscall.GetEnvironmentVariable\":                       \"syscall\",\n\t\"syscall.GetExitCodeProcess\":                           \"syscall\",\n\t\"syscall.GetFileAttributes\":                            \"syscall\",\n\t\"syscall.GetFileAttributesEx\":                          \"syscall\",\n\t\"syscall.GetFileExInfoStandard\":                        \"syscall\",\n\t\"syscall.GetFileExMaxInfoLevel\":                        \"syscall\",\n\t\"syscall.GetFileInformationByHandle\":                   \"syscall\",\n\t\"syscall.GetFileType\":                                  \"syscall\",\n\t\"syscall.GetFullPathName\":                              \"syscall\",\n\t\"syscall.GetHostByName\":                                \"syscall\",\n\t\"syscall.GetIfEntry\":                                   \"syscall\",\n\t\"syscall.GetLastError\":                                 \"syscall\",\n\t\"syscall.GetLengthSid\":                                 \"syscall\",\n\t\"syscall.GetLongPathName\":                              \"syscall\",\n\t\"syscall.GetProcAddress\":                               \"syscall\",\n\t\"syscall.GetProcessTimes\":                              \"syscall\",\n\t\"syscall.GetProtoByName\":                               \"syscall\",\n\t\"syscall.GetQueuedCompletionStatus\":                    \"syscall\",\n\t\"syscall.GetServByName\":                                \"syscall\",\n\t\"syscall.GetShortPathName\":                             \"syscall\",\n\t\"syscall.GetStartupInfo\":                               \"syscall\",\n\t\"syscall.GetStdHandle\":                                 \"syscall\",\n\t\"syscall.GetSystemTimeAsFileTime\":                      \"syscall\",\n\t\"syscall.GetTempPath\":                                  \"syscall\",\n\t\"syscall.GetTimeZoneInformation\":                       \"syscall\",\n\t\"syscall.GetTokenInformation\":                          \"syscall\",\n\t\"syscall.GetUserNameEx\":                                \"syscall\",\n\t\"syscall.GetUserProfileDirectory\":                      \"syscall\",\n\t\"syscall.GetVersion\":                                   \"syscall\",\n\t\"syscall.Getcwd\":                                       \"syscall\",\n\t\"syscall.Getdents\":                                     \"syscall\",\n\t\"syscall.Getdirentries\":                                \"syscall\",\n\t\"syscall.Getdtablesize\":                                \"syscall\",\n\t\"syscall.Getegid\":                                      \"syscall\",\n\t\"syscall.Getenv\":                                       \"syscall\",\n\t\"syscall.Geteuid\":                                      \"syscall\",\n\t\"syscall.Getfsstat\":                                    \"syscall\",\n\t\"syscall.Getgid\":                                       \"syscall\",\n\t\"syscall.Getgroups\":                                    \"syscall\",\n\t\"syscall.Getpagesize\":                                  \"syscall\",\n\t\"syscall.Getpeername\":                                  \"syscall\",\n\t\"syscall.Getpgid\":                                      \"syscall\",\n\t\"syscall.Getpgrp\":                                      \"syscall\",\n\t\"syscall.Getpid\":                                       \"syscall\",\n\t\"syscall.Getppid\":                                      \"syscall\",\n\t\"syscall.Getpriority\":                                  \"syscall\",\n\t\"syscall.Getrlimit\":                                    \"syscall\",\n\t\"syscall.Getrusage\":                                    \"syscall\",\n\t\"syscall.Getsid\":                                       \"syscall\",\n\t\"syscall.Getsockname\":                                  \"syscall\",\n\t\"syscall.Getsockopt\":                                   \"syscall\",\n\t\"syscall.GetsockoptByte\":                               \"syscall\",\n\t\"syscall.GetsockoptICMPv6Filter\":                       \"syscall\",\n\t\"syscall.GetsockoptIPMreq\":                             \"syscall\",\n\t\"syscall.GetsockoptIPMreqn\":                            \"syscall\",\n\t\"syscall.GetsockoptIPv6MTUInfo\":                        \"syscall\",\n\t\"syscall.GetsockoptIPv6Mreq\":                           \"syscall\",\n\t\"syscall.GetsockoptInet4Addr\":                          \"syscall\",\n\t\"syscall.GetsockoptInt\":                                \"syscall\",\n\t\"syscall.GetsockoptUcred\":                              \"syscall\",\n\t\"syscall.Gettid\":                                       \"syscall\",\n\t\"syscall.Gettimeofday\":                                 \"syscall\",\n\t\"syscall.Getuid\":                                       \"syscall\",\n\t\"syscall.Getwd\":                                        \"syscall\",\n\t\"syscall.Getxattr\":                                     \"syscall\",\n\t\"syscall.HANDLE_FLAG_INHERIT\":                          \"syscall\",\n\t\"syscall.HKEY_CLASSES_ROOT\":                            \"syscall\",\n\t\"syscall.HKEY_CURRENT_CONFIG\":                          \"syscall\",\n\t\"syscall.HKEY_CURRENT_USER\":                            \"syscall\",\n\t\"syscall.HKEY_DYN_DATA\":                                \"syscall\",\n\t\"syscall.HKEY_LOCAL_MACHINE\":                           \"syscall\",\n\t\"syscall.HKEY_PERFORMANCE_DATA\":                        \"syscall\",\n\t\"syscall.HKEY_USERS\":                                   \"syscall\",\n\t\"syscall.HUPCL\":                                        \"syscall\",\n\t\"syscall.Handle\":                                       \"syscall\",\n\t\"syscall.Hostent\":                                      \"syscall\",\n\t\"syscall.ICANON\":                                       \"syscall\",\n\t\"syscall.ICMP6_FILTER\":                                 \"syscall\",\n\t\"syscall.ICMPV6_FILTER\":                                \"syscall\",\n\t\"syscall.ICMPv6Filter\":                                 \"syscall\",\n\t\"syscall.ICRNL\":                                        \"syscall\",\n\t\"syscall.IEXTEN\":                                       \"syscall\",\n\t\"syscall.IFAN_ARRIVAL\":                                 \"syscall\",\n\t\"syscall.IFAN_DEPARTURE\":                               \"syscall\",\n\t\"syscall.IFA_ADDRESS\":                                  \"syscall\",\n\t\"syscall.IFA_ANYCAST\":                                  \"syscall\",\n\t\"syscall.IFA_BROADCAST\":                                \"syscall\",\n\t\"syscall.IFA_CACHEINFO\":                                \"syscall\",\n\t\"syscall.IFA_F_DADFAILED\":                              \"syscall\",\n\t\"syscall.IFA_F_DEPRECATED\":                             \"syscall\",\n\t\"syscall.IFA_F_HOMEADDRESS\":                            \"syscall\",\n\t\"syscall.IFA_F_NODAD\":                                  \"syscall\",\n\t\"syscall.IFA_F_OPTIMISTIC\":                             \"syscall\",\n\t\"syscall.IFA_F_PERMANENT\":                              \"syscall\",\n\t\"syscall.IFA_F_SECONDARY\":                              \"syscall\",\n\t\"syscall.IFA_F_TEMPORARY\":                              \"syscall\",\n\t\"syscall.IFA_F_TENTATIVE\":                              \"syscall\",\n\t\"syscall.IFA_LABEL\":                                    \"syscall\",\n\t\"syscall.IFA_LOCAL\":                                    \"syscall\",\n\t\"syscall.IFA_MAX\":                                      \"syscall\",\n\t\"syscall.IFA_MULTICAST\":                                \"syscall\",\n\t\"syscall.IFA_ROUTE\":                                    \"syscall\",\n\t\"syscall.IFA_UNSPEC\":                                   \"syscall\",\n\t\"syscall.IFF_ALLMULTI\":                                 \"syscall\",\n\t\"syscall.IFF_ALTPHYS\":                                  \"syscall\",\n\t\"syscall.IFF_AUTOMEDIA\":                                \"syscall\",\n\t\"syscall.IFF_BROADCAST\":                                \"syscall\",\n\t\"syscall.IFF_CANTCHANGE\":                               \"syscall\",\n\t\"syscall.IFF_CANTCONFIG\":                               \"syscall\",\n\t\"syscall.IFF_DEBUG\":                                    \"syscall\",\n\t\"syscall.IFF_DRV_OACTIVE\":                              \"syscall\",\n\t\"syscall.IFF_DRV_RUNNING\":                              \"syscall\",\n\t\"syscall.IFF_DYING\":                                    \"syscall\",\n\t\"syscall.IFF_DYNAMIC\":                                  \"syscall\",\n\t\"syscall.IFF_LINK0\":                                    \"syscall\",\n\t\"syscall.IFF_LINK1\":                                    \"syscall\",\n\t\"syscall.IFF_LINK2\":                                    \"syscall\",\n\t\"syscall.IFF_LOOPBACK\":                                 \"syscall\",\n\t\"syscall.IFF_MASTER\":                                   \"syscall\",\n\t\"syscall.IFF_MONITOR\":                                  \"syscall\",\n\t\"syscall.IFF_MULTICAST\":                                \"syscall\",\n\t\"syscall.IFF_NOARP\":                                    \"syscall\",\n\t\"syscall.IFF_NOTRAILERS\":                               \"syscall\",\n\t\"syscall.IFF_NO_PI\":                                    \"syscall\",\n\t\"syscall.IFF_OACTIVE\":                                  \"syscall\",\n\t\"syscall.IFF_ONE_QUEUE\":                                \"syscall\",\n\t\"syscall.IFF_POINTOPOINT\":                              \"syscall\",\n\t\"syscall.IFF_POINTTOPOINT\":                             \"syscall\",\n\t\"syscall.IFF_PORTSEL\":                                  \"syscall\",\n\t\"syscall.IFF_PPROMISC\":                                 \"syscall\",\n\t\"syscall.IFF_PROMISC\":                                  \"syscall\",\n\t\"syscall.IFF_RENAMING\":                                 \"syscall\",\n\t\"syscall.IFF_RUNNING\":                                  \"syscall\",\n\t\"syscall.IFF_SIMPLEX\":                                  \"syscall\",\n\t\"syscall.IFF_SLAVE\":                                    \"syscall\",\n\t\"syscall.IFF_SMART\":                                    \"syscall\",\n\t\"syscall.IFF_STATICARP\":                                \"syscall\",\n\t\"syscall.IFF_TAP\":                                      \"syscall\",\n\t\"syscall.IFF_TUN\":                                      \"syscall\",\n\t\"syscall.IFF_TUN_EXCL\":                                 \"syscall\",\n\t\"syscall.IFF_UP\":                                       \"syscall\",\n\t\"syscall.IFF_VNET_HDR\":                                 \"syscall\",\n\t\"syscall.IFLA_ADDRESS\":                                 \"syscall\",\n\t\"syscall.IFLA_BROADCAST\":                               \"syscall\",\n\t\"syscall.IFLA_COST\":                                    \"syscall\",\n\t\"syscall.IFLA_IFALIAS\":                                 \"syscall\",\n\t\"syscall.IFLA_IFNAME\":                                  \"syscall\",\n\t\"syscall.IFLA_LINK\":                                    \"syscall\",\n\t\"syscall.IFLA_LINKINFO\":                                \"syscall\",\n\t\"syscall.IFLA_LINKMODE\":                                \"syscall\",\n\t\"syscall.IFLA_MAP\":                                     \"syscall\",\n\t\"syscall.IFLA_MASTER\":                                  \"syscall\",\n\t\"syscall.IFLA_MAX\":                                     \"syscall\",\n\t\"syscall.IFLA_MTU\":                                     \"syscall\",\n\t\"syscall.IFLA_NET_NS_PID\":                              \"syscall\",\n\t\"syscall.IFLA_OPERSTATE\":                               \"syscall\",\n\t\"syscall.IFLA_PRIORITY\":                                \"syscall\",\n\t\"syscall.IFLA_PROTINFO\":                                \"syscall\",\n\t\"syscall.IFLA_QDISC\":                                   \"syscall\",\n\t\"syscall.IFLA_STATS\":                                   \"syscall\",\n\t\"syscall.IFLA_TXQLEN\":                                  \"syscall\",\n\t\"syscall.IFLA_UNSPEC\":                                  \"syscall\",\n\t\"syscall.IFLA_WEIGHT\":                                  \"syscall\",\n\t\"syscall.IFLA_WIRELESS\":                                \"syscall\",\n\t\"syscall.IFNAMSIZ\":                                     \"syscall\",\n\t\"syscall.IFT_1822\":                                     \"syscall\",\n\t\"syscall.IFT_A12MPPSWITCH\":                             \"syscall\",\n\t\"syscall.IFT_AAL2\":                                     \"syscall\",\n\t\"syscall.IFT_AAL5\":                                     \"syscall\",\n\t\"syscall.IFT_ADSL\":                                     \"syscall\",\n\t\"syscall.IFT_AFLANE8023\":                               \"syscall\",\n\t\"syscall.IFT_AFLANE8025\":                               \"syscall\",\n\t\"syscall.IFT_ARAP\":                                     \"syscall\",\n\t\"syscall.IFT_ARCNET\":                                   \"syscall\",\n\t\"syscall.IFT_ARCNETPLUS\":                               \"syscall\",\n\t\"syscall.IFT_ASYNC\":                                    \"syscall\",\n\t\"syscall.IFT_ATM\":                                      \"syscall\",\n\t\"syscall.IFT_ATMDXI\":                                   \"syscall\",\n\t\"syscall.IFT_ATMFUNI\":                                  \"syscall\",\n\t\"syscall.IFT_ATMIMA\":                                   \"syscall\",\n\t\"syscall.IFT_ATMLOGICAL\":                               \"syscall\",\n\t\"syscall.IFT_ATMRADIO\":                                 \"syscall\",\n\t\"syscall.IFT_ATMSUBINTERFACE\":                          \"syscall\",\n\t\"syscall.IFT_ATMVCIENDPT\":                              \"syscall\",\n\t\"syscall.IFT_ATMVIRTUAL\":                               \"syscall\",\n\t\"syscall.IFT_BGPPOLICYACCOUNTING\":                      \"syscall\",\n\t\"syscall.IFT_BLUETOOTH\":                                \"syscall\",\n\t\"syscall.IFT_BRIDGE\":                                   \"syscall\",\n\t\"syscall.IFT_BSC\":                                      \"syscall\",\n\t\"syscall.IFT_CARP\":                                     \"syscall\",\n\t\"syscall.IFT_CCTEMUL\":                                  \"syscall\",\n\t\"syscall.IFT_CELLULAR\":                                 \"syscall\",\n\t\"syscall.IFT_CEPT\":                                     \"syscall\",\n\t\"syscall.IFT_CES\":                                      \"syscall\",\n\t\"syscall.IFT_CHANNEL\":                                  \"syscall\",\n\t\"syscall.IFT_CNR\":                                      \"syscall\",\n\t\"syscall.IFT_COFFEE\":                                   \"syscall\",\n\t\"syscall.IFT_COMPOSITELINK\":                            \"syscall\",\n\t\"syscall.IFT_DCN\":                                      \"syscall\",\n\t\"syscall.IFT_DIGITALPOWERLINE\":                         \"syscall\",\n\t\"syscall.IFT_DIGITALWRAPPEROVERHEADCHANNEL\":            \"syscall\",\n\t\"syscall.IFT_DLSW\":                                     \"syscall\",\n\t\"syscall.IFT_DOCSCABLEDOWNSTREAM\":                      \"syscall\",\n\t\"syscall.IFT_DOCSCABLEMACLAYER\":                        \"syscall\",\n\t\"syscall.IFT_DOCSCABLEUPSTREAM\":                        \"syscall\",\n\t\"syscall.IFT_DOCSCABLEUPSTREAMCHANNEL\":                 \"syscall\",\n\t\"syscall.IFT_DS0\":                                      \"syscall\",\n\t\"syscall.IFT_DS0BUNDLE\":                                \"syscall\",\n\t\"syscall.IFT_DS1FDL\":                                   \"syscall\",\n\t\"syscall.IFT_DS3\":                                      \"syscall\",\n\t\"syscall.IFT_DTM\":                                      \"syscall\",\n\t\"syscall.IFT_DUMMY\":                                    \"syscall\",\n\t\"syscall.IFT_DVBASILN\":                                 \"syscall\",\n\t\"syscall.IFT_DVBASIOUT\":                                \"syscall\",\n\t\"syscall.IFT_DVBRCCDOWNSTREAM\":                         \"syscall\",\n\t\"syscall.IFT_DVBRCCMACLAYER\":                           \"syscall\",\n\t\"syscall.IFT_DVBRCCUPSTREAM\":                           \"syscall\",\n\t\"syscall.IFT_ECONET\":                                   \"syscall\",\n\t\"syscall.IFT_ENC\":                                      \"syscall\",\n\t\"syscall.IFT_EON\":                                      \"syscall\",\n\t\"syscall.IFT_EPLRS\":                                    \"syscall\",\n\t\"syscall.IFT_ESCON\":                                    \"syscall\",\n\t\"syscall.IFT_ETHER\":                                    \"syscall\",\n\t\"syscall.IFT_FAITH\":                                    \"syscall\",\n\t\"syscall.IFT_FAST\":                                     \"syscall\",\n\t\"syscall.IFT_FASTETHER\":                                \"syscall\",\n\t\"syscall.IFT_FASTETHERFX\":                              \"syscall\",\n\t\"syscall.IFT_FDDI\":                                     \"syscall\",\n\t\"syscall.IFT_FIBRECHANNEL\":                             \"syscall\",\n\t\"syscall.IFT_FRAMERELAYINTERCONNECT\":                   \"syscall\",\n\t\"syscall.IFT_FRAMERELAYMPI\":                            \"syscall\",\n\t\"syscall.IFT_FRDLCIENDPT\":                              \"syscall\",\n\t\"syscall.IFT_FRELAY\":                                   \"syscall\",\n\t\"syscall.IFT_FRELAYDCE\":                                \"syscall\",\n\t\"syscall.IFT_FRF16MFRBUNDLE\":                           \"syscall\",\n\t\"syscall.IFT_FRFORWARD\":                                \"syscall\",\n\t\"syscall.IFT_G703AT2MB\":                                \"syscall\",\n\t\"syscall.IFT_G703AT64K\":                                \"syscall\",\n\t\"syscall.IFT_GIF\":                                      \"syscall\",\n\t\"syscall.IFT_GIGABITETHERNET\":                          \"syscall\",\n\t\"syscall.IFT_GR303IDT\":                                 \"syscall\",\n\t\"syscall.IFT_GR303RDT\":                                 \"syscall\",\n\t\"syscall.IFT_H323GATEKEEPER\":                           \"syscall\",\n\t\"syscall.IFT_H323PROXY\":                                \"syscall\",\n\t\"syscall.IFT_HDH1822\":                                  \"syscall\",\n\t\"syscall.IFT_HDLC\":                                     \"syscall\",\n\t\"syscall.IFT_HDSL2\":                                    \"syscall\",\n\t\"syscall.IFT_HIPERLAN2\":                                \"syscall\",\n\t\"syscall.IFT_HIPPI\":                                    \"syscall\",\n\t\"syscall.IFT_HIPPIINTERFACE\":                           \"syscall\",\n\t\"syscall.IFT_HOSTPAD\":                                  \"syscall\",\n\t\"syscall.IFT_HSSI\":                                     \"syscall\",\n\t\"syscall.IFT_HY\":                                       \"syscall\",\n\t\"syscall.IFT_IBM370PARCHAN\":                            \"syscall\",\n\t\"syscall.IFT_IDSL\":                                     \"syscall\",\n\t\"syscall.IFT_IEEE1394\":                                 \"syscall\",\n\t\"syscall.IFT_IEEE80211\":                                \"syscall\",\n\t\"syscall.IFT_IEEE80212\":                                \"syscall\",\n\t\"syscall.IFT_IEEE8023ADLAG\":                            \"syscall\",\n\t\"syscall.IFT_IFGSN\":                                    \"syscall\",\n\t\"syscall.IFT_IMT\":                                      \"syscall\",\n\t\"syscall.IFT_INFINIBAND\":                               \"syscall\",\n\t\"syscall.IFT_INTERLEAVE\":                               \"syscall\",\n\t\"syscall.IFT_IP\":                                       \"syscall\",\n\t\"syscall.IFT_IPFORWARD\":                                \"syscall\",\n\t\"syscall.IFT_IPOVERATM\":                                \"syscall\",\n\t\"syscall.IFT_IPOVERCDLC\":                               \"syscall\",\n\t\"syscall.IFT_IPOVERCLAW\":                               \"syscall\",\n\t\"syscall.IFT_IPSWITCH\":                                 \"syscall\",\n\t\"syscall.IFT_IPXIP\":                                    \"syscall\",\n\t\"syscall.IFT_ISDN\":                                     \"syscall\",\n\t\"syscall.IFT_ISDNBASIC\":                                \"syscall\",\n\t\"syscall.IFT_ISDNPRIMARY\":                              \"syscall\",\n\t\"syscall.IFT_ISDNS\":                                    \"syscall\",\n\t\"syscall.IFT_ISDNU\":                                    \"syscall\",\n\t\"syscall.IFT_ISO88022LLC\":                              \"syscall\",\n\t\"syscall.IFT_ISO88023\":                                 \"syscall\",\n\t\"syscall.IFT_ISO88024\":                                 \"syscall\",\n\t\"syscall.IFT_ISO88025\":                                 \"syscall\",\n\t\"syscall.IFT_ISO88025CRFPINT\":                          \"syscall\",\n\t\"syscall.IFT_ISO88025DTR\":                              \"syscall\",\n\t\"syscall.IFT_ISO88025FIBER\":                            \"syscall\",\n\t\"syscall.IFT_ISO88026\":                                 \"syscall\",\n\t\"syscall.IFT_ISUP\":                                     \"syscall\",\n\t\"syscall.IFT_L2VLAN\":                                   \"syscall\",\n\t\"syscall.IFT_L3IPVLAN\":                                 \"syscall\",\n\t\"syscall.IFT_L3IPXVLAN\":                                \"syscall\",\n\t\"syscall.IFT_LAPB\":                                     \"syscall\",\n\t\"syscall.IFT_LAPD\":                                     \"syscall\",\n\t\"syscall.IFT_LAPF\":                                     \"syscall\",\n\t\"syscall.IFT_LINEGROUP\":                                \"syscall\",\n\t\"syscall.IFT_LOCALTALK\":                                \"syscall\",\n\t\"syscall.IFT_LOOP\":                                     \"syscall\",\n\t\"syscall.IFT_MEDIAMAILOVERIP\":                          \"syscall\",\n\t\"syscall.IFT_MFSIGLINK\":                                \"syscall\",\n\t\"syscall.IFT_MIOX25\":                                   \"syscall\",\n\t\"syscall.IFT_MODEM\":                                    \"syscall\",\n\t\"syscall.IFT_MPC\":                                      \"syscall\",\n\t\"syscall.IFT_MPLS\":                                     \"syscall\",\n\t\"syscall.IFT_MPLSTUNNEL\":                               \"syscall\",\n\t\"syscall.IFT_MSDSL\":                                    \"syscall\",\n\t\"syscall.IFT_MVL\":                                      \"syscall\",\n\t\"syscall.IFT_MYRINET\":                                  \"syscall\",\n\t\"syscall.IFT_NFAS\":                                     \"syscall\",\n\t\"syscall.IFT_NSIP\":                                     \"syscall\",\n\t\"syscall.IFT_OPTICALCHANNEL\":                           \"syscall\",\n\t\"syscall.IFT_OPTICALTRANSPORT\":                         \"syscall\",\n\t\"syscall.IFT_OTHER\":                                    \"syscall\",\n\t\"syscall.IFT_P10\":                                      \"syscall\",\n\t\"syscall.IFT_P80\":                                      \"syscall\",\n\t\"syscall.IFT_PARA\":                                     \"syscall\",\n\t\"syscall.IFT_PDP\":                                      \"syscall\",\n\t\"syscall.IFT_PFLOG\":                                    \"syscall\",\n\t\"syscall.IFT_PFLOW\":                                    \"syscall\",\n\t\"syscall.IFT_PFSYNC\":                                   \"syscall\",\n\t\"syscall.IFT_PLC\":                                      \"syscall\",\n\t\"syscall.IFT_PON155\":                                   \"syscall\",\n\t\"syscall.IFT_PON622\":                                   \"syscall\",\n\t\"syscall.IFT_POS\":                                      \"syscall\",\n\t\"syscall.IFT_PPP\":                                      \"syscall\",\n\t\"syscall.IFT_PPPMULTILINKBUNDLE\":                       \"syscall\",\n\t\"syscall.IFT_PROPATM\":                                  \"syscall\",\n\t\"syscall.IFT_PROPBWAP2MP\":                              \"syscall\",\n\t\"syscall.IFT_PROPCNLS\":                                 \"syscall\",\n\t\"syscall.IFT_PROPDOCSWIRELESSDOWNSTREAM\":               \"syscall\",\n\t\"syscall.IFT_PROPDOCSWIRELESSMACLAYER\":                 \"syscall\",\n\t\"syscall.IFT_PROPDOCSWIRELESSUPSTREAM\":                 \"syscall\",\n\t\"syscall.IFT_PROPMUX\":                                  \"syscall\",\n\t\"syscall.IFT_PROPVIRTUAL\":                              \"syscall\",\n\t\"syscall.IFT_PROPWIRELESSP2P\":                          \"syscall\",\n\t\"syscall.IFT_PTPSERIAL\":                                \"syscall\",\n\t\"syscall.IFT_PVC\":                                      \"syscall\",\n\t\"syscall.IFT_Q2931\":                                    \"syscall\",\n\t\"syscall.IFT_QLLC\":                                     \"syscall\",\n\t\"syscall.IFT_RADIOMAC\":                                 \"syscall\",\n\t\"syscall.IFT_RADSL\":                                    \"syscall\",\n\t\"syscall.IFT_REACHDSL\":                                 \"syscall\",\n\t\"syscall.IFT_RFC1483\":                                  \"syscall\",\n\t\"syscall.IFT_RS232\":                                    \"syscall\",\n\t\"syscall.IFT_RSRB\":                                     \"syscall\",\n\t\"syscall.IFT_SDLC\":                                     \"syscall\",\n\t\"syscall.IFT_SDSL\":                                     \"syscall\",\n\t\"syscall.IFT_SHDSL\":                                    \"syscall\",\n\t\"syscall.IFT_SIP\":                                      \"syscall\",\n\t\"syscall.IFT_SIPSIG\":                                   \"syscall\",\n\t\"syscall.IFT_SIPTG\":                                    \"syscall\",\n\t\"syscall.IFT_SLIP\":                                     \"syscall\",\n\t\"syscall.IFT_SMDSDXI\":                                  \"syscall\",\n\t\"syscall.IFT_SMDSICIP\":                                 \"syscall\",\n\t\"syscall.IFT_SONET\":                                    \"syscall\",\n\t\"syscall.IFT_SONETOVERHEADCHANNEL\":                     \"syscall\",\n\t\"syscall.IFT_SONETPATH\":                                \"syscall\",\n\t\"syscall.IFT_SONETVT\":                                  \"syscall\",\n\t\"syscall.IFT_SRP\":                                      \"syscall\",\n\t\"syscall.IFT_SS7SIGLINK\":                               \"syscall\",\n\t\"syscall.IFT_STACKTOSTACK\":                             \"syscall\",\n\t\"syscall.IFT_STARLAN\":                                  \"syscall\",\n\t\"syscall.IFT_STF\":                                      \"syscall\",\n\t\"syscall.IFT_T1\":                                       \"syscall\",\n\t\"syscall.IFT_TDLC\":                                     \"syscall\",\n\t\"syscall.IFT_TELINK\":                                   \"syscall\",\n\t\"syscall.IFT_TERMPAD\":                                  \"syscall\",\n\t\"syscall.IFT_TR008\":                                    \"syscall\",\n\t\"syscall.IFT_TRANSPHDLC\":                               \"syscall\",\n\t\"syscall.IFT_TUNNEL\":                                   \"syscall\",\n\t\"syscall.IFT_ULTRA\":                                    \"syscall\",\n\t\"syscall.IFT_USB\":                                      \"syscall\",\n\t\"syscall.IFT_V11\":                                      \"syscall\",\n\t\"syscall.IFT_V35\":                                      \"syscall\",\n\t\"syscall.IFT_V36\":                                      \"syscall\",\n\t\"syscall.IFT_V37\":                                      \"syscall\",\n\t\"syscall.IFT_VDSL\":                                     \"syscall\",\n\t\"syscall.IFT_VIRTUALIPADDRESS\":                         \"syscall\",\n\t\"syscall.IFT_VIRTUALTG\":                                \"syscall\",\n\t\"syscall.IFT_VOICEDID\":                                 \"syscall\",\n\t\"syscall.IFT_VOICEEM\":                                  \"syscall\",\n\t\"syscall.IFT_VOICEEMFGD\":                               \"syscall\",\n\t\"syscall.IFT_VOICEENCAP\":                               \"syscall\",\n\t\"syscall.IFT_VOICEFGDEANA\":                             \"syscall\",\n\t\"syscall.IFT_VOICEFXO\":                                 \"syscall\",\n\t\"syscall.IFT_VOICEFXS\":                                 \"syscall\",\n\t\"syscall.IFT_VOICEOVERATM\":                             \"syscall\",\n\t\"syscall.IFT_VOICEOVERCABLE\":                           \"syscall\",\n\t\"syscall.IFT_VOICEOVERFRAMERELAY\":                      \"syscall\",\n\t\"syscall.IFT_VOICEOVERIP\":                              \"syscall\",\n\t\"syscall.IFT_X213\":                                     \"syscall\",\n\t\"syscall.IFT_X25\":                                      \"syscall\",\n\t\"syscall.IFT_X25DDN\":                                   \"syscall\",\n\t\"syscall.IFT_X25HUNTGROUP\":                             \"syscall\",\n\t\"syscall.IFT_X25MLP\":                                   \"syscall\",\n\t\"syscall.IFT_X25PLE\":                                   \"syscall\",\n\t\"syscall.IFT_XETHER\":                                   \"syscall\",\n\t\"syscall.IGNBRK\":                                       \"syscall\",\n\t\"syscall.IGNCR\":                                        \"syscall\",\n\t\"syscall.IGNORE\":                                       \"syscall\",\n\t\"syscall.IGNPAR\":                                       \"syscall\",\n\t\"syscall.IMAXBEL\":                                      \"syscall\",\n\t\"syscall.INFINITE\":                                     \"syscall\",\n\t\"syscall.INLCR\":                                        \"syscall\",\n\t\"syscall.INPCK\":                                        \"syscall\",\n\t\"syscall.INVALID_FILE_ATTRIBUTES\":                      \"syscall\",\n\t\"syscall.IN_ACCESS\":                                    \"syscall\",\n\t\"syscall.IN_ALL_EVENTS\":                                \"syscall\",\n\t\"syscall.IN_ATTRIB\":                                    \"syscall\",\n\t\"syscall.IN_CLASSA_HOST\":                               \"syscall\",\n\t\"syscall.IN_CLASSA_MAX\":                                \"syscall\",\n\t\"syscall.IN_CLASSA_NET\":                                \"syscall\",\n\t\"syscall.IN_CLASSA_NSHIFT\":                             \"syscall\",\n\t\"syscall.IN_CLASSB_HOST\":                               \"syscall\",\n\t\"syscall.IN_CLASSB_MAX\":                                \"syscall\",\n\t\"syscall.IN_CLASSB_NET\":                                \"syscall\",\n\t\"syscall.IN_CLASSB_NSHIFT\":                             \"syscall\",\n\t\"syscall.IN_CLASSC_HOST\":                               \"syscall\",\n\t\"syscall.IN_CLASSC_NET\":                                \"syscall\",\n\t\"syscall.IN_CLASSC_NSHIFT\":                             \"syscall\",\n\t\"syscall.IN_CLASSD_HOST\":                               \"syscall\",\n\t\"syscall.IN_CLASSD_NET\":                                \"syscall\",\n\t\"syscall.IN_CLASSD_NSHIFT\":                             \"syscall\",\n\t\"syscall.IN_CLOEXEC\":                                   \"syscall\",\n\t\"syscall.IN_CLOSE\":                                     \"syscall\",\n\t\"syscall.IN_CLOSE_NOWRITE\":                             \"syscall\",\n\t\"syscall.IN_CLOSE_WRITE\":                               \"syscall\",\n\t\"syscall.IN_CREATE\":                                    \"syscall\",\n\t\"syscall.IN_DELETE\":                                    \"syscall\",\n\t\"syscall.IN_DELETE_SELF\":                               \"syscall\",\n\t\"syscall.IN_DONT_FOLLOW\":                               \"syscall\",\n\t\"syscall.IN_EXCL_UNLINK\":                               \"syscall\",\n\t\"syscall.IN_IGNORED\":                                   \"syscall\",\n\t\"syscall.IN_ISDIR\":                                     \"syscall\",\n\t\"syscall.IN_LINKLOCALNETNUM\":                           \"syscall\",\n\t\"syscall.IN_LOOPBACKNET\":                               \"syscall\",\n\t\"syscall.IN_MASK_ADD\":                                  \"syscall\",\n\t\"syscall.IN_MODIFY\":                                    \"syscall\",\n\t\"syscall.IN_MOVE\":                                      \"syscall\",\n\t\"syscall.IN_MOVED_FROM\":                                \"syscall\",\n\t\"syscall.IN_MOVED_TO\":                                  \"syscall\",\n\t\"syscall.IN_MOVE_SELF\":                                 \"syscall\",\n\t\"syscall.IN_NONBLOCK\":                                  \"syscall\",\n\t\"syscall.IN_ONESHOT\":                                   \"syscall\",\n\t\"syscall.IN_ONLYDIR\":                                   \"syscall\",\n\t\"syscall.IN_OPEN\":                                      \"syscall\",\n\t\"syscall.IN_Q_OVERFLOW\":                                \"syscall\",\n\t\"syscall.IN_RFC3021_HOST\":                              \"syscall\",\n\t\"syscall.IN_RFC3021_MASK\":                              \"syscall\",\n\t\"syscall.IN_RFC3021_NET\":                               \"syscall\",\n\t\"syscall.IN_RFC3021_NSHIFT\":                            \"syscall\",\n\t\"syscall.IN_UNMOUNT\":                                   \"syscall\",\n\t\"syscall.IOC_IN\":                                       \"syscall\",\n\t\"syscall.IOC_INOUT\":                                    \"syscall\",\n\t\"syscall.IOC_OUT\":                                      \"syscall\",\n\t\"syscall.IOC_VENDOR\":                                   \"syscall\",\n\t\"syscall.IOC_WS2\":                                      \"syscall\",\n\t\"syscall.IO_REPARSE_TAG_SYMLINK\":                       \"syscall\",\n\t\"syscall.IPMreq\":                                       \"syscall\",\n\t\"syscall.IPMreqn\":                                      \"syscall\",\n\t\"syscall.IPPROTO_3PC\":                                  \"syscall\",\n\t\"syscall.IPPROTO_ADFS\":                                 \"syscall\",\n\t\"syscall.IPPROTO_AH\":                                   \"syscall\",\n\t\"syscall.IPPROTO_AHIP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_APES\":                                 \"syscall\",\n\t\"syscall.IPPROTO_ARGUS\":                                \"syscall\",\n\t\"syscall.IPPROTO_AX25\":                                 \"syscall\",\n\t\"syscall.IPPROTO_BHA\":                                  \"syscall\",\n\t\"syscall.IPPROTO_BLT\":                                  \"syscall\",\n\t\"syscall.IPPROTO_BRSATMON\":                             \"syscall\",\n\t\"syscall.IPPROTO_CARP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_CFTP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_CHAOS\":                                \"syscall\",\n\t\"syscall.IPPROTO_CMTP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_COMP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_CPHB\":                                 \"syscall\",\n\t\"syscall.IPPROTO_CPNX\":                                 \"syscall\",\n\t\"syscall.IPPROTO_DCCP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_DDP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_DGP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_DIVERT\":                               \"syscall\",\n\t\"syscall.IPPROTO_DIVERT_INIT\":                          \"syscall\",\n\t\"syscall.IPPROTO_DIVERT_RESP\":                          \"syscall\",\n\t\"syscall.IPPROTO_DONE\":                                 \"syscall\",\n\t\"syscall.IPPROTO_DSTOPTS\":                              \"syscall\",\n\t\"syscall.IPPROTO_EGP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_EMCON\":                                \"syscall\",\n\t\"syscall.IPPROTO_ENCAP\":                                \"syscall\",\n\t\"syscall.IPPROTO_EON\":                                  \"syscall\",\n\t\"syscall.IPPROTO_ESP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_ETHERIP\":                              \"syscall\",\n\t\"syscall.IPPROTO_FRAGMENT\":                             \"syscall\",\n\t\"syscall.IPPROTO_GGP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_GMTP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_GRE\":                                  \"syscall\",\n\t\"syscall.IPPROTO_HELLO\":                                \"syscall\",\n\t\"syscall.IPPROTO_HMP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_HOPOPTS\":                              \"syscall\",\n\t\"syscall.IPPROTO_ICMP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_ICMPV6\":                               \"syscall\",\n\t\"syscall.IPPROTO_IDP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_IDPR\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IDRP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IGMP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IGP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_IGRP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IL\":                                   \"syscall\",\n\t\"syscall.IPPROTO_INLSP\":                                \"syscall\",\n\t\"syscall.IPPROTO_INP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_IP\":                                   \"syscall\",\n\t\"syscall.IPPROTO_IPCOMP\":                               \"syscall\",\n\t\"syscall.IPPROTO_IPCV\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IPEIP\":                                \"syscall\",\n\t\"syscall.IPPROTO_IPIP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IPPC\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IPV4\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IPV6\":                                 \"syscall\",\n\t\"syscall.IPPROTO_IPV6_ICMP\":                            \"syscall\",\n\t\"syscall.IPPROTO_IRTP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_KRYPTOLAN\":                            \"syscall\",\n\t\"syscall.IPPROTO_LARP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_LEAF1\":                                \"syscall\",\n\t\"syscall.IPPROTO_LEAF2\":                                \"syscall\",\n\t\"syscall.IPPROTO_MAX\":                                  \"syscall\",\n\t\"syscall.IPPROTO_MAXID\":                                \"syscall\",\n\t\"syscall.IPPROTO_MEAS\":                                 \"syscall\",\n\t\"syscall.IPPROTO_MH\":                                   \"syscall\",\n\t\"syscall.IPPROTO_MHRP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_MICP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_MOBILE\":                               \"syscall\",\n\t\"syscall.IPPROTO_MPLS\":                                 \"syscall\",\n\t\"syscall.IPPROTO_MTP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_MUX\":                                  \"syscall\",\n\t\"syscall.IPPROTO_ND\":                                   \"syscall\",\n\t\"syscall.IPPROTO_NHRP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_NONE\":                                 \"syscall\",\n\t\"syscall.IPPROTO_NSP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_NVPII\":                                \"syscall\",\n\t\"syscall.IPPROTO_OLD_DIVERT\":                           \"syscall\",\n\t\"syscall.IPPROTO_OSPFIGP\":                              \"syscall\",\n\t\"syscall.IPPROTO_PFSYNC\":                               \"syscall\",\n\t\"syscall.IPPROTO_PGM\":                                  \"syscall\",\n\t\"syscall.IPPROTO_PIGP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_PIM\":                                  \"syscall\",\n\t\"syscall.IPPROTO_PRM\":                                  \"syscall\",\n\t\"syscall.IPPROTO_PUP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_PVP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_RAW\":                                  \"syscall\",\n\t\"syscall.IPPROTO_RCCMON\":                               \"syscall\",\n\t\"syscall.IPPROTO_RDP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_ROUTING\":                              \"syscall\",\n\t\"syscall.IPPROTO_RSVP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_RVD\":                                  \"syscall\",\n\t\"syscall.IPPROTO_SATEXPAK\":                             \"syscall\",\n\t\"syscall.IPPROTO_SATMON\":                               \"syscall\",\n\t\"syscall.IPPROTO_SCCSP\":                                \"syscall\",\n\t\"syscall.IPPROTO_SCTP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_SDRP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_SEND\":                                 \"syscall\",\n\t\"syscall.IPPROTO_SEP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_SKIP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_SPACER\":                               \"syscall\",\n\t\"syscall.IPPROTO_SRPC\":                                 \"syscall\",\n\t\"syscall.IPPROTO_ST\":                                   \"syscall\",\n\t\"syscall.IPPROTO_SVMTP\":                                \"syscall\",\n\t\"syscall.IPPROTO_SWIPE\":                                \"syscall\",\n\t\"syscall.IPPROTO_TCF\":                                  \"syscall\",\n\t\"syscall.IPPROTO_TCP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_TLSP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_TP\":                                   \"syscall\",\n\t\"syscall.IPPROTO_TPXX\":                                 \"syscall\",\n\t\"syscall.IPPROTO_TRUNK1\":                               \"syscall\",\n\t\"syscall.IPPROTO_TRUNK2\":                               \"syscall\",\n\t\"syscall.IPPROTO_TTP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_UDP\":                                  \"syscall\",\n\t\"syscall.IPPROTO_UDPLITE\":                              \"syscall\",\n\t\"syscall.IPPROTO_VINES\":                                \"syscall\",\n\t\"syscall.IPPROTO_VISA\":                                 \"syscall\",\n\t\"syscall.IPPROTO_VMTP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_VRRP\":                                 \"syscall\",\n\t\"syscall.IPPROTO_WBEXPAK\":                              \"syscall\",\n\t\"syscall.IPPROTO_WBMON\":                                \"syscall\",\n\t\"syscall.IPPROTO_WSN\":                                  \"syscall\",\n\t\"syscall.IPPROTO_XNET\":                                 \"syscall\",\n\t\"syscall.IPPROTO_XTP\":                                  \"syscall\",\n\t\"syscall.IPV6_2292DSTOPTS\":                             \"syscall\",\n\t\"syscall.IPV6_2292HOPLIMIT\":                            \"syscall\",\n\t\"syscall.IPV6_2292HOPOPTS\":                             \"syscall\",\n\t\"syscall.IPV6_2292NEXTHOP\":                             \"syscall\",\n\t\"syscall.IPV6_2292PKTINFO\":                             \"syscall\",\n\t\"syscall.IPV6_2292PKTOPTIONS\":                          \"syscall\",\n\t\"syscall.IPV6_2292RTHDR\":                               \"syscall\",\n\t\"syscall.IPV6_ADDRFORM\":                                \"syscall\",\n\t\"syscall.IPV6_ADD_MEMBERSHIP\":                          \"syscall\",\n\t\"syscall.IPV6_AUTHHDR\":                                 \"syscall\",\n\t\"syscall.IPV6_AUTH_LEVEL\":                              \"syscall\",\n\t\"syscall.IPV6_AUTOFLOWLABEL\":                           \"syscall\",\n\t\"syscall.IPV6_BINDANY\":                                 \"syscall\",\n\t\"syscall.IPV6_BINDV6ONLY\":                              \"syscall\",\n\t\"syscall.IPV6_BOUND_IF\":                                \"syscall\",\n\t\"syscall.IPV6_CHECKSUM\":                                \"syscall\",\n\t\"syscall.IPV6_DEFAULT_MULTICAST_HOPS\":                  \"syscall\",\n\t\"syscall.IPV6_DEFAULT_MULTICAST_LOOP\":                  \"syscall\",\n\t\"syscall.IPV6_DEFHLIM\":                                 \"syscall\",\n\t\"syscall.IPV6_DONTFRAG\":                                \"syscall\",\n\t\"syscall.IPV6_DROP_MEMBERSHIP\":                         \"syscall\",\n\t\"syscall.IPV6_DSTOPTS\":                                 \"syscall\",\n\t\"syscall.IPV6_ESP_NETWORK_LEVEL\":                       \"syscall\",\n\t\"syscall.IPV6_ESP_TRANS_LEVEL\":                         \"syscall\",\n\t\"syscall.IPV6_FAITH\":                                   \"syscall\",\n\t\"syscall.IPV6_FLOWINFO_MASK\":                           \"syscall\",\n\t\"syscall.IPV6_FLOWLABEL_MASK\":                          \"syscall\",\n\t\"syscall.IPV6_FRAGTTL\":                                 \"syscall\",\n\t\"syscall.IPV6_FW_ADD\":                                  \"syscall\",\n\t\"syscall.IPV6_FW_DEL\":                                  \"syscall\",\n\t\"syscall.IPV6_FW_FLUSH\":                                \"syscall\",\n\t\"syscall.IPV6_FW_GET\":                                  \"syscall\",\n\t\"syscall.IPV6_FW_ZERO\":                                 \"syscall\",\n\t\"syscall.IPV6_HLIMDEC\":                                 \"syscall\",\n\t\"syscall.IPV6_HOPLIMIT\":                                \"syscall\",\n\t\"syscall.IPV6_HOPOPTS\":                                 \"syscall\",\n\t\"syscall.IPV6_IPCOMP_LEVEL\":                            \"syscall\",\n\t\"syscall.IPV6_IPSEC_POLICY\":                            \"syscall\",\n\t\"syscall.IPV6_JOIN_ANYCAST\":                            \"syscall\",\n\t\"syscall.IPV6_JOIN_GROUP\":                              \"syscall\",\n\t\"syscall.IPV6_LEAVE_ANYCAST\":                           \"syscall\",\n\t\"syscall.IPV6_LEAVE_GROUP\":                             \"syscall\",\n\t\"syscall.IPV6_MAXHLIM\":                                 \"syscall\",\n\t\"syscall.IPV6_MAXOPTHDR\":                               \"syscall\",\n\t\"syscall.IPV6_MAXPACKET\":                               \"syscall\",\n\t\"syscall.IPV6_MAX_GROUP_SRC_FILTER\":                    \"syscall\",\n\t\"syscall.IPV6_MAX_MEMBERSHIPS\":                         \"syscall\",\n\t\"syscall.IPV6_MAX_SOCK_SRC_FILTER\":                     \"syscall\",\n\t\"syscall.IPV6_MIN_MEMBERSHIPS\":                         \"syscall\",\n\t\"syscall.IPV6_MMTU\":                                    \"syscall\",\n\t\"syscall.IPV6_MSFILTER\":                                \"syscall\",\n\t\"syscall.IPV6_MTU\":                                     \"syscall\",\n\t\"syscall.IPV6_MTU_DISCOVER\":                            \"syscall\",\n\t\"syscall.IPV6_MULTICAST_HOPS\":                          \"syscall\",\n\t\"syscall.IPV6_MULTICAST_IF\":                            \"syscall\",\n\t\"syscall.IPV6_MULTICAST_LOOP\":                          \"syscall\",\n\t\"syscall.IPV6_NEXTHOP\":                                 \"syscall\",\n\t\"syscall.IPV6_OPTIONS\":                                 \"syscall\",\n\t\"syscall.IPV6_PATHMTU\":                                 \"syscall\",\n\t\"syscall.IPV6_PIPEX\":                                   \"syscall\",\n\t\"syscall.IPV6_PKTINFO\":                                 \"syscall\",\n\t\"syscall.IPV6_PMTUDISC_DO\":                             \"syscall\",\n\t\"syscall.IPV6_PMTUDISC_DONT\":                           \"syscall\",\n\t\"syscall.IPV6_PMTUDISC_PROBE\":                          \"syscall\",\n\t\"syscall.IPV6_PMTUDISC_WANT\":                           \"syscall\",\n\t\"syscall.IPV6_PORTRANGE\":                               \"syscall\",\n\t\"syscall.IPV6_PORTRANGE_DEFAULT\":                       \"syscall\",\n\t\"syscall.IPV6_PORTRANGE_HIGH\":                          \"syscall\",\n\t\"syscall.IPV6_PORTRANGE_LOW\":                           \"syscall\",\n\t\"syscall.IPV6_PREFER_TEMPADDR\":                         \"syscall\",\n\t\"syscall.IPV6_RECVDSTOPTS\":                             \"syscall\",\n\t\"syscall.IPV6_RECVDSTPORT\":                             \"syscall\",\n\t\"syscall.IPV6_RECVERR\":                                 \"syscall\",\n\t\"syscall.IPV6_RECVHOPLIMIT\":                            \"syscall\",\n\t\"syscall.IPV6_RECVHOPOPTS\":                             \"syscall\",\n\t\"syscall.IPV6_RECVPATHMTU\":                             \"syscall\",\n\t\"syscall.IPV6_RECVPKTINFO\":                             \"syscall\",\n\t\"syscall.IPV6_RECVRTHDR\":                               \"syscall\",\n\t\"syscall.IPV6_RECVTCLASS\":                              \"syscall\",\n\t\"syscall.IPV6_ROUTER_ALERT\":                            \"syscall\",\n\t\"syscall.IPV6_RTABLE\":                                  \"syscall\",\n\t\"syscall.IPV6_RTHDR\":                                   \"syscall\",\n\t\"syscall.IPV6_RTHDRDSTOPTS\":                            \"syscall\",\n\t\"syscall.IPV6_RTHDR_LOOSE\":                             \"syscall\",\n\t\"syscall.IPV6_RTHDR_STRICT\":                            \"syscall\",\n\t\"syscall.IPV6_RTHDR_TYPE_0\":                            \"syscall\",\n\t\"syscall.IPV6_RXDSTOPTS\":                               \"syscall\",\n\t\"syscall.IPV6_RXHOPOPTS\":                               \"syscall\",\n\t\"syscall.IPV6_SOCKOPT_RESERVED1\":                       \"syscall\",\n\t\"syscall.IPV6_TCLASS\":                                  \"syscall\",\n\t\"syscall.IPV6_UNICAST_HOPS\":                            \"syscall\",\n\t\"syscall.IPV6_USE_MIN_MTU\":                             \"syscall\",\n\t\"syscall.IPV6_V6ONLY\":                                  \"syscall\",\n\t\"syscall.IPV6_VERSION\":                                 \"syscall\",\n\t\"syscall.IPV6_VERSION_MASK\":                            \"syscall\",\n\t\"syscall.IPV6_XFRM_POLICY\":                             \"syscall\",\n\t\"syscall.IP_ADD_MEMBERSHIP\":                            \"syscall\",\n\t\"syscall.IP_ADD_SOURCE_MEMBERSHIP\":                     \"syscall\",\n\t\"syscall.IP_AUTH_LEVEL\":                                \"syscall\",\n\t\"syscall.IP_BINDANY\":                                   \"syscall\",\n\t\"syscall.IP_BLOCK_SOURCE\":                              \"syscall\",\n\t\"syscall.IP_BOUND_IF\":                                  \"syscall\",\n\t\"syscall.IP_DEFAULT_MULTICAST_LOOP\":                    \"syscall\",\n\t\"syscall.IP_DEFAULT_MULTICAST_TTL\":                     \"syscall\",\n\t\"syscall.IP_DF\":                                        \"syscall\",\n\t\"syscall.IP_DIVERTFL\":                                  \"syscall\",\n\t\"syscall.IP_DONTFRAG\":                                  \"syscall\",\n\t\"syscall.IP_DROP_MEMBERSHIP\":                           \"syscall\",\n\t\"syscall.IP_DROP_SOURCE_MEMBERSHIP\":                    \"syscall\",\n\t\"syscall.IP_DUMMYNET3\":                                 \"syscall\",\n\t\"syscall.IP_DUMMYNET_CONFIGURE\":                        \"syscall\",\n\t\"syscall.IP_DUMMYNET_DEL\":                              \"syscall\",\n\t\"syscall.IP_DUMMYNET_FLUSH\":                            \"syscall\",\n\t\"syscall.IP_DUMMYNET_GET\":                              \"syscall\",\n\t\"syscall.IP_EF\":                                        \"syscall\",\n\t\"syscall.IP_ERRORMTU\":                                  \"syscall\",\n\t\"syscall.IP_ESP_NETWORK_LEVEL\":                         \"syscall\",\n\t\"syscall.IP_ESP_TRANS_LEVEL\":                           \"syscall\",\n\t\"syscall.IP_FAITH\":                                     \"syscall\",\n\t\"syscall.IP_FREEBIND\":                                  \"syscall\",\n\t\"syscall.IP_FW3\":                                       \"syscall\",\n\t\"syscall.IP_FW_ADD\":                                    \"syscall\",\n\t\"syscall.IP_FW_DEL\":                                    \"syscall\",\n\t\"syscall.IP_FW_FLUSH\":                                  \"syscall\",\n\t\"syscall.IP_FW_GET\":                                    \"syscall\",\n\t\"syscall.IP_FW_NAT_CFG\":                                \"syscall\",\n\t\"syscall.IP_FW_NAT_DEL\":                                \"syscall\",\n\t\"syscall.IP_FW_NAT_GET_CONFIG\":                         \"syscall\",\n\t\"syscall.IP_FW_NAT_GET_LOG\":                            \"syscall\",\n\t\"syscall.IP_FW_RESETLOG\":                               \"syscall\",\n\t\"syscall.IP_FW_TABLE_ADD\":                              \"syscall\",\n\t\"syscall.IP_FW_TABLE_DEL\":                              \"syscall\",\n\t\"syscall.IP_FW_TABLE_FLUSH\":                            \"syscall\",\n\t\"syscall.IP_FW_TABLE_GETSIZE\":                          \"syscall\",\n\t\"syscall.IP_FW_TABLE_LIST\":                             \"syscall\",\n\t\"syscall.IP_FW_ZERO\":                                   \"syscall\",\n\t\"syscall.IP_HDRINCL\":                                   \"syscall\",\n\t\"syscall.IP_IPCOMP_LEVEL\":                              \"syscall\",\n\t\"syscall.IP_IPSECFLOWINFO\":                             \"syscall\",\n\t\"syscall.IP_IPSEC_LOCAL_AUTH\":                          \"syscall\",\n\t\"syscall.IP_IPSEC_LOCAL_CRED\":                          \"syscall\",\n\t\"syscall.IP_IPSEC_LOCAL_ID\":                            \"syscall\",\n\t\"syscall.IP_IPSEC_POLICY\":                              \"syscall\",\n\t\"syscall.IP_IPSEC_REMOTE_AUTH\":                         \"syscall\",\n\t\"syscall.IP_IPSEC_REMOTE_CRED\":                         \"syscall\",\n\t\"syscall.IP_IPSEC_REMOTE_ID\":                           \"syscall\",\n\t\"syscall.IP_MAXPACKET\":                                 \"syscall\",\n\t\"syscall.IP_MAX_GROUP_SRC_FILTER\":                      \"syscall\",\n\t\"syscall.IP_MAX_MEMBERSHIPS\":                           \"syscall\",\n\t\"syscall.IP_MAX_SOCK_MUTE_FILTER\":                      \"syscall\",\n\t\"syscall.IP_MAX_SOCK_SRC_FILTER\":                       \"syscall\",\n\t\"syscall.IP_MAX_SOURCE_FILTER\":                         \"syscall\",\n\t\"syscall.IP_MF\":                                        \"syscall\",\n\t\"syscall.IP_MINFRAGSIZE\":                               \"syscall\",\n\t\"syscall.IP_MINTTL\":                                    \"syscall\",\n\t\"syscall.IP_MIN_MEMBERSHIPS\":                           \"syscall\",\n\t\"syscall.IP_MSFILTER\":                                  \"syscall\",\n\t\"syscall.IP_MSS\":                                       \"syscall\",\n\t\"syscall.IP_MTU\":                                       \"syscall\",\n\t\"syscall.IP_MTU_DISCOVER\":                              \"syscall\",\n\t\"syscall.IP_MULTICAST_IF\":                              \"syscall\",\n\t\"syscall.IP_MULTICAST_IFINDEX\":                         \"syscall\",\n\t\"syscall.IP_MULTICAST_LOOP\":                            \"syscall\",\n\t\"syscall.IP_MULTICAST_TTL\":                             \"syscall\",\n\t\"syscall.IP_MULTICAST_VIF\":                             \"syscall\",\n\t\"syscall.IP_NAT__XXX\":                                  \"syscall\",\n\t\"syscall.IP_OFFMASK\":                                   \"syscall\",\n\t\"syscall.IP_OLD_FW_ADD\":                                \"syscall\",\n\t\"syscall.IP_OLD_FW_DEL\":                                \"syscall\",\n\t\"syscall.IP_OLD_FW_FLUSH\":                              \"syscall\",\n\t\"syscall.IP_OLD_FW_GET\":                                \"syscall\",\n\t\"syscall.IP_OLD_FW_RESETLOG\":                           \"syscall\",\n\t\"syscall.IP_OLD_FW_ZERO\":                               \"syscall\",\n\t\"syscall.IP_ONESBCAST\":                                 \"syscall\",\n\t\"syscall.IP_OPTIONS\":                                   \"syscall\",\n\t\"syscall.IP_ORIGDSTADDR\":                               \"syscall\",\n\t\"syscall.IP_PASSSEC\":                                   \"syscall\",\n\t\"syscall.IP_PIPEX\":                                     \"syscall\",\n\t\"syscall.IP_PKTINFO\":                                   \"syscall\",\n\t\"syscall.IP_PKTOPTIONS\":                                \"syscall\",\n\t\"syscall.IP_PMTUDISC\":                                  \"syscall\",\n\t\"syscall.IP_PMTUDISC_DO\":                               \"syscall\",\n\t\"syscall.IP_PMTUDISC_DONT\":                             \"syscall\",\n\t\"syscall.IP_PMTUDISC_PROBE\":                            \"syscall\",\n\t\"syscall.IP_PMTUDISC_WANT\":                             \"syscall\",\n\t\"syscall.IP_PORTRANGE\":                                 \"syscall\",\n\t\"syscall.IP_PORTRANGE_DEFAULT\":                         \"syscall\",\n\t\"syscall.IP_PORTRANGE_HIGH\":                            \"syscall\",\n\t\"syscall.IP_PORTRANGE_LOW\":                             \"syscall\",\n\t\"syscall.IP_RECVDSTADDR\":                               \"syscall\",\n\t\"syscall.IP_RECVDSTPORT\":                               \"syscall\",\n\t\"syscall.IP_RECVERR\":                                   \"syscall\",\n\t\"syscall.IP_RECVIF\":                                    \"syscall\",\n\t\"syscall.IP_RECVOPTS\":                                  \"syscall\",\n\t\"syscall.IP_RECVORIGDSTADDR\":                           \"syscall\",\n\t\"syscall.IP_RECVPKTINFO\":                               \"syscall\",\n\t\"syscall.IP_RECVRETOPTS\":                               \"syscall\",\n\t\"syscall.IP_RECVRTABLE\":                                \"syscall\",\n\t\"syscall.IP_RECVTOS\":                                   \"syscall\",\n\t\"syscall.IP_RECVTTL\":                                   \"syscall\",\n\t\"syscall.IP_RETOPTS\":                                   \"syscall\",\n\t\"syscall.IP_RF\":                                        \"syscall\",\n\t\"syscall.IP_ROUTER_ALERT\":                              \"syscall\",\n\t\"syscall.IP_RSVP_OFF\":                                  \"syscall\",\n\t\"syscall.IP_RSVP_ON\":                                   \"syscall\",\n\t\"syscall.IP_RSVP_VIF_OFF\":                              \"syscall\",\n\t\"syscall.IP_RSVP_VIF_ON\":                               \"syscall\",\n\t\"syscall.IP_RTABLE\":                                    \"syscall\",\n\t\"syscall.IP_SENDSRCADDR\":                               \"syscall\",\n\t\"syscall.IP_STRIPHDR\":                                  \"syscall\",\n\t\"syscall.IP_TOS\":                                       \"syscall\",\n\t\"syscall.IP_TRAFFIC_MGT_BACKGROUND\":                    \"syscall\",\n\t\"syscall.IP_TRANSPARENT\":                               \"syscall\",\n\t\"syscall.IP_TTL\":                                       \"syscall\",\n\t\"syscall.IP_UNBLOCK_SOURCE\":                            \"syscall\",\n\t\"syscall.IP_XFRM_POLICY\":                               \"syscall\",\n\t\"syscall.IPv6MTUInfo\":                                  \"syscall\",\n\t\"syscall.IPv6Mreq\":                                     \"syscall\",\n\t\"syscall.ISIG\":                                         \"syscall\",\n\t\"syscall.ISTRIP\":                                       \"syscall\",\n\t\"syscall.IUCLC\":                                        \"syscall\",\n\t\"syscall.IUTF8\":                                        \"syscall\",\n\t\"syscall.IXANY\":                                        \"syscall\",\n\t\"syscall.IXOFF\":                                        \"syscall\",\n\t\"syscall.IXON\":                                         \"syscall\",\n\t\"syscall.IfAddrmsg\":                                    \"syscall\",\n\t\"syscall.IfAnnounceMsghdr\":                             \"syscall\",\n\t\"syscall.IfData\":                                       \"syscall\",\n\t\"syscall.IfInfomsg\":                                    \"syscall\",\n\t\"syscall.IfMsghdr\":                                     \"syscall\",\n\t\"syscall.IfaMsghdr\":                                    \"syscall\",\n\t\"syscall.IfmaMsghdr\":                                   \"syscall\",\n\t\"syscall.IfmaMsghdr2\":                                  \"syscall\",\n\t\"syscall.ImplementsGetwd\":                              \"syscall\",\n\t\"syscall.Inet4Pktinfo\":                                 \"syscall\",\n\t\"syscall.Inet6Pktinfo\":                                 \"syscall\",\n\t\"syscall.InotifyAddWatch\":                              \"syscall\",\n\t\"syscall.InotifyEvent\":                                 \"syscall\",\n\t\"syscall.InotifyInit\":                                  \"syscall\",\n\t\"syscall.InotifyInit1\":                                 \"syscall\",\n\t\"syscall.InotifyRmWatch\":                               \"syscall\",\n\t\"syscall.InterfaceAddrMessage\":                         \"syscall\",\n\t\"syscall.InterfaceAnnounceMessage\":                     \"syscall\",\n\t\"syscall.InterfaceInfo\":                                \"syscall\",\n\t\"syscall.InterfaceMessage\":                             \"syscall\",\n\t\"syscall.InterfaceMulticastAddrMessage\":                \"syscall\",\n\t\"syscall.InvalidHandle\":                                \"syscall\",\n\t\"syscall.Ioperm\":                                       \"syscall\",\n\t\"syscall.Iopl\":                                         \"syscall\",\n\t\"syscall.Iovec\":                                        \"syscall\",\n\t\"syscall.IpAdapterInfo\":                                \"syscall\",\n\t\"syscall.IpAddrString\":                                 \"syscall\",\n\t\"syscall.IpAddressString\":                              \"syscall\",\n\t\"syscall.IpMaskString\":                                 \"syscall\",\n\t\"syscall.Issetugid\":                                    \"syscall\",\n\t\"syscall.KEY_ALL_ACCESS\":                               \"syscall\",\n\t\"syscall.KEY_CREATE_LINK\":                              \"syscall\",\n\t\"syscall.KEY_CREATE_SUB_KEY\":                           \"syscall\",\n\t\"syscall.KEY_ENUMERATE_SUB_KEYS\":                       \"syscall\",\n\t\"syscall.KEY_EXECUTE\":                                  \"syscall\",\n\t\"syscall.KEY_NOTIFY\":                                   \"syscall\",\n\t\"syscall.KEY_QUERY_VALUE\":                              \"syscall\",\n\t\"syscall.KEY_READ\":                                     \"syscall\",\n\t\"syscall.KEY_SET_VALUE\":                                \"syscall\",\n\t\"syscall.KEY_WOW64_32KEY\":                              \"syscall\",\n\t\"syscall.KEY_WOW64_64KEY\":                              \"syscall\",\n\t\"syscall.KEY_WRITE\":                                    \"syscall\",\n\t\"syscall.Kevent\":                                       \"syscall\",\n\t\"syscall.Kevent_t\":                                     \"syscall\",\n\t\"syscall.Kill\":                                         \"syscall\",\n\t\"syscall.Klogctl\":                                      \"syscall\",\n\t\"syscall.Kqueue\":                                       \"syscall\",\n\t\"syscall.LANG_ENGLISH\":                                 \"syscall\",\n\t\"syscall.LAYERED_PROTOCOL\":                             \"syscall\",\n\t\"syscall.LCNT_OVERLOAD_FLUSH\":                          \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_CAD_OFF\":                     \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_CAD_ON\":                      \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_HALT\":                        \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_KEXEC\":                       \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_POWER_OFF\":                   \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_RESTART\":                     \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_RESTART2\":                    \"syscall\",\n\t\"syscall.LINUX_REBOOT_CMD_SW_SUSPEND\":                  \"syscall\",\n\t\"syscall.LINUX_REBOOT_MAGIC1\":                          \"syscall\",\n\t\"syscall.LINUX_REBOOT_MAGIC2\":                          \"syscall\",\n\t\"syscall.LOCK_EX\":                                      \"syscall\",\n\t\"syscall.LOCK_NB\":                                      \"syscall\",\n\t\"syscall.LOCK_SH\":                                      \"syscall\",\n\t\"syscall.LOCK_UN\":                                      \"syscall\",\n\t\"syscall.LazyDLL\":                                      \"syscall\",\n\t\"syscall.LazyProc\":                                     \"syscall\",\n\t\"syscall.Lchown\":                                       \"syscall\",\n\t\"syscall.Linger\":                                       \"syscall\",\n\t\"syscall.Link\":                                         \"syscall\",\n\t\"syscall.Listen\":                                       \"syscall\",\n\t\"syscall.Listxattr\":                                    \"syscall\",\n\t\"syscall.LoadCancelIoEx\":                               \"syscall\",\n\t\"syscall.LoadConnectEx\":                                \"syscall\",\n\t\"syscall.LoadCreateSymbolicLink\":                       \"syscall\",\n\t\"syscall.LoadDLL\":                                      \"syscall\",\n\t\"syscall.LoadGetAddrInfo\":                              \"syscall\",\n\t\"syscall.LoadLibrary\":                                  \"syscall\",\n\t\"syscall.LoadSetFileCompletionNotificationModes\":       \"syscall\",\n\t\"syscall.LocalFree\":                                    \"syscall\",\n\t\"syscall.Log2phys_t\":                                   \"syscall\",\n\t\"syscall.LookupAccountName\":                            \"syscall\",\n\t\"syscall.LookupAccountSid\":                             \"syscall\",\n\t\"syscall.LookupSID\":                                    \"syscall\",\n\t\"syscall.LsfJump\":                                      \"syscall\",\n\t\"syscall.LsfSocket\":                                    \"syscall\",\n\t\"syscall.LsfStmt\":                                      \"syscall\",\n\t\"syscall.Lstat\":                                        \"syscall\",\n\t\"syscall.MADV_AUTOSYNC\":                                \"syscall\",\n\t\"syscall.MADV_CAN_REUSE\":                               \"syscall\",\n\t\"syscall.MADV_CORE\":                                    \"syscall\",\n\t\"syscall.MADV_DOFORK\":                                  \"syscall\",\n\t\"syscall.MADV_DONTFORK\":                                \"syscall\",\n\t\"syscall.MADV_DONTNEED\":                                \"syscall\",\n\t\"syscall.MADV_FREE\":                                    \"syscall\",\n\t\"syscall.MADV_FREE_REUSABLE\":                           \"syscall\",\n\t\"syscall.MADV_FREE_REUSE\":                              \"syscall\",\n\t\"syscall.MADV_HUGEPAGE\":                                \"syscall\",\n\t\"syscall.MADV_HWPOISON\":                                \"syscall\",\n\t\"syscall.MADV_MERGEABLE\":                               \"syscall\",\n\t\"syscall.MADV_NOCORE\":                                  \"syscall\",\n\t\"syscall.MADV_NOHUGEPAGE\":                              \"syscall\",\n\t\"syscall.MADV_NORMAL\":                                  \"syscall\",\n\t\"syscall.MADV_NOSYNC\":                                  \"syscall\",\n\t\"syscall.MADV_PROTECT\":                                 \"syscall\",\n\t\"syscall.MADV_RANDOM\":                                  \"syscall\",\n\t\"syscall.MADV_REMOVE\":                                  \"syscall\",\n\t\"syscall.MADV_SEQUENTIAL\":                              \"syscall\",\n\t\"syscall.MADV_SPACEAVAIL\":                              \"syscall\",\n\t\"syscall.MADV_UNMERGEABLE\":                             \"syscall\",\n\t\"syscall.MADV_WILLNEED\":                                \"syscall\",\n\t\"syscall.MADV_ZERO_WIRED_PAGES\":                        \"syscall\",\n\t\"syscall.MAP_32BIT\":                                    \"syscall\",\n\t\"syscall.MAP_ALIGNED_SUPER\":                            \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_16MB\":                           \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_1TB\":                            \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_256TB\":                          \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_4GB\":                            \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_64KB\":                           \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_64PB\":                           \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_MASK\":                           \"syscall\",\n\t\"syscall.MAP_ALIGNMENT_SHIFT\":                          \"syscall\",\n\t\"syscall.MAP_ANON\":                                     \"syscall\",\n\t\"syscall.MAP_ANONYMOUS\":                                \"syscall\",\n\t\"syscall.MAP_COPY\":                                     \"syscall\",\n\t\"syscall.MAP_DENYWRITE\":                                \"syscall\",\n\t\"syscall.MAP_EXECUTABLE\":                               \"syscall\",\n\t\"syscall.MAP_FILE\":                                     \"syscall\",\n\t\"syscall.MAP_FIXED\":                                    \"syscall\",\n\t\"syscall.MAP_FLAGMASK\":                                 \"syscall\",\n\t\"syscall.MAP_GROWSDOWN\":                                \"syscall\",\n\t\"syscall.MAP_HASSEMAPHORE\":                             \"syscall\",\n\t\"syscall.MAP_HUGETLB\":                                  \"syscall\",\n\t\"syscall.MAP_INHERIT\":                                  \"syscall\",\n\t\"syscall.MAP_INHERIT_COPY\":                             \"syscall\",\n\t\"syscall.MAP_INHERIT_DEFAULT\":                          \"syscall\",\n\t\"syscall.MAP_INHERIT_DONATE_COPY\":                      \"syscall\",\n\t\"syscall.MAP_INHERIT_NONE\":                             \"syscall\",\n\t\"syscall.MAP_INHERIT_SHARE\":                            \"syscall\",\n\t\"syscall.MAP_JIT\":                                      \"syscall\",\n\t\"syscall.MAP_LOCKED\":                                   \"syscall\",\n\t\"syscall.MAP_NOCACHE\":                                  \"syscall\",\n\t\"syscall.MAP_NOCORE\":                                   \"syscall\",\n\t\"syscall.MAP_NOEXTEND\":                                 \"syscall\",\n\t\"syscall.MAP_NONBLOCK\":                                 \"syscall\",\n\t\"syscall.MAP_NORESERVE\":                                \"syscall\",\n\t\"syscall.MAP_NOSYNC\":                                   \"syscall\",\n\t\"syscall.MAP_POPULATE\":                                 \"syscall\",\n\t\"syscall.MAP_PREFAULT_READ\":                            \"syscall\",\n\t\"syscall.MAP_PRIVATE\":                                  \"syscall\",\n\t\"syscall.MAP_RENAME\":                                   \"syscall\",\n\t\"syscall.MAP_RESERVED0080\":                             \"syscall\",\n\t\"syscall.MAP_RESERVED0100\":                             \"syscall\",\n\t\"syscall.MAP_SHARED\":                                   \"syscall\",\n\t\"syscall.MAP_STACK\":                                    \"syscall\",\n\t\"syscall.MAP_TRYFIXED\":                                 \"syscall\",\n\t\"syscall.MAP_TYPE\":                                     \"syscall\",\n\t\"syscall.MAP_WIRED\":                                    \"syscall\",\n\t\"syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE\":             \"syscall\",\n\t\"syscall.MAXLEN_IFDESCR\":                               \"syscall\",\n\t\"syscall.MAXLEN_PHYSADDR\":                              \"syscall\",\n\t\"syscall.MAX_ADAPTER_ADDRESS_LENGTH\":                   \"syscall\",\n\t\"syscall.MAX_ADAPTER_DESCRIPTION_LENGTH\":               \"syscall\",\n\t\"syscall.MAX_ADAPTER_NAME_LENGTH\":                      \"syscall\",\n\t\"syscall.MAX_COMPUTERNAME_LENGTH\":                      \"syscall\",\n\t\"syscall.MAX_INTERFACE_NAME_LEN\":                       \"syscall\",\n\t\"syscall.MAX_LONG_PATH\":                                \"syscall\",\n\t\"syscall.MAX_PATH\":                                     \"syscall\",\n\t\"syscall.MAX_PROTOCOL_CHAIN\":                           \"syscall\",\n\t\"syscall.MCL_CURRENT\":                                  \"syscall\",\n\t\"syscall.MCL_FUTURE\":                                   \"syscall\",\n\t\"syscall.MNT_DETACH\":                                   \"syscall\",\n\t\"syscall.MNT_EXPIRE\":                                   \"syscall\",\n\t\"syscall.MNT_FORCE\":                                    \"syscall\",\n\t\"syscall.MSG_BCAST\":                                    \"syscall\",\n\t\"syscall.MSG_CMSG_CLOEXEC\":                             \"syscall\",\n\t\"syscall.MSG_COMPAT\":                                   \"syscall\",\n\t\"syscall.MSG_CONFIRM\":                                  \"syscall\",\n\t\"syscall.MSG_CONTROLMBUF\":                              \"syscall\",\n\t\"syscall.MSG_CTRUNC\":                                   \"syscall\",\n\t\"syscall.MSG_DONTROUTE\":                                \"syscall\",\n\t\"syscall.MSG_DONTWAIT\":                                 \"syscall\",\n\t\"syscall.MSG_EOF\":                                      \"syscall\",\n\t\"syscall.MSG_EOR\":                                      \"syscall\",\n\t\"syscall.MSG_ERRQUEUE\":                                 \"syscall\",\n\t\"syscall.MSG_FASTOPEN\":                                 \"syscall\",\n\t\"syscall.MSG_FIN\":                                      \"syscall\",\n\t\"syscall.MSG_FLUSH\":                                    \"syscall\",\n\t\"syscall.MSG_HAVEMORE\":                                 \"syscall\",\n\t\"syscall.MSG_HOLD\":                                     \"syscall\",\n\t\"syscall.MSG_IOVUSRSPACE\":                              \"syscall\",\n\t\"syscall.MSG_LENUSRSPACE\":                              \"syscall\",\n\t\"syscall.MSG_MCAST\":                                    \"syscall\",\n\t\"syscall.MSG_MORE\":                                     \"syscall\",\n\t\"syscall.MSG_NAMEMBUF\":                                 \"syscall\",\n\t\"syscall.MSG_NBIO\":                                     \"syscall\",\n\t\"syscall.MSG_NEEDSA\":                                   \"syscall\",\n\t\"syscall.MSG_NOSIGNAL\":                                 \"syscall\",\n\t\"syscall.MSG_NOTIFICATION\":                             \"syscall\",\n\t\"syscall.MSG_OOB\":                                      \"syscall\",\n\t\"syscall.MSG_PEEK\":                                     \"syscall\",\n\t\"syscall.MSG_PROXY\":                                    \"syscall\",\n\t\"syscall.MSG_RCVMORE\":                                  \"syscall\",\n\t\"syscall.MSG_RST\":                                      \"syscall\",\n\t\"syscall.MSG_SEND\":                                     \"syscall\",\n\t\"syscall.MSG_SYN\":                                      \"syscall\",\n\t\"syscall.MSG_TRUNC\":                                    \"syscall\",\n\t\"syscall.MSG_TRYHARD\":                                  \"syscall\",\n\t\"syscall.MSG_USERFLAGS\":                                \"syscall\",\n\t\"syscall.MSG_WAITALL\":                                  \"syscall\",\n\t\"syscall.MSG_WAITFORONE\":                               \"syscall\",\n\t\"syscall.MSG_WAITSTREAM\":                               \"syscall\",\n\t\"syscall.MS_ACTIVE\":                                    \"syscall\",\n\t\"syscall.MS_ASYNC\":                                     \"syscall\",\n\t\"syscall.MS_BIND\":                                      \"syscall\",\n\t\"syscall.MS_DEACTIVATE\":                                \"syscall\",\n\t\"syscall.MS_DIRSYNC\":                                   \"syscall\",\n\t\"syscall.MS_INVALIDATE\":                                \"syscall\",\n\t\"syscall.MS_I_VERSION\":                                 \"syscall\",\n\t\"syscall.MS_KERNMOUNT\":                                 \"syscall\",\n\t\"syscall.MS_KILLPAGES\":                                 \"syscall\",\n\t\"syscall.MS_MANDLOCK\":                                  \"syscall\",\n\t\"syscall.MS_MGC_MSK\":                                   \"syscall\",\n\t\"syscall.MS_MGC_VAL\":                                   \"syscall\",\n\t\"syscall.MS_MOVE\":                                      \"syscall\",\n\t\"syscall.MS_NOATIME\":                                   \"syscall\",\n\t\"syscall.MS_NODEV\":                                     \"syscall\",\n\t\"syscall.MS_NODIRATIME\":                                \"syscall\",\n\t\"syscall.MS_NOEXEC\":                                    \"syscall\",\n\t\"syscall.MS_NOSUID\":                                    \"syscall\",\n\t\"syscall.MS_NOUSER\":                                    \"syscall\",\n\t\"syscall.MS_POSIXACL\":                                  \"syscall\",\n\t\"syscall.MS_PRIVATE\":                                   \"syscall\",\n\t\"syscall.MS_RDONLY\":                                    \"syscall\",\n\t\"syscall.MS_REC\":                                       \"syscall\",\n\t\"syscall.MS_RELATIME\":                                  \"syscall\",\n\t\"syscall.MS_REMOUNT\":                                   \"syscall\",\n\t\"syscall.MS_RMT_MASK\":                                  \"syscall\",\n\t\"syscall.MS_SHARED\":                                    \"syscall\",\n\t\"syscall.MS_SILENT\":                                    \"syscall\",\n\t\"syscall.MS_SLAVE\":                                     \"syscall\",\n\t\"syscall.MS_STRICTATIME\":                               \"syscall\",\n\t\"syscall.MS_SYNC\":                                      \"syscall\",\n\t\"syscall.MS_SYNCHRONOUS\":                               \"syscall\",\n\t\"syscall.MS_UNBINDABLE\":                                \"syscall\",\n\t\"syscall.Madvise\":                                      \"syscall\",\n\t\"syscall.MapViewOfFile\":                                \"syscall\",\n\t\"syscall.MaxTokenInfoClass\":                            \"syscall\",\n\t\"syscall.Mclpool\":                                      \"syscall\",\n\t\"syscall.MibIfRow\":                                     \"syscall\",\n\t\"syscall.Mkdir\":                                        \"syscall\",\n\t\"syscall.Mkdirat\":                                      \"syscall\",\n\t\"syscall.Mkfifo\":                                       \"syscall\",\n\t\"syscall.Mknod\":                                        \"syscall\",\n\t\"syscall.Mknodat\":                                      \"syscall\",\n\t\"syscall.Mlock\":                                        \"syscall\",\n\t\"syscall.Mlockall\":                                     \"syscall\",\n\t\"syscall.Mmap\":                                         \"syscall\",\n\t\"syscall.Mount\":                                        \"syscall\",\n\t\"syscall.MoveFile\":                                     \"syscall\",\n\t\"syscall.Mprotect\":                                     \"syscall\",\n\t\"syscall.Msghdr\":                                       \"syscall\",\n\t\"syscall.Munlock\":                                      \"syscall\",\n\t\"syscall.Munlockall\":                                   \"syscall\",\n\t\"syscall.Munmap\":                                       \"syscall\",\n\t\"syscall.MustLoadDLL\":                                  \"syscall\",\n\t\"syscall.NAME_MAX\":                                     \"syscall\",\n\t\"syscall.NETLINK_ADD_MEMBERSHIP\":                       \"syscall\",\n\t\"syscall.NETLINK_AUDIT\":                                \"syscall\",\n\t\"syscall.NETLINK_BROADCAST_ERROR\":                      \"syscall\",\n\t\"syscall.NETLINK_CONNECTOR\":                            \"syscall\",\n\t\"syscall.NETLINK_DNRTMSG\":                              \"syscall\",\n\t\"syscall.NETLINK_DROP_MEMBERSHIP\":                      \"syscall\",\n\t\"syscall.NETLINK_ECRYPTFS\":                             \"syscall\",\n\t\"syscall.NETLINK_FIB_LOOKUP\":                           \"syscall\",\n\t\"syscall.NETLINK_FIREWALL\":                             \"syscall\",\n\t\"syscall.NETLINK_GENERIC\":                              \"syscall\",\n\t\"syscall.NETLINK_INET_DIAG\":                            \"syscall\",\n\t\"syscall.NETLINK_IP6_FW\":                               \"syscall\",\n\t\"syscall.NETLINK_ISCSI\":                                \"syscall\",\n\t\"syscall.NETLINK_KOBJECT_UEVENT\":                       \"syscall\",\n\t\"syscall.NETLINK_NETFILTER\":                            \"syscall\",\n\t\"syscall.NETLINK_NFLOG\":                                \"syscall\",\n\t\"syscall.NETLINK_NO_ENOBUFS\":                           \"syscall\",\n\t\"syscall.NETLINK_PKTINFO\":                              \"syscall\",\n\t\"syscall.NETLINK_RDMA\":                                 \"syscall\",\n\t\"syscall.NETLINK_ROUTE\":                                \"syscall\",\n\t\"syscall.NETLINK_SCSITRANSPORT\":                        \"syscall\",\n\t\"syscall.NETLINK_SELINUX\":                              \"syscall\",\n\t\"syscall.NETLINK_UNUSED\":                               \"syscall\",\n\t\"syscall.NETLINK_USERSOCK\":                             \"syscall\",\n\t\"syscall.NETLINK_XFRM\":                                 \"syscall\",\n\t\"syscall.NET_RT_DUMP\":                                  \"syscall\",\n\t\"syscall.NET_RT_DUMP2\":                                 \"syscall\",\n\t\"syscall.NET_RT_FLAGS\":                                 \"syscall\",\n\t\"syscall.NET_RT_IFLIST\":                                \"syscall\",\n\t\"syscall.NET_RT_IFLIST2\":                               \"syscall\",\n\t\"syscall.NET_RT_IFLISTL\":                               \"syscall\",\n\t\"syscall.NET_RT_IFMALIST\":                              \"syscall\",\n\t\"syscall.NET_RT_MAXID\":                                 \"syscall\",\n\t\"syscall.NET_RT_OIFLIST\":                               \"syscall\",\n\t\"syscall.NET_RT_OOIFLIST\":                              \"syscall\",\n\t\"syscall.NET_RT_STAT\":                                  \"syscall\",\n\t\"syscall.NET_RT_STATS\":                                 \"syscall\",\n\t\"syscall.NET_RT_TABLE\":                                 \"syscall\",\n\t\"syscall.NET_RT_TRASH\":                                 \"syscall\",\n\t\"syscall.NLA_ALIGNTO\":                                  \"syscall\",\n\t\"syscall.NLA_F_NESTED\":                                 \"syscall\",\n\t\"syscall.NLA_F_NET_BYTEORDER\":                          \"syscall\",\n\t\"syscall.NLA_HDRLEN\":                                   \"syscall\",\n\t\"syscall.NLMSG_ALIGNTO\":                                \"syscall\",\n\t\"syscall.NLMSG_DONE\":                                   \"syscall\",\n\t\"syscall.NLMSG_ERROR\":                                  \"syscall\",\n\t\"syscall.NLMSG_HDRLEN\":                                 \"syscall\",\n\t\"syscall.NLMSG_MIN_TYPE\":                               \"syscall\",\n\t\"syscall.NLMSG_NOOP\":                                   \"syscall\",\n\t\"syscall.NLMSG_OVERRUN\":                                \"syscall\",\n\t\"syscall.NLM_F_ACK\":                                    \"syscall\",\n\t\"syscall.NLM_F_APPEND\":                                 \"syscall\",\n\t\"syscall.NLM_F_ATOMIC\":                                 \"syscall\",\n\t\"syscall.NLM_F_CREATE\":                                 \"syscall\",\n\t\"syscall.NLM_F_DUMP\":                                   \"syscall\",\n\t\"syscall.NLM_F_ECHO\":                                   \"syscall\",\n\t\"syscall.NLM_F_EXCL\":                                   \"syscall\",\n\t\"syscall.NLM_F_MATCH\":                                  \"syscall\",\n\t\"syscall.NLM_F_MULTI\":                                  \"syscall\",\n\t\"syscall.NLM_F_REPLACE\":                                \"syscall\",\n\t\"syscall.NLM_F_REQUEST\":                                \"syscall\",\n\t\"syscall.NLM_F_ROOT\":                                   \"syscall\",\n\t\"syscall.NOFLSH\":                                       \"syscall\",\n\t\"syscall.NOTE_ABSOLUTE\":                                \"syscall\",\n\t\"syscall.NOTE_ATTRIB\":                                  \"syscall\",\n\t\"syscall.NOTE_CHILD\":                                   \"syscall\",\n\t\"syscall.NOTE_DELETE\":                                  \"syscall\",\n\t\"syscall.NOTE_EOF\":                                     \"syscall\",\n\t\"syscall.NOTE_EXEC\":                                    \"syscall\",\n\t\"syscall.NOTE_EXIT\":                                    \"syscall\",\n\t\"syscall.NOTE_EXITSTATUS\":                              \"syscall\",\n\t\"syscall.NOTE_EXTEND\":                                  \"syscall\",\n\t\"syscall.NOTE_FFAND\":                                   \"syscall\",\n\t\"syscall.NOTE_FFCOPY\":                                  \"syscall\",\n\t\"syscall.NOTE_FFCTRLMASK\":                              \"syscall\",\n\t\"syscall.NOTE_FFLAGSMASK\":                              \"syscall\",\n\t\"syscall.NOTE_FFNOP\":                                   \"syscall\",\n\t\"syscall.NOTE_FFOR\":                                    \"syscall\",\n\t\"syscall.NOTE_FORK\":                                    \"syscall\",\n\t\"syscall.NOTE_LINK\":                                    \"syscall\",\n\t\"syscall.NOTE_LOWAT\":                                   \"syscall\",\n\t\"syscall.NOTE_NONE\":                                    \"syscall\",\n\t\"syscall.NOTE_NSECONDS\":                                \"syscall\",\n\t\"syscall.NOTE_PCTRLMASK\":                               \"syscall\",\n\t\"syscall.NOTE_PDATAMASK\":                               \"syscall\",\n\t\"syscall.NOTE_REAP\":                                    \"syscall\",\n\t\"syscall.NOTE_RENAME\":                                  \"syscall\",\n\t\"syscall.NOTE_RESOURCEEND\":                             \"syscall\",\n\t\"syscall.NOTE_REVOKE\":                                  \"syscall\",\n\t\"syscall.NOTE_SECONDS\":                                 \"syscall\",\n\t\"syscall.NOTE_SIGNAL\":                                  \"syscall\",\n\t\"syscall.NOTE_TRACK\":                                   \"syscall\",\n\t\"syscall.NOTE_TRACKERR\":                                \"syscall\",\n\t\"syscall.NOTE_TRIGGER\":                                 \"syscall\",\n\t\"syscall.NOTE_TRUNCATE\":                                \"syscall\",\n\t\"syscall.NOTE_USECONDS\":                                \"syscall\",\n\t\"syscall.NOTE_VM_ERROR\":                                \"syscall\",\n\t\"syscall.NOTE_VM_PRESSURE\":                             \"syscall\",\n\t\"syscall.NOTE_VM_PRESSURE_SUDDEN_TERMINATE\":            \"syscall\",\n\t\"syscall.NOTE_VM_PRESSURE_TERMINATE\":                   \"syscall\",\n\t\"syscall.NOTE_WRITE\":                                   \"syscall\",\n\t\"syscall.NameCanonical\":                                \"syscall\",\n\t\"syscall.NameCanonicalEx\":                              \"syscall\",\n\t\"syscall.NameDisplay\":                                  \"syscall\",\n\t\"syscall.NameDnsDomain\":                                \"syscall\",\n\t\"syscall.NameFullyQualifiedDN\":                         \"syscall\",\n\t\"syscall.NameSamCompatible\":                            \"syscall\",\n\t\"syscall.NameServicePrincipal\":                         \"syscall\",\n\t\"syscall.NameUniqueId\":                                 \"syscall\",\n\t\"syscall.NameUnknown\":                                  \"syscall\",\n\t\"syscall.NameUserPrincipal\":                            \"syscall\",\n\t\"syscall.Nanosleep\":                                    \"syscall\",\n\t\"syscall.NetApiBufferFree\":                             \"syscall\",\n\t\"syscall.NetGetJoinInformation\":                        \"syscall\",\n\t\"syscall.NetSetupDomainName\":                           \"syscall\",\n\t\"syscall.NetSetupUnjoined\":                             \"syscall\",\n\t\"syscall.NetSetupUnknownStatus\":                        \"syscall\",\n\t\"syscall.NetSetupWorkgroupName\":                        \"syscall\",\n\t\"syscall.NetUserGetInfo\":                               \"syscall\",\n\t\"syscall.NetlinkMessage\":                               \"syscall\",\n\t\"syscall.NetlinkRIB\":                                   \"syscall\",\n\t\"syscall.NetlinkRouteAttr\":                             \"syscall\",\n\t\"syscall.NetlinkRouteRequest\":                          \"syscall\",\n\t\"syscall.NewCallback\":                                  \"syscall\",\n\t\"syscall.NewCallbackCDecl\":                             \"syscall\",\n\t\"syscall.NewLazyDLL\":                                   \"syscall\",\n\t\"syscall.NlAttr\":                                       \"syscall\",\n\t\"syscall.NlMsgerr\":                                     \"syscall\",\n\t\"syscall.NlMsghdr\":                                     \"syscall\",\n\t\"syscall.NsecToFiletime\":                               \"syscall\",\n\t\"syscall.NsecToTimespec\":                               \"syscall\",\n\t\"syscall.NsecToTimeval\":                                \"syscall\",\n\t\"syscall.Ntohs\":                                        \"syscall\",\n\t\"syscall.OCRNL\":                                        \"syscall\",\n\t\"syscall.OFDEL\":                                        \"syscall\",\n\t\"syscall.OFILL\":                                        \"syscall\",\n\t\"syscall.OFIOGETBMAP\":                                  \"syscall\",\n\t\"syscall.OID_PKIX_KP_SERVER_AUTH\":                      \"syscall\",\n\t\"syscall.OID_SERVER_GATED_CRYPTO\":                      \"syscall\",\n\t\"syscall.OID_SGC_NETSCAPE\":                             \"syscall\",\n\t\"syscall.OLCUC\":                                        \"syscall\",\n\t\"syscall.ONLCR\":                                        \"syscall\",\n\t\"syscall.ONLRET\":                                       \"syscall\",\n\t\"syscall.ONOCR\":                                        \"syscall\",\n\t\"syscall.ONOEOT\":                                       \"syscall\",\n\t\"syscall.OPEN_ALWAYS\":                                  \"syscall\",\n\t\"syscall.OPEN_EXISTING\":                                \"syscall\",\n\t\"syscall.OPOST\":                                        \"syscall\",\n\t\"syscall.O_ACCMODE\":                                    \"syscall\",\n\t\"syscall.O_ALERT\":                                      \"syscall\",\n\t\"syscall.O_ALT_IO\":                                     \"syscall\",\n\t\"syscall.O_APPEND\":                                     \"syscall\",\n\t\"syscall.O_ASYNC\":                                      \"syscall\",\n\t\"syscall.O_CLOEXEC\":                                    \"syscall\",\n\t\"syscall.O_CREAT\":                                      \"syscall\",\n\t\"syscall.O_DIRECT\":                                     \"syscall\",\n\t\"syscall.O_DIRECTORY\":                                  \"syscall\",\n\t\"syscall.O_DSYNC\":                                      \"syscall\",\n\t\"syscall.O_EVTONLY\":                                    \"syscall\",\n\t\"syscall.O_EXCL\":                                       \"syscall\",\n\t\"syscall.O_EXEC\":                                       \"syscall\",\n\t\"syscall.O_EXLOCK\":                                     \"syscall\",\n\t\"syscall.O_FSYNC\":                                      \"syscall\",\n\t\"syscall.O_LARGEFILE\":                                  \"syscall\",\n\t\"syscall.O_NDELAY\":                                     \"syscall\",\n\t\"syscall.O_NOATIME\":                                    \"syscall\",\n\t\"syscall.O_NOCTTY\":                                     \"syscall\",\n\t\"syscall.O_NOFOLLOW\":                                   \"syscall\",\n\t\"syscall.O_NONBLOCK\":                                   \"syscall\",\n\t\"syscall.O_NOSIGPIPE\":                                  \"syscall\",\n\t\"syscall.O_POPUP\":                                      \"syscall\",\n\t\"syscall.O_RDONLY\":                                     \"syscall\",\n\t\"syscall.O_RDWR\":                                       \"syscall\",\n\t\"syscall.O_RSYNC\":                                      \"syscall\",\n\t\"syscall.O_SHLOCK\":                                     \"syscall\",\n\t\"syscall.O_SYMLINK\":                                    \"syscall\",\n\t\"syscall.O_SYNC\":                                       \"syscall\",\n\t\"syscall.O_TRUNC\":                                      \"syscall\",\n\t\"syscall.O_TTY_INIT\":                                   \"syscall\",\n\t\"syscall.O_WRONLY\":                                     \"syscall\",\n\t\"syscall.Open\":                                         \"syscall\",\n\t\"syscall.OpenCurrentProcessToken\":                      \"syscall\",\n\t\"syscall.OpenProcess\":                                  \"syscall\",\n\t\"syscall.OpenProcessToken\":                             \"syscall\",\n\t\"syscall.Openat\":                                       \"syscall\",\n\t\"syscall.Overlapped\":                                   \"syscall\",\n\t\"syscall.PACKET_ADD_MEMBERSHIP\":                        \"syscall\",\n\t\"syscall.PACKET_BROADCAST\":                             \"syscall\",\n\t\"syscall.PACKET_DROP_MEMBERSHIP\":                       \"syscall\",\n\t\"syscall.PACKET_FASTROUTE\":                             \"syscall\",\n\t\"syscall.PACKET_HOST\":                                  \"syscall\",\n\t\"syscall.PACKET_LOOPBACK\":                              \"syscall\",\n\t\"syscall.PACKET_MR_ALLMULTI\":                           \"syscall\",\n\t\"syscall.PACKET_MR_MULTICAST\":                          \"syscall\",\n\t\"syscall.PACKET_MR_PROMISC\":                            \"syscall\",\n\t\"syscall.PACKET_MULTICAST\":                             \"syscall\",\n\t\"syscall.PACKET_OTHERHOST\":                             \"syscall\",\n\t\"syscall.PACKET_OUTGOING\":                              \"syscall\",\n\t\"syscall.PACKET_RECV_OUTPUT\":                           \"syscall\",\n\t\"syscall.PACKET_RX_RING\":                               \"syscall\",\n\t\"syscall.PACKET_STATISTICS\":                            \"syscall\",\n\t\"syscall.PAGE_EXECUTE_READ\":                            \"syscall\",\n\t\"syscall.PAGE_EXECUTE_READWRITE\":                       \"syscall\",\n\t\"syscall.PAGE_EXECUTE_WRITECOPY\":                       \"syscall\",\n\t\"syscall.PAGE_READONLY\":                                \"syscall\",\n\t\"syscall.PAGE_READWRITE\":                               \"syscall\",\n\t\"syscall.PAGE_WRITECOPY\":                               \"syscall\",\n\t\"syscall.PARENB\":                                       \"syscall\",\n\t\"syscall.PARMRK\":                                       \"syscall\",\n\t\"syscall.PARODD\":                                       \"syscall\",\n\t\"syscall.PENDIN\":                                       \"syscall\",\n\t\"syscall.PFL_HIDDEN\":                                   \"syscall\",\n\t\"syscall.PFL_MATCHES_PROTOCOL_ZERO\":                    \"syscall\",\n\t\"syscall.PFL_MULTIPLE_PROTO_ENTRIES\":                   \"syscall\",\n\t\"syscall.PFL_NETWORKDIRECT_PROVIDER\":                   \"syscall\",\n\t\"syscall.PFL_RECOMMENDED_PROTO_ENTRY\":                  \"syscall\",\n\t\"syscall.PF_FLUSH\":                                     \"syscall\",\n\t\"syscall.PKCS_7_ASN_ENCODING\":                          \"syscall\",\n\t\"syscall.PMC5_PIPELINE_FLUSH\":                          \"syscall\",\n\t\"syscall.PRIO_PGRP\":                                    \"syscall\",\n\t\"syscall.PRIO_PROCESS\":                                 \"syscall\",\n\t\"syscall.PRIO_USER\":                                    \"syscall\",\n\t\"syscall.PRI_IOFLUSH\":                                  \"syscall\",\n\t\"syscall.PROCESS_QUERY_INFORMATION\":                    \"syscall\",\n\t\"syscall.PROCESS_TERMINATE\":                            \"syscall\",\n\t\"syscall.PROT_EXEC\":                                    \"syscall\",\n\t\"syscall.PROT_GROWSDOWN\":                               \"syscall\",\n\t\"syscall.PROT_GROWSUP\":                                 \"syscall\",\n\t\"syscall.PROT_NONE\":                                    \"syscall\",\n\t\"syscall.PROT_READ\":                                    \"syscall\",\n\t\"syscall.PROT_WRITE\":                                   \"syscall\",\n\t\"syscall.PROV_DH_SCHANNEL\":                             \"syscall\",\n\t\"syscall.PROV_DSS\":                                     \"syscall\",\n\t\"syscall.PROV_DSS_DH\":                                  \"syscall\",\n\t\"syscall.PROV_EC_ECDSA_FULL\":                           \"syscall\",\n\t\"syscall.PROV_EC_ECDSA_SIG\":                            \"syscall\",\n\t\"syscall.PROV_EC_ECNRA_FULL\":                           \"syscall\",\n\t\"syscall.PROV_EC_ECNRA_SIG\":                            \"syscall\",\n\t\"syscall.PROV_FORTEZZA\":                                \"syscall\",\n\t\"syscall.PROV_INTEL_SEC\":                               \"syscall\",\n\t\"syscall.PROV_MS_EXCHANGE\":                             \"syscall\",\n\t\"syscall.PROV_REPLACE_OWF\":                             \"syscall\",\n\t\"syscall.PROV_RNG\":                                     \"syscall\",\n\t\"syscall.PROV_RSA_AES\":                                 \"syscall\",\n\t\"syscall.PROV_RSA_FULL\":                                \"syscall\",\n\t\"syscall.PROV_RSA_SCHANNEL\":                            \"syscall\",\n\t\"syscall.PROV_RSA_SIG\":                                 \"syscall\",\n\t\"syscall.PROV_SPYRUS_LYNKS\":                            \"syscall\",\n\t\"syscall.PROV_SSL\":                                     \"syscall\",\n\t\"syscall.PR_CAPBSET_DROP\":                              \"syscall\",\n\t\"syscall.PR_CAPBSET_READ\":                              \"syscall\",\n\t\"syscall.PR_CLEAR_SECCOMP_FILTER\":                      \"syscall\",\n\t\"syscall.PR_ENDIAN_BIG\":                                \"syscall\",\n\t\"syscall.PR_ENDIAN_LITTLE\":                             \"syscall\",\n\t\"syscall.PR_ENDIAN_PPC_LITTLE\":                         \"syscall\",\n\t\"syscall.PR_FPEMU_NOPRINT\":                             \"syscall\",\n\t\"syscall.PR_FPEMU_SIGFPE\":                              \"syscall\",\n\t\"syscall.PR_FP_EXC_ASYNC\":                              \"syscall\",\n\t\"syscall.PR_FP_EXC_DISABLED\":                           \"syscall\",\n\t\"syscall.PR_FP_EXC_DIV\":                                \"syscall\",\n\t\"syscall.PR_FP_EXC_INV\":                                \"syscall\",\n\t\"syscall.PR_FP_EXC_NONRECOV\":                           \"syscall\",\n\t\"syscall.PR_FP_EXC_OVF\":                                \"syscall\",\n\t\"syscall.PR_FP_EXC_PRECISE\":                            \"syscall\",\n\t\"syscall.PR_FP_EXC_RES\":                                \"syscall\",\n\t\"syscall.PR_FP_EXC_SW_ENABLE\":                          \"syscall\",\n\t\"syscall.PR_FP_EXC_UND\":                                \"syscall\",\n\t\"syscall.PR_GET_DUMPABLE\":                              \"syscall\",\n\t\"syscall.PR_GET_ENDIAN\":                                \"syscall\",\n\t\"syscall.PR_GET_FPEMU\":                                 \"syscall\",\n\t\"syscall.PR_GET_FPEXC\":                                 \"syscall\",\n\t\"syscall.PR_GET_KEEPCAPS\":                              \"syscall\",\n\t\"syscall.PR_GET_NAME\":                                  \"syscall\",\n\t\"syscall.PR_GET_PDEATHSIG\":                             \"syscall\",\n\t\"syscall.PR_GET_SECCOMP\":                               \"syscall\",\n\t\"syscall.PR_GET_SECCOMP_FILTER\":                        \"syscall\",\n\t\"syscall.PR_GET_SECUREBITS\":                            \"syscall\",\n\t\"syscall.PR_GET_TIMERSLACK\":                            \"syscall\",\n\t\"syscall.PR_GET_TIMING\":                                \"syscall\",\n\t\"syscall.PR_GET_TSC\":                                   \"syscall\",\n\t\"syscall.PR_GET_UNALIGN\":                               \"syscall\",\n\t\"syscall.PR_MCE_KILL\":                                  \"syscall\",\n\t\"syscall.PR_MCE_KILL_CLEAR\":                            \"syscall\",\n\t\"syscall.PR_MCE_KILL_DEFAULT\":                          \"syscall\",\n\t\"syscall.PR_MCE_KILL_EARLY\":                            \"syscall\",\n\t\"syscall.PR_MCE_KILL_GET\":                              \"syscall\",\n\t\"syscall.PR_MCE_KILL_LATE\":                             \"syscall\",\n\t\"syscall.PR_MCE_KILL_SET\":                              \"syscall\",\n\t\"syscall.PR_SECCOMP_FILTER_EVENT\":                      \"syscall\",\n\t\"syscall.PR_SECCOMP_FILTER_SYSCALL\":                    \"syscall\",\n\t\"syscall.PR_SET_DUMPABLE\":                              \"syscall\",\n\t\"syscall.PR_SET_ENDIAN\":                                \"syscall\",\n\t\"syscall.PR_SET_FPEMU\":                                 \"syscall\",\n\t\"syscall.PR_SET_FPEXC\":                                 \"syscall\",\n\t\"syscall.PR_SET_KEEPCAPS\":                              \"syscall\",\n\t\"syscall.PR_SET_NAME\":                                  \"syscall\",\n\t\"syscall.PR_SET_PDEATHSIG\":                             \"syscall\",\n\t\"syscall.PR_SET_PTRACER\":                               \"syscall\",\n\t\"syscall.PR_SET_SECCOMP\":                               \"syscall\",\n\t\"syscall.PR_SET_SECCOMP_FILTER\":                        \"syscall\",\n\t\"syscall.PR_SET_SECUREBITS\":                            \"syscall\",\n\t\"syscall.PR_SET_TIMERSLACK\":                            \"syscall\",\n\t\"syscall.PR_SET_TIMING\":                                \"syscall\",\n\t\"syscall.PR_SET_TSC\":                                   \"syscall\",\n\t\"syscall.PR_SET_UNALIGN\":                               \"syscall\",\n\t\"syscall.PR_TASK_PERF_EVENTS_DISABLE\":                  \"syscall\",\n\t\"syscall.PR_TASK_PERF_EVENTS_ENABLE\":                   \"syscall\",\n\t\"syscall.PR_TIMING_STATISTICAL\":                        \"syscall\",\n\t\"syscall.PR_TIMING_TIMESTAMP\":                          \"syscall\",\n\t\"syscall.PR_TSC_ENABLE\":                                \"syscall\",\n\t\"syscall.PR_TSC_SIGSEGV\":                               \"syscall\",\n\t\"syscall.PR_UNALIGN_NOPRINT\":                           \"syscall\",\n\t\"syscall.PR_UNALIGN_SIGBUS\":                            \"syscall\",\n\t\"syscall.PTRACE_ARCH_PRCTL\":                            \"syscall\",\n\t\"syscall.PTRACE_ATTACH\":                                \"syscall\",\n\t\"syscall.PTRACE_CONT\":                                  \"syscall\",\n\t\"syscall.PTRACE_DETACH\":                                \"syscall\",\n\t\"syscall.PTRACE_EVENT_CLONE\":                           \"syscall\",\n\t\"syscall.PTRACE_EVENT_EXEC\":                            \"syscall\",\n\t\"syscall.PTRACE_EVENT_EXIT\":                            \"syscall\",\n\t\"syscall.PTRACE_EVENT_FORK\":                            \"syscall\",\n\t\"syscall.PTRACE_EVENT_VFORK\":                           \"syscall\",\n\t\"syscall.PTRACE_EVENT_VFORK_DONE\":                      \"syscall\",\n\t\"syscall.PTRACE_GETCRUNCHREGS\":                         \"syscall\",\n\t\"syscall.PTRACE_GETEVENTMSG\":                           \"syscall\",\n\t\"syscall.PTRACE_GETFPREGS\":                             \"syscall\",\n\t\"syscall.PTRACE_GETFPXREGS\":                            \"syscall\",\n\t\"syscall.PTRACE_GETHBPREGS\":                            \"syscall\",\n\t\"syscall.PTRACE_GETREGS\":                               \"syscall\",\n\t\"syscall.PTRACE_GETREGSET\":                             \"syscall\",\n\t\"syscall.PTRACE_GETSIGINFO\":                            \"syscall\",\n\t\"syscall.PTRACE_GETVFPREGS\":                            \"syscall\",\n\t\"syscall.PTRACE_GETWMMXREGS\":                           \"syscall\",\n\t\"syscall.PTRACE_GET_THREAD_AREA\":                       \"syscall\",\n\t\"syscall.PTRACE_KILL\":                                  \"syscall\",\n\t\"syscall.PTRACE_OLDSETOPTIONS\":                         \"syscall\",\n\t\"syscall.PTRACE_O_MASK\":                                \"syscall\",\n\t\"syscall.PTRACE_O_TRACECLONE\":                          \"syscall\",\n\t\"syscall.PTRACE_O_TRACEEXEC\":                           \"syscall\",\n\t\"syscall.PTRACE_O_TRACEEXIT\":                           \"syscall\",\n\t\"syscall.PTRACE_O_TRACEFORK\":                           \"syscall\",\n\t\"syscall.PTRACE_O_TRACESYSGOOD\":                        \"syscall\",\n\t\"syscall.PTRACE_O_TRACEVFORK\":                          \"syscall\",\n\t\"syscall.PTRACE_O_TRACEVFORKDONE\":                      \"syscall\",\n\t\"syscall.PTRACE_PEEKDATA\":                              \"syscall\",\n\t\"syscall.PTRACE_PEEKTEXT\":                              \"syscall\",\n\t\"syscall.PTRACE_PEEKUSR\":                               \"syscall\",\n\t\"syscall.PTRACE_POKEDATA\":                              \"syscall\",\n\t\"syscall.PTRACE_POKETEXT\":                              \"syscall\",\n\t\"syscall.PTRACE_POKEUSR\":                               \"syscall\",\n\t\"syscall.PTRACE_SETCRUNCHREGS\":                         \"syscall\",\n\t\"syscall.PTRACE_SETFPREGS\":                             \"syscall\",\n\t\"syscall.PTRACE_SETFPXREGS\":                            \"syscall\",\n\t\"syscall.PTRACE_SETHBPREGS\":                            \"syscall\",\n\t\"syscall.PTRACE_SETOPTIONS\":                            \"syscall\",\n\t\"syscall.PTRACE_SETREGS\":                               \"syscall\",\n\t\"syscall.PTRACE_SETREGSET\":                             \"syscall\",\n\t\"syscall.PTRACE_SETSIGINFO\":                            \"syscall\",\n\t\"syscall.PTRACE_SETVFPREGS\":                            \"syscall\",\n\t\"syscall.PTRACE_SETWMMXREGS\":                           \"syscall\",\n\t\"syscall.PTRACE_SET_SYSCALL\":                           \"syscall\",\n\t\"syscall.PTRACE_SET_THREAD_AREA\":                       \"syscall\",\n\t\"syscall.PTRACE_SINGLEBLOCK\":                           \"syscall\",\n\t\"syscall.PTRACE_SINGLESTEP\":                            \"syscall\",\n\t\"syscall.PTRACE_SYSCALL\":                               \"syscall\",\n\t\"syscall.PTRACE_SYSEMU\":                                \"syscall\",\n\t\"syscall.PTRACE_SYSEMU_SINGLESTEP\":                     \"syscall\",\n\t\"syscall.PTRACE_TRACEME\":                               \"syscall\",\n\t\"syscall.PT_ATTACH\":                                    \"syscall\",\n\t\"syscall.PT_ATTACHEXC\":                                 \"syscall\",\n\t\"syscall.PT_CONTINUE\":                                  \"syscall\",\n\t\"syscall.PT_DATA_ADDR\":                                 \"syscall\",\n\t\"syscall.PT_DENY_ATTACH\":                               \"syscall\",\n\t\"syscall.PT_DETACH\":                                    \"syscall\",\n\t\"syscall.PT_FIRSTMACH\":                                 \"syscall\",\n\t\"syscall.PT_FORCEQUOTA\":                                \"syscall\",\n\t\"syscall.PT_KILL\":                                      \"syscall\",\n\t\"syscall.PT_MASK\":                                      \"syscall\",\n\t\"syscall.PT_READ_D\":                                    \"syscall\",\n\t\"syscall.PT_READ_I\":                                    \"syscall\",\n\t\"syscall.PT_READ_U\":                                    \"syscall\",\n\t\"syscall.PT_SIGEXC\":                                    \"syscall\",\n\t\"syscall.PT_STEP\":                                      \"syscall\",\n\t\"syscall.PT_TEXT_ADDR\":                                 \"syscall\",\n\t\"syscall.PT_TEXT_END_ADDR\":                             \"syscall\",\n\t\"syscall.PT_THUPDATE\":                                  \"syscall\",\n\t\"syscall.PT_TRACE_ME\":                                  \"syscall\",\n\t\"syscall.PT_WRITE_D\":                                   \"syscall\",\n\t\"syscall.PT_WRITE_I\":                                   \"syscall\",\n\t\"syscall.PT_WRITE_U\":                                   \"syscall\",\n\t\"syscall.ParseDirent\":                                  \"syscall\",\n\t\"syscall.ParseNetlinkMessage\":                          \"syscall\",\n\t\"syscall.ParseNetlinkRouteAttr\":                        \"syscall\",\n\t\"syscall.ParseRoutingMessage\":                          \"syscall\",\n\t\"syscall.ParseRoutingSockaddr\":                         \"syscall\",\n\t\"syscall.ParseSocketControlMessage\":                    \"syscall\",\n\t\"syscall.ParseUnixCredentials\":                         \"syscall\",\n\t\"syscall.ParseUnixRights\":                              \"syscall\",\n\t\"syscall.PathMax\":                                      \"syscall\",\n\t\"syscall.Pathconf\":                                     \"syscall\",\n\t\"syscall.Pause\":                                        \"syscall\",\n\t\"syscall.Pipe\":                                         \"syscall\",\n\t\"syscall.Pipe2\":                                        \"syscall\",\n\t\"syscall.PivotRoot\":                                    \"syscall\",\n\t\"syscall.PostQueuedCompletionStatus\":                   \"syscall\",\n\t\"syscall.Pread\":                                        \"syscall\",\n\t\"syscall.Proc\":                                         \"syscall\",\n\t\"syscall.ProcAttr\":                                     \"syscall\",\n\t\"syscall.Process32First\":                               \"syscall\",\n\t\"syscall.Process32Next\":                                \"syscall\",\n\t\"syscall.ProcessEntry32\":                               \"syscall\",\n\t\"syscall.ProcessInformation\":                           \"syscall\",\n\t\"syscall.Protoent\":                                     \"syscall\",\n\t\"syscall.PtraceAttach\":                                 \"syscall\",\n\t\"syscall.PtraceCont\":                                   \"syscall\",\n\t\"syscall.PtraceDetach\":                                 \"syscall\",\n\t\"syscall.PtraceGetEventMsg\":                            \"syscall\",\n\t\"syscall.PtraceGetRegs\":                                \"syscall\",\n\t\"syscall.PtracePeekData\":                               \"syscall\",\n\t\"syscall.PtracePeekText\":                               \"syscall\",\n\t\"syscall.PtracePokeData\":                               \"syscall\",\n\t\"syscall.PtracePokeText\":                               \"syscall\",\n\t\"syscall.PtraceRegs\":                                   \"syscall\",\n\t\"syscall.PtraceSetOptions\":                             \"syscall\",\n\t\"syscall.PtraceSetRegs\":                                \"syscall\",\n\t\"syscall.PtraceSingleStep\":                             \"syscall\",\n\t\"syscall.PtraceSyscall\":                                \"syscall\",\n\t\"syscall.Pwrite\":                                       \"syscall\",\n\t\"syscall.REG_BINARY\":                                   \"syscall\",\n\t\"syscall.REG_DWORD\":                                    \"syscall\",\n\t\"syscall.REG_DWORD_BIG_ENDIAN\":                         \"syscall\",\n\t\"syscall.REG_DWORD_LITTLE_ENDIAN\":                      \"syscall\",\n\t\"syscall.REG_EXPAND_SZ\":                                \"syscall\",\n\t\"syscall.REG_FULL_RESOURCE_DESCRIPTOR\":                 \"syscall\",\n\t\"syscall.REG_LINK\":                                     \"syscall\",\n\t\"syscall.REG_MULTI_SZ\":                                 \"syscall\",\n\t\"syscall.REG_NONE\":                                     \"syscall\",\n\t\"syscall.REG_QWORD\":                                    \"syscall\",\n\t\"syscall.REG_QWORD_LITTLE_ENDIAN\":                      \"syscall\",\n\t\"syscall.REG_RESOURCE_LIST\":                            \"syscall\",\n\t\"syscall.REG_RESOURCE_REQUIREMENTS_LIST\":               \"syscall\",\n\t\"syscall.REG_SZ\":                                       \"syscall\",\n\t\"syscall.RLIMIT_AS\":                                    \"syscall\",\n\t\"syscall.RLIMIT_CORE\":                                  \"syscall\",\n\t\"syscall.RLIMIT_CPU\":                                   \"syscall\",\n\t\"syscall.RLIMIT_DATA\":                                  \"syscall\",\n\t\"syscall.RLIMIT_FSIZE\":                                 \"syscall\",\n\t\"syscall.RLIMIT_NOFILE\":                                \"syscall\",\n\t\"syscall.RLIMIT_STACK\":                                 \"syscall\",\n\t\"syscall.RLIM_INFINITY\":                                \"syscall\",\n\t\"syscall.RTAX_ADVMSS\":                                  \"syscall\",\n\t\"syscall.RTAX_AUTHOR\":                                  \"syscall\",\n\t\"syscall.RTAX_BRD\":                                     \"syscall\",\n\t\"syscall.RTAX_CWND\":                                    \"syscall\",\n\t\"syscall.RTAX_DST\":                                     \"syscall\",\n\t\"syscall.RTAX_FEATURES\":                                \"syscall\",\n\t\"syscall.RTAX_FEATURE_ALLFRAG\":                         \"syscall\",\n\t\"syscall.RTAX_FEATURE_ECN\":                             \"syscall\",\n\t\"syscall.RTAX_FEATURE_SACK\":                            \"syscall\",\n\t\"syscall.RTAX_FEATURE_TIMESTAMP\":                       \"syscall\",\n\t\"syscall.RTAX_GATEWAY\":                                 \"syscall\",\n\t\"syscall.RTAX_GENMASK\":                                 \"syscall\",\n\t\"syscall.RTAX_HOPLIMIT\":                                \"syscall\",\n\t\"syscall.RTAX_IFA\":                                     \"syscall\",\n\t\"syscall.RTAX_IFP\":                                     \"syscall\",\n\t\"syscall.RTAX_INITCWND\":                                \"syscall\",\n\t\"syscall.RTAX_INITRWND\":                                \"syscall\",\n\t\"syscall.RTAX_LABEL\":                                   \"syscall\",\n\t\"syscall.RTAX_LOCK\":                                    \"syscall\",\n\t\"syscall.RTAX_MAX\":                                     \"syscall\",\n\t\"syscall.RTAX_MTU\":                                     \"syscall\",\n\t\"syscall.RTAX_NETMASK\":                                 \"syscall\",\n\t\"syscall.RTAX_REORDERING\":                              \"syscall\",\n\t\"syscall.RTAX_RTO_MIN\":                                 \"syscall\",\n\t\"syscall.RTAX_RTT\":                                     \"syscall\",\n\t\"syscall.RTAX_RTTVAR\":                                  \"syscall\",\n\t\"syscall.RTAX_SRC\":                                     \"syscall\",\n\t\"syscall.RTAX_SRCMASK\":                                 \"syscall\",\n\t\"syscall.RTAX_SSTHRESH\":                                \"syscall\",\n\t\"syscall.RTAX_TAG\":                                     \"syscall\",\n\t\"syscall.RTAX_UNSPEC\":                                  \"syscall\",\n\t\"syscall.RTAX_WINDOW\":                                  \"syscall\",\n\t\"syscall.RTA_ALIGNTO\":                                  \"syscall\",\n\t\"syscall.RTA_AUTHOR\":                                   \"syscall\",\n\t\"syscall.RTA_BRD\":                                      \"syscall\",\n\t\"syscall.RTA_CACHEINFO\":                                \"syscall\",\n\t\"syscall.RTA_DST\":                                      \"syscall\",\n\t\"syscall.RTA_FLOW\":                                     \"syscall\",\n\t\"syscall.RTA_GATEWAY\":                                  \"syscall\",\n\t\"syscall.RTA_GENMASK\":                                  \"syscall\",\n\t\"syscall.RTA_IFA\":                                      \"syscall\",\n\t\"syscall.RTA_IFP\":                                      \"syscall\",\n\t\"syscall.RTA_IIF\":                                      \"syscall\",\n\t\"syscall.RTA_LABEL\":                                    \"syscall\",\n\t\"syscall.RTA_MAX\":                                      \"syscall\",\n\t\"syscall.RTA_METRICS\":                                  \"syscall\",\n\t\"syscall.RTA_MULTIPATH\":                                \"syscall\",\n\t\"syscall.RTA_NETMASK\":                                  \"syscall\",\n\t\"syscall.RTA_OIF\":                                      \"syscall\",\n\t\"syscall.RTA_PREFSRC\":                                  \"syscall\",\n\t\"syscall.RTA_PRIORITY\":                                 \"syscall\",\n\t\"syscall.RTA_SRC\":                                      \"syscall\",\n\t\"syscall.RTA_SRCMASK\":                                  \"syscall\",\n\t\"syscall.RTA_TABLE\":                                    \"syscall\",\n\t\"syscall.RTA_TAG\":                                      \"syscall\",\n\t\"syscall.RTA_UNSPEC\":                                   \"syscall\",\n\t\"syscall.RTCF_DIRECTSRC\":                               \"syscall\",\n\t\"syscall.RTCF_DOREDIRECT\":                              \"syscall\",\n\t\"syscall.RTCF_LOG\":                                     \"syscall\",\n\t\"syscall.RTCF_MASQ\":                                    \"syscall\",\n\t\"syscall.RTCF_NAT\":                                     \"syscall\",\n\t\"syscall.RTCF_VALVE\":                                   \"syscall\",\n\t\"syscall.RTF_ADDRCLASSMASK\":                            \"syscall\",\n\t\"syscall.RTF_ADDRCONF\":                                 \"syscall\",\n\t\"syscall.RTF_ALLONLINK\":                                \"syscall\",\n\t\"syscall.RTF_ANNOUNCE\":                                 \"syscall\",\n\t\"syscall.RTF_BLACKHOLE\":                                \"syscall\",\n\t\"syscall.RTF_BROADCAST\":                                \"syscall\",\n\t\"syscall.RTF_CACHE\":                                    \"syscall\",\n\t\"syscall.RTF_CLONED\":                                   \"syscall\",\n\t\"syscall.RTF_CLONING\":                                  \"syscall\",\n\t\"syscall.RTF_CONDEMNED\":                                \"syscall\",\n\t\"syscall.RTF_DEFAULT\":                                  \"syscall\",\n\t\"syscall.RTF_DELCLONE\":                                 \"syscall\",\n\t\"syscall.RTF_DONE\":                                     \"syscall\",\n\t\"syscall.RTF_DYNAMIC\":                                  \"syscall\",\n\t\"syscall.RTF_FLOW\":                                     \"syscall\",\n\t\"syscall.RTF_FMASK\":                                    \"syscall\",\n\t\"syscall.RTF_GATEWAY\":                                  \"syscall\",\n\t\"syscall.RTF_GWFLAG_COMPAT\":                            \"syscall\",\n\t\"syscall.RTF_HOST\":                                     \"syscall\",\n\t\"syscall.RTF_IFREF\":                                    \"syscall\",\n\t\"syscall.RTF_IFSCOPE\":                                  \"syscall\",\n\t\"syscall.RTF_INTERFACE\":                                \"syscall\",\n\t\"syscall.RTF_IRTT\":                                     \"syscall\",\n\t\"syscall.RTF_LINKRT\":                                   \"syscall\",\n\t\"syscall.RTF_LLDATA\":                                   \"syscall\",\n\t\"syscall.RTF_LLINFO\":                                   \"syscall\",\n\t\"syscall.RTF_LOCAL\":                                    \"syscall\",\n\t\"syscall.RTF_MASK\":                                     \"syscall\",\n\t\"syscall.RTF_MODIFIED\":                                 \"syscall\",\n\t\"syscall.RTF_MPATH\":                                    \"syscall\",\n\t\"syscall.RTF_MPLS\":                                     \"syscall\",\n\t\"syscall.RTF_MSS\":                                      \"syscall\",\n\t\"syscall.RTF_MTU\":                                      \"syscall\",\n\t\"syscall.RTF_MULTICAST\":                                \"syscall\",\n\t\"syscall.RTF_NAT\":                                      \"syscall\",\n\t\"syscall.RTF_NOFORWARD\":                                \"syscall\",\n\t\"syscall.RTF_NONEXTHOP\":                                \"syscall\",\n\t\"syscall.RTF_NOPMTUDISC\":                               \"syscall\",\n\t\"syscall.RTF_PERMANENT_ARP\":                            \"syscall\",\n\t\"syscall.RTF_PINNED\":                                   \"syscall\",\n\t\"syscall.RTF_POLICY\":                                   \"syscall\",\n\t\"syscall.RTF_PRCLONING\":                                \"syscall\",\n\t\"syscall.RTF_PROTO1\":                                   \"syscall\",\n\t\"syscall.RTF_PROTO2\":                                   \"syscall\",\n\t\"syscall.RTF_PROTO3\":                                   \"syscall\",\n\t\"syscall.RTF_REINSTATE\":                                \"syscall\",\n\t\"syscall.RTF_REJECT\":                                   \"syscall\",\n\t\"syscall.RTF_RNH_LOCKED\":                               \"syscall\",\n\t\"syscall.RTF_SOURCE\":                                   \"syscall\",\n\t\"syscall.RTF_SRC\":                                      \"syscall\",\n\t\"syscall.RTF_STATIC\":                                   \"syscall\",\n\t\"syscall.RTF_STICKY\":                                   \"syscall\",\n\t\"syscall.RTF_THROW\":                                    \"syscall\",\n\t\"syscall.RTF_TUNNEL\":                                   \"syscall\",\n\t\"syscall.RTF_UP\":                                       \"syscall\",\n\t\"syscall.RTF_USETRAILERS\":                              \"syscall\",\n\t\"syscall.RTF_WASCLONED\":                                \"syscall\",\n\t\"syscall.RTF_WINDOW\":                                   \"syscall\",\n\t\"syscall.RTF_XRESOLVE\":                                 \"syscall\",\n\t\"syscall.RTM_ADD\":                                      \"syscall\",\n\t\"syscall.RTM_BASE\":                                     \"syscall\",\n\t\"syscall.RTM_CHANGE\":                                   \"syscall\",\n\t\"syscall.RTM_CHGADDR\":                                  \"syscall\",\n\t\"syscall.RTM_DELACTION\":                                \"syscall\",\n\t\"syscall.RTM_DELADDR\":                                  \"syscall\",\n\t\"syscall.RTM_DELADDRLABEL\":                             \"syscall\",\n\t\"syscall.RTM_DELETE\":                                   \"syscall\",\n\t\"syscall.RTM_DELLINK\":                                  \"syscall\",\n\t\"syscall.RTM_DELMADDR\":                                 \"syscall\",\n\t\"syscall.RTM_DELNEIGH\":                                 \"syscall\",\n\t\"syscall.RTM_DELQDISC\":                                 \"syscall\",\n\t\"syscall.RTM_DELROUTE\":                                 \"syscall\",\n\t\"syscall.RTM_DELRULE\":                                  \"syscall\",\n\t\"syscall.RTM_DELTCLASS\":                                \"syscall\",\n\t\"syscall.RTM_DELTFILTER\":                               \"syscall\",\n\t\"syscall.RTM_DESYNC\":                                   \"syscall\",\n\t\"syscall.RTM_F_CLONED\":                                 \"syscall\",\n\t\"syscall.RTM_F_EQUALIZE\":                               \"syscall\",\n\t\"syscall.RTM_F_NOTIFY\":                                 \"syscall\",\n\t\"syscall.RTM_F_PREFIX\":                                 \"syscall\",\n\t\"syscall.RTM_GET\":                                      \"syscall\",\n\t\"syscall.RTM_GET2\":                                     \"syscall\",\n\t\"syscall.RTM_GETACTION\":                                \"syscall\",\n\t\"syscall.RTM_GETADDR\":                                  \"syscall\",\n\t\"syscall.RTM_GETADDRLABEL\":                             \"syscall\",\n\t\"syscall.RTM_GETANYCAST\":                               \"syscall\",\n\t\"syscall.RTM_GETDCB\":                                   \"syscall\",\n\t\"syscall.RTM_GETLINK\":                                  \"syscall\",\n\t\"syscall.RTM_GETMULTICAST\":                             \"syscall\",\n\t\"syscall.RTM_GETNEIGH\":                                 \"syscall\",\n\t\"syscall.RTM_GETNEIGHTBL\":                              \"syscall\",\n\t\"syscall.RTM_GETQDISC\":                                 \"syscall\",\n\t\"syscall.RTM_GETROUTE\":                                 \"syscall\",\n\t\"syscall.RTM_GETRULE\":                                  \"syscall\",\n\t\"syscall.RTM_GETTCLASS\":                                \"syscall\",\n\t\"syscall.RTM_GETTFILTER\":                               \"syscall\",\n\t\"syscall.RTM_IEEE80211\":                                \"syscall\",\n\t\"syscall.RTM_IFANNOUNCE\":                               \"syscall\",\n\t\"syscall.RTM_IFINFO\":                                   \"syscall\",\n\t\"syscall.RTM_IFINFO2\":                                  \"syscall\",\n\t\"syscall.RTM_LLINFO_UPD\":                               \"syscall\",\n\t\"syscall.RTM_LOCK\":                                     \"syscall\",\n\t\"syscall.RTM_LOSING\":                                   \"syscall\",\n\t\"syscall.RTM_MAX\":                                      \"syscall\",\n\t\"syscall.RTM_MAXSIZE\":                                  \"syscall\",\n\t\"syscall.RTM_MISS\":                                     \"syscall\",\n\t\"syscall.RTM_NEWACTION\":                                \"syscall\",\n\t\"syscall.RTM_NEWADDR\":                                  \"syscall\",\n\t\"syscall.RTM_NEWADDRLABEL\":                             \"syscall\",\n\t\"syscall.RTM_NEWLINK\":                                  \"syscall\",\n\t\"syscall.RTM_NEWMADDR\":                                 \"syscall\",\n\t\"syscall.RTM_NEWMADDR2\":                                \"syscall\",\n\t\"syscall.RTM_NEWNDUSEROPT\":                             \"syscall\",\n\t\"syscall.RTM_NEWNEIGH\":                                 \"syscall\",\n\t\"syscall.RTM_NEWNEIGHTBL\":                              \"syscall\",\n\t\"syscall.RTM_NEWPREFIX\":                                \"syscall\",\n\t\"syscall.RTM_NEWQDISC\":                                 \"syscall\",\n\t\"syscall.RTM_NEWROUTE\":                                 \"syscall\",\n\t\"syscall.RTM_NEWRULE\":                                  \"syscall\",\n\t\"syscall.RTM_NEWTCLASS\":                                \"syscall\",\n\t\"syscall.RTM_NEWTFILTER\":                               \"syscall\",\n\t\"syscall.RTM_NR_FAMILIES\":                              \"syscall\",\n\t\"syscall.RTM_NR_MSGTYPES\":                              \"syscall\",\n\t\"syscall.RTM_OIFINFO\":                                  \"syscall\",\n\t\"syscall.RTM_OLDADD\":                                   \"syscall\",\n\t\"syscall.RTM_OLDDEL\":                                   \"syscall\",\n\t\"syscall.RTM_OOIFINFO\":                                 \"syscall\",\n\t\"syscall.RTM_REDIRECT\":                                 \"syscall\",\n\t\"syscall.RTM_RESOLVE\":                                  \"syscall\",\n\t\"syscall.RTM_RTTUNIT\":                                  \"syscall\",\n\t\"syscall.RTM_SETDCB\":                                   \"syscall\",\n\t\"syscall.RTM_SETGATE\":                                  \"syscall\",\n\t\"syscall.RTM_SETLINK\":                                  \"syscall\",\n\t\"syscall.RTM_SETNEIGHTBL\":                              \"syscall\",\n\t\"syscall.RTM_VERSION\":                                  \"syscall\",\n\t\"syscall.RTNH_ALIGNTO\":                                 \"syscall\",\n\t\"syscall.RTNH_F_DEAD\":                                  \"syscall\",\n\t\"syscall.RTNH_F_ONLINK\":                                \"syscall\",\n\t\"syscall.RTNH_F_PERVASIVE\":                             \"syscall\",\n\t\"syscall.RTNLGRP_IPV4_IFADDR\":                          \"syscall\",\n\t\"syscall.RTNLGRP_IPV4_MROUTE\":                          \"syscall\",\n\t\"syscall.RTNLGRP_IPV4_ROUTE\":                           \"syscall\",\n\t\"syscall.RTNLGRP_IPV4_RULE\":                            \"syscall\",\n\t\"syscall.RTNLGRP_IPV6_IFADDR\":                          \"syscall\",\n\t\"syscall.RTNLGRP_IPV6_IFINFO\":                          \"syscall\",\n\t\"syscall.RTNLGRP_IPV6_MROUTE\":                          \"syscall\",\n\t\"syscall.RTNLGRP_IPV6_PREFIX\":                          \"syscall\",\n\t\"syscall.RTNLGRP_IPV6_ROUTE\":                           \"syscall\",\n\t\"syscall.RTNLGRP_IPV6_RULE\":                            \"syscall\",\n\t\"syscall.RTNLGRP_LINK\":                                 \"syscall\",\n\t\"syscall.RTNLGRP_ND_USEROPT\":                           \"syscall\",\n\t\"syscall.RTNLGRP_NEIGH\":                                \"syscall\",\n\t\"syscall.RTNLGRP_NONE\":                                 \"syscall\",\n\t\"syscall.RTNLGRP_NOTIFY\":                               \"syscall\",\n\t\"syscall.RTNLGRP_TC\":                                   \"syscall\",\n\t\"syscall.RTN_ANYCAST\":                                  \"syscall\",\n\t\"syscall.RTN_BLACKHOLE\":                                \"syscall\",\n\t\"syscall.RTN_BROADCAST\":                                \"syscall\",\n\t\"syscall.RTN_LOCAL\":                                    \"syscall\",\n\t\"syscall.RTN_MAX\":                                      \"syscall\",\n\t\"syscall.RTN_MULTICAST\":                                \"syscall\",\n\t\"syscall.RTN_NAT\":                                      \"syscall\",\n\t\"syscall.RTN_PROHIBIT\":                                 \"syscall\",\n\t\"syscall.RTN_THROW\":                                    \"syscall\",\n\t\"syscall.RTN_UNICAST\":                                  \"syscall\",\n\t\"syscall.RTN_UNREACHABLE\":                              \"syscall\",\n\t\"syscall.RTN_UNSPEC\":                                   \"syscall\",\n\t\"syscall.RTN_XRESOLVE\":                                 \"syscall\",\n\t\"syscall.RTPROT_BIRD\":                                  \"syscall\",\n\t\"syscall.RTPROT_BOOT\":                                  \"syscall\",\n\t\"syscall.RTPROT_DHCP\":                                  \"syscall\",\n\t\"syscall.RTPROT_DNROUTED\":                              \"syscall\",\n\t\"syscall.RTPROT_GATED\":                                 \"syscall\",\n\t\"syscall.RTPROT_KERNEL\":                                \"syscall\",\n\t\"syscall.RTPROT_MRT\":                                   \"syscall\",\n\t\"syscall.RTPROT_NTK\":                                   \"syscall\",\n\t\"syscall.RTPROT_RA\":                                    \"syscall\",\n\t\"syscall.RTPROT_REDIRECT\":                              \"syscall\",\n\t\"syscall.RTPROT_STATIC\":                                \"syscall\",\n\t\"syscall.RTPROT_UNSPEC\":                                \"syscall\",\n\t\"syscall.RTPROT_XORP\":                                  \"syscall\",\n\t\"syscall.RTPROT_ZEBRA\":                                 \"syscall\",\n\t\"syscall.RTV_EXPIRE\":                                   \"syscall\",\n\t\"syscall.RTV_HOPCOUNT\":                                 \"syscall\",\n\t\"syscall.RTV_MTU\":                                      \"syscall\",\n\t\"syscall.RTV_RPIPE\":                                    \"syscall\",\n\t\"syscall.RTV_RTT\":                                      \"syscall\",\n\t\"syscall.RTV_RTTVAR\":                                   \"syscall\",\n\t\"syscall.RTV_SPIPE\":                                    \"syscall\",\n\t\"syscall.RTV_SSTHRESH\":                                 \"syscall\",\n\t\"syscall.RTV_WEIGHT\":                                   \"syscall\",\n\t\"syscall.RT_CACHING_CONTEXT\":                           \"syscall\",\n\t\"syscall.RT_CLASS_DEFAULT\":                             \"syscall\",\n\t\"syscall.RT_CLASS_LOCAL\":                               \"syscall\",\n\t\"syscall.RT_CLASS_MAIN\":                                \"syscall\",\n\t\"syscall.RT_CLASS_MAX\":                                 \"syscall\",\n\t\"syscall.RT_CLASS_UNSPEC\":                              \"syscall\",\n\t\"syscall.RT_DEFAULT_FIB\":                               \"syscall\",\n\t\"syscall.RT_NORTREF\":                                   \"syscall\",\n\t\"syscall.RT_SCOPE_HOST\":                                \"syscall\",\n\t\"syscall.RT_SCOPE_LINK\":                                \"syscall\",\n\t\"syscall.RT_SCOPE_NOWHERE\":                             \"syscall\",\n\t\"syscall.RT_SCOPE_SITE\":                                \"syscall\",\n\t\"syscall.RT_SCOPE_UNIVERSE\":                            \"syscall\",\n\t\"syscall.RT_TABLEID_MAX\":                               \"syscall\",\n\t\"syscall.RT_TABLE_COMPAT\":                              \"syscall\",\n\t\"syscall.RT_TABLE_DEFAULT\":                             \"syscall\",\n\t\"syscall.RT_TABLE_LOCAL\":                               \"syscall\",\n\t\"syscall.RT_TABLE_MAIN\":                                \"syscall\",\n\t\"syscall.RT_TABLE_MAX\":                                 \"syscall\",\n\t\"syscall.RT_TABLE_UNSPEC\":                              \"syscall\",\n\t\"syscall.RUSAGE_CHILDREN\":                              \"syscall\",\n\t\"syscall.RUSAGE_SELF\":                                  \"syscall\",\n\t\"syscall.RUSAGE_THREAD\":                                \"syscall\",\n\t\"syscall.Radvisory_t\":                                  \"syscall\",\n\t\"syscall.RawSockaddr\":                                  \"syscall\",\n\t\"syscall.RawSockaddrAny\":                               \"syscall\",\n\t\"syscall.RawSockaddrDatalink\":                          \"syscall\",\n\t\"syscall.RawSockaddrInet4\":                             \"syscall\",\n\t\"syscall.RawSockaddrInet6\":                             \"syscall\",\n\t\"syscall.RawSockaddrLinklayer\":                         \"syscall\",\n\t\"syscall.RawSockaddrNetlink\":                           \"syscall\",\n\t\"syscall.RawSockaddrUnix\":                              \"syscall\",\n\t\"syscall.RawSyscall\":                                   \"syscall\",\n\t\"syscall.RawSyscall6\":                                  \"syscall\",\n\t\"syscall.Read\":                                         \"syscall\",\n\t\"syscall.ReadConsole\":                                  \"syscall\",\n\t\"syscall.ReadDirectoryChanges\":                         \"syscall\",\n\t\"syscall.ReadDirent\":                                   \"syscall\",\n\t\"syscall.ReadFile\":                                     \"syscall\",\n\t\"syscall.Readlink\":                                     \"syscall\",\n\t\"syscall.Reboot\":                                       \"syscall\",\n\t\"syscall.Recvfrom\":                                     \"syscall\",\n\t\"syscall.Recvmsg\":                                      \"syscall\",\n\t\"syscall.RegCloseKey\":                                  \"syscall\",\n\t\"syscall.RegEnumKeyEx\":                                 \"syscall\",\n\t\"syscall.RegOpenKeyEx\":                                 \"syscall\",\n\t\"syscall.RegQueryInfoKey\":                              \"syscall\",\n\t\"syscall.RegQueryValueEx\":                              \"syscall\",\n\t\"syscall.RemoveDirectory\":                              \"syscall\",\n\t\"syscall.Removexattr\":                                  \"syscall\",\n\t\"syscall.Rename\":                                       \"syscall\",\n\t\"syscall.Renameat\":                                     \"syscall\",\n\t\"syscall.Revoke\":                                       \"syscall\",\n\t\"syscall.Rlimit\":                                       \"syscall\",\n\t\"syscall.Rmdir\":                                        \"syscall\",\n\t\"syscall.RouteMessage\":                                 \"syscall\",\n\t\"syscall.RouteRIB\":                                     \"syscall\",\n\t\"syscall.RtAttr\":                                       \"syscall\",\n\t\"syscall.RtGenmsg\":                                     \"syscall\",\n\t\"syscall.RtMetrics\":                                    \"syscall\",\n\t\"syscall.RtMsg\":                                        \"syscall\",\n\t\"syscall.RtMsghdr\":                                     \"syscall\",\n\t\"syscall.RtNexthop\":                                    \"syscall\",\n\t\"syscall.Rusage\":                                       \"syscall\",\n\t\"syscall.SCM_BINTIME\":                                  \"syscall\",\n\t\"syscall.SCM_CREDENTIALS\":                              \"syscall\",\n\t\"syscall.SCM_CREDS\":                                    \"syscall\",\n\t\"syscall.SCM_RIGHTS\":                                   \"syscall\",\n\t\"syscall.SCM_TIMESTAMP\":                                \"syscall\",\n\t\"syscall.SCM_TIMESTAMPING\":                             \"syscall\",\n\t\"syscall.SCM_TIMESTAMPNS\":                              \"syscall\",\n\t\"syscall.SCM_TIMESTAMP_MONOTONIC\":                      \"syscall\",\n\t\"syscall.SHUT_RD\":                                      \"syscall\",\n\t\"syscall.SHUT_RDWR\":                                    \"syscall\",\n\t\"syscall.SHUT_WR\":                                      \"syscall\",\n\t\"syscall.SID\":                                          \"syscall\",\n\t\"syscall.SIDAndAttributes\":                             \"syscall\",\n\t\"syscall.SIGABRT\":                                      \"syscall\",\n\t\"syscall.SIGALRM\":                                      \"syscall\",\n\t\"syscall.SIGBUS\":                                       \"syscall\",\n\t\"syscall.SIGCHLD\":                                      \"syscall\",\n\t\"syscall.SIGCLD\":                                       \"syscall\",\n\t\"syscall.SIGCONT\":                                      \"syscall\",\n\t\"syscall.SIGEMT\":                                       \"syscall\",\n\t\"syscall.SIGFPE\":                                       \"syscall\",\n\t\"syscall.SIGHUP\":                                       \"syscall\",\n\t\"syscall.SIGILL\":                                       \"syscall\",\n\t\"syscall.SIGINFO\":                                      \"syscall\",\n\t\"syscall.SIGINT\":                                       \"syscall\",\n\t\"syscall.SIGIO\":                                        \"syscall\",\n\t\"syscall.SIGIOT\":                                       \"syscall\",\n\t\"syscall.SIGKILL\":                                      \"syscall\",\n\t\"syscall.SIGLIBRT\":                                     \"syscall\",\n\t\"syscall.SIGLWP\":                                       \"syscall\",\n\t\"syscall.SIGPIPE\":                                      \"syscall\",\n\t\"syscall.SIGPOLL\":                                      \"syscall\",\n\t\"syscall.SIGPROF\":                                      \"syscall\",\n\t\"syscall.SIGPWR\":                                       \"syscall\",\n\t\"syscall.SIGQUIT\":                                      \"syscall\",\n\t\"syscall.SIGSEGV\":                                      \"syscall\",\n\t\"syscall.SIGSTKFLT\":                                    \"syscall\",\n\t\"syscall.SIGSTOP\":                                      \"syscall\",\n\t\"syscall.SIGSYS\":                                       \"syscall\",\n\t\"syscall.SIGTERM\":                                      \"syscall\",\n\t\"syscall.SIGTHR\":                                       \"syscall\",\n\t\"syscall.SIGTRAP\":                                      \"syscall\",\n\t\"syscall.SIGTSTP\":                                      \"syscall\",\n\t\"syscall.SIGTTIN\":                                      \"syscall\",\n\t\"syscall.SIGTTOU\":                                      \"syscall\",\n\t\"syscall.SIGUNUSED\":                                    \"syscall\",\n\t\"syscall.SIGURG\":                                       \"syscall\",\n\t\"syscall.SIGUSR1\":                                      \"syscall\",\n\t\"syscall.SIGUSR2\":                                      \"syscall\",\n\t\"syscall.SIGVTALRM\":                                    \"syscall\",\n\t\"syscall.SIGWINCH\":                                     \"syscall\",\n\t\"syscall.SIGXCPU\":                                      \"syscall\",\n\t\"syscall.SIGXFSZ\":                                      \"syscall\",\n\t\"syscall.SIOCADDDLCI\":                                  \"syscall\",\n\t\"syscall.SIOCADDMULTI\":                                 \"syscall\",\n\t\"syscall.SIOCADDRT\":                                    \"syscall\",\n\t\"syscall.SIOCAIFADDR\":                                  \"syscall\",\n\t\"syscall.SIOCAIFGROUP\":                                 \"syscall\",\n\t\"syscall.SIOCALIFADDR\":                                 \"syscall\",\n\t\"syscall.SIOCARPIPLL\":                                  \"syscall\",\n\t\"syscall.SIOCATMARK\":                                   \"syscall\",\n\t\"syscall.SIOCAUTOADDR\":                                 \"syscall\",\n\t\"syscall.SIOCAUTONETMASK\":                              \"syscall\",\n\t\"syscall.SIOCBRDGADD\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGADDS\":                                 \"syscall\",\n\t\"syscall.SIOCBRDGARL\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGDADDR\":                                \"syscall\",\n\t\"syscall.SIOCBRDGDEL\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGDELS\":                                 \"syscall\",\n\t\"syscall.SIOCBRDGFLUSH\":                                \"syscall\",\n\t\"syscall.SIOCBRDGFRL\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGGCACHE\":                               \"syscall\",\n\t\"syscall.SIOCBRDGGFD\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGGHT\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGGIFFLGS\":                              \"syscall\",\n\t\"syscall.SIOCBRDGGMA\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGGPARAM\":                               \"syscall\",\n\t\"syscall.SIOCBRDGGPRI\":                                 \"syscall\",\n\t\"syscall.SIOCBRDGGRL\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGGSIFS\":                                \"syscall\",\n\t\"syscall.SIOCBRDGGTO\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGIFS\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGRTS\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGSADDR\":                                \"syscall\",\n\t\"syscall.SIOCBRDGSCACHE\":                               \"syscall\",\n\t\"syscall.SIOCBRDGSFD\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGSHT\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGSIFCOST\":                              \"syscall\",\n\t\"syscall.SIOCBRDGSIFFLGS\":                              \"syscall\",\n\t\"syscall.SIOCBRDGSIFPRIO\":                              \"syscall\",\n\t\"syscall.SIOCBRDGSMA\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGSPRI\":                                 \"syscall\",\n\t\"syscall.SIOCBRDGSPROTO\":                               \"syscall\",\n\t\"syscall.SIOCBRDGSTO\":                                  \"syscall\",\n\t\"syscall.SIOCBRDGSTXHC\":                                \"syscall\",\n\t\"syscall.SIOCDARP\":                                     \"syscall\",\n\t\"syscall.SIOCDELDLCI\":                                  \"syscall\",\n\t\"syscall.SIOCDELMULTI\":                                 \"syscall\",\n\t\"syscall.SIOCDELRT\":                                    \"syscall\",\n\t\"syscall.SIOCDEVPRIVATE\":                               \"syscall\",\n\t\"syscall.SIOCDIFADDR\":                                  \"syscall\",\n\t\"syscall.SIOCDIFGROUP\":                                 \"syscall\",\n\t\"syscall.SIOCDIFPHYADDR\":                               \"syscall\",\n\t\"syscall.SIOCDLIFADDR\":                                 \"syscall\",\n\t\"syscall.SIOCDRARP\":                                    \"syscall\",\n\t\"syscall.SIOCGARP\":                                     \"syscall\",\n\t\"syscall.SIOCGDRVSPEC\":                                 \"syscall\",\n\t\"syscall.SIOCGETKALIVE\":                                \"syscall\",\n\t\"syscall.SIOCGETLABEL\":                                 \"syscall\",\n\t\"syscall.SIOCGETPFLOW\":                                 \"syscall\",\n\t\"syscall.SIOCGETPFSYNC\":                                \"syscall\",\n\t\"syscall.SIOCGETSGCNT\":                                 \"syscall\",\n\t\"syscall.SIOCGETVIFCNT\":                                \"syscall\",\n\t\"syscall.SIOCGETVLAN\":                                  \"syscall\",\n\t\"syscall.SIOCGHIWAT\":                                   \"syscall\",\n\t\"syscall.SIOCGIFADDR\":                                  \"syscall\",\n\t\"syscall.SIOCGIFADDRPREF\":                              \"syscall\",\n\t\"syscall.SIOCGIFALIAS\":                                 \"syscall\",\n\t\"syscall.SIOCGIFALTMTU\":                                \"syscall\",\n\t\"syscall.SIOCGIFASYNCMAP\":                              \"syscall\",\n\t\"syscall.SIOCGIFBOND\":                                  \"syscall\",\n\t\"syscall.SIOCGIFBR\":                                    \"syscall\",\n\t\"syscall.SIOCGIFBRDADDR\":                               \"syscall\",\n\t\"syscall.SIOCGIFCAP\":                                   \"syscall\",\n\t\"syscall.SIOCGIFCONF\":                                  \"syscall\",\n\t\"syscall.SIOCGIFCOUNT\":                                 \"syscall\",\n\t\"syscall.SIOCGIFDATA\":                                  \"syscall\",\n\t\"syscall.SIOCGIFDESCR\":                                 \"syscall\",\n\t\"syscall.SIOCGIFDEVMTU\":                                \"syscall\",\n\t\"syscall.SIOCGIFDLT\":                                   \"syscall\",\n\t\"syscall.SIOCGIFDSTADDR\":                               \"syscall\",\n\t\"syscall.SIOCGIFENCAP\":                                 \"syscall\",\n\t\"syscall.SIOCGIFFIB\":                                   \"syscall\",\n\t\"syscall.SIOCGIFFLAGS\":                                 \"syscall\",\n\t\"syscall.SIOCGIFGATTR\":                                 \"syscall\",\n\t\"syscall.SIOCGIFGENERIC\":                               \"syscall\",\n\t\"syscall.SIOCGIFGMEMB\":                                 \"syscall\",\n\t\"syscall.SIOCGIFGROUP\":                                 \"syscall\",\n\t\"syscall.SIOCGIFHARDMTU\":                               \"syscall\",\n\t\"syscall.SIOCGIFHWADDR\":                                \"syscall\",\n\t\"syscall.SIOCGIFINDEX\":                                 \"syscall\",\n\t\"syscall.SIOCGIFKPI\":                                   \"syscall\",\n\t\"syscall.SIOCGIFMAC\":                                   \"syscall\",\n\t\"syscall.SIOCGIFMAP\":                                   \"syscall\",\n\t\"syscall.SIOCGIFMEDIA\":                                 \"syscall\",\n\t\"syscall.SIOCGIFMEM\":                                   \"syscall\",\n\t\"syscall.SIOCGIFMETRIC\":                                \"syscall\",\n\t\"syscall.SIOCGIFMTU\":                                   \"syscall\",\n\t\"syscall.SIOCGIFNAME\":                                  \"syscall\",\n\t\"syscall.SIOCGIFNETMASK\":                               \"syscall\",\n\t\"syscall.SIOCGIFPDSTADDR\":                              \"syscall\",\n\t\"syscall.SIOCGIFPFLAGS\":                                \"syscall\",\n\t\"syscall.SIOCGIFPHYS\":                                  \"syscall\",\n\t\"syscall.SIOCGIFPRIORITY\":                              \"syscall\",\n\t\"syscall.SIOCGIFPSRCADDR\":                              \"syscall\",\n\t\"syscall.SIOCGIFRDOMAIN\":                               \"syscall\",\n\t\"syscall.SIOCGIFRTLABEL\":                               \"syscall\",\n\t\"syscall.SIOCGIFSLAVE\":                                 \"syscall\",\n\t\"syscall.SIOCGIFSTATUS\":                                \"syscall\",\n\t\"syscall.SIOCGIFTIMESLOT\":                              \"syscall\",\n\t\"syscall.SIOCGIFTXQLEN\":                                \"syscall\",\n\t\"syscall.SIOCGIFVLAN\":                                  \"syscall\",\n\t\"syscall.SIOCGIFWAKEFLAGS\":                             \"syscall\",\n\t\"syscall.SIOCGIFXFLAGS\":                                \"syscall\",\n\t\"syscall.SIOCGLIFADDR\":                                 \"syscall\",\n\t\"syscall.SIOCGLIFPHYADDR\":                              \"syscall\",\n\t\"syscall.SIOCGLIFPHYRTABLE\":                            \"syscall\",\n\t\"syscall.SIOCGLIFPHYTTL\":                               \"syscall\",\n\t\"syscall.SIOCGLINKSTR\":                                 \"syscall\",\n\t\"syscall.SIOCGLOWAT\":                                   \"syscall\",\n\t\"syscall.SIOCGPGRP\":                                    \"syscall\",\n\t\"syscall.SIOCGPRIVATE_0\":                               \"syscall\",\n\t\"syscall.SIOCGPRIVATE_1\":                               \"syscall\",\n\t\"syscall.SIOCGRARP\":                                    \"syscall\",\n\t\"syscall.SIOCGSPPPPARAMS\":                              \"syscall\",\n\t\"syscall.SIOCGSTAMP\":                                   \"syscall\",\n\t\"syscall.SIOCGSTAMPNS\":                                 \"syscall\",\n\t\"syscall.SIOCGVH\":                                      \"syscall\",\n\t\"syscall.SIOCGVNETID\":                                  \"syscall\",\n\t\"syscall.SIOCIFCREATE\":                                 \"syscall\",\n\t\"syscall.SIOCIFCREATE2\":                                \"syscall\",\n\t\"syscall.SIOCIFDESTROY\":                                \"syscall\",\n\t\"syscall.SIOCIFGCLONERS\":                               \"syscall\",\n\t\"syscall.SIOCINITIFADDR\":                               \"syscall\",\n\t\"syscall.SIOCPROTOPRIVATE\":                             \"syscall\",\n\t\"syscall.SIOCRSLVMULTI\":                                \"syscall\",\n\t\"syscall.SIOCRTMSG\":                                    \"syscall\",\n\t\"syscall.SIOCSARP\":                                     \"syscall\",\n\t\"syscall.SIOCSDRVSPEC\":                                 \"syscall\",\n\t\"syscall.SIOCSETKALIVE\":                                \"syscall\",\n\t\"syscall.SIOCSETLABEL\":                                 \"syscall\",\n\t\"syscall.SIOCSETPFLOW\":                                 \"syscall\",\n\t\"syscall.SIOCSETPFSYNC\":                                \"syscall\",\n\t\"syscall.SIOCSETVLAN\":                                  \"syscall\",\n\t\"syscall.SIOCSHIWAT\":                                   \"syscall\",\n\t\"syscall.SIOCSIFADDR\":                                  \"syscall\",\n\t\"syscall.SIOCSIFADDRPREF\":                              \"syscall\",\n\t\"syscall.SIOCSIFALTMTU\":                                \"syscall\",\n\t\"syscall.SIOCSIFASYNCMAP\":                              \"syscall\",\n\t\"syscall.SIOCSIFBOND\":                                  \"syscall\",\n\t\"syscall.SIOCSIFBR\":                                    \"syscall\",\n\t\"syscall.SIOCSIFBRDADDR\":                               \"syscall\",\n\t\"syscall.SIOCSIFCAP\":                                   \"syscall\",\n\t\"syscall.SIOCSIFDESCR\":                                 \"syscall\",\n\t\"syscall.SIOCSIFDSTADDR\":                               \"syscall\",\n\t\"syscall.SIOCSIFENCAP\":                                 \"syscall\",\n\t\"syscall.SIOCSIFFIB\":                                   \"syscall\",\n\t\"syscall.SIOCSIFFLAGS\":                                 \"syscall\",\n\t\"syscall.SIOCSIFGATTR\":                                 \"syscall\",\n\t\"syscall.SIOCSIFGENERIC\":                               \"syscall\",\n\t\"syscall.SIOCSIFHWADDR\":                                \"syscall\",\n\t\"syscall.SIOCSIFHWBROADCAST\":                           \"syscall\",\n\t\"syscall.SIOCSIFKPI\":                                   \"syscall\",\n\t\"syscall.SIOCSIFLINK\":                                  \"syscall\",\n\t\"syscall.SIOCSIFLLADDR\":                                \"syscall\",\n\t\"syscall.SIOCSIFMAC\":                                   \"syscall\",\n\t\"syscall.SIOCSIFMAP\":                                   \"syscall\",\n\t\"syscall.SIOCSIFMEDIA\":                                 \"syscall\",\n\t\"syscall.SIOCSIFMEM\":                                   \"syscall\",\n\t\"syscall.SIOCSIFMETRIC\":                                \"syscall\",\n\t\"syscall.SIOCSIFMTU\":                                   \"syscall\",\n\t\"syscall.SIOCSIFNAME\":                                  \"syscall\",\n\t\"syscall.SIOCSIFNETMASK\":                               \"syscall\",\n\t\"syscall.SIOCSIFPFLAGS\":                                \"syscall\",\n\t\"syscall.SIOCSIFPHYADDR\":                               \"syscall\",\n\t\"syscall.SIOCSIFPHYS\":                                  \"syscall\",\n\t\"syscall.SIOCSIFPRIORITY\":                              \"syscall\",\n\t\"syscall.SIOCSIFRDOMAIN\":                               \"syscall\",\n\t\"syscall.SIOCSIFRTLABEL\":                               \"syscall\",\n\t\"syscall.SIOCSIFRVNET\":                                 \"syscall\",\n\t\"syscall.SIOCSIFSLAVE\":                                 \"syscall\",\n\t\"syscall.SIOCSIFTIMESLOT\":                              \"syscall\",\n\t\"syscall.SIOCSIFTXQLEN\":                                \"syscall\",\n\t\"syscall.SIOCSIFVLAN\":                                  \"syscall\",\n\t\"syscall.SIOCSIFVNET\":                                  \"syscall\",\n\t\"syscall.SIOCSIFXFLAGS\":                                \"syscall\",\n\t\"syscall.SIOCSLIFPHYADDR\":                              \"syscall\",\n\t\"syscall.SIOCSLIFPHYRTABLE\":                            \"syscall\",\n\t\"syscall.SIOCSLIFPHYTTL\":                               \"syscall\",\n\t\"syscall.SIOCSLINKSTR\":                                 \"syscall\",\n\t\"syscall.SIOCSLOWAT\":                                   \"syscall\",\n\t\"syscall.SIOCSPGRP\":                                    \"syscall\",\n\t\"syscall.SIOCSRARP\":                                    \"syscall\",\n\t\"syscall.SIOCSSPPPPARAMS\":                              \"syscall\",\n\t\"syscall.SIOCSVH\":                                      \"syscall\",\n\t\"syscall.SIOCSVNETID\":                                  \"syscall\",\n\t\"syscall.SIOCZIFDATA\":                                  \"syscall\",\n\t\"syscall.SIO_GET_EXTENSION_FUNCTION_POINTER\":           \"syscall\",\n\t\"syscall.SIO_GET_INTERFACE_LIST\":                       \"syscall\",\n\t\"syscall.SIO_KEEPALIVE_VALS\":                           \"syscall\",\n\t\"syscall.SIO_UDP_CONNRESET\":                            \"syscall\",\n\t\"syscall.SOCK_CLOEXEC\":                                 \"syscall\",\n\t\"syscall.SOCK_DCCP\":                                    \"syscall\",\n\t\"syscall.SOCK_DGRAM\":                                   \"syscall\",\n\t\"syscall.SOCK_FLAGS_MASK\":                              \"syscall\",\n\t\"syscall.SOCK_MAXADDRLEN\":                              \"syscall\",\n\t\"syscall.SOCK_NONBLOCK\":                                \"syscall\",\n\t\"syscall.SOCK_NOSIGPIPE\":                               \"syscall\",\n\t\"syscall.SOCK_PACKET\":                                  \"syscall\",\n\t\"syscall.SOCK_RAW\":                                     \"syscall\",\n\t\"syscall.SOCK_RDM\":                                     \"syscall\",\n\t\"syscall.SOCK_SEQPACKET\":                               \"syscall\",\n\t\"syscall.SOCK_STREAM\":                                  \"syscall\",\n\t\"syscall.SOL_AAL\":                                      \"syscall\",\n\t\"syscall.SOL_ATM\":                                      \"syscall\",\n\t\"syscall.SOL_DECNET\":                                   \"syscall\",\n\t\"syscall.SOL_ICMPV6\":                                   \"syscall\",\n\t\"syscall.SOL_IP\":                                       \"syscall\",\n\t\"syscall.SOL_IPV6\":                                     \"syscall\",\n\t\"syscall.SOL_IRDA\":                                     \"syscall\",\n\t\"syscall.SOL_PACKET\":                                   \"syscall\",\n\t\"syscall.SOL_RAW\":                                      \"syscall\",\n\t\"syscall.SOL_SOCKET\":                                   \"syscall\",\n\t\"syscall.SOL_TCP\":                                      \"syscall\",\n\t\"syscall.SOL_X25\":                                      \"syscall\",\n\t\"syscall.SOMAXCONN\":                                    \"syscall\",\n\t\"syscall.SO_ACCEPTCONN\":                                \"syscall\",\n\t\"syscall.SO_ACCEPTFILTER\":                              \"syscall\",\n\t\"syscall.SO_ATTACH_FILTER\":                             \"syscall\",\n\t\"syscall.SO_BINDANY\":                                   \"syscall\",\n\t\"syscall.SO_BINDTODEVICE\":                              \"syscall\",\n\t\"syscall.SO_BINTIME\":                                   \"syscall\",\n\t\"syscall.SO_BROADCAST\":                                 \"syscall\",\n\t\"syscall.SO_BSDCOMPAT\":                                 \"syscall\",\n\t\"syscall.SO_DEBUG\":                                     \"syscall\",\n\t\"syscall.SO_DETACH_FILTER\":                             \"syscall\",\n\t\"syscall.SO_DOMAIN\":                                    \"syscall\",\n\t\"syscall.SO_DONTROUTE\":                                 \"syscall\",\n\t\"syscall.SO_DONTTRUNC\":                                 \"syscall\",\n\t\"syscall.SO_ERROR\":                                     \"syscall\",\n\t\"syscall.SO_KEEPALIVE\":                                 \"syscall\",\n\t\"syscall.SO_LABEL\":                                     \"syscall\",\n\t\"syscall.SO_LINGER\":                                    \"syscall\",\n\t\"syscall.SO_LINGER_SEC\":                                \"syscall\",\n\t\"syscall.SO_LISTENINCQLEN\":                             \"syscall\",\n\t\"syscall.SO_LISTENQLEN\":                                \"syscall\",\n\t\"syscall.SO_LISTENQLIMIT\":                              \"syscall\",\n\t\"syscall.SO_MARK\":                                      \"syscall\",\n\t\"syscall.SO_NETPROC\":                                   \"syscall\",\n\t\"syscall.SO_NKE\":                                       \"syscall\",\n\t\"syscall.SO_NOADDRERR\":                                 \"syscall\",\n\t\"syscall.SO_NOHEADER\":                                  \"syscall\",\n\t\"syscall.SO_NOSIGPIPE\":                                 \"syscall\",\n\t\"syscall.SO_NOTIFYCONFLICT\":                            \"syscall\",\n\t\"syscall.SO_NO_CHECK\":                                  \"syscall\",\n\t\"syscall.SO_NO_DDP\":                                    \"syscall\",\n\t\"syscall.SO_NO_OFFLOAD\":                                \"syscall\",\n\t\"syscall.SO_NP_EXTENSIONS\":                             \"syscall\",\n\t\"syscall.SO_NREAD\":                                     \"syscall\",\n\t\"syscall.SO_NWRITE\":                                    \"syscall\",\n\t\"syscall.SO_OOBINLINE\":                                 \"syscall\",\n\t\"syscall.SO_OVERFLOWED\":                                \"syscall\",\n\t\"syscall.SO_PASSCRED\":                                  \"syscall\",\n\t\"syscall.SO_PASSSEC\":                                   \"syscall\",\n\t\"syscall.SO_PEERCRED\":                                  \"syscall\",\n\t\"syscall.SO_PEERLABEL\":                                 \"syscall\",\n\t\"syscall.SO_PEERNAME\":                                  \"syscall\",\n\t\"syscall.SO_PEERSEC\":                                   \"syscall\",\n\t\"syscall.SO_PRIORITY\":                                  \"syscall\",\n\t\"syscall.SO_PROTOCOL\":                                  \"syscall\",\n\t\"syscall.SO_PROTOTYPE\":                                 \"syscall\",\n\t\"syscall.SO_RANDOMPORT\":                                \"syscall\",\n\t\"syscall.SO_RCVBUF\":                                    \"syscall\",\n\t\"syscall.SO_RCVBUFFORCE\":                               \"syscall\",\n\t\"syscall.SO_RCVLOWAT\":                                  \"syscall\",\n\t\"syscall.SO_RCVTIMEO\":                                  \"syscall\",\n\t\"syscall.SO_RESTRICTIONS\":                              \"syscall\",\n\t\"syscall.SO_RESTRICT_DENYIN\":                           \"syscall\",\n\t\"syscall.SO_RESTRICT_DENYOUT\":                          \"syscall\",\n\t\"syscall.SO_RESTRICT_DENYSET\":                          \"syscall\",\n\t\"syscall.SO_REUSEADDR\":                                 \"syscall\",\n\t\"syscall.SO_REUSEPORT\":                                 \"syscall\",\n\t\"syscall.SO_REUSESHAREUID\":                             \"syscall\",\n\t\"syscall.SO_RTABLE\":                                    \"syscall\",\n\t\"syscall.SO_RXQ_OVFL\":                                  \"syscall\",\n\t\"syscall.SO_SECURITY_AUTHENTICATION\":                   \"syscall\",\n\t\"syscall.SO_SECURITY_ENCRYPTION_NETWORK\":               \"syscall\",\n\t\"syscall.SO_SECURITY_ENCRYPTION_TRANSPORT\":             \"syscall\",\n\t\"syscall.SO_SETFIB\":                                    \"syscall\",\n\t\"syscall.SO_SNDBUF\":                                    \"syscall\",\n\t\"syscall.SO_SNDBUFFORCE\":                               \"syscall\",\n\t\"syscall.SO_SNDLOWAT\":                                  \"syscall\",\n\t\"syscall.SO_SNDTIMEO\":                                  \"syscall\",\n\t\"syscall.SO_SPLICE\":                                    \"syscall\",\n\t\"syscall.SO_TIMESTAMP\":                                 \"syscall\",\n\t\"syscall.SO_TIMESTAMPING\":                              \"syscall\",\n\t\"syscall.SO_TIMESTAMPNS\":                               \"syscall\",\n\t\"syscall.SO_TIMESTAMP_MONOTONIC\":                       \"syscall\",\n\t\"syscall.SO_TYPE\":                                      \"syscall\",\n\t\"syscall.SO_UPCALLCLOSEWAIT\":                           \"syscall\",\n\t\"syscall.SO_UPDATE_ACCEPT_CONTEXT\":                     \"syscall\",\n\t\"syscall.SO_UPDATE_CONNECT_CONTEXT\":                    \"syscall\",\n\t\"syscall.SO_USELOOPBACK\":                               \"syscall\",\n\t\"syscall.SO_USER_COOKIE\":                               \"syscall\",\n\t\"syscall.SO_VENDOR\":                                    \"syscall\",\n\t\"syscall.SO_WANTMORE\":                                  \"syscall\",\n\t\"syscall.SO_WANTOOBFLAG\":                               \"syscall\",\n\t\"syscall.SSLExtraCertChainPolicyPara\":                  \"syscall\",\n\t\"syscall.STANDARD_RIGHTS_ALL\":                          \"syscall\",\n\t\"syscall.STANDARD_RIGHTS_EXECUTE\":                      \"syscall\",\n\t\"syscall.STANDARD_RIGHTS_READ\":                         \"syscall\",\n\t\"syscall.STANDARD_RIGHTS_REQUIRED\":                     \"syscall\",\n\t\"syscall.STANDARD_RIGHTS_WRITE\":                        \"syscall\",\n\t\"syscall.STARTF_USESHOWWINDOW\":                         \"syscall\",\n\t\"syscall.STARTF_USESTDHANDLES\":                         \"syscall\",\n\t\"syscall.STD_ERROR_HANDLE\":                             \"syscall\",\n\t\"syscall.STD_INPUT_HANDLE\":                             \"syscall\",\n\t\"syscall.STD_OUTPUT_HANDLE\":                            \"syscall\",\n\t\"syscall.SUBLANG_ENGLISH_US\":                           \"syscall\",\n\t\"syscall.SW_FORCEMINIMIZE\":                             \"syscall\",\n\t\"syscall.SW_HIDE\":                                      \"syscall\",\n\t\"syscall.SW_MAXIMIZE\":                                  \"syscall\",\n\t\"syscall.SW_MINIMIZE\":                                  \"syscall\",\n\t\"syscall.SW_NORMAL\":                                    \"syscall\",\n\t\"syscall.SW_RESTORE\":                                   \"syscall\",\n\t\"syscall.SW_SHOW\":                                      \"syscall\",\n\t\"syscall.SW_SHOWDEFAULT\":                               \"syscall\",\n\t\"syscall.SW_SHOWMAXIMIZED\":                             \"syscall\",\n\t\"syscall.SW_SHOWMINIMIZED\":                             \"syscall\",\n\t\"syscall.SW_SHOWMINNOACTIVE\":                           \"syscall\",\n\t\"syscall.SW_SHOWNA\":                                    \"syscall\",\n\t\"syscall.SW_SHOWNOACTIVATE\":                            \"syscall\",\n\t\"syscall.SW_SHOWNORMAL\":                                \"syscall\",\n\t\"syscall.SYMBOLIC_LINK_FLAG_DIRECTORY\":                 \"syscall\",\n\t\"syscall.SYNCHRONIZE\":                                  \"syscall\",\n\t\"syscall.SYSCTL_VERSION\":                               \"syscall\",\n\t\"syscall.SYSCTL_VERS_0\":                                \"syscall\",\n\t\"syscall.SYSCTL_VERS_1\":                                \"syscall\",\n\t\"syscall.SYSCTL_VERS_MASK\":                             \"syscall\",\n\t\"syscall.SYS_ABORT2\":                                   \"syscall\",\n\t\"syscall.SYS_ACCEPT\":                                   \"syscall\",\n\t\"syscall.SYS_ACCEPT4\":                                  \"syscall\",\n\t\"syscall.SYS_ACCEPT_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_ACCESS\":                                   \"syscall\",\n\t\"syscall.SYS_ACCESS_EXTENDED\":                          \"syscall\",\n\t\"syscall.SYS_ACCT\":                                     \"syscall\",\n\t\"syscall.SYS_ADD_KEY\":                                  \"syscall\",\n\t\"syscall.SYS_ADD_PROFIL\":                               \"syscall\",\n\t\"syscall.SYS_ADJFREQ\":                                  \"syscall\",\n\t\"syscall.SYS_ADJTIME\":                                  \"syscall\",\n\t\"syscall.SYS_ADJTIMEX\":                                 \"syscall\",\n\t\"syscall.SYS_AFS_SYSCALL\":                              \"syscall\",\n\t\"syscall.SYS_AIO_CANCEL\":                               \"syscall\",\n\t\"syscall.SYS_AIO_ERROR\":                                \"syscall\",\n\t\"syscall.SYS_AIO_FSYNC\":                                \"syscall\",\n\t\"syscall.SYS_AIO_READ\":                                 \"syscall\",\n\t\"syscall.SYS_AIO_RETURN\":                               \"syscall\",\n\t\"syscall.SYS_AIO_SUSPEND\":                              \"syscall\",\n\t\"syscall.SYS_AIO_SUSPEND_NOCANCEL\":                     \"syscall\",\n\t\"syscall.SYS_AIO_WRITE\":                                \"syscall\",\n\t\"syscall.SYS_ALARM\":                                    \"syscall\",\n\t\"syscall.SYS_ARCH_PRCTL\":                               \"syscall\",\n\t\"syscall.SYS_ARM_FADVISE64_64\":                         \"syscall\",\n\t\"syscall.SYS_ARM_SYNC_FILE_RANGE\":                      \"syscall\",\n\t\"syscall.SYS_ATGETMSG\":                                 \"syscall\",\n\t\"syscall.SYS_ATPGETREQ\":                                \"syscall\",\n\t\"syscall.SYS_ATPGETRSP\":                                \"syscall\",\n\t\"syscall.SYS_ATPSNDREQ\":                                \"syscall\",\n\t\"syscall.SYS_ATPSNDRSP\":                                \"syscall\",\n\t\"syscall.SYS_ATPUTMSG\":                                 \"syscall\",\n\t\"syscall.SYS_ATSOCKET\":                                 \"syscall\",\n\t\"syscall.SYS_AUDIT\":                                    \"syscall\",\n\t\"syscall.SYS_AUDITCTL\":                                 \"syscall\",\n\t\"syscall.SYS_AUDITON\":                                  \"syscall\",\n\t\"syscall.SYS_AUDIT_SESSION_JOIN\":                       \"syscall\",\n\t\"syscall.SYS_AUDIT_SESSION_PORT\":                       \"syscall\",\n\t\"syscall.SYS_AUDIT_SESSION_SELF\":                       \"syscall\",\n\t\"syscall.SYS_BDFLUSH\":                                  \"syscall\",\n\t\"syscall.SYS_BIND\":                                     \"syscall\",\n\t\"syscall.SYS_BINDAT\":                                   \"syscall\",\n\t\"syscall.SYS_BREAK\":                                    \"syscall\",\n\t\"syscall.SYS_BRK\":                                      \"syscall\",\n\t\"syscall.SYS_BSDTHREAD_CREATE\":                         \"syscall\",\n\t\"syscall.SYS_BSDTHREAD_REGISTER\":                       \"syscall\",\n\t\"syscall.SYS_BSDTHREAD_TERMINATE\":                      \"syscall\",\n\t\"syscall.SYS_CAPGET\":                                   \"syscall\",\n\t\"syscall.SYS_CAPSET\":                                   \"syscall\",\n\t\"syscall.SYS_CAP_ENTER\":                                \"syscall\",\n\t\"syscall.SYS_CAP_FCNTLS_GET\":                           \"syscall\",\n\t\"syscall.SYS_CAP_FCNTLS_LIMIT\":                         \"syscall\",\n\t\"syscall.SYS_CAP_GETMODE\":                              \"syscall\",\n\t\"syscall.SYS_CAP_GETRIGHTS\":                            \"syscall\",\n\t\"syscall.SYS_CAP_IOCTLS_GET\":                           \"syscall\",\n\t\"syscall.SYS_CAP_IOCTLS_LIMIT\":                         \"syscall\",\n\t\"syscall.SYS_CAP_NEW\":                                  \"syscall\",\n\t\"syscall.SYS_CAP_RIGHTS_GET\":                           \"syscall\",\n\t\"syscall.SYS_CAP_RIGHTS_LIMIT\":                         \"syscall\",\n\t\"syscall.SYS_CHDIR\":                                    \"syscall\",\n\t\"syscall.SYS_CHFLAGS\":                                  \"syscall\",\n\t\"syscall.SYS_CHFLAGSAT\":                                \"syscall\",\n\t\"syscall.SYS_CHMOD\":                                    \"syscall\",\n\t\"syscall.SYS_CHMOD_EXTENDED\":                           \"syscall\",\n\t\"syscall.SYS_CHOWN\":                                    \"syscall\",\n\t\"syscall.SYS_CHOWN32\":                                  \"syscall\",\n\t\"syscall.SYS_CHROOT\":                                   \"syscall\",\n\t\"syscall.SYS_CHUD\":                                     \"syscall\",\n\t\"syscall.SYS_CLOCK_ADJTIME\":                            \"syscall\",\n\t\"syscall.SYS_CLOCK_GETCPUCLOCKID2\":                     \"syscall\",\n\t\"syscall.SYS_CLOCK_GETRES\":                             \"syscall\",\n\t\"syscall.SYS_CLOCK_GETTIME\":                            \"syscall\",\n\t\"syscall.SYS_CLOCK_NANOSLEEP\":                          \"syscall\",\n\t\"syscall.SYS_CLOCK_SETTIME\":                            \"syscall\",\n\t\"syscall.SYS_CLONE\":                                    \"syscall\",\n\t\"syscall.SYS_CLOSE\":                                    \"syscall\",\n\t\"syscall.SYS_CLOSEFROM\":                                \"syscall\",\n\t\"syscall.SYS_CLOSE_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_CONNECT\":                                  \"syscall\",\n\t\"syscall.SYS_CONNECTAT\":                                \"syscall\",\n\t\"syscall.SYS_CONNECT_NOCANCEL\":                         \"syscall\",\n\t\"syscall.SYS_COPYFILE\":                                 \"syscall\",\n\t\"syscall.SYS_CPUSET\":                                   \"syscall\",\n\t\"syscall.SYS_CPUSET_GETAFFINITY\":                       \"syscall\",\n\t\"syscall.SYS_CPUSET_GETID\":                             \"syscall\",\n\t\"syscall.SYS_CPUSET_SETAFFINITY\":                       \"syscall\",\n\t\"syscall.SYS_CPUSET_SETID\":                             \"syscall\",\n\t\"syscall.SYS_CREAT\":                                    \"syscall\",\n\t\"syscall.SYS_CREATE_MODULE\":                            \"syscall\",\n\t\"syscall.SYS_CSOPS\":                                    \"syscall\",\n\t\"syscall.SYS_DELETE\":                                   \"syscall\",\n\t\"syscall.SYS_DELETE_MODULE\":                            \"syscall\",\n\t\"syscall.SYS_DUP\":                                      \"syscall\",\n\t\"syscall.SYS_DUP2\":                                     \"syscall\",\n\t\"syscall.SYS_DUP3\":                                     \"syscall\",\n\t\"syscall.SYS_EACCESS\":                                  \"syscall\",\n\t\"syscall.SYS_EPOLL_CREATE\":                             \"syscall\",\n\t\"syscall.SYS_EPOLL_CREATE1\":                            \"syscall\",\n\t\"syscall.SYS_EPOLL_CTL\":                                \"syscall\",\n\t\"syscall.SYS_EPOLL_CTL_OLD\":                            \"syscall\",\n\t\"syscall.SYS_EPOLL_PWAIT\":                              \"syscall\",\n\t\"syscall.SYS_EPOLL_WAIT\":                               \"syscall\",\n\t\"syscall.SYS_EPOLL_WAIT_OLD\":                           \"syscall\",\n\t\"syscall.SYS_EVENTFD\":                                  \"syscall\",\n\t\"syscall.SYS_EVENTFD2\":                                 \"syscall\",\n\t\"syscall.SYS_EXCHANGEDATA\":                             \"syscall\",\n\t\"syscall.SYS_EXECVE\":                                   \"syscall\",\n\t\"syscall.SYS_EXIT\":                                     \"syscall\",\n\t\"syscall.SYS_EXIT_GROUP\":                               \"syscall\",\n\t\"syscall.SYS_EXTATTRCTL\":                               \"syscall\",\n\t\"syscall.SYS_EXTATTR_DELETE_FD\":                        \"syscall\",\n\t\"syscall.SYS_EXTATTR_DELETE_FILE\":                      \"syscall\",\n\t\"syscall.SYS_EXTATTR_DELETE_LINK\":                      \"syscall\",\n\t\"syscall.SYS_EXTATTR_GET_FD\":                           \"syscall\",\n\t\"syscall.SYS_EXTATTR_GET_FILE\":                         \"syscall\",\n\t\"syscall.SYS_EXTATTR_GET_LINK\":                         \"syscall\",\n\t\"syscall.SYS_EXTATTR_LIST_FD\":                          \"syscall\",\n\t\"syscall.SYS_EXTATTR_LIST_FILE\":                        \"syscall\",\n\t\"syscall.SYS_EXTATTR_LIST_LINK\":                        \"syscall\",\n\t\"syscall.SYS_EXTATTR_SET_FD\":                           \"syscall\",\n\t\"syscall.SYS_EXTATTR_SET_FILE\":                         \"syscall\",\n\t\"syscall.SYS_EXTATTR_SET_LINK\":                         \"syscall\",\n\t\"syscall.SYS_FACCESSAT\":                                \"syscall\",\n\t\"syscall.SYS_FADVISE64\":                                \"syscall\",\n\t\"syscall.SYS_FADVISE64_64\":                             \"syscall\",\n\t\"syscall.SYS_FALLOCATE\":                                \"syscall\",\n\t\"syscall.SYS_FANOTIFY_INIT\":                            \"syscall\",\n\t\"syscall.SYS_FANOTIFY_MARK\":                            \"syscall\",\n\t\"syscall.SYS_FCHDIR\":                                   \"syscall\",\n\t\"syscall.SYS_FCHFLAGS\":                                 \"syscall\",\n\t\"syscall.SYS_FCHMOD\":                                   \"syscall\",\n\t\"syscall.SYS_FCHMODAT\":                                 \"syscall\",\n\t\"syscall.SYS_FCHMOD_EXTENDED\":                          \"syscall\",\n\t\"syscall.SYS_FCHOWN\":                                   \"syscall\",\n\t\"syscall.SYS_FCHOWN32\":                                 \"syscall\",\n\t\"syscall.SYS_FCHOWNAT\":                                 \"syscall\",\n\t\"syscall.SYS_FCHROOT\":                                  \"syscall\",\n\t\"syscall.SYS_FCNTL\":                                    \"syscall\",\n\t\"syscall.SYS_FCNTL64\":                                  \"syscall\",\n\t\"syscall.SYS_FCNTL_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_FDATASYNC\":                                \"syscall\",\n\t\"syscall.SYS_FEXECVE\":                                  \"syscall\",\n\t\"syscall.SYS_FFCLOCK_GETCOUNTER\":                       \"syscall\",\n\t\"syscall.SYS_FFCLOCK_GETESTIMATE\":                      \"syscall\",\n\t\"syscall.SYS_FFCLOCK_SETESTIMATE\":                      \"syscall\",\n\t\"syscall.SYS_FFSCTL\":                                   \"syscall\",\n\t\"syscall.SYS_FGETATTRLIST\":                             \"syscall\",\n\t\"syscall.SYS_FGETXATTR\":                                \"syscall\",\n\t\"syscall.SYS_FHOPEN\":                                   \"syscall\",\n\t\"syscall.SYS_FHSTAT\":                                   \"syscall\",\n\t\"syscall.SYS_FHSTATFS\":                                 \"syscall\",\n\t\"syscall.SYS_FILEPORT_MAKEFD\":                          \"syscall\",\n\t\"syscall.SYS_FILEPORT_MAKEPORT\":                        \"syscall\",\n\t\"syscall.SYS_FKTRACE\":                                  \"syscall\",\n\t\"syscall.SYS_FLISTXATTR\":                               \"syscall\",\n\t\"syscall.SYS_FLOCK\":                                    \"syscall\",\n\t\"syscall.SYS_FORK\":                                     \"syscall\",\n\t\"syscall.SYS_FPATHCONF\":                                \"syscall\",\n\t\"syscall.SYS_FREEBSD6_FTRUNCATE\":                       \"syscall\",\n\t\"syscall.SYS_FREEBSD6_LSEEK\":                           \"syscall\",\n\t\"syscall.SYS_FREEBSD6_MMAP\":                            \"syscall\",\n\t\"syscall.SYS_FREEBSD6_PREAD\":                           \"syscall\",\n\t\"syscall.SYS_FREEBSD6_PWRITE\":                          \"syscall\",\n\t\"syscall.SYS_FREEBSD6_TRUNCATE\":                        \"syscall\",\n\t\"syscall.SYS_FREMOVEXATTR\":                             \"syscall\",\n\t\"syscall.SYS_FSCTL\":                                    \"syscall\",\n\t\"syscall.SYS_FSETATTRLIST\":                             \"syscall\",\n\t\"syscall.SYS_FSETXATTR\":                                \"syscall\",\n\t\"syscall.SYS_FSGETPATH\":                                \"syscall\",\n\t\"syscall.SYS_FSTAT\":                                    \"syscall\",\n\t\"syscall.SYS_FSTAT64\":                                  \"syscall\",\n\t\"syscall.SYS_FSTAT64_EXTENDED\":                         \"syscall\",\n\t\"syscall.SYS_FSTATAT\":                                  \"syscall\",\n\t\"syscall.SYS_FSTATAT64\":                                \"syscall\",\n\t\"syscall.SYS_FSTATFS\":                                  \"syscall\",\n\t\"syscall.SYS_FSTATFS64\":                                \"syscall\",\n\t\"syscall.SYS_FSTATV\":                                   \"syscall\",\n\t\"syscall.SYS_FSTATVFS1\":                                \"syscall\",\n\t\"syscall.SYS_FSTAT_EXTENDED\":                           \"syscall\",\n\t\"syscall.SYS_FSYNC\":                                    \"syscall\",\n\t\"syscall.SYS_FSYNC_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_FSYNC_RANGE\":                              \"syscall\",\n\t\"syscall.SYS_FTIME\":                                    \"syscall\",\n\t\"syscall.SYS_FTRUNCATE\":                                \"syscall\",\n\t\"syscall.SYS_FTRUNCATE64\":                              \"syscall\",\n\t\"syscall.SYS_FUTEX\":                                    \"syscall\",\n\t\"syscall.SYS_FUTIMENS\":                                 \"syscall\",\n\t\"syscall.SYS_FUTIMES\":                                  \"syscall\",\n\t\"syscall.SYS_FUTIMESAT\":                                \"syscall\",\n\t\"syscall.SYS_GETATTRLIST\":                              \"syscall\",\n\t\"syscall.SYS_GETAUDIT\":                                 \"syscall\",\n\t\"syscall.SYS_GETAUDIT_ADDR\":                            \"syscall\",\n\t\"syscall.SYS_GETAUID\":                                  \"syscall\",\n\t\"syscall.SYS_GETCONTEXT\":                               \"syscall\",\n\t\"syscall.SYS_GETCPU\":                                   \"syscall\",\n\t\"syscall.SYS_GETCWD\":                                   \"syscall\",\n\t\"syscall.SYS_GETDENTS\":                                 \"syscall\",\n\t\"syscall.SYS_GETDENTS64\":                               \"syscall\",\n\t\"syscall.SYS_GETDIRENTRIES\":                            \"syscall\",\n\t\"syscall.SYS_GETDIRENTRIES64\":                          \"syscall\",\n\t\"syscall.SYS_GETDIRENTRIESATTR\":                        \"syscall\",\n\t\"syscall.SYS_GETDTABLECOUNT\":                           \"syscall\",\n\t\"syscall.SYS_GETDTABLESIZE\":                            \"syscall\",\n\t\"syscall.SYS_GETEGID\":                                  \"syscall\",\n\t\"syscall.SYS_GETEGID32\":                                \"syscall\",\n\t\"syscall.SYS_GETEUID\":                                  \"syscall\",\n\t\"syscall.SYS_GETEUID32\":                                \"syscall\",\n\t\"syscall.SYS_GETFH\":                                    \"syscall\",\n\t\"syscall.SYS_GETFSSTAT\":                                \"syscall\",\n\t\"syscall.SYS_GETFSSTAT64\":                              \"syscall\",\n\t\"syscall.SYS_GETGID\":                                   \"syscall\",\n\t\"syscall.SYS_GETGID32\":                                 \"syscall\",\n\t\"syscall.SYS_GETGROUPS\":                                \"syscall\",\n\t\"syscall.SYS_GETGROUPS32\":                              \"syscall\",\n\t\"syscall.SYS_GETHOSTUUID\":                              \"syscall\",\n\t\"syscall.SYS_GETITIMER\":                                \"syscall\",\n\t\"syscall.SYS_GETLCID\":                                  \"syscall\",\n\t\"syscall.SYS_GETLOGIN\":                                 \"syscall\",\n\t\"syscall.SYS_GETLOGINCLASS\":                            \"syscall\",\n\t\"syscall.SYS_GETPEERNAME\":                              \"syscall\",\n\t\"syscall.SYS_GETPGID\":                                  \"syscall\",\n\t\"syscall.SYS_GETPGRP\":                                  \"syscall\",\n\t\"syscall.SYS_GETPID\":                                   \"syscall\",\n\t\"syscall.SYS_GETPMSG\":                                  \"syscall\",\n\t\"syscall.SYS_GETPPID\":                                  \"syscall\",\n\t\"syscall.SYS_GETPRIORITY\":                              \"syscall\",\n\t\"syscall.SYS_GETRESGID\":                                \"syscall\",\n\t\"syscall.SYS_GETRESGID32\":                              \"syscall\",\n\t\"syscall.SYS_GETRESUID\":                                \"syscall\",\n\t\"syscall.SYS_GETRESUID32\":                              \"syscall\",\n\t\"syscall.SYS_GETRLIMIT\":                                \"syscall\",\n\t\"syscall.SYS_GETRTABLE\":                                \"syscall\",\n\t\"syscall.SYS_GETRUSAGE\":                                \"syscall\",\n\t\"syscall.SYS_GETSGROUPS\":                               \"syscall\",\n\t\"syscall.SYS_GETSID\":                                   \"syscall\",\n\t\"syscall.SYS_GETSOCKNAME\":                              \"syscall\",\n\t\"syscall.SYS_GETSOCKOPT\":                               \"syscall\",\n\t\"syscall.SYS_GETTHRID\":                                 \"syscall\",\n\t\"syscall.SYS_GETTID\":                                   \"syscall\",\n\t\"syscall.SYS_GETTIMEOFDAY\":                             \"syscall\",\n\t\"syscall.SYS_GETUID\":                                   \"syscall\",\n\t\"syscall.SYS_GETUID32\":                                 \"syscall\",\n\t\"syscall.SYS_GETVFSSTAT\":                               \"syscall\",\n\t\"syscall.SYS_GETWGROUPS\":                               \"syscall\",\n\t\"syscall.SYS_GETXATTR\":                                 \"syscall\",\n\t\"syscall.SYS_GET_KERNEL_SYMS\":                          \"syscall\",\n\t\"syscall.SYS_GET_MEMPOLICY\":                            \"syscall\",\n\t\"syscall.SYS_GET_ROBUST_LIST\":                          \"syscall\",\n\t\"syscall.SYS_GET_THREAD_AREA\":                          \"syscall\",\n\t\"syscall.SYS_GTTY\":                                     \"syscall\",\n\t\"syscall.SYS_IDENTITYSVC\":                              \"syscall\",\n\t\"syscall.SYS_IDLE\":                                     \"syscall\",\n\t\"syscall.SYS_INITGROUPS\":                               \"syscall\",\n\t\"syscall.SYS_INIT_MODULE\":                              \"syscall\",\n\t\"syscall.SYS_INOTIFY_ADD_WATCH\":                        \"syscall\",\n\t\"syscall.SYS_INOTIFY_INIT\":                             \"syscall\",\n\t\"syscall.SYS_INOTIFY_INIT1\":                            \"syscall\",\n\t\"syscall.SYS_INOTIFY_RM_WATCH\":                         \"syscall\",\n\t\"syscall.SYS_IOCTL\":                                    \"syscall\",\n\t\"syscall.SYS_IOPERM\":                                   \"syscall\",\n\t\"syscall.SYS_IOPL\":                                     \"syscall\",\n\t\"syscall.SYS_IOPOLICYSYS\":                              \"syscall\",\n\t\"syscall.SYS_IOPRIO_GET\":                               \"syscall\",\n\t\"syscall.SYS_IOPRIO_SET\":                               \"syscall\",\n\t\"syscall.SYS_IO_CANCEL\":                                \"syscall\",\n\t\"syscall.SYS_IO_DESTROY\":                               \"syscall\",\n\t\"syscall.SYS_IO_GETEVENTS\":                             \"syscall\",\n\t\"syscall.SYS_IO_SETUP\":                                 \"syscall\",\n\t\"syscall.SYS_IO_SUBMIT\":                                \"syscall\",\n\t\"syscall.SYS_IPC\":                                      \"syscall\",\n\t\"syscall.SYS_ISSETUGID\":                                \"syscall\",\n\t\"syscall.SYS_JAIL\":                                     \"syscall\",\n\t\"syscall.SYS_JAIL_ATTACH\":                              \"syscall\",\n\t\"syscall.SYS_JAIL_GET\":                                 \"syscall\",\n\t\"syscall.SYS_JAIL_REMOVE\":                              \"syscall\",\n\t\"syscall.SYS_JAIL_SET\":                                 \"syscall\",\n\t\"syscall.SYS_KDEBUG_TRACE\":                             \"syscall\",\n\t\"syscall.SYS_KENV\":                                     \"syscall\",\n\t\"syscall.SYS_KEVENT\":                                   \"syscall\",\n\t\"syscall.SYS_KEVENT64\":                                 \"syscall\",\n\t\"syscall.SYS_KEXEC_LOAD\":                               \"syscall\",\n\t\"syscall.SYS_KEYCTL\":                                   \"syscall\",\n\t\"syscall.SYS_KILL\":                                     \"syscall\",\n\t\"syscall.SYS_KLDFIND\":                                  \"syscall\",\n\t\"syscall.SYS_KLDFIRSTMOD\":                              \"syscall\",\n\t\"syscall.SYS_KLDLOAD\":                                  \"syscall\",\n\t\"syscall.SYS_KLDNEXT\":                                  \"syscall\",\n\t\"syscall.SYS_KLDSTAT\":                                  \"syscall\",\n\t\"syscall.SYS_KLDSYM\":                                   \"syscall\",\n\t\"syscall.SYS_KLDUNLOAD\":                                \"syscall\",\n\t\"syscall.SYS_KLDUNLOADF\":                               \"syscall\",\n\t\"syscall.SYS_KQUEUE\":                                   \"syscall\",\n\t\"syscall.SYS_KQUEUE1\":                                  \"syscall\",\n\t\"syscall.SYS_KTIMER_CREATE\":                            \"syscall\",\n\t\"syscall.SYS_KTIMER_DELETE\":                            \"syscall\",\n\t\"syscall.SYS_KTIMER_GETOVERRUN\":                        \"syscall\",\n\t\"syscall.SYS_KTIMER_GETTIME\":                           \"syscall\",\n\t\"syscall.SYS_KTIMER_SETTIME\":                           \"syscall\",\n\t\"syscall.SYS_KTRACE\":                                   \"syscall\",\n\t\"syscall.SYS_LCHFLAGS\":                                 \"syscall\",\n\t\"syscall.SYS_LCHMOD\":                                   \"syscall\",\n\t\"syscall.SYS_LCHOWN\":                                   \"syscall\",\n\t\"syscall.SYS_LCHOWN32\":                                 \"syscall\",\n\t\"syscall.SYS_LGETFH\":                                   \"syscall\",\n\t\"syscall.SYS_LGETXATTR\":                                \"syscall\",\n\t\"syscall.SYS_LINK\":                                     \"syscall\",\n\t\"syscall.SYS_LINKAT\":                                   \"syscall\",\n\t\"syscall.SYS_LIO_LISTIO\":                               \"syscall\",\n\t\"syscall.SYS_LISTEN\":                                   \"syscall\",\n\t\"syscall.SYS_LISTXATTR\":                                \"syscall\",\n\t\"syscall.SYS_LLISTXATTR\":                               \"syscall\",\n\t\"syscall.SYS_LOCK\":                                     \"syscall\",\n\t\"syscall.SYS_LOOKUP_DCOOKIE\":                           \"syscall\",\n\t\"syscall.SYS_LPATHCONF\":                                \"syscall\",\n\t\"syscall.SYS_LREMOVEXATTR\":                             \"syscall\",\n\t\"syscall.SYS_LSEEK\":                                    \"syscall\",\n\t\"syscall.SYS_LSETXATTR\":                                \"syscall\",\n\t\"syscall.SYS_LSTAT\":                                    \"syscall\",\n\t\"syscall.SYS_LSTAT64\":                                  \"syscall\",\n\t\"syscall.SYS_LSTAT64_EXTENDED\":                         \"syscall\",\n\t\"syscall.SYS_LSTATV\":                                   \"syscall\",\n\t\"syscall.SYS_LSTAT_EXTENDED\":                           \"syscall\",\n\t\"syscall.SYS_LUTIMES\":                                  \"syscall\",\n\t\"syscall.SYS_MAC_SYSCALL\":                              \"syscall\",\n\t\"syscall.SYS_MADVISE\":                                  \"syscall\",\n\t\"syscall.SYS_MADVISE1\":                                 \"syscall\",\n\t\"syscall.SYS_MAXSYSCALL\":                               \"syscall\",\n\t\"syscall.SYS_MBIND\":                                    \"syscall\",\n\t\"syscall.SYS_MIGRATE_PAGES\":                            \"syscall\",\n\t\"syscall.SYS_MINCORE\":                                  \"syscall\",\n\t\"syscall.SYS_MINHERIT\":                                 \"syscall\",\n\t\"syscall.SYS_MKCOMPLEX\":                                \"syscall\",\n\t\"syscall.SYS_MKDIR\":                                    \"syscall\",\n\t\"syscall.SYS_MKDIRAT\":                                  \"syscall\",\n\t\"syscall.SYS_MKDIR_EXTENDED\":                           \"syscall\",\n\t\"syscall.SYS_MKFIFO\":                                   \"syscall\",\n\t\"syscall.SYS_MKFIFOAT\":                                 \"syscall\",\n\t\"syscall.SYS_MKFIFO_EXTENDED\":                          \"syscall\",\n\t\"syscall.SYS_MKNOD\":                                    \"syscall\",\n\t\"syscall.SYS_MKNODAT\":                                  \"syscall\",\n\t\"syscall.SYS_MLOCK\":                                    \"syscall\",\n\t\"syscall.SYS_MLOCKALL\":                                 \"syscall\",\n\t\"syscall.SYS_MMAP\":                                     \"syscall\",\n\t\"syscall.SYS_MMAP2\":                                    \"syscall\",\n\t\"syscall.SYS_MODCTL\":                                   \"syscall\",\n\t\"syscall.SYS_MODFIND\":                                  \"syscall\",\n\t\"syscall.SYS_MODFNEXT\":                                 \"syscall\",\n\t\"syscall.SYS_MODIFY_LDT\":                               \"syscall\",\n\t\"syscall.SYS_MODNEXT\":                                  \"syscall\",\n\t\"syscall.SYS_MODSTAT\":                                  \"syscall\",\n\t\"syscall.SYS_MODWATCH\":                                 \"syscall\",\n\t\"syscall.SYS_MOUNT\":                                    \"syscall\",\n\t\"syscall.SYS_MOVE_PAGES\":                               \"syscall\",\n\t\"syscall.SYS_MPROTECT\":                                 \"syscall\",\n\t\"syscall.SYS_MPX\":                                      \"syscall\",\n\t\"syscall.SYS_MQUERY\":                                   \"syscall\",\n\t\"syscall.SYS_MQ_GETSETATTR\":                            \"syscall\",\n\t\"syscall.SYS_MQ_NOTIFY\":                                \"syscall\",\n\t\"syscall.SYS_MQ_OPEN\":                                  \"syscall\",\n\t\"syscall.SYS_MQ_TIMEDRECEIVE\":                          \"syscall\",\n\t\"syscall.SYS_MQ_TIMEDSEND\":                             \"syscall\",\n\t\"syscall.SYS_MQ_UNLINK\":                                \"syscall\",\n\t\"syscall.SYS_MREMAP\":                                   \"syscall\",\n\t\"syscall.SYS_MSGCTL\":                                   \"syscall\",\n\t\"syscall.SYS_MSGGET\":                                   \"syscall\",\n\t\"syscall.SYS_MSGRCV\":                                   \"syscall\",\n\t\"syscall.SYS_MSGRCV_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_MSGSND\":                                   \"syscall\",\n\t\"syscall.SYS_MSGSND_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_MSGSYS\":                                   \"syscall\",\n\t\"syscall.SYS_MSYNC\":                                    \"syscall\",\n\t\"syscall.SYS_MSYNC_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_MUNLOCK\":                                  \"syscall\",\n\t\"syscall.SYS_MUNLOCKALL\":                               \"syscall\",\n\t\"syscall.SYS_MUNMAP\":                                   \"syscall\",\n\t\"syscall.SYS_NAME_TO_HANDLE_AT\":                        \"syscall\",\n\t\"syscall.SYS_NANOSLEEP\":                                \"syscall\",\n\t\"syscall.SYS_NEWFSTATAT\":                               \"syscall\",\n\t\"syscall.SYS_NFSCLNT\":                                  \"syscall\",\n\t\"syscall.SYS_NFSSERVCTL\":                               \"syscall\",\n\t\"syscall.SYS_NFSSVC\":                                   \"syscall\",\n\t\"syscall.SYS_NFSTAT\":                                   \"syscall\",\n\t\"syscall.SYS_NICE\":                                     \"syscall\",\n\t\"syscall.SYS_NLSTAT\":                                   \"syscall\",\n\t\"syscall.SYS_NMOUNT\":                                   \"syscall\",\n\t\"syscall.SYS_NSTAT\":                                    \"syscall\",\n\t\"syscall.SYS_NTP_ADJTIME\":                              \"syscall\",\n\t\"syscall.SYS_NTP_GETTIME\":                              \"syscall\",\n\t\"syscall.SYS_OABI_SYSCALL_BASE\":                        \"syscall\",\n\t\"syscall.SYS_OBREAK\":                                   \"syscall\",\n\t\"syscall.SYS_OLDFSTAT\":                                 \"syscall\",\n\t\"syscall.SYS_OLDLSTAT\":                                 \"syscall\",\n\t\"syscall.SYS_OLDOLDUNAME\":                              \"syscall\",\n\t\"syscall.SYS_OLDSTAT\":                                  \"syscall\",\n\t\"syscall.SYS_OLDUNAME\":                                 \"syscall\",\n\t\"syscall.SYS_OPEN\":                                     \"syscall\",\n\t\"syscall.SYS_OPENAT\":                                   \"syscall\",\n\t\"syscall.SYS_OPENBSD_POLL\":                             \"syscall\",\n\t\"syscall.SYS_OPEN_BY_HANDLE_AT\":                        \"syscall\",\n\t\"syscall.SYS_OPEN_EXTENDED\":                            \"syscall\",\n\t\"syscall.SYS_OPEN_NOCANCEL\":                            \"syscall\",\n\t\"syscall.SYS_OVADVISE\":                                 \"syscall\",\n\t\"syscall.SYS_PACCEPT\":                                  \"syscall\",\n\t\"syscall.SYS_PATHCONF\":                                 \"syscall\",\n\t\"syscall.SYS_PAUSE\":                                    \"syscall\",\n\t\"syscall.SYS_PCICONFIG_IOBASE\":                         \"syscall\",\n\t\"syscall.SYS_PCICONFIG_READ\":                           \"syscall\",\n\t\"syscall.SYS_PCICONFIG_WRITE\":                          \"syscall\",\n\t\"syscall.SYS_PDFORK\":                                   \"syscall\",\n\t\"syscall.SYS_PDGETPID\":                                 \"syscall\",\n\t\"syscall.SYS_PDKILL\":                                   \"syscall\",\n\t\"syscall.SYS_PERF_EVENT_OPEN\":                          \"syscall\",\n\t\"syscall.SYS_PERSONALITY\":                              \"syscall\",\n\t\"syscall.SYS_PID_HIBERNATE\":                            \"syscall\",\n\t\"syscall.SYS_PID_RESUME\":                               \"syscall\",\n\t\"syscall.SYS_PID_SHUTDOWN_SOCKETS\":                     \"syscall\",\n\t\"syscall.SYS_PID_SUSPEND\":                              \"syscall\",\n\t\"syscall.SYS_PIPE\":                                     \"syscall\",\n\t\"syscall.SYS_PIPE2\":                                    \"syscall\",\n\t\"syscall.SYS_PIVOT_ROOT\":                               \"syscall\",\n\t\"syscall.SYS_PMC_CONTROL\":                              \"syscall\",\n\t\"syscall.SYS_PMC_GET_INFO\":                             \"syscall\",\n\t\"syscall.SYS_POLL\":                                     \"syscall\",\n\t\"syscall.SYS_POLLTS\":                                   \"syscall\",\n\t\"syscall.SYS_POLL_NOCANCEL\":                            \"syscall\",\n\t\"syscall.SYS_POSIX_FADVISE\":                            \"syscall\",\n\t\"syscall.SYS_POSIX_FALLOCATE\":                          \"syscall\",\n\t\"syscall.SYS_POSIX_OPENPT\":                             \"syscall\",\n\t\"syscall.SYS_POSIX_SPAWN\":                              \"syscall\",\n\t\"syscall.SYS_PPOLL\":                                    \"syscall\",\n\t\"syscall.SYS_PRCTL\":                                    \"syscall\",\n\t\"syscall.SYS_PREAD\":                                    \"syscall\",\n\t\"syscall.SYS_PREAD64\":                                  \"syscall\",\n\t\"syscall.SYS_PREADV\":                                   \"syscall\",\n\t\"syscall.SYS_PREAD_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_PRLIMIT64\":                                \"syscall\",\n\t\"syscall.SYS_PROCCTL\":                                  \"syscall\",\n\t\"syscall.SYS_PROCESS_POLICY\":                           \"syscall\",\n\t\"syscall.SYS_PROCESS_VM_READV\":                         \"syscall\",\n\t\"syscall.SYS_PROCESS_VM_WRITEV\":                        \"syscall\",\n\t\"syscall.SYS_PROC_INFO\":                                \"syscall\",\n\t\"syscall.SYS_PROF\":                                     \"syscall\",\n\t\"syscall.SYS_PROFIL\":                                   \"syscall\",\n\t\"syscall.SYS_PSELECT\":                                  \"syscall\",\n\t\"syscall.SYS_PSELECT6\":                                 \"syscall\",\n\t\"syscall.SYS_PSET_ASSIGN\":                              \"syscall\",\n\t\"syscall.SYS_PSET_CREATE\":                              \"syscall\",\n\t\"syscall.SYS_PSET_DESTROY\":                             \"syscall\",\n\t\"syscall.SYS_PSYNCH_CVBROAD\":                           \"syscall\",\n\t\"syscall.SYS_PSYNCH_CVCLRPREPOST\":                      \"syscall\",\n\t\"syscall.SYS_PSYNCH_CVSIGNAL\":                          \"syscall\",\n\t\"syscall.SYS_PSYNCH_CVWAIT\":                            \"syscall\",\n\t\"syscall.SYS_PSYNCH_MUTEXDROP\":                         \"syscall\",\n\t\"syscall.SYS_PSYNCH_MUTEXWAIT\":                         \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_DOWNGRADE\":                      \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_LONGRDLOCK\":                     \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_RDLOCK\":                         \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_UNLOCK\":                         \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_UNLOCK2\":                        \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_UPGRADE\":                        \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_WRLOCK\":                         \"syscall\",\n\t\"syscall.SYS_PSYNCH_RW_YIELDWRLOCK\":                    \"syscall\",\n\t\"syscall.SYS_PTRACE\":                                   \"syscall\",\n\t\"syscall.SYS_PUTPMSG\":                                  \"syscall\",\n\t\"syscall.SYS_PWRITE\":                                   \"syscall\",\n\t\"syscall.SYS_PWRITE64\":                                 \"syscall\",\n\t\"syscall.SYS_PWRITEV\":                                  \"syscall\",\n\t\"syscall.SYS_PWRITE_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_QUERY_MODULE\":                             \"syscall\",\n\t\"syscall.SYS_QUOTACTL\":                                 \"syscall\",\n\t\"syscall.SYS_RASCTL\":                                   \"syscall\",\n\t\"syscall.SYS_RCTL_ADD_RULE\":                            \"syscall\",\n\t\"syscall.SYS_RCTL_GET_LIMITS\":                          \"syscall\",\n\t\"syscall.SYS_RCTL_GET_RACCT\":                           \"syscall\",\n\t\"syscall.SYS_RCTL_GET_RULES\":                           \"syscall\",\n\t\"syscall.SYS_RCTL_REMOVE_RULE\":                         \"syscall\",\n\t\"syscall.SYS_READ\":                                     \"syscall\",\n\t\"syscall.SYS_READAHEAD\":                                \"syscall\",\n\t\"syscall.SYS_READDIR\":                                  \"syscall\",\n\t\"syscall.SYS_READLINK\":                                 \"syscall\",\n\t\"syscall.SYS_READLINKAT\":                               \"syscall\",\n\t\"syscall.SYS_READV\":                                    \"syscall\",\n\t\"syscall.SYS_READV_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_READ_NOCANCEL\":                            \"syscall\",\n\t\"syscall.SYS_REBOOT\":                                   \"syscall\",\n\t\"syscall.SYS_RECV\":                                     \"syscall\",\n\t\"syscall.SYS_RECVFROM\":                                 \"syscall\",\n\t\"syscall.SYS_RECVFROM_NOCANCEL\":                        \"syscall\",\n\t\"syscall.SYS_RECVMMSG\":                                 \"syscall\",\n\t\"syscall.SYS_RECVMSG\":                                  \"syscall\",\n\t\"syscall.SYS_RECVMSG_NOCANCEL\":                         \"syscall\",\n\t\"syscall.SYS_REMAP_FILE_PAGES\":                         \"syscall\",\n\t\"syscall.SYS_REMOVEXATTR\":                              \"syscall\",\n\t\"syscall.SYS_RENAME\":                                   \"syscall\",\n\t\"syscall.SYS_RENAMEAT\":                                 \"syscall\",\n\t\"syscall.SYS_REQUEST_KEY\":                              \"syscall\",\n\t\"syscall.SYS_RESTART_SYSCALL\":                          \"syscall\",\n\t\"syscall.SYS_REVOKE\":                                   \"syscall\",\n\t\"syscall.SYS_RFORK\":                                    \"syscall\",\n\t\"syscall.SYS_RMDIR\":                                    \"syscall\",\n\t\"syscall.SYS_RTPRIO\":                                   \"syscall\",\n\t\"syscall.SYS_RTPRIO_THREAD\":                            \"syscall\",\n\t\"syscall.SYS_RT_SIGACTION\":                             \"syscall\",\n\t\"syscall.SYS_RT_SIGPENDING\":                            \"syscall\",\n\t\"syscall.SYS_RT_SIGPROCMASK\":                           \"syscall\",\n\t\"syscall.SYS_RT_SIGQUEUEINFO\":                          \"syscall\",\n\t\"syscall.SYS_RT_SIGRETURN\":                             \"syscall\",\n\t\"syscall.SYS_RT_SIGSUSPEND\":                            \"syscall\",\n\t\"syscall.SYS_RT_SIGTIMEDWAIT\":                          \"syscall\",\n\t\"syscall.SYS_RT_TGSIGQUEUEINFO\":                        \"syscall\",\n\t\"syscall.SYS_SBRK\":                                     \"syscall\",\n\t\"syscall.SYS_SCHED_GETAFFINITY\":                        \"syscall\",\n\t\"syscall.SYS_SCHED_GETPARAM\":                           \"syscall\",\n\t\"syscall.SYS_SCHED_GETSCHEDULER\":                       \"syscall\",\n\t\"syscall.SYS_SCHED_GET_PRIORITY_MAX\":                   \"syscall\",\n\t\"syscall.SYS_SCHED_GET_PRIORITY_MIN\":                   \"syscall\",\n\t\"syscall.SYS_SCHED_RR_GET_INTERVAL\":                    \"syscall\",\n\t\"syscall.SYS_SCHED_SETAFFINITY\":                        \"syscall\",\n\t\"syscall.SYS_SCHED_SETPARAM\":                           \"syscall\",\n\t\"syscall.SYS_SCHED_SETSCHEDULER\":                       \"syscall\",\n\t\"syscall.SYS_SCHED_YIELD\":                              \"syscall\",\n\t\"syscall.SYS_SCTP_GENERIC_RECVMSG\":                     \"syscall\",\n\t\"syscall.SYS_SCTP_GENERIC_SENDMSG\":                     \"syscall\",\n\t\"syscall.SYS_SCTP_GENERIC_SENDMSG_IOV\":                 \"syscall\",\n\t\"syscall.SYS_SCTP_PEELOFF\":                             \"syscall\",\n\t\"syscall.SYS_SEARCHFS\":                                 \"syscall\",\n\t\"syscall.SYS_SECURITY\":                                 \"syscall\",\n\t\"syscall.SYS_SELECT\":                                   \"syscall\",\n\t\"syscall.SYS_SELECT_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_SEMCONFIG\":                                \"syscall\",\n\t\"syscall.SYS_SEMCTL\":                                   \"syscall\",\n\t\"syscall.SYS_SEMGET\":                                   \"syscall\",\n\t\"syscall.SYS_SEMOP\":                                    \"syscall\",\n\t\"syscall.SYS_SEMSYS\":                                   \"syscall\",\n\t\"syscall.SYS_SEMTIMEDOP\":                               \"syscall\",\n\t\"syscall.SYS_SEM_CLOSE\":                                \"syscall\",\n\t\"syscall.SYS_SEM_DESTROY\":                              \"syscall\",\n\t\"syscall.SYS_SEM_GETVALUE\":                             \"syscall\",\n\t\"syscall.SYS_SEM_INIT\":                                 \"syscall\",\n\t\"syscall.SYS_SEM_OPEN\":                                 \"syscall\",\n\t\"syscall.SYS_SEM_POST\":                                 \"syscall\",\n\t\"syscall.SYS_SEM_TRYWAIT\":                              \"syscall\",\n\t\"syscall.SYS_SEM_UNLINK\":                               \"syscall\",\n\t\"syscall.SYS_SEM_WAIT\":                                 \"syscall\",\n\t\"syscall.SYS_SEM_WAIT_NOCANCEL\":                        \"syscall\",\n\t\"syscall.SYS_SEND\":                                     \"syscall\",\n\t\"syscall.SYS_SENDFILE\":                                 \"syscall\",\n\t\"syscall.SYS_SENDFILE64\":                               \"syscall\",\n\t\"syscall.SYS_SENDMMSG\":                                 \"syscall\",\n\t\"syscall.SYS_SENDMSG\":                                  \"syscall\",\n\t\"syscall.SYS_SENDMSG_NOCANCEL\":                         \"syscall\",\n\t\"syscall.SYS_SENDTO\":                                   \"syscall\",\n\t\"syscall.SYS_SENDTO_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_SETATTRLIST\":                              \"syscall\",\n\t\"syscall.SYS_SETAUDIT\":                                 \"syscall\",\n\t\"syscall.SYS_SETAUDIT_ADDR\":                            \"syscall\",\n\t\"syscall.SYS_SETAUID\":                                  \"syscall\",\n\t\"syscall.SYS_SETCONTEXT\":                               \"syscall\",\n\t\"syscall.SYS_SETDOMAINNAME\":                            \"syscall\",\n\t\"syscall.SYS_SETEGID\":                                  \"syscall\",\n\t\"syscall.SYS_SETEUID\":                                  \"syscall\",\n\t\"syscall.SYS_SETFIB\":                                   \"syscall\",\n\t\"syscall.SYS_SETFSGID\":                                 \"syscall\",\n\t\"syscall.SYS_SETFSGID32\":                               \"syscall\",\n\t\"syscall.SYS_SETFSUID\":                                 \"syscall\",\n\t\"syscall.SYS_SETFSUID32\":                               \"syscall\",\n\t\"syscall.SYS_SETGID\":                                   \"syscall\",\n\t\"syscall.SYS_SETGID32\":                                 \"syscall\",\n\t\"syscall.SYS_SETGROUPS\":                                \"syscall\",\n\t\"syscall.SYS_SETGROUPS32\":                              \"syscall\",\n\t\"syscall.SYS_SETHOSTNAME\":                              \"syscall\",\n\t\"syscall.SYS_SETITIMER\":                                \"syscall\",\n\t\"syscall.SYS_SETLCID\":                                  \"syscall\",\n\t\"syscall.SYS_SETLOGIN\":                                 \"syscall\",\n\t\"syscall.SYS_SETLOGINCLASS\":                            \"syscall\",\n\t\"syscall.SYS_SETNS\":                                    \"syscall\",\n\t\"syscall.SYS_SETPGID\":                                  \"syscall\",\n\t\"syscall.SYS_SETPRIORITY\":                              \"syscall\",\n\t\"syscall.SYS_SETPRIVEXEC\":                              \"syscall\",\n\t\"syscall.SYS_SETREGID\":                                 \"syscall\",\n\t\"syscall.SYS_SETREGID32\":                               \"syscall\",\n\t\"syscall.SYS_SETRESGID\":                                \"syscall\",\n\t\"syscall.SYS_SETRESGID32\":                              \"syscall\",\n\t\"syscall.SYS_SETRESUID\":                                \"syscall\",\n\t\"syscall.SYS_SETRESUID32\":                              \"syscall\",\n\t\"syscall.SYS_SETREUID\":                                 \"syscall\",\n\t\"syscall.SYS_SETREUID32\":                               \"syscall\",\n\t\"syscall.SYS_SETRLIMIT\":                                \"syscall\",\n\t\"syscall.SYS_SETRTABLE\":                                \"syscall\",\n\t\"syscall.SYS_SETSGROUPS\":                               \"syscall\",\n\t\"syscall.SYS_SETSID\":                                   \"syscall\",\n\t\"syscall.SYS_SETSOCKOPT\":                               \"syscall\",\n\t\"syscall.SYS_SETTID\":                                   \"syscall\",\n\t\"syscall.SYS_SETTID_WITH_PID\":                          \"syscall\",\n\t\"syscall.SYS_SETTIMEOFDAY\":                             \"syscall\",\n\t\"syscall.SYS_SETUID\":                                   \"syscall\",\n\t\"syscall.SYS_SETUID32\":                                 \"syscall\",\n\t\"syscall.SYS_SETWGROUPS\":                               \"syscall\",\n\t\"syscall.SYS_SETXATTR\":                                 \"syscall\",\n\t\"syscall.SYS_SET_MEMPOLICY\":                            \"syscall\",\n\t\"syscall.SYS_SET_ROBUST_LIST\":                          \"syscall\",\n\t\"syscall.SYS_SET_THREAD_AREA\":                          \"syscall\",\n\t\"syscall.SYS_SET_TID_ADDRESS\":                          \"syscall\",\n\t\"syscall.SYS_SGETMASK\":                                 \"syscall\",\n\t\"syscall.SYS_SHARED_REGION_CHECK_NP\":                   \"syscall\",\n\t\"syscall.SYS_SHARED_REGION_MAP_AND_SLIDE_NP\":           \"syscall\",\n\t\"syscall.SYS_SHMAT\":                                    \"syscall\",\n\t\"syscall.SYS_SHMCTL\":                                   \"syscall\",\n\t\"syscall.SYS_SHMDT\":                                    \"syscall\",\n\t\"syscall.SYS_SHMGET\":                                   \"syscall\",\n\t\"syscall.SYS_SHMSYS\":                                   \"syscall\",\n\t\"syscall.SYS_SHM_OPEN\":                                 \"syscall\",\n\t\"syscall.SYS_SHM_UNLINK\":                               \"syscall\",\n\t\"syscall.SYS_SHUTDOWN\":                                 \"syscall\",\n\t\"syscall.SYS_SIGACTION\":                                \"syscall\",\n\t\"syscall.SYS_SIGALTSTACK\":                              \"syscall\",\n\t\"syscall.SYS_SIGNAL\":                                   \"syscall\",\n\t\"syscall.SYS_SIGNALFD\":                                 \"syscall\",\n\t\"syscall.SYS_SIGNALFD4\":                                \"syscall\",\n\t\"syscall.SYS_SIGPENDING\":                               \"syscall\",\n\t\"syscall.SYS_SIGPROCMASK\":                              \"syscall\",\n\t\"syscall.SYS_SIGQUEUE\":                                 \"syscall\",\n\t\"syscall.SYS_SIGQUEUEINFO\":                             \"syscall\",\n\t\"syscall.SYS_SIGRETURN\":                                \"syscall\",\n\t\"syscall.SYS_SIGSUSPEND\":                               \"syscall\",\n\t\"syscall.SYS_SIGSUSPEND_NOCANCEL\":                      \"syscall\",\n\t\"syscall.SYS_SIGTIMEDWAIT\":                             \"syscall\",\n\t\"syscall.SYS_SIGWAIT\":                                  \"syscall\",\n\t\"syscall.SYS_SIGWAITINFO\":                              \"syscall\",\n\t\"syscall.SYS_SOCKET\":                                   \"syscall\",\n\t\"syscall.SYS_SOCKETCALL\":                               \"syscall\",\n\t\"syscall.SYS_SOCKETPAIR\":                               \"syscall\",\n\t\"syscall.SYS_SPLICE\":                                   \"syscall\",\n\t\"syscall.SYS_SSETMASK\":                                 \"syscall\",\n\t\"syscall.SYS_SSTK\":                                     \"syscall\",\n\t\"syscall.SYS_STACK_SNAPSHOT\":                           \"syscall\",\n\t\"syscall.SYS_STAT\":                                     \"syscall\",\n\t\"syscall.SYS_STAT64\":                                   \"syscall\",\n\t\"syscall.SYS_STAT64_EXTENDED\":                          \"syscall\",\n\t\"syscall.SYS_STATFS\":                                   \"syscall\",\n\t\"syscall.SYS_STATFS64\":                                 \"syscall\",\n\t\"syscall.SYS_STATV\":                                    \"syscall\",\n\t\"syscall.SYS_STATVFS1\":                                 \"syscall\",\n\t\"syscall.SYS_STAT_EXTENDED\":                            \"syscall\",\n\t\"syscall.SYS_STIME\":                                    \"syscall\",\n\t\"syscall.SYS_STTY\":                                     \"syscall\",\n\t\"syscall.SYS_SWAPCONTEXT\":                              \"syscall\",\n\t\"syscall.SYS_SWAPCTL\":                                  \"syscall\",\n\t\"syscall.SYS_SWAPOFF\":                                  \"syscall\",\n\t\"syscall.SYS_SWAPON\":                                   \"syscall\",\n\t\"syscall.SYS_SYMLINK\":                                  \"syscall\",\n\t\"syscall.SYS_SYMLINKAT\":                                \"syscall\",\n\t\"syscall.SYS_SYNC\":                                     \"syscall\",\n\t\"syscall.SYS_SYNCFS\":                                   \"syscall\",\n\t\"syscall.SYS_SYNC_FILE_RANGE\":                          \"syscall\",\n\t\"syscall.SYS_SYSARCH\":                                  \"syscall\",\n\t\"syscall.SYS_SYSCALL\":                                  \"syscall\",\n\t\"syscall.SYS_SYSCALL_BASE\":                             \"syscall\",\n\t\"syscall.SYS_SYSFS\":                                    \"syscall\",\n\t\"syscall.SYS_SYSINFO\":                                  \"syscall\",\n\t\"syscall.SYS_SYSLOG\":                                   \"syscall\",\n\t\"syscall.SYS_TEE\":                                      \"syscall\",\n\t\"syscall.SYS_TGKILL\":                                   \"syscall\",\n\t\"syscall.SYS_THREAD_SELFID\":                            \"syscall\",\n\t\"syscall.SYS_THR_CREATE\":                               \"syscall\",\n\t\"syscall.SYS_THR_EXIT\":                                 \"syscall\",\n\t\"syscall.SYS_THR_KILL\":                                 \"syscall\",\n\t\"syscall.SYS_THR_KILL2\":                                \"syscall\",\n\t\"syscall.SYS_THR_NEW\":                                  \"syscall\",\n\t\"syscall.SYS_THR_SELF\":                                 \"syscall\",\n\t\"syscall.SYS_THR_SET_NAME\":                             \"syscall\",\n\t\"syscall.SYS_THR_SUSPEND\":                              \"syscall\",\n\t\"syscall.SYS_THR_WAKE\":                                 \"syscall\",\n\t\"syscall.SYS_TIME\":                                     \"syscall\",\n\t\"syscall.SYS_TIMERFD_CREATE\":                           \"syscall\",\n\t\"syscall.SYS_TIMERFD_GETTIME\":                          \"syscall\",\n\t\"syscall.SYS_TIMERFD_SETTIME\":                          \"syscall\",\n\t\"syscall.SYS_TIMER_CREATE\":                             \"syscall\",\n\t\"syscall.SYS_TIMER_DELETE\":                             \"syscall\",\n\t\"syscall.SYS_TIMER_GETOVERRUN\":                         \"syscall\",\n\t\"syscall.SYS_TIMER_GETTIME\":                            \"syscall\",\n\t\"syscall.SYS_TIMER_SETTIME\":                            \"syscall\",\n\t\"syscall.SYS_TIMES\":                                    \"syscall\",\n\t\"syscall.SYS_TKILL\":                                    \"syscall\",\n\t\"syscall.SYS_TRUNCATE\":                                 \"syscall\",\n\t\"syscall.SYS_TRUNCATE64\":                               \"syscall\",\n\t\"syscall.SYS_TUXCALL\":                                  \"syscall\",\n\t\"syscall.SYS_UGETRLIMIT\":                               \"syscall\",\n\t\"syscall.SYS_ULIMIT\":                                   \"syscall\",\n\t\"syscall.SYS_UMASK\":                                    \"syscall\",\n\t\"syscall.SYS_UMASK_EXTENDED\":                           \"syscall\",\n\t\"syscall.SYS_UMOUNT\":                                   \"syscall\",\n\t\"syscall.SYS_UMOUNT2\":                                  \"syscall\",\n\t\"syscall.SYS_UNAME\":                                    \"syscall\",\n\t\"syscall.SYS_UNDELETE\":                                 \"syscall\",\n\t\"syscall.SYS_UNLINK\":                                   \"syscall\",\n\t\"syscall.SYS_UNLINKAT\":                                 \"syscall\",\n\t\"syscall.SYS_UNMOUNT\":                                  \"syscall\",\n\t\"syscall.SYS_UNSHARE\":                                  \"syscall\",\n\t\"syscall.SYS_USELIB\":                                   \"syscall\",\n\t\"syscall.SYS_USTAT\":                                    \"syscall\",\n\t\"syscall.SYS_UTIME\":                                    \"syscall\",\n\t\"syscall.SYS_UTIMENSAT\":                                \"syscall\",\n\t\"syscall.SYS_UTIMES\":                                   \"syscall\",\n\t\"syscall.SYS_UTRACE\":                                   \"syscall\",\n\t\"syscall.SYS_UUIDGEN\":                                  \"syscall\",\n\t\"syscall.SYS_VADVISE\":                                  \"syscall\",\n\t\"syscall.SYS_VFORK\":                                    \"syscall\",\n\t\"syscall.SYS_VHANGUP\":                                  \"syscall\",\n\t\"syscall.SYS_VM86\":                                     \"syscall\",\n\t\"syscall.SYS_VM86OLD\":                                  \"syscall\",\n\t\"syscall.SYS_VMSPLICE\":                                 \"syscall\",\n\t\"syscall.SYS_VM_PRESSURE_MONITOR\":                      \"syscall\",\n\t\"syscall.SYS_VSERVER\":                                  \"syscall\",\n\t\"syscall.SYS_WAIT4\":                                    \"syscall\",\n\t\"syscall.SYS_WAIT4_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_WAIT6\":                                    \"syscall\",\n\t\"syscall.SYS_WAITEVENT\":                                \"syscall\",\n\t\"syscall.SYS_WAITID\":                                   \"syscall\",\n\t\"syscall.SYS_WAITID_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_WAITPID\":                                  \"syscall\",\n\t\"syscall.SYS_WATCHEVENT\":                               \"syscall\",\n\t\"syscall.SYS_WORKQ_KERNRETURN\":                         \"syscall\",\n\t\"syscall.SYS_WORKQ_OPEN\":                               \"syscall\",\n\t\"syscall.SYS_WRITE\":                                    \"syscall\",\n\t\"syscall.SYS_WRITEV\":                                   \"syscall\",\n\t\"syscall.SYS_WRITEV_NOCANCEL\":                          \"syscall\",\n\t\"syscall.SYS_WRITE_NOCANCEL\":                           \"syscall\",\n\t\"syscall.SYS_YIELD\":                                    \"syscall\",\n\t\"syscall.SYS__LLSEEK\":                                  \"syscall\",\n\t\"syscall.SYS__LWP_CONTINUE\":                            \"syscall\",\n\t\"syscall.SYS__LWP_CREATE\":                              \"syscall\",\n\t\"syscall.SYS__LWP_CTL\":                                 \"syscall\",\n\t\"syscall.SYS__LWP_DETACH\":                              \"syscall\",\n\t\"syscall.SYS__LWP_EXIT\":                                \"syscall\",\n\t\"syscall.SYS__LWP_GETNAME\":                             \"syscall\",\n\t\"syscall.SYS__LWP_GETPRIVATE\":                          \"syscall\",\n\t\"syscall.SYS__LWP_KILL\":                                \"syscall\",\n\t\"syscall.SYS__LWP_PARK\":                                \"syscall\",\n\t\"syscall.SYS__LWP_SELF\":                                \"syscall\",\n\t\"syscall.SYS__LWP_SETNAME\":                             \"syscall\",\n\t\"syscall.SYS__LWP_SETPRIVATE\":                          \"syscall\",\n\t\"syscall.SYS__LWP_SUSPEND\":                             \"syscall\",\n\t\"syscall.SYS__LWP_UNPARK\":                              \"syscall\",\n\t\"syscall.SYS__LWP_UNPARK_ALL\":                          \"syscall\",\n\t\"syscall.SYS__LWP_WAIT\":                                \"syscall\",\n\t\"syscall.SYS__LWP_WAKEUP\":                              \"syscall\",\n\t\"syscall.SYS__NEWSELECT\":                               \"syscall\",\n\t\"syscall.SYS__PSET_BIND\":                               \"syscall\",\n\t\"syscall.SYS__SCHED_GETAFFINITY\":                       \"syscall\",\n\t\"syscall.SYS__SCHED_GETPARAM\":                          \"syscall\",\n\t\"syscall.SYS__SCHED_SETAFFINITY\":                       \"syscall\",\n\t\"syscall.SYS__SCHED_SETPARAM\":                          \"syscall\",\n\t\"syscall.SYS__SYSCTL\":                                  \"syscall\",\n\t\"syscall.SYS__UMTX_LOCK\":                               \"syscall\",\n\t\"syscall.SYS__UMTX_OP\":                                 \"syscall\",\n\t\"syscall.SYS__UMTX_UNLOCK\":                             \"syscall\",\n\t\"syscall.SYS___ACL_ACLCHECK_FD\":                        \"syscall\",\n\t\"syscall.SYS___ACL_ACLCHECK_FILE\":                      \"syscall\",\n\t\"syscall.SYS___ACL_ACLCHECK_LINK\":                      \"syscall\",\n\t\"syscall.SYS___ACL_DELETE_FD\":                          \"syscall\",\n\t\"syscall.SYS___ACL_DELETE_FILE\":                        \"syscall\",\n\t\"syscall.SYS___ACL_DELETE_LINK\":                        \"syscall\",\n\t\"syscall.SYS___ACL_GET_FD\":                             \"syscall\",\n\t\"syscall.SYS___ACL_GET_FILE\":                           \"syscall\",\n\t\"syscall.SYS___ACL_GET_LINK\":                           \"syscall\",\n\t\"syscall.SYS___ACL_SET_FD\":                             \"syscall\",\n\t\"syscall.SYS___ACL_SET_FILE\":                           \"syscall\",\n\t\"syscall.SYS___ACL_SET_LINK\":                           \"syscall\",\n\t\"syscall.SYS___CLONE\":                                  \"syscall\",\n\t\"syscall.SYS___DISABLE_THREADSIGNAL\":                   \"syscall\",\n\t\"syscall.SYS___GETCWD\":                                 \"syscall\",\n\t\"syscall.SYS___GETLOGIN\":                               \"syscall\",\n\t\"syscall.SYS___GET_TCB\":                                \"syscall\",\n\t\"syscall.SYS___MAC_EXECVE\":                             \"syscall\",\n\t\"syscall.SYS___MAC_GETFSSTAT\":                          \"syscall\",\n\t\"syscall.SYS___MAC_GET_FD\":                             \"syscall\",\n\t\"syscall.SYS___MAC_GET_FILE\":                           \"syscall\",\n\t\"syscall.SYS___MAC_GET_LCID\":                           \"syscall\",\n\t\"syscall.SYS___MAC_GET_LCTX\":                           \"syscall\",\n\t\"syscall.SYS___MAC_GET_LINK\":                           \"syscall\",\n\t\"syscall.SYS___MAC_GET_MOUNT\":                          \"syscall\",\n\t\"syscall.SYS___MAC_GET_PID\":                            \"syscall\",\n\t\"syscall.SYS___MAC_GET_PROC\":                           \"syscall\",\n\t\"syscall.SYS___MAC_MOUNT\":                              \"syscall\",\n\t\"syscall.SYS___MAC_SET_FD\":                             \"syscall\",\n\t\"syscall.SYS___MAC_SET_FILE\":                           \"syscall\",\n\t\"syscall.SYS___MAC_SET_LCTX\":                           \"syscall\",\n\t\"syscall.SYS___MAC_SET_LINK\":                           \"syscall\",\n\t\"syscall.SYS___MAC_SET_PROC\":                           \"syscall\",\n\t\"syscall.SYS___MAC_SYSCALL\":                            \"syscall\",\n\t\"syscall.SYS___OLD_SEMWAIT_SIGNAL\":                     \"syscall\",\n\t\"syscall.SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL\":            \"syscall\",\n\t\"syscall.SYS___POSIX_CHOWN\":                            \"syscall\",\n\t\"syscall.SYS___POSIX_FCHOWN\":                           \"syscall\",\n\t\"syscall.SYS___POSIX_LCHOWN\":                           \"syscall\",\n\t\"syscall.SYS___POSIX_RENAME\":                           \"syscall\",\n\t\"syscall.SYS___PTHREAD_CANCELED\":                       \"syscall\",\n\t\"syscall.SYS___PTHREAD_CHDIR\":                          \"syscall\",\n\t\"syscall.SYS___PTHREAD_FCHDIR\":                         \"syscall\",\n\t\"syscall.SYS___PTHREAD_KILL\":                           \"syscall\",\n\t\"syscall.SYS___PTHREAD_MARKCANCEL\":                     \"syscall\",\n\t\"syscall.SYS___PTHREAD_SIGMASK\":                        \"syscall\",\n\t\"syscall.SYS___QUOTACTL\":                               \"syscall\",\n\t\"syscall.SYS___SEMCTL\":                                 \"syscall\",\n\t\"syscall.SYS___SEMWAIT_SIGNAL\":                         \"syscall\",\n\t\"syscall.SYS___SEMWAIT_SIGNAL_NOCANCEL\":                \"syscall\",\n\t\"syscall.SYS___SETLOGIN\":                               \"syscall\",\n\t\"syscall.SYS___SETUGID\":                                \"syscall\",\n\t\"syscall.SYS___SET_TCB\":                                \"syscall\",\n\t\"syscall.SYS___SIGACTION_SIGTRAMP\":                     \"syscall\",\n\t\"syscall.SYS___SIGTIMEDWAIT\":                           \"syscall\",\n\t\"syscall.SYS___SIGWAIT\":                                \"syscall\",\n\t\"syscall.SYS___SIGWAIT_NOCANCEL\":                       \"syscall\",\n\t\"syscall.SYS___SYSCTL\":                                 \"syscall\",\n\t\"syscall.SYS___TFORK\":                                  \"syscall\",\n\t\"syscall.SYS___THREXIT\":                                \"syscall\",\n\t\"syscall.SYS___THRSIGDIVERT\":                           \"syscall\",\n\t\"syscall.SYS___THRSLEEP\":                               \"syscall\",\n\t\"syscall.SYS___THRWAKEUP\":                              \"syscall\",\n\t\"syscall.S_ARCH1\":                                      \"syscall\",\n\t\"syscall.S_ARCH2\":                                      \"syscall\",\n\t\"syscall.S_BLKSIZE\":                                    \"syscall\",\n\t\"syscall.S_IEXEC\":                                      \"syscall\",\n\t\"syscall.S_IFBLK\":                                      \"syscall\",\n\t\"syscall.S_IFCHR\":                                      \"syscall\",\n\t\"syscall.S_IFDIR\":                                      \"syscall\",\n\t\"syscall.S_IFIFO\":                                      \"syscall\",\n\t\"syscall.S_IFLNK\":                                      \"syscall\",\n\t\"syscall.S_IFMT\":                                       \"syscall\",\n\t\"syscall.S_IFREG\":                                      \"syscall\",\n\t\"syscall.S_IFSOCK\":                                     \"syscall\",\n\t\"syscall.S_IFWHT\":                                      \"syscall\",\n\t\"syscall.S_IREAD\":                                      \"syscall\",\n\t\"syscall.S_IRGRP\":                                      \"syscall\",\n\t\"syscall.S_IROTH\":                                      \"syscall\",\n\t\"syscall.S_IRUSR\":                                      \"syscall\",\n\t\"syscall.S_IRWXG\":                                      \"syscall\",\n\t\"syscall.S_IRWXO\":                                      \"syscall\",\n\t\"syscall.S_IRWXU\":                                      \"syscall\",\n\t\"syscall.S_ISGID\":                                      \"syscall\",\n\t\"syscall.S_ISTXT\":                                      \"syscall\",\n\t\"syscall.S_ISUID\":                                      \"syscall\",\n\t\"syscall.S_ISVTX\":                                      \"syscall\",\n\t\"syscall.S_IWGRP\":                                      \"syscall\",\n\t\"syscall.S_IWOTH\":                                      \"syscall\",\n\t\"syscall.S_IWRITE\":                                     \"syscall\",\n\t\"syscall.S_IWUSR\":                                      \"syscall\",\n\t\"syscall.S_IXGRP\":                                      \"syscall\",\n\t\"syscall.S_IXOTH\":                                      \"syscall\",\n\t\"syscall.S_IXUSR\":                                      \"syscall\",\n\t\"syscall.S_LOGIN_SET\":                                  \"syscall\",\n\t\"syscall.SecurityAttributes\":                           \"syscall\",\n\t\"syscall.Seek\":                                         \"syscall\",\n\t\"syscall.Select\":                                       \"syscall\",\n\t\"syscall.Sendfile\":                                     \"syscall\",\n\t\"syscall.Sendmsg\":                                      \"syscall\",\n\t\"syscall.SendmsgN\":                                     \"syscall\",\n\t\"syscall.Sendto\":                                       \"syscall\",\n\t\"syscall.Servent\":                                      \"syscall\",\n\t\"syscall.SetBpf\":                                       \"syscall\",\n\t\"syscall.SetBpfBuflen\":                                 \"syscall\",\n\t\"syscall.SetBpfDatalink\":                               \"syscall\",\n\t\"syscall.SetBpfHeadercmpl\":                             \"syscall\",\n\t\"syscall.SetBpfImmediate\":                              \"syscall\",\n\t\"syscall.SetBpfInterface\":                              \"syscall\",\n\t\"syscall.SetBpfPromisc\":                                \"syscall\",\n\t\"syscall.SetBpfTimeout\":                                \"syscall\",\n\t\"syscall.SetCurrentDirectory\":                          \"syscall\",\n\t\"syscall.SetEndOfFile\":                                 \"syscall\",\n\t\"syscall.SetEnvironmentVariable\":                       \"syscall\",\n\t\"syscall.SetFileAttributes\":                            \"syscall\",\n\t\"syscall.SetFileCompletionNotificationModes\":           \"syscall\",\n\t\"syscall.SetFilePointer\":                               \"syscall\",\n\t\"syscall.SetFileTime\":                                  \"syscall\",\n\t\"syscall.SetHandleInformation\":                         \"syscall\",\n\t\"syscall.SetKevent\":                                    \"syscall\",\n\t\"syscall.SetLsfPromisc\":                                \"syscall\",\n\t\"syscall.SetNonblock\":                                  \"syscall\",\n\t\"syscall.Setdomainname\":                                \"syscall\",\n\t\"syscall.Setegid\":                                      \"syscall\",\n\t\"syscall.Setenv\":                                       \"syscall\",\n\t\"syscall.Seteuid\":                                      \"syscall\",\n\t\"syscall.Setfsgid\":                                     \"syscall\",\n\t\"syscall.Setfsuid\":                                     \"syscall\",\n\t\"syscall.Setgid\":                                       \"syscall\",\n\t\"syscall.Setgroups\":                                    \"syscall\",\n\t\"syscall.Sethostname\":                                  \"syscall\",\n\t\"syscall.Setlogin\":                                     \"syscall\",\n\t\"syscall.Setpgid\":                                      \"syscall\",\n\t\"syscall.Setpriority\":                                  \"syscall\",\n\t\"syscall.Setprivexec\":                                  \"syscall\",\n\t\"syscall.Setregid\":                                     \"syscall\",\n\t\"syscall.Setresgid\":                                    \"syscall\",\n\t\"syscall.Setresuid\":                                    \"syscall\",\n\t\"syscall.Setreuid\":                                     \"syscall\",\n\t\"syscall.Setrlimit\":                                    \"syscall\",\n\t\"syscall.Setsid\":                                       \"syscall\",\n\t\"syscall.Setsockopt\":                                   \"syscall\",\n\t\"syscall.SetsockoptByte\":                               \"syscall\",\n\t\"syscall.SetsockoptICMPv6Filter\":                       \"syscall\",\n\t\"syscall.SetsockoptIPMreq\":                             \"syscall\",\n\t\"syscall.SetsockoptIPMreqn\":                            \"syscall\",\n\t\"syscall.SetsockoptIPv6Mreq\":                           \"syscall\",\n\t\"syscall.SetsockoptInet4Addr\":                          \"syscall\",\n\t\"syscall.SetsockoptInt\":                                \"syscall\",\n\t\"syscall.SetsockoptLinger\":                             \"syscall\",\n\t\"syscall.SetsockoptString\":                             \"syscall\",\n\t\"syscall.SetsockoptTimeval\":                            \"syscall\",\n\t\"syscall.Settimeofday\":                                 \"syscall\",\n\t\"syscall.Setuid\":                                       \"syscall\",\n\t\"syscall.Setxattr\":                                     \"syscall\",\n\t\"syscall.Shutdown\":                                     \"syscall\",\n\t\"syscall.SidTypeAlias\":                                 \"syscall\",\n\t\"syscall.SidTypeComputer\":                              \"syscall\",\n\t\"syscall.SidTypeDeletedAccount\":                        \"syscall\",\n\t\"syscall.SidTypeDomain\":                                \"syscall\",\n\t\"syscall.SidTypeGroup\":                                 \"syscall\",\n\t\"syscall.SidTypeInvalid\":                               \"syscall\",\n\t\"syscall.SidTypeLabel\":                                 \"syscall\",\n\t\"syscall.SidTypeUnknown\":                               \"syscall\",\n\t\"syscall.SidTypeUser\":                                  \"syscall\",\n\t\"syscall.SidTypeWellKnownGroup\":                        \"syscall\",\n\t\"syscall.Signal\":                                       \"syscall\",\n\t\"syscall.SizeofBpfHdr\":                                 \"syscall\",\n\t\"syscall.SizeofBpfInsn\":                                \"syscall\",\n\t\"syscall.SizeofBpfProgram\":                             \"syscall\",\n\t\"syscall.SizeofBpfStat\":                                \"syscall\",\n\t\"syscall.SizeofBpfVersion\":                             \"syscall\",\n\t\"syscall.SizeofBpfZbuf\":                                \"syscall\",\n\t\"syscall.SizeofBpfZbufHeader\":                          \"syscall\",\n\t\"syscall.SizeofCmsghdr\":                                \"syscall\",\n\t\"syscall.SizeofICMPv6Filter\":                           \"syscall\",\n\t\"syscall.SizeofIPMreq\":                                 \"syscall\",\n\t\"syscall.SizeofIPMreqn\":                                \"syscall\",\n\t\"syscall.SizeofIPv6MTUInfo\":                            \"syscall\",\n\t\"syscall.SizeofIPv6Mreq\":                               \"syscall\",\n\t\"syscall.SizeofIfAddrmsg\":                              \"syscall\",\n\t\"syscall.SizeofIfAnnounceMsghdr\":                       \"syscall\",\n\t\"syscall.SizeofIfData\":                                 \"syscall\",\n\t\"syscall.SizeofIfInfomsg\":                              \"syscall\",\n\t\"syscall.SizeofIfMsghdr\":                               \"syscall\",\n\t\"syscall.SizeofIfaMsghdr\":                              \"syscall\",\n\t\"syscall.SizeofIfmaMsghdr\":                             \"syscall\",\n\t\"syscall.SizeofIfmaMsghdr2\":                            \"syscall\",\n\t\"syscall.SizeofInet4Pktinfo\":                           \"syscall\",\n\t\"syscall.SizeofInet6Pktinfo\":                           \"syscall\",\n\t\"syscall.SizeofInotifyEvent\":                           \"syscall\",\n\t\"syscall.SizeofLinger\":                                 \"syscall\",\n\t\"syscall.SizeofMsghdr\":                                 \"syscall\",\n\t\"syscall.SizeofNlAttr\":                                 \"syscall\",\n\t\"syscall.SizeofNlMsgerr\":                               \"syscall\",\n\t\"syscall.SizeofNlMsghdr\":                               \"syscall\",\n\t\"syscall.SizeofRtAttr\":                                 \"syscall\",\n\t\"syscall.SizeofRtGenmsg\":                               \"syscall\",\n\t\"syscall.SizeofRtMetrics\":                              \"syscall\",\n\t\"syscall.SizeofRtMsg\":                                  \"syscall\",\n\t\"syscall.SizeofRtMsghdr\":                               \"syscall\",\n\t\"syscall.SizeofRtNexthop\":                              \"syscall\",\n\t\"syscall.SizeofSockFilter\":                             \"syscall\",\n\t\"syscall.SizeofSockFprog\":                              \"syscall\",\n\t\"syscall.SizeofSockaddrAny\":                            \"syscall\",\n\t\"syscall.SizeofSockaddrDatalink\":                       \"syscall\",\n\t\"syscall.SizeofSockaddrInet4\":                          \"syscall\",\n\t\"syscall.SizeofSockaddrInet6\":                          \"syscall\",\n\t\"syscall.SizeofSockaddrLinklayer\":                      \"syscall\",\n\t\"syscall.SizeofSockaddrNetlink\":                        \"syscall\",\n\t\"syscall.SizeofSockaddrUnix\":                           \"syscall\",\n\t\"syscall.SizeofTCPInfo\":                                \"syscall\",\n\t\"syscall.SizeofUcred\":                                  \"syscall\",\n\t\"syscall.SlicePtrFromStrings\":                          \"syscall\",\n\t\"syscall.SockFilter\":                                   \"syscall\",\n\t\"syscall.SockFprog\":                                    \"syscall\",\n\t\"syscall.SockaddrDatalink\":                             \"syscall\",\n\t\"syscall.SockaddrGen\":                                  \"syscall\",\n\t\"syscall.SockaddrInet4\":                                \"syscall\",\n\t\"syscall.SockaddrInet6\":                                \"syscall\",\n\t\"syscall.SockaddrLinklayer\":                            \"syscall\",\n\t\"syscall.SockaddrNetlink\":                              \"syscall\",\n\t\"syscall.SockaddrUnix\":                                 \"syscall\",\n\t\"syscall.Socket\":                                       \"syscall\",\n\t\"syscall.SocketControlMessage\":                         \"syscall\",\n\t\"syscall.SocketDisableIPv6\":                            \"syscall\",\n\t\"syscall.Socketpair\":                                   \"syscall\",\n\t\"syscall.Splice\":                                       \"syscall\",\n\t\"syscall.StartProcess\":                                 \"syscall\",\n\t\"syscall.StartupInfo\":                                  \"syscall\",\n\t\"syscall.Stat\":                                         \"syscall\",\n\t\"syscall.Stat_t\":                                       \"syscall\",\n\t\"syscall.Statfs\":                                       \"syscall\",\n\t\"syscall.Statfs_t\":                                     \"syscall\",\n\t\"syscall.Stderr\":                                       \"syscall\",\n\t\"syscall.Stdin\":                                        \"syscall\",\n\t\"syscall.Stdout\":                                       \"syscall\",\n\t\"syscall.StringBytePtr\":                                \"syscall\",\n\t\"syscall.StringByteSlice\":                              \"syscall\",\n\t\"syscall.StringSlicePtr\":                               \"syscall\",\n\t\"syscall.StringToSid\":                                  \"syscall\",\n\t\"syscall.StringToUTF16\":                                \"syscall\",\n\t\"syscall.StringToUTF16Ptr\":                             \"syscall\",\n\t\"syscall.Symlink\":                                      \"syscall\",\n\t\"syscall.Sync\":                                         \"syscall\",\n\t\"syscall.SyncFileRange\":                                \"syscall\",\n\t\"syscall.SysProcAttr\":                                  \"syscall\",\n\t\"syscall.SysProcIDMap\":                                 \"syscall\",\n\t\"syscall.Syscall\":                                      \"syscall\",\n\t\"syscall.Syscall12\":                                    \"syscall\",\n\t\"syscall.Syscall15\":                                    \"syscall\",\n\t\"syscall.Syscall6\":                                     \"syscall\",\n\t\"syscall.Syscall9\":                                     \"syscall\",\n\t\"syscall.Sysctl\":                                       \"syscall\",\n\t\"syscall.SysctlUint32\":                                 \"syscall\",\n\t\"syscall.Sysctlnode\":                                   \"syscall\",\n\t\"syscall.Sysinfo\":                                      \"syscall\",\n\t\"syscall.Sysinfo_t\":                                    \"syscall\",\n\t\"syscall.Systemtime\":                                   \"syscall\",\n\t\"syscall.TCGETS\":                                       \"syscall\",\n\t\"syscall.TCIFLUSH\":                                     \"syscall\",\n\t\"syscall.TCIOFLUSH\":                                    \"syscall\",\n\t\"syscall.TCOFLUSH\":                                     \"syscall\",\n\t\"syscall.TCPInfo\":                                      \"syscall\",\n\t\"syscall.TCPKeepalive\":                                 \"syscall\",\n\t\"syscall.TCP_CA_NAME_MAX\":                              \"syscall\",\n\t\"syscall.TCP_CONGCTL\":                                  \"syscall\",\n\t\"syscall.TCP_CONGESTION\":                               \"syscall\",\n\t\"syscall.TCP_CONNECTIONTIMEOUT\":                        \"syscall\",\n\t\"syscall.TCP_CORK\":                                     \"syscall\",\n\t\"syscall.TCP_DEFER_ACCEPT\":                             \"syscall\",\n\t\"syscall.TCP_INFO\":                                     \"syscall\",\n\t\"syscall.TCP_KEEPALIVE\":                                \"syscall\",\n\t\"syscall.TCP_KEEPCNT\":                                  \"syscall\",\n\t\"syscall.TCP_KEEPIDLE\":                                 \"syscall\",\n\t\"syscall.TCP_KEEPINIT\":                                 \"syscall\",\n\t\"syscall.TCP_KEEPINTVL\":                                \"syscall\",\n\t\"syscall.TCP_LINGER2\":                                  \"syscall\",\n\t\"syscall.TCP_MAXBURST\":                                 \"syscall\",\n\t\"syscall.TCP_MAXHLEN\":                                  \"syscall\",\n\t\"syscall.TCP_MAXOLEN\":                                  \"syscall\",\n\t\"syscall.TCP_MAXSEG\":                                   \"syscall\",\n\t\"syscall.TCP_MAXWIN\":                                   \"syscall\",\n\t\"syscall.TCP_MAX_SACK\":                                 \"syscall\",\n\t\"syscall.TCP_MAX_WINSHIFT\":                             \"syscall\",\n\t\"syscall.TCP_MD5SIG\":                                   \"syscall\",\n\t\"syscall.TCP_MD5SIG_MAXKEYLEN\":                         \"syscall\",\n\t\"syscall.TCP_MINMSS\":                                   \"syscall\",\n\t\"syscall.TCP_MINMSSOVERLOAD\":                           \"syscall\",\n\t\"syscall.TCP_MSS\":                                      \"syscall\",\n\t\"syscall.TCP_NODELAY\":                                  \"syscall\",\n\t\"syscall.TCP_NOOPT\":                                    \"syscall\",\n\t\"syscall.TCP_NOPUSH\":                                   \"syscall\",\n\t\"syscall.TCP_NSTATES\":                                  \"syscall\",\n\t\"syscall.TCP_QUICKACK\":                                 \"syscall\",\n\t\"syscall.TCP_RXT_CONNDROPTIME\":                         \"syscall\",\n\t\"syscall.TCP_RXT_FINDROP\":                              \"syscall\",\n\t\"syscall.TCP_SACK_ENABLE\":                              \"syscall\",\n\t\"syscall.TCP_SYNCNT\":                                   \"syscall\",\n\t\"syscall.TCP_VENDOR\":                                   \"syscall\",\n\t\"syscall.TCP_WINDOW_CLAMP\":                             \"syscall\",\n\t\"syscall.TCSAFLUSH\":                                    \"syscall\",\n\t\"syscall.TCSETS\":                                       \"syscall\",\n\t\"syscall.TF_DISCONNECT\":                                \"syscall\",\n\t\"syscall.TF_REUSE_SOCKET\":                              \"syscall\",\n\t\"syscall.TF_USE_DEFAULT_WORKER\":                        \"syscall\",\n\t\"syscall.TF_USE_KERNEL_APC\":                            \"syscall\",\n\t\"syscall.TF_USE_SYSTEM_THREAD\":                         \"syscall\",\n\t\"syscall.TF_WRITE_BEHIND\":                              \"syscall\",\n\t\"syscall.TH32CS_INHERIT\":                               \"syscall\",\n\t\"syscall.TH32CS_SNAPALL\":                               \"syscall\",\n\t\"syscall.TH32CS_SNAPHEAPLIST\":                          \"syscall\",\n\t\"syscall.TH32CS_SNAPMODULE\":                            \"syscall\",\n\t\"syscall.TH32CS_SNAPMODULE32\":                          \"syscall\",\n\t\"syscall.TH32CS_SNAPPROCESS\":                           \"syscall\",\n\t\"syscall.TH32CS_SNAPTHREAD\":                            \"syscall\",\n\t\"syscall.TIME_ZONE_ID_DAYLIGHT\":                        \"syscall\",\n\t\"syscall.TIME_ZONE_ID_STANDARD\":                        \"syscall\",\n\t\"syscall.TIME_ZONE_ID_UNKNOWN\":                         \"syscall\",\n\t\"syscall.TIOCCBRK\":                                     \"syscall\",\n\t\"syscall.TIOCCDTR\":                                     \"syscall\",\n\t\"syscall.TIOCCONS\":                                     \"syscall\",\n\t\"syscall.TIOCDCDTIMESTAMP\":                             \"syscall\",\n\t\"syscall.TIOCDRAIN\":                                    \"syscall\",\n\t\"syscall.TIOCDSIMICROCODE\":                             \"syscall\",\n\t\"syscall.TIOCEXCL\":                                     \"syscall\",\n\t\"syscall.TIOCEXT\":                                      \"syscall\",\n\t\"syscall.TIOCFLAG_CDTRCTS\":                             \"syscall\",\n\t\"syscall.TIOCFLAG_CLOCAL\":                              \"syscall\",\n\t\"syscall.TIOCFLAG_CRTSCTS\":                             \"syscall\",\n\t\"syscall.TIOCFLAG_MDMBUF\":                              \"syscall\",\n\t\"syscall.TIOCFLAG_PPS\":                                 \"syscall\",\n\t\"syscall.TIOCFLAG_SOFTCAR\":                             \"syscall\",\n\t\"syscall.TIOCFLUSH\":                                    \"syscall\",\n\t\"syscall.TIOCGDEV\":                                     \"syscall\",\n\t\"syscall.TIOCGDRAINWAIT\":                               \"syscall\",\n\t\"syscall.TIOCGETA\":                                     \"syscall\",\n\t\"syscall.TIOCGETD\":                                     \"syscall\",\n\t\"syscall.TIOCGFLAGS\":                                   \"syscall\",\n\t\"syscall.TIOCGICOUNT\":                                  \"syscall\",\n\t\"syscall.TIOCGLCKTRMIOS\":                               \"syscall\",\n\t\"syscall.TIOCGLINED\":                                   \"syscall\",\n\t\"syscall.TIOCGPGRP\":                                    \"syscall\",\n\t\"syscall.TIOCGPTN\":                                     \"syscall\",\n\t\"syscall.TIOCGQSIZE\":                                   \"syscall\",\n\t\"syscall.TIOCGRANTPT\":                                  \"syscall\",\n\t\"syscall.TIOCGRS485\":                                   \"syscall\",\n\t\"syscall.TIOCGSERIAL\":                                  \"syscall\",\n\t\"syscall.TIOCGSID\":                                     \"syscall\",\n\t\"syscall.TIOCGSIZE\":                                    \"syscall\",\n\t\"syscall.TIOCGSOFTCAR\":                                 \"syscall\",\n\t\"syscall.TIOCGTSTAMP\":                                  \"syscall\",\n\t\"syscall.TIOCGWINSZ\":                                   \"syscall\",\n\t\"syscall.TIOCINQ\":                                      \"syscall\",\n\t\"syscall.TIOCIXOFF\":                                    \"syscall\",\n\t\"syscall.TIOCIXON\":                                     \"syscall\",\n\t\"syscall.TIOCLINUX\":                                    \"syscall\",\n\t\"syscall.TIOCMBIC\":                                     \"syscall\",\n\t\"syscall.TIOCMBIS\":                                     \"syscall\",\n\t\"syscall.TIOCMGDTRWAIT\":                                \"syscall\",\n\t\"syscall.TIOCMGET\":                                     \"syscall\",\n\t\"syscall.TIOCMIWAIT\":                                   \"syscall\",\n\t\"syscall.TIOCMODG\":                                     \"syscall\",\n\t\"syscall.TIOCMODS\":                                     \"syscall\",\n\t\"syscall.TIOCMSDTRWAIT\":                                \"syscall\",\n\t\"syscall.TIOCMSET\":                                     \"syscall\",\n\t\"syscall.TIOCM_CAR\":                                    \"syscall\",\n\t\"syscall.TIOCM_CD\":                                     \"syscall\",\n\t\"syscall.TIOCM_CTS\":                                    \"syscall\",\n\t\"syscall.TIOCM_DCD\":                                    \"syscall\",\n\t\"syscall.TIOCM_DSR\":                                    \"syscall\",\n\t\"syscall.TIOCM_DTR\":                                    \"syscall\",\n\t\"syscall.TIOCM_LE\":                                     \"syscall\",\n\t\"syscall.TIOCM_RI\":                                     \"syscall\",\n\t\"syscall.TIOCM_RNG\":                                    \"syscall\",\n\t\"syscall.TIOCM_RTS\":                                    \"syscall\",\n\t\"syscall.TIOCM_SR\":                                     \"syscall\",\n\t\"syscall.TIOCM_ST\":                                     \"syscall\",\n\t\"syscall.TIOCNOTTY\":                                    \"syscall\",\n\t\"syscall.TIOCNXCL\":                                     \"syscall\",\n\t\"syscall.TIOCOUTQ\":                                     \"syscall\",\n\t\"syscall.TIOCPKT\":                                      \"syscall\",\n\t\"syscall.TIOCPKT_DATA\":                                 \"syscall\",\n\t\"syscall.TIOCPKT_DOSTOP\":                               \"syscall\",\n\t\"syscall.TIOCPKT_FLUSHREAD\":                            \"syscall\",\n\t\"syscall.TIOCPKT_FLUSHWRITE\":                           \"syscall\",\n\t\"syscall.TIOCPKT_IOCTL\":                                \"syscall\",\n\t\"syscall.TIOCPKT_NOSTOP\":                               \"syscall\",\n\t\"syscall.TIOCPKT_START\":                                \"syscall\",\n\t\"syscall.TIOCPKT_STOP\":                                 \"syscall\",\n\t\"syscall.TIOCPTMASTER\":                                 \"syscall\",\n\t\"syscall.TIOCPTMGET\":                                   \"syscall\",\n\t\"syscall.TIOCPTSNAME\":                                  \"syscall\",\n\t\"syscall.TIOCPTYGNAME\":                                 \"syscall\",\n\t\"syscall.TIOCPTYGRANT\":                                 \"syscall\",\n\t\"syscall.TIOCPTYUNLK\":                                  \"syscall\",\n\t\"syscall.TIOCRCVFRAME\":                                 \"syscall\",\n\t\"syscall.TIOCREMOTE\":                                   \"syscall\",\n\t\"syscall.TIOCSBRK\":                                     \"syscall\",\n\t\"syscall.TIOCSCONS\":                                    \"syscall\",\n\t\"syscall.TIOCSCTTY\":                                    \"syscall\",\n\t\"syscall.TIOCSDRAINWAIT\":                               \"syscall\",\n\t\"syscall.TIOCSDTR\":                                     \"syscall\",\n\t\"syscall.TIOCSERCONFIG\":                                \"syscall\",\n\t\"syscall.TIOCSERGETLSR\":                                \"syscall\",\n\t\"syscall.TIOCSERGETMULTI\":                              \"syscall\",\n\t\"syscall.TIOCSERGSTRUCT\":                               \"syscall\",\n\t\"syscall.TIOCSERGWILD\":                                 \"syscall\",\n\t\"syscall.TIOCSERSETMULTI\":                              \"syscall\",\n\t\"syscall.TIOCSERSWILD\":                                 \"syscall\",\n\t\"syscall.TIOCSER_TEMT\":                                 \"syscall\",\n\t\"syscall.TIOCSETA\":                                     \"syscall\",\n\t\"syscall.TIOCSETAF\":                                    \"syscall\",\n\t\"syscall.TIOCSETAW\":                                    \"syscall\",\n\t\"syscall.TIOCSETD\":                                     \"syscall\",\n\t\"syscall.TIOCSFLAGS\":                                   \"syscall\",\n\t\"syscall.TIOCSIG\":                                      \"syscall\",\n\t\"syscall.TIOCSLCKTRMIOS\":                               \"syscall\",\n\t\"syscall.TIOCSLINED\":                                   \"syscall\",\n\t\"syscall.TIOCSPGRP\":                                    \"syscall\",\n\t\"syscall.TIOCSPTLCK\":                                   \"syscall\",\n\t\"syscall.TIOCSQSIZE\":                                   \"syscall\",\n\t\"syscall.TIOCSRS485\":                                   \"syscall\",\n\t\"syscall.TIOCSSERIAL\":                                  \"syscall\",\n\t\"syscall.TIOCSSIZE\":                                    \"syscall\",\n\t\"syscall.TIOCSSOFTCAR\":                                 \"syscall\",\n\t\"syscall.TIOCSTART\":                                    \"syscall\",\n\t\"syscall.TIOCSTAT\":                                     \"syscall\",\n\t\"syscall.TIOCSTI\":                                      \"syscall\",\n\t\"syscall.TIOCSTOP\":                                     \"syscall\",\n\t\"syscall.TIOCSTSTAMP\":                                  \"syscall\",\n\t\"syscall.TIOCSWINSZ\":                                   \"syscall\",\n\t\"syscall.TIOCTIMESTAMP\":                                \"syscall\",\n\t\"syscall.TIOCUCNTL\":                                    \"syscall\",\n\t\"syscall.TIOCVHANGUP\":                                  \"syscall\",\n\t\"syscall.TIOCXMTFRAME\":                                 \"syscall\",\n\t\"syscall.TOKEN_ADJUST_DEFAULT\":                         \"syscall\",\n\t\"syscall.TOKEN_ADJUST_GROUPS\":                          \"syscall\",\n\t\"syscall.TOKEN_ADJUST_PRIVILEGES\":                      \"syscall\",\n\t\"syscall.TOKEN_ALL_ACCESS\":                             \"syscall\",\n\t\"syscall.TOKEN_ASSIGN_PRIMARY\":                         \"syscall\",\n\t\"syscall.TOKEN_DUPLICATE\":                              \"syscall\",\n\t\"syscall.TOKEN_EXECUTE\":                                \"syscall\",\n\t\"syscall.TOKEN_IMPERSONATE\":                            \"syscall\",\n\t\"syscall.TOKEN_QUERY\":                                  \"syscall\",\n\t\"syscall.TOKEN_QUERY_SOURCE\":                           \"syscall\",\n\t\"syscall.TOKEN_READ\":                                   \"syscall\",\n\t\"syscall.TOKEN_WRITE\":                                  \"syscall\",\n\t\"syscall.TOSTOP\":                                       \"syscall\",\n\t\"syscall.TRUNCATE_EXISTING\":                            \"syscall\",\n\t\"syscall.TUNATTACHFILTER\":                              \"syscall\",\n\t\"syscall.TUNDETACHFILTER\":                              \"syscall\",\n\t\"syscall.TUNGETFEATURES\":                               \"syscall\",\n\t\"syscall.TUNGETIFF\":                                    \"syscall\",\n\t\"syscall.TUNGETSNDBUF\":                                 \"syscall\",\n\t\"syscall.TUNGETVNETHDRSZ\":                              \"syscall\",\n\t\"syscall.TUNSETDEBUG\":                                  \"syscall\",\n\t\"syscall.TUNSETGROUP\":                                  \"syscall\",\n\t\"syscall.TUNSETIFF\":                                    \"syscall\",\n\t\"syscall.TUNSETLINK\":                                   \"syscall\",\n\t\"syscall.TUNSETNOCSUM\":                                 \"syscall\",\n\t\"syscall.TUNSETOFFLOAD\":                                \"syscall\",\n\t\"syscall.TUNSETOWNER\":                                  \"syscall\",\n\t\"syscall.TUNSETPERSIST\":                                \"syscall\",\n\t\"syscall.TUNSETSNDBUF\":                                 \"syscall\",\n\t\"syscall.TUNSETTXFILTER\":                               \"syscall\",\n\t\"syscall.TUNSETVNETHDRSZ\":                              \"syscall\",\n\t\"syscall.Tee\":                                          \"syscall\",\n\t\"syscall.TerminateProcess\":                             \"syscall\",\n\t\"syscall.Termios\":                                      \"syscall\",\n\t\"syscall.Tgkill\":                                       \"syscall\",\n\t\"syscall.Time\":                                         \"syscall\",\n\t\"syscall.Time_t\":                                       \"syscall\",\n\t\"syscall.Times\":                                        \"syscall\",\n\t\"syscall.Timespec\":                                     \"syscall\",\n\t\"syscall.TimespecToNsec\":                               \"syscall\",\n\t\"syscall.Timeval\":                                      \"syscall\",\n\t\"syscall.Timeval32\":                                    \"syscall\",\n\t\"syscall.TimevalToNsec\":                                \"syscall\",\n\t\"syscall.Timex\":                                        \"syscall\",\n\t\"syscall.Timezoneinformation\":                          \"syscall\",\n\t\"syscall.Tms\":                                          \"syscall\",\n\t\"syscall.Token\":                                        \"syscall\",\n\t\"syscall.TokenAccessInformation\":                       \"syscall\",\n\t\"syscall.TokenAuditPolicy\":                             \"syscall\",\n\t\"syscall.TokenDefaultDacl\":                             \"syscall\",\n\t\"syscall.TokenElevation\":                               \"syscall\",\n\t\"syscall.TokenElevationType\":                           \"syscall\",\n\t\"syscall.TokenGroups\":                                  \"syscall\",\n\t\"syscall.TokenGroupsAndPrivileges\":                     \"syscall\",\n\t\"syscall.TokenHasRestrictions\":                         \"syscall\",\n\t\"syscall.TokenImpersonationLevel\":                      \"syscall\",\n\t\"syscall.TokenIntegrityLevel\":                          \"syscall\",\n\t\"syscall.TokenLinkedToken\":                             \"syscall\",\n\t\"syscall.TokenLogonSid\":                                \"syscall\",\n\t\"syscall.TokenMandatoryPolicy\":                         \"syscall\",\n\t\"syscall.TokenOrigin\":                                  \"syscall\",\n\t\"syscall.TokenOwner\":                                   \"syscall\",\n\t\"syscall.TokenPrimaryGroup\":                            \"syscall\",\n\t\"syscall.TokenPrivileges\":                              \"syscall\",\n\t\"syscall.TokenRestrictedSids\":                          \"syscall\",\n\t\"syscall.TokenSandBoxInert\":                            \"syscall\",\n\t\"syscall.TokenSessionId\":                               \"syscall\",\n\t\"syscall.TokenSessionReference\":                        \"syscall\",\n\t\"syscall.TokenSource\":                                  \"syscall\",\n\t\"syscall.TokenStatistics\":                              \"syscall\",\n\t\"syscall.TokenType\":                                    \"syscall\",\n\t\"syscall.TokenUIAccess\":                                \"syscall\",\n\t\"syscall.TokenUser\":                                    \"syscall\",\n\t\"syscall.TokenVirtualizationAllowed\":                   \"syscall\",\n\t\"syscall.TokenVirtualizationEnabled\":                   \"syscall\",\n\t\"syscall.Tokenprimarygroup\":                            \"syscall\",\n\t\"syscall.Tokenuser\":                                    \"syscall\",\n\t\"syscall.TranslateAccountName\":                         \"syscall\",\n\t\"syscall.TranslateName\":                                \"syscall\",\n\t\"syscall.TransmitFile\":                                 \"syscall\",\n\t\"syscall.TransmitFileBuffers\":                          \"syscall\",\n\t\"syscall.Truncate\":                                     \"syscall\",\n\t\"syscall.USAGE_MATCH_TYPE_AND\":                         \"syscall\",\n\t\"syscall.USAGE_MATCH_TYPE_OR\":                          \"syscall\",\n\t\"syscall.UTF16FromString\":                              \"syscall\",\n\t\"syscall.UTF16PtrFromString\":                           \"syscall\",\n\t\"syscall.UTF16ToString\":                                \"syscall\",\n\t\"syscall.Ucred\":                                        \"syscall\",\n\t\"syscall.Umask\":                                        \"syscall\",\n\t\"syscall.Uname\":                                        \"syscall\",\n\t\"syscall.Undelete\":                                     \"syscall\",\n\t\"syscall.UnixCredentials\":                              \"syscall\",\n\t\"syscall.UnixRights\":                                   \"syscall\",\n\t\"syscall.Unlink\":                                       \"syscall\",\n\t\"syscall.Unlinkat\":                                     \"syscall\",\n\t\"syscall.UnmapViewOfFile\":                              \"syscall\",\n\t\"syscall.Unmount\":                                      \"syscall\",\n\t\"syscall.Unsetenv\":                                     \"syscall\",\n\t\"syscall.Unshare\":                                      \"syscall\",\n\t\"syscall.UserInfo10\":                                   \"syscall\",\n\t\"syscall.Ustat\":                                        \"syscall\",\n\t\"syscall.Ustat_t\":                                      \"syscall\",\n\t\"syscall.Utimbuf\":                                      \"syscall\",\n\t\"syscall.Utime\":                                        \"syscall\",\n\t\"syscall.Utimes\":                                       \"syscall\",\n\t\"syscall.UtimesNano\":                                   \"syscall\",\n\t\"syscall.Utsname\":                                      \"syscall\",\n\t\"syscall.VDISCARD\":                                     \"syscall\",\n\t\"syscall.VDSUSP\":                                       \"syscall\",\n\t\"syscall.VEOF\":                                         \"syscall\",\n\t\"syscall.VEOL\":                                         \"syscall\",\n\t\"syscall.VEOL2\":                                        \"syscall\",\n\t\"syscall.VERASE\":                                       \"syscall\",\n\t\"syscall.VERASE2\":                                      \"syscall\",\n\t\"syscall.VINTR\":                                        \"syscall\",\n\t\"syscall.VKILL\":                                        \"syscall\",\n\t\"syscall.VLNEXT\":                                       \"syscall\",\n\t\"syscall.VMIN\":                                         \"syscall\",\n\t\"syscall.VQUIT\":                                        \"syscall\",\n\t\"syscall.VREPRINT\":                                     \"syscall\",\n\t\"syscall.VSTART\":                                       \"syscall\",\n\t\"syscall.VSTATUS\":                                      \"syscall\",\n\t\"syscall.VSTOP\":                                        \"syscall\",\n\t\"syscall.VSUSP\":                                        \"syscall\",\n\t\"syscall.VSWTC\":                                        \"syscall\",\n\t\"syscall.VT0\":                                          \"syscall\",\n\t\"syscall.VT1\":                                          \"syscall\",\n\t\"syscall.VTDLY\":                                        \"syscall\",\n\t\"syscall.VTIME\":                                        \"syscall\",\n\t\"syscall.VWERASE\":                                      \"syscall\",\n\t\"syscall.VirtualLock\":                                  \"syscall\",\n\t\"syscall.VirtualUnlock\":                                \"syscall\",\n\t\"syscall.WAIT_ABANDONED\":                               \"syscall\",\n\t\"syscall.WAIT_FAILED\":                                  \"syscall\",\n\t\"syscall.WAIT_OBJECT_0\":                                \"syscall\",\n\t\"syscall.WAIT_TIMEOUT\":                                 \"syscall\",\n\t\"syscall.WALL\":                                         \"syscall\",\n\t\"syscall.WALLSIG\":                                      \"syscall\",\n\t\"syscall.WALTSIG\":                                      \"syscall\",\n\t\"syscall.WCLONE\":                                       \"syscall\",\n\t\"syscall.WCONTINUED\":                                   \"syscall\",\n\t\"syscall.WCOREFLAG\":                                    \"syscall\",\n\t\"syscall.WEXITED\":                                      \"syscall\",\n\t\"syscall.WLINUXCLONE\":                                  \"syscall\",\n\t\"syscall.WNOHANG\":                                      \"syscall\",\n\t\"syscall.WNOTHREAD\":                                    \"syscall\",\n\t\"syscall.WNOWAIT\":                                      \"syscall\",\n\t\"syscall.WNOZOMBIE\":                                    \"syscall\",\n\t\"syscall.WOPTSCHECKED\":                                 \"syscall\",\n\t\"syscall.WORDSIZE\":                                     \"syscall\",\n\t\"syscall.WSABuf\":                                       \"syscall\",\n\t\"syscall.WSACleanup\":                                   \"syscall\",\n\t\"syscall.WSADESCRIPTION_LEN\":                           \"syscall\",\n\t\"syscall.WSAData\":                                      \"syscall\",\n\t\"syscall.WSAEACCES\":                                    \"syscall\",\n\t\"syscall.WSAECONNRESET\":                                \"syscall\",\n\t\"syscall.WSAEnumProtocols\":                             \"syscall\",\n\t\"syscall.WSAID_CONNECTEX\":                              \"syscall\",\n\t\"syscall.WSAIoctl\":                                     \"syscall\",\n\t\"syscall.WSAPROTOCOL_LEN\":                              \"syscall\",\n\t\"syscall.WSAProtocolChain\":                             \"syscall\",\n\t\"syscall.WSAProtocolInfo\":                              \"syscall\",\n\t\"syscall.WSARecv\":                                      \"syscall\",\n\t\"syscall.WSARecvFrom\":                                  \"syscall\",\n\t\"syscall.WSASYS_STATUS_LEN\":                            \"syscall\",\n\t\"syscall.WSASend\":                                      \"syscall\",\n\t\"syscall.WSASendTo\":                                    \"syscall\",\n\t\"syscall.WSASendto\":                                    \"syscall\",\n\t\"syscall.WSAStartup\":                                   \"syscall\",\n\t\"syscall.WSTOPPED\":                                     \"syscall\",\n\t\"syscall.WTRAPPED\":                                     \"syscall\",\n\t\"syscall.WUNTRACED\":                                    \"syscall\",\n\t\"syscall.Wait4\":                                        \"syscall\",\n\t\"syscall.WaitForSingleObject\":                          \"syscall\",\n\t\"syscall.WaitStatus\":                                   \"syscall\",\n\t\"syscall.Win32FileAttributeData\":                       \"syscall\",\n\t\"syscall.Win32finddata\":                                \"syscall\",\n\t\"syscall.Write\":                                        \"syscall\",\n\t\"syscall.WriteConsole\":                                 \"syscall\",\n\t\"syscall.WriteFile\":                                    \"syscall\",\n\t\"syscall.X509_ASN_ENCODING\":                            \"syscall\",\n\t\"syscall.XCASE\":                                        \"syscall\",\n\t\"syscall.XP1_CONNECTIONLESS\":                           \"syscall\",\n\t\"syscall.XP1_CONNECT_DATA\":                             \"syscall\",\n\t\"syscall.XP1_DISCONNECT_DATA\":                          \"syscall\",\n\t\"syscall.XP1_EXPEDITED_DATA\":                           \"syscall\",\n\t\"syscall.XP1_GRACEFUL_CLOSE\":                           \"syscall\",\n\t\"syscall.XP1_GUARANTEED_DELIVERY\":                      \"syscall\",\n\t\"syscall.XP1_GUARANTEED_ORDER\":                         \"syscall\",\n\t\"syscall.XP1_IFS_HANDLES\":                              \"syscall\",\n\t\"syscall.XP1_MESSAGE_ORIENTED\":                         \"syscall\",\n\t\"syscall.XP1_MULTIPOINT_CONTROL_PLANE\":                 \"syscall\",\n\t\"syscall.XP1_MULTIPOINT_DATA_PLANE\":                    \"syscall\",\n\t\"syscall.XP1_PARTIAL_MESSAGE\":                          \"syscall\",\n\t\"syscall.XP1_PSEUDO_STREAM\":                            \"syscall\",\n\t\"syscall.XP1_QOS_SUPPORTED\":                            \"syscall\",\n\t\"syscall.XP1_SAN_SUPPORT_SDP\":                          \"syscall\",\n\t\"syscall.XP1_SUPPORT_BROADCAST\":                        \"syscall\",\n\t\"syscall.XP1_SUPPORT_MULTIPOINT\":                       \"syscall\",\n\t\"syscall.XP1_UNI_RECV\":                                 \"syscall\",\n\t\"syscall.XP1_UNI_SEND\":                                 \"syscall\",\n\t\"syslog.Dial\":                                          \"log/syslog\",\n\t\"syslog.LOG_ALERT\":                                     \"log/syslog\",\n\t\"syslog.LOG_AUTH\":                                      \"log/syslog\",\n\t\"syslog.LOG_AUTHPRIV\":                                  \"log/syslog\",\n\t\"syslog.LOG_CRIT\":                                      \"log/syslog\",\n\t\"syslog.LOG_CRON\":                                      \"log/syslog\",\n\t\"syslog.LOG_DAEMON\":                                    \"log/syslog\",\n\t\"syslog.LOG_DEBUG\":                                     \"log/syslog\",\n\t\"syslog.LOG_EMERG\":                                     \"log/syslog\",\n\t\"syslog.LOG_ERR\":                                       \"log/syslog\",\n\t\"syslog.LOG_FTP\":                                       \"log/syslog\",\n\t\"syslog.LOG_INFO\":                                      \"log/syslog\",\n\t\"syslog.LOG_KERN\":                                      \"log/syslog\",\n\t\"syslog.LOG_LOCAL0\":                                    \"log/syslog\",\n\t\"syslog.LOG_LOCAL1\":                                    \"log/syslog\",\n\t\"syslog.LOG_LOCAL2\":                                    \"log/syslog\",\n\t\"syslog.LOG_LOCAL3\":                                    \"log/syslog\",\n\t\"syslog.LOG_LOCAL4\":                                    \"log/syslog\",\n\t\"syslog.LOG_LOCAL5\":                                    \"log/syslog\",\n\t\"syslog.LOG_LOCAL6\":                                    \"log/syslog\",\n\t\"syslog.LOG_LOCAL7\":                                    \"log/syslog\",\n\t\"syslog.LOG_LPR\":                                       \"log/syslog\",\n\t\"syslog.LOG_MAIL\":                                      \"log/syslog\",\n\t\"syslog.LOG_NEWS\":                                      \"log/syslog\",\n\t\"syslog.LOG_NOTICE\":                                    \"log/syslog\",\n\t\"syslog.LOG_SYSLOG\":                                    \"log/syslog\",\n\t\"syslog.LOG_USER\":                                      \"log/syslog\",\n\t\"syslog.LOG_UUCP\":                                      \"log/syslog\",\n\t\"syslog.LOG_WARNING\":                                   \"log/syslog\",\n\t\"syslog.New\":                                           \"log/syslog\",\n\t\"syslog.NewLogger\":                                     \"log/syslog\",\n\t\"syslog.Priority\":                                      \"log/syslog\",\n\t\"syslog.Writer\":                                        \"log/syslog\",\n\t\"tabwriter.AlignRight\":                                 \"text/tabwriter\",\n\t\"tabwriter.Debug\":                                      \"text/tabwriter\",\n\t\"tabwriter.DiscardEmptyColumns\":                        \"text/tabwriter\",\n\t\"tabwriter.Escape\":                                     \"text/tabwriter\",\n\t\"tabwriter.FilterHTML\":                                 \"text/tabwriter\",\n\t\"tabwriter.NewWriter\":                                  \"text/tabwriter\",\n\t\"tabwriter.StripEscape\":                                \"text/tabwriter\",\n\t\"tabwriter.TabIndent\":                                  \"text/tabwriter\",\n\t\"tabwriter.Writer\":                                     \"text/tabwriter\",\n\t\"tar.ErrFieldTooLong\":                                  \"archive/tar\",\n\t\"tar.ErrHeader\":                                        \"archive/tar\",\n\t\"tar.ErrWriteAfterClose\":                               \"archive/tar\",\n\t\"tar.ErrWriteTooLong\":                                  \"archive/tar\",\n\t\"tar.FileInfoHeader\":                                   \"archive/tar\",\n\t\"tar.Header\":                                           \"archive/tar\",\n\t\"tar.NewReader\":                                        \"archive/tar\",\n\t\"tar.NewWriter\":                                        \"archive/tar\",\n\t\"tar.Reader\":                                           \"archive/tar\",\n\t\"tar.TypeBlock\":                                        \"archive/tar\",\n\t\"tar.TypeChar\":                                         \"archive/tar\",\n\t\"tar.TypeCont\":                                         \"archive/tar\",\n\t\"tar.TypeDir\":                                          \"archive/tar\",\n\t\"tar.TypeFifo\":                                         \"archive/tar\",\n\t\"tar.TypeGNULongLink\":                                  \"archive/tar\",\n\t\"tar.TypeGNULongName\":                                  \"archive/tar\",\n\t\"tar.TypeGNUSparse\":                                    \"archive/tar\",\n\t\"tar.TypeLink\":                                         \"archive/tar\",\n\t\"tar.TypeReg\":                                          \"archive/tar\",\n\t\"tar.TypeRegA\":                                         \"archive/tar\",\n\t\"tar.TypeSymlink\":                                      \"archive/tar\",\n\t\"tar.TypeXGlobalHeader\":                                \"archive/tar\",\n\t\"tar.TypeXHeader\":                                      \"archive/tar\",\n\t\"tar.Writer\":                                           \"archive/tar\",\n\t\"template.CSS\":                                         \"html/template\",\n\t\"template.ErrAmbigContext\":                             \"html/template\",\n\t\"template.ErrBadHTML\":                                  \"html/template\",\n\t\"template.ErrBranchEnd\":                                \"html/template\",\n\t\"template.ErrEndContext\":                               \"html/template\",\n\t\"template.ErrNoSuchTemplate\":                           \"html/template\",\n\t\"template.ErrOutputContext\":                            \"html/template\",\n\t\"template.ErrPartialCharset\":                           \"html/template\",\n\t\"template.ErrPartialEscape\":                            \"html/template\",\n\t\"template.ErrRangeLoopReentry\":                         \"html/template\",\n\t\"template.ErrSlashAmbig\":                               \"html/template\",\n\t\"template.Error\":                                       \"html/template\",\n\t\"template.ErrorCode\":                                   \"html/template\",\n\t\"template.ExecError\":                                   \"text/template\",\n\t// \"template.FuncMap\" is ambiguous\n\t\"template.HTML\":     \"html/template\",\n\t\"template.HTMLAttr\": \"html/template\",\n\t// \"template.HTMLEscape\" is ambiguous\n\t// \"template.HTMLEscapeString\" is ambiguous\n\t// \"template.HTMLEscaper\" is ambiguous\n\t// \"template.IsTrue\" is ambiguous\n\t\"template.JS\": \"html/template\",\n\t// \"template.JSEscape\" is ambiguous\n\t// \"template.JSEscapeString\" is ambiguous\n\t// \"template.JSEscaper\" is ambiguous\n\t\"template.JSStr\": \"html/template\",\n\t// \"template.Must\" is ambiguous\n\t// \"template.New\" is ambiguous\n\t\"template.OK\": \"html/template\",\n\t// \"template.ParseFiles\" is ambiguous\n\t// \"template.ParseGlob\" is ambiguous\n\t// \"template.Template\" is ambiguous\n\t\"template.URL\": \"html/template\",\n\t// \"template.URLQueryEscaper\" is ambiguous\n\t\"testing.AllocsPerRun\":                        \"testing\",\n\t\"testing.B\":                                   \"testing\",\n\t\"testing.Benchmark\":                           \"testing\",\n\t\"testing.BenchmarkResult\":                     \"testing\",\n\t\"testing.Cover\":                               \"testing\",\n\t\"testing.CoverBlock\":                          \"testing\",\n\t\"testing.Coverage\":                            \"testing\",\n\t\"testing.InternalBenchmark\":                   \"testing\",\n\t\"testing.InternalExample\":                     \"testing\",\n\t\"testing.InternalTest\":                        \"testing\",\n\t\"testing.M\":                                   \"testing\",\n\t\"testing.Main\":                                \"testing\",\n\t\"testing.MainStart\":                           \"testing\",\n\t\"testing.PB\":                                  \"testing\",\n\t\"testing.RegisterCover\":                       \"testing\",\n\t\"testing.RunBenchmarks\":                       \"testing\",\n\t\"testing.RunExamples\":                         \"testing\",\n\t\"testing.RunTests\":                            \"testing\",\n\t\"testing.Short\":                               \"testing\",\n\t\"testing.T\":                                   \"testing\",\n\t\"testing.Verbose\":                             \"testing\",\n\t\"textproto.CanonicalMIMEHeaderKey\":            \"net/textproto\",\n\t\"textproto.Conn\":                              \"net/textproto\",\n\t\"textproto.Dial\":                              \"net/textproto\",\n\t\"textproto.Error\":                             \"net/textproto\",\n\t\"textproto.MIMEHeader\":                        \"net/textproto\",\n\t\"textproto.NewConn\":                           \"net/textproto\",\n\t\"textproto.NewReader\":                         \"net/textproto\",\n\t\"textproto.NewWriter\":                         \"net/textproto\",\n\t\"textproto.Pipeline\":                          \"net/textproto\",\n\t\"textproto.ProtocolError\":                     \"net/textproto\",\n\t\"textproto.Reader\":                            \"net/textproto\",\n\t\"textproto.TrimBytes\":                         \"net/textproto\",\n\t\"textproto.TrimString\":                        \"net/textproto\",\n\t\"textproto.Writer\":                            \"net/textproto\",\n\t\"time.ANSIC\":                                  \"time\",\n\t\"time.After\":                                  \"time\",\n\t\"time.AfterFunc\":                              \"time\",\n\t\"time.April\":                                  \"time\",\n\t\"time.August\":                                 \"time\",\n\t\"time.Date\":                                   \"time\",\n\t\"time.December\":                               \"time\",\n\t\"time.Duration\":                               \"time\",\n\t\"time.February\":                               \"time\",\n\t\"time.FixedZone\":                              \"time\",\n\t\"time.Friday\":                                 \"time\",\n\t\"time.Hour\":                                   \"time\",\n\t\"time.January\":                                \"time\",\n\t\"time.July\":                                   \"time\",\n\t\"time.June\":                                   \"time\",\n\t\"time.Kitchen\":                                \"time\",\n\t\"time.LoadLocation\":                           \"time\",\n\t\"time.Local\":                                  \"time\",\n\t\"time.Location\":                               \"time\",\n\t\"time.March\":                                  \"time\",\n\t\"time.May\":                                    \"time\",\n\t\"time.Microsecond\":                            \"time\",\n\t\"time.Millisecond\":                            \"time\",\n\t\"time.Minute\":                                 \"time\",\n\t\"time.Monday\":                                 \"time\",\n\t\"time.Month\":                                  \"time\",\n\t\"time.Nanosecond\":                             \"time\",\n\t\"time.NewTicker\":                              \"time\",\n\t\"time.NewTimer\":                               \"time\",\n\t\"time.November\":                               \"time\",\n\t\"time.Now\":                                    \"time\",\n\t\"time.October\":                                \"time\",\n\t\"time.Parse\":                                  \"time\",\n\t\"time.ParseDuration\":                          \"time\",\n\t\"time.ParseError\":                             \"time\",\n\t\"time.ParseInLocation\":                        \"time\",\n\t\"time.RFC1123\":                                \"time\",\n\t\"time.RFC1123Z\":                               \"time\",\n\t\"time.RFC3339\":                                \"time\",\n\t\"time.RFC3339Nano\":                            \"time\",\n\t\"time.RFC822\":                                 \"time\",\n\t\"time.RFC822Z\":                                \"time\",\n\t\"time.RFC850\":                                 \"time\",\n\t\"time.RubyDate\":                               \"time\",\n\t\"time.Saturday\":                               \"time\",\n\t\"time.Second\":                                 \"time\",\n\t\"time.September\":                              \"time\",\n\t\"time.Since\":                                  \"time\",\n\t\"time.Sleep\":                                  \"time\",\n\t\"time.Stamp\":                                  \"time\",\n\t\"time.StampMicro\":                             \"time\",\n\t\"time.StampMilli\":                             \"time\",\n\t\"time.StampNano\":                              \"time\",\n\t\"time.Sunday\":                                 \"time\",\n\t\"time.Thursday\":                               \"time\",\n\t\"time.Tick\":                                   \"time\",\n\t\"time.Ticker\":                                 \"time\",\n\t\"time.Time\":                                   \"time\",\n\t\"time.Timer\":                                  \"time\",\n\t\"time.Tuesday\":                                \"time\",\n\t\"time.UTC\":                                    \"time\",\n\t\"time.Unix\":                                   \"time\",\n\t\"time.UnixDate\":                               \"time\",\n\t\"time.Wednesday\":                              \"time\",\n\t\"time.Weekday\":                                \"time\",\n\t\"tls.Certificate\":                             \"crypto/tls\",\n\t\"tls.Client\":                                  \"crypto/tls\",\n\t\"tls.ClientAuthType\":                          \"crypto/tls\",\n\t\"tls.ClientHelloInfo\":                         \"crypto/tls\",\n\t\"tls.ClientSessionCache\":                      \"crypto/tls\",\n\t\"tls.ClientSessionState\":                      \"crypto/tls\",\n\t\"tls.Config\":                                  \"crypto/tls\",\n\t\"tls.Conn\":                                    \"crypto/tls\",\n\t\"tls.ConnectionState\":                         \"crypto/tls\",\n\t\"tls.CurveID\":                                 \"crypto/tls\",\n\t\"tls.CurveP256\":                               \"crypto/tls\",\n\t\"tls.CurveP384\":                               \"crypto/tls\",\n\t\"tls.CurveP521\":                               \"crypto/tls\",\n\t\"tls.Dial\":                                    \"crypto/tls\",\n\t\"tls.DialWithDialer\":                          \"crypto/tls\",\n\t\"tls.Listen\":                                  \"crypto/tls\",\n\t\"tls.LoadX509KeyPair\":                         \"crypto/tls\",\n\t\"tls.NewLRUClientSessionCache\":                \"crypto/tls\",\n\t\"tls.NewListener\":                             \"crypto/tls\",\n\t\"tls.NoClientCert\":                            \"crypto/tls\",\n\t\"tls.RecordHeaderError\":                       \"crypto/tls\",\n\t\"tls.RenegotiateFreelyAsClient\":               \"crypto/tls\",\n\t\"tls.RenegotiateNever\":                        \"crypto/tls\",\n\t\"tls.RenegotiateOnceAsClient\":                 \"crypto/tls\",\n\t\"tls.RenegotiationSupport\":                    \"crypto/tls\",\n\t\"tls.RequestClientCert\":                       \"crypto/tls\",\n\t\"tls.RequireAndVerifyClientCert\":              \"crypto/tls\",\n\t\"tls.RequireAnyClientCert\":                    \"crypto/tls\",\n\t\"tls.Server\":                                  \"crypto/tls\",\n\t\"tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA\":    \"crypto/tls\",\n\t\"tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\": \"crypto/tls\",\n\t\"tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA\":    \"crypto/tls\",\n\t\"tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\": \"crypto/tls\",\n\t\"tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA\":        \"crypto/tls\",\n\t\"tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA\":     \"crypto/tls\",\n\t\"tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA\":      \"crypto/tls\",\n\t\"tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\":   \"crypto/tls\",\n\t\"tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA\":      \"crypto/tls\",\n\t\"tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\":   \"crypto/tls\",\n\t\"tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA\":          \"crypto/tls\",\n\t\"tls.TLS_FALLBACK_SCSV\":                       \"crypto/tls\",\n\t\"tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA\":           \"crypto/tls\",\n\t\"tls.TLS_RSA_WITH_AES_128_CBC_SHA\":            \"crypto/tls\",\n\t\"tls.TLS_RSA_WITH_AES_128_GCM_SHA256\":         \"crypto/tls\",\n\t\"tls.TLS_RSA_WITH_AES_256_CBC_SHA\":            \"crypto/tls\",\n\t\"tls.TLS_RSA_WITH_AES_256_GCM_SHA384\":         \"crypto/tls\",\n\t\"tls.TLS_RSA_WITH_RC4_128_SHA\":                \"crypto/tls\",\n\t\"tls.VerifyClientCertIfGiven\":                 \"crypto/tls\",\n\t\"tls.VersionSSL30\":                            \"crypto/tls\",\n\t\"tls.VersionTLS10\":                            \"crypto/tls\",\n\t\"tls.VersionTLS11\":                            \"crypto/tls\",\n\t\"tls.VersionTLS12\":                            \"crypto/tls\",\n\t\"tls.X509KeyPair\":                             \"crypto/tls\",\n\t\"token.ADD\":                                   \"go/token\",\n\t\"token.ADD_ASSIGN\":                            \"go/token\",\n\t\"token.AND\":                                   \"go/token\",\n\t\"token.AND_ASSIGN\":                            \"go/token\",\n\t\"token.AND_NOT\":                               \"go/token\",\n\t\"token.AND_NOT_ASSIGN\":                        \"go/token\",\n\t\"token.ARROW\":                                 \"go/token\",\n\t\"token.ASSIGN\":                                \"go/token\",\n\t\"token.BREAK\":                                 \"go/token\",\n\t\"token.CASE\":                                  \"go/token\",\n\t\"token.CHAN\":                                  \"go/token\",\n\t\"token.CHAR\":                                  \"go/token\",\n\t\"token.COLON\":                                 \"go/token\",\n\t\"token.COMMA\":                                 \"go/token\",\n\t\"token.COMMENT\":                               \"go/token\",\n\t\"token.CONST\":                                 \"go/token\",\n\t\"token.CONTINUE\":                              \"go/token\",\n\t\"token.DEC\":                                   \"go/token\",\n\t\"token.DEFAULT\":                               \"go/token\",\n\t\"token.DEFER\":                                 \"go/token\",\n\t\"token.DEFINE\":                                \"go/token\",\n\t\"token.ELLIPSIS\":                              \"go/token\",\n\t\"token.ELSE\":                                  \"go/token\",\n\t\"token.EOF\":                                   \"go/token\",\n\t\"token.EQL\":                                   \"go/token\",\n\t\"token.FALLTHROUGH\":                           \"go/token\",\n\t\"token.FLOAT\":                                 \"go/token\",\n\t\"token.FOR\":                                   \"go/token\",\n\t\"token.FUNC\":                                  \"go/token\",\n\t\"token.File\":                                  \"go/token\",\n\t\"token.FileSet\":                               \"go/token\",\n\t\"token.GEQ\":                                   \"go/token\",\n\t\"token.GO\":                                    \"go/token\",\n\t\"token.GOTO\":                                  \"go/token\",\n\t\"token.GTR\":                                   \"go/token\",\n\t\"token.HighestPrec\":                           \"go/token\",\n\t\"token.IDENT\":                                 \"go/token\",\n\t\"token.IF\":                                    \"go/token\",\n\t\"token.ILLEGAL\":                               \"go/token\",\n\t\"token.IMAG\":                                  \"go/token\",\n\t\"token.IMPORT\":                                \"go/token\",\n\t\"token.INC\":                                   \"go/token\",\n\t\"token.INT\":                                   \"go/token\",\n\t\"token.INTERFACE\":                             \"go/token\",\n\t\"token.LAND\":                                  \"go/token\",\n\t\"token.LBRACE\":                                \"go/token\",\n\t\"token.LBRACK\":                                \"go/token\",\n\t\"token.LEQ\":                                   \"go/token\",\n\t\"token.LOR\":                                   \"go/token\",\n\t\"token.LPAREN\":                                \"go/token\",\n\t\"token.LSS\":                                   \"go/token\",\n\t\"token.Lookup\":                                \"go/token\",\n\t\"token.LowestPrec\":                            \"go/token\",\n\t\"token.MAP\":                                   \"go/token\",\n\t\"token.MUL\":                                   \"go/token\",\n\t\"token.MUL_ASSIGN\":                            \"go/token\",\n\t\"token.NEQ\":                                   \"go/token\",\n\t\"token.NOT\":                                   \"go/token\",\n\t\"token.NewFileSet\":                            \"go/token\",\n\t\"token.NoPos\":                                 \"go/token\",\n\t\"token.OR\":                                    \"go/token\",\n\t\"token.OR_ASSIGN\":                             \"go/token\",\n\t\"token.PACKAGE\":                               \"go/token\",\n\t\"token.PERIOD\":                                \"go/token\",\n\t\"token.Pos\":                                   \"go/token\",\n\t\"token.Position\":                              \"go/token\",\n\t\"token.QUO\":                                   \"go/token\",\n\t\"token.QUO_ASSIGN\":                            \"go/token\",\n\t\"token.RANGE\":                                 \"go/token\",\n\t\"token.RBRACE\":                                \"go/token\",\n\t\"token.RBRACK\":                                \"go/token\",\n\t\"token.REM\":                                   \"go/token\",\n\t\"token.REM_ASSIGN\":                            \"go/token\",\n\t\"token.RETURN\":                                \"go/token\",\n\t\"token.RPAREN\":                                \"go/token\",\n\t\"token.SELECT\":                                \"go/token\",\n\t\"token.SEMICOLON\":                             \"go/token\",\n\t\"token.SHL\":                                   \"go/token\",\n\t\"token.SHL_ASSIGN\":                            \"go/token\",\n\t\"token.SHR\":                                   \"go/token\",\n\t\"token.SHR_ASSIGN\":                            \"go/token\",\n\t\"token.STRING\":                                \"go/token\",\n\t\"token.STRUCT\":                                \"go/token\",\n\t\"token.SUB\":                                   \"go/token\",\n\t\"token.SUB_ASSIGN\":                            \"go/token\",\n\t\"token.SWITCH\":                                \"go/token\",\n\t\"token.TYPE\":                                  \"go/token\",\n\t\"token.Token\":                                 \"go/token\",\n\t\"token.UnaryPrec\":                             \"go/token\",\n\t\"token.VAR\":                                   \"go/token\",\n\t\"token.XOR\":                                   \"go/token\",\n\t\"token.XOR_ASSIGN\":                            \"go/token\",\n\t\"trace.Start\":                                 \"runtime/trace\",\n\t\"trace.Stop\":                                  \"runtime/trace\",\n\t\"types.Array\":                                 \"go/types\",\n\t\"types.AssertableTo\":                          \"go/types\",\n\t\"types.AssignableTo\":                          \"go/types\",\n\t\"types.Basic\":                                 \"go/types\",\n\t\"types.BasicInfo\":                             \"go/types\",\n\t\"types.BasicKind\":                             \"go/types\",\n\t\"types.Bool\":                                  \"go/types\",\n\t\"types.Builtin\":                               \"go/types\",\n\t\"types.Byte\":                                  \"go/types\",\n\t\"types.Chan\":                                  \"go/types\",\n\t\"types.ChanDir\":                               \"go/types\",\n\t\"types.Checker\":                               \"go/types\",\n\t\"types.Comparable\":                            \"go/types\",\n\t\"types.Complex128\":                            \"go/types\",\n\t\"types.Complex64\":                             \"go/types\",\n\t\"types.Config\":                                \"go/types\",\n\t\"types.Const\":                                 \"go/types\",\n\t\"types.ConvertibleTo\":                         \"go/types\",\n\t\"types.DefPredeclaredTestFuncs\":               \"go/types\",\n\t\"types.Error\":                                 \"go/types\",\n\t\"types.Eval\":                                  \"go/types\",\n\t\"types.ExprString\":                            \"go/types\",\n\t\"types.FieldVal\":                              \"go/types\",\n\t\"types.Float32\":                               \"go/types\",\n\t\"types.Float64\":                               \"go/types\",\n\t\"types.Func\":                                  \"go/types\",\n\t\"types.Id\":                                    \"go/types\",\n\t\"types.Identical\":                             \"go/types\",\n\t\"types.Implements\":                            \"go/types\",\n\t\"types.ImportMode\":                            \"go/types\",\n\t\"types.Importer\":                              \"go/types\",\n\t\"types.ImporterFrom\":                          \"go/types\",\n\t\"types.Info\":                                  \"go/types\",\n\t\"types.Initializer\":                           \"go/types\",\n\t\"types.Int\":                                   \"go/types\",\n\t\"types.Int16\":                                 \"go/types\",\n\t\"types.Int32\":                                 \"go/types\",\n\t\"types.Int64\":                                 \"go/types\",\n\t\"types.Int8\":                                  \"go/types\",\n\t\"types.Interface\":                             \"go/types\",\n\t\"types.Invalid\":                               \"go/types\",\n\t\"types.IsBoolean\":                             \"go/types\",\n\t\"types.IsComplex\":                             \"go/types\",\n\t\"types.IsConstType\":                           \"go/types\",\n\t\"types.IsFloat\":                               \"go/types\",\n\t\"types.IsInteger\":                             \"go/types\",\n\t\"types.IsInterface\":                           \"go/types\",\n\t\"types.IsNumeric\":                             \"go/types\",\n\t\"types.IsOrdered\":                             \"go/types\",\n\t\"types.IsString\":                              \"go/types\",\n\t\"types.IsUnsigned\":                            \"go/types\",\n\t\"types.IsUntyped\":                             \"go/types\",\n\t\"types.Label\":                                 \"go/types\",\n\t\"types.LookupFieldOrMethod\":                   \"go/types\",\n\t\"types.Map\":                                   \"go/types\",\n\t\"types.MethodExpr\":                            \"go/types\",\n\t\"types.MethodSet\":                             \"go/types\",\n\t\"types.MethodVal\":                             \"go/types\",\n\t\"types.MissingMethod\":                         \"go/types\",\n\t\"types.Named\":                                 \"go/types\",\n\t\"types.NewArray\":                              \"go/types\",\n\t\"types.NewChan\":                               \"go/types\",\n\t\"types.NewChecker\":                            \"go/types\",\n\t\"types.NewConst\":                              \"go/types\",\n\t\"types.NewField\":                              \"go/types\",\n\t\"types.NewFunc\":                               \"go/types\",\n\t\"types.NewInterface\":                          \"go/types\",\n\t\"types.NewLabel\":                              \"go/types\",\n\t\"types.NewMap\":                                \"go/types\",\n\t\"types.NewMethodSet\":                          \"go/types\",\n\t\"types.NewNamed\":                              \"go/types\",\n\t\"types.NewPackage\":                            \"go/types\",\n\t\"types.NewParam\":                              \"go/types\",\n\t\"types.NewPkgName\":                            \"go/types\",\n\t\"types.NewPointer\":                            \"go/types\",\n\t\"types.NewScope\":                              \"go/types\",\n\t\"types.NewSignature\":                          \"go/types\",\n\t\"types.NewSlice\":                              \"go/types\",\n\t\"types.NewStruct\":                             \"go/types\",\n\t\"types.NewTuple\":                              \"go/types\",\n\t\"types.NewTypeName\":                           \"go/types\",\n\t\"types.NewVar\":                                \"go/types\",\n\t\"types.Nil\":                                   \"go/types\",\n\t\"types.ObjectString\":                          \"go/types\",\n\t\"types.Package\":                               \"go/types\",\n\t\"types.PkgName\":                               \"go/types\",\n\t\"types.Pointer\":                               \"go/types\",\n\t\"types.Qualifier\":                             \"go/types\",\n\t\"types.RecvOnly\":                              \"go/types\",\n\t\"types.RelativeTo\":                            \"go/types\",\n\t\"types.Rune\":                                  \"go/types\",\n\t\"types.Scope\":                                 \"go/types\",\n\t\"types.Selection\":                             \"go/types\",\n\t\"types.SelectionKind\":                         \"go/types\",\n\t\"types.SelectionString\":                       \"go/types\",\n\t\"types.SendOnly\":                              \"go/types\",\n\t\"types.SendRecv\":                              \"go/types\",\n\t\"types.Signature\":                             \"go/types\",\n\t\"types.Sizes\":                                 \"go/types\",\n\t\"types.Slice\":                                 \"go/types\",\n\t\"types.StdSizes\":                              \"go/types\",\n\t\"types.String\":                                \"go/types\",\n\t\"types.Struct\":                                \"go/types\",\n\t\"types.Tuple\":                                 \"go/types\",\n\t\"types.Typ\":                                   \"go/types\",\n\t\"types.Type\":                                  \"go/types\",\n\t\"types.TypeAndValue\":                          \"go/types\",\n\t\"types.TypeName\":                              \"go/types\",\n\t\"types.TypeString\":                            \"go/types\",\n\t\"types.Uint\":                                  \"go/types\",\n\t\"types.Uint16\":                                \"go/types\",\n\t\"types.Uint32\":                                \"go/types\",\n\t\"types.Uint64\":                                \"go/types\",\n\t\"types.Uint8\":                                 \"go/types\",\n\t\"types.Uintptr\":                               \"go/types\",\n\t\"types.Universe\":                              \"go/types\",\n\t\"types.Unsafe\":                                \"go/types\",\n\t\"types.UnsafePointer\":                         \"go/types\",\n\t\"types.UntypedBool\":                           \"go/types\",\n\t\"types.UntypedComplex\":                        \"go/types\",\n\t\"types.UntypedFloat\":                          \"go/types\",\n\t\"types.UntypedInt\":                            \"go/types\",\n\t\"types.UntypedNil\":                            \"go/types\",\n\t\"types.UntypedRune\":                           \"go/types\",\n\t\"types.UntypedString\":                         \"go/types\",\n\t\"types.Var\":                                   \"go/types\",\n\t\"types.WriteExpr\":                             \"go/types\",\n\t\"types.WriteSignature\":                        \"go/types\",\n\t\"types.WriteType\":                             \"go/types\",\n\t\"unicode.ASCII_Hex_Digit\":                     \"unicode\",\n\t\"unicode.Adlam\":                               \"unicode\",\n\t\"unicode.Ahom\":                                \"unicode\",\n\t\"unicode.Anatolian_Hieroglyphs\":               \"unicode\",\n\t\"unicode.Arabic\":                              \"unicode\",\n\t\"unicode.Armenian\":                            \"unicode\",\n\t\"unicode.Avestan\":                             \"unicode\",\n\t\"unicode.AzeriCase\":                           \"unicode\",\n\t\"unicode.Balinese\":                            \"unicode\",\n\t\"unicode.Bamum\":                               \"unicode\",\n\t\"unicode.Bassa_Vah\":                           \"unicode\",\n\t\"unicode.Batak\":                               \"unicode\",\n\t\"unicode.Bengali\":                             \"unicode\",\n\t\"unicode.Bhaiksuki\":                           \"unicode\",\n\t\"unicode.Bidi_Control\":                        \"unicode\",\n\t\"unicode.Bopomofo\":                            \"unicode\",\n\t\"unicode.Brahmi\":                              \"unicode\",\n\t\"unicode.Braille\":                             \"unicode\",\n\t\"unicode.Buginese\":                            \"unicode\",\n\t\"unicode.Buhid\":                               \"unicode\",\n\t\"unicode.C\":                                   \"unicode\",\n\t\"unicode.Canadian_Aboriginal\":                 \"unicode\",\n\t\"unicode.Carian\":                              \"unicode\",\n\t\"unicode.CaseRange\":                           \"unicode\",\n\t\"unicode.CaseRanges\":                          \"unicode\",\n\t\"unicode.Categories\":                          \"unicode\",\n\t\"unicode.Caucasian_Albanian\":                  \"unicode\",\n\t\"unicode.Cc\":                                  \"unicode\",\n\t\"unicode.Cf\":                                  \"unicode\",\n\t\"unicode.Chakma\":                              \"unicode\",\n\t\"unicode.Cham\":                                \"unicode\",\n\t\"unicode.Cherokee\":                            \"unicode\",\n\t\"unicode.Co\":                                  \"unicode\",\n\t\"unicode.Common\":                              \"unicode\",\n\t\"unicode.Coptic\":                              \"unicode\",\n\t\"unicode.Cs\":                                  \"unicode\",\n\t\"unicode.Cuneiform\":                           \"unicode\",\n\t\"unicode.Cypriot\":                             \"unicode\",\n\t\"unicode.Cyrillic\":                            \"unicode\",\n\t\"unicode.Dash\":                                \"unicode\",\n\t\"unicode.Deprecated\":                          \"unicode\",\n\t\"unicode.Deseret\":                             \"unicode\",\n\t\"unicode.Devanagari\":                          \"unicode\",\n\t\"unicode.Diacritic\":                           \"unicode\",\n\t\"unicode.Digit\":                               \"unicode\",\n\t\"unicode.Duployan\":                            \"unicode\",\n\t\"unicode.Egyptian_Hieroglyphs\":                \"unicode\",\n\t\"unicode.Elbasan\":                             \"unicode\",\n\t\"unicode.Ethiopic\":                            \"unicode\",\n\t\"unicode.Extender\":                            \"unicode\",\n\t\"unicode.FoldCategory\":                        \"unicode\",\n\t\"unicode.FoldScript\":                          \"unicode\",\n\t\"unicode.Georgian\":                            \"unicode\",\n\t\"unicode.Glagolitic\":                          \"unicode\",\n\t\"unicode.Gothic\":                              \"unicode\",\n\t\"unicode.Grantha\":                             \"unicode\",\n\t\"unicode.GraphicRanges\":                       \"unicode\",\n\t\"unicode.Greek\":                               \"unicode\",\n\t\"unicode.Gujarati\":                            \"unicode\",\n\t\"unicode.Gurmukhi\":                            \"unicode\",\n\t\"unicode.Han\":                                 \"unicode\",\n\t\"unicode.Hangul\":                              \"unicode\",\n\t\"unicode.Hanunoo\":                             \"unicode\",\n\t\"unicode.Hatran\":                              \"unicode\",\n\t\"unicode.Hebrew\":                              \"unicode\",\n\t\"unicode.Hex_Digit\":                           \"unicode\",\n\t\"unicode.Hiragana\":                            \"unicode\",\n\t\"unicode.Hyphen\":                              \"unicode\",\n\t\"unicode.IDS_Binary_Operator\":                 \"unicode\",\n\t\"unicode.IDS_Trinary_Operator\":                \"unicode\",\n\t\"unicode.Ideographic\":                         \"unicode\",\n\t\"unicode.Imperial_Aramaic\":                    \"unicode\",\n\t\"unicode.In\":                                  \"unicode\",\n\t\"unicode.Inherited\":                           \"unicode\",\n\t\"unicode.Inscriptional_Pahlavi\":               \"unicode\",\n\t\"unicode.Inscriptional_Parthian\":              \"unicode\",\n\t\"unicode.Is\":                                  \"unicode\",\n\t\"unicode.IsControl\":                           \"unicode\",\n\t\"unicode.IsDigit\":                             \"unicode\",\n\t\"unicode.IsGraphic\":                           \"unicode\",\n\t\"unicode.IsLetter\":                            \"unicode\",\n\t\"unicode.IsLower\":                             \"unicode\",\n\t\"unicode.IsMark\":                              \"unicode\",\n\t\"unicode.IsNumber\":                            \"unicode\",\n\t\"unicode.IsOneOf\":                             \"unicode\",\n\t\"unicode.IsPrint\":                             \"unicode\",\n\t\"unicode.IsPunct\":                             \"unicode\",\n\t\"unicode.IsSpace\":                             \"unicode\",\n\t\"unicode.IsSymbol\":                            \"unicode\",\n\t\"unicode.IsTitle\":                             \"unicode\",\n\t\"unicode.IsUpper\":                             \"unicode\",\n\t\"unicode.Javanese\":                            \"unicode\",\n\t\"unicode.Join_Control\":                        \"unicode\",\n\t\"unicode.Kaithi\":                              \"unicode\",\n\t\"unicode.Kannada\":                             \"unicode\",\n\t\"unicode.Katakana\":                            \"unicode\",\n\t\"unicode.Kayah_Li\":                            \"unicode\",\n\t\"unicode.Kharoshthi\":                          \"unicode\",\n\t\"unicode.Khmer\":                               \"unicode\",\n\t\"unicode.Khojki\":                              \"unicode\",\n\t\"unicode.Khudawadi\":                           \"unicode\",\n\t\"unicode.L\":                                   \"unicode\",\n\t\"unicode.Lao\":                                 \"unicode\",\n\t\"unicode.Latin\":                               \"unicode\",\n\t\"unicode.Lepcha\":                              \"unicode\",\n\t\"unicode.Letter\":                              \"unicode\",\n\t\"unicode.Limbu\":                               \"unicode\",\n\t\"unicode.Linear_A\":                            \"unicode\",\n\t\"unicode.Linear_B\":                            \"unicode\",\n\t\"unicode.Lisu\":                                \"unicode\",\n\t\"unicode.Ll\":                                  \"unicode\",\n\t\"unicode.Lm\":                                  \"unicode\",\n\t\"unicode.Lo\":                                  \"unicode\",\n\t\"unicode.Logical_Order_Exception\":             \"unicode\",\n\t\"unicode.Lower\":                               \"unicode\",\n\t\"unicode.LowerCase\":                           \"unicode\",\n\t\"unicode.Lt\":                                  \"unicode\",\n\t\"unicode.Lu\":                                  \"unicode\",\n\t\"unicode.Lycian\":                              \"unicode\",\n\t\"unicode.Lydian\":                              \"unicode\",\n\t\"unicode.M\":                                   \"unicode\",\n\t\"unicode.Mahajani\":                            \"unicode\",\n\t\"unicode.Malayalam\":                           \"unicode\",\n\t\"unicode.Mandaic\":                             \"unicode\",\n\t\"unicode.Manichaean\":                          \"unicode\",\n\t\"unicode.Marchen\":                             \"unicode\",\n\t\"unicode.Mark\":                                \"unicode\",\n\t\"unicode.MaxASCII\":                            \"unicode\",\n\t\"unicode.MaxCase\":                             \"unicode\",\n\t\"unicode.MaxLatin1\":                           \"unicode\",\n\t\"unicode.MaxRune\":                             \"unicode\",\n\t\"unicode.Mc\":                                  \"unicode\",\n\t\"unicode.Me\":                                  \"unicode\",\n\t\"unicode.Meetei_Mayek\":                        \"unicode\",\n\t\"unicode.Mende_Kikakui\":                       \"unicode\",\n\t\"unicode.Meroitic_Cursive\":                    \"unicode\",\n\t\"unicode.Meroitic_Hieroglyphs\":                \"unicode\",\n\t\"unicode.Miao\":                                \"unicode\",\n\t\"unicode.Mn\":                                  \"unicode\",\n\t\"unicode.Modi\":                                \"unicode\",\n\t\"unicode.Mongolian\":                           \"unicode\",\n\t\"unicode.Mro\":                                 \"unicode\",\n\t\"unicode.Multani\":                             \"unicode\",\n\t\"unicode.Myanmar\":                             \"unicode\",\n\t\"unicode.N\":                                   \"unicode\",\n\t\"unicode.Nabataean\":                           \"unicode\",\n\t\"unicode.Nd\":                                  \"unicode\",\n\t\"unicode.New_Tai_Lue\":                         \"unicode\",\n\t\"unicode.Newa\":                                \"unicode\",\n\t\"unicode.Nko\":                                 \"unicode\",\n\t\"unicode.Nl\":                                  \"unicode\",\n\t\"unicode.No\":                                  \"unicode\",\n\t\"unicode.Noncharacter_Code_Point\":             \"unicode\",\n\t\"unicode.Number\":                              \"unicode\",\n\t\"unicode.Ogham\":                               \"unicode\",\n\t\"unicode.Ol_Chiki\":                            \"unicode\",\n\t\"unicode.Old_Hungarian\":                       \"unicode\",\n\t\"unicode.Old_Italic\":                          \"unicode\",\n\t\"unicode.Old_North_Arabian\":                   \"unicode\",\n\t\"unicode.Old_Permic\":                          \"unicode\",\n\t\"unicode.Old_Persian\":                         \"unicode\",\n\t\"unicode.Old_South_Arabian\":                   \"unicode\",\n\t\"unicode.Old_Turkic\":                          \"unicode\",\n\t\"unicode.Oriya\":                               \"unicode\",\n\t\"unicode.Osage\":                               \"unicode\",\n\t\"unicode.Osmanya\":                             \"unicode\",\n\t\"unicode.Other\":                               \"unicode\",\n\t\"unicode.Other_Alphabetic\":                    \"unicode\",\n\t\"unicode.Other_Default_Ignorable_Code_Point\":  \"unicode\",\n\t\"unicode.Other_Grapheme_Extend\":               \"unicode\",\n\t\"unicode.Other_ID_Continue\":                   \"unicode\",\n\t\"unicode.Other_ID_Start\":                      \"unicode\",\n\t\"unicode.Other_Lowercase\":                     \"unicode\",\n\t\"unicode.Other_Math\":                          \"unicode\",\n\t\"unicode.Other_Uppercase\":                     \"unicode\",\n\t\"unicode.P\":                                   \"unicode\",\n\t\"unicode.Pahawh_Hmong\":                        \"unicode\",\n\t\"unicode.Palmyrene\":                           \"unicode\",\n\t\"unicode.Pattern_Syntax\":                      \"unicode\",\n\t\"unicode.Pattern_White_Space\":                 \"unicode\",\n\t\"unicode.Pau_Cin_Hau\":                         \"unicode\",\n\t\"unicode.Pc\":                                  \"unicode\",\n\t\"unicode.Pd\":                                  \"unicode\",\n\t\"unicode.Pe\":                                  \"unicode\",\n\t\"unicode.Pf\":                                  \"unicode\",\n\t\"unicode.Phags_Pa\":                            \"unicode\",\n\t\"unicode.Phoenician\":                          \"unicode\",\n\t\"unicode.Pi\":                                  \"unicode\",\n\t\"unicode.Po\":                                  \"unicode\",\n\t\"unicode.Prepended_Concatenation_Mark\":        \"unicode\",\n\t\"unicode.PrintRanges\":                         \"unicode\",\n\t\"unicode.Properties\":                          \"unicode\",\n\t\"unicode.Ps\":                                  \"unicode\",\n\t\"unicode.Psalter_Pahlavi\":                     \"unicode\",\n\t\"unicode.Punct\":                               \"unicode\",\n\t\"unicode.Quotation_Mark\":                      \"unicode\",\n\t\"unicode.Radical\":                             \"unicode\",\n\t\"unicode.Range16\":                             \"unicode\",\n\t\"unicode.Range32\":                             \"unicode\",\n\t\"unicode.RangeTable\":                          \"unicode\",\n\t\"unicode.Rejang\":                              \"unicode\",\n\t\"unicode.ReplacementChar\":                     \"unicode\",\n\t\"unicode.Runic\":                               \"unicode\",\n\t\"unicode.S\":                                   \"unicode\",\n\t\"unicode.STerm\":                               \"unicode\",\n\t\"unicode.Samaritan\":                           \"unicode\",\n\t\"unicode.Saurashtra\":                          \"unicode\",\n\t\"unicode.Sc\":                                  \"unicode\",\n\t\"unicode.Scripts\":                             \"unicode\",\n\t\"unicode.Sentence_Terminal\":                   \"unicode\",\n\t\"unicode.Sharada\":                             \"unicode\",\n\t\"unicode.Shavian\":                             \"unicode\",\n\t\"unicode.Siddham\":                             \"unicode\",\n\t\"unicode.SignWriting\":                         \"unicode\",\n\t\"unicode.SimpleFold\":                          \"unicode\",\n\t\"unicode.Sinhala\":                             \"unicode\",\n\t\"unicode.Sk\":                                  \"unicode\",\n\t\"unicode.Sm\":                                  \"unicode\",\n\t\"unicode.So\":                                  \"unicode\",\n\t\"unicode.Soft_Dotted\":                         \"unicode\",\n\t\"unicode.Sora_Sompeng\":                        \"unicode\",\n\t\"unicode.Space\":                               \"unicode\",\n\t\"unicode.SpecialCase\":                         \"unicode\",\n\t\"unicode.Sundanese\":                           \"unicode\",\n\t\"unicode.Syloti_Nagri\":                        \"unicode\",\n\t\"unicode.Symbol\":                              \"unicode\",\n\t\"unicode.Syriac\":                              \"unicode\",\n\t\"unicode.Tagalog\":                             \"unicode\",\n\t\"unicode.Tagbanwa\":                            \"unicode\",\n\t\"unicode.Tai_Le\":                              \"unicode\",\n\t\"unicode.Tai_Tham\":                            \"unicode\",\n\t\"unicode.Tai_Viet\":                            \"unicode\",\n\t\"unicode.Takri\":                               \"unicode\",\n\t\"unicode.Tamil\":                               \"unicode\",\n\t\"unicode.Tangut\":                              \"unicode\",\n\t\"unicode.Telugu\":                              \"unicode\",\n\t\"unicode.Terminal_Punctuation\":                \"unicode\",\n\t\"unicode.Thaana\":                              \"unicode\",\n\t\"unicode.Thai\":                                \"unicode\",\n\t\"unicode.Tibetan\":                             \"unicode\",\n\t\"unicode.Tifinagh\":                            \"unicode\",\n\t\"unicode.Tirhuta\":                             \"unicode\",\n\t\"unicode.Title\":                               \"unicode\",\n\t\"unicode.TitleCase\":                           \"unicode\",\n\t\"unicode.To\":                                  \"unicode\",\n\t\"unicode.ToLower\":                             \"unicode\",\n\t\"unicode.ToTitle\":                             \"unicode\",\n\t\"unicode.ToUpper\":                             \"unicode\",\n\t\"unicode.TurkishCase\":                         \"unicode\",\n\t\"unicode.Ugaritic\":                            \"unicode\",\n\t\"unicode.Unified_Ideograph\":                   \"unicode\",\n\t\"unicode.Upper\":                               \"unicode\",\n\t\"unicode.UpperCase\":                           \"unicode\",\n\t\"unicode.UpperLower\":                          \"unicode\",\n\t\"unicode.Vai\":                                 \"unicode\",\n\t\"unicode.Variation_Selector\":                  \"unicode\",\n\t\"unicode.Version\":                             \"unicode\",\n\t\"unicode.Warang_Citi\":                         \"unicode\",\n\t\"unicode.White_Space\":                         \"unicode\",\n\t\"unicode.Yi\":                                  \"unicode\",\n\t\"unicode.Z\":                                   \"unicode\",\n\t\"unicode.Zl\":                                  \"unicode\",\n\t\"unicode.Zp\":                                  \"unicode\",\n\t\"unicode.Zs\":                                  \"unicode\",\n\t\"url.Error\":                                   \"net/url\",\n\t\"url.EscapeError\":                             \"net/url\",\n\t\"url.InvalidHostError\":                        \"net/url\",\n\t\"url.Parse\":                                   \"net/url\",\n\t\"url.ParseQuery\":                              \"net/url\",\n\t\"url.ParseRequestURI\":                         \"net/url\",\n\t\"url.QueryEscape\":                             \"net/url\",\n\t\"url.QueryUnescape\":                           \"net/url\",\n\t\"url.URL\":                                     \"net/url\",\n\t\"url.User\":                                    \"net/url\",\n\t\"url.UserPassword\":                            \"net/url\",\n\t\"url.Userinfo\":                                \"net/url\",\n\t\"url.Values\":                                  \"net/url\",\n\t\"user.Current\":                                \"os/user\",\n\t\"user.Group\":                                  \"os/user\",\n\t\"user.Lookup\":                                 \"os/user\",\n\t\"user.LookupGroup\":                            \"os/user\",\n\t\"user.LookupGroupId\":                          \"os/user\",\n\t\"user.LookupId\":                               \"os/user\",\n\t\"user.UnknownGroupError\":                      \"os/user\",\n\t\"user.UnknownGroupIdError\":                    \"os/user\",\n\t\"user.UnknownUserError\":                       \"os/user\",\n\t\"user.UnknownUserIdError\":                     \"os/user\",\n\t\"user.User\":                                   \"os/user\",\n\t\"utf16.Decode\":                                \"unicode/utf16\",\n\t\"utf16.DecodeRune\":                            \"unicode/utf16\",\n\t\"utf16.Encode\":                                \"unicode/utf16\",\n\t\"utf16.EncodeRune\":                            \"unicode/utf16\",\n\t\"utf16.IsSurrogate\":                           \"unicode/utf16\",\n\t\"utf8.DecodeLastRune\":                         \"unicode/utf8\",\n\t\"utf8.DecodeLastRuneInString\":                 \"unicode/utf8\",\n\t\"utf8.DecodeRune\":                             \"unicode/utf8\",\n\t\"utf8.DecodeRuneInString\":                     \"unicode/utf8\",\n\t\"utf8.EncodeRune\":                             \"unicode/utf8\",\n\t\"utf8.FullRune\":                               \"unicode/utf8\",\n\t\"utf8.FullRuneInString\":                       \"unicode/utf8\",\n\t\"utf8.MaxRune\":                                \"unicode/utf8\",\n\t\"utf8.RuneCount\":                              \"unicode/utf8\",\n\t\"utf8.RuneCountInString\":                      \"unicode/utf8\",\n\t\"utf8.RuneError\":                              \"unicode/utf8\",\n\t\"utf8.RuneLen\":                                \"unicode/utf8\",\n\t\"utf8.RuneSelf\":                               \"unicode/utf8\",\n\t\"utf8.RuneStart\":                              \"unicode/utf8\",\n\t\"utf8.UTFMax\":                                 \"unicode/utf8\",\n\t\"utf8.Valid\":                                  \"unicode/utf8\",\n\t\"utf8.ValidRune\":                              \"unicode/utf8\",\n\t\"utf8.ValidString\":                            \"unicode/utf8\",\n\t\"x509.CANotAuthorizedForThisName\":             \"crypto/x509\",\n\t\"x509.CertPool\":                               \"crypto/x509\",\n\t\"x509.Certificate\":                            \"crypto/x509\",\n\t\"x509.CertificateInvalidError\":                \"crypto/x509\",\n\t\"x509.CertificateRequest\":                     \"crypto/x509\",\n\t\"x509.ConstraintViolationError\":               \"crypto/x509\",\n\t\"x509.CreateCertificate\":                      \"crypto/x509\",\n\t\"x509.CreateCertificateRequest\":               \"crypto/x509\",\n\t\"x509.DSA\":                                    \"crypto/x509\",\n\t\"x509.DSAWithSHA1\":                            \"crypto/x509\",\n\t\"x509.DSAWithSHA256\":                          \"crypto/x509\",\n\t\"x509.DecryptPEMBlock\":                        \"crypto/x509\",\n\t\"x509.ECDSA\":                                  \"crypto/x509\",\n\t\"x509.ECDSAWithSHA1\":                          \"crypto/x509\",\n\t\"x509.ECDSAWithSHA256\":                        \"crypto/x509\",\n\t\"x509.ECDSAWithSHA384\":                        \"crypto/x509\",\n\t\"x509.ECDSAWithSHA512\":                        \"crypto/x509\",\n\t\"x509.EncryptPEMBlock\":                        \"crypto/x509\",\n\t\"x509.ErrUnsupportedAlgorithm\":                \"crypto/x509\",\n\t\"x509.Expired\":                                \"crypto/x509\",\n\t\"x509.ExtKeyUsage\":                            \"crypto/x509\",\n\t\"x509.ExtKeyUsageAny\":                         \"crypto/x509\",\n\t\"x509.ExtKeyUsageClientAuth\":                  \"crypto/x509\",\n\t\"x509.ExtKeyUsageCodeSigning\":                 \"crypto/x509\",\n\t\"x509.ExtKeyUsageEmailProtection\":             \"crypto/x509\",\n\t\"x509.ExtKeyUsageIPSECEndSystem\":              \"crypto/x509\",\n\t\"x509.ExtKeyUsageIPSECTunnel\":                 \"crypto/x509\",\n\t\"x509.ExtKeyUsageIPSECUser\":                   \"crypto/x509\",\n\t\"x509.ExtKeyUsageMicrosoftServerGatedCrypto\":  \"crypto/x509\",\n\t\"x509.ExtKeyUsageNetscapeServerGatedCrypto\":   \"crypto/x509\",\n\t\"x509.ExtKeyUsageOCSPSigning\":                 \"crypto/x509\",\n\t\"x509.ExtKeyUsageServerAuth\":                  \"crypto/x509\",\n\t\"x509.ExtKeyUsageTimeStamping\":                \"crypto/x509\",\n\t\"x509.HostnameError\":                          \"crypto/x509\",\n\t\"x509.IncompatibleUsage\":                      \"crypto/x509\",\n\t\"x509.IncorrectPasswordError\":                 \"crypto/x509\",\n\t\"x509.InsecureAlgorithmError\":                 \"crypto/x509\",\n\t\"x509.InvalidReason\":                          \"crypto/x509\",\n\t\"x509.IsEncryptedPEMBlock\":                    \"crypto/x509\",\n\t\"x509.KeyUsage\":                               \"crypto/x509\",\n\t\"x509.KeyUsageCRLSign\":                        \"crypto/x509\",\n\t\"x509.KeyUsageCertSign\":                       \"crypto/x509\",\n\t\"x509.KeyUsageContentCommitment\":              \"crypto/x509\",\n\t\"x509.KeyUsageDataEncipherment\":               \"crypto/x509\",\n\t\"x509.KeyUsageDecipherOnly\":                   \"crypto/x509\",\n\t\"x509.KeyUsageDigitalSignature\":               \"crypto/x509\",\n\t\"x509.KeyUsageEncipherOnly\":                   \"crypto/x509\",\n\t\"x509.KeyUsageKeyAgreement\":                   \"crypto/x509\",\n\t\"x509.KeyUsageKeyEncipherment\":                \"crypto/x509\",\n\t\"x509.MD2WithRSA\":                             \"crypto/x509\",\n\t\"x509.MD5WithRSA\":                             \"crypto/x509\",\n\t\"x509.MarshalECPrivateKey\":                    \"crypto/x509\",\n\t\"x509.MarshalPKCS1PrivateKey\":                 \"crypto/x509\",\n\t\"x509.MarshalPKIXPublicKey\":                   \"crypto/x509\",\n\t\"x509.NewCertPool\":                            \"crypto/x509\",\n\t\"x509.NotAuthorizedToSign\":                    \"crypto/x509\",\n\t\"x509.PEMCipher\":                              \"crypto/x509\",\n\t\"x509.PEMCipher3DES\":                          \"crypto/x509\",\n\t\"x509.PEMCipherAES128\":                        \"crypto/x509\",\n\t\"x509.PEMCipherAES192\":                        \"crypto/x509\",\n\t\"x509.PEMCipherAES256\":                        \"crypto/x509\",\n\t\"x509.PEMCipherDES\":                           \"crypto/x509\",\n\t\"x509.ParseCRL\":                               \"crypto/x509\",\n\t\"x509.ParseCertificate\":                       \"crypto/x509\",\n\t\"x509.ParseCertificateRequest\":                \"crypto/x509\",\n\t\"x509.ParseCertificates\":                      \"crypto/x509\",\n\t\"x509.ParseDERCRL\":                            \"crypto/x509\",\n\t\"x509.ParseECPrivateKey\":                      \"crypto/x509\",\n\t\"x509.ParsePKCS1PrivateKey\":                   \"crypto/x509\",\n\t\"x509.ParsePKCS8PrivateKey\":                   \"crypto/x509\",\n\t\"x509.ParsePKIXPublicKey\":                     \"crypto/x509\",\n\t\"x509.PublicKeyAlgorithm\":                     \"crypto/x509\",\n\t\"x509.RSA\":                                    \"crypto/x509\",\n\t\"x509.SHA1WithRSA\":                            \"crypto/x509\",\n\t\"x509.SHA256WithRSA\":                          \"crypto/x509\",\n\t\"x509.SHA384WithRSA\":                          \"crypto/x509\",\n\t\"x509.SHA512WithRSA\":                          \"crypto/x509\",\n\t\"x509.SignatureAlgorithm\":                     \"crypto/x509\",\n\t\"x509.SystemCertPool\":                         \"crypto/x509\",\n\t\"x509.SystemRootsError\":                       \"crypto/x509\",\n\t\"x509.TooManyIntermediates\":                   \"crypto/x509\",\n\t\"x509.UnhandledCriticalExtension\":             \"crypto/x509\",\n\t\"x509.UnknownAuthorityError\":                  \"crypto/x509\",\n\t\"x509.UnknownPublicKeyAlgorithm\":              \"crypto/x509\",\n\t\"x509.UnknownSignatureAlgorithm\":              \"crypto/x509\",\n\t\"x509.VerifyOptions\":                          \"crypto/x509\",\n\t\"xml.Attr\":                                    \"encoding/xml\",\n\t\"xml.CharData\":                                \"encoding/xml\",\n\t\"xml.Comment\":                                 \"encoding/xml\",\n\t\"xml.CopyToken\":                               \"encoding/xml\",\n\t\"xml.Decoder\":                                 \"encoding/xml\",\n\t\"xml.Directive\":                               \"encoding/xml\",\n\t\"xml.Encoder\":                                 \"encoding/xml\",\n\t\"xml.EndElement\":                              \"encoding/xml\",\n\t\"xml.Escape\":                                  \"encoding/xml\",\n\t\"xml.EscapeText\":                              \"encoding/xml\",\n\t\"xml.HTMLAutoClose\":                           \"encoding/xml\",\n\t\"xml.HTMLEntity\":                              \"encoding/xml\",\n\t\"xml.Header\":                                  \"encoding/xml\",\n\t\"xml.Marshal\":                                 \"encoding/xml\",\n\t\"xml.MarshalIndent\":                           \"encoding/xml\",\n\t\"xml.Marshaler\":                               \"encoding/xml\",\n\t\"xml.MarshalerAttr\":                           \"encoding/xml\",\n\t\"xml.Name\":                                    \"encoding/xml\",\n\t\"xml.NewDecoder\":                              \"encoding/xml\",\n\t\"xml.NewEncoder\":                              \"encoding/xml\",\n\t\"xml.ProcInst\":                                \"encoding/xml\",\n\t\"xml.StartElement\":                            \"encoding/xml\",\n\t\"xml.SyntaxError\":                             \"encoding/xml\",\n\t\"xml.TagPathError\":                            \"encoding/xml\",\n\t\"xml.Token\":                                   \"encoding/xml\",\n\t\"xml.Unmarshal\":                               \"encoding/xml\",\n\t\"xml.UnmarshalError\":                          \"encoding/xml\",\n\t\"xml.Unmarshaler\":                             \"encoding/xml\",\n\t\"xml.UnmarshalerAttr\":                         \"encoding/xml\",\n\t\"xml.UnsupportedTypeError\":                    \"encoding/xml\",\n\t\"zip.Compressor\":                              \"archive/zip\",\n\t\"zip.Decompressor\":                            \"archive/zip\",\n\t\"zip.Deflate\":                                 \"archive/zip\",\n\t\"zip.ErrAlgorithm\":                            \"archive/zip\",\n\t\"zip.ErrChecksum\":                             \"archive/zip\",\n\t\"zip.ErrFormat\":                               \"archive/zip\",\n\t\"zip.File\":                                    \"archive/zip\",\n\t\"zip.FileHeader\":                              \"archive/zip\",\n\t\"zip.FileInfoHeader\":                          \"archive/zip\",\n\t\"zip.NewReader\":                               \"archive/zip\",\n\t\"zip.NewWriter\":                               \"archive/zip\",\n\t\"zip.OpenReader\":                              \"archive/zip\",\n\t\"zip.ReadCloser\":                              \"archive/zip\",\n\t\"zip.Reader\":                                  \"archive/zip\",\n\t\"zip.RegisterCompressor\":                      \"archive/zip\",\n\t\"zip.RegisterDecompressor\":                    \"archive/zip\",\n\t\"zip.Store\":                                   \"archive/zip\",\n\t\"zip.Writer\":                                  \"archive/zip\",\n\t\"zlib.BestCompression\":                        \"compress/zlib\",\n\t\"zlib.BestSpeed\":                              \"compress/zlib\",\n\t\"zlib.DefaultCompression\":                     \"compress/zlib\",\n\t\"zlib.ErrChecksum\":                            \"compress/zlib\",\n\t\"zlib.ErrDictionary\":                          \"compress/zlib\",\n\t\"zlib.ErrHeader\":                              \"compress/zlib\",\n\t\"zlib.NewReader\":                              \"compress/zlib\",\n\t\"zlib.NewReaderDict\":                          \"compress/zlib\",\n\t\"zlib.NewWriter\":                              \"compress/zlib\",\n\t\"zlib.NewWriterLevel\":                         \"compress/zlib\",\n\t\"zlib.NewWriterLevelDict\":                     \"compress/zlib\",\n\t\"zlib.NoCompression\":                          \"compress/zlib\",\n\t\"zlib.Resetter\":                               \"compress/zlib\",\n\t\"zlib.Writer\":                                 \"compress/zlib\",\n\n\t\"unsafe.Alignof\":       \"unsafe\",\n\t\"unsafe.ArbitraryType\": \"unsafe\",\n\t\"unsafe.Offsetof\":      \"unsafe\",\n\t\"unsafe.Pointer\":       \"unsafe\",\n\t\"unsafe.Sizeof\":        \"unsafe\",\n}\n"
  },
  {
    "path": "vendor/gopkg.in/bsm/ratelimit.v1/Makefile",
    "content": "default: test\n\ntestdeps:\n\t@go get github.com/onsi/ginkgo\n\t@go get github.com/onsi/gomega\n\ntest: testdeps\n\t@go test ./...\n\ntestrace: testdeps\n\t@go test ./... -race\n\ntestall: test testrace\n\nbench:\n\t@go test ./... -run=NONE -bench=.\n"
  },
  {
    "path": "vendor/gopkg.in/bsm/ratelimit.v1/README.md",
    "content": "# RateLimit [![Build Status](https://travis-ci.org/bsm/ratelimit.png?branch=master)](https://travis-ci.org/bsm/ratelimit)\n\nSimple, thread-safe Go rate-limiter.\nInspired by Antti Huima's algorithm on http://stackoverflow.com/a/668327\n\n### Example\n\n```go\npackage main\n\nimport (\n  \"github.com/bsm/ratelimit\"\n  \"log\"\n)\n\nfunc main() {\n  // Create a new rate-limiter, allowing up-to 10 calls\n  // per second\n  rl := ratelimit.New(10, time.Second)\n\n  for i:=0; i<20; i++ {\n    if rl.Limit() {\n      fmt.Println(\"DOH! Over limit!\")\n    } else {\n      fmt.Println(\"OK\")\n    }\n  }\n}\n```\n\n### Licence\n\n```\nCopyright (c) 2015 Black Square Media\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n```\n"
  },
  {
    "path": "vendor/gopkg.in/bsm/ratelimit.v1/ratelimit.go",
    "content": "/*\nSimple, thread-safe Go rate-limiter.\nInspired by Antti Huima's algorithm on http://stackoverflow.com/a/668327\n\nExample:\n\n  // Create a new rate-limiter, allowing up-to 10 calls\n  // per second\n  rl := ratelimit.New(10, time.Second)\n\n  for i:=0; i<20; i++ {\n    if rl.Limit() {\n      fmt.Println(\"DOH! Over limit!\")\n    } else {\n      fmt.Println(\"OK\")\n    }\n  }\n*/\npackage ratelimit\n\nimport (\n\t\"sync/atomic\"\n\t\"time\"\n)\n\n// RateLimiter instances are thread-safe.\ntype RateLimiter struct {\n\trate, allowance, max, unit, lastCheck uint64\n}\n\n// New creates a new rate limiter instance\nfunc New(rate int, per time.Duration) *RateLimiter {\n\tnano := uint64(per)\n\tif nano < 1 {\n\t\tnano = uint64(time.Second)\n\t}\n\tif rate < 1 {\n\t\trate = 1\n\t}\n\n\treturn &RateLimiter{\n\t\trate:      uint64(rate),        // store the rate\n\t\tallowance: uint64(rate) * nano, // set our allowance to max in the beginning\n\t\tmax:       uint64(rate) * nano, // remember our maximum allowance\n\t\tunit:      nano,                // remember our unit size\n\n\t\tlastCheck: unixNano(),\n\t}\n}\n\n// UpdateRate allows to update the allowed rate\nfunc (rl *RateLimiter) UpdateRate(rate int) {\n\tatomic.StoreUint64(&rl.rate, uint64(rate))\n\tatomic.StoreUint64(&rl.max, uint64(rate)*rl.unit)\n}\n\n// Limit returns true if rate was exceeded\nfunc (rl *RateLimiter) Limit() bool {\n\t// Calculate the number of ns that have passed since our last call\n\tnow := unixNano()\n\tpassed := now - atomic.SwapUint64(&rl.lastCheck, now)\n\n\t// Add them to our allowance\n\trate := atomic.LoadUint64(&rl.rate)\n\tcurrent := atomic.AddUint64(&rl.allowance, passed*rate)\n\n\t// Ensure our allowance is not over maximum\n\tif max := atomic.LoadUint64(&rl.max); current > max {\n\t\tatomic.AddUint64(&rl.allowance, max-current)\n\t\tcurrent = max\n\t}\n\n\t// If our allowance is less than one unit, rate-limit!\n\tif current < rl.unit {\n\t\treturn true\n\t}\n\n\t// Not limited, subtract a unit\n\tatomic.AddUint64(&rl.allowance, -rl.unit)\n\treturn false\n}\n\n// Undo reverts the last Limit() call, returning consumed allowance\nfunc (rl *RateLimiter) Undo() {\n\tcurrent := atomic.AddUint64(&rl.allowance, rl.unit)\n\n\t// Ensure our allowance is not over maximum\n\tif max := atomic.LoadUint64(&rl.max); current > max {\n\t\tatomic.AddUint64(&rl.allowance, max-current)\n\t}\n}\n\n// now as unix nanoseconds\nfunc unixNano() uint64 {\n\treturn uint64(time.Now().UnixNano())\n}\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/LICENSE",
    "content": "Gocheck - A rich testing framework for Go\n \nCopyright (c) 2010-2013 Gustavo Niemeyer <gustavo@niemeyer.net>\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met: \n\n1. Redistributions of source code must retain the above copyright notice, this\n   list of conditions and the following disclaimer. \n2. Redistributions in binary form must reproduce the above copyright notice,\n   this list of conditions and the following disclaimer in the documentation\n   and/or other materials provided with the distribution. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/README.md",
    "content": "Instructions\n============\n\nInstall the package with:\n\n    go get gopkg.in/check.v1\n    \nImport it with:\n\n    import \"gopkg.in/check.v1\"\n\nand use _check_ as the package name inside the code.\n\nFor more details, visit the project page:\n\n* http://labix.org/gocheck\n\nand the API documentation:\n\n* https://gopkg.in/check.v1\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/TODO",
    "content": "- Assert(slice, Contains, item)\n- Parallel test support\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/benchmark.go",
    "content": "// Copyright (c) 2012 The Go Authors. 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 are\n// met:\n// \n//    * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//    * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//    * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// 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\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage check\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"time\"\n)\n\nvar memStats runtime.MemStats\n\n// testingB is a type passed to Benchmark functions to manage benchmark\n// timing and to specify the number of iterations to run.\ntype timer struct {\n\tstart     time.Time // Time test or benchmark started\n\tduration  time.Duration\n\tN         int\n\tbytes     int64\n\ttimerOn   bool\n\tbenchTime time.Duration\n\t// The initial states of memStats.Mallocs and memStats.TotalAlloc.\n\tstartAllocs uint64\n\tstartBytes  uint64\n\t// The net total of this test after being run.\n\tnetAllocs uint64\n\tnetBytes  uint64\n}\n\n// StartTimer starts timing a test. This function is called automatically\n// before a benchmark starts, but it can also used to resume timing after\n// a call to StopTimer.\nfunc (c *C) StartTimer() {\n\tif !c.timerOn {\n\t\tc.start = time.Now()\n\t\tc.timerOn = true\n\n\t\truntime.ReadMemStats(&memStats)\n\t\tc.startAllocs = memStats.Mallocs\n\t\tc.startBytes = memStats.TotalAlloc\n\t}\n}\n\n// StopTimer stops timing a test. This can be used to pause the timer\n// while performing complex initialization that you don't\n// want to measure.\nfunc (c *C) StopTimer() {\n\tif c.timerOn {\n\t\tc.duration += time.Now().Sub(c.start)\n\t\tc.timerOn = false\n\t\truntime.ReadMemStats(&memStats)\n\t\tc.netAllocs += memStats.Mallocs - c.startAllocs\n\t\tc.netBytes += memStats.TotalAlloc - c.startBytes\n\t}\n}\n\n// ResetTimer sets the elapsed benchmark time to zero.\n// It does not affect whether the timer is running.\nfunc (c *C) ResetTimer() {\n\tif c.timerOn {\n\t\tc.start = time.Now()\n\t\truntime.ReadMemStats(&memStats)\n\t\tc.startAllocs = memStats.Mallocs\n\t\tc.startBytes = memStats.TotalAlloc\n\t}\n\tc.duration = 0\n\tc.netAllocs = 0\n\tc.netBytes = 0\n}\n\n// SetBytes informs the number of bytes that the benchmark processes\n// on each iteration. If this is called in a benchmark it will also\n// report MB/s.\nfunc (c *C) SetBytes(n int64) {\n\tc.bytes = n\n}\n\nfunc (c *C) nsPerOp() int64 {\n\tif c.N <= 0 {\n\t\treturn 0\n\t}\n\treturn c.duration.Nanoseconds() / int64(c.N)\n}\n\nfunc (c *C) mbPerSec() float64 {\n\tif c.bytes <= 0 || c.duration <= 0 || c.N <= 0 {\n\t\treturn 0\n\t}\n\treturn (float64(c.bytes) * float64(c.N) / 1e6) / c.duration.Seconds()\n}\n\nfunc (c *C) timerString() string {\n\tif c.N <= 0 {\n\t\treturn fmt.Sprintf(\"%3.3fs\", float64(c.duration.Nanoseconds())/1e9)\n\t}\n\tmbs := c.mbPerSec()\n\tmb := \"\"\n\tif mbs != 0 {\n\t\tmb = fmt.Sprintf(\"\\t%7.2f MB/s\", mbs)\n\t}\n\tnsop := c.nsPerOp()\n\tns := fmt.Sprintf(\"%10d ns/op\", nsop)\n\tif c.N > 0 && nsop < 100 {\n\t\t// The format specifiers here make sure that\n\t\t// the ones digits line up for all three possible formats.\n\t\tif nsop < 10 {\n\t\t\tns = fmt.Sprintf(\"%13.2f ns/op\", float64(c.duration.Nanoseconds())/float64(c.N))\n\t\t} else {\n\t\t\tns = fmt.Sprintf(\"%12.1f ns/op\", float64(c.duration.Nanoseconds())/float64(c.N))\n\t\t}\n\t}\n\tmemStats := \"\"\n\tif c.benchMem {\n\t\tallocedBytes := fmt.Sprintf(\"%8d B/op\", int64(c.netBytes)/int64(c.N))\n\t\tallocs := fmt.Sprintf(\"%8d allocs/op\", int64(c.netAllocs)/int64(c.N))\n\t\tmemStats = fmt.Sprintf(\"\\t%s\\t%s\", allocedBytes, allocs)\n\t}\n\treturn fmt.Sprintf(\"%8d\\t%s%s%s\", c.N, ns, mb, memStats)\n}\n\nfunc min(x, y int) int {\n\tif x > y {\n\t\treturn y\n\t}\n\treturn x\n}\n\nfunc max(x, y int) int {\n\tif x < y {\n\t\treturn y\n\t}\n\treturn x\n}\n\n// roundDown10 rounds a number down to the nearest power of 10.\nfunc roundDown10(n int) int {\n\tvar tens = 0\n\t// tens = floor(log_10(n))\n\tfor n > 10 {\n\t\tn = n / 10\n\t\ttens++\n\t}\n\t// result = 10^tens\n\tresult := 1\n\tfor i := 0; i < tens; i++ {\n\t\tresult *= 10\n\t}\n\treturn result\n}\n\n// roundUp rounds x up to a number of the form [1eX, 2eX, 5eX].\nfunc roundUp(n int) int {\n\tbase := roundDown10(n)\n\tif n < (2 * base) {\n\t\treturn 2 * base\n\t}\n\tif n < (5 * base) {\n\t\treturn 5 * base\n\t}\n\treturn 10 * base\n}\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/check.go",
    "content": "// Package check is a rich testing extension for Go's testing package.\n//\n// For details about the project, see:\n//\n//     http://labix.org/gocheck\n//\npackage check\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/rand\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n)\n\n// -----------------------------------------------------------------------\n// Internal type which deals with suite method calling.\n\nconst (\n\tfixtureKd = iota\n\ttestKd\n)\n\ntype funcKind int\n\nconst (\n\tsucceededSt = iota\n\tfailedSt\n\tskippedSt\n\tpanickedSt\n\tfixturePanickedSt\n\tmissedSt\n)\n\ntype funcStatus uint32\n\n// A method value can't reach its own Method structure.\ntype methodType struct {\n\treflect.Value\n\tInfo reflect.Method\n}\n\nfunc newMethod(receiver reflect.Value, i int) *methodType {\n\treturn &methodType{receiver.Method(i), receiver.Type().Method(i)}\n}\n\nfunc (method *methodType) PC() uintptr {\n\treturn method.Info.Func.Pointer()\n}\n\nfunc (method *methodType) suiteName() string {\n\tt := method.Info.Type.In(0)\n\tif t.Kind() == reflect.Ptr {\n\t\tt = t.Elem()\n\t}\n\treturn t.Name()\n}\n\nfunc (method *methodType) String() string {\n\treturn method.suiteName() + \".\" + method.Info.Name\n}\n\nfunc (method *methodType) matches(re *regexp.Regexp) bool {\n\treturn (re.MatchString(method.Info.Name) ||\n\t\tre.MatchString(method.suiteName()) ||\n\t\tre.MatchString(method.String()))\n}\n\ntype C struct {\n\tmethod    *methodType\n\tkind      funcKind\n\ttestName  string\n\t_status   funcStatus\n\tlogb      *logger\n\tlogw      io.Writer\n\tdone      chan *C\n\treason    string\n\tmustFail  bool\n\ttempDir   *tempDir\n\tbenchMem  bool\n\tstartTime time.Time\n\ttimer\n}\n\nfunc (c *C) status() funcStatus {\n\treturn funcStatus(atomic.LoadUint32((*uint32)(&c._status)))\n}\n\nfunc (c *C) setStatus(s funcStatus) {\n\tatomic.StoreUint32((*uint32)(&c._status), uint32(s))\n}\n\nfunc (c *C) stopNow() {\n\truntime.Goexit()\n}\n\n// logger is a concurrency safe byte.Buffer\ntype logger struct {\n\tsync.Mutex\n\twriter bytes.Buffer\n}\n\nfunc (l *logger) Write(buf []byte) (int, error) {\n\tl.Lock()\n\tdefer l.Unlock()\n\treturn l.writer.Write(buf)\n}\n\nfunc (l *logger) WriteTo(w io.Writer) (int64, error) {\n\tl.Lock()\n\tdefer l.Unlock()\n\treturn l.writer.WriteTo(w)\n}\n\nfunc (l *logger) String() string {\n\tl.Lock()\n\tdefer l.Unlock()\n\treturn l.writer.String()\n}\n\n// -----------------------------------------------------------------------\n// Handling of temporary files and directories.\n\ntype tempDir struct {\n\tsync.Mutex\n\tpath    string\n\tcounter int\n}\n\nfunc (td *tempDir) newPath() string {\n\ttd.Lock()\n\tdefer td.Unlock()\n\tif td.path == \"\" {\n\t\tvar err error\n\t\tfor i := 0; i != 100; i++ {\n\t\t\tpath := fmt.Sprintf(\"%s%ccheck-%d\", os.TempDir(), os.PathSeparator, rand.Int())\n\t\t\tif err = os.Mkdir(path, 0700); err == nil {\n\t\t\t\ttd.path = path\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif td.path == \"\" {\n\t\t\tpanic(\"Couldn't create temporary directory: \" + err.Error())\n\t\t}\n\t}\n\tresult := filepath.Join(td.path, strconv.Itoa(td.counter))\n\ttd.counter++\n\treturn result\n}\n\nfunc (td *tempDir) removeAll() {\n\ttd.Lock()\n\tdefer td.Unlock()\n\tif td.path != \"\" {\n\t\terr := os.RemoveAll(td.path)\n\t\tif err != nil {\n\t\t\tfmt.Fprintf(os.Stderr, \"WARNING: Error cleaning up temporaries: \"+err.Error())\n\t\t}\n\t}\n}\n\n// Create a new temporary directory which is automatically removed after\n// the suite finishes running.\nfunc (c *C) MkDir() string {\n\tpath := c.tempDir.newPath()\n\tif err := os.Mkdir(path, 0700); err != nil {\n\t\tpanic(fmt.Sprintf(\"Couldn't create temporary directory %s: %s\", path, err.Error()))\n\t}\n\treturn path\n}\n\n// -----------------------------------------------------------------------\n// Low-level logging functions.\n\nfunc (c *C) log(args ...interface{}) {\n\tc.writeLog([]byte(fmt.Sprint(args...) + \"\\n\"))\n}\n\nfunc (c *C) logf(format string, args ...interface{}) {\n\tc.writeLog([]byte(fmt.Sprintf(format+\"\\n\", args...)))\n}\n\nfunc (c *C) logNewLine() {\n\tc.writeLog([]byte{'\\n'})\n}\n\nfunc (c *C) writeLog(buf []byte) {\n\tc.logb.Write(buf)\n\tif c.logw != nil {\n\t\tc.logw.Write(buf)\n\t}\n}\n\nfunc hasStringOrError(x interface{}) (ok bool) {\n\t_, ok = x.(fmt.Stringer)\n\tif ok {\n\t\treturn\n\t}\n\t_, ok = x.(error)\n\treturn\n}\n\nfunc (c *C) logValue(label string, value interface{}) {\n\tif label == \"\" {\n\t\tif hasStringOrError(value) {\n\t\t\tc.logf(\"... %#v (%q)\", value, value)\n\t\t} else {\n\t\t\tc.logf(\"... %#v\", value)\n\t\t}\n\t} else if value == nil {\n\t\tc.logf(\"... %s = nil\", label)\n\t} else {\n\t\tif hasStringOrError(value) {\n\t\t\tfv := fmt.Sprintf(\"%#v\", value)\n\t\t\tqv := fmt.Sprintf(\"%q\", value)\n\t\t\tif fv != qv {\n\t\t\t\tc.logf(\"... %s %s = %s (%s)\", label, reflect.TypeOf(value), fv, qv)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif s, ok := value.(string); ok && isMultiLine(s) {\n\t\t\tc.logf(`... %s %s = \"\" +`, label, reflect.TypeOf(value))\n\t\t\tc.logMultiLine(s)\n\t\t} else {\n\t\t\tc.logf(\"... %s %s = %#v\", label, reflect.TypeOf(value), value)\n\t\t}\n\t}\n}\n\nfunc (c *C) logMultiLine(s string) {\n\tb := make([]byte, 0, len(s)*2)\n\ti := 0\n\tn := len(s)\n\tfor i < n {\n\t\tj := i + 1\n\t\tfor j < n && s[j-1] != '\\n' {\n\t\t\tj++\n\t\t}\n\t\tb = append(b, \"...     \"...)\n\t\tb = strconv.AppendQuote(b, s[i:j])\n\t\tif j < n {\n\t\t\tb = append(b, \" +\"...)\n\t\t}\n\t\tb = append(b, '\\n')\n\t\ti = j\n\t}\n\tc.writeLog(b)\n}\n\nfunc isMultiLine(s string) bool {\n\tfor i := 0; i+1 < len(s); i++ {\n\t\tif s[i] == '\\n' {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (c *C) logString(issue string) {\n\tc.log(\"... \", issue)\n}\n\nfunc (c *C) logCaller(skip int) {\n\t// This is a bit heavier than it ought to be.\n\tskip++ // Our own frame.\n\tpc, callerFile, callerLine, ok := runtime.Caller(skip)\n\tif !ok {\n\t\treturn\n\t}\n\tvar testFile string\n\tvar testLine int\n\ttestFunc := runtime.FuncForPC(c.method.PC())\n\tif runtime.FuncForPC(pc) != testFunc {\n\t\tfor {\n\t\t\tskip++\n\t\t\tif pc, file, line, ok := runtime.Caller(skip); ok {\n\t\t\t\t// Note that the test line may be different on\n\t\t\t\t// distinct calls for the same test.  Showing\n\t\t\t\t// the \"internal\" line is helpful when debugging.\n\t\t\t\tif runtime.FuncForPC(pc) == testFunc {\n\t\t\t\t\ttestFile, testLine = file, line\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif testFile != \"\" && (testFile != callerFile || testLine != callerLine) {\n\t\tc.logCode(testFile, testLine)\n\t}\n\tc.logCode(callerFile, callerLine)\n}\n\nfunc (c *C) logCode(path string, line int) {\n\tc.logf(\"%s:%d:\", nicePath(path), line)\n\tcode, err := printLine(path, line)\n\tif code == \"\" {\n\t\tcode = \"...\" // XXX Open the file and take the raw line.\n\t\tif err != nil {\n\t\t\tcode += err.Error()\n\t\t}\n\t}\n\tc.log(indent(code, \"    \"))\n}\n\nvar valueGo = filepath.Join(\"reflect\", \"value.go\")\nvar asmGo = filepath.Join(\"runtime\", \"asm_\")\n\nfunc (c *C) logPanic(skip int, value interface{}) {\n\tskip++ // Our own frame.\n\tinitialSkip := skip\n\tfor ; ; skip++ {\n\t\tif pc, file, line, ok := runtime.Caller(skip); ok {\n\t\t\tif skip == initialSkip {\n\t\t\t\tc.logf(\"... Panic: %s (PC=0x%X)\\n\", value, pc)\n\t\t\t}\n\t\t\tname := niceFuncName(pc)\n\t\t\tpath := nicePath(file)\n\t\t\tif strings.Contains(path, \"/gopkg.in/check.v\") {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif name == \"Value.call\" && strings.HasSuffix(path, valueGo) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (name == \"call16\" || name == \"call32\") && strings.Contains(path, asmGo) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tc.logf(\"%s:%d\\n  in %s\", nicePath(file), line, name)\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (c *C) logSoftPanic(issue string) {\n\tc.log(\"... Panic: \", issue)\n}\n\nfunc (c *C) logArgPanic(method *methodType, expectedType string) {\n\tc.logf(\"... Panic: %s argument should be %s\",\n\t\tniceFuncName(method.PC()), expectedType)\n}\n\n// -----------------------------------------------------------------------\n// Some simple formatting helpers.\n\nvar initWD, initWDErr = os.Getwd()\n\nfunc init() {\n\tif initWDErr == nil {\n\t\tinitWD = strings.Replace(initWD, \"\\\\\", \"/\", -1) + \"/\"\n\t}\n}\n\nfunc nicePath(path string) string {\n\tif initWDErr == nil {\n\t\tif strings.HasPrefix(path, initWD) {\n\t\t\treturn path[len(initWD):]\n\t\t}\n\t}\n\treturn path\n}\n\nfunc niceFuncPath(pc uintptr) string {\n\tfunction := runtime.FuncForPC(pc)\n\tif function != nil {\n\t\tfilename, line := function.FileLine(pc)\n\t\treturn fmt.Sprintf(\"%s:%d\", nicePath(filename), line)\n\t}\n\treturn \"<unknown path>\"\n}\n\nfunc niceFuncName(pc uintptr) string {\n\tfunction := runtime.FuncForPC(pc)\n\tif function != nil {\n\t\tname := path.Base(function.Name())\n\t\tif i := strings.Index(name, \".\"); i > 0 {\n\t\t\tname = name[i+1:]\n\t\t}\n\t\tif strings.HasPrefix(name, \"(*\") {\n\t\t\tif i := strings.Index(name, \")\"); i > 0 {\n\t\t\t\tname = name[2:i] + name[i+1:]\n\t\t\t}\n\t\t}\n\t\tif i := strings.LastIndex(name, \".*\"); i != -1 {\n\t\t\tname = name[:i] + \".\" + name[i+2:]\n\t\t}\n\t\tif i := strings.LastIndex(name, \"·\"); i != -1 {\n\t\t\tname = name[:i] + \".\" + name[i+2:]\n\t\t}\n\t\treturn name\n\t}\n\treturn \"<unknown function>\"\n}\n\n// -----------------------------------------------------------------------\n// Result tracker to aggregate call results.\n\ntype Result struct {\n\tSucceeded        int\n\tFailed           int\n\tSkipped          int\n\tPanicked         int\n\tFixturePanicked  int\n\tExpectedFailures int\n\tMissed           int    // Not even tried to run, related to a panic in the fixture.\n\tRunError         error  // Houston, we've got a problem.\n\tWorkDir          string // If KeepWorkDir is true\n}\n\ntype resultTracker struct {\n\tresult          Result\n\t_lastWasProblem bool\n\t_waiting        int\n\t_missed         int\n\t_expectChan     chan *C\n\t_doneChan       chan *C\n\t_stopChan       chan bool\n}\n\nfunc newResultTracker() *resultTracker {\n\treturn &resultTracker{_expectChan: make(chan *C), // Synchronous\n\t\t_doneChan: make(chan *C, 32), // Asynchronous\n\t\t_stopChan: make(chan bool)}   // Synchronous\n}\n\nfunc (tracker *resultTracker) start() {\n\tgo tracker._loopRoutine()\n}\n\nfunc (tracker *resultTracker) waitAndStop() {\n\t<-tracker._stopChan\n}\n\nfunc (tracker *resultTracker) expectCall(c *C) {\n\ttracker._expectChan <- c\n}\n\nfunc (tracker *resultTracker) callDone(c *C) {\n\ttracker._doneChan <- c\n}\n\nfunc (tracker *resultTracker) _loopRoutine() {\n\tfor {\n\t\tvar c *C\n\t\tif tracker._waiting > 0 {\n\t\t\t// Calls still running. Can't stop.\n\t\t\tselect {\n\t\t\t// XXX Reindent this (not now to make diff clear)\n\t\t\tcase <-tracker._expectChan:\n\t\t\t\ttracker._waiting++\n\t\t\tcase c = <-tracker._doneChan:\n\t\t\t\ttracker._waiting--\n\t\t\t\tswitch c.status() {\n\t\t\t\tcase succeededSt:\n\t\t\t\t\tif c.kind == testKd {\n\t\t\t\t\t\tif c.mustFail {\n\t\t\t\t\t\t\ttracker.result.ExpectedFailures++\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttracker.result.Succeeded++\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tcase failedSt:\n\t\t\t\t\ttracker.result.Failed++\n\t\t\t\tcase panickedSt:\n\t\t\t\t\tif c.kind == fixtureKd {\n\t\t\t\t\t\ttracker.result.FixturePanicked++\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttracker.result.Panicked++\n\t\t\t\t\t}\n\t\t\t\tcase fixturePanickedSt:\n\t\t\t\t\t// Track it as missed, since the panic\n\t\t\t\t\t// was on the fixture, not on the test.\n\t\t\t\t\ttracker.result.Missed++\n\t\t\t\tcase missedSt:\n\t\t\t\t\ttracker.result.Missed++\n\t\t\t\tcase skippedSt:\n\t\t\t\t\tif c.kind == testKd {\n\t\t\t\t\t\ttracker.result.Skipped++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// No calls.  Can stop, but no done calls here.\n\t\t\tselect {\n\t\t\tcase tracker._stopChan <- true:\n\t\t\t\treturn\n\t\t\tcase <-tracker._expectChan:\n\t\t\t\ttracker._waiting++\n\t\t\tcase <-tracker._doneChan:\n\t\t\t\tpanic(\"Tracker got an unexpected done call.\")\n\t\t\t}\n\t\t}\n\t}\n}\n\n// -----------------------------------------------------------------------\n// The underlying suite runner.\n\ntype suiteRunner struct {\n\tsuite                     interface{}\n\tsetUpSuite, tearDownSuite *methodType\n\tsetUpTest, tearDownTest   *methodType\n\ttests                     []*methodType\n\ttracker                   *resultTracker\n\ttempDir                   *tempDir\n\tkeepDir                   bool\n\toutput                    *outputWriter\n\treportedProblemLast       bool\n\tbenchTime                 time.Duration\n\tbenchMem                  bool\n}\n\ntype RunConf struct {\n\tOutput        io.Writer\n\tStream        bool\n\tVerbose       bool\n\tFilter        string\n\tBenchmark     bool\n\tBenchmarkTime time.Duration // Defaults to 1 second\n\tBenchmarkMem  bool\n\tKeepWorkDir   bool\n}\n\n// Create a new suiteRunner able to run all methods in the given suite.\nfunc newSuiteRunner(suite interface{}, runConf *RunConf) *suiteRunner {\n\tvar conf RunConf\n\tif runConf != nil {\n\t\tconf = *runConf\n\t}\n\tif conf.Output == nil {\n\t\tconf.Output = os.Stdout\n\t}\n\tif conf.Benchmark {\n\t\tconf.Verbose = true\n\t}\n\n\tsuiteType := reflect.TypeOf(suite)\n\tsuiteNumMethods := suiteType.NumMethod()\n\tsuiteValue := reflect.ValueOf(suite)\n\n\trunner := &suiteRunner{\n\t\tsuite:     suite,\n\t\toutput:    newOutputWriter(conf.Output, conf.Stream, conf.Verbose),\n\t\ttracker:   newResultTracker(),\n\t\tbenchTime: conf.BenchmarkTime,\n\t\tbenchMem:  conf.BenchmarkMem,\n\t\ttempDir:   &tempDir{},\n\t\tkeepDir:   conf.KeepWorkDir,\n\t\ttests:     make([]*methodType, 0, suiteNumMethods),\n\t}\n\tif runner.benchTime == 0 {\n\t\trunner.benchTime = 1 * time.Second\n\t}\n\n\tvar filterRegexp *regexp.Regexp\n\tif conf.Filter != \"\" {\n\t\tregexp, err := regexp.Compile(conf.Filter)\n\t\tif err != nil {\n\t\t\tmsg := \"Bad filter expression: \" + err.Error()\n\t\t\trunner.tracker.result.RunError = errors.New(msg)\n\t\t\treturn runner\n\t\t}\n\t\tfilterRegexp = regexp\n\t}\n\n\tfor i := 0; i != suiteNumMethods; i++ {\n\t\tmethod := newMethod(suiteValue, i)\n\t\tswitch method.Info.Name {\n\t\tcase \"SetUpSuite\":\n\t\t\trunner.setUpSuite = method\n\t\tcase \"TearDownSuite\":\n\t\t\trunner.tearDownSuite = method\n\t\tcase \"SetUpTest\":\n\t\t\trunner.setUpTest = method\n\t\tcase \"TearDownTest\":\n\t\t\trunner.tearDownTest = method\n\t\tdefault:\n\t\t\tprefix := \"Test\"\n\t\t\tif conf.Benchmark {\n\t\t\t\tprefix = \"Benchmark\"\n\t\t\t}\n\t\t\tif !strings.HasPrefix(method.Info.Name, prefix) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif filterRegexp == nil || method.matches(filterRegexp) {\n\t\t\t\trunner.tests = append(runner.tests, method)\n\t\t\t}\n\t\t}\n\t}\n\treturn runner\n}\n\n// Run all methods in the given suite.\nfunc (runner *suiteRunner) run() *Result {\n\tif runner.tracker.result.RunError == nil && len(runner.tests) > 0 {\n\t\trunner.tracker.start()\n\t\tif runner.checkFixtureArgs() {\n\t\t\tc := runner.runFixture(runner.setUpSuite, \"\", nil)\n\t\t\tif c == nil || c.status() == succeededSt {\n\t\t\t\tfor i := 0; i != len(runner.tests); i++ {\n\t\t\t\t\tc := runner.runTest(runner.tests[i])\n\t\t\t\t\tif c.status() == fixturePanickedSt {\n\t\t\t\t\t\trunner.skipTests(missedSt, runner.tests[i+1:])\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if c != nil && c.status() == skippedSt {\n\t\t\t\trunner.skipTests(skippedSt, runner.tests)\n\t\t\t} else {\n\t\t\t\trunner.skipTests(missedSt, runner.tests)\n\t\t\t}\n\t\t\trunner.runFixture(runner.tearDownSuite, \"\", nil)\n\t\t} else {\n\t\t\trunner.skipTests(missedSt, runner.tests)\n\t\t}\n\t\trunner.tracker.waitAndStop()\n\t\tif runner.keepDir {\n\t\t\trunner.tracker.result.WorkDir = runner.tempDir.path\n\t\t} else {\n\t\t\trunner.tempDir.removeAll()\n\t\t}\n\t}\n\treturn &runner.tracker.result\n}\n\n// Create a call object with the given suite method, and fork a\n// goroutine with the provided dispatcher for running it.\nfunc (runner *suiteRunner) forkCall(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C {\n\tvar logw io.Writer\n\tif runner.output.Stream {\n\t\tlogw = runner.output\n\t}\n\tif logb == nil {\n\t\tlogb = new(logger)\n\t}\n\tc := &C{\n\t\tmethod:    method,\n\t\tkind:      kind,\n\t\ttestName:  testName,\n\t\tlogb:      logb,\n\t\tlogw:      logw,\n\t\ttempDir:   runner.tempDir,\n\t\tdone:      make(chan *C, 1),\n\t\ttimer:     timer{benchTime: runner.benchTime},\n\t\tstartTime: time.Now(),\n\t\tbenchMem:  runner.benchMem,\n\t}\n\trunner.tracker.expectCall(c)\n\tgo (func() {\n\t\trunner.reportCallStarted(c)\n\t\tdefer runner.callDone(c)\n\t\tdispatcher(c)\n\t})()\n\treturn c\n}\n\n// Same as forkCall(), but wait for call to finish before returning.\nfunc (runner *suiteRunner) runFunc(method *methodType, kind funcKind, testName string, logb *logger, dispatcher func(c *C)) *C {\n\tc := runner.forkCall(method, kind, testName, logb, dispatcher)\n\t<-c.done\n\treturn c\n}\n\n// Handle a finished call.  If there were any panics, update the call status\n// accordingly.  Then, mark the call as done and report to the tracker.\nfunc (runner *suiteRunner) callDone(c *C) {\n\tvalue := recover()\n\tif value != nil {\n\t\tswitch v := value.(type) {\n\t\tcase *fixturePanic:\n\t\t\tif v.status == skippedSt {\n\t\t\t\tc.setStatus(skippedSt)\n\t\t\t} else {\n\t\t\t\tc.logSoftPanic(\"Fixture has panicked (see related PANIC)\")\n\t\t\t\tc.setStatus(fixturePanickedSt)\n\t\t\t}\n\t\tdefault:\n\t\t\tc.logPanic(1, value)\n\t\t\tc.setStatus(panickedSt)\n\t\t}\n\t}\n\tif c.mustFail {\n\t\tswitch c.status() {\n\t\tcase failedSt:\n\t\t\tc.setStatus(succeededSt)\n\t\tcase succeededSt:\n\t\t\tc.setStatus(failedSt)\n\t\t\tc.logString(\"Error: Test succeeded, but was expected to fail\")\n\t\t\tc.logString(\"Reason: \" + c.reason)\n\t\t}\n\t}\n\n\trunner.reportCallDone(c)\n\tc.done <- c\n}\n\n// Runs a fixture call synchronously.  The fixture will still be run in a\n// goroutine like all suite methods, but this method will not return\n// while the fixture goroutine is not done, because the fixture must be\n// run in a desired order.\nfunc (runner *suiteRunner) runFixture(method *methodType, testName string, logb *logger) *C {\n\tif method != nil {\n\t\tc := runner.runFunc(method, fixtureKd, testName, logb, func(c *C) {\n\t\t\tc.ResetTimer()\n\t\t\tc.StartTimer()\n\t\t\tdefer c.StopTimer()\n\t\t\tc.method.Call([]reflect.Value{reflect.ValueOf(c)})\n\t\t})\n\t\treturn c\n\t}\n\treturn nil\n}\n\n// Run the fixture method with runFixture(), but panic with a fixturePanic{}\n// in case the fixture method panics.  This makes it easier to track the\n// fixture panic together with other call panics within forkTest().\nfunc (runner *suiteRunner) runFixtureWithPanic(method *methodType, testName string, logb *logger, skipped *bool) *C {\n\tif skipped != nil && *skipped {\n\t\treturn nil\n\t}\n\tc := runner.runFixture(method, testName, logb)\n\tif c != nil && c.status() != succeededSt {\n\t\tif skipped != nil {\n\t\t\t*skipped = c.status() == skippedSt\n\t\t}\n\t\tpanic(&fixturePanic{c.status(), method})\n\t}\n\treturn c\n}\n\ntype fixturePanic struct {\n\tstatus funcStatus\n\tmethod *methodType\n}\n\n// Run the suite test method, together with the test-specific fixture,\n// asynchronously.\nfunc (runner *suiteRunner) forkTest(method *methodType) *C {\n\ttestName := method.String()\n\treturn runner.forkCall(method, testKd, testName, nil, func(c *C) {\n\t\tvar skipped bool\n\t\tdefer runner.runFixtureWithPanic(runner.tearDownTest, testName, nil, &skipped)\n\t\tdefer c.StopTimer()\n\t\tbenchN := 1\n\t\tfor {\n\t\t\trunner.runFixtureWithPanic(runner.setUpTest, testName, c.logb, &skipped)\n\t\t\tmt := c.method.Type()\n\t\t\tif mt.NumIn() != 1 || mt.In(0) != reflect.TypeOf(c) {\n\t\t\t\t// Rather than a plain panic, provide a more helpful message when\n\t\t\t\t// the argument type is incorrect.\n\t\t\t\tc.setStatus(panickedSt)\n\t\t\t\tc.logArgPanic(c.method, \"*check.C\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif strings.HasPrefix(c.method.Info.Name, \"Test\") {\n\t\t\t\tc.ResetTimer()\n\t\t\t\tc.StartTimer()\n\t\t\t\tc.method.Call([]reflect.Value{reflect.ValueOf(c)})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !strings.HasPrefix(c.method.Info.Name, \"Benchmark\") {\n\t\t\t\tpanic(\"unexpected method prefix: \" + c.method.Info.Name)\n\t\t\t}\n\n\t\t\truntime.GC()\n\t\t\tc.N = benchN\n\t\t\tc.ResetTimer()\n\t\t\tc.StartTimer()\n\t\t\tc.method.Call([]reflect.Value{reflect.ValueOf(c)})\n\t\t\tc.StopTimer()\n\t\t\tif c.status() != succeededSt || c.duration >= c.benchTime || benchN >= 1e9 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tperOpN := int(1e9)\n\t\t\tif c.nsPerOp() != 0 {\n\t\t\t\tperOpN = int(c.benchTime.Nanoseconds() / c.nsPerOp())\n\t\t\t}\n\n\t\t\t// Logic taken from the stock testing package:\n\t\t\t// - Run more iterations than we think we'll need for a second (1.5x).\n\t\t\t// - Don't grow too fast in case we had timing errors previously.\n\t\t\t// - Be sure to run at least one more than last time.\n\t\t\tbenchN = max(min(perOpN+perOpN/2, 100*benchN), benchN+1)\n\t\t\tbenchN = roundUp(benchN)\n\n\t\t\tskipped = true // Don't run the deferred one if this panics.\n\t\t\trunner.runFixtureWithPanic(runner.tearDownTest, testName, nil, nil)\n\t\t\tskipped = false\n\t\t}\n\t})\n}\n\n// Same as forkTest(), but wait for the test to finish before returning.\nfunc (runner *suiteRunner) runTest(method *methodType) *C {\n\tc := runner.forkTest(method)\n\t<-c.done\n\treturn c\n}\n\n// Helper to mark tests as skipped or missed.  A bit heavy for what\n// it does, but it enables homogeneous handling of tracking, including\n// nice verbose output.\nfunc (runner *suiteRunner) skipTests(status funcStatus, methods []*methodType) {\n\tfor _, method := range methods {\n\t\trunner.runFunc(method, testKd, \"\", nil, func(c *C) {\n\t\t\tc.setStatus(status)\n\t\t})\n\t}\n}\n\n// Verify if the fixture arguments are *check.C.  In case of errors,\n// log the error as a panic in the fixture method call, and return false.\nfunc (runner *suiteRunner) checkFixtureArgs() bool {\n\tsucceeded := true\n\targType := reflect.TypeOf(&C{})\n\tfor _, method := range []*methodType{runner.setUpSuite, runner.tearDownSuite, runner.setUpTest, runner.tearDownTest} {\n\t\tif method != nil {\n\t\t\tmt := method.Type()\n\t\t\tif mt.NumIn() != 1 || mt.In(0) != argType {\n\t\t\t\tsucceeded = false\n\t\t\t\trunner.runFunc(method, fixtureKd, \"\", nil, func(c *C) {\n\t\t\t\t\tc.logArgPanic(method, \"*check.C\")\n\t\t\t\t\tc.setStatus(panickedSt)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\treturn succeeded\n}\n\nfunc (runner *suiteRunner) reportCallStarted(c *C) {\n\trunner.output.WriteCallStarted(\"START\", c)\n}\n\nfunc (runner *suiteRunner) reportCallDone(c *C) {\n\trunner.tracker.callDone(c)\n\tswitch c.status() {\n\tcase succeededSt:\n\t\tif c.mustFail {\n\t\t\trunner.output.WriteCallSuccess(\"FAIL EXPECTED\", c)\n\t\t} else {\n\t\t\trunner.output.WriteCallSuccess(\"PASS\", c)\n\t\t}\n\tcase skippedSt:\n\t\trunner.output.WriteCallSuccess(\"SKIP\", c)\n\tcase failedSt:\n\t\trunner.output.WriteCallProblem(\"FAIL\", c)\n\tcase panickedSt:\n\t\trunner.output.WriteCallProblem(\"PANIC\", c)\n\tcase fixturePanickedSt:\n\t\t// That's a testKd call reporting that its fixture\n\t\t// has panicked. The fixture call which caused the\n\t\t// panic itself was tracked above. We'll report to\n\t\t// aid debugging.\n\t\trunner.output.WriteCallProblem(\"PANIC\", c)\n\tcase missedSt:\n\t\trunner.output.WriteCallSuccess(\"MISS\", c)\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/checkers.go",
    "content": "package check\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"regexp\"\n)\n\n// -----------------------------------------------------------------------\n// CommentInterface and Commentf helper, to attach extra information to checks.\n\ntype comment struct {\n\tformat string\n\targs   []interface{}\n}\n\n// Commentf returns an infomational value to use with Assert or Check calls.\n// If the checker test fails, the provided arguments will be passed to\n// fmt.Sprintf, and will be presented next to the logged failure.\n//\n// For example:\n//\n//     c.Assert(v, Equals, 42, Commentf(\"Iteration #%d failed.\", i))\n//\n// Note that if the comment is constant, a better option is to\n// simply use a normal comment right above or next to the line, as\n// it will also get printed with any errors:\n//\n//     c.Assert(l, Equals, 8192) // Ensure buffer size is correct (bug #123)\n//\nfunc Commentf(format string, args ...interface{}) CommentInterface {\n\treturn &comment{format, args}\n}\n\n// CommentInterface must be implemented by types that attach extra\n// information to failed checks. See the Commentf function for details.\ntype CommentInterface interface {\n\tCheckCommentString() string\n}\n\nfunc (c *comment) CheckCommentString() string {\n\treturn fmt.Sprintf(c.format, c.args...)\n}\n\n// -----------------------------------------------------------------------\n// The Checker interface.\n\n// The Checker interface must be provided by checkers used with\n// the Assert and Check verification methods.\ntype Checker interface {\n\tInfo() *CheckerInfo\n\tCheck(params []interface{}, names []string) (result bool, error string)\n}\n\n// See the Checker interface.\ntype CheckerInfo struct {\n\tName   string\n\tParams []string\n}\n\nfunc (info *CheckerInfo) Info() *CheckerInfo {\n\treturn info\n}\n\n// -----------------------------------------------------------------------\n// Not checker logic inverter.\n\n// The Not checker inverts the logic of the provided checker.  The\n// resulting checker will succeed where the original one failed, and\n// vice-versa.\n//\n// For example:\n//\n//     c.Assert(a, Not(Equals), b)\n//\nfunc Not(checker Checker) Checker {\n\treturn &notChecker{checker}\n}\n\ntype notChecker struct {\n\tsub Checker\n}\n\nfunc (checker *notChecker) Info() *CheckerInfo {\n\tinfo := *checker.sub.Info()\n\tinfo.Name = \"Not(\" + info.Name + \")\"\n\treturn &info\n}\n\nfunc (checker *notChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\tresult, error = checker.sub.Check(params, names)\n\tresult = !result\n\treturn\n}\n\n// -----------------------------------------------------------------------\n// IsNil checker.\n\ntype isNilChecker struct {\n\t*CheckerInfo\n}\n\n// The IsNil checker tests whether the obtained value is nil.\n//\n// For example:\n//\n//    c.Assert(err, IsNil)\n//\nvar IsNil Checker = &isNilChecker{\n\t&CheckerInfo{Name: \"IsNil\", Params: []string{\"value\"}},\n}\n\nfunc (checker *isNilChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\treturn isNil(params[0]), \"\"\n}\n\nfunc isNil(obtained interface{}) (result bool) {\n\tif obtained == nil {\n\t\tresult = true\n\t} else {\n\t\tswitch v := reflect.ValueOf(obtained); v.Kind() {\n\t\tcase reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:\n\t\t\treturn v.IsNil()\n\t\t}\n\t}\n\treturn\n}\n\n// -----------------------------------------------------------------------\n// NotNil checker. Alias for Not(IsNil), since it's so common.\n\ntype notNilChecker struct {\n\t*CheckerInfo\n}\n\n// The NotNil checker verifies that the obtained value is not nil.\n//\n// For example:\n//\n//     c.Assert(iface, NotNil)\n//\n// This is an alias for Not(IsNil), made available since it's a\n// fairly common check.\n//\nvar NotNil Checker = &notNilChecker{\n\t&CheckerInfo{Name: \"NotNil\", Params: []string{\"value\"}},\n}\n\nfunc (checker *notNilChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\treturn !isNil(params[0]), \"\"\n}\n\n// -----------------------------------------------------------------------\n// Equals checker.\n\ntype equalsChecker struct {\n\t*CheckerInfo\n}\n\n// The Equals checker verifies that the obtained value is equal to\n// the expected value, according to usual Go semantics for ==.\n//\n// For example:\n//\n//     c.Assert(value, Equals, 42)\n//\nvar Equals Checker = &equalsChecker{\n\t&CheckerInfo{Name: \"Equals\", Params: []string{\"obtained\", \"expected\"}},\n}\n\nfunc (checker *equalsChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\tdefer func() {\n\t\tif v := recover(); v != nil {\n\t\t\tresult = false\n\t\t\terror = fmt.Sprint(v)\n\t\t}\n\t}()\n\treturn params[0] == params[1], \"\"\n}\n\n// -----------------------------------------------------------------------\n// DeepEquals checker.\n\ntype deepEqualsChecker struct {\n\t*CheckerInfo\n}\n\n// The DeepEquals checker verifies that the obtained value is deep-equal to\n// the expected value.  The check will work correctly even when facing\n// slices, interfaces, and values of different types (which always fail\n// the test).\n//\n// For example:\n//\n//     c.Assert(value, DeepEquals, 42)\n//     c.Assert(array, DeepEquals, []string{\"hi\", \"there\"})\n//\nvar DeepEquals Checker = &deepEqualsChecker{\n\t&CheckerInfo{Name: \"DeepEquals\", Params: []string{\"obtained\", \"expected\"}},\n}\n\nfunc (checker *deepEqualsChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\treturn reflect.DeepEqual(params[0], params[1]), \"\"\n}\n\n// -----------------------------------------------------------------------\n// HasLen checker.\n\ntype hasLenChecker struct {\n\t*CheckerInfo\n}\n\n// The HasLen checker verifies that the obtained value has the\n// provided length. In many cases this is superior to using Equals\n// in conjunction with the len function because in case the check\n// fails the value itself will be printed, instead of its length,\n// providing more details for figuring the problem.\n//\n// For example:\n//\n//     c.Assert(list, HasLen, 5)\n//\nvar HasLen Checker = &hasLenChecker{\n\t&CheckerInfo{Name: \"HasLen\", Params: []string{\"obtained\", \"n\"}},\n}\n\nfunc (checker *hasLenChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\tn, ok := params[1].(int)\n\tif !ok {\n\t\treturn false, \"n must be an int\"\n\t}\n\tvalue := reflect.ValueOf(params[0])\n\tswitch value.Kind() {\n\tcase reflect.Map, reflect.Array, reflect.Slice, reflect.Chan, reflect.String:\n\tdefault:\n\t\treturn false, \"obtained value type has no length\"\n\t}\n\treturn value.Len() == n, \"\"\n}\n\n// -----------------------------------------------------------------------\n// ErrorMatches checker.\n\ntype errorMatchesChecker struct {\n\t*CheckerInfo\n}\n\n// The ErrorMatches checker verifies that the error value\n// is non nil and matches the regular expression provided.\n//\n// For example:\n//\n//     c.Assert(err, ErrorMatches, \"perm.*denied\")\n//\nvar ErrorMatches Checker = errorMatchesChecker{\n\t&CheckerInfo{Name: \"ErrorMatches\", Params: []string{\"value\", \"regex\"}},\n}\n\nfunc (checker errorMatchesChecker) Check(params []interface{}, names []string) (result bool, errStr string) {\n\tif params[0] == nil {\n\t\treturn false, \"Error value is nil\"\n\t}\n\terr, ok := params[0].(error)\n\tif !ok {\n\t\treturn false, \"Value is not an error\"\n\t}\n\tparams[0] = err.Error()\n\tnames[0] = \"error\"\n\treturn matches(params[0], params[1])\n}\n\n// -----------------------------------------------------------------------\n// Matches checker.\n\ntype matchesChecker struct {\n\t*CheckerInfo\n}\n\n// The Matches checker verifies that the string provided as the obtained\n// value (or the string resulting from obtained.String()) matches the\n// regular expression provided.\n//\n// For example:\n//\n//     c.Assert(err, Matches, \"perm.*denied\")\n//\nvar Matches Checker = &matchesChecker{\n\t&CheckerInfo{Name: \"Matches\", Params: []string{\"value\", \"regex\"}},\n}\n\nfunc (checker *matchesChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\treturn matches(params[0], params[1])\n}\n\nfunc matches(value, regex interface{}) (result bool, error string) {\n\treStr, ok := regex.(string)\n\tif !ok {\n\t\treturn false, \"Regex must be a string\"\n\t}\n\tvalueStr, valueIsStr := value.(string)\n\tif !valueIsStr {\n\t\tif valueWithStr, valueHasStr := value.(fmt.Stringer); valueHasStr {\n\t\t\tvalueStr, valueIsStr = valueWithStr.String(), true\n\t\t}\n\t}\n\tif valueIsStr {\n\t\tmatches, err := regexp.MatchString(\"^\"+reStr+\"$\", valueStr)\n\t\tif err != nil {\n\t\t\treturn false, \"Can't compile regex: \" + err.Error()\n\t\t}\n\t\treturn matches, \"\"\n\t}\n\treturn false, \"Obtained value is not a string and has no .String()\"\n}\n\n// -----------------------------------------------------------------------\n// Panics checker.\n\ntype panicsChecker struct {\n\t*CheckerInfo\n}\n\n// The Panics checker verifies that calling the provided zero-argument\n// function will cause a panic which is deep-equal to the provided value.\n//\n// For example:\n//\n//     c.Assert(func() { f(1, 2) }, Panics, &SomeErrorType{\"BOOM\"}).\n//\n//\nvar Panics Checker = &panicsChecker{\n\t&CheckerInfo{Name: \"Panics\", Params: []string{\"function\", \"expected\"}},\n}\n\nfunc (checker *panicsChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\tf := reflect.ValueOf(params[0])\n\tif f.Kind() != reflect.Func || f.Type().NumIn() != 0 {\n\t\treturn false, \"Function must take zero arguments\"\n\t}\n\tdefer func() {\n\t\t// If the function has not panicked, then don't do the check.\n\t\tif error != \"\" {\n\t\t\treturn\n\t\t}\n\t\tparams[0] = recover()\n\t\tnames[0] = \"panic\"\n\t\tresult = reflect.DeepEqual(params[0], params[1])\n\t}()\n\tf.Call(nil)\n\treturn false, \"Function has not panicked\"\n}\n\ntype panicMatchesChecker struct {\n\t*CheckerInfo\n}\n\n// The PanicMatches checker verifies that calling the provided zero-argument\n// function will cause a panic with an error value matching\n// the regular expression provided.\n//\n// For example:\n//\n//     c.Assert(func() { f(1, 2) }, PanicMatches, `open.*: no such file or directory`).\n//\n//\nvar PanicMatches Checker = &panicMatchesChecker{\n\t&CheckerInfo{Name: \"PanicMatches\", Params: []string{\"function\", \"expected\"}},\n}\n\nfunc (checker *panicMatchesChecker) Check(params []interface{}, names []string) (result bool, errmsg string) {\n\tf := reflect.ValueOf(params[0])\n\tif f.Kind() != reflect.Func || f.Type().NumIn() != 0 {\n\t\treturn false, \"Function must take zero arguments\"\n\t}\n\tdefer func() {\n\t\t// If the function has not panicked, then don't do the check.\n\t\tif errmsg != \"\" {\n\t\t\treturn\n\t\t}\n\t\tobtained := recover()\n\t\tnames[0] = \"panic\"\n\t\tif e, ok := obtained.(error); ok {\n\t\t\tparams[0] = e.Error()\n\t\t} else if _, ok := obtained.(string); ok {\n\t\t\tparams[0] = obtained\n\t\t} else {\n\t\t\terrmsg = \"Panic value is not a string or an error\"\n\t\t\treturn\n\t\t}\n\t\tresult, errmsg = matches(params[0], params[1])\n\t}()\n\tf.Call(nil)\n\treturn false, \"Function has not panicked\"\n}\n\n// -----------------------------------------------------------------------\n// FitsTypeOf checker.\n\ntype fitsTypeChecker struct {\n\t*CheckerInfo\n}\n\n// The FitsTypeOf checker verifies that the obtained value is\n// assignable to a variable with the same type as the provided\n// sample value.\n//\n// For example:\n//\n//     c.Assert(value, FitsTypeOf, int64(0))\n//     c.Assert(value, FitsTypeOf, os.Error(nil))\n//\nvar FitsTypeOf Checker = &fitsTypeChecker{\n\t&CheckerInfo{Name: \"FitsTypeOf\", Params: []string{\"obtained\", \"sample\"}},\n}\n\nfunc (checker *fitsTypeChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\tobtained := reflect.ValueOf(params[0])\n\tsample := reflect.ValueOf(params[1])\n\tif !obtained.IsValid() {\n\t\treturn false, \"\"\n\t}\n\tif !sample.IsValid() {\n\t\treturn false, \"Invalid sample value\"\n\t}\n\treturn obtained.Type().AssignableTo(sample.Type()), \"\"\n}\n\n// -----------------------------------------------------------------------\n// Implements checker.\n\ntype implementsChecker struct {\n\t*CheckerInfo\n}\n\n// The Implements checker verifies that the obtained value\n// implements the interface specified via a pointer to an interface\n// variable.\n//\n// For example:\n//\n//     var e os.Error\n//     c.Assert(err, Implements, &e)\n//\nvar Implements Checker = &implementsChecker{\n\t&CheckerInfo{Name: \"Implements\", Params: []string{\"obtained\", \"ifaceptr\"}},\n}\n\nfunc (checker *implementsChecker) Check(params []interface{}, names []string) (result bool, error string) {\n\tobtained := reflect.ValueOf(params[0])\n\tifaceptr := reflect.ValueOf(params[1])\n\tif !obtained.IsValid() {\n\t\treturn false, \"\"\n\t}\n\tif !ifaceptr.IsValid() || ifaceptr.Kind() != reflect.Ptr || ifaceptr.Elem().Kind() != reflect.Interface {\n\t\treturn false, \"ifaceptr should be a pointer to an interface variable\"\n\t}\n\treturn obtained.Type().Implements(ifaceptr.Elem().Type()), \"\"\n}\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/helpers.go",
    "content": "package check\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n)\n\n// TestName returns the current test name in the form \"SuiteName.TestName\"\nfunc (c *C) TestName() string {\n\treturn c.testName\n}\n\n// -----------------------------------------------------------------------\n// Basic succeeding/failing logic.\n\n// Failed returns whether the currently running test has already failed.\nfunc (c *C) Failed() bool {\n\treturn c.status() == failedSt\n}\n\n// Fail marks the currently running test as failed.\n//\n// Something ought to have been previously logged so the developer can tell\n// what went wrong. The higher level helper functions will fail the test\n// and do the logging properly.\nfunc (c *C) Fail() {\n\tc.setStatus(failedSt)\n}\n\n// FailNow marks the currently running test as failed and stops running it.\n// Something ought to have been previously logged so the developer can tell\n// what went wrong. The higher level helper functions will fail the test\n// and do the logging properly.\nfunc (c *C) FailNow() {\n\tc.Fail()\n\tc.stopNow()\n}\n\n// Succeed marks the currently running test as succeeded, undoing any\n// previous failures.\nfunc (c *C) Succeed() {\n\tc.setStatus(succeededSt)\n}\n\n// SucceedNow marks the currently running test as succeeded, undoing any\n// previous failures, and stops running the test.\nfunc (c *C) SucceedNow() {\n\tc.Succeed()\n\tc.stopNow()\n}\n\n// ExpectFailure informs that the running test is knowingly broken for\n// the provided reason. If the test does not fail, an error will be reported\n// to raise attention to this fact. This method is useful to temporarily\n// disable tests which cover well known problems until a better time to\n// fix the problem is found, without forgetting about the fact that a\n// failure still exists.\nfunc (c *C) ExpectFailure(reason string) {\n\tif reason == \"\" {\n\t\tpanic(\"Missing reason why the test is expected to fail\")\n\t}\n\tc.mustFail = true\n\tc.reason = reason\n}\n\n// Skip skips the running test for the provided reason. If run from within\n// SetUpTest, the individual test being set up will be skipped, and if run\n// from within SetUpSuite, the whole suite is skipped.\nfunc (c *C) Skip(reason string) {\n\tif reason == \"\" {\n\t\tpanic(\"Missing reason why the test is being skipped\")\n\t}\n\tc.reason = reason\n\tc.setStatus(skippedSt)\n\tc.stopNow()\n}\n\n// -----------------------------------------------------------------------\n// Basic logging.\n\n// GetTestLog returns the current test error output.\nfunc (c *C) GetTestLog() string {\n\treturn c.logb.String()\n}\n\n// Log logs some information into the test error output.\n// The provided arguments are assembled together into a string with fmt.Sprint.\nfunc (c *C) Log(args ...interface{}) {\n\tc.log(args...)\n}\n\n// Log logs some information into the test error output.\n// The provided arguments are assembled together into a string with fmt.Sprintf.\nfunc (c *C) Logf(format string, args ...interface{}) {\n\tc.logf(format, args...)\n}\n\n// Output enables *C to be used as a logger in functions that require only\n// the minimum interface of *log.Logger.\nfunc (c *C) Output(calldepth int, s string) error {\n\td := time.Now().Sub(c.startTime)\n\tmsec := d / time.Millisecond\n\tsec := d / time.Second\n\tmin := d / time.Minute\n\n\tc.Logf(\"[LOG] %d:%02d.%03d %s\", min, sec%60, msec%1000, s)\n\treturn nil\n}\n\n// Error logs an error into the test error output and marks the test as failed.\n// The provided arguments are assembled together into a string with fmt.Sprint.\nfunc (c *C) Error(args ...interface{}) {\n\tc.logCaller(1)\n\tc.logString(fmt.Sprint(\"Error: \", fmt.Sprint(args...)))\n\tc.logNewLine()\n\tc.Fail()\n}\n\n// Errorf logs an error into the test error output and marks the test as failed.\n// The provided arguments are assembled together into a string with fmt.Sprintf.\nfunc (c *C) Errorf(format string, args ...interface{}) {\n\tc.logCaller(1)\n\tc.logString(fmt.Sprintf(\"Error: \"+format, args...))\n\tc.logNewLine()\n\tc.Fail()\n}\n\n// Fatal logs an error into the test error output, marks the test as failed, and\n// stops the test execution. The provided arguments are assembled together into\n// a string with fmt.Sprint.\nfunc (c *C) Fatal(args ...interface{}) {\n\tc.logCaller(1)\n\tc.logString(fmt.Sprint(\"Error: \", fmt.Sprint(args...)))\n\tc.logNewLine()\n\tc.FailNow()\n}\n\n// Fatlaf logs an error into the test error output, marks the test as failed, and\n// stops the test execution. The provided arguments are assembled together into\n// a string with fmt.Sprintf.\nfunc (c *C) Fatalf(format string, args ...interface{}) {\n\tc.logCaller(1)\n\tc.logString(fmt.Sprint(\"Error: \", fmt.Sprintf(format, args...)))\n\tc.logNewLine()\n\tc.FailNow()\n}\n\n// -----------------------------------------------------------------------\n// Generic checks and assertions based on checkers.\n\n// Check verifies if the first value matches the expected value according\n// to the provided checker. If they do not match, an error is logged, the\n// test is marked as failed, and the test execution continues.\n//\n// Some checkers may not need the expected argument (e.g. IsNil).\n//\n// Extra arguments provided to the function are logged next to the reported\n// problem when the matching fails.\nfunc (c *C) Check(obtained interface{}, checker Checker, args ...interface{}) bool {\n\treturn c.internalCheck(\"Check\", obtained, checker, args...)\n}\n\n// Assert ensures that the first value matches the expected value according\n// to the provided checker. If they do not match, an error is logged, the\n// test is marked as failed, and the test execution stops.\n//\n// Some checkers may not need the expected argument (e.g. IsNil).\n//\n// Extra arguments provided to the function are logged next to the reported\n// problem when the matching fails.\nfunc (c *C) Assert(obtained interface{}, checker Checker, args ...interface{}) {\n\tif !c.internalCheck(\"Assert\", obtained, checker, args...) {\n\t\tc.stopNow()\n\t}\n}\n\nfunc (c *C) internalCheck(funcName string, obtained interface{}, checker Checker, args ...interface{}) bool {\n\tif checker == nil {\n\t\tc.logCaller(2)\n\t\tc.logString(fmt.Sprintf(\"%s(obtained, nil!?, ...):\", funcName))\n\t\tc.logString(\"Oops.. you've provided a nil checker!\")\n\t\tc.logNewLine()\n\t\tc.Fail()\n\t\treturn false\n\t}\n\n\t// If the last argument is a bug info, extract it out.\n\tvar comment CommentInterface\n\tif len(args) > 0 {\n\t\tif c, ok := args[len(args)-1].(CommentInterface); ok {\n\t\t\tcomment = c\n\t\t\targs = args[:len(args)-1]\n\t\t}\n\t}\n\n\tparams := append([]interface{}{obtained}, args...)\n\tinfo := checker.Info()\n\n\tif len(params) != len(info.Params) {\n\t\tnames := append([]string{info.Params[0], info.Name}, info.Params[1:]...)\n\t\tc.logCaller(2)\n\t\tc.logString(fmt.Sprintf(\"%s(%s):\", funcName, strings.Join(names, \", \")))\n\t\tc.logString(fmt.Sprintf(\"Wrong number of parameters for %s: want %d, got %d\", info.Name, len(names), len(params)+1))\n\t\tc.logNewLine()\n\t\tc.Fail()\n\t\treturn false\n\t}\n\n\t// Copy since it may be mutated by Check.\n\tnames := append([]string{}, info.Params...)\n\n\t// Do the actual check.\n\tresult, error := checker.Check(params, names)\n\tif !result || error != \"\" {\n\t\tc.logCaller(2)\n\t\tfor i := 0; i != len(params); i++ {\n\t\t\tc.logValue(names[i], params[i])\n\t\t}\n\t\tif comment != nil {\n\t\t\tc.logString(comment.CheckCommentString())\n\t\t}\n\t\tif error != \"\" {\n\t\t\tc.logString(error)\n\t\t}\n\t\tc.logNewLine()\n\t\tc.Fail()\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/printer.go",
    "content": "package check\n\nimport (\n\t\"bytes\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/printer\"\n\t\"go/token\"\n\t\"os\"\n)\n\nfunc indent(s, with string) (r string) {\n\teol := true\n\tfor i := 0; i != len(s); i++ {\n\t\tc := s[i]\n\t\tswitch {\n\t\tcase eol && c == '\\n' || c == '\\r':\n\t\tcase c == '\\n' || c == '\\r':\n\t\t\teol = true\n\t\tcase eol:\n\t\t\teol = false\n\t\t\ts = s[:i] + with + s[i:]\n\t\t\ti += len(with)\n\t\t}\n\t}\n\treturn s\n}\n\nfunc printLine(filename string, line int) (string, error) {\n\tfset := token.NewFileSet()\n\tfile, err := os.Open(filename)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tfnode, err := parser.ParseFile(fset, filename, file, parser.ParseComments)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tconfig := &printer.Config{Mode: printer.UseSpaces, Tabwidth: 4}\n\tlp := &linePrinter{fset: fset, fnode: fnode, line: line, config: config}\n\tast.Walk(lp, fnode)\n\tresult := lp.output.Bytes()\n\t// Comments leave \\n at the end.\n\tn := len(result)\n\tfor n > 0 && result[n-1] == '\\n' {\n\t\tn--\n\t}\n\treturn string(result[:n]), nil\n}\n\ntype linePrinter struct {\n\tconfig *printer.Config\n\tfset   *token.FileSet\n\tfnode  *ast.File\n\tline   int\n\toutput bytes.Buffer\n\tstmt   ast.Stmt\n}\n\nfunc (lp *linePrinter) emit() bool {\n\tif lp.stmt != nil {\n\t\tlp.trim(lp.stmt)\n\t\tlp.printWithComments(lp.stmt)\n\t\tlp.stmt = nil\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (lp *linePrinter) printWithComments(n ast.Node) {\n\tnfirst := lp.fset.Position(n.Pos()).Line\n\tnlast := lp.fset.Position(n.End()).Line\n\tfor _, g := range lp.fnode.Comments {\n\t\tcfirst := lp.fset.Position(g.Pos()).Line\n\t\tclast := lp.fset.Position(g.End()).Line\n\t\tif clast == nfirst-1 && lp.fset.Position(n.Pos()).Column == lp.fset.Position(g.Pos()).Column {\n\t\t\tfor _, c := range g.List {\n\t\t\t\tlp.output.WriteString(c.Text)\n\t\t\t\tlp.output.WriteByte('\\n')\n\t\t\t}\n\t\t}\n\t\tif cfirst >= nfirst && cfirst <= nlast && n.End() <= g.List[0].Slash {\n\t\t\t// The printer will not include the comment if it starts past\n\t\t\t// the node itself. Trick it into printing by overlapping the\n\t\t\t// slash with the end of the statement.\n\t\t\tg.List[0].Slash = n.End() - 1\n\t\t}\n\t}\n\tnode := &printer.CommentedNode{n, lp.fnode.Comments}\n\tlp.config.Fprint(&lp.output, lp.fset, node)\n}\n\nfunc (lp *linePrinter) Visit(n ast.Node) (w ast.Visitor) {\n\tif n == nil {\n\t\tif lp.output.Len() == 0 {\n\t\t\tlp.emit()\n\t\t}\n\t\treturn nil\n\t}\n\tfirst := lp.fset.Position(n.Pos()).Line\n\tlast := lp.fset.Position(n.End()).Line\n\tif first <= lp.line && last >= lp.line {\n\t\t// Print the innermost statement containing the line.\n\t\tif stmt, ok := n.(ast.Stmt); ok {\n\t\t\tif _, ok := n.(*ast.BlockStmt); !ok {\n\t\t\t\tlp.stmt = stmt\n\t\t\t}\n\t\t}\n\t\tif first == lp.line && lp.emit() {\n\t\t\treturn nil\n\t\t}\n\t\treturn lp\n\t}\n\treturn nil\n}\n\nfunc (lp *linePrinter) trim(n ast.Node) bool {\n\tstmt, ok := n.(ast.Stmt)\n\tif !ok {\n\t\treturn true\n\t}\n\tline := lp.fset.Position(n.Pos()).Line\n\tif line != lp.line {\n\t\treturn false\n\t}\n\tswitch stmt := stmt.(type) {\n\tcase *ast.IfStmt:\n\t\tstmt.Body = lp.trimBlock(stmt.Body)\n\tcase *ast.SwitchStmt:\n\t\tstmt.Body = lp.trimBlock(stmt.Body)\n\tcase *ast.TypeSwitchStmt:\n\t\tstmt.Body = lp.trimBlock(stmt.Body)\n\tcase *ast.CaseClause:\n\t\tstmt.Body = lp.trimList(stmt.Body)\n\tcase *ast.CommClause:\n\t\tstmt.Body = lp.trimList(stmt.Body)\n\tcase *ast.BlockStmt:\n\t\tstmt.List = lp.trimList(stmt.List)\n\t}\n\treturn true\n}\n\nfunc (lp *linePrinter) trimBlock(stmt *ast.BlockStmt) *ast.BlockStmt {\n\tif !lp.trim(stmt) {\n\t\treturn lp.emptyBlock(stmt)\n\t}\n\tstmt.Rbrace = stmt.Lbrace\n\treturn stmt\n}\n\nfunc (lp *linePrinter) trimList(stmts []ast.Stmt) []ast.Stmt {\n\tfor i := 0; i != len(stmts); i++ {\n\t\tif !lp.trim(stmts[i]) {\n\t\t\tstmts[i] = lp.emptyStmt(stmts[i])\n\t\t\tbreak\n\t\t}\n\t}\n\treturn stmts\n}\n\nfunc (lp *linePrinter) emptyStmt(n ast.Node) *ast.ExprStmt {\n\treturn &ast.ExprStmt{&ast.Ellipsis{n.Pos(), nil}}\n}\n\nfunc (lp *linePrinter) emptyBlock(n ast.Node) *ast.BlockStmt {\n\tp := n.Pos()\n\treturn &ast.BlockStmt{p, []ast.Stmt{lp.emptyStmt(n)}, p}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/reporter.go",
    "content": "package check\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"sync\"\n)\n\n// -----------------------------------------------------------------------\n// Output writer manages atomic output writing according to settings.\n\ntype outputWriter struct {\n\tm                    sync.Mutex\n\twriter               io.Writer\n\twroteCallProblemLast bool\n\tStream               bool\n\tVerbose              bool\n}\n\nfunc newOutputWriter(writer io.Writer, stream, verbose bool) *outputWriter {\n\treturn &outputWriter{writer: writer, Stream: stream, Verbose: verbose}\n}\n\nfunc (ow *outputWriter) Write(content []byte) (n int, err error) {\n\tow.m.Lock()\n\tn, err = ow.writer.Write(content)\n\tow.m.Unlock()\n\treturn\n}\n\nfunc (ow *outputWriter) WriteCallStarted(label string, c *C) {\n\tif ow.Stream {\n\t\theader := renderCallHeader(label, c, \"\", \"\\n\")\n\t\tow.m.Lock()\n\t\tow.writer.Write([]byte(header))\n\t\tow.m.Unlock()\n\t}\n}\n\nfunc (ow *outputWriter) WriteCallProblem(label string, c *C) {\n\tvar prefix string\n\tif !ow.Stream {\n\t\tprefix = \"\\n-----------------------------------\" +\n\t\t\t\"-----------------------------------\\n\"\n\t}\n\theader := renderCallHeader(label, c, prefix, \"\\n\\n\")\n\tow.m.Lock()\n\tow.wroteCallProblemLast = true\n\tow.writer.Write([]byte(header))\n\tif !ow.Stream {\n\t\tc.logb.WriteTo(ow.writer)\n\t}\n\tow.m.Unlock()\n}\n\nfunc (ow *outputWriter) WriteCallSuccess(label string, c *C) {\n\tif ow.Stream || (ow.Verbose && c.kind == testKd) {\n\t\t// TODO Use a buffer here.\n\t\tvar suffix string\n\t\tif c.reason != \"\" {\n\t\t\tsuffix = \" (\" + c.reason + \")\"\n\t\t}\n\t\tif c.status() == succeededSt {\n\t\t\tsuffix += \"\\t\" + c.timerString()\n\t\t}\n\t\tsuffix += \"\\n\"\n\t\tif ow.Stream {\n\t\t\tsuffix += \"\\n\"\n\t\t}\n\t\theader := renderCallHeader(label, c, \"\", suffix)\n\t\tow.m.Lock()\n\t\t// Resist temptation of using line as prefix above due to race.\n\t\tif !ow.Stream && ow.wroteCallProblemLast {\n\t\t\theader = \"\\n-----------------------------------\" +\n\t\t\t\t\"-----------------------------------\\n\" +\n\t\t\t\theader\n\t\t}\n\t\tow.wroteCallProblemLast = false\n\t\tow.writer.Write([]byte(header))\n\t\tow.m.Unlock()\n\t}\n}\n\nfunc renderCallHeader(label string, c *C, prefix, suffix string) string {\n\tpc := c.method.PC()\n\treturn fmt.Sprintf(\"%s%s: %s: %s%s\", prefix, label, niceFuncPath(pc),\n\t\tniceFuncName(pc), suffix)\n}\n"
  },
  {
    "path": "vendor/gopkg.in/check.v1/run.go",
    "content": "package check\n\nimport (\n\t\"bufio\"\n\t\"flag\"\n\t\"fmt\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n)\n\n// -----------------------------------------------------------------------\n// Test suite registry.\n\nvar allSuites []interface{}\n\n// Suite registers the given value as a test suite to be run. Any methods\n// starting with the Test prefix in the given value will be considered as\n// a test method.\nfunc Suite(suite interface{}) interface{} {\n\tallSuites = append(allSuites, suite)\n\treturn suite\n}\n\n// -----------------------------------------------------------------------\n// Public running interface.\n\nvar (\n\toldFilterFlag  = flag.String(\"gocheck.f\", \"\", \"Regular expression selecting which tests and/or suites to run\")\n\toldVerboseFlag = flag.Bool(\"gocheck.v\", false, \"Verbose mode\")\n\toldStreamFlag  = flag.Bool(\"gocheck.vv\", false, \"Super verbose mode (disables output caching)\")\n\toldBenchFlag   = flag.Bool(\"gocheck.b\", false, \"Run benchmarks\")\n\toldBenchTime   = flag.Duration(\"gocheck.btime\", 1*time.Second, \"approximate run time for each benchmark\")\n\toldListFlag    = flag.Bool(\"gocheck.list\", false, \"List the names of all tests that will be run\")\n\toldWorkFlag    = flag.Bool(\"gocheck.work\", false, \"Display and do not remove the test working directory\")\n\n\tnewFilterFlag  = flag.String(\"check.f\", \"\", \"Regular expression selecting which tests and/or suites to run\")\n\tnewVerboseFlag = flag.Bool(\"check.v\", false, \"Verbose mode\")\n\tnewStreamFlag  = flag.Bool(\"check.vv\", false, \"Super verbose mode (disables output caching)\")\n\tnewBenchFlag   = flag.Bool(\"check.b\", false, \"Run benchmarks\")\n\tnewBenchTime   = flag.Duration(\"check.btime\", 1*time.Second, \"approximate run time for each benchmark\")\n\tnewBenchMem    = flag.Bool(\"check.bmem\", false, \"Report memory benchmarks\")\n\tnewListFlag    = flag.Bool(\"check.list\", false, \"List the names of all tests that will be run\")\n\tnewWorkFlag    = flag.Bool(\"check.work\", false, \"Display and do not remove the test working directory\")\n)\n\n// TestingT runs all test suites registered with the Suite function,\n// printing results to stdout, and reporting any failures back to\n// the \"testing\" package.\nfunc TestingT(testingT *testing.T) {\n\tbenchTime := *newBenchTime\n\tif benchTime == 1*time.Second {\n\t\tbenchTime = *oldBenchTime\n\t}\n\tconf := &RunConf{\n\t\tFilter:        *oldFilterFlag + *newFilterFlag,\n\t\tVerbose:       *oldVerboseFlag || *newVerboseFlag,\n\t\tStream:        *oldStreamFlag || *newStreamFlag,\n\t\tBenchmark:     *oldBenchFlag || *newBenchFlag,\n\t\tBenchmarkTime: benchTime,\n\t\tBenchmarkMem:  *newBenchMem,\n\t\tKeepWorkDir:   *oldWorkFlag || *newWorkFlag,\n\t}\n\tif *oldListFlag || *newListFlag {\n\t\tw := bufio.NewWriter(os.Stdout)\n\t\tfor _, name := range ListAll(conf) {\n\t\t\tfmt.Fprintln(w, name)\n\t\t}\n\t\tw.Flush()\n\t\treturn\n\t}\n\tresult := RunAll(conf)\n\tprintln(result.String())\n\tif !result.Passed() {\n\t\ttestingT.Fail()\n\t}\n}\n\n// RunAll runs all test suites registered with the Suite function, using the\n// provided run configuration.\nfunc RunAll(runConf *RunConf) *Result {\n\tresult := Result{}\n\tfor _, suite := range allSuites {\n\t\tresult.Add(Run(suite, runConf))\n\t}\n\treturn &result\n}\n\n// Run runs the provided test suite using the provided run configuration.\nfunc Run(suite interface{}, runConf *RunConf) *Result {\n\trunner := newSuiteRunner(suite, runConf)\n\treturn runner.run()\n}\n\n// ListAll returns the names of all the test functions registered with the\n// Suite function that will be run with the provided run configuration.\nfunc ListAll(runConf *RunConf) []string {\n\tvar names []string\n\tfor _, suite := range allSuites {\n\t\tnames = append(names, List(suite, runConf)...)\n\t}\n\treturn names\n}\n\n// List returns the names of the test functions in the given\n// suite that will be run with the provided run configuration.\nfunc List(suite interface{}, runConf *RunConf) []string {\n\tvar names []string\n\trunner := newSuiteRunner(suite, runConf)\n\tfor _, t := range runner.tests {\n\t\tnames = append(names, t.String())\n\t}\n\treturn names\n}\n\n// -----------------------------------------------------------------------\n// Result methods.\n\nfunc (r *Result) Add(other *Result) {\n\tr.Succeeded += other.Succeeded\n\tr.Skipped += other.Skipped\n\tr.Failed += other.Failed\n\tr.Panicked += other.Panicked\n\tr.FixturePanicked += other.FixturePanicked\n\tr.ExpectedFailures += other.ExpectedFailures\n\tr.Missed += other.Missed\n\tif r.WorkDir != \"\" && other.WorkDir != \"\" {\n\t\tr.WorkDir += \":\" + other.WorkDir\n\t} else if other.WorkDir != \"\" {\n\t\tr.WorkDir = other.WorkDir\n\t}\n}\n\nfunc (r *Result) Passed() bool {\n\treturn (r.Failed == 0 && r.Panicked == 0 &&\n\t\tr.FixturePanicked == 0 && r.Missed == 0 &&\n\t\tr.RunError == nil)\n}\n\nfunc (r *Result) String() string {\n\tif r.RunError != nil {\n\t\treturn \"ERROR: \" + r.RunError.Error()\n\t}\n\n\tvar value string\n\tif r.Failed == 0 && r.Panicked == 0 && r.FixturePanicked == 0 &&\n\t\tr.Missed == 0 {\n\t\tvalue = \"OK: \"\n\t} else {\n\t\tvalue = \"OOPS: \"\n\t}\n\tvalue += fmt.Sprintf(\"%d passed\", r.Succeeded)\n\tif r.Skipped != 0 {\n\t\tvalue += fmt.Sprintf(\", %d skipped\", r.Skipped)\n\t}\n\tif r.ExpectedFailures != 0 {\n\t\tvalue += fmt.Sprintf(\", %d expected failures\", r.ExpectedFailures)\n\t}\n\tif r.Failed != 0 {\n\t\tvalue += fmt.Sprintf(\", %d FAILED\", r.Failed)\n\t}\n\tif r.Panicked != 0 {\n\t\tvalue += fmt.Sprintf(\", %d PANICKED\", r.Panicked)\n\t}\n\tif r.FixturePanicked != 0 {\n\t\tvalue += fmt.Sprintf(\", %d FIXTURE-PANICKED\", r.FixturePanicked)\n\t}\n\tif r.Missed != 0 {\n\t\tvalue += fmt.Sprintf(\", %d MISSED\", r.Missed)\n\t}\n\tif r.WorkDir != \"\" {\n\t\tvalue += \"\\nWORK=\" + r.WorkDir\n\t}\n\treturn value\n}\n"
  },
  {
    "path": "vendor/gopkg.in/karalabe/cookiejar.v2/LICENSE",
    "content": "Copyright (c) 2014 Péter Szilágyi. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice,\n      this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimer in the documentation\n      and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nAlternatively, the CookieJar toolbox may be used in accordance with the terms\nand conditions contained in a signed written agreement between you and the\nauthor(s).\n"
  },
  {
    "path": "vendor/gopkg.in/karalabe/cookiejar.v2/README.md",
    "content": "  CookieJar - A contestant's toolbox\n======================================\n\nCookieJar is a small collection of common algorithms, data structures and library extensions that were deemed handy for computing competitions at one point or another.\n\nThis toolbox is a work in progress for the time being. It may be lacking, and it may change drastically between commits (although every effort is made not to). You're welcome to use it, but it's your head on the line :)\n\n  Installation\n----------------\n\nTo get the package, execute:\n\n    go get gopkg.in/karalabe/cookiejar.v2\n\nTo import this package, add the following line to your code:\n\n    import \"gopkg.in/karalabe/cookiejar.v2\"\n\nFor more details, see the [package documentation](http://godoc.org/gopkg.in/karalabe/cookiejar.v2).\n\n  Contents\n------------\n\nAlgorithms:\n - Graph\n     - [Breadth First Search](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/graph/bfs)\n     - [Depth First Search](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/graph/dfs)\n\nData structures:\n - [Bag](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/bag)\n - [Deque](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/deque)\n - [Graph](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/graph)\n - [Priority Queue](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/prque)\n - [Queue](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/queue)\n - [Set](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/set)\n - [Stack](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/collections/stack)\n \nExtensions:\n - [fmt](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/fmtext)\n     - `Scan` and `Fscan` for `int`, `float64`, `string` and lines\n - [math](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/mathext)\n     - `Abs` for `int`\n     - `Min` and `Max` for `int`, `big.Int` and `big.Rat`\n     - `Sign` for `int` and `float64`\n - [os](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/osext)\n     - `Open` and `Create` without error codes\n - [sort](http://godoc.org/gopkg.in/karalabe/cookiejar.v2/exts/sortext)\n     - `Sort` and `Search` for `big.Int` and `big.Rat`\n     - `Unique` for any `sort.Interface`\n\nBelow are the performance results for the data structures and the complexity analysis for the algorithms.\n\n  Performance\n---------------\n\nIntel(R) Core(TM) i7-2600 CPU @ 3.40GHz:\n```\n- bag\n    - BenchmarkInsert    309     ns/op\n    - BenchmarkRemove    197     ns/op\n    - BenchmarkDo        28.1    ns/op\n- deque\n    - BenchmarkPush      25.4    ns/op\n    - BenchmarkPop       6.72    ns/op\n- prque\n    - BenchmarkPush      171     ns/op\n    - BenchmarkPop       947     ns/op\n- queue\n    - BenchmarkPush      23.0    ns/op\n    - BenchmarkPop       5.92    ns/op\n- set\n    - BenchmarkInsert    259     ns/op\n    - BenchmarkRemove    115     ns/op\n    - BenchmarkDo        20.9    ns/op\n- stack\n    - BenchmarkPush      16.4    ns/op\n    - BenchmarkPop       6.45    ns/op\n```\n\n  Complexity\n--------------\n\n| Algorithm | Time complexity | Space complexity |\n|:---------:|:---------------:|:----------------:|\n| graph/bfs | O(E)            | O(V)             |\n| graph/dfs | O(E)            | O(E)             |\n\n  Here be dragons :)\n----------------------\n\n```\n     .     _///_,\n   .      / ` ' '>\n     )   o'  __/_'>\n    (   /  _/  )_\\'>\n     ' \"__/   /_/\\_>\n         ____/_/_/_/\n        /,---, _/ /\n       \"\"  /_/_/_/\n          /_(_(_(_                 \\\n         (   \\_\\_\\\\_               )\\\n          \\'__\\_\\_\\_\\__            ).\\\n          //____|___\\__)           )_/\n          |  _  \\'___'_(           /'\n           \\_ (-'\\'___'_\\      __,'_'\n           __) \\  \\\\___(_   __/.__,'\n        ,((,-,__\\  '\", __\\_/. __,'\n                     '\"./_._._-'\n```\n"
  },
  {
    "path": "vendor/gopkg.in/karalabe/cookiejar.v2/collections/prque/prque.go",
    "content": "// CookieJar - A contestant's algorithm toolbox\n// Copyright (c) 2013 Peter Szilagyi. All rights reserved.\n//\n// CookieJar is dual licensed: use of this source code is governed by a BSD\n// license that can be found in the LICENSE file. Alternatively, the CookieJar\n// toolbox may be used in accordance with the terms and conditions contained\n// in a signed written agreement between you and the author(s).\n\n// Package prque implements a priority queue data structure supporting arbitrary\n// value types and float priorities.\n//\n// The reasoning behind using floats for the priorities vs. ints or interfaces\n// was larger flexibility without sacrificing too much performance or code\n// complexity.\n//\n// If you would like to use a min-priority queue, simply negate the priorities.\n//\n// Internally the queue is based on the standard heap package working on a\n// sortable version of the block based stack.\npackage prque\n\nimport (\n\t\"container/heap\"\n)\n\n// Priority queue data structure.\ntype Prque struct {\n\tcont *sstack\n}\n\n// Creates a new priority queue.\nfunc New() *Prque {\n\treturn &Prque{newSstack()}\n}\n\n// Pushes a value with a given priority into the queue, expanding if necessary.\nfunc (p *Prque) Push(data interface{}, priority float32) {\n\theap.Push(p.cont, &item{data, priority})\n}\n\n// Pops the value with the greates priority off the stack and returns it.\n// Currently no shrinking is done.\nfunc (p *Prque) Pop() (interface{}, float32) {\n\titem := heap.Pop(p.cont).(*item)\n\treturn item.value, item.priority\n}\n\n// Pops only the item from the queue, dropping the associated priority value.\nfunc (p *Prque) PopItem() interface{} {\n\treturn heap.Pop(p.cont).(*item).value\n}\n\n// Checks whether the priority queue is empty.\nfunc (p *Prque) Empty() bool {\n\treturn p.cont.Len() == 0\n}\n\n// Returns the number of element in the priority queue.\nfunc (p *Prque) Size() int {\n\treturn p.cont.Len()\n}\n\n// Clears the contents of the priority queue.\nfunc (p *Prque) Reset() {\n\t*p = *New()\n}\n"
  },
  {
    "path": "vendor/gopkg.in/karalabe/cookiejar.v2/collections/prque/sstack.go",
    "content": "// CookieJar - A contestant's algorithm toolbox\n// Copyright (c) 2013 Peter Szilagyi. All rights reserved.\n//\n// CookieJar is dual licensed: use of this source code is governed by a BSD\n// license that can be found in the LICENSE file. Alternatively, the CookieJar\n// toolbox may be used in accordance with the terms and conditions contained\n// in a signed written agreement between you and the author(s).\n\npackage prque\n\n// The size of a block of data\nconst blockSize = 4096\n\n// A prioritized item in the sorted stack.\ntype item struct {\n\tvalue    interface{}\n\tpriority float32\n}\n\n// Internal sortable stack data structure. Implements the Push and Pop ops for\n// the stack (heap) functionality and the Len, Less and Swap methods for the\n// sortability requirements of the heaps.\ntype sstack struct {\n\tsize     int\n\tcapacity int\n\toffset   int\n\n\tblocks [][]*item\n\tactive []*item\n}\n\n// Creates a new, empty stack.\nfunc newSstack() *sstack {\n\tresult := new(sstack)\n\tresult.active = make([]*item, blockSize)\n\tresult.blocks = [][]*item{result.active}\n\tresult.capacity = blockSize\n\treturn result\n}\n\n// Pushes a value onto the stack, expanding it if necessary. Required by\n// heap.Interface.\nfunc (s *sstack) Push(data interface{}) {\n\tif s.size == s.capacity {\n\t\ts.active = make([]*item, blockSize)\n\t\ts.blocks = append(s.blocks, s.active)\n\t\ts.capacity += blockSize\n\t\ts.offset = 0\n\t} else if s.offset == blockSize {\n\t\ts.active = s.blocks[s.size/blockSize]\n\t\ts.offset = 0\n\t}\n\ts.active[s.offset] = data.(*item)\n\ts.offset++\n\ts.size++\n}\n\n// Pops a value off the stack and returns it. Currently no shrinking is done.\n// Required by heap.Interface.\nfunc (s *sstack) Pop() (res interface{}) {\n\ts.size--\n\ts.offset--\n\tif s.offset < 0 {\n\t\ts.offset = blockSize - 1\n\t\ts.active = s.blocks[s.size/blockSize]\n\t}\n\tres, s.active[s.offset] = s.active[s.offset], nil\n\treturn\n}\n\n// Returns the length of the stack. Required by sort.Interface.\nfunc (s *sstack) Len() int {\n\treturn s.size\n}\n\n// Compares the priority of two elements of the stack (higher is first).\n// Required by sort.Interface.\nfunc (s *sstack) Less(i, j int) bool {\n\treturn s.blocks[i/blockSize][i%blockSize].priority > s.blocks[j/blockSize][j%blockSize].priority\n}\n\n// Swaps two elements in the stack. Required by sort.Interface.\nfunc (s *sstack) Swap(i, j int) {\n\tib, io, jb, jo := i/blockSize, i%blockSize, j/blockSize, j%blockSize\n\ts.blocks[ib][io], s.blocks[jb][jo] = s.blocks[jb][jo], s.blocks[ib][io]\n}\n\n// Resets the stack, effectively clearing its contents.\nfunc (s *sstack) Reset() {\n\t*s = *newSstack()\n}\n"
  },
  {
    "path": "vendor/gopkg.in/natefinch/npipe.v2/LICENSE.txt",
    "content": "The MIT License (MIT)\nCopyright (c) 2013 npipe authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "vendor/gopkg.in/natefinch/npipe.v2/README.md",
    "content": "npipe  [![Build status](https://ci.appveyor.com/api/projects/status/00vuepirsot29qwi)](https://ci.appveyor.com/project/natefinch/npipe) [![GoDoc](https://godoc.org/gopkg.in/natefinch/npipe.v2?status.svg)](https://godoc.org/gopkg.in/natefinch/npipe.v2)\n=====\nPackage npipe provides a pure Go wrapper around Windows named pipes.\n\nWindows named pipe documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780\n\nNote that the code lives at https://github.com/natefinch/npipe (v2 branch)\nbut should be imported as gopkg.in/natefinch/npipe.v2 (the package name is\nstill npipe).\n\nnpipe provides an interface based on stdlib's net package, with Dial, Listen,\nand Accept functions, as well as associated implementations of net.Conn and\nnet.Listener.  It supports rpc over the connection.\n\n### Notes\n* Deadlines for reading/writing to the connection are only functional in Windows Vista/Server 2008 and above, due to limitations with the Windows API.\n\n* The pipes support byte mode only (no support for message mode)\n\n### Examples\nThe Dial function connects a client to a named pipe:\n\n\n\tconn, err := npipe.Dial(`\\\\.\\pipe\\mypipename`)\n\tif err != nil {\n\t\t<handle error>\n\t}\n\tfmt.Fprintf(conn, \"Hi server!\\n\")\n\tmsg, err := bufio.NewReader(conn).ReadString('\\n')\n\t...\n\nThe Listen function creates servers:\n\n\n\tln, err := npipe.Listen(`\\\\.\\pipe\\mypipename`)\n\tif err != nil {\n\t\t// handle error\n\t}\n\tfor {\n\t\tconn, err := ln.Accept()\n\t\tif err != nil {\n\t\t\t// handle error\n\t\t\tcontinue\n\t\t}\n\t\tgo handleConnection(conn)\n\t}\n\n\n\n\n\n## Variables\n``` go\nvar ErrClosed = PipeError{\"Pipe has been closed.\", false}\n```\nErrClosed is the error returned by PipeListener.Accept when Close is called\non the PipeListener.\n\n\n\n## type PipeAddr\n``` go\ntype PipeAddr string\n```\nPipeAddr represents the address of a named pipe.\n\n\n\n\n\n\n\n\n\n\n\n### func (PipeAddr) Network\n``` go\nfunc (a PipeAddr) Network() string\n```\nNetwork returns the address's network name, \"pipe\".\n\n\n\n### func (PipeAddr) String\n``` go\nfunc (a PipeAddr) String() string\n```\nString returns the address of the pipe\n\n\n\n## type PipeConn\n``` go\ntype PipeConn struct {\n    // contains filtered or unexported fields\n}\n```\nPipeConn is the implementation of the net.Conn interface for named pipe connections.\n\n\n\n\n\n\n\n\n\n### func Dial\n``` go\nfunc Dial(address string) (*PipeConn, error)\n```\nDial connects to a named pipe with the given address. If the specified pipe is not available,\nit will wait indefinitely for the pipe to become available.\n\nThe address must be of the form \\\\.\\\\pipe\\<name> for local pipes and \\\\<computer>\\pipe\\<name>\nfor remote pipes.\n\nDial will return a PipeError if you pass in a badly formatted pipe name.\n\nExamples:\n\n\n\t// local pipe\n\tconn, err := Dial(`\\\\.\\pipe\\mypipename`)\n\t\n\t// remote pipe\n\tconn, err := Dial(`\\\\othercomp\\pipe\\mypipename`)\n\n\n### func DialTimeout\n``` go\nfunc DialTimeout(address string, timeout time.Duration) (*PipeConn, error)\n```\nDialTimeout acts like Dial, but will time out after the duration of timeout\n\n\n\n\n### func (\\*PipeConn) Close\n``` go\nfunc (c *PipeConn) Close() error\n```\nClose closes the connection.\n\n\n\n### func (\\*PipeConn) LocalAddr\n``` go\nfunc (c *PipeConn) LocalAddr() net.Addr\n```\nLocalAddr returns the local network address.\n\n\n\n### func (\\*PipeConn) Read\n``` go\nfunc (c *PipeConn) Read(b []byte) (int, error)\n```\nRead implements the net.Conn Read method.\n\n\n\n### func (\\*PipeConn) RemoteAddr\n``` go\nfunc (c *PipeConn) RemoteAddr() net.Addr\n```\nRemoteAddr returns the remote network address.\n\n\n\n### func (\\*PipeConn) SetDeadline\n``` go\nfunc (c *PipeConn) SetDeadline(t time.Time) error\n```\nSetDeadline implements the net.Conn SetDeadline method.\nNote that timeouts are only supported on Windows Vista/Server 2008 and above\n\n\n\n### func (\\*PipeConn) SetReadDeadline\n``` go\nfunc (c *PipeConn) SetReadDeadline(t time.Time) error\n```\nSetReadDeadline implements the net.Conn SetReadDeadline method.\nNote that timeouts are only supported on Windows Vista/Server 2008 and above\n\n\n\n### func (\\*PipeConn) SetWriteDeadline\n``` go\nfunc (c *PipeConn) SetWriteDeadline(t time.Time) error\n```\nSetWriteDeadline implements the net.Conn SetWriteDeadline method.\nNote that timeouts are only supported on Windows Vista/Server 2008 and above\n\n\n\n### func (\\*PipeConn) Write\n``` go\nfunc (c *PipeConn) Write(b []byte) (int, error)\n```\nWrite implements the net.Conn Write method.\n\n\n\n## type PipeError\n``` go\ntype PipeError struct {\n    // contains filtered or unexported fields\n}\n```\nPipeError is an error related to a call to a pipe\n\n\n\n\n\n\n\n\n\n\n\n### func (PipeError) Error\n``` go\nfunc (e PipeError) Error() string\n```\nError implements the error interface\n\n\n\n### func (PipeError) Temporary\n``` go\nfunc (e PipeError) Temporary() bool\n```\nTemporary implements net.AddrError.Temporary()\n\n\n\n### func (PipeError) Timeout\n``` go\nfunc (e PipeError) Timeout() bool\n```\nTimeout implements net.AddrError.Timeout()\n\n\n\n## type PipeListener\n``` go\ntype PipeListener struct {\n    // contains filtered or unexported fields\n}\n```\nPipeListener is a named pipe listener. Clients should typically\nuse variables of type net.Listener instead of assuming named pipe.\n\n\n\n\n\n\n\n\n\n### func Listen\n``` go\nfunc Listen(address string) (*PipeListener, error)\n```\nListen returns a new PipeListener that will listen on a pipe with the given\naddress. The address must be of the form \\\\.\\pipe\\<name>\n\nListen will return a PipeError for an incorrectly formatted pipe name.\n\n\n\n\n### func (\\*PipeListener) Accept\n``` go\nfunc (l *PipeListener) Accept() (net.Conn, error)\n```\nAccept implements the Accept method in the net.Listener interface; it\nwaits for the next call and returns a generic net.Conn.\n\n\n\n### func (\\*PipeListener) AcceptPipe\n``` go\nfunc (l *PipeListener) AcceptPipe() (*PipeConn, error)\n```\nAcceptPipe accepts the next incoming call and returns the new connection.\n\n\n\n### func (\\*PipeListener) Addr\n``` go\nfunc (l *PipeListener) Addr() net.Addr\n```\nAddr returns the listener's network address, a PipeAddr.\n\n\n\n### func (\\*PipeListener) Close\n``` go\nfunc (l *PipeListener) Close() error\n```\nClose stops listening on the address.\nAlready Accepted connections are not closed.\n"
  },
  {
    "path": "vendor/gopkg.in/natefinch/npipe.v2/doc.go",
    "content": "// Copyright 2013 Nate Finch. All rights reserved.\n// Use of this source code is governed by an MIT-style\n// license that can be found in the LICENSE file.\n\n// Package npipe provides a pure Go wrapper around Windows named pipes.\n//\n// !! Note, this package is Windows-only.  There is no code to compile on linux.\n//\n// Windows named pipe documentation: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365780\n//\n// Note that the code lives at https://github.com/natefinch/npipe (v2 branch)\n// but should be imported as gopkg.in/natefinch/npipe.v2 (the package name is\n// still npipe).\n//\n// npipe provides an interface based on stdlib's net package, with Dial, Listen,\n// and Accept functions, as well as associated implementations of net.Conn and\n// net.Listener.  It supports rpc over the connection.\n//\n// Notes\n//\n// * Deadlines for reading/writing to the connection are only functional in Windows Vista/Server 2008 and above, due to limitations with the Windows API.\n//\n// * The pipes support byte mode only (no support for message mode)\n//\n// Examples\n//\n// The Dial function connects a client to a named pipe:\n//   conn, err := npipe.Dial(`\\\\.\\pipe\\mypipename`)\n//   if err != nil {\n//   \t<handle error>\n//   }\n//   fmt.Fprintf(conn, \"Hi server!\\n\")\n//   msg, err := bufio.NewReader(conn).ReadString('\\n')\n//   ...\n//\n// The Listen function creates servers:\n//\n//   ln, err := npipe.Listen(`\\\\.\\pipe\\mypipename`)\n//   if err != nil {\n//   \t// handle error\n//   }\n//   for {\n//   \tconn, err := ln.Accept()\n//   \tif err != nil {\n//   \t\t// handle error\n//   \t\tcontinue\n//   \t}\n//   \tgo handleConnection(conn)\n//   }\npackage npipe\n"
  },
  {
    "path": "vendor/gopkg.in/natefinch/npipe.v2/npipe_windows.go",
    "content": "package npipe\n\n//sys createNamedPipe(name *uint16, openMode uint32, pipeMode uint32, maxInstances uint32, outBufSize uint32, inBufSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error)  [failretval==syscall.InvalidHandle] = CreateNamedPipeW\n//sys connectNamedPipe(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) = ConnectNamedPipe\n//sys disconnectNamedPipe(handle syscall.Handle) (err error) = DisconnectNamedPipe\n//sys waitNamedPipe(name *uint16, timeout uint32) (err error) = WaitNamedPipeW\n//sys createEvent(sa *syscall.SecurityAttributes, manualReset bool, initialState bool, name *uint16) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateEventW\n//sys getOverlappedResult(handle syscall.Handle, overlapped *syscall.Overlapped, transferred *uint32, wait bool) (err error) = GetOverlappedResult\n//sys cancelIoEx(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) = CancelIoEx\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"sync\"\n\t\"syscall\"\n\t\"time\"\n)\n\nconst (\n\t// openMode\n\tpipe_access_duplex   = 0x3\n\tpipe_access_inbound  = 0x1\n\tpipe_access_outbound = 0x2\n\n\t// openMode write flags\n\tfile_flag_first_pipe_instance = 0x00080000\n\tfile_flag_write_through       = 0x80000000\n\tfile_flag_overlapped          = 0x40000000\n\n\t// openMode ACL flags\n\twrite_dac              = 0x00040000\n\twrite_owner            = 0x00080000\n\taccess_system_security = 0x01000000\n\n\t// pipeMode\n\tpipe_type_byte    = 0x0\n\tpipe_type_message = 0x4\n\n\t// pipeMode read mode flags\n\tpipe_readmode_byte    = 0x0\n\tpipe_readmode_message = 0x2\n\n\t// pipeMode wait mode flags\n\tpipe_wait   = 0x0\n\tpipe_nowait = 0x1\n\n\t// pipeMode remote-client mode flags\n\tpipe_accept_remote_clients = 0x0\n\tpipe_reject_remote_clients = 0x8\n\n\tpipe_unlimited_instances = 255\n\n\tnmpwait_wait_forever = 0xFFFFFFFF\n\n\t// the two not-an-errors below occur if a client connects to the pipe between\n\t// the server's CreateNamedPipe and ConnectNamedPipe calls.\n\terror_no_data        syscall.Errno = 0xE8\n\terror_pipe_connected syscall.Errno = 0x217\n\terror_pipe_busy      syscall.Errno = 0xE7\n\terror_sem_timeout    syscall.Errno = 0x79\n\n\terror_bad_pathname syscall.Errno = 0xA1\n\terror_invalid_name syscall.Errno = 0x7B\n\n\terror_io_incomplete syscall.Errno = 0x3e4\n)\n\nvar _ net.Conn = (*PipeConn)(nil)\nvar _ net.Listener = (*PipeListener)(nil)\n\n// ErrClosed is the error returned by PipeListener.Accept when Close is called\n// on the PipeListener.\nvar ErrClosed = PipeError{\"Pipe has been closed.\", false}\n\n// PipeError is an error related to a call to a pipe\ntype PipeError struct {\n\tmsg     string\n\ttimeout bool\n}\n\n// Error implements the error interface\nfunc (e PipeError) Error() string {\n\treturn e.msg\n}\n\n// Timeout implements net.AddrError.Timeout()\nfunc (e PipeError) Timeout() bool {\n\treturn e.timeout\n}\n\n// Temporary implements net.AddrError.Temporary()\nfunc (e PipeError) Temporary() bool {\n\treturn false\n}\n\n// Dial connects to a named pipe with the given address. If the specified pipe is not available,\n// it will wait indefinitely for the pipe to become available.\n//\n// The address must be of the form \\\\.\\\\pipe\\<name> for local pipes and \\\\<computer>\\pipe\\<name>\n// for remote pipes.\n//\n// Dial will return a PipeError if you pass in a badly formatted pipe name.\n//\n// Examples:\n//   // local pipe\n//   conn, err := Dial(`\\\\.\\pipe\\mypipename`)\n//\n//   // remote pipe\n//   conn, err := Dial(`\\\\othercomp\\pipe\\mypipename`)\nfunc Dial(address string) (*PipeConn, error) {\n\tfor {\n\t\tconn, err := dial(address, nmpwait_wait_forever)\n\t\tif err == nil {\n\t\t\treturn conn, nil\n\t\t}\n\t\tif isPipeNotReady(err) {\n\t\t\t<-time.After(100 * time.Millisecond)\n\t\t\tcontinue\n\t\t}\n\t\treturn nil, err\n\t}\n}\n\n// DialTimeout acts like Dial, but will time out after the duration of timeout\nfunc DialTimeout(address string, timeout time.Duration) (*PipeConn, error) {\n\tdeadline := time.Now().Add(timeout)\n\n\tnow := time.Now()\n\tfor now.Before(deadline) {\n\t\tmillis := uint32(deadline.Sub(now) / time.Millisecond)\n\t\tconn, err := dial(address, millis)\n\t\tif err == nil {\n\t\t\treturn conn, nil\n\t\t}\n\t\tif err == error_sem_timeout {\n\t\t\t// This is WaitNamedPipe's timeout error, so we know we're done\n\t\t\treturn nil, PipeError{fmt.Sprintf(\n\t\t\t\t\"Timed out waiting for pipe '%s' to come available\", address), true}\n\t\t}\n\t\tif isPipeNotReady(err) {\n\t\t\tleft := deadline.Sub(time.Now())\n\t\t\tretry := 100 * time.Millisecond\n\t\t\tif left > retry {\n\t\t\t\t<-time.After(retry)\n\t\t\t} else {\n\t\t\t\t<-time.After(left - time.Millisecond)\n\t\t\t}\n\t\t\tnow = time.Now()\n\t\t\tcontinue\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn nil, PipeError{fmt.Sprintf(\n\t\t\"Timed out waiting for pipe '%s' to come available\", address), true}\n}\n\n// isPipeNotReady checks the error to see if it indicates the pipe is not ready\nfunc isPipeNotReady(err error) bool {\n\t// Pipe Busy means another client just grabbed the open pipe end,\n\t// and the server hasn't made a new one yet.\n\t// File Not Found means the server hasn't created the pipe yet.\n\t// Neither is a fatal error.\n\n\treturn err == syscall.ERROR_FILE_NOT_FOUND || err == error_pipe_busy\n}\n\n// newOverlapped creates a structure used to track asynchronous\n// I/O requests that have been issued.\nfunc newOverlapped() (*syscall.Overlapped, error) {\n\tevent, err := createEvent(nil, true, true, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &syscall.Overlapped{HEvent: event}, nil\n}\n\n// waitForCompletion waits for an asynchronous I/O request referred to by overlapped to complete.\n// This function returns the number of bytes transferred by the operation and an error code if\n// applicable (nil otherwise).\nfunc waitForCompletion(handle syscall.Handle, overlapped *syscall.Overlapped) (uint32, error) {\n\t_, err := syscall.WaitForSingleObject(overlapped.HEvent, syscall.INFINITE)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tvar transferred uint32\n\terr = getOverlappedResult(handle, overlapped, &transferred, true)\n\treturn transferred, err\n}\n\n// dial is a helper to initiate a connection to a named pipe that has been started by a server.\n// The timeout is only enforced if the pipe server has already created the pipe, otherwise\n// this function will return immediately.\nfunc dial(address string, timeout uint32) (*PipeConn, error) {\n\tname, err := syscall.UTF16PtrFromString(string(address))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// If at least one instance of the pipe has been created, this function\n\t// will wait timeout milliseconds for it to become available.\n\t// It will return immediately regardless of timeout, if no instances\n\t// of the named pipe have been created yet.\n\t// If this returns with no error, there is a pipe available.\n\tif err := waitNamedPipe(name, timeout); err != nil {\n\t\tif err == error_bad_pathname {\n\t\t\t// badly formatted pipe name\n\t\t\treturn nil, badAddr(address)\n\t\t}\n\t\treturn nil, err\n\t}\n\tpathp, err := syscall.UTF16PtrFromString(address)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\thandle, err := syscall.CreateFile(pathp, syscall.GENERIC_READ|syscall.GENERIC_WRITE,\n\t\tuint32(syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE), nil, syscall.OPEN_EXISTING,\n\t\tsyscall.FILE_FLAG_OVERLAPPED, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &PipeConn{handle: handle, addr: PipeAddr(address)}, nil\n}\n\n// Listen returns a new PipeListener that will listen on a pipe with the given\n// address. The address must be of the form \\\\.\\pipe\\<name>\n//\n// Listen will return a PipeError for an incorrectly formatted pipe name.\nfunc Listen(address string) (*PipeListener, error) {\n\thandle, err := createPipe(address, true)\n\tif err == error_invalid_name {\n\t\treturn nil, badAddr(address)\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &PipeListener{\n\t\taddr:   PipeAddr(address),\n\t\thandle: handle,\n\t}, nil\n}\n\n// PipeListener is a named pipe listener. Clients should typically\n// use variables of type net.Listener instead of assuming named pipe.\ntype PipeListener struct {\n\tmu sync.Mutex\n\n\taddr   PipeAddr\n\thandle syscall.Handle\n\tclosed bool\n\n\t// acceptHandle contains the current handle waiting for\n\t// an incoming connection or nil.\n\tacceptHandle syscall.Handle\n\t// acceptOverlapped is set before waiting on a connection.\n\t// If not waiting, it is nil.\n\tacceptOverlapped *syscall.Overlapped\n}\n\n// Accept implements the Accept method in the net.Listener interface; it\n// waits for the next call and returns a generic net.Conn.\nfunc (l *PipeListener) Accept() (net.Conn, error) {\n\tc, err := l.AcceptPipe()\n\tfor err == error_no_data {\n\t\t// Ignore clients that connect and immediately disconnect.\n\t\tc, err = l.AcceptPipe()\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn c, nil\n}\n\n// AcceptPipe accepts the next incoming call and returns the new connection.\n// It might return an error if a client connected and immediately cancelled\n// the connection.\nfunc (l *PipeListener) AcceptPipe() (*PipeConn, error) {\n\tif l == nil {\n\t\treturn nil, syscall.EINVAL\n\t}\n\n\tl.mu.Lock()\n\tdefer l.mu.Unlock()\n\n\tif l.addr == \"\" || l.closed {\n\t\treturn nil, syscall.EINVAL\n\t}\n\n\t// the first time we call accept, the handle will have been created by the Listen\n\t// call. This is to prevent race conditions where the client thinks the server\n\t// isn't listening because it hasn't actually called create yet. After the first time, we'll\n\t// have to create a new handle each time\n\thandle := l.handle\n\tif handle == 0 {\n\t\tvar err error\n\t\thandle, err = createPipe(string(l.addr), false)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t} else {\n\t\tl.handle = 0\n\t}\n\n\toverlapped, err := newOverlapped()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer syscall.CloseHandle(overlapped.HEvent)\n\terr = connectNamedPipe(handle, overlapped)\n\tif err == nil || err == error_pipe_connected {\n\t\treturn &PipeConn{handle: handle, addr: l.addr}, nil\n\t}\n\n\tif err == error_io_incomplete || err == syscall.ERROR_IO_PENDING {\n\t\tl.acceptOverlapped = overlapped\n\t\tl.acceptHandle = handle\n\t\t// unlock here so close can function correctly while we wait (we'll\n\t\t// get relocked via the defer below, before the original defer\n\t\t// unlock happens.)\n\t\tl.mu.Unlock()\n\t\tdefer func() {\n\t\t\tl.mu.Lock()\n\t\t\tl.acceptOverlapped = nil\n\t\t\tl.acceptHandle = 0\n\t\t\t// unlock is via defer above.\n\t\t}()\n\t\t_, err = waitForCompletion(handle, overlapped)\n\t}\n\tif err == syscall.ERROR_OPERATION_ABORTED {\n\t\t// Return error compatible to net.Listener.Accept() in case the\n\t\t// listener was closed.\n\t\treturn nil, ErrClosed\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &PipeConn{handle: handle, addr: l.addr}, nil\n}\n\n// Close stops listening on the address.\n// Already Accepted connections are not closed.\nfunc (l *PipeListener) Close() error {\n\tl.mu.Lock()\n\tdefer l.mu.Unlock()\n\n\tif l.closed {\n\t\treturn nil\n\t}\n\tl.closed = true\n\tif l.handle != 0 {\n\t\terr := disconnectNamedPipe(l.handle)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = syscall.CloseHandle(l.handle)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tl.handle = 0\n\t}\n\tif l.acceptOverlapped != nil && l.acceptHandle != 0 {\n\t\t// Cancel the pending IO. This call does not block, so it is safe\n\t\t// to hold onto the mutex above.\n\t\tif err := cancelIoEx(l.acceptHandle, l.acceptOverlapped); err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr := syscall.CloseHandle(l.acceptOverlapped.HEvent)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tl.acceptOverlapped.HEvent = 0\n\t\terr = syscall.CloseHandle(l.acceptHandle)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tl.acceptHandle = 0\n\t}\n\treturn nil\n}\n\n// Addr returns the listener's network address, a PipeAddr.\nfunc (l *PipeListener) Addr() net.Addr { return l.addr }\n\n// PipeConn is the implementation of the net.Conn interface for named pipe connections.\ntype PipeConn struct {\n\thandle syscall.Handle\n\taddr   PipeAddr\n\n\t// these aren't actually used yet\n\treadDeadline  *time.Time\n\twriteDeadline *time.Time\n}\n\ntype iodata struct {\n\tn   uint32\n\terr error\n}\n\n// completeRequest looks at iodata to see if a request is pending. If so, it waits for it to either complete or to\n// abort due to hitting the specified deadline. Deadline may be set to nil to wait forever. If no request is pending,\n// the content of iodata is returned.\nfunc (c *PipeConn) completeRequest(data iodata, deadline *time.Time, overlapped *syscall.Overlapped) (int, error) {\n\tif data.err == error_io_incomplete || data.err == syscall.ERROR_IO_PENDING {\n\t\tvar timer <-chan time.Time\n\t\tif deadline != nil {\n\t\t\tif timeDiff := deadline.Sub(time.Now()); timeDiff > 0 {\n\t\t\t\ttimer = time.After(timeDiff)\n\t\t\t}\n\t\t}\n\t\tdone := make(chan iodata)\n\t\tgo func() {\n\t\t\tn, err := waitForCompletion(c.handle, overlapped)\n\t\t\tdone <- iodata{n, err}\n\t\t}()\n\t\tselect {\n\t\tcase data = <-done:\n\t\tcase <-timer:\n\t\t\tsyscall.CancelIoEx(c.handle, overlapped)\n\t\t\tdata = iodata{0, timeout(c.addr.String())}\n\t\t}\n\t}\n\t// Windows will produce ERROR_BROKEN_PIPE upon closing\n\t// a handle on the other end of a connection. Go RPC\n\t// expects an io.EOF error in this case.\n\tif data.err == syscall.ERROR_BROKEN_PIPE {\n\t\tdata.err = io.EOF\n\t}\n\treturn int(data.n), data.err\n}\n\n// Read implements the net.Conn Read method.\nfunc (c *PipeConn) Read(b []byte) (int, error) {\n\t// Use ReadFile() rather than Read() because the latter\n\t// contains a workaround that eats ERROR_BROKEN_PIPE.\n\toverlapped, err := newOverlapped()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdefer syscall.CloseHandle(overlapped.HEvent)\n\tvar n uint32\n\terr = syscall.ReadFile(c.handle, b, &n, overlapped)\n\treturn c.completeRequest(iodata{n, err}, c.readDeadline, overlapped)\n}\n\n// Write implements the net.Conn Write method.\nfunc (c *PipeConn) Write(b []byte) (int, error) {\n\toverlapped, err := newOverlapped()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tdefer syscall.CloseHandle(overlapped.HEvent)\n\tvar n uint32\n\terr = syscall.WriteFile(c.handle, b, &n, overlapped)\n\treturn c.completeRequest(iodata{n, err}, c.writeDeadline, overlapped)\n}\n\n// Close closes the connection.\nfunc (c *PipeConn) Close() error {\n\treturn syscall.CloseHandle(c.handle)\n}\n\n// LocalAddr returns the local network address.\nfunc (c *PipeConn) LocalAddr() net.Addr {\n\treturn c.addr\n}\n\n// RemoteAddr returns the remote network address.\nfunc (c *PipeConn) RemoteAddr() net.Addr {\n\t// not sure what to do here, we don't have remote addr....\n\treturn c.addr\n}\n\n// SetDeadline implements the net.Conn SetDeadline method.\n// Note that timeouts are only supported on Windows Vista/Server 2008 and above\nfunc (c *PipeConn) SetDeadline(t time.Time) error {\n\tc.SetReadDeadline(t)\n\tc.SetWriteDeadline(t)\n\treturn nil\n}\n\n// SetReadDeadline implements the net.Conn SetReadDeadline method.\n// Note that timeouts are only supported on Windows Vista/Server 2008 and above\nfunc (c *PipeConn) SetReadDeadline(t time.Time) error {\n\tc.readDeadline = &t\n\treturn nil\n}\n\n// SetWriteDeadline implements the net.Conn SetWriteDeadline method.\n// Note that timeouts are only supported on Windows Vista/Server 2008 and above\nfunc (c *PipeConn) SetWriteDeadline(t time.Time) error {\n\tc.writeDeadline = &t\n\treturn nil\n}\n\n// PipeAddr represents the address of a named pipe.\ntype PipeAddr string\n\n// Network returns the address's network name, \"pipe\".\nfunc (a PipeAddr) Network() string { return \"pipe\" }\n\n// String returns the address of the pipe\nfunc (a PipeAddr) String() string {\n\treturn string(a)\n}\n\n// createPipe is a helper function to make sure we always create pipes\n// with the same arguments, since subsequent calls to create pipe need\n// to use the same arguments as the first one. If first is set, fail\n// if the pipe already exists.\nfunc createPipe(address string, first bool) (syscall.Handle, error) {\n\tn, err := syscall.UTF16PtrFromString(address)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tmode := uint32(pipe_access_duplex | syscall.FILE_FLAG_OVERLAPPED)\n\tif first {\n\t\tmode |= file_flag_first_pipe_instance\n\t}\n\treturn createNamedPipe(n,\n\t\tmode,\n\t\tpipe_type_byte,\n\t\tpipe_unlimited_instances,\n\t\t512, 512, 0, nil)\n}\n\nfunc badAddr(addr string) PipeError {\n\treturn PipeError{fmt.Sprintf(\"Invalid pipe address '%s'.\", addr), false}\n}\nfunc timeout(addr string) PipeError {\n\treturn PipeError{fmt.Sprintf(\"Pipe IO timed out waiting for '%s'\", addr), true}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/natefinch/npipe.v2/znpipe_windows_386.go",
    "content": "// +build windows\n// go build mksyscall_windows.go && ./mksyscall_windows npipe_windows.go\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\npackage npipe\n\nimport \"unsafe\"\nimport \"syscall\"\n\nvar (\n\tmodkernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\n\n\tprocCreateNamedPipeW    = modkernel32.NewProc(\"CreateNamedPipeW\")\n\tprocConnectNamedPipe    = modkernel32.NewProc(\"ConnectNamedPipe\")\n\tprocDisconnectNamedPipe = modkernel32.NewProc(\"DisconnectNamedPipe\")\n\tprocWaitNamedPipeW      = modkernel32.NewProc(\"WaitNamedPipeW\")\n\tprocCreateEventW        = modkernel32.NewProc(\"CreateEventW\")\n\tprocGetOverlappedResult = modkernel32.NewProc(\"GetOverlappedResult\")\n\tprocCancelIoEx          = modkernel32.NewProc(\"CancelIoEx\")\n)\n\nfunc createNamedPipe(name *uint16, openMode uint32, pipeMode uint32, maxInstances uint32, outBufSize uint32, inBufSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) {\n\tr0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(openMode), uintptr(pipeMode), uintptr(maxInstances), uintptr(outBufSize), uintptr(inBufSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0)\n\thandle = syscall.Handle(r0)\n\tif handle == syscall.InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc cancelIoEx(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc connectNamedPipe(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc disconnectNamedPipe(handle syscall.Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procDisconnectNamedPipe.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc waitNamedPipe(name *uint16, timeout uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procWaitNamedPipeW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(timeout), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc createEvent(sa *syscall.SecurityAttributes, manualReset bool, initialState bool, name *uint16) (handle syscall.Handle, err error) {\n\tvar _p0 uint32\n\tif manualReset {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tvar _p1 uint32\n\tif initialState {\n\t\t_p1 = 1\n\t} else {\n\t\t_p1 = 0\n\t}\n\tr0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(sa)), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(name)), 0, 0)\n\thandle = syscall.Handle(r0)\n\tif handle == syscall.InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc getOverlappedResult(handle syscall.Handle, overlapped *syscall.Overlapped, transferred *uint32, wait bool) (err error) {\n\tvar _p0 uint32\n\tif wait {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr1, _, e1 := syscall.Syscall6(procGetOverlappedResult.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transferred)), uintptr(_p0), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/gopkg.in/natefinch/npipe.v2/znpipe_windows_amd64.go",
    "content": "// +build windows\n// go build mksyscall_windows.go && ./mksyscall_windows npipe_windows.go\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\npackage npipe\n\nimport \"unsafe\"\nimport \"syscall\"\n\nvar (\n\tmodkernel32 = syscall.NewLazyDLL(\"kernel32.dll\")\n\n\tprocCreateNamedPipeW    = modkernel32.NewProc(\"CreateNamedPipeW\")\n\tprocConnectNamedPipe    = modkernel32.NewProc(\"ConnectNamedPipe\")\n\tprocDisconnectNamedPipe = modkernel32.NewProc(\"DisconnectNamedPipe\")\n\tprocWaitNamedPipeW      = modkernel32.NewProc(\"WaitNamedPipeW\")\n\tprocCreateEventW        = modkernel32.NewProc(\"CreateEventW\")\n\tprocGetOverlappedResult = modkernel32.NewProc(\"GetOverlappedResult\")\n\tprocCancelIoEx          = modkernel32.NewProc(\"CancelIoEx\")\n)\n\nfunc createNamedPipe(name *uint16, openMode uint32, pipeMode uint32, maxInstances uint32, outBufSize uint32, inBufSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) {\n\tr0, _, e1 := syscall.Syscall9(procCreateNamedPipeW.Addr(), 8, uintptr(unsafe.Pointer(name)), uintptr(openMode), uintptr(pipeMode), uintptr(maxInstances), uintptr(outBufSize), uintptr(inBufSize), uintptr(defaultTimeout), uintptr(unsafe.Pointer(sa)), 0)\n\thandle = syscall.Handle(r0)\n\tif handle == syscall.InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc cancelIoEx(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc connectNamedPipe(handle syscall.Handle, overlapped *syscall.Overlapped) (err error) {\n\tr1, _, e1 := syscall.Syscall(procConnectNamedPipe.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc disconnectNamedPipe(handle syscall.Handle) (err error) {\n\tr1, _, e1 := syscall.Syscall(procDisconnectNamedPipe.Addr(), 1, uintptr(handle), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc waitNamedPipe(name *uint16, timeout uint32) (err error) {\n\tr1, _, e1 := syscall.Syscall(procWaitNamedPipeW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(timeout), 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc createEvent(sa *syscall.SecurityAttributes, manualReset bool, initialState bool, name *uint16) (handle syscall.Handle, err error) {\n\tvar _p0 uint32\n\tif manualReset {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tvar _p1 uint32\n\tif initialState {\n\t\t_p1 = 1\n\t} else {\n\t\t_p1 = 0\n\t}\n\tr0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(sa)), uintptr(_p0), uintptr(_p1), uintptr(unsafe.Pointer(name)), 0, 0)\n\thandle = syscall.Handle(r0)\n\tif handle == syscall.InvalidHandle {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n\nfunc getOverlappedResult(handle syscall.Handle, overlapped *syscall.Overlapped, transferred *uint32, wait bool) (err error) {\n\tvar _p0 uint32\n\tif wait {\n\t\t_p0 = 1\n\t} else {\n\t\t_p0 = 0\n\t}\n\tr1, _, e1 := syscall.Syscall6(procGetOverlappedResult.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transferred)), uintptr(_p0), 0, 0)\n\tif r1 == 0 {\n\t\tif e1 != 0 {\n\t\t\terr = error(e1)\n\t\t} else {\n\t\t\terr = syscall.EINVAL\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/Gopkg.toml",
    "content": "[[constraint]]\n  branch = \"v1\"\n  name = \"gopkg.in/check.v1\""
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Oleg Lebedev\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": "vendor/gopkg.in/olebedev/go-duktape.v3/README.md",
    "content": "# Duktape bindings for Go(Golang)\n\n[![wercker status](https://app.wercker.com/status/3a5bb2e639a4b4efaf4c8bf7cab7442d/s \"wercker status\")](https://app.wercker.com/project/bykey/3a5bb2e639a4b4efaf4c8bf7cab7442d)\n[![Travis status](https://travis-ci.org/olebedev/go-duktape.svg?branch=v3)](https://travis-ci.org/olebedev/go-duktape)\n[![Appveyor status](https://ci.appveyor.com/api/projects/status/github/olebedev/go-duktape?branch=v3&svg=true)](https://ci.appveyor.com/project/olebedev/go-duktape/branch/v3)\n[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/olebedev/go-duktape?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n\n[Duktape](http://duktape.org/index.html) is a thin, embeddable javascript engine.\nMost of the [api](http://duktape.org/api.html) is implemented.\nThe exceptions are listed [here](https://github.com/olebedev/go-duktape/blob/master/api.go#L1566).\n\n### Usage\n\nThe package is fully go-getable, no need to install any external C libraries.  \nSo, just type `go get gopkg.in/olebedev/go-duktape.v3` to install.\n\n\n```go\npackage main\n\nimport \"fmt\"\nimport \"gopkg.in/olebedev/go-duktape.v3\"\n\nfunc main() {\n  ctx := duktape.New()\n  ctx.PevalString(`2 + 3`)\n  result := ctx.GetNumber(-1)\n  ctx.Pop()\n  fmt.Println(\"result is:\", result)\n  // To prevent memory leaks, don't forget to clean up after\n  // yourself when you're done using a context.\n  ctx.DestroyHeap()\n}\n```\n\n### Go specific notes\n\nBindings between Go and Javascript contexts are not fully functional.\nHowever, binding a Go function to the Javascript context is available:\n```go\npackage main\n\nimport \"fmt\"\nimport \"gopkg.in/olebedev/go-duktape.v3\"\n\nfunc main() {\n  ctx := duktape.New()\n  ctx.PushGlobalGoFunction(\"log\", func(c *duktape.Context) int {\n    fmt.Println(c.SafeToString(-1))\n    return 0\n  })\n  ctx.PevalString(`log('Go lang Go!')`)\n}\n```\nthen run it.\n```bash\n$ go run *.go\nGo lang Go!\n$\n```\n\n### Timers\n\nThere is a method to inject timers to the global scope:\n```go\npackage main\n\nimport \"fmt\"\nimport \"gopkg.in/olebedev/go-duktape.v3\"\n\nfunc main() {\n  ctx := duktape.New()\n\n  // Let's inject `setTimeout`, `setInterval`, `clearTimeout`,\n  // `clearInterval` into global scope.\n  ctx.PushTimers()\n\n  ch := make(chan string)\n  ctx.PushGlobalGoFunction(\"second\", func(_ *Context) int {\n    ch <- \"second step\"\n    return 0\n  })\n  ctx.PevalString(`\n    setTimeout(second, 0);\n    print('first step');\n  `)\n  fmt.Println(<-ch)\n}\n```\nthen run it\n```bash\n$ go run *.go\nfirst step\nsecond step\n$\n```\n\nAlso you can `FlushTimers()`.\n\n### Command line tool\n\nInstall `go get gopkg.in/olebedev/go-duktape.v3/...`.  \nExecute file.js: `$GOPATH/bin/go-duk file.js`.\n\n### Benchmarks\n| prog        | time  |\n| ------------|-------|\n|[otto](https://github.com/robertkrimen/otto)|200.13s|\n|[anko](https://github.com/mattn/anko)|231.19s|\n|[agora](https://github.com/PuerkitoBio/agora/)|149.33s|\n|[GopherLua](https://github.com/yuin/gopher-lua/)|8.39s|\n|**go-duktape**|**9.80s**|\n\nMore details are [here](https://github.com/olebedev/go-duktape/wiki/Benchmarks).\n\n### Status\n\nThe package is not fully tested, so be careful.\n\n\n### Contribution\n\nPull requests are welcome! Also, if you want to discuss something send a pull request with proposal and changes.\n__Convention:__ fork the repository and make changes on your fork in a feature branch.\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/api.go",
    "content": "package duktape\n\n/*\n#cgo !windows CFLAGS: -std=c99 -O3 -Wall -Wno-unused-value -fomit-frame-pointer -fstrict-aliasing\n#cgo windows CFLAGS: -O3 -Wall -Wno-unused-value -fomit-frame-pointer -fstrict-aliasing\n\n#include \"duktape.h\"\n#include \"duk_logging.h\"\n#include \"duk_v1_compat.h\"\n#include \"duk_print_alert.h\"\nstatic void _duk_eval_string(duk_context *ctx, const char *str) {\n  duk_eval_string(ctx, str);\n}\nstatic void _duk_compile(duk_context *ctx, duk_uint_t flags) {\n  duk_compile(ctx, flags);\n}\nstatic void _duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path) {\n  duk_compile_file(ctx, flags, path);\n}\nstatic void _duk_compile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {\n\tduk_compile_lstring(ctx, flags, src, len);\n}\nstatic void _duk_compile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {\n\tduk_compile_lstring_filename(ctx, flags, src, len);\n}\nstatic void _duk_compile_string(duk_context *ctx, duk_uint_t flags, const char *src) {\n\tduk_compile_string(ctx, flags, src);\n}\nstatic void _duk_compile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src) {\n\tduk_compile_string_filename(ctx, flags, src);\n}\nstatic void _duk_dump_context_stderr(duk_context *ctx) {\n\tduk_dump_context_stderr(ctx);\n}\nstatic void _duk_dump_context_stdout(duk_context *ctx) {\n\tduk_dump_context_stdout(ctx);\n}\nstatic void _duk_eval(duk_context *ctx) {\n\tduk_eval(ctx);\n}\nstatic void _duk_eval_file(duk_context *ctx, const char *path) {\n\tduk_eval_file(ctx, path);\n}\nstatic void _duk_eval_file_noresult(duk_context *ctx, const char *path) {\n\tduk_eval_file_noresult(ctx, path);\n}\nstatic void _duk_eval_lstring(duk_context *ctx, const char *src, duk_size_t len) {\n\tduk_eval_lstring(ctx, src, len);\n}\nstatic void _duk_eval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len) {\n\tduk_eval_lstring_noresult(ctx, src, len);\n}\nstatic void _duk_eval_noresult(duk_context *ctx) {\n\tduk_eval_noresult(ctx);\n}\nstatic void _duk_eval_string_noresult(duk_context *ctx, const char *src) {\n\tduk_eval_string_noresult(ctx, src);\n}\nstatic duk_bool_t _duk_is_error(duk_context *ctx, duk_idx_t index) {\n\treturn duk_is_error(ctx, index);\n}\nstatic duk_bool_t _duk_is_object_coercible(duk_context *ctx, duk_idx_t index) {\n\treturn duk_is_object_coercible(ctx, index);\n}\nstatic duk_int_t _duk_pcompile(duk_context *ctx, duk_uint_t flags) {\n\treturn duk_pcompile(ctx, flags);\n}\nstatic duk_int_t _duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path) {\n\treturn duk_pcompile_file(ctx, flags, path);\n}\nstatic duk_int_t _duk_pcompile_lstring(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {\n\treturn duk_pcompile_lstring(ctx, flags, src, len);\n}\nstatic duk_int_t _duk_pcompile_lstring_filename(duk_context *ctx, duk_uint_t flags, const char *src, duk_size_t len) {\n\treturn duk_pcompile_lstring_filename(ctx, flags, src, len);\n}\nstatic duk_int_t _duk_pcompile_string(duk_context *ctx, duk_uint_t flags, const char *src) {\n\treturn duk_pcompile_string(ctx, flags, src);\n}\nstatic duk_int_t _duk_pcompile_string_filename(duk_context *ctx, duk_uint_t flags, const char *src) {\n\treturn duk_pcompile_string_filename(ctx, flags, src);\n}\nstatic duk_int_t _duk_peval(duk_context *ctx) {\n\treturn duk_peval(ctx);\n}\nstatic duk_int_t _duk_peval_file(duk_context *ctx, const char *path) {\n\treturn duk_peval_file(ctx, path);\n}\nstatic duk_int_t _duk_peval_file_noresult(duk_context *ctx, const char *path) {\n\treturn duk_peval_file_noresult(ctx, path);\n}\nstatic duk_int_t _duk_peval_lstring(duk_context *ctx, const char *src, duk_size_t len) {\n\treturn duk_peval_lstring(ctx, src, len);\n}\nstatic duk_int_t _duk_peval_lstring_noresult(duk_context *ctx, const char *src, duk_size_t len) {\n\treturn duk_peval_lstring_noresult(ctx, src, len);\n}\nstatic duk_int_t _duk_peval_noresult(duk_context *ctx) {\n\treturn duk_peval_noresult(ctx);\n}\nstatic duk_int_t _duk_peval_string(duk_context *ctx, const char *src) {\n\treturn duk_peval_string(ctx, src);\n}\nstatic duk_int_t _duk_peval_string_noresult(duk_context *ctx, const char *src) {\n\treturn duk_peval_string_noresult(ctx, src);\n}\nstatic const char *_duk_push_string_file(duk_context *ctx, const char *path) {\n\treturn duk_push_string_file(ctx, path);\n}\nstatic duk_idx_t _duk_push_thread(duk_context *ctx) {\n\treturn duk_push_thread(ctx);\n}\nstatic duk_idx_t _duk_push_thread_new_globalenv(duk_context *ctx) {\n\treturn duk_push_thread_new_globalenv(ctx);\n}\nstatic void _duk_require_object_coercible(duk_context *ctx, duk_idx_t index) {\n\tduk_require_object_coercible(ctx, index);\n}\nstatic void _duk_require_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask) {\n\tduk_require_type_mask(ctx, index, mask);\n}\nstatic const char *_duk_safe_to_string(duk_context *ctx, duk_idx_t index) {\n\treturn duk_safe_to_string(ctx, index);\n}\nstatic void _duk_xcopy_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count) {\n\tduk_xcopy_top(to_ctx, from_ctx, count);\n}\nstatic void _duk_xmove_top(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count) {\n\tduk_xmove_top(to_ctx, from_ctx, count);\n}\nstatic void *_duk_to_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) {\n\treturn duk_to_buffer(ctx, index, out_size);\n}\nstatic void *_duk_to_dynamic_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) {\n\treturn duk_to_dynamic_buffer(ctx, index, out_size);\n}\nstatic void *_duk_to_fixed_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) {\n\treturn duk_to_fixed_buffer(ctx, index, out_size);\n}\nstatic duk_int_t _duk_is_primitive(duk_context *ctx, duk_idx_t index) {\n  return duk_is_primitive(ctx, index);\n}\nstatic void *_duk_push_buffer(duk_context *ctx, duk_size_t size, duk_bool_t dynamic) {\n\treturn duk_push_buffer(ctx, size, dynamic);\n}\nstatic void *_duk_push_fixed_buffer(duk_context *ctx, duk_size_t size) {\n\treturn duk_push_fixed_buffer(ctx, size);\n}\nstatic void *_duk_push_dynamic_buffer(duk_context *ctx, duk_size_t size) {\n\treturn duk_push_dynamic_buffer(ctx, size);\n}\nstatic void _duk_error(duk_context *ctx, duk_errcode_t err_code, const char *str) {\n\tduk_error(ctx, err_code, \"%s\", str);\n}\nstatic void _duk_push_error_object(duk_context *ctx, duk_errcode_t err_code, const char *str) {\n\tduk_push_error_object(ctx, err_code, \"%s\", str);\n}\nstatic void _duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *text) {\n\tduk_error_raw(ctx, err_code, filename, line, text);\n}\nstatic void _duk_log(duk_context *ctx, duk_int_t level, const char *str) {\n\tduk_log(ctx, level, \"%s\", str);\n}\nstatic void _duk_push_external_buffer(duk_context *ctx) {\n\tduk_push_external_buffer(ctx);\n}\n*/\nimport \"C\"\nimport (\n\t\"fmt\"\n\t\"unsafe\"\n)\n\n// See: http://duktape.org/api.html#duk_alloc\nfunc (d *Context) Alloc(size int) unsafe.Pointer {\n\treturn C.duk_alloc(d.duk_context, C.duk_size_t(size))\n}\n\n// See: http://duktape.org/api.html#duk_alloc_raw\nfunc (d *Context) AllocRaw(size int) unsafe.Pointer {\n\treturn C.duk_alloc_raw(d.duk_context, C.duk_size_t(size))\n}\n\n// See: http://duktape.org/api.html#duk_base64_decode\nfunc (d *Context) Base64Decode(index int) {\n\tC.duk_base64_decode(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_base64_encode\nfunc (d *Context) Base64Encode(index int) string {\n\tif s := C.duk_base64_encode(d.duk_context, C.duk_idx_t(index)); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_call\nfunc (d *Context) Call(nargs int) {\n\tC.duk_call(d.duk_context, C.duk_idx_t(nargs))\n}\n\n// See: http://duktape.org/api.html#duk_call_method\nfunc (d *Context) CallMethod(nargs int) {\n\tC.duk_call_method(d.duk_context, C.duk_idx_t(nargs))\n}\n\n// See: http://duktape.org/api.html#duk_call_prop\nfunc (d *Context) CallProp(objIndex int, nargs int) {\n\tC.duk_call_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_idx_t(nargs))\n}\n\n// See: http://duktape.org/api.html#duk_check_stack\nfunc (d *Context) CheckStack(extra int) bool {\n\treturn int(C.duk_check_stack(d.duk_context, C.duk_idx_t(extra))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_check_stack_top\nfunc (d *Context) CheckStackTop(top int) bool {\n\treturn int(C.duk_check_stack_top(d.duk_context, C.duk_idx_t(top))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_check_type\nfunc (d *Context) CheckType(index int, typ int) bool {\n\treturn int(C.duk_check_type(d.duk_context, C.duk_idx_t(index), C.duk_int_t(typ))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_check_type_mask\nfunc (d *Context) CheckTypeMask(index int, mask uint) bool {\n\treturn int(C.duk_check_type_mask(d.duk_context, C.duk_idx_t(index), C.duk_uint_t(mask))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_compact\nfunc (d *Context) Compact(objIndex int) {\n\tC.duk_compact(d.duk_context, C.duk_idx_t(objIndex))\n}\n\n// See: http://duktape.org/api.html#duk_compile\nfunc (d *Context) Compile(flags uint) {\n\tC._duk_compile(d.duk_context, C.duk_uint_t(flags))\n}\n\n// See: http://duktape.org/api.html#duk_compile_file\nfunc (d *Context) CompileFile(flags uint, path string) {\n\t__path__ := C.CString(path)\n\tC._duk_compile_file(d.duk_context, C.duk_uint_t(flags), __path__)\n\tC.free(unsafe.Pointer(__path__))\n}\n\n// See: http://duktape.org/api.html#duk_compile_lstring\nfunc (d *Context) CompileLstring(flags uint, src string, len int) {\n\t__src__ := C.CString(src)\n\tC._duk_compile_lstring(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len))\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_compile_lstring_filename\nfunc (d *Context) CompileLstringFilename(flags uint, src string, len int) {\n\t__src__ := C.CString(src)\n\tC._duk_compile_lstring_filename(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len))\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_compile_string\nfunc (d *Context) CompileString(flags uint, src string) {\n\t__src__ := C.CString(src)\n\tC._duk_compile_string(d.duk_context, C.duk_uint_t(flags), __src__)\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_compile_string_filename\nfunc (d *Context) CompileStringFilename(flags uint, src string) {\n\t__src__ := C.CString(src)\n\tC._duk_compile_string_filename(d.duk_context, C.duk_uint_t(flags), __src__)\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_concat\nfunc (d *Context) Concat(count int) {\n\tC.duk_concat(d.duk_context, C.duk_idx_t(count))\n}\n\n// See: http://duktape.org/api.html#duk_copy\nfunc (d *Context) Copy(fromIndex int, toIndex int) {\n\tC.duk_copy(d.duk_context, C.duk_idx_t(fromIndex), C.duk_idx_t(toIndex))\n}\n\n// See: http://duktape.org/api.html#duk_del_prop\nfunc (d *Context) DelProp(objIndex int) bool {\n\treturn int(C.duk_del_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_del_prop_index\nfunc (d *Context) DelPropIndex(objIndex int, arrIndex uint) bool {\n\treturn int(C.duk_del_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_del_prop_string\nfunc (d *Context) DelPropString(objIndex int, key string) bool {\n\t__key__ := C.CString(key)\n\tresult := int(C.duk_del_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1\n\tC.free(unsafe.Pointer(__key__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_def_prop\nfunc (d *Context) DefProp(objIndex int, flags uint) {\n\tC.duk_def_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_uint_t(flags))\n}\n\n// See: http://duktape.org/api.html#duk_destroy_heap\nfunc (d *Context) DestroyHeap() {\n\td.Gc(0)\n\tC.duk_destroy_heap(d.duk_context)\n\td.duk_context = nil\n}\n\n// See: http://duktape.org/api.html#duk_dump_context_stderr\nfunc (d *Context) DumpContextStderr() {\n\tC._duk_dump_context_stderr(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_dump_context_stdout\nfunc (d *Context) DumpContextStdout() {\n\tC._duk_dump_context_stdout(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_dup\nfunc (d *Context) Dup(fromIndex int) {\n\tC.duk_dup(d.duk_context, C.duk_idx_t(fromIndex))\n}\n\n// See: http://duktape.org/api.html#duk_dup_top\nfunc (d *Context) DupTop() {\n\tC.duk_dup_top(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_enum\nfunc (d *Context) Enum(objIndex int, enumFlags uint) {\n\tC.duk_enum(d.duk_context, C.duk_idx_t(objIndex), C.duk_uint_t(enumFlags))\n}\n\n// See: http://duktape.org/api.html#duk_equals\nfunc (d *Context) Equals(index1 int, index2 int) bool {\n\treturn int(C.duk_equals(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))) == 1\n}\n\n// Error pushes a new Error object to the stack and throws it. This will call\n// fmt.Sprint, forwarding arguments after the error code, to produce the\n// Error's message.\n//\n// See: http://duktape.org/api.html#duk_error\nfunc (d *Context) Error(errCode int, str string) {\n\t__str__ := C.CString(str)\n\tC._duk_error(d.duk_context, C.duk_errcode_t(errCode), __str__)\n\tC.free(unsafe.Pointer(__str__))\n}\n\nfunc (d *Context) ErrorRaw(errCode int, filename string, line int, errMsg string) {\n\t__filename__ := C.CString(filename)\n\t__errMsg__ := C.CString(errMsg)\n\tC._duk_error_raw(d.duk_context, C.duk_errcode_t(errCode), __filename__, C.duk_int_t(line), __errMsg__)\n\tC.free(unsafe.Pointer(__filename__))\n\tC.free(unsafe.Pointer(__errMsg__))\n}\n\n// Errorf pushes a new Error object to the stack and throws it. This will call\n// fmt.Sprintf, forwarding the format string and additional arguments, to\n// produce the Error's message.\n//\n// See: http://duktape.org/api.html#duk_error\nfunc (d *Context) Errorf(errCode int, format string, a ...interface{}) {\n\tstr := fmt.Sprintf(format, a...)\n\t__str__ := C.CString(str)\n\tC._duk_error(d.duk_context, C.duk_errcode_t(errCode), __str__)\n\tC.free(unsafe.Pointer(__str__))\n}\n\n// See: http://duktape.org/api.html#duk_eval\nfunc (d *Context) Eval() {\n\tC._duk_eval(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_eval_file\nfunc (d *Context) EvalFile(path string) {\n\t__path__ := C.CString(path)\n\tC._duk_eval_file(d.duk_context, __path__)\n\tC.free(unsafe.Pointer(__path__))\n}\n\n// See: http://duktape.org/api.html#duk_eval_file_noresult\nfunc (d *Context) EvalFileNoresult(path string) {\n\t__path__ := C.CString(path)\n\tC._duk_eval_file_noresult(d.duk_context, __path__)\n\tC.free(unsafe.Pointer(__path__))\n}\n\n// See: http://duktape.org/api.html#duk_eval_lstring\nfunc (d *Context) EvalLstring(src string, len int) {\n\t__src__ := C.CString(src)\n\tC._duk_eval_lstring(d.duk_context, __src__, C.duk_size_t(len))\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_eval_lstring_noresult\nfunc (d *Context) EvalLstringNoresult(src string, len int) {\n\t__src__ := C.CString(src)\n\tC._duk_eval_lstring_noresult(d.duk_context, __src__, C.duk_size_t(len))\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_eval_noresult\nfunc (d *Context) EvalNoresult() {\n\tC._duk_eval_noresult(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_eval_string\nfunc (d *Context) EvalString(src string) {\n\t__src__ := C.CString(src)\n\tC._duk_eval_string(d.duk_context, __src__)\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_eval_string_noresult\nfunc (d *Context) EvalStringNoresult(src string) {\n\t__src__ := C.CString(src)\n\tC._duk_eval_string_noresult(d.duk_context, __src__)\n\tC.free(unsafe.Pointer(__src__))\n}\n\n// See: http://duktape.org/api.html#duk_fatal\nfunc (d *Context) Fatal(errCode int, errMsg string) {\n\t__errMsg__ := C.CString(errMsg)\n\tdefer C.free(unsafe.Pointer(__errMsg__))\n\tC.duk_fatal_raw(d.duk_context, __errMsg__)\n}\n\n// See: http://duktape.org/api.html#duk_gc\nfunc (d *Context) Gc(flags uint) {\n\tC.duk_gc(d.duk_context, C.duk_uint_t(flags))\n}\n\n// See: http://duktape.org/api.html#duk_get_boolean\nfunc (d *Context) GetBoolean(index int) bool {\n\treturn int(C.duk_get_boolean(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_get_buffer\nfunc (d *Context) GetBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {\n\trawPtr = C.duk_get_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))\n\treturn rawPtr, outSize\n}\n\n// See: http://duktape.org/api.html#duk_get_context\nfunc (d *Context) GetContext(index int) *Context {\n\treturn contextFromPointer(C.duk_get_context(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_current_magic\nfunc (d *Context) GetCurrentMagic() int {\n\treturn int(C.duk_get_current_magic(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_get_error_code\nfunc (d *Context) GetErrorCode(index int) int {\n\tcode := int(C.duk_get_error_code(d.duk_context, C.duk_idx_t(index)))\n\treturn code\n}\n\n// See: http://duktape.org/api.html#duk_get_finalizer\nfunc (d *Context) GetFinalizer(index int) {\n\tC.duk_get_finalizer(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_get_global_string\nfunc (d *Context) GetGlobalString(key string) bool {\n\t__key__ := C.CString(key)\n\tresult := int(C.duk_get_global_string(d.duk_context, __key__)) == 1\n\tC.free(unsafe.Pointer(__key__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_get_heapptr\nfunc (d *Context) GetHeapptr(index int) unsafe.Pointer {\n\treturn unsafe.Pointer(C.duk_get_heapptr(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_int\nfunc (d *Context) GetInt(index int) int {\n\treturn int(C.duk_get_int(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_length\nfunc (d *Context) GetLength(index int) int {\n\treturn int(C.duk_get_length(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_lstring\nfunc (d *Context) GetLstring(index int) string {\n\tif s := C.duk_get_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_get_magic\nfunc (d *Context) GetMagic(index int) int {\n\treturn int(C.duk_get_magic(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_number\nfunc (d *Context) GetNumber(index int) float64 {\n\treturn float64(C.duk_get_number(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_pointer\nfunc (d *Context) GetPointer(index int) unsafe.Pointer {\n\treturn C.duk_get_pointer(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_get_prop\nfunc (d *Context) GetProp(objIndex int) bool {\n\treturn int(C.duk_get_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_get_prop_index\nfunc (d *Context) GetPropIndex(objIndex int, arrIndex uint) bool {\n\treturn int(C.duk_get_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_get_prop_string\nfunc (d *Context) GetPropString(objIndex int, key string) bool {\n\t__key__ := C.CString(key)\n\tresult := int(C.duk_get_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1\n\tC.free(unsafe.Pointer(__key__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_get_prototype\nfunc (d *Context) GetPrototype(index int) {\n\tC.duk_get_prototype(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_get_string\nfunc (d *Context) GetString(i int) string {\n\tif s := C.duk_get_string(d.duk_context, C.duk_idx_t(i)); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_get_top\nfunc (d *Context) GetTop() int {\n\treturn int(C.duk_get_top(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_get_top_index\nfunc (d *Context) GetTopIndex() int {\n\treturn int(C.duk_get_top_index(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_get_type\nfunc (d *Context) GetType(index int) Type {\n\treturn Type(C.duk_get_type(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_type_mask\nfunc (d *Context) GetTypeMask(index int) uint {\n\treturn uint(C.duk_get_type_mask(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_get_uint\nfunc (d *Context) GetUint(index int) uint {\n\treturn uint(C.duk_get_uint(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_has_prop\nfunc (d *Context) HasProp(objIndex int) bool {\n\treturn int(C.duk_has_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_has_prop_index\nfunc (d *Context) HasPropIndex(objIndex int, arrIndex uint) bool {\n\treturn int(C.duk_has_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_has_prop_string\nfunc (d *Context) HasPropString(objIndex int, key string) bool {\n\t__key__ := C.CString(key)\n\tresult := int(C.duk_has_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1\n\tC.free(unsafe.Pointer(__key__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_hex_decode\nfunc (d *Context) HexDecode(index int) {\n\tC.duk_hex_decode(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_hex_encode\nfunc (d *Context) HexEncode(index int) string {\n\tif s := C.duk_hex_encode(d.duk_context, C.duk_idx_t(index)); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_insert\nfunc (d *Context) Insert(toIndex int) {\n\tC.duk_insert(d.duk_context, C.duk_idx_t(toIndex))\n}\n\n// See: http://duktape.org/api.html#duk_is_array\nfunc (d *Context) IsArray(index int) bool {\n\treturn int(C.duk_is_array(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_boolean\nfunc (d *Context) IsBoolean(index int) bool {\n\treturn int(C.duk_is_boolean(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_bound_function\nfunc (d *Context) IsBoundFunction(index int) bool {\n\treturn int(C.duk_is_bound_function(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_buffer\nfunc (d *Context) IsBuffer(index int) bool {\n\treturn int(C.duk_is_buffer(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_c_function\nfunc (d *Context) IsCFunction(index int) bool {\n\treturn int(C.duk_is_c_function(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_callable\nfunc (d *Context) IsCallable(index int) bool {\n\treturn int(C.duk_is_function(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_constructor_call\nfunc (d *Context) IsConstructorCall() bool {\n\treturn int(C.duk_is_constructor_call(d.duk_context)) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_dynamic_buffer\nfunc (d *Context) IsDynamicBuffer(index int) bool {\n\treturn int(C.duk_is_dynamic_buffer(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_ecmascript_function\nfunc (d *Context) IsEcmascriptFunction(index int) bool {\n\treturn int(C.duk_is_ecmascript_function(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_fixed_buffer\nfunc (d *Context) IsFixedBuffer(index int) bool {\n\treturn int(C.duk_is_fixed_buffer(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_function\nfunc (d *Context) IsFunction(index int) bool {\n\treturn int(C.duk_is_function(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_nan\nfunc (d *Context) IsNan(index int) bool {\n\treturn int(C.duk_is_nan(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_null\nfunc (d *Context) IsNull(index int) bool {\n\treturn int(C.duk_is_null(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_null_or_undefined\nfunc (d *Context) IsNullOrUndefined(index int) bool {\n\treturn d.IsNull(index) || d.IsUndefined(index)\n}\n\n// See: http://duktape.org/api.html#duk_is_number\nfunc (d *Context) IsNumber(index int) bool {\n\treturn int(C.duk_is_number(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_object\nfunc (d *Context) IsObject(index int) bool {\n\treturn int(C.duk_is_object(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_error\nfunc (d *Context) IsError(index int) bool {\n\treturn int(C._duk_is_error(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_object_coercible\nfunc (d *Context) IsObjectCoercible(index int) bool {\n\treturn int(C._duk_is_object_coercible(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_pointer\nfunc (d *Context) IsPointer(index int) bool {\n\treturn int(C.duk_is_pointer(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_primitive\nfunc (d *Context) IsPrimitive(index int) bool {\n\treturn int(C._duk_is_primitive(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_strict_call\nfunc (d *Context) IsStrictCall() bool {\n\treturn int(C.duk_is_strict_call(d.duk_context)) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_string\nfunc (d *Context) IsString(index int) bool {\n\treturn int(C.duk_is_string(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_thread\nfunc (d *Context) IsThread(index int) bool {\n\treturn int(C.duk_is_thread(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_undefined\nfunc (d *Context) IsUndefined(index int) bool {\n\treturn int(C.duk_is_undefined(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_valid_index\nfunc (d *Context) IsValidIndex(index int) bool {\n\treturn int(C.duk_is_valid_index(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_join\nfunc (d *Context) Join(count int) {\n\tC.duk_join(d.duk_context, C.duk_idx_t(count))\n}\n\n// See: http://duktape.org/api.html#duk_json_decode\nfunc (d *Context) JsonDecode(index int) {\n\tC.duk_json_decode(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_json_encode\nfunc (d *Context) JsonEncode(index int) string {\n\tif s := C.duk_json_encode(d.duk_context, C.duk_idx_t(index)); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_new\nfunc (d *Context) New(nargs int) {\n\tC.duk_new(d.duk_context, C.duk_idx_t(nargs))\n}\n\n// See: http://duktape.org/api.html#duk_next\nfunc (d *Context) Next(enumIndex int, getValue bool) bool {\n\tvar __getValue__ int\n\tif getValue {\n\t\t__getValue__ = 1\n\t}\n\treturn int(C.duk_next(d.duk_context, C.duk_idx_t(enumIndex), C.duk_bool_t(__getValue__))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_normalize_index\nfunc (d *Context) NormalizeIndex(index int) int {\n\treturn int(C.duk_normalize_index(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_pcall\nfunc (d *Context) Pcall(nargs int) int {\n\treturn int(C.duk_pcall(d.duk_context, C.duk_idx_t(nargs)))\n}\n\n// See: http://duktape.org/api.html#duk_pcall_method\nfunc (d *Context) PcallMethod(nargs int) int {\n\treturn int(C.duk_pcall_method(d.duk_context, C.duk_idx_t(nargs)))\n}\n\n// See: http://duktape.org/api.html#duk_pcall_prop\nfunc (d *Context) PcallProp(objIndex int, nargs int) int {\n\treturn int(C.duk_pcall_prop(d.duk_context, C.duk_idx_t(objIndex), C.duk_idx_t(nargs)))\n}\n\n// See: http://duktape.org/api.html#duk_pcompile\nfunc (d *Context) Pcompile(flags uint) error {\n\tresult := int(C._duk_pcompile(d.duk_context, C.duk_uint_t(flags)))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_pcompile_file\nfunc (d *Context) PcompileFile(flags uint, path string) error {\n\t__path__ := C.CString(path)\n\tresult := int(C._duk_pcompile_file(d.duk_context, C.duk_uint_t(flags), __path__))\n\tC.free(unsafe.Pointer(__path__))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_pcompile_lstring\nfunc (d *Context) PcompileLstring(flags uint, src string, len int) error {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_pcompile_lstring(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len)))\n\tC.free(unsafe.Pointer(__src__))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_pcompile_lstring_filename\nfunc (d *Context) PcompileLstringFilename(flags uint, src string, len int) error {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_pcompile_lstring_filename(d.duk_context, C.duk_uint_t(flags), __src__, C.duk_size_t(len)))\n\tC.free(unsafe.Pointer(__src__))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_pcompile_string\nfunc (d *Context) PcompileString(flags uint, src string) error {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_pcompile_string(d.duk_context, C.duk_uint_t(flags), __src__))\n\tC.free(unsafe.Pointer(__src__))\n\tfmt.Println(\"result herhehreh\", result)\n\treturn nil //d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_pcompile_string_filename\nfunc (d *Context) PcompileStringFilename(flags uint, src string) error {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_pcompile_string_filename(d.duk_context, C.duk_uint_t(flags), __src__))\n\tC.free(unsafe.Pointer(__src__))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_peval\nfunc (d *Context) Peval() error {\n\tresult := int(C._duk_peval(d.duk_context))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_peval_file\nfunc (d *Context) PevalFile(path string) error {\n\t__path__ := C.CString(path)\n\tresult := int(C._duk_peval_file(d.duk_context, __path__))\n\tC.free(unsafe.Pointer(__path__))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_peval_file_noresult\nfunc (d *Context) PevalFileNoresult(path string) int {\n\t__path__ := C.CString(path)\n\tresult := int(C._duk_peval_file_noresult(d.duk_context, __path__))\n\tC.free(unsafe.Pointer(__path__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_peval_lstring\nfunc (d *Context) PevalLstring(src string, len int) error {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_peval_lstring(d.duk_context, __src__, C.duk_size_t(len)))\n\tC.free(unsafe.Pointer(__src__))\n\treturn d.castStringToError(result)\n\n}\n\n// See: http://duktape.org/api.html#duk_peval_lstring_noresult\nfunc (d *Context) PevalLstringNoresult(src string, len int) int {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_peval_lstring_noresult(d.duk_context, __src__, C.duk_size_t(len)))\n\tC.free(unsafe.Pointer(__src__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_peval_noresult\nfunc (d *Context) PevalNoresult() int {\n\treturn int(C._duk_peval_noresult(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_peval_string\nfunc (d *Context) PevalString(src string) error {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_peval_string(d.duk_context, __src__))\n\tC.free(unsafe.Pointer(__src__))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_peval_string_noresult\nfunc (d *Context) PevalStringNoresult(src string) int {\n\t__src__ := C.CString(src)\n\tresult := int(C._duk_peval_string_noresult(d.duk_context, __src__))\n\tC.free(unsafe.Pointer(__src__))\n\treturn result\n}\n\nfunc (d *Context) castStringToError(result int) error {\n\tif result == 0 {\n\t\treturn nil\n\t}\n\n\terr := &Error{}\n\tfor _, key := range []string{\"name\", \"message\", \"fileName\", \"lineNumber\", \"stack\"} {\n\t\td.GetPropString(-1, key)\n\n\t\tswitch key {\n\t\tcase \"name\":\n\t\t\terr.Type = d.SafeToString(-1)\n\t\tcase \"message\":\n\t\t\terr.Message = d.SafeToString(-1)\n\t\tcase \"fileName\":\n\t\t\terr.FileName = d.SafeToString(-1)\n\t\tcase \"lineNumber\":\n\t\t\tif d.IsNumber(-1) {\n\t\t\t\terr.LineNumber = d.GetInt(-1)\n\t\t\t}\n\t\tcase \"stack\":\n\t\t\terr.Stack = d.SafeToString(-1)\n\t\t}\n\n\t\td.Pop()\n\t}\n\n\treturn err\n}\n\n// See: http://duktape.org/api.html#duk_pop\nfunc (d *Context) Pop() {\n\tif d.GetTop() == 0 {\n\t\treturn\n\t}\n\tC.duk_pop(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_pop_2\nfunc (d *Context) Pop2() {\n\td.PopN(2)\n}\n\n// See: http://duktape.org/api.html#duk_pop_3\nfunc (d *Context) Pop3() {\n\td.PopN(3)\n}\n\n// See: http://duktape.org/api.html#duk_pop_n\nfunc (d *Context) PopN(count int) {\n\tif d.GetTop() < count || count < 1 {\n\t\treturn\n\t}\n\tC.duk_pop_n(d.duk_context, C.duk_idx_t(count))\n}\n\n// See: http://duktape.org/api.html#duk_push_array\nfunc (d *Context) PushArray() int {\n\treturn int(C.duk_push_array(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_push_boolean\nfunc (d *Context) PushBoolean(val bool) {\n\tvar __val__ int\n\tif val {\n\t\t__val__ = 1\n\t}\n\tC.duk_push_boolean(d.duk_context, C.duk_bool_t(__val__))\n}\n\n// See: http://duktape.org/api.html#duk_push_buffer\nfunc (d *Context) PushBuffer(size int, dynamic bool) unsafe.Pointer {\n\tvar __dynamic__ int\n\tif dynamic {\n\t\t__dynamic__ = 1\n\t}\n\treturn C._duk_push_buffer(d.duk_context, C.duk_size_t(size), C.duk_bool_t(__dynamic__))\n}\n\n// See: http://duktape.org/api.html#duk_push_c_function\nfunc (d *Context) PushCFunction(fn *[0]byte, nargs int64) int {\n\treturn int(C.duk_push_c_function(d.duk_context, fn, C.duk_idx_t(nargs)))\n}\n\n// See: http://duktape.org/api.html#duk_push_context_dump\nfunc (d *Context) PushContextDump() {\n\tC.duk_push_context_dump(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_current_function\nfunc (d *Context) PushCurrentFunction() {\n\tC.duk_push_current_function(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_current_thread\nfunc (d *Context) PushCurrentThread() {\n\tC.duk_push_current_thread(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_dynamic_buffer\nfunc (d *Context) PushDynamicBuffer(size int) unsafe.Pointer {\n\treturn C._duk_push_dynamic_buffer(d.duk_context, C.duk_size_t(size))\n}\n\n// See: http://duktape.org/api.html#duk_push_error_object\nfunc (d *Context) PushErrorObject(errCode int, format string, value interface{}) {\n\t__str__ := C.CString(fmt.Sprintf(format, value))\n\tC._duk_push_error_object(d.duk_context, C.duk_errcode_t(errCode), __str__)\n\tC.free(unsafe.Pointer(__str__))\n}\n\n// See: http://duktape.org/api.html#duk_push_false\nfunc (d *Context) PushFalse() {\n\tC.duk_push_false(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_fixed_buffer\nfunc (d *Context) PushFixedBuffer(size int) unsafe.Pointer {\n\treturn C._duk_push_fixed_buffer(d.duk_context, C.duk_size_t(size))\n}\n\n// See: http://duktape.org/api.html#duk_push_global_object\nfunc (d *Context) PushGlobalObject() {\n\tC.duk_push_global_object(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_global_stash\nfunc (d *Context) PushGlobalStash() {\n\tC.duk_push_global_stash(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_heapptr\nfunc (d *Context) PushHeapptr(ptr unsafe.Pointer) {\n\tC.duk_push_heapptr(d.duk_context, ptr)\n}\n\n// See: http://duktape.org/api.html#duk_push_heap_stash\nfunc (d *Context) PushHeapStash() {\n\tC.duk_push_heap_stash(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_int\nfunc (d *Context) PushInt(val int) {\n\tC.duk_push_int(d.duk_context, C.duk_int_t(val))\n}\n\n// See: http://duktape.org/api.html#duk_push_lstring\nfunc (d *Context) PushLstring(str string, len int) string {\n\t__str__ := C.CString(str)\n\tvar result string\n\tif s := C.duk_push_lstring(d.duk_context, __str__, C.duk_size_t(len)); s != nil {\n\t\tresult = C.GoString(s)\n\t}\n\tC.free(unsafe.Pointer(__str__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_push_nan\nfunc (d *Context) PushNan() {\n\tC.duk_push_nan(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_null\nfunc (d *Context) PushNull() {\n\tC.duk_push_null(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_number\nfunc (d *Context) PushNumber(val float64) {\n\tC.duk_push_number(d.duk_context, C.duk_double_t(val))\n}\n\n// See: http://duktape.org/api.html#duk_push_object\nfunc (d *Context) PushObject() int {\n\treturn int(C.duk_push_object(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_push_string\nfunc (d *Context) PushString(str string) string {\n\t__str__ := C.CString(str)\n\tvar result string\n\tif s := C.duk_push_string(d.duk_context, __str__); s != nil {\n\t\tresult = C.GoString(s)\n\t}\n\tC.free(unsafe.Pointer(__str__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_push_string_file\nfunc (d *Context) PushStringFile(path string) string {\n\t__path__ := C.CString(path)\n\tvar result string\n\tif s := C._duk_push_string_file(d.duk_context, __path__); s != nil {\n\t\tresult = C.GoString(s)\n\t}\n\tC.free(unsafe.Pointer(__path__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_push_this\nfunc (d *Context) PushThis() {\n\tC.duk_push_this(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_thread\nfunc (d *Context) PushThread() int {\n\treturn int(C._duk_push_thread(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_push_thread_new_globalenv\nfunc (d *Context) PushThreadNewGlobalenv() int {\n\treturn int(C._duk_push_thread_new_globalenv(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_push_thread_stash\nfunc (d *Context) PushThreadStash(targetCtx *Context) {\n\tC.duk_push_thread_stash(d.duk_context, targetCtx.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_true\nfunc (d *Context) PushTrue() {\n\tC.duk_push_true(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_push_uint\nfunc (d *Context) PushUint(val uint) {\n\tC.duk_push_uint(d.duk_context, C.duk_uint_t(val))\n}\n\n// See: http://duktape.org/api.html#duk_push_undefined\nfunc (d *Context) PushUndefined() {\n\tC.duk_push_undefined(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_put_global_string\nfunc (d *Context) PutGlobalString(key string) bool {\n\t__key__ := C.CString(key)\n\tresult := int(C.duk_put_global_string(d.duk_context, __key__)) == 1\n\tC.free(unsafe.Pointer(__key__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_put_prop\nfunc (d *Context) PutProp(objIndex int) bool {\n\treturn int(C.duk_put_prop(d.duk_context, C.duk_idx_t(objIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_put_prop_index\nfunc (d *Context) PutPropIndex(objIndex int, arrIndex uint) bool {\n\treturn int(C.duk_put_prop_index(d.duk_context, C.duk_idx_t(objIndex), C.duk_uarridx_t(arrIndex))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_put_prop_string\nfunc (d *Context) PutPropString(objIndex int, key string) bool {\n\t__key__ := C.CString(key)\n\tresult := int(C.duk_put_prop_string(d.duk_context, C.duk_idx_t(objIndex), __key__)) == 1\n\tC.free(unsafe.Pointer(__key__))\n\treturn result\n}\n\n// See: http://duktape.org/api.html#duk_remove\nfunc (d *Context) Remove(index int) {\n\tC.duk_remove(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_replace\nfunc (d *Context) Replace(toIndex int) {\n\tC.duk_replace(d.duk_context, C.duk_idx_t(toIndex))\n}\n\n// See: http://duktape.org/api.html#duk_require_boolean\nfunc (d *Context) RequireBoolean(index int) bool {\n\treturn int(C.duk_require_boolean(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_require_buffer\nfunc (d *Context) RequireBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {\n\trawPtr = C.duk_require_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))\n\treturn rawPtr, outSize\n}\n\n// See: http://duktape.org/api.html#duk_require_callable\nfunc (d *Context) RequireCallable(index int) {\n\t// At present, duk_require_callable is a macro that just calls duk_require_function.\n\t// cgo does not support such macros we have to call it directly.\n\tC.duk_require_function(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_require_context\nfunc (d *Context) RequireContext(index int) *Context {\n\treturn contextFromPointer(C.duk_require_context(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_require_function\nfunc (d *Context) RequireFunction(index int) {\n\tC.duk_require_function(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_require_heapptr\nfunc (d *Context) RequireHeapptr(index int) unsafe.Pointer {\n\treturn unsafe.Pointer(C.duk_require_heapptr(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_require_int\nfunc (d *Context) RequireInt(index int) int {\n\treturn int(C.duk_require_int(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_require_lstring\nfunc (d *Context) RequireLstring(index int) string {\n\tif s := C.duk_require_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_require_normalize_index\nfunc (d *Context) RequireNormalizeIndex(index int) int {\n\treturn int(C.duk_require_normalize_index(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_require_null\nfunc (d *Context) RequireNull(index int) {\n\tC.duk_require_null(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_require_number\nfunc (d *Context) RequireNumber(index int) float64 {\n\treturn float64(C.duk_require_number(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_require_object_coercible\nfunc (d *Context) RequireObjectCoercible(index int) {\n\tC._duk_require_object_coercible(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_require_pointer\nfunc (d *Context) RequirePointer(index int) unsafe.Pointer {\n\treturn C.duk_require_pointer(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_require_stack\nfunc (d *Context) RequireStack(extra int) {\n\tC.duk_require_stack(d.duk_context, C.duk_idx_t(extra))\n}\n\n// See: http://duktape.org/api.html#duk_require_stack_top\nfunc (d *Context) RequireStackTop(top int) {\n\tC.duk_require_stack_top(d.duk_context, C.duk_idx_t(top))\n}\n\n// See: http://duktape.org/api.html#duk_require_string\nfunc (d *Context) RequireString(index int) string {\n\tif s := C.duk_require_string(d.duk_context, C.duk_idx_t(index)); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_require_top_index\nfunc (d *Context) RequireTopIndex() int {\n\treturn int(C.duk_require_top_index(d.duk_context))\n}\n\n// See: http://duktape.org/api.html#duk_require_type_mask\nfunc (d *Context) RequireTypeMask(index int, mask uint) {\n\tC._duk_require_type_mask(d.duk_context, C.duk_idx_t(index), C.duk_uint_t(mask))\n}\n\n// See: http://duktape.org/api.html#duk_require_uint\nfunc (d *Context) RequireUint(index int) uint {\n\treturn uint(C.duk_require_uint(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_require_undefined\nfunc (d *Context) RequireUndefined(index int) {\n\tC.duk_require_undefined(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_require_valid_index\nfunc (d *Context) RequireValidIndex(index int) {\n\tC.duk_require_valid_index(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_resize_buffer\nfunc (d *Context) ResizeBuffer(index int, newSize int) unsafe.Pointer {\n\treturn C.duk_resize_buffer(d.duk_context, C.duk_idx_t(index), C.duk_size_t(newSize))\n}\n\n// See: http://duktape.org/api.html#duk_safe_call\nfunc (d *Context) SafeCall(fn, args *[0]byte, nargs, nrets int) int {\n\treturn int(C.duk_safe_call(\n\t\td.duk_context,\n\t\tfn,\n\t\tunsafe.Pointer(&args),\n\t\tC.duk_idx_t(nargs),\n\t\tC.duk_idx_t(nrets),\n\t))\n}\n\n// See: http://duktape.org/api.html#duk_safe_to_lstring\nfunc (d *Context) SafeToLstring(index int) string {\n\tif s := C.duk_safe_to_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_safe_to_string\nfunc (d *Context) SafeToString(index int) string {\n\tif s := C._duk_safe_to_string(d.duk_context, C.duk_idx_t(index)); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_set_finalizer\nfunc (d *Context) SetFinalizer(index int) {\n\tC.duk_set_finalizer(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_set_global_object\nfunc (d *Context) SetGlobalObject() {\n\tC.duk_set_global_object(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_set_magic\nfunc (d *Context) SetMagic(index int, magic int) {\n\tC.duk_set_magic(d.duk_context, C.duk_idx_t(index), C.duk_int_t(magic))\n}\n\n// See: http://duktape.org/api.html#duk_set_prototype\nfunc (d *Context) SetPrototype(index int) {\n\tC.duk_set_prototype(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_set_top\nfunc (d *Context) SetTop(index int) {\n\tC.duk_set_top(d.duk_context, C.duk_idx_t(index))\n}\n\nfunc (d *Context) StrictEquals(index1 int, index2 int) bool {\n\treturn int(C.duk_strict_equals(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_substring\nfunc (d *Context) Substring(index int, startCharOffset int, endCharOffset int) {\n\tC.duk_substring(d.duk_context, C.duk_idx_t(index), C.duk_size_t(startCharOffset), C.duk_size_t(endCharOffset))\n}\n\n// See: http://duktape.org/api.html#duk_swap\nfunc (d *Context) Swap(index1 int, index2 int) {\n\tC.duk_swap(d.duk_context, C.duk_idx_t(index1), C.duk_idx_t(index2))\n}\n\n// See: http://duktape.org/api.html#duk_swap_top\nfunc (d *Context) SwapTop(index int) {\n\tC.duk_swap_top(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_throw\nfunc (d *Context) Throw() {\n\tC.duk_throw_raw(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_to_boolean\nfunc (d *Context) ToBoolean(index int) bool {\n\treturn int(C.duk_to_boolean(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_to_buffer\nfunc (d *Context) ToBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {\n\trawPtr = C._duk_to_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))\n\treturn rawPtr, outSize\n}\n\n// See: http://duktape.org/api.html#duk_to_defaultvalue\nfunc (d *Context) ToDefaultvalue(index int, hint int) {\n\tC.duk_to_defaultvalue(d.duk_context, C.duk_idx_t(index), C.duk_int_t(hint))\n}\n\n// See: http://duktape.org/api.html#duk_to_dynamic_buffer\nfunc (d *Context) ToDynamicBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {\n\trawPtr = C._duk_to_dynamic_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))\n\treturn rawPtr, outSize\n}\n\n// See: http://duktape.org/api.html#duk_to_fixed_buffer\nfunc (d *Context) ToFixedBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) {\n\trawPtr = C._duk_to_fixed_buffer(d.duk_context, C.duk_idx_t(index), (*C.duk_size_t)(unsafe.Pointer(&outSize)))\n\treturn rawPtr, outSize\n}\n\n// See: http://duktape.org/api.html#duk_to_int\nfunc (d *Context) ToInt(index int) int {\n\treturn int(C.duk_to_int(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_to_int32\nfunc (d *Context) ToInt32(index int) int32 {\n\treturn int32(C.duk_to_int32(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_to_lstring\nfunc (d *Context) ToLstring(index int) string {\n\tif s := C.duk_to_lstring(d.duk_context, C.duk_idx_t(index), nil); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_to_null\nfunc (d *Context) ToNull(index int) {\n\tC.duk_to_null(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_to_number\nfunc (d *Context) ToNumber(index int) float64 {\n\treturn float64(C.duk_to_number(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_to_object\nfunc (d *Context) ToObject(index int) {\n\tC.duk_to_object(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_to_pointer\nfunc (d *Context) ToPointer(index int) unsafe.Pointer {\n\treturn C.duk_to_pointer(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_to_primitive\nfunc (d *Context) ToPrimitive(index int, hint int) {\n\tC.duk_to_primitive(d.duk_context, C.duk_idx_t(index), C.duk_int_t(hint))\n}\n\n// See: http://duktape.org/api.html#duk_to_string\nfunc (d *Context) ToString(index int) string {\n\tif s := C.duk_to_string(d.duk_context, C.duk_idx_t(index)); s != nil {\n\t\treturn C.GoString(s)\n\t}\n\treturn \"\"\n}\n\n// See: http://duktape.org/api.html#duk_to_uint\nfunc (d *Context) ToUint(index int) uint {\n\treturn uint(C.duk_to_uint(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_to_uint16\nfunc (d *Context) ToUint16(index int) uint16 {\n\treturn uint16(C.duk_to_uint16(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_to_uint32\nfunc (d *Context) ToUint32(index int) uint32 {\n\treturn uint32(C.duk_to_uint32(d.duk_context, C.duk_idx_t(index)))\n}\n\n// See: http://duktape.org/api.html#duk_to_undefined\nfunc (d *Context) ToUndefined(index int) {\n\tC.duk_to_undefined(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_trim\nfunc (d *Context) Trim(index int) {\n\tC.duk_trim(d.duk_context, C.duk_idx_t(index))\n}\n\n// See: http://duktape.org/api.html#duk_xcopy_top\nfunc (d *Context) XcopyTop(fromCtx *Context, count int) {\n\tC._duk_xcopy_top(d.duk_context, fromCtx.duk_context, C.duk_idx_t(count))\n}\n\n// See: http://duktape.org/api.html#duk_xmove_top\nfunc (d *Context) XmoveTop(fromCtx *Context, count int) {\n\tC._duk_xmove_top(d.duk_context, fromCtx.duk_context, C.duk_idx_t(count))\n}\n\n// See: http://duktape.org/api.html#duk_push_pointer\nfunc (d *Context) PushPointer(p unsafe.Pointer) {\n\tC.duk_push_pointer(d.duk_context, p)\n}\n\n//---[ Duktape 1.3 API ]--- //\n// See: http://duktape.org/api.html#duk_debugger_attach\nfunc (d *Context) DebuggerAttach(\n\treadFn,\n\twriteFn,\n\tpeekFn,\n\treadFlushFn,\n\twriteFlushFn,\n\tdetachedFn *[0]byte,\n\tuData unsafe.Pointer) {\n\tC.duk_debugger_attach(\n\t\td.duk_context,\n\t\treadFn,\n\t\twriteFn,\n\t\tpeekFn,\n\t\treadFlushFn,\n\t\twriteFlushFn,\n\t\tnil,\n\t\tdetachedFn,\n\t\tuData,\n\t)\n}\n\n// See: http://duktape.org/api.html#duk_debugger_cooperate\nfunc (d *Context) DebuggerCooperate() {\n\tC.duk_debugger_cooperate(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_debugger_detach\nfunc (d *Context) DebuggerDetach() {\n\tC.duk_debugger_detach(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_dump_function\nfunc (d *Context) DumpFunction() {\n\tC.duk_dump_function(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_error_va\nfunc (d *Context) ErrorVa(errCode int, a ...interface{}) {\n\tstr := fmt.Sprint(a...)\n\td.Error(errCode, str)\n}\n\n// See: http://duktape.org/api.html#duk_instanceof\nfunc (d *Context) Instanceof(idx1, idx2 int) bool {\n\treturn int(C.duk_instanceof(d.duk_context, C.duk_idx_t(idx1), C.duk_idx_t(idx2))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_is_lightfunc\nfunc (d *Context) IsLightfunc(index int) bool {\n\treturn int(C.duk_is_lightfunc(d.duk_context, C.duk_idx_t(index))) == 1\n}\n\n// See: http://duktape.org/api.html#duk_load_function\nfunc (d *Context) LoadFunction() {\n\tC.duk_load_function(d.duk_context)\n}\n\n// See: http://duktape.org/api.html#duk_log\nfunc (d *Context) Log(loglevel int, format string, value interface{}) {\n\t__str__ := C.CString(fmt.Sprintf(format, value))\n\tC._duk_log(d.duk_context, C.duk_int_t(loglevel), __str__)\n\tC.free(unsafe.Pointer(__str__))\n}\n\n// See: http://duktape.org/api.html#duk_log_va\nfunc (d *Context) LogVa(logLevel int, format string, values ...interface{}) {\n\t__str__ := C.CString(fmt.Sprintf(format, values...))\n\tC._duk_log(d.duk_context, C.duk_int_t(logLevel), __str__)\n\tC.free(unsafe.Pointer(__str__))\n}\n\n// See: http://duktape.org/api.html#duk_pnew\nfunc (d *Context) Pnew(nargs int) error {\n\tresult := int(C.duk_pnew(d.duk_context, C.duk_idx_t(nargs)))\n\treturn d.castStringToError(result)\n}\n\n// See: http://duktape.org/api.html#duk_push_buffer_object\nfunc (d *Context) PushBufferObject(bufferIdx, size, length int, flags uint) {\n\tC.duk_push_buffer_object(\n\t\td.duk_context,\n\t\tC.duk_idx_t(bufferIdx),\n\t\tC.duk_size_t(size),\n\t\tC.duk_size_t(length),\n\t\tC.duk_uint_t(flags),\n\t)\n}\n\n// See: http://duktape.org/api.html#duk_push_c_lightfunc\nfunc (d *Context) PushCLightfunc(fn *[0]byte, nargs, length, magic int) int {\n\treturn int(C.duk_push_c_lightfunc(\n\t\td.duk_context,\n\t\tfn,\n\t\tC.duk_idx_t(nargs),\n\t\tC.duk_idx_t(length),\n\t\tC.duk_int_t(magic),\n\t))\n}\n\n// See: http://duktape.org/api.html#duk_push_error_object_va\nfunc (d *Context) PushErrorObjectVa(errCode int, format string, values ...interface{}) {\n\t__str__ := C.CString(fmt.Sprintf(format, values...))\n\tC._duk_push_error_object(d.duk_context, C.duk_errcode_t(errCode), __str__)\n\tC.free(unsafe.Pointer(__str__))\n}\n\n// See: http://duktape.org/api.html#duk_push_external_buffer\nfunc (d *Context) PushExternalBuffer() {\n\tC._duk_push_external_buffer(d.duk_context)\n}\n\n/**\n * Unimplemented.\n *\n * CharCodeAt see: http://duktape.org/api.html#duk_char_code_at\n * CreateHeap see: http://duktape.org/api.html#duk_create_heap\n * DecodeString see: http://duktape.org/api.html#duk_decode_string\n * Free see: http://duktape.org/api.html#duk_free\n * FreeRaw see: http://duktape.org/api.html#duk_free_raw\n * GetCFunction see: http://duktape.org/api.html#duk_get_c_function\n * GetMemoryFunctions see: http://duktape.org/api.html#duk_get_memory_functions\n * MapString see: http://duktape.org/api.html#duk_map_string\n * PushSprintf see: http://duktape.org/api.html#duk_push_sprintf\n * PushVsprintf see: http://duktape.org/api.html#duk_push_vsprintf\n * PutFunctionList see: http://duktape.org/api.html#duk_put_function_list\n * PutNumberList see: http://duktape.org/api.html#duk_put_number_list\n * Realloc see: http://duktape.org/api.html#duk_realloc\n * ReallocRaw see: http://duktape.org/api.html#duk_realloc_raw\n * RequireCFunction see: http://duktape.org/api.html#duk_require_c_function\n * ConfigBuffer see: http://duktape.org/api.html#duk_config_buffer\n * GetBufferData see: http://duktape.org/api.html#duk_get_buffer_data\n * StealBuffer see: http://duktape.org/api.html#duk_steal_buffer\n * RequireBufferData see: http://duktape.org/api.html#duk_require_buffer_data\n * IsEvalError see: http://duktape.org/api.html#duk_is_eval_error\n */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/appveyor.yml",
    "content": "os: Visual Studio 2015\n\nclone_folder: C:\\gopath\\src\\gopkg.in/olebedev/go-duktape.v3\nclone_depth: 5\nversion: \"{branch}.{build}\"\nenvironment:\n  global:\n    GOPATH: C:\\gopath\n    CC: gcc.exe\n  matrix:\n    - DUKTAPE_ARCH: amd64\n      MSYS2_ARCH: x86_64\n      MSYS2_BITS: 64\n      MSYSTEM: MINGW64\n      PATH: C:\\msys64\\mingw64\\bin\\;C:\\Program Files (x86)\\NSIS\\;%PATH%\n    - DUKTAPE_ARCH: 386\n      MSYS2_ARCH: i686\n      MSYS2_BITS: 32\n      MSYSTEM: MINGW32\n      PATH: C:\\msys64\\mingw32\\bin\\;C:\\Program Files (x86)\\NSIS\\;%PATH%\n\ninstall:\n  - rmdir C:\\go /s /q\n  - appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.2.windows-%DUKTAPE_ARCH%.zip\n  - 7z x go1.9.2.windows-%DUKTAPE_ARCH%.zip -y -oC:\\ > NUL\n  - go version\n  - gcc --version\n\nbuild_script:\n  - go get -t\n  - go install ./...\n\ntest_script:\n  - go test ./...\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/conts.go",
    "content": "package duktape\n\nconst (\n\tCompileEval uint = 1 << iota\n\tCompileFunction\n\tCompileStrict\n\tCompileSafe\n\tCompileNoResult\n\tCompileNoSource\n\tCompileStrlen\n)\n\nconst (\n\tTypeNone Type = iota\n\tTypeUndefined\n\tTypeNull\n\tTypeBoolean\n\tTypeNumber\n\tTypeString\n\tTypeObject\n\tTypeBuffer\n\tTypePointer\n\tTypeLightFunc\n)\n\nconst (\n\tTypeMaskNone uint = 1 << iota\n\tTypeMaskUndefined\n\tTypeMaskNull\n\tTypeMaskBoolean\n\tTypeMaskNumber\n\tTypeMaskString\n\tTypeMaskObject\n\tTypeMaskBuffer\n\tTypeMaskPointer\n\tTypeMaskLightFunc\n)\n\nconst (\n\tEnumIncludeNonenumerable uint = 1 << iota\n\tEnumIncludeInternal\n\tEnumOwnPropertiesOnly\n\tEnumArrayIndicesOnly\n\tEnumSortArrayIndices\n\tNoProxyBehavior\n)\n\nconst (\n\tErrNone int = 0\n\n\t// Internal to Duktape\n\tErrUnimplemented int = 50 + iota\n\tErrUnsupported\n\tErrInternal\n\tErrAlloc\n\tErrAssertion\n\tErrAPI\n\tErrUncaughtError\n)\n\nconst (\n\t// Common prototypes\n\tErrError int = 1 + iota\n\tErrEval\n\tErrRange\n\tErrReference\n\tErrSyntax\n\tErrType\n\tErrURI\n)\n\nconst (\n\t// Returned error values\n\tErrRetUnimplemented int = -(ErrUnimplemented + iota)\n\tErrRetUnsupported\n\tErrRetInternal\n\tErrRetAlloc\n\tErrRetAssertion\n\tErrRetAPI\n\tErrRetUncaughtError\n)\n\nconst (\n\tErrRetError int = -(ErrError + iota)\n\tErrRetEval\n\tErrRetRange\n\tErrRetReference\n\tErrRetSyntax\n\tErrRetType\n\tErrRetURI\n)\n\nconst (\n\tExecSuccess = iota\n\tExecError\n)\n\nconst (\n\tLogTrace int = iota\n\tLogDebug\n\tLogInfo\n\tLogWarn\n\tLogError\n\tLogFatal\n)\n\nconst (\n\tBufobjDuktapeAuffer     = 0\n\tBufobjNodejsAuffer      = 1\n\tBufobjArraybuffer       = 2\n\tBufobjDataview          = 3\n\tBufobjInt8array         = 4\n\tBufobjUint8array        = 5\n\tBufobjUint8clampedarray = 6\n\tBufobjInt16array        = 7\n\tBufobjUint16array       = 8\n\tBufobjInt32array        = 9\n\tBufobjUint32array       = 10\n\tBufobjFloat32array      = 11\n\tBufobjFloat64array      = 12\n)\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.c",
    "content": "/*\n *  Pool allocator for low memory targets.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdint.h>\n#include <stdarg.h>\n#include \"duktape.h\"\n#include \"duk_alloc_pool.h\"\n\n/* Define to enable some debug printfs. */\n/* #define DUK_ALLOC_POOL_DEBUG */\n\n/* Define to enable approximate waste tracking. */\n/* #define DUK_ALLOC_POOL_TRACK_WASTE */\n\n/* Define to track global highwater for used and waste bytes.  VERY SLOW, only\n * useful for manual testing.\n */\n/* #define DUK_ALLOC_POOL_TRACK_HIGHWATER */\n\n#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)\n#if 0  /* This extern declaration is provided by duktape.h, array provided by duktape.c. */\nextern const void * const duk_rom_compressed_pointers[];\n#endif\nconst void *duk_alloc_pool_romptr_low = NULL;\nconst void *duk_alloc_pool_romptr_high = NULL;\nstatic void duk__alloc_pool_romptr_init(void);\n#endif\n\n#if defined(DUK_USE_HEAPPTR16)\nvoid *duk_alloc_pool_ptrcomp_base = NULL;\n#endif\n\n#if defined(DUK_ALLOC_POOL_DEBUG)\nstatic void duk__alloc_pool_dprintf(const char *fmt, ...) {\n\tva_list ap;\n\tva_start(ap, fmt);\n\tvfprintf(stderr, fmt, ap);\n\tva_end(ap);\n}\n#endif\n\n/*\n *  Pool initialization\n */\n\nvoid *duk_alloc_pool_init(char *buffer,\n                          size_t size,\n                          const duk_pool_config *configs,\n                          duk_pool_state *states,\n                          int num_pools,\n                          duk_pool_global *global) {\n\tdouble t_min, t_max, t_curr, x;\n\tint step, i, j, n;\n\tsize_t total;\n\tchar *p;\n\n\t/* XXX: check that 'size' is not too large when using pointer\n\t * compression.\n\t */\n\n\t/* To optimize pool counts first come up with a 't' which still allows\n\t * total pool size to fit within user provided region.  After that\n\t * sprinkle any remaining bytes to the counts.  Binary search with a\n\t * fixed step count; last round uses 't_min' as 't_curr' to ensure it\n\t * succeeds.\n\t */\n\n\tt_min = 0.0;  /* Unless config is insane, this should always be \"good\". */\n\tt_max = 1e6;\n\n\tfor (step = 0; ; step++) {\n\t\tif (step >= 100) {\n\t\t\t/* Force \"known good\", rerun config, and break out.\n\t\t\t * Deals with rounding corner cases where t_curr is\n\t\t\t * persistently \"bad\" even though t_min is a valid\n\t\t\t * solution.\n\t\t\t */\n\t\t\tt_curr = t_min;\n\t\t} else {\n\t\t\tt_curr = (t_min + t_max) / 2.0;\n\t\t}\n\n\t\tfor (i = 0, total = 0; i < num_pools; i++) {\n\t\t\tstates[i].size = configs[i].size;\n\n\t\t\t/* Target bytes = A*t + B ==> target count = (A*t + B) / block_size.\n\t\t\t * Rely on A and B being small enough so that 'x' won't wrap.\n\t\t\t */\n\t\t\tx = ((double) configs[i].a * t_curr + (double) configs[i].b) / (double) configs[i].size;\n\n\t\t\tstates[i].count = (unsigned int) x;\n\t\t\ttotal += (size_t) states[i].size * (size_t) states[i].count;\n\t\t\tif (total > size) {\n\t\t\t\tgoto bad;\n\t\t\t}\n\t\t}\n\n\t\t/* t_curr is good. */\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\t\tduk__alloc_pool_dprintf(\"duk_alloc_pool_init: step=%d, t=[%lf %lf %lf] -> total %ld/%ld (good)\\n\",\n\t\t                        step, t_min, t_curr, t_max, (long) total, (long) size);\n#endif\n\t\tif (step >= 100) {\n\t\t\t/* Keep state[] initialization state.  The state was\n\t\t\t * created using the highest 't_min'.\n\t\t\t */\n\t\t\tbreak;\n\t\t}\n\t\tt_min = t_curr;\n\t\tcontinue;\n\n\t bad:\n\t\t/* t_curr is bad. */\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\t\tduk__alloc_pool_dprintf(\"duk_alloc_pool_init: step=%d, t=[%lf %lf %lf] -> total %ld/%ld (bad)\\n\",\n\t\t                        step, t_min, t_curr, t_max, (long) total, (long) size);\n#endif\n\n\t\tif (step >= 1000) {\n\t\t\t/* Cannot find any good solution; shouldn't happen\n\t\t\t * unless config is bad or 'size' is so small that\n\t\t\t * even a baseline allocation won't fit.\n\t\t\t */\n\t\t\treturn NULL;\n\t\t}\n\t\tt_max = t_curr;\n\t\t/* continue */\n\t}\n\n\t/* The base configuration is now good; sprinkle any leftovers to\n\t * pools in descending order.  Note that for good t_curr, 'total'\n\t * indicates allocated bytes so far and 'size - total' indicates\n\t * leftovers.\n\t */\n\tfor (i = num_pools - 1; i >= 0; i--) {\n\t\twhile (size - total >= states[i].size) {\n\t\t\t/* Ignore potential wrapping of states[i].count as the count\n\t\t\t * is 32 bits and shouldn't wrap in practice.\n\t\t\t */\n\t\t\tstates[i].count++;\n\t\t\ttotal += states[i].size;\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\t\t\tduk__alloc_pool_dprintf(\"duk_alloc_pool_init: sprinkle %ld bytes (%ld left after) to pool index %ld, new count %ld\\n\",\n\t\t\t                        (long) states[i].size, (long) (size - total), (long) i, (long) states[i].count);\n#endif\n\t\t}\n\t}\n\n\t/* Pool counts are final.  Allocate the user supplied region based\n\t * on the final counts, initialize free lists for each block size,\n\t * and otherwise finalize 'state' for use.\n\t */\n\tp = buffer;\n\tglobal->num_pools = num_pools;\n\tglobal->states = states;\n#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\tduk__alloc_pool_dprintf(\"duk_alloc_pool_init: global highwater mark tracking enabled, THIS IS VERY SLOW!\\n\");\n#endif\n\tglobal->hwm_used_bytes = 0U;\n\tglobal->hwm_waste_bytes = 0U;\n#endif\n#if defined(DUK_ALLOC_POOL_TRACK_WASTE)\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\tduk__alloc_pool_dprintf(\"duk_alloc_pool_init: approximate waste tracking enabled\\n\");\n#endif\n#endif\n\n#if defined(DUK_USE_HEAPPTR16)\n\t/* Register global base value for pointer compression, assumes\n\t * a single active pool  -4 allows a single subtract to be used and\n\t * still ensures no non-NULL pointer encodes to zero.\n\t */\n\tduk_alloc_pool_ptrcomp_base = (void *) (p - 4);\n#endif\n\n\tfor (i = 0; i < num_pools; i++) {\n\t\tn = (int) states[i].count;\n\t\tif (n > 0) {\n\t\t\tstates[i].first = (duk_pool_free *) p;\n\t\t\tfor (j = 0; j < n; j++) {\n\t\t\t\tchar *p_next = p + states[i].size;\n\t\t\t\t((duk_pool_free *) p)->next =\n\t\t\t\t\t(j == n - 1) ? (duk_pool_free *) NULL : (duk_pool_free *) p_next;\n\t\t\t\tp = p_next;\n\t\t\t}\n\t\t} else {\n\t\t\tstates[i].first = (duk_pool_free *) NULL;\n\t\t}\n\t\tstates[i].alloc_end = p;\n#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)\n\t\tstates[i].hwm_used_count = 0;\n#endif\n\t\t/* All members of 'state' now initialized. */\n\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\t\tduk__alloc_pool_dprintf(\"duk_alloc_pool_init: block size %5ld, count %5ld, %8ld total bytes, \"\n\t\t                        \"end %p\\n\",\n\t\t                        (long) states[i].size, (long) states[i].count,\n\t\t                        (long) states[i].size * (long) states[i].count,\n\t\t                        (void *) states[i].alloc_end);\n#endif\n\t}\n\n#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)\n\t/* ROM pointer compression precomputation.  Assumes a single active\n\t * pool.\n\t */\n\tduk__alloc_pool_romptr_init();\n#endif\n\n\t/* Use 'global' as udata. */\n\treturn (void *) global;\n}\n\n/*\n *  Misc helpers\n */\n\n#if defined(DUK_ALLOC_POOL_TRACK_WASTE)\nstatic void duk__alloc_pool_set_waste_marker(void *ptr, size_t used, size_t size) {\n\t/* Rely on the base pointer and size being divisible by 4 and thus\n\t * aligned.  Use 32-bit markers: a 4-byte resolution is good enough,\n\t * and comparing 32 bits at a time makes false waste estimates less\n\t * likely than when comparing as bytes.\n\t */\n\tduk_uint32_t *p, *p_start, *p_end;\n\tsize_t used_round;\n\n\tused_round = (used + 3U) & ~0x03U;  /* round up to 4 */\n\tp_end = (duk_uint32_t *) ((duk_uint8_t *) ptr + size);\n\tp_start = (duk_uint32_t *) ((duk_uint8_t *) ptr + used_round);\n\tp = (duk_uint32_t *) p_start;\n\twhile (p != p_end) {\n\t\t*p++ = DUK_ALLOC_POOL_WASTE_MARKER;\n\t}\n}\n#else  /* DUK_ALLOC_POOL_TRACK_WASTE */\nstatic void duk__alloc_pool_set_waste_marker(void *ptr, size_t used, size_t size) {\n\t(void) ptr; (void) used; (void) size;\n}\n#endif  /* DUK_ALLOC_POOL_TRACK_WASTE */\n\n#if defined(DUK_ALLOC_POOL_TRACK_WASTE)\nstatic size_t duk__alloc_pool_get_waste_estimate(void *ptr, size_t size) {\n\tduk_uint32_t *p, *p_end, *p_start;\n\n\t/* Assumes size is >= 4. */\n\tp_start = (duk_uint32_t *) ptr;\n\tp_end = (duk_uint32_t *) ((duk_uint8_t *) ptr + size);\n\tp = p_end;\n\n\t/* This scan may cause harmless valgrind complaints: there may be\n\t * uninitialized bytes within the legitimate allocation or between\n\t * the start of the waste marker and the end of the allocation.\n\t */\n\tdo {\n\t\tp--;\n\t\tif (*p == DUK_ALLOC_POOL_WASTE_MARKER) {\n\t\t\t;\n\t\t} else {\n\t\t\treturn (size_t) (p_end - p - 1) * 4U;\n\t\t}\n\t} while (p != p_start);\n\n\treturn size;\n}\n#else  /* DUK_ALLOC_POOL_TRACK_WASTE */\nstatic size_t duk__alloc_pool_get_waste_estimate(void *ptr, size_t size) {\n\t(void) ptr; (void) size;\n\treturn 0;\n}\n#endif  /* DUK_ALLOC_POOL_TRACK_WASTE */\n\nstatic int duk__alloc_pool_ptr_in_freelist(duk_pool_state *s, void *ptr) {\n\tduk_pool_free *curr;\n\n\tfor (curr = s->first; curr != NULL; curr = curr->next) {\n\t\tif ((void *) curr == ptr) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn 0;\n}\n\nvoid duk_alloc_pool_get_pool_stats(duk_pool_state *s, duk_pool_stats *res) {\n\tvoid *curr;\n\tsize_t free_count;\n\tsize_t used_count;\n\tsize_t waste_bytes;\n\n\tcurr = s->alloc_end - (s->size * s->count);\n\tfree_count = 0U;\n\twaste_bytes = 0U;\n\twhile (curr != s->alloc_end) {\n\t\tif (duk__alloc_pool_ptr_in_freelist(s, curr)) {\n\t\t\tfree_count++;\n\t\t} else {\n\t\t\twaste_bytes += duk__alloc_pool_get_waste_estimate(curr, s->size);\n\t\t}\n\t\tcurr = curr + s->size;\n\t}\n\tused_count = (size_t) (s->count - free_count);\n\n\tres->used_count = used_count;\n\tres->used_bytes = (size_t) (used_count * s->size);\n\tres->free_count = free_count;\n\tres->free_bytes = (size_t) (free_count * s->size);\n\tres->waste_bytes = waste_bytes;\n#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)\n\tres->hwm_used_count = s->hwm_used_count;\n#else\n\tres->hwm_used_count = 0U;\n#endif\n}\n\nvoid duk_alloc_pool_get_global_stats(duk_pool_global *g, duk_pool_global_stats *res) {\n\tint i;\n\tsize_t total_used = 0U;\n\tsize_t total_free = 0U;\n\tsize_t total_waste = 0U;\n\n\tfor (i = 0; i < g->num_pools; i++) {\n\t\tduk_pool_state *s = &g->states[i];\n\t\tduk_pool_stats stats;\n\n\t\tduk_alloc_pool_get_pool_stats(s, &stats);\n\n\t\ttotal_used += stats.used_bytes;\n\t\ttotal_free += stats.free_bytes;\n\t\ttotal_waste += stats.waste_bytes;\n\t}\n\n\tres->used_bytes = total_used;\n\tres->free_bytes = total_free;\n\tres->waste_bytes = total_waste;\n#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)\n\tres->hwm_used_bytes = g->hwm_used_bytes;\n\tres->hwm_waste_bytes = g->hwm_waste_bytes;\n#else\n\tres->hwm_used_bytes = 0U;\n\tres->hwm_waste_bytes = 0U;\n#endif\n}\n\n#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)\nstatic void duk__alloc_pool_update_highwater(duk_pool_global *g) {\n\tint i;\n\tsize_t total_used = 0U;\n\tsize_t total_free = 0U;\n\tsize_t total_waste = 0U;\n\n\t/* Per pool highwater used count, useful to checking if a pool is\n\t * too small.\n\t */\n\tfor (i = 0; i < g->num_pools; i++) {\n\t\tduk_pool_state *s = &g->states[i];\n\t\tduk_pool_stats stats;\n\n\t\tduk_alloc_pool_get_pool_stats(s, &stats);\n\t\tif (stats.used_count > s->hwm_used_count) {\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\t\t\tduk__alloc_pool_dprintf(\"duk__alloc_pool_update_highwater: pool %ld (%ld bytes) highwater updated: count %ld -> %ld\\n\",\n\t\t\t                        (long) i, (long) s->size,\n\t\t\t                        (long) s->hwm_used_count, (long) stats.used_count);\n#endif\n\t\t\ts->hwm_used_count = stats.used_count;\n\t\t}\n\n\t\ttotal_used += stats.used_bytes;\n\t\ttotal_free += stats.free_bytes;\n\t\ttotal_waste += stats.waste_bytes;\n\t}\n\n\t/* Global highwater mark for used and waste bytes.  Both fields are\n\t * updated from the same snapshot based on highest used count.\n\t * This is VERY, VERY slow and only useful for development.\n\t * (Note that updating HWM states for pools individually and then\n\t * summing them won't create a consistent global snapshot.  There\n\t * are still easy ways to make this much, much faster.)\n\t */\n\tif (total_used > g->hwm_used_bytes) {\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\t\tduk__alloc_pool_dprintf(\"duk__alloc_pool_update_highwater: global highwater updated: used=%ld, bytes=%ld -> \"\n\t\t                        \"used=%ld, bytes=%ld\\n\",\n\t\t                        (long) g->hwm_used_bytes, (long) g->hwm_waste_bytes,\n\t\t                        (long) total_used, (long) total_waste);\n#endif\n\t\tg->hwm_used_bytes = total_used;\n\t\tg->hwm_waste_bytes = total_waste;\n\t}\n}\n#else  /* DUK_ALLOC_POOL_TRACK_HIGHWATER */\nstatic void duk__alloc_pool_update_highwater(duk_pool_global *g) {\n\t(void) g;\n}\n#endif  /* DUK_ALLOC_POOL_TRACK_HIGHWATER */\n\n/*\n *  Allocation providers\n */\n\nvoid *duk_alloc_pool(void *udata, duk_size_t size) {\n\tduk_pool_global *g = (duk_pool_global *) udata;\n\tint i, n;\n\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\tduk__alloc_pool_dprintf(\"duk_alloc_pool: %p %ld\\n\", udata, (long) size);\n#endif\n\n\tif (size == 0) {\n\t\treturn NULL;\n\t}\n\n\tfor (i = 0, n = g->num_pools; i < n; i++) {\n\t\tduk_pool_state *st = g->states + i;\n\n\t\tif (size <= st->size) {\n\t\t\tduk_pool_free *res = st->first;\n\t\t\tif (res != NULL) {\n\t\t\t\tst->first = res->next;\n\t\t\t\tduk__alloc_pool_set_waste_marker((void *) res, size, st->size);\n\t\t\t\tduk__alloc_pool_update_highwater(g);\n\t\t\t\treturn (void *) res;\n\t\t\t}\n\t\t}\n\n\t\t/* Allocation doesn't fit or no free entries, try to borrow\n\t\t * from the next block size.  There's no support for preventing\n\t\t * a borrow at present.\n\t\t */\n\t}\n\n\treturn NULL;\n}\n\nvoid *duk_realloc_pool(void *udata, void *ptr, duk_size_t size) {\n\tduk_pool_global *g = (duk_pool_global *) udata;\n\tint i, j, n;\n\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\tduk__alloc_pool_dprintf(\"duk_realloc_pool: %p %p %ld\\n\", udata, ptr, (long) size);\n#endif\n\n\tif (ptr == NULL) {\n\t\treturn duk_alloc_pool(udata, size);\n\t}\n\tif (size == 0) {\n\t\tduk_free_pool(udata, ptr);\n\t\treturn NULL;\n\t}\n\n\t/* Non-NULL pointers are necessarily from the pool so we should\n\t * always be able to find the allocation.\n\t */\n\n\tfor (i = 0, n = g->num_pools; i < n; i++) {\n\t\tduk_pool_state *st = g->states + i;\n\t\tchar *new_ptr;\n\n\t\t/* Because 'ptr' is assumed to be in the pool and pools are\n\t\t * allocated in sequence, it suffices to check for end pointer\n\t\t * only.\n\t\t */\n\t\tif ((char *) ptr >= st->alloc_end) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (size <= st->size) {\n\t\t\t/* Allocation still fits existing allocation.  Check if\n\t\t\t * we can shrink the allocation to a smaller block size\n\t\t\t * (smallest possible).\n\t\t\t */\n\t\t\tfor (j = 0; j < i; j++) {\n\t\t\t\tduk_pool_state *st2 = g->states + j;\n\n\t\t\t\tif (size <= st2->size) {\n\t\t\t\t\tnew_ptr = (char *) st2->first;\n\t\t\t\t\tif (new_ptr != NULL) {\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\t\t\t\t\t\tduk__alloc_pool_dprintf(\"duk_realloc_pool: shrink, block size %ld -> %ld\\n\",\n\t\t\t\t\t\t                        (long) st->size, (long) st2->size);\n#endif\n\t\t\t\t\t\tst2->first = ((duk_pool_free *) new_ptr)->next;\n\t\t\t\t\t\tmemcpy((void *) new_ptr, (const void *) ptr, (size_t) size);\n\t\t\t\t\t\t((duk_pool_free *) ptr)->next = st->first;\n\t\t\t\t\t\tst->first = (duk_pool_free *) ptr;\n\t\t\t\t\t\tduk__alloc_pool_set_waste_marker((void *) new_ptr, size, st2->size);\n\t\t\t\t\t\tduk__alloc_pool_update_highwater(g);\n\t\t\t\t\t\treturn (void *) new_ptr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Failed to shrink; return existing pointer. */\n\t\t\tduk__alloc_pool_set_waste_marker((void *) ptr, size, st->size);\n\t\t\treturn ptr;\n\t\t}\n\n\t\t/* Find first free larger block. */\n\t\tfor (j = i + 1; j < n; j++) {\n\t\t\tduk_pool_state *st2 = g->states + j;\n\n\t\t\tif (size <= st2->size) {\n\t\t\t\tnew_ptr = (char *) st2->first;\n\t\t\t\tif (new_ptr != NULL) {\n\t\t\t\t\tst2->first = ((duk_pool_free *) new_ptr)->next;\n\t\t\t\t\tmemcpy((void *) new_ptr, (const void *) ptr, (size_t) st->size);\n\t\t\t\t\t((duk_pool_free *) ptr)->next = st->first;\n\t\t\t\t\tst->first = (duk_pool_free *) ptr;\n\t\t\t\t\tduk__alloc_pool_set_waste_marker((void *) new_ptr, size, st2->size);\n\t\t\t\t\tduk__alloc_pool_update_highwater(g);\n\t\t\t\t\treturn (void *) new_ptr;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* Failed to resize. */\n\t\treturn NULL;\n\t}\n\n\t/* We should never be here because 'ptr' should be a valid pool\n\t * entry and thus always found above.\n\t */\n\treturn NULL;\n}\n\nvoid duk_free_pool(void *udata, void *ptr) {\n\tduk_pool_global *g = (duk_pool_global *) udata;\n\tint i, n;\n\n#if defined(DUK_ALLOC_POOL_DEBUG)\n\tduk__alloc_pool_dprintf(\"duk_free_pool: %p %p\\n\", udata, ptr);\n#endif\n\n\tif (ptr == NULL) {\n\t\treturn;\n\t}\n\n\tfor (i = 0, n = g->num_pools; i < n; i++) {\n\t\tduk_pool_state *st = g->states + i;\n\n\t\t/* Enough to check end address only. */\n\t\tif ((char *) ptr >= st->alloc_end) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t((duk_pool_free *) ptr)->next = st->first;\n\t\tst->first = (duk_pool_free *) ptr;\n#if 0  /* never necessary when freeing */\n\t\tduk__alloc_pool_update_highwater(g);\n#endif\n\t\treturn;\n\t}\n\n\t/* We should never be here because 'ptr' should be a valid pool\n\t * entry and thus always found above.\n\t */\n}\n\n/*\n *  Pointer compression\n */\n\n#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)\nstatic void duk__alloc_pool_romptr_init(void) {\n\t/* Scan ROM pointer range for faster detection of \"is 'p' a ROM pointer\"\n\t * later on.\n\t */\n\tconst void * const * ptrs = (const void * const *) duk_rom_compressed_pointers;\n\tduk_alloc_pool_romptr_low = duk_alloc_pool_romptr_high = (const void *) *ptrs;\n\twhile (*ptrs) {\n\t\tif (*ptrs > duk_alloc_pool_romptr_high) {\n\t\t\tduk_alloc_pool_romptr_high = (const void *) *ptrs;\n\t\t}\n\t\tif (*ptrs < duk_alloc_pool_romptr_low) {\n\t\t\tduk_alloc_pool_romptr_low = (const void *) *ptrs;\n\t\t}\n\t\tptrs++;\n\t}\n}\n#endif\n\n/* Encode/decode functions are defined in the header to allow inlining. */\n\n#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)\nduk_uint16_t duk_alloc_pool_enc16_rom(void *ptr) {\n\t/* The if-condition should be the fastest possible check\n\t * for \"is 'ptr' in ROM?\".  If pointer is in ROM, we'd like\n\t * to compress it quickly.  Here we just scan a ~1K array\n\t * which is very bad for performance.\n\t */\n\tconst void * const * ptrs = duk_rom_compressed_pointers;\n\twhile (*ptrs) {\n\t\tif (*ptrs == ptr) {\n\t\t\treturn DUK_ALLOC_POOL_ROMPTR_FIRST + (duk_uint16_t) (ptrs - duk_rom_compressed_pointers);\n\t\t}\n\t\tptrs++;\n\t}\n\n\t/* We should really never be here: Duktape should only be\n\t * compressing pointers which are in the ROM compressed\n\t * pointers list, which are known at 'make dist' time.\n\t * We go on, causing a pointer compression error.\n\t */\n\treturn 0;\n}\n#endif\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_alloc_pool.h",
    "content": "#if !defined(DUK_ALLOC_POOL_H_INCLUDED)\n#define DUK_ALLOC_POOL_H_INCLUDED\n\n#include \"duktape.h\"\n\n/* 32-bit (big endian) marker used at the end of pool entries so that wasted\n * space can be detected.  Waste tracking must be enabled explicitly.\n */\n#if defined(DUK_ALLOC_POOL_TRACK_WASTE)\n#define DUK_ALLOC_POOL_WASTE_MARKER  0xedcb2345UL\n#endif\n\n/* Pointer compression with ROM strings/objects:\n *\n * For now, use DUK_USE_ROM_OBJECTS to signal the need for compressed ROM\n * pointers.  DUK_USE_ROM_PTRCOMP_FIRST is provided for the ROM pointer\n * compression range minimum to avoid duplication in user code.\n */\n#if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16)\n#define DUK_ALLOC_POOL_ROMPTR_COMPRESSION\n#define DUK_ALLOC_POOL_ROMPTR_FIRST DUK_USE_ROM_PTRCOMP_FIRST\n\n/* This extern declaration is provided by duktape.h, array provided by duktape.c.\n * Because duk_config.h may include this file (to get the inline functions) we\n * need to forward declare this also here.\n */\nextern const void * const duk_rom_compressed_pointers[];\n#endif\n\n/* Pool configuration for a certain block size. */\ntypedef struct {\n\tunsigned int size;  /* must be divisible by 4 and >= sizeof(void *) */\n\tunsigned int a;     /* bytes (not count) to allocate: a*t + b, t is an arbitrary scale parameter */\n\tunsigned int b;\n} duk_pool_config;\n\n/* Freelist entry, must fit into the smallest block size. */\nstruct duk_pool_free;\ntypedef struct duk_pool_free duk_pool_free;\nstruct duk_pool_free {\n\tduk_pool_free *next;\n};\n\n/* Pool state for a certain block size. */\ntypedef struct {\n\tduk_pool_free *first;\n\tchar *alloc_end;\n\tunsigned int size;\n\tunsigned int count;\n#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)\n\tunsigned int hwm_used_count;\n#endif\n} duk_pool_state;\n\n/* Statistics for a certain pool. */\ntypedef struct {\n\tsize_t used_count;\n\tsize_t used_bytes;\n\tsize_t free_count;\n\tsize_t free_bytes;\n\tsize_t waste_bytes;\n\tsize_t hwm_used_count;\n} duk_pool_stats;\n\n/* Top level state for all pools.  Pointer to this struct is used as the allocator\n * userdata pointer.\n */\ntypedef struct {\n\tint num_pools;\n\tduk_pool_state *states;\n#if defined(DUK_ALLOC_POOL_TRACK_HIGHWATER)\n\tsize_t hwm_used_bytes;\n\tsize_t hwm_waste_bytes;\n#endif\n} duk_pool_global;\n\n/* Statistics for the entire set of pools. */\ntypedef struct {\n\tsize_t used_bytes;\n\tsize_t free_bytes;\n\tsize_t waste_bytes;\n\tsize_t hwm_used_bytes;\n\tsize_t hwm_waste_bytes;\n} duk_pool_global_stats;\n\n/* Initialize a pool allocator, arguments:\n *   - buffer and size: continuous region to use for pool, must align to 4\n *   - config: configuration for pools in ascending block size\n *   - state: state for pools, matches config order\n *   - num_pools: number of entries in 'config' and 'state'\n *   - global: global state structure\n *\n * The 'config', 'state', and 'global' pointers must be valid beyond the init\n * call, as long as the pool is used.\n *\n * Returns a void pointer to be used as userdata for the allocator functions.\n * Concretely the return value will be \"(void *) global\", i.e. the global\n * state struct.  If pool init fails, the return value will be NULL.\n */\nvoid *duk_alloc_pool_init(char *buffer,\n                          size_t size,\n                          const duk_pool_config *configs,\n                          duk_pool_state *states,\n                          int num_pools,\n                          duk_pool_global *global);\n\n/* Duktape allocation providers.  Typing matches Duktape requirements. */\nvoid *duk_alloc_pool(void *udata, duk_size_t size);\nvoid *duk_realloc_pool(void *udata, void *ptr, duk_size_t size);\nvoid duk_free_pool(void *udata, void *ptr);\n\n/* Stats. */\nvoid duk_alloc_pool_get_pool_stats(duk_pool_state *s, duk_pool_stats *res);\nvoid duk_alloc_pool_get_global_stats(duk_pool_global *g, duk_pool_global_stats *res);\n\n/* Duktape pointer compression global state (assumes single pool). */\n#if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16)\nextern const void *duk_alloc_pool_romptr_low;\nextern const void *duk_alloc_pool_romptr_high;\nduk_uint16_t duk_alloc_pool_enc16_rom(void *ptr);\n#endif\n#if defined(DUK_USE_HEAPPTR16)\nextern void *duk_alloc_pool_ptrcomp_base;\n#endif\n\n#if 0\nduk_uint16_t duk_alloc_pool_enc16(void *ptr);\nvoid *duk_alloc_pool_dec16(duk_uint16_t val);\n#endif\n\n/* Inlined pointer compression functions.  Gcc and clang -Os won't in\n * practice inline these without an \"always inline\" attribute because it's\n * more size efficient (by a few kB) to use explicit calls instead.  Having\n * these defined inline here allows performance optimized builds to inline\n * pointer compression operations.\n *\n * Pointer compression assumes there's a single globally registered memory\n * pool which makes pointer compression more efficient.  This would be easy\n * to fix by adding a userdata pointer to the compression functions and\n * plumbing the heap userdata from the compression/decompression macros.\n */\n\n/* DUK_ALWAYS_INLINE is not a public API symbol so it may go away in even a\n * minor update.  But it's pragmatic for this extra because it handles many\n * compilers via duk_config.h detection.  Check that the macro exists so that\n * if it's gone, we can still compile.\n */\n#if defined(DUK_ALWAYS_INLINE)\n#define DUK__ALLOC_POOL_ALWAYS_INLINE DUK_ALWAYS_INLINE\n#else\n#define DUK__ALLOC_POOL_ALWAYS_INLINE /* nop */\n#endif\n\n#if defined(DUK_USE_HEAPPTR16)\nstatic DUK__ALLOC_POOL_ALWAYS_INLINE duk_uint16_t duk_alloc_pool_enc16(void *ptr) {\n\tif (ptr == NULL) {\n\t\t/* With 'return 0' gcc and clang -Os generate inefficient code.\n\t\t * For example, gcc -Os generates:\n\t\t *\n\t\t *   0804911d <duk_alloc_pool_enc16>:\n\t\t *    804911d:       55                      push   %ebp\n\t\t *    804911e:       85 c0                   test   %eax,%eax\n\t\t *    8049120:       89 e5                   mov    %esp,%ebp\n\t\t *    8049122:       74 0b                   je     804912f <duk_alloc_pool_enc16+0x12>\n\t\t *    8049124:       2b 05 e4 90 07 08       sub    0x80790e4,%eax\n\t\t *    804912a:       c1 e8 02                shr    $0x2,%eax\n\t\t *    804912d:       eb 02                   jmp    8049131 <duk_alloc_pool_enc16+0x14>\n\t\t *    804912f:       31 c0                   xor    %eax,%eax\n\t\t *    8049131:       5d                      pop    %ebp\n\t\t *    8049132:       c3                      ret\n\t\t *\n\t\t * The NULL path checks %eax for zero; if it is zero, a zero\n\t\t * is unnecessarily loaded into %eax again.  The non-zero path\n\t\t * has an unnecessary jump as a side effect of this.\n\t\t *\n\t\t * Using 'return (duk_uint16_t) (intptr_t) ptr;' generates similarly\n\t\t * inefficient code; not sure how to make the result better.\n\t\t */\n\t\treturn 0;\n\t}\n#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)\n\tif (ptr >= duk_alloc_pool_romptr_low && ptr <= duk_alloc_pool_romptr_high) {\n\t\t/* This is complex enough now to need a separate function. */\n\t\treturn duk_alloc_pool_enc16_rom(ptr);\n\t}\n#endif\n\treturn (duk_uint16_t) (((size_t) ((char *) ptr - (char *) duk_alloc_pool_ptrcomp_base)) >> 2);\n}\n\nstatic DUK__ALLOC_POOL_ALWAYS_INLINE void *duk_alloc_pool_dec16(duk_uint16_t val) {\n\tif (val == 0) {\n\t\t/* As with enc16 the gcc and clang -Os output is inefficient,\n\t\t * e.g. gcc -Os:\n\t\t *\n\t\t *   08049133 <duk_alloc_pool_dec16>:\n\t\t *    8049133:       55                      push   %ebp\n\t\t *    8049134:       66 85 c0                test   %ax,%ax\n\t\t *    8049137:       89 e5                   mov    %esp,%ebp\n\t\t *    8049139:       74 0e                   je     8049149 <duk_alloc_pool_dec16+0x16>\n\t\t *    804913b:       8b 15 e4 90 07 08       mov    0x80790e4,%edx\n\t\t *    8049141:       0f b7 c0                movzwl %ax,%eax\n\t\t *    8049144:       8d 04 82                lea    (%edx,%eax,4),%eax\n\t\t *    8049147:       eb 02                   jmp    804914b <duk_alloc_pool_dec16+0x18>\n\t\t *    8049149:       31 c0                   xor    %eax,%eax\n\t\t *    804914b:       5d                      pop    %ebp\n\t\t *    804914c:       c3                      ret\n\t\t */\n\t\treturn NULL;\n\t}\n#if defined(DUK_ALLOC_POOL_ROMPTR_COMPRESSION)\n\tif (val >= DUK_ALLOC_POOL_ROMPTR_FIRST) {\n\t\t/* This is a blind lookup, could check index validity.\n\t\t * Duktape should never decompress a pointer which would\n\t\t * be out-of-bounds here.\n\t\t */\n\t\treturn (void *) (intptr_t) (duk_rom_compressed_pointers[val - DUK_ALLOC_POOL_ROMPTR_FIRST]);\n\t}\n#endif\n\treturn (void *) ((char *) duk_alloc_pool_ptrcomp_base + (((size_t) val) << 2));\n}\n#endif\n\n#endif  /* DUK_ALLOC_POOL_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_config.h",
    "content": "/*\n *  duk_config.h configuration header generated by genconfig.py.\n *\n *  Git commit: a459cf3c9bd1779fc01b435d69302b742675a08f\n *  Git describe: v2.2.0\n *  Git branch: master\n *\n *  Supported platforms:\n *      - Mac OSX, iPhone, Darwin\n *      - Orbis\n *      - OpenBSD\n *      - Generic BSD\n *      - Atari ST TOS\n *      - AmigaOS\n *      - Durango (XboxOne)\n *      - Windows\n *      - Flashplayer (Crossbridge)\n *      - QNX\n *      - TI-Nspire\n *      - Emscripten\n *      - Linux\n *      - Solaris\n *      - AIX\n *      - HPUX\n *      - Generic POSIX\n *      - Cygwin\n *      - Generic UNIX\n *      - Generic fallback\n *\n *  Supported architectures:\n *      - x86\n *      - x64\n *      - x32\n *      - ARM 32-bit\n *      - ARM 64-bit\n *      - MIPS 32-bit\n *      - MIPS 64-bit\n *      - PowerPC 32-bit\n *      - PowerPC 64-bit\n *      - SPARC 32-bit\n *      - SPARC 64-bit\n *      - SuperH\n *      - Motorola 68k\n *      - Emscripten\n *      - Generic\n *\n *  Supported compilers:\n *      - Clang\n *      - GCC\n *      - MSVC\n *      - Emscripten\n *      - TinyC\n *      - VBCC\n *      - Bruce's C compiler\n *      - Generic\n *\n */\n\n#if !defined(DUK_CONFIG_H_INCLUDED)\n#define DUK_CONFIG_H_INCLUDED\n\n/*\n *  Intermediate helper defines\n */\n\n/* DLL build detection */\n/* not configured for DLL build */\n#undef DUK_F_DLL_BUILD\n\n/* Apple OSX, iOS */\n#if defined(__APPLE__)\n#define DUK_F_APPLE\n#endif\n\n/* FreeBSD */\n#if defined(__FreeBSD__) || defined(__FreeBSD)\n#define DUK_F_FREEBSD\n#endif\n\n/* Orbis (PS4) variant */\n#if defined(DUK_F_FREEBSD) && defined(__ORBIS__)\n#define DUK_F_ORBIS\n#endif\n\n/* OpenBSD */\n#if defined(__OpenBSD__) || defined(__OpenBSD)\n#define DUK_F_OPENBSD\n#endif\n\n/* NetBSD */\n#if defined(__NetBSD__) || defined(__NetBSD)\n#define DUK_F_NETBSD\n#endif\n\n/* BSD variant */\n#if defined(DUK_F_FREEBSD) || defined(DUK_F_NETBSD) || defined(DUK_F_OPENBSD) || \\\n    defined(__bsdi__) || defined(__DragonFly__)\n#define DUK_F_BSD\n#endif\n\n/* Atari ST TOS.  __TOS__ defined by PureC.  No platform define in VBCC\n * apparently, so to use with VBCC user must define __TOS__ manually.\n  */\n#if defined(__TOS__)\n#define DUK_F_TOS\n#endif\n\n/* Motorola 68K.  Not defined by VBCC, so user must define one of these\n * manually when using VBCC.\n */\n#if defined(__m68k__) || defined(M68000) || defined(__MC68K__)\n#define DUK_F_M68K\n#endif\n\n/* AmigaOS.  Neither AMIGA nor __amigaos__ is defined on VBCC, so user must\n * define 'AMIGA' manually when using VBCC.\n */\n#if defined(AMIGA) || defined(__amigaos__)\n#define DUK_F_AMIGAOS\n#endif\n\n/* PowerPC */\n#if defined(__powerpc) || defined(__powerpc__) || defined(__PPC__)\n#define DUK_F_PPC\n#if defined(__PPC64__) || defined(__LP64__) || defined(_LP64)\n#define DUK_F_PPC64\n#else\n#define DUK_F_PPC32\n#endif\n#endif\n\n/* Durango (Xbox One) */\n#if defined(_DURANGO) || defined(_XBOX_ONE)\n#define DUK_F_DURANGO\n#endif\n\n/* Windows, both 32-bit and 64-bit */\n#if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64) || \\\n    defined(__WIN32__) || defined(__TOS_WIN__) || defined(__WINDOWS__)\n#define DUK_F_WINDOWS\n#if defined(_WIN64) || defined(WIN64)\n#define DUK_F_WIN64\n#else\n#define DUK_F_WIN32\n#endif\n#endif\n\n/* Flash player (e.g. Crossbridge) */\n#if defined(__FLASHPLAYER__)\n#define DUK_F_FLASHPLAYER\n#endif\n\n/* QNX */\n#if defined(__QNX__)\n#define DUK_F_QNX\n#endif\n\n/* TI-Nspire (using Ndless) */\n#if defined(_TINSPIRE)\n#define DUK_F_TINSPIRE\n#endif\n\n/* Emscripten (provided explicitly by user), improve if possible */\n#if defined(EMSCRIPTEN)\n#define DUK_F_EMSCRIPTEN\n#endif\n\n/* BCC (Bruce's C compiler): this is a \"torture target\" for compilation */\n#if defined(__BCC__) || defined(__BCC_VERSION__)\n#define DUK_F_BCC\n#endif\n\n/* Linux */\n#if defined(__linux) || defined(__linux__) || defined(linux)\n#define DUK_F_LINUX\n#endif\n\n/* illumos / Solaris */\n#if defined(__sun) && defined(__SVR4)\n#define DUK_F_SUN\n#if defined(__SUNPRO_C) && (__SUNPRO_C < 0x550)\n#define DUK_F_OLD_SOLARIS\n/* Defines _ILP32 / _LP64 required by DUK_F_X86/DUK_F_X64.  Platforms\n * are processed before architectures, so this happens before the\n * DUK_F_X86/DUK_F_X64 detection is emitted.\n */\n#include <sys/isa_defs.h>\n#endif\n#endif\n\n/* AIX */\n#if defined(_AIX)\n/* defined(__xlc__) || defined(__IBMC__): works but too wide */\n#define DUK_F_AIX\n#endif\n\n/* HPUX */\n#if defined(__hpux)\n#define DUK_F_HPUX\n#if defined(__ia64)\n#define DUK_F_HPUX_ITANIUM\n#endif\n#endif\n\n/* POSIX */\n#if defined(__posix)\n#define DUK_F_POSIX\n#endif\n\n/* Cygwin */\n#if defined(__CYGWIN__)\n#define DUK_F_CYGWIN\n#endif\n\n/* Generic Unix (includes Cygwin) */\n#if defined(__unix) || defined(__unix__) || defined(unix) || \\\n    defined(DUK_F_LINUX) || defined(DUK_F_BSD)\n#define DUK_F_UNIX\n#endif\n\n/* C++ */\n#undef DUK_F_CPP\n#if defined(__cplusplus)\n#define DUK_F_CPP\n#endif\n\n/* Intel x86 (32-bit), x64 (64-bit) or x32 (64-bit but 32-bit pointers),\n * define only one of DUK_F_X86, DUK_F_X64, DUK_F_X32.\n * https://sites.google.com/site/x32abi/\n *\n * With DUK_F_OLD_SOLARIS the <sys/isa_defs.h> header must be included\n * before this.\n */\n#if defined(__amd64__) || defined(__amd64) || \\\n    defined(__x86_64__) || defined(__x86_64) || \\\n    defined(_M_X64) || defined(_M_AMD64)\n#if defined(__ILP32__) || defined(_ILP32)\n#define DUK_F_X32\n#else\n#define DUK_F_X64\n#endif\n#elif defined(i386) || defined(__i386) || defined(__i386__) || \\\n      defined(__i486__) || defined(__i586__) || defined(__i686__) || \\\n      defined(__IA32__) || defined(_M_IX86) || defined(__X86__) || \\\n      defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__)\n#if defined(__LP64__) || defined(_LP64)\n/* This should not really happen, but would indicate x64. */\n#define DUK_F_X64\n#else\n#define DUK_F_X86\n#endif\n#endif\n\n/* ARM */\n#if defined(__arm__) || defined(__thumb__) || defined(_ARM) || defined(_M_ARM) || defined(__aarch64__)\n#define DUK_F_ARM\n#if defined(__LP64__) || defined(_LP64) || defined(__arm64) || defined(__arm64__) || defined(__aarch64__)\n#define DUK_F_ARM64\n#else\n#define DUK_F_ARM32\n#endif\n#endif\n\n/* MIPS.  Related defines: __MIPSEB__, __MIPSEL__, __mips_isa_rev, __LP64__ */\n#if defined(__mips__) || defined(mips) || defined(_MIPS_ISA) || \\\n    defined(_R3000) || defined(_R4000) || defined(_R5900) || \\\n    defined(_MIPS_ISA_MIPS1) || defined(_MIPS_ISA_MIPS2) || \\\n    defined(_MIPS_ISA_MIPS3) || defined(_MIPS_ISA_MIPS4) || \\\n    defined(__mips) || defined(__MIPS__)\n#define DUK_F_MIPS\n#if defined(__LP64__) || defined(_LP64) || defined(__mips64) || \\\n    defined(__mips64__) || defined(__mips_n64)\n#define DUK_F_MIPS64\n#else\n#define DUK_F_MIPS32\n#endif\n#endif\n\n/* SPARC */\n#if defined(sparc) || defined(__sparc) || defined(__sparc__)\n#define DUK_F_SPARC\n#if defined(__LP64__) || defined(_LP64)\n#define DUK_F_SPARC64\n#else\n#define DUK_F_SPARC32\n#endif\n#endif\n\n/* SuperH */\n#if defined(__sh__) || \\\n    defined(__sh1__) || defined(__SH1__) || \\\n    defined(__sh2__) || defined(__SH2__) || \\\n    defined(__sh3__) || defined(__SH3__) || \\\n    defined(__sh4__) || defined(__SH4__) || \\\n    defined(__sh5__) || defined(__SH5__)\n#define DUK_F_SUPERH\n#endif\n\n/* Clang */\n#if defined(__clang__)\n#define DUK_F_CLANG\n#endif\n\n/* C99 or above */\n#undef DUK_F_C99\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)\n#define DUK_F_C99\n#endif\n\n/* C++11 or above */\n#undef DUK_F_CPP11\n#if defined(__cplusplus) && (__cplusplus >= 201103L)\n#define DUK_F_CPP11\n#endif\n\n/* GCC.  Clang also defines __GNUC__ so don't detect GCC if using Clang. */\n#if defined(__GNUC__) && !defined(__clang__) && !defined(DUK_F_CLANG)\n#define DUK_F_GCC\n#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)\n/* Convenience, e.g. gcc 4.5.1 == 40501; http://stackoverflow.com/questions/6031819/emulating-gccs-builtin-unreachable */\n#define DUK_F_GCC_VERSION  (__GNUC__ * 10000L + __GNUC_MINOR__ * 100L + __GNUC_PATCHLEVEL__)\n#else\n#error cannot figure out gcc version\n#endif\n#endif\n\n/* MinGW.  Also GCC flags (DUK_F_GCC) are enabled now. */\n#if defined(__MINGW32__) || defined(__MINGW64__)\n#define DUK_F_MINGW\n#endif\n\n/* MSVC */\n#if defined(_MSC_VER)\n/* MSVC preprocessor defines: http://msdn.microsoft.com/en-us/library/b0084kay.aspx\n * _MSC_FULL_VER includes the build number, but it has at least two formats, see e.g.\n * BOOST_MSVC_FULL_VER in http://www.boost.org/doc/libs/1_52_0/boost/config/compiler/visualc.hpp\n */\n#define DUK_F_MSVC\n#if defined(_MSC_FULL_VER)\n#if (_MSC_FULL_VER > 100000000)\n#define DUK_F_MSVC_FULL_VER _MSC_FULL_VER\n#else\n#define DUK_F_MSCV_FULL_VER (_MSC_FULL_VER * 10)\n#endif\n#endif\n#endif  /* _MSC_VER */\n\n/* TinyC */\n#if defined(__TINYC__)\n/* http://bellard.org/tcc/tcc-doc.html#SEC9 */\n#define DUK_F_TINYC\n#endif\n\n/* VBCC */\n#if defined(__VBCC__)\n#define DUK_F_VBCC\n#endif\n\n#if defined(ANDROID) || defined(__ANDROID__)\n#define DUK_F_ANDROID\n#endif\n\n/* Atari Mint */\n#if defined(__MINT__)\n#define DUK_F_MINT\n#endif\n\n/*\n *  Platform autodetection\n */\n\n/* Workaround for older C++ compilers before including <inttypes.h>,\n * see e.g.: https://sourceware.org/bugzilla/show_bug.cgi?id=15366\n */\n#if defined(__cplusplus) && !defined(__STDC_LIMIT_MACROS)\n#define __STDC_LIMIT_MACROS\n#endif\n#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS)\n#define __STDC_CONSTANT_MACROS\n#endif\n\n#if defined(DUK_F_APPLE)\n/* --- Mac OSX, iPhone, Darwin --- */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <TargetConditionals.h>\n#include <architecture/byte_order.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n/* http://stackoverflow.com/questions/5919996/how-to-detect-reliably-mac-os-x-ios-linux-windows-in-c-preprocessor */\n#if TARGET_IPHONE_SIMULATOR\n#define DUK_USE_OS_STRING \"iphone-sim\"\n#elif TARGET_OS_IPHONE\n#define DUK_USE_OS_STRING \"iphone\"\n#elif TARGET_OS_MAC\n#define DUK_USE_OS_STRING \"osx\"\n#else\n#define DUK_USE_OS_STRING \"osx-unknown\"\n#endif\n\n/* Use _setjmp() on Apple by default, see GH-55. */\n#define DUK_JMPBUF_TYPE       jmp_buf\n#define DUK_SETJMP(jb)        _setjmp((jb))\n#define DUK_LONGJMP(jb)       _longjmp((jb), 1)\n#elif defined(DUK_F_ORBIS)\n/* --- Orbis --- */\n/* Orbis = PS4 */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_S\n/* no parsing (not an error) */\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/types.h>\n#include <machine/endian.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING  \"orbis\"\n#elif defined(DUK_F_OPENBSD)\n/* --- OpenBSD --- */\n/* http://www.monkey.org/openbsd/archive/ports/0401/msg00089.html */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/types.h>\n#include <sys/endian.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING  \"openbsd\"\n#elif defined(DUK_F_BSD)\n/* --- Generic BSD --- */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/types.h>\n#include <sys/endian.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING  \"bsd\"\n#elif defined(DUK_F_TOS)\n/* --- Atari ST TOS --- */\n#define DUK_USE_DATE_NOW_TIME\n#define DUK_USE_DATE_TZO_GMTIME\n/* no parsing (not an error) */\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <time.h>\n\n#define DUK_USE_OS_STRING  \"tos\"\n\n/* TOS on M68K is always big endian. */\n#if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_M68K)\n#define DUK_USE_BYTEORDER 3\n#endif\n#elif defined(DUK_F_AMIGAOS)\n/* --- AmigaOS --- */\n#if defined(DUK_F_M68K)\n/* AmigaOS on M68k */\n#define DUK_USE_DATE_NOW_TIME\n#define DUK_USE_DATE_TZO_GMTIME\n/* no parsing (not an error) */\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <time.h>\n#elif defined(DUK_F_PPC)\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <time.h>\n#if !defined(UINTPTR_MAX)\n#define UINTPTR_MAX UINT_MAX\n#endif\n#else\n#error AmigaOS but not M68K/PPC, not supported now\n#endif\n\n#define DUK_USE_OS_STRING \"amigaos\"\n\n/* AmigaOS on M68K or PPC is always big endian. */\n#if !defined(DUK_USE_BYTEORDER) && (defined(DUK_F_M68K) || defined(DUK_F_PPC))\n#define DUK_USE_BYTEORDER 3\n#endif\n#elif defined(DUK_F_DURANGO)\n/* --- Durango (XboxOne) --- */\n/* Durango = XboxOne\n * Configuration is nearly identical to Windows, except for\n * DUK_USE_DATE_TZO_WINDOWS.\n */\n\n/* Initial fix: disable secure CRT related warnings when compiling Duktape\n * itself (must be defined before including Windows headers).  Don't define\n * for user code including duktape.h.\n */\n#if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n/* MSVC does not have sys/param.h */\n#define DUK_USE_DATE_NOW_WINDOWS\n#define DUK_USE_DATE_TZO_WINDOWS_NO_DST\n/* Note: PRS and FMT are intentionally left undefined for now.  This means\n * there is no platform specific date parsing/formatting but there is still\n * the ISO 8601 standard format.\n */\n#if defined(DUK_COMPILING_DUKTAPE)\n/* Only include when compiling Duktape to avoid polluting application build\n * with a lot of unnecessary defines.\n */\n#include <windows.h>\n#endif\n\n#define DUK_USE_OS_STRING \"durango\"\n\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 1\n#endif\n#elif defined(DUK_F_WINDOWS)\n/* --- Windows --- */\n/* Windows version can't obviously be determined at compile time,\n * but _WIN32_WINNT indicates the minimum version targeted:\n * - https://msdn.microsoft.com/en-us/library/6sehtctf.aspx\n */\n\n/* Initial fix: disable secure CRT related warnings when compiling Duktape\n * itself (must be defined before including Windows headers).  Don't define\n * for user code including duktape.h.\n */\n#if defined(DUK_COMPILING_DUKTAPE) && !defined(_CRT_SECURE_NO_WARNINGS)\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n/* Windows 32-bit and 64-bit are currently the same. */\n/* MSVC does not have sys/param.h */\n\n#if defined(DUK_COMPILING_DUKTAPE)\n/* Only include when compiling Duktape to avoid polluting application build\n * with a lot of unnecessary defines.\n */\n#include <windows.h>\n#endif\n\n/* GetSystemTimePreciseAsFileTime() available from Windows 8:\n * https://msdn.microsoft.com/en-us/library/windows/desktop/hh706895(v=vs.85).aspx\n */\n#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS) || defined(DUK_USE_DATE_NOW_WINDOWS)\n/* User forced provider. */\n#else\n#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0602)\n#define DUK_USE_DATE_NOW_WINDOWS_SUBMS\n#else\n#define DUK_USE_DATE_NOW_WINDOWS\n#endif\n#endif\n\n#define DUK_USE_DATE_TZO_WINDOWS\n\n/* Note: PRS and FMT are intentionally left undefined for now.  This means\n * there is no platform specific date parsing/formatting but there is still\n * the ISO 8601 standard format.\n */\n\n/* QueryPerformanceCounter() may go backwards in Windows XP, so enable for\n * Vista and later: https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions\n */\n#if !defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC) && \\\n    defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)\n#define DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC\n#endif\n\n#define DUK_USE_OS_STRING \"windows\"\n\n/* On Windows, assume we're little endian.  Even Itanium which has a\n * configurable endianness runs little endian in Windows.\n */\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 1\n#endif\n#elif defined(DUK_F_FLASHPLAYER)\n/* --- Flashplayer (Crossbridge) --- */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <endian.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"flashplayer\"\n\n#if !defined(DUK_USE_BYTEORDER) && defined(DUK_F_FLASHPLAYER)\n#define DUK_USE_BYTEORDER 1\n#endif\n#elif defined(DUK_F_QNX)\n/* --- QNX --- */\n#if defined(DUK_F_QNX) && defined(DUK_COMPILING_DUKTAPE)\n/* See: /opt/qnx650/target/qnx6/usr/include/sys/platform.h */\n#define _XOPEN_SOURCE    600\n#define _POSIX_C_SOURCE  200112L\n#endif\n\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/types.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"qnx\"\n#elif defined(DUK_F_TINSPIRE)\n/* --- TI-Nspire --- */\n#if defined(DUK_COMPILING_DUKTAPE) && !defined(_XOPEN_SOURCE)\n#define _XOPEN_SOURCE    /* e.g. strptime */\n#endif\n\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/types.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"tinspire\"\n#elif defined(DUK_F_EMSCRIPTEN)\n/* --- Emscripten --- */\n#if defined(DUK_COMPILING_DUKTAPE)\n#if !defined(_POSIX_C_SOURCE)\n#define _POSIX_C_SOURCE  200809L\n#endif\n#if !defined(_GNU_SOURCE)\n#define _GNU_SOURCE      /* e.g. getdate_r */\n#endif\n#if !defined(_XOPEN_SOURCE)\n#define _XOPEN_SOURCE    /* e.g. strptime */\n#endif\n#endif  /* DUK_COMPILING_DUKTAPE */\n\n#include <sys/types.h>\n#if defined(DUK_F_BCC)\n/* no endian.h */\n#else\n#include <endian.h>\n#endif  /* DUK_F_BCC */\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n#include <stdint.h>\n\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n\n#define DUK_USE_OS_STRING \"emscripten\"\n#elif defined(DUK_F_LINUX)\n/* --- Linux --- */\n#if defined(DUK_COMPILING_DUKTAPE)\n#if !defined(_POSIX_C_SOURCE)\n#define _POSIX_C_SOURCE  200809L\n#endif\n#if !defined(_GNU_SOURCE)\n#define _GNU_SOURCE      /* e.g. getdate_r */\n#endif\n#if !defined(_XOPEN_SOURCE)\n#define _XOPEN_SOURCE    /* e.g. strptime */\n#endif\n#endif  /* DUK_COMPILING_DUKTAPE */\n\n#include <sys/types.h>\n#if defined(DUK_F_BCC)\n/* no endian.h or stdint.h */\n#else\n#include <endian.h>\n#include <stdint.h>\n#endif  /* DUK_F_BCC */\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n\n#if 0  /* XXX: safe condition? */\n#define DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME\n#endif\n\n#define DUK_USE_OS_STRING \"linux\"\n#elif defined(DUK_F_SUN)\n/* --- Solaris --- */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n\n#include <sys/types.h>\n#if defined(DUK_F_OLD_SOLARIS)\n/* Old Solaris with no endian.h, stdint.h */\n#define DUK_F_NO_STDINT_H\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 3\n#endif\n#else  /* DUK_F_OLD_SOLARIS */\n#include <ast/endian.h>\n#endif  /* DUK_F_OLD_SOLARIS */\n\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"solaris\"\n#elif defined(DUK_F_AIX)\n/* --- AIX --- */\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 3\n#endif\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"aix\"\n#elif defined(DUK_F_HPUX)\n/* --- HPUX --- */\n#define DUK_F_NO_STDINT_H\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 3\n#endif\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"hpux\"\n#elif defined(DUK_F_POSIX)\n/* --- Generic POSIX --- */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/types.h>\n#include <endian.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"posix\"\n#elif defined(DUK_F_CYGWIN)\n/* --- Cygwin --- */\n/* don't use strptime() for now */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <sys/types.h>\n#include <endian.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <time.h>\n\n#define DUK_JMPBUF_TYPE       jmp_buf\n#define DUK_SETJMP(jb)        _setjmp((jb))\n#define DUK_LONGJMP(jb)       _longjmp((jb), 1)\n\n#define DUK_USE_OS_STRING \"windows\"\n#elif defined(DUK_F_UNIX)\n/* --- Generic UNIX --- */\n#define DUK_USE_DATE_NOW_GETTIMEOFDAY\n#define DUK_USE_DATE_TZO_GMTIME_R\n#define DUK_USE_DATE_PRS_STRPTIME\n#define DUK_USE_DATE_FMT_STRFTIME\n#include <time.h>\n#include <sys/time.h>\n#define DUK_USE_OS_STRING \"unknown\"\n#else\n/* --- Generic fallback --- */\n/* The most portable current time provider is time(), but it only has a\n * one second resolution.\n */\n#define DUK_USE_DATE_NOW_TIME\n\n/* The most portable way to figure out local time offset is gmtime(),\n * but it's not thread safe so use with caution.\n */\n#define DUK_USE_DATE_TZO_GMTIME\n\n/* Avoid custom date parsing and formatting for portability. */\n#undef DUK_USE_DATE_PRS_STRPTIME\n#undef DUK_USE_DATE_FMT_STRFTIME\n\n/* Rely on C89 headers only; time.h must be here. */\n#include <time.h>\n\n#define DUK_USE_OS_STRING \"unknown\"\n#endif  /* autodetect platform */\n\n/* Shared includes: C89 */\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdarg.h>  /* varargs */\n#include <setjmp.h>\n#include <stddef.h>  /* e.g. ptrdiff_t */\n#include <math.h>\n#include <limits.h>\n\n/* date.h is omitted, and included per platform */\n\n/* Shared includes: stdint.h is C99 */\n#if defined(DUK_F_NO_STDINT_H)\n/* stdint.h not available */\n#else\n/* Technically C99 (C++11) but found in many systems.  On some systems\n * __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS must be defined before\n * including stdint.h (see above).\n */\n#include <stdint.h>\n#endif\n\n#if defined(DUK_F_CPP)\n#include <exception>  /* std::exception */\n#endif\n\n/*\n *  Architecture autodetection\n */\n\n#if defined(DUK_F_X86)\n/* --- x86 --- */\n#define DUK_USE_ARCH_STRING \"x86\"\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 1\n#endif\n/* XXX: This is technically not guaranteed because it's possible to configure\n * an x86 to require aligned accesses with Alignment Check (AC) flag.\n */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 1\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_X64)\n/* --- x64 --- */\n#define DUK_USE_ARCH_STRING \"x64\"\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 1\n#endif\n/* XXX: This is technically not guaranteed because it's possible to configure\n * an x86 to require aligned accesses with Alignment Check (AC) flag.\n */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 1\n#endif\n#undef DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_X32)\n/* --- x32 --- */\n#define DUK_USE_ARCH_STRING \"x32\"\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 1\n#endif\n/* XXX: This is technically not guaranteed because it's possible to configure\n * an x86 to require aligned accesses with Alignment Check (AC) flag.\n */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 1\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_ARM32)\n/* --- ARM 32-bit --- */\n#define DUK_USE_ARCH_STRING \"arm32\"\n/* Byte order varies, so rely on autodetect. */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 4\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_ARM64)\n/* --- ARM 64-bit --- */\n#define DUK_USE_ARCH_STRING \"arm64\"\n/* Byte order varies, so rely on autodetect. */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#undef DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_MIPS32)\n/* --- MIPS 32-bit --- */\n#define DUK_USE_ARCH_STRING \"mips32\"\n/* MIPS byte order varies so rely on autodetection. */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_MIPS64)\n/* --- MIPS 64-bit --- */\n#define DUK_USE_ARCH_STRING \"mips64\"\n/* MIPS byte order varies so rely on autodetection. */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#undef DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_PPC32)\n/* --- PowerPC 32-bit --- */\n#define DUK_USE_ARCH_STRING \"ppc32\"\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 3\n#endif\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_PPC64)\n/* --- PowerPC 64-bit --- */\n#define DUK_USE_ARCH_STRING \"ppc64\"\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 3\n#endif\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#undef DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_SPARC32)\n/* --- SPARC 32-bit --- */\n#define DUK_USE_ARCH_STRING \"sparc32\"\n/* SPARC byte order varies so rely on autodetection. */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_SPARC64)\n/* --- SPARC 64-bit --- */\n#define DUK_USE_ARCH_STRING \"sparc64\"\n/* SPARC byte order varies so rely on autodetection. */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#undef DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_SUPERH)\n/* --- SuperH --- */\n#define DUK_USE_ARCH_STRING \"sh\"\n/* Byte order varies, rely on autodetection. */\n/* Based on 'make checkalign' there are no alignment requirements on\n * Linux SH4, but align by 4 is probably a good basic default.\n */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 4\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_M68K)\n/* --- Motorola 68k --- */\n#define DUK_USE_ARCH_STRING \"m68k\"\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 3\n#endif\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#define DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#elif defined(DUK_F_EMSCRIPTEN)\n/* --- Emscripten --- */\n#define DUK_USE_ARCH_STRING \"emscripten\"\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 1\n#endif\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n#undef DUK_USE_PACKED_TVAL\n#define DUK_F_PACKED_TVAL_PROVIDED\n#else\n/* --- Generic --- */\n/* These are necessary wild guesses. */\n#define DUK_USE_ARCH_STRING \"generic\"\n/* Rely on autodetection for byte order, alignment, and packed tval. */\n#endif  /* autodetect architecture */\n\n/*\n *  Compiler autodetection\n */\n\n#if defined(DUK_F_CLANG)\n/* --- Clang --- */\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n/* C99 / C++11 and above: rely on va_copy() which is required. */\n#define DUK_VA_COPY(dest,src) va_copy(dest,src)\n#else\n/* Clang: assume we have __va_copy() in non-C99 mode. */\n#define DUK_VA_COPY(dest,src) __va_copy(dest,src)\n#endif\n\n#define DUK_NORETURN(decl)  decl __attribute__((noreturn))\n\n#if defined(__clang__) && defined(__has_builtin)\n#if __has_builtin(__builtin_unreachable)\n#define DUK_UNREACHABLE()  do { __builtin_unreachable(); } while (0)\n#endif\n#endif\n\n#define DUK_USE_BRANCH_HINTS\n#define DUK_LIKELY(x)    __builtin_expect((x), 1)\n#define DUK_UNLIKELY(x)  __builtin_expect((x), 0)\n#if defined(__clang__) && defined(__has_builtin)\n#if __has_builtin(__builtin_unpredictable)\n#define DUK_UNPREDICTABLE(x)  __builtin_unpredictable((x))\n#endif\n#endif\n\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n#define DUK_NOINLINE        __attribute__((noinline))\n#define DUK_INLINE          inline\n#define DUK_ALWAYS_INLINE   inline __attribute__((always_inline))\n#endif\n\n/* DUK_HOT */\n/* DUK_COLD */\n\n#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS)\n/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're\n * compiling Duktape or the application.\n */\n#if defined(DUK_COMPILING_DUKTAPE)\n#define DUK_EXTERNAL_DECL  extern __declspec(dllexport)\n#define DUK_EXTERNAL       __declspec(dllexport)\n#else\n#define DUK_EXTERNAL_DECL  extern __declspec(dllimport)\n#define DUK_EXTERNAL       should_not_happen\n#endif\n#if defined(DUK_SINGLE_FILE)\n#define DUK_INTERNAL_DECL  static\n#define DUK_INTERNAL       static\n#else\n#define DUK_INTERNAL_DECL  extern\n#define DUK_INTERNAL       /*empty*/\n#endif\n#define DUK_LOCAL_DECL     static\n#define DUK_LOCAL          static\n#else\n#define DUK_EXTERNAL_DECL  __attribute__ ((visibility(\"default\"))) extern\n#define DUK_EXTERNAL       __attribute__ ((visibility(\"default\")))\n#if defined(DUK_SINGLE_FILE)\n#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)\n/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and\n * Clang.  Based on documentation it should suffice to have the attribute\n * in the declaration only, but in practice some warnings are generated unless\n * the attribute is also applied to the definition.\n */\n#define DUK_INTERNAL_DECL  static __attribute__ ((unused))\n#define DUK_INTERNAL       static __attribute__ ((unused))\n#else\n#define DUK_INTERNAL_DECL  static\n#define DUK_INTERNAL       static\n#endif\n#else\n#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)\n#define DUK_INTERNAL_DECL  __attribute__ ((visibility(\"hidden\"))) __attribute__ ((unused)) extern\n#define DUK_INTERNAL       __attribute__ ((visibility(\"hidden\"))) __attribute__ ((unused))\n#else\n#define DUK_INTERNAL_DECL  __attribute__ ((visibility(\"hidden\"))) extern\n#define DUK_INTERNAL       __attribute__ ((visibility(\"hidden\")))\n#endif\n#endif\n#define DUK_LOCAL_DECL     static\n#define DUK_LOCAL          static\n#endif\n\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"clang\"\n#else\n#define DUK_USE_COMPILER_STRING \"clang\"\n#endif\n\n#undef DUK_USE_VARIADIC_MACROS\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n#define DUK_USE_VARIADIC_MACROS\n#endif\n\n#define DUK_USE_UNION_INITIALIZERS\n\n#undef DUK_USE_FLEX_C99\n#undef DUK_USE_FLEX_ZEROSIZE\n#undef DUK_USE_FLEX_ONESIZE\n#if defined(DUK_F_C99)\n#define DUK_USE_FLEX_C99\n#else\n#define DUK_USE_FLEX_ZEROSIZE\n#endif\n\n#undef DUK_USE_GCC_PRAGMAS\n#define DUK_USE_PACK_CLANG_ATTR\n#elif defined(DUK_F_GCC)\n/* --- GCC --- */\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n/* C99 / C++11 and above: rely on va_copy() which is required. */\n#define DUK_VA_COPY(dest,src) va_copy(dest,src)\n#else\n/* GCC: assume we have __va_copy() in non-C99 mode. */\n#define DUK_VA_COPY(dest,src) __va_copy(dest,src)\n#endif\n\n#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 20500L)\n/* since gcc-2.5 */\n#define DUK_NORETURN(decl)  decl __attribute__((noreturn))\n#endif\n\n#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L)\n/* since gcc-4.5 */\n#define DUK_UNREACHABLE()  do { __builtin_unreachable(); } while (0)\n#endif\n\n#define DUK_USE_BRANCH_HINTS\n#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40500L)\n/* GCC: test not very accurate; enable only in relatively recent builds\n * because of bugs in gcc-4.4 (http://lists.debian.org/debian-gcc/2010/04/msg00000.html)\n */\n#define DUK_LIKELY(x)    __builtin_expect((x), 1)\n#define DUK_UNLIKELY(x)  __builtin_expect((x), 0)\n#endif\n/* XXX: equivalent of clang __builtin_unpredictable? */\n\n#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \\\n    defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 30101)\n#define DUK_NOINLINE        __attribute__((noinline))\n#define DUK_INLINE          inline\n#define DUK_ALWAYS_INLINE   inline __attribute__((always_inline))\n#endif\n\n#if (defined(DUK_F_C99) || defined(DUK_F_CPP11)) && \\\n    defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40300)\n#define DUK_HOT             __attribute__((hot))\n#define DUK_COLD            __attribute__((cold))\n#endif\n\n#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS)\n/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're\n * compiling Duktape or the application.\n */\n#if defined(DUK_COMPILING_DUKTAPE)\n#define DUK_EXTERNAL_DECL  extern __declspec(dllexport)\n#define DUK_EXTERNAL       __declspec(dllexport)\n#else\n#define DUK_EXTERNAL_DECL  extern __declspec(dllimport)\n#define DUK_EXTERNAL       should_not_happen\n#endif\n#if defined(DUK_SINGLE_FILE)\n#define DUK_INTERNAL_DECL  static\n#define DUK_INTERNAL       static\n#else\n#define DUK_INTERNAL_DECL  extern\n#define DUK_INTERNAL       /*empty*/\n#endif\n#define DUK_LOCAL_DECL     static\n#define DUK_LOCAL          static\n#elif defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40000)\n#define DUK_EXTERNAL_DECL  __attribute__ ((visibility(\"default\"))) extern\n#define DUK_EXTERNAL       __attribute__ ((visibility(\"default\")))\n#if defined(DUK_SINGLE_FILE)\n#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)\n/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and\n * Clang.  Based on documentation it should suffice to have the attribute\n * in the declaration only, but in practice some warnings are generated unless\n * the attribute is also applied to the definition.\n */\n#define DUK_INTERNAL_DECL  static __attribute__ ((unused))\n#define DUK_INTERNAL       static __attribute__ ((unused))\n#else\n#define DUK_INTERNAL_DECL  static\n#define DUK_INTERNAL       static\n#endif\n#else\n#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)\n#define DUK_INTERNAL_DECL  __attribute__ ((visibility(\"hidden\"))) __attribute__ ((unused)) extern\n#define DUK_INTERNAL       __attribute__ ((visibility(\"hidden\"))) __attribute__ ((unused))\n#else\n#define DUK_INTERNAL_DECL  __attribute__ ((visibility(\"hidden\"))) extern\n#define DUK_INTERNAL       __attribute__ ((visibility(\"hidden\")))\n#endif\n#endif\n#define DUK_LOCAL_DECL     static\n#define DUK_LOCAL          static\n#endif\n\n#if defined(DUK_F_MINGW)\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"mingw++\"\n#else\n#define DUK_USE_COMPILER_STRING \"mingw\"\n#endif\n#else\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"g++\"\n#else\n#define DUK_USE_COMPILER_STRING \"gcc\"\n#endif\n#endif\n\n#undef DUK_USE_VARIADIC_MACROS\n#if defined(DUK_F_C99) || (defined(DUK_F_CPP11) && defined(__GNUC__))\n#define DUK_USE_VARIADIC_MACROS\n#endif\n\n#define DUK_USE_UNION_INITIALIZERS\n\n#undef DUK_USE_FLEX_C99\n#undef DUK_USE_FLEX_ZEROSIZE\n#undef DUK_USE_FLEX_ONESIZE\n#if defined(DUK_F_C99)\n#define DUK_USE_FLEX_C99\n#else\n#define DUK_USE_FLEX_ZEROSIZE\n#endif\n\n#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION >= 40600)\n#define DUK_USE_GCC_PRAGMAS\n#else\n#undef DUK_USE_GCC_PRAGMAS\n#endif\n\n#define DUK_USE_PACK_GCC_ATTR\n#elif defined(DUK_F_MSVC)\n/* --- MSVC --- */\n/* http://msdn.microsoft.com/en-us/library/aa235362(VS.60).aspx */\n#define DUK_NORETURN(decl)  __declspec(noreturn) decl\n\n/* XXX: DUK_UNREACHABLE for msvc? */\n\n#undef DUK_USE_BRANCH_HINTS\n\n/* XXX: DUK_LIKELY, DUK_UNLIKELY for msvc? */\n/* XXX: DUK_NOINLINE, DUK_INLINE, DUK_ALWAYS_INLINE for msvc? */\n\n#if defined(DUK_F_DLL_BUILD) && defined(DUK_F_WINDOWS)\n/* MSVC dllexport/dllimport: appropriate __declspec depends on whether we're\n * compiling Duktape or the application.\n */\n#if defined(DUK_COMPILING_DUKTAPE)\n#define DUK_EXTERNAL_DECL  extern __declspec(dllexport)\n#define DUK_EXTERNAL       __declspec(dllexport)\n#else\n#define DUK_EXTERNAL_DECL  extern __declspec(dllimport)\n#define DUK_EXTERNAL       should_not_happen\n#endif\n#if defined(DUK_SINGLE_FILE)\n#define DUK_INTERNAL_DECL  static\n#define DUK_INTERNAL       static\n#else\n#define DUK_INTERNAL_DECL  extern\n#define DUK_INTERNAL       /*empty*/\n#endif\n#define DUK_LOCAL_DECL     static\n#define DUK_LOCAL          static\n#endif\n\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"msvc++\"\n#else\n#define DUK_USE_COMPILER_STRING \"msvc\"\n#endif\n\n#undef DUK_USE_VARIADIC_MACROS\n#if defined(DUK_F_C99)\n#define DUK_USE_VARIADIC_MACROS\n#elif defined(_MSC_VER) && (_MSC_VER >= 1400)\n/* VS2005+ should have variadic macros even when they're not C99. */\n#define DUK_USE_VARIADIC_MACROS\n#endif\n\n#undef DUK_USE_UNION_INITIALIZERS\n#if defined(_MSC_VER) && (_MSC_VER >= 1800)\n/* VS2013+ supports union initializers but there's a bug involving union-inside-struct:\n * https://connect.microsoft.com/VisualStudio/feedback/details/805981\n * The bug was fixed (at least) in VS2015 so check for VS2015 for now:\n * https://blogs.msdn.microsoft.com/vcblog/2015/07/01/c-compiler-front-end-fixes-in-vs2015/\n * Manually tested using VS2013, CL reports 18.00.31101, so enable for VS2013 too.\n */\n#define DUK_USE_UNION_INITIALIZERS\n#endif\n\n#undef DUK_USE_FLEX_C99\n#undef DUK_USE_FLEX_ZEROSIZE\n#undef DUK_USE_FLEX_ONESIZE\n#if defined(DUK_F_C99)\n#define DUK_USE_FLEX_C99\n#else\n#define DUK_USE_FLEX_ZEROSIZE\n#endif\n\n#undef DUK_USE_GCC_PRAGMAS\n\n#define DUK_USE_PACK_MSVC_PRAGMA\n\n/* These have been tested from VS2008 onwards; may work in older VS versions\n * too but not enabled by default.\n */\n#if defined(_MSC_VER) && (_MSC_VER >= 1500)\n#define DUK_NOINLINE        __declspec(noinline)\n#define DUK_INLINE          __inline\n#define DUK_ALWAYS_INLINE   __forceinline\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1900)\n#define DUK_SNPRINTF     snprintf\n#define DUK_VSNPRINTF    vsnprintf\n#else\n/* (v)snprintf() is missing before MSVC 2015.  Note that _(v)snprintf() does\n * NOT NUL terminate on truncation, but Duktape code never assumes that.\n * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010\n */\n#define DUK_SNPRINTF     _snprintf\n#define DUK_VSNPRINTF    _vsnprintf\n#endif\n\n/* Avoid warning when doing DUK_UNREF(some_function). */\n#if defined(_MSC_VER) && (_MSC_VER < 1500)\n#pragma warning(disable: 4100 4101 4550 4551)\n#define DUK_UNREF(x)\n#else\n#define DUK_UNREF(x)  do { __pragma(warning(suppress:4100 4101 4550 4551)) (x); } while (0)\n#endif\n\n/* Older versions of MSVC don't support the LL/ULL suffix. */\n#define DUK_U64_CONSTANT(x) x##ui64\n#define DUK_I64_CONSTANT(x) x##i64\n#elif defined(DUK_F_EMSCRIPTEN)\n/* --- Emscripten --- */\n#define DUK_NORETURN(decl)  decl __attribute__((noreturn))\n\n#if defined(__clang__) && defined(__has_builtin)\n#if __has_builtin(__builtin_unreachable)\n#define DUK_UNREACHABLE()  do { __builtin_unreachable(); } while (0)\n#endif\n#endif\n\n#define DUK_USE_BRANCH_HINTS\n#define DUK_LIKELY(x)    __builtin_expect((x), 1)\n#define DUK_UNLIKELY(x)  __builtin_expect((x), 0)\n#if defined(__clang__) && defined(__has_builtin)\n#if __has_builtin(__builtin_unpredictable)\n#define DUK_UNPREDICTABLE(x)  __builtin_unpredictable((x))\n#endif\n#endif\n\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n#define DUK_NOINLINE        __attribute__((noinline))\n#define DUK_INLINE          inline\n#define DUK_ALWAYS_INLINE   inline __attribute__((always_inline))\n#endif\n\n#define DUK_EXTERNAL_DECL  __attribute__ ((visibility(\"default\"))) extern\n#define DUK_EXTERNAL       __attribute__ ((visibility(\"default\")))\n#if defined(DUK_SINGLE_FILE)\n#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)\n/* Minimize warnings for unused internal functions with GCC >= 3.1.1 and\n * Clang.  Based on documentation it should suffice to have the attribute\n * in the declaration only, but in practice some warnings are generated unless\n * the attribute is also applied to the definition.\n */\n#define DUK_INTERNAL_DECL  static __attribute__ ((unused))\n#define DUK_INTERNAL       static __attribute__ ((unused))\n#else\n#define DUK_INTERNAL_DECL  static\n#define DUK_INTERNAL       static\n#endif\n#else\n#if (defined(DUK_F_GCC_VERSION) && DUK_F_GCC_VERSION >= 30101) || defined(DUK_F_CLANG)\n#define DUK_INTERNAL_DECL  __attribute__ ((visibility(\"hidden\"))) __attribute__ ((unused)) extern\n#define DUK_INTERNAL       __attribute__ ((visibility(\"hidden\"))) __attribute__ ((unused))\n#else\n#define DUK_INTERNAL_DECL  __attribute__ ((visibility(\"hidden\"))) extern\n#define DUK_INTERNAL       __attribute__ ((visibility(\"hidden\")))\n#endif\n#endif\n#define DUK_LOCAL_DECL     static\n#define DUK_LOCAL          static\n\n#define DUK_USE_COMPILER_STRING \"emscripten\"\n\n#undef DUK_USE_VARIADIC_MACROS\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n#define DUK_USE_VARIADIC_MACROS\n#endif\n\n#define DUK_USE_UNION_INITIALIZERS\n\n#undef DUK_USE_FLEX_C99\n#undef DUK_USE_FLEX_ZEROSIZE\n#undef DUK_USE_FLEX_ONESIZE\n#if defined(DUK_F_C99)\n#define DUK_USE_FLEX_C99\n#else\n#define DUK_USE_FLEX_ZEROSIZE\n#endif\n\n#undef DUK_USE_GCC_PRAGMAS\n#define DUK_USE_PACK_CLANG_ATTR\n#elif defined(DUK_F_TINYC)\n/* --- TinyC --- */\n#undef DUK_USE_BRANCH_HINTS\n\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"tinyc++\"\n#else\n#define DUK_USE_COMPILER_STRING \"tinyc\"\n#endif\n\n/* http://bellard.org/tcc/tcc-doc.html#SEC7 */\n#define DUK_USE_VARIADIC_MACROS\n\n#define DUK_USE_UNION_INITIALIZERS\n\n/* Most portable, wastes space */\n#define DUK_USE_FLEX_ONESIZE\n\n/* Most portable, potentially wastes space */\n#define DUK_USE_PACK_DUMMY_MEMBER\n#elif defined(DUK_F_VBCC)\n/* --- VBCC --- */\n#undef DUK_USE_BRANCH_HINTS\n\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"vbcc-c++\"\n#else\n#define DUK_USE_COMPILER_STRING \"vbcc\"\n#endif\n\n#undef DUK_USE_VARIADIC_MACROS\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n#define DUK_USE_VARIADIC_MACROS\n#endif\n\n/* VBCC supports C99 so check only for C99 for union initializer support.\n * Designated union initializers would possibly work even without a C99 check.\n */\n#undef DUK_USE_UNION_INITIALIZERS\n#if defined(DUK_F_C99)\n#define DUK_USE_UNION_INITIALIZERS\n#endif\n\n#define DUK_USE_FLEX_ZEROSIZE\n#define DUK_USE_PACK_DUMMY_MEMBER\n#elif defined(DUK_F_BCC)\n/* --- Bruce's C compiler --- */\n#undef DUK_USE_BRANCH_HINTS\n\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"bcc++\"\n#else\n#define DUK_USE_COMPILER_STRING \"bcc\"\n#endif\n\n/* Most portable */\n#undef DUK_USE_VARIADIC_MACROS\n\n/* Most portable, wastes space */\n#undef DUK_USE_UNION_INITIALIZERS\n\n/* Most portable, wastes space */\n#define DUK_USE_FLEX_ONESIZE\n\n/* Most portable, potentially wastes space */\n#define DUK_USE_PACK_DUMMY_MEMBER\n\n/* BCC, assume we're on x86. */\n#if !defined(DUK_USE_BYTEORDER)\n#define DUK_USE_BYTEORDER 1\n#endif\n#else\n/* --- Generic --- */\n#undef DUK_USE_BRANCH_HINTS\n\n#if defined(DUK_F_CPP)\n#define DUK_USE_COMPILER_STRING \"generic-c++\"\n#else\n#define DUK_USE_COMPILER_STRING \"generic\"\n#endif\n\n#undef DUK_USE_VARIADIC_MACROS\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n#define DUK_USE_VARIADIC_MACROS\n#endif\n\n/* C++ doesn't have standard designated union initializers ({ .foo = 1 }). */\n#undef DUK_USE_UNION_INITIALIZERS\n#if defined(DUK_F_C99)\n#define DUK_USE_UNION_INITIALIZERS\n#endif\n\n/* Most portable, wastes space */\n#define DUK_USE_FLEX_ONESIZE\n\n/* Most portable, potentially wastes space */\n#define DUK_USE_PACK_DUMMY_MEMBER\n#endif  /* autodetect compiler */\n\n/* uclibc */\n#if defined(__UCLIBC__)\n#define DUK_F_UCLIBC\n#endif\n\n/*\n *  Wrapper typedefs and constants for integer types, also sanity check types.\n *\n *  C99 typedefs are quite good but not always available, and we want to avoid\n *  forcibly redefining the C99 typedefs.  So, there are Duktape wrappers for\n *  all C99 typedefs and Duktape code should only use these typedefs.  Type\n *  detection when C99 is not supported is best effort and may end up detecting\n *  some types incorrectly.\n *\n *  Pointer sizes are a portability problem: pointers to different types may\n *  have a different size and function pointers are very difficult to manage\n *  portably.\n *\n *  http://en.wikipedia.org/wiki/C_data_types#Fixed-width_integer_types\n *\n *  Note: there's an interesting corner case when trying to define minimum\n *  signed integer value constants which leads to the current workaround of\n *  defining e.g. -0x80000000 as (-0x7fffffffL - 1L).  See doc/code-issues.txt\n *  for a longer discussion.\n *\n *  Note: avoid typecasts and computations in macro integer constants as they\n *  can then no longer be used in macro relational expressions (such as\n *  #if DUK_SIZE_MAX < 0xffffffffUL).  There is internal code which relies on\n *  being able to compare DUK_SIZE_MAX against a limit.\n */\n\n/* XXX: add feature options to force basic types from outside? */\n\n#if !defined(INT_MAX)\n#error INT_MAX not defined\n#endif\n\n/* Check that architecture is two's complement, standard C allows e.g.\n * INT_MIN to be -2**31+1 (instead of -2**31).\n */\n#if defined(INT_MAX) && defined(INT_MIN)\n#if INT_MAX != -(INT_MIN + 1)\n#error platform does not seem complement of two\n#endif\n#else\n#error cannot check complement of two\n#endif\n\n/* Pointer size determination based on __WORDSIZE or architecture when\n * that's not available.\n */\n#if defined(DUK_F_X86) || defined(DUK_F_X32) || \\\n    defined(DUK_F_M68K) || defined(DUK_F_PPC32) || \\\n    defined(DUK_F_BCC) || \\\n    (defined(__WORDSIZE) && (__WORDSIZE == 32)) || \\\n    ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \\\n      defined(DUK_F_HPUX)) && defined(_ILP32)) || \\\n    defined(DUK_F_ARM32)\n#define DUK_F_32BIT_PTRS\n#elif defined(DUK_F_X64) || \\\n      (defined(__WORDSIZE) && (__WORDSIZE == 64)) || \\\n   ((defined(DUK_F_OLD_SOLARIS) || defined(DUK_F_AIX) || \\\n     defined(DUK_F_HPUX)) && defined(_LP64)) || \\\n    defined(DUK_F_ARM64)\n#define DUK_F_64BIT_PTRS\n#else\n/* not sure, not needed with C99 anyway */\n#endif\n\n/* Intermediate define for 'have inttypes.h' */\n#undef DUK_F_HAVE_INTTYPES\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \\\n    !(defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC))\n/* vbcc + AmigaOS has C99 but no inttypes.h */\n#define DUK_F_HAVE_INTTYPES\n#elif defined(__cplusplus) && (__cplusplus >= 201103L)\n/* C++11 apparently ratified stdint.h */\n#define DUK_F_HAVE_INTTYPES\n#endif\n\n/* Basic integer typedefs and limits, preferably from inttypes.h, otherwise\n * through automatic detection.\n */\n#if defined(DUK_F_HAVE_INTTYPES)\n/* C99 or compatible */\n\n#define DUK_F_HAVE_64BIT\n#include <inttypes.h>\n\ntypedef uint8_t duk_uint8_t;\ntypedef int8_t duk_int8_t;\ntypedef uint16_t duk_uint16_t;\ntypedef int16_t duk_int16_t;\ntypedef uint32_t duk_uint32_t;\ntypedef int32_t duk_int32_t;\ntypedef uint64_t duk_uint64_t;\ntypedef int64_t duk_int64_t;\ntypedef uint_least8_t duk_uint_least8_t;\ntypedef int_least8_t duk_int_least8_t;\ntypedef uint_least16_t duk_uint_least16_t;\ntypedef int_least16_t duk_int_least16_t;\ntypedef uint_least32_t duk_uint_least32_t;\ntypedef int_least32_t duk_int_least32_t;\ntypedef uint_least64_t duk_uint_least64_t;\ntypedef int_least64_t duk_int_least64_t;\ntypedef uint_fast8_t duk_uint_fast8_t;\ntypedef int_fast8_t duk_int_fast8_t;\ntypedef uint_fast16_t duk_uint_fast16_t;\ntypedef int_fast16_t duk_int_fast16_t;\ntypedef uint_fast32_t duk_uint_fast32_t;\ntypedef int_fast32_t duk_int_fast32_t;\ntypedef uint_fast64_t duk_uint_fast64_t;\ntypedef int_fast64_t duk_int_fast64_t;\ntypedef uintptr_t duk_uintptr_t;\ntypedef intptr_t duk_intptr_t;\ntypedef uintmax_t duk_uintmax_t;\ntypedef intmax_t duk_intmax_t;\n\n#define DUK_UINT8_MIN         0\n#define DUK_UINT8_MAX         UINT8_MAX\n#define DUK_INT8_MIN          INT8_MIN\n#define DUK_INT8_MAX          INT8_MAX\n#define DUK_UINT_LEAST8_MIN   0\n#define DUK_UINT_LEAST8_MAX   UINT_LEAST8_MAX\n#define DUK_INT_LEAST8_MIN    INT_LEAST8_MIN\n#define DUK_INT_LEAST8_MAX    INT_LEAST8_MAX\n#define DUK_UINT_FAST8_MIN    0\n#define DUK_UINT_FAST8_MAX    UINT_FAST8_MAX\n#define DUK_INT_FAST8_MIN     INT_FAST8_MIN\n#define DUK_INT_FAST8_MAX     INT_FAST8_MAX\n#define DUK_UINT16_MIN        0\n#define DUK_UINT16_MAX        UINT16_MAX\n#define DUK_INT16_MIN         INT16_MIN\n#define DUK_INT16_MAX         INT16_MAX\n#define DUK_UINT_LEAST16_MIN  0\n#define DUK_UINT_LEAST16_MAX  UINT_LEAST16_MAX\n#define DUK_INT_LEAST16_MIN   INT_LEAST16_MIN\n#define DUK_INT_LEAST16_MAX   INT_LEAST16_MAX\n#define DUK_UINT_FAST16_MIN   0\n#define DUK_UINT_FAST16_MAX   UINT_FAST16_MAX\n#define DUK_INT_FAST16_MIN    INT_FAST16_MIN\n#define DUK_INT_FAST16_MAX    INT_FAST16_MAX\n#define DUK_UINT32_MIN        0\n#define DUK_UINT32_MAX        UINT32_MAX\n#define DUK_INT32_MIN         INT32_MIN\n#define DUK_INT32_MAX         INT32_MAX\n#define DUK_UINT_LEAST32_MIN  0\n#define DUK_UINT_LEAST32_MAX  UINT_LEAST32_MAX\n#define DUK_INT_LEAST32_MIN   INT_LEAST32_MIN\n#define DUK_INT_LEAST32_MAX   INT_LEAST32_MAX\n#define DUK_UINT_FAST32_MIN   0\n#define DUK_UINT_FAST32_MAX   UINT_FAST32_MAX\n#define DUK_INT_FAST32_MIN    INT_FAST32_MIN\n#define DUK_INT_FAST32_MAX    INT_FAST32_MAX\n#define DUK_UINT64_MIN        0\n#define DUK_UINT64_MAX        UINT64_MAX\n#define DUK_INT64_MIN         INT64_MIN\n#define DUK_INT64_MAX         INT64_MAX\n#define DUK_UINT_LEAST64_MIN  0\n#define DUK_UINT_LEAST64_MAX  UINT_LEAST64_MAX\n#define DUK_INT_LEAST64_MIN   INT_LEAST64_MIN\n#define DUK_INT_LEAST64_MAX   INT_LEAST64_MAX\n#define DUK_UINT_FAST64_MIN   0\n#define DUK_UINT_FAST64_MAX   UINT_FAST64_MAX\n#define DUK_INT_FAST64_MIN    INT_FAST64_MIN\n#define DUK_INT_FAST64_MAX    INT_FAST64_MAX\n\n#define DUK_UINTPTR_MIN       0\n#define DUK_UINTPTR_MAX       UINTPTR_MAX\n#define DUK_INTPTR_MIN        INTPTR_MIN\n#define DUK_INTPTR_MAX        INTPTR_MAX\n\n#define DUK_UINTMAX_MIN       0\n#define DUK_UINTMAX_MAX       UINTMAX_MAX\n#define DUK_INTMAX_MIN        INTMAX_MIN\n#define DUK_INTMAX_MAX        INTMAX_MAX\n\n#define DUK_SIZE_MIN          0\n#define DUK_SIZE_MAX          SIZE_MAX\n#undef DUK_SIZE_MAX_COMPUTED\n\n#else  /* C99 types */\n\n/* When C99 types are not available, we use heuristic detection to get\n * the basic 8, 16, 32, and (possibly) 64 bit types.  The fast/least\n * types are then assumed to be exactly the same for now: these could\n * be improved per platform but C99 types are very often now available.\n * 64-bit types are not available on all platforms; this is OK at least\n * on 32-bit platforms.\n *\n * This detection code is necessarily a bit hacky and can provide typedefs\n * and defines that won't work correctly on some exotic platform.\n */\n\n#if (defined(CHAR_BIT) && (CHAR_BIT == 8)) || \\\n    (defined(UCHAR_MAX) && (UCHAR_MAX == 255))\ntypedef unsigned char duk_uint8_t;\ntypedef signed char duk_int8_t;\n#else\n#error cannot detect 8-bit type\n#endif\n\n#if defined(USHRT_MAX) && (USHRT_MAX == 65535UL)\ntypedef unsigned short duk_uint16_t;\ntypedef signed short duk_int16_t;\n#elif defined(UINT_MAX) && (UINT_MAX == 65535UL)\n/* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */\ntypedef unsigned int duk_uint16_t;\ntypedef signed int duk_int16_t;\n#else\n#error cannot detect 16-bit type\n#endif\n\n#if defined(UINT_MAX) && (UINT_MAX == 4294967295UL)\ntypedef unsigned int duk_uint32_t;\ntypedef signed int duk_int32_t;\n#elif defined(ULONG_MAX) && (ULONG_MAX == 4294967295UL)\n/* On some platforms int is 16-bit but long is 32-bit (e.g. PureC) */\ntypedef unsigned long duk_uint32_t;\ntypedef signed long duk_int32_t;\n#else\n#error cannot detect 32-bit type\n#endif\n\n/* 64-bit type detection is a bit tricky.\n *\n * ULLONG_MAX is a standard define.  __LONG_LONG_MAX__ and __ULONG_LONG_MAX__\n * are used by at least GCC (even if system headers don't provide ULLONG_MAX).\n * Some GCC variants may provide __LONG_LONG_MAX__ but not __ULONG_LONG_MAX__.\n *\n * ULL / LL constants are rejected / warned about by some compilers, even if\n * the compiler has a 64-bit type and the compiler/system headers provide an\n * unsupported constant (ULL/LL)!  Try to avoid using ULL / LL constants.\n * As a side effect we can only check that e.g. ULONG_MAX is larger than 32\n * bits but can't be sure it is exactly 64 bits.  Self tests will catch such\n * cases.\n */\n#undef DUK_F_HAVE_64BIT\n#if !defined(DUK_F_HAVE_64BIT) && defined(ULONG_MAX)\n#if (ULONG_MAX > 4294967295UL)\n#define DUK_F_HAVE_64BIT\ntypedef unsigned long duk_uint64_t;\ntypedef signed long duk_int64_t;\n#endif\n#endif\n#if !defined(DUK_F_HAVE_64BIT) && defined(ULLONG_MAX)\n#if (ULLONG_MAX > 4294967295UL)\n#define DUK_F_HAVE_64BIT\ntypedef unsigned long long duk_uint64_t;\ntypedef signed long long duk_int64_t;\n#endif\n#endif\n#if !defined(DUK_F_HAVE_64BIT) && defined(__ULONG_LONG_MAX__)\n#if (__ULONG_LONG_MAX__ > 4294967295UL)\n#define DUK_F_HAVE_64BIT\ntypedef unsigned long long duk_uint64_t;\ntypedef signed long long duk_int64_t;\n#endif\n#endif\n#if !defined(DUK_F_HAVE_64BIT) && defined(__LONG_LONG_MAX__)\n#if (__LONG_LONG_MAX__ > 2147483647L)\n#define DUK_F_HAVE_64BIT\ntypedef unsigned long long duk_uint64_t;\ntypedef signed long long duk_int64_t;\n#endif\n#endif\n#if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MINGW)\n#define DUK_F_HAVE_64BIT\ntypedef unsigned long duk_uint64_t;\ntypedef signed long duk_int64_t;\n#endif\n#if !defined(DUK_F_HAVE_64BIT) && defined(DUK_F_MSVC)\n#define DUK_F_HAVE_64BIT\ntypedef unsigned __int64 duk_uint64_t;\ntypedef signed __int64 duk_int64_t;\n#endif\n#if !defined(DUK_F_HAVE_64BIT)\n/* cannot detect 64-bit type, not always needed so don't error */\n#endif\n\ntypedef duk_uint8_t duk_uint_least8_t;\ntypedef duk_int8_t duk_int_least8_t;\ntypedef duk_uint16_t duk_uint_least16_t;\ntypedef duk_int16_t duk_int_least16_t;\ntypedef duk_uint32_t duk_uint_least32_t;\ntypedef duk_int32_t duk_int_least32_t;\ntypedef duk_uint8_t duk_uint_fast8_t;\ntypedef duk_int8_t duk_int_fast8_t;\ntypedef duk_uint16_t duk_uint_fast16_t;\ntypedef duk_int16_t duk_int_fast16_t;\ntypedef duk_uint32_t duk_uint_fast32_t;\ntypedef duk_int32_t duk_int_fast32_t;\n#if defined(DUK_F_HAVE_64BIT)\ntypedef duk_uint64_t duk_uint_least64_t;\ntypedef duk_int64_t duk_int_least64_t;\ntypedef duk_uint64_t duk_uint_fast64_t;\ntypedef duk_int64_t duk_int_fast64_t;\n#endif\n#if defined(DUK_F_HAVE_64BIT)\ntypedef duk_uint64_t duk_uintmax_t;\ntypedef duk_int64_t duk_intmax_t;\n#else\ntypedef duk_uint32_t duk_uintmax_t;\ntypedef duk_int32_t duk_intmax_t;\n#endif\n\n/* Note: the funny looking computations for signed minimum 16-bit, 32-bit, and\n * 64-bit values are intentional as the obvious forms (e.g. -0x80000000L) are\n * -not- portable.  See code-issues.txt for a detailed discussion.\n */\n#define DUK_UINT8_MIN         0UL\n#define DUK_UINT8_MAX         0xffUL\n#define DUK_INT8_MIN          (-0x80L)\n#define DUK_INT8_MAX          0x7fL\n#define DUK_UINT_LEAST8_MIN   0UL\n#define DUK_UINT_LEAST8_MAX   0xffUL\n#define DUK_INT_LEAST8_MIN    (-0x80L)\n#define DUK_INT_LEAST8_MAX    0x7fL\n#define DUK_UINT_FAST8_MIN    0UL\n#define DUK_UINT_FAST8_MAX    0xffUL\n#define DUK_INT_FAST8_MIN     (-0x80L)\n#define DUK_INT_FAST8_MAX     0x7fL\n#define DUK_UINT16_MIN        0UL\n#define DUK_UINT16_MAX        0xffffUL\n#define DUK_INT16_MIN         (-0x7fffL - 1L)\n#define DUK_INT16_MAX         0x7fffL\n#define DUK_UINT_LEAST16_MIN  0UL\n#define DUK_UINT_LEAST16_MAX  0xffffUL\n#define DUK_INT_LEAST16_MIN   (-0x7fffL - 1L)\n#define DUK_INT_LEAST16_MAX   0x7fffL\n#define DUK_UINT_FAST16_MIN   0UL\n#define DUK_UINT_FAST16_MAX   0xffffUL\n#define DUK_INT_FAST16_MIN    (-0x7fffL - 1L)\n#define DUK_INT_FAST16_MAX    0x7fffL\n#define DUK_UINT32_MIN        0UL\n#define DUK_UINT32_MAX        0xffffffffUL\n#define DUK_INT32_MIN         (-0x7fffffffL - 1L)\n#define DUK_INT32_MAX         0x7fffffffL\n#define DUK_UINT_LEAST32_MIN  0UL\n#define DUK_UINT_LEAST32_MAX  0xffffffffUL\n#define DUK_INT_LEAST32_MIN   (-0x7fffffffL - 1L)\n#define DUK_INT_LEAST32_MAX   0x7fffffffL\n#define DUK_UINT_FAST32_MIN   0UL\n#define DUK_UINT_FAST32_MAX   0xffffffffUL\n#define DUK_INT_FAST32_MIN    (-0x7fffffffL - 1L)\n#define DUK_INT_FAST32_MAX    0x7fffffffL\n\n/* 64-bit constants.  Since LL / ULL constants are not always available,\n * use computed values.  These values can't be used in preprocessor\n * comparisons; flag them as such.\n */\n#if defined(DUK_F_HAVE_64BIT)\n#define DUK_UINT64_MIN        ((duk_uint64_t) 0)\n#define DUK_UINT64_MAX        ((duk_uint64_t) -1)\n#define DUK_INT64_MIN         ((duk_int64_t) (~(DUK_UINT64_MAX >> 1)))\n#define DUK_INT64_MAX         ((duk_int64_t) (DUK_UINT64_MAX >> 1))\n#define DUK_UINT_LEAST64_MIN  DUK_UINT64_MIN\n#define DUK_UINT_LEAST64_MAX  DUK_UINT64_MAX\n#define DUK_INT_LEAST64_MIN   DUK_INT64_MIN\n#define DUK_INT_LEAST64_MAX   DUK_INT64_MAX\n#define DUK_UINT_FAST64_MIN   DUK_UINT64_MIN\n#define DUK_UINT_FAST64_MAX   DUK_UINT64_MAX\n#define DUK_INT_FAST64_MIN    DUK_INT64_MIN\n#define DUK_INT_FAST64_MAX    DUK_INT64_MAX\n#define DUK_UINT64_MIN_COMPUTED\n#define DUK_UINT64_MAX_COMPUTED\n#define DUK_INT64_MIN_COMPUTED\n#define DUK_INT64_MAX_COMPUTED\n#define DUK_UINT_LEAST64_MIN_COMPUTED\n#define DUK_UINT_LEAST64_MAX_COMPUTED\n#define DUK_INT_LEAST64_MIN_COMPUTED\n#define DUK_INT_LEAST64_MAX_COMPUTED\n#define DUK_UINT_FAST64_MIN_COMPUTED\n#define DUK_UINT_FAST64_MAX_COMPUTED\n#define DUK_INT_FAST64_MIN_COMPUTED\n#define DUK_INT_FAST64_MAX_COMPUTED\n#endif\n\n#if defined(DUK_F_HAVE_64BIT)\n#define DUK_UINTMAX_MIN       DUK_UINT64_MIN\n#define DUK_UINTMAX_MAX       DUK_UINT64_MAX\n#define DUK_INTMAX_MIN        DUK_INT64_MIN\n#define DUK_INTMAX_MAX        DUK_INT64_MAX\n#define DUK_UINTMAX_MIN_COMPUTED\n#define DUK_UINTMAX_MAX_COMPUTED\n#define DUK_INTMAX_MIN_COMPUTED\n#define DUK_INTMAX_MAX_COMPUTED\n#else\n#define DUK_UINTMAX_MIN       0UL\n#define DUK_UINTMAX_MAX       0xffffffffUL\n#define DUK_INTMAX_MIN        (-0x7fffffffL - 1L)\n#define DUK_INTMAX_MAX        0x7fffffffL\n#endif\n\n/* This detection is not very reliable. */\n#if defined(DUK_F_32BIT_PTRS)\ntypedef duk_int32_t duk_intptr_t;\ntypedef duk_uint32_t duk_uintptr_t;\n#define DUK_UINTPTR_MIN       DUK_UINT32_MIN\n#define DUK_UINTPTR_MAX       DUK_UINT32_MAX\n#define DUK_INTPTR_MIN        DUK_INT32_MIN\n#define DUK_INTPTR_MAX        DUK_INT32_MAX\n#elif defined(DUK_F_64BIT_PTRS) && defined(DUK_F_HAVE_64BIT)\ntypedef duk_int64_t duk_intptr_t;\ntypedef duk_uint64_t duk_uintptr_t;\n#define DUK_UINTPTR_MIN       DUK_UINT64_MIN\n#define DUK_UINTPTR_MAX       DUK_UINT64_MAX\n#define DUK_INTPTR_MIN        DUK_INT64_MIN\n#define DUK_INTPTR_MAX        DUK_INT64_MAX\n#define DUK_UINTPTR_MIN_COMPUTED\n#define DUK_UINTPTR_MAX_COMPUTED\n#define DUK_INTPTR_MIN_COMPUTED\n#define DUK_INTPTR_MAX_COMPUTED\n#else\n#error cannot determine intptr type\n#endif\n\n/* SIZE_MAX may be missing so use an approximate value for it. */\n#undef DUK_SIZE_MAX_COMPUTED\n#if !defined(SIZE_MAX)\n#define DUK_SIZE_MAX_COMPUTED\n#define SIZE_MAX              ((size_t) (-1))\n#endif\n#define DUK_SIZE_MIN          0\n#define DUK_SIZE_MAX          SIZE_MAX\n\n#endif  /* C99 types */\n\n/* A few types are assumed to always exist. */\ntypedef size_t duk_size_t;\ntypedef ptrdiff_t duk_ptrdiff_t;\n\n/* The best type for an \"all around int\" in Duktape internals is \"at least\n * 32 bit signed integer\" which is most convenient.  Same for unsigned type.\n * Prefer 'int' when large enough, as it is almost always a convenient type.\n */\n#if defined(UINT_MAX) && (UINT_MAX >= 0xffffffffUL)\ntypedef int duk_int_t;\ntypedef unsigned int duk_uint_t;\n#define DUK_INT_MIN           INT_MIN\n#define DUK_INT_MAX           INT_MAX\n#define DUK_UINT_MIN          0\n#define DUK_UINT_MAX          UINT_MAX\n#else\ntypedef duk_int_fast32_t duk_int_t;\ntypedef duk_uint_fast32_t duk_uint_t;\n#define DUK_INT_MIN           DUK_INT_FAST32_MIN\n#define DUK_INT_MAX           DUK_INT_FAST32_MAX\n#define DUK_UINT_MIN          DUK_UINT_FAST32_MIN\n#define DUK_UINT_MAX          DUK_UINT_FAST32_MAX\n#endif\n\n/* Same as 'duk_int_t' but guaranteed to be a 'fast' variant if this\n * distinction matters for the CPU.  These types are used mainly in the\n * executor where it might really matter.\n */\ntypedef duk_int_fast32_t duk_int_fast_t;\ntypedef duk_uint_fast32_t duk_uint_fast_t;\n#define DUK_INT_FAST_MIN      DUK_INT_FAST32_MIN\n#define DUK_INT_FAST_MAX      DUK_INT_FAST32_MAX\n#define DUK_UINT_FAST_MIN     DUK_UINT_FAST32_MIN\n#define DUK_UINT_FAST_MAX     DUK_UINT_FAST32_MAX\n\n/* Small integers (16 bits or more) can fall back to the 'int' type, but\n * have a typedef so they are marked \"small\" explicitly.\n */\ntypedef int duk_small_int_t;\ntypedef unsigned int duk_small_uint_t;\n#define DUK_SMALL_INT_MIN     INT_MIN\n#define DUK_SMALL_INT_MAX     INT_MAX\n#define DUK_SMALL_UINT_MIN    0\n#define DUK_SMALL_UINT_MAX    UINT_MAX\n\n/* Fast variants of small integers, again for really fast paths like the\n * executor.\n */\ntypedef duk_int_fast16_t duk_small_int_fast_t;\ntypedef duk_uint_fast16_t duk_small_uint_fast_t;\n#define DUK_SMALL_INT_FAST_MIN    DUK_INT_FAST16_MIN\n#define DUK_SMALL_INT_FAST_MAX    DUK_INT_FAST16_MAX\n#define DUK_SMALL_UINT_FAST_MIN   DUK_UINT_FAST16_MIN\n#define DUK_SMALL_UINT_FAST_MAX   DUK_UINT_FAST16_MAX\n\n/* Boolean values are represented with the platform 'unsigned int'. */\ntypedef duk_small_uint_t duk_bool_t;\n#define DUK_BOOL_MIN              DUK_SMALL_INT_MIN\n#define DUK_BOOL_MAX              DUK_SMALL_INT_MAX\n\n/* Index values must have at least 32-bit signed range. */\ntypedef duk_int_t duk_idx_t;\n#define DUK_IDX_MIN               DUK_INT_MIN\n#define DUK_IDX_MAX               DUK_INT_MAX\n\n/* Unsigned index variant. */\ntypedef duk_uint_t duk_uidx_t;\n#define DUK_UIDX_MIN              DUK_UINT_MIN\n#define DUK_UIDX_MAX              DUK_UINT_MAX\n\n/* Array index values, could be exact 32 bits.\n * Currently no need for signed duk_arridx_t.\n */\ntypedef duk_uint_t duk_uarridx_t;\n#define DUK_UARRIDX_MIN           DUK_UINT_MIN\n#define DUK_UARRIDX_MAX           DUK_UINT_MAX\n\n/* Duktape/C function return value, platform int is enough for now to\n * represent 0, 1, or negative error code.  Must be compatible with\n * assigning truth values (e.g. duk_ret_t rc = (foo == bar);).\n */\ntypedef duk_small_int_t duk_ret_t;\n#define DUK_RET_MIN               DUK_SMALL_INT_MIN\n#define DUK_RET_MAX               DUK_SMALL_INT_MAX\n\n/* Error codes are represented with platform int.  High bits are used\n * for flags and such, so 32 bits are needed.\n */\ntypedef duk_int_t duk_errcode_t;\n#define DUK_ERRCODE_MIN           DUK_INT_MIN\n#define DUK_ERRCODE_MAX           DUK_INT_MAX\n\n/* Codepoint type.  Must be 32 bits or more because it is used also for\n * internal codepoints.  The type is signed because negative codepoints\n * are used as internal markers (e.g. to mark EOF or missing argument).\n * (X)UTF-8/CESU-8 encode/decode take and return an unsigned variant to\n * ensure duk_uint32_t casts back and forth nicely.  Almost everything\n * else uses the signed one.\n */\ntypedef duk_int_t duk_codepoint_t;\ntypedef duk_uint_t duk_ucodepoint_t;\n#define DUK_CODEPOINT_MIN         DUK_INT_MIN\n#define DUK_CODEPOINT_MAX         DUK_INT_MAX\n#define DUK_UCODEPOINT_MIN        DUK_UINT_MIN\n#define DUK_UCODEPOINT_MAX        DUK_UINT_MAX\n\n/* IEEE float/double typedef. */\ntypedef float duk_float_t;\ntypedef double duk_double_t;\n\n/* We're generally assuming that we're working on a platform with a 32-bit\n * address space.  If DUK_SIZE_MAX is a typecast value (which is necessary\n * if SIZE_MAX is missing), the check must be avoided because the\n * preprocessor can't do a comparison.\n */\n#if !defined(DUK_SIZE_MAX)\n#error DUK_SIZE_MAX is undefined, probably missing SIZE_MAX\n#elif !defined(DUK_SIZE_MAX_COMPUTED)\n#if DUK_SIZE_MAX < 0xffffffffUL\n/* On some systems SIZE_MAX can be smaller than max unsigned 32-bit value\n * which seems incorrect if size_t is (at least) an unsigned 32-bit type.\n * However, it doesn't seem useful to error out compilation if this is the\n * case.\n */\n#endif\n#endif\n\n/* Type used in public API declarations and user code.  Typedef maps to\n * 'struct duk_hthread' like the 'duk_hthread' typedef which is used\n * exclusively in internals.\n */\ntypedef struct duk_hthread duk_context;\n\n/* Check whether we should use 64-bit integers or not.\n *\n * Quite incomplete now.  Use 64-bit types if detected (C99 or other detection)\n * unless they are known to be unreliable.  For instance, 64-bit types are\n * available on VBCC but seem to misbehave.\n */\n#if defined(DUK_F_HAVE_64BIT) && !defined(DUK_F_VBCC)\n#define DUK_USE_64BIT_OPS\n#else\n#undef DUK_USE_64BIT_OPS\n#endif\n\n/*\n *  Fill-ins for platform, architecture, and compiler\n */\n\n/* An abort()-like primitive is needed by the default fatal error handler. */\n#if !defined(DUK_ABORT)\n#define DUK_ABORT             abort\n#endif\n\n#if !defined(DUK_SETJMP)\n#define DUK_JMPBUF_TYPE       jmp_buf\n#define DUK_SETJMP(jb)        setjmp((jb))\n#define DUK_LONGJMP(jb)       longjmp((jb), 1)\n#endif\n\n#if 0\n/* sigsetjmp() alternative */\n#define DUK_JMPBUF_TYPE       sigjmp_buf\n#define DUK_SETJMP(jb)        sigsetjmp((jb))\n#define DUK_LONGJMP(jb)       siglongjmp((jb), 1)\n#endif\n\n/* Special naming to avoid conflict with e.g. DUK_FREE() in duk_heap.h\n * (which is unfortunately named).  May sometimes need replacement, e.g.\n * some compilers don't handle zero length or NULL correctly in realloc().\n */\n#if !defined(DUK_ANSI_MALLOC)\n#define DUK_ANSI_MALLOC      malloc\n#endif\n#if !defined(DUK_ANSI_REALLOC)\n#define DUK_ANSI_REALLOC     realloc\n#endif\n#if !defined(DUK_ANSI_CALLOC)\n#define DUK_ANSI_CALLOC      calloc\n#endif\n#if !defined(DUK_ANSI_FREE)\n#define DUK_ANSI_FREE        free\n#endif\n\n/* ANSI C (various versions) and some implementations require that the\n * pointer arguments to memset(), memcpy(), and memmove() be valid values\n * even when byte size is 0 (even a NULL pointer is considered invalid in\n * this context).  Zero-size operations as such are allowed, as long as their\n * pointer arguments point to a valid memory area.  The DUK_MEMSET(),\n * DUK_MEMCPY(), and DUK_MEMMOVE() macros require this same behavior, i.e.:\n * (1) pointers must be valid and non-NULL, (2) zero size must otherwise be\n * allowed.  If these are not fulfilled, a macro wrapper is needed.\n *\n *   http://stackoverflow.com/questions/5243012/is-it-guaranteed-to-be-safe-to-perform-memcpy0-0-0\n *   http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-October/011065.html\n *\n * Not sure what's the required behavior when a pointer points just past the\n * end of a buffer, which often happens in practice (e.g. zero size memmoves).\n * For example, if allocation size is 3, the following pointer would not\n * technically point to a valid memory byte:\n *\n *   <-- alloc -->\n *   | 0 | 1 | 2 | .....\n *                 ^-- p=3, points after last valid byte (2)\n */\n#if !defined(DUK_MEMCPY)\n#if defined(DUK_F_UCLIBC)\n/* Old uclibcs have a broken memcpy so use memmove instead (this is overly wide\n * now on purpose): http://lists.uclibc.org/pipermail/uclibc-cvs/2008-October/025511.html\n */\n#define DUK_MEMCPY       memmove\n#else\n#define DUK_MEMCPY       memcpy\n#endif\n#endif\n#if !defined(DUK_MEMMOVE)\n#define DUK_MEMMOVE      memmove\n#endif\n#if !defined(DUK_MEMCMP)\n#define DUK_MEMCMP       memcmp\n#endif\n#if !defined(DUK_MEMSET)\n#define DUK_MEMSET       memset\n#endif\n#if !defined(DUK_STRLEN)\n#define DUK_STRLEN       strlen\n#endif\n#if !defined(DUK_STRCMP)\n#define DUK_STRCMP       strcmp\n#endif\n#if !defined(DUK_STRNCMP)\n#define DUK_STRNCMP      strncmp\n#endif\n#if !defined(DUK_SPRINTF)\n#define DUK_SPRINTF      sprintf\n#endif\n#if !defined(DUK_SNPRINTF)\n/* snprintf() is technically not part of C89 but usually available. */\n#define DUK_SNPRINTF     snprintf\n#endif\n#if !defined(DUK_VSPRINTF)\n#define DUK_VSPRINTF     vsprintf\n#endif\n#if !defined(DUK_VSNPRINTF)\n/* vsnprintf() is technically not part of C89 but usually available. */\n#define DUK_VSNPRINTF    vsnprintf\n#endif\n#if !defined(DUK_SSCANF)\n#define DUK_SSCANF       sscanf\n#endif\n#if !defined(DUK_VSSCANF)\n#define DUK_VSSCANF      vsscanf\n#endif\n#if !defined(DUK_MEMZERO)\n#define DUK_MEMZERO(p,n) DUK_MEMSET((p), 0, (n))\n#endif\n\n#if !defined(DUK_DOUBLE_INFINITY)\n#undef DUK_USE_COMPUTED_INFINITY\n#if defined(DUK_F_GCC_VERSION) && (DUK_F_GCC_VERSION < 40600)\n/* GCC older than 4.6: avoid overflow warnings related to using INFINITY */\n#define DUK_DOUBLE_INFINITY  (__builtin_inf())\n#elif defined(INFINITY)\n#define DUK_DOUBLE_INFINITY  ((double) INFINITY)\n#elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \\\n      !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX)\n#define DUK_DOUBLE_INFINITY  (1.0 / 0.0)\n#else\n/* In VBCC (1.0 / 0.0) results in a warning and 0.0 instead of infinity.\n * Use a computed infinity (initialized when a heap is created at the\n * latest).\n */\n#define DUK_USE_COMPUTED_INFINITY\n#define DUK_DOUBLE_INFINITY  duk_computed_infinity\n#endif\n#endif\n\n#if !defined(DUK_DOUBLE_NAN)\n#undef DUK_USE_COMPUTED_NAN\n#if defined(NAN)\n#define DUK_DOUBLE_NAN       NAN\n#elif !defined(DUK_F_VBCC) && !defined(DUK_F_MSVC) && !defined(DUK_F_BCC) && \\\n      !defined(DUK_F_OLD_SOLARIS) && !defined(DUK_F_AIX)\n#define DUK_DOUBLE_NAN       (0.0 / 0.0)\n#else\n/* In VBCC (0.0 / 0.0) results in a warning and 0.0 instead of NaN.\n * In MSVC (VS2010 Express) (0.0 / 0.0) results in a compile error.\n * Use a computed NaN (initialized when a heap is created at the\n * latest).\n */\n#define DUK_USE_COMPUTED_NAN\n#define DUK_DOUBLE_NAN       duk_computed_nan\n#endif\n#endif\n\n/* Many platforms are missing fpclassify() and friends, so use replacements\n * if necessary.  The replacement constants (FP_NAN etc) can be anything but\n * match Linux constants now.\n */\n#undef DUK_USE_REPL_FPCLASSIFY\n#undef DUK_USE_REPL_SIGNBIT\n#undef DUK_USE_REPL_ISFINITE\n#undef DUK_USE_REPL_ISNAN\n#undef DUK_USE_REPL_ISINF\n\n/* Complex condition broken into separate parts. */\n#undef DUK_F_USE_REPL_ALL\n#if !(defined(FP_NAN) && defined(FP_INFINITE) && defined(FP_ZERO) && \\\n      defined(FP_SUBNORMAL) && defined(FP_NORMAL))\n/* Missing some obvious constants. */\n#define DUK_F_USE_REPL_ALL\n#elif defined(DUK_F_AMIGAOS) && defined(DUK_F_VBCC)\n/* VBCC is missing the built-ins even in C99 mode (perhaps a header issue). */\n#define DUK_F_USE_REPL_ALL\n#elif defined(DUK_F_AMIGAOS) && defined(DUK_F_M68K)\n/* AmigaOS + M68K seems to have math issues even when using GCC cross\n * compilation.  Use replacements for all AmigaOS versions on M68K\n * regardless of compiler.\n */\n#define DUK_F_USE_REPL_ALL\n#elif defined(DUK_F_FREEBSD) && defined(DUK_F_CLANG)\n/* Placeholder fix for (detection is wider than necessary):\n * http://llvm.org/bugs/show_bug.cgi?id=17788\n */\n#define DUK_F_USE_REPL_ALL\n#elif defined(DUK_F_UCLIBC)\n/* At least some uclibc versions have broken floating point math.  For\n * example, fpclassify() can incorrectly classify certain NaN formats.\n * To be safe, use replacements.\n */\n#define DUK_F_USE_REPL_ALL\n#elif defined(DUK_F_AIX)\n/* Older versions may be missing isnan(), etc. */\n#define DUK_F_USE_REPL_ALL\n#endif\n\n#if defined(DUK_F_USE_REPL_ALL)\n#define DUK_USE_REPL_FPCLASSIFY\n#define DUK_USE_REPL_SIGNBIT\n#define DUK_USE_REPL_ISFINITE\n#define DUK_USE_REPL_ISNAN\n#define DUK_USE_REPL_ISINF\n#define DUK_FPCLASSIFY       duk_repl_fpclassify\n#define DUK_SIGNBIT          duk_repl_signbit\n#define DUK_ISFINITE         duk_repl_isfinite\n#define DUK_ISNAN            duk_repl_isnan\n#define DUK_ISINF            duk_repl_isinf\n#define DUK_FP_NAN           0\n#define DUK_FP_INFINITE      1\n#define DUK_FP_ZERO          2\n#define DUK_FP_SUBNORMAL     3\n#define DUK_FP_NORMAL        4\n#else\n#define DUK_FPCLASSIFY       fpclassify\n#define DUK_SIGNBIT          signbit\n#define DUK_ISFINITE         isfinite\n#define DUK_ISNAN            isnan\n#define DUK_ISINF            isinf\n#define DUK_FP_NAN           FP_NAN\n#define DUK_FP_INFINITE      FP_INFINITE\n#define DUK_FP_ZERO          FP_ZERO\n#define DUK_FP_SUBNORMAL     FP_SUBNORMAL\n#define DUK_FP_NORMAL        FP_NORMAL\n#endif\n\n#if defined(DUK_F_USE_REPL_ALL)\n#undef DUK_F_USE_REPL_ALL\n#endif\n\n/* These functions don't currently need replacement but are wrapped for\n * completeness.  Because these are used as function pointers, they need\n * to be defined as concrete C functions (not macros).\n */\n#if !defined(DUK_FABS)\n#define DUK_FABS             fabs\n#endif\n#if !defined(DUK_FLOOR)\n#define DUK_FLOOR            floor\n#endif\n#if !defined(DUK_CEIL)\n#define DUK_CEIL             ceil\n#endif\n#if !defined(DUK_FMOD)\n#define DUK_FMOD             fmod\n#endif\n#if !defined(DUK_POW)\n#define DUK_POW              pow\n#endif\n#if !defined(DUK_ACOS)\n#define DUK_ACOS             acos\n#endif\n#if !defined(DUK_ASIN)\n#define DUK_ASIN             asin\n#endif\n#if !defined(DUK_ATAN)\n#define DUK_ATAN             atan\n#endif\n#if !defined(DUK_ATAN2)\n#define DUK_ATAN2            atan2\n#endif\n#if !defined(DUK_SIN)\n#define DUK_SIN              sin\n#endif\n#if !defined(DUK_COS)\n#define DUK_COS              cos\n#endif\n#if !defined(DUK_TAN)\n#define DUK_TAN              tan\n#endif\n#if !defined(DUK_EXP)\n#define DUK_EXP              exp\n#endif\n#if !defined(DUK_LOG)\n#define DUK_LOG              log\n#endif\n#if !defined(DUK_SQRT)\n#define DUK_SQRT             sqrt\n#endif\n\n/* The functions below exist only in C99/C++11 or later and need a workaround\n * for platforms that don't include them.  MSVC isn't detected as C99, but\n * these functions also exist in MSVC 2013 and later so include a clause for\n * that too.  Android doesn't have log2; disable all of these for Android.\n */\n#if (defined(DUK_F_C99) || defined(DUK_F_CPP11) || (defined(_MSC_VER) && (_MSC_VER >= 1800))) && \\\n    !defined(DUK_F_ANDROID) && !defined(DUK_F_MINT)\n#if !defined(DUK_CBRT)\n#define DUK_CBRT             cbrt\n#endif\n#if !defined(DUK_LOG2)\n#define DUK_LOG2             log2\n#endif\n#if !defined(DUK_LOG10)\n#define DUK_LOG10            log10\n#endif\n#if !defined(DUK_TRUNC)\n#define DUK_TRUNC            trunc\n#endif\n#endif  /* DUK_F_C99 etc */\n\n/* NetBSD 6.0 x86 (at least) has a few problems with pow() semantics,\n * see test-bug-netbsd-math-pow.js.  MinGW has similar (but different)\n * issues, see test-bug-mingw-math-issues.js.  Enable pow() workarounds\n * for these targets.\n */\n#undef DUK_USE_POW_WORKAROUNDS\n#if defined(DUK_F_NETBSD) || defined(DUK_F_MINGW)\n#define DUK_USE_POW_WORKAROUNDS\n#endif\n\n/* Similar workarounds for atan2() semantics issues.  MinGW issues are\n * documented in test-bug-mingw-math-issues.js.\n */\n#undef DUK_USE_ATAN2_WORKAROUNDS\n#if defined(DUK_F_MINGW)\n#define DUK_USE_ATAN2_WORKAROUNDS\n#endif\n\n/* Rely as little as possible on compiler behavior for NaN comparison,\n * signed zero handling, etc.  Currently never activated but may be needed\n * for broken compilers.\n */\n#undef DUK_USE_PARANOID_MATH\n\n/* There was a curious bug where test-bi-date-canceling.js would fail e.g.\n * on 64-bit Ubuntu, gcc-4.8.1, -m32, and no -std=c99.  Some date computations\n * using doubles would be optimized which then broke some corner case tests.\n * The problem goes away by adding 'volatile' to the datetime computations.\n * Not sure what the actual triggering conditions are, but using this on\n * non-C99 systems solves the known issues and has relatively little cost\n * on other platforms.\n */\n#undef DUK_USE_PARANOID_DATE_COMPUTATION\n#if !defined(DUK_F_C99)\n#define DUK_USE_PARANOID_DATE_COMPUTATION\n#endif\n\n/*\n *  Byte order and double memory layout detection\n *\n *  Endianness detection is a major portability hassle because the macros\n *  and headers are not standardized.  There's even variance across UNIX\n *  platforms.  Even with \"standard\" headers, details like underscore count\n *  varies between platforms, e.g. both __BYTE_ORDER and _BYTE_ORDER are used\n *  (Crossbridge has a single underscore, for instance).\n *\n *  The checks below are structured with this in mind: several approaches are\n *  used, and at the end we check if any of them worked.  This allows generic\n *  approaches to be tried first, and platform/compiler specific hacks tried\n *  last.  As a last resort, the user can force a specific endianness, as it's\n *  not likely that automatic detection will work on the most exotic platforms.\n *\n *  Duktape supports little and big endian machines.  There's also support\n *  for a hybrid used by some ARM machines where integers are little endian\n *  but IEEE double values use a mixed order (12345678 -> 43218765).  This\n *  byte order for doubles is referred to as \"mixed endian\".\n */\n\n/* GCC and Clang provide endianness defines as built-in predefines, with\n * leading and trailing double underscores (e.g. __BYTE_ORDER__).  See\n * output of \"make gccpredefs\" and \"make clangpredefs\".  Clang doesn't\n * seem to provide __FLOAT_WORD_ORDER__; assume not mixed endian for clang.\n * http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html\n */\n#if !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__)\n#if defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)\n#if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__)\n#define DUK_USE_BYTEORDER 1\n#elif defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)\n#define DUK_USE_BYTEORDER 2\n#elif !defined(__FLOAT_WORD_ORDER__)\n/* Float word order not known, assume not a hybrid. */\n#define DUK_USE_BYTEORDER 1\n#else\n/* Byte order is little endian but cannot determine IEEE double word order. */\n#endif  /* float word order */\n#elif defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)\n#if defined(__FLOAT_WORD_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__)\n#define DUK_USE_BYTEORDER 3\n#elif !defined(__FLOAT_WORD_ORDER__)\n/* Float word order not known, assume not a hybrid. */\n#define DUK_USE_BYTEORDER 3\n#else\n/* Byte order is big endian but cannot determine IEEE double word order. */\n#endif  /* float word order */\n#else\n/* Cannot determine byte order; __ORDER_PDP_ENDIAN__ is related to 32-bit\n * integer ordering and is not relevant.\n */\n#endif  /* integer byte order */\n#endif  /* !defined(DUK_USE_BYTEORDER) && defined(__BYTE_ORDER__) */\n\n/* More or less standard endianness predefines provided by header files.\n * The ARM hybrid case is detected by assuming that __FLOAT_WORD_ORDER\n * will be big endian, see: http://lists.mysql.com/internals/443.\n * On some platforms some defines may be present with an empty value which\n * causes comparisons to fail: https://github.com/svaarala/duktape/issues/453.\n */\n#if !defined(DUK_USE_BYTEORDER)\n#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN) || \\\n    defined(_BYTE_ORDER) && defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN) || \\\n    defined(__LITTLE_ENDIAN__)\n#if defined(__FLOAT_WORD_ORDER) && defined(__LITTLE_ENDIAN) && (__FLOAT_WORD_ORDER == __LITTLE_ENDIAN) || \\\n    defined(_FLOAT_WORD_ORDER) && defined(_LITTLE_ENDIAN) && (_FLOAT_WORD_ORDER == _LITTLE_ENDIAN)\n#define DUK_USE_BYTEORDER 1\n#elif defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \\\n      defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN)\n#define DUK_USE_BYTEORDER 2\n#elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER)\n/* Float word order not known, assume not a hybrid. */\n#define DUK_USE_BYTEORDER 1\n#else\n/* Byte order is little endian but cannot determine IEEE double word order. */\n#endif  /* float word order */\n#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN) || \\\n      defined(_BYTE_ORDER) && defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN) || \\\n      defined(__BIG_ENDIAN__)\n#if defined(__FLOAT_WORD_ORDER) && defined(__BIG_ENDIAN) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) || \\\n    defined(_FLOAT_WORD_ORDER) && defined(_BIG_ENDIAN) && (_FLOAT_WORD_ORDER == _BIG_ENDIAN)\n#define DUK_USE_BYTEORDER 3\n#elif !defined(__FLOAT_WORD_ORDER) && !defined(_FLOAT_WORD_ORDER)\n/* Float word order not known, assume not a hybrid. */\n#define DUK_USE_BYTEORDER 3\n#else\n/* Byte order is big endian but cannot determine IEEE double word order. */\n#endif  /* float word order */\n#else\n/* Cannot determine byte order. */\n#endif  /* integer byte order */\n#endif  /* !defined(DUK_USE_BYTEORDER) */\n\n/* QNX gcc cross compiler seems to define e.g. __LITTLEENDIAN__ or __BIGENDIAN__:\n *  $ /opt/qnx650/host/linux/x86/usr/bin/i486-pc-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian\n *  67:#define __LITTLEENDIAN__ 1\n *  $ /opt/qnx650/host/linux/x86/usr/bin/mips-unknown-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian\n *  81:#define __BIGENDIAN__ 1\n *  $ /opt/qnx650/host/linux/x86/usr/bin/arm-unknown-nto-qnx6.5.0-gcc -dM -E - </dev/null | grep -ni endian\n *  70:#define __LITTLEENDIAN__ 1\n */\n#if !defined(DUK_USE_BYTEORDER)\n#if defined(__LITTLEENDIAN__)\n#define DUK_USE_BYTEORDER 1\n#elif defined(__BIGENDIAN__)\n#define DUK_USE_BYTEORDER 3\n#endif\n#endif\n\n/*\n *  Alignment requirement and support for unaligned accesses\n *\n *  Assume unaligned accesses are not supported unless specifically allowed\n *  in the target platform.  Some platforms may support unaligned accesses\n *  but alignment to 4 or 8 may still be desirable.\n */\n\n/* If not provided, use safe default for alignment. */\n#if !defined(DUK_USE_ALIGN_BY)\n#define DUK_USE_ALIGN_BY 8\n#endif\n\n/* Compiler specific hackery needed to force struct size to match aligment,\n * see e.g. duk_hbuffer.h.\n *\n * http://stackoverflow.com/questions/11130109/c-struct-size-alignment\n * http://stackoverflow.com/questions/10951039/specifying-64-bit-alignment\n */\n#if !(defined(DUK_USE_PACK_MSVC_PRAGMA) || defined(DUK_USE_PACK_GCC_ATTR) || \\\n      defined(DUK_USE_PACK_CLANG_ATTR) || defined(DUK_USE_PACK_DUMMY_MEMBER))\n#define DUK_USE_PACK_DUMMY_MEMBER\n#endif\n\n#if !defined(DUK_VA_COPY)\n/* We need va_copy() which is defined in C99 / C++11, so an awkward\n * replacement is needed for pre-C99 / pre-C++11 environments.  This\n * will quite likely need portability hacks for some non-C99\n * environments.\n */\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n/* C99 / C++11 and above: rely on va_copy() which is required.\n * Omit parenthesis on macro right side on purpose to minimize differences\n * to direct use.\n */\n#define DUK_VA_COPY(dest,src) va_copy(dest,src)\n#else\n/* Pre-C99: va_list type is implementation dependent.  This replacement\n * assumes it is a plain value so that a simple assignment will work.\n * This is not the case on all platforms (it may be a single-array element,\n * for instance).\n */\n#define DUK_VA_COPY(dest,src) do { (dest) = (src); } while (0)\n#endif\n#endif\n\n#if !defined(DUK_MACRO_STRINGIFY)\n/* Macro hackery to convert e.g. __LINE__ to a string without formatting,\n * see: http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string\n */\n#define DUK_MACRO_STRINGIFY_HELPER(x)  #x\n#define DUK_MACRO_STRINGIFY(x)  DUK_MACRO_STRINGIFY_HELPER(x)\n#endif\n\n#if !defined(DUK_CAUSE_SEGFAULT)\n/* This can be used for testing; valgrind will then indicate the C call stack\n * leading to the call site.\n */\n#define DUK_CAUSE_SEGFAULT()  do { *((volatile duk_uint32_t *) NULL) = (duk_uint32_t) 0xdeadbeefUL; } while (0)\n#endif\n#if !defined(DUK_UNREF)\n/* Macro for suppressing warnings for potentially unreferenced variables.\n * The variables can be actually unreferenced or unreferenced in some\n * specific cases only; for instance, if a variable is only debug printed,\n * it is unreferenced when debug printing is disabled.  May cause warnings\n * for volatile arguments.\n */\n#define DUK_UNREF(x)  do { (void) (x); } while (0)\n#endif\n#if !defined(DUK_NORETURN)\n#define DUK_NORETURN(decl)  decl\n#endif\n#if !defined(DUK_UNREACHABLE)\n/* Don't know how to declare unreachable point, so don't do it; this\n * may cause some spurious compilation warnings (e.g. \"variable used\n * uninitialized\").\n */\n#define DUK_UNREACHABLE()  do { } while (0)\n#endif\n#if !defined(DUK_LOSE_CONST)\n/* Convert any input pointer into a \"void *\", losing a const qualifier.\n * This is not fully portable because casting through duk_uintptr_t may\n * not work on all architectures (e.g. those with long, segmented pointers).\n */\n#define DUK_LOSE_CONST(src) ((void *) (duk_uintptr_t) (src))\n#endif\n\n#if !defined(DUK_LIKELY)\n#define DUK_LIKELY(x)    (x)\n#endif\n#if !defined(DUK_UNLIKELY)\n#define DUK_UNLIKELY(x)  (x)\n#endif\n#if !defined(DUK_UNPREDICTABLE)\n#define DUK_UNPREDICTABLE(x)  (x)\n#endif\n\n#if !defined(DUK_NOINLINE)\n#define DUK_NOINLINE       /*nop*/\n#endif\n#if !defined(DUK_INLINE)\n#define DUK_INLINE         /*nop*/\n#endif\n#if !defined(DUK_ALWAYS_INLINE)\n#define DUK_ALWAYS_INLINE  /*nop*/\n#endif\n\n#if !defined(DUK_HOT)\n#define DUK_HOT            /*nop*/\n#endif\n#if !defined(DUK_COLD)\n#define DUK_COLD           /*nop*/\n#endif\n\n#if !defined(DUK_EXTERNAL_DECL)\n#define DUK_EXTERNAL_DECL  extern\n#endif\n#if !defined(DUK_EXTERNAL)\n#define DUK_EXTERNAL       /*empty*/\n#endif\n#if !defined(DUK_INTERNAL_DECL)\n#if defined(DUK_SINGLE_FILE)\n#define DUK_INTERNAL_DECL  static\n#else\n#define DUK_INTERNAL_DECL  extern\n#endif\n#endif\n#if !defined(DUK_INTERNAL)\n#if defined(DUK_SINGLE_FILE)\n#define DUK_INTERNAL       static\n#else\n#define DUK_INTERNAL       /*empty*/\n#endif\n#endif\n#if !defined(DUK_LOCAL_DECL)\n#define DUK_LOCAL_DECL     static\n#endif\n#if !defined(DUK_LOCAL)\n#define DUK_LOCAL          static\n#endif\n\n#if !defined(DUK_FILE_MACRO)\n#define DUK_FILE_MACRO  __FILE__\n#endif\n#if !defined(DUK_LINE_MACRO)\n#define DUK_LINE_MACRO  __LINE__\n#endif\n#if !defined(DUK_FUNC_MACRO)\n#if defined(DUK_F_C99) || defined(DUK_F_CPP11)\n#define DUK_FUNC_MACRO  __func__\n#elif defined(__FUNCTION__)\n#define DUK_FUNC_MACRO  __FUNCTION__\n#else\n#define DUK_FUNC_MACRO  \"unknown\"\n#endif\n#endif\n\n#if !defined(DUK_BSWAP32)\n#define DUK_BSWAP32(x) \\\n\t((((duk_uint32_t) (x)) >> 24) | \\\n\t ((((duk_uint32_t) (x)) >> 8) & 0xff00UL) | \\\n\t ((((duk_uint32_t) (x)) << 8) & 0xff0000UL) | \\\n\t (((duk_uint32_t) (x)) << 24))\n#endif\n#if !defined(DUK_BSWAP16)\n#define DUK_BSWAP16(x) \\\n\t((duk_uint16_t) (x) >> 8) | \\\n\t((duk_uint16_t) (x) << 8)\n#endif\n\n/* DUK_USE_VARIADIC_MACROS: required from compilers, so no fill-in. */\n/* DUK_USE_UNION_INITIALIZERS: required from compilers, so no fill-in. */\n\n#if !(defined(DUK_USE_FLEX_C99) || defined(DUK_USE_FLEX_ZEROSIZE) || defined(DUK_USE_FLEX_ONESIZE))\n#if defined(DUK_F_C99)\n#define DUK_USE_FLEX_C99\n#else\n#define DUK_USE_FLEX_ZEROSIZE  /* Not standard but common enough */\n#endif\n#endif\n\n#if !(defined(DUK_USE_PACK_GCC_ATTR) || defined(DUK_USE_PACK_CLANG_ATTR) || \\\n      defined(DUK_USE_PACK_MSVC_PRAGMA) || defined(DUK_USE_PACK_DUMMY_MEMBER))\n#define DUK_USE_PACK_DUMMY_MEMBER\n#endif\n\n#if 0  /* not defined by default */\n#undef DUK_USE_GCC_PRAGMAS\n#endif\n\n#if !defined(DUK_U64_CONSTANT)\n#define DUK_U64_CONSTANT(x) x##ULL\n#endif\n#if !defined(DUK_I64_CONSTANT)\n#define DUK_I64_CONSTANT(x) x##LL\n#endif\n\n/* Workaround for GH-323: avoid inlining control when compiling from\n * multiple sources, as it causes compiler portability trouble.\n */\n#if !defined(DUK_SINGLE_FILE)\n#undef DUK_NOINLINE\n#undef DUK_INLINE\n#undef DUK_ALWAYS_INLINE\n#define DUK_NOINLINE       /*nop*/\n#define DUK_INLINE         /*nop*/\n#define DUK_ALWAYS_INLINE  /*nop*/\n#endif\n\n/*\n *  Check whether or not a packed duk_tval representation is possible.\n *  What's basically required is that pointers are 32-bit values\n *  (sizeof(void *) == 4).  Best effort check, not always accurate.\n *  If guess goes wrong, crashes may result; self tests also verify\n *  the guess.\n */\n\n/* Explicit marker needed; may be 'defined', 'undefined, 'or 'not provided'. */\n#if !defined(DUK_F_PACKED_TVAL_PROVIDED)\n#undef DUK_F_PACKED_TVAL_POSSIBLE\n\n/* Strict C99 case: DUK_UINTPTR_MAX (= UINTPTR_MAX) should be very reliable */\n#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX)\n#if (DUK_UINTPTR_MAX <= 0xffffffffUL)\n#define DUK_F_PACKED_TVAL_POSSIBLE\n#endif\n#endif\n\n/* Non-C99 case, still relying on DUK_UINTPTR_MAX, as long as it is not a computed value */\n#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_UINTPTR_MAX) && !defined(DUK_UINTPTR_MAX_COMPUTED)\n#if (DUK_UINTPTR_MAX <= 0xffffffffUL)\n#define DUK_F_PACKED_TVAL_POSSIBLE\n#endif\n#endif\n\n/* DUK_SIZE_MAX (= SIZE_MAX) is often reliable */\n#if !defined(DUK_F_PACKED_TVAL_POSSIBLE) && defined(DUK_SIZE_MAX) && !defined(DUK_SIZE_MAX_COMPUTED)\n#if (DUK_SIZE_MAX <= 0xffffffffUL)\n#define DUK_F_PACKED_TVAL_POSSIBLE\n#endif\n#endif\n\n#undef DUK_USE_PACKED_TVAL\n#if defined(DUK_F_PACKED_TVAL_POSSIBLE)\n#define DUK_USE_PACKED_TVAL\n#endif\n\n#undef DUK_F_PACKED_TVAL_POSSIBLE\n#endif  /* DUK_F_PACKED_TVAL_PROVIDED */\n/* Object property allocation layout has implications for memory and code\n * footprint and generated code size/speed.  The best layout also depends\n * on whether the platform has alignment requirements or benefits from\n * having mostly aligned accesses.\n */\n#undef DUK_USE_HOBJECT_LAYOUT_1\n#undef DUK_USE_HOBJECT_LAYOUT_2\n#undef DUK_USE_HOBJECT_LAYOUT_3\n#if (DUK_USE_ALIGN_BY == 1)\n/* On platforms without any alignment issues, layout 1 is preferable\n * because it compiles to slightly less code and provides direct access\n * to property keys.\n */\n#define DUK_USE_HOBJECT_LAYOUT_1\n#else\n/* On other platforms use layout 2, which requires some padding but\n * is a bit more natural than layout 3 in ordering the entries.  Layout\n * 3 is currently not used.\n */\n#define DUK_USE_HOBJECT_LAYOUT_2\n#endif\n\n/* GCC/clang inaccurate math would break compliance and probably duk_tval,\n * so refuse to compile.  Relax this if -ffast-math is tested to work.\n */\n#if defined(__FAST_MATH__)\n#error __FAST_MATH__ defined, refusing to compile\n#endif\n\n/*\n *  Autogenerated defaults\n */\n\n#define DUK_USE_ARRAY_BUILTIN\n#define DUK_USE_ARRAY_FASTPATH\n#define DUK_USE_ARRAY_PROP_FASTPATH\n#undef DUK_USE_ASSERTIONS\n#define DUK_USE_AUGMENT_ERROR_CREATE\n#define DUK_USE_AUGMENT_ERROR_THROW\n#define DUK_USE_AVOID_PLATFORM_FUNCPTRS\n#define DUK_USE_BASE64_FASTPATH\n#define DUK_USE_BOOLEAN_BUILTIN\n#define DUK_USE_BUFFEROBJECT_SUPPORT\n#undef DUK_USE_BUFLEN16\n#define DUK_USE_BYTECODE_DUMP_SUPPORT\n#define DUK_USE_CACHE_ACTIVATION\n#define DUK_USE_CACHE_CATCHER\n#define DUK_USE_CALLSTACK_LIMIT 10000\n#define DUK_USE_COMMONJS_MODULES\n#define DUK_USE_COMPILER_RECLIMIT 2500\n#define DUK_USE_COROUTINE_SUPPORT\n#undef DUK_USE_CPP_EXCEPTIONS\n#undef DUK_USE_DATAPTR16\n#undef DUK_USE_DATAPTR_DEC16\n#undef DUK_USE_DATAPTR_ENC16\n#define DUK_USE_DATE_BUILTIN\n#undef DUK_USE_DATE_FORMAT_STRING\n#undef DUK_USE_DATE_GET_LOCAL_TZOFFSET\n#undef DUK_USE_DATE_GET_NOW\n#undef DUK_USE_DATE_PARSE_STRING\n#undef DUK_USE_DATE_PRS_GETDATE\n#undef DUK_USE_DEBUG\n#undef DUK_USE_DEBUGGER_DUMPHEAP\n#undef DUK_USE_DEBUGGER_INSPECT\n#undef DUK_USE_DEBUGGER_PAUSE_UNCAUGHT\n#undef DUK_USE_DEBUGGER_SUPPORT\n#define DUK_USE_DEBUGGER_THROW_NOTIFY\n#undef DUK_USE_DEBUGGER_TRANSPORT_TORTURE\n#define DUK_USE_DEBUG_BUFSIZE 65536L\n#define DUK_USE_DEBUG_LEVEL 0\n#undef DUK_USE_DEBUG_WRITE\n#define DUK_USE_DOUBLE_LINKED_HEAP\n#define DUK_USE_DUKTAPE_BUILTIN\n#define DUK_USE_ENCODING_BUILTINS\n#define DUK_USE_ERRCREATE\n#define DUK_USE_ERRTHROW\n#define DUK_USE_ES6\n#define DUK_USE_ES6_OBJECT_PROTO_PROPERTY\n#define DUK_USE_ES6_OBJECT_SETPROTOTYPEOF\n#define DUK_USE_ES6_PROXY\n#define DUK_USE_ES6_REGEXP_SYNTAX\n#define DUK_USE_ES6_UNICODE_ESCAPE\n#define DUK_USE_ES7\n#define DUK_USE_ES7_EXP_OPERATOR\n#define DUK_USE_ES8\n#define DUK_USE_ES9\n#define DUK_USE_ESBC_LIMITS\n#define DUK_USE_ESBC_MAX_BYTES 2147418112L\n#define DUK_USE_ESBC_MAX_LINENUMBER 2147418112L\n#undef DUK_USE_EXEC_FUN_LOCAL\n#undef DUK_USE_EXEC_INDIRECT_BOUND_CHECK\n#undef DUK_USE_EXEC_PREFER_SIZE\n#define DUK_USE_EXEC_REGCONST_OPTIMIZE\n#undef DUK_USE_EXEC_TIMEOUT_CHECK\n#undef DUK_USE_EXPLICIT_NULL_INIT\n#undef DUK_USE_EXTSTR_FREE\n#undef DUK_USE_EXTSTR_INTERN_CHECK\n#undef DUK_USE_FASTINT\n#define DUK_USE_FAST_REFCOUNT_DEFAULT\n#undef DUK_USE_FATAL_HANDLER\n#define DUK_USE_FATAL_MAXLEN 128\n#define DUK_USE_FINALIZER_SUPPORT\n#undef DUK_USE_FINALIZER_TORTURE\n#undef DUK_USE_FUNCPTR16\n#undef DUK_USE_FUNCPTR_DEC16\n#undef DUK_USE_FUNCPTR_ENC16\n#define DUK_USE_FUNCTION_BUILTIN\n#define DUK_USE_FUNC_FILENAME_PROPERTY\n#define DUK_USE_FUNC_NAME_PROPERTY\n#undef DUK_USE_GC_TORTURE\n#undef DUK_USE_GET_MONOTONIC_TIME\n#undef DUK_USE_GET_RANDOM_DOUBLE\n#undef DUK_USE_GLOBAL_BINDING\n#define DUK_USE_GLOBAL_BUILTIN\n#undef DUK_USE_HEAPPTR16\n#undef DUK_USE_HEAPPTR_DEC16\n#undef DUK_USE_HEAPPTR_ENC16\n#define DUK_USE_HEX_FASTPATH\n#define DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT 2\n#define DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT 9\n#define DUK_USE_HOBJECT_ARRAY_MINGROW_ADD 16\n#define DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR 8\n#define DUK_USE_HOBJECT_ENTRY_MINGROW_ADD 16\n#define DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR 8\n#define DUK_USE_HOBJECT_HASH_PART\n#define DUK_USE_HOBJECT_HASH_PROP_LIMIT 8\n#define DUK_USE_HSTRING_ARRIDX\n#define DUK_USE_HSTRING_CLEN\n#undef DUK_USE_HSTRING_EXTDATA\n#define DUK_USE_HSTRING_LAZY_CLEN\n#define DUK_USE_HTML_COMMENTS\n#define DUK_USE_IDCHAR_FASTPATH\n#undef DUK_USE_INJECT_HEAP_ALLOC_ERROR\n#undef DUK_USE_INTERRUPT_COUNTER\n#undef DUK_USE_INTERRUPT_DEBUG_FIXUP\n#define DUK_USE_JC\n#define DUK_USE_JSON_BUILTIN\n#define DUK_USE_JSON_DECNUMBER_FASTPATH\n#define DUK_USE_JSON_DECSTRING_FASTPATH\n#define DUK_USE_JSON_DEC_RECLIMIT 1000\n#define DUK_USE_JSON_EATWHITE_FASTPATH\n#define DUK_USE_JSON_ENC_RECLIMIT 1000\n#define DUK_USE_JSON_QUOTESTRING_FASTPATH\n#undef DUK_USE_JSON_STRINGIFY_FASTPATH\n#define DUK_USE_JSON_SUPPORT\n#define DUK_USE_JX\n#define DUK_USE_LEXER_SLIDING_WINDOW\n#undef DUK_USE_LIGHTFUNC_BUILTINS\n#define DUK_USE_MARK_AND_SWEEP_RECLIMIT 256\n#define DUK_USE_MATH_BUILTIN\n#define DUK_USE_NATIVE_CALL_RECLIMIT 1000\n#define DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER\n#define DUK_USE_NONSTD_ARRAY_MAP_TRAILER\n#define DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT\n#undef DUK_USE_NONSTD_FUNC_CALLER_PROPERTY\n#undef DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY\n#define DUK_USE_NONSTD_FUNC_STMT\n#define DUK_USE_NONSTD_GETTER_KEY_ARGUMENT\n#define DUK_USE_NONSTD_JSON_ESC_U2028_U2029\n#define DUK_USE_NONSTD_SETTER_KEY_ARGUMENT\n#define DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT\n#define DUK_USE_NUMBER_BUILTIN\n#define DUK_USE_OBJECT_BUILTIN\n#undef DUK_USE_OBJSIZES16\n#undef DUK_USE_PARANOID_ERRORS\n#define DUK_USE_PC2LINE\n#define DUK_USE_PERFORMANCE_BUILTIN\n#undef DUK_USE_PREFER_SIZE\n#undef DUK_USE_PROMISE_BUILTIN\n#define DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS\n#undef DUK_USE_REFCOUNT16\n#define DUK_USE_REFCOUNT32\n#define DUK_USE_REFERENCE_COUNTING\n#define DUK_USE_REFLECT_BUILTIN\n#define DUK_USE_REGEXP_CANON_BITMAP\n#undef DUK_USE_REGEXP_CANON_WORKAROUND\n#define DUK_USE_REGEXP_COMPILER_RECLIMIT 10000\n#define DUK_USE_REGEXP_EXECUTOR_RECLIMIT 10000\n#define DUK_USE_REGEXP_SUPPORT\n#undef DUK_USE_ROM_GLOBAL_CLONE\n#undef DUK_USE_ROM_GLOBAL_INHERIT\n#undef DUK_USE_ROM_OBJECTS\n#define DUK_USE_ROM_PTRCOMP_FIRST 63488L\n#undef DUK_USE_ROM_STRINGS\n#define DUK_USE_SECTION_B\n#undef DUK_USE_SELF_TESTS\n#define DUK_USE_SHEBANG_COMMENTS\n#undef DUK_USE_SHUFFLE_TORTURE\n#define DUK_USE_SOURCE_NONBMP\n#undef DUK_USE_STRHASH16\n#undef DUK_USE_STRHASH_DENSE\n#define DUK_USE_STRHASH_SKIP_SHIFT 5\n#define DUK_USE_STRICT_DECL\n#undef DUK_USE_STRICT_UTF8_SOURCE\n#define DUK_USE_STRING_BUILTIN\n#undef DUK_USE_STRLEN16\n#define DUK_USE_STRTAB_GROW_LIMIT 17\n#define DUK_USE_STRTAB_MAXSIZE 268435456L\n#define DUK_USE_STRTAB_MINSIZE 1024\n#undef DUK_USE_STRTAB_PTRCOMP\n#define DUK_USE_STRTAB_RESIZE_CHECK_MASK 255\n#define DUK_USE_STRTAB_SHRINK_LIMIT 6\n#undef DUK_USE_STRTAB_TORTURE\n#undef DUK_USE_SYMBOL_BUILTIN\n#define DUK_USE_TAILCALL\n#define DUK_USE_TARGET_INFO \"unknown\"\n#define DUK_USE_TRACEBACKS\n#define DUK_USE_TRACEBACK_DEPTH 10\n#define DUK_USE_USER_DECLARE() /* no user declarations */\n#define DUK_USE_VALSTACK_GROW_SHIFT 2\n#define DUK_USE_VALSTACK_LIMIT 1000000L\n#define DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT 2\n#define DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT 4\n#undef DUK_USE_VALSTACK_UNSAFE\n#define DUK_USE_VERBOSE_ERRORS\n#define DUK_USE_VERBOSE_EXECUTOR_ERRORS\n#define DUK_USE_VOLUNTARY_GC\n#define DUK_USE_ZERO_BUFFER_DATA\n\n/*\n *  You may add overriding #define/#undef directives below for\n *  customization.  You of course cannot un-#include or un-typedef\n *  anything; these require direct changes above.\n */\n\n/* __OVERRIDE_DEFINES__ */\n\n/*\n *  Date provider selection\n *\n *  User may define DUK_USE_DATE_GET_NOW() etc directly, in which case we'll\n *  rely on an external provider.  If this is not done, revert to previous\n *  behavior and use Unix/Windows built-in provider.\n */\n\n#if defined(DUK_COMPILING_DUKTAPE)\n\n#if defined(DUK_USE_DATE_GET_NOW)\n/* External provider already defined. */\n#elif defined(DUK_USE_DATE_NOW_GETTIMEOFDAY)\n#define DUK_USE_DATE_GET_NOW(ctx)            duk_bi_date_get_now_gettimeofday()\n#elif defined(DUK_USE_DATE_NOW_TIME)\n#define DUK_USE_DATE_GET_NOW(ctx)            duk_bi_date_get_now_time()\n#elif defined(DUK_USE_DATE_NOW_WINDOWS)\n#define DUK_USE_DATE_GET_NOW(ctx)            duk_bi_date_get_now_windows()\n#elif defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS)\n#define DUK_USE_DATE_GET_NOW(ctx)            duk_bi_date_get_now_windows_subms()\n#else\n#error no provider for DUK_USE_DATE_GET_NOW()\n#endif\n\n#if defined(DUK_USE_DATE_GET_LOCAL_TZOFFSET)\n/* External provider already defined. */\n#elif defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME)\n#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d)   duk_bi_date_get_local_tzoffset_gmtime((d))\n#elif defined(DUK_USE_DATE_TZO_WINDOWS)\n#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d)   duk_bi_date_get_local_tzoffset_windows((d))\n#elif defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST)\n#define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d)   duk_bi_date_get_local_tzoffset_windows_no_dst((d))\n#else\n#error no provider for DUK_USE_DATE_GET_LOCAL_TZOFFSET()\n#endif\n\n#if defined(DUK_USE_DATE_PARSE_STRING)\n/* External provider already defined. */\n#elif defined(DUK_USE_DATE_PRS_STRPTIME)\n#define DUK_USE_DATE_PARSE_STRING(ctx,str)   duk_bi_date_parse_string_strptime((ctx), (str))\n#elif defined(DUK_USE_DATE_PRS_GETDATE)\n#define DUK_USE_DATE_PARSE_STRING(ctx,str)   duk_bi_date_parse_string_getdate((ctx), (str))\n#else\n/* No provider for DUK_USE_DATE_PARSE_STRING(), fall back to ISO 8601 only. */\n#endif\n\n#if defined(DUK_USE_DATE_FORMAT_STRING)\n/* External provider already defined. */\n#elif defined(DUK_USE_DATE_FMT_STRFTIME)\n#define DUK_USE_DATE_FORMAT_STRING(ctx,parts,tzoffset,flags) \\\n\tduk_bi_date_format_parts_strftime((ctx), (parts), (tzoffset), (flags))\n#else\n/* No provider for DUK_USE_DATE_FORMAT_STRING(), fall back to ISO 8601 only. */\n#endif\n\n#if defined(DUK_USE_GET_MONOTONIC_TIME)\n/* External provider already defined. */\n#elif defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME)\n#define DUK_USE_GET_MONOTONIC_TIME(ctx)  duk_bi_date_get_monotonic_time_clock_gettime()\n#elif defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC)\n#define DUK_USE_GET_MONOTONIC_TIME(ctx)  duk_bi_date_get_monotonic_time_windows_qpc()\n#else\n/* No provider for DUK_USE_GET_MONOTONIC_TIME(), fall back to DUK_USE_DATE_GET_NOW(). */\n#endif\n\n#endif  /* DUK_COMPILING_DUKTAPE */\n\n/*\n *  Checks for legacy feature options (DUK_OPT_xxx)\n */\n\n#if defined(DUK_OPT_ASSERTIONS)\n#error unsupported legacy feature option DUK_OPT_ASSERTIONS used\n#endif\n#if defined(DUK_OPT_BUFFEROBJECT_SUPPORT)\n#error unsupported legacy feature option DUK_OPT_BUFFEROBJECT_SUPPORT used\n#endif\n#if defined(DUK_OPT_BUFLEN16)\n#error unsupported legacy feature option DUK_OPT_BUFLEN16 used\n#endif\n#if defined(DUK_OPT_DATAPTR16)\n#error unsupported legacy feature option DUK_OPT_DATAPTR16 used\n#endif\n#if defined(DUK_OPT_DATAPTR_DEC16)\n#error unsupported legacy feature option DUK_OPT_DATAPTR_DEC16 used\n#endif\n#if defined(DUK_OPT_DATAPTR_ENC16)\n#error unsupported legacy feature option DUK_OPT_DATAPTR_ENC16 used\n#endif\n#if defined(DUK_OPT_DDDPRINT)\n#error unsupported legacy feature option DUK_OPT_DDDPRINT used\n#endif\n#if defined(DUK_OPT_DDPRINT)\n#error unsupported legacy feature option DUK_OPT_DDPRINT used\n#endif\n#if defined(DUK_OPT_DEBUG)\n#error unsupported legacy feature option DUK_OPT_DEBUG used\n#endif\n#if defined(DUK_OPT_DEBUGGER_DUMPHEAP)\n#error unsupported legacy feature option DUK_OPT_DEBUGGER_DUMPHEAP used\n#endif\n#if defined(DUK_OPT_DEBUGGER_FWD_LOGGING)\n#error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_LOGGING used\n#endif\n#if defined(DUK_OPT_DEBUGGER_FWD_PRINTALERT)\n#error unsupported legacy feature option DUK_OPT_DEBUGGER_FWD_PRINTALERT used\n#endif\n#if defined(DUK_OPT_DEBUGGER_SUPPORT)\n#error unsupported legacy feature option DUK_OPT_DEBUGGER_SUPPORT used\n#endif\n#if defined(DUK_OPT_DEBUGGER_TRANSPORT_TORTURE)\n#error unsupported legacy feature option DUK_OPT_DEBUGGER_TRANSPORT_TORTURE used\n#endif\n#if defined(DUK_OPT_DEBUG_BUFSIZE)\n#error unsupported legacy feature option DUK_OPT_DEBUG_BUFSIZE used\n#endif\n#if defined(DUK_OPT_DECLARE)\n#error unsupported legacy feature option DUK_OPT_DECLARE used\n#endif\n#if defined(DUK_OPT_DEEP_C_STACK)\n#error unsupported legacy feature option DUK_OPT_DEEP_C_STACK used\n#endif\n#if defined(DUK_OPT_DLL_BUILD)\n#error unsupported legacy feature option DUK_OPT_DLL_BUILD used\n#endif\n#if defined(DUK_OPT_DPRINT)\n#error unsupported legacy feature option DUK_OPT_DPRINT used\n#endif\n#if defined(DUK_OPT_DPRINT_COLORS)\n#error unsupported legacy feature option DUK_OPT_DPRINT_COLORS used\n#endif\n#if defined(DUK_OPT_DPRINT_RDTSC)\n#error unsupported legacy feature option DUK_OPT_DPRINT_RDTSC used\n#endif\n#if defined(DUK_OPT_EXEC_TIMEOUT_CHECK)\n#error unsupported legacy feature option DUK_OPT_EXEC_TIMEOUT_CHECK used\n#endif\n#if defined(DUK_OPT_EXTERNAL_STRINGS)\n#error unsupported legacy feature option DUK_OPT_EXTERNAL_STRINGS used\n#endif\n#if defined(DUK_OPT_EXTSTR_FREE)\n#error unsupported legacy feature option DUK_OPT_EXTSTR_FREE used\n#endif\n#if defined(DUK_OPT_EXTSTR_INTERN_CHECK)\n#error unsupported legacy feature option DUK_OPT_EXTSTR_INTERN_CHECK used\n#endif\n#if defined(DUK_OPT_FASTINT)\n#error unsupported legacy feature option DUK_OPT_FASTINT used\n#endif\n#if defined(DUK_OPT_FORCE_ALIGN)\n#error unsupported legacy feature option DUK_OPT_FORCE_ALIGN used\n#endif\n#if defined(DUK_OPT_FORCE_BYTEORDER)\n#error unsupported legacy feature option DUK_OPT_FORCE_BYTEORDER used\n#endif\n#if defined(DUK_OPT_FUNCPTR16)\n#error unsupported legacy feature option DUK_OPT_FUNCPTR16 used\n#endif\n#if defined(DUK_OPT_FUNCPTR_DEC16)\n#error unsupported legacy feature option DUK_OPT_FUNCPTR_DEC16 used\n#endif\n#if defined(DUK_OPT_FUNCPTR_ENC16)\n#error unsupported legacy feature option DUK_OPT_FUNCPTR_ENC16 used\n#endif\n#if defined(DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY)\n#error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_CALLER_PROPERTY used\n#endif\n#if defined(DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY)\n#error unsupported legacy feature option DUK_OPT_FUNC_NONSTD_SOURCE_PROPERTY used\n#endif\n#if defined(DUK_OPT_GC_TORTURE)\n#error unsupported legacy feature option DUK_OPT_GC_TORTURE used\n#endif\n#if defined(DUK_OPT_HAVE_CUSTOM_H)\n#error unsupported legacy feature option DUK_OPT_HAVE_CUSTOM_H used\n#endif\n#if defined(DUK_OPT_HEAPPTR16)\n#error unsupported legacy feature option DUK_OPT_HEAPPTR16 used\n#endif\n#if defined(DUK_OPT_HEAPPTR_DEC16)\n#error unsupported legacy feature option DUK_OPT_HEAPPTR_DEC16 used\n#endif\n#if defined(DUK_OPT_HEAPPTR_ENC16)\n#error unsupported legacy feature option DUK_OPT_HEAPPTR_ENC16 used\n#endif\n#if defined(DUK_OPT_INTERRUPT_COUNTER)\n#error unsupported legacy feature option DUK_OPT_INTERRUPT_COUNTER used\n#endif\n#if defined(DUK_OPT_JSON_STRINGIFY_FASTPATH)\n#error unsupported legacy feature option DUK_OPT_JSON_STRINGIFY_FASTPATH used\n#endif\n#if defined(DUK_OPT_LIGHTFUNC_BUILTINS)\n#error unsupported legacy feature option DUK_OPT_LIGHTFUNC_BUILTINS used\n#endif\n#if defined(DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY)\n#error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_CALLER_PROPERTY used\n#endif\n#if defined(DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY)\n#error unsupported legacy feature option DUK_OPT_NONSTD_FUNC_SOURCE_PROPERTY used\n#endif\n#if defined(DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT)\n#error unsupported legacy feature option DUK_OPT_NO_ARRAY_SPLICE_NONSTD_DELCOUNT used\n#endif\n#if defined(DUK_OPT_NO_AUGMENT_ERRORS)\n#error unsupported legacy feature option DUK_OPT_NO_AUGMENT_ERRORS used\n#endif\n#if defined(DUK_OPT_NO_BROWSER_LIKE)\n#error unsupported legacy feature option DUK_OPT_NO_BROWSER_LIKE used\n#endif\n#if defined(DUK_OPT_NO_BUFFEROBJECT_SUPPORT)\n#error unsupported legacy feature option DUK_OPT_NO_BUFFEROBJECT_SUPPORT used\n#endif\n#if defined(DUK_OPT_NO_BYTECODE_DUMP_SUPPORT)\n#error unsupported legacy feature option DUK_OPT_NO_BYTECODE_DUMP_SUPPORT used\n#endif\n#if defined(DUK_OPT_NO_COMMONJS_MODULES)\n#error unsupported legacy feature option DUK_OPT_NO_COMMONJS_MODULES used\n#endif\n#if defined(DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY)\n#error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_PROTO_PROPERTY used\n#endif\n#if defined(DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF)\n#error unsupported legacy feature option DUK_OPT_NO_ES6_OBJECT_SETPROTOTYPEOF used\n#endif\n#if defined(DUK_OPT_NO_ES6_PROXY)\n#error unsupported legacy feature option DUK_OPT_NO_ES6_PROXY used\n#endif\n#if defined(DUK_OPT_NO_FILE_IO)\n#error unsupported legacy feature option DUK_OPT_NO_FILE_IO used\n#endif\n#if defined(DUK_OPT_NO_FUNC_STMT)\n#error unsupported legacy feature option DUK_OPT_NO_FUNC_STMT used\n#endif\n#if defined(DUK_OPT_NO_JC)\n#error unsupported legacy feature option DUK_OPT_NO_JC used\n#endif\n#if defined(DUK_OPT_NO_JSONC)\n#error unsupported legacy feature option DUK_OPT_NO_JSONC used\n#endif\n#if defined(DUK_OPT_NO_JSONX)\n#error unsupported legacy feature option DUK_OPT_NO_JSONX used\n#endif\n#if defined(DUK_OPT_NO_JX)\n#error unsupported legacy feature option DUK_OPT_NO_JX used\n#endif\n#if defined(DUK_OPT_NO_MARK_AND_SWEEP)\n#error unsupported legacy feature option DUK_OPT_NO_MARK_AND_SWEEP used\n#endif\n#if defined(DUK_OPT_NO_MS_STRINGTABLE_RESIZE)\n#error unsupported legacy feature option DUK_OPT_NO_MS_STRINGTABLE_RESIZE used\n#endif\n#if defined(DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT)\n#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ACCESSOR_KEY_ARGUMENT used\n#endif\n#if defined(DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER)\n#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_CONCAT_TRAILER used\n#endif\n#if defined(DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER)\n#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_MAP_TRAILER used\n#endif\n#if defined(DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT)\n#error unsupported legacy feature option DUK_OPT_NO_NONSTD_ARRAY_SPLICE_DELCOUNT used\n#endif\n#if defined(DUK_OPT_NO_NONSTD_FUNC_STMT)\n#error unsupported legacy feature option DUK_OPT_NO_NONSTD_FUNC_STMT used\n#endif\n#if defined(DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029)\n#error unsupported legacy feature option DUK_OPT_NO_NONSTD_JSON_ESC_U2028_U2029 used\n#endif\n#if defined(DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT)\n#error unsupported legacy feature option DUK_OPT_NO_NONSTD_STRING_FROMCHARCODE_32BIT used\n#endif\n#if defined(DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY)\n#error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_PROTO_PROPERTY used\n#endif\n#if defined(DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF)\n#error unsupported legacy feature option DUK_OPT_NO_OBJECT_ES6_SETPROTOTYPEOF used\n#endif\n#if defined(DUK_OPT_NO_OCTAL_SUPPORT)\n#error unsupported legacy feature option DUK_OPT_NO_OCTAL_SUPPORT used\n#endif\n#if defined(DUK_OPT_NO_PACKED_TVAL)\n#error unsupported legacy feature option DUK_OPT_NO_PACKED_TVAL used\n#endif\n#if defined(DUK_OPT_NO_PC2LINE)\n#error unsupported legacy feature option DUK_OPT_NO_PC2LINE used\n#endif\n#if defined(DUK_OPT_NO_REFERENCE_COUNTING)\n#error unsupported legacy feature option DUK_OPT_NO_REFERENCE_COUNTING used\n#endif\n#if defined(DUK_OPT_NO_REGEXP_SUPPORT)\n#error unsupported legacy feature option DUK_OPT_NO_REGEXP_SUPPORT used\n#endif\n#if defined(DUK_OPT_NO_SECTION_B)\n#error unsupported legacy feature option DUK_OPT_NO_SECTION_B used\n#endif\n#if defined(DUK_OPT_NO_SOURCE_NONBMP)\n#error unsupported legacy feature option DUK_OPT_NO_SOURCE_NONBMP used\n#endif\n#if defined(DUK_OPT_NO_STRICT_DECL)\n#error unsupported legacy feature option DUK_OPT_NO_STRICT_DECL used\n#endif\n#if defined(DUK_OPT_NO_TRACEBACKS)\n#error unsupported legacy feature option DUK_OPT_NO_TRACEBACKS used\n#endif\n#if defined(DUK_OPT_NO_VERBOSE_ERRORS)\n#error unsupported legacy feature option DUK_OPT_NO_VERBOSE_ERRORS used\n#endif\n#if defined(DUK_OPT_NO_VOLUNTARY_GC)\n#error unsupported legacy feature option DUK_OPT_NO_VOLUNTARY_GC used\n#endif\n#if defined(DUK_OPT_NO_ZERO_BUFFER_DATA)\n#error unsupported legacy feature option DUK_OPT_NO_ZERO_BUFFER_DATA used\n#endif\n#if defined(DUK_OPT_OBJSIZES16)\n#error unsupported legacy feature option DUK_OPT_OBJSIZES16 used\n#endif\n#if defined(DUK_OPT_PANIC_HANDLER)\n#error unsupported legacy feature option DUK_OPT_PANIC_HANDLER used\n#endif\n#if defined(DUK_OPT_REFCOUNT16)\n#error unsupported legacy feature option DUK_OPT_REFCOUNT16 used\n#endif\n#if defined(DUK_OPT_SEGFAULT_ON_PANIC)\n#error unsupported legacy feature option DUK_OPT_SEGFAULT_ON_PANIC used\n#endif\n#if defined(DUK_OPT_SELF_TESTS)\n#error unsupported legacy feature option DUK_OPT_SELF_TESTS used\n#endif\n#if defined(DUK_OPT_SETJMP)\n#error unsupported legacy feature option DUK_OPT_SETJMP used\n#endif\n#if defined(DUK_OPT_SHUFFLE_TORTURE)\n#error unsupported legacy feature option DUK_OPT_SHUFFLE_TORTURE used\n#endif\n#if defined(DUK_OPT_SIGSETJMP)\n#error unsupported legacy feature option DUK_OPT_SIGSETJMP used\n#endif\n#if defined(DUK_OPT_STRHASH16)\n#error unsupported legacy feature option DUK_OPT_STRHASH16 used\n#endif\n#if defined(DUK_OPT_STRICT_UTF8_SOURCE)\n#error unsupported legacy feature option DUK_OPT_STRICT_UTF8_SOURCE used\n#endif\n#if defined(DUK_OPT_STRLEN16)\n#error unsupported legacy feature option DUK_OPT_STRLEN16 used\n#endif\n#if defined(DUK_OPT_STRTAB_CHAIN)\n#error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN used\n#endif\n#if defined(DUK_OPT_STRTAB_CHAIN_SIZE)\n#error unsupported legacy feature option DUK_OPT_STRTAB_CHAIN_SIZE used\n#endif\n#if defined(DUK_OPT_TARGET_INFO)\n#error unsupported legacy feature option DUK_OPT_TARGET_INFO used\n#endif\n#if defined(DUK_OPT_TRACEBACK_DEPTH)\n#error unsupported legacy feature option DUK_OPT_TRACEBACK_DEPTH used\n#endif\n#if defined(DUK_OPT_UNDERSCORE_SETJMP)\n#error unsupported legacy feature option DUK_OPT_UNDERSCORE_SETJMP used\n#endif\n#if defined(DUK_OPT_USER_INITJS)\n#error unsupported legacy feature option DUK_OPT_USER_INITJS used\n#endif\n\n/*\n *  Checks for config option consistency (DUK_USE_xxx)\n */\n\n#if defined(DUK_USE_32BIT_PTRS)\n#error unsupported config option used (option has been removed): DUK_USE_32BIT_PTRS\n#endif\n#if defined(DUK_USE_ALIGN_4)\n#error unsupported config option used (option has been removed): DUK_USE_ALIGN_4\n#endif\n#if defined(DUK_USE_ALIGN_8)\n#error unsupported config option used (option has been removed): DUK_USE_ALIGN_8\n#endif\n#if defined(DUK_USE_BROWSER_LIKE)\n#error unsupported config option used (option has been removed): DUK_USE_BROWSER_LIKE\n#endif\n#if defined(DUK_USE_BUILTIN_INITJS)\n#error unsupported config option used (option has been removed): DUK_USE_BUILTIN_INITJS\n#endif\n#if defined(DUK_USE_BYTEORDER_FORCED)\n#error unsupported config option used (option has been removed): DUK_USE_BYTEORDER_FORCED\n#endif\n#if defined(DUK_USE_DATAPTR_DEC16) && !defined(DUK_USE_DATAPTR16)\n#error config option DUK_USE_DATAPTR_DEC16 requires option DUK_USE_DATAPTR16 (which is missing)\n#endif\n#if defined(DUK_USE_DATAPTR_ENC16) && !defined(DUK_USE_DATAPTR16)\n#error config option DUK_USE_DATAPTR_ENC16 requires option DUK_USE_DATAPTR16 (which is missing)\n#endif\n#if defined(DUK_USE_DDDPRINT)\n#error unsupported config option used (option has been removed): DUK_USE_DDDPRINT\n#endif\n#if defined(DUK_USE_DDPRINT)\n#error unsupported config option used (option has been removed): DUK_USE_DDPRINT\n#endif\n#if defined(DUK_USE_DEBUGGER_FWD_LOGGING)\n#error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_LOGGING\n#endif\n#if defined(DUK_USE_DEBUGGER_FWD_PRINTALERT)\n#error unsupported config option used (option has been removed): DUK_USE_DEBUGGER_FWD_PRINTALERT\n#endif\n#if defined(DUK_USE_DEBUGGER_SUPPORT) && !defined(DUK_USE_INTERRUPT_COUNTER)\n#error config option DUK_USE_DEBUGGER_SUPPORT requires option DUK_USE_INTERRUPT_COUNTER (which is missing)\n#endif\n#if defined(DUK_USE_DEEP_C_STACK)\n#error unsupported config option used (option has been removed): DUK_USE_DEEP_C_STACK\n#endif\n#if defined(DUK_USE_DOUBLE_BE)\n#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_BE\n#endif\n#if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_LE)\n#error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_LE (which is also defined)\n#endif\n#if defined(DUK_USE_DOUBLE_BE) && defined(DUK_USE_DOUBLE_ME)\n#error config option DUK_USE_DOUBLE_BE conflicts with option DUK_USE_DOUBLE_ME (which is also defined)\n#endif\n#if defined(DUK_USE_DOUBLE_LE)\n#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_LE\n#endif\n#if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_BE)\n#error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_BE (which is also defined)\n#endif\n#if defined(DUK_USE_DOUBLE_LE) && defined(DUK_USE_DOUBLE_ME)\n#error config option DUK_USE_DOUBLE_LE conflicts with option DUK_USE_DOUBLE_ME (which is also defined)\n#endif\n#if defined(DUK_USE_DOUBLE_ME)\n#error unsupported config option used (option has been removed): DUK_USE_DOUBLE_ME\n#endif\n#if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_LE)\n#error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_LE (which is also defined)\n#endif\n#if defined(DUK_USE_DOUBLE_ME) && defined(DUK_USE_DOUBLE_BE)\n#error config option DUK_USE_DOUBLE_ME conflicts with option DUK_USE_DOUBLE_BE (which is also defined)\n#endif\n#if defined(DUK_USE_DPRINT)\n#error unsupported config option used (option has been removed): DUK_USE_DPRINT\n#endif\n#if defined(DUK_USE_DPRINT) && !defined(DUK_USE_DEBUG)\n#error config option DUK_USE_DPRINT requires option DUK_USE_DEBUG (which is missing)\n#endif\n#if defined(DUK_USE_DPRINT_COLORS)\n#error unsupported config option used (option has been removed): DUK_USE_DPRINT_COLORS\n#endif\n#if defined(DUK_USE_DPRINT_RDTSC)\n#error unsupported config option used (option has been removed): DUK_USE_DPRINT_RDTSC\n#endif\n#if defined(DUK_USE_ES6_REGEXP_BRACES)\n#error unsupported config option used (option has been removed): DUK_USE_ES6_REGEXP_BRACES\n#endif\n#if defined(DUK_USE_ESBC_MAX_BYTES) && !defined(DUK_USE_ESBC_LIMITS)\n#error config option DUK_USE_ESBC_MAX_BYTES requires option DUK_USE_ESBC_LIMITS (which is missing)\n#endif\n#if defined(DUK_USE_ESBC_MAX_LINENUMBER) && !defined(DUK_USE_ESBC_LIMITS)\n#error config option DUK_USE_ESBC_MAX_LINENUMBER requires option DUK_USE_ESBC_LIMITS (which is missing)\n#endif\n#if defined(DUK_USE_EXEC_TIMEOUT_CHECK) && !defined(DUK_USE_INTERRUPT_COUNTER)\n#error config option DUK_USE_EXEC_TIMEOUT_CHECK requires option DUK_USE_INTERRUPT_COUNTER (which is missing)\n#endif\n#if defined(DUK_USE_EXTSTR_FREE) && !defined(DUK_USE_HSTRING_EXTDATA)\n#error config option DUK_USE_EXTSTR_FREE requires option DUK_USE_HSTRING_EXTDATA (which is missing)\n#endif\n#if defined(DUK_USE_EXTSTR_INTERN_CHECK) && !defined(DUK_USE_HSTRING_EXTDATA)\n#error config option DUK_USE_EXTSTR_INTERN_CHECK requires option DUK_USE_HSTRING_EXTDATA (which is missing)\n#endif\n#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_64BIT_OPS)\n#error config option DUK_USE_FASTINT requires option DUK_USE_64BIT_OPS (which is missing)\n#endif\n#if defined(DUK_USE_FILE_IO)\n#error unsupported config option used (option has been removed): DUK_USE_FILE_IO\n#endif\n#if defined(DUK_USE_FULL_TVAL)\n#error unsupported config option used (option has been removed): DUK_USE_FULL_TVAL\n#endif\n#if defined(DUK_USE_FUNCPTR_DEC16) && !defined(DUK_USE_FUNCPTR16)\n#error config option DUK_USE_FUNCPTR_DEC16 requires option DUK_USE_FUNCPTR16 (which is missing)\n#endif\n#if defined(DUK_USE_FUNCPTR_ENC16) && !defined(DUK_USE_FUNCPTR16)\n#error config option DUK_USE_FUNCPTR_ENC16 requires option DUK_USE_FUNCPTR16 (which is missing)\n#endif\n#if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS)\n#error unsupported config option used (option has been removed): DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS\n#endif\n#if defined(DUK_USE_HEAPPTR16) && defined(DUK_USE_DEBUG)\n#error config option DUK_USE_HEAPPTR16 conflicts with option DUK_USE_DEBUG (which is also defined)\n#endif\n#if defined(DUK_USE_HEAPPTR_DEC16) && !defined(DUK_USE_HEAPPTR16)\n#error config option DUK_USE_HEAPPTR_DEC16 requires option DUK_USE_HEAPPTR16 (which is missing)\n#endif\n#if defined(DUK_USE_HEAPPTR_ENC16) && !defined(DUK_USE_HEAPPTR16)\n#error config option DUK_USE_HEAPPTR_ENC16 requires option DUK_USE_HEAPPTR16 (which is missing)\n#endif\n#if defined(DUK_USE_INTEGER_BE)\n#error unsupported config option used (option has been removed): DUK_USE_INTEGER_BE\n#endif\n#if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_LE)\n#error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_LE (which is also defined)\n#endif\n#if defined(DUK_USE_INTEGER_BE) && defined(DUK_USE_INTEGER_ME)\n#error config option DUK_USE_INTEGER_BE conflicts with option DUK_USE_INTEGER_ME (which is also defined)\n#endif\n#if defined(DUK_USE_INTEGER_LE)\n#error unsupported config option used (option has been removed): DUK_USE_INTEGER_LE\n#endif\n#if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_BE)\n#error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_BE (which is also defined)\n#endif\n#if defined(DUK_USE_INTEGER_LE) && defined(DUK_USE_INTEGER_ME)\n#error config option DUK_USE_INTEGER_LE conflicts with option DUK_USE_INTEGER_ME (which is also defined)\n#endif\n#if defined(DUK_USE_INTEGER_ME)\n#error unsupported config option used (option has been removed): DUK_USE_INTEGER_ME\n#endif\n#if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_LE)\n#error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_LE (which is also defined)\n#endif\n#if defined(DUK_USE_INTEGER_ME) && defined(DUK_USE_INTEGER_BE)\n#error config option DUK_USE_INTEGER_ME conflicts with option DUK_USE_INTEGER_BE (which is also defined)\n#endif\n#if defined(DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE)\n#error unsupported config option used (option has been removed): DUK_USE_MARKANDSWEEP_FINALIZER_TORTURE\n#endif\n#if defined(DUK_USE_MARK_AND_SWEEP)\n#error unsupported config option used (option has been removed): DUK_USE_MARK_AND_SWEEP\n#endif\n#if defined(DUK_USE_MATH_FMAX)\n#error unsupported config option used (option has been removed): DUK_USE_MATH_FMAX\n#endif\n#if defined(DUK_USE_MATH_FMIN)\n#error unsupported config option used (option has been removed): DUK_USE_MATH_FMIN\n#endif\n#if defined(DUK_USE_MATH_ROUND)\n#error unsupported config option used (option has been removed): DUK_USE_MATH_ROUND\n#endif\n#if defined(DUK_USE_MS_STRINGTABLE_RESIZE)\n#error unsupported config option used (option has been removed): DUK_USE_MS_STRINGTABLE_RESIZE\n#endif\n#if defined(DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE)\n#error unsupported config option used (option has been removed): DUK_USE_NONSTD_REGEXP_DOLLAR_ESCAPE\n#endif\n#if defined(DUK_USE_NO_DOUBLE_ALIASING_SELFTEST)\n#error unsupported config option used (option has been removed): DUK_USE_NO_DOUBLE_ALIASING_SELFTEST\n#endif\n#if defined(DUK_USE_OCTAL_SUPPORT)\n#error unsupported config option used (option has been removed): DUK_USE_OCTAL_SUPPORT\n#endif\n#if defined(DUK_USE_PACKED_TVAL_POSSIBLE)\n#error unsupported config option used (option has been removed): DUK_USE_PACKED_TVAL_POSSIBLE\n#endif\n#if defined(DUK_USE_PANIC_ABORT)\n#error unsupported config option used (option has been removed): DUK_USE_PANIC_ABORT\n#endif\n#if defined(DUK_USE_PANIC_EXIT)\n#error unsupported config option used (option has been removed): DUK_USE_PANIC_EXIT\n#endif\n#if defined(DUK_USE_PANIC_HANDLER)\n#error unsupported config option used (option has been removed): DUK_USE_PANIC_HANDLER\n#endif\n#if defined(DUK_USE_PANIC_SEGFAULT)\n#error unsupported config option used (option has been removed): DUK_USE_PANIC_SEGFAULT\n#endif\n#if defined(DUK_USE_POW_NETBSD_WORKAROUND)\n#error unsupported config option used (option has been removed): DUK_USE_POW_NETBSD_WORKAROUND\n#endif\n#if defined(DUK_USE_RDTSC)\n#error unsupported config option used (option has been removed): DUK_USE_RDTSC\n#endif\n#if defined(DUK_USE_REFZERO_FINALIZER_TORTURE)\n#error unsupported config option used (option has been removed): DUK_USE_REFZERO_FINALIZER_TORTURE\n#endif\n#if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_STRINGS)\n#error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_STRINGS (which is missing)\n#endif\n#if defined(DUK_USE_ROM_GLOBAL_CLONE) && !defined(DUK_USE_ROM_OBJECTS)\n#error config option DUK_USE_ROM_GLOBAL_CLONE requires option DUK_USE_ROM_OBJECTS (which is missing)\n#endif\n#if defined(DUK_USE_ROM_GLOBAL_CLONE) && defined(DUK_USE_ROM_GLOBAL_INHERIT)\n#error config option DUK_USE_ROM_GLOBAL_CLONE conflicts with option DUK_USE_ROM_GLOBAL_INHERIT (which is also defined)\n#endif\n#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_STRINGS)\n#error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_STRINGS (which is missing)\n#endif\n#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && !defined(DUK_USE_ROM_OBJECTS)\n#error config option DUK_USE_ROM_GLOBAL_INHERIT requires option DUK_USE_ROM_OBJECTS (which is missing)\n#endif\n#if defined(DUK_USE_ROM_GLOBAL_INHERIT) && defined(DUK_USE_ROM_GLOBAL_CLONE)\n#error config option DUK_USE_ROM_GLOBAL_INHERIT conflicts with option DUK_USE_ROM_GLOBAL_CLONE (which is also defined)\n#endif\n#if defined(DUK_USE_ROM_OBJECTS) && !defined(DUK_USE_ROM_STRINGS)\n#error config option DUK_USE_ROM_OBJECTS requires option DUK_USE_ROM_STRINGS (which is missing)\n#endif\n#if defined(DUK_USE_ROM_STRINGS) && !defined(DUK_USE_ROM_OBJECTS)\n#error config option DUK_USE_ROM_STRINGS requires option DUK_USE_ROM_OBJECTS (which is missing)\n#endif\n#if defined(DUK_USE_SETJMP)\n#error unsupported config option used (option has been removed): DUK_USE_SETJMP\n#endif\n#if defined(DUK_USE_SIGSETJMP)\n#error unsupported config option used (option has been removed): DUK_USE_SIGSETJMP\n#endif\n#if defined(DUK_USE_STRTAB_CHAIN)\n#error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN\n#endif\n#if defined(DUK_USE_STRTAB_CHAIN_SIZE)\n#error unsupported config option used (option has been removed): DUK_USE_STRTAB_CHAIN_SIZE\n#endif\n#if defined(DUK_USE_STRTAB_CHAIN_SIZE) && !defined(DUK_USE_STRTAB_CHAIN)\n#error config option DUK_USE_STRTAB_CHAIN_SIZE requires option DUK_USE_STRTAB_CHAIN (which is missing)\n#endif\n#if defined(DUK_USE_STRTAB_PROBE)\n#error unsupported config option used (option has been removed): DUK_USE_STRTAB_PROBE\n#endif\n#if defined(DUK_USE_STRTAB_PTRCOMP) && !defined(DUK_USE_HEAPPTR16)\n#error config option DUK_USE_STRTAB_PTRCOMP requires option DUK_USE_HEAPPTR16 (which is missing)\n#endif\n#if defined(DUK_USE_TAILCALL) && defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n#error config option DUK_USE_TAILCALL conflicts with option DUK_USE_NONSTD_FUNC_CALLER_PROPERTY (which is also defined)\n#endif\n#if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)\n#error unsupported config option used (option has been removed): DUK_USE_UNALIGNED_ACCESSES_POSSIBLE\n#endif\n#if defined(DUK_USE_UNDERSCORE_SETJMP)\n#error unsupported config option used (option has been removed): DUK_USE_UNDERSCORE_SETJMP\n#endif\n#if defined(DUK_USE_USER_INITJS)\n#error unsupported config option used (option has been removed): DUK_USE_USER_INITJS\n#endif\n\n#if defined(DUK_USE_CPP_EXCEPTIONS) && !defined(__cplusplus)\n#error DUK_USE_CPP_EXCEPTIONS enabled but not compiling with a C++ compiler\n#endif\n\n/*\n *  Convert DUK_USE_BYTEORDER, from whatever source, into currently used\n *  internal defines.  If detection failed, #error out.\n */\n\n#if defined(DUK_USE_BYTEORDER)\n#if (DUK_USE_BYTEORDER == 1)\n#define DUK_USE_INTEGER_LE\n#define DUK_USE_DOUBLE_LE\n#elif (DUK_USE_BYTEORDER == 2)\n#define DUK_USE_INTEGER_LE  /* integer endianness is little on purpose */\n#define DUK_USE_DOUBLE_ME\n#elif (DUK_USE_BYTEORDER == 3)\n#define DUK_USE_INTEGER_BE\n#define DUK_USE_DOUBLE_BE\n#else\n#error unsupported: byte order invalid\n#endif  /* byte order */\n#else\n#error unsupported: byte order detection failed\n#endif  /* defined(DUK_USE_BYTEORDER) */\n\n#endif  /* DUK_CONFIG_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.c",
    "content": "/*\n *  Minimal 'console' binding.\n *\n *  https://github.com/DeveloperToolsWG/console-object/blob/master/api.md\n *  https://developers.google.com/web/tools/chrome-devtools/debug/console/console-reference\n *  https://developer.mozilla.org/en/docs/Web/API/console\n */\n\n#include <stdio.h>\n#include <stdarg.h>\n#include \"duktape.h\"\n#include \"duk_console.h\"\n\n/* XXX: Add some form of log level filtering. */\n\n/* XXX: For now logs everything to stdout, V8/Node.js logs debug/info level\n * to stdout, warn and above to stderr.  Should this extra do the same?\n */\n\n/* XXX: Should all output be written via e.g. console.write(formattedMsg)?\n * This would make it easier for user code to redirect all console output\n * to a custom backend.\n */\n\n/* XXX: Init console object using duk_def_prop() when that call is available. */\n\nstatic duk_ret_t duk__console_log_helper(duk_context *ctx, const char *error_name) {\n\tduk_idx_t i, n;\n\tduk_uint_t flags;\n\n\tflags = (duk_uint_t) duk_get_current_magic(ctx);\n\n\tn = duk_get_top(ctx);\n\n\tduk_get_global_string(ctx, \"console\");\n\tduk_get_prop_string(ctx, -1, \"format\");\n\n\tfor (i = 0; i < n; i++) {\n\t\tif (duk_check_type_mask(ctx, i, DUK_TYPE_MASK_OBJECT)) {\n\t\t\t/* Slow path formatting. */\n\t\t\tduk_dup(ctx, -1);  /* console.format */\n\t\t\tduk_dup(ctx, i);\n\t\t\tduk_call(ctx, 1);\n\t\t\tduk_replace(ctx, i);  /* arg[i] = console.format(arg[i]); */\n\t\t}\n\t}\n\n\tduk_pop_2(ctx);\n\n\tduk_push_string(ctx, \" \");\n\tduk_insert(ctx, 0);\n\tduk_join(ctx, n);\n\n\tif (error_name) {\n\t\tduk_push_error_object(ctx, DUK_ERR_ERROR, \"%s\", duk_require_string(ctx, -1));\n\t\tduk_push_string(ctx, \"name\");\n\t\tduk_push_string(ctx, error_name);\n\t\tduk_def_prop(ctx, -3, DUK_DEFPROP_FORCE | DUK_DEFPROP_HAVE_VALUE);  /* to get e.g. 'Trace: 1 2 3' */\n\t\tduk_get_prop_string(ctx, -1, \"stack\");\n\t}\n\n\tfprintf(stdout, \"%s\\n\", duk_to_string(ctx, -1));\n\tif (flags & DUK_CONSOLE_FLUSH) {\n\t\tfflush(stdout);\n\t}\n\treturn 0;\n}\n\nstatic duk_ret_t duk__console_assert(duk_context *ctx) {\n\tif (duk_to_boolean(ctx, 0)) {\n\t\treturn 0;\n\t}\n\tduk_remove(ctx, 0);\n\n\treturn duk__console_log_helper(ctx, \"AssertionError\");\n}\n\nstatic duk_ret_t duk__console_log(duk_context *ctx) {\n\treturn duk__console_log_helper(ctx, NULL);\n}\n\nstatic duk_ret_t duk__console_trace(duk_context *ctx) {\n\treturn duk__console_log_helper(ctx, \"Trace\");\n}\n\nstatic duk_ret_t duk__console_info(duk_context *ctx) {\n\treturn duk__console_log_helper(ctx, NULL);\n}\n\nstatic duk_ret_t duk__console_warn(duk_context *ctx) {\n\treturn duk__console_log_helper(ctx, NULL);\n}\n\nstatic duk_ret_t duk__console_error(duk_context *ctx) {\n\treturn duk__console_log_helper(ctx, \"Error\");\n}\n\nstatic duk_ret_t duk__console_dir(duk_context *ctx) {\n\t/* For now, just share the formatting of .log() */\n\treturn duk__console_log_helper(ctx, 0);\n}\n\nstatic void duk__console_reg_vararg_func(duk_context *ctx, duk_c_function func, const char *name, duk_uint_t flags) {\n\tduk_push_c_function(ctx, func, DUK_VARARGS);\n\tduk_push_string(ctx, \"name\");\n\tduk_push_string(ctx, name);\n\tduk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE);  /* Improve stacktraces by displaying function name */\n\tduk_set_magic(ctx, -1, (duk_int_t) flags);\n\tduk_put_prop_string(ctx, -2, name);\n}\n\nvoid duk_console_init(duk_context *ctx, duk_uint_t flags) {\n\tduk_push_object(ctx);\n\n\t/* Custom function to format objects; user can replace.\n\t * For now, try JX-formatting and if that fails, fall back\n\t * to ToString(v).\n\t */\n\tduk_eval_string(ctx,\n\t\t\"(function (E) {\"\n\t\t    \"return function format(v){\"\n\t\t        \"try{\"\n\t\t            \"return E('jx',v);\"\n\t\t        \"}catch(e){\"\n\t\t            \"return String(v);\"  /* String() allows symbols, ToString() internal algorithm doesn't. */\n\t\t        \"}\"\n\t\t    \"};\"\n\t\t\"})(Duktape.enc)\");\n\tduk_put_prop_string(ctx, -2, \"format\");\n\n\tduk__console_reg_vararg_func(ctx, duk__console_assert, \"assert\", flags);\n\tduk__console_reg_vararg_func(ctx, duk__console_log, \"log\", flags);\n\tduk__console_reg_vararg_func(ctx, duk__console_log, \"debug\", flags);  /* alias to console.log */\n\tduk__console_reg_vararg_func(ctx, duk__console_trace, \"trace\", flags);\n\tduk__console_reg_vararg_func(ctx, duk__console_info, \"info\", flags);\n\tduk__console_reg_vararg_func(ctx, duk__console_warn, \"warn\", flags);\n\tduk__console_reg_vararg_func(ctx, duk__console_error, \"error\", flags);\n\tduk__console_reg_vararg_func(ctx, duk__console_error, \"exception\", flags);  /* alias to console.error */\n\tduk__console_reg_vararg_func(ctx, duk__console_dir, \"dir\", flags);\n\n\tduk_put_global_string(ctx, \"console\");\n\n\t/* Proxy wrapping: ensures any undefined console method calls are\n\t * ignored silently.  This is required specifically by the\n\t * DeveloperToolsWG proposal (and is implemented also by Firefox:\n\t * https://bugzilla.mozilla.org/show_bug.cgi?id=629607).\n\t */\n\n\tif (flags & DUK_CONSOLE_PROXY_WRAPPER) {\n\t\t/* Tolerate errors: Proxy may be disabled. */\n\t\tduk_peval_string_noresult(ctx,\n\t\t\t\"(function(){\"\n\t\t\t    \"var D=function(){};\"\n\t\t\t    \"console=new Proxy(console,{\"\n\t\t\t        \"get:function(t,k){\"\n\t\t\t            \"var v=t[k];\"\n\t\t\t            \"return typeof v==='function'?v:D;\"\n\t\t\t        \"}\"\n\t\t\t    \"});\"\n\t\t\t\"})();\"\n\t\t);\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_console.h",
    "content": "#if !defined(DUK_CONSOLE_H_INCLUDED)\n#define DUK_CONSOLE_H_INCLUDED\n\n#include \"duktape.h\"\n\n/* Use a proxy wrapper to make undefined methods (console.foo()) no-ops. */\n#define DUK_CONSOLE_PROXY_WRAPPER  (1 << 0)\n\n/* Flush output after every call. */\n#define DUK_CONSOLE_FLUSH          (1 << 1)\n\nextern void duk_console_init(duk_context *ctx, duk_uint_t flags);\n\n#endif  /* DUK_CONSOLE_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.c",
    "content": "/*\n *  Logging support\n */\n\n#include <stdio.h>\n#include <string.h>\n#include <stdarg.h>\n#include \"duktape.h\"\n#include \"duk_logging.h\"\n\n/* XXX: uses stderr always for now, configurable? */\n\n#define DUK_LOGGING_FLUSH  /* Duktape 1.x: flush stderr */\n\n/* 3-letter log level strings. */\nstatic const char duk__log_level_strings[] = {\n\t'T', 'R', 'C', 'D', 'B', 'G', 'I', 'N', 'F',\n\t'W', 'R', 'N', 'E', 'R', 'R', 'F', 'T', 'L'\n};\n\n/* Log method names. */\nstatic const char *duk__log_method_names[] = {\n\t\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"\n};\n\n/* Constructor. */\nstatic duk_ret_t duk__logger_constructor(duk_context *ctx) {\n\tduk_idx_t nargs;\n\n\t/* Calling as a non-constructor is not meaningful. */\n\tif (!duk_is_constructor_call(ctx)) {\n\t\treturn DUK_RET_TYPE_ERROR;\n\t}\n\n\tnargs = duk_get_top(ctx);\n\tduk_set_top(ctx, 1);\n\n\tduk_push_this(ctx);\n\n\t/* [ name this ] */\n\n\tif (nargs == 0) {\n\t\t/* Automatic defaulting of logger name from caller.  This\n\t\t * would work poorly with tail calls, but constructor calls\n\t\t * are currently never tail calls, so tail calls are not an\n\t\t * issue now.\n\t\t */\n\n\t\tduk_inspect_callstack_entry(ctx, -2);\n\t\tif (duk_is_object(ctx, -1)) {\n\t\t\tif (duk_get_prop_string(ctx, -1, \"function\")) {\n\t\t\t\tif (duk_get_prop_string(ctx, -1, \"fileName\")) {\n\t\t\t\t\tif (duk_is_string(ctx, -1)) {\n\t\t\t\t\t\tduk_replace(ctx, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/* Leave values on stack on purpose, ignored below. */\n\n\t\t/* Stripping the filename might be a good idea\n\t\t * (\"/foo/bar/quux.js\" -> logger name \"quux\"),\n\t\t * but now used verbatim.\n\t\t */\n\t}\n\t/* The stack is unbalanced here on purpose; we only rely on the\n\t * initial two values: [ name this ].\n\t */\n\n\tif (duk_is_string(ctx, 0)) {\n\t\tduk_dup(ctx, 0);\n\t\tduk_put_prop_string(ctx, 1, \"n\");\n\t} else {\n\t\t/* don't set 'n' at all, inherited value is used as name */\n\t}\n\n\tduk_compact(ctx, 1);\n\n\treturn 0;  /* keep default instance */\n}\n\n/* Default function to format objects.  Tries to use toLogString() but falls\n * back to toString().  Any errors are propagated out without catching.\n */\nstatic duk_ret_t duk__logger_prototype_fmt(duk_context *ctx) {\n\tif (duk_get_prop_string(ctx, 0, \"toLogString\")) {\n\t\t/* [ arg toLogString ] */\n\n\t\tduk_dup(ctx, 0);\n\t\tduk_call_method(ctx, 0);\n\n\t\t/* [ arg result ] */\n\t\treturn 1;\n\t}\n\n\t/* [ arg undefined ] */\n\tduk_pop(ctx);\n\tduk_to_string(ctx, 0);\n\treturn 1;\n}\n\n/* Default function to write a formatted log line.  Writes to stderr,\n * appending a newline to the log line.\n *\n * The argument is a buffer; avoid coercing the buffer to a string to\n * avoid string table traffic.\n */\nstatic duk_ret_t duk__logger_prototype_raw(duk_context *ctx) {\n\tconst char *data;\n\tduk_size_t data_len;\n\n\tdata = (const char *) duk_require_buffer(ctx, 0, &data_len);\n\tfwrite((const void *) data, 1, data_len, stderr);\n\tfputc((int) '\\n', stderr);\n#if defined(DUK_LOGGING_FLUSH)\n\tfflush(stderr);\n#endif\n\treturn 0;\n}\n\n/* Log frontend shared helper, magic value indicates log level.  Provides\n * frontend functions: trace(), debug(), info(), warn(), error(), fatal().\n * This needs to have small footprint, reasonable performance, minimal\n * memory churn, etc.\n */\nstatic duk_ret_t duk__logger_prototype_log_shared(duk_context *ctx) {\n\tduk_double_t now;\n\tduk_time_components comp;\n\tduk_small_int_t entry_lev;\n\tduk_small_int_t logger_lev;\n\tduk_int_t nargs;\n\tduk_int_t i;\n\tduk_size_t tot_len;\n\tconst duk_uint8_t *arg_str;\n\tduk_size_t arg_len;\n\tduk_uint8_t *buf, *p;\n\tconst duk_uint8_t *q;\n\tduk_uint8_t date_buf[32];  /* maximum format length is 24+1 (NUL), round up. */\n\tduk_size_t date_len;\n\tduk_small_int_t rc;\n\n\t/* XXX: sanitize to printable (and maybe ASCII) */\n\t/* XXX: better multiline */\n\n\t/*\n\t *  Logger arguments are:\n\t *\n\t *    magic: log level (0-5)\n\t *    this: logger\n\t *    stack: plain log args\n\t *\n\t *  We want to minimize memory churn so a two-pass approach\n\t *  is used: first pass formats arguments and computes final\n\t *  string length, second pass copies strings into a buffer\n\t *  allocated directly with the correct size.  If the backend\n\t *  function plays nice, it won't coerce the buffer to a string\n\t *  (and thus intern it).\n\t */\n\n\tentry_lev = duk_get_current_magic(ctx);\n\tif (entry_lev < DUK_LOG_TRACE || entry_lev > DUK_LOG_FATAL) {\n\t\t/* Should never happen, check just in case. */\n\t\treturn 0;\n\t}\n\tnargs = duk_get_top(ctx);\n\n\t/* [ arg1 ... argN this ] */\n\n\t/*\n\t *  Log level check\n\t */\n\n\tduk_push_this(ctx);\n\n\tduk_get_prop_string(ctx, -1, \"l\");\n\tlogger_lev = (duk_small_int_t) duk_get_int(ctx, -1);\n\tif (entry_lev < logger_lev) {\n\t\treturn 0;\n\t}\n\t/* log level could be popped but that's not necessary */\n\n\tnow = duk_get_now(ctx);\n\tduk_time_to_components(ctx, now, &comp);\n\tsprintf((char *) date_buf, \"%04d-%02d-%02dT%02d:%02d:%02d.%03dZ\",\n\t        (int) comp.year, (int) comp.month + 1, (int) comp.day,\n\t        (int) comp.hours, (int) comp.minutes, (int) comp.seconds,\n\t        (int) comp.milliseconds);\n\n\tdate_len = strlen((const char *) date_buf);\n\n\tduk_get_prop_string(ctx, -2, \"n\");\n\tduk_to_string(ctx, -1);\n\n\t/* [ arg1 ... argN this loggerLevel loggerName ] */\n\n\t/*\n\t *  Pass 1\n\t */\n\n\t/* Line format: <time> <entryLev> <loggerName>: <msg> */\n\n\ttot_len = 0;\n\ttot_len += 3 +  /* separators: space, space, colon */\n\t           3 +  /* level string */\n\t           date_len +  /* time */\n\t           duk_get_length(ctx, -1);  /* loggerName */\n\n\tfor (i = 0; i < nargs; i++) {\n\t\t/* When formatting an argument to a string, errors may happen from multiple\n\t\t * causes.  In general we want to catch obvious errors like a toLogString()\n\t\t * throwing an error, but we don't currently try to catch every possible\n\t\t * error.  In particular, internal errors (like out of memory or stack) are\n\t\t * not caught.  Also, we expect Error toString() to not throw an error.\n\t\t */\n\t\tif (duk_is_object(ctx, i)) {\n\t\t\t/* duk_pcall_prop() may itself throw an error, but we're content\n\t\t\t * in catching the obvious errors (like toLogString() throwing an\n\t\t\t * error).\n\t\t\t */\n\t\t\tduk_push_string(ctx, \"fmt\");\n\t\t\tduk_dup(ctx, i);\n\t\t\t/* [ arg1 ... argN this loggerLevel loggerName 'fmt' arg ] */\n\t\t\t/* call: this.fmt(arg) */\n\t\t\trc = duk_pcall_prop(ctx, -5 /*obj_index*/, 1 /*nargs*/);\n\t\t\tif (rc) {\n\t\t\t\t/* Keep the error as the result (coercing it might fail below,\n\t\t\t\t * but we don't catch that now).\n\t\t\t\t */\n\t\t\t\t;\n\t\t\t}\n\t\t\tduk_replace(ctx, i);\n\t\t}\n\t\t(void) duk_to_lstring(ctx, i, &arg_len);\n\t\ttot_len++;  /* sep (even before first one) */\n\t\ttot_len += arg_len;\n\t}\n\n\t/*\n\t *  Pass 2\n\t */\n\n\t/* XXX: Here it'd be nice if we didn't need to allocate a new fixed\n\t * buffer for every write.  This would be possible if raw() took a\n\t * buffer and a length.  We could then use a preallocated buffer for\n\t * most log writes and request raw() to write a partial buffer.\n\t */\n\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, tot_len);\n\tp = buf;\n\n\tmemcpy((void *) p, (const void *) date_buf, (size_t) date_len);\n\tp += date_len;\n\t*p++ = (duk_uint8_t) ' ';\n\n\tq = (const duk_uint8_t *) duk__log_level_strings + (entry_lev * 3);\n\tmemcpy((void *) p, (const void *) q, (size_t) 3);\n\tp += 3;\n\n\t*p++ = (duk_uint8_t) ' ';\n\n\targ_str = (const duk_uint8_t *) duk_get_lstring(ctx, -2, &arg_len);\n\tmemcpy((void *) p, (const void *) arg_str, (size_t) arg_len);\n\tp += arg_len;\n\n\t*p++ = (duk_uint8_t) ':';\n\n\tfor (i = 0; i < nargs; i++) {\n\t\t*p++ = (duk_uint8_t) ' ';\n\n\t\targ_str = (const duk_uint8_t *) duk_get_lstring(ctx, i, &arg_len);\n\t\tmemcpy((void *) p, (const void *) arg_str, (size_t) arg_len);\n\t\tp += arg_len;\n\t}\n\n\t/* [ arg1 ... argN this loggerLevel loggerName buffer ] */\n\n\t/* Call this.raw(msg); look up through the instance allows user to override\n\t * the raw() function in the instance or in the prototype for maximum\n\t * flexibility.\n\t */\n\tduk_push_string(ctx, \"raw\");\n\tduk_dup(ctx, -2);\n\t/* [ arg1 ... argN this loggerLevel loggerName buffer 'raw' buffer ] */\n\tduk_call_prop(ctx, -6, 1);  /* this.raw(buffer) */\n\n\treturn 0;\n}\n\nvoid duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap) {\n\tif (level < 0) {\n\t\tlevel = 0;\n\t} else if (level > (int) (sizeof(duk__log_method_names) / sizeof(const char *)) - 1) {\n\t\tlevel = (int) (sizeof(duk__log_method_names) / sizeof(const char *)) - 1;\n\t}\n\n\tduk_push_global_stash(ctx);\n\tduk_get_prop_string(ctx, -1, \"\\xff\" \"logger:constructor\");  /* fixed at init time */\n\tduk_get_prop_string(ctx, -1, \"clog\");\n\tduk_get_prop_string(ctx, -1, duk__log_method_names[level]);\n\tduk_dup(ctx, -2);\n\tduk_push_vsprintf(ctx, fmt, ap);\n\n\t/* [ ... stash Logger clog logfunc clog(=this) msg ] */\n\n\tduk_call_method(ctx, 1 /*nargs*/);\n\n\t/* [ ... stash Logger clog res ] */\n\n\tduk_pop_n(ctx, 4);\n}\n\nvoid duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...) {\n\tva_list ap;\n\n\tva_start(ap, fmt);\n\tduk_log_va(ctx, level, fmt, ap);\n\tva_end(ap);\n}\n\nvoid duk_logging_init(duk_context *ctx, duk_uint_t flags) {\n\t/* XXX: Add .name property for logger functions (useful for stack traces if they throw). */\n\n\t(void) flags;\n\n\tduk_eval_string(ctx,\n\t\t\"(function(cons,prot){\"\n\t\t\"Object.defineProperty(Duktape,'Logger',{value:cons,writable:true,configurable:true});\"\n\t\t\"Object.defineProperty(cons,'prototype',{value:prot});\"\n\t\t\"Object.defineProperty(cons,'clog',{value:new Duktape.Logger('C'),writable:true,configurable:true});\"\n\t\t\"});\");\n\n\tduk_push_c_function(ctx, duk__logger_constructor, DUK_VARARGS /*nargs*/);  /* Duktape.Logger */\n\tduk_push_object(ctx);  /* Duktape.Logger.prototype */\n\n\t/* [ ... func Duktape.Logger Duktape.Logger.prototype ] */\n\n\tduk_push_string(ctx, \"name\");\n\tduk_push_string(ctx, \"Logger\");\n\tduk_def_prop(ctx, -4, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE);\n\n\tduk_dup_top(ctx);\n\tduk_put_prop_string(ctx, -2, \"constructor\");\n\tduk_push_int(ctx, 2);\n\tduk_put_prop_string(ctx, -2, \"l\");\n\tduk_push_string(ctx, \"anon\");\n\tduk_put_prop_string(ctx, -2, \"n\");\n\tduk_push_c_function(ctx, duk__logger_prototype_fmt, 1 /*nargs*/);\n\tduk_put_prop_string(ctx, -2, \"fmt\");\n\tduk_push_c_function(ctx, duk__logger_prototype_raw, 1 /*nargs*/);\n\tduk_put_prop_string(ctx, -2, \"raw\");\n\tduk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);\n\tduk_set_magic(ctx, -1, 0);  /* magic=0: trace */\n\tduk_put_prop_string(ctx, -2, \"trace\");\n\tduk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);\n\tduk_set_magic(ctx, -1, 1);  /* magic=1: debug */\n\tduk_put_prop_string(ctx, -2, \"debug\");\n\tduk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);\n\tduk_set_magic(ctx, -1, 2);  /* magic=2: info */\n\tduk_put_prop_string(ctx, -2, \"info\");\n\tduk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);\n\tduk_set_magic(ctx, -1, 3);  /* magic=3: warn */\n\tduk_put_prop_string(ctx, -2, \"warn\");\n\tduk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);\n\tduk_set_magic(ctx, -1, 4);  /* magic=4: error */\n\tduk_put_prop_string(ctx, -2, \"error\");\n\tduk_push_c_function(ctx, duk__logger_prototype_log_shared, DUK_VARARGS /*nargs*/);\n\tduk_set_magic(ctx, -1, 5);  /* magic=5: fatal */\n\tduk_put_prop_string(ctx, -2, \"fatal\");\n\n\t/* [ ... func Duktape.Logger Duktape.Logger.prototype ] */\n\n\t/* XXX: when using ROM built-ins, \"Duktape\" is read-only by default so\n\t * setting Duktape.Logger will now fail.\n\t */\n\n\t/* [ ... func Duktape.Logger Duktape.Logger.prototype ] */\n\n\tduk_call(ctx, 2);\n\tduk_pop(ctx);\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_logging.h",
    "content": "#if !defined(DUK_LOGGING_H_INCLUDED)\n#define DUK_LOGGING_H_INCLUDED\n\n#include \"duktape.h\"\n\n/* Log levels */\n#define DUK_LOG_TRACE                     0\n#define DUK_LOG_DEBUG                     1\n#define DUK_LOG_INFO                      2\n#define DUK_LOG_WARN                      3\n#define DUK_LOG_ERROR                     4\n#define DUK_LOG_FATAL                     5\n\n/* No flags at the moment. */\n\nextern void duk_logging_init(duk_context *ctx, duk_uint_t flags);\nextern void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap);\nextern void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...);\n\n#endif  /* DUK_LOGGING_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.c",
    "content": "/*\n *  Minimal vsnprintf(), snprintf(), sprintf(), and sscanf() for Duktape.\n *  The supported conversion formats narrowly match what Duktape needs.\n */\n\n#include <stdarg.h>  /* va_list etc */\n#include <stddef.h>  /* size_t */\n#include <stdint.h>  /* SIZE_MAX */\n\n/* Write character with bound checking.  Offset 'off' is updated regardless\n * of whether an actual write is made.  This is necessary to satisfy snprintf()\n * return value semantics.\n */\n#define DUK__WRITE_CHAR(c) do { \\\n\t\tif (off < size) { \\\n\t\t\tstr[off] = (char) c; \\\n\t\t} \\\n\t\toff++; \\\n\t} while (0)\n\n/* Digits up to radix 16. */\nstatic const char duk__format_digits[16] = {\n\t'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'\n};\n\n/* Format an unsigned long with various options.  An unsigned long is large\n * enough for formatting all supported types.\n */\nstatic size_t duk__format_long(char *str,\n                               size_t size,\n                               size_t off,\n                               int fixed_length,\n                               char pad,\n                               int radix,\n                               int neg_sign,\n                               unsigned long v) {\n\tchar buf[24];  /* 2^64 = 18446744073709552000, length 20 */\n\tchar *required;\n\tchar *p;\n\tint i;\n\n\t/* Format in reverse order first.  Ensure at least one digit is output\n\t * to handle '0' correctly.  Note that space padding and zero padding\n\t * handle negative sign differently:\n\t *\n\t *     %9d and -321  => '     -321'\n\t *     %09d and -321 => '-00000321'\n\t */\n\n\tfor (i = 0; i < (int) sizeof(buf); i++) {\n\t\tbuf[i] = pad;  /* compiles into memset() equivalent, avoid memset() dependency */\n\t}\n\n\tp = buf;\n\tdo {\n\t\t*p++ = duk__format_digits[v % radix];\n\t\tv /= radix;\n\t} while (v != 0);\n\n\trequired = buf + fixed_length;\n\tif (p < required && pad == (char) '0') {\n\t\t/* Zero padding and we didn't reach maximum length: place\n\t\t * negative sign at the last position.  We can't get here\n\t\t * with fixed_length == 0 so that required[-1] is safe.\n\t\t *\n\t\t * Technically we should only do this for 'neg_sign == 1',\n\t\t * but it's OK to advance the pointer even when that's not\n\t\t * the case.\n\t\t */\n\t\tp = required - 1;\n\t}\n\tif (neg_sign) {\n\t\t*p++ = (char) '-';\n\t}\n\tif (p < required) {\n\t\tp = required;\n\t}\n\n\t/* Now [buf,p[ contains the result in reverse; copy into place. */\n\n\twhile (p > buf) {\n\t\tp--;\n\t\tDUK__WRITE_CHAR(*p);\n\t}\n\n\treturn off;\n}\n\n/* Parse a pointer.  Must parse whatever is produced by '%p' in sprintf(). */\nstatic int duk__parse_pointer(const char *str, void **out) {\n\tconst unsigned char *p;\n\tunsigned char ch;\n\tint count;\n\tint limit;\n\tlong val;  /* assume void * fits into long */\n\n\t/* We only need to parse what our minimal printf() produces, so that\n\t * we can check for a '0x' prefix, and assume all hex digits are\n\t * lowercase.\n\t */\n\n\tp = (const unsigned char *) str;\n\tif (p[0] != (unsigned char) '0' || p[1] != (unsigned char) 'x') {\n\t\treturn 0;\n\t}\n\tp += 2;\n\n\tfor (val = 0, count = 0, limit = sizeof(void *) * 2; count < limit; count++) {\n\t\tch = *p++;\n\n\t\tval <<= 4;\n\t\tif (ch >= (unsigned char) '0' && ch <= (unsigned char) '9') {\n\t\t\tval += ch - (unsigned char) '0';\n\t\t} else if (ch >= (unsigned char) 'a' && ch <= (unsigned char) 'f') {\n\t\t\tval += ch - (unsigned char) 'a' + 0x0a;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/* The input may end at a NUL or garbage may follow.  As long as we\n\t * parse the '%p' correctly, garbage is allowed to follow, and the\n\t * JX pointer parsing also relies on that.\n\t */\n\n\t*out = (void *) val;\n\treturn 1;\n}\n\n/* Minimal vsnprintf() entry point. */\nint duk_minimal_vsnprintf(char *str, size_t size, const char *format, va_list ap) {\n\tsize_t off = 0;\n\tconst char *p;\n#if 0\n\tconst char *p_tmp;\n\tconst char *p_fmt_start;\n#endif\n\tchar c;\n\tchar pad;\n\tint fixed_length;\n\tint is_long;\n\n\t/* Assume str != NULL unless size == 0.\n\t * Assume format != NULL.\n\t */\n\n\tp = format;\n\tfor (;;) {\n\t\tc = *p++;\n\t\tif (c == (char) 0) {\n\t\t\tbreak;\n\t\t}\n\t\tif (c != (char) '%') {\n\t\t\tDUK__WRITE_CHAR(c);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Start format sequence.  Scan flags and format specifier. */\n\n#if 0\n\t\tp_fmt_start = p - 1;\n#endif\n\t\tis_long = 0;\n\t\tpad = ' ';\n\t\tfixed_length = 0;\n\t\tfor (;;) {\n\t\t\tc = *p++;\n\t\t\tif (c == (char) 'l') {\n\t\t\t\tis_long = 1;\n\t\t\t} else if (c == (char) '0') {\n\t\t\t\t/* Only support pad character '0'. */\n\t\t\t\tpad = '0';\n\t\t\t} else if (c >= (char) '1' && c <= (char) '9') {\n\t\t\t\t/* Only support fixed lengths 1-9. */\n\t\t\t\tfixed_length = (int) (c - (char) '0');\n\t\t\t} else if (c == (char) 'd') {\n\t\t\t\tlong v;\n\t\t\t\tint neg_sign = 0;\n\t\t\t\tif (is_long) {\n\t\t\t\t\tv = va_arg(ap, long);\n\t\t\t\t} else {\n\t\t\t\t\tv = (long) va_arg(ap, int);\n\t\t\t\t}\n\t\t\t\tif (v < 0) {\n\t\t\t\t\tneg_sign = 1;\n\t\t\t\t\tv = -v;\n\t\t\t\t}\n\t\t\t\toff = duk__format_long(str, size, off, fixed_length, pad, 10, neg_sign, (unsigned long) v);\n\t\t\t\tbreak;\n\t\t\t} else if (c == (char) 'u') {\n\t\t\t\tunsigned long v;\n\t\t\t\tif (is_long) {\n\t\t\t\t\tv = va_arg(ap, unsigned long);\n\t\t\t\t} else {\n\t\t\t\t\tv = (unsigned long) va_arg(ap, unsigned int);\n\t\t\t\t}\n\t\t\t\toff = duk__format_long(str, size, off, fixed_length, pad, 10, 0, v);\n\t\t\t\tbreak;\n\t\t\t} else if (c == (char) 'x') {\n\t\t\t\tunsigned long v;\n\t\t\t\tif (is_long) {\n\t\t\t\t\tv = va_arg(ap, unsigned long);\n\t\t\t\t} else {\n\t\t\t\t\tv = (unsigned long) va_arg(ap, unsigned int);\n\t\t\t\t}\n\t\t\t\toff = duk__format_long(str, size, off, fixed_length, pad, 16, 0, v);\n\t\t\t\tbreak;\n\t\t\t} else if (c == (char) 'c') {\n\t\t\t\tchar v;\n\t\t\t\tv = (char) va_arg(ap, int);  /* intentionally not 'char' */\n\t\t\t\tDUK__WRITE_CHAR(v);\n\t\t\t\tbreak;\n\t\t\t} else if (c == (char) 's') {\n\t\t\t\tconst char *v;\n\t\t\t\tchar c_tmp;\n\t\t\t\tv = va_arg(ap, const char *);\n\t\t\t\tif (v) {\n\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\tc_tmp = *v++;\n\t\t\t\t\t\tif (c_tmp) {\n\t\t\t\t\t\t\tDUK__WRITE_CHAR(c_tmp);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else if (c == (char) 'p') {\n\t\t\t\t/* Assume a void * can be represented by 'long'.  This is not\n\t\t\t\t * always the case.  NULL pointer is printed out as 0x0000...\n\t\t\t\t */\n\t\t\t\tvoid *v;\n\t\t\t\tv = va_arg(ap, void *);\n\t\t\t\tDUK__WRITE_CHAR('0');\n\t\t\t\tDUK__WRITE_CHAR('x');\n\t\t\t\toff = duk__format_long(str, size, off, sizeof(void *) * 2, '0', 16, 0, (unsigned long) v);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t/* Unrecognized, bail out early.  We could also emit the format\n\t\t\t\t * specifier verbatim, but it'd be a waste of footprint because\n\t\t\t\t * this case should never happen in practice.\n\t\t\t\t */\n#if 0\n\t\t\t\tDUK__WRITE_CHAR('!');\n#endif\n#if 0\n\t\t\t\tfor (p_tmp = p_fmt_start; p_tmp != p; p_tmp++) {\n\t\t\t\t\tDUK__WRITE_CHAR(*p_tmp);\n\t\t\t\t}\n\t\t\t\tbreak;\n#endif\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t}\n\n finish:\n\tif (off < size) {\n\t\tstr[off] = (char) 0;  /* No increment for 'off', not counted in return value. */\n\t} else if (size > 0) {\n\t\t/* Forced termination. */\n\t\tstr[size - 1] = 0;\n\t}\n\n\treturn (int) off;\n}\n\n/* Minimal snprintf() entry point. */\nint duk_minimal_snprintf(char *str, size_t size, const char *format, ...) {\n\tva_list ap;\n\tint ret;\n\n\tva_start(ap, format);\n\tret = duk_minimal_vsnprintf(str, size, format, ap);\n\tva_end(ap);\n\n\treturn ret;\n}\n\n/* Minimal sprintf() entry point. */\nint duk_minimal_sprintf(char *str, const char *format, ...) {\n\tva_list ap;\n\tint ret;\n\n\tva_start(ap, format);\n\tret = duk_minimal_vsnprintf(str, SIZE_MAX, format, ap);\n\tva_end(ap);\n\n\treturn ret;\n}\n\n/* Minimal sscanf() entry point. */\nint duk_minimal_sscanf(const char *str, const char *format, ...) {\n\tva_list ap;\n\tint ret;\n\tvoid **out;\n\n\t/* Only the exact \"%p\" format is supported. */\n\tif (format[0] != (char) '%' ||\n\t    format[1] != (char) 'p' ||\n\t    format[2] != (char) 0) {\n\t}\n\n\tva_start(ap, format);\n\tout = va_arg(ap, void **);\n\tret = duk__parse_pointer(str, out);\n\tva_end(ap);\n\n\treturn ret;\n}\n\n#undef DUK__WRITE_CHAR\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_minimal_printf.h",
    "content": "#if !defined(DUK_MINIMAL_PRINTF_H_INCLUDED)\n#define DUK_MINIMAL_PRINTF_H_INCLUDED\n\n#include <stdarg.h>  /* va_list etc */\n#include <stddef.h>  /* size_t */\n\nextern int duk_minimal_sprintf(char *str, const char *format, ...);\nextern int duk_minimal_snprintf(char *str, size_t size, const char *format, ...);\nextern int duk_minimal_vsnprintf(char *str, size_t size, const char *format, va_list ap);\nextern int duk_minimal_sscanf(const char *str, const char *format, ...);\n\n#endif  /* DUK_MINIMAL_PRINTF_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.c",
    "content": "/*\n *  Duktape 1.x compatible module loading framework\n */\n\n#include \"duktape.h\"\n#include \"duk_module_duktape.h\"\n\n/* (v)snprintf() is missing before MSVC 2015.  Note that _(v)snprintf() does\n * NOT NUL terminate on truncation, but that's OK here.\n * http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010\n */\n#if defined(_MSC_VER) && (_MSC_VER < 1900)\n#define snprintf _snprintf\n#endif\n\n#if 0  /* Enable manually */\n#define DUK__ASSERT(x) do { \\\n\t\tif (!(x)) { \\\n\t\t\tfprintf(stderr, \"ASSERTION FAILED at %s:%d: \" #x \"\\n\", __FILE__, __LINE__); \\\n\t\t\tfflush(stderr);  \\\n\t\t} \\\n\t} while (0)\n#define DUK__ASSERT_TOP(ctx,val) do { \\\n\t\tDUK__ASSERT(duk_get_top((ctx)) == (val)); \\\n\t} while (0)\n#else\n#define DUK__ASSERT(x) do { (void) (x); } while (0)\n#define DUK__ASSERT_TOP(ctx,val) do { (void) ctx; (void) (val); } while (0)\n#endif\n\nstatic void duk__resolve_module_id(duk_context *ctx, const char *req_id, const char *mod_id) {\n\tduk_uint8_t buf[DUK_COMMONJS_MODULE_ID_LIMIT];\n\tduk_uint8_t *p;\n\tduk_uint8_t *q;\n\tduk_uint8_t *q_last;  /* last component */\n\tduk_int_t int_rc;\n\n\tDUK__ASSERT(req_id != NULL);\n\t/* mod_id may be NULL */\n\n\t/*\n\t *  A few notes on the algorithm:\n\t *\n\t *    - Terms are not allowed to begin with a period unless the term\n\t *      is either '.' or '..'.  This simplifies implementation (and\n\t *      is within CommonJS modules specification).\n\t *\n\t *    - There are few output bound checks here.  This is on purpose:\n\t *      the resolution input is length checked and the output is never\n\t *      longer than the input.  The resolved output is written directly\n\t *      over the input because it's never longer than the input at any\n\t *      point in the algorithm.\n\t *\n\t *    - Non-ASCII characters are processed as individual bytes and\n\t *      need no special treatment.  However, U+0000 terminates the\n\t *      algorithm; this is not an issue because U+0000 is not a\n\t *      desirable term character anyway.\n\t */\n\n\t/*\n\t *  Set up the resolution input which is the requested ID directly\n\t *  (if absolute or no current module path) or with current module\n\t *  ID prepended (if relative and current module path exists).\n\t *\n\t *  Suppose current module is 'foo/bar' and relative path is './quux'.\n\t *  The 'bar' component must be replaced so the initial input here is\n\t *  'foo/bar/.././quux'.\n\t */\n\n\tif (mod_id != NULL && req_id[0] == '.') {\n\t\tint_rc = snprintf((char *) buf, sizeof(buf), \"%s/../%s\", mod_id, req_id);\n\t} else {\n\t\tint_rc = snprintf((char *) buf, sizeof(buf), \"%s\", req_id);\n\t}\n\tif (int_rc >= (duk_int_t) sizeof(buf) || int_rc < 0) {\n\t\t/* Potentially truncated, NUL not guaranteed in any case.\n\t\t * The (int_rc < 0) case should not occur in practice.\n\t\t */\n\t\tgoto resolve_error;\n\t}\n\tDUK__ASSERT(strlen((const char *) buf) < sizeof(buf));  /* at most sizeof(buf) - 1 */\n\n\t/*\n\t *  Resolution loop.  At the top of the loop we're expecting a valid\n\t *  term: '.', '..', or a non-empty identifier not starting with a period.\n\t */\n\n\tp = buf;\n\tq = buf;\n\tfor (;;) {\n\t\tduk_uint_fast8_t c;\n\n\t\t/* Here 'p' always points to the start of a term.\n\t\t *\n\t\t * We can also unconditionally reset q_last here: if this is\n\t\t * the last (non-empty) term q_last will have the right value\n\t\t * on loop exit.\n\t\t */\n\n\t\tDUK__ASSERT(p >= q);  /* output is never longer than input during resolution */\n\n\t\tq_last = q;\n\n\t\tc = *p++;\n\t\tif (c == 0) {\n\t\t\tgoto resolve_error;\n\t\t} else if (c == '.') {\n\t\t\tc = *p++;\n\t\t\tif (c == '/') {\n\t\t\t\t/* Term was '.' and is eaten entirely (including dup slashes). */\n\t\t\t\tgoto eat_dup_slashes;\n\t\t\t}\n\t\t\tif (c == '.' && *p == '/') {\n\t\t\t\t/* Term was '..', backtrack resolved name by one component.\n\t\t\t\t *  q[-1] = previous slash (or beyond start of buffer)\n\t\t\t\t *  q[-2] = last char of previous component (or beyond start of buffer)\n\t\t\t\t */\n\t\t\t\tp++;  /* eat (first) input slash */\n\t\t\t\tDUK__ASSERT(q >= buf);\n\t\t\t\tif (q == buf) {\n\t\t\t\t\tgoto resolve_error;\n\t\t\t\t}\n\t\t\t\tDUK__ASSERT(*(q - 1) == '/');\n\t\t\t\tq--;  /* Backtrack to last output slash (dups already eliminated). */\n\t\t\t\tfor (;;) {\n\t\t\t\t\t/* Backtrack to previous slash or start of buffer. */\n\t\t\t\t\tDUK__ASSERT(q >= buf);\n\t\t\t\t\tif (q == buf) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (*(q - 1) == '/') {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tq--;\n\t\t\t\t}\n\t\t\t\tgoto eat_dup_slashes;\n\t\t\t}\n\t\t\tgoto resolve_error;\n\t\t} else if (c == '/') {\n\t\t\t/* e.g. require('/foo'), empty terms not allowed */\n\t\t\tgoto resolve_error;\n\t\t} else {\n\t\t\tfor (;;) {\n\t\t\t\t/* Copy term name until end or '/'. */\n\t\t\t\t*q++ = c;\n\t\t\t\tc = *p++;\n\t\t\t\tif (c == 0) {\n\t\t\t\t\t/* This was the last term, and q_last was\n\t\t\t\t\t * updated to match this term at loop top.\n\t\t\t\t\t */\n\t\t\t\t\tgoto loop_done;\n\t\t\t\t} else if (c == '/') {\n\t\t\t\t\t*q++ = '/';\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t/* write on next loop */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t eat_dup_slashes:\n\t\tfor (;;) {\n\t\t\t/* eat dup slashes */\n\t\t\tc = *p;\n\t\t\tif (c != '/') {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tp++;\n\t\t}\n\t}\n loop_done:\n\t/* Output #1: resolved absolute name. */\n\tDUK__ASSERT(q >= buf);\n\tduk_push_lstring(ctx, (const char *) buf, (size_t) (q - buf));\n\n\t/* Output #2: last component name. */\n\tDUK__ASSERT(q >= q_last);\n\tDUK__ASSERT(q_last >= buf);\n\tduk_push_lstring(ctx, (const char *) q_last, (size_t) (q - q_last));\n\treturn;\n\n resolve_error:\n\t(void) duk_type_error(ctx, \"cannot resolve module id: %s\", (const char *) req_id);\n}\n\n/* Stack indices for better readability. */\n#define DUK__IDX_REQUESTED_ID   0   /* module id requested */\n#define DUK__IDX_REQUIRE        1   /* current require() function */\n#define DUK__IDX_REQUIRE_ID     2   /* the base ID of the current require() function, resolution base */\n#define DUK__IDX_RESOLVED_ID    3   /* resolved, normalized absolute module ID */\n#define DUK__IDX_LASTCOMP       4   /* last component name in resolved path */\n#define DUK__IDX_DUKTAPE        5   /* Duktape object */\n#define DUK__IDX_MODLOADED      6   /* Duktape.modLoaded[] module cache */\n#define DUK__IDX_UNDEFINED      7   /* 'undefined', artifact of lookup */\n#define DUK__IDX_FRESH_REQUIRE  8   /* new require() function for module, updated resolution base */\n#define DUK__IDX_EXPORTS        9   /* default exports table */\n#define DUK__IDX_MODULE         10  /* module object containing module.exports, etc */\n\nstatic duk_ret_t duk__require(duk_context *ctx) {\n\tconst char *str_req_id;  /* requested identifier */\n\tconst char *str_mod_id;  /* require.id of current module */\n\tduk_int_t pcall_rc;\n\n\t/* NOTE: we try to minimize code size by avoiding unnecessary pops,\n\t * so the stack looks a bit cluttered in this function.  DUK__ASSERT_TOP()\n\t * assertions are used to ensure stack configuration is correct at each\n\t * step.\n\t */\n\n\t/*\n\t *  Resolve module identifier into canonical absolute form.\n\t */\n\n\tstr_req_id = duk_require_string(ctx, DUK__IDX_REQUESTED_ID);\n\tduk_push_current_function(ctx);\n\tduk_get_prop_string(ctx, -1, \"id\");\n\tstr_mod_id = duk_get_string(ctx, DUK__IDX_REQUIRE_ID);  /* ignore non-strings */\n\tduk__resolve_module_id(ctx, str_req_id, str_mod_id);\n\tstr_req_id = NULL;\n\tstr_mod_id = NULL;\n\n\t/* [ requested_id require require.id resolved_id last_comp ] */\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_LASTCOMP + 1);\n\n\t/*\n\t *  Cached module check.\n\t *\n\t *  If module has been loaded or its loading has already begun without\n\t *  finishing, return the same cached value (module.exports).  The\n\t *  value is registered when module load starts so that circular\n\t *  references can be supported to some extent.\n\t */\n\n\tduk_push_global_stash(ctx);\n\tduk_get_prop_string(ctx, -1, \"\\xff\" \"module:Duktape\");\n\tduk_remove(ctx, -2);  /* Lookup stashed, original 'Duktape' object. */\n\tduk_get_prop_string(ctx, DUK__IDX_DUKTAPE, \"modLoaded\");  /* Duktape.modLoaded */\n\tduk_require_type_mask(ctx, DUK__IDX_MODLOADED, DUK_TYPE_MASK_OBJECT);\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_MODLOADED + 1);\n\n\tduk_dup(ctx, DUK__IDX_RESOLVED_ID);\n\tif (duk_get_prop(ctx, DUK__IDX_MODLOADED)) {\n\t\t/* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded Duktape.modLoaded[id] ] */\n\t\tduk_get_prop_string(ctx, -1, \"exports\");  /* return module.exports */\n\t\treturn 1;\n\t}\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_UNDEFINED + 1);\n\n\t/* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined ] */\n\n\t/*\n\t *  Module not loaded (and loading not started previously).\n\t *\n\t *  Create a new require() function with 'id' set to resolved ID\n\t *  of module being loaded.  Also create 'exports' and 'module'\n\t *  tables but don't register exports to the loaded table yet.\n\t *  We don't want to do that unless the user module search callbacks\n\t *  succeeds in finding the module.\n\t */\n\n\t/* Fresh require: require.id is left configurable (but not writable)\n\t * so that is not easy to accidentally tweak it, but it can still be\n\t * done with Object.defineProperty().\n\t *\n\t * XXX: require.id could also be just made non-configurable, as there\n\t * is no practical reason to touch it (at least from Ecmascript code).\n\t */\n\tduk_push_c_function(ctx, duk__require, 1 /*nargs*/);\n\tduk_push_string(ctx, \"name\");\n\tduk_push_string(ctx, \"require\");\n\tduk_def_prop(ctx, DUK__IDX_FRESH_REQUIRE, DUK_DEFPROP_HAVE_VALUE);  /* not writable, not enumerable, not configurable */\n\tduk_push_string(ctx, \"id\");\n\tduk_dup(ctx, DUK__IDX_RESOLVED_ID);\n\tduk_def_prop(ctx, DUK__IDX_FRESH_REQUIRE, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_CONFIGURABLE);  /* a fresh require() with require.id = resolved target module id */\n\n\t/* Module table:\n\t * - module.exports: initial exports table (may be replaced by user)\n\t * - module.id is non-writable and non-configurable, as the CommonJS\n\t *   spec suggests this if possible\n\t * - module.filename: not set, defaults to resolved ID if not explicitly\n\t *   set by modSearch() (note capitalization, not .fileName, matches Node.js)\n\t * - module.name: not set, defaults to last component of resolved ID if\n\t *   not explicitly set by modSearch()\n\t */\n\tduk_push_object(ctx);  /* exports */\n\tduk_push_object(ctx);  /* module */\n\tduk_push_string(ctx, \"exports\");\n\tduk_dup(ctx, DUK__IDX_EXPORTS);\n\tduk_def_prop(ctx, DUK__IDX_MODULE, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE);  /* module.exports = exports */\n\tduk_push_string(ctx, \"id\");\n\tduk_dup(ctx, DUK__IDX_RESOLVED_ID);  /* resolved id: require(id) must return this same module */\n\tduk_def_prop(ctx, DUK__IDX_MODULE, DUK_DEFPROP_HAVE_VALUE);  /* module.id = resolved_id; not writable, not enumerable, not configurable */\n\tduk_compact(ctx, DUK__IDX_MODULE);  /* module table remains registered to modLoaded, minimize its size */\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 1);\n\n\t/* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module ] */\n\n\t/* Register the module table early to modLoaded[] so that we can\n\t * support circular references even in modSearch().  If an error\n\t * is thrown, we'll delete the reference.\n\t */\n\tduk_dup(ctx, DUK__IDX_RESOLVED_ID);\n\tduk_dup(ctx, DUK__IDX_MODULE);\n\tduk_put_prop(ctx, DUK__IDX_MODLOADED);  /* Duktape.modLoaded[resolved_id] = module */\n\n\t/*\n\t *  Call user provided module search function and build the wrapped\n\t *  module source code (if necessary).  The module search function\n\t *  can be used to implement pure Ecmacsript, pure C, and mixed\n\t *  Ecmascript/C modules.\n\t *\n\t *  The module search function can operate on the exports table directly\n\t *  (e.g. DLL code can register values to it).  It can also return a\n\t *  string which is interpreted as module source code (if a non-string\n\t *  is returned the module is assumed to be a pure C one).  If a module\n\t *  cannot be found, an error must be thrown by the user callback.\n\t *\n\t *  Because Duktape.modLoaded[] already contains the module being\n\t *  loaded, circular references for C modules should also work\n\t *  (although expected to be quite rare).\n\t */\n\n\tduk_push_string(ctx, \"(function(require,exports,module){\");\n\n\t/* Duktape.modSearch(resolved_id, fresh_require, exports, module). */\n\tduk_get_prop_string(ctx, DUK__IDX_DUKTAPE, \"modSearch\");  /* Duktape.modSearch */\n\tduk_dup(ctx, DUK__IDX_RESOLVED_ID);\n\tduk_dup(ctx, DUK__IDX_FRESH_REQUIRE);\n\tduk_dup(ctx, DUK__IDX_EXPORTS);\n\tduk_dup(ctx, DUK__IDX_MODULE);  /* [ ... Duktape.modSearch resolved_id last_comp fresh_require exports module ] */\n\tpcall_rc = duk_pcall(ctx, 4 /*nargs*/);  /* -> [ ... source ] */\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 3);\n\n\tif (pcall_rc != DUK_EXEC_SUCCESS) {\n\t\t/* Delete entry in Duktape.modLoaded[] and rethrow. */\n\t\tgoto delete_rethrow;\n\t}\n\n\t/* If user callback did not return source code, module loading\n\t * is finished (user callback initialized exports table directly).\n\t */\n\tif (!duk_is_string(ctx, -1)) {\n\t\t/* User callback did not return source code, so module loading\n\t\t * is finished: just update modLoaded with final module.exports\n\t\t * and we're done.\n\t\t */\n\t\tgoto return_exports;\n\t}\n\n\t/* Finish the wrapped module source.  Force module.filename as the\n\t * function .fileName so it gets set for functions defined within a\n\t * module.  This also ensures loggers created within the module get\n\t * the module ID (or overridden filename) as their default logger name.\n\t * (Note capitalization: .filename matches Node.js while .fileName is\n\t * used elsewhere in Duktape.)\n\t */\n\tduk_push_string(ctx, \"\\n})\");  /* Newline allows module last line to contain a // comment. */\n\tduk_concat(ctx, 3);\n\tif (!duk_get_prop_string(ctx, DUK__IDX_MODULE, \"filename\")) {\n\t\t/* module.filename for .fileName, default to resolved ID if\n\t\t * not present.\n\t\t */\n\t\tduk_pop(ctx);\n\t\tduk_dup(ctx, DUK__IDX_RESOLVED_ID);\n\t}\n\tpcall_rc = duk_pcompile(ctx, DUK_COMPILE_EVAL);\n\tif (pcall_rc != DUK_EXEC_SUCCESS) {\n\t\tgoto delete_rethrow;\n\t}\n\tpcall_rc = duk_pcall(ctx, 0);  /* -> eval'd function wrapper (not called yet) */\n\tif (pcall_rc != DUK_EXEC_SUCCESS) {\n\t\tgoto delete_rethrow;\n\t}\n\n\t/* Module has now evaluated to a wrapped module function.  Force its\n\t * .name to match module.name (defaults to last component of resolved\n\t * ID) so that it is shown in stack traces too.  Note that we must not\n\t * introduce an actual name binding into the function scope (which is\n\t * usually the case with a named function) because it would affect the\n\t * scope seen by the module and shadow accesses to globals of the same name.\n\t * This is now done by compiling the function as anonymous and then forcing\n\t * its .name without setting a \"has name binding\" flag.\n\t */\n\n\tduk_push_string(ctx, \"name\");\n\tif (!duk_get_prop_string(ctx, DUK__IDX_MODULE, \"name\")) {\n\t\t/* module.name for .name, default to last component if\n\t\t * not present.\n\t\t */\n\t\tduk_pop(ctx);\n\t\tduk_dup(ctx, DUK__IDX_LASTCOMP);\n\t}\n\tduk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE);\n\n\t/*\n\t *  Call the wrapped module function.\n\t *\n\t *  Use a protected call so that we can update Duktape.modLoaded[resolved_id]\n\t *  even if the module throws an error.\n\t */\n\n\t/* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module mod_func ] */\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 2);\n\n\tduk_dup(ctx, DUK__IDX_EXPORTS);  /* exports (this binding) */\n\tduk_dup(ctx, DUK__IDX_FRESH_REQUIRE);  /* fresh require (argument) */\n\tduk_get_prop_string(ctx, DUK__IDX_MODULE, \"exports\");  /* relookup exports from module.exports in case it was changed by modSearch */\n\tduk_dup(ctx, DUK__IDX_MODULE);  /* module (argument) */\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 6);\n\n\t/* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module mod_func exports fresh_require exports module ] */\n\n\tpcall_rc = duk_pcall_method(ctx, 3 /*nargs*/);\n\tif (pcall_rc != DUK_EXEC_SUCCESS) {\n\t\t/* Module loading failed.  Node.js will forget the module\n\t\t * registration so that another require() will try to load\n\t\t * the module again.  Mimic that behavior.\n\t\t */\n\t\tgoto delete_rethrow;\n\t}\n\n\t/* [ requested_id require require.id resolved_id last_comp Duktape Duktape.modLoaded undefined fresh_require exports module result(ignored) ] */\n\tDUK__ASSERT_TOP(ctx, DUK__IDX_MODULE + 2);\n\n\t/* fall through */\n\n return_exports:\n\tduk_get_prop_string(ctx, DUK__IDX_MODULE, \"exports\");\n\tduk_compact(ctx, -1);  /* compact the exports table */\n\treturn 1;  /* return module.exports */\n\n delete_rethrow:\n\tduk_dup(ctx, DUK__IDX_RESOLVED_ID);\n\tduk_del_prop(ctx, DUK__IDX_MODLOADED);  /* delete Duktape.modLoaded[resolved_id] */\n\t(void) duk_throw(ctx);  /* rethrow original error */\n\treturn 0;  /* not reachable */\n}\n\nvoid duk_module_duktape_init(duk_context *ctx) {\n\t/* Stash 'Duktape' in case it's modified. */\n\tduk_push_global_stash(ctx);\n\tduk_get_global_string(ctx, \"Duktape\");\n\tduk_put_prop_string(ctx, -2, \"\\xff\" \"module:Duktape\");\n\tduk_pop(ctx);\n\n\t/* Register `require` as a global function. */\n\tduk_eval_string(ctx,\n\t\t\"(function(req){\"\n\t\t\"var D=Object.defineProperty;\"\n\t\t\"D(req,'name',{value:'require'});\"\n\t\t\"D(this,'require',{value:req,writable:true,configurable:true});\"\n\t\t\"D(Duktape,'modLoaded',{value:Object.create(null),writable:true,configurable:true});\"\n\t\t\"})\");\n\tduk_push_c_function(ctx, duk__require, 1 /*nargs*/);\n\tduk_call(ctx, 1);\n\tduk_pop(ctx);\n}\n\n#undef DUK__ASSERT\n#undef DUK__ASSERT_TOP\n#undef DUK__IDX_REQUESTED_ID\n#undef DUK__IDX_REQUIRE\n#undef DUK__IDX_REQUIRE_ID\n#undef DUK__IDX_RESOLVED_ID\n#undef DUK__IDX_LASTCOMP\n#undef DUK__IDX_DUKTAPE\n#undef DUK__IDX_MODLOADED\n#undef DUK__IDX_UNDEFINED\n#undef DUK__IDX_FRESH_REQUIRE\n#undef DUK__IDX_EXPORTS\n#undef DUK__IDX_MODULE\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_duktape.h",
    "content": "#if !defined(DUK_MODULE_DUKTAPE_H_INCLUDED)\n#define DUK_MODULE_DUKTAPE_H_INCLUDED\n\n#include \"duktape.h\"\n\n/* Maximum length of CommonJS module identifier to resolve.  Length includes\n * both current module ID, requested (possibly relative) module ID, and a\n * slash in between.\n */\n#define  DUK_COMMONJS_MODULE_ID_LIMIT  256\n\nextern void duk_module_duktape_init(duk_context *ctx);\n\n#endif  /* DUK_MODULE_DUKTAPE_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.c",
    "content": "/*\n *  Node.js-like module loading framework for Duktape\n *\n *  https://nodejs.org/api/modules.html\n */\n\n#include \"duktape.h\"\n#include \"duk_module_node.h\"\n\n#if DUK_VERSION >= 19999\nstatic duk_int_t duk__eval_module_source(duk_context *ctx, void *udata);\n#else\nstatic duk_int_t duk__eval_module_source(duk_context *ctx);\n#endif\nstatic void duk__push_module_object(duk_context *ctx, const char *id, duk_bool_t main);\n\nstatic duk_bool_t duk__get_cached_module(duk_context *ctx, const char *id) {\n\tduk_push_global_stash(ctx);\n\t(void) duk_get_prop_string(ctx, -1, \"\\xff\" \"requireCache\");\n\tif (duk_get_prop_string(ctx, -1, id)) {\n\t\tduk_remove(ctx, -2);\n\t\tduk_remove(ctx, -2);\n\t\treturn 1;\n\t} else {\n\t\tduk_pop_3(ctx);\n\t\treturn 0;\n\t}\n}\n\n/* Place a `module` object on the top of the value stack into the require cache\n * based on its `.id` property.  As a convenience to the caller, leave the\n * object on top of the value stack afterwards.\n */\nstatic void duk__put_cached_module(duk_context *ctx) {\n\t/* [ ... module ] */\n\n\tduk_push_global_stash(ctx);\n\t(void) duk_get_prop_string(ctx, -1, \"\\xff\" \"requireCache\");\n\tduk_dup(ctx, -3);\n\n\t/* [ ... module stash req_cache module ] */\n\n\t(void) duk_get_prop_string(ctx, -1, \"id\");\n\tduk_dup(ctx, -2);\n\tduk_put_prop(ctx, -4);\n\n\tduk_pop_3(ctx);  /* [ ... module ] */\n}\n\nstatic void duk__del_cached_module(duk_context *ctx, const char *id) {\n\tduk_push_global_stash(ctx);\n\t(void) duk_get_prop_string(ctx, -1, \"\\xff\" \"requireCache\");\n\tduk_del_prop_string(ctx, -1, id);\n\tduk_pop_2(ctx);\n}\n\nstatic duk_ret_t duk__handle_require(duk_context *ctx) {\n\t/*\n\t *  Value stack handling here is a bit sloppy but should be correct.\n\t *  Call handling will clean up any extra garbage for us.\n\t */\n\n\tconst char *id;\n\tconst char *parent_id;\n\tduk_idx_t module_idx;\n\tduk_idx_t stash_idx;\n\tduk_int_t ret;\n\n\tduk_push_global_stash(ctx);\n\tstash_idx = duk_normalize_index(ctx, -1);\n\n\tduk_push_current_function(ctx);\n\t(void) duk_get_prop_string(ctx, -1, \"\\xff\" \"moduleId\");\n\tparent_id = duk_require_string(ctx, -1);\n\t(void) parent_id;  /* not used directly; suppress warning */\n\n\t/* [ id stash require parent_id ] */\n\n\tid = duk_require_string(ctx, 0);\n\n\t(void) duk_get_prop_string(ctx, stash_idx, \"\\xff\" \"modResolve\");\n\tduk_dup(ctx, 0);   /* module ID */\n\tduk_dup(ctx, -3);  /* parent ID */\n\tduk_call(ctx, 2);\n\n\t/* [ ... stash ... resolved_id ] */\n\n\tid = duk_require_string(ctx, -1);\n\n\tif (duk__get_cached_module(ctx, id)) {\n\t\tgoto have_module;  /* use the cached module */\n\t}\n\n\tduk__push_module_object(ctx, id, 0 /*main*/);\n\tduk__put_cached_module(ctx);  /* module remains on stack */\n\n\t/*\n\t *  From here on out, we have to be careful not to throw.  If it can't be\n\t *  avoided, the error must be caught and the module removed from the\n\t *  require cache before rethrowing.  This allows the application to\n\t *  reattempt loading the module.\n\t */\n\n\tmodule_idx = duk_normalize_index(ctx, -1);\n\n\t/* [ ... stash ... resolved_id module ] */\n\n\t(void) duk_get_prop_string(ctx, stash_idx, \"\\xff\" \"modLoad\");\n\tduk_dup(ctx, -3);  /* resolved ID */\n\t(void) duk_get_prop_string(ctx, module_idx, \"exports\");\n\tduk_dup(ctx, module_idx);\n\tret = duk_pcall(ctx, 3);\n\tif (ret != DUK_EXEC_SUCCESS) {\n\t\tduk__del_cached_module(ctx, id);\n\t\t(void) duk_throw(ctx);  /* rethrow */\n\t}\n\n\tif (duk_is_string(ctx, -1)) {\n\t\tduk_int_t ret;\n\n\t\t/* [ ... module source ] */\n\n#if DUK_VERSION >= 19999\n\t\tret = duk_safe_call(ctx, duk__eval_module_source, NULL, 2, 1);\n#else\n\t\tret = duk_safe_call(ctx, duk__eval_module_source, 2, 1);\n#endif\n\t\tif (ret != DUK_EXEC_SUCCESS) {\n\t\t\tduk__del_cached_module(ctx, id);\n\t\t\t(void) duk_throw(ctx);  /* rethrow */\n\t\t}\n\t} else if (duk_is_undefined(ctx, -1)) {\n\t\tduk_pop(ctx);\n\t} else {\n\t\tduk__del_cached_module(ctx, id);\n\t\t(void) duk_type_error(ctx, \"invalid module load callback return value\");\n\t}\n\n\t/* fall through */\n\n have_module:\n\t/* [ ... module ] */\n\n\t(void) duk_get_prop_string(ctx, -1, \"exports\");\n\treturn 1;\n}\n\nstatic void duk__push_require_function(duk_context *ctx, const char *id) {\n\tduk_push_c_function(ctx, duk__handle_require, 1);\n\tduk_push_string(ctx, \"name\");\n\tduk_push_string(ctx, \"require\");\n\tduk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE);\n\tduk_push_string(ctx, id);\n\tduk_put_prop_string(ctx, -2, \"\\xff\" \"moduleId\");\n\n\t/* require.cache */\n\tduk_push_global_stash(ctx);\n\t(void) duk_get_prop_string(ctx, -1, \"\\xff\" \"requireCache\");\n\tduk_put_prop_string(ctx, -3, \"cache\");\n\tduk_pop(ctx);\n\n\t/* require.main */\n\tduk_push_global_stash(ctx);\n\t(void) duk_get_prop_string(ctx, -1, \"\\xff\" \"mainModule\");\n\tduk_put_prop_string(ctx, -3, \"main\");\n\tduk_pop(ctx);\n}\n\nstatic void duk__push_module_object(duk_context *ctx, const char *id, duk_bool_t main) {\n\tduk_push_object(ctx);\n\n\t/* Set this as the main module, if requested */\n\tif (main) {\n\t\tduk_push_global_stash(ctx);\n\t\tduk_dup(ctx, -2);\n\t\tduk_put_prop_string(ctx, -2, \"\\xff\" \"mainModule\");\n\t\tduk_pop(ctx);\n\t}\n\n\t/* Node.js uses the canonicalized filename of a module for both module.id\n\t * and module.filename.  We have no concept of a file system here, so just\n\t * use the module ID for both values.\n\t */\n\tduk_push_string(ctx, id);\n\tduk_dup(ctx, -1);\n\tduk_put_prop_string(ctx, -3, \"filename\");\n\tduk_put_prop_string(ctx, -2, \"id\");\n\n\t/* module.exports = {} */\n\tduk_push_object(ctx);\n\tduk_put_prop_string(ctx, -2, \"exports\");\n\n\t/* module.loaded = false */\n\tduk_push_false(ctx);\n\tduk_put_prop_string(ctx, -2, \"loaded\");\n\n\t/* module.require */\n\tduk__push_require_function(ctx, id);\n\tduk_put_prop_string(ctx, -2, \"require\");\n}\n\n#if DUK_VERSION >= 19999\nstatic duk_int_t duk__eval_module_source(duk_context *ctx, void *udata) {\n#else\nstatic duk_int_t duk__eval_module_source(duk_context *ctx) {\n#endif\n\tconst char *src;\n\n\t/*\n\t *  Stack: [ ... module source ]\n\t */\n\n#if DUK_VERSION >= 19999\n\t(void) udata;\n#endif\n\n\t/* Wrap the module code in a function expression.  This is the simplest\n\t * way to implement CommonJS closure semantics and matches the behavior of\n\t * e.g. Node.js.\n\t */\n\tduk_push_string(ctx, \"(function(exports,require,module,__filename,__dirname){\");\n\tsrc = duk_require_string(ctx, -2);\n\tduk_push_string(ctx, (src[0] == '#' && src[1] == '!') ? \"//\" : \"\");  /* Shebang support. */\n\tduk_dup(ctx, -3);  /* source */\n\tduk_push_string(ctx, \"\\n})\");  /* Newline allows module last line to contain a // comment. */\n\tduk_concat(ctx, 4);\n\n\t/* [ ... module source func_src ] */\n\n\t(void) duk_get_prop_string(ctx, -3, \"filename\");\n\tduk_compile(ctx, DUK_COMPILE_EVAL);\n\tduk_call(ctx, 0);\n\n\t/* [ ... module source func ] */\n\n\t/* Set name for the wrapper function. */\n\tduk_push_string(ctx, \"name\");\n\tduk_push_string(ctx, \"main\");\n\tduk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_FORCE);\n\n\t/* call the function wrapper */\n\t(void) duk_get_prop_string(ctx, -3, \"exports\");   /* exports */\n\t(void) duk_get_prop_string(ctx, -4, \"require\");   /* require */\n\tduk_dup(ctx, -5);                                 /* module */\n\t(void) duk_get_prop_string(ctx, -6, \"filename\");  /* __filename */\n\tduk_push_undefined(ctx);                          /* __dirname */\n\tduk_call(ctx, 5);\n\n\t/* [ ... module source result(ignore) ] */\n\n\t/* module.loaded = true */\n\tduk_push_true(ctx);\n\tduk_put_prop_string(ctx, -4, \"loaded\");\n\n\t/* [ ... module source retval ] */\n\n\tduk_pop_2(ctx);\n\n\t/* [ ... module ] */\n\n\treturn 1;\n}\n\n/* Load a module as the 'main' module. */\nduk_ret_t duk_module_node_peval_main(duk_context *ctx, const char *path) {\n\t/*\n\t *  Stack: [ ... source ]\n\t */\n\n\tduk__push_module_object(ctx, path, 1 /*main*/);\n\t/* [ ... source module ] */\n\n\tduk_dup(ctx, 0);\n\t/* [ ... source module source ] */\n\n#if DUK_VERSION >= 19999\n\treturn duk_safe_call(ctx, duk__eval_module_source, NULL, 2, 1);\n#else\n\treturn duk_safe_call(ctx, duk__eval_module_source, 2, 1);\n#endif\n}\n\nvoid duk_module_node_init(duk_context *ctx) {\n\t/*\n\t *  Stack: [ ... options ] => [ ... ]\n\t */\n\n\tduk_idx_t options_idx;\n\n\tduk_require_object_coercible(ctx, -1);  /* error before setting up requireCache */\n\toptions_idx = duk_require_normalize_index(ctx, -1);\n\n\t/* Initialize the require cache to a fresh object. */\n\tduk_push_global_stash(ctx);\n#if DUK_VERSION >= 19999\n\tduk_push_bare_object(ctx);\n#else\n\tduk_push_object(ctx);\n\tduk_push_undefined(ctx);\n\tduk_set_prototype(ctx, -2);\n#endif\n\tduk_put_prop_string(ctx, -2, \"\\xff\" \"requireCache\");\n\tduk_pop(ctx);\n\n\t/* Stash callbacks for later use.  User code can overwrite them later\n\t * on directly by accessing the global stash.\n\t */\n\tduk_push_global_stash(ctx);\n\tduk_get_prop_string(ctx, options_idx, \"resolve\");\n\tduk_require_function(ctx, -1);\n\tduk_put_prop_string(ctx, -2, \"\\xff\" \"modResolve\");\n\tduk_get_prop_string(ctx, options_idx, \"load\");\n\tduk_require_function(ctx, -1);\n\tduk_put_prop_string(ctx, -2, \"\\xff\" \"modLoad\");\n\tduk_pop(ctx);\n\n\t/* Stash main module. */\n\tduk_push_global_stash(ctx);\n\tduk_push_undefined(ctx);\n\tduk_put_prop_string(ctx, -2, \"\\xff\" \"mainModule\");\n\tduk_pop(ctx);\n\n\t/* register `require` as a global function. */\n\tduk_push_global_object(ctx);\n\tduk_push_string(ctx, \"require\");\n\tduk__push_require_function(ctx, \"\");\n\tduk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE |\n\t                      DUK_DEFPROP_SET_WRITABLE |\n\t                      DUK_DEFPROP_SET_CONFIGURABLE);\n\tduk_pop(ctx);\n\n\tduk_pop(ctx);  /* pop argument */\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_module_node.h",
    "content": "#if !defined(DUK_MODULE_NODE_H_INCLUDED)\n#define DUK_MODULE_NODE_H_INCLUDED\n\n#include \"duktape.h\"\n\nextern duk_ret_t duk_module_node_peval_main(duk_context *ctx, const char *path);\nextern void duk_module_node_init(duk_context *ctx);\n\n#endif  /* DUK_MODULE_NODE_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.c",
    "content": "/*\n *  Duktape 1.x compatible print() and alert() bindings.\n */\n\n#include <stdio.h>\n#include <string.h>\n#include \"duktape.h\"\n#include \"duk_print_alert.h\"\n\n#define DUK_PRINT_ALERT_FLUSH   /* Flush after stdout/stderr write (Duktape 1.x: yes) */\n#undef DUK_PRINT_ALERT_SMALL    /* Prefer smaller footprint (but slower and more memory churn) */\n\n#if defined(DUK_PRINT_ALERT_SMALL)\nstatic duk_ret_t duk__print_alert_helper(duk_context *ctx, FILE *fh) {\n\tduk_idx_t nargs;\n\n\tnargs = duk_get_top(ctx);\n\n\t/* If argument count is 1 and first argument is a buffer, write the buffer\n\t * as raw data into the file without a newline; this allows exact control\n\t * over stdout/stderr without an additional entrypoint (useful for now).\n\t * Otherwise current print/alert semantics are to ToString() coerce\n\t * arguments, join them with a single space, and append a newline.\n\t */\n\n\tif (nargs == 1 && duk_is_buffer(ctx, 0)) {\n\t\tbuf = (const duk_uint8_t *) duk_get_buffer(ctx, 0, &sz_buf);\n\t\tfwrite((const void *) buf, 1, (size_t) sz_buf, fh);\n\t} else {\n\t\tduk_push_string(ctx, \" \");\n\t\tduk_insert(ctx, 0);\n\t\tduk_concat(ctx, nargs);\n\t\tfprintf(fh, \"%s\\n\", duk_require_string(ctx, -1));\n\t}\n\n#if defined(DUK_PRINT_ALERT_FLUSH)\n\tfflush(fh);\n#endif\n\n\treturn 0;\n}\n#else\n/* Faster, less churn, higher footprint option. */\nstatic duk_ret_t duk__print_alert_helper(duk_context *ctx, FILE *fh) {\n\tduk_idx_t nargs;\n\tconst duk_uint8_t *buf;\n\tduk_size_t sz_buf;\n\tconst char nl = (const char) '\\n';\n\tduk_uint8_t buf_stack[256];\n\n\tnargs = duk_get_top(ctx);\n\n\t/* If argument count is 1 and first argument is a buffer, write the buffer\n\t * as raw data into the file without a newline; this allows exact control\n\t * over stdout/stderr without an additional entrypoint (useful for now).\n\t * Otherwise current print/alert semantics are to ToString() coerce\n\t * arguments, join them with a single space, and append a newline.\n\t */\n\n\tif (nargs == 1 && duk_is_buffer(ctx, 0)) {\n\t\tbuf = (const duk_uint8_t *) duk_get_buffer(ctx, 0, &sz_buf);\n\t} else if (nargs > 0) {\n\t\tduk_idx_t i;\n\t\tduk_size_t sz_str;\n\t\tconst duk_uint8_t *p_str;\n\t\tduk_uint8_t *p;\n\n\t\tsz_buf = (duk_size_t) nargs;  /* spaces (nargs - 1) + newline */\n\t\tfor (i = 0; i < nargs; i++) {\n\t\t\t(void) duk_to_lstring(ctx, i, &sz_str);\n\t\t\tsz_buf += sz_str;\n\t\t}\n\n\t\tif (sz_buf <= sizeof(buf_stack)) {\n\t\t\tp = (duk_uint8_t *) buf_stack;\n\t\t} else {\n\t\t\tp = (duk_uint8_t *) duk_push_fixed_buffer(ctx, sz_buf);\n\t\t}\n\n\t\tbuf = (const duk_uint8_t *) p;\n\t\tfor (i = 0; i < nargs; i++) {\n\t\t\tp_str = (const duk_uint8_t *) duk_get_lstring(ctx, i, &sz_str);\n\t\t\tmemcpy((void *) p, (const void *) p_str, sz_str);\n\t\t\tp += sz_str;\n\t\t\t*p++ = (duk_uint8_t) (i == nargs - 1 ? '\\n' : ' ');\n\t\t}\n\t} else {\n\t\tbuf = (const duk_uint8_t *) &nl;\n\t\tsz_buf = 1;\n\t}\n\n\t/* 'buf' contains the string to write, 'sz_buf' contains the length\n\t * (which may be zero).\n\t */\n\n\tif (sz_buf > 0) {\n\t\tfwrite((const void *) buf, 1, (size_t) sz_buf, fh);\n#if defined(DUK_PRINT_ALERT_FLUSH)\n\t\tfflush(fh);\n#endif\n\t}\n\n\treturn 0;\n}\n#endif\n\nstatic duk_ret_t duk__print(duk_context *ctx) {\n\treturn duk__print_alert_helper(ctx, stdout);\n}\n\nstatic duk_ret_t duk__alert(duk_context *ctx) {\n\treturn duk__print_alert_helper(ctx, stderr);\n}\n\nvoid duk_print_alert_init(duk_context *ctx, duk_uint_t flags) {\n\t(void) flags;  /* unused at the moment */\n\n\t/* XXX: use duk_def_prop_list(). */\n\tduk_push_global_object(ctx);\n\tduk_push_string(ctx, \"print\");\n\tduk_push_c_function(ctx, duk__print, DUK_VARARGS);\n\tduk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE);\n\tduk_push_string(ctx, \"alert\");\n\tduk_push_c_function(ctx, duk__alert, DUK_VARARGS);\n\tduk_def_prop(ctx, -3, DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE);\n\tduk_pop(ctx);\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_print_alert.h",
    "content": "#if !defined(DUK_PRINT_ALERT_H_INCLUDED)\n#define DUK_PRINT_ALERT_H_INCLUDED\n\n#include \"duktape.h\"\n\n/* No flags at the moment. */\n\nextern void duk_print_alert_init(duk_context *ctx, duk_uint_t flags);\n\n#endif /* DUK_PRINT_ALERT_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.c",
    "content": "#include <stdio.h>\n#include \"duktape.h\"\n#include \"duk_v1_compat.h\"\n\n/*\n *  duk_dump_context_{stdout,stderr}()\n */\n\nvoid duk_dump_context_stdout(duk_context *ctx) {\n\tduk_push_context_dump(ctx);\n\tfprintf(stdout, \"%s\\n\", duk_safe_to_string(ctx, -1));\n\tduk_pop(ctx);\n}\n\nvoid duk_dump_context_stderr(duk_context *ctx) {\n\tduk_push_context_dump(ctx);\n\tfprintf(stderr, \"%s\\n\", duk_safe_to_string(ctx, -1));\n\tduk_pop(ctx);\n}\n\n/*\n *  duk_push_string_file() and duk_push_string_file_raw()\n */\n\nconst char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags) {\n\tFILE *f = NULL;\n\tchar *buf;\n\tlong sz;  /* ANSI C typing */\n\n\tif (!path) {\n\t\tgoto fail;\n\t}\n\tf = fopen(path, \"rb\");\n\tif (!f) {\n\t\tgoto fail;\n\t}\n\tif (fseek(f, 0, SEEK_END) < 0) {\n\t\tgoto fail;\n\t}\n\tsz = ftell(f);\n\tif (sz < 0) {\n\t\tgoto fail;\n\t}\n\tif (fseek(f, 0, SEEK_SET) < 0) {\n\t\tgoto fail;\n\t}\n\tbuf = (char *) duk_push_fixed_buffer(ctx, (duk_size_t) sz);\n\tif ((size_t) fread(buf, 1, (size_t) sz, f) != (size_t) sz) {\n\t\tduk_pop(ctx);\n\t\tgoto fail;\n\t}\n\t(void) fclose(f);  /* ignore fclose() error */\n\treturn duk_buffer_to_string(ctx, -1);\n\n fail:\n\tif (f) {\n\t\t(void) fclose(f);  /* ignore fclose() error */\n\t}\n\n\tif (flags & DUK_STRING_PUSH_SAFE) {\n\t\tduk_push_undefined(ctx);\n\t} else {\n\t\t(void) duk_type_error(ctx, \"read file error\");\n\t}\n\treturn NULL;\n}\n\n/*\n *  duk_eval_file(), duk_compile_file(), and their variants\n */\n\nvoid duk_eval_file(duk_context *ctx, const char *path) {\n\tduk_push_string_file_raw(ctx, path, 0);\n\tduk_push_string(ctx, path);\n\tduk_compile(ctx, DUK_COMPILE_EVAL);\n\tduk_push_global_object(ctx);  /* 'this' binding */\n\tduk_call_method(ctx, 0);\n}\n\nvoid duk_eval_file_noresult(duk_context *ctx, const char *path) {\n\tduk_eval_file(ctx, path);\n\tduk_pop(ctx);\n}\n\nduk_int_t duk_peval_file(duk_context *ctx, const char *path) {\n\tduk_int_t rc;\n\n\tduk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE);\n\tduk_push_string(ctx, path);\n\trc = duk_pcompile(ctx, DUK_COMPILE_EVAL);\n\tif (rc != 0) {\n\t\treturn rc;\n\t}\n\tduk_push_global_object(ctx);  /* 'this' binding */\n\trc = duk_pcall_method(ctx, 0);\n\treturn rc;\n}\n\nduk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path) {\n\tduk_int_t rc;\n\n\trc = duk_peval_file(ctx, path);\n\tduk_pop(ctx);\n\treturn rc;\n}\n\nvoid duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path) {\n\tduk_push_string_file_raw(ctx, path, 0);\n\tduk_push_string(ctx, path);\n\tduk_compile(ctx, flags);\n}\n\nduk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path) {\n\tduk_int_t rc;\n\n\tduk_push_string_file_raw(ctx, path, DUK_STRING_PUSH_SAFE);\n\tduk_push_string(ctx, path);\n\trc = duk_pcompile(ctx, flags);\n\treturn rc;\n}\n\n/*\n *  duk_to_defaultvalue()\n */\n\nvoid duk_to_defaultvalue(duk_context *ctx, duk_idx_t idx, duk_int_t hint) {\n\tduk_require_type_mask(ctx, idx, DUK_TYPE_MASK_OBJECT |\n\t                                DUK_TYPE_MASK_BUFFER |\n\t                                DUK_TYPE_MASK_LIGHTFUNC);\n\tduk_to_primitive(ctx, idx, hint);\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duk_v1_compat.h",
    "content": "#if !defined(DUK_V1_COMPAT_INCLUDED)\n#define DUK_V1_COMPAT_INCLUDED\n\n#include \"duktape.h\"\n\n/* Straight flag rename */\n#if !defined(DUK_ENUM_INCLUDE_INTERNAL)\n#define DUK_ENUM_INCLUDE_INTERNAL DUK_ENUM_INCLUDE_HIDDEN\n#endif\n\n/* Flags for duk_push_string_file_raw() */\n#define DUK_STRING_PUSH_SAFE              (1 << 0)    /* no error if file does not exist */\n\nextern void duk_dump_context_stdout(duk_context *ctx);\nextern void duk_dump_context_stderr(duk_context *ctx);\nextern const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags);\nextern void duk_eval_file(duk_context *ctx, const char *path);\nextern void duk_eval_file_noresult(duk_context *ctx, const char *path);\nextern duk_int_t duk_peval_file(duk_context *ctx, const char *path);\nextern duk_int_t duk_peval_file_noresult(duk_context *ctx, const char *path);\nextern void duk_compile_file(duk_context *ctx, duk_uint_t flags, const char *path);\nextern duk_int_t duk_pcompile_file(duk_context *ctx, duk_uint_t flags, const char *path);\nextern void duk_to_defaultvalue(duk_context *ctx, duk_idx_t idx, duk_int_t hint);\n\n#define duk_push_string_file(ctx,path) \\\n\tduk_push_string_file_raw((ctx), (path), 0)\n\n#endif  /* DUK_V1_COMPAT_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duktape.c",
    "content": "/*\n *  Single source autogenerated distributable for Duktape 2.2.0.\n *\n *  Git commit a459cf3c9bd1779fc01b435d69302b742675a08f (v2.2.0).\n *  Git branch master.\n *\n *  See Duktape AUTHORS.rst and LICENSE.txt for copyright and\n *  licensing information.\n */\n\n/* LICENSE.txt */\n/*\n*  ===============\n*  Duktape license\n*  ===============\n*\n*  (http://opensource.org/licenses/MIT)\n*\n*  Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst)\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\n*  all 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\n*  THE SOFTWARE.\n*/\n\n/* AUTHORS.rst */\n/*\n*  ===============\n*  Duktape authors\n*  ===============\n*\n*  Copyright\n*  =========\n*\n*  Duktape copyrights are held by its authors.  Each author has a copyright\n*  to their contribution, and agrees to irrevocably license the contribution\n*  under the Duktape ``LICENSE.txt``.\n*\n*  Authors\n*  =======\n*\n*  Please include an e-mail address, a link to your GitHub profile, or something\n*  similar to allow your contribution to be identified accurately.\n*\n*  The following people have contributed code, website contents, or Wiki contents,\n*  and agreed to irrevocably license their contributions under the Duktape\n*  ``LICENSE.txt`` (in order of appearance):\n*\n*  * Sami Vaarala <sami.vaarala@iki.fi>\n*  * Niki Dobrev\n*  * Andreas \\u00d6man <andreas@lonelycoder.com>\n*  * L\\u00e1szl\\u00f3 Lang\\u00f3 <llango.u-szeged@partner.samsung.com>\n*  * Legimet <legimet.calc@gmail.com>\n*  * Karl Skomski <karl@skomski.com>\n*  * Bruce Pascoe <fatcerberus1@gmail.com>\n*  * Ren\\u00e9 Hollander <rene@rene8888.at>\n*  * Julien Hamaide (https://github.com/crazyjul)\n*  * Sebastian G\\u00f6tte (https://github.com/jaseg)\n*  * Tomasz Magulski (https://github.com/magul)\n*  * \\D. Bohdan (https://github.com/dbohdan)\n*  * Ond\\u0159ej Jirman (https://github.com/megous)\n*  * Sa\\u00fal Ibarra Corretg\\u00e9 <saghul@gmail.com>\n*  * Jeremy HU <huxingyi@msn.com>\n*  * Ole Andr\\u00e9 Vadla Ravn\\u00e5s (https://github.com/oleavr)\n*  * Harold Brenes (https://github.com/harold-b)\n*  * Oliver Crow (https://github.com/ocrow)\n*  * Jakub Ch\\u0142api\\u0144ski (https://github.com/jchlapinski)\n*  * Brett Vickers (https://github.com/beevik)\n*  * Dominik Okwieka (https://github.com/okitec)\n*  * Remko Tron\\u00e7on (https://el-tramo.be)\n*  * Romero Malaquias (rbsm@ic.ufal.br)\n*  * Michael Drake <michael.drake@codethink.co.uk>\n*  * Steven Don (https://github.com/shdon)\n*  * Simon Stone (https://github.com/sstone1)\n*  * \\J. McC. (https://github.com/jmhmccr)\n*\n*  Other contributions\n*  ===================\n*\n*  The following people have contributed something other than code (e.g. reported\n*  bugs, provided ideas, etc; roughly in order of appearance):\n*\n*  * Greg Burns\n*  * Anthony Rabine\n*  * Carlos Costa\n*  * Aur\\u00e9lien Bouilland\n*  * Preet Desai (Pris Matic)\n*  * judofyr (http://www.reddit.com/user/judofyr)\n*  * Jason Woofenden\n*  * Micha\\u0142 Przyby\\u015b\n*  * Anthony Howe\n*  * Conrad Pankoff\n*  * Jim Schimpf\n*  * Rajaran Gaunker (https://github.com/zimbabao)\n*  * Andreas \\u00d6man\n*  * Doug Sanden\n*  * Josh Engebretson (https://github.com/JoshEngebretson)\n*  * Remo Eichenberger (https://github.com/remoe)\n*  * Mamod Mehyar (https://github.com/mamod)\n*  * David Demelier (https://github.com/markand)\n*  * Tim Caswell (https://github.com/creationix)\n*  * Mitchell Blank Jr (https://github.com/mitchblank)\n*  * https://github.com/yushli\n*  * Seo Sanghyeon (https://github.com/sanxiyn)\n*  * Han ChoongWoo (https://github.com/tunz)\n*  * Joshua Peek (https://github.com/josh)\n*  * Bruce E. Pascoe (https://github.com/fatcerberus)\n*  * https://github.com/Kelledin\n*  * https://github.com/sstruchtrup\n*  * Michael Drake (https://github.com/tlsa)\n*  * https://github.com/chris-y\n*  * Laurent Zubiaur (https://github.com/lzubiaur)\n*  * Neil Kolban (https://github.com/nkolban)\n*\n*  If you are accidentally missing from this list, send me an e-mail\n*  (``sami.vaarala@iki.fi``) and I'll fix the omission.\n*/\n\n#line 1 \"duk_replacements.c\"\n/*\n *  Replacements for missing platform functions.\n *\n *  Unlike the originals, fpclassify() and signbit() replacements don't\n *  work on any floating point types, only doubles.  The C typing here\n *  mimics the standard prototypes.\n */\n\n/* #include duk_internal.h */\n#line 1 \"duk_internal.h\"\n/*\n *  Top-level include file to be used for all (internal) source files.\n *\n *  Source files should not include individual header files, as they\n *  have not been designed to be individually included.\n */\n\n#if !defined(DUK_INTERNAL_H_INCLUDED)\n#define DUK_INTERNAL_H_INCLUDED\n\n/*\n *  The 'duktape.h' header provides the public API, but also handles all\n *  compiler and platform specific feature detection, Duktape feature\n *  resolution, inclusion of system headers, etc.  These have been merged\n *  because the public API is also dependent on e.g. detecting appropriate\n *  C types which is quite platform/compiler specific especially for a non-C99\n *  build.  The public API is also dependent on the resolved feature set.\n *\n *  Some actions taken by the merged header (such as including system headers)\n *  are not appropriate for building a user application.  The define\n *  DUK_COMPILING_DUKTAPE allows the merged header to skip/include some\n *  sections depending on what is being built.\n */\n\n#define DUK_COMPILING_DUKTAPE\n#include \"duktape.h\"\n\n/*\n *  User declarations, e.g. prototypes for user functions used by Duktape\n *  macros.\n */\n\nDUK_USE_USER_DECLARE()\n\n/*\n *  Duktape includes (other than duk_features.h)\n *\n *  The header files expect to be included in an order which satisfies header\n *  dependencies correctly (the headers themselves don't include any other\n *  includes).  Forward declarations are used to break circular struct/typedef\n *  dependencies.\n */\n\n/* #include duk_dblunion.h */\n#line 1 \"duk_dblunion.h\"\n/*\n *  Union to access IEEE double memory representation, indexes for double\n *  memory representation, and some macros for double manipulation.\n *\n *  Also used by packed duk_tval.  Use a union for bit manipulation to\n *  minimize aliasing issues in practice.  The C99 standard does not\n *  guarantee that this should work, but it's a very widely supported\n *  practice for low level manipulation.\n *\n *  IEEE double format summary:\n *\n *    seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff\n *       A        B        C        D        E        F        G        H\n *\n *    s       sign bit\n *    eee...  exponent field\n *    fff...  fraction\n *\n *  See http://en.wikipedia.org/wiki/Double_precision_floating-point_format.\n *\n *  NaNs are represented as exponent 0x7ff and mantissa != 0.  The NaN is a\n *  signaling NaN when the highest bit of the mantissa is zero, and a quiet\n *  NaN when the highest bit is set.\n *\n *  At least three memory layouts are relevant here:\n *\n *    A B C D E F G H    Big endian (e.g. 68k)           DUK_USE_DOUBLE_BE\n *    H G F E D C B A    Little endian (e.g. x86)        DUK_USE_DOUBLE_LE\n *    D C B A H G F E    Mixed/cross endian (e.g. ARM)   DUK_USE_DOUBLE_ME\n *\n *  ARM is a special case: ARM double values are in mixed/cross endian\n *  format while ARM duk_uint64_t values are in standard little endian\n *  format (H G F E D C B A).  When a double is read as a duk_uint64_t\n *  from memory, the register will contain the (logical) value\n *  E F G H A B C D.  This requires some special handling below.\n *\n *  Indexes of various types (8-bit, 16-bit, 32-bit) in memory relative to\n *  the logical (big endian) order:\n *\n *  byte order      duk_uint8_t    duk_uint16_t     duk_uint32_t\n *    BE             01234567         0123               01\n *    LE             76543210         3210               10\n *    ME (ARM)       32107654         1032               01\n *\n *  Some processors may alter NaN values in a floating point load+store.\n *  For instance, on X86 a FLD + FSTP may convert a signaling NaN to a\n *  quiet one.  This is catastrophic when NaN space is used in packed\n *  duk_tval values.  See: misc/clang_aliasing.c.\n */\n\n#if !defined(DUK_DBLUNION_H_INCLUDED)\n#define DUK_DBLUNION_H_INCLUDED\n\n/*\n *  Union for accessing double parts, also serves as packed duk_tval\n */\n\nunion duk_double_union {\n\tdouble d;\n\tfloat f[2];\n#if defined(DUK_USE_64BIT_OPS)\n\tduk_uint64_t ull[1];\n#endif\n\tduk_uint32_t ui[2];\n\tduk_uint16_t us[4];\n\tduk_uint8_t uc[8];\n#if defined(DUK_USE_PACKED_TVAL)\n\tvoid *vp[2];  /* used by packed duk_tval, assumes sizeof(void *) == 4 */\n#endif\n};\n\ntypedef union duk_double_union duk_double_union;\n\n/*\n *  Indexes of various types with respect to big endian (logical) layout\n */\n\n#if defined(DUK_USE_DOUBLE_LE)\n#if defined(DUK_USE_64BIT_OPS)\n#define DUK_DBL_IDX_ULL0   0\n#endif\n#define DUK_DBL_IDX_UI0    1\n#define DUK_DBL_IDX_UI1    0\n#define DUK_DBL_IDX_US0    3\n#define DUK_DBL_IDX_US1    2\n#define DUK_DBL_IDX_US2    1\n#define DUK_DBL_IDX_US3    0\n#define DUK_DBL_IDX_UC0    7\n#define DUK_DBL_IDX_UC1    6\n#define DUK_DBL_IDX_UC2    5\n#define DUK_DBL_IDX_UC3    4\n#define DUK_DBL_IDX_UC4    3\n#define DUK_DBL_IDX_UC5    2\n#define DUK_DBL_IDX_UC6    1\n#define DUK_DBL_IDX_UC7    0\n#define DUK_DBL_IDX_VP0    DUK_DBL_IDX_UI0  /* packed tval */\n#define DUK_DBL_IDX_VP1    DUK_DBL_IDX_UI1  /* packed tval */\n#elif defined(DUK_USE_DOUBLE_BE)\n#if defined(DUK_USE_64BIT_OPS)\n#define DUK_DBL_IDX_ULL0   0\n#endif\n#define DUK_DBL_IDX_UI0    0\n#define DUK_DBL_IDX_UI1    1\n#define DUK_DBL_IDX_US0    0\n#define DUK_DBL_IDX_US1    1\n#define DUK_DBL_IDX_US2    2\n#define DUK_DBL_IDX_US3    3\n#define DUK_DBL_IDX_UC0    0\n#define DUK_DBL_IDX_UC1    1\n#define DUK_DBL_IDX_UC2    2\n#define DUK_DBL_IDX_UC3    3\n#define DUK_DBL_IDX_UC4    4\n#define DUK_DBL_IDX_UC5    5\n#define DUK_DBL_IDX_UC6    6\n#define DUK_DBL_IDX_UC7    7\n#define DUK_DBL_IDX_VP0    DUK_DBL_IDX_UI0  /* packed tval */\n#define DUK_DBL_IDX_VP1    DUK_DBL_IDX_UI1  /* packed tval */\n#elif defined(DUK_USE_DOUBLE_ME)\n#if defined(DUK_USE_64BIT_OPS)\n#define DUK_DBL_IDX_ULL0   0  /* not directly applicable, byte order differs from a double */\n#endif\n#define DUK_DBL_IDX_UI0    0\n#define DUK_DBL_IDX_UI1    1\n#define DUK_DBL_IDX_US0    1\n#define DUK_DBL_IDX_US1    0\n#define DUK_DBL_IDX_US2    3\n#define DUK_DBL_IDX_US3    2\n#define DUK_DBL_IDX_UC0    3\n#define DUK_DBL_IDX_UC1    2\n#define DUK_DBL_IDX_UC2    1\n#define DUK_DBL_IDX_UC3    0\n#define DUK_DBL_IDX_UC4    7\n#define DUK_DBL_IDX_UC5    6\n#define DUK_DBL_IDX_UC6    5\n#define DUK_DBL_IDX_UC7    4\n#define DUK_DBL_IDX_VP0    DUK_DBL_IDX_UI0  /* packed tval */\n#define DUK_DBL_IDX_VP1    DUK_DBL_IDX_UI1  /* packed tval */\n#else\n#error internal error\n#endif\n\n/*\n *  Helper macros for reading/writing memory representation parts, used\n *  by duk_numconv.c and duk_tval.h.\n */\n\n#define DUK_DBLUNION_SET_DOUBLE(u,v)  do {  \\\n\t\t(u)->d = (v); \\\n\t} while (0)\n\n#define DUK_DBLUNION_SET_HIGH32(u,v)  do {  \\\n\t\t(u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \\\n\t} while (0)\n\n#if defined(DUK_USE_64BIT_OPS)\n#if defined(DUK_USE_DOUBLE_ME)\n#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v)  do { \\\n\t\t(u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \\\n\t} while (0)\n#else\n#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v)  do { \\\n\t\t(u)->ull[DUK_DBL_IDX_ULL0] = ((duk_uint64_t) (v)) << 32; \\\n\t} while (0)\n#endif\n#else  /* DUK_USE_64BIT_OPS */\n#define DUK_DBLUNION_SET_HIGH32_ZERO_LOW32(u,v)  do { \\\n\t\t(u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) (v); \\\n\t\t(u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0; \\\n\t} while (0)\n#endif  /* DUK_USE_64BIT_OPS */\n\n#define DUK_DBLUNION_SET_LOW32(u,v)  do {  \\\n\t\t(u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \\\n\t} while (0)\n\n#define DUK_DBLUNION_GET_DOUBLE(u)  ((u)->d)\n#define DUK_DBLUNION_GET_HIGH32(u)  ((u)->ui[DUK_DBL_IDX_UI0])\n#define DUK_DBLUNION_GET_LOW32(u)   ((u)->ui[DUK_DBL_IDX_UI1])\n\n#if defined(DUK_USE_64BIT_OPS)\n#if defined(DUK_USE_DOUBLE_ME)\n#define DUK_DBLUNION_SET_UINT64(u,v)  do { \\\n\t\t(u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) ((v) >> 32); \\\n\t\t(u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (v); \\\n\t} while (0)\n#define DUK_DBLUNION_GET_UINT64(u) \\\n\t((((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI0]) << 32) | \\\n\t ((duk_uint64_t) (u)->ui[DUK_DBL_IDX_UI1]))\n#else\n#define DUK_DBLUNION_SET_UINT64(u,v)  do { \\\n\t\t(u)->ull[DUK_DBL_IDX_ULL0] = (duk_uint64_t) (v); \\\n\t} while (0)\n#define DUK_DBLUNION_GET_UINT64(u)  ((u)->ull[DUK_DBL_IDX_ULL0])\n#endif\n#define DUK_DBLUNION_SET_INT64(u,v) DUK_DBLUNION_SET_UINT64((u), (duk_uint64_t) (v))\n#define DUK_DBLUNION_GET_INT64(u)   ((duk_int64_t) DUK_DBLUNION_GET_UINT64((u)))\n#endif  /* DUK_USE_64BIT_OPS */\n\n/*\n *  Double NaN manipulation macros related to NaN normalization needed when\n *  using the packed duk_tval representation.  NaN normalization is necessary\n *  to keep double values compatible with the duk_tval format.\n *\n *  When packed duk_tval is used, the NaN space is used to store pointers\n *  and other tagged values in addition to NaNs.  Actual NaNs are normalized\n *  to a specific quiet NaN.  The macros below are used by the implementation\n *  to check and normalize NaN values when they might be created.  The macros\n *  are essentially NOPs when the non-packed duk_tval representation is used.\n *\n *  A FULL check is exact and checks all bits.  A NOTFULL check is used by\n *  the packed duk_tval and works correctly for all NaNs except those that\n *  begin with 0x7ff0.  Since the 'normalized NaN' values used with packed\n *  duk_tval begin with 0x7ff8, the partial check is reliable when packed\n *  duk_tval is used.  The 0x7ff8 prefix means the normalized NaN will be a\n *  quiet NaN regardless of its remaining lower bits.\n *\n *  The ME variant below is specifically for ARM byte order, which has the\n *  feature that while doubles have a mixed byte order (32107654), unsigned\n *  long long values has a little endian byte order (76543210).  When writing\n *  a logical double value through a ULL pointer, the 32-bit words need to be\n *  swapped; hence the #if defined()s below for ULL writes with DUK_USE_DOUBLE_ME.\n *  This is not full ARM support but suffices for some environments.\n */\n\n#if defined(DUK_USE_64BIT_OPS)\n#if defined(DUK_USE_DOUBLE_ME)\n/* Macros for 64-bit ops + mixed endian doubles. */\n#define DUK__DBLUNION_SET_NAN_FULL(u)  do { \\\n\t\t(u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x000000007ff80000); \\\n\t} while (0)\n#define DUK__DBLUNION_IS_NAN_FULL(u) \\\n\t((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000)) && \\\n\t ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0xffffffff000fffff)) != 0))\n#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff80000))\n#define DUK__DBLUNION_IS_ANYINF(u) \\\n\t(((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x000000007ff00000))\n#define DUK__DBLUNION_IS_POSINF(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x000000007ff00000))\n#define DUK__DBLUNION_IS_NEGINF(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x00000000fff00000))\n#define DUK__DBLUNION_IS_ANYZERO(u) \\\n\t(((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0xffffffff7fffffff)) == DUK_U64_CONSTANT(0x0000000000000000))\n#define DUK__DBLUNION_IS_POSZERO(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000))\n#define DUK__DBLUNION_IS_NEGZERO(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000080000000))\n#else\n/* Macros for 64-bit ops + big/little endian doubles. */\n#define DUK__DBLUNION_SET_NAN_FULL(u)  do { \\\n\t\t(u)->ull[DUK_DBL_IDX_ULL0] = DUK_U64_CONSTANT(0x7ff8000000000000); \\\n\t} while (0)\n#define DUK__DBLUNION_IS_NAN_FULL(u) \\\n\t((((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000)) && \\\n\t ((((u)->ull[DUK_DBL_IDX_ULL0]) & DUK_U64_CONSTANT(0x000fffffffffffff)) != 0))\n#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff8000000000000))\n#define DUK__DBLUNION_IS_ANYINF(u) \\\n\t(((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x7ff0000000000000))\n#define DUK__DBLUNION_IS_POSINF(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x7ff0000000000000))\n#define DUK__DBLUNION_IS_NEGINF(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0xfff0000000000000))\n#define DUK__DBLUNION_IS_ANYZERO(u) \\\n\t(((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7fffffffffffffff)) == DUK_U64_CONSTANT(0x0000000000000000))\n#define DUK__DBLUNION_IS_POSZERO(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x0000000000000000))\n#define DUK__DBLUNION_IS_NEGZERO(u) \\\n\t((u)->ull[DUK_DBL_IDX_ULL0] == DUK_U64_CONSTANT(0x8000000000000000))\n#endif\n#else  /* DUK_USE_64BIT_OPS */\n/* Macros for no 64-bit ops, any endianness. */\n#define DUK__DBLUNION_SET_NAN_FULL(u)  do { \\\n\t\t(u)->ui[DUK_DBL_IDX_UI0] = (duk_uint32_t) 0x7ff80000UL; \\\n\t\t(u)->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) 0x00000000UL; \\\n\t} while (0)\n#define DUK__DBLUNION_IS_NAN_FULL(u) \\\n\t((((u)->ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL) && \\\n\t (((u)->ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) != 0 || \\\n          (u)->ui[DUK_DBL_IDX_UI1] != 0))\n#define DUK__DBLUNION_IS_NORMALIZED_NAN_FULL(u) \\\n\t(((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff80000UL) && \\\n\t ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))\n#define DUK__DBLUNION_IS_ANYINF(u) \\\n\t((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x7ff00000UL) && \\\n\t ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))\n#define DUK__DBLUNION_IS_POSINF(u) \\\n\t(((u)->ui[DUK_DBL_IDX_UI0] == 0x7ff00000UL) && \\\n\t ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))\n#define DUK__DBLUNION_IS_NEGINF(u) \\\n\t(((u)->ui[DUK_DBL_IDX_UI0] == 0xfff00000UL) && \\\n\t ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))\n#define DUK__DBLUNION_IS_ANYZERO(u) \\\n\t((((u)->ui[DUK_DBL_IDX_UI0] & 0x7fffffffUL) == 0x00000000UL) && \\\n\t ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))\n#define DUK__DBLUNION_IS_POSZERO(u) \\\n\t(((u)->ui[DUK_DBL_IDX_UI0] == 0x00000000UL) && \\\n\t ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))\n#define DUK__DBLUNION_IS_NEGZERO(u) \\\n\t(((u)->ui[DUK_DBL_IDX_UI0] == 0x80000000UL) && \\\n\t ((u)->ui[DUK_DBL_IDX_UI1] == 0x00000000UL))\n#endif  /* DUK_USE_64BIT_OPS */\n\n#define DUK__DBLUNION_SET_NAN_NOTFULL(u)  do { \\\n\t\t(u)->us[DUK_DBL_IDX_US0] = 0x7ff8UL; \\\n\t} while (0)\n\n#define DUK__DBLUNION_IS_NAN_NOTFULL(u) \\\n\t/* E == 0x7ff, topmost four bits of F != 0 => assume NaN */ \\\n\t((((u)->us[DUK_DBL_IDX_US0] & 0x7ff0UL) == 0x7ff0UL) && \\\n\t (((u)->us[DUK_DBL_IDX_US0] & 0x000fUL) != 0x0000UL))\n\n#define DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL(u) \\\n\t/* E == 0x7ff, F == 8 => normalized NaN */ \\\n\t((u)->us[DUK_DBL_IDX_US0] == 0x7ff8UL)\n\n#define DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL(u)  do { \\\n\t\tif (DUK__DBLUNION_IS_NAN_FULL((u))) { \\\n\t\t\tDUK__DBLUNION_SET_NAN_FULL((u)); \\\n\t\t} \\\n\t} while (0)\n\n#define DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL(u)  do { \\\n\t\tif (DUK__DBLUNION_IS_NAN_NOTFULL((u))) { \\\n\t\t\tDUK__DBLUNION_SET_NAN_NOTFULL((u)); \\\n\t\t} \\\n\t} while (0)\n\n/* Concrete macros for NaN handling used by the implementation internals.\n * Chosen so that they match the duk_tval representation: with a packed\n * duk_tval, ensure NaNs are properly normalized; with a non-packed duk_tval\n * these are essentially NOPs.\n */\n\n#if defined(DUK_USE_PACKED_TVAL)\n#if defined(DUK_USE_FULL_TVAL)\n#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u)  DUK__DBLUNION_NORMALIZE_NAN_CHECK_FULL((u))\n#define DUK_DBLUNION_IS_NAN(u)               DUK__DBLUNION_IS_NAN_FULL((u))\n#define DUK_DBLUNION_IS_NORMALIZED_NAN(u)    DUK__DBLUNION_IS_NORMALIZED_NAN_FULL((u))\n#define DUK_DBLUNION_SET_NAN(d)              DUK__DBLUNION_SET_NAN_FULL((d))\n#else\n#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u)  DUK__DBLUNION_NORMALIZE_NAN_CHECK_NOTFULL((u))\n#define DUK_DBLUNION_IS_NAN(u)               DUK__DBLUNION_IS_NAN_NOTFULL((u))\n#define DUK_DBLUNION_IS_NORMALIZED_NAN(u)    DUK__DBLUNION_IS_NORMALIZED_NAN_NOTFULL((u))\n#define DUK_DBLUNION_SET_NAN(d)              DUK__DBLUNION_SET_NAN_NOTFULL((d))\n#endif\n#define DUK_DBLUNION_IS_NORMALIZED(u) \\\n\t(!DUK_DBLUNION_IS_NAN((u)) ||  /* either not a NaN */ \\\n\t DUK_DBLUNION_IS_NORMALIZED_NAN((u)))  /* or is a normalized NaN */\n#else  /* DUK_USE_PACKED_TVAL */\n#define DUK_DBLUNION_NORMALIZE_NAN_CHECK(u)  /* nop: no need to normalize */\n#define DUK_DBLUNION_IS_NAN(u)               DUK__DBLUNION_IS_NAN_FULL((u))  /* (DUK_ISNAN((u)->d)) */\n#define DUK_DBLUNION_IS_NORMALIZED_NAN(u)    DUK__DBLUNION_IS_NAN_FULL((u))  /* (DUK_ISNAN((u)->d)) */\n#define DUK_DBLUNION_IS_NORMALIZED(u)        1  /* all doubles are considered normalized */\n#define DUK_DBLUNION_SET_NAN(u)  do { \\\n\t\t/* in non-packed representation we don't care about which NaN is used */ \\\n\t\t(u)->d = DUK_DOUBLE_NAN; \\\n\t} while (0)\n#endif  /* DUK_USE_PACKED_TVAL */\n\n#define DUK_DBLUNION_IS_ANYINF(u) DUK__DBLUNION_IS_ANYINF((u))\n#define DUK_DBLUNION_IS_POSINF(u) DUK__DBLUNION_IS_POSINF((u))\n#define DUK_DBLUNION_IS_NEGINF(u) DUK__DBLUNION_IS_NEGINF((u))\n\n#define DUK_DBLUNION_IS_ANYZERO(u) DUK__DBLUNION_IS_ANYZERO((u))\n#define DUK_DBLUNION_IS_POSZERO(u) DUK__DBLUNION_IS_POSZERO((u))\n#define DUK_DBLUNION_IS_NEGZERO(u) DUK__DBLUNION_IS_NEGZERO((u))\n\n/* XXX: native 64-bit byteswaps when available */\n\n/* 64-bit byteswap, same operation independent of target endianness. */\n#define DUK_DBLUNION_BSWAP64(u) do { \\\n\t\tduk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \\\n\t\tduk__bswaptmp1 = (u)->ui[0]; \\\n\t\tduk__bswaptmp2 = (u)->ui[1]; \\\n\t\tduk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \\\n\t\tduk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \\\n\t\t(u)->ui[0] = duk__bswaptmp2; \\\n\t\t(u)->ui[1] = duk__bswaptmp1; \\\n\t} while (0)\n\n/* Byteswap an IEEE double in the duk_double_union from host to network\n * order.  For a big endian target this is a no-op.\n */\n#if defined(DUK_USE_DOUBLE_LE)\n#define DUK_DBLUNION_DOUBLE_HTON(u) do { \\\n\t\tduk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \\\n\t\tduk__bswaptmp1 = (u)->ui[0]; \\\n\t\tduk__bswaptmp2 = (u)->ui[1]; \\\n\t\tduk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \\\n\t\tduk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \\\n\t\t(u)->ui[0] = duk__bswaptmp2; \\\n\t\t(u)->ui[1] = duk__bswaptmp1; \\\n\t} while (0)\n#elif defined(DUK_USE_DOUBLE_ME)\n#define DUK_DBLUNION_DOUBLE_HTON(u) do { \\\n\t\tduk_uint32_t duk__bswaptmp1, duk__bswaptmp2; \\\n\t\tduk__bswaptmp1 = (u)->ui[0]; \\\n\t\tduk__bswaptmp2 = (u)->ui[1]; \\\n\t\tduk__bswaptmp1 = DUK_BSWAP32(duk__bswaptmp1); \\\n\t\tduk__bswaptmp2 = DUK_BSWAP32(duk__bswaptmp2); \\\n\t\t(u)->ui[0] = duk__bswaptmp1; \\\n\t\t(u)->ui[1] = duk__bswaptmp2; \\\n\t} while (0)\n#elif defined(DUK_USE_DOUBLE_BE)\n#define DUK_DBLUNION_DOUBLE_HTON(u) do { } while (0)\n#else\n#error internal error, double endianness insane\n#endif\n\n/* Reverse operation is the same. */\n#define DUK_DBLUNION_DOUBLE_NTOH(u) DUK_DBLUNION_DOUBLE_HTON((u))\n\n/* Some sign bit helpers. */\n#if defined(DUK_USE_64BIT_OPS)\n#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000)) != 0)\n#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ull[DUK_DBL_IDX_ULL0] >> 63U))\n#else\n#define DUK_DBLUNION_HAS_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] & 0x80000000UL) != 0)\n#define DUK_DBLUNION_GET_SIGNBIT(u) (((u)->ui[DUK_DBL_IDX_UI0] >> 31U))\n#endif\n\n#endif  /* DUK_DBLUNION_H_INCLUDED */\n/* #include duk_replacements.h */\n#line 1 \"duk_replacements.h\"\n#if !defined(DUK_REPLACEMENTS_H_INCLUDED)\n#define DUK_REPLACEMENTS_H_INCLUDED\n\n#if !defined(DUK_SINGLE_FILE)\n#if defined(DUK_USE_COMPUTED_INFINITY)\nDUK_INTERNAL_DECL double duk_computed_infinity;\n#endif\n#if defined(DUK_USE_COMPUTED_NAN)\nDUK_INTERNAL_DECL double duk_computed_nan;\n#endif\n#endif  /* !DUK_SINGLE_FILE */\n\n#if defined(DUK_USE_REPL_FPCLASSIFY)\nDUK_INTERNAL_DECL int duk_repl_fpclassify(double x);\n#endif\n#if defined(DUK_USE_REPL_SIGNBIT)\nDUK_INTERNAL_DECL int duk_repl_signbit(double x);\n#endif\n#if defined(DUK_USE_REPL_ISFINITE)\nDUK_INTERNAL_DECL int duk_repl_isfinite(double x);\n#endif\n#if defined(DUK_USE_REPL_ISNAN)\nDUK_INTERNAL_DECL int duk_repl_isnan(double x);\n#endif\n#if defined(DUK_USE_REPL_ISINF)\nDUK_INTERNAL_DECL int duk_repl_isinf(double x);\n#endif\n\n#endif  /* DUK_REPLACEMENTS_H_INCLUDED */\n/* #include duk_jmpbuf.h */\n#line 1 \"duk_jmpbuf.h\"\n/*\n *  Wrapper for jmp_buf.\n *\n *  This is used because jmp_buf is an array type for backward compatibility.\n *  Wrapping jmp_buf in a struct makes pointer references, sizeof, etc,\n *  behave more intuitively.\n *\n *  http://en.wikipedia.org/wiki/Setjmp.h#Member_types\n */\n\n#if !defined(DUK_JMPBUF_H_INCLUDED)\n#define DUK_JMPBUF_H_INCLUDED\n\n#if defined(DUK_USE_CPP_EXCEPTIONS)\nstruct duk_jmpbuf {\n\tduk_small_int_t dummy;  /* unused */\n};\n#else\nstruct duk_jmpbuf {\n\tDUK_JMPBUF_TYPE jb;\n};\n#endif\n\n#endif  /* DUK_JMPBUF_H_INCLUDED */\n/* #include duk_exception.h */\n#line 1 \"duk_exception.h\"\n/*\n *  Exception for Duktape internal throws when C++ exceptions are used\n *  for long control transfers.\n *\n *  Doesn't inherit from any exception base class to minimize the chance\n *  that user code would accidentally catch this exception.\n */\n\n#if !defined(DUK_EXCEPTION_H_INCLUDED)\n#define DUK_EXCEPTION_H_INCLUDED\n\n#if defined(DUK_USE_CPP_EXCEPTIONS)\nclass duk_internal_exception {\n\t/* intentionally empty */\n};\n#endif\n\n#endif  /* DUK_EXCEPTION_H_INCLUDED */\n/* #include duk_forwdecl.h */\n#line 1 \"duk_forwdecl.h\"\n/*\n *  Forward declarations for all Duktape structures.\n */\n\n#if !defined(DUK_FORWDECL_H_INCLUDED)\n#define DUK_FORWDECL_H_INCLUDED\n\n/*\n *  Forward declarations\n */\n\n#if defined(DUK_USE_CPP_EXCEPTIONS)\nclass duk_internal_exception;\n#else\nstruct duk_jmpbuf;\n#endif\n\n/* duk_tval intentionally skipped */\nstruct duk_heaphdr;\nstruct duk_heaphdr_string;\nstruct duk_harray;\nstruct duk_hstring;\nstruct duk_hstring_external;\nstruct duk_hobject;\nstruct duk_hcompfunc;\nstruct duk_hnatfunc;\nstruct duk_hboundfunc;\nstruct duk_hthread;\nstruct duk_hbufobj;\nstruct duk_hdecenv;\nstruct duk_hobjenv;\nstruct duk_hproxy;\nstruct duk_hbuffer;\nstruct duk_hbuffer_fixed;\nstruct duk_hbuffer_dynamic;\nstruct duk_hbuffer_external;\n\nstruct duk_propaccessor;\nunion duk_propvalue;\nstruct duk_propdesc;\n\nstruct duk_heap;\nstruct duk_breakpoint;\n\nstruct duk_activation;\nstruct duk_catcher;\nstruct duk_strcache;\nstruct duk_ljstate;\nstruct duk_strtab_entry;\n\n#if defined(DUK_USE_DEBUG)\nstruct duk_fixedbuffer;\n#endif\n\nstruct duk_bitdecoder_ctx;\nstruct duk_bitencoder_ctx;\nstruct duk_bufwriter_ctx;\n\nstruct duk_token;\nstruct duk_re_token;\nstruct duk_lexer_point;\nstruct duk_lexer_ctx;\nstruct duk_lexer_codepoint;\n\nstruct duk_compiler_instr;\nstruct duk_compiler_func;\nstruct duk_compiler_ctx;\n\nstruct duk_re_matcher_ctx;\nstruct duk_re_compiler_ctx;\n\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n/* no typedef */\n#else\ntypedef struct duk_jmpbuf duk_jmpbuf;\n#endif\n\n/* duk_tval intentionally skipped */\ntypedef struct duk_heaphdr duk_heaphdr;\ntypedef struct duk_heaphdr_string duk_heaphdr_string;\ntypedef struct duk_harray duk_harray;\ntypedef struct duk_hstring duk_hstring;\ntypedef struct duk_hstring_external duk_hstring_external;\ntypedef struct duk_hobject duk_hobject;\ntypedef struct duk_hcompfunc duk_hcompfunc;\ntypedef struct duk_hnatfunc duk_hnatfunc;\ntypedef struct duk_hboundfunc duk_hboundfunc;\ntypedef struct duk_hthread duk_hthread;\ntypedef struct duk_hbufobj duk_hbufobj;\ntypedef struct duk_hdecenv duk_hdecenv;\ntypedef struct duk_hobjenv duk_hobjenv;\ntypedef struct duk_hproxy duk_hproxy;\ntypedef struct duk_hbuffer duk_hbuffer;\ntypedef struct duk_hbuffer_fixed duk_hbuffer_fixed;\ntypedef struct duk_hbuffer_dynamic duk_hbuffer_dynamic;\ntypedef struct duk_hbuffer_external duk_hbuffer_external;\n\ntypedef struct duk_propaccessor duk_propaccessor;\ntypedef union duk_propvalue duk_propvalue;\ntypedef struct duk_propdesc duk_propdesc;\n\ntypedef struct duk_heap duk_heap;\ntypedef struct duk_breakpoint duk_breakpoint;\n\ntypedef struct duk_activation duk_activation;\ntypedef struct duk_catcher duk_catcher;\ntypedef struct duk_strcache duk_strcache;\ntypedef struct duk_ljstate duk_ljstate;\ntypedef struct duk_strtab_entry duk_strtab_entry;\n\n#if defined(DUK_USE_DEBUG)\ntypedef struct duk_fixedbuffer duk_fixedbuffer;\n#endif\n\ntypedef struct duk_bitdecoder_ctx duk_bitdecoder_ctx;\ntypedef struct duk_bitencoder_ctx duk_bitencoder_ctx;\ntypedef struct duk_bufwriter_ctx duk_bufwriter_ctx;\n\ntypedef struct duk_token duk_token;\ntypedef struct duk_re_token duk_re_token;\ntypedef struct duk_lexer_point duk_lexer_point;\ntypedef struct duk_lexer_ctx duk_lexer_ctx;\ntypedef struct duk_lexer_codepoint duk_lexer_codepoint;\n\ntypedef struct duk_compiler_instr duk_compiler_instr;\ntypedef struct duk_compiler_func duk_compiler_func;\ntypedef struct duk_compiler_ctx duk_compiler_ctx;\n\ntypedef struct duk_re_matcher_ctx duk_re_matcher_ctx;\ntypedef struct duk_re_compiler_ctx duk_re_compiler_ctx;\n\n#endif  /* DUK_FORWDECL_H_INCLUDED */\n/* #include duk_tval.h */\n#line 1 \"duk_tval.h\"\n/*\n *  Tagged type definition (duk_tval) and accessor macros.\n *\n *  Access all fields through the accessor macros, as the representation\n *  is quite tricky.\n *\n *  There are two packed type alternatives: an 8-byte representation\n *  based on an IEEE double (preferred for compactness), and a 12-byte\n *  representation (portability).  The latter is needed also in e.g.\n *  64-bit environments (it usually pads to 16 bytes per value).\n *\n *  Selecting the tagged type format involves many trade-offs (memory\n *  use, size and performance of generated code, portability, etc).\n *\n *  NB: because macro arguments are often expressions, macros should\n *  avoid evaluating their argument more than once.\n */\n\n#if !defined(DUK_TVAL_H_INCLUDED)\n#define DUK_TVAL_H_INCLUDED\n\n/* sanity */\n#if !defined(DUK_USE_DOUBLE_LE) && !defined(DUK_USE_DOUBLE_ME) && !defined(DUK_USE_DOUBLE_BE)\n#error unsupported: cannot determine byte order variant\n#endif\n\n#if defined(DUK_USE_PACKED_TVAL)\n/* ======================================================================== */\n\n/*\n *  Packed 8-byte representation\n */\n\n/* use duk_double_union as duk_tval directly */\ntypedef union duk_double_union duk_tval;\ntypedef struct {\n\tduk_uint16_t a;\n\tduk_uint16_t b;\n\tduk_uint16_t c;\n\tduk_uint16_t d;\n} duk_tval_unused;\n\n/* tags */\n#define DUK_TAG_NORMALIZED_NAN    0x7ff8UL   /* the NaN variant we use */\n/* avoid tag 0xfff0, no risk of confusion with negative infinity */\n#define DUK_TAG_MIN               0xfff1UL\n#if defined(DUK_USE_FASTINT)\n#define DUK_TAG_FASTINT           0xfff1UL   /* embed: integer value */\n#endif\n#define DUK_TAG_UNUSED            0xfff2UL   /* marker; not actual tagged value */\n#define DUK_TAG_UNDEFINED         0xfff3UL   /* embed: nothing */\n#define DUK_TAG_NULL              0xfff4UL   /* embed: nothing */\n#define DUK_TAG_BOOLEAN           0xfff5UL   /* embed: 0 or 1 (false or true) */\n/* DUK_TAG_NUMBER would logically go here, but it has multiple 'tags' */\n#define DUK_TAG_POINTER           0xfff6UL   /* embed: void ptr */\n#define DUK_TAG_LIGHTFUNC         0xfff7UL   /* embed: func ptr */\n#define DUK_TAG_STRING            0xfff8UL   /* embed: duk_hstring ptr */\n#define DUK_TAG_OBJECT            0xfff9UL   /* embed: duk_hobject ptr */\n#define DUK_TAG_BUFFER            0xfffaUL   /* embed: duk_hbuffer ptr */\n#define DUK_TAG_MAX               0xfffaUL\n\n/* for convenience */\n#define DUK_XTAG_BOOLEAN_FALSE    0xfff50000UL\n#define DUK_XTAG_BOOLEAN_TRUE     0xfff50001UL\n\n#define DUK_TVAL_IS_VALID_TAG(tv) \\\n\t(DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN)\n\n/* DUK_TVAL_UNUSED initializer for duk_tval_unused, works for any endianness. */\n#define DUK_TVAL_UNUSED_INITIALIZER() \\\n\t{ DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED, DUK_TAG_UNUSED }\n\n/* two casts to avoid gcc warning: \"warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]\" */\n#if defined(DUK_USE_64BIT_OPS)\n#if defined(DUK_USE_DOUBLE_ME)\n#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag)  do { \\\n\t\t(tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 16) | (((duk_uint64_t) (duk_uint32_t) (h)) << 32); \\\n\t} while (0)\n#else\n#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag)  do { \\\n\t\t(tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) (tag)) << 48) | ((duk_uint64_t) (duk_uint32_t) (h)); \\\n\t} while (0)\n#endif\n#else  /* DUK_USE_64BIT_OPS */\n#define DUK__TVAL_SET_TAGGEDPOINTER(tv,h,tag)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) (tag)) << 16; \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (h); \\\n\t} while (0)\n#endif  /* DUK_USE_64BIT_OPS */\n\n#if defined(DUK_USE_64BIT_OPS)\n/* Double casting for pointer to avoid gcc warning (cast from pointer to integer of different size) */\n#if defined(DUK_USE_DOUBLE_ME)\n#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags)  do { \\\n\t\t(tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 16) | \\\n\t\t                              ((duk_uint64_t) (flags)) | \\\n\t\t                              (((duk_uint64_t) (duk_uint32_t) (fp)) << 32); \\\n\t} while (0)\n#else\n#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags)  do { \\\n\t\t(tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_LIGHTFUNC) << 48) | \\\n\t\t                              (((duk_uint64_t) (flags)) << 32) | \\\n\t\t                              ((duk_uint64_t) (duk_uint32_t) (fp)); \\\n\t} while (0)\n#endif\n#else  /* DUK_USE_64BIT_OPS */\n#define DUK__TVAL_SET_LIGHTFUNC(tv,fp,flags)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI0] = (((duk_uint32_t) DUK_TAG_LIGHTFUNC) << 16) | ((duk_uint32_t) (flags)); \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (fp); \\\n\t} while (0)\n#endif  /* DUK_USE_64BIT_OPS */\n\n#if defined(DUK_USE_FASTINT)\n/* Note: masking is done for 'i' to deal with negative numbers correctly */\n#if defined(DUK_USE_DOUBLE_ME)\n#define DUK__TVAL_SET_I48(tv,i)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16 | (((duk_uint32_t) ((i) >> 32)) & 0x0000ffffUL); \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \\\n\t} while (0)\n#define DUK__TVAL_SET_U32(tv,i)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI0] = ((duk_uint32_t) DUK_TAG_FASTINT) << 16; \\\n\t\tduk__tv->ui[DUK_DBL_IDX_UI1] = (duk_uint32_t) (i); \\\n\t} while (0)\n#else\n#define DUK__TVAL_SET_I48(tv,i)  do { \\\n\t\t(tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (((duk_uint64_t) (i)) & DUK_U64_CONSTANT(0x0000ffffffffffff)); \\\n\t} while (0)\n#define DUK__TVAL_SET_U32(tv,i)  do { \\\n\t\t(tv)->ull[DUK_DBL_IDX_ULL0] = (((duk_uint64_t) DUK_TAG_FASTINT) << 48) | (duk_uint64_t) (i); \\\n\t} while (0)\n#endif\n\n/* This needs to go through a cast because sign extension is needed. */\n#define DUK__TVAL_SET_I32(tv,i)  do { \\\n\t\tduk_int64_t duk__tmp = (duk_int64_t) (i); \\\n\t\tDUK_TVAL_SET_I48((tv), duk__tmp); \\\n\t} while (0)\n\n/* XXX: Clumsy sign extend and masking of 16 topmost bits. */\n#if defined(DUK_USE_DOUBLE_ME)\n#define DUK__TVAL_GET_FASTINT(tv)      (((duk_int64_t) ((((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI0]) << 32) | ((duk_uint64_t) (tv)->ui[DUK_DBL_IDX_UI1]))) << 16 >> 16)\n#else\n#define DUK__TVAL_GET_FASTINT(tv)      ((((duk_int64_t) (tv)->ull[DUK_DBL_IDX_ULL0]) << 16) >> 16)\n#endif\n#define DUK__TVAL_GET_FASTINT_U32(tv)  ((tv)->ui[DUK_DBL_IDX_UI1])\n#define DUK__TVAL_GET_FASTINT_I32(tv)  ((duk_int32_t) (tv)->ui[DUK_DBL_IDX_UI1])\n#endif  /* DUK_USE_FASTINT */\n\n#define DUK_TVAL_SET_UNDEFINED(tv)  do { \\\n\t\t(tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNDEFINED; \\\n\t} while (0)\n#define DUK_TVAL_SET_UNUSED(tv)  do { \\\n\t\t(tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_UNUSED; \\\n\t} while (0)\n#define DUK_TVAL_SET_NULL(tv)  do { \\\n\t\t(tv)->us[DUK_DBL_IDX_US0] = (duk_uint16_t) DUK_TAG_NULL; \\\n\t} while (0)\n\n#define DUK_TVAL_SET_BOOLEAN(tv,val)         DUK_DBLUNION_SET_HIGH32((tv), (((duk_uint32_t) DUK_TAG_BOOLEAN) << 16) | ((duk_uint32_t) (val)))\n\n#define DUK_TVAL_SET_NAN(tv)                 DUK_DBLUNION_SET_NAN_FULL((tv))\n\n/* Assumes that caller has normalized NaNs, otherwise trouble ahead. */\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_SET_DOUBLE(tv,d)  do { \\\n\t\tduk_double_t duk__dblval; \\\n\t\tduk__dblval = (d); \\\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \\\n\t\tDUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \\\n\t} while (0)\n#define DUK_TVAL_SET_I48(tv,i)               DUK__TVAL_SET_I48((tv), (i))\n#define DUK_TVAL_SET_I32(tv,i)               DUK__TVAL_SET_I32((tv), (i))\n#define DUK_TVAL_SET_U32(tv,i)               DUK__TVAL_SET_U32((tv), (i))\n#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d)  duk_tval_set_number_chkfast_fast((tv), (d))\n#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d)  duk_tval_set_number_chkfast_slow((tv), (d))\n#define DUK_TVAL_SET_NUMBER(tv,d)            DUK_TVAL_SET_DOUBLE((tv), (d))\n#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk_double_t duk__d; \\\n\t\tduk__tv = (tv); \\\n\t\tif (DUK_TVAL_IS_DOUBLE(duk__tv)) { \\\n\t\t\tduk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \\\n\t\t\tDUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \\\n\t\t} \\\n\t} while (0)\n#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk_double_t duk__d; \\\n\t\tduk__tv = (tv); \\\n\t\tif (DUK_TVAL_IS_DOUBLE(duk__tv)) { \\\n\t\t\tduk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \\\n\t\t\tDUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \\\n\t\t} \\\n\t} while (0)\n#else  /* DUK_USE_FASTINT */\n#define DUK_TVAL_SET_DOUBLE(tv,d)  do { \\\n\t\tduk_double_t duk__dblval; \\\n\t\tduk__dblval = (d); \\\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); \\\n\t\tDUK_DBLUNION_SET_DOUBLE((tv), duk__dblval); \\\n\t} while (0)\n#define DUK_TVAL_SET_I48(tv,i)               DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i))  /* XXX: fast int-to-double */\n#define DUK_TVAL_SET_I32(tv,i)               DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i))\n#define DUK_TVAL_SET_U32(tv,i)               DUK_TVAL_SET_DOUBLE((tv), (duk_double_t) (i))\n#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d)    DUK_TVAL_SET_DOUBLE((tv), (d))\n#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d)    DUK_TVAL_SET_DOUBLE((tv), (d))\n#define DUK_TVAL_SET_NUMBER(tv,d)            DUK_TVAL_SET_DOUBLE((tv), (d))\n#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv)  do { } while (0)\n#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv)  do { } while (0)\n#endif  /* DUK_USE_FASTINT */\n\n#define DUK_TVAL_SET_FASTINT(tv,i)           DUK_TVAL_SET_I48((tv), (i))  /* alias */\n\n#define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags)  DUK__TVAL_SET_LIGHTFUNC((tv), (fp), (flags))\n#define DUK_TVAL_SET_STRING(tv,h)            DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_STRING)\n#define DUK_TVAL_SET_OBJECT(tv,h)            DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_OBJECT)\n#define DUK_TVAL_SET_BUFFER(tv,h)            DUK__TVAL_SET_TAGGEDPOINTER((tv), (h), DUK_TAG_BUFFER)\n#define DUK_TVAL_SET_POINTER(tv,p)           DUK__TVAL_SET_TAGGEDPOINTER((tv), (p), DUK_TAG_POINTER)\n\n#define DUK_TVAL_SET_TVAL(tv,x)              do { *(tv) = *(x); } while (0)\n\n/* getters */\n#define DUK_TVAL_GET_BOOLEAN(tv)             ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US1])\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_GET_DOUBLE(tv)              ((tv)->d)\n#define DUK_TVAL_GET_FASTINT(tv)             DUK__TVAL_GET_FASTINT((tv))\n#define DUK_TVAL_GET_FASTINT_U32(tv)         DUK__TVAL_GET_FASTINT_U32((tv))\n#define DUK_TVAL_GET_FASTINT_I32(tv)         DUK__TVAL_GET_FASTINT_I32((tv))\n#define DUK_TVAL_GET_NUMBER(tv)              duk_tval_get_number_packed((tv))\n#else\n#define DUK_TVAL_GET_NUMBER(tv)              ((tv)->d)\n#define DUK_TVAL_GET_DOUBLE(tv)              ((tv)->d)\n#endif\n#define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags)  do { \\\n\t\t(out_flags) = (tv)->ui[DUK_DBL_IDX_UI0] & 0xffffUL; \\\n\t\t(out_fp) = (duk_c_function) (tv)->ui[DUK_DBL_IDX_UI1]; \\\n\t} while (0)\n#define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv)   ((duk_c_function) ((tv)->ui[DUK_DBL_IDX_UI1]))\n#define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv)     (((duk_small_uint_t) (tv)->ui[DUK_DBL_IDX_UI0]) & 0xffffUL)\n#define DUK_TVAL_GET_STRING(tv)              ((duk_hstring *) (tv)->vp[DUK_DBL_IDX_VP1])\n#define DUK_TVAL_GET_OBJECT(tv)              ((duk_hobject *) (tv)->vp[DUK_DBL_IDX_VP1])\n#define DUK_TVAL_GET_BUFFER(tv)              ((duk_hbuffer *) (tv)->vp[DUK_DBL_IDX_VP1])\n#define DUK_TVAL_GET_POINTER(tv)             ((void *) (tv)->vp[DUK_DBL_IDX_VP1])\n#define DUK_TVAL_GET_HEAPHDR(tv)             ((duk_heaphdr *) (tv)->vp[DUK_DBL_IDX_VP1])\n\n/* decoding */\n#define DUK_TVAL_GET_TAG(tv)                 ((duk_small_uint_t) (tv)->us[DUK_DBL_IDX_US0])\n\n#define DUK_TVAL_IS_UNDEFINED(tv)            (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNDEFINED)\n#define DUK_TVAL_IS_UNUSED(tv)               (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_UNUSED)\n#define DUK_TVAL_IS_NULL(tv)                 (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_NULL)\n#define DUK_TVAL_IS_BOOLEAN(tv)              (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BOOLEAN)\n#define DUK_TVAL_IS_BOOLEAN_TRUE(tv)         ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_TRUE)\n#define DUK_TVAL_IS_BOOLEAN_FALSE(tv)        ((tv)->ui[DUK_DBL_IDX_UI0] == DUK_XTAG_BOOLEAN_FALSE)\n#define DUK_TVAL_IS_LIGHTFUNC(tv)            (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_LIGHTFUNC)\n#define DUK_TVAL_IS_STRING(tv)               (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_STRING)\n#define DUK_TVAL_IS_OBJECT(tv)               (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_OBJECT)\n#define DUK_TVAL_IS_BUFFER(tv)               (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_BUFFER)\n#define DUK_TVAL_IS_POINTER(tv)              (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_POINTER)\n#if defined(DUK_USE_FASTINT)\n/* 0xfff0 is -Infinity */\n#define DUK_TVAL_IS_DOUBLE(tv)               (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL)\n#define DUK_TVAL_IS_FASTINT(tv)              (DUK_TVAL_GET_TAG((tv)) == DUK_TAG_FASTINT)\n#define DUK_TVAL_IS_NUMBER(tv)               (DUK_TVAL_GET_TAG((tv)) <= 0xfff1UL)\n#else\n#define DUK_TVAL_IS_NUMBER(tv)               (DUK_TVAL_GET_TAG((tv)) <= 0xfff0UL)\n#define DUK_TVAL_IS_DOUBLE(tv)               DUK_TVAL_IS_NUMBER((tv))\n#endif\n\n/* This is performance critical because it appears in every DECREF. */\n#define DUK_TVAL_IS_HEAP_ALLOCATED(tv)       (DUK_TVAL_GET_TAG((tv)) >= DUK_TAG_STRING)\n\n#if defined(DUK_USE_FASTINT)\nDUK_INTERNAL_DECL duk_double_t duk_tval_get_number_packed(duk_tval *tv);\n#endif\n\n#else  /* DUK_USE_PACKED_TVAL */\n/* ======================================================================== */\n\n/*\n *  Portable 12-byte representation\n */\n\n/* Note: not initializing all bytes is normally not an issue: Duktape won't\n * read or use the uninitialized bytes so valgrind won't issue warnings.\n * In some special cases a harmless valgrind warning may be issued though.\n * For example, the DumpHeap debugger command writes out a compiled function's\n * 'data' area as is, including any uninitialized bytes, which causes a\n * valgrind warning.\n */\n\ntypedef struct duk_tval_struct duk_tval;\n\nstruct duk_tval_struct {\n\tduk_small_uint_t t;\n\tduk_small_uint_t v_extra;\n\tunion {\n\t\tduk_double_t d;\n\t\tduk_small_int_t i;\n#if defined(DUK_USE_FASTINT)\n\t\tduk_int64_t fi;  /* if present, forces 16-byte duk_tval */\n#endif\n\t\tvoid *voidptr;\n\t\tduk_hstring *hstring;\n\t\tduk_hobject *hobject;\n\t\tduk_hcompfunc *hcompfunc;\n\t\tduk_hnatfunc *hnatfunc;\n\t\tduk_hthread *hthread;\n\t\tduk_hbuffer *hbuffer;\n\t\tduk_heaphdr *heaphdr;\n\t\tduk_c_function lightfunc;\n\t} v;\n};\n\ntypedef struct {\n\tduk_small_uint_t t;\n\tduk_small_uint_t v_extra;\n\t/* The rest of the fields don't matter except for debug dumps and such\n\t * for which a partial initializer may trigger out-ot-bounds memory\n\t * reads.  Include a double field which is usually as large or larger\n\t * than pointers (not always however).\n\t */\n\tduk_double_t d;\n} duk_tval_unused;\n\n#define DUK_TVAL_UNUSED_INITIALIZER() \\\n\t{ DUK_TAG_UNUSED, 0, 0.0 }\n\n#define DUK_TAG_MIN                   0\n#define DUK_TAG_NUMBER                0  /* DUK_TAG_NUMBER only defined for non-packed duk_tval */\n#if defined(DUK_USE_FASTINT)\n#define DUK_TAG_FASTINT               1\n#endif\n#define DUK_TAG_UNDEFINED             2\n#define DUK_TAG_NULL                  3\n#define DUK_TAG_BOOLEAN               4\n#define DUK_TAG_POINTER               5\n#define DUK_TAG_LIGHTFUNC             6\n#define DUK_TAG_UNUSED                7  /* marker; not actual tagged type */\n#define DUK_TAG_STRING                8  /* first heap allocated, match bit boundary */\n#define DUK_TAG_OBJECT                9\n#define DUK_TAG_BUFFER                10\n#define DUK_TAG_MAX                   10\n\n#define DUK_TVAL_IS_VALID_TAG(tv) \\\n\t(DUK_TVAL_GET_TAG((tv)) - DUK_TAG_MIN <= DUK_TAG_MAX - DUK_TAG_MIN)\n\n/* DUK_TAG_NUMBER is intentionally first, as it is the default clause in code\n * to support the 8-byte representation.  Further, it is a non-heap-allocated\n * type so it should come before DUK_TAG_STRING.  Finally, it should not break\n * the tag value ranges covered by case-clauses in a switch-case.\n */\n\n/* setters */\n#define DUK_TVAL_SET_UNDEFINED(tv)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_UNDEFINED; \\\n\t} while (0)\n\n#define DUK_TVAL_SET_UNUSED(tv)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_UNUSED; \\\n\t} while (0)\n\n#define DUK_TVAL_SET_NULL(tv)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_NULL; \\\n\t} while (0)\n\n#define DUK_TVAL_SET_BOOLEAN(tv,val)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_BOOLEAN; \\\n\t\tduk__tv->v.i = (duk_small_int_t) (val); \\\n\t} while (0)\n\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_SET_DOUBLE(tv,val)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk_double_t duk__dblval; \\\n\t\tduk__dblval = (val); \\\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_NUMBER; \\\n\t\tduk__tv->v.d = duk__dblval; \\\n\t} while (0)\n#define DUK_TVAL_SET_I48(tv,val)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_FASTINT; \\\n\t\tduk__tv->v.fi = (val); \\\n\t} while (0)\n#define DUK_TVAL_SET_U32(tv,val)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_FASTINT; \\\n\t\tduk__tv->v.fi = (duk_int64_t) (val); \\\n\t} while (0)\n#define DUK_TVAL_SET_I32(tv,val)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_FASTINT; \\\n\t\tduk__tv->v.fi = (duk_int64_t) (val); \\\n\t} while (0)\n#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \\\n\tduk_tval_set_number_chkfast_fast((tv), (d))\n#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \\\n\tduk_tval_set_number_chkfast_slow((tv), (d))\n#define DUK_TVAL_SET_NUMBER(tv,val) \\\n\tDUK_TVAL_SET_DOUBLE((tv), (val))\n#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk_double_t duk__d; \\\n\t\tduk__tv = (tv); \\\n\t\tif (DUK_TVAL_IS_DOUBLE(duk__tv)) { \\\n\t\t\tduk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \\\n\t\t\tDUK_TVAL_SET_NUMBER_CHKFAST_FAST(duk__tv, duk__d); \\\n\t\t} \\\n\t} while (0)\n#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk_double_t duk__d; \\\n\t\tduk__tv = (tv); \\\n\t\tif (DUK_TVAL_IS_DOUBLE(duk__tv)) { \\\n\t\t\tduk__d = DUK_TVAL_GET_DOUBLE(duk__tv); \\\n\t\t\tDUK_TVAL_SET_NUMBER_CHKFAST_SLOW(duk__tv, duk__d); \\\n\t\t} \\\n\t} while (0)\n#else  /* DUK_USE_FASTINT */\n#define DUK_TVAL_SET_DOUBLE(tv,d) \\\n\tDUK_TVAL_SET_NUMBER((tv), (d))\n#define DUK_TVAL_SET_I48(tv,val) \\\n\tDUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val))  /* XXX: fast int-to-double */\n#define DUK_TVAL_SET_U32(tv,val) \\\n\tDUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val))\n#define DUK_TVAL_SET_I32(tv,val) \\\n\tDUK_TVAL_SET_NUMBER((tv), (duk_double_t) (val))\n#define DUK_TVAL_SET_NUMBER(tv,val)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk_double_t duk__dblval; \\\n\t\tduk__dblval = (val); \\\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(duk__dblval); /* nop for unpacked duk_tval */ \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_NUMBER; \\\n\t\tduk__tv->v.d = duk__dblval; \\\n\t} while (0)\n#define DUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv,d) \\\n\tDUK_TVAL_SET_NUMBER((tv), (d))\n#define DUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv,d) \\\n\tDUK_TVAL_SET_NUMBER((tv), (d))\n#define DUK_TVAL_CHKFAST_INPLACE_FAST(tv)  do { } while (0)\n#define DUK_TVAL_CHKFAST_INPLACE_SLOW(tv)  do { } while (0)\n#endif  /* DUK_USE_FASTINT */\n\n#define DUK_TVAL_SET_FASTINT(tv,i) \\\n\tDUK_TVAL_SET_I48((tv), (i))  /* alias */\n\n#define DUK_TVAL_SET_POINTER(tv,hptr)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_POINTER; \\\n\t\tduk__tv->v.voidptr = (hptr); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_LIGHTFUNC(tv,fp,flags)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_LIGHTFUNC; \\\n\t\tduk__tv->v_extra = (flags); \\\n\t\tduk__tv->v.lightfunc = (duk_c_function) (fp); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_STRING(tv,hptr)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_STRING; \\\n\t\tduk__tv->v.hstring = (hptr); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_OBJECT(tv,hptr)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_OBJECT; \\\n\t\tduk__tv->v.hobject = (hptr); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_BUFFER(tv,hptr)  do { \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_BUFFER; \\\n\t\tduk__tv->v.hbuffer = (hptr); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_NAN(tv)  do { \\\n\t\t/* in non-packed representation we don't care about which NaN is used */ \\\n\t\tduk_tval *duk__tv; \\\n\t\tduk__tv = (tv); \\\n\t\tduk__tv->t = DUK_TAG_NUMBER; \\\n\t\tduk__tv->v.d = DUK_DOUBLE_NAN; \\\n\t} while (0)\n\n#define DUK_TVAL_SET_TVAL(tv,x)            do { *(tv) = *(x); } while (0)\n\n/* getters */\n#define DUK_TVAL_GET_BOOLEAN(tv)           ((duk_small_uint_t) (tv)->v.i)\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_GET_DOUBLE(tv)            ((tv)->v.d)\n#define DUK_TVAL_GET_FASTINT(tv)           ((tv)->v.fi)\n#define DUK_TVAL_GET_FASTINT_U32(tv)       ((duk_uint32_t) ((tv)->v.fi))\n#define DUK_TVAL_GET_FASTINT_I32(tv)       ((duk_int32_t) ((tv)->v.fi))\n#if 0\n#define DUK_TVAL_GET_NUMBER(tv)            (DUK_TVAL_IS_FASTINT((tv)) ? \\\n                                               (duk_double_t) DUK_TVAL_GET_FASTINT((tv)) : \\\n                                               DUK_TVAL_GET_DOUBLE((tv)))\n#define DUK_TVAL_GET_NUMBER(tv)            duk_tval_get_number_unpacked((tv))\n#else\n/* This seems reasonable overall. */\n#define DUK_TVAL_GET_NUMBER(tv)            (DUK_TVAL_IS_FASTINT((tv)) ? \\\n                                               duk_tval_get_number_unpacked_fastint((tv)) : \\\n                                               DUK_TVAL_GET_DOUBLE((tv)))\n#endif\n#else\n#define DUK_TVAL_GET_NUMBER(tv)            ((tv)->v.d)\n#define DUK_TVAL_GET_DOUBLE(tv)            ((tv)->v.d)\n#endif  /* DUK_USE_FASTINT */\n#define DUK_TVAL_GET_POINTER(tv)           ((tv)->v.voidptr)\n#define DUK_TVAL_GET_LIGHTFUNC(tv,out_fp,out_flags)  do { \\\n\t\t(out_flags) = (duk_uint32_t) (tv)->v_extra; \\\n\t\t(out_fp) = (tv)->v.lightfunc; \\\n\t} while (0)\n#define DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv) ((tv)->v.lightfunc)\n#define DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv)   ((duk_small_uint_t) ((tv)->v_extra))\n#define DUK_TVAL_GET_STRING(tv)            ((tv)->v.hstring)\n#define DUK_TVAL_GET_OBJECT(tv)            ((tv)->v.hobject)\n#define DUK_TVAL_GET_BUFFER(tv)            ((tv)->v.hbuffer)\n#define DUK_TVAL_GET_HEAPHDR(tv)           ((tv)->v.heaphdr)\n\n/* decoding */\n#define DUK_TVAL_GET_TAG(tv)               ((tv)->t)\n#define DUK_TVAL_IS_UNDEFINED(tv)          ((tv)->t == DUK_TAG_UNDEFINED)\n#define DUK_TVAL_IS_UNUSED(tv)             ((tv)->t == DUK_TAG_UNUSED)\n#define DUK_TVAL_IS_NULL(tv)               ((tv)->t == DUK_TAG_NULL)\n#define DUK_TVAL_IS_BOOLEAN(tv)            ((tv)->t == DUK_TAG_BOOLEAN)\n#define DUK_TVAL_IS_BOOLEAN_TRUE(tv)       (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i != 0))\n#define DUK_TVAL_IS_BOOLEAN_FALSE(tv)      (((tv)->t == DUK_TAG_BOOLEAN) && ((tv)->v.i == 0))\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_IS_DOUBLE(tv)             ((tv)->t == DUK_TAG_NUMBER)\n#define DUK_TVAL_IS_FASTINT(tv)            ((tv)->t == DUK_TAG_FASTINT)\n#define DUK_TVAL_IS_NUMBER(tv)             ((tv)->t == DUK_TAG_NUMBER || \\\n                                            (tv)->t == DUK_TAG_FASTINT)\n#else\n#define DUK_TVAL_IS_NUMBER(tv)             ((tv)->t == DUK_TAG_NUMBER)\n#define DUK_TVAL_IS_DOUBLE(tv)             DUK_TVAL_IS_NUMBER((tv))\n#endif  /* DUK_USE_FASTINT */\n#define DUK_TVAL_IS_POINTER(tv)            ((tv)->t == DUK_TAG_POINTER)\n#define DUK_TVAL_IS_LIGHTFUNC(tv)          ((tv)->t == DUK_TAG_LIGHTFUNC)\n#define DUK_TVAL_IS_STRING(tv)             ((tv)->t == DUK_TAG_STRING)\n#define DUK_TVAL_IS_OBJECT(tv)             ((tv)->t == DUK_TAG_OBJECT)\n#define DUK_TVAL_IS_BUFFER(tv)             ((tv)->t == DUK_TAG_BUFFER)\n\n/* This is performance critical because it's needed for every DECREF.\n * Take advantage of the fact that the first heap allocated tag is 8,\n * so that bit 3 is set for all heap allocated tags (and never set for\n * non-heap-allocated tags).\n */\n#if 0\n#define DUK_TVAL_IS_HEAP_ALLOCATED(tv)     ((tv)->t >= DUK_TAG_STRING)\n#endif\n#define DUK_TVAL_IS_HEAP_ALLOCATED(tv)     ((tv)->t & 0x08)\n\n#if defined(DUK_USE_FASTINT)\n#if 0\nDUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked(duk_tval *tv);\n#endif\nDUK_INTERNAL_DECL duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv);\n#endif\n\n#endif  /* DUK_USE_PACKED_TVAL */\n\n/*\n *  Convenience (independent of representation)\n */\n\n#define DUK_TVAL_SET_BOOLEAN_TRUE(tv)        DUK_TVAL_SET_BOOLEAN((tv), 1)\n#define DUK_TVAL_SET_BOOLEAN_FALSE(tv)       DUK_TVAL_SET_BOOLEAN((tv), 0)\n\n#define DUK_TVAL_STRING_IS_SYMBOL(tv) \\\n\tDUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING((tv)))\n\n/* Lightfunc flags packing and unpacking. */\n/* Sign extend: 0x0000##00 -> 0x##000000 -> sign extend to 0xssssss##.\n * Avoid signed shifts due to portability limitations.\n */\n#define DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags) \\\n\t((duk_int32_t) (duk_int8_t) (((duk_uint16_t) (lf_flags)) >> 8))\n#define DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags) \\\n\t(((lf_flags) >> 4) & 0x0fU)\n#define DUK_LFUNC_FLAGS_GET_NARGS(lf_flags) \\\n\t((lf_flags) & 0x0fU)\n#define DUK_LFUNC_FLAGS_PACK(magic,length,nargs) \\\n\t((((duk_small_uint_t) (magic)) & 0xffU) << 8) | ((length) << 4) | (nargs)\n\n#define DUK_LFUNC_NARGS_VARARGS             0x0f   /* varargs marker */\n#define DUK_LFUNC_NARGS_MIN                 0x00\n#define DUK_LFUNC_NARGS_MAX                 0x0e   /* max, excl. varargs marker */\n#define DUK_LFUNC_LENGTH_MIN                0x00\n#define DUK_LFUNC_LENGTH_MAX                0x0f\n#define DUK_LFUNC_MAGIC_MIN                 (-0x80)\n#define DUK_LFUNC_MAGIC_MAX                 0x7f\n\n/* fastint constants etc */\n#if defined(DUK_USE_FASTINT)\n#define DUK_FASTINT_MIN           (DUK_I64_CONSTANT(-0x800000000000))\n#define DUK_FASTINT_MAX           (DUK_I64_CONSTANT(0x7fffffffffff))\n#define DUK_FASTINT_BITS          48\n\nDUK_INTERNAL_DECL void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x);\nDUK_INTERNAL_DECL void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x);\n#endif\n\n#endif  /* DUK_TVAL_H_INCLUDED */\n/* #include duk_builtins.h */\n#line 1 \"duk_builtins.h\"\n/*\n *  Automatically generated by genbuiltins.py, do not edit!\n */\n\n#if !defined(DUK_BUILTINS_H_INCLUDED)\n#define DUK_BUILTINS_H_INCLUDED\n\n#if defined(DUK_USE_ROM_STRINGS)\n#error ROM support not enabled, rerun configure.py with --rom-support\n#else  /* DUK_USE_ROM_STRINGS */\n#define DUK_STRIDX_UC_UNDEFINED                                       0                              /* 'Undefined' */\n#define DUK_HEAP_STRING_UC_UNDEFINED(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_UNDEFINED)\n#define DUK_HTHREAD_STRING_UC_UNDEFINED(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_UNDEFINED)\n#define DUK_STRIDX_UC_NULL                                            1                              /* 'Null' */\n#define DUK_HEAP_STRING_UC_NULL(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NULL)\n#define DUK_HTHREAD_STRING_UC_NULL(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NULL)\n#define DUK_STRIDX_UC_SYMBOL                                          2                              /* 'Symbol' */\n#define DUK_HEAP_STRING_UC_SYMBOL(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_SYMBOL)\n#define DUK_HTHREAD_STRING_UC_SYMBOL(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_SYMBOL)\n#define DUK_STRIDX_UC_ARGUMENTS                                       3                              /* 'Arguments' */\n#define DUK_HEAP_STRING_UC_ARGUMENTS(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ARGUMENTS)\n#define DUK_HTHREAD_STRING_UC_ARGUMENTS(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ARGUMENTS)\n#define DUK_STRIDX_UC_OBJECT                                          4                              /* 'Object' */\n#define DUK_HEAP_STRING_UC_OBJECT(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_OBJECT)\n#define DUK_HTHREAD_STRING_UC_OBJECT(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_OBJECT)\n#define DUK_STRIDX_UC_FUNCTION                                        5                              /* 'Function' */\n#define DUK_HEAP_STRING_UC_FUNCTION(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_FUNCTION)\n#define DUK_HTHREAD_STRING_UC_FUNCTION(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_FUNCTION)\n#define DUK_STRIDX_ARRAY                                              6                              /* 'Array' */\n#define DUK_HEAP_STRING_ARRAY(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY)\n#define DUK_HTHREAD_STRING_ARRAY(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY)\n#define DUK_STRIDX_UC_STRING                                          7                              /* 'String' */\n#define DUK_HEAP_STRING_UC_STRING(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_STRING)\n#define DUK_HTHREAD_STRING_UC_STRING(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_STRING)\n#define DUK_STRIDX_UC_BOOLEAN                                         8                              /* 'Boolean' */\n#define DUK_HEAP_STRING_UC_BOOLEAN(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BOOLEAN)\n#define DUK_HTHREAD_STRING_UC_BOOLEAN(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BOOLEAN)\n#define DUK_STRIDX_UC_NUMBER                                          9                              /* 'Number' */\n#define DUK_HEAP_STRING_UC_NUMBER(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_NUMBER)\n#define DUK_HTHREAD_STRING_UC_NUMBER(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_NUMBER)\n#define DUK_STRIDX_DATE                                               10                             /* 'Date' */\n#define DUK_HEAP_STRING_DATE(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATE)\n#define DUK_HTHREAD_STRING_DATE(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATE)\n#define DUK_STRIDX_REG_EXP                                            11                             /* 'RegExp' */\n#define DUK_HEAP_STRING_REG_EXP(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_REG_EXP)\n#define DUK_HTHREAD_STRING_REG_EXP(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_REG_EXP)\n#define DUK_STRIDX_UC_ERROR                                           12                             /* 'Error' */\n#define DUK_HEAP_STRING_UC_ERROR(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_ERROR)\n#define DUK_HTHREAD_STRING_UC_ERROR(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_ERROR)\n#define DUK_STRIDX_MATH                                               13                             /* 'Math' */\n#define DUK_HEAP_STRING_MATH(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MATH)\n#define DUK_HTHREAD_STRING_MATH(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MATH)\n#define DUK_STRIDX_JSON                                               14                             /* 'JSON' */\n#define DUK_HEAP_STRING_JSON(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON)\n#define DUK_HTHREAD_STRING_JSON(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON)\n#define DUK_STRIDX_EMPTY_STRING                                       15                             /* '' */\n#define DUK_HEAP_STRING_EMPTY_STRING(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EMPTY_STRING)\n#define DUK_HTHREAD_STRING_EMPTY_STRING(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EMPTY_STRING)\n#define DUK_STRIDX_ARRAY_BUFFER                                       16                             /* 'ArrayBuffer' */\n#define DUK_HEAP_STRING_ARRAY_BUFFER(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ARRAY_BUFFER)\n#define DUK_HTHREAD_STRING_ARRAY_BUFFER(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ARRAY_BUFFER)\n#define DUK_STRIDX_DATA_VIEW                                          17                             /* 'DataView' */\n#define DUK_HEAP_STRING_DATA_VIEW(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA_VIEW)\n#define DUK_HTHREAD_STRING_DATA_VIEW(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA_VIEW)\n#define DUK_STRIDX_INT8_ARRAY                                         18                             /* 'Int8Array' */\n#define DUK_HEAP_STRING_INT8_ARRAY(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT8_ARRAY)\n#define DUK_HTHREAD_STRING_INT8_ARRAY(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT8_ARRAY)\n#define DUK_STRIDX_UINT8_ARRAY                                        19                             /* 'Uint8Array' */\n#define DUK_HEAP_STRING_UINT8_ARRAY(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_ARRAY)\n#define DUK_HTHREAD_STRING_UINT8_ARRAY(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_ARRAY)\n#define DUK_STRIDX_UINT8_CLAMPED_ARRAY                                20                             /* 'Uint8ClampedArray' */\n#define DUK_HEAP_STRING_UINT8_CLAMPED_ARRAY(heap)                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT8_CLAMPED_ARRAY)\n#define DUK_HTHREAD_STRING_UINT8_CLAMPED_ARRAY(thr)                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT8_CLAMPED_ARRAY)\n#define DUK_STRIDX_INT16_ARRAY                                        21                             /* 'Int16Array' */\n#define DUK_HEAP_STRING_INT16_ARRAY(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT16_ARRAY)\n#define DUK_HTHREAD_STRING_INT16_ARRAY(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT16_ARRAY)\n#define DUK_STRIDX_UINT16_ARRAY                                       22                             /* 'Uint16Array' */\n#define DUK_HEAP_STRING_UINT16_ARRAY(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT16_ARRAY)\n#define DUK_HTHREAD_STRING_UINT16_ARRAY(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT16_ARRAY)\n#define DUK_STRIDX_INT32_ARRAY                                        23                             /* 'Int32Array' */\n#define DUK_HEAP_STRING_INT32_ARRAY(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT32_ARRAY)\n#define DUK_HTHREAD_STRING_INT32_ARRAY(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT32_ARRAY)\n#define DUK_STRIDX_UINT32_ARRAY                                       24                             /* 'Uint32Array' */\n#define DUK_HEAP_STRING_UINT32_ARRAY(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UINT32_ARRAY)\n#define DUK_HTHREAD_STRING_UINT32_ARRAY(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UINT32_ARRAY)\n#define DUK_STRIDX_FLOAT32_ARRAY                                      25                             /* 'Float32Array' */\n#define DUK_HEAP_STRING_FLOAT32_ARRAY(heap)                           DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT32_ARRAY)\n#define DUK_HTHREAD_STRING_FLOAT32_ARRAY(thr)                         DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT32_ARRAY)\n#define DUK_STRIDX_FLOAT64_ARRAY                                      26                             /* 'Float64Array' */\n#define DUK_HEAP_STRING_FLOAT64_ARRAY(heap)                           DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLOAT64_ARRAY)\n#define DUK_HTHREAD_STRING_FLOAT64_ARRAY(thr)                         DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLOAT64_ARRAY)\n#define DUK_STRIDX_GLOBAL                                             27                             /* 'global' */\n#define DUK_HEAP_STRING_GLOBAL(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GLOBAL)\n#define DUK_HTHREAD_STRING_GLOBAL(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GLOBAL)\n#define DUK_STRIDX_OBJ_ENV                                            28                             /* 'ObjEnv' */\n#define DUK_HEAP_STRING_OBJ_ENV(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OBJ_ENV)\n#define DUK_HTHREAD_STRING_OBJ_ENV(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OBJ_ENV)\n#define DUK_STRIDX_DEC_ENV                                            29                             /* 'DecEnv' */\n#define DUK_HEAP_STRING_DEC_ENV(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEC_ENV)\n#define DUK_HTHREAD_STRING_DEC_ENV(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEC_ENV)\n#define DUK_STRIDX_UC_BUFFER                                          30                             /* 'Buffer' */\n#define DUK_HEAP_STRING_UC_BUFFER(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_BUFFER)\n#define DUK_HTHREAD_STRING_UC_BUFFER(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_BUFFER)\n#define DUK_STRIDX_UC_POINTER                                         31                             /* 'Pointer' */\n#define DUK_HEAP_STRING_UC_POINTER(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_POINTER)\n#define DUK_HTHREAD_STRING_UC_POINTER(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_POINTER)\n#define DUK_STRIDX_UC_THREAD                                          32                             /* 'Thread' */\n#define DUK_HEAP_STRING_UC_THREAD(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_UC_THREAD)\n#define DUK_HTHREAD_STRING_UC_THREAD(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_UC_THREAD)\n#define DUK_STRIDX_EVAL                                               33                             /* 'eval' */\n#define DUK_HEAP_STRING_EVAL(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EVAL)\n#define DUK_HTHREAD_STRING_EVAL(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EVAL)\n#define DUK_STRIDX_VALUE                                              34                             /* 'value' */\n#define DUK_HEAP_STRING_VALUE(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE)\n#define DUK_HTHREAD_STRING_VALUE(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE)\n#define DUK_STRIDX_WRITABLE                                           35                             /* 'writable' */\n#define DUK_HEAP_STRING_WRITABLE(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WRITABLE)\n#define DUK_HTHREAD_STRING_WRITABLE(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WRITABLE)\n#define DUK_STRIDX_CONFIGURABLE                                       36                             /* 'configurable' */\n#define DUK_HEAP_STRING_CONFIGURABLE(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONFIGURABLE)\n#define DUK_HTHREAD_STRING_CONFIGURABLE(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONFIGURABLE)\n#define DUK_STRIDX_ENUMERABLE                                         37                             /* 'enumerable' */\n#define DUK_HEAP_STRING_ENUMERABLE(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUMERABLE)\n#define DUK_HTHREAD_STRING_ENUMERABLE(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUMERABLE)\n#define DUK_STRIDX_JOIN                                               38                             /* 'join' */\n#define DUK_HEAP_STRING_JOIN(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JOIN)\n#define DUK_HTHREAD_STRING_JOIN(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JOIN)\n#define DUK_STRIDX_TO_LOCALE_STRING                                   39                             /* 'toLocaleString' */\n#define DUK_HEAP_STRING_TO_LOCALE_STRING(heap)                        DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_LOCALE_STRING)\n#define DUK_HTHREAD_STRING_TO_LOCALE_STRING(thr)                      DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_LOCALE_STRING)\n#define DUK_STRIDX_VALUE_OF                                           40                             /* 'valueOf' */\n#define DUK_HEAP_STRING_VALUE_OF(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VALUE_OF)\n#define DUK_HTHREAD_STRING_VALUE_OF(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VALUE_OF)\n#define DUK_STRIDX_TO_UTC_STRING                                      41                             /* 'toUTCString' */\n#define DUK_HEAP_STRING_TO_UTC_STRING(heap)                           DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_UTC_STRING)\n#define DUK_HTHREAD_STRING_TO_UTC_STRING(thr)                         DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_UTC_STRING)\n#define DUK_STRIDX_TO_ISO_STRING                                      42                             /* 'toISOString' */\n#define DUK_HEAP_STRING_TO_ISO_STRING(heap)                           DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_ISO_STRING)\n#define DUK_HTHREAD_STRING_TO_ISO_STRING(thr)                         DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_ISO_STRING)\n#define DUK_STRIDX_TO_GMT_STRING                                      43                             /* 'toGMTString' */\n#define DUK_HEAP_STRING_TO_GMT_STRING(heap)                           DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_GMT_STRING)\n#define DUK_HTHREAD_STRING_TO_GMT_STRING(thr)                         DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_GMT_STRING)\n#define DUK_STRIDX_SOURCE                                             44                             /* 'source' */\n#define DUK_HEAP_STRING_SOURCE(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SOURCE)\n#define DUK_HTHREAD_STRING_SOURCE(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SOURCE)\n#define DUK_STRIDX_IGNORE_CASE                                        45                             /* 'ignoreCase' */\n#define DUK_HEAP_STRING_IGNORE_CASE(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IGNORE_CASE)\n#define DUK_HTHREAD_STRING_IGNORE_CASE(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IGNORE_CASE)\n#define DUK_STRIDX_MULTILINE                                          46                             /* 'multiline' */\n#define DUK_HEAP_STRING_MULTILINE(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MULTILINE)\n#define DUK_HTHREAD_STRING_MULTILINE(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MULTILINE)\n#define DUK_STRIDX_LAST_INDEX                                         47                             /* 'lastIndex' */\n#define DUK_HEAP_STRING_LAST_INDEX(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LAST_INDEX)\n#define DUK_HTHREAD_STRING_LAST_INDEX(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LAST_INDEX)\n#define DUK_STRIDX_FLAGS                                              48                             /* 'flags' */\n#define DUK_HEAP_STRING_FLAGS(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FLAGS)\n#define DUK_HTHREAD_STRING_FLAGS(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FLAGS)\n#define DUK_STRIDX_INDEX                                              49                             /* 'index' */\n#define DUK_HEAP_STRING_INDEX(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INDEX)\n#define DUK_HTHREAD_STRING_INDEX(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INDEX)\n#define DUK_STRIDX_PROTOTYPE                                          50                             /* 'prototype' */\n#define DUK_HEAP_STRING_PROTOTYPE(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTOTYPE)\n#define DUK_HTHREAD_STRING_PROTOTYPE(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTOTYPE)\n#define DUK_STRIDX_CONSTRUCTOR                                        51                             /* 'constructor' */\n#define DUK_HEAP_STRING_CONSTRUCTOR(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCTOR)\n#define DUK_HTHREAD_STRING_CONSTRUCTOR(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCTOR)\n#define DUK_STRIDX_MESSAGE                                            52                             /* 'message' */\n#define DUK_HEAP_STRING_MESSAGE(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MESSAGE)\n#define DUK_HTHREAD_STRING_MESSAGE(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MESSAGE)\n#define DUK_STRIDX_LC_BOOLEAN                                         53                             /* 'boolean' */\n#define DUK_HEAP_STRING_LC_BOOLEAN(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_BOOLEAN)\n#define DUK_HTHREAD_STRING_LC_BOOLEAN(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_BOOLEAN)\n#define DUK_STRIDX_LC_NUMBER                                          54                             /* 'number' */\n#define DUK_HEAP_STRING_LC_NUMBER(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NUMBER)\n#define DUK_HTHREAD_STRING_LC_NUMBER(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NUMBER)\n#define DUK_STRIDX_LC_STRING                                          55                             /* 'string' */\n#define DUK_HEAP_STRING_LC_STRING(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_STRING)\n#define DUK_HTHREAD_STRING_LC_STRING(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_STRING)\n#define DUK_STRIDX_LC_SYMBOL                                          56                             /* 'symbol' */\n#define DUK_HEAP_STRING_LC_SYMBOL(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_SYMBOL)\n#define DUK_HTHREAD_STRING_LC_SYMBOL(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_SYMBOL)\n#define DUK_STRIDX_LC_OBJECT                                          57                             /* 'object' */\n#define DUK_HEAP_STRING_LC_OBJECT(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_OBJECT)\n#define DUK_HTHREAD_STRING_LC_OBJECT(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_OBJECT)\n#define DUK_STRIDX_LC_UNDEFINED                                       58                             /* 'undefined' */\n#define DUK_HEAP_STRING_LC_UNDEFINED(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_UNDEFINED)\n#define DUK_HTHREAD_STRING_LC_UNDEFINED(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_UNDEFINED)\n#define DUK_STRIDX_NAN                                                59                             /* 'NaN' */\n#define DUK_HEAP_STRING_NAN(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAN)\n#define DUK_HTHREAD_STRING_NAN(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAN)\n#define DUK_STRIDX_INFINITY                                           60                             /* 'Infinity' */\n#define DUK_HEAP_STRING_INFINITY(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INFINITY)\n#define DUK_HTHREAD_STRING_INFINITY(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INFINITY)\n#define DUK_STRIDX_MINUS_INFINITY                                     61                             /* '-Infinity' */\n#define DUK_HEAP_STRING_MINUS_INFINITY(heap)                          DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_INFINITY)\n#define DUK_HTHREAD_STRING_MINUS_INFINITY(thr)                        DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_INFINITY)\n#define DUK_STRIDX_MINUS_ZERO                                         62                             /* '-0' */\n#define DUK_HEAP_STRING_MINUS_ZERO(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_MINUS_ZERO)\n#define DUK_HTHREAD_STRING_MINUS_ZERO(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_MINUS_ZERO)\n#define DUK_STRIDX_COMMA                                              63                             /* ',' */\n#define DUK_HEAP_STRING_COMMA(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMMA)\n#define DUK_HTHREAD_STRING_COMMA(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMMA)\n#define DUK_STRIDX_NEWLINE_4SPACE                                     64                             /* '\\n    ' */\n#define DUK_HEAP_STRING_NEWLINE_4SPACE(heap)                          DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEWLINE_4SPACE)\n#define DUK_HTHREAD_STRING_NEWLINE_4SPACE(thr)                        DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEWLINE_4SPACE)\n#define DUK_STRIDX_BRACKETED_ELLIPSIS                                 65                             /* '[...]' */\n#define DUK_HEAP_STRING_BRACKETED_ELLIPSIS(heap)                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BRACKETED_ELLIPSIS)\n#define DUK_HTHREAD_STRING_BRACKETED_ELLIPSIS(thr)                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BRACKETED_ELLIPSIS)\n#define DUK_STRIDX_INVALID_DATE                                       66                             /* 'Invalid Date' */\n#define DUK_HEAP_STRING_INVALID_DATE(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INVALID_DATE)\n#define DUK_HTHREAD_STRING_INVALID_DATE(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INVALID_DATE)\n#define DUK_STRIDX_LC_ARGUMENTS                                       67                             /* 'arguments' */\n#define DUK_HEAP_STRING_LC_ARGUMENTS(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_ARGUMENTS)\n#define DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_ARGUMENTS)\n#define DUK_STRIDX_CALLEE                                             68                             /* 'callee' */\n#define DUK_HEAP_STRING_CALLEE(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLEE)\n#define DUK_HTHREAD_STRING_CALLEE(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLEE)\n#define DUK_STRIDX_CALLER                                             69                             /* 'caller' */\n#define DUK_HEAP_STRING_CALLER(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CALLER)\n#define DUK_HTHREAD_STRING_CALLER(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CALLER)\n#define DUK_STRIDX_APPLY                                              70                             /* 'apply' */\n#define DUK_HEAP_STRING_APPLY(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_APPLY)\n#define DUK_HTHREAD_STRING_APPLY(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_APPLY)\n#define DUK_STRIDX_CONSTRUCT                                          71                             /* 'construct' */\n#define DUK_HEAP_STRING_CONSTRUCT(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONSTRUCT)\n#define DUK_HTHREAD_STRING_CONSTRUCT(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONSTRUCT)\n#define DUK_STRIDX_DELETE_PROPERTY                                    72                             /* 'deleteProperty' */\n#define DUK_HEAP_STRING_DELETE_PROPERTY(heap)                         DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE_PROPERTY)\n#define DUK_HTHREAD_STRING_DELETE_PROPERTY(thr)                       DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE_PROPERTY)\n#define DUK_STRIDX_GET                                                73                             /* 'get' */\n#define DUK_HEAP_STRING_GET(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_GET)\n#define DUK_HTHREAD_STRING_GET(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_GET)\n#define DUK_STRIDX_HAS                                                74                             /* 'has' */\n#define DUK_HEAP_STRING_HAS(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HAS)\n#define DUK_HTHREAD_STRING_HAS(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HAS)\n#define DUK_STRIDX_OWN_KEYS                                           75                             /* 'ownKeys' */\n#define DUK_HEAP_STRING_OWN_KEYS(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_OWN_KEYS)\n#define DUK_HTHREAD_STRING_OWN_KEYS(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_OWN_KEYS)\n#define DUK_STRIDX_SET_PROTOTYPE_OF                                   76                             /* 'setPrototypeOf' */\n#define DUK_HEAP_STRING_SET_PROTOTYPE_OF(heap)                        DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET_PROTOTYPE_OF)\n#define DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr)                      DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET_PROTOTYPE_OF)\n#define DUK_STRIDX___PROTO__                                          77                             /* '__proto__' */\n#define DUK_HEAP_STRING___PROTO__(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX___PROTO__)\n#define DUK_HTHREAD_STRING___PROTO__(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX___PROTO__)\n#define DUK_STRIDX_TO_STRING                                          78                             /* 'toString' */\n#define DUK_HEAP_STRING_TO_STRING(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_STRING)\n#define DUK_HTHREAD_STRING_TO_STRING(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_STRING)\n#define DUK_STRIDX_TO_JSON                                            79                             /* 'toJSON' */\n#define DUK_HEAP_STRING_TO_JSON(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TO_JSON)\n#define DUK_HTHREAD_STRING_TO_JSON(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TO_JSON)\n#define DUK_STRIDX_TYPE                                               80                             /* 'type' */\n#define DUK_HEAP_STRING_TYPE(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPE)\n#define DUK_HTHREAD_STRING_TYPE(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPE)\n#define DUK_STRIDX_DATA                                               81                             /* 'data' */\n#define DUK_HEAP_STRING_DATA(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DATA)\n#define DUK_HTHREAD_STRING_DATA(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DATA)\n#define DUK_STRIDX_LENGTH                                             82                             /* 'length' */\n#define DUK_HEAP_STRING_LENGTH(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LENGTH)\n#define DUK_HTHREAD_STRING_LENGTH(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LENGTH)\n#define DUK_STRIDX_SET                                                83                             /* 'set' */\n#define DUK_HEAP_STRING_SET(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SET)\n#define DUK_HTHREAD_STRING_SET(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SET)\n#define DUK_STRIDX_STACK                                              84                             /* 'stack' */\n#define DUK_HEAP_STRING_STACK(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STACK)\n#define DUK_HTHREAD_STRING_STACK(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STACK)\n#define DUK_STRIDX_PC                                                 85                             /* 'pc' */\n#define DUK_HEAP_STRING_PC(heap)                                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PC)\n#define DUK_HTHREAD_STRING_PC(thr)                                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PC)\n#define DUK_STRIDX_LINE_NUMBER                                        86                             /* 'lineNumber' */\n#define DUK_HEAP_STRING_LINE_NUMBER(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LINE_NUMBER)\n#define DUK_HTHREAD_STRING_LINE_NUMBER(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LINE_NUMBER)\n#define DUK_STRIDX_INT_TRACEDATA                                      87                             /* '\\x82Tracedata' */\n#define DUK_HEAP_STRING_INT_TRACEDATA(heap)                           DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TRACEDATA)\n#define DUK_HTHREAD_STRING_INT_TRACEDATA(thr)                         DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TRACEDATA)\n#define DUK_STRIDX_NAME                                               88                             /* 'name' */\n#define DUK_HEAP_STRING_NAME(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NAME)\n#define DUK_HTHREAD_STRING_NAME(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NAME)\n#define DUK_STRIDX_FILE_NAME                                          89                             /* 'fileName' */\n#define DUK_HEAP_STRING_FILE_NAME(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FILE_NAME)\n#define DUK_HTHREAD_STRING_FILE_NAME(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FILE_NAME)\n#define DUK_STRIDX_LC_POINTER                                         90                             /* 'pointer' */\n#define DUK_HEAP_STRING_LC_POINTER(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_POINTER)\n#define DUK_HTHREAD_STRING_LC_POINTER(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_POINTER)\n#define DUK_STRIDX_INT_TARGET                                         91                             /* '\\x82Target' */\n#define DUK_HEAP_STRING_INT_TARGET(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_TARGET)\n#define DUK_HTHREAD_STRING_INT_TARGET(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_TARGET)\n#define DUK_STRIDX_INT_NEXT                                           92                             /* '\\x82Next' */\n#define DUK_HEAP_STRING_INT_NEXT(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_NEXT)\n#define DUK_HTHREAD_STRING_INT_NEXT(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_NEXT)\n#define DUK_STRIDX_INT_BYTECODE                                       93                             /* '\\x82Bytecode' */\n#define DUK_HEAP_STRING_INT_BYTECODE(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_BYTECODE)\n#define DUK_HTHREAD_STRING_INT_BYTECODE(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_BYTECODE)\n#define DUK_STRIDX_INT_FORMALS                                        94                             /* '\\x82Formals' */\n#define DUK_HEAP_STRING_INT_FORMALS(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FORMALS)\n#define DUK_HTHREAD_STRING_INT_FORMALS(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FORMALS)\n#define DUK_STRIDX_INT_VARMAP                                         95                             /* '\\x82Varmap' */\n#define DUK_HEAP_STRING_INT_VARMAP(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARMAP)\n#define DUK_HTHREAD_STRING_INT_VARMAP(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARMAP)\n#define DUK_STRIDX_INT_SOURCE                                         96                             /* '\\x82Source' */\n#define DUK_HEAP_STRING_INT_SOURCE(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_SOURCE)\n#define DUK_HTHREAD_STRING_INT_SOURCE(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_SOURCE)\n#define DUK_STRIDX_INT_PC2LINE                                        97                             /* '\\x82Pc2line' */\n#define DUK_HEAP_STRING_INT_PC2LINE(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_PC2LINE)\n#define DUK_HTHREAD_STRING_INT_PC2LINE(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_PC2LINE)\n#define DUK_STRIDX_INT_MAP                                            98                             /* '\\x82Map' */\n#define DUK_HEAP_STRING_INT_MAP(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_MAP)\n#define DUK_HTHREAD_STRING_INT_MAP(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_MAP)\n#define DUK_STRIDX_INT_VARENV                                         99                             /* '\\x82Varenv' */\n#define DUK_HEAP_STRING_INT_VARENV(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VARENV)\n#define DUK_HTHREAD_STRING_INT_VARENV(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VARENV)\n#define DUK_STRIDX_INT_FINALIZER                                      100                            /* '\\x82Finalizer' */\n#define DUK_HEAP_STRING_INT_FINALIZER(heap)                           DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_FINALIZER)\n#define DUK_HTHREAD_STRING_INT_FINALIZER(thr)                         DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_FINALIZER)\n#define DUK_STRIDX_INT_VALUE                                          101                            /* '\\x82Value' */\n#define DUK_HEAP_STRING_INT_VALUE(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INT_VALUE)\n#define DUK_HTHREAD_STRING_INT_VALUE(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INT_VALUE)\n#define DUK_STRIDX_COMPILE                                            102                            /* 'compile' */\n#define DUK_HEAP_STRING_COMPILE(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_COMPILE)\n#define DUK_HTHREAD_STRING_COMPILE(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_COMPILE)\n#define DUK_STRIDX_INPUT                                              103                            /* 'input' */\n#define DUK_HEAP_STRING_INPUT(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INPUT)\n#define DUK_HTHREAD_STRING_INPUT(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INPUT)\n#define DUK_STRIDX_ERR_CREATE                                         104                            /* 'errCreate' */\n#define DUK_HEAP_STRING_ERR_CREATE(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_CREATE)\n#define DUK_HTHREAD_STRING_ERR_CREATE(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_CREATE)\n#define DUK_STRIDX_ERR_THROW                                          105                            /* 'errThrow' */\n#define DUK_HEAP_STRING_ERR_THROW(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ERR_THROW)\n#define DUK_HTHREAD_STRING_ERR_THROW(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ERR_THROW)\n#define DUK_STRIDX_ENV                                                106                            /* 'env' */\n#define DUK_HEAP_STRING_ENV(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENV)\n#define DUK_HTHREAD_STRING_ENV(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENV)\n#define DUK_STRIDX_HEX                                                107                            /* 'hex' */\n#define DUK_HEAP_STRING_HEX(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_HEX)\n#define DUK_HTHREAD_STRING_HEX(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_HEX)\n#define DUK_STRIDX_BASE64                                             108                            /* 'base64' */\n#define DUK_HEAP_STRING_BASE64(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BASE64)\n#define DUK_HTHREAD_STRING_BASE64(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BASE64)\n#define DUK_STRIDX_JX                                                 109                            /* 'jx' */\n#define DUK_HEAP_STRING_JX(heap)                                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JX)\n#define DUK_HTHREAD_STRING_JX(thr)                                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JX)\n#define DUK_STRIDX_JC                                                 110                            /* 'jc' */\n#define DUK_HEAP_STRING_JC(heap)                                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JC)\n#define DUK_HTHREAD_STRING_JC(thr)                                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JC)\n#define DUK_STRIDX_JSON_EXT_UNDEFINED                                 111                            /* '{\"_undef\":true}' */\n#define DUK_HEAP_STRING_JSON_EXT_UNDEFINED(heap)                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_UNDEFINED)\n#define DUK_HTHREAD_STRING_JSON_EXT_UNDEFINED(thr)                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_UNDEFINED)\n#define DUK_STRIDX_JSON_EXT_NAN                                       112                            /* '{\"_nan\":true}' */\n#define DUK_HEAP_STRING_JSON_EXT_NAN(heap)                            DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NAN)\n#define DUK_HTHREAD_STRING_JSON_EXT_NAN(thr)                          DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NAN)\n#define DUK_STRIDX_JSON_EXT_POSINF                                    113                            /* '{\"_inf\":true}' */\n#define DUK_HEAP_STRING_JSON_EXT_POSINF(heap)                         DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_POSINF)\n#define DUK_HTHREAD_STRING_JSON_EXT_POSINF(thr)                       DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_POSINF)\n#define DUK_STRIDX_JSON_EXT_NEGINF                                    114                            /* '{\"_ninf\":true}' */\n#define DUK_HEAP_STRING_JSON_EXT_NEGINF(heap)                         DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_NEGINF)\n#define DUK_HTHREAD_STRING_JSON_EXT_NEGINF(thr)                       DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_NEGINF)\n#define DUK_STRIDX_JSON_EXT_FUNCTION1                                 115                            /* '{\"_func\":true}' */\n#define DUK_HEAP_STRING_JSON_EXT_FUNCTION1(heap)                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION1)\n#define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION1(thr)                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION1)\n#define DUK_STRIDX_JSON_EXT_FUNCTION2                                 116                            /* '{_func:true}' */\n#define DUK_HEAP_STRING_JSON_EXT_FUNCTION2(heap)                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_JSON_EXT_FUNCTION2)\n#define DUK_HTHREAD_STRING_JSON_EXT_FUNCTION2(thr)                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_JSON_EXT_FUNCTION2)\n#define DUK_STRIDX_BREAK                                              117                            /* 'break' */\n#define DUK_HEAP_STRING_BREAK(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_BREAK)\n#define DUK_HTHREAD_STRING_BREAK(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_BREAK)\n#define DUK_STRIDX_CASE                                               118                            /* 'case' */\n#define DUK_HEAP_STRING_CASE(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CASE)\n#define DUK_HTHREAD_STRING_CASE(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CASE)\n#define DUK_STRIDX_CATCH                                              119                            /* 'catch' */\n#define DUK_HEAP_STRING_CATCH(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CATCH)\n#define DUK_HTHREAD_STRING_CATCH(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CATCH)\n#define DUK_STRIDX_CONTINUE                                           120                            /* 'continue' */\n#define DUK_HEAP_STRING_CONTINUE(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONTINUE)\n#define DUK_HTHREAD_STRING_CONTINUE(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONTINUE)\n#define DUK_STRIDX_DEBUGGER                                           121                            /* 'debugger' */\n#define DUK_HEAP_STRING_DEBUGGER(heap)                                DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEBUGGER)\n#define DUK_HTHREAD_STRING_DEBUGGER(thr)                              DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEBUGGER)\n#define DUK_STRIDX_DEFAULT                                            122                            /* 'default' */\n#define DUK_HEAP_STRING_DEFAULT(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DEFAULT)\n#define DUK_HTHREAD_STRING_DEFAULT(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DEFAULT)\n#define DUK_STRIDX_DELETE                                             123                            /* 'delete' */\n#define DUK_HEAP_STRING_DELETE(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DELETE)\n#define DUK_HTHREAD_STRING_DELETE(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DELETE)\n#define DUK_STRIDX_DO                                                 124                            /* 'do' */\n#define DUK_HEAP_STRING_DO(heap)                                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_DO)\n#define DUK_HTHREAD_STRING_DO(thr)                                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_DO)\n#define DUK_STRIDX_ELSE                                               125                            /* 'else' */\n#define DUK_HEAP_STRING_ELSE(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ELSE)\n#define DUK_HTHREAD_STRING_ELSE(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ELSE)\n#define DUK_STRIDX_FINALLY                                            126                            /* 'finally' */\n#define DUK_HEAP_STRING_FINALLY(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FINALLY)\n#define DUK_HTHREAD_STRING_FINALLY(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FINALLY)\n#define DUK_STRIDX_FOR                                                127                            /* 'for' */\n#define DUK_HEAP_STRING_FOR(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FOR)\n#define DUK_HTHREAD_STRING_FOR(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FOR)\n#define DUK_STRIDX_LC_FUNCTION                                        128                            /* 'function' */\n#define DUK_HEAP_STRING_LC_FUNCTION(heap)                             DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_FUNCTION)\n#define DUK_HTHREAD_STRING_LC_FUNCTION(thr)                           DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_FUNCTION)\n#define DUK_STRIDX_IF                                                 129                            /* 'if' */\n#define DUK_HEAP_STRING_IF(heap)                                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IF)\n#define DUK_HTHREAD_STRING_IF(thr)                                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IF)\n#define DUK_STRIDX_IN                                                 130                            /* 'in' */\n#define DUK_HEAP_STRING_IN(heap)                                      DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IN)\n#define DUK_HTHREAD_STRING_IN(thr)                                    DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IN)\n#define DUK_STRIDX_INSTANCEOF                                         131                            /* 'instanceof' */\n#define DUK_HEAP_STRING_INSTANCEOF(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INSTANCEOF)\n#define DUK_HTHREAD_STRING_INSTANCEOF(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INSTANCEOF)\n#define DUK_STRIDX_NEW                                                132                            /* 'new' */\n#define DUK_HEAP_STRING_NEW(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_NEW)\n#define DUK_HTHREAD_STRING_NEW(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_NEW)\n#define DUK_STRIDX_RETURN                                             133                            /* 'return' */\n#define DUK_HEAP_STRING_RETURN(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_RETURN)\n#define DUK_HTHREAD_STRING_RETURN(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_RETURN)\n#define DUK_STRIDX_SWITCH                                             134                            /* 'switch' */\n#define DUK_HEAP_STRING_SWITCH(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SWITCH)\n#define DUK_HTHREAD_STRING_SWITCH(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SWITCH)\n#define DUK_STRIDX_THIS                                               135                            /* 'this' */\n#define DUK_HEAP_STRING_THIS(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THIS)\n#define DUK_HTHREAD_STRING_THIS(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THIS)\n#define DUK_STRIDX_THROW                                              136                            /* 'throw' */\n#define DUK_HEAP_STRING_THROW(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_THROW)\n#define DUK_HTHREAD_STRING_THROW(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_THROW)\n#define DUK_STRIDX_TRY                                                137                            /* 'try' */\n#define DUK_HEAP_STRING_TRY(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRY)\n#define DUK_HTHREAD_STRING_TRY(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRY)\n#define DUK_STRIDX_TYPEOF                                             138                            /* 'typeof' */\n#define DUK_HEAP_STRING_TYPEOF(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TYPEOF)\n#define DUK_HTHREAD_STRING_TYPEOF(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TYPEOF)\n#define DUK_STRIDX_VAR                                                139                            /* 'var' */\n#define DUK_HEAP_STRING_VAR(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VAR)\n#define DUK_HTHREAD_STRING_VAR(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VAR)\n#define DUK_STRIDX_CONST                                              140                            /* 'const' */\n#define DUK_HEAP_STRING_CONST(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CONST)\n#define DUK_HTHREAD_STRING_CONST(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CONST)\n#define DUK_STRIDX_VOID                                               141                            /* 'void' */\n#define DUK_HEAP_STRING_VOID(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_VOID)\n#define DUK_HTHREAD_STRING_VOID(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_VOID)\n#define DUK_STRIDX_WHILE                                              142                            /* 'while' */\n#define DUK_HEAP_STRING_WHILE(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WHILE)\n#define DUK_HTHREAD_STRING_WHILE(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WHILE)\n#define DUK_STRIDX_WITH                                               143                            /* 'with' */\n#define DUK_HEAP_STRING_WITH(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_WITH)\n#define DUK_HTHREAD_STRING_WITH(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_WITH)\n#define DUK_STRIDX_CLASS                                              144                            /* 'class' */\n#define DUK_HEAP_STRING_CLASS(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_CLASS)\n#define DUK_HTHREAD_STRING_CLASS(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_CLASS)\n#define DUK_STRIDX_ENUM                                               145                            /* 'enum' */\n#define DUK_HEAP_STRING_ENUM(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_ENUM)\n#define DUK_HTHREAD_STRING_ENUM(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_ENUM)\n#define DUK_STRIDX_EXPORT                                             146                            /* 'export' */\n#define DUK_HEAP_STRING_EXPORT(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXPORT)\n#define DUK_HTHREAD_STRING_EXPORT(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXPORT)\n#define DUK_STRIDX_EXTENDS                                            147                            /* 'extends' */\n#define DUK_HEAP_STRING_EXTENDS(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_EXTENDS)\n#define DUK_HTHREAD_STRING_EXTENDS(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_EXTENDS)\n#define DUK_STRIDX_IMPORT                                             148                            /* 'import' */\n#define DUK_HEAP_STRING_IMPORT(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPORT)\n#define DUK_HTHREAD_STRING_IMPORT(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPORT)\n#define DUK_STRIDX_SUPER                                              149                            /* 'super' */\n#define DUK_HEAP_STRING_SUPER(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_SUPER)\n#define DUK_HTHREAD_STRING_SUPER(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_SUPER)\n#define DUK_STRIDX_LC_NULL                                            150                            /* 'null' */\n#define DUK_HEAP_STRING_LC_NULL(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LC_NULL)\n#define DUK_HTHREAD_STRING_LC_NULL(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LC_NULL)\n#define DUK_STRIDX_TRUE                                               151                            /* 'true' */\n#define DUK_HEAP_STRING_TRUE(heap)                                    DUK_HEAP_GET_STRING((heap),DUK_STRIDX_TRUE)\n#define DUK_HTHREAD_STRING_TRUE(thr)                                  DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_TRUE)\n#define DUK_STRIDX_FALSE                                              152                            /* 'false' */\n#define DUK_HEAP_STRING_FALSE(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_FALSE)\n#define DUK_HTHREAD_STRING_FALSE(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_FALSE)\n#define DUK_STRIDX_IMPLEMENTS                                         153                            /* 'implements' */\n#define DUK_HEAP_STRING_IMPLEMENTS(heap)                              DUK_HEAP_GET_STRING((heap),DUK_STRIDX_IMPLEMENTS)\n#define DUK_HTHREAD_STRING_IMPLEMENTS(thr)                            DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_IMPLEMENTS)\n#define DUK_STRIDX_INTERFACE                                          154                            /* 'interface' */\n#define DUK_HEAP_STRING_INTERFACE(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_INTERFACE)\n#define DUK_HTHREAD_STRING_INTERFACE(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_INTERFACE)\n#define DUK_STRIDX_LET                                                155                            /* 'let' */\n#define DUK_HEAP_STRING_LET(heap)                                     DUK_HEAP_GET_STRING((heap),DUK_STRIDX_LET)\n#define DUK_HTHREAD_STRING_LET(thr)                                   DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_LET)\n#define DUK_STRIDX_PACKAGE                                            156                            /* 'package' */\n#define DUK_HEAP_STRING_PACKAGE(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PACKAGE)\n#define DUK_HTHREAD_STRING_PACKAGE(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PACKAGE)\n#define DUK_STRIDX_PRIVATE                                            157                            /* 'private' */\n#define DUK_HEAP_STRING_PRIVATE(heap)                                 DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PRIVATE)\n#define DUK_HTHREAD_STRING_PRIVATE(thr)                               DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PRIVATE)\n#define DUK_STRIDX_PROTECTED                                          158                            /* 'protected' */\n#define DUK_HEAP_STRING_PROTECTED(heap)                               DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PROTECTED)\n#define DUK_HTHREAD_STRING_PROTECTED(thr)                             DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PROTECTED)\n#define DUK_STRIDX_PUBLIC                                             159                            /* 'public' */\n#define DUK_HEAP_STRING_PUBLIC(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_PUBLIC)\n#define DUK_HTHREAD_STRING_PUBLIC(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_PUBLIC)\n#define DUK_STRIDX_STATIC                                             160                            /* 'static' */\n#define DUK_HEAP_STRING_STATIC(heap)                                  DUK_HEAP_GET_STRING((heap),DUK_STRIDX_STATIC)\n#define DUK_HTHREAD_STRING_STATIC(thr)                                DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_STATIC)\n#define DUK_STRIDX_YIELD                                              161                            /* 'yield' */\n#define DUK_HEAP_STRING_YIELD(heap)                                   DUK_HEAP_GET_STRING((heap),DUK_STRIDX_YIELD)\n#define DUK_HTHREAD_STRING_YIELD(thr)                                 DUK_HTHREAD_GET_STRING((thr),DUK_STRIDX_YIELD)\n\n#define DUK_HEAP_NUM_STRINGS                                          162\n#define DUK_STRIDX_START_RESERVED                                     117\n#define DUK_STRIDX_START_STRICT_RESERVED                              153\n#define DUK_STRIDX_END_RESERVED                                       162                            /* exclusive endpoint */\n\n/* To convert a heap stridx to a token number, subtract\n * DUK_STRIDX_START_RESERVED and add DUK_TOK_START_RESERVED.\n */\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL const duk_uint8_t duk_strings_data[892];\n#endif  /* !DUK_SINGLE_FILE */\n#define DUK_STRDATA_MAX_STRLEN                                        17\n#define DUK_STRDATA_DATA_LENGTH                                       892\n#endif  /* DUK_USE_ROM_STRINGS */\n\n#if defined(DUK_USE_ROM_OBJECTS)\n#error RAM support not enabled, rerun configure.py with --ram-support\n#else  /* DUK_USE_ROM_OBJECTS */\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_function_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_number_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_constructor_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_type_error_thrower(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_thread_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_proxy_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_dataview_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_constructor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_eval(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_int(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_parse_float(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_nan(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_is_finite(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_decode_uri_component(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_encode_uri_component(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_escape(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_global_object_unescape(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_getprototype_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_setprototype_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_keys_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_assign(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_create(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_property(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_define_properties(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is_extensible(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_constructor_is(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_value_of(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_has_own_property(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_to_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_apply(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_call(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype_bind(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_length(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_native_function_name(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_constructor_is_array(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_to_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_join_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_concat(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_pop(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_push(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reverse(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_shift(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_slice(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_sort(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_splice(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_unshift(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_iter_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_char_code(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_constructor_from_code_point(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_to_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_at(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_char_code_at(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_concat(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_locale_compare(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_match(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_replace(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_search(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_slice(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_split(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substring(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_trim(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_repeat(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_includes(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_string_prototype_substr(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_value_of(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_fixed(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_exponential(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_number_prototype_to_precision(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_parse(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_utc(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_constructor_now(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_to_json(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_value_of(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_time(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_date_prototype_set_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_exec(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_test(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_tostring(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_flags(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_stack_setter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_filename_setter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_error_prototype_to_string(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_onearg_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_twoarg_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_clz32(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_hypot(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_imul(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_max(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_min(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_random(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_math_object_sign(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_parse(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_json_object_stringify(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_info(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_act(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_gc(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_fin(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_enc(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_dec(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_duktape_object_compact(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_thread_yield(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_thread_resume(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_thread_current(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_apply(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_construct(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_delete_property(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_get(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_has(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_reflect_object_set(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_arraybuffer_isview(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_slice_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_buffer_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_readfield(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_writefield(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_typedarray_set(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_allocplain(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_uint8array_plainof(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_concat(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_buffer_compare_shared(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_fill(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_copy(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_nodejs_buffer_write(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_textencoder_prototype_encode(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_context *ctx);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_performance_now(duk_context *ctx);\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL const duk_c_function duk_bi_native_functions[176];\n#endif  /* !DUK_SINGLE_FILE */\n#define DUK_BIDX_GLOBAL                                               0\n#define DUK_BIDX_GLOBAL_ENV                                           1\n#define DUK_BIDX_OBJECT_CONSTRUCTOR                                   2\n#define DUK_BIDX_OBJECT_PROTOTYPE                                     3\n#define DUK_BIDX_FUNCTION_CONSTRUCTOR                                 4\n#define DUK_BIDX_FUNCTION_PROTOTYPE                                   5\n#define DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE                            6\n#define DUK_BIDX_ARRAY_CONSTRUCTOR                                    7\n#define DUK_BIDX_ARRAY_PROTOTYPE                                      8\n#define DUK_BIDX_STRING_CONSTRUCTOR                                   9\n#define DUK_BIDX_STRING_PROTOTYPE                                     10\n#define DUK_BIDX_BOOLEAN_CONSTRUCTOR                                  11\n#define DUK_BIDX_BOOLEAN_PROTOTYPE                                    12\n#define DUK_BIDX_NUMBER_CONSTRUCTOR                                   13\n#define DUK_BIDX_NUMBER_PROTOTYPE                                     14\n#define DUK_BIDX_DATE_CONSTRUCTOR                                     15\n#define DUK_BIDX_DATE_PROTOTYPE                                       16\n#define DUK_BIDX_REGEXP_CONSTRUCTOR                                   17\n#define DUK_BIDX_REGEXP_PROTOTYPE                                     18\n#define DUK_BIDX_ERROR_CONSTRUCTOR                                    19\n#define DUK_BIDX_ERROR_PROTOTYPE                                      20\n#define DUK_BIDX_EVAL_ERROR_CONSTRUCTOR                               21\n#define DUK_BIDX_EVAL_ERROR_PROTOTYPE                                 22\n#define DUK_BIDX_RANGE_ERROR_CONSTRUCTOR                              23\n#define DUK_BIDX_RANGE_ERROR_PROTOTYPE                                24\n#define DUK_BIDX_REFERENCE_ERROR_CONSTRUCTOR                          25\n#define DUK_BIDX_REFERENCE_ERROR_PROTOTYPE                            26\n#define DUK_BIDX_SYNTAX_ERROR_CONSTRUCTOR                             27\n#define DUK_BIDX_SYNTAX_ERROR_PROTOTYPE                               28\n#define DUK_BIDX_TYPE_ERROR_CONSTRUCTOR                               29\n#define DUK_BIDX_TYPE_ERROR_PROTOTYPE                                 30\n#define DUK_BIDX_URI_ERROR_CONSTRUCTOR                                31\n#define DUK_BIDX_URI_ERROR_PROTOTYPE                                  32\n#define DUK_BIDX_TYPE_ERROR_THROWER                                   33\n#define DUK_BIDX_DUKTAPE                                              34\n#define DUK_BIDX_THREAD_PROTOTYPE                                     35\n#define DUK_BIDX_POINTER_PROTOTYPE                                    36\n#define DUK_BIDX_DOUBLE_ERROR                                         37\n#define DUK_BIDX_SYMBOL_PROTOTYPE                                     38\n#define DUK_BIDX_ARRAYBUFFER_PROTOTYPE                                39\n#define DUK_BIDX_DATAVIEW_PROTOTYPE                                   40\n#define DUK_BIDX_INT8ARRAY_PROTOTYPE                                  41\n#define DUK_BIDX_UINT8ARRAY_PROTOTYPE                                 42\n#define DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE                          43\n#define DUK_BIDX_INT16ARRAY_PROTOTYPE                                 44\n#define DUK_BIDX_UINT16ARRAY_PROTOTYPE                                45\n#define DUK_BIDX_INT32ARRAY_PROTOTYPE                                 46\n#define DUK_BIDX_UINT32ARRAY_PROTOTYPE                                47\n#define DUK_BIDX_FLOAT32ARRAY_PROTOTYPE                               48\n#define DUK_BIDX_FLOAT64ARRAY_PROTOTYPE                               49\n#define DUK_BIDX_NODEJS_BUFFER_PROTOTYPE                              50\n#define DUK_NUM_BUILTINS                                              51\n#define DUK_NUM_BIDX_BUILTINS                                         51\n#define DUK_NUM_ALL_BUILTINS                                          76\n#if defined(DUK_USE_DOUBLE_LE)\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972];\n#endif  /* !DUK_SINGLE_FILE */\n#define DUK_BUILTINS_DATA_LENGTH                                      3972\n#elif defined(DUK_USE_DOUBLE_BE)\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972];\n#endif  /* !DUK_SINGLE_FILE */\n#define DUK_BUILTINS_DATA_LENGTH                                      3972\n#elif defined(DUK_USE_DOUBLE_ME)\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL const duk_uint8_t duk_builtins_data[3972];\n#endif  /* !DUK_SINGLE_FILE */\n#define DUK_BUILTINS_DATA_LENGTH                                      3972\n#else\n#error invalid endianness defines\n#endif\n#endif  /* DUK_USE_ROM_OBJECTS */\n#endif  /* DUK_BUILTINS_H_INCLUDED */\n#line 51 \"duk_internal.h\"\n\n/* #include duk_util.h */\n#line 1 \"duk_util.h\"\n/*\n *  Utilities\n */\n\n#if !defined(DUK_UTIL_H_INCLUDED)\n#define DUK_UTIL_H_INCLUDED\n\n#if defined(DUK_USE_GET_RANDOM_DOUBLE)\n#define DUK_UTIL_GET_RANDOM_DOUBLE(thr) DUK_USE_GET_RANDOM_DOUBLE((thr)->heap_udata)\n#else\n#define DUK_UTIL_GET_RANDOM_DOUBLE(thr) duk_util_tinyrandom_get_double(thr)\n#endif\n\n/*\n *  Some useful constants\n */\n\n#define DUK_DOUBLE_2TO32     4294967296.0\n#define DUK_DOUBLE_2TO31     2147483648.0\n#define DUK_DOUBLE_LOG2E     1.4426950408889634\n#define DUK_DOUBLE_LOG10E    0.4342944819032518\n\n/*\n *  Endian conversion\n */\n\n#if defined(DUK_USE_INTEGER_LE)\n#define DUK_HTON32(x) DUK_BSWAP32((x))\n#define DUK_NTOH32(x) DUK_BSWAP32((x))\n#define DUK_HTON16(x) DUK_BSWAP16((x))\n#define DUK_NTOH16(x) DUK_BSWAP16((x))\n#elif defined(DUK_USE_INTEGER_BE)\n#define DUK_HTON32(x) (x)\n#define DUK_NTOH32(x) (x)\n#define DUK_HTON16(x) (x)\n#define DUK_NTOH16(x) (x)\n#else\n#error internal error, endianness defines broken\n#endif\n\n/*\n *  Bitstream decoder\n */\n\nstruct duk_bitdecoder_ctx {\n\tconst duk_uint8_t *data;\n\tduk_size_t offset;\n\tduk_size_t length;\n\tduk_uint32_t currval;\n\tduk_small_int_t currbits;\n};\n\n#define DUK_BD_BITPACKED_STRING_MAXLEN 256\n\n/*\n *  Bitstream encoder\n */\n\nstruct duk_bitencoder_ctx {\n\tduk_uint8_t *data;\n\tduk_size_t offset;\n\tduk_size_t length;\n\tduk_uint32_t currval;\n\tduk_small_int_t currbits;\n\tduk_small_int_t truncated;\n};\n\n/*\n *  Raw write/read macros for big endian, unaligned basic values.\n *  Caller ensures there's enough space.  The macros update the pointer\n *  argument automatically on resizes.  The idiom seems a bit odd, but\n *  leads to compact code.\n */\n\n#define DUK_RAW_WRITE_U8(ptr,val)  do { \\\n\t\t*(ptr)++ = (duk_uint8_t) (val); \\\n\t} while (0)\n#define DUK_RAW_WRITE_U16_BE(ptr,val) duk_raw_write_u16_be(&(ptr), (duk_uint16_t) (val))\n#define DUK_RAW_WRITE_U32_BE(ptr,val) duk_raw_write_u32_be(&(ptr), (duk_uint32_t) (val))\n#define DUK_RAW_WRITE_DOUBLE_BE(ptr,val) duk_raw_write_double_be(&(ptr), (duk_double_t) (val))\n#define DUK_RAW_WRITE_XUTF8(ptr,val)  do { \\\n\t\t/* 'ptr' is evaluated both as LHS and RHS. */ \\\n\t\tduk_uint8_t *duk__ptr; \\\n\t\tduk_small_int_t duk__len; \\\n\t\tduk__ptr = (duk_uint8_t *) (ptr); \\\n\t\tduk__len = duk_unicode_encode_xutf8((duk_ucodepoint_t) (val), duk__ptr); \\\n\t\tduk__ptr += duk__len; \\\n\t\t(ptr) = duk__ptr; \\\n\t} while (0)\n#define DUK_RAW_WRITE_CESU8(ptr,val)  do { \\\n\t\t/* 'ptr' is evaluated both as LHS and RHS. */ \\\n\t\tduk_uint8_t *duk__ptr; \\\n\t\tduk_small_int_t duk__len; \\\n\t\tduk__ptr = (duk_uint8_t *) (ptr); \\\n\t\tduk__len = duk_unicode_encode_cesu8((duk_ucodepoint_t) (val), duk__ptr); \\\n\t\tduk__ptr += duk__len; \\\n\t\t(ptr) = duk__ptr; \\\n\t} while (0)\n\n#define DUK_RAW_READ_U8(ptr) ((duk_uint8_t) (*(ptr)++))\n#define DUK_RAW_READ_U16_BE(ptr) duk_raw_read_u16_be(&(ptr));\n#define DUK_RAW_READ_U32_BE(ptr) duk_raw_read_u32_be(&(ptr));\n#define DUK_RAW_READ_DOUBLE_BE(ptr) duk_raw_read_double_be(&(ptr));\n\n/*\n *  Buffer writer (dynamic buffer only)\n *\n *  Helper for writing to a dynamic buffer with a concept of a \"slack\" area\n *  to reduce resizes.  You can ensure there is enough space beforehand and\n *  then write for a while without further checks, relying on a stable data\n *  pointer.  Slack handling is automatic so call sites only indicate how\n *  much data they need right now.\n *\n *  There are several ways to write using bufwriter.  The best approach\n *  depends mainly on how much performance matters over code footprint.\n *  The key issues are (1) ensuring there is space and (2) keeping the\n *  pointers consistent.  Fast code should ensure space for multiple writes\n *  with one ensure call.  Fastest inner loop code can temporarily borrow\n *  the 'p' pointer but must write it back eventually.\n *\n *  Be careful to ensure all macro arguments (other than static pointers like\n *  'thr' and 'bw_ctx') are evaluated exactly once, using temporaries if\n *  necessary (if that's not possible, there should be a note near the macro).\n *  Buffer write arguments often contain arithmetic etc so this is\n *  particularly important here.\n */\n\n/* XXX: Migrate bufwriter and other read/write helpers to its own header? */\n\nstruct duk_bufwriter_ctx {\n\tduk_uint8_t *p;\n\tduk_uint8_t *p_base;\n\tduk_uint8_t *p_limit;\n\tduk_hbuffer_dynamic *buf;\n};\n\n#if defined(DUK_USE_PREFER_SIZE)\n#define DUK_BW_SLACK_ADD           64\n#define DUK_BW_SLACK_SHIFT         4    /* 2^4 -> 1/16 = 6.25% slack */\n#else\n#define DUK_BW_SLACK_ADD           64\n#define DUK_BW_SLACK_SHIFT         2    /* 2^2 -> 1/4 = 25% slack */\n#endif\n\n/* Initialization and finalization (compaction), converting to other types. */\n\n#define DUK_BW_INIT_PUSHBUF(thr,bw_ctx,sz) do { \\\n\t\tduk_bw_init_pushbuf((thr), (bw_ctx), (sz)); \\\n\t} while (0)\n#define DUK_BW_INIT_WITHBUF(thr,bw_ctx,buf) do { \\\n\t\tduk_bw_init((thr), (bw_ctx), (buf)); \\\n\t} while (0)\n#define DUK_BW_COMPACT(thr,bw_ctx) do { \\\n\t\t/* Make underlying buffer compact to match DUK_BW_GET_SIZE(). */ \\\n\t\tduk_bw_compact((thr), (bw_ctx)); \\\n\t} while (0)\n#define DUK_BW_PUSH_AS_STRING(thr,bw_ctx) do { \\\n\t\tduk_push_lstring((thr), \\\n\t\t                 (const char *) (bw_ctx)->p_base, \\\n\t\t                 (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \\\n\t} while (0)\n/* Pointers may be NULL for a while when 'buf' size is zero and before any\n * ENSURE calls have been made.  Once an ENSURE has been made, the pointers\n * are required to be non-NULL so that it's always valid to use memcpy() and\n * memmove(), even for zero size.\n */\n#define DUK_BW_ASSERT_VALID_EXPR(thr,bw_ctx) \\\n\tDUK_ASSERT_EXPR((bw_ctx) != NULL && \\\n\t                (bw_ctx)->buf != NULL && \\\n\t\t\t((DUK_HBUFFER_DYNAMIC_GET_SIZE((bw_ctx)->buf) == 0) || \\\n\t\t\t\t((bw_ctx)->p != NULL && \\\n\t\t                 (bw_ctx)->p_base != NULL && \\\n\t\t                 (bw_ctx)->p_limit != NULL && \\\n\t\t                 (bw_ctx)->p_limit >= (bw_ctx)->p_base && \\\n\t\t                 (bw_ctx)->p >= (bw_ctx)->p_base && \\\n\t\t                 (bw_ctx)->p <= (bw_ctx)->p_limit)))\n#define DUK_BW_ASSERT_VALID(thr,bw_ctx) do { \\\n\t\tDUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)); \\\n\t} while (0)\n\n/* Working with the pointer and current size. */\n\n#define DUK_BW_GET_PTR(thr,bw_ctx) \\\n\t((bw_ctx)->p)\n#define DUK_BW_SET_PTR(thr,bw_ctx,ptr) do { \\\n\t\t(bw_ctx)->p = (ptr); \\\n\t} while (0)\n#define DUK_BW_ADD_PTR(thr,bw_ctx,delta) do { \\\n\t\t(bw_ctx)->p += (delta); \\\n\t} while (0)\n#define DUK_BW_GET_BASEPTR(thr,bw_ctx) \\\n\t((bw_ctx)->p_base)\n#define DUK_BW_GET_LIMITPTR(thr,bw_ctx) \\\n\t((bw_ctx)->p_limit)\n#define DUK_BW_GET_SIZE(thr,bw_ctx) \\\n\t((duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base))\n#define DUK_BW_SET_SIZE(thr,bw_ctx,sz) do { \\\n\t\tDUK_ASSERT((duk_size_t) (sz) <= (duk_size_t) ((bw_ctx)->p - (bw_ctx)->p_base)); \\\n\t\t(bw_ctx)->p = (bw_ctx)->p_base + (sz); \\\n\t} while (0)\n#define DUK_BW_RESET_SIZE(thr,bw_ctx) do { \\\n\t\t/* Reset to zero size, keep current limit. */ \\\n\t\t(bw_ctx)->p = (bw_ctx)->p_base; \\\n\t} while (0)\n#define DUK_BW_GET_BUFFER(thr,bw_ctx) \\\n\t((bw_ctx)->buf)\n\n/* Ensuring (reserving) space. */\n\n#define DUK_BW_ENSURE(thr,bw_ctx,sz) do { \\\n\t\tduk_size_t duk__sz, duk__space; \\\n\t\tDUK_BW_ASSERT_VALID((thr), (bw_ctx)); \\\n\t\tduk__sz = (sz); \\\n\t\tduk__space = (duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p); \\\n\t\tif (duk__space < duk__sz) { \\\n\t\t\t(void) duk_bw_resize((thr), (bw_ctx), duk__sz); \\\n\t\t} \\\n\t} while (0)\n/* NOTE: Multiple evaluation of 'ptr' in this macro. */\n/* XXX: Rework to use an always-inline function? */\n#define DUK_BW_ENSURE_RAW(thr,bw_ctx,sz,ptr) \\\n\t(((duk_size_t) ((bw_ctx)->p_limit - (ptr)) >= (sz)) ? \\\n\t (ptr) : \\\n\t ((bw_ctx)->p = (ptr), duk_bw_resize((thr),(bw_ctx),(sz))))\n#define DUK_BW_ENSURE_GETPTR(thr,bw_ctx,sz) \\\n\tDUK_BW_ENSURE_RAW((thr), (bw_ctx), (sz), (bw_ctx)->p)\n#define DUK_BW_ASSERT_SPACE_EXPR(thr,bw_ctx,sz) \\\n\t(DUK_BW_ASSERT_VALID_EXPR((thr), (bw_ctx)), \\\n\t DUK_ASSERT_EXPR((duk_size_t) ((bw_ctx)->p_limit - (bw_ctx)->p) >= (duk_size_t) (sz)))\n#define DUK_BW_ASSERT_SPACE(thr,bw_ctx,sz) do { \\\n\t\tDUK_BW_ASSERT_SPACE_EXPR((thr), (bw_ctx), (sz)); \\\n\t} while (0)\n\n/* Miscellaneous. */\n\n#define DUK_BW_SETPTR_AND_COMPACT(thr,bw_ctx,ptr) do { \\\n\t\t(bw_ctx)->p = (ptr); \\\n\t\tduk_bw_compact((thr), (bw_ctx)); \\\n\t} while (0)\n\n/* Fast write calls which assume you control the slack beforehand.\n * Multibyte write variants exist and use a temporary write pointer\n * because byte writes alias with anything: with a stored pointer\n * explicit pointer load/stores get generated (e.g. gcc -Os).\n */\n\n#define DUK_BW_WRITE_RAW_U8(thr,bw_ctx,val) do { \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), 1); \\\n\t\t*(bw_ctx)->p++ = (duk_uint8_t) (val); \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_U8_2(thr,bw_ctx,val1,val2) do { \\\n\t\tduk_uint8_t *duk__p; \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), 2); \\\n\t\tduk__p = (bw_ctx)->p; \\\n\t\t*duk__p++ = (duk_uint8_t) (val1); \\\n\t\t*duk__p++ = (duk_uint8_t) (val2); \\\n\t\t(bw_ctx)->p = duk__p; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_U8_3(thr,bw_ctx,val1,val2,val3) do { \\\n\t\tduk_uint8_t *duk__p; \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), 3); \\\n\t\tduk__p = (bw_ctx)->p; \\\n\t\t*duk__p++ = (duk_uint8_t) (val1); \\\n\t\t*duk__p++ = (duk_uint8_t) (val2); \\\n\t\t*duk__p++ = (duk_uint8_t) (val3); \\\n\t\t(bw_ctx)->p = duk__p; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \\\n\t\tduk_uint8_t *duk__p; \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), 4); \\\n\t\tduk__p = (bw_ctx)->p; \\\n\t\t*duk__p++ = (duk_uint8_t) (val1); \\\n\t\t*duk__p++ = (duk_uint8_t) (val2); \\\n\t\t*duk__p++ = (duk_uint8_t) (val3); \\\n\t\t*duk__p++ = (duk_uint8_t) (val4); \\\n\t\t(bw_ctx)->p = duk__p; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \\\n\t\tduk_uint8_t *duk__p; \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), 5); \\\n\t\tduk__p = (bw_ctx)->p; \\\n\t\t*duk__p++ = (duk_uint8_t) (val1); \\\n\t\t*duk__p++ = (duk_uint8_t) (val2); \\\n\t\t*duk__p++ = (duk_uint8_t) (val3); \\\n\t\t*duk__p++ = (duk_uint8_t) (val4); \\\n\t\t*duk__p++ = (duk_uint8_t) (val5); \\\n\t\t(bw_ctx)->p = duk__p; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \\\n\t\tduk_uint8_t *duk__p; \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), 6); \\\n\t\tduk__p = (bw_ctx)->p; \\\n\t\t*duk__p++ = (duk_uint8_t) (val1); \\\n\t\t*duk__p++ = (duk_uint8_t) (val2); \\\n\t\t*duk__p++ = (duk_uint8_t) (val3); \\\n\t\t*duk__p++ = (duk_uint8_t) (val4); \\\n\t\t*duk__p++ = (duk_uint8_t) (val5); \\\n\t\t*duk__p++ = (duk_uint8_t) (val6); \\\n\t\t(bw_ctx)->p = duk__p; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_XUTF8(thr,bw_ctx,cp) do { \\\n\t\tduk_ucodepoint_t duk__cp; \\\n\t\tduk_small_int_t duk__enc_len; \\\n\t\tduk__cp = (duk_ucodepoint_t) (cp); \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_xutf8_length(duk__cp)); \\\n\t\tduk__enc_len = duk_unicode_encode_xutf8(duk__cp, (bw_ctx)->p); \\\n\t\t(bw_ctx)->p += duk__enc_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_CESU8(thr,bw_ctx,cp) do { \\\n\t\tduk_ucodepoint_t duk__cp; \\\n\t\tduk_small_int_t duk__enc_len; \\\n\t\tduk__cp = (duk_ucodepoint_t) (cp); \\\n\t\tDUK_BW_ASSERT_SPACE((thr), (bw_ctx), duk_unicode_get_cesu8_length(duk__cp)); \\\n\t\tduk__enc_len = duk_unicode_encode_cesu8(duk__cp, (bw_ctx)->p); \\\n\t\t(bw_ctx)->p += duk__enc_len; \\\n\t} while (0)\n/* XXX: add temporary duk__p pointer here too; sharing */\n#define DUK_BW_WRITE_RAW_BYTES(thr,bw_ctx,valptr,valsz) do { \\\n\t\tconst void *duk__valptr; \\\n\t\tduk_size_t duk__valsz; \\\n\t\tduk__valptr = (const void *) (valptr); \\\n\t\tduk__valsz = (duk_size_t) (valsz); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \\\n\t\t(bw_ctx)->p += duk__valsz; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_CSTRING(thr,bw_ctx,val) do { \\\n\t\tconst duk_uint8_t *duk__val; \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val = (const duk_uint8_t *) (val); \\\n\t\tduk__val_len = DUK_STRLEN((const char *) duk__val); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_HSTRING(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_HBUFFER(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HBUFFER_GET_SIZE((val)); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_HBUFFER_FIXED(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_RAW_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n\n/* Append bytes from a slice already in the buffer. */\n#define DUK_BW_WRITE_RAW_SLICE(thr,bw,dst_off,dst_len) \\\n\tduk_bw_write_raw_slice((thr), (bw), (dst_off), (dst_len))\n\n/* Insert bytes in the middle of the buffer from an external buffer. */\n#define DUK_BW_INSERT_RAW_BYTES(thr,bw,dst_off,buf,len) \\\n\tduk_bw_insert_raw_bytes((thr), (bw), (dst_off), (buf), (len))\n\n/* Insert bytes in the middle of the buffer from a slice already\n * in the buffer.  Source offset is interpreted \"before\" the operation.\n */\n#define DUK_BW_INSERT_RAW_SLICE(thr,bw,dst_off,src_off,len) \\\n\tduk_bw_insert_raw_slice((thr), (bw), (dst_off), (src_off), (len))\n\n/* Insert a reserved area somewhere in the buffer; caller fills it.\n * Evaluates to a (duk_uint_t *) pointing to the start of the reserved\n * area for convenience.\n */\n#define DUK_BW_INSERT_RAW_AREA(thr,bw,off,len) \\\n\tduk_bw_insert_raw_area((thr), (bw), (off), (len))\n\n/* Remove a slice from inside buffer. */\n#define DUK_BW_REMOVE_RAW_SLICE(thr,bw,off,len) \\\n\tduk_bw_remove_raw_slice((thr), (bw), (off), (len))\n\n/* Safe write calls which will ensure space first. */\n\n#define DUK_BW_WRITE_ENSURE_U8(thr,bw_ctx,val) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), 1); \\\n\t\tDUK_BW_WRITE_RAW_U8((thr), (bw_ctx), (val)); \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_U8_2(thr,bw_ctx,val1,val2) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), 2); \\\n\t\tDUK_BW_WRITE_RAW_U8_2((thr), (bw_ctx), (val1), (val2)); \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_U8_3(thr,bw_ctx,val1,val2,val3) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), 3); \\\n\t\tDUK_BW_WRITE_RAW_U8_3((thr), (bw_ctx), (val1), (val2), (val3)); \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_U8_4(thr,bw_ctx,val1,val2,val3,val4) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), 4); \\\n\t\tDUK_BW_WRITE_RAW_U8_4((thr), (bw_ctx), (val1), (val2), (val3), (val4)); \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_U8_5(thr,bw_ctx,val1,val2,val3,val4,val5) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), 5); \\\n\t\tDUK_BW_WRITE_RAW_U8_5((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5)); \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_U8_6(thr,bw_ctx,val1,val2,val3,val4,val5,val6) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), 6); \\\n\t\tDUK_BW_WRITE_RAW_U8_6((thr), (bw_ctx), (val1), (val2), (val3), (val4), (val5), (val6)); \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_XUTF8(thr,bw_ctx,cp) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_XUTF8_LENGTH); \\\n\t\tDUK_BW_WRITE_RAW_XUTF8((thr), (bw_ctx), (cp)); \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_CESU8(thr,bw_ctx,cp) do { \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), DUK_UNICODE_MAX_CESU8_LENGTH); \\\n\t\tDUK_BW_WRITE_RAW_CESU8((thr), (bw_ctx), (cp)); \\\n\t} while (0)\n/* XXX: add temporary duk__p pointer here too; sharing */\n#define DUK_BW_WRITE_ENSURE_BYTES(thr,bw_ctx,valptr,valsz) do { \\\n\t\tconst void *duk__valptr; \\\n\t\tduk_size_t duk__valsz; \\\n\t\tduk__valptr = (const void *) (valptr); \\\n\t\tduk__valsz = (duk_size_t) (valsz); \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), duk__valsz); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), duk__valptr, duk__valsz); \\\n\t\t(bw_ctx)->p += duk__valsz; \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_CSTRING(thr,bw_ctx,val) do { \\\n\t\tconst duk_uint8_t *duk__val; \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val = (const duk_uint8_t *) (val); \\\n\t\tduk__val_len = DUK_STRLEN((const char *) duk__val); \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) duk__val, duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_HSTRING(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HSTRING_GET_BYTELEN((val)); \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HSTRING_GET_DATA((val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_HBUFFER(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HBUFFER_GET_SIZE((val)); \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_HBUFFER_FIXED(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HBUFFER_FIXED_GET_SIZE((val)); \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_FIXED_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n#define DUK_BW_WRITE_ENSURE_HBUFFER_DYNAMIC(thr,bw_ctx,val) do { \\\n\t\tduk_size_t duk__val_len; \\\n\t\tduk__val_len = DUK_HBUFFER_DYNAMIC_GET_SIZE((val)); \\\n\t\tDUK_BW_ENSURE((thr), (bw_ctx), duk__val_len); \\\n\t\tDUK_MEMCPY((void *) ((bw_ctx)->p), (const void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR((thr)->heap, (val)), duk__val_len); \\\n\t\t(bw_ctx)->p += duk__val_len; \\\n\t} while (0)\n\n#define DUK_BW_WRITE_ENSURE_SLICE(thr,bw,dst_off,dst_len) \\\n\tduk_bw_write_ensure_slice((thr), (bw), (dst_off), (dst_len))\n#define DUK_BW_INSERT_ENSURE_BYTES(thr,bw,dst_off,buf,len) \\\n\tduk_bw_insert_ensure_bytes((thr), (bw), (dst_off), (buf), (len))\n#define DUK_BW_INSERT_ENSURE_SLICE(thr,bw,dst_off,src_off,len) \\\n\tduk_bw_insert_ensure_slice((thr), (bw), (dst_off), (src_off), (len))\n#define DUK_BW_INSERT_ENSURE_AREA(thr,bw,off,len) \\\n\t/* Evaluates to (duk_uint8_t *) pointing to start of area. */ \\\n\tduk_bw_insert_ensure_area((thr), (bw), (off), (len))\n#define DUK_BW_REMOVE_ENSURE_SLICE(thr,bw,off,len) \\\n\t/* No difference between raw/ensure because the buffer shrinks. */ \\\n\tDUK_BW_REMOVE_RAW_SLICE((thr), (bw), (off), (len))\n\n/*\n *  Externs and prototypes\n */\n\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL const duk_uint8_t duk_lc_digits[36];\nDUK_INTERNAL_DECL const duk_uint8_t duk_uc_nybbles[16];\nDUK_INTERNAL_DECL const duk_int8_t duk_hex_dectab[256];\n#if defined(DUK_USE_HEX_FASTPATH)\nDUK_INTERNAL_DECL const duk_int16_t duk_hex_dectab_shift4[256];\nDUK_INTERNAL_DECL const duk_uint16_t duk_hex_enctab[256];\n#endif\n#if defined(DUK_USE_BASE64_FASTPATH)\nDUK_INTERNAL_DECL const duk_uint8_t duk_base64_enctab[64];\nDUK_INTERNAL_DECL const duk_int8_t duk_base64_dectab[256];\n#endif\n#endif  /* !DUK_SINGLE_FILE */\n\n/* Note: assumes that duk_util_probe_steps size is 32 */\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL duk_uint8_t duk_util_probe_steps[32];\n#endif  /* !DUK_SINGLE_FILE */\n#endif\n\n#if defined(DUK_USE_STRHASH_DENSE)\nDUK_INTERNAL_DECL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed);\n#endif\n\nDUK_INTERNAL_DECL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits);\nDUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx);\nDUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value);\nDUK_INTERNAL_DECL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value);\nDUK_INTERNAL_DECL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx);\nDUK_INTERNAL_DECL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out);\n\nDUK_INTERNAL_DECL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits);\nDUK_INTERNAL_DECL void duk_be_finish(duk_bitencoder_ctx *ctx);\n\n#if !defined(DUK_USE_GET_RANDOM_DOUBLE)\nDUK_INTERNAL_DECL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr);\n#endif\n\nDUK_INTERNAL_DECL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf);\nDUK_INTERNAL_DECL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size);\nDUK_INTERNAL_DECL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz);\nDUK_INTERNAL_DECL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx);\nDUK_INTERNAL_DECL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len);\nDUK_INTERNAL_DECL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len);\nDUK_INTERNAL_DECL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len);\nDUK_INTERNAL_DECL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len);\nDUK_INTERNAL_DECL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len);\nDUK_INTERNAL_DECL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len);\nDUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len);\nDUK_INTERNAL_DECL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len);\nDUK_INTERNAL_DECL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len);\n/* No duk_bw_remove_ensure_slice(), functionality would be identical. */\n\nDUK_INTERNAL_DECL duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p);\nDUK_INTERNAL_DECL duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p);\nDUK_INTERNAL_DECL duk_double_t duk_raw_read_double_be(duk_uint8_t **p);\nDUK_INTERNAL_DECL void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val);\nDUK_INTERNAL_DECL void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val);\nDUK_INTERNAL_DECL void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val);\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)  /* For now only needed by the debugger. */\nDUK_INTERNAL_DECL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len);\n#endif\n\nDUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival);\nDUK_INTERNAL_DECL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival);\nDUK_INTERNAL_DECL duk_bool_t duk_double_is_anyinf(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_double_is_posinf(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_double_is_neginf(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_double_is_nan(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x);\nDUK_INTERNAL_DECL duk_small_uint_t duk_double_signbit(duk_double_t x);\nDUK_INTERNAL_DECL duk_double_t duk_double_trunc_towards_zero(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y);\nDUK_INTERNAL_DECL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y);\nDUK_INTERNAL_DECL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y);\n\n#endif  /* DUK_UTIL_H_INCLUDED */\n/* #include duk_strings.h */\n#line 1 \"duk_strings.h\"\n/*\n *  Shared string macros.\n *\n *  Using shared macros helps minimize strings data size because it's easy\n *  to check if an existing string could be used.  String constants don't\n *  need to be all defined here; defining a string here makes sense if there's\n *  a high chance the string could be reused.  Also, using macros allows\n *  a call site express the exact string needed, but the macro may map to an\n *  approximate string to reduce unique string count.  Macros can also be\n *  more easily tuned for low memory targets than #if defined()s throughout\n *  the code base.\n *\n *  Because format strings behave differently in the call site (they need to\n *  be followed by format arguments), they use a special prefix DUK_STR_FMT_.\n *\n *  On some compilers using explicit shared strings is preferable; on others\n *  it may be better to use straight literals because the compiler will combine\n *  them anyway, and such strings won't end up unnecessarily in a symbol table.\n */\n\n#if !defined(DUK_ERRMSG_H_INCLUDED)\n#define DUK_ERRMSG_H_INCLUDED\n\n/* Mostly API and built-in method related */\n#define DUK_STR_INTERNAL_ERROR                   \"internal error\"\n#define DUK_STR_UNSUPPORTED                      \"unsupported\"\n#define DUK_STR_INVALID_COUNT                    \"invalid count\"\n#define DUK_STR_INVALID_ARGS                     \"invalid args\"\n#define DUK_STR_INVALID_STATE                    \"invalid state\"\n#define DUK_STR_INVALID_INPUT                    \"invalid input\"\n#define DUK_STR_INVALID_LENGTH                   \"invalid length\"\n#define DUK_STR_NOT_CONSTRUCTABLE                \"not constructable\"\n#define DUK_STR_CONSTRUCT_ONLY                   \"constructor requires 'new'\"\n#define DUK_STR_NOT_CALLABLE                     \"not callable\"\n#define DUK_STR_NOT_EXTENSIBLE                   \"not extensible\"\n#define DUK_STR_NOT_WRITABLE                     \"not writable\"\n#define DUK_STR_NOT_CONFIGURABLE                 \"not configurable\"\n#define DUK_STR_INVALID_CONTEXT                  \"invalid context\"\n#define DUK_STR_INVALID_INDEX                    \"invalid args\"\n#define DUK_STR_PUSH_BEYOND_ALLOC_STACK          \"cannot push beyond allocated stack\"\n#define DUK_STR_NOT_UNDEFINED                    \"unexpected type\"\n#define DUK_STR_NOT_NULL                         \"unexpected type\"\n#define DUK_STR_NOT_BOOLEAN                      \"unexpected type\"\n#define DUK_STR_NOT_NUMBER                       \"unexpected type\"\n#define DUK_STR_NOT_STRING                       \"unexpected type\"\n#define DUK_STR_NOT_OBJECT                       \"unexpected type\"\n#define DUK_STR_NOT_POINTER                      \"unexpected type\"\n#define DUK_STR_NOT_BUFFER                       \"not buffer\"  /* still in use with verbose messages */\n#define DUK_STR_UNEXPECTED_TYPE                  \"unexpected type\"\n#define DUK_STR_NOT_THREAD                       \"unexpected type\"\n#define DUK_STR_NOT_COMPFUNC                     \"unexpected type\"\n#define DUK_STR_NOT_NATFUNC                      \"unexpected type\"\n#define DUK_STR_NOT_C_FUNCTION                   \"unexpected type\"\n#define DUK_STR_NOT_FUNCTION                     \"unexpected type\"\n#define DUK_STR_NOT_REGEXP                       \"unexpected type\"\n#define DUK_STR_TOPRIMITIVE_FAILED               \"coercion to primitive failed\"\n#define DUK_STR_NUMBER_OUTSIDE_RANGE             \"number outside range\"\n#define DUK_STR_NOT_OBJECT_COERCIBLE             \"not object coercible\"\n#define DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL      \"cannot number coerce Symbol\"\n#define DUK_STR_CANNOT_STRING_COERCE_SYMBOL      \"cannot string coerce Symbol\"\n#define DUK_STR_STRING_TOO_LONG                  \"string too long\"\n#define DUK_STR_BUFFER_TOO_LONG                  \"buffer too long\"\n#define DUK_STR_ALLOC_FAILED                     \"alloc failed\"\n#define DUK_STR_WRONG_BUFFER_TYPE                \"wrong buffer type\"\n#define DUK_STR_BASE64_ENCODE_FAILED             \"base64 encode failed\"\n#define DUK_STR_SOURCE_DECODE_FAILED             \"source decode failed\"\n#define DUK_STR_UTF8_DECODE_FAILED               \"utf-8 decode failed\"\n#define DUK_STR_BASE64_DECODE_FAILED             \"base64 decode failed\"\n#define DUK_STR_HEX_DECODE_FAILED                \"hex decode failed\"\n#define DUK_STR_INVALID_BYTECODE                 \"invalid bytecode\"\n#define DUK_STR_NO_SOURCECODE                    \"no sourcecode\"\n#define DUK_STR_RESULT_TOO_LONG                  \"result too long\"\n#define DUK_STR_INVALID_CFUNC_RC                 \"invalid C function rc\"\n#define DUK_STR_INVALID_INSTANCEOF_RVAL          \"invalid instanceof rval\"\n#define DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO  \"instanceof rval has no .prototype\"\n\n/* JSON */\n#define DUK_STR_FMT_PTR                          \"%p\"\n#define DUK_STR_FMT_INVALID_JSON                 \"invalid json (at offset %ld)\"\n#define DUK_STR_JSONDEC_RECLIMIT                 \"json decode recursion limit\"\n#define DUK_STR_JSONENC_RECLIMIT                 \"json encode recursion limit\"\n#define DUK_STR_CYCLIC_INPUT                     \"cyclic input\"\n\n/* Object property access */\n#define DUK_STR_INVALID_BASE                     \"invalid base value\"\n#define DUK_STR_STRICT_CALLER_READ               \"cannot read strict 'caller'\"\n#define DUK_STR_PROXY_REJECTED                   \"proxy rejected\"\n#define DUK_STR_INVALID_ARRAY_LENGTH             \"invalid array length\"\n#define DUK_STR_SETTER_UNDEFINED                 \"setter undefined\"\n#define DUK_STR_INVALID_DESCRIPTOR               \"invalid descriptor\"\n\n/* Proxy */\n#define DUK_STR_PROXY_REVOKED                    \"proxy revoked\"\n#define DUK_STR_INVALID_TRAP_RESULT              \"invalid trap result\"\n\n/* Variables */\n\n/* Lexer */\n#define DUK_STR_INVALID_ESCAPE                   \"invalid escape\"\n#define DUK_STR_UNTERMINATED_STRING              \"unterminated string\"\n#define DUK_STR_UNTERMINATED_COMMENT             \"unterminated comment\"\n#define DUK_STR_UNTERMINATED_REGEXP              \"unterminated regexp\"\n#define DUK_STR_TOKEN_LIMIT                      \"token limit\"\n#define DUK_STR_REGEXP_SUPPORT_DISABLED          \"regexp support disabled\"\n#define DUK_STR_INVALID_NUMBER_LITERAL           \"invalid number literal\"\n#define DUK_STR_INVALID_TOKEN                    \"invalid token\"\n\n/* Compiler */\n#define DUK_STR_PARSE_ERROR                      \"parse error\"\n#define DUK_STR_DUPLICATE_LABEL                  \"duplicate label\"\n#define DUK_STR_INVALID_LABEL                    \"invalid label\"\n#define DUK_STR_INVALID_ARRAY_LITERAL            \"invalid array literal\"\n#define DUK_STR_INVALID_OBJECT_LITERAL           \"invalid object literal\"\n#define DUK_STR_INVALID_VAR_DECLARATION          \"invalid variable declaration\"\n#define DUK_STR_CANNOT_DELETE_IDENTIFIER         \"cannot delete identifier\"\n#define DUK_STR_INVALID_EXPRESSION               \"invalid expression\"\n#define DUK_STR_INVALID_LVALUE                   \"invalid lvalue\"\n#define DUK_STR_INVALID_NEWTARGET                \"invalid new.target\"\n#define DUK_STR_EXPECTED_IDENTIFIER              \"expected identifier\"\n#define DUK_STR_EMPTY_EXPR_NOT_ALLOWED           \"empty expression not allowed\"\n#define DUK_STR_INVALID_FOR                      \"invalid for statement\"\n#define DUK_STR_INVALID_SWITCH                   \"invalid switch statement\"\n#define DUK_STR_INVALID_BREAK_CONT_LABEL         \"invalid break/continue label\"\n#define DUK_STR_INVALID_RETURN                   \"invalid return\"\n#define DUK_STR_INVALID_TRY                      \"invalid try\"\n#define DUK_STR_INVALID_THROW                    \"invalid throw\"\n#define DUK_STR_WITH_IN_STRICT_MODE              \"with in strict mode\"\n#define DUK_STR_FUNC_STMT_NOT_ALLOWED            \"function statement not allowed\"\n#define DUK_STR_UNTERMINATED_STMT                \"unterminated statement\"\n#define DUK_STR_INVALID_ARG_NAME                 \"invalid argument name\"\n#define DUK_STR_INVALID_FUNC_NAME                \"invalid function name\"\n#define DUK_STR_INVALID_GETSET_NAME              \"invalid getter/setter name\"\n#define DUK_STR_FUNC_NAME_REQUIRED               \"function name required\"\n\n/* RegExp */\n#define DUK_STR_INVALID_QUANTIFIER               \"invalid regexp quantifier\"\n#define DUK_STR_INVALID_QUANTIFIER_NO_ATOM       \"quantifier without preceding atom\"\n#define DUK_STR_INVALID_QUANTIFIER_VALUES        \"quantifier values invalid (qmin > qmax)\"\n#define DUK_STR_QUANTIFIER_TOO_MANY_COPIES       \"quantifier requires too many atom copies\"\n#define DUK_STR_UNEXPECTED_CLOSING_PAREN         \"unexpected closing parenthesis\"\n#define DUK_STR_UNEXPECTED_END_OF_PATTERN        \"unexpected end of pattern\"\n#define DUK_STR_UNEXPECTED_REGEXP_TOKEN          \"unexpected token in regexp\"\n#define DUK_STR_INVALID_REGEXP_FLAGS             \"invalid regexp flags\"\n#define DUK_STR_INVALID_REGEXP_ESCAPE            \"invalid regexp escape\"\n#define DUK_STR_INVALID_BACKREFS                 \"invalid backreference(s)\"\n#define DUK_STR_INVALID_REGEXP_CHARACTER         \"invalid regexp character\"\n#define DUK_STR_INVALID_REGEXP_GROUP             \"invalid regexp group\"\n#define DUK_STR_UNTERMINATED_CHARCLASS           \"unterminated character class\"\n#define DUK_STR_INVALID_RANGE                    \"invalid range\"\n\n/* Limits */\n#define DUK_STR_VALSTACK_LIMIT                   \"valstack limit\"\n#define DUK_STR_CALLSTACK_LIMIT                  \"callstack limit\"\n#define DUK_STR_PROTOTYPE_CHAIN_LIMIT            \"prototype chain limit\"\n#define DUK_STR_BOUND_CHAIN_LIMIT                \"function call bound chain limit\"\n#define DUK_STR_C_CALLSTACK_LIMIT                \"C call stack depth limit\"\n#define DUK_STR_COMPILER_RECURSION_LIMIT         \"compiler recursion limit\"\n#define DUK_STR_BYTECODE_LIMIT                   \"bytecode limit\"\n#define DUK_STR_REG_LIMIT                        \"register limit\"\n#define DUK_STR_TEMP_LIMIT                       \"temp limit\"\n#define DUK_STR_CONST_LIMIT                      \"const limit\"\n#define DUK_STR_FUNC_LIMIT                       \"function limit\"\n#define DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT  \"regexp compiler recursion limit\"\n#define DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT  \"regexp executor recursion limit\"\n#define DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT       \"regexp step limit\"\n\n#endif  /* DUK_ERRMSG_H_INCLUDED */\n/* #include duk_js_bytecode.h */\n#line 1 \"duk_js_bytecode.h\"\n/*\n *  Ecmascript bytecode\n */\n\n#if !defined(DUK_JS_BYTECODE_H_INCLUDED)\n#define DUK_JS_BYTECODE_H_INCLUDED\n\n/*\n *  Bytecode instruction layout\n *  ===========================\n *\n *  Instructions are unsigned 32-bit integers divided as follows:\n *\n *  !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !\n *  !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!\n *  +-----------------------------------------------+---------------+\n *  !       C       !       B       !       A       !       OP      !\n *  +-----------------------------------------------+---------------+\n *\n *  OP (8 bits):  opcode (DUK_OP_*), access should be fastest\n *                consecutive opcodes allocated when opcode needs flags\n *   A (8 bits):  typically a target register number\n *   B (8 bits):  typically first source register/constant number\n *   C (8 bits):  typically second source register/constant number\n *\n *  Some instructions combine BC or ABC together for larger parameter values.\n *  Signed integers (e.g. jump offsets) are encoded as unsigned, with an\n *  opcode specific bias.\n *\n *  Some opcodes have flags which are handled by allocating consecutive\n *  opcodes to make space for 1-N flags.  Flags can also be e.g. in the 'A'\n *  field when there's room for the specific opcode.\n *\n *  For example, if three flags were needed, they could be allocated from\n *  the opcode field as follows:\n *\n *  !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !\n *  !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!\n *  +-----------------------------------------------+---------------+\n *  !       C       !       B       !       A       !    OP   !Z!Y!X!\n *  +-----------------------------------------------+---------------+\n *\n *  Some opcodes accept a reg/const argument which is handled by allocating\n *  flags in the OP field, see DUK_BC_ISREG() and DUK_BC_ISCONST().  The\n *  following convention is shared by most opcodes, so that the compiler\n *  can handle reg/const flagging without opcode specific code paths:\n *\n *  !3!3!2!2!2!2!2!2!2!2!2!2!1!1!1!1!1!1!1!1!1!1! ! ! ! ! ! ! ! ! ! !\n *  !1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!9!8!7!6!5!4!3!2!1!0!\n *  +-----------------------------------------------+---------------+\n *  !       C       !       B       !       A       !     OP    !Y!X!\n *  +-----------------------------------------------+---------------+\n *\n *    X  1=B is const, 0=B is reg\n *    Y  1=C is const, 0=C is reg\n *\n *    In effect OP, OP + 1, OP + 2, and OP + 3 are allocated from the\n *    8-bit opcode space for a single logical opcode.  The base opcode\n *    number should be divisible by 4.  If the opcode is called 'FOO'\n *    the following opcode constants would be defined:\n *\n *      DUK_OP_FOO     100       // base opcode number\n *      DUK_OP_FOO_RR  100       // FOO, B=reg, C=reg\n *      DUK_OP_FOO_CR  101       // FOO, B=const, C=reg\n *      DUK_OP_FOO_RC  102       // FOO, B=reg, C=const\n *      DUK_OP_FOO_CC  103       // FOO, B=const, C=const\n *\n *  If only B or C is a reg/const, the unused opcode combinations can be\n *  used for other opcodes (which take no reg/const argument).  However,\n *  such opcode values are initially reserved, at least while opcode space\n *  is available.  For example, if 'BAR' uses B for a register field and\n *  C is a reg/const:\n *\n *      DUK_OP_BAR            116    // base opcode number\n *      DUK_OP_BAR_RR         116    // BAR, B=reg, C=reg\n *      DUK_OP_BAR_CR_UNUSED  117    // unused, could be repurposed\n *      DUK_OP_BAR_RC         118    // BAR, B=reg, C=const\n *      DUK_OP_BAR_CC_UNUSED  119    // unused, could be repurposed\n *\n *  Macro naming is a bit misleading, e.g. \"ABC\" in macro name but the\n *  field layout is concretely \"CBA\" in the register.\n */\n\ntypedef duk_uint32_t duk_instr_t;\n\n#define DUK_BC_SHIFT_OP             0\n#define DUK_BC_SHIFT_A              8\n#define DUK_BC_SHIFT_B              16\n#define DUK_BC_SHIFT_C              24\n#define DUK_BC_SHIFT_BC             DUK_BC_SHIFT_B\n#define DUK_BC_SHIFT_ABC            DUK_BC_SHIFT_A\n\n#define DUK_BC_UNSHIFTED_MASK_OP    0xffUL\n#define DUK_BC_UNSHIFTED_MASK_A     0xffUL\n#define DUK_BC_UNSHIFTED_MASK_B     0xffUL\n#define DUK_BC_UNSHIFTED_MASK_C     0xffUL\n#define DUK_BC_UNSHIFTED_MASK_BC    0xffffUL\n#define DUK_BC_UNSHIFTED_MASK_ABC   0xffffffUL\n\n#define DUK_BC_SHIFTED_MASK_OP      (DUK_BC_UNSHIFTED_MASK_OP << DUK_BC_SHIFT_OP)\n#define DUK_BC_SHIFTED_MASK_A       (DUK_BC_UNSHIFTED_MASK_A << DUK_BC_SHIFT_A)\n#define DUK_BC_SHIFTED_MASK_B       (DUK_BC_UNSHIFTED_MASK_B << DUK_BC_SHIFT_B)\n#define DUK_BC_SHIFTED_MASK_C       (DUK_BC_UNSHIFTED_MASK_C << DUK_BC_SHIFT_C)\n#define DUK_BC_SHIFTED_MASK_BC      (DUK_BC_UNSHIFTED_MASK_BC << DUK_BC_SHIFT_BC)\n#define DUK_BC_SHIFTED_MASK_ABC     (DUK_BC_UNSHIFTED_MASK_ABC << DUK_BC_SHIFT_ABC)\n\n#define DUK_DEC_OP(x)               ((x) & 0xffUL)\n#define DUK_DEC_A(x)                (((x) >> 8) & 0xffUL)\n#define DUK_DEC_B(x)                (((x) >> 16) & 0xffUL)\n#define DUK_DEC_C(x)                (((x) >> 24) & 0xffUL)\n#define DUK_DEC_BC(x)               (((x) >> 16) & 0xffffUL)\n#define DUK_DEC_ABC(x)              (((x) >> 8) & 0xffffffUL)\n\n#define DUK_ENC_OP(op)              ((duk_instr_t) (op))\n#define DUK_ENC_OP_ABC(op,abc)      ((duk_instr_t) ( \\\n                                        (((duk_instr_t) (abc)) << 8) | \\\n                                        ((duk_instr_t) (op)) \\\n                                    ))\n#define DUK_ENC_OP_A_BC(op,a,bc)    ((duk_instr_t) ( \\\n                                        (((duk_instr_t) (bc)) << 16) | \\\n                                        (((duk_instr_t) (a)) << 8) | \\\n                                        ((duk_instr_t) (op)) \\\n                                    ))\n#define DUK_ENC_OP_A_B_C(op,a,b,c)  ((duk_instr_t) ( \\\n                                        (((duk_instr_t) (c)) << 24) | \\\n                                        (((duk_instr_t) (b)) << 16) | \\\n                                        (((duk_instr_t) (a)) << 8) | \\\n                                        ((duk_instr_t) (op)) \\\n                                    ))\n#define DUK_ENC_OP_A_B(op,a,b)      DUK_ENC_OP_A_B_C((op),(a),(b),0)\n#define DUK_ENC_OP_A(op,a)          DUK_ENC_OP_A_B_C((op),(a),0,0)\n#define DUK_ENC_OP_BC(op,bc)        DUK_ENC_OP_A_BC((op),0,(bc))\n\n/* Get opcode base value with B/C reg/const flags cleared. */\n#define DUK_BC_NOREGCONST_OP(op)    ((op) & 0xfc)\n\n/* Constants should be signed so that signed arithmetic involving them\n * won't cause values to be coerced accidentally to unsigned.\n */\n#define DUK_BC_OP_MIN               0\n#define DUK_BC_OP_MAX               0xffL\n#define DUK_BC_A_MIN                0\n#define DUK_BC_A_MAX                0xffL\n#define DUK_BC_B_MIN                0\n#define DUK_BC_B_MAX                0xffL\n#define DUK_BC_C_MIN                0\n#define DUK_BC_C_MAX                0xffL\n#define DUK_BC_BC_MIN               0\n#define DUK_BC_BC_MAX               0xffffL\n#define DUK_BC_ABC_MIN              0\n#define DUK_BC_ABC_MAX              0xffffffL\n\n/* Masks for B/C reg/const indicator in opcode field. */\n#define DUK_BC_REGCONST_B           (0x01UL)\n#define DUK_BC_REGCONST_C           (0x02UL)\n\n/* Misc. masks for opcode field. */\n#define DUK_BC_INCDECP_FLAG_DEC     (0x04UL)\n#define DUK_BC_INCDECP_FLAG_POST    (0x08UL)\n\n/* Opcodes. */\n#define DUK_OP_LDREG                0\n#define DUK_OP_STREG                1\n#define DUK_OP_JUMP                 2\n#define DUK_OP_LDCONST              3\n#define DUK_OP_LDINT                4\n#define DUK_OP_LDINTX               5\n#define DUK_OP_LDTHIS               6\n#define DUK_OP_LDUNDEF              7\n#define DUK_OP_LDNULL               8\n#define DUK_OP_LDTRUE               9\n#define DUK_OP_LDFALSE              10\n#define DUK_OP_GETVAR               11\n#define DUK_OP_BNOT                 12\n#define DUK_OP_LNOT                 13\n#define DUK_OP_UNM                  14\n#define DUK_OP_UNP                  15\n#define DUK_OP_EQ                   16\n#define DUK_OP_EQ_RR                16\n#define DUK_OP_EQ_CR                17\n#define DUK_OP_EQ_RC                18\n#define DUK_OP_EQ_CC                19\n#define DUK_OP_NEQ                  20\n#define DUK_OP_NEQ_RR               20\n#define DUK_OP_NEQ_CR               21\n#define DUK_OP_NEQ_RC               22\n#define DUK_OP_NEQ_CC               23\n#define DUK_OP_SEQ                  24\n#define DUK_OP_SEQ_RR               24\n#define DUK_OP_SEQ_CR               25\n#define DUK_OP_SEQ_RC               26\n#define DUK_OP_SEQ_CC               27\n#define DUK_OP_SNEQ                 28\n#define DUK_OP_SNEQ_RR              28\n#define DUK_OP_SNEQ_CR              29\n#define DUK_OP_SNEQ_RC              30\n#define DUK_OP_SNEQ_CC              31\n#define DUK_OP_GT                   32\n#define DUK_OP_GT_RR                32\n#define DUK_OP_GT_CR                33\n#define DUK_OP_GT_RC                34\n#define DUK_OP_GT_CC                35\n#define DUK_OP_GE                   36\n#define DUK_OP_GE_RR                36\n#define DUK_OP_GE_CR                37\n#define DUK_OP_GE_RC                38\n#define DUK_OP_GE_CC                39\n#define DUK_OP_LT                   40\n#define DUK_OP_LT_RR                40\n#define DUK_OP_LT_CR                41\n#define DUK_OP_LT_RC                42\n#define DUK_OP_LT_CC                43\n#define DUK_OP_LE                   44\n#define DUK_OP_LE_RR                44\n#define DUK_OP_LE_CR                45\n#define DUK_OP_LE_RC                46\n#define DUK_OP_LE_CC                47\n#define DUK_OP_IFTRUE               48\n#define DUK_OP_IFTRUE_R             48\n#define DUK_OP_IFTRUE_C             49\n#define DUK_OP_IFFALSE              50\n#define DUK_OP_IFFALSE_R            50\n#define DUK_OP_IFFALSE_C            51\n#define DUK_OP_ADD                  52\n#define DUK_OP_ADD_RR               52\n#define DUK_OP_ADD_CR               53\n#define DUK_OP_ADD_RC               54\n#define DUK_OP_ADD_CC               55\n#define DUK_OP_SUB                  56\n#define DUK_OP_SUB_RR               56\n#define DUK_OP_SUB_CR               57\n#define DUK_OP_SUB_RC               58\n#define DUK_OP_SUB_CC               59\n#define DUK_OP_MUL                  60\n#define DUK_OP_MUL_RR               60\n#define DUK_OP_MUL_CR               61\n#define DUK_OP_MUL_RC               62\n#define DUK_OP_MUL_CC               63\n#define DUK_OP_DIV                  64\n#define DUK_OP_DIV_RR               64\n#define DUK_OP_DIV_CR               65\n#define DUK_OP_DIV_RC               66\n#define DUK_OP_DIV_CC               67\n#define DUK_OP_MOD                  68\n#define DUK_OP_MOD_RR               68\n#define DUK_OP_MOD_CR               69\n#define DUK_OP_MOD_RC               70\n#define DUK_OP_MOD_CC               71\n#define DUK_OP_EXP                  72\n#define DUK_OP_EXP_RR               72\n#define DUK_OP_EXP_CR               73\n#define DUK_OP_EXP_RC               74\n#define DUK_OP_EXP_CC               75\n#define DUK_OP_BAND                 76\n#define DUK_OP_BAND_RR              76\n#define DUK_OP_BAND_CR              77\n#define DUK_OP_BAND_RC              78\n#define DUK_OP_BAND_CC              79\n#define DUK_OP_BOR                  80\n#define DUK_OP_BOR_RR               80\n#define DUK_OP_BOR_CR               81\n#define DUK_OP_BOR_RC               82\n#define DUK_OP_BOR_CC               83\n#define DUK_OP_BXOR                 84\n#define DUK_OP_BXOR_RR              84\n#define DUK_OP_BXOR_CR              85\n#define DUK_OP_BXOR_RC              86\n#define DUK_OP_BXOR_CC              87\n#define DUK_OP_BASL                 88\n#define DUK_OP_BASL_RR              88\n#define DUK_OP_BASL_CR              89\n#define DUK_OP_BASL_RC              90\n#define DUK_OP_BASL_CC              91\n#define DUK_OP_BLSR                 92\n#define DUK_OP_BLSR_RR              92\n#define DUK_OP_BLSR_CR              93\n#define DUK_OP_BLSR_RC              94\n#define DUK_OP_BLSR_CC              95\n#define DUK_OP_BASR                 96\n#define DUK_OP_BASR_RR              96\n#define DUK_OP_BASR_CR              97\n#define DUK_OP_BASR_RC              98\n#define DUK_OP_BASR_CC              99\n#define DUK_OP_INSTOF               100\n#define DUK_OP_INSTOF_RR            100\n#define DUK_OP_INSTOF_CR            101\n#define DUK_OP_INSTOF_RC            102\n#define DUK_OP_INSTOF_CC            103\n#define DUK_OP_IN                   104\n#define DUK_OP_IN_RR                104\n#define DUK_OP_IN_CR                105\n#define DUK_OP_IN_RC                106\n#define DUK_OP_IN_CC                107\n#define DUK_OP_GETPROP              108\n#define DUK_OP_GETPROP_RR           108\n#define DUK_OP_GETPROP_CR           109\n#define DUK_OP_GETPROP_RC           110\n#define DUK_OP_GETPROP_CC           111\n#define DUK_OP_PUTPROP              112\n#define DUK_OP_PUTPROP_RR           112\n#define DUK_OP_PUTPROP_CR           113\n#define DUK_OP_PUTPROP_RC           114\n#define DUK_OP_PUTPROP_CC           115\n#define DUK_OP_DELPROP              116\n#define DUK_OP_DELPROP_RR           116\n#define DUK_OP_DELPROP_CR_UNUSED    117  /* unused now */\n#define DUK_OP_DELPROP_RC           118\n#define DUK_OP_DELPROP_CC_UNUSED    119  /* unused now */\n#define DUK_OP_PREINCR              120  /* pre/post opcode values have constraints, */\n#define DUK_OP_PREDECR              121  /* see duk_js_executor.c and duk_js_compiler.c. */\n#define DUK_OP_POSTINCR             122\n#define DUK_OP_POSTDECR             123\n#define DUK_OP_PREINCV              124\n#define DUK_OP_PREDECV              125\n#define DUK_OP_POSTINCV             126\n#define DUK_OP_POSTDECV             127\n#define DUK_OP_PREINCP              128  /* pre/post inc/dec prop opcodes have constraints */\n#define DUK_OP_PREINCP_RR           128\n#define DUK_OP_PREINCP_CR           129\n#define DUK_OP_PREINCP_RC           130\n#define DUK_OP_PREINCP_CC           131\n#define DUK_OP_PREDECP              132\n#define DUK_OP_PREDECP_RR           132\n#define DUK_OP_PREDECP_CR           133\n#define DUK_OP_PREDECP_RC           134\n#define DUK_OP_PREDECP_CC           135\n#define DUK_OP_POSTINCP             136\n#define DUK_OP_POSTINCP_RR          136\n#define DUK_OP_POSTINCP_CR          137\n#define DUK_OP_POSTINCP_RC          138\n#define DUK_OP_POSTINCP_CC          139\n#define DUK_OP_POSTDECP             140\n#define DUK_OP_POSTDECP_RR          140\n#define DUK_OP_POSTDECP_CR          141\n#define DUK_OP_POSTDECP_RC          142\n#define DUK_OP_POSTDECP_CC          143\n#define DUK_OP_DECLVAR              144\n#define DUK_OP_DECLVAR_RR           144\n#define DUK_OP_DECLVAR_CR           145\n#define DUK_OP_DECLVAR_RC           146\n#define DUK_OP_DECLVAR_CC           147\n#define DUK_OP_REGEXP               148\n#define DUK_OP_REGEXP_RR            148\n#define DUK_OP_REGEXP_CR            149\n#define DUK_OP_REGEXP_RC            150\n#define DUK_OP_REGEXP_CC            151\n#define DUK_OP_CLOSURE              152\n#define DUK_OP_TYPEOF               153\n#define DUK_OP_TYPEOFID             154\n#define DUK_OP_PUTVAR               155\n#define DUK_OP_DELVAR               156\n#define DUK_OP_RETREG               157\n#define DUK_OP_RETUNDEF             158\n#define DUK_OP_RETCONST             159\n#define DUK_OP_RETCONSTN            160  /* return const without incref (e.g. number) */\n#define DUK_OP_LABEL                161\n#define DUK_OP_ENDLABEL             162\n#define DUK_OP_BREAK                163\n#define DUK_OP_CONTINUE             164\n#define DUK_OP_TRYCATCH             165\n#define DUK_OP_ENDTRY               166\n#define DUK_OP_ENDCATCH             167\n#define DUK_OP_ENDFIN               168\n#define DUK_OP_THROW                169\n#define DUK_OP_INVLHS               170\n#define DUK_OP_CSREG                171\n#define DUK_OP_CSVAR                172\n#define DUK_OP_CSVAR_RR             172\n#define DUK_OP_CSVAR_CR             173\n#define DUK_OP_CSVAR_RC             174\n#define DUK_OP_CSVAR_CC             175\n#define DUK_OP_CALL0                176  /* DUK_OP_CALL0 & 0x0F must be zero. */\n#define DUK_OP_CALL1                177\n#define DUK_OP_CALL2                178\n#define DUK_OP_CALL3                179\n#define DUK_OP_CALL4                180\n#define DUK_OP_CALL5                181\n#define DUK_OP_CALL6                182\n#define DUK_OP_CALL7                183\n#define DUK_OP_CALL8                184\n#define DUK_OP_CALL9                185\n#define DUK_OP_CALL10               186\n#define DUK_OP_CALL11               187\n#define DUK_OP_CALL12               188\n#define DUK_OP_CALL13               189\n#define DUK_OP_CALL14               190\n#define DUK_OP_CALL15               191\n#define DUK_OP_NEWOBJ               192\n#define DUK_OP_NEWARR               193\n#define DUK_OP_MPUTOBJ              194\n#define DUK_OP_MPUTOBJI             195\n#define DUK_OP_INITSET              196\n#define DUK_OP_INITGET              197\n#define DUK_OP_MPUTARR              198\n#define DUK_OP_MPUTARRI             199\n#define DUK_OP_SETALEN              200\n#define DUK_OP_INITENUM             201\n#define DUK_OP_NEXTENUM             202\n#define DUK_OP_NEWTARGET            203\n#define DUK_OP_DEBUGGER             204\n#define DUK_OP_NOP                  205\n#define DUK_OP_INVALID              206\n#define DUK_OP_UNUSED207            207\n#define DUK_OP_GETPROPC             208\n#define DUK_OP_GETPROPC_RR          208\n#define DUK_OP_GETPROPC_CR          209\n#define DUK_OP_GETPROPC_RC          210\n#define DUK_OP_GETPROPC_CC          211\n#define DUK_OP_UNUSED212            212\n#define DUK_OP_UNUSED213            213\n#define DUK_OP_UNUSED214            214\n#define DUK_OP_UNUSED215            215\n#define DUK_OP_UNUSED216            216\n#define DUK_OP_UNUSED217            217\n#define DUK_OP_UNUSED218            218\n#define DUK_OP_UNUSED219            219\n#define DUK_OP_UNUSED220            220\n#define DUK_OP_UNUSED221            221\n#define DUK_OP_UNUSED222            222\n#define DUK_OP_UNUSED223            223\n#define DUK_OP_UNUSED224            224\n#define DUK_OP_UNUSED225            225\n#define DUK_OP_UNUSED226            226\n#define DUK_OP_UNUSED227            227\n#define DUK_OP_UNUSED228            228\n#define DUK_OP_UNUSED229            229\n#define DUK_OP_UNUSED230            230\n#define DUK_OP_UNUSED231            231\n#define DUK_OP_UNUSED232            232\n#define DUK_OP_UNUSED233            233\n#define DUK_OP_UNUSED234            234\n#define DUK_OP_UNUSED235            235\n#define DUK_OP_UNUSED236            236\n#define DUK_OP_UNUSED237            237\n#define DUK_OP_UNUSED238            238\n#define DUK_OP_UNUSED239            239\n#define DUK_OP_UNUSED240            240\n#define DUK_OP_UNUSED241            241\n#define DUK_OP_UNUSED242            242\n#define DUK_OP_UNUSED243            243\n#define DUK_OP_UNUSED244            244\n#define DUK_OP_UNUSED245            245\n#define DUK_OP_UNUSED246            246\n#define DUK_OP_UNUSED247            247\n#define DUK_OP_UNUSED248            248\n#define DUK_OP_UNUSED249            249\n#define DUK_OP_UNUSED250            250\n#define DUK_OP_UNUSED251            251\n#define DUK_OP_UNUSED252            252\n#define DUK_OP_UNUSED253            253\n#define DUK_OP_UNUSED254            254\n#define DUK_OP_UNUSED255            255\n#define DUK_OP_NONE                 256  /* dummy value used as marker (doesn't fit in 8-bit field) */\n\n/* XXX: Allocate flags from opcode field?  Would take 16 opcode slots\n * but avoids shuffling in more cases.  Maybe not worth it.\n */\n/* DUK_OP_TRYCATCH flags in A. */\n#define DUK_BC_TRYCATCH_FLAG_HAVE_CATCH     (1U << 0)\n#define DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY   (1U << 1)\n#define DUK_BC_TRYCATCH_FLAG_CATCH_BINDING  (1U << 2)\n#define DUK_BC_TRYCATCH_FLAG_WITH_BINDING   (1U << 3)\n\n/* DUK_OP_DECLVAR flags in A; bottom bits are reserved for propdesc flags\n * (DUK_PROPDESC_FLAG_XXX).\n */\n#define DUK_BC_DECLVAR_FLAG_FUNC_DECL       (1U << 4)  /* function declaration */\n\n/* DUK_OP_CALLn flags, part of opcode field.  Three lowest bits must match\n * DUK_CALL_FLAG_xxx directly.\n */\n#define DUK_BC_CALL_FLAG_TAILCALL           (1U << 0)\n#define DUK_BC_CALL_FLAG_CONSTRUCT          (1U << 1)\n#define DUK_BC_CALL_FLAG_CALLED_AS_EVAL     (1U << 2)\n#define DUK_BC_CALL_FLAG_INDIRECT           (1U << 3)\n\n/* Misc constants and helper macros. */\n#define DUK_BC_LDINT_BIAS           (1L << 15)\n#define DUK_BC_LDINTX_SHIFT         16\n#define DUK_BC_JUMP_BIAS            (1L << 23)\n\n#endif  /* DUK_JS_BYTECODE_H_INCLUDED */\n/* #include duk_lexer.h */\n#line 1 \"duk_lexer.h\"\n/*\n *  Lexer defines.\n */\n\n#if !defined(DUK_LEXER_H_INCLUDED)\n#define DUK_LEXER_H_INCLUDED\n\ntypedef void (*duk_re_range_callback)(void *user, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct);\n\n/*\n *  A token is interpreted as any possible production of InputElementDiv\n *  and InputElementRegExp, see E5 Section 7 in its entirety.  Note that\n *  the E5 \"Token\" production does not cover all actual tokens of the\n *  language (which is explicitly stated in the specification, Section 7.5).\n *  Null and boolean literals are defined as part of both ReservedWord\n *  (E5 Section 7.6.1) and Literal (E5 Section 7.8) productions.  Here,\n *  null and boolean values have literal tokens, and are not reserved\n *  words.\n *\n *  Decimal literal negative/positive sign is -not- part of DUK_TOK_NUMBER.\n *  The number tokens always have a non-negative value.  The unary minus\n *  operator in \"-1.0\" is optimized during compilation to yield a single\n *  negative constant.\n *\n *  Token numbering is free except that reserved words are required to be\n *  in a continuous range and in a particular order.  See genstrings.py.\n */\n\n#define DUK_LEXER_INITCTX(ctx)        duk_lexer_initctx((ctx))\n\n#define DUK_LEXER_SETPOINT(ctx,pt)    duk_lexer_setpoint((ctx), (pt))\n\n#define DUK_LEXER_GETPOINT(ctx,pt)    duk_lexer_getpoint((ctx), (pt))\n\n/* Currently 6 characters of lookup are actually needed (duk_lexer.c). */\n#define DUK_LEXER_WINDOW_SIZE                     6\n#if defined(DUK_USE_LEXER_SLIDING_WINDOW)\n#define DUK_LEXER_BUFFER_SIZE                     64\n#endif\n\n#define DUK_TOK_MINVAL                            0\n\n/* returned after EOF (infinite amount) */\n#define DUK_TOK_EOF                               0\n\n/* identifier names (E5 Section 7.6) */\n#define DUK_TOK_IDENTIFIER                        1\n\n/* reserved words: keywords */\n#define DUK_TOK_START_RESERVED                    2\n#define DUK_TOK_BREAK                             2\n#define DUK_TOK_CASE                              3\n#define DUK_TOK_CATCH                             4\n#define DUK_TOK_CONTINUE                          5\n#define DUK_TOK_DEBUGGER                          6\n#define DUK_TOK_DEFAULT                           7\n#define DUK_TOK_DELETE                            8\n#define DUK_TOK_DO                                9\n#define DUK_TOK_ELSE                              10\n#define DUK_TOK_FINALLY                           11\n#define DUK_TOK_FOR                               12\n#define DUK_TOK_FUNCTION                          13\n#define DUK_TOK_IF                                14\n#define DUK_TOK_IN                                15\n#define DUK_TOK_INSTANCEOF                        16\n#define DUK_TOK_NEW                               17\n#define DUK_TOK_RETURN                            18\n#define DUK_TOK_SWITCH                            19\n#define DUK_TOK_THIS                              20\n#define DUK_TOK_THROW                             21\n#define DUK_TOK_TRY                               22\n#define DUK_TOK_TYPEOF                            23\n#define DUK_TOK_VAR                               24\n#define DUK_TOK_CONST                             25\n#define DUK_TOK_VOID                              26\n#define DUK_TOK_WHILE                             27\n#define DUK_TOK_WITH                              28\n\n/* reserved words: future reserved words */\n#define DUK_TOK_CLASS                             29\n#define DUK_TOK_ENUM                              30\n#define DUK_TOK_EXPORT                            31\n#define DUK_TOK_EXTENDS                           32\n#define DUK_TOK_IMPORT                            33\n#define DUK_TOK_SUPER                             34\n\n/* \"null\", \"true\", and \"false\" are always reserved words.\n * Note that \"get\" and \"set\" are not!\n */\n#define DUK_TOK_NULL                              35\n#define DUK_TOK_TRUE                              36\n#define DUK_TOK_FALSE                             37\n\n/* reserved words: additional future reserved words in strict mode */\n#define DUK_TOK_START_STRICT_RESERVED             38  /* inclusive */\n#define DUK_TOK_IMPLEMENTS                        38\n#define DUK_TOK_INTERFACE                         39\n#define DUK_TOK_LET                               40\n#define DUK_TOK_PACKAGE                           41\n#define DUK_TOK_PRIVATE                           42\n#define DUK_TOK_PROTECTED                         43\n#define DUK_TOK_PUBLIC                            44\n#define DUK_TOK_STATIC                            45\n#define DUK_TOK_YIELD                             46\n\n#define DUK_TOK_END_RESERVED                      47  /* exclusive */\n\n/* \"get\" and \"set\" are tokens but NOT ReservedWords.  They are currently\n * parsed and identifiers and these defines are actually now unused.\n */\n#define DUK_TOK_GET                               47\n#define DUK_TOK_SET                               48\n\n/* punctuators (unlike the spec, also includes \"/\" and \"/=\") */\n#define DUK_TOK_LCURLY                            49\n#define DUK_TOK_RCURLY                            50\n#define DUK_TOK_LBRACKET                          51\n#define DUK_TOK_RBRACKET                          52\n#define DUK_TOK_LPAREN                            53\n#define DUK_TOK_RPAREN                            54\n#define DUK_TOK_PERIOD                            55\n#define DUK_TOK_SEMICOLON                         56\n#define DUK_TOK_COMMA                             57\n#define DUK_TOK_LT                                58\n#define DUK_TOK_GT                                59\n#define DUK_TOK_LE                                60\n#define DUK_TOK_GE                                61\n#define DUK_TOK_EQ                                62\n#define DUK_TOK_NEQ                               63\n#define DUK_TOK_SEQ                               64\n#define DUK_TOK_SNEQ                              65\n#define DUK_TOK_ADD                               66\n#define DUK_TOK_SUB                               67\n#define DUK_TOK_MUL                               68\n#define DUK_TOK_DIV                               69\n#define DUK_TOK_MOD                               70\n#define DUK_TOK_EXP                               71\n#define DUK_TOK_INCREMENT                         72\n#define DUK_TOK_DECREMENT                         73\n#define DUK_TOK_ALSHIFT                           74   /* named \"arithmetic\" because result is signed */\n#define DUK_TOK_ARSHIFT                           75\n#define DUK_TOK_RSHIFT                            76\n#define DUK_TOK_BAND                              77\n#define DUK_TOK_BOR                               78\n#define DUK_TOK_BXOR                              79\n#define DUK_TOK_LNOT                              80\n#define DUK_TOK_BNOT                              81\n#define DUK_TOK_LAND                              82\n#define DUK_TOK_LOR                               83\n#define DUK_TOK_QUESTION                          84\n#define DUK_TOK_COLON                             85\n#define DUK_TOK_EQUALSIGN                         86\n#define DUK_TOK_ADD_EQ                            87\n#define DUK_TOK_SUB_EQ                            88\n#define DUK_TOK_MUL_EQ                            89\n#define DUK_TOK_DIV_EQ                            90\n#define DUK_TOK_MOD_EQ                            91\n#define DUK_TOK_EXP_EQ                            92\n#define DUK_TOK_ALSHIFT_EQ                        93\n#define DUK_TOK_ARSHIFT_EQ                        94\n#define DUK_TOK_RSHIFT_EQ                         95\n#define DUK_TOK_BAND_EQ                           96\n#define DUK_TOK_BOR_EQ                            97\n#define DUK_TOK_BXOR_EQ                           98\n\n/* literals (E5 Section 7.8), except null, true, false, which are treated\n * like reserved words (above).\n */\n#define DUK_TOK_NUMBER                            99\n#define DUK_TOK_STRING                            100\n#define DUK_TOK_REGEXP                            101\n\n#define DUK_TOK_MAXVAL                            101  /* inclusive */\n\n#define DUK_TOK_INVALID                           DUK_SMALL_UINT_MAX\n\n/* Convert heap string index to a token (reserved words) */\n#define DUK_STRIDX_TO_TOK(x)                        ((x) - DUK_STRIDX_START_RESERVED + DUK_TOK_START_RESERVED)\n\n/* Sanity check */\n#if (DUK_TOK_MAXVAL > 255)\n#error DUK_TOK_MAXVAL too large, code assumes it fits into 8 bits\n#endif\n\n/* Sanity checks for string and token defines */\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_BREAK) != DUK_TOK_BREAK)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CASE) != DUK_TOK_CASE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CATCH) != DUK_TOK_CATCH)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONTINUE) != DUK_TOK_CONTINUE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEBUGGER) != DUK_TOK_DEBUGGER)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DEFAULT) != DUK_TOK_DEFAULT)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DELETE) != DUK_TOK_DELETE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_DO) != DUK_TOK_DO)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ELSE) != DUK_TOK_ELSE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FINALLY) != DUK_TOK_FINALLY)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FOR) != DUK_TOK_FOR)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_FUNCTION) != DUK_TOK_FUNCTION)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IF) != DUK_TOK_IF)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IN) != DUK_TOK_IN)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INSTANCEOF) != DUK_TOK_INSTANCEOF)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_NEW) != DUK_TOK_NEW)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_RETURN) != DUK_TOK_RETURN)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SWITCH) != DUK_TOK_SWITCH)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THIS) != DUK_TOK_THIS)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_THROW) != DUK_TOK_THROW)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRY) != DUK_TOK_TRY)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TYPEOF) != DUK_TOK_TYPEOF)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VAR) != DUK_TOK_VAR)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_VOID) != DUK_TOK_VOID)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WHILE) != DUK_TOK_WHILE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_WITH) != DUK_TOK_WITH)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CLASS) != DUK_TOK_CLASS)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_CONST) != DUK_TOK_CONST)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_ENUM) != DUK_TOK_ENUM)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXPORT) != DUK_TOK_EXPORT)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_EXTENDS) != DUK_TOK_EXTENDS)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPORT) != DUK_TOK_IMPORT)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_SUPER) != DUK_TOK_SUPER)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LC_NULL) != DUK_TOK_NULL)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_TRUE) != DUK_TOK_TRUE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_FALSE) != DUK_TOK_FALSE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_IMPLEMENTS) != DUK_TOK_IMPLEMENTS)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_INTERFACE) != DUK_TOK_INTERFACE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_LET) != DUK_TOK_LET)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PACKAGE) != DUK_TOK_PACKAGE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PRIVATE) != DUK_TOK_PRIVATE)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PROTECTED) != DUK_TOK_PROTECTED)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_PUBLIC) != DUK_TOK_PUBLIC)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_STATIC) != DUK_TOK_STATIC)\n#error mismatch in token defines\n#endif\n#if (DUK_STRIDX_TO_TOK(DUK_STRIDX_YIELD) != DUK_TOK_YIELD)\n#error mismatch in token defines\n#endif\n\n/* Regexp tokens */\n#define DUK_RETOK_EOF                              0\n#define DUK_RETOK_DISJUNCTION                      1\n#define DUK_RETOK_QUANTIFIER                       2\n#define DUK_RETOK_ASSERT_START                     3\n#define DUK_RETOK_ASSERT_END                       4\n#define DUK_RETOK_ASSERT_WORD_BOUNDARY             5\n#define DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY         6\n#define DUK_RETOK_ASSERT_START_POS_LOOKAHEAD       7\n#define DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD       8\n#define DUK_RETOK_ATOM_PERIOD                      9\n#define DUK_RETOK_ATOM_CHAR                        10\n#define DUK_RETOK_ATOM_DIGIT                       11  /* assumptions in regexp compiler */\n#define DUK_RETOK_ATOM_NOT_DIGIT                   12  /* -\"\"- */\n#define DUK_RETOK_ATOM_WHITE                       13  /* -\"\"- */\n#define DUK_RETOK_ATOM_NOT_WHITE                   14  /* -\"\"- */\n#define DUK_RETOK_ATOM_WORD_CHAR                   15  /* -\"\"- */\n#define DUK_RETOK_ATOM_NOT_WORD_CHAR               16  /* -\"\"- */\n#define DUK_RETOK_ATOM_BACKREFERENCE               17\n#define DUK_RETOK_ATOM_START_CAPTURE_GROUP         18\n#define DUK_RETOK_ATOM_START_NONCAPTURE_GROUP      19\n#define DUK_RETOK_ATOM_START_CHARCLASS             20\n#define DUK_RETOK_ATOM_START_CHARCLASS_INVERTED    21\n#define DUK_RETOK_ATOM_END_GROUP                   22\n\n/* Constants for duk_lexer_ctx.buf. */\n#define DUK_LEXER_TEMP_BUF_LIMIT                   256\n\n/* A token value.  Can be memcpy()'d, but note that slot1/slot2 values are on the valstack.\n * Some fields (like num, str1, str2) are only valid for specific token types and may have\n * stale values otherwise.\n */\nstruct duk_token {\n\tduk_small_uint_t t;           /* token type (with reserved word identification) */\n\tduk_small_uint_t t_nores;     /* token type (with reserved words as DUK_TOK_IDENTIFER) */\n\tduk_double_t num;             /* numeric value of token */\n\tduk_hstring *str1;            /* string 1 of token (borrowed, stored to ctx->slot1_idx) */\n\tduk_hstring *str2;            /* string 2 of token (borrowed, stored to ctx->slot2_idx) */\n\tduk_size_t start_offset;      /* start byte offset of token in lexer input */\n\tduk_int_t start_line;         /* start line of token (first char) */\n\tduk_int_t num_escapes;        /* number of escapes and line continuations (for directive prologue) */\n\tduk_bool_t lineterm;          /* token was preceded by a lineterm */\n\tduk_bool_t allow_auto_semi;   /* token allows automatic semicolon insertion (eof or preceded by newline) */\n};\n\n#define DUK_RE_QUANTIFIER_INFINITE         ((duk_uint32_t) 0xffffffffUL)\n\n/* A regexp token value. */\nstruct duk_re_token {\n\tduk_small_uint_t t;          /* token type */\n\tduk_small_uint_t greedy;\n\tduk_uint32_t num;            /* numeric value (character, count) */\n\tduk_uint32_t qmin;\n\tduk_uint32_t qmax;\n};\n\n/* A structure for 'snapshotting' a point for rewinding */\nstruct duk_lexer_point {\n\tduk_size_t offset;\n\tduk_int_t line;\n};\n\n/* Lexer codepoint with additional info like offset/line number */\nstruct duk_lexer_codepoint {\n\tduk_codepoint_t codepoint;\n\tduk_size_t offset;\n\tduk_int_t line;\n};\n\n/* Lexer context.  Same context is used for Ecmascript and Regexp parsing. */\nstruct duk_lexer_ctx {\n#if defined(DUK_USE_LEXER_SLIDING_WINDOW)\n\tduk_lexer_codepoint *window; /* unicode code points, window[0] is always next, points to 'buffer' */\n\tduk_lexer_codepoint buffer[DUK_LEXER_BUFFER_SIZE];\n#else\n\tduk_lexer_codepoint window[DUK_LEXER_WINDOW_SIZE]; /* unicode code points, window[0] is always next */\n#endif\n\n\tduk_hthread *thr;                              /* thread; minimizes argument passing */\n\n\tconst duk_uint8_t *input;                      /* input string (may be a user pointer) */\n\tduk_size_t input_length;                       /* input byte length */\n\tduk_size_t input_offset;                       /* input offset for window leading edge (not window[0]) */\n\tduk_int_t input_line;                          /* input linenumber at input_offset (not window[0]), init to 1 */\n\n\tduk_idx_t slot1_idx;                           /* valstack slot for 1st token value */\n\tduk_idx_t slot2_idx;                           /* valstack slot for 2nd token value */\n\tduk_idx_t buf_idx;                             /* valstack slot for temp buffer */\n\tduk_hbuffer_dynamic *buf;                      /* temp accumulation buffer */\n\tduk_bufwriter_ctx bw;                          /* bufwriter for temp accumulation */\n\n\tduk_int_t token_count;                         /* number of tokens parsed */\n\tduk_int_t token_limit;                         /* maximum token count before error (sanity backstop) */\n\n\tduk_small_uint_t flags;                        /* lexer flags, use compiler flag defines for now */\n};\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx);\n\nDUK_INTERNAL_DECL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt);\nDUK_INTERNAL_DECL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt);\n\nDUK_INTERNAL_DECL\nvoid duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx,\n                                      duk_token *out_token,\n                                      duk_bool_t strict_mode,\n                                      duk_bool_t regexp_mode);\n#if defined(DUK_USE_REGEXP_SUPPORT)\nDUK_INTERNAL_DECL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token);\nDUK_INTERNAL_DECL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata);\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\n#endif  /* DUK_LEXER_H_INCLUDED */\n/* #include duk_js_compiler.h */\n#line 1 \"duk_js_compiler.h\"\n/*\n *  Ecmascript compiler.\n */\n\n#if !defined(DUK_JS_COMPILER_H_INCLUDED)\n#define DUK_JS_COMPILER_H_INCLUDED\n\n/* ecmascript compiler limits */\n#define DUK_COMPILER_TOKEN_LIMIT           100000000L  /* 1e8: protects against deeply nested inner functions */\n\n/* maximum loopcount for peephole optimization */\n#define DUK_COMPILER_PEEPHOLE_MAXITER      3\n\n/* maximum bytecode length in instructions */\n#define DUK_COMPILER_MAX_BYTECODE_LENGTH   (256L * 1024L * 1024L)  /* 1 GB */\n\n/*\n *  Compiler intermediate values\n *\n *  Intermediate values describe either plain values (e.g. strings or\n *  numbers) or binary operations which have not yet been coerced into\n *  either a left-hand-side or right-hand-side role (e.g. object property).\n */\n\n#define DUK_IVAL_NONE          0   /* no value */\n#define DUK_IVAL_PLAIN         1   /* register, constant, or value */\n#define DUK_IVAL_ARITH         2   /* binary arithmetic; DUK_OP_ADD, DUK_OP_EQ, other binary ops */\n#define DUK_IVAL_PROP          3   /* property access */\n#define DUK_IVAL_VAR           4   /* variable access */\n\n#define DUK_ISPEC_NONE         0   /* no value */\n#define DUK_ISPEC_VALUE        1   /* value resides in 'valstack_idx' */\n#define DUK_ISPEC_REGCONST     2   /* value resides in a register or constant */\n\n/* Bit mask which indicates that a regconst is a constant instead of a register.\n * Chosen so that when a regconst is cast to duk_int32_t, all consts are\n * negative values.\n */\n#define DUK_REGCONST_CONST_MARKER    DUK_INT32_MIN  /* = -0x80000000 */\n\n/* Type to represent a reg/const reference during compilation, with <0\n * indicating a constant.  Some call sites also use -1 to indicate 'none'.\n */\ntypedef duk_int32_t duk_regconst_t;\n\ntypedef struct {\n\tduk_small_uint_t t;          /* DUK_ISPEC_XXX */\n\tduk_regconst_t regconst;\n\tduk_idx_t valstack_idx;      /* always set; points to a reserved valstack slot */\n} duk_ispec;\n\ntypedef struct {\n\t/*\n\t *  PLAIN: x1\n\t *  ARITH: x1 <op> x2\n\t *  PROP: x1.x2\n\t *  VAR: x1 (name)\n\t */\n\n\t/* XXX: can be optimized for smaller footprint esp. on 32-bit environments */\n\tduk_small_uint_t t;          /* DUK_IVAL_XXX */\n\tduk_small_uint_t op;         /* bytecode opcode for binary ops */\n\tduk_ispec x1;\n\tduk_ispec x2;\n} duk_ivalue;\n\n/*\n *  Bytecode instruction representation during compilation\n *\n *  Contains the actual instruction and (optionally) debug info.\n */\n\nstruct duk_compiler_instr {\n\tduk_instr_t ins;\n#if defined(DUK_USE_PC2LINE)\n\tduk_uint32_t line;\n#endif\n};\n\n/*\n *  Compiler state\n */\n\n#define DUK_LABEL_FLAG_ALLOW_BREAK       (1U << 0)\n#define DUK_LABEL_FLAG_ALLOW_CONTINUE    (1U << 1)\n\n#define DUK_DECL_TYPE_VAR                0\n#define DUK_DECL_TYPE_FUNC               1\n\n/* XXX: optimize to 16 bytes */\ntypedef struct {\n\tduk_small_uint_t flags;\n\tduk_int_t label_id;          /* numeric label_id (-1 reserved as marker) */\n\tduk_hstring *h_label;        /* borrowed label name */\n\tduk_int_t catch_depth;       /* catch depth at point of definition */\n\tduk_int_t pc_label;          /* pc of label statement:\n\t                              * pc+1: break jump site\n\t                              * pc+2: continue jump site\n\t                              */\n\n\t/* Fast jumps (which avoid longjmp) jump directly to the jump sites\n\t * which are always known even while the iteration/switch statement\n\t * is still being parsed.  A final peephole pass \"straightens out\"\n\t * the jumps.\n\t */\n} duk_labelinfo;\n\n/* Compiling state of one function, eventually converted to duk_hcompfunc */\nstruct duk_compiler_func {\n\t/* These pointers are at the start of the struct so that they pack\n\t * nicely.  Mixing pointers and integer values is bad on some\n\t * platforms (e.g. if int is 32 bits and pointers are 64 bits).\n\t */\n\n\tduk_bufwriter_ctx bw_code;          /* bufwriter for code */\n\n\tduk_hstring *h_name;                /* function name (borrowed reference), ends up in _name */\n\t/* h_code: held in bw_code */\n\tduk_hobject *h_consts;              /* array */\n\tduk_hobject *h_funcs;               /* array of function templates: [func1, offset1, line1, func2, offset2, line2]\n\t                                     * offset/line points to closing brace to allow skipping on pass 2\n\t                                     */\n\tduk_hobject *h_decls;               /* array of declarations: [ name1, val1, name2, val2, ... ]\n\t                                     * valN = (typeN) | (fnum << 8), where fnum is inner func number (0 for vars)\n\t                                     * record function and variable declarations in pass 1\n\t                                     */\n\tduk_hobject *h_labelnames;          /* array of active label names */\n\tduk_hbuffer_dynamic *h_labelinfos;  /* C array of duk_labelinfo */\n\tduk_hobject *h_argnames;            /* array of formal argument names (-> _Formals) */\n\tduk_hobject *h_varmap;              /* variable map for pass 2 (identifier -> register number or null (unmapped)) */\n\n\t/* Value stack indices for tracking objects. */\n\t/* code_idx: not needed */\n\tduk_idx_t consts_idx;\n\tduk_idx_t funcs_idx;\n\tduk_idx_t decls_idx;\n\tduk_idx_t labelnames_idx;\n\tduk_idx_t labelinfos_idx;\n\tduk_idx_t argnames_idx;\n\tduk_idx_t varmap_idx;\n\n\t/* Temp reg handling. */\n\tduk_regconst_t temp_first;           /* first register that is a temporary (below: variables) */\n\tduk_regconst_t temp_next;            /* next temporary register to allocate */\n\tduk_regconst_t temp_max;             /* highest value of temp_reg (temp_max - 1 is highest used reg) */\n\n\t/* Shuffle registers if large number of regs/consts. */\n\tduk_regconst_t shuffle1;\n\tduk_regconst_t shuffle2;\n\tduk_regconst_t shuffle3;\n\n\t/* Stats for current expression being parsed. */\n\tduk_int_t nud_count;\n\tduk_int_t led_count;\n\tduk_int_t paren_level;              /* parenthesis count, 0 = top level */\n\tduk_bool_t expr_lhs;                /* expression is left-hand-side compatible */\n\tduk_bool_t allow_in;                /* current paren level allows 'in' token */\n\n\t/* Misc. */\n\tduk_int_t stmt_next;                /* statement id allocation (running counter) */\n\tduk_int_t label_next;               /* label id allocation (running counter) */\n\tduk_int_t catch_depth;              /* catch stack depth */\n\tduk_int_t with_depth;               /* with stack depth (affects identifier lookups) */\n\tduk_int_t fnum_next;                /* inner function numbering */\n\tduk_int_t num_formals;              /* number of formal arguments */\n\tduk_regconst_t reg_stmt_value;      /* register for writing value of 'non-empty' statements (global or eval code), -1 is marker */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tduk_int_t min_line;                 /* XXX: typing (duk_hcompfunc has duk_uint32_t) */\n\tduk_int_t max_line;\n#endif\n\n\t/* Status booleans. */\n\tduk_uint8_t is_function;             /* is an actual function (not global/eval code) */\n\tduk_uint8_t is_eval;                 /* is eval code */\n\tduk_uint8_t is_global;               /* is global code */\n\tduk_uint8_t is_namebinding;          /* needs a name binding */\n\tduk_uint8_t is_constructable;        /* result is constructable */\n\tduk_uint8_t is_setget;               /* is a setter/getter */\n\tduk_uint8_t is_strict;               /* function is strict */\n\tduk_uint8_t is_notail;               /* function must not be tail called */\n\tduk_uint8_t in_directive_prologue;   /* parsing in \"directive prologue\", recognize directives */\n\tduk_uint8_t in_scanning;             /* parsing in \"scanning\" phase (first pass) */\n\tduk_uint8_t may_direct_eval;         /* function may call direct eval */\n\tduk_uint8_t id_access_arguments;     /* function refers to 'arguments' identifier */\n\tduk_uint8_t id_access_slow;          /* function makes one or more slow path accesses that won't match own static variables */\n\tduk_uint8_t id_access_slow_own;      /* function makes one or more slow path accesses that may match own static variables */\n\tduk_uint8_t is_arguments_shadowed;   /* argument/function declaration shadows 'arguments' */\n\tduk_uint8_t needs_shuffle;           /* function needs shuffle registers */\n\tduk_uint8_t reject_regexp_in_adv;    /* reject RegExp literal on next advance() call; needed for handling IdentifierName productions */\n};\n\nstruct duk_compiler_ctx {\n\tduk_hthread *thr;\n\n\t/* filename being compiled (ends up in functions' '_filename' property) */\n\tduk_hstring *h_filename;            /* borrowed reference */\n\n\t/* lexing (tokenization) state (contains two valstack slot indices) */\n\tduk_lexer_ctx lex;\n\n\t/* current and previous token for parsing */\n\tduk_token prev_token;\n\tduk_token curr_token;\n\tduk_idx_t tok11_idx;                /* curr_token slot1 (matches 'lex' slot1_idx) */\n\tduk_idx_t tok12_idx;                /* curr_token slot2 (matches 'lex' slot2_idx) */\n\tduk_idx_t tok21_idx;                /* prev_token slot1 */\n\tduk_idx_t tok22_idx;                /* prev_token slot2 */\n\n\t/* recursion limit */\n\tduk_int_t recursion_depth;\n\tduk_int_t recursion_limit;\n\n\t/* code emission temporary */\n\tduk_int_t emit_jumpslot_pc;\n\n\t/* current function being compiled (embedded instead of pointer for more compact access) */\n\tduk_compiler_func curr_func;\n};\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags);\n\n#endif  /* DUK_JS_COMPILER_H_INCLUDED */\n/* #include duk_regexp.h */\n#line 1 \"duk_regexp.h\"\n/*\n *  Regular expression structs, constants, and bytecode defines.\n */\n\n#if !defined(DUK_REGEXP_H_INCLUDED)\n#define DUK_REGEXP_H_INCLUDED\n\n/* maximum bytecode copies for {n,m} quantifiers */\n#define DUK_RE_MAX_ATOM_COPIES             1000\n\n/* regexp compilation limits */\n#define DUK_RE_COMPILE_TOKEN_LIMIT         100000000L   /* 1e8 */\n\n/* regexp execution limits */\n#define DUK_RE_EXECUTE_STEPS_LIMIT         1000000000L  /* 1e9 */\n\n/* regexp opcodes */\n#define DUK_REOP_MATCH                     1\n#define DUK_REOP_CHAR                      2\n#define DUK_REOP_PERIOD                    3\n#define DUK_REOP_RANGES                    4\n#define DUK_REOP_INVRANGES                 5\n#define DUK_REOP_JUMP                      6\n#define DUK_REOP_SPLIT1                    7\n#define DUK_REOP_SPLIT2                    8\n#define DUK_REOP_SQMINIMAL                 9\n#define DUK_REOP_SQGREEDY                  10\n#define DUK_REOP_SAVE                      11\n#define DUK_REOP_WIPERANGE                 12\n#define DUK_REOP_LOOKPOS                   13\n#define DUK_REOP_LOOKNEG                   14\n#define DUK_REOP_BACKREFERENCE             15\n#define DUK_REOP_ASSERT_START              16\n#define DUK_REOP_ASSERT_END                17\n#define DUK_REOP_ASSERT_WORD_BOUNDARY      18\n#define DUK_REOP_ASSERT_NOT_WORD_BOUNDARY  19\n\n/* flags */\n#define DUK_RE_FLAG_GLOBAL                 (1U << 0)\n#define DUK_RE_FLAG_IGNORE_CASE            (1U << 1)\n#define DUK_RE_FLAG_MULTILINE              (1U << 2)\n\nstruct duk_re_matcher_ctx {\n\tduk_hthread *thr;\n\n\tduk_uint32_t re_flags;\n\tconst duk_uint8_t *input;\n\tconst duk_uint8_t *input_end;\n\tconst duk_uint8_t *bytecode;\n\tconst duk_uint8_t *bytecode_end;\n\tconst duk_uint8_t **saved;  /* allocated from valstack (fixed buffer) */\n\tduk_uint32_t nsaved;\n\tduk_uint32_t recursion_depth;\n\tduk_uint32_t recursion_limit;\n\tduk_uint32_t steps_count;\n\tduk_uint32_t steps_limit;\n};\n\nstruct duk_re_compiler_ctx {\n\tduk_hthread *thr;\n\n\tduk_uint32_t re_flags;\n\tduk_lexer_ctx lex;\n\tduk_re_token curr_token;\n\tduk_bufwriter_ctx bw;\n\tduk_uint32_t captures;  /* highest capture number emitted so far (used as: ++captures) */\n\tduk_uint32_t highest_backref;\n\tduk_uint32_t recursion_depth;\n\tduk_uint32_t recursion_limit;\n\tduk_uint32_t nranges;  /* internal temporary value, used for char classes */\n};\n\n/*\n *  Prototypes\n */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\nDUK_INTERNAL_DECL void duk_regexp_compile(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_regexp_create_instance(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_regexp_match(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_regexp_match_force_global(duk_hthread *thr);  /* hacky helper for String.prototype.split() */\n#endif\n\n#endif  /* DUK_REGEXP_H_INCLUDED */\n/* #include duk_heaphdr.h */\n#line 1 \"duk_heaphdr.h\"\n/*\n *  Heap header definition and assorted macros, including ref counting.\n *  Access all fields through the accessor macros.\n */\n\n#if !defined(DUK_HEAPHDR_H_INCLUDED)\n#define DUK_HEAPHDR_H_INCLUDED\n\n/*\n *  Common heap header\n *\n *  All heap objects share the same flags and refcount fields.  Objects other\n *  than strings also need to have a single or double linked list pointers\n *  for insertion into the \"heap allocated\" list.  Strings have single linked\n *  list pointers for string table chaining.\n *\n *  Technically, 'h_refcount' must be wide enough to guarantee that it cannot\n *  wrap; otherwise objects might be freed incorrectly after wrapping.  The\n *  default refcount field is 32 bits even on 64-bit systems: while that's in\n *  theory incorrect, the Duktape heap needs to be larger than 64GB for the\n *  count to actually wrap (assuming 16-byte duk_tvals).  This is very unlikely\n *  to ever be an issue, but if it is, disabling DUK_USE_REFCOUNT32 causes\n *  Duktape to use size_t for refcounts which should always be safe.\n *\n *  Heap header size on 32-bit platforms: 8 bytes without reference counting,\n *  16 bytes with reference counting.\n *\n *  Note that 'raw' macros such as DUK_HEAPHDR_GET_REFCOUNT() are not\n *  defined without DUK_USE_REFERENCE_COUNTING, so caller must #if defined()\n *  around them.\n */\n\n/* XXX: macro for shared header fields (avoids some padding issues) */\n\nstruct duk_heaphdr {\n\tduk_uint32_t h_flags;\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n#if defined(DUK_USE_ASSERTIONS)\n\t/* When assertions enabled, used by mark-and-sweep for refcount\n\t * validation.  Largest reasonable type; also detects overflows.\n\t */\n\tduk_size_t h_assert_refcount;\n#endif\n#if defined(DUK_USE_REFCOUNT16)\n\tduk_uint16_t h_refcount;\n#elif defined(DUK_USE_REFCOUNT32)\n\tduk_uint32_t h_refcount;\n#else\n\tduk_size_t h_refcount;\n#endif\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t h_next16;\n#else\n\tduk_heaphdr *h_next;\n#endif\n\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n\t/* refcounting requires direct heap frees, which in turn requires a dual linked heap */\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t h_prev16;\n#else\n\tduk_heaphdr *h_prev;\n#endif\n#endif\n\n\t/* When DUK_USE_HEAPPTR16 (and DUK_USE_REFCOUNT16) is in use, the\n\t * struct won't align nicely to 4 bytes.  This 16-bit extra field\n\t * is added to make the alignment clean; the field can be used by\n\t * heap objects when 16-bit packing is used.  This field is now\n\t * conditional to DUK_USE_HEAPPTR16 only, but it is intended to be\n\t * used with DUK_USE_REFCOUNT16 and DUK_USE_DOUBLE_LINKED_HEAP;\n\t * this only matter to low memory environments anyway.\n\t */\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t h_extra16;\n#endif\n};\n\nstruct duk_heaphdr_string {\n\t/* 16 bits would be enough for shared heaphdr flags and duk_hstring\n\t * flags.  The initial parts of duk_heaphdr_string and duk_heaphdr\n\t * must match so changing the flags field size here would be quite\n\t * awkward.  However, to minimize struct size, we can pack at least\n\t * 16 bits of duk_hstring data into the flags field.\n\t */\n\tduk_uint32_t h_flags;\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n#if defined(DUK_USE_ASSERTIONS)\n\t/* When assertions enabled, used by mark-and-sweep for refcount\n\t * validation.  Largest reasonable type; also detects overflows.\n\t */\n\tduk_size_t h_assert_refcount;\n#endif\n#if defined(DUK_USE_REFCOUNT16)\n\tduk_uint16_t h_refcount;\n\tduk_uint16_t h_strextra16;  /* round out to 8 bytes */\n#elif defined(DUK_USE_REFCOUNT32)\n\tduk_uint32_t h_refcount;\n#else\n\tduk_size_t h_refcount;\n#endif\n#else\n\tduk_uint16_t h_strextra16;\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n\tduk_hstring *h_next;\n\t/* No 'h_prev' pointer for strings. */\n};\n\n#define DUK_HEAPHDR_FLAGS_TYPE_MASK      0x00000003UL\n#define DUK_HEAPHDR_FLAGS_FLAG_MASK      (~DUK_HEAPHDR_FLAGS_TYPE_MASK)\n\n                                             /* 2 bits for heap type */\n#define DUK_HEAPHDR_FLAGS_HEAP_START     2   /* 5 heap flags */\n#define DUK_HEAPHDR_FLAGS_USER_START     7   /* 25 user flags */\n\n#define DUK_HEAPHDR_HEAP_FLAG_NUMBER(n)  (DUK_HEAPHDR_FLAGS_HEAP_START + (n))\n#define DUK_HEAPHDR_USER_FLAG_NUMBER(n)  (DUK_HEAPHDR_FLAGS_USER_START + (n))\n#define DUK_HEAPHDR_HEAP_FLAG(n)         (1UL << (DUK_HEAPHDR_FLAGS_HEAP_START + (n)))\n#define DUK_HEAPHDR_USER_FLAG(n)         (1UL << (DUK_HEAPHDR_FLAGS_USER_START + (n)))\n\n#define DUK_HEAPHDR_FLAG_REACHABLE       DUK_HEAPHDR_HEAP_FLAG(0)  /* mark-and-sweep: reachable */\n#define DUK_HEAPHDR_FLAG_TEMPROOT        DUK_HEAPHDR_HEAP_FLAG(1)  /* mark-and-sweep: children not processed */\n#define DUK_HEAPHDR_FLAG_FINALIZABLE     DUK_HEAPHDR_HEAP_FLAG(2)  /* mark-and-sweep: finalizable (on current pass) */\n#define DUK_HEAPHDR_FLAG_FINALIZED       DUK_HEAPHDR_HEAP_FLAG(3)  /* mark-and-sweep: finalized (on previous pass) */\n#define DUK_HEAPHDR_FLAG_READONLY        DUK_HEAPHDR_HEAP_FLAG(4)  /* read-only object, in code section */\n\n#define DUK_HTYPE_MIN                    0\n#define DUK_HTYPE_STRING                 0\n#define DUK_HTYPE_OBJECT                 1\n#define DUK_HTYPE_BUFFER                 2\n#define DUK_HTYPE_MAX                    2\n\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HEAPHDR_GET_NEXT(heap,h) \\\n\t((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_next16))\n#define DUK_HEAPHDR_SET_NEXT(heap,h,val)   do { \\\n\t\t(h)->h_next16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) val); \\\n\t} while (0)\n#else\n#define DUK_HEAPHDR_GET_NEXT(heap,h)  ((h)->h_next)\n#define DUK_HEAPHDR_SET_NEXT(heap,h,val)   do { \\\n\t\t(h)->h_next = (val); \\\n\t} while (0)\n#endif\n\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HEAPHDR_GET_PREV(heap,h) \\\n\t((duk_heaphdr *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->h_prev16))\n#define DUK_HEAPHDR_SET_PREV(heap,h,val)   do { \\\n\t\t(h)->h_prev16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (val)); \\\n\t} while (0)\n#else\n#define DUK_HEAPHDR_GET_PREV(heap,h)       ((h)->h_prev)\n#define DUK_HEAPHDR_SET_PREV(heap,h,val)   do { \\\n\t\t(h)->h_prev = (val); \\\n\t} while (0)\n#endif\n#endif\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n#define DUK_HEAPHDR_GET_REFCOUNT(h)   ((h)->h_refcount)\n#define DUK_HEAPHDR_SET_REFCOUNT(h,val)  do { \\\n\t\t(h)->h_refcount = (val); \\\n\t\tDUK_ASSERT((h)->h_refcount == (val));  /* No truncation. */ \\\n\t} while (0)\n#define DUK_HEAPHDR_PREINC_REFCOUNT(h)  (++(h)->h_refcount)  /* result: updated refcount */\n#define DUK_HEAPHDR_PREDEC_REFCOUNT(h)  (--(h)->h_refcount)  /* result: updated refcount */\n#else\n/* refcount macros not defined without refcounting, caller must #if defined() now */\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n/*\n *  Note: type is treated as a field separate from flags, so some masking is\n *  involved in the macros below.\n */\n\n#define DUK_HEAPHDR_GET_FLAGS_RAW(h)  ((h)->h_flags)\n#define DUK_HEAPHDR_SET_FLAGS_RAW(h,val)  do { \\\n\t\t(h)->h_flags = (val); } \\\n\t}\n#define DUK_HEAPHDR_GET_FLAGS(h)      ((h)->h_flags & DUK_HEAPHDR_FLAGS_FLAG_MASK)\n#define DUK_HEAPHDR_SET_FLAGS(h,val)  do { \\\n\t\t(h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) | (val); \\\n\t} while (0)\n#define DUK_HEAPHDR_GET_TYPE(h)       ((h)->h_flags & DUK_HEAPHDR_FLAGS_TYPE_MASK)\n#define DUK_HEAPHDR_SET_TYPE(h,val)   do { \\\n\t\t(h)->h_flags = ((h)->h_flags & ~(DUK_HEAPHDR_FLAGS_TYPE_MASK)) | (val); \\\n\t} while (0)\n\n/* Comparison for type >= DUK_HTYPE_MIN skipped; because DUK_HTYPE_MIN is zero\n * and the comparison is unsigned, it's always true and generates warnings.\n */\n#define DUK_HEAPHDR_HTYPE_VALID(h)    ( \\\n\tDUK_HEAPHDR_GET_TYPE((h)) <= DUK_HTYPE_MAX \\\n\t)\n\n#define DUK_HEAPHDR_SET_TYPE_AND_FLAGS(h,tval,fval)  do { \\\n\t\t(h)->h_flags = ((tval) & DUK_HEAPHDR_FLAGS_TYPE_MASK) | \\\n\t\t               ((fval) & DUK_HEAPHDR_FLAGS_FLAG_MASK); \\\n\t} while (0)\n\n#define DUK_HEAPHDR_SET_FLAG_BITS(h,bits)  do { \\\n\t\tDUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \\\n\t\t(h)->h_flags |= (bits); \\\n\t} while (0)\n\n#define DUK_HEAPHDR_CLEAR_FLAG_BITS(h,bits)  do { \\\n\t\tDUK_ASSERT(((bits) & ~(DUK_HEAPHDR_FLAGS_FLAG_MASK)) == 0); \\\n\t\t(h)->h_flags &= ~((bits)); \\\n\t} while (0)\n\n#define DUK_HEAPHDR_CHECK_FLAG_BITS(h,bits)  (((h)->h_flags & (bits)) != 0)\n\n#define DUK_HEAPHDR_SET_REACHABLE(h)      DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)\n#define DUK_HEAPHDR_CLEAR_REACHABLE(h)    DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)\n#define DUK_HEAPHDR_HAS_REACHABLE(h)      DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_REACHABLE)\n\n#define DUK_HEAPHDR_SET_TEMPROOT(h)       DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)\n#define DUK_HEAPHDR_CLEAR_TEMPROOT(h)     DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)\n#define DUK_HEAPHDR_HAS_TEMPROOT(h)       DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_TEMPROOT)\n\n#define DUK_HEAPHDR_SET_FINALIZABLE(h)    DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)\n#define DUK_HEAPHDR_CLEAR_FINALIZABLE(h)  DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)\n#define DUK_HEAPHDR_HAS_FINALIZABLE(h)    DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZABLE)\n\n#define DUK_HEAPHDR_SET_FINALIZED(h)      DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)\n#define DUK_HEAPHDR_CLEAR_FINALIZED(h)    DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)\n#define DUK_HEAPHDR_HAS_FINALIZED(h)      DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_FINALIZED)\n\n#define DUK_HEAPHDR_SET_READONLY(h)       DUK_HEAPHDR_SET_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)\n#define DUK_HEAPHDR_CLEAR_READONLY(h)     DUK_HEAPHDR_CLEAR_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)\n#define DUK_HEAPHDR_HAS_READONLY(h)       DUK_HEAPHDR_CHECK_FLAG_BITS((h),DUK_HEAPHDR_FLAG_READONLY)\n\n/* get or set a range of flags; m=first bit number, n=number of bits */\n#define DUK_HEAPHDR_GET_FLAG_RANGE(h,m,n)  (((h)->h_flags >> (m)) & ((1UL << (n)) - 1UL))\n\n#define DUK_HEAPHDR_SET_FLAG_RANGE(h,m,n,v)  do { \\\n\t\t(h)->h_flags = \\\n\t\t\t((h)->h_flags & (~(((1UL << (n)) - 1UL) << (m)))) \\\n\t\t\t| ((v) << (m)); \\\n\t} while (0)\n\n/* init pointer fields to null */\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n#define DUK_HEAPHDR_INIT_NULLS(h)       do { \\\n\t\tDUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \\\n\t\tDUK_HEAPHDR_SET_PREV((h), (void *) NULL); \\\n\t} while (0)\n#else\n#define DUK_HEAPHDR_INIT_NULLS(h)       do { \\\n\t\tDUK_HEAPHDR_SET_NEXT((h), (void *) NULL); \\\n\t} while (0)\n#endif\n\n#define DUK_HEAPHDR_STRING_INIT_NULLS(h)  do { \\\n\t\t(h)->h_next = NULL; \\\n\t} while (0)\n\n/*\n *  Type tests\n */\n\n/* Take advantage of the fact that for DUK_HTYPE_xxx numbers the lowest bit\n * is only set for DUK_HTYPE_OBJECT (= 1).\n */\n#if 0\n#define DUK_HEAPHDR_IS_OBJECT(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_OBJECT)\n#endif\n#define DUK_HEAPHDR_IS_OBJECT(h) ((h)->h_flags & 0x01UL)\n#define DUK_HEAPHDR_IS_STRING(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_STRING)\n#define DUK_HEAPHDR_IS_BUFFER(h) (DUK_HEAPHDR_GET_TYPE((h)) == DUK_HTYPE_BUFFER)\n\n/*\n *  Assert helpers\n */\n\n/* Check that prev/next links are consistent: if e.g. h->prev is != NULL,\n * h->prev->next should point back to h.\n */\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP) && defined(DUK_USE_ASSERTIONS)\n#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tduk_heaphdr *h__prev, *h__next; \\\n\t\t\th__prev = DUK_HEAPHDR_GET_PREV((heap), (h)); \\\n\t\t\th__next = DUK_HEAPHDR_GET_NEXT((heap), (h)); \\\n\t\t\tDUK_ASSERT(h__prev == NULL || (DUK_HEAPHDR_GET_NEXT((heap), h__prev) == (h))); \\\n\t\t\tDUK_ASSERT(h__next == NULL || (DUK_HEAPHDR_GET_PREV((heap), h__next) == (h))); \\\n\t\t} \\\n\t} while (0)\n#else\n#define DUK_ASSERT_HEAPHDR_LINKS(heap,h) do {} while (0)\n#endif\n\n#define DUK_ASSERT_HEAPHDR_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((h))); \\\n\t} while (0)\n\n#endif  /* DUK_HEAPHDR_H_INCLUDED */\n/* #include duk_refcount.h */\n#line 1 \"duk_refcount.h\"\n/*\n *  Reference counting helper macros.  The macros take a thread argument\n *  and must thus always be executed in a specific thread context.  The\n *  thread argument is not really needed anymore: DECREF can operate with\n *  a heap pointer only, and INCREF needs neither.\n */\n\n#if !defined(DUK_REFCOUNT_H_INCLUDED)\n#define DUK_REFCOUNT_H_INCLUDED\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\n#if defined(DUK_USE_ROM_OBJECTS)\n/* With ROM objects \"needs refcount update\" is true when the value is\n * heap allocated and is not a ROM object.\n */\n/* XXX: double evaluation for 'tv' argument. */\n#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv) \\\n\t(DUK_TVAL_IS_HEAP_ALLOCATED((tv)) && !DUK_HEAPHDR_HAS_READONLY(DUK_TVAL_GET_HEAPHDR((tv))))\n#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h)  (!DUK_HEAPHDR_HAS_READONLY((h)))\n#else  /* DUK_USE_ROM_OBJECTS */\n/* Without ROM objects \"needs refcount update\" == is heap allocated. */\n#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)    DUK_TVAL_IS_HEAP_ALLOCATED((tv))\n#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h)  1\n#endif  /* DUK_USE_ROM_OBJECTS */\n\n/* Fast variants, inline refcount operations except for refzero handling.\n * Can be used explicitly when speed is always more important than size.\n * For a good compiler and a single file build, these are basically the\n * same as a forced inline.\n */\n#define DUK_TVAL_INCREF_FAST(thr,tv) do { \\\n\t\tduk_tval *duk__tv = (tv); \\\n\t\tDUK_ASSERT(duk__tv != NULL); \\\n\t\tif (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \\\n\t\t\tduk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \\\n\t\t\tDUK_ASSERT(duk__h != NULL); \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \\\n\t\t\tDUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0);  /* No wrapping. */ \\\n\t\t} \\\n\t} while (0)\n#define DUK_TVAL_DECREF_FAST(thr,tv) do { \\\n\t\tduk_tval *duk__tv = (tv); \\\n\t\tDUK_ASSERT(duk__tv != NULL); \\\n\t\tif (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \\\n\t\t\tduk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \\\n\t\t\tDUK_ASSERT(duk__h != NULL); \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \\\n\t\t\tif (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \\\n\t\t\t\tduk_heaphdr_refzero((thr), duk__h); \\\n\t\t\t} \\\n\t\t} \\\n\t} while (0)\n#define DUK_TVAL_DECREF_NORZ_FAST(thr,tv) do { \\\n\t\tduk_tval *duk__tv = (tv); \\\n\t\tDUK_ASSERT(duk__tv != NULL); \\\n\t\tif (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk__tv)) { \\\n\t\t\tduk_heaphdr *duk__h = DUK_TVAL_GET_HEAPHDR(duk__tv); \\\n\t\t\tDUK_ASSERT(duk__h != NULL); \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \\\n\t\t\tif (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \\\n\t\t\t\tduk_heaphdr_refzero_norz((thr), duk__h); \\\n\t\t\t} \\\n\t\t} \\\n\t} while (0)\n#define DUK_HEAPHDR_INCREF_FAST(thr,h) do { \\\n\t\tduk_heaphdr *duk__h = (duk_heaphdr *) (h); \\\n\t\tDUK_ASSERT(duk__h != NULL); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \\\n\t\tif (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \\\n\t\t\tDUK_HEAPHDR_PREINC_REFCOUNT(duk__h); \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) != 0);  /* No wrapping. */ \\\n\t\t} \\\n\t} while (0)\n#define DUK_HEAPHDR_DECREF_FAST_RAW(thr,h,rzcall,rzcast) do { \\\n\t\tduk_heaphdr *duk__h = (duk_heaphdr *) (h); \\\n\t\tDUK_ASSERT(duk__h != NULL); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(duk__h)); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(duk__h) > 0); \\\n\t\tif (DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(duk__h)) { \\\n\t\t\tif (DUK_HEAPHDR_PREDEC_REFCOUNT(duk__h) == 0) { \\\n\t\t\t\t(rzcall)((thr), (rzcast) duk__h); \\\n\t\t\t} \\\n\t\t} \\\n\t} while (0)\n#define DUK_HEAPHDR_DECREF_FAST(thr,h) \\\n\tDUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *)\n#define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h) \\\n\tDUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *)\n\n/* Slow variants, call to a helper to reduce code size.\n * Can be used explicitly when size is always more important than speed.\n */\n#define DUK_TVAL_INCREF_SLOW(thr,tv)         do { duk_tval_incref((tv)); } while (0)\n#define DUK_TVAL_DECREF_SLOW(thr,tv)         do { duk_tval_decref((thr), (tv)); } while (0)\n#define DUK_TVAL_DECREF_NORZ_SLOW(thr,tv)    do { duk_tval_decref_norz((thr), (tv)); } while (0)\n#define DUK_HEAPHDR_INCREF_SLOW(thr,h)       do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)\n#define DUK_HEAPHDR_DECREF_SLOW(thr,h)       do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)\n#define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h)  do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)\n#define DUK_HSTRING_INCREF_SLOW(thr,h)       do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)\n#define DUK_HSTRING_DECREF_SLOW(thr,h)       do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)\n#define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h)  do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)\n#define DUK_HBUFFER_INCREF_SLOW(thr,h)       do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)\n#define DUK_HBUFFER_DECREF_SLOW(thr,h)       do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)\n#define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h)  do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)\n#define DUK_HOBJECT_INCREF_SLOW(thr,h)       do { duk_heaphdr_incref((duk_heaphdr *) (h)); } while (0)\n#define DUK_HOBJECT_DECREF_SLOW(thr,h)       do { duk_heaphdr_decref((thr), (duk_heaphdr *) (h)); } while (0)\n#define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h)  do { duk_heaphdr_decref_norz((thr), (duk_heaphdr *) (h)); } while (0)\n\n/* Default variants.  Selection depends on speed/size preference.\n * Concretely: with gcc 4.8.1 -Os x64 the difference in final binary\n * is about +1kB for _FAST variants.\n */\n#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)\n/* XXX: It would be nice to specialize for specific duk_hobject subtypes\n * but current refzero queue handling prevents that.\n */\n#define DUK_TVAL_INCREF(thr,tv)                DUK_TVAL_INCREF_FAST((thr),(tv))\n#define DUK_TVAL_DECREF(thr,tv)                DUK_TVAL_DECREF_FAST((thr),(tv))\n#define DUK_TVAL_DECREF_NORZ(thr,tv)           DUK_TVAL_DECREF_NORZ_FAST((thr),(tv))\n#define DUK_HEAPHDR_INCREF(thr,h)              DUK_HEAPHDR_INCREF_FAST((thr),(h))\n#define DUK_HEAPHDR_DECREF(thr,h)              DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero,duk_heaphdr *)\n#define DUK_HEAPHDR_DECREF_NORZ(thr,h)         DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_heaphdr_refzero_norz,duk_heaphdr *)\n#define DUK_HSTRING_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))\n#define DUK_HSTRING_DECREF(thr,h)              DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *)\n#define DUK_HSTRING_DECREF_NORZ(thr,h)         DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hstring_refzero,duk_hstring *)  /* no 'norz' variant */\n#define DUK_HOBJECT_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))\n#define DUK_HOBJECT_DECREF(thr,h)              DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)\n#define DUK_HOBJECT_DECREF_NORZ(thr,h)         DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)\n#define DUK_HBUFFER_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))\n#define DUK_HBUFFER_DECREF(thr,h)              DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *)\n#define DUK_HBUFFER_DECREF_NORZ(thr,h)         DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hbuffer_refzero,duk_hbuffer *)  /* no 'norz' variant */\n#define DUK_HCOMPFUNC_INCREF(thr,h)            DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HCOMPFUNC_DECREF(thr,h)            DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)\n#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h)       DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)\n#define DUK_HNATFUNC_INCREF(thr,h)             DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HNATFUNC_DECREF(thr,h)             DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)\n#define DUK_HNATFUNC_DECREF_NORZ(thr,h)        DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)\n#define DUK_HBUFOBJ_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HBUFOBJ_DECREF(thr,h)              DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)\n#define DUK_HBUFOBJ_DECREF_NORZ(thr,h)         DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)\n#define DUK_HTHREAD_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HTHREAD_DECREF(thr,h)              DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero,duk_hobject *)\n#define DUK_HTHREAD_DECREF_NORZ(thr,h)         DUK_HEAPHDR_DECREF_FAST_RAW((thr),(h),duk_hobject_refzero_norz,duk_hobject *)\n#else\n#define DUK_TVAL_INCREF(thr,tv)                DUK_TVAL_INCREF_SLOW((thr),(tv))\n#define DUK_TVAL_DECREF(thr,tv)                DUK_TVAL_DECREF_SLOW((thr),(tv))\n#define DUK_TVAL_DECREF_NORZ(thr,tv)           DUK_TVAL_DECREF_NORZ_SLOW((thr),(tv))\n#define DUK_HEAPHDR_INCREF(thr,h)              DUK_HEAPHDR_INCREF_SLOW((thr),(h))\n#define DUK_HEAPHDR_DECREF(thr,h)              DUK_HEAPHDR_DECREF_SLOW((thr),(h))\n#define DUK_HEAPHDR_DECREF_NORZ(thr,h)         DUK_HEAPHDR_DECREF_NORZ_SLOW((thr),(h))\n#define DUK_HSTRING_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))\n#define DUK_HSTRING_DECREF(thr,h)              DUK_HSTRING_DECREF_SLOW((thr),(h))\n#define DUK_HSTRING_DECREF_NORZ(thr,h)         DUK_HSTRING_DECREF_NORZ_SLOW((thr),(h))\n#define DUK_HOBJECT_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))\n#define DUK_HOBJECT_DECREF(thr,h)              DUK_HOBJECT_DECREF_SLOW((thr),(h))\n#define DUK_HOBJECT_DECREF_NORZ(thr,h)         DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(h))\n#define DUK_HBUFFER_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) (h))\n#define DUK_HBUFFER_DECREF(thr,h)              DUK_HBUFFER_DECREF_SLOW((thr),(h))\n#define DUK_HBUFFER_DECREF_NORZ(thr,h)         DUK_HBUFFER_DECREF_NORZ_SLOW((thr),(h))\n#define DUK_HCOMPFUNC_INCREF(thr,h)            DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HCOMPFUNC_DECREF(thr,h)            DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)\n#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h)       DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)\n#define DUK_HNATFUNC_INCREF(thr,h)             DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HNATFUNC_DECREF(thr,h)             DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)\n#define DUK_HNATFUNC_DECREF_NORZ(thr,h)        DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)\n#define DUK_HBUFOBJ_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HBUFOBJ_DECREF(thr,h)              DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)\n#define DUK_HBUFOB_DECREF_NORZ(thr,h)          DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)\n#define DUK_HTHREAD_INCREF(thr,h)              DUK_HEAPHDR_INCREF((thr),(duk_heaphdr *) &(h)->obj)\n#define DUK_HTHREAD_DECREF(thr,h)              DUK_HOBJECT_DECREF_SLOW((thr),(duk_hobject *) &(h)->obj)\n#define DUK_HTHREAD_DECREF_NORZ(thr,h)         DUK_HOBJECT_DECREF_NORZ_SLOW((thr),(duk_hobject *) &(h)->obj)\n#endif\n\n/* Convenience for some situations; the above macros don't allow NULLs\n * for performance reasons.  Macros cover only actually needed cases.\n */\n#define DUK_HEAPHDR_INCREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HEAPHDR_INCREF((thr), (duk_heaphdr *) (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HEAPHDR_DECREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HEAPHDR_DECREF((thr), (duk_heaphdr *) (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HEAPHDR_DECREF_NORZ_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HEAPHDR_DECREF_NORZ((thr), (duk_heaphdr *) (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HOBJECT_INCREF((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HOBJECT_DECREF((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HOBJECT_DECREF_NORZ((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HBUFFER_INCREF((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HBUFFER_DECREF((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HBUFFER_DECREF_NORZ((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HTHREAD_INCREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HTHREAD_INCREF((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HTHREAD_DECREF_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HTHREAD_DECREF((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n#define DUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr,h) do { \\\n\t\tif ((h) != NULL) { \\\n\t\t\tDUK_HTHREAD_DECREF_NORZ((thr), (h)); \\\n\t\t} \\\n\t} while (0)\n\n/* Called after one or more DECREF NORZ calls to handle pending side effects.\n * At present DECREF NORZ does freeing inline but doesn't execute finalizers,\n * so these macros check for pending finalizers and execute them.  The FAST\n * variant is performance critical.\n */\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n#define DUK_REFZERO_CHECK_FAST(thr) do { \\\n\t\tduk_refzero_check_fast((thr)); \\\n\t} while (0)\n#define DUK_REFZERO_CHECK_SLOW(thr) do { \\\n\t\tduk_refzero_check_slow((thr)); \\\n\t} while (0)\n#else  /* DUK_USE_FINALIZER_SUPPORT */\n#define DUK_REFZERO_CHECK_FAST(thr) do { } while (0)\n#define DUK_REFZERO_CHECK_SLOW(thr) do { } while (0)\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n/*\n *  Macros to set a duk_tval and update refcount of the target (decref the\n *  old value and incref the new value if necessary).  This is both performance\n *  and footprint critical; any changes made should be measured for size/speed.\n */\n\n#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_UNDEFINED(tv__dst); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_UNDEFINED(tv__dst); \\\n\t\tDUK_TVAL_DECREF_NORZ((thr), &tv__tmp); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_UNUSED(tv__dst); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_NULL(tv__dst); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_NUMBER(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_NAN(tv__dst); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_I48(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n#define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_I32(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n#define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_U32(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n#else\n#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \\\n\tDUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval))\n#endif  /* DUK_USE_FASTINT */\n\n#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_STRING(tv__dst, (newval)); \\\n\t\tDUK_HSTRING_INCREF((thr), (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_OBJECT(tv__dst, (newval)); \\\n\t\tDUK_HOBJECT_INCREF((thr), (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_BUFFER(tv__dst, (newval)); \\\n\t\tDUK_HBUFFER_INCREF((thr), (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; duk_tval tv__tmp; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_POINTER(tv__dst, (newval)); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n/* DUK_TVAL_SET_TVAL_UPDREF() is used a lot in executor, property lookups,\n * etc, so it's very important for performance.  Measure when changing.\n *\n * NOTE: the source and destination duk_tval pointers may be the same, and\n * the macros MUST deal with that correctly.\n */\n\n/* Original idiom used, minimal code size. */\n#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \\\n\t\tduk_tval *tv__dst, *tv__src; duk_tval tv__tmp; \\\n\t\ttv__dst = (tvptr_dst); tv__src = (tvptr_src); \\\n\t\tDUK_TVAL_SET_TVAL(&tv__tmp, tv__dst); \\\n\t\tDUK_TVAL_SET_TVAL(tv__dst, tv__src); \\\n\t\tDUK_TVAL_INCREF((thr), tv__src); \\\n\t\tDUK_TVAL_DECREF((thr), &tv__tmp);  /* side effects */ \\\n\t} while (0)\n\n/* Faster alternative: avoid making a temporary copy of tvptr_dst and use\n * fast incref/decref macros.\n */\n#define DUK_TVAL_SET_TVAL_UPDREF_ALT1(thr,tvptr_dst,tvptr_src) do { \\\n\t\tduk_tval *tv__dst, *tv__src; duk_heaphdr *h__obj; \\\n\t\ttv__dst = (tvptr_dst); tv__src = (tvptr_src); \\\n\t\tDUK_TVAL_INCREF_FAST((thr), tv__src); \\\n\t\tif (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv__dst)) { \\\n\t\t\th__obj = DUK_TVAL_GET_HEAPHDR(tv__dst); \\\n\t\t\tDUK_ASSERT(h__obj != NULL); \\\n\t\t\tDUK_TVAL_SET_TVAL(tv__dst, tv__src); \\\n\t\t\tDUK_HEAPHDR_DECREF_FAST((thr), h__obj);  /* side effects */ \\\n\t\t} else { \\\n\t\t\tDUK_TVAL_SET_TVAL(tv__dst, tv__src); \\\n\t\t} \\\n\t} while (0)\n\n/* XXX: no optimized variants yet */\n#define DUK_TVAL_SET_UNDEFINED_UPDREF         DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0\n#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ    DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ_ALT0\n#define DUK_TVAL_SET_UNUSED_UPDREF            DUK_TVAL_SET_UNUSED_UPDREF_ALT0\n#define DUK_TVAL_SET_NULL_UPDREF              DUK_TVAL_SET_NULL_UPDREF_ALT0\n#define DUK_TVAL_SET_BOOLEAN_UPDREF           DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0\n#define DUK_TVAL_SET_NUMBER_UPDREF            DUK_TVAL_SET_NUMBER_UPDREF_ALT0\n#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF    DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0\n#define DUK_TVAL_SET_DOUBLE_UPDREF            DUK_TVAL_SET_DOUBLE_UPDREF_ALT0\n#define DUK_TVAL_SET_NAN_UPDREF               DUK_TVAL_SET_NAN_UPDREF_ALT0\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_SET_I48_UPDREF               DUK_TVAL_SET_I48_UPDREF_ALT0\n#define DUK_TVAL_SET_I32_UPDREF               DUK_TVAL_SET_I32_UPDREF_ALT0\n#define DUK_TVAL_SET_U32_UPDREF               DUK_TVAL_SET_U32_UPDREF_ALT0\n#else\n#define DUK_TVAL_SET_I48_UPDREF               DUK_TVAL_SET_DOUBLE_CAST_UPDREF  /* XXX: fast int-to-double */\n#define DUK_TVAL_SET_I32_UPDREF               DUK_TVAL_SET_DOUBLE_CAST_UPDREF\n#define DUK_TVAL_SET_U32_UPDREF               DUK_TVAL_SET_DOUBLE_CAST_UPDREF\n#endif  /* DUK_USE_FASTINT */\n#define DUK_TVAL_SET_FASTINT_UPDREF           DUK_TVAL_SET_I48_UPDREF  /* convenience */\n#define DUK_TVAL_SET_LIGHTFUNC_UPDREF         DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0\n#define DUK_TVAL_SET_STRING_UPDREF            DUK_TVAL_SET_STRING_UPDREF_ALT0\n#define DUK_TVAL_SET_OBJECT_UPDREF            DUK_TVAL_SET_OBJECT_UPDREF_ALT0\n#define DUK_TVAL_SET_BUFFER_UPDREF            DUK_TVAL_SET_BUFFER_UPDREF_ALT0\n#define DUK_TVAL_SET_POINTER_UPDREF           DUK_TVAL_SET_POINTER_UPDREF_ALT0\n\n#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)\n/* Optimized for speed. */\n#define DUK_TVAL_SET_TVAL_UPDREF              DUK_TVAL_SET_TVAL_UPDREF_ALT1\n#define DUK_TVAL_SET_TVAL_UPDREF_FAST         DUK_TVAL_SET_TVAL_UPDREF_ALT1\n#define DUK_TVAL_SET_TVAL_UPDREF_SLOW         DUK_TVAL_SET_TVAL_UPDREF_ALT0\n#else\n/* Optimized for size. */\n#define DUK_TVAL_SET_TVAL_UPDREF              DUK_TVAL_SET_TVAL_UPDREF_ALT0\n#define DUK_TVAL_SET_TVAL_UPDREF_FAST         DUK_TVAL_SET_TVAL_UPDREF_ALT0\n#define DUK_TVAL_SET_TVAL_UPDREF_SLOW         DUK_TVAL_SET_TVAL_UPDREF_ALT0\n#endif\n\n#else  /* DUK_USE_REFERENCE_COUNTING */\n\n#define DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)     0\n#define DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE(h)   0\n\n#define DUK_TVAL_INCREF_FAST(thr,v)            do {} while (0) /* nop */\n#define DUK_TVAL_DECREF_FAST(thr,v)            do {} while (0) /* nop */\n#define DUK_TVAL_DECREF_NORZ_FAST(thr,v)       do {} while (0) /* nop */\n#define DUK_TVAL_INCREF_SLOW(thr,v)            do {} while (0) /* nop */\n#define DUK_TVAL_DECREF_SLOW(thr,v)            do {} while (0) /* nop */\n#define DUK_TVAL_DECREF_NORZ_SLOW(thr,v)       do {} while (0) /* nop */\n#define DUK_TVAL_INCREF(thr,v)                 do {} while (0) /* nop */\n#define DUK_TVAL_DECREF(thr,v)                 do {} while (0) /* nop */\n#define DUK_TVAL_DECREF_NORZ(thr,v)            do {} while (0) /* nop */\n#define DUK_HEAPHDR_INCREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HEAPHDR_DECREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HEAPHDR_DECREF_NORZ_FAST(thr,h)    do {} while (0) /* nop */\n#define DUK_HEAPHDR_INCREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HEAPHDR_DECREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HEAPHDR_DECREF_NORZ_SLOW(thr,h)    do {} while (0) /* nop */\n#define DUK_HEAPHDR_INCREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HEAPHDR_DECREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HEAPHDR_DECREF_NORZ(thr,h)         do {} while (0) /* nop */\n#define DUK_HSTRING_INCREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HSTRING_DECREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HSTRING_DECREF_NORZ_FAST(thr,h)    do {} while (0) /* nop */\n#define DUK_HSTRING_INCREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HSTRING_DECREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HSTRING_DECREF_NORZ_SLOW(thr,h)    do {} while (0) /* nop */\n#define DUK_HSTRING_INCREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HSTRING_DECREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HSTRING_DECREF_NORZ(thr,h)         do {} while (0) /* nop */\n#define DUK_HOBJECT_INCREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF_NORZ_FAST(thr,h)    do {} while (0) /* nop */\n#define DUK_HOBJECT_INCREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF_NORZ_SLOW(thr,h)    do {} while (0) /* nop */\n#define DUK_HOBJECT_INCREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF_NORZ(thr,h)         do {} while (0) /* nop */\n#define DUK_HBUFFER_INCREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF_FAST(thr,h)         do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF_NORZ_FAST(thr,h)    do {} while (0) /* nop */\n#define DUK_HBUFFER_INCREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF_SLOW(thr,h)         do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF_NORZ_SLOW(thr,h)    do {} while (0) /* nop */\n#define DUK_HBUFFER_INCREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF_NORZ(thr,h)         do {} while (0) /* nop */\n\n#define DUK_HCOMPFUNC_INCREF(thr,h)            do {} while (0) /* nop */\n#define DUK_HCOMPFUNC_DECREF(thr,h)            do {} while (0) /* nop */\n#define DUK_HCOMPFUNC_DECREF_NORZ(thr,h)       do {} while (0) /* nop */\n#define DUK_HNATFUNC_INCREF(thr,h)             do {} while (0) /* nop */\n#define DUK_HNATFUNC_DECREF(thr,h)             do {} while (0) /* nop */\n#define DUK_HNATFUNC_DECREF_NORZ(thr,h)        do {} while (0) /* nop */\n#define DUK_HBUFOBJ_INCREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HBUFOBJ_DECREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HBUFOBJ_DECREF_NORZ(thr,h)         do {} while (0) /* nop */\n#define DUK_HTHREAD_INCREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HTHREAD_DECREF(thr,h)              do {} while (0) /* nop */\n#define DUK_HTHREAD_DECREF_NORZ(thr,h)         do {} while (0) /* nop */\n#define DUK_HOBJECT_INCREF_ALLOWNULL(thr,h)    do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF_ALLOWNULL(thr,h)    do {} while (0) /* nop */\n#define DUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr,h)  do {} while (0) /* nop */\n#define DUK_HBUFFER_INCREF_ALLOWNULL(thr,h)    do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF_ALLOWNULL(thr,h)    do {} while (0) /* nop */\n#define DUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr,h)  do {} while (0) /* nop */\n\n#define DUK_REFZERO_CHECK_FAST(thr)            do {} while (0) /* nop */\n#define DUK_REFZERO_CHECK_SLOW(thr)            do {} while (0) /* nop */\n\n#define DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_UNDEFINED(tv__dst); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_UNUSED_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_UNUSED(tv__dst); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_NULL_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_NULL(tv__dst); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_BOOLEAN(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_NUMBER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_NUMBER(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_NUMBER_CHKFAST_FAST(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n#define DUK_TVAL_SET_DOUBLE_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_DOUBLE(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n#define DUK_TVAL_SET_NAN_UPDREF_ALT0(thr,tvptr_dst) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_NAN(tv__dst); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_SET_I48_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_I48(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n#define DUK_TVAL_SET_I32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_I32(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n#define DUK_TVAL_SET_U32_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_U32(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n#else\n#define DUK_TVAL_SET_DOUBLE_CAST_UPDREF(thr,tvptr_dst,newval) \\\n\tDUK_TVAL_SET_DOUBLE_UPDREF((thr), (tvptr_dst), (duk_double_t) (newval))\n#endif  /* DUK_USE_FASTINT */\n\n#define DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0(thr,tvptr_dst,lf_v,lf_fp,lf_flags) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_LIGHTFUNC(tv__dst, (lf_v), (lf_fp), (lf_flags)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_STRING_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_STRING(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_OBJECT_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_OBJECT(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_BUFFER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_BUFFER(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_POINTER_UPDREF_ALT0(thr,tvptr_dst,newval) do { \\\n\t\tduk_tval *tv__dst; tv__dst = (tvptr_dst); \\\n\t\tDUK_TVAL_SET_POINTER(tv__dst, (newval)); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_TVAL_UPDREF_ALT0(thr,tvptr_dst,tvptr_src) do { \\\n\t\tduk_tval *tv__dst, *tv__src; \\\n\t\ttv__dst = (tvptr_dst); tv__src = (tvptr_src); \\\n\t\tDUK_TVAL_SET_TVAL(tv__dst, tv__src); \\\n\t\tDUK_UNREF((thr)); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_UNDEFINED_UPDREF         DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0\n#define DUK_TVAL_SET_UNDEFINED_UPDREF_NORZ    DUK_TVAL_SET_UNDEFINED_UPDREF_ALT0\n#define DUK_TVAL_SET_UNUSED_UPDREF            DUK_TVAL_SET_UNUSED_UPDREF_ALT0\n#define DUK_TVAL_SET_NULL_UPDREF              DUK_TVAL_SET_NULL_UPDREF_ALT0\n#define DUK_TVAL_SET_BOOLEAN_UPDREF           DUK_TVAL_SET_BOOLEAN_UPDREF_ALT0\n#define DUK_TVAL_SET_NUMBER_UPDREF            DUK_TVAL_SET_NUMBER_UPDREF_ALT0\n#define DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF    DUK_TVAL_SET_NUMBER_CHKFAST_UPDREF_ALT0\n#define DUK_TVAL_SET_DOUBLE_UPDREF            DUK_TVAL_SET_DOUBLE_UPDREF_ALT0\n#define DUK_TVAL_SET_NAN_UPDREF               DUK_TVAL_SET_NAN_UPDREF_ALT0\n#if defined(DUK_USE_FASTINT)\n#define DUK_TVAL_SET_I48_UPDREF               DUK_TVAL_SET_I48_UPDREF_ALT0\n#define DUK_TVAL_SET_I32_UPDREF               DUK_TVAL_SET_I32_UPDREF_ALT0\n#define DUK_TVAL_SET_U32_UPDREF               DUK_TVAL_SET_U32_UPDREF_ALT0\n#else\n#define DUK_TVAL_SET_I48_UPDREF               DUK_TVAL_SET_DOUBLE_CAST_UPDREF  /* XXX: fast-int-to-double */\n#define DUK_TVAL_SET_I32_UPDREF               DUK_TVAL_SET_DOUBLE_CAST_UPDREF\n#define DUK_TVAL_SET_U32_UPDREF               DUK_TVAL_SET_DOUBLE_CAST_UPDREF\n#endif  /* DUK_USE_FASTINT */\n#define DUK_TVAL_SET_FASTINT_UPDREF           DUK_TVAL_SET_I48_UPDREF  /* convenience */\n#define DUK_TVAL_SET_LIGHTFUNC_UPDREF         DUK_TVAL_SET_LIGHTFUNC_UPDREF_ALT0\n#define DUK_TVAL_SET_STRING_UPDREF            DUK_TVAL_SET_STRING_UPDREF_ALT0\n#define DUK_TVAL_SET_OBJECT_UPDREF            DUK_TVAL_SET_OBJECT_UPDREF_ALT0\n#define DUK_TVAL_SET_BUFFER_UPDREF            DUK_TVAL_SET_BUFFER_UPDREF_ALT0\n#define DUK_TVAL_SET_POINTER_UPDREF           DUK_TVAL_SET_POINTER_UPDREF_ALT0\n\n#define DUK_TVAL_SET_TVAL_UPDREF              DUK_TVAL_SET_TVAL_UPDREF_ALT0\n#define DUK_TVAL_SET_TVAL_UPDREF_FAST         DUK_TVAL_SET_TVAL_UPDREF_ALT0\n#define DUK_TVAL_SET_TVAL_UPDREF_SLOW         DUK_TVAL_SET_TVAL_UPDREF_ALT0\n\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n/*\n *  Some convenience macros that don't have optimized implementations now.\n */\n\n#define DUK_TVAL_SET_TVAL_UPDREF_NORZ(thr,tv_dst,tv_src) do { \\\n\t\tduk_hthread *duk__thr = (thr); \\\n\t\tduk_tval *duk__dst = (tv_dst); \\\n\t\tduk_tval *duk__src = (tv_src); \\\n\t\tDUK_UNREF(duk__thr); \\\n\t\tDUK_TVAL_DECREF_NORZ(thr, duk__dst); \\\n\t\tDUK_TVAL_SET_TVAL(duk__dst, duk__src); \\\n\t\tDUK_TVAL_INCREF(thr, duk__dst); \\\n\t} while (0)\n\n#define DUK_TVAL_SET_U32_UPDREF_NORZ(thr,tv_dst,val) do { \\\n\t\tduk_hthread *duk__thr = (thr); \\\n\t\tduk_tval *duk__dst = (tv_dst); \\\n\t\tduk_uint32_t duk__val = (duk_uint32_t) (val); \\\n\t\tDUK_UNREF(duk__thr); \\\n\t\tDUK_TVAL_DECREF_NORZ(thr, duk__dst); \\\n\t\tDUK_TVAL_SET_U32(duk__dst, duk__val); \\\n\t} while (0)\n\n/*\n *  Prototypes\n */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_INTERNAL_DECL void duk_refzero_check_slow(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_refzero_check_fast(duk_hthread *thr);\n#endif\nDUK_INTERNAL_DECL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr);\nDUK_INTERNAL_DECL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h);\n#if 0  /* Not needed: fast path handles inline; slow path uses duk_heaphdr_decref() which is needed anyway. */\nDUK_INTERNAL_DECL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h);\nDUK_INTERNAL_DECL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h);\nDUK_INTERNAL_DECL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h);\nDUK_INTERNAL_DECL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h);\nDUK_INTERNAL_DECL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h);\nDUK_INTERNAL_DECL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h);\n#endif\nDUK_INTERNAL_DECL void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h);\nDUK_INTERNAL_DECL void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h);\n#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)\nDUK_INTERNAL_DECL void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h);  /* no 'norz' variant */\nDUK_INTERNAL_DECL void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h);  /* no 'norz' variant */\nDUK_INTERNAL_DECL void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h);\nDUK_INTERNAL_DECL void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h);\n#else\nDUK_INTERNAL_DECL void duk_tval_incref(duk_tval *tv);\nDUK_INTERNAL_DECL void duk_tval_decref(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL void duk_heaphdr_incref(duk_heaphdr *h);\nDUK_INTERNAL_DECL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h);\nDUK_INTERNAL_DECL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h);\n#endif\n#else  /* DUK_USE_REFERENCE_COUNTING */\n/* no refcounting */\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n#endif  /* DUK_REFCOUNT_H_INCLUDED */\n/* #include duk_api_internal.h */\n#line 1 \"duk_api_internal.h\"\n/*\n *  Internal API calls which have (stack and other) semantics similar\n *  to the public API.\n */\n\n#if !defined(DUK_API_INTERNAL_H_INCLUDED)\n#define DUK_API_INTERNAL_H_INCLUDED\n\n#define DUK_INTERNAL_SYMBOL(x)     (\"\\x82\" x)\n\n/* duk_push_sprintf constants */\n#define DUK_PUSH_SPRINTF_INITIAL_SIZE  256L\n#define DUK_PUSH_SPRINTF_SANITY_LIMIT  (1L * 1024L * 1024L * 1024L)\n\n/* Flag ORed to err_code to indicate __FILE__ / __LINE__ is not\n * blamed as source of error for error fileName / lineNumber.\n */\n#define DUK_ERRCODE_FLAG_NOBLAME_FILELINE  (1L << 24)\n\n/* Current convention is to use duk_size_t for value stack sizes and global indices,\n * and duk_idx_t for local frame indices.\n */\nDUK_INTERNAL_DECL void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes);\nDUK_INTERNAL_DECL duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes);\nDUK_INTERNAL_DECL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug);\n\nDUK_INTERNAL_DECL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count);\n\nDUK_INTERNAL_DECL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count);\n\nDUK_INTERNAL_DECL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start);\n\nDUK_INTERNAL_DECL void duk_dup_0(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_dup_1(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_dup_2(duk_hthread *thr);\n/* duk_dup_m1() would be same as duk_dup_top() */\nDUK_INTERNAL_DECL void duk_dup_m2(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_dup_m3(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_dup_m4(duk_hthread *thr);\n\nDUK_INTERNAL_DECL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL void duk_remove_m2(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count);\nDUK_INTERNAL_DECL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count);\n\nDUK_INTERNAL_DECL duk_int_t duk_get_type_tval(duk_tval *tv);\nDUK_INTERNAL_DECL duk_uint_t duk_get_type_mask_tval(duk_tval *tv);\n\n#if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS)\nDUK_INTERNAL_DECL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx);\n#endif\nDUK_INTERNAL_DECL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL void duk_push_tval(duk_hthread *thr, duk_tval *tv);\n\n/* Push the current 'this' binding; throw TypeError if binding is not object\n * coercible (CheckObjectCoercible).\n */\nDUK_INTERNAL_DECL void duk_push_this_check_object_coercible(duk_hthread *thr);\n\n/* duk_push_this() + CheckObjectCoercible() + duk_to_object() */\nDUK_INTERNAL_DECL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr);\n\n/* duk_push_this() + CheckObjectCoercible() + duk_to_string() */\nDUK_INTERNAL_DECL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr);\n\nDUK_INTERNAL_DECL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i);\n\n/* Get a borrowed duk_tval pointer to the current 'this' binding.  Caller must\n * make sure there's an active callstack entry.  Note that the returned pointer\n * is unstable with regards to side effects.\n */\nDUK_INTERNAL_DECL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr);\n\n/* XXX: add fastint support? */\n#define duk_push_u64(thr,val) \\\n\tduk_push_number((thr), (duk_double_t) (val))\n#define duk_push_i64(thr,val) \\\n\tduk_push_number((thr), (duk_double_t) (val))\n\n/* duk_push_(u)int() is guaranteed to support at least (un)signed 32-bit range */\n#define duk_push_u32(thr,val) \\\n\tduk_push_uint((thr), (duk_uint_t) (val))\n#define duk_push_i32(thr,val) \\\n\tduk_push_int((thr), (duk_int_t) (val))\n\n/* sometimes stack and array indices need to go on the stack */\n#define duk_push_idx(thr,val) \\\n\tduk_push_int((thr), (duk_int_t) (val))\n#define duk_push_uarridx(thr,val) \\\n\tduk_push_uint((thr), (duk_uint_t) (val))\n#define duk_push_size_t(thr,val) \\\n\tduk_push_uint((thr), (duk_uint_t) (val))  /* XXX: assumed to fit for now */\n\nDUK_INTERNAL_DECL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv);\n\nDUK_INTERNAL_DECL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len, duk_bool_t throw_flag, duk_bool_t *out_isbuffer);\n\nDUK_INTERNAL_DECL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum);\n\nDUK_INTERNAL_DECL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask);\nDUK_INTERNAL_DECL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask);\nDUK_INTERNAL_DECL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask);\n#define duk_require_hobject_promote_lfunc(thr,idx) \\\n\tduk_require_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC)\n#define duk_get_hobject_promote_lfunc(thr,idx) \\\n\tduk_get_hobject_promote_mask((thr), (idx), DUK_TYPE_MASK_LIGHTFUNC)\n\n#if 0  /*unused*/\nDUK_INTERNAL_DECL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx);\n#endif\n\nDUK_INTERNAL_DECL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv);\n\nDUK_INTERNAL_DECL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hstring *duk_to_hstring_m1(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL duk_double_t duk_to_number_m1(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_double_t duk_to_number_m2(duk_hthread *thr);\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)  /* only needed by debugger for now */\nDUK_INTERNAL_DECL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx);\n#endif\nDUK_INTERNAL_DECL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv);\n\nDUK_INTERNAL_DECL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped);  /* out_clamped=NULL, RangeError if outside range */\nDUK_INTERNAL_DECL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval);\nDUK_INTERNAL_DECL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL_DECL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx);\n#endif\nDUK_INTERNAL_DECL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len);\nDUK_INTERNAL_DECL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx);\n\nDUK_INTERNAL_DECL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum);\n\nDUK_INTERNAL_DECL void duk_push_hstring(duk_hthread *thr, duk_hstring *h);\nDUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx);\nDUK_INTERNAL_DECL void duk_push_hstring_empty(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_push_hobject(duk_hthread *thr, duk_hobject *h);\nDUK_INTERNAL_DECL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h);\n#define duk_push_hthread(thr,h) \\\n\tduk_push_hobject((thr), (duk_hobject *) (h))\n#define duk_push_hnatfunc(thr,h) \\\n\tduk_push_hobject((thr), (duk_hobject *) (h))\nDUK_INTERNAL_DECL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx);\nDUK_INTERNAL_DECL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx);\nDUK_INTERNAL_DECL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto);\nDUK_INTERNAL_DECL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs);\nDUK_INTERNAL_DECL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs);\n\n/* XXX: duk_push_harray() and duk_push_hcompfunc() are inconsistent with\n * duk_push_hobject() etc which don't create a new value.\n */\nDUK_INTERNAL_DECL duk_harray *duk_push_harray(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size);\nDUK_INTERNAL_DECL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size);\n\nDUK_INTERNAL_DECL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz);\nDUK_INTERNAL_DECL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags);\nDUK_INTERNAL_DECL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv);\n#if 0  /* not used yet */\nDUK_INTERNAL_DECL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h);\n#endif\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL_DECL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx);\n#endif\n\nDUK_INTERNAL_DECL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len);\nDUK_INTERNAL_DECL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len);\n\nDUK_INTERNAL_DECL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv);\n\n/* The duk_xxx_prop_stridx_short() variants expect their arguments to be short\n * enough to be packed into a single 32-bit integer argument.  Argument limits\n * vary per call; typically 16 bits are assigned to the signed value stack index\n * and the stridx.  In practice these work well for footprint with constant\n * arguments and such call sites are also easiest to verify to be correct.\n */\n\nDUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx);     /* [] -> [val] */\nDUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);\n#define duk_get_prop_stridx_short(thr,obj_idx,stridx) \\\n\t(DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \\\n\t DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \\\n\t duk_get_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))\nDUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop);  /* [] -> [] */\n\nDUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx);     /* [val] -> [] */\nDUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);\n#define duk_put_prop_stridx_short(thr,obj_idx,stridx) \\\n\t(DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x8000L && (duk_int_t) (obj_idx) <= 0x7fffL), \\\n\t DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \\\n\t duk_put_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))\n\nDUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx);     /* [] -> [] */\n#if 0  /* Too few call sites to be useful. */\nDUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);\n#define duk_del_prop_stridx_short(thr,obj_idx,stridx) \\\n\t(DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \\\n\t DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \\\n\t duk_del_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))\n#endif\n#define duk_del_prop_stridx_short(thr,obj_idx,stridx) \\\n\tduk_del_prop_stridx((thr), (obj_idx), (stridx))\n\nDUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx);     /* [] -> [] */\n#if 0  /* Too few call sites to be useful. */\nDUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);\n#define duk_has_prop_stridx_short(thr,obj_idx,stridx) \\\n\t(DUK_ASSERT_EXPR((obj_idx) >= -0x8000L && (obj_idx) <= 0x7fffL), \\\n\t DUK_ASSERT_EXPR((stridx) >= 0 && (stridx) <= 0xffffL), \\\n\t duk_has_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 16) + ((duk_uint_t) (stridx))))\n#endif\n#define duk_has_prop_stridx_short(thr,obj_idx,stridx) \\\n\tduk_has_prop_stridx((thr), (obj_idx), (stridx))\n\nDUK_INTERNAL_DECL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags);  /* [key val] -> [] */\n\nDUK_INTERNAL_DECL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags);  /* [val] -> [] */\n\n/* XXX: Because stridx and desc_flags have a limited range, this call could\n * always pack stridx and desc_flags into a single argument.\n */\nDUK_INTERNAL_DECL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags);  /* [val] -> [] */\nDUK_INTERNAL_DECL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args);\n#define duk_xdef_prop_stridx_short(thr,obj_idx,stridx,desc_flags) \\\n\t(DUK_ASSERT_EXPR((duk_int_t) (obj_idx) >= -0x80L && (duk_int_t) (obj_idx) <= 0x7fL), \\\n\t DUK_ASSERT_EXPR((duk_int_t) (stridx) >= 0 && (duk_int_t) (stridx) <= 0xffffL), \\\n\t DUK_ASSERT_EXPR((duk_int_t) (desc_flags) >= 0 && (duk_int_t) (desc_flags) <= 0xffL), \\\n\t duk_xdef_prop_stridx_short_raw((thr), (((duk_uint_t) (obj_idx)) << 24) + (((duk_uint_t) (stridx)) << 8) + (duk_uint_t) (desc_flags)))\n\n#define duk_xdef_prop_wec(thr,obj_idx) \\\n\tduk_xdef_prop((thr), (obj_idx), DUK_PROPDESC_FLAGS_WEC)\n#define duk_xdef_prop_index_wec(thr,obj_idx,arr_idx) \\\n\tduk_xdef_prop_index((thr), (obj_idx), (arr_idx), DUK_PROPDESC_FLAGS_WEC)\n#define duk_xdef_prop_stridx_wec(thr,obj_idx,stridx) \\\n\tduk_xdef_prop_stridx((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC)\n#define duk_xdef_prop_stridx_short_wec(thr,obj_idx,stridx) \\\n\tduk_xdef_prop_stridx_short((thr), (obj_idx), (stridx), DUK_PROPDESC_FLAGS_WEC)\n\n#if 0  /*unused*/\nDUK_INTERNAL_DECL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags);  /* [] -> [] */\n#endif\n\nDUK_INTERNAL_DECL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx);  /* [] -> [] */\n\nDUK_INTERNAL_DECL void duk_pack(duk_hthread *thr, duk_idx_t count);\nDUK_INTERNAL_DECL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx);\n#if 0\nDUK_INTERNAL_DECL void duk_unpack(duk_hthread *thr);\n#endif\n\nDUK_INTERNAL_DECL void duk_require_constructor_call(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h);\n\nDUK_INTERNAL_DECL void duk_resolve_nonbound_function(duk_hthread *thr);\n\nDUK_INTERNAL_DECL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top);\nDUK_INTERNAL_DECL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr);\n\nDUK_INTERNAL_DECL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count);\nDUK_INTERNAL_DECL void duk_pop_unsafe(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_pop_2_unsafe(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_pop_3_unsafe(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count);\nDUK_INTERNAL_DECL void duk_pop_nodecref_unsafe(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_pop_2_nodecref_unsafe(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_pop_3_nodecref_unsafe(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_pop_undefined(duk_hthread *thr);\n\nDUK_INTERNAL_DECL void duk_compact_m1(duk_hthread *thr);\n\nDUK_INTERNAL_DECL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze);\n\nDUK_INTERNAL_DECL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx);\nDUK_INTERNAL_DECL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count);\n\nDUK_INTERNAL_DECL void duk_concat_2(duk_hthread *thr);\n\nDUK_INTERNAL_DECL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags);\n\n/* Raw internal valstack access macros: access is unsafe so call site\n * must have a guarantee that the index is valid.  When that is the case,\n * using these macro results in faster and smaller code than duk_get_tval().\n * Both 'ctx' and 'idx' are evaluted multiple times, but only for asserts.\n */\n#define DUK_ASSERT_VALID_NEGIDX(thr,idx) \\\n\t(DUK_ASSERT_EXPR((duk_int_t) (idx) < 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx))))\n#define DUK_ASSERT_VALID_POSIDX(thr,idx) \\\n\t(DUK_ASSERT_EXPR((duk_int_t) (idx) >= 0), DUK_ASSERT_EXPR(duk_is_valid_index((thr), (idx))))\n#define DUK_GET_TVAL_NEGIDX(thr,idx) \\\n\t(DUK_ASSERT_VALID_NEGIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_top + (idx))\n#define DUK_GET_TVAL_POSIDX(thr,idx) \\\n\t(DUK_ASSERT_VALID_POSIDX((thr),(idx)), ((duk_hthread *) (thr))->valstack_bottom + (idx))\n#define DUK_GET_HOBJECT_NEGIDX(thr,idx) \\\n\t(DUK_ASSERT_VALID_NEGIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_top + (idx)))\n#define DUK_GET_HOBJECT_POSIDX(thr,idx) \\\n\t(DUK_ASSERT_VALID_POSIDX((thr),(idx)), DUK_TVAL_GET_OBJECT(((duk_hthread *) (thr))->valstack_bottom + (idx)))\n\n#define DUK_GET_THIS_TVAL_PTR(thr) \\\n\t(DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \\\n\t (thr)->valstack_bottom - 1)\n\nDUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr);\n\n#endif  /* DUK_API_INTERNAL_H_INCLUDED */\n/* #include duk_hstring.h */\n#line 1 \"duk_hstring.h\"\n/*\n *  Heap string representation.\n *\n *  Strings are byte sequences ordinarily stored in extended UTF-8 format,\n *  allowing values larger than the official UTF-8 range (used internally)\n *  and also allowing UTF-8 encoding of surrogate pairs (CESU-8 format).\n *  Strings may also be invalid UTF-8 altogether which is the case e.g. with\n *  strings used as internal property names and raw buffers converted to\n *  strings.  In such cases the 'clen' field contains an inaccurate value.\n *\n *  Ecmascript requires support for 32-bit long strings.  However, since each\n *  16-bit codepoint can take 3 bytes in CESU-8, this representation can only\n *  support about 1.4G codepoint long strings in extreme cases.  This is not\n *  really a practical issue.\n */\n\n#if !defined(DUK_HSTRING_H_INCLUDED)\n#define DUK_HSTRING_H_INCLUDED\n\n/* Impose a maximum string length for now.  Restricted artificially to\n * ensure adding a heap header length won't overflow size_t.  The limit\n * should be synchronized with DUK_HBUFFER_MAX_BYTELEN.\n *\n * E5.1 makes provisions to support strings longer than 4G characters.\n * This limit should be eliminated on 64-bit platforms (and increased\n * closer to maximum support on 32-bit platforms).\n */\n\n#if defined(DUK_USE_STRLEN16)\n#define DUK_HSTRING_MAX_BYTELEN                     (0x0000ffffUL)\n#else\n#define DUK_HSTRING_MAX_BYTELEN                     (0x7fffffffUL)\n#endif\n\n/* XXX: could add flags for \"is valid CESU-8\" (Ecmascript compatible strings),\n * \"is valid UTF-8\", \"is valid extended UTF-8\" (internal strings are not,\n * regexp bytecode is), and \"contains non-BMP characters\".  These are not\n * needed right now.\n */\n\n#define DUK_HSTRING_FLAG_ASCII                      DUK_HEAPHDR_USER_FLAG(0)  /* string is ASCII, clen == blen */\n#define DUK_HSTRING_FLAG_ARRIDX                     DUK_HEAPHDR_USER_FLAG(1)  /* string is a valid array index */\n#define DUK_HSTRING_FLAG_SYMBOL                     DUK_HEAPHDR_USER_FLAG(2)  /* string is a symbol (invalid utf-8) */\n#define DUK_HSTRING_FLAG_HIDDEN                     DUK_HEAPHDR_USER_FLAG(3)  /* string is a hidden symbol (implies symbol, Duktape 1.x internal string) */\n#define DUK_HSTRING_FLAG_RESERVED_WORD              DUK_HEAPHDR_USER_FLAG(4)  /* string is a reserved word (non-strict) */\n#define DUK_HSTRING_FLAG_STRICT_RESERVED_WORD       DUK_HEAPHDR_USER_FLAG(5)  /* string is a reserved word (strict) */\n#define DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS          DUK_HEAPHDR_USER_FLAG(6)  /* string is 'eval' or 'arguments' */\n#define DUK_HSTRING_FLAG_EXTDATA                    DUK_HEAPHDR_USER_FLAG(7)  /* string data is external (duk_hstring_external) */\n\n#define DUK_HSTRING_HAS_ASCII(x)                    DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)\n#define DUK_HSTRING_HAS_ARRIDX(x)                   DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)\n#define DUK_HSTRING_HAS_SYMBOL(x)                   DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL)\n#define DUK_HSTRING_HAS_HIDDEN(x)                   DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN)\n#define DUK_HSTRING_HAS_RESERVED_WORD(x)            DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)\n#define DUK_HSTRING_HAS_STRICT_RESERVED_WORD(x)     DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)\n#define DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(x)        DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)\n#define DUK_HSTRING_HAS_EXTDATA(x)                  DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)\n\n#define DUK_HSTRING_SET_ASCII(x)                    DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)\n#define DUK_HSTRING_SET_ARRIDX(x)                   DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)\n#define DUK_HSTRING_SET_SYMBOL(x)                   DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL)\n#define DUK_HSTRING_SET_HIDDEN(x)                   DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN)\n#define DUK_HSTRING_SET_RESERVED_WORD(x)            DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)\n#define DUK_HSTRING_SET_STRICT_RESERVED_WORD(x)     DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)\n#define DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(x)        DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)\n#define DUK_HSTRING_SET_EXTDATA(x)                  DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)\n\n#define DUK_HSTRING_CLEAR_ASCII(x)                  DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)\n#define DUK_HSTRING_CLEAR_ARRIDX(x)                 DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)\n#define DUK_HSTRING_CLEAR_SYMBOL(x)                 DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_SYMBOL)\n#define DUK_HSTRING_CLEAR_HIDDEN(x)                 DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_HIDDEN)\n#define DUK_HSTRING_CLEAR_RESERVED_WORD(x)          DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)\n#define DUK_HSTRING_CLEAR_STRICT_RESERVED_WORD(x)   DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)\n#define DUK_HSTRING_CLEAR_EVAL_OR_ARGUMENTS(x)      DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)\n#define DUK_HSTRING_CLEAR_EXTDATA(x)                DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)\n\n#if 0  /* Slightly smaller code without explicit flag, but explicit flag\n        * is very useful when 'clen' is dropped.\n        */\n#define DUK_HSTRING_IS_ASCII(x)                     (DUK_HSTRING_GET_BYTELEN((x)) == DUK_HSTRING_GET_CHARLEN((x)))\n#endif\n#define DUK_HSTRING_IS_ASCII(x)                     DUK_HSTRING_HAS_ASCII((x))  /* lazily set! */\n#define DUK_HSTRING_IS_EMPTY(x)                     (DUK_HSTRING_GET_BYTELEN((x)) == 0)\n\n#if defined(DUK_USE_STRHASH16)\n#define DUK_HSTRING_GET_HASH(x)                     ((x)->hdr.h_flags >> 16)\n#define DUK_HSTRING_SET_HASH(x,v) do { \\\n\t\t(x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | ((v) << 16); \\\n\t} while (0)\n#else\n#define DUK_HSTRING_GET_HASH(x)                     ((x)->hash)\n#define DUK_HSTRING_SET_HASH(x,v) do { \\\n\t\t(x)->hash = (v); \\\n\t} while (0)\n#endif\n\n#if defined(DUK_USE_STRLEN16)\n#define DUK_HSTRING_GET_BYTELEN(x)                  ((x)->hdr.h_strextra16)\n#define DUK_HSTRING_SET_BYTELEN(x,v) do { \\\n\t\t(x)->hdr.h_strextra16 = (v); \\\n\t} while (0)\n#if defined(DUK_USE_HSTRING_CLEN)\n#define DUK_HSTRING_GET_CHARLEN(x)                  duk_hstring_get_charlen((x))\n#define DUK_HSTRING_SET_CHARLEN(x,v) do { \\\n\t\t(x)->clen16 = (v); \\\n\t} while (0)\n#else\n#define DUK_HSTRING_GET_CHARLEN(x)                  duk_hstring_get_charlen((x))\n#define DUK_HSTRING_SET_CHARLEN(x,v) do { \\\n\t\tDUK_ASSERT(0);  /* should never be called */ \\\n\t} while (0)\n#endif\n#else\n#define DUK_HSTRING_GET_BYTELEN(x)                  ((x)->blen)\n#define DUK_HSTRING_SET_BYTELEN(x,v) do { \\\n\t\t(x)->blen = (v); \\\n\t} while (0)\n#define DUK_HSTRING_GET_CHARLEN(x)                  duk_hstring_get_charlen((x))\n#define DUK_HSTRING_SET_CHARLEN(x,v) do { \\\n\t\t(x)->clen = (v); \\\n\t} while (0)\n#endif\n\n#if defined(DUK_USE_HSTRING_EXTDATA)\n#define DUK_HSTRING_GET_EXTDATA(x) \\\n\t((x)->extdata)\n#define DUK_HSTRING_GET_DATA(x) \\\n\t(DUK_HSTRING_HAS_EXTDATA((x)) ? \\\n\t\tDUK_HSTRING_GET_EXTDATA((const duk_hstring_external *) (x)) : ((const duk_uint8_t *) ((x) + 1)))\n#else\n#define DUK_HSTRING_GET_DATA(x) \\\n\t((const duk_uint8_t *) ((x) + 1))\n#endif\n\n#define DUK_HSTRING_GET_DATA_END(x) \\\n\t(DUK_HSTRING_GET_DATA((x)) + (x)->blen)\n\n/* Marker value; in E5 2^32-1 is not a valid array index (2^32-2 is highest\n * valid).\n */\n#define DUK_HSTRING_NO_ARRAY_INDEX  (0xffffffffUL)\n\n#if defined(DUK_USE_HSTRING_ARRIDX)\n#define DUK_HSTRING_GET_ARRIDX_FAST(h)  ((h)->arridx)\n#define DUK_HSTRING_GET_ARRIDX_SLOW(h)  ((h)->arridx)\n#else\n/* Get array index related to string (or return DUK_HSTRING_NO_ARRAY_INDEX);\n * avoids helper call if string has no array index value.\n */\n#define DUK_HSTRING_GET_ARRIDX_FAST(h)  \\\n\t(DUK_HSTRING_HAS_ARRIDX((h)) ? duk_js_to_arrayindex_hstring_fast_known((h)) : DUK_HSTRING_NO_ARRAY_INDEX)\n\n/* Slower but more compact variant. */\n#define DUK_HSTRING_GET_ARRIDX_SLOW(h)  \\\n\t(duk_js_to_arrayindex_hstring_fast((h)))\n#endif\n\n/* XXX: these actually fit into duk_hstring */\n#define DUK_SYMBOL_TYPE_HIDDEN 0\n#define DUK_SYMBOL_TYPE_GLOBAL 1\n#define DUK_SYMBOL_TYPE_LOCAL 2\n#define DUK_SYMBOL_TYPE_WELLKNOWN 3\n\n/*\n *  Misc\n */\n\nstruct duk_hstring {\n\t/* Smaller heaphdr than for other objects, because strings are held\n\t * in string intern table which requires no link pointers.  Much of\n\t * the 32-bit flags field is unused by flags, so we can stuff a 16-bit\n\t * field in there.\n\t */\n\tduk_heaphdr_string hdr;\n\n\t/* String hash. */\n#if defined(DUK_USE_STRHASH16)\n\t/* If 16-bit hash is in use, stuff it into duk_heaphdr_string flags. */\n#else\n\tduk_uint32_t hash;\n#endif\n\n\t/* Precomputed array index (or DUK_HSTRING_NO_ARRAY_INDEX). */\n#if defined(DUK_USE_HSTRING_ARRIDX)\n\tduk_uarridx_t arridx;\n#endif\n\n\t/* Length in bytes (not counting NUL term). */\n#if defined(DUK_USE_STRLEN16)\n\t/* placed in duk_heaphdr_string */\n#else\n\tduk_uint32_t blen;\n#endif\n\n\t/* Length in codepoints (must be E5 compatible). */\n#if defined(DUK_USE_STRLEN16)\n#if defined(DUK_USE_HSTRING_CLEN)\n\tduk_uint16_t clen16;\n#else\n\t/* computed live */\n#endif\n#else\n\tduk_uint32_t clen;\n#endif\n\n\t/*\n\t *  String data of 'blen+1' bytes follows (+1 for NUL termination\n\t *  convenience for C API).  No alignment needs to be guaranteed\n\t *  for strings, but fields above should guarantee alignment-by-4\n\t *  (but not alignment-by-8).\n\t */\n};\n\n/* The external string struct is defined even when the feature is inactive. */\nstruct duk_hstring_external {\n\tduk_hstring str;\n\n\t/*\n\t *  For an external string, the NUL-terminated string data is stored\n\t *  externally.  The user must guarantee that data behind this pointer\n\t *  doesn't change while it's used.\n\t */\n\n\tconst duk_uint8_t *extdata;\n};\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware);\nDUK_INTERNAL_DECL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr);\nDUK_INTERNAL_DECL duk_size_t duk_hstring_get_charlen(duk_hstring *h);\n#if !defined(DUK_USE_HSTRING_LAZY_CLEN)\nDUK_INTERNAL_DECL void duk_hstring_init_charlen(duk_hstring *h);\n#endif\n\n#endif  /* DUK_HSTRING_H_INCLUDED */\n/* #include duk_hobject.h */\n#line 1 \"duk_hobject.h\"\n/*\n *  Heap object representation.\n *\n *  Heap objects are used for Ecmascript objects, arrays, and functions,\n *  but also for internal control like declarative and object environment\n *  records.  Compiled functions, native functions, and threads are also\n *  objects but with an extended C struct.\n *\n *  Objects provide the required Ecmascript semantics and exotic behaviors\n *  especially for property access.\n *\n *  Properties are stored in three conceptual parts:\n *\n *    1. A linear 'entry part' contains ordered key-value-attributes triples\n *       and is the main method of string properties.\n *\n *    2. An optional linear 'array part' is used for array objects to store a\n *       (dense) range of [0,N[ array indexed entries with default attributes\n *       (writable, enumerable, configurable).  If the array part would become\n *       sparse or non-default attributes are required, the array part is\n *       abandoned and moved to the 'entry part'.\n *\n *    3. An optional 'hash part' is used to optimize lookups of the entry\n *       part; it is used only for objects with sufficiently many properties\n *       and can be abandoned without loss of information.\n *\n *  These three conceptual parts are stored in a single memory allocated area.\n *  This minimizes memory allocation overhead but also means that all three\n *  parts are resized together, and makes property access a bit complicated.\n */\n\n#if !defined(DUK_HOBJECT_H_INCLUDED)\n#define DUK_HOBJECT_H_INCLUDED\n\n/* Object flags.  Make sure this stays in sync with debugger object\n * inspection code.\n */\n\n/* XXX: some flags are object subtype specific (e.g. common to all function\n * subtypes, duk_harray, etc) and could be reused for different subtypes.\n */\n#define DUK_HOBJECT_FLAG_EXTENSIBLE            DUK_HEAPHDR_USER_FLAG(0)   /* object is extensible */\n#define DUK_HOBJECT_FLAG_CONSTRUCTABLE         DUK_HEAPHDR_USER_FLAG(1)   /* object is constructable */\n#define DUK_HOBJECT_FLAG_CALLABLE              DUK_HEAPHDR_USER_FLAG(2)   /* object is callable */\n#define DUK_HOBJECT_FLAG_BOUNDFUNC             DUK_HEAPHDR_USER_FLAG(3)   /* object established using Function.prototype.bind() */\n#define DUK_HOBJECT_FLAG_COMPFUNC              DUK_HEAPHDR_USER_FLAG(4)   /* object is a compiled function (duk_hcompfunc) */\n#define DUK_HOBJECT_FLAG_NATFUNC               DUK_HEAPHDR_USER_FLAG(5)   /* object is a native function (duk_hnatfunc) */\n#define DUK_HOBJECT_FLAG_BUFOBJ                DUK_HEAPHDR_USER_FLAG(6)   /* object is a buffer object (duk_hbufobj) (always exotic) */\n#define DUK_HOBJECT_FLAG_FASTREFS              DUK_HEAPHDR_USER_FLAG(7)   /* object has no fields needing DECREF/marking beyond base duk_hobject header */\n#define DUK_HOBJECT_FLAG_ARRAY_PART            DUK_HEAPHDR_USER_FLAG(8)   /* object has an array part (a_size may still be 0) */\n#define DUK_HOBJECT_FLAG_STRICT                DUK_HEAPHDR_USER_FLAG(9)   /* function: function object is strict */\n#define DUK_HOBJECT_FLAG_NOTAIL                DUK_HEAPHDR_USER_FLAG(10)  /* function: function must not be tail called */\n#define DUK_HOBJECT_FLAG_NEWENV                DUK_HEAPHDR_USER_FLAG(11)  /* function: create new environment when called (see duk_hcompfunc) */\n#define DUK_HOBJECT_FLAG_NAMEBINDING           DUK_HEAPHDR_USER_FLAG(12)  /* function: create binding for func name (function templates only, used for named function expressions) */\n#define DUK_HOBJECT_FLAG_CREATEARGS            DUK_HEAPHDR_USER_FLAG(13)  /* function: create an arguments object on function call */\n#define DUK_HOBJECT_FLAG_HAVE_FINALIZER        DUK_HEAPHDR_USER_FLAG(14)  /* object has a callable (own) finalizer property */\n#define DUK_HOBJECT_FLAG_EXOTIC_ARRAY          DUK_HEAPHDR_USER_FLAG(15)  /* 'Array' object, array length and index exotic behavior */\n#define DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ      DUK_HEAPHDR_USER_FLAG(16)  /* 'String' object, array index exotic behavior */\n#define DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS      DUK_HEAPHDR_USER_FLAG(17)  /* 'Arguments' object and has arguments exotic behavior (non-strict callee) */\n#define DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ       DUK_HEAPHDR_USER_FLAG(18)  /* 'Proxy' object */\n#define DUK_HOBJECT_FLAG_SPECIAL_CALL          DUK_HEAPHDR_USER_FLAG(19)  /* special casing in call behavior, for .call(), .apply(), etc. */\n\n#define DUK_HOBJECT_FLAG_CLASS_BASE            DUK_HEAPHDR_USER_FLAG_NUMBER(20)\n#define DUK_HOBJECT_FLAG_CLASS_BITS            5\n\n#define DUK_HOBJECT_GET_CLASS_NUMBER(h)        \\\n\tDUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS)\n#define DUK_HOBJECT_SET_CLASS_NUMBER(h,v)      \\\n\tDUK_HEAPHDR_SET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS, (v))\n\n#define DUK_HOBJECT_GET_CLASS_MASK(h)          \\\n\t(1UL << DUK_HEAPHDR_GET_FLAG_RANGE(&(h)->hdr, DUK_HOBJECT_FLAG_CLASS_BASE, DUK_HOBJECT_FLAG_CLASS_BITS))\n\n/* Macro for creating flag initializer from a class number.\n * Unsigned type cast is needed to avoid warnings about coercing\n * a signed integer to an unsigned one; the largest class values\n * have the highest bit (bit 31) set which causes this.\n */\n#define DUK_HOBJECT_CLASS_AS_FLAGS(v)          (((duk_uint_t) (v)) << DUK_HOBJECT_FLAG_CLASS_BASE)\n\n/* E5 Section 8.6.2 + custom classes */\n#define DUK_HOBJECT_CLASS_NONE                 0\n#define DUK_HOBJECT_CLASS_OBJECT               1\n#define DUK_HOBJECT_CLASS_ARRAY                2\n#define DUK_HOBJECT_CLASS_FUNCTION             3\n#define DUK_HOBJECT_CLASS_ARGUMENTS            4\n#define DUK_HOBJECT_CLASS_BOOLEAN              5\n#define DUK_HOBJECT_CLASS_DATE                 6\n#define DUK_HOBJECT_CLASS_ERROR                7\n#define DUK_HOBJECT_CLASS_JSON                 8\n#define DUK_HOBJECT_CLASS_MATH                 9\n#define DUK_HOBJECT_CLASS_NUMBER               10\n#define DUK_HOBJECT_CLASS_REGEXP               11\n#define DUK_HOBJECT_CLASS_STRING               12\n#define DUK_HOBJECT_CLASS_GLOBAL               13\n#define DUK_HOBJECT_CLASS_SYMBOL               14\n#define DUK_HOBJECT_CLASS_OBJENV               15  /* custom */\n#define DUK_HOBJECT_CLASS_DECENV               16  /* custom */\n#define DUK_HOBJECT_CLASS_POINTER              17  /* custom */\n#define DUK_HOBJECT_CLASS_THREAD               18  /* custom; implies DUK_HOBJECT_IS_THREAD */\n#define DUK_HOBJECT_CLASS_BUFOBJ_MIN           19\n#define DUK_HOBJECT_CLASS_ARRAYBUFFER          19  /* implies DUK_HOBJECT_IS_BUFOBJ */\n#define DUK_HOBJECT_CLASS_DATAVIEW             20\n#define DUK_HOBJECT_CLASS_INT8ARRAY            21\n#define DUK_HOBJECT_CLASS_UINT8ARRAY           22\n#define DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY    23\n#define DUK_HOBJECT_CLASS_INT16ARRAY           24\n#define DUK_HOBJECT_CLASS_UINT16ARRAY          25\n#define DUK_HOBJECT_CLASS_INT32ARRAY           26\n#define DUK_HOBJECT_CLASS_UINT32ARRAY          27\n#define DUK_HOBJECT_CLASS_FLOAT32ARRAY         28\n#define DUK_HOBJECT_CLASS_FLOAT64ARRAY         29\n#define DUK_HOBJECT_CLASS_BUFOBJ_MAX           29\n#define DUK_HOBJECT_CLASS_MAX                  29\n\n/* Class masks. */\n#define DUK_HOBJECT_CMASK_ALL                  ((1UL << (DUK_HOBJECT_CLASS_MAX + 1)) - 1UL)\n#define DUK_HOBJECT_CMASK_NONE                 (1UL << DUK_HOBJECT_CLASS_NONE)\n#define DUK_HOBJECT_CMASK_ARGUMENTS            (1UL << DUK_HOBJECT_CLASS_ARGUMENTS)\n#define DUK_HOBJECT_CMASK_ARRAY                (1UL << DUK_HOBJECT_CLASS_ARRAY)\n#define DUK_HOBJECT_CMASK_BOOLEAN              (1UL << DUK_HOBJECT_CLASS_BOOLEAN)\n#define DUK_HOBJECT_CMASK_DATE                 (1UL << DUK_HOBJECT_CLASS_DATE)\n#define DUK_HOBJECT_CMASK_ERROR                (1UL << DUK_HOBJECT_CLASS_ERROR)\n#define DUK_HOBJECT_CMASK_FUNCTION             (1UL << DUK_HOBJECT_CLASS_FUNCTION)\n#define DUK_HOBJECT_CMASK_JSON                 (1UL << DUK_HOBJECT_CLASS_JSON)\n#define DUK_HOBJECT_CMASK_MATH                 (1UL << DUK_HOBJECT_CLASS_MATH)\n#define DUK_HOBJECT_CMASK_NUMBER               (1UL << DUK_HOBJECT_CLASS_NUMBER)\n#define DUK_HOBJECT_CMASK_OBJECT               (1UL << DUK_HOBJECT_CLASS_OBJECT)\n#define DUK_HOBJECT_CMASK_REGEXP               (1UL << DUK_HOBJECT_CLASS_REGEXP)\n#define DUK_HOBJECT_CMASK_STRING               (1UL << DUK_HOBJECT_CLASS_STRING)\n#define DUK_HOBJECT_CMASK_GLOBAL               (1UL << DUK_HOBJECT_CLASS_GLOBAL)\n#define DUK_HOBJECT_CMASK_SYMBOL               (1UL << DUK_HOBJECT_CLASS_SYMBOL)\n#define DUK_HOBJECT_CMASK_OBJENV               (1UL << DUK_HOBJECT_CLASS_OBJENV)\n#define DUK_HOBJECT_CMASK_DECENV               (1UL << DUK_HOBJECT_CLASS_DECENV)\n#define DUK_HOBJECT_CMASK_POINTER              (1UL << DUK_HOBJECT_CLASS_POINTER)\n#define DUK_HOBJECT_CMASK_ARRAYBUFFER          (1UL << DUK_HOBJECT_CLASS_ARRAYBUFFER)\n#define DUK_HOBJECT_CMASK_DATAVIEW             (1UL << DUK_HOBJECT_CLASS_DATAVIEW)\n#define DUK_HOBJECT_CMASK_INT8ARRAY            (1UL << DUK_HOBJECT_CLASS_INT8ARRAY)\n#define DUK_HOBJECT_CMASK_UINT8ARRAY           (1UL << DUK_HOBJECT_CLASS_UINT8ARRAY)\n#define DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY    (1UL << DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY)\n#define DUK_HOBJECT_CMASK_INT16ARRAY           (1UL << DUK_HOBJECT_CLASS_INT16ARRAY)\n#define DUK_HOBJECT_CMASK_UINT16ARRAY          (1UL << DUK_HOBJECT_CLASS_UINT16ARRAY)\n#define DUK_HOBJECT_CMASK_INT32ARRAY           (1UL << DUK_HOBJECT_CLASS_INT32ARRAY)\n#define DUK_HOBJECT_CMASK_UINT32ARRAY          (1UL << DUK_HOBJECT_CLASS_UINT32ARRAY)\n#define DUK_HOBJECT_CMASK_FLOAT32ARRAY         (1UL << DUK_HOBJECT_CLASS_FLOAT32ARRAY)\n#define DUK_HOBJECT_CMASK_FLOAT64ARRAY         (1UL << DUK_HOBJECT_CLASS_FLOAT64ARRAY)\n\n#define DUK_HOBJECT_CMASK_ALL_BUFOBJS \\\n\t(DUK_HOBJECT_CMASK_ARRAYBUFFER | \\\n\t DUK_HOBJECT_CMASK_DATAVIEW | \\\n\t DUK_HOBJECT_CMASK_INT8ARRAY | \\\n\t DUK_HOBJECT_CMASK_UINT8ARRAY | \\\n\t DUK_HOBJECT_CMASK_UINT8CLAMPEDARRAY | \\\n\t DUK_HOBJECT_CMASK_INT16ARRAY | \\\n\t DUK_HOBJECT_CMASK_UINT16ARRAY | \\\n\t DUK_HOBJECT_CMASK_INT32ARRAY | \\\n\t DUK_HOBJECT_CMASK_UINT32ARRAY | \\\n\t DUK_HOBJECT_CMASK_FLOAT32ARRAY | \\\n\t DUK_HOBJECT_CMASK_FLOAT64ARRAY)\n\n#define DUK_HOBJECT_IS_OBJENV(h)               (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_OBJENV)\n#define DUK_HOBJECT_IS_DECENV(h)               (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DECENV)\n#define DUK_HOBJECT_IS_ENV(h)                  (DUK_HOBJECT_IS_OBJENV((h)) || DUK_HOBJECT_IS_DECENV((h)))\n#define DUK_HOBJECT_IS_ARRAY(h)                DUK_HOBJECT_HAS_EXOTIC_ARRAY((h))  /* Rely on class Array <=> exotic Array */\n#define DUK_HOBJECT_IS_BOUNDFUNC(h)            DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)\n#define DUK_HOBJECT_IS_COMPFUNC(h)             DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)\n#define DUK_HOBJECT_IS_NATFUNC(h)              DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n#define DUK_HOBJECT_IS_BUFOBJ(h)               DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)\n#else\n#define DUK_HOBJECT_IS_BUFOBJ(h)               0\n#endif\n#define DUK_HOBJECT_IS_THREAD(h)               (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_THREAD)\n#if defined(DUK_USE_ES6_PROXY)\n#define DUK_HOBJECT_IS_PROXY(h)                DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((h))\n#else\n#define DUK_HOBJECT_IS_PROXY(h)                0\n#endif\n\n#define DUK_HOBJECT_IS_NONBOUND_FUNCTION(h)    DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \\\n                                                        DUK_HOBJECT_FLAG_COMPFUNC | \\\n                                                        DUK_HOBJECT_FLAG_NATFUNC)\n\n#define DUK_HOBJECT_IS_FUNCTION(h)             DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, \\\n                                                        DUK_HOBJECT_FLAG_BOUNDFUNC | \\\n                                                        DUK_HOBJECT_FLAG_COMPFUNC | \\\n                                                        DUK_HOBJECT_FLAG_NATFUNC)\n\n#define DUK_HOBJECT_IS_CALLABLE(h)             DUK_HOBJECT_HAS_CALLABLE((h))\n\n/* Object has any exotic behavior(s). */\n#define DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS      (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \\\n                                                DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS | \\\n                                                DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \\\n                                                DUK_HOBJECT_FLAG_BUFOBJ | \\\n                                                DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)\n#define DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(h)     DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_EXOTIC_BEHAVIOR_FLAGS)\n\n/* Object has any virtual properties (not counting Proxy behavior). */\n#define DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS     (DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \\\n                                                DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | \\\n                                                DUK_HOBJECT_FLAG_BUFOBJ)\n#define DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(h)  DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_VIRTUAL_PROPERTY_FLAGS)\n\n#define DUK_HOBJECT_HAS_EXTENSIBLE(h)          DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)\n#define DUK_HOBJECT_HAS_CONSTRUCTABLE(h)       DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)\n#define DUK_HOBJECT_HAS_CALLABLE(h)            DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE)\n#define DUK_HOBJECT_HAS_BOUNDFUNC(h)           DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)\n#define DUK_HOBJECT_HAS_COMPFUNC(h)            DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)\n#define DUK_HOBJECT_HAS_NATFUNC(h)             DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n#define DUK_HOBJECT_HAS_BUFOBJ(h)              DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)\n#else\n#define DUK_HOBJECT_HAS_BUFOBJ(h)              0\n#endif\n#define DUK_HOBJECT_HAS_FASTREFS(h)            DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS)\n#define DUK_HOBJECT_HAS_ARRAY_PART(h)          DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)\n#define DUK_HOBJECT_HAS_STRICT(h)              DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)\n#define DUK_HOBJECT_HAS_NOTAIL(h)              DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)\n#define DUK_HOBJECT_HAS_NEWENV(h)              DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)\n#define DUK_HOBJECT_HAS_NAMEBINDING(h)         DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)\n#define DUK_HOBJECT_HAS_CREATEARGS(h)          DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)\n#define DUK_HOBJECT_HAS_HAVE_FINALIZER(h)      DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER)\n#define DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)        DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)\n#define DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h)    DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)\n#define DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)    DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)\n#if defined(DUK_USE_ES6_PROXY)\n#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h)     DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)\n#else\n#define DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h)     0\n#endif\n#define DUK_HOBJECT_HAS_SPECIAL_CALL(h)        DUK_HEAPHDR_CHECK_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL)\n\n#define DUK_HOBJECT_SET_EXTENSIBLE(h)          DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)\n#define DUK_HOBJECT_SET_CONSTRUCTABLE(h)       DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)\n#define DUK_HOBJECT_SET_CALLABLE(h)            DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE)\n#define DUK_HOBJECT_SET_BOUNDFUNC(h)           DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)\n#define DUK_HOBJECT_SET_COMPFUNC(h)            DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)\n#define DUK_HOBJECT_SET_NATFUNC(h)             DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n#define DUK_HOBJECT_SET_BUFOBJ(h)              DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)\n#endif\n#define DUK_HOBJECT_SET_FASTREFS(h)            DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS)\n#define DUK_HOBJECT_SET_ARRAY_PART(h)          DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)\n#define DUK_HOBJECT_SET_STRICT(h)              DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)\n#define DUK_HOBJECT_SET_NOTAIL(h)              DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)\n#define DUK_HOBJECT_SET_NEWENV(h)              DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)\n#define DUK_HOBJECT_SET_NAMEBINDING(h)         DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)\n#define DUK_HOBJECT_SET_CREATEARGS(h)          DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)\n#define DUK_HOBJECT_SET_HAVE_FINALIZER(h)      DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER)\n#define DUK_HOBJECT_SET_EXOTIC_ARRAY(h)        DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)\n#define DUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h)    DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)\n#define DUK_HOBJECT_SET_EXOTIC_ARGUMENTS(h)    DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)\n#if defined(DUK_USE_ES6_PROXY)\n#define DUK_HOBJECT_SET_EXOTIC_PROXYOBJ(h)     DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)\n#endif\n#define DUK_HOBJECT_SET_SPECIAL_CALL(h)        DUK_HEAPHDR_SET_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL)\n\n#define DUK_HOBJECT_CLEAR_EXTENSIBLE(h)        DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXTENSIBLE)\n#define DUK_HOBJECT_CLEAR_CONSTRUCTABLE(h)     DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CONSTRUCTABLE)\n#define DUK_HOBJECT_CLEAR_CALLABLE(h)          DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CALLABLE)\n#define DUK_HOBJECT_CLEAR_BOUNDFUNC(h)         DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BOUNDFUNC)\n#define DUK_HOBJECT_CLEAR_COMPFUNC(h)          DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_COMPFUNC)\n#define DUK_HOBJECT_CLEAR_NATFUNC(h)           DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NATFUNC)\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n#define DUK_HOBJECT_CLEAR_BUFOBJ(h)            DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_BUFOBJ)\n#endif\n#define DUK_HOBJECT_CLEAR_FASTREFS(h)          DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_FASTREFS)\n#define DUK_HOBJECT_CLEAR_ARRAY_PART(h)        DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_ARRAY_PART)\n#define DUK_HOBJECT_CLEAR_STRICT(h)            DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_STRICT)\n#define DUK_HOBJECT_CLEAR_NOTAIL(h)            DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NOTAIL)\n#define DUK_HOBJECT_CLEAR_NEWENV(h)            DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NEWENV)\n#define DUK_HOBJECT_CLEAR_NAMEBINDING(h)       DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_NAMEBINDING)\n#define DUK_HOBJECT_CLEAR_CREATEARGS(h)        DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_CREATEARGS)\n#define DUK_HOBJECT_CLEAR_HAVE_FINALIZER(h)    DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_HAVE_FINALIZER)\n#define DUK_HOBJECT_CLEAR_EXOTIC_ARRAY(h)      DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARRAY)\n#define DUK_HOBJECT_CLEAR_EXOTIC_STRINGOBJ(h)  DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ)\n#define DUK_HOBJECT_CLEAR_EXOTIC_ARGUMENTS(h)  DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS)\n#if defined(DUK_USE_ES6_PROXY)\n#define DUK_HOBJECT_CLEAR_EXOTIC_PROXYOBJ(h)   DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ)\n#endif\n#define DUK_HOBJECT_CLEAR_SPECIAL_CALL(h)      DUK_HEAPHDR_CLEAR_FLAG_BITS(&(h)->hdr, DUK_HOBJECT_FLAG_SPECIAL_CALL)\n\n/* Object can/cannot use FASTREFS, i.e. has no strong reference fields beyond\n * duk_hobject base header.  This is used just for asserts so doesn't need to\n * be optimized.\n */\n#define DUK_HOBJECT_PROHIBITS_FASTREFS(h) \\\n\t(DUK_HOBJECT_IS_COMPFUNC((h)) || DUK_HOBJECT_IS_DECENV((h)) || DUK_HOBJECT_IS_OBJENV((h)) || \\\n\t DUK_HOBJECT_IS_BUFOBJ((h)) || DUK_HOBJECT_IS_THREAD((h)) || DUK_HOBJECT_IS_PROXY((h)) || \\\n\t DUK_HOBJECT_IS_BOUNDFUNC((h)))\n#define DUK_HOBJECT_ALLOWS_FASTREFS(h) (!DUK_HOBJECT_PROHIBITS_FASTREFS((h)))\n\n/* Flags used for property attributes in duk_propdesc and packed flags.\n * Must fit into 8 bits.\n */\n#define DUK_PROPDESC_FLAG_WRITABLE              (1U << 0)    /* E5 Section 8.6.1 */\n#define DUK_PROPDESC_FLAG_ENUMERABLE            (1U << 1)    /* E5 Section 8.6.1 */\n#define DUK_PROPDESC_FLAG_CONFIGURABLE          (1U << 2)    /* E5 Section 8.6.1 */\n#define DUK_PROPDESC_FLAG_ACCESSOR              (1U << 3)    /* accessor */\n#define DUK_PROPDESC_FLAG_VIRTUAL               (1U << 4)    /* property is virtual: used in duk_propdesc, never stored\n                                                             * (used by e.g. buffer virtual properties)\n                                                             */\n#define DUK_PROPDESC_FLAGS_MASK                 (DUK_PROPDESC_FLAG_WRITABLE | \\\n                                                 DUK_PROPDESC_FLAG_ENUMERABLE | \\\n                                                 DUK_PROPDESC_FLAG_CONFIGURABLE | \\\n                                                 DUK_PROPDESC_FLAG_ACCESSOR)\n\n/* Additional flags which are passed in the same flags argument as property\n * flags but are not stored in object properties.\n */\n#define DUK_PROPDESC_FLAG_NO_OVERWRITE          (1U << 4)    /* internal define property: skip write silently if exists */\n\n/* Convenience defines for property attributes. */\n#define DUK_PROPDESC_FLAGS_NONE                 0\n#define DUK_PROPDESC_FLAGS_W                    (DUK_PROPDESC_FLAG_WRITABLE)\n#define DUK_PROPDESC_FLAGS_E                    (DUK_PROPDESC_FLAG_ENUMERABLE)\n#define DUK_PROPDESC_FLAGS_C                    (DUK_PROPDESC_FLAG_CONFIGURABLE)\n#define DUK_PROPDESC_FLAGS_WE                   (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ENUMERABLE)\n#define DUK_PROPDESC_FLAGS_WC                   (DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE)\n#define DUK_PROPDESC_FLAGS_EC                   (DUK_PROPDESC_FLAG_ENUMERABLE | DUK_PROPDESC_FLAG_CONFIGURABLE)\n#define DUK_PROPDESC_FLAGS_WEC                  (DUK_PROPDESC_FLAG_WRITABLE | \\\n                                                 DUK_PROPDESC_FLAG_ENUMERABLE | \\\n                                                 DUK_PROPDESC_FLAG_CONFIGURABLE)\n\n/* Flags for duk_hobject_get_own_propdesc() and variants. */\n#define DUK_GETDESC_FLAG_PUSH_VALUE          (1U << 0)  /* push value to stack */\n#define DUK_GETDESC_FLAG_IGNORE_PROTOLOOP    (1U << 1)  /* don't throw for prototype loop */\n\n/*\n *  Macro for object validity check\n *\n *  Assert for currently guaranteed relations between flags, for instance.\n */\n\n#define DUK_ASSERT_HOBJECT_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE((h)) || \\\n\t\t           DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FUNCTION); \\\n\t\tDUK_ASSERT(!DUK_HOBJECT_IS_BUFOBJ((h)) || \\\n\t\t           (DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAYBUFFER || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_DATAVIEW || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT8ARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8ARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT16ARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT16ARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_INT32ARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_UINT32ARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT32ARRAY || \\\n\t\t            DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_FLOAT64ARRAY)); \\\n\t\t/* Object is an Array <=> object has exotic array behavior */ \\\n\t\tDUK_ASSERT((DUK_HOBJECT_GET_CLASS_NUMBER((h)) == DUK_HOBJECT_CLASS_ARRAY && DUK_HOBJECT_HAS_EXOTIC_ARRAY((h))) || \\\n\t\t           (DUK_HOBJECT_GET_CLASS_NUMBER((h)) != DUK_HOBJECT_CLASS_ARRAY && !DUK_HOBJECT_HAS_EXOTIC_ARRAY((h)))); \\\n\t} while (0)\n\n/*\n *  Macros to access the 'props' allocation.\n */\n\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HOBJECT_GET_PROPS(heap,h) \\\n\t((duk_uint8_t *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (h))->h_extra16))\n#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \\\n\t\t((duk_heaphdr *) (h))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \\\n\t} while (0)\n#else\n#define DUK_HOBJECT_GET_PROPS(heap,h) \\\n\t((h)->props)\n#define DUK_HOBJECT_SET_PROPS(heap,h,x) do { \\\n\t\t(h)->props = (duk_uint8_t *) (x); \\\n\t} while (0)\n#endif\n\n#if defined(DUK_USE_HOBJECT_LAYOUT_1)\n/* LAYOUT 1 */\n#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \\\n\t((duk_hstring **) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) \\\n\t))\n#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \\\n\t((duk_propvalue *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_hstring *) \\\n\t))\n#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \\\n\t((duk_uint8_t *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \\\n\t))\n#define DUK_HOBJECT_A_GET_BASE(heap,h) \\\n\t((duk_tval *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) \\\n\t))\n#define DUK_HOBJECT_H_GET_BASE(heap,h) \\\n\t((duk_uint32_t *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \\\n\t\t\tDUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \\\n\t))\n#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \\\n\t( \\\n\t\t(n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \\\n\t\t(n_arr) * sizeof(duk_tval) + \\\n\t\t(n_hash) * sizeof(duk_uint32_t) \\\n\t)\n#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash)  do { \\\n\t\t(set_e_k) = (duk_hstring **) (void *) (p_base); \\\n\t\t(set_e_pv) = (duk_propvalue *) (void *) ((set_e_k) + (n_ent)); \\\n\t\t(set_e_f) = (duk_uint8_t *) (void *) ((set_e_pv) + (n_ent)); \\\n\t\t(set_a) = (duk_tval *) (void *) ((set_e_f) + (n_ent)); \\\n\t\t(set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \\\n\t} while (0)\n#elif defined(DUK_USE_HOBJECT_LAYOUT_2)\n/* LAYOUT 2 */\n#if (DUK_USE_ALIGN_BY == 4)\n#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((4 - (e_sz)) & 0x03)\n#elif (DUK_USE_ALIGN_BY == 8)\n#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) ((8 - (e_sz)) & 0x07)\n#elif (DUK_USE_ALIGN_BY == 1)\n#define DUK_HOBJECT_E_FLAG_PADDING(e_sz) 0\n#else\n#error invalid DUK_USE_ALIGN_BY\n#endif\n#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \\\n\t((duk_hstring **) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \\\n\t))\n#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \\\n\t((duk_propvalue *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) \\\n\t))\n#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \\\n\t((duk_uint8_t *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + DUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue)) \\\n\t))\n#define DUK_HOBJECT_A_GET_BASE(heap,h) \\\n\t((duk_tval *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \\\n\t\t\tDUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) \\\n\t))\n#define DUK_HOBJECT_H_GET_BASE(heap,h) \\\n\t((duk_uint32_t *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \\\n\t\t\tDUK_HOBJECT_E_FLAG_PADDING(DUK_HOBJECT_GET_ESIZE((h))) + \\\n\t\t\tDUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \\\n\t))\n#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \\\n\t( \\\n\t\t(n_ent) * (sizeof(duk_hstring *) + sizeof(duk_propvalue) + sizeof(duk_uint8_t)) + \\\n\t\tDUK_HOBJECT_E_FLAG_PADDING((n_ent)) + \\\n\t\t(n_arr) * sizeof(duk_tval) + \\\n\t\t(n_hash) * sizeof(duk_uint32_t) \\\n\t)\n#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash)  do { \\\n\t\t(set_e_pv) = (duk_propvalue *) (void *) (p_base); \\\n\t\t(set_e_k) = (duk_hstring **) (void *) ((set_e_pv) + (n_ent)); \\\n\t\t(set_e_f) = (duk_uint8_t *) (void *) ((set_e_k) + (n_ent)); \\\n\t\t(set_a) = (duk_tval *) (void *) (((duk_uint8_t *) (set_e_f)) + \\\n\t\t                                 sizeof(duk_uint8_t) * (n_ent) + \\\n\t\t                                 DUK_HOBJECT_E_FLAG_PADDING((n_ent))); \\\n\t\t(set_h) = (duk_uint32_t *) (void *) ((set_a) + (n_arr)); \\\n\t} while (0)\n#elif defined(DUK_USE_HOBJECT_LAYOUT_3)\n/* LAYOUT 3 */\n#define DUK_HOBJECT_E_GET_KEY_BASE(heap,h) \\\n\t((duk_hstring **) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) + \\\n\t\t\tDUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \\\n\t))\n#define DUK_HOBJECT_E_GET_VALUE_BASE(heap,h) \\\n\t((duk_propvalue *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) \\\n\t))\n#define DUK_HOBJECT_E_GET_FLAGS_BASE(heap,h) \\\n\t((duk_uint8_t *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \\\n\t\t\tDUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) + \\\n\t\t\tDUK_HOBJECT_GET_HSIZE((h)) * sizeof(duk_uint32_t) \\\n\t))\n#define DUK_HOBJECT_A_GET_BASE(heap,h) \\\n\t((duk_tval *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * sizeof(duk_propvalue) \\\n\t))\n#define DUK_HOBJECT_H_GET_BASE(heap,h) \\\n\t((duk_uint32_t *) (void *) ( \\\n\t\tDUK_HOBJECT_GET_PROPS((heap), (h)) + \\\n\t\t\tDUK_HOBJECT_GET_ESIZE((h)) * (sizeof(duk_propvalue) + sizeof(duk_hstring *)) + \\\n\t\t\tDUK_HOBJECT_GET_ASIZE((h)) * sizeof(duk_tval) \\\n\t))\n#define DUK_HOBJECT_P_COMPUTE_SIZE(n_ent,n_arr,n_hash) \\\n\t( \\\n\t\t(n_ent) * (sizeof(duk_propvalue) + sizeof(duk_hstring *) + sizeof(duk_uint8_t)) + \\\n\t\t(n_arr) * sizeof(duk_tval) + \\\n\t\t(n_hash) * sizeof(duk_uint32_t) \\\n\t)\n#define DUK_HOBJECT_P_SET_REALLOC_PTRS(p_base,set_e_k,set_e_pv,set_e_f,set_a,set_h,n_ent,n_arr,n_hash)  do { \\\n\t\t(set_e_pv) = (duk_propvalue *) (void *) (p_base); \\\n\t\t(set_a) = (duk_tval *) (void *) ((set_e_pv) + (n_ent)); \\\n\t\t(set_e_k) = (duk_hstring **) (void *) ((set_a) + (n_arr)); \\\n\t\t(set_h) = (duk_uint32_t *) (void *) ((set_e_k) + (n_ent)); \\\n\t\t(set_e_f) = (duk_uint8_t *) (void *) ((set_h) + (n_hash)); \\\n\t} while (0)\n#else\n#error invalid hobject layout defines\n#endif  /* hobject property layout */\n\n#define DUK_HOBJECT_P_ALLOC_SIZE(h) \\\n\tDUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE((h)), DUK_HOBJECT_GET_ASIZE((h)), DUK_HOBJECT_GET_HSIZE((h)))\n\n#define DUK_HOBJECT_E_GET_KEY(heap,h,i)              (DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_E_GET_KEY_PTR(heap,h,i)          (&DUK_HOBJECT_E_GET_KEY_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_E_GET_VALUE(heap,h,i)            (DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_E_GET_VALUE_PTR(heap,h,i)        (&DUK_HOBJECT_E_GET_VALUE_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_E_GET_VALUE_TVAL(heap,h,i)       (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v)\n#define DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap,h,i)   (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v)\n#define DUK_HOBJECT_E_GET_VALUE_GETTER(heap,h,i)     (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get)\n#define DUK_HOBJECT_E_GET_VALUE_GETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get)\n#define DUK_HOBJECT_E_GET_VALUE_SETTER(heap,h,i)     (DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set)\n#define DUK_HOBJECT_E_GET_VALUE_SETTER_PTR(heap,h,i) (&DUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set)\n#define DUK_HOBJECT_E_GET_FLAGS(heap,h,i)            (DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_E_GET_FLAGS_PTR(heap,h,i)        (&DUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_A_GET_VALUE(heap,h,i)            (DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_A_GET_VALUE_PTR(heap,h,i)        (&DUK_HOBJECT_A_GET_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_H_GET_INDEX(heap,h,i)            (DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)])\n#define DUK_HOBJECT_H_GET_INDEX_PTR(heap,h,i)        (&DUK_HOBJECT_H_GET_BASE((heap), (h))[(i)])\n\n#define DUK_HOBJECT_E_SET_KEY(heap,h,i,k)  do { \\\n\t\tDUK_HOBJECT_E_GET_KEY((heap), (h), (i)) = (k); \\\n\t} while (0)\n#define DUK_HOBJECT_E_SET_VALUE(heap,h,i,v)  do { \\\n\t\tDUK_HOBJECT_E_GET_VALUE((heap), (h), (i)) = (v); \\\n\t} while (0)\n#define DUK_HOBJECT_E_SET_VALUE_TVAL(heap,h,i,v)  do { \\\n\t\tDUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).v = (v); \\\n\t} while (0)\n#define DUK_HOBJECT_E_SET_VALUE_GETTER(heap,h,i,v)  do { \\\n\t\tDUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.get = (v); \\\n\t} while (0)\n#define DUK_HOBJECT_E_SET_VALUE_SETTER(heap,h,i,v)  do { \\\n\t\tDUK_HOBJECT_E_GET_VALUE((heap), (h), (i)).a.set = (v); \\\n\t} while (0)\n#define DUK_HOBJECT_E_SET_FLAGS(heap,h,i,f)  do { \\\n\t\tDUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) = (duk_uint8_t) (f); \\\n\t} while (0)\n#define DUK_HOBJECT_A_SET_VALUE(heap,h,i,v)  do { \\\n\t\tDUK_HOBJECT_A_GET_VALUE((heap), (h), (i)) = (v); \\\n\t} while (0)\n#define DUK_HOBJECT_A_SET_VALUE_TVAL(heap,h,i,v) \\\n\tDUK_HOBJECT_A_SET_VALUE((heap), (h), (i), (v))  /* alias for above */\n#define DUK_HOBJECT_H_SET_INDEX(heap,h,i,v)  do { \\\n\t\tDUK_HOBJECT_H_GET_INDEX((heap), (h), (i)) = (v); \\\n\t} while (0)\n\n#define DUK_HOBJECT_E_SET_FLAG_BITS(heap,h,i,mask)  do { \\\n\t\tDUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] |= (mask); \\\n\t} while (0)\n\n#define DUK_HOBJECT_E_CLEAR_FLAG_BITS(heap,h,i,mask)  do { \\\n\t\tDUK_HOBJECT_E_GET_FLAGS_BASE((heap), (h))[(i)] &= ~(mask); \\\n\t} while (0)\n\n#define DUK_HOBJECT_E_SLOT_IS_WRITABLE(heap,h,i)     ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_WRITABLE) != 0)\n#define DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(heap,h,i)   ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ENUMERABLE) != 0)\n#define DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(heap,h,i) ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0)\n#define DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap,h,i)     ((DUK_HOBJECT_E_GET_FLAGS((heap), (h), (i)) & DUK_PROPDESC_FLAG_ACCESSOR) != 0)\n\n#define DUK_HOBJECT_E_SLOT_SET_WRITABLE(heap,h,i)        DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE)\n#define DUK_HOBJECT_E_SLOT_SET_ENUMERABLE(heap,h,i)      DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE)\n#define DUK_HOBJECT_E_SLOT_SET_CONFIGURABLE(heap,h,i)    DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE)\n#define DUK_HOBJECT_E_SLOT_SET_ACCESSOR(heap,h,i)        DUK_HOBJECT_E_SET_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR)\n\n#define DUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(heap,h,i)      DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_WRITABLE)\n#define DUK_HOBJECT_E_SLOT_CLEAR_ENUMERABLE(heap,h,i)    DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ENUMERABLE)\n#define DUK_HOBJECT_E_SLOT_CLEAR_CONFIGURABLE(heap,h,i)  DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_CONFIGURABLE)\n#define DUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(heap,h,i)      DUK_HOBJECT_E_CLEAR_FLAG_BITS((heap), (h), (i),DUK_PROPDESC_FLAG_ACCESSOR)\n\n#define DUK_PROPDESC_IS_WRITABLE(p)             (((p)->flags & DUK_PROPDESC_FLAG_WRITABLE) != 0)\n#define DUK_PROPDESC_IS_ENUMERABLE(p)           (((p)->flags & DUK_PROPDESC_FLAG_ENUMERABLE) != 0)\n#define DUK_PROPDESC_IS_CONFIGURABLE(p)         (((p)->flags & DUK_PROPDESC_FLAG_CONFIGURABLE) != 0)\n#define DUK_PROPDESC_IS_ACCESSOR(p)             (((p)->flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0)\n\n#define DUK_HOBJECT_HASHIDX_UNUSED              0xffffffffUL\n#define DUK_HOBJECT_HASHIDX_DELETED             0xfffffffeUL\n\n/*\n *  Macros for accessing size fields\n */\n\n#if defined(DUK_USE_OBJSIZES16)\n#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size16)\n#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size16 = (v); } while (0)\n#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next16)\n#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next16 = (v); } while (0)\n#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next16++)\n#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size16)\n#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size16 = (v); } while (0)\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size16)\n#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size16 = (v); } while (0)\n#else\n#define DUK_HOBJECT_GET_HSIZE(h) 0\n#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0)\n#endif\n#else\n#define DUK_HOBJECT_GET_ESIZE(h) ((h)->e_size)\n#define DUK_HOBJECT_SET_ESIZE(h,v) do { (h)->e_size = (v); } while (0)\n#define DUK_HOBJECT_GET_ENEXT(h) ((h)->e_next)\n#define DUK_HOBJECT_SET_ENEXT(h,v) do { (h)->e_next = (v); } while (0)\n#define DUK_HOBJECT_POSTINC_ENEXT(h) ((h)->e_next++)\n#define DUK_HOBJECT_GET_ASIZE(h) ((h)->a_size)\n#define DUK_HOBJECT_SET_ASIZE(h,v) do { (h)->a_size = (v); } while (0)\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n#define DUK_HOBJECT_GET_HSIZE(h) ((h)->h_size)\n#define DUK_HOBJECT_SET_HSIZE(h,v) do { (h)->h_size = (v); } while (0)\n#else\n#define DUK_HOBJECT_GET_HSIZE(h) 0\n#define DUK_HOBJECT_SET_HSIZE(h,v) do { DUK_ASSERT((v) == 0); } while (0)\n#endif\n#endif\n\n/*\n *  Misc\n */\n\n/* Maximum prototype traversal depth.  Sanity limit which handles e.g.\n * prototype loops (even complex ones like 1->2->3->4->2->3->4->2->3->4).\n */\n#define DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY      10000L\n\n/*\n *  Ecmascript [[Class]]\n */\n\n/* range check not necessary because all 4-bit values are mapped */\n#define DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(n)  duk_class_number_to_stridx[(n)]\n\n#define DUK_HOBJECT_GET_CLASS_STRING(heap,h)          \\\n\tDUK_HEAP_GET_STRING( \\\n\t\t(heap), \\\n\t\tDUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(DUK_HOBJECT_GET_CLASS_NUMBER((h))) \\\n\t)\n\n/*\n *  Macros for property handling\n */\n\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \\\n\t((duk_hobject *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->prototype16))\n#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \\\n\t\t(h)->prototype16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (x)); \\\n\t} while (0)\n#else\n#define DUK_HOBJECT_GET_PROTOTYPE(heap,h) \\\n\t((h)->prototype)\n#define DUK_HOBJECT_SET_PROTOTYPE(heap,h,x) do { \\\n\t\t(h)->prototype = (x); \\\n\t} while (0)\n#endif\n\n/* Set prototype, DECREF earlier value, INCREF new value (tolerating NULLs). */\n#define DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr,h,p)       duk_hobject_set_prototype_updref((thr), (h), (p))\n\n/* Set initial prototype, assume NULL previous prototype, INCREF new value,\n * tolerate NULL.\n */\n#define DUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr,h,proto) do { \\\n\t\tduk_hthread *duk__thr = (thr); \\\n\t\tduk_hobject *duk__obj = (h); \\\n\t\tduk_hobject *duk__proto = (proto); \\\n\t\tDUK_UNREF(duk__thr); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(duk__thr->heap, duk__obj) == NULL); \\\n\t\tDUK_HOBJECT_SET_PROTOTYPE(duk__thr->heap, duk__obj, duk__proto); \\\n\t\tDUK_HOBJECT_INCREF_ALLOWNULL(duk__thr, duk__proto); \\\n\t} while (0)\n\n/*\n *  Finalizer check\n */\n\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((heap), (h))\n#else\n#define DUK_HOBJECT_HAS_FINALIZER_FAST(heap,h) duk_hobject_has_finalizer_fast_raw((h))\n#endif\n\n/*\n *  Resizing and hash behavior\n */\n\n/* Sanity limit on max number of properties (allocated, not necessarily used).\n * This is somewhat arbitrary, but if we're close to 2**32 properties some\n * algorithms will fail (e.g. hash size selection, next prime selection).\n * Also, we use negative array/entry table indices to indicate 'not found',\n * so anything above 0x80000000 will cause trouble now.\n */\n#if defined(DUK_USE_OBJSIZES16)\n#define DUK_HOBJECT_MAX_PROPERTIES       0x0000ffffUL\n#else\n#define DUK_HOBJECT_MAX_PROPERTIES       0x3fffffffUL   /* 2**30-1 ~= 1G properties */\n#endif\n\n/* internal align target for props allocation, must be 2*n for some n */\n#if (DUK_USE_ALIGN_BY == 4)\n#define DUK_HOBJECT_ALIGN_TARGET         4\n#elif (DUK_USE_ALIGN_BY == 8)\n#define DUK_HOBJECT_ALIGN_TARGET         8\n#elif (DUK_USE_ALIGN_BY == 1)\n#define DUK_HOBJECT_ALIGN_TARGET         1\n#else\n#error invalid DUK_USE_ALIGN_BY\n#endif\n\n/*\n *  PC-to-line constants\n */\n\n#define DUK_PC2LINE_SKIP    64\n\n/* maximum length for a SKIP-1 diffstream: 35 bits per entry, rounded up to bytes */\n#define DUK_PC2LINE_MAX_DIFF_LENGTH    (((DUK_PC2LINE_SKIP - 1) * 35 + 7) / 8)\n\n/*\n *  Struct defs\n */\n\nstruct duk_propaccessor {\n\tduk_hobject *get;\n\tduk_hobject *set;\n};\n\nunion duk_propvalue {\n\t/* The get/set pointers could be 16-bit pointer compressed but it\n\t * would make no difference on 32-bit platforms because duk_tval is\n\t * 8 bytes or more anyway.\n\t */\n\tduk_tval v;\n\tduk_propaccessor a;\n};\n\nstruct duk_propdesc {\n\t/* read-only values 'lifted' for ease of use */\n\tduk_small_uint_t flags;\n\tduk_hobject *get;\n\tduk_hobject *set;\n\n\t/* for updating (all are set to < 0 for virtual properties) */\n\tduk_int_t e_idx;  /* prop index in 'entry part', < 0 if not there */\n\tduk_int_t h_idx;  /* prop index in 'hash part', < 0 if not there */\n\tduk_int_t a_idx;  /* prop index in 'array part', < 0 if not there */\n};\n\nstruct duk_hobject {\n\tduk_heaphdr hdr;\n\n\t/*\n\t *  'props' contains {key,value,flags} entries, optional array entries, and\n\t *  an optional hash lookup table for non-array entries in a single 'sliced'\n\t *  allocation.  There are several layout options, which differ slightly in\n\t *  generated code size/speed and alignment/padding; duk_features.h selects\n\t *  the layout used.\n\t *\n\t *  Layout 1 (DUK_USE_HOBJECT_LAYOUT_1):\n\t *\n\t *    e_size * sizeof(duk_hstring *)         bytes of   entry keys (e_next gc reachable)\n\t *    e_size * sizeof(duk_propvalue)         bytes of   entry values (e_next gc reachable)\n\t *    e_size * sizeof(duk_uint8_t)           bytes of   entry flags (e_next gc reachable)\n\t *    a_size * sizeof(duk_tval)              bytes of   (opt) array values (plain only) (all gc reachable)\n\t *    h_size * sizeof(duk_uint32_t)          bytes of   (opt) hash indexes to entries (e_size),\n\t *                                                      0xffffffffUL = unused, 0xfffffffeUL = deleted\n\t *\n\t *  Layout 2 (DUK_USE_HOBJECT_LAYOUT_2):\n\t *\n\t *    e_size * sizeof(duk_propvalue)         bytes of   entry values (e_next gc reachable)\n\t *    e_size * sizeof(duk_hstring *)         bytes of   entry keys (e_next gc reachable)\n\t *    e_size * sizeof(duk_uint8_t) + pad     bytes of   entry flags (e_next gc reachable)\n\t *    a_size * sizeof(duk_tval)              bytes of   (opt) array values (plain only) (all gc reachable)\n\t *    h_size * sizeof(duk_uint32_t)          bytes of   (opt) hash indexes to entries (e_size),\n\t *                                                      0xffffffffUL = unused, 0xfffffffeUL = deleted\n\t *\n\t *  Layout 3 (DUK_USE_HOBJECT_LAYOUT_3):\n\t *\n\t *    e_size * sizeof(duk_propvalue)         bytes of   entry values (e_next gc reachable)\n\t *    a_size * sizeof(duk_tval)              bytes of   (opt) array values (plain only) (all gc reachable)\n\t *    e_size * sizeof(duk_hstring *)         bytes of   entry keys (e_next gc reachable)\n\t *    h_size * sizeof(duk_uint32_t)          bytes of   (opt) hash indexes to entries (e_size),\n\t *                                                      0xffffffffUL = unused, 0xfffffffeUL = deleted\n\t *    e_size * sizeof(duk_uint8_t)           bytes of   entry flags (e_next gc reachable)\n\t *\n\t *  In layout 1, the 'e_next' count is rounded to 4 or 8 on platforms\n\t *  requiring 4 or 8 byte alignment.  This ensures proper alignment\n\t *  for the entries, at the cost of memory footprint.  However, it's\n\t *  probably preferable to use another layout on such platforms instead.\n\t *\n\t *  In layout 2, the key and value parts are swapped to avoid padding\n\t *  the key array on platforms requiring alignment by 8.  The flags part\n\t *  is padded to get alignment for array entries.  The 'e_next' count does\n\t *  not need to be rounded as in layout 1.\n\t *\n\t *  In layout 3, entry values and array values are always aligned properly,\n\t *  and assuming pointers are at most 8 bytes, so are the entry keys.  Hash\n\t *  indices will be properly aligned (assuming pointers are at least 4 bytes).\n\t *  Finally, flags don't need additional alignment.  This layout provides\n\t *  compact allocations without padding (even on platforms with alignment\n\t *  requirements) at the cost of a bit slower lookups.\n\t *\n\t *  Objects with few keys don't have a hash index; keys are looked up linearly,\n\t *  which is cache efficient because the keys are consecutive.  Larger objects\n\t *  have a hash index part which contains integer indexes to the entries part.\n\t *\n\t *  A single allocation reduces memory allocation overhead but requires more\n\t *  work when any part needs to be resized.  A sliced allocation for entries\n\t *  makes linear key matching faster on most platforms (more locality) and\n\t *  skimps on flags size (which would be followed by 3 bytes of padding in\n\t *  most architectures if entries were placed in a struct).\n\t *\n\t *  'props' also contains internal properties distinguished with a non-BMP\n\t *  prefix.  Often used properties should be placed early in 'props' whenever\n\t *  possible to make accessing them as fast a possible.\n\t */\n\n#if defined(DUK_USE_HEAPPTR16)\n\t/* Located in duk_heaphdr h_extra16.  Subclasses of duk_hobject (like\n\t * duk_hcompfunc) are not free to use h_extra16 for this reason.\n\t */\n#else\n\tduk_uint8_t *props;\n#endif\n\n\t/* prototype: the only internal property lifted outside 'e' as it is so central */\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t prototype16;\n#else\n\tduk_hobject *prototype;\n#endif\n\n#if defined(DUK_USE_OBJSIZES16)\n\tduk_uint16_t e_size16;\n\tduk_uint16_t e_next16;\n\tduk_uint16_t a_size16;\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tduk_uint16_t h_size16;\n#endif\n#else\n\tduk_uint32_t e_size;  /* entry part size */\n\tduk_uint32_t e_next;  /* index for next new key ([0,e_next[ are gc reachable) */\n\tduk_uint32_t a_size;  /* array part size (entirely gc reachable) */\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tduk_uint32_t h_size;  /* hash part size or 0 if unused */\n#endif\n#endif\n};\n\n/*\n *  Exposed data\n */\n\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL duk_uint8_t duk_class_number_to_stridx[32];\n#endif  /* !DUK_SINGLE_FILE */\n\n/*\n *  Prototypes\n */\n\n/* alloc and init */\nDUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL_DECL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\n#endif\nDUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\nDUK_INTERNAL_DECL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags);\n\n/* resize */\nDUK_INTERNAL_DECL void duk_hobject_realloc_props(duk_hthread *thr,\n                                                 duk_hobject *obj,\n                                                 duk_uint32_t new_e_size,\n                                                 duk_uint32_t new_a_size,\n                                                 duk_uint32_t new_h_size,\n                                                 duk_bool_t abandon_array);\nDUK_INTERNAL_DECL void duk_hobject_resize_entrypart(duk_hthread *thr,\n                                                    duk_hobject *obj,\n                                                    duk_uint32_t new_e_size);\n#if 0  /*unused*/\nDUK_INTERNAL_DECL void duk_hobject_resize_arraypart(duk_hthread *thr,\n                                                    duk_hobject *obj,\n                                                    duk_uint32_t new_a_size);\n#endif\n\n/* low-level property functions */\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx);\nDUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key);\nDUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs);\nDUK_INTERNAL_DECL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags);\n\n/* XXX: when optimizing for guaranteed property slots, use a guaranteed\n * slot for internal value; this call can then access it directly.\n */\n#define duk_hobject_get_internal_value_tval_ptr(heap,obj) \\\n\tduk_hobject_find_existing_entry_tval_ptr((heap), (obj), DUK_HEAP_STRING_INT_VALUE((heap)))\n\n/* core property functions */\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key);\n\n/* internal property functions */\n#define DUK_DELPROP_FLAG_THROW  (1U << 0)\n#define DUK_DELPROP_FLAG_FORCE  (1U << 1)\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key);\nDUK_INTERNAL_DECL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags);\nDUK_INTERNAL_DECL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags);\nDUK_INTERNAL_DECL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj);\n#if defined(DUK_USE_HEAPPTR16)\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj);\n#else\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj);\n#endif\n\n/* helpers for defineProperty() and defineProperties() */\nDUK_INTERNAL_DECL void duk_hobject_prepare_property_descriptor(duk_hthread *thr,\n                                                               duk_idx_t idx_in,\n                                                               duk_uint_t *out_defprop_flags,\n                                                               duk_idx_t *out_idx_value,\n                                                               duk_hobject **out_getter,\n                                                               duk_hobject **out_setter);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_define_property_helper(duk_hthread *thr,\n                                                                duk_uint_t defprop_flags,\n                                                                duk_hobject *obj,\n                                                                duk_hstring *key,\n                                                                duk_idx_t idx_value,\n                                                                duk_hobject *get,\n                                                                duk_hobject *set,\n                                                                duk_bool_t throw_flag);\n\n/* Object built-in methods */\nDUK_INTERNAL_DECL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx);\nDUK_INTERNAL_DECL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags);\n\n/* internal properties */\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv);\nDUK_INTERNAL_DECL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj);\n\n/* hobject management functions */\nDUK_INTERNAL_DECL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj);\n\n/* ES2015 proxy */\n#if defined(DUK_USE_ES6_PROXY)\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler);\nDUK_INTERNAL_DECL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj);\n#endif\n\n/* enumeration */\nDUK_INTERNAL_DECL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags);\nDUK_INTERNAL_DECL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags);\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value);\n\n/* macros */\nDUK_INTERNAL_DECL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p);\n\n/* pc2line */\n#if defined(DUK_USE_PC2LINE)\nDUK_INTERNAL_DECL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length);\nDUK_INTERNAL_DECL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc);\n#endif\n\n/* misc */\nDUK_INTERNAL_DECL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop);\n\n#if !defined(DUK_USE_OBJECT_BUILTIN)\n/* These declarations are needed when related built-in is disabled and\n * genbuiltins.py won't automatically emit the declerations.\n */\nDUK_INTERNAL_DECL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_ret_t duk_bi_function_prototype(duk_hthread *thr);\n#endif\n\n#endif  /* DUK_HOBJECT_H_INCLUDED */\n/* #include duk_hcompfunc.h */\n#line 1 \"duk_hcompfunc.h\"\n/*\n *  Heap compiled function (Ecmascript function) representation.\n *\n *  There is a single data buffer containing the Ecmascript function's\n *  bytecode, constants, and inner functions.\n */\n\n#if !defined(DUK_HCOMPFUNC_H_INCLUDED)\n#define DUK_HCOMPFUNC_H_INCLUDED\n\n/*\n *  Field accessor macros\n */\n\n/* XXX: casts could be improved, especially for GET/SET DATA */\n\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HCOMPFUNC_GET_DATA(heap,h) \\\n\t((duk_hbuffer_fixed *) (void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->data16))\n#define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \\\n\t\t(h)->data16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_FUNCS(heap,h)  \\\n\t((duk_hobject **) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->funcs16)))\n#define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v)  do { \\\n\t\t(h)->funcs16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_BYTECODE(heap,h)  \\\n\t((duk_instr_t *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->bytecode16)))\n#define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v)  do { \\\n\t\t(h)->bytecode16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_LEXENV(heap,h)  \\\n\t((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->lex_env16)))\n#define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v)  do { \\\n\t\t(h)->lex_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_VARENV(heap,h)  \\\n\t((duk_hobject *) (void *) (DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (h)->var_env16)))\n#define DUK_HCOMPFUNC_SET_VARENV(heap,h,v)  do { \\\n\t\t(h)->var_env16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \\\n\t} while (0)\n#else\n#define DUK_HCOMPFUNC_GET_DATA(heap,h)  ((duk_hbuffer_fixed *) (void *) (h)->data)\n#define DUK_HCOMPFUNC_SET_DATA(heap,h,v) do { \\\n\t\t(h)->data = (duk_hbuffer *) (v); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_FUNCS(heap,h)  ((h)->funcs)\n#define DUK_HCOMPFUNC_SET_FUNCS(heap,h,v)  do { \\\n\t\t(h)->funcs = (v); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_BYTECODE(heap,h)  ((h)->bytecode)\n#define DUK_HCOMPFUNC_SET_BYTECODE(heap,h,v)  do { \\\n\t\t(h)->bytecode = (v); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_LEXENV(heap,h)  ((h)->lex_env)\n#define DUK_HCOMPFUNC_SET_LEXENV(heap,h,v)  do { \\\n\t\t(h)->lex_env = (v); \\\n\t} while (0)\n#define DUK_HCOMPFUNC_GET_VARENV(heap,h)  ((h)->var_env)\n#define DUK_HCOMPFUNC_SET_VARENV(heap,h,v)  do { \\\n\t\t(h)->var_env = (v); \\\n\t} while (0)\n#endif\n\n/*\n *  Accessor macros for function specific data areas\n */\n\n/* Note: assumes 'data' is always a fixed buffer */\n#define DUK_HCOMPFUNC_GET_BUFFER_BASE(heap,h)  \\\n\tDUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h)))\n\n#define DUK_HCOMPFUNC_GET_CONSTS_BASE(heap,h)  \\\n\t((duk_tval *) (void *) DUK_HCOMPFUNC_GET_BUFFER_BASE((heap), (h)))\n\n#define DUK_HCOMPFUNC_GET_FUNCS_BASE(heap,h)  \\\n\tDUK_HCOMPFUNC_GET_FUNCS((heap), (h))\n\n#define DUK_HCOMPFUNC_GET_CODE_BASE(heap,h)  \\\n\tDUK_HCOMPFUNC_GET_BYTECODE((heap), (h))\n\n#define DUK_HCOMPFUNC_GET_CONSTS_END(heap,h)  \\\n\t((duk_tval *) (void *) DUK_HCOMPFUNC_GET_FUNCS((heap), (h)))\n\n#define DUK_HCOMPFUNC_GET_FUNCS_END(heap,h)  \\\n\t((duk_hobject **) (void *) DUK_HCOMPFUNC_GET_BYTECODE((heap), (h)))\n\n/* XXX: double evaluation of DUK_HCOMPFUNC_GET_DATA() */\n#define DUK_HCOMPFUNC_GET_CODE_END(heap,h)  \\\n\t((duk_instr_t *) (void *) (DUK_HBUFFER_FIXED_GET_DATA_PTR((heap), DUK_HCOMPFUNC_GET_DATA((heap), (h))) + \\\n\t                DUK_HBUFFER_GET_SIZE((duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA((heap), h))))\n\n#define DUK_HCOMPFUNC_GET_CONSTS_SIZE(heap,h)  \\\n\t( \\\n\t (duk_size_t) \\\n\t ( \\\n\t   ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_END((heap), (h))) - \\\n\t   ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CONSTS_BASE((heap), (h))) \\\n\t ) \\\n\t)\n\n#define DUK_HCOMPFUNC_GET_FUNCS_SIZE(heap,h)  \\\n\t( \\\n\t (duk_size_t) \\\n\t ( \\\n\t   ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_END((heap), (h))) - \\\n\t   ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_FUNCS_BASE((heap), (h))) \\\n\t ) \\\n\t)\n\n#define DUK_HCOMPFUNC_GET_CODE_SIZE(heap,h)  \\\n\t( \\\n\t (duk_size_t) \\\n\t ( \\\n\t   ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_END((heap),(h))) - \\\n\t   ((const duk_uint8_t *) DUK_HCOMPFUNC_GET_CODE_BASE((heap),(h))) \\\n\t ) \\\n\t)\n\n#define DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap,h)  \\\n\t((duk_size_t) (DUK_HCOMPFUNC_GET_CONSTS_SIZE((heap), (h)) / sizeof(duk_tval)))\n\n#define DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap,h)  \\\n\t((duk_size_t) (DUK_HCOMPFUNC_GET_FUNCS_SIZE((heap), (h)) / sizeof(duk_hobject *)))\n\n#define DUK_HCOMPFUNC_GET_CODE_COUNT(heap,h)  \\\n\t((duk_size_t) (DUK_HCOMPFUNC_GET_CODE_SIZE((heap), (h)) / sizeof(duk_instr_t)))\n\n/*\n *  Validity assert\n */\n\n#define DUK_ASSERT_HCOMPFUNC_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t} while (0)\n\n/*\n *  Main struct\n */\n\nstruct duk_hcompfunc {\n\t/* shared object part */\n\tduk_hobject obj;\n\n\t/*\n\t *  Pointers to function data area for faster access.  Function\n\t *  data is a buffer shared between all closures of the same\n\t *  \"template\" function.  The data buffer is always fixed (non-\n\t *  dynamic, hence stable), with a layout as follows:\n\t *\n\t *    constants (duk_tval)\n\t *    inner functions (duk_hobject *)\n\t *    bytecode (duk_instr_t)\n\t *\n\t *  Note: bytecode end address can be computed from 'data' buffer\n\t *  size.  It is not strictly necessary functionally, assuming\n\t *  bytecode never jumps outside its allocated area.  However,\n\t *  it's a safety/robustness feature for avoiding the chance of\n\t *  executing random data as bytecode due to a compiler error.\n\t *\n\t *  Note: values in the data buffer must be incref'd (they will\n\t *  be decref'd on release) for every compiledfunction referring\n\t *  to the 'data' element.\n\t */\n\n\t/* Data area, fixed allocation, stable data ptrs. */\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t data16;\n#else\n\tduk_hbuffer *data;\n#endif\n\n\t/* No need for constants pointer (= same as data).\n\t *\n\t * When using 16-bit packing alignment to 4 is nice.  'funcs' will be\n\t * 4-byte aligned because 'constants' are duk_tvals.  For now the\n\t * inner function pointers are not compressed, so that 'bytecode' will\n\t * also be 4-byte aligned.\n\t */\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t funcs16;\n\tduk_uint16_t bytecode16;\n#else\n\tduk_hobject **funcs;\n\tduk_instr_t *bytecode;\n#endif\n\n\t/* Lexenv: lexical environment of closure, NULL for templates.\n\t * Varenv: variable environment of closure, NULL for templates.\n\t */\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t lex_env16;\n\tduk_uint16_t var_env16;\n#else\n\tduk_hobject *lex_env;\n\tduk_hobject *var_env;\n#endif\n\n\t/*\n\t *  'nregs' registers are allocated on function entry, at most 'nargs'\n\t *  are initialized to arguments, and the rest to undefined.  Arguments\n\t *  above 'nregs' are not mapped to registers.  All registers in the\n\t *  active stack range must be initialized because they are GC reachable.\n\t *  'nargs' is needed so that if the function is given more than 'nargs'\n\t *  arguments, the additional arguments do not 'clobber' registers\n\t *  beyond 'nregs' which must be consistently initialized to undefined.\n\t *\n\t *  Usually there is no need to know which registers are mapped to\n\t *  local variables.  Registers may be allocated to variable in any\n\t *  way (even including gaps).  However, a register-variable mapping\n\t *  must be the same for the duration of the function execution and\n\t *  the register cannot be used for anything else.\n\t *\n\t *  When looking up variables by name, the '_Varmap' map is used.\n\t *  When an activation closes, registers mapped to arguments are\n\t *  copied into the environment record based on the same map.  The\n\t *  reverse map (from register to variable) is not currently needed\n\t *  at run time, except for debugging, so it is not maintained.\n\t */\n\n\tduk_uint16_t nregs;                /* regs to allocate */\n\tduk_uint16_t nargs;                /* number of arguments allocated to regs */\n\n\t/*\n\t *  Additional control information is placed into the object itself\n\t *  as internal properties to avoid unnecessary fields for the\n\t *  majority of functions.  The compiler tries to omit internal\n\t *  control fields when possible.\n\t *\n\t *  Function templates:\n\t *\n\t *    {\n\t *      name: \"func\",    // declaration, named function expressions\n\t *      fileName: <debug info for creating nice errors>\n\t *      _Varmap: { \"arg1\": 0, \"arg2\": 1, \"varname\": 2 },\n\t *      _Formals: [ \"arg1\", \"arg2\" ],\n\t *      _Source: \"function func(arg1, arg2) { ... }\",\n\t *      _Pc2line: <debug info for pc-to-line mapping>,\n\t *    }\n\t *\n\t *  Function instances:\n\t *\n\t *    {\n\t *      length: 2,\n\t *      prototype: { constructor: <func> },\n\t *      caller: <thrower>,\n\t *      arguments: <thrower>,\n\t *      name: \"func\",    // declaration, named function expressions\n\t *      fileName: <debug info for creating nice errors>\n\t *      _Varmap: { \"arg1\": 0, \"arg2\": 1, \"varname\": 2 },\n\t *      _Formals: [ \"arg1\", \"arg2\" ],\n\t *      _Source: \"function func(arg1, arg2) { ... }\",\n\t *      _Pc2line: <debug info for pc-to-line mapping>,\n\t *    }\n\t *\n\t *  More detailed description of these properties can be found\n\t *  in the documentation.\n\t */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t/* Line number range for function.  Needed during debugging to\n\t * determine active breakpoints.\n\t */\n\tduk_uint32_t start_line;\n\tduk_uint32_t end_line;\n#endif\n};\n\n#endif  /* DUK_HCOMPFUNC_H_INCLUDED */\n/* #include duk_hnatfunc.h */\n#line 1 \"duk_hnatfunc.h\"\n/*\n *  Heap native function representation.\n */\n\n#if !defined(DUK_HNATFUNC_H_INCLUDED)\n#define DUK_HNATFUNC_H_INCLUDED\n\n#define DUK_HNATFUNC_NARGS_VARARGS  ((duk_int16_t) -1)\n#define DUK_HNATFUNC_NARGS_MAX      ((duk_int16_t) 0x7fff)\n\nstruct duk_hnatfunc {\n\t/* shared object part */\n\tduk_hobject obj;\n\n\tduk_c_function func;\n\tduk_int16_t nargs;\n\tduk_int16_t magic;\n\n\t/* The 'magic' field allows an opaque 16-bit field to be accessed by the\n\t * Duktape/C function.  This allows, for instance, the same native function\n\t * to be used for a set of very similar functions, with the 'magic' field\n\t * providing the necessary non-argument flags / values to guide the behavior\n\t * of the native function.  The value is signed on purpose: it is easier to\n\t * convert a signed value to unsigned (simply AND with 0xffff) than vice\n\t * versa.\n\t *\n\t * Note: cannot place nargs/magic into the heaphdr flags, because\n\t * duk_hobject takes almost all flags already.\n\t */\n};\n\n#endif  /* DUK_HNATFUNC_H_INCLUDED */\n/* #include duk_hboundfunc.h */\n#line 1 \"duk_hboundfunc.h\"\n/*\n *  Bound function representation.\n */\n\n#if !defined(DUK_HBOUNDFUNC_H_INCLUDED)\n#define DUK_HBOUNDFUNC_H_INCLUDED\n\n/* Artificial limit for args length.  Ensures arithmetic won't overflow\n * 32 bits when combining bound functions.\n */\n#define DUK_HBOUNDFUNC_MAX_ARGS 0x20000000UL\n\n#define DUK_ASSERT_HBOUNDFUNC_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_BOUNDFUNC((duk_hobject *) (h))); \\\n\t\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&(h)->target) || \\\n\t\t           (DUK_TVAL_IS_OBJECT(&(h)->target) && \\\n\t\t            DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&(h)->target)))); \\\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(&(h)->this_binding)); \\\n\t\tDUK_ASSERT((h)->nargs == 0 || (h)->args != NULL); \\\n\t} while (0)\n\nstruct duk_hboundfunc {\n\t/* Shared object part. */\n\tduk_hobject obj;\n\n\t/* Final target function, stored as duk_tval so that lightfunc can be\n\t * represented too.\n\t */\n\tduk_tval target;\n\n\t/* This binding. */\n\tduk_tval this_binding;\n\n\t/* Arguments to prepend. */\n\tduk_tval *args;  /* Separate allocation. */\n\tduk_idx_t nargs;\n};\n\n#endif  /* DUK_HBOUNDFUNC_H_INCLUDED */\n/* #include duk_hbufobj.h */\n#line 1 \"duk_hbufobj.h\"\n/*\n *  Heap Buffer object representation.  Used for all Buffer variants.\n */\n\n#if !defined(DUK_HBUFOBJ_H_INCLUDED)\n#define DUK_HBUFOBJ_H_INCLUDED\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\n/* All element accessors are host endian now (driven by TypedArray spec). */\n#define DUK_HBUFOBJ_ELEM_UINT8           0\n#define DUK_HBUFOBJ_ELEM_UINT8CLAMPED    1\n#define DUK_HBUFOBJ_ELEM_INT8            2\n#define DUK_HBUFOBJ_ELEM_UINT16          3\n#define DUK_HBUFOBJ_ELEM_INT16           4\n#define DUK_HBUFOBJ_ELEM_UINT32          5\n#define DUK_HBUFOBJ_ELEM_INT32           6\n#define DUK_HBUFOBJ_ELEM_FLOAT32         7\n#define DUK_HBUFOBJ_ELEM_FLOAT64         8\n#define DUK_HBUFOBJ_ELEM_MAX             8\n\n#define DUK_ASSERT_HBUFOBJ_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT((h)->shift <= 3); \\\n\t\tDUK_ASSERT((h)->elem_type <= DUK_HBUFOBJ_ELEM_MAX); \\\n\t\tDUK_ASSERT(((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8) || \\\n\t\t           ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT8CLAMPED) || \\\n\t\t           ((h)->shift == 0 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT8) || \\\n\t\t           ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT16) || \\\n\t\t           ((h)->shift == 1 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT16) || \\\n\t\t           ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_UINT32) || \\\n\t\t           ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_INT32) || \\\n\t\t           ((h)->shift == 2 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT32) || \\\n\t\t           ((h)->shift == 3 && (h)->elem_type == DUK_HBUFOBJ_ELEM_FLOAT64)); \\\n\t\tDUK_ASSERT((h)->is_typedarray == 0 || (h)->is_typedarray == 1); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) (h))); \\\n\t\tif ((h)->buf == NULL) { \\\n\t\t\tDUK_ASSERT((h)->offset == 0); \\\n\t\t\tDUK_ASSERT((h)->length == 0); \\\n\t\t} else { \\\n\t\t\t/* No assertions for offset or length; in particular, \\\n\t\t\t * it's OK for length to be longer than underlying \\\n\t\t\t * buffer.  Just ensure they don't wrap when added. \\\n\t\t\t */ \\\n\t\t\tDUK_ASSERT((h)->offset + (h)->length >= (h)->offset); \\\n\t\t} \\\n\t} while (0)\n\n/* Get the current data pointer (caller must ensure buf != NULL) as a\n * duk_uint8_t ptr.\n */\n#define DUK_HBUFOBJ_GET_SLICE_BASE(heap,h) \\\n\t(DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \\\n\t(((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR((heap), (h)->buf)) + (h)->offset))\n\n/* True if slice is full, i.e. offset is zero and length covers the entire\n * buffer.  This status may change independently of the duk_hbufobj if\n * the underlying buffer is dynamic and changes without the hbufobj\n * being changed.\n */\n#define DUK_HBUFOBJ_FULL_SLICE(h) \\\n\t(DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \\\n\t((h)->offset == 0 && (h)->length == DUK_HBUFFER_GET_SIZE((h)->buf)))\n\n/* Validate that the whole slice [0,length[ is contained in the underlying\n * buffer.  Caller must ensure 'buf' != NULL.\n */\n#define DUK_HBUFOBJ_VALID_SLICE(h) \\\n\t(DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \\\n\t((h)->offset + (h)->length <= DUK_HBUFFER_GET_SIZE((h)->buf)))\n\n/* Validate byte read/write for virtual 'offset', i.e. check that the\n * offset, taking into account h->offset, is within the underlying\n * buffer size.  This is a safety check which is needed to ensure\n * that even a misconfigured duk_hbufobj never causes memory unsafe\n * behavior (e.g. if an underlying dynamic buffer changes after being\n * setup).  Caller must ensure 'buf' != NULL.\n */\n#define DUK_HBUFOBJ_VALID_BYTEOFFSET_INCL(h,off) \\\n\t(DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \\\n\t((h)->offset + (off) < DUK_HBUFFER_GET_SIZE((h)->buf)))\n\n#define DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h,off) \\\n\t(DUK_ASSERT_EXPR((h) != NULL), DUK_ASSERT_EXPR((h)->buf != NULL), \\\n\t((h)->offset + (off) <= DUK_HBUFFER_GET_SIZE((h)->buf)))\n\n/* Clamp an input byte length (already assumed to be within the nominal\n * duk_hbufobj 'length') to the current dynamic buffer limits to yield\n * a byte length limit that's safe for memory accesses.  This value can\n * be invalidated by any side effect because it may trigger a user\n * callback that resizes the underlying buffer.\n */\n#define DUK_HBUFOBJ_CLAMP_BYTELENGTH(h,len) \\\n\t(DUK_ASSERT_EXPR((h) != NULL), \\\n\tduk_hbufobj_clamp_bytelength((h), (len)))\n\n/* Typed arrays have virtual indices, ArrayBuffer and DataView do not. */\n#define DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h)  ((h)->is_typedarray)\n\nstruct duk_hbufobj {\n\t/* Shared object part. */\n\tduk_hobject obj;\n\n\t/* Underlying buffer (refcounted), may be NULL. */\n\tduk_hbuffer *buf;\n\n\t/* .buffer reference to an ArrayBuffer, may be NULL. */\n\tduk_hobject *buf_prop;\n\n\t/* Slice and accessor information.\n\t *\n\t * Because the underlying buffer may be dynamic, these may be\n\t * invalidated by the buffer being modified so that both offset\n\t * and length should be validated before every access.  Behavior\n\t * when the underlying buffer has changed doesn't need to be clean:\n\t * virtual 'length' doesn't need to be affected, reads can return\n\t * zero/NaN, and writes can be ignored.\n\t *\n\t * Note that a data pointer cannot be precomputed because 'buf' may\n\t * be dynamic and its pointer unstable.\n\t */\n\n\tduk_uint_t offset;       /* byte offset to buf */\n\tduk_uint_t length;       /* byte index limit for element access, exclusive */\n\tduk_uint8_t shift;       /* element size shift:\n\t                          *   0 = u8/i8\n\t                          *   1 = u16/i16\n\t                          *   2 = u32/i32/float\n\t                          *   3 = double\n\t                          */\n\tduk_uint8_t elem_type;   /* element type */\n\tduk_uint8_t is_typedarray;\n};\n\nDUK_INTERNAL_DECL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len);\nDUK_INTERNAL_DECL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf);\nDUK_INTERNAL_DECL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size);\nDUK_INTERNAL_DECL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size);\nDUK_INTERNAL_DECL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx);\n\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n#endif  /* DUK_HBUFOBJ_H_INCLUDED */\n/* #include duk_hthread.h */\n#line 1 \"duk_hthread.h\"\n/*\n *  Heap thread object representation.\n *\n *  duk_hthread is also the 'context' for public API functions via a\n *  different typedef.  Most API calls operate on the topmost frame\n *  of the value stack only.\n */\n\n#if !defined(DUK_HTHREAD_H_INCLUDED)\n#define DUK_HTHREAD_H_INCLUDED\n\n/*\n *  Stack constants\n */\n\n/* Initial valstack size, roughly 0.7kiB. */\n#define DUK_VALSTACK_INITIAL_SIZE       96U\n\n/* Internal extra elements assumed on function entry, always added to\n * user-defined 'extra' for e.g. the duk_check_stack() call.\n */\n#define DUK_VALSTACK_INTERNAL_EXTRA     32U\n\n/* Number of elements guaranteed to be user accessible (in addition to call\n * arguments) on Duktape/C function entry.  This is the major public API\n * commitment.\n */\n#define DUK_VALSTACK_API_ENTRY_MINIMUM  DUK_API_ENTRY_STACK\n\n/*\n *  Activation defines\n */\n\n#define DUK_ACT_FLAG_STRICT             (1U << 0)  /* function executes in strict mode */\n#define DUK_ACT_FLAG_TAILCALLED         (1U << 1)  /* activation has tail called one or more times */\n#define DUK_ACT_FLAG_CONSTRUCT          (1U << 2)  /* function executes as a constructor (called via \"new\") */\n#define DUK_ACT_FLAG_PREVENT_YIELD      (1U << 3)  /* activation prevents yield (native call or \"new\") */\n#define DUK_ACT_FLAG_DIRECT_EVAL        (1U << 4)  /* activation is a direct eval call */\n#define DUK_ACT_FLAG_CONSTRUCT_PROXY    (1U << 5)  /* activation is for Proxy 'construct' call, special return value handling */\n#define DUK_ACT_FLAG_BREAKPOINT_ACTIVE  (1U << 6)  /* activation has active breakpoint(s) */\n\n#define DUK_ACT_GET_FUNC(act)           ((act)->func)\n\n/*\n *  Flags for __FILE__ / __LINE__ registered into tracedata\n */\n\n#define DUK_TB_FLAG_NOBLAME_FILELINE    (1U << 0)  /* don't report __FILE__ / __LINE__ as fileName/lineNumber */\n\n/*\n *  Catcher defines\n */\n\n/* XXX: remove catcher type entirely */\n\n/* flags field: LLLLLLFT, L = label (24 bits), F = flags (4 bits), T = type (4 bits) */\n#define DUK_CAT_TYPE_MASK            0x0000000fUL\n#define DUK_CAT_TYPE_BITS            4\n#define DUK_CAT_LABEL_MASK           0xffffff00UL\n#define DUK_CAT_LABEL_BITS           24\n#define DUK_CAT_LABEL_SHIFT          8\n\n#define DUK_CAT_FLAG_CATCH_ENABLED          (1U << 4)   /* catch part will catch */\n#define DUK_CAT_FLAG_FINALLY_ENABLED        (1U << 5)   /* finally part will catch */\n#define DUK_CAT_FLAG_CATCH_BINDING_ENABLED  (1U << 6)   /* request to create catch binding */\n#define DUK_CAT_FLAG_LEXENV_ACTIVE          (1U << 7)   /* catch or with binding is currently active */\n\n#define DUK_CAT_TYPE_UNKNOWN         0\n#define DUK_CAT_TYPE_TCF             1\n#define DUK_CAT_TYPE_LABEL           2\n\n#define DUK_CAT_GET_TYPE(c)          ((c)->flags & DUK_CAT_TYPE_MASK)\n#define DUK_CAT_GET_LABEL(c)         (((c)->flags & DUK_CAT_LABEL_MASK) >> DUK_CAT_LABEL_SHIFT)\n\n#define DUK_CAT_HAS_CATCH_ENABLED(c)           ((c)->flags & DUK_CAT_FLAG_CATCH_ENABLED)\n#define DUK_CAT_HAS_FINALLY_ENABLED(c)         ((c)->flags & DUK_CAT_FLAG_FINALLY_ENABLED)\n#define DUK_CAT_HAS_CATCH_BINDING_ENABLED(c)   ((c)->flags & DUK_CAT_FLAG_CATCH_BINDING_ENABLED)\n#define DUK_CAT_HAS_LEXENV_ACTIVE(c)           ((c)->flags & DUK_CAT_FLAG_LEXENV_ACTIVE)\n\n#define DUK_CAT_SET_CATCH_ENABLED(c)    do { \\\n\t\t(c)->flags |= DUK_CAT_FLAG_CATCH_ENABLED; \\\n\t} while (0)\n#define DUK_CAT_SET_FINALLY_ENABLED(c)  do { \\\n\t\t(c)->flags |= DUK_CAT_FLAG_FINALLY_ENABLED; \\\n\t} while (0)\n#define DUK_CAT_SET_CATCH_BINDING_ENABLED(c)    do { \\\n\t\t(c)->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \\\n\t} while (0)\n#define DUK_CAT_SET_LEXENV_ACTIVE(c)    do { \\\n\t\t(c)->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE; \\\n\t} while (0)\n\n#define DUK_CAT_CLEAR_CATCH_ENABLED(c)    do { \\\n\t\t(c)->flags &= ~DUK_CAT_FLAG_CATCH_ENABLED; \\\n\t} while (0)\n#define DUK_CAT_CLEAR_FINALLY_ENABLED(c)  do { \\\n\t\t(c)->flags &= ~DUK_CAT_FLAG_FINALLY_ENABLED; \\\n\t} while (0)\n#define DUK_CAT_CLEAR_CATCH_BINDING_ENABLED(c)    do { \\\n\t\t(c)->flags &= ~DUK_CAT_FLAG_CATCH_BINDING_ENABLED; \\\n\t} while (0)\n#define DUK_CAT_CLEAR_LEXENV_ACTIVE(c)    do { \\\n\t\t(c)->flags &= ~DUK_CAT_FLAG_LEXENV_ACTIVE; \\\n\t} while (0)\n\n/*\n *  Thread defines\n */\n\n#if defined(DUK_USE_ROM_STRINGS)\n#define DUK_HTHREAD_GET_STRING(thr,idx) \\\n\t((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)]))\n#else  /* DUK_USE_ROM_STRINGS */\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HTHREAD_GET_STRING(thr,idx) \\\n\t((duk_hstring *) DUK_USE_HEAPPTR_DEC16((thr)->heap->heap_udata, (thr)->strs16[(idx)]))\n#else\n#define DUK_HTHREAD_GET_STRING(thr,idx) \\\n\t((thr)->strs[(idx)])\n#endif\n#endif  /* DUK_USE_ROM_STRINGS */\n\n/* values for the state field */\n#define DUK_HTHREAD_STATE_INACTIVE     1   /* thread not currently running */\n#define DUK_HTHREAD_STATE_RUNNING      2   /* thread currently running (only one at a time) */\n#define DUK_HTHREAD_STATE_RESUMED      3   /* thread resumed another thread (active but not running) */\n#define DUK_HTHREAD_STATE_YIELDED      4   /* thread has yielded */\n#define DUK_HTHREAD_STATE_TERMINATED   5   /* thread has terminated */\n\n/* Executor interrupt default interval when nothing else requires a\n * smaller value.  The default interval must be small enough to allow\n * for reasonable execution timeout checking but large enough to keep\n * impact on execution performance low.\n */\n#if defined(DUK_USE_INTERRUPT_COUNTER)\n#define DUK_HTHREAD_INTCTR_DEFAULT     (256L * 1024L)\n#endif\n\n/*\n *  Assert context is valid: non-NULL pointer, fields look sane.\n *\n *  This is used by public API call entrypoints to catch invalid 'ctx' pointers\n *  as early as possible; invalid 'ctx' pointers cause very odd and difficult to\n *  diagnose behavior so it's worth checking even when the check is not 100%.\n */\n\n/* Assertions for internals. */\n#define DUK_ASSERT_HTHREAD_VALID(thr) do { \\\n\t\tDUK_ASSERT((thr) != NULL); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) (thr)) == DUK_HTYPE_OBJECT); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_THREAD((duk_hobject *) (thr))); \\\n\t\tDUK_ASSERT((thr)->unused1 == 0); \\\n\t\tDUK_ASSERT((thr)->unused2 == 0); \\\n\t} while (0)\n\n/* Assertions for public API calls; a bit stronger. */\n#define DUK_ASSERT_CTX_VALID(thr) do { \\\n\t\tDUK_ASSERT((thr) != NULL); \\\n\t\tDUK_ASSERT_HTHREAD_VALID((thr)); \\\n\t\tDUK_ASSERT((thr)->valstack != NULL); \\\n\t\tDUK_ASSERT((thr)->valstack_bottom != NULL); \\\n\t\tDUK_ASSERT((thr)->valstack_top != NULL); \\\n\t\tDUK_ASSERT((thr)->valstack_end != NULL); \\\n\t\tDUK_ASSERT((thr)->valstack_alloc_end != NULL); \\\n\t\tDUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack); \\\n\t\tDUK_ASSERT((thr)->valstack_end >= (thr)->valstack); \\\n\t\tDUK_ASSERT((thr)->valstack_top >= (thr)->valstack); \\\n\t\tDUK_ASSERT((thr)->valstack_top >= (thr)->valstack_bottom); \\\n\t\tDUK_ASSERT((thr)->valstack_end >= (thr)->valstack_top); \\\n\t\tDUK_ASSERT((thr)->valstack_alloc_end >= (thr)->valstack_end); \\\n\t} while (0)\n\n/* Assertions for API call entry specifically.  Checks 'ctx' but also may\n * check internal state (e.g. not in a debugger transport callback).\n */\n#define DUK_ASSERT_API_ENTRY(thr) do { \\\n\t\tDUK_ASSERT_CTX_VALID((thr)); \\\n\t\tDUK_ASSERT((thr)->heap != NULL); \\\n\t\tDUK_ASSERT((thr)->heap->dbg_calling_transport == 0); \\\n\t} while (0)\n\n/*\n *  Assertion helpers.\n */\n\n#define DUK_ASSERT_STRIDX_VALID(val) \\\n\tDUK_ASSERT((duk_uint_t) (val) < DUK_HEAP_NUM_STRINGS)\n\n#define DUK_ASSERT_BIDX_VALID(val) \\\n\tDUK_ASSERT((duk_uint_t) (val) < DUK_NUM_BUILTINS)\n\n/*\n *  Misc\n */\n\n/* Fast access to 'this' binding.  Assumes there's a call in progress. */\n#define DUK_HTHREAD_THIS_PTR(thr) \\\n\t(DUK_ASSERT_EXPR((thr) != NULL), \\\n\t DUK_ASSERT_EXPR((thr)->valstack_bottom > (thr)->valstack), \\\n\t (thr)->valstack_bottom - 1)\n\n/*\n *  Struct defines\n */\n\n/* Fields are ordered for alignment/packing. */\nstruct duk_activation {\n\tduk_tval tv_func;       /* borrowed: full duk_tval for function being executed; for lightfuncs */\n\tduk_hobject *func;      /* borrowed: function being executed; for bound function calls, this is the final, real function, NULL for lightfuncs */\n\tduk_activation *parent; /* previous (parent) activation (or NULL if none) */\n\tduk_hobject *var_env;   /* current variable environment (may be NULL if delayed) */\n\tduk_hobject *lex_env;   /* current lexical environment (may be NULL if delayed) */\n\tduk_catcher *cat;       /* current catcher (or NULL) */\n\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\t/* Previous value of 'func' caller, restored when unwound.  Only in use\n\t * when 'func' is non-strict.\n\t */\n\tduk_hobject *prev_caller;\n#endif\n\n\tduk_instr_t *curr_pc;   /* next instruction to execute (points to 'func' bytecode, stable pointer), NULL for native calls */\n\n\t/* bottom_byteoff and retval_byteoff are only used for book-keeping\n\t * of Ecmascript-initiated calls, to allow returning to an Ecmascript\n\t * function properly.\n\t */\n\n\t/* Bottom of valstack for this activation, used to reset\n\t * valstack_bottom on return; offset is absolute.  There's\n\t * no need to track 'top' because native call handling deals\n\t * with that using locals, and for Ecmascript returns 'nregs'\n\t * indicates the necessary top.\n\t */\n\tduk_size_t bottom_byteoff;\n\n\t/* Return value when returning to this activation (points to caller\n\t * reg, not callee reg); offset is absolute (only set if activation is\n\t * not topmost).\n\t *\n\t * Note: bottom_byteoff is always set, while retval_byteoff is only\n\t * applicable for activations below the topmost one.  Currently\n\t * retval_byteoff for the topmost activation is considered garbage\n\t * (and it not initialized on entry or cleared on return; may contain\n\t * previous or garbage values).\n\t */\n\tduk_size_t retval_byteoff;\n\n\t/* Current 'this' binding is the value just below bottom.\n\t * Previously, 'this' binding was handled with an index to the\n\t * (calling) valstack.  This works for everything except tail\n\t * calls, which must not \"accumulate\" valstack temps.\n\t */\n\n\t/* Value stack reserve (valstack_end) byte offset to be restored\n\t * when returning to this activation.  Only used by the bytecode\n\t * executor.\n\t */\n\tduk_size_t reserve_byteoff;\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tduk_uint32_t prev_line; /* needed for stepping */\n#endif\n\n\tduk_small_uint_t flags;\n};\n\nstruct duk_catcher {\n\tduk_catcher *parent;            /* previous (parent) catcher (or NULL if none) */\n\tduk_hstring *h_varname;         /* borrowed reference to catch variable name (or NULL if none) */\n\t                                /* (reference is valid as long activation exists) */\n\tduk_instr_t *pc_base;           /* resume execution from pc_base or pc_base+1 (points to 'func' bytecode, stable pointer) */\n\tduk_size_t idx_base;            /* idx_base and idx_base+1 get completion value and type */\n\tduk_uint32_t flags;             /* type and control flags, label number */\n\t/* XXX: could pack 'flags' and 'idx_base' to same value in practice,\n\t * on 32-bit targets this would make duk_catcher 16 bytes.\n\t */\n};\n\nstruct duk_hthread {\n\t/* Shared object part */\n\tduk_hobject obj;\n\n\t/* Pointer to bytecode executor's 'curr_pc' variable.  Used to copy\n\t * the current PC back into the topmost activation when activation\n\t * state is about to change (or \"syncing\" is otherwise needed).  This\n\t * is rather awkward but important for performance, see execution.rst.\n\t */\n\tduk_instr_t **ptr_curr_pc;\n\n\t/* Backpointers. */\n\tduk_heap *heap;\n\n\t/* Current strictness flag: affects API calls. */\n\tduk_uint8_t strict;\n\n\t/* Thread state. */\n\tduk_uint8_t state;\n\tduk_uint8_t unused1;\n\tduk_uint8_t unused2;\n\n\t/* XXX: Valstack and callstack are currently assumed to have non-NULL\n\t * pointers.  Relaxing this would not lead to big benefits (except\n\t * perhaps for terminated threads).\n\t */\n\n\t/* Value stack: these are expressed as pointers for faster stack\n\t * manipulation.  [valstack,valstack_top[ is GC-reachable,\n\t * [valstack_top,valstack_alloc_end[ is not GC-reachable but kept\n\t * initialized as 'undefined'.  [valstack,valstack_end[ is the\n\t * guaranteed/reserved space and the valstack cannot be resized to\n\t * a smaller size.  [valstack_end,valstack_alloc_end[ is currently\n\t * allocated slack that can be used to grow the current guaranteed\n\t * space but may be shrunk away without notice.\n\t *\n\t *\n\t * <----------------------- guaranteed --->\n\t *                                        <---- slack --->\n\t *               <--- frame --->\n\t * .-------------+=============+----------+--------------.\n\t * |xxxxxxxxxxxxx|yyyyyyyyyyyyy|uuuuuuuuuu|uuuuuuuuuuuuuu|\n\t * `-------------+=============+----------+--------------'\n\t *\n\t * ^             ^             ^          ^              ^\n\t * |             |             |          |              |\n\t * valstack      bottom        top        end            alloc_end\n\t *\n\t *     xxx = arbitrary values, below current frame\n\t *     yyy = arbitrary values, inside current frame\n\t *     uuu = outside active value stack, initialized to 'undefined'\n\t */\n\tduk_tval *valstack;                     /* start of valstack allocation */\n\tduk_tval *valstack_end;                 /* end of valstack reservation/guarantee (exclusive) */\n\tduk_tval *valstack_alloc_end;           /* end of valstack allocation */\n\tduk_tval *valstack_bottom;              /* bottom of current frame */\n\tduk_tval *valstack_top;                 /* top of current frame (exclusive) */\n\n\t/* Call stack, represented as a linked list starting from the current\n\t * activation (or NULL if nothing is active).\n\t */\n\tduk_activation *callstack_curr;         /* current activation (or NULL if none) */\n\tduk_size_t callstack_top;               /* number of activation records in callstack (0 if none) */\n\tduk_size_t callstack_preventcount;      /* number of activation records in callstack preventing a yield */\n\n\t/* Yield/resume book-keeping. */\n\tduk_hthread *resumer;                   /* who resumed us (if any) */\n\n\t/* Current compiler state (if any), used for augmenting SyntaxErrors. */\n\tduk_compiler_ctx *compile_ctx;\n\n#if defined(DUK_USE_INTERRUPT_COUNTER)\n\t/* Interrupt counter for triggering a slow path check for execution\n\t * timeout, debugger interaction such as breakpoints, etc.  The value\n\t * is valid for the current running thread, and both the init and\n\t * counter values are copied whenever a thread switch occurs.  It's\n\t * important for the counter to be conveniently accessible for the\n\t * bytecode executor inner loop for performance reasons.\n\t */\n\tduk_int_t interrupt_counter;    /* countdown state */\n\tduk_int_t interrupt_init;       /* start value for current countdown */\n#endif\n\n\t/* Builtin-objects; may or may not be shared with other threads,\n\t * threads existing in different \"compartments\" will have different\n\t * built-ins.  Must be stored on a per-thread basis because there\n\t * is no intermediate structure for a thread group / compartment.\n\t * This takes quite a lot of space, currently 43x4 = 172 bytes on\n\t * 32-bit platforms.\n\t *\n\t * In some cases the builtins array could be ROM based, but it's\n\t * sometimes edited (e.g. for sandboxing) so it's better to keep\n\t * this array in RAM.\n\t */\n\tduk_hobject *builtins[DUK_NUM_BUILTINS];\n\n\t/* Convenience copies from heap/vm for faster access. */\n#if defined(DUK_USE_ROM_STRINGS)\n\t/* No field needed when strings are in ROM. */\n#else\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t *strs16;\n#else\n\tduk_hstring **strs;\n#endif\n#endif\n};\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to);\nDUK_INTERNAL_DECL void duk_hthread_create_builtin_objects(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_hthread_terminate(duk_hthread *thr);\n\nDUK_INTERNAL_DECL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act);\nDUK_INTERNAL_DECL void duk_hthread_activation_unwind_norz(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level);\n\nDUK_INTERNAL_DECL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat);\nDUK_INTERNAL_DECL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act);\nDUK_INTERNAL_DECL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act);\n\n#if defined(DUK_USE_FINALIZER_TORTURE)\nDUK_INTERNAL_DECL void duk_hthread_valstack_torture_realloc(duk_hthread *thr);\n#endif\n\nDUK_INTERNAL_DECL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud);  /* indirect allocs */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act);\n#endif\nDUK_INTERNAL_DECL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act);\nDUK_INTERNAL_DECL void duk_hthread_sync_currpc(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_hthread_sync_and_null_currpc(duk_hthread *thr);\n\n#endif  /* DUK_HTHREAD_H_INCLUDED */\n/* #include duk_harray.h */\n#line 1 \"duk_harray.h\"\n/*\n *  Array object representation, used for actual Array instances.\n *\n *  All objects with the exotic array behavior (which must coincide with having\n *  internal class array) MUST be duk_harrays.  No other object can be a\n *  duk_harray.  However, duk_harrays may not always have an array part.\n */\n\n#if !defined(DUK_HARRAY_H_INCLUDED)\n#define DUK_HARRAY_H_INCLUDED\n\n#define DUK_ASSERT_HARRAY_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) (h))); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY((duk_hobject *) (h))); \\\n\t} while (0)\n\n#define DUK_HARRAY_LENGTH_WRITABLE(h)         (!(h)->length_nonwritable)\n#define DUK_HARRAY_LENGTH_NONWRITABLE(h)      ((h)->length_nonwritable)\n#define DUK_HARRAY_SET_LENGTH_WRITABLE(h)     do { (h)->length_nonwritable = 0; } while (0)\n#define DUK_HARRAY_SET_LENGTH_NONWRITABLE(h)  do { (h)->length_nonwritable = 1; } while (0)\n\nstruct duk_harray {\n\t/* Shared object part. */\n\tduk_hobject obj;\n\n\t/* Array .length.\n\t *\n\t * At present Array .length may be smaller, equal, or even larger\n\t * than the allocated underlying array part.  Fast path code must\n\t * always take this into account carefully.\n\t */\n\tduk_uint32_t length;\n\n\t/* Array .length property attributes.  The property is always\n\t * non-enumerable and non-configurable.  It's initially writable\n\t * but per Object.defineProperty() rules it can be made non-writable\n\t * even if it is non-configurable.  Thus we need to track the\n\t * writability explicitly.\n\t *\n\t * XXX: this field to be eliminated and moved into duk_hobject\n\t * flags field to save space.\n\t */\n\tduk_bool_t length_nonwritable;\n};\n\n#endif  /* DUK_HARRAY_H_INCLUDED */\n/* #include duk_henv.h */\n#line 1 \"duk_henv.h\"\n/*\n *  Environment object representation.\n */\n\n#if !defined(DUK_HENV_H_INCLUDED)\n#define DUK_HENV_H_INCLUDED\n\n#define DUK_ASSERT_HDECENV_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) (h))); \\\n\t\tDUK_ASSERT((h)->thread == NULL || (h)->varmap != NULL); \\\n\t} while (0)\n\n#define DUK_ASSERT_HOBJENV_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_OBJENV((duk_hobject *) (h))); \\\n\t\tDUK_ASSERT((h)->target != NULL); \\\n\t\tDUK_ASSERT((h)->has_this == 0 || (h)->has_this == 1); \\\n\t} while (0)\n\nstruct duk_hdecenv {\n\t/* Shared object part. */\n\tduk_hobject obj;\n\n\t/* These control variables provide enough information to access live\n\t * variables for a closure that is still open.  If thread == NULL,\n\t * the record is closed and the identifiers are in the property table.\n\t */\n\tduk_hthread *thread;\n\tduk_hobject *varmap;\n\tduk_size_t regbase_byteoff;\n};\n\nstruct duk_hobjenv {\n\t/* Shared object part. */\n\tduk_hobject obj;\n\n\t/* Target object and 'this' binding for object binding. */\n\tduk_hobject *target;\n\n\t/* The 'target' object is used as a this binding in only some object\n\t * environments.  For example, the global environment does not provide\n\t * a this binding, but a with statement does.\n\t */\n\tduk_bool_t has_this;\n};\n\n#endif  /* DUK_HENV_H_INCLUDED */\n/* #include duk_hbuffer.h */\n#line 1 \"duk_hbuffer.h\"\n/*\n *  Heap buffer representation.\n *\n *  Heap allocated user data buffer which is either:\n *\n *    1. A fixed size buffer (data follows header statically)\n *    2. A dynamic size buffer (data pointer follows header)\n *\n *  The data pointer for a variable size buffer of zero size may be NULL.\n */\n\n#if !defined(DUK_HBUFFER_H_INCLUDED)\n#define DUK_HBUFFER_H_INCLUDED\n\n/*\n *  Flags\n *\n *  Fixed buffer:     0\n *  Dynamic buffer:   DUK_HBUFFER_FLAG_DYNAMIC\n *  External buffer:  DUK_HBUFFER_FLAG_DYNAMIC | DUK_HBUFFER_FLAG_EXTERNAL\n */\n\n#define DUK_HBUFFER_FLAG_DYNAMIC                  DUK_HEAPHDR_USER_FLAG(0)    /* buffer is behind a pointer, dynamic or external */\n#define DUK_HBUFFER_FLAG_EXTERNAL                 DUK_HEAPHDR_USER_FLAG(1)    /* buffer pointer is to an externally allocated buffer */\n\n#define DUK_HBUFFER_HAS_DYNAMIC(x)                DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC)\n#define DUK_HBUFFER_HAS_EXTERNAL(x)               DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL)\n\n#define DUK_HBUFFER_SET_DYNAMIC(x)                DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC)\n#define DUK_HBUFFER_SET_EXTERNAL(x)               DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL)\n\n#define DUK_HBUFFER_CLEAR_DYNAMIC(x)              DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_DYNAMIC)\n#define DUK_HBUFFER_CLEAR_EXTERNAL(x)             DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HBUFFER_FLAG_EXTERNAL)\n\n/*\n *  Misc defines\n */\n\n/* Impose a maximum buffer length for now.  Restricted artificially to\n * ensure resize computations or adding a heap header length won't\n * overflow size_t and that a signed duk_int_t can hold a buffer\n * length.  The limit should be synchronized with DUK_HSTRING_MAX_BYTELEN.\n */\n\n#if defined(DUK_USE_BUFLEN16)\n#define DUK_HBUFFER_MAX_BYTELEN                   (0x0000ffffUL)\n#else\n/* Intentionally not 0x7fffffffUL; at least JSON code expects that\n * 2*len + 2 fits in 32 bits.\n */\n#define DUK_HBUFFER_MAX_BYTELEN                   (0x7ffffffeUL)\n#endif\n\n/*\n *  Field access\n */\n\n#if defined(DUK_USE_BUFLEN16)\n/* size stored in duk_heaphdr unused flag bits */\n#define DUK_HBUFFER_GET_SIZE(x)     ((x)->hdr.h_flags >> 16)\n#define DUK_HBUFFER_SET_SIZE(x,v)   do { \\\n\t\tduk_size_t duk__v; \\\n\t\tduk__v = (v); \\\n\t\tDUK_ASSERT(duk__v <= 0xffffUL); \\\n\t\t(x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | (((duk_uint32_t) duk__v) << 16); \\\n\t} while (0)\n#define DUK_HBUFFER_ADD_SIZE(x,dv)  do { \\\n\t\t(x)->hdr.h_flags += ((dv) << 16); \\\n\t} while (0)\n#define DUK_HBUFFER_SUB_SIZE(x,dv)  do { \\\n\t\t(x)->hdr.h_flags -= ((dv) << 16); \\\n\t} while (0)\n#else\n#define DUK_HBUFFER_GET_SIZE(x)     (((duk_hbuffer *) (x))->size)\n#define DUK_HBUFFER_SET_SIZE(x,v)   do { \\\n\t\t((duk_hbuffer *) (x))->size = (v); \\\n\t} while (0)\n#define DUK_HBUFFER_ADD_SIZE(x,dv)  do { \\\n\t\t(x)->size += (dv); \\\n\t} while (0)\n#define DUK_HBUFFER_SUB_SIZE(x,dv)  do { \\\n\t\t(x)->size -= (dv); \\\n\t} while (0)\n#endif\n\n#define DUK_HBUFFER_FIXED_GET_SIZE(x)       DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x))\n#define DUK_HBUFFER_FIXED_SET_SIZE(x,v)     DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x))\n\n#define DUK_HBUFFER_DYNAMIC_GET_SIZE(x)     DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x))\n#define DUK_HBUFFER_DYNAMIC_SET_SIZE(x,v)   DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v))\n#define DUK_HBUFFER_DYNAMIC_ADD_SIZE(x,dv)  DUK_HBUFFER_ADD_SIZE((duk_hbuffer *) (x), (dv))\n#define DUK_HBUFFER_DYNAMIC_SUB_SIZE(x,dv)  DUK_HBUFFER_SUB_SIZE((duk_hbuffer *) (x), (dv))\n\n#define DUK_HBUFFER_EXTERNAL_GET_SIZE(x)    DUK_HBUFFER_GET_SIZE((duk_hbuffer *) (x))\n#define DUK_HBUFFER_EXTERNAL_SET_SIZE(x,v)  DUK_HBUFFER_SET_SIZE((duk_hbuffer *) (x), (v))\n\n#define DUK_HBUFFER_FIXED_GET_DATA_PTR(heap,x)    ((duk_uint8_t *) (((duk_hbuffer_fixed *) (x)) + 1))\n\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x) \\\n\t((void *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, ((duk_heaphdr *) (x))->h_extra16))\n#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v)     do { \\\n\t\t((duk_heaphdr *) (x))->h_extra16 = DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (void *) (v)); \\\n\t} while (0)\n#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x)  do { \\\n\t\t((duk_heaphdr *) (x))->h_extra16 = 0;  /* assume 0 <=> NULL */ \\\n\t} while (0)\n#else\n#define DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap,x)       ((x)->curr_alloc)\n#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap,x,v)     do { \\\n\t\t(x)->curr_alloc = (void *) (v); \\\n\t} while (0)\n#define DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(heap,x)  do { \\\n\t\t(x)->curr_alloc = (void *) NULL; \\\n\t} while (0)\n#endif\n\n/* No pointer compression because pointer is potentially outside of\n * Duktape heap.\n */\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \\\n\t((void *) (x)->curr_alloc)\n#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v)     do { \\\n\t\t(x)->curr_alloc = (void *) (v); \\\n\t} while (0)\n#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x)  do { \\\n\t\t(x)->curr_alloc = (void *) NULL; \\\n\t} while (0)\n#else\n#define DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap,x) \\\n\t((void *) (x)->curr_alloc)\n#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap,x,v)     do { \\\n\t\t(x)->curr_alloc = (void *) (v); \\\n\t} while (0)\n#define DUK_HBUFFER_EXTERNAL_SET_DATA_PTR_NULL(heap,x)  do { \\\n\t\t(x)->curr_alloc = (void *) NULL; \\\n\t} while (0)\n#endif\n\n/* Get a pointer to the current buffer contents (matching current allocation\n * size).  May be NULL for zero size dynamic/external buffer.\n */\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HBUFFER_GET_DATA_PTR(heap,x)  ( \\\n\tDUK_HBUFFER_HAS_DYNAMIC((x)) ? \\\n\t\t( \\\n\t\t\tDUK_HBUFFER_HAS_EXTERNAL((x)) ? \\\n\t\t\t\tDUK_HBUFFER_EXTERNAL_GET_DATA_PTR((heap), (duk_hbuffer_external *) (x)) : \\\n\t\t\t\tDUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) \\\n\t\t) : \\\n\t\tDUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \\\n\t)\n#else\n/* Without heap pointer compression duk_hbuffer_dynamic and duk_hbuffer_external\n * have the same layout so checking for fixed vs. dynamic (or external) is enough.\n */\n#define DUK_HBUFFER_GET_DATA_PTR(heap,x)  ( \\\n\tDUK_HBUFFER_HAS_DYNAMIC((x)) ? \\\n\t\tDUK_HBUFFER_DYNAMIC_GET_DATA_PTR((heap), (duk_hbuffer_dynamic *) (x)) : \\\n\t\tDUK_HBUFFER_FIXED_GET_DATA_PTR((heap), (duk_hbuffer_fixed *) (x)) \\\n\t)\n#endif\n\n/*\n *  Structs\n */\n\n/* Shared prefix for all buffer types. */\nstruct duk_hbuffer {\n\tduk_heaphdr hdr;\n\n\t/* It's not strictly necessary to track the current size, but\n\t * it is useful for writing robust native code.\n\t */\n\n\t/* Current size. */\n#if defined(DUK_USE_BUFLEN16)\n\t/* Stored in duk_heaphdr unused flags. */\n#else\n\tduk_size_t size;\n#endif\n\n\t/*\n\t *  Data following the header depends on the DUK_HBUFFER_FLAG_DYNAMIC\n\t *  flag.\n\t *\n\t *  If the flag is clear (the buffer is a fixed size one), the buffer\n\t *  data follows the header directly, consisting of 'size' bytes.\n\t *\n\t *  If the flag is set, the actual buffer is allocated separately, and\n\t *  a few control fields follow the header.  Specifically:\n\t *\n\t *    - a \"void *\" pointing to the current allocation\n\t *    - a duk_size_t indicating the full allocated size (always >= 'size')\n\t *\n\t *  If DUK_HBUFFER_FLAG_EXTERNAL is set, the buffer has been allocated\n\t *  by user code, so that Duktape won't be able to resize it and won't\n\t *  free it.  This allows buffers to point to e.g. an externally\n\t *  allocated structure such as a frame buffer.\n\t *\n\t *  Unlike strings, no terminator byte (NUL) is guaranteed after the\n\t *  data.  This would be convenient, but would pad aligned user buffers\n\t *  unnecessarily upwards in size.  For instance, if user code requested\n\t *  a 64-byte dynamic buffer, 65 bytes would actually be allocated which\n\t *  would then potentially round upwards to perhaps 68 or 72 bytes.\n\t */\n};\n\n/* Fixed buffer; data follows struct, with proper alignment guaranteed by\n * struct size.\n */\n#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA)\n#pragma pack(push, 8)\n#endif\nstruct duk_hbuffer_fixed {\n\t/* A union is used here as a portable struct size / alignment trick:\n\t * by adding a 32-bit or a 64-bit (unused) union member, the size of\n\t * the struct is effectively forced to be a multiple of 4 or 8 bytes\n\t * (respectively) without increasing the size of the struct unless\n\t * necessary.\n\t */\n\tunion {\n\t\tstruct {\n\t\t\tduk_heaphdr hdr;\n#if defined(DUK_USE_BUFLEN16)\n\t\t\t/* Stored in duk_heaphdr unused flags. */\n#else\n\t\t\tduk_size_t size;\n#endif\n\t\t} s;\n#if (DUK_USE_ALIGN_BY == 4)\n\t\tduk_uint32_t dummy_for_align4;\n#elif (DUK_USE_ALIGN_BY == 8)\n\t\tduk_double_t dummy_for_align8;\n#elif (DUK_USE_ALIGN_BY == 1)\n\t\t/* no extra padding */\n#else\n#error invalid DUK_USE_ALIGN_BY\n#endif\n\t} u;\n\n\t/*\n\t *  Data follows the struct header.  The struct size is padded by the\n\t *  compiler based on the struct members.  This guarantees that the\n\t *  buffer data will be aligned-by-4 but not necessarily aligned-by-8.\n\t *\n\t *  On platforms where alignment does not matter, the struct padding\n\t *  could be removed (if there is any).  On platforms where alignment\n\t *  by 8 is required, the struct size must be forced to be a multiple\n\t *  of 8 by some means.  Without it, some user code may break, and also\n\t *  Duktape itself breaks (e.g. the compiler stores duk_tvals in a\n\t *  dynamic buffer).\n\t */\n}\n#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_GCC_ATTR)\n__attribute__ ((aligned (8)))\n#elif (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_CLANG_ATTR)\n__attribute__ ((aligned (8)))\n#endif\n;\n#if (DUK_USE_ALIGN_BY == 8) && defined(DUK_USE_PACK_MSVC_PRAGMA)\n#pragma pack(pop)\n#endif\n\n/* Dynamic buffer with 'curr_alloc' pointing to a dynamic area allocated using\n * heap allocation primitives.  Also used for external buffers when low memory\n * options are not used.\n */\nstruct duk_hbuffer_dynamic {\n\tduk_heaphdr hdr;\n\n#if defined(DUK_USE_BUFLEN16)\n\t/* Stored in duk_heaphdr unused flags. */\n#else\n\tduk_size_t size;\n#endif\n\n#if defined(DUK_USE_HEAPPTR16)\n\t/* Stored in duk_heaphdr h_extra16. */\n#else\n\tvoid *curr_alloc;  /* may be NULL if alloc_size == 0 */\n#endif\n\n\t/*\n\t *  Allocation size for 'curr_alloc' is alloc_size.  There is no\n\t *  automatic NUL terminator for buffers (see above for rationale).\n\t *\n\t *  'curr_alloc' is explicitly allocated with heap allocation\n\t *  primitives and will thus always have alignment suitable for\n\t *  e.g. duk_tval and an IEEE double.\n\t */\n};\n\n/* External buffer with 'curr_alloc' managed by user code and pointing to an\n * arbitrary address.  When heap pointer compression is not used, this struct\n * has the same layout as duk_hbuffer_dynamic.\n */\nstruct duk_hbuffer_external {\n\tduk_heaphdr hdr;\n\n#if defined(DUK_USE_BUFLEN16)\n\t/* Stored in duk_heaphdr unused flags. */\n#else\n\tduk_size_t size;\n#endif\n\n\t/* Cannot be compressed as a heap pointer because may point to\n\t * an arbitrary address.\n\t */\n\tvoid *curr_alloc;  /* may be NULL if alloc_size == 0 */\n};\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata);\nDUK_INTERNAL_DECL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud);  /* indirect allocs */\n\n/* dynamic buffer ops */\nDUK_INTERNAL_DECL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size);\nDUK_INTERNAL_DECL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf);\n\n#endif  /* DUK_HBUFFER_H_INCLUDED */\n/* #include duk_hproxy.h */\n#line 1 \"duk_hproxy.h\"\n/*\n *  Proxy object representation.\n */\n\n#if !defined(DUK_HPROXY_H_INCLUDED)\n#define DUK_HPROXY_H_INCLUDED\n\n#define DUK_ASSERT_HPROXY_VALID(h) do { \\\n\t\tDUK_ASSERT((h) != NULL); \\\n\t\tDUK_ASSERT((h)->target != NULL); \\\n\t\tDUK_ASSERT((h)->handler != NULL); \\\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ((duk_hobject *) (h))); \\\n\t} while (0)\n\nstruct duk_hproxy {\n\t/* Shared object part. */\n\tduk_hobject obj;\n\n\t/* Proxy target object. */\n\tduk_hobject *target;\n\n\t/* Proxy handlers (traps). */\n\tduk_hobject *handler;\n};\n\n#endif  /* DUK_HPROXY_H_INCLUDED */\n/* #include duk_heap.h */\n#line 1 \"duk_heap.h\"\n/*\n *  Heap structure.\n *\n *  Heap contains allocated heap objects, interned strings, and built-in\n *  strings for one or more threads.\n */\n\n#if !defined(DUK_HEAP_H_INCLUDED)\n#define DUK_HEAP_H_INCLUDED\n\n/* alloc function typedefs in duktape.h */\n\n/*\n *  Heap flags\n */\n\n#define DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED            (1U << 0)  /* mark-and-sweep marking reached a recursion limit and must use multi-pass marking */\n#define DUK_HEAP_FLAG_INTERRUPT_RUNNING                        (1U << 1)  /* executor interrupt running (used to avoid nested interrupts) */\n#define DUK_HEAP_FLAG_FINALIZER_NORESCUE                       (1U << 2)  /* heap destruction ongoing, finalizer rescue no longer possible */\n#define DUK_HEAP_FLAG_DEBUGGER_PAUSED                          (1U << 3)  /* debugger is paused: talk with debug client until step/resume */\n\n#define DUK__HEAP_HAS_FLAGS(heap,bits)               ((heap)->flags & (bits))\n#define DUK__HEAP_SET_FLAGS(heap,bits)  do { \\\n\t\t(heap)->flags |= (bits); \\\n\t} while (0)\n#define DUK__HEAP_CLEAR_FLAGS(heap,bits)  do { \\\n\t\t(heap)->flags &= ~(bits); \\\n\t} while (0)\n\n#define DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)   DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)\n#define DUK_HEAP_HAS_INTERRUPT_RUNNING(heap)               DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)\n#define DUK_HEAP_HAS_FINALIZER_NORESCUE(heap)              DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)\n#define DUK_HEAP_HAS_DEBUGGER_PAUSED(heap)                 DUK__HEAP_HAS_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED)\n\n#define DUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap)   DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)\n#define DUK_HEAP_SET_INTERRUPT_RUNNING(heap)               DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)\n#define DUK_HEAP_SET_FINALIZER_NORESCUE(heap)              DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)\n#define DUK_HEAP_SET_DEBUGGER_PAUSED(heap)                 DUK__HEAP_SET_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED)\n\n#define DUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap) DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_MARKANDSWEEP_RECLIMIT_REACHED)\n#define DUK_HEAP_CLEAR_INTERRUPT_RUNNING(heap)             DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_INTERRUPT_RUNNING)\n#define DUK_HEAP_CLEAR_FINALIZER_NORESCUE(heap)            DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_FINALIZER_NORESCUE)\n#define DUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap)               DUK__HEAP_CLEAR_FLAGS((heap), DUK_HEAP_FLAG_DEBUGGER_PAUSED)\n\n/*\n *  Longjmp types, also double as identifying continuation type for a rethrow (in 'finally')\n */\n\n#define DUK_LJ_TYPE_UNKNOWN      0    /* unused */\n#define DUK_LJ_TYPE_THROW        1    /* value1 -> error object */\n#define DUK_LJ_TYPE_YIELD        2    /* value1 -> yield value, iserror -> error / normal */\n#define DUK_LJ_TYPE_RESUME       3    /* value1 -> resume value, value2 -> resumee thread, iserror -> error/normal */\n#define DUK_LJ_TYPE_BREAK        4    /* value1 -> label number, pseudo-type to indicate a break continuation (for ENDFIN) */\n#define DUK_LJ_TYPE_CONTINUE     5    /* value1 -> label number, pseudo-type to indicate a continue continuation (for ENDFIN) */\n#define DUK_LJ_TYPE_RETURN       6    /* value1 -> return value, pseudo-type to indicate a return continuation (for ENDFIN) */\n#define DUK_LJ_TYPE_NORMAL       7    /* no value, pseudo-type to indicate a normal continuation (for ENDFIN) */\n\n/*\n *  Mark-and-sweep flags\n *\n *  These are separate from heap level flags now but could be merged.\n *  The heap structure only contains a 'base mark-and-sweep flags'\n *  field and the GC caller can impose further flags.\n */\n\n/* Emergency mark-and-sweep: try extra hard, even at the cost of\n * performance.\n */\n#define DUK_MS_FLAG_EMERGENCY                (1U << 0)\n\n/* Voluntary mark-and-sweep: triggered periodically. */\n#define DUK_MS_FLAG_VOLUNTARY                (1U << 1)\n\n/* Postpone rescue decisions for reachable objects with FINALIZED set.\n * Used during finalize_list processing to avoid incorrect rescue\n * decisions due to finalize_list being a reachability root.\n */\n#define DUK_MS_FLAG_POSTPONE_RESCUE          (1U << 2)\n\n/* Don't compact objects; needed during object property table resize\n * to prevent a recursive resize.  It would suffice to protect only the\n * current object being resized, but this is not yet implemented.\n */\n#define DUK_MS_FLAG_NO_OBJECT_COMPACTION     (1U << 3)\n\n/*\n *  Thread switching\n *\n *  To switch heap->curr_thread, use the macro below so that interrupt counters\n *  get updated correctly.  The macro allows a NULL target thread because that\n *  happens e.g. in call handling.\n */\n\n#if defined(DUK_USE_INTERRUPT_COUNTER)\n#define DUK_HEAP_SWITCH_THREAD(heap,newthr)  duk_heap_switch_thread((heap), (newthr))\n#else\n#define DUK_HEAP_SWITCH_THREAD(heap,newthr)  do { \\\n\t\t(heap)->curr_thread = (newthr); \\\n\t} while (0)\n#endif\n\n/*\n *  Stats\n */\n\n#if defined(DUK_USE_DEBUG)\n#define DUK_STATS_INC(heap,fieldname) do { \\\n\t\t(heap)->fieldname += 1; \\\n\t} while (0)\n#else\n#define DUK_STATS_INC(heap,fieldname) do {} while (0)\n#endif\n\n/*\n *  Other heap related defines\n */\n\n/* Mark-and-sweep interval is relative to combined count of objects and\n * strings kept in the heap during the latest mark-and-sweep pass.\n * Fixed point .8 multiplier and .0 adder.  Trigger count (interval) is\n * decreased by each (re)allocation attempt (regardless of size), and each\n * refzero processed object.\n *\n * 'SKIP' indicates how many (re)allocations to wait until a retry if\n * GC is skipped because there is no thread do it with yet (happens\n * only during init phases).\n */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT              12800L  /* 50x heap size */\n#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD               1024L\n#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP              256L\n#else\n#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT              256L    /* 1x heap size */\n#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD               1024L\n#define DUK_HEAP_MARK_AND_SWEEP_TRIGGER_SKIP              256L\n#endif\n\n/* GC torture. */\n#if defined(DUK_USE_GC_TORTURE)\n#define DUK_GC_TORTURE(heap) do { duk_heap_mark_and_sweep((heap), 0); } while (0)\n#else\n#define DUK_GC_TORTURE(heap) do { } while (0)\n#endif\n\n/* Stringcache is used for speeding up char-offset-to-byte-offset\n * translations for non-ASCII strings.\n */\n#define DUK_HEAP_STRCACHE_SIZE                            4\n#define DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT                16  /* strings up to the this length are not cached */\n\n/* Some list management macros. */\n#define DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap,hdr)     duk_heap_insert_into_heap_allocated((heap), (hdr))\n#if defined(DUK_USE_REFERENCE_COUNTING)\n#define DUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap,hdr)     duk_heap_remove_from_heap_allocated((heap), (hdr))\n#endif\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n#define DUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap,hdr)      duk_heap_insert_into_finalize_list((heap), (hdr))\n#define DUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap,hdr)      duk_heap_remove_from_finalize_list((heap), (hdr))\n#endif\n\n/*\n *  Built-in strings\n */\n\n/* heap string indices are autogenerated in duk_strings.h */\n#if defined(DUK_USE_ROM_STRINGS)\n#define DUK_HEAP_GET_STRING(heap,idx) \\\n\t((duk_hstring *) DUK_LOSE_CONST(duk_rom_strings_stridx[(idx)]))\n#else  /* DUK_USE_ROM_STRINGS */\n#if defined(DUK_USE_HEAPPTR16)\n#define DUK_HEAP_GET_STRING(heap,idx) \\\n\t((duk_hstring *) DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (heap)->strs16[(idx)]))\n#else\n#define DUK_HEAP_GET_STRING(heap,idx) \\\n\t((heap)->strs[(idx)])\n#endif\n#endif  /* DUK_USE_ROM_STRINGS */\n\n/*\n *  Raw memory calls: relative to heap, but no GC interaction\n */\n\n#define DUK_ALLOC_RAW(heap,size) \\\n\t((heap)->alloc_func((heap)->heap_udata, (size)))\n\n#define DUK_REALLOC_RAW(heap,ptr,newsize) \\\n\t((heap)->realloc_func((heap)->heap_udata, (void *) (ptr), (newsize)))\n\n#define DUK_FREE_RAW(heap,ptr) \\\n\t((heap)->free_func((heap)->heap_udata, (void *) (ptr)))\n\n/*\n *  Memory calls: relative to heap, GC interaction, but no error throwing.\n *\n *  XXX: Currently a mark-and-sweep triggered by memory allocation will run\n *  using the heap->heap_thread.  This thread is also used for running\n *  mark-and-sweep finalization; this is not ideal because it breaks the\n *  isolation between multiple global environments.\n *\n *  Notes:\n *\n *    - DUK_FREE() is required to ignore NULL and any other possible return\n *      value of a zero-sized alloc/realloc (same as ANSI C free()).\n *\n *    - There is no DUK_REALLOC_ZEROED because we don't assume to know the\n *      old size.  Caller must zero the reallocated memory.\n *\n *    - DUK_REALLOC_INDIRECT() must be used when a mark-and-sweep triggered\n *      by an allocation failure might invalidate the original 'ptr', thus\n *      causing a realloc retry to use an invalid pointer.  Example: we're\n *      reallocating the value stack and a finalizer resizes the same value\n *      stack during mark-and-sweep.  The indirect variant requests for the\n *      current location of the pointer being reallocated using a callback\n *      right before every realloc attempt; this circuitous approach is used\n *      to avoid strict aliasing issues in a more straightforward indirect\n *      pointer (void **) approach.  Note: the pointer in the storage\n *      location is read but is NOT updated; the caller must do that.\n */\n\n/* callback for indirect reallocs, request for current pointer */\ntypedef void *(*duk_mem_getptr)(duk_heap *heap, void *ud);\n\n#define DUK_ALLOC(heap,size)                            duk_heap_mem_alloc((heap), (size))\n#define DUK_ALLOC_ZEROED(heap,size)                     duk_heap_mem_alloc_zeroed((heap), (size))\n#define DUK_REALLOC(heap,ptr,newsize)                   duk_heap_mem_realloc((heap), (ptr), (newsize))\n#define DUK_REALLOC_INDIRECT(heap,cb,ud,newsize)        duk_heap_mem_realloc_indirect((heap), (cb), (ud), (newsize))\n#define DUK_FREE(heap,ptr)                              duk_heap_mem_free((heap), (ptr))\n\n/*\n *  Checked allocation, relative to a thread\n *\n *  DUK_FREE_CHECKED() doesn't actually throw, but accepts a 'thr' argument\n *  for convenience.\n */\n\n#define DUK_ALLOC_CHECKED(thr,size)                     duk_heap_mem_alloc_checked((thr), (size))\n#define DUK_ALLOC_CHECKED_ZEROED(thr,size)              duk_heap_mem_alloc_checked_zeroed((thr), (size))\n#define DUK_FREE_CHECKED(thr,ptr)                       duk_heap_mem_free((thr)->heap, (ptr))\n\n/*\n *  Memory constants\n */\n\n#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT           10  /* Retry allocation after mark-and-sweep for this\n                                                              * many times.  A single mark-and-sweep round is\n                                                              * not guaranteed to free all unreferenced memory\n                                                              * because of finalization (in fact, ANY number of\n                                                              * rounds is strictly not enough).\n                                                              */\n\n#define DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT  3  /* Starting from this round, use emergency mode\n                                                              * for mark-and-sweep.\n                                                              */\n\n/*\n *  Debugger support\n */\n\n/* Maximum number of breakpoints.  Only breakpoints that are set are\n * consulted so increasing this has no performance impact.\n */\n#define DUK_HEAP_MAX_BREAKPOINTS          16\n\n/* Opcode interval for a Date-based status/peek rate limit check.  Only\n * relevant when debugger is attached.  Requesting a timestamp may be a\n * slow operation on some platforms so this shouldn't be too low.  On the\n * other hand a high value makes Duktape react to a pause request slowly.\n */\n#define DUK_HEAP_DBG_RATELIMIT_OPCODES    4000\n\n/* Milliseconds between status notify and transport peeks. */\n#define DUK_HEAP_DBG_RATELIMIT_MILLISECS  200\n\n/* Debugger pause flags. */\n#define DUK_PAUSE_FLAG_ONE_OPCODE        (1U << 0)   /* pause when a single opcode has been executed */\n#define DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE (1U << 1)   /* one opcode pause actually active; artifact of current implementation */\n#define DUK_PAUSE_FLAG_LINE_CHANGE       (1U << 2)   /* pause when current line number changes */\n#define DUK_PAUSE_FLAG_FUNC_ENTRY        (1U << 3)   /* pause when entering a function */\n#define DUK_PAUSE_FLAG_FUNC_EXIT         (1U << 4)   /* pause when exiting current function */\n#define DUK_PAUSE_FLAG_CAUGHT_ERROR      (1U << 5)   /* pause when about to throw an error that is caught */\n#define DUK_PAUSE_FLAG_UNCAUGHT_ERROR    (1U << 6)   /* pause when about to throw an error that won't be caught */\n\nstruct duk_breakpoint {\n\tduk_hstring *filename;\n\tduk_uint32_t line;\n};\n\n/*\n *  String cache should ideally be at duk_hthread level, but that would\n *  cause string finalization to slow down relative to the number of\n *  threads; string finalization must check the string cache for \"weak\"\n *  references to the string being finalized to avoid dead pointers.\n *\n *  Thus, string caches are now at the heap level now.\n */\n\nstruct duk_strcache {\n\tduk_hstring *h;\n\tduk_uint32_t bidx;\n\tduk_uint32_t cidx;\n};\n\n/*\n *  Longjmp state, contains the information needed to perform a longjmp.\n *  Longjmp related values are written to value1, value2, and iserror.\n */\n\nstruct duk_ljstate {\n\tduk_jmpbuf *jmpbuf_ptr;   /* current setjmp() catchpoint */\n\tduk_small_uint_t type;    /* longjmp type */\n\tduk_bool_t iserror;       /* isError flag for yield */\n\tduk_tval value1;          /* 1st related value (type specific) */\n\tduk_tval value2;          /* 2nd related value (type specific) */\n};\n\n#define DUK_ASSERT_LJSTATE_UNSET(heap) do { \\\n\t\tDUK_ASSERT(heap != NULL); \\\n\t\tDUK_ASSERT(heap->lj.type == DUK_LJ_TYPE_UNKNOWN); \\\n\t\tDUK_ASSERT(heap->lj.iserror == 0); \\\n\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value1)); \\\n\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&heap->lj.value2)); \\\n\t} while (0)\n#define DUK_ASSERT_LJSTATE_SET(heap) do { \\\n\t\tDUK_ASSERT(heap != NULL); \\\n\t\tDUK_ASSERT(heap->lj.type != DUK_LJ_TYPE_UNKNOWN); \\\n\t} while (0)\n\n/*\n *  Main heap structure\n */\n\nstruct duk_heap {\n\tduk_small_uint_t flags;\n\n\t/* Allocator functions. */\n\tduk_alloc_function alloc_func;\n\tduk_realloc_function realloc_func;\n\tduk_free_function free_func;\n\n\t/* Heap udata, used for allocator functions but also for other heap\n\t * level callbacks like fatal function, pointer compression, etc.\n\t */\n\tvoid *heap_udata;\n\n\t/* Fatal error handling, called e.g. when a longjmp() is needed but\n\t * lj.jmpbuf_ptr is NULL.  fatal_func must never return; it's not\n\t * declared as \"noreturn\" because doing that for typedefs is a bit\n\t * challenging portability-wise.\n\t */\n\tduk_fatal_function fatal_func;\n\n\t/* Main list of allocated heap objects.  Objects are either here,\n\t * in finalize_list waiting for processing, or in refzero_list\n\t * temporarily while a DECREF refzero cascade finishes.\n\t */\n\tduk_heaphdr *heap_allocated;\n\n\t/* Temporary work list for freeing a cascade of objects when a DECREF\n\t * (or DECREF_NORZ) encounters a zero refcount.  Using a work list\n\t * allows fixed C stack size when refcounts go to zero for a chain of\n\t * objects.  Outside of DECREF this is always a NULL because DECREF is\n\t * processed without side effects (only memory free calls).\n\t */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk_heaphdr *refzero_list;\n#endif\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\t/* Work list for objects to be finalized. */\n\tduk_heaphdr *finalize_list;\n#if defined(DUK_USE_ASSERTIONS)\n\t/* Object whose finalizer is executing right now (no nesting). */\n\tduk_heaphdr *currently_finalizing;\n#endif\n#endif\n\n\t/* Freelist for duk_activations and duk_catchers. */\n#if defined(DUK_USE_CACHE_ACTIVATION)\n\tduk_activation *activation_free;\n#endif\n#if defined(DUK_USE_CACHE_CATCHER)\n\tduk_catcher *catcher_free;\n#endif\n\n\t/* Voluntary mark-and-sweep trigger counter.  Intentionally signed\n\t * because we continue decreasing the value when voluntary GC cannot\n\t * run.\n\t */\n#if defined(DUK_USE_VOLUNTARY_GC)\n\tduk_int_t ms_trigger_counter;\n#endif\n\n\t/* Mark-and-sweep recursion control: too deep recursion causes\n\t * multi-pass processing to avoid growing C stack without bound.\n\t */\n\tduk_uint_t ms_recursion_depth;\n\n\t/* Mark-and-sweep flags automatically active (used for critical sections). */\n\tduk_small_uint_t ms_base_flags;\n\n\t/* Mark-and-sweep running flag.  Prevents re-entry, and also causes\n\t * refzero events to be ignored (= objects won't be queued to refzero_list).\n\t */\n\tduk_uint_t ms_running;\n\n\t/* Mark-and-sweep prevent count, stacking.  Used to avoid M&S side\n\t * effects (besides finalizers which are controlled separately) such\n\t * as compacting the string table or object property tables.  This\n\t * is also bumped when ms_running is set to prevent recursive re-entry.\n\t * Can also be bumped when mark-and-sweep is not running.\n\t */\n\tduk_uint_t ms_prevent_count;\n\n\t/* Finalizer processing prevent count, stacking.  Bumped when finalizers\n\t * are processed to prevent recursive finalizer processing (first call site\n\t * processing finalizers handles all finalizers until the list is empty).\n\t * Can also be bumped explicitly to prevent finalizer execution.\n\t */\n\tduk_uint_t pf_prevent_count;\n\n\t/* When processing finalize_list, don't actually run finalizers but\n\t * queue finalizable objects back to heap_allocated as is.  This is\n\t * used during heap destruction to deal with finalizers that keep\n\t * on creating more finalizable garbage.\n\t */\n\tduk_uint_t pf_skip_finalizers;\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* Set when we're in a critical path where an error throw would cause\n\t * e.g. sandboxing/protected call violations or state corruption.  This\n\t * is just used for asserts.\n\t */\n\tduk_bool_t error_not_allowed;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* Set when heap is still being initialized, helps with writing\n\t * some assertions.\n\t */\n\tduk_bool_t heap_initializing;\n#endif\n\n\t/* Marker for detecting internal \"double faults\", errors thrown when\n\t * we're trying to create an error object, see duk_error_throw.c.\n\t */\n\tduk_bool_t creating_error;\n\n\t/* Marker for indicating we're calling a user error augmentation\n\t * (errCreate/errThrow) function.  Errors created/thrown during\n\t * such a call are not augmented.\n\t */\n#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\tduk_bool_t augmenting_error;\n#endif\n\n\t/* Longjmp state. */\n\tduk_ljstate lj;\n\n\t/* Heap thread, used internally and for finalization. */\n\tduk_hthread *heap_thread;\n\n\t/* Current running thread. */\n\tduk_hthread *curr_thread;\n\n\t/* Heap level \"stash\" object (e.g., various reachability roots). */\n\tduk_hobject *heap_object;\n\n\t/* duk_handle_call / duk_handle_safe_call recursion depth limiting */\n\tduk_int_t call_recursion_depth;\n\tduk_int_t call_recursion_limit;\n\n\t/* Mix-in value for computing string hashes; should be reasonably unpredictable. */\n\tduk_uint32_t hash_seed;\n\n\t/* Random number state for duk_util_tinyrandom.c. */\n#if !defined(DUK_USE_GET_RANDOM_DOUBLE)\n#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS)\n\tduk_uint32_t rnd_state;  /* State for Shamir's three-op algorithm */\n#else\n\tduk_uint64_t rnd_state[2];  /* State for xoroshiro128+ */\n#endif\n#endif\n\n\t/* Counter for unique local symbol creation. */\n\t/* XXX: When 64-bit types are available, it would be more efficient to\n\t * use a duk_uint64_t at least for incrementing but maybe also for\n\t * string formatting in the Symbol constructor.\n\t */\n\tduk_uint32_t sym_counter[2];\n\n\t/* For manual debugging: instruction count based on executor and\n\t * interrupt counter book-keeping.  Inspect debug logs to see how\n\t * they match up.\n\t */\n#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)\n\tduk_int_t inst_count_exec;\n\tduk_int_t inst_count_interrupt;\n#endif\n\n\t/* Debugger state. */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t/* Callbacks and udata; dbg_read_cb != NULL is used to indicate attached state. */\n\tduk_debug_read_function dbg_read_cb;                /* required, NULL implies detached */\n\tduk_debug_write_function dbg_write_cb;              /* required */\n\tduk_debug_peek_function dbg_peek_cb;\n\tduk_debug_read_flush_function dbg_read_flush_cb;\n\tduk_debug_write_flush_function dbg_write_flush_cb;\n\tduk_debug_request_function dbg_request_cb;\n\tduk_debug_detached_function dbg_detached_cb;\n\tvoid *dbg_udata;\n\n\t/* The following are only relevant when debugger is attached. */\n\tduk_bool_t dbg_processing;              /* currently processing messages or breakpoints: don't enter message processing recursively (e.g. no breakpoints when processing debugger eval) */\n\tduk_bool_t dbg_state_dirty;             /* resend state next time executor is about to run */\n\tduk_bool_t dbg_force_restart;           /* force executor restart to recheck breakpoints; used to handle function returns (see GH-303) */\n\tduk_bool_t dbg_detaching;               /* debugger detaching; used to avoid calling detach handler recursively */\n\tduk_small_uint_t dbg_pause_flags;       /* flags for automatic pause behavior */\n\tduk_activation *dbg_pause_act;          /* activation related to pause behavior (pause on line change, function entry/exit) */\n\tduk_uint32_t dbg_pause_startline;       /* starting line number for line change related pause behavior */\n\tduk_breakpoint dbg_breakpoints[DUK_HEAP_MAX_BREAKPOINTS];  /* breakpoints: [0,breakpoint_count[ gc reachable */\n\tduk_small_uint_t dbg_breakpoint_count;\n\tduk_breakpoint *dbg_breakpoints_active[DUK_HEAP_MAX_BREAKPOINTS + 1];  /* currently active breakpoints: NULL term, borrowed pointers */\n\t/* XXX: make active breakpoints actual copies instead of pointers? */\n\n\t/* These are for rate limiting Status notifications and transport peeking. */\n\tduk_uint_t dbg_exec_counter;            /* cumulative opcode execution count (overflows are OK) */\n\tduk_uint_t dbg_last_counter;            /* value of dbg_exec_counter when we last did a Date-based check */\n\tduk_double_t dbg_last_time;             /* time when status/peek was last done (Date-based rate limit) */\n\n\t/* Used to support single-byte stream lookahead. */\n\tduk_bool_t dbg_have_next_byte;\n\tduk_uint8_t dbg_next_byte;\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_bool_t dbg_calling_transport;       /* transport call in progress, calling into Duktape forbidden */\n#endif\n\n\t/* String intern table (weak refs). */\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *strtable16;\n#else\n\tduk_hstring **strtable;\n#endif\n\tduk_uint32_t st_mask;    /* mask for lookup, st_size - 1 */\n\tduk_uint32_t st_size;    /* stringtable size */\n#if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE)\n\tduk_uint32_t st_count;   /* string count for resize load factor checks */\n#endif\n\tduk_bool_t st_resizing;  /* string table is being resized; avoid recursive resize */\n\n\t/* String access cache (codepoint offset -> byte offset) for fast string\n\t * character looping; 'weak' reference which needs special handling in GC.\n\t */\n\tduk_strcache strcache[DUK_HEAP_STRCACHE_SIZE];\n\n\t/* Built-in strings. */\n#if defined(DUK_USE_ROM_STRINGS)\n\t/* No field needed when strings are in ROM. */\n#else\n#if defined(DUK_USE_HEAPPTR16)\n\tduk_uint16_t strs16[DUK_HEAP_NUM_STRINGS];\n#else\n\tduk_hstring *strs[DUK_HEAP_NUM_STRINGS];\n#endif\n#endif\n\n\t/* Stats. */\n#if defined(DUK_USE_DEBUG)\n\tduk_int_t stats_exec_opcodes;\n\tduk_int_t stats_exec_interrupt;\n\tduk_int_t stats_exec_throw;\n\tduk_int_t stats_call_all;\n\tduk_int_t stats_call_tailcall;\n\tduk_int_t stats_call_ecmatoecma;\n\tduk_int_t stats_safecall_all;\n\tduk_int_t stats_safecall_nothrow;\n\tduk_int_t stats_safecall_throw;\n\tduk_int_t stats_ms_try_count;\n\tduk_int_t stats_ms_skip_count;\n\tduk_int_t stats_ms_emergency_count;\n\tduk_int_t stats_strtab_intern_hit;\n\tduk_int_t stats_strtab_intern_miss;\n\tduk_int_t stats_strtab_resize_check;\n\tduk_int_t stats_strtab_resize_grow;\n\tduk_int_t stats_strtab_resize_shrink;\n\tduk_int_t stats_object_realloc_props;\n\tduk_int_t stats_object_abandon_array;\n\tduk_int_t stats_getownpropdesc_count;\n\tduk_int_t stats_getownpropdesc_hit;\n\tduk_int_t stats_getownpropdesc_miss;\n\tduk_int_t stats_getpropdesc_count;\n\tduk_int_t stats_getpropdesc_hit;\n\tduk_int_t stats_getpropdesc_miss;\n\tduk_int_t stats_getprop_all;\n\tduk_int_t stats_getprop_arrayidx;\n\tduk_int_t stats_getprop_bufobjidx;\n\tduk_int_t stats_getprop_bufferidx;\n\tduk_int_t stats_getprop_bufferlen;\n\tduk_int_t stats_getprop_stringidx;\n\tduk_int_t stats_getprop_stringlen;\n\tduk_int_t stats_getprop_proxy;\n\tduk_int_t stats_getprop_arguments;\n\tduk_int_t stats_putprop_all;\n\tduk_int_t stats_putprop_arrayidx;\n\tduk_int_t stats_putprop_bufobjidx;\n\tduk_int_t stats_putprop_bufferidx;\n\tduk_int_t stats_putprop_proxy;\n\tduk_int_t stats_getvar_all;\n\tduk_int_t stats_putvar_all;\n#endif\n};\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL\nduk_heap *duk_heap_alloc(duk_alloc_function alloc_func,\n                         duk_realloc_function realloc_func,\n                         duk_free_function free_func,\n                         void *heap_udata,\n                         duk_fatal_function fatal_func);\nDUK_INTERNAL_DECL void duk_heap_free(duk_heap *heap);\nDUK_INTERNAL_DECL void duk_free_hobject(duk_heap *heap, duk_hobject *h);\nDUK_INTERNAL_DECL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h);\nDUK_INTERNAL_DECL void duk_free_hstring(duk_heap *heap, duk_hstring *h);\nDUK_INTERNAL_DECL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr);\n\nDUK_INTERNAL_DECL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr);\n#if defined(DUK_USE_REFERENCE_COUNTING)\nDUK_INTERNAL_DECL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr);\n#endif\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_INTERNAL_DECL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr);\nDUK_INTERNAL_DECL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr);\n#endif\n#if defined(DUK_USE_ASSERTIONS)\nDUK_INTERNAL_DECL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr);\n#endif\n#if defined(DUK_USE_INTERRUPT_COUNTER)\nDUK_INTERNAL_DECL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr);\n#endif\n\nDUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen);\nDUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t len);\nDUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val);\nDUK_INTERNAL_DECL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val);\n#if defined(DUK_USE_REFERENCE_COUNTING)\nDUK_INTERNAL_DECL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h);\n#endif\nDUK_INTERNAL_DECL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev);\nDUK_INTERNAL_DECL void duk_heap_strtable_force_resize(duk_heap *heap);\nDUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap);\n#if defined(DUK_USE_DEBUG)\nDUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap);\n#endif\n\nDUK_INTERNAL_DECL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h);\nDUK_INTERNAL_DECL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset);\n\n#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS)\nDUK_INTERNAL_DECL void *duk_default_alloc_function(void *udata, duk_size_t size);\nDUK_INTERNAL_DECL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize);\nDUK_INTERNAL_DECL void duk_default_free_function(void *udata, void *ptr);\n#endif\n\nDUK_INTERNAL_DECL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size);\nDUK_INTERNAL_DECL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size);\nDUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size);\nDUK_INTERNAL_DECL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size);\nDUK_INTERNAL_DECL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize);\nDUK_INTERNAL_DECL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize);\nDUK_INTERNAL_DECL void duk_heap_mem_free(duk_heap *heap, void *ptr);\n\nDUK_INTERNAL_DECL void duk_heap_free_freelists(duk_heap *heap);\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_INTERNAL_DECL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj);\nDUK_INTERNAL_DECL void duk_heap_process_finalize_list(duk_heap *heap);\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\nDUK_INTERNAL_DECL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags);\n\nDUK_INTERNAL_DECL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len);\n\n#endif  /* DUK_HEAP_H_INCLUDED */\n/* #include duk_debugger.h */\n#line 1 \"duk_debugger.h\"\n#if !defined(DUK_DEBUGGER_H_INCLUDED)\n#define DUK_DEBUGGER_H_INCLUDED\n\n/* Debugger protocol version is defined in the public API header. */\n\n/* Initial bytes for markers. */\n#define DUK_DBG_IB_EOM                   0x00\n#define DUK_DBG_IB_REQUEST               0x01\n#define DUK_DBG_IB_REPLY                 0x02\n#define DUK_DBG_IB_ERROR                 0x03\n#define DUK_DBG_IB_NOTIFY                0x04\n\n/* Other initial bytes. */\n#define DUK_DBG_IB_INT4                  0x10\n#define DUK_DBG_IB_STR4                  0x11\n#define DUK_DBG_IB_STR2                  0x12\n#define DUK_DBG_IB_BUF4                  0x13\n#define DUK_DBG_IB_BUF2                  0x14\n#define DUK_DBG_IB_UNUSED                0x15\n#define DUK_DBG_IB_UNDEFINED             0x16\n#define DUK_DBG_IB_NULL                  0x17\n#define DUK_DBG_IB_TRUE                  0x18\n#define DUK_DBG_IB_FALSE                 0x19\n#define DUK_DBG_IB_NUMBER                0x1a\n#define DUK_DBG_IB_OBJECT                0x1b\n#define DUK_DBG_IB_POINTER               0x1c\n#define DUK_DBG_IB_LIGHTFUNC             0x1d\n#define DUK_DBG_IB_HEAPPTR               0x1e\n/* The short string/integer initial bytes starting from 0x60 don't have\n * defines now.\n */\n\n/* Error codes. */\n#define DUK_DBG_ERR_UNKNOWN              0x00\n#define DUK_DBG_ERR_UNSUPPORTED          0x01\n#define DUK_DBG_ERR_TOOMANY              0x02\n#define DUK_DBG_ERR_NOTFOUND             0x03\n#define DUK_DBG_ERR_APPLICATION          0x04\n\n/* Commands and notifys initiated by Duktape. */\n#define DUK_DBG_CMD_STATUS               0x01\n#define DUK_DBG_CMD_UNUSED_2             0x02  /* Duktape 1.x: print notify */\n#define DUK_DBG_CMD_UNUSED_3             0x03  /* Duktape 1.x: alert notify */\n#define DUK_DBG_CMD_UNUSED_4             0x04  /* Duktape 1.x: log notify */\n#define DUK_DBG_CMD_THROW                0x05\n#define DUK_DBG_CMD_DETACHING            0x06\n#define DUK_DBG_CMD_APPNOTIFY            0x07\n\n/* Commands initiated by debug client. */\n#define DUK_DBG_CMD_BASICINFO            0x10\n#define DUK_DBG_CMD_TRIGGERSTATUS        0x11\n#define DUK_DBG_CMD_PAUSE                0x12\n#define DUK_DBG_CMD_RESUME               0x13\n#define DUK_DBG_CMD_STEPINTO             0x14\n#define DUK_DBG_CMD_STEPOVER             0x15\n#define DUK_DBG_CMD_STEPOUT              0x16\n#define DUK_DBG_CMD_LISTBREAK            0x17\n#define DUK_DBG_CMD_ADDBREAK             0x18\n#define DUK_DBG_CMD_DELBREAK             0x19\n#define DUK_DBG_CMD_GETVAR               0x1a\n#define DUK_DBG_CMD_PUTVAR               0x1b\n#define DUK_DBG_CMD_GETCALLSTACK         0x1c\n#define DUK_DBG_CMD_GETLOCALS            0x1d\n#define DUK_DBG_CMD_EVAL                 0x1e\n#define DUK_DBG_CMD_DETACH               0x1f\n#define DUK_DBG_CMD_DUMPHEAP             0x20\n#define DUK_DBG_CMD_GETBYTECODE          0x21\n#define DUK_DBG_CMD_APPREQUEST           0x22\n#define DUK_DBG_CMD_GETHEAPOBJINFO       0x23\n#define DUK_DBG_CMD_GETOBJPROPDESC       0x24\n#define DUK_DBG_CMD_GETOBJPROPDESCRANGE  0x25\n\n/* The low 8 bits map directly to duk_hobject.h DUK_PROPDESC_FLAG_xxx.\n * The remaining flags are specific to the debugger.\n */\n#define DUK_DBG_PROPFLAG_SYMBOL          (1U << 8)\n#define DUK_DBG_PROPFLAG_HIDDEN          (1U << 9)\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_INTERNAL_DECL void duk_debug_do_detach(duk_heap *heap);\n\nDUK_INTERNAL_DECL duk_bool_t duk_debug_read_peek(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_debug_write_flush(duk_hthread *thr);\n\nDUK_INTERNAL_DECL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length);\nDUK_INTERNAL_DECL void duk_debug_skip_byte(duk_hthread *thr);\n\nDUK_INTERNAL_DECL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length);\nDUK_INTERNAL_DECL duk_uint8_t duk_debug_read_byte(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_int32_t duk_debug_read_int(duk_hthread *thr);\nDUK_INTERNAL_DECL duk_hstring *duk_debug_read_hstring(duk_hthread *thr);\n/* XXX: exposed duk_debug_read_pointer */\n/* XXX: exposed duk_debug_read_buffer */\n/* XXX: exposed duk_debug_read_hbuffer */\n#if 0\nDUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr);\n#endif\n#if defined(DUK_USE_DEBUGGER_INSPECT)\nDUK_INTERNAL_DECL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr);\n#endif\nDUK_INTERNAL_DECL duk_tval *duk_debug_read_tval(duk_hthread *thr);\n\nDUK_INTERNAL_DECL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length);\nDUK_INTERNAL_DECL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x);\nDUK_INTERNAL_DECL void duk_debug_write_unused(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_debug_write_undefined(duk_hthread *thr);\n#if defined(DUK_USE_DEBUGGER_INSPECT)\nDUK_INTERNAL_DECL void duk_debug_write_null(duk_hthread *thr);\n#endif\nDUK_INTERNAL_DECL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val);\nDUK_INTERNAL_DECL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x);\nDUK_INTERNAL_DECL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x);\nDUK_INTERNAL_DECL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length);\nDUK_INTERNAL_DECL void duk_debug_write_cstring(duk_hthread *thr, const char *data);\nDUK_INTERNAL_DECL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h);\nDUK_INTERNAL_DECL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length);\nDUK_INTERNAL_DECL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h);\nDUK_INTERNAL_DECL void duk_debug_write_pointer(duk_hthread *thr, void *ptr);\n#if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT)\nDUK_INTERNAL_DECL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h);\n#endif\nDUK_INTERNAL_DECL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj);\nDUK_INTERNAL_DECL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv);\n#if 0  /* unused */\nDUK_INTERNAL_DECL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command);\n#endif\nDUK_INTERNAL_DECL void duk_debug_write_reply(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg);\nDUK_INTERNAL_DECL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command);\nDUK_INTERNAL_DECL void duk_debug_write_eom(duk_hthread *thr);\n\nDUK_INTERNAL_DECL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr);\nDUK_INTERNAL_DECL void duk_debug_send_status(duk_hthread *thr);\n#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)\nDUK_INTERNAL_DECL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal);\n#endif\n\nDUK_INTERNAL_DECL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc);\nDUK_INTERNAL_DECL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block);\n\nDUK_INTERNAL_DECL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line);\nDUK_INTERNAL_DECL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index);\n\nDUK_INTERNAL_DECL duk_bool_t duk_debug_is_attached(duk_heap *heap);\nDUK_INTERNAL_DECL duk_bool_t duk_debug_is_paused(duk_heap *heap);\nDUK_INTERNAL_DECL void duk_debug_set_paused(duk_heap *heap);\nDUK_INTERNAL_DECL void duk_debug_clear_paused(duk_heap *heap);\nDUK_INTERNAL_DECL void duk_debug_clear_pause_state(duk_heap *heap);\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n#endif  /* DUK_DEBUGGER_H_INCLUDED */\n/* #include duk_debug.h */\n#line 1 \"duk_debug.h\"\n/*\n *  Debugging macros, DUK_DPRINT() and its variants in particular.\n *\n *  DUK_DPRINT() allows formatted debug prints, and supports standard\n *  and Duktape specific formatters.  See duk_debug_vsnprintf.c for details.\n *\n *  DUK_D(x), DUK_DD(x), and DUK_DDD(x) are used together with log macros\n *  for technical reasons.  They are concretely used to hide 'x' from the\n *  compiler when the corresponding log level is disabled.  This allows\n *  clean builds on non-C99 compilers, at the cost of more verbose code.\n *  Examples:\n *\n *    DUK_D(DUK_DPRINT(\"foo\"));\n *    DUK_DD(DUK_DDPRINT(\"foo\"));\n *    DUK_DDD(DUK_DDDPRINT(\"foo\"));\n *\n *  This approach is preferable to the old \"double parentheses\" hack because\n *  double parentheses make the C99 solution worse: __FILE__ and __LINE__ can\n *  no longer be added transparently without going through globals, which\n *  works poorly with threading.\n */\n\n#if !defined(DUK_DEBUG_H_INCLUDED)\n#define DUK_DEBUG_H_INCLUDED\n\n#if defined(DUK_USE_DEBUG)\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0)\n#define DUK_D(x) x\n#else\n#define DUK_D(x) do { } while (0) /* omit */\n#endif\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)\n#define DUK_DD(x) x\n#else\n#define DUK_DD(x) do { } while (0) /* omit */\n#endif\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n#define DUK_DDD(x) x\n#else\n#define DUK_DDD(x) do { } while (0) /* omit */\n#endif\n\n/*\n *  Exposed debug macros: debugging enabled\n */\n\n#if defined(DUK_USE_VARIADIC_MACROS)\n\n/* Note: combining __FILE__, __LINE__, and __func__ into fmt would be\n * possible compile time, but waste some space with shared function names.\n */\n#define DUK__DEBUG_LOG(lev,...)  duk_debug_log((duk_int_t) (lev), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, DUK_FUNC_MACRO, __VA_ARGS__);\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0)\n#define DUK_DPRINT(...)          DUK__DEBUG_LOG(DUK_LEVEL_DEBUG, __VA_ARGS__)\n#else\n#define DUK_DPRINT(...)\n#endif\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)\n#define DUK_DDPRINT(...)         DUK__DEBUG_LOG(DUK_LEVEL_DDEBUG, __VA_ARGS__)\n#else\n#define DUK_DDPRINT(...)\n#endif\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n#define DUK_DDDPRINT(...)        DUK__DEBUG_LOG(DUK_LEVEL_DDDEBUG, __VA_ARGS__)\n#else\n#define DUK_DDDPRINT(...)\n#endif\n\n#else  /* DUK_USE_VARIADIC_MACROS */\n\n#define DUK__DEBUG_STASH(lev)    \\\n\t(void) DUK_SNPRINTF(duk_debug_file_stash, DUK_DEBUG_STASH_SIZE, \"%s\", (const char *) DUK_FILE_MACRO), \\\n\t(void) (duk_debug_file_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \\\n\t(void) (duk_debug_line_stash = (duk_int_t) DUK_LINE_MACRO), \\\n\t(void) DUK_SNPRINTF(duk_debug_func_stash, DUK_DEBUG_STASH_SIZE, \"%s\", (const char *) DUK_FUNC_MACRO), \\\n\t(void) (duk_debug_func_stash[DUK_DEBUG_STASH_SIZE - 1] = (char) 0), \\\n\t(void) (duk_debug_level_stash = (lev))\n\n/* Without variadic macros resort to comma expression trickery to handle debug\n * prints.  This generates a lot of harmless warnings.  These hacks are not\n * needed normally because DUK_D() and friends will hide the entire debug log\n * statement from the compiler.\n */\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 0)\n#define DUK_DPRINT  DUK__DEBUG_STASH(DUK_LEVEL_DEBUG), (void) duk_debug_log  /* args go here in parens */\n#else\n#define DUK_DPRINT  0 && /* args go here as a comma expression in parens */\n#endif\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)\n#define DUK_DDPRINT  DUK__DEBUG_STASH(DUK_LEVEL_DDEBUG), (void) duk_debug_log  /* args go here in parens */\n#else\n#define DUK_DDPRINT  0 && /* args */\n#endif\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n#define DUK_DDDPRINT  DUK__DEBUG_STASH(DUK_LEVEL_DDDEBUG), (void) duk_debug_log  /* args go here in parens */\n#else\n#define DUK_DDDPRINT  0 && /* args */\n#endif\n\n#endif  /* DUK_USE_VARIADIC_MACROS */\n\n#else  /* DUK_USE_DEBUG */\n\n/*\n *  Exposed debug macros: debugging disabled\n */\n\n#define DUK_D(x) do { } while (0) /* omit */\n#define DUK_DD(x) do { } while (0) /* omit */\n#define DUK_DDD(x) do { } while (0) /* omit */\n\n#if defined(DUK_USE_VARIADIC_MACROS)\n\n#define DUK_DPRINT(...)\n#define DUK_DDPRINT(...)\n#define DUK_DDDPRINT(...)\n\n#else  /* DUK_USE_VARIADIC_MACROS */\n\n#define DUK_DPRINT    0 && /* args go here as a comma expression in parens */\n#define DUK_DDPRINT   0 && /* args */\n#define DUK_DDDPRINT  0 && /* args */\n\n#endif  /* DUK_USE_VARIADIC_MACROS */\n\n#endif  /* DUK_USE_DEBUG */\n\n/*\n *  Structs\n */\n\n#if defined(DUK_USE_DEBUG)\nstruct duk_fixedbuffer {\n\tduk_uint8_t *buffer;\n\tduk_size_t length;\n\tduk_size_t offset;\n\tduk_bool_t truncated;\n};\n#endif\n\n/*\n *  Prototypes\n */\n\n#if defined(DUK_USE_DEBUG)\nDUK_INTERNAL_DECL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap);\n#if 0  /*unused*/\nDUK_INTERNAL_DECL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...);\n#endif\nDUK_INTERNAL_DECL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size);\n\n#if defined(DUK_USE_VARIADIC_MACROS)\nDUK_INTERNAL_DECL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...);\n#else  /* DUK_USE_VARIADIC_MACROS */\n/* parameter passing, not thread safe */\n#define DUK_DEBUG_STASH_SIZE  128\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE];\nDUK_INTERNAL_DECL duk_int_t duk_debug_line_stash;\nDUK_INTERNAL_DECL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE];\nDUK_INTERNAL_DECL duk_int_t duk_debug_level_stash;\n#endif\nDUK_INTERNAL_DECL void duk_debug_log(const char *fmt, ...);\n#endif  /* DUK_USE_VARIADIC_MACROS */\n\nDUK_INTERNAL_DECL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length);\nDUK_INTERNAL_DECL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x);\nDUK_INTERNAL_DECL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x);\nDUK_INTERNAL_DECL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...);\nDUK_INTERNAL_DECL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size);\nDUK_INTERNAL_DECL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb);\n\n#endif  /* DUK_USE_DEBUG */\n\n#endif  /* DUK_DEBUG_H_INCLUDED */\n/* #include duk_error.h */\n#line 1 \"duk_error.h\"\n/*\n *  Error handling macros, assertion macro, error codes.\n *\n *  There are three types of 'errors':\n *\n *    1. Ordinary errors relative to a thread, cause a longjmp, catchable.\n *    2. Fatal errors relative to a heap, cause fatal handler to be called.\n *    3. Fatal errors without context, cause the default (not heap specific)\n *       fatal handler to be called.\n *\n *  Fatal errors without context are used by debug code such as assertions.\n *  By providing a fatal error handler for a Duktape heap, user code can\n *  avoid fatal errors without context in non-debug builds.\n */\n\n#if !defined(DUK_ERROR_H_INCLUDED)\n#define DUK_ERROR_H_INCLUDED\n\n/*\n *  Error codes: defined in duktape.h\n *\n *  Error codes are used as a shorthand to throw exceptions from inside\n *  the implementation.  The appropriate Ecmascript object is constructed\n *  based on the code.  Ecmascript code throws objects directly.  The error\n *  codes are defined in the public API header because they are also used\n *  by calling code.\n */\n\n/*\n *  Normal error\n *\n *  Normal error is thrown with a longjmp() through the current setjmp()\n *  catchpoint record in the duk_heap.  The 'curr_thread' of the duk_heap\n *  identifies the throwing thread.\n *\n *  Error formatting is usually unnecessary.  The error macros provide a\n *  zero argument version (no formatting) and separate macros for small\n *  argument counts.  Variadic macros are not used to avoid portability\n *  issues and avoid the need for stash-based workarounds when they're not\n *  available.  Vararg calls are avoided for non-formatted error calls\n *  because vararg call sites are larger than normal, and there are a lot\n *  of call sites with no formatting.\n *\n *  Note that special formatting provided by debug macros is NOT available.\n *\n *  The _RAW variants allow the caller to specify file and line.  This makes\n *  it easier to write checked calls which want to use the call site of the\n *  checked function, not the error macro call inside the checked function.\n */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\n/* Because there are quite many call sites, pack error code (require at most\n * 8-bit) into a single argument.\n */\n#define DUK_ERROR(thr,err,msg) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \\\n\t} while (0)\n#define DUK_ERROR_RAW(thr,file,line,err,msg) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (msg)); \\\n\t} while (0)\n\n#define DUK_ERROR_FMT1(thr,err,fmt,arg1) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \\\n\t} while (0)\n#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1)); \\\n\t} while (0)\n\n#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \\\n\t} while (0)\n#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2)); \\\n\t} while (0)\n\n#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \\\n\t} while (0)\n#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3)); \\\n\t} while (0)\n\n#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) DUK_LINE_MACRO; \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), DUK_FILE_MACRO, (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \\\n\t} while (0)\n#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) do { \\\n\t\tduk_errcode_t duk__err = (err); duk_int_t duk__line = (duk_int_t) (line); \\\n\t\tDUK_ASSERT(duk__err >= 0 && duk__err <= 0xff); DUK_ASSERT(duk__line >= 0 && duk__line <= 0x00ffffffL); \\\n\t\tduk_err_handle_error_fmt((thr), (file), (((duk_uint_t) duk__err) << 24) | ((duk_uint_t) duk__line), (fmt), (arg1), (arg2), (arg3), (arg4)); \\\n\t} while (0)\n\n#else  /* DUK_USE_VERBOSE_ERRORS */\n\n#define DUK_ERROR(thr,err,msg)                    duk_err_handle_error((thr), (err))\n#define DUK_ERROR_RAW(thr,file,line,err,msg)      duk_err_handle_error((thr), (err))\n\n#define DUK_ERROR_FMT1(thr,err,fmt,arg1) DUK_ERROR((thr),(err),(fmt))\n#define DUK_ERROR_RAW_FMT1(thr,file,line,err,fmt,arg1) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))\n\n#define DUK_ERROR_FMT2(thr,err,fmt,arg1,arg2) DUK_ERROR((thr),(err),(fmt))\n#define DUK_ERROR_RAW_FMT2(thr,file,line,err,fmt,arg1,arg2) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))\n\n#define DUK_ERROR_FMT3(thr,err,fmt,arg1,arg2,arg3) DUK_ERROR((thr),(err),(fmt))\n#define DUK_ERROR_RAW_FMT3(thr,file,line,err,fmt,arg1,arg2,arg3) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))\n\n#define DUK_ERROR_FMT4(thr,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR((thr),(err),(fmt))\n#define DUK_ERROR_RAW_FMT4(thr,file,line,err,fmt,arg1,arg2,arg3,arg4) DUK_ERROR_RAW((thr),(file),(line),(err),(fmt))\n\n#endif  /* DUK_USE_VERBOSE_ERRORS */\n\n/*\n *  Fatal error without context\n *\n *  The macro is an expression to make it compatible with DUK_ASSERT_EXPR().\n */\n\n#define DUK_FATAL_WITHOUT_CONTEXT(msg) \\\n\tduk_default_fatal_handler(NULL, (msg))\n\n/*\n *  Error throwing helpers\n *\n *  The goal is to provide verbose and configurable error messages.  Call\n *  sites should be clean in source code and compile to a small footprint.\n *  Small footprint is also useful for performance because small cold paths\n *  reduce code cache pressure.  Adding macros here only makes sense if there\n *  are enough call sites to get concrete benefits.\n *\n *  DUK_ERROR_xxx() macros are generic and can be used anywhere.\n *\n *  DUK_DCERROR_xxx() macros can only be used in Duktape/C functions where\n *  the \"return DUK_RET_xxx;\" shorthand is available for low memory targets.\n *  The DUK_DCERROR_xxx() macros always either throw or perform a\n *  'return DUK_RET_xxx' from the calling function.\n */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n/* Verbose errors with key/value summaries (non-paranoid) or without key/value\n * summaries (paranoid, for some security sensitive environments), the paranoid\n * vs. non-paranoid distinction affects only a few specific errors.\n */\n#if defined(DUK_USE_PARANOID_ERRORS)\n#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \\\n\t\tduk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \\\n\t} while (0)\n#else  /* DUK_USE_PARANOID_ERRORS */\n#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \\\n\t\tduk_err_require_type_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx), (expectname)); \\\n\t} while (0)\n#endif  /* DUK_USE_PARANOID_ERRORS */\n\n#define DUK_ERROR_INTERNAL(thr) do { \\\n\t\tduk_err_error_internal((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \\\n\t} while (0)\n#define DUK_DCERROR_INTERNAL(thr) do { \\\n\t\tDUK_ERROR_INTERNAL((thr)); \\\n\t\treturn 0; \\\n\t} while (0)\n#define DUK_ERROR_ALLOC_FAILED(thr) do { \\\n\t\tduk_err_error_alloc_failed((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \\\n\t} while (0)\n#define DUK_ERROR_UNSUPPORTED(thr) do { \\\n\t\tDUK_ERROR((thr), DUK_ERR_ERROR, DUK_STR_UNSUPPORTED); \\\n\t} while (0)\n#define DUK_ERROR_ERROR(thr,msg) do { \\\n\t\tduk_err_error((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INDEX(thr,idx) do { \\\n\t\tduk_err_range_index((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (idx)); \\\n\t} while (0)\n#define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \\\n\t\tduk_err_range_push_beyond((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \\\n\t\tDUK_ERROR_RANGE((thr), DUK_STR_INVALID_ARGS); \\\n\t} while (0)\n#define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \\\n\t\tDUK_ERROR_RANGE_INVALID_ARGS((thr)); \\\n\t\treturn 0; \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \\\n\t\tDUK_ERROR_RANGE((thr), DUK_STR_INVALID_COUNT); \\\n\t} while (0)\n#define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \\\n\t\tDUK_ERROR_RANGE_INVALID_COUNT((thr)); \\\n\t\treturn 0; \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \\\n\t\tDUK_ERROR_RANGE((thr), DUK_STR_INVALID_LENGTH); \\\n\t} while (0)\n#define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \\\n\t\tDUK_ERROR_RANGE_INVALID_LENGTH((thr)); \\\n\t\treturn 0; \\\n\t} while (0)\n#define DUK_ERROR_RANGE(thr,msg) do { \\\n\t\tduk_err_range((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO, (msg)); \\\n\t} while (0)\n#define DUK_ERROR_EVAL(thr,msg) do { \\\n\t\tDUK_ERROR((thr), DUK_ERR_EVAL_ERROR, (msg)); \\\n\t} while (0)\n#define DUK_ERROR_REFERENCE(thr,msg) do { \\\n\t\tDUK_ERROR((thr), DUK_ERR_REFERENCE_ERROR, (msg)); \\\n\t} while (0)\n#define DUK_ERROR_SYNTAX(thr,msg) do { \\\n\t\tDUK_ERROR((thr), DUK_ERR_SYNTAX_ERROR, (msg)); \\\n\t} while (0)\n#define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \\\n\t\tduk_err_type_invalid_args((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \\\n\t} while (0)\n#define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \\\n\t\tDUK_ERROR_TYPE_INVALID_ARGS((thr)); \\\n\t\treturn 0; \\\n\t} while (0)\n#define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \\\n\t\tduk_err_type_invalid_state((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \\\n\t} while (0)\n#define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \\\n\t\tDUK_ERROR_TYPE_INVALID_STATE((thr)); \\\n\t\treturn 0; \\\n\t} while (0)\n#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \\\n\t\tduk_err_type_invalid_trap_result((thr), DUK_FILE_MACRO, (duk_int_t) DUK_LINE_MACRO); \\\n\t} while (0)\n#define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \\\n\t\tDUK_ERROR_TYPE((thr), DUK_STR_INVALID_TRAP_RESULT); \\\n\t} while (0)\n#define DUK_ERROR_TYPE(thr,msg) do { \\\n\t\tDUK_ERROR((thr), DUK_ERR_TYPE_ERROR, (msg)); \\\n\t} while (0)\n#define DUK_ERROR_URI(thr,msg) do { \\\n\t\tDUK_ERROR((thr), DUK_ERR_URI_ERROR, (msg)); \\\n\t} while (0)\n#else  /* DUK_USE_VERBOSE_ERRORS */\n/* Non-verbose errors for low memory targets: no file, line, or message. */\n\n#define DUK_ERROR_REQUIRE_TYPE_INDEX(thr,idx,expectname,lowmemstr) do { \\\n\t\tduk_err_type((thr)); \\\n\t} while (0)\n\n#define DUK_ERROR_INTERNAL(thr) do { \\\n\t\tduk_err_error((thr)); \\\n\t} while (0)\n#define DUK_DCERROR_INTERNAL(thr) do { \\\n\t\tDUK_UNREF((thr)); \\\n\t\treturn DUK_RET_ERROR; \\\n\t} while (0)\n#define DUK_ERROR_ALLOC_FAILED(thr) do { \\\n\t\tduk_err_error((thr)); \\\n\t} while (0)\n#define DUK_ERROR_UNSUPPORTED(thr) do { \\\n\t\tduk_err_error((thr)); \\\n\t} while (0)\n#define DUK_ERROR_ERROR(thr,msg) do { \\\n\t\tduk_err_error((thr)); \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INDEX(thr,idx) do { \\\n\t\tduk_err_range((thr)); \\\n\t} while (0)\n#define DUK_ERROR_RANGE_PUSH_BEYOND(thr) do { \\\n\t\tduk_err_range((thr)); \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INVALID_ARGS(thr) do { \\\n\t\tduk_err_range((thr)); \\\n\t} while (0)\n#define DUK_DCERROR_RANGE_INVALID_ARGS(thr) do { \\\n\t\tDUK_UNREF((thr)); \\\n\t\treturn DUK_RET_RANGE_ERROR; \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INVALID_COUNT(thr) do { \\\n\t\tduk_err_range((thr)); \\\n\t} while (0)\n#define DUK_DCERROR_RANGE_INVALID_COUNT(thr) do { \\\n\t\tDUK_UNREF((thr)); \\\n\t\treturn DUK_RET_RANGE_ERROR; \\\n\t} while (0)\n#define DUK_ERROR_RANGE_INVALID_LENGTH(thr) do { \\\n\t\tduk_err_range((thr)); \\\n\t} while (0)\n#define DUK_DCERROR_RANGE_INVALID_LENGTH(thr) do { \\\n\t\tDUK_UNREF((thr)); \\\n\t\treturn DUK_RET_RANGE_ERROR; \\\n\t} while (0)\n#define DUK_ERROR_RANGE(thr,msg) do { \\\n\t\tduk_err_range((thr)); \\\n\t} while (0)\n#define DUK_ERROR_EVAL(thr,msg) do { \\\n\t\tduk_err_eval((thr)); \\\n\t} while (0)\n#define DUK_ERROR_REFERENCE(thr,msg) do { \\\n\t\tduk_err_reference((thr)); \\\n\t} while (0)\n#define DUK_ERROR_SYNTAX(thr,msg) do { \\\n\t\tduk_err_syntax((thr)); \\\n\t} while (0)\n#define DUK_ERROR_TYPE_INVALID_ARGS(thr) do { \\\n\t\tduk_err_type((thr)); \\\n\t} while (0)\n#define DUK_DCERROR_TYPE_INVALID_ARGS(thr) do { \\\n\t\tDUK_UNREF((thr)); \\\n\t\treturn DUK_RET_TYPE_ERROR; \\\n\t} while (0)\n#define DUK_ERROR_TYPE_INVALID_STATE(thr) do { \\\n\t\tduk_err_type((thr)); \\\n\t} while (0)\n#define DUK_DCERROR_TYPE_INVALID_STATE(thr) do { \\\n\t\tduk_err_type((thr)); \\\n\t} while (0)\n#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \\\n\t\tduk_err_type((thr)); \\\n\t} while (0)\n#define DUK_DCERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \\\n\t\tDUK_UNREF((thr)); \\\n\t\treturn DUK_RET_TYPE_ERROR; \\\n\t} while (0)\n#define DUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr) do { \\\n\t\tduk_err_type((thr)); \\\n\t} while (0)\n#define DUK_ERROR_TYPE(thr,msg) do { \\\n\t\tduk_err_type((thr)); \\\n\t} while (0)\n#define DUK_ERROR_URI(thr,msg) do { \\\n\t\tduk_err_uri((thr)); \\\n\t} while (0)\n#endif  /* DUK_USE_VERBOSE_ERRORS */\n\n/*\n *  Assert macro: failure causes a fatal error.\n *\n *  NOTE: since the assert macro doesn't take a heap/context argument, there's\n *  no way to look up a heap/context specific fatal error handler which may have\n *  been given by the application.  Instead, assertion failures always use the\n *  internal default fatal error handler; it can be replaced via duk_config.h\n *  and then applies to all Duktape heaps.\n */\n\n#if defined(DUK_USE_ASSERTIONS)\n\n/* The message should be a compile time constant without formatting (less risk);\n * we don't care about assertion text size because they're not used in production\n * builds.\n */\n#define DUK_ASSERT(x)  do { \\\n\tif (!(x)) { \\\n\t\tDUK_FATAL_WITHOUT_CONTEXT(\"assertion failed: \" #x \\\n\t\t\t\" (\" DUK_FILE_MACRO \":\" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) \")\"); \\\n\t} \\\n\t} while (0)\n\n/* Assertion compatible inside a comma expression, evaluates to void. */\n#define DUK_ASSERT_EXPR(x) \\\n\t((void) ((x) ? 0 : (DUK_FATAL_WITHOUT_CONTEXT(\"assertion failed: \" #x \\\n\t\t\t\t\" (\" DUK_FILE_MACRO \":\" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO) \")\"), 0)))\n\n#else  /* DUK_USE_ASSERTIONS */\n\n#define DUK_ASSERT(x)  do { /* assertion omitted */ } while (0)\n\n#define DUK_ASSERT_EXPR(x)  ((void) 0)\n\n#endif  /* DUK_USE_ASSERTIONS */\n\n/* this variant is used when an assert would generate a compile warning by\n * being always true (e.g. >= 0 comparison for an unsigned value\n */\n#define DUK_ASSERT_DISABLE(x)  do { /* assertion disabled */ } while (0)\n\n/*\n *  Assertion helpers\n */\n\n#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)\n#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h)  do { \\\n\t\tDUK_ASSERT((h) == NULL || DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) (h)) > 0); \\\n\t} while (0)\n#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv)  do { \\\n\t\tif ((tv) != NULL && DUK_TVAL_IS_HEAP_ALLOCATED((tv))) { \\\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(DUK_TVAL_GET_HEAPHDR((tv))) > 0); \\\n\t\t} \\\n\t} while (0)\n#else\n#define DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(h)  /* no refcount check */\n#define DUK_ASSERT_REFCOUNT_NONZERO_TVAL(tv)    /* no refcount check */\n#endif\n\n#define DUK_ASSERT_TOP(ctx,n)  DUK_ASSERT((duk_idx_t) duk_get_top((ctx)) == (duk_idx_t) (n))\n\n#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_PACKED_TVAL)\n#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval)  do { \\\n\t\tduk_double_union duk__assert_tmp_du; \\\n\t\tduk__assert_tmp_du.d = (dval); \\\n\t\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&duk__assert_tmp_du)); \\\n\t} while (0)\n#else\n#define DUK_ASSERT_DOUBLE_IS_NORMALIZED(dval)  /* nop */\n#endif\n\n#define DUK_ASSERT_VS_SPACE(thr) \\\n\tDUK_ASSERT(thr->valstack_top < thr->valstack_end)\n\n/*\n *  Helper to initialize a memory area (e.g. struct) with garbage when\n *  assertions enabled.\n */\n\n#if defined(DUK_USE_ASSERTIONS)\n#define DUK_ASSERT_SET_GARBAGE(ptr,size) do { \\\n\t\tDUK_MEMSET((void *) (ptr), 0x5a, size); \\\n\t} while (0)\n#else\n#define DUK_ASSERT_SET_GARBAGE(ptr,size) do {} while (0)\n#endif\n\n/*\n *  Helper for valstack space\n *\n *  Caller of DUK_ASSERT_VALSTACK_SPACE() estimates the number of free stack entries\n *  required for its own use, and any child calls which are not (a) Duktape API calls\n *  or (b) Duktape calls which involve extending the valstack (e.g. getter call).\n */\n\n#define DUK_VALSTACK_ASSERT_EXTRA  5  /* this is added to checks to allow for Duktape\n                                       * API calls in addition to function's own use\n                                       */\n#if defined(DUK_USE_ASSERTIONS)\n#define DUK_ASSERT_VALSTACK_SPACE(thr,n)   do { \\\n\t\tDUK_ASSERT((thr) != NULL); \\\n\t\tDUK_ASSERT((thr)->valstack_end - (thr)->valstack_top >= (n) + DUK_VALSTACK_ASSERT_EXTRA); \\\n\t} while (0)\n#else\n#define DUK_ASSERT_VALSTACK_SPACE(thr,n)   /* no valstack space check */\n#endif\n\n/*\n *  Prototypes\n */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...));\n#else  /* DUK_USE_VERBOSE_ERRORS */\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code));\n#endif  /* DUK_USE_VERBOSE_ERRORS */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line));\n#else\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code));\n#endif\n\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc));\n\n#define DUK_AUGMENT_FLAG_NOBLAME_FILELINE  (1U << 0)  /* if set, don't blame C file/line for .fileName and .lineNumber */\n#define DUK_AUGMENT_FLAG_SKIP_ONE          (1U << 1)  /* if set, skip topmost activation in traceback construction */\n\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\nDUK_INTERNAL_DECL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *filename, duk_int_t line, duk_small_uint_t flags);\n#endif\n#if defined(DUK_USE_AUGMENT_ERROR_THROW)\nDUK_INTERNAL_DECL void duk_err_augment_error_throw(duk_hthread *thr);\n#endif\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n#if defined(DUK_USE_PARANOID_ERRORS)\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name));\n#else\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name));\n#endif\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber));\n#else  /* DUK_VERBOSE_ERRORS */\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_error(duk_hthread *thr));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_range(duk_hthread *thr));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_eval(duk_hthread *thr));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_reference(duk_hthread *thr));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_syntax(duk_hthread *thr));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_type(duk_hthread *thr));\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_uri(duk_hthread *thr));\n#endif /* DUK_VERBOSE_ERRORS */\n\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_err_longjmp(duk_hthread *thr));\n\nDUK_NORETURN(DUK_INTERNAL_DECL void duk_default_fatal_handler(void *udata, const char *msg));\n\nDUK_INTERNAL_DECL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_INTERNAL_DECL void duk_err_check_debugger_integration(duk_hthread *thr);\n#endif\n\nDUK_INTERNAL_DECL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t err_code);\n\n#endif  /* DUK_ERROR_H_INCLUDED */\n/* #include duk_unicode.h */\n#line 1 \"duk_unicode.h\"\n/*\n *  Unicode helpers\n */\n\n#if !defined(DUK_UNICODE_H_INCLUDED)\n#define DUK_UNICODE_H_INCLUDED\n\n/*\n *  UTF-8 / XUTF-8 / CESU-8 constants\n */\n\n#define DUK_UNICODE_MAX_XUTF8_LENGTH      7   /* up to 36 bit codepoints */\n#define DUK_UNICODE_MAX_XUTF8_BMP_LENGTH  3   /* all codepoints up to U+FFFF */\n#define DUK_UNICODE_MAX_CESU8_LENGTH      6   /* all codepoints up to U+10FFFF */\n#define DUK_UNICODE_MAX_CESU8_BMP_LENGTH  3   /* all codepoints up to U+FFFF */\n\n/*\n *  Useful Unicode codepoints\n *\n *  Integer constants must be signed to avoid unexpected coercions\n *  in comparisons.\n */\n\n#define DUK_UNICODE_CP_ZWNJ                   0x200cL  /* zero-width non-joiner */\n#define DUK_UNICODE_CP_ZWJ                    0x200dL  /* zero-width joiner */\n#define DUK_UNICODE_CP_REPLACEMENT_CHARACTER  0xfffdL  /* http://en.wikipedia.org/wiki/Replacement_character#Replacement_character */\n\n/*\n *  ASCII character constants\n *\n *  C character literals like 'x' have a platform specific value and do\n *  not match ASCII (UTF-8) values on e.g. EBCDIC platforms.  So, use\n *  these (admittedly awkward) constants instead.  These constants must\n *  also have signed values to avoid unexpected coercions in comparisons.\n *\n *  http://en.wikipedia.org/wiki/ASCII\n */\n\n#define DUK_ASC_NUL              0x00\n#define DUK_ASC_SOH              0x01\n#define DUK_ASC_STX              0x02\n#define DUK_ASC_ETX              0x03\n#define DUK_ASC_EOT              0x04\n#define DUK_ASC_ENQ              0x05\n#define DUK_ASC_ACK              0x06\n#define DUK_ASC_BEL              0x07\n#define DUK_ASC_BS               0x08\n#define DUK_ASC_HT               0x09\n#define DUK_ASC_LF               0x0a\n#define DUK_ASC_VT               0x0b\n#define DUK_ASC_FF               0x0c\n#define DUK_ASC_CR               0x0d\n#define DUK_ASC_SO               0x0e\n#define DUK_ASC_SI               0x0f\n#define DUK_ASC_DLE              0x10\n#define DUK_ASC_DC1              0x11\n#define DUK_ASC_DC2              0x12\n#define DUK_ASC_DC3              0x13\n#define DUK_ASC_DC4              0x14\n#define DUK_ASC_NAK              0x15\n#define DUK_ASC_SYN              0x16\n#define DUK_ASC_ETB              0x17\n#define DUK_ASC_CAN              0x18\n#define DUK_ASC_EM               0x19\n#define DUK_ASC_SUB              0x1a\n#define DUK_ASC_ESC              0x1b\n#define DUK_ASC_FS               0x1c\n#define DUK_ASC_GS               0x1d\n#define DUK_ASC_RS               0x1e\n#define DUK_ASC_US               0x1f\n#define DUK_ASC_SPACE            0x20\n#define DUK_ASC_EXCLAMATION      0x21\n#define DUK_ASC_DOUBLEQUOTE      0x22\n#define DUK_ASC_HASH             0x23\n#define DUK_ASC_DOLLAR           0x24\n#define DUK_ASC_PERCENT          0x25\n#define DUK_ASC_AMP              0x26\n#define DUK_ASC_SINGLEQUOTE      0x27\n#define DUK_ASC_LPAREN           0x28\n#define DUK_ASC_RPAREN           0x29\n#define DUK_ASC_STAR             0x2a\n#define DUK_ASC_PLUS             0x2b\n#define DUK_ASC_COMMA            0x2c\n#define DUK_ASC_MINUS            0x2d\n#define DUK_ASC_PERIOD           0x2e\n#define DUK_ASC_SLASH            0x2f\n#define DUK_ASC_0                0x30\n#define DUK_ASC_1                0x31\n#define DUK_ASC_2                0x32\n#define DUK_ASC_3                0x33\n#define DUK_ASC_4                0x34\n#define DUK_ASC_5                0x35\n#define DUK_ASC_6                0x36\n#define DUK_ASC_7                0x37\n#define DUK_ASC_8                0x38\n#define DUK_ASC_9                0x39\n#define DUK_ASC_COLON            0x3a\n#define DUK_ASC_SEMICOLON        0x3b\n#define DUK_ASC_LANGLE           0x3c\n#define DUK_ASC_EQUALS           0x3d\n#define DUK_ASC_RANGLE           0x3e\n#define DUK_ASC_QUESTION         0x3f\n#define DUK_ASC_ATSIGN           0x40\n#define DUK_ASC_UC_A             0x41\n#define DUK_ASC_UC_B             0x42\n#define DUK_ASC_UC_C             0x43\n#define DUK_ASC_UC_D             0x44\n#define DUK_ASC_UC_E             0x45\n#define DUK_ASC_UC_F             0x46\n#define DUK_ASC_UC_G             0x47\n#define DUK_ASC_UC_H             0x48\n#define DUK_ASC_UC_I             0x49\n#define DUK_ASC_UC_J             0x4a\n#define DUK_ASC_UC_K             0x4b\n#define DUK_ASC_UC_L             0x4c\n#define DUK_ASC_UC_M             0x4d\n#define DUK_ASC_UC_N             0x4e\n#define DUK_ASC_UC_O             0x4f\n#define DUK_ASC_UC_P             0x50\n#define DUK_ASC_UC_Q             0x51\n#define DUK_ASC_UC_R             0x52\n#define DUK_ASC_UC_S             0x53\n#define DUK_ASC_UC_T             0x54\n#define DUK_ASC_UC_U             0x55\n#define DUK_ASC_UC_V             0x56\n#define DUK_ASC_UC_W             0x57\n#define DUK_ASC_UC_X             0x58\n#define DUK_ASC_UC_Y             0x59\n#define DUK_ASC_UC_Z             0x5a\n#define DUK_ASC_LBRACKET         0x5b\n#define DUK_ASC_BACKSLASH        0x5c\n#define DUK_ASC_RBRACKET         0x5d\n#define DUK_ASC_CARET            0x5e\n#define DUK_ASC_UNDERSCORE       0x5f\n#define DUK_ASC_GRAVE            0x60\n#define DUK_ASC_LC_A             0x61\n#define DUK_ASC_LC_B             0x62\n#define DUK_ASC_LC_C             0x63\n#define DUK_ASC_LC_D             0x64\n#define DUK_ASC_LC_E             0x65\n#define DUK_ASC_LC_F             0x66\n#define DUK_ASC_LC_G             0x67\n#define DUK_ASC_LC_H             0x68\n#define DUK_ASC_LC_I             0x69\n#define DUK_ASC_LC_J             0x6a\n#define DUK_ASC_LC_K             0x6b\n#define DUK_ASC_LC_L             0x6c\n#define DUK_ASC_LC_M             0x6d\n#define DUK_ASC_LC_N             0x6e\n#define DUK_ASC_LC_O             0x6f\n#define DUK_ASC_LC_P             0x70\n#define DUK_ASC_LC_Q             0x71\n#define DUK_ASC_LC_R             0x72\n#define DUK_ASC_LC_S             0x73\n#define DUK_ASC_LC_T             0x74\n#define DUK_ASC_LC_U             0x75\n#define DUK_ASC_LC_V             0x76\n#define DUK_ASC_LC_W             0x77\n#define DUK_ASC_LC_X             0x78\n#define DUK_ASC_LC_Y             0x79\n#define DUK_ASC_LC_Z             0x7a\n#define DUK_ASC_LCURLY           0x7b\n#define DUK_ASC_PIPE             0x7c\n#define DUK_ASC_RCURLY           0x7d\n#define DUK_ASC_TILDE            0x7e\n#define DUK_ASC_DEL              0x7f\n\n/*\n *  Miscellaneous\n */\n\n/* Uppercase A is 0x41, lowercase a is 0x61; OR 0x20 to convert uppercase\n * to lowercase.\n */\n#define DUK_LOWERCASE_CHAR_ASCII(x)  ((x) | 0x20)\n\n/*\n *  Unicode tables\n */\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nextern const duk_uint8_t duk_unicode_ids_noa[1036];\n#else\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nextern const duk_uint8_t duk_unicode_ids_noabmp[625];\n#endif\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nextern const duk_uint8_t duk_unicode_ids_m_let_noa[42];\n#else\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nextern const duk_uint8_t duk_unicode_ids_m_let_noabmp[24];\n#endif\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nextern const duk_uint8_t duk_unicode_idp_m_ids_noa[530];\n#else\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nextern const duk_uint8_t duk_unicode_idp_m_ids_noabmp[357];\n#endif\n\n/*\n *  Automatically generated by extract_caseconv.py, do not edit!\n */\n\nextern const duk_uint8_t duk_unicode_caseconv_uc[1386];\nextern const duk_uint8_t duk_unicode_caseconv_lc[680];\n\n#if defined(DUK_USE_REGEXP_CANON_WORKAROUND)\n/*\n *  Automatically generated by extract_caseconv.py, do not edit!\n */\n\nextern const duk_uint16_t duk_unicode_re_canon_lookup[65536];\n#endif\n\n#if defined(DUK_USE_REGEXP_CANON_BITMAP)\n/*\n *  Automatically generated by extract_caseconv.py, do not edit!\n */\n\n#define DUK_CANON_BITMAP_BLKSIZE                                      32\n#define DUK_CANON_BITMAP_BLKSHIFT                                     5\n#define DUK_CANON_BITMAP_BLKMASK                                      31\nextern const duk_uint8_t duk_unicode_re_canon_bitmap[256];\n#endif\n\n/*\n *  Extern\n */\n\n/* duk_unicode_support.c */\n#if !defined(DUK_SINGLE_FILE)\nDUK_INTERNAL_DECL const duk_uint8_t duk_unicode_xutf8_markers[7];\nDUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_digit[2];\nDUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_white[22];\nDUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_wordchar[8];\nDUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_digit[4];\nDUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_white[24];\nDUK_INTERNAL_DECL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10];\nDUK_INTERNAL_DECL const duk_int8_t duk_is_idchar_tab[128];\n#endif  /* !DUK_SINGLE_FILE */\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp);\n#if defined(DUK_USE_ASSERTIONS)\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp);\n#endif\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp);\nDUK_INTERNAL_DECL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end);\nDUK_INTERNAL_DECL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp);\nDUK_INTERNAL_DECL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase);\n#if defined(DUK_USE_REGEXP_SUPPORT)\nDUK_INTERNAL_DECL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp);\nDUK_INTERNAL_DECL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t cp);\n#endif\n\n#endif  /* DUK_UNICODE_H_INCLUDED */\n/* #include duk_json.h */\n#line 1 \"duk_json.h\"\n/*\n *  Defines for JSON, especially duk_bi_json.c.\n */\n\n#if !defined(DUK_JSON_H_INCLUDED)\n#define DUK_JSON_H_INCLUDED\n\n/* Encoding/decoding flags */\n#define DUK_JSON_FLAG_ASCII_ONLY              (1U << 0)  /* escape any non-ASCII characters */\n#define DUK_JSON_FLAG_AVOID_KEY_QUOTES        (1U << 1)  /* avoid key quotes when key is an ASCII Identifier */\n#define DUK_JSON_FLAG_EXT_CUSTOM              (1U << 2)  /* extended types: custom encoding */\n#define DUK_JSON_FLAG_EXT_COMPATIBLE          (1U << 3)  /* extended types: compatible encoding */\n\n/* How much stack to require on entry to object/array encode */\n#define DUK_JSON_ENC_REQSTACK                 32\n\n/* How much stack to require on entry to object/array decode */\n#define DUK_JSON_DEC_REQSTACK                 32\n\n/* How large a loop detection stack to use */\n#define DUK_JSON_ENC_LOOPARRAY                64\n\n/* Encoding state.  Heap object references are all borrowed. */\ntypedef struct {\n\tduk_hthread *thr;\n\tduk_bufwriter_ctx bw;        /* output bufwriter */\n\tduk_hobject *h_replacer;     /* replacer function */\n\tduk_hstring *h_gap;          /* gap (if empty string, NULL) */\n\tduk_idx_t idx_proplist;      /* explicit PropertyList */\n\tduk_idx_t idx_loop;          /* valstack index of loop detection object */\n\tduk_small_uint_t flags;\n\tduk_small_uint_t flag_ascii_only;\n\tduk_small_uint_t flag_avoid_key_quotes;\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tduk_small_uint_t flag_ext_custom;\n\tduk_small_uint_t flag_ext_compatible;\n\tduk_small_uint_t flag_ext_custom_or_compatible;\n#endif\n\tduk_uint_t recursion_depth;\n\tduk_uint_t recursion_limit;\n\tduk_uint_t mask_for_undefined;      /* type bit mask: types which certainly produce 'undefined' */\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tduk_small_uint_t stridx_custom_undefined;\n\tduk_small_uint_t stridx_custom_nan;\n\tduk_small_uint_t stridx_custom_neginf;\n\tduk_small_uint_t stridx_custom_posinf;\n\tduk_small_uint_t stridx_custom_function;\n#endif\n\tduk_hobject *visiting[DUK_JSON_ENC_LOOPARRAY];  /* indexed by recursion_depth */\n} duk_json_enc_ctx;\n\ntypedef struct {\n\tduk_hthread *thr;\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_start;\n\tconst duk_uint8_t *p_end;\n\tduk_idx_t idx_reviver;\n\tduk_small_uint_t flags;\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tduk_small_uint_t flag_ext_custom;\n\tduk_small_uint_t flag_ext_compatible;\n\tduk_small_uint_t flag_ext_custom_or_compatible;\n#endif\n\tduk_int_t recursion_depth;\n\tduk_int_t recursion_limit;\n} duk_json_dec_ctx;\n\n#endif  /* DUK_JSON_H_INCLUDED */\n/* #include duk_js.h */\n#line 1 \"duk_js.h\"\n/*\n *  Ecmascript execution, support primitives.\n */\n\n#if !defined(DUK_JS_H_INCLUDED)\n#define DUK_JS_H_INCLUDED\n\n/* Flags for call handling.  Lowest flags must match bytecode DUK_BC_CALL_FLAG_xxx 1:1. */\n#define DUK_CALL_FLAG_TAILCALL                 (1U << 0)  /* setup for a tail call */\n#define DUK_CALL_FLAG_CONSTRUCT                (1U << 1)  /* constructor call (i.e. called as 'new Foo()') */\n#define DUK_CALL_FLAG_CALLED_AS_EVAL           (1U << 2)  /* call was made using the identifier 'eval' */\n#define DUK_CALL_FLAG_ALLOW_ECMATOECMA         (1U << 3)  /* ecma-to-ecma call with executor reuse is possible */\n#define DUK_CALL_FLAG_DIRECT_EVAL              (1U << 4)  /* call is a direct eval call */\n#define DUK_CALL_FLAG_CONSTRUCT_PROXY          (1U << 5)  /* handled via 'construct' proxy trap, check return value invariant(s) */\n#define DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED (1U << 6)  /* prototype of 'default instance' updated, temporary flag in call handling */\n\n/* Flags for duk_js_equals_helper(). */\n#define DUK_EQUALS_FLAG_SAMEVALUE            (1U << 0)  /* use SameValue instead of non-strict equality */\n#define DUK_EQUALS_FLAG_STRICT               (1U << 1)  /* use strict equality instead of non-strict equality */\n\n/* Flags for duk_js_compare_helper(). */\n#define DUK_COMPARE_FLAG_NEGATE              (1U << 0)  /* negate result */\n#define DUK_COMPARE_FLAG_EVAL_LEFT_FIRST     (1U << 1)  /* eval left argument first */\n\n/* conversions, coercions, comparison, etc */\nDUK_INTERNAL_DECL duk_bool_t duk_js_toboolean(duk_tval *tv);\nDUK_INTERNAL_DECL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL duk_double_t duk_js_tointeger_number(duk_double_t x);\nDUK_INTERNAL_DECL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv);\nDUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen);\n#if !defined(DUK_USE_HSTRING_ARRIDX)\nDUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h);\nDUK_INTERNAL_DECL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h);\n#endif\nDUK_INTERNAL_DECL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags);\nDUK_INTERNAL_DECL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2);\nDUK_INTERNAL_DECL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2);\n#if 0  /* unused */\nDUK_INTERNAL_DECL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2);\n#endif\nDUK_INTERNAL_DECL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags);\nDUK_INTERNAL_DECL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y);\nDUK_INTERNAL_DECL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y);\nDUK_INTERNAL_DECL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x);\n\n/* arithmetic */\nDUK_INTERNAL_DECL double duk_js_arith_pow(double x, double y);\nDUK_INTERNAL_DECL double duk_js_arith_mod(double x, double y);\n\n#define duk_js_equals(thr,tv_x,tv_y) \\\n\tduk_js_equals_helper((thr), (tv_x), (tv_y), 0)\n#define duk_js_strict_equals(tv_x,tv_y) \\\n\tduk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_STRICT)\n#define duk_js_samevalue(tv_x,tv_y) \\\n\tduk_js_equals_helper(NULL, (tv_x), (tv_y), DUK_EQUALS_FLAG_SAMEVALUE)\n\n/* E5 Sections 11.8.1, 11.8.5; x < y */\n#define duk_js_lessthan(thr,tv_x,tv_y) \\\n\tduk_js_compare_helper((thr), (tv_x), (tv_Y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST)\n\n/* E5 Sections 11.8.2, 11.8.5; x > y  -->  y < x */\n#define duk_js_greaterthan(thr,tv_x,tv_y) \\\n\tduk_js_compare_helper((thr), (tv_y), (tv_x), 0)\n\n/* E5 Sections 11.8.3, 11.8.5; x <= y  -->  not (x > y)  -->  not (y < x) */\n#define duk_js_lessthanorequal(thr,tv_x,tv_y) \\\n\tduk_js_compare_helper((thr), (tv_y), (tv_x), DUK_COMPARE_FLAG_NEGATE)\n\n/* E5 Sections 11.8.4, 11.8.5; x >= y  -->  not (x < y) */\n#define duk_js_greaterthanorequal(thr,tv_x,tv_y) \\\n\tduk_js_compare_helper((thr), (tv_x), (tv_y), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE)\n\n/* identifiers and environment handling */\n#if 0  /*unused*/\nDUK_INTERNAL duk_bool_t duk_js_hasvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name);\n#endif\nDUK_INTERNAL_DECL duk_bool_t duk_js_getvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_bool_t throw_flag);\nDUK_INTERNAL_DECL duk_bool_t duk_js_getvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_bool_t throw_flag);\nDUK_INTERNAL_DECL void duk_js_putvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name, duk_tval *val, duk_bool_t strict);\nDUK_INTERNAL_DECL void duk_js_putvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_bool_t strict);\n#if 0  /*unused*/\nDUK_INTERNAL_DECL duk_bool_t duk_js_delvar_envrec(duk_hthread *thr, duk_hobject *env, duk_hstring *name);\n#endif\nDUK_INTERNAL_DECL duk_bool_t duk_js_delvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name);\nDUK_INTERNAL_DECL duk_bool_t duk_js_declvar_activation(duk_hthread *thr, duk_activation *act, duk_hstring *name, duk_tval *val, duk_small_uint_t prop_flags, duk_bool_t is_func_decl);\nDUK_INTERNAL_DECL void duk_js_init_activation_environment_records_delayed(duk_hthread *thr, duk_activation *act);\nDUK_INTERNAL_DECL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env);\nDUK_INTERNAL_DECL duk_hobject *duk_create_activation_environment_record(duk_hthread *thr, duk_hobject *func, duk_size_t bottom_byteoff);\nDUK_INTERNAL_DECL void duk_js_push_closure(duk_hthread *thr,\n                                           duk_hcompfunc *fun_temp,\n                                           duk_hobject *outer_var_env,\n                                           duk_hobject *outer_lex_env,\n                                           duk_bool_t add_auto_proto);\n\n/* call handling */\nDUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected(duk_hthread *thr, duk_idx_t idx_func, duk_small_uint_t call_flags);\nDUK_INTERNAL_DECL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags);\nDUK_INTERNAL_DECL duk_int_t duk_handle_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t num_stack_args, duk_idx_t num_stack_res);\nDUK_INTERNAL_DECL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant);\n#if defined(DUK_USE_VERBOSE_ERRORS)\nDUK_INTERNAL_DECL void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key);\n#endif\n\n/* bytecode execution */\nDUK_INTERNAL_DECL void duk_js_execute_bytecode(duk_hthread *exec_thr);\n\n#endif  /* DUK_JS_H_INCLUDED */\n/* #include duk_numconv.h */\n#line 1 \"duk_numconv.h\"\n/*\n *  Number-to-string conversion.  The semantics of these is very tightly\n *  bound with the Ecmascript semantics required for call sites.\n */\n\n#if !defined(DUK_NUMCONV_H_INCLUDED)\n#define DUK_NUMCONV_H_INCLUDED\n\n/* Output a specified number of digits instead of using the shortest\n * form.  Used for toPrecision() and toFixed().\n */\n#define DUK_N2S_FLAG_FIXED_FORMAT         (1U << 0)\n\n/* Force exponential format.  Used for toExponential(). */\n#define DUK_N2S_FLAG_FORCE_EXP            (1U << 1)\n\n/* If number would need zero padding (for whole number part), use\n * exponential format instead.  E.g. if input number is 12300, 3\n * digits are generated (\"123\"), output \"1.23e+4\" instead of \"12300\".\n * Used for toPrecision().\n */\n#define DUK_N2S_FLAG_NO_ZERO_PAD          (1U << 2)\n\n/* Digit count indicates number of fractions (i.e. an absolute\n * digit index instead of a relative one).  Used together with\n * DUK_N2S_FLAG_FIXED_FORMAT for toFixed().\n */\n#define DUK_N2S_FLAG_FRACTION_DIGITS      (1U << 3)\n\n/*\n *  String-to-number conversion\n */\n\n/* Maximum exponent value when parsing numbers.  This is not strictly\n * compliant as there should be no upper limit, but as we parse the\n * exponent without a bigint, impose some limit.\n */\n#define DUK_S2N_MAX_EXPONENT              1000000000\n\n/* Trim white space (= allow leading and trailing whitespace) */\n#define DUK_S2N_FLAG_TRIM_WHITE           (1U << 0)\n\n/* Allow exponent */\n#define DUK_S2N_FLAG_ALLOW_EXP            (1U << 1)\n\n/* Allow trailing garbage (e.g. treat \"123foo\" as \"123) */\n#define DUK_S2N_FLAG_ALLOW_GARBAGE        (1U << 2)\n\n/* Allow leading plus sign */\n#define DUK_S2N_FLAG_ALLOW_PLUS           (1U << 3)\n\n/* Allow leading minus sign */\n#define DUK_S2N_FLAG_ALLOW_MINUS          (1U << 4)\n\n/* Allow 'Infinity' */\n#define DUK_S2N_FLAG_ALLOW_INF            (1U << 5)\n\n/* Allow fraction part */\n#define DUK_S2N_FLAG_ALLOW_FRAC           (1U << 6)\n\n/* Allow naked fraction (e.g. \".123\") */\n#define DUK_S2N_FLAG_ALLOW_NAKED_FRAC     (1U << 7)\n\n/* Allow empty fraction (e.g. \"123.\") */\n#define DUK_S2N_FLAG_ALLOW_EMPTY_FRAC     (1U << 8)\n\n/* Allow empty string to be interpreted as 0 */\n#define DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO  (1U << 9)\n\n/* Allow leading zeroes (e.g. \"0123\" -> \"123\") */\n#define DUK_S2N_FLAG_ALLOW_LEADING_ZERO   (1U << 10)\n\n/* Allow automatic detection of hex base (\"0x\" or \"0X\" prefix),\n * overrides radix argument and forces integer mode.\n */\n#define DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT   (1U << 11)\n\n/* Allow automatic detection of legacy octal base (\"0n\"),\n * overrides radix argument and forces integer mode.\n */\n#define DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT   (1U << 12)\n\n/* Allow automatic detection of ES2015 octal base (\"0o123\"),\n * overrides radix argument and forces integer mode.\n */\n#define DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT   (1U << 13)\n\n/* Allow automatic detection of ES2015 binary base (\"0b10001\"),\n * overrides radix argument and forces integer mode.\n */\n#define DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT   (1U << 14)\n\n/*\n *  Prototypes\n */\n\nDUK_INTERNAL_DECL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags);\nDUK_INTERNAL_DECL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags);\n\n#endif  /* DUK_NUMCONV_H_INCLUDED */\n/* #include duk_bi_protos.h */\n#line 1 \"duk_bi_protos.h\"\n/*\n *  Prototypes for built-in functions not automatically covered by the\n *  header declarations emitted by genbuiltins.py.\n */\n\n#if !defined(DUK_BUILTIN_PROTOS_H_INCLUDED)\n#define DUK_BUILTIN_PROTOS_H_INCLUDED\n\n/* Buffer size needed for ISO 8601 formatting.\n * Accurate value is 32 + 1 for NUL termination:\n *   >>> len('+123456-01-23T12:34:56.123+12:34')\n *   32\n * Include additional space to be safe.\n */\n#define  DUK_BI_DATE_ISO8601_BUFSIZE  40\n\n/* Helpers exposed for internal use */\nDUK_INTERNAL_DECL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags);\nDUK_INTERNAL_DECL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags);\nDUK_INTERNAL_DECL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year);\nDUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x);\nDUK_INTERNAL_DECL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t year);\nDUK_INTERNAL_DECL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x);\n/* Built-in providers */\n#if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY)\nDUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_gettimeofday(void);\n#endif\n#if defined(DUK_USE_DATE_NOW_TIME)\nDUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_time(void);\n#endif\n#if defined(DUK_USE_DATE_NOW_WINDOWS)\nDUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows(void);\n#endif\n#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS)\nDUK_INTERNAL_DECL duk_double_t duk_bi_date_get_now_windows_subms(void);\n#endif\n#if defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S) || defined(DUK_USE_DATE_TZO_GMTIME)\nDUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d);\n#endif\n#if defined(DUK_USE_DATE_TZO_WINDOWS)\nDUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d);\n#endif\n#if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST)\nDUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d);\n#endif\n#if defined(DUK_USE_DATE_PRS_STRPTIME)\nDUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str);\n#endif\n#if defined(DUK_USE_DATE_PRS_GETDATE)\nDUK_INTERNAL_DECL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str);\n#endif\n#if defined(DUK_USE_DATE_FMT_STRFTIME)\nDUK_INTERNAL_DECL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags);\n#endif\n\n#if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME)\nDUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void);\n#endif\n#if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC)\nDUK_INTERNAL_DECL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void);\n#endif\n\nDUK_INTERNAL_DECL\nvoid duk_bi_json_parse_helper(duk_hthread *thr,\n                              duk_idx_t idx_value,\n                              duk_idx_t idx_reviver,\n                              duk_small_uint_t flags);\nDUK_INTERNAL_DECL\nvoid duk_bi_json_stringify_helper(duk_hthread *thr,\n                                  duk_idx_t idx_value,\n                                  duk_idx_t idx_replacer,\n                                  duk_idx_t idx_space,\n                                  duk_small_uint_t flags);\n\nDUK_INTERNAL_DECL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr);\n\n#if defined(DUK_USE_ES6_PROXY)\nDUK_INTERNAL_DECL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags);\n#endif\n\n#endif  /* DUK_BUILTIN_PROTOS_H_INCLUDED */\n/* #include duk_selftest.h */\n#line 1 \"duk_selftest.h\"\n/*\n *  Selftest code\n */\n\n#if !defined(DUK_SELFTEST_H_INCLUDED)\n#define DUK_SELFTEST_H_INCLUDED\n\n#if defined(DUK_USE_SELF_TESTS)\nDUK_INTERNAL_DECL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func,\n                                                    duk_realloc_function realloc_func,\n                                                    duk_free_function free_func,\n                                                    void *udata);\n#endif\n\n#endif  /* DUK_SELFTEST_H_INCLUDED */\n#line 82 \"duk_internal.h\"\n\n#endif  /* DUK_INTERNAL_H_INCLUDED */\n#line 10 \"duk_replacements.c\"\n\n#if defined(DUK_USE_COMPUTED_NAN)\nDUK_INTERNAL double duk_computed_nan;\n#endif\n\n#if defined(DUK_USE_COMPUTED_INFINITY)\nDUK_INTERNAL double duk_computed_infinity;\n#endif\n\n#if defined(DUK_USE_REPL_FPCLASSIFY)\nDUK_INTERNAL int duk_repl_fpclassify(double x) {\n\tduk_double_union u;\n\tduk_uint_fast16_t expt;\n\tduk_small_int_t mzero;\n\n\tu.d = x;\n\texpt = (duk_uint_fast16_t) (u.us[DUK_DBL_IDX_US0] & 0x7ff0UL);\n\tif (expt > 0x0000UL && expt < 0x7ff0UL) {\n\t\t/* expt values [0x001,0x7fe] = normal */\n\t\treturn DUK_FP_NORMAL;\n\t}\n\n\tmzero = (u.ui[DUK_DBL_IDX_UI1] == 0 && (u.ui[DUK_DBL_IDX_UI0] & 0x000fffffUL) == 0);\n\tif (expt == 0x0000UL) {\n\t\t/* expt 0x000 is zero/subnormal */\n\t\tif (mzero) {\n\t\t\treturn DUK_FP_ZERO;\n\t\t} else {\n\t\t\treturn DUK_FP_SUBNORMAL;\n\t\t}\n\t} else {\n\t\t/* expt 0xfff is infinite/nan */\n\t\tif (mzero) {\n\t\t\treturn DUK_FP_INFINITE;\n\t\t} else {\n\t\t\treturn DUK_FP_NAN;\n\t\t}\n\t}\n}\n#endif\n\n#if defined(DUK_USE_REPL_SIGNBIT)\nDUK_INTERNAL int duk_repl_signbit(double x) {\n\tduk_double_union u;\n\tu.d = x;\n\treturn (int) (u.uc[DUK_DBL_IDX_UC0] & 0x80UL);\n}\n#endif\n\n#if defined(DUK_USE_REPL_ISFINITE)\nDUK_INTERNAL int duk_repl_isfinite(double x) {\n\tint c = DUK_FPCLASSIFY(x);\n\tif (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {\n\t\treturn 0;\n\t} else {\n\t\treturn 1;\n\t}\n}\n#endif\n\n#if defined(DUK_USE_REPL_ISNAN)\nDUK_INTERNAL int duk_repl_isnan(double x) {\n\tint c = DUK_FPCLASSIFY(x);\n\treturn (c == DUK_FP_NAN);\n}\n#endif\n\n#if defined(DUK_USE_REPL_ISINF)\nDUK_INTERNAL int duk_repl_isinf(double x) {\n\tint c = DUK_FPCLASSIFY(x);\n\treturn (c == DUK_FP_INFINITE);\n}\n#endif\n#line 1 \"duk_debug_macros.c\"\n/*\n *  Debugging macro calls.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_DEBUG)\n\n/*\n *  Debugging enabled\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdarg.h>\n\n#if !defined(DUK_USE_DEBUG_WRITE)\n#error debugging enabled (DUK_USE_DEBUG) but DUK_USE_DEBUG_WRITE not defined\n#endif\n\n#define DUK__DEBUG_BUFSIZE  DUK_USE_DEBUG_BUFSIZE\n\n#if defined(DUK_USE_VARIADIC_MACROS)\n\nDUK_INTERNAL void duk_debug_log(duk_int_t level, const char *file, duk_int_t line, const char *func, const char *fmt, ...) {\n\tva_list ap;\n\tlong arg_level;\n\tconst char *arg_file;\n\tlong arg_line;\n\tconst char *arg_func;\n\tconst char *arg_msg;\n\tchar buf[DUK__DEBUG_BUFSIZE];\n\n\tva_start(ap, fmt);\n\n\tDUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE);\n\tduk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap);\n\n\targ_level = (long) level;\n\targ_file = (const char *) file;\n\targ_line = (long) line;\n\targ_func = (const char *) func;\n\targ_msg = (const char *) buf;\n\tDUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg);\n\n\tva_end(ap);\n}\n\n#else  /* DUK_USE_VARIADIC_MACROS */\n\nDUK_INTERNAL char duk_debug_file_stash[DUK_DEBUG_STASH_SIZE];\nDUK_INTERNAL duk_int_t duk_debug_line_stash;\nDUK_INTERNAL char duk_debug_func_stash[DUK_DEBUG_STASH_SIZE];\nDUK_INTERNAL duk_int_t duk_debug_level_stash;\n\nDUK_INTERNAL void duk_debug_log(const char *fmt, ...) {\n\tva_list ap;\n\tlong arg_level;\n\tconst char *arg_file;\n\tlong arg_line;\n\tconst char *arg_func;\n\tconst char *arg_msg;\n\tchar buf[DUK__DEBUG_BUFSIZE];\n\n\tva_start(ap, fmt);\n\n\tDUK_MEMZERO((void *) buf, (size_t) DUK__DEBUG_BUFSIZE);\n\tduk_debug_vsnprintf(buf, DUK__DEBUG_BUFSIZE - 1, fmt, ap);\n\n\targ_level = (long) duk_debug_level_stash;\n\targ_file = (const char *) duk_debug_file_stash;\n\targ_line = (long) duk_debug_line_stash;\n\targ_func = (const char *) duk_debug_func_stash;\n\targ_msg = (const char *) buf;\n\tDUK_USE_DEBUG_WRITE(arg_level, arg_file, arg_line, arg_func, arg_msg);\n\n\tva_end(ap);\n}\n\n#endif  /* DUK_USE_VARIADIC_MACROS */\n\n#else  /* DUK_USE_DEBUG */\n\n/*\n *  Debugging disabled\n */\n\n#endif  /* DUK_USE_DEBUG */\n\n/* automatic undefs */\n#undef DUK__DEBUG_BUFSIZE\n#line 1 \"duk_builtins.c\"\n/*\n *  Automatically generated by genbuiltins.py, do not edit!\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_ASSERTIONS)\n#define DUK__REFCINIT(refc) 0 /*h_assert_refcount*/, (refc) /*actual*/\n#else\n#define DUK__REFCINIT(refc) (refc) /*actual*/\n#endif\n\n#if defined(DUK_USE_ROM_STRINGS)\n#error ROM support not enabled, rerun configure.py with --rom-support\n#else  /* DUK_USE_ROM_STRINGS */\nDUK_INTERNAL const duk_uint8_t duk_strings_data[892] = {\n79,40,209,144,168,105,6,78,54,139,89,185,44,48,46,90,120,8,154,140,35,103,\n35,113,193,73,5,52,112,180,104,166,135,52,188,4,98,12,27,146,156,80,211,31,\n129,115,150,64,52,220,109,24,18,68,156,24,38,67,114,36,55,9,119,151,132,\n140,93,18,113,128,153,201,212,201,205,2,248,8,196,24,224,104,82,146,40,224,\n193,48,114,168,37,147,196,54,123,28,4,98,12,43,148,67,103,177,192,70,32,\n196,121,68,54,123,28,18,192,199,144,124,4,98,12,43,136,108,244,117,184,8,\n196,24,95,40,134,207,71,91,128,140,65,133,113,13,158,158,151,1,24,131,11,\n229,16,217,233,233,112,17,136,48,206,21,110,4,244,244,184,8,196,24,103,10,\n183,2,122,218,156,4,98,12,24,203,112,64,179,113,193,79,8,218,155,131,32,\n184,70,212,220,13,10,82,68,252,123,144,217,146,38,228,207,18,0,100,37,64,\n178,212,11,161,17,104,162,96,10,200,193,57,165,65,169,16,5,100,81,27,70,18,\n32,10,200,68,185,13,116,221,197,184,64,89,57,41,197,13,49,234,5,208,156,\n113,87,55,118,147,20,187,56,161,166,92,221,212,73,210,236,226,134,153,115,\n119,76,201,203,179,138,26,99,73,212,136,136,164,25,174,137,56,32,72,137,\n101,23,52,45,13,34,86,9,79,136,104,201,114,149,96,52,138,134,140,151,75,\n226,233,186,120,121,22,39,54,83,141,5,55,68,236,36,164,3,16,225,115,150,64,\n52,205,163,2,72,154,83,138,26,99,75,12,11,150,103,5,36,20,211,70,140,133,\n67,72,49,241,160,227,81,196,52,168,106,39,132,252,183,136,105,80,212,79,2,\n249,110,128,126,88,95,133,109,237,237,237,151,235,127,46,249,119,203,190,\n186,206,33,181,2,208,61,190,12,19,34,65,19,81,132,108,228,97,1,107,33,12,\n32,45,100,137,64,247,175,9,19,155,41,198,130,155,134,69,146,100,227,226,\n231,146,51,192,204,73,140,224,145,221,102,241,68,196,157,34,79,143,139,166,\n233,225,228,227,138,157,173,167,197,211,118,214,210,38,238,74,113,67,76,\n105,187,169,147,154,73,225,228,32,193,48,25,100,105,166,113,200,147,44,166,\n1,40,79,18,150,134,147,141,163,2,72,171,115,147,136,4,65,130,96,35,64,194,\n32,168,89,56,208,48,135,123,144,217,146,39,220,228,193,19,18,101,220,227,\n73,121,167,115,129,196,200,39,12,136,220,225,93,22,1,114,62,231,42,8,176,\n15,62,231,36,234,68,68,70,231,30,45,37,161,164,38,231,24,7,159,115,149,4,\n72,218,171,115,133,67,64,180,100,145,54,231,42,5,208,135,19,152,244,44,133,\n67,95,73,164,145,143,5,18,2,100,65,35,30,76,241,117,134,70,212,103,37,204,\n16,72,154,218,130,77,196,145,63,127,123,106,141,25,11,189,243,169,198,132,\n251,235,119,247,182,154,6,239,124,234,113,161,62,250,221,253,237,164,52,\n187,223,58,156,104,79,190,187,127,123,105,168,105,119,190,117,56,208,159,\n125,118,254,246,209,104,209,111,124,234,113,161,62,250,205,253,162,209,162,\n249,212,227,66,125,244,161,137,0,162,8,18,33,68,9,136,232,19,155,52,54,132,\n64,200,26,24,196,137,198,66,130,139,153,134,69,146,100,16,220,66,46,68,57,\n80,208,45,120,25,93,20,22,141,20,208,230,137,5,18,26,164,54,83,3,68,71,20,\n109,37,141,18,78,145,105,165,100,76,71,36,206,137,22,103,139,172,57,199,6,\n158,30,71,20,117,4,74,39,54,83,37,92,129,150,199,66,200,75,34,103,40,150,9,\n72,132,109,24,98,93,238,140,206,75,204,141,28,140,134,61,209,153,101,71,\n146,36,109,22,178,78,52,33,74,5,200,138,67,30,178,48,141,156,146,134,204,\n145,40,4,65,172,147,59,192,37,0,196,59,226,138,130,100,75,226,233,144,83,\n32,204,250,5,104,17,165,48,77,2,46,16,69,140,\n};\n#endif  /* DUK_USE_ROM_STRINGS */\n\n#if defined(DUK_USE_ROM_OBJECTS)\n#error ROM support not enabled, rerun configure.py with --rom-support\n#else  /* DUK_USE_ROM_OBJECTS */\n/* native functions: 176 */\nDUK_INTERNAL const duk_c_function duk_bi_native_functions[176] = {\n\tNULL,\n\tduk_bi_array_constructor,\n\tduk_bi_array_constructor_is_array,\n\tduk_bi_array_prototype_concat,\n\tduk_bi_array_prototype_indexof_shared,\n\tduk_bi_array_prototype_iter_shared,\n\tduk_bi_array_prototype_join_shared,\n\tduk_bi_array_prototype_pop,\n\tduk_bi_array_prototype_push,\n\tduk_bi_array_prototype_reduce_shared,\n\tduk_bi_array_prototype_reverse,\n\tduk_bi_array_prototype_shift,\n\tduk_bi_array_prototype_slice,\n\tduk_bi_array_prototype_sort,\n\tduk_bi_array_prototype_splice,\n\tduk_bi_array_prototype_to_string,\n\tduk_bi_array_prototype_unshift,\n\tduk_bi_arraybuffer_constructor,\n\tduk_bi_arraybuffer_isview,\n\tduk_bi_boolean_constructor,\n\tduk_bi_boolean_prototype_tostring_shared,\n\tduk_bi_buffer_compare_shared,\n\tduk_bi_buffer_readfield,\n\tduk_bi_buffer_slice_shared,\n\tduk_bi_buffer_writefield,\n\tduk_bi_dataview_constructor,\n\tduk_bi_date_constructor,\n\tduk_bi_date_constructor_now,\n\tduk_bi_date_constructor_parse,\n\tduk_bi_date_constructor_utc,\n\tduk_bi_date_prototype_get_shared,\n\tduk_bi_date_prototype_get_timezone_offset,\n\tduk_bi_date_prototype_set_shared,\n\tduk_bi_date_prototype_set_time,\n\tduk_bi_date_prototype_to_json,\n\tduk_bi_date_prototype_tostring_shared,\n\tduk_bi_date_prototype_value_of,\n\tduk_bi_duktape_object_act,\n\tduk_bi_duktape_object_compact,\n\tduk_bi_duktape_object_dec,\n\tduk_bi_duktape_object_enc,\n\tduk_bi_duktape_object_fin,\n\tduk_bi_duktape_object_gc,\n\tduk_bi_duktape_object_info,\n\tduk_bi_error_constructor_shared,\n\tduk_bi_error_prototype_filename_getter,\n\tduk_bi_error_prototype_filename_setter,\n\tduk_bi_error_prototype_linenumber_getter,\n\tduk_bi_error_prototype_linenumber_setter,\n\tduk_bi_error_prototype_stack_getter,\n\tduk_bi_error_prototype_stack_setter,\n\tduk_bi_error_prototype_to_string,\n\tduk_bi_function_constructor,\n\tduk_bi_function_prototype,\n\tduk_bi_function_prototype_apply,\n\tduk_bi_function_prototype_bind,\n\tduk_bi_function_prototype_call,\n\tduk_bi_function_prototype_to_string,\n\tduk_bi_global_object_decode_uri,\n\tduk_bi_global_object_decode_uri_component,\n\tduk_bi_global_object_encode_uri,\n\tduk_bi_global_object_encode_uri_component,\n\tduk_bi_global_object_escape,\n\tduk_bi_global_object_eval,\n\tduk_bi_global_object_is_finite,\n\tduk_bi_global_object_is_nan,\n\tduk_bi_global_object_parse_float,\n\tduk_bi_global_object_parse_int,\n\tduk_bi_global_object_unescape,\n\tduk_bi_json_object_parse,\n\tduk_bi_json_object_stringify,\n\tduk_bi_math_object_clz32,\n\tduk_bi_math_object_hypot,\n\tduk_bi_math_object_imul,\n\tduk_bi_math_object_max,\n\tduk_bi_math_object_min,\n\tduk_bi_math_object_onearg_shared,\n\tduk_bi_math_object_random,\n\tduk_bi_math_object_sign,\n\tduk_bi_math_object_twoarg_shared,\n\tduk_bi_native_function_length,\n\tduk_bi_native_function_name,\n\tduk_bi_nodejs_buffer_byte_length,\n\tduk_bi_nodejs_buffer_concat,\n\tduk_bi_nodejs_buffer_constructor,\n\tduk_bi_nodejs_buffer_copy,\n\tduk_bi_nodejs_buffer_fill,\n\tduk_bi_nodejs_buffer_is_buffer,\n\tduk_bi_nodejs_buffer_is_encoding,\n\tduk_bi_nodejs_buffer_tojson,\n\tduk_bi_nodejs_buffer_tostring,\n\tduk_bi_nodejs_buffer_write,\n\tduk_bi_number_constructor,\n\tduk_bi_number_prototype_to_exponential,\n\tduk_bi_number_prototype_to_fixed,\n\tduk_bi_number_prototype_to_locale_string,\n\tduk_bi_number_prototype_to_precision,\n\tduk_bi_number_prototype_to_string,\n\tduk_bi_number_prototype_value_of,\n\tduk_bi_object_constructor,\n\tduk_bi_object_constructor_assign,\n\tduk_bi_object_constructor_create,\n\tduk_bi_object_constructor_define_properties,\n\tduk_bi_object_constructor_define_property,\n\tduk_bi_object_constructor_get_own_property_descriptor,\n\tduk_bi_object_constructor_is,\n\tduk_bi_object_constructor_is_extensible,\n\tduk_bi_object_constructor_is_sealed_frozen_shared,\n\tduk_bi_object_constructor_keys_shared,\n\tduk_bi_object_constructor_prevent_extensions,\n\tduk_bi_object_constructor_seal_freeze_shared,\n\tduk_bi_object_getprototype_shared,\n\tduk_bi_object_prototype_defineaccessor,\n\tduk_bi_object_prototype_has_own_property,\n\tduk_bi_object_prototype_is_prototype_of,\n\tduk_bi_object_prototype_lookupaccessor,\n\tduk_bi_object_prototype_property_is_enumerable,\n\tduk_bi_object_prototype_to_locale_string,\n\tduk_bi_object_prototype_to_string,\n\tduk_bi_object_prototype_value_of,\n\tduk_bi_object_setprototype_shared,\n\tduk_bi_performance_now,\n\tduk_bi_pointer_constructor,\n\tduk_bi_pointer_prototype_tostring_shared,\n\tduk_bi_proxy_constructor,\n\tduk_bi_reflect_apply,\n\tduk_bi_reflect_construct,\n\tduk_bi_reflect_object_delete_property,\n\tduk_bi_reflect_object_get,\n\tduk_bi_reflect_object_has,\n\tduk_bi_reflect_object_set,\n\tduk_bi_regexp_constructor,\n\tduk_bi_regexp_prototype_exec,\n\tduk_bi_regexp_prototype_flags,\n\tduk_bi_regexp_prototype_shared_getter,\n\tduk_bi_regexp_prototype_test,\n\tduk_bi_regexp_prototype_tostring,\n\tduk_bi_string_constructor,\n\tduk_bi_string_constructor_from_char_code,\n\tduk_bi_string_constructor_from_code_point,\n\tduk_bi_string_prototype_caseconv_shared,\n\tduk_bi_string_prototype_char_at,\n\tduk_bi_string_prototype_char_code_at,\n\tduk_bi_string_prototype_concat,\n\tduk_bi_string_prototype_includes,\n\tduk_bi_string_prototype_indexof_shared,\n\tduk_bi_string_prototype_locale_compare,\n\tduk_bi_string_prototype_match,\n\tduk_bi_string_prototype_repeat,\n\tduk_bi_string_prototype_replace,\n\tduk_bi_string_prototype_search,\n\tduk_bi_string_prototype_slice,\n\tduk_bi_string_prototype_split,\n\tduk_bi_string_prototype_startswith_endswith,\n\tduk_bi_string_prototype_substr,\n\tduk_bi_string_prototype_substring,\n\tduk_bi_string_prototype_to_string,\n\tduk_bi_string_prototype_trim,\n\tduk_bi_textdecoder_constructor,\n\tduk_bi_textdecoder_prototype_decode,\n\tduk_bi_textdecoder_prototype_shared_getter,\n\tduk_bi_textencoder_constructor,\n\tduk_bi_textencoder_prototype_encode,\n\tduk_bi_textencoder_prototype_encoding_getter,\n\tduk_bi_thread_constructor,\n\tduk_bi_thread_current,\n\tduk_bi_thread_resume,\n\tduk_bi_thread_yield,\n\tduk_bi_type_error_thrower,\n\tduk_bi_typedarray_buffer_getter,\n\tduk_bi_typedarray_bytelength_getter,\n\tduk_bi_typedarray_byteoffset_getter,\n\tduk_bi_typedarray_constructor,\n\tduk_bi_typedarray_set,\n\tduk_bi_uint8array_allocplain,\n\tduk_bi_uint8array_plainof,\n};\n#if defined(DUK_USE_DOUBLE_LE)\nDUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = {\n144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242,\n252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33,\n167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228,\n64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46,\n142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240,\n242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0,\n1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132,\n33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17,\n13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192,\n0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188,\n0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85,\n217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225,\n146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,0,0,\n0,0,3,225,255,51,0,0,0,0,0,0,3,193,255,47,18,1,172,19,120,71,10,25,196,136,\n113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,2,\n185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,130,\n249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,138,\n9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,190,15,\n38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,53,64,\n243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,124,\n35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,116,\n88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,240,70,\n68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,51,132,\n9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,105,27,\n60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,117,204,\n123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,65,112,\n152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,39,199,\n89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,58,205,\n227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,133,18,\n2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,39,31,23,\n60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,18,84,141,\n159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,194,197,\n217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,32,130,\n166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,151,21,0,\n100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,214,111,\n31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,10,62,\n46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,52,\n156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142,\n214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173,\n165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6,\n143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62,\n180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129,\n54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0,\n178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87,\n129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104,\n201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71,\n132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232,\n46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35,\n193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194,\n133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56,\n9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14,\n134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184,\n64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6,\n145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67,\n77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113,\n110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113,\n110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2,\n127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4,\n33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207,\n4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,255,255,255,255,\n239,127,19,214,33,187,85,2,232,72,0,32,0,0,0,0,0,0,25,136,0,0,0,0,0,0,31,\n15,228,122,247,73,19,69,73,180,134,149,13,68,241,0,0,0,0,0,0,3,193,252,143,\n90,67,2,104,169,54,144,210,161,168,158,32,0,0,0,0,0,0,120,127,142,73,78,20,\n0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68,\n13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,\n222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,\n112,164,0,0,0,0,0,0,124,63,226,117,119,128,25,55,112,96,153,57,41,197,13,\n53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,\n22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,\n113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,\n97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,\n190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,\n206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,\n76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,\n39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,\n39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,\n163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,\n100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,\n11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,\n157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,\n178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,\n9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,\n49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,\n34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,\n137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,\n199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,\n147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,\n54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,\n7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,\n89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,\n131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,\n231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,\n228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,\n235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,\n64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,\n168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,\n19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,0,0,0,0,0,93,105,160,91,\n60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168,\n110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115,\n36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145,\n139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166,\n28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145,\n92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41,\n100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177,\n69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99,\n68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9,\n49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20,\n98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36,\n249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242,\n136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229,\n16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39,\n194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68,\n89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,104,71,161,196,201,45,167,146,59,\n68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,136,71,161,196,201,45,167,146,\n59,68,89,24,70,206,0,0,0,0,0,0,7,129,249,153,51,168,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,200,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,0,0,0,0,2,1,153,51,232,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,8,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,40,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,0,0,0,0,130,1,153,52,72,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,0,0,0,1,2,1,135,52,102,32,76,72,1,246,136,235,\n103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91,\n171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13,\n158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1,\n246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161,\n37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79,\n75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112,\n39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186,\n129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237,\n17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134,\n207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134,\n207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38,\n78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213,\n146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39,\n104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208,\n146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16,\n217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101,\n162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201,\n77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68,\n117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104,\n162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123,\n102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160,\n72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,\n52,171,138,69,133,95,130,160,4,234,219,163,161,0,89,86,214,238,197,172,9,0,\n31,86,221,40,29,231,63,95,200,69,220,199,225,122,183,27,72,144,63,160,138,\n217,81,197,125,207,195,117,110,54,142,129,32,7,114,147,10,189,229,237,159,\n130,235,209,0,96,181,17,83,236,132,37,0,63,101,8,207,71,107,74,6,105,219,\n251,52,245,7,49,248,94,202,17,158,148,12,211,183,246,105,234,15,99,242,159,\n129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160,\n192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152,\n27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163,\n32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72,\n188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29,\n13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205,\n72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80,\n81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128,\n153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9,\n128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203,\n164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113,\n120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17,\n16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94,\n100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14,\n108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7,\n10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227,\n138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43,\n80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178,\n48,141,156,0,0,0,0,0,0,15,3,243,49,135,16,143,67,137,146,91,79,36,118,136,\n178,48,141,156,0,0,0,0,0,0,15,3,245,20,5,173,194,227,214,4,55,0,0,21,196,7,\n122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180,\n69,145,132,108,224,0,0,0,0,0,0,120,31,153,140,72,132,122,28,76,146,218,121,\n35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,80,132,122,28,76,146,218,\n121,35,180,69,145,132,108,224,0,0,0,0,0,0,0,32,25,140,88,132,122,28,76,146,\n218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,96,132,122,28,76,\n146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,104,132,122,\n28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,8,32,25,140,112,\n132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,0,0,0,0,16,32,16,\n113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224,\n104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131,\n165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3,\n154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232,\n147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0,\n};\n#elif defined(DUK_USE_DOUBLE_BE)\nDUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = {\n144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242,\n252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33,\n167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228,\n64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46,\n142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240,\n242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0,\n1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132,\n33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17,\n13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192,\n0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188,\n0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85,\n217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225,\n146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,1,255,\n224,0,0,0,0,0,3,51,1,255,192,0,0,0,0,0,3,47,18,1,172,19,120,71,10,25,196,\n136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,\n2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,\n130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,\n138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,\n190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,\n53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,\n124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,\n116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,\n240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,\n51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,\n105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,\n117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,\n65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,\n39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,\n58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,\n133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,\n39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,\n18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,\n194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,\n32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,\n151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,\n214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,\n10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,\n52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142,\n214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173,\n165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6,\n143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62,\n180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129,\n54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0,\n178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87,\n129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104,\n201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71,\n132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232,\n46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35,\n193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194,\n133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56,\n9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14,\n134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184,\n64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6,\n145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67,\n77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113,\n110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113,\n110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2,\n127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4,\n33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207,\n4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,127,239,255,255,255,255,\n255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,0,0,0,57,136,15,255,0,0,0,0,0,\n0,4,122,247,73,19,69,73,180,134,149,13,68,241,1,255,192,0,0,0,0,0,0,143,90,\n67,2,104,169,54,144,210,161,168,158,32,127,248,0,0,0,0,0,0,14,73,78,20,0,0,\n0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,68,13,\n155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,222,\n17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,112,\n164,63,252,0,0,0,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13,53,224,\n65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,22,78,\n12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,113,67,\n77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,97,47,\n128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,190,\n96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,206,\n185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,76,\n150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,39,\n195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,39,\n198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,163,\n18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,100,40,\n15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,11,90,\n36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,157,160,\n3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,178,166,\n74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,9,205,\n28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,49,13,\n164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,34,79,\n135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,137,62,\n12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,199,54,\n103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,147,225,\n104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,54,223,\n224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,7,38,\n193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,89,\n252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,131,\n64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,231,\n197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,228,\n74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,235,1,\n64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,64,\n174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,168,\n167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,19,\n177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,32,105,221,0,0,0,0,0,91,60,\n149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168,110,\n20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115,36,14,\n100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145,139,\n163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166,28,1,\n204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145,92,\n203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41,100,\n73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177,69,\n49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99,68,\n152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9,49,\n39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20,98,\n79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36,249,\n68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242,136,\n108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229,16,\n217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39,194,\n173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68,89,24,\n70,206,1,255,128,0,0,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59,68,89,\n24,70,206,1,255,128,0,0,0,0,0,1,153,51,136,71,161,196,201,45,167,146,59,68,\n89,24,70,206,1,255,128,0,0,0,0,0,1,153,51,168,71,161,196,201,45,167,146,59,\n68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,200,71,161,196,201,45,167,146,59,\n68,89,24,70,206,2,0,0,0,0,0,0,0,1,153,51,232,71,161,196,201,45,167,146,59,\n68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,8,71,161,196,201,45,167,146,59,\n68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,40,71,161,196,201,45,167,146,59,\n68,89,24,70,206,2,0,128,0,0,0,0,0,1,153,52,72,71,161,196,201,45,167,146,59,\n68,89,24,70,206,2,1,0,0,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235,103,\n177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91,171,37,\n20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13,158,142,\n183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1,246,136,\n235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161,37,20,\n138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79,75,161,\n37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112,39,208,\n146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186,129,89,\n58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237,17,214,\n207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134,207,\n161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134,207,\n98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38,78,\n209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213,146,\n155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39,104,\n142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208,146,\n155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16,217,\n233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101,162,\n137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201,77,\n156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68,117,\n179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104,162,\n100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123,102,\n53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160,72,\n16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,32,2,\n223,133,69,138,43,180,132,234,219,163,161,1,0,9,174,198,238,213,84,88,31,\n86,221,40,7,252,197,200,95,223,71,61,225,122,183,27,72,144,15,253,197,81,\n217,74,224,191,131,117,110,54,142,129,32,31,237,229,189,138,147,114,135,2,\n235,209,1,0,36,135,237,81,16,180,96,63,101,8,207,71,107,74,1,255,53,4,243,\n51,249,222,104,94,202,17,158,148,3,255,106,9,230,103,243,188,210,159,129,\n228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160,192,25,\n106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152,27,165,\n171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163,32,24,\n157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72,188,8,\n134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29,13,65,\n74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205,72,1,\n98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80,81,\n129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128,153,\n78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9,128,0,\n10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203,164,237,\n35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113,120,96,\n196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17,16,113,\n137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94,100,108,\n144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14,108,185,\n36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7,10,4,28,\n200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227,138,89,\n18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43,80,17,42,\n4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178,48,141,156,\n3,255,0,0,0,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136,178,48,141,\n156,3,255,0,0,0,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7,122,192,134,\n241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180,69,145,132,\n108,224,31,248,0,0,0,0,0,0,25,140,72,132,122,28,76,146,218,121,35,180,69,\n145,132,108,224,32,0,0,0,0,0,0,0,25,140,80,132,122,28,76,146,218,121,35,\n180,69,145,132,108,224,32,0,0,0,0,0,0,0,25,140,88,132,122,28,76,146,218,\n121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,96,132,122,28,76,146,\n218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,104,132,122,28,\n76,146,218,121,35,180,69,145,132,108,224,32,8,0,0,0,0,0,0,25,140,112,132,\n122,28,76,146,218,121,35,180,69,145,132,108,224,32,16,0,0,0,0,0,0,16,113,\n225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,18,224,104,\n82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,70,131,165,\n1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,7,78,3,154,\n102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,232,147,\n161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0,\n};\n#elif defined(DUK_USE_DOUBLE_ME)\nDUK_INTERNAL const duk_uint8_t duk_builtins_data[3972] = {\n144,148,105,223,160,68,52,228,62,12,104,200,165,132,52,167,194,138,105,242,\n252,57,28,211,57,18,64,52,238,62,44,138,111,171,241,164,19,87,125,30,33,\n167,16,145,159,8,211,136,9,225,42,5,240,145,139,163,163,8,211,136,10,228,\n64,211,19,132,140,93,29,56,70,156,64,119,34,66,146,36,104,137,194,70,46,\n142,172,35,78,32,47,146,195,102,11,240,145,139,163,175,8,211,136,9,228,240,\n242,112,145,139,163,179,8,211,136,8,237,34,130,118,49,116,118,225,26,48,0,\n1,80,29,201,158,46,183,39,135,147,132,140,93,16,132,76,66,33,8,66,16,132,\n33,8,66,34,33,154,112,0,1,73,247,35,79,91,237,198,174,192,47,31,23,95,17,\n13,51,19,35,93,68,216,209,128,0,10,192,174,79,15,32,248,8,196,24,8,107,192,\n0,5,98,118,27,94,0,0,43,19,227,94,0,0,43,20,46,215,128,0,10,197,28,198,188,\n0,0,86,41,100,53,224,0,2,177,79,85,175,0,0,21,138,154,45,120,0,0,172,85,\n217,107,192,0,5,98,182,243,86,193,106,52,127,66,249,50,94,124,35,68,225,\n146,49,13,31,170,23,201,146,243,224,200,39,12,145,136,67,134,11,49,0,0,3,\n225,252,0,0,0,3,51,0,0,3,193,252,0,0,0,3,47,18,1,172,19,120,71,10,25,196,\n136,113,162,156,136,199,42,57,204,144,115,132,240,149,2,248,72,197,209,58,\n2,185,16,52,196,225,35,23,68,233,14,228,72,82,68,141,17,56,72,197,209,58,\n130,249,44,54,96,191,9,24,186,39,88,79,39,135,147,132,140,93,19,176,35,180,\n138,9,216,197,209,59,82,79,31,40,242,1,248,58,42,96,121,14,232,94,62,46,\n190,15,38,31,145,33,86,65,76,242,150,143,69,48,242,179,79,45,56,243,51,207,\n53,64,243,116,79,57,72,243,180,207,61,80,243,245,79,65,88,244,34,249,50,94,\n124,35,68,225,146,39,163,23,201,146,243,224,200,39,12,145,61,40,183,146,37,\n116,88,6,136,158,244,241,174,230,202,80,135,130,50,39,16,217,231,208,20,\n240,70,68,225,86,224,79,60,64,84,75,141,7,27,157,32,66,37,194,161,168,153,\n51,132,9,25,4,225,147,180,138,50,196,18,25,4,225,147,180,138,5,215,49,238,\n105,27,60,185,2,72,209,56,100,237,34,140,193,4,136,209,56,100,237,34,129,\n117,204,123,154,70,207,50,64,98,72,64,121,51,68,8,163,73,33,1,228,208,16,0,\n65,112,152,56,196,159,31,23,77,211,195,201,199,23,150,73,169,234,34,24,49,\n39,199,89,188,124,92,242,70,120,224,201,33,69,15,155,163,196,64,153,137,62,\n58,205,227,226,231,146,51,199,26,6,18,92,130,64,192,148,144,102,240,23,129,\n133,18,2,100,224,160,56,100,42,26,78,62,46,121,35,60,112,216,32,50,21,13,\n39,31,23,60,145,154,9,46,18,1,36,64,47,148,64,98,196,132,201,57,68,132,95,\n18,84,141,159,9,121,145,178,67,155,46,73,2,17,46,72,128,89,7,199,32,66,37,\n194,197,217,35,120,228,131,17,46,18,243,35,100,128,172,156,98,2,40,152,151,\n32,130,166,36,248,235,55,143,139,158,72,207,28,150,24,23,46,92,130,80,72,\n151,21,0,100,213,103,229,245,8,186,190,144,24,78,136,24,94,152,3,142,9,113,\n214,111,31,23,60,145,158,57,164,13,68,184,248,186,110,158,30,78,56,188,226,\n10,62,46,121,35,60,113,18,225,27,70,18,32,10,201,208,32,134,214,208,200,84,\n52,156,49,39,50,71,107,107,152,129,13,173,161,144,168,105,57,34,78,100,142,\n214,215,49,16,134,214,210,220,229,81,252,49,39,50,71,107,107,158,65,13,173,\n165,185,202,163,249,34,78,100,142,214,215,60,146,12,16,28,128,62,175,42,6,\n143,36,136,16,64,90,242,135,192,129,67,71,147,62,65,5,215,231,214,6,215,62,\n180,8,49,1,3,162,92,4,98,12,41,14,67,40,106,229,1,132,130,8,24,78,104,129,\n54,62,96,224,144,13,238,124,32,2,62,146,60,51,224,120,146,164,140,137,20,0,\n178,58,11,56,192,5,146,208,34,71,64,36,157,25,200,32,52,158,180,8,146,87,\n129,232,217,29,5,156,179,224,116,52,100,191,28,87,62,130,214,9,79,136,104,\n201,126,56,174,127,0,31,255,225,73,82,71,16,13,1,36,230,18,1,164,14,87,71,\n132,0,143,0,210,131,96,31,0,211,6,42,23,50,70,1,167,13,18,14,130,36,67,232,\n46,36,29,4,78,69,6,60,226,31,192,7,255,252,24,192,163,11,23,51,130,56,35,\n193,56,100,243,31,6,150,46,103,4,225,147,143,114,27,63,57,241,200,169,194,\n133,42,166,175,240,6,23,240,0,97,28,17,224,39,233,32,80,142,8,240,78,25,56,\n9,250,136,22,39,12,156,123,144,217,240,19,245,18,6,19,154,32,79,214,124,14,\n134,140,151,227,139,237,52,11,88,37,62,33,163,37,248,226,251,77,32,213,184,\n64,89,56,39,49,224,137,61,196,5,96,38,35,251,200,15,18,61,96,17,62,40,6,\n145,1,17,31,228,64,89,45,2,39,205,0,178,122,209,63,162,2,101,64,202,113,67,\n77,247,64,92,221,197,186,196,143,4,9,19,208,1,25,187,139,112,128,178,113,\n110,177,35,193,2,68,244,0,46,110,229,30,242,71,130,4,137,232,4,35,55,113,\n110,16,22,78,81,239,36,120,32,72,158,128,64,147,138,25,249,0,52,72,242,2,\n127,2,5,74,96,140,229,203,34,103,250,154,4,17,163,151,44,137,159,234,105,4,\n33,162,93,6,73,123,13,1,165,64,202,113,251,33,6,64,14,71,78,20,101,213,207,\n4,194,207,2,12,162,0,158,176,23,218,168,23,66,64,255,255,239,127,255,255,\n255,255,19,214,33,187,85,2,232,72,0,0,0,0,0,32,0,0,25,136,0,0,31,15,224,0,\n0,0,4,122,247,73,19,69,73,180,134,149,13,68,241,0,0,3,193,252,0,0,0,0,143,\n90,67,2,104,169,54,144,210,161,168,158,32,0,0,120,127,128,0,0,0,14,73,78,\n20,0,0,0,0,0,0,0,0,8,58,189,233,24,77,217,24,93,240,1,230,238,21,23,32,247,\n68,13,155,184,75,189,205,35,102,128,47,114,64,185,187,143,137,4,137,33,205,\n222,17,6,96,48,87,130,50,37,114,1,246,147,21,143,224,54,186,213,128,114,90,\n112,164,0,0,124,63,128,0,0,0,98,117,119,128,25,55,112,96,153,57,41,197,13,\n53,224,65,147,119,38,134,19,146,156,80,211,94,5,194,94,6,37,55,113,110,16,\n22,78,12,19,39,37,56,161,166,188,14,74,110,226,220,32,44,156,154,24,78,74,\n113,67,77,120,32,97,175,4,28,61,224,133,172,186,70,22,248,1,204,73,242,104,\n97,47,128,44,196,159,11,69,175,152,32,35,100,33,142,49,39,218,76,69,237,22,\n190,96,128,141,144,136,32,196,159,24,230,204,246,66,40,179,18,125,164,196,\n206,185,179,61,144,140,28,196,159,6,9,146,200,71,20,98,79,180,152,135,208,\n76,150,66,64,99,18,124,24,49,100,36,137,49,39,218,76,67,232,49,100,37,8,49,\n39,195,186,145,149,144,150,44,196,159,105,49,31,174,164,101,100,38,10,49,\n39,198,33,180,153,37,100,38,141,49,39,218,76,76,234,27,73,146,86,66,112,\n163,18,124,145,4,230,142,86,66,120,211,18,125,164,197,46,144,78,104,229,\n100,40,15,49,39,198,33,107,68,136,39,52,114,178,20,73,24,147,237,38,38,117,\n11,90,36,65,57,163,149,144,164,68,196,159,38,134,19,46,105,56,226,150,68,\n157,160,3,200,147,228,208,194,92,32,124,137,62,49,11,90,36,65,57,163,149,\n178,166,74,68,159,105,49,51,168,90,209,34,9,205,28,173,149,65,82,36,249,34,\n9,205,28,173,175,170,54,68,159,105,49,75,164,19,154,57,91,95,88,84,137,62,\n49,13,164,201,43,111,235,141,145,39,218,76,76,234,27,73,146,86,223,216,17,\n34,79,135,117,35,43,115,236,139,145,39,218,76,71,235,169,25,91,159,104,60,\n137,62,12,19,37,178,182,42,68,159,105,49,15,160,153,45,149,193,18,36,248,\n199,54,103,182,190,232,185,18,125,164,196,206,185,179,61,181,247,133,200,\n147,225,104,181,243,4,4,109,191,190,58,68,159,105,49,23,180,90,249,130,2,\n54,223,224,67,152,147,230,8,8,217,12,16,121,18,124,193,1,27,101,131,131,56,\n7,38,193,198,72,0,0,0,0,0,0,0,0,198,231,240,134,39,63,136,151,95,63,136,49,\n89,252,66,98,243,248,133,96,132,185,5,224,32,36,201,41,248,200,213,249,0,\n131,64,7,39,192,218,148,124,137,74,216,231,198,227,141,182,124,78,40,217,\n231,197,227,4,213,227,192,159,72,10,5,21,218,138,120,74,129,124,36,98,232,\n228,74,81,62,160,20,10,107,181,21,114,32,105,137,194,70,46,142,68,165,19,\n235,1,64,170,187,81,119,34,66,146,36,104,137,194,70,46,142,68,165,19,236,1,\n64,174,187,81,95,37,134,204,23,225,35,23,71,34,82,137,246,128,160,89,93,\n168,167,147,195,201,194,70,46,142,68,165,19,238,1,64,182,187,81,71,105,20,\n19,177,139,163,145,41,68,16,7,6,15,82,70,72,115,96,0,93,105,160,0,0,0,0,91,\n60,149,195,200,194,8,134,149,216,114,1,128,83,192,144,8,194,195,16,12,168,\n110,20,120,12,141,22,16,120,12,100,22,12,120,28,78,99,192,41,224,136,115,\n36,14,100,197,213,245,193,48,189,112,40,2,237,96,175,131,117,2,178,112,145,\n139,163,145,131,114,70,46,142,218,27,182,72,197,209,219,56,26,53,161,166,\n28,1,204,178,10,14,38,78,44,141,52,207,31,0,0,21,64,129,100,180,8,148,145,\n92,203,176,160,226,100,226,200,211,76,241,240,0,1,84,2,131,137,147,142,41,\n100,73,199,192,0,5,88,6,13,10,82,70,62,0,0,42,66,88,115,18,124,67,103,177,\n69,49,130,12,73,242,136,108,246,40,165,177,6,36,248,134,207,71,90,138,99,\n68,152,147,229,16,217,232,235,81,75,130,12,73,241,13,158,158,149,20,199,9,\n49,39,202,33,179,211,210,162,151,69,24,147,225,86,224,79,79,74,138,94,20,\n98,79,133,91,129,61,109,74,41,124,60,137,62,33,179,216,166,216,193,18,36,\n249,68,54,123,20,218,216,137,18,124,67,103,163,173,77,177,162,100,73,242,\n136,108,244,117,169,181,193,18,36,248,134,207,79,74,155,99,132,200,147,229,\n16,217,233,233,83,107,162,164,73,240,171,112,39,167,165,77,175,10,145,39,\n194,173,192,158,182,165,54,191,153,51,72,71,161,196,201,45,167,146,59,68,\n89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,104,71,161,196,201,45,167,146,59,\n68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,136,71,161,196,201,45,167,146,\n59,68,89,24,70,206,0,0,7,129,248,0,0,0,1,153,51,168,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,200,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,2,0,0,0,0,1,153,51,232,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,8,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,40,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,0,130,0,0,0,0,1,153,52,72,71,161,196,201,45,167,\n146,59,68,89,24,70,206,0,0,1,2,0,0,0,0,1,135,52,102,32,76,72,1,246,136,235,\n103,177,69,1,17,32,7,196,54,123,20,82,88,200,144,3,237,17,214,207,71,91,\n171,37,20,65,145,32,7,218,35,173,158,142,183,66,74,41,16,92,72,1,241,13,\n158,142,183,86,74,41,48,92,72,1,241,13,158,142,183,66,74,41,80,100,72,1,\n246,136,235,103,167,165,213,146,138,40,200,144,3,237,17,214,207,79,75,161,\n37,20,138,46,36,0,248,134,207,79,75,171,37,20,154,46,36,0,248,134,207,79,\n75,161,37,20,170,46,36,0,248,85,184,19,234,201,69,24,92,72,1,240,171,112,\n39,208,146,138,70,25,18,0,124,27,168,21,147,171,37,20,113,145,32,7,193,186,\n129,89,58,18,81,72,226,162,64,15,180,71,91,62,172,148,90,0,168,144,3,237,\n17,214,207,161,37,22,144,38,36,0,248,134,207,171,37,22,160,38,36,0,248,134,\n207,161,37,22,176,42,209,68,201,218,35,173,158,197,54,4,218,40,153,56,134,\n207,98,155,75,27,104,162,100,237,17,214,207,71,91,171,37,54,65,182,138,38,\n78,209,29,108,244,117,186,18,83,104,131,45,20,76,156,67,103,163,173,213,\n146,155,76,25,104,162,100,226,27,61,29,110,132,148,218,160,219,69,19,39,\n104,142,182,122,122,93,89,41,178,141,180,81,50,118,136,235,103,167,165,208,\n146,155,69,25,104,162,100,226,27,61,61,46,172,148,218,104,203,69,19,39,16,\n217,233,233,116,36,166,213,70,90,40,153,56,85,184,19,234,201,77,152,101,\n162,137,147,133,91,129,62,132,148,218,48,219,69,19,39,6,234,5,100,234,201,\n77,156,109,162,137,147,131,117,2,178,116,36,166,209,197,218,40,153,59,68,\n117,179,234,201,78,32,11,180,81,50,118,136,235,103,208,146,156,72,21,104,\n162,100,226,27,62,172,148,226,128,171,69,19,39,16,217,244,36,167,22,53,123,\n102,53,155,80,2,21,11,94,201,128,196,133,0,185,80,32,56,156,199,130,36,160,\n72,16,78,126,54,48,5,146,208,34,82,72,1,109,20,76,155,120,28,34,1,225,32,5,\n95,130,160,52,171,138,69,132,234,219,163,161,2,197,172,9,0,89,86,214,236,\n31,86,221,40,8,69,220,199,253,231,63,95,193,122,183,27,72,144,17,197,125,\n207,255,160,138,217,67,117,110,54,142,129,32,61,229,237,159,135,114,147,10,\n130,235,209,3,236,132,37,0,96,181,17,80,63,101,8,207,71,107,74,4,245,7,49,\n254,105,219,251,48,94,202,17,158,148,9,234,15,99,252,211,183,246,98,159,\n129,228,176,192,185,127,46,155,185,41,197,13,55,38,3,127,255,20,138,160,\n192,25,106,8,8,1,58,90,130,64,128,146,27,168,37,8,9,129,186,130,96,160,152,\n27,165,171,64,32,131,25,234,10,64,65,17,11,212,19,133,18,243,167,165,163,\n32,24,157,45,65,64,6,75,191,80,80,66,149,110,116,117,5,8,41,240,247,79,72,\n188,8,134,81,122,84,1,173,198,212,20,48,139,113,180,181,5,36,42,220,109,29,\n13,65,74,6,192,95,76,188,6,196,55,78,188,6,247,91,86,136,26,32,104,220,205,\n72,1,98,234,52,122,130,136,18,72,51,117,68,3,146,27,168,40,161,37,8,207,80,\n81,129,204,13,212,20,112,179,141,26,45,65,75,112,20,43,193,25,19,66,128,\n153,78,40,105,144,92,104,152,131,124,27,253,128,0,10,116,3,68,146,163,9,\n128,0,10,102,3,138,145,137,27,60,0,0,82,129,7,2,4,16,7,2,70,143,178,203,\n164,237,35,14,25,10,134,147,143,139,158,72,207,28,54,77,47,109,13,55,113,\n120,96,196,159,29,102,241,241,115,201,25,227,131,36,133,20,62,110,143,17,\n16,113,137,62,62,46,155,167,135,147,142,47,44,151,79,221,64,98,37,194,94,\n100,108,144,21,147,140,73,168,228,19,17,124,73,82,54,124,37,230,70,201,14,\n108,185,36,155,14,243,243,83,212,69,131,132,4,12,137,114,168,37,166,145,7,\n10,4,28,200,14,12,40,56,153,56,178,52,211,60,124,0,0,85,0,160,226,100,227,\n138,89,18,113,240,0,1,86,1,131,66,148,145,143,128,0,10,144,93,134,0,0,43,\n80,17,42,4,17,136,49,73,19,49,134,16,143,67,137,146,91,79,36,118,136,178,\n48,141,156,0,0,15,3,240,0,0,0,3,49,135,16,143,67,137,146,91,79,36,118,136,\n178,48,141,156,0,0,15,3,240,0,0,0,5,20,5,173,194,227,214,4,55,0,0,21,196,7,\n122,192,134,241,197,192,0,5,121,25,140,64,132,122,28,76,146,218,121,35,180,\n69,145,132,108,224,0,0,120,31,128,0,0,0,25,140,72,132,122,28,76,146,218,\n121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,80,132,122,28,76,146,\n218,121,35,180,69,145,132,108,224,0,0,0,32,0,0,0,0,25,140,88,132,122,28,76,\n146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,96,132,122,\n28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,140,104,\n132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,8,32,0,0,0,0,25,\n140,112,132,122,28,76,146,218,121,35,180,69,145,132,108,224,0,0,16,32,0,0,\n0,0,16,113,225,0,48,156,209,2,122,244,5,34,92,35,68,225,161,166,218,16,33,\n18,224,104,82,146,59,50,5,7,19,39,22,70,154,103,215,32,28,78,99,193,18,80,\n70,131,165,1,205,34,8,35,68,225,161,166,239,255,4,12,70,137,195,39,248,73,\n7,78,3,154,102,16,70,137,195,67,77,223,248,1,74,9,129,125,255,130,9,65,154,\n232,147,161,115,59,255,5,64,195,32,156,50,126,197,14,2,3,107,173,213,0,\n};\n#else\n#error invalid endianness defines\n#endif\n#endif  /* DUK_USE_ROM_OBJECTS */\n\n/* automatic undefs */\n#undef DUK__REFCINIT\n#line 1 \"duk_error_macros.c\"\n/*\n *  Error and fatal handling.\n */\n\n/* #include duk_internal.h -> already included */\n\n#define DUK__ERRFMT_BUFSIZE  256  /* size for formatting buffers */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\nDUK_INTERNAL DUK_COLD void duk_err_handle_error_fmt(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *fmt, ...) {\n\tva_list ap;\n\tchar msg[DUK__ERRFMT_BUFSIZE];\n\tva_start(ap, fmt);\n\t(void) DUK_VSNPRINTF(msg, sizeof(msg), fmt, ap);\n\tmsg[sizeof(msg) - 1] = (char) 0;\n\tduk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL));\n\tva_end(ap);  /* dead code, but ensures portability (see Linux man page notes) */\n}\n\nDUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, const char *filename, duk_uint_t line_and_code, const char *msg) {\n\tduk_err_create_and_throw(thr, (duk_errcode_t) (line_and_code >> 24), msg, filename, (duk_int_t) (line_and_code & 0x00ffffffL));\n}\n\n#else  /* DUK_USE_VERBOSE_ERRORS */\n\nDUK_INTERNAL DUK_COLD void duk_err_handle_error(duk_hthread *thr, duk_errcode_t code) {\n\tduk_err_create_and_throw(thr, code);\n}\n\n#endif  /* DUK_USE_VERBOSE_ERRORS */\n\n/*\n *  Error throwing helpers\n */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n#if defined(DUK_USE_PARANOID_ERRORS)\nDUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) {\n\tDUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, \"%s required, found %s (stack index %ld)\",\n\t                   expect_name, duk_get_type_name(thr, idx), (long) idx);\n}\n#else\nDUK_INTERNAL DUK_COLD void duk_err_require_type_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx, const char *expect_name) {\n\tDUK_ERROR_RAW_FMT3(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, \"%s required, found %s (stack index %ld)\",\n\t                   expect_name, duk_push_string_readable(thr, idx), (long) idx);\n}\n#endif\nDUK_INTERNAL DUK_COLD void duk_err_error_internal(duk_hthread *thr, const char *filename, duk_int_t linenumber) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_INTERNAL_ERROR);\n}\nDUK_INTERNAL DUK_COLD void duk_err_error_alloc_failed(duk_hthread *thr, const char *filename, duk_int_t linenumber) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, DUK_STR_ALLOC_FAILED);\n}\nDUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_ERROR, message);\n}\nDUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr, const char *filename, duk_int_t linenumber, const char *message) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, message);\n}\nDUK_INTERNAL DUK_COLD void duk_err_range_index(duk_hthread *thr, const char *filename, duk_int_t linenumber, duk_idx_t idx) {\n\tDUK_ERROR_RAW_FMT1(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, \"invalid stack index %ld\", (long) (idx));\n}\nDUK_INTERNAL DUK_COLD void duk_err_range_push_beyond(duk_hthread *thr, const char *filename, duk_int_t linenumber) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_RANGE_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK);\n}\nDUK_INTERNAL DUK_COLD void duk_err_type_invalid_args(duk_hthread *thr, const char *filename, duk_int_t linenumber) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_ARGS);\n}\nDUK_INTERNAL DUK_COLD void duk_err_type_invalid_state(duk_hthread *thr, const char *filename, duk_int_t linenumber) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_STATE);\n}\nDUK_INTERNAL DUK_COLD void duk_err_type_invalid_trap_result(duk_hthread *thr, const char *filename, duk_int_t linenumber) {\n\tDUK_ERROR_RAW(thr, filename, linenumber, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_TRAP_RESULT);\n}\n#else\n/* The file/line arguments are NULL and 0, they're ignored by DUK_ERROR_RAW()\n * when non-verbose errors are used.\n */\n\nDUK_NORETURN(DUK_LOCAL_DECL void duk__err_shared(duk_hthread *thr, duk_errcode_t code));\nDUK_LOCAL void duk__err_shared(duk_hthread *thr, duk_errcode_t code) {\n\tDUK_ERROR_RAW(thr, NULL, 0, code, NULL);\n}\nDUK_INTERNAL DUK_COLD void duk_err_error(duk_hthread *thr) {\n\tduk__err_shared(thr, DUK_ERR_ERROR);\n}\nDUK_INTERNAL DUK_COLD void duk_err_range(duk_hthread *thr) {\n\tduk__err_shared(thr, DUK_ERR_RANGE_ERROR);\n}\nDUK_INTERNAL DUK_COLD void duk_err_eval(duk_hthread *thr) {\n\tduk__err_shared(thr, DUK_ERR_EVAL_ERROR);\n}\nDUK_INTERNAL DUK_COLD void duk_err_reference(duk_hthread *thr) {\n\tduk__err_shared(thr, DUK_ERR_REFERENCE_ERROR);\n}\nDUK_INTERNAL DUK_COLD void duk_err_syntax(duk_hthread *thr) {\n\tduk__err_shared(thr, DUK_ERR_SYNTAX_ERROR);\n}\nDUK_INTERNAL DUK_COLD void duk_err_type(duk_hthread *thr) {\n\tduk__err_shared(thr, DUK_ERR_TYPE_ERROR);\n}\nDUK_INTERNAL DUK_COLD void duk_err_uri(duk_hthread *thr) {\n\tduk__err_shared(thr, DUK_ERR_URI_ERROR);\n}\n#endif\n\n/*\n *  Default fatal error handler\n */\n\nDUK_INTERNAL DUK_COLD void duk_default_fatal_handler(void *udata, const char *msg) {\n\tDUK_UNREF(udata);\n\tDUK_UNREF(msg);\n\n#if defined(DUK_USE_FATAL_HANDLER)\n\t/* duk_config.h provided a custom default fatal handler. */\n\tDUK_D(DUK_DPRINT(\"custom default fatal error handler called: %s\", msg ? msg : \"NULL\"));\n\tDUK_USE_FATAL_HANDLER(udata, msg);\n#else\n\t/* Default behavior is to abort() on error.  There's no printout\n\t * which makes this awkward, so it's always recommended to use an\n\t * explicit fatal error handler.\n\t *\n\t * ====================================================================\n\t * NOTE: If you are seeing this, you are most likely dealing with an\n\t * uncaught error.  You should provide a fatal error handler in Duktape\n\t * heap creation, and should consider using a protected call as your\n\t * first call into an empty Duktape context to properly handle errors.\n\t * See:\n\t *   - http://duktape.org/guide.html#error-handling\n\t *   - http://wiki.duktape.org/HowtoFatalErrors.html\n\t *   - http://duktape.org/api.html#taglist-protected\n\t * ====================================================================\n\t */\n\tDUK_D(DUK_DPRINT(\"built-in default fatal error handler called: %s\", msg ? msg : \"NULL\"));\n\tDUK_ABORT();\n#endif\n\n\tDUK_D(DUK_DPRINT(\"fatal error handler returned, enter forever loop\"));\n\tfor (;;) {\n\t\t/* Loop forever to ensure we don't return. */\n\t}\n}\n\n/* automatic undefs */\n#undef DUK__ERRFMT_BUFSIZE\n#line 1 \"duk_unicode_support.c\"\n/*\n *  Various Unicode help functions for character classification predicates,\n *  case conversion, decoding, etc.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Fast path tables\n */\n\n#if defined(DUK_USE_IDCHAR_FASTPATH)\nDUK_INTERNAL const duk_int8_t duk_is_idchar_tab[128] = {\n\t/* 0: not IdentifierStart or IdentifierPart\n\t * 1: IdentifierStart and IdentifierPart\n\t * -1: IdentifierPart only\n\t */\n\t0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   /* 0x00...0x0f */\n\t0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   /* 0x10...0x1f */\n\t0,  0,  0,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,   /* 0x20...0x2f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,  0,  0,  0,  0,  0,   /* 0x30...0x3f */\n\t0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,   /* 0x40...0x4f */\n\t1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  1,   /* 0x50...0x5f */\n\t0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,   /* 0x60...0x6f */\n\t1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0    /* 0x70...0x7f */\n};\n#endif\n\n/*\n *  XUTF-8 and CESU-8 encoding/decoding\n */\n\nDUK_INTERNAL duk_small_int_t duk_unicode_get_xutf8_length(duk_ucodepoint_t cp) {\n\tduk_uint_fast32_t x = (duk_uint_fast32_t) cp;\n\tif (x < 0x80UL) {\n\t\t/* 7 bits */\n\t\treturn 1;\n\t} else if (x < 0x800UL) {\n\t\t/* 11 bits */\n\t\treturn 2;\n\t} else if (x < 0x10000UL) {\n\t\t/* 16 bits */\n\t\treturn 3;\n\t} else if (x < 0x200000UL) {\n\t\t/* 21 bits */\n\t\treturn 4;\n\t} else if (x < 0x4000000UL) {\n\t\t/* 26 bits */\n\t\treturn 5;\n\t} else if (x < (duk_ucodepoint_t) 0x80000000UL) {\n\t\t/* 31 bits */\n\t\treturn 6;\n\t} else {\n\t\t/* 36 bits */\n\t\treturn 7;\n\t}\n}\n\n#if defined(DUK_USE_ASSERTIONS)\nDUK_INTERNAL duk_small_int_t duk_unicode_get_cesu8_length(duk_ucodepoint_t cp) {\n\tduk_uint_fast32_t x = (duk_uint_fast32_t) cp;\n\tif (x < 0x80UL) {\n\t\t/* 7 bits */\n\t\treturn 1;\n\t} else if (x < 0x800UL) {\n\t\t/* 11 bits */\n\t\treturn 2;\n\t} else if (x < 0x10000UL) {\n\t\t/* 16 bits */\n\t\treturn 3;\n\t} else {\n\t\t/* Encoded as surrogate pair, each encoding to 3 bytes for\n\t\t * 6 bytes total.  Codepoints above U+10FFFF encode as 6 bytes\n\t\t * too, see duk_unicode_encode_cesu8().\n\t\t  */\n\t\treturn 3 + 3;\n\t}\n}\n#endif  /* DUK_USE_ASSERTIONS */\n\nDUK_INTERNAL const duk_uint8_t duk_unicode_xutf8_markers[7] = {\n\t0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe\n};\n\n/* Encode to extended UTF-8; 'out' must have space for at least\n * DUK_UNICODE_MAX_XUTF8_LENGTH bytes.  Allows encoding of any\n * 32-bit (unsigned) codepoint.\n */\nDUK_INTERNAL duk_small_int_t duk_unicode_encode_xutf8(duk_ucodepoint_t cp, duk_uint8_t *out) {\n\tduk_uint_fast32_t x = (duk_uint_fast32_t) cp;\n\tduk_small_int_t len;\n\tduk_uint8_t marker;\n\tduk_small_int_t i;\n\n\tlen = duk_unicode_get_xutf8_length(cp);\n\tDUK_ASSERT(len > 0);\n\n\tmarker = duk_unicode_xutf8_markers[len - 1];  /* 64-bit OK because always >= 0 */\n\n\ti = len;\n\tDUK_ASSERT(i > 0);\n\tdo {\n\t\ti--;\n\t\tif (i > 0) {\n\t\t\tout[i] = (duk_uint8_t) (0x80 + (x & 0x3f));\n\t\t\tx >>= 6;\n\t\t} else {\n\t\t\t/* Note: masking of 'x' is not necessary because of\n\t\t\t * range check and shifting -> no bits overlapping\n\t\t\t * the marker should be set.\n\t\t\t */\n\t\t\tout[0] = (duk_uint8_t) (marker + x);\n\t\t}\n\t} while (i > 0);\n\n\treturn len;\n}\n\n/* Encode to CESU-8; 'out' must have space for at least\n * DUK_UNICODE_MAX_CESU8_LENGTH bytes; codepoints above U+10FFFF\n * will encode to garbage but won't overwrite the output buffer.\n */\nDUK_INTERNAL duk_small_int_t duk_unicode_encode_cesu8(duk_ucodepoint_t cp, duk_uint8_t *out) {\n\tduk_uint_fast32_t x = (duk_uint_fast32_t) cp;\n\tduk_small_int_t len;\n\n\tif (x < 0x80UL) {\n\t\tout[0] = (duk_uint8_t) x;\n\t\tlen = 1;\n\t} else if (x < 0x800UL) {\n\t\tout[0] = (duk_uint8_t) (0xc0 + ((x >> 6) & 0x1f));\n\t\tout[1] = (duk_uint8_t) (0x80 + (x & 0x3f));\n\t\tlen = 2;\n\t} else if (x < 0x10000UL) {\n\t\t/* surrogate pairs get encoded here */\n\t\tout[0] = (duk_uint8_t) (0xe0 + ((x >> 12) & 0x0f));\n\t\tout[1] = (duk_uint8_t) (0x80 + ((x >> 6) & 0x3f));\n\t\tout[2] = (duk_uint8_t) (0x80 + (x & 0x3f));\n\t\tlen = 3;\n\t} else {\n\t\t/*\n\t\t *  Unicode codepoints above U+FFFF are encoded as surrogate\n\t\t *  pairs here.  This ensures that all CESU-8 codepoints are\n\t\t *  16-bit values as expected in Ecmascript.  The surrogate\n\t\t *  pairs always get a 3-byte encoding (each) in CESU-8.\n\t\t *  See: http://en.wikipedia.org/wiki/Surrogate_pair\n\t\t *\n\t\t *  20-bit codepoint, 10 bits (A and B) per surrogate pair:\n\t\t *\n\t\t *    x = 0b00000000 0000AAAA AAAAAABB BBBBBBBB\n\t\t *  sp1 = 0b110110AA AAAAAAAA  (0xd800 + ((x >> 10) & 0x3ff))\n\t\t *  sp2 = 0b110111BB BBBBBBBB  (0xdc00 + (x & 0x3ff))\n\t\t *\n\t\t *  Encoded into CESU-8:\n\t\t *\n\t\t *  sp1 -> 0b11101101  (0xe0 + ((sp1 >> 12) & 0x0f))\n\t\t *      -> 0b1010AAAA  (0x80 + ((sp1 >> 6) & 0x3f))\n\t\t *      -> 0b10AAAAAA  (0x80 + (sp1 & 0x3f))\n\t\t *  sp2 -> 0b11101101  (0xe0 + ((sp2 >> 12) & 0x0f))\n\t\t *      -> 0b1011BBBB  (0x80 + ((sp2 >> 6) & 0x3f))\n\t\t *      -> 0b10BBBBBB  (0x80 + (sp2 & 0x3f))\n\t\t *\n\t\t *  Note that 0x10000 must be subtracted first.  The code below\n\t\t *  avoids the sp1, sp2 temporaries which saves around 20 bytes\n\t\t *  of code.\n\t\t */\n\n\t\tx -= 0x10000UL;\n\n\t\tout[0] = (duk_uint8_t) (0xed);\n\t\tout[1] = (duk_uint8_t) (0xa0 + ((x >> 16) & 0x0f));\n\t\tout[2] = (duk_uint8_t) (0x80 + ((x >> 10) & 0x3f));\n\t\tout[3] = (duk_uint8_t) (0xed);\n\t\tout[4] = (duk_uint8_t) (0xb0 + ((x >> 6) & 0x0f));\n\t\tout[5] = (duk_uint8_t) (0x80 + (x & 0x3f));\n\t\tlen = 6;\n\t}\n\n\treturn len;\n}\n\n/* Decode helper.  Return zero on error. */\nDUK_INTERNAL duk_small_int_t duk_unicode_decode_xutf8(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_ucodepoint_t *out_cp) {\n\tconst duk_uint8_t *p;\n\tduk_uint32_t res;\n\tduk_uint_fast8_t ch;\n\tduk_small_int_t n;\n\n\tDUK_UNREF(thr);\n\n\tp = *ptr;\n\tif (p < ptr_start || p >= ptr_end) {\n\t\tgoto fail;\n\t}\n\n\t/*\n\t *  UTF-8 decoder which accepts longer than standard byte sequences.\n\t *  This allows full 32-bit code points to be used.\n\t */\n\n\tch = (duk_uint_fast8_t) (*p++);\n\tif (ch < 0x80) {\n\t\t/* 0xxx xxxx   [7 bits] */\n\t\tres = (duk_uint32_t) (ch & 0x7f);\n\t\tn = 0;\n\t} else if (ch < 0xc0) {\n\t\t/* 10xx xxxx -> invalid */\n\t\tgoto fail;\n\t} else if (ch < 0xe0) {\n\t\t/* 110x xxxx   10xx xxxx   [11 bits] */\n\t\tres = (duk_uint32_t) (ch & 0x1f);\n\t\tn = 1;\n\t} else if (ch < 0xf0) {\n\t\t/* 1110 xxxx   10xx xxxx   10xx xxxx   [16 bits] */\n\t\tres = (duk_uint32_t) (ch & 0x0f);\n\t\tn = 2;\n\t} else if (ch < 0xf8) {\n\t\t/* 1111 0xxx   10xx xxxx   10xx xxxx   10xx xxxx   [21 bits] */\n\t\tres = (duk_uint32_t) (ch & 0x07);\n\t\tn = 3;\n\t} else if (ch < 0xfc) {\n\t\t/* 1111 10xx   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   [26 bits] */\n\t\tres = (duk_uint32_t) (ch & 0x03);\n\t\tn = 4;\n\t} else if (ch < 0xfe) {\n\t\t/* 1111 110x   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   [31 bits] */\n\t\tres = (duk_uint32_t) (ch & 0x01);\n\t\tn = 5;\n\t} else if (ch < 0xff) {\n\t\t/* 1111 1110   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   [36 bits] */\n\t\tres = (duk_uint32_t) (0);\n\t\tn = 6;\n\t} else {\n\t\t/* 8-byte format could be:\n\t\t * 1111 1111   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   10xx xxxx   [41 bits]\n\t\t *\n\t\t * However, this format would not have a zero bit following the\n\t\t * leading one bits and would not allow 0xFF to be used as an\n\t\t * \"invalid xutf-8\" marker for internal keys.  Further, 8-byte\n\t\t * encodings (up to 41 bit code points) are not currently needed.\n\t\t */\n\t\tgoto fail;\n\t}\n\n\tDUK_ASSERT(p >= ptr_start);  /* verified at beginning */\n\tif (p + n > ptr_end) {\n\t\t/* check pointer at end */\n\t\tgoto fail;\n\t}\n\n\twhile (n > 0) {\n\t\tDUK_ASSERT(p >= ptr_start && p < ptr_end);\n\t\tch = (duk_uint_fast8_t) (*p++);\n#if 0\n\t\tif (ch & 0xc0 != 0x80) {\n\t\t\t/* not a continuation byte */\n\t\t\tp--;\n\t\t\t*ptr = p;\n\t\t\t*out_cp = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;\n\t\t\treturn 1;\n\t\t}\n#endif\n\t\tres = (res << 6) + (duk_uint32_t) (ch & 0x3f);\n\t\tn--;\n\t}\n\n\t*ptr = p;\n\t*out_cp = res;\n\treturn 1;\n\n fail:\n\treturn 0;\n}\n\n/* used by e.g. duk_regexp_executor.c, string built-ins */\nDUK_INTERNAL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end) {\n\tduk_ucodepoint_t cp;\n\n\tif (duk_unicode_decode_xutf8(thr, ptr, ptr_start, ptr_end, &cp)) {\n\t\treturn cp;\n\t}\n\tDUK_ERROR_INTERNAL(thr);\n\tDUK_UNREACHABLE();\n\treturn 0;\n}\n\n/* Compute (extended) utf-8 length without codepoint encoding validation,\n * used for string interning.\n *\n * NOTE: This algorithm is performance critical, more so than string hashing\n * in some cases.  It is needed when interning a string and needs to scan\n * every byte of the string with no skipping.  Having an ASCII fast path\n * is useful if possible in the algorithm.  The current algorithms were\n * chosen from several variants, based on x64 gcc -O2 testing.  See:\n * https://github.com/svaarala/duktape/pull/422\n *\n * NOTE: must match tools/dukutil.py:duk_unicode_unvalidated_utf8_length().\n */\n\n#if defined(DUK_USE_PREFER_SIZE)\n/* Small variant; roughly 150 bytes smaller than the fast variant. */\nDUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) {\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_end;\n\tduk_size_t ncont;\n\tduk_size_t clen;\n\n\tp = data;\n\tp_end = data + blen;\n\tncont = 0;\n\twhile (p != p_end) {\n\t\tduk_uint8_t x;\n\t\tx = *p++;\n\t\tif (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) {\n\t\t\tncont++;\n\t\t}\n\t}\n\n\tDUK_ASSERT(ncont <= blen);\n\tclen = blen - ncont;\n\tDUK_ASSERT(clen <= blen);\n\treturn clen;\n}\n#else  /* DUK_USE_PREFER_SIZE */\n/* This seems like a good overall approach.  Fast path for ASCII in 4 byte\n * blocks.\n */\nDUK_INTERNAL duk_size_t duk_unicode_unvalidated_utf8_length(const duk_uint8_t *data, duk_size_t blen) {\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_end;\n\tconst duk_uint32_t *p32_end;\n\tconst duk_uint32_t *p32;\n\tduk_size_t ncont;\n\tduk_size_t clen;\n\n\tncont = 0;  /* number of continuation (non-initial) bytes in [0x80,0xbf] */\n\tp = data;\n\tp_end = data + blen;\n\tif (blen < 16) {\n\t\tgoto skip_fastpath;\n\t}\n\n\t/* Align 'p' to 4; the input data may have arbitrary alignment.\n\t * End of string check not needed because blen >= 16.\n\t */\n\twhile (((duk_size_t) (const void *) p) & 0x03U) {\n\t\tduk_uint8_t x;\n\t\tx = *p++;\n\t\tif (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) {\n\t\t\tncont++;\n\t\t}\n\t}\n\n\t/* Full, aligned 4-byte reads. */\n\tp32_end = (const duk_uint32_t *) (const void *) (p + ((duk_size_t) (p_end - p) & (duk_size_t) (~0x03)));\n\tp32 = (const duk_uint32_t *) (const void *) p;\n\twhile (p32 != (const duk_uint32_t *) p32_end) {\n\t\tduk_uint32_t x;\n\t\tx = *p32++;\n\t\tif (DUK_LIKELY((x & 0x80808080UL) == 0)) {\n\t\t\t;  /* ASCII fast path */\n\t\t} else {\n\t\t\t/* Flip highest bit of each byte which changes\n\t\t\t * the bit pattern 10xxxxxx into 00xxxxxx which\n\t\t\t * allows an easy bit mask test.\n\t\t\t */\n\t\t\tx ^= 0x80808080UL;\n\t\t\tif (DUK_UNLIKELY(!(x & 0xc0000000UL))) {\n\t\t\t\tncont++;\n\t\t\t}\n\t\t\tif (DUK_UNLIKELY(!(x & 0x00c00000UL))) {\n\t\t\t\tncont++;\n\t\t\t}\n\t\t\tif (DUK_UNLIKELY(!(x & 0x0000c000UL))) {\n\t\t\t\tncont++;\n\t\t\t}\n\t\t\tif (DUK_UNLIKELY(!(x & 0x000000c0UL))) {\n\t\t\t\tncont++;\n\t\t\t}\n\t\t}\n\t}\n\tp = (const duk_uint8_t *) p32;\n\t/* Fall through to handle the rest. */\n\n skip_fastpath:\n\twhile (p != p_end) {\n\t\tduk_uint8_t x;\n\t\tx = *p++;\n\t\tif (DUK_UNLIKELY(x >= 0x80 && x <= 0xbf)) {\n\t\t\tncont++;\n\t\t}\n\t}\n\n\tDUK_ASSERT(ncont <= blen);\n\tclen = blen - ncont;\n\tDUK_ASSERT(clen <= blen);\n\treturn clen;\n}\n#endif  /* DUK_USE_PREFER_SIZE */\n\n/*\n *  Unicode range matcher\n *\n *  Matches a codepoint against a packed bitstream of character ranges.\n *  Used for slow path Unicode matching.\n */\n\n/* Must match tools/extract_chars.py, generate_match_table3(). */\nDUK_LOCAL duk_uint32_t duk__uni_decode_value(duk_bitdecoder_ctx *bd_ctx) {\n\tduk_uint32_t t;\n\n\tt = (duk_uint32_t) duk_bd_decode(bd_ctx, 4);\n\tif (t <= 0x0eU) {\n\t\treturn t;\n\t}\n\tt = (duk_uint32_t) duk_bd_decode(bd_ctx, 8);\n\tif (t <= 0xfdU) {\n\t\treturn t + 0x0f;\n\t}\n\tif (t == 0xfeU) {\n\t\tt = (duk_uint32_t) duk_bd_decode(bd_ctx, 12);\n\t\treturn t + 0x0fU + 0xfeU;\n\t} else {\n\t\tt = (duk_uint32_t) duk_bd_decode(bd_ctx, 24);\n\t\treturn t + 0x0fU + 0xfeU + 0x1000UL;\n\t}\n}\n\nDUK_LOCAL duk_small_int_t duk__uni_range_match(const duk_uint8_t *unitab, duk_size_t unilen, duk_codepoint_t cp) {\n\tduk_bitdecoder_ctx bd_ctx;\n\tduk_codepoint_t prev_re;\n\n\tDUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));\n\tbd_ctx.data = (const duk_uint8_t *) unitab;\n\tbd_ctx.length = (duk_size_t) unilen;\n\n\tprev_re = 0;\n\tfor (;;) {\n\t\tduk_codepoint_t r1, r2;\n\t\tr1 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx);\n\t\tif (r1 == 0) {\n\t\t\tbreak;\n\t\t}\n\t\tr2 = (duk_codepoint_t) duk__uni_decode_value(&bd_ctx);\n\n\t\tr1 = prev_re + r1;\n\t\tr2 = r1 + r2;\n\t\tprev_re = r2;\n\n\t\t/* [r1,r2] is the range */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"duk__uni_range_match: cp=%06lx range=[0x%06lx,0x%06lx]\",\n\t\t                     (unsigned long) cp, (unsigned long) r1, (unsigned long) r2));\n\t\tif (cp >= r1 && cp <= r2) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/*\n *  \"WhiteSpace\" production check.\n */\n\nDUK_INTERNAL duk_small_int_t duk_unicode_is_whitespace(duk_codepoint_t cp) {\n\t/*\n\t *  E5 Section 7.2 specifies six characters specifically as\n\t *  white space:\n\t *\n\t *    0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;;\n\t *    000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;;\n\t *    000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;;\n\t *    0020;SPACE;Zs;0;WS;;;;;N;;;;;\n\t *    00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;\n\t *    FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;\n\t *\n\t *  It also specifies any Unicode category 'Zs' characters as white\n\t *  space.  These can be extracted with the \"tools/extract_chars.py\" script.\n\t *  Current result:\n\t *\n\t *    RAW OUTPUT:\n\t *    ===========\n\t *    0020;SPACE;Zs;0;WS;;;;;N;;;;;\n\t *    00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;;\n\t *    1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;;\n\t *    180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;;\n\t *    2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;;\n\t *    2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;;\n\t *    2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;;\n\t *    2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;;\n\t *    205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;\n\t *    3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;;\n\t *\n\t *    RANGES:\n\t *    =======\n\t *    0x0020\n\t *    0x00a0\n\t *    0x1680\n\t *    0x180e\n\t *    0x2000 ... 0x200a\n\t *    0x202f\n\t *    0x205f\n\t *    0x3000\n\t *\n\t *  A manual decoder (below) is probably most compact for this.\n\t */\n\n\tduk_uint_fast8_t lo;\n\tduk_uint_fast32_t hi;\n\n\t/* cp == -1 (EOF) never matches and causes return value 0 */\n\n\tlo = (duk_uint_fast8_t) (cp & 0xff);\n\thi = (duk_uint_fast32_t) (cp >> 8);  /* does not fit into an uchar */\n\n\tif (hi == 0x0000UL) {\n\t\tif (lo == 0x09U || lo == 0x0bU || lo == 0x0cU ||\n\t\t    lo == 0x20U || lo == 0xa0U) {\n\t\t\treturn 1;\n\t\t}\n\t} else if (hi == 0x0020UL) {\n\t\tif (lo <= 0x0aU || lo == 0x2fU || lo == 0x5fU) {\n\t\t\treturn 1;\n\t\t}\n\t} else if (cp == 0x1680L || cp == 0x180eL || cp == 0x3000L ||\n\t           cp == 0xfeffL) {\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n/*\n *  \"LineTerminator\" production check.\n */\n\nDUK_INTERNAL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp) {\n\t/*\n\t *  E5 Section 7.3\n\t *\n\t *  A LineTerminatorSequence essentially merges <CR> <LF> sequences\n\t *  into a single line terminator.  This must be handled by the caller.\n\t */\n\n\tif (cp == 0x000aL || cp == 0x000dL || cp == 0x2028L ||\n\t    cp == 0x2029L) {\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n/*\n *  \"IdentifierStart\" production check.\n */\n\nDUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_start(duk_codepoint_t cp) {\n\t/*\n\t *  E5 Section 7.6:\n\t *\n\t *    IdentifierStart:\n\t *      UnicodeLetter\n\t *      $\n\t *      _\n\t *      \\ UnicodeEscapeSequence\n\t *\n\t *  IdentifierStart production has one multi-character production:\n\t *\n\t *    \\ UnicodeEscapeSequence\n\t *\n\t *  The '\\' character is -not- matched by this function.  Rather, the caller\n\t *  should decode the escape and then call this function to check whether the\n\t *  decoded character is acceptable (see discussion in E5 Section 7.6).\n\t *\n\t *  The \"UnicodeLetter\" alternative of the production allows letters\n\t *  from various Unicode categories.  These can be extracted with the\n\t *  \"tools/extract_chars.py\" script.\n\t *\n\t *  Because the result has hundreds of Unicode codepoint ranges, matching\n\t *  for any values >= 0x80 are done using a very slow range-by-range scan\n\t *  and a packed range format.\n\t *\n\t *  The ASCII portion (codepoints 0x00 ... 0x7f) is fast-pathed below because\n\t *  it matters the most.  The ASCII related ranges of IdentifierStart are:\n\t *\n\t *    0x0041 ... 0x005a     ['A' ... 'Z']\n\t *    0x0061 ... 0x007a     ['a' ... 'z']\n\t *    0x0024                ['$']\n\t *    0x005f                ['_']\n\t */\n\n\t/* ASCII (and EOF) fast path -- quick accept and reject */\n\tif (cp <= 0x7fL) {\n#if defined(DUK_USE_IDCHAR_FASTPATH)\n\t\treturn (cp >= 0) && (duk_is_idchar_tab[cp] > 0);\n#else\n\t\tif ((cp >= 'a' && cp <= 'z') ||\n\t\t    (cp >= 'A' && cp <= 'Z') ||\n\t\t    cp == '_' || cp == '$') {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n#endif\n\t}\n\n\t/* Non-ASCII slow path (range-by-range linear comparison), very slow */\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n\tif (duk__uni_range_match(duk_unicode_ids_noa,\n\t                         (duk_size_t) sizeof(duk_unicode_ids_noa),\n\t                         (duk_codepoint_t) cp)) {\n\t\treturn 1;\n\t}\n\treturn 0;\n#else\n\tif (cp < 0x10000L) {\n\t\tif (duk__uni_range_match(duk_unicode_ids_noabmp,\n\t\t                         sizeof(duk_unicode_ids_noabmp),\n\t\t                         (duk_codepoint_t) cp)) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t} else {\n\t\t/* without explicit non-BMP support, assume non-BMP characters\n\t\t * are always accepted as identifier characters.\n\t\t */\n\t\treturn 1;\n\t}\n#endif\n}\n\n/*\n *  \"IdentifierPart\" production check.\n */\n\nDUK_INTERNAL duk_small_int_t duk_unicode_is_identifier_part(duk_codepoint_t cp) {\n\t/*\n\t *  E5 Section 7.6:\n\t *\n\t *    IdentifierPart:\n\t *      IdentifierStart\n\t *      UnicodeCombiningMark\n\t *      UnicodeDigit\n\t *      UnicodeConnectorPunctuation\n\t *      <ZWNJ>  [U+200C]\n\t *      <ZWJ>   [U+200D]\n\t *\n\t *  IdentifierPart production has one multi-character production\n\t *  as part of its IdentifierStart alternative.  The '\\' character\n\t *  of an escape sequence is not matched here, see discussion in\n\t *  duk_unicode_is_identifier_start().\n\t *\n\t *  To match non-ASCII characters (codepoints >= 0x80), a very slow\n\t *  linear range-by-range scan is used.  The codepoint is first compared\n\t *  to the IdentifierStart ranges, and if it doesn't match, then to a\n\t *  set consisting of code points in IdentifierPart but not in\n\t *  IdentifierStart.  This is done to keep the unicode range data small,\n\t *  at the expense of speed.\n\t *\n\t *  The ASCII fast path consists of:\n\t *\n\t *    0x0030 ... 0x0039     ['0' ... '9', UnicodeDigit]\n\t *    0x0041 ... 0x005a     ['A' ... 'Z', IdentifierStart]\n\t *    0x0061 ... 0x007a     ['a' ... 'z', IdentifierStart]\n\t *    0x0024                ['$', IdentifierStart]\n\t *    0x005f                ['_', IdentifierStart and\n\t *                                UnicodeConnectorPunctuation]\n\t *\n\t *  UnicodeCombiningMark has no code points <= 0x7f.\n\t *\n\t *  The matching code reuses the \"identifier start\" tables, and then\n\t *  consults a separate range set for characters in \"identifier part\"\n\t *  but not in \"identifier start\".  These can be extracted with the\n\t *  \"tools/extract_chars.py\" script.\n\t *\n\t *  UnicodeCombiningMark -> categories Mn, Mc\n\t *  UnicodeDigit -> categories Nd\n\t *  UnicodeConnectorPunctuation -> categories Pc\n\t */\n\n\t/* ASCII (and EOF) fast path -- quick accept and reject */\n\tif (cp <= 0x7fL) {\n#if defined(DUK_USE_IDCHAR_FASTPATH)\n\t\treturn (cp >= 0) && (duk_is_idchar_tab[cp] != 0);\n#else\n\t\tif ((cp >= 'a' && cp <= 'z') ||\n\t\t    (cp >= 'A' && cp <= 'Z') ||\n\t\t    (cp >= '0' && cp <= '9') ||\n\t\t    cp == '_' || cp == '$') {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n#endif\n\t}\n\n\t/* Non-ASCII slow path (range-by-range linear comparison), very slow */\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n\tif (duk__uni_range_match(duk_unicode_ids_noa,\n\t                         sizeof(duk_unicode_ids_noa),\n\t                         (duk_codepoint_t) cp) ||\n\t    duk__uni_range_match(duk_unicode_idp_m_ids_noa,\n\t                         sizeof(duk_unicode_idp_m_ids_noa),\n\t                         (duk_codepoint_t) cp)) {\n\t\treturn 1;\n\t}\n\treturn 0;\n#else\n\tif (cp < 0x10000L) {\n\t\tif (duk__uni_range_match(duk_unicode_ids_noabmp,\n\t\t                         sizeof(duk_unicode_ids_noabmp),\n\t\t                         (duk_codepoint_t) cp) ||\n\t\t    duk__uni_range_match(duk_unicode_idp_m_ids_noabmp,\n\t\t                         sizeof(duk_unicode_idp_m_ids_noabmp),\n\t\t                         (duk_codepoint_t) cp)) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t} else {\n\t\t/* without explicit non-BMP support, assume non-BMP characters\n\t\t * are always accepted as identifier characters.\n\t\t */\n\t\treturn 1;\n\t}\n#endif\n}\n\n/*\n *  Unicode letter check.\n */\n\nDUK_INTERNAL duk_small_int_t duk_unicode_is_letter(duk_codepoint_t cp) {\n\t/*\n\t *  Unicode letter is now taken to be the categories:\n\t *\n\t *    Lu, Ll, Lt, Lm, Lo\n\t *\n\t *  (Not sure if this is exactly correct.)\n\t *\n\t *  The ASCII fast path consists of:\n\t *\n\t *    0x0041 ... 0x005a     ['A' ... 'Z']\n\t *    0x0061 ... 0x007a     ['a' ... 'z']\n\t */\n\n\t/* ASCII (and EOF) fast path -- quick accept and reject */\n\tif (cp <= 0x7fL) {\n\t\tif ((cp >= 'a' && cp <= 'z') ||\n\t\t    (cp >= 'A' && cp <= 'Z')) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/* Non-ASCII slow path (range-by-range linear comparison), very slow */\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n\tif (duk__uni_range_match(duk_unicode_ids_noa,\n\t                         sizeof(duk_unicode_ids_noa),\n\t                         (duk_codepoint_t) cp) &&\n\t    !duk__uni_range_match(duk_unicode_ids_m_let_noa,\n\t                          sizeof(duk_unicode_ids_m_let_noa),\n\t                          (duk_codepoint_t) cp)) {\n\t\treturn 1;\n\t}\n\treturn 0;\n#else\n\tif (cp < 0x10000L) {\n\t\tif (duk__uni_range_match(duk_unicode_ids_noabmp,\n\t\t                         sizeof(duk_unicode_ids_noabmp),\n\t\t                         (duk_codepoint_t) cp) &&\n\t\t    !duk__uni_range_match(duk_unicode_ids_m_let_noabmp,\n\t\t                          sizeof(duk_unicode_ids_m_let_noabmp),\n\t\t                          (duk_codepoint_t) cp)) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t} else {\n\t\t/* without explicit non-BMP support, assume non-BMP characters\n\t\t * are always accepted as letters.\n\t\t */\n\t\treturn 1;\n\t}\n#endif\n}\n\n/*\n *  Complex case conversion helper which decodes a bit-packed conversion\n *  control stream generated by tools/extract_caseconv.py.  The conversion\n *  is very slow because it runs through the conversion data in a linear\n *  fashion to save space (which is why ASCII characters have a special\n *  fast path before arriving here).\n *\n *  The particular bit counts etc have been determined experimentally to\n *  be small but still sufficient, and must match the Python script\n *  (tools/extract_caseconv.py).\n *\n *  The return value is the case converted codepoint or -1 if the conversion\n *  results in multiple characters (this is useful for regexp Canonicalization\n *  operation).  If 'buf' is not NULL, the result codepoint(s) are also\n *  appended to the hbuffer.\n *\n *  Context and locale specific rules must be checked before consulting\n *  this function.\n */\n\nDUK_LOCAL\nduk_codepoint_t duk__slow_case_conversion(duk_hthread *thr,\n                                          duk_bufwriter_ctx *bw,\n                                          duk_codepoint_t cp,\n                                          duk_bitdecoder_ctx *bd_ctx) {\n\tduk_small_int_t skip = 0;\n\tduk_small_int_t n;\n\tduk_small_int_t t;\n\tduk_small_int_t count;\n\tduk_codepoint_t tmp_cp;\n\tduk_codepoint_t start_i;\n\tduk_codepoint_t start_o;\n\n\tDUK_ASSERT(bd_ctx != NULL);\n\tDUK_UNREF(thr);\n\n\tDUK_DDD(DUK_DDDPRINT(\"slow case conversion for codepoint: %ld\", (long) cp));\n\n\t/* range conversion with a \"skip\" */\n\tDUK_DDD(DUK_DDDPRINT(\"checking ranges\"));\n\tfor (;;) {\n\t\tskip++;\n\t\tn = (duk_small_int_t) duk_bd_decode(bd_ctx, 6);\n\t\tif (n == 0x3f) {\n\t\t\t/* end marker */\n\t\t\tbreak;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"skip=%ld, n=%ld\", (long) skip, (long) n));\n\n\t\twhile (n--) {\n\t\t\tstart_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);\n\t\t\tstart_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);\n\t\t\tcount = (duk_small_int_t) duk_bd_decode(bd_ctx, 7);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"range: start_i=%ld, start_o=%ld, count=%ld, skip=%ld\",\n\t\t\t                     (long) start_i, (long) start_o, (long) count, (long) skip));\n\n\t\t\tif (cp >= start_i) {\n\t\t\t\ttmp_cp = cp - start_i;  /* always >= 0 */\n\t\t\t\tif (tmp_cp < (duk_codepoint_t) count * (duk_codepoint_t) skip &&\n\t\t\t\t    (tmp_cp % (duk_codepoint_t) skip) == 0) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"range matches input codepoint\"));\n\t\t\t\t\tcp = start_o + tmp_cp;\n\t\t\t\t\tgoto single;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* 1:1 conversion */\n\tn = (duk_small_int_t) duk_bd_decode(bd_ctx, 7);\n\tDUK_DDD(DUK_DDDPRINT(\"checking 1:1 conversions (count %ld)\", (long) n));\n\twhile (n--) {\n\t\tstart_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);\n\t\tstart_o = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);\n\t\tDUK_DDD(DUK_DDDPRINT(\"1:1 conversion %ld -> %ld\", (long) start_i, (long) start_o));\n\t\tif (cp == start_i) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"1:1 matches input codepoint\"));\n\t\t\tcp = start_o;\n\t\t\tgoto single;\n\t\t}\n\t}\n\n\t/* complex, multicharacter conversion */\n\tn = (duk_small_int_t) duk_bd_decode(bd_ctx, 7);\n\tDUK_DDD(DUK_DDDPRINT(\"checking 1:n conversions (count %ld)\", (long) n));\n\twhile (n--) {\n\t\tstart_i = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);\n\t\tt = (duk_small_int_t) duk_bd_decode(bd_ctx, 2);\n\t\tDUK_DDD(DUK_DDDPRINT(\"1:n conversion %ld -> %ld chars\", (long) start_i, (long) t));\n\t\tif (cp == start_i) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"1:n matches input codepoint\"));\n\t\t\tif (bw != NULL) {\n\t\t\t\twhile (t--) {\n\t\t\t\t\ttmp_cp = (duk_codepoint_t) duk_bd_decode(bd_ctx, 16);\n\t\t\t\t\tDUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) tmp_cp);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t} else {\n\t\t\twhile (t--) {\n\t\t\t\t(void) duk_bd_decode(bd_ctx, 16);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* default: no change */\n\tDUK_DDD(DUK_DDDPRINT(\"no rule matches, output is same as input\"));\n\t/* fall through */\n\n single:\n\tif (bw != NULL) {\n\t\tDUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp);\n\t}\n\treturn cp;\n}\n\n/*\n *  Case conversion helper, with context/local sensitivity.\n *  For proper case conversion, one needs to know the character\n *  and the preceding and following characters, as well as\n *  locale/language.\n */\n\n/* XXX: add 'language' argument when locale/language sensitive rule\n * support added.\n */\nDUK_LOCAL\nduk_codepoint_t duk__case_transform_helper(duk_hthread *thr,\n                                           duk_bufwriter_ctx *bw,\n                                           duk_codepoint_t cp,\n                                           duk_codepoint_t prev,\n                                           duk_codepoint_t next,\n                                           duk_bool_t uppercase) {\n\tduk_bitdecoder_ctx bd_ctx;\n\n\t/* fast path for ASCII */\n\tif (cp < 0x80L) {\n\t\t/* XXX: there are language sensitive rules for the ASCII range.\n\t\t * If/when language/locale support is implemented, they need to\n\t\t * be implemented here for the fast path.  There are no context\n\t\t * sensitive rules for ASCII range.\n\t\t */\n\n\t\tif (uppercase) {\n\t\t\tif (cp >= 'a' && cp <= 'z') {\n\t\t\t\tcp = cp - 'a' + 'A';\n\t\t\t}\n\t\t} else {\n\t\t\tif (cp >= 'A' && cp <= 'Z') {\n\t\t\t\tcp = cp - 'A' + 'a';\n\t\t\t}\n\t\t}\n\n\t\tif (bw != NULL) {\n\t\t\tDUK_BW_WRITE_RAW_U8(thr, bw, (duk_uint8_t) cp);\n\t\t}\n\t\treturn cp;\n\t}\n\n\t/* context and locale specific rules which cannot currently be represented\n\t * in the caseconv bitstream: hardcoded rules in C\n\t */\n\tif (uppercase) {\n\t\t/* XXX: turkish / azeri */\n\t} else {\n\t\t/*\n\t\t *  Final sigma context specific rule.  This is a rather tricky\n\t\t *  rule and this handling is probably not 100% correct now.\n\t\t *  The rule is not locale/language specific so it is supported.\n\t\t */\n\n\t\tif (cp == 0x03a3L &&    /* U+03A3 = GREEK CAPITAL LETTER SIGMA */\n\t\t    duk_unicode_is_letter(prev) &&        /* prev exists and is not a letter */\n\t\t    !duk_unicode_is_letter(next)) {       /* next does not exist or next is not a letter */\n\t\t\t/* Capital sigma occurred at \"end of word\", lowercase to\n\t\t\t * U+03C2 = GREEK SMALL LETTER FINAL SIGMA.  Otherwise\n\t\t\t * fall through and let the normal rules lowercase it to\n\t\t\t * U+03C3 = GREEK SMALL LETTER SIGMA.\n\t\t\t */\n\t\t\tcp = 0x03c2L;\n\t\t\tgoto singlechar;\n\t\t}\n\n\t\t/* XXX: lithuanian not implemented */\n\t\t/* XXX: lithuanian, explicit dot rules */\n\t\t/* XXX: turkish / azeri, lowercase rules */\n\t}\n\n\t/* 1:1 or special conversions, but not locale/context specific: script generated rules */\n\tDUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));\n\tif (uppercase) {\n\t\tbd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_uc;\n\t\tbd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_uc);\n\t} else {\n\t\tbd_ctx.data = (const duk_uint8_t *) duk_unicode_caseconv_lc;\n\t\tbd_ctx.length = (duk_size_t) sizeof(duk_unicode_caseconv_lc);\n\t}\n\treturn duk__slow_case_conversion(thr, bw, cp, &bd_ctx);\n\n singlechar:\n\tif (bw != NULL) {\n\t\tDUK_BW_WRITE_RAW_XUTF8(thr, bw, (duk_ucodepoint_t) cp);\n\t}\n\treturn cp;\n\n /* unused now, not needed until Turkish/Azeri */\n#if 0\n nochar:\n\treturn -1;\n#endif\n}\n\n/*\n *  Replace valstack top with case converted version.\n */\n\nDUK_INTERNAL void duk_unicode_case_convert_string(duk_hthread *thr, duk_bool_t uppercase) {\n\tduk_hstring *h_input;\n\tduk_bufwriter_ctx bw_alloc;\n\tduk_bufwriter_ctx *bw;\n\tconst duk_uint8_t *p, *p_start, *p_end;\n\tduk_codepoint_t prev, curr, next;\n\n\th_input = duk_require_hstring(thr, -1);  /* Accept symbols. */\n\tDUK_ASSERT(h_input != NULL);\n\n\tbw = &bw_alloc;\n\tDUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input));\n\n\t/* [ ... input buffer ] */\n\n\tp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);\n\tp = p_start;\n\n\tprev = -1; DUK_UNREF(prev);\n\tcurr = -1;\n\tnext = -1;\n\tfor (;;) {\n\t\tprev = curr;\n\t\tcurr = next;\n\t\tnext = -1;\n\t\tif (p < p_end) {\n\t\t\tnext = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end);\n\t\t} else {\n\t\t\t/* end of input and last char has been processed */\n\t\t\tif (curr < 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* on first round, skip */\n\t\tif (curr >= 0) {\n\t\t\t/* XXX: could add a fast path to process chunks of input codepoints,\n\t\t\t * but relative benefit would be quite small.\n\t\t\t */\n\n\t\t\t/* Ensure space for maximum multi-character result; estimate is overkill. */\n\t\t\tDUK_BW_ENSURE(thr, bw, 8 * DUK_UNICODE_MAX_XUTF8_LENGTH);\n\n\t\t\tduk__case_transform_helper(thr,\n\t\t\t                           bw,\n\t\t\t                           (duk_codepoint_t) curr,\n\t\t\t                           prev,\n\t\t\t                           next,\n\t\t\t                           uppercase);\n\t\t}\n\t}\n\n\tDUK_BW_COMPACT(thr, bw);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe, output is encoded. */\n\t/* invalidates h_buf pointer */\n\tduk_remove_m2(thr);\n}\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\n/*\n *  Canonicalize() abstract operation needed for canonicalization of individual\n *  codepoints during regexp compilation and execution, see E5 Section 15.10.2.8.\n *  Note that codepoints are canonicalized one character at a time, so no context\n *  specific rules can apply.  Locale specific rules can apply, though.\n */\n\nDUK_INTERNAL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp) {\n#if defined(DUK_USE_REGEXP_CANON_WORKAROUND)\n\t/* Fast canonicalization lookup at the cost of 128kB footprint. */\n\tDUK_ASSERT(cp >= 0);\n\tDUK_UNREF(thr);\n\tif (DUK_LIKELY(cp < 0x10000L)) {\n\t\treturn (duk_codepoint_t) duk_unicode_re_canon_lookup[cp];\n\t}\n\treturn cp;\n#else  /* DUK_USE_REGEXP_CANON_WORKAROUND */\n\tduk_codepoint_t y;\n\n\ty = duk__case_transform_helper(thr,\n\t                               NULL,    /* NULL is allowed, no output */\n\t                               cp,      /* curr char */\n\t                               -1,      /* prev char */\n\t                               -1,      /* next char */\n\t                               1);      /* uppercase */\n\n\tif ((y < 0) || (cp >= 0x80 && y < 0x80)) {\n\t\t/* multiple codepoint conversion or non-ASCII mapped to ASCII\n\t\t * --> leave as is.\n\t\t */\n\t\treturn cp;\n\t}\n\n\treturn y;\n#endif  /* DUK_USE_REGEXP_CANON_WORKAROUND */\n}\n\n/*\n *  E5 Section 15.10.2.6 \"IsWordChar\" abstract operation.  Assume\n *  x < 0 for characters read outside the string.\n */\n\nDUK_INTERNAL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t x) {\n\t/*\n\t *  Note: the description in E5 Section 15.10.2.6 has a typo, it\n\t *  contains 'A' twice and lacks 'a'; the intent is [0-9a-zA-Z_].\n\t */\n\tif ((x >= '0' && x <= '9') ||\n\t    (x >= 'a' && x <= 'z') ||\n\t    (x >= 'A' && x <= 'Z') ||\n\t    (x == '_')) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n/*\n *  Regexp range tables\n */\n\n/* exposed because lexer needs these too */\nDUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_digit[2] = {\n\t(duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL,\n};\nDUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_white[22] = {\n\t(duk_uint16_t) 0x0009UL, (duk_uint16_t) 0x000DUL,\n\t(duk_uint16_t) 0x0020UL, (duk_uint16_t) 0x0020UL,\n\t(duk_uint16_t) 0x00A0UL, (duk_uint16_t) 0x00A0UL,\n\t(duk_uint16_t) 0x1680UL, (duk_uint16_t) 0x1680UL,\n\t(duk_uint16_t) 0x180EUL, (duk_uint16_t) 0x180EUL,\n\t(duk_uint16_t) 0x2000UL, (duk_uint16_t) 0x200AUL,\n\t(duk_uint16_t) 0x2028UL, (duk_uint16_t) 0x2029UL,\n\t(duk_uint16_t) 0x202FUL, (duk_uint16_t) 0x202FUL,\n\t(duk_uint16_t) 0x205FUL, (duk_uint16_t) 0x205FUL,\n\t(duk_uint16_t) 0x3000UL, (duk_uint16_t) 0x3000UL,\n\t(duk_uint16_t) 0xFEFFUL, (duk_uint16_t) 0xFEFFUL,\n};\nDUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_wordchar[8] = {\n\t(duk_uint16_t) 0x0030UL, (duk_uint16_t) 0x0039UL,\n\t(duk_uint16_t) 0x0041UL, (duk_uint16_t) 0x005AUL,\n\t(duk_uint16_t) 0x005FUL, (duk_uint16_t) 0x005FUL,\n\t(duk_uint16_t) 0x0061UL, (duk_uint16_t) 0x007AUL,\n};\nDUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_digit[4] = {\n\t(duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL,\n\t(duk_uint16_t) 0x003AUL, (duk_uint16_t) 0xFFFFUL,\n};\nDUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_white[24] = {\n\t(duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x0008UL,\n\t(duk_uint16_t) 0x000EUL, (duk_uint16_t) 0x001FUL,\n\t(duk_uint16_t) 0x0021UL, (duk_uint16_t) 0x009FUL,\n\t(duk_uint16_t) 0x00A1UL, (duk_uint16_t) 0x167FUL,\n\t(duk_uint16_t) 0x1681UL, (duk_uint16_t) 0x180DUL,\n\t(duk_uint16_t) 0x180FUL, (duk_uint16_t) 0x1FFFUL,\n\t(duk_uint16_t) 0x200BUL, (duk_uint16_t) 0x2027UL,\n\t(duk_uint16_t) 0x202AUL, (duk_uint16_t) 0x202EUL,\n\t(duk_uint16_t) 0x2030UL, (duk_uint16_t) 0x205EUL,\n\t(duk_uint16_t) 0x2060UL, (duk_uint16_t) 0x2FFFUL,\n\t(duk_uint16_t) 0x3001UL, (duk_uint16_t) 0xFEFEUL,\n\t(duk_uint16_t) 0xFF00UL, (duk_uint16_t) 0xFFFFUL,\n};\nDUK_INTERNAL const duk_uint16_t duk_unicode_re_ranges_not_wordchar[10] = {\n\t(duk_uint16_t) 0x0000UL, (duk_uint16_t) 0x002FUL,\n\t(duk_uint16_t) 0x003AUL, (duk_uint16_t) 0x0040UL,\n\t(duk_uint16_t) 0x005BUL, (duk_uint16_t) 0x005EUL,\n\t(duk_uint16_t) 0x0060UL, (duk_uint16_t) 0x0060UL,\n\t(duk_uint16_t) 0x007BUL, (duk_uint16_t) 0xFFFFUL,\n};\n\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n#line 1 \"duk_util_misc.c\"\n/*\n *  Misc util stuff\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Lowercase digits for radix values 2 to 36.  Also doubles as lowercase\n *  hex nybble table.\n */\n\nDUK_INTERNAL const duk_uint8_t duk_lc_digits[36] = {\n\tDUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3,\n\tDUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7,\n\tDUK_ASC_8, DUK_ASC_9, DUK_ASC_LC_A, DUK_ASC_LC_B,\n\tDUK_ASC_LC_C, DUK_ASC_LC_D, DUK_ASC_LC_E, DUK_ASC_LC_F,\n\tDUK_ASC_LC_G, DUK_ASC_LC_H, DUK_ASC_LC_I, DUK_ASC_LC_J,\n\tDUK_ASC_LC_K, DUK_ASC_LC_L, DUK_ASC_LC_M, DUK_ASC_LC_N,\n\tDUK_ASC_LC_O, DUK_ASC_LC_P, DUK_ASC_LC_Q, DUK_ASC_LC_R,\n\tDUK_ASC_LC_S, DUK_ASC_LC_T, DUK_ASC_LC_U, DUK_ASC_LC_V,\n\tDUK_ASC_LC_W, DUK_ASC_LC_X, DUK_ASC_LC_Y, DUK_ASC_LC_Z\n};\n\nDUK_INTERNAL const duk_uint8_t duk_uc_nybbles[16] = {\n\tDUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3,\n\tDUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7,\n\tDUK_ASC_8, DUK_ASC_9, DUK_ASC_UC_A, DUK_ASC_UC_B,\n\tDUK_ASC_UC_C, DUK_ASC_UC_D, DUK_ASC_UC_E, DUK_ASC_UC_F\n};\n\n/*\n *  Table for hex decoding ASCII hex digits\n */\n\nDUK_INTERNAL const duk_int8_t duk_hex_dectab[256] = {\n\t/* -1 if invalid */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x00-0x0f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x10-0x1f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x20-0x2f */\n\t 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,  /* 0x30-0x3f */\n\t-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x40-0x4f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x50-0x5f */\n\t-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x60-0x6f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x70-0x7f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x80-0x8f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x90-0x9f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xa0-0xaf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xb0-0xbf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xc0-0xcf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xd0-0xdf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xe0-0xef */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1   /* 0xf0-0xff */\n};\n\n#if defined(DUK_USE_HEX_FASTPATH)\n/* Preshifted << 4.  Must use 16-bit entry to allow negative value signaling. */\nDUK_INTERNAL const duk_int16_t duk_hex_dectab_shift4[256] = {\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x00-0x0f */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x10-0x1f */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x20-0x2f */\n\t0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x30-0x3f */\n\t  -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x40-0x4f */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x50-0x5f */\n\t  -1, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x60-0x6f */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x70-0x7f */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x80-0x8f */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0x90-0x9f */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0xa0-0xaf */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0xb0-0xbf */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0xc0-0xcf */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0xd0-0xdf */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  /* 0xe0-0xef */\n\t  -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1   /* 0xf0-0xff */\n};\n#endif\n\n/*\n *  Table for hex encoding bytes\n */\n\n#if defined(DUK_USE_HEX_FASTPATH)\n/* Lookup to encode one byte directly into 2 characters:\n *\n *   def genhextab(bswap):\n *       for i in xrange(256):\n *           t = chr(i).encode('hex')\n *           if bswap:\n *               t = t[1] + t[0]\n *           print('0x' + t.encode('hex') + 'U')\n *   print('big endian'); genhextab(False)\n *   print('little endian'); genhextab(True)\n*/\nDUK_INTERNAL const duk_uint16_t duk_hex_enctab[256] = {\n#if defined(DUK_USE_INTEGER_BE)\n\t0x3030U, 0x3031U, 0x3032U, 0x3033U, 0x3034U, 0x3035U, 0x3036U, 0x3037U,\n\t0x3038U, 0x3039U, 0x3061U, 0x3062U, 0x3063U, 0x3064U, 0x3065U, 0x3066U,\n\t0x3130U, 0x3131U, 0x3132U, 0x3133U, 0x3134U, 0x3135U, 0x3136U, 0x3137U,\n\t0x3138U, 0x3139U, 0x3161U, 0x3162U, 0x3163U, 0x3164U, 0x3165U, 0x3166U,\n\t0x3230U, 0x3231U, 0x3232U, 0x3233U, 0x3234U, 0x3235U, 0x3236U, 0x3237U,\n\t0x3238U, 0x3239U, 0x3261U, 0x3262U, 0x3263U, 0x3264U, 0x3265U, 0x3266U,\n\t0x3330U, 0x3331U, 0x3332U, 0x3333U, 0x3334U, 0x3335U, 0x3336U, 0x3337U,\n\t0x3338U, 0x3339U, 0x3361U, 0x3362U, 0x3363U, 0x3364U, 0x3365U, 0x3366U,\n\t0x3430U, 0x3431U, 0x3432U, 0x3433U, 0x3434U, 0x3435U, 0x3436U, 0x3437U,\n\t0x3438U, 0x3439U, 0x3461U, 0x3462U, 0x3463U, 0x3464U, 0x3465U, 0x3466U,\n\t0x3530U, 0x3531U, 0x3532U, 0x3533U, 0x3534U, 0x3535U, 0x3536U, 0x3537U,\n\t0x3538U, 0x3539U, 0x3561U, 0x3562U, 0x3563U, 0x3564U, 0x3565U, 0x3566U,\n\t0x3630U, 0x3631U, 0x3632U, 0x3633U, 0x3634U, 0x3635U, 0x3636U, 0x3637U,\n\t0x3638U, 0x3639U, 0x3661U, 0x3662U, 0x3663U, 0x3664U, 0x3665U, 0x3666U,\n\t0x3730U, 0x3731U, 0x3732U, 0x3733U, 0x3734U, 0x3735U, 0x3736U, 0x3737U,\n\t0x3738U, 0x3739U, 0x3761U, 0x3762U, 0x3763U, 0x3764U, 0x3765U, 0x3766U,\n\t0x3830U, 0x3831U, 0x3832U, 0x3833U, 0x3834U, 0x3835U, 0x3836U, 0x3837U,\n\t0x3838U, 0x3839U, 0x3861U, 0x3862U, 0x3863U, 0x3864U, 0x3865U, 0x3866U,\n\t0x3930U, 0x3931U, 0x3932U, 0x3933U, 0x3934U, 0x3935U, 0x3936U, 0x3937U,\n\t0x3938U, 0x3939U, 0x3961U, 0x3962U, 0x3963U, 0x3964U, 0x3965U, 0x3966U,\n\t0x6130U, 0x6131U, 0x6132U, 0x6133U, 0x6134U, 0x6135U, 0x6136U, 0x6137U,\n\t0x6138U, 0x6139U, 0x6161U, 0x6162U, 0x6163U, 0x6164U, 0x6165U, 0x6166U,\n\t0x6230U, 0x6231U, 0x6232U, 0x6233U, 0x6234U, 0x6235U, 0x6236U, 0x6237U,\n\t0x6238U, 0x6239U, 0x6261U, 0x6262U, 0x6263U, 0x6264U, 0x6265U, 0x6266U,\n\t0x6330U, 0x6331U, 0x6332U, 0x6333U, 0x6334U, 0x6335U, 0x6336U, 0x6337U,\n\t0x6338U, 0x6339U, 0x6361U, 0x6362U, 0x6363U, 0x6364U, 0x6365U, 0x6366U,\n\t0x6430U, 0x6431U, 0x6432U, 0x6433U, 0x6434U, 0x6435U, 0x6436U, 0x6437U,\n\t0x6438U, 0x6439U, 0x6461U, 0x6462U, 0x6463U, 0x6464U, 0x6465U, 0x6466U,\n\t0x6530U, 0x6531U, 0x6532U, 0x6533U, 0x6534U, 0x6535U, 0x6536U, 0x6537U,\n\t0x6538U, 0x6539U, 0x6561U, 0x6562U, 0x6563U, 0x6564U, 0x6565U, 0x6566U,\n\t0x6630U, 0x6631U, 0x6632U, 0x6633U, 0x6634U, 0x6635U, 0x6636U, 0x6637U,\n\t0x6638U, 0x6639U, 0x6661U, 0x6662U, 0x6663U, 0x6664U, 0x6665U, 0x6666U\n#else  /* DUK_USE_INTEGER_BE */\n\t0x3030U, 0x3130U, 0x3230U, 0x3330U, 0x3430U, 0x3530U, 0x3630U, 0x3730U,\n\t0x3830U, 0x3930U, 0x6130U, 0x6230U, 0x6330U, 0x6430U, 0x6530U, 0x6630U,\n\t0x3031U, 0x3131U, 0x3231U, 0x3331U, 0x3431U, 0x3531U, 0x3631U, 0x3731U,\n\t0x3831U, 0x3931U, 0x6131U, 0x6231U, 0x6331U, 0x6431U, 0x6531U, 0x6631U,\n\t0x3032U, 0x3132U, 0x3232U, 0x3332U, 0x3432U, 0x3532U, 0x3632U, 0x3732U,\n\t0x3832U, 0x3932U, 0x6132U, 0x6232U, 0x6332U, 0x6432U, 0x6532U, 0x6632U,\n\t0x3033U, 0x3133U, 0x3233U, 0x3333U, 0x3433U, 0x3533U, 0x3633U, 0x3733U,\n\t0x3833U, 0x3933U, 0x6133U, 0x6233U, 0x6333U, 0x6433U, 0x6533U, 0x6633U,\n\t0x3034U, 0x3134U, 0x3234U, 0x3334U, 0x3434U, 0x3534U, 0x3634U, 0x3734U,\n\t0x3834U, 0x3934U, 0x6134U, 0x6234U, 0x6334U, 0x6434U, 0x6534U, 0x6634U,\n\t0x3035U, 0x3135U, 0x3235U, 0x3335U, 0x3435U, 0x3535U, 0x3635U, 0x3735U,\n\t0x3835U, 0x3935U, 0x6135U, 0x6235U, 0x6335U, 0x6435U, 0x6535U, 0x6635U,\n\t0x3036U, 0x3136U, 0x3236U, 0x3336U, 0x3436U, 0x3536U, 0x3636U, 0x3736U,\n\t0x3836U, 0x3936U, 0x6136U, 0x6236U, 0x6336U, 0x6436U, 0x6536U, 0x6636U,\n\t0x3037U, 0x3137U, 0x3237U, 0x3337U, 0x3437U, 0x3537U, 0x3637U, 0x3737U,\n\t0x3837U, 0x3937U, 0x6137U, 0x6237U, 0x6337U, 0x6437U, 0x6537U, 0x6637U,\n\t0x3038U, 0x3138U, 0x3238U, 0x3338U, 0x3438U, 0x3538U, 0x3638U, 0x3738U,\n\t0x3838U, 0x3938U, 0x6138U, 0x6238U, 0x6338U, 0x6438U, 0x6538U, 0x6638U,\n\t0x3039U, 0x3139U, 0x3239U, 0x3339U, 0x3439U, 0x3539U, 0x3639U, 0x3739U,\n\t0x3839U, 0x3939U, 0x6139U, 0x6239U, 0x6339U, 0x6439U, 0x6539U, 0x6639U,\n\t0x3061U, 0x3161U, 0x3261U, 0x3361U, 0x3461U, 0x3561U, 0x3661U, 0x3761U,\n\t0x3861U, 0x3961U, 0x6161U, 0x6261U, 0x6361U, 0x6461U, 0x6561U, 0x6661U,\n\t0x3062U, 0x3162U, 0x3262U, 0x3362U, 0x3462U, 0x3562U, 0x3662U, 0x3762U,\n\t0x3862U, 0x3962U, 0x6162U, 0x6262U, 0x6362U, 0x6462U, 0x6562U, 0x6662U,\n\t0x3063U, 0x3163U, 0x3263U, 0x3363U, 0x3463U, 0x3563U, 0x3663U, 0x3763U,\n\t0x3863U, 0x3963U, 0x6163U, 0x6263U, 0x6363U, 0x6463U, 0x6563U, 0x6663U,\n\t0x3064U, 0x3164U, 0x3264U, 0x3364U, 0x3464U, 0x3564U, 0x3664U, 0x3764U,\n\t0x3864U, 0x3964U, 0x6164U, 0x6264U, 0x6364U, 0x6464U, 0x6564U, 0x6664U,\n\t0x3065U, 0x3165U, 0x3265U, 0x3365U, 0x3465U, 0x3565U, 0x3665U, 0x3765U,\n\t0x3865U, 0x3965U, 0x6165U, 0x6265U, 0x6365U, 0x6465U, 0x6565U, 0x6665U,\n\t0x3066U, 0x3166U, 0x3266U, 0x3366U, 0x3466U, 0x3566U, 0x3666U, 0x3766U,\n\t0x3866U, 0x3966U, 0x6166U, 0x6266U, 0x6366U, 0x6466U, 0x6566U, 0x6666U\n#endif  /* DUK_USE_INTEGER_BE */\n};\n#endif  /* DUK_USE_HEX_FASTPATH */\n\n/*\n *  Table for base-64 encoding\n */\n\n#if defined(DUK_USE_BASE64_FASTPATH)\nDUK_INTERNAL const duk_uint8_t duk_base64_enctab[64] = {\n\t0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,  /* A...P */\n\t0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,  /* Q...f */\n\t0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,  /* g...v */\n\t0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f   /* w.../ */\n};\n#endif  /* DUK_USE_BASE64_FASTPATH */\n\n/*\n *  Table for base-64 decoding\n */\n\n#if defined(DUK_USE_BASE64_FASTPATH)\nDUK_INTERNAL const duk_int8_t duk_base64_dectab[256] = {\n\t/* -1 = error, -2 = allowed whitespace, -3 = padding ('='), 0...63 decoded bytes */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -1, -1, -2, -1, -1,  /* 0x00...0x0f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x10...0x1f */\n\t-2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,  /* 0x20...0x2f */\n\t52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -3, -1, -1,  /* 0x30...0x3f */\n\t-1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  /* 0x40...0x4f */\n\t15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,  /* 0x50...0x5f */\n\t-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,  /* 0x60...0x6f */\n\t41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,  /* 0x70...0x7f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x80...0x8f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0x90...0x9f */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xa0...0xaf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xb0...0xbf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xc0...0xcf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xd0...0xdf */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  /* 0xe0...0xef */\n\t-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1   /* 0xf0...0xff */\n};\n#endif  /* DUK_USE_BASE64_FASTPATH */\n\n/*\n *  Arbitrary byteswap for potentially unaligned values\n *\n *  Used to byteswap pointers e.g. in debugger code.\n */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)  /* For now only needed by the debugger. */\nDUK_INTERNAL void duk_byteswap_bytes(duk_uint8_t *p, duk_small_uint_t len) {\n\tduk_uint8_t tmp;\n\tduk_uint8_t *q = p + len - 1;\n\n\twhile (p - q < 0) {\n\t\ttmp = *p;\n\t\t*p = *q;\n\t\t*q = tmp;\n\t\tp++;\n\t\tq--;\n\t}\n}\n#endif\n\n/*\n *  Miscellaneous coercion / clamping helpers.\n */\n\n/* Check whether a duk_double_t is a whole number in the 32-bit range (reject\n * negative zero), and if so, return a duk_int32_t.\n * For compiler use: don't allow negative zero as it will cause trouble with\n * LDINT+LDINTX, positive zero is OK.\n */\nDUK_INTERNAL duk_bool_t duk_is_whole_get_int32_nonegzero(duk_double_t x, duk_int32_t *ival) {\n\tduk_int32_t t;\n\n\tt = (duk_int32_t) x;\n\tif (!((duk_double_t) t == x)) {\n\t\treturn 0;\n\t}\n\tif (t == 0) {\n\t\tduk_double_union du;\n\t\tdu.d = x;\n\t\tif (DUK_DBLUNION_HAS_SIGNBIT(&du)) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\t*ival = t;\n\treturn 1;\n}\n\n/* Check whether a duk_double_t is a whole number in the 32-bit range, and if\n * so, return a duk_int32_t.\n */\nDUK_INTERNAL duk_bool_t duk_is_whole_get_int32(duk_double_t x, duk_int32_t *ival) {\n\tduk_int32_t t;\n\n\tt = (duk_int32_t) x;\n\tif (!((duk_double_t) t == x)) {\n\t\treturn 0;\n\t}\n\t*ival = t;\n\treturn 1;\n}\n\n/*\n *  IEEE double checks\n */\n\nDUK_INTERNAL duk_bool_t duk_double_is_anyinf(duk_double_t x) {\n\tduk_double_union du;\n\tdu.d = x;\n\treturn DUK_DBLUNION_IS_ANYINF(&du);\n}\n\nDUK_INTERNAL duk_bool_t duk_double_is_posinf(duk_double_t x) {\n\tduk_double_union du;\n\tdu.d = x;\n\treturn DUK_DBLUNION_IS_POSINF(&du);\n}\n\nDUK_INTERNAL duk_bool_t duk_double_is_neginf(duk_double_t x) {\n\tduk_double_union du;\n\tdu.d = x;\n\treturn DUK_DBLUNION_IS_NEGINF(&du);\n}\n\nDUK_INTERNAL duk_bool_t duk_double_is_nan(duk_double_t x) {\n\tduk_double_union du;\n\tdu.d = x;\n\t/* Assumes we're dealing with a Duktape internal NaN which is\n\t * NaN normalized if duk_tval requires it.\n\t */\n\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n\treturn DUK_DBLUNION_IS_NAN(&du);\n}\n\nDUK_INTERNAL duk_bool_t duk_double_is_nan_or_zero(duk_double_t x) {\n\tduk_double_union du;\n\tdu.d = x;\n\t/* Assumes we're dealing with a Duktape internal NaN which is\n\t * NaN normalized if duk_tval requires it.\n\t */\n\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n\treturn DUK_DBLUNION_IS_NAN(&du) || DUK_DBLUNION_IS_ANYZERO(&du);\n}\n\nDUK_INTERNAL duk_bool_t duk_double_is_nan_or_inf(duk_double_t x) {\n\tduk_double_union du;\n\tdu.d = x;\n\t/* If exponent is 0x7FF the argument is either a NaN or an\n\t * infinity.  We don't need to check any other fields.\n\t */\n#if defined(DUK_USE_64BIT_OPS)\n#if defined(DUK_USE_DOUBLE_ME)\n\treturn (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000)) == DUK_U64_CONSTANT(0x000000007ff00000);\n#else\n\treturn (du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000)) == DUK_U64_CONSTANT(0x7ff0000000000000);\n#endif\n#else\n\treturn (du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL) == 0x7ff00000UL;\n#endif\n}\n\nDUK_INTERNAL duk_bool_t duk_double_is_nan_zero_inf(duk_double_t x) {\n\tduk_double_union du;\n#if defined(DUK_USE_64BIT_OPS)\n\tduk_uint64_t t;\n#else\n\tduk_uint32_t t;\n#endif\n\tdu.d = x;\n#if defined(DUK_USE_64BIT_OPS)\n#if defined(DUK_USE_DOUBLE_ME)\n\tt = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x000000007ff00000);\n\tif (t == DUK_U64_CONSTANT(0x0000000000000000)) {\n\t\tt = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x0000000080000000);\n\t\treturn t == 0;\n\t}\n\tif (t == DUK_U64_CONSTANT(0x000000007ff00000)) {\n\t\treturn 1;\n\t}\n#else\n\tt = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x7ff0000000000000);\n\tif (t == DUK_U64_CONSTANT(0x0000000000000000)) {\n\t\tt = du.ull[DUK_DBL_IDX_ULL0] & DUK_U64_CONSTANT(0x8000000000000000);\n\t\treturn t == 0;\n\t}\n\tif (t == DUK_U64_CONSTANT(0x7ff0000000000000)) {\n\t\treturn 1;\n\t}\n#endif\n#else\n\tt = du.ui[DUK_DBL_IDX_UI0] & 0x7ff00000UL;\n\tif (t == 0x00000000UL) {\n\t\treturn DUK_DBLUNION_IS_ANYZERO(&du);\n\t}\n\tif (t == 0x7ff00000UL) {\n\t\treturn 1;\n\t}\n#endif\n\treturn 0;\n}\n\nDUK_INTERNAL duk_small_uint_t duk_double_signbit(duk_double_t x) {\n\tduk_double_union du;\n\tdu.d = x;\n\treturn (duk_small_uint_t) DUK_DBLUNION_GET_SIGNBIT(&du);\n}\n\nDUK_INTERNAL duk_double_t duk_double_trunc_towards_zero(duk_double_t x) {\n\t/* XXX: optimize */\n\tduk_small_uint_t s = duk_double_signbit(x);\n\tx = DUK_FLOOR(DUK_FABS(x));  /* truncate towards zero */\n\tif (s) {\n\t\tx = -x;\n\t}\n\treturn x;\n}\n\nDUK_INTERNAL duk_bool_t duk_double_same_sign(duk_double_t x, duk_double_t y) {\n\tduk_double_union du1;\n\tduk_double_union du2;\n\tdu1.d = x;\n\tdu2.d = y;\n\n\treturn (((du1.ui[DUK_DBL_IDX_UI0] ^ du2.ui[DUK_DBL_IDX_UI0]) & 0x80000000UL) == 0);\n}\n\nDUK_INTERNAL duk_double_t duk_double_fmin(duk_double_t x, duk_double_t y) {\n\t/* Doesn't replicate fmin() behavior exactly: for fmin() if one\n\t * argument is a NaN, the other argument should be returned.\n\t * Duktape doesn't rely on this behavior so the replacement can\n\t * be simplified.\n\t */\n\treturn (x < y ? x : y);\n}\n\nDUK_INTERNAL duk_double_t duk_double_fmax(duk_double_t x, duk_double_t y) {\n\t/* Doesn't replicate fmax() behavior exactly: for fmax() if one\n\t * argument is a NaN, the other argument should be returned.\n\t * Duktape doesn't rely on this behavior so the replacement can\n\t * be simplified.\n\t */\n\treturn (x > y ? x : y);\n}\n#line 1 \"duk_hobject_class.c\"\n/*\n *  Hobject Ecmascript [[Class]].\n */\n\n/* #include duk_internal.h -> already included */\n\n#if (DUK_STRIDX_UC_ARGUMENTS > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_BOOLEAN > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_DATE > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_ERROR > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_FUNCTION > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_JSON > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_MATH > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_NUMBER > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_OBJECT > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_REG_EXP > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_STRING > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_GLOBAL > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_OBJ_ENV > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_DEC_ENV > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_POINTER > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UC_THREAD > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_ARRAY_BUFFER > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_DATA_VIEW > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_INT8_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UINT8_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UINT8_CLAMPED_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_INT16_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UINT16_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_INT32_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_UINT32_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_FLOAT32_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_FLOAT64_ARRAY > 255)\n#error constant too large\n#endif\n#if (DUK_STRIDX_EMPTY_STRING > 255)\n#error constant too large\n#endif\n\n/* Note: assumes that these string indexes are 8-bit, genstrings.py must ensure that */\nDUK_INTERNAL duk_uint8_t duk_class_number_to_stridx[32] = {\n\tDUK_STRIDX_EMPTY_STRING,  /* NONE, intentionally empty */\n\tDUK_STRIDX_UC_OBJECT,\n\tDUK_STRIDX_ARRAY,\n\tDUK_STRIDX_UC_FUNCTION,\n\tDUK_STRIDX_UC_ARGUMENTS,\n\tDUK_STRIDX_UC_BOOLEAN,\n\tDUK_STRIDX_DATE,\n\tDUK_STRIDX_UC_ERROR,\n\tDUK_STRIDX_JSON,\n\tDUK_STRIDX_MATH,\n\tDUK_STRIDX_UC_NUMBER,\n\tDUK_STRIDX_REG_EXP,\n\tDUK_STRIDX_UC_STRING,\n\tDUK_STRIDX_GLOBAL,\n\tDUK_STRIDX_UC_SYMBOL,\n\tDUK_STRIDX_OBJ_ENV,\n\tDUK_STRIDX_DEC_ENV,\n\tDUK_STRIDX_UC_POINTER,\n\tDUK_STRIDX_UC_THREAD,\n\tDUK_STRIDX_ARRAY_BUFFER,\n\tDUK_STRIDX_DATA_VIEW,\n\tDUK_STRIDX_INT8_ARRAY,\n\tDUK_STRIDX_UINT8_ARRAY,\n\tDUK_STRIDX_UINT8_CLAMPED_ARRAY,\n\tDUK_STRIDX_INT16_ARRAY,\n\tDUK_STRIDX_UINT16_ARRAY,\n\tDUK_STRIDX_INT32_ARRAY,\n\tDUK_STRIDX_UINT32_ARRAY,\n\tDUK_STRIDX_FLOAT32_ARRAY,\n\tDUK_STRIDX_FLOAT64_ARRAY,\n\tDUK_STRIDX_EMPTY_STRING,  /* UNUSED, intentionally empty */\n\tDUK_STRIDX_EMPTY_STRING,  /* UNUSED, intentionally empty */\n};\n#line 1 \"duk_alloc_default.c\"\n/*\n *  Default allocation functions.\n *\n *  Assumes behavior such as malloc allowing zero size, yielding\n *  a NULL or a unique pointer which is a no-op for free.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS)\nDUK_INTERNAL void *duk_default_alloc_function(void *udata, duk_size_t size) {\n\tvoid *res;\n\tDUK_UNREF(udata);\n\tres = DUK_ANSI_MALLOC(size);\n\tDUK_DDD(DUK_DDDPRINT(\"default alloc function: %lu -> %p\",\n\t                     (unsigned long) size, (void *) res));\n\treturn res;\n}\n\nDUK_INTERNAL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize) {\n\tvoid *res;\n\tDUK_UNREF(udata);\n\tres = DUK_ANSI_REALLOC(ptr, newsize);\n\tDUK_DDD(DUK_DDDPRINT(\"default realloc function: %p %lu -> %p\",\n\t                     (void *) ptr, (unsigned long) newsize, (void *) res));\n\treturn res;\n}\n\nDUK_INTERNAL void duk_default_free_function(void *udata, void *ptr) {\n\tDUK_DDD(DUK_DDDPRINT(\"default free function: %p\", (void *) ptr));\n\tDUK_UNREF(udata);\n\tDUK_ANSI_FREE(ptr);\n}\n#endif  /* DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS */\n#line 1 \"duk_api_buffer.c\"\n/*\n *  Buffer\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_EXTERNAL void *duk_resize_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t new_size) {\n\tduk_hbuffer_dynamic *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\n\tif (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE);\n\t}\n\n\t/* maximum size check is handled by callee */\n\tduk_hbuffer_resize(thr, h, new_size);\n\n\treturn DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h);\n}\n\nDUK_EXTERNAL void *duk_steal_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {\n\tduk_hbuffer_dynamic *h;\n\tvoid *ptr;\n\tduk_size_t sz;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hbuffer_dynamic *) duk_require_hbuffer(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\n\tif (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE);\n\t}\n\n\t/* Forget the previous allocation, setting size to 0 and alloc to\n\t * NULL.  Caller is responsible for freeing the previous allocation.\n\t * Getting the allocation and clearing it is done in the same API\n\t * call to avoid any chance of a realloc.\n\t */\n\tptr = DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h);\n\tsz = DUK_HBUFFER_DYNAMIC_GET_SIZE(h);\n\tif (out_size) {\n\t\t*out_size = sz;\n\t}\n\tDUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(thr->heap, h);\n\tDUK_HBUFFER_DYNAMIC_SET_SIZE(h, 0);\n\n\treturn ptr;\n}\n\nDUK_EXTERNAL void duk_config_buffer(duk_hthread *thr, duk_idx_t idx, void *ptr, duk_size_t len) {\n\tduk_hbuffer_external *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hbuffer_external *) duk_require_hbuffer(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\n\tif (!DUK_HBUFFER_HAS_EXTERNAL(h)) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_WRONG_BUFFER_TYPE);\n\t}\n\tDUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h));\n\n\tDUK_HBUFFER_EXTERNAL_SET_DATA_PTR(thr->heap, h, ptr);\n\tDUK_HBUFFER_EXTERNAL_SET_SIZE(h, len);\n}\n#line 1 \"duk_api_bytecode.c\"\n/*\n *  Bytecode dump/load\n *\n *  The bytecode load primitive is more important performance-wise than the\n *  dump primitive.\n *\n *  Unlike most Duktape API calls, bytecode dump/load is not guaranteed to be\n *  memory safe for invalid arguments - caller beware!  There's little point\n *  in trying to achieve memory safety unless bytecode instructions are also\n *  validated which is not easy to do with indirect register references etc.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_BYTECODE_DUMP_SUPPORT)\n\n#define DUK__SER_MARKER  0xbf\n#define DUK__SER_STRING  0x00\n#define DUK__SER_NUMBER  0x01\n#define DUK__BYTECODE_INITIAL_ALLOC 256\n#define DUK__NO_FORMALS  0xffffffffUL\n\n/*\n *  Dump/load helpers, xxx_raw() helpers do no buffer checks\n */\n\nDUK_LOCAL duk_uint8_t *duk__load_string_raw(duk_hthread *thr, duk_uint8_t *p) {\n\tduk_uint32_t len;\n\n\tlen = DUK_RAW_READ_U32_BE(p);\n\tduk_push_lstring(thr, (const char *) p, len);\n\tp += len;\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__load_buffer_raw(duk_hthread *thr, duk_uint8_t *p) {\n\tduk_uint32_t len;\n\tduk_uint8_t *buf;\n\n\tlen = DUK_RAW_READ_U32_BE(p);\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len);\n\tDUK_ASSERT(buf != NULL);\n\tDUK_MEMCPY((void *) buf, (const void *) p, (size_t) len);\n\tp += len;\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__dump_hstring_raw(duk_uint8_t *p, duk_hstring *h) {\n\tduk_size_t len;\n\tduk_uint32_t tmp32;\n\n\tDUK_ASSERT(h != NULL);\n\n\tlen = DUK_HSTRING_GET_BYTELEN(h);\n\tDUK_ASSERT(len <= 0xffffffffUL);  /* string limits */\n\ttmp32 = (duk_uint32_t) len;\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\tDUK_MEMCPY((void *) p,\n\t           (const void *) DUK_HSTRING_GET_DATA(h),\n\t           len);\n\tp += len;\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__dump_hbuffer_raw(duk_hthread *thr, duk_uint8_t *p, duk_hbuffer *h) {\n\tduk_size_t len;\n\tduk_uint32_t tmp32;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(h != NULL);\n\tDUK_UNREF(thr);\n\n\tlen = DUK_HBUFFER_GET_SIZE(h);\n\tDUK_ASSERT(len <= 0xffffffffUL);  /* buffer limits */\n\ttmp32 = (duk_uint32_t) len;\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\tDUK_MEMCPY((void *) p,\n\t           (const void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h),\n\t           len);\n\tp += len;\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__dump_string_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) {\n\tduk_hstring *h_str;\n\tduk_tval *tv;\n\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx));\n\tif (tv != NULL && DUK_TVAL_IS_STRING(tv)) {\n\t\th_str = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h_str != NULL);\n\t} else {\n\t\th_str = DUK_HTHREAD_STRING_EMPTY_STRING(thr);\n\t\tDUK_ASSERT(h_str != NULL);\n\t}\n\tDUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL);  /* ensures no overflow */\n\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(h_str), p);\n\tp = duk__dump_hstring_raw(p, h_str);\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__dump_buffer_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) {\n\tduk_tval *tv;\n\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx));\n\tif (tv != NULL && DUK_TVAL_IS_BUFFER(tv)) {\n\t\tduk_hbuffer *h_buf;\n\t\th_buf = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h_buf != NULL);\n\t\tDUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7fffffffUL);  /* ensures no overflow */\n\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HBUFFER_GET_SIZE(h_buf), p);\n\t\tp = duk__dump_hbuffer_raw(thr, p, h_buf);\n\t} else {\n\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);\n\t\tDUK_RAW_WRITE_U32_BE(p, 0);\n\t}\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__dump_uint32_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx, duk_uint32_t def_value) {\n\tduk_tval *tv;\n\tduk_uint32_t val;\n\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx));\n\tif (tv != NULL && DUK_TVAL_IS_NUMBER(tv)) {\n\t\tval = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv);\n\t} else {\n\t\tval = def_value;\n\t}\n\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);\n\tDUK_RAW_WRITE_U32_BE(p, val);\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__dump_varmap(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) {\n\tduk_tval *tv;\n\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_VARMAP(thr));\n\tif (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h;\n\t\tduk_uint_fast32_t i;\n\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\t/* We know _Varmap only has own properties so walk property\n\t\t * table directly.  We also know _Varmap is dense and all\n\t\t * values are numbers; assert for these.  GC and finalizers\n\t\t * shouldn't affect _Varmap so side effects should be fine.\n\t\t */\n\t\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) {\n\t\t\tduk_hstring *key;\n\t\t\tduk_tval *tv_val;\n\t\t\tduk_uint32_t val;\n\n\t\t\tkey = DUK_HOBJECT_E_GET_KEY(thr->heap, h, i);\n\t\t\tDUK_ASSERT(key != NULL);  /* _Varmap is dense */\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h, i));\n\t\t\ttv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h, i);\n\t\t\tDUK_ASSERT(tv_val != NULL);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_val));  /* known to be number; in fact an integer */\n#if defined(DUK_USE_FASTINT)\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_val));\n\t\t\tDUK_ASSERT(DUK_TVAL_GET_FASTINT(tv_val) == (duk_int64_t) DUK_TVAL_GET_FASTINT_U32(tv_val));  /* known to be 32-bit */\n\t\t\tval = DUK_TVAL_GET_FASTINT_U32(tv_val);\n#else\n\t\t\tval = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv_val);\n#endif\n\n\t\t\tDUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL);  /* ensures no overflow */\n\t\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(key) + 4U, p);\n\t\t\tp = duk__dump_hstring_raw(p, key);\n\t\t\tDUK_RAW_WRITE_U32_BE(p, val);\n\t\t}\n\t}\n\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);\n\tDUK_RAW_WRITE_U32_BE(p, 0);  /* end of _Varmap */\n\treturn p;\n}\n\nDUK_LOCAL duk_uint8_t *duk__dump_formals(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) {\n\tduk_tval *tv;\n\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_FORMALS(thr));\n\tif (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_harray *h;\n\t\tduk_uint32_t i;\n\n\t\t/* Here we rely on _Formals being a dense array containing\n\t\t * strings.  This should be the case unless _Formals has been\n\t\t * tweaked by the application (which we don't support right\n\t\t * now).\n\t\t */\n\t\th = (duk_harray *) DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_ARRAY((duk_hobject *) h));\n\t\tDUK_ASSERT(h->length <= DUK_HOBJECT_GET_ASIZE((duk_hobject *) h));\n\n\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);\n\t\tDUK_ASSERT(h->length != DUK__NO_FORMALS);  /* limits */\n\t\tDUK_RAW_WRITE_U32_BE(p, h->length);\n\n\t\tfor (i = 0; i < h->length; i++) {\n\t\t\tduk_tval *tv_val;\n\t\t\tduk_hstring *varname;\n\n\t\t\ttv_val = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, (duk_hobject *) h, i);\n\t\t\tDUK_ASSERT(tv_val != NULL);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv_val));\n\n\t\t\tvarname = DUK_TVAL_GET_STRING(tv_val);\n\t\t\tDUK_ASSERT(varname != NULL);\n\t\t\tDUK_ASSERT(DUK_HSTRING_GET_BYTELEN(varname) >= 1);\n\n\t\t\tDUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL);  /* ensures no overflow */\n\t\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U + DUK_HSTRING_GET_BYTELEN(varname), p);\n\t\t\tp = duk__dump_hstring_raw(p, varname);\n\t\t}\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"dumping function without _Formals, emit marker to indicate missing _Formals\"));\n\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4U, p);\n\t\tDUK_RAW_WRITE_U32_BE(p, DUK__NO_FORMALS);  /* marker: no formals */\n\t}\n\treturn p;\n}\n\nstatic duk_uint8_t *duk__dump_func(duk_hthread *thr, duk_hcompfunc *func, duk_bufwriter_ctx *bw_ctx, duk_uint8_t *p) {\n\tduk_tval *tv, *tv_end;\n\tduk_instr_t *ins, *ins_end;\n\tduk_hobject **fn, **fn_end;\n\tduk_hstring *h_str;\n\tduk_uint32_t count_instr;\n\tduk_uint32_t tmp32;\n\tduk_uint16_t tmp16;\n\tduk_double_t d;\n\n\tDUK_DD(DUK_DDPRINT(\"dumping function %p to %p: \"\n\t                   \"consts=[%p,%p[ (%ld bytes, %ld items), \"\n\t                   \"funcs=[%p,%p[ (%ld bytes, %ld items), \"\n\t                   \"code=[%p,%p[ (%ld bytes, %ld items)\",\n\t                   (void *) func,\n\t                   (void *) p,\n\t                   (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func),\n\t                   (void *) DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func),\n\t                   (long) DUK_HCOMPFUNC_GET_CONSTS_SIZE(thr->heap, func),\n\t                   (long) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func),\n\t                   (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func),\n\t                   (void *) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func),\n\t                   (long) DUK_HCOMPFUNC_GET_FUNCS_SIZE(thr->heap, func),\n\t                   (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func),\n\t                   (void *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func),\n\t                   (void *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func),\n\t                   (long) DUK_HCOMPFUNC_GET_CODE_SIZE(thr->heap, func),\n\t                   (long) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func)));\n\n\tDUK_ASSERT(DUK_USE_ESBC_MAX_BYTES <= 0x7fffffffUL);  /* ensures no overflow */\n\tcount_instr = (duk_uint32_t) DUK_HCOMPFUNC_GET_CODE_COUNT(thr->heap, func);\n\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 3U * 4U + 2U * 2U + 3U * 4U + count_instr * 4U, p);\n\n\t/* Fixed header info. */\n\ttmp32 = count_instr;\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\ttmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_CONSTS_COUNT(thr->heap, func);\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\ttmp32 = (duk_uint32_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, func);\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\ttmp16 = func->nregs;\n\tDUK_RAW_WRITE_U16_BE(p, tmp16);\n\ttmp16 = func->nargs;\n\tDUK_RAW_WRITE_U16_BE(p, tmp16);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\ttmp32 = func->start_line;\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\ttmp32 = func->end_line;\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n#else\n\tDUK_RAW_WRITE_U32_BE(p, 0);\n\tDUK_RAW_WRITE_U32_BE(p, 0);\n#endif\n\ttmp32 = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) func);  /* masks flags, only duk_hobject flags */\n\ttmp32 &= ~(DUK_HOBJECT_FLAG_HAVE_FINALIZER);  /* finalizer flag is lost */\n\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\n\t/* Bytecode instructions: endian conversion needed unless\n\t * platform is big endian.\n\t */\n\tins = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, func);\n\tins_end = DUK_HCOMPFUNC_GET_CODE_END(thr->heap, func);\n\tDUK_ASSERT((duk_size_t) (ins_end - ins) == (duk_size_t) count_instr);\n#if defined(DUK_USE_INTEGER_BE)\n\tDUK_MEMCPY((void *) p, (const void *) ins, (size_t) (ins_end - ins));\n\tp += (size_t) (ins_end - ins);\n#else\n\twhile (ins != ins_end) {\n\t\ttmp32 = (duk_uint32_t) (*ins);\n\t\tDUK_RAW_WRITE_U32_BE(p, tmp32);\n\t\tins++;\n\t}\n#endif\n\n\t/* Constants: variable size encoding. */\n\ttv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, func);\n\ttv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, func);\n\twhile (tv != tv_end) {\n\t\t/* constants are strings or numbers now */\n\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv) ||\n\t\t           DUK_TVAL_IS_NUMBER(tv));\n\n\t\tif (DUK_TVAL_IS_STRING(tv)) {\n\t\t\th_str = DUK_TVAL_GET_STRING(tv);\n\t\t\tDUK_ASSERT(h_str != NULL);\n\t\t\tDUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL);  /* ensures no overflow */\n\t\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 4U + DUK_HSTRING_GET_BYTELEN(h_str), p),\n\t\t\t*p++ = DUK__SER_STRING;\n\t\t\tp = duk__dump_hstring_raw(p, h_str);\n\t\t} else {\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\t\tp = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1U + 8U, p);\n\t\t\t*p++ = DUK__SER_NUMBER;\n\t\t\td = DUK_TVAL_GET_NUMBER(tv);\n\t\t\tDUK_RAW_WRITE_DOUBLE_BE(p, d);\n\t\t}\n\t\ttv++;\n\t}\n\n\t/* Inner functions recursively. */\n\tfn = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, func);\n\tfn_end = (duk_hobject **) DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, func);\n\twhile (fn != fn_end) {\n\t\t/* XXX: This causes recursion up to inner function depth\n\t\t * which is normally not an issue, e.g. mark-and-sweep uses\n\t\t * a recursion limiter to avoid C stack issues.  Avoiding\n\t\t * this would mean some sort of a work list or just refusing\n\t\t * to serialize deep functions.\n\t\t */\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(*fn));\n\t\tp = duk__dump_func(thr, (duk_hcompfunc *) *fn, bw_ctx, p);\n\t\tfn++;\n\t}\n\n\t/* Lexenv and varenv are not dumped. */\n\n\t/* Object extra properties.\n\t *\n\t * There are some difference between function templates and functions.\n\t * For example, function templates don't have .length and nargs is\n\t * normally used to instantiate the functions.\n\t */\n\n\tp = duk__dump_uint32_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_LENGTH, (duk_uint32_t) func->nargs);\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\tp = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_NAME);\n#endif\n#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)\n\tp = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_FILE_NAME);\n#endif\n#if defined(DUK_USE_PC2LINE)\n\tp = duk__dump_buffer_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_INT_PC2LINE);\n#endif\n\tp = duk__dump_varmap(thr, p, bw_ctx, (duk_hobject *) func);\n\tp = duk__dump_formals(thr, p, bw_ctx, (duk_hobject *) func);\n\n\tDUK_DD(DUK_DDPRINT(\"serialized function %p -> final pointer %p\", (void *) func, (void *) p));\n\n\treturn p;\n}\n\n/* Load a function from bytecode.  The function object returned here must\n * match what is created by duk_js_push_closure() with respect to its flags,\n * properties, etc.\n *\n * NOTE: there are intentionally no input buffer length / bound checks.\n * Adding them would be easy but wouldn't ensure memory safety as untrusted\n * or broken bytecode is unsafe during execution unless the opcodes themselves\n * are validated (which is quite complex, especially for indirect opcodes).\n */\n\n#define DUK__ASSERT_LEFT(n) do { \\\n\t\tDUK_ASSERT((duk_size_t) (p_end - p) >= (duk_size_t) (n)); \\\n\t} while (0)\n\nstatic duk_uint8_t *duk__load_func(duk_hthread *thr, duk_uint8_t *p, duk_uint8_t *p_end) {\n\tduk_hcompfunc *h_fun;\n\tduk_hbuffer *h_data;\n\tduk_size_t data_size;\n\tduk_uint32_t count_instr, count_const, count_funcs;\n\tduk_uint32_t n;\n\tduk_uint32_t tmp32;\n\tduk_small_uint_t const_type;\n\tduk_uint8_t *fun_data;\n\tduk_uint8_t *q;\n\tduk_idx_t idx_base;\n\tduk_tval *tv1;\n\tduk_uarridx_t arr_idx;\n\tduk_uarridx_t arr_limit;\n\tduk_hobject *func_env;\n\tduk_bool_t need_pop;\n\n\t/* XXX: There's some overlap with duk_js_closure() here, but\n\t * seems difficult to share code.  Ensure that the final function\n\t * looks the same as created by duk_js_closure().\n\t */\n\n\tDUK_ASSERT(thr != NULL);\n\n\tDUK_DD(DUK_DDPRINT(\"loading function, p=%p, p_end=%p\", (void *) p, (void *) p_end));\n\n\tDUK__ASSERT_LEFT(3 * 4);\n\tcount_instr = DUK_RAW_READ_U32_BE(p);\n\tcount_const = DUK_RAW_READ_U32_BE(p);\n\tcount_funcs = DUK_RAW_READ_U32_BE(p);\n\n\tdata_size = sizeof(duk_tval) * count_const +\n\t            sizeof(duk_hobject *) * count_funcs +\n\t            sizeof(duk_instr_t) * count_instr;\n\n\tDUK_DD(DUK_DDPRINT(\"instr=%ld, const=%ld, funcs=%ld, data_size=%ld\",\n\t                   (long) count_instr, (long) count_const,\n\t                   (long) count_const, (long) data_size));\n\n\t/* Value stack is used to ensure reachability of constants and\n\t * inner functions being loaded.  Require enough space to handle\n\t * large functions correctly.\n\t */\n\tduk_require_stack(thr, (duk_idx_t) (2 + count_const + count_funcs));\n\tidx_base = duk_get_top(thr);\n\n\t/* Push function object, init flags etc.  This must match\n\t * duk_js_push_closure() quite carefully.\n\t */\n\th_fun = duk_push_hcompfunc(thr);\n\tDUK_ASSERT(h_fun != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) h_fun));\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun) == NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, h_fun) == NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, h_fun) == NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n\n\th_fun->nregs = DUK_RAW_READ_U16_BE(p);\n\th_fun->nargs = DUK_RAW_READ_U16_BE(p);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\th_fun->start_line = DUK_RAW_READ_U32_BE(p);\n\th_fun->end_line = DUK_RAW_READ_U32_BE(p);\n#else\n\tp += 8;  /* skip line info */\n#endif\n\n\t/* duk_hcompfunc flags; quite version specific */\n\ttmp32 = DUK_RAW_READ_U32_BE(p);\n\tDUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) h_fun, tmp32);  /* masks flags to only change duk_hobject flags */\n\n\t/* standard prototype (no need to set here, already set) */\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_fun) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n#if 0\n\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &h_fun->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n#endif\n\n\t/* assert just a few critical flags */\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h_fun) == DUK_HTYPE_OBJECT);\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&h_fun->obj));\n\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&h_fun->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&h_fun->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&h_fun->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&h_fun->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&h_fun->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&h_fun->obj));\n\n\t/* Create function 'data' buffer but don't attach it yet. */\n\tfun_data = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, data_size);\n\tDUK_ASSERT(fun_data != NULL);\n\n\t/* Load bytecode instructions. */\n\tDUK_ASSERT(sizeof(duk_instr_t) == 4);\n\tDUK__ASSERT_LEFT(count_instr * sizeof(duk_instr_t));\n#if defined(DUK_USE_INTEGER_BE)\n\tq = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs;\n\tDUK_MEMCPY((void *) q,\n\t           (const void *) p,\n\t           sizeof(duk_instr_t) * count_instr);\n\tp += sizeof(duk_instr_t) * count_instr;\n#else\n\tq = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs;\n\tfor (n = count_instr; n > 0; n--) {\n\t\t*((duk_instr_t *) (void *) q) = DUK_RAW_READ_U32_BE(p);\n\t\tq += sizeof(duk_instr_t);\n\t}\n#endif\n\n\t/* Load constants onto value stack but don't yet copy to buffer. */\n\tfor (n = count_const; n > 0; n--) {\n\t\tDUK__ASSERT_LEFT(1);\n\t\tconst_type = DUK_RAW_READ_U8(p);\n\t\tswitch (const_type) {\n\t\tcase DUK__SER_STRING: {\n\t\t\tp = duk__load_string_raw(thr, p);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK__SER_NUMBER: {\n\t\t\t/* Important to do a fastint check so that constants are\n\t\t\t * properly read back as fastints.\n\t\t\t */\n\t\t\tduk_tval tv_tmp;\n\t\t\tduk_double_t val;\n\t\t\tDUK__ASSERT_LEFT(8);\n\t\t\tval = DUK_RAW_READ_DOUBLE_BE(p);\n\t\t\tDUK_TVAL_SET_NUMBER_CHKFAST_SLOW(&tv_tmp, val);\n\t\t\tduk_push_tval(thr, &tv_tmp);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tgoto format_error;\n\t\t}\n\t\t}\n\t}\n\n\t/* Load inner functions to value stack, but don't yet copy to buffer. */\n\tfor (n = count_funcs; n > 0; n--) {\n\t\tp = duk__load_func(thr, p, p_end);\n\t\tif (p == NULL) {\n\t\t\tgoto format_error;\n\t\t}\n\t}\n\n\t/* With constants and inner functions on value stack, we can now\n\t * atomically finish the function 'data' buffer, bump refcounts,\n\t * etc.\n\t *\n\t * Here we take advantage of the value stack being just a duk_tval\n\t * array: we can just memcpy() the constants as long as we incref\n\t * them afterwards.\n\t */\n\n\th_data = (duk_hbuffer *) duk_known_hbuffer(thr, idx_base + 1);\n\tDUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC(h_data));\n\tDUK_HCOMPFUNC_SET_DATA(thr->heap, h_fun, h_data);\n\tDUK_HBUFFER_INCREF(thr, h_data);\n\n\ttv1 = duk_get_tval(thr, idx_base + 2);  /* may be NULL if no constants or inner funcs */\n\tDUK_ASSERT((count_const == 0 && count_funcs == 0) || tv1 != NULL);\n\n\tq = fun_data;\n\tif (count_const > 0) {\n\t\t/* Explicit zero size check to avoid NULL 'tv1'. */\n\t\tDUK_MEMCPY((void *) q, (const void *) tv1, sizeof(duk_tval) * count_const);\n\t\tfor (n = count_const; n > 0; n--) {\n\t\t\tDUK_TVAL_INCREF_FAST(thr, (duk_tval *) (void *) q);  /* no side effects */\n\t\t\tq += sizeof(duk_tval);\n\t\t}\n\t\ttv1 += count_const;\n\t}\n\n\tDUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_fun, (duk_hobject **) (void *) q);\n\tfor (n = count_funcs; n > 0; n--) {\n\t\tduk_hobject *h_obj;\n\n\t\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1));\n\t\th_obj = DUK_TVAL_GET_OBJECT(tv1);\n\t\tDUK_ASSERT(h_obj != NULL);\n\t\ttv1++;\n\t\tDUK_HOBJECT_INCREF(thr, h_obj);\n\n\t\t*((duk_hobject **) (void *) q) = h_obj;\n\t\tq += sizeof(duk_hobject *);\n\t}\n\n\tDUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_fun, (duk_instr_t *) (void *) q);\n\n\t/* The function object is now reachable and refcounts are fine,\n\t * so we can pop off all the temporaries.\n\t */\n\tDUK_DDD(DUK_DDDPRINT(\"function is reachable, reset top; func: %!iT\", duk_get_tval(thr, idx_base)));\n\tduk_set_top(thr, idx_base + 1);\n\n\t/* Setup function properties. */\n\ttmp32 = DUK_RAW_READ_U32_BE(p);\n\tduk_push_u32(thr, tmp32);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C);\n\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\tp = duk__load_string_raw(thr, p);  /* -> [ func funcname ] */\n\tfunc_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\tDUK_ASSERT(func_env != NULL);\n\tneed_pop = 0;\n\tif (DUK_HOBJECT_HAS_NAMEBINDING((duk_hobject *) h_fun)) {\n\t\t/* Original function instance/template had NAMEBINDING.\n\t\t * Must create a lexical environment on loading to allow\n\t\t * recursive functions like 'function foo() { foo(); }'.\n\t\t */\n\t\tduk_hdecenv *new_env;\n\n\t\tnew_env = duk_hdecenv_alloc(thr,\n\t\t                            DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t                            DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));\n\t\tDUK_ASSERT(new_env != NULL);\n\t\tDUK_ASSERT(new_env->thread == NULL);  /* Closed. */\n\t\tDUK_ASSERT(new_env->varmap == NULL);\n\t\tDUK_ASSERT(new_env->regbase_byteoff == 0);\n\t\tDUK_ASSERT_HDECENV_VALID(new_env);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);\n\t\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, func_env);\n\t\tDUK_HOBJECT_INCREF(thr, func_env);\n\n\t\tfunc_env = (duk_hobject *) new_env;\n\n\t\tduk_push_hobject(thr, (duk_hobject *) new_env);\n\n\t\tduk_dup_m2(thr);                                  /* -> [ func funcname env funcname ] */\n\t\tduk_dup(thr, idx_base);                           /* -> [ func funcname env funcname func ] */\n\t\tduk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE);  /* -> [ func funcname env ] */\n\n\t\tneed_pop = 1;  /* Need to pop env, but -after- updating h_fun and increfs. */\n\t}\n\tDUK_ASSERT(func_env != NULL);\n\tDUK_HCOMPFUNC_SET_LEXENV(thr->heap, h_fun, func_env);\n\tDUK_HCOMPFUNC_SET_VARENV(thr->heap, h_fun, func_env);\n\tDUK_HOBJECT_INCREF(thr, func_env);\n\tDUK_HOBJECT_INCREF(thr, func_env);\n\tif (need_pop) {\n\t\tduk_pop(thr);\n\t}\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);\n#endif  /* DUK_USE_FUNC_NAME_PROPERTY */\n\n#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)\n\tp = duk__load_string_raw(thr, p);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C);\n#endif  /* DUK_USE_FUNC_FILENAME_PROPERTY */\n\n\tif (DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_fun)) {\n\t\t/* Restore empty external .prototype only for constructable\n\t\t * functions.\n\t\t */\n\t\tduk_push_object(thr);\n\t\tduk_dup_m2(thr);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC);  /* func.prototype.constructor = func */\n\t\tduk_compact_m1(thr);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W);\n\t}\n\n#if defined(DUK_USE_PC2LINE)\n\tp = duk__load_buffer_raw(thr, p);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_WC);\n#endif  /* DUK_USE_PC2LINE */\n\n\tduk_push_object(thr);  /* _Varmap */\n\tfor (;;) {\n\t\t/* XXX: awkward */\n\t\tp = duk__load_string_raw(thr, p);\n\t\tif (duk_get_length(thr, -1) == 0) {\n\t\t\tduk_pop(thr);\n\t\t\tbreak;\n\t\t}\n\t\ttmp32 = DUK_RAW_READ_U32_BE(p);\n\t\tduk_push_u32(thr, tmp32);\n\t\tduk_put_prop(thr, -3);\n\t}\n\tduk_compact_m1(thr);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE);\n\n\t/* _Formals may have been missing in the original function, which is\n\t * handled using a marker length.\n\t */\n\tarr_limit = DUK_RAW_READ_U32_BE(p);\n\tif (arr_limit != DUK__NO_FORMALS) {\n\t\tduk_push_array(thr);  /* _Formals */\n\t\tfor (arr_idx = 0; arr_idx < arr_limit; arr_idx++) {\n\t\t\tp = duk__load_string_raw(thr, p);\n\t\t\tduk_put_prop_index(thr, -2, arr_idx);\n\t\t}\n\t\tduk_compact_m1(thr);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE);\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"no _Formals in dumped function\"));\n\t}\n\n\t/* Return with final function pushed on stack top. */\n\tDUK_DD(DUK_DDPRINT(\"final loaded function: %!iT\", duk_get_tval(thr, -1)));\n\tDUK_ASSERT_TOP(thr, idx_base + 1);\n\treturn p;\n\n format_error:\n\treturn NULL;\n}\n\nDUK_EXTERNAL void duk_dump_function(duk_hthread *thr) {\n\tduk_hcompfunc *func;\n\tduk_bufwriter_ctx bw_ctx_alloc;\n\tduk_bufwriter_ctx *bw_ctx = &bw_ctx_alloc;\n\tduk_uint8_t *p;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Bound functions don't have all properties so we'd either need to\n\t * lookup the non-bound target function or reject bound functions.\n\t * For now, bound functions are rejected with TypeError.\n\t */\n\tfunc = duk_require_hcompfunc(thr, -1);\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&func->obj));\n\n\t/* Estimating the result size beforehand would be costly, so\n\t * start with a reasonable size and extend as needed.\n\t */\n\tDUK_BW_INIT_PUSHBUF(thr, bw_ctx, DUK__BYTECODE_INITIAL_ALLOC);\n\tp = DUK_BW_GET_PTR(thr, bw_ctx);\n\t*p++ = DUK__SER_MARKER;\n\tp = duk__dump_func(thr, func, bw_ctx, p);\n\tDUK_BW_SET_PTR(thr, bw_ctx, p);\n\tDUK_BW_COMPACT(thr, bw_ctx);\n\n\tDUK_DD(DUK_DDPRINT(\"serialized result: %!T\", duk_get_tval(thr, -1)));\n\n\tduk_remove_m2(thr);  /* [ ... func buf ] -> [ ... buf ] */\n}\n\nDUK_EXTERNAL void duk_load_function(duk_hthread *thr) {\n\tduk_uint8_t *p_buf, *p, *p_end;\n\tduk_size_t sz;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tp_buf = (duk_uint8_t *) duk_require_buffer(thr, -1, &sz);\n\tDUK_ASSERT(p_buf != NULL);\n\n\t/* The caller is responsible for being sure that bytecode being loaded\n\t * is valid and trusted.  Invalid bytecode can cause memory unsafe\n\t * behavior directly during loading or later during bytecode execution\n\t * (instruction validation would be quite complex to implement).\n\t *\n\t * This signature check is the only sanity check for detecting\n\t * accidental invalid inputs.  The initial byte ensures no ordinary\n\t * string or Symbol will be accepted by accident.\n\t */\n\tp = p_buf;\n\tp_end = p_buf + sz;\n\tif (sz < 1 || p[0] != DUK__SER_MARKER) {\n\t\tgoto format_error;\n\t}\n\tp++;\n\n\tp = duk__load_func(thr, p, p_end);\n\tif (p == NULL) {\n\t\tgoto format_error;\n\t}\n\n\tduk_remove_m2(thr);  /* [ ... buf func ] -> [ ... func ] */\n\treturn;\n\n format_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_BYTECODE);\n}\n\n#else  /* DUK_USE_BYTECODE_DUMP_SUPPORT */\n\nDUK_EXTERNAL void duk_dump_function(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n\nDUK_EXTERNAL void duk_load_function(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n\n#endif  /* DUK_USE_BYTECODE_DUMP_SUPPORT */\n\n/* automatic undefs */\n#undef DUK__ASSERT_LEFT\n#undef DUK__BYTECODE_INITIAL_ALLOC\n#undef DUK__NO_FORMALS\n#undef DUK__SER_MARKER\n#undef DUK__SER_NUMBER\n#undef DUK__SER_STRING\n#line 1 \"duk_api_call.c\"\n/*\n *  Calls.\n *\n *  Protected variants should avoid ever throwing an error.  Must be careful\n *  to catch errors related to value stack manipulation and property lookup,\n *  not just the call itself.\n *\n *  The only exception is when arguments are insane, e.g. nargs/nrets are out\n *  of bounds; in such cases an error is thrown for two reasons.  First, we\n *  can't always respect the value stack input/output guarantees in such cases\n *  so the caller would end up with the value stack in an unexpected state.\n *  Second, an attempt to create an error might itself fail (although this\n *  could be avoided by pushing a preallocated object/string or a primitive\n *  value).\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Helpers\n */\n\nstruct duk__pcall_prop_args {\n\tduk_idx_t obj_idx;\n\tduk_idx_t nargs;\n\tduk_small_uint_t call_flags;\n};\ntypedef struct duk__pcall_prop_args duk__pcall_prop_args;\n\nstruct duk__pcall_method_args {\n\tduk_idx_t nargs;\n\tduk_small_uint_t call_flags;\n};\ntypedef struct duk__pcall_method_args duk__pcall_method_args;\n\nstruct duk__pcall_args {\n\tduk_idx_t nargs;\n\tduk_small_uint_t call_flags;\n};\ntypedef struct duk__pcall_args duk__pcall_args;\n\n/* Compute and validate idx_func for a certain 'nargs' and 'other'\n * parameter count (1 or 2, depending on whether 'this' binding is\n * present).\n */\nDUK_LOCAL duk_idx_t duk__call_get_idx_func(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) {\n\tduk_idx_t idx_func;\n\n\t/* XXX: byte arithmetic? */\n\n\tDUK_ASSERT(other >= 0);\n\n\tidx_func = duk_get_top(thr) - nargs - other;\n\tif (DUK_UNLIKELY((idx_func | nargs) < 0)) {  /* idx_func < 0 || nargs < 0; OR sign bits */\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\t/* unreachable */\n\t}\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\treturn idx_func;\n}\n\n/* Compute idx_func, assume index will be valid.  This is a valid assumption\n * for protected calls: nargs < 0 is checked explicitly and duk_safe_call()\n * validates the argument count.\n */\nDUK_LOCAL duk_idx_t duk__call_get_idx_func_unvalidated(duk_hthread *thr, duk_idx_t nargs, duk_idx_t other) {\n\tduk_idx_t idx_func;\n\n\t/* XXX: byte arithmetic? */\n\n\tDUK_ASSERT(nargs >= 0);\n\tDUK_ASSERT(other >= 0);\n\n\tidx_func = duk_get_top(thr) - nargs - other;\n\tDUK_ASSERT(idx_func >= 0);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\treturn idx_func;\n}\n\n/* Prepare value stack for a method call through an object property.\n * May currently throw an error e.g. when getting the property.\n */\nDUK_LOCAL void duk__call_prop_prep_stack(duk_hthread *thr, duk_idx_t normalized_obj_idx, duk_idx_t nargs) {\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(nargs >= 0);\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__call_prop_prep_stack, normalized_obj_idx=%ld, nargs=%ld, stacktop=%ld\",\n\t                     (long) normalized_obj_idx, (long) nargs, (long) duk_get_top(thr)));\n\n\t/* [... key arg1 ... argN] */\n\n\t/* duplicate key */\n\tduk_dup(thr, -nargs - 1);  /* Note: -nargs alone would fail for nargs == 0, this is OK */\n\t(void) duk_get_prop(thr, normalized_obj_idx);\n\n\tDUK_DDD(DUK_DDDPRINT(\"func: %!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\tif (DUK_UNLIKELY(!duk_is_callable(thr, -1))) {\n\t\tduk_tval *tv_targ;\n\t\tduk_tval *tv_base;\n\t\tduk_tval *tv_key;\n\n\t\ttv_targ = DUK_GET_TVAL_NEGIDX(thr, -1);\n\t\ttv_base = DUK_GET_TVAL_POSIDX(thr, normalized_obj_idx);\n\t\ttv_key = DUK_GET_TVAL_NEGIDX(thr, -nargs - 2);\n\t\tDUK_ASSERT(tv_targ >= thr->valstack_bottom && tv_targ < thr->valstack_top);\n\t\tDUK_ASSERT(tv_base >= thr->valstack_bottom && tv_base < thr->valstack_top);\n\t\tDUK_ASSERT(tv_key >= thr->valstack_bottom && tv_key < thr->valstack_top);\n\n\t\tduk_call_setup_propcall_error(thr, tv_targ, tv_base, tv_key);\n\t}\n#endif\n\n\t/* [... key arg1 ... argN func] */\n\n\tduk_replace(thr, -nargs - 2);\n\n\t/* [... func arg1 ... argN] */\n\n\tduk_dup(thr, normalized_obj_idx);\n\tduk_insert(thr, -nargs - 1);\n\n\t/* [... func this arg1 ... argN] */\n}\n\nDUK_EXTERNAL void duk_call(duk_hthread *thr, duk_idx_t nargs) {\n\tduk_small_uint_t call_flags;\n\tduk_idx_t idx_func;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx_func = duk__call_get_idx_func(thr, nargs, 1);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\n\tduk_insert_undefined(thr, idx_func + 1);\n\n\tcall_flags = 0;  /* not protected, respect reclimit, not constructor */\n\tduk_handle_call_unprotected(thr, idx_func, call_flags);\n}\n\nDUK_EXTERNAL void duk_call_method(duk_hthread *thr, duk_idx_t nargs) {\n\tduk_small_uint_t call_flags;\n\tduk_idx_t idx_func;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx_func = duk__call_get_idx_func(thr, nargs, 2);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\n\tcall_flags = 0;  /* not protected, respect reclimit, not constructor */\n\tduk_handle_call_unprotected(thr, idx_func, call_flags);\n}\n\nDUK_EXTERNAL void duk_call_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) {\n\t/*\n\t *  XXX: if duk_handle_call() took values through indices, this could be\n\t *  made much more sensible.  However, duk_handle_call() needs to fudge\n\t *  the 'this' and 'func' values to handle bound functions, which is now\n\t *  done \"in-place\", so this is not a trivial change.\n\t */\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);  /* make absolute */\n\tif (DUK_UNLIKELY(nargs < 0)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\tduk__call_prop_prep_stack(thr, obj_idx, nargs);\n\n\tduk_call_method(thr, nargs);\n}\n\nDUK_LOCAL duk_ret_t duk__pcall_raw(duk_hthread *thr, void *udata) {\n\tduk__pcall_args *args;\n\tduk_idx_t idx_func;\n\tduk_int_t ret;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(udata != NULL);\n\n\targs = (duk__pcall_args *) udata;\n\tidx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 1);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\n\tduk_insert_undefined(thr, idx_func + 1);\n\n\tret = duk_handle_call_unprotected(thr, idx_func, args->call_flags);\n\tDUK_ASSERT(ret == 0);\n\tDUK_UNREF(ret);\n\n\treturn 1;\n}\n\nDUK_EXTERNAL duk_int_t duk_pcall(duk_hthread *thr, duk_idx_t nargs) {\n\tduk__pcall_args args;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\targs.nargs = nargs;\n\tif (DUK_UNLIKELY(nargs < 0)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\treturn DUK_EXEC_ERROR;  /* unreachable */\n\t}\n\targs.call_flags = 0;\n\n\treturn duk_safe_call(thr, duk__pcall_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/);\n}\n\nDUK_LOCAL duk_ret_t duk__pcall_method_raw(duk_hthread *thr, void *udata) {\n\tduk__pcall_method_args *args;\n\tduk_idx_t idx_func;\n\tduk_int_t ret;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(udata != NULL);\n\n\targs = (duk__pcall_method_args *) udata;\n\n\tidx_func = duk__call_get_idx_func_unvalidated(thr, args->nargs, 2);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\n\tret = duk_handle_call_unprotected(thr, idx_func, args->call_flags);\n\tDUK_ASSERT(ret == 0);\n\tDUK_UNREF(ret);\n\n\treturn 1;\n}\n\nDUK_INTERNAL duk_int_t duk_pcall_method_flags(duk_hthread *thr, duk_idx_t nargs, duk_small_uint_t call_flags) {\n\tduk__pcall_method_args args;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\targs.nargs = nargs;\n\tif (DUK_UNLIKELY(nargs < 0)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\treturn DUK_EXEC_ERROR;  /* unreachable */\n\t}\n\targs.call_flags = call_flags;\n\n\treturn duk_safe_call(thr, duk__pcall_method_raw, (void *) &args /*udata*/, nargs + 2 /*nargs*/, 1 /*nrets*/);\n}\n\nDUK_EXTERNAL duk_int_t duk_pcall_method(duk_hthread *thr, duk_idx_t nargs) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk_pcall_method_flags(thr, nargs, 0);\n}\n\nDUK_LOCAL duk_ret_t duk__pcall_prop_raw(duk_hthread *thr, void *udata) {\n\tduk__pcall_prop_args *args;\n\tduk_idx_t obj_idx;\n\tduk_int_t ret;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(udata != NULL);\n\n\targs = (duk__pcall_prop_args *) udata;\n\n\tobj_idx = duk_require_normalize_index(thr, args->obj_idx);  /* make absolute */\n\tduk__call_prop_prep_stack(thr, obj_idx, args->nargs);\n\n\tret = duk_handle_call_unprotected_nargs(thr, args->nargs, args->call_flags);\n\tDUK_ASSERT(ret == 0);\n\tDUK_UNREF(ret);\n\treturn 1;\n}\n\nDUK_EXTERNAL duk_int_t duk_pcall_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t nargs) {\n\tduk__pcall_prop_args args;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\targs.obj_idx = obj_idx;\n\targs.nargs = nargs;\n\tif (DUK_UNLIKELY(nargs < 0)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\treturn DUK_EXEC_ERROR;  /* unreachable */\n\t}\n\targs.call_flags = 0;\n\n\treturn duk_safe_call(thr, duk__pcall_prop_raw, (void *) &args /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/);\n}\n\nDUK_EXTERNAL duk_int_t duk_safe_call(duk_hthread *thr, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets) {\n\tduk_int_t rc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* nargs condition; fail if: top - bottom < nargs\n\t *                      <=>  top < bottom + nargs\n\t * nrets condition; fail if: end - (top - nargs) < nrets\n\t *                      <=>  end - top + nargs < nrets\n\t *                      <=>  end + nargs < top + nrets\n\t */\n\t/* XXX: check for any reserve? */\n\n\tif (DUK_UNLIKELY((nargs | nrets) < 0 ||  /* nargs < 0 || nrets < 0; OR sign bits */\n\t                 thr->valstack_top < thr->valstack_bottom + nargs ||        /* nargs too large compared to top */\n\t                 thr->valstack_end + nargs < thr->valstack_top + nrets)) {  /* nrets too large compared to reserve */\n\t\tDUK_D(DUK_DPRINT(\"not enough stack reserve for safe call or invalid arguments: \"\n\t\t                 \"nargs=%ld < 0 (?), nrets=%ld < 0 (?), top=%ld < bottom=%ld + nargs=%ld (?), \"\n\t\t                 \"end=%ld + nargs=%ld < top=%ld + nrets=%ld (?)\",\n\t\t                  (long) nargs,\n\t\t                  (long) nrets,\n\t\t                  (long) (thr->valstack_top - thr->valstack),\n\t\t                  (long) (thr->valstack_bottom - thr->valstack),\n\t\t                  (long) nargs,\n\t\t                  (long) (thr->valstack_end - thr->valstack),\n\t\t                  (long) nargs,\n\t\t                  (long) (thr->valstack_top - thr->valstack),\n\t\t                  (long) nrets));\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\treturn DUK_EXEC_ERROR;  /* unreachable */\n\t}\n\n\trc = duk_handle_safe_call(thr,           /* thread */\n\t                          func,          /* func */\n\t                          udata,         /* udata */\n\t                          nargs,         /* num_stack_args */\n\t                          nrets);        /* num_stack_res */\n\n\treturn rc;\n}\n\nDUK_EXTERNAL void duk_new(duk_hthread *thr, duk_idx_t nargs) {\n\tduk_idx_t idx_func;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx_func = duk__call_get_idx_func(thr, nargs, 1);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\n\tduk_push_object(thr);  /* default instance; internal proto updated by call handling */\n\tduk_insert(thr, idx_func + 1);\n\n\tduk_handle_call_unprotected(thr, idx_func, DUK_CALL_FLAG_CONSTRUCT);\n}\n\nDUK_LOCAL duk_ret_t duk__pnew_helper(duk_hthread *thr, void *udata) {\n\tduk_idx_t nargs;\n\n\tDUK_ASSERT(udata != NULL);\n\tnargs = *((duk_idx_t *) udata);\n\n\tduk_new(thr, nargs);\n\treturn 1;\n}\n\nDUK_EXTERNAL duk_int_t duk_pnew(duk_hthread *thr, duk_idx_t nargs) {\n\tduk_int_t rc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* For now, just use duk_safe_call() to wrap duk_new().  We can't\n\t * simply use a protected duk_handle_call() because pushing the\n\t * default instance might throw.\n\t */\n\n\tif (DUK_UNLIKELY(nargs < 0)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\treturn DUK_EXEC_ERROR;  /* unreachable */\n\t}\n\n\trc = duk_safe_call(thr, duk__pnew_helper, (void *) &nargs /*udata*/, nargs + 1 /*nargs*/, 1 /*nrets*/);\n\treturn rc;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_constructor_call(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tact = thr->callstack_curr;\n\tif (act != NULL) {\n\t\treturn ((act->flags & DUK_ACT_FLAG_CONSTRUCT) != 0 ? 1 : 0);\n\t}\n\treturn 0;\n}\n\n/* XXX: Make this obsolete by adding a function flag for rejecting a\n * non-constructor call automatically?\n */\nDUK_INTERNAL void duk_require_constructor_call(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (!duk_is_constructor_call(thr)) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_CONSTRUCT_ONLY);\n\t}\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_strict_call(duk_hthread *thr) {\n\tduk_activation *act;\n\n\t/* For user code this could just return 1 (strict) always\n\t * because all Duktape/C functions are considered strict,\n\t * and strict is also the default when nothing is running.\n\t * However, Duktape may call this function internally when\n\t * the current activation is an Ecmascript function, so\n\t * this cannot be replaced by a 'return 1' without fixing\n\t * the internal call sites.\n\t */\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tact = thr->callstack_curr;\n\tif (act != NULL) {\n\t\treturn ((act->flags & DUK_ACT_FLAG_STRICT) != 0 ? 1 : 0);\n\t} else {\n\t\t/* Strict by default. */\n\t\treturn 1;\n\t}\n}\n\n/*\n *  Duktape/C function magic\n */\n\nDUK_EXTERNAL duk_int_t duk_get_current_magic(duk_hthread *thr) {\n\tduk_activation *act;\n\tduk_hobject *func;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tact = thr->callstack_curr;\n\tif (act) {\n\t\tfunc = DUK_ACT_GET_FUNC(act);\n\t\tif (!func) {\n\t\t\tduk_tval *tv = &act->tv_func;\n\t\t\tduk_small_uint_t lf_flags;\n\t\t\tlf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv);\n\t\t\treturn (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags);\n\t\t}\n\t\tDUK_ASSERT(func != NULL);\n\n\t\tif (DUK_HOBJECT_IS_NATFUNC(func)) {\n\t\t\tduk_hnatfunc *nf = (duk_hnatfunc *) func;\n\t\t\treturn (duk_int_t) nf->magic;\n\t\t}\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_int_t duk_get_magic(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (!DUK_HOBJECT_HAS_NATFUNC(h)) {\n\t\t\tgoto type_error;\n\t\t}\n\t\treturn (duk_int_t) ((duk_hnatfunc *) h)->magic;\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {\n\t\tduk_small_uint_t lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv);\n\t\treturn (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags);\n\t}\n\n\t/* fall through */\n type_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE);\n\treturn 0;\n}\n\nDUK_EXTERNAL void duk_set_magic(duk_hthread *thr, duk_idx_t idx, duk_int_t magic) {\n\tduk_hnatfunc *nf;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tnf = duk_require_hnatfunc(thr, idx);\n\tDUK_ASSERT(nf != NULL);\n\tnf->magic = (duk_int16_t) magic;\n}\n\n/*\n *  Misc helpers\n */\n\n/* Resolve a bound function on value stack top to a non-bound target\n * (leave other values as is).\n */\nDUK_INTERNAL void duk_resolve_nonbound_function(duk_hthread *thr) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_HTHREAD_VALID(thr);\n\n\ttv = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h;\n\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_HOBJECT_HAS_BOUNDFUNC(h)) {\n\t\t\tduk_push_tval(thr, &((duk_hboundfunc *) h)->target);\n\t\t\tduk_replace(thr, -2);\n#if 0\n\t\t\tDUK_TVAL_SET_TVAL(tv, &((duk_hboundfunc *) h)->target);\n\t\t\tDUK_TVAL_INCREF(thr, tv);\n\t\t\tDUK_HOBJECT_DECREF_NORZ(thr, h);\n#endif\n\t\t\t/* Rely on Function.prototype.bind() on never creating a bound\n\t\t\t * function whose target is not proper.  This is now safe\n\t\t\t * because the target is not even an internal property but a\n\t\t\t * struct member.\n\t\t\t */\n\t\t\tDUK_ASSERT(duk_is_lightfunc(thr, -1) || duk_is_callable(thr, -1));\n\t\t}\n\t}\n\n\t/* Lightfuncs cannot be bound but are always callable and\n\t * constructable.\n\t */\n}\n#line 1 \"duk_api_codec.c\"\n/*\n *  Encoding and decoding basic formats: hex, base64.\n *\n *  These are in-place operations which may allow an optimized implementation.\n *\n *  Base-64: https://tools.ietf.org/html/rfc4648#section-4\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Shared handling for encode/decode argument.  Fast path handling for\n * buffer and string values because they're the most common.  In particular,\n * avoid creating a temporary string or buffer when possible.\n */\nDUK_LOCAL const duk_uint8_t *duk__prep_codec_arg(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {\n\tvoid *ptr;\n\tduk_bool_t isbuffer;\n\n\tDUK_ASSERT(duk_is_valid_index(thr, idx));  /* checked by caller */\n\n\t/* XXX: with def_ptr set to a stack related pointer, isbuffer could\n\t * be removed from the helper?\n\t */\n\tptr = duk_get_buffer_data_raw(thr, idx, out_len, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, &isbuffer);\n\tif (isbuffer) {\n\t\tDUK_ASSERT(*out_len == 0 || ptr != NULL);\n\t\treturn (const duk_uint8_t *) ptr;\n\t}\n\treturn (const duk_uint8_t *) duk_to_lstring(thr, idx, out_len);\n}\n\n#if defined(DUK_USE_BASE64_FASTPATH)\nDUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) {\n\tduk_uint_t t;\n\tduk_size_t n_full, n_full3, n_final;\n\tconst duk_uint8_t *src_end_fast;\n\n\tn_full = srclen / 3;  /* full 3-byte -> 4-char conversions */\n\tn_full3 = n_full * 3;\n\tn_final = srclen - n_full3;\n\tDUK_ASSERT_DISABLE(n_final >= 0);\n\tDUK_ASSERT(n_final <= 2);\n\n\tsrc_end_fast = src + n_full3;\n\twhile (DUK_UNLIKELY(src != src_end_fast)) {\n\t\tt = (duk_uint_t) (*src++);\n\t\tt = (t << 8) + (duk_uint_t) (*src++);\n\t\tt = (t << 8) + (duk_uint_t) (*src++);\n\n\t\t*dst++ = duk_base64_enctab[t >> 18];\n\t\t*dst++ = duk_base64_enctab[(t >> 12) & 0x3f];\n\t\t*dst++ = duk_base64_enctab[(t >> 6) & 0x3f];\n\t\t*dst++ = duk_base64_enctab[t & 0x3f];\n\n#if 0  /* Tested: not faster on x64 */\n\t\t/* aaaaaabb bbbbcccc ccdddddd */\n\t\tdst[0] = duk_base64_enctab[(src[0] >> 2) & 0x3f];\n\t\tdst[1] = duk_base64_enctab[((src[0] << 4) & 0x30) | ((src[1] >> 4) & 0x0f)];\n\t\tdst[2] = duk_base64_enctab[((src[1] << 2) & 0x3f) | ((src[2] >> 6) & 0x03)];\n\t\tdst[3] = duk_base64_enctab[src[2] & 0x3f];\n\t\tsrc += 3; dst += 4;\n#endif\n\t}\n\n\tswitch (n_final) {\n\t/* case 0: nop */\n\tcase 1: {\n\t\t/* XX== */\n\t\tt = (duk_uint_t) (*src++);\n\t\t*dst++ = duk_base64_enctab[t >> 2];           /* XXXXXX-- */\n\t\t*dst++ = duk_base64_enctab[(t << 4) & 0x3f];  /* ------XX */\n\t\t*dst++ = DUK_ASC_EQUALS;\n\t\t*dst++ = DUK_ASC_EQUALS;\n\t\tbreak;\n\t}\n\tcase 2: {\n\t\t/* XXX= */\n\t\tt = (duk_uint_t) (*src++);\n\t\tt = (t << 8) + (duk_uint_t) (*src++);\n\t\t*dst++ = duk_base64_enctab[t >> 10];          /* XXXXXX-- -------- */\n\t\t*dst++ = duk_base64_enctab[(t >> 4) & 0x3f];  /* ------XX XXXX---- */\n\t\t*dst++ = duk_base64_enctab[(t << 2) & 0x3f];  /* -------- ----XXXX */\n\t\t*dst++ = DUK_ASC_EQUALS;\n\t\tbreak;\n\t}\n\t}\n}\n#else  /* DUK_USE_BASE64_FASTPATH */\nDUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst) {\n\tduk_small_uint_t i, snip;\n\tduk_uint_t t;\n\tduk_uint_fast8_t x, y;\n\tconst duk_uint8_t *src_end;\n\n\tsrc_end = src + srclen;\n\n\twhile (src < src_end) {\n\t\t/* read 3 bytes into 't', padded by zero */\n\t\tsnip = 4;\n\t\tt = 0;\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tt = t << 8;\n\t\t\tif (src >= src_end) {\n\t\t\t\tsnip--;\n\t\t\t} else {\n\t\t\t\tt += (duk_uint_t) (*src++);\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t *  Missing bytes    snip     base64 example\n\t\t *    0               4         XXXX\n\t\t *    1               3         XXX=\n\t\t *    2               2         XX==\n\t\t */\n\n\t\tDUK_ASSERT(snip >= 2 && snip <= 4);\n\n\t\tfor (i = 0; i < 4; i++) {\n\t\t\tx = (duk_uint_fast8_t) ((t >> 18) & 0x3f);\n\t\t\tt = t << 6;\n\n\t\t\t/* A straightforward 64-byte lookup would be faster\n\t\t\t * and cleaner, but this is shorter.\n\t\t\t */\n\t\t\tif (i >= snip) {\n\t\t\t\ty = '=';\n\t\t\t} else if (x <= 25) {\n\t\t\t\ty = x + 'A';\n\t\t\t} else if (x <= 51) {\n\t\t\t\ty = x - 26 + 'a';\n\t\t\t} else if (x <= 61) {\n\t\t\t\ty = x - 52 + '0';\n\t\t\t} else if (x == 62) {\n\t\t\t\ty = '+';\n\t\t\t} else {\n\t\t\t\ty = '/';\n\t\t\t}\n\n\t\t\t*dst++ = (duk_uint8_t) y;\n\t\t}\n\t}\n}\n#endif  /* DUK_USE_BASE64_FASTPATH */\n\n#if defined(DUK_USE_BASE64_FASTPATH)\nDUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) {\n\tduk_int_t x;\n\tduk_int_t t;\n\tduk_small_uint_t n_equal;\n\tduk_small_uint_t n_chars;\n\tconst duk_uint8_t *src_end;\n\tconst duk_uint8_t *src_end_safe;\n\n\tsrc_end = src + srclen;\n\tsrc_end_safe = src_end - 4;  /* if 'src < src_end_safe', safe to read 4 bytes */\n\n\t/* Innermost fast path processes 4 valid base-64 characters at a time\n\t * but bails out on whitespace, padding chars ('=') and invalid chars.\n\t * Once the slow path segment has been processed, we return to the\n\t * inner fast path again.  This handles e.g. base64 with newlines\n\t * reasonably well because the majority of a line is in the fast path.\n\t */\n\tfor (;;) {\n\t\t/* Fast path, handle units with just actual encoding characters. */\n\n\t\twhile (src <= src_end_safe) {\n\t\t\t/* The lookup byte is intentionally sign extended to (at least)\n\t\t\t * 32 bits and then ORed.  This ensures that is at least 1 byte\n\t\t\t * is negative, the highest bit of 't' will be set at the end\n\t\t\t * and we don't need to check every byte.\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"fast loop: src=%p, src_end_safe=%p, src_end=%p\",\n\t\t\t                     (const void *) src, (const void *) src_end_safe, (const void *) src_end));\n\n\t\t\tt = (duk_int_t) duk_base64_dectab[*src++];\n\t\t\tt = (t << 6) | (duk_int_t) duk_base64_dectab[*src++];\n\t\t\tt = (t << 6) | (duk_int_t) duk_base64_dectab[*src++];\n\t\t\tt = (t << 6) | (duk_int_t) duk_base64_dectab[*src++];\n\n\t\t\tif (DUK_UNLIKELY(t < 0)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"fast loop unit was not clean, process one slow path unit\"));\n\t\t\t\tsrc -= 4;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDUK_ASSERT(t <= 0xffffffL);\n\t\t\tDUK_ASSERT((t >> 24) == 0);\n\t\t\t*dst++ = (duk_uint8_t) (t >> 16);\n\t\t\t*dst++ = (duk_uint8_t) ((t >> 8) & 0xff);\n\t\t\t*dst++ = (duk_uint8_t) (t & 0xff);\n\t\t}\n\n\t\t/* Handle one slow path unit (or finish if we're done). */\n\n\t\tn_equal = 0;\n\t\tn_chars = 0;\n\t\tt = 0;\n\t\tfor (;;) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"slow loop: src=%p, src_end=%p, n_chars=%ld, n_equal=%ld, t=%ld\",\n\t\t\t                     (const void *) src, (const void *) src_end, (long) n_chars, (long) n_equal, (long) t));\n\n\t\t\tif (DUK_UNLIKELY(src >= src_end)) {\n\t\t\t\tgoto done;  /* two level break */\n\t\t\t}\n\n\t\t\tx = duk_base64_dectab[*src++];\n\t\t\tif (DUK_UNLIKELY(x < 0)) {\n\t\t\t\tif (x == -2) {\n\t\t\t\t\tcontinue;  /* allowed ascii whitespace */\n\t\t\t\t} else if (x == -3) {\n\t\t\t\t\tn_equal++;\n\t\t\t\t\tt <<= 6;\n\t\t\t\t} else {\n\t\t\t\t\tDUK_ASSERT(x == -1);\n\t\t\t\t\tgoto decode_error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(x >= 0 && x <= 63);\n\t\t\t\tif (n_equal > 0) {\n\t\t\t\t\t/* Don't allow actual chars after equal sign. */\n\t\t\t\t\tgoto decode_error;\n\t\t\t\t}\n\t\t\t\tt = (t << 6) + x;\n\t\t\t}\n\n\t\t\tif (DUK_UNLIKELY(n_chars == 3)) {\n\t\t\t\t/* Emit 3 bytes and backtrack if there was padding.  There's\n\t\t\t\t * always space for the whole 3 bytes so no check needed.\n\t\t\t\t */\n\t\t\t\tDUK_ASSERT(t <= 0xffffffL);\n\t\t\t\tDUK_ASSERT((t >> 24) == 0);\n\t\t\t\t*dst++ = (duk_uint8_t) (t >> 16);\n\t\t\t\t*dst++ = (duk_uint8_t) ((t >> 8) & 0xff);\n\t\t\t\t*dst++ = (duk_uint8_t) (t & 0xff);\n\n\t\t\t\tif (DUK_UNLIKELY(n_equal > 0)) {\n\t\t\t\t\tDUK_ASSERT(n_equal <= 4);\n\n\t\t\t\t\t/* There may be whitespace between the equal signs. */\n\t\t\t\t\tif (n_equal == 1) {\n\t\t\t\t\t\t/* XXX= */\n\t\t\t\t\t\tdst -= 1;\n\t\t\t\t\t} else if (n_equal == 2) {\n\t\t\t\t\t\t/* XX== */\n\t\t\t\t\t\tdst -= 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgoto decode_error;  /* invalid padding */\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Continue parsing after padding, allows concatenated,\n\t\t\t\t\t * padded base64.\n\t\t\t\t\t */\n\t\t\t\t}\n\t\t\t\tbreak;  /* back to fast loop */\n\t\t\t} else {\n\t\t\t\tn_chars++;\n\t\t\t}\n\t\t}\n\t}\n done:\n\tDUK_DDD(DUK_DDDPRINT(\"done; src=%p, src_end=%p, n_chars=%ld\",\n\t                     (const void *) src, (const void *) src_end, (long) n_chars));\n\n\tDUK_ASSERT(src == src_end);\n\n\tif (n_chars != 0) {\n\t\t/* Here we'd have the option of decoding unpadded base64\n\t\t * (e.g. \"xxxxyy\" instead of \"xxxxyy==\".  Currently not\n\t\t * accepted.\n\t\t */\n\t\tgoto decode_error;\n\t}\n\n\t*out_dst_final = dst;\n\treturn 1;\n\n decode_error:\n\treturn 0;\n}\n#else  /* DUK_USE_BASE64_FASTPATH */\nDUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, duk_size_t srclen, duk_uint8_t *dst, duk_uint8_t **out_dst_final) {\n\tduk_uint_t t;\n\tduk_uint_fast8_t x, y;\n\tduk_small_uint_t group_idx;\n\tduk_small_uint_t n_equal;\n\tconst duk_uint8_t *src_end;\n\n\tsrc_end = src + srclen;\n\tt = 0;\n\tgroup_idx = 0;\n\tn_equal = 0;\n\n\twhile (src < src_end) {\n\t\tx = *src++;\n\n\t\tif (x >= 'A' && x <= 'Z') {\n\t\t\ty = x - 'A' + 0;\n\t\t} else if (x >= 'a' && x <= 'z') {\n\t\t\ty = x - 'a' + 26;\n\t\t} else if (x >= '0' && x <= '9') {\n\t\t\ty = x - '0' + 52;\n\t\t} else if (x == '+') {\n\t\t\ty = 62;\n\t\t} else if (x == '/') {\n\t\t\ty = 63;\n\t\t} else if (x == '=') {\n\t\t\t/* We don't check the zero padding bytes here right now\n\t\t\t * (that they're actually zero).  This seems to be common\n\t\t\t * behavior for base-64 decoders.\n\t\t\t */\n\n\t\t\tn_equal++;\n\t\t\tt <<= 6;  /* shift in zeroes */\n\t\t\tgoto skip_add;\n\t\t} else if (x == 0x09 || x == 0x0a || x == 0x0d || x == 0x20) {\n\t\t\t/* allow basic ASCII whitespace */\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tgoto decode_error;\n\t\t}\n\n\t\tif (n_equal > 0) {\n\t\t\t/* Don't allow mixed padding and actual chars. */\n\t\t\tgoto decode_error;\n\t\t}\n\t\tt = (t << 6) + y;\n\t skip_add:\n\n\t\tif (group_idx == 3) {\n\t\t\t/* output 3 bytes from 't' */\n\t\t\t*dst++ = (duk_uint8_t) ((t >> 16) & 0xff);\n\t\t\t*dst++ = (duk_uint8_t) ((t >> 8) & 0xff);\n\t\t\t*dst++ = (duk_uint8_t) (t & 0xff);\n\n\t\t\tif (DUK_UNLIKELY(n_equal > 0)) {\n\t\t\t\t/* Backtrack. */\n\t\t\t\tDUK_ASSERT(n_equal <= 4);\n\t\t\t\tif (n_equal == 1) {\n\t\t\t\t\tdst -= 1;\n\t\t\t\t} else if (n_equal == 2) {\n\t\t\t\t\tdst -= 2;\n\t\t\t\t} else {\n\t\t\t\t\tgoto decode_error;  /* invalid padding */\n\t\t\t\t}\n\n\t\t\t\t/* Here we can choose either to end parsing and ignore\n\t\t\t\t * whatever follows, or to continue parsing in case\n\t\t\t\t * multiple (possibly padded) base64 strings have been\n\t\t\t\t * concatenated.  Currently, keep on parsing.\n\t\t\t\t */\n\t\t\t\tn_equal = 0;\n\t\t\t}\n\n\t\t\tt = 0;\n\t\t\tgroup_idx = 0;\n\t\t} else {\n\t\t\tgroup_idx++;\n\t\t}\n\t}\n\n\tif (group_idx != 0) {\n\t\t/* Here we'd have the option of decoding unpadded base64\n\t\t * (e.g. \"xxxxyy\" instead of \"xxxxyy==\".  Currently not\n\t\t * accepted.\n\t\t */\n\t\tgoto decode_error;\n\t}\n\n\t*out_dst_final = dst;\n\treturn 1;\n\n decode_error:\n\treturn 0;\n}\n#endif  /* DUK_USE_BASE64_FASTPATH */\n\nDUK_EXTERNAL const char *duk_base64_encode(duk_hthread *thr, duk_idx_t idx) {\n\tconst duk_uint8_t *src;\n\tduk_size_t srclen;\n\tduk_size_t dstlen;\n\tduk_uint8_t *dst;\n\tconst char *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* XXX: optimize for string inputs: no need to coerce to a buffer\n\t * which makes a copy of the input.\n\t */\n\n\tidx = duk_require_normalize_index(thr, idx);\n\tsrc = duk__prep_codec_arg(thr, idx, &srclen);\n\t/* Note: for srclen=0, src may be NULL */\n\n\t/* Computation must not wrap; this limit works for 32-bit size_t:\n\t * >>> srclen = 3221225469\n\t * >>> '%x' % ((srclen + 2) / 3 * 4)\n\t * 'fffffffc'\n\t */\n\tif (srclen > 3221225469UL) {\n\t\tgoto type_error;\n\t}\n\tdstlen = (srclen + 2) / 3 * 4;\n\tdst = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, dstlen);\n\n\tduk__base64_encode_helper((const duk_uint8_t *) src, srclen, dst);\n\n\tret = duk_buffer_to_string(thr, -1);  /* Safe, result is ASCII. */\n\tduk_replace(thr, idx);\n\treturn ret;\n\n type_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_BASE64_ENCODE_FAILED);\n\treturn NULL;  /* never here */\n}\n\nDUK_EXTERNAL void duk_base64_decode(duk_hthread *thr, duk_idx_t idx) {\n\tconst duk_uint8_t *src;\n\tduk_size_t srclen;\n\tduk_size_t dstlen;\n\tduk_uint8_t *dst;\n\tduk_uint8_t *dst_final;\n\tduk_bool_t retval;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* XXX: optimize for buffer inputs: no need to coerce to a string\n\t * which causes an unnecessary interning.\n\t */\n\n\tidx = duk_require_normalize_index(thr, idx);\n\tsrc = duk__prep_codec_arg(thr, idx, &srclen);\n\n\t/* Computation must not wrap, only srclen + 3 is at risk of\n\t * wrapping because after that the number gets smaller.\n\t * This limit works for 32-bit size_t:\n\t * 0x100000000 - 3 - 1 = 4294967292\n\t */\n\tif (srclen > 4294967292UL) {\n\t\tgoto type_error;\n\t}\n\tdstlen = (srclen + 3) / 4 * 3;  /* upper limit, assuming no whitespace etc */\n\tdst = (duk_uint8_t *) duk_push_dynamic_buffer(thr, dstlen);\n\t/* Note: for dstlen=0, dst may be NULL */\n\n\tretval = duk__base64_decode_helper((const duk_uint8_t *) src, srclen, dst, &dst_final);\n\tif (!retval) {\n\t\tgoto type_error;\n\t}\n\n\t/* XXX: convert to fixed buffer? */\n\t(void) duk_resize_buffer(thr, -1, (duk_size_t) (dst_final - dst));\n\tduk_replace(thr, idx);\n\treturn;\n\n type_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_BASE64_DECODE_FAILED);\n}\n\nDUK_EXTERNAL const char *duk_hex_encode(duk_hthread *thr, duk_idx_t idx) {\n\tconst duk_uint8_t *inp;\n\tduk_size_t len;\n\tduk_size_t i;\n\tduk_uint8_t *buf;\n\tconst char *ret;\n#if defined(DUK_USE_HEX_FASTPATH)\n\tduk_size_t len_safe;\n\tduk_uint16_t *p16;\n#endif\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\tinp = duk__prep_codec_arg(thr, idx, &len);\n\tDUK_ASSERT(inp != NULL || len == 0);\n\n\t/* Fixed buffer, no zeroing because we'll fill all the data. */\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len * 2);\n\tDUK_ASSERT(buf != NULL);\n\n#if defined(DUK_USE_HEX_FASTPATH)\n\tDUK_ASSERT((((duk_size_t) buf) & 0x01U) == 0);   /* pointer is aligned, guaranteed for fixed buffer */\n\tp16 = (duk_uint16_t *) (void *) buf;\n\tlen_safe = len & ~0x03U;\n\tfor (i = 0; i < len_safe; i += 4) {\n\t\tp16[0] = duk_hex_enctab[inp[i]];\n\t\tp16[1] = duk_hex_enctab[inp[i + 1]];\n\t\tp16[2] = duk_hex_enctab[inp[i + 2]];\n\t\tp16[3] = duk_hex_enctab[inp[i + 3]];\n\t\tp16 += 4;\n\t}\n\tfor (; i < len; i++) {\n\t\t*p16++ = duk_hex_enctab[inp[i]];\n\t}\n#else  /* DUK_USE_HEX_FASTPATH */\n\tfor (i = 0; i < len; i++) {\n\t\tduk_small_uint_t t;\n\t\tt = (duk_small_uint_t) inp[i];\n\t\tbuf[i*2 + 0] = duk_lc_digits[t >> 4];\n\t\tbuf[i*2 + 1] = duk_lc_digits[t & 0x0f];\n\t}\n#endif  /* DUK_USE_HEX_FASTPATH */\n\n\t/* XXX: Using a string return value forces a string intern which is\n\t * not always necessary.  As a rough performance measure, hex encode\n\t * time for tests/perf/test-hex-encode.js dropped from ~35s to ~15s\n\t * without string coercion.  Change to returning a buffer and let the\n\t * caller coerce to string if necessary?\n\t */\n\n\tret = duk_buffer_to_string(thr, -1);  /* Safe, result is ASCII. */\n\tduk_replace(thr, idx);\n\treturn ret;\n}\n\nDUK_EXTERNAL void duk_hex_decode(duk_hthread *thr, duk_idx_t idx) {\n\tconst duk_uint8_t *inp;\n\tduk_size_t len;\n\tduk_size_t i;\n\tduk_int_t t;\n\tduk_uint8_t *buf;\n#if defined(DUK_USE_HEX_FASTPATH)\n\tduk_int_t chk;\n\tduk_uint8_t *p;\n\tduk_size_t len_safe;\n#endif\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\tinp = duk__prep_codec_arg(thr, idx, &len);\n\tDUK_ASSERT(inp != NULL || len == 0);\n\n\tif (len & 0x01) {\n\t\tgoto type_error;\n\t}\n\n\t/* Fixed buffer, no zeroing because we'll fill all the data. */\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len / 2);\n\tDUK_ASSERT(buf != NULL);\n\n#if defined(DUK_USE_HEX_FASTPATH)\n\tp = buf;\n\tlen_safe = len & ~0x07U;\n\tfor (i = 0; i < len_safe; i += 8) {\n\t\tt = ((duk_int_t) duk_hex_dectab_shift4[inp[i]]) |\n\t\t    ((duk_int_t) duk_hex_dectab[inp[i + 1]]);\n\t\tchk = t;\n\t\tp[0] = (duk_uint8_t) t;\n\t\tt = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 2]]) |\n\t\t    ((duk_int_t) duk_hex_dectab[inp[i + 3]]);\n\t\tchk |= t;\n\t\tp[1] = (duk_uint8_t) t;\n\t\tt = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 4]]) |\n\t\t    ((duk_int_t) duk_hex_dectab[inp[i + 5]]);\n\t\tchk |= t;\n\t\tp[2] = (duk_uint8_t) t;\n\t\tt = ((duk_int_t) duk_hex_dectab_shift4[inp[i + 6]]) |\n\t\t    ((duk_int_t) duk_hex_dectab[inp[i + 7]]);\n\t\tchk |= t;\n\t\tp[3] = (duk_uint8_t) t;\n\t\tp += 4;\n\n\t\t/* Check if any lookup above had a negative result. */\n\t\tif (DUK_UNLIKELY(chk < 0)) {\n\t\t\tgoto type_error;\n\t\t}\n\t}\n\tfor (; i < len; i += 2) {\n\t\tt = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) |\n\t\t    ((duk_int_t) duk_hex_dectab[inp[i + 1]]);\n\t\tif (DUK_UNLIKELY(t < 0)) {\n\t\t\tgoto type_error;\n\t\t}\n\t\t*p++ = (duk_uint8_t) t;\n\t}\n#else  /* DUK_USE_HEX_FASTPATH */\n\tfor (i = 0; i < len; i += 2) {\n\t\t/* For invalid characters the value -1 gets extended to\n\t\t * at least 16 bits.  If either nybble is invalid, the\n\t\t * resulting 't' will be < 0.\n\t\t */\n\t\tt = (((duk_int_t) duk_hex_dectab[inp[i]]) << 4) |\n\t\t    ((duk_int_t) duk_hex_dectab[inp[i + 1]]);\n\t\tif (DUK_UNLIKELY(t < 0)) {\n\t\t\tgoto type_error;\n\t\t}\n\t\tbuf[i >> 1] = (duk_uint8_t) t;\n\t}\n#endif  /* DUK_USE_HEX_FASTPATH */\n\n\tduk_replace(thr, idx);\n\treturn;\n\n type_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_HEX_DECODE_FAILED);\n}\n\n#if defined(DUK_USE_JSON_SUPPORT)\nDUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_idx_t top_at_entry;\n#endif\n\tconst char *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n#if defined(DUK_USE_ASSERTIONS)\n\ttop_at_entry = duk_get_top(thr);\n#endif\n\n\tidx = duk_require_normalize_index(thr, idx);\n\tduk_bi_json_stringify_helper(thr,\n\t                             idx /*idx_value*/,\n\t                             DUK_INVALID_INDEX /*idx_replacer*/,\n\t                             DUK_INVALID_INDEX /*idx_space*/,\n\t                             0 /*flags*/);\n\tDUK_ASSERT(duk_is_string(thr, -1));\n\tduk_replace(thr, idx);\n\tret = duk_get_string(thr, idx);\n\n\tDUK_ASSERT(duk_get_top(thr) == top_at_entry);\n\n\treturn ret;\n}\n\nDUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_idx_t top_at_entry;\n#endif\n\n\tDUK_ASSERT_API_ENTRY(thr);\n#if defined(DUK_USE_ASSERTIONS)\n\ttop_at_entry = duk_get_top(thr);\n#endif\n\n\tidx = duk_require_normalize_index(thr, idx);\n\tduk_bi_json_parse_helper(thr,\n\t                         idx /*idx_value*/,\n\t                         DUK_INVALID_INDEX /*idx_reviver*/,\n\t                         0 /*flags*/);\n\tduk_replace(thr, idx);\n\n\tDUK_ASSERT(duk_get_top(thr) == top_at_entry);\n}\n#else  /* DUK_USE_JSON_SUPPORT */\nDUK_EXTERNAL const char *duk_json_encode(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(idx);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n\nDUK_EXTERNAL void duk_json_decode(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(idx);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n#endif  /* DUK_USE_JSON_SUPPORT */\n#line 1 \"duk_api_compile.c\"\n/*\n *  Compilation and evaluation\n */\n\n/* #include duk_internal.h -> already included */\n\ntypedef struct duk__compile_raw_args duk__compile_raw_args;\nstruct duk__compile_raw_args {\n\tduk_size_t src_length;  /* should be first on 64-bit platforms */\n\tconst duk_uint8_t *src_buffer;\n\tduk_uint_t flags;\n};\n\n/* Eval is just a wrapper now. */\nDUK_EXTERNAL duk_int_t duk_eval_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) {\n\tduk_int_t rc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Note: strictness is *not* inherited from the current Duktape/C.\n\t * This would be confusing because the current strictness state\n\t * depends on whether we're running inside a Duktape/C activation\n\t * (= strict mode) or outside of any activation (= non-strict mode).\n\t * See tests/api/test-eval-strictness.c for more discussion.\n\t */\n\n\t/* [ ... source? filename? ] (depends on flags) */\n\n\trc = duk_compile_raw(thr, src_buffer, src_length, flags | DUK_COMPILE_EVAL);  /* may be safe, or non-safe depending on flags */\n\n\t/* [ ... closure/error ] */\n\n\tif (rc != DUK_EXEC_SUCCESS) {\n\t\trc = DUK_EXEC_ERROR;\n\t\tgoto got_rc;\n\t}\n\n\tduk_push_global_object(thr);  /* explicit 'this' binding, see GH-164 */\n\n\tif (flags & DUK_COMPILE_SAFE) {\n\t\trc = duk_pcall_method(thr, 0);\n\t} else {\n\t\tduk_call_method(thr, 0);\n\t\trc = DUK_EXEC_SUCCESS;\n\t}\n\n\t/* [ ... result/error ] */\n\n got_rc:\n\tif (flags & DUK_COMPILE_NORESULT) {\n\t\tduk_pop(thr);\n\t}\n\n\treturn rc;\n}\n\n/* Helper which can be called both directly and with duk_safe_call(). */\nDUK_LOCAL duk_ret_t duk__do_compile(duk_hthread *thr, void *udata) {\n\tduk__compile_raw_args *comp_args;\n\tduk_uint_t flags;\n\tduk_hcompfunc *h_templ;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(udata != NULL);\n\n\t/* Note: strictness is not inherited from the current Duktape/C\n\t * context.  Otherwise it would not be possible to compile\n\t * non-strict code inside a Duktape/C activation (which is\n\t * always strict now).  See tests/api/test-eval-strictness.c\n\t * for discussion.\n\t */\n\n\t/* [ ... source? filename? ] (depends on flags) */\n\n\tcomp_args = (duk__compile_raw_args *) udata;\n\tflags = comp_args->flags;\n\n\tif (flags & DUK_COMPILE_NOFILENAME) {\n\t\t/* Automatic filename: 'eval' or 'input'. */\n\t\tduk_push_hstring_stridx(thr, (flags & DUK_COMPILE_EVAL) ? DUK_STRIDX_EVAL : DUK_STRIDX_INPUT);\n\t}\n\n\t/* [ ... source? filename ] */\n\n\tif (!comp_args->src_buffer) {\n\t\tduk_hstring *h_sourcecode;\n\n\t\th_sourcecode = duk_get_hstring(thr, -2);\n\t\tif ((flags & DUK_COMPILE_NOSOURCE) ||  /* args incorrect */\n\t\t    (h_sourcecode == NULL)) {          /* e.g. duk_push_string_file_raw() pushed undefined */\n\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_NO_SOURCECODE);\n\t\t}\n\t\tDUK_ASSERT(h_sourcecode != NULL);\n\t\tcomp_args->src_buffer = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode);\n\t\tcomp_args->src_length = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode);\n\t}\n\tDUK_ASSERT(comp_args->src_buffer != NULL);\n\n\tif (flags & DUK_COMPILE_FUNCTION) {\n\t\tflags |= DUK_COMPILE_EVAL | DUK_COMPILE_FUNCEXPR;\n\t}\n\n\t/* [ ... source? filename ] */\n\n\tduk_js_compile(thr, comp_args->src_buffer, comp_args->src_length, flags);\n\n\t/* [ ... source? func_template ] */\n\n\tif (flags & DUK_COMPILE_NOSOURCE) {\n\t\t;\n\t} else {\n\t\tduk_remove_m2(thr);\n\t}\n\n\t/* [ ... func_template ] */\n\n\th_templ = (duk_hcompfunc *) duk_known_hobject(thr, -1);\n\tduk_js_push_closure(thr,\n\t                   h_templ,\n\t                   thr->builtins[DUK_BIDX_GLOBAL_ENV],\n\t                   thr->builtins[DUK_BIDX_GLOBAL_ENV],\n\t                   1 /*add_auto_proto*/);\n\tduk_remove_m2(thr);   /* -> [ ... closure ] */\n\n\t/* [ ... closure ] */\n\n\treturn 1;\n}\n\nDUK_EXTERNAL duk_int_t duk_compile_raw(duk_hthread *thr, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) {\n\tduk__compile_raw_args comp_args_alloc;\n\tduk__compile_raw_args *comp_args = &comp_args_alloc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif ((flags & DUK_COMPILE_STRLEN) && (src_buffer != NULL)) {\n\t\t/* String length is computed here to avoid multiple evaluation\n\t\t * of a macro argument in the calling side.\n\t\t */\n\t\tsrc_length = DUK_STRLEN(src_buffer);\n\t}\n\n\tcomp_args->src_buffer = (const duk_uint8_t *) src_buffer;\n\tcomp_args->src_length = src_length;\n\tcomp_args->flags = flags;\n\n\t/* [ ... source? filename? ] (depends on flags) */\n\n\tif (flags & DUK_COMPILE_SAFE) {\n\t\tduk_int_t rc;\n\t\tduk_int_t nargs;\n\t\tduk_int_t nrets = 1;\n\n\t\t/* Arguments can be: [ source? filename? &comp_args] so that\n\t\t * nargs is 1 to 3.  Call site encodes the correct nargs count\n\t\t * directly into flags.\n\t\t */\n\t\tnargs = flags & 0x07;\n\t\tDUK_ASSERT(nargs == ((flags & DUK_COMPILE_NOSOURCE) ? 0 : 1) +\n\t\t                    ((flags & DUK_COMPILE_NOFILENAME) ? 0 : 1));\n\t\trc = duk_safe_call(thr, duk__do_compile, (void *) comp_args, nargs, nrets);\n\n\t\t/* [ ... closure ] */\n\t\treturn rc;\n\t}\n\n\t(void) duk__do_compile(thr, (void *) comp_args);\n\n\t/* [ ... closure ] */\n\treturn DUK_EXEC_SUCCESS;\n}\n#line 1 \"duk_api_debug.c\"\n/*\n *  Debugging related API calls\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_JSON_SUPPORT)\nDUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) {\n\tduk_idx_t idx;\n\tduk_idx_t top;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* We don't duk_require_stack() here now, but rely on the caller having\n\t * enough space.\n\t */\n\n\ttop = duk_get_top(thr);\n\tduk_push_array(thr);\n\tfor (idx = 0; idx < top; idx++) {\n\t\tduk_dup(thr, idx);\n\t\tduk_put_prop_index(thr, -2, (duk_uarridx_t) idx);\n\t}\n\n\t/* XXX: conversion errors should not propagate outwards.\n\t * Perhaps values need to be coerced individually?\n\t */\n\tduk_bi_json_stringify_helper(thr,\n\t                             duk_get_top_index(thr),  /*idx_value*/\n\t                             DUK_INVALID_INDEX,  /*idx_replacer*/\n\t                             DUK_INVALID_INDEX,  /*idx_space*/\n\t                             DUK_JSON_FLAG_EXT_CUSTOM |\n\t                             DUK_JSON_FLAG_ASCII_ONLY |\n\t                             DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/);\n\n\tduk_push_sprintf(thr, \"ctx: top=%ld, stack=%s\", (long) top, (const char *) duk_safe_to_string(thr, -1));\n\tduk_replace(thr, -3);  /* [ ... arr jsonx(arr) res ] -> [ ... res jsonx(arr) ] */\n\tduk_pop(thr);\n\tDUK_ASSERT(duk_is_string(thr, -1));\n}\n#else  /* DUK_USE_JSON_SUPPORT */\nDUK_EXTERNAL void duk_push_context_dump(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n#endif  /* DUK_USE_JSON_SUPPORT */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\nDUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr,\n                                      duk_debug_read_function read_cb,\n                                      duk_debug_write_function write_cb,\n                                      duk_debug_peek_function peek_cb,\n                                      duk_debug_read_flush_function read_flush_cb,\n                                      duk_debug_write_flush_function write_flush_cb,\n                                      duk_debug_request_function request_cb,\n                                      duk_debug_detached_function detached_cb,\n                                      void *udata) {\n\tduk_heap *heap;\n\tconst char *str;\n\tduk_size_t len;\n\n\t/* XXX: should there be an error or an automatic detach if\n\t * already attached?\n\t */\n\n\tDUK_D(DUK_DPRINT(\"application called duk_debugger_attach()\"));\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(read_cb != NULL);\n\tDUK_ASSERT(write_cb != NULL);\n\t/* Other callbacks are optional. */\n\n\theap = thr->heap;\n\theap->dbg_read_cb = read_cb;\n\theap->dbg_write_cb = write_cb;\n\theap->dbg_peek_cb = peek_cb;\n\theap->dbg_read_flush_cb = read_flush_cb;\n\theap->dbg_write_flush_cb = write_flush_cb;\n\theap->dbg_request_cb = request_cb;\n\theap->dbg_detached_cb = detached_cb;\n\theap->dbg_udata = udata;\n\theap->dbg_have_next_byte = 0;\n\n\t/* Start in paused state. */\n\theap->dbg_processing = 0;\n\theap->dbg_state_dirty = 0;\n\theap->dbg_force_restart = 0;\n\theap->dbg_pause_flags = 0;\n\theap->dbg_pause_act = NULL;\n\theap->dbg_pause_startline = 0;\n\theap->dbg_exec_counter = 0;\n\theap->dbg_last_counter = 0;\n\theap->dbg_last_time = 0.0;\n\tduk_debug_set_paused(heap);  /* XXX: overlap with fields above */\n\n\t/* Send version identification and flush right afterwards.  Note that\n\t * we must write raw, unframed bytes here.\n\t */\n\tduk_push_sprintf(thr, \"%ld %ld %s %s\\n\",\n\t                 (long) DUK_DEBUG_PROTOCOL_VERSION,\n\t                 (long) DUK_VERSION,\n\t                 (const char *) DUK_GIT_DESCRIBE,\n\t                 (const char *) DUK_USE_TARGET_INFO);\n\tstr = duk_get_lstring(thr, -1, &len);\n\tDUK_ASSERT(str != NULL);\n\tduk_debug_write_bytes(thr, (const duk_uint8_t *) str, len);\n\tduk_debug_write_flush(thr);\n\tduk_pop(thr);\n}\n\nDUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) {\n\tDUK_D(DUK_DPRINT(\"application called duk_debugger_detach()\"));\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\t/* Can be called multiple times with no harm. */\n\tduk_debug_do_detach(thr->heap);\n}\n\nDUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) {\n\tduk_bool_t processed_messages;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\tif (!duk_debug_is_attached(thr->heap)) {\n\t\treturn;\n\t}\n\tif (thr->callstack_curr != NULL || thr->heap->dbg_processing) {\n\t\t/* Calling duk_debugger_cooperate() while Duktape is being\n\t\t * called into is not supported.  This is not a 100% check\n\t\t * but prevents any damage in most cases.\n\t\t */\n\t\treturn;\n\t}\n\n\tprocessed_messages = duk_debug_process_messages(thr, 1 /*no_block*/);\n\tDUK_UNREF(processed_messages);\n}\n\nDUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) {\n\tduk_idx_t top;\n\tduk_idx_t idx;\n\tduk_bool_t ret = 0;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\tDUK_D(DUK_DPRINT(\"application called duk_debugger_notify() with nvalues=%ld\", (long) nvalues));\n\n\ttop = duk_get_top(thr);\n\tif (top < nvalues) {\n\t\tDUK_ERROR_RANGE(thr, \"not enough stack values for notify\");\n\t\treturn ret;  /* unreachable */\n\t}\n\tif (duk_debug_is_attached(thr->heap)) {\n\t\tduk_debug_write_notify(thr, DUK_DBG_CMD_APPNOTIFY);\n\t\tfor (idx = top - nvalues; idx < top; idx++) {\n\t\t\tduk_tval *tv = DUK_GET_TVAL_POSIDX(thr, idx);\n\t\t\tduk_debug_write_tval(thr, tv);\n\t\t}\n\t\tduk_debug_write_eom(thr);\n\n\t\t/* Return non-zero (true) if we have a good reason to believe\n\t\t * the notify was delivered; if we're still attached at least\n\t\t * a transport error was not indicated by the transport write\n\t\t * callback.  This is not a 100% guarantee of course.\n\t\t */\n\t\tif (duk_debug_is_attached(thr->heap)) {\n\t\t\tret = 1;\n\t\t}\n\t}\n\tduk_pop_n(thr, nvalues);\n\treturn ret;\n}\n\nDUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\tDUK_D(DUK_DPRINT(\"application called duk_debugger_pause()\"));\n\n\t/* Treat like a debugger statement: ignore when not attached. */\n\tif (duk_debug_is_attached(thr->heap)) {\n\t\tif (duk_debug_is_paused(thr->heap)) {\n\t\t\tDUK_D(DUK_DPRINT(\"duk_debugger_pause() called when already paused; ignoring\"));\n\t\t} else {\n\t\t\tduk_debug_set_paused(thr->heap);\n\n\t\t\t/* Pause on the next opcode executed.  This is always safe to do even\n\t\t\t * inside the debugger message loop: the interrupt counter will be reset\n\t\t\t * to its proper value when the message loop exits.\n\t\t\t */\n\t\t\tthr->interrupt_init = 1;\n\t\t\tthr->interrupt_counter = 0;\n\t\t}\n\t}\n}\n\n#else  /* DUK_USE_DEBUGGER_SUPPORT */\n\nDUK_EXTERNAL void duk_debugger_attach(duk_hthread *thr,\n                                      duk_debug_read_function read_cb,\n                                      duk_debug_write_function write_cb,\n                                      duk_debug_peek_function peek_cb,\n                                      duk_debug_read_flush_function read_flush_cb,\n                                      duk_debug_write_flush_function write_flush_cb,\n                                      duk_debug_request_function request_cb,\n                                      duk_debug_detached_function detached_cb,\n                                      void *udata) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(read_cb);\n\tDUK_UNREF(write_cb);\n\tDUK_UNREF(peek_cb);\n\tDUK_UNREF(read_flush_cb);\n\tDUK_UNREF(write_flush_cb);\n\tDUK_UNREF(request_cb);\n\tDUK_UNREF(detached_cb);\n\tDUK_UNREF(udata);\n\tDUK_ERROR_TYPE(thr, \"no debugger support\");\n}\n\nDUK_EXTERNAL void duk_debugger_detach(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ERROR_TYPE(thr, \"no debugger support\");\n}\n\nDUK_EXTERNAL void duk_debugger_cooperate(duk_hthread *thr) {\n\t/* nop */\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(thr);\n}\n\nDUK_EXTERNAL duk_bool_t duk_debugger_notify(duk_hthread *thr, duk_idx_t nvalues) {\n\tduk_idx_t top;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttop = duk_get_top(thr);\n\tif (top < nvalues) {\n\t\tDUK_ERROR_RANGE_INVALID_COUNT(thr);\n\t\treturn 0;  /* unreachable */\n\t}\n\n\t/* No debugger support, just pop values. */\n\tduk_pop_n(thr, nvalues);\n\treturn 0;\n}\n\nDUK_EXTERNAL void duk_debugger_pause(duk_hthread *thr) {\n\t/* Treat like debugger statement: nop */\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(thr);\n}\n\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n#line 1 \"duk_api_heap.c\"\n/*\n *  Heap creation and destruction\n */\n\n/* #include duk_internal.h -> already included */\n\ntypedef struct duk_internal_thread_state duk_internal_thread_state;\n\nstruct duk_internal_thread_state {\n\tduk_ljstate lj;\n\tduk_bool_t creating_error;\n\tduk_hthread *curr_thread;\n\tduk_int_t call_recursion_depth;\n};\n\nDUK_EXTERNAL duk_hthread *duk_create_heap(duk_alloc_function alloc_func,\n                                          duk_realloc_function realloc_func,\n                                          duk_free_function free_func,\n                                          void *heap_udata,\n                                          duk_fatal_function fatal_handler) {\n\tduk_heap *heap = NULL;\n\tduk_hthread *thr;\n\n\t/* Assume that either all memory funcs are NULL or non-NULL, mixed\n\t * cases will now be unsafe.\n\t */\n\n\t/* XXX: just assert non-NULL values here and make caller arguments\n\t * do the defaulting to the default implementations (smaller code)?\n\t */\n\n\tif (!alloc_func) {\n\t\tDUK_ASSERT(realloc_func == NULL);\n\t\tDUK_ASSERT(free_func == NULL);\n#if defined(DUK_USE_PROVIDE_DEFAULT_ALLOC_FUNCTIONS)\n\t\talloc_func = duk_default_alloc_function;\n\t\trealloc_func = duk_default_realloc_function;\n\t\tfree_func = duk_default_free_function;\n#else\n\t\tDUK_D(DUK_DPRINT(\"no allocation functions given and no default providers\"));\n\t\treturn NULL;\n#endif\n\t} else {\n\t\tDUK_ASSERT(realloc_func != NULL);\n\t\tDUK_ASSERT(free_func != NULL);\n\t}\n\n\tif (!fatal_handler) {\n\t\tfatal_handler = duk_default_fatal_handler;\n\t}\n\n\tDUK_ASSERT(alloc_func != NULL);\n\tDUK_ASSERT(realloc_func != NULL);\n\tDUK_ASSERT(free_func != NULL);\n\tDUK_ASSERT(fatal_handler != NULL);\n\n\theap = duk_heap_alloc(alloc_func, realloc_func, free_func, heap_udata, fatal_handler);\n\tif (!heap) {\n\t\treturn NULL;\n\t}\n\tthr = heap->heap_thread;\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\treturn thr;\n}\n\nDUK_EXTERNAL void duk_destroy_heap(duk_hthread *thr) {\n\tduk_heap *heap;\n\n\tif (!thr) {\n\t\treturn;\n\t}\n\tDUK_ASSERT_API_ENTRY(thr);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tduk_heap_free(heap);\n}\n\nDUK_EXTERNAL void duk_suspend(duk_hthread *thr, duk_thread_state *state) {\n\tduk_internal_thread_state *snapshot = (duk_internal_thread_state *) (void *) state;\n\tduk_heap *heap;\n\tduk_ljstate *lj;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(state != NULL);  /* unvalidated */\n\n\t/* Currently not supported when called from within a finalizer.\n\t * If that is done, the finalizer will remain running indefinitely,\n\t * preventing other finalizers from executing.  The assert is a bit\n\t * wider, checking that it would be OK to run pending finalizers.\n\t */\n\tDUK_ASSERT(thr->heap->pf_prevent_count == 0);\n\n\t/* Currently not supported to duk_suspend() from an errCreate()\n\t * call.\n\t */\n\tDUK_ASSERT(thr->heap->creating_error == 0);\n\n\theap = thr->heap;\n\tlj = &heap->lj;\n\n\tduk_push_tval(thr, &lj->value1);\n\tduk_push_tval(thr, &lj->value2);\n\n\t/* XXX: creating_error == 0 is asserted above, so no need to store. */\n\tDUK_MEMCPY((void *) &snapshot->lj, (const void *) lj, sizeof(duk_ljstate));\n\tsnapshot->creating_error = heap->creating_error;\n\tsnapshot->curr_thread = heap->curr_thread;\n\tsnapshot->call_recursion_depth = heap->call_recursion_depth;\n\n\tlj->jmpbuf_ptr = NULL;\n\tlj->type = DUK_LJ_TYPE_UNKNOWN;\n\tDUK_TVAL_SET_UNDEFINED(&lj->value1);\n\tDUK_TVAL_SET_UNDEFINED(&lj->value2);\n\theap->creating_error = 0;\n\theap->curr_thread = NULL;\n\theap->call_recursion_depth = 0;\n}\n\nDUK_EXTERNAL void duk_resume(duk_hthread *thr, const duk_thread_state *state) {\n\tconst duk_internal_thread_state *snapshot = (const duk_internal_thread_state *) (const void *) state;\n\tduk_heap *heap;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(state != NULL);  /* unvalidated */\n\n\t/* Shouldn't be necessary if duk_suspend() is called before\n\t * duk_resume(), but assert in case API sequence is incorrect.\n\t */\n\tDUK_ASSERT(thr->heap->pf_prevent_count == 0);\n\tDUK_ASSERT(thr->heap->creating_error == 0);\n\n\theap = thr->heap;\n\n\tDUK_MEMCPY((void *) &heap->lj, (const void *) &snapshot->lj, sizeof(duk_ljstate));\n\theap->creating_error = snapshot->creating_error;\n\theap->curr_thread = snapshot->curr_thread;\n\theap->call_recursion_depth = snapshot->call_recursion_depth;\n\n\tduk_pop_2(thr);\n}\n\n/* XXX: better place for this */\nDUK_EXTERNAL void duk_set_global_object(duk_hthread *thr) {\n\tduk_hobject *h_glob;\n\tduk_hobject *h_prev_glob;\n\tduk_hobjenv *h_env;\n\tduk_hobject *h_prev_env;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_D(DUK_DPRINT(\"replace global object with: %!T\", duk_get_tval(thr, -1)));\n\n\th_glob = duk_require_hobject(thr, -1);\n\tDUK_ASSERT(h_glob != NULL);\n\n\t/*\n\t *  Replace global object.\n\t */\n\n\th_prev_glob = thr->builtins[DUK_BIDX_GLOBAL];\n\tDUK_UNREF(h_prev_glob);\n\tthr->builtins[DUK_BIDX_GLOBAL] = h_glob;\n\tDUK_HOBJECT_INCREF(thr, h_glob);\n\tDUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_glob);  /* side effects, in theory (referenced by global env) */\n\n\t/*\n\t *  Replace lexical environment for global scope\n\t *\n\t *  Create a new object environment for the global lexical scope.\n\t *  We can't just reset the _Target property of the current one,\n\t *  because the lexical scope is shared by other threads with the\n\t *  same (initial) built-ins.\n\t */\n\n\th_env = duk_hobjenv_alloc(thr,\n\t                          DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                          DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));\n\tDUK_ASSERT(h_env != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_env) == NULL);\n\n\tDUK_ASSERT(h_env->target == NULL);\n\tDUK_ASSERT(h_glob != NULL);\n\th_env->target = h_glob;\n\tDUK_HOBJECT_INCREF(thr, h_glob);\n\tDUK_ASSERT(h_env->has_this == 0);\n\n\t/* [ ... new_glob ] */\n\n\th_prev_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\tthr->builtins[DUK_BIDX_GLOBAL_ENV] = (duk_hobject *) h_env;\n\tDUK_HOBJECT_INCREF(thr, (duk_hobject *) h_env);\n\tDUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_env);  /* side effects */\n\tDUK_UNREF(h_env);  /* without refcounts */\n\tDUK_UNREF(h_prev_env);\n\n\t/* [ ... new_glob ] */\n\n\tduk_pop(thr);\n\n\t/* [ ... ] */\n}\n#line 1 \"duk_api_inspect.c\"\n/*\n *  Inspection\n */\n\n/* #include duk_internal.h -> already included */\n\n/* For footprint efficient multiple value setting: arrays are much better than\n * varargs, format string with parsing is often better than string pointer arrays.\n */\nDUK_LOCAL void duk__inspect_multiple_uint(duk_hthread *thr, const char *fmt, duk_int_t *vals) {\n\tduk_int_t val;\n\tconst char *p;\n\tconst char *p_curr;\n\tduk_size_t len;\n\n\tfor (p = fmt;;) {\n\t\tlen = DUK_STRLEN(p);\n\t\tp_curr = p;\n\t\tp += len + 1;\n\t\tif (len == 0) {\n\t\t\t/* Double NUL (= empty key) terminates. */\n\t\t\tbreak;\n\t\t}\n\t\tval = *vals++;\n\t\tif (val >= 0) {\n\t\t\t/* Negative values are markers to skip key. */\n\t\t\tduk_push_string(thr, p_curr);\n\t\t\tduk_push_int(thr, val);\n\t\t\tduk_put_prop(thr, -3);\n\t\t}\n\t}\n}\n\n/* Raw helper to extract internal information / statistics about a value.\n * The return value is an object with properties that are version specific.\n * The properties must not expose anything that would lead to security\n * issues (e.g. exposing compiled function 'data' buffer might be an issue).\n * Currently only counts and sizes and such are given so there shouldn't\n * be security implications.\n */\n\n#define DUK__IDX_TYPE     0\n#define DUK__IDX_ITAG     1\n#define DUK__IDX_REFC     2\n#define DUK__IDX_HBYTES   3\n#define DUK__IDX_CLASS    4\n#define DUK__IDX_PBYTES   5\n#define DUK__IDX_ESIZE    6\n#define DUK__IDX_ENEXT    7\n#define DUK__IDX_ASIZE    8\n#define DUK__IDX_HSIZE    9\n#define DUK__IDX_BCBYTES  10\n#define DUK__IDX_DBYTES   11\n#define DUK__IDX_TSTATE   12\n#define DUK__IDX_VARIANT  13\n\nDUK_EXTERNAL void duk_inspect_value(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_heaphdr *h;\n\t/* The temporary values should be in an array rather than individual\n\t * variables which (in practice) ensures that the compiler won't map\n\t * them to registers and emit a lot of unnecessary shuffling code.\n\t */\n\tduk_int_t vals[14];\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Assume two's complement and set everything to -1. */\n\tDUK_MEMSET((void *) &vals, (int) 0xff, sizeof(vals));\n\tDUK_ASSERT(vals[DUK__IDX_TYPE] == -1);  /* spot check one */\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\th = (DUK_TVAL_IS_HEAP_ALLOCATED(tv) ? DUK_TVAL_GET_HEAPHDR(tv) : NULL);\n\n\tvals[DUK__IDX_TYPE] = duk_get_type_tval(tv);\n\tvals[DUK__IDX_ITAG] = (duk_int_t) DUK_TVAL_GET_TAG(tv);\n\n\tduk_push_bare_object(thr);  /* Invalidates 'tv'. */\n\ttv = NULL;\n\n\tif (h == NULL) {\n\t\tgoto finish;\n\t}\n\tduk_push_pointer(thr, (void *) h);\n\tduk_put_prop_string(thr, -2, \"hptr\");\n\n#if 0\n\t/* Covers a lot of information, e.g. buffer and string variants. */\n\tduk_push_uint(thr, (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h));\n\tduk_put_prop_string(thr, -2, \"hflags\");\n#endif\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tvals[DUK__IDX_REFC] = (duk_int_t) DUK_HEAPHDR_GET_REFCOUNT(h);\n#endif\n\tvals[DUK__IDX_VARIANT] = 0;\n\n\t/* Heaphdr size and additional allocation size, followed by\n\t * type specific stuff (with varying value count).\n\t */\n\tswitch ((duk_small_int_t) DUK_HEAPHDR_GET_TYPE(h)) {\n\tcase DUK_HTYPE_STRING: {\n\t\tduk_hstring *h_str = (duk_hstring *) h;\n\t\tvals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hstring) + DUK_HSTRING_GET_BYTELEN(h_str) + 1);\n#if defined(DUK_USE_HSTRING_EXTDATA)\n\t\tif (DUK_HSTRING_HAS_EXTDATA(h_str)) {\n\t\t\tvals[DUK__IDX_VARIANT] = 1;\n\t\t}\n#endif\n\t\tbreak;\n\t}\n\tcase DUK_HTYPE_OBJECT: {\n\t\tduk_hobject *h_obj = (duk_hobject *) h;\n\n\t\t/* XXX: variants here are maybe pointless; class is enough? */\n\t\tif (DUK_HOBJECT_IS_ARRAY(h_obj)) {\n\t\t\tvals[DUK__IDX_HBYTES] = sizeof(duk_harray);\n\t\t} else if (DUK_HOBJECT_IS_COMPFUNC(h_obj)) {\n\t\t\tvals[DUK__IDX_HBYTES] = sizeof(duk_hcompfunc);\n\t\t} else if (DUK_HOBJECT_IS_NATFUNC(h_obj)) {\n\t\t\tvals[DUK__IDX_HBYTES] = sizeof(duk_hnatfunc);\n\t\t} else if (DUK_HOBJECT_IS_THREAD(h_obj)) {\n\t\t\tvals[DUK__IDX_HBYTES] = sizeof(duk_hthread);\n\t\t\tvals[DUK__IDX_TSTATE] = ((duk_hthread *) h_obj)->state;\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\t} else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {\n\t\t\tvals[DUK__IDX_HBYTES] = sizeof(duk_hbufobj);\n\t\t\t/* XXX: some size information */\n#endif\n\t\t} else {\n\t\t\tvals[DUK__IDX_HBYTES] = (duk_small_uint_t) sizeof(duk_hobject);\n\t\t}\n\n\t\tvals[DUK__IDX_CLASS] = (duk_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h_obj);\n\t\tvals[DUK__IDX_PBYTES] = (duk_int_t) DUK_HOBJECT_P_ALLOC_SIZE(h_obj),\n\t\tvals[DUK__IDX_ESIZE] = (duk_int_t) DUK_HOBJECT_GET_ESIZE(h_obj);\n\t\tvals[DUK__IDX_ENEXT] = (duk_int_t) DUK_HOBJECT_GET_ENEXT(h_obj);\n\t\tvals[DUK__IDX_ASIZE] = (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj);\n\t\tvals[DUK__IDX_HSIZE] = (duk_int_t) DUK_HOBJECT_GET_HSIZE(h_obj);\n\n\t\t/* Note: e_next indicates the number of gc-reachable entries\n\t\t * in the entry part, and also indicates the index where the\n\t\t * next new property would be inserted.  It does *not* indicate\n\t\t * the number of non-NULL keys present in the object.  That\n\t\t * value could be counted separately but requires a pass through\n\t\t * the key list.\n\t\t */\n\n\t\tif (DUK_HOBJECT_IS_COMPFUNC(h_obj)) {\n\t\t\tduk_hbuffer *h_data = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, (duk_hcompfunc *) h_obj);\n\t\t\tvals[DUK__IDX_BCBYTES] = (duk_int_t) (h_data ? DUK_HBUFFER_GET_SIZE(h_data) : 0);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_HTYPE_BUFFER: {\n\t\tduk_hbuffer *h_buf = (duk_hbuffer *) h;\n\n\t\tif (DUK_HBUFFER_HAS_DYNAMIC(h_buf)) {\n\t\t\tif (DUK_HBUFFER_HAS_EXTERNAL(h_buf)) {\n\t\t\t\tvals[DUK__IDX_VARIANT] = 2;  /* buffer variant 2: external */\n\t\t\t\tvals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_external));\n\t\t\t} else {\n\t\t\t\t/* When alloc_size == 0 the second allocation may not\n\t\t\t\t * actually exist.\n\t\t\t\t */\n\t\t\t\tvals[DUK__IDX_VARIANT] = 1;  /* buffer variant 1: dynamic */\n\t\t\t\tvals[DUK__IDX_HBYTES] = (duk_uint_t) (sizeof(duk_hbuffer_dynamic));\n\t\t\t}\n\t\t\tvals[DUK__IDX_DBYTES] = (duk_int_t) (DUK_HBUFFER_GET_SIZE(h_buf));\n\t\t} else {\n\t\t\tDUK_ASSERT(vals[DUK__IDX_VARIANT] == 0);  /* buffer variant 0: fixed */\n\t\t\tvals[DUK__IDX_HBYTES] = (duk_int_t) (sizeof(duk_hbuffer_fixed) + DUK_HBUFFER_GET_SIZE(h_buf));\n\t\t}\n\t\tbreak;\n\t}\n\t}\n\n finish:\n\tduk__inspect_multiple_uint(thr,\n\t    \"type\" \"\\x00\" \"itag\" \"\\x00\" \"refc\" \"\\x00\" \"hbytes\" \"\\x00\" \"class\" \"\\x00\"\n\t    \"pbytes\" \"\\x00\" \"esize\" \"\\x00\" \"enext\" \"\\x00\" \"asize\" \"\\x00\" \"hsize\" \"\\x00\"\n\t    \"bcbytes\" \"\\x00\" \"dbytes\" \"\\x00\" \"tstate\" \"\\x00\" \"variant\" \"\\x00\" \"\\x00\",\n\t    (duk_int_t *) &vals);\n}\n\nDUK_EXTERNAL void duk_inspect_callstack_entry(duk_hthread *thr, duk_int_t level) {\n\tduk_activation *act;\n\tduk_uint_fast32_t pc;\n\tduk_uint_fast32_t line;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* -1   = top callstack entry\n\t * -2   = caller of level -1\n\t * etc\n\t */\n\tact = duk_hthread_get_activation_for_level(thr, level);\n\tif (act == NULL) {\n\t\tduk_push_undefined(thr);\n\t\treturn;\n\t}\n\tduk_push_bare_object(thr);\n\n\t/* Relevant PC is just before current one because PC is\n\t * post-incremented.  This should match what error augment\n\t * code does.\n\t */\n\tpc = duk_hthread_get_act_prev_pc(thr, act);\n\n\tduk_push_tval(thr, &act->tv_func);\n\n\tduk_push_uint(thr, (duk_uint_t) pc);\n\tduk_put_prop_stridx_short(thr, -3, DUK_STRIDX_PC);\n\n#if defined(DUK_USE_PC2LINE)\n\tline = duk_hobject_pc2line_query(thr, -1, pc);\n#else\n\tline = 0;\n#endif\n\tduk_push_uint(thr, (duk_uint_t) line);\n\tduk_put_prop_stridx_short(thr, -3, DUK_STRIDX_LINE_NUMBER);\n\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_LC_FUNCTION);\n\t/* Providing access to e.g. act->lex_env would be dangerous: these\n\t * internal structures must never be accessible to the application.\n\t * Duktape relies on them having consistent data, and this consistency\n\t * is only asserted for, not checked for.\n\t */\n}\n\n/* automatic undefs */\n#undef DUK__IDX_ASIZE\n#undef DUK__IDX_BCBYTES\n#undef DUK__IDX_CLASS\n#undef DUK__IDX_DBYTES\n#undef DUK__IDX_ENEXT\n#undef DUK__IDX_ESIZE\n#undef DUK__IDX_HBYTES\n#undef DUK__IDX_HSIZE\n#undef DUK__IDX_ITAG\n#undef DUK__IDX_PBYTES\n#undef DUK__IDX_REFC\n#undef DUK__IDX_TSTATE\n#undef DUK__IDX_TYPE\n#undef DUK__IDX_VARIANT\n#line 1 \"duk_api_memory.c\"\n/*\n *  Memory calls.\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_EXTERNAL void *duk_alloc_raw(duk_hthread *thr, duk_size_t size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn DUK_ALLOC_RAW(thr->heap, size);\n}\n\nDUK_EXTERNAL void duk_free_raw(duk_hthread *thr, void *ptr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_FREE_RAW(thr->heap, ptr);\n}\n\nDUK_EXTERNAL void *duk_realloc_raw(duk_hthread *thr, void *ptr, duk_size_t size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn DUK_REALLOC_RAW(thr->heap, ptr, size);\n}\n\nDUK_EXTERNAL void *duk_alloc(duk_hthread *thr, duk_size_t size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn DUK_ALLOC(thr->heap, size);\n}\n\nDUK_EXTERNAL void duk_free(duk_hthread *thr, void *ptr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_FREE_CHECKED(thr, ptr);\n}\n\nDUK_EXTERNAL void *duk_realloc(duk_hthread *thr, void *ptr, duk_size_t size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/*\n\t *  Note: since this is an exposed API call, there should be\n\t *  no way a mark-and-sweep could have a side effect on the\n\t *  memory allocation behind 'ptr'; the pointer should never\n\t *  be something that Duktape wants to change.\n\t *\n\t *  Thus, no need to use DUK_REALLOC_INDIRECT (and we don't\n\t *  have the storage location here anyway).\n\t */\n\n\treturn DUK_REALLOC(thr->heap, ptr, size);\n}\n\nDUK_EXTERNAL void duk_get_memory_functions(duk_hthread *thr, duk_memory_functions *out_funcs) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(out_funcs != NULL);\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\theap = thr->heap;\n\tout_funcs->alloc_func = heap->alloc_func;\n\tout_funcs->realloc_func = heap->realloc_func;\n\tout_funcs->free_func = heap->free_func;\n\tout_funcs->udata = heap->heap_udata;\n}\n\nDUK_EXTERNAL void duk_gc(duk_hthread *thr, duk_uint_t flags) {\n\tduk_heap *heap;\n\tduk_small_uint_t ms_flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tDUK_D(DUK_DPRINT(\"mark-and-sweep requested by application\"));\n\tDUK_ASSERT(DUK_GC_COMPACT == DUK_MS_FLAG_EMERGENCY);  /* Compact flag is 1:1 with emergency flag which forces compaction. */\n\tms_flags = (duk_small_uint_t) flags;\n\tduk_heap_mark_and_sweep(heap, ms_flags);\n}\n#line 1 \"duk_api_object.c\"\n/*\n *  Object handling: property access and other support functions.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Property handling\n *\n *  The API exposes only the most common property handling functions.\n *  The caller can invoke Ecmascript built-ins for full control (e.g.\n *  defineProperty, getOwnPropertyDescriptor).\n */\n\nDUK_EXTERNAL duk_bool_t duk_get_prop(duk_hthread *thr, duk_idx_t obj_idx) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_bool_t rc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Note: copying tv_obj and tv_key to locals to shield against a valstack\n\t * resize is not necessary for a property get right now.\n\t */\n\n\ttv_obj = duk_require_tval(thr, obj_idx);\n\ttv_key = duk_require_tval(thr, -1);\n\n\trc = duk_hobject_getprop(thr, tv_obj, tv_key);\n\tDUK_ASSERT(rc == 0 || rc == 1);\n\t/* a value is left on stack regardless of rc */\n\n\tduk_remove_m2(thr);  /* remove key */\n\tDUK_ASSERT(duk_is_undefined(thr, -1) || rc == 1);\n\treturn rc;  /* 1 if property found, 0 otherwise */\n}\n\nDUK_EXTERNAL duk_bool_t duk_get_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_string(thr, key);\n\treturn duk_get_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_get_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_lstring(thr, key, key_len);\n\treturn duk_get_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_get_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_uarridx(thr, arr_idx);\n\treturn duk_get_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_get_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_heapptr(thr, ptr);  /* NULL -> 'undefined' */\n\treturn duk_get_prop(thr, obj_idx);\n}\n\nDUK_INTERNAL duk_bool_t duk_get_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));\n\treturn duk_get_prop(thr, obj_idx);\n}\n\nDUK_INTERNAL duk_bool_t duk_get_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {\n\treturn duk_get_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),\n\t                                (duk_small_uint_t) (packed_args & 0xffffUL));\n}\n\nDUK_INTERNAL duk_bool_t duk_get_prop_stridx_boolean(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_bool_t *out_has_prop) {\n\tduk_bool_t rc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\n\trc = duk_get_prop_stridx(thr, obj_idx, stridx);\n\tif (out_has_prop) {\n\t\t*out_has_prop = rc;\n\t}\n\trc = duk_to_boolean(thr, -1);\n\tDUK_ASSERT(rc == 0 || rc == 1);\n\tduk_pop(thr);\n\treturn rc;\n}\n\nDUK_LOCAL duk_bool_t duk__put_prop_shared(duk_hthread *thr, duk_idx_t obj_idx, duk_idx_t idx_key) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_tval *tv_val;\n\tduk_bool_t throw_flag;\n\tduk_bool_t rc;\n\n\t/* Note: copying tv_obj and tv_key to locals to shield against a valstack\n\t * resize is not necessary for a property put right now (putprop protects\n\t * against it internally).\n\t */\n\n\t/* Key and value indices are either (-2, -1) or (-1, -2).  Given idx_key,\n\t * idx_val is always (idx_key ^ 0x01).\n\t */\n\tDUK_ASSERT((idx_key == -2 && (idx_key ^ 1) == -1) ||\n\t           (idx_key == -1 && (idx_key ^ 1) == -2));\n\t/* XXX: Direct access; faster validation. */\n\ttv_obj = duk_require_tval(thr, obj_idx);\n\ttv_key = duk_require_tval(thr, idx_key);\n\ttv_val = duk_require_tval(thr, idx_key ^ 1);\n\tthrow_flag = duk_is_strict_call(thr);\n\n\trc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, throw_flag);\n\tDUK_ASSERT(rc == 0 || rc == 1);\n\n\tduk_pop_2(thr);  /* remove key and value */\n\treturn rc;  /* 1 if property found, 0 otherwise */\n}\n\nDUK_EXTERNAL duk_bool_t duk_put_prop(duk_hthread *thr, duk_idx_t obj_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__put_prop_shared(thr, obj_idx, -2);\n}\n\nDUK_EXTERNAL duk_bool_t duk_put_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\t/* Careful here and with other duk_put_prop_xxx() helpers: the\n\t * target object and the property value may be in the same value\n\t * stack slot (unusual, but still conceptually clear).\n\t */\n\tobj_idx = duk_normalize_index(thr, obj_idx);\n\t(void) duk_push_string(thr, key);\n\treturn duk__put_prop_shared(thr, obj_idx, -1);\n}\n\nDUK_EXTERNAL duk_bool_t duk_put_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\tobj_idx = duk_normalize_index(thr, obj_idx);\n\t(void) duk_push_lstring(thr, key, key_len);\n\treturn duk__put_prop_shared(thr, obj_idx, -1);\n}\n\nDUK_EXTERNAL duk_bool_t duk_put_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_uarridx(thr, arr_idx);\n\treturn duk__put_prop_shared(thr, obj_idx, -1);\n}\n\nDUK_EXTERNAL duk_bool_t duk_put_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_heapptr(thr, ptr);  /* NULL -> 'undefined' */\n\treturn duk__put_prop_shared(thr, obj_idx, -1);\n}\n\n\nDUK_INTERNAL duk_bool_t duk_put_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));\n\treturn duk__put_prop_shared(thr, obj_idx, -1);\n}\n\nDUK_INTERNAL duk_bool_t duk_put_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {\n\treturn duk_put_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),\n\t                                (duk_small_uint_t) (packed_args & 0xffffUL));\n}\n\nDUK_EXTERNAL duk_bool_t duk_del_prop(duk_hthread *thr, duk_idx_t obj_idx) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_bool_t throw_flag;\n\tduk_bool_t rc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Note: copying tv_obj and tv_key to locals to shield against a valstack\n\t * resize is not necessary for a property delete right now.\n\t */\n\n\ttv_obj = duk_require_tval(thr, obj_idx);\n\ttv_key = duk_require_tval(thr, -1);\n\tthrow_flag = duk_is_strict_call(thr);\n\n\trc = duk_hobject_delprop(thr, tv_obj, tv_key, throw_flag);\n\tDUK_ASSERT(rc == 0 || rc == 1);\n\n\tduk_pop(thr);  /* remove key */\n\treturn rc;\n}\n\nDUK_EXTERNAL duk_bool_t duk_del_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_string(thr, key);\n\treturn duk_del_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_del_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_lstring(thr, key, key_len);\n\treturn duk_del_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_del_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_uarridx(thr, arr_idx);\n\treturn duk_del_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_del_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_heapptr(thr, ptr);  /* NULL -> 'undefined' */\n\treturn duk_del_prop(thr, obj_idx);\n}\n\nDUK_INTERNAL duk_bool_t duk_del_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));\n\treturn duk_del_prop(thr, obj_idx);\n}\n\n#if 0\nDUK_INTERNAL duk_bool_t duk_del_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {\n\treturn duk_del_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),\n\t                                (duk_small_uint_t) (packed_args & 0xffffUL));\n}\n#endif\n\nDUK_EXTERNAL duk_bool_t duk_has_prop(duk_hthread *thr, duk_idx_t obj_idx) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_bool_t rc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Note: copying tv_obj and tv_key to locals to shield against a valstack\n\t * resize is not necessary for a property existence check right now.\n\t */\n\n\ttv_obj = duk_require_tval(thr, obj_idx);\n\ttv_key = duk_require_tval(thr, -1);\n\n\trc = duk_hobject_hasprop(thr, tv_obj, tv_key);\n\tDUK_ASSERT(rc == 0 || rc == 1);\n\n\tduk_pop(thr);  /* remove key */\n\treturn rc;  /* 1 if property found, 0 otherwise */\n}\n\nDUK_EXTERNAL duk_bool_t duk_has_prop_string(duk_hthread *thr, duk_idx_t obj_idx, const char *key) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_string(thr, key);\n\treturn duk_has_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_has_prop_lstring(duk_hthread *thr, duk_idx_t obj_idx, const char *key, duk_size_t key_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(key != NULL);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_lstring(thr, key, key_len);\n\treturn duk_has_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_has_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_uarridx(thr, arr_idx);\n\treturn duk_has_prop(thr, obj_idx);\n}\n\nDUK_EXTERNAL duk_bool_t duk_has_prop_heapptr(duk_hthread *thr, duk_idx_t obj_idx, void *ptr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_heapptr(thr, ptr);  /* NULL -> 'undefined' */\n\treturn duk_has_prop(thr, obj_idx);\n}\n\nDUK_INTERNAL duk_bool_t duk_has_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));\n\treturn duk_has_prop(thr, obj_idx);\n}\n\n#if 0\nDUK_INTERNAL duk_bool_t duk_has_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {\n\treturn duk_has_prop_stridx(thr, (duk_idx_t) (duk_int16_t) (packed_args >> 16),\n\t                                (duk_small_uint_t) (packed_args & 0xffffUL));\n}\n#endif\n\n/* Define own property without inheritance lookups and such.  This differs from\n * [[DefineOwnProperty]] because special behaviors (like Array 'length') are\n * not invoked by this method.  The caller must be careful to invoke any such\n * behaviors if necessary.\n */\nDUK_INTERNAL void duk_xdef_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t desc_flags) {\n\tduk_hobject *obj;\n\tduk_hstring *key;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_require_hobject(thr, obj_idx);\n\tDUK_ASSERT(obj != NULL);\n\tkey = duk_to_property_key_hstring(thr, -2);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(duk_require_tval(thr, -1) != NULL);\n\n\tduk_hobject_define_property_internal(thr, obj, key, desc_flags);\n\n\tduk_pop(thr);  /* pop key */\n}\n\nDUK_INTERNAL void duk_xdef_prop_index(duk_hthread *thr, duk_idx_t obj_idx, duk_uarridx_t arr_idx, duk_small_uint_t desc_flags) {\n\tduk_hobject *obj;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_require_hobject(thr, obj_idx);\n\tDUK_ASSERT(obj != NULL);\n\n\tduk_hobject_define_property_internal_arridx(thr, obj, arr_idx, desc_flags);\n\t/* value popped by call */\n}\n\nDUK_INTERNAL void duk_xdef_prop_stridx(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_uint_t desc_flags) {\n\tduk_hobject *obj;\n\tduk_hstring *key;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\n\tobj = duk_require_hobject(thr, obj_idx);\n\tDUK_ASSERT(obj != NULL);\n\tkey = DUK_HTHREAD_GET_STRING(thr, stridx);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(duk_require_tval(thr, -1) != NULL);\n\n\tduk_hobject_define_property_internal(thr, obj, key, desc_flags);\n\t/* value popped by call */\n}\n\nDUK_INTERNAL void duk_xdef_prop_stridx_short_raw(duk_hthread *thr, duk_uint_t packed_args) {\n\tduk_xdef_prop_stridx(thr, (duk_idx_t) (duk_int8_t) (packed_args >> 24),\n\t                          (duk_small_uint_t) (packed_args >> 8) & 0xffffUL,\n\t                          (duk_small_uint_t) (packed_args & 0xffL));\n}\n\n#if 0  /*unused*/\nDUK_INTERNAL void duk_xdef_prop_stridx_builtin(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags) {\n\tduk_hobject *obj;\n\tduk_hstring *key;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\tDUK_ASSERT_BIDX_VALID(builtin_idx);\n\n\tobj = duk_require_hobject(thr, obj_idx);\n\tDUK_ASSERT(obj != NULL);\n\tkey = DUK_HTHREAD_GET_STRING(thr, stridx);\n\tDUK_ASSERT(key != NULL);\n\n\tduk_push_hobject(thr, thr->builtins[builtin_idx]);\n\tduk_hobject_define_property_internal(thr, obj, key, desc_flags);\n\t/* value popped by call */\n}\n#endif\n\n/* This is a rare property helper; it sets the global thrower (E5 Section 13.2.3)\n * setter/getter into an object property.  This is needed by the 'arguments'\n * object creation code, function instance creation code, and Function.prototype.bind().\n */\n\nDUK_INTERNAL void duk_xdef_prop_stridx_thrower(duk_hthread *thr, duk_idx_t obj_idx, duk_small_uint_t stridx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tduk_push_hstring_stridx(thr, stridx);\n\tduk_push_hobject_bidx(thr, DUK_BIDX_TYPE_ERROR_THROWER);\n\tduk_dup_top(thr);\n\tduk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_SETTER | DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_FORCE);  /* attributes always 0 */\n}\n\n/* Object.getOwnPropertyDescriptor() equivalent C binding. */\nDUK_EXTERNAL void duk_get_prop_desc(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(flags);  /* no flags defined yet */\n\n\tduk_hobject_object_get_own_property_descriptor(thr, obj_idx);  /* [ ... key ] -> [ ... desc ] */\n}\n\n/* Object.defineProperty() equivalent C binding. */\nDUK_EXTERNAL void duk_def_prop(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t flags) {\n\tduk_idx_t idx_base;\n\tduk_hobject *obj;\n\tduk_hstring *key;\n\tduk_idx_t idx_value;\n\tduk_hobject *get;\n\tduk_hobject *set;\n\tduk_uint_t is_data_desc;\n\tduk_uint_t is_acc_desc;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_require_hobject(thr, obj_idx);\n\n\tis_data_desc = flags & (DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE);\n\tis_acc_desc = flags & (DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER);\n\tif (is_data_desc && is_acc_desc) {\n\t\t/* \"Have\" flags must not be conflicting so that they would\n\t\t * apply to both a plain property and an accessor at the same\n\t\t * time.\n\t\t */\n\t\tgoto fail_invalid_desc;\n\t}\n\n\tidx_base = duk_get_top_index(thr);\n\tif (flags & DUK_DEFPROP_HAVE_SETTER) {\n\t\tduk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED |\n\t\t                                     DUK_TYPE_MASK_OBJECT |\n\t\t                                     DUK_TYPE_MASK_LIGHTFUNC);\n\t\tset = duk_get_hobject_promote_lfunc(thr, idx_base);\n\t\tif (set != NULL && !DUK_HOBJECT_IS_CALLABLE(set)) {\n\t\t\tgoto fail_not_callable;\n\t\t}\n\t\tidx_base--;\n\t} else {\n\t\tset = NULL;\n\t}\n\tif (flags & DUK_DEFPROP_HAVE_GETTER) {\n\t\tduk_require_type_mask(thr, idx_base, DUK_TYPE_MASK_UNDEFINED |\n\t\t                                     DUK_TYPE_MASK_OBJECT |\n\t\t                                     DUK_TYPE_MASK_LIGHTFUNC);\n\t\tget = duk_get_hobject_promote_lfunc(thr, idx_base);\n\t\tif (get != NULL && !DUK_HOBJECT_IS_CALLABLE(get)) {\n\t\t\tgoto fail_not_callable;\n\t\t}\n\t\tidx_base--;\n\t} else {\n\t\tget = NULL;\n\t}\n\tif (flags & DUK_DEFPROP_HAVE_VALUE) {\n\t\tidx_value = idx_base;\n\t\tidx_base--;\n\t} else {\n\t\tidx_value = (duk_idx_t) -1;\n\t}\n\tkey = duk_to_property_key_hstring(thr, idx_base);\n\tDUK_ASSERT(key != NULL);\n\n\tduk_require_valid_index(thr, idx_base);\n\n\tduk_hobject_define_property_helper(thr,\n\t                                   flags /*defprop_flags*/,\n\t                                   obj,\n\t                                   key,\n\t                                   idx_value,\n\t                                   get,\n\t                                   set,\n\t                                   1 /*throw_flag*/);\n\n\t/* Clean up stack */\n\n\tduk_set_top(thr, idx_base);\n\n\t/* [ ... obj ... ] */\n\n\treturn;\n\n fail_invalid_desc:\n\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR);\n\treturn;\n\n fail_not_callable:\n\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE);\n\treturn;\n}\n\n/*\n *  Object related\n *\n *  Note: seal() and freeze() are accessible through Ecmascript bindings,\n *  and are not exposed through the API.\n */\n\nDUK_EXTERNAL void duk_compact(duk_hthread *thr, duk_idx_t obj_idx) {\n\tduk_hobject *obj;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_get_hobject(thr, obj_idx);\n\tif (obj) {\n\t\t/* Note: this may fail, caller should protect the call if necessary */\n\t\tduk_hobject_compact_props(thr, obj);\n\t}\n}\n\nDUK_INTERNAL void duk_compact_m1(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_compact(thr, -1);\n}\n\n/* XXX: the duk_hobject_enum.c stack APIs should be reworked */\n\nDUK_EXTERNAL void duk_enum(duk_hthread *thr, duk_idx_t obj_idx, duk_uint_t enum_flags) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_dup(thr, obj_idx);\n\tduk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\tduk_hobject_enumerator_create(thr, enum_flags);   /* [target] -> [enum] */\n}\n\nDUK_EXTERNAL duk_bool_t duk_next(duk_hthread *thr, duk_idx_t enum_index, duk_bool_t get_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_require_hobject(thr, enum_index);\n\tduk_dup(thr, enum_index);\n\treturn duk_hobject_enumerator_next(thr, get_value);\n}\n\nDUK_INTERNAL void duk_seal_freeze_raw(duk_hthread *thr, duk_idx_t obj_idx, duk_bool_t is_freeze) {\n\tduk_tval *tv;\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, obj_idx);\n\tDUK_ASSERT(tv != NULL);\n\n\t/* Seal/freeze are quite rare in practice so it'd be nice to get the\n\t * correct behavior simply via automatic promotion (at the cost of some\n\t * memory churn).  However, the promoted objects don't behave the same,\n\t * e.g. promoted lightfuncs are extensible.\n\t */\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_BUFFER:\n\t\t/* Plain buffer: already sealed, but not frozen (and can't be frozen\n\t\t * because index properties can't be made non-writable.\n\t\t */\n\t\tif (is_freeze) {\n\t\t\tgoto fail_cannot_freeze;\n\t\t}\n\t\tbreak;\n\tcase DUK_TAG_LIGHTFUNC:\n\t\t/* Lightfunc: already sealed and frozen, success. */\n\t\tbreak;\n\tcase DUK_TAG_OBJECT:\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (is_freeze && DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\t\t/* Buffer objects cannot be frozen because there's no internal\n\t\t\t * support for making virtual array indices non-writable.\n\t\t\t */\n\t\t\tDUK_DD(DUK_DDPRINT(\"cannot freeze a buffer object\"));\n\t\t\tgoto fail_cannot_freeze;\n\t\t}\n\t\tduk_hobject_object_seal_freeze_helper(thr, h, is_freeze);\n\n\t\t/* Sealed and frozen objects cannot gain any more properties,\n\t\t * so this is a good time to compact them.\n\t\t */\n\t\tduk_hobject_compact_props(thr, h);\n\t\tbreak;\n\tdefault:\n\t\t/* ES2015 Sections 19.1.2.5, 19.1.2.17 */\n\t\tbreak;\n\t}\n\treturn;\n\n fail_cannot_freeze:\n\tDUK_ERROR_TYPE_INVALID_ARGS(thr);  /* XXX: proper error message */\n}\n\nDUK_EXTERNAL void duk_seal(duk_hthread *thr, duk_idx_t obj_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_seal_freeze_raw(thr, obj_idx, 0 /*is_freeze*/);\n}\n\nDUK_EXTERNAL void duk_freeze(duk_hthread *thr, duk_idx_t obj_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_seal_freeze_raw(thr, obj_idx, 1 /*is_freeze*/);\n}\n\n/*\n *  Helpers for writing multiple properties\n */\n\nDUK_EXTERNAL void duk_put_function_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_function_list_entry *funcs) {\n\tconst duk_function_list_entry *ent = funcs;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tif (ent != NULL) {\n\t\twhile (ent->key != NULL) {\n\t\t\tduk_push_c_function(thr, ent->value, ent->nargs);\n\t\t\tduk_put_prop_string(thr, obj_idx, ent->key);\n\t\t\tent++;\n\t\t}\n\t}\n}\n\nDUK_EXTERNAL void duk_put_number_list(duk_hthread *thr, duk_idx_t obj_idx, const duk_number_list_entry *numbers) {\n\tconst duk_number_list_entry *ent = numbers;\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj_idx = duk_require_normalize_index(thr, obj_idx);\n\tif (ent != NULL) {\n\t\twhile (ent->key != NULL) {\n\t\t\ttv = thr->valstack_top++;\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));  /* value stack init policy */\n\t\t\tDUK_TVAL_SET_NUMBER_CHKFAST_SLOW(tv, ent->value);  /* no need for decref/incref */\n\t\t\tduk_put_prop_string(thr, obj_idx, ent->key);\n\t\t\tent++;\n\t\t}\n\t}\n}\n\n/*\n *  Shortcut for accessing global object properties\n */\n\nDUK_EXTERNAL duk_bool_t duk_get_global_string(duk_hthread *thr, const char *key) {\n\tduk_bool_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);\n\n\t/* XXX: direct implementation */\n\n\tduk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);\n\tret = duk_get_prop_string(thr, -1, key);\n\tduk_remove_m2(thr);\n\treturn ret;\n}\n\nDUK_EXTERNAL duk_bool_t duk_get_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) {\n\tduk_bool_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);\n\n\t/* XXX: direct implementation */\n\n\tduk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);\n\tret = duk_get_prop_lstring(thr, -1, key, key_len);\n\tduk_remove_m2(thr);\n\treturn ret;\n}\n\nDUK_EXTERNAL duk_bool_t duk_put_global_string(duk_hthread *thr, const char *key) {\n\tduk_bool_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);\n\n\t/* XXX: direct implementation */\n\n\tduk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);\n\tduk_insert(thr, -2);\n\tret = duk_put_prop_string(thr, -2, key);  /* [ ... global val ] -> [ ... global ] */\n\tduk_pop(thr);\n\treturn ret;\n}\n\nDUK_EXTERNAL duk_bool_t duk_put_global_lstring(duk_hthread *thr, const char *key, duk_size_t key_len) {\n\tduk_bool_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);\n\n\t/* XXX: direct implementation */\n\n\tduk_push_hobject(thr, thr->builtins[DUK_BIDX_GLOBAL]);\n\tduk_insert(thr, -2);\n\tret = duk_put_prop_lstring(thr, -2, key, key_len);  /* [ ... global val ] -> [ ... global ] */\n\tduk_pop(thr);\n\treturn ret;\n}\n\n/*\n *  Object prototype\n */\n\nDUK_EXTERNAL void duk_get_prototype(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *obj;\n\tduk_hobject *proto;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_require_hobject(thr, idx);\n\tDUK_ASSERT(obj != NULL);\n\n\t/* XXX: shared helper for duk_push_hobject_or_undefined()? */\n\tproto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, obj);\n\tif (proto) {\n\t\tduk_push_hobject(thr, proto);\n\t} else {\n\t\tduk_push_undefined(thr);\n\t}\n}\n\nDUK_EXTERNAL void duk_set_prototype(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *obj;\n\tduk_hobject *proto;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_require_hobject(thr, idx);\n\tDUK_ASSERT(obj != NULL);\n\tduk_require_type_mask(thr, -1, DUK_TYPE_MASK_UNDEFINED |\n\t                               DUK_TYPE_MASK_OBJECT);\n\tproto = duk_get_hobject(thr, -1);\n\t/* proto can also be NULL here (allowed explicitly) */\n\n#if defined(DUK_USE_ROM_OBJECTS)\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);  /* XXX: \"read only object\"? */\n\t\treturn;\n\t}\n#endif\n\n\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, obj, proto);\n\n\tduk_pop(thr);\n}\n\n/*\n *  Object finalizer\n */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n/* XXX: these could be implemented as macros calling an internal function\n * directly.\n * XXX: same issue as with Duktape.fin: there's no way to delete the property\n * now (just set it to undefined).\n */\nDUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_get_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER);\n}\n\nDUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\tduk_bool_t callable;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_require_hobject(thr, idx);  /* Get before 'put' so that 'idx' is correct. */\n\tcallable = duk_is_callable(thr, -1);\n\tduk_put_prop_stridx(thr, idx, DUK_STRIDX_INT_FINALIZER);\n\n\t/* In addition to setting the finalizer property, keep a \"have\n\t * finalizer\" flag in duk_hobject in sync so that refzero can do\n\t * a very quick finalizer check by walking the prototype chain\n\t * and checking the flag alone.  (Note that this means that just\n\t * setting _Finalizer on an object won't affect finalizer checks.)\n\t *\n\t * NOTE: if the argument is a Proxy object, this flag will be set\n\t * on the Proxy, not the target.  As a result, the target won't get\n\t * a finalizer flag and the Proxy also won't be finalized as there's\n\t * an explicit Proxy check in finalization now.\n\t */\n\tif (callable) {\n\t\tDUK_HOBJECT_SET_HAVE_FINALIZER(h);\n\t} else {\n\t\tDUK_HOBJECT_CLEAR_HAVE_FINALIZER(h);\n\t}\n}\n#else  /* DUK_USE_FINALIZER_SUPPORT */\nDUK_EXTERNAL void duk_get_finalizer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(idx);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n\nDUK_EXTERNAL void duk_set_finalizer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(idx);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n#line 1 \"duk_api_stack.c\"\n/*\n *  API calls related to general value stack manipulation: resizing the value\n *  stack, pushing and popping values, type checking and reading values,\n *  coercing values, etc.\n *\n *  Also contains internal functions (such as duk_get_tval()), defined\n *  in duk_api_internal.h, with semantics similar to the public API.\n */\n\n/* XXX: repetition of stack pre-checks -> helper or macro or inline */\n/* XXX: shared api error strings, and perhaps even throw code for rare cases? */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Forward declarations\n */\n\nDUK_LOCAL_DECL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx);\n\n/*\n *  Global state for working around missing variadic macros\n */\n\n#if !defined(DUK_USE_VARIADIC_MACROS)\nDUK_EXTERNAL const char *duk_api_global_filename = NULL;\nDUK_EXTERNAL duk_int_t duk_api_global_line = 0;\n#endif\n\n/*\n *  Misc helpers\n */\n\nDUK_LOCAL const char * const duk__symbol_type_strings[4] = {\n\t\"hidden\", \"global\", \"local\", \"wellknown\"\n};\n\n#if !defined(DUK_USE_PACKED_TVAL)\nDUK_LOCAL const duk_uint_t duk__type_from_tag[] = {\n\tDUK_TYPE_NUMBER,\n\tDUK_TYPE_NUMBER,  /* fastint */\n\tDUK_TYPE_UNDEFINED,\n\tDUK_TYPE_NULL,\n\tDUK_TYPE_BOOLEAN,\n\tDUK_TYPE_POINTER,\n\tDUK_TYPE_LIGHTFUNC,\n\tDUK_TYPE_NONE,\n\tDUK_TYPE_STRING,\n\tDUK_TYPE_OBJECT,\n\tDUK_TYPE_BUFFER,\n};\nDUK_LOCAL const duk_uint_t duk__type_mask_from_tag[] = {\n\tDUK_TYPE_MASK_NUMBER,\n\tDUK_TYPE_MASK_NUMBER,  /* fastint */\n\tDUK_TYPE_MASK_UNDEFINED,\n\tDUK_TYPE_MASK_NULL,\n\tDUK_TYPE_MASK_BOOLEAN,\n\tDUK_TYPE_MASK_POINTER,\n\tDUK_TYPE_MASK_LIGHTFUNC,\n\tDUK_TYPE_MASK_NONE,\n\tDUK_TYPE_MASK_STRING,\n\tDUK_TYPE_MASK_OBJECT,\n\tDUK_TYPE_MASK_BUFFER,\n};\n#endif  /* !DUK_USE_PACKED_TVAL */\n\n/* Assert that there's room for one value. */\n#define DUK__ASSERT_SPACE() do { \\\n\t\tDUK_ASSERT(!(thr->valstack_top >= thr->valstack_end)); \\\n\t} while (0)\n\n/* Check that there's room to push one value. */\n#if defined(DUK_USE_VALSTACK_UNSAFE)\n/* Faster but value stack overruns are memory unsafe. */\n#define DUK__CHECK_SPACE() DUK__ASSERT_SPACE()\n#else\n#define DUK__CHECK_SPACE() do { \\\n\t\tif (DUK_UNLIKELY(thr->valstack_top >= thr->valstack_end)) { \\\n\t\t\tDUK_ERROR_RANGE_PUSH_BEYOND(thr); \\\n\t\t} \\\n\t} while (0)\n#endif\n\nDUK_LOCAL duk_small_uint_t duk__get_symbol_type(duk_hstring *h) {\n\tconst duk_uint8_t *data;\n\tduk_size_t len;\n\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(DUK_HSTRING_HAS_SYMBOL(h));\n\tDUK_ASSERT(DUK_HSTRING_GET_BYTELEN(h) >= 1);  /* always true, symbol prefix */\n\n\tdata = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);\n\tlen = DUK_HSTRING_GET_BYTELEN(h);\n\tDUK_ASSERT(len >= 1);\n\n\t/* XXX: differentiate between 0x82 and 0xff (hidden vs. internal?)? */\n\n\tif (data[0] == 0xffU) {\n\t\treturn DUK_SYMBOL_TYPE_HIDDEN;\n\t} else if (data[0] == 0x82U) {\n\t\treturn DUK_SYMBOL_TYPE_HIDDEN;\n\t} else if (data[0] == 0x80U) {\n\t\treturn DUK_SYMBOL_TYPE_GLOBAL;\n\t} else if (data[len - 1] != 0xffU) {\n\t\treturn DUK_SYMBOL_TYPE_LOCAL;\n\t} else {\n\t\treturn DUK_SYMBOL_TYPE_WELLKNOWN;\n\t}\n}\n\nDUK_LOCAL const char *duk__get_symbol_type_string(duk_hstring *h) {\n\tduk_small_uint_t idx;\n\tidx = duk__get_symbol_type(h);\n\tDUK_ASSERT(idx < sizeof(duk__symbol_type_strings));\n\treturn duk__symbol_type_strings[idx];\n}\n\nDUK_LOCAL_DECL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag);\n\nDUK_LOCAL duk_int_t duk__api_coerce_d2i(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value, duk_bool_t require) {\n\tduk_tval *tv;\n\tduk_small_int_t c;\n\tduk_double_t d;\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\t/*\n\t *  Special cases like NaN and +/- Infinity are handled explicitly\n\t *  because a plain C coercion from double to int handles these cases\n\t *  in undesirable ways.  For instance, NaN may coerce to INT_MIN\n\t *  (not zero), and INT_MAX + 1 may coerce to INT_MIN (not INT_MAX).\n\t *\n\t *  This double-to-int coercion differs from ToInteger() because it\n\t *  has a finite range (ToInteger() allows e.g. +/- Infinity).  It\n\t *  also differs from ToInt32() because the INT_MIN/INT_MAX clamping\n\t *  depends on the size of the int type on the platform.  In particular,\n\t *  on platforms with a 64-bit int type, the full range is allowed.\n\t */\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\tduk_int64_t t = DUK_TVAL_GET_FASTINT(tv);\n#if (DUK_INT_MAX <= 0x7fffffffL)\n\t\t/* Clamping only necessary for 32-bit ints. */\n\t\tif (t < DUK_INT_MIN) {\n\t\t\tt = DUK_INT_MIN;\n\t\t} else if (t > DUK_INT_MAX) {\n\t\t\tt = DUK_INT_MAX;\n\t\t}\n#endif\n\t\treturn (duk_int_t) t;\n\t}\n#endif\n\n\tif (DUK_TVAL_IS_NUMBER(tv)) {\n\t\td = DUK_TVAL_GET_NUMBER(tv);\n\t\tc = (duk_small_int_t) DUK_FPCLASSIFY(d);\n\t\tif (c == DUK_FP_NAN) {\n\t\t\treturn 0;\n\t\t} else if (d < (duk_double_t) DUK_INT_MIN) {\n\t\t\t/* covers -Infinity */\n\t\t\treturn DUK_INT_MIN;\n\t\t} else if (d > (duk_double_t) DUK_INT_MAX) {\n\t\t\t/* covers +Infinity */\n\t\t\treturn DUK_INT_MAX;\n\t\t} else {\n\t\t\t/* coerce towards zero */\n\t\t\treturn (duk_int_t) d;\n\t\t}\n\t}\n\n\tif (require) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"number\", DUK_STR_NOT_NUMBER);\n\t\t/* not reachable */\n\t}\n\n\treturn def_value;\n}\n\nDUK_LOCAL duk_uint_t duk__api_coerce_d2ui(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value, duk_bool_t require) {\n\tduk_tval *tv;\n\tduk_small_int_t c;\n\tduk_double_t d;\n\n\t/* Same as above but for unsigned int range. */\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\tduk_int64_t t = DUK_TVAL_GET_FASTINT(tv);\n\t\tif (t < 0) {\n\t\t\tt = 0;\n\t\t}\n#if (DUK_UINT_MAX <= 0xffffffffUL)\n\t\t/* Clamping only necessary for 32-bit ints. */\n\t\telse if (t > DUK_UINT_MAX) {\n\t\t\tt = DUK_UINT_MAX;\n\t\t}\n#endif\n\t\treturn (duk_uint_t) t;\n\t}\n#endif\n\n\tif (DUK_TVAL_IS_NUMBER(tv)) {\n\t\td = DUK_TVAL_GET_NUMBER(tv);\n\t\tc = (duk_small_int_t) DUK_FPCLASSIFY(d);\n\t\tif (c == DUK_FP_NAN) {\n\t\t\treturn 0;\n\t\t} else if (d < 0.0) {\n\t\t\t/* covers -Infinity */\n\t\t\treturn (duk_uint_t) 0;\n\t\t} else if (d > (duk_double_t) DUK_UINT_MAX) {\n\t\t\t/* covers +Infinity */\n\t\t\treturn (duk_uint_t) DUK_UINT_MAX;\n\t\t} else {\n\t\t\t/* coerce towards zero */\n\t\t\treturn (duk_uint_t) d;\n\t\t}\n\t}\n\n\tif (require) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"number\", DUK_STR_NOT_NUMBER);\n\t\t/* not reachable */\n\t}\n\n\treturn def_value;\n}\n\n/*\n *  Stack index validation/normalization and getting a stack duk_tval ptr.\n *\n *  These are called by many API entrypoints so the implementations must be\n *  fast and \"inlined\".\n *\n *  There's some repetition because of this; keep the functions in sync.\n */\n\nDUK_EXTERNAL duk_idx_t duk_normalize_index(duk_hthread *thr, duk_idx_t idx) {\n\tduk_uidx_t vs_size;\n\tduk_uidx_t uidx;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_INVALID_INDEX < 0);\n\n\t/* Care must be taken to avoid pointer wrapping in the index\n\t * validation.  For instance, on a 32-bit platform with 8-byte\n\t * duk_tval the index 0x20000000UL would wrap the memory space\n\t * once.\n\t */\n\n\t/* Assume value stack sizes (in elements) fits into duk_idx_t. */\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tvs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);\n\tDUK_ASSERT_DISABLE(vs_size >= 0);  /* unsigned */\n\n\tif (idx < 0) {\n\t\tuidx = vs_size + (duk_uidx_t) idx;\n\t} else {\n\t\t/* since index non-negative */\n\t\tDUK_ASSERT(idx != DUK_INVALID_INDEX);\n\t\tuidx = (duk_uidx_t) idx;\n\t}\n\n\t/* DUK_INVALID_INDEX won't be accepted as a valid index. */\n\tDUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);\n\n\tif (DUK_LIKELY(uidx < vs_size)) {\n\t\treturn (duk_idx_t) uidx;\n\t}\n\treturn DUK_INVALID_INDEX;\n}\n\nDUK_EXTERNAL duk_idx_t duk_require_normalize_index(duk_hthread *thr, duk_idx_t idx) {\n\tduk_uidx_t vs_size;\n\tduk_uidx_t uidx;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_INVALID_INDEX < 0);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tvs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);\n\tDUK_ASSERT_DISABLE(vs_size >= 0);  /* unsigned */\n\n\tif (idx < 0) {\n\t\tuidx = vs_size + (duk_uidx_t) idx;\n\t} else {\n\t\tDUK_ASSERT(idx != DUK_INVALID_INDEX);\n\t\tuidx = (duk_uidx_t) idx;\n\t}\n\n\t/* DUK_INVALID_INDEX won't be accepted as a valid index. */\n\tDUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);\n\n\tif (DUK_LIKELY(uidx < vs_size)) {\n\t\treturn (duk_idx_t) uidx;\n\t}\n\tDUK_ERROR_RANGE_INDEX(thr, idx);\n\treturn 0;  /* unreachable */\n}\n\nDUK_INTERNAL duk_tval *duk_get_tval(duk_hthread *thr, duk_idx_t idx) {\n\tduk_uidx_t vs_size;\n\tduk_uidx_t uidx;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_INVALID_INDEX < 0);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tvs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);\n\tDUK_ASSERT_DISABLE(vs_size >= 0);  /* unsigned */\n\n\tif (idx < 0) {\n\t\tuidx = vs_size + (duk_uidx_t) idx;\n\t} else {\n\t\tDUK_ASSERT(idx != DUK_INVALID_INDEX);\n\t\tuidx = (duk_uidx_t) idx;\n\t}\n\n\t/* DUK_INVALID_INDEX won't be accepted as a valid index. */\n\tDUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);\n\n\tif (DUK_LIKELY(uidx < vs_size)) {\n\t\treturn thr->valstack_bottom + uidx;\n\t}\n\treturn NULL;\n}\n\n/* Variant of duk_get_tval() which is guaranteed to return a valid duk_tval\n * pointer.  When duk_get_tval() would return NULL, this variant returns a\n * pointer to a duk_tval with tag DUK_TAG_UNUSED.  This allows the call site\n * to avoid an unnecessary NULL check which sometimes leads to better code.\n * The return duk_tval is read only (at least for the UNUSED value).\n */\nDUK_LOCAL const duk_tval_unused duk__const_tval_unused = DUK_TVAL_UNUSED_INITIALIZER();\n\nDUK_INTERNAL duk_tval *duk_get_tval_or_unused(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval(thr, idx);\n\tif (tv != NULL) {\n\t\treturn tv;\n\t}\n\treturn (duk_tval *) DUK_LOSE_CONST(&duk__const_tval_unused);\n}\n\nDUK_INTERNAL duk_tval *duk_require_tval(duk_hthread *thr, duk_idx_t idx) {\n\tduk_uidx_t vs_size;\n\tduk_uidx_t uidx;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_INVALID_INDEX < 0);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tvs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);\n\tDUK_ASSERT_DISABLE(vs_size >= 0);  /* unsigned */\n\n\t/* Use unsigned arithmetic to optimize comparison. */\n\tif (idx < 0) {\n\t\tuidx = vs_size + (duk_uidx_t) idx;\n\t} else {\n\t\tDUK_ASSERT(idx != DUK_INVALID_INDEX);\n\t\tuidx = (duk_uidx_t) idx;\n\t}\n\n\t/* DUK_INVALID_INDEX won't be accepted as a valid index. */\n\tDUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);\n\n\tif (DUK_LIKELY(uidx < vs_size)) {\n\t\treturn thr->valstack_bottom + uidx;\n\t}\n\tDUK_ERROR_RANGE_INDEX(thr, idx);\n\treturn NULL;\n}\n\n/* Non-critical. */\nDUK_EXTERNAL duk_bool_t duk_is_valid_index(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_INVALID_INDEX < 0);\n\n\treturn (duk_normalize_index(thr, idx) >= 0);\n}\n\n/* Non-critical. */\nDUK_EXTERNAL void duk_require_valid_index(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_INVALID_INDEX < 0);\n\n\tif (DUK_UNLIKELY(duk_normalize_index(thr, idx) < 0)) {\n\t\tDUK_ERROR_RANGE_INDEX(thr, idx);\n\t\treturn;  /* unreachable */\n\t}\n}\n\n/*\n *  Value stack top handling\n */\n\nDUK_EXTERNAL duk_idx_t duk_get_top(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n}\n\n/* Internal helper to get current top but to require a minimum top value\n * (TypeError if not met).\n */\nDUK_INTERNAL duk_idx_t duk_get_top_require_min(duk_hthread *thr, duk_idx_t min_top) {\n\tduk_idx_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n\tif (DUK_UNLIKELY(ret < min_top)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\treturn ret;\n}\n\n/* Set stack top within currently allocated range, but don't reallocate.\n * This is performance critical especially for call handling, so whenever\n * changing, profile and look at generated code.\n */\nDUK_EXTERNAL void duk_set_top(duk_hthread *thr, duk_idx_t idx) {\n\tduk_uidx_t vs_size;\n\tduk_uidx_t vs_limit;\n\tduk_uidx_t uidx;\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_INVALID_INDEX < 0);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_bottom);\n\tvs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);\n\tvs_limit = (duk_uidx_t) (thr->valstack_end - thr->valstack_bottom);\n\n\tif (idx < 0) {\n\t\t/* Negative indices are always within allocated stack but\n\t\t * must not go below zero index.\n\t\t */\n\t\tuidx = vs_size + (duk_uidx_t) idx;\n\t} else {\n\t\t/* Positive index can be higher than valstack top but must\n\t\t * not go above allocated stack (equality is OK).\n\t\t */\n\t\tuidx = (duk_uidx_t) idx;\n\t}\n\n\t/* DUK_INVALID_INDEX won't be accepted as a valid index. */\n\tDUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_size);\n\tDUK_ASSERT(vs_size + (duk_uidx_t) DUK_INVALID_INDEX >= vs_limit);\n\n#if defined(DUK_USE_VALSTACK_UNSAFE)\n\tDUK_ASSERT(uidx <= vs_limit);\n\tDUK_UNREF(vs_limit);\n#else\n\tif (DUK_UNLIKELY(uidx > vs_limit)) {\n\t\tDUK_ERROR_RANGE_INDEX(thr, idx);\n\t\treturn;  /* unreachable */\n\t}\n#endif\n\tDUK_ASSERT(uidx <= vs_limit);\n\n\t/* Handle change in value stack top.  Respect value stack\n\t * initialization policy: 'undefined' above top.  Note that\n\t * DECREF may cause a side effect that reallocates valstack,\n\t * so must relookup after DECREF.\n\t */\n\n\tif (uidx >= vs_size) {\n\t\t/* Stack size increases or stays the same. */\n#if defined(DUK_USE_ASSERTIONS)\n\t\tduk_uidx_t count;\n\n\t\tcount = uidx - vs_size;\n\t\twhile (count != 0) {\n\t\t\tcount--;\n\t\t\ttv = thr->valstack_top + count;\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));\n\t\t}\n#endif\n\t\tthr->valstack_top = thr->valstack_bottom + uidx;\n\t} else {\n\t\t/* Stack size decreases. */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\tduk_uidx_t count;\n\t\tduk_tval *tv_end;\n\n\t\tcount = vs_size - uidx;\n\t\tDUK_ASSERT(count > 0);\n\t\ttv = thr->valstack_top;\n\t\ttv_end = tv - count;\n\t\tDUK_ASSERT(tv > tv_end);  /* Because count > 0. */\n\t\tdo {\n\t\t\ttv--;\n\t\t\tDUK_ASSERT(tv >= thr->valstack_bottom);\n\t\t\tDUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);\n\t\t} while (tv != tv_end);\n\t\tthr->valstack_top = tv_end;\n\t\tDUK_REFZERO_CHECK_FAST(thr);\n#else  /* DUK_USE_REFERENCE_COUNTING */\n\t\tduk_uidx_t count;\n\t\tduk_tval *tv_end;\n\n\t\tcount = vs_size - uidx;\n\t\ttv = thr->valstack_top;\n\t\ttv_end = tv - count;\n\t\tDUK_ASSERT(tv > tv_end);\n\t\tdo {\n\t\t\ttv--;\n\t\t\tDUK_TVAL_SET_UNDEFINED(tv);\n\t\t} while (tv != tv_end);\n\t\tthr->valstack_top = tv_end;\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\t}\n}\n\n/* Internal variant with a non-negative index and no runtime size checks. */\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_set_top(thr, idx);\n}\n#else  /* DUK_USE_PREFER_SIZE */\nDUK_INTERNAL void duk_set_top_unsafe(duk_hthread *thr, duk_idx_t idx) {\n\tduk_uidx_t uidx;\n\tduk_uidx_t vs_size;\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_bottom);\n\tDUK_ASSERT(idx >= 0);\n\tDUK_ASSERT(idx <= (duk_idx_t) (thr->valstack_end - thr->valstack_bottom));\n\n\t/* XXX: byte arithmetic */\n\tuidx = (duk_uidx_t) idx;\n\tvs_size = (duk_uidx_t) (thr->valstack_top - thr->valstack_bottom);\n\n\tif (uidx >= vs_size) {\n\t\t/* Stack size increases or stays the same. */\n#if defined(DUK_USE_ASSERTIONS)\n\t\tduk_uidx_t count;\n\n\t\tcount = uidx - vs_size;\n\t\twhile (count != 0) {\n\t\t\tcount--;\n\t\t\ttv = thr->valstack_top + count;\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));\n\t\t}\n#endif\n\t\tthr->valstack_top = thr->valstack_bottom + uidx;\n\t} else {\n\t\t/* Stack size decreases. */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\tduk_uidx_t count;\n\t\tduk_tval *tv_end;\n\n\t\tcount = vs_size - uidx;\n\t\tDUK_ASSERT(count > 0);\n\t\ttv = thr->valstack_top;\n\t\ttv_end = tv - count;\n\t\tDUK_ASSERT(tv > tv_end);  /* Because count > 0. */\n\t\tdo {\n\t\t\ttv--;\n\t\t\tDUK_ASSERT(tv >= thr->valstack_bottom);\n\t\t\tDUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);\n\t\t} while (tv != tv_end);\n\t\tthr->valstack_top = tv_end;\n\t\tDUK_REFZERO_CHECK_FAST(thr);\n#else  /* DUK_USE_REFERENCE_COUNTING */\n\t\tduk_uidx_t count;\n\t\tduk_tval *tv_end;\n\n\t\tcount = vs_size - uidx;\n\t\ttv = thr->valstack_top;\n\t\ttv_end = tv - count;\n\t\tDUK_ASSERT(tv > tv_end);\n\t\tdo {\n\t\t\ttv--;\n\t\t\tDUK_TVAL_SET_UNDEFINED(tv);\n\t\t} while (tv != tv_end);\n\t\tthr->valstack_top = tv_end;\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\t}\n}\n#endif  /* DUK_USE_PREFER_SIZE */\n\n/* Internal helper: set top to 'top', and set [idx_wipe_start,top[ to\n * 'undefined' (doing nothing if idx_wipe_start == top).  Indices are\n * positive and within value stack reserve.  This is used by call handling.\n */\nDUK_INTERNAL void duk_set_top_and_wipe(duk_hthread *thr, duk_idx_t top, duk_idx_t idx_wipe_start) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(top >= 0);\n\tDUK_ASSERT(idx_wipe_start >= 0);\n\tDUK_ASSERT(idx_wipe_start <= top);\n\tDUK_ASSERT(thr->valstack_bottom + top <= thr->valstack_end);\n\tDUK_ASSERT(thr->valstack_bottom + idx_wipe_start <= thr->valstack_end);\n\n\tduk_set_top_unsafe(thr, idx_wipe_start);\n\tduk_set_top_unsafe(thr, top);\n}\n\nDUK_EXTERNAL duk_idx_t duk_get_top_index(duk_hthread *thr) {\n\tduk_idx_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1;\n\tif (DUK_UNLIKELY(ret < 0)) {\n\t\t/* Return invalid index; if caller uses this without checking\n\t\t * in another API call, the index won't map to a valid stack\n\t\t * entry.\n\t\t */\n\t\treturn DUK_INVALID_INDEX;\n\t}\n\treturn ret;\n}\n\n/* Internal variant: call assumes there is at least one element on the value\n * stack frame; this is only asserted for.\n */\nDUK_INTERNAL duk_idx_t duk_get_top_index_unsafe(duk_hthread *thr) {\n\tduk_idx_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1;\n\treturn ret;\n}\n\nDUK_EXTERNAL duk_idx_t duk_require_top_index(duk_hthread *thr) {\n\tduk_idx_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom) - 1;\n\tif (DUK_UNLIKELY(ret < 0)) {\n\t\tDUK_ERROR_RANGE_INDEX(thr, -1);\n\t\treturn 0;  /* unreachable */\n\t}\n\treturn ret;\n}\n\n/*\n *  Value stack resizing.\n *\n *  This resizing happens above the current \"top\": the value stack can be\n *  grown or shrunk, but the \"top\" is not affected.  The value stack cannot\n *  be resized to a size below the current reserve.\n *\n *  The low level reallocation primitive must carefully recompute all value\n *  stack pointers, and must also work if ALL pointers are NULL.  The resize\n *  is quite tricky because the valstack realloc may cause a mark-and-sweep,\n *  which may run finalizers.  Running finalizers may resize the valstack\n *  recursively (the same value stack we're working on).  So, after realloc\n *  returns, we know that the valstack bottom, top, and reserve should still\n *  be the same (there should not be live values above the \"top\"), but its\n *  underlying size, alloc_end, and base pointer may have changed.\n *\n *  'new_size' is known to be <= DUK_USE_VALSTACK_LIMIT, which ensures that\n *  size_t and pointer arithmetic won't wrap in duk__resize_valstack().\n */\n\n/* Low level valstack resize primitive, used for both grow and shrink.  All\n * adjustments for slack etc have already been done.  Doesn't throw but does\n * have allocation side effects.\n */\nDUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__resize_valstack(duk_hthread *thr, duk_size_t new_size) {\n\tduk_tval *pre_valstack;\n\tduk_tval *pre_bottom;\n\tduk_tval *pre_top;\n\tduk_tval *pre_end;\n\tduk_tval *pre_alloc_end;\n\tduk_ptrdiff_t ptr_diff;\n\tduk_tval *new_valstack;\n\tduk_size_t new_alloc_size;\n\tduk_tval *tv_prev_alloc_end;\n\tduk_tval *p;\n\n\tDUK_ASSERT_HTHREAD_VALID(thr);\n\tDUK_ASSERT(thr->valstack_bottom >= thr->valstack);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_top);\n\tDUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) <= new_size);  /* can't resize below 'top' */\n\tDUK_ASSERT(new_size <= DUK_USE_VALSTACK_LIMIT);  /* valstack limit caller has check, prevents wrapping */\n\tDUK_ASSERT(new_size <= DUK_SIZE_MAX / sizeof(duk_tval));  /* specific assert for wrapping */\n\n\t/* Pre-realloc pointer copies for asserts and debug logs. */\n\tpre_valstack = thr->valstack;\n\tpre_bottom = thr->valstack_bottom;\n\tpre_top = thr->valstack_top;\n\tpre_end = thr->valstack_end;\n\tpre_alloc_end = thr->valstack_alloc_end;\n\n\tDUK_UNREF(pre_valstack);\n\tDUK_UNREF(pre_bottom);\n\tDUK_UNREF(pre_top);\n\tDUK_UNREF(pre_end);\n\tDUK_UNREF(pre_alloc_end);\n\n\t/* If finalizer torture enabled, force base pointer change every time\n\t * when it would be allowed.\n\t */\n#if defined(DUK_USE_FINALIZER_TORTURE)\n\tif (thr->heap->pf_prevent_count == 0) {\n\t\tduk_hthread_valstack_torture_realloc(thr);\n\t}\n#endif\n\n\t/* Allocate a new valstack using DUK_REALLOC_DIRECT() to deal with\n\t * a side effect changing the base pointer.\n\t */\n\tnew_alloc_size = sizeof(duk_tval) * new_size;\n\tnew_valstack = (duk_tval *) DUK_REALLOC_INDIRECT(thr->heap, duk_hthread_get_valstack_ptr, (void *) thr, new_alloc_size);\n\tif (DUK_UNLIKELY(new_valstack == NULL)) {\n\t\t/* Because new_size != 0, if condition doesn't need to be\n\t\t * (new_valstack != NULL || new_size == 0).\n\t\t */\n\t\tDUK_ASSERT(new_size != 0);\n\t\tDUK_D(DUK_DPRINT(\"failed to resize valstack to %lu entries (%lu bytes)\",\n\t\t                 (unsigned long) new_size, (unsigned long) new_alloc_size));\n\t\treturn 0;\n\t}\n\n\t/* Debug log any changes in pointer(s) by side effects.  These don't\n\t * necessarily imply any incorrect behavior, but should be rare in\n\t * practice.\n\t */\n#if defined(DUK_USE_DEBUG)\n\tif (thr->valstack != pre_valstack) {\n\t\tDUK_D(DUK_DPRINT(\"valstack base pointer changed during valstack resize: %p -> %p\",\n\t\t                 (void *) pre_valstack, (void *) thr->valstack));\n\t}\n\tif (thr->valstack_bottom != pre_bottom) {\n\t\tDUK_D(DUK_DPRINT(\"valstack bottom pointer changed during valstack resize: %p -> %p\",\n\t\t                 (void *) pre_bottom, (void *) thr->valstack_bottom));\n\t}\n\tif (thr->valstack_top != pre_top) {\n\t\tDUK_D(DUK_DPRINT(\"valstack top pointer changed during valstack resize: %p -> %p\",\n\t\t                 (void *) pre_top, (void *) thr->valstack_top));\n\t}\n\tif (thr->valstack_end != pre_end) {\n\t\tDUK_D(DUK_DPRINT(\"valstack end pointer changed during valstack resize: %p -> %p\",\n\t\t                 (void *) pre_end, (void *) thr->valstack_end));\n\t}\n\tif (thr->valstack_alloc_end != pre_alloc_end) {\n\t\tDUK_D(DUK_DPRINT(\"valstack alloc_end pointer changed during valstack resize: %p -> %p\",\n\t\t                 (void *) pre_alloc_end, (void *) thr->valstack_alloc_end));\n\t}\n#endif\n\n\t/* Assertions: offsets for bottom, top, and end (reserve) must not\n\t * have changed even with side effects because they are always\n\t * restored in unwind.  For alloc_end there's no guarantee: it may\n\t * have grown or shrunk (but remain above 'end').\n\t */\n\tDUK_ASSERT(thr->valstack_bottom - thr->valstack == pre_bottom - pre_valstack);\n\tDUK_ASSERT(thr->valstack_top - thr->valstack == pre_top - pre_valstack);\n\tDUK_ASSERT(thr->valstack_end - thr->valstack == pre_end - pre_valstack);\n\tDUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);\n\n\t/* Write new pointers.  Most pointers can be handled as a pointer\n\t * difference.\n\t */\n\tptr_diff = (duk_ptrdiff_t) ((duk_uint8_t *) new_valstack - (duk_uint8_t *) thr->valstack);\n\ttv_prev_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_alloc_end + ptr_diff);\n\tthr->valstack = new_valstack;\n\tthr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + ptr_diff);\n\tthr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + ptr_diff);\n\tthr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_end + ptr_diff);\n\tthr->valstack_alloc_end = (duk_tval *) (void *) ((duk_uint8_t *) new_valstack + new_alloc_size);\n\n\t/* Assertions: pointer sanity after pointer updates. */\n\tDUK_ASSERT(thr->valstack_bottom >= thr->valstack);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_top);\n\tDUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);\n\n\tDUK_D(DUK_DPRINT(\"resized valstack %lu -> %lu elements (%lu -> %lu bytes): \"\n\t                 \"base=%p -> %p, bottom=%p -> %p (%ld), top=%p -> %p (%ld), \"\n\t                 \"end=%p -> %p (%ld), alloc_end=%p -> %p (%ld);\"\n\t                 \" tv_prev_alloc_end=%p (-> %ld inits; <0 means shrink)\",\n\t                 (unsigned long) (pre_alloc_end - pre_valstack),\n\t                 (unsigned long) new_size,\n\t                 (unsigned long) ((duk_uint8_t *) pre_alloc_end - (duk_uint8_t *) pre_valstack),\n\t                 (unsigned long) new_alloc_size,\n\t                 (void *) pre_valstack, (void *) thr->valstack,\n\t                 (void *) pre_bottom, (void *) thr->valstack_bottom, (long) (thr->valstack_bottom - thr->valstack),\n\t                 (void *) pre_top, (void *) thr->valstack_top, (long) (thr->valstack_top - thr->valstack),\n\t                 (void *) pre_end, (void *) thr->valstack_end, (long) (thr->valstack_end - thr->valstack),\n\t                 (void *) pre_alloc_end, (void *) thr->valstack_alloc_end, (long) (thr->valstack_alloc_end - thr->valstack),\n\t                 (void *) tv_prev_alloc_end, (long) (thr->valstack_alloc_end - tv_prev_alloc_end)));\n\n\t/* If allocation grew, init any new slots to 'undefined'. */\n\tp = tv_prev_alloc_end;\n\twhile (p < thr->valstack_alloc_end) {\n\t\t/* Never executed if new size is smaller. */\n\t\tDUK_TVAL_SET_UNDEFINED(p);\n\t\tp++;\n\t}\n\n\t/* Assert for value stack initialization policy. */\n#if defined(DUK_USE_ASSERTIONS)\n\tp = thr->valstack_top;\n\twhile (p < thr->valstack_alloc_end) {\n\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(p));\n\t\tp++;\n\t}\n#endif\n\n\treturn 1;\n}\n\nDUK_LOCAL DUK_COLD DUK_NOINLINE duk_bool_t duk__valstack_grow(duk_hthread *thr, duk_size_t min_bytes, duk_bool_t throw_on_error) {\n\tduk_size_t min_size;\n\tduk_size_t new_size;\n\n\tDUK_ASSERT(min_bytes / sizeof(duk_tval) * sizeof(duk_tval) == min_bytes);\n\tmin_size = min_bytes / sizeof(duk_tval);  /* from bytes to slots */\n\n#if defined(DUK_USE_VALSTACK_GROW_SHIFT)\n\t/* New size is minimum size plus a proportional slack, e.g. shift of\n\t * 2 means a 25% slack.\n\t */\n\tnew_size = min_size + (min_size >> DUK_USE_VALSTACK_GROW_SHIFT);\n#else\n\t/* New size is tight with no slack.  This is sometimes preferred in\n\t * low memory environments.\n\t */\n\tnew_size = min_size;\n#endif\n\n\tif (DUK_UNLIKELY(new_size > DUK_USE_VALSTACK_LIMIT || new_size < min_size /*wrap*/)) {\n\t\t/* Note: may be triggered even if minimal new_size would not reach the limit,\n\t\t * plan limit accordingly.\n\t\t */\n\t\tif (throw_on_error) {\n\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_VALSTACK_LIMIT);\n\t\t}\n\t\treturn 0;\n\t}\n\n\tif (duk__resize_valstack(thr, new_size) == 0) {\n\t\tif (throw_on_error) {\n\t\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t\t}\n\t\treturn 0;\n\t}\n\n\tthr->valstack_end = thr->valstack + min_size;\n\tDUK_ASSERT(thr->valstack_alloc_end >= thr->valstack_end);\n\n\treturn 1;\n}\n\n/* Hot, inlined value stack grow check.  Because value stack almost never\n * grows, the actual resize call is in a NOINLINE helper.\n */\nDUK_INTERNAL DUK_INLINE void duk_valstack_grow_check_throw(duk_hthread *thr, duk_size_t min_bytes) {\n\tduk_tval *tv;\n\n\ttv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes);\n\tif (DUK_LIKELY(thr->valstack_end >= tv)) {\n\t\treturn;\n\t}\n\tif (DUK_LIKELY(thr->valstack_alloc_end >= tv)) {\n\t\t/* Values in [valstack_top,valstack_alloc_end[ are initialized\n\t\t * to 'undefined' so we can just move the end pointer.\n\t\t */\n\t\tthr->valstack_end = tv;\n\t\treturn;\n\t}\n\t(void) duk__valstack_grow(thr, min_bytes, 1 /*throw_on_error*/);\n}\n\n/* Hot, inlined value stack grow check which doesn't throw. */\nDUK_INTERNAL DUK_INLINE duk_bool_t duk_valstack_grow_check_nothrow(duk_hthread *thr, duk_size_t min_bytes) {\n\tduk_tval *tv;\n\n\ttv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + min_bytes);\n\tif (DUK_LIKELY(thr->valstack_end >= tv)) {\n\t\treturn 1;\n\t}\n\tif (DUK_LIKELY(thr->valstack_alloc_end >= tv)) {\n\t\tthr->valstack_end = tv;\n\t\treturn 1;\n\t}\n\treturn duk__valstack_grow(thr, min_bytes, 0 /*throw_on_error*/);\n}\n\n/* Value stack shrink check, called from mark-and-sweep. */\nDUK_INTERNAL void duk_valstack_shrink_check_nothrow(duk_hthread *thr, duk_bool_t snug) {\n\tduk_size_t alloc_bytes;\n\tduk_size_t reserve_bytes;\n\tduk_size_t shrink_bytes;\n\n\talloc_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack);\n\treserve_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);\n\tDUK_ASSERT(alloc_bytes >= reserve_bytes);\n\n\t/* We're free to shrink the value stack allocation down to\n\t * reserve_bytes but not more.  If 'snug' (emergency GC)\n\t * shrink whatever we can.  Otherwise only shrink if the new\n\t * size would be considerably smaller.\n\t */\n\n#if defined(DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT)\n\tif (snug) {\n\t\tshrink_bytes = reserve_bytes;\n\t} else {\n\t\tduk_size_t proportion, slack;\n\n\t\t/* Require that value stack shrinks by at least X% of its\n\t\t * current size.  For example, shift of 2 means at least\n\t\t * 25%.  The proportion is computed as bytes and may not\n\t\t * be a multiple of sizeof(duk_tval); that's OK here.\n\t\t */\n\t\tproportion = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT;\n\t\tif (alloc_bytes - reserve_bytes < proportion) {\n\t\t\t/* Too little would be freed, do nothing. */\n\t\t\treturn;\n\t\t}\n\n\t\t/* Keep a slack after shrinking.  The slack is again a\n\t\t * proportion of the current size (the proportion should\n\t\t * of course be smaller than the check proportion above).\n\t\t */\n#if defined(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT)\n\t\tDUK_ASSERT(DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT > DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT);\n\t\tslack = alloc_bytes >> DUK_USE_VALSTACK_SHRINK_SLACK_SHIFT;\n#else\n\t\tslack = 0;\n#endif\n\t\tshrink_bytes = reserve_bytes +\n\t\t               slack / sizeof(duk_tval) * sizeof(duk_tval);  /* multiple of duk_tval */\n\t}\n#else  /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */\n\t/* Always snug, useful in some low memory environments. */\n\tDUK_UNREF(snug);\n\tshrink_bytes = reserve_bytes;\n#endif  /* DUK_USE_VALSTACK_SHRINK_CHECK_SHIFT */\n\n\tDUK_D(DUK_DPRINT(\"valstack shrink check: alloc_bytes=%ld, reserve_bytes=%ld, shrink_bytes=%ld (unvalidated)\",\n\t                 (long) alloc_bytes, (long) reserve_bytes, (long) shrink_bytes));\n\tDUK_ASSERT(shrink_bytes >= reserve_bytes);\n\tif (shrink_bytes >= alloc_bytes) {\n\t\t/* Skip if shrink target is same as current one (or higher,\n\t\t * though that shouldn't happen in practice).\n\t\t */\n\t\treturn;\n\t}\n\tDUK_ASSERT(shrink_bytes / sizeof(duk_tval) * sizeof(duk_tval) == shrink_bytes);\n\n\tDUK_D(DUK_DPRINT(\"valstack shrink check: decided to shrink, snug: %ld\", (long) snug));\n\n\tduk__resize_valstack(thr, shrink_bytes / sizeof(duk_tval));\n}\n\nDUK_EXTERNAL duk_bool_t duk_check_stack(duk_hthread *thr, duk_idx_t extra) {\n\tduk_size_t min_new_bytes;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr != NULL);\n\n\tif (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) {\n\t\tif (extra < 0) {\n\t\t\t/* Clamping to zero makes the API more robust to calling code\n\t\t\t * calculation errors.\n\t\t\t */\n\t\t\textra = 0;\n\t\t} else {\n\t\t\t/* Cause grow check to fail without wrapping arithmetic. */\n\t\t\textra = DUK_USE_VALSTACK_LIMIT;\n\t\t}\n\t}\n\n\tmin_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) +\n\t                sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA);\n\treturn duk_valstack_grow_check_nothrow(thr, min_new_bytes);\n}\n\nDUK_EXTERNAL void duk_require_stack(duk_hthread *thr, duk_idx_t extra) {\n\tduk_size_t min_new_bytes;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr != NULL);\n\n\tif (DUK_UNLIKELY(extra < 0 || extra > DUK_USE_VALSTACK_LIMIT)) {\n\t\tif (extra < 0) {\n\t\t\t/* Clamping to zero makes the API more robust to calling code\n\t\t\t * calculation errors.\n\t\t\t */\n\t\t\textra = 0;\n\t\t} else {\n\t\t\t/* Cause grow check to fail without wrapping arithmetic. */\n\t\t\textra = DUK_USE_VALSTACK_LIMIT;\n\t\t}\n\t}\n\n\tmin_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack) +\n\t                sizeof(duk_tval) * ((duk_size_t) extra + DUK_VALSTACK_INTERNAL_EXTRA);\n\tduk_valstack_grow_check_throw(thr, min_new_bytes);\n}\n\nDUK_EXTERNAL duk_bool_t duk_check_stack_top(duk_hthread *thr, duk_idx_t top) {\n\tduk_size_t min_new_bytes;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) {\n\t\tif (top < 0) {\n\t\t\t/* Clamping to zero makes the API more robust to calling code\n\t\t\t * calculation errors.\n\t\t\t */\n\t\t\ttop = 0;\n\t\t} else {\n\t\t\t/* Cause grow check to fail without wrapping arithmetic. */\n\t\t\ttop = DUK_USE_VALSTACK_LIMIT;\n\t\t}\n\t}\n\n\tDUK_ASSERT(top >= 0);\n\tmin_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) +\n\t                sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA);\n\treturn duk_valstack_grow_check_nothrow(thr, min_new_bytes);\n}\n\nDUK_EXTERNAL void duk_require_stack_top(duk_hthread *thr, duk_idx_t top) {\n\tduk_size_t min_new_bytes;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (DUK_UNLIKELY(top < 0 || top > DUK_USE_VALSTACK_LIMIT)) {\n\t\tif (top < 0) {\n\t\t\t/* Clamping to zero makes the API more robust to calling code\n\t\t\t * calculation errors.\n\t\t\t */\n\t\t\ttop = 0;\n\t\t} else {\n\t\t\t/* Cause grow check to fail without wrapping arithmetic. */\n\t\t\ttop = DUK_USE_VALSTACK_LIMIT;\n\t\t}\n\t}\n\n\tDUK_ASSERT(top >= 0);\n\tmin_new_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) +\n\t                sizeof(duk_tval) * ((duk_size_t) top + DUK_VALSTACK_INTERNAL_EXTRA);\n\tduk_valstack_grow_check_throw(thr, min_new_bytes);\n}\n\n/*\n *  Basic stack manipulation: swap, dup, insert, replace, etc\n */\n\nDUK_EXTERNAL void duk_swap(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {\n\tduk_tval *tv1;\n\tduk_tval *tv2;\n\tduk_tval tv_tmp;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv1 = duk_require_tval(thr, idx1);\n\tDUK_ASSERT(tv1 != NULL);\n\ttv2 = duk_require_tval(thr, idx2);\n\tDUK_ASSERT(tv2 != NULL);\n\n\t/* If tv1==tv2 this is a NOP, no check is needed */\n\tDUK_TVAL_SET_TVAL(&tv_tmp, tv1);\n\tDUK_TVAL_SET_TVAL(tv1, tv2);\n\tDUK_TVAL_SET_TVAL(tv2, &tv_tmp);\n}\n\nDUK_EXTERNAL void duk_swap_top(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_swap(thr, idx, -1);\n}\n\nDUK_EXTERNAL void duk_dup(duk_hthread *thr, duk_idx_t from_idx) {\n\tduk_tval *tv_from;\n\tduk_tval *tv_to;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\n\ttv_from = duk_require_tval(thr, from_idx);\n\ttv_to = thr->valstack_top++;\n\tDUK_ASSERT(tv_from != NULL);\n\tDUK_ASSERT(tv_to != NULL);\n\tDUK_TVAL_SET_TVAL(tv_to, tv_from);\n\tDUK_TVAL_INCREF(thr, tv_to);  /* no side effects */\n}\n\nDUK_EXTERNAL void duk_dup_top(duk_hthread *thr) {\n#if defined(DUK_USE_PREFER_SIZE)\n\tduk_dup(thr, -1);\n#else\n\tduk_tval *tv_from;\n\tduk_tval *tv_to;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\n\tif (DUK_UNLIKELY(thr->valstack_top - thr->valstack_bottom <= 0)) {\n\t\tDUK_ERROR_RANGE_INDEX(thr, -1);\n\t\treturn;  /* unreachable */\n\t}\n\ttv_from = thr->valstack_top - 1;\n\ttv_to = thr->valstack_top++;\n\tDUK_ASSERT(tv_from != NULL);\n\tDUK_ASSERT(tv_to != NULL);\n\tDUK_TVAL_SET_TVAL(tv_to, tv_from);\n\tDUK_TVAL_INCREF(thr, tv_to);  /* no side effects */\n#endif\n}\n\nDUK_INTERNAL void duk_dup_0(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_dup(thr, 0);\n}\nDUK_INTERNAL void duk_dup_1(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_dup(thr, 1);\n}\nDUK_INTERNAL void duk_dup_2(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_dup(thr, 2);\n}\nDUK_INTERNAL void duk_dup_m2(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_dup(thr, -2);\n}\nDUK_INTERNAL void duk_dup_m3(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_dup(thr, -3);\n}\nDUK_INTERNAL void duk_dup_m4(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_dup(thr, -4);\n}\n\nDUK_EXTERNAL void duk_insert(duk_hthread *thr, duk_idx_t to_idx) {\n\tduk_tval *p;\n\tduk_tval *q;\n\tduk_tval tv_tmp;\n\tduk_size_t nbytes;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tp = duk_require_tval(thr, to_idx);\n\tDUK_ASSERT(p != NULL);\n\tq = duk_require_tval(thr, -1);\n\tDUK_ASSERT(q != NULL);\n\n\tDUK_ASSERT(q >= p);\n\n\t/*              nbytes\n\t *           <--------->\n\t *    [ ... | p | x | x | q ]\n\t * => [ ... | q | p | x | x ]\n\t */\n\n\tnbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p));  /* Note: 'q' is top-1 */\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk_insert: to_idx=%ld, p=%p, q=%p, nbytes=%lu\",\n\t                     (long) to_idx, (void *) p, (void *) q, (unsigned long) nbytes));\n\n\t/* No net refcount changes. */\n\n\tif (nbytes > 0) {\n\t\tDUK_TVAL_SET_TVAL(&tv_tmp, q);\n\t\tDUK_ASSERT(nbytes > 0);\n\t\tDUK_MEMMOVE((void *) (p + 1), (const void *) p, (size_t) nbytes);\n\t\tDUK_TVAL_SET_TVAL(p, &tv_tmp);\n\t} else {\n\t\t/* nop: insert top to top */\n\t\tDUK_ASSERT(nbytes == 0);\n\t\tDUK_ASSERT(p == q);\n\t}\n}\n\nDUK_INTERNAL void duk_insert_undefined(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(idx >= 0);  /* Doesn't support negative indices. */\n\n\tduk_push_undefined(thr);\n\tduk_insert(thr, idx);\n}\n\nDUK_INTERNAL void duk_insert_undefined_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) {\n\tduk_tval *tv, *tv_end;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(idx >= 0);  /* Doesn't support negative indices or count. */\n\tDUK_ASSERT(count >= 0);\n\n\ttv = duk_reserve_gap(thr, idx, count);\n\ttv_end = tv + count;\n\twhile (tv != tv_end) {\n\t\tDUK_TVAL_SET_UNDEFINED(tv);\n\t\ttv++;\n\t}\n}\n\nDUK_EXTERNAL void duk_replace(duk_hthread *thr, duk_idx_t to_idx) {\n\tduk_tval *tv1;\n\tduk_tval *tv2;\n\tduk_tval tv_tmp;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv1 = duk_require_tval(thr, -1);\n\tDUK_ASSERT(tv1 != NULL);\n\ttv2 = duk_require_tval(thr, to_idx);\n\tDUK_ASSERT(tv2 != NULL);\n\n\t/* For tv1 == tv2, both pointing to stack top, the end result\n\t * is same as duk_pop(thr).\n\t */\n\tDUK_TVAL_SET_TVAL(&tv_tmp, tv2);\n\tDUK_TVAL_SET_TVAL(tv2, tv1);\n\tDUK_TVAL_SET_UNDEFINED(tv1);\n\tthr->valstack_top--;\n\tDUK_TVAL_DECREF(thr, &tv_tmp);  /* side effects */\n}\n\nDUK_EXTERNAL void duk_copy(duk_hthread *thr, duk_idx_t from_idx, duk_idx_t to_idx) {\n\tduk_tval *tv1;\n\tduk_tval *tv2;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv1 = duk_require_tval(thr, from_idx);\n\tDUK_ASSERT(tv1 != NULL);\n\ttv2 = duk_require_tval(thr, to_idx);\n\tDUK_ASSERT(tv2 != NULL);\n\n\t/* For tv1 == tv2, this is a no-op (no explicit check needed). */\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv2, tv1);  /* side effects */\n}\n\nDUK_EXTERNAL void duk_remove(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *p;\n\tduk_tval *q;\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk_tval tv_tmp;\n#endif\n\tduk_size_t nbytes;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tp = duk_require_tval(thr, idx);\n\tDUK_ASSERT(p != NULL);\n\tq = duk_require_tval(thr, -1);\n\tDUK_ASSERT(q != NULL);\n\n\tDUK_ASSERT(q >= p);\n\n\t/*              nbytes            zero size case\n\t *           <--------->\n\t *    [ ... | p | x | x | q ]     [ ... | p==q ]\n\t * => [ ... | x | x | q ]         [ ... ]\n\t */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t/* use a temp: decref only when valstack reachable values are correct */\n\tDUK_TVAL_SET_TVAL(&tv_tmp, p);\n#endif\n\n\tnbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p));  /* Note: 'q' is top-1 */\n\tDUK_MEMMOVE((void *) p, (const void *) (p + 1), (size_t) nbytes);  /* zero size not an issue: pointers are valid */\n\n\tDUK_TVAL_SET_UNDEFINED(q);\n\tthr->valstack_top--;\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_TVAL_DECREF(thr, &tv_tmp);  /* side effects */\n#endif\n}\n\nDUK_INTERNAL void duk_remove_unsafe(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_remove(thr, idx);  /* XXX: no optimization for now */\n}\n\nDUK_INTERNAL void duk_remove_m2(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_remove(thr, -2);\n}\n\nDUK_INTERNAL void duk_remove_n(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) {\n#if defined(DUK_USE_PREFER_SIZE)\n\t/* XXX: maybe too slow even when preferring size? */\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(count >= 0);\n\tDUK_ASSERT(idx >= 0);\n\n\twhile (count-- > 0) {\n\t\tduk_remove(thr, idx);\n\t}\n#else  /* DUK_USE_PREFER_SIZE */\n\tduk_tval *tv_src;\n\tduk_tval *tv_dst;\n\tduk_tval *tv_newtop;\n\tduk_tval *tv;\n\tduk_size_t bytes;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(count >= 0);\n\tDUK_ASSERT(idx >= 0);\n\n\ttv_dst = thr->valstack_bottom + idx;\n\tDUK_ASSERT(tv_dst <= thr->valstack_top);\n\ttv_src = tv_dst + count;\n\tDUK_ASSERT(tv_src <= thr->valstack_top);\n\tbytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src);\n\n\tfor (tv = tv_dst; tv < tv_src; tv++) {\n\t\tDUK_TVAL_DECREF_NORZ(thr, tv);\n\t}\n\n\tDUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, bytes);\n\n\ttv_newtop = thr->valstack_top - count;\n\tfor (tv = tv_newtop; tv < thr->valstack_top; tv++) {\n\t\tDUK_TVAL_SET_UNDEFINED(tv);\n\t}\n\tthr->valstack_top = tv_newtop;\n\n\t/* When not preferring size, only NORZ macros are used; caller\n\t * is expected to DUK_REFZERO_CHECK().\n\t */\n#endif  /* DUK_USE_PREFER_SIZE */\n}\n\nDUK_INTERNAL void duk_remove_n_unsafe(duk_hthread *thr, duk_idx_t idx, duk_idx_t count) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_remove_n(thr, idx, count);  /* XXX: no optimization for now */\n}\n\n/*\n *  Stack slice primitives\n */\n\nDUK_EXTERNAL void duk_xcopymove_raw(duk_hthread *to_thr, duk_hthread *from_thr, duk_idx_t count, duk_bool_t is_copy) {\n\tvoid *src;\n\tduk_size_t nbytes;\n\tduk_tval *p;\n\tduk_tval *q;\n\n\t/* XXX: several pointer comparison issues here */\n\n\tDUK_ASSERT_API_ENTRY(to_thr);\n\tDUK_ASSERT_CTX_VALID(to_thr);\n\tDUK_ASSERT_CTX_VALID(from_thr);\n\tDUK_ASSERT(to_thr->heap == from_thr->heap);\n\n\tif (DUK_UNLIKELY(to_thr == from_thr)) {\n\t\tDUK_ERROR_TYPE(to_thr, DUK_STR_INVALID_CONTEXT);\n\t\treturn;\n\t}\n\tif (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) DUK_USE_VALSTACK_LIMIT)) {\n\t\t/* Maximum value check ensures 'nbytes' won't wrap below.\n\t\t * Also handles negative count.\n\t\t */\n\t\tDUK_ERROR_RANGE_INVALID_COUNT(to_thr);\n\t\treturn;\n\t}\n\tDUK_ASSERT(count >= 0);\n\n\tnbytes = sizeof(duk_tval) * (duk_size_t) count;\n\tif (DUK_UNLIKELY(nbytes == 0)) {\n\t\treturn;\n\t}\n\tDUK_ASSERT(to_thr->valstack_top <= to_thr->valstack_end);\n\tif (DUK_UNLIKELY((duk_size_t) ((duk_uint8_t *) to_thr->valstack_end - (duk_uint8_t *) to_thr->valstack_top) < nbytes)) {\n\t\tDUK_ERROR_RANGE_PUSH_BEYOND(to_thr);\n\t}\n\tsrc = (void *) ((duk_uint8_t *) from_thr->valstack_top - nbytes);\n\tif (DUK_UNLIKELY(src < (void *) from_thr->valstack_bottom)) {\n\t\tDUK_ERROR_RANGE_INVALID_COUNT(to_thr);\n\t}\n\n\t/* copy values (no overlap even if to_thr == from_thr; that's not\n\t * allowed now anyway)\n\t */\n\tDUK_ASSERT(nbytes > 0);\n\tDUK_MEMCPY((void *) to_thr->valstack_top, (const void *) src, (size_t) nbytes);\n\n\tp = to_thr->valstack_top;\n\tto_thr->valstack_top = (duk_tval *) (void *) (((duk_uint8_t *) p) + nbytes);\n\n\tif (is_copy) {\n\t\t/* Incref copies, keep originals. */\n\t\tq = to_thr->valstack_top;\n\t\twhile (p < q) {\n\t\t\tDUK_TVAL_INCREF(to_thr, p);  /* no side effects */\n\t\t\tp++;\n\t\t}\n\t} else {\n\t\t/* No net refcount change. */\n\t\tp = from_thr->valstack_top;\n\t\tq = (duk_tval *) (void *) (((duk_uint8_t *) p) - nbytes);\n\t\tfrom_thr->valstack_top = q;\n\n\t\twhile (p > q) {\n\t\t\tp--;\n\t\t\tDUK_TVAL_SET_UNDEFINED(p);\n\t\t\t/* XXX: fast primitive to set a bunch of values to UNDEFINED */\n\t\t}\n\t}\n}\n\n/* Internal helper: reserve a gap of 'count' elements at 'idx_base' and return a\n * pointer to the gap.  Values in the gap are garbage and MUST be initialized by\n * the caller before any side effects may occur.  The caller must ensure there's\n * enough stack reserve for 'count' values.\n */\nDUK_INTERNAL duk_tval *duk_reserve_gap(duk_hthread *thr, duk_idx_t idx_base, duk_idx_t count) {\n\tduk_tval *tv_src;\n\tduk_tval *tv_dst;\n\tduk_size_t gap_bytes;\n\tduk_size_t copy_bytes;\n\n\t/* Caller is responsible for ensuring there's enough preallocated\n\t * value stack.\n\t */\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(count >= 0);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_end - thr->valstack_top) >= (duk_size_t) count);\n\n\ttv_src = thr->valstack_bottom + idx_base;\n\tgap_bytes = (duk_size_t) count * sizeof(duk_tval);\n\ttv_dst = (duk_tval *) (void *) ((duk_uint8_t *) tv_src + gap_bytes);\n\tcopy_bytes = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) tv_src);\n\tthr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_top + gap_bytes);\n\tDUK_MEMMOVE((void *) tv_dst, (const void *) tv_src, copy_bytes);\n\n\t/* Values in the gap are left as garbage: caller must fill them in\n\t * and INCREF them before any side effects.\n\t */\n\treturn tv_src;\n}\n\n/*\n *  Get/opt/require\n */\n\nDUK_EXTERNAL void duk_require_undefined(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_UNDEFINED(tv))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"undefined\", DUK_STR_NOT_UNDEFINED);\n\t}\n}\n\nDUK_EXTERNAL void duk_require_null(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_NULL(tv))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"null\", DUK_STR_NOT_NULL);\n\t}\n}\n\nDUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__get_boolean_raw(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) {\n\tduk_bool_t ret;\n\tduk_tval *tv;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_IS_BOOLEAN(tv)) {\n\t\tret = DUK_TVAL_GET_BOOLEAN(tv);\n\t\tDUK_ASSERT(ret == 0 || ret == 1);\n\t} else {\n\t\tret = def_value;\n\t\t/* Not guaranteed to be 0 or 1. */\n\t}\n\n\treturn ret;\n}\n\nDUK_EXTERNAL duk_bool_t duk_get_boolean(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk__get_boolean_raw(thr, idx, 0);  /* default: false */\n}\n\nDUK_EXTERNAL duk_bool_t duk_get_boolean_default(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk__get_boolean_raw(thr, idx, def_value);\n}\n\nDUK_EXTERNAL duk_bool_t duk_require_boolean(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_bool_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_LIKELY(DUK_TVAL_IS_BOOLEAN(tv))) {\n\t\tret = DUK_TVAL_GET_BOOLEAN(tv);\n\t\tDUK_ASSERT(ret == 0 || ret == 1);\n\t\treturn ret;\n\t} else {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"boolean\", DUK_STR_NOT_BOOLEAN);\n\t}\n}\n\nDUK_EXTERNAL duk_bool_t duk_opt_boolean(duk_hthread *thr, duk_idx_t idx, duk_bool_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_value;\n\t}\n\treturn duk_require_boolean(thr, idx);\n}\n\nDUK_LOCAL DUK_ALWAYS_INLINE duk_double_t duk__get_number_raw(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) {\n\tduk_double_union ret;\n\tduk_tval *tv;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\tret.d = (duk_double_t) DUK_TVAL_GET_FASTINT(tv);  /* XXX: cast trick */\n\t}\n\telse\n#endif\n\tif (DUK_TVAL_IS_DOUBLE(tv)) {\n\t\t/* When using packed duk_tval, number must be in NaN-normalized form\n\t\t * for it to be a duk_tval, so no need to normalize.  NOP for unpacked\n\t\t * duk_tval.\n\t\t */\n\t\tret.d = DUK_TVAL_GET_DOUBLE(tv);\n\t\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret));\n\t} else {\n\t\tret.d = def_value;\n\t\t/* Default value (including NaN) may not be normalized. */\n\t}\n\n\treturn ret.d;\n}\n\nDUK_EXTERNAL duk_double_t duk_get_number(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__get_number_raw(thr, idx, DUK_DOUBLE_NAN);  /* default: NaN */\n}\n\nDUK_EXTERNAL duk_double_t duk_get_number_default(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__get_number_raw(thr, idx, def_value);\n}\n\nDUK_EXTERNAL duk_double_t duk_require_number(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_double_union ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_NUMBER(tv))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"number\", DUK_STR_NOT_NUMBER);\n\t}\n\n\tret.d = DUK_TVAL_GET_NUMBER(tv);\n\n\t/* When using packed duk_tval, number must be in NaN-normalized form\n\t * for it to be a duk_tval, so no need to normalize.  NOP for unpacked\n\t * duk_tval.\n\t */\n\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&ret));\n\treturn ret.d;\n}\n\nDUK_EXTERNAL duk_double_t duk_opt_number(duk_hthread *thr, duk_idx_t idx, duk_double_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\t/* User provided default is not NaN normalized. */\n\t\treturn def_value;\n\t}\n\treturn duk_require_number(thr, idx);\n}\n\nDUK_EXTERNAL duk_int_t duk_get_int(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/);\n}\n\nDUK_EXTERNAL duk_uint_t duk_get_uint(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/);\n}\n\nDUK_EXTERNAL duk_int_t duk_get_int_default(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_int_t) duk__api_coerce_d2i(thr, idx, def_value, 0 /*require*/);\n}\n\nDUK_EXTERNAL duk_uint_t duk_get_uint_default(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_uint_t) duk__api_coerce_d2ui(thr, idx, def_value, 0 /*require*/);\n}\n\nDUK_EXTERNAL duk_int_t duk_require_int(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 1 /*require*/);\n}\n\nDUK_EXTERNAL duk_uint_t duk_require_uint(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 1 /*require*/);\n}\n\nDUK_EXTERNAL duk_int_t duk_opt_int(duk_hthread *thr, duk_idx_t idx, duk_int_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_value;\n\t}\n\treturn duk_require_int(thr, idx);\n}\n\nDUK_EXTERNAL duk_uint_t duk_opt_uint(duk_hthread *thr, duk_idx_t idx, duk_uint_t def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_value;\n\t}\n\treturn duk_require_uint(thr, idx);\n}\n\nDUK_EXTERNAL const char *duk_get_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {\n\tduk_hstring *h;\n\tconst char *ret;\n\tduk_size_t len;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_get_hstring(thr, idx);\n\tif (h != NULL) {\n\t\tlen = DUK_HSTRING_GET_BYTELEN(h);\n\t\tret = (const char *) DUK_HSTRING_GET_DATA(h);\n\t} else {\n\t\tlen = 0;\n\t\tret = NULL;\n\t}\n\n\tif (out_len != NULL) {\n\t\t*out_len = len;\n\t}\n\treturn ret;\n}\n\nDUK_EXTERNAL const char *duk_require_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_require_hstring(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\tif (out_len) {\n\t\t*out_len = DUK_HSTRING_GET_BYTELEN(h);\n\t}\n\treturn (const char *) DUK_HSTRING_GET_DATA(h);\n}\n\nDUK_INTERNAL const char *duk_require_lstring_notsymbol(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_require_hstring_notsymbol(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\tif (out_len) {\n\t\t*out_len = DUK_HSTRING_GET_BYTELEN(h);\n\t}\n\treturn (const char *) DUK_HSTRING_GET_DATA(h);\n}\n\nDUK_EXTERNAL const char *duk_get_string(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_get_hstring(thr, idx);\n\tif (h != NULL) {\n\t\treturn (const char *) DUK_HSTRING_GET_DATA(h);\n\t} else {\n\t\treturn NULL;\n\t}\n}\n\nDUK_EXTERNAL const char *duk_opt_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\tif (out_len != NULL) {\n\t\t\t*out_len = def_len;\n\t\t}\n\t\treturn def_ptr;\n\t}\n\treturn duk_require_lstring(thr, idx, out_len);\n}\n\nDUK_EXTERNAL const char *duk_opt_string(duk_hthread *thr, duk_idx_t idx, const char *def_ptr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_ptr;\n\t}\n\treturn duk_require_string(thr, idx);\n}\n\nDUK_EXTERNAL const char *duk_get_lstring_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len) {\n\tduk_hstring *h;\n\tconst char *ret;\n\tduk_size_t len;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_get_hstring(thr, idx);\n\tif (h != NULL) {\n\t\tlen = DUK_HSTRING_GET_BYTELEN(h);\n\t\tret = (const char *) DUK_HSTRING_GET_DATA(h);\n\t} else {\n\t\tlen = def_len;\n\t\tret = def_ptr;\n\t}\n\n\tif (out_len != NULL) {\n\t\t*out_len = len;\n\t}\n\treturn ret;\n}\n\nDUK_EXTERNAL const char *duk_get_string_default(duk_hthread *thr, duk_idx_t idx, const char *def_value) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_get_hstring(thr, idx);\n\tif (h != NULL) {\n\t\treturn (const char *) DUK_HSTRING_GET_DATA(h);\n\t} else {\n\t\treturn def_value;\n\t}\n}\n\nDUK_INTERNAL const char *duk_get_string_notsymbol(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_get_hstring_notsymbol(thr, idx);\n\tif (h) {\n\t\treturn (const char *) DUK_HSTRING_GET_DATA(h);\n\t} else {\n\t\treturn NULL;\n\t}\n}\n\nDUK_EXTERNAL const char *duk_require_string(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk_require_lstring(thr, idx, NULL);\n}\n\nDUK_INTERNAL const char *duk_require_string_notsymbol(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_require_hstring_notsymbol(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\treturn (const char *) DUK_HSTRING_GET_DATA(h);\n}\n\nDUK_EXTERNAL void duk_require_object(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"object\", DUK_STR_NOT_OBJECT);\n\t}\n}\n\nDUK_LOCAL void *duk__get_pointer_raw(duk_hthread *thr, duk_idx_t idx, void *def_value) {\n\tduk_tval *tv;\n\tvoid *p;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (!DUK_TVAL_IS_POINTER(tv)) {\n\t\treturn def_value;\n\t}\n\n\tp = DUK_TVAL_GET_POINTER(tv);  /* may be NULL */\n\treturn p;\n}\n\nDUK_EXTERNAL void *duk_get_pointer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__get_pointer_raw(thr, idx, NULL /*def_value*/);\n}\n\nDUK_EXTERNAL void *duk_opt_pointer(duk_hthread *thr, duk_idx_t idx, void *def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_value;\n\t}\n\treturn duk_require_pointer(thr, idx);\n}\n\nDUK_EXTERNAL void *duk_get_pointer_default(duk_hthread *thr, duk_idx_t idx, void *def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__get_pointer_raw(thr, idx, def_value);\n}\n\nDUK_EXTERNAL void *duk_require_pointer(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tvoid *p;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Note: here we must be wary of the fact that a pointer may be\n\t * valid and be a NULL.\n\t */\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_POINTER(tv))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"pointer\", DUK_STR_NOT_POINTER);\n\t}\n\tp = DUK_TVAL_GET_POINTER(tv);  /* may be NULL */\n\treturn p;\n}\n\n#if 0  /*unused*/\nDUK_INTERNAL void *duk_get_voidptr(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_heaphdr *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (!DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {\n\t\treturn NULL;\n\t}\n\n\th = DUK_TVAL_GET_HEAPHDR(tv);\n\tDUK_ASSERT(h != NULL);\n\treturn (void *) h;\n}\n#endif\n\nDUK_LOCAL void *duk__get_buffer_helper(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag) {\n\tduk_hbuffer *h;\n\tvoid *ret;\n\tduk_size_t len;\n\tduk_tval *tv;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\tif (out_size != NULL) {\n\t\t*out_size = 0;\n\t}\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_LIKELY(DUK_TVAL_IS_BUFFER(tv))) {\n\t\th = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\tlen = DUK_HBUFFER_GET_SIZE(h);\n\t\tret = DUK_HBUFFER_GET_DATA_PTR(thr->heap, h);\n\t} else {\n\t\tif (throw_flag) {\n\t\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"buffer\", DUK_STR_NOT_BUFFER);\n\t\t}\n\t\tlen = def_size;\n\t\tret = def_ptr;\n\t}\n\n\tif (out_size != NULL) {\n\t\t*out_size = len;\n\t}\n\treturn ret;\n}\n\nDUK_EXTERNAL void *duk_get_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/);\n}\n\nDUK_EXTERNAL void *duk_opt_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\tif (out_size != NULL) {\n\t\t\t*out_size = def_size;\n\t\t}\n\t\treturn def_ptr;\n\t}\n\treturn duk_require_buffer(thr, idx, out_size);\n}\n\nDUK_EXTERNAL void *duk_get_buffer_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk__get_buffer_helper(thr, idx, out_size, def_ptr, def_len, 0 /*throw_flag*/);\n}\n\nDUK_EXTERNAL void *duk_require_buffer(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk__get_buffer_helper(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/);\n}\n\n/* Get the active buffer data area for a plain buffer or a buffer object.\n * Return NULL if the the value is not a buffer.  Note that a buffer may\n * have a NULL data pointer when its size is zero, the optional 'out_isbuffer'\n * argument allows caller to detect this reliably.\n */\nDUK_INTERNAL void *duk_get_buffer_data_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size, duk_bool_t throw_flag, duk_bool_t *out_isbuffer) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (out_isbuffer != NULL) {\n\t\t*out_isbuffer = 0;\n\t}\n\tif (out_size != NULL) {\n\t\t*out_size = def_size;\n\t}\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_BUFFER(tv)) {\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (out_size != NULL) {\n\t\t\t*out_size = DUK_HBUFFER_GET_SIZE(h);\n\t\t}\n\t\tif (out_isbuffer != NULL) {\n\t\t\t*out_isbuffer = 1;\n\t\t}\n\t\treturn (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h);  /* may be NULL (but only if size is 0) */\n\t}\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\telse if (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\t\t/* XXX: this is probably a useful shared helper: for a\n\t\t\t * duk_hbufobj, get a validated buffer pointer/length.\n\t\t\t */\n\t\t\tduk_hbufobj *h_bufobj = (duk_hbufobj *) h;\n\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\t\t\tif (h_bufobj->buf != NULL &&\n\t\t\t    DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) {\n\t\t\t\tduk_uint8_t *p;\n\n\t\t\t\tp = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf);\n\t\t\t\tif (out_size != NULL) {\n\t\t\t\t\t*out_size = (duk_size_t) h_bufobj->length;\n\t\t\t\t}\n\t\t\t\tif (out_isbuffer != NULL) {\n\t\t\t\t\t*out_isbuffer = 1;\n\t\t\t\t}\n\t\t\t\treturn (void *) (p + h_bufobj->offset);\n\t\t\t}\n\t\t\t/* if slice not fully valid, treat as error */\n\t\t}\n\t}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n\tif (throw_flag) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"buffer\", DUK_STR_NOT_BUFFER);\n\t}\n\treturn def_ptr;\n}\n\nDUK_EXTERNAL void *duk_get_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 0 /*throw_flag*/, NULL);\n}\n\nDUK_EXTERNAL void *duk_get_buffer_data_default(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_get_buffer_data_raw(thr, idx, out_size, def_ptr, def_size, 0 /*throw_flag*/, NULL);\n}\n\nDUK_EXTERNAL void *duk_opt_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\tif (out_size != NULL) {\n\t\t\t*out_size = def_size;\n\t\t}\n\t\treturn def_ptr;\n\t}\n\treturn duk_require_buffer_data(thr, idx, out_size);\n}\n\nDUK_EXTERNAL void *duk_require_buffer_data(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_get_buffer_data_raw(thr, idx, out_size, NULL /*def_ptr*/, 0 /*def_size*/, 1 /*throw_flag*/, NULL);\n}\n\n/* Raw helper for getting a value from the stack, checking its tag.\n * The tag cannot be a number because numbers don't have an internal\n * tag in the packed representation.\n */\n\nDUK_LOCAL duk_heaphdr *duk__get_tagged_heaphdr_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t tag) {\n\tduk_tval *tv;\n\tduk_heaphdr *ret;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_GET_TAG(tv) != tag) {\n\t\treturn (duk_heaphdr *) NULL;\n\t}\n\n\tret = DUK_TVAL_GET_HEAPHDR(tv);\n\tDUK_ASSERT(ret != NULL);  /* tagged null pointers should never occur */\n\treturn ret;\n\n}\n\nDUK_INTERNAL duk_hstring *duk_get_hstring(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);\n}\n\nDUK_INTERNAL duk_hstring *duk_get_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);\n\tif (DUK_UNLIKELY(h && DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\treturn NULL;\n\t}\n\treturn h;\n}\n\nDUK_INTERNAL duk_hstring *duk_require_hstring(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);\n\tif (DUK_UNLIKELY(h == NULL)) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"string\", DUK_STR_NOT_STRING);\n\t}\n\treturn h;\n}\n\nDUK_INTERNAL duk_hstring *duk_require_hstring_notsymbol(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hstring *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_STRING);\n\tif (DUK_UNLIKELY(h == NULL || DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"string\", DUK_STR_NOT_STRING);\n\t}\n\treturn h;\n}\n\nDUK_INTERNAL duk_hobject *duk_get_hobject(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n}\n\nDUK_INTERNAL duk_hobject *duk_require_hobject(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(h == NULL)) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"object\", DUK_STR_NOT_OBJECT);\n\t}\n\treturn h;\n}\n\nDUK_INTERNAL duk_hbuffer *duk_get_hbuffer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER);\n}\n\nDUK_INTERNAL duk_hbuffer *duk_require_hbuffer(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hbuffer *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hbuffer *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_BUFFER);\n\tif (DUK_UNLIKELY(h == NULL)) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"buffer\", DUK_STR_NOT_BUFFER);\n\t}\n\treturn h;\n}\n\nDUK_INTERNAL duk_hthread *duk_get_hthread(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_THREAD(h))) {\n\t\th = NULL;\n\t}\n\treturn (duk_hthread *) h;\n}\n\nDUK_INTERNAL duk_hthread *duk_require_hthread(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_THREAD(h)))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"thread\", DUK_STR_NOT_THREAD);\n\t}\n\treturn (duk_hthread *) h;\n}\n\nDUK_INTERNAL duk_hcompfunc *duk_get_hcompfunc(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_COMPFUNC(h))) {\n\t\th = NULL;\n\t}\n\treturn (duk_hcompfunc *) h;\n}\n\nDUK_INTERNAL duk_hcompfunc *duk_require_hcompfunc(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_COMPFUNC(h)))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"compiledfunction\", DUK_STR_NOT_COMPFUNC);\n\t}\n\treturn (duk_hcompfunc *) h;\n}\n\nDUK_INTERNAL duk_hnatfunc *duk_get_hnatfunc(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_IS_NATFUNC(h))) {\n\t\th = NULL;\n\t}\n\treturn (duk_hnatfunc *) h;\n}\n\nDUK_INTERNAL duk_hnatfunc *duk_require_hnatfunc(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_IS_NATFUNC(h)))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"nativefunction\", DUK_STR_NOT_NATFUNC);\n\t}\n\treturn (duk_hnatfunc *) h;\n}\n\nDUK_EXTERNAL duk_c_function duk_get_c_function(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_hobject *h;\n\tduk_hnatfunc *f;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_OBJECT(tv))) {\n\t\treturn NULL;\n\t}\n\th = DUK_TVAL_GET_OBJECT(tv);\n\tDUK_ASSERT(h != NULL);\n\n\tif (DUK_UNLIKELY(!DUK_HOBJECT_IS_NATFUNC(h))) {\n\t\treturn NULL;\n\t}\n\tDUK_ASSERT(DUK_HOBJECT_HAS_NATFUNC(h));\n\tf = (duk_hnatfunc *) h;\n\n\treturn f->func;\n}\n\nDUK_EXTERNAL duk_c_function duk_opt_c_function(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_value;\n\t}\n\treturn duk_require_c_function(thr, idx);\n}\n\nDUK_EXTERNAL duk_c_function duk_get_c_function_default(duk_hthread *thr, duk_idx_t idx, duk_c_function def_value) {\n\tduk_c_function ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = duk_get_c_function(thr, idx);\n\tif (ret != NULL) {\n\t\treturn ret;\n\t}\n\n\treturn def_value;\n}\n\nDUK_EXTERNAL duk_c_function duk_require_c_function(duk_hthread *thr, duk_idx_t idx) {\n\tduk_c_function ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = duk_get_c_function(thr, idx);\n\tif (DUK_UNLIKELY(!ret)) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"nativefunction\", DUK_STR_NOT_NATFUNC);\n\t}\n\treturn ret;\n}\n\nDUK_EXTERNAL void duk_require_function(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tif (DUK_UNLIKELY(!duk_is_function(thr, idx))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"function\", DUK_STR_NOT_FUNCTION);\n\t}\n}\n\nDUK_INTERNAL void duk_require_constructable(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_require_hobject_accept_mask(thr, idx, DUK_TYPE_MASK_LIGHTFUNC);\n\tif (DUK_UNLIKELY(h != NULL && !DUK_HOBJECT_HAS_CONSTRUCTABLE(h))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"constructable\", DUK_STR_NOT_CONSTRUCTABLE);\n\t}\n\t/* Lightfuncs (h == NULL) are constructable. */\n}\n\nDUK_EXTERNAL duk_hthread *duk_get_context(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk_get_hthread(thr, idx);\n}\n\nDUK_EXTERNAL duk_hthread *duk_require_context(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk_require_hthread(thr, idx);\n}\n\nDUK_EXTERNAL duk_hthread *duk_opt_context(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_value;\n\t}\n\treturn duk_require_context(thr, idx);\n}\n\nDUK_EXTERNAL duk_hthread *duk_get_context_default(duk_hthread *thr, duk_idx_t idx, duk_hthread *def_value) {\n\tduk_hthread *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = duk_get_context(thr, idx);\n\tif (ret != NULL) {\n\t\treturn ret;\n\t}\n\n\treturn def_value;\n}\n\nDUK_EXTERNAL void *duk_get_heapptr(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tvoid *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) {\n\t\treturn (void *) NULL;\n\t}\n\n\tret = (void *) DUK_TVAL_GET_HEAPHDR(tv);\n\tDUK_ASSERT(ret != NULL);\n\treturn ret;\n}\n\nDUK_EXTERNAL void *duk_opt_heapptr(duk_hthread *thr, duk_idx_t idx, void *def_value) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (duk_check_type_mask(thr, idx, DUK_TYPE_MASK_NONE | DUK_TYPE_MASK_UNDEFINED)) {\n\t\treturn def_value;\n\t}\n\treturn duk_require_heapptr(thr, idx);\n}\n\nDUK_EXTERNAL void *duk_get_heapptr_default(duk_hthread *thr, duk_idx_t idx, void *def_value) {\n\tvoid *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = duk_get_heapptr(thr, idx);\n\tif (ret != NULL) {\n\t\treturn ret;\n\t}\n\n\treturn def_value;\n}\n\nDUK_EXTERNAL void *duk_require_heapptr(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tvoid *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_UNLIKELY(!DUK_TVAL_IS_HEAP_ALLOCATED(tv))) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"heapobject\", DUK_STR_UNEXPECTED_TYPE);\n\t}\n\n\tret = (void *) DUK_TVAL_GET_HEAPHDR(tv);\n\tDUK_ASSERT(ret != NULL);\n\treturn ret;\n}\n\n/* Internal helper for getting/requiring a duk_hobject with possible promotion. */\nDUK_LOCAL duk_hobject *duk__get_hobject_promote_mask_raw(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {\n\tduk_uint_t val_mask;\n\tduk_hobject *res;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\tres = duk_get_hobject(thr, idx);  /* common case, not promoted */\n\tif (DUK_LIKELY(res != NULL)) {\n\t\tDUK_ASSERT(res != NULL);\n\t\treturn res;\n\t}\n\n\tval_mask = duk_get_type_mask(thr, idx);\n\tif (val_mask & type_mask) {\n\t\tif (type_mask & DUK_TYPE_MASK_PROMOTE) {\n\t\t\tres = duk_to_hobject(thr, idx);\n\t\t\tDUK_ASSERT(res != NULL);\n\t\t\treturn res;\n\t\t} else {\n\t\t\treturn NULL;  /* accept without promoting */\n\t\t}\n\t}\n\n\tif (type_mask & DUK_TYPE_MASK_THROW) {\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, \"object\", DUK_STR_NOT_OBJECT);\n\t}\n\treturn NULL;\n}\n\n/* Get a duk_hobject * at 'idx'; if the value is not an object but matches the\n * supplied 'type_mask', promote it to an object and return the duk_hobject *.\n * This is useful for call sites which want an object but also accept a plain\n * buffer and/or a lightfunc which gets automatically promoted to an object.\n * Return value is NULL if value is neither an object nor a plain type allowed\n * by the mask.\n */\nDUK_INTERNAL duk_hobject *duk_get_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_PROMOTE);\n}\n\n/* Like duk_get_hobject_promote_mask() but throw a TypeError instead of\n * returning a NULL.\n */\nDUK_INTERNAL duk_hobject *duk_require_hobject_promote_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW | DUK_TYPE_MASK_PROMOTE);\n}\n\n/* Require a duk_hobject * at 'idx'; if the value is not an object but matches the\n * supplied 'type_mask', return a NULL instead.  Otherwise throw a TypeError.\n */\nDUK_INTERNAL duk_hobject *duk_require_hobject_accept_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t type_mask) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__get_hobject_promote_mask_raw(thr, idx, type_mask | DUK_TYPE_MASK_THROW);\n}\n\nDUK_INTERNAL duk_hobject *duk_get_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_DISABLE(classnum >= 0);  /* unsigned */\n\tDUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) != classnum)) {\n\t\th = NULL;\n\t}\n\treturn h;\n}\n\nDUK_INTERNAL duk_hobject *duk_require_hobject_with_class(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t classnum) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_DISABLE(classnum >= 0);  /* unsigned */\n\tDUK_ASSERT(classnum <= DUK_HOBJECT_CLASS_MAX);\n\n\th = (duk_hobject *) duk__get_tagged_heaphdr_raw(thr, idx, DUK_TAG_OBJECT);\n\tif (DUK_UNLIKELY(!(h != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(h) == classnum))) {\n\t\tduk_hstring *h_class;\n\t\th_class = DUK_HTHREAD_GET_STRING(thr, DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum));\n\t\tDUK_UNREF(h_class);\n\n\t\tDUK_ERROR_REQUIRE_TYPE_INDEX(thr, idx, (const char *) DUK_HSTRING_GET_DATA(h_class), DUK_STR_UNEXPECTED_TYPE);\n\t}\n\treturn h;\n}\n\nDUK_EXTERNAL duk_size_t duk_get_length(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED:\n\tcase DUK_TAG_NULL:\n\tcase DUK_TAG_BOOLEAN:\n\tcase DUK_TAG_POINTER:\n\t\treturn 0;\n#if defined(DUK_USE_PREFER_SIZE)\n\t/* String and buffer have a virtual non-configurable .length property\n\t * which is within size_t range so it can be looked up without specific\n\t * type checks.  Lightfuncs inherit from %NativeFunctionPrototype%\n\t * which provides an inherited .length accessor; it could be overwritten\n\t * to produce unexpected types or values, but just number convert and\n\t * duk_size_t cast for now.\n\t */\n\tcase DUK_TAG_STRING:\n\tcase DUK_TAG_BUFFER:\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\tduk_size_t ret;\n\t\tduk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);\n\t\tret = (duk_size_t) duk_to_number_m1(thr);\n\t\tduk_pop_unsafe(thr);\n\t\treturn ret;\n\t}\n#else  /* DUK_USE_PREFER_SIZE */\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn (duk_size_t) DUK_HSTRING_GET_CHARLEN(h);\n\t}\n\tcase DUK_TAG_BUFFER: {\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn (duk_size_t) DUK_HBUFFER_GET_SIZE(h);\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\t/* We could look up the length from the lightfunc duk_tval,\n\t\t * but since Duktape 2.2 lightfunc .length comes from\n\t\t * %NativeFunctionPrototype% which can be overridden, so\n\t\t * look up the property explicitly.\n\t\t */\n\t\tduk_size_t ret;\n\t\tduk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);\n\t\tret = (duk_size_t) duk_to_number_m1(thr);\n\t\tduk_pop_unsafe(thr);\n\t\treturn ret;\n\t}\n#endif  /* DUK_USE_PREFER_SIZE */\n\tcase DUK_TAG_OBJECT: {\n\t\tduk_hobject *h = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn (duk_size_t) duk_hobject_get_length(thr, h);\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault:\n\t\t/* number or 'unused' */\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv) || DUK_TVAL_IS_UNUSED(tv));\n\t\treturn 0;\n\t}\n\n\tDUK_UNREACHABLE();\n}\n\n/*\n *  duk_known_xxx() helpers\n *\n *  Used internally when we're 100% sure that a certain index is valid and\n *  contains an object of a certain type.  For example, if we duk_push_object()\n *  we can then safely duk_known_hobject(thr, -1).  These helpers just assert\n *  for the index and type, and if the assumptions are not valid, memory unsafe\n *  behavior happens.\n */\n\nDUK_LOCAL duk_heaphdr *duk__known_heaphdr(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_heaphdr *h;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tif (idx < 0) {\n\t\ttv = thr->valstack_top + idx;\n\t} else {\n\t\ttv = thr->valstack_bottom + idx;\n\t}\n\tDUK_ASSERT(tv >= thr->valstack_bottom);\n\tDUK_ASSERT(tv < thr->valstack_top);\n\th = DUK_TVAL_GET_HEAPHDR(tv);\n\tDUK_ASSERT(h != NULL);\n\treturn h;\n}\n\nDUK_INTERNAL duk_hstring *duk_known_hstring(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(duk_get_hstring(thr, idx) != NULL);\n\treturn (duk_hstring *) duk__known_heaphdr(thr, idx);\n}\n\nDUK_INTERNAL duk_hobject *duk_known_hobject(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(duk_get_hobject(thr, idx) != NULL);\n\treturn (duk_hobject *) duk__known_heaphdr(thr, idx);\n}\n\nDUK_INTERNAL duk_hbuffer *duk_known_hbuffer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(duk_get_hbuffer(thr, idx) != NULL);\n\treturn (duk_hbuffer *) duk__known_heaphdr(thr, idx);\n}\n\nDUK_INTERNAL duk_hcompfunc *duk_known_hcompfunc(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(duk_get_hcompfunc(thr, idx) != NULL);\n\treturn (duk_hcompfunc *) duk__known_heaphdr(thr, idx);\n}\n\nDUK_INTERNAL duk_hnatfunc *duk_known_hnatfunc(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(duk_get_hnatfunc(thr, idx) != NULL);\n\treturn (duk_hnatfunc *) duk__known_heaphdr(thr, idx);\n}\n\nDUK_EXTERNAL void duk_set_length(duk_hthread *thr, duk_idx_t idx, duk_size_t len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_normalize_index(thr, idx);\n\tduk_push_uint(thr, (duk_uint_t) len);\n\tduk_put_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);\n}\n\n/*\n *  Conversions and coercions\n *\n *  The conversion/coercions are in-place operations on the value stack.\n *  Some operations are implemented here directly, while others call a\n *  helper in duk_js_ops.c after validating arguments.\n */\n\n/* E5 Section 8.12.8 */\n\nDUK_LOCAL duk_bool_t duk__defaultvalue_coerce_attempt(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t func_stridx) {\n\tif (duk_get_prop_stridx(thr, idx, func_stridx)) {\n\t\t/* [ ... func ] */\n\t\tif (duk_is_callable(thr, -1)) {\n\t\t\tduk_dup(thr, idx);         /* -> [ ... func this ] */\n\t\t\tduk_call_method(thr, 0);     /* -> [ ... retval ] */\n\t\t\tif (duk_is_primitive(thr, -1)) {\n\t\t\t\tduk_replace(thr, idx);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\t/* [ ... retval ]; popped below */\n\t\t}\n\t}\n\tduk_pop_unsafe(thr);  /* [ ... func/retval ] -> [ ... ] */\n\treturn 0;\n}\n\nDUK_EXTERNAL void duk_to_undefined(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv);  /* side effects */\n}\n\nDUK_EXTERNAL void duk_to_null(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tDUK_TVAL_SET_NULL_UPDREF(thr, tv);  /* side effects */\n}\n\n/* E5 Section 9.1 */\nDUK_EXTERNAL void duk_to_primitive(duk_hthread *thr, duk_idx_t idx, duk_int_t hint) {\n\t/* inline initializer for coercers[] is not allowed by old compilers like BCC */\n\tduk_small_uint_t coercers[2];\n\tduk_small_uint_t class_number;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(hint == DUK_HINT_NONE || hint == DUK_HINT_NUMBER || hint == DUK_HINT_STRING);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\n\tif (!duk_check_type_mask(thr, idx, DUK_TYPE_MASK_OBJECT |\n\t                                   DUK_TYPE_MASK_LIGHTFUNC |\n\t                                   DUK_TYPE_MASK_BUFFER)) {\n\t\t/* Any other values stay as is. */\n\t\tDUK_ASSERT(!duk_is_buffer(thr, idx));  /* duk_to_string() relies on this behavior */\n\t\treturn;\n\t}\n\n\tclass_number = duk_get_class_number(thr, idx);\n\n\t/* XXX: Symbol objects normally coerce via the ES2015-revised ToPrimitive()\n\t * algorithm which consults value[@@toPrimitive] and avoids calling\n\t * .valueOf() and .toString().  Before that is implemented, special\n\t * case Symbol objects to behave as if they had the default @@toPrimitive\n\t * algorithm of E6 Section 19.4.3.4, i.e. return the plain symbol value\n\t * with no further side effects.\n\t */\n\n\tif (class_number == DUK_HOBJECT_CLASS_SYMBOL) {\n\t\tduk_hobject *h_obj;\n\t\tduk_hstring *h_str;\n\n\t\t/* XXX: pretty awkward, index based API for internal value access? */\n\t\th_obj = duk_known_hobject(thr, idx);\n\t\th_str = duk_hobject_get_internal_value_string(thr->heap, h_obj);\n\t\tif (h_str) {\n\t\t\tduk_push_hstring(thr, h_str);\n\t\t\tduk_replace(thr, idx);\n\t\t\treturn;\n\t\t}\n\t}\n\n\n\t/* Objects are coerced based on E5 specification.\n\t * Lightfuncs are coerced because they behave like\n\t * objects even if they're internally a primitive\n\t * type.  Same applies to plain buffers, which behave\n\t * like ArrayBuffer objects since Duktape 2.x.\n\t */\n\n\tcoercers[0] = DUK_STRIDX_VALUE_OF;\n\tcoercers[1] = DUK_STRIDX_TO_STRING;\n\n\tif (hint == DUK_HINT_NONE) {\n\t\tif (class_number == DUK_HOBJECT_CLASS_DATE) {\n\t\t\thint = DUK_HINT_STRING;\n\t\t} else {\n\t\t\thint = DUK_HINT_NUMBER;\n\t\t}\n\t}\n\n\tif (hint == DUK_HINT_STRING) {\n\t\tcoercers[0] = DUK_STRIDX_TO_STRING;\n\t\tcoercers[1] = DUK_STRIDX_VALUE_OF;\n\t}\n\n\tif (duk__defaultvalue_coerce_attempt(thr, idx, coercers[0])) {\n\t\tDUK_ASSERT(!duk_is_buffer(thr, idx));  /* duk_to_string() relies on this behavior */\n\t\treturn;\n\t}\n\n\tif (duk__defaultvalue_coerce_attempt(thr, idx, coercers[1])) {\n\t\tDUK_ASSERT(!duk_is_buffer(thr, idx));  /* duk_to_string() relies on this behavior */\n\t\treturn;\n\t}\n\n\tDUK_ERROR_TYPE(thr, DUK_STR_TOPRIMITIVE_FAILED);\n}\n\n/* E5 Section 9.2 */\nDUK_EXTERNAL duk_bool_t duk_to_boolean(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_bool_t val;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\ttv = DUK_GET_TVAL_POSIDX(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\tval = duk_js_toboolean(tv);\n\tDUK_ASSERT(val == 0 || val == 1);\n\n\t/* Note: no need to re-lookup tv, conversion is side effect free. */\n\tDUK_ASSERT(tv != NULL);\n\tDUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, val);  /* side effects */\n\treturn val;\n}\n\nDUK_EXTERNAL duk_double_t duk_to_number(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_double_t d;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* XXX: No need to normalize; the whole operation could be inlined here to\n\t * avoid 'tv' re-lookup.\n\t */\n\tidx = duk_require_normalize_index(thr, idx);\n\ttv = DUK_GET_TVAL_POSIDX(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\td = duk_js_tonumber(thr, tv);  /* XXX: fastint coercion? now result will always be a non-fastint */\n\n\t/* ToNumber() may have side effects so must relookup 'tv'. */\n\ttv = DUK_GET_TVAL_POSIDX(thr, idx);\n\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d);  /* side effects */\n\treturn d;\n}\n\nDUK_INTERNAL duk_double_t duk_to_number_m1(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_to_number(thr, -1);\n}\nDUK_INTERNAL duk_double_t duk_to_number_m2(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_to_number(thr, -2);\n}\n\nDUK_INTERNAL duk_double_t duk_to_number_tval(duk_hthread *thr, duk_tval *tv) {\n#if defined(DUK_USE_PREFER_SIZE)\n\tduk_double_t res;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_push_tval(thr, tv);\n\tres = duk_to_number_m1(thr);\n\tduk_pop_unsafe(thr);\n\treturn res;\n#else\n\tduk_double_t res;\n\tduk_tval *tv_dst;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ASSERT_SPACE();\n\n\ttv_dst = thr->valstack_top++;\n\tDUK_TVAL_SET_TVAL(tv_dst, tv);\n\tDUK_TVAL_INCREF(thr, tv_dst);  /* decref not necessary */\n\tres = duk_to_number_m1(thr);  /* invalidates tv_dst */\n\n\ttv_dst = --thr->valstack_top;\n\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_dst));\n\tDUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_dst));  /* plain number */\n\tDUK_TVAL_SET_UNDEFINED(tv_dst);  /* valstack init policy */\n\n\treturn res;\n#endif\n}\n\n/* XXX: combine all the integer conversions: they share everything\n * but the helper function for coercion.\n */\n\ntypedef duk_double_t (*duk__toint_coercer)(duk_hthread *thr, duk_tval *tv);\n\nDUK_LOCAL duk_double_t duk__to_int_uint_helper(duk_hthread *thr, duk_idx_t idx, duk__toint_coercer coerce_func) {\n\tduk_tval *tv;\n\tduk_double_t d;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n#if defined(DUK_USE_FASTINT)\n\t/* If argument is a fastint, guarantee that it remains one.\n\t * There's no downgrade check for other cases.\n\t */\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\t/* XXX: Unnecessary conversion back and forth. */\n\t\treturn (duk_double_t) DUK_TVAL_GET_FASTINT(tv);\n\t}\n#endif\n\td = coerce_func(thr, tv);\n\n\t/* XXX: fastint? */\n\n\t/* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */\n\ttv = duk_require_tval(thr, idx);\n\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv, d);  /* side effects */\n\treturn d;\n}\n\nDUK_EXTERNAL duk_int_t duk_to_int(duk_hthread *thr, duk_idx_t idx) {\n\t/* Value coercion (in stack): ToInteger(), E5 Section 9.4,\n\t * API return value coercion: custom.\n\t */\n\tDUK_ASSERT_API_ENTRY(thr);\n\t(void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger);\n\treturn (duk_int_t) duk__api_coerce_d2i(thr, idx, 0 /*def_value*/, 0 /*require*/);\n}\n\nDUK_EXTERNAL duk_uint_t duk_to_uint(duk_hthread *thr, duk_idx_t idx) {\n\t/* Value coercion (in stack): ToInteger(), E5 Section 9.4,\n\t * API return value coercion: custom.\n\t */\n\tDUK_ASSERT_API_ENTRY(thr);\n\t(void) duk__to_int_uint_helper(thr, idx, duk_js_tointeger);\n\treturn (duk_uint_t) duk__api_coerce_d2ui(thr, idx, 0 /*def_value*/, 0 /*require*/);\n}\n\nDUK_EXTERNAL duk_int32_t duk_to_int32(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_int32_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tret = duk_js_toint32(thr, tv);\n\n\t/* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */\n\ttv = duk_require_tval(thr, idx);\n\tDUK_TVAL_SET_I32_UPDREF(thr, tv, ret);  /* side effects */\n\treturn ret;\n}\n\nDUK_EXTERNAL duk_uint32_t duk_to_uint32(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_uint32_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tret = duk_js_touint32(thr, tv);\n\n\t/* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */\n\ttv = duk_require_tval(thr, idx);\n\tDUK_TVAL_SET_U32_UPDREF(thr, tv, ret);  /* side effects */\n\treturn ret;\n}\n\nDUK_EXTERNAL duk_uint16_t duk_to_uint16(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_uint16_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tret = duk_js_touint16(thr, tv);\n\n\t/* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */\n\ttv = duk_require_tval(thr, idx);\n\tDUK_TVAL_SET_U32_UPDREF(thr, tv, ret);  /* side effects */\n\treturn ret;\n}\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n/* Special coercion for Uint8ClampedArray. */\nDUK_INTERNAL duk_uint8_t duk_to_uint8clamped(duk_hthread *thr, duk_idx_t idx) {\n\tduk_double_t d;\n\tduk_double_t t;\n\tduk_uint8_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* XXX: Simplify this algorithm, should be possible to come up with\n\t * a shorter and faster algorithm by inspecting IEEE representation\n\t * directly.\n\t */\n\n\td = duk_to_number(thr, idx);\n\tif (d <= 0.0) {\n\t\treturn 0;\n\t} else if (d >= 255) {\n\t\treturn 255;\n\t} else if (DUK_ISNAN(d)) {\n\t\t/* Avoid NaN-to-integer coercion as it is compiler specific. */\n\t\treturn 0;\n\t}\n\n\tt = d - DUK_FLOOR(d);\n\tif (t == 0.5) {\n\t\t/* Exact halfway, round to even. */\n\t\tret = (duk_uint8_t) d;\n\t\tret = (ret + 1) & 0xfe;  /* Example: d=3.5, t=0.5 -> ret = (3 + 1) & 0xfe = 4 & 0xfe = 4\n\t\t                          * Example: d=4.5, t=0.5 -> ret = (4 + 1) & 0xfe = 5 & 0xfe = 4\n\t\t                          */\n\t} else {\n\t\t/* Not halfway, round to nearest. */\n\t\tret = (duk_uint8_t) (d + 0.5);\n\t}\n\treturn ret;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\nDUK_EXTERNAL const char *duk_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t(void) duk_to_string(thr, idx);\n\tDUK_ASSERT(duk_is_string(thr, idx));\n\treturn duk_require_lstring(thr, idx, out_len);\n}\n\nDUK_LOCAL duk_ret_t duk__safe_to_string_raw(duk_hthread *thr, void *udata) {\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_UNREF(udata);\n\n\tduk_to_string(thr, -1);\n\treturn 1;\n}\n\nDUK_EXTERNAL const char *duk_safe_to_lstring(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\n\t/* We intentionally ignore the duk_safe_call() return value and only\n\t * check the output type.  This way we don't also need to check that\n\t * the returned value is indeed a string in the success case.\n\t */\n\n\tduk_dup(thr, idx);\n\t(void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/);\n\tif (!duk_is_string(thr, -1)) {\n\t\t/* Error: try coercing error to string once. */\n\t\t(void) duk_safe_call(thr, duk__safe_to_string_raw, NULL /*udata*/, 1 /*nargs*/, 1 /*nrets*/);\n\t\tif (!duk_is_string(thr, -1)) {\n\t\t\t/* Double error */\n\t\t\tduk_pop_unsafe(thr);\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_UC_ERROR);\n\t\t} else {\n\t\t\t;\n\t\t}\n\t} else {\n\t\t/* String; may be a symbol, accepted. */\n\t\t;\n\t}\n\tDUK_ASSERT(duk_is_string(thr, -1));\n\n\tduk_replace(thr, idx);\n\tDUK_ASSERT(duk_get_string(thr, idx) != NULL);\n\treturn duk_get_lstring(thr, idx, out_len);\n}\n\nDUK_INTERNAL duk_hstring *duk_to_property_key_hstring(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_to_primitive(thr, idx, DUK_HINT_STRING);  /* needed for e.g. Symbol objects */\n\th = duk_get_hstring(thr, idx);\n\tif (h == NULL) {\n\t\t/* The \"is string?\" check may seem unnecessary, but as things\n\t\t * are duk_to_hstring() invokes ToString() which fails for\n\t\t * symbols.  But since symbols are already strings for Duktape\n\t\t * C API, we check for that before doing the coercion.\n\t\t */\n\t\th = duk_to_hstring(thr, idx);\n\t}\n\tDUK_ASSERT(h != NULL);\n\treturn h;\n}\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)  /* only needed by debugger for now */\nDUK_INTERNAL duk_hstring *duk_safe_to_hstring(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t(void) duk_safe_to_string(thr, idx);\n\tDUK_ASSERT(duk_is_string(thr, idx));\n\tDUK_ASSERT(duk_get_hstring(thr, idx) != NULL);\n\treturn duk_known_hstring(thr, idx);\n}\n#endif\n\n/* Push Object.prototype.toString() output for 'tv'. */\nDUK_INTERNAL void duk_push_class_string_tval(duk_hthread *thr, duk_tval *tv) {\n\tduk_small_uint_t stridx;\n\tduk_hstring *h_strclass;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNUSED:  /* Treat like 'undefined', shouldn't happen. */\n\tcase DUK_TAG_UNDEFINED: {\n\t\tstridx = DUK_STRIDX_UC_UNDEFINED;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_NULL: {\n\t\tstridx = DUK_STRIDX_UC_NULL;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tstridx = DUK_STRIDX_UC_BOOLEAN;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_POINTER: {\n\t\tstridx = DUK_STRIDX_UC_POINTER;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\tstridx = DUK_STRIDX_UC_FUNCTION;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *h;\n\t\th = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\tstridx = DUK_STRIDX_UC_SYMBOL;\n\t\t} else {\n\t\t\tstridx = DUK_STRIDX_UC_STRING;\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_TAG_OBJECT: {\n\t\tduk_hobject *h;\n\t\tduk_small_uint_t classnum;\n\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tclassnum = DUK_HOBJECT_GET_CLASS_NUMBER(h);\n\t\tstridx = DUK_HOBJECT_CLASS_NUMBER_TO_STRIDX(classnum);\n\n\t\t/* XXX: This is not entirely correct anymore; in ES2015 the\n\t\t * default lookup should use @@toStringTag to come up with\n\t\t * e.g. [object Symbol], [object Uint8Array], etc.  See\n\t\t * ES2015 Section 19.1.3.6.  The downside of implementing that\n\t\t * directly is that the @@toStringTag lookup may have side\n\t\t * effects, so all call sites must be checked for that.\n\t\t * Some may need a side-effect free lookup, e.g. avoiding\n\t\t * getters which are not typical.\n\t\t */\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BUFFER: {\n\t\tstridx = DUK_STRIDX_UINT8_ARRAY;\n\t\tbreak;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n\t\t/* Fall through to generic number case. */\n#endif\n\tdefault: {\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));  /* number (maybe fastint) */\n\t\tstridx = DUK_STRIDX_UC_NUMBER;\n\t\tbreak;\n\t}\n\t}\n\th_strclass = DUK_HTHREAD_GET_STRING(thr, stridx);\n\tDUK_ASSERT(h_strclass != NULL);\n\n\tduk_push_sprintf(thr, \"[object %s]\", (const char *) DUK_HSTRING_GET_DATA(h_strclass));\n}\n\n/* XXX: other variants like uint, u32 etc */\nDUK_INTERNAL duk_int_t duk_to_int_clamped_raw(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped) {\n\tduk_tval *tv;\n\tduk_tval tv_tmp;\n\tduk_double_t d, dmin, dmax;\n\tduk_int_t res;\n\tduk_bool_t clamped = 0;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\td = duk_js_tointeger(thr, tv);  /* E5 Section 9.4, ToInteger() */\n\n\tdmin = (duk_double_t) minval;\n\tdmax = (duk_double_t) maxval;\n\n\tif (d < dmin) {\n\t\tclamped = 1;\n\t\tres = minval;\n\t\td = dmin;\n\t} else if (d > dmax) {\n\t\tclamped = 1;\n\t\tres = maxval;\n\t\td = dmax;\n\t} else {\n\t\tres = (duk_int_t) d;\n\t}\n\tDUK_UNREF(d);  /* SCANBUILD: with suitable dmin/dmax limits 'd' is unused */\n\t/* 'd' and 'res' agree here */\n\n\t/* Relookup in case duk_js_tointeger() ends up e.g. coercing an object. */\n\ttv = duk_get_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);  /* not popped by side effect */\n\tDUK_TVAL_SET_TVAL(&tv_tmp, tv);\n#if defined(DUK_USE_FASTINT)\n#if (DUK_INT_MAX <= 0x7fffffffL)\n\tDUK_TVAL_SET_I32(tv, res);\n#else\n\t/* Clamping needed if duk_int_t is 64 bits. */\n\tif (res >= DUK_FASTINT_MIN && res <= DUK_FASTINT_MAX) {\n\t\tDUK_TVAL_SET_FASTINT(tv, res);\n\t} else {\n\t\tDUK_TVAL_SET_NUMBER(tv, d);\n\t}\n#endif\n#else\n\tDUK_TVAL_SET_NUMBER(tv, d);  /* no need to incref */\n#endif\n\tDUK_TVAL_DECREF(thr, &tv_tmp);  /* side effects */\n\n\tif (out_clamped) {\n\t\t*out_clamped = clamped;\n\t} else {\n\t\t/* coerced value is updated to value stack even when RangeError thrown */\n\t\tif (clamped) {\n\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_NUMBER_OUTSIDE_RANGE);\n\t\t}\n\t}\n\n\treturn res;\n}\n\nDUK_INTERNAL duk_int_t duk_to_int_clamped(duk_hthread *thr, duk_idx_t idx, duk_idx_t minval, duk_idx_t maxval) {\n\tduk_bool_t dummy;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk_to_int_clamped_raw(thr, idx, minval, maxval, &dummy);\n}\n\nDUK_INTERNAL duk_int_t duk_to_int_check_range(duk_hthread *thr, duk_idx_t idx, duk_int_t minval, duk_int_t maxval) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_to_int_clamped_raw(thr, idx, minval, maxval, NULL);  /* out_clamped==NULL -> RangeError if outside range */\n}\n\nDUK_EXTERNAL const char *duk_to_string(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\ttv = DUK_GET_TVAL_POSIDX(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED: {\n\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_LC_UNDEFINED);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_NULL: {\n\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tif (DUK_TVAL_GET_BOOLEAN(tv)) {\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_TRUE);\n\t\t} else {\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_FALSE);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_TAG_STRING: {\n\t\t/* Nop for actual strings, TypeError for Symbols.\n\t\t * Because various internals rely on ToString() coercion of\n\t\t * internal strings, -allow- (NOP) string coercion for hidden\n\t\t * symbols.\n\t\t */\n#if 1\n\t\tduk_hstring *h;\n\t\th = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_CANNOT_STRING_COERCE_SYMBOL);\n\t\t} else {\n\t\t\tgoto skip_replace;\n\t\t}\n#else\n\t\tgoto skip_replace;\n#endif\n\t}\n\tcase DUK_TAG_BUFFER: /* Go through Uint8Array.prototype.toString() for coercion. */\n\tcase DUK_TAG_OBJECT: {\n\t\t/* Plain buffers: go through ArrayBuffer.prototype.toString()\n\t\t * for coercion.\n\t\t *\n\t\t * Symbol objects: duk_to_primitive() results in a plain symbol\n\t\t * value, and duk_to_string() then causes a TypeError.\n\t\t */\n\t\tduk_to_primitive(thr, idx, DUK_HINT_STRING);\n\t\tDUK_ASSERT(!duk_is_buffer(thr, idx));  /* ToPrimitive() must guarantee */\n\t\tDUK_ASSERT(!duk_is_object(thr, idx));\n\t\treturn duk_to_string(thr, idx);  /* Note: recursive call */\n\t}\n\tcase DUK_TAG_POINTER: {\n\t\tvoid *ptr = DUK_TVAL_GET_POINTER(tv);\n\t\tif (ptr != NULL) {\n\t\t\tduk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) ptr);\n\t\t} else {\n\t\t\t/* Represent a null pointer as 'null' to be consistent with\n\t\t\t * the JX format variant.  Native '%p' format for a NULL\n\t\t\t * pointer may be e.g. '(nil)'.\n\t\t\t */\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_LC_NULL);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\t/* Should match Function.prototype.toString() */\n\t\tduk_push_lightfunc_tostring(thr, tv);\n\t\tbreak;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault: {\n\t\t/* number */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\tduk_push_tval(thr, tv);\n\t\tduk_numconv_stringify(thr,\n\t\t                      10 /*radix*/,\n\t\t                      0 /*precision:shortest*/,\n\t\t                      0 /*force_exponential*/);\n\t\tbreak;\n\t}\n\t}\n\n\tduk_replace(thr, idx);\n\n skip_replace:\n\tDUK_ASSERT(duk_is_string(thr, idx));\n\treturn duk_require_string(thr, idx);\n}\n\nDUK_INTERNAL duk_hstring *duk_to_hstring(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_to_string(thr, idx);\n\tret = duk_get_hstring(thr, idx);\n\tDUK_ASSERT(ret != NULL);\n\treturn ret;\n}\n\nDUK_INTERNAL duk_hstring *duk_to_hstring_m1(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_to_hstring(thr, -1);\n}\n\nDUK_INTERNAL duk_hstring *duk_to_hstring_acceptsymbol(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tret = duk_get_hstring(thr, idx);\n\tif (DUK_UNLIKELY(ret && DUK_HSTRING_HAS_SYMBOL(ret))) {\n\t\treturn ret;\n\t}\n\treturn duk_to_hstring(thr, idx);\n}\n\n/* Convert a plain buffer or any buffer object into a string, using the buffer\n * bytes 1:1 in the internal string representation.  For views the active byte\n * slice (not element slice interpreted as an initializer) is used.  This is\n * necessary in Duktape 2.x because ToString(plainBuffer) no longer creates a\n * string with the same bytes as in the buffer but rather (usually)\n * '[object ArrayBuffer]'.\n */\nDUK_EXTERNAL const char *duk_buffer_to_string(duk_hthread *thr, duk_idx_t idx) {\n\tvoid *ptr_src;\n\tduk_size_t len;\n\tconst char *res;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\n\tptr_src = duk_require_buffer_data(thr, idx, &len);\n\tDUK_ASSERT(ptr_src != NULL || len == 0);\n\n\tres = duk_push_lstring(thr, (const char *) ptr_src, len);\n\tduk_replace(thr, idx);\n\treturn res;\n}\n\nDUK_EXTERNAL void *duk_to_buffer_raw(duk_hthread *thr, duk_idx_t idx, duk_size_t *out_size, duk_uint_t mode) {\n\tduk_hbuffer *h_buf;\n\tconst duk_uint8_t *src_data;\n\tduk_size_t src_size;\n\tduk_uint8_t *dst_data;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\n\th_buf = duk_get_hbuffer(thr, idx);\n\tif (h_buf != NULL) {\n\t\t/* Buffer is kept as is, with the fixed/dynamic nature of the\n\t\t * buffer only changed if requested.  An external buffer\n\t\t * is converted into a non-external dynamic buffer in a\n\t\t * duk_to_dynamic_buffer() call.\n\t\t */\n\t\tduk_uint_t tmp;\n\t\tduk_uint8_t *tmp_ptr;\n\n\t\ttmp_ptr = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf);\n\t\tsrc_data = (const duk_uint8_t *) tmp_ptr;\n\t\tsrc_size = DUK_HBUFFER_GET_SIZE(h_buf);\n\n\t\ttmp = (DUK_HBUFFER_HAS_DYNAMIC(h_buf) ? DUK_BUF_MODE_DYNAMIC : DUK_BUF_MODE_FIXED);\n\t\tif ((tmp == mode && !DUK_HBUFFER_HAS_EXTERNAL(h_buf)) ||\n\t\t    mode == DUK_BUF_MODE_DONTCARE) {\n\t\t\t/* Note: src_data may be NULL if input is a zero-size\n\t\t\t * dynamic buffer.\n\t\t\t */\n\t\t\tdst_data = tmp_ptr;\n\t\t\tgoto skip_copy;\n\t\t}\n\t} else {\n\t\t/* Non-buffer value is first ToString() coerced, then converted\n\t\t * to a buffer (fixed buffer is used unless a dynamic buffer is\n\t\t * explicitly requested).  Symbols are rejected with a TypeError.\n\t\t * XXX: C API could maybe allow symbol-to-buffer coercion?\n\t\t */\n\t\tsrc_data = (const duk_uint8_t *) duk_to_lstring(thr, idx, &src_size);\n\t}\n\n\tdst_data = (duk_uint8_t *) duk_push_buffer(thr, src_size, (mode == DUK_BUF_MODE_DYNAMIC) /*dynamic*/);\n\tif (DUK_LIKELY(src_size > 0)) {\n\t\t/* When src_size == 0, src_data may be NULL (if source\n\t\t * buffer is dynamic), and dst_data may be NULL (if\n\t\t * target buffer is dynamic).  Avoid zero-size memcpy()\n\t\t * with an invalid pointer.\n\t\t */\n\t\tDUK_MEMCPY((void *) dst_data, (const void *) src_data, (size_t) src_size);\n\t}\n\tduk_replace(thr, idx);\n skip_copy:\n\n\tif (out_size) {\n\t\t*out_size = src_size;\n\t}\n\treturn dst_data;\n}\n\nDUK_EXTERNAL void *duk_to_pointer(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tvoid *res;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\ttv = DUK_GET_TVAL_POSIDX(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED:\n\tcase DUK_TAG_NULL:\n\tcase DUK_TAG_BOOLEAN:\n\t\tres = NULL;\n\t\tbreak;\n\tcase DUK_TAG_POINTER:\n\t\tres = DUK_TVAL_GET_POINTER(tv);\n\t\tbreak;\n\tcase DUK_TAG_STRING:\n\tcase DUK_TAG_OBJECT:\n\tcase DUK_TAG_BUFFER:\n\t\t/* Heap allocated: return heap pointer which is NOT useful\n\t\t * for the caller, except for debugging.\n\t\t */\n\t\tres = (void *) DUK_TVAL_GET_HEAPHDR(tv);\n\t\tbreak;\n\tcase DUK_TAG_LIGHTFUNC:\n\t\t/* Function pointers do not always cast correctly to void *\n\t\t * (depends on memory and segmentation model for instance),\n\t\t * so they coerce to NULL.\n\t\t */\n\t\tres = NULL;\n\t\tbreak;\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault:\n\t\t/* number */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\tres = NULL;\n\t\tbreak;\n\t}\n\n\tduk_push_pointer(thr, res);\n\tduk_replace(thr, idx);\n\treturn res;\n}\n\nDUK_LOCAL void duk__push_func_from_lightfunc(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) {\n\tduk_idx_t nargs;\n\tduk_uint_t flags = 0;   /* shared flags for a subset of types */\n\tduk_small_uint_t lf_len;\n\tduk_hnatfunc *nf;\n\n\tnargs = (duk_idx_t) DUK_LFUNC_FLAGS_GET_NARGS(lf_flags);\n\tif (nargs == DUK_LFUNC_NARGS_VARARGS) {\n\t\tnargs = (duk_idx_t) DUK_VARARGS;\n\t}\n\n\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t        DUK_HOBJECT_FLAG_CONSTRUCTABLE |\n\t        DUK_HOBJECT_FLAG_CALLABLE |\n\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t        DUK_HOBJECT_FLAG_NATFUNC |\n\t        DUK_HOBJECT_FLAG_NEWENV |\n\t        DUK_HOBJECT_FLAG_STRICT |\n\t        DUK_HOBJECT_FLAG_NOTAIL |\n\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);\n\t(void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE);\n\n\tlf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags);\n\tif ((duk_idx_t) lf_len != nargs) {\n\t\t/* Explicit length is only needed if it differs from 'nargs'. */\n\t\tduk_push_int(thr, (duk_int_t) lf_len);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE);\n\t}\n\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\tduk_push_lightfunc_name_raw(thr, func, lf_flags);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);\n#endif\n\n\tnf = duk_known_hnatfunc(thr, -1);\n\tnf->magic = (duk_int16_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags);\n}\n\nDUK_EXTERNAL void duk_to_object(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_uint_t flags = 0;   /* shared flags for a subset of types */\n\tduk_small_int_t proto = 0;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);\n\ttv = DUK_GET_TVAL_POSIDX(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n#if !defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\tcase DUK_TAG_BUFFER:  /* With no bufferobject support, don't object coerce. */\n#endif\n\tcase DUK_TAG_UNDEFINED:\n\tcase DUK_TAG_NULL: {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BOOLEAN);\n\t\tproto = DUK_BIDX_BOOLEAN_PROTOTYPE;\n\t\tgoto create_object;\n\t}\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *h;\n\t\th = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t\t\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_SYMBOL);\n\t\t\tproto = DUK_BIDX_SYMBOL_PROTOTYPE;\n\t\t} else {\n\t\t\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t\t\t        DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ |\n\t\t\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING);\n\t\t\tproto = DUK_BIDX_STRING_PROTOTYPE;\n\t\t}\n\t\tgoto create_object;\n\t}\n\tcase DUK_TAG_OBJECT: {\n\t\t/* nop */\n\t\tbreak;\n\t}\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\tcase DUK_TAG_BUFFER: {\n\t\t/* A plain buffer object coerces to a full ArrayBuffer which\n\t\t * is not fully transparent behavior (ToObject() should be a\n\t\t * nop for an object).  This behavior matches lightfuncs which\n\t\t * also coerce to an equivalent Function object.  There are\n\t\t * also downsides to defining ToObject(plainBuffer) as a no-op;\n\t\t * for example duk_to_hobject() could result in a NULL pointer.\n\t\t */\n\t\tduk_hbuffer *h_buf;\n\n\t\th_buf = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h_buf != NULL);\n\t\tduk_hbufobj_push_uint8array_from_plain(thr, h_buf);\n\t\tgoto replace_value;\n\t}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\tcase DUK_TAG_POINTER: {\n\t\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER);\n\t\tproto = DUK_BIDX_POINTER_PROTOTYPE;\n\t\tgoto create_object;\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\t/* Lightfunc coerces to a Function instance with concrete\n\t\t * properties.  Since 'length' is virtual for Duktape/C\n\t\t * functions, don't need to define that.  The result is made\n\t\t * extensible to mimic what happens to strings in object\n\t\t * coercion:\n\t\t *\n\t\t *   > Object.isExtensible(Object('foo'))\n\t\t *   true\n\t\t */\n\t\tduk_small_uint_t lf_flags;\n\t\tduk_c_function func;\n\n\t\tDUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags);\n\t\tduk__push_func_from_lightfunc(thr, func, lf_flags);\n\t\tgoto replace_value;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault: {\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_NUMBER);\n\t\tproto = DUK_BIDX_NUMBER_PROTOTYPE;\n\t\tgoto create_object;\n\t}\n\t}\n\tDUK_ASSERT(duk_is_object(thr, idx));\n\treturn;\n\n create_object:\n\t(void) duk_push_object_helper(thr, flags, proto);\n\n\t/* Note: Boolean prototype's internal value property is not writable,\n\t * but duk_xdef_prop_stridx() disregards the write protection.  Boolean\n\t * instances are immutable.\n\t *\n\t * String and buffer special behaviors are already enabled which is not\n\t * ideal, but a write to the internal value is not affected by them.\n\t */\n\tduk_dup(thr, idx);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);\n\n replace_value:\n\tduk_replace(thr, idx);\n\tDUK_ASSERT(duk_is_object(thr, idx));\n}\n\nDUK_INTERNAL duk_hobject *duk_to_hobject(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_to_object(thr, idx);\n\tret = duk_known_hobject(thr, idx);\n\treturn ret;\n}\n\n/*\n *  Type checking\n */\n\nDUK_LOCAL duk_bool_t duk__tag_check(duk_hthread *thr, duk_idx_t idx, duk_small_uint_t tag) {\n\tduk_tval *tv;\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\treturn (DUK_TVAL_GET_TAG(tv) == tag);\n}\n\nDUK_LOCAL duk_bool_t duk__obj_flag_any_default_false(duk_hthread *thr, duk_idx_t idx, duk_uint_t flag_mask) {\n\tduk_hobject *obj;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_get_hobject(thr, idx);\n\tif (obj) {\n\t\treturn (DUK_HEAPHDR_CHECK_FLAG_BITS((duk_heaphdr *) obj, flag_mask) ? 1 : 0);\n\t}\n\treturn 0;\n}\n\nDUK_INTERNAL duk_int_t duk_get_type_tval(duk_tval *tv) {\n\tDUK_ASSERT(tv != NULL);\n\n#if defined(DUK_USE_PACKED_TVAL)\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNUSED:\n\t\treturn DUK_TYPE_NONE;\n\tcase DUK_TAG_UNDEFINED:\n\t\treturn DUK_TYPE_UNDEFINED;\n\tcase DUK_TAG_NULL:\n\t\treturn DUK_TYPE_NULL;\n\tcase DUK_TAG_BOOLEAN:\n\t\treturn DUK_TYPE_BOOLEAN;\n\tcase DUK_TAG_STRING:\n\t\treturn DUK_TYPE_STRING;\n\tcase DUK_TAG_OBJECT:\n\t\treturn DUK_TYPE_OBJECT;\n\tcase DUK_TAG_BUFFER:\n\t\treturn DUK_TYPE_BUFFER;\n\tcase DUK_TAG_POINTER:\n\t\treturn DUK_TYPE_POINTER;\n\tcase DUK_TAG_LIGHTFUNC:\n\t\treturn DUK_TYPE_LIGHTFUNC;\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault:\n\t\t/* Note: number has no explicit tag (in 8-byte representation) */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\treturn DUK_TYPE_NUMBER;\n\t}\n#else  /* DUK_USE_PACKED_TVAL */\n\tDUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv));\n\tDUK_ASSERT(sizeof(duk__type_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1);\n\treturn (duk_int_t) duk__type_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN];\n#endif  /* DUK_USE_PACKED_TVAL */\n}\n\nDUK_EXTERNAL duk_int_t duk_get_type(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\treturn duk_get_type_tval(tv);\n}\n\n#if defined(DUK_USE_VERBOSE_ERRORS) && defined(DUK_USE_PARANOID_ERRORS)\nDUK_LOCAL const char * const duk__type_names[] = {\n\t\"none\",\n\t\"undefined\",\n\t\"null\",\n\t\"boolean\",\n\t\"number\",\n\t\"string\",\n\t\"object\",\n\t\"buffer\",\n\t\"pointer\",\n\t\"lightfunc\"\n};\n\nDUK_INTERNAL const char *duk_get_type_name(duk_hthread *thr, duk_idx_t idx) {\n\tduk_int_t type_tag;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttype_tag = duk_get_type(thr, idx);\n\tDUK_ASSERT(type_tag >= DUK_TYPE_MIN && type_tag <= DUK_TYPE_MAX);\n\tDUK_ASSERT(DUK_TYPE_MIN == 0 && sizeof(duk__type_names) / sizeof(const char *) == DUK_TYPE_MAX + 1);\n\n\treturn duk__type_names[type_tag];\n}\n#endif  /* DUK_USE_VERBOSE_ERRORS && DUK_USE_PARANOID_ERRORS */\n\nDUK_INTERNAL duk_small_uint_t duk_get_class_number(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_hobject *obj;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_OBJECT:\n\t\tobj = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(obj != NULL);\n\t\treturn DUK_HOBJECT_GET_CLASS_NUMBER(obj);\n\tcase DUK_TAG_BUFFER:\n\t\t/* Buffers behave like Uint8Array objects. */\n\t\treturn DUK_HOBJECT_CLASS_UINT8ARRAY;\n\tcase DUK_TAG_LIGHTFUNC:\n\t\t/* Lightfuncs behave like Function objects. */\n\t\treturn DUK_HOBJECT_CLASS_FUNCTION;\n\tdefault:\n\t\t/* Primitive or UNUSED, no class number. */\n\t\treturn DUK_HOBJECT_CLASS_NONE;\n\t}\n}\n\nDUK_EXTERNAL duk_bool_t duk_check_type(duk_hthread *thr, duk_idx_t idx, duk_int_t type) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn (duk_get_type(thr, idx) == type) ? 1 : 0;\n}\n\nDUK_INTERNAL duk_uint_t duk_get_type_mask_tval(duk_tval *tv) {\n\tDUK_ASSERT(tv != NULL);\n\n#if defined(DUK_USE_PACKED_TVAL)\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNUSED:\n\t\treturn DUK_TYPE_MASK_NONE;\n\tcase DUK_TAG_UNDEFINED:\n\t\treturn DUK_TYPE_MASK_UNDEFINED;\n\tcase DUK_TAG_NULL:\n\t\treturn DUK_TYPE_MASK_NULL;\n\tcase DUK_TAG_BOOLEAN:\n\t\treturn DUK_TYPE_MASK_BOOLEAN;\n\tcase DUK_TAG_STRING:\n\t\treturn DUK_TYPE_MASK_STRING;\n\tcase DUK_TAG_OBJECT:\n\t\treturn DUK_TYPE_MASK_OBJECT;\n\tcase DUK_TAG_BUFFER:\n\t\treturn DUK_TYPE_MASK_BUFFER;\n\tcase DUK_TAG_POINTER:\n\t\treturn DUK_TYPE_MASK_POINTER;\n\tcase DUK_TAG_LIGHTFUNC:\n\t\treturn DUK_TYPE_MASK_LIGHTFUNC;\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault:\n\t\t/* Note: number has no explicit tag (in 8-byte representation) */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\treturn DUK_TYPE_MASK_NUMBER;\n\t}\n#else  /* DUK_USE_PACKED_TVAL */\n\tDUK_ASSERT(DUK_TVAL_IS_VALID_TAG(tv));\n\tDUK_ASSERT(sizeof(duk__type_mask_from_tag) / sizeof(duk_uint_t) == DUK_TAG_MAX - DUK_TAG_MIN + 1);\n\treturn duk__type_mask_from_tag[DUK_TVAL_GET_TAG(tv) - DUK_TAG_MIN];\n#endif  /* DUK_USE_PACKED_TVAL */\n}\n\nDUK_EXTERNAL duk_uint_t duk_get_type_mask(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\treturn duk_get_type_mask_tval(tv);\n}\n\nDUK_EXTERNAL duk_bool_t duk_check_type_mask(duk_hthread *thr, duk_idx_t idx, duk_uint_t mask) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (DUK_LIKELY((duk_get_type_mask(thr, idx) & mask) != 0U)) {\n\t\treturn 1;\n\t}\n\tif (mask & DUK_TYPE_MASK_THROW) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_UNEXPECTED_TYPE);\n\t\tDUK_UNREACHABLE();\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_undefined(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_UNDEFINED);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_null(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_NULL);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_boolean(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_BOOLEAN);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_number(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/*\n\t *  Number is special because it doesn't have a specific\n\t *  tag in the 8-byte representation.\n\t */\n\n\t/* XXX: shorter version for unpacked representation? */\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\treturn DUK_TVAL_IS_NUMBER(tv);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_nan(duk_hthread *thr, duk_idx_t idx) {\n\t/* XXX: This will now return false for non-numbers, even though they would\n\t * coerce to NaN (as a general rule).  In particular, duk_get_number()\n\t * returns a NaN for non-numbers, so should this function also return\n\t * true for non-numbers?\n\t */\n\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\n\t/* XXX: for packed duk_tval an explicit \"is number\" check is unnecessary */\n\tif (!DUK_TVAL_IS_NUMBER(tv)) {\n\t\treturn 0;\n\t}\n\treturn (duk_bool_t) DUK_ISNAN(DUK_TVAL_GET_NUMBER(tv));\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_string(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_STRING);\n}\n\nDUK_INTERNAL duk_bool_t duk_is_string_notsymbol(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_get_hstring_notsymbol(thr, idx) != NULL;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_object(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_OBJECT);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_buffer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_BUFFER);\n}\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_IS_BUFFER(tv)) {\n\t\treturn 1;\n\t} else if (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn 0;\n}\n#else  /* DUK_USE_BUFFEROBJECT_SUPPORT */\nDUK_EXTERNAL duk_bool_t duk_is_buffer_data(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\treturn duk_is_buffer(thr, idx);\n}\n\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\nDUK_EXTERNAL duk_bool_t duk_is_pointer(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_POINTER);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_lightfunc(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__tag_check(thr, idx, DUK_TAG_LIGHTFUNC);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_symbol(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\th = duk_get_hstring(thr, idx);\n\t/* Use DUK_LIKELY() here because caller may be more likely to type\n\t * check an expected symbol than not.\n\t */\n\tif (DUK_LIKELY(h != NULL && DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_array(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *obj;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_get_hobject(thr, idx);\n\tif (obj) {\n\t\treturn (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_ARRAY ? 1 : 0);\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_function(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h;\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0;\n\t}\n\tif (DUK_TVAL_IS_LIGHTFUNC(tv)) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nDUK_INTERNAL duk_bool_t duk_is_callable_tval(duk_hthread *thr, duk_tval *tv) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_UNREF(thr);\n\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h;\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn DUK_HOBJECT_HAS_CALLABLE(h) ? 1 : 0;\n\t}\n\tif (DUK_TVAL_IS_LIGHTFUNC(tv)) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_constructable(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h;\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn DUK_HOBJECT_HAS_CONSTRUCTABLE(h) ? 1 : 0;\n\t}\n\tif (DUK_TVAL_IS_LIGHTFUNC(tv)) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_c_function(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__obj_flag_any_default_false(thr,\n\t                                       idx,\n\t                                       DUK_HOBJECT_FLAG_NATFUNC);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_ecmascript_function(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__obj_flag_any_default_false(thr,\n\t                                       idx,\n\t                                       DUK_HOBJECT_FLAG_COMPFUNC);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_bound_function(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__obj_flag_any_default_false(thr,\n\t                                       idx,\n\t                                       DUK_HOBJECT_FLAG_BOUNDFUNC);\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_thread(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *obj;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tobj = duk_get_hobject(thr, idx);\n\tif (obj) {\n\t\treturn (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_THREAD ? 1 : 0);\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_fixed_buffer(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_IS_BUFFER(tv)) {\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn (DUK_HBUFFER_HAS_DYNAMIC(h) ? 0 : 1);\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_dynamic_buffer(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_IS_BUFFER(tv)) {\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0);\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_bool_t duk_is_external_buffer(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_get_tval_or_unused(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_IS_BUFFER(tv)) {\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn (DUK_HBUFFER_HAS_DYNAMIC(h) && DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0);\n\t}\n\treturn 0;\n}\n\nDUK_EXTERNAL duk_errcode_t duk_get_error_code(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hobject *h;\n\tduk_uint_t sanity;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_get_hobject(thr, idx);\n\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\tdo {\n\t\tif (!h) {\n\t\t\treturn DUK_ERR_NONE;\n\t\t}\n\n\t\t/* XXX: something more convenient? */\n\n\t\tif (h == thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE]) {\n\t\t\treturn DUK_ERR_EVAL_ERROR;\n\t\t}\n\t\tif (h == thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE]) {\n\t\t\treturn DUK_ERR_RANGE_ERROR;\n\t\t}\n\t\tif (h == thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE]) {\n\t\t\treturn DUK_ERR_REFERENCE_ERROR;\n\t\t}\n\t\tif (h == thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE]) {\n\t\t\treturn DUK_ERR_SYNTAX_ERROR;\n\t\t}\n\t\tif (h == thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE]) {\n\t\t\treturn DUK_ERR_TYPE_ERROR;\n\t\t}\n\t\tif (h == thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE]) {\n\t\t\treturn DUK_ERR_URI_ERROR;\n\t\t}\n\t\tif (h == thr->builtins[DUK_BIDX_ERROR_PROTOTYPE]) {\n\t\t\treturn DUK_ERR_ERROR;\n\t\t}\n\n\t\th = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);\n\t} while (--sanity > 0);\n\n\treturn DUK_ERR_NONE;\n}\n\n/*\n *  Pushers\n */\n\nDUK_INTERNAL void duk_push_tval(duk_hthread *thr, duk_tval *tv) {\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(tv != NULL);\n\n\tDUK__CHECK_SPACE();\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_TVAL(tv_slot, tv);\n\tDUK_TVAL_INCREF(thr, tv);  /* no side effects */\n}\n\nDUK_EXTERNAL void duk_push_undefined(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK__CHECK_SPACE();\n\n\t/* Because value stack init policy is 'undefined above top',\n\t * we don't need to write, just assert.\n\t */\n\tthr->valstack_top++;\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1));\n}\n\nDUK_EXTERNAL void duk_push_null(duk_hthread *thr) {\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_NULL(tv_slot);\n}\n\nDUK_EXTERNAL void duk_push_boolean(duk_hthread *thr, duk_bool_t val) {\n\tduk_tval *tv_slot;\n\tduk_small_int_t b;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\tb = (val ? 1 : 0);  /* ensure value is 1 or 0 (not other non-zero) */\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_BOOLEAN(tv_slot, b);\n}\n\nDUK_EXTERNAL void duk_push_true(duk_hthread *thr) {\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_BOOLEAN_TRUE(tv_slot);\n}\n\nDUK_EXTERNAL void duk_push_false(duk_hthread *thr) {\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_BOOLEAN_FALSE(tv_slot);\n}\n\n/* normalize NaN which may not match our canonical internal NaN */\nDUK_EXTERNAL void duk_push_number(duk_hthread *thr, duk_double_t val) {\n\tduk_tval *tv_slot;\n\tduk_double_union du;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\tdu.d = val;\n\tDUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_NUMBER(tv_slot, du.d);\n}\n\nDUK_EXTERNAL void duk_push_int(duk_hthread *thr, duk_int_t val) {\n#if defined(DUK_USE_FASTINT)\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\ttv_slot = thr->valstack_top++;\n#if DUK_INT_MAX <= 0x7fffffffL\n\tDUK_TVAL_SET_I32(tv_slot, (duk_int32_t) val);\n#else\n\tif (val >= DUK_FASTINT_MIN && val <= DUK_FASTINT_MAX) {\n\t\tDUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val);\n\t} else {\n\t\tduk_double_t = (duk_double_t) val;\n\t\tDUK_TVAL_SET_NUMBER(tv_slot, d);\n\t}\n#endif\n#else  /* DUK_USE_FASTINT */\n\tduk_tval *tv_slot;\n\tduk_double_t d;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\td = (duk_double_t) val;\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_NUMBER(tv_slot, d);\n#endif  /* DUK_USE_FASTINT */\n}\n\nDUK_EXTERNAL void duk_push_uint(duk_hthread *thr, duk_uint_t val) {\n#if defined(DUK_USE_FASTINT)\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\ttv_slot = thr->valstack_top++;\n#if DUK_UINT_MAX <= 0xffffffffUL\n\tDUK_TVAL_SET_U32(tv_slot, (duk_uint32_t) val);\n#else\n\tif (val <= DUK_FASTINT_MAX) {  /* val is unsigned so >= 0 */\n\t\t/* XXX: take advantage of val being unsigned, no need to mask */\n\t\tDUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val);\n\t} else {\n\t\tduk_double_t = (duk_double_t) val;\n\t\tDUK_TVAL_SET_NUMBER(tv_slot, d);\n\t}\n#endif\n#else  /* DUK_USE_FASTINT */\n\tduk_tval *tv_slot;\n\tduk_double_t d;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\td = (duk_double_t) val;\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_NUMBER(tv_slot, d);\n#endif  /* DUK_USE_FASTINT */\n}\n\nDUK_EXTERNAL void duk_push_nan(duk_hthread *thr) {\n\tduk_tval *tv_slot;\n\tduk_double_union du;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\tDUK_DBLUNION_SET_NAN(&du);\n\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_NUMBER(tv_slot, du.d);\n}\n\nDUK_EXTERNAL const char *duk_push_lstring(duk_hthread *thr, const char *str, duk_size_t len) {\n\tduk_hstring *h;\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* check stack before interning (avoid hanging temp) */\n\tDUK__CHECK_SPACE();\n\n\t/* NULL with zero length represents an empty string; NULL with higher\n\t * length is also now trated like an empty string although it is\n\t * a bit dubious.  This is unlike duk_push_string() which pushes a\n\t * 'null' if the input string is a NULL.\n\t */\n\tif (!str) {\n\t\tlen = 0;\n\t}\n\n\t/* Check for maximum string length */\n\tif (DUK_UNLIKELY(len > DUK_HSTRING_MAX_BYTELEN)) {\n\t\tDUK_ERROR_RANGE(thr, DUK_STR_STRING_TOO_LONG);\n\t}\n\n\th = duk_heap_strtable_intern_checked(thr, (const duk_uint8_t *) str, (duk_uint32_t) len);\n\tDUK_ASSERT(h != NULL);\n\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_STRING(tv_slot, h);\n\tDUK_HSTRING_INCREF(thr, h);  /* no side effects */\n\n\treturn (const char *) DUK_HSTRING_GET_DATA(h);\n}\n\nDUK_EXTERNAL const char *duk_push_string(duk_hthread *thr, const char *str) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (str) {\n\t\treturn duk_push_lstring(thr, str, DUK_STRLEN(str));\n\t} else {\n\t\tduk_push_null(thr);\n\t\treturn NULL;\n\t}\n}\n\nDUK_EXTERNAL void duk_push_pointer(duk_hthread *thr, void *val) {\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__CHECK_SPACE();\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_POINTER(tv_slot, val);\n}\n\nDUK_INTERNAL duk_hstring *duk_push_uint_to_hstring(duk_hthread *thr, duk_uint_t i) {\n\tduk_hstring *h_tmp;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* XXX: this could be a direct DUK_SPRINTF to a buffer followed by duk_push_string() */\n\tduk_push_uint(thr, (duk_uint_t) i);\n\th_tmp = duk_to_hstring_m1(thr);\n\tDUK_ASSERT(h_tmp != NULL);\n\treturn h_tmp;\n}\n\nDUK_LOCAL void duk__push_this_helper(duk_hthread *thr, duk_small_uint_t check_object_coercible) {\n\tduk_tval *tv_slot;\n\n\tDUK__CHECK_SPACE();\n\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));  /* because of valstack init policy */\n\ttv_slot = thr->valstack_top++;\n\n\tif (DUK_UNLIKELY(thr->callstack_curr == NULL)) {\n\t\tif (check_object_coercible) {\n\t\t\tgoto type_error;\n\t\t}\n\t\t/* 'undefined' already on stack top */\n\t} else {\n\t\tduk_tval *tv;\n\n\t\t/* 'this' binding is just before current activation's bottom */\n\t\tDUK_ASSERT(thr->valstack_bottom > thr->valstack);\n\t\ttv = thr->valstack_bottom - 1;\n\t\tif (check_object_coercible &&\n\t\t    (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv))) {\n\t\t\t/* XXX: better macro for DUK_TVAL_IS_UNDEFINED_OR_NULL(tv) */\n\t\t\tgoto type_error;\n\t\t}\n\n\t\tDUK_TVAL_SET_TVAL(tv_slot, tv);\n\t\tDUK_TVAL_INCREF(thr, tv);\n\t}\n\treturn;\n\n type_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_OBJECT_COERCIBLE);\n}\n\nDUK_EXTERNAL void duk_push_this(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk__push_this_helper(thr, 0 /*check_object_coercible*/);\n}\n\nDUK_INTERNAL void duk_push_this_check_object_coercible(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk__push_this_helper(thr, 1 /*check_object_coercible*/);\n}\n\nDUK_INTERNAL duk_hobject *duk_push_this_coercible_to_object(duk_hthread *thr) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk__push_this_helper(thr, 1 /*check_object_coercible*/);\n\th = duk_to_hobject(thr, -1);\n\tDUK_ASSERT(h != NULL);\n\treturn h;\n}\n\nDUK_INTERNAL duk_hstring *duk_push_this_coercible_to_string(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk__push_this_helper(thr, 1 /*check_object_coercible*/);\n\treturn duk_to_hstring_m1(thr);  /* This will reject all Symbol values; accepts Symbol objects. */\n}\n\nDUK_INTERNAL duk_tval *duk_get_borrowed_this_tval(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_ASSERT(thr->callstack_top > 0);  /* caller required to know */\n\tDUK_ASSERT(thr->callstack_curr != NULL);  /* caller required to know */\n\tDUK_ASSERT(thr->valstack_bottom > thr->valstack);  /* consequence of above */\n\tDUK_ASSERT(thr->valstack_bottom - 1 >= thr->valstack);  /* 'this' binding exists */\n\n\treturn thr->valstack_bottom - 1;\n}\n\nDUK_EXTERNAL void duk_push_current_function(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tact = thr->callstack_curr;\n\tif (act != NULL) {\n\t\tduk_push_tval(thr, &act->tv_func);\n\t} else {\n\t\tduk_push_undefined(thr);\n\t}\n}\n\nDUK_EXTERNAL void duk_push_current_thread(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tif (thr->heap->curr_thread) {\n\t\tduk_push_hobject(thr, (duk_hobject *) thr->heap->curr_thread);\n\t} else {\n\t\tduk_push_undefined(thr);\n\t}\n}\n\nDUK_EXTERNAL void duk_push_global_object(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL);\n}\n\n/* XXX: size optimize */\nDUK_LOCAL void duk__push_stash(duk_hthread *thr) {\n\tif (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"creating heap/global/thread stash on first use\"));\n\t\tduk_pop_unsafe(thr);\n\t\tduk_push_bare_object(thr);\n\t\tduk_dup_top(thr);\n\t\tduk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_C);  /* [ ... parent stash stash ] -> [ ... parent stash ] */\n\t}\n\tduk_remove_m2(thr);\n}\n\nDUK_EXTERNAL void duk_push_heap_stash(duk_hthread *thr) {\n\tduk_heap *heap;\n\tDUK_ASSERT_API_ENTRY(thr);\n\theap = thr->heap;\n\tDUK_ASSERT(heap->heap_object != NULL);\n\tduk_push_hobject(thr, heap->heap_object);\n\tduk__push_stash(thr);\n}\n\nDUK_EXTERNAL void duk_push_global_stash(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_push_global_object(thr);\n\tduk__push_stash(thr);\n}\n\nDUK_EXTERNAL void duk_push_thread_stash(duk_hthread *thr, duk_hthread *target_thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tif (DUK_UNLIKELY(target_thr == NULL)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\treturn;  /* not reached */\n\t}\n\tduk_push_hobject(thr, (duk_hobject *) target_thr);\n\tduk__push_stash(thr);\n}\n\n/* XXX: duk_ssize_t would be useful here */\nDUK_LOCAL duk_int_t duk__try_push_vsprintf(duk_hthread *thr, void *buf, duk_size_t sz, const char *fmt, va_list ap) {\n\tduk_int_t len;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_UNREF(thr);\n\n\t/* NUL terminator handling doesn't matter here */\n\tlen = DUK_VSNPRINTF((char *) buf, sz, fmt, ap);\n\tif (len < (duk_int_t) sz) {\n\t\t/* Return value of 'sz' or more indicates output was (potentially)\n\t\t * truncated.\n\t\t */\n\t\treturn (duk_int_t) len;\n\t}\n\treturn -1;\n}\n\nDUK_EXTERNAL const char *duk_push_vsprintf(duk_hthread *thr, const char *fmt, va_list ap) {\n\tduk_uint8_t stack_buf[DUK_PUSH_SPRINTF_INITIAL_SIZE];\n\tduk_size_t sz = DUK_PUSH_SPRINTF_INITIAL_SIZE;\n\tduk_bool_t pushed_buf = 0;\n\tvoid *buf;\n\tduk_int_t len;  /* XXX: duk_ssize_t */\n\tconst char *res;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* special handling of fmt==NULL */\n\tif (!fmt) {\n\t\tduk_hstring *h_str;\n\t\tduk_push_hstring_empty(thr);\n\t\th_str = duk_known_hstring(thr, -1);\n\t\treturn (const char *) DUK_HSTRING_GET_DATA(h_str);\n\t}\n\n\t/* initial estimate based on format string */\n\tsz = DUK_STRLEN(fmt) + 16;  /* format plus something to avoid just missing */\n\tif (sz < DUK_PUSH_SPRINTF_INITIAL_SIZE) {\n\t\tsz = DUK_PUSH_SPRINTF_INITIAL_SIZE;\n\t}\n\tDUK_ASSERT(sz > 0);\n\n\t/* Try to make do with a stack buffer to avoid allocating a temporary buffer.\n\t * This works 99% of the time which is quite nice.\n\t */\n\tfor (;;) {\n\t\tva_list ap_copy;  /* copied so that 'ap' can be reused */\n\n\t\tif (sz <= sizeof(stack_buf)) {\n\t\t\tbuf = stack_buf;\n\t\t} else if (!pushed_buf) {\n\t\t\tpushed_buf = 1;\n\t\t\tbuf = duk_push_dynamic_buffer(thr, sz);\n\t\t} else {\n\t\t\tbuf = duk_resize_buffer(thr, -1, sz);\n\t\t}\n\t\tDUK_ASSERT(buf != NULL);\n\n\t\tDUK_VA_COPY(ap_copy, ap);\n\t\tlen = duk__try_push_vsprintf(thr, buf, sz, fmt, ap_copy);\n\t\tva_end(ap_copy);\n\t\tif (len >= 0) {\n\t\t\tbreak;\n\t\t}\n\n\t\t/* failed, resize and try again */\n\t\tsz = sz * 2;\n\t\tif (DUK_UNLIKELY(sz >= DUK_PUSH_SPRINTF_SANITY_LIMIT)) {\n\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG);\n\t\t}\n\t}\n\n\t/* Cannot use duk_buffer_to_string() on the buffer because it is\n\t * usually larger than 'len'; 'buf' is also usually a stack buffer.\n\t */\n\tres = duk_push_lstring(thr, (const char *) buf, (duk_size_t) len);  /* [ buf? res ] */\n\tif (pushed_buf) {\n\t\tduk_remove_m2(thr);\n\t}\n\treturn res;\n}\n\nDUK_EXTERNAL const char *duk_push_sprintf(duk_hthread *thr, const char *fmt, ...) {\n\tva_list ap;\n\tconst char *ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* allow fmt==NULL */\n\tva_start(ap, fmt);\n\tret = duk_push_vsprintf(thr, fmt, ap);\n\tva_end(ap);\n\n\treturn ret;\n}\n\nDUK_INTERNAL duk_hobject *duk_push_object_helper(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) {\n\tduk_tval *tv_slot;\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(prototype_bidx == -1 ||\n\t           (prototype_bidx >= 0 && prototype_bidx < DUK_NUM_BUILTINS));\n\n\tDUK__CHECK_SPACE();\n\n\th = duk_hobject_alloc(thr, hobject_flags_and_class);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_DDD(DUK_DDDPRINT(\"created object with flags: 0x%08lx\", (unsigned long) h->hdr.h_flags));\n\n\ttv_slot = thr->valstack_top;\n\tDUK_TVAL_SET_OBJECT(tv_slot, h);\n\tDUK_HOBJECT_INCREF(thr, h);  /* no side effects */\n\tthr->valstack_top++;\n\n\t/* object is now reachable */\n\n\tif (prototype_bidx >= 0) {\n\t\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, thr->builtins[prototype_bidx]);\n\t} else {\n\t\tDUK_ASSERT(prototype_bidx == -1);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h) == NULL);\n\t}\n\n\treturn h;\n}\n\nDUK_INTERNAL duk_hobject *duk_push_object_helper_proto(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_hobject *proto) {\n\tduk_hobject *h;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th = duk_push_object_helper(thr, hobject_flags_and_class, -1);\n\tDUK_ASSERT(h != NULL);\n\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, h, proto);\n\treturn h;\n}\n\nDUK_EXTERNAL duk_idx_t duk_push_object(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t(void) duk_push_object_helper(thr,\n\t                              DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t                              DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),\n\t                              DUK_BIDX_OBJECT_PROTOTYPE);\n\treturn duk_get_top_index_unsafe(thr);\n}\n\nDUK_EXTERNAL duk_idx_t duk_push_array(duk_hthread *thr) {\n\tduk_uint_t flags;\n\tduk_harray *obj;\n\tduk_idx_t ret;\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t        DUK_HOBJECT_FLAG_ARRAY_PART |\n\t        DUK_HOBJECT_FLAG_EXOTIC_ARRAY |\n\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAY);\n\n\tobj = duk_harray_alloc(thr, flags);\n\tDUK_ASSERT(obj != NULL);\n\n\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_ARRAY_PROTOTYPE]);\n\n\ttv_slot = thr->valstack_top;\n\tDUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);\n\tDUK_HOBJECT_INCREF(thr, obj);  /* XXX: could preallocate with refcount = 1 */\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n\tthr->valstack_top++;\n\n\tDUK_ASSERT(obj->length == 0);  /* Array .length starts at zero. */\n\treturn ret;\n}\n\nDUK_INTERNAL duk_harray *duk_push_harray(duk_hthread *thr) {\n\t/* XXX: API call could do this directly, cast to void in API macro. */\n\tduk_harray *a;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t(void) duk_push_array(thr);\n\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(thr->valstack_top - 1));\n\ta = (duk_harray *) DUK_TVAL_GET_OBJECT(thr->valstack_top - 1);\n\tDUK_ASSERT(a != NULL);\n\treturn a;\n}\n\n/* Push a duk_harray with preallocated size (.length also set to match size).\n * Caller may then populate array part of the duk_harray directly.\n */\nDUK_INTERNAL duk_harray *duk_push_harray_with_size(duk_hthread *thr, duk_uint32_t size) {\n\tduk_harray *a;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ta = duk_push_harray(thr);\n\n\tduk_hobject_realloc_props(thr,\n\t                          (duk_hobject *) a,\n\t                          0,\n\t                          size,\n\t                          0,\n\t                          0);\n\ta->length = size;\n\treturn a;\n}\n\nDUK_INTERNAL duk_tval *duk_push_harray_with_size_outptr(duk_hthread *thr, duk_uint32_t size) {\n\tduk_harray *a;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ta = duk_push_harray_with_size(thr, size);\n\tDUK_ASSERT(a != NULL);\n\treturn DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a);\n}\n\nDUK_EXTERNAL duk_idx_t duk_push_thread_raw(duk_hthread *thr, duk_uint_t flags) {\n\tduk_hthread *obj;\n\tduk_idx_t ret;\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK__CHECK_SPACE();\n\n\tobj = duk_hthread_alloc(thr,\n\t                        DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD));\n\tDUK_ASSERT(obj != NULL);\n\tobj->state = DUK_HTHREAD_STATE_INACTIVE;\n#if defined(DUK_USE_ROM_STRINGS)\n\t/* Nothing to initialize, strs[] is in ROM. */\n#else\n#if defined(DUK_USE_HEAPPTR16)\n\tobj->strs16 = thr->strs16;\n#else\n\tobj->strs = thr->strs;\n#endif\n#endif\n\tDUK_DDD(DUK_DDDPRINT(\"created thread object with flags: 0x%08lx\", (unsigned long) obj->obj.hdr.h_flags));\n\n\t/* make the new thread reachable */\n\ttv_slot = thr->valstack_top;\n\tDUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);\n\tDUK_HTHREAD_INCREF(thr, obj);\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n\tthr->valstack_top++;\n\n\t/* important to do this *after* pushing, to make the thread reachable for gc */\n\tif (DUK_UNLIKELY(!duk_hthread_init_stacks(thr->heap, obj))) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\n\t/* initialize built-ins - either by copying or creating new ones */\n\tif (flags & DUK_THREAD_NEW_GLOBAL_ENV) {\n\t\tduk_hthread_create_builtin_objects(obj);\n\t} else {\n\t\tduk_hthread_copy_builtin_objects(thr, obj);\n\t}\n\n\t/* default prototype */\n\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, obj->builtins[DUK_BIDX_THREAD_PROTOTYPE]);\n\n\t/* Initial stack size satisfies the stack slack constraints so there\n\t * is no need to require stack here.\n\t */\n\tDUK_ASSERT(DUK_VALSTACK_INITIAL_SIZE >=\n\t           DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);\n\n\treturn ret;\n}\n\nDUK_INTERNAL duk_hcompfunc *duk_push_hcompfunc(duk_hthread *thr) {\n\tduk_hcompfunc *obj;\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK__CHECK_SPACE();\n\n\t/* Template functions are not strictly constructable (they don't\n\t * have a \"prototype\" property for instance), so leave the\n\t * DUK_HOBJECT_FLAG_CONSRUCTABLE flag cleared here.\n\t */\n\n\tobj = duk_hcompfunc_alloc(thr,\n\t                          DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                          DUK_HOBJECT_FLAG_CALLABLE |\n\t                          DUK_HOBJECT_FLAG_COMPFUNC |\n\t                          DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION));\n\tif (DUK_UNLIKELY(obj == NULL)) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"created compiled function object with flags: 0x%08lx\", (unsigned long) obj->obj.hdr.h_flags));\n\n\ttv_slot = thr->valstack_top;\n\tDUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);\n\tDUK_HOBJECT_INCREF(thr, obj);\n\tthr->valstack_top++;\n\n\t/* default prototype */\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL);\n\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n\n\treturn obj;\n}\n\nDUK_INTERNAL duk_hboundfunc *duk_push_hboundfunc(duk_hthread *thr) {\n\tduk_hboundfunc *obj;\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK__CHECK_SPACE();\n\tobj = duk_hboundfunc_alloc(thr->heap,\n\t                           DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                           DUK_HOBJECT_FLAG_BOUNDFUNC |\n\t                           DUK_HOBJECT_FLAG_CONSTRUCTABLE |\n\t                           DUK_HOBJECT_FLAG_CALLABLE |\n\t                           DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION));\n\tif (!obj) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\n\ttv_slot = thr->valstack_top++;\n\tDUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);\n\tDUK_HOBJECT_INCREF(thr, obj);\n\n\t/* Prototype is left as NULL because the caller always sets it (and\n\t * it depends on the target function).\n\t */\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) obj) == NULL);\n\n\treturn obj;\n}\n\nDUK_LOCAL duk_idx_t duk__push_c_function_raw(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_uint_t flags, duk_small_uint_t proto_bidx) {\n\tduk_hnatfunc *obj;\n\tduk_idx_t ret;\n\tduk_tval *tv_slot;\n\tduk_int16_t func_nargs;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\tDUK__CHECK_SPACE();\n\n\tif (DUK_UNLIKELY(func == NULL)) {\n\t\tgoto api_error;\n\t}\n\tif (nargs >= 0 && nargs < DUK_HNATFUNC_NARGS_MAX) {\n\t\tfunc_nargs = (duk_int16_t) nargs;\n\t} else if (nargs == DUK_VARARGS) {\n\t\tfunc_nargs = DUK_HNATFUNC_NARGS_VARARGS;\n\t} else {\n\t\tgoto api_error;\n\t}\n\n\tobj = duk_hnatfunc_alloc(thr, flags);\n\tDUK_ASSERT(obj != NULL);\n\n\tobj->func = func;\n\tobj->nargs = func_nargs;\n\n\tDUK_DDD(DUK_DDDPRINT(\"created native function object with flags: 0x%08lx, nargs=%ld\",\n\t                     (unsigned long) obj->obj.hdr.h_flags, (long) obj->nargs));\n\n\ttv_slot = thr->valstack_top;\n\tDUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);\n\tDUK_HOBJECT_INCREF(thr, obj);\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n\tthr->valstack_top++;\n\n\tDUK_ASSERT_BIDX_VALID(proto_bidx);\n\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[proto_bidx]);\n\treturn ret;\n\n api_error:\n\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\treturn 0;  /* not reached */\n}\n\nDUK_EXTERNAL duk_idx_t duk_push_c_function(duk_hthread *thr, duk_c_function func, duk_int_t nargs) {\n\tduk_uint_t flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t        DUK_HOBJECT_FLAG_CONSTRUCTABLE |\n\t        DUK_HOBJECT_FLAG_CALLABLE |\n\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t        DUK_HOBJECT_FLAG_NATFUNC |\n\t        DUK_HOBJECT_FLAG_NEWENV |\n\t        DUK_HOBJECT_FLAG_STRICT |\n\t        DUK_HOBJECT_FLAG_NOTAIL |\n\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);\n\n\t/* Default prototype is a Duktape specific %NativeFunctionPrototype%\n\t * which provides .length and .name getters.\n\t */\n\treturn duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE);\n}\n\nDUK_INTERNAL void duk_push_c_function_builtin(duk_hthread *thr, duk_c_function func, duk_int_t nargs) {\n\tduk_uint_t flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t        DUK_HOBJECT_FLAG_CONSTRUCTABLE |\n\t        DUK_HOBJECT_FLAG_CALLABLE |\n\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t        DUK_HOBJECT_FLAG_NATFUNC |\n\t        DUK_HOBJECT_FLAG_NEWENV |\n\t        DUK_HOBJECT_FLAG_STRICT |\n\t        DUK_HOBJECT_FLAG_NOTAIL |\n\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);\n\n\t/* Must use Function.prototype for standard built-in functions. */\n\t(void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE);\n}\n\nDUK_INTERNAL void duk_push_c_function_builtin_noconstruct(duk_hthread *thr, duk_c_function func, duk_int_t nargs) {\n\tduk_uint_t flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t        DUK_HOBJECT_FLAG_CALLABLE |\n\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t        DUK_HOBJECT_FLAG_NATFUNC |\n\t        DUK_HOBJECT_FLAG_NEWENV |\n\t        DUK_HOBJECT_FLAG_STRICT |\n\t        DUK_HOBJECT_FLAG_NOTAIL |\n\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION);\n\n\t/* Must use Function.prototype for standard built-in functions. */\n\t(void) duk__push_c_function_raw(thr, func, nargs, flags, DUK_BIDX_FUNCTION_PROTOTYPE);\n}\n\nDUK_EXTERNAL duk_idx_t duk_push_c_lightfunc(duk_hthread *thr, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic) {\n\tduk_small_uint_t lf_flags;\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK__CHECK_SPACE();\n\n\tif (nargs >= DUK_LFUNC_NARGS_MIN && nargs <= DUK_LFUNC_NARGS_MAX) {\n\t\t/* as is */\n\t} else if (nargs == DUK_VARARGS) {\n\t\tnargs = DUK_LFUNC_NARGS_VARARGS;\n\t} else {\n\t\tgoto api_error;\n\t}\n\tif (DUK_UNLIKELY(!(length >= DUK_LFUNC_LENGTH_MIN && length <= DUK_LFUNC_LENGTH_MAX))) {\n\t\tgoto api_error;\n\t}\n\tif (DUK_UNLIKELY(!(magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX))) {\n\t\tgoto api_error;\n\t}\n\n\tlf_flags = DUK_LFUNC_FLAGS_PACK((duk_small_int_t) magic, (duk_small_uint_t) length, (duk_small_uint_t) nargs);\n\ttv_slot = thr->valstack_top++;\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_slot));\n\tDUK_TVAL_SET_LIGHTFUNC(tv_slot, func, lf_flags);\n\tDUK_ASSERT(tv_slot >= thr->valstack_bottom);\n\treturn (duk_idx_t) (tv_slot - thr->valstack_bottom);\n\n api_error:\n\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\treturn 0;  /* not reached */\n}\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_hbufobj *duk_push_bufobj_raw(duk_hthread *thr, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) {\n\tduk_hbufobj *obj;\n\tduk_tval *tv_slot;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(prototype_bidx >= 0);\n\n\tDUK__CHECK_SPACE();\n\n\tobj = duk_hbufobj_alloc(thr, hobject_flags_and_class);\n\tDUK_ASSERT(obj != NULL);\n\n\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) obj, thr->builtins[prototype_bidx]);\n\tDUK_ASSERT_HBUFOBJ_VALID(obj);\n\n\ttv_slot = thr->valstack_top;\n\tDUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj);\n\tDUK_HOBJECT_INCREF(thr, obj);\n\tthr->valstack_top++;\n\n\treturn obj;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/* XXX: There's quite a bit of overlap with buffer creation handling in\n * duk_bi_buffer.c.  Look for overlap and refactor.\n */\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n#define DUK__PACK_ARGS(classnum,protobidx,elemtype,elemshift,istypedarray) \\\n\t(((classnum) << 24) | ((protobidx) << 16) | ((elemtype) << 8) | ((elemshift) << 4) | (istypedarray))\n\nstatic const duk_uint32_t duk__bufobj_flags_lookup[] = {\n\t/* Node.js Buffers are Uint8Array instances which inherit from Buffer.prototype. */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_ARRAYBUFFER,       DUK_BIDX_ARRAYBUFFER_PROTOTYPE,       DUK_HBUFOBJ_ELEM_UINT8,        0, 0),  /* DUK_BUFOBJ_ARRAYBUFFER */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY,        DUK_BIDX_NODEJS_BUFFER_PROTOTYPE,     DUK_HBUFOBJ_ELEM_UINT8,        0, 1),  /* DUK_BUFOBJ_NODEJS_BUFFER */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_DATAVIEW,          DUK_BIDX_DATAVIEW_PROTOTYPE,          DUK_HBUFOBJ_ELEM_UINT8,        0, 0),  /* DUK_BUFOBJ_DATAVIEW */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT8ARRAY,         DUK_BIDX_INT8ARRAY_PROTOTYPE,         DUK_HBUFOBJ_ELEM_INT8,         0, 1),  /* DUK_BUFOBJ_INT8ARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY,        DUK_BIDX_UINT8ARRAY_PROTOTYPE,        DUK_HBUFOBJ_ELEM_UINT8,        0, 1),  /* DUK_BUFOBJ_UINT8ARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, DUK_HBUFOBJ_ELEM_UINT8CLAMPED, 0, 1),  /* DUK_BUFOBJ_UINT8CLAMPEDARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT16ARRAY,        DUK_BIDX_INT16ARRAY_PROTOTYPE,        DUK_HBUFOBJ_ELEM_INT16,        1, 1),  /* DUK_BUFOBJ_INT16ARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT16ARRAY,       DUK_BIDX_UINT16ARRAY_PROTOTYPE,       DUK_HBUFOBJ_ELEM_UINT16,       1, 1),  /* DUK_BUFOBJ_UINT16ARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT32ARRAY,        DUK_BIDX_INT32ARRAY_PROTOTYPE,        DUK_HBUFOBJ_ELEM_INT32,        2, 1),  /* DUK_BUFOBJ_INT32ARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT32ARRAY,       DUK_BIDX_UINT32ARRAY_PROTOTYPE,       DUK_HBUFOBJ_ELEM_UINT32,       2, 1),  /* DUK_BUFOBJ_UINT32ARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT32ARRAY,      DUK_BIDX_FLOAT32ARRAY_PROTOTYPE,      DUK_HBUFOBJ_ELEM_FLOAT32,      2, 1),  /* DUK_BUFOBJ_FLOAT32ARRAY */\n\tDUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT64ARRAY,      DUK_BIDX_FLOAT64ARRAY_PROTOTYPE,      DUK_HBUFOBJ_ELEM_FLOAT64,      3, 1)   /* DUK_BUFOBJ_FLOAT64ARRAY */\n};\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) {\n\tduk_hbufobj *h_bufobj;\n\tduk_hbuffer *h_val;\n\tduk_hobject *h_arraybuf;\n\tduk_uint32_t tmp;\n\tduk_uint_t classnum;\n\tduk_uint_t protobidx;\n\tduk_uint_t lookupidx;\n\tduk_uint_t uint_offset, uint_length, uint_added;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* The underlying types for offset/length in duk_hbufobj is\n\t * duk_uint_t; make sure argument values fit.\n\t */\n\tuint_offset = (duk_uint_t) byte_offset;\n\tuint_length = (duk_uint_t) byte_length;\n\tif (sizeof(duk_size_t) != sizeof(duk_uint_t)) {\n\t\tif (DUK_UNLIKELY((duk_size_t) uint_offset != byte_offset || (duk_size_t) uint_length != byte_length)) {\n\t\t\tgoto range_error;\n\t\t}\n\t}\n\n\tDUK_ASSERT_DISABLE(flags >= 0);  /* flags is unsigned */\n\tlookupidx = flags;\n\tif (DUK_UNLIKELY(lookupidx >= sizeof(duk__bufobj_flags_lookup) / sizeof(duk_uint32_t))) {\n\t\tgoto arg_error;\n\t}\n\ttmp = duk__bufobj_flags_lookup[lookupidx];\n\tclassnum = tmp >> 24;\n\tprotobidx = (tmp >> 16) & 0xff;\n\n\th_arraybuf = duk_get_hobject(thr, idx_buffer);\n\tif (h_arraybuf != NULL &&  /* argument is an object */\n\t    flags != DUK_BUFOBJ_ARRAYBUFFER &&  /* creating a view */\n\t    DUK_HOBJECT_GET_CLASS_NUMBER(h_arraybuf) == DUK_HOBJECT_CLASS_ARRAYBUFFER  /* argument is ArrayBuffer */) {\n\t\tduk_uint_t tmp_offset;\n\n\t\tDUK_ASSERT_HBUFOBJ_VALID((duk_hbufobj *) h_arraybuf);\n\t\th_val = ((duk_hbufobj *) h_arraybuf)->buf;\n\t\tif (DUK_UNLIKELY(h_val == NULL)) {\n\t\t\tgoto arg_error;\n\t\t}\n\n\t\ttmp_offset = uint_offset + ((duk_hbufobj *) h_arraybuf)->offset;\n\t\tif (DUK_UNLIKELY(tmp_offset < uint_offset)) {\n\t\t\tgoto range_error;\n\t\t}\n\t\tuint_offset = tmp_offset;\n\n\t\t/* Note intentional difference to new TypedArray(): we allow\n\t\t * caller to create an uncovered typed array (which is memory\n\t\t * safe); new TypedArray() rejects it.\n\t\t */\n\t} else {\n\t\t/* Handle unexpected object arguments here too, for nice error\n\t\t * messages.\n\t\t */\n\t\th_arraybuf = NULL;\n\t\th_val = duk_require_hbuffer(thr, idx_buffer);\n\t}\n\n\t/* Wrap check for offset+length. */\n\tuint_added = uint_offset + uint_length;\n\tif (DUK_UNLIKELY(uint_added < uint_offset)) {\n\t\tgoto range_error;\n\t}\n\tDUK_ASSERT(uint_added >= uint_offset && uint_added >= uint_length);\n\n\tDUK_ASSERT(h_val != NULL);\n\n\th_bufobj = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(classnum),\n\t                               (duk_small_int_t) protobidx);\n\tDUK_ASSERT(h_bufobj != NULL);\n\n\th_bufobj->buf = h_val;\n\tDUK_HBUFFER_INCREF(thr, h_val);\n\th_bufobj->buf_prop = h_arraybuf;\n\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, h_arraybuf);\n\th_bufobj->offset = uint_offset;\n\th_bufobj->length = uint_length;\n\th_bufobj->shift = (tmp >> 4) & 0x0f;\n\th_bufobj->elem_type = (tmp >> 8) & 0xff;\n\th_bufobj->is_typedarray = tmp & 0x0f;\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\t/* TypedArray views need an automatic ArrayBuffer which must be\n\t * provided as .buffer property of the view.  The ArrayBuffer is\n\t * referenced via duk_hbufobj->buf_prop and an inherited .buffer\n\t * accessor returns it.  The ArrayBuffer is created lazily on first\n\t * access if necessary so we don't need to do anything more here.\n\t */\n\treturn;\n\n range_error:\n\tDUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS);\n\treturn;  /* not reached */\n\n arg_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_ARGS);\n\treturn;  /* not reached */\n}\n#else  /* DUK_USE_BUFFEROBJECT_SUPPORT */\nDUK_EXTERNAL void duk_push_buffer_object(duk_hthread *thr, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(idx_buffer);\n\tDUK_UNREF(byte_offset);\n\tDUK_UNREF(byte_length);\n\tDUK_UNREF(flags);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\nDUK_EXTERNAL duk_idx_t duk_push_error_object_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) {\n\tduk_hobject *proto;\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\tduk_small_uint_t augment_flags;\n#endif\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr != NULL);\n\tDUK_UNREF(filename);\n\tDUK_UNREF(line);\n\n\t/* Error code also packs a tracedata related flag. */\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\taugment_flags = 0;\n\tif (err_code & DUK_ERRCODE_FLAG_NOBLAME_FILELINE) {\n\t\taugment_flags = DUK_AUGMENT_FLAG_NOBLAME_FILELINE;\n\t}\n#endif\n\terr_code = err_code & (~DUK_ERRCODE_FLAG_NOBLAME_FILELINE);\n\n\t/* error gets its 'name' from the prototype */\n\tproto = duk_error_prototype_from_code(thr, err_code);\n\t(void) duk_push_object_helper_proto(thr,\n\t                                    DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                    DUK_HOBJECT_FLAG_FASTREFS |\n\t                                    DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR),\n\t                                    proto);\n\n\t/* ... and its 'message' from an instance property */\n\tif (fmt) {\n\t\tduk_push_vsprintf(thr, fmt, ap);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC);\n\t} else {\n\t\t/* If no explicit message given, put error code into message field\n\t\t * (as a number).  This is not fully in keeping with the Ecmascript\n\t\t * error model because messages are supposed to be strings (Error\n\t\t * constructors use ToString() on their argument).  However, it's\n\t\t * probably more useful than having a separate 'code' property.\n\t\t */\n\t\tduk_push_int(thr, err_code);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC);\n\t}\n\n\t/* XXX: .code = err_code disabled, not sure if useful */\n\n\t/* Creation time error augmentation */\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\t/* filename may be NULL in which case file/line is not recorded */\n\tduk_err_augment_error_create(thr, thr, filename, line, augment_flags);  /* may throw an error */\n#endif\n\n\treturn duk_get_top_index_unsafe(thr);\n}\n\nDUK_EXTERNAL duk_idx_t duk_push_error_object_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) {\n\tva_list ap;\n\tduk_idx_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tva_start(ap, fmt);\n\tret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);\n\tva_end(ap);\n\treturn ret;\n}\n\n#if !defined(DUK_USE_VARIADIC_MACROS)\nDUK_EXTERNAL duk_idx_t duk_push_error_object_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) {\n\tconst char *filename = duk_api_global_filename;\n\tduk_int_t line = duk_api_global_line;\n\tva_list ap;\n\tduk_idx_t ret;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_api_global_filename = NULL;\n\tduk_api_global_line = 0;\n\tva_start(ap, fmt);\n\tret = duk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);\n\tva_end(ap);\n\treturn ret;\n}\n#endif  /* DUK_USE_VARIADIC_MACROS */\n\nDUK_EXTERNAL void *duk_push_buffer_raw(duk_hthread *thr, duk_size_t size, duk_small_uint_t flags) {\n\tduk_tval *tv_slot;\n\tduk_hbuffer *h;\n\tvoid *buf_data;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK__CHECK_SPACE();\n\n\t/* Check for maximum buffer length. */\n\tif (DUK_UNLIKELY(size > DUK_HBUFFER_MAX_BYTELEN)) {\n\t\tDUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG);\n\t}\n\n\th = duk_hbuffer_alloc(thr->heap, size, flags, &buf_data);\n\tif (DUK_UNLIKELY(h == NULL)) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\n\ttv_slot = thr->valstack_top;\n\tDUK_TVAL_SET_BUFFER(tv_slot, h);\n\tDUK_HBUFFER_INCREF(thr, h);\n\tthr->valstack_top++;\n\n\treturn (void *) buf_data;\n}\n\nDUK_INTERNAL void *duk_push_fixed_buffer_nozero(duk_hthread *thr, duk_size_t len) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_push_buffer_raw(thr, len, DUK_BUF_FLAG_NOZERO);\n}\n\nDUK_INTERNAL void *duk_push_fixed_buffer_zero(duk_hthread *thr, duk_size_t len) {\n\tvoid *ptr;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tptr = duk_push_buffer_raw(thr, len, 0);\n#if !defined(DUK_USE_ZERO_BUFFER_DATA)\n\t/* ES2015 requires zeroing even when DUK_USE_ZERO_BUFFER_DATA\n\t * is not set.\n\t */\n\tDUK_MEMZERO((void *) ptr, (size_t) len);\n#endif\n\treturn ptr;\n}\n\n#if defined(DUK_USE_ES6_PROXY)\nDUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) {\n\tduk_hobject *h_target;\n\tduk_hobject *h_handler;\n\tduk_hproxy *h_proxy;\n\tduk_tval *tv_slot;\n\tduk_uint_t flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(proxy_flags);\n\n\t/* DUK__CHECK_SPACE() unnecessary because the Proxy is written to\n\t * value stack in-place.\n\t */\n#if 0\n\tDUK__CHECK_SPACE();\n#endif\n\n\t/* Reject a proxy object as the target because it would need\n\t * special handling in property lookups.  (ES2015 has no such\n\t * restriction.)\n\t */\n\th_target = duk_require_hobject_promote_mask(thr, -2, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\tDUK_ASSERT(h_target != NULL);\n\tif (DUK_HOBJECT_IS_PROXY(h_target)) {\n\t\tgoto fail_args;\n\t}\n\n\t/* Reject a proxy object as the handler because it would cause\n\t * potentially unbounded recursion.  (ES2015 has no such\n\t * restriction.)\n\t *\n\t * There's little practical reason to use a lightfunc or a plain\n\t * buffer as the handler table: one could only provide traps via\n\t * their prototype objects (Function.prototype and ArrayBuffer.prototype).\n\t * Even so, as lightfuncs and plain buffers mimic their object\n\t * counterparts, they're promoted and accepted here.\n\t */\n\th_handler = duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\tDUK_ASSERT(h_handler != NULL);\n\tif (DUK_HOBJECT_IS_PROXY(h_handler)) {\n\t\tgoto fail_args;\n\t}\n\n\t/* XXX: Proxy object currently has no prototype, so ToPrimitive()\n\t * coercion fails which is a bit confusing.\n\t */\n\n\t/* CALLABLE and CONSTRUCTABLE flags are copied from the (initial)\n\t * target, see ES2015 Sections 9.5.15 and 9.5.13.\n\t */\n\tflags = DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h_target) &\n\t        (DUK_HOBJECT_FLAG_CALLABLE | DUK_HOBJECT_FLAG_CONSTRUCTABLE);\n\tflags |= DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t         DUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ;\n\tif (flags & DUK_HOBJECT_FLAG_CALLABLE) {\n\t\tflags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION) |\n\t\t         DUK_HOBJECT_FLAG_SPECIAL_CALL;\n\t} else {\n\t\tflags |= DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT);\n\t}\n\n\th_proxy = duk_hproxy_alloc(thr, flags);\n\tDUK_ASSERT(h_proxy != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_proxy) == NULL);\n\n\t/* Initialize Proxy target and handler references; avoid INCREF\n\t * by stealing the value stack refcounts via direct value stack\n\t * manipulation.  INCREF is needed for the Proxy itself however.\n\t */\n\tDUK_ASSERT(h_target != NULL);\n\th_proxy->target = h_target;\n\tDUK_ASSERT(h_handler != NULL);\n\th_proxy->handler = h_handler;\n\tDUK_ASSERT_HPROXY_VALID(h_proxy);\n\n\tDUK_ASSERT(duk_get_hobject(thr, -2) == h_target);\n\tDUK_ASSERT(duk_get_hobject(thr, -1) == h_handler);\n\ttv_slot = thr->valstack_top - 2;\n\tDUK_ASSERT(tv_slot >= thr->valstack_bottom);\n\tDUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) h_proxy);\n\tDUK_HOBJECT_INCREF(thr, (duk_hobject *) h_proxy);\n\ttv_slot++;\n\tDUK_TVAL_SET_UNDEFINED(tv_slot);  /* [ ... target handler ] -> [ ... proxy undefined ] */\n\tthr->valstack_top = tv_slot;      /* -> [ ... proxy ] */\n\n\tDUK_DD(DUK_DDPRINT(\"created Proxy: %!iT\", duk_get_tval(thr, -1)));\n\n\treturn (duk_idx_t) (thr->valstack_top - thr->valstack_bottom - 1);\n\n fail_args:\n\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n}\n#else  /* DUK_USE_ES6_PROXY */\nDUK_EXTERNAL duk_idx_t duk_push_proxy(duk_hthread *thr, duk_uint_t proxy_flags) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(proxy_flags);\n\tDUK_ERROR_UNSUPPORTED(thr);\n}\n#endif  /* DUK_USE_ES6_PROXY */\n\n#if defined(DUK_USE_ASSERTIONS)\nDUK_LOCAL void duk__validate_push_heapptr(duk_hthread *thr, void *ptr) {\n\tduk_heaphdr *h;\n\tduk_heaphdr *curr;\n\tduk_bool_t found = 0;\n\n\th = (duk_heaphdr *) ptr;\n\tif (h == NULL) {\n\t\t/* Allowed. */\n\t\treturn;\n\t}\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));\n\n\t/* One particular problem case is where an object has been\n\t * queued for finalization but the finalizer hasn't yet been\n\t * executed.\n\t *\n\t * Corner case: we're running in a finalizer for object X, and\n\t * user code calls duk_push_heapptr() for X itself.  In this\n\t * case X will be in finalize_list, and we can detect the case\n\t * by seeing that X's FINALIZED flag is set (which is done before\n\t * the finalizer starts executing).\n\t */\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tfor (curr = thr->heap->finalize_list;\n\t     curr != NULL;\n\t     curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) {\n\t\t/* FINALIZABLE is set for all objects on finalize_list\n\t\t * except for an object being finalized right now.  So\n\t\t * can't assert here.\n\t\t */\n#if 0\n\t\tDUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr));\n#endif\n\n\t\tif (curr == h) {\n\t\t\tif (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h)) {\n\t\t\t\t/* Object is currently being finalized. */\n\t\t\t\tDUK_ASSERT(found == 0);  /* Would indicate corrupted lists. */\n\t\t\t\tfound = 1;\n\t\t\t} else {\n\t\t\t\t/* Not being finalized but on finalize_list,\n\t\t\t\t * allowed since Duktape 2.1.\n\t\t\t\t */\n\t\t\t\tDUK_ASSERT(found == 0);  /* Would indicate corrupted lists. */\n\t\t\t\tfound = 1;\n\t\t\t}\n\t\t}\n\t}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t/* Because refzero_list is now processed to completion inline with\n\t * no side effects, it's always empty here.\n\t */\n\tDUK_ASSERT(thr->heap->refzero_list == NULL);\n#endif\n\n\t/* If not present in finalize_list (or refzero_list), it\n\t * must be either in heap_allocated or the string table.\n\t */\n\tif (DUK_HEAPHDR_IS_STRING(h)) {\n\t\tduk_uint32_t i;\n\t\tduk_hstring *str;\n\t\tduk_heap *heap = thr->heap;\n\n\t\tDUK_ASSERT(found == 0);\n\t\tfor (i = 0; i < heap->st_size; i++) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t\t\tstr = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]);\n#else\n\t\t\tstr = heap->strtable[i];\n#endif\n\t\t\twhile (str != NULL) {\n\t\t\t\tif (str == (duk_hstring *) h) {\n\t\t\t\t\tDUK_ASSERT(found == 0);  /* Would indicate corrupted lists. */\n\t\t\t\t\tfound = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tstr = str->hdr.h_next;\n\t\t\t}\n\t\t}\n\t\tDUK_ASSERT(found != 0);\n\t} else {\n\t\tfor (curr = thr->heap->heap_allocated;\n\t\t     curr != NULL;\n\t\t     curr = DUK_HEAPHDR_GET_NEXT(thr->heap, curr)) {\n\t\t\tif (curr == h) {\n\t\t\t\tDUK_ASSERT(found == 0);  /* Would indicate corrupted lists. */\n\t\t\t\tfound = 1;\n\t\t\t}\n\t\t}\n\t\tDUK_ASSERT(found != 0);\n\t}\n}\n#endif  /* DUK_USE_ASSERTIONS */\n\nDUK_EXTERNAL duk_idx_t duk_push_heapptr(duk_hthread *thr, void *ptr) {\n\tduk_idx_t ret;\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Reviving an object using a heap pointer is a dangerous API\n\t * operation: if the application doesn't guarantee that the\n\t * pointer target is always reachable, difficult-to-diagnose\n\t * problems may ensue.  Try to validate the 'ptr' argument to\n\t * the extent possible.\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\tduk__validate_push_heapptr(thr, ptr);\n#endif\n\n\tDUK__CHECK_SPACE();\n\n\tret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n\ttv = thr->valstack_top++;\n\n\tif (ptr == NULL) {\n\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));\n\t\treturn ret;\n\t}\n\n\tDUK_ASSERT_HEAPHDR_VALID((duk_heaphdr *) ptr);\n\n\t/* If the argument is on finalize_list it has technically been\n\t * unreachable before duk_push_heapptr() but it's still safe to\n\t * push it.  Starting from Duktape 2.1 allow application code to\n\t * do so.  There are two main cases:\n\t *\n\t *   (1) The object is on the finalize_list and we're called by\n\t *       the finalizer for the object being finalized.  In this\n\t *       case do nothing: finalize_list handling will deal with\n\t *       the object queueing.  This is detected by the object not\n\t *       having a FINALIZABLE flag despite being on the finalize_list;\n\t *       the flag is cleared for the object being finalized only.\n\t *\n\t *   (2) The object is on the finalize_list but is not currently\n\t *       being processed.  In this case the object can be queued\n\t *       back to heap_allocated with a few flags cleared, in effect\n\t *       cancelling the finalizer.\n\t */\n\tif (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) ptr))) {\n\t\tduk_heaphdr *curr;\n\n\t\tDUK_D(DUK_DPRINT(\"duk_push_heapptr() with a pointer on finalize_list, autorescue\"));\n\n\t\tcurr = (duk_heaphdr *) ptr;\n\t\tDUK_HEAPHDR_CLEAR_FINALIZABLE(curr);\n\n\t\t/* Because FINALIZED is set prior to finalizer call, it will\n\t\t * be set for the object being currently finalized, but not\n\t\t * for other objects on finalize_list.\n\t\t */\n\t\tDUK_HEAPHDR_CLEAR_FINALIZED(curr);\n\n\t\t/* Dequeue object from finalize_list and queue it back to\n\t\t * heap_allocated.\n\t\t */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1);  /* Preincremented on finalize_list insert. */\n\t\tDUK_HEAPHDR_PREDEC_REFCOUNT(curr);\n#endif\n\t\tDUK_HEAP_REMOVE_FROM_FINALIZE_LIST(thr->heap, curr);\n\t\tDUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(thr->heap, curr);\n\n\t\t/* Continue with the rest. */\n\t}\n\n\tswitch (DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr)) {\n\tcase DUK_HTYPE_STRING:\n\t\tDUK_TVAL_SET_STRING(tv, (duk_hstring *) ptr);\n\t\tbreak;\n\tcase DUK_HTYPE_OBJECT:\n\t\tDUK_TVAL_SET_OBJECT(tv, (duk_hobject *) ptr);\n\t\tbreak;\n\tdefault:\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr) == DUK_HTYPE_BUFFER);\n\t\tDUK_TVAL_SET_BUFFER(tv, (duk_hbuffer *) ptr);\n\t\tbreak;\n\t}\n\n\tDUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) ptr);\n\n\treturn ret;\n}\n\n/* Push object with no prototype, i.e. a \"bare\" object. */\nDUK_EXTERNAL duk_idx_t duk_push_bare_object(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t(void) duk_push_object_helper(thr,\n\t                              DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t                              DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),\n\t                              -1);  /* no prototype */\n\treturn duk_get_top_index_unsafe(thr);\n}\n\nDUK_INTERNAL void duk_push_hstring(duk_hthread *thr, duk_hstring *h) {\n\tduk_tval tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_TVAL_SET_STRING(&tv, h);\n\tduk_push_tval(thr, &tv);\n}\n\nDUK_INTERNAL void duk_push_hstring_stridx(duk_hthread *thr, duk_small_uint_t stridx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\tduk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, stridx));\n}\n\nDUK_INTERNAL void duk_push_hstring_empty(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_push_hstring(thr, DUK_HTHREAD_GET_STRING(thr, DUK_STRIDX_EMPTY_STRING));\n}\n\nDUK_INTERNAL void duk_push_hobject(duk_hthread *thr, duk_hobject *h) {\n\tduk_tval tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_TVAL_SET_OBJECT(&tv, h);\n\tduk_push_tval(thr, &tv);\n}\n\nDUK_INTERNAL void duk_push_hbuffer(duk_hthread *thr, duk_hbuffer *h) {\n\tduk_tval tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_TVAL_SET_BUFFER(&tv, h);\n\tduk_push_tval(thr, &tv);\n}\n\nDUK_INTERNAL void duk_push_hobject_bidx(duk_hthread *thr, duk_small_int_t builtin_idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(builtin_idx >= 0 && builtin_idx < DUK_NUM_BUILTINS);\n\tDUK_ASSERT(thr->builtins[builtin_idx] != NULL);\n\n\tduk_push_hobject(thr, thr->builtins[builtin_idx]);\n}\n\n/*\n *  Poppers\n */\n\nDUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_n_unsafe_raw(duk_hthread *thr, duk_idx_t count) {\n\tduk_tval *tv;\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk_tval *tv_end;\n#endif\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(count >= 0);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count);\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\ttv = thr->valstack_top;\n\ttv_end = tv - count;\n\twhile (tv != tv_end) {\n\t\ttv--;\n\t\tDUK_ASSERT(tv >= thr->valstack_bottom);\n\t\tDUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);\n\t}\n\tthr->valstack_top = tv;\n\tDUK_REFZERO_CHECK_FAST(thr);\n#else\n\ttv = thr->valstack_top;\n\twhile (count > 0) {\n\t\tcount--;\n\t\ttv--;\n\t\tDUK_ASSERT(tv >= thr->valstack_bottom);\n\t\tDUK_TVAL_SET_UNDEFINED(tv);\n\t}\n\tthr->valstack_top = tv;\n#endif\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n}\n\nDUK_EXTERNAL void duk_pop_n(duk_hthread *thr, duk_idx_t count) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\n\tif (DUK_UNLIKELY((duk_uidx_t) (thr->valstack_top - thr->valstack_bottom) < (duk_uidx_t) count)) {\n\t\tDUK_ERROR_RANGE_INVALID_COUNT(thr);\n\t\treturn;\n\t}\n\tDUK_ASSERT(count >= 0);\n\n\tduk__pop_n_unsafe_raw(thr, count);\n}\n\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n(thr, count);\n}\n#else  /* DUK_USE_PREFER_SIZE */\nDUK_INTERNAL void duk_pop_n_unsafe(duk_hthread *thr, duk_idx_t count) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk__pop_n_unsafe_raw(thr, count);\n}\n#endif  /* DUK_USE_PREFER_SIZE */\n\n/* Pop N elements without DECREF (in effect \"stealing\" any actual refcounts). */\n#if defined(DUK_USE_REFERENCE_COUNTING)\nDUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(count >= 0);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) count);\n\n\ttv = thr->valstack_top;\n\twhile (count > 0) {\n\t\tcount--;\n\t\ttv--;\n\t\tDUK_ASSERT(tv >= thr->valstack_bottom);\n\t\tDUK_TVAL_SET_UNDEFINED(tv);\n\t}\n\tthr->valstack_top = tv;\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n}\n#else  /* DUK_USE_REFERENCE_COUNTING */\nDUK_INTERNAL void duk_pop_n_nodecref_unsafe(duk_hthread *thr, duk_idx_t count) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n_unsafe(thr, count);\n}\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n/* Popping one element is called so often that when footprint is not an issue,\n * compile a specialized function for it.\n */\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_EXTERNAL void duk_pop(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n(thr, 1);\n}\nDUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n_unsafe(thr, 1);\n}\nDUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n_nodecref_unsafe(thr, 1);\n}\n#else  /* DUK_USE_PREFER_SIZE */\nDUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_unsafe_raw(duk_hthread *thr) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(thr->valstack_top != thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1);\n\n\ttv = --thr->valstack_top;\n\tDUK_ASSERT(tv >= thr->valstack_bottom);\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv);  /* side effects */\n#else\n\tDUK_TVAL_SET_UNDEFINED(tv);\n#endif\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n}\nDUK_EXTERNAL void duk_pop(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tif (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) {\n\t\tDUK_ERROR_RANGE_INVALID_COUNT(thr);\n\t}\n\n\tduk__pop_unsafe_raw(thr);\n}\nDUK_INTERNAL void duk_pop_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk__pop_unsafe_raw(thr);\n}\nDUK_INTERNAL void duk_pop_nodecref_unsafe(duk_hthread *thr) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->valstack_top != thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1);\n\n\ttv = --thr->valstack_top;\n\tDUK_ASSERT(tv >= thr->valstack_bottom);\n\tDUK_TVAL_SET_UNDEFINED(tv);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n}\n#endif  /* !DUK_USE_PREFER_SIZE */\n\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_nodecref_unsafe(thr);\n}\n#else  /* DUK_USE_PREFER_SIZE */\nDUK_INTERNAL void duk_pop_undefined(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->valstack_top != thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 1);\n\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1));\n\tthr->valstack_top--;\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n}\n#endif  /* !DUK_USE_PREFER_SIZE */\n\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_EXTERNAL void duk_pop_2(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n(thr, 2);\n}\nDUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n_unsafe(thr, 2);\n}\nDUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n_nodecref_unsafe(thr, 2);\n}\n#else\nDUK_LOCAL DUK_ALWAYS_INLINE void duk__pop_2_unsafe_raw(duk_hthread *thr) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(thr->valstack_top != thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2);\n\n\ttv = --thr->valstack_top;\n\tDUK_ASSERT(tv >= thr->valstack_bottom);\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv);  /* side effects */\n#else\n\tDUK_TVAL_SET_UNDEFINED(tv);\n#endif\n\ttv = --thr->valstack_top;\n\tDUK_ASSERT(tv >= thr->valstack_bottom);\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv);  /* side effects */\n#else\n\tDUK_TVAL_SET_UNDEFINED(tv);\n#endif\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n}\nDUK_EXTERNAL void duk_pop_2(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tif (DUK_UNLIKELY(thr->valstack_top - 2 < thr->valstack_bottom)) {\n\t\tDUK_ERROR_RANGE_INVALID_COUNT(thr);\n\t}\n\n\tduk__pop_2_unsafe_raw(thr);\n}\nDUK_INTERNAL void duk_pop_2_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk__pop_2_unsafe_raw(thr);\n}\nDUK_INTERNAL void duk_pop_2_nodecref_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->valstack_top != thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) >= (duk_size_t) 2);\n\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 1));\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top - 2));\n\tthr->valstack_top -= 2;\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n}\n#endif  /* !DUK_USE_PREFER_SIZE */\n\nDUK_EXTERNAL void duk_pop_3(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n(thr, 3);\n}\n\nDUK_INTERNAL void duk_pop_3_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n_unsafe(thr, 3);\n}\n\nDUK_INTERNAL void duk_pop_3_nodecref_unsafe(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_pop_n_nodecref_unsafe(thr, 3);\n}\n\n/*\n *  Pack and unpack (pack value stack entries into an array and vice versa)\n */\n\n/* XXX: pack index range? array index offset? */\nDUK_INTERNAL void duk_pack(duk_hthread *thr, duk_idx_t count) {\n\tduk_tval *tv_src;\n\tduk_tval *tv_dst;\n\tduk_tval *tv_curr;\n\tduk_tval *tv_limit;\n\tduk_idx_t top;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\ttop = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n\tDUK_ASSERT(top >= 0);\n\tif (DUK_UNLIKELY((duk_uidx_t) count > (duk_uidx_t) top)) {\n\t\t/* Also handles negative count. */\n\t\tDUK_ERROR_RANGE_INVALID_COUNT(thr);\n\t\treturn;\n\t}\n\tDUK_ASSERT(count >= 0);\n\n\t/* Wrapping is controlled by the check above: value stack top can be\n\t * at most DUK_USE_VALSTACK_LIMIT which is low enough so that\n\t * multiplying with sizeof(duk_tval) won't wrap.\n\t */\n\tDUK_ASSERT(count >= 0 && count <= (duk_idx_t) DUK_USE_VALSTACK_LIMIT);\n\tDUK_ASSERT((duk_size_t) count <= DUK_SIZE_MAX / sizeof(duk_tval));  /* no wrapping */\n\n\ttv_dst = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count);  /* XXX: uninitialized would be OK */\n\tDUK_ASSERT(count == 0 || tv_dst != NULL);\n\n\t/* Copy value stack values directly to the array part without\n\t * any refcount updates: net refcount changes are zero.\n\t */\n\n\ttv_src = thr->valstack_top - count - 1;\n\tDUK_MEMCPY((void *) tv_dst, (const void *) tv_src, (size_t) count * sizeof(duk_tval));\n\n\t/* Overwrite result array to final value stack location and wipe\n\t * the rest; no refcount operations needed.\n\t */\n\n\ttv_dst = tv_src;  /* when count == 0, same as tv_src (OK) */\n\ttv_src = thr->valstack_top - 1;\n\tDUK_TVAL_SET_TVAL(tv_dst, tv_src);\n\n\t/* XXX: internal helper to wipe a value stack segment? */\n\ttv_curr = tv_dst + 1;\n\ttv_limit = thr->valstack_top;\n\twhile (tv_curr != tv_limit) {\n\t\t/* Wipe policy: keep as 'undefined'. */\n\t\tDUK_TVAL_SET_UNDEFINED(tv_curr);\n\t\ttv_curr++;\n\t}\n\tthr->valstack_top = tv_dst + 1;\n}\n\nDUK_INTERNAL duk_idx_t duk_unpack_array_like(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv = duk_require_tval(thr, idx);\n\tif (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv))) {\n\t\tduk_hobject *h;\n\t\tduk_uint32_t len;\n\t\tduk_uint32_t i;\n\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tDUK_UNREF(h);\n\n#if defined(DUK_USE_ARRAY_FASTPATH)  /* close enough */\n\t\tif (DUK_LIKELY(DUK_HOBJECT_IS_ARRAY(h) &&\n\t\t               ((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h))) {\n\t\t\tduk_harray *h_arr;\n\t\t\tduk_tval *tv_src;\n\t\t\tduk_tval *tv_dst;\n\n\t\t\th_arr = (duk_harray *) h;\n\t\t\tlen = h_arr->length;\n\t\t\tif (DUK_UNLIKELY(len >= 0x80000000UL)) {\n\t\t\t\tgoto fail_over_2g;\n\t\t\t}\n\t\t\tduk_require_stack(thr, (duk_idx_t) len);\n\n\t\t\t/* The potential allocation in duk_require_stack() may\n\t\t\t * run a finalizer which modifies the argArray so that\n\t\t\t * e.g. becomes sparse.  So, we need to recheck that the\n\t\t\t * array didn't change size and that there's still a\n\t\t\t * valid backing array part.\n\t\t\t *\n\t\t\t * XXX: alternatively, could prevent finalizers for the\n\t\t\t * duration.\n\t\t\t */\n\t\t\tif (DUK_UNLIKELY(len != h_arr->length ||\n\t\t\t                 h_arr->length > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr))) {\n\t\t\t\tgoto skip_fast;\n\t\t\t}\n\n\t\t\t/* Main fast path: arguments array is almost always\n\t\t\t * an actual array (though it might also be an arguments\n\t\t\t * object).\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"fast path for %ld elements\", (long) h_arr->length));\n\t\t\ttv_src = DUK_HOBJECT_A_GET_BASE(thr->heap, h);\n\t\t\ttv_dst = thr->valstack_top;\n\t\t\twhile (len-- > 0) {\n\t\t\t\tDUK_ASSERT(tv_dst < thr->valstack_end);\n\t\t\t\tif (DUK_UNLIKELY(DUK_TVAL_IS_UNUSED(tv_src))) {\n\t\t\t\t\t/* Gaps are very unlikely.  Skip over them,\n\t\t\t\t\t * without an ancestor lookup (technically\n\t\t\t\t\t * not compliant).\n\t\t\t\t\t */\n\t\t\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_dst));  /* valstack policy */\n\t\t\t\t} else {\n\t\t\t\t\tDUK_TVAL_SET_TVAL(tv_dst, tv_src);\n\t\t\t\t\tDUK_TVAL_INCREF(thr, tv_dst);\n\t\t\t\t}\n\t\t\t\ttv_src++;\n\t\t\t\ttv_dst++;\n\t\t\t}\n\t\t\tDUK_ASSERT(tv_dst <= thr->valstack_end);\n\t\t\tthr->valstack_top = tv_dst;\n\t\t\treturn (duk_idx_t) h_arr->length;\n\t\t}\n\t skip_fast:\n#endif  /* DUK_USE_ARRAY_FASTPATH */\n\n\t\t/* Slow path: actual lookups.  The initial 'length' lookup\n\t\t * decides the output length, regardless of side effects that\n\t\t * may resize or change the argArray while we read the\n\t\t * indices.\n\t\t */\n\t\tidx = duk_normalize_index(thr, idx);\n\t\tduk_get_prop_stridx(thr, idx, DUK_STRIDX_LENGTH);\n\t\tlen = duk_to_uint32(thr, -1);  /* ToUint32() coercion required */\n\t\tif (DUK_UNLIKELY(len >= 0x80000000UL)) {\n\t\t\tgoto fail_over_2g;\n\t\t}\n\t\tduk_pop_unsafe(thr);\n\t\tDUK_DDD(DUK_DDDPRINT(\"slow path for %ld elements\", (long) len));\n\n\t\tduk_require_stack(thr, (duk_idx_t) len);\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tduk_get_prop_index(thr, idx, (duk_uarridx_t) i);\n\t\t}\n\t\treturn (duk_idx_t) len;\n\t} else if (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv)) {\n\t\treturn 0;\n\t}\n\n\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\treturn 0;\n\n fail_over_2g:\n\tDUK_ERROR_RANGE_INVALID_LENGTH(thr);\n\treturn 0;\n}\n\n/*\n *  Error throwing\n */\n\nDUK_EXTERNAL void duk_throw_raw(duk_hthread *thr) {\n\tduk_tval *tv_val;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr->valstack_bottom >= thr->valstack);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_top);\n\n\tif (DUK_UNLIKELY(thr->valstack_top == thr->valstack_bottom)) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\t/* Errors are augmented when they are created, not when they are\n\t * thrown or re-thrown.  The current error handler, however, runs\n\t * just before an error is thrown.\n\t */\n\n\t/* Sync so that augmentation sees up-to-date activations, NULL\n\t * thr->ptr_curr_pc so that it's not used if side effects occur\n\t * in augmentation or longjmp handling.\n\t */\n\tduk_hthread_sync_and_null_currpc(thr);\n\n#if defined(DUK_USE_AUGMENT_ERROR_THROW)\n\tDUK_DDD(DUK_DDDPRINT(\"THROW ERROR (API): %!dT (before throw augment)\", (duk_tval *) duk_get_tval(thr, -1)));\n\tduk_err_augment_error_throw(thr);\n#endif\n\tDUK_DDD(DUK_DDDPRINT(\"THROW ERROR (API): %!dT (after throw augment)\", (duk_tval *) duk_get_tval(thr, -1)));\n\n\ttv_val = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tduk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, tv_val);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tduk_err_check_debugger_integration(thr);\n#endif\n\n\t/* thr->heap->lj.jmpbuf_ptr is checked by duk_err_longjmp() so we don't\n\t * need to check that here.  If the value is NULL, a fatal error occurs\n\t * because we can't return.\n\t */\n\n\tduk_err_longjmp(thr);\n\tDUK_UNREACHABLE();\n}\n\nDUK_EXTERNAL void duk_fatal_raw(duk_hthread *thr, const char *err_msg) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(thr->heap->fatal_func != NULL);\n\n\tDUK_D(DUK_DPRINT(\"fatal error occurred: %s\", err_msg ? err_msg : \"NULL\"));\n\n\t/* fatal_func should be noreturn, but noreturn declarations on function\n\t * pointers has a very spotty support apparently so it's not currently\n\t * done.\n\t */\n\tthr->heap->fatal_func(thr->heap->heap_udata, err_msg);\n\n\t/* If the fatal handler returns, all bets are off.  It'd be nice to\n\t * print something here but since we don't want to depend on stdio,\n\t * there's no way to do so portably.\n\t */\n\tDUK_D(DUK_DPRINT(\"fatal error handler returned, all bets are off!\"));\n\tfor (;;) {\n\t\t/* loop forever, don't return (function marked noreturn) */\n\t}\n}\n\nDUK_EXTERNAL void duk_error_va_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);\n\t(void) duk_throw(thr);\n}\n\nDUK_EXTERNAL void duk_error_raw(duk_hthread *thr, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) {\n\tva_list ap;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tva_start(ap, fmt);\n\tduk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);\n\tva_end(ap);\n\t(void) duk_throw(thr);\n}\n\n#if !defined(DUK_USE_VARIADIC_MACROS)\nDUK_NORETURN(DUK_LOCAL_DECL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap));\n\nDUK_LOCAL void duk__throw_error_from_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, va_list ap) {\n\tconst char *filename;\n\tduk_int_t line;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\tfilename = duk_api_global_filename;\n\tline = duk_api_global_line;\n\tduk_api_global_filename = NULL;\n\tduk_api_global_line = 0;\n\n\tduk_push_error_object_va_raw(thr, err_code, filename, line, fmt, ap);\n\t(void) duk_throw(thr);\n}\n\n#define DUK__ERROR_STASH_SHARED(code) do { \\\n\t\tva_list ap; \\\n\t\tva_start(ap, fmt); \\\n\t\tduk__throw_error_from_stash(thr, (code), fmt, ap); \\\n\t\tva_end(ap); \\\n\t\t/* Never reached; if return 0 here, gcc/clang will complain. */ \\\n\t} while (0)\n\nDUK_EXTERNAL duk_ret_t duk_error_stash(duk_hthread *thr, duk_errcode_t err_code, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(err_code);\n}\nDUK_EXTERNAL duk_ret_t duk_generic_error_stash(duk_hthread *thr, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(DUK_ERR_ERROR);\n}\nDUK_EXTERNAL duk_ret_t duk_eval_error_stash(duk_hthread *thr, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(DUK_ERR_EVAL_ERROR);\n}\nDUK_EXTERNAL duk_ret_t duk_range_error_stash(duk_hthread *thr, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(DUK_ERR_RANGE_ERROR);\n}\nDUK_EXTERNAL duk_ret_t duk_reference_error_stash(duk_hthread *thr, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(DUK_ERR_REFERENCE_ERROR);\n}\nDUK_EXTERNAL duk_ret_t duk_syntax_error_stash(duk_hthread *thr, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(DUK_ERR_SYNTAX_ERROR);\n}\nDUK_EXTERNAL duk_ret_t duk_type_error_stash(duk_hthread *thr, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(DUK_ERR_TYPE_ERROR);\n}\nDUK_EXTERNAL duk_ret_t duk_uri_error_stash(duk_hthread *thr, const char *fmt, ...) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK__ERROR_STASH_SHARED(DUK_ERR_URI_ERROR);\n}\n#endif  /* DUK_USE_VARIADIC_MACROS */\n\n/*\n *  Comparison\n */\n\nDUK_EXTERNAL duk_bool_t duk_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {\n\tduk_tval *tv1, *tv2;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv1 = duk_get_tval(thr, idx1);\n\ttv2 = duk_get_tval(thr, idx2);\n\tif ((tv1 == NULL) || (tv2 == NULL)) {\n\t\treturn 0;\n\t}\n\n\t/* Coercion may be needed, the helper handles that by pushing the\n\t * tagged values to the stack.\n\t */\n\treturn duk_js_equals(thr, tv1, tv2);\n}\n\nDUK_EXTERNAL duk_bool_t duk_strict_equals(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {\n\tduk_tval *tv1, *tv2;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv1 = duk_get_tval(thr, idx1);\n\ttv2 = duk_get_tval(thr, idx2);\n\tif ((tv1 == NULL) || (tv2 == NULL)) {\n\t\treturn 0;\n\t}\n\n\t/* No coercions or other side effects, so safe */\n\treturn duk_js_strict_equals(tv1, tv2);\n}\n\nDUK_EXTERNAL duk_bool_t duk_samevalue(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {\n\tduk_tval *tv1, *tv2;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\ttv1 = duk_get_tval(thr, idx1);\n\ttv2 = duk_get_tval(thr, idx2);\n\tif ((tv1 == NULL) || (tv2 == NULL)) {\n\t\treturn 0;\n\t}\n\n\t/* No coercions or other side effects, so safe */\n\treturn duk_js_samevalue(tv1, tv2);\n}\n\n/*\n *  instanceof\n */\n\nDUK_EXTERNAL duk_bool_t duk_instanceof(duk_hthread *thr, duk_idx_t idx1, duk_idx_t idx2) {\n\tduk_tval *tv1, *tv2;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* Index validation is strict, which differs from duk_equals().\n\t * The strict behavior mimics how instanceof itself works, e.g.\n\t * it is a TypeError if rval is not a -callable- object.  It would\n\t * be somewhat inconsistent if rval would be allowed to be\n\t * non-existent without a TypeError.\n\t */\n\ttv1 = duk_require_tval(thr, idx1);\n\tDUK_ASSERT(tv1 != NULL);\n\ttv2 = duk_require_tval(thr, idx2);\n\tDUK_ASSERT(tv2 != NULL);\n\n\treturn duk_js_instanceof(thr, tv1, tv2);\n}\n\n/*\n *  Lightfunc\n */\n\nDUK_INTERNAL void duk_push_lightfunc_name_raw(duk_hthread *thr, duk_c_function func, duk_small_uint_t lf_flags) {\n\t/* Lightfunc name, includes Duktape/C native function pointer, which\n\t * can often be used to locate the function from a symbol table.\n\t * The name also includes the 16-bit duk_tval flags field because it\n\t * includes the magic value.  Because a single native function often\n\t * provides different functionality depending on the magic value, it\n\t * seems reasonably to include it in the name.\n\t *\n\t * On the other hand, a complicated name increases string table\n\t * pressure in low memory environments (but only when function name\n\t * is accessed).\n\t */\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk_push_sprintf(thr, \"light_\");\n\tduk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func));\n\tduk_push_sprintf(thr, \"_%04x\", (unsigned int) lf_flags);\n\tduk_concat(thr, 3);\n}\n\nDUK_INTERNAL void duk_push_lightfunc_name(duk_hthread *thr, duk_tval *tv) {\n\tduk_c_function func;\n\tduk_small_uint_t lf_flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv));\n\n\tDUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags);\n\tduk_push_lightfunc_name_raw(thr, func, lf_flags);\n}\n\nDUK_INTERNAL void duk_push_lightfunc_tostring(duk_hthread *thr, duk_tval *tv) {\n\tduk_c_function func;\n\tduk_small_uint_t lf_flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv));\n\n\tDUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags);  /* read before 'tv' potentially invalidated */\n\tduk_push_string(thr, \"function \");\n\tduk_push_lightfunc_name_raw(thr, func, lf_flags);\n\tduk_push_string(thr, \"() { [lightfunc code] }\");\n\tduk_concat(thr, 3);\n}\n\n/*\n *  Function pointers\n *\n *  Printing function pointers is non-portable, so we do that by hex printing\n *  bytes from memory.\n */\n\nDUK_INTERNAL void duk_push_string_funcptr(duk_hthread *thr, duk_uint8_t *ptr, duk_size_t sz) {\n\tduk_uint8_t buf[32 * 2];\n\tduk_uint8_t *p, *q;\n\tduk_small_uint_t i;\n\tduk_small_uint_t t;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(sz <= 32);  /* sanity limit for function pointer size */\n\n\tp = buf;\n#if defined(DUK_USE_INTEGER_LE)\n\tq = ptr + sz;\n#else\n\tq = ptr;\n#endif\n\tfor (i = 0; i < sz; i++) {\n#if defined(DUK_USE_INTEGER_LE)\n\t\tt = *(--q);\n#else\n\t\tt = *(q++);\n#endif\n\t\t*p++ = duk_lc_digits[t >> 4];\n\t\t*p++ = duk_lc_digits[t & 0x0f];\n\t}\n\n\tduk_push_lstring(thr, (const char *) buf, sz * 2);\n}\n\n/*\n *  Push readable string summarizing duk_tval.  The operation is side effect\n *  free and will only throw from internal errors (e.g. out of memory).\n *  This is used by e.g. property access code to summarize a key/base safely,\n *  and is not intended to be fast (but small and safe).\n */\n\n/* String limits for summary strings. */\n#define DUK__READABLE_SUMMARY_MAXCHARS 96  /* maximum supported by helper */\n#define DUK__READABLE_STRING_MAXCHARS  32  /* for strings/symbols */\n#define DUK__READABLE_ERRMSG_MAXCHARS  96  /* for error messages */\n\n/* String sanitizer which escapes ASCII control characters and a few other\n * ASCII characters, passes Unicode as is, and replaces invalid UTF-8 with\n * question marks.  No errors are thrown for any input string, except in out\n * of memory situations.\n */\nDUK_LOCAL void duk__push_hstring_readable_unicode(duk_hthread *thr, duk_hstring *h_input, duk_small_uint_t maxchars) {\n\tconst duk_uint8_t *p, *p_start, *p_end;\n\tduk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH * DUK__READABLE_SUMMARY_MAXCHARS +\n\t                2 /*quotes*/ + 3 /*periods*/];\n\tduk_uint8_t *q;\n\tduk_ucodepoint_t cp;\n\tduk_small_uint_t nchars;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(h_input != NULL);\n\tDUK_ASSERT(maxchars <= DUK__READABLE_SUMMARY_MAXCHARS);\n\n\tp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);\n\tp = p_start;\n\tq = buf;\n\n\tnchars = 0;\n\t*q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE;\n\tfor (;;) {\n\t\tif (p >= p_end) {\n\t\t\tbreak;\n\t\t}\n\t\tif (nchars == maxchars) {\n\t\t\t*q++ = (duk_uint8_t) DUK_ASC_PERIOD;\n\t\t\t*q++ = (duk_uint8_t) DUK_ASC_PERIOD;\n\t\t\t*q++ = (duk_uint8_t) DUK_ASC_PERIOD;\n\t\t\tbreak;\n\t\t}\n\t\tif (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) {\n\t\t\tif (cp < 0x20 || cp == 0x7f || cp == DUK_ASC_SINGLEQUOTE || cp == DUK_ASC_BACKSLASH) {\n\t\t\t\tDUK_ASSERT(DUK_UNICODE_MAX_XUTF8_LENGTH >= 4);  /* estimate is valid */\n\t\t\t\tDUK_ASSERT((cp >> 4) <= 0x0f);\n\t\t\t\t*q++ = (duk_uint8_t) DUK_ASC_BACKSLASH;\n\t\t\t\t*q++ = (duk_uint8_t) DUK_ASC_LC_X;\n\t\t\t\t*q++ = (duk_uint8_t) duk_lc_digits[cp >> 4];\n\t\t\t\t*q++ = (duk_uint8_t) duk_lc_digits[cp & 0x0f];\n\t\t\t} else {\n\t\t\t\tq += duk_unicode_encode_xutf8(cp, q);\n\t\t\t}\n\t\t} else {\n\t\t\tp++;  /* advance manually */\n\t\t\t*q++ = (duk_uint8_t) DUK_ASC_QUESTION;\n\t\t}\n\t\tnchars++;\n\t}\n\t*q++ = (duk_uint8_t) DUK_ASC_SINGLEQUOTE;\n\n\tduk_push_lstring(thr, (const char *) buf, (duk_size_t) (q - buf));\n}\n\nDUK_LOCAL const char *duk__push_string_tval_readable(duk_hthread *thr, duk_tval *tv, duk_bool_t error_aware) {\n\tDUK_ASSERT_CTX_VALID(thr);\n\t/* 'tv' may be NULL */\n\n\tif (tv == NULL) {\n\t\tduk_push_string(thr, \"none\");\n\t} else {\n\t\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\t\tcase DUK_TAG_STRING: {\n\t\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv);\n\t\t\tif (DUK_HSTRING_HAS_SYMBOL(h)) {\n\t\t\t\t/* XXX: string summary produces question marks\n\t\t\t\t * so this is not very ideal.\n\t\t\t\t */\n\t\t\t\tduk_push_string(thr, \"[Symbol \");\n\t\t\t\tduk_push_string(thr, duk__get_symbol_type_string(h));\n\t\t\t\tduk_push_string(thr, \" \");\n\t\t\t\tduk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS);\n\t\t\t\tduk_push_string(thr, \"]\");\n\t\t\t\tduk_concat(thr, 5);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tduk__push_hstring_readable_unicode(thr, h, DUK__READABLE_STRING_MAXCHARS);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_TAG_OBJECT: {\n\t\t\tduk_hobject *h = DUK_TVAL_GET_OBJECT(tv);\n\t\t\tDUK_ASSERT(h != NULL);\n\n\t\t\tif (error_aware &&\n\t\t\t    duk_hobject_prototype_chain_contains(thr, h, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) {\n\t\t\t\t/* Get error message in a side effect free way if\n\t\t\t\t * possible; if not, summarize as a generic object.\n\t\t\t\t * Error message currently gets quoted.\n\t\t\t\t */\n\t\t\t\t/* XXX: better internal getprop call; get without side effects\n\t\t\t\t * but traverse inheritance chain.\n\t\t\t\t */\n\t\t\t\tduk_tval *tv_msg;\n\t\t\t\ttv_msg = duk_hobject_find_existing_entry_tval_ptr(thr->heap, h, DUK_HTHREAD_STRING_MESSAGE(thr));\n\t\t\t\tif (tv_msg != NULL && DUK_TVAL_IS_STRING(tv_msg)) {\n\t\t\t\t\t/* It's critical to avoid recursion so\n\t\t\t\t\t * only summarize a string .message.\n\t\t\t\t\t */\n\t\t\t\t\tduk__push_hstring_readable_unicode(thr, DUK_TVAL_GET_STRING(tv_msg), DUK__READABLE_ERRMSG_MAXCHARS);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tduk_push_class_string_tval(thr, tv);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_TAG_BUFFER: {\n\t\t\t/* While plain buffers mimic Uint8Arrays, they summarize differently.\n\t\t\t * This is useful so that the summarized string accurately reflects the\n\t\t\t * internal type which may matter for figuring out bugs etc.\n\t\t\t */\n\t\t\t/* XXX: Hex encoded, length limited buffer summary here? */\n\t\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv);\n\t\t\tDUK_ASSERT(h != NULL);\n\t\t\tduk_push_sprintf(thr, \"[buffer:%ld]\", (long) DUK_HBUFFER_GET_SIZE(h));\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_TAG_POINTER: {\n\t\t\t/* Surround with parentheses like in JX, ensures NULL pointer\n\t\t\t * is distinguishable from null value (\"(null)\" vs \"null\").\n\t\t\t */\n\t\t\tduk_push_tval(thr, tv);\n\t\t\tduk_push_sprintf(thr, \"(%s)\", duk_to_string(thr, -1));\n\t\t\tduk_remove_m2(thr);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tduk_push_tval(thr, tv);\n\t\t\tbreak;\n\t\t}\n\t\t}\n\t}\n\n\treturn duk_to_string(thr, -1);\n}\nDUK_INTERNAL const char *duk_push_string_tval_readable(duk_hthread *thr, duk_tval *tv) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__push_string_tval_readable(thr, tv, 0 /*error_aware*/);\n}\n\nDUK_INTERNAL const char *duk_push_string_readable(duk_hthread *thr, duk_idx_t idx) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk_push_string_tval_readable(thr, duk_get_tval(thr, idx));\n}\n\nDUK_INTERNAL const char *duk_push_string_tval_readable_error(duk_hthread *thr, duk_tval *tv) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\treturn duk__push_string_tval_readable(thr, tv, 1 /*error_aware*/);\n}\n\nDUK_INTERNAL void duk_push_symbol_descriptive_string(duk_hthread *thr, duk_hstring *h) {\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_end;\n\tconst duk_uint8_t *q;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* .toString() */\n\tduk_push_string(thr, \"Symbol(\");\n\tp = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);\n\tp_end = p + DUK_HSTRING_GET_BYTELEN(h);\n\tDUK_ASSERT(p[0] == 0xff || (p[0] & 0xc0) == 0x80);\n\tp++;\n\tfor (q = p; q < p_end; q++) {\n\t\tif (*q == 0xffU) {\n\t\t\t/* Terminate either at end-of-string (but NUL MUST\n\t\t\t * be accepted without terminating description) or\n\t\t\t * 0xFF, which is used to mark start of unique trailer\n\t\t\t * (and cannot occur in CESU-8 / extended UTF-8).\n\t\t\t */\n\t\t\tbreak;\n\t\t}\n\t}\n\tduk_push_lstring(thr, (const char *) p, (duk_size_t) (q - p));\n\tduk_push_string(thr, \")\");\n\tduk_concat(thr, 3);\n}\n\n/*\n *  Functions\n */\n\n#if 0  /* not used yet */\nDUK_INTERNAL void duk_push_hnatfunc_name(duk_hthread *thr, duk_hnatfunc *h) {\n\tduk_c_function func;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h));\n\n\tduk_push_sprintf(thr, \"native_\");\n\tfunc = h->func;\n\tduk_push_string_funcptr(thr, (duk_uint8_t *) &func, sizeof(func));\n\tduk_push_sprintf(thr, \"_%04x_%04x\",\n\t                 (unsigned int) (duk_uint16_t) h->nargs,\n\t                 (unsigned int) (duk_uint16_t) h->magic);\n\tduk_concat(thr, 3);\n}\n#endif\n\n/*\n *  duk_tval slice copy\n */\n\nDUK_INTERNAL void duk_copy_tvals_incref(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_size_t count) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(thr);\n\tDUK_ASSERT(count * sizeof(duk_tval) >= count);  /* no wrap */\n\tDUK_MEMCPY((void *) tv_dst, (const void *) tv_src, count * sizeof(duk_tval));\n\n\ttv = tv_dst;\n\twhile (count-- > 0) {\n\t\tDUK_TVAL_INCREF(thr, tv);\n\t\ttv++;\n\t}\n}\n\n/* automatic undefs */\n#undef DUK__ASSERT_SPACE\n#undef DUK__CHECK_SPACE\n#undef DUK__ERROR_STASH_SHARED\n#undef DUK__PACK_ARGS\n#undef DUK__READABLE_ERRMSG_MAXCHARS\n#undef DUK__READABLE_STRING_MAXCHARS\n#undef DUK__READABLE_SUMMARY_MAXCHARS\n#line 1 \"duk_api_string.c\"\n/*\n *  String manipulation\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_LOCAL void duk__concat_and_join_helper(duk_hthread *thr, duk_idx_t count_in, duk_bool_t is_join) {\n\tduk_uint_t count;\n\tduk_uint_t i;\n\tduk_size_t idx;\n\tduk_size_t len;\n\tduk_hstring *h;\n\tduk_uint8_t *buf;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\tif (DUK_UNLIKELY(count_in <= 0)) {\n\t\tif (count_in < 0) {\n\t\t\tDUK_ERROR_RANGE_INVALID_COUNT(thr);\n\t\t\treturn;\n\t\t}\n\t\tDUK_ASSERT(count_in == 0);\n\t\tduk_push_hstring_empty(thr);\n\t\treturn;\n\t}\n\tcount = (duk_uint_t) count_in;\n\n\tif (is_join) {\n\t\tduk_size_t t1, t2, limit;\n\t\th = duk_to_hstring(thr, -((duk_idx_t) count) - 1);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\t/* A bit tricky overflow test, see doc/code-issues.rst. */\n\t\tt1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h);\n\t\tt2 = (duk_size_t) (count - 1);\n\t\tlimit = (duk_size_t) DUK_HSTRING_MAX_BYTELEN;\n\t\tif (DUK_UNLIKELY(t2 != 0 && t1 > limit / t2)) {\n\t\t\t/* Combined size of separators already overflows. */\n\t\t\tgoto error_overflow;\n\t\t}\n\t\tlen = (duk_size_t) (t1 * t2);\n\t} else {\n\t\tlen = (duk_size_t) 0;\n\t}\n\n\tfor (i = count; i >= 1; i--) {\n\t\tduk_size_t new_len;\n\t\th = duk_to_hstring(thr, -((duk_idx_t) i));\n\t\tnew_len = len + (duk_size_t) DUK_HSTRING_GET_BYTELEN(h);\n\n\t\t/* Impose a string maximum length, need to handle overflow\n\t\t * correctly.\n\t\t */\n\t\tif (new_len < len ||  /* wrapped */\n\t\t    new_len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN) {\n\t\t\tgoto error_overflow;\n\t\t}\n\t\tlen = new_len;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"join/concat %lu strings, total length %lu bytes\",\n\t                     (unsigned long) count, (unsigned long) len));\n\n\t/* Use stack allocated buffer to ensure reachability in errors\n\t * (e.g. intern error).\n\t */\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len);\n\tDUK_ASSERT(buf != NULL);\n\n\t/* [ ... (sep) str1 str2 ... strN buf ] */\n\n\tidx = 0;\n\tfor (i = count; i >= 1; i--) {\n\t\tif (is_join && i != count) {\n\t\t\th = duk_require_hstring(thr, -((duk_idx_t) count) - 2);  /* extra -1 for buffer */\n\t\t\tDUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));\n\t\t\tidx += DUK_HSTRING_GET_BYTELEN(h);\n\t\t}\n\t\th = duk_require_hstring(thr, -((duk_idx_t) i) - 1);  /* extra -1 for buffer */\n\t\tDUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));\n\t\tidx += DUK_HSTRING_GET_BYTELEN(h);\n\t}\n\n\tDUK_ASSERT(idx == len);\n\n\t/* [ ... (sep) str1 str2 ... strN buf ] */\n\n\t/* Get rid of the strings early to minimize memory use before intern. */\n\n\tif (is_join) {\n\t\tduk_replace(thr, -((duk_idx_t) count) - 2);  /* overwrite sep */\n\t\tduk_pop_n(thr, (duk_idx_t) count);\n\t} else {\n\t\tduk_replace(thr, -((duk_idx_t) count) - 1);  /* overwrite str1 */\n\t\tduk_pop_n(thr, (duk_idx_t) (count - 1));\n\t}\n\n\t/* [ ... buf ] */\n\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe if inputs are safe. */\n\n\t/* [ ... res ] */\n\treturn;\n\n error_overflow:\n\tDUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG);\n}\n\nDUK_EXTERNAL void duk_concat(duk_hthread *thr, duk_idx_t count) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk__concat_and_join_helper(thr, count, 0 /*is_join*/);\n}\n\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_INTERNAL void duk_concat_2(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tduk_concat(thr, 2);\n}\n#else  /* DUK_USE_PREFER_SIZE */\nDUK_INTERNAL void duk_concat_2(duk_hthread *thr) {\n\tduk_hstring *h1;\n\tduk_hstring *h2;\n\tduk_uint8_t *buf;\n\tduk_size_t len1;\n\tduk_size_t len2;\n\tduk_size_t len;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(duk_get_top(thr) >= 2);  /* Trusted caller. */\n\n\th1 = duk_to_hstring(thr, -2);\n\th2 = duk_to_hstring(thr, -1);\n\tlen1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1);\n\tlen2 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2);\n\tlen = len1 + len2;\n\tif (DUK_UNLIKELY(len < len1 ||  /* wrapped */\n\t                 len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN)) {\n\t\tgoto error_overflow;\n\t}\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, len);\n\tDUK_ASSERT(buf != NULL);\n\n\tDUK_MEMCPY((void *) buf, (const void *) DUK_HSTRING_GET_DATA(h1), (size_t) len1);\n\tDUK_MEMCPY((void *) (buf + len1), (const void *) DUK_HSTRING_GET_DATA(h2), (size_t) len2);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe if inputs are safe. */\n\n\t/* [ ... str1 str2 buf ] */\n\n\tduk_replace(thr, -3);\n\tduk_pop_unsafe(thr);\n\treturn;\n\n error_overflow:\n\tDUK_ERROR_RANGE(thr, DUK_STR_RESULT_TOO_LONG);\n}\n#endif  /* DUK_USE_PREFER_SIZE */\n\nDUK_EXTERNAL void duk_join(duk_hthread *thr, duk_idx_t count) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tduk__concat_and_join_helper(thr, count, 1 /*is_join*/);\n}\n\n/* XXX: could map/decode be unified with duk_unicode_support.c code?\n * Case conversion needs also the character surroundings though.\n */\n\nDUK_EXTERNAL void duk_decode_string(duk_hthread *thr, duk_idx_t idx, duk_decode_char_function callback, void *udata) {\n\tduk_hstring *h_input;\n\tconst duk_uint8_t *p, *p_start, *p_end;\n\tduk_codepoint_t cp;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\th_input = duk_require_hstring(thr, idx);  /* Accept symbols. */\n\tDUK_ASSERT(h_input != NULL);\n\n\tp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);\n\tp = p_start;\n\n\tfor (;;) {\n\t\tif (p >= p_end) {\n\t\t\tbreak;\n\t\t}\n\t\tcp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end);\n\t\tcallback(udata, cp);\n\t}\n}\n\nDUK_EXTERNAL void duk_map_string(duk_hthread *thr, duk_idx_t idx, duk_map_char_function callback, void *udata) {\n\tduk_hstring *h_input;\n\tduk_bufwriter_ctx bw_alloc;\n\tduk_bufwriter_ctx *bw;\n\tconst duk_uint8_t *p, *p_start, *p_end;\n\tduk_codepoint_t cp;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_normalize_index(thr, idx);\n\n\th_input = duk_require_hstring(thr, idx);  /* Accept symbols. */\n\tDUK_ASSERT(h_input != NULL);\n\n\tbw = &bw_alloc;\n\tDUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input));  /* Reasonable output estimate. */\n\n\tp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);\n\tp = p_start;\n\n\tfor (;;) {\n\t\t/* XXX: could write output in chunks with fewer ensure calls,\n\t\t * but relative benefit would be small here.\n\t\t */\n\n\t\tif (p >= p_end) {\n\t\t\tbreak;\n\t\t}\n\t\tcp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end);\n\t\tcp = callback(udata, cp);\n\n\t\tDUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp);\n\t}\n\n\tDUK_BW_COMPACT(thr, bw);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe, extended UTF-8 encoded. */\n\tduk_replace(thr, idx);\n}\n\nDUK_EXTERNAL void duk_substring(duk_hthread *thr, duk_idx_t idx, duk_size_t start_offset, duk_size_t end_offset) {\n\tduk_hstring *h;\n\tduk_hstring *res;\n\tduk_size_t start_byte_offset;\n\tduk_size_t end_byte_offset;\n\tduk_size_t charlen;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);  /* Accept symbols. */\n\th = duk_require_hstring(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\n\tcharlen = DUK_HSTRING_GET_CHARLEN(h);\n\tif (end_offset >= charlen) {\n\t\tend_offset = charlen;\n\t}\n\tif (start_offset > end_offset) {\n\t\tstart_offset = end_offset;\n\t}\n\n\tDUK_ASSERT_DISABLE(start_offset >= 0);\n\tDUK_ASSERT(start_offset <= end_offset && start_offset <= DUK_HSTRING_GET_CHARLEN(h));\n\tDUK_ASSERT_DISABLE(end_offset >= 0);\n\tDUK_ASSERT(end_offset >= start_offset && end_offset <= DUK_HSTRING_GET_CHARLEN(h));\n\n\t/* Guaranteed by string limits. */\n\tDUK_ASSERT(start_offset <= DUK_UINT32_MAX);\n\tDUK_ASSERT(end_offset <= DUK_UINT32_MAX);\n\n\tstart_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) start_offset);\n\tend_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) end_offset);\n\n\tDUK_ASSERT(end_byte_offset >= start_byte_offset);\n\tDUK_ASSERT(end_byte_offset - start_byte_offset <= DUK_UINT32_MAX);  /* Guaranteed by string limits. */\n\n\t/* No size check is necessary. */\n\tres = duk_heap_strtable_intern_checked(thr,\n\t                                       DUK_HSTRING_GET_DATA(h) + start_byte_offset,\n\t                                       (duk_uint32_t) (end_byte_offset - start_byte_offset));\n\n\tduk_push_hstring(thr, res);\n\tduk_replace(thr, idx);\n}\n\n/* XXX: this is quite clunky.  Add Unicode helpers to scan backwards and\n * forwards with a callback to process codepoints?\n */\nDUK_EXTERNAL void duk_trim(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\tconst duk_uint8_t *p, *p_start, *p_end, *p_tmp1, *p_tmp2;  /* pointers for scanning */\n\tconst duk_uint8_t *q_start, *q_end;  /* start (incl) and end (excl) of trimmed part */\n\tduk_codepoint_t cp;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\tidx = duk_require_normalize_index(thr, idx);  /* Accept symbols. */\n\th = duk_require_hstring(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\n\tp_start = DUK_HSTRING_GET_DATA(h);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h);\n\n\tp = p_start;\n\twhile (p < p_end) {\n\t\tp_tmp1 = p;\n\t\tcp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp1, p_start, p_end);\n\t\tif (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) {\n\t\t\tbreak;\n\t\t}\n\t\tp = p_tmp1;\n\t}\n\tq_start = p;\n\tif (p == p_end) {\n\t\t/* Entire string is whitespace. */\n\t\tq_end = p;\n\t\tgoto scan_done;\n\t}\n\n\tp = p_end;\n\twhile (p > p_start) {\n\t\tp_tmp1 = p;\n\t\twhile (p > p_start) {\n\t\t\tp--;\n\t\t\tif (((*p) & 0xc0) != 0x80) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tp_tmp2 = p;\n\n\t\tcp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp2, p_start, p_end);\n\t\tif (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) {\n\t\t\tp = p_tmp1;\n\t\t\tbreak;\n\t\t}\n\t}\n\tq_end = p;\n\n scan_done:\n\t/* This may happen when forward and backward scanning disagree\n\t * (possible for non-extended-UTF-8 strings).\n\t */\n\tif (q_end < q_start) {\n\t\tq_end = q_start;\n\t}\n\n\tDUK_ASSERT(q_start >= p_start && q_start <= p_end);\n\tDUK_ASSERT(q_end >= p_start && q_end <= p_end);\n\tDUK_ASSERT(q_end >= q_start);\n\n\tDUK_DDD(DUK_DDDPRINT(\"trim: p_start=%p, p_end=%p, q_start=%p, q_end=%p\",\n\t                     (const void *) p_start, (const void *) p_end,\n\t                     (const void *) q_start, (const void *) q_end));\n\n\tif (q_start == p_start && q_end == p_end) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"nothing was trimmed: avoid interning (hashing etc)\"));\n\t\treturn;\n\t}\n\n\tduk_push_lstring(thr, (const char *) q_start, (duk_size_t) (q_end - q_start));\n\tduk_replace(thr, idx);\n}\n\nDUK_EXTERNAL duk_codepoint_t duk_char_code_at(duk_hthread *thr, duk_idx_t idx, duk_size_t char_offset) {\n\tduk_hstring *h;\n\tduk_ucodepoint_t cp;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\n\t/* XXX: Share code with String.prototype.charCodeAt?  Main difference\n\t * is handling of clamped offsets.\n\t */\n\n\th = duk_require_hstring(thr, idx);  /* Accept symbols. */\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_ASSERT_DISABLE(char_offset >= 0);  /* Always true, arg is unsigned. */\n\tif (char_offset >= DUK_HSTRING_GET_CHARLEN(h)) {\n\t\treturn 0;\n\t}\n\n\tDUK_ASSERT(char_offset <= DUK_UINT_MAX);  /* Guaranteed by string limits. */\n\tcp = duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) char_offset, 0 /*surrogate_aware*/);\n\treturn (duk_codepoint_t) cp;\n}\n#line 1 \"duk_api_time.c\"\n/*\n *  Date/time.\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_INTERNAL duk_double_t duk_time_get_ecmascript_time(duk_hthread *thr) {\n\t/* Ecmascript time, with millisecond fractions.  Exposed via\n\t * duk_get_now() for example.\n\t */\n\tDUK_UNREF(thr);\n\treturn (duk_double_t) DUK_USE_DATE_GET_NOW(thr);\n}\n\nDUK_INTERNAL duk_double_t duk_time_get_ecmascript_time_nofrac(duk_hthread *thr) {\n\t/* Ecmascript time without millisecond fractions.  Exposed via\n\t * the Date built-in which doesn't allow fractions.\n\t */\n\tDUK_UNREF(thr);\n\treturn (duk_double_t) DUK_FLOOR(DUK_USE_DATE_GET_NOW(thr));\n}\n\nDUK_INTERNAL duk_double_t duk_time_get_monotonic_time(duk_hthread *thr) {\n\tDUK_UNREF(thr);\n#if defined(DUK_USE_GET_MONOTONIC_TIME)\n\treturn (duk_double_t) DUK_USE_GET_MONOTONIC_TIME(thr);\n#else\n\treturn (duk_double_t) DUK_USE_DATE_GET_NOW(thr);\n#endif\n}\n\nDUK_EXTERNAL duk_double_t duk_get_now(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(thr);\n\n\t/* This API intentionally allows millisecond fractions. */\n\treturn duk_time_get_ecmascript_time(thr);\n}\n\n#if 0  /* XXX: worth exposing? */\nDUK_EXTERNAL duk_double_t duk_get_monotonic_time(duk_hthread *thr) {\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_UNREF(thr);\n\n\treturn duk_time_get_monotonic_time(thr);\n}\n#endif\n\nDUK_EXTERNAL void duk_time_to_components(duk_hthread *thr, duk_double_t timeval, duk_time_components *comp) {\n\tduk_int_t parts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_uint_t flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(comp != NULL);  /* XXX: or check? */\n\tDUK_UNREF(thr);\n\n\t/* Convert as one-based, but change month to zero-based to match the\n\t * Ecmascript Date built-in behavior 1:1.\n\t */\n\tflags = DUK_DATE_FLAG_ONEBASED | DUK_DATE_FLAG_NAN_TO_ZERO;\n\n\tduk_bi_date_timeval_to_parts(timeval, parts, dparts, flags);\n\n\t/* XXX: sub-millisecond accuracy for the API */\n\n\tDUK_ASSERT(dparts[DUK_DATE_IDX_MONTH] >= 1.0 && dparts[DUK_DATE_IDX_MONTH] <= 12.0);\n\tcomp->year = dparts[DUK_DATE_IDX_YEAR];\n\tcomp->month = dparts[DUK_DATE_IDX_MONTH] - 1.0;\n\tcomp->day = dparts[DUK_DATE_IDX_DAY];\n\tcomp->hours = dparts[DUK_DATE_IDX_HOUR];\n\tcomp->minutes = dparts[DUK_DATE_IDX_MINUTE];\n\tcomp->seconds = dparts[DUK_DATE_IDX_SECOND];\n\tcomp->milliseconds = dparts[DUK_DATE_IDX_MILLISECOND];\n\tcomp->weekday = dparts[DUK_DATE_IDX_WEEKDAY];\n}\n\nDUK_EXTERNAL duk_double_t duk_components_to_time(duk_hthread *thr, duk_time_components *comp) {\n\tduk_double_t d;\n\tduk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_uint_t flags;\n\n\tDUK_ASSERT_API_ENTRY(thr);\n\tDUK_ASSERT(comp != NULL);  /* XXX: or check? */\n\tDUK_UNREF(thr);\n\n\t/* Match Date constructor behavior (with UTC time).  Month is given\n\t * as zero-based.  Day-of-month is given as one-based so normalize\n\t * it to zero-based as the internal conversion helpers expects all\n\t * components to be zero-based.\n\t */\n\tflags = 0;\n\n\t/* XXX: expensive conversion; use array format in API instead, or unify\n\t * time provider and time API to use same struct?\n\t */\n\n\tdparts[DUK_DATE_IDX_YEAR] = comp->year;\n\tdparts[DUK_DATE_IDX_MONTH] = comp->month;\n\tdparts[DUK_DATE_IDX_DAY] = comp->day - 1.0;\n\tdparts[DUK_DATE_IDX_HOUR] = comp->hours;\n\tdparts[DUK_DATE_IDX_MINUTE] = comp->minutes;\n\tdparts[DUK_DATE_IDX_SECOND] = comp->seconds;\n\tdparts[DUK_DATE_IDX_MILLISECOND] = comp->milliseconds;\n\tdparts[DUK_DATE_IDX_WEEKDAY] = 0;  /* ignored */\n\n\td = duk_bi_date_get_timeval_from_dparts(dparts, flags);\n\n\treturn d;\n}\n#line 1 \"duk_bi_array.c\"\n/*\n *  Array built-ins\n *\n *  Most Array built-ins are intentionally generic in Ecmascript, and are\n *  intended to work even when the 'this' binding is not an Array instance.\n *  This Ecmascript feature is also used by much real world code.  For this\n *  reason the implementations here don't assume exotic Array behavior or\n *  e.g. presence of a .length property.  However, some algorithms have a\n *  fast path for duk_harray backed actual Array instances, enabled when\n *  footprint is not a concern.\n *\n *  XXX: the \"Throw\" flag should be set for (almost?) all [[Put]] and\n *  [[Delete]] operations, but it's currently false throughout.  Go through\n *  all put/delete cases and check throw flag use.  Need a new API primitive\n *  which allows throws flag to be specified.\n *\n *  XXX: array lengths above 2G won't work reliably.  There are many places\n *  where one needs a full signed 32-bit range ([-0xffffffff, 0xffffffff],\n *  i.e. -33- bits).  Although array 'length' cannot be written to be outside\n *  the unsigned 32-bit range (E5.1 Section 15.4.5.1 throws a RangeError if so)\n *  some intermediate values may be above 0xffffffff and this may not be always\n *  correctly handled now (duk_uint32_t is not enough for all algorithms).\n *  For instance, push() can legitimately write entries beyond length 0xffffffff\n *  and cause a RangeError only at the end.  To do this properly, the current\n *  push() implementation tracks the array index using a 'double' instead of a\n *  duk_uint32_t (which is somewhat awkward).  See test-bi-array-push-maxlen.js.\n *\n *  On using \"put\" vs. \"def\" prop\n *  =============================\n *\n *  Code below must be careful to use the appropriate primitive as it matters\n *  for compliance.  When using \"put\" there may be inherited properties in\n *  Array.prototype which cause side effects when values are written.  When\n *  using \"define\" there are no such side effects, and many test262 test cases\n *  check for this (for real world code, such side effects are very rare).\n *  Both \"put\" and \"define\" are used in the E5.1 specification; as a rule,\n *  \"put\" is used when modifying an existing array (or a non-array 'this'\n *  binding) and \"define\" for setting values into a fresh result array.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Perform an intermediate join when this many elements have been pushed\n * on the value stack.\n */\n#define  DUK__ARRAY_MID_JOIN_LIMIT  4096\n\n#if defined(DUK_USE_ARRAY_BUILTIN)\n\n/*\n *  Shared helpers.\n */\n\n/* Shared entry code for many Array built-ins: the 'this' binding is pushed\n * on the value stack and object coerced, and the current .length is returned.\n * Note that length is left on stack (it could be popped, but that's not\n * usually necessary because call handling will clean it up automatically).\n */\nDUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32(duk_hthread *thr) {\n\tduk_uint32_t len;\n\n\t/* XXX: push more directly? */\n\t(void) duk_push_this_coercible_to_object(thr);\n\tDUK_ASSERT_HOBJECT_VALID(duk_get_hobject(thr, -1));\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_LENGTH);\n\tlen = duk_to_uint32(thr, -1);\n\n\t/* -> [ ... ToObject(this) ToUint32(length) ] */\n\treturn len;\n}\n\nDUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32_limited(duk_hthread *thr) {\n\t/* Range limited to [0, 0x7fffffff] range, i.e. range that can be\n\t * represented with duk_int32_t.  Use this when the method doesn't\n\t * handle the full 32-bit unsigned range correctly.\n\t */\n\tduk_uint32_t ret = duk__push_this_obj_len_u32(thr);\n\tif (DUK_UNLIKELY(ret >= 0x80000000UL)) {\n\t\tDUK_ERROR_RANGE_INVALID_LENGTH(thr);\n\t}\n\treturn ret;\n}\n\n#if defined(DUK_USE_ARRAY_FASTPATH)\n/* Check if 'this' binding is an Array instance (duk_harray) which satisfies\n * a few other guarantees for fast path operation.  The fast path doesn't\n * need to handle all operations, even for duk_harrays, but must handle a\n * significant fraction to improve performance.  Return a non-NULL duk_harray\n * pointer when all fast path criteria are met, NULL otherwise.\n */\nDUK_LOCAL duk_harray *duk__arraypart_fastpath_this(duk_hthread *thr) {\n\tduk_tval *tv;\n\tduk_hobject *h;\n\tduk_uint_t flags_mask, flags_bits, flags_value;\n\n\tDUK_ASSERT(thr->valstack_bottom > thr->valstack);  /* because call in progress */\n\ttv = DUK_GET_THIS_TVAL_PTR(thr);\n\n\t/* Fast path requires that 'this' is a duk_harray.  Read only arrays\n\t * (ROM backed) are also rejected for simplicity.\n\t */\n\tif (!DUK_TVAL_IS_OBJECT(tv)) {\n\t\tDUK_DD(DUK_DDPRINT(\"reject array fast path: not an object\"));\n\t\treturn NULL;\n\t}\n\th = DUK_TVAL_GET_OBJECT(tv);\n\tDUK_ASSERT(h != NULL);\n\tflags_mask = DUK_HOBJECT_FLAG_ARRAY_PART | \\\n\t             DUK_HOBJECT_FLAG_EXOTIC_ARRAY | \\\n\t             DUK_HEAPHDR_FLAG_READONLY;\n\tflags_bits = DUK_HOBJECT_FLAG_ARRAY_PART | \\\n\t             DUK_HOBJECT_FLAG_EXOTIC_ARRAY;\n\tflags_value = DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) h);\n\tif ((flags_value & flags_mask) != flags_bits) {\n\t\tDUK_DD(DUK_DDPRINT(\"reject array fast path: object flag check failed\"));\n\t\treturn NULL;\n\t}\n\n\t/* In some cases a duk_harray's 'length' may be larger than the\n\t * current array part allocation.  Avoid the fast path in these\n\t * cases, so that all fast path code can safely assume that all\n\t * items in the range [0,length[ are backed by the current array\n\t * part allocation.\n\t */\n\tif (((duk_harray *) h)->length > DUK_HOBJECT_GET_ASIZE(h)) {\n\t\tDUK_DD(DUK_DDPRINT(\"reject array fast path: length > array part size\"));\n\t\treturn NULL;\n\t}\n\n\t/* Guarantees for fast path. */\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0 || DUK_HOBJECT_A_GET_BASE(thr->heap, h) != NULL);\n\tDUK_ASSERT(((duk_harray *) h)->length <= DUK_HOBJECT_GET_ASIZE(h));\n\n\tDUK_DD(DUK_DDPRINT(\"array fast path allowed for: %!O\", (duk_heaphdr *) h));\n\treturn (duk_harray *) h;\n}\n#endif  /* DUK_USE_ARRAY_FASTPATH */\n\n/*\n *  Constructor\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_constructor(duk_hthread *thr) {\n\tduk_idx_t nargs;\n\tduk_harray *a;\n\tduk_double_t d;\n\tduk_uint32_t len;\n\tduk_uint32_t len_prealloc;\n\n\tnargs = duk_get_top(thr);\n\n\tif (nargs == 1 && duk_is_number(thr, 0)) {\n\t\t/* XXX: expensive check (also shared elsewhere - so add a shared internal API call?) */\n\t\td = duk_get_number(thr, 0);\n\t\tlen = duk_to_uint32(thr, 0);\n\t\tif (((duk_double_t) len) != d) {\n\t\t\tDUK_DCERROR_RANGE_INVALID_LENGTH(thr);\n\t\t}\n\n\t\t/* For small lengths create a dense preallocated array.\n\t\t * For large arrays preallocate an initial part.\n\t\t */\n\t\tlen_prealloc = len < 64 ? len : 64;\n\t\ta = duk_push_harray_with_size(thr, len_prealloc);\n\t\tDUK_ASSERT(a != NULL);\n\t\ta->length = len;\n\t\treturn 1;\n\t}\n\n\tduk_pack(thr, nargs);\n\treturn 1;\n}\n\n/*\n *  isArray()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_constructor_is_array(duk_hthread *thr) {\n\tduk_hobject *h;\n\n\th = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_ARRAY);\n\tduk_push_boolean(thr, (h != NULL));\n\treturn 1;\n}\n\n/*\n *  toString()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_to_string(duk_hthread *thr) {\n\t(void) duk_push_this_coercible_to_object(thr);\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_JOIN);\n\n\t/* [ ... this func ] */\n\tif (!duk_is_callable(thr, -1)) {\n\t\t/* Fall back to the initial (original) Object.toString().  We don't\n\t\t * currently have pointers to the built-in functions, only the top\n\t\t * level global objects (like \"Array\") so this is now done in a bit\n\t\t * of a hacky manner.  It would be cleaner to push the (original)\n\t\t * function and use duk_call_method().\n\t\t */\n\n\t\t/* XXX: 'this' will be ToObject() coerced twice, which is incorrect\n\t\t * but should have no visible side effects.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"this.join is not callable, fall back to (original) Object.toString\"));\n\t\tduk_set_top(thr, 0);\n\t\treturn duk_bi_object_prototype_to_string(thr);  /* has access to 'this' binding */\n\t}\n\n\t/* [ ... this func ] */\n\n\tduk_insert(thr, -2);\n\n\t/* [ ... func this ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"calling: func=%!iT, this=%!iT\",\n\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\tduk_call_method(thr, 0);\n\n\treturn 1;\n}\n\n/*\n *  concat()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_concat(duk_hthread *thr) {\n\tduk_idx_t i, n;\n\tduk_uarridx_t idx, idx_last;\n\tduk_uarridx_t j, len;\n\tduk_hobject *h;\n\n\t/* XXX: the insert here is a bit expensive if there are a lot of items.\n\t * It could also be special cased in the outermost for loop quite easily\n\t * (as the element is dup()'d anyway).\n\t */\n\n\t(void) duk_push_this_coercible_to_object(thr);\n\tduk_insert(thr, 0);\n\tn = duk_get_top(thr);\n\tduk_push_array(thr);  /* -> [ ToObject(this) item1 ... itemN arr ] */\n\n\t/* NOTE: The Array special behaviors are NOT invoked by duk_xdef_prop_index()\n\t * (which differs from the official algorithm).  If no error is thrown, this\n\t * doesn't matter as the length is updated at the end.  However, if an error\n\t * is thrown, the length will be unset.  That shouldn't matter because the\n\t * caller won't get a reference to the intermediate value.\n\t */\n\n\tidx = 0;\n\tidx_last = 0;\n\tfor (i = 0; i < n; i++) {\n\t\tDUK_ASSERT_TOP(thr, n + 1);\n\n\t\t/* [ ToObject(this) item1 ... itemN arr ] */\n\n\t\tduk_dup(thr, i);\n\t\th = duk_get_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_ARRAY);\n\t\tif (!h) {\n\t\t\tduk_xdef_prop_index_wec(thr, -2, idx++);\n\t\t\tidx_last = idx;\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* [ ToObject(this) item1 ... itemN arr item(i) ] */\n\n\t\t/* XXX: an array can have length higher than 32 bits; this is not handled\n\t\t * correctly now.\n\t\t */\n\t\tlen = (duk_uarridx_t) duk_get_length(thr, -1);\n\t\tfor (j = 0; j < len; j++) {\n\t\t\tif (duk_get_prop_index(thr, -1, j)) {\n\t\t\t\t/* [ ToObject(this) item1 ... itemN arr item(i) item(i)[j] ] */\n\t\t\t\tduk_xdef_prop_index_wec(thr, -3, idx++);\n\t\t\t\tidx_last = idx;\n\t\t\t} else {\n\t\t\t\tidx++;\n\t\t\t\tduk_pop_undefined(thr);\n#if defined(DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER)\n\t\t\t\t/* According to E5.1 Section 15.4.4.4 nonexistent trailing\n\t\t\t\t * elements do not affect 'length' of the result.  Test262\n\t\t\t\t * and other engines disagree, so update idx_last here too.\n\t\t\t\t */\n\t\t\t\tidx_last = idx;\n#else\n\t\t\t\t/* Strict standard behavior, ignore trailing elements for\n\t\t\t\t * result 'length'.\n\t\t\t\t */\n#endif\n\t\t\t}\n\t\t}\n\t\tduk_pop_unsafe(thr);\n\t}\n\n\t/* The E5.1 Section 15.4.4.4 algorithm doesn't set the length explicitly\n\t * in the end, but because we're operating with an internal value which\n\t * is known to be an array, this should be equivalent.\n\t */\n\tduk_push_uarridx(thr, idx_last);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);\n\n\tDUK_ASSERT_TOP(thr, n + 1);\n\treturn 1;\n}\n\n/*\n *  join(), toLocaleString()\n *\n *  Note: checking valstack is necessary, but only in the per-element loop.\n *\n *  Note: the trivial approach of pushing all the elements on the value stack\n *  and then calling duk_join() fails when the array contains a large number\n *  of elements.  This problem can't be offloaded to duk_join() because the\n *  elements to join must be handled here and have special handling.  Current\n *  approach is to do intermediate joins with very large number of elements.\n *  There is no fancy handling; the prefix gets re-joined multiple times.\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_join_shared(duk_hthread *thr) {\n\tduk_uint32_t len, count;\n\tduk_uint32_t idx;\n\tduk_small_int_t to_locale_string = duk_get_current_magic(thr);\n\tduk_idx_t valstack_required;\n\n\t/* For join(), nargs is 1.  For toLocaleString(), nargs is 0 and\n\t * setting the top essentially pushes an undefined to the stack,\n\t * thus defaulting to a comma separator.\n\t */\n\tduk_set_top(thr, 1);\n\tif (duk_is_undefined(thr, 0)) {\n\t\tduk_pop_undefined(thr);\n\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_COMMA);\n\t} else {\n\t\tduk_to_string(thr, 0);\n\t}\n\n\tlen = duk__push_this_obj_len_u32(thr);\n\n\t/* [ sep ToObject(this) len ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"sep=%!T, this=%!T, len=%lu\",\n\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t                     (duk_tval *) duk_get_tval(thr, 1),\n\t                     (unsigned long) len));\n\n\t/* The extra (+4) is tight. */\n\tvalstack_required = (duk_idx_t) ((len >= DUK__ARRAY_MID_JOIN_LIMIT ?\n\t                                  DUK__ARRAY_MID_JOIN_LIMIT : len) + 4);\n\tduk_require_stack(thr, valstack_required);\n\n\tduk_dup_0(thr);\n\n\t/* [ sep ToObject(this) len sep ] */\n\n\tcount = 0;\n\tidx = 0;\n\tfor (;;) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"join idx=%ld\", (long) idx));\n\t\tif (count >= DUK__ARRAY_MID_JOIN_LIMIT ||   /* intermediate join to avoid valstack overflow */\n\t\t    idx >= len) { /* end of loop (careful with len==0) */\n\t\t\t/* [ sep ToObject(this) len sep str0 ... str(count-1) ] */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"mid/final join, count=%ld, idx=%ld, len=%ld\",\n\t\t\t                     (long) count, (long) idx, (long) len));\n\t\t\tduk_join(thr, (duk_idx_t) count);  /* -> [ sep ToObject(this) len str ] */\n\t\t\tduk_dup_0(thr);                    /* -> [ sep ToObject(this) len str sep ] */\n\t\t\tduk_insert(thr, -2);               /* -> [ sep ToObject(this) len sep str ] */\n\t\t\tcount = 1;\n\t\t}\n\t\tif (idx >= len) {\n\t\t\t/* if true, the stack already contains the final result */\n\t\t\tbreak;\n\t\t}\n\n\t\tduk_get_prop_index(thr, 1, (duk_uarridx_t) idx);\n\t\tif (duk_is_null_or_undefined(thr, -1)) {\n\t\t\tduk_pop_nodecref_unsafe(thr);\n\t\t\tduk_push_hstring_empty(thr);\n\t\t} else {\n\t\t\tif (to_locale_string) {\n\t\t\t\tduk_to_object(thr, -1);\n\t\t\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_LOCALE_STRING);\n\t\t\t\tduk_insert(thr, -2);  /* -> [ ... toLocaleString ToObject(val) ] */\n\t\t\t\tduk_call_method(thr, 0);\n\t\t\t}\n\t\t\tduk_to_string(thr, -1);\n\t\t}\n\n\t\tcount++;\n\t\tidx++;\n\t}\n\n\t/* [ sep ToObject(this) len sep result ] */\n\n\treturn 1;\n}\n\n/*\n *  pop(), push()\n */\n\n#if defined(DUK_USE_ARRAY_FASTPATH)\nDUK_LOCAL duk_ret_t duk__array_pop_fastpath(duk_hthread *thr, duk_harray *h_arr) {\n\tduk_tval *tv_arraypart;\n\tduk_tval *tv_val;\n\tduk_uint32_t len;\n\n\ttv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr);\n\tlen = h_arr->length;\n\tif (len <= 0) {\n\t\t/* nop, return undefined */\n\t\treturn 0;\n\t}\n\n\tlen--;\n\th_arr->length = len;\n\n\t/* Fast path doesn't check for an index property inherited from\n\t * Array.prototype.  This is quite often acceptable; if not,\n\t * disable fast path.\n\t */\n\tDUK_ASSERT_VS_SPACE(thr);\n\ttv_val = tv_arraypart + len;\n\tif (DUK_TVAL_IS_UNUSED(tv_val)) {\n\t\t/* No net refcount change.  Value stack already has\n\t\t * 'undefined' based on value stack init policy.\n\t\t */\n\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));\n\t\tDUK_ASSERT(DUK_TVAL_IS_UNUSED(tv_val));\n\t} else {\n\t\t/* No net refcount change. */\n\t\tDUK_TVAL_SET_TVAL(thr->valstack_top, tv_val);\n\t\tDUK_TVAL_SET_UNUSED(tv_val);\n\t}\n\tthr->valstack_top++;\n\n\t/* XXX: there's no shrink check in the fast path now */\n\n\treturn 1;\n}\n#endif  /* DUK_USE_ARRAY_FASTPATH */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_pop(duk_hthread *thr) {\n\tduk_uint32_t len;\n\tduk_uint32_t idx;\n#if defined(DUK_USE_ARRAY_FASTPATH)\n\tduk_harray *h_arr;\n#endif\n\n\tDUK_ASSERT_TOP(thr, 0);\n\n#if defined(DUK_USE_ARRAY_FASTPATH)\n\th_arr = duk__arraypart_fastpath_this(thr);\n\tif (h_arr) {\n\t\treturn duk__array_pop_fastpath(thr, h_arr);\n\t}\n#endif\n\n\t/* XXX: Merge fastpath check into a related call (push this, coerce length, etc)? */\n\n\tlen = duk__push_this_obj_len_u32(thr);\n\tif (len == 0) {\n\t\tduk_push_int(thr, 0);\n\t\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);\n\t\treturn 0;\n\t}\n\tidx = len - 1;\n\n\tduk_get_prop_index(thr, 0, (duk_uarridx_t) idx);\n\tduk_del_prop_index(thr, 0, (duk_uarridx_t) idx);\n\tduk_push_u32(thr, idx);\n\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);\n\treturn 1;\n}\n\n#if defined(DUK_USE_ARRAY_FASTPATH)\nDUK_LOCAL duk_ret_t duk__array_push_fastpath(duk_hthread *thr, duk_harray *h_arr) {\n\tduk_tval *tv_arraypart;\n\tduk_tval *tv_src;\n\tduk_tval *tv_dst;\n\tduk_uint32_t len;\n\tduk_idx_t i, n;\n\n\tlen = h_arr->length;\n\ttv_arraypart = DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) h_arr);\n\n\tn = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom);\n\tDUK_ASSERT(n >= 0);\n\tDUK_ASSERT((duk_uint32_t) n <= DUK_UINT32_MAX);\n\tif (DUK_UNLIKELY(len + (duk_uint32_t) n < len)) {\n\t\tDUK_D(DUK_DPRINT(\"Array.prototype.push() would go beyond 32-bit length, throw\"));\n\t\tDUK_DCERROR_RANGE_INVALID_LENGTH(thr);  /* != 0 return value returned as is by caller */\n\t}\n\tif (len + (duk_uint32_t) n > DUK_HOBJECT_GET_ASIZE((duk_hobject *) h_arr)) {\n\t\t/* Array part would need to be extended.  Rely on slow path\n\t\t * for now.\n\t\t *\n\t\t * XXX: Rework hobject code a bit and add extend support.\n\t\t */\n\t\treturn 0;\n\t}\n\n\ttv_src = thr->valstack_bottom;\n\ttv_dst = tv_arraypart + len;\n\tfor (i = 0; i < n; i++) {\n\t\t/* No net refcount change; reset value stack values to\n\t\t * undefined to satisfy value stack init policy.\n\t\t */\n\t\tDUK_TVAL_SET_TVAL(tv_dst, tv_src);\n\t\tDUK_TVAL_SET_UNDEFINED(tv_src);\n\t\ttv_src++;\n\t\ttv_dst++;\n\t}\n\tthr->valstack_top = thr->valstack_bottom;\n\tlen += (duk_uint32_t) n;\n\th_arr->length = len;\n\n\tDUK_ASSERT((duk_uint_t) len == len);\n\tduk_push_uint(thr, (duk_uint_t) len);\n\treturn 1;\n}\n#endif  /* DUK_USE_ARRAY_FASTPATH */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_push(duk_hthread *thr) {\n\t/* Note: 'this' is not necessarily an Array object.  The push()\n\t * algorithm is supposed to work for other kinds of objects too,\n\t * so the algorithm has e.g. an explicit update for the 'length'\n\t * property which is normally \"magical\" in arrays.\n\t */\n\n\tduk_uint32_t len;\n\tduk_idx_t i, n;\n#if defined(DUK_USE_ARRAY_FASTPATH)\n\tduk_harray *h_arr;\n#endif\n\n#if defined(DUK_USE_ARRAY_FASTPATH)\n\th_arr = duk__arraypart_fastpath_this(thr);\n\tif (h_arr) {\n\t\tduk_ret_t rc;\n\t\trc = duk__array_push_fastpath(thr, h_arr);\n\t\tif (rc != 0) {\n\t\t\treturn rc;\n\t\t}\n\t\tDUK_DD(DUK_DDPRINT(\"array push() fast path exited, resize case\"));\n\t}\n#endif\n\n\tn = duk_get_top(thr);\n\tlen = duk__push_this_obj_len_u32(thr);\n\n\t/* [ arg1 ... argN obj length ] */\n\n\t/* Technically Array.prototype.push() can create an Array with length\n\t * longer than 2^32-1, i.e. outside the 32-bit range.  The final length\n\t * is *not* wrapped to 32 bits in the specification.\n\t *\n\t * This implementation tracks length with a uint32 because it's much\n\t * more practical.\n\t *\n\t * See: test-bi-array-push-maxlen.js.\n\t */\n\n\tif (len + (duk_uint32_t) n < len) {\n\t\tDUK_D(DUK_DPRINT(\"Array.prototype.push() would go beyond 32-bit length, throw\"));\n\t\tDUK_DCERROR_RANGE_INVALID_LENGTH(thr);\n\t}\n\n\tfor (i = 0; i < n; i++) {\n\t\tduk_dup(thr, i);\n\t\tduk_put_prop_index(thr, -3, (duk_uarridx_t) (len + (duk_uint32_t) i));\n\t}\n\tlen += (duk_uint32_t) n;\n\n\tduk_push_u32(thr, len);\n\tduk_dup_top(thr);\n\tduk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH);\n\n\t/* [ arg1 ... argN obj length new_length ] */\n\treturn 1;\n}\n\n/*\n *  sort()\n *\n *  Currently qsort with random pivot.  This is now really, really slow,\n *  because there is no fast path for array parts.\n *\n *  Signed indices are used because qsort() leaves and degenerate cases\n *  may use a negative offset.\n */\n\nDUK_LOCAL duk_small_int_t duk__array_sort_compare(duk_hthread *thr, duk_int_t idx1, duk_int_t idx2) {\n\tduk_bool_t have1, have2;\n\tduk_bool_t undef1, undef2;\n\tduk_small_int_t ret;\n\tduk_idx_t idx_obj = 1;  /* fixed offsets in valstack */\n\tduk_idx_t idx_fn = 0;\n\tduk_hstring *h1, *h2;\n\n\t/* Fast exit if indices are identical.  This is valid for a non-existent property,\n\t * for an undefined value, and almost always for ToString() coerced comparison of\n\t * arbitrary values (corner cases where this is not the case include e.g. a an\n\t * object with varying ToString() coercion).\n\t *\n\t * The specification does not prohibit \"caching\" of values read from the array, so\n\t * assuming equality for comparing an index with itself falls into the category of\n\t * \"caching\".\n\t *\n\t * Also, compareFn may be inconsistent, so skipping a call to compareFn here may\n\t * have an effect on the final result.  The specification does not require any\n\t * specific behavior for inconsistent compare functions, so again, this fast path\n\t * is OK.\n\t */\n\n\tif (idx1 == idx2) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"duk__array_sort_compare: idx1=%ld, idx2=%ld -> indices identical, quick exit\",\n\t\t                     (long) idx1, (long) idx2));\n\t\treturn 0;\n\t}\n\n\thave1 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx1);\n\thave2 = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) idx2);\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__array_sort_compare: idx1=%ld, idx2=%ld, have1=%ld, have2=%ld, val1=%!T, val2=%!T\",\n\t                     (long) idx1, (long) idx2, (long) have1, (long) have2,\n\t                     (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));\n\n\tif (have1) {\n\t\tif (have2) {\n\t\t\t;\n\t\t} else {\n\t\t\tret = -1;\n\t\t\tgoto pop_ret;\n\t\t}\n\t} else {\n\t\tif (have2) {\n\t\t\tret = 1;\n\t\t\tgoto pop_ret;\n\t\t} else {\n\t\t\tret = 0;\n\t\t\tgoto pop_ret;\n\t\t}\n\t}\n\n\tundef1 = duk_is_undefined(thr, -2);\n\tundef2 = duk_is_undefined(thr, -1);\n\tif (undef1) {\n\t\tif (undef2) {\n\t\t\tret = 0;\n\t\t\tgoto pop_ret;\n\t\t} else {\n\t\t\tret = 1;\n\t\t\tgoto pop_ret;\n\t\t}\n\t} else {\n\t\tif (undef2) {\n\t\t\tret = -1;\n\t\t\tgoto pop_ret;\n\t\t} else {\n\t\t\t;\n\t\t}\n\t}\n\n\tif (!duk_is_undefined(thr, idx_fn)) {\n\t\tduk_double_t d;\n\n\t\t/* No need to check callable; duk_call() will do that. */\n\t\tduk_dup(thr, idx_fn);    /* -> [ ... x y fn ] */\n\t\tduk_insert(thr, -3);     /* -> [ ... fn x y ] */\n\t\tduk_call(thr, 2);        /* -> [ ... res ] */\n\n\t\t/* ES5 is a bit vague about what to do if the return value is\n\t\t * not a number.  ES2015 provides a concrete description:\n\t\t * http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare.\n\t\t */\n\n\t\td = duk_to_number_m1(thr);\n\t\tif (d < 0.0) {\n\t\t\tret = -1;\n\t\t} else if (d > 0.0) {\n\t\t\tret = 1;\n\t\t} else {\n\t\t\t/* Because NaN compares to false, NaN is handled here\n\t\t\t * without an explicit check above.\n\t\t\t */\n\t\t\tret = 0;\n\t\t}\n\n\t\tduk_pop_nodecref_unsafe(thr);\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> result %ld (from comparefn, after coercion)\", (long) ret));\n\t\treturn ret;\n\t}\n\n\t/* string compare is the default (a bit oddly) */\n\n\t/* XXX: any special handling for plain array; causes repeated coercion now? */\n\th1 = duk_to_hstring(thr, -2);\n\th2 = duk_to_hstring_m1(thr);\n\tDUK_ASSERT(h1 != NULL);\n\tDUK_ASSERT(h2 != NULL);\n\n\tret = duk_js_string_compare(h1, h2);  /* retval is directly usable */\n\tgoto pop_ret;\n\n pop_ret:\n\tduk_pop_2_unsafe(thr);\n\tDUK_DDD(DUK_DDDPRINT(\"-> result %ld\", (long) ret));\n\treturn ret;\n}\n\nDUK_LOCAL void duk__array_sort_swap(duk_hthread *thr, duk_int_t l, duk_int_t r) {\n\tduk_bool_t have_l, have_r;\n\tduk_idx_t idx_obj = 1;  /* fixed offset in valstack */\n\n\tif (l == r) {\n\t\treturn;\n\t}\n\n\t/* swap elements; deal with non-existent elements correctly */\n\thave_l = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) l);\n\thave_r = duk_get_prop_index(thr, idx_obj, (duk_uarridx_t) r);\n\n\tif (have_r) {\n\t\t/* right exists, [[Put]] regardless whether or not left exists */\n\t\tduk_put_prop_index(thr, idx_obj, (duk_uarridx_t) l);\n\t} else {\n\t\tduk_del_prop_index(thr, idx_obj, (duk_uarridx_t) l);\n\t\tduk_pop_undefined(thr);\n\t}\n\n\tif (have_l) {\n\t\tduk_put_prop_index(thr, idx_obj, (duk_uarridx_t) r);\n\t} else {\n\t\tduk_del_prop_index(thr, idx_obj, (duk_uarridx_t) r);\n\t\tduk_pop_undefined(thr);\n\t}\n}\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n/* Debug print which visualizes the qsort partitioning process. */\nDUK_LOCAL void duk__debuglog_qsort_state(duk_hthread *thr, duk_int_t lo, duk_int_t hi, duk_int_t pivot) {\n\tchar buf[4096];\n\tchar *ptr = buf;\n\tduk_int_t i, n;\n\tn = (duk_int_t) duk_get_length(thr, 1);\n\tif (n > 4000) {\n\t\tn = 4000;\n\t}\n\t*ptr++ = '[';\n\tfor (i = 0; i < n; i++) {\n\t\tif (i == pivot) {\n\t\t\t*ptr++ = '|';\n\t\t} else if (i == lo) {\n\t\t\t*ptr++ = '<';\n\t\t} else if (i == hi) {\n\t\t\t*ptr++ = '>';\n\t\t} else if (i >= lo && i <= hi) {\n\t\t\t*ptr++ = '-';\n\t\t} else {\n\t\t\t*ptr++ = ' ';\n\t\t}\n\t}\n\t*ptr++ = ']';\n\t*ptr++ = '\\0';\n\n\tDUK_DDD(DUK_DDDPRINT(\"%s   (lo=%ld, hi=%ld, pivot=%ld)\",\n\t                     (const char *) buf, (long) lo, (long) hi, (long) pivot));\n}\n#endif\n\nDUK_LOCAL void duk__array_qsort(duk_hthread *thr, duk_int_t lo, duk_int_t hi) {\n\tduk_int_t p, l, r;\n\n\t/* The lo/hi indices may be crossed and hi < 0 is possible at entry. */\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__array_qsort: lo=%ld, hi=%ld, obj=%!T\",\n\t                     (long) lo, (long) hi, (duk_tval *) duk_get_tval(thr, 1)));\n\n\tDUK_ASSERT_TOP(thr, 3);\n\n\t/* In some cases it may be that lo > hi, or hi < 0; these\n\t * degenerate cases happen e.g. for empty arrays, and in\n\t * recursion leaves.\n\t */\n\n\t/* trivial cases */\n\tif (hi - lo < 1) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"degenerate case, return immediately\"));\n\t\treturn;\n\t}\n\tDUK_ASSERT(hi > lo);\n\tDUK_ASSERT(hi - lo + 1 >= 2);\n\n\t/* randomized pivot selection */\n\tp = lo + (duk_int_t) (DUK_UTIL_GET_RANDOM_DOUBLE(thr) * (duk_double_t) (hi - lo + 1));\n\tDUK_ASSERT(p >= lo && p <= hi);\n\tDUK_DDD(DUK_DDDPRINT(\"lo=%ld, hi=%ld, chose pivot p=%ld\", (long) lo, (long) hi, (long) p));\n\n\t/* move pivot out of the way */\n\tduk__array_sort_swap(thr, p, lo);\n\tp = lo;\n\tDUK_DDD(DUK_DDDPRINT(\"pivot moved out of the way: %!T\", (duk_tval *) duk_get_tval(thr, 1)));\n\n\tl = lo + 1;\n\tr = hi;\n\tfor (;;) {\n\t\t/* find elements to swap */\n\t\tfor (;;) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"left scan: l=%ld, r=%ld, p=%ld\",\n\t\t\t                     (long) l, (long) r, (long) p));\n\t\t\tif (l >= hi) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (duk__array_sort_compare(thr, l, p) >= 0) {  /* !(l < p) */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tl++;\n\t\t}\n\t\tfor (;;) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"right scan: l=%ld, r=%ld, p=%ld\",\n\t\t\t                     (long) l, (long) r, (long) p));\n\t\t\tif (r <= lo) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (duk__array_sort_compare(thr, p, r) >= 0) {  /* !(p < r) */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tr--;\n\t\t}\n\t\tif (l >= r) {\n\t\t\tgoto done;\n\t\t}\n\t\tDUK_ASSERT(l < r);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"swap %ld and %ld\", (long) l, (long) r));\n\n\t\tduk__array_sort_swap(thr, l, r);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"after swap: %!T\", (duk_tval *) duk_get_tval(thr, 1)));\n\t\tl++;\n\t\tr--;\n\t}\n done:\n\t/* Note that 'l' and 'r' may cross, i.e. r < l */\n\tDUK_ASSERT(l >= lo && l <= hi);\n\tDUK_ASSERT(r >= lo && r <= hi);\n\n\t/* XXX: there's no explicit recursion bound here now.  For the average\n\t * qsort recursion depth O(log n) that's not really necessary: e.g. for\n\t * 2**32 recursion depth would be about 32 which is OK.  However, qsort\n\t * worst case recursion depth is O(n) which may be a problem.\n\t */\n\n\t/* move pivot to its final place */\n\tDUK_DDD(DUK_DDDPRINT(\"before final pivot swap: %!T\", (duk_tval *) duk_get_tval(thr, 1)));\n\tduk__array_sort_swap(thr, lo, r);\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n\tduk__debuglog_qsort_state(thr, lo, hi, r);\n#endif\n\n\tDUK_DDD(DUK_DDDPRINT(\"recurse: pivot=%ld, obj=%!T\", (long) r, (duk_tval *) duk_get_tval(thr, 1)));\n\tduk__array_qsort(thr, lo, r - 1);\n\tduk__array_qsort(thr, r + 1, hi);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_sort(duk_hthread *thr) {\n\tduk_uint32_t len;\n\n\t/* XXX: len >= 0x80000000 won't work below because a signed type\n\t * is needed by qsort.\n\t */\n\tlen = duk__push_this_obj_len_u32_limited(thr);\n\n\t/* stack[0] = compareFn\n\t * stack[1] = ToObject(this)\n\t * stack[2] = ToUint32(length)\n\t */\n\n\tif (len > 0) {\n\t\t/* avoid degenerate cases, so that (len - 1) won't underflow */\n\t\tduk__array_qsort(thr, (duk_int_t) 0, (duk_int_t) (len - 1));\n\t}\n\n\tDUK_ASSERT_TOP(thr, 3);\n\tduk_pop_nodecref_unsafe(thr);\n\treturn 1;  /* return ToObject(this) */\n}\n\n/*\n *  splice()\n */\n\n/* XXX: this compiles to over 500 bytes now, even without special handling\n * for an array part.  Uses signed ints so does not handle full array range correctly.\n */\n\n/* XXX: can shift() / unshift() use the same helper?\n *   shift() is (close to?) <--> splice(0, 1)\n *   unshift is (close to?) <--> splice(0, 0, [items])?\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_splice(duk_hthread *thr) {\n\tduk_idx_t nargs;\n\tduk_uint32_t len_u32;\n\tduk_int_t len;\n\tduk_bool_t have_delcount;\n\tduk_int_t item_count;\n\tduk_int_t act_start;\n\tduk_int_t del_count;\n\tduk_int_t i, n;\n\n\tDUK_UNREF(have_delcount);\n\n\tnargs = duk_get_top(thr);\n\tif (nargs < 2) {\n\t\tduk_set_top(thr, 2);\n\t\tnargs = 2;\n\t\thave_delcount = 0;\n\t} else {\n\t\thave_delcount = 1;\n\t}\n\n\t/* XXX: len >= 0x80000000 won't work below because we need to be\n\t * able to represent -len.\n\t */\n\tlen_u32 = duk__push_this_obj_len_u32_limited(thr);\n\tlen = (duk_int_t) len_u32;\n\tDUK_ASSERT(len >= 0);\n\n\tact_start = duk_to_int_clamped(thr, 0, -len, len);\n\tif (act_start < 0) {\n\t\tact_start = len + act_start;\n\t}\n\tDUK_ASSERT(act_start >= 0 && act_start <= len);\n\n#if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT)\n\tif (have_delcount) {\n#endif\n\t\tdel_count = duk_to_int_clamped(thr, 1, 0, len - act_start);\n#if defined(DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT)\n\t} else {\n\t\t/* E5.1 standard behavior when deleteCount is not given would be\n\t\t * to treat it just like if 'undefined' was given, which coerces\n\t\t * ultimately to 0.  Real world behavior is to splice to the end\n\t\t * of array, see test-bi-array-proto-splice-no-delcount.js.\n\t\t */\n\t\tdel_count = len - act_start;\n\t}\n#endif\n\n\tDUK_ASSERT(nargs >= 2);\n\titem_count = (duk_int_t) (nargs - 2);\n\n\tDUK_ASSERT(del_count >= 0 && del_count <= len - act_start);\n\tDUK_ASSERT(del_count + act_start <= len);\n\n\t/* For now, restrict result array into 32-bit length range. */\n\tif (((duk_double_t) len) - ((duk_double_t) del_count) + ((duk_double_t) item_count) > (duk_double_t) DUK_UINT32_MAX) {\n\t\tDUK_D(DUK_DPRINT(\"Array.prototype.splice() would go beyond 32-bit length, throw\"));\n\t\tDUK_DCERROR_RANGE_INVALID_LENGTH(thr);\n\t}\n\n\tduk_push_array(thr);\n\n\t/* stack[0] = start\n\t * stack[1] = deleteCount\n\t * stack[2...nargs-1] = items\n\t * stack[nargs] = ToObject(this)               -3\n\t * stack[nargs+1] = ToUint32(length)           -2\n\t * stack[nargs+2] = result array               -1\n\t */\n\n\tDUK_ASSERT_TOP(thr, nargs + 3);\n\n\t/* Step 9: copy elements-to-be-deleted into the result array */\n\n\tfor (i = 0; i < del_count; i++) {\n\t\tif (duk_get_prop_index(thr, -3, (duk_uarridx_t) (act_start + i))) {\n\t\t\tduk_xdef_prop_index_wec(thr, -2, (duk_uarridx_t) i);  /* throw flag irrelevant (false in std alg) */\n\t\t} else {\n\t\t\tduk_pop_undefined(thr);\n\t\t}\n\t}\n\tduk_push_u32(thr, (duk_uint32_t) del_count);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);\n\n\t/* Steps 12 and 13: reorganize elements to make room for itemCount elements */\n\n\tif (item_count < del_count) {\n\t\t/*    [ A B C D E F G H ]    rel_index = 2, del_count 3, item count 1\n\t\t * -> [ A B F G H ]          (conceptual intermediate step)\n\t\t * -> [ A B . F G H ]        (placeholder marked)\n\t\t *    [ A B C F G H ]        (actual result at this point, C will be replaced)\n\t\t */\n\n\t\tDUK_ASSERT_TOP(thr, nargs + 3);\n\n\t\tn = len - del_count;\n\t\tfor (i = act_start; i < n; i++) {\n\t\t\tif (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) {\n\t\t\t\tduk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count));\n\t\t\t} else {\n\t\t\t\tduk_pop_undefined(thr);\n\t\t\t\tduk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count));\n\t\t\t}\n\t\t}\n\n\t\tDUK_ASSERT_TOP(thr, nargs + 3);\n\n\t\t/* loop iterator init and limit changed from standard algorithm */\n\t\tn = len - del_count + item_count;\n\t\tfor (i = len - 1; i >= n; i--) {\n\t\t\tduk_del_prop_index(thr, -3, (duk_uarridx_t) i);\n\t\t}\n\n\t\tDUK_ASSERT_TOP(thr, nargs + 3);\n\t} else if (item_count > del_count) {\n\t\t/*    [ A B C D E F G H ]    rel_index = 2, del_count 3, item count 4\n\t\t * -> [ A B F G H ]          (conceptual intermediate step)\n\t\t * -> [ A B . . . . F G H ]  (placeholder marked)\n\t\t *    [ A B C D E F F G H ]  (actual result at this point)\n\t\t */\n\n\t\tDUK_ASSERT_TOP(thr, nargs + 3);\n\n\t\t/* loop iterator init and limit changed from standard algorithm */\n\t\tfor (i = len - del_count - 1; i >= act_start; i--) {\n\t\t\tif (duk_get_prop_index(thr, -3, (duk_uarridx_t) (i + del_count))) {\n\t\t\t\tduk_put_prop_index(thr, -4, (duk_uarridx_t) (i + item_count));\n\t\t\t} else {\n\t\t\t\tduk_pop_undefined(thr);\n\t\t\t\tduk_del_prop_index(thr, -3, (duk_uarridx_t) (i + item_count));\n\t\t\t}\n\t\t}\n\n\t\tDUK_ASSERT_TOP(thr, nargs + 3);\n\t} else {\n\t\t/*    [ A B C D E F G H ]    rel_index = 2, del_count 3, item count 3\n\t\t * -> [ A B F G H ]          (conceptual intermediate step)\n\t\t * -> [ A B . . . F G H ]    (placeholder marked)\n\t\t *    [ A B C D E F G H ]    (actual result at this point)\n\t\t */\n\t}\n\tDUK_ASSERT_TOP(thr, nargs + 3);\n\n\t/* Step 15: insert itemCount elements into the hole made above */\n\n\tfor (i = 0; i < item_count; i++) {\n\t\tduk_dup(thr, i + 2);  /* args start at index 2 */\n\t\tduk_put_prop_index(thr, -4, (duk_uarridx_t) (act_start + i));\n\t}\n\n\t/* Step 16: update length; note that the final length may be above 32 bit range\n\t * (but we checked above that this isn't the case here)\n\t */\n\n\tduk_push_u32(thr, (duk_uint32_t) (len - del_count + item_count));\n\tduk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH);\n\n\t/* result array is already at the top of stack */\n\tDUK_ASSERT_TOP(thr, nargs + 3);\n\treturn 1;\n}\n\n/*\n *  reverse()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_reverse(duk_hthread *thr) {\n\tduk_uint32_t len;\n\tduk_uint32_t middle;\n\tduk_uint32_t lower, upper;\n\tduk_bool_t have_lower, have_upper;\n\n\tlen = duk__push_this_obj_len_u32(thr);\n\tmiddle = len / 2;\n\n\t/* If len <= 1, middle will be 0 and for-loop bails out\n\t * immediately (0 < 0 -> false).\n\t */\n\n\tfor (lower = 0; lower < middle; lower++) {\n\t\tDUK_ASSERT(len >= 2);\n\t\tDUK_ASSERT_TOP(thr, 2);\n\n\t\tDUK_ASSERT(len >= lower + 1);\n\t\tupper = len - lower - 1;\n\n\t\thave_lower = duk_get_prop_index(thr, -2, (duk_uarridx_t) lower);\n\t\thave_upper = duk_get_prop_index(thr, -3, (duk_uarridx_t) upper);\n\n\t\t/* [ ToObject(this) ToUint32(length) lowerValue upperValue ] */\n\n\t\tif (have_upper) {\n\t\t\tduk_put_prop_index(thr, -4, (duk_uarridx_t) lower);\n\t\t} else {\n\t\t\tduk_del_prop_index(thr, -4, (duk_uarridx_t) lower);\n\t\t\tduk_pop_undefined(thr);\n\t\t}\n\n\t\tif (have_lower) {\n\t\t\tduk_put_prop_index(thr, -3, (duk_uarridx_t) upper);\n\t\t} else {\n\t\t\tduk_del_prop_index(thr, -3, (duk_uarridx_t) upper);\n\t\t\tduk_pop_undefined(thr);\n\t\t}\n\n\t\tDUK_ASSERT_TOP(thr, 2);\n\t}\n\n\tDUK_ASSERT_TOP(thr, 2);\n\tduk_pop_unsafe(thr);  /* -> [ ToObject(this) ] */\n\treturn 1;\n}\n\n/*\n *  slice()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_slice(duk_hthread *thr) {\n\tduk_uint32_t len_u32;\n\tduk_int_t len;\n\tduk_int_t start, end;\n\tduk_int_t i;\n\tduk_uarridx_t idx;\n\tduk_uint32_t res_length = 0;\n\n\t/* XXX: len >= 0x80000000 won't work below because we need to be\n\t * able to represent -len.\n\t */\n\tlen_u32 = duk__push_this_obj_len_u32_limited(thr);\n\tlen = (duk_int_t) len_u32;\n\tDUK_ASSERT(len >= 0);\n\n\tduk_push_array(thr);\n\n\t/* stack[0] = start\n\t * stack[1] = end\n\t * stack[2] = ToObject(this)\n\t * stack[3] = ToUint32(length)\n\t * stack[4] = result array\n\t */\n\n\tstart = duk_to_int_clamped(thr, 0, -len, len);\n\tif (start < 0) {\n\t\tstart = len + start;\n\t}\n\t/* XXX: could duk_is_undefined() provide defaulting undefined to 'len'\n\t * (the upper limit)?\n\t */\n\tif (duk_is_undefined(thr, 1)) {\n\t\tend = len;\n\t} else {\n\t\tend = duk_to_int_clamped(thr, 1, -len, len);\n\t\tif (end < 0) {\n\t\t\tend = len + end;\n\t\t}\n\t}\n\tDUK_ASSERT(start >= 0 && start <= len);\n\tDUK_ASSERT(end >= 0 && end <= len);\n\n\tidx = 0;\n\tfor (i = start; i < end; i++) {\n\t\tDUK_ASSERT_TOP(thr, 5);\n\t\tif (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) {\n\t\t\tduk_xdef_prop_index_wec(thr, 4, idx);\n\t\t\tres_length = idx + 1;\n\t\t} else {\n\t\t\tduk_pop_undefined(thr);\n\t\t}\n\t\tidx++;\n\t\tDUK_ASSERT_TOP(thr, 5);\n\t}\n\n\tduk_push_u32(thr, res_length);\n\tduk_xdef_prop_stridx_short(thr, 4, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);\n\n\tDUK_ASSERT_TOP(thr, 5);\n\treturn 1;\n}\n\n/*\n *  shift()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_shift(duk_hthread *thr) {\n\tduk_uint32_t len;\n\tduk_uint32_t i;\n\n\tlen = duk__push_this_obj_len_u32(thr);\n\tif (len == 0) {\n\t\tduk_push_int(thr, 0);\n\t\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);\n\t\treturn 0;\n\t}\n\n\tduk_get_prop_index(thr, 0, 0);\n\n\t/* stack[0] = object (this)\n\t * stack[1] = ToUint32(length)\n\t * stack[2] = elem at index 0 (retval)\n\t */\n\n\tfor (i = 1; i < len; i++) {\n\t\tDUK_ASSERT_TOP(thr, 3);\n\t\tif (duk_get_prop_index(thr, 0, (duk_uarridx_t) i)) {\n\t\t\t/* fromPresent = true */\n\t\t\tduk_put_prop_index(thr, 0, (duk_uarridx_t) (i - 1));\n\t\t} else {\n\t\t\t/* fromPresent = false */\n\t\t\tduk_del_prop_index(thr, 0, (duk_uarridx_t) (i - 1));\n\t\t\tduk_pop_undefined(thr);\n\t\t}\n\t}\n\tduk_del_prop_index(thr, 0, (duk_uarridx_t) (len - 1));\n\n\tduk_push_u32(thr, (duk_uint32_t) (len - 1));\n\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);\n\n\tDUK_ASSERT_TOP(thr, 3);\n\treturn 1;\n}\n\n/*\n *  unshift()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_unshift(duk_hthread *thr) {\n\tduk_idx_t nargs;\n\tduk_uint32_t len;\n\tduk_uint32_t i;\n\n\tnargs = duk_get_top(thr);\n\tlen = duk__push_this_obj_len_u32(thr);\n\n\t/* stack[0...nargs-1] = unshift args (vararg)\n\t * stack[nargs] = ToObject(this)\n\t * stack[nargs+1] = ToUint32(length)\n\t */\n\n\tDUK_ASSERT_TOP(thr, nargs + 2);\n\n\t/* Note: unshift() may operate on indices above unsigned 32-bit range\n\t * and the final length may be >= 2**32.  However, we restrict the\n\t * final result to 32-bit range for practicality.\n\t */\n\n\tif (len + (duk_uint32_t) nargs < len) {\n\t\tDUK_D(DUK_DPRINT(\"Array.prototype.unshift() would go beyond 32-bit length, throw\"));\n\t\tDUK_DCERROR_RANGE_INVALID_LENGTH(thr);\n\t}\n\n\ti = len;\n\twhile (i > 0) {\n\t\tDUK_ASSERT_TOP(thr, nargs + 2);\n\t\ti--;\n\t\t/* k+argCount-1; note that may be above 32-bit range */\n\n\t\tif (duk_get_prop_index(thr, -2, (duk_uarridx_t) i)) {\n\t\t\t/* fromPresent = true */\n\t\t\t/* [ ... ToObject(this) ToUint32(length) val ] */\n\t\t\tduk_put_prop_index(thr, -3, (duk_uarridx_t) (i + (duk_uint32_t) nargs));  /* -> [ ... ToObject(this) ToUint32(length) ] */\n\t\t} else {\n\t\t\t/* fromPresent = false */\n\t\t\t/* [ ... ToObject(this) ToUint32(length) val ] */\n\t\t\tduk_pop_undefined(thr);\n\t\t\tduk_del_prop_index(thr, -2, (duk_uarridx_t) (i + (duk_uint32_t) nargs));  /* -> [ ... ToObject(this) ToUint32(length) ] */\n\t\t}\n\t\tDUK_ASSERT_TOP(thr, nargs + 2);\n\t}\n\n\tfor (i = 0; i < (duk_uint32_t) nargs; i++) {\n\t\tDUK_ASSERT_TOP(thr, nargs + 2);\n\t\tduk_dup(thr, (duk_idx_t) i);  /* -> [ ... ToObject(this) ToUint32(length) arg[i] ] */\n\t\tduk_put_prop_index(thr, -3, (duk_uarridx_t) i);\n\t\tDUK_ASSERT_TOP(thr, nargs + 2);\n\t}\n\n\tDUK_ASSERT_TOP(thr, nargs + 2);\n\tduk_push_u32(thr, len + (duk_uint32_t) nargs);\n\tduk_dup_top(thr);  /* -> [ ... ToObject(this) ToUint32(length) final_len final_len ] */\n\tduk_put_prop_stridx_short(thr, -4, DUK_STRIDX_LENGTH);\n\treturn 1;\n}\n\n/*\n *  indexOf(), lastIndexOf()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_hthread *thr) {\n\tduk_idx_t nargs;\n\tduk_int_t i, len;\n\tduk_int_t from_idx;\n\tduk_small_int_t idx_step = duk_get_current_magic(thr);  /* idx_step is +1 for indexOf, -1 for lastIndexOf */\n\n\t/* lastIndexOf() needs to be a vararg function because we must distinguish\n\t * between an undefined fromIndex and a \"not given\" fromIndex; indexOf() is\n\t * made vararg for symmetry although it doesn't strictly need to be.\n\t */\n\n\tnargs = duk_get_top(thr);\n\tduk_set_top(thr, 2);\n\n\t/* XXX: must be able to represent -len */\n\tlen = (duk_int_t) duk__push_this_obj_len_u32_limited(thr);\n\tif (len == 0) {\n\t\tgoto not_found;\n\t}\n\n\t/* Index clamping is a bit tricky, we must ensure that we'll only iterate\n\t * through elements that exist and that the specific requirements from E5.1\n\t * Sections 15.4.4.14 and 15.4.4.15 are fulfilled; especially:\n\t *\n\t *   - indexOf: clamp to [-len,len], negative handling -> [0,len],\n\t *     if clamped result is len, for-loop bails out immediately\n\t *\n\t *   - lastIndexOf: clamp to [-len-1, len-1], negative handling -> [-1, len-1],\n\t *     if clamped result is -1, for-loop bails out immediately\n\t *\n\t * If fromIndex is not given, ToInteger(undefined) = 0, which is correct\n\t * for indexOf() but incorrect for lastIndexOf().  Hence special handling,\n\t * and why lastIndexOf() needs to be a vararg function.\n\t */\n\n\tif (nargs >= 2) {\n\t\t/* indexOf: clamp fromIndex to [-len, len]\n\t\t * (if fromIndex == len, for-loop terminates directly)\n\t\t *\n\t\t * lastIndexOf: clamp fromIndex to [-len - 1, len - 1]\n\t\t * (if clamped to -len-1 -> fromIndex becomes -1, terminates for-loop directly)\n\t\t */\n\t\tfrom_idx = duk_to_int_clamped(thr,\n\t\t                              1,\n\t\t                              (idx_step > 0 ? -len : -len - 1),\n\t\t                              (idx_step > 0 ? len : len - 1));\n\t\tif (from_idx < 0) {\n\t\t\t/* for lastIndexOf, result may be -1 (mark immediate termination) */\n\t\t\tfrom_idx = len + from_idx;\n\t\t}\n\t} else {\n\t\t/* for indexOf, ToInteger(undefined) would be 0, i.e. correct, but\n\t\t * handle both indexOf and lastIndexOf specially here.\n\t\t */\n\t\tif (idx_step > 0) {\n\t\t\tfrom_idx = 0;\n\t\t} else {\n\t\t\tfrom_idx = len - 1;\n\t\t}\n\t}\n\n\t/* stack[0] = searchElement\n\t * stack[1] = fromIndex\n\t * stack[2] = object\n\t * stack[3] = length (not needed, but not popped above)\n\t */\n\n\tfor (i = from_idx; i >= 0 && i < len; i += idx_step) {\n\t\tDUK_ASSERT_TOP(thr, 4);\n\n\t\tif (duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) {\n\t\t\tDUK_ASSERT_TOP(thr, 5);\n\t\t\tif (duk_strict_equals(thr, 0, 4)) {\n\t\t\t\tduk_push_int(thr, i);\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\n\t\tduk_pop_unsafe(thr);\n\t}\n\n not_found:\n\tduk_push_int(thr, -1);\n\treturn 1;\n}\n\n/*\n *  every(), some(), forEach(), map(), filter()\n */\n\n#define DUK__ITER_EVERY    0\n#define DUK__ITER_SOME     1\n#define DUK__ITER_FOREACH  2\n#define DUK__ITER_MAP      3\n#define DUK__ITER_FILTER   4\n\n/* XXX: This helper is a bit awkward because the handling for the different iteration\n * callers is quite different.  This now compiles to a bit less than 500 bytes, so with\n * 5 callers the net result is about 100 bytes / caller.\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_iter_shared(duk_hthread *thr) {\n\tduk_uint32_t len;\n\tduk_uint32_t i;\n\tduk_uarridx_t k;\n\tduk_bool_t bval;\n\tduk_small_int_t iter_type = duk_get_current_magic(thr);\n\tduk_uint32_t res_length = 0;\n\n\t/* each call this helper serves has nargs==2 */\n\tDUK_ASSERT_TOP(thr, 2);\n\n\tlen = duk__push_this_obj_len_u32(thr);\n\tduk_require_callable(thr, 0);\n\t/* if thisArg not supplied, behave as if undefined was supplied */\n\n\tif (iter_type == DUK__ITER_MAP || iter_type == DUK__ITER_FILTER) {\n\t\tduk_push_array(thr);\n\t} else {\n\t\tduk_push_undefined(thr);\n\t}\n\n\t/* stack[0] = callback\n\t * stack[1] = thisArg\n\t * stack[2] = object\n\t * stack[3] = ToUint32(length)  (unused, but avoid unnecessary pop)\n\t * stack[4] = result array (or undefined)\n\t */\n\n\tk = 0;  /* result index for filter() */\n\tfor (i = 0; i < len; i++) {\n\t\tDUK_ASSERT_TOP(thr, 5);\n\n\t\tif (!duk_get_prop_index(thr, 2, (duk_uarridx_t) i)) {\n#if defined(DUK_USE_NONSTD_ARRAY_MAP_TRAILER)\n\t\t\t/* Real world behavior for map(): trailing non-existent\n\t\t\t * elements don't invoke the user callback, but are still\n\t\t\t * counted towards result 'length'.\n\t\t\t */\n\t\t\tif (iter_type == DUK__ITER_MAP) {\n\t\t\t\tres_length = i + 1;\n\t\t\t}\n#else\n\t\t\t/* Standard behavior for map(): trailing non-existent\n\t\t\t * elements don't invoke the user callback and are not\n\t\t\t * counted towards result 'length'.\n\t\t\t */\n#endif\n\t\t\tduk_pop_undefined(thr);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* The original value needs to be preserved for filter(), hence\n\t\t * this funny order.  We can't re-get the value because of side\n\t\t * effects.\n\t\t */\n\n\t\tduk_dup_0(thr);\n\t\tduk_dup_1(thr);\n\t\tduk_dup_m3(thr);\n\t\tduk_push_u32(thr, i);\n\t\tduk_dup_2(thr);  /* [ ... val callback thisArg val i obj ] */\n\t\tduk_call_method(thr, 3); /* -> [ ... val retval ] */\n\n\t\tswitch (iter_type) {\n\t\tcase DUK__ITER_EVERY:\n\t\t\tbval = duk_to_boolean(thr, -1);\n\t\t\tif (!bval) {\n\t\t\t\t/* stack top contains 'false' */\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase DUK__ITER_SOME:\n\t\t\tbval = duk_to_boolean(thr, -1);\n\t\t\tif (bval) {\n\t\t\t\t/* stack top contains 'true' */\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase DUK__ITER_FOREACH:\n\t\t\t/* nop */\n\t\t\tbreak;\n\t\tcase DUK__ITER_MAP:\n\t\t\tduk_dup_top(thr);\n\t\t\tduk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) i);  /* retval to result[i] */\n\t\t\tres_length = i + 1;\n\t\t\tbreak;\n\t\tcase DUK__ITER_FILTER:\n\t\t\tbval = duk_to_boolean(thr, -1);\n\t\t\tif (bval) {\n\t\t\t\tduk_dup_m2(thr);  /* orig value */\n\t\t\t\tduk_xdef_prop_index_wec(thr, 4, (duk_uarridx_t) k);\n\t\t\t\tk++;\n\t\t\t\tres_length = k;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tDUK_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\t\tduk_pop_2_unsafe(thr);\n\n\t\tDUK_ASSERT_TOP(thr, 5);\n\t}\n\n\tswitch (iter_type) {\n\tcase DUK__ITER_EVERY:\n\t\tduk_push_true(thr);\n\t\tbreak;\n\tcase DUK__ITER_SOME:\n\t\tduk_push_false(thr);\n\t\tbreak;\n\tcase DUK__ITER_FOREACH:\n\t\tduk_push_undefined(thr);\n\t\tbreak;\n\tcase DUK__ITER_MAP:\n\tcase DUK__ITER_FILTER:\n\t\tDUK_ASSERT_TOP(thr, 5);\n\t\tDUK_ASSERT(duk_is_array(thr, -1));  /* topmost element is the result array already */\n\t\tduk_push_u32(thr, res_length);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W);\n\t\tbreak;\n\tdefault:\n\t\tDUK_UNREACHABLE();\n\t\tbreak;\n\t}\n\n\treturn 1;\n}\n\n/*\n *  reduce(), reduceRight()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_hthread *thr) {\n\tduk_idx_t nargs;\n\tduk_bool_t have_acc;\n\tduk_uint32_t i, len;\n\tduk_small_int_t idx_step = duk_get_current_magic(thr);  /* idx_step is +1 for reduce, -1 for reduceRight */\n\n\t/* We're a varargs function because we need to detect whether\n\t * initialValue was given or not.\n\t */\n\tnargs = duk_get_top(thr);\n\tDUK_DDD(DUK_DDDPRINT(\"nargs=%ld\", (long) nargs));\n\n\tduk_set_top(thr, 2);\n\tlen = duk__push_this_obj_len_u32(thr);\n\tduk_require_callable(thr, 0);\n\n\t/* stack[0] = callback fn\n\t * stack[1] = initialValue\n\t * stack[2] = object (coerced this)\n\t * stack[3] = length (not needed, but not popped above)\n\t * stack[4] = accumulator\n\t */\n\n\thave_acc = 0;\n\tif (nargs >= 2) {\n\t\tduk_dup_1(thr);\n\t\thave_acc = 1;\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"have_acc=%ld, acc=%!T\",\n\t                     (long) have_acc, (duk_tval *) duk_get_tval(thr, 3)));\n\n\t/* For len == 0, i is initialized to len - 1 which underflows.\n\t * The condition (i < len) will then exit the for-loop on the\n\t * first round which is correct.  Similarly, loop termination\n\t * happens by i underflowing.\n\t */\n\n\tfor (i = (idx_step >= 0 ? 0 : len - 1);\n\t     i < len;  /* i >= 0 would always be true */\n\t     i += (duk_uint32_t) idx_step) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"i=%ld, len=%ld, have_acc=%ld, top=%ld, acc=%!T\",\n\t\t                     (long) i, (long) len, (long) have_acc,\n\t\t                     (long) duk_get_top(thr),\n\t\t                     (duk_tval *) duk_get_tval(thr, 4)));\n\n\t\tDUK_ASSERT((have_acc && duk_get_top(thr) == 5) ||\n\t\t           (!have_acc && duk_get_top(thr) == 4));\n\n\t\tif (!duk_has_prop_index(thr, 2, (duk_uarridx_t) i)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!have_acc) {\n\t\t\tDUK_ASSERT_TOP(thr, 4);\n\t\t\tduk_get_prop_index(thr, 2, (duk_uarridx_t) i);\n\t\t\thave_acc = 1;\n\t\t\tDUK_ASSERT_TOP(thr, 5);\n\t\t} else {\n\t\t\tDUK_ASSERT_TOP(thr, 5);\n\t\t\tduk_dup_0(thr);\n\t\t\tduk_dup(thr, 4);\n\t\t\tduk_get_prop_index(thr, 2, (duk_uarridx_t) i);\n\t\t\tduk_push_u32(thr, i);\n\t\t\tduk_dup_2(thr);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"calling reduce function: func=%!T, prev=%!T, curr=%!T, idx=%!T, obj=%!T\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -5), (duk_tval *) duk_get_tval(thr, -4),\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2),\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\tduk_call(thr, 4);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> result: %!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\tduk_replace(thr, 4);\n\t\t\tDUK_ASSERT_TOP(thr, 5);\n\t\t}\n\t}\n\n\tif (!have_acc) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\tDUK_ASSERT_TOP(thr, 5);\n\treturn 1;\n}\n\n#endif  /* DUK_USE_ARRAY_BUILTIN */\n\n/* automatic undefs */\n#undef DUK__ARRAY_MID_JOIN_LIMIT\n#undef DUK__ITER_EVERY\n#undef DUK__ITER_FILTER\n#undef DUK__ITER_FOREACH\n#undef DUK__ITER_MAP\n#undef DUK__ITER_SOME\n#line 1 \"duk_bi_boolean.c\"\n/*\n *  Boolean built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_BOOLEAN_BUILTIN)\n\n/* Shared helper to provide toString() and valueOf().  Checks 'this', gets\n * the primitive value to stack top, and optionally coerces with ToString().\n */\nDUK_INTERNAL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_hthread *thr) {\n\tduk_tval *tv;\n\tduk_hobject *h;\n\tduk_small_int_t coerce_tostring = duk_get_current_magic(thr);\n\n\t/* XXX: there is room to use a shared helper here, many built-ins\n\t * check the 'this' type, and if it's an object, check its class,\n\t * then get its internal value, etc.\n\t */\n\n\tduk_push_this(thr);\n\ttv = duk_get_tval(thr, -1);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_BOOLEAN(tv)) {\n\t\tgoto type_ok;\n\t} else if (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_BOOLEAN) {\n\t\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);\n\t\t\tDUK_ASSERT(duk_is_boolean(thr, -1));\n\t\t\tgoto type_ok;\n\t\t}\n\t}\n\n\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t/* never here */\n\n type_ok:\n\tif (coerce_tostring) {\n\t\tduk_to_string(thr, -1);\n\t}\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_boolean_constructor(duk_hthread *thr) {\n\tduk_hobject *h_this;\n\n\tduk_to_boolean(thr, 0);\n\n\tif (duk_is_constructor_call(thr)) {\n\t\t/* XXX: helper; rely on Boolean.prototype as being non-writable, non-configurable */\n\t\tduk_push_this(thr);\n\t\th_this = duk_known_hobject(thr, -1);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]);\n\n\t\tDUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_BOOLEAN);\n\n\t\tduk_dup_0(thr);  /* -> [ val obj val ] */\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);  /* XXX: proper flags? */\n\t}  /* unbalanced stack */\n\n\treturn 1;\n}\n\n#endif  /* DUK_USE_BOOLEAN_BUILTIN */\n#line 1 \"duk_bi_buffer.c\"\n/*\n *  ES2015 TypedArray and Node.js Buffer built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Helpers for buffer handling, enabled with DUK_USE_BUFFEROBJECT_SUPPORT.\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n/* Map class number (minus DUK_HOBJECT_CLASS_BUFOBJ_MIN) to a bidx for the\n * default internal prototype.\n */\nstatic const duk_uint8_t duk__buffer_proto_from_classnum[] = {\n\tDUK_BIDX_ARRAYBUFFER_PROTOTYPE,\n\tDUK_BIDX_DATAVIEW_PROTOTYPE,\n\tDUK_BIDX_INT8ARRAY_PROTOTYPE,\n\tDUK_BIDX_UINT8ARRAY_PROTOTYPE,\n\tDUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE,\n\tDUK_BIDX_INT16ARRAY_PROTOTYPE,\n\tDUK_BIDX_UINT16ARRAY_PROTOTYPE,\n\tDUK_BIDX_INT32ARRAY_PROTOTYPE,\n\tDUK_BIDX_UINT32ARRAY_PROTOTYPE,\n\tDUK_BIDX_FLOAT32ARRAY_PROTOTYPE,\n\tDUK_BIDX_FLOAT64ARRAY_PROTOTYPE\n};\n\n/* Map DUK_HBUFOBJ_ELEM_xxx to duk_hobject class number.\n * Sync with duk_hbufobj.h and duk_hobject.h.\n */\nstatic const duk_uint8_t duk__buffer_class_from_elemtype[9] = {\n\tDUK_HOBJECT_CLASS_UINT8ARRAY,\n\tDUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY,\n\tDUK_HOBJECT_CLASS_INT8ARRAY,\n\tDUK_HOBJECT_CLASS_UINT16ARRAY,\n\tDUK_HOBJECT_CLASS_INT16ARRAY,\n\tDUK_HOBJECT_CLASS_UINT32ARRAY,\n\tDUK_HOBJECT_CLASS_INT32ARRAY,\n\tDUK_HOBJECT_CLASS_FLOAT32ARRAY,\n\tDUK_HOBJECT_CLASS_FLOAT64ARRAY\n};\n\n/* Map DUK_HBUFOBJ_ELEM_xxx to prototype object built-in index.\n * Sync with duk_hbufobj.h.\n */\nstatic const duk_uint8_t duk__buffer_proto_from_elemtype[9] = {\n\tDUK_BIDX_UINT8ARRAY_PROTOTYPE,\n\tDUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE,\n\tDUK_BIDX_INT8ARRAY_PROTOTYPE,\n\tDUK_BIDX_UINT16ARRAY_PROTOTYPE,\n\tDUK_BIDX_INT16ARRAY_PROTOTYPE,\n\tDUK_BIDX_UINT32ARRAY_PROTOTYPE,\n\tDUK_BIDX_INT32ARRAY_PROTOTYPE,\n\tDUK_BIDX_FLOAT32ARRAY_PROTOTYPE,\n\tDUK_BIDX_FLOAT64ARRAY_PROTOTYPE\n};\n\n/* Map DUK__FLD_xxx to byte size. */\nstatic const duk_uint8_t duk__buffer_nbytes_from_fldtype[6] = {\n\t1,  /* DUK__FLD_8BIT */\n\t2,  /* DUK__FLD_16BIT */\n\t4,  /* DUK__FLD_32BIT */\n\t4,  /* DUK__FLD_FLOAT */\n\t8,  /* DUK__FLD_DOUBLE */\n\t0   /* DUK__FLD_VARINT; not relevant here */\n};\n\n/* Bitfield for each DUK_HBUFOBJ_ELEM_xxx indicating which element types\n * are compatible with a blind byte copy for the TypedArray set() method (also\n * used for TypedArray constructor).  Array index is target buffer elem type,\n * bitfield indicates compatible source types.  The types must have same byte\n * size and they must be coercion compatible.\n */\n#if !defined(DUK_USE_PREFER_SIZE)\nstatic duk_uint16_t duk__buffer_elemtype_copy_compatible[9] = {\n\t/* xxx -> DUK_HBUFOBJ_ELEM_UINT8 */\n\t(1U << DUK_HBUFOBJ_ELEM_UINT8) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_INT8),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_UINT8CLAMPED\n\t * Note: INT8 is -not- copy compatible, e.g. -1 would coerce to 0x00.\n\t */\n\t(1U << DUK_HBUFOBJ_ELEM_UINT8) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_INT8 */\n\t(1U << DUK_HBUFOBJ_ELEM_UINT8) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_UINT8CLAMPED) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_INT8),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_UINT16 */\n\t(1U << DUK_HBUFOBJ_ELEM_UINT16) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_INT16),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_INT16 */\n\t(1U << DUK_HBUFOBJ_ELEM_UINT16) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_INT16),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_UINT32 */\n\t(1U << DUK_HBUFOBJ_ELEM_UINT32) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_INT32),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_INT32 */\n\t(1U << DUK_HBUFOBJ_ELEM_UINT32) |\n\t\t(1U << DUK_HBUFOBJ_ELEM_INT32),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_FLOAT32 */\n\t(1U << DUK_HBUFOBJ_ELEM_FLOAT32),\n\n\t/* xxx -> DUK_HBUFOBJ_ELEM_FLOAT64 */\n\t(1U << DUK_HBUFOBJ_ELEM_FLOAT64)\n};\n#endif  /* !DUK_USE_PREFER_SIZE */\n\nDUK_LOCAL duk_hbufobj *duk__hbufobj_promote_this(duk_hthread *thr) {\n\tduk_tval *tv_dst;\n\tduk_hbufobj *res;\n\n\tduk_push_this(thr);\n\tDUK_ASSERT(duk_is_buffer(thr, -1));\n\tres = (duk_hbufobj *) duk_to_hobject(thr, -1);\n\tDUK_ASSERT_HBUFOBJ_VALID(res);\n\tDUK_DD(DUK_DDPRINT(\"promoted 'this' automatically to an ArrayBuffer: %!iT\", duk_get_tval(thr, -1)));\n\n\ttv_dst = duk_get_borrowed_this_tval(thr);\n\tDUK_TVAL_SET_OBJECT_UPDREF(thr, tv_dst, (duk_hobject *) res);\n\tduk_pop(thr);\n\n\treturn res;\n}\n\n#define DUK__BUFOBJ_FLAG_THROW    (1 << 0)\n#define DUK__BUFOBJ_FLAG_PROMOTE  (1 << 1)\n\n/* Shared helper.  When DUK__BUFOBJ_FLAG_PROMOTE is given, the return value is\n * always a duk_hbufobj *.  Without the flag the return value can also be a\n * plain buffer, and the caller must check for it using DUK_HEAPHDR_IS_BUFFER().\n */\nDUK_LOCAL duk_heaphdr *duk__getrequire_bufobj_this(duk_hthread *thr, duk_small_uint_t flags) {\n\tduk_tval *tv;\n\tduk_hbufobj *h_this;\n\n\tDUK_ASSERT(thr != NULL);\n\n\ttv = duk_get_borrowed_this_tval(thr);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th_this = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h_this != NULL);\n\t\tif (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_this)) {\n\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_this);\n\t\t\treturn (duk_heaphdr *) h_this;\n\t\t}\n\t} else if (DUK_TVAL_IS_BUFFER(tv)) {\n\t\tif (flags & DUK__BUFOBJ_FLAG_PROMOTE) {\n\t\t\t/* Promote a plain buffer to a Uint8Array.  This is very\n\t\t\t * inefficient but allows plain buffer to be used wherever an\n\t\t\t * Uint8Array is used with very small cost; hot path functions\n\t\t\t * like index read/write calls should provide direct buffer\n\t\t\t * support to avoid promotion.\n\t\t\t */\n\t\t\t/* XXX: make this conditional to a flag if call sites need it? */\n\t\t\th_this = duk__hbufobj_promote_this(thr);\n\t\t\tDUK_ASSERT(h_this != NULL);\n\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_this);\n\t\t\treturn (duk_heaphdr *) h_this;\n\t\t} else {\n\t\t\t/* XXX: ugly, share return pointer for duk_hbuffer. */\n\t\t\treturn (duk_heaphdr *) DUK_TVAL_GET_BUFFER(tv);\n\t\t}\n\t}\n\n\tif (flags & DUK__BUFOBJ_FLAG_THROW) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER);\n\t}\n\treturn NULL;\n}\n\n/* Check that 'this' is a duk_hbufobj and return a pointer to it. */\nDUK_LOCAL duk_hbufobj *duk__get_bufobj_this(duk_hthread *thr) {\n\treturn (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_PROMOTE);\n}\n\n/* Check that 'this' is a duk_hbufobj and return a pointer to it\n * (NULL if not).\n */\nDUK_LOCAL duk_hbufobj *duk__require_bufobj_this(duk_hthread *thr) {\n\treturn (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW | DUK__BUFOBJ_FLAG_PROMOTE);\n}\n\n/* Check that value is a duk_hbufobj and return a pointer to it. */\nDUK_LOCAL duk_hbufobj *duk__require_bufobj_value(duk_hthread *thr, duk_idx_t idx) {\n\tduk_tval *tv;\n\tduk_hbufobj *h_obj;\n\n\t/* Don't accept relative indices now. */\n\tDUK_ASSERT(idx >= 0);\n\n\ttv = duk_require_tval(thr, idx);\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th_obj = (duk_hbufobj *) DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h_obj != NULL);\n\t\tif (DUK_HOBJECT_IS_BUFOBJ((duk_hobject *) h_obj)) {\n\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_obj);\n\t\t\treturn h_obj;\n\t\t}\n\t} else if (DUK_TVAL_IS_BUFFER(tv)) {\n\t\th_obj = (duk_hbufobj *) duk_to_hobject(thr, idx);\n\t\tDUK_ASSERT(h_obj != NULL);\n\t\tDUK_ASSERT_HBUFOBJ_VALID(h_obj);\n\t\treturn h_obj;\n\t}\n\n\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_BUFFER);\n\treturn NULL;  /* not reachable */\n}\n\nDUK_LOCAL void duk__set_bufobj_buffer(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_hbuffer *h_val) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(h_bufobj != NULL);\n\tDUK_ASSERT(h_bufobj->buf == NULL);  /* no need to decref */\n\tDUK_ASSERT(h_val != NULL);\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\tDUK_UNREF(thr);\n\n\th_bufobj->buf = h_val;\n\tDUK_HBUFFER_INCREF(thr, h_val);\n\th_bufobj->length = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_val);\n\tDUK_ASSERT(h_bufobj->shift == 0);\n\tDUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8);\n\tDUK_ASSERT(h_bufobj->is_typedarray == 0);\n\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n}\n\n/* Shared offset/length coercion helper. */\nDUK_LOCAL void duk__resolve_offset_opt_length(duk_hthread *thr,\n                                              duk_hbufobj *h_bufarg,\n                                              duk_idx_t idx_offset,\n                                              duk_idx_t idx_length,\n                                              duk_uint_t *out_offset,\n                                              duk_uint_t *out_length,\n                                              duk_bool_t throw_flag) {\n\tduk_int_t offset_signed;\n\tduk_int_t length_signed;\n\tduk_uint_t offset;\n\tduk_uint_t length;\n\n\toffset_signed = duk_to_int(thr, idx_offset);\n\tif (offset_signed < 0) {\n\t\tgoto fail_range;\n\t}\n\toffset = (duk_uint_t) offset_signed;\n\tif (offset > h_bufarg->length) {\n\t\tgoto fail_range;\n\t}\n\tDUK_ASSERT_DISABLE(offset >= 0);  /* unsigned */\n\tDUK_ASSERT(offset <= h_bufarg->length);\n\n\tif (duk_is_undefined(thr, idx_length)) {\n\t\tDUK_ASSERT(h_bufarg->length >= offset);\n\t\tlength = h_bufarg->length - offset;  /* >= 0 */\n\t} else {\n\t\tlength_signed = duk_to_int(thr, idx_length);\n\t\tif (length_signed < 0) {\n\t\t\tgoto fail_range;\n\t\t}\n\t\tlength = (duk_uint_t) length_signed;\n\t\tDUK_ASSERT(h_bufarg->length >= offset);\n\t\tif (length > h_bufarg->length - offset) {\n\t\t\t/* Unlike for negative arguments, some call sites\n\t\t\t * want length to be clamped if it's positive.\n\t\t\t */\n\t\t\tif (throw_flag) {\n\t\t\t\tgoto fail_range;\n\t\t\t} else {\n\t\t\t\tlength = h_bufarg->length - offset;\n\t\t\t}\n\t\t}\n\t}\n\tDUK_ASSERT_DISABLE(length >= 0);  /* unsigned */\n\tDUK_ASSERT(offset + length <= h_bufarg->length);\n\n\t*out_offset = offset;\n\t*out_length = length;\n\treturn;\n\n fail_range:\n\tDUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARGS);\n}\n\n/* Shared lenient buffer length clamping helper.  No negative indices, no\n * element/byte shifting.\n */\nDUK_LOCAL void duk__clamp_startend_nonegidx_noshift(duk_hthread *thr,\n                                                    duk_int_t buffer_length,\n                                                    duk_idx_t idx_start,\n                                                    duk_idx_t idx_end,\n                                                    duk_int_t *out_start_offset,\n                                                    duk_int_t *out_end_offset) {\n\tduk_int_t start_offset;\n\tduk_int_t end_offset;\n\n\tDUK_ASSERT(out_start_offset != NULL);\n\tDUK_ASSERT(out_end_offset != NULL);\n\n\t/* undefined coerces to zero which is correct */\n\tstart_offset = duk_to_int_clamped(thr, idx_start, 0, buffer_length);\n\tif (duk_is_undefined(thr, idx_end)) {\n\t\tend_offset = buffer_length;\n\t} else {\n\t\tend_offset = duk_to_int_clamped(thr, idx_end, start_offset, buffer_length);\n\t}\n\n\tDUK_ASSERT(start_offset >= 0);\n\tDUK_ASSERT(start_offset <= buffer_length);\n\tDUK_ASSERT(end_offset >= 0);\n\tDUK_ASSERT(end_offset <= buffer_length);\n\tDUK_ASSERT(start_offset <= end_offset);\n\n\t*out_start_offset = start_offset;\n\t*out_end_offset = end_offset;\n}\n\n/* Shared lenient buffer length clamping helper.  Indices are treated as\n * element indices (though output values are byte offsets) which only\n * really matters for TypedArray views as other buffer object have a zero\n * shift.  Negative indices are counted from end of input slice; crossed\n * indices are clamped to zero length; and final indices are clamped\n * against input slice.  Used for e.g. ArrayBuffer slice().\n */\nDUK_LOCAL void duk__clamp_startend_negidx_shifted(duk_hthread *thr,\n                                                  duk_int_t buffer_length,\n                                                  duk_uint8_t buffer_shift,\n                                                  duk_idx_t idx_start,\n                                                  duk_idx_t idx_end,\n                                                  duk_int_t *out_start_offset,\n                                                  duk_int_t *out_end_offset) {\n\tduk_int_t start_offset;\n\tduk_int_t end_offset;\n\n\tDUK_ASSERT(out_start_offset != NULL);\n\tDUK_ASSERT(out_end_offset != NULL);\n\n\tbuffer_length >>= buffer_shift;  /* as (full) elements */\n\n\t/* Resolve start/end offset as element indices first; arguments\n\t * at idx_start/idx_end are element offsets.  Working with element\n\t * indices first also avoids potential for wrapping.\n\t */\n\n\tstart_offset = duk_to_int(thr, idx_start);\n\tif (start_offset < 0) {\n\t\tstart_offset = buffer_length + start_offset;\n\t}\n\tif (duk_is_undefined(thr, idx_end)) {\n\t\tend_offset = buffer_length;\n\t} else {\n\t\tend_offset = duk_to_int(thr, idx_end);\n\t\tif (end_offset < 0) {\n\t\t\tend_offset = buffer_length + end_offset;\n\t\t}\n\t}\n\t/* Note: start_offset/end_offset can still be < 0 here. */\n\n\tif (start_offset < 0) {\n\t\tstart_offset = 0;\n\t} else if (start_offset > buffer_length) {\n\t\tstart_offset = buffer_length;\n\t}\n\tif (end_offset < start_offset) {\n\t\tend_offset = start_offset;\n\t} else if (end_offset > buffer_length) {\n\t\tend_offset = buffer_length;\n\t}\n\tDUK_ASSERT(start_offset >= 0);\n\tDUK_ASSERT(start_offset <= buffer_length);\n\tDUK_ASSERT(end_offset >= 0);\n\tDUK_ASSERT(end_offset <= buffer_length);\n\tDUK_ASSERT(start_offset <= end_offset);\n\n\t/* Convert indices to byte offsets. */\n\tstart_offset <<= buffer_shift;\n\tend_offset <<= buffer_shift;\n\n\t*out_start_offset = start_offset;\n\t*out_end_offset = end_offset;\n}\n\nDUK_INTERNAL void duk_hbufobj_promote_plain(duk_hthread *thr, duk_idx_t idx) {\n\tif (duk_is_buffer(thr, idx)) {\n\t\tduk_to_object(thr, idx);\n\t}\n}\n\nDUK_INTERNAL void duk_hbufobj_push_uint8array_from_plain(duk_hthread *thr, duk_hbuffer *h_buf) {\n\t/* Push Uint8Array which will share the same underlying buffer as\n\t * the plain buffer argument.  Also create an ArrayBuffer with the\n\t * same backing for the result .buffer property.\n\t */\n\n\tduk_push_hbuffer(thr, h_buf);\n\tduk_push_buffer_object(thr, -1, 0, (duk_size_t) DUK_HBUFFER_GET_SIZE(h_buf), DUK_BUFOBJ_UINT8ARRAY);\n\tduk_remove_m2(thr);\n\n#if 0\n\t/* More verbose equivalent; maybe useful if e.g. .buffer is omitted. */\n\th_bufobj = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY),\n\t                               DUK_BIDX_UINT8ARRAY_PROTOTYPE);\n\tDUK_ASSERT(h_bufobj != NULL);\n\tduk__set_bufobj_buffer(thr, h_bufobj, h_buf);\n\th_bufobj->is_typedarray = 1;\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\th_arrbuf = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER),\n\t                               DUK_BIDX_ARRAYBUFFER_PROTOTYPE);\n\tDUK_ASSERT(h_arrbuf != NULL);\n\tduk__set_bufobj_buffer(thr, h_arrbuf, h_buf);\n\tDUK_ASSERT(h_arrbuf->is_typedarray == 0);\n\tDUK_ASSERT_HBUFOBJ_VALID(h_arrbuf);\n\n\tDUK_ASSERT(h_bufobj->buf_prop == NULL);\n\th_bufobj->buf_prop = (duk_hobject *) h_arrbuf;\n\tDUK_ASSERT(h_arrbuf != NULL);\n\tDUK_HBUFOBJ_INCREF(thr, h_arrbuf);\n\tduk_pop(thr);\n#endif\n}\n\n/* Indexed read helper for buffer objects, also called from outside this file. */\nDUK_INTERNAL void duk_hbufobj_push_validated_read(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) {\n\tduk_double_union du;\n\n\tDUK_MEMCPY((void *) du.uc, (const void *) p, (size_t) elem_size);\n\n\tswitch (h_bufobj->elem_type) {\n\tcase DUK_HBUFOBJ_ELEM_UINT8:\n\tcase DUK_HBUFOBJ_ELEM_UINT8CLAMPED:\n\t\tduk_push_uint(thr, (duk_uint_t) du.uc[0]);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_INT8:\n\t\tduk_push_int(thr, (duk_int_t) (duk_int8_t) du.uc[0]);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_UINT16:\n\t\tduk_push_uint(thr, (duk_uint_t) du.us[0]);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_INT16:\n\t\tduk_push_int(thr, (duk_int_t) (duk_int16_t) du.us[0]);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_UINT32:\n\t\tduk_push_uint(thr, (duk_uint_t) du.ui[0]);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_INT32:\n\t\tduk_push_int(thr, (duk_int_t) (duk_int32_t) du.ui[0]);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_FLOAT32:\n\t\tduk_push_number(thr, (duk_double_t) du.f[0]);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_FLOAT64:\n\t\tduk_push_number(thr, (duk_double_t) du.d);\n\t\tbreak;\n\tdefault:\n\t\tDUK_UNREACHABLE();\n\t}\n}\n\n/* Indexed write helper for buffer objects, also called from outside this file. */\nDUK_INTERNAL void duk_hbufobj_validated_write(duk_hthread *thr, duk_hbufobj *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) {\n\tduk_double_union du;\n\n\t/* NOTE! Caller must ensure that any side effects from the\n\t * coercions below are safe.  If that cannot be guaranteed\n\t * (which is normally the case), caller must coerce the\n\t * argument using duk_to_number() before any pointer\n\t * validations; the result of duk_to_number() always coerces\n\t * without side effects here.\n\t */\n\n\tswitch (h_bufobj->elem_type) {\n\tcase DUK_HBUFOBJ_ELEM_UINT8:\n\t\tdu.uc[0] = (duk_uint8_t) duk_to_uint32(thr, -1);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_UINT8CLAMPED:\n\t\tdu.uc[0] = (duk_uint8_t) duk_to_uint8clamped(thr, -1);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_INT8:\n\t\tdu.uc[0] = (duk_uint8_t) duk_to_int32(thr, -1);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_UINT16:\n\t\tdu.us[0] = (duk_uint16_t) duk_to_uint32(thr, -1);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_INT16:\n\t\tdu.us[0] = (duk_uint16_t) duk_to_int32(thr, -1);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_UINT32:\n\t\tdu.ui[0] = (duk_uint32_t) duk_to_uint32(thr, -1);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_INT32:\n\t\tdu.ui[0] = (duk_uint32_t) duk_to_int32(thr, -1);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_FLOAT32:\n\t\tdu.f[0] = (duk_float_t) duk_to_number_m1(thr);\n\t\tbreak;\n\tcase DUK_HBUFOBJ_ELEM_FLOAT64:\n\t\tdu.d = (duk_double_t) duk_to_number_m1(thr);\n\t\tbreak;\n\tdefault:\n\t\tDUK_UNREACHABLE();\n\t}\n\n\tDUK_MEMCPY((void *) p, (const void *) du.uc, (size_t) elem_size);\n}\n\n/* Helper to create a fixed buffer from argument value at index 0.\n * Node.js and allocPlain() compatible.\n */\nDUK_LOCAL duk_hbuffer *duk__hbufobj_fixed_from_argvalue(duk_hthread *thr) {\n\tduk_int_t len;\n\tduk_int_t i;\n\tduk_size_t buf_size;\n\tduk_uint8_t *buf;\n\n\tswitch (duk_get_type(thr, 0)) {\n\tcase DUK_TYPE_NUMBER: {\n\t\tlen = duk_to_int_clamped(thr, 0, 0, DUK_INT_MAX);\n\t\t(void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len);\n\t\tbreak;\n\t}\n\tcase DUK_TYPE_BUFFER: { /* Treat like Uint8Array. */\n\t\tgoto slow_copy;\n\t}\n\tcase DUK_TYPE_OBJECT: {\n\t\tduk_hobject *h;\n\t\tduk_hbufobj *h_bufobj;\n\n\t\t/* For Node.js Buffers \"Passing an ArrayBuffer returns a Buffer\n\t\t * that shares allocated memory with the given ArrayBuffer.\"\n\t\t * https://nodejs.org/api/buffer.html#buffer_buffer_from_buffer_alloc_and_buffer_allocunsafe\n\t\t */\n\n\t\th = duk_known_hobject(thr, 0);\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAYBUFFER) {\n\t\t\tDUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(h));\n\t\t\th_bufobj = (duk_hbufobj *) h;\n\t\t\tif (DUK_UNLIKELY(h_bufobj->buf == NULL)) {\n\t\t\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\t\t}\n\t\t\tif (DUK_UNLIKELY(h_bufobj->offset != 0 || h_bufobj->length != DUK_HBUFFER_GET_SIZE(h_bufobj->buf))) {\n\t\t\t\t/* No support for ArrayBuffers with slice\n\t\t\t\t * offset/length.\n\t\t\t\t */\n\t\t\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\t\t}\n\t\t\tduk_push_hbuffer(thr, h_bufobj->buf);\n\t\t\treturn h_bufobj->buf;\n\t\t}\n\t\tgoto slow_copy;\n\t}\n\tcase DUK_TYPE_STRING: {\n\t\t/* ignore encoding for now */\n\t\tduk_require_hstring_notsymbol(thr, 0);\n\t\tduk_dup_0(thr);\n\t\t(void) duk_to_buffer(thr, -1, &buf_size);\n\t\tbreak;\n\t}\n\tdefault:\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n done:\n\tDUK_ASSERT(duk_is_buffer(thr, -1));\n\treturn duk_known_hbuffer(thr, -1);\n\n slow_copy:\n\t/* XXX: fast path for typed arrays and other buffer objects? */\n\n\t(void) duk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LENGTH);\n\tlen = duk_to_int_clamped(thr, -1, 0, DUK_INT_MAX);\n\tduk_pop(thr);\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) len);  /* no zeroing, all indices get initialized */\n\tfor (i = 0; i < len; i++) {\n\t\t/* XXX: fast path for array or buffer arguments? */\n\t\tduk_get_prop_index(thr, 0, (duk_uarridx_t) i);\n\t\tbuf[i] = (duk_uint8_t) (duk_to_uint32(thr, -1) & 0xffU);\n\t\tduk_pop(thr);\n\t}\n\tgoto done;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer constructor\n *\n *  Node.js Buffers are just Uint8Arrays with internal prototype set to\n *  Buffer.prototype so they're handled otherwise the same as Uint8Array.\n *  However, the constructor arguments are very different so a separate\n *  constructor entry point is used.\n */\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_hthread *thr) {\n\tduk_hbuffer *h_buf;\n\n\th_buf = duk__hbufobj_fixed_from_argvalue(thr);\n\tDUK_ASSERT(h_buf != NULL);\n\n\tduk_push_buffer_object(thr,\n\t                       -1,\n\t                       0,\n\t                       DUK_HBUFFER_FIXED_GET_SIZE((duk_hbuffer_fixed *) h_buf),\n\t                       DUK_BUFOBJ_UINT8ARRAY);\n\tduk_push_hobject_bidx(thr, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE);\n\tduk_set_prototype(thr, -2);\n\n\t/* XXX: a more direct implementation */\n\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  ArrayBuffer, DataView, and TypedArray constructors\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_arraybuffer_constructor(duk_hthread *thr) {\n\tduk_hbufobj *h_bufobj;\n\tduk_hbuffer *h_val;\n\tduk_int_t len;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\tduk_require_constructor_call(thr);\n\n\tlen = duk_to_int(thr, 0);\n\tif (len < 0) {\n\t\tgoto fail_length;\n\t}\n\t(void) duk_push_fixed_buffer_zero(thr, (duk_size_t) len);\n\th_val = (duk_hbuffer *) duk_known_hbuffer(thr, -1);\n\n\th_bufobj = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER),\n\t                               DUK_BIDX_ARRAYBUFFER_PROTOTYPE);\n\tDUK_ASSERT(h_bufobj != NULL);\n\n\tduk__set_bufobj_buffer(thr, h_bufobj, h_val);\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\treturn 1;\n\n fail_length:\n\tDUK_DCERROR_RANGE_INVALID_LENGTH(thr);\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n\n/* Format of magic, bits:\n *   0...1: elem size shift (0-3)\n *   2...5: elem type (DUK_HBUFOBJ_ELEM_xxx)\n *\n * XXX: add prototype bidx explicitly to magic instead of using a mapping?\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) {\n\tduk_tval *tv;\n\tduk_hobject *h_obj;\n\tduk_hbufobj *h_bufobj = NULL;\n\tduk_hbufobj *h_bufarg = NULL;\n\tduk_hbuffer *h_val;\n\tduk_small_uint_t magic;\n\tduk_small_uint_t shift;\n\tduk_small_uint_t elem_type;\n\tduk_small_uint_t elem_size;\n\tduk_small_uint_t class_num;\n\tduk_small_uint_t proto_bidx;\n\tduk_uint_t align_mask;\n\tduk_uint_t elem_length;\n\tduk_int_t elem_length_signed;\n\tduk_uint_t byte_length;\n\tduk_small_uint_t copy_mode;\n\n\t/* XXX: The same copy helpers could be shared with at least some\n\t * buffer functions.\n\t */\n\n\tduk_require_constructor_call(thr);\n\n\t/* We could fit built-in index into magic but that'd make the magic\n\t * number dependent on built-in numbering (genbuiltins.py doesn't\n\t * handle that yet).  So map both class and prototype from the\n\t * element type.\n\t */\n\tmagic = (duk_small_uint_t) duk_get_current_magic(thr);\n\tshift = magic & 0x03U;               /* bits 0...1: shift */\n\telem_type = (magic >> 2) & 0x0fU;    /* bits 2...5: type */\n\telem_size = 1U << shift;\n\talign_mask = elem_size - 1;\n\tDUK_ASSERT(elem_type < sizeof(duk__buffer_proto_from_elemtype) / sizeof(duk_uint8_t));\n\tproto_bidx = duk__buffer_proto_from_elemtype[elem_type];\n\tDUK_ASSERT(proto_bidx < DUK_NUM_BUILTINS);\n\tDUK_ASSERT(elem_type < sizeof(duk__buffer_class_from_elemtype) / sizeof(duk_uint8_t));\n\tclass_num = duk__buffer_class_from_elemtype[elem_type];\n\n\tDUK_DD(DUK_DDPRINT(\"typedarray constructor, magic=%d, shift=%d, elem_type=%d, \"\n\t                   \"elem_size=%d, proto_bidx=%d, class_num=%d\",\n\t                   (int) magic, (int) shift, (int) elem_type, (int) elem_size,\n\t                   (int) proto_bidx, (int) class_num));\n\n\t/* Argument variants.  When the argument is an ArrayBuffer a view to\n\t * the same buffer is created; otherwise a new ArrayBuffer is always\n\t * created.\n\t */\n\n\t/* XXX: initial iteration to treat a plain buffer like an ArrayBuffer:\n\t * coerce to an ArrayBuffer object and use that as .buffer.  The underlying\n\t * buffer will be the same but result .buffer !== inputPlainBuffer.\n\t */\n\tduk_hbufobj_promote_plain(thr, 0);\n\n\ttv = duk_get_tval(thr, 0);\n\tDUK_ASSERT(tv != NULL);  /* arg count */\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th_obj = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h_obj != NULL);\n\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_ARRAYBUFFER) {\n\t\t\t/* ArrayBuffer: unlike any other argument variant, create\n\t\t\t * a view into the existing buffer.\n\t\t\t */\n\n\t\t\tduk_int_t byte_offset_signed;\n\t\t\tduk_uint_t byte_offset;\n\n\t\t\th_bufarg = (duk_hbufobj *) h_obj;\n\n\t\t\tbyte_offset_signed = duk_to_int(thr, 1);\n\t\t\tif (byte_offset_signed < 0) {\n\t\t\t\tgoto fail_arguments;\n\t\t\t}\n\t\t\tbyte_offset = (duk_uint_t) byte_offset_signed;\n\t\t\tif (byte_offset > h_bufarg->length ||\n\t\t\t    (byte_offset & align_mask) != 0) {\n\t\t\t\t/* Must be >= 0 and multiple of element size. */\n\t\t\t\tgoto fail_arguments;\n\t\t\t}\n\t\t\tif (duk_is_undefined(thr, 2)) {\n\t\t\t\tDUK_ASSERT(h_bufarg->length >= byte_offset);\n\t\t\t\tbyte_length = h_bufarg->length - byte_offset;\n\t\t\t\tif ((byte_length & align_mask) != 0) {\n\t\t\t\t\t/* Must be element size multiple from\n\t\t\t\t\t * start offset to end of buffer.\n\t\t\t\t\t */\n\t\t\t\t\tgoto fail_arguments;\n\t\t\t\t}\n\t\t\t\telem_length = (byte_length >> shift);\n\t\t\t} else {\n\t\t\t\telem_length_signed = duk_to_int(thr, 2);\n\t\t\t\tif (elem_length_signed < 0) {\n\t\t\t\t\tgoto fail_arguments;\n\t\t\t\t}\n\t\t\t\telem_length = (duk_uint_t) elem_length_signed;\n\t\t\t\tbyte_length = elem_length << shift;\n\t\t\t\tif ((byte_length >> shift) != elem_length) {\n\t\t\t\t\t/* Byte length would overflow. */\n\t\t\t\t\t/* XXX: easier check with less code? */\n\t\t\t\t\tgoto fail_arguments;\n\t\t\t\t}\n\t\t\t\tDUK_ASSERT(h_bufarg->length >= byte_offset);\n\t\t\t\tif (byte_length > h_bufarg->length - byte_offset) {\n\t\t\t\t\t/* Not enough data. */\n\t\t\t\t\tgoto fail_arguments;\n\t\t\t\t}\n\t\t\t}\n\t\t\tDUK_UNREF(elem_length);\n\t\t\tDUK_ASSERT_DISABLE(byte_offset >= 0);\n\t\t\tDUK_ASSERT(byte_offset <= h_bufarg->length);\n\t\t\tDUK_ASSERT_DISABLE(byte_length >= 0);\n\t\t\tDUK_ASSERT(byte_offset + byte_length <= h_bufarg->length);\n\t\t\tDUK_ASSERT((elem_length << shift) == byte_length);\n\n\t\t\th_bufobj = duk_push_bufobj_raw(thr,\n\t\t\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t\t\t                               DUK_HOBJECT_CLASS_AS_FLAGS(class_num),\n\t\t\t                               (duk_small_int_t) proto_bidx);\n\t\t\th_val = h_bufarg->buf;\n\t\t\tif (h_val == NULL) {\n\t\t\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t\t\t}\n\t\t\th_bufobj->buf = h_val;\n\t\t\tDUK_HBUFFER_INCREF(thr, h_val);\n\t\t\th_bufobj->offset = h_bufarg->offset + byte_offset;\n\t\t\th_bufobj->length = byte_length;\n\t\t\th_bufobj->shift = (duk_uint8_t) shift;\n\t\t\th_bufobj->elem_type = (duk_uint8_t) elem_type;\n\t\t\th_bufobj->is_typedarray = 1;\n\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\t\t\t/* Set .buffer to the argument ArrayBuffer. */\n\t\t\tDUK_ASSERT(h_bufobj->buf_prop == NULL);\n\t\t\th_bufobj->buf_prop = (duk_hobject *) h_bufarg;\n\t\t\tDUK_ASSERT(h_bufarg != NULL);\n\t\t\tDUK_HBUFOBJ_INCREF(thr, h_bufarg);\n\t\t\treturn 1;\n\t\t} else if (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {\n\t\t\t/* TypedArray (or other non-ArrayBuffer duk_hbufobj).\n\t\t\t * Conceptually same behavior as for an Array-like argument,\n\t\t\t * with a few fast paths.\n\t\t\t */\n\n\t\t\th_bufarg = (duk_hbufobj *) h_obj;\n\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_bufarg);\n\t\t\telem_length_signed = (duk_int_t) (h_bufarg->length >> h_bufarg->shift);\n\t\t\tif (h_bufarg->buf == NULL) {\n\t\t\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t\t\t}\n\n\t\t\t/* Select copy mode.  Must take into account element\n\t\t\t * compatibility and validity of the underlying source\n\t\t\t * buffer.\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"selecting copy mode for bufobj arg, \"\n\t\t\t                     \"src byte_length=%ld, src shift=%d, \"\n\t\t\t                     \"src/dst elem_length=%ld; \"\n\t\t\t                     \"dst shift=%d -> dst byte_length=%ld\",\n\t\t\t                     (long) h_bufarg->length, (int) h_bufarg->shift,\n\t\t\t                     (long) elem_length_signed, (int) shift,\n\t\t\t                     (long) (elem_length_signed << shift)));\n\n\t\t\tcopy_mode = 2;  /* default is explicit index read/write copy */\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\t\t/* With a size optimized build copy_mode 2 is enough.\n\t\t\t * Modes 0 and 1 are faster but conceptually the same.\n\t\t\t */\n\t\t\tDUK_ASSERT(elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t));\n\t\t\tif (DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) {\n\t\t\t\tif ((duk__buffer_elemtype_copy_compatible[elem_type] & (1 << h_bufarg->elem_type)) != 0) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"source/target are copy compatible, memcpy\"));\n\t\t\t\t\tDUK_ASSERT(shift == h_bufarg->shift);  /* byte sizes will match */\n\t\t\t\t\tcopy_mode = 0;\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"source/target not copy compatible but valid, fast copy\"));\n\t\t\t\t\tcopy_mode = 1;\n\t\t\t\t}\n\t\t\t}\n#endif  /* !DUK_USE_PREFER_SIZE */\n\t\t} else {\n\t\t\t/* Array or Array-like */\n\t\t\telem_length_signed = (duk_int_t) duk_get_length(thr, 0);\n\t\t\tcopy_mode = 2;\n\t\t}\n\t} else {\n\t\t/* Non-object argument is simply int coerced, matches\n\t\t * V8 behavior (except for \"null\", which we coerce to\n\t\t * 0 but V8 TypeErrors).\n\t\t */\n\t\telem_length_signed = duk_to_int(thr, 0);\n\t\tcopy_mode = 3;\n\t}\n\tif (elem_length_signed < 0) {\n\t\tgoto fail_arguments;\n\t}\n\telem_length = (duk_uint_t) elem_length_signed;\n\tbyte_length = (duk_uint_t) (elem_length << shift);\n\tif ((byte_length >> shift) != elem_length) {\n\t\t/* Byte length would overflow. */\n\t\t/* XXX: easier check with less code? */\n\t\tgoto fail_arguments;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"elem_length=%ld, byte_length=%ld\",\n\t                     (long) elem_length, (long) byte_length));\n\n\t/* ArrayBuffer argument is handled specially above; the rest of the\n\t * argument variants are handled by shared code below.\n\t *\n\t * ArrayBuffer in h_bufobj->buf_prop is intentionally left unset.\n\t * It will be automatically created by the .buffer accessor on\n\t * first access.\n\t */\n\n\t/* Push the resulting view object on top of a plain fixed buffer. */\n\t(void) duk_push_fixed_buffer(thr, byte_length);\n\th_val = duk_known_hbuffer(thr, -1);\n\tDUK_ASSERT(h_val != NULL);\n\n\th_bufobj = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(class_num),\n\t                               (duk_small_int_t) proto_bidx);\n\n\th_bufobj->buf = h_val;\n\tDUK_HBUFFER_INCREF(thr, h_val);\n\tDUK_ASSERT(h_bufobj->offset == 0);\n\th_bufobj->length = byte_length;\n\th_bufobj->shift = (duk_uint8_t) shift;\n\th_bufobj->elem_type = (duk_uint8_t) elem_type;\n\th_bufobj->is_typedarray = 1;\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\t/* Copy values, the copy method depends on the arguments.\n\t *\n\t * Copy mode decision may depend on the validity of the underlying\n\t * buffer of the source argument; there must be no harmful side effects\n\t * from there to here for copy_mode to still be valid.\n\t */\n\tDUK_DDD(DUK_DDDPRINT(\"copy mode: %d\", (int) copy_mode));\n\tswitch (copy_mode) {\n\t\t/* Copy modes 0 and 1 can be omitted in size optimized build,\n\t\t * copy mode 2 handles them (but more slowly).\n\t\t */\n#if !defined(DUK_USE_PREFER_SIZE)\n\tcase 0: {\n\t\t/* Use byte copy. */\n\n\t\tduk_uint8_t *p_src;\n\t\tduk_uint8_t *p_dst;\n\n\t\tDUK_ASSERT(h_bufobj != NULL);\n\t\tDUK_ASSERT(h_bufobj->buf != NULL);\n\t\tDUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj));\n\t\tDUK_ASSERT(h_bufarg != NULL);\n\t\tDUK_ASSERT(h_bufarg->buf != NULL);\n\t\tDUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg));\n\n\t\tp_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj);\n\t\tp_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"using memcpy: p_src=%p, p_dst=%p, byte_length=%ld\",\n\t\t                     (void *) p_src, (void *) p_dst, (long) byte_length));\n\n\t\tDUK_MEMCPY((void *) p_dst, (const void *) p_src, (size_t) byte_length);\n\t\tbreak;\n\t}\n\tcase 1: {\n\t\t/* Copy values through direct validated reads and writes. */\n\n\t\tduk_small_uint_t src_elem_size;\n\t\tduk_small_uint_t dst_elem_size;\n\t\tduk_uint8_t *p_src;\n\t\tduk_uint8_t *p_src_end;\n\t\tduk_uint8_t *p_dst;\n\n\t\tDUK_ASSERT(h_bufobj != NULL);\n\t\tDUK_ASSERT(h_bufobj->buf != NULL);\n\t\tDUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufobj));\n\t\tDUK_ASSERT(h_bufarg != NULL);\n\t\tDUK_ASSERT(h_bufarg->buf != NULL);\n\t\tDUK_ASSERT(DUK_HBUFOBJ_VALID_SLICE(h_bufarg));\n\n\t\tsrc_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift);\n\t\tdst_elem_size = elem_size;\n\n\t\tp_src = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg);\n\t\tp_dst = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj);\n\t\tp_src_end = p_src + h_bufarg->length;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"using fast copy: p_src=%p, p_src_end=%p, p_dst=%p, \"\n\t\t                     \"src_elem_size=%d, dst_elem_size=%d\",\n\t\t                     (void *) p_src, (void *) p_src_end, (void *) p_dst,\n\t\t                     (int) src_elem_size, (int) dst_elem_size));\n\n\t\twhile (p_src != p_src_end) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"fast path per element copy loop: \"\n\t\t\t                     \"p_src=%p, p_src_end=%p, p_dst=%p\",\n\t\t\t                     (void *) p_src, (void *) p_src_end, (void *) p_dst));\n\t\t\t/* A validated read() is always a number, so it's write coercion\n\t\t\t * is always side effect free an won't invalidate pointers etc.\n\t\t\t */\n\t\t\tduk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size);\n\t\t\tduk_hbufobj_validated_write(thr, h_bufobj, p_dst, dst_elem_size);\n\t\t\tduk_pop(thr);\n\t\t\tp_src += src_elem_size;\n\t\t\tp_dst += dst_elem_size;\n\t\t}\n\t\tbreak;\n\t}\n#endif  /* !DUK_USE_PREFER_SIZE */\n\tcase 2: {\n\t\t/* Copy values by index reads and writes.  Let virtual\n\t\t * property handling take care of coercion.\n\t\t */\n\t\tduk_uint_t i;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"using slow copy\"));\n\n\t\tfor (i = 0; i < elem_length; i++) {\n\t\t\tduk_get_prop_index(thr, 0, (duk_uarridx_t) i);\n\t\t\tduk_put_prop_index(thr, -2, (duk_uarridx_t) i);\n\t\t}\n\t\tbreak;\n\t}\n\tdefault:\n\tcase 3: {\n\t\t/* No copy, leave zero bytes in the buffer.  There's no\n\t\t * ambiguity with Float32/Float64 because zero bytes also\n\t\t * represent 0.0.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"using no copy\"));\n\t\tbreak;\n\t}\n\t}\n\n\treturn 1;\n\n fail_arguments:\n\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n}\n#else  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n/* When bufferobject support is disabled, new Uint8Array() could still be\n * supported to create a plain fixed buffer.  Disabled for now.\n */\n#if 0\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_hthread *thr) {\n\tduk_int_t elem_length_signed;\n\tduk_uint_t byte_length;\n\n\t/* XXX: The same copy helpers could be shared with at least some\n\t * buffer functions.\n\t */\n\n\tduk_require_constructor_call(thr);\n\n\telem_length_signed = duk_require_int(thr, 0);\n\tif (elem_length_signed < 0) {\n\t\tgoto fail_arguments;\n\t}\n\tbyte_length = (duk_uint_t) elem_length_signed;\n\n\t(void) duk_push_fixed_buffer_zero(thr, (duk_size_t) byte_length);\n\treturn 1;\n\n fail_arguments:\n\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n}\n#endif  /* 0 */\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_dataview_constructor(duk_hthread *thr) {\n\tduk_hbufobj *h_bufarg;\n\tduk_hbufobj *h_bufobj;\n\tduk_hbuffer *h_val;\n\tduk_uint_t offset;\n\tduk_uint_t length;\n\n\tduk_require_constructor_call(thr);\n\n\th_bufarg = duk__require_bufobj_value(thr, 0);\n\tDUK_ASSERT(h_bufarg != NULL);\n\tif (DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufarg) != DUK_HOBJECT_CLASS_ARRAYBUFFER) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\tduk__resolve_offset_opt_length(thr, h_bufarg, 1, 2, &offset, &length, 1 /*throw_flag*/);\n\tDUK_ASSERT(offset <= h_bufarg->length);\n\tDUK_ASSERT(offset + length <= h_bufarg->length);\n\n\th_bufobj = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATAVIEW),\n\t                               DUK_BIDX_DATAVIEW_PROTOTYPE);\n\n\th_val = h_bufarg->buf;\n\tif (h_val == NULL) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\th_bufobj->buf = h_val;\n\tDUK_HBUFFER_INCREF(thr, h_val);\n\th_bufobj->offset = h_bufarg->offset + offset;\n\th_bufobj->length = length;\n\tDUK_ASSERT(h_bufobj->shift == 0);\n\tDUK_ASSERT(h_bufobj->elem_type == DUK_HBUFOBJ_ELEM_UINT8);\n\tDUK_ASSERT(h_bufobj->is_typedarray == 0);\n\n\tDUK_ASSERT(h_bufobj->buf_prop == NULL);\n\th_bufobj->buf_prop = (duk_hobject *) h_bufarg;\n\tDUK_ASSERT(h_bufarg != NULL);\n\tDUK_HBUFOBJ_INCREF(thr, h_bufarg);\n\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  ArrayBuffer.isView()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_arraybuffer_isview(duk_hthread *thr) {\n\tduk_hobject *h_obj;\n\tduk_bool_t ret = 0;\n\n\tif (duk_is_buffer(thr, 0)) {\n\t\tret = 1;\n\t} else {\n\t\th_obj = duk_get_hobject(thr, 0);\n\t\tif (h_obj != NULL && DUK_HOBJECT_IS_BUFOBJ(h_obj)) {\n\t\t\t/* DataView needs special casing: ArrayBuffer.isView() is\n\t\t\t * true, but ->is_typedarray is 0.\n\t\t\t */\n\t\t\tret = ((duk_hbufobj *) h_obj)->is_typedarray ||\n\t\t\t      (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_DATAVIEW);\n\t\t}\n\t}\n\tduk_push_boolean(thr, ret);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Uint8Array.allocPlain()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_uint8array_allocplain(duk_hthread *thr) {\n\tduk__hbufobj_fixed_from_argvalue(thr);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Uint8Array.plainOf()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_uint8array_plainof(duk_hthread *thr) {\n\tduk_hbufobj *h_bufobj;\n\n#if !defined(DUK_USE_PREFER_SIZE)\n\t/* Avoid churn if argument is already a plain buffer. */\n\tif (duk_is_buffer(thr, 0)) {\n\t\treturn 1;\n\t}\n#endif\n\n\t/* Promotes plain buffers to ArrayBuffers, so for a plain buffer\n\t * argument we'll create a pointless temporary (but still work\n\t * correctly).\n\t */\n\th_bufobj = duk__require_bufobj_value(thr, 0);\n\tif (h_bufobj->buf == NULL) {\n\t\tduk_push_undefined(thr);\n\t} else {\n\t\tduk_push_hbuffer(thr, h_bufobj->buf);\n\t}\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer: toString([encoding], [start], [end])\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_hthread *thr) {\n\tduk_hbufobj *h_this;\n\tduk_int_t start_offset, end_offset;\n\tduk_uint8_t *buf_slice;\n\tduk_size_t slice_length;\n\n\th_this = duk__get_bufobj_this(thr);\n\tif (h_this == NULL) {\n\t\t/* XXX: happens e.g. when evaluating: String(Buffer.prototype). */\n\t\tduk_push_string(thr, \"[object Object]\");\n\t\treturn 1;\n\t}\n\tDUK_ASSERT_HBUFOBJ_VALID(h_this);\n\n\t/* Ignore encoding for now. */\n\n\tduk__clamp_startend_nonegidx_noshift(thr,\n\t                                     (duk_int_t) h_this->length,\n\t                                     1 /*idx_start*/,\n\t                                     2 /*idx_end*/,\n\t                                     &start_offset,\n\t                                     &end_offset);\n\n\tslice_length = (duk_size_t) (end_offset - start_offset);\n\tbuf_slice = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, slice_length);  /* all bytes initialized below */\n\tDUK_ASSERT(buf_slice != NULL);\n\n\t/* Neutered or uncovered, TypeError. */\n\tif (h_this->buf == NULL ||\n\t    !DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length)) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\t/* XXX: ideally we wouldn't make a copy but a view into the buffer for the\n\t * decoding process.  Or the decoding helper could be changed to accept\n\t * the slice info (a buffer pointer is NOT a good approach because guaranteeing\n\t * its stability is difficult).\n\t */\n\n\tDUK_ASSERT(DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, (duk_size_t) start_offset + slice_length));\n\tDUK_MEMCPY((void *) buf_slice,\n\t           (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset),\n\t           (size_t) slice_length);\n\n\t/* Use the equivalent of: new TextEncoder().encode(this) to convert the\n\t * string.  Result will be valid UTF-8; non-CESU-8 inputs are currently\n\t * interpreted loosely.  Value stack convention is a bit odd for now.\n\t */\n\tduk_replace(thr, 0);\n\tduk_set_top(thr, 1);\n\treturn duk_textdecoder_decode_utf8_nodejs(thr);\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.prototype: toJSON()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_hthread *thr) {\n\tduk_hbufobj *h_this;\n\tduk_uint8_t *buf;\n\tduk_uint_t i, n;\n\tduk_tval *tv;\n\n\th_this = duk__require_bufobj_this(thr);\n\tDUK_ASSERT(h_this != NULL);\n\n\tif (h_this->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_this)) {\n\t\t/* Serialize uncovered backing buffer as a null; doesn't\n\t\t * really matter as long we're memory safe.\n\t\t */\n\t\tduk_push_null(thr);\n\t\treturn 1;\n\t}\n\n\tduk_push_object(thr);\n\tduk_push_hstring_stridx(thr, DUK_STRIDX_UC_BUFFER);\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_TYPE);\n\n\t/* XXX: uninitialized would be OK */\n\tDUK_ASSERT_DISABLE((duk_size_t) h_this->length <= (duk_size_t) DUK_UINT32_MAX);\n\ttv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) h_this->length);  /* XXX: needs revision with >4G buffers */\n\n\tDUK_ASSERT(h_this->buf != NULL);\n\tbuf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this);\n\tfor (i = 0, n = h_this->length; i < n; i++) {\n\t\tDUK_TVAL_SET_U32(tv + i, (duk_uint32_t) buf[i]);  /* no need for decref or incref */\n\t}\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_DATA);\n\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.prototype.equals()\n *  Node.js Buffer.prototype.compare()\n *  Node.js Buffer.compare()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_buffer_compare_shared(duk_hthread *thr) {\n\tduk_small_uint_t magic;\n\tduk_hbufobj *h_bufarg1;\n\tduk_hbufobj *h_bufarg2;\n\tduk_small_int_t comp_res;\n\n\t/* XXX: keep support for plain buffers and non-Node.js buffers? */\n\n\tmagic = (duk_small_uint_t) duk_get_current_magic(thr);\n\tif (magic & 0x02U) {\n\t\t/* Static call style. */\n\t\th_bufarg1 = duk__require_bufobj_value(thr, 0);\n\t\th_bufarg2 = duk__require_bufobj_value(thr, 1);\n\t} else {\n\t\th_bufarg1 = duk__require_bufobj_this(thr);\n\t\th_bufarg2 = duk__require_bufobj_value(thr, 0);\n\t}\n\tDUK_ASSERT(h_bufarg1 != NULL);\n\tDUK_ASSERT(h_bufarg2 != NULL);\n\n\t/* We want to compare the slice/view areas of the arguments.\n\t * If either slice/view is invalid (underlying buffer is shorter)\n\t * ensure equals() is false, but otherwise the only thing that\n\t * matters is to be memory safe.\n\t */\n\n\tif (DUK_HBUFOBJ_VALID_SLICE(h_bufarg1) &&\n\t    DUK_HBUFOBJ_VALID_SLICE(h_bufarg2)) {\n\t\tcomp_res = duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg1->buf) + h_bufarg1->offset,\n\t\t                               (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg2->buf) + h_bufarg2->offset,\n\t\t                               (duk_size_t) h_bufarg1->length,\n\t\t                               (duk_size_t) h_bufarg2->length);\n\t} else {\n\t\tcomp_res = -1;  /* either nonzero value is ok */\n\t}\n\n\tif (magic & 0x01U) {\n\t\t/* compare: similar to string comparison but for buffer data. */\n\t\tduk_push_int(thr, comp_res);\n\t} else {\n\t\t/* equals */\n\t\tduk_push_boolean(thr, (comp_res == 0));\n\t}\n\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.prototype.fill()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_fill(duk_hthread *thr) {\n\tduk_hbufobj *h_this;\n\tconst duk_uint8_t *fill_str_ptr;\n\tduk_size_t fill_str_len;\n\tduk_uint8_t fill_value;\n\tduk_int_t fill_offset;\n\tduk_int_t fill_end;\n\tduk_size_t fill_length;\n\tduk_uint8_t *p;\n\n\th_this = duk__require_bufobj_this(thr);\n\tDUK_ASSERT(h_this != NULL);\n\tif (h_this->buf == NULL) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\t/* [ value offset end ] */\n\n\tif (duk_is_string_notsymbol(thr, 0)) {\n\t\tfill_str_ptr = (const duk_uint8_t *) duk_get_lstring(thr, 0, &fill_str_len);\n\t\tDUK_ASSERT(fill_str_ptr != NULL);\n\t} else {\n\t\t/* Symbols get ToNumber() coerced and cause TypeError. */\n\t\tfill_value = (duk_uint8_t) duk_to_uint32(thr, 0);\n\t\tfill_str_ptr = (const duk_uint8_t *) &fill_value;\n\t\tfill_str_len = 1;\n\t}\n\n\t/* Fill offset handling is more lenient than in Node.js. */\n\n\tduk__clamp_startend_nonegidx_noshift(thr,\n\t                                     (duk_int_t) h_this->length,\n\t                                     1 /*idx_start*/,\n\t                                     2 /*idx_end*/,\n\t                                     &fill_offset,\n\t                                     &fill_end);\n\n\tDUK_DDD(DUK_DDDPRINT(\"fill: fill_value=%02x, fill_offset=%ld, fill_end=%ld, view length=%ld\",\n\t                     (unsigned int) fill_value, (long) fill_offset, (long) fill_end, (long) h_this->length));\n\n\tDUK_ASSERT(fill_end - fill_offset >= 0);\n\tDUK_ASSERT(h_this->buf != NULL);\n\n\tp = (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + fill_offset);\n\tfill_length = (duk_size_t) (fill_end - fill_offset);\n\tif (fill_str_len == 1) {\n\t\t/* Handle single character fills as memset() even when\n\t\t * the fill data comes from a one-char argument.\n\t\t */\n\t\tDUK_MEMSET((void *) p, (int) fill_str_ptr[0], (size_t) fill_length);\n\t} else if (fill_str_len > 1) {\n\t\tduk_size_t i, n, t;\n\n\t\tfor (i = 0, n = (duk_size_t) (fill_end - fill_offset), t = 0; i < n; i++) {\n\t\t\tp[i] = fill_str_ptr[t++];\n\t\t\tif (t >= fill_str_len) {\n\t\t\t\tt = 0;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"zero size fill pattern, ignore silently\"));\n\t}\n\n\t/* Return the Buffer to allow chaining: b.fill(0x11).fill(0x22, 3, 5).toString() */\n\tduk_push_this(thr);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.prototype.write(string, [offset], [length], [encoding])\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_write(duk_hthread *thr) {\n\tduk_hbufobj *h_this;\n\tduk_uint_t offset;\n\tduk_uint_t length;\n\tconst duk_uint8_t *str_data;\n\tduk_size_t str_len;\n\n\t/* XXX: very inefficient support for plain buffers */\n\th_this = duk__require_bufobj_this(thr);\n\tDUK_ASSERT(h_this != NULL);\n\n\t/* Argument must be a string, e.g. a buffer is not allowed. */\n\tstr_data = (const duk_uint8_t *) duk_require_lstring_notsymbol(thr, 0, &str_len);\n\n\tduk__resolve_offset_opt_length(thr, h_this, 1, 2, &offset, &length, 0 /*throw_flag*/);\n\tDUK_ASSERT(offset <= h_this->length);\n\tDUK_ASSERT(offset + length <= h_this->length);\n\n\t/* XXX: encoding is ignored now. */\n\n\tif (length > str_len) {\n\t\tlength = (duk_uint_t) str_len;\n\t}\n\n\tif (DUK_HBUFOBJ_VALID_SLICE(h_this)) {\n\t\t/* Cannot overlap. */\n\t\tDUK_MEMCPY((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset),\n\t\t           (const void *) str_data,\n\t\t           (size_t) length);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"write() target buffer is not covered, silent ignore\"));\n\t}\n\n\tduk_push_uint(thr, length);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.prototype.copy()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_copy(duk_hthread *thr) {\n\tduk_hbufobj *h_this;\n\tduk_hbufobj *h_bufarg;\n\tduk_int_t source_length;\n\tduk_int_t target_length;\n\tduk_int_t target_start, source_start, source_end;\n\tduk_uint_t target_ustart, source_ustart, source_uend;\n\tduk_uint_t copy_size = 0;\n\n\t/* [ targetBuffer targetStart sourceStart sourceEnd ] */\n\n\th_this = duk__require_bufobj_this(thr);\n\th_bufarg = duk__require_bufobj_value(thr, 0);\n\tDUK_ASSERT(h_this != NULL);\n\tDUK_ASSERT(h_bufarg != NULL);\n\tsource_length = (duk_int_t) h_this->length;\n\ttarget_length = (duk_int_t) h_bufarg->length;\n\n\ttarget_start = duk_to_int(thr, 1);\n\tsource_start = duk_to_int(thr, 2);\n\tif (duk_is_undefined(thr, 3)) {\n\t\tsource_end = source_length;\n\t} else {\n\t\tsource_end = duk_to_int(thr, 3);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"checking copy args: target_start=%ld, target_length=%ld, \"\n\t                     \"source_start=%ld, source_end=%ld, source_length=%ld\",\n\t                     (long) target_start, (long) h_bufarg->length,\n\t                     (long) source_start, (long) source_end, (long) source_length));\n\n\t/* This behavior mostly mimics Node.js now. */\n\n\tif (source_start < 0 || source_end < 0 || target_start < 0) {\n\t\t/* Negative offsets cause a RangeError. */\n\t\tgoto fail_bounds;\n\t}\n\tsource_ustart = (duk_uint_t) source_start;\n\tsource_uend = (duk_uint_t) source_end;\n\ttarget_ustart = (duk_uint_t) target_start;\n\tif (source_ustart >= source_uend ||  /* crossed offsets or zero size */\n\t    source_ustart >= (duk_uint_t) source_length ||  /* source out-of-bounds (but positive) */\n\t    target_ustart >= (duk_uint_t) target_length) {  /* target out-of-bounds (but positive) */\n\t\tgoto silent_ignore;\n\t}\n\tif (source_uend >= (duk_uint_t) source_length) {\n\t\t/* Source end clamped silently to available length. */\n\t\tsource_uend = (duk_uint_t) source_length;\n\t}\n\tcopy_size = source_uend - source_ustart;\n\tif (target_ustart + copy_size > (duk_uint_t) target_length) {\n\t\t/* Clamp to target's end if too long.\n\t\t *\n\t\t * NOTE: there's no overflow possibility in the comparison;\n\t\t * both target_ustart and copy_size are >= 0 and based on\n\t\t * values in duk_int_t range.  Adding them as duk_uint_t\n\t\t * values is then guaranteed not to overflow.\n\t\t */\n\t\tDUK_ASSERT(target_ustart + copy_size >= target_ustart);  /* no overflow */\n\t\tDUK_ASSERT(target_ustart + copy_size >= copy_size);  /* no overflow */\n\t\tcopy_size = (duk_uint_t) target_length - target_ustart;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"making copy: target_ustart=%lu source_ustart=%lu copy_size=%lu\",\n\t                     (unsigned long) target_ustart, (unsigned long) source_ustart,\n\t                     (unsigned long) copy_size));\n\n\tDUK_ASSERT(copy_size >= 1);\n\tDUK_ASSERT(source_ustart <= (duk_uint_t) source_length);\n\tDUK_ASSERT(source_ustart + copy_size <= (duk_uint_t) source_length);\n\tDUK_ASSERT(target_ustart <= (duk_uint_t) target_length);\n\tDUK_ASSERT(target_ustart + copy_size <= (duk_uint_t) target_length);\n\n\t/* Ensure copy is covered by underlying buffers. */\n\tDUK_ASSERT(h_bufarg->buf != NULL);  /* length check */\n\tDUK_ASSERT(h_this->buf != NULL);    /* length check */\n\tif (DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufarg, target_ustart + copy_size) &&\n\t    DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, source_ustart + copy_size)) {\n\t\t/* Must use memmove() because copy area may overlap (source and target\n\t\t * buffer may be the same, or from different slices.\n\t\t */\n\t\tDUK_MEMMOVE((void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg) + target_ustart),\n\t\t            (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + source_ustart),\n\t\t            (size_t) copy_size);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"buffer copy not covered by underlying buffer(s), ignoring\"));\n\t}\n\n silent_ignore:\n\t/* Return value is like write(), number of bytes written.\n\t * The return value matters because of code like:\n\t * \"off += buf.copy(...)\".\n         */\n\tduk_push_uint(thr, copy_size);\n\treturn 1;\n\n fail_bounds:\n\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  TypedArray.prototype.set()\n *\n *  TypedArray set() is pretty interesting to implement because:\n *\n *    - The source argument may be a plain array or a typedarray.  If the\n *      source is a TypedArray, values are decoded and re-encoded into the\n *      target (not as a plain byte copy).  This may happen even when the\n *      element byte size is the same, e.g. integer values may be re-encoded\n *      into floats.\n *\n *    - Source and target may refer to the same underlying buffer, so that\n *      the set() operation may overlap.  The specification requires that this\n *      must work as if a copy was made before the operation.  Note that this\n *      is NOT a simple memmove() situation because the source and target\n *      byte sizes may be different -- e.g. a 4-byte source (Int8Array) may\n *      expand to a 16-byte target (Uint32Array) so that the target overlaps\n *      the source both from beginning and the end (unlike in typical memmove).\n *\n *    - Even if 'buf' pointers of the source and target differ, there's no\n *      guarantee that their memory areas don't overlap.  This may be the\n *      case with external buffers.\n *\n *  Even so, it is nice to optimize for the common case:\n *\n *    - Source and target separate buffers or non-overlapping.\n *\n *    - Source and target have a compatible type so that a plain byte copy\n *      is possible.  Note that while e.g. uint8 and int8 are compatible\n *      (coercion one way or another doesn't change the byte representation),\n *      e.g. int8 and uint8clamped are NOT compatible when writing int8\n *      values into uint8clamped typedarray (-1 would clamp to 0 for instance).\n *\n *  See test-bi-typedarray-proto-set.js.\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_set(duk_hthread *thr) {\n\tduk_hbufobj *h_this;\n\tduk_hobject *h_obj;\n\tduk_uarridx_t i, n;\n\tduk_int_t offset_signed;\n\tduk_uint_t offset_elems;\n\tduk_uint_t offset_bytes;\n\n\th_this = duk__require_bufobj_this(thr);\n\tDUK_ASSERT(h_this != NULL);\n\tDUK_ASSERT_HBUFOBJ_VALID(h_this);\n\n\tif (h_this->buf == NULL) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"source neutered, skip copy\"));\n\t\treturn 0;\n\t}\n\n\tduk_hbufobj_promote_plain(thr, 0);\n\th_obj = duk_require_hobject(thr, 0);\n\n\t/* XXX: V8 throws a TypeError for negative values.  Would it\n\t * be more useful to interpret negative offsets here from the\n\t * end of the buffer too?\n\t */\n\toffset_signed = duk_to_int(thr, 1);\n\tif (offset_signed < 0) {\n\t\t/* For some reason this is a TypeError (at least in V8). */\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\toffset_elems = (duk_uint_t) offset_signed;\n\toffset_bytes = offset_elems << h_this->shift;\n\tif ((offset_bytes >> h_this->shift) != offset_elems) {\n\t\t/* Byte length would overflow. */\n\t\t/* XXX: easier check with less code? */\n\t\tgoto fail_args;\n\t}\n\tif (offset_bytes > h_this->length) {\n\t\t/* Equality may be OK but >length not.  Checking\n\t\t * this explicitly avoids some overflow cases\n\t\t * below.\n\t\t */\n\t\tgoto fail_args;\n\t}\n\tDUK_ASSERT(offset_bytes <= h_this->length);\n\n\t/* Fast path: source is a TypedArray (or any bufobj). */\n\n\tif (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {\n\t\tduk_hbufobj *h_bufarg;\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\tduk_uint16_t comp_mask;\n#endif\n\t\tduk_small_int_t no_overlap = 0;\n\t\tduk_uint_t src_length;\n\t\tduk_uint_t dst_length;\n\t\tduk_uint_t dst_length_elems;\n\t\tduk_uint8_t *p_src_base;\n\t\tduk_uint8_t *p_src_end;\n\t\tduk_uint8_t *p_src;\n\t\tduk_uint8_t *p_dst_base;\n\t\tduk_uint8_t *p_dst;\n\t\tduk_small_uint_t src_elem_size;\n\t\tduk_small_uint_t dst_elem_size;\n\n\t\th_bufarg = (duk_hbufobj *) h_obj;\n\t\tDUK_ASSERT_HBUFOBJ_VALID(h_bufarg);\n\n\t\tif (h_bufarg->buf == NULL) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"target neutered, skip copy\"));\n\t\t\treturn 0;\n\t\t}\n\n\t\t/* Nominal size check. */\n\t\tsrc_length = h_bufarg->length;  /* bytes in source */\n\t\tdst_length_elems = (src_length >> h_bufarg->shift);  /* elems in source and dest */\n\t\tdst_length = dst_length_elems << h_this->shift;  /* bytes in dest */\n\t\tif ((dst_length >> h_this->shift) != dst_length_elems) {\n\t\t\t/* Byte length would overflow. */\n\t\t\t/* XXX: easier check with less code? */\n\t\t\tgoto fail_args;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"nominal size check: src_length=%ld, dst_length=%ld\",\n\t\t                     (long) src_length, (long) dst_length));\n\t\tDUK_ASSERT(offset_bytes <= h_this->length);\n\t\tif (dst_length > h_this->length - offset_bytes) {\n\t\t\t/* Overflow not an issue because subtraction is used on the right\n\t\t\t * side and guaranteed to be >= 0.\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"copy exceeds target buffer nominal length\"));\n\t\t\tgoto fail_args;\n\t\t}\n\t\tif (!DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_this, offset_bytes + dst_length)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"copy not covered by underlying target buffer, ignore\"));\n\t\t\treturn 0;\n\t\t}\n\n\t\tp_src_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufarg);\n\t\tp_dst_base = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + offset_bytes;\n\n\t\t/* Check actual underlying buffers for validity and that they\n\t\t * cover the copy.  No side effects are allowed after the check\n\t\t * so that the validity status doesn't change.\n\t\t */\n\t\tif (!DUK_HBUFOBJ_VALID_SLICE(h_this) ||\n\t\t    !DUK_HBUFOBJ_VALID_SLICE(h_bufarg)) {\n\t\t\t/* The condition could be more narrow and check for the\n\t\t\t * copy area only, but there's no need for fine grained\n\t\t\t * behavior when the underlying buffer is misconfigured.\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"source and/or target not covered by underlying buffer, skip copy\"));\n\t\t\treturn 0;\n\t\t}\n\n\t\t/* We want to do a straight memory copy if possible: this is\n\t\t * an important operation because .set() is the TypedArray\n\t\t * way to copy chunks of memory.  However, because set()\n\t\t * conceptually works in terms of elements, not all views are\n\t\t * compatible with direct byte copying.\n\t\t *\n\t\t * If we do manage a direct copy, the \"overlap issue\" handled\n\t\t * below can just be solved using memmove() because the source\n\t\t * and destination element sizes are necessarily equal.\n\t\t */\n\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\tDUK_ASSERT(h_this->elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t));\n\t\tcomp_mask = duk__buffer_elemtype_copy_compatible[h_this->elem_type];\n\t\tif (comp_mask & (1 << h_bufarg->elem_type)) {\n\t\t\tDUK_ASSERT(src_length == dst_length);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"fast path: able to use memmove() because views are compatible\"));\n\t\t\tDUK_MEMMOVE((void *) p_dst_base, (const void *) p_src_base, (size_t) dst_length);\n\t\t\treturn 0;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"fast path: views are not compatible with a byte copy, copy by item\"));\n#endif  /* !DUK_USE_PREFER_SIZE */\n\n\t\t/* We want to avoid making a copy to process set() but that's\n\t\t * not always possible: the source and the target may overlap\n\t\t * and because element sizes are different, the overlap cannot\n\t\t * always be handled with a memmove() or choosing the copy\n\t\t * direction in a certain way.  For example, if source type is\n\t\t * uint8 and target type is uint32, the target area may exceed\n\t\t * the source area from both ends!\n\t\t *\n\t\t * Note that because external buffers may point to the same\n\t\t * memory areas, we must ultimately make this check using\n\t\t * pointers.\n\t\t *\n\t\t * NOTE: careful with side effects: any side effect may cause\n\t\t * a buffer resize (or external buffer pointer/length update)!\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"overlap check: p_src_base=%p, src_length=%ld, \"\n\t\t                     \"p_dst_base=%p, dst_length=%ld\",\n\t\t                     (void *) p_src_base, (long) src_length,\n\t\t                     (void *) p_dst_base, (long) dst_length));\n\n\t\tif (p_src_base >= p_dst_base + dst_length ||  /* source starts after dest ends */\n\t\t    p_src_base + src_length <= p_dst_base) {   /* source ends before dest starts */\n\t\t\tno_overlap = 1;\n\t\t}\n\n\t\tif (!no_overlap) {\n\t\t\t/* There's overlap: the desired end result is that\n\t\t\t * conceptually a copy is made to avoid \"trampling\"\n\t\t\t * of source data by destination writes.  We make\n\t\t\t * an actual temporary copy to handle this case.\n\t\t\t */\n\t\t\tduk_uint8_t *p_src_copy;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"there is overlap, make a copy of the source\"));\n\t\t\tp_src_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_length);\n\t\t\tDUK_ASSERT(p_src_copy != NULL);\n\t\t\tDUK_MEMCPY((void *) p_src_copy, (const void *) p_src_base, (size_t) src_length);\n\n\t\t\tp_src_base = p_src_copy;  /* use p_src_base from now on */\n\t\t}\n\t\t/* Value stack intentionally mixed size here. */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"after overlap check: p_src_base=%p, src_length=%ld, \"\n\t\t                     \"p_dst_base=%p, dst_length=%ld, valstack top=%ld\",\n\t\t                     (void *) p_src_base, (long) src_length,\n\t\t                     (void *) p_dst_base, (long) dst_length,\n\t\t                     (long) duk_get_top(thr)));\n\n\t\t/* Ready to make the copy.  We must proceed element by element\n\t\t * and must avoid any side effects that might cause the buffer\n\t\t * validity check above to become invalid.\n\t\t *\n\t\t * Although we work through the value stack here, only plain\n\t\t * numbers are handled which should be side effect safe.\n\t\t */\n\n\t\tsrc_elem_size = (duk_small_uint_t) (1U << h_bufarg->shift);\n\t\tdst_elem_size = (duk_small_uint_t) (1U << h_this->shift);\n\t\tp_src = p_src_base;\n\t\tp_dst = p_dst_base;\n\t\tp_src_end = p_src_base + src_length;\n\n\t\twhile (p_src != p_src_end) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"fast path per element copy loop: \"\n\t\t\t                     \"p_src=%p, p_src_end=%p, p_dst=%p\",\n\t\t\t                     (void *) p_src, (void *) p_src_end, (void *) p_dst));\n\t\t\t/* A validated read() is always a number, so it's write coercion\n\t\t\t * is always side effect free an won't invalidate pointers etc.\n\t\t\t */\n\t\t\tduk_hbufobj_push_validated_read(thr, h_bufarg, p_src, src_elem_size);\n\t\t\tduk_hbufobj_validated_write(thr, h_this, p_dst, dst_elem_size);\n\t\t\tduk_pop(thr);\n\t\t\tp_src += src_elem_size;\n\t\t\tp_dst += dst_elem_size;\n\t\t}\n\n\t\treturn 0;\n\t} else {\n\t\t/* Slow path: quite slow, but we save space by using the property code\n\t\t * to write coerce target values.  We don't need to worry about overlap\n\t\t * here because the source is not a TypedArray.\n\t\t *\n\t\t * We could use the bufobj write coercion helper but since the\n\t\t * property read may have arbitrary side effects, full validity checks\n\t\t * would be needed for every element anyway.\n\t\t */\n\n\t\tn = (duk_uarridx_t) duk_get_length(thr, 0);\n\t\tDUK_ASSERT(offset_bytes <= h_this->length);\n\t\tif ((n << h_this->shift) > h_this->length - offset_bytes) {\n\t\t\t/* Overflow not an issue because subtraction is used on the right\n\t\t\t * side and guaranteed to be >= 0.\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"copy exceeds target buffer nominal length\"));\n\t\t\tgoto fail_args;\n\t\t}\n\n\t\t/* There's no need to check for buffer validity status for the\n\t\t * target here: the property access code will do that for each\n\t\t * element.  Moreover, if we did check the validity here, side\n\t\t * effects from reading the source argument might invalidate\n\t\t * the results anyway.\n\t\t */\n\n\t\tDUK_ASSERT_TOP(thr, 2);\n\t\tduk_push_this(thr);\n\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tduk_get_prop_index(thr, 0, i);\n\t\t\tduk_put_prop_index(thr, 2, offset_elems + i);\n\t\t}\n\t}\n\n\treturn 0;\n\n fail_args:\n\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.prototype.slice([start], [end])\n *  ArrayBuffer.prototype.slice(begin, [end])\n *  TypedArray.prototype.subarray(begin, [end])\n *\n *  The API calls are almost identical; negative indices are counted from end\n *  of buffer, and final indices are clamped (allowing crossed indices).  Main\n *  differences:\n *\n *    - Copy/view behavior; Node.js .slice() and TypedArray .subarray() create\n *      views, ArrayBuffer .slice() creates a copy\n *\n *    - Resulting object has a different class and prototype depending on the\n *      call (or 'this' argument)\n *\n *    - TypedArray .subarray() arguments are element indices, not byte offsets\n *\n *    - Plain buffer argument creates a plain buffer slice\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_LOCAL void duk__arraybuffer_plain_slice(duk_hthread *thr, duk_hbuffer *h_val) {\n\tduk_int_t start_offset, end_offset;\n\tduk_uint_t slice_length;\n\tduk_uint8_t *p_copy;\n\tduk_size_t copy_length;\n\n\tduk__clamp_startend_negidx_shifted(thr,\n\t                                   (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val),\n\t                                   0 /*buffer_shift*/,\n\t                                   0 /*idx_start*/,\n\t                                   1 /*idx_end*/,\n\t                                   &start_offset,\n\t                                   &end_offset);\n\tDUK_ASSERT(end_offset <= (duk_int_t) DUK_HBUFFER_GET_SIZE(h_val));\n\tDUK_ASSERT(start_offset >= 0);\n\tDUK_ASSERT(end_offset >= start_offset);\n\tslice_length = (duk_uint_t) (end_offset - start_offset);\n\n\tp_copy = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, (duk_size_t) slice_length);\n\tDUK_ASSERT(p_copy != NULL);\n\tcopy_length = slice_length;\n\n\tDUK_MEMCPY((void *) p_copy,\n\t           (const void *) ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_val) + start_offset),\n\t           copy_length);\n}\n#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n/* Shared helper for slice/subarray operation.\n * Magic: 0x01=isView, 0x02=copy, 0x04=Node.js Buffer special handling.\n */\nDUK_INTERNAL duk_ret_t duk_bi_buffer_slice_shared(duk_hthread *thr) {\n\tduk_small_int_t magic;\n\tduk_small_uint_t res_class_num;\n\tduk_small_int_t res_proto_bidx;\n\tduk_hbufobj *h_this;\n\tduk_hbufobj *h_bufobj;\n\tduk_hbuffer *h_val;\n\tduk_int_t start_offset, end_offset;\n\tduk_uint_t slice_length;\n\tduk_tval *tv;\n\n\t/* [ start end ] */\n\n\tmagic = duk_get_current_magic(thr);\n\n\ttv = duk_get_borrowed_this_tval(thr);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_BUFFER(tv)) {\n\t\t/* For plain buffers return a plain buffer slice. */\n\t\th_val = DUK_TVAL_GET_BUFFER(tv);\n\t\tDUK_ASSERT(h_val != NULL);\n\n\t\tif (magic & 0x02) {\n\t\t\t/* Make copy: ArrayBuffer.prototype.slice() uses this. */\n\t\t\tduk__arraybuffer_plain_slice(thr, h_val);\n\t\t\treturn 1;\n\t\t} else {\n\t\t\t/* View into existing buffer: cannot be done if the\n\t\t\t * result is a plain buffer because there's no slice\n\t\t\t * info.  So return an ArrayBuffer instance; coerce\n\t\t\t * the 'this' binding into an object and behave as if\n\t\t\t * the original call was for an Object-coerced plain\n\t\t\t * buffer (handled automatically by duk__require_bufobj_this()).\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"slice() doesn't handle view into plain buffer, coerce 'this' to ArrayBuffer object\"));\n\t\t\t/* fall through */\n\t\t}\n\t}\n\ttv = NULL;  /* No longer valid nor needed. */\n\n\th_this = duk__require_bufobj_this(thr);\n\n\t/* Slice offsets are element (not byte) offsets, which only matters\n\t * for TypedArray views, Node.js Buffer and ArrayBuffer have shift\n\t * zero so byte and element offsets are the same.  Negative indices\n\t * are counted from end of slice, crossed indices are allowed (and\n\t * result in zero length result), and final values are clamped\n\t * against the current slice.  There's intentionally no check\n\t * against the underlying buffer here.\n\t */\n\n\tduk__clamp_startend_negidx_shifted(thr,\n\t                                   (duk_int_t) h_this->length,\n\t                                   (duk_uint8_t) h_this->shift,\n\t                                   0 /*idx_start*/,\n\t                                   1 /*idx_end*/,\n\t                                   &start_offset,\n\t                                   &end_offset);\n\tDUK_ASSERT(end_offset >= start_offset);\n\tDUK_ASSERT(start_offset >= 0);\n\tDUK_ASSERT(end_offset >= 0);\n\tslice_length = (duk_uint_t) (end_offset - start_offset);\n\n\t/* The resulting buffer object gets the same class and prototype as\n\t * the buffer in 'this', e.g. if the input is a Uint8Array the\n\t * result is a Uint8Array; if the input is a Float32Array, the\n\t * result is a Float32Array.  The result internal prototype should\n\t * be the default prototype for the class (e.g. initial value of\n\t * Uint8Array.prototype), not copied from the argument (Duktape 1.x\n\t * did that).\n\t *\n\t * Node.js Buffers have special handling: they're Uint8Arrays as far\n\t * as the internal class is concerned, so the new Buffer should also\n\t * be an Uint8Array but inherit from Buffer.prototype.\n\t */\n\tres_class_num = DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_this);\n\tDUK_ASSERT(res_class_num >= DUK_HOBJECT_CLASS_BUFOBJ_MIN);  /* type check guarantees */\n\tDUK_ASSERT(res_class_num <= DUK_HOBJECT_CLASS_BUFOBJ_MAX);\n\tres_proto_bidx = duk__buffer_proto_from_classnum[res_class_num - DUK_HOBJECT_CLASS_BUFOBJ_MIN];\n\tif (magic & 0x04) {\n\t\tres_proto_bidx = DUK_BIDX_NODEJS_BUFFER_PROTOTYPE;\n\t}\n\th_bufobj = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(res_class_num),\n\t                               res_proto_bidx);\n\tDUK_ASSERT(h_bufobj != NULL);\n\n\tDUK_ASSERT(h_bufobj->length == 0);\n\th_bufobj->shift = h_this->shift;  /* inherit */\n\th_bufobj->elem_type = h_this->elem_type;  /* inherit */\n\th_bufobj->is_typedarray = magic & 0x01;\n\tDUK_ASSERT(h_bufobj->is_typedarray == 0 || h_bufobj->is_typedarray == 1);\n\n\th_val = h_this->buf;\n\tif (h_val == NULL) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\tif (magic & 0x02) {\n\t\t/* non-zero: make copy */\n\t\tduk_uint8_t *p_copy;\n\t\tduk_size_t copy_length;\n\n\t\tp_copy = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, (duk_size_t) slice_length);  /* must be zeroed, not all bytes always copied */\n\t\tDUK_ASSERT(p_copy != NULL);\n\n\t\t/* Copy slice, respecting underlying buffer limits; remainder\n\t\t * is left as zero.\n\t\t */\n\t\tcopy_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, slice_length);\n\t\tDUK_MEMCPY((void *) p_copy,\n\t\t           (const void *) (DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this) + start_offset),\n\t\t           copy_length);\n\n\t\th_val = duk_known_hbuffer(thr, -1);\n\n\t\th_bufobj->buf = h_val;\n\t\tDUK_HBUFFER_INCREF(thr, h_val);\n\t\th_bufobj->length = slice_length;\n\t\tDUK_ASSERT(h_bufobj->offset == 0);\n\n\t\tduk_pop(thr);  /* reachable so pop OK */\n\t} else {\n\t\th_bufobj->buf = h_val;\n\t\tDUK_HBUFFER_INCREF(thr, h_val);\n\t\th_bufobj->length = slice_length;\n\t\th_bufobj->offset = h_this->offset + (duk_uint_t) start_offset;\n\n\t\t/* Copy the .buffer property, needed for TypedArray.prototype.subarray().\n\t\t *\n\t\t * XXX: limit copy only for TypedArray classes specifically?\n\t\t */\n\n\t\tDUK_ASSERT(h_bufobj->buf_prop == NULL);\n\t\th_bufobj->buf_prop = h_this->buf_prop;  /* may be NULL */\n\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, (duk_hobject *) h_bufobj->buf_prop);\n\t}\n\t/* unbalanced stack on purpose */\n\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.isEncoding()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_hthread *thr) {\n\tconst char *encoding;\n\n\t/* only accept lowercase 'utf8' now. */\n\n\tencoding = duk_to_string(thr, 0);\n\tDUK_ASSERT(duk_is_string(thr, 0));  /* guaranteed by duk_to_string() */\n\tduk_push_boolean(thr, DUK_STRCMP(encoding, \"utf8\") == 0);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.isBuffer()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_hthread *thr) {\n\tduk_hobject *h;\n\tduk_hobject *h_proto;\n\tduk_bool_t ret = 0;\n\n\tDUK_ASSERT(duk_get_top(thr) >= 1);  /* nargs */\n\th = duk_get_hobject(thr, 0);\n\tif (h != NULL) {\n\t\th_proto = thr->builtins[DUK_BIDX_NODEJS_BUFFER_PROTOTYPE];\n\t\tDUK_ASSERT(h_proto != NULL);\n\n\t\th = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);\n\t\tif (h != NULL) {\n\t\t\tret = duk_hobject_prototype_chain_contains(thr, h, h_proto, 0 /*ignore_loop*/);\n\t\t}\n\t}\n\n\tduk_push_boolean(thr, ret);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.byteLength()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_hthread *thr) {\n\tconst char *str;\n\tduk_size_t len;\n\n\t/* At the moment Buffer(<str>) will just use the string bytes as\n\t * is (ignoring encoding), so we return the string length here\n\t * unconditionally.\n\t */\n\n\t/* XXX: to be revised; Old Node.js behavior just coerces any buffer\n\t * values to string:\n\t * $ node\n\t * > Buffer.byteLength(new Uint32Array(10))\n\t * 20\n\t * > Buffer.byteLength(new Uint32Array(100))\n\t * 20\n\t * (The 20 comes from '[object Uint32Array]'.length\n\t */\n\n\tstr = duk_to_lstring(thr, 0, &len);\n\tDUK_UNREF(str);\n\tduk_push_size_t(thr, len);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Node.js Buffer.concat()\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_concat(duk_hthread *thr) {\n\tduk_hobject *h_arg;\n\tduk_uint_t total_length;\n\tduk_hbufobj *h_bufobj;\n\tduk_hbufobj *h_bufres;\n\tduk_hbuffer *h_val;\n\tduk_uint_t i, n;\n\tduk_uint8_t *p;\n\tduk_size_t space_left;\n\tduk_size_t copy_size;\n\n\t/* Node.js accepts only actual Arrays. */\n\th_arg = duk_require_hobject(thr, 0);\n\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h_arg) != DUK_HOBJECT_CLASS_ARRAY) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\t/* Compute result length and validate argument buffers. */\n\tn = (duk_uint_t) duk_get_length(thr, 0);\n\ttotal_length = 0;\n\tfor (i = 0; i < n; i++) {\n\t\t/* Neutered checks not necessary here: neutered buffers have\n\t\t * zero 'length' so we'll effectively skip them.\n\t\t */\n\t\tDUK_ASSERT_TOP(thr, 2);  /* [ array totalLength ] */\n\t\tduk_get_prop_index(thr, 0, (duk_uarridx_t) i);  /* -> [ array totalLength buf ] */\n\t\th_bufobj = duk__require_bufobj_value(thr, 2);\n\t\tDUK_ASSERT(h_bufobj != NULL);\n\t\ttotal_length += h_bufobj->length;\n\t\tif (DUK_UNLIKELY(total_length < h_bufobj->length)) {\n\t\t\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);  /* Wrapped. */\n\t\t}\n\t\tduk_pop(thr);\n\t}\n\t/* In Node.js v0.12.1 a 1-element array is special and won't create a\n\t * copy, this was fixed later so an explicit check no longer needed.\n\t */\n\n\t/* User totalLength overrides a computed length, but we'll check\n\t * every copy in the copy loop.  Note that duk_to_int() can\n\t * technically have arbitrary side effects so we need to recheck\n\t * the buffers in the copy loop.\n\t */\n\tif (!duk_is_undefined(thr, 1) && n > 0) {\n\t\t/* For n == 0, Node.js ignores totalLength argument and\n\t\t * returns a zero length buffer.\n\t\t */\n\t\tduk_int_t total_length_signed;\n\t\ttotal_length_signed = duk_to_int(thr, 1);\n\t\tif (total_length_signed < 0) {\n\t\t\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n\t\t}\n\t\ttotal_length = (duk_uint_t) total_length_signed;\n\t}\n\n\th_bufres = duk_push_bufobj_raw(thr,\n\t                               DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                               DUK_HOBJECT_FLAG_BUFOBJ |\n\t                               DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_UINT8ARRAY),\n\t                               DUK_BIDX_NODEJS_BUFFER_PROTOTYPE);\n\tDUK_ASSERT(h_bufres != NULL);\n\n\tp = (duk_uint8_t *) duk_push_fixed_buffer_zero(thr, total_length);  /* must be zeroed, all bytes not necessarily written over */\n\tDUK_ASSERT(p != NULL);\n\tspace_left = (duk_size_t) total_length;\n\n\tfor (i = 0; i < n; i++) {\n\t\tDUK_ASSERT_TOP(thr, 4);  /* [ array totalLength bufres buf ] */\n\n\t\tduk_get_prop_index(thr, 0, (duk_uarridx_t) i);\n\t\th_bufobj = duk__require_bufobj_value(thr, 4);\n\t\tDUK_ASSERT(h_bufobj != NULL);\n\n\t\tcopy_size = h_bufobj->length;\n\t\tif (copy_size > space_left) {\n\t\t\tcopy_size = space_left;\n\t\t}\n\n\t\tif (h_bufobj->buf != NULL &&\n\t\t    DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) {\n\t\t\tDUK_MEMCPY((void *) p,\n\t\t\t           (const void *) DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_bufobj),\n\t\t\t           copy_size);\n\t\t} else {\n\t\t\t/* Just skip, leaving zeroes in the result. */\n\t\t\t;\n\t\t}\n\t\tp += copy_size;\n\t\tspace_left -= copy_size;\n\n\t\tduk_pop(thr);\n\t}\n\n\th_val = duk_known_hbuffer(thr, -1);\n\n\tduk__set_bufobj_buffer(thr, h_bufres, h_val);\n\th_bufres->is_typedarray = 1;\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufres);\n\n\tduk_pop(thr);  /* pop plain buffer, now reachable through h_bufres */\n\n\treturn 1;  /* return h_bufres */\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Shared readfield and writefield methods\n *\n *  The readfield/writefield methods need support for endianness and field\n *  types.  All offsets are byte based so no offset shifting is needed.\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n/* Format of magic, bits:\n *   0...1: field type; 0=uint8, 1=uint16, 2=uint32, 3=float, 4=double, 5=unused, 6=unused, 7=unused\n *       3: endianness: 0=little, 1=big\n *       4: signed: 1=yes, 0=no\n *       5: typedarray: 1=yes, 0=no\n */\n#define  DUK__FLD_8BIT         0\n#define  DUK__FLD_16BIT        1\n#define  DUK__FLD_32BIT        2\n#define  DUK__FLD_FLOAT        3\n#define  DUK__FLD_DOUBLE       4\n#define  DUK__FLD_VARINT       5\n#define  DUK__FLD_BIGENDIAN    (1 << 3)\n#define  DUK__FLD_SIGNED       (1 << 4)\n#define  DUK__FLD_TYPEDARRAY   (1 << 5)\n\n/* XXX: split into separate functions for each field type? */\nDUK_INTERNAL duk_ret_t duk_bi_buffer_readfield(duk_hthread *thr) {\n\tduk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr);\n\tduk_small_int_t magic_ftype;\n\tduk_small_int_t magic_bigendian;\n\tduk_small_int_t magic_signed;\n\tduk_small_int_t magic_typedarray;\n\tduk_small_int_t endswap;\n\tduk_hbufobj *h_this;\n\tduk_bool_t no_assert;\n\tduk_int_t offset_signed;\n\tduk_uint_t offset;\n\tduk_uint_t buffer_length;\n\tduk_uint_t check_length;\n\tduk_uint8_t *buf;\n\tduk_double_union du;\n\n\tmagic_ftype = magic & 0x0007;\n\tmagic_bigendian = magic & 0x0008;\n\tmagic_signed = magic & 0x0010;\n\tmagic_typedarray = magic & 0x0020;\n\n\th_this = duk__require_bufobj_this(thr);  /* XXX: very inefficient for plain buffers */\n\tDUK_ASSERT(h_this != NULL);\n\tbuffer_length = h_this->length;\n\n\t/* [ offset noAssert                 ], when ftype != DUK__FLD_VARINT */\n\t/* [ offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */\n\t/* [ offset littleEndian             ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */\n\n\t/* Handle TypedArray vs. Node.js Buffer arg differences */\n\tif (magic_typedarray) {\n\t\tno_assert = 0;\n#if defined(DUK_USE_INTEGER_LE)\n\t\tendswap = !duk_to_boolean(thr, 1);  /* 1=little endian */\n#else\n\t\tendswap = duk_to_boolean(thr, 1);  /* 1=little endian */\n#endif\n\t} else {\n\t\tno_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 2 : 1);\n#if defined(DUK_USE_INTEGER_LE)\n\t\tendswap = magic_bigendian;\n#else\n\t\tendswap = !magic_bigendian;\n#endif\n\t}\n\n\t/* Offset is coerced first to signed integer range and then to unsigned.\n\t * This ensures we can add a small byte length (1-8) to the offset in\n\t * bound checks and not wrap.\n\t */\n\toffset_signed = duk_to_int(thr, 0);\n\toffset = (duk_uint_t) offset_signed;\n\tif (offset_signed < 0) {\n\t\tgoto fail_bounds;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"readfield, buffer_length=%ld, offset=%ld, no_assert=%d, \"\n\t                     \"magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, \"\n\t                     \"endswap=%d\",\n\t                     (long) buffer_length, (long) offset, (int) no_assert,\n\t                     (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3),\n\t                     (int) (magic_signed >> 4), (int) endswap));\n\n\t/* Update 'buffer_length' to be the effective, safe limit which\n\t * takes into account the underlying buffer.  This value will be\n\t * potentially invalidated by any side effect.\n\t */\n\tcheck_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length);\n\tDUK_DDD(DUK_DDDPRINT(\"buffer_length=%ld, check_length=%ld\",\n\t                     (long) buffer_length, (long) check_length));\n\n\tif (h_this->buf) {\n\t\tbuf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this);\n\t} else {\n\t\t/* Neutered.  We could go into the switch-case safely with\n\t\t * buf == NULL because check_length == 0.  To avoid scanbuild\n\t\t * warnings, fail directly instead.\n\t\t */\n\t\tDUK_ASSERT(check_length == 0);\n\t\tgoto fail_neutered;\n\t}\n\tDUK_ASSERT(buf != NULL);\n\n\tswitch (magic_ftype) {\n\tcase DUK__FLD_8BIT: {\n\t\tduk_uint8_t tmp;\n\t\tif (offset + 1U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\ttmp = buf[offset];\n\t\tif (magic_signed) {\n\t\t\tduk_push_int(thr, (duk_int_t) ((duk_int8_t) tmp));\n\t\t} else {\n\t\t\tduk_push_uint(thr, (duk_uint_t) tmp);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK__FLD_16BIT: {\n\t\tduk_uint16_t tmp;\n\t\tif (offset + 2U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\tDUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 2);\n\t\ttmp = du.us[0];\n\t\tif (endswap) {\n\t\t\ttmp = DUK_BSWAP16(tmp);\n\t\t}\n\t\tif (magic_signed) {\n\t\t\tduk_push_int(thr, (duk_int_t) ((duk_int16_t) tmp));\n\t\t} else {\n\t\t\tduk_push_uint(thr, (duk_uint_t) tmp);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK__FLD_32BIT: {\n\t\tduk_uint32_t tmp;\n\t\tif (offset + 4U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\tDUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4);\n\t\ttmp = du.ui[0];\n\t\tif (endswap) {\n\t\t\ttmp = DUK_BSWAP32(tmp);\n\t\t}\n\t\tif (magic_signed) {\n\t\t\tduk_push_int(thr, (duk_int_t) ((duk_int32_t) tmp));\n\t\t} else {\n\t\t\tduk_push_uint(thr, (duk_uint_t) tmp);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK__FLD_FLOAT: {\n\t\tduk_uint32_t tmp;\n\t\tif (offset + 4U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\tDUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4);\n\t\tif (endswap) {\n\t\t\ttmp = du.ui[0];\n\t\t\ttmp = DUK_BSWAP32(tmp);\n\t\t\tdu.ui[0] = tmp;\n\t\t}\n\t\tduk_push_number(thr, (duk_double_t) du.f[0]);\n\t\tbreak;\n\t}\n\tcase DUK__FLD_DOUBLE: {\n\t\tif (offset + 8U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\tDUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 8);\n\t\tif (endswap) {\n\t\t\tDUK_DBLUNION_BSWAP64(&du);\n\t\t}\n\t\tduk_push_number(thr, (duk_double_t) du.d);\n\t\tbreak;\n\t}\n\tcase DUK__FLD_VARINT: {\n\t\t/* Node.js Buffer variable width integer field.  We don't really\n\t\t * care about speed here, so aim for shortest algorithm.\n\t\t */\n\t\tduk_int_t field_bytelen;\n\t\tduk_int_t i, i_step, i_end;\n#if defined(DUK_USE_64BIT_OPS)\n\t\tduk_int64_t tmp;\n\t\tduk_small_uint_t shift_tmp;\n#else\n\t\tduk_double_t tmp;\n\t\tduk_small_int_t highbyte;\n#endif\n\t\tconst duk_uint8_t *p;\n\n\t\tfield_bytelen = duk_get_int(thr, 1);  /* avoid side effects! */\n\t\tif (field_bytelen < 1 || field_bytelen > 6) {\n\t\t\tgoto fail_field_length;\n\t\t}\n\t\tif (offset + (duk_uint_t) field_bytelen > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\tp = (const duk_uint8_t *) (buf + offset);\n\n\t\t/* Slow gathering of value using either 64-bit arithmetic\n\t\t * or IEEE doubles if 64-bit types not available.  Handling\n\t\t * of negative numbers is a bit non-obvious in both cases.\n\t\t */\n\n\t\tif (magic_bigendian) {\n\t\t\t/* Gather in big endian */\n\t\t\ti = 0;\n\t\t\ti_step = 1;\n\t\t\ti_end = field_bytelen;  /* one i_step over */\n\t\t} else {\n\t\t\t/* Gather in little endian */\n\t\t\ti = field_bytelen - 1;\n\t\t\ti_step = -1;\n\t\t\ti_end = -1;  /* one i_step over */\n\t\t}\n\n#if defined(DUK_USE_64BIT_OPS)\n\t\ttmp = 0;\n\t\tdo {\n\t\t\tDUK_ASSERT(i >= 0 && i < field_bytelen);\n\t\t\ttmp = (tmp << 8) + (duk_int64_t) p[i];\n\t\t\ti += i_step;\n\t\t} while (i != i_end);\n\n\t\tif (magic_signed) {\n\t\t\t/* Shift to sign extend. */\n\t\t\tshift_tmp = (duk_small_uint_t) (64U - (duk_small_uint_t) field_bytelen * 8U);\n\t\t\ttmp = (tmp << shift_tmp) >> shift_tmp;\n\t\t}\n\n\t\tduk_push_i64(thr, tmp);\n#else\n\t\thighbyte = p[i];\n\t\tif (magic_signed && (highbyte & 0x80) != 0) {\n\t\t\t/* 0xff => 255 - 256 = -1; 0x80 => 128 - 256 = -128 */\n\t\t\ttmp = (duk_double_t) (highbyte - 256);\n\t\t} else {\n\t\t\ttmp = (duk_double_t) highbyte;\n\t\t}\n\t\tfor (;;) {\n\t\t\ti += i_step;\n\t\t\tif (i == i_end) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDUK_ASSERT(i >= 0 && i < field_bytelen);\n\t\t\ttmp = (tmp * 256.0) + (duk_double_t) p[i];\n\t\t}\n\n\t\tduk_push_number(thr, tmp);\n#endif\n\t\tbreak;\n\t}\n\tdefault: {  /* should never happen but default here */\n\t\tgoto fail_bounds;\n\t}\n\t}\n\n\treturn 1;\n\n fail_neutered:\n fail_field_length:\n fail_bounds:\n\tif (no_assert) {\n\t\t/* Node.js return value for noAssert out-of-bounds reads is\n\t\t * usually (but not always) NaN.  Return NaN consistently.\n\t\t */\n\t\tduk_push_nan(thr);\n\t\treturn 1;\n\t}\n\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n/* XXX: split into separate functions for each field type? */\nDUK_INTERNAL duk_ret_t duk_bi_buffer_writefield(duk_hthread *thr) {\n\tduk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(thr);\n\tduk_small_int_t magic_ftype;\n\tduk_small_int_t magic_bigendian;\n\tduk_small_int_t magic_signed;\n\tduk_small_int_t magic_typedarray;\n\tduk_small_int_t endswap;\n\tduk_hbufobj *h_this;\n\tduk_bool_t no_assert;\n\tduk_int_t offset_signed;\n\tduk_uint_t offset;\n\tduk_uint_t buffer_length;\n\tduk_uint_t check_length;\n\tduk_uint8_t *buf;\n\tduk_double_union du;\n\tduk_int_t nbytes = 0;\n\n\tmagic_ftype = magic & 0x0007;\n\tmagic_bigendian = magic & 0x0008;\n\tmagic_signed = magic & 0x0010;\n\tmagic_typedarray = magic & 0x0020;\n\tDUK_UNREF(magic_signed);\n\n\th_this = duk__require_bufobj_this(thr);  /* XXX: very inefficient for plain buffers */\n\tDUK_ASSERT(h_this != NULL);\n\tbuffer_length = h_this->length;\n\n\t/* [ value  offset noAssert                 ], when ftype != DUK__FLD_VARINT */\n\t/* [ value  offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */\n\t/* [ offset value  littleEndian             ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */\n\n\t/* Handle TypedArray vs. Node.js Buffer arg differences */\n\tif (magic_typedarray) {\n\t\tno_assert = 0;\n#if defined(DUK_USE_INTEGER_LE)\n\t\tendswap = !duk_to_boolean(thr, 2);  /* 1=little endian */\n#else\n\t\tendswap = duk_to_boolean(thr, 2);  /* 1=little endian */\n#endif\n\t\tduk_swap(thr, 0, 1);  /* offset/value order different from Node.js */\n\t} else {\n\t\tno_assert = duk_to_boolean(thr, (magic_ftype == DUK__FLD_VARINT) ? 3 : 2);\n#if defined(DUK_USE_INTEGER_LE)\n\t\tendswap = magic_bigendian;\n#else\n\t\tendswap = !magic_bigendian;\n#endif\n\t}\n\n\t/* Offset is coerced first to signed integer range and then to unsigned.\n\t * This ensures we can add a small byte length (1-8) to the offset in\n\t * bound checks and not wrap.\n\t */\n\toffset_signed = duk_to_int(thr, 1);\n\toffset = (duk_uint_t) offset_signed;\n\n\t/* We need 'nbytes' even for a failed offset; return value must be\n\t * (offset + nbytes) even when write fails due to invalid offset.\n\t */\n\tif (magic_ftype != DUK__FLD_VARINT) {\n\t\tDUK_ASSERT(magic_ftype >= 0 && magic_ftype < (duk_small_int_t) (sizeof(duk__buffer_nbytes_from_fldtype) / sizeof(duk_uint8_t)));\n\t\tnbytes = duk__buffer_nbytes_from_fldtype[magic_ftype];\n\t} else {\n\t\tnbytes = duk_get_int(thr, 2);\n\t\tif (nbytes < 1 || nbytes > 6) {\n\t\t\tgoto fail_field_length;\n\t\t}\n\t}\n\tDUK_ASSERT(nbytes >= 1 && nbytes <= 8);\n\n\t/* Now we can check offset validity. */\n\tif (offset_signed < 0) {\n\t\tgoto fail_bounds;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"writefield, value=%!T, buffer_length=%ld, offset=%ld, no_assert=%d, \"\n\t                     \"magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, \"\n\t                     \"endswap=%d\",\n\t                     duk_get_tval(thr, 0), (long) buffer_length, (long) offset, (int) no_assert,\n\t                     (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3),\n\t                     (int) (magic_signed >> 4), (int) endswap));\n\n\t/* Coerce value to a number before computing check_length, so that\n\t * the field type specific coercion below can't have side effects\n\t * that would invalidate check_length.\n\t */\n\tduk_to_number(thr, 0);\n\n\t/* Update 'buffer_length' to be the effective, safe limit which\n\t * takes into account the underlying buffer.  This value will be\n\t * potentially invalidated by any side effect.\n\t */\n\tcheck_length = DUK_HBUFOBJ_CLAMP_BYTELENGTH(h_this, buffer_length);\n\tDUK_DDD(DUK_DDDPRINT(\"buffer_length=%ld, check_length=%ld\",\n\t                     (long) buffer_length, (long) check_length));\n\n\tif (h_this->buf) {\n\t\tbuf = DUK_HBUFOBJ_GET_SLICE_BASE(thr->heap, h_this);\n\t} else {\n\t\t/* Neutered.  We could go into the switch-case safely with\n\t\t * buf == NULL because check_length == 0.  To avoid scanbuild\n\t\t * warnings, fail directly instead.\n\t\t */\n\t\tDUK_ASSERT(check_length == 0);\n\t\tgoto fail_neutered;\n\t}\n\tDUK_ASSERT(buf != NULL);\n\n\tswitch (magic_ftype) {\n\tcase DUK__FLD_8BIT: {\n\t\tif (offset + 1U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\t/* sign doesn't matter when writing */\n\t\tbuf[offset] = (duk_uint8_t) duk_to_uint32(thr, 0);\n\t\tbreak;\n\t}\n\tcase DUK__FLD_16BIT: {\n\t\tduk_uint16_t tmp;\n\t\tif (offset + 2U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\ttmp = (duk_uint16_t) duk_to_uint32(thr, 0);\n\t\tif (endswap) {\n\t\t\ttmp = DUK_BSWAP16(tmp);\n\t\t}\n\t\tdu.us[0] = tmp;\n\t\t/* sign doesn't matter when writing */\n\t\tDUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 2);\n\t\tbreak;\n\t}\n\tcase DUK__FLD_32BIT: {\n\t\tduk_uint32_t tmp;\n\t\tif (offset + 4U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\ttmp = (duk_uint32_t) duk_to_uint32(thr, 0);\n\t\tif (endswap) {\n\t\t\ttmp = DUK_BSWAP32(tmp);\n\t\t}\n\t\tdu.ui[0] = tmp;\n\t\t/* sign doesn't matter when writing */\n\t\tDUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4);\n\t\tbreak;\n\t}\n\tcase DUK__FLD_FLOAT: {\n\t\tduk_uint32_t tmp;\n\t\tif (offset + 4U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\tdu.f[0] = (duk_float_t) duk_to_number(thr, 0);\n\t\tif (endswap) {\n\t\t\ttmp = du.ui[0];\n\t\t\ttmp = DUK_BSWAP32(tmp);\n\t\t\tdu.ui[0] = tmp;\n\t\t}\n\t\t/* sign doesn't matter when writing */\n\t\tDUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4);\n\t\tbreak;\n\t}\n\tcase DUK__FLD_DOUBLE: {\n\t\tif (offset + 8U > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\t\tdu.d = (duk_double_t) duk_to_number(thr, 0);\n\t\tif (endswap) {\n\t\t\tDUK_DBLUNION_BSWAP64(&du);\n\t\t}\n\t\t/* sign doesn't matter when writing */\n\t\tDUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 8);\n\t\tbreak;\n\t}\n\tcase DUK__FLD_VARINT: {\n\t\t/* Node.js Buffer variable width integer field.  We don't really\n\t\t * care about speed here, so aim for shortest algorithm.\n\t\t */\n\t\tduk_int_t field_bytelen;\n\t\tduk_int_t i, i_step, i_end;\n#if defined(DUK_USE_64BIT_OPS)\n\t\tduk_int64_t tmp;\n#else\n\t\tduk_double_t tmp;\n#endif\n\t\tduk_uint8_t *p;\n\n\t\tfield_bytelen = (duk_int_t) nbytes;\n\t\tif (offset + (duk_uint_t) field_bytelen > check_length) {\n\t\t\tgoto fail_bounds;\n\t\t}\n\n\t\t/* Slow writing of value using either 64-bit arithmetic\n\t\t * or IEEE doubles if 64-bit types not available.  There's\n\t\t * no special sign handling when writing varints.\n\t\t */\n\n\t\tif (magic_bigendian) {\n\t\t\t/* Write in big endian */\n\t\t\ti = field_bytelen;  /* one i_step added at top of loop */\n\t\t\ti_step = -1;\n\t\t\ti_end = 0;\n\t\t} else {\n\t\t\t/* Write in little endian */\n\t\t\ti = -1;  /* one i_step added at top of loop */\n\t\t\ti_step = 1;\n\t\t\ti_end = field_bytelen - 1;\n\t\t}\n\n\t\t/* XXX: The duk_to_number() cast followed by integer coercion\n\t\t * is platform specific so NaN, +/- Infinity, and out-of-bounds\n\t\t * values result in platform specific output now.\n\t\t * See: test-bi-nodejs-buffer-proto-varint-special.js\n\t\t */\n\n#if defined(DUK_USE_64BIT_OPS)\n\t\ttmp = (duk_int64_t) duk_to_number(thr, 0);\n\t\tp = (duk_uint8_t *) (buf + offset);\n\t\tdo {\n\t\t\ti += i_step;\n\t\t\tDUK_ASSERT(i >= 0 && i < field_bytelen);\n\t\t\tp[i] = (duk_uint8_t) (tmp & 0xff);\n\t\t\ttmp = tmp >> 8;  /* unnecessary shift for last byte */\n\t\t} while (i != i_end);\n#else\n\t\ttmp = duk_to_number(thr, 0);\n\t\tp = (duk_uint8_t *) (buf + offset);\n\t\tdo {\n\t\t\ti += i_step;\n\t\t\ttmp = DUK_FLOOR(tmp);\n\t\t\tDUK_ASSERT(i >= 0 && i < field_bytelen);\n\t\t\tp[i] = (duk_uint8_t) (DUK_FMOD(tmp, 256.0));\n\t\t\ttmp = tmp / 256.0;  /* unnecessary div for last byte */\n\t\t} while (i != i_end);\n#endif\n\t\tbreak;\n\t}\n\tdefault: {  /* should never happen but default here */\n\t\tgoto fail_bounds;\n\t}\n\t}\n\n\t/* Node.js Buffer: return offset + #bytes written (i.e. next\n\t * write offset).\n\t */\n\tif (magic_typedarray) {\n\t\t/* For TypedArrays 'undefined' return value is specified\n\t\t * by ES2015 (matches V8).\n\t\t */\n\t\treturn 0;\n\t}\n\tduk_push_uint(thr, offset + (duk_uint_t) nbytes);\n\treturn 1;\n\n fail_neutered:\n fail_field_length:\n fail_bounds:\n\tif (no_assert) {\n\t\t/* Node.js return value for failed writes is offset + #bytes\n\t\t * that would have been written.\n\t\t */\n\t\t/* XXX: for negative input offsets, 'offset' will be a large\n\t\t * positive value so the result here is confusing.\n\t\t */\n\t\tif (magic_typedarray) {\n\t\t\treturn 0;\n\t\t}\n\t\tduk_push_uint(thr, offset + (duk_uint_t) nbytes);\n\t\treturn 1;\n\t}\n\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  Accessors for .buffer, .byteLength, .byteOffset\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_LOCAL duk_hbufobj *duk__autospawn_arraybuffer(duk_hthread *thr, duk_hbuffer *h_buf) {\n\tduk_hbufobj *h_res;\n\n\th_res = duk_push_bufobj_raw(thr,\n\t                            DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                            DUK_HOBJECT_FLAG_BUFOBJ |\n\t                            DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER),\n\t                            DUK_BIDX_ARRAYBUFFER_PROTOTYPE);\n\tDUK_ASSERT(h_res != NULL);\n\tDUK_UNREF(h_res);\n\n\tduk__set_bufobj_buffer(thr, h_res, h_buf);\n\tDUK_ASSERT_HBUFOBJ_VALID(h_res);\n\tDUK_ASSERT(h_res->buf_prop == NULL);\n\treturn h_res;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) {\n\tduk_hbufobj *h_bufobj;\n\n\th_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/);\n\tDUK_ASSERT(h_bufobj != NULL);\n\tif (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) {\n\t\tDUK_DD(DUK_DDPRINT(\"autospawn ArrayBuffer for plain buffer\"));\n\t\t(void) duk__autospawn_arraybuffer(thr, (duk_hbuffer *) h_bufobj);\n\t\treturn 1;\n\t} else {\n\t\tif (h_bufobj->buf_prop == NULL &&\n\t\t    DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_bufobj) != DUK_HOBJECT_CLASS_ARRAYBUFFER &&\n\t\t    h_bufobj->buf != NULL) {\n\t\t\tduk_hbufobj *h_arrbuf;\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"autospawn ArrayBuffer for typed array or DataView\"));\n\t\t\th_arrbuf = duk__autospawn_arraybuffer(thr, h_bufobj->buf);\n\n\t\t\tif (h_bufobj->buf_prop == NULL) {\n\t\t\t\t/* Must recheck buf_prop, in case ArrayBuffer\n\t\t\t\t * alloc had a side effect which already filled\n\t\t\t\t * it!\n\t\t\t\t */\n\n\t\t\t\t/* Set ArrayBuffer's .byteOffset and .byteLength based\n\t\t\t\t * on the view so that Arraybuffer[view.byteOffset]\n\t\t\t\t * matches view[0].\n\t\t\t\t */\n\t\t\t\th_arrbuf->offset = 0;\n\t\t\t\tDUK_ASSERT(h_bufobj->offset + h_bufobj->length >= h_bufobj->offset);  /* Wrap check on creation. */\n\t\t\t\th_arrbuf->length = h_bufobj->offset + h_bufobj->length;\n\t\t\t\tDUK_ASSERT(h_arrbuf->buf_prop == NULL);\n\n\t\t\t\tDUK_ASSERT(h_bufobj->buf_prop == NULL);\n\t\t\t\th_bufobj->buf_prop = (duk_hobject *) h_arrbuf;\n\t\t\t\tDUK_HBUFOBJ_INCREF(thr, h_arrbuf);  /* Now reachable and accounted for. */\n\t\t\t}\n\n\t\t\t/* Left on stack; pushed for the second time below (OK). */\n\t\t}\n\t\tif (h_bufobj->buf_prop) {\n\t\t\tduk_push_hobject(thr, h_bufobj->buf_prop);\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) {\n\tduk_hbufobj *h_bufobj;\n\n\th_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/);\n\tDUK_ASSERT(h_bufobj != NULL);\n\tif (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) {\n\t\tduk_push_uint(thr, 0);\n\t} else {\n\t\t/* If neutered must return 0; offset is zeroed during\n\t\t * neutering.\n\t\t */\n\t\tduk_push_uint(thr, h_bufobj->offset);\n\t}\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) {\n\tduk_hbufobj *h_bufobj;\n\n\th_bufobj = (duk_hbufobj *) duk__getrequire_bufobj_this(thr, DUK__BUFOBJ_FLAG_THROW /*flags*/);\n\tDUK_ASSERT(h_bufobj != NULL);\n\tif (DUK_HEAPHDR_IS_BUFFER((duk_heaphdr *) h_bufobj)) {\n\t\tduk_hbuffer *h_buf;\n\n\t\th_buf = (duk_hbuffer *) h_bufobj;\n\t\tDUK_ASSERT(DUK_HBUFFER_GET_SIZE(h_buf) <= DUK_UINT_MAX);  /* Buffer limits. */\n\t\tduk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf));\n\t} else {\n\t\t/* If neutered must return 0; length is zeroed during\n\t\t * neutering.\n\t\t */\n\t\tduk_push_uint(thr, h_bufobj->length);\n\t}\n\treturn 1;\n}\n#else  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n/* No .buffer getter without ArrayBuffer support. */\n#if 0\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_buffer_getter(duk_hthread *thr) {\n\treturn 0;\n}\n#endif\n\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_byteoffset_getter(duk_hthread *thr) {\n\tduk_push_uint(thr, 0);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_typedarray_bytelength_getter(duk_hthread *thr) {\n\tduk_hbuffer *h_buf;\n\n\t/* XXX: helper? */\n\tduk_push_this(thr);\n\th_buf = duk_require_hbuffer(thr, -1);\n\tduk_push_uint(thr, DUK_HBUFFER_GET_SIZE(h_buf));\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/* automatic undefs */\n#undef DUK__BUFOBJ_FLAG_PROMOTE\n#undef DUK__BUFOBJ_FLAG_THROW\n#undef DUK__FLD_16BIT\n#undef DUK__FLD_32BIT\n#undef DUK__FLD_8BIT\n#undef DUK__FLD_BIGENDIAN\n#undef DUK__FLD_DOUBLE\n#undef DUK__FLD_FLOAT\n#undef DUK__FLD_SIGNED\n#undef DUK__FLD_TYPEDARRAY\n#undef DUK__FLD_VARINT\n#line 1 \"duk_bi_date.c\"\n/*\n *  Date built-ins\n *\n *  Unlike most built-ins, Date has some platform dependencies for getting\n *  UTC time, converting between UTC and local time, and parsing and\n *  formatting time values.  These are all abstracted behind DUK_USE_xxx\n *  config options.  There are built-in platform specific providers for\n *  POSIX and Windows, but external providers can also be used.\n *\n *  See doc/datetime.rst.\n *\n */\n\n/* #include duk_internal.h -> already included */\n\n/* XXX: currently defines unnecessary symbols when DUK_USE_DATE_BUILTIN is disabled. */\n\n/*\n *  Forward declarations\n */\n\nDUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset);\nDUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags);\nDUK_LOCAL_DECL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val);\nDUK_LOCAL_DECL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags);\n\n/*\n *  Other file level defines\n */\n\n/* Debug macro to print all parts and dparts (used manually because of debug level). */\n#define  DUK__DPRINT_PARTS_AND_DPARTS(parts,dparts)  do { \\\n\t\tDUK_D(DUK_DPRINT(\"parts: %ld %ld %ld %ld %ld %ld %ld %ld, dparts: %lf %lf %lf %lf %lf %lf %lf %lf\", \\\n\t\t                 (long) (parts)[0], (long) (parts)[1], \\\n\t\t                 (long) (parts)[2], (long) (parts)[3], \\\n\t\t                 (long) (parts)[4], (long) (parts)[5], \\\n\t\t                 (long) (parts)[6], (long) (parts)[7], \\\n\t\t                 (double) (dparts)[0], (double) (dparts)[1], \\\n\t\t                 (double) (dparts)[2], (double) (dparts)[3], \\\n\t\t                 (double) (dparts)[4], (double) (dparts)[5], \\\n\t\t                 (double) (dparts)[6], (double) (dparts)[7])); \\\n\t} while (0)\n#define  DUK__DPRINT_PARTS(parts)  do { \\\n\t\tDUK_D(DUK_DPRINT(\"parts: %ld %ld %ld %ld %ld %ld %ld %ld\", \\\n\t\t                 (long) (parts)[0], (long) (parts)[1], \\\n\t\t                 (long) (parts)[2], (long) (parts)[3], \\\n\t\t                 (long) (parts)[4], (long) (parts)[5], \\\n\t\t                 (long) (parts)[6], (long) (parts)[7])); \\\n\t} while (0)\n#define  DUK__DPRINT_DPARTS(dparts)  do { \\\n\t\tDUK_D(DUK_DPRINT(\"dparts: %lf %lf %lf %lf %lf %lf %lf %lf\", \\\n\t\t                 (double) (dparts)[0], (double) (dparts)[1], \\\n\t\t                 (double) (dparts)[2], (double) (dparts)[3], \\\n\t\t                 (double) (dparts)[4], (double) (dparts)[5], \\\n\t\t                 (double) (dparts)[6], (double) (dparts)[7])); \\\n\t} while (0)\n\n/* Equivalent year for DST calculations outside [1970,2038[ range, see\n * E5 Section 15.9.1.8.  Equivalent year has the same leap-year-ness and\n * starts with the same weekday on Jan 1.\n * https://bugzilla.mozilla.org/show_bug.cgi?id=351066\n */\n#define DUK__YEAR(x) ((duk_uint8_t) ((x) - 1970))\nDUK_LOCAL duk_uint8_t duk__date_equivyear[14] = {\n#if 1\n\t/* This is based on V8 EquivalentYear() algorithm (see util/genequivyear.py):\n\t * http://code.google.com/p/v8/source/browse/trunk/src/date.h#146\n\t */\n\n\t/* non-leap year: sunday, monday, ... */\n\tDUK__YEAR(2023), DUK__YEAR(2035), DUK__YEAR(2019), DUK__YEAR(2031),\n\tDUK__YEAR(2015), DUK__YEAR(2027), DUK__YEAR(2011),\n\n\t/* leap year: sunday, monday, ... */\n\tDUK__YEAR(2012), DUK__YEAR(2024), DUK__YEAR(2008), DUK__YEAR(2020),\n\tDUK__YEAR(2032), DUK__YEAR(2016), DUK__YEAR(2028)\n#endif\n\n#if 0\n\t/* This is based on Rhino EquivalentYear() algorithm:\n\t * https://github.com/mozilla/rhino/blob/f99cc11d616f0cdda2c42bde72b3484df6182947/src/org/mozilla/javascript/NativeDate.java\n\t */\n\n\t/* non-leap year: sunday, monday, ... */\n\tDUK__YEAR(1978), DUK__YEAR(1973), DUK__YEAR(1985), DUK__YEAR(1986),\n\tDUK__YEAR(1981), DUK__YEAR(1971), DUK__YEAR(1977),\n\n\t/* leap year: sunday, monday, ... */\n\tDUK__YEAR(1984), DUK__YEAR(1996), DUK__YEAR(1980), DUK__YEAR(1992),\n\tDUK__YEAR(1976), DUK__YEAR(1988), DUK__YEAR(1972)\n#endif\n};\n\n/*\n *  ISO 8601 subset parser.\n */\n\n/* Parser part count. */\n#define DUK__NUM_ISO8601_PARSER_PARTS  9\n\n/* Parser part indices. */\n#define DUK__PI_YEAR         0\n#define DUK__PI_MONTH        1\n#define DUK__PI_DAY          2\n#define DUK__PI_HOUR         3\n#define DUK__PI_MINUTE       4\n#define DUK__PI_SECOND       5\n#define DUK__PI_MILLISECOND  6\n#define DUK__PI_TZHOUR       7\n#define DUK__PI_TZMINUTE     8\n\n/* Parser part masks. */\n#define DUK__PM_YEAR         (1 << DUK__PI_YEAR)\n#define DUK__PM_MONTH        (1 << DUK__PI_MONTH)\n#define DUK__PM_DAY          (1 << DUK__PI_DAY)\n#define DUK__PM_HOUR         (1 << DUK__PI_HOUR)\n#define DUK__PM_MINUTE       (1 << DUK__PI_MINUTE)\n#define DUK__PM_SECOND       (1 << DUK__PI_SECOND)\n#define DUK__PM_MILLISECOND  (1 << DUK__PI_MILLISECOND)\n#define DUK__PM_TZHOUR       (1 << DUK__PI_TZHOUR)\n#define DUK__PM_TZMINUTE     (1 << DUK__PI_TZMINUTE)\n\n/* Parser separator indices. */\n#define DUK__SI_PLUS         0\n#define DUK__SI_MINUS        1\n#define DUK__SI_T            2\n#define DUK__SI_SPACE        3\n#define DUK__SI_COLON        4\n#define DUK__SI_PERIOD       5\n#define DUK__SI_Z            6\n#define DUK__SI_NUL          7\n\n/* Parser separator masks. */\n#define DUK__SM_PLUS         (1 << DUK__SI_PLUS)\n#define DUK__SM_MINUS        (1 << DUK__SI_MINUS)\n#define DUK__SM_T            (1 << DUK__SI_T)\n#define DUK__SM_SPACE        (1 << DUK__SI_SPACE)\n#define DUK__SM_COLON        (1 << DUK__SI_COLON)\n#define DUK__SM_PERIOD       (1 << DUK__SI_PERIOD)\n#define DUK__SM_Z            (1 << DUK__SI_Z)\n#define DUK__SM_NUL          (1 << DUK__SI_NUL)\n\n/* Rule control flags. */\n#define DUK__CF_NEG          (1 << 0)  /* continue matching, set neg_tzoffset flag */\n#define DUK__CF_ACCEPT       (1 << 1)  /* accept string */\n#define DUK__CF_ACCEPT_NUL   (1 << 2)  /* accept string if next char is NUL (otherwise reject) */\n\n#define DUK__PACK_RULE(partmask,sepmask,nextpart,flags)  \\\n\t((duk_uint32_t) (partmask) + \\\n\t (((duk_uint32_t) (sepmask)) << 9) + \\\n\t (((duk_uint32_t) (nextpart)) << 17) + \\\n\t (((duk_uint32_t) (flags)) << 21))\n\n#define DUK__UNPACK_RULE(rule,var_nextidx,var_flags)  do { \\\n\t\t(var_nextidx) = (duk_small_uint_t) (((rule) >> 17) & 0x0f); \\\n\t\t(var_flags) = (duk_small_uint_t) ((rule) >> 21); \\\n\t} while (0)\n\n#define DUK__RULE_MASK_PART_SEP  0x1ffffUL\n\n/* Matching separator index is used in the control table */\nDUK_LOCAL const duk_uint8_t duk__parse_iso8601_seps[] = {\n\tDUK_ASC_PLUS /*0*/, DUK_ASC_MINUS /*1*/, DUK_ASC_UC_T /*2*/, DUK_ASC_SPACE /*3*/,\n\tDUK_ASC_COLON /*4*/, DUK_ASC_PERIOD /*5*/, DUK_ASC_UC_Z /*6*/, DUK_ASC_NUL /*7*/\n};\n\n/* Rule table: first matching rule is used to determine what to do next. */\nDUK_LOCAL const duk_uint32_t duk__parse_iso8601_control[] = {\n\tDUK__PACK_RULE(DUK__PM_YEAR, DUK__SM_MINUS, DUK__PI_MONTH, 0),\n\tDUK__PACK_RULE(DUK__PM_MONTH, DUK__SM_MINUS, DUK__PI_DAY, 0),\n\tDUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY, DUK__SM_T | DUK__SM_SPACE, DUK__PI_HOUR, 0),\n\tDUK__PACK_RULE(DUK__PM_HOUR, DUK__SM_COLON, DUK__PI_MINUTE, 0),\n\tDUK__PACK_RULE(DUK__PM_MINUTE, DUK__SM_COLON, DUK__PI_SECOND, 0),\n\tDUK__PACK_RULE(DUK__PM_SECOND, DUK__SM_PERIOD, DUK__PI_MILLISECOND, 0),\n\tDUK__PACK_RULE(DUK__PM_TZHOUR, DUK__SM_COLON, DUK__PI_TZMINUTE, 0),\n\tDUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_PLUS, DUK__PI_TZHOUR, 0),\n\tDUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_MINUS, DUK__PI_TZHOUR, DUK__CF_NEG),\n\tDUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_Z, 0, DUK__CF_ACCEPT_NUL),\n\tDUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND | DUK__PM_TZHOUR /*Note2*/ | DUK__PM_TZMINUTE, DUK__SM_NUL, 0, DUK__CF_ACCEPT)\n\n\t/* Note1: the specification doesn't require matching a time form with\n\t *        just hours (\"HH\"), but we accept it here, e.g. \"2012-01-02T12Z\".\n\t *\n\t * Note2: the specification doesn't require matching a timezone offset\n\t *        with just hours (\"HH\"), but accept it here, e.g. \"2012-01-02T03:04:05+02\"\n\t */\n};\n\nDUK_LOCAL duk_bool_t duk__parse_string_iso8601_subset(duk_hthread *thr, const char *str) {\n\tduk_int_t parts[DUK__NUM_ISO8601_PARSER_PARTS];\n\tduk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_double_t d;\n\tconst duk_uint8_t *p;\n\tduk_small_uint_t part_idx = 0;\n\tduk_int_t accum = 0;\n\tduk_small_uint_t ndigits = 0;\n\tduk_bool_t neg_year = 0;\n\tduk_bool_t neg_tzoffset = 0;\n\tduk_uint_fast8_t ch;\n\tduk_small_uint_t i;\n\n\t/* During parsing, month and day are one-based; set defaults here. */\n\tDUK_MEMZERO(parts, sizeof(parts));\n\tDUK_ASSERT(parts[DUK_DATE_IDX_YEAR] == 0);  /* don't care value, year is mandatory */\n\tparts[DUK_DATE_IDX_MONTH] = 1;\n\tparts[DUK_DATE_IDX_DAY] = 1;\n\n\t/* Special handling for year sign. */\n\tp = (const duk_uint8_t *) str;\n\tch = p[0];\n\tif (ch == DUK_ASC_PLUS) {\n\t\tp++;\n\t} else if (ch == DUK_ASC_MINUS) {\n\t\tneg_year = 1;\n\t\tp++;\n\t}\n\n\tfor (;;) {\n\t\tch = *p++;\n\t\tDUK_DDD(DUK_DDDPRINT(\"parsing, part_idx=%ld, char=%ld ('%c')\",\n\t\t                     (long) part_idx, (long) ch,\n\t\t                     (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : DUK_ASC_QUESTION)));\n\n\t\tif (ch >= DUK_ASC_0 && ch <= DUK_ASC_9) {\n\t\t\tif (ndigits >= 9) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"too many digits -> reject\"));\n\t\t\t\tgoto reject;\n\t\t\t}\n\t\t\tif (part_idx == DUK__PI_MILLISECOND && ndigits >= 3) {\n\t\t\t\t/* ignore millisecond fractions after 3 */\n\t\t\t} else {\n\t\t\t\taccum = accum * 10 + ((duk_int_t) ch) - ((duk_int_t) DUK_ASC_0) + 0x00;\n\t\t\t\tndigits++;\n\t\t\t}\n\t\t} else {\n\t\t\tduk_uint_fast32_t match_val;\n\t\t\tduk_small_uint_t sep_idx;\n\n\t\t\tif (ndigits <= 0) {\n\t\t\t\tgoto reject;\n\t\t\t}\n\t\t\tif (part_idx == DUK__PI_MILLISECOND) {\n\t\t\t\t/* complete the millisecond field */\n\t\t\t\twhile (ndigits < 3) {\n\t\t\t\t\taccum *= 10;\n\t\t\t\t\tndigits++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tparts[part_idx] = accum;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"wrote part %ld -> value %ld\", (long) part_idx, (long) accum));\n\n\t\t\taccum = 0;\n\t\t\tndigits = 0;\n\n\t\t\tfor (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t)); i++) {\n\t\t\t\tif (duk__parse_iso8601_seps[i] == ch) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t))) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"separator character doesn't match -> reject\"));\n\t\t\t\tgoto reject;\n\t\t\t}\n\n\t\t\tsep_idx = i;\n\t\t\tmatch_val = (1UL << part_idx) + (1UL << (sep_idx + 9));  /* match against rule part/sep bits */\n\n\t\t\tfor (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t)); i++) {\n\t\t\t\tduk_uint_fast32_t rule = duk__parse_iso8601_control[i];\n\t\t\t\tduk_small_uint_t nextpart;\n\t\t\t\tduk_small_uint_t cflags;\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, considering rule=0x%08lx\",\n\t\t\t\t                     (long) part_idx, (long) sep_idx,\n\t\t\t\t                     (unsigned long) match_val, (unsigned long) rule));\n\n\t\t\t\tif ((rule & match_val) != match_val) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tDUK__UNPACK_RULE(rule, nextpart, cflags);\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"rule match -> part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, \"\n\t\t\t\t                     \"rule=0x%08lx -> nextpart=%ld, cflags=0x%02lx\",\n\t\t\t\t                     (long) part_idx, (long) sep_idx,\n\t\t\t\t                     (unsigned long) match_val, (unsigned long) rule,\n\t\t\t\t                     (long) nextpart, (unsigned long) cflags));\n\n\t\t\t\tif (cflags & DUK__CF_NEG) {\n\t\t\t\t\tneg_tzoffset = 1;\n\t\t\t\t}\n\n\t\t\t\tif (cflags & DUK__CF_ACCEPT) {\n\t\t\t\t\tgoto accept;\n\t\t\t\t}\n\n\t\t\t\tif (cflags & DUK__CF_ACCEPT_NUL) {\n\t\t\t\t\tDUK_ASSERT(*(p - 1) != (char) 0);\n\t\t\t\t\tif (*p == DUK_ASC_NUL) {\n\t\t\t\t\t\tgoto accept;\n\t\t\t\t\t}\n\t\t\t\t\tgoto reject;\n\t\t\t\t}\n\n\t\t\t\tpart_idx = nextpart;\n\t\t\t\tbreak;\n\t\t\t}  /* rule match */\n\n\t\t\tif (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t))) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"no rule matches -> reject\"));\n\t\t\t\tgoto reject;\n\t\t\t}\n\n\t\t\tif (ch == 0) {\n\t\t\t\t/* This shouldn't be necessary, but check just in case\n\t\t\t\t * to avoid any chance of overruns.\n\t\t\t\t */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"NUL after rule matching (should not happen) -> reject\"));\n\t\t\t\tgoto reject;\n\t\t\t}\n\t\t}  /* if-digit-else-ctrl */\n\t}  /* char loop */\n\n\t/* We should never exit the loop above. */\n\tDUK_UNREACHABLE();\n\n reject:\n\tDUK_DDD(DUK_DDDPRINT(\"reject\"));\n\treturn 0;\n\n accept:\n\tDUK_DDD(DUK_DDDPRINT(\"accept\"));\n\n\t/* Apply timezone offset to get the main parts in UTC */\n\tif (neg_year) {\n\t\tparts[DUK__PI_YEAR] = -parts[DUK__PI_YEAR];\n\t}\n\tif (neg_tzoffset) {\n\t\tparts[DUK__PI_HOUR] += parts[DUK__PI_TZHOUR];\n\t\tparts[DUK__PI_MINUTE] += parts[DUK__PI_TZMINUTE];\n\t} else {\n\t\tparts[DUK__PI_HOUR] -= parts[DUK__PI_TZHOUR];\n\t\tparts[DUK__PI_MINUTE] -= parts[DUK__PI_TZMINUTE];\n\t}\n\tparts[DUK__PI_MONTH] -= 1;  /* zero-based month */\n\tparts[DUK__PI_DAY] -= 1;  /* zero-based day */\n\n\t/* Use double parts, they tolerate unnormalized time.\n\t *\n\t * Note: DUK_DATE_IDX_WEEKDAY is initialized with a bogus value (DUK__PI_TZHOUR)\n\t * on purpose.  It won't be actually used by duk_bi_date_get_timeval_from_dparts(),\n\t * but will make the value initialized just in case, and avoid any\n\t * potential for Valgrind issues.\n\t */\n\tfor (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"part[%ld] = %ld\", (long) i, (long) parts[i]));\n\t\tdparts[i] = parts[i];\n\t}\n\n\td = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/);\n\tduk_push_number(thr, d);\n\treturn 1;\n}\n\n/*\n *  Date/time parsing helper.\n *\n *  Parse a datetime string into a time value.  We must first try to parse\n *  the input according to the standard format in E5.1 Section 15.9.1.15.\n *  If that fails, we can try to parse using custom parsing, which can\n *  either be platform neutral (custom code) or platform specific (using\n *  existing platform API calls).\n *\n *  Note in particular that we must parse whatever toString(), toUTCString(),\n *  and toISOString() can produce; see E5.1 Section 15.9.4.2.\n *\n *  Returns 1 to allow tail calling.\n *\n *  There is much room for improvement here with respect to supporting\n *  alternative datetime formats.  For instance, V8 parses '2012-01-01' as\n *  UTC and '2012/01/01' as local time.\n */\n\nDUK_LOCAL duk_ret_t duk__parse_string(duk_hthread *thr, const char *str) {\n\t/* XXX: there is a small risk here: because the ISO 8601 parser is\n\t * very loose, it may end up parsing some datetime values which\n\t * would be better parsed with a platform specific parser.\n\t */\n\n\tDUK_ASSERT(str != NULL);\n\tDUK_DDD(DUK_DDDPRINT(\"parse datetime from string '%s'\", (const char *) str));\n\n\tif (duk__parse_string_iso8601_subset(thr, str) != 0) {\n\t\treturn 1;\n\t}\n\n#if defined(DUK_USE_DATE_PARSE_STRING)\n\t/* Contract, either:\n\t * - Push value on stack and return 1\n\t * - Don't push anything on stack and return 0\n\t */\n\n\tif (DUK_USE_DATE_PARSE_STRING(thr, str) != 0) {\n\t\treturn 1;\n\t}\n#else\n\t/* No platform-specific parsing, this is not an error. */\n#endif\n\n\tduk_push_nan(thr);\n\treturn 1;\n}\n\n/*\n *  Calendar helpers\n *\n *  Some helpers are used for getters and can operate on normalized values\n *  which can be represented with 32-bit signed integers.  Other helpers are\n *  needed by setters and operate on un-normalized double values, must watch\n *  out for non-finite numbers etc.\n */\n\nDUK_LOCAL duk_uint8_t duk__days_in_month[12] = {\n\t(duk_uint8_t) 31, (duk_uint8_t) 28, (duk_uint8_t) 31, (duk_uint8_t) 30,\n\t(duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 31,\n\t(duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31\n};\n\n/* Maximum iteration count for computing UTC-to-local time offset when\n * creating an Ecmascript time value from local parts.\n */\n#define DUK__LOCAL_TZOFFSET_MAXITER   4\n\n/* Because 'day since epoch' can be negative and is used to compute weekday\n * using a modulo operation, add this multiple of 7 to avoid negative values\n * when year is below 1970 epoch.  Ecmascript time values are restricted to\n * +/- 100 million days from epoch, so this adder fits nicely into 32 bits.\n * Round to a multiple of 7 (= floor(100000000 / 7) * 7) and add margin.\n */\n#define DUK__WEEKDAY_MOD_ADDER  (20000000 * 7)  /* 0x08583b00 */\n\nDUK_INTERNAL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year) {\n\tif ((year % 4) != 0) {\n\t\treturn 0;\n\t}\n\tif ((year % 100) != 0) {\n\t\treturn 1;\n\t}\n\tif ((year % 400) != 0) {\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\nDUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x) {\n\treturn (x >= -DUK_DATE_MSEC_100M_DAYS && x <= DUK_DATE_MSEC_100M_DAYS);\n}\n\nDUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x) {\n\treturn (x >= -DUK_DATE_MSEC_100M_DAYS_LEEWAY && x <= DUK_DATE_MSEC_100M_DAYS_LEEWAY);\n}\n\nDUK_INTERNAL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t x) {\n\treturn (x >= DUK_DATE_MIN_ECMA_YEAR && x <= DUK_DATE_MAX_ECMA_YEAR);\n}\n\nDUK_LOCAL duk_double_t duk__timeclip(duk_double_t x) {\n\tif (!DUK_ISFINITE(x)) {\n\t\treturn DUK_DOUBLE_NAN;\n\t}\n\n\tif (!duk_bi_date_timeval_in_valid_range(x)) {\n\t\treturn DUK_DOUBLE_NAN;\n\t}\n\n\tx = duk_js_tointeger_number(x);\n\n\t/* Here we'd have the option to normalize -0 to +0. */\n\treturn x;\n}\n\n/* Integer division which floors also negative values correctly. */\nDUK_LOCAL duk_int_t duk__div_floor(duk_int_t a, duk_int_t b) {\n\tDUK_ASSERT(b > 0);\n\tif (a >= 0) {\n\t\treturn a / b;\n\t} else {\n\t\t/* e.g. a = -4, b = 5  -->  -4 - 5 + 1 / 5  -->  -8 / 5  -->  -1\n\t\t *      a = -5, b = 5  -->  -5 - 5 + 1 / 5  -->  -9 / 5  -->  -1\n\t\t *      a = -6, b = 5  -->  -6 - 5 + 1 / 5  -->  -10 / 5  -->  -2\n\t\t */\n\t\treturn (a - b + 1) / b;\n\t}\n}\n\n/* Compute day number of the first day of a given year. */\nDUK_LOCAL duk_int_t duk__day_from_year(duk_int_t year) {\n\t/* Note: in integer arithmetic, (x / 4) is same as floor(x / 4) for non-negative\n\t * values, but is incorrect for negative ones.\n\t */\n\treturn 365 * (year - 1970)\n\t       + duk__div_floor(year - 1969, 4)\n\t       - duk__div_floor(year - 1901, 100)\n\t       + duk__div_floor(year - 1601, 400);\n}\n\n/* Given a day number, determine year and day-within-year. */\nDUK_LOCAL duk_int_t duk__year_from_day(duk_int_t day, duk_small_int_t *out_day_within_year) {\n\tduk_int_t year;\n\tduk_int_t diff_days;\n\n\t/* estimate year upwards (towards positive infinity), then back down;\n\t * two iterations should be enough\n\t */\n\n\tif (day >= 0) {\n\t\tyear = 1970 + day / 365;\n\t} else {\n\t\tyear = 1970 + day / 366;\n\t}\n\n\tfor (;;) {\n\t\tdiff_days = duk__day_from_year(year) - day;\n\t\tDUK_DDD(DUK_DDDPRINT(\"year=%ld day=%ld, diff_days=%ld\", (long) year, (long) day, (long) diff_days));\n\t\tif (diff_days <= 0) {\n\t\t\tDUK_ASSERT(-diff_days < 366);  /* fits into duk_small_int_t */\n\t\t\t*out_day_within_year = -diff_days;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"--> year=%ld, day-within-year=%ld\",\n\t\t\t                     (long) year, (long) *out_day_within_year));\n\t\t\tDUK_ASSERT(*out_day_within_year >= 0);\n\t\t\tDUK_ASSERT(*out_day_within_year < (duk_bi_date_is_leap_year(year) ? 366 : 365));\n\t\t\treturn year;\n\t\t}\n\n\t\t/* Note: this is very tricky; we must never 'overshoot' the\n\t\t * correction downwards.\n\t\t */\n\t\tyear -= 1 + (diff_days - 1) / 366;  /* conservative */\n\t}\n}\n\n/* Given a (year, month, day-within-month) triple, compute day number.\n * The input triple is un-normalized and may contain non-finite values.\n */\nDUK_LOCAL duk_double_t duk__make_day(duk_double_t year, duk_double_t month, duk_double_t day) {\n\tduk_int_t day_num;\n\tduk_bool_t is_leap;\n\tduk_small_int_t i, n;\n\n\t/* Assume that year, month, day are all coerced to whole numbers.\n\t * They may also be NaN or infinity, in which case this function\n\t * must return NaN or infinity to ensure time value becomes NaN.\n\t * If 'day' is NaN, the final return will end up returning a NaN,\n\t * so it doesn't need to be checked here.\n\t */\n\n\tif (!DUK_ISFINITE(year) || !DUK_ISFINITE(month)) {\n\t\treturn DUK_DOUBLE_NAN;\n\t}\n\n\tyear += DUK_FLOOR(month / 12.0);\n\n\tmonth = DUK_FMOD(month, 12.0);\n\tif (month < 0.0) {\n\t\t/* handle negative values */\n\t\tmonth += 12.0;\n\t}\n\n\t/* The algorithm in E5.1 Section 15.9.1.12 normalizes month, but\n\t * does not normalize the day-of-month (nor check whether or not\n\t * it is finite) because it's not necessary for finding the day\n\t * number which matches the (year,month) pair.\n\t *\n\t * We assume that duk__day_from_year() is exact here.\n\t *\n\t * Without an explicit infinity / NaN check in the beginning,\n\t * day_num would be a bogus integer here.\n\t *\n\t * It's possible for 'year' to be out of integer range here.\n\t * If so, we need to return NaN without integer overflow.\n\t * This fixes test-bug-setyear-overflow.js.\n\t */\n\n\tif (!duk_bi_date_year_in_valid_range(year)) {\n\t\tDUK_DD(DUK_DDPRINT(\"year not in ecmascript valid range, avoid integer overflow: %lf\", (double) year));\n\t\treturn DUK_DOUBLE_NAN;\n\t}\n\tday_num = duk__day_from_year((duk_int_t) year);\n\tis_leap = duk_bi_date_is_leap_year((duk_int_t) year);\n\n\tn = (duk_small_int_t) month;\n\tfor (i = 0; i < n; i++) {\n\t\tday_num += duk__days_in_month[i];\n\t\tif (i == 1 && is_leap) {\n\t\t\tday_num++;\n\t\t}\n\t}\n\n\t/* If 'day' is NaN, returns NaN. */\n\treturn (duk_double_t) day_num + day;\n}\n\n/* Split time value into parts.  The time value may contain fractions (it may\n * come from duk_time_to_components() API call) which are truncated.  Possible\n * local time adjustment has already been applied when reading the time value.\n */\nDUK_INTERNAL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags) {\n\tduk_double_t d1, d2;\n\tduk_int_t t1, t2;\n\tduk_int_t day_since_epoch;\n\tduk_int_t year;  /* does not fit into 16 bits */\n\tduk_small_int_t day_in_year;\n\tduk_small_int_t month;\n\tduk_small_int_t day;\n\tduk_small_int_t dim;\n\tduk_int_t jan1_since_epoch;\n\tduk_small_int_t jan1_weekday;\n\tduk_int_t equiv_year;\n\tduk_small_uint_t i;\n\tduk_bool_t is_leap;\n\tduk_small_int_t arridx;\n\n\tDUK_ASSERT(DUK_ISFINITE(d));    /* caller checks */\n\td = DUK_FLOOR(d);  /* remove fractions if present */\n\tDUK_ASSERT(DUK_FLOOR(d) == d);\n\n\t/* The timevalue must be in valid Ecmascript range, but since a local\n\t * time offset can be applied, we need to allow a +/- 24h leeway to\n\t * the value.  In other words, although the UTC time is within the\n\t * Ecmascript range, the local part values can be just outside of it.\n\t */\n\tDUK_UNREF(duk_bi_date_timeval_in_leeway_range);\n\tDUK_ASSERT(duk_bi_date_timeval_in_leeway_range(d));\n\n\t/* These computations are guaranteed to be exact for the valid\n\t * E5 time value range, assuming milliseconds without fractions.\n\t */\n\td1 = (duk_double_t) DUK_FMOD(d, (double) DUK_DATE_MSEC_DAY);\n\tif (d1 < 0.0) {\n\t\t/* deal with negative values */\n\t\td1 += (duk_double_t) DUK_DATE_MSEC_DAY;\n\t}\n\td2 = DUK_FLOOR((double) (d / (duk_double_t) DUK_DATE_MSEC_DAY));\n\tDUK_ASSERT(d2 * ((duk_double_t) DUK_DATE_MSEC_DAY) + d1 == d);\n\t/* now expected to fit into a 32-bit integer */\n\tt1 = (duk_int_t) d1;\n\tt2 = (duk_int_t) d2;\n\tday_since_epoch = t2;\n\tDUK_ASSERT((duk_double_t) t1 == d1);\n\tDUK_ASSERT((duk_double_t) t2 == d2);\n\n\t/* t1 = milliseconds within day (fits 32 bit)\n\t * t2 = day number from epoch (fits 32 bit, may be negative)\n\t */\n\n\tparts[DUK_DATE_IDX_MILLISECOND] = t1 % 1000; t1 /= 1000;\n\tparts[DUK_DATE_IDX_SECOND] = t1 % 60; t1 /= 60;\n\tparts[DUK_DATE_IDX_MINUTE] = t1 % 60; t1 /= 60;\n\tparts[DUK_DATE_IDX_HOUR] = t1;\n\tDUK_ASSERT(parts[DUK_DATE_IDX_MILLISECOND] >= 0 && parts[DUK_DATE_IDX_MILLISECOND] <= 999);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_SECOND] >= 0 && parts[DUK_DATE_IDX_SECOND] <= 59);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_MINUTE] >= 0 && parts[DUK_DATE_IDX_MINUTE] <= 59);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_HOUR] >= 0 && parts[DUK_DATE_IDX_HOUR] <= 23);\n\n\tDUK_DDD(DUK_DDDPRINT(\"d=%lf, d1=%lf, d2=%lf, t1=%ld, t2=%ld, parts: hour=%ld min=%ld sec=%ld msec=%ld\",\n\t                     (double) d, (double) d1, (double) d2, (long) t1, (long) t2,\n\t                     (long) parts[DUK_DATE_IDX_HOUR],\n\t                     (long) parts[DUK_DATE_IDX_MINUTE],\n\t                     (long) parts[DUK_DATE_IDX_SECOND],\n\t                     (long) parts[DUK_DATE_IDX_MILLISECOND]));\n\n\t/* This assert depends on the input parts representing time inside\n\t * the Ecmascript range.\n\t */\n\tDUK_ASSERT(t2 + DUK__WEEKDAY_MOD_ADDER >= 0);\n\tparts[DUK_DATE_IDX_WEEKDAY] = (t2 + 4 + DUK__WEEKDAY_MOD_ADDER) % 7;  /* E5.1 Section 15.9.1.6 */\n\tDUK_ASSERT(parts[DUK_DATE_IDX_WEEKDAY] >= 0 && parts[DUK_DATE_IDX_WEEKDAY] <= 6);\n\n\tyear = duk__year_from_day(t2, &day_in_year);\n\tday = day_in_year;\n\tis_leap = duk_bi_date_is_leap_year(year);\n\tfor (month = 0; month < 12; month++) {\n\t\tdim = duk__days_in_month[month];\n\t\tif (month == 1 && is_leap) {\n\t\t\tdim++;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"month=%ld, dim=%ld, day=%ld\",\n\t\t                     (long) month, (long) dim, (long) day));\n\t\tif (day < dim) {\n\t\t\tbreak;\n\t\t}\n\t\tday -= dim;\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"final month=%ld\", (long) month));\n\tDUK_ASSERT(month >= 0 && month <= 11);\n\tDUK_ASSERT(day >= 0 && day <= 31);\n\n\t/* Equivalent year mapping, used to avoid DST trouble when platform\n\t * may fail to provide reasonable DST answers for dates outside the\n\t * ordinary range (e.g. 1970-2038).  An equivalent year has the same\n\t * leap-year-ness as the original year and begins on the same weekday\n\t * (Jan 1).\n\t *\n\t * The year 2038 is avoided because there seem to be problems with it\n\t * on some platforms.  The year 1970 is also avoided as there were\n\t * practical problems with it; an equivalent year is used for it too,\n\t * which breaks some DST computations for 1970 right now, see e.g.\n\t * test-bi-date-tzoffset-brute-fi.js.\n\t */\n\tif ((flags & DUK_DATE_FLAG_EQUIVYEAR) && (year < 1971 || year > 2037)) {\n\t\tDUK_ASSERT(is_leap == 0 || is_leap == 1);\n\n\t\tjan1_since_epoch = day_since_epoch - day_in_year;  /* day number for Jan 1 since epoch */\n\t\tDUK_ASSERT(jan1_since_epoch + DUK__WEEKDAY_MOD_ADDER >= 0);\n\t\tjan1_weekday = (jan1_since_epoch + 4 + DUK__WEEKDAY_MOD_ADDER) % 7;  /* E5.1 Section 15.9.1.6 */\n\t\tDUK_ASSERT(jan1_weekday >= 0 && jan1_weekday <= 6);\n\t\tarridx = jan1_weekday;\n\t\tif (is_leap) {\n\t\t\tarridx += 7;\n\t\t}\n\t\tDUK_ASSERT(arridx >= 0 && arridx < (duk_small_int_t) (sizeof(duk__date_equivyear) / sizeof(duk_uint8_t)));\n\n\t\tequiv_year = (duk_int_t) duk__date_equivyear[arridx] + 1970;\n\t\tyear = equiv_year;\n\t\tDUK_DDD(DUK_DDDPRINT(\"equiv year mapping, year=%ld, day_in_year=%ld, day_since_epoch=%ld, \"\n\t\t                     \"jan1_since_epoch=%ld, jan1_weekday=%ld -> equiv year %ld\",\n\t\t                     (long) year, (long) day_in_year, (long) day_since_epoch,\n\t\t                     (long) jan1_since_epoch, (long) jan1_weekday, (long) equiv_year));\n\t}\n\n\tparts[DUK_DATE_IDX_YEAR] = year;\n\tparts[DUK_DATE_IDX_MONTH] = month;\n\tparts[DUK_DATE_IDX_DAY] = day;\n\n\tif (flags & DUK_DATE_FLAG_ONEBASED) {\n\t\tparts[DUK_DATE_IDX_MONTH]++;  /* zero-based -> one-based */\n\t\tparts[DUK_DATE_IDX_DAY]++;    /* -\"\"- */\n\t}\n\n\tif (dparts != NULL) {\n\t\tfor (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) {\n\t\t\tdparts[i] = (duk_double_t) parts[i];\n\t\t}\n\t}\n}\n\n/* Compute time value from (double) parts.  The parts can be either UTC\n * or local time; if local, they need to be (conceptually) converted into\n * UTC time.  The parts may represent valid or invalid time, and may be\n * wildly out of range (but may cancel each other and still come out in\n * the valid Date range).\n */\nDUK_INTERNAL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags) {\n#if defined(DUK_USE_PARANOID_DATE_COMPUTATION)\n\t/* See comments below on MakeTime why these are volatile. */\n\tvolatile duk_double_t tmp_time;\n\tvolatile duk_double_t tmp_day;\n\tvolatile duk_double_t d;\n#else\n\tduk_double_t tmp_time;\n\tduk_double_t tmp_day;\n\tduk_double_t d;\n#endif\n\tduk_small_uint_t i;\n\tduk_int_t tzoff, tzoffprev1, tzoffprev2;\n\n\t/* Expects 'this' at top of stack on entry. */\n\n\t/* Coerce all finite parts with ToInteger().  ToInteger() must not\n\t * be called for NaN/Infinity because it will convert e.g. NaN to\n\t * zero.  If ToInteger() has already been called, this has no side\n\t * effects and is idempotent.\n\t *\n\t * Don't read dparts[DUK_DATE_IDX_WEEKDAY]; it will cause Valgrind\n\t * issues if the value is uninitialized.\n\t */\n\tfor (i = 0; i <= DUK_DATE_IDX_MILLISECOND; i++) {\n\t\t/* SCANBUILD: scan-build complains here about assigned value\n\t\t * being garbage or undefined.  This is correct but operating\n\t\t * on undefined values has no ill effect and is ignored by the\n\t\t * caller in the case where this happens.\n\t\t */\n\t\td = dparts[i];\n\t\tif (DUK_ISFINITE(d)) {\n\t\t\tdparts[i] = duk_js_tointeger_number(d);\n\t\t}\n\t}\n\n\t/* Use explicit steps in computation to try to ensure that\n\t * computation happens with intermediate results coerced to\n\t * double values (instead of using something more accurate).\n\t * E.g. E5.1 Section 15.9.1.11 requires use of IEEE 754\n\t * rules (= Ecmascript '+' and '*' operators).\n\t *\n\t * Without 'volatile' even this approach fails on some platform\n\t * and compiler combinations.  For instance, gcc 4.8.1 on Ubuntu\n\t * 64-bit, with -m32 and without -std=c99, test-bi-date-canceling.js\n\t * would fail because of some optimizations when computing tmp_time\n\t * (MakeTime below).  Adding 'volatile' to tmp_time solved this\n\t * particular problem (annoyingly, also adding debug prints or\n\t * running the executable under valgrind hides it).\n\t */\n\n\t/* MakeTime */\n\ttmp_time = 0.0;\n\ttmp_time += dparts[DUK_DATE_IDX_HOUR] * ((duk_double_t) DUK_DATE_MSEC_HOUR);\n\ttmp_time += dparts[DUK_DATE_IDX_MINUTE] * ((duk_double_t) DUK_DATE_MSEC_MINUTE);\n\ttmp_time += dparts[DUK_DATE_IDX_SECOND] * ((duk_double_t) DUK_DATE_MSEC_SECOND);\n\ttmp_time += dparts[DUK_DATE_IDX_MILLISECOND];\n\n\t/* MakeDay */\n\ttmp_day = duk__make_day(dparts[DUK_DATE_IDX_YEAR], dparts[DUK_DATE_IDX_MONTH], dparts[DUK_DATE_IDX_DAY]);\n\n\t/* MakeDate */\n\td = tmp_day * ((duk_double_t) DUK_DATE_MSEC_DAY) + tmp_time;\n\n\tDUK_DDD(DUK_DDDPRINT(\"time=%lf day=%lf --> timeval=%lf\",\n\t                     (double) tmp_time, (double) tmp_day, (double) d));\n\n\t/* Optional UTC conversion. */\n\tif (flags & DUK_DATE_FLAG_LOCALTIME) {\n\t\t/* DUK_USE_DATE_GET_LOCAL_TZOFFSET() needs to be called with a\n\t\t * time value computed from UTC parts.  At this point we only\n\t\t * have 'd' which is a time value computed from local parts, so\n\t\t * it is off by the UTC-to-local time offset which we don't know\n\t\t * yet.  The current solution for computing the UTC-to-local\n\t\t * time offset is to iterate a few times and detect a fixed\n\t\t * point or a two-cycle loop (or a sanity iteration limit),\n\t\t * see test-bi-date-local-parts.js and test-bi-date-tzoffset-basic-fi.js.\n\t\t *\n\t\t * E5.1 Section 15.9.1.9:\n\t\t * UTC(t) = t - LocalTZA - DaylightSavingTA(t - LocalTZA)\n\t\t *\n\t\t * For NaN/inf, DUK_USE_DATE_GET_LOCAL_TZOFFSET() returns 0.\n\t\t */\n\n#if 0\n\t\t/* Old solution: don't iterate, incorrect */\n\t\ttzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);\n\t\tDUK_DDD(DUK_DDDPRINT(\"tzoffset w/o iteration, tzoff=%ld\", (long) tzoff));\n\t\td -= tzoff * 1000L;\n\t\tDUK_UNREF(tzoffprev1);\n\t\tDUK_UNREF(tzoffprev2);\n#endif\n\n\t\t/* Iteration solution */\n\t\ttzoff = 0;\n\t\ttzoffprev1 = 999999999L;  /* invalid value which never matches */\n\t\tfor (i = 0; i < DUK__LOCAL_TZOFFSET_MAXITER; i++) {\n\t\t\ttzoffprev2 = tzoffprev1;\n\t\t\ttzoffprev1 = tzoff;\n\t\t\ttzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d - tzoff * 1000L);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"tzoffset iteration, i=%d, tzoff=%ld, tzoffprev1=%ld tzoffprev2=%ld\",\n\t\t\t                     (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2));\n\t\t\tif (tzoff == tzoffprev1) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"tzoffset iteration finished, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld\",\n\t\t\t\t                     (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2));\n\t\t\t\tbreak;\n\t\t\t} else if (tzoff == tzoffprev2) {\n\t\t\t\t/* Two value cycle, see e.g. test-bi-date-tzoffset-basic-fi.js.\n\t\t\t\t * In these cases, favor a higher tzoffset to get a consistent\n\t\t\t\t * result which is independent of iteration count.  Not sure if\n\t\t\t\t * this is a generically correct solution.\n\t\t\t\t */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"tzoffset iteration two-value cycle, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld\",\n\t\t\t\t                     (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2));\n\t\t\t\tif (tzoffprev1 > tzoff) {\n\t\t\t\t\ttzoff = tzoffprev1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"tzoffset iteration, tzoff=%ld\", (long) tzoff));\n\t\td -= tzoff * 1000L;\n\t}\n\n\t/* TimeClip(), which also handles Infinity -> NaN conversion */\n\td = duk__timeclip(d);\n\n\treturn d;\n}\n\n/*\n *  API oriented helpers\n */\n\n/* Push 'this' binding, check that it is a Date object; then push the\n * internal time value.  At the end, stack is: [ ... this timeval ].\n * Returns the time value.  Local time adjustment is done if requested.\n */\nDUK_LOCAL duk_double_t duk__push_this_get_timeval_tzoffset(duk_hthread *thr, duk_small_uint_t flags, duk_int_t *out_tzoffset) {\n\tduk_hobject *h;\n\tduk_double_t d;\n\tduk_int_t tzoffset = 0;\n\n\tduk_push_this(thr);\n\th = duk_get_hobject(thr, -1);  /* XXX: getter with class check, useful in built-ins */\n\tif (h == NULL || DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_DATE) {\n\t\tDUK_ERROR_TYPE(thr, \"expected Date\");\n\t}\n\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);\n\td = duk_to_number_m1(thr);\n\tduk_pop(thr);\n\n\tif (DUK_ISNAN(d)) {\n\t\tif (flags & DUK_DATE_FLAG_NAN_TO_ZERO) {\n\t\t\td = 0.0;\n\t\t}\n\t\tif (flags & DUK_DATE_FLAG_NAN_TO_RANGE_ERROR) {\n\t\t\tDUK_ERROR_RANGE(thr, \"Invalid Date\");\n\t\t}\n\t}\n\t/* if no NaN handling flag, may still be NaN here, but not Inf */\n\tDUK_ASSERT(!DUK_ISINF(d));\n\n\tif (flags & DUK_DATE_FLAG_LOCALTIME) {\n\t\t/* Note: DST adjustment is determined using UTC time.\n\t\t * If 'd' is NaN, tzoffset will be 0.\n\t\t */\n\t\ttzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);  /* seconds */\n\t\td += tzoffset * 1000L;\n\t}\n\tif (out_tzoffset) {\n\t\t*out_tzoffset = tzoffset;\n\t}\n\n\t/* [ ... this ] */\n\treturn d;\n}\n\nDUK_LOCAL duk_double_t duk__push_this_get_timeval(duk_hthread *thr, duk_small_uint_t flags) {\n\treturn duk__push_this_get_timeval_tzoffset(thr, flags, NULL);\n}\n\n/* Set timeval to 'this' from dparts, push the new time value onto the\n * value stack and return 1 (caller can then tail call us).  Expects\n * the value stack to contain 'this' on the stack top.\n */\nDUK_LOCAL duk_ret_t duk__set_this_timeval_from_dparts(duk_hthread *thr, duk_double_t *dparts, duk_small_uint_t flags) {\n\tduk_double_t d;\n\n\t/* [ ... this ] */\n\n\td = duk_bi_date_get_timeval_from_dparts(dparts, flags);\n\tduk_push_number(thr, d);  /* -> [ ... this timeval_new ] */\n\tduk_dup_top(thr);         /* -> [ ... this timeval_new timeval_new ] */\n\tduk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE);\n\n\t/* stack top: new time value, return 1 to allow tail calls */\n\treturn 1;\n}\n\n/* 'out_buf' must be at least DUK_BI_DATE_ISO8601_BUFSIZE long. */\nDUK_LOCAL void duk__format_parts_iso8601(duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags, duk_uint8_t *out_buf) {\n\tchar yearstr[8];   /* \"-123456\\0\" */\n\tchar tzstr[8];     /* \"+11:22\\0\" */\n\tchar sep = (flags & DUK_DATE_FLAG_SEP_T) ? DUK_ASC_UC_T : DUK_ASC_SPACE;\n\n\tDUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= -999999 && parts[DUK_DATE_IDX_YEAR] <= 999999);\n\n\t/* Note: %06d for positive value, %07d for negative value to include\n\t * sign and 6 digits.\n\t */\n\tDUK_SNPRINTF(yearstr,\n\t             sizeof(yearstr),\n\t             (parts[DUK_DATE_IDX_YEAR] >= 0 && parts[DUK_DATE_IDX_YEAR] <= 9999) ? \"%04ld\" :\n\t                    ((parts[DUK_DATE_IDX_YEAR] >= 0) ? \"+%06ld\" : \"%07ld\"),\n\t             (long) parts[DUK_DATE_IDX_YEAR]);\n\tyearstr[sizeof(yearstr) - 1] = (char) 0;\n\n\tif (flags & DUK_DATE_FLAG_LOCALTIME) {\n\t\t/* tzoffset seconds are dropped; 16 bits suffice for\n\t\t * time offset in minutes\n\t\t */\n\t\tconst char *fmt;\n\t\tduk_small_int_t tmp, arg_hours, arg_minutes;\n\n\t\tif (tzoffset >= 0) {\n\t\t\ttmp = tzoffset;\n\t\t\tfmt = \"+%02d:%02d\";\n\t\t} else {\n\t\t\ttmp = -tzoffset;\n\t\t\tfmt = \"-%02d:%02d\";\n\t\t}\n\t\ttmp = tmp / 60;\n\t\targ_hours = tmp / 60;\n\t\targ_minutes = tmp % 60;\n\t\tDUK_ASSERT(arg_hours <= 24);  /* Even less is actually guaranteed for a valid tzoffset. */\n\t\targ_hours = arg_hours & 0x3f;  /* For [0,24] this is a no-op, but fixes GCC 7 warning, see https://github.com/svaarala/duktape/issues/1602. */\n\n\t\tDUK_SNPRINTF(tzstr, sizeof(tzstr), fmt, (int) arg_hours, (int) arg_minutes);\n\t\ttzstr[sizeof(tzstr) - 1] = (char) 0;\n\t} else {\n\t\ttzstr[0] = DUK_ASC_UC_Z;\n\t\ttzstr[1] = (char) 0;\n\t}\n\n\t/* Unlike year, the other parts fit into 16 bits so %d format\n\t * is portable.\n\t */\n\tif ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) {\n\t\tDUK_SPRINTF((char *) out_buf, \"%s-%02d-%02d%c%02d:%02d:%02d.%03d%s\",\n\t\t            (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY], (int) sep,\n\t\t            (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE],\n\t\t            (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], (const char *) tzstr);\n\t} else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) {\n\t\tDUK_SPRINTF((char *) out_buf, \"%s-%02d-%02d\",\n\t\t            (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY]);\n\t} else {\n\t\tDUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME);\n\t\tDUK_SPRINTF((char *) out_buf, \"%02d:%02d:%02d.%03d%s\",\n\t\t            (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE],\n\t\t            (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND],\n\t\t            (const char *) tzstr);\n\t}\n}\n\n/* Helper for string conversion calls: check 'this' binding, get the\n * internal time value, and format date and/or time in a few formats.\n * Return value allows tail calls.\n */\nDUK_LOCAL duk_ret_t duk__to_string_helper(duk_hthread *thr, duk_small_uint_t flags) {\n\tduk_double_t d;\n\tduk_int_t parts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_int_t tzoffset;  /* seconds, doesn't fit into 16 bits */\n\tduk_bool_t rc;\n\tduk_uint8_t buf[DUK_BI_DATE_ISO8601_BUFSIZE];\n\n\tDUK_UNREF(rc);  /* unreferenced with some options */\n\n\td = duk__push_this_get_timeval_tzoffset(thr, flags, &tzoffset);\n\tif (DUK_ISNAN(d)) {\n\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_INVALID_DATE);\n\t\treturn 1;\n\t}\n\tDUK_ASSERT(DUK_ISFINITE(d));\n\n\t/* formatters always get one-based month/day-of-month */\n\tduk_bi_date_timeval_to_parts(d, parts, NULL, DUK_DATE_FLAG_ONEBASED);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31);\n\n\tif (flags & DUK_DATE_FLAG_TOSTRING_LOCALE) {\n\t\t/* try locale specific formatter; if it refuses to format the\n\t\t * string, fall back to an ISO 8601 formatted value in local\n\t\t * time.\n\t\t */\n#if defined(DUK_USE_DATE_FORMAT_STRING)\n\t\t/* Contract, either:\n\t\t * - Push string to value stack and return 1\n\t\t * - Don't push anything and return 0\n\t\t */\n\n\t\trc = DUK_USE_DATE_FORMAT_STRING(thr, parts, tzoffset, flags);\n\t\tif (rc != 0) {\n\t\t\treturn 1;\n\t\t}\n#else\n\t\t/* No locale specific formatter; this is OK, we fall back\n\t\t * to ISO 8601.\n\t\t */\n#endif\n\t}\n\n\t/* Different calling convention than above used because the helper\n\t * is shared.\n\t */\n\tduk__format_parts_iso8601(parts, tzoffset, flags, buf);\n\tduk_push_string(thr, (const char *) buf);\n\treturn 1;\n}\n\n/* Helper for component getter calls: check 'this' binding, get the\n * internal time value, split it into parts (either as UTC time or\n * local time), push a specified component as a return value to the\n * value stack and return 1 (caller can then tail call us).\n */\nDUK_LOCAL duk_ret_t duk__get_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_idx) {\n\tduk_double_t d;\n\tduk_int_t parts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_small_uint_t idx_part = (duk_small_uint_t) (flags_and_idx >> DUK_DATE_FLAG_VALUE_SHIFT);  /* unpack args */\n\n\tDUK_ASSERT_DISABLE(idx_part >= 0);  /* unsigned */\n\tDUK_ASSERT(idx_part < DUK_DATE_IDX_NUM_PARTS);\n\n\td = duk__push_this_get_timeval(thr, flags_and_idx);\n\tif (DUK_ISNAN(d)) {\n\t\tduk_push_nan(thr);\n\t\treturn 1;\n\t}\n\tDUK_ASSERT(DUK_ISFINITE(d));\n\n\tduk_bi_date_timeval_to_parts(d, parts, NULL, flags_and_idx);  /* no need to mask idx portion */\n\n\t/* Setter APIs detect special year numbers (0...99) and apply a +1900\n\t * only in certain cases.  The legacy getYear() getter applies -1900\n\t * unconditionally.\n\t */\n\tduk_push_int(thr, (flags_and_idx & DUK_DATE_FLAG_SUB1900) ? parts[idx_part] - 1900 : parts[idx_part]);\n\treturn 1;\n}\n\n/* Helper for component setter calls: check 'this' binding, get the\n * internal time value, split it into parts (either as UTC time or\n * local time), modify one or more components as specified, recompute\n * the time value, set it as the internal value.  Finally, push the\n * new time value as a return value to the value stack and return 1\n * (caller can then tail call us).\n */\nDUK_LOCAL duk_ret_t duk__set_part_helper(duk_hthread *thr, duk_small_uint_t flags_and_maxnargs) {\n\tduk_double_t d;\n\tduk_int_t parts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_idx_t nargs;\n\tduk_small_uint_t maxnargs = (duk_small_uint_t) (flags_and_maxnargs >> DUK_DATE_FLAG_VALUE_SHIFT);  /* unpack args */\n\tduk_small_uint_t idx_first, idx;\n\tduk_small_uint_t i;\n\n\tnargs = duk_get_top(thr);\n\td = duk__push_this_get_timeval(thr, flags_and_maxnargs);\n\tDUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d));\n\n\tif (DUK_ISFINITE(d)) {\n\t\tduk_bi_date_timeval_to_parts(d, parts, dparts, flags_and_maxnargs);\n\t} else {\n\t\t/* NaN timevalue: we need to coerce the arguments, but\n\t\t * the resulting internal timestamp needs to remain NaN.\n\t\t * This works but is not pretty: parts and dparts will\n\t\t * be partially uninitialized, but we only write to them.\n\t\t */\n\t}\n\n\t/*\n\t *  Determining which datetime components to overwrite based on\n\t *  stack arguments is a bit complicated, but important to factor\n\t *  out from setters themselves for compactness.\n\t *\n\t *  If DUK_DATE_FLAG_TIMESETTER, maxnargs indicates setter type:\n\t *\n\t *   1 -> millisecond\n\t *   2 -> second, [millisecond]\n\t *   3 -> minute, [second], [millisecond]\n\t *   4 -> hour, [minute], [second], [millisecond]\n\t *\n\t *  Else:\n\t *\n\t *   1 -> date\n\t *   2 -> month, [date]\n\t *   3 -> year, [month], [date]\n\t *\n\t *  By comparing nargs and maxnargs (and flags) we know which\n\t *  components to override.  We rely on part index ordering.\n\t */\n\n\tif (flags_and_maxnargs & DUK_DATE_FLAG_TIMESETTER) {\n\t\tDUK_ASSERT(maxnargs >= 1 && maxnargs <= 4);\n\t\tidx_first = DUK_DATE_IDX_MILLISECOND - (maxnargs - 1);\n\t} else {\n\t\tDUK_ASSERT(maxnargs >= 1 && maxnargs <= 3);\n\t\tidx_first = DUK_DATE_IDX_DAY - (maxnargs - 1);\n\t}\n\tDUK_ASSERT_DISABLE(idx_first >= 0);  /* unsigned */\n\tDUK_ASSERT(idx_first < DUK_DATE_IDX_NUM_PARTS);\n\n\tfor (i = 0; i < maxnargs; i++) {\n\t\tif ((duk_idx_t) i >= nargs) {\n\t\t\t/* no argument given -> leave components untouched */\n\t\t\tbreak;\n\t\t}\n\t\tidx = idx_first + i;\n\t\tDUK_ASSERT_DISABLE(idx >= 0);  /* unsigned */\n\t\tDUK_ASSERT(idx < DUK_DATE_IDX_NUM_PARTS);\n\n\t\tif (idx == DUK_DATE_IDX_YEAR && (flags_and_maxnargs & DUK_DATE_FLAG_YEAR_FIXUP)) {\n\t\t\tduk__twodigit_year_fixup(thr, (duk_idx_t) i);\n\t\t}\n\n\t\tdparts[idx] = duk_to_number(thr, (duk_idx_t) i);\n\n\t\tif (idx == DUK_DATE_IDX_DAY) {\n\t\t\t/* Day-of-month is one-based in the API, but zero-based\n\t\t\t * internally, so fix here.  Note that month is zero-based\n\t\t\t * both in the API and internally.\n\t\t\t */\n\t\t\t/* SCANBUILD: complains about use of uninitialized values.\n\t\t\t * The complaint is correct, but operating in undefined\n\t\t\t * values here is intentional in some cases and the caller\n\t\t\t * ignores the results.\n\t\t\t */\n\t\t\tdparts[idx] -= 1.0;\n\t\t}\n\t}\n\n\t/* Leaves new timevalue on stack top and returns 1, which is correct\n\t * for part setters.\n\t */\n\tif (DUK_ISFINITE(d)) {\n\t\treturn duk__set_this_timeval_from_dparts(thr, dparts, flags_and_maxnargs);\n\t} else {\n\t\t/* Internal timevalue is already NaN, so don't touch it. */\n\t\tduk_push_nan(thr);\n\t\treturn 1;\n\t}\n}\n\n/* Apply ToNumber() to specified index; if ToInteger(val) in [0,99], add\n * 1900 and replace value at idx_val.\n */\nDUK_LOCAL void duk__twodigit_year_fixup(duk_hthread *thr, duk_idx_t idx_val) {\n\tduk_double_t d;\n\n\t/* XXX: idx_val would fit into 16 bits, but using duk_small_uint_t\n\t * might not generate better code due to casting.\n\t */\n\n\t/* E5 Sections 15.9.3.1, B.2.4, B.2.5 */\n\tduk_to_number(thr, idx_val);\n\tif (duk_is_nan(thr, idx_val)) {\n\t\treturn;\n\t}\n\tduk_dup(thr, idx_val);\n\tduk_to_int(thr, -1);\n\td = duk_get_number(thr, -1);  /* get as double to handle huge numbers correctly */\n\tif (d >= 0.0 && d <= 99.0) {\n\t\td += 1900.0;\n\t\tduk_push_number(thr, d);\n\t\tduk_replace(thr, idx_val);\n\t}\n\tduk_pop(thr);\n}\n\n/* Set datetime parts from stack arguments, defaulting any missing values.\n * Day-of-week is not set; it is not required when setting the time value.\n */\nDUK_LOCAL void duk__set_parts_from_args(duk_hthread *thr, duk_double_t *dparts, duk_idx_t nargs) {\n\tduk_double_t d;\n\tduk_small_uint_t i;\n\tduk_small_uint_t idx;\n\n\t/* Causes a ToNumber() coercion, but doesn't break coercion order since\n\t * year is coerced first anyway.\n\t */\n\tduk__twodigit_year_fixup(thr, 0);\n\n\t/* There are at most 7 args, but we use 8 here so that also\n\t * DUK_DATE_IDX_WEEKDAY gets initialized (to zero) to avoid the potential\n\t * for any Valgrind gripes later.\n\t */\n\tfor (i = 0; i < 8; i++) {\n\t\t/* Note: rely on index ordering */\n\t\tidx = DUK_DATE_IDX_YEAR + i;\n\t\tif ((duk_idx_t) i < nargs) {\n\t\t\td = duk_to_number(thr, (duk_idx_t) i);\n\t\t\tif (idx == DUK_DATE_IDX_DAY) {\n\t\t\t\t/* Convert day from one-based to zero-based (internal).  This may\n\t\t\t\t * cause the day part to be negative, which is OK.\n\t\t\t\t */\n\t\t\t\td -= 1.0;\n\t\t\t}\n\t\t} else {\n\t\t\t/* All components default to 0 except day-of-month which defaults\n\t\t\t * to 1.  However, because our internal day-of-month is zero-based,\n\t\t\t * it also defaults to zero here.\n\t\t\t */\n\t\t\td = 0.0;\n\t\t}\n\t\tdparts[idx] = d;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"parts from args -> %lf %lf %lf %lf %lf %lf %lf %lf\",\n\t                     (double) dparts[0], (double) dparts[1],\n\t                     (double) dparts[2], (double) dparts[3],\n\t                     (double) dparts[4], (double) dparts[5],\n\t                     (double) dparts[6], (double) dparts[7]));\n}\n\n/*\n *  Indirect magic value lookup for Date methods.\n *\n *  Date methods don't put their control flags into the function magic value\n *  because they wouldn't fit into a LIGHTFUNC's magic field.  Instead, the\n *  magic value is set to an index pointing to the array of control flags\n *  below.\n *\n *  This must be kept in strict sync with genbuiltins.py!\n */\n\nstatic duk_uint16_t duk__date_magics[] = {\n\t/* 0: toString */\n\tDUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME,\n\n\t/* 1: toDateString */\n\tDUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_LOCALTIME,\n\n\t/* 2: toTimeString */\n\tDUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME,\n\n\t/* 3: toLocaleString */\n\tDUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME,\n\n\t/* 4: toLocaleDateString */\n\tDUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME,\n\n\t/* 5: toLocaleTimeString */\n\tDUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME,\n\n\t/* 6: toUTCString */\n\tDUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME,\n\n\t/* 7: toISOString */\n\tDUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_NAN_TO_RANGE_ERROR + DUK_DATE_FLAG_SEP_T,\n\n\t/* 8: getFullYear */\n\tDUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 9: getUTCFullYear */\n\t0 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 10: getMonth */\n\tDUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 11: getUTCMonth */\n\t0 + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 12: getDate */\n\tDUK_DATE_FLAG_ONEBASED + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 13: getUTCDate */\n\tDUK_DATE_FLAG_ONEBASED + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 14: getDay */\n\tDUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 15: getUTCDay */\n\t0 + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 16: getHours */\n\tDUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 17: getUTCHours */\n\t0 + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 18: getMinutes */\n\tDUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 19: getUTCMinutes */\n\t0 + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 20: getSeconds */\n\tDUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 21: getUTCSeconds */\n\t0 + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 22: getMilliseconds */\n\tDUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 23: getUTCMilliseconds */\n\t0 + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 24: setMilliseconds */\n\tDUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 25: setUTCMilliseconds */\n\tDUK_DATE_FLAG_TIMESETTER + (1 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 26: setSeconds */\n\tDUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 27: setUTCSeconds */\n\tDUK_DATE_FLAG_TIMESETTER + (2 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 28: setMinutes */\n\tDUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 29: setUTCMinutes */\n\tDUK_DATE_FLAG_TIMESETTER + (3 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 30: setHours */\n\tDUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (4 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 31: setUTCHours */\n\tDUK_DATE_FLAG_TIMESETTER + (4 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 32: setDate */\n\tDUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 33: setUTCDate */\n\t0 + (1 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 34: setMonth */\n\tDUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 35: setUTCMonth */\n\t0 + (2 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 36: setFullYear */\n\tDUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 37: setUTCFullYear */\n\tDUK_DATE_FLAG_NAN_TO_ZERO + (3 << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 38: getYear */\n\tDUK_DATE_FLAG_LOCALTIME + DUK_DATE_FLAG_SUB1900 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT),\n\n\t/* 39: setYear */\n\tDUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_YEAR_FIXUP + (3 << DUK_DATE_FLAG_VALUE_SHIFT),\n};\n\nDUK_LOCAL duk_small_uint_t duk__date_get_indirect_magic(duk_hthread *thr) {\n\tduk_small_uint_t magicidx = (duk_small_uint_t) duk_get_current_magic(thr);\n\tDUK_ASSERT(magicidx < (duk_small_int_t) (sizeof(duk__date_magics) / sizeof(duk_uint16_t)));\n\treturn (duk_small_uint_t) duk__date_magics[magicidx];\n}\n\n#if defined(DUK_USE_DATE_BUILTIN)\n/*\n *  Constructor calls\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_date_constructor(duk_hthread *thr) {\n\tduk_idx_t nargs = duk_get_top(thr);\n\tduk_bool_t is_cons = duk_is_constructor_call(thr);\n\tduk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_double_t d;\n\n\tDUK_DDD(DUK_DDDPRINT(\"Date constructor, nargs=%ld, is_cons=%ld\", (long) nargs, (long) is_cons));\n\n\t(void) duk_push_object_helper(thr,\n\t                              DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t                              DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATE),\n\t                              DUK_BIDX_DATE_PROTOTYPE);\n\n\t/* Unlike most built-ins, the internal [[PrimitiveValue]] of a Date\n\t * is mutable.\n\t */\n\n\tif (nargs == 0 || !is_cons) {\n\t\td = duk__timeclip(duk_time_get_ecmascript_time_nofrac(thr));\n\t\tduk_push_number(thr, d);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W);\n\t\tif (!is_cons) {\n\t\t\t/* called as a normal function: return new Date().toString() */\n\t\t\tduk_to_string(thr, -1);\n\t\t}\n\t\treturn 1;\n\t} else if (nargs == 1) {\n\t\tconst char *str;\n\t\tduk_to_primitive(thr, 0, DUK_HINT_NONE);\n\t\tstr = duk_get_string_notsymbol(thr, 0);\n\t\tif (str) {\n\t\t\tduk__parse_string(thr, str);\n\t\t\tduk_replace(thr, 0);  /* may be NaN */\n\t\t}\n\t\td = duk__timeclip(duk_to_number(thr, 0));  /* symbols fail here */\n\t\tduk_push_number(thr, d);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W);\n\t\treturn 1;\n\t}\n\n\tduk__set_parts_from_args(thr, dparts, nargs);\n\n\t/* Parts are in local time, convert when setting. */\n\n\t(void) duk__set_this_timeval_from_dparts(thr, dparts, DUK_DATE_FLAG_LOCALTIME /*flags*/);  /* -> [ ... this timeval ] */\n\tduk_pop(thr);  /* -> [ ... this ] */\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_date_constructor_parse(duk_hthread *thr) {\n\treturn duk__parse_string(thr, duk_to_string(thr, 0));\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_date_constructor_utc(duk_hthread *thr) {\n\tduk_idx_t nargs = duk_get_top(thr);\n\tduk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_double_t d;\n\n\t/* Behavior for nargs < 2 is implementation dependent: currently we'll\n\t * set a NaN time value (matching V8 behavior) in this case.\n\t */\n\n\tif (nargs < 2) {\n\t\tduk_push_nan(thr);\n\t} else {\n\t\tduk__set_parts_from_args(thr, dparts, nargs);\n\t\td = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/);\n\t\tduk_push_number(thr, d);\n\t}\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_date_constructor_now(duk_hthread *thr) {\n\tduk_double_t d;\n\n\td = duk_time_get_ecmascript_time_nofrac(thr);\n\tDUK_ASSERT(duk__timeclip(d) == d);  /* TimeClip() should never be necessary */\n\tduk_push_number(thr, d);\n\treturn 1;\n}\n\n/*\n *  String/JSON conversions\n *\n *  Human readable conversions are now basically ISO 8601 with a space\n *  (instead of 'T') as the date/time separator.  This is a good baseline\n *  and is platform independent.\n *\n *  A shared native helper to provide many conversions.  Magic value contains\n *  a set of flags.  The helper provides:\n *\n *    toString()\n *    toDateString()\n *    toTimeString()\n *    toLocaleString()\n *    toLocaleDateString()\n *    toLocaleTimeString()\n *    toUTCString()\n *    toISOString()\n *\n *  Notes:\n *\n *    - Date.prototype.toGMTString() and Date.prototype.toUTCString() are\n *      required to be the same Ecmascript function object (!), so it is\n *      omitted from here.\n *\n *    - Date.prototype.toUTCString(): E5.1 specification does not require a\n *      specific format, but result should be human readable.  The\n *      specification suggests using ISO 8601 format with a space (instead\n *      of 'T') separator if a more human readable format is not available.\n *\n *    - Date.prototype.toISOString(): unlike other conversion functions,\n *      toISOString() requires a RangeError for invalid date values.\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_hthread *thr) {\n\tduk_small_uint_t flags = duk__date_get_indirect_magic(thr);\n\treturn duk__to_string_helper(thr, flags);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_date_prototype_value_of(duk_hthread *thr) {\n\t/* This native function is also used for Date.prototype.getTime()\n\t * as their behavior is identical.\n\t */\n\n\tduk_double_t d = duk__push_this_get_timeval(thr, 0 /*flags*/);  /* -> [ this ] */\n\tDUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d));\n\tduk_push_number(thr, d);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_date_prototype_to_json(duk_hthread *thr) {\n\t/* Note: toJSON() is a generic function which works even if 'this'\n\t * is not a Date.  The sole argument is ignored.\n\t */\n\n\tduk_push_this(thr);\n\tduk_to_object(thr, -1);\n\n\tduk_dup_top(thr);\n\tduk_to_primitive(thr, -1, DUK_HINT_NUMBER);\n\tif (duk_is_number(thr, -1)) {\n\t\tduk_double_t d = duk_get_number(thr, -1);\n\t\tif (!DUK_ISFINITE(d)) {\n\t\t\tduk_push_null(thr);\n\t\t\treturn 1;\n\t\t}\n\t}\n\tduk_pop(thr);\n\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_ISO_STRING);\n\tduk_dup_m2(thr);  /* -> [ O toIsoString O ] */\n\tduk_call_method(thr, 0);\n\treturn 1;\n}\n\n/*\n *  Getters.\n *\n *  Implementing getters is quite easy.  The internal time value is either\n *  NaN, or represents milliseconds (without fractions) from Jan 1, 1970.\n *  The internal time value can be converted to integer parts, and each\n *  part will be normalized and will fit into a 32-bit signed integer.\n *\n *  A shared native helper to provide all getters.  Magic value contains\n *  a set of flags and also packs the date component index argument.  The\n *  helper provides:\n *\n *    getFullYear()\n *    getUTCFullYear()\n *    getMonth()\n *    getUTCMonth()\n *    getDate()\n *    getUTCDate()\n *    getDay()\n *    getUTCDay()\n *    getHours()\n *    getUTCHours()\n *    getMinutes()\n *    getUTCMinutes()\n *    getSeconds()\n *    getUTCSeconds()\n *    getMilliseconds()\n *    getUTCMilliseconds()\n *    getYear()\n *\n *  Notes:\n *\n *    - Date.prototype.getDate(): 'date' means day-of-month, and is\n *      zero-based in internal calculations but public API expects it to\n *      be one-based.\n *\n *    - Date.prototype.getTime() and Date.prototype.valueOf() have identical\n *      behavior.  They have separate function objects, but share the same C\n *      function (duk_bi_date_prototype_value_of).\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_shared(duk_hthread *thr) {\n\tduk_small_uint_t flags_and_idx = duk__date_get_indirect_magic(thr);\n\treturn duk__get_part_helper(thr, flags_and_idx);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_hthread *thr) {\n\t/*\n\t *  Return (t - LocalTime(t)) in minutes:\n\t *\n\t *    t - LocalTime(t) = t - (t + LocalTZA + DaylightSavingTA(t))\n\t *                     = -(LocalTZA + DaylightSavingTA(t))\n\t *\n\t *  where DaylightSavingTA() is checked for time 't'.\n\t *\n\t *  Note that the sign of the result is opposite to common usage,\n\t *  e.g. for EE(S)T which normally is +2h or +3h from UTC, this\n\t *  function returns -120 or -180.\n\t *\n\t */\n\n\tduk_double_t d;\n\tduk_int_t tzoffset;\n\n\t/* Note: DST adjustment is determined using UTC time. */\n\td = duk__push_this_get_timeval(thr, 0 /*flags*/);\n\tDUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d));\n\tif (DUK_ISNAN(d)) {\n\t\tduk_push_nan(thr);\n\t} else {\n\t\tDUK_ASSERT(DUK_ISFINITE(d));\n\t\ttzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d);\n\t\tduk_push_int(thr, -tzoffset / 60);\n\t}\n\treturn 1;\n}\n\n/*\n *  Setters.\n *\n *  Setters are a bit more complicated than getters.  Component setters\n *  break down the current time value into its (normalized) component\n *  parts, replace one or more components with -unnormalized- new values,\n *  and the components are then converted back into a time value.  As an\n *  example of using unnormalized values:\n *\n *    var d = new Date(1234567890);\n *\n *  is equivalent to:\n *\n *    var d = new Date(0);\n *    d.setUTCMilliseconds(1234567890);\n *\n *  A shared native helper to provide almost all setters.  Magic value\n *  contains a set of flags and also packs the \"maxnargs\" argument.  The\n *  helper provides:\n *\n *    setMilliseconds()\n *    setUTCMilliseconds()\n *    setSeconds()\n *    setUTCSeconds()\n *    setMinutes()\n *    setUTCMinutes()\n *    setHours()\n *    setUTCHours()\n *    setDate()\n *    setUTCDate()\n *    setMonth()\n *    setUTCMonth()\n *    setFullYear()\n *    setUTCFullYear()\n *    setYear()\n *\n *  Notes:\n *\n *    - Date.prototype.setYear() (Section B addition): special year check\n *      is omitted.  NaN / Infinity will just flow through and ultimately\n *      result in a NaN internal time value.\n *\n *    - Date.prototype.setYear() does not have optional arguments for\n *      setting month and day-in-month (like setFullYear()), but we indicate\n *      'maxnargs' to be 3 to get the year written to the correct component\n *      index in duk__set_part_helper().  The function has nargs == 1, so only\n *      the year will be set regardless of actual argument count.\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_shared(duk_hthread *thr) {\n\tduk_small_uint_t flags_and_maxnargs = duk__date_get_indirect_magic(thr);\n\treturn duk__set_part_helper(thr, flags_and_maxnargs);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_time(duk_hthread *thr) {\n\tduk_double_t d;\n\n\t(void) duk__push_this_get_timeval(thr, 0 /*flags*/); /* -> [ timeval this ] */\n\td = duk__timeclip(duk_to_number(thr, 0));\n\tduk_push_number(thr, d);\n\tduk_dup_top(thr);\n\tduk_put_prop_stridx_short(thr, -3, DUK_STRIDX_INT_VALUE); /* -> [ timeval this timeval ] */\n\n\treturn 1;\n}\n\n#endif  /* DUK_USE_DATE_BUILTIN */\n\n/* automatic undefs */\n#undef DUK__CF_ACCEPT\n#undef DUK__CF_ACCEPT_NUL\n#undef DUK__CF_NEG\n#undef DUK__DPRINT_DPARTS\n#undef DUK__DPRINT_PARTS\n#undef DUK__DPRINT_PARTS_AND_DPARTS\n#undef DUK__LOCAL_TZOFFSET_MAXITER\n#undef DUK__NUM_ISO8601_PARSER_PARTS\n#undef DUK__PACK_RULE\n#undef DUK__PI_DAY\n#undef DUK__PI_HOUR\n#undef DUK__PI_MILLISECOND\n#undef DUK__PI_MINUTE\n#undef DUK__PI_MONTH\n#undef DUK__PI_SECOND\n#undef DUK__PI_TZHOUR\n#undef DUK__PI_TZMINUTE\n#undef DUK__PI_YEAR\n#undef DUK__PM_DAY\n#undef DUK__PM_HOUR\n#undef DUK__PM_MILLISECOND\n#undef DUK__PM_MINUTE\n#undef DUK__PM_MONTH\n#undef DUK__PM_SECOND\n#undef DUK__PM_TZHOUR\n#undef DUK__PM_TZMINUTE\n#undef DUK__PM_YEAR\n#undef DUK__RULE_MASK_PART_SEP\n#undef DUK__SI_COLON\n#undef DUK__SI_MINUS\n#undef DUK__SI_NUL\n#undef DUK__SI_PERIOD\n#undef DUK__SI_PLUS\n#undef DUK__SI_SPACE\n#undef DUK__SI_T\n#undef DUK__SI_Z\n#undef DUK__SM_COLON\n#undef DUK__SM_MINUS\n#undef DUK__SM_NUL\n#undef DUK__SM_PERIOD\n#undef DUK__SM_PLUS\n#undef DUK__SM_SPACE\n#undef DUK__SM_T\n#undef DUK__SM_Z\n#undef DUK__UNPACK_RULE\n#undef DUK__WEEKDAY_MOD_ADDER\n#undef DUK__YEAR\n#line 1 \"duk_bi_date_unix.c\"\n/*\n *  Unix-like Date providers\n *\n *  Generally useful Unix / POSIX / ANSI Date providers.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* The necessary #includes are in place in duk_config.h. */\n\n/* Buffer sizes for some UNIX calls.  Larger than strictly necessary\n * to avoid Valgrind errors.\n */\n#define DUK__STRPTIME_BUF_SIZE  64\n#define DUK__STRFTIME_BUF_SIZE  64\n\n#if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY)\n/* Get current Ecmascript time (= UNIX/Posix time, but in milliseconds). */\nDUK_INTERNAL duk_double_t duk_bi_date_get_now_gettimeofday(void) {\n\tstruct timeval tv;\n\tduk_double_t d;\n\n\tif (gettimeofday(&tv, NULL) != 0) {\n\t\tDUK_D(DUK_DPRINT(\"gettimeofday() failed\"));\n\t\treturn 0.0;\n\t}\n\n\t/* As of Duktape 2.2.0 allow fractions. */\n\td = ((duk_double_t) tv.tv_sec) * 1000.0 +\n\t    ((duk_double_t) tv.tv_usec) / 1000.0;\n\n\treturn d;\n}\n#endif  /* DUK_USE_DATE_NOW_GETTIMEOFDAY */\n\n#if defined(DUK_USE_DATE_NOW_TIME)\n/* Not a very good provider: only full seconds are available. */\nDUK_INTERNAL duk_double_t duk_bi_date_get_now_time(void) {\n\ttime_t t;\n\n\tt = time(NULL);\n\tif (t == (time_t) -1) {\n\t\tDUK_D(DUK_DPRINT(\"time() failed\"));\n\t\treturn 0.0;\n\t}\n\treturn ((duk_double_t) t) * 1000.0;\n}\n#endif  /* DUK_USE_DATE_NOW_TIME */\n\n#if defined(DUK_USE_DATE_TZO_GMTIME) || defined(DUK_USE_DATE_TZO_GMTIME_R) || defined(DUK_USE_DATE_TZO_GMTIME_S)\n/* Get local time offset (in seconds) for a certain (UTC) instant 'd'. */\nDUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d) {\n\ttime_t t, t1, t2;\n\tduk_int_t parts[DUK_DATE_IDX_NUM_PARTS];\n\tduk_double_t dparts[DUK_DATE_IDX_NUM_PARTS];\n\tstruct tm tms[2];\n#if defined(DUK_USE_DATE_TZO_GMTIME)\n\tstruct tm *tm_ptr;\n#endif\n\n\t/* For NaN/inf, the return value doesn't matter. */\n\tif (!DUK_ISFINITE(d)) {\n\t\treturn 0;\n\t}\n\n\t/* If not within Ecmascript range, some integer time calculations\n\t * won't work correctly (and some asserts will fail), so bail out\n\t * if so.  This fixes test-bug-date-insane-setyear.js.  There is\n\t * a +/- 24h leeway in this range check to avoid a test262 corner\n\t * case documented in test-bug-date-timeval-edges.js.\n\t */\n\tif (!duk_bi_date_timeval_in_leeway_range(d)) {\n\t\tDUK_DD(DUK_DDPRINT(\"timeval not within valid range, skip tzoffset computation to avoid integer overflows\"));\n\t\treturn 0;\n\t}\n\n\t/*\n\t *  This is a bit tricky to implement portably.  The result depends\n\t *  on the timestamp (specifically, DST depends on the timestamp).\n\t *  If e.g. UNIX APIs are used, they'll have portability issues with\n\t *  very small and very large years.\n\t *\n\t *  Current approach:\n\t *\n\t *  - Stay within portable UNIX limits by using equivalent year mapping.\n\t *    Avoid year 1970 and 2038 as some conversions start to fail, at\n\t *    least on some platforms.  Avoiding 1970 means that there are\n\t *    currently DST discrepancies for 1970.\n\t *\n\t *  - Create a UTC and local time breakdowns from 't'.  Then create\n\t *    a time_t using gmtime() and localtime() and compute the time\n\t *    difference between the two.\n\t *\n\t *  Equivalent year mapping (E5 Section 15.9.1.8):\n\t *\n\t *    If the host environment provides functionality for determining\n\t *    daylight saving time, the implementation of ECMAScript is free\n\t *    to map the year in question to an equivalent year (same\n\t *    leap-year-ness and same starting week day for the year) for which\n\t *    the host environment provides daylight saving time information.\n\t *    The only restriction is that all equivalent years should produce\n\t *    the same result.\n\t *\n\t *  This approach is quite reasonable but not entirely correct, e.g.\n\t *  the specification also states (E5 Section 15.9.1.8):\n\t *\n\t *    The implementation of ECMAScript should not try to determine\n\t *    whether the exact time was subject to daylight saving time, but\n\t *    just whether daylight saving time would have been in effect if\n\t *    the _current daylight saving time algorithm_ had been used at the\n\t *    time.  This avoids complications such as taking into account the\n\t *    years that the locale observed daylight saving time year round.\n\t *\n\t *  Since we rely on the platform APIs for conversions between local\n\t *  time and UTC, we can't guarantee the above.  Rather, if the platform\n\t *  has historical DST rules they will be applied.  This seems to be the\n\t *  general preferred direction in Ecmascript standardization (or at least\n\t *  implementations) anyway, and even the equivalent year mapping should\n\t *  be disabled if the platform is known to handle DST properly for the\n\t *  full Ecmascript range.\n\t *\n\t *  The following has useful discussion and links:\n\t *\n\t *    https://bugzilla.mozilla.org/show_bug.cgi?id=351066\n\t */\n\n\tduk_bi_date_timeval_to_parts(d, parts, dparts, DUK_DATE_FLAG_EQUIVYEAR /*flags*/);\n\tDUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= 1970 && parts[DUK_DATE_IDX_YEAR] <= 2038);\n\n\td = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/);\n\tDUK_ASSERT(d >= 0 && d < 2147483648.0 * 1000.0);  /* unsigned 31-bit range */\n\tt = (time_t) (d / 1000.0);\n\tDUK_DDD(DUK_DDDPRINT(\"timeval: %lf -> time_t %ld\", (double) d, (long) t));\n\n\tDUK_MEMZERO((void *) tms, sizeof(struct tm) * 2);\n\n#if defined(DUK_USE_DATE_TZO_GMTIME_R)\n\t(void) gmtime_r(&t, &tms[0]);\n\t(void) localtime_r(&t, &tms[1]);\n#elif defined(DUK_USE_DATE_TZO_GMTIME_S)\n\t(void) gmtime_s(&t, &tms[0]);\n\t(void) localtime_s(&t, &tms[1]);\n#elif defined(DUK_USE_DATE_TZO_GMTIME)\n\ttm_ptr = gmtime(&t);\n\tDUK_MEMCPY((void *) &tms[0], tm_ptr, sizeof(struct tm));\n\ttm_ptr = localtime(&t);\n\tDUK_MEMCPY((void *) &tms[1], tm_ptr, sizeof(struct tm));\n#else\n#error internal error\n#endif\n\tDUK_DDD(DUK_DDDPRINT(\"gmtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld,\"\n\t                     \"wday:%ld,yday:%ld,isdst:%ld}\",\n\t                     (long) tms[0].tm_sec, (long) tms[0].tm_min, (long) tms[0].tm_hour,\n\t                     (long) tms[0].tm_mday, (long) tms[0].tm_mon, (long) tms[0].tm_year,\n\t                     (long) tms[0].tm_wday, (long) tms[0].tm_yday, (long) tms[0].tm_isdst));\n\tDUK_DDD(DUK_DDDPRINT(\"localtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld,\"\n\t                     \"wday:%ld,yday:%ld,isdst:%ld}\",\n\t                     (long) tms[1].tm_sec, (long) tms[1].tm_min, (long) tms[1].tm_hour,\n\t                     (long) tms[1].tm_mday, (long) tms[1].tm_mon, (long) tms[1].tm_year,\n\t                     (long) tms[1].tm_wday, (long) tms[1].tm_yday, (long) tms[1].tm_isdst));\n\n\t/* tm_isdst is both an input and an output to mktime(), use 0 to\n\t * avoid DST handling in mktime():\n\t * - https://github.com/svaarala/duktape/issues/406\n\t * - http://stackoverflow.com/questions/8558919/mktime-and-tm-isdst\n\t */\n\ttms[0].tm_isdst = 0;\n\ttms[1].tm_isdst = 0;\n\tt1 = mktime(&tms[0]);  /* UTC */\n\tt2 = mktime(&tms[1]);  /* local */\n\tif (t1 == (time_t) -1 || t2 == (time_t) -1) {\n\t\t/* This check used to be for (t < 0) but on some platforms\n\t\t * time_t is unsigned and apparently the proper way to detect\n\t\t * an mktime() error return is the cast above.  See e.g.:\n\t\t * http://pubs.opengroup.org/onlinepubs/009695299/functions/mktime.html\n\t\t */\n\t\tgoto mktime_error;\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"t1=%ld (utc), t2=%ld (local)\", (long) t1, (long) t2));\n\n\t/* Compute final offset in seconds, positive if local time ahead of\n\t * UTC (returned value is UTC-to-local offset).\n\t *\n\t * difftime() returns a double, so coercion to int generates quite\n\t * a lot of code.  Direct subtraction is not portable, however.\n\t * XXX: allow direct subtraction on known platforms.\n\t */\n#if 0\n\treturn (duk_int_t) (t2 - t1);\n#endif\n\treturn (duk_int_t) difftime(t2, t1);\n\n mktime_error:\n\t/* XXX: return something more useful, so that caller can throw? */\n\tDUK_D(DUK_DPRINT(\"mktime() failed, d=%lf\", (double) d));\n\treturn 0;\n}\n#endif  /* DUK_USE_DATE_TZO_GMTIME */\n\n#if defined(DUK_USE_DATE_PRS_STRPTIME)\nDUK_INTERNAL duk_bool_t duk_bi_date_parse_string_strptime(duk_hthread *thr, const char *str) {\n\tstruct tm tm;\n\ttime_t t;\n\tchar buf[DUK__STRPTIME_BUF_SIZE];\n\n\t/* Copy to buffer with slack to avoid Valgrind gripes from strptime. */\n\tDUK_ASSERT(str != NULL);\n\tDUK_MEMZERO(buf, sizeof(buf));  /* valgrind whine without this */\n\tDUK_SNPRINTF(buf, sizeof(buf), \"%s\", (const char *) str);\n\tbuf[sizeof(buf) - 1] = (char) 0;\n\n\tDUK_DDD(DUK_DDDPRINT(\"parsing: '%s'\", (const char *) buf));\n\n\tDUK_MEMZERO(&tm, sizeof(tm));\n\tif (strptime((const char *) buf, \"%c\", &tm) != NULL) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"before mktime: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld,\"\n\t\t                     \"wday:%ld,yday:%ld,isdst:%ld}\",\n\t\t                     (long) tm.tm_sec, (long) tm.tm_min, (long) tm.tm_hour,\n\t\t                     (long) tm.tm_mday, (long) tm.tm_mon, (long) tm.tm_year,\n\t\t                     (long) tm.tm_wday, (long) tm.tm_yday, (long) tm.tm_isdst));\n\t\ttm.tm_isdst = -1;  /* negative: dst info not available */\n\n\t\tt = mktime(&tm);\n\t\tDUK_DDD(DUK_DDDPRINT(\"mktime() -> %ld\", (long) t));\n\t\tif (t >= 0) {\n\t\t\tduk_push_number(thr, ((duk_double_t) t) * 1000.0);\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n#endif  /* DUK_USE_DATE_PRS_STRPTIME */\n\n#if defined(DUK_USE_DATE_PRS_GETDATE)\nDUK_INTERNAL duk_bool_t duk_bi_date_parse_string_getdate(duk_hthread *thr, const char *str) {\n\tstruct tm tm;\n\tduk_small_int_t rc;\n\ttime_t t;\n\n\t/* For this to work, DATEMSK must be set, so this is not very\n\t * convenient for an embeddable interpreter.\n\t */\n\n\tDUK_MEMZERO(&tm, sizeof(struct tm));\n\trc = (duk_small_int_t) getdate_r(str, &tm);\n\tDUK_DDD(DUK_DDDPRINT(\"getdate_r() -> %ld\", (long) rc));\n\n\tif (rc == 0) {\n\t\tt = mktime(&tm);\n\t\tDUK_DDD(DUK_DDDPRINT(\"mktime() -> %ld\", (long) t));\n\t\tif (t >= 0) {\n\t\t\tduk_push_number(thr, (duk_double_t) t);\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n#endif  /* DUK_USE_DATE_PRS_GETDATE */\n\n#if defined(DUK_USE_DATE_FMT_STRFTIME)\nDUK_INTERNAL duk_bool_t duk_bi_date_format_parts_strftime(duk_hthread *thr, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags) {\n\tchar buf[DUK__STRFTIME_BUF_SIZE];\n\tstruct tm tm;\n\tconst char *fmt;\n\n\tDUK_UNREF(tzoffset);\n\n\t/* If the platform doesn't support the entire Ecmascript range, we need\n\t * to return 0 so that the caller can fall back to the default formatter.\n\t *\n\t * For now, assume that if time_t is 8 bytes or more, the whole Ecmascript\n\t * range is supported.  For smaller time_t values (4 bytes in practice),\n\t * assumes that the signed 32-bit range is supported.\n\t *\n\t * XXX: detect this more correctly per platform.  The size of time_t is\n\t * probably not an accurate guarantee of strftime() supporting or not\n\t * supporting a large time range (the full Ecmascript range).\n\t */\n\tif (sizeof(time_t) < 8 &&\n\t    (parts[DUK_DATE_IDX_YEAR] < 1970 || parts[DUK_DATE_IDX_YEAR] > 2037)) {\n\t\t/* be paranoid for 32-bit time values (even avoiding negative ones) */\n\t\treturn 0;\n\t}\n\n\tDUK_MEMZERO(&tm, sizeof(tm));\n\ttm.tm_sec = parts[DUK_DATE_IDX_SECOND];\n\ttm.tm_min = parts[DUK_DATE_IDX_MINUTE];\n\ttm.tm_hour = parts[DUK_DATE_IDX_HOUR];\n\ttm.tm_mday = parts[DUK_DATE_IDX_DAY];       /* already one-based */\n\ttm.tm_mon = parts[DUK_DATE_IDX_MONTH] - 1;  /* one-based -> zero-based */\n\ttm.tm_year = parts[DUK_DATE_IDX_YEAR] - 1900;\n\ttm.tm_wday = parts[DUK_DATE_IDX_WEEKDAY];\n\ttm.tm_isdst = 0;\n\n\tDUK_MEMZERO(buf, sizeof(buf));\n\tif ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) {\n\t\tfmt = \"%c\";\n\t} else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) {\n\t\tfmt = \"%x\";\n\t} else {\n\t\tDUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME);\n\t\tfmt = \"%X\";\n\t}\n\t(void) strftime(buf, sizeof(buf) - 1, fmt, &tm);\n\tDUK_ASSERT(buf[sizeof(buf) - 1] == 0);\n\n\tduk_push_string(thr, buf);\n\treturn 1;\n}\n#endif  /* DUK_USE_DATE_FMT_STRFTIME */\n\n#if defined(DUK_USE_GET_MONOTONIC_TIME_CLOCK_GETTIME)\nDUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_clock_gettime(void) {\n\tstruct timespec ts;\n\n\tif (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {\n\t\treturn (duk_double_t) ts.tv_sec * 1000.0 + (duk_double_t) ts.tv_nsec / 1000000.0;\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"clock_gettime(CLOCK_MONOTONIC) failed\"));\n\t\treturn 0.0;\n\t}\n}\n#endif\n\n/* automatic undefs */\n#undef DUK__STRFTIME_BUF_SIZE\n#undef DUK__STRPTIME_BUF_SIZE\n#line 1 \"duk_bi_date_windows.c\"\n/*\n *  Windows Date providers\n *\n *  Platform specific links:\n *\n *    - http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473(v=vs.85).aspx\n */\n\n/* #include duk_internal.h -> already included */\n\n/* The necessary #includes are in place in duk_config.h. */\n\n#if defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS)\n/* Shared Windows helpers. */\nDUK_LOCAL void duk__convert_systime_to_ularge(const SYSTEMTIME *st, ULARGE_INTEGER *res) {\n\tFILETIME ft;\n\tif (SystemTimeToFileTime(st, &ft) == 0) {\n\t\tDUK_D(DUK_DPRINT(\"SystemTimeToFileTime() failed, returning 0\"));\n\t\tres->QuadPart = 0;\n\t} else {\n\t\tres->LowPart = ft.dwLowDateTime;\n\t\tres->HighPart = ft.dwHighDateTime;\n\t}\n}\n\nDUK_LOCAL void duk__convert_filetime_to_ularge(const FILETIME *ft, ULARGE_INTEGER *res) {\n\tres->LowPart = ft->dwLowDateTime;\n\tres->HighPart = ft->dwHighDateTime;\n}\n\nDUK_LOCAL void duk__set_systime_jan1970(SYSTEMTIME *st) {\n\tDUK_MEMZERO((void *) st, sizeof(*st));\n\tst->wYear = 1970;\n\tst->wMonth = 1;\n\tst->wDayOfWeek = 4;  /* not sure whether or not needed; Thursday */\n\tst->wDay = 1;\n\tDUK_ASSERT(st->wHour == 0);\n\tDUK_ASSERT(st->wMinute == 0);\n\tDUK_ASSERT(st->wSecond == 0);\n\tDUK_ASSERT(st->wMilliseconds == 0);\n}\n#endif  /* defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) */\n\n#if defined(DUK_USE_DATE_NOW_WINDOWS)\nDUK_INTERNAL duk_double_t duk_bi_date_get_now_windows(void) {\n\t/* Suggested step-by-step method from documentation of RtlTimeToSecondsSince1970:\n\t * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724928(v=vs.85).aspx\n\t */\n\tSYSTEMTIME st1, st2;\n\tULARGE_INTEGER tmp1, tmp2;\n\n\tGetSystemTime(&st1);\n\tduk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1);\n\n\tduk__set_systime_jan1970(&st2);\n\tduk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2);\n\n\t/* Difference is in 100ns units, convert to milliseconds, keeping\n\t * fractions since Duktape 2.2.0.  This is only theoretical because\n\t * SYSTEMTIME is limited to milliseconds.\n\t */\n\treturn (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0;\n}\n#endif  /* DUK_USE_DATE_NOW_WINDOWS */\n\n#if defined(DUK_USE_DATE_NOW_WINDOWS_SUBMS)\nDUK_INTERNAL duk_double_t duk_bi_date_get_now_windows_subms(void) {\n\t/* Variant of the basic algorithm using GetSystemTimePreciseAsFileTime()\n\t * for more accuracy.\n\t */\n\tFILETIME ft1;\n\tSYSTEMTIME st2;\n\tULARGE_INTEGER tmp1, tmp2;\n\n\tGetSystemTimePreciseAsFileTime(&ft1);\n\tduk__convert_filetime_to_ularge((const FILETIME *) &ft1, &tmp1);\n\n\tduk__set_systime_jan1970(&st2);\n\tduk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2);\n\n\t/* Difference is in 100ns units, convert to milliseconds, keeping\n\t * fractions since Duktape 2.2.0.\n\t */\n\treturn (duk_double_t) ((LONGLONG) tmp1.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000.0;\n}\n#endif  /* DUK_USE_DATE_NOW_WINDOWS */\n\n#if defined(DUK_USE_DATE_TZO_WINDOWS)\nDUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d) {\n\tSYSTEMTIME st1;\n\tSYSTEMTIME st2;\n\tSYSTEMTIME st3;\n\tULARGE_INTEGER tmp1;\n\tULARGE_INTEGER tmp2;\n\tULARGE_INTEGER tmp3;\n\tFILETIME ft1;\n\n\t/* XXX: handling of timestamps outside Windows supported range.\n\t * How does Windows deal with dates before 1600?  Does windows\n\t * support all Ecmascript years (like -200000 and +200000)?\n\t * Should equivalent year mapping be used here too?  If so, use\n\t * a shared helper (currently integrated into timeval-to-parts).\n\t */\n\n\t/* Use the approach described in \"Remarks\" of FileTimeToLocalFileTime:\n\t * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724277(v=vs.85).aspx\n\t */\n\n\tduk__set_systime_jan1970(&st1);\n\tduk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1);\n\ttmp2.QuadPart = (ULONGLONG) (d * 10000.0);  /* millisec -> 100ns units since jan 1, 1970 */\n\ttmp2.QuadPart += tmp1.QuadPart;             /* input 'd' in Windows UTC, 100ns units */\n\n\tft1.dwLowDateTime = tmp2.LowPart;\n\tft1.dwHighDateTime = tmp2.HighPart;\n\tFileTimeToSystemTime((const FILETIME *) &ft1, &st2);\n\tif (SystemTimeToTzSpecificLocalTime((LPTIME_ZONE_INFORMATION) NULL, &st2, &st3) == 0) {\n\t\tDUK_D(DUK_DPRINT(\"SystemTimeToTzSpecificLocalTime() failed, return tzoffset 0\"));\n\t\treturn 0;\n\t}\n\tduk__convert_systime_to_ularge((const SYSTEMTIME *) &st3, &tmp3);\n\n\t/* Positive if local time ahead of UTC. */\n\treturn (duk_int_t) (((LONGLONG) tmp3.QuadPart - (LONGLONG) tmp2.QuadPart) / DUK_I64_CONSTANT(10000000));  /* seconds */\n}\n#endif  /* DUK_USE_DATE_TZO_WINDOWS */\n\n#if defined(DUK_USE_DATE_TZO_WINDOWS_NO_DST)\nDUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_windows_no_dst(duk_double_t d) {\n\tSYSTEMTIME st1;\n\tSYSTEMTIME st2;\n\tFILETIME ft1;\n\tFILETIME ft2;\n\tULARGE_INTEGER tmp1;\n\tULARGE_INTEGER tmp2;\n\n\t/* Do a similar computation to duk_bi_date_get_local_tzoffset_windows\n\t * but without accounting for daylight savings time.  Use this on\n\t * Windows platforms (like Durango) that don't support the\n\t * SystemTimeToTzSpecificLocalTime() call.\n\t */\n\n\t/* current time not needed for this computation */\n\tDUK_UNREF(d);\n\n\tduk__set_systime_jan1970(&st1);\n\tduk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1);\n\n\tft1.dwLowDateTime = tmp1.LowPart;\n\tft1.dwHighDateTime = tmp1.HighPart;\n\tFileTimeToLocalFileTime((const FILETIME *) &ft1, &ft2);\n\n\tFileTimeToSystemTime((const FILETIME *) &ft2, &st2);\n\tduk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2);\n\n\treturn (duk_int_t) (((LONGLONG) tmp2.QuadPart - (LONGLONG) tmp1.QuadPart) / DUK_I64_CONSTANT(10000000));  /* seconds */\n}\n#endif  /* DUK_USE_DATE_TZO_WINDOWS_NO_DST */\n\n#if defined(DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC)\nDUK_INTERNAL duk_double_t duk_bi_date_get_monotonic_time_windows_qpc(void) {\n\tLARGE_INTEGER count, freq;\n\n\t/* There are legacy issues with QueryPerformanceCounter():\n\t * - Potential jumps: https://support.microsoft.com/en-us/help/274323/performance-counter-value-may-unexpectedly-leap-forward\n\t * - Differences between cores (XP): https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#qpc_support_in_windows_versions\n\t *\n\t * We avoid these by enabling QPC by default only for Vista or later.\n\t */\n\n\tif (QueryPerformanceCounter(&count) && QueryPerformanceFrequency(&freq)) {\n\t\t/* XXX: QueryPerformanceFrequency() can be cached */\n\t\treturn (duk_double_t) count.QuadPart / (duk_double_t) freq.QuadPart * 1000.0;\n\t} else {\n\t\t/* MSDN: \"On systems that run Windows XP or later, the function\n\t\t * will always succeed and will thus never return zero.\"\n\t\t * Provide minimal error path just in case user enables this\n\t\t * feature in pre-XP Windows.\n\t\t */\n\t\treturn 0.0;\n\t}\n}\n#endif  /* DUK_USE_GET_MONOTONIC_TIME_WINDOWS_QPC */\n#line 1 \"duk_bi_duktape.c\"\n/*\n *  Duktape built-ins\n *\n *  Size optimization note: it might seem that vararg multipurpose functions\n *  like fin(), enc(), and dec() are not very size optimal, but using a single\n *  user-visible Ecmascript function saves a lot of run-time footprint; each\n *  Function instance takes >100 bytes.  Using a shared native helper and a\n *  'magic' value won't save much if there are multiple Function instances\n *  anyway.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_DUKTAPE_BUILTIN)\n\nDUK_INTERNAL duk_ret_t duk_bi_duktape_object_info(duk_hthread *thr) {\n\tduk_inspect_value(thr, -1);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_duktape_object_act(duk_hthread *thr) {\n\tduk_int_t level;\n\n\tlevel = duk_to_int(thr, 0);\n\tduk_inspect_callstack_entry(thr, level);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_duktape_object_gc(duk_hthread *thr) {\n\tduk_small_uint_t flags;\n\n\tflags = (duk_small_uint_t) duk_get_uint(thr, 0);\n\tduk_heap_mark_and_sweep(thr->heap, flags);\n\n\t/* XXX: Not sure what the best return value would be in the API.\n\t * Return true for now.\n\t */\n\tduk_push_true(thr);\n\treturn 1;\n}\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_duktape_object_fin(duk_hthread *thr) {\n\t(void) duk_require_hobject(thr, 0);\n\tif (duk_get_top(thr) >= 2) {\n\t\t/* Set: currently a finalizer is disabled by setting it to\n\t\t * undefined; this does not remove the property at the moment.\n\t\t * The value could be type checked to be either a function\n\t\t * or something else; if something else, the property could\n\t\t * be deleted.  Must use duk_set_finalizer() to keep\n\t\t * DUK_HOBJECT_FLAG_HAVE_FINALIZER in sync.\n\t\t */\n\t\tduk_set_top(thr, 2);\n\t\tduk_set_finalizer(thr, 0);\n\t\treturn 0;\n\t} else {\n\t\t/* Get. */\n\t\tDUK_ASSERT(duk_get_top(thr) == 1);\n\t\tduk_get_finalizer(thr, 0);\n\t\treturn 1;\n\t}\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\nDUK_INTERNAL duk_ret_t duk_bi_duktape_object_enc(duk_hthread *thr) {\n\tduk_hstring *h_str;\n\n\t/* Vararg function: must be careful to check/require arguments.\n\t * The JSON helpers accept invalid indices and treat them like\n\t * non-existent optional parameters.\n\t */\n\n\th_str = duk_require_hstring(thr, 0);  /* Could reject symbols, but no point: won't match comparisons. */\n\tduk_require_valid_index(thr, 1);\n\n\tif (h_str == DUK_HTHREAD_STRING_HEX(thr)) {\n\t\tduk_set_top(thr, 2);\n\t\tduk_hex_encode(thr, 1);\n\t\tDUK_ASSERT_TOP(thr, 2);\n\t} else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) {\n\t\tduk_set_top(thr, 2);\n\t\tduk_base64_encode(thr, 1);\n\t\tDUK_ASSERT_TOP(thr, 2);\n#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX)\n\t} else if (h_str == DUK_HTHREAD_STRING_JX(thr)) {\n\t\tduk_bi_json_stringify_helper(thr,\n\t\t                             1 /*idx_value*/,\n\t\t                             2 /*idx_replacer*/,\n\t\t                             3 /*idx_space*/,\n\t\t                             DUK_JSON_FLAG_EXT_CUSTOM |\n\t\t                             DUK_JSON_FLAG_ASCII_ONLY |\n\t\t                             DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/);\n#endif\n#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC)\n\t} else if (h_str == DUK_HTHREAD_STRING_JC(thr)) {\n\t\tduk_bi_json_stringify_helper(thr,\n\t\t                             1 /*idx_value*/,\n\t\t                             2 /*idx_replacer*/,\n\t\t                             3 /*idx_space*/,\n\t\t                             DUK_JSON_FLAG_EXT_COMPATIBLE |\n\t\t                             DUK_JSON_FLAG_ASCII_ONLY /*flags*/);\n#endif\n\t} else {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_duktape_object_dec(duk_hthread *thr) {\n\tduk_hstring *h_str;\n\n\t/* Vararg function: must be careful to check/require arguments.\n\t * The JSON helpers accept invalid indices and treat them like\n\t * non-existent optional parameters.\n\t */\n\n\th_str = duk_require_hstring(thr, 0);  /* Could reject symbols, but no point: won't match comparisons */\n\tduk_require_valid_index(thr, 1);\n\n\tif (h_str == DUK_HTHREAD_STRING_HEX(thr)) {\n\t\tduk_set_top(thr, 2);\n\t\tduk_hex_decode(thr, 1);\n\t\tDUK_ASSERT_TOP(thr, 2);\n\t} else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) {\n\t\tduk_set_top(thr, 2);\n\t\tduk_base64_decode(thr, 1);\n\t\tDUK_ASSERT_TOP(thr, 2);\n#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JX)\n\t} else if (h_str == DUK_HTHREAD_STRING_JX(thr)) {\n\t\tduk_bi_json_parse_helper(thr,\n\t\t                         1 /*idx_value*/,\n\t\t                         2 /*idx_replacer*/,\n\t\t                         DUK_JSON_FLAG_EXT_CUSTOM /*flags*/);\n#endif\n#if defined(DUK_USE_JSON_SUPPORT) && defined(DUK_USE_JC)\n\t} else if (h_str == DUK_HTHREAD_STRING_JC(thr)) {\n\t\tduk_bi_json_parse_helper(thr,\n\t\t                         1 /*idx_value*/,\n\t\t                         2 /*idx_replacer*/,\n\t\t                         DUK_JSON_FLAG_EXT_COMPATIBLE /*flags*/);\n#endif\n\t} else {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\treturn 1;\n}\n\n/*\n *  Compact an object\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_duktape_object_compact(duk_hthread *thr) {\n\tDUK_ASSERT_TOP(thr, 1);\n\tduk_compact(thr, 0);\n\treturn 1;  /* return the argument object */\n}\n\n#endif  /* DUK_USE_DUKTAPE_BUILTIN */\n#line 1 \"duk_bi_encoding.c\"\n/*\n *  WHATWG Encoding API built-ins\n *\n *  API specification: https://encoding.spec.whatwg.org/#api\n *  Web IDL: https://www.w3.org/TR/WebIDL/\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Data structures for encoding/decoding\n */\n\ntypedef struct {\n\tduk_uint8_t *out;      /* where to write next byte(s) */\n\tduk_codepoint_t lead;  /* lead surrogate */\n} duk__encode_context;\n\ntypedef struct {\n\t/* UTF-8 decoding state */\n\tduk_codepoint_t codepoint;  /* built up incrementally */\n\tduk_uint8_t upper;          /* max value of next byte (decode error otherwise) */\n\tduk_uint8_t lower;          /* min value of next byte (ditto) */\n\tduk_uint8_t needed;         /* how many more bytes we need */\n\tduk_uint8_t bom_handled;    /* BOM seen or no longer expected */\n\n\t/* Decoder configuration */\n\tduk_uint8_t fatal;\n\tduk_uint8_t ignore_bom;\n} duk__decode_context;\n\n/* The signed duk_codepoint_t type is used to signal a decoded codepoint\n * (>= 0) or various other states using negative values.\n */\n#define DUK__CP_CONTINUE   (-1)  /* continue to next byte, no completed codepoint */\n#define DUK__CP_ERROR      (-2)  /* decoding error */\n#define DUK__CP_RETRY      (-3)  /* decoding error; retry last byte */\n\n/*\n *  Raw helpers for encoding/decoding\n */\n\n/* Emit UTF-8 (= CESU-8) encoded U+FFFD (replacement char), i.e. ef bf bd. */\nDUK_LOCAL duk_uint8_t *duk__utf8_emit_repl(duk_uint8_t *ptr) {\n\t*ptr++ = 0xef;\n\t*ptr++ = 0xbf;\n\t*ptr++ = 0xbd;\n\treturn ptr;\n}\n\nDUK_LOCAL void duk__utf8_decode_init(duk__decode_context *dec_ctx) {\n\t/* (Re)init the decoding state of 'dec_ctx' but leave decoder\n\t * configuration fields untouched.\n\t */\n\tdec_ctx->codepoint = 0x0000L;\n\tdec_ctx->upper = 0xbf;\n\tdec_ctx->lower = 0x80;\n\tdec_ctx->needed = 0;\n\tdec_ctx->bom_handled = 0;\n}\n\nDUK_LOCAL duk_codepoint_t duk__utf8_decode_next(duk__decode_context *dec_ctx, duk_uint8_t x) {\n\t/*\n\t *  UTF-8 algorithm based on the Encoding specification:\n\t *  https://encoding.spec.whatwg.org/#utf-8-decoder\n\t *\n\t *  Two main states: decoding initial byte vs. decoding continuation\n\t *  bytes.  Shortest length encoding is validated by restricting the\n\t *  allowed range of first continuation byte using 'lower' and 'upper'.\n\t */\n\n\tif (dec_ctx->needed == 0) {\n\t\t/* process initial byte */\n\t\tif (x <= 0x7f) {\n\t\t\t/* U+0000-U+007F, 1 byte (ASCII) */\n\t\t\treturn (duk_codepoint_t) x;\n\t\t} else if (x >= 0xc2 && x <= 0xdf) {\n\t\t\t/* U+0080-U+07FF, 2 bytes */\n\t\t\tdec_ctx->needed = 1;\n\t\t\tdec_ctx->codepoint = x & 0x1f;\n\t\t\tDUK_ASSERT(dec_ctx->lower == 0x80);\n\t\t\tDUK_ASSERT(dec_ctx->upper == 0xbf);\n\t\t\treturn DUK__CP_CONTINUE;\n\t\t} else if (x >= 0xe0 && x <= 0xef) {\n\t\t\t/* U+0800-U+FFFF, 3 bytes */\n\t\t\tif (x == 0xe0) {\n\t\t\t\tdec_ctx->lower = 0xa0;\n\t\t\t\tDUK_ASSERT(dec_ctx->upper == 0xbf);\n\t\t\t} else if (x == 0xed) {\n\t\t\t\tDUK_ASSERT(dec_ctx->lower == 0x80);\n\t\t\t\tdec_ctx->upper = 0x9f;\n\t\t\t}\n\t\t\tdec_ctx->needed = 2;\n\t\t\tdec_ctx->codepoint = x & 0x0f;\n\t\t\treturn DUK__CP_CONTINUE;\n\t\t} else if (x >= 0xf0 && x <= 0xf4) {\n\t\t\t/* U+010000-U+10FFFF, 4 bytes */\n\t\t\tif (x == 0xf0) {\n\t\t\t\tdec_ctx->lower = 0x90;\n\t\t\t\tDUK_ASSERT(dec_ctx->upper == 0xbf);\n\t\t\t} else if (x == 0xf4) {\n\t\t\t\tDUK_ASSERT(dec_ctx->lower == 0x80);\n\t\t\t\tdec_ctx->upper = 0x8f;\n\t\t\t}\n\t\t\tdec_ctx->needed = 3;\n\t\t\tdec_ctx->codepoint = x & 0x07;\n\t\t\treturn DUK__CP_CONTINUE;\n\t\t} else {\n\t\t\t/* not a legal initial byte */\n\t\t\treturn DUK__CP_ERROR;\n\t\t}\n\t} else {\n\t\t/* process continuation byte */\n\t\tif (x >= dec_ctx->lower && x <= dec_ctx->upper) {\n\t\t\tdec_ctx->lower = 0x80;\n\t\t\tdec_ctx->upper = 0xbf;\n\t\t\tdec_ctx->codepoint = (dec_ctx->codepoint << 6) | (x & 0x3f);\n\t\t\tif (--dec_ctx->needed > 0) {\n\t\t\t\t/* need more bytes */\n\t\t\t\treturn DUK__CP_CONTINUE;\n\t\t\t} else {\n\t\t\t\t/* got a codepoint */\n\t\t\t\tduk_codepoint_t ret;\n\t\t\t\tDUK_ASSERT(dec_ctx->codepoint <= 0x10ffffL);  /* Decoding rules guarantee. */\n\t\t\t\tret = dec_ctx->codepoint;\n\t\t\t\tdec_ctx->codepoint = 0x0000L;\n\t\t\t\tdec_ctx->needed = 0;\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} else {\n\t\t\t/* We just encountered an illegal UTF-8 continuation byte.  This might\n\t\t\t * be the initial byte of the next character; if we return a plain\n\t\t\t * error status and the decoder is in replacement mode, the character\n\t\t\t * will be masked.  We still need to alert the caller to the error\n\t\t\t * though.\n\t\t\t */\n\t\t\tdec_ctx->codepoint = 0x0000L;\n\t\t\tdec_ctx->needed = 0;\n\t\t\tdec_ctx->lower = 0x80;\n\t\t\tdec_ctx->upper = 0xbf;\n\t\t\treturn DUK__CP_RETRY;\n\t\t}\n\t}\n}\n\n#if defined(DUK_USE_ENCODING_BUILTINS)\nDUK_LOCAL void duk__utf8_encode_char(void *udata, duk_codepoint_t codepoint) {\n\tduk__encode_context *enc_ctx;\n\n\tDUK_ASSERT(codepoint >= 0);\n\tenc_ctx = (duk__encode_context *) udata;\n\tDUK_ASSERT(enc_ctx != NULL);\n\n#if !defined(DUK_USE_PREFER_SIZE)\n\tif (codepoint <= 0x7f && enc_ctx->lead == 0x0000L) {\n\t\t/* Fast path for ASCII. */\n\t\t*enc_ctx->out++ = (duk_uint8_t) codepoint;\n\t\treturn;\n\t}\n#endif\n\n\tif (DUK_UNLIKELY(codepoint > 0x10ffffL)) {\n\t\t/* cannot legally encode in UTF-8 */\n\t\tcodepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;\n\t} else if (codepoint >= 0xd800L && codepoint <= 0xdfffL) {\n\t\tif (codepoint <= 0xdbffL) {\n\t\t\t/* high surrogate */\n\t\t\tduk_codepoint_t prev_lead = enc_ctx->lead;\n\t\t\tenc_ctx->lead = codepoint;\n\t\t\tif (prev_lead == 0x0000L) {\n\t\t\t\t/* high surrogate, no output */\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\t/* consecutive high surrogates, consider first one unpaired */\n\t\t\t\tcodepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;\n\t\t\t}\n\t\t} else {\n\t\t\t/* low surrogate */\n\t\t\tif (enc_ctx->lead != 0x0000L) {\n\t\t\t\tcodepoint = (duk_codepoint_t) (0x010000L + ((enc_ctx->lead - 0xd800L) << 10) + (codepoint - 0xdc00L));\n\t\t\t\tenc_ctx->lead = 0x0000L;\n\t\t\t} else {\n\t\t\t\t/* unpaired low surrogate */\n\t\t\t\tDUK_ASSERT(enc_ctx->lead == 0x0000L);\n\t\t\t\tcodepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (enc_ctx->lead != 0x0000L) {\n\t\t\t/* unpaired high surrogate: emit replacement character and the input codepoint */\n\t\t\tenc_ctx->lead = 0x0000L;\n\t\t\tenc_ctx->out = duk__utf8_emit_repl(enc_ctx->out);\n\t\t}\n\t}\n\n\t/* Codepoint may be original input, a decoded surrogate pair, or may\n\t * have been replaced with U+FFFD.\n\t */\n\tenc_ctx->out += duk_unicode_encode_xutf8((duk_ucodepoint_t) codepoint, enc_ctx->out);\n}\n#endif  /* DUK_USE_ENCODING_BUILTINS */\n\n/* Shared helper for buffer-to-string using a TextDecoder() compatible UTF-8\n * decoder.\n */\nDUK_LOCAL duk_ret_t duk__decode_helper(duk_hthread *thr, duk__decode_context *dec_ctx) {\n\tconst duk_uint8_t *input;\n\tduk_size_t len = 0;\n\tduk_size_t len_tmp;\n\tduk_bool_t stream = 0;\n\tduk_codepoint_t codepoint;\n\tduk_uint8_t *output;\n\tconst duk_uint8_t *in;\n\tduk_uint8_t *out;\n\n\tDUK_ASSERT(dec_ctx != NULL);\n\n\t/* Careful with input buffer pointer: any side effects involving\n\t * code execution (e.g. getters, coercion calls, and finalizers)\n\t * may cause a resize and invalidate a pointer we've read.  This\n\t * is why the pointer is actually looked up at the last minute.\n\t * Argument validation must still happen first to match WHATWG\n\t * required side effect order.\n\t */\n\n\tif (duk_is_undefined(thr, 0)) {\n\t\tduk_push_fixed_buffer_nozero(thr, 0);\n\t\tduk_replace(thr, 0);\n\t}\n\t(void) duk_require_buffer_data(thr, 0, &len);  /* Need 'len', avoid pointer. */\n\n\tif (duk_check_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED |\n\t                                DUK_TYPE_MASK_NULL |\n\t                                DUK_TYPE_MASK_NONE)) {\n\t\t/* Use defaults, treat missing value like undefined. */\n\t} else {\n\t\tduk_require_type_mask(thr, 1, DUK_TYPE_MASK_UNDEFINED |\n\t                                      DUK_TYPE_MASK_NULL |\n\t                                      DUK_TYPE_MASK_LIGHTFUNC |\n\t                                      DUK_TYPE_MASK_BUFFER |\n\t\t                              DUK_TYPE_MASK_OBJECT);\n\t\tif (duk_get_prop_string(thr, 1, \"stream\")) {\n\t\t\tstream = duk_to_boolean(thr, -1);\n\t\t}\n\t}\n\n\t/* Allowance is 3*len in the general case because all bytes may potentially\n\t * become U+FFFD.  If the first byte completes a non-BMP codepoint it will\n\t * decode to a CESU-8 surrogate pair (6 bytes) so we allow 3 extra bytes to\n\t * compensate: (1*3)+3 = 6.  Non-BMP codepoints are safe otherwise because\n\t * the 4->6 expansion is well under the 3x allowance.\n\t *\n\t * XXX: As with TextEncoder, need a better buffer allocation strategy here.\n\t */\n\tif (len >= (DUK_HBUFFER_MAX_BYTELEN / 3) - 3) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG);\n\t}\n\toutput = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, 3 + (3 * len));  /* used parts will be always manually written over */\n\n\tinput = (const duk_uint8_t *) duk_get_buffer_data(thr, 0, &len_tmp);\n\tDUK_ASSERT(input != NULL || len == 0);\n\tif (DUK_UNLIKELY(len != len_tmp)) {\n\t\t/* Very unlikely but possible: source buffer was resized by\n\t\t * a side effect when fixed buffer was pushed.  Output buffer\n\t\t * may not be large enough to hold output, so just fail if\n\t\t * length has changed.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"input buffer resized by side effect, fail\"));\n\t\tgoto fail_type;\n\t}\n\n\t/* From this point onwards it's critical that no side effect occur\n\t * which may disturb 'input': finalizer execution, property accesses,\n\t * active coercions, etc.  Even an allocation related mark-and-sweep\n\t * may affect the pointer because it may trigger a pending finalizer.\n\t */\n\n\tin = input;\n\tout = output;\n\twhile (in < input + len) {\n\t\tcodepoint = duk__utf8_decode_next(dec_ctx, *in++);\n\t\tif (codepoint < 0) {\n\t\t\tif (codepoint == DUK__CP_CONTINUE) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* Decoding error with or without retry. */\n\t\t\tDUK_ASSERT(codepoint == DUK__CP_ERROR || codepoint == DUK__CP_RETRY);\n\t\t\tif (codepoint == DUK__CP_RETRY) {\n\t\t\t\t--in;  /* retry last byte */\n\t\t\t}\n\t\t\t/* replacement mode: replace with U+FFFD */\n\t\t\tcodepoint = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;\n\t\t\tif (dec_ctx->fatal) {\n\t\t\t\t/* fatal mode: throw a TypeError */\n\t\t\t\tgoto fail_type;\n\t\t\t}\n\t\t\t/* Continue with 'codepoint', Unicode replacement. */\n\t\t}\n\t\tDUK_ASSERT(codepoint >= 0x0000L && codepoint <= 0x10ffffL);\n\n\t\tif (!dec_ctx->bom_handled) {\n\t\t\tdec_ctx->bom_handled = 1;\n\t\t\tif (codepoint == 0xfeffL && !dec_ctx->ignore_bom) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tout += duk_unicode_encode_cesu8((duk_ucodepoint_t) codepoint, out);\n\t\tDUK_ASSERT(out <= output + (3 + (3 * len)));\n\t}\n\n\tif (!stream) {\n\t\tif (dec_ctx->needed != 0) {\n\t\t\t/* truncated sequence at end of buffer */\n\t\t\tif (dec_ctx->fatal) {\n\t\t\t\tgoto fail_type;\n\t\t\t} else {\n\t\t\t\tout += duk_unicode_encode_cesu8(DUK_UNICODE_CP_REPLACEMENT_CHARACTER, out);\n\t\t\t\tDUK_ASSERT(out <= output + (3 + (3 * len)));\n\t\t\t}\n\t\t}\n\t\tduk__utf8_decode_init(dec_ctx);  /* Initialize decoding state for potential reuse. */\n\t}\n\n\t/* Output buffer is fixed and thus stable even if there had been\n\t * side effects (which there shouldn't be).\n\t */\n\tduk_push_lstring(thr, (const char *) output, (duk_size_t) (out - output));\n\treturn 1;\n\n fail_type:\n\tDUK_ERROR_TYPE(thr, DUK_STR_UTF8_DECODE_FAILED);\n\tDUK_UNREACHABLE();\n}\n\n/*\n *  Built-in bindings\n */\n\n#if defined(DUK_USE_ENCODING_BUILTINS)\nDUK_INTERNAL duk_ret_t duk_bi_textencoder_constructor(duk_hthread *thr) {\n\t/* TextEncoder currently requires no persistent state, so the constructor\n\t * does nothing on purpose.\n\t */\n\n\tduk_require_constructor_call(thr);\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encoding_getter(duk_hthread *thr) {\n\tduk_push_string(thr, \"utf-8\");\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_textencoder_prototype_encode(duk_hthread *thr) {\n\tduk__encode_context enc_ctx;\n\tduk_size_t len;\n\tduk_size_t final_len;\n\tduk_uint8_t *output;\n\n\tDUK_ASSERT_TOP(thr, 1);\n\tif (duk_is_undefined(thr, 0)) {\n\t\tlen = 0;\n\t} else {\n\t\tduk_hstring *h_input;\n\n\t\th_input = duk_to_hstring(thr, 0);\n\t\tDUK_ASSERT(h_input != NULL);\n\n\t\tlen = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_input);\n\t\tif (len >= DUK_HBUFFER_MAX_BYTELEN / 3) {\n\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_RESULT_TOO_LONG);\n\t\t}\n\t}\n\n\t/* Allowance is 3*len because all bytes can potentially be replaced with\n\t * U+FFFD -- which rather inconveniently encodes to 3 bytes in UTF-8.\n\t * Rely on dynamic buffer data pointer stability: no other code has\n\t * access to the data pointer.\n\t *\n\t * XXX: The buffer allocation strategy used here is rather inefficient.\n\t * Maybe switch to a chunk-based strategy, or preprocess the string to\n\t * figure out the space needed ahead of time?\n\t */\n\tDUK_ASSERT(3 * len >= len);\n\toutput = (duk_uint8_t *) duk_push_dynamic_buffer(thr, 3 * len);\n\n\tif (len > 0) {\n\t\tDUK_ASSERT(duk_is_string(thr, 0));  /* True if len > 0. */\n\n\t\t/* XXX: duk_decode_string() is used to process the input\n\t\t * string.  For standard Ecmascript strings, represented\n\t\t * internally as CESU-8, this is fine.  However, behavior\n\t\t * beyond CESU-8 is not very strict: codepoints using an\n\t\t * extended form of UTF-8 are also accepted, and invalid\n\t\t * codepoint sequences (which are allowed in Duktape strings)\n\t\t * are not handled as well as they could (e.g. invalid\n\t\t * continuation bytes may mask following codepoints).\n\t\t * This is how Ecmascript code would also see such strings.\n\t\t * Maybe replace duk_decode_string() with an explicit strict\n\t\t * CESU-8 decoder here?\n\t\t */\n\t\tenc_ctx.lead = 0x0000L;\n\t\tenc_ctx.out = output;\n\t\tduk_decode_string(thr, 0, duk__utf8_encode_char, (void *) &enc_ctx);\n\t\tif (enc_ctx.lead != 0x0000L) {\n\t\t\t/* unpaired high surrogate at end of string */\n\t\t\tenc_ctx.out = duk__utf8_emit_repl(enc_ctx.out);\n\t\t\tDUK_ASSERT(enc_ctx.out <= output + (3 * len));\n\t\t}\n\n\t\t/* The output buffer is usually very much oversized, so shrink it to\n\t\t * actually needed size.  Pointer stability assumed up to this point.\n\t\t */\n\t\tDUK_ASSERT_TOP(thr, 2);\n\t\tDUK_ASSERT(output == (duk_uint8_t *) duk_get_buffer_data(thr, -1, NULL));\n\n\t\tfinal_len = (duk_size_t) (enc_ctx.out - output);\n\t\tduk_resize_buffer(thr, -1, final_len);\n\t\t/* 'output' and 'enc_ctx.out' are potentially invalidated by the resize. */\n\t} else {\n\t\tfinal_len = 0;\n\t}\n\n\t/* Standard WHATWG output is a Uint8Array.  Here the Uint8Array will\n\t * be backed by a dynamic buffer which differs from e.g. Uint8Arrays\n\t * created as 'new Uint8Array(N)'.  Ecmascript code won't see the\n\t * difference but C code will.  When bufferobjects are not supported,\n\t * returns a plain dynamic buffer.\n\t */\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\tduk_push_buffer_object(thr, -1, 0, final_len, DUK_BUFOBJ_UINT8ARRAY);\n#endif\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_textdecoder_constructor(duk_hthread *thr) {\n\tduk__decode_context *dec_ctx;\n\tduk_bool_t fatal = 0;\n\tduk_bool_t ignore_bom = 0;\n\n\tDUK_ASSERT_TOP(thr, 2);\n\tduk_require_constructor_call(thr);\n\tif (!duk_is_undefined(thr, 0)) {\n\t\t/* XXX: For now ignore 'label' (encoding identifier). */\n\t\tduk_to_string(thr, 0);\n\t}\n\tif (!duk_is_null_or_undefined(thr, 1)) {\n\t\tif (duk_get_prop_string(thr, 1, \"fatal\")) {\n\t\t\tfatal = duk_to_boolean(thr, -1);\n\t\t}\n\t\tif (duk_get_prop_string(thr, 1, \"ignoreBOM\")) {\n\t\t\tignore_bom = duk_to_boolean(thr, -1);\n\t\t}\n\t}\n\n\tduk_push_this(thr);\n\n\t/* The decode context is not assumed to be zeroed; all fields are\n\t * initialized explicitly.\n\t */\n\tdec_ctx = (duk__decode_context *) duk_push_fixed_buffer(thr, sizeof(duk__decode_context));\n\tdec_ctx->fatal = (duk_uint8_t) fatal;\n\tdec_ctx->ignore_bom = (duk_uint8_t) ignore_bom;\n\tduk__utf8_decode_init(dec_ctx);  /* Initializes remaining fields. */\n\n\tduk_put_prop_string(thr, -2, DUK_INTERNAL_SYMBOL(\"Context\"));\n\treturn 0;\n}\n\n/* Get TextDecoder context from 'this'; leaves garbage on stack. */\nDUK_LOCAL duk__decode_context *duk__get_textdecoder_context(duk_hthread *thr) {\n\tduk__decode_context *dec_ctx;\n\tduk_push_this(thr);\n\tduk_get_prop_string(thr, -1, DUK_INTERNAL_SYMBOL(\"Context\"));\n\tdec_ctx = (duk__decode_context *) duk_require_buffer(thr, -1, NULL);\n\tDUK_ASSERT(dec_ctx != NULL);\n\treturn dec_ctx;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_shared_getter(duk_hthread *thr) {\n\tduk__decode_context *dec_ctx;\n\tduk_int_t magic;\n\n\tdec_ctx = duk__get_textdecoder_context(thr);\n\tmagic = duk_get_current_magic(thr);\n\tswitch (magic) {\n\tcase 0:\n\t\t/* Encoding is now fixed, so _Context lookup is only needed to\n\t\t * validate the 'this' binding (TypeError if not TextDecoder-like).\n\t\t */\n\t\tduk_push_string(thr, \"utf-8\");\n\t\tbreak;\n\tcase 1:\n\t\tduk_push_boolean(thr, dec_ctx->fatal);\n\t\tbreak;\n\tdefault:\n\t\tduk_push_boolean(thr, dec_ctx->ignore_bom);\n\t\tbreak;\n\t}\n\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_textdecoder_prototype_decode(duk_hthread *thr) {\n\tduk__decode_context *dec_ctx;\n\n\tdec_ctx = duk__get_textdecoder_context(thr);\n\treturn duk__decode_helper(thr, dec_ctx);\n}\n#endif  /* DUK_USE_ENCODING_BUILTINS */\n\n/*\n *  Internal helper for Node.js Buffer\n */\n\n/* Internal helper used for Node.js Buffer .toString().  Value stack convention\n * is currently odd: it mimics TextDecoder .decode() so that argument must be at\n * index 0, and decode options (not present for Buffer) at index 1.  Return value\n * is a Duktape/C function return value.\n */\nDUK_INTERNAL duk_ret_t duk_textdecoder_decode_utf8_nodejs(duk_hthread *thr) {\n\tduk__decode_context dec_ctx;\n\n\tdec_ctx.fatal = 0;  /* use replacement chars */\n\tdec_ctx.ignore_bom = 1;  /* ignore BOMs (matches Node.js Buffer .toString()) */\n\tduk__utf8_decode_init(&dec_ctx);\n\n\treturn duk__decode_helper(thr, &dec_ctx);\n}\n\n/* automatic undefs */\n#undef DUK__CP_CONTINUE\n#undef DUK__CP_ERROR\n#undef DUK__CP_RETRY\n#line 1 \"duk_bi_error.c\"\n/*\n *  Error built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_INTERNAL duk_ret_t duk_bi_error_constructor_shared(duk_hthread *thr) {\n\t/* Behavior for constructor and non-constructor call is\n\t * the same except for augmenting the created error.  When\n\t * called as a constructor, the caller (duk_new()) will handle\n\t * augmentation; when called as normal function, we need to do\n\t * it here.\n\t */\n\n\tduk_small_int_t bidx_prototype = duk_get_current_magic(thr);\n\n\t/* same for both error and each subclass like TypeError */\n\tduk_uint_t flags_and_class = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                             DUK_HOBJECT_FLAG_FASTREFS |\n\t                             DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR);\n\n\t(void) duk_push_object_helper(thr, flags_and_class, bidx_prototype);\n\n\t/* If message is undefined, the own property 'message' is not set at\n\t * all to save property space.  An empty message is inherited anyway.\n\t */\n\tif (!duk_is_undefined(thr, 0)) {\n\t\tduk_to_string(thr, 0);\n\t\tduk_dup_0(thr);  /* [ message error message ] */\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC);\n\t}\n\n\t/* Augment the error if called as a normal function.  __FILE__ and __LINE__\n\t * are not desirable in this case.\n\t */\n\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\tif (!duk_is_constructor_call(thr)) {\n\t\tduk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE);\n\t}\n#endif\n\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_to_string(duk_hthread *thr) {\n\t/* XXX: optimize with more direct internal access */\n\n\tduk_push_this(thr);\n\t(void) duk_require_hobject_promote_mask(thr, -1, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\n\t/* [ ... this ] */\n\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME);\n\tif (duk_is_undefined(thr, -1)) {\n\t\tduk_pop(thr);\n\t\tduk_push_string(thr, \"Error\");\n\t} else {\n\t\tduk_to_string(thr, -1);\n\t}\n\n\t/* [ ... this name ] */\n\n\t/* XXX: Are steps 6 and 7 in E5 Section 15.11.4.4 duplicated by\n\t * accident or are they actually needed?  The first ToString()\n\t * could conceivably return 'undefined'.\n\t */\n\tduk_get_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE);\n\tif (duk_is_undefined(thr, -1)) {\n\t\tduk_pop(thr);\n\t\tduk_push_hstring_empty(thr);\n\t} else {\n\t\tduk_to_string(thr, -1);\n\t}\n\n\t/* [ ... this name message ] */\n\n\tif (duk_get_length(thr, -2) == 0) {\n\t\t/* name is empty -> return message */\n\t\treturn 1;\n\t}\n\tif (duk_get_length(thr, -1) == 0) {\n\t\t/* message is empty -> return name */\n\t\tduk_pop(thr);\n\t\treturn 1;\n\t}\n\tduk_push_string(thr, \": \");\n\tduk_insert(thr, -2);  /* ... name ': ' message */\n\tduk_concat(thr, 3);\n\n\treturn 1;\n}\n\n#if defined(DUK_USE_TRACEBACKS)\n\n/*\n *  Traceback handling\n *\n *  The unified helper decodes the traceback and produces various requested\n *  outputs.  It should be optimized for size, and may leave garbage on stack,\n *  only the topmost return value matters.  For instance, traceback separator\n *  and decoded strings are pushed even when looking for filename only.\n *\n *  NOTE: although _Tracedata is an internal property, user code can currently\n *  write to the array (or replace it with something other than an array).\n *  The code below must tolerate arbitrary _Tracedata.  It can throw errors\n *  etc, but cannot cause a segfault or memory unsafe behavior.\n */\n\n/* constants arbitrary, chosen for small loads */\n#define DUK__OUTPUT_TYPE_TRACEBACK   (-1)\n#define DUK__OUTPUT_TYPE_FILENAME    0\n#define DUK__OUTPUT_TYPE_LINENUMBER  1\n\nDUK_LOCAL duk_ret_t duk__error_getter_helper(duk_hthread *thr, duk_small_int_t output_type) {\n\tduk_idx_t idx_td;\n\tduk_small_int_t i;  /* traceback depth fits into 16 bits */\n\tduk_small_int_t t;  /* stack type fits into 16 bits */\n\tduk_small_int_t count_func = 0;  /* traceback depth ensures fits into 16 bits */\n\tconst char *str_tailcall = \" tailcall\";\n\tconst char *str_strict = \" strict\";\n\tconst char *str_construct = \" construct\";\n\tconst char *str_prevyield = \" preventsyield\";\n\tconst char *str_directeval = \" directeval\";\n\tconst char *str_empty = \"\";\n\n\tDUK_ASSERT_TOP(thr, 0);  /* fixed arg count */\n\n\tduk_push_this(thr);\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TRACEDATA);\n\tidx_td = duk_get_top_index(thr);\n\n\tduk_push_hstring_stridx(thr, DUK_STRIDX_NEWLINE_4SPACE);\n\tduk_push_this(thr);\n\n\t/* [ ... this tracedata sep this ] */\n\n\t/* XXX: skip null filename? */\n\n\tif (duk_check_type(thr, idx_td, DUK_TYPE_OBJECT)) {\n\t\t/* Current tracedata contains 2 entries per callstack entry. */\n\t\tfor (i = 0; ; i += 2) {\n\t\t\tduk_int_t pc;\n\t\t\tduk_uint_t line;\n\t\t\tduk_uint_t flags;\n\t\t\tduk_double_t d;\n\t\t\tconst char *funcname;\n\t\t\tconst char *filename;\n\t\t\tduk_hobject *h_func;\n\t\t\tduk_hstring *h_name;\n\n\t\t\tduk_require_stack(thr, 5);\n\t\t\tduk_get_prop_index(thr, idx_td, (duk_uarridx_t) i);\n\t\t\tduk_get_prop_index(thr, idx_td, (duk_uarridx_t) (i + 1));\n\t\t\td = duk_to_number_m1(thr);\n\t\t\tpc = (duk_int_t) DUK_FMOD(d, DUK_DOUBLE_2TO32);\n\t\t\tflags = (duk_uint_t) DUK_FLOOR(d / DUK_DOUBLE_2TO32);\n\t\t\tt = (duk_small_int_t) duk_get_type(thr, -2);\n\n\t\t\tif (t == DUK_TYPE_OBJECT || t == DUK_TYPE_LIGHTFUNC) {\n\t\t\t\t/*\n\t\t\t\t *  Ecmascript/native function call or lightfunc call\n\t\t\t\t */\n\n\t\t\t\tcount_func++;\n\n\t\t\t\t/* [ ... v1(func) v2(pc+flags) ] */\n\n\t\t\t\t/* These may be systematically omitted by Duktape\n\t\t\t\t * with certain config options, but allow user to\n\t\t\t\t * set them on a case-by-case basis.\n\t\t\t\t */\n\t\t\t\tduk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME);\n\t\t\t\tduk_get_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME);\n\n#if defined(DUK_USE_PC2LINE)\n\t\t\t\tline = (duk_uint_t) duk_hobject_pc2line_query(thr, -4, (duk_uint_fast32_t) pc);\n#else\n\t\t\t\tline = 0;\n#endif\n\n\t\t\t\t/* [ ... v1 v2 name filename ] */\n\n\t\t\t\t/* When looking for .fileName/.lineNumber, blame first\n\t\t\t\t * function which has a .fileName.\n\t\t\t\t */\n\t\t\t\tif (duk_is_string_notsymbol(thr, -1)) {\n\t\t\t\t\tif (output_type == DUK__OUTPUT_TYPE_FILENAME) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t} else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) {\n\t\t\t\t\t\tduk_push_uint(thr, line);\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* XXX: Change 'anon' handling here too, to use empty string for anonymous functions? */\n\t\t\t\t/* XXX: Could be improved by coercing to a readable duk_tval (especially string escaping) */\n\t\t\t\th_name = duk_get_hstring_notsymbol(thr, -2);  /* may be NULL */\n\t\t\t\tfuncname = (h_name == NULL || h_name == DUK_HTHREAD_STRING_EMPTY_STRING(thr)) ?\n\t\t\t\t           \"[anon]\" : (const char *) DUK_HSTRING_GET_DATA(h_name);\n\t\t\t\tfilename = duk_get_string_notsymbol(thr, -1);\n\t\t\t\tfilename = filename ? filename : \"\";\n\t\t\t\tDUK_ASSERT(funcname != NULL);\n\t\t\t\tDUK_ASSERT(filename != NULL);\n\n\t\t\t\th_func = duk_get_hobject(thr, -4);  /* NULL for lightfunc */\n\n\t\t\t\tif (h_func == NULL) {\n\t\t\t\t\tduk_push_sprintf(thr, \"at %s light%s%s%s%s%s\",\n\t\t\t\t\t                 (const char *) funcname,\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));\n\t\t\t\t} else if (DUK_HOBJECT_HAS_NATFUNC(h_func)) {\n\t\t\t\t\tduk_push_sprintf(thr, \"at %s (%s) native%s%s%s%s%s\",\n\t\t\t\t\t                 (const char *) funcname,\n\t\t\t\t\t                 (const char *) filename,\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));\n\t\t\t\t} else {\n\t\t\t\t\tduk_push_sprintf(thr, \"at %s (%s:%lu)%s%s%s%s%s\",\n\t\t\t\t\t                 (const char *) funcname,\n\t\t\t\t\t                 (const char *) filename,\n\t\t\t\t\t                 (unsigned long) line,\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcall : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty),\n\t\t\t\t\t                 (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty));\n\t\t\t\t}\n\t\t\t\tduk_replace(thr, -5);   /* [ ... v1 v2 name filename str ] -> [ ... str v2 name filename ] */\n\t\t\t\tduk_pop_3(thr);         /* -> [ ... str ] */\n\t\t\t} else if (t == DUK_TYPE_STRING) {\n\t\t\t\tconst char *str_file;\n\n\t\t\t\t/*\n\t\t\t\t *  __FILE__ / __LINE__ entry, here 'pc' is line number directly.\n\t\t\t\t *  Sometimes __FILE__ / __LINE__ is reported as the source for\n\t\t\t\t *  the error (fileName, lineNumber), sometimes not.\n\t\t\t\t */\n\n\t\t\t\t/* [ ... v1(filename) v2(line+flags) ] */\n\n\t\t\t\t/* When looking for .fileName/.lineNumber, blame compilation\n\t\t\t\t * or C call site unless flagged not to do so.\n\t\t\t\t */\n\t\t\t\tif (!(flags & DUK_TB_FLAG_NOBLAME_FILELINE)) {\n\t\t\t\t\tif (output_type == DUK__OUTPUT_TYPE_FILENAME) {\n\t\t\t\t\t\tduk_pop(thr);\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t} else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) {\n\t\t\t\t\t\tduk_push_int(thr, pc);\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* Tracedata is trusted but avoid any risk of using a NULL\n\t\t\t\t * for %s format because it has undefined behavior.  Symbols\n\t\t\t\t * don't need to be explicitly rejected as they pose no memory\n\t\t\t\t * safety issues.\n\t\t\t\t */\n\t\t\t\tstr_file = (const char *) duk_get_string(thr, -2);\n\t\t\t\tduk_push_sprintf(thr, \"at [anon] (%s:%ld) internal\",\n\t\t\t\t                 (const char *) (str_file ? str_file : \"null\"), (long) pc);\n\t\t\t\tduk_replace(thr, -3);  /* [ ... v1 v2 str ] -> [ ... str v2 ] */\n\t\t\t\tduk_pop(thr);          /* -> [ ... str ] */\n\t\t\t} else {\n\t\t\t\t/* unknown, ignore */\n\t\t\t\tduk_pop_2(thr);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (count_func >= DUK_USE_TRACEBACK_DEPTH) {\n\t\t\t/* Possibly truncated; there is no explicit truncation\n\t\t\t * marker so this is the best we can do.\n\t\t\t */\n\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_BRACKETED_ELLIPSIS);\n\t\t}\n\t}\n\n\t/* [ ... this tracedata sep this str1 ... strN ] */\n\n\tif (output_type != DUK__OUTPUT_TYPE_TRACEBACK) {\n\t\treturn 0;\n\t} else {\n\t\t/* The 'this' after 'sep' will get ToString() coerced by\n\t\t * duk_join() automatically.  We don't want to do that\n\t\t * coercion when providing .fileName or .lineNumber (GH-254).\n\t\t */\n\t\tduk_join(thr, duk_get_top(thr) - (idx_td + 2) /*count, not including sep*/);\n\t\treturn 1;\n\t}\n}\n\n/* XXX: Output type could be encoded into native function 'magic' value to\n * save space.  For setters the stridx could be encoded into 'magic'.\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) {\n\treturn duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_TRACEBACK);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) {\n\treturn duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_FILENAME);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) {\n\treturn duk__error_getter_helper(thr, DUK__OUTPUT_TYPE_LINENUMBER);\n}\n\n#else  /* DUK_USE_TRACEBACKS */\n\n/*\n *  Traceback handling when tracebacks disabled.\n *\n *  The fileName / lineNumber stubs are now necessary because built-in\n *  data will include the accessor properties in Error.prototype.  If those\n *  are removed for builds without tracebacks, these can also be removed.\n *  'stack' should still be present and produce a ToString() equivalent:\n *  this is useful for user code which prints a stacktrace and expects to\n *  see something useful.  A normal stacktrace also begins with a ToString()\n *  of the error so this makes sense.\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_hthread *thr) {\n\t/* XXX: remove this native function and map 'stack' accessor\n\t * to the toString() implementation directly.\n\t */\n\treturn duk_bi_error_prototype_to_string(thr);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_hthread *thr) {\n\tDUK_UNREF(thr);\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_hthread *thr) {\n\tDUK_UNREF(thr);\n\treturn 0;\n}\n\n#endif  /* DUK_USE_TRACEBACKS */\n\nDUK_LOCAL duk_ret_t duk__error_setter_helper(duk_hthread *thr, duk_small_uint_t stridx_key) {\n\t/* Attempt to write 'stack', 'fileName', 'lineNumber' works as if\n\t * user code called Object.defineProperty() to create an overriding\n\t * own property.  This allows user code to overwrite .fileName etc\n\t * intuitively as e.g. \"err.fileName = 'dummy'\" as one might expect.\n\t * See https://github.com/svaarala/duktape/issues/387.\n\t */\n\n\tDUK_ASSERT_TOP(thr, 1);  /* fixed arg count: value */\n\n\tduk_push_this(thr);\n\tduk_push_hstring_stridx(thr, stridx_key);\n\tduk_dup_0(thr);\n\n\t/* [ ... obj key value ] */\n\n\tDUK_DD(DUK_DDPRINT(\"error setter: %!T %!T %!T\",\n\t                   duk_get_tval(thr, -3), duk_get_tval(thr, -2), duk_get_tval(thr, -1)));\n\n\tduk_def_prop(thr, -3, DUK_DEFPROP_HAVE_VALUE |\n\t                      DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE |\n\t                      DUK_DEFPROP_HAVE_ENUMERABLE | /*not enumerable*/\n\t                      DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE);\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_setter(duk_hthread *thr) {\n\treturn duk__error_setter_helper(thr, DUK_STRIDX_STACK);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_setter(duk_hthread *thr) {\n\treturn duk__error_setter_helper(thr, DUK_STRIDX_FILE_NAME);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_setter(duk_hthread *thr) {\n\treturn duk__error_setter_helper(thr, DUK_STRIDX_LINE_NUMBER);\n}\n\n/* automatic undefs */\n#undef DUK__OUTPUT_TYPE_FILENAME\n#undef DUK__OUTPUT_TYPE_LINENUMBER\n#undef DUK__OUTPUT_TYPE_TRACEBACK\n#line 1 \"duk_bi_function.c\"\n/*\n *  Function built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Needed even when Function built-in is disabled. */\nDUK_INTERNAL duk_ret_t duk_bi_function_prototype(duk_hthread *thr) {\n\t/* ignore arguments, return undefined (E5 Section 15.3.4) */\n\tDUK_UNREF(thr);\n\treturn 0;\n}\n\n#if defined(DUK_USE_FUNCTION_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_function_constructor(duk_hthread *thr) {\n\tduk_hstring *h_sourcecode;\n\tduk_idx_t nargs;\n\tduk_idx_t i;\n\tduk_small_uint_t comp_flags;\n\tduk_hcompfunc *func;\n\tduk_hobject *outer_lex_env;\n\tduk_hobject *outer_var_env;\n\n\t/* normal and constructor calls have identical semantics */\n\n\tnargs = duk_get_top(thr);\n\tfor (i = 0; i < nargs; i++) {\n\t\tduk_to_string(thr, i);  /* Rejects Symbols during coercion. */\n\t}\n\n\tif (nargs == 0) {\n\t\tduk_push_hstring_empty(thr);\n\t\tduk_push_hstring_empty(thr);\n\t} else if (nargs == 1) {\n\t\t/* XXX: cover this with the generic >1 case? */\n\t\tduk_push_hstring_empty(thr);\n\t} else {\n\t\tduk_insert(thr, 0);   /* [ arg1 ... argN-1 body] -> [body arg1 ... argN-1] */\n\t\tduk_push_string(thr, \",\");\n\t\tduk_insert(thr, 1);\n\t\tduk_join(thr, nargs - 1);\n\t}\n\n\t/* [ body formals ], formals is comma separated list that needs to be parsed */\n\n\tDUK_ASSERT_TOP(thr, 2);\n\n\t/* XXX: this placeholder is not always correct, but use for now.\n\t * It will fail in corner cases; see test-dev-func-cons-args.js.\n\t */\n\tduk_push_string(thr, \"function(\");\n\tduk_dup_1(thr);\n\tduk_push_string(thr, \"){\");\n\tduk_dup_0(thr);\n\tduk_push_string(thr, \"}\");\n\tduk_concat(thr, 5);\n\n\t/* [ body formals source ] */\n\n\tDUK_ASSERT_TOP(thr, 3);\n\n\t/* strictness is not inherited, intentional */\n\tcomp_flags = DUK_COMPILE_FUNCEXPR;\n\n\tduk_push_hstring_stridx(thr, DUK_STRIDX_COMPILE);  /* XXX: copy from caller? */  /* XXX: ignored now */\n\th_sourcecode = duk_require_hstring(thr, -2);  /* no symbol check needed; -2 is concat'd code */\n\tduk_js_compile(thr,\n\t               (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode),\n\t               (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode),\n\t               comp_flags);\n\n\t/* Force .name to 'anonymous' (ES2015). */\n\tduk_push_string(thr, \"anonymous\");\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);\n\n\tfunc = (duk_hcompfunc *) duk_known_hobject(thr, -1);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func));\n\tDUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) func));\n\n\t/* [ body formals source template ] */\n\n\t/* only outer_lex_env matters, as functions always get a new\n\t * variable declaration environment.\n\t */\n\n\touter_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\touter_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\n\tduk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 1 /*add_auto_proto*/);\n\n\t/* [ body formals source template closure ] */\n\n\treturn 1;\n}\n#endif  /* DUK_USE_FUNCTION_BUILTIN */\n\n#if defined(DUK_USE_FUNCTION_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_function_prototype_to_string(duk_hthread *thr) {\n\tduk_tval *tv;\n\n\t/*\n\t *  E5 Section 15.3.4.2 places few requirements on the output of\n\t *  this function: the result is implementation dependent, must\n\t *  follow FunctionDeclaration syntax (in particular, must have a\n\t *  name even for anonymous functions or functions with empty name).\n\t *  The output does NOT need to compile into anything useful.\n\t *\n\t *  E6 Section 19.2.3.5 changes the requirements completely: the\n\t *  result must either eval() to a functionally equivalent object\n\t *  OR eval() to a SyntaxError.\n\t *\n\t *  We opt for the SyntaxError approach for now, with a syntax that\n\t *  mimics V8's native function syntax:\n\t *\n\t *      'function cos() { [native code] }'\n\t *\n\t *  but extended with [ecmascript code], [bound code], and\n\t *  [lightfunc code].\n\t */\n\n\tduk_push_this(thr);\n\ttv = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *obj = DUK_TVAL_GET_OBJECT(tv);\n\t\tconst char *func_name;\n\n\t\t/* Function name: missing/undefined is mapped to empty string,\n\t\t * otherwise coerce to string.  No handling for invalid identifier\n\t\t * characters or e.g. '{' in the function name.  This doesn't\n\t\t * really matter as long as a SyntaxError results.  Technically\n\t\t * if the name contained a suitable prefix followed by '//' it\n\t\t * might cause the result to parse without error.\n\t\t */\n\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME);\n\t\tif (duk_is_undefined(thr, -1)) {\n\t\t\tfunc_name = \"\";\n\t\t} else {\n\t\t\tfunc_name = duk_to_string(thr, -1);\n\t\t\tDUK_ASSERT(func_name != NULL);\n\t\t}\n\n\t\tif (DUK_HOBJECT_IS_COMPFUNC(obj)) {\n\t\t\tduk_push_sprintf(thr, \"function %s() { [ecmascript code] }\", (const char *) func_name);\n\t\t} else if (DUK_HOBJECT_IS_NATFUNC(obj)) {\n\t\t\tduk_push_sprintf(thr, \"function %s() { [native code] }\", (const char *) func_name);\n\t\t} else if (DUK_HOBJECT_IS_BOUNDFUNC(obj)) {\n\t\t\tduk_push_sprintf(thr, \"function %s() { [bound code] }\", (const char *) func_name);\n\t\t} else {\n\t\t\tgoto type_error;\n\t\t}\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {\n\t\tduk_push_lightfunc_tostring(thr, tv);\n\t} else {\n\t\tgoto type_error;\n\t}\n\n\treturn 1;\n\n type_error:\n\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n}\n#endif\n\n/* Always present because the native function pointer is needed in call\n * handling.\n */\nDUK_INTERNAL duk_ret_t duk_bi_function_prototype_call(duk_hthread *thr) {\n\t/* .call() is dealt with in call handling by simulating its\n\t * effects so this function is actually never called.\n\t */\n\tDUK_UNREF(thr);\n\treturn DUK_RET_TYPE_ERROR;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_function_prototype_apply(duk_hthread *thr) {\n\t/* Like .call(), never actually called. */\n\tDUK_UNREF(thr);\n\treturn DUK_RET_TYPE_ERROR;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_reflect_apply(duk_hthread *thr) {\n\t/* Like .call(), never actually called. */\n\tDUK_UNREF(thr);\n\treturn DUK_RET_TYPE_ERROR;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_reflect_construct(duk_hthread *thr) {\n\t/* Like .call(), never actually called. */\n\tDUK_UNREF(thr);\n\treturn DUK_RET_TYPE_ERROR;\n}\n\n#if defined(DUK_USE_FUNCTION_BUILTIN)\n/* Create a bound function which points to a target function which may\n * be bound or non-bound.  If the target is bound, the argument lists\n * and 'this' binding of the functions are merged and the resulting\n * function points directly to the non-bound target.\n */\nDUK_INTERNAL duk_ret_t duk_bi_function_prototype_bind(duk_hthread *thr) {\n\tduk_hboundfunc *h_bound;\n\tduk_idx_t nargs;  /* bound args, not counting 'this' binding */\n\tduk_idx_t bound_nargs;\n\tduk_int_t bound_len;\n\tduk_tval *tv_prevbound;\n\tduk_idx_t n_prevbound;\n\tduk_tval *tv_res;\n\tduk_tval *tv_tmp;\n\n\t/* XXX: C API call, e.g. duk_push_bound_function(thr, target_idx, nargs); */\n\n\t/* Vararg function, careful arg handling, e.g. thisArg may not\n\t * be present.\n\t */\n\tnargs = duk_get_top(thr) - 1;  /* actual args, not counting 'this' binding */\n\tif (nargs < 0) {\n\t\tnargs++;\n\t\tduk_push_undefined(thr);\n\t}\n\tDUK_ASSERT(nargs >= 0);\n\n\t/* Limit 'nargs' for bound functions to guarantee arithmetic\n\t * below will never wrap.\n\t */\n\tif (nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) {\n\t\tDUK_DCERROR_RANGE_INVALID_COUNT(thr);\n\t}\n\n\tduk_push_this(thr);\n\tduk_require_callable(thr, -1);\n\n\t/* [ thisArg arg1 ... argN func ]  (thisArg+args == nargs+1 total) */\n\tDUK_ASSERT_TOP(thr, nargs + 2);\n\n\t/* Create bound function object. */\n\th_bound = duk_push_hboundfunc(thr);\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->target));\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&h_bound->this_binding));\n\tDUK_ASSERT(h_bound->args == NULL);\n\tDUK_ASSERT(h_bound->nargs == 0);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_bound) == NULL);\n\n\t/* [ thisArg arg1 ... argN func boundFunc ] */\n\n\t/* If the target is a bound function, argument lists must be\n\t * merged.  The 'this' binding closest to the target function\n\t * wins because in call handling the 'this' gets replaced over\n\t * and over again until we call the non-bound function.\n\t */\n\ttv_prevbound = NULL;\n\tn_prevbound = 0;\n\ttv_tmp = DUK_GET_TVAL_POSIDX(thr, 0);\n\tDUK_TVAL_SET_TVAL(&h_bound->this_binding, tv_tmp);\n\ttv_tmp = DUK_GET_TVAL_NEGIDX(thr, -2);\n\tDUK_TVAL_SET_TVAL(&h_bound->target, tv_tmp);\n\n\tif (DUK_TVAL_IS_OBJECT(tv_tmp)) {\n\t\tduk_hobject *h_target;\n\t\tduk_hobject *bound_proto;\n\n\t\th_target = DUK_TVAL_GET_OBJECT(tv_tmp);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(h_target));\n\n\t\t/* Internal prototype must be copied from the target.\n\t\t * For lightfuncs Function.prototype is used and is already\n\t\t * in place.\n\t\t */\n\t\tbound_proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_target);\n\t\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto);\n\n\t\t/* The 'strict' flag is copied to get the special [[Get]] of E5.1\n\t\t * Section 15.3.5.4 to apply when a 'caller' value is a strict bound\n\t\t * function.  Not sure if this is correct, because the specification\n\t\t * is a bit ambiguous on this point but it would make sense.\n\t\t */\n\t\t/* Strictness is inherited from target. */\n\t\tif (DUK_HOBJECT_HAS_STRICT(h_target)) {\n\t\t\tDUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound);\n\t\t}\n\n\t\tif (DUK_HOBJECT_HAS_BOUNDFUNC(h_target)) {\n\t\t\tduk_hboundfunc *h_boundtarget;\n\n\t\t\th_boundtarget = (duk_hboundfunc *) h_target;\n\n\t\t\t/* The final function should always be non-bound, unless\n\t\t\t * there's a bug in the internals.  Assert for it.\n\t\t\t */\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(&h_boundtarget->target) ||\n\t\t\t           (DUK_TVAL_IS_OBJECT(&h_boundtarget->target) &&\n\t\t\t            DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(&h_boundtarget->target)) &&\n\t\t\t            !DUK_HOBJECT_IS_BOUNDFUNC(DUK_TVAL_GET_OBJECT(&h_boundtarget->target))));\n\n\t\t\tDUK_TVAL_SET_TVAL(&h_bound->target, &h_boundtarget->target);\n\t\t\tDUK_TVAL_SET_TVAL(&h_bound->this_binding, &h_boundtarget->this_binding);\n\n\t\t\ttv_prevbound = h_boundtarget->args;\n\t\t\tn_prevbound = h_boundtarget->nargs;\n\t\t}\n\t} else {\n\t\t/* Lightfuncs are always strict. */\n\t\tduk_hobject *bound_proto;\n\n\t\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_tmp));\n\t\tDUK_HOBJECT_SET_STRICT((duk_hobject *) h_bound);\n\t\tbound_proto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE];\n\t\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) h_bound, bound_proto);\n\t}\n\n\tDUK_TVAL_INCREF(thr, &h_bound->target);  /* old values undefined, no decref needed */\n\tDUK_TVAL_INCREF(thr, &h_bound->this_binding);\n\n\tbound_nargs = n_prevbound + nargs;\n\tif (bound_nargs > (duk_idx_t) DUK_HBOUNDFUNC_MAX_ARGS) {\n\t\tDUK_DCERROR_RANGE_INVALID_COUNT(thr);\n\t}\n\ttv_res = (duk_tval *) DUK_ALLOC_CHECKED(thr, ((duk_size_t) bound_nargs) * sizeof(duk_tval));\n\tDUK_ASSERT(tv_res != NULL);\n\tDUK_ASSERT(h_bound->args == NULL);\n\tDUK_ASSERT(h_bound->nargs == 0);\n\th_bound->args = tv_res;\n\th_bound->nargs = bound_nargs;\n\n\tDUK_ASSERT(n_prevbound >= 0);\n\tduk_copy_tvals_incref(thr, tv_res, tv_prevbound, (duk_size_t) n_prevbound);\n\tDUK_ASSERT(nargs >= 0);\n\tduk_copy_tvals_incref(thr, tv_res + n_prevbound, DUK_GET_TVAL_POSIDX(thr, 1), (duk_size_t) nargs);\n\n\t/* [ thisArg arg1 ... argN func boundFunc ] */\n\n\t/* Bound function 'length' property is interesting.\n\t * For lightfuncs, simply read the virtual property.\n\t */\n\tduk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH);\n\tbound_len = duk_get_int(thr, -1);  /* ES2015: no coercion */\n\tif (bound_len < nargs) {\n\t\tbound_len = 0;\n\t} else {\n\t\tbound_len -= nargs;\n\t}\n\tif (sizeof(duk_int_t) > 4 && bound_len > (duk_int_t) DUK_UINT32_MAX) {\n\t\tbound_len = (duk_int_t) DUK_UINT32_MAX;\n\t}\n\tduk_pop(thr);\n\tDUK_ASSERT(bound_len >= 0);\n\ttv_tmp = thr->valstack_top++;\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv_tmp));\n\tDUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv_tmp));\n\tDUK_TVAL_SET_U32(tv_tmp, (duk_uint32_t) bound_len);  /* in-place update, fastint */\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C);  /* attrs in E6 Section 9.2.4 */\n\n\t/* XXX: could these be virtual? */\n\t/* Caller and arguments must use the same thrower, [[ThrowTypeError]]. */\n\tduk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_CALLER);\n\tduk_xdef_prop_stridx_thrower(thr, -1, DUK_STRIDX_LC_ARGUMENTS);\n\n\t/* Function name and fileName (non-standard). */\n\tduk_push_string(thr, \"bound \");  /* ES2015 19.2.3.2. */\n\tduk_get_prop_stridx(thr, -3, DUK_STRIDX_NAME);\n\tif (!duk_is_string_notsymbol(thr, -1)) {\n\t\t/* ES2015 has requirement to check that .name of target is a string\n\t\t * (also must check for Symbol); if not, targetName should be the\n\t\t * empty string.  ES2015 19.2.3.2.\n\t\t */\n\t\tduk_pop(thr);\n\t\tduk_push_hstring_empty(thr);\n\t}\n\tduk_concat(thr, 2);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);\n#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)\n\tduk_get_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C);\n#endif\n\n\tDUK_DDD(DUK_DDDPRINT(\"created bound function: %!iT\", (duk_tval *) duk_get_tval(thr, -1)));\n\n\treturn 1;\n}\n#endif  /* DUK_USE_FUNCTION_BUILTIN */\n\n/* %NativeFunctionPrototype% .length getter. */\nDUK_INTERNAL duk_ret_t duk_bi_native_function_length(duk_hthread *thr) {\n\tduk_tval *tv;\n\tduk_hnatfunc *h;\n\tduk_int16_t func_nargs;\n\n\ttv = duk_get_borrowed_this_tval(thr);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) {\n\t\t\tgoto fail_type;\n\t\t}\n\t\tfunc_nargs = h->nargs;\n\t\tduk_push_int(thr, func_nargs == DUK_HNATFUNC_NARGS_VARARGS ? 0 : func_nargs);\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {\n\t\tduk_small_uint_t lf_flags;\n\t\tduk_small_uint_t lf_len;\n\n\t\tlf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv);\n\t\tlf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags);\n\t\tduk_push_uint(thr, lf_len);\n\t} else {\n\t\tgoto fail_type;\n\t}\n\treturn 1;\n\n fail_type:\n\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n}\n\n/* %NativeFunctionPrototype% .name getter. */\nDUK_INTERNAL duk_ret_t duk_bi_native_function_name(duk_hthread *thr) {\n\tduk_tval *tv;\n\tduk_hnatfunc *h;\n\n\ttv = duk_get_borrowed_this_tval(thr);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th = (duk_hnatfunc *) DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (!DUK_HOBJECT_IS_NATFUNC((duk_hobject *) h)) {\n\t\t\tgoto fail_type;\n\t\t}\n#if 0\n\t\tduk_push_hnatfunc_name(thr, h);\n#endif\n\t\tduk_push_hstring_empty(thr);\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv)) {\n\t\tduk_push_lightfunc_name(thr, tv);\n\t} else {\n\t\tgoto fail_type;\n\t}\n\treturn 1;\n\n fail_type:\n\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n}\n#line 1 \"duk_bi_global.c\"\n/*\n *  Global object built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Encoding/decoding helpers\n */\n\n/* XXX: Could add fast path (for each transform callback) with direct byte\n * lookups (no shifting) and no explicit check for x < 0x80 before table\n * lookup.\n */\n\n/* Macros for creating and checking bitmasks for character encoding.\n * Bit number is a bit counterintuitive, but minimizes code size.\n */\n#define DUK__MKBITS(a,b,c,d,e,f,g,h)  ((duk_uint8_t) ( \\\n\t((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | \\\n\t((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7) \\\n\t))\n#define DUK__CHECK_BITMASK(table,cp)  ((table)[(cp) >> 3] & (1 << ((cp) & 0x07)))\n\n/* E5.1 Section 15.1.3.3: uriReserved + uriUnescaped + '#' */\nDUK_LOCAL const duk_uint8_t duk__encode_uriunescaped_table[16] = {\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x00-0x0f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x10-0x1f */\n\tDUK__MKBITS(0, 1, 0, 1, 1, 0, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1),  /* 0x20-0x2f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 0, 1, 0, 1),  /* 0x30-0x3f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1),  /* 0x40-0x4f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1),  /* 0x50-0x5f */\n\tDUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1),  /* 0x60-0x6f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0),  /* 0x70-0x7f */\n};\n\n/* E5.1 Section 15.1.3.4: uriUnescaped */\nDUK_LOCAL const duk_uint8_t duk__encode_uricomponent_unescaped_table[16] = {\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x00-0x0f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x10-0x1f */\n\tDUK__MKBITS(0, 1, 0, 0, 0, 0, 0, 1), DUK__MKBITS(1, 1, 1, 0, 0, 1, 1, 0),  /* 0x20-0x2f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0),  /* 0x30-0x3f */\n\tDUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1),  /* 0x40-0x4f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1),  /* 0x50-0x5f */\n\tDUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1),  /* 0x60-0x6f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0),  /* 0x70-0x7f */\n};\n\n/* E5.1 Section 15.1.3.1: uriReserved + '#' */\nDUK_LOCAL const duk_uint8_t duk__decode_uri_reserved_table[16] = {\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x00-0x0f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x10-0x1f */\n\tDUK__MKBITS(0, 0, 0, 1, 1, 0, 1, 0), DUK__MKBITS(0, 0, 0, 1, 1, 0, 0, 1),  /* 0x20-0x2f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 0, 1),  /* 0x30-0x3f */\n\tDUK__MKBITS(1, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x40-0x4f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x50-0x5f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x60-0x6f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x70-0x7f */\n};\n\n/* E5.1 Section 15.1.3.2: empty */\nDUK_LOCAL const duk_uint8_t duk__decode_uri_component_reserved_table[16] = {\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x00-0x0f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x10-0x1f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x20-0x2f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x30-0x3f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x40-0x4f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x50-0x5f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x60-0x6f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x70-0x7f */\n};\n\n#if defined(DUK_USE_SECTION_B)\n/* E5.1 Section B.2.2, step 7. */\nDUK_LOCAL const duk_uint8_t duk__escape_unescaped_table[16] = {\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x00-0x0f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0),  /* 0x10-0x1f */\n\tDUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 1, 1),  /* 0x20-0x2f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0),  /* 0x30-0x3f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1),  /* 0x40-0x4f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1),  /* 0x50-0x5f */\n\tDUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1),  /* 0x60-0x6f */\n\tDUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 0)   /* 0x70-0x7f */\n};\n#endif  /* DUK_USE_SECTION_B */\n\ntypedef struct {\n\tduk_hthread *thr;\n\tduk_hstring *h_str;\n\tduk_bufwriter_ctx bw;\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_start;\n\tconst duk_uint8_t *p_end;\n} duk__transform_context;\n\ntypedef void (*duk__transform_callback)(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp);\n\n/* XXX: refactor and share with other code */\nDUK_LOCAL duk_small_int_t duk__decode_hex_escape(const duk_uint8_t *p, duk_small_int_t n) {\n\tduk_small_int_t ch;\n\tduk_small_int_t t = 0;\n\n\twhile (n > 0) {\n\t\tt = t * 16;\n\t\tch = (duk_small_int_t) duk_hex_dectab[*p++];\n\t\tif (DUK_LIKELY(ch >= 0)) {\n\t\t\tt += ch;\n\t\t} else {\n\t\t\treturn -1;\n\t\t}\n\t\tn--;\n\t}\n\treturn t;\n}\n\nDUK_LOCAL int duk__transform_helper(duk_hthread *thr, duk__transform_callback callback, const void *udata) {\n\tduk__transform_context tfm_ctx_alloc;\n\tduk__transform_context *tfm_ctx = &tfm_ctx_alloc;\n\tduk_codepoint_t cp;\n\n\ttfm_ctx->thr = thr;\n\n\ttfm_ctx->h_str = duk_to_hstring(thr, 0);\n\tDUK_ASSERT(tfm_ctx->h_str != NULL);\n\n\tDUK_BW_INIT_PUSHBUF(thr, &tfm_ctx->bw, DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str));  /* initial size guess */\n\n\ttfm_ctx->p_start = DUK_HSTRING_GET_DATA(tfm_ctx->h_str);\n\ttfm_ctx->p_end = tfm_ctx->p_start + DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str);\n\ttfm_ctx->p = tfm_ctx->p_start;\n\n\twhile (tfm_ctx->p < tfm_ctx->p_end) {\n\t\tcp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end);\n\t\tcallback(tfm_ctx, udata, cp);\n\t}\n\n\tDUK_BW_COMPACT(thr, &tfm_ctx->bw);\n\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe if transform is safe. */\n\treturn 1;\n}\n\nDUK_LOCAL void duk__transform_callback_encode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {\n\tduk_uint8_t xutf8_buf[DUK_UNICODE_MAX_XUTF8_LENGTH];\n\tduk_small_int_t len;\n\tduk_codepoint_t cp1, cp2;\n\tduk_small_int_t i, t;\n\tconst duk_uint8_t *unescaped_table = (const duk_uint8_t *) udata;\n\n\t/* UTF-8 encoded bytes escaped as %xx%xx%xx... -> 3 * nbytes.\n\t * Codepoint range is restricted so this is a slightly too large\n\t * but doesn't matter.\n\t */\n\tDUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 3 * DUK_UNICODE_MAX_XUTF8_LENGTH);\n\n\tif (cp < 0) {\n\t\tgoto uri_error;\n\t} else if ((cp < 0x80L) && DUK__CHECK_BITMASK(unescaped_table, cp)) {\n\t\tDUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp);\n\t\treturn;\n\t} else if (cp >= 0xdc00L && cp <= 0xdfffL) {\n\t\tgoto uri_error;\n\t} else if (cp >= 0xd800L && cp <= 0xdbffL) {\n\t\t/* Needs lookahead */\n\t\tif (duk_unicode_decode_xutf8(tfm_ctx->thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end, (duk_ucodepoint_t *) &cp2) == 0) {\n\t\t\tgoto uri_error;\n\t\t}\n\t\tif (!(cp2 >= 0xdc00L && cp2 <= 0xdfffL)) {\n\t\t\tgoto uri_error;\n\t\t}\n\t\tcp1 = cp;\n\t\tcp = (duk_codepoint_t) (((cp1 - 0xd800L) << 10) + (cp2 - 0xdc00L) + 0x10000L);\n\t} else if (cp > 0x10ffffL) {\n\t\t/* Although we can allow non-BMP characters (they'll decode\n\t\t * back into surrogate pairs), we don't allow extended UTF-8\n\t\t * characters; they would encode to URIs which won't decode\n\t\t * back because of strict UTF-8 checks in URI decoding.\n\t\t * (However, we could just as well allow them here.)\n\t\t */\n\t\tgoto uri_error;\n\t} else {\n\t\t/* Non-BMP characters within valid UTF-8 range: encode as is.\n\t\t * They'll decode back into surrogate pairs if the escaped\n\t\t * output is decoded.\n\t\t */\n\t\t;\n\t}\n\n\tlen = duk_unicode_encode_xutf8((duk_ucodepoint_t) cp, xutf8_buf);\n\tfor (i = 0; i < len; i++) {\n\t\tt = (duk_small_int_t) xutf8_buf[i];\n\t\tDUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr,\n\t\t                      &tfm_ctx->bw,\n\t\t                      DUK_ASC_PERCENT,\n\t\t                      (duk_uint8_t) duk_uc_nybbles[t >> 4],\n                                      (duk_uint8_t) duk_uc_nybbles[t & 0x0f]);\n\t}\n\n\treturn;\n\n uri_error:\n\tDUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT);\n}\n\nDUK_LOCAL void duk__transform_callback_decode_uri(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {\n\tconst duk_uint8_t *reserved_table = (const duk_uint8_t *) udata;\n\tduk_small_uint_t utf8_blen;\n\tduk_codepoint_t min_cp;\n\tduk_small_int_t t;  /* must be signed */\n\tduk_small_uint_t i;\n\n\t/* Maximum write size: XUTF8 path writes max DUK_UNICODE_MAX_XUTF8_LENGTH,\n\t * percent escape path writes max two times CESU-8 encoded BMP length.\n\t */\n\tDUK_BW_ENSURE(tfm_ctx->thr,\n\t              &tfm_ctx->bw,\n\t              (DUK_UNICODE_MAX_XUTF8_LENGTH >= 2 * DUK_UNICODE_MAX_CESU8_BMP_LENGTH ?\n\t              DUK_UNICODE_MAX_XUTF8_LENGTH : DUK_UNICODE_MAX_CESU8_BMP_LENGTH));\n\n\tif (cp == (duk_codepoint_t) '%') {\n\t\tconst duk_uint8_t *p = tfm_ctx->p;\n\t\tduk_size_t left = (duk_size_t) (tfm_ctx->p_end - p);  /* bytes left */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"percent encoding, left=%ld\", (long) left));\n\n\t\tif (left < 2) {\n\t\t\tgoto uri_error;\n\t\t}\n\n\t\tt = duk__decode_hex_escape(p, 2);\n\t\tDUK_DDD(DUK_DDDPRINT(\"first byte: %ld\", (long) t));\n\t\tif (t < 0) {\n\t\t\tgoto uri_error;\n\t\t}\n\n\t\tif (t < 0x80) {\n\t\t\tif (DUK__CHECK_BITMASK(reserved_table, t)) {\n\t\t\t\t/* decode '%xx' to '%xx' if decoded char in reserved set */\n\t\t\t\tDUK_ASSERT(tfm_ctx->p - 1 >= tfm_ctx->p_start);\n\t\t\t\tDUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr,\n\t\t\t\t                      &tfm_ctx->bw,\n\t\t\t\t                      DUK_ASC_PERCENT,\n\t\t\t\t                      p[0],\n\t\t\t\t                      p[1]);\n\t\t\t} else {\n\t\t\t\tDUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) t);\n\t\t\t}\n\t\t\ttfm_ctx->p += 2;\n\t\t\treturn;\n\t\t}\n\n\t\t/* Decode UTF-8 codepoint from a sequence of hex escapes.  The\n\t\t * first byte of the sequence has been decoded to 't'.\n\t\t *\n\t\t * Note that UTF-8 validation must be strict according to the\n\t\t * specification: E5.1 Section 15.1.3, decode algorithm step\n\t\t * 4.d.vii.8.  URIError from non-shortest encodings is also\n\t\t * specifically noted in the spec.\n\t\t */\n\n\t\tDUK_ASSERT(t >= 0x80);\n\t\tif (t < 0xc0) {\n\t\t\t/* continuation byte */\n\t\t\tgoto uri_error;\n\t\t} else if (t < 0xe0) {\n\t\t\t/* 110x xxxx; 2 bytes */\n\t\t\tutf8_blen = 2;\n\t\t\tmin_cp = 0x80L;\n\t\t\tcp = t & 0x1f;\n\t\t} else if (t < 0xf0) {\n\t\t\t/* 1110 xxxx; 3 bytes */\n\t\t\tutf8_blen = 3;\n\t\t\tmin_cp = 0x800L;\n\t\t\tcp = t & 0x0f;\n\t\t} else if (t < 0xf8) {\n\t\t\t/* 1111 0xxx; 4 bytes */\n\t\t\tutf8_blen = 4;\n\t\t\tmin_cp = 0x10000L;\n\t\t\tcp = t & 0x07;\n\t\t} else {\n\t\t\t/* extended utf-8 not allowed for URIs */\n\t\t\tgoto uri_error;\n\t\t}\n\n\t\tif (left < utf8_blen * 3 - 1) {\n\t\t\t/* '%xx%xx...%xx', p points to char after first '%' */\n\t\t\tgoto uri_error;\n\t\t}\n\n\t\tp += 3;\n\t\tfor (i = 1; i < utf8_blen; i++) {\n\t\t\t/* p points to digit part ('%xy', p points to 'x') */\n\t\t\tt = duk__decode_hex_escape(p, 2);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"i=%ld utf8_blen=%ld cp=%ld t=0x%02lx\",\n\t\t\t                     (long) i, (long) utf8_blen, (long) cp, (unsigned long) t));\n\t\t\tif (t < 0) {\n\t\t\t\tgoto uri_error;\n\t\t\t}\n\t\t\tif ((t & 0xc0) != 0x80) {\n\t\t\t\tgoto uri_error;\n\t\t\t}\n\t\t\tcp = (cp << 6) + (t & 0x3f);\n\t\t\tp += 3;\n\t\t}\n\t\tp--;  /* p overshoots */\n\t\ttfm_ctx->p = p;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"final cp=%ld, min_cp=%ld\", (long) cp, (long) min_cp));\n\n\t\tif (cp < min_cp || cp > 0x10ffffL || (cp >= 0xd800L && cp <= 0xdfffL)) {\n\t\t\tgoto uri_error;\n\t\t}\n\n\t\t/* The E5.1 algorithm checks whether or not a decoded codepoint\n\t\t * is below 0x80 and perhaps may be in the \"reserved\" set.\n\t\t * This seems pointless because the single byte UTF-8 case is\n\t\t * handled separately, and non-shortest encodings are rejected.\n\t\t * So, 'cp' cannot be below 0x80 here, and thus cannot be in\n\t\t * the reserved set.\n\t\t */\n\n\t\t/* utf-8 validation ensures these */\n\t\tDUK_ASSERT(cp >= 0x80L && cp <= 0x10ffffL);\n\n\t\tif (cp >= 0x10000L) {\n\t\t\tcp -= 0x10000L;\n\t\t\tDUK_ASSERT(cp < 0x100000L);\n\n\t\t\tDUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp >> 10) + 0xd800L));\n\t\t\tDUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp & 0x03ffL) + 0xdc00L));\n\t\t} else {\n\t\t\tDUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp);\n\t\t}\n\t} else {\n\t\tDUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp);\n\t}\n\treturn;\n\n uri_error:\n\tDUK_ERROR_URI(tfm_ctx->thr, DUK_STR_INVALID_INPUT);\n}\n\n#if defined(DUK_USE_SECTION_B)\nDUK_LOCAL void duk__transform_callback_escape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {\n\tDUK_UNREF(udata);\n\n\tDUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 6);\n\n\tif (cp < 0) {\n\t\tgoto esc_error;\n\t} else if ((cp < 0x80L) && DUK__CHECK_BITMASK(duk__escape_unescaped_table, cp)) {\n\t\tDUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp);\n\t} else if (cp < 0x100L) {\n\t\tDUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr,\n\t\t                      &tfm_ctx->bw,\n\t\t                      (duk_uint8_t) DUK_ASC_PERCENT,\n\t\t                      (duk_uint8_t) duk_uc_nybbles[cp >> 4],\n\t\t                      (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]);\n\t} else if (cp < 0x10000L) {\n\t\tDUK_BW_WRITE_RAW_U8_6(tfm_ctx->thr,\n\t\t                      &tfm_ctx->bw,\n\t\t                      (duk_uint8_t) DUK_ASC_PERCENT,\n\t\t                      (duk_uint8_t) DUK_ASC_LC_U,\n\t\t                      (duk_uint8_t) duk_uc_nybbles[cp >> 12],\n\t\t                      (duk_uint8_t) duk_uc_nybbles[(cp >> 8) & 0x0f],\n\t\t                      (duk_uint8_t) duk_uc_nybbles[(cp >> 4) & 0x0f],\n\t\t                      (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]);\n\t} else {\n\t\t/* Characters outside BMP cannot be escape()'d.  We could\n\t\t * encode them as surrogate pairs (for codepoints inside\n\t\t * valid UTF-8 range, but not extended UTF-8).  Because\n\t\t * escape() and unescape() are legacy functions, we don't.\n\t\t */\n\t\tgoto esc_error;\n\t}\n\n\treturn;\n\n esc_error:\n\tDUK_ERROR_TYPE(tfm_ctx->thr, DUK_STR_INVALID_INPUT);\n}\n\nDUK_LOCAL void duk__transform_callback_unescape(duk__transform_context *tfm_ctx, const void *udata, duk_codepoint_t cp) {\n\tduk_small_int_t t;\n\n\tDUK_UNREF(udata);\n\n\tif (cp == (duk_codepoint_t) '%') {\n\t\tconst duk_uint8_t *p = tfm_ctx->p;\n\t\tduk_size_t left = (duk_size_t) (tfm_ctx->p_end - p);  /* bytes left */\n\n\t\tif (left >= 5 && p[0] == 'u' &&\n\t\t    ((t = duk__decode_hex_escape(p + 1, 4)) >= 0)) {\n\t\t\tcp = (duk_codepoint_t) t;\n\t\t\ttfm_ctx->p += 5;\n\t\t} else if (left >= 2 &&\n\t\t           ((t = duk__decode_hex_escape(p, 2)) >= 0)) {\n\t\t\tcp = (duk_codepoint_t) t;\n\t\t\ttfm_ctx->p += 2;\n\t\t}\n\t}\n\n\tDUK_BW_WRITE_ENSURE_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp);\n}\n#endif  /* DUK_USE_SECTION_B */\n\n/*\n *  Eval\n *\n *  Eval needs to handle both a \"direct eval\" and an \"indirect eval\".\n *  Direct eval handling needs access to the caller's activation so that its\n *  lexical environment can be accessed.  A direct eval is only possible from\n *  Ecmascript code; an indirect eval call is possible also from C code.\n *  When an indirect eval call is made from C code, there may not be a\n *  calling activation at all which needs careful handling.\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_global_object_eval(duk_hthread *thr) {\n\tduk_hstring *h;\n\tduk_activation *act_caller;\n\tduk_activation *act_eval;\n\tduk_hcompfunc *func;\n\tduk_hobject *outer_lex_env;\n\tduk_hobject *outer_var_env;\n\tduk_bool_t this_to_global = 1;\n\tduk_small_uint_t comp_flags;\n\tduk_int_t level = -2;\n\tduk_small_uint_t call_flags;\n\n\tDUK_ASSERT(duk_get_top(thr) == 1 || duk_get_top(thr) == 2);  /* 2 when called by debugger */\n\tDUK_ASSERT(thr->callstack_top >= 1);  /* at least this function exists */\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT((thr->callstack_curr->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0 || /* indirect eval */\n\t           (thr->callstack_top >= 2));  /* if direct eval, calling activation must exist */\n\n\t/*\n\t *  callstack_top - 1 --> this function\n\t *  callstack_top - 2 --> caller (may not exist)\n\t *\n\t *  If called directly from C, callstack_top might be 1.  If calling\n\t *  activation doesn't exist, call must be indirect.\n\t */\n\n\th = duk_get_hstring_notsymbol(thr, 0);\n\tif (!h) {\n\t\t/* Symbol must be returned as is, like any non-string values. */\n\t\treturn 1;  /* return arg as-is */\n\t}\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t/* NOTE: level is used only by the debugger and should never be present\n\t * for an Ecmascript eval().\n\t */\n\tDUK_ASSERT(level == -2);  /* by default, use caller's environment */\n\tif (duk_get_top(thr) >= 2 && duk_is_number(thr, 1)) {\n\t\tlevel = duk_get_int(thr, 1);\n\t}\n\tDUK_ASSERT(level <= -2);  /* This is guaranteed by debugger code. */\n#endif\n\n\t/* [ source ] */\n\n\tcomp_flags = DUK_COMPILE_EVAL;\n\tact_eval = thr->callstack_curr;  /* this function */\n\tDUK_ASSERT(act_eval != NULL);\n\tact_caller = duk_hthread_get_activation_for_level(thr, level);\n\tif (act_caller != NULL) {\n\t\t/* Have a calling activation, check for direct eval (otherwise\n\t\t * assume indirect eval.\n\t\t */\n\t\tif ((act_caller->flags & DUK_ACT_FLAG_STRICT) &&\n\t\t    (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL)) {\n\t\t\t/* Only direct eval inherits strictness from calling code\n\t\t\t * (E5.1 Section 10.1.1).\n\t\t\t */\n\t\t\tcomp_flags |= DUK_COMPILE_STRICT;\n\t\t}\n\t} else {\n\t\tDUK_ASSERT((act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0);\n\t}\n\n\tduk_push_hstring_stridx(thr, DUK_STRIDX_INPUT);  /* XXX: copy from caller? */\n\tduk_js_compile(thr,\n\t               (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h),\n\t               (duk_size_t) DUK_HSTRING_GET_BYTELEN(h),\n\t               comp_flags);\n\tfunc = (duk_hcompfunc *) duk_known_hobject(thr, -1);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) func));\n\n\t/* [ source template ] */\n\n\t/* E5 Section 10.4.2 */\n\n\tif (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) {\n\t\tDUK_ASSERT(thr->callstack_top >= 2);\n\t\tDUK_ASSERT(act_caller != NULL);\n\t\tif (act_caller->lex_env == NULL) {\n\t\t\tDUK_ASSERT(act_caller->var_env == NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"delayed environment initialization\"));\n\n\t\t\t/* this may have side effects, so re-lookup act */\n\t\t\tduk_js_init_activation_environment_records_delayed(thr, act_caller);\n\t\t}\n\t\tDUK_ASSERT(act_caller->lex_env != NULL);\n\t\tDUK_ASSERT(act_caller->var_env != NULL);\n\n\t\tthis_to_global = 0;\n\n\t\tif (DUK_HOBJECT_HAS_STRICT((duk_hobject *) func)) {\n\t\t\tduk_hdecenv *new_env;\n\t\t\tduk_hobject *act_lex_env;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"direct eval call to a strict function -> \"\n\t\t\t                     \"var_env and lex_env to a fresh env, \"\n\t\t\t                     \"this_binding to caller's this_binding\"));\n\n\t\t\tact_lex_env = act_caller->lex_env;\n\n\t\t\tnew_env = duk_hdecenv_alloc(thr,\n\t\t\t                            DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t\t                            DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));\n\t\t\tDUK_ASSERT(new_env != NULL);\n\t\t\tduk_push_hobject(thr, (duk_hobject *) new_env);\n\n\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);\n\t\t\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act_lex_env);\n\t\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, act_lex_env);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"new_env allocated: %!iO\", (duk_heaphdr *) new_env));\n\n\t\t\touter_lex_env = (duk_hobject *) new_env;\n\t\t\touter_var_env = (duk_hobject *) new_env;\n\n\t\t\tduk_insert(thr, 0);  /* stash to bottom of value stack to keep new_env reachable for duration of eval */\n\n\t\t\t/* compiler's responsibility */\n\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func));\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"direct eval call to a non-strict function -> \"\n\t\t\t                     \"var_env and lex_env to caller's envs, \"\n\t\t\t                     \"this_binding to caller's this_binding\"));\n\n\t\t\touter_lex_env = act_caller->lex_env;\n\t\t\touter_var_env = act_caller->var_env;\n\n\t\t\t/* compiler's responsibility */\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func));\n\t\t}\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"indirect eval call -> var_env and lex_env to \"\n\t\t                     \"global object, this_binding to global object\"));\n\n\t\tthis_to_global = 1;\n\t\touter_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\t\touter_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\t}\n\n\t/* Eval code doesn't need an automatic .prototype object. */\n\tduk_js_push_closure(thr, func, outer_var_env, outer_lex_env, 0 /*add_auto_proto*/);\n\n\t/* [ env? source template closure ] */\n\n\tif (this_to_global) {\n\t\tDUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);\n\t\tduk_push_hobject_bidx(thr, DUK_BIDX_GLOBAL);\n\t} else {\n\t\tduk_tval *tv;\n\t\tDUK_ASSERT(thr->callstack_top >= 2);\n\t\tDUK_ASSERT(act_caller != NULL);\n\t\ttv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act_caller->bottom_byteoff - sizeof(duk_tval));  /* this is just beneath bottom */\n\t\tDUK_ASSERT(tv >= thr->valstack);\n\t\tduk_push_tval(thr, tv);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"eval -> lex_env=%!iO, var_env=%!iO, this_binding=%!T\",\n\t                     (duk_heaphdr *) outer_lex_env,\n\t                     (duk_heaphdr *) outer_var_env,\n\t                     duk_get_tval(thr, -1)));\n\n\t/* [ env? source template closure this ] */\n\n\tcall_flags = 0;\n\tif (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) {\n\t\t/* Set DIRECT_EVAL flag for the call; it's not strictly\n\t\t * needed for the 'inner' eval call (the eval body) but\n\t\t * current new.target implementation expects to find it\n\t\t * so it can traverse direct eval chains up to the real\n\t\t * calling function.\n\t\t */\n\t\tcall_flags |= DUK_CALL_FLAG_DIRECT_EVAL;\n\t}\n\tduk_handle_call_unprotected_nargs(thr, 0, call_flags);\n\n\t/* [ env? source template result ] */\n\n\treturn 1;\n}\n\n/*\n *  Parsing of ints and floats\n */\n\n#if defined(DUK_USE_GLOBAL_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_global_object_parse_int(duk_hthread *thr) {\n\tduk_int32_t radix;\n\tduk_small_uint_t s2n_flags;\n\n\tDUK_ASSERT_TOP(thr, 2);\n\tduk_to_string(thr, 0);  /* Reject symbols. */\n\n\tradix = duk_to_int32(thr, 1);\n\n\t/* While parseInt() recognizes 0xdeadbeef, it doesn't recognize\n\t * ES2015 0o123 or 0b10001.\n\t */\n\ts2n_flags = DUK_S2N_FLAG_TRIM_WHITE |\n\t            DUK_S2N_FLAG_ALLOW_GARBAGE |\n\t            DUK_S2N_FLAG_ALLOW_PLUS |\n\t            DUK_S2N_FLAG_ALLOW_MINUS |\n\t            DUK_S2N_FLAG_ALLOW_LEADING_ZERO |\n\t            DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT;\n\n\t/* Specification stripPrefix maps to DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT.\n\t *\n\t * Don't autodetect octals (from leading zeroes), require user code to\n\t * provide an explicit radix 8 for parsing octal.  See write-up from Mozilla:\n\t * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt#ECMAScript_5_Removes_Octal_Interpretation\n\t */\n\n\tif (radix != 0) {\n\t\tif (radix < 2 || radix > 36) {\n\t\t\tgoto ret_nan;\n\t\t}\n\t\tif (radix != 16) {\n\t\t\ts2n_flags &= ~DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT;\n\t\t}\n\t} else {\n\t\tradix = 10;\n\t}\n\n\tduk_dup_0(thr);\n\tduk_numconv_parse(thr, (duk_small_int_t) radix, s2n_flags);\n\treturn 1;\n\n ret_nan:\n\tduk_push_nan(thr);\n\treturn 1;\n}\n#endif  /* DUK_USE_GLOBAL_BUILTIN */\n\n#if defined(DUK_USE_GLOBAL_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_global_object_parse_float(duk_hthread *thr) {\n\tduk_small_uint_t s2n_flags;\n\n\tDUK_ASSERT_TOP(thr, 1);\n\tduk_to_string(thr, 0);  /* Reject symbols. */\n\n\t/* XXX: check flags */\n\ts2n_flags = DUK_S2N_FLAG_TRIM_WHITE |\n\t            DUK_S2N_FLAG_ALLOW_EXP |\n\t            DUK_S2N_FLAG_ALLOW_GARBAGE |\n\t            DUK_S2N_FLAG_ALLOW_PLUS |\n\t            DUK_S2N_FLAG_ALLOW_MINUS |\n\t            DUK_S2N_FLAG_ALLOW_INF |\n\t            DUK_S2N_FLAG_ALLOW_FRAC |\n\t            DUK_S2N_FLAG_ALLOW_NAKED_FRAC |\n\t            DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |\n\t            DUK_S2N_FLAG_ALLOW_LEADING_ZERO;\n\n\tduk_numconv_parse(thr, 10 /*radix*/, s2n_flags);\n\treturn 1;\n}\n#endif  /* DUK_USE_GLOBAL_BUILTIN */\n\n/*\n *  Number checkers\n */\n\n#if defined(DUK_USE_GLOBAL_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_global_object_is_nan(duk_hthread *thr) {\n\tduk_double_t d = duk_to_number(thr, 0);\n\tduk_push_boolean(thr, (duk_bool_t) DUK_ISNAN(d));\n\treturn 1;\n}\n#endif  /* DUK_USE_GLOBAL_BUILTIN */\n\n#if defined(DUK_USE_GLOBAL_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_global_object_is_finite(duk_hthread *thr) {\n\tduk_double_t d = duk_to_number(thr, 0);\n\tduk_push_boolean(thr, (duk_bool_t) DUK_ISFINITE(d));\n\treturn 1;\n}\n#endif  /* DUK_USE_GLOBAL_BUILTIN */\n\n/*\n *  URI handling\n */\n\n#if defined(DUK_USE_GLOBAL_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri(duk_hthread *thr) {\n\treturn duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_reserved_table);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri_component(duk_hthread *thr) {\n\treturn duk__transform_helper(thr, duk__transform_callback_decode_uri, (const void *) duk__decode_uri_component_reserved_table);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri(duk_hthread *thr) {\n\treturn duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uriunescaped_table);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri_component(duk_hthread *thr) {\n\treturn duk__transform_helper(thr, duk__transform_callback_encode_uri, (const void *) duk__encode_uricomponent_unescaped_table);\n}\n\n#if defined(DUK_USE_SECTION_B)\nDUK_INTERNAL duk_ret_t duk_bi_global_object_escape(duk_hthread *thr) {\n\treturn duk__transform_helper(thr, duk__transform_callback_escape, (const void *) NULL);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_global_object_unescape(duk_hthread *thr) {\n\treturn duk__transform_helper(thr, duk__transform_callback_unescape, (const void *) NULL);\n}\n#endif  /* DUK_USE_SECTION_B */\n#endif  /* DUK_USE_GLOBAL_BUILTIN */\n\n/* automatic undefs */\n#undef DUK__CHECK_BITMASK\n#undef DUK__MKBITS\n#line 1 \"duk_bi_json.c\"\n/*\n *  JSON built-ins.\n *\n *  See doc/json.rst.\n *\n *  Codepoints are handled as duk_uint_fast32_t to ensure that the full\n *  unsigned 32-bit range is supported.  This matters to e.g. JX.\n *\n *  Input parsing doesn't do an explicit end-of-input check at all.  This is\n *  safe: input string data is always NUL-terminated (0x00) and valid JSON\n *  inputs never contain plain NUL characters, so that as long as syntax checks\n *  are correct, we'll never read past the NUL.  This approach reduces code size\n *  and improves parsing performance, but it's critical that syntax checks are\n *  indeed correct!\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_JSON_SUPPORT)\n\n/*\n *  Local defines and forward declarations.\n */\n\n#define DUK__JSON_DECSTR_BUFSIZE 128\n#define DUK__JSON_DECSTR_CHUNKSIZE 64\n#define DUK__JSON_ENCSTR_CHUNKSIZE 64\n#define DUK__JSON_STRINGIFY_BUFSIZE 128\n#define DUK__JSON_MAX_ESC_LEN 10  /* '\\Udeadbeef' */\n\nDUK_LOCAL_DECL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx);\n#if defined(DUK_USE_JX)\nDUK_LOCAL_DECL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx);\n#endif\nDUK_LOCAL_DECL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n);\nDUK_LOCAL_DECL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx);\nDUK_LOCAL_DECL void duk__dec_string(duk_json_dec_ctx *js_ctx);\n#if defined(DUK_USE_JX)\nDUK_LOCAL_DECL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_pointer(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_buffer(duk_json_dec_ctx *js_ctx);\n#endif\nDUK_LOCAL_DECL void duk__dec_number(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_object(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_array(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_value(duk_json_dec_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx);\n\nDUK_LOCAL_DECL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch);\nDUK_LOCAL_DECL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2);\nDUK_LOCAL_DECL void duk__unemit_1(duk_json_enc_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h);\n#if defined(DUK_USE_FASTINT)\nDUK_LOCAL_DECL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *p);\n#endif\nDUK_LOCAL_DECL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx);\nDUK_LOCAL_DECL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q);\nDUK_LOCAL_DECL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k);\nDUK_LOCAL_DECL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str);\nDUK_LOCAL_DECL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top);\nDUK_LOCAL_DECL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top);\nDUK_LOCAL_DECL void duk__enc_object(duk_json_enc_ctx *js_ctx);\nDUK_LOCAL_DECL void duk__enc_array(duk_json_enc_ctx *js_ctx);\nDUK_LOCAL_DECL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder);\nDUK_LOCAL_DECL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv);\nDUK_LOCAL_DECL void duk__enc_double(duk_json_enc_ctx *js_ctx);\n#if defined(DUK_USE_FASTINT)\nDUK_LOCAL_DECL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv);\n#endif\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\nDUK_LOCAL_DECL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h);\nDUK_LOCAL_DECL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_LOCAL_DECL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj);\n#endif\n#endif\n#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)\nDUK_LOCAL_DECL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h);\n#endif\nDUK_LOCAL_DECL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth);\n\n/*\n *  Helper tables\n */\n\n#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH)\nDUK_LOCAL const duk_uint8_t duk__json_quotestr_lookup[256] = {\n\t/* 0x00 ... 0x7f: as is\n\t * 0x80: escape generically\n\t * 0x81: slow path\n\t * 0xa0 ... 0xff: backslash + one char\n\t */\n\n\t0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xe2, 0xf4, 0xee, 0x80, 0xe6, 0xf2, 0x80, 0x80,\n\t0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,\n\t0x20, 0x21, 0xa2, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n\t0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,\n\t0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,\n\t0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0xdc, 0x5d, 0x5e, 0x5f,\n\t0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,\n\t0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,\n\t0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81\n};\n#else  /* DUK_USE_JSON_QUOTESTRING_FASTPATH */\nDUK_LOCAL const duk_uint8_t duk__json_quotestr_esc[14] = {\n\tDUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL,\n\tDUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL,\n\tDUK_ASC_LC_B, DUK_ASC_LC_T, DUK_ASC_LC_N, DUK_ASC_NUL,\n\tDUK_ASC_LC_F, DUK_ASC_LC_R\n};\n#endif  /* DUK_USE_JSON_QUOTESTRING_FASTPATH */\n\n#if defined(DUK_USE_JSON_DECSTRING_FASTPATH)\nDUK_LOCAL const duk_uint8_t duk__json_decstr_lookup[256] = {\n\t/* 0x00: slow path\n\t * other: as is\n\t */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x20, 0x21, 0x00, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n\t0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,\n\t0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,\n\t0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x00, 0x5d, 0x5e, 0x5f,\n\t0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,\n\t0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,\n\t0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,\n\t0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,\n\t0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,\n\t0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,\n\t0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,\n\t0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,\n\t0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,\n\t0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff\n};\n#endif  /* DUK_USE_JSON_DECSTRING_FASTPATH */\n\n#if defined(DUK_USE_JSON_EATWHITE_FASTPATH)\nDUK_LOCAL const duk_uint8_t duk__json_eatwhite_lookup[256] = {\n\t/* 0x00: finish (non-white)\n\t * 0x01: continue\n\t */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n#endif  /* DUK_USE_JSON_EATWHITE_FASTPATH */\n\n#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH)\nDUK_LOCAL const duk_uint8_t duk__json_decnumber_lookup[256] = {\n\t/* 0x00: finish (not part of number)\n\t * 0x01: continue\n\t */\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,\n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n#endif  /* DUK_USE_JSON_DECNUMBER_FASTPATH */\n\n/*\n *  Parsing implementation.\n *\n *  JSON lexer is now separate from duk_lexer.c because there are numerous\n *  small differences making it difficult to share the lexer.\n *\n *  The parser here works with raw bytes directly; this works because all\n *  JSON delimiters are ASCII characters.  Invalid xUTF-8 encoded values\n *  inside strings will be passed on without normalization; this is not a\n *  compliance concern because compliant inputs will always be valid\n *  CESU-8 encodings.\n */\n\nDUK_LOCAL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx) {\n\t/* Shared handler to minimize parser size.  Cause will be\n\t * hidden, unfortunately, but we'll have an offset which\n\t * is often quite enough.\n\t */\n\tDUK_ERROR_FMT1(js_ctx->thr, DUK_ERR_SYNTAX_ERROR, DUK_STR_FMT_INVALID_JSON,\n\t               (long) (js_ctx->p - js_ctx->p_start));\n}\n\nDUK_LOCAL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx) {\n\tconst duk_uint8_t *p;\n\tduk_uint8_t t;\n\n\tp = js_ctx->p;\n\tfor (;;) {\n\t\tDUK_ASSERT(p <= js_ctx->p_end);\n\t\tt = *p;\n\n#if defined(DUK_USE_JSON_EATWHITE_FASTPATH)\n\t\t/* This fast path is pretty marginal in practice.\n\t\t * XXX: candidate for removal.\n\t\t */\n\t\tDUK_ASSERT(duk__json_eatwhite_lookup[0x00] == 0x00);  /* end-of-input breaks */\n\t\tif (duk__json_eatwhite_lookup[t] == 0) {\n\t\t\tbreak;\n\t\t}\n#else  /* DUK_USE_JSON_EATWHITE_FASTPATH */\n\t\tif (!(t == 0x20 || t == 0x0a || t == 0x0d || t == 0x09)) {\n\t\t\t/* NUL also comes here.  Comparison order matters, 0x20\n\t\t\t * is most common whitespace.\n\t\t\t */\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_JSON_EATWHITE_FASTPATH */\n\t\tp++;\n\t}\n\tjs_ctx->p = p;\n}\n\n#if defined(DUK_USE_JX)\nDUK_LOCAL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx) {\n\tDUK_ASSERT(js_ctx->p <= js_ctx->p_end);\n\treturn *js_ctx->p;\n}\n#endif\n\nDUK_LOCAL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx) {\n\tDUK_ASSERT(js_ctx->p <= js_ctx->p_end);\n\treturn *js_ctx->p++;\n}\n\nDUK_LOCAL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx) {\n\tduk__dec_eat_white(js_ctx);\n\treturn duk__dec_get(js_ctx);\n}\n\n/* For JX, expressing the whole unsigned 32-bit range matters. */\nDUK_LOCAL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n) {\n\tduk_small_uint_t i;\n\tduk_uint_fast32_t res = 0;\n\tduk_uint8_t x;\n\tduk_small_int_t t;\n\n\tfor (i = 0; i < n; i++) {\n\t\t/* XXX: share helper from lexer; duk_lexer.c / hexval(). */\n\n\t\tx = duk__dec_get(js_ctx);\n\t\tDUK_DDD(DUK_DDDPRINT(\"decode_hex_escape: i=%ld, n=%ld, res=%ld, x=%ld\",\n\t\t                     (long) i, (long) n, (long) res, (long) x));\n\n\t\t/* x == 0x00 (EOF) causes syntax_error */\n\t\tDUK_ASSERT(duk_hex_dectab[0] == -1);\n\t\tt = duk_hex_dectab[x & 0xff];\n\t\tif (DUK_LIKELY(t >= 0)) {\n\t\t\tres = (res * 16) + (duk_uint_fast32_t) t;\n\t\t} else {\n\t\t\t/* catches EOF and invalid digits */\n\t\t\tgoto syntax_error;\n\t\t}\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"final hex decoded value: %ld\", (long) res));\n\treturn res;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n\treturn 0;\n}\n\nDUK_LOCAL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx) {\n\tduk_hstring *h;\n\tconst duk_uint8_t *p;\n\tduk_uint8_t x, y;\n\n\t/* First character has already been eaten and checked by the caller.\n\t * We can scan until a NUL in stridx string because no built-in strings\n\t * have internal NULs.\n\t */\n\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\th = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx);\n\tDUK_ASSERT(h != NULL);\n\n\tp = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h) + 1;\n\tDUK_ASSERT(*(js_ctx->p - 1) == *(p - 1));  /* first character has been matched */\n\n\tfor (;;) {\n\t\tx = *p;\n\t\tif (x == 0) {\n\t\t\tbreak;\n\t\t}\n\t\ty = duk__dec_get(js_ctx);\n\t\tif (x != y) {\n\t\t\t/* Catches EOF of JSON input. */\n\t\t\tgoto syntax_error;\n\t\t}\n\t\tp++;\n\t}\n\n\treturn;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n}\n\nDUK_LOCAL duk_small_int_t duk__dec_string_escape(duk_json_dec_ctx *js_ctx, duk_uint8_t **ext_p) {\n\tduk_uint_fast32_t cp;\n\n\t/* EOF (-1) will be cast to an unsigned value first\n\t * and then re-cast for the switch.  In any case, it\n\t * will match the default case (syntax error).\n\t */\n\tcp = (duk_uint_fast32_t) duk__dec_get(js_ctx);\n\tswitch (cp) {\n\tcase DUK_ASC_BACKSLASH: break;\n\tcase DUK_ASC_DOUBLEQUOTE: break;\n\tcase DUK_ASC_SLASH: break;\n\tcase DUK_ASC_LC_T: cp = 0x09; break;\n\tcase DUK_ASC_LC_N: cp = 0x0a; break;\n\tcase DUK_ASC_LC_R: cp = 0x0d; break;\n\tcase DUK_ASC_LC_F: cp = 0x0c; break;\n\tcase DUK_ASC_LC_B: cp = 0x08; break;\n\tcase DUK_ASC_LC_U: {\n\t\tcp = duk__dec_decode_hex_escape(js_ctx, 4);\n\t\tbreak;\n\t}\n#if defined(DUK_USE_JX)\n\tcase DUK_ASC_UC_U: {\n\t\tif (js_ctx->flag_ext_custom) {\n\t\t\tcp = duk__dec_decode_hex_escape(js_ctx, 8);\n\t\t} else {\n\t\t\treturn 1;  /* syntax error */\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_ASC_LC_X: {\n\t\tif (js_ctx->flag_ext_custom) {\n\t\t\tcp = duk__dec_decode_hex_escape(js_ctx, 2);\n\t\t} else {\n\t\t\treturn 1;  /* syntax error */\n\t\t}\n\t\tbreak;\n\t}\n#endif  /* DUK_USE_JX */\n\tdefault:\n\t\t/* catches EOF (0x00) */\n\t\treturn 1;  /* syntax error */\n\t}\n\n\tDUK_RAW_WRITE_XUTF8(*ext_p, cp);\n\n\treturn 0;\n}\n\nDUK_LOCAL void duk__dec_string(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_bufwriter_ctx bw_alloc;\n\tduk_bufwriter_ctx *bw;\n\tduk_uint8_t *q;\n\n\t/* '\"' was eaten by caller */\n\n\t/* Note that we currently parse -bytes-, not codepoints.\n\t * All non-ASCII extended UTF-8 will encode to bytes >= 0x80,\n\t * so they'll simply pass through (valid UTF-8 or not).\n\t */\n\n\tbw = &bw_alloc;\n\tDUK_BW_INIT_PUSHBUF(js_ctx->thr, bw, DUK__JSON_DECSTR_BUFSIZE);\n\tq = DUK_BW_GET_PTR(js_ctx->thr, bw);\n\n#if defined(DUK_USE_JSON_DECSTRING_FASTPATH)\n\tfor (;;) {\n\t\tduk_small_uint_t safe;\n\t\tduk_uint8_t b, x;\n\t\tconst duk_uint8_t *p;\n\n\t\t/* Select a safe loop count where no output checks are\n\t\t * needed assuming we won't encounter escapes.  Input\n\t\t * bound checks are not necessary as a NUL (guaranteed)\n\t\t * will cause a SyntaxError before we read out of bounds.\n\t\t */\n\n\t\tsafe = DUK__JSON_DECSTR_CHUNKSIZE;\n\n\t\t/* Ensure space for 1:1 output plus one escape. */\n\t\tq = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, safe + DUK_UNICODE_MAX_XUTF8_LENGTH, q);\n\n\t\tp = js_ctx->p;  /* temp copy, write back for next loop */\n\t\tfor (;;) {\n\t\t\tif (safe == 0) {\n\t\t\t\tjs_ctx->p = p;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsafe--;\n\n\t\t\t/* End of input (NUL) goes through slow path and causes SyntaxError. */\n\t\t\tDUK_ASSERT(duk__json_decstr_lookup[0] == 0x00);\n\n\t\t\tb = *p++;\n\t\t\tx = (duk_small_int_t) duk__json_decstr_lookup[b];\n\t\t\tif (DUK_LIKELY(x != 0)) {\n\t\t\t\t/* Fast path, decode as is. */\n\t\t\t\t*q++ = b;\n\t\t\t} else if (b == DUK_ASC_DOUBLEQUOTE) {\n\t\t\t\tjs_ctx->p = p;\n\t\t\t\tgoto found_quote;\n\t\t\t} else if (b == DUK_ASC_BACKSLASH) {\n\t\t\t\t/* We've ensured space for one escaped input; then\n\t\t\t\t * bail out and recheck (this makes escape handling\n\t\t\t\t * quite slow but it's uncommon).\n\t\t\t\t */\n\t\t\t\tjs_ctx->p = p;\n\t\t\t\tif (duk__dec_string_escape(js_ctx, &q) != 0) {\n\t\t\t\t\tgoto syntax_error;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tjs_ctx->p = p;\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\t\t}\n\t}\n found_quote:\n#else  /* DUK_USE_JSON_DECSTRING_FASTPATH */\n\tfor (;;) {\n\t\tduk_uint8_t x;\n\n\t\tq = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, DUK_UNICODE_MAX_XUTF8_LENGTH, q);\n\n\t\tx = duk__dec_get(js_ctx);\n\n\t\tif (x == DUK_ASC_DOUBLEQUOTE) {\n\t\t\tbreak;\n\t\t} else if (x == DUK_ASC_BACKSLASH) {\n\t\t\tif (duk__dec_string_escape(js_ctx, &q) != 0) {\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\t\t} else if (x < 0x20) {\n\t\t\t/* catches EOF (NUL) */\n\t\t\tgoto syntax_error;\n\t\t} else {\n\t\t\t*q++ = (duk_uint8_t) x;\n\t\t}\n\t}\n#endif  /* DUK_USE_JSON_DECSTRING_FASTPATH */\n\n\tDUK_BW_SETPTR_AND_COMPACT(js_ctx->thr, bw, q);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe if input string is safe. */\n\n\t/* [ ... str ] */\n\n\treturn;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n}\n\n#if defined(DUK_USE_JX)\n/* Decode a plain string consisting entirely of identifier characters.\n * Used to parse plain keys (e.g. \"foo: 123\").\n */\nDUK_LOCAL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tconst duk_uint8_t *p;\n\tduk_small_int_t x;\n\n\t/* Caller has already eaten the first char so backtrack one byte. */\n\n\tjs_ctx->p--;  /* safe */\n\tp = js_ctx->p;\n\n\t/* Here again we parse bytes, and non-ASCII UTF-8 will cause end of\n\t * parsing (which is correct except if there are non-shortest encodings).\n\t * There is also no need to check explicitly for end of input buffer as\n\t * the input is NUL padded and NUL will exit the parsing loop.\n\t *\n\t * Because no unescaping takes place, we can just scan to the end of the\n\t * plain string and intern from the input buffer.\n\t */\n\n\tfor (;;) {\n\t\tx = *p;\n\n\t\t/* There is no need to check the first character specially here\n\t\t * (i.e. reject digits): the caller only accepts valid initial\n\t\t * characters and won't call us if the first character is a digit.\n\t\t * This also ensures that the plain string won't be empty.\n\t\t */\n\n\t\tif (!duk_unicode_is_identifier_part((duk_codepoint_t) x)) {\n\t\t\tbreak;\n\t\t}\n\t\tp++;\n\t}\n\n\tduk_push_lstring(thr, (const char *) js_ctx->p, (duk_size_t) (p - js_ctx->p));\n\tjs_ctx->p = p;\n\n\t/* [ ... str ] */\n}\n#endif  /* DUK_USE_JX */\n\n#if defined(DUK_USE_JX)\nDUK_LOCAL void duk__dec_pointer(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tconst duk_uint8_t *p;\n\tduk_small_int_t x;\n\tvoid *voidptr;\n\n\t/* Caller has already eaten the first character ('(') which we don't need. */\n\n\tp = js_ctx->p;\n\n\tfor (;;) {\n\t\tx = *p;\n\n\t\t/* Assume that the native representation never contains a closing\n\t\t * parenthesis.\n\t\t */\n\n\t\tif (x == DUK_ASC_RPAREN) {\n\t\t\tbreak;\n\t\t} else if (x <= 0) {\n\t\t\t/* NUL term or -1 (EOF), NUL check would suffice */\n\t\t\tgoto syntax_error;\n\t\t}\n\t\tp++;\n\t}\n\n\t/* There is no need to NUL delimit the sscanf() call: trailing garbage is\n\t * ignored and there is always a NUL terminator which will force an error\n\t * if no error is encountered before it.  It's possible that the scan\n\t * would scan further than between [js_ctx->p,p[ though and we'd advance\n\t * by less than the scanned value.\n\t *\n\t * Because pointers are platform specific, a failure to scan a pointer\n\t * results in a null pointer which is a better placeholder than a missing\n\t * value or an error.\n\t */\n\n\tvoidptr = NULL;\n\t(void) DUK_SSCANF((const char *) js_ctx->p, DUK_STR_FMT_PTR, &voidptr);\n\tduk_push_pointer(thr, voidptr);\n\tjs_ctx->p = p + 1;  /* skip ')' */\n\n\t/* [ ... ptr ] */\n\n\treturn;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n}\n#endif  /* DUK_USE_JX */\n\n#if defined(DUK_USE_JX)\nDUK_LOCAL void duk__dec_buffer(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tconst duk_uint8_t *p;\n\tduk_uint8_t *buf;\n\tduk_size_t src_len;\n\tduk_small_int_t x;\n\n\t/* Caller has already eaten the first character ('|') which we don't need. */\n\n\tp = js_ctx->p;\n\n\t/* XXX: Would be nice to share the fast path loop from duk_hex_decode()\n\t * and avoid creating a temporary buffer.  However, there are some\n\t * differences which prevent trivial sharing:\n\t *\n\t *   - Pipe char detection\n\t *   - EOF detection\n\t *   - Unknown length of input and output\n\t *\n\t * The best approach here would be a bufwriter and a reasonaly sized\n\t * safe inner loop (e.g. 64 output bytes at a time).\n\t */\n\n\tfor (;;) {\n\t\tx = *p;\n\n\t\t/* This loop intentionally does not ensure characters are valid\n\t\t * ([0-9a-fA-F]) because the hex decode call below will do that.\n\t\t */\n\t\tif (x == DUK_ASC_PIPE) {\n\t\t\tbreak;\n\t\t} else if (x <= 0) {\n\t\t\t/* NUL term or -1 (EOF), NUL check would suffice */\n\t\t\tgoto syntax_error;\n\t\t}\n\t\tp++;\n\t}\n\n\t/* XXX: this is not very nice; unnecessary copy is made. */\n\tsrc_len = (duk_size_t) (p - js_ctx->p);\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, src_len);\n\tDUK_ASSERT(buf != NULL);\n\tDUK_MEMCPY((void *) buf, (const void *) js_ctx->p, src_len);\n\tduk_hex_decode(thr, -1);\n\n\tjs_ctx->p = p + 1;  /* skip '|' */\n\n\t/* [ ... buf ] */\n\n\treturn;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n}\n#endif  /* DUK_USE_JX */\n\n/* Parse a number, other than NaN or +/- Infinity */\nDUK_LOCAL void duk__dec_number(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tconst duk_uint8_t *p_start;\n\tconst duk_uint8_t *p;\n\tduk_uint8_t x;\n\tduk_small_uint_t s2n_flags;\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse_number\"));\n\n\tp_start = js_ctx->p;\n\n\t/* First pass parse is very lenient (e.g. allows '1.2.3') and extracts a\n\t * string for strict number parsing.\n\t */\n\n\tp = js_ctx->p;\n\tfor (;;) {\n\t\tx = *p;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"parse_number: p_start=%p, p=%p, p_end=%p, x=%ld\",\n\t\t                     (const void *) p_start, (const void *) p,\n\t\t                     (const void *) js_ctx->p_end, (long) x));\n\n#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH)\n\t\t/* This fast path is pretty marginal in practice.\n\t\t * XXX: candidate for removal.\n\t\t */\n\t\tDUK_ASSERT(duk__json_decnumber_lookup[0x00] == 0x00);  /* end-of-input breaks */\n\t\tif (duk__json_decnumber_lookup[x] == 0) {\n\t\t\tbreak;\n\t\t}\n#else  /* DUK_USE_JSON_DECNUMBER_FASTPATH */\n\t\tif (!((x >= DUK_ASC_0 && x <= DUK_ASC_9) ||\n\t\t      (x == DUK_ASC_PERIOD || x == DUK_ASC_LC_E ||\n\t\t       x == DUK_ASC_UC_E || x == DUK_ASC_MINUS || x == DUK_ASC_PLUS))) {\n\t\t\t/* Plus sign must be accepted for positive exponents\n\t\t\t * (e.g. '1.5e+2').  This clause catches NULs.\n\t\t\t */\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_JSON_DECNUMBER_FASTPATH */\n\t\tp++;  /* safe, because matched (NUL causes a break) */\n\t}\n\tjs_ctx->p = p;\n\n\tDUK_ASSERT(js_ctx->p > p_start);\n\tduk_push_lstring(thr, (const char *) p_start, (duk_size_t) (p - p_start));\n\n\ts2n_flags = DUK_S2N_FLAG_ALLOW_EXP |\n\t            DUK_S2N_FLAG_ALLOW_MINUS |  /* but don't allow leading plus */\n\t            DUK_S2N_FLAG_ALLOW_FRAC;\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse_number: string before parsing: %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\tduk_numconv_parse(thr, 10 /*radix*/, s2n_flags);\n\tif (duk_is_nan(thr, -1)) {\n\t\tduk__dec_syntax_error(js_ctx);\n\t}\n\tDUK_ASSERT(duk_is_number(thr, -1));\n\tDUK_DDD(DUK_DDDPRINT(\"parse_number: final number: %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/* [ ... num ] */\n}\n\nDUK_LOCAL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_require_stack(thr, DUK_JSON_DEC_REQSTACK);\n\n\t/* c recursion check */\n\n\tDUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0);  /* unsigned */\n\tDUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);\n\tif (js_ctx->recursion_depth >= js_ctx->recursion_limit) {\n\t\tDUK_ERROR_RANGE(thr, DUK_STR_JSONDEC_RECLIMIT);\n\t}\n\tjs_ctx->recursion_depth++;\n}\n\nDUK_LOCAL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx) {\n\t/* c recursion check */\n\n\tDUK_ASSERT(js_ctx->recursion_depth > 0);\n\tDUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);\n\tjs_ctx->recursion_depth--;\n}\n\nDUK_LOCAL void duk__dec_object(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_int_t key_count;  /* XXX: a \"first\" flag would suffice */\n\tduk_uint8_t x;\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse_object\"));\n\n\tduk__dec_objarr_entry(js_ctx);\n\n\tduk_push_object(thr);\n\n\t/* Initial '{' has been checked and eaten by caller. */\n\n\tkey_count = 0;\n\tfor (;;) {\n\t\tx = duk__dec_get_nonwhite(js_ctx);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"parse_object: obj=%!T, x=%ld, key_count=%ld\",\n\t\t                     (duk_tval *) duk_get_tval(thr, -1),\n\t\t                     (long) x, (long) key_count));\n\n\t\t/* handle comma and closing brace */\n\n\t\tif (x == DUK_ASC_COMMA && key_count > 0) {\n\t\t\t/* accept comma, expect new value */\n\t\t\tx = duk__dec_get_nonwhite(js_ctx);\n\t\t} else if (x == DUK_ASC_RCURLY) {\n\t\t\t/* eat closing brace */\n\t\t\tbreak;\n\t\t} else if (key_count == 0) {\n\t\t\t/* accept anything, expect first value (EOF will be\n\t\t\t * caught by key parsing below.\n\t\t\t */\n\t\t\t;\n\t\t} else {\n\t\t\t/* catches EOF (NUL) and initial comma */\n\t\t\tgoto syntax_error;\n\t\t}\n\n\t\t/* parse key and value */\n\n\t\tif (x == DUK_ASC_DOUBLEQUOTE) {\n\t\t\tduk__dec_string(js_ctx);\n#if defined(DUK_USE_JX)\n\t\t} else if (js_ctx->flag_ext_custom &&\n\t\t           duk_unicode_is_identifier_start((duk_codepoint_t) x)) {\n\t\t\tduk__dec_plain_string(js_ctx);\n#endif\n\t\t} else {\n\t\t\tgoto syntax_error;\n\t\t}\n\n\t\t/* [ ... obj key ] */\n\n\t\tx = duk__dec_get_nonwhite(js_ctx);\n\t\tif (x != DUK_ASC_COLON) {\n\t\t\tgoto syntax_error;\n\t\t}\n\n\t\tduk__dec_value(js_ctx);\n\n\t\t/* [ ... obj key val ] */\n\n\t\tduk_xdef_prop_wec(thr, -3);\n\n\t\t/* [ ... obj ] */\n\n\t\tkey_count++;\n\t}\n\n\t/* [ ... obj ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse_object: final object is %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tduk__dec_objarr_exit(js_ctx);\n\treturn;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n}\n\nDUK_LOCAL void duk__dec_array(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_uarridx_t arr_idx;\n\tduk_uint8_t x;\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse_array\"));\n\n\tduk__dec_objarr_entry(js_ctx);\n\n\tduk_push_array(thr);\n\n\t/* Initial '[' has been checked and eaten by caller. */\n\n\tarr_idx = 0;\n\tfor (;;) {\n\t\tx = duk__dec_get_nonwhite(js_ctx);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"parse_array: arr=%!T, x=%ld, arr_idx=%ld\",\n\t\t                     (duk_tval *) duk_get_tval(thr, -1),\n\t\t                     (long) x, (long) arr_idx));\n\n\t\t/* handle comma and closing bracket */\n\n\t\tif ((x == DUK_ASC_COMMA) && (arr_idx != 0)) {\n\t\t\t/* accept comma, expect new value */\n\t\t\t;\n\t\t} else if (x == DUK_ASC_RBRACKET) {\n\t\t\t/* eat closing bracket */\n\t\t\tbreak;\n\t\t} else if (arr_idx == 0) {\n\t\t\t/* accept anything, expect first value (EOF will be\n\t\t\t * caught by duk__dec_value() below.\n\t\t\t */\n\t\t\tjs_ctx->p--;  /* backtrack (safe) */\n\t\t} else {\n\t\t\t/* catches EOF (NUL) and initial comma */\n\t\t\tgoto syntax_error;\n\t\t}\n\n\t\t/* parse value */\n\n\t\tduk__dec_value(js_ctx);\n\n\t\t/* [ ... arr val ] */\n\n\t\tduk_xdef_prop_index_wec(thr, -2, arr_idx);\n\t\tarr_idx++;\n\t}\n\n\t/* Must set 'length' explicitly when using duk_xdef_prop_xxx() to\n\t * set the values.\n\t */\n\n\tduk_set_length(thr, -1, arr_idx);\n\n\t/* [ ... arr ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse_array: final array is %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tduk__dec_objarr_exit(js_ctx);\n\treturn;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n}\n\nDUK_LOCAL void duk__dec_value(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_uint8_t x;\n\n\tx = duk__dec_get_nonwhite(js_ctx);\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse_value: initial x=%ld\", (long) x));\n\n\t/* Note: duk__dec_req_stridx() backtracks one char */\n\n\tif (x == DUK_ASC_DOUBLEQUOTE) {\n\t\tduk__dec_string(js_ctx);\n\t} else if ((x >= DUK_ASC_0 && x <= DUK_ASC_9) || (x == DUK_ASC_MINUS)) {\n#if defined(DUK_USE_JX)\n\t\tif (js_ctx->flag_ext_custom && x == DUK_ASC_MINUS && duk__dec_peek(js_ctx) == DUK_ASC_UC_I) {\n\t\t\tduk__dec_req_stridx(js_ctx, DUK_STRIDX_MINUS_INFINITY);  /* \"-Infinity\", '-' has been eaten */\n\t\t\tduk_push_number(thr, -DUK_DOUBLE_INFINITY);\n\t\t} else {\n#else\n\t\t{  /* unconditional block */\n#endif\n\t\t\t/* We already ate 'x', so backup one byte. */\n\t\t\tjs_ctx->p--;  /* safe */\n\t\t\tduk__dec_number(js_ctx);\n\t\t}\n\t} else if (x == DUK_ASC_LC_T) {\n\t\tduk__dec_req_stridx(js_ctx, DUK_STRIDX_TRUE);\n\t\tduk_push_true(thr);\n\t} else if (x == DUK_ASC_LC_F) {\n\t\tduk__dec_req_stridx(js_ctx, DUK_STRIDX_FALSE);\n\t\tduk_push_false(thr);\n\t} else if (x == DUK_ASC_LC_N) {\n\t\tduk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_NULL);\n\t\tduk_push_null(thr);\n#if defined(DUK_USE_JX)\n\t} else if (js_ctx->flag_ext_custom && x == DUK_ASC_LC_U) {\n\t\tduk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_UNDEFINED);\n\t\tduk_push_undefined(thr);\n\t} else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_N) {\n\t\tduk__dec_req_stridx(js_ctx, DUK_STRIDX_NAN);\n\t\tduk_push_nan(thr);\n\t} else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_I) {\n\t\tduk__dec_req_stridx(js_ctx, DUK_STRIDX_INFINITY);\n\t\tduk_push_number(thr, DUK_DOUBLE_INFINITY);\n\t} else if (js_ctx->flag_ext_custom && x == DUK_ASC_LPAREN) {\n\t\tduk__dec_pointer(js_ctx);\n\t} else if (js_ctx->flag_ext_custom && x == DUK_ASC_PIPE) {\n\t\tduk__dec_buffer(js_ctx);\n#endif\n\t} else if (x == DUK_ASC_LCURLY) {\n\t\tduk__dec_object(js_ctx);\n\t} else if (x == DUK_ASC_LBRACKET) {\n\t\tduk__dec_array(js_ctx);\n\t} else {\n\t\t/* catches EOF (NUL) */\n\t\tgoto syntax_error;\n\t}\n\n\tduk__dec_eat_white(js_ctx);\n\n\t/* [ ... val ] */\n\treturn;\n\n syntax_error:\n\tduk__dec_syntax_error(js_ctx);\n\tDUK_UNREACHABLE();\n}\n\n/* Recursive value reviver, implements the Walk() algorithm.  No C recursion\n * check is done here because the initial parsing step will already ensure\n * there is a reasonable limit on C recursion depth and hence object depth.\n */\nDUK_LOCAL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_hobject *h;\n\tduk_uarridx_t i, arr_len;\n\n\tDUK_DDD(DUK_DDDPRINT(\"walk: top=%ld, holder=%!T, name=%!T\",\n\t                     (long) duk_get_top(thr),\n\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tduk_dup_top(thr);\n\tduk_get_prop(thr, -3);  /* -> [ ... holder name val ] */\n\n\th = duk_get_hobject(thr, -1);\n\tif (h != NULL) {\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) {\n\t\t\tarr_len = (duk_uarridx_t) duk_get_length(thr, -1);\n\t\t\tfor (i = 0; i < arr_len; i++) {\n\t\t\t\t/* [ ... holder name val ] */\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"walk: array, top=%ld, i=%ld, arr_len=%ld, holder=%!T, name=%!T, val=%!T\",\n\t\t\t\t                     (long) duk_get_top(thr), (long) i, (long) arr_len,\n\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -3), (duk_tval *) duk_get_tval(thr, -2),\n\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t\t\t\tduk_dup_top(thr);\n\t\t\t\t(void) duk_push_uint_to_hstring(thr, (duk_uint_t) i);  /* -> [ ... holder name val val ToString(i) ] */\n\t\t\t\tduk__dec_reviver_walk(js_ctx);  /* -> [ ... holder name val new_elem ] */\n\n\t\t\t\tif (duk_is_undefined(thr, -1)) {\n\t\t\t\t\tduk_pop(thr);\n\t\t\t\t\tduk_del_prop_index(thr, -1, i);\n\t\t\t\t} else {\n\t\t\t\t\t/* XXX: duk_xdef_prop_index_wec() would be more appropriate\n\t\t\t\t\t * here but it currently makes some assumptions that might\n\t\t\t\t\t * not hold (e.g. that previous property is not an accessor).\n\t\t\t\t\t */\n\t\t\t\t\tduk_put_prop_index(thr, -2, i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t/* [ ... holder name val ] */\n\t\t\tduk_enum(thr, -1, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/);\n\t\t\twhile (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"walk: object, top=%ld, holder=%!T, name=%!T, val=%!T, enum=%!iT, obj_key=%!T\",\n\t\t\t\t                     (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -5),\n\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -4), (duk_tval *) duk_get_tval(thr, -3),\n\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));\n\n\t\t\t\t/* [ ... holder name val enum obj_key ] */\n\t\t\t\tduk_dup_m3(thr);\n\t\t\t\tduk_dup_m2(thr);\n\n\t\t\t\t/* [ ... holder name val enum obj_key val obj_key ] */\n\t\t\t\tduk__dec_reviver_walk(js_ctx);\n\n\t\t\t\t/* [ ... holder name val enum obj_key new_elem ] */\n\t\t\t\tif (duk_is_undefined(thr, -1)) {\n\t\t\t\t\tduk_pop(thr);\n\t\t\t\t\tduk_del_prop(thr, -3);\n\t\t\t\t} else {\n\t\t\t\t\t/* XXX: duk_xdef_prop_index_wec() would be more appropriate\n\t\t\t\t\t * here but it currently makes some assumptions that might\n\t\t\t\t\t * not hold (e.g. that previous property is not an accessor).\n\t\t\t\t\t *\n\t\t\t\t\t * Using duk_put_prop() works incorrectly with '__proto__'\n\t\t\t\t\t * if the own property with that name has been deleted.  This\n\t\t\t\t\t * does not happen normally, but a clever reviver can trigger\n\t\t\t\t\t * that, see complex reviver case in: test-bug-json-parse-__proto__.js.\n\t\t\t\t\t */\n\t\t\t\t\tduk_put_prop(thr, -4);\n\t\t\t\t}\n\t\t\t}\n\t\t\tduk_pop(thr);  /* pop enum */\n\t\t}\n\t}\n\n\t/* [ ... holder name val ] */\n\n\tduk_dup(thr, js_ctx->idx_reviver);\n\tduk_insert(thr, -4);  /* -> [ ... reviver holder name val ] */\n\tduk_call_method(thr, 2);  /* -> [ ... res ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"walk: top=%ld, result=%!T\",\n\t                     (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, -1)));\n}\n\n/*\n *  Stringify implementation.\n */\n\n#define DUK__EMIT_1(js_ctx,ch)          duk__emit_1((js_ctx), (duk_uint_fast8_t) (ch))\n#define DUK__EMIT_2(js_ctx,ch1,ch2)     duk__emit_2((js_ctx), (duk_uint_fast8_t) (ch1), (duk_uint_fast8_t) (ch2))\n#define DUK__EMIT_HSTR(js_ctx,h)        duk__emit_hstring((js_ctx), (h))\n#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC)\n#define DUK__EMIT_CSTR(js_ctx,p)        duk__emit_cstring((js_ctx), (p))\n#endif\n#define DUK__EMIT_STRIDX(js_ctx,i)      duk__emit_stridx((js_ctx), (i))\n#define DUK__UNEMIT_1(js_ctx)           duk__unemit_1((js_ctx))\n\nDUK_LOCAL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch) {\n\tDUK_BW_WRITE_ENSURE_U8(js_ctx->thr, &js_ctx->bw, ch);\n}\n\nDUK_LOCAL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2) {\n\tDUK_BW_WRITE_ENSURE_U8_2(js_ctx->thr, &js_ctx->bw, ch1, ch2);\n}\n\nDUK_LOCAL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h) {\n\tDUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h);\n}\n\n#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC)\nDUK_LOCAL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *str) {\n\tDUK_BW_WRITE_ENSURE_CSTRING(js_ctx->thr, &js_ctx->bw, str);\n}\n#endif\n\nDUK_LOCAL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx) {\n\tduk_hstring *h;\n\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\th = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h);\n}\n\nDUK_LOCAL void duk__unemit_1(duk_json_enc_ctx *js_ctx) {\n\tDUK_ASSERT(DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw) >= 1);\n\tDUK_BW_ADD_PTR(js_ctx->thr, &js_ctx->bw, -1);\n}\n\n#define DUK__MKESC(nybbles,esc1,esc2)  \\\n\t(((duk_uint_fast32_t) (nybbles)) << 16) | \\\n\t(((duk_uint_fast32_t) (esc1)) << 8) | \\\n\t((duk_uint_fast32_t) (esc2))\n\nDUK_LOCAL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q) {\n\tduk_uint_fast32_t tmp;\n\tduk_small_uint_t dig;\n\n\tDUK_UNREF(js_ctx);\n\n\t/* Caller ensures space for at least DUK__JSON_MAX_ESC_LEN. */\n\n\t/* Select appropriate escape format automatically, and set 'tmp' to a\n\t * value encoding both the escape format character and the nybble count:\n\t *\n\t *   (nybble_count << 16) | (escape_char1) | (escape_char2)\n\t */\n\n#if defined(DUK_USE_JX)\n\tif (DUK_LIKELY(cp < 0x100UL)) {\n\t\tif (DUK_UNLIKELY(js_ctx->flag_ext_custom != 0U)) {\n\t\t\ttmp = DUK__MKESC(2, DUK_ASC_BACKSLASH, DUK_ASC_LC_X);\n\t\t} else {\n\t\t\ttmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U);\n\t\t}\n\t} else\n#endif\n\tif (DUK_LIKELY(cp < 0x10000UL)) {\n\t\ttmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U);\n\t} else {\n#if defined(DUK_USE_JX)\n\t\tif (DUK_LIKELY(js_ctx->flag_ext_custom != 0U)) {\n\t\t\ttmp = DUK__MKESC(8, DUK_ASC_BACKSLASH, DUK_ASC_UC_U);\n\t\t} else\n#endif\n\t\t{\n\t\t\t/* In compatible mode and standard JSON mode, output\n\t\t\t * something useful for non-BMP characters.  This won't\n\t\t\t * roundtrip but will still be more or less readable and\n\t\t\t * more useful than an error.\n\t\t\t */\n\t\t\ttmp = DUK__MKESC(8, DUK_ASC_UC_U, DUK_ASC_PLUS);\n\t\t}\n\t}\n\n\t*q++ = (duk_uint8_t) ((tmp >> 8) & 0xff);\n\t*q++ = (duk_uint8_t) (tmp & 0xff);\n\n\ttmp = tmp >> 16;\n\twhile (tmp > 0) {\n\t\ttmp--;\n\t\tdig = (duk_small_uint_t) ((cp >> (4 * tmp)) & 0x0f);\n\t\t*q++ = duk_lc_digits[dig];\n\t}\n\n\treturn q;\n}\n\nDUK_LOCAL void duk__enc_key_autoquote(duk_json_enc_ctx *js_ctx, duk_hstring *k) {\n\tconst duk_int8_t *p, *p_start, *p_end;  /* Note: intentionally signed. */\n\tduk_size_t k_len;\n\tduk_codepoint_t cp;\n\n\tDUK_ASSERT(k != NULL);\n\n\t/* Accept ASCII strings which conform to identifier requirements\n\t * as being emitted without key quotes.  Since we only accept ASCII\n\t * there's no need for actual decoding: 'p' is intentionally signed\n\t * so that bytes >= 0x80 extend to negative values and are rejected\n\t * as invalid identifier codepoints.\n\t */\n\n\tif (js_ctx->flag_avoid_key_quotes) {\n\t\tk_len = DUK_HSTRING_GET_BYTELEN(k);\n\t\tp_start = (const duk_int8_t *) DUK_HSTRING_GET_DATA(k);\n\t\tp_end = p_start + k_len;\n\t\tp = p_start;\n\n\t\tif (p == p_end) {\n\t\t\t/* Zero length string is not accepted without quotes */\n\t\t\tgoto quote_normally;\n\t\t}\n\t\tcp = (duk_codepoint_t) (*p++);\n\t\tif (DUK_UNLIKELY(!duk_unicode_is_identifier_start(cp))) {\n\t\t\tgoto quote_normally;\n\t\t}\n\t\twhile (p < p_end) {\n\t\t\tcp = (duk_codepoint_t) (*p++);\n\t\t\tif (DUK_UNLIKELY(!duk_unicode_is_identifier_part(cp))) {\n\t\t\t\tgoto quote_normally;\n\t\t\t}\n\t\t}\n\n\t\t/* This seems faster than emitting bytes one at a time and\n\t\t * then potentially rewinding.\n\t\t */\n\t\tDUK__EMIT_HSTR(js_ctx, k);\n\t\treturn;\n\t}\n\n quote_normally:\n\tduk__enc_quote_string(js_ctx, k);\n}\n\n/* The Quote(value) operation: quote a string.\n *\n * Stack policy: [ ] -> [ ].\n */\n\nDUK_LOCAL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str) {\n\tduk_hthread *thr = js_ctx->thr;\n\tconst duk_uint8_t *p, *p_start, *p_end, *p_now, *p_tmp;\n\tduk_uint8_t *q;\n\tduk_ucodepoint_t cp;  /* typed for duk_unicode_decode_xutf8() */\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__enc_quote_string: h_str=%!O\", (duk_heaphdr *) h_str));\n\n\tDUK_ASSERT(h_str != NULL);\n\tp_start = DUK_HSTRING_GET_DATA(h_str);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_str);\n\tp = p_start;\n\n\tDUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE);\n\n\t/* Encode string in small chunks, estimating the maximum expansion so that\n\t * there's no need to ensure space while processing the chunk.\n\t */\n\n\twhile (p < p_end) {\n\t\tduk_size_t left, now, space;\n\n\t\tleft = (duk_size_t) (p_end - p);\n\t\tnow = (left > DUK__JSON_ENCSTR_CHUNKSIZE ?\n\t\t       DUK__JSON_ENCSTR_CHUNKSIZE : left);\n\n\t\t/* Maximum expansion per input byte is 6:\n\t\t *   - invalid UTF-8 byte causes \"\\uXXXX\" to be emitted (6/1 = 6).\n\t\t *   - 2-byte UTF-8 encodes as \"\\uXXXX\" (6/2 = 3).\n\t\t *   - 4-byte UTF-8 encodes as \"\\Uxxxxxxxx\" (10/4 = 2.5).\n\t\t */\n\t\tspace = now * 6;\n\t\tq = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space);\n\n\t\tp_now = p + now;\n\n\t\twhile (p < p_now) {\n#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH)\n\t\t\tduk_uint8_t b;\n\n\t\t\tb = duk__json_quotestr_lookup[*p++];\n\t\t\tif (DUK_LIKELY(b < 0x80)) {\n\t\t\t\t/* Most input bytes go through here. */\n\t\t\t\t*q++ = b;\n\t\t\t} else if (b >= 0xa0) {\n\t\t\t\t*q++ = DUK_ASC_BACKSLASH;\n\t\t\t\t*q++ = (duk_uint8_t) (b - 0x80);\n\t\t\t} else if (b == 0x80) {\n\t\t\t\tcp = (duk_ucodepoint_t) (*(p - 1));\n\t\t\t\tq = duk__emit_esc_auto_fast(js_ctx, cp, q);\n\t\t\t} else if (b == 0x7f && js_ctx->flag_ascii_only) {\n\t\t\t\t/* 0x7F is special */\n\t\t\t\tDUK_ASSERT(b == 0x81);\n\t\t\t\tcp = (duk_ucodepoint_t) 0x7f;\n\t\t\t\tq = duk__emit_esc_auto_fast(js_ctx, cp, q);\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(b == 0x81);\n\t\t\t\tp--;\n\n\t\t\t\t/* slow path is shared */\n#else  /* DUK_USE_JSON_QUOTESTRING_FASTPATH */\n\t\t\tcp = *p;\n\n\t\t\tif (DUK_LIKELY(cp <= 0x7f)) {\n\t\t\t\t/* ascii fast path: avoid decoding utf-8 */\n\t\t\t\tp++;\n\t\t\t\tif (cp == 0x22 || cp == 0x5c) {\n\t\t\t\t\t/* double quote or backslash */\n\t\t\t\t\t*q++ = DUK_ASC_BACKSLASH;\n\t\t\t\t\t*q++ = (duk_uint8_t) cp;\n\t\t\t\t} else if (cp < 0x20) {\n\t\t\t\t\tduk_uint_fast8_t esc_char;\n\n\t\t\t\t\t/* This approach is a bit shorter than a straight\n\t\t\t\t\t * if-else-ladder and also a bit faster.\n\t\t\t\t\t */\n\t\t\t\t\tif (cp < (sizeof(duk__json_quotestr_esc) / sizeof(duk_uint8_t)) &&\n\t\t\t\t\t    (esc_char = duk__json_quotestr_esc[cp]) != 0) {\n\t\t\t\t\t\t*q++ = DUK_ASC_BACKSLASH;\n\t\t\t\t\t\t*q++ = (duk_uint8_t) esc_char;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tq = duk__emit_esc_auto_fast(js_ctx, cp, q);\n\t\t\t\t\t}\n\t\t\t\t} else if (cp == 0x7f && js_ctx->flag_ascii_only) {\n\t\t\t\t\tq = duk__emit_esc_auto_fast(js_ctx, cp, q);\n\t\t\t\t} else {\n\t\t\t\t\t/* any other printable -> as is */\n\t\t\t\t\t*q++ = (duk_uint8_t) cp;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* slow path is shared */\n#endif  /* DUK_USE_JSON_QUOTESTRING_FASTPATH */\n\n\t\t\t\t/* slow path decode */\n\n\t\t\t\t/* If XUTF-8 decoding fails, treat the offending byte as a codepoint directly\n\t\t\t\t * and go forward one byte.  This is of course very lossy, but allows some kind\n\t\t\t\t * of output to be produced even for internal strings which don't conform to\n\t\t\t\t * XUTF-8.  All standard Ecmascript strings are always CESU-8, so this behavior\n\t\t\t\t * does not violate the Ecmascript specification.  The behavior is applied to\n\t\t\t\t * all modes, including Ecmascript standard JSON.  Because the current XUTF-8\n\t\t\t\t * decoding is not very strict, this behavior only really affects initial bytes\n\t\t\t\t * and truncated codepoints.\n\t\t\t\t *\n\t\t\t\t * Another alternative would be to scan forwards to start of next codepoint\n\t\t\t\t * (or end of input) and emit just one replacement codepoint.\n\t\t\t\t */\n\n\t\t\t\tp_tmp = p;\n\t\t\t\tif (!duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) {\n\t\t\t\t\t/* Decode failed. */\n\t\t\t\t\tcp = *p_tmp;\n\t\t\t\t\tp = p_tmp + 1;\n\t\t\t\t}\n\n#if defined(DUK_USE_NONSTD_JSON_ESC_U2028_U2029)\n\t\t\t\tif (js_ctx->flag_ascii_only || cp == 0x2028 || cp == 0x2029) {\n#else\n\t\t\t\tif (js_ctx->flag_ascii_only) {\n#endif\n\t\t\t\t\tq = duk__emit_esc_auto_fast(js_ctx, cp, q);\n\t\t\t\t} else {\n\t\t\t\t\t/* as is */\n\t\t\t\t\tDUK_RAW_WRITE_XUTF8(q, cp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tDUK_BW_SET_PTR(thr, &js_ctx->bw, q);\n\t}\n\n\tDUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE);\n}\n\n/* Encode a double (checked by caller) from stack top.  Stack top may be\n * replaced by serialized string but is not popped (caller does that).\n */\nDUK_LOCAL void duk__enc_double(duk_json_enc_ctx *js_ctx) {\n\tduk_hthread *thr;\n\tduk_tval *tv;\n\tduk_double_t d;\n\tduk_small_int_t c;\n\tduk_small_int_t s;\n\tduk_small_uint_t stridx;\n\tduk_small_uint_t n2s_flags;\n\tduk_hstring *h_str;\n\n\tDUK_ASSERT(js_ctx != NULL);\n\tthr = js_ctx->thr;\n\tDUK_ASSERT(thr != NULL);\n\n\t/* Caller must ensure 'tv' is indeed a double and not a fastint! */\n\ttv = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tDUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));\n\td = DUK_TVAL_GET_DOUBLE(tv);\n\n\tc = (duk_small_int_t) DUK_FPCLASSIFY(d);\n\ts = (duk_small_int_t) DUK_SIGNBIT(d);\n\tDUK_UNREF(s);\n\n\tif (DUK_LIKELY(!(c == DUK_FP_INFINITE || c == DUK_FP_NAN))) {\n\t\tDUK_ASSERT(DUK_ISFINITE(d));\n\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\t/* Negative zero needs special handling in JX/JC because\n\t\t * it would otherwise serialize to '0', not '-0'.\n\t\t */\n\t\tif (DUK_UNLIKELY(c == DUK_FP_ZERO && s != 0 &&\n\t\t                 (js_ctx->flag_ext_custom_or_compatible))) {\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_ZERO);  /* '-0' */\n\t\t} else\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n\t\t{\n\t\t\tn2s_flags = 0;\n\t\t\t/* [ ... number ] -> [ ... string ] */\n\t\t\tduk_numconv_stringify(thr, 10 /*radix*/, 0 /*digits*/, n2s_flags);\n\t\t}\n\t\th_str = duk_known_hstring(thr, -1);\n\t\tDUK__EMIT_HSTR(js_ctx, h_str);\n\t\treturn;\n\t}\n\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tif (!(js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |\n\t                       DUK_JSON_FLAG_EXT_COMPATIBLE))) {\n\t\tstridx = DUK_STRIDX_LC_NULL;\n\t} else if (c == DUK_FP_NAN) {\n\t\tstridx = js_ctx->stridx_custom_nan;\n\t} else if (s == 0) {\n\t\tstridx = js_ctx->stridx_custom_posinf;\n\t} else {\n\t\tstridx = js_ctx->stridx_custom_neginf;\n\t}\n#else\n\tstridx = DUK_STRIDX_LC_NULL;\n#endif\n\tDUK__EMIT_STRIDX(js_ctx, stridx);\n}\n\n#if defined(DUK_USE_FASTINT)\n/* Encode a fastint from duk_tval ptr, no value stack effects. */\nDUK_LOCAL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv) {\n\tduk_int64_t v;\n\n\t/* Fastint range is signed 48-bit so longest value is -2^47 = -140737488355328\n\t * (16 chars long), longest signed 64-bit value is -2^63 = -9223372036854775808\n\t * (20 chars long).  Alloc space for 64-bit range to be safe.\n\t */\n\tduk_uint8_t buf[20 + 1];\n\n\t/* Caller must ensure 'tv' is indeed a fastint! */\n\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));\n\tv = DUK_TVAL_GET_FASTINT(tv);\n\n\t/* XXX: There are no format strings in duk_config.h yet, could add\n\t * one for formatting duk_int64_t.  For now, assumes \"%lld\" and that\n\t * \"long long\" type exists.  Could also rely on C99 directly but that\n\t * won't work for older MSVC.\n\t */\n\tDUK_SPRINTF((char *) buf, \"%lld\", (long long) v);\n\tDUK__EMIT_CSTR(js_ctx, (const char *) buf);\n}\n#endif\n\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n#if defined(DUK_USE_HEX_FASTPATH)\nDUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) {\n\tduk_uint8_t *q;\n\tduk_uint16_t *q16;\n\tduk_small_uint_t x;\n\tduk_size_t i, len_safe;\n#if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)\n\tduk_bool_t shift_dst;\n#endif\n\n\t/* Unlike in duk_hex_encode() 'dst' is not necessarily aligned by 2.\n\t * For platforms where unaligned accesses are not allowed, shift 'dst'\n\t * ahead by 1 byte to get alignment and then DUK_MEMMOVE() the result\n\t * in place.  The faster encoding loop makes up the difference.\n\t * There's always space for one extra byte because a terminator always\n\t * follows the hex data and that's been accounted for by the caller.\n\t */\n\n#if defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)\n\tq16 = (duk_uint16_t *) (void *) dst;\n#else\n\tshift_dst = (duk_bool_t) (((duk_size_t) dst) & 0x01U);\n\tif (shift_dst) {\n\t\tDUK_DD(DUK_DDPRINT(\"unaligned accesses not possible, dst not aligned -> step to dst + 1\"));\n\t\tq16 = (duk_uint16_t *) (void *) (dst + 1);\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"unaligned accesses not possible, dst is aligned\"));\n\t\tq16 = (duk_uint16_t *) (void *) dst;\n\t}\n\tDUK_ASSERT((((duk_size_t) q16) & 0x01U) == 0);\n#endif\n\n\tlen_safe = src_len & ~0x03U;\n\tfor (i = 0; i < len_safe; i += 4) {\n\t\tq16[0] = duk_hex_enctab[src[i]];\n\t\tq16[1] = duk_hex_enctab[src[i + 1]];\n\t\tq16[2] = duk_hex_enctab[src[i + 2]];\n\t\tq16[3] = duk_hex_enctab[src[i + 3]];\n\t\tq16 += 4;\n\t}\n\tq = (duk_uint8_t *) q16;\n\n#if !defined(DUK_USE_UNALIGNED_ACCESSES_POSSIBLE)\n\tif (shift_dst) {\n\t\tq--;\n\t\tDUK_MEMMOVE((void *) dst, (const void *) (dst + 1), 2 * len_safe);\n\t\tDUK_ASSERT(dst + 2 * len_safe == q);\n\t}\n#endif\n\n\tfor (; i < src_len; i++) {\n\t\tx = src[i];\n\t\t*q++ = duk_lc_digits[x >> 4];\n\t\t*q++ = duk_lc_digits[x & 0x0f];\n\t}\n\n\treturn q;\n}\n#else  /* DUK_USE_HEX_FASTPATH */\nDUK_LOCAL duk_uint8_t *duk__enc_buffer_data_hex(const duk_uint8_t *src, duk_size_t src_len, duk_uint8_t *dst) {\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_end;\n\tduk_uint8_t *q;\n\tduk_small_uint_t x;\n\n\tp = src;\n\tp_end = src + src_len;\n\tq = dst;\n\twhile (p != p_end) {\n\t\tx = *p++;\n\t\t*q++ = duk_lc_digits[x >> 4];\n\t\t*q++ = duk_lc_digits[x & 0x0f];\n\t}\n\n\treturn q;\n}\n#endif  /* DUK_USE_HEX_FASTPATH */\n\nDUK_LOCAL void duk__enc_buffer_data(duk_json_enc_ctx *js_ctx, duk_uint8_t *buf_data, duk_size_t buf_len) {\n\tduk_hthread *thr;\n\tduk_uint8_t *q;\n\tduk_size_t space;\n\n\tthr = js_ctx->thr;\n\n\tDUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);  /* caller checks */\n\tDUK_ASSERT(js_ctx->flag_ext_custom_or_compatible);\n\n\t/* Buffer values are encoded in (lowercase) hex to make the\n\t * binary data readable.  Base64 or similar would be more\n\t * compact but less readable, and the point of JX/JC\n\t * variants is to be as useful to a programmer as possible.\n\t */\n\n\t/* The #if defined() clutter here needs to handle the three\n\t * cases: (1) JX+JC, (2) JX only, (3) JC only.\n\t */\n\n\t/* Note: space must cater for both JX and JC. */\n\tspace = 9 + buf_len * 2 + 2;\n\tDUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7ffffffeUL);\n\tDUK_ASSERT((space - 2) / 2 >= buf_len);  /* overflow not possible, buffer limits */\n\tq = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space);\n\n#if defined(DUK_USE_JX) && defined(DUK_USE_JC)\n\tif (js_ctx->flag_ext_custom)\n#endif\n#if defined(DUK_USE_JX)\n\t{\n\t\t*q++ = DUK_ASC_PIPE;\n\t\tq = duk__enc_buffer_data_hex(buf_data, buf_len, q);\n\t\t*q++ = DUK_ASC_PIPE;\n\n\t}\n#endif\n#if defined(DUK_USE_JX) && defined(DUK_USE_JC)\n\telse\n#endif\n#if defined(DUK_USE_JC)\n\t{\n\t\tDUK_ASSERT(js_ctx->flag_ext_compatible);\n\t\tDUK_MEMCPY((void *) q, (const void *) \"{\\\"_buf\\\":\\\"\", 9);  /* len: 9 */\n\t\tq += 9;\n\t\tq = duk__enc_buffer_data_hex(buf_data, buf_len, q);\n\t\t*q++ = DUK_ASC_DOUBLEQUOTE;\n\t\t*q++ = DUK_ASC_RCURLY;\n\t}\n#endif\n\n\tDUK_BW_SET_PTR(thr, &js_ctx->bw, q);\n}\n\nDUK_LOCAL void duk__enc_buffer_jx_jc(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) {\n\tduk__enc_buffer_data(js_ctx,\n\t                     (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h),\n\t                     (duk_size_t) DUK_HBUFFER_GET_SIZE(h));\n}\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n\n#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)\nDUK_LOCAL void duk__enc_buffer_json_fastpath(duk_json_enc_ctx *js_ctx, duk_hbuffer *h) {\n\tduk_size_t i, n;\n\tconst duk_uint8_t *buf;\n\tduk_uint8_t *q;\n\n\tn = DUK_HBUFFER_GET_SIZE(h);\n\tif (n == 0) {\n\t\tDUK__EMIT_2(js_ctx, DUK_ASC_LCURLY, DUK_ASC_RCURLY);\n\t\treturn;\n\t}\n\n\tDUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);\n\n\t/* Maximum encoded length with 32-bit index: 1 + 10 + 2 + 3 + 1 + 1 = 18,\n\t * with 64-bit index: 1 + 20 + 2 + 3 + 1 + 1 = 28.  32 has some slack.\n\t *\n\t * Note that because the output buffer is reallocated from time to time,\n\t * side effects (such as finalizers) affecting the buffer 'h' must be\n\t * disabled.  This is the case in the JSON.stringify() fast path.\n\t */\n\n\tbuf = (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(js_ctx->thr->heap, h);\n\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth + 1);\n\t\t\tq = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, 32);\n\t\t\tq += DUK_SPRINTF((char *) q, \"\\\"%lu\\\": %u,\", (unsigned long) i, (unsigned int) buf[i]);\n\t\t\tDUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q);\n\t\t}\n\t} else {\n\t\tq = DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw);\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tq = DUK_BW_ENSURE_RAW(js_ctx->thr, &js_ctx->bw, 32, q);\n\t\t\tq += DUK_SPRINTF((char *) q, \"\\\"%lu\\\":%u,\", (unsigned long) i, (unsigned int) buf[i]);\n\t\t}\n\t\tDUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, q);\n\t}\n\tDUK__UNEMIT_1(js_ctx);  /* eat trailing comma */\n\n\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);\n\t}\n\tDUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);\n}\n#endif  /* DUK_USE_JSON_STRINGIFY_FASTPATH */\n\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\nDUK_LOCAL void duk__enc_pointer(duk_json_enc_ctx *js_ctx, void *ptr) {\n\tchar buf[64];  /* XXX: how to figure correct size? */\n\tconst char *fmt;\n\n\tDUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);  /* caller checks */\n\tDUK_ASSERT(js_ctx->flag_ext_custom_or_compatible);\n\n\tDUK_MEMZERO(buf, sizeof(buf));\n\n\t/* The #if defined() clutter here needs to handle the three\n\t * cases: (1) JX+JC, (2) JX only, (3) JC only.\n\t */\n#if defined(DUK_USE_JX) && defined(DUK_USE_JC)\n\tif (js_ctx->flag_ext_custom)\n#endif\n#if defined(DUK_USE_JX)\n\t{\n\t\tfmt = ptr ? \"(%p)\" : \"(null)\";\n\t}\n#endif\n#if defined(DUK_USE_JX) && defined(DUK_USE_JC)\n\telse\n#endif\n#if defined(DUK_USE_JC)\n\t{\n\t\tDUK_ASSERT(js_ctx->flag_ext_compatible);\n\t\tfmt = ptr ? \"{\\\"_ptr\\\":\\\"%p\\\"}\" : \"{\\\"_ptr\\\":\\\"null\\\"}\";\n\t}\n#endif\n\n\t/* When ptr == NULL, the format argument is unused. */\n\tDUK_SNPRINTF(buf, sizeof(buf) - 1, fmt, ptr);  /* must not truncate */\n\tDUK__EMIT_CSTR(js_ctx, buf);\n}\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\nDUK_LOCAL void duk__enc_bufobj(duk_json_enc_ctx *js_ctx, duk_hbufobj *h_bufobj) {\n\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\tif (h_bufobj->buf == NULL || !DUK_HBUFOBJ_VALID_SLICE(h_bufobj)) {\n\t\tDUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);\n\t} else {\n\t\t/* Handle both full and partial slice (as long as covered). */\n\t\tduk__enc_buffer_data(js_ctx,\n\t\t                     (duk_uint8_t *) DUK_HBUFOBJ_GET_SLICE_BASE(js_ctx->thr->heap, h_bufobj),\n\t\t                     (duk_size_t) h_bufobj->length);\n\t}\n}\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/* Indent helper.  Calling code relies on js_ctx->recursion_depth also being\n * directly related to indent depth.\n */\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) {\n\tDUK_ASSERT(js_ctx->h_gap != NULL);\n\tDUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0);  /* caller guarantees */\n\n\tDUK__EMIT_1(js_ctx, 0x0a);\n\twhile (depth-- > 0) {\n\t\tDUK__EMIT_HSTR(js_ctx, js_ctx->h_gap);\n\t}\n}\n#else  /* DUK_USE_PREFER_SIZE */\nDUK_LOCAL void duk__enc_newline_indent(duk_json_enc_ctx *js_ctx, duk_uint_t depth) {\n\tconst duk_uint8_t *gap_data;\n\tduk_size_t gap_len;\n\tduk_size_t avail_bytes;   /* bytes of indent available for copying */\n\tduk_size_t need_bytes;    /* bytes of indent still needed */\n\tduk_uint8_t *p_start;\n\tduk_uint8_t *p;\n\n\tDUK_ASSERT(js_ctx->h_gap != NULL);\n\tDUK_ASSERT(DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) > 0);  /* caller guarantees */\n\n\tDUK__EMIT_1(js_ctx, 0x0a);\n\tif (DUK_UNLIKELY(depth == 0)) {\n\t\treturn;\n\t}\n\n\t/* To handle deeper indents efficiently, make use of copies we've\n\t * already emitted.  In effect we can emit a sequence of 1, 2, 4,\n\t * 8, etc copies, and then finish the last run.  Byte counters\n\t * avoid multiply with gap_len on every loop.\n\t */\n\n\tgap_data = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(js_ctx->h_gap);\n\tgap_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap);\n\tDUK_ASSERT(gap_len > 0);\n\n\tneed_bytes = gap_len * depth;\n\tp = DUK_BW_ENSURE_GETPTR(js_ctx->thr, &js_ctx->bw, need_bytes);\n\tp_start = p;\n\n\tDUK_MEMCPY((void *) p, (const void *) gap_data, (size_t) gap_len);\n\tp += gap_len;\n\tavail_bytes = gap_len;\n\tDUK_ASSERT(need_bytes >= gap_len);\n\tneed_bytes -= gap_len;\n\n\twhile (need_bytes >= avail_bytes) {\n\t\tDUK_MEMCPY((void *) p, (const void *) p_start, (size_t) avail_bytes);\n\t\tp += avail_bytes;\n\t\tneed_bytes -= avail_bytes;\n\t\tavail_bytes <<= 1;\n\t}\n\n\tDUK_ASSERT(need_bytes < avail_bytes);  /* need_bytes may be zero */\n\tDUK_MEMCPY((void *) p, (const void *) p_start, (size_t) need_bytes);\n\tp += need_bytes;\n\t/*avail_bytes += need_bytes*/\n\n\tDUK_BW_SET_PTR(js_ctx->thr, &js_ctx->bw, p);\n}\n#endif  /* DUK_USE_PREFER_SIZE */\n\n/* Shared entry handling for object/array serialization. */\nDUK_LOCAL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_hobject *h_target;\n\tduk_uint_fast32_t i, n;\n\n\t*entry_top = duk_get_top(thr);\n\n\tduk_require_stack(thr, DUK_JSON_ENC_REQSTACK);\n\n\t/* Loop check using a hybrid approach: a fixed-size visited[] array\n\t * with overflow in a loop check object.\n\t */\n\n\th_target = duk_known_hobject(thr, -1);  /* object or array */\n\n\tn = js_ctx->recursion_depth;\n\tif (DUK_UNLIKELY(n > DUK_JSON_ENC_LOOPARRAY)) {\n\t\tn = DUK_JSON_ENC_LOOPARRAY;\n\t}\n\tfor (i = 0; i < n; i++) {\n\t\tif (DUK_UNLIKELY(js_ctx->visiting[i] == h_target)) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"slow path loop detect\"));\n\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT);\n\t\t}\n\t}\n\tif (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) {\n\t\tjs_ctx->visiting[js_ctx->recursion_depth] = h_target;\n\t} else {\n\t\tduk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target);\n\t\tduk_dup_top(thr);  /* -> [ ... voidp voidp ] */\n\t\tif (duk_has_prop(thr, js_ctx->idx_loop)) {\n\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_CYCLIC_INPUT);\n\t\t}\n\t\tduk_push_true(thr);  /* -> [ ... voidp true ] */\n\t\tduk_put_prop(thr, js_ctx->idx_loop);  /* -> [ ... ] */\n\t}\n\n\t/* C recursion check. */\n\n\tDUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0);  /* unsigned */\n\tDUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);\n\tif (js_ctx->recursion_depth >= js_ctx->recursion_limit) {\n\t\tDUK_ERROR_RANGE(thr, DUK_STR_JSONENC_RECLIMIT);\n\t}\n\tjs_ctx->recursion_depth++;\n\n\tDUK_DDD(DUK_DDDPRINT(\"shared entry finished: top=%ld, loop=%!T\",\n\t                     (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop)));\n}\n\n/* Shared exit handling for object/array serialization. */\nDUK_LOCAL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_idx_t *entry_top) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_hobject *h_target;\n\n\t/* C recursion check. */\n\n\tDUK_ASSERT(js_ctx->recursion_depth > 0);\n\tDUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);\n\tjs_ctx->recursion_depth--;\n\n\t/* Loop check. */\n\n\th_target = duk_known_hobject(thr, *entry_top - 1);  /* original target at entry_top - 1 */\n\n\tif (js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY) {\n\t\t/* Previous entry was inside visited[], nothing to do. */\n\t} else {\n\t\tduk_push_sprintf(thr, DUK_STR_FMT_PTR, (void *) h_target);\n\t\tduk_del_prop(thr, js_ctx->idx_loop);  /* -> [ ... ] */\n\t}\n\n\t/* Restore stack top after unbalanced code paths. */\n\tduk_set_top(thr, *entry_top);\n\n\tDUK_DDD(DUK_DDDPRINT(\"shared entry finished: top=%ld, loop=%!T\",\n\t                     (long) duk_get_top(thr), (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop)));\n}\n\n/* The JO(value) operation: encode object.\n *\n * Stack policy: [ object ] -> [ object ].\n */\nDUK_LOCAL void duk__enc_object(duk_json_enc_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_hstring *h_key;\n\tduk_idx_t entry_top;\n\tduk_idx_t idx_obj;\n\tduk_idx_t idx_keys;\n\tduk_bool_t emitted;\n\tduk_uarridx_t arr_len, i;\n\tduk_size_t prev_size;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__enc_object: obj=%!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\n\tduk__enc_objarr_entry(js_ctx, &entry_top);\n\n\tidx_obj = entry_top - 1;\n\n\tif (js_ctx->idx_proplist >= 0) {\n\t\tidx_keys = js_ctx->idx_proplist;\n\t} else {\n\t\t/* XXX: would be nice to enumerate an object at specified index */\n\t\tduk_dup(thr, idx_obj);\n\t\t(void) duk_hobject_get_enumerated_keys(thr, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/);  /* [ ... target ] -> [ ... target keys ] */\n\t\tidx_keys = duk_require_normalize_index(thr, -1);\n\t\t/* leave stack unbalanced on purpose */\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"idx_keys=%ld, h_keys=%!T\",\n\t                     (long) idx_keys, (duk_tval *) duk_get_tval(thr, idx_keys)));\n\n\t/* Steps 8-10 have been merged to avoid a \"partial\" variable. */\n\n\tDUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);\n\n\t/* XXX: keys is an internal object with all keys to be processed\n\t * in its (gapless) array part.  Because nobody can touch the keys\n\t * object, we could iterate its array part directly (keeping in mind\n\t * that it can be reallocated).\n\t */\n\n\tarr_len = (duk_uarridx_t) duk_get_length(thr, idx_keys);\n\temitted = 0;\n\tfor (i = 0; i < arr_len; i++) {\n\t\tduk_get_prop_index(thr, idx_keys, i);  /* -> [ ... key ] */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"object property loop: holder=%!T, key=%!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, idx_obj),\n\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t\th_key = duk_known_hstring(thr, -1);\n\t\tDUK_ASSERT(h_key != NULL);\n\t\tDUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(h_key));  /* proplist filtering; enum options */\n\n\t\tprev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw);\n\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);\n\t\t\tduk__enc_key_autoquote(js_ctx, h_key);\n\t\t\tDUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE);\n\t\t} else {\n\t\t\tduk__enc_key_autoquote(js_ctx, h_key);\n\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_COLON);\n\t\t}\n\n\t\t/* [ ... key ] */\n\n\t\tif (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_obj) == 0)) {\n\t\t\t/* Value would yield 'undefined', so skip key altogether.\n\t\t\t * Side effects have already happened.\n\t\t\t */\n\t\t\tDUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size);\n\t\t} else {\n\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_COMMA);\n\t\t\temitted = 1;\n\t\t}\n\n\t\t/* [ ... ] */\n\t}\n\n\tif (emitted) {\n\t\tDUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);\n\t\tDUK__UNEMIT_1(js_ctx);  /* eat trailing comma */\n\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\tDUK_ASSERT(js_ctx->recursion_depth >= 1);\n\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);\n\t\t}\n\t}\n\tDUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);\n\n\tduk__enc_objarr_exit(js_ctx, &entry_top);\n\n\tDUK_ASSERT_TOP(thr, entry_top);\n}\n\n/* The JA(value) operation: encode array.\n *\n * Stack policy: [ array ] -> [ array ].\n */\nDUK_LOCAL void duk__enc_array(duk_json_enc_ctx *js_ctx) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_idx_t entry_top;\n\tduk_idx_t idx_arr;\n\tduk_bool_t emitted;\n\tduk_uarridx_t i, arr_len;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__enc_array: array=%!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tduk__enc_objarr_entry(js_ctx, &entry_top);\n\n\tidx_arr = entry_top - 1;\n\n\t/* Steps 8-10 have been merged to avoid a \"partial\" variable. */\n\n\tDUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET);\n\n\tarr_len = (duk_uarridx_t) duk_get_length(thr, idx_arr);\n\temitted = 0;\n\tfor (i = 0; i < arr_len; i++) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"array entry loop: array=%!T, index=%ld, arr_len=%ld\",\n\t\t                     (duk_tval *) duk_get_tval(thr, idx_arr),\n\t\t                     (long) i, (long) arr_len));\n\n\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\tDUK_ASSERT(js_ctx->recursion_depth >= 1);\n\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);\n\t\t}\n\n\t\t(void) duk_push_uint_to_hstring(thr, (duk_uint_t) i);  /* -> [ ... key ] */\n\n\t\t/* [ ... key ] */\n\n\t\tif (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_arr) == 0)) {\n\t\t\t/* Value would normally be omitted, replace with 'null'. */\n\t\t\tDUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);\n\t\t} else {\n\t\t\t;\n\t\t}\n\n\t\t/* [ ... ] */\n\n\t\tDUK__EMIT_1(js_ctx, DUK_ASC_COMMA);\n\t\temitted = 1;\n\t}\n\n\tif (emitted) {\n\t\tDUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);\n\t\tDUK__UNEMIT_1(js_ctx);  /* eat trailing comma */\n\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\tDUK_ASSERT(js_ctx->recursion_depth >= 1);\n\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);\n\t\t}\n\t}\n\tDUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET);\n\n\tduk__enc_objarr_exit(js_ctx, &entry_top);\n\n\tDUK_ASSERT_TOP(thr, entry_top);\n}\n\n/* The Str(key, holder) operation.\n *\n * Stack policy: [ ... key ] -> [ ... ]\n */\nDUK_LOCAL duk_bool_t duk__enc_value(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder) {\n\tduk_hthread *thr = js_ctx->thr;\n\tduk_tval *tv;\n\tduk_tval *tv_holder;\n\tduk_tval *tv_key;\n\tduk_small_int_t c;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__enc_value: idx_holder=%ld, holder=%!T, key=%!T\",\n\t                     (long) idx_holder, (duk_tval *) duk_get_tval(thr, idx_holder),\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\ttv_holder = DUK_GET_TVAL_POSIDX(thr, idx_holder);\n\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_holder));\n\ttv_key = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv_key));\n\tDUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(DUK_TVAL_GET_STRING(tv_key)));  /* Caller responsible. */\n\t(void) duk_hobject_getprop(thr, tv_holder, tv_key);\n\n\t/* -> [ ... key val ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"value=%!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/* Standard JSON checks for .toJSON() only for actual objects; for\n\t * example, setting Number.prototype.toJSON and then serializing a\n\t * number won't invoke the .toJSON() method.  However, lightfuncs and\n\t * plain buffers mimic objects so we check for their .toJSON() method.\n\t */\n\tif (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT |\n\t                                 DUK_TYPE_MASK_LIGHTFUNC |\n\t                                 DUK_TYPE_MASK_BUFFER)) {\n\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_TO_JSON);\n\t\tif (duk_is_callable(thr, -1)) {  /* toJSON() can also be a lightfunc */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"value is object, has callable toJSON() -> call it\"));\n\t\t\t/* XXX: duk_dup_unvalidated(thr, -2) etc. */\n\t\t\tduk_dup_m2(thr);          /* -> [ ... key val toJSON val ] */\n\t\t\tduk_dup_m4(thr);          /* -> [ ... key val toJSON val key ] */\n\t\t\tduk_call_method(thr, 1);  /* -> [ ... key val val' ] */\n\t\t\tduk_remove_m2(thr);       /* -> [ ... key val' ] */\n\t\t} else {\n\t\t\tduk_pop(thr);             /* -> [ ... key val ] */\n\t\t}\n\t}\n\n\t/* [ ... key val ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"value=%!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\n\tif (js_ctx->h_replacer) {\n\t\t/* XXX: Here a \"slice copy\" would be useful. */\n\t\tDUK_DDD(DUK_DDDPRINT(\"replacer is set, call replacer\"));\n\t\tduk_push_hobject(thr, js_ctx->h_replacer);  /* -> [ ... key val replacer ] */\n\t\tduk_dup(thr, idx_holder);                   /* -> [ ... key val replacer holder ] */\n\t\tduk_dup_m4(thr);                            /* -> [ ... key val replacer holder key ] */\n\t\tduk_dup_m4(thr);                            /* -> [ ... key val replacer holder key val ] */\n\t\tduk_call_method(thr, 2);                    /* -> [ ... key val val' ] */\n\t\tduk_remove_m2(thr);                         /* -> [ ... key val' ] */\n\t}\n\n\t/* [ ... key val ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"value=%!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\n\ttv = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h;\n\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\tif (DUK_HOBJECT_IS_BUFOBJ(h) &&\n\t\t    js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE)) {\n\t\t\t/* With JX/JC a bufferobject gets serialized specially. */\n\t\t\tduk_hbufobj *h_bufobj;\n\t\t\th_bufobj = (duk_hbufobj *) h;\n\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\t\t\tduk__enc_bufobj(js_ctx, h_bufobj);\n\t\t\tgoto pop2_emitted;\n\t\t}\n\t\t/* Otherwise bufferobjects get serialized as normal objects. */\n#endif  /* JX || JC */\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\t\tc = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h);\n\t\tswitch (c) {\n\t\tcase DUK_HOBJECT_CLASS_NUMBER: {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"value is a Number object -> coerce with ToNumber()\"));\n\t\t\tduk_to_number_m1(thr);\n\t\t\t/* The coercion potentially invokes user .valueOf() and .toString()\n\t\t\t * but can't result in a function value because ToPrimitive() would\n\t\t\t * reject such a result: test-dev-json-stringify-coercion-1.js.\n\t\t\t */\n\t\t\tDUK_ASSERT(!duk_is_callable(thr, -1));\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_HOBJECT_CLASS_STRING: {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"value is a String object -> coerce with ToString()\"));\n\t\t\tduk_to_string(thr, -1);\n\t\t\t/* Same coercion behavior as for Number. */\n\t\t\tDUK_ASSERT(!duk_is_callable(thr, -1));\n\t\t\tbreak;\n\t\t}\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\tcase DUK_HOBJECT_CLASS_POINTER:\n#endif\n\t\tcase DUK_HOBJECT_CLASS_BOOLEAN: {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"value is a Boolean/Buffer/Pointer object -> get internal value\"));\n\t\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);\n\t\t\tduk_remove_m2(thr);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\t/* Normal object which doesn't get automatically coerced to a\n\t\t\t * primitive value.  Functions are checked for specially.  The\n\t\t\t * primitive value coercions for Number, String, Pointer, and\n\t\t\t * Boolean can't result in functions so suffices to check here.\n\t\t\t * Symbol objects are handled like plain objects (their primitive\n\t\t\t * value is NOT looked up like for e.g. String objects).\n\t\t\t */\n\t\t\tDUK_ASSERT(h != NULL);\n\t\t\tif (DUK_HOBJECT_IS_CALLABLE(h)) {\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\t\t\tif (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |\n\t\t\t\t                     DUK_JSON_FLAG_EXT_COMPATIBLE)) {\n\t\t\t\t\t/* We only get here when doing non-standard JSON encoding */\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> function allowed, serialize to custom format\"));\n\t\t\t\t\tDUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);\n\t\t\t\t\tDUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);\n\t\t\t\t\tgoto pop2_emitted;\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> will result in undefined (function)\"));\n\t\t\t\t\tgoto pop2_undef;\n\t\t\t\t}\n#else  /* DUK_USE_JX || DUK_USE_JC */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> will result in undefined (function)\"));\n\t\t\t\tgoto pop2_undef;\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n\t\t\t}\n\t\t}\n\t\t}  /* end switch */\n\t}\n\n\t/* [ ... key val ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"value=%!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\n\tif (duk_check_type_mask(thr, -1, js_ctx->mask_for_undefined)) {\n\t\t/* will result in undefined */\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> will result in undefined (type mask check)\"));\n\t\tgoto pop2_undef;\n\t}\n\ttv = DUK_GET_TVAL_NEGIDX(thr, -1);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t/* When JX/JC not in use, the type mask above will avoid this case if needed. */\n\tcase DUK_TAG_UNDEFINED: {\n\t\tDUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);\n\t\tbreak;\n\t}\n#endif\n\tcase DUK_TAG_NULL: {\n\t\tDUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tDUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ?\n\t\t                 DUK_STRIDX_TRUE : DUK_STRIDX_FALSE);\n\t\tbreak;\n\t}\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t/* When JX/JC not in use, the type mask above will avoid this case if needed. */\n\tcase DUK_TAG_POINTER: {\n\t\tduk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv));\n\t\tbreak;\n\t}\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\tgoto pop2_undef;\n\t\t}\n\t\tduk__enc_quote_string(js_ctx, h);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_OBJECT: {\n\t\tduk_hobject *h = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\t/* Function values are handled completely above (including\n\t\t * coercion results):\n\t\t */\n\t\tDUK_ASSERT(!DUK_HOBJECT_IS_CALLABLE(h));\n\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) {\n\t\t\tduk__enc_array(js_ctx);\n\t\t} else {\n\t\t\tduk__enc_object(js_ctx);\n\t\t}\n\t\tbreak;\n\t}\n\t/* Because plain buffers mimics Uint8Array, they have enumerable\n\t * index properties [0,byteLength[.  Because JSON only serializes\n\t * enumerable own properties, no properties can be serialized for\n\t * plain buffers (all virtual properties are non-enumerable).  However,\n\t * there may be a .toJSON() method which was already handled above.\n\t */\n\tcase DUK_TAG_BUFFER: {\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\tif (js_ctx->flag_ext_custom_or_compatible) {\n\t\t\tduk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv));\n\t\t\tbreak;\n\t\t}\n#endif\n\n\t\t/* Could implement a fastpath, but the fast path would need\n\t\t * to handle realloc side effects correctly.\n\t\t */\n\t\tduk_to_object(thr, -1);\n\t\tduk__enc_object(js_ctx);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\t/* We only get here when doing non-standard JSON encoding */\n\t\tDUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible);\n\t\tDUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);\n#else\n\t\t/* Standard JSON omits functions */\n\t\tDUK_UNREACHABLE();\n#endif\n\t\tbreak;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n\t\t/* Number serialization has a significant impact relative to\n\t\t * other fast path code, so careful fast path for fastints.\n\t\t */\n\t\tduk__enc_fastint_tval(js_ctx, tv);\n\t\tbreak;\n#endif\n\tdefault: {\n\t\t/* number */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\t/* XXX: A fast path for usual integers would be useful when\n\t\t * fastint support is not enabled.\n\t\t */\n\t\tduk__enc_double(js_ctx);\n\t\tbreak;\n\t}\n\t}\n\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n pop2_emitted:\n#endif\n\tduk_pop_2(thr); /* [ ... key val ] -> [ ... ] */\n\treturn 1;  /* emitted */\n\n pop2_undef:\n\tduk_pop_2(thr);  /* [ ... key val ] -> [ ... ] */\n\treturn 0;  /* not emitted */\n}\n\n/* E5 Section 15.12.3, main algorithm, step 4.b.ii steps 1-4. */\nDUK_LOCAL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv) {\n\tduk_small_int_t c;\n\n\t/* XXX: some kind of external internal type checker?\n\t * - type mask; symbol flag; class mask\n\t */\n\tDUK_ASSERT(tv != NULL);\n\tif (DUK_TVAL_IS_STRING(tv)) {\n\t\tduk_hstring *h;\n\t\th = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn 1;\n\t} else if (DUK_TVAL_IS_NUMBER(tv)) {\n\t\treturn 1;\n\t} else if (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h;\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tc = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h);\n\t\tif (c == DUK_HOBJECT_CLASS_STRING || c == DUK_HOBJECT_CLASS_NUMBER) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/*\n *  JSON.stringify() fast path\n *\n *  Otherwise supports full JSON, JX, and JC features, but bails out on any\n *  possible side effect which might change the value being serialized.  The\n *  fast path can take advantage of the fact that the value being serialized\n *  is unchanged so that we can walk directly through property tables etc.\n */\n\n#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)\nDUK_LOCAL duk_bool_t duk__json_stringify_fast_value(duk_json_enc_ctx *js_ctx, duk_tval *tv) {\n\tduk_uint_fast32_t i, n;\n\n\tDUK_DDD(DUK_DDDPRINT(\"stringify fast: %!T\", tv));\n\n\tDUK_ASSERT(js_ctx != NULL);\n\tDUK_ASSERT(js_ctx->thr != NULL);\n\n#if 0 /* disabled for now */\n restart_match:\n#endif\n\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED: {\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\tif (js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible) {\n\t\t\tDUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);\n\t\t\tbreak;\n\t\t} else {\n\t\t\tgoto emit_undefined;\n\t\t}\n#else\n\t\tgoto emit_undefined;\n#endif\n\t}\n\tcase DUK_TAG_NULL: {\n\t\tDUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tDUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ?\n\t\t                 DUK_STRIDX_TRUE : DUK_STRIDX_FALSE);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *h;\n\t\th = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\tgoto emit_undefined;\n\t\t}\n\t\tduk__enc_quote_string(js_ctx, h);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_OBJECT: {\n\t\tduk_hobject *obj;\n\t\tduk_tval *tv_val;\n\t\tduk_bool_t emitted = 0;\n\t\tduk_uint32_t c_bit, c_all, c_array, c_unbox, c_undef,\n\t\t             c_func, c_bufobj, c_object, c_abort;\n\n\t\t/* For objects JSON.stringify() only looks for own, enumerable\n\t\t * properties which is nice for the fast path here.\n\t\t *\n\t\t * For arrays JSON.stringify() uses [[Get]] so it will actually\n\t\t * inherit properties during serialization!  This fast path\n\t\t * supports gappy arrays as long as there's no actual inherited\n\t\t * property (which might be a getter etc).\n\t\t *\n\t\t * Since recursion only happens for objects, we can have both\n\t\t * recursion and loop checks here.  We use a simple, depth-limited\n\t\t * loop check in the fast path because the object-based tracking\n\t\t * is very slow (when tested, it accounted for 50% of fast path\n\t\t * execution time for input data with a lot of small objects!).\n\t\t */\n\n\t\t/* XXX: for real world code, could just ignore array inheritance\n\t\t * and only look at array own properties.\n\t\t */\n\n\t\t/* We rely on a few object flag / class number relationships here,\n\t\t * assert for them.\n\t\t */\n\n\t\tobj = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(obj != NULL);\n\t\tDUK_ASSERT_HOBJECT_VALID(obj);\n\n\t\t/* Once recursion depth is increased, exit path must decrease\n\t\t * it (though it's OK to abort the fast path).\n\t\t */\n\n\t\tDUK_ASSERT_DISABLE(js_ctx->recursion_depth >= 0);  /* unsigned */\n\t\tDUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);\n\t\tif (js_ctx->recursion_depth >= js_ctx->recursion_limit) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"fast path recursion limit\"));\n\t\t\tDUK_ERROR_RANGE(js_ctx->thr, DUK_STR_JSONDEC_RECLIMIT);\n\t\t}\n\n\t\tfor (i = 0, n = (duk_uint_fast32_t) js_ctx->recursion_depth; i < n; i++) {\n\t\t\tif (DUK_UNLIKELY(js_ctx->visiting[i] == obj)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"fast path loop detect\"));\n\t\t\t\tDUK_ERROR_TYPE(js_ctx->thr, DUK_STR_CYCLIC_INPUT);\n\t\t\t}\n\t\t}\n\n\t\t/* Guaranteed by recursion_limit setup so we don't have to\n\t\t * check twice.\n\t\t */\n\t\tDUK_ASSERT(js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY);\n\t\tjs_ctx->visiting[js_ctx->recursion_depth] = obj;\n\t\tjs_ctx->recursion_depth++;\n\n\t\t/* If object has a .toJSON() property, we can't be certain\n\t\t * that it wouldn't mutate any value arbitrarily, so bail\n\t\t * out of the fast path.\n\t\t *\n\t\t * If an object is a Proxy we also can't avoid side effects\n\t\t * so abandon.\n\t\t */\n\t\t/* XXX: non-callable .toJSON() doesn't need to cause an abort\n\t\t * but does at the moment, probably not worth fixing.\n\t\t */\n\t\tif (duk_hobject_hasprop_raw(js_ctx->thr, obj, DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr)) ||\n\t\t    DUK_HOBJECT_IS_PROXY(obj)) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"object has a .toJSON property or object is a Proxy, abort fast path\"));\n\t\t\tgoto abort_fastpath;\n\t\t}\n\n\t\t/* We could use a switch-case for the class number but it turns out\n\t\t * a small if-else ladder on class masks is better.  The if-ladder\n\t\t * should be in order of relevancy.\n\t\t */\n\n\t\t/* XXX: move masks to js_ctx? they don't change during one\n\t\t * fast path invocation.\n\t\t */\n\t\tDUK_ASSERT(DUK_HOBJECT_CLASS_MAX <= 31);\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\tif (js_ctx->flag_ext_custom_or_compatible) {\n\t\t\tc_all = DUK_HOBJECT_CMASK_ALL;\n\t\t\tc_array = DUK_HOBJECT_CMASK_ARRAY;\n\t\t\tc_unbox = DUK_HOBJECT_CMASK_NUMBER |\n\t\t\t          DUK_HOBJECT_CMASK_STRING |\n\t\t\t          DUK_HOBJECT_CMASK_BOOLEAN |\n\t\t\t          DUK_HOBJECT_CMASK_POINTER;  /* Symbols are not unboxed. */\n\t\t\tc_func = DUK_HOBJECT_CMASK_FUNCTION;\n\t\t\tc_bufobj = DUK_HOBJECT_CMASK_ALL_BUFOBJS;\n\t\t\tc_undef = 0;\n\t\t\tc_abort = 0;\n\t\t\tc_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort);\n\t\t}\n\t\telse\n#endif\n\t\t{\n\t\t\tc_all = DUK_HOBJECT_CMASK_ALL;\n\t\t\tc_array = DUK_HOBJECT_CMASK_ARRAY;\n\t\t\tc_unbox = DUK_HOBJECT_CMASK_NUMBER |\n\t\t\t          DUK_HOBJECT_CMASK_STRING |\n\t\t\t          DUK_HOBJECT_CMASK_BOOLEAN;  /* Symbols are not unboxed. */\n\t\t\tc_func = 0;\n\t\t\tc_bufobj = 0;\n\t\t\tc_undef = DUK_HOBJECT_CMASK_FUNCTION |\n\t\t\t          DUK_HOBJECT_CMASK_POINTER;\n\t\t\t/* As the fast path doesn't currently properly support\n\t\t\t * duk_hbufobj virtual properties, abort fast path if\n\t\t\t * we encounter them in plain JSON mode.\n\t\t\t */\n\t\t\tc_abort = DUK_HOBJECT_CMASK_ALL_BUFOBJS;\n\t\t\tc_object = c_all & ~(c_array | c_unbox | c_func | c_bufobj | c_undef | c_abort);\n\t\t}\n\n\t\tc_bit = (duk_uint32_t) DUK_HOBJECT_GET_CLASS_MASK(obj);\n\t\tif (c_bit & c_object) {\n\t\t\t/* All other object types. */\n\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_LCURLY);\n\n\t\t\t/* A non-Array object should not have an array part in practice.\n\t\t\t * But since it is supported internally (and perhaps used at some\n\t\t\t * point), check and abandon if that's the case.\n\t\t\t */\n\t\t\tif (DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"non-Array object has array part, abort fast path\"));\n\t\t\t\tgoto abort_fastpath;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\t\t\tduk_hstring *k;\n\t\t\t\tduk_size_t prev_size;\n\n\t\t\t\tk = DUK_HOBJECT_E_GET_KEY(js_ctx->thr->heap, obj, i);\n\t\t\t\tif (!k) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (DUK_HSTRING_HAS_ARRIDX(k)) {\n\t\t\t\t\t/* If an object has array index keys we would need\n\t\t\t\t\t * to sort them into the ES2015 enumeration order to\n\t\t\t\t\t * be consistent with the slow path.  Abort the fast\n\t\t\t\t\t * path and handle in the slow path for now.\n\t\t\t\t\t */\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"property key is an array index, abort fast path\"));\n\t\t\t\t\tgoto abort_fastpath;\n\t\t\t\t}\n\t\t\t\tif (!DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(js_ctx->thr->heap, obj, i)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(js_ctx->thr->heap, obj, i)) {\n\t\t\t\t\t/* Getter might have arbitrary side effects,\n\t\t\t\t\t * so bail out.\n\t\t\t\t\t */\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"property is an accessor, abort fast path\"));\n\t\t\t\t\tgoto abort_fastpath;\n\t\t\t\t}\n\t\t\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(js_ctx->thr->heap, obj, i);\n\n\t\t\t\tprev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw);\n\t\t\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);\n\t\t\t\t\tduk__enc_key_autoquote(js_ctx, k);\n\t\t\t\t\tDUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE);\n\t\t\t\t} else {\n\t\t\t\t\tduk__enc_key_autoquote(js_ctx, k);\n\t\t\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_COLON);\n\t\t\t\t}\n\n\t\t\t\tif (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) {\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"prop value not supported, rewind key and colon\"));\n\t\t\t\t\tDUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size);\n\t\t\t\t} else {\n\t\t\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_COMMA);\n\t\t\t\t\temitted = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* If any non-Array value had enumerable virtual own\n\t\t\t * properties, they should be serialized here (actually,\n\t\t\t * before the explicit properties).  Standard types don't.\n\t\t\t */\n\n\t\t\tif (emitted) {\n\t\t\t\tDUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);\n\t\t\t\tDUK__UNEMIT_1(js_ctx);  /* eat trailing comma */\n\t\t\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\t\t\tDUK_ASSERT(js_ctx->recursion_depth >= 1);\n\t\t\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);\n\t\t\t\t}\n\t\t\t}\n\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_RCURLY);\n\t\t} else if (c_bit & c_array) {\n\t\t\tduk_uint_fast32_t arr_len;\n\t\t\tduk_uint_fast32_t asize;\n\n\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET);\n\n\t\t\t/* Assume arrays are dense in the fast path. */\n\t\t\tif (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"Array object is sparse, abort fast path\"));\n\t\t\t\tgoto abort_fastpath;\n\t\t\t}\n\n\t\t\tarr_len = (duk_uint_fast32_t) ((duk_harray *) obj)->length;\n\t\t\tasize = (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(obj);\n\t\t\t/* Array part may be larger than 'length'; if so, iterate\n\t\t\t * only up to array 'length'.  Array part may also be smaller\n\t\t\t * than 'length' in some cases.\n\t\t\t */\n\t\t\tfor (i = 0; i < arr_len; i++) {\n\t\t\t\tduk_tval *tv_arrval;\n\t\t\t\tduk_hstring *h_tmp;\n\t\t\t\tduk_bool_t has_inherited;\n\n\t\t\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth);\n\t\t\t\t}\n\n\t\t\t\tif (DUK_LIKELY(i < asize)) {\n\t\t\t\t\ttv_arrval = DUK_HOBJECT_A_GET_VALUE_PTR(js_ctx->thr->heap, obj, i);\n\t\t\t\t\tif (DUK_LIKELY(!DUK_TVAL_IS_UNUSED(tv_arrval))) {\n\t\t\t\t\t\t/* Expected case: element is present. */\n\t\t\t\t\t\tif (duk__json_stringify_fast_value(js_ctx, tv_arrval) == 0) {\n\t\t\t\t\t\t\tDUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgoto elem_done;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* Gap in array; check for inherited property,\n\t\t\t\t * bail out if one exists.  This should be enough\n\t\t\t\t * to support gappy arrays for all practical code.\n\t\t\t\t */\n\n\t\t\t\th_tmp = duk_push_uint_to_hstring(js_ctx->thr, (duk_uint_t) i);\n\t\t\t\thas_inherited = duk_hobject_hasprop_raw(js_ctx->thr, obj, h_tmp);\n\t\t\t\tduk_pop(js_ctx->thr);\n\t\t\t\tif (has_inherited) {\n\t\t\t\t\tDUK_D(DUK_DPRINT(\"gap in array, conflicting inherited property, abort fast path\"));\n\t\t\t\t\tgoto abort_fastpath;\n\t\t\t\t}\n\n\t\t\t\t/* Ordinary gap, undefined encodes to 'null' in\n\t\t\t\t * standard JSON, but JX/JC use their form for\n\t\t\t\t * undefined to better preserve the typing.\n\t\t\t\t */\n\t\t\t\tDUK_D(DUK_DPRINT(\"gap in array, no conflicting inherited property, remain on fast path\"));\n#if defined(DUK_USE_JX)\n\t\t\t\tDUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined);\n#else\n\t\t\t\tDUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL);\n#endif\n\t\t\t\t/* fall through */\n\n\t\t\t elem_done:\n\t\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_COMMA);\n\t\t\t\temitted = 1;\n\t\t\t}\n\n\t\t\tif (emitted) {\n\t\t\t\tDUK_ASSERT(*((duk_uint8_t *) DUK_BW_GET_PTR(js_ctx->thr, &js_ctx->bw) - 1) == DUK_ASC_COMMA);\n\t\t\t\tDUK__UNEMIT_1(js_ctx);  /* eat trailing comma */\n\t\t\t\tif (DUK_UNLIKELY(js_ctx->h_gap != NULL)) {\n\t\t\t\t\tDUK_ASSERT(js_ctx->recursion_depth >= 1);\n\t\t\t\t\tduk__enc_newline_indent(js_ctx, js_ctx->recursion_depth - 1U);\n\t\t\t\t}\n\t\t\t}\n\t\t\tDUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET);\n\t\t} else if (c_bit & c_unbox) {\n\t\t\t/* Certain boxed types are required to go through\n\t\t\t * automatic unboxing.  Rely on internal value being\n\t\t\t * sane (to avoid infinite recursion).\n\t\t\t */\n\t\t\tDUK_ASSERT((c_bit & DUK_HOBJECT_CMASK_SYMBOL) == 0);  /* Symbols are not unboxed. */\n\n#if 1\n\t\t\t/* The code below is incorrect if .toString() or .valueOf() have\n\t\t\t * have been overridden.  The correct approach would be to look up\n\t\t\t * the method(s) and if they resolve to the built-in function we\n\t\t\t * can safely bypass it and look up the internal value directly.\n\t\t\t * Unimplemented for now, abort fast path for boxed values.\n\t\t\t */\n\t\t\tgoto abort_fastpath;\n#else  /* disabled */\n\t\t\t/* Disabled until fixed, see above. */\n\t\t\tduk_tval *tv_internal;\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"auto unboxing in fast path\"));\n\n\t\t\ttv_internal = duk_hobject_get_internal_value_tval_ptr(js_ctx->thr->heap, obj);\n\t\t\tDUK_ASSERT(tv_internal != NULL);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv_internal) ||\n\t\t\t           DUK_TVAL_IS_NUMBER(tv_internal) ||\n\t\t\t           DUK_TVAL_IS_BOOLEAN(tv_internal) ||\n\t\t\t           DUK_TVAL_IS_POINTER(tv_internal));\n\n\t\t\ttv = tv_internal;\n\t\t\tDUK_ASSERT(js_ctx->recursion_depth > 0);\n\t\t\tjs_ctx->recursion_depth--;  /* required to keep recursion depth correct */\n\t\t\tgoto restart_match;\n#endif  /* disabled */\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\t} else if (c_bit & c_func) {\n\t\t\tDUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\t} else if (c_bit & c_bufobj) {\n\t\t\tduk__enc_bufobj(js_ctx, (duk_hbufobj *) obj);\n#endif\n#endif\n\t\t} else if (c_bit & c_abort) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"abort fast path for unsupported type\"));\n\t\t\tgoto abort_fastpath;\n\t\t} else {\n\t\t\tDUK_ASSERT((c_bit & c_undef) != 0);\n\n\t\t\t/* Must decrease recursion depth before returning. */\n\t\t\tDUK_ASSERT(js_ctx->recursion_depth > 0);\n\t\t\tDUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);\n\t\t\tjs_ctx->recursion_depth--;\n\t\t\tgoto emit_undefined;\n\t\t}\n\n\t\tDUK_ASSERT(js_ctx->recursion_depth > 0);\n\t\tDUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit);\n\t\tjs_ctx->recursion_depth--;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BUFFER: {\n\t\t/* Plain buffers are treated like Uint8Arrays: they have\n\t\t * enumerable indices.  Other virtual properties are not\n\t\t * enumerable, and inherited properties are not serialized.\n\t\t * However, there can be a replacer (not relevant here) or\n\t\t * a .toJSON() method (which we need to check for explicitly).\n\t\t */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\tif (duk_hobject_hasprop_raw(js_ctx->thr,\n\t\t                            js_ctx->thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE],\n\t\t                            DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr))) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"value is a plain buffer and there's an inherited .toJSON, abort fast path\"));\n\t\t\tgoto abort_fastpath;\n\t\t}\n#endif\n\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\tif (js_ctx->flag_ext_custom_or_compatible) {\n\t\t\tduk__enc_buffer_jx_jc(js_ctx, DUK_TVAL_GET_BUFFER(tv));\n\t\t\tbreak;\n\t\t}\n#endif\n\n\t\t/* Plain buffers mimic Uint8Arrays, and have enumerable index\n\t\t * properties.\n\t\t */\n\t\tduk__enc_buffer_json_fastpath(js_ctx, DUK_TVAL_GET_BUFFER(tv));\n\t\tbreak;\n\t}\n\tcase DUK_TAG_POINTER: {\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\t\tif (js_ctx->flag_ext_custom_or_compatible) {\n\t\t\tduk__enc_pointer(js_ctx, DUK_TVAL_GET_POINTER(tv));\n\t\t\tbreak;\n\t\t} else {\n\t\t\tgoto emit_undefined;\n\t\t}\n#else\n\t\tgoto emit_undefined;\n#endif\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\t/* A lightfunc might also inherit a .toJSON() so just bail out. */\n\t\t/* XXX: Could just lookup .toJSON() and continue in fast path,\n\t\t * as it would almost never be defined.\n\t\t */\n\t\tDUK_DD(DUK_DDPRINT(\"value is a lightfunc, abort fast path\"));\n\t\tgoto abort_fastpath;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT: {\n\t\t/* Number serialization has a significant impact relative to\n\t\t * other fast path code, so careful fast path for fastints.\n\t\t */\n\t\tduk__enc_fastint_tval(js_ctx, tv);\n\t\tbreak;\n\t}\n#endif\n\tdefault: {\n\t\t/* XXX: A fast path for usual integers would be useful when\n\t\t * fastint support is not enabled.\n\t\t */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\n\t\t/* XXX: Stack discipline is annoying, could be changed in numconv. */\n\t\tduk_push_tval(js_ctx->thr, tv);\n\t\tduk__enc_double(js_ctx);\n\t\tduk_pop(js_ctx->thr);\n\n#if 0\n\t\t/* Could also rely on native sprintf(), but it will handle\n\t\t * values like NaN, Infinity, -0, exponent notation etc in\n\t\t * a JSON-incompatible way.\n\t\t */\n\t\tduk_double_t d;\n\t\tchar buf[64];\n\n\t\tDUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));\n\t\td = DUK_TVAL_GET_DOUBLE(tv);\n\t\tDUK_SPRINTF(buf, \"%lg\", d);\n\t\tDUK__EMIT_CSTR(js_ctx, buf);\n#endif\n\t}\n\t}\n\treturn 1;  /* not undefined */\n\n emit_undefined:\n\treturn 0;  /* value was undefined/unsupported */\n\n abort_fastpath:\n\t/* Error message doesn't matter: the error is ignored anyway. */\n\tDUK_DD(DUK_DDPRINT(\"aborting fast path\"));\n\tDUK_ERROR_INTERNAL(js_ctx->thr);\n\treturn 0;  /* unreachable */\n}\n\nDUK_LOCAL duk_ret_t duk__json_stringify_fast(duk_hthread *thr, void *udata) {\n\tduk_json_enc_ctx *js_ctx;\n\tduk_tval *tv;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(udata != NULL);\n\n\tjs_ctx = (duk_json_enc_ctx *) udata;\n\tDUK_ASSERT(js_ctx != NULL);\n\n\ttv = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tif (duk__json_stringify_fast_value(js_ctx, tv) == 0) {\n\t\tDUK_DD(DUK_DDPRINT(\"top level value not supported, fail fast path\"));\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);  /* Error message is ignored, so doesn't matter. */\n\t}\n\n\treturn 0;\n}\n#endif  /* DUK_USE_JSON_STRINGIFY_FASTPATH */\n\n/*\n *  Top level wrappers\n */\n\nDUK_INTERNAL\nvoid duk_bi_json_parse_helper(duk_hthread *thr,\n                              duk_idx_t idx_value,\n                              duk_idx_t idx_reviver,\n                              duk_small_uint_t flags) {\n\tduk_json_dec_ctx js_ctx_alloc;\n\tduk_json_dec_ctx *js_ctx = &js_ctx_alloc;\n\tduk_hstring *h_text;\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_idx_t entry_top = duk_get_top(thr);\n#endif\n\n\t/* negative top-relative indices not allowed now */\n\tDUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0);\n\tDUK_ASSERT(idx_reviver == DUK_INVALID_INDEX || idx_reviver >= 0);\n\n\tDUK_DDD(DUK_DDDPRINT(\"JSON parse start: text=%!T, reviver=%!T, flags=0x%08lx, stack_top=%ld\",\n\t                     (duk_tval *) duk_get_tval(thr, idx_value),\n\t                     (duk_tval *) duk_get_tval(thr, idx_reviver),\n\t                     (unsigned long) flags,\n\t                     (long) duk_get_top(thr)));\n\n\tDUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc));\n\tjs_ctx->thr = thr;\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\t/* nothing now */\n#endif\n\tjs_ctx->recursion_limit = DUK_USE_JSON_DEC_RECLIMIT;\n\tDUK_ASSERT(js_ctx->recursion_depth == 0);\n\n\t/* Flag handling currently assumes that flags are consistent.  This is OK\n\t * because the call sites are now strictly controlled.\n\t */\n\n\tjs_ctx->flags = flags;\n#if defined(DUK_USE_JX)\n\tjs_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM;\n#endif\n#if defined(DUK_USE_JC)\n\tjs_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE;\n#endif\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tjs_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE);\n#endif\n\n\th_text = duk_to_hstring(thr, idx_value);  /* coerce in-place; rejects Symbols */\n\tDUK_ASSERT(h_text != NULL);\n\n\t/* JSON parsing code is allowed to read [p_start,p_end]: p_end is\n\t * valid and points to the string NUL terminator (which is always\n\t * guaranteed for duk_hstrings.\n\t */\n\tjs_ctx->p_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text);\n\tjs_ctx->p = js_ctx->p_start;\n\tjs_ctx->p_end = ((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text)) +\n\t                DUK_HSTRING_GET_BYTELEN(h_text);\n\tDUK_ASSERT(*(js_ctx->p_end) == 0x00);\n\n\tduk__dec_value(js_ctx);  /* -> [ ... value ] */\n\n\t/* Trailing whitespace has been eaten by duk__dec_value(), so if\n\t * we're not at end of input here, it's a SyntaxError.\n\t */\n\n\tif (js_ctx->p != js_ctx->p_end) {\n\t\tduk__dec_syntax_error(js_ctx);\n\t}\n\n\tif (duk_is_callable(thr, idx_reviver)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"applying reviver: %!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, idx_reviver)));\n\n\t\tjs_ctx->idx_reviver = idx_reviver;\n\n\t\tduk_push_object(thr);\n\t\tduk_dup_m2(thr);  /* -> [ ... val root val ] */\n\t\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING);  /* default attrs ok */\n\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_EMPTY_STRING);  /* -> [ ... val root \"\" ] */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"start reviver walk, root=%!T, name=%!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t\tduk__dec_reviver_walk(js_ctx);  /* [ ... val root \"\" ] -> [ ... val val' ] */\n\t\tduk_remove_m2(thr);             /* -> [ ... val' ] */\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"reviver does not exist or is not callable: %!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, idx_reviver)));\n\t}\n\n\t/* Final result is at stack top. */\n\n\tDUK_DDD(DUK_DDDPRINT(\"JSON parse end: text=%!T, reviver=%!T, flags=0x%08lx, result=%!T, stack_top=%ld\",\n\t                     (duk_tval *) duk_get_tval(thr, idx_value),\n\t                     (duk_tval *) duk_get_tval(thr, idx_reviver),\n\t                     (unsigned long) flags,\n\t                     (duk_tval *) duk_get_tval(thr, -1),\n\t                     (long) duk_get_top(thr)));\n\n\tDUK_ASSERT(duk_get_top(thr) == entry_top + 1);\n}\n\nDUK_INTERNAL\nvoid duk_bi_json_stringify_helper(duk_hthread *thr,\n                                  duk_idx_t idx_value,\n                                  duk_idx_t idx_replacer,\n                                  duk_idx_t idx_space,\n                                  duk_small_uint_t flags) {\n\tduk_json_enc_ctx js_ctx_alloc;\n\tduk_json_enc_ctx *js_ctx = &js_ctx_alloc;\n\tduk_hobject *h;\n\tduk_idx_t idx_holder;\n\tduk_idx_t entry_top;\n\n\t/* negative top-relative indices not allowed now */\n\tDUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0);\n\tDUK_ASSERT(idx_replacer == DUK_INVALID_INDEX || idx_replacer >= 0);\n\tDUK_ASSERT(idx_space == DUK_INVALID_INDEX || idx_space >= 0);\n\n\tDUK_DDD(DUK_DDDPRINT(\"JSON stringify start: value=%!T, replacer=%!T, space=%!T, flags=0x%08lx, stack_top=%ld\",\n\t                     (duk_tval *) duk_get_tval(thr, idx_value),\n\t                     (duk_tval *) duk_get_tval(thr, idx_replacer),\n\t                     (duk_tval *) duk_get_tval(thr, idx_space),\n\t                     (unsigned long) flags,\n\t                     (long) duk_get_top(thr)));\n\n\tentry_top = duk_get_top(thr);\n\n\t/*\n\t *  Context init\n\t */\n\n\tDUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc));\n\tjs_ctx->thr = thr;\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tjs_ctx->h_replacer = NULL;\n\tjs_ctx->h_gap = NULL;\n#endif\n\tjs_ctx->idx_proplist = -1;\n\n\t/* Flag handling currently assumes that flags are consistent.  This is OK\n\t * because the call sites are now strictly controlled.\n\t */\n\n\tjs_ctx->flags = flags;\n\tjs_ctx->flag_ascii_only = flags & DUK_JSON_FLAG_ASCII_ONLY;\n\tjs_ctx->flag_avoid_key_quotes = flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES;\n#if defined(DUK_USE_JX)\n\tjs_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM;\n#endif\n#if defined(DUK_USE_JC)\n\tjs_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE;\n#endif\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tjs_ctx->flag_ext_custom_or_compatible = flags & (DUK_JSON_FLAG_EXT_CUSTOM | DUK_JSON_FLAG_EXT_COMPATIBLE);\n#endif\n\n\t/* The #if defined() clutter here handles the JX/JC enable/disable\n\t * combinations properly.\n\t */\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tjs_ctx->stridx_custom_undefined = DUK_STRIDX_LC_NULL;  /* standard JSON; array gaps */\n#if defined(DUK_USE_JX)\n\tif (flags & DUK_JSON_FLAG_EXT_CUSTOM) {\n\t\tjs_ctx->stridx_custom_undefined = DUK_STRIDX_LC_UNDEFINED;\n\t\tjs_ctx->stridx_custom_nan = DUK_STRIDX_NAN;\n\t\tjs_ctx->stridx_custom_neginf = DUK_STRIDX_MINUS_INFINITY;\n\t\tjs_ctx->stridx_custom_posinf = DUK_STRIDX_INFINITY;\n\t\tjs_ctx->stridx_custom_function =\n\t\t        (flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES) ?\n\t\t                DUK_STRIDX_JSON_EXT_FUNCTION2 :\n\t\t                DUK_STRIDX_JSON_EXT_FUNCTION1;\n\t}\n#endif  /* DUK_USE_JX */\n#if defined(DUK_USE_JX) && defined(DUK_USE_JC)\n\telse\n#endif  /* DUK_USE_JX && DUK_USE_JC */\n#if defined(DUK_USE_JC)\n\tif (js_ctx->flags & DUK_JSON_FLAG_EXT_COMPATIBLE) {\n\t\tjs_ctx->stridx_custom_undefined = DUK_STRIDX_JSON_EXT_UNDEFINED;\n\t\tjs_ctx->stridx_custom_nan = DUK_STRIDX_JSON_EXT_NAN;\n\t\tjs_ctx->stridx_custom_neginf = DUK_STRIDX_JSON_EXT_NEGINF;\n\t\tjs_ctx->stridx_custom_posinf = DUK_STRIDX_JSON_EXT_POSINF;\n\t\tjs_ctx->stridx_custom_function = DUK_STRIDX_JSON_EXT_FUNCTION1;\n\t}\n#endif  /* DUK_USE_JC */\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n\n#if defined(DUK_USE_JX) || defined(DUK_USE_JC)\n\tif (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM |\n\t                     DUK_JSON_FLAG_EXT_COMPATIBLE)) {\n\t\tDUK_ASSERT(js_ctx->mask_for_undefined == 0);  /* already zero */\n\t}\n\telse\n#endif  /* DUK_USE_JX || DUK_USE_JC */\n\t{\n\t\t/* Plain buffer is treated like ArrayBuffer and serialized.\n\t\t * Lightfuncs are treated like objects, but JSON explicitly\n\t\t * skips serializing Function objects so we can just reject\n\t\t * lightfuncs here.\n\t\t */\n\t\tjs_ctx->mask_for_undefined = DUK_TYPE_MASK_UNDEFINED |\n\t\t                             DUK_TYPE_MASK_POINTER |\n\t\t                             DUK_TYPE_MASK_LIGHTFUNC;\n\t}\n\n\tDUK_BW_INIT_PUSHBUF(thr, &js_ctx->bw, DUK__JSON_STRINGIFY_BUFSIZE);\n\n\tjs_ctx->idx_loop = duk_push_bare_object(thr);\n\tDUK_ASSERT(js_ctx->idx_loop >= 0);\n\n\t/* [ ... buf loop ] */\n\n\t/*\n\t *  Process replacer/proplist (2nd argument to JSON.stringify)\n\t */\n\n\th = duk_get_hobject(thr, idx_replacer);\n\tif (h != NULL) {\n\t\tif (DUK_HOBJECT_IS_CALLABLE(h)) {\n\t\t\tjs_ctx->h_replacer = h;\n\t\t} else if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) {\n\t\t\t/* Here the specification requires correct array index enumeration\n\t\t\t * which is a bit tricky for sparse arrays (it is handled by the\n\t\t\t * enum setup code).  We now enumerate ancestors too, although the\n\t\t\t * specification is not very clear on whether that is required.\n\t\t\t */\n\n\t\t\tduk_uarridx_t plist_idx = 0;\n\t\t\tduk_small_uint_t enum_flags;\n\n\t\t\tjs_ctx->idx_proplist = duk_push_array(thr);  /* XXX: array internal? */\n\n\t\t\tenum_flags = DUK_ENUM_ARRAY_INDICES_ONLY |\n\t\t\t             DUK_ENUM_SORT_ARRAY_INDICES;  /* expensive flag */\n\t\t\tduk_enum(thr, idx_replacer, enum_flags);\n\t\t\twhile (duk_next(thr, -1 /*enum_index*/, 1 /*get_value*/)) {\n\t\t\t\t/* [ ... proplist enum_obj key val ] */\n\t\t\t\tif (duk__enc_allow_into_proplist(duk_get_tval(thr, -1))) {\n\t\t\t\t\t/* XXX: duplicates should be eliminated here */\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"proplist enum: key=%!T, val=%!T --> accept\",\n\t\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\t\t\tduk_to_string(thr, -1);  /* extra coercion of strings is OK */\n\t\t\t\t\tduk_put_prop_index(thr, -4, plist_idx);  /* -> [ ... proplist enum_obj key ] */\n\t\t\t\t\tplist_idx++;\n\t\t\t\t\tduk_pop(thr);\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"proplist enum: key=%!T, val=%!T --> reject\",\n\t\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\t\t\tduk_pop_2(thr);\n\t\t\t\t}\n                        }\n                        duk_pop(thr);  /* pop enum */\n\n\t\t\t/* [ ... proplist ] */\n\t\t}\n\t}\n\n\t/* [ ... buf loop (proplist) ] */\n\n\t/*\n\t *  Process space (3rd argument to JSON.stringify)\n\t */\n\n\th = duk_get_hobject(thr, idx_space);\n\tif (h != NULL) {\n\t\tduk_small_uint_t c = DUK_HOBJECT_GET_CLASS_NUMBER(h);\n\t\tif (c == DUK_HOBJECT_CLASS_NUMBER) {\n\t\t\tduk_to_number(thr, idx_space);\n\t\t} else if (c == DUK_HOBJECT_CLASS_STRING) {\n\t\t\tduk_to_string(thr, idx_space);\n\t\t}\n\t}\n\n\tif (duk_is_number(thr, idx_space)) {\n\t\tduk_small_int_t nspace;\n\t\t/* spaces[] must be static to allow initializer with old compilers like BCC */\n\t\tstatic const char spaces[10] = {\n\t\t\tDUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE,\n\t\t\tDUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE,\n\t\t\tDUK_ASC_SPACE, DUK_ASC_SPACE\n\t\t};  /* XXX: helper */\n\n\t\t/* ToInteger() coercion; NaN -> 0, infinities are clamped to 0 and 10 */\n\t\tnspace = (duk_small_int_t) duk_to_int_clamped(thr, idx_space, 0 /*minval*/, 10 /*maxval*/);\n\t\tDUK_ASSERT(nspace >= 0 && nspace <= 10);\n\n\t\tduk_push_lstring(thr, spaces, (duk_size_t) nspace);\n\t\tjs_ctx->h_gap = duk_known_hstring(thr, -1);\n\t\tDUK_ASSERT(js_ctx->h_gap != NULL);\n\t} else if (duk_is_string_notsymbol(thr, idx_space)) {\n\t\tduk_dup(thr, idx_space);\n\t\tduk_substring(thr, -1, 0, 10);  /* clamp to 10 chars */\n\t\tjs_ctx->h_gap = duk_known_hstring(thr, -1);\n\t} else {\n\t\t/* nop */\n\t}\n\n\tif (js_ctx->h_gap != NULL) {\n\t\t/* If gap is empty, behave as if not given at all.  Check\n\t\t * against byte length because character length is more\n\t\t * expensive.\n\t\t */\n\t\tif (DUK_HSTRING_GET_BYTELEN(js_ctx->h_gap) == 0) {\n\t\t\tjs_ctx->h_gap = NULL;\n\t\t}\n\t}\n\n\t/* [ ... buf loop (proplist) (gap) ] */\n\n\t/*\n\t *  Fast path: assume no mutation, iterate object property tables\n\t *  directly; bail out if that assumption doesn't hold.\n\t */\n\n#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)\n\tif (js_ctx->h_replacer == NULL &&  /* replacer is a mutation risk */\n\t    js_ctx->idx_proplist == -1) {  /* proplist is very rare */\n\t\tduk_int_t pcall_rc;\n\t\tduk_small_uint_t prev_ms_base_flags;\n\n\t\tDUK_DD(DUK_DDPRINT(\"try JSON.stringify() fast path\"));\n\n\t\t/* Use recursion_limit to ensure we don't overwrite js_ctx->visiting[]\n\t\t * array so we don't need two counter checks in the fast path.  The\n\t\t * slow path has a much larger recursion limit which we'll use if\n\t\t * necessary.\n\t\t */\n\t\tDUK_ASSERT(DUK_USE_JSON_ENC_RECLIMIT >= DUK_JSON_ENC_LOOPARRAY);\n\t\tjs_ctx->recursion_limit = DUK_JSON_ENC_LOOPARRAY;\n\t\tDUK_ASSERT(js_ctx->recursion_depth == 0);\n\n\t\t/* Execute the fast path in a protected call.  If any error is thrown,\n\t\t * fall back to the slow path.  This includes e.g. recursion limit\n\t\t * because the fast path has a smaller recursion limit (and simpler,\n\t\t * limited loop detection).\n\t\t */\n\n\t\tduk_dup(thr, idx_value);\n\n\t\t/* Must prevent finalizers which may have arbitrary side effects. */\n\t\tprev_ms_base_flags = thr->heap->ms_base_flags;\n\t\tthr->heap->ms_base_flags |=\n\t\t        DUK_MS_FLAG_NO_OBJECT_COMPACTION;      /* Avoid attempt to compact any objects. */\n\t\tthr->heap->pf_prevent_count++;                 /* Prevent finalizers. */\n\t\tDUK_ASSERT(thr->heap->pf_prevent_count != 0);  /* Wrap. */\n\n\t\tpcall_rc = duk_safe_call(thr, duk__json_stringify_fast, (void *) js_ctx /*udata*/, 1 /*nargs*/, 0 /*nret*/);\n\n\t\tDUK_ASSERT(thr->heap->pf_prevent_count > 0);\n\t\tthr->heap->pf_prevent_count--;\n\t\tthr->heap->ms_base_flags = prev_ms_base_flags;\n\n\t\tif (pcall_rc == DUK_EXEC_SUCCESS) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"fast path successful\"));\n\t\t\tDUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw);\n\t\t\tgoto replace_finished;\n\t\t}\n\n\t\t/* We come here for actual aborts (like encountering .toJSON())\n\t\t * but also for recursion/loop errors.  Bufwriter size can be\n\t\t * kept because we'll probably need at least as much as we've\n\t\t * allocated so far.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"fast path failed, serialize using slow path instead\"));\n\t\tDUK_BW_RESET_SIZE(thr, &js_ctx->bw);\n\t\tjs_ctx->recursion_depth = 0;\n\t}\n#endif\n\n\t/*\n\t *  Create wrapper object and serialize\n\t */\n\n\tidx_holder = duk_push_object(thr);\n\tduk_dup(thr, idx_value);\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_EMPTY_STRING);\n\n\tDUK_DDD(DUK_DDDPRINT(\"before: flags=0x%08lx, loop=%!T, replacer=%!O, \"\n\t                     \"proplist=%!T, gap=%!O, holder=%!T\",\n\t                     (unsigned long) js_ctx->flags,\n\t                     (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop),\n\t                     (duk_heaphdr *) js_ctx->h_replacer,\n\t                     (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL),\n\t                     (duk_heaphdr *) js_ctx->h_gap,\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/* serialize the wrapper with empty string key */\n\n\tduk_push_hstring_empty(thr);\n\n\t/* [ ... buf loop (proplist) (gap) holder \"\" ] */\n\n\tjs_ctx->recursion_limit = DUK_USE_JSON_ENC_RECLIMIT;\n\tDUK_ASSERT(js_ctx->recursion_depth == 0);\n\n\tif (DUK_UNLIKELY(duk__enc_value(js_ctx, idx_holder) == 0)) {  /* [ ... holder key ] -> [ ... holder ] */\n\t\t/* Result is undefined. */\n\t\tduk_push_undefined(thr);\n\t} else {\n\t\t/* Convert buffer to result string. */\n\t\tDUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"after: flags=0x%08lx, loop=%!T, replacer=%!O, \"\n\t                     \"proplist=%!T, gap=%!O, holder=%!T\",\n\t                     (unsigned long) js_ctx->flags,\n\t                     (duk_tval *) duk_get_tval(thr, js_ctx->idx_loop),\n\t                     (duk_heaphdr *) js_ctx->h_replacer,\n\t                     (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(thr, js_ctx->idx_proplist) : NULL),\n\t                     (duk_heaphdr *) js_ctx->h_gap,\n\t                     (duk_tval *) duk_get_tval(thr, idx_holder)));\n\n\t/* The stack has a variable shape here, so force it to the\n\t * desired one explicitly.\n\t */\n\n#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH)\n replace_finished:\n#endif\n\tduk_replace(thr, entry_top);\n\tduk_set_top(thr, entry_top + 1);\n\n\tDUK_DDD(DUK_DDDPRINT(\"JSON stringify end: value=%!T, replacer=%!T, space=%!T, \"\n\t                     \"flags=0x%08lx, result=%!T, stack_top=%ld\",\n\t                     (duk_tval *) duk_get_tval(thr, idx_value),\n\t                     (duk_tval *) duk_get_tval(thr, idx_replacer),\n\t                     (duk_tval *) duk_get_tval(thr, idx_space),\n\t                     (unsigned long) flags,\n\t                     (duk_tval *) duk_get_tval(thr, -1),\n\t                     (long) duk_get_top(thr)));\n\n\tDUK_ASSERT(duk_get_top(thr) == entry_top + 1);\n}\n\n#if defined(DUK_USE_JSON_BUILTIN)\n\n/*\n *  Entry points\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_json_object_parse(duk_hthread *thr) {\n\tduk_bi_json_parse_helper(thr,\n\t                         0 /*idx_value*/,\n\t                         1 /*idx_replacer*/,\n\t                         0 /*flags*/);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_json_object_stringify(duk_hthread *thr) {\n\tduk_bi_json_stringify_helper(thr,\n\t                             0 /*idx_value*/,\n\t                             1 /*idx_replacer*/,\n\t                             2 /*idx_space*/,\n\t                             0 /*flags*/);\n\treturn 1;\n}\n\n#endif  /* DUK_USE_JSON_BUILTIN */\n\n#endif  /* DUK_USE_JSON_SUPPORT */\n\n/* automatic undefs */\n#undef DUK__EMIT_1\n#undef DUK__EMIT_2\n#undef DUK__EMIT_CSTR\n#undef DUK__EMIT_HSTR\n#undef DUK__EMIT_STRIDX\n#undef DUK__JSON_DECSTR_BUFSIZE\n#undef DUK__JSON_DECSTR_CHUNKSIZE\n#undef DUK__JSON_ENCSTR_CHUNKSIZE\n#undef DUK__JSON_MAX_ESC_LEN\n#undef DUK__JSON_STRINGIFY_BUFSIZE\n#undef DUK__MKESC\n#undef DUK__UNEMIT_1\n#line 1 \"duk_bi_math.c\"\n/*\n *  Math built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_MATH_BUILTIN)\n\n/*\n *  Use static helpers which can work with math.h functions matching\n *  the following signatures. This is not portable if any of these math\n *  functions is actually a macro.\n *\n *  Typing here is intentionally 'double' wherever values interact with\n *  the standard library APIs.\n */\n\ntypedef double (*duk__one_arg_func)(double);\ntypedef double (*duk__two_arg_func)(double, double);\n\nDUK_LOCAL duk_ret_t duk__math_minmax(duk_hthread *thr, duk_double_t initial, duk__two_arg_func min_max) {\n\tduk_idx_t n = duk_get_top(thr);\n\tduk_idx_t i;\n\tduk_double_t res = initial;\n\tduk_double_t t;\n\n\t/*\n\t *  Note: fmax() does not match the E5 semantics.  E5 requires\n\t *  that if -any- input to Math.max() is a NaN, the result is a\n\t *  NaN.  fmax() will return a NaN only if -both- inputs are NaN.\n\t *  Same applies to fmin().\n\t *\n\t *  Note: every input value must be coerced with ToNumber(), even\n\t *  if we know the result will be a NaN anyway: ToNumber() may have\n\t *  side effects for which even order of evaluation matters.\n\t */\n\n\tfor (i = 0; i < n; i++) {\n\t\tt = duk_to_number(thr, i);\n\t\tif (DUK_FPCLASSIFY(t) == DUK_FP_NAN || DUK_FPCLASSIFY(res) == DUK_FP_NAN) {\n\t\t\t/* Note: not normalized, but duk_push_number() will normalize */\n\t\t\tres = (duk_double_t) DUK_DOUBLE_NAN;\n\t\t} else {\n\t\t\tres = (duk_double_t) min_max(res, (double) t);\n\t\t}\n\t}\n\n\tduk_push_number(thr, res);\n\treturn 1;\n}\n\nDUK_LOCAL double duk__fmin_fixed(double x, double y) {\n\t/* fmin() with args -0 and +0 is not guaranteed to return\n\t * -0 as Ecmascript requires.\n\t */\n\tif (x == 0 && y == 0) {\n\t\tduk_double_union du1, du2;\n\t\tdu1.d = x;\n\t\tdu2.d = y;\n\n\t\t/* Already checked to be zero so these must hold, and allow us\n\t\t * to check for \"x is -0 or y is -0\" by ORing the high parts\n\t\t * for comparison.\n\t\t */\n\t\tDUK_ASSERT(du1.ui[DUK_DBL_IDX_UI0] == 0 || du1.ui[DUK_DBL_IDX_UI0] == 0x80000000UL);\n\t\tDUK_ASSERT(du2.ui[DUK_DBL_IDX_UI0] == 0 || du2.ui[DUK_DBL_IDX_UI0] == 0x80000000UL);\n\n\t\t/* XXX: what's the safest way of creating a negative zero? */\n\t\tif ((du1.ui[DUK_DBL_IDX_UI0] | du2.ui[DUK_DBL_IDX_UI0]) != 0) {\n\t\t\t/* Enter here if either x or y (or both) is -0. */\n\t\t\treturn -0.0;\n\t\t} else {\n\t\t\treturn +0.0;\n\t\t}\n\t}\n\treturn duk_double_fmin(x, y);\n}\n\nDUK_LOCAL double duk__fmax_fixed(double x, double y) {\n\t/* fmax() with args -0 and +0 is not guaranteed to return\n\t * +0 as Ecmascript requires.\n\t */\n\tif (x == 0 && y == 0) {\n\t\tif (DUK_SIGNBIT(x) == 0 || DUK_SIGNBIT(y) == 0) {\n\t\t\treturn +0.0;\n\t\t} else {\n\t\t\treturn -0.0;\n\t\t}\n\t}\n\treturn duk_double_fmax(x, y);\n}\n\n#if defined(DUK_USE_ES6)\nDUK_LOCAL double duk__cbrt(double x) {\n\t/* cbrt() is C99.  To avoid hassling embedders with the need to provide a\n\t * cube root function, we can get by with pow().  The result is not\n\t * identical, but that's OK: ES2015 says it's implementation-dependent.\n\t */\n\n#if defined(DUK_CBRT)\n\t/* cbrt() matches ES2015 requirements. */\n\treturn DUK_CBRT(x);\n#else\n\tduk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\n\t/* pow() does not, however. */\n\tif (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) {\n\t\treturn x;\n\t}\n\tif (DUK_SIGNBIT(x)) {\n\t\treturn -DUK_POW(-x, 1.0 / 3.0);\n\t} else {\n\t\treturn DUK_POW(x, 1.0 / 3.0);\n\t}\n#endif\n}\n\nDUK_LOCAL double duk__log2(double x) {\n#if defined(DUK_LOG2)\n\treturn DUK_LOG2(x);\n#else\n\treturn DUK_LOG(x) * DUK_DOUBLE_LOG2E;\n#endif\n}\n\nDUK_LOCAL double duk__log10(double x) {\n#if defined(DUK_LOG10)\n\treturn DUK_LOG10(x);\n#else\n\treturn DUK_LOG(x) * DUK_DOUBLE_LOG10E;\n#endif\n}\n\nDUK_LOCAL double duk__trunc(double x) {\n#if defined(DUK_TRUNC)\n\treturn DUK_TRUNC(x);\n#else\n\t/* Handles -0 correctly: -0.0 matches 'x >= 0.0' but floor()\n\t * is required to return -0 when the argument is -0.\n\t */\n\treturn x >= 0.0 ? DUK_FLOOR(x) : DUK_CEIL(x);\n#endif\n}\n#endif  /* DUK_USE_ES6 */\n\nDUK_LOCAL double duk__round_fixed(double x) {\n\t/* Numbers half-way between integers must be rounded towards +Infinity,\n\t * e.g. -3.5 must be rounded to -3 (not -4).  When rounded to zero, zero\n\t * sign must be set appropriately.  E5.1 Section 15.8.2.15.\n\t *\n\t * Note that ANSI C round() is \"round to nearest integer, away from zero\",\n\t * which is incorrect for negative values.  Here we make do with floor().\n\t */\n\n\tduk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\tif (c == DUK_FP_NAN || c == DUK_FP_INFINITE || c == DUK_FP_ZERO) {\n\t\treturn x;\n\t}\n\n\t/*\n\t *  x is finite and non-zero\n\t *\n\t *  -1.6 -> floor(-1.1) -> -2\n\t *  -1.5 -> floor(-1.0) -> -1  (towards +Inf)\n\t *  -1.4 -> floor(-0.9) -> -1\n\t *  -0.5 -> -0.0               (special case)\n\t *  -0.1 -> -0.0               (special case)\n\t *  +0.1 -> +0.0               (special case)\n\t *  +0.5 -> floor(+1.0) -> 1   (towards +Inf)\n\t *  +1.4 -> floor(+1.9) -> 1\n\t *  +1.5 -> floor(+2.0) -> 2   (towards +Inf)\n\t *  +1.6 -> floor(+2.1) -> 2\n\t */\n\n\tif (x >= -0.5 && x < 0.5) {\n\t\t/* +0.5 is handled by floor, this is on purpose */\n\t\tif (x < 0.0) {\n\t\t\treturn -0.0;\n\t\t} else {\n\t\t\treturn +0.0;\n\t\t}\n\t}\n\n\treturn DUK_FLOOR(x + 0.5);\n}\n\n/* Wrappers for calling standard math library methods.  These may be required\n * on platforms where one or more of the math built-ins are defined as macros\n * or inline functions and are thus not suitable to be used as function pointers.\n */\n#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS)\nDUK_LOCAL double duk__fabs(double x) {\n\treturn DUK_FABS(x);\n}\nDUK_LOCAL double duk__acos(double x) {\n\treturn DUK_ACOS(x);\n}\nDUK_LOCAL double duk__asin(double x) {\n\treturn DUK_ASIN(x);\n}\nDUK_LOCAL double duk__atan(double x) {\n\treturn DUK_ATAN(x);\n}\nDUK_LOCAL double duk__ceil(double x) {\n\treturn DUK_CEIL(x);\n}\nDUK_LOCAL double duk__cos(double x) {\n\treturn DUK_COS(x);\n}\nDUK_LOCAL double duk__exp(double x) {\n\treturn DUK_EXP(x);\n}\nDUK_LOCAL double duk__floor(double x) {\n\treturn DUK_FLOOR(x);\n}\nDUK_LOCAL double duk__log(double x) {\n\treturn DUK_LOG(x);\n}\nDUK_LOCAL double duk__sin(double x) {\n\treturn DUK_SIN(x);\n}\nDUK_LOCAL double duk__sqrt(double x) {\n\treturn DUK_SQRT(x);\n}\nDUK_LOCAL double duk__tan(double x) {\n\treturn DUK_TAN(x);\n}\nDUK_LOCAL double duk__atan2_fixed(double x, double y) {\n#if defined(DUK_USE_ATAN2_WORKAROUNDS)\n\t/* Specific fixes to common atan2() implementation issues:\n\t * - test-bug-mingw-math-issues.js\n\t */\n\tif (DUK_ISINF(x) && DUK_ISINF(y)) {\n\t\tif (DUK_SIGNBIT(x)) {\n\t\t\tif (DUK_SIGNBIT(y)) {\n\t\t\t\treturn -2.356194490192345;\n\t\t\t} else {\n\t\t\t\treturn -0.7853981633974483;\n\t\t\t}\n\t\t} else {\n\t\t\tif (DUK_SIGNBIT(y)) {\n\t\t\t\treturn 2.356194490192345;\n\t\t\t} else {\n\t\t\t\treturn 0.7853981633974483;\n\t\t\t}\n\t\t}\n\t}\n#else\n\t/* Some ISO C assumptions. */\n\tDUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == 0.7853981633974483);\n\tDUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY) == -0.7853981633974483);\n\tDUK_ASSERT(DUK_ATAN2(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == 2.356194490192345);\n\tDUK_ASSERT(DUK_ATAN2(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY) == -2.356194490192345);\n#endif\n\n\treturn DUK_ATAN2(x, y);\n}\n#endif  /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */\n\n/* order must match constants in genbuiltins.py */\nDUK_LOCAL const duk__one_arg_func duk__one_arg_funcs[] = {\n#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS)\n\tduk__fabs,\n\tduk__acos,\n\tduk__asin,\n\tduk__atan,\n\tduk__ceil,\n\tduk__cos,\n\tduk__exp,\n\tduk__floor,\n\tduk__log,\n\tduk__round_fixed,\n\tduk__sin,\n\tduk__sqrt,\n\tduk__tan,\n#if defined(DUK_USE_ES6)\n\tduk__cbrt,\n\tduk__log2,\n\tduk__log10,\n\tduk__trunc\n#endif\n#else  /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */\n\tDUK_FABS,\n\tDUK_ACOS,\n\tDUK_ASIN,\n\tDUK_ATAN,\n\tDUK_CEIL,\n\tDUK_COS,\n\tDUK_EXP,\n\tDUK_FLOOR,\n\tDUK_LOG,\n\tduk__round_fixed,\n\tDUK_SIN,\n\tDUK_SQRT,\n\tDUK_TAN,\n#if defined(DUK_USE_ES6)\n\tduk__cbrt,\n\tduk__log2,\n\tduk__log10,\n\tduk__trunc\n#endif\n#endif  /* DUK_USE_AVOID_PLATFORM_FUNCPTRS */\n};\n\n/* order must match constants in genbuiltins.py */\nDUK_LOCAL const duk__two_arg_func duk__two_arg_funcs[] = {\n#if defined(DUK_USE_AVOID_PLATFORM_FUNCPTRS)\n\tduk__atan2_fixed,\n\tduk_js_arith_pow\n#else\n\tduk__atan2_fixed,\n\tduk_js_arith_pow\n#endif\n};\n\nDUK_INTERNAL duk_ret_t duk_bi_math_object_onearg_shared(duk_hthread *thr) {\n\tduk_small_int_t fun_idx = duk_get_current_magic(thr);\n\tduk__one_arg_func fun;\n\tduk_double_t arg1;\n\n\tDUK_ASSERT(fun_idx >= 0);\n\tDUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__one_arg_funcs) / sizeof(duk__one_arg_func)));\n\targ1 = duk_to_number(thr, 0);\n\tfun = duk__one_arg_funcs[fun_idx];\n\tduk_push_number(thr, (duk_double_t) fun((double) arg1));\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_math_object_twoarg_shared(duk_hthread *thr) {\n\tduk_small_int_t fun_idx = duk_get_current_magic(thr);\n\tduk__two_arg_func fun;\n\tduk_double_t arg1;\n\tduk_double_t arg2;\n\n\tDUK_ASSERT(fun_idx >= 0);\n\tDUK_ASSERT(fun_idx < (duk_small_int_t) (sizeof(duk__two_arg_funcs) / sizeof(duk__two_arg_func)));\n\targ1 = duk_to_number(thr, 0);  /* explicit ordered evaluation to match coercion semantics */\n\targ2 = duk_to_number(thr, 1);\n\tfun = duk__two_arg_funcs[fun_idx];\n\tduk_push_number(thr, (duk_double_t) fun((double) arg1, (double) arg2));\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_math_object_max(duk_hthread *thr) {\n\treturn duk__math_minmax(thr, -DUK_DOUBLE_INFINITY, duk__fmax_fixed);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_math_object_min(duk_hthread *thr) {\n\treturn duk__math_minmax(thr, DUK_DOUBLE_INFINITY, duk__fmin_fixed);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_math_object_random(duk_hthread *thr) {\n\tduk_push_number(thr, (duk_double_t) DUK_UTIL_GET_RANDOM_DOUBLE(thr));\n\treturn 1;\n}\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_math_object_hypot(duk_hthread *thr) {\n\t/*\n\t *  E6 Section 20.2.2.18: Math.hypot\n\t *\n\t *  - If no arguments are passed, the result is +0.\n\t *  - If any argument is +inf, the result is +inf.\n\t *  - If any argument is -inf, the result is +inf.\n\t *  - If no argument is +inf or -inf, and any argument is NaN, the result is\n\t *    NaN.\n\t *  - If all arguments are either +0 or -0, the result is +0.\n\t */\n\n\tduk_idx_t nargs;\n\tduk_idx_t i;\n\tduk_bool_t found_nan;\n\tduk_double_t max;\n\tduk_double_t sum, summand;\n\tduk_double_t comp, prelim;\n\tduk_double_t t;\n\n\tnargs = duk_get_top(thr);\n\n\t/* Find the highest value.  Also ToNumber() coerces. */\n\tmax = 0.0;\n\tfound_nan = 0;\n\tfor (i = 0; i < nargs; i++) {\n\t\tt = DUK_FABS(duk_to_number(thr, i));\n\t\tif (DUK_FPCLASSIFY(t) == DUK_FP_NAN) {\n\t\t\tfound_nan = 1;\n\t\t} else {\n\t\t\tmax = duk_double_fmax(max, t);\n\t\t}\n\t}\n\n\t/* Early return cases. */\n\tif (max == DUK_DOUBLE_INFINITY) {\n\t\tduk_push_number(thr, DUK_DOUBLE_INFINITY);\n\t\treturn 1;\n\t} else if (found_nan) {\n\t\tduk_push_number(thr, DUK_DOUBLE_NAN);\n\t\treturn 1;\n\t} else if (max == 0.0) {\n\t\tduk_push_number(thr, 0.0);\n\t\t/* Otherwise we'd divide by zero. */\n\t\treturn 1;\n\t}\n\n\t/* Use Kahan summation and normalize to the highest value to minimize\n\t * floating point rounding error and avoid overflow.\n\t *\n\t * https://en.wikipedia.org/wiki/Kahan_summation_algorithm\n\t */\n\tsum = 0.0;\n\tcomp = 0.0;\n\tfor (i = 0; i < nargs; i++) {\n\t\tt = DUK_FABS(duk_get_number(thr, i)) / max;\n\t\tsummand = (t * t) - comp;\n\t\tprelim = sum + summand;\n\t\tcomp = (prelim - sum) - summand;\n\t\tsum = prelim;\n\t}\n\n\tduk_push_number(thr, (duk_double_t) DUK_SQRT(sum) * max);\n\treturn 1;\n}\n#endif  /* DUK_USE_ES6 */\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_math_object_sign(duk_hthread *thr) {\n\tduk_double_t d;\n\n\td = duk_to_number(thr, 0);\n\tif (duk_double_is_nan(d)) {\n\t\tDUK_ASSERT(duk_is_nan(thr, -1));\n\t\treturn 1;  /* NaN input -> return NaN */\n\t}\n\tif (d == 0.0) {\n\t\t/* Zero sign kept, i.e. -0 -> -0, +0 -> +0. */\n\t\treturn 1;\n\t}\n\tduk_push_int(thr, (d > 0.0 ? 1 : -1));\n\treturn 1;\n}\n#endif  /* DUK_USE_ES6 */\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_math_object_clz32(duk_hthread *thr) {\n\tduk_uint32_t x;\n\tduk_small_uint_t i;\n\n#if defined(DUK_USE_PREFER_SIZE)\n\tduk_uint32_t mask;\n\n\tx = duk_to_uint32(thr, 0);\n\tfor (i = 0, mask = 0x80000000UL; mask != 0; mask >>= 1) {\n\t\tif (x & mask) {\n\t\t\tbreak;\n\t\t}\n\t\ti++;\n\t}\n\tDUK_ASSERT(i <= 32);\n\tduk_push_uint(thr, i);\n\treturn 1;\n#else  /* DUK_USE_PREFER_SIZE */\n\ti = 0;\n\tx = duk_to_uint32(thr, 0);\n\tif (x & 0xffff0000UL) {\n\t\tx >>= 16;\n\t} else {\n\t\ti += 16;\n\t}\n\tif (x & 0x0000ff00UL) {\n\t\tx >>= 8;\n\t} else {\n\t\ti += 8;\n\t}\n\tif (x & 0x000000f0UL) {\n\t\tx >>= 4;\n\t} else {\n\t\ti += 4;\n\t}\n\tif (x & 0x0000000cUL) {\n\t\tx >>= 2;\n\t} else {\n\t\ti += 2;\n\t}\n\tif (x & 0x00000002UL) {\n\t\tx >>= 1;\n\t} else {\n\t\ti += 1;\n\t}\n\tif (x & 0x00000001UL) {\n\t\t;\n\t} else {\n\t\ti += 1;\n\t}\n\tDUK_ASSERT(i <= 32);\n\tduk_push_uint(thr, i);\n\treturn 1;\n#endif  /* DUK_USE_PREFER_SIZE */\n}\n#endif  /* DUK_USE_ES6 */\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_math_object_imul(duk_hthread *thr) {\n\tduk_uint32_t x, y, z;\n\n\tx = duk_to_uint32(thr, 0);\n\ty = duk_to_uint32(thr, 1);\n\tz = x * y;\n\n\t/* While arguments are ToUint32() coerced and the multiplication\n\t * is unsigned as such, the final result is curiously interpreted\n\t * as a signed 32-bit value.\n\t */\n\tduk_push_i32(thr, (duk_int32_t) z);\n\treturn 1;\n}\n#endif  /* DUK_USE_ES6 */\n\n#endif  /* DUK_USE_MATH_BUILTIN */\n#line 1 \"duk_bi_number.c\"\n/*\n *  Number built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_NUMBER_BUILTIN)\n\nDUK_LOCAL duk_double_t duk__push_this_number_plain(duk_hthread *thr) {\n\tduk_hobject *h;\n\n\t/* Number built-in accepts a plain number or a Number object (whose\n\t * internal value is operated on).  Other types cause TypeError.\n\t */\n\n\tduk_push_this(thr);\n\tif (duk_is_number(thr, -1)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"plain number value: %!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\t\tgoto done;\n\t}\n\th = duk_get_hobject(thr, -1);\n\tif (!h ||\n\t    (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_NUMBER)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"unacceptable this value: %!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\t\tDUK_ERROR_TYPE(thr, \"number expected\");\n\t}\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);\n\tDUK_ASSERT(duk_is_number(thr, -1));\n\tDUK_DDD(DUK_DDDPRINT(\"number object: %!T, internal value: %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));\n\tduk_remove_m2(thr);\n\n done:\n\treturn duk_get_number(thr, -1);\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_number_constructor(duk_hthread *thr) {\n\tduk_idx_t nargs;\n\tduk_hobject *h_this;\n\n\t/*\n\t *  The Number constructor uses ToNumber(arg) for number coercion\n\t *  (coercing an undefined argument to NaN).  However, if the\n\t *  argument is not given at all, +0 must be used instead.  To do\n\t *  this, a vararg function is used.\n\t */\n\n\tnargs = duk_get_top(thr);\n\tif (nargs == 0) {\n\t\tduk_push_int(thr, 0);\n\t}\n\tduk_to_number(thr, 0);\n\tduk_set_top(thr, 1);\n\tDUK_ASSERT_TOP(thr, 1);\n\n\tif (!duk_is_constructor_call(thr)) {\n\t\treturn 1;\n\t}\n\n\t/*\n\t *  E5 Section 15.7.2.1 requires that the constructed object\n\t *  must have the original Number.prototype as its internal\n\t *  prototype.  However, since Number.prototype is non-writable\n\t *  and non-configurable, this doesn't have to be enforced here:\n\t *  The default object (bound to 'this') is OK, though we have\n\t *  to change its class.\n\t *\n\t *  Internal value set to ToNumber(arg) or +0; if no arg given,\n\t *  ToNumber(undefined) = NaN, so special treatment is needed\n\t *  (above).  String internal value is immutable.\n\t */\n\n\t/* XXX: helper */\n\tduk_push_this(thr);\n\th_this = duk_known_hobject(thr, -1);\n\tDUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_NUMBER);\n\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE]);\n\tDUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_this) == DUK_HOBJECT_CLASS_NUMBER);\n\tDUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_this));\n\n\tduk_dup_0(thr);  /* -> [ val obj val ] */\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);\n\treturn 0;  /* no return value -> don't replace created value */\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_number_prototype_value_of(duk_hthread *thr) {\n\t(void) duk__push_this_number_plain(thr);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_string(duk_hthread *thr) {\n\tduk_small_int_t radix;\n\tduk_small_uint_t n2s_flags;\n\n\t(void) duk__push_this_number_plain(thr);\n\tif (duk_is_undefined(thr, 0)) {\n\t\tradix = 10;\n\t} else {\n\t\tradix = (duk_small_int_t) duk_to_int_check_range(thr, 0, 2, 36);\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"radix=%ld\", (long) radix));\n\n\tn2s_flags = 0;\n\n\tduk_numconv_stringify(thr,\n\t                      radix /*radix*/,\n\t                      0 /*digits*/,\n\t                      n2s_flags /*flags*/);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_locale_string(duk_hthread *thr) {\n\t/* XXX: just use toString() for now; permitted although not recommended.\n\t * nargs==1, so radix is passed to toString().\n\t */\n\treturn duk_bi_number_prototype_to_string(thr);\n}\n\n/*\n *  toFixed(), toExponential(), toPrecision()\n */\n\n/* XXX: shared helper for toFixed(), toExponential(), toPrecision()? */\n\nDUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_fixed(duk_hthread *thr) {\n\tduk_small_int_t frac_digits;\n\tduk_double_t d;\n\tduk_small_int_t c;\n\tduk_small_uint_t n2s_flags;\n\n\tfrac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20);\n\td = duk__push_this_number_plain(thr);\n\n\tc = (duk_small_int_t) DUK_FPCLASSIFY(d);\n\tif (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {\n\t\tgoto use_to_string;\n\t}\n\n\tif (d >= 1.0e21 || d <= -1.0e21) {\n\t\tgoto use_to_string;\n\t}\n\n\tn2s_flags = DUK_N2S_FLAG_FIXED_FORMAT |\n\t            DUK_N2S_FLAG_FRACTION_DIGITS;\n\n\tduk_numconv_stringify(thr,\n\t                      10 /*radix*/,\n\t                      frac_digits /*digits*/,\n\t                      n2s_flags /*flags*/);\n\treturn 1;\n\n use_to_string:\n\tDUK_ASSERT_TOP(thr, 2);\n\tduk_to_string(thr, -1);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_exponential(duk_hthread *thr) {\n\tduk_bool_t frac_undefined;\n\tduk_small_int_t frac_digits;\n\tduk_double_t d;\n\tduk_small_int_t c;\n\tduk_small_uint_t n2s_flags;\n\n\td = duk__push_this_number_plain(thr);\n\n\tfrac_undefined = duk_is_undefined(thr, 0);\n\tduk_to_int(thr, 0);  /* for side effects */\n\n\tc = (duk_small_int_t) DUK_FPCLASSIFY(d);\n\tif (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {\n\t\tgoto use_to_string;\n\t}\n\n\tfrac_digits = (duk_small_int_t) duk_to_int_check_range(thr, 0, 0, 20);\n\n\tn2s_flags = DUK_N2S_FLAG_FORCE_EXP |\n\t           (frac_undefined ? 0 : DUK_N2S_FLAG_FIXED_FORMAT);\n\n\tduk_numconv_stringify(thr,\n\t                      10 /*radix*/,\n\t                      frac_digits + 1 /*leading digit + fractions*/,\n\t                      n2s_flags /*flags*/);\n\treturn 1;\n\n use_to_string:\n\tDUK_ASSERT_TOP(thr, 2);\n\tduk_to_string(thr, -1);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_number_prototype_to_precision(duk_hthread *thr) {\n\t/* The specification has quite awkward order of coercion and\n\t * checks for toPrecision().  The operations below are a bit\n\t * reordered, within constraints of observable side effects.\n\t */\n\n\tduk_double_t d;\n\tduk_small_int_t prec;\n\tduk_small_int_t c;\n\tduk_small_uint_t n2s_flags;\n\n\tDUK_ASSERT_TOP(thr, 1);\n\n\td = duk__push_this_number_plain(thr);\n\tif (duk_is_undefined(thr, 0)) {\n\t\tgoto use_to_string;\n\t}\n\tDUK_ASSERT_TOP(thr, 2);\n\n\tduk_to_int(thr, 0);  /* for side effects */\n\n\tc = (duk_small_int_t) DUK_FPCLASSIFY(d);\n\tif (c == DUK_FP_NAN || c == DUK_FP_INFINITE) {\n\t\tgoto use_to_string;\n\t}\n\n\tprec = (duk_small_int_t) duk_to_int_check_range(thr, 0, 1, 21);\n\n\tn2s_flags = DUK_N2S_FLAG_FIXED_FORMAT |\n\t            DUK_N2S_FLAG_NO_ZERO_PAD;\n\n\tduk_numconv_stringify(thr,\n\t                      10 /*radix*/,\n\t                      prec /*digits*/,\n\t                      n2s_flags /*flags*/);\n\treturn 1;\n\n use_to_string:\n\t/* Used when precision is undefined; also used for NaN (-> \"NaN\"),\n\t * and +/- infinity (-> \"Infinity\", \"-Infinity\").\n\t */\n\n\tDUK_ASSERT_TOP(thr, 2);\n\tduk_to_string(thr, -1);\n\treturn 1;\n}\n\n#endif  /* DUK_USE_NUMBER_BUILTIN */\n#line 1 \"duk_bi_object.c\"\n/*\n *  Object built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Needed even when Object built-in disabled. */\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_string(duk_hthread *thr) {\n\tduk_tval *tv;\n\ttv = DUK_HTHREAD_THIS_PTR(thr);\n\t/* XXX: This is not entirely correct anymore; in ES2015 the\n\t * default lookup should use @@toStringTag to come up with\n\t * e.g. [object Symbol].\n\t */\n\tduk_push_class_string_tval(thr, tv);\n\treturn 1;\n}\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor(duk_hthread *thr) {\n\tduk_uint_t arg_mask;\n\n\targ_mask = duk_get_type_mask(thr, 0);\n\n\tif (!duk_is_constructor_call(thr) &&  /* not a constructor call */\n\t    ((arg_mask & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) == 0)) {  /* and argument not null or undefined */\n\t\tduk_to_object(thr, 0);\n\t\treturn 1;\n\t}\n\n\t/* Pointer and buffer primitive values are treated like other\n\t * primitives values which have a fully fledged object counterpart:\n\t * promote to an object value.  Lightfuncs and plain buffers are\n\t * coerced with ToObject() even they could also be returned as is.\n\t */\n\tif (arg_mask & (DUK_TYPE_MASK_OBJECT |\n\t                DUK_TYPE_MASK_STRING |\n\t                DUK_TYPE_MASK_BOOLEAN |\n\t                DUK_TYPE_MASK_NUMBER |\n\t                DUK_TYPE_MASK_POINTER |\n\t                DUK_TYPE_MASK_BUFFER |\n\t                DUK_TYPE_MASK_LIGHTFUNC)) {\n\t\t/* For DUK_TYPE_OBJECT the coercion is a no-op and could\n\t\t * be checked for explicitly, but Object(obj) calls are\n\t\t * not very common so opt for minimal footprint.\n\t\t */\n\t\tduk_to_object(thr, 0);\n\t\treturn 1;\n\t}\n\n\t(void) duk_push_object_helper(thr,\n\t                              DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t                              DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),\n\t                              DUK_BIDX_OBJECT_PROTOTYPE);\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_assign(duk_hthread *thr) {\n\tduk_idx_t nargs;\n\tduk_int_t idx;\n\n\tnargs = duk_get_top_require_min(thr, 1 /*min_top*/);\n\n\tduk_to_object(thr, 0);\n\tfor (idx = 1; idx < nargs; idx++) {\n\t\t/* E7 19.1.2.1 (step 4a) */\n\t\tif (duk_is_null_or_undefined(thr, idx)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* duk_enum() respects ES2015+ [[OwnPropertyKeys]] ordering, which is\n\t\t * convenient here.\n\t\t */\n\t\tduk_to_object(thr, idx);\n\t\tduk_enum(thr, idx, DUK_ENUM_OWN_PROPERTIES_ONLY);\n\t\twhile (duk_next(thr, -1, 1 /*get_value*/)) {\n\t\t\t/* [ target ... enum key value ] */\n\t\t\tduk_put_prop(thr, 0);\n\t\t\t/* [ target ... enum ] */\n\t\t}\n\t\t/* Could pop enumerator, but unnecessary because of duk_set_top()\n\t\t * below.\n\t\t */\n\t}\n\n\tduk_set_top(thr, 1);\n\treturn 1;\n}\n#endif\n\n#if defined(DUK_USE_OBJECT_BUILTIN) && defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_is(duk_hthread *thr) {\n\tDUK_ASSERT_TOP(thr, 2);\n\tduk_push_boolean(thr, duk_samevalue(thr, 0, 1));\n\treturn 1;\n}\n#endif\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_create(duk_hthread *thr) {\n\tduk_hobject *proto;\n\n\tDUK_ASSERT_TOP(thr, 2);\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\tduk_hbufobj_promote_plain(thr, 0);\n#endif\n\tproto = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_NULL);\n\tDUK_ASSERT(proto != NULL || duk_is_null(thr, 0));\n\n\t(void) duk_push_object_helper_proto(thr,\n\t                                    DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                    DUK_HOBJECT_FLAG_FASTREFS |\n\t                                    DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),\n\t                                    proto);\n\n\tif (!duk_is_undefined(thr, 1)) {\n\t\t/* [ O Properties obj ] */\n\n\t\tduk_replace(thr, 0);\n\n\t\t/* [ obj Properties ] */\n\n\t\t/* Just call the \"original\" Object.defineProperties() to\n\t\t * finish up.\n\t\t */\n\n\t\treturn duk_bi_object_constructor_define_properties(thr);\n\t}\n\n\t/* [ O Properties obj ] */\n\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_properties(duk_hthread *thr) {\n\tduk_small_uint_t pass;\n\tduk_uint_t defprop_flags;\n\tduk_hobject *obj;\n\tduk_idx_t idx_value;\n\tduk_hobject *get;\n\tduk_hobject *set;\n\n\t/* Lightfunc and plain buffer handling by ToObject() coercion. */\n\tobj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\tDUK_ASSERT(obj != NULL);\n\n\tduk_to_object(thr, 1);        /* properties object */\n\n\tDUK_DDD(DUK_DDDPRINT(\"target=%!iT, properties=%!iT\",\n\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t                     (duk_tval *) duk_get_tval(thr, 1)));\n\n\t/*\n\t *  Two pass approach to processing the property descriptors.\n\t *  On first pass validate and normalize all descriptors before\n\t *  any changes are made to the target object.  On second pass\n\t *  make the actual modifications to the target object.\n\t *\n\t *  Right now we'll just use the same normalize/validate helper\n\t *  on both passes, ignoring its outputs on the first pass.\n\t */\n\n\tfor (pass = 0; pass < 2; pass++) {\n\t\tduk_set_top(thr, 2);  /* -> [ hobject props ] */\n\t\tduk_enum(thr, 1, DUK_ENUM_OWN_PROPERTIES_ONLY | DUK_ENUM_INCLUDE_SYMBOLS /*enum_flags*/);\n\n\t\tfor (;;) {\n\t\t\tduk_hstring *key;\n\n\t\t\t/* [ hobject props enum(props) ] */\n\n\t\t\tduk_set_top(thr, 3);\n\n\t\t\tif (!duk_next(thr, 2, 1 /*get_value*/)) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> key=%!iT, desc=%!iT\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t\t\t/* [ hobject props enum(props) key desc ] */\n\n\t\t\tduk_hobject_prepare_property_descriptor(thr,\n\t\t\t                                        4 /*idx_desc*/,\n\t\t\t                                        &defprop_flags,\n\t\t\t                                        &idx_value,\n\t\t\t                                        &get,\n\t\t\t                                        &set);\n\n\t\t\t/* [ hobject props enum(props) key desc [multiple values] ] */\n\n\t\t\tif (pass == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* This allows symbols on purpose. */\n\t\t\tkey = duk_known_hstring(thr, 3);\n\t\t\tDUK_ASSERT(key != NULL);\n\n\t\t\tduk_hobject_define_property_helper(thr,\n\t\t\t                                   defprop_flags,\n\t\t\t                                   obj,\n\t\t\t                                   key,\n\t\t\t                                   idx_value,\n\t\t\t                                   get,\n\t\t\t                                   set,\n\t\t\t                                   1 /*throw_flag*/);\n\t\t}\n\t}\n\n\t/*\n\t *  Return target object\n\t */\n\n\tduk_dup_0(thr);\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_seal_freeze_shared(duk_hthread *thr) {\n\tDUK_ASSERT_TOP(thr, 1);\n\n\tduk_seal_freeze_raw(thr, 0, (duk_bool_t) duk_get_current_magic(thr) /*is_freeze*/);\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_sealed_frozen_shared(duk_hthread *thr) {\n\tduk_hobject *h;\n\tduk_bool_t is_frozen;\n\tduk_uint_t mask;\n\n\tis_frozen = (duk_bool_t) duk_get_current_magic(thr);\n\tmask = duk_get_type_mask(thr, 0);\n\tif (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) {\n\t\tDUK_ASSERT(is_frozen == 0 || is_frozen == 1);\n\t\tduk_push_boolean(thr, (mask & DUK_TYPE_MASK_LIGHTFUNC) ?\n\t\t                          1 :               /* lightfunc always frozen and sealed */\n\t\t                          (is_frozen ^ 1)); /* buffer sealed but not frozen (index props writable) */\n\t} else {\n\t\t/* ES2015 Sections 19.1.2.12, 19.1.2.13: anything other than an object\n\t\t * is considered to be already sealed and frozen.\n\t\t */\n\t\th = duk_get_hobject(thr, 0);\n\t\tduk_push_boolean(thr, (h == NULL) ||\n\t\t                      duk_hobject_object_is_sealed_frozen_helper(thr, h, is_frozen /*is_frozen*/));\n\t}\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_to_locale_string(duk_hthread *thr) {\n\tDUK_ASSERT_TOP(thr, 0);\n\t(void) duk_push_this_coercible_to_object(thr);\n\tduk_get_prop_stridx_short(thr, 0, DUK_STRIDX_TO_STRING);\n#if 0  /* This is mentioned explicitly in the E5.1 spec, but duk_call_method() checks for it in practice. */\n\tduk_require_callable(thr, 1);\n#endif\n\tduk_dup_0(thr);  /* -> [ O toString O ] */\n\tduk_call_method(thr, 0);  /* XXX: call method tail call? */\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_value_of(duk_hthread *thr) {\n\t/* For lightfuncs and plain buffers, returns Object() coerced. */\n\t(void) duk_push_this_coercible_to_object(thr);\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_is_prototype_of(duk_hthread *thr) {\n\tduk_hobject *h_v;\n\tduk_hobject *h_obj;\n\n\tDUK_ASSERT_TOP(thr, 1);\n\n\th_v = duk_get_hobject(thr, 0);\n\tif (!h_v) {\n\t\tduk_push_false(thr);  /* XXX: tail call: return duk_push_false(thr) */\n\t\treturn 1;\n\t}\n\n\th_obj = duk_push_this_coercible_to_object(thr);\n\tDUK_ASSERT(h_obj != NULL);\n\n\t/* E5.1 Section 15.2.4.6, step 3.a, lookup proto once before compare.\n\t * Prototype loops should cause an error to be thrown.\n\t */\n\tduk_push_boolean(thr, duk_hobject_prototype_chain_contains(thr, DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_v), h_obj, 0 /*ignore_loop*/));\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_has_own_property(duk_hthread *thr) {\n\treturn (duk_ret_t) duk_hobject_object_ownprop_helper(thr, 0 /*required_desc_flags*/);\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_property_is_enumerable(duk_hthread *thr) {\n\treturn (duk_ret_t) duk_hobject_object_ownprop_helper(thr, DUK_PROPDESC_FLAG_ENUMERABLE /*required_desc_flags*/);\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)\n/* Shared helper to implement Object.getPrototypeOf,\n * Object.prototype.__proto__ getter, and Reflect.getPrototypeOf.\n *\n * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__\n */\nDUK_INTERNAL duk_ret_t duk_bi_object_getprototype_shared(duk_hthread *thr) {\n\t/*\n\t *  magic = 0: __proto__ getter\n\t *  magic = 1: Object.getPrototypeOf()\n\t *  magic = 2: Reflect.getPrototypeOf()\n\t */\n\n\tduk_hobject *h;\n\tduk_hobject *proto;\n\tduk_tval *tv;\n\tduk_int_t magic;\n\n\tmagic = duk_get_current_magic(thr);\n\n\tif (magic == 0) {\n\t\tDUK_ASSERT_TOP(thr, 0);\n\t\tduk_push_this_coercible_to_object(thr);\n\t}\n\tDUK_ASSERT(duk_get_top(thr) >= 1);\n\tif (magic < 2) {\n\t\t/* ES2015 Section 19.1.2.9, step 1 */\n\t\tduk_to_object(thr, 0);\n\t}\n\ttv = DUK_GET_TVAL_POSIDX(thr, 0);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_BUFFER:\n\t\tproto = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];\n\t\tbreak;\n\tcase DUK_TAG_LIGHTFUNC:\n\t\tproto = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE];\n\t\tbreak;\n\tcase DUK_TAG_OBJECT:\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tproto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);\n\t\tbreak;\n\tdefault:\n\t\t/* This implicitly handles CheckObjectCoercible() caused\n\t\t * TypeError.\n\t\t */\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\tif (proto != NULL) {\n\t\tduk_push_hobject(thr, proto);\n\t} else {\n\t\tduk_push_null(thr);\n\t}\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)\n/* Shared helper to implement ES2015 Object.setPrototypeOf,\n * Object.prototype.__proto__ setter, and Reflect.setPrototypeOf.\n *\n * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-object.prototype.__proto__\n * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.setprototypeof\n */\nDUK_INTERNAL duk_ret_t duk_bi_object_setprototype_shared(duk_hthread *thr) {\n\t/*\n\t *  magic = 0: __proto__ setter\n\t *  magic = 1: Object.setPrototypeOf()\n\t *  magic = 2: Reflect.setPrototypeOf()\n\t */\n\n\tduk_hobject *h_obj;\n\tduk_hobject *h_new_proto;\n\tduk_hobject *h_curr;\n\tduk_ret_t ret_success = 1;  /* retval for success path */\n\tduk_uint_t mask;\n\tduk_int_t magic;\n\n\t/* Preliminaries for __proto__ and setPrototypeOf (E6 19.1.2.18 steps 1-4). */\n\tmagic = duk_get_current_magic(thr);\n\tif (magic == 0) {\n\t\tduk_push_this_check_object_coercible(thr);\n\t\tduk_insert(thr, 0);\n\t\tif (!duk_check_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t/* __proto__ setter returns 'undefined' on success unlike the\n\t\t * setPrototypeOf() call which returns the target object.\n\t\t */\n\t\tret_success = 0;\n\t} else {\n\t\tif (magic == 1) {\n\t\t\tduk_require_object_coercible(thr, 0);\n\t\t} else {\n\t\t\tduk_require_hobject_accept_mask(thr, 0,\n\t\t\t                                DUK_TYPE_MASK_LIGHTFUNC |\n\t\t\t                                DUK_TYPE_MASK_BUFFER);\n\t\t}\n\t\tduk_require_type_mask(thr, 1, DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_OBJECT);\n\t}\n\n\th_new_proto = duk_get_hobject(thr, 1);\n\t/* h_new_proto may be NULL */\n\n\tmask = duk_get_type_mask(thr, 0);\n\tif (mask & (DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER)) {\n\t\tduk_hobject *curr_proto;\n\t\tcurr_proto = thr->builtins[(mask & DUK_TYPE_MASK_LIGHTFUNC) ?\n\t\t                               DUK_BIDX_FUNCTION_PROTOTYPE :\n\t\t                               DUK_BIDX_UINT8ARRAY_PROTOTYPE];\n\t\tif (h_new_proto == curr_proto) {\n\t\t\tgoto skip;\n\t\t}\n\t\tgoto fail_nonextensible;\n\t}\n\th_obj = duk_get_hobject(thr, 0);\n\tif (h_obj == NULL) {\n\t\tgoto skip;\n\t}\n\tDUK_ASSERT(h_obj != NULL);\n\n\t/* [[SetPrototypeOf]] standard behavior, E6 9.1.2. */\n\t/* TODO: implement Proxy object support here */\n\n\tif (h_new_proto == DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_obj)) {\n\t\tgoto skip;\n\t}\n\tif (!DUK_HOBJECT_HAS_EXTENSIBLE(h_obj)) {\n\t\tgoto fail_nonextensible;\n\t}\n\tfor (h_curr = h_new_proto; h_curr != NULL; h_curr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_curr)) {\n\t\t/* Loop prevention. */\n\t\tif (h_curr == h_obj) {\n\t\t\tgoto fail_loop;\n\t\t}\n\t}\n\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h_obj, h_new_proto);\n\t/* fall thru */\n\n skip:\n\tduk_set_top(thr, 1);\n\tif (magic == 2) {\n\t\tduk_push_true(thr);\n\t}\n\treturn ret_success;\n\n fail_nonextensible:\n fail_loop:\n\tif (magic != 2) {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t} else {\n\t\tduk_push_false(thr);\n\t\treturn 1;\n\t}\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_define_property(duk_hthread *thr) {\n\t/*\n\t *  magic = 0: Object.defineProperty()\n\t *  magic = 1: Reflect.defineProperty()\n\t */\n\n\tduk_hobject *obj;\n\tduk_hstring *key;\n\tduk_hobject *get;\n\tduk_hobject *set;\n\tduk_idx_t idx_value;\n\tduk_uint_t defprop_flags;\n\tduk_small_uint_t magic;\n\tduk_bool_t throw_flag;\n\tduk_bool_t ret;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tDUK_DDD(DUK_DDDPRINT(\"Object.defineProperty(): ctx=%p obj=%!T key=%!T desc=%!T\",\n\t                     (void *) thr,\n\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t                     (duk_tval *) duk_get_tval(thr, 1),\n\t                     (duk_tval *) duk_get_tval(thr, 2)));\n\n\t/* [ obj key desc ] */\n\n\tmagic = (duk_small_uint_t) duk_get_current_magic(thr);\n\n\t/* Lightfuncs are currently supported by coercing to a temporary\n\t * Function object; changes will be allowed (the coerced value is\n\t * extensible) but will be lost.  Same for plain buffers.\n\t */\n\tobj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\tDUK_ASSERT(obj != NULL);\n\tkey = duk_to_property_key_hstring(thr, 1);\n\t(void) duk_require_hobject(thr, 2);\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(duk_get_hobject(thr, 2) != NULL);\n\n\t/*\n\t *  Validate and convert argument property descriptor (an Ecmascript\n\t *  object) into a set of defprop_flags and possibly property value,\n\t *  getter, and/or setter values on the value stack.\n\t *\n\t *  Lightfunc set/get values are coerced to full Functions.\n\t */\n\n\tduk_hobject_prepare_property_descriptor(thr,\n\t                                        2 /*idx_desc*/,\n\t                                        &defprop_flags,\n\t                                        &idx_value,\n\t                                        &get,\n\t                                        &set);\n\n\t/*\n\t *  Use Object.defineProperty() helper for the actual operation.\n\t */\n\n\tDUK_ASSERT(magic == 0U || magic == 1U);\n\tthrow_flag = magic ^ 1U;\n\tret = duk_hobject_define_property_helper(thr,\n\t                                         defprop_flags,\n\t                                         obj,\n\t                                         key,\n\t                                         idx_value,\n\t                                         get,\n\t                                         set,\n\t                                         throw_flag);\n\n\t/* Ignore the normalize/validate helper outputs on the value stack,\n\t * they're popped automatically.\n\t */\n\n\tif (magic == 0U) {\n\t\t/* Object.defineProperty(): return target object. */\n\t\tduk_push_hobject(thr, obj);\n\t} else {\n\t\t/* Reflect.defineProperty(): return success/fail. */\n\t\tduk_push_boolean(thr, ret);\n\t}\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_get_own_property_descriptor(duk_hthread *thr) {\n\tDUK_ASSERT_TOP(thr, 2);\n\n\t/* ES2015 Section 19.1.2.6, step 1 */\n\tif (duk_get_current_magic(thr) == 0) {\n\t\tduk_to_object(thr, 0);\n\t}\n\n\t/* [ obj key ] */\n\n\tduk_hobject_object_get_own_property_descriptor(thr, -2);\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_is_extensible(duk_hthread *thr) {\n\t/*\n\t *  magic = 0: Object.isExtensible()\n\t *  magic = 1: Reflect.isExtensible()\n\t */\n\n\tduk_hobject *h;\n\n\tif (duk_get_current_magic(thr) == 0) {\n\t\th = duk_get_hobject(thr, 0);\n\t} else {\n\t\t/* Reflect.isExtensible(): throw if non-object, but we accept lightfuncs\n\t\t * and plain buffers here because they pretend to be objects.\n\t\t */\n\t\th = duk_require_hobject_accept_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\t}\n\n\tduk_push_boolean(thr, (h != NULL) && DUK_HOBJECT_HAS_EXTENSIBLE(h));\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)\n/* Shared helper for various key/symbol listings, magic:\n * 0=Object.keys()\n * 1=Object.getOwnPropertyNames(),\n * 2=Object.getOwnPropertySymbols(),\n * 3=Reflect.ownKeys()\n */\nDUK_LOCAL const duk_small_uint_t duk__object_keys_enum_flags[4] = {\n\t/* Object.keys() */\n\tDUK_ENUM_OWN_PROPERTIES_ONLY |\n\t    DUK_ENUM_NO_PROXY_BEHAVIOR,\n\n\t/* Object.getOwnPropertyNames() */\n\tDUK_ENUM_INCLUDE_NONENUMERABLE |\n\t    DUK_ENUM_OWN_PROPERTIES_ONLY |\n\t    DUK_ENUM_NO_PROXY_BEHAVIOR,\n\n\t/* Object.getOwnPropertySymbols() */\n\tDUK_ENUM_INCLUDE_SYMBOLS |\n\t    DUK_ENUM_OWN_PROPERTIES_ONLY |\n\t    DUK_ENUM_EXCLUDE_STRINGS |\n\t    DUK_ENUM_INCLUDE_NONENUMERABLE |\n\t    DUK_ENUM_NO_PROXY_BEHAVIOR,\n\n\t/* Reflect.ownKeys() */\n\tDUK_ENUM_INCLUDE_SYMBOLS |\n\t    DUK_ENUM_OWN_PROPERTIES_ONLY |\n\t    DUK_ENUM_INCLUDE_NONENUMERABLE |\n\t    DUK_ENUM_NO_PROXY_BEHAVIOR\n};\n\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_keys_shared(duk_hthread *thr) {\n\tduk_hobject *obj;\n#if defined(DUK_USE_ES6_PROXY)\n\tduk_hobject *h_proxy_target;\n\tduk_hobject *h_proxy_handler;\n\tduk_hobject *h_trap_result;\n#endif\n\tduk_small_uint_t enum_flags;\n\tduk_int_t magic;\n\n\tDUK_ASSERT_TOP(thr, 1);\n\n\tmagic = duk_get_current_magic(thr);\n\tif (magic == 3) {\n\t\t/* ES2015 Section 26.1.11 requires a TypeError for non-objects.  Lightfuncs\n\t\t * and plain buffers pretend to be objects, so accept those too.\n\t\t */\n\t\tobj = duk_require_hobject_promote_mask(thr, 0, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\t} else {\n\t\t/* ES2015: ToObject coerce. */\n\t\tobj = duk_to_hobject(thr, 0);\n\t}\n\tDUK_ASSERT(obj != NULL);\n\tDUK_UNREF(obj);\n\n\t/* XXX: proxy chains */\n\n#if defined(DUK_USE_ES6_PROXY)\n\t/* XXX: better sharing of code between proxy target call sites */\n\tif (DUK_LIKELY(!duk_hobject_proxy_check(obj,\n\t                                        &h_proxy_target,\n\t                                        &h_proxy_handler))) {\n\t\tgoto skip_proxy;\n\t}\n\n\tduk_push_hobject(thr, h_proxy_handler);\n\tif (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) {\n\t\t/* Careful with reachability here: don't pop 'obj' before pushing\n\t\t * proxy target.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"no ownKeys trap, get keys of target instead\"));\n\t\tduk_pop_2(thr);\n\t\tduk_push_hobject(thr, h_proxy_target);\n\t\tduk_replace(thr, 0);\n\t\tDUK_ASSERT_TOP(thr, 1);\n\t\tgoto skip_proxy;\n\t}\n\n\t/* [ obj handler trap ] */\n\tduk_insert(thr, -2);\n\tduk_push_hobject(thr, h_proxy_target);  /* -> [ obj trap handler target ] */\n\tduk_call_method(thr, 1 /*nargs*/);      /* -> [ obj trap_result ] */\n\th_trap_result = duk_require_hobject(thr, -1);\n\tDUK_UNREF(h_trap_result);\n\n\tmagic = duk_get_current_magic(thr);\n\tDUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t)));\n\tenum_flags = duk__object_keys_enum_flags[magic];\n\n\tduk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags);\n\treturn 1;\n\n skip_proxy:\n#endif  /* DUK_USE_ES6_PROXY */\n\n\tDUK_ASSERT_TOP(thr, 1);\n\tmagic = duk_get_current_magic(thr);\n\tDUK_ASSERT(magic >= 0 && magic < (duk_int_t) (sizeof(duk__object_keys_enum_flags) / sizeof(duk_small_uint_t)));\n\tenum_flags = duk__object_keys_enum_flags[magic];\n\treturn duk_hobject_get_enumerated_keys(thr, enum_flags);\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */\n\n#if defined(DUK_USE_OBJECT_BUILTIN) || defined(DUK_USE_REFLECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_object_constructor_prevent_extensions(duk_hthread *thr) {\n\t/*\n\t *  magic = 0: Object.preventExtensions()\n\t *  magic = 1: Reflect.preventExtensions()\n\t */\n\n\tduk_hobject *h;\n\tduk_uint_t mask;\n\tduk_int_t magic;\n\n\tmagic = duk_get_current_magic(thr);\n\n\t/* Silent success for lightfuncs and plain buffers always. */\n\tmask = DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER;\n\n\t/* Object.preventExtensions() silent success for non-object. */\n\tif (magic == 0) {\n\t\tmask |= DUK_TYPE_MASK_UNDEFINED |\n\t\t        DUK_TYPE_MASK_NULL |\n\t\t        DUK_TYPE_MASK_BOOLEAN |\n\t\t        DUK_TYPE_MASK_NUMBER |\n\t\t        DUK_TYPE_MASK_STRING |\n\t\t        DUK_TYPE_MASK_POINTER;\n\t}\n\n\tif (duk_check_type_mask(thr, 0, mask)) {\n\t\t/* Not an object, already non-extensible so always success. */\n\t\tgoto done;\n\t}\n\th = duk_require_hobject(thr, 0);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_HOBJECT_CLEAR_EXTENSIBLE(h);\n\n\t/* A non-extensible object cannot gain any more properties,\n\t * so this is a good time to compact.\n\t */\n\tduk_hobject_compact_props(thr, h);\n\n done:\n\tif (magic == 1) {\n\t\tduk_push_true(thr);\n\t}\n\treturn 1;\n}\n#endif  /* DUK_USE_OBJECT_BUILTIN || DUK_USE_REFLECT_BUILTIN */\n\n/*\n *  __defineGetter__, __defineSetter__, __lookupGetter__, __lookupSetter__\n */\n\n#if defined(DUK_USE_ES8)\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_defineaccessor(duk_hthread *thr) {\n\tduk_push_this(thr);\n\tduk_insert(thr, 0);\n\tduk_to_object(thr, 0);\n\tduk_require_callable(thr, 2);\n\n\t/* [ ToObject(this) key getter/setter ] */\n\n\t/* ToPropertyKey() coercion is not needed, duk_def_prop() does it. */\n\tduk_def_prop(thr, 0, DUK_DEFPROP_SET_ENUMERABLE |\n\t                     DUK_DEFPROP_SET_CONFIGURABLE |\n\t                     (duk_get_current_magic(thr) ? DUK_DEFPROP_HAVE_SETTER : DUK_DEFPROP_HAVE_GETTER));\n\treturn 0;\n}\nDUK_INTERNAL duk_ret_t duk_bi_object_prototype_lookupaccessor(duk_hthread *thr) {\n\tduk_uint_t sanity;\n\n\tduk_push_this(thr);\n\tduk_to_object(thr, -1);\n\n\t/* XXX: Prototype walk (with sanity) should be a core property\n\t * operation, could add a flag to e.g. duk_get_prop_desc().\n\t */\n\n\t/* ToPropertyKey() coercion is not needed, duk_get_prop_desc() does it. */\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\twhile (!duk_is_undefined(thr, -1)) {\n\t\t/* [ key obj ] */\n\t\tduk_dup(thr, 0);\n\t\tduk_get_prop_desc(thr, 1, 0 /*flags*/);\n\t\tif (!duk_is_undefined(thr, -1)) {\n\t\t\tduk_get_prop_stridx(thr, -1, (duk_get_current_magic(thr) != 0 ? DUK_STRIDX_SET : DUK_STRIDX_GET));\n\t\t\treturn 1;\n\t\t}\n\t\tduk_pop(thr);\n\n\t\tif (DUK_UNLIKELY(sanity-- == 0)) {\n\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);\n\t\t}\n\n\t\tduk_get_prototype(thr, -1);\n\t\tduk_remove(thr, -2);\n\t}\n\treturn 1;\n}\n#endif  /* DUK_USE_ES8 */\n#line 1 \"duk_bi_performance.c\"\n/*\n *  High resolution time API (performance.now() et al)\n *\n *  API specification: https://encoding.spec.whatwg.org/#ap://www.w3.org/TR/hr-time/\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_PERFORMANCE_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_performance_now(duk_hthread *thr) {\n\t/* From API spec:\n\t * The DOMHighResTimeStamp type is used to store a time value in\n\t * milliseconds, measured relative from the time origin, global\n\t * monotonic clock, or a time value that represents a duration\n\t * between two DOMHighResTimeStamp's.\n\t */\n\tduk_push_number(thr, duk_time_get_monotonic_time(thr));\n\treturn 1;\n}\n\n#if 0  /* Missing until semantics decided. */\nDUK_INTERNAL duk_ret_t duk_bi_performance_timeorigin_getter(duk_hthread *thr) {\n\t/* No decision yet how to handle timeOrigins, e.g. should one be\n\t * initialized per heap, or per global object set.  See\n\t * https://www.w3.org/TR/hr-time/#time-origin.\n\t */\n\tduk_push_uint(thr, 0);\n\treturn 1;\n}\n#endif  /* 0 */\n#endif  /* DUK_USE_PERFORMANCE_BUILTIN */\n#line 1 \"duk_bi_pointer.c\"\n/*\n *  Pointer built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Constructor\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_pointer_constructor(duk_hthread *thr) {\n\t/* XXX: this behavior is quite useless now; it would be nice to be able\n\t * to create pointer values from e.g. numbers or strings.  Numbers are\n\t * problematic on 64-bit platforms though.  Hex encoded strings?\n\t */\n\tif (duk_get_top(thr) == 0) {\n\t\tduk_push_pointer(thr, NULL);\n\t} else {\n\t\tduk_to_pointer(thr, 0);\n\t}\n\tDUK_ASSERT(duk_is_pointer(thr, 0));\n\tduk_set_top(thr, 1);\n\n\tif (duk_is_constructor_call(thr)) {\n\t\t(void) duk_push_object_helper(thr,\n\t\t                              DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t\t                              DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER),\n\t\t                              DUK_BIDX_POINTER_PROTOTYPE);\n\n\t\t/* Pointer object internal value is immutable */\n\t\tduk_dup_0(thr);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);\n\t}\n\t/* Note: unbalanced stack on purpose */\n\n\treturn 1;\n}\n\n/*\n *  toString(), valueOf()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_pointer_prototype_tostring_shared(duk_hthread *thr) {\n\tduk_tval *tv;\n\tduk_small_int_t to_string = duk_get_current_magic(thr);\n\n\tduk_push_this(thr);\n\ttv = duk_require_tval(thr, -1);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_POINTER(tv)) {\n\t\t/* nop */\n\t} else if (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\t/* Must be a \"pointer object\", i.e. class \"Pointer\" */\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_POINTER) {\n\t\t\tgoto type_error;\n\t\t}\n\n\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);\n\t} else {\n\t\tgoto type_error;\n\t}\n\n\tif (to_string) {\n\t\tduk_to_string(thr, -1);\n\t}\n\treturn 1;\n\n type_error:\n\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n}\n#line 1 \"duk_bi_promise.c\"\n/*\n *  Promise built-in\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_PROMISE_BUILTIN)\n\nDUK_INTERNAL duk_ret_t duk_bi_promise_constructor(duk_hthread *thr) {\n\tDUK_ERROR_TYPE(thr, \"unimplemented\");\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_promise_all(duk_hthread *thr) {\n\tDUK_ERROR_TYPE(thr, \"unimplemented\");\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_promise_race(duk_hthread *thr) {\n\tDUK_ERROR_TYPE(thr, \"unimplemented\");\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_promise_reject(duk_hthread *thr) {\n\tDUK_ERROR_TYPE(thr, \"unimplemented\");\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_promise_resolve(duk_hthread *thr) {\n\tDUK_ERROR_TYPE(thr, \"unimplemented\");\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_promise_catch(duk_hthread *thr) {\n\tDUK_ERROR_TYPE(thr, \"unimplemented\");\n\treturn 0;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_promise_then(duk_hthread *thr) {\n\tDUK_ERROR_TYPE(thr, \"unimplemented\");\n\treturn 0;\n}\n\n#endif  /* DUK_USE_PROMISE_BUILTIN */\n#line 1 \"duk_bi_proxy.c\"\n/*\n *  Proxy built-in (ES2015)\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_ES6_PROXY)\n/* Post-process a Proxy ownKeys() result at stack top.  Push a cleaned up\n * array of valid result keys (strings or symbols).  TypeError for invalid\n * values.  Flags are shared with duk_enum().\n */\nDUK_INTERNAL void duk_proxy_ownkeys_postprocess(duk_hthread *thr, duk_hobject *h_proxy_target, duk_uint_t flags) {\n\tduk_uarridx_t i, len, idx;\n\tduk_propdesc desc;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(h_proxy_target != NULL);\n\n\tlen = (duk_uarridx_t) duk_get_length(thr, -1);\n\tidx = 0;\n\tduk_push_array(thr);\n\t/* XXX: preallocated dense array, fill in directly */\n\tfor (i = 0; i < len; i++) {\n\t\tduk_hstring *h;\n\n\t\t/* [ obj trap_result res_arr ] */\n\t\t(void) duk_get_prop_index(thr, -2, i);\n\t\th = duk_get_hstring(thr, -1);\n\t\tif (h == NULL) {\n\t\t\tDUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr);\n\t\t}\n\n\t\tif (!(flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) {\n\t\t\t/* No support for 'getOwnPropertyDescriptor' trap yet,\n\t\t\t * so check enumerability always from target object\n\t\t\t * descriptor.\n\t\t\t */\n\t\t\tif (duk_hobject_get_own_propdesc(thr, h_proxy_target, duk_known_hstring(thr, -1), &desc, 0 /*flags*/)) {\n\t\t\t\tif ((desc.flags & DUK_PROPDESC_FLAG_ENUMERABLE) == 0) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"ignore non-enumerable property: %!T\", duk_get_tval(thr, -1)));\n\t\t\t\t\tgoto skip_key;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"ignore non-existent property: %!T\", duk_get_tval(thr, -1)));\n\t\t\t\tgoto skip_key;\n\t\t\t}\n\t\t}\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\tif (!(flags & DUK_ENUM_INCLUDE_SYMBOLS)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"ignore symbol property: %!T\", duk_get_tval(thr, -1)));\n\t\t\t\tgoto skip_key;\n\t\t\t}\n\t\t\tif (DUK_HSTRING_HAS_HIDDEN(h) && !(flags & DUK_ENUM_INCLUDE_HIDDEN)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"ignore hidden symbol property: %!T\", duk_get_tval(thr, -1)));\n\t\t\t\tgoto skip_key;\n\t\t\t}\n\t\t} else {\n\t\t\tif (flags & DUK_ENUM_EXCLUDE_STRINGS) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"ignore string property: %!T\", duk_get_tval(thr, -1)));\n\t\t\t\tgoto skip_key;\n\t\t\t}\n\t\t}\n\n\t\t/* [ obj trap_result res_arr propname ] */\n\t\tduk_put_prop_index(thr, -2, idx++);\n\t\tcontinue;\n\n\t skip_key:\n\t\tduk_pop(thr);\n\t\tcontinue;\n\t}\n\n\t/* XXX: Missing trap result validation for non-configurable target keys\n\t * (must be present), for non-extensible target all target keys must be\n\t * present and no extra keys can be present.\n\t * http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-ownpropertykeys\n\t */\n\n\t/* XXX: The key enumerability check should trigger the \"getOwnPropertyDescriptor\"\n\t * trap which has not yet been implemented.  In the absence of such a trap,\n\t * the enumerability should be checked from the target object; this is\n\t * handled above.\n\t */\n}\n#endif  /* DUK_USE_ES6_PROXY */\n\n#if defined(DUK_USE_ES6_PROXY)\nDUK_INTERNAL duk_ret_t duk_bi_proxy_constructor(duk_hthread *thr) {\n\tDUK_ASSERT_TOP(thr, 2);  /* [ target handler ] */\n\n\tduk_require_constructor_call(thr);\n\tduk_push_proxy(thr, 0 /*flags*/);  /* [ target handler ] -> [ proxy ] */\n\treturn 1;  /* replacement */\n}\n#endif  /* DUK_USE_ES6_PROXY */\n#line 1 \"duk_bi_reflect.c\"\n/*\n *  'Reflect' built-in (ES2016 Section 26.1)\n *  http://www.ecma-international.org/ecma-262/7.0/#sec-reflect-object\n *\n *  Many Reflect built-in functions are provided by shared helpers in\n *  duk_bi_object.c or duk_bi_function.c.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_REFLECT_BUILTIN)\nDUK_INTERNAL duk_ret_t duk_bi_reflect_object_delete_property(duk_hthread *thr) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_bool_t ret;\n\n\tDUK_ASSERT_TOP(thr, 2);\n\t(void) duk_require_hobject(thr, 0);\n\t(void) duk_to_string(thr, 1);\n\n\t/* [ target key ] */\n\n\tDUK_ASSERT(thr != NULL);\n\ttv_obj = DUK_GET_TVAL_POSIDX(thr, 0);\n\ttv_key = DUK_GET_TVAL_POSIDX(thr, 1);\n\tret = duk_hobject_delprop(thr, tv_obj, tv_key, 0 /*throw_flag*/);\n\tduk_push_boolean(thr, ret);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_reflect_object_get(duk_hthread *thr) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_idx_t nargs;\n\n\tDUK_ASSERT(thr != NULL);\n\tnargs = duk_get_top_require_min(thr, 2 /*min_top*/);\n\t(void) duk_require_hobject(thr, 0);\n\t(void) duk_to_string(thr, 1);\n\tif (nargs >= 3 && !duk_strict_equals(thr, 0, 2)) {\n\t\t/* XXX: [[Get]] receiver currently unsupported */\n\t\tDUK_ERROR_UNSUPPORTED(thr);\n\t}\n\n\t/* [ target key receiver? ...? ] */\n\n\ttv_obj = DUK_GET_TVAL_POSIDX(thr, 0);\n\ttv_key = DUK_GET_TVAL_POSIDX(thr, 1);\n\t(void) duk_hobject_getprop(thr, tv_obj, tv_key);  /* This could also be a duk_get_prop(). */\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_reflect_object_has(duk_hthread *thr) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_bool_t ret;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT_TOP(thr, 2);\n\t(void) duk_require_hobject(thr, 0);\n\t(void) duk_to_string(thr, 1);\n\n\t/* [ target key ] */\n\n\ttv_obj = DUK_GET_TVAL_POSIDX(thr, 0);\n\ttv_key = DUK_GET_TVAL_POSIDX(thr, 1);\n\tret = duk_hobject_hasprop(thr, tv_obj, tv_key);\n\tduk_push_boolean(thr, ret);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_reflect_object_set(duk_hthread *thr) {\n\tduk_tval *tv_obj;\n\tduk_tval *tv_key;\n\tduk_tval *tv_val;\n\tduk_idx_t nargs;\n\tduk_bool_t ret;\n\n\tDUK_ASSERT(thr != NULL);\n\tnargs = duk_get_top_require_min(thr, 3 /*min_top*/);\n\t(void) duk_require_hobject(thr, 0);\n\t(void) duk_to_string(thr, 1);\n\tif (nargs >= 4 && !duk_strict_equals(thr, 0, 3)) {\n\t\t/* XXX: [[Set]] receiver currently unsupported */\n\t\tDUK_ERROR_UNSUPPORTED(thr);\n\t}\n\n\t/* [ target key value receiver? ...? ] */\n\n\ttv_obj = DUK_GET_TVAL_POSIDX(thr, 0);\n\ttv_key = DUK_GET_TVAL_POSIDX(thr, 1);\n\ttv_val = DUK_GET_TVAL_POSIDX(thr, 2);\n\tret = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, 0 /*throw_flag*/);\n\tduk_push_boolean(thr, ret);\n\treturn 1;\n}\n#endif  /* DUK_USE_REFLECT_BUILTIN */\n#line 1 \"duk_bi_regexp.c\"\n/*\n *  RegExp built-ins\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\nDUK_LOCAL void duk__get_this_regexp(duk_hthread *thr) {\n\tduk_hobject *h;\n\n\tduk_push_this(thr);\n\th = duk_require_hobject_with_class(thr, -1, DUK_HOBJECT_CLASS_REGEXP);\n\tDUK_ASSERT(h != NULL);\n\tDUK_UNREF(h);\n\tduk_insert(thr, 0);  /* prepend regexp to valstack 0 index */\n}\n\n/* XXX: much to improve (code size) */\nDUK_INTERNAL duk_ret_t duk_bi_regexp_constructor(duk_hthread *thr) {\n\tduk_hobject *h_pattern;\n\n\tDUK_ASSERT_TOP(thr, 2);\n\th_pattern = duk_get_hobject(thr, 0);\n\n\tif (!duk_is_constructor_call(thr) &&\n\t    h_pattern != NULL &&\n\t    DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP &&\n\t    duk_is_undefined(thr, 1)) {\n\t\t/* Called as a function, pattern has [[Class]] \"RegExp\" and\n\t\t * flags is undefined -> return object as is.\n\t\t */\n\t\t/* XXX: ES2015 has a NewTarget SameValue() check which is not\n\t\t * yet implemented.\n\t\t */\n\t\tduk_dup_0(thr);\n\t\treturn 1;\n\t}\n\n\t/* Else functionality is identical for function call and constructor\n\t * call.\n\t */\n\n\tif (h_pattern != NULL &&\n\t    DUK_HOBJECT_GET_CLASS_NUMBER(h_pattern) == DUK_HOBJECT_CLASS_REGEXP) {\n\t\tduk_get_prop_stridx_short(thr, 0, DUK_STRIDX_SOURCE);\n\t\tif (duk_is_undefined(thr, 1)) {\n\t\t\t/* In ES5 one would need to read the flags individually;\n\t\t\t * in ES2015 just read .flags.\n\t\t\t */\n\t\t\tduk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS);\n\t\t} else {\n\t\t\t/* In ES2015 allowed; overrides argument RegExp flags. */\n\t\t\tduk_dup_1(thr);\n\t\t}\n\t} else {\n\t\tif (duk_is_undefined(thr, 0)) {\n\t\t\tduk_push_hstring_empty(thr);\n\t\t} else {\n\t\t\tduk_dup_0(thr);\n\t\t\tduk_to_string(thr, -1);  /* Rejects Symbols. */\n\t\t}\n\t\tif (duk_is_undefined(thr, 1)) {\n\t\t\tduk_push_hstring_empty(thr);\n\t\t} else {\n\t\t\tduk_dup_1(thr);\n\t\t\tduk_to_string(thr, -1);  /* Rejects Symbols. */\n\t\t}\n\n\t\t/* [ ... pattern flags ] */\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"RegExp constructor/function call, pattern=%!T, flags=%!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -2), (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/* [ ... pattern flags ] (both uncoerced) */\n\n\tduk_to_string(thr, -2);\n\tduk_to_string(thr, -1);\n\tduk_regexp_compile(thr);\n\n\t/* [ ... bytecode escaped_source ] */\n\n\tduk_regexp_create_instance(thr);\n\n\t/* [ ... RegExp ] */\n\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_exec(duk_hthread *thr) {\n\tduk__get_this_regexp(thr);\n\n\t/* [ regexp input ] */\n\n\tduk_regexp_match(thr);\n\n\t/* [ result ] */\n\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_test(duk_hthread *thr) {\n\tduk__get_this_regexp(thr);\n\n\t/* [ regexp input ] */\n\n\t/* result object is created and discarded; wasteful but saves code space */\n\tduk_regexp_match(thr);\n\n\t/* [ result ] */\n\n\tduk_push_boolean(thr, (duk_is_null(thr, -1) ? 0 : 1));\n\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_tostring(duk_hthread *thr) {\n\t/* This must be generic in ES2015 and later. */\n\tDUK_ASSERT_TOP(thr, 0);\n\tduk_push_this(thr);\n\tduk_push_string(thr, \"/\");\n\tduk_get_prop_stridx(thr, 0, DUK_STRIDX_SOURCE);\n\tduk_dup_m2(thr);  /* another \"/\" */\n\tduk_get_prop_stridx(thr, 0, DUK_STRIDX_FLAGS);\n\tduk_concat(thr, 4);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_flags(duk_hthread *thr) {\n\t/* .flags is ES2015 but present even when ES2015 bindings are\n\t * disabled because the constructor relies on it.\n\t */\n\tduk_uint8_t buf[8];  /* enough for all flags + NUL */\n\tduk_uint8_t *p = buf;\n\n\t/* .flags is generic and works on any object. */\n\tduk_push_this(thr);\n\t(void) duk_require_hobject(thr, -1);\n\tif (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL)) {\n\t\t*p++ = DUK_ASC_LC_G;\n\t}\n\tif (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_IGNORE_CASE, NULL)) {\n\t\t*p++ = DUK_ASC_LC_I;\n\t}\n\tif (duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_MULTILINE, NULL)) {\n\t\t*p++ = DUK_ASC_LC_M;\n\t}\n\t/* .unicode: to be added */\n\t/* .sticky: to be added */\n\t*p++ = DUK_ASC_NUL;\n\tDUK_ASSERT((duk_size_t) (p - buf) <= sizeof(buf));\n\n\tduk_push_string(thr, (const char *) buf);\n\treturn 1;\n}\n\n/* Shared helper for providing .source, .global, .multiline, etc getters. */\nDUK_INTERNAL duk_ret_t duk_bi_regexp_prototype_shared_getter(duk_hthread *thr) {\n\tduk_hstring *h_bc;\n\tduk_small_uint_t re_flags;\n\tduk_hobject *h;\n\tduk_int_t magic;\n\n\tDUK_ASSERT_TOP(thr, 0);\n\n\tduk_push_this(thr);\n\th = duk_require_hobject(thr, -1);\n\tmagic = duk_get_current_magic(thr);\n\n\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_REGEXP) {\n\t\tduk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_SOURCE);\n\t\tduk_get_prop_stridx_short(thr, 0, DUK_STRIDX_INT_BYTECODE);\n\t\th_bc = duk_require_hstring(thr, -1);\n\t\tre_flags = (duk_small_uint_t) DUK_HSTRING_GET_DATA(h_bc)[0];  /* Safe even if h_bc length is 0 (= NUL) */\n\t\tduk_pop(thr);\n\t} else if (h == thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]) {\n\t\t/* In ES2015 and ES2016 a TypeError would be thrown here.\n\t\t * However, this had real world issues so ES2017 draft\n\t\t * allows RegExp.prototype specifically, returning '(?:)'\n\t\t * for .source and undefined for all flags.\n\t\t */\n\t\tif (magic != 16 /* .source */) {\n\t\t\treturn 0;\n\t\t}\n\t\tduk_push_string(thr, \"(?:)\");  /* .source handled by switch-case */\n\t\tre_flags = 0;\n\t} else {\n\t\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\n\t/* [ regexp source ] */\n\n\tswitch (magic) {\n\tcase 0: {  /* global */\n\t\tduk_push_boolean(thr, (re_flags & DUK_RE_FLAG_GLOBAL));\n\t\tbreak;\n\t}\n\tcase 1: {  /* ignoreCase */\n\t\tduk_push_boolean(thr, (re_flags & DUK_RE_FLAG_IGNORE_CASE));\n\t\tbreak;\n\t}\n\tcase 2: {  /* multiline */\n\t\tduk_push_boolean(thr, (re_flags & DUK_RE_FLAG_MULTILINE));\n\t\tbreak;\n\t}\n#if 0\n\t/* Don't provide until implemented to avoid interfering with feature\n\t * detection in user code.\n\t */\n\tcase 3:    /* sticky */\n\tcase 4: {  /* unicode */\n\t\tduk_push_false(thr);\n\t\tbreak;\n\t}\n#endif\n\tdefault: {  /* source */\n\t\t/* leave 'source' on top */\n\t\tbreak;\n\t}\n\t}\n\n\treturn 1;\n}\n\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n#line 1 \"duk_bi_string.c\"\n/*\n *  String built-ins\n *\n *  Most String built-ins must only accept strings (or String objects).\n *  Symbols, represented internally as strings, must be generally rejected.\n *  The duk_push_this_coercible_to_string() helper does this automatically.\n */\n\n/* XXX: There are several limitations in the current implementation for\n * strings with >= 0x80000000UL characters.  In some cases one would need\n * to be able to represent the range [-0xffffffff,0xffffffff] and so on.\n * Generally character and byte length are assumed to fit into signed 32\n * bits (< 0x80000000UL).  Places with issues are not marked explicitly\n * below in all cases, look for signed type usage (duk_int_t etc) for\n * offsets/lengths.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_STRING_BUILTIN)\n\n/*\n *  Helpers\n */\n\nDUK_LOCAL duk_hstring *duk__str_tostring_notregexp(duk_hthread *thr, duk_idx_t idx) {\n\tduk_hstring *h;\n\n\tif (duk_get_class_number(thr, idx) == DUK_HOBJECT_CLASS_REGEXP) {\n\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t}\n\th = duk_to_hstring(thr, idx);\n\tDUK_ASSERT(h != NULL);\n\n\treturn h;\n}\n\nDUK_LOCAL duk_int_t duk__str_search_shared(duk_hthread *thr, duk_hstring *h_this, duk_hstring *h_search, duk_int_t start_cpos, duk_bool_t backwards) {\n\tduk_int_t cpos;\n\tduk_int_t bpos;\n\tconst duk_uint8_t *p_start, *p_end, *p;\n\tconst duk_uint8_t *q_start;\n\tduk_int_t q_blen;\n\tduk_uint8_t firstbyte;\n\tduk_uint8_t t;\n\n\tcpos = start_cpos;\n\n\t/* Empty searchstring always matches; cpos must be clamped here.\n\t * (If q_blen were < 0 due to clamped coercion, it would also be\n\t * caught here.)\n\t */\n\tq_start = DUK_HSTRING_GET_DATA(h_search);\n\tq_blen = (duk_int_t) DUK_HSTRING_GET_BYTELEN(h_search);\n\tif (q_blen <= 0) {\n\t\treturn cpos;\n\t}\n\tDUK_ASSERT(q_blen > 0);\n\n\tbpos = (duk_int_t) duk_heap_strcache_offset_char2byte(thr, h_this, (duk_uint32_t) cpos);\n\n\tp_start = DUK_HSTRING_GET_DATA(h_this);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_this);\n\tp = p_start + bpos;\n\n\t/* This loop is optimized for size.  For speed, there should be\n\t * two separate loops, and we should ensure that memcmp() can be\n\t * used without an extra \"will searchstring fit\" check.  Doing\n\t * the preconditioning for 'p' and 'p_end' is easy but cpos\n\t * must be updated if 'p' is wound back (backward scanning).\n\t */\n\n\tfirstbyte = q_start[0];  /* leading byte of match string */\n\twhile (p <= p_end && p >= p_start) {\n\t\tt = *p;\n\n\t\t/* For Ecmascript strings, this check can only match for\n\t\t * initial UTF-8 bytes (not continuation bytes).  For other\n\t\t * strings all bets are off.\n\t\t */\n\n\t\tif ((t == firstbyte) && ((duk_size_t) (p_end - p) >= (duk_size_t) q_blen)) {\n\t\t\tDUK_ASSERT(q_blen > 0);  /* no issues with memcmp() zero size, even if broken */\n\t\t\tif (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) {\n\t\t\t\treturn cpos;\n\t\t\t}\n\t\t}\n\n\t\t/* track cpos while scanning */\n\t\tif (backwards) {\n\t\t\t/* when going backwards, we decrement cpos 'early';\n\t\t\t * 'p' may point to a continuation byte of the char\n\t\t\t * at offset 'cpos', but that's OK because we'll\n\t\t\t * backtrack all the way to the initial byte.\n\t\t\t */\n\t\t\tif ((t & 0xc0) != 0x80) {\n\t\t\t\tcpos--;\n\t\t\t}\n\t\t\tp--;\n\t\t} else {\n\t\t\tif ((t & 0xc0) != 0x80) {\n\t\t\t\tcpos++;\n\t\t\t}\n\t\t\tp++;\n\t\t}\n\t}\n\n\t/* Not found.  Empty string case is handled specially above. */\n\treturn -1;\n}\n\n/*\n *  Constructor\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_constructor(duk_hthread *thr) {\n\tduk_hstring *h;\n\tduk_uint_t flags;\n\n\t/* String constructor needs to distinguish between an argument not given at all\n\t * vs. given as 'undefined'.  We're a vararg function to handle this properly.\n\t */\n\n\t/* XXX: copy current activation flags to thr, including current magic,\n\t * is_constructor_call etc.  This takes a few bytes in duk_hthread but\n\t * makes call sites smaller (there are >30 is_constructor_call and get\n\t * current magic call sites.\n\t */\n\n\tif (duk_get_top(thr) == 0) {\n\t\tduk_push_hstring_empty(thr);\n\t} else {\n\t\th = duk_to_hstring_acceptsymbol(thr, 0);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h) && !duk_is_constructor_call(thr))) {\n\t\t\tduk_push_symbol_descriptive_string(thr, h);\n\t\t\tduk_replace(thr, 0);\n\t\t}\n\t}\n\tduk_to_string(thr, 0);  /* catches symbol argument for constructor call */\n\tDUK_ASSERT(duk_is_string(thr, 0));\n\tduk_set_top(thr, 1);  /* Top may be 1 or larger. */\n\n\tif (duk_is_constructor_call(thr)) {\n\t\t/* String object internal value is immutable */\n\t\tflags = DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t        DUK_HOBJECT_FLAG_FASTREFS |\n\t\t        DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ |\n\t\t        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING);\n\t\tduk_push_object_helper(thr, flags, DUK_BIDX_STRING_PROTOTYPE);\n\t\tduk_dup_0(thr);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE);\n\t}\n\t/* Note: unbalanced stack on purpose */\n\n\treturn 1;\n}\n\nDUK_LOCAL duk_ret_t duk__construct_from_codepoints(duk_hthread *thr, duk_bool_t nonbmp) {\n\tduk_bufwriter_ctx bw_alloc;\n\tduk_bufwriter_ctx *bw;\n\tduk_idx_t i, n;\n\tduk_ucodepoint_t cp;\n\n\t/* XXX: It would be nice to build the string directly but ToUint16()\n\t * coercion is needed so a generic helper would not be very\n\t * helpful (perhaps coerce the value stack first here and then\n\t * build a string from a duk_tval number sequence in one go?).\n\t */\n\n\tn = duk_get_top(thr);\n\n\tbw = &bw_alloc;\n\tDUK_BW_INIT_PUSHBUF(thr, bw, (duk_size_t) n);  /* initial estimate for ASCII only codepoints */\n\n\tfor (i = 0; i < n; i++) {\n\t\t/* XXX: could improve bufwriter handling to write multiple codepoints\n\t\t * with one ensure call but the relative benefit would be quite small.\n\t\t */\n\n\t\tif (nonbmp) {\n\t\t\t/* ES2015 requires that (1) SameValue(cp, ToInteger(cp)) and\n\t\t\t * (2) cp >= 0 and cp <= 0x10ffff.  This check does not\n\t\t\t * implement the steps exactly but the outcome should be\n\t\t\t * the same.\n\t\t\t */\n\t\t\tduk_int32_t i32 = 0;\n\t\t\tif (!duk_is_whole_get_int32(duk_to_number(thr, i), &i32) ||\n\t\t\t    i32 < 0 || i32 > 0x10ffffL) {\n\t\t\t\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n\t\t\t}\n\t\t\tDUK_ASSERT(i32 >= 0 && i32 <= 0x10ffffL);\n\t\t\tcp = (duk_ucodepoint_t) i32;\n\t\t\tDUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp);\n\t\t} else {\n#if defined(DUK_USE_NONSTD_STRING_FROMCHARCODE_32BIT)\n\t\t\t/* ToUint16() coercion is mandatory in the E5.1 specification, but\n\t\t\t * this non-compliant behavior makes more sense because we support\n\t\t\t * non-BMP codepoints.  Don't use CESU-8 because that'd create\n\t\t\t * surrogate pairs.\n\t\t\t */\n\t\t\tcp = (duk_ucodepoint_t) duk_to_uint32(thr, i);\n\t\t\tDUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp);\n#else\n\t\t\tcp = (duk_ucodepoint_t) duk_to_uint16(thr, i);\n\t\t\tDUK_ASSERT(cp >= 0 && cp <= 0x10ffffL);\n\t\t\tDUK_BW_WRITE_ENSURE_CESU8(thr, bw, cp);\n#endif\n\t\t}\n\t}\n\n\tDUK_BW_COMPACT(thr, bw);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe, extended UTF-8 or CESU-8 encoded. */\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_char_code(duk_hthread *thr) {\n\treturn duk__construct_from_codepoints(thr, 0 /*nonbmp*/);\n}\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_string_constructor_from_code_point(duk_hthread *thr) {\n\treturn duk__construct_from_codepoints(thr, 1 /*nonbmp*/);\n}\n#endif\n\n/*\n *  toString(), valueOf()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_to_string(duk_hthread *thr) {\n\tduk_tval *tv;\n\n\tduk_push_this(thr);\n\ttv = duk_require_tval(thr, -1);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_IS_STRING(tv)) {\n\t\t/* return as is */\n\t} else if (DUK_TVAL_IS_OBJECT(tv)) {\n\t\tduk_hobject *h = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\t/* Must be a \"string object\", i.e. class \"String\" */\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_STRING) {\n\t\t\tgoto type_error;\n\t\t}\n\n\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VALUE);\n\t\tDUK_ASSERT(duk_is_string(thr, -1));\n\t} else {\n\t\tgoto type_error;\n\t}\n\n\t(void) duk_require_hstring_notsymbol(thr, -1);  /* Reject symbols (and wrapped symbols). */\n\treturn 1;\n\n type_error:\n\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n}\n\n/*\n *  Character and charcode access\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_at(duk_hthread *thr) {\n\tduk_int_t pos;\n\n\t/* XXX: faster implementation */\n\n\t(void) duk_push_this_coercible_to_string(thr);\n\tpos = duk_to_int(thr, 0);\n\tduk_substring(thr, -1, (duk_size_t) pos, (duk_size_t) (pos + 1));\n\treturn 1;\n}\n\n/* Magic: 0=charCodeAt, 1=codePointAt */\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_char_code_at(duk_hthread *thr) {\n\tduk_int_t pos;\n\tduk_hstring *h;\n\tduk_bool_t clamped;\n\tduk_uint32_t cp;\n\tduk_int_t magic;\n\n\t/* XXX: faster implementation */\n\n\tDUK_DDD(DUK_DDDPRINT(\"arg=%!T\", (duk_tval *) duk_get_tval(thr, 0)));\n\n\th = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h != NULL);\n\n\tpos = duk_to_int_clamped_raw(thr,\n\t                             0 /*index*/,\n\t                             0 /*min(incl)*/,\n\t                             (duk_int_t) DUK_HSTRING_GET_CHARLEN(h) - 1 /*max(incl)*/,\n\t                             &clamped /*out_clamped*/);\n#if defined(DUK_USE_ES6)\n\tmagic = duk_get_current_magic(thr);\n#else\n\tDUK_ASSERT(duk_get_current_magic(thr) == 0);\n\tmagic = 0;\n#endif\n\tif (clamped) {\n\t\t/* For out-of-bounds indices .charCodeAt() returns NaN and\n\t\t * .codePointAt() returns undefined.\n\t\t */\n\t\tif (magic != 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tduk_push_nan(thr);\n\t} else {\n\t\tDUK_ASSERT(pos >= 0);\n\t\tcp = (duk_uint32_t) duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) pos, (duk_bool_t) magic /*surrogate_aware*/);\n\t\tduk_push_u32(thr, cp);\n\t}\n\treturn 1;\n}\n\n/*\n *  substring(), substr(), slice()\n */\n\n/* XXX: any chance of merging these three similar but still slightly\n * different algorithms so that footprint would be reduced?\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_substring(duk_hthread *thr) {\n\tduk_hstring *h;\n\tduk_int_t start_pos, end_pos;\n\tduk_int_t len;\n\n\th = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h != NULL);\n\tlen = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);\n\n\t/* [ start end str ] */\n\n\tstart_pos = duk_to_int_clamped(thr, 0, 0, len);\n\tif (duk_is_undefined(thr, 1)) {\n\t\tend_pos = len;\n\t} else {\n\t\tend_pos = duk_to_int_clamped(thr, 1, 0, len);\n\t}\n\tDUK_ASSERT(start_pos >= 0 && start_pos <= len);\n\tDUK_ASSERT(end_pos >= 0 && end_pos <= len);\n\n\tif (start_pos > end_pos) {\n\t\tduk_int_t tmp = start_pos;\n\t\tstart_pos = end_pos;\n\t\tend_pos = tmp;\n\t}\n\n\tDUK_ASSERT(end_pos >= start_pos);\n\n\tduk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos);\n\treturn 1;\n}\n\n#if defined(DUK_USE_SECTION_B)\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_substr(duk_hthread *thr) {\n\tduk_hstring *h;\n\tduk_int_t start_pos, end_pos;\n\tduk_int_t len;\n\n\t/* Unlike non-obsolete String calls, substr() algorithm in E5.1\n\t * specification will happily coerce undefined and null to strings\n\t * (\"undefined\" and \"null\").\n\t */\n\tduk_push_this(thr);\n\th = duk_to_hstring_m1(thr);  /* Reject Symbols. */\n\tDUK_ASSERT(h != NULL);\n\tlen = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);\n\n\t/* [ start length str ] */\n\n\t/* The implementation for computing of start_pos and end_pos differs\n\t * from the standard algorithm, but is intended to result in the exactly\n\t * same behavior.  This is not always obvious.\n\t */\n\n\t/* combines steps 2 and 5; -len ensures max() not needed for step 5 */\n\tstart_pos = duk_to_int_clamped(thr, 0, -len, len);\n\tif (start_pos < 0) {\n\t\tstart_pos = len + start_pos;\n\t}\n\tDUK_ASSERT(start_pos >= 0 && start_pos <= len);\n\n\t/* combines steps 3, 6; step 7 is not needed */\n\tif (duk_is_undefined(thr, 1)) {\n\t\tend_pos = len;\n\t} else {\n\t\tDUK_ASSERT(start_pos <= len);\n\t\tend_pos = start_pos + duk_to_int_clamped(thr, 1, 0, len - start_pos);\n\t}\n\tDUK_ASSERT(start_pos >= 0 && start_pos <= len);\n\tDUK_ASSERT(end_pos >= 0 && end_pos <= len);\n\tDUK_ASSERT(end_pos >= start_pos);\n\n\tduk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos);\n\treturn 1;\n}\n#endif  /* DUK_USE_SECTION_B */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_slice(duk_hthread *thr) {\n\tduk_hstring *h;\n\tduk_int_t start_pos, end_pos;\n\tduk_int_t len;\n\n\th = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h != NULL);\n\tlen = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);\n\n\t/* [ start end str ] */\n\n\tstart_pos = duk_to_int_clamped(thr, 0, -len, len);\n\tif (start_pos < 0) {\n\t\tstart_pos = len + start_pos;\n\t}\n\tif (duk_is_undefined(thr, 1)) {\n\t\tend_pos = len;\n\t} else {\n\t\tend_pos = duk_to_int_clamped(thr, 1, -len, len);\n\t\tif (end_pos < 0) {\n\t\t\tend_pos = len + end_pos;\n\t\t}\n\t}\n\tDUK_ASSERT(start_pos >= 0 && start_pos <= len);\n\tDUK_ASSERT(end_pos >= 0 && end_pos <= len);\n\n\tif (end_pos < start_pos) {\n\t\tend_pos = start_pos;\n\t}\n\n\tDUK_ASSERT(end_pos >= start_pos);\n\n\tduk_substring(thr, -1, (duk_size_t) start_pos, (duk_size_t) end_pos);\n\treturn 1;\n}\n\n/*\n *  Case conversion\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_caseconv_shared(duk_hthread *thr) {\n\tduk_small_int_t uppercase = duk_get_current_magic(thr);\n\n\t(void) duk_push_this_coercible_to_string(thr);\n\tduk_unicode_case_convert_string(thr, (duk_bool_t) uppercase);\n\treturn 1;\n}\n\n/*\n *  indexOf() and lastIndexOf()\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_indexof_shared(duk_hthread *thr) {\n\tduk_hstring *h_this;\n\tduk_hstring *h_search;\n\tduk_int_t clen_this;\n\tduk_int_t cpos;\n\tduk_small_uint_t is_lastindexof = (duk_small_uint_t) duk_get_current_magic(thr);  /* 0=indexOf, 1=lastIndexOf */\n\n\th_this = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h_this != NULL);\n\tclen_this = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h_this);\n\n\th_search = duk_to_hstring(thr, 0);\n\tDUK_ASSERT(h_search != NULL);\n\n\tduk_to_number(thr, 1);\n\tif (duk_is_nan(thr, 1) && is_lastindexof) {\n\t\t/* indexOf: NaN should cause pos to be zero.\n\t\t * lastIndexOf: NaN should cause pos to be +Infinity\n\t\t * (and later be clamped to len).\n\t\t */\n\t\tcpos = clen_this;\n\t} else {\n\t\tcpos = duk_to_int_clamped(thr, 1, 0, clen_this);\n\t}\n\n\tcpos = duk__str_search_shared(thr, h_this, h_search, cpos, is_lastindexof /*backwards*/);\n\tduk_push_int(thr, cpos);\n\treturn 1;\n}\n\n/*\n *  replace()\n */\n\n/* XXX: the current implementation works but is quite clunky; it compiles\n * to almost 1,4kB of x86 code so it needs to be simplified (better approach,\n * shared helpers, etc).  Some ideas for refactoring:\n *\n * - a primitive to convert a string into a regexp matcher (reduces matching\n *   code at the cost of making matching much slower)\n * - use replace() as a basic helper for match() and split(), which are both\n *   much simpler\n * - API call to get_prop and to_boolean\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_replace(duk_hthread *thr) {\n\tduk_hstring *h_input;\n\tduk_hstring *h_match;\n\tduk_hstring *h_search;\n\tduk_hobject *h_re;\n\tduk_bufwriter_ctx bw_alloc;\n\tduk_bufwriter_ctx *bw;\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\tduk_bool_t is_regexp;\n\tduk_bool_t is_global;\n#endif\n\tduk_bool_t is_repl_func;\n\tduk_uint32_t match_start_coff, match_start_boff;\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\tduk_int_t match_caps;\n#endif\n\tduk_uint32_t prev_match_end_boff;\n\tconst duk_uint8_t *r_start, *r_end, *r;   /* repl string scan */\n\tduk_size_t tmp_sz;\n\n\tDUK_ASSERT_TOP(thr, 2);\n\th_input = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h_input != NULL);\n\n\tbw = &bw_alloc;\n\tDUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input));  /* input size is good output starting point */\n\n\tDUK_ASSERT_TOP(thr, 4);\n\n\t/* stack[0] = search value\n\t * stack[1] = replace value\n\t * stack[2] = input string\n\t * stack[3] = result buffer\n\t */\n\n\th_re = duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP);\n\tif (h_re) {\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tis_regexp = 1;\n\t\tis_global = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL);\n\n\t\tif (is_global) {\n\t\t\t/* start match from beginning */\n\t\t\tduk_push_int(thr, 0);\n\t\t\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\t\t}\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\tDUK_DCERROR_UNSUPPORTED(thr);\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t} else {\n\t\tduk_to_string(thr, 0);  /* rejects symbols */\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tis_regexp = 0;\n\t\tis_global = 0;\n#endif\n\t}\n\n\tif (duk_is_function(thr, 1)) {\n\t\tis_repl_func = 1;\n\t\tr_start = NULL;\n\t\tr_end = NULL;\n\t} else {\n\t\tduk_hstring *h_repl;\n\n\t\tis_repl_func = 0;\n\t\th_repl = duk_to_hstring(thr, 1);  /* reject symbols */\n\t\tDUK_ASSERT(h_repl != NULL);\n\t\tr_start = DUK_HSTRING_GET_DATA(h_repl);\n\t\tr_end = r_start + DUK_HSTRING_GET_BYTELEN(h_repl);\n\t}\n\n\tprev_match_end_boff = 0;\n\n\tfor (;;) {\n\t\t/*\n\t\t *  If matching with a regexp:\n\t\t *    - non-global RegExp: lastIndex not touched on a match, zeroed\n\t\t *      on a non-match\n\t\t *    - global RegExp: on match, lastIndex will be updated by regexp\n\t\t *      executor to point to next char after the matching part (so that\n\t\t *      characters in the matching part are not matched again)\n\t\t *\n\t\t *  If matching with a string:\n\t\t *    - always non-global match, find first occurrence\n\t\t *\n\t\t *  We need:\n\t\t *    - The character offset of start-of-match for the replacer function\n\t\t *    - The byte offsets for start-of-match and end-of-match to implement\n\t\t *      the replacement values $&, $`, and $', and to copy non-matching\n\t\t *      input string portions (including header and trailer) verbatim.\n\t\t *\n\t\t *  NOTE: the E5.1 specification is a bit vague how the RegExp should\n\t\t *  behave in the replacement process; e.g. is matching done first for\n\t\t *  all matches (in the global RegExp case) before any replacer calls\n\t\t *  are made?  See: test-bi-string-proto-replace.js for discussion.\n\t\t */\n\n\t\tDUK_ASSERT_TOP(thr, 4);\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tif (is_regexp) {\n\t\t\tduk_dup_0(thr);\n\t\t\tduk_dup_2(thr);\n\t\t\tduk_regexp_match(thr);  /* [ ... regexp input ] -> [ res_obj ] */\n\t\t\tif (!duk_is_object(thr, -1)) {\n\t\t\t\tduk_pop(thr);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX);\n\t\t\tDUK_ASSERT(duk_is_number(thr, -1));\n\t\t\tmatch_start_coff = duk_get_uint(thr, -1);\n\t\t\tduk_pop(thr);\n\n\t\t\tduk_get_prop_index(thr, -1, 0);\n\t\t\tDUK_ASSERT(duk_is_string(thr, -1));\n\t\t\th_match = duk_known_hstring(thr, -1);\n\t\t\tduk_pop(thr);  /* h_match is borrowed, remains reachable through match_obj */\n\n\t\t\tif (DUK_HSTRING_GET_BYTELEN(h_match) == 0) {\n\t\t\t\t/* This should be equivalent to match() algorithm step 8.f.iii.2:\n\t\t\t\t * detect an empty match and allow it, but don't allow it twice.\n\t\t\t\t */\n\t\t\t\tduk_uint32_t last_index;\n\n\t\t\t\tduk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\t\t\t\tlast_index = (duk_uint32_t) duk_get_uint(thr, -1);\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"empty match, bump lastIndex: %ld -> %ld\",\n\t\t\t\t                     (long) last_index, (long) (last_index + 1)));\n\t\t\t\tduk_pop(thr);\n\t\t\t\tduk_push_uint(thr, (duk_uint_t) (last_index + 1));\n\t\t\t\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\t\t\t}\n\n\t\t\tDUK_ASSERT(duk_get_length(thr, -1) <= DUK_INT_MAX);  /* string limits */\n\t\t\tmatch_caps = (duk_int_t) duk_get_length(thr, -1);\n\t\t} else {\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\t{  /* unconditionally */\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\tconst duk_uint8_t *p_start, *p_end, *p;   /* input string scan */\n\t\t\tconst duk_uint8_t *q_start;               /* match string */\n\t\t\tduk_size_t q_blen;\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\t\tDUK_ASSERT(!is_global);  /* single match always */\n#endif\n\n\t\t\tp_start = DUK_HSTRING_GET_DATA(h_input);\n\t\t\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);\n\t\t\tp = p_start;\n\n\t\t\th_search = duk_known_hstring(thr, 0);\n\t\t\tq_start = DUK_HSTRING_GET_DATA(h_search);\n\t\t\tq_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_search);\n\n\t\t\tp_end -= q_blen;  /* ensure full memcmp() fits in while */\n\n\t\t\tmatch_start_coff = 0;\n\n\t\t\twhile (p <= p_end) {\n\t\t\t\tDUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input));\n\t\t\t\tif (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) {\n\t\t\t\t\tduk_dup_0(thr);\n\t\t\t\t\th_match = duk_known_hstring(thr, -1);\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\t\t\t\tmatch_caps = 0;\n#endif\n\t\t\t\t\tgoto found;\n\t\t\t\t}\n\n\t\t\t\t/* track utf-8 non-continuation bytes */\n\t\t\t\tif ((p[0] & 0xc0) != 0x80) {\n\t\t\t\t\tmatch_start_coff++;\n\t\t\t\t}\n\t\t\t\tp++;\n\t\t\t}\n\n\t\t\t/* not found */\n\t\t\tbreak;\n\t\t}\n\t found:\n\n\t\t/* stack[0] = search value\n\t\t * stack[1] = replace value\n\t\t * stack[2] = input string\n\t\t * stack[3] = result buffer\n\t\t * stack[4] = regexp match OR match string\n\t\t */\n\n\t\tmatch_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff);\n\n\t\ttmp_sz = (duk_size_t) (match_start_boff - prev_match_end_boff);\n\t\tDUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz);\n\n\t\tprev_match_end_boff = match_start_boff + DUK_HSTRING_GET_BYTELEN(h_match);\n\n\t\tif (is_repl_func) {\n\t\t\tduk_idx_t idx_args;\n\t\t\tduk_hstring *h_repl;\n\n\t\t\t/* regexp res_obj is at index 4 */\n\n\t\t\tduk_dup_1(thr);\n\t\t\tidx_args = duk_get_top(thr);\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\t\tif (is_regexp) {\n\t\t\t\tduk_int_t idx;\n\t\t\t\tduk_require_stack(thr, match_caps + 2);\n\t\t\t\tfor (idx = 0; idx < match_caps; idx++) {\n\t\t\t\t\t/* match followed by capture(s) */\n\t\t\t\t\tduk_get_prop_index(thr, 4, (duk_uarridx_t) idx);\n\t\t\t\t}\n\t\t\t} else {\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\t{  /* unconditionally */\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\t\t/* match == search string, by definition */\n\t\t\t\tduk_dup_0(thr);\n\t\t\t}\n\t\t\tduk_push_uint(thr, (duk_uint_t) match_start_coff);\n\t\t\tduk_dup_2(thr);\n\n\t\t\t/* [ ... replacer match [captures] match_char_offset input ] */\n\n\t\t\tduk_call(thr, duk_get_top(thr) - idx_args);\n\t\t\th_repl = duk_to_hstring_m1(thr);  /* -> [ ... repl_value ] */\n\t\t\tDUK_ASSERT(h_repl != NULL);\n\n\t\t\tDUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_repl);\n\n\t\t\tduk_pop(thr);  /* repl_value */\n\t\t} else {\n\t\t\tr = r_start;\n\n\t\t\twhile (r < r_end) {\n\t\t\t\tduk_int_t ch1;\n\t\t\t\tduk_int_t ch2;\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\t\t\tduk_int_t ch3;\n#endif\n\t\t\t\tduk_size_t left;\n\n\t\t\t\tch1 = *r++;\n\t\t\t\tif (ch1 != DUK_ASC_DOLLAR) {\n\t\t\t\t\tgoto repl_write;\n\t\t\t\t}\n\t\t\t\tDUK_ASSERT(r <= r_end);\n\t\t\t\tleft = (duk_size_t) (r_end - r);\n\n\t\t\t\tif (left <= 0) {\n\t\t\t\t\tgoto repl_write;\n\t\t\t\t}\n\n\t\t\t\tch2 = r[0];\n\t\t\t\tswitch (ch2) {\n\t\t\t\tcase DUK_ASC_DOLLAR: {\n\t\t\t\t\tch1 = (1 << 8) + DUK_ASC_DOLLAR;\n\t\t\t\t\tgoto repl_write;\n\t\t\t\t}\n\t\t\t\tcase DUK_ASC_AMP: {\n\t\t\t\t\tDUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_match);\n\t\t\t\t\tr++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcase DUK_ASC_GRAVE: {\n\t\t\t\t\ttmp_sz = (duk_size_t) match_start_boff;\n\t\t\t\t\tDUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input), tmp_sz);\n\t\t\t\t\tr++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tcase DUK_ASC_SINGLEQUOTE: {\n\t\t\t\t\tduk_uint32_t match_end_boff;\n\n\t\t\t\t\t/* Use match charlen instead of bytelen, just in case the input and\n\t\t\t\t\t * match codepoint encodings would have different lengths.\n\t\t\t\t\t */\n\t\t\t\t\t/* XXX: charlen computed here, and also in char2byte helper. */\n\t\t\t\t\tmatch_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr,\n\t\t\t\t\t                                                                   h_input,\n\t\t\t\t\t                                                                   match_start_coff + (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_match));\n\n\t\t\t\t\ttmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - match_end_boff);\n\t\t\t\t\tDUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + match_end_boff, tmp_sz);\n\t\t\t\t\tr++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tdefault: {\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\t\t\t\tduk_int_t capnum, captmp, capadv;\n\t\t\t\t\t/* XXX: optional check, match_caps is zero if no regexp,\n\t\t\t\t\t * so dollar will be interpreted literally anyway.\n\t\t\t\t\t */\n\n\t\t\t\t\tif (!is_regexp) {\n\t\t\t\t\t\tgoto repl_write;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!(ch2 >= DUK_ASC_0 && ch2 <= DUK_ASC_9)) {\n\t\t\t\t\t\tgoto repl_write;\n\t\t\t\t\t}\n\t\t\t\t\tcapnum = ch2 - DUK_ASC_0;\n\t\t\t\t\tcapadv = 1;\n\n\t\t\t\t\tif (left >= 2) {\n\t\t\t\t\t\tch3 = r[1];\n\t\t\t\t\t\tif (ch3 >= DUK_ASC_0 && ch3 <= DUK_ASC_9) {\n\t\t\t\t\t\t\tcaptmp = capnum * 10 + (ch3 - DUK_ASC_0);\n\t\t\t\t\t\t\tif (captmp < match_caps) {\n\t\t\t\t\t\t\t\tcapnum = captmp;\n\t\t\t\t\t\t\t\tcapadv = 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (capnum > 0 && capnum < match_caps) {\n\t\t\t\t\t\tDUK_ASSERT(is_regexp != 0);  /* match_caps == 0 without regexps */\n\n\t\t\t\t\t\t/* regexp res_obj is at offset 4 */\n\t\t\t\t\t\tduk_get_prop_index(thr, 4, (duk_uarridx_t) capnum);\n\t\t\t\t\t\tif (duk_is_string(thr, -1)) {\n\t\t\t\t\t\t\tduk_hstring *h_tmp_str;\n\n\t\t\t\t\t\t\th_tmp_str = duk_known_hstring(thr, -1);\n\n\t\t\t\t\t\t\tDUK_BW_WRITE_ENSURE_HSTRING(thr, bw, h_tmp_str);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t/* undefined -> skip (replaced with empty) */\n\t\t\t\t\t\t}\n\t\t\t\t\t\tduk_pop(thr);\n\t\t\t\t\t\tr += capadv;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgoto repl_write;\n\t\t\t\t\t}\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\t\t\tgoto repl_write;  /* unconditionally */\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\t\t}  /* default case */\n\t\t\t\t}  /* switch (ch2) */\n\n\t\t\t repl_write:\n\t\t\t\t/* ch1 = (r_increment << 8) + byte */\n\n\t\t\t\tDUK_BW_WRITE_ENSURE_U8(thr, bw, (duk_uint8_t) (ch1 & 0xff));\n\t\t\t\tr += ch1 >> 8;\n\t\t\t}  /* while repl */\n\t\t}  /* if (is_repl_func) */\n\n\t\tduk_pop(thr);  /* pop regexp res_obj or match string */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tif (!is_global) {\n#else\n\t\t{  /* unconditionally; is_global==0 */\n#endif\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* trailer */\n\ttmp_sz = (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff);\n\tDUK_BW_WRITE_ENSURE_BYTES(thr, bw, DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff, tmp_sz);\n\n\tDUK_ASSERT_TOP(thr, 4);\n\tDUK_BW_COMPACT(thr, bw);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe if inputs are safe. */\n\treturn 1;\n}\n\n/*\n *  split()\n */\n\n/* XXX: very messy now, but works; clean up, remove unused variables (nomimally\n * used so compiler doesn't complain).\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_split(duk_hthread *thr) {\n\tduk_hstring *h_input;\n\tduk_hstring *h_sep;\n\tduk_uint32_t limit;\n\tduk_uint32_t arr_idx;\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\tduk_bool_t is_regexp;\n#endif\n\tduk_bool_t matched;  /* set to 1 if any match exists (needed for empty input special case) */\n\tduk_uint32_t prev_match_end_coff, prev_match_end_boff;\n\tduk_uint32_t match_start_boff, match_start_coff;\n\tduk_uint32_t match_end_boff, match_end_coff;\n\n\th_input = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h_input != NULL);\n\n\tduk_push_array(thr);\n\n\tif (duk_is_undefined(thr, 1)) {\n\t\tlimit = 0xffffffffUL;\n\t} else {\n\t\tlimit = duk_to_uint32(thr, 1);\n\t}\n\n\tif (limit == 0) {\n\t\treturn 1;\n\t}\n\n\t/* If the separator is a RegExp, make a \"clone\" of it.  The specification\n\t * algorithm calls [[Match]] directly for specific indices; we emulate this\n\t * by tweaking lastIndex and using a \"force global\" variant of duk_regexp_match()\n\t * which will use global-style matching even when the RegExp itself is non-global.\n\t */\n\n\tif (duk_is_undefined(thr, 0)) {\n\t\t/* The spec algorithm first does \"R = ToString(separator)\" before checking\n\t\t * whether separator is undefined.  Since this is side effect free, we can\n\t\t * skip the ToString() here.\n\t\t */\n\t\tduk_dup_2(thr);\n\t\tduk_put_prop_index(thr, 3, 0);\n\t\treturn 1;\n\t} else if (duk_get_hobject_with_class(thr, 0, DUK_HOBJECT_CLASS_REGEXP) != NULL) {\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tduk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR);\n\t\tduk_dup_0(thr);\n\t\tduk_new(thr, 1);  /* [ ... RegExp val ] -> [ ... res ] */\n\t\tduk_replace(thr, 0);\n\t\t/* lastIndex is initialized to zero by new RegExp() */\n\t\tis_regexp = 1;\n#else\n\t\tDUK_DCERROR_UNSUPPORTED(thr);\n#endif\n\t} else {\n\t\tduk_to_string(thr, 0);\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tis_regexp = 0;\n#endif\n\t}\n\n\t/* stack[0] = separator (string or regexp)\n\t * stack[1] = limit\n\t * stack[2] = input string\n\t * stack[3] = result array\n\t */\n\n\tprev_match_end_boff = 0;\n\tprev_match_end_coff = 0;\n\tarr_idx = 0;\n\tmatched = 0;\n\n\tfor (;;) {\n\t\t/*\n\t\t *  The specification uses RegExp [[Match]] to attempt match at specific\n\t\t *  offsets.  We don't have such a primitive, so we use an actual RegExp\n\t\t *  and tweak lastIndex.  Since the RegExp may be non-global, we use a\n\t\t *  special variant which forces global-like behavior for matching.\n\t\t */\n\n\t\tDUK_ASSERT_TOP(thr, 4);\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tif (is_regexp) {\n\t\t\tduk_dup_0(thr);\n\t\t\tduk_dup_2(thr);\n\t\t\tduk_regexp_match_force_global(thr);  /* [ ... regexp input ] -> [ res_obj ] */\n\t\t\tif (!duk_is_object(thr, -1)) {\n\t\t\t\tduk_pop(thr);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched = 1;\n\n\t\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX);\n\t\t\tDUK_ASSERT(duk_is_number(thr, -1));\n\t\t\tmatch_start_coff = duk_get_uint(thr, -1);\n\t\t\tmatch_start_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_start_coff);\n\t\t\tduk_pop(thr);\n\n\t\t\tif (match_start_coff == DUK_HSTRING_GET_CHARLEN(h_input)) {\n\t\t\t\t/* don't allow an empty match at the end of the string */\n\t\t\t\tduk_pop(thr);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tduk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\t\t\tDUK_ASSERT(duk_is_number(thr, -1));\n\t\t\tmatch_end_coff = duk_get_uint(thr, -1);\n\t\t\tmatch_end_boff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h_input, match_end_coff);\n\t\t\tduk_pop(thr);\n\n\t\t\t/* empty match -> bump and continue */\n\t\t\tif (prev_match_end_boff == match_end_boff) {\n\t\t\t\tduk_push_uint(thr, (duk_uint_t) (match_end_coff + 1));\n\t\t\t\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\t\t\t\tduk_pop(thr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t} else {\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\t{  /* unconditionally */\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\tconst duk_uint8_t *p_start, *p_end, *p;   /* input string scan */\n\t\t\tconst duk_uint8_t *q_start;               /* match string */\n\t\t\tduk_size_t q_blen, q_clen;\n\n\t\t\tp_start = DUK_HSTRING_GET_DATA(h_input);\n\t\t\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input);\n\t\t\tp = p_start + prev_match_end_boff;\n\n\t\t\th_sep = duk_known_hstring(thr, 0);  /* symbol already rejected above */\n\t\t\tq_start = DUK_HSTRING_GET_DATA(h_sep);\n\t\t\tq_blen = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sep);\n\t\t\tq_clen = (duk_size_t) DUK_HSTRING_GET_CHARLEN(h_sep);\n\n\t\t\tp_end -= q_blen;  /* ensure full memcmp() fits in while */\n\n\t\t\tmatch_start_coff = prev_match_end_coff;\n\n\t\t\tif (q_blen == 0) {\n\t\t\t\t/* Handle empty separator case: it will always match, and always\n\t\t\t\t * triggers the check in step 13.c.iii initially.  Note that we\n\t\t\t\t * must skip to either end of string or start of first codepoint,\n\t\t\t\t * skipping over any continuation bytes!\n\t\t\t\t *\n\t\t\t\t * Don't allow an empty string to match at the end of the input.\n\t\t\t\t */\n\n\t\t\t\tmatched = 1;  /* empty separator can always match */\n\n\t\t\t\tmatch_start_coff++;\n\t\t\t\tp++;\n\t\t\t\twhile (p < p_end) {\n\t\t\t\t\tif ((p[0] & 0xc0) != 0x80) {\n\t\t\t\t\t\tgoto found;\n\t\t\t\t\t}\n\t\t\t\t\tp++;\n\t\t\t\t}\n\t\t\t\tgoto not_found;\n\t\t\t}\n\n\t\t\tDUK_ASSERT(q_blen > 0 && q_clen > 0);\n\t\t\twhile (p <= p_end) {\n\t\t\t\tDUK_ASSERT(p + q_blen <= DUK_HSTRING_GET_DATA(h_input) + DUK_HSTRING_GET_BYTELEN(h_input));\n\t\t\t\tDUK_ASSERT(q_blen > 0);  /* no issues with empty memcmp() */\n\t\t\t\tif (DUK_MEMCMP((const void *) p, (const void *) q_start, (size_t) q_blen) == 0) {\n\t\t\t\t\t/* never an empty match, so step 13.c.iii can't be triggered */\n\t\t\t\t\tgoto found;\n\t\t\t\t}\n\n\t\t\t\t/* track utf-8 non-continuation bytes */\n\t\t\t\tif ((p[0] & 0xc0) != 0x80) {\n\t\t\t\t\tmatch_start_coff++;\n\t\t\t\t}\n\t\t\t\tp++;\n\t\t\t}\n\n\t\t not_found:\n\t\t\t/* not found */\n\t\t\tbreak;\n\n\t\t found:\n\t\t\tmatched = 1;\n\t\t\tmatch_start_boff = (duk_uint32_t) (p - p_start);\n\t\t\tmatch_end_coff = (duk_uint32_t) (match_start_coff + q_clen);  /* constrained by string length */\n\t\t\tmatch_end_boff = (duk_uint32_t) (match_start_boff + q_blen);  /* ditto */\n\n\t\t\t/* empty match (may happen with empty separator) -> bump and continue */\n\t\t\tif (prev_match_end_boff == match_end_boff) {\n\t\t\t\tprev_match_end_boff++;\n\t\t\t\tprev_match_end_coff++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}  /* if (is_regexp) */\n\n\t\t/* stack[0] = separator (string or regexp)\n\t\t * stack[1] = limit\n\t\t * stack[2] = input string\n\t\t * stack[3] = result array\n\t\t * stack[4] = regexp res_obj (if is_regexp)\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"split; match_start b=%ld,c=%ld, match_end b=%ld,c=%ld, prev_end b=%ld,c=%ld\",\n\t\t                     (long) match_start_boff, (long) match_start_coff,\n\t\t                     (long) match_end_boff, (long) match_end_coff,\n\t\t                     (long) prev_match_end_boff, (long) prev_match_end_coff));\n\n\t\tduk_push_lstring(thr,\n\t\t                 (const char *) (DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff),\n\t\t                 (duk_size_t) (match_start_boff - prev_match_end_boff));\n\t\tduk_put_prop_index(thr, 3, arr_idx);\n\t\tarr_idx++;\n\t\tif (arr_idx >= limit) {\n\t\t\tgoto hit_limit;\n\t\t}\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tif (is_regexp) {\n\t\t\tduk_size_t i, len;\n\n\t\t\tlen = duk_get_length(thr, 4);\n\t\t\tfor (i = 1; i < len; i++) {\n\t\t\t\tDUK_ASSERT(i <= DUK_UARRIDX_MAX);  /* cannot have >4G captures */\n\t\t\t\tduk_get_prop_index(thr, 4, (duk_uarridx_t) i);\n\t\t\t\tduk_put_prop_index(thr, 3, arr_idx);\n\t\t\t\tarr_idx++;\n\t\t\t\tif (arr_idx >= limit) {\n\t\t\t\t\tgoto hit_limit;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tduk_pop(thr);\n\t\t\t/* lastIndex already set up for next match */\n\t\t} else {\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\t{  /* unconditionally */\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\t/* no action */\n\t\t}\n\n\t\tprev_match_end_boff = match_end_boff;\n\t\tprev_match_end_coff = match_end_coff;\n\t\tcontinue;\n\t}  /* for */\n\n\t/* Combined step 11 (empty string special case) and 14-15. */\n\n\tDUK_DDD(DUK_DDDPRINT(\"split trailer; prev_end b=%ld,c=%ld\",\n\t                     (long) prev_match_end_boff, (long) prev_match_end_coff));\n\n\tif (DUK_HSTRING_GET_BYTELEN(h_input) > 0 || !matched) {\n\t\t/* Add trailer if:\n\t\t *   a) non-empty input\n\t\t *   b) empty input and no (zero size) match found (step 11)\n\t\t */\n\n\t\tduk_push_lstring(thr,\n\t\t                 (const char *) DUK_HSTRING_GET_DATA(h_input) + prev_match_end_boff,\n\t\t                 (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h_input) - prev_match_end_boff));\n\t\tduk_put_prop_index(thr, 3, arr_idx);\n\t\t/* No arr_idx update or limit check */\n\t}\n\n\treturn 1;\n\n hit_limit:\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\tif (is_regexp) {\n\t\tduk_pop(thr);\n\t}\n#endif\n\n\treturn 1;\n}\n\n/*\n *  Various\n */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\nDUK_LOCAL void duk__to_regexp_helper(duk_hthread *thr, duk_idx_t idx, duk_bool_t force_new) {\n\tduk_hobject *h;\n\n\t/* Shared helper for match() steps 3-4, search() steps 3-4. */\n\n\tDUK_ASSERT(idx >= 0);\n\n\tif (force_new) {\n\t\tgoto do_new;\n\t}\n\n\th = duk_get_hobject_with_class(thr, idx, DUK_HOBJECT_CLASS_REGEXP);\n\tif (!h) {\n\t\tgoto do_new;\n\t}\n\treturn;\n\n do_new:\n\tduk_push_hobject_bidx(thr, DUK_BIDX_REGEXP_CONSTRUCTOR);\n\tduk_dup(thr, idx);\n\tduk_new(thr, 1);  /* [ ... RegExp val ] -> [ ... res ] */\n\tduk_replace(thr, idx);\n}\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_search(duk_hthread *thr) {\n\t/* Easiest way to implement the search required by the specification\n\t * is to do a RegExp test() with lastIndex forced to zero.  To avoid\n\t * side effects on the argument, \"clone\" the RegExp if a RegExp was\n\t * given as input.\n\t *\n\t * The global flag of the RegExp should be ignored; setting lastIndex\n\t * to zero (which happens when \"cloning\" the RegExp) should have an\n\t * equivalent effect.\n\t */\n\n\tDUK_ASSERT_TOP(thr, 1);\n\t(void) duk_push_this_coercible_to_string(thr);  /* at index 1 */\n\tduk__to_regexp_helper(thr, 0 /*index*/, 1 /*force_new*/);\n\n\t/* stack[0] = regexp\n\t * stack[1] = string\n\t */\n\n\t/* Avoid using RegExp.prototype methods, as they're writable and\n\t * configurable and may have been changed.\n\t */\n\n\tduk_dup_0(thr);\n\tduk_dup_1(thr);  /* [ ... re_obj input ] */\n\tduk_regexp_match(thr);  /* -> [ ... res_obj ] */\n\n\tif (!duk_is_object(thr, -1)) {\n\t\tduk_push_int(thr, -1);\n\t\treturn 1;\n\t}\n\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INDEX);\n\tDUK_ASSERT(duk_is_number(thr, -1));\n\treturn 1;\n}\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_match(duk_hthread *thr) {\n\tduk_bool_t global;\n\tduk_int_t prev_last_index;\n\tduk_int_t this_index;\n\tduk_int_t arr_idx;\n\n\tDUK_ASSERT_TOP(thr, 1);\n\t(void) duk_push_this_coercible_to_string(thr);\n\tduk__to_regexp_helper(thr, 0 /*index*/, 0 /*force_new*/);\n\tglobal = duk_get_prop_stridx_boolean(thr, 0, DUK_STRIDX_GLOBAL, NULL);\n\tDUK_ASSERT_TOP(thr, 2);\n\n\t/* stack[0] = regexp\n\t * stack[1] = string\n\t */\n\n\tif (!global) {\n\t\tduk_regexp_match(thr);  /* -> [ res_obj ] */\n\t\treturn 1;  /* return 'res_obj' */\n\t}\n\n\t/* Global case is more complex. */\n\n\t/* [ regexp string ] */\n\n\tduk_push_int(thr, 0);\n\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\tduk_push_array(thr);\n\n\t/* [ regexp string res_arr ] */\n\n\tprev_last_index = 0;\n\tarr_idx = 0;\n\n\tfor (;;) {\n\t\tDUK_ASSERT_TOP(thr, 3);\n\n\t\tduk_dup_0(thr);\n\t\tduk_dup_1(thr);\n\t\tduk_regexp_match(thr);  /* -> [ ... regexp string ] -> [ ... res_obj ] */\n\n\t\tif (!duk_is_object(thr, -1)) {\n\t\t\tduk_pop(thr);\n\t\t\tbreak;\n\t\t}\n\n\t\tduk_get_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\t\tDUK_ASSERT(duk_is_number(thr, -1));\n\t\tthis_index = duk_get_int(thr, -1);\n\t\tduk_pop(thr);\n\n\t\tif (this_index == prev_last_index) {\n\t\t\tthis_index++;\n\t\t\tduk_push_int(thr, this_index);\n\t\t\tduk_put_prop_stridx_short(thr, 0, DUK_STRIDX_LAST_INDEX);\n\t\t}\n\t\tprev_last_index = this_index;\n\n\t\tduk_get_prop_index(thr, -1, 0);  /* match string */\n\t\tduk_put_prop_index(thr, 2, (duk_uarridx_t) arr_idx);\n\t\tarr_idx++;\n\t\tduk_pop(thr);  /* res_obj */\n\t}\n\n\tif (arr_idx == 0) {\n\t\tduk_push_null(thr);\n\t}\n\n\treturn 1;  /* return 'res_arr' or 'null' */\n}\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_concat(duk_hthread *thr) {\n\t/* duk_concat() coerces arguments with ToString() in correct order */\n\t(void) duk_push_this_coercible_to_string(thr);\n\tduk_insert(thr, 0);  /* this is relatively expensive */\n\tduk_concat(thr, duk_get_top(thr));\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_trim(duk_hthread *thr) {\n\tDUK_ASSERT_TOP(thr, 0);\n\t(void) duk_push_this_coercible_to_string(thr);\n\tduk_trim(thr, 0);\n\tDUK_ASSERT_TOP(thr, 1);\n\treturn 1;\n}\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_repeat(duk_hthread *thr) {\n\tduk_hstring *h_input;\n\tduk_size_t input_blen;\n\tduk_size_t result_len;\n\tduk_int_t count_signed;\n\tduk_uint_t count;\n\tconst duk_uint8_t *src;\n\tduk_uint8_t *buf;\n\tduk_uint8_t *p;\n\tduk_double_t d;\n#if !defined(DUK_USE_PREFER_SIZE)\n\tduk_size_t copy_size;\n\tduk_uint8_t *p_end;\n#endif\n\n\tDUK_ASSERT_TOP(thr, 1);\n\th_input = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h_input != NULL);\n\tinput_blen = DUK_HSTRING_GET_BYTELEN(h_input);\n\n\t/* Count is ToNumber() coerced; +Infinity must be always rejected\n\t * (even if input string is zero length), as well as negative values\n\t * and -Infinity.  -Infinity doesn't require an explicit check\n\t * because duk_get_int() clamps it to DUK_INT_MIN which gets rejected\n\t * as a negative value (regardless of input string length).\n\t */\n\td = duk_to_number(thr, 0);\n\tif (duk_double_is_posinf(d)) {\n\t\tgoto fail_range;\n\t}\n\tcount_signed = duk_get_int(thr, 0);\n\tif (count_signed < 0) {\n\t\tgoto fail_range;\n\t}\n\tcount = (duk_uint_t) count_signed;\n\n\t/* Overflow check for result length. */\n\tresult_len = count * input_blen;\n\tif (count != 0 && result_len / count != input_blen) {\n\t\tgoto fail_range;\n\t}\n\n\t/* Temporary fixed buffer, later converted to string. */\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer_nozero(thr, result_len);\n\tsrc = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);\n\n#if defined(DUK_USE_PREFER_SIZE)\n\tp = buf;\n\twhile (count-- > 0) {\n\t\tDUK_MEMCPY((void *) p, (const void *) src, input_blen);  /* copy size may be zero */\n\t\tp += input_blen;\n\t}\n#else  /* DUK_USE_PREFER_SIZE */\n\t/* Take advantage of already copied pieces to speed up the process\n\t * especially for small repeated strings.\n\t */\n\tp = buf;\n\tp_end = p + result_len;\n\tcopy_size = input_blen;\n\tfor (;;) {\n\t\tduk_size_t remain = (duk_size_t) (p_end - p);\n\t\tDUK_DDD(DUK_DDDPRINT(\"remain=%ld, copy_size=%ld, input_blen=%ld, result_len=%ld\",\n\t\t                     (long) remain, (long) copy_size, (long) input_blen,\n\t\t                     (long) result_len));\n\t\tif (remain <= copy_size) {\n\t\t\t/* If result_len is zero, this case is taken and does\n\t\t\t * a zero size copy.\n\t\t\t */\n\t\t\tDUK_MEMCPY((void *) p, (const void *) src, remain);\n\t\t\tbreak;\n\t\t} else {\n\t\t\tDUK_MEMCPY((void *) p, (const void *) src, copy_size);\n\t\t\tp += copy_size;\n\t\t}\n\n\t\tsrc = (const duk_uint8_t *) buf;  /* Use buf as source for larger copies. */\n\t\tcopy_size = (duk_size_t) (p - buf);\n\t}\n#endif  /* DUK_USE_PREFER_SIZE */\n\n\t/* XXX: It would be useful to be able to create a duk_hstring with\n\t * a certain byte size whose data area wasn't initialized and which\n\t * wasn't in the string table yet.  This would allow a string to be\n\t * constructed directly without a buffer temporary and when it was\n\t * finished, it could be injected into the string table.  Currently\n\t * this isn't possible because duk_hstrings are only tracked by the\n\t * intern table (they are not in heap_allocated).\n\t */\n\n\tduk_buffer_to_string(thr, -1);  /* Safe if input is safe. */\n\treturn 1;\n\n fail_range:\n\tDUK_DCERROR_RANGE_INVALID_ARGS(thr);\n}\n#endif  /* DUK_USE_ES6 */\n\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_locale_compare(duk_hthread *thr) {\n\tduk_hstring *h1;\n\tduk_hstring *h2;\n\tduk_size_t h1_len, h2_len, prefix_len;\n\tduk_small_int_t ret = 0;\n\tduk_small_int_t rc;\n\n\t/* The current implementation of localeCompare() is simply a codepoint\n\t * by codepoint comparison, implemented with a simple string compare\n\t * because UTF-8 should preserve codepoint ordering (assuming valid\n\t * shortest UTF-8 encoding).\n\t *\n\t * The specification requires that the return value must be related\n\t * to the sort order: e.g. negative means that 'this' comes before\n\t * 'that' in sort order.  We assume an ascending sort order.\n\t */\n\n\t/* XXX: could share code with duk_js_ops.c, duk_js_compare_helper */\n\n\th1 = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h1 != NULL);\n\n\th2 = duk_to_hstring(thr, 0);\n\tDUK_ASSERT(h2 != NULL);\n\n\th1_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1);\n\th2_len = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2);\n\tprefix_len = (h1_len <= h2_len ? h1_len : h2_len);\n\n\t/* Zero size compare not an issue with DUK_MEMCMP. */\n\trc = (duk_small_int_t) DUK_MEMCMP((const void *) DUK_HSTRING_GET_DATA(h1),\n\t                                  (const void *) DUK_HSTRING_GET_DATA(h2),\n\t                                  (size_t) prefix_len);\n\n\tif (rc < 0) {\n\t\tret = -1;\n\t\tgoto done;\n\t} else if (rc > 0) {\n\t\tret = 1;\n\t\tgoto done;\n\t}\n\n\t/* prefix matches, lengths matter now */\n\tif (h1_len > h2_len) {\n\t\tret = 1;\n\t\tgoto done;\n\t} else if (h1_len == h2_len) {\n\t\tDUK_ASSERT(ret == 0);\n\t\tgoto done;\n\t}\n\tret = -1;\n\tgoto done;\n\n done:\n\tduk_push_int(thr, (duk_int_t) ret);\n\treturn 1;\n}\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_startswith_endswith(duk_hthread *thr) {\n\tduk_int_t magic;\n\tduk_hstring *h;\n\tduk_hstring *h_search;\n\tduk_size_t blen_search;\n\tconst duk_uint8_t *p_cmp_start;\n\tduk_bool_t result;\n\n\th = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h != NULL);\n\n\th_search = duk__str_tostring_notregexp(thr, 0);\n\tDUK_ASSERT(h_search != NULL);\n\n\tmagic = duk_get_current_magic(thr);\n\n\tp_cmp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);\n\tblen_search = DUK_HSTRING_GET_BYTELEN(h_search);\n\n\tif (duk_is_undefined(thr, 1)) {\n\t\tif (magic) {\n\t\t\tp_cmp_start += DUK_HSTRING_GET_BYTELEN(h) - blen_search;\n\t\t} else {\n\t\t\t/* p_cmp_start already OK */\n\t\t}\n\t} else {\n\t\tduk_int_t len;\n\t\tduk_int_t pos;\n\n\t\tDUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= DUK_INT_MAX);\n\t\tlen = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);\n\t\tpos = duk_to_int_clamped(thr, 1, 0, len);\n\t\tDUK_ASSERT(pos >= 0 && pos <= len);\n\n\t\tif (magic) {\n\t\t\tp_cmp_start -= blen_search;  /* Conceptually subtracted last, but do already here. */\n\t\t}\n\t\tDUK_ASSERT(pos >= 0 && pos <= len);\n\n\t\tp_cmp_start += duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) pos);\n\t}\n\n\t/* The main comparison can be done using a memcmp() rather than\n\t * doing codepoint comparisons: for CESU-8 strings there is a\n\t * canonical representation for every codepoint.  But we do need\n\t * to deal with the char/byte offset translation to find the\n\t * comparison range.\n\t */\n\n\tresult = 0;\n\tif (p_cmp_start >= DUK_HSTRING_GET_DATA(h) &&\n\t    (duk_size_t) (p_cmp_start - (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h)) + blen_search <= DUK_HSTRING_GET_BYTELEN(h)) {\n\t\tif (DUK_MEMCMP((const void *) p_cmp_start,\n\t\t               (const void *) DUK_HSTRING_GET_DATA(h_search),\n\t\t               (size_t) blen_search) == 0) {\n\t\t\tresult = 1;\n\t\t}\n\t}\n\n\tduk_push_boolean(thr, result);\n\treturn 1;\n}\n#endif  /* DUK_USE_ES6 */\n\n#if defined(DUK_USE_ES6)\nDUK_INTERNAL duk_ret_t duk_bi_string_prototype_includes(duk_hthread *thr) {\n\tduk_hstring *h;\n\tduk_hstring *h_search;\n\tduk_int_t len;\n\tduk_int_t pos;\n\n\th = duk_push_this_coercible_to_string(thr);\n\tDUK_ASSERT(h != NULL);\n\n\th_search = duk__str_tostring_notregexp(thr, 0);\n\tDUK_ASSERT(h_search != NULL);\n\n\tlen = (duk_int_t) DUK_HSTRING_GET_CHARLEN(h);\n\tpos = duk_to_int_clamped(thr, 1, 0, len);\n\tDUK_ASSERT(pos >= 0 && pos <= len);\n\n\tpos = duk__str_search_shared(thr, h, h_search, pos, 0 /*backwards*/);\n\tduk_push_boolean(thr, pos >= 0);\n\treturn 1;\n}\n#endif  /* DUK_USE_ES6 */\n#endif  /* DUK_USE_STRING_BUILTIN */\n#line 1 \"duk_bi_symbol.c\"\n/*\n *  Symbol built-in\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_SYMBOL_BUILTIN)\n\n/*\n *  Constructor\n */\n\nDUK_INTERNAL duk_ret_t duk_bi_symbol_constructor_shared(duk_hthread *thr) {\n\tconst duk_uint8_t *desc;\n\tduk_size_t len;\n\tduk_uint8_t *buf;\n\tduk_uint8_t *p;\n\tduk_int_t magic;\n\n\tmagic = duk_get_current_magic(thr);\n\tif (duk_is_undefined(thr, 0) && (magic == 0)) {\n\t\t/* Symbol() accepts undefined and empty string, but they are\n\t\t * treated differently.\n\t\t */\n\t\tdesc = NULL;\n\t\tlen = 0;\n\t} else {\n\t\t/* Symbol.for() coerces undefined to 'undefined' */\n\t\tdesc = (const duk_uint8_t *) duk_to_lstring(thr, 0, &len);\n\t}\n\n\t/* Maximum symbol data length:\n\t *   +1    initial byte (0x80 or 0x81)\n\t *   +len  description\n\t *   +1    0xff after description, before unique suffix\n\t *   +17   autogenerated unique suffix: 'ffffffff-ffffffff' is longest\n\t *   +1    0xff after unique suffix for symbols with undefined description\n\t */\n\tbuf = (duk_uint8_t *) duk_push_fixed_buffer(thr, 1 + len + 1 + 17 + 1);\n\tp = buf + 1;\n\tDUK_ASSERT(desc != NULL || len == 0);  /* may be NULL if len is 0 */\n\tDUK_MEMCPY((void *) p, (const void *) desc, len);\n\tp += len;\n\tif (magic == 0) {\n\t\t/* Symbol(): create unique symbol.  Use two 32-bit values\n\t\t * to avoid dependency on 64-bit types and 64-bit integer\n\t\t * formatting (at least for now).\n\t\t */\n\t\tif (++thr->heap->sym_counter[0] == 0) {\n\t\t\tthr->heap->sym_counter[1]++;\n\t\t}\n\t\tp += DUK_SPRINTF((char *) p, \"\\xFF\" \"%lx-%lx\",\n\t\t                 (unsigned long) thr->heap->sym_counter[1],\n\t\t                 (unsigned long) thr->heap->sym_counter[0]);\n\t\tif (desc == NULL) {\n\t\t\t/* Special case for 'undefined' description, trailing\n\t\t\t * 0xff distinguishes from empty string description,\n\t\t\t * but needs minimal special case handling elsewhere.\n\t\t\t */\n\t\t\t*p++ = 0xff;\n\t\t}\n\t\tbuf[0] = 0x81;\n\t} else {\n\t\t/* Symbol.for(): create a global symbol */\n\t\tbuf[0] = 0x80;\n\t}\n\n\tduk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf));\n\tDUK_DDD(DUK_DDDPRINT(\"created symbol: %!T\", duk_get_tval(thr, -1)));\n\treturn 1;\n}\n\nDUK_LOCAL duk_hstring *duk__auto_unbox_symbol(duk_hthread *thr, duk_tval *tv_arg) {\n\tduk_tval *tv;\n\tduk_tval tv_val;\n\tduk_hobject *h_obj;\n\tduk_hstring *h_str;\n\n\tDUK_ASSERT(tv_arg != NULL);\n\n\t/* XXX: add internal helper: duk_auto_unbox_tval(thr, tv, mask); */\n\t/* XXX: add internal helper: duk_auto_unbox(thr, tv, idx); */\n\n\ttv = tv_arg;\n\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\th_obj = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h_obj != NULL);\n\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_SYMBOL) {\n\t\t\tif (!duk_hobject_get_internal_value(thr->heap, h_obj, &tv_val)) {\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\ttv = &tv_val;\n\t\t} else {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tif (!DUK_TVAL_IS_STRING(tv)) {\n\t\treturn NULL;\n\t}\n\th_str = DUK_TVAL_GET_STRING(tv);\n\tDUK_ASSERT(h_str != NULL);\n\n\t/* Here symbol is more expected than not. */\n\tif (DUK_UNLIKELY(!DUK_HSTRING_HAS_SYMBOL(h_str))) {\n\t\treturn NULL;\n\t}\n\n\treturn h_str;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_symbol_tostring_shared(duk_hthread *thr) {\n\tduk_hstring *h_str;\n\n\th_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr));\n\tif (h_str == NULL) {\n\t\treturn DUK_RET_TYPE_ERROR;\n\t}\n\n\tif (duk_get_current_magic(thr) == 0) {\n\t\t/* .toString() */\n\t\tduk_push_symbol_descriptive_string(thr, h_str);\n\t} else {\n\t\t/* .valueOf() */\n\t\tduk_push_hstring(thr, h_str);\n\t}\n\treturn 1;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_symbol_key_for(duk_hthread *thr) {\n\tduk_hstring *h;\n\tconst duk_uint8_t *p;\n\n\t/* Argument must be a symbol but not checked here.  The initial byte\n\t * check will catch non-symbol strings.\n\t */\n\th = duk_require_hstring(thr, 0);\n\tDUK_ASSERT(h != NULL);\n\n\tp = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);\n\tDUK_ASSERT(p != NULL);\n\n\t/* Even for zero length strings there's at least one NUL byte so\n\t * we can safely check the initial byte.\n\t */\n\tif (p[0] == 0x80) {\n\t\t/* Global symbol, return its key (bytes just after the initial byte). */\n\t\tduk_push_lstring(thr, (const char *) (p + 1), (duk_size_t) (DUK_HSTRING_GET_BYTELEN(h) - 1));\n\t\treturn 1;\n\t} else if (p[0] == 0x81 || p[0] == 0x82 || p[0] == 0xff) {\n\t\t/* Local symbol or hidden symbol, return undefined. */\n\t\treturn 0;\n\t}\n\n\t/* Covers normal strings and unknown initial bytes. */\n\treturn DUK_RET_TYPE_ERROR;\n}\n\nDUK_INTERNAL duk_ret_t duk_bi_symbol_toprimitive(duk_hthread *thr) {\n\tduk_hstring *h_str;\n\n\th_str = duk__auto_unbox_symbol(thr, DUK_HTHREAD_THIS_PTR(thr));\n\tif (h_str == NULL) {\n\t\treturn DUK_RET_TYPE_ERROR;\n\t}\n\tduk_push_hstring(thr, h_str);\n\treturn 1;\n}\n\n#endif  /* DUK_USE_SYMBOL_BUILTIN */\n#line 1 \"duk_bi_thread.c\"\n/*\n *  Thread builtins\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Constructor\n */\n\n#if defined(DUK_USE_COROUTINE_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_thread_constructor(duk_hthread *thr) {\n\tduk_hthread *new_thr;\n\tduk_hobject *func;\n\n\t/* Check that the argument is callable; this is not 100% because we\n\t * don't allow native functions to be a thread's initial function.\n\t * Resume will reject such functions in any case.\n\t */\n\t/* XXX: need a duk_require_func_promote_lfunc() */\n\tfunc = duk_require_hobject_promote_lfunc(thr, 0);\n\tDUK_ASSERT(func != NULL);\n\tduk_require_callable(thr, 0);\n\n\tduk_push_thread(thr);\n\tnew_thr = (duk_hthread *) duk_known_hobject(thr, -1);\n\tnew_thr->state = DUK_HTHREAD_STATE_INACTIVE;\n\n\t/* push initial function call to new thread stack; this is\n\t * picked up by resume().\n\t */\n\tduk_push_hobject(new_thr, func);\n\n\treturn 1;  /* return thread */\n}\n#endif\n\n/*\n *  Resume a thread.\n *\n *  The thread must be in resumable state, either (a) new thread which hasn't\n *  yet started, or (b) a thread which has previously yielded.  This method\n *  must be called from an Ecmascript function.\n *\n *  Args:\n *    - thread\n *    - value\n *    - isError (defaults to false)\n *\n *  Note: yield and resume handling is currently asymmetric.\n */\n\n#if defined(DUK_USE_COROUTINE_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_thread_resume(duk_hthread *ctx) {\n\tduk_hthread *thr = (duk_hthread *) ctx;\n\tduk_hthread *thr_resume;\n\tduk_hobject *caller_func;\n\tduk_small_uint_t is_error;\n\n\tDUK_DDD(DUK_DDDPRINT(\"Duktape.Thread.resume(): thread=%!T, value=%!T, is_error=%!T\",\n\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t                     (duk_tval *) duk_get_tval(thr, 1),\n\t                     (duk_tval *) duk_get_tval(thr, 2)));\n\n\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);\n\tDUK_ASSERT(thr->heap->curr_thread == thr);\n\n\tthr_resume = duk_require_hthread(thr, 0);\n\tis_error = (duk_small_uint_t) duk_to_boolean(thr, 2);\n\tduk_set_top(thr, 2);\n\n\t/* [ thread value ] */\n\n\t/*\n\t *  Thread state and calling context checks\n\t */\n\n\tif (thr->callstack_top < 2) {\n\t\tDUK_DD(DUK_DDPRINT(\"resume state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.resume)\"));\n\t\tgoto state_error;\n\t}\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT(thr->callstack_curr->parent != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);  /* us */\n\tDUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL);  /* caller */\n\n\tcaller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent);\n\tif (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) {\n\t\tDUK_DD(DUK_DDPRINT(\"resume state invalid: caller must be Ecmascript code\"));\n\t\tgoto state_error;\n\t}\n\n\t/* Note: there is no requirement that: 'thr->callstack_preventcount == 1'\n\t * like for yield.\n\t */\n\n\tif (thr_resume->state != DUK_HTHREAD_STATE_INACTIVE &&\n\t    thr_resume->state != DUK_HTHREAD_STATE_YIELDED) {\n\t\tDUK_DD(DUK_DDPRINT(\"resume state invalid: target thread must be INACTIVE or YIELDED\"));\n\t\tgoto state_error;\n\t}\n\n\tDUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE ||\n\t           thr_resume->state == DUK_HTHREAD_STATE_YIELDED);\n\n\t/* Further state-dependent pre-checks */\n\n\tif (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) {\n\t\t/* no pre-checks now, assume a previous yield() has left things in\n\t\t * tip-top shape (longjmp handler will assert for these).\n\t\t */\n\t} else {\n\t\tduk_hobject *h_fun;\n\n\t\tDUK_ASSERT(thr_resume->state == DUK_HTHREAD_STATE_INACTIVE);\n\n\t\t/* The initial function must be an Ecmascript function (but\n\t\t * can be bound).  We must make sure of that before we longjmp\n\t\t * because an error in the RESUME handler call processing will\n\t\t * not be handled very cleanly.\n\t\t */\n\t\tif ((thr_resume->callstack_top != 0) ||\n\t\t    (thr_resume->valstack_top - thr_resume->valstack != 1)) {\n\t\t\tgoto state_error;\n\t\t}\n\n\t\tduk_push_tval(thr, DUK_GET_TVAL_NEGIDX(thr_resume, -1));\n\t\tduk_resolve_nonbound_function(thr);\n\t\th_fun = duk_require_hobject(thr, -1);  /* reject lightfuncs on purpose */\n\t\tif (!DUK_HOBJECT_IS_CALLABLE(h_fun) || !DUK_HOBJECT_IS_COMPFUNC(h_fun)) {\n\t\t\tgoto state_error;\n\t\t}\n\t\tduk_pop(thr);\n\t}\n\n\t/*\n\t *  The error object has been augmented with a traceback and other\n\t *  info from its creation point -- usually another thread.  The\n\t *  error handler is called here right before throwing, but it also\n\t *  runs in the resumer's thread.  It might be nice to get a traceback\n\t *  from the resumee but this is not the case now.\n\t */\n\n#if defined(DUK_USE_AUGMENT_ERROR_THROW)\n\tif (is_error) {\n\t\tDUK_ASSERT_TOP(thr, 2);  /* value (error) is at stack top */\n\t\tduk_err_augment_error_throw(thr);  /* in resumer's context */\n\t}\n#endif\n\n#if defined(DUK_USE_DEBUG)\n\tif (is_error) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"RESUME ERROR: thread=%!T, value=%!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t\t                     (duk_tval *) duk_get_tval(thr, 1)));\n\t} else if (thr_resume->state == DUK_HTHREAD_STATE_YIELDED) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"RESUME NORMAL: thread=%!T, value=%!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t\t                     (duk_tval *) duk_get_tval(thr, 1)));\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"RESUME INITIAL: thread=%!T, value=%!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t\t                     (duk_tval *) duk_get_tval(thr, 1)));\n\t}\n#endif\n\n\tthr->heap->lj.type = DUK_LJ_TYPE_RESUME;\n\n\t/* lj value2: thread */\n\tDUK_ASSERT(thr->valstack_bottom < thr->valstack_top);\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value2, &thr->valstack_bottom[0]);  /* side effects */\n\n\t/* lj value1: value */\n\tDUK_ASSERT(thr->valstack_bottom + 1 < thr->valstack_top);\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[1]);  /* side effects */\n\tDUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1);\n\n\tthr->heap->lj.iserror = is_error;\n\n\tDUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL);  /* call is from executor, so we know we have a jmpbuf */\n\tduk_err_longjmp(thr);  /* execution resumes in bytecode executor */\n\tDUK_UNREACHABLE();\n\t/* Never here, fall through to error (from compiler point of view). */\n\n state_error:\n\tDUK_DCERROR_TYPE_INVALID_STATE(thr);\n}\n#endif\n\n/*\n *  Yield the current thread.\n *\n *  The thread must be in yieldable state: it must have a resumer, and there\n *  must not be any yield-preventing calls (native calls and constructor calls,\n *  currently) in the thread's call stack (otherwise a resume would not be\n *  possible later).  This method must be called from an Ecmascript function.\n *\n *  Args:\n *    - value\n *    - isError (defaults to false)\n *\n *  Note: yield and resume handling is currently asymmetric.\n */\n\n#if defined(DUK_USE_COROUTINE_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_thread_yield(duk_hthread *thr) {\n\tduk_hobject *caller_func;\n\tduk_small_uint_t is_error;\n\n\tDUK_DDD(DUK_DDDPRINT(\"Duktape.Thread.yield(): value=%!T, is_error=%!T\",\n\t                     (duk_tval *) duk_get_tval(thr, 0),\n\t                     (duk_tval *) duk_get_tval(thr, 1)));\n\n\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);\n\tDUK_ASSERT(thr->heap->curr_thread == thr);\n\n\tis_error = (duk_small_uint_t) duk_to_boolean(thr, 1);\n\tduk_set_top(thr, 1);\n\n\t/* [ value ] */\n\n\t/*\n\t *  Thread state and calling context checks\n\t */\n\n\tif (!thr->resumer) {\n\t\tDUK_DD(DUK_DDPRINT(\"yield state invalid: current thread must have a resumer\"));\n\t\tgoto state_error;\n\t}\n\tDUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED);\n\n\tif (thr->callstack_top < 2) {\n\t\tDUK_DD(DUK_DDPRINT(\"yield state invalid: callstack should contain at least 2 entries (caller and Duktape.Thread.yield)\"));\n\t\tgoto state_error;\n\t}\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT(thr->callstack_curr->parent != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);  /* us */\n\tDUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL);  /* caller */\n\n\tcaller_func = DUK_ACT_GET_FUNC(thr->callstack_curr->parent);\n\tif (!DUK_HOBJECT_IS_COMPFUNC(caller_func)) {\n\t\tDUK_DD(DUK_DDPRINT(\"yield state invalid: caller must be Ecmascript code\"));\n\t\tgoto state_error;\n\t}\n\n\tDUK_ASSERT(thr->callstack_preventcount >= 1);  /* should never be zero, because we (Duktape.Thread.yield) are on the stack */\n\tif (thr->callstack_preventcount != 1) {\n\t\t/* Note: the only yield-preventing call is Duktape.Thread.yield(), hence check for 1, not 0 */\n\t\tDUK_DD(DUK_DDPRINT(\"yield state invalid: there must be no yield-preventing calls in current thread callstack (preventcount is %ld)\",\n\t\t                   (long) thr->callstack_preventcount));\n\t\tgoto state_error;\n\t}\n\n\t/*\n\t *  The error object has been augmented with a traceback and other\n\t *  info from its creation point -- usually the current thread.\n\t *  The error handler, however, is called right before throwing\n\t *  and runs in the yielder's thread.\n\t */\n\n#if defined(DUK_USE_AUGMENT_ERROR_THROW)\n\tif (is_error) {\n\t\tDUK_ASSERT_TOP(thr, 1);  /* value (error) is at stack top */\n\t\tduk_err_augment_error_throw(thr);  /* in yielder's context */\n\t}\n#endif\n\n#if defined(DUK_USE_DEBUG)\n\tif (is_error) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"YIELD ERROR: value=%!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, 0)));\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"YIELD NORMAL: value=%!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, 0)));\n\t}\n#endif\n\n\t/*\n\t *  Process yield\n\t *\n\t *  After longjmp(), processing continues in bytecode executor longjmp\n\t *  handler, which will e.g. update thr->resumer to NULL.\n\t */\n\n\tthr->heap->lj.type = DUK_LJ_TYPE_YIELD;\n\n\t/* lj value1: value */\n\tDUK_ASSERT(thr->valstack_bottom < thr->valstack_top);\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, &thr->heap->lj.value1, &thr->valstack_bottom[0]);  /* side effects */\n\tDUK_TVAL_CHKFAST_INPLACE_SLOW(&thr->heap->lj.value1);\n\n\tthr->heap->lj.iserror = is_error;\n\n\tDUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL);  /* call is from executor, so we know we have a jmpbuf */\n\tduk_err_longjmp(thr);  /* execution resumes in bytecode executor */\n\tDUK_UNREACHABLE();\n\t/* Never here, fall through to error (from compiler point of view). */\n\n state_error:\n\tDUK_DCERROR_TYPE_INVALID_STATE(thr);\n}\n#endif\n\n#if defined(DUK_USE_COROUTINE_SUPPORT)\nDUK_INTERNAL duk_ret_t duk_bi_thread_current(duk_hthread *thr) {\n\tduk_push_current_thread(thr);\n\treturn 1;\n}\n#endif\n#line 1 \"duk_bi_thrower.c\"\n/*\n *  Type error thrower, E5 Section 13.2.3.\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_INTERNAL duk_ret_t duk_bi_type_error_thrower(duk_hthread *thr) {\n\tDUK_DCERROR_TYPE_INVALID_ARGS(thr);\n}\n#line 1 \"duk_debug_fixedbuffer.c\"\n/*\n *  Fixed buffer helper useful for debugging, requires no allocation\n *  which is critical for debugging.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_DEBUG)\n\nDUK_INTERNAL void duk_fb_put_bytes(duk_fixedbuffer *fb, const duk_uint8_t *buffer, duk_size_t length) {\n\tduk_size_t avail;\n\tduk_size_t copylen;\n\n\tavail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset));\n\tif (length > avail) {\n\t\tcopylen = avail;\n\t\tfb->truncated = 1;\n\t} else {\n\t\tcopylen = length;\n\t}\n\tDUK_MEMCPY(fb->buffer + fb->offset, buffer, copylen);\n\tfb->offset += copylen;\n}\n\nDUK_INTERNAL void duk_fb_put_byte(duk_fixedbuffer *fb, duk_uint8_t x) {\n\tduk_fb_put_bytes(fb, (const duk_uint8_t *) &x, 1);\n}\n\nDUK_INTERNAL void duk_fb_put_cstring(duk_fixedbuffer *fb, const char *x) {\n\tduk_fb_put_bytes(fb, (const duk_uint8_t *) x, (duk_size_t) DUK_STRLEN(x));\n}\n\nDUK_INTERNAL void duk_fb_sprintf(duk_fixedbuffer *fb, const char *fmt, ...) {\n\tduk_size_t avail;\n\tva_list ap;\n\n\tva_start(ap, fmt);\n\tavail = (fb->offset >= fb->length ? (duk_size_t) 0 : (duk_size_t) (fb->length - fb->offset));\n\tif (avail > 0) {\n\t\tduk_int_t res = (duk_int_t) DUK_VSNPRINTF((char *) (fb->buffer + fb->offset), avail, fmt, ap);\n\t\tif (res < 0) {\n\t\t\t/* error */\n\t\t} else if ((duk_size_t) res >= avail) {\n\t\t\t/* (maybe) truncated */\n\t\t\tfb->offset += avail;\n\t\t\tif ((duk_size_t) res > avail) {\n\t\t\t\t/* actual chars dropped (not just NUL term) */\n\t\t\t\tfb->truncated = 1;\n\t\t\t}\n\t\t} else {\n\t\t\t/* normal */\n\t\t\tfb->offset += (duk_size_t) res;\n\t\t}\n\t}\n\tva_end(ap);\n}\n\nDUK_INTERNAL void duk_fb_put_funcptr(duk_fixedbuffer *fb, duk_uint8_t *fptr, duk_size_t fptr_size) {\n\tchar buf[64+1];\n\tduk_debug_format_funcptr(buf, sizeof(buf), fptr, fptr_size);\n\tbuf[sizeof(buf) - 1] = (char) 0;\n\tduk_fb_put_cstring(fb, buf);\n}\n\nDUK_INTERNAL duk_bool_t duk_fb_is_full(duk_fixedbuffer *fb) {\n\treturn (fb->offset >= fb->length);\n}\n\n#endif  /* DUK_USE_DEBUG */\n#line 1 \"duk_debug_vsnprintf.c\"\n/*\n *  Custom formatter for debug printing, allowing Duktape specific data\n *  structures (such as tagged values and heap objects) to be printed with\n *  a nice format string.  Because debug printing should not affect execution\n *  state, formatting here must be independent of execution (see implications\n *  below) and must not allocate memory.\n *\n *  Custom format tags begin with a '%!' to safely distinguish them from\n *  standard format tags.  The following conversions are supported:\n *\n *     %!T    tagged value (duk_tval *)\n *     %!O    heap object (duk_heaphdr *)\n *     %!I    decoded bytecode instruction\n *     %!C    bytecode instruction opcode name (arg is long)\n *\n *  Everything is serialized in a JSON-like manner.  The default depth is one\n *  level, internal prototype is not followed, and internal properties are not\n *  serialized.  The following modifiers change this behavior:\n *\n *     @      print pointers\n *     #      print binary representations (where applicable)\n *     d      deep traversal of own properties (not prototype)\n *     p      follow prototype chain (useless without 'd')\n *     i      include internal properties (other than prototype)\n *     x      hexdump buffers\n *     h      heavy formatting\n *\n *  For instance, the following serializes objects recursively, but does not\n *  follow the prototype chain nor print internal properties: \"%!dO\".\n *\n *  Notes:\n *\n *    * Standard snprintf return value semantics seem to vary.  This\n *      implementation returns the number of bytes it actually wrote\n *      (excluding the null terminator).  If retval == buffer size,\n *      output was truncated (except for corner cases).\n *\n *    * Output format is intentionally different from Ecmascript\n *      formatting requirements, as formatting here serves debugging\n *      of internals.\n *\n *    * Depth checking (and updating) is done in each type printer\n *      separately, to allow them to call each other freely.\n *\n *    * Some pathological structures might take ages to print (e.g.\n *      self recursion with 100 properties pointing to the object\n *      itself).  To guard against these, each printer also checks\n *      whether the output buffer is full; if so, early exit.\n *\n *    * Reference loops are detected using a loop stack.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_DEBUG)\n\n/* #include stdio.h -> already included */\n/* #include stdarg.h -> already included */\n#include <string.h>\n\n/* list of conversion specifiers that terminate a format tag;\n * this is unfortunately guesswork.\n */\n#define DUK__ALLOWED_STANDARD_SPECIFIERS  \"diouxXeEfFgGaAcsCSpnm\"\n\n/* maximum length of standard format tag that we support */\n#define DUK__MAX_FORMAT_TAG_LENGTH  32\n\n/* heapobj recursion depth when deep printing is selected */\n#define DUK__DEEP_DEPTH_LIMIT  8\n\n/* maximum recursion depth for loop detection stacks */\n#define DUK__LOOP_STACK_DEPTH  256\n\n/* must match bytecode defines now; build autogenerate? */\nDUK_LOCAL const char * const duk__bc_optab[256] = {\n\t\"LDREG\", \"STREG\", \"JUMP\", \"LDCONST\", \"LDINT\", \"LDINTX\", \"LDTHIS\", \"LDUNDEF\",\n\t\"LDNULL\", \"LDTRUE\", \"LDFALSE\", \"GETVAR\", \"BNOT\", \"LNOT\", \"UNM\", \"UNP\",\n\t\"EQ_RR\", \"EQ_CR\", \"EQ_RC\", \"EQ_CC\", \"NEQ_RR\", \"NEQ_CR\", \"NEQ_RC\", \"NEQ_CC\",\n\t\"SEQ_RR\", \"SEQ_CR\", \"SEQ_RC\", \"SEQ_CC\", \"SNEQ_RR\", \"SNEQ_CR\", \"SNEQ_RC\", \"SNEQ_CC\",\n\n\t\"GT_RR\", \"GT_CR\", \"GT_RC\", \"GT_CC\", \"GE_RR\", \"GE_CR\", \"GE_RC\", \"GE_CC\",\n\t\"LT_RR\", \"LT_CR\", \"LT_RC\", \"LT_CC\", \"LE_RR\", \"LE_CR\", \"LE_RC\", \"LE_CC\",\n\t\"IFTRUE_R\", \"IFTRUE_C\", \"IFFALSE_R\", \"IFFALSE_C\", \"ADD_RR\", \"ADD_CR\", \"ADD_RC\", \"ADD_CC\",\n\t\"SUB_RR\", \"SUB_CR\", \"SUB_RC\", \"SUB_CC\", \"MUL_RR\", \"MUL_CR\", \"MUL_RC\", \"MUL_CC\",\n\n\t\"DIV_RR\", \"DIV_CR\", \"DIV_RC\", \"DIV_CC\", \"MOD_RR\", \"MOD_CR\", \"MOD_RC\", \"MOD_CC\",\n\t\"EXP_RR\", \"EXP_CR\", \"EXP_RC\", \"EXP_CC\", \"BAND_RR\", \"BAND_CR\", \"BAND_RC\", \"BAND_CC\",\n\t\"BOR_RR\", \"BOR_CR\", \"BOR_RC\", \"BOR_CC\", \"BXOR_RR\", \"BXOR_CR\", \"BXOR_RC\", \"BXOR_CC\",\n\t\"BASL_RR\", \"BASL_CR\", \"BASL_RC\", \"BASL_CC\", \"BLSR_RR\", \"BLSR_CR\", \"BLSR_RC\", \"BLSR_CC\",\n\n\t\"BASR_RR\", \"BASR_CR\", \"BASR_RC\", \"BASR_CC\", \"INSTOF_RR\", \"INSTOF_CR\", \"INSTOF_RC\", \"INSTOF_CC\",\n\t\"IN_RR\", \"IN_CR\", \"IN_RC\", \"IN_CC\", \"GETPROP_RR\", \"GETPROP_CR\", \"GETPROP_RC\", \"GETPROP_CC\",\n\t\"PUTPROP_RR\", \"PUTPROP_CR\", \"PUTPROP_RC\", \"PUTPROP_CC\", \"DELPROP_RR\", \"DELPROP_CR\", \"DELPROP_RC\", \"DELPROP_CC\",\n\t\"PREINCR\", \"PREDECR\", \"POSTINCR\", \"POSTDECR\", \"PREINCV\", \"PREDECV\", \"POSTINCV\", \"POSTDECV\",\n\n\t\"PREINCP_RR\", \"PREINCP_CR\", \"PREINCP_RC\", \"PREINCP_CC\", \"PREDECP_RR\", \"PREDECP_CR\", \"PREDECP_RC\", \"PREDECP_CC\",\n\t\"POSTINCP_RR\", \"POSTINCP_CR\", \"POSTINCP_RC\", \"POSTINCP_CC\", \"POSTDECP_RR\", \"POSTDECP_CR\", \"POSTDECP_RC\", \"POSTDECP_CC\",\n\t\"DECLVAR_RR\", \"DECLVAR_CR\", \"DECLVAR_RC\", \"DECLVAR_CC\", \"REGEXP_RR\", \"REGEXP_RC\", \"REGEXP_CR\", \"REGEXP_CC\",\n\t\"CLOSURE\", \"TYPEOF\", \"TYPEOFID\", \"PUTVAR\", \"DELVAR\", \"RETREG\", \"RETUNDEF\", \"RETCONST\",\n\n\t\"RETCONSTN\", \"LABEL\", \"ENDLABEL\", \"BREAK\", \"CONTINUE\", \"TRYCATCH\", \"ENDTRY\", \"ENDCATCH\",\n\t\"ENDFIN\", \"THROW\", \"INVLHS\", \"CSREG\", \"CSVAR_RR\", \"CSVAR_CR\", \"CSVAR_RC\", \"CSVAR_CC\",\n\t\"CALL0\", \"CALL1\", \"CALL2\", \"CALL3\", \"CALL4\", \"CALL5\", \"CALL6\", \"CALL7\",\n\t\"CALL8\", \"CALL9\", \"CALL10\", \"CALL11\", \"CALL12\", \"CALL13\", \"CALL14\", \"CALL15\",\n\n\t\"NEWOBJ\", \"NEWARR\", \"MPUTOBJ\", \"MPUTOBJI\", \"INITSET\", \"INITGET\", \"MPUTARR\", \"MPUTARRI\",\n\t\"SETALEN\", \"INITENUM\", \"NEXTENUM\", \"NEWTARGET\", \"DEBUGGER\", \"NOP\", \"INVALID\", \"UNUSED207\",\n\t\"GETPROPC_RR\", \"GETPROPC_CR\", \"GETPROPC_RC\", \"GETPROPC_CC\", \"UNUSED212\", \"UNUSED213\", \"UNUSED214\", \"UNUSED215\",\n\t\"UNUSED216\", \"UNUSED217\", \"UNUSED218\", \"UNUSED219\", \"UNUSED220\", \"UNUSED221\", \"UNUSED222\", \"UNUSED223\",\n\n\t\"UNUSED224\", \"UNUSED225\", \"UNUSED226\", \"UNUSED227\", \"UNUSED228\", \"UNUSED229\", \"UNUSED230\", \"UNUSED231\",\n\t\"UNUSED232\", \"UNUSED233\", \"UNUSED234\", \"UNUSED235\", \"UNUSED236\", \"UNUSED237\", \"UNUSED238\", \"UNUSED239\",\n\t\"UNUSED240\", \"UNUSED241\", \"UNUSED242\", \"UNUSED243\", \"UNUSED244\", \"UNUSED245\", \"UNUSED246\", \"UNUSED247\",\n\t\"UNUSED248\", \"UNUSED249\", \"UNUSED250\", \"UNUSED251\", \"UNUSED252\", \"UNUSED253\", \"UNUSED254\", \"UNUSED255\"\n};\n\ntypedef struct duk__dprint_state duk__dprint_state;\nstruct duk__dprint_state {\n\tduk_fixedbuffer *fb;\n\n\t/* loop_stack_index could be perhaps be replaced by 'depth', but it's nice\n\t * to not couple these two mechanisms unnecessarily.\n\t */\n\tduk_hobject *loop_stack[DUK__LOOP_STACK_DEPTH];\n\tduk_int_t loop_stack_index;\n\tduk_int_t loop_stack_limit;\n\n\tduk_int_t depth;\n\tduk_int_t depth_limit;\n\n\tduk_bool_t pointer;\n\tduk_bool_t heavy;\n\tduk_bool_t binary;\n\tduk_bool_t follow_proto;\n\tduk_bool_t internal;\n\tduk_bool_t hexdump;\n};\n\n/* helpers */\nDUK_LOCAL_DECL void duk__print_hstring(duk__dprint_state *st, duk_hstring *k, duk_bool_t quotes);\nDUK_LOCAL_DECL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h);\nDUK_LOCAL_DECL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h);\nDUK_LOCAL_DECL void duk__print_tval(duk__dprint_state *st, duk_tval *tv);\nDUK_LOCAL_DECL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins);\nDUK_LOCAL_DECL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h);\nDUK_LOCAL_DECL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h);\nDUK_LOCAL_DECL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h);\n\nDUK_LOCAL void duk__print_shared_heaphdr(duk__dprint_state *st, duk_heaphdr *h) {\n\tduk_fixedbuffer *fb = st->fb;\n\n\tif (st->heavy) {\n\t\tduk_fb_sprintf(fb, \"(%p)\", (void *) h);\n\t}\n\n\tif (!h) {\n\t\treturn;\n\t}\n\n\tif (st->binary) {\n\t\tduk_size_t i;\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET);\n\t\tfor (i = 0; i < (duk_size_t) sizeof(*h); i++) {\n\t\t\tduk_fb_sprintf(fb, \"%02lx\", (unsigned long) ((duk_uint8_t *)h)[i]);\n\t\t}\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET);\n\t}\n\n#if defined(DUK_USE_REFERENCE_COUNTING)  /* currently implicitly also DUK_USE_DOUBLE_LINKED_HEAP */\n\tif (st->heavy) {\n\t\tduk_fb_sprintf(fb, \"[h_next=%p,h_prev=%p,h_refcount=%lu,h_flags=%08lx,type=%ld,\"\n\t\t               \"reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]\",\n\t\t               (void *) DUK_HEAPHDR_GET_NEXT(NULL, h),\n\t\t               (void *) DUK_HEAPHDR_GET_PREV(NULL, h),\n\t\t               (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(h),\n\t\t               (unsigned long) DUK_HEAPHDR_GET_FLAGS(h),\n\t\t               (long) DUK_HEAPHDR_GET_TYPE(h),\n\t\t               (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0));\n\t}\n#else\n\tif (st->heavy) {\n\t\tduk_fb_sprintf(fb, \"[h_next=%p,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]\",\n\t\t               (void *) DUK_HEAPHDR_GET_NEXT(NULL, h),\n\t\t               (unsigned long) DUK_HEAPHDR_GET_FLAGS(h),\n\t\t               (long) DUK_HEAPHDR_GET_TYPE(h),\n\t\t               (long) (DUK_HEAPHDR_HAS_REACHABLE(h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_TEMPROOT(h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZABLE(h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZED(h) ? 1 : 0));\n\t}\n#endif\n}\n\nDUK_LOCAL void duk__print_shared_heaphdr_string(duk__dprint_state *st, duk_heaphdr_string *h) {\n\tduk_fixedbuffer *fb = st->fb;\n\n\tif (st->heavy) {\n\t\tduk_fb_sprintf(fb, \"(%p)\", (void *) h);\n\t}\n\n\tif (!h) {\n\t\treturn;\n\t}\n\n\tif (st->binary) {\n\t\tduk_size_t i;\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET);\n\t\tfor (i = 0; i < (duk_size_t) sizeof(*h); i++) {\n\t\t\tduk_fb_sprintf(fb, \"%02lx\", (unsigned long) ((duk_uint8_t *)h)[i]);\n\t\t}\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET);\n\t}\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tif (st->heavy) {\n\t\tduk_fb_sprintf(fb, \"[h_refcount=%lu,h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]\",\n\t\t               (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h),\n\t\t               (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h),\n\t\t               (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h),\n\t\t               (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0));\n\t}\n#else\n\tif (st->heavy) {\n\t\tduk_fb_sprintf(fb, \"[h_flags=%08lx,type=%ld,reachable=%ld,temproot=%ld,finalizable=%ld,finalized=%ld]\",\n\t\t               (unsigned long) DUK_HEAPHDR_GET_FLAGS((duk_heaphdr *) h),\n\t\t               (long) DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h),\n\t\t               (long) (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_TEMPROOT((duk_heaphdr *) h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZABLE((duk_heaphdr *) h) ? 1 : 0),\n\t\t               (long) (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) h) ? 1 : 0));\n\t}\n#endif\n}\n\nDUK_LOCAL void duk__print_hstring(duk__dprint_state *st, duk_hstring *h, duk_bool_t quotes) {\n\tduk_fixedbuffer *fb = st->fb;\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_end;\n\n\t/* terminal type: no depth check */\n\n\tif (duk_fb_is_full(fb)) {\n\t\treturn;\n\t}\n\n\tduk__print_shared_heaphdr_string(st, &h->hdr);\n\n\tif (!h) {\n\t\tduk_fb_put_cstring(fb, \"NULL\");\n\t\treturn;\n\t}\n\n\tp = DUK_HSTRING_GET_DATA(h);\n\tp_end = p + DUK_HSTRING_GET_BYTELEN(h);\n\n\tif (p_end > p && p[0] == DUK_ASC_UNDERSCORE) {\n\t\t/* If property key begins with underscore, encode it with\n\t\t * forced quotes (e.g. \"_Foo\") to distinguish it from encoded\n\t\t * internal properties (e.g. \\x82Bar -> _Bar).\n\t\t */\n\t\tquotes = 1;\n\t}\n\n\tif (quotes) {\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE);\n\t}\n\twhile (p < p_end) {\n\t\tduk_uint8_t ch = *p++;\n\n\t\t/* two special escapes: '\\' and '\"', other printables as is */\n\t\tif (ch == '\\\\') {\n\t\t\tduk_fb_sprintf(fb, \"\\\\\\\\\");\n\t\t} else if (ch == '\"') {\n\t\t\tduk_fb_sprintf(fb, \"\\\\\\\"\");\n\t\t} else if (ch >= 0x20 && ch <= 0x7e) {\n\t\t\tduk_fb_put_byte(fb, ch);\n\t\t} else if (ch == 0x82 && !quotes) {\n\t\t\t/* encode \\x82Bar as _Bar if no quotes are\n\t\t\t * applied, this is for readable internal keys.\n\t\t\t */\n\t\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_UNDERSCORE);\n\t\t} else {\n\t\t\tduk_fb_sprintf(fb, \"\\\\x%02lx\", (unsigned long) ch);\n\t\t}\n\t}\n\tif (quotes) {\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_DOUBLEQUOTE);\n\t}\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t/* XXX: limit to quoted strings only, to save keys from being cluttered? */\n\tduk_fb_sprintf(fb, \"/%lu\", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr));\n#endif\n}\n\n#define DUK__COMMA()  do { \\\n\t\tif (first) { \\\n\t\t\tfirst = 0; \\\n\t\t} else { \\\n\t\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA); \\\n\t\t} \\\n\t} while (0)\n\nDUK_LOCAL void duk__print_hobject(duk__dprint_state *st, duk_hobject *h) {\n\tduk_fixedbuffer *fb = st->fb;\n\tduk_uint_fast32_t i;\n\tduk_tval *tv;\n\tduk_hstring *key;\n\tduk_bool_t first = 1;\n\tconst char *brace1 = \"{\";\n\tconst char *brace2 = \"}\";\n\tduk_bool_t pushed_loopstack = 0;\n\n\tif (duk_fb_is_full(fb)) {\n\t\treturn;\n\t}\n\n\tduk__print_shared_heaphdr(st, &h->hdr);\n\n\tif (h && DUK_HOBJECT_HAS_ARRAY_PART(h)) {\n\t\tbrace1 = \"[\";\n\t\tbrace2 = \"]\";\n\t}\n\n\tif (!h) {\n\t\tduk_fb_put_cstring(fb, \"NULL\");\n\t\tgoto finished;\n\t}\n\n\tif (st->depth >= st->depth_limit) {\n\t\tconst char *subtype = \"generic\";\n\n\t\tif (DUK_HOBJECT_IS_COMPFUNC(h)) {\n\t\t\tsubtype = \"compfunc\";\n\t\t} else if (DUK_HOBJECT_IS_NATFUNC(h)) {\n\t\t\tsubtype = \"natfunc\";\n\t\t} else if (DUK_HOBJECT_IS_THREAD(h)) {\n\t\t\tsubtype = \"thread\";\n\t\t} else if (DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\t\tsubtype = \"bufobj\";\n\t\t} else if (DUK_HOBJECT_IS_ARRAY(h)) {\n\t\t\tsubtype = \"array\";\n\t\t}\n\t\tduk_fb_sprintf(fb, \"%sobject/%s %p%s\", (const char *) brace1, subtype, (void *) h, (const char *) brace2);\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < (duk_uint_fast32_t) st->loop_stack_index; i++) {\n\t\tif (st->loop_stack[i] == h) {\n\t\t\tduk_fb_sprintf(fb, \"%sLOOP:%p%s\", (const char *) brace1, (void *) h, (const char *) brace2);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/* after this, return paths should 'goto finished' for decrement */\n\tst->depth++;\n\n\tif (st->loop_stack_index >= st->loop_stack_limit) {\n\t\tduk_fb_sprintf(fb, \"%sOUT-OF-LOOP-STACK%s\", (const char *) brace1, (const char *) brace2);\n\t\tgoto finished;\n\t}\n\tst->loop_stack[st->loop_stack_index++] = h;\n\tpushed_loopstack = 1;\n\n\t/*\n\t *  Notation: double underscore used for internal properties which are not\n\t *  stored in the property allocation (e.g. '__valstack').\n\t */\n\n\tduk_fb_put_cstring(fb, brace1);\n\n\tif (DUK_HOBJECT_GET_PROPS(NULL, h)) {\n\t\tduk_uint32_t a_limit;\n\n\t\ta_limit = DUK_HOBJECT_GET_ASIZE(h);\n\t\tif (st->internal) {\n\t\t\t/* dump all allocated entries, unused entries print as 'unused',\n\t\t\t * note that these may extend beyond current 'length' and look\n\t\t\t * a bit funny.\n\t\t\t */\n\t\t} else {\n\t\t\t/* leave out trailing 'unused' elements */\n\t\t\twhile (a_limit > 0) {\n\t\t\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, a_limit - 1);\n\t\t\t\tif (!DUK_TVAL_IS_UNUSED(tv)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ta_limit--;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < a_limit; i++) {\n\t\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(NULL, h, i);\n\t\t\tDUK__COMMA();\n\t\t\tduk__print_tval(st, tv);\n\t\t}\n\t\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(h); i++) {\n\t\t\tkey = DUK_HOBJECT_E_GET_KEY(NULL, h, i);\n\t\t\tif (!key) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!st->internal && DUK_HSTRING_HAS_HIDDEN(key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tDUK__COMMA();\n\t\t\tduk__print_hstring(st, key, 0);\n\t\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COLON);\n\t\t\tif (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(NULL, h, i)) {\n\t\t\t\tduk_fb_sprintf(fb, \"[get:%p,set:%p]\",\n\t\t\t\t               (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.get,\n\t\t\t\t               (void *) DUK_HOBJECT_E_GET_VALUE(NULL, h, i).a.set);\n\t\t\t} else {\n\t\t\t\ttv = &DUK_HOBJECT_E_GET_VALUE(NULL, h, i).v;\n\t\t\t\tduk__print_tval(st, tv);\n\t\t\t}\n\t\t\tif (st->heavy) {\n\t\t\t\tduk_fb_sprintf(fb, \"<%02lx>\", (unsigned long) DUK_HOBJECT_E_GET_FLAGS(NULL, h, i));\n\t\t\t}\n\t\t}\n\t}\n\tif (st->internal) {\n\t\tif (DUK_HOBJECT_IS_ARRAY(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__array:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_EXTENSIBLE(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__extensible:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_CONSTRUCTABLE(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__constructable:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_BOUNDFUNC(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__boundfunc:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_COMPFUNC(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__compfunc:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_NATFUNC(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__natfunc:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_BUFOBJ(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__bufobj:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_IS_THREAD(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__thread:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_ARRAY_PART(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__array_part:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_STRICT(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__strict:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_NOTAIL(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__notail:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_NEWENV(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__newenv:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_NAMEBINDING(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__namebinding:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_CREATEARGS(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__createargs:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__exotic_array:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__exotic_stringobj:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__exotic_arguments:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__exotic_bufobj:true\");\n\t\t}\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(h)) {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__exotic_proxyobj:true\");\n\t\t}\n\t}\n\n\tif (st->internal && DUK_HOBJECT_IS_ARRAY(h)) {\n\t\tduk_harray *a = (duk_harray *) h;\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__length:%ld\", (long) a->length);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__length_nonwritable:%ld\", (long) a->length_nonwritable);\n\t} else if (st->internal && DUK_HOBJECT_IS_COMPFUNC(h)) {\n\t\tduk_hcompfunc *f = (duk_hcompfunc *) h;\n\t\tDUK__COMMA(); duk_fb_put_cstring(fb, \"__data:\");\n\t\tduk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f));\n\t\tDUK__COMMA(); duk_fb_put_cstring(fb, \"__lexenv:\"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_LEXENV(NULL, f));\n\t\tDUK__COMMA(); duk_fb_put_cstring(fb, \"__varenv:\"); duk__print_hobject(st, DUK_HCOMPFUNC_GET_VARENV(NULL, f));\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__nregs:%ld\", (long) f->nregs);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__nargs:%ld\", (long) f->nargs);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__start_line:%ld\", (long) f->start_line);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__end_line:%ld\", (long) f->end_line);\n#endif\n\t\tDUK__COMMA(); duk_fb_put_cstring(fb, \"__data:\");\n\t\tduk__print_hbuffer(st, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(NULL, f));\n\t} else if (st->internal && DUK_HOBJECT_IS_NATFUNC(h)) {\n\t\tduk_hnatfunc *f = (duk_hnatfunc *) h;\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__func:\");\n\t\tduk_fb_put_funcptr(fb, (duk_uint8_t *) &f->func, sizeof(f->func));\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__nargs:%ld\", (long) f->nargs);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__magic:%ld\", (long) f->magic);\n\t} else if (st->internal && DUK_HOBJECT_IS_DECENV(h)) {\n\t\tduk_hdecenv *e = (duk_hdecenv *) h;\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__thread:\"); duk__print_hobject(st, (duk_hobject *) e->thread);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__varmap:\"); duk__print_hobject(st, (duk_hobject *) e->varmap);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__regbase_byteoff:%ld\", (long) e->regbase_byteoff);\n\t} else if (st->internal && DUK_HOBJECT_IS_OBJENV(h)) {\n\t\tduk_hobjenv *e = (duk_hobjenv *) h;\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__target:\"); duk__print_hobject(st, (duk_hobject *) e->target);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__has_this:%ld\", (long) e->has_this);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t} else if (st->internal && DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\tduk_hbufobj *b = (duk_hbufobj *) h;\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__buf:\");\n\t\tduk__print_hbuffer(st, (duk_hbuffer *) b->buf);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__buf_prop:\");\n\t\tduk__print_hobject(st, (duk_hobject *) b->buf_prop);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__offset:%ld\", (long) b->offset);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__length:%ld\", (long) b->length);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__shift:%ld\", (long) b->shift);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__elemtype:%ld\", (long) b->elem_type);\n#endif\n\t} else if (st->internal && DUK_HOBJECT_IS_PROXY(h)) {\n\t\tduk_hproxy *p = (duk_hproxy *) h;\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__target:\");\n\t\tduk__print_hobject(st, p->target);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__handler:\");\n\t\tduk__print_hobject(st, p->handler);\n\t} else if (st->internal && DUK_HOBJECT_IS_THREAD(h)) {\n\t\tduk_hthread *t = (duk_hthread *) h;\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__ptr_curr_pc:%p\", (void *) t->ptr_curr_pc);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__heap:%p\", (void *) t->heap);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__strict:%ld\", (long) t->strict);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__state:%ld\", (long) t->state);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__unused1:%ld\", (long) t->unused1);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__unused2:%ld\", (long) t->unused2);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__valstack:%p\", (void *) t->valstack);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__valstack_end:%p/%ld\", (void *) t->valstack_end, (long) (t->valstack_end - t->valstack));\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__valstack_alloc_end:%p/%ld\", (void *) t->valstack_alloc_end, (long) (t->valstack_alloc_end - t->valstack));\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__valstack_bottom:%p/%ld\", (void *) t->valstack_bottom, (long) (t->valstack_bottom - t->valstack));\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__valstack_top:%p/%ld\", (void *) t->valstack_top, (long) (t->valstack_top - t->valstack));\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__callstack_curr:%p\", (void *) t->callstack_curr);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__callstack_top:%ld\", (long) t->callstack_top);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__callstack_preventcount:%ld\", (long) t->callstack_preventcount);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__resumer:\"); duk__print_hobject(st, (duk_hobject *) t->resumer);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__compile_ctx:%p\", (void *) t->compile_ctx);\n#if defined(DUK_USE_INTERRUPT_COUNTER)\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__interrupt_counter:%ld\", (long) t->interrupt_counter);\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__interrupt_init:%ld\", (long) t->interrupt_init);\n#endif\n\n\t\t/* XXX: print built-ins array? */\n\n\t}\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tif (st->internal) {\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__refcount:%lu\", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h));\n\t}\n#endif\n\tif (st->internal) {\n\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__class:%ld\", (long) DUK_HOBJECT_GET_CLASS_NUMBER(h));\n\t}\n\n\tDUK__COMMA(); duk_fb_sprintf(fb, \"__heapptr:%p\", (void *) h);  /* own pointer */\n\n\t/* prototype should be last, for readability */\n\tif (DUK_HOBJECT_GET_PROTOTYPE(NULL, h)) {\n\t\tif (st->follow_proto) {\n\t\t\tDUK__COMMA(); duk_fb_put_cstring(fb, \"__prototype:\"); duk__print_hobject(st, DUK_HOBJECT_GET_PROTOTYPE(NULL, h));\n\t\t} else {\n\t\t\tDUK__COMMA(); duk_fb_sprintf(fb, \"__prototype:%p\", (void *) DUK_HOBJECT_GET_PROTOTYPE(NULL, h));\n\t\t}\n\t}\n\n\tduk_fb_put_cstring(fb, brace2);\n\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tif (st->heavy && DUK_HOBJECT_GET_HSIZE(h) > 0) {\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE);\n\t\tfor (i = 0; i < DUK_HOBJECT_GET_HSIZE(h); i++) {\n\t\t\tduk_uint_t h_idx = DUK_HOBJECT_H_GET_INDEX(NULL, h, i);\n\t\t\tif (i > 0) {\n\t\t\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_COMMA);\n\t\t\t}\n\t\t\tif (h_idx == DUK_HOBJECT_HASHIDX_UNUSED) {\n\t\t\t\tduk_fb_sprintf(fb, \"u\");\n\t\t\t} else if (h_idx == DUK_HOBJECT_HASHIDX_DELETED) {\n\t\t\t\tduk_fb_sprintf(fb, \"d\");\n\t\t\t} else {\n\t\t\t\tduk_fb_sprintf(fb, \"%ld\", (long) h_idx);\n\t\t\t}\n\t\t}\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE);\n\t}\n#endif\n\n finished:\n\tst->depth--;\n\tif (pushed_loopstack) {\n\t\tst->loop_stack_index--;\n\t\tst->loop_stack[st->loop_stack_index] = NULL;\n\t}\n}\n\nDUK_LOCAL void duk__print_hbuffer(duk__dprint_state *st, duk_hbuffer *h) {\n\tduk_fixedbuffer *fb = st->fb;\n\tduk_size_t i, n;\n\tduk_uint8_t *p;\n\n\tif (duk_fb_is_full(fb)) {\n\t\treturn;\n\t}\n\n\t/* terminal type: no depth check */\n\n\tif (!h) {\n\t\tduk_fb_put_cstring(fb, \"NULL\");\n\t\treturn;\n\t}\n\n\tif (DUK_HBUFFER_HAS_DYNAMIC(h)) {\n\t\tif (DUK_HBUFFER_HAS_EXTERNAL(h)) {\n\t\t\tduk_hbuffer_external *g = (duk_hbuffer_external *) h;\n\t\t\tduk_fb_sprintf(fb, \"buffer:external:%p:%ld\",\n\t\t\t               (void *) DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(NULL, g),\n\t\t\t               (long) DUK_HBUFFER_EXTERNAL_GET_SIZE(g));\n\t\t} else {\n\t\t\tduk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h;\n\t\t\tduk_fb_sprintf(fb, \"buffer:dynamic:%p:%ld\",\n\t\t\t               (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(NULL, g),\n\t\t\t               (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(g));\n\t\t}\n\t} else {\n\t\tduk_fb_sprintf(fb, \"buffer:fixed:%ld\", (long) DUK_HBUFFER_GET_SIZE(h));\n\t}\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk_fb_sprintf(fb, \"/%lu\", (unsigned long) DUK_HEAPHDR_GET_REFCOUNT(&h->hdr));\n#endif\n\n\tif (st->hexdump) {\n\t\tduk_fb_sprintf(fb, \"=[\");\n\t\tn = DUK_HBUFFER_GET_SIZE(h);\n\t\tp = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(NULL, h);\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tduk_fb_sprintf(fb, \"%02lx\", (unsigned long) p[i]);\n\t\t}\n\t\tduk_fb_sprintf(fb, \"]\");\n\t}\n}\n\nDUK_LOCAL void duk__print_heaphdr(duk__dprint_state *st, duk_heaphdr *h) {\n\tduk_fixedbuffer *fb = st->fb;\n\n\tif (duk_fb_is_full(fb)) {\n\t\treturn;\n\t}\n\n\tif (!h) {\n\t\tduk_fb_put_cstring(fb, \"NULL\");\n\t\treturn;\n\t}\n\n\tswitch (DUK_HEAPHDR_GET_TYPE(h)) {\n\tcase DUK_HTYPE_STRING:\n\t\tduk__print_hstring(st, (duk_hstring *) h, 1);\n\t\tbreak;\n\tcase DUK_HTYPE_OBJECT:\n\t\tduk__print_hobject(st, (duk_hobject *) h);\n\t\tbreak;\n\tcase DUK_HTYPE_BUFFER:\n\t\tduk__print_hbuffer(st, (duk_hbuffer *) h);\n\t\tbreak;\n\tdefault:\n\t\tduk_fb_sprintf(fb, \"[unknown htype %ld]\", (long) DUK_HEAPHDR_GET_TYPE(h));\n\t\tbreak;\n\t}\n}\n\nDUK_LOCAL void duk__print_tval(duk__dprint_state *st, duk_tval *tv) {\n\tduk_fixedbuffer *fb = st->fb;\n\n\tif (duk_fb_is_full(fb)) {\n\t\treturn;\n\t}\n\n\t/* depth check is done when printing an actual type */\n\n\tif (st->heavy) {\n\t\tduk_fb_sprintf(fb, \"(%p)\", (void *) tv);\n\t}\n\n\tif (!tv) {\n\t\tduk_fb_put_cstring(fb, \"NULL\");\n\t\treturn;\n\t}\n\n\tif (st->binary) {\n\t\tduk_size_t i;\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LBRACKET);\n\t\tfor (i = 0; i < (duk_size_t) sizeof(*tv); i++) {\n\t\t\tduk_fb_sprintf(fb, \"%02lx\", (unsigned long) ((duk_uint8_t *)tv)[i]);\n\t\t}\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RBRACKET);\n\t}\n\n\tif (st->heavy) {\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_LANGLE);\n\t}\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED: {\n\t\tduk_fb_put_cstring(fb, \"undefined\");\n\t\tbreak;\n\t}\n\tcase DUK_TAG_UNUSED: {\n\t\tduk_fb_put_cstring(fb, \"unused\");\n\t\tbreak;\n\t}\n\tcase DUK_TAG_NULL: {\n\t\tduk_fb_put_cstring(fb, \"null\");\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tduk_fb_put_cstring(fb, DUK_TVAL_GET_BOOLEAN(tv) ? \"true\" : \"false\");\n\t\tbreak;\n\t}\n\tcase DUK_TAG_STRING: {\n\t\t/* Note: string is a terminal heap object, so no depth check here */\n\t\tduk__print_hstring(st, DUK_TVAL_GET_STRING(tv), 1);\n\t\tbreak;\n\t}\n\tcase DUK_TAG_OBJECT: {\n\t\tduk__print_hobject(st, DUK_TVAL_GET_OBJECT(tv));\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BUFFER: {\n\t\tduk__print_hbuffer(st, DUK_TVAL_GET_BUFFER(tv));\n\t\tbreak;\n\t}\n\tcase DUK_TAG_POINTER: {\n\t\tduk_fb_sprintf(fb, \"pointer:%p\", (void *) DUK_TVAL_GET_POINTER(tv));\n\t\tbreak;\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\tduk_c_function func;\n\t\tduk_small_uint_t lf_flags;\n\n\t\tDUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags);\n\t\tduk_fb_sprintf(fb, \"lightfunc:\");\n\t\tduk_fb_put_funcptr(fb, (duk_uint8_t *) &func, sizeof(func));\n\t\tduk_fb_sprintf(fb, \":%04lx\", (long) lf_flags);\n\t\tbreak;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\tduk_fb_sprintf(fb, \"%.18g_F\", (double) DUK_TVAL_GET_NUMBER(tv));\n\t\tbreak;\n#endif\n\tdefault: {\n\t\t/* IEEE double is approximately 16 decimal digits; print a couple extra */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\tduk_fb_sprintf(fb, \"%.18g\", (double) DUK_TVAL_GET_NUMBER(tv));\n\t\tbreak;\n\t}\n\t}\n\tif (st->heavy) {\n\t\tduk_fb_put_byte(fb, (duk_uint8_t) DUK_ASC_RANGLE);\n\t}\n}\n\nDUK_LOCAL void duk__print_instr(duk__dprint_state *st, duk_instr_t ins) {\n\tduk_fixedbuffer *fb = st->fb;\n\tduk_small_int_t op;\n\tconst char *op_name;\n\n\top = (duk_small_int_t) DUK_DEC_OP(ins);\n\top_name = duk__bc_optab[op];\n\n\t/* XXX: option to fix opcode length so it lines up nicely */\n\n\tif (op == DUK_OP_JUMP) {\n\t\tduk_int_t diff1 = (duk_int_t) (DUK_DEC_ABC(ins) - DUK_BC_JUMP_BIAS);  /* from next pc */\n\t\tduk_int_t diff2 = diff1 + 1;                                          /* from curr pc */\n\n\t\tduk_fb_sprintf(fb, \"%s %ld (to pc%c%ld)\",\n\t\t               (const char *) op_name, (long) diff1,\n\t\t               (int) (diff2 >= 0 ? '+' : '-'),  /* char format: use int */\n\t\t               (long) (diff2 >= 0 ? diff2 : -diff2));\n\t} else {\n\t\tduk_fb_sprintf(fb, \"%s %ld, %ld, %ld\",\n\t\t               (const char *) op_name, (long) DUK_DEC_A(ins),\n\t\t               (long) DUK_DEC_B(ins), (long) DUK_DEC_C(ins));\n\t}\n}\n\nDUK_LOCAL void duk__print_opcode(duk__dprint_state *st, duk_small_int_t opcode) {\n\tduk_fixedbuffer *fb = st->fb;\n\n\tif (opcode < DUK_BC_OP_MIN || opcode > DUK_BC_OP_MAX) {\n\t\tduk_fb_sprintf(fb, \"?(%ld)\", (long) opcode);\n\t} else {\n\t\tduk_fb_sprintf(fb, \"%s\", (const char *) duk__bc_optab[opcode]);\n\t}\n}\n\nDUK_INTERNAL duk_int_t duk_debug_vsnprintf(char *str, duk_size_t size, const char *format, va_list ap) {\n\tduk_fixedbuffer fb;\n\tconst char *p = format;\n\tconst char *p_end = p + DUK_STRLEN(format);\n\tduk_int_t retval;\n\n\tDUK_MEMZERO(&fb, sizeof(fb));\n\tfb.buffer = (duk_uint8_t *) str;\n\tfb.length = size;\n\tfb.offset = 0;\n\tfb.truncated = 0;\n\n\twhile (p < p_end) {\n\t\tchar ch = *p++;\n\t\tconst char *p_begfmt = NULL;\n\t\tduk_bool_t got_exclamation = 0;\n\t\tduk_bool_t got_long = 0;  /* %lf, %ld etc */\n\t\tduk__dprint_state st;\n\n\t\tif (ch != DUK_ASC_PERCENT) {\n\t\t\tduk_fb_put_byte(&fb, (duk_uint8_t) ch);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/*\n\t\t *  Format tag parsing.  Since we don't understand all the\n\t\t *  possible format tags allowed, we just scan for a terminating\n\t\t *  specifier and keep track of relevant modifiers that we do\n\t\t *  understand.  See man 3 printf.\n\t\t */\n\n\t\tDUK_MEMZERO(&st, sizeof(st));\n\t\tst.fb = &fb;\n\t\tst.depth = 0;\n\t\tst.depth_limit = 1;\n\t\tst.loop_stack_index = 0;\n\t\tst.loop_stack_limit = DUK__LOOP_STACK_DEPTH;\n\n\t\tp_begfmt = p - 1;\n\t\twhile (p < p_end) {\n\t\t\tch = *p++;\n\n\t\t\tif (ch == DUK_ASC_STAR) {\n\t\t\t\t/* unsupported: would consume multiple args */\n\t\t\t\tgoto format_error;\n\t\t\t} else if (ch == DUK_ASC_PERCENT) {\n\t\t\t\tduk_fb_put_byte(&fb, (duk_uint8_t) DUK_ASC_PERCENT);\n\t\t\t\tbreak;\n\t\t\t} else if (ch == DUK_ASC_EXCLAMATION) {\n\t\t\t\tgot_exclamation = 1;\n\t\t\t} else if (!got_exclamation && ch == DUK_ASC_LC_L) {\n\t\t\t\tgot_long = 1;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_LC_D) {\n\t\t\t\tst.depth_limit = DUK__DEEP_DEPTH_LIMIT;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_LC_P) {\n\t\t\t\tst.follow_proto = 1;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_LC_I) {\n\t\t\t\tst.internal = 1;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_LC_X) {\n\t\t\t\tst.hexdump = 1;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_LC_H) {\n\t\t\t\tst.heavy = 1;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_ATSIGN) {\n\t\t\t\tst.pointer = 1;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_HASH) {\n\t\t\t\tst.binary = 1;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_UC_T) {\n\t\t\t\tduk_tval *t = va_arg(ap, duk_tval *);\n\t\t\t\tif (st.pointer && !st.heavy) {\n\t\t\t\t\tduk_fb_sprintf(&fb, \"(%p)\", (void *) t);\n\t\t\t\t}\n\t\t\t\tduk__print_tval(&st, t);\n\t\t\t\tbreak;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_UC_O) {\n\t\t\t\tduk_heaphdr *t = va_arg(ap, duk_heaphdr *);\n\t\t\t\tif (st.pointer && !st.heavy) {\n\t\t\t\t\tduk_fb_sprintf(&fb, \"(%p)\", (void *) t);\n\t\t\t\t}\n\t\t\t\tduk__print_heaphdr(&st, t);\n\t\t\t\tbreak;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_UC_I) {\n\t\t\t\tduk_instr_t t = va_arg(ap, duk_instr_t);\n\t\t\t\tduk__print_instr(&st, t);\n\t\t\t\tbreak;\n\t\t\t} else if (got_exclamation && ch == DUK_ASC_UC_C) {\n\t\t\t\tlong t = va_arg(ap, long);\n\t\t\t\tduk__print_opcode(&st, (duk_small_int_t) t);\n\t\t\t\tbreak;\n\t\t\t} else if (!got_exclamation && strchr(DUK__ALLOWED_STANDARD_SPECIFIERS, (int) ch)) {\n\t\t\t\tchar fmtbuf[DUK__MAX_FORMAT_TAG_LENGTH];\n\t\t\t\tduk_size_t fmtlen;\n\n\t\t\t\tDUK_ASSERT(p >= p_begfmt);\n\t\t\t\tfmtlen = (duk_size_t) (p - p_begfmt);\n\t\t\t\tif (fmtlen >= sizeof(fmtbuf)) {\n\t\t\t\t\t/* format is too large, abort */\n\t\t\t\t\tgoto format_error;\n\t\t\t\t}\n\t\t\t\tDUK_MEMZERO(fmtbuf, sizeof(fmtbuf));\n\t\t\t\tDUK_MEMCPY(fmtbuf, p_begfmt, fmtlen);\n\n\t\t\t\t/* assume exactly 1 arg, which is why '*' is forbidden; arg size still\n\t\t\t\t * depends on type though.\n\t\t\t\t */\n\n\t\t\t\tif (ch == DUK_ASC_LC_F || ch == DUK_ASC_LC_G || ch == DUK_ASC_LC_E) {\n\t\t\t\t\t/* %f and %lf both consume a 'long' */\n\t\t\t\t\tdouble arg = va_arg(ap, double);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else if (ch == DUK_ASC_LC_D && got_long) {\n\t\t\t\t\t/* %ld */\n\t\t\t\t\tlong arg = va_arg(ap, long);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else if (ch == DUK_ASC_LC_D) {\n\t\t\t\t\t/* %d; only 16 bits are guaranteed */\n\t\t\t\t\tint arg = va_arg(ap, int);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else if (ch == DUK_ASC_LC_U && got_long) {\n\t\t\t\t\t/* %lu */\n\t\t\t\t\tunsigned long arg = va_arg(ap, unsigned long);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else if (ch == DUK_ASC_LC_U) {\n\t\t\t\t\t/* %u; only 16 bits are guaranteed */\n\t\t\t\t\tunsigned int arg = va_arg(ap, unsigned int);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else if (ch == DUK_ASC_LC_X && got_long) {\n\t\t\t\t\t/* %lx */\n\t\t\t\t\tunsigned long arg = va_arg(ap, unsigned long);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else if (ch == DUK_ASC_LC_X) {\n\t\t\t\t\t/* %x; only 16 bits are guaranteed */\n\t\t\t\t\tunsigned int arg = va_arg(ap, unsigned int);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else if (ch == DUK_ASC_LC_S) {\n\t\t\t\t\t/* %s */\n\t\t\t\t\tconst char *arg = va_arg(ap, const char *);\n\t\t\t\t\tif (arg == NULL) {\n\t\t\t\t\t\t/* '%s' and NULL is not portable, so special case\n\t\t\t\t\t\t * it for debug printing.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tduk_fb_sprintf(&fb, \"NULL\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t\t}\n\t\t\t\t} else if (ch == DUK_ASC_LC_P) {\n\t\t\t\t\t/* %p */\n\t\t\t\t\tvoid *arg = va_arg(ap, void *);\n\t\t\t\t\tif (arg == NULL) {\n\t\t\t\t\t\t/* '%p' and NULL is portable, but special case it\n\t\t\t\t\t\t * anyway to get a standard NULL marker in logs.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tduk_fb_sprintf(&fb, \"NULL\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t\t}\n\t\t\t\t} else if (ch == DUK_ASC_LC_C) {\n\t\t\t\t\t/* '%c', passed concretely as int */\n\t\t\t\t\tint arg = va_arg(ap, int);\n\t\t\t\t\tduk_fb_sprintf(&fb, fmtbuf, arg);\n\t\t\t\t} else {\n\t\t\t\t\t/* Should not happen. */\n\t\t\t\t\tduk_fb_sprintf(&fb, \"INVALID-FORMAT(%s)\", (const char *) fmtbuf);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t}\n\t}\n\tgoto done;\n\n format_error:\n\tduk_fb_put_cstring(&fb, \"FMTERR\");\n\t/* fall through */\n\n done:\n\tretval = (duk_int_t) fb.offset;\n\tduk_fb_put_byte(&fb, (duk_uint8_t) 0);\n\n\t/* return total chars written excluding terminator */\n\treturn retval;\n}\n\n#if 0  /*unused*/\nDUK_INTERNAL duk_int_t duk_debug_snprintf(char *str, duk_size_t size, const char *format, ...) {\n\tduk_int_t retval;\n\tva_list ap;\n\tva_start(ap, format);\n\tretval = duk_debug_vsnprintf(str, size, format, ap);\n\tva_end(ap);\n\treturn retval;\n}\n#endif\n\n/* Formatting function pointers is tricky: there is no standard pointer for\n * function pointers and the size of a function pointer may depend on the\n * specific pointer type.  This helper formats a function pointer based on\n * its memory layout to get something useful on most platforms.\n */\nDUK_INTERNAL void duk_debug_format_funcptr(char *buf, duk_size_t buf_size, duk_uint8_t *fptr, duk_size_t fptr_size) {\n\tduk_size_t i;\n\tduk_uint8_t *p = (duk_uint8_t *) buf;\n\tduk_uint8_t *p_end = (duk_uint8_t *) (buf + buf_size - 1);\n\n\tDUK_MEMZERO(buf, buf_size);\n\n\tfor (i = 0; i < fptr_size; i++) {\n\t\tduk_int_t left = (duk_int_t) (p_end - p);\n\t\tduk_uint8_t ch;\n\t\tif (left <= 0) {\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Quite approximate but should be useful for little and big endian. */\n#if defined(DUK_USE_INTEGER_BE)\n\t\tch = fptr[i];\n#else\n\t\tch = fptr[fptr_size - 1 - i];\n#endif\n\t\tp += DUK_SNPRINTF((char *) p, (duk_size_t) left, \"%02lx\", (unsigned long) ch);\n\t}\n}\n\n#endif  /* DUK_USE_DEBUG */\n\n/* automatic undefs */\n#undef DUK__ALLOWED_STANDARD_SPECIFIERS\n#undef DUK__COMMA\n#undef DUK__DEEP_DEPTH_LIMIT\n#undef DUK__LOOP_STACK_DEPTH\n#undef DUK__MAX_FORMAT_TAG_LENGTH\n#line 1 \"duk_debugger.c\"\n/*\n *  Duktape debugger\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\n/*\n *  Assert helpers\n */\n\n#if defined(DUK_USE_ASSERTIONS)\n#define DUK__DBG_TPORT_ENTER() do { \\\n\t\tDUK_ASSERT(heap->dbg_calling_transport == 0); \\\n\t\theap->dbg_calling_transport = 1; \\\n\t} while (0)\n#define DUK__DBG_TPORT_EXIT() do { \\\n\t\tDUK_ASSERT(heap->dbg_calling_transport == 1); \\\n\t\theap->dbg_calling_transport = 0; \\\n\t} while (0)\n#else\n#define DUK__DBG_TPORT_ENTER() do {} while (0)\n#define DUK__DBG_TPORT_EXIT() do {} while (0)\n#endif\n\n/*\n *  Helper structs\n */\n\ntypedef union {\n\tvoid *p;\n\tduk_uint_t b[1];\n\t/* Use b[] to access the size of the union, which is strictly not\n\t * correct.  Can't use fixed size unless there's feature detection\n\t * for pointer byte size.\n\t */\n} duk__ptr_union;\n\n/*\n *  Detach handling\n */\n\n#define DUK__SET_CONN_BROKEN(thr,reason) do { \\\n\t\t/* For now shared handler is fine. */ \\\n\t\tduk__debug_do_detach1((thr)->heap, (reason)); \\\n\t} while (0)\n\nDUK_LOCAL void duk__debug_do_detach1(duk_heap *heap, duk_int_t reason) {\n\t/* Can be called multiple times with no harm.  Mark the transport\n\t * bad (dbg_read_cb == NULL) and clear state except for the detached\n\t * callback and the udata field.  The detached callback is delayed\n\t * to the message loop so that it can be called between messages;\n\t * this avoids corner cases related to immediate debugger reattach\n\t * inside the detached callback.\n\t */\n\n\tif (heap->dbg_detaching) {\n\t\tDUK_D(DUK_DPRINT(\"debugger already detaching, ignore detach1\"));\n\t\treturn;\n\t}\n\n\tDUK_D(DUK_DPRINT(\"debugger transport detaching, marking transport broken\"));\n\n\theap->dbg_detaching = 1;  /* prevent multiple in-progress detaches */\n\n\tif (heap->dbg_write_cb != NULL) {\n\t\tduk_hthread *thr;\n\n\t\tthr = heap->heap_thread;\n\t\tDUK_ASSERT(thr != NULL);\n\n\t\tduk_debug_write_notify(thr, DUK_DBG_CMD_DETACHING);\n\t\tduk_debug_write_int(thr, reason);\n\t\tduk_debug_write_eom(thr);\n\t}\n\n\theap->dbg_read_cb = NULL;\n\theap->dbg_write_cb = NULL;\n\theap->dbg_peek_cb = NULL;\n\theap->dbg_read_flush_cb = NULL;\n\theap->dbg_write_flush_cb = NULL;\n\theap->dbg_request_cb = NULL;\n\t/* heap->dbg_detached_cb: keep */\n\t/* heap->dbg_udata: keep */\n\t/* heap->dbg_processing: keep on purpose to avoid debugger re-entry in detaching state */\n\theap->dbg_state_dirty = 0;\n\theap->dbg_force_restart = 0;\n\theap->dbg_pause_flags = 0;\n\theap->dbg_pause_act = NULL;\n\theap->dbg_pause_startline = 0;\n\theap->dbg_have_next_byte = 0;\n\tduk_debug_clear_paused(heap);  /* XXX: some overlap with field inits above */\n\theap->dbg_state_dirty = 0;     /* XXX: clear_paused sets dirty; rework? */\n\n\t/* Ensure there are no stale active breakpoint pointers.\n\t * Breakpoint list is currently kept - we could empty it\n\t * here but we'd need to handle refcounts correctly, and\n\t * we'd need a 'thr' reference for that.\n\t *\n\t * XXX: clear breakpoint on either attach or detach?\n\t */\n\theap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL;\n}\n\nDUK_LOCAL void duk__debug_do_detach2(duk_heap *heap) {\n\tduk_debug_detached_function detached_cb;\n\tvoid *detached_udata;\n\tduk_hthread *thr;\n\n\tthr = heap->heap_thread;\n\tif (thr == NULL) {\n\t\tDUK_ASSERT(heap->dbg_detached_cb == NULL);\n\t\treturn;\n\t}\n\n\t/* Safe to call multiple times. */\n\n\tdetached_cb = heap->dbg_detached_cb;\n\tdetached_udata = heap->dbg_udata;\n\theap->dbg_detached_cb = NULL;\n\theap->dbg_udata = NULL;\n\n\tif (detached_cb) {\n\t\t/* Careful here: state must be wiped before the call\n\t\t * so that we can cleanly handle a re-attach from\n\t\t * inside the callback.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"detached during message loop, delayed call to detached_cb\"));\n\t\tdetached_cb(thr, detached_udata);\n\t}\n\n\theap->dbg_detaching = 0;\n}\n\nDUK_INTERNAL void duk_debug_do_detach(duk_heap *heap) {\n\tduk__debug_do_detach1(heap, 0);\n\tduk__debug_do_detach2(heap);\n}\n\n/* Called on a read/write error: NULL all callbacks except the detached\n * callback so that we never accidentally call them after a read/write\n * error has been indicated.  This is especially important for the transport\n * I/O callbacks to fulfill guaranteed callback semantics.\n */\nDUK_LOCAL void duk__debug_null_most_callbacks(duk_hthread *thr) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT(thr != NULL);\n\n\theap = thr->heap;\n\tDUK_D(DUK_DPRINT(\"transport read/write error, NULL all callbacks expected detached\"));\n\theap->dbg_read_cb = NULL;\n\theap->dbg_write_cb = NULL;  /* this is especially critical to avoid another write call in detach1() */\n\theap->dbg_peek_cb = NULL;\n\theap->dbg_read_flush_cb = NULL;\n\theap->dbg_write_flush_cb = NULL;\n\theap->dbg_request_cb = NULL;\n\t/* keep heap->dbg_detached_cb */\n}\n\n/*\n *  Pause handling\n */\n\nDUK_LOCAL void duk__debug_set_pause_state(duk_hthread *thr, duk_heap *heap, duk_small_uint_t pause_flags) {\n\tduk_uint_fast32_t line;\n\n\tline = duk_debug_curr_line(thr);\n\tif (line == 0) {\n\t\t/* No line info for current function. */\n\t\tduk_small_uint_t updated_flags;\n\n\t\tupdated_flags = pause_flags & ~(DUK_PAUSE_FLAG_LINE_CHANGE);\n\t\tDUK_D(DUK_DPRINT(\"no line info for current activation, disable line-based pause flags: 0x%08lx -> 0x%08lx\",\n\t\t                 (long) pause_flags, (long) updated_flags));\n\t\tpause_flags = updated_flags;\n\t}\n\n\theap->dbg_pause_flags = pause_flags;\n\theap->dbg_pause_act = thr->callstack_curr;\n\theap->dbg_pause_startline = (duk_uint32_t) line;\n\theap->dbg_state_dirty = 1;\n\n\tDUK_D(DUK_DPRINT(\"set state for automatic pause triggers, flags=0x%08lx, act=%p, startline=%ld\",\n\t                 (long) heap->dbg_pause_flags, (void *) heap->dbg_pause_act,\n\t                 (long) heap->dbg_pause_startline));\n}\n\n/*\n *  Debug connection peek and flush primitives\n */\n\nDUK_INTERNAL duk_bool_t duk_debug_read_peek(duk_hthread *thr) {\n\tduk_heap *heap;\n\tduk_bool_t ret;\n\n\tDUK_ASSERT(thr != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tif (heap->dbg_read_cb == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"attempt to peek in detached state, return zero (= no data)\"));\n\t\treturn 0;\n\t}\n\tif (heap->dbg_peek_cb == NULL) {\n\t\tDUK_DD(DUK_DDPRINT(\"no peek callback, return zero (= no data)\"));\n\t\treturn 0;\n\t}\n\n\tDUK__DBG_TPORT_ENTER();\n\tret = (duk_bool_t) (heap->dbg_peek_cb(heap->dbg_udata) > 0);\n\tDUK__DBG_TPORT_EXIT();\n\treturn ret;\n}\n\nDUK_INTERNAL void duk_debug_read_flush(duk_hthread *thr) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT(thr != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tif (heap->dbg_read_cb == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"attempt to read flush in detached state, ignore\"));\n\t\treturn;\n\t}\n\tif (heap->dbg_read_flush_cb == NULL) {\n\t\tDUK_DD(DUK_DDPRINT(\"no read flush callback, ignore\"));\n\t\treturn;\n\t}\n\n\tDUK__DBG_TPORT_ENTER();\n\theap->dbg_read_flush_cb(heap->dbg_udata);\n\tDUK__DBG_TPORT_EXIT();\n}\n\nDUK_INTERNAL void duk_debug_write_flush(duk_hthread *thr) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT(thr != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tif (heap->dbg_read_cb == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"attempt to write flush in detached state, ignore\"));\n\t\treturn;\n\t}\n\tif (heap->dbg_write_flush_cb == NULL) {\n\t\tDUK_DD(DUK_DDPRINT(\"no write flush callback, ignore\"));\n\t\treturn;\n\t}\n\n\tDUK__DBG_TPORT_ENTER();\n\theap->dbg_write_flush_cb(heap->dbg_udata);\n\tDUK__DBG_TPORT_EXIT();\n}\n\n/*\n *  Debug connection skip primitives\n */\n\n/* Skip fully. */\nDUK_INTERNAL void duk_debug_skip_bytes(duk_hthread *thr, duk_size_t length) {\n\tduk_uint8_t dummy[64];\n\tduk_size_t now;\n\n\tDUK_ASSERT(thr != NULL);\n\n\twhile (length > 0) {\n\t\tnow = (length > sizeof(dummy) ? sizeof(dummy) : length);\n\t\tduk_debug_read_bytes(thr, dummy, now);\n\t\tlength -= now;\n\t}\n}\n\nDUK_INTERNAL void duk_debug_skip_byte(duk_hthread *thr) {\n\tDUK_ASSERT(thr != NULL);\n\n\t(void) duk_debug_read_byte(thr);\n}\n\n/*\n *  Debug connection read primitives\n */\n\n/* Peek ahead in the stream one byte. */\nDUK_INTERNAL uint8_t duk_debug_peek_byte(duk_hthread *thr) {\n\t/* It is important not to call this if the last byte read was an EOM.\n\t * Reading ahead in this scenario would cause unnecessary blocking if\n\t * another message is not available.\n\t */\n\n\tduk_uint8_t x;\n\n\tx = duk_debug_read_byte(thr);\n\tthr->heap->dbg_have_next_byte = 1;\n\tthr->heap->dbg_next_byte = x;\n\treturn x;\n}\n\n/* Read fully. */\nDUK_INTERNAL void duk_debug_read_bytes(duk_hthread *thr, duk_uint8_t *data, duk_size_t length) {\n\tduk_heap *heap;\n\tduk_uint8_t *p;\n\tduk_size_t left;\n\tduk_size_t got;\n\n\tDUK_ASSERT(thr != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tif (heap->dbg_read_cb == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"attempt to read %ld bytes in detached state, return zero data\", (long) length));\n\t\tgoto fail;\n\t}\n\n\t/* NOTE: length may be zero */\n\tp = data;\n\tif (length >= 1 && heap->dbg_have_next_byte) {\n\t\theap->dbg_have_next_byte = 0;\n\t\t*p++ = heap->dbg_next_byte;\n\t}\n\tfor (;;) {\n\t\tleft = (duk_size_t) ((data + length) - p);\n\t\tif (left == 0) {\n\t\t\tbreak;\n\t\t}\n\t\tDUK_ASSERT(heap->dbg_read_cb != NULL);\n\t\tDUK_ASSERT(left >= 1);\n#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE)\n\t\tleft = 1;\n#endif\n\t\tDUK__DBG_TPORT_ENTER();\n\t\tgot = heap->dbg_read_cb(heap->dbg_udata, (char *) p, left);\n\t\tDUK__DBG_TPORT_EXIT();\n\n\t\tif (got == 0 || got > left) {\n\t\t\tDUK_D(DUK_DPRINT(\"connection error during read, return zero data\"));\n\t\t\tduk__debug_null_most_callbacks(thr);  /* avoid calling write callback in detach1() */\n\t\t\tDUK__SET_CONN_BROKEN(thr, 1);\n\t\t\tgoto fail;\n\t\t}\n\t\tp += got;\n\t}\n\treturn;\n\n fail:\n\tDUK_MEMZERO((void *) data, (size_t) length);\n}\n\nDUK_INTERNAL duk_uint8_t duk_debug_read_byte(duk_hthread *thr) {\n\tduk_uint8_t x;\n\n\tx = 0;  /* just in case callback is broken and won't write 'x' */\n\tduk_debug_read_bytes(thr, &x, 1);\n\treturn x;\n}\n\nDUK_LOCAL duk_uint32_t duk__debug_read_uint32_raw(duk_hthread *thr) {\n\tduk_uint8_t buf[4];\n\n\tDUK_ASSERT(thr != NULL);\n\n\tduk_debug_read_bytes(thr, buf, 4);\n\treturn ((duk_uint32_t) buf[0] << 24) |\n\t       ((duk_uint32_t) buf[1] << 16) |\n\t       ((duk_uint32_t) buf[2] << 8) |\n\t       (duk_uint32_t) buf[3];\n}\n\nDUK_LOCAL duk_int32_t duk__debug_read_int32_raw(duk_hthread *thr) {\n\treturn (duk_int32_t) duk__debug_read_uint32_raw(thr);\n}\n\nDUK_LOCAL duk_uint16_t duk__debug_read_uint16_raw(duk_hthread *thr) {\n\tduk_uint8_t buf[2];\n\n\tDUK_ASSERT(thr != NULL);\n\n\tduk_debug_read_bytes(thr, buf, 2);\n\treturn ((duk_uint16_t) buf[0] << 8) |\n\t       (duk_uint16_t) buf[1];\n}\n\nDUK_INTERNAL duk_int32_t duk_debug_read_int(duk_hthread *thr) {\n\tduk_small_uint_t x;\n\tduk_small_uint_t t;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tx = duk_debug_read_byte(thr);\n\tif (x >= 0xc0) {\n\t\tt = duk_debug_read_byte(thr);\n\t\treturn (duk_int32_t) (((x - 0xc0) << 8) + t);\n\t} else if (x >= 0x80) {\n\t\treturn (duk_int32_t) (x - 0x80);\n\t} else if (x == DUK_DBG_IB_INT4) {\n\t\treturn (duk_int32_t) duk__debug_read_uint32_raw(thr);\n\t}\n\n\tDUK_D(DUK_DPRINT(\"debug connection error: failed to decode int\"));\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\treturn 0;\n}\n\nDUK_LOCAL duk_hstring *duk__debug_read_hstring_raw(duk_hthread *thr, duk_uint32_t len) {\n\tduk_uint8_t buf[31];\n\tduk_uint8_t *p;\n\n\tif (len <= sizeof(buf)) {\n\t\tduk_debug_read_bytes(thr, buf, (duk_size_t) len);\n\t\tduk_push_lstring(thr, (const char *) buf, (duk_size_t) len);\n\t} else {\n\t\tp = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len);  /* zero for paranoia */\n\t\tDUK_ASSERT(p != NULL);\n\t\tduk_debug_read_bytes(thr, p, (duk_size_t) len);\n\t\t(void) duk_buffer_to_string(thr, -1);  /* Safety relies on debug client, which is OK. */\n\t}\n\n\treturn duk_require_hstring(thr, -1);\n}\n\nDUK_INTERNAL duk_hstring *duk_debug_read_hstring(duk_hthread *thr) {\n\tduk_small_uint_t x;\n\tduk_uint32_t len;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tx = duk_debug_read_byte(thr);\n\tif (x >= 0x60 && x <= 0x7f) {\n\t\t/* For short strings, use a fixed temp buffer. */\n\t\tlen = (duk_uint32_t) (x - 0x60);\n\t} else if (x == DUK_DBG_IB_STR2) {\n\t\tlen = (duk_uint32_t) duk__debug_read_uint16_raw(thr);\n\t} else if (x == DUK_DBG_IB_STR4) {\n\t\tlen = (duk_uint32_t) duk__debug_read_uint32_raw(thr);\n\t} else {\n\t\tgoto fail;\n\t}\n\n\treturn duk__debug_read_hstring_raw(thr, len);\n\n fail:\n\tDUK_D(DUK_DPRINT(\"debug connection error: failed to decode int\"));\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\tduk_push_hstring_empty(thr);  /* always push some string */\n\treturn duk_require_hstring(thr, -1);\n}\n\nDUK_LOCAL duk_hbuffer *duk__debug_read_hbuffer_raw(duk_hthread *thr, duk_uint32_t len) {\n\tduk_uint8_t *p;\n\n\tp = (duk_uint8_t *) duk_push_fixed_buffer(thr, (duk_size_t) len);  /* zero for paranoia */\n\tDUK_ASSERT(p != NULL);\n\tduk_debug_read_bytes(thr, p, (duk_size_t) len);\n\n\treturn duk_require_hbuffer(thr, -1);\n}\n\nDUK_LOCAL void *duk__debug_read_pointer_raw(duk_hthread *thr) {\n\tduk_small_uint_t x;\n\tduk__ptr_union pu;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tx = duk_debug_read_byte(thr);\n\tif (x != sizeof(pu)) {\n\t\tgoto fail;\n\t}\n\tduk_debug_read_bytes(thr, (duk_uint8_t *) &pu.p, sizeof(pu));\n#if defined(DUK_USE_INTEGER_LE)\n\tduk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu));\n#endif\n\treturn (void *) pu.p;\n\n fail:\n\tDUK_D(DUK_DPRINT(\"debug connection error: failed to decode pointer\"));\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\treturn (void *) NULL;\n}\n\nDUK_LOCAL duk_double_t duk__debug_read_double_raw(duk_hthread *thr) {\n\tduk_double_union du;\n\n\tDUK_ASSERT(sizeof(du.uc) == 8);\n\tduk_debug_read_bytes(thr, (duk_uint8_t *) du.uc, sizeof(du.uc));\n\tDUK_DBLUNION_DOUBLE_NTOH(&du);\n\treturn du.d;\n}\n\n#if 0\nDUK_INTERNAL duk_heaphdr *duk_debug_read_heapptr(duk_hthread *thr) {\n\tduk_small_uint_t x;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tx = duk_debug_read_byte(thr);\n\tif (x != DUK_DBG_IB_HEAPPTR) {\n\t\tgoto fail;\n\t}\n\n\treturn (duk_heaphdr *) duk__debug_read_pointer_raw(thr);\n\n fail:\n\tDUK_D(DUK_DPRINT(\"debug connection error: failed to decode heapptr\"));\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\treturn NULL;\n}\n#endif\n\nDUK_INTERNAL duk_heaphdr *duk_debug_read_any_ptr(duk_hthread *thr) {\n\tduk_small_uint_t x;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tx = duk_debug_read_byte(thr);\n\tswitch (x) {\n\tcase DUK_DBG_IB_OBJECT:\n\tcase DUK_DBG_IB_POINTER:\n\tcase DUK_DBG_IB_HEAPPTR:\n\t\t/* Accept any pointer-like value; for 'object' dvalue, read\n\t\t * and ignore the class number.\n\t\t */\n\t\tif (x == DUK_DBG_IB_OBJECT) {\n\t\t\tduk_debug_skip_byte(thr);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\tgoto fail;\n\t}\n\n\treturn (duk_heaphdr *) duk__debug_read_pointer_raw(thr);\n\n fail:\n\tDUK_D(DUK_DPRINT(\"debug connection error: failed to decode any pointer (object, pointer, heapptr)\"));\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\treturn NULL;\n}\n\nDUK_INTERNAL duk_tval *duk_debug_read_tval(duk_hthread *thr) {\n\tduk_uint8_t x;\n\tduk_uint_t t;\n\tduk_uint32_t len;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tx = duk_debug_read_byte(thr);\n\n\tif (x >= 0xc0) {\n\t\tt = (duk_uint_t) (x - 0xc0);\n\t\tt = (t << 8) + duk_debug_read_byte(thr);\n\t\tduk_push_uint(thr, (duk_uint_t) t);\n\t\tgoto return_ptr;\n\t}\n\tif (x >= 0x80) {\n\t\tduk_push_uint(thr, (duk_uint_t) (x - 0x80));\n\t\tgoto return_ptr;\n\t}\n\tif (x >= 0x60) {\n\t\tlen = (duk_uint32_t) (x - 0x60);\n\t\tduk__debug_read_hstring_raw(thr, len);\n\t\tgoto return_ptr;\n\t}\n\n\tswitch (x) {\n\tcase DUK_DBG_IB_INT4: {\n\t\tduk_int32_t i = duk__debug_read_int32_raw(thr);\n\t\tduk_push_i32(thr, i);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_STR4: {\n\t\tlen = duk__debug_read_uint32_raw(thr);\n\t\tduk__debug_read_hstring_raw(thr, len);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_STR2: {\n\t\tlen = duk__debug_read_uint16_raw(thr);\n\t\tduk__debug_read_hstring_raw(thr, len);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_BUF4: {\n\t\tlen = duk__debug_read_uint32_raw(thr);\n\t\tduk__debug_read_hbuffer_raw(thr, len);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_BUF2: {\n\t\tlen = duk__debug_read_uint16_raw(thr);\n\t\tduk__debug_read_hbuffer_raw(thr, len);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_UNDEFINED: {\n\t\tduk_push_undefined(thr);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_NULL: {\n\t\tduk_push_null(thr);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_TRUE: {\n\t\tduk_push_true(thr);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_FALSE: {\n\t\tduk_push_false(thr);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_NUMBER: {\n\t\tduk_double_t d;\n\t\td = duk__debug_read_double_raw(thr);\n\t\tduk_push_number(thr, d);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_OBJECT: {\n\t\tduk_heaphdr *h;\n\t\tduk_debug_skip_byte(thr);\n\t\th = (duk_heaphdr *) duk__debug_read_pointer_raw(thr);\n\t\tduk_push_heapptr(thr, (void *) h);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_POINTER: {\n\t\tvoid *ptr;\n\t\tptr = duk__debug_read_pointer_raw(thr);\n\t\tduk_push_pointer(thr, ptr);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_LIGHTFUNC: {\n\t\t/* XXX: Not needed for now, so not implemented.  Note that\n\t\t * function pointers may have different size/layout than\n\t\t * a void pointer.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"reading lightfunc values unimplemented\"));\n\t\tgoto fail;\n\t}\n\tcase DUK_DBG_IB_HEAPPTR: {\n\t\tduk_heaphdr *h;\n\t\th = (duk_heaphdr *) duk__debug_read_pointer_raw(thr);\n\t\tduk_push_heapptr(thr, (void *) h);\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_UNUSED:  /* unused: not accepted in inbound messages */\n\tdefault:\n\t\tgoto fail;\n\t}\n\n return_ptr:\n\treturn DUK_GET_TVAL_NEGIDX(thr, -1);\n\n fail:\n\tDUK_D(DUK_DPRINT(\"debug connection error: failed to decode tval\"));\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\treturn NULL;\n}\n\n/*\n *  Debug connection write primitives\n */\n\n/* Write fully. */\nDUK_INTERNAL void duk_debug_write_bytes(duk_hthread *thr, const duk_uint8_t *data, duk_size_t length) {\n\tduk_heap *heap;\n\tconst duk_uint8_t *p;\n\tduk_size_t left;\n\tduk_size_t got;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(length == 0 || data != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tif (heap->dbg_write_cb == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"attempt to write %ld bytes in detached state, ignore\", (long) length));\n\t\treturn;\n\t}\n\tif (length == 0) {\n\t\t/* Avoid doing an actual write callback with length == 0,\n\t\t * because that's reserved for a write flush.\n\t\t */\n\t\treturn;\n\t}\n\tDUK_ASSERT(data != NULL);\n\n\tp = data;\n\tfor (;;) {\n\t\tleft = (duk_size_t) ((data + length) - p);\n\t\tif (left == 0) {\n\t\t\tbreak;\n\t\t}\n\t\tDUK_ASSERT(heap->dbg_write_cb != NULL);\n\t\tDUK_ASSERT(left >= 1);\n#if defined(DUK_USE_DEBUGGER_TRANSPORT_TORTURE)\n\t\tleft = 1;\n#endif\n\t\tDUK__DBG_TPORT_ENTER();\n\t\tgot = heap->dbg_write_cb(heap->dbg_udata, (const char *) p, left);\n\t\tDUK__DBG_TPORT_EXIT();\n\n\t\tif (got == 0 || got > left) {\n\t\t\tduk__debug_null_most_callbacks(thr);  /* avoid calling write callback in detach1() */\n\t\t\tDUK_D(DUK_DPRINT(\"connection error during write\"));\n\t\t\tDUK__SET_CONN_BROKEN(thr, 1);\n\t\t\treturn;\n\t\t}\n\t\tp += got;\n\t}\n}\n\nDUK_INTERNAL void duk_debug_write_byte(duk_hthread *thr, duk_uint8_t x) {\n\tduk_debug_write_bytes(thr, (const duk_uint8_t *) &x, 1);\n}\n\nDUK_INTERNAL void duk_debug_write_unused(duk_hthread *thr) {\n\tduk_debug_write_byte(thr, DUK_DBG_IB_UNUSED);\n}\n\nDUK_INTERNAL void duk_debug_write_undefined(duk_hthread *thr) {\n\tduk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED);\n}\n\n#if defined(DUK_USE_DEBUGGER_INSPECT)\nDUK_INTERNAL void duk_debug_write_null(duk_hthread *thr) {\n\tduk_debug_write_byte(thr, DUK_DBG_IB_NULL);\n}\n#endif\n\nDUK_INTERNAL void duk_debug_write_boolean(duk_hthread *thr, duk_uint_t val) {\n\tduk_debug_write_byte(thr, val ? DUK_DBG_IB_TRUE : DUK_DBG_IB_FALSE);\n}\n\n/* Write signed 32-bit integer. */\nDUK_INTERNAL void duk_debug_write_int(duk_hthread *thr, duk_int32_t x) {\n\tduk_uint8_t buf[5];\n\tduk_size_t len;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tif (x >= 0 && x <= 0x3fL) {\n\t\tbuf[0] = (duk_uint8_t) (0x80 + x);\n\t\tlen = 1;\n\t} else if (x >= 0 && x <= 0x3fffL) {\n\t\tbuf[0] = (duk_uint8_t) (0xc0 + (x >> 8));\n\t\tbuf[1] = (duk_uint8_t) (x & 0xff);\n\t\tlen = 2;\n\t} else {\n\t\t/* Signed integers always map to 4 bytes now. */\n\t\tbuf[0] = (duk_uint8_t) DUK_DBG_IB_INT4;\n\t\tbuf[1] = (duk_uint8_t) ((x >> 24) & 0xff);\n\t\tbuf[2] = (duk_uint8_t) ((x >> 16) & 0xff);\n\t\tbuf[3] = (duk_uint8_t) ((x >> 8) & 0xff);\n\t\tbuf[4] = (duk_uint8_t) (x & 0xff);\n\t\tlen = 5;\n\t}\n\tduk_debug_write_bytes(thr, buf, len);\n}\n\n/* Write unsigned 32-bit integer. */\nDUK_INTERNAL void duk_debug_write_uint(duk_hthread *thr, duk_uint32_t x) {\n\t/* The debugger protocol doesn't support a plain integer encoding for\n\t * the full 32-bit unsigned range (only 32-bit signed).  For now,\n\t * unsigned 32-bit values simply written as signed ones.  This is not\n\t * a concrete issue except for 32-bit heaphdr fields.  Proper solutions\n\t * would be to (a) write such integers as IEEE doubles or (b) add an\n\t * unsigned 32-bit dvalue.\n\t */\n\tif (x >= 0x80000000UL) {\n\t\tDUK_D(DUK_DPRINT(\"writing unsigned integer 0x%08lx as signed integer\",\n\t\t                 (long) x));\n\t}\n\tduk_debug_write_int(thr, (duk_int32_t) x);\n}\n\nDUK_INTERNAL void duk_debug_write_strbuf(duk_hthread *thr, const char *data, duk_size_t length, duk_uint8_t marker_base) {\n\tduk_uint8_t buf[5];\n\tduk_size_t buflen;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(length == 0 || data != NULL);\n\n\tif (length <= 0x1fUL && marker_base == DUK_DBG_IB_STR4) {\n\t\t/* For strings, special form for short lengths. */\n\t\tbuf[0] = (duk_uint8_t) (0x60 + length);\n\t\tbuflen = 1;\n\t} else if (length <= 0xffffUL) {\n\t\tbuf[0] = (duk_uint8_t) (marker_base + 1);\n\t\tbuf[1] = (duk_uint8_t) (length >> 8);\n\t\tbuf[2] = (duk_uint8_t) (length & 0xff);\n\t\tbuflen = 3;\n\t} else {\n\t\tbuf[0] = (duk_uint8_t) marker_base;\n\t\tbuf[1] = (duk_uint8_t) (length >> 24);\n\t\tbuf[2] = (duk_uint8_t) ((length >> 16) & 0xff);\n\t\tbuf[3] = (duk_uint8_t) ((length >> 8) & 0xff);\n\t\tbuf[4] = (duk_uint8_t) (length & 0xff);\n\t\tbuflen = 5;\n\t}\n\n\tduk_debug_write_bytes(thr, (const duk_uint8_t *) buf, buflen);\n\tduk_debug_write_bytes(thr, (const duk_uint8_t *) data, length);\n}\n\nDUK_INTERNAL void duk_debug_write_string(duk_hthread *thr, const char *data, duk_size_t length) {\n\tduk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_STR4);\n}\n\nDUK_INTERNAL void duk_debug_write_cstring(duk_hthread *thr, const char *data) {\n\tDUK_ASSERT(thr != NULL);\n\n\tduk_debug_write_string(thr,\n\t                       data,\n\t                       data ? DUK_STRLEN(data) : 0);\n}\n\nDUK_INTERNAL void duk_debug_write_hstring(duk_hthread *thr, duk_hstring *h) {\n\tDUK_ASSERT(thr != NULL);\n\n\t/* XXX: differentiate null pointer from empty string? */\n\tduk_debug_write_string(thr,\n\t                       (h != NULL ? (const char *) DUK_HSTRING_GET_DATA(h) : NULL),\n\t                       (h != NULL ? (duk_size_t) DUK_HSTRING_GET_BYTELEN(h) : 0));\n}\n\nDUK_LOCAL void duk__debug_write_hstring_safe_top(duk_hthread *thr) {\n\tduk_debug_write_hstring(thr, duk_safe_to_hstring(thr, -1));\n}\n\nDUK_INTERNAL void duk_debug_write_buffer(duk_hthread *thr, const char *data, duk_size_t length) {\n\tduk_debug_write_strbuf(thr, data, length, DUK_DBG_IB_BUF4);\n}\n\nDUK_INTERNAL void duk_debug_write_hbuffer(duk_hthread *thr, duk_hbuffer *h) {\n\tDUK_ASSERT(thr != NULL);\n\n\tduk_debug_write_buffer(thr,\n\t                       (h != NULL ? (const char *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h) : NULL),\n\t                       (h != NULL ? (duk_size_t) DUK_HBUFFER_GET_SIZE(h) : 0));\n}\n\nDUK_LOCAL void duk__debug_write_pointer_raw(duk_hthread *thr, void *ptr, duk_uint8_t ibyte) {\n\tduk_uint8_t buf[2];\n\tduk__ptr_union pu;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(sizeof(ptr) >= 1 && sizeof(ptr) <= 16);\n\t/* ptr may be NULL */\n\n\tbuf[0] = ibyte;\n\tbuf[1] = sizeof(pu);\n\tduk_debug_write_bytes(thr, buf, 2);\n\tpu.p = (void *) ptr;\n#if defined(DUK_USE_INTEGER_LE)\n\tduk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu));\n#endif\n\tduk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu));\n}\n\nDUK_INTERNAL void duk_debug_write_pointer(duk_hthread *thr, void *ptr) {\n\tduk__debug_write_pointer_raw(thr, ptr, DUK_DBG_IB_POINTER);\n}\n\n#if defined(DUK_USE_DEBUGGER_DUMPHEAP) || defined(DUK_USE_DEBUGGER_INSPECT)\nDUK_INTERNAL void duk_debug_write_heapptr(duk_hthread *thr, duk_heaphdr *h) {\n\tduk__debug_write_pointer_raw(thr, (void *) h, DUK_DBG_IB_HEAPPTR);\n}\n#endif  /* DUK_USE_DEBUGGER_DUMPHEAP || DUK_USE_DEBUGGER_INSPECT */\n\nDUK_INTERNAL void duk_debug_write_hobject(duk_hthread *thr, duk_hobject *obj) {\n\tduk_uint8_t buf[3];\n\tduk__ptr_union pu;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(sizeof(obj) >= 1 && sizeof(obj) <= 16);\n\tDUK_ASSERT(obj != NULL);\n\n\tbuf[0] = DUK_DBG_IB_OBJECT;\n\tbuf[1] = (duk_uint8_t) DUK_HOBJECT_GET_CLASS_NUMBER(obj);\n\tbuf[2] = sizeof(pu);\n\tduk_debug_write_bytes(thr, buf, 3);\n\tpu.p = (void *) obj;\n#if defined(DUK_USE_INTEGER_LE)\n\tduk_byteswap_bytes((duk_uint8_t *) pu.b, sizeof(pu));\n#endif\n\tduk_debug_write_bytes(thr, (const duk_uint8_t *) &pu.p, (duk_size_t) sizeof(pu));\n}\n\nDUK_INTERNAL void duk_debug_write_tval(duk_hthread *thr, duk_tval *tv) {\n\tduk_c_function lf_func;\n\tduk_small_uint_t lf_flags;\n\tduk_uint8_t buf[4];\n\tduk_double_union du1;\n\tduk_double_union du2;\n\tduk_int32_t i32;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED:\n\t\tduk_debug_write_byte(thr, DUK_DBG_IB_UNDEFINED);\n\t\tbreak;\n\tcase DUK_TAG_UNUSED:\n\t\tduk_debug_write_byte(thr, DUK_DBG_IB_UNUSED);\n\t\tbreak;\n\tcase DUK_TAG_NULL:\n\t\tduk_debug_write_byte(thr, DUK_DBG_IB_NULL);\n\t\tbreak;\n\tcase DUK_TAG_BOOLEAN:\n\t\tDUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 ||\n\t\t           DUK_TVAL_GET_BOOLEAN(tv) == 1);\n\t\tduk_debug_write_boolean(thr, DUK_TVAL_GET_BOOLEAN(tv));\n\t\tbreak;\n\tcase DUK_TAG_POINTER:\n\t\tduk_debug_write_pointer(thr, (void *) DUK_TVAL_GET_POINTER(tv));\n\t\tbreak;\n\tcase DUK_TAG_LIGHTFUNC:\n\t\tDUK_TVAL_GET_LIGHTFUNC(tv, lf_func, lf_flags);\n\t\tbuf[0] = DUK_DBG_IB_LIGHTFUNC;\n\t\tbuf[1] = (duk_uint8_t) (lf_flags >> 8);\n\t\tbuf[2] = (duk_uint8_t) (lf_flags & 0xff);\n\t\tbuf[3] = sizeof(lf_func);\n\t\tduk_debug_write_bytes(thr, buf, 4);\n\t\tduk_debug_write_bytes(thr, (const duk_uint8_t *) &lf_func, sizeof(lf_func));\n\t\tbreak;\n\tcase DUK_TAG_STRING:\n\t\tduk_debug_write_hstring(thr, DUK_TVAL_GET_STRING(tv));\n\t\tbreak;\n\tcase DUK_TAG_OBJECT:\n\t\tduk_debug_write_hobject(thr, DUK_TVAL_GET_OBJECT(tv));\n\t\tbreak;\n\tcase DUK_TAG_BUFFER:\n\t\tduk_debug_write_hbuffer(thr, DUK_TVAL_GET_BUFFER(tv));\n\t\tbreak;\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault:\n\t\t/* Numbers are normalized to big (network) endian.  We can\n\t\t * (but are not required) to use integer dvalues when there's\n\t\t * no loss of precision.\n\t\t *\n\t\t * XXX: share check with other code; this check is slow but\n\t\t * reliable and doesn't require careful exponent/mantissa\n\t\t * mask tricks as in the fastint downgrade code.\n\t\t */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\tdu1.d = DUK_TVAL_GET_NUMBER(tv);\n\t\ti32 = (duk_int32_t) du1.d;\n\t\tdu2.d = (duk_double_t) i32;\n\n\t\tDUK_DD(DUK_DDPRINT(\"i32=%ld du1=%02x%02x%02x%02x%02x%02x%02x%02x \"\n\t\t                   \"du2=%02x%02x%02x%02x%02x%02x%02x%02x\",\n\t\t                   (long) i32,\n\t\t                   (unsigned int) du1.uc[0], (unsigned int) du1.uc[1],\n\t\t                   (unsigned int) du1.uc[2], (unsigned int) du1.uc[3],\n\t\t                   (unsigned int) du1.uc[4], (unsigned int) du1.uc[5],\n\t\t                   (unsigned int) du1.uc[6], (unsigned int) du1.uc[7],\n\t\t                   (unsigned int) du2.uc[0], (unsigned int) du2.uc[1],\n\t\t                   (unsigned int) du2.uc[2], (unsigned int) du2.uc[3],\n\t\t                   (unsigned int) du2.uc[4], (unsigned int) du2.uc[5],\n\t\t                   (unsigned int) du2.uc[6], (unsigned int) du2.uc[7]));\n\n\t\tif (DUK_MEMCMP((const void *) du1.uc, (const void *) du2.uc, sizeof(du1.uc)) == 0) {\n\t\t\tduk_debug_write_int(thr, i32);\n\t\t} else {\n\t\t\tDUK_DBLUNION_DOUBLE_HTON(&du1);\n\t\t\tduk_debug_write_byte(thr, DUK_DBG_IB_NUMBER);\n\t\t\tduk_debug_write_bytes(thr, (const duk_uint8_t *) du1.uc, sizeof(du1.uc));\n\t\t}\n\t}\n}\n\n#if defined(DUK_USE_DEBUGGER_DUMPHEAP)\n/* Variant for writing duk_tvals so that any heap allocated values are\n * written out as tagged heap pointers.\n */\nDUK_LOCAL void duk__debug_write_tval_heapptr(duk_hthread *thr, duk_tval *tv) {\n\tif (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {\n\t\tduk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);\n\t\tduk_debug_write_heapptr(thr, h);\n\t} else {\n\t\tduk_debug_write_tval(thr, tv);\n\t}\n}\n#endif  /* DUK_USE_DEBUGGER_DUMPHEAP */\n\n/*\n *  Debug connection message write helpers\n */\n\n#if 0  /* unused */\nDUK_INTERNAL void duk_debug_write_request(duk_hthread *thr, duk_small_uint_t command) {\n\tduk_debug_write_byte(thr, DUK_DBG_IB_REQUEST);\n\tduk_debug_write_int(thr, command);\n}\n#endif\n\nDUK_INTERNAL void duk_debug_write_reply(duk_hthread *thr) {\n\tduk_debug_write_byte(thr, DUK_DBG_IB_REPLY);\n}\n\nDUK_INTERNAL void duk_debug_write_error_eom(duk_hthread *thr, duk_small_uint_t err_code, const char *msg) {\n\t/* Allow NULL 'msg' */\n\tduk_debug_write_byte(thr, DUK_DBG_IB_ERROR);\n\tduk_debug_write_int(thr, (duk_int32_t) err_code);\n\tduk_debug_write_cstring(thr, msg);\n\tduk_debug_write_eom(thr);\n}\n\nDUK_INTERNAL void duk_debug_write_notify(duk_hthread *thr, duk_small_uint_t command) {\n\tduk_debug_write_byte(thr, DUK_DBG_IB_NOTIFY);\n\tduk_debug_write_int(thr, (duk_int32_t) command);\n}\n\nDUK_INTERNAL void duk_debug_write_eom(duk_hthread *thr) {\n\tduk_debug_write_byte(thr, DUK_DBG_IB_EOM);\n\n\t/* As an initial implementation, write flush after every EOM (and the\n\t * version identifier).  A better implementation would flush only when\n\t * Duktape is finished processing messages so that a flush only happens\n\t * after all outbound messages are finished on that occasion.\n\t */\n\tduk_debug_write_flush(thr);\n}\n\n/*\n *  Status message and helpers\n */\n\nDUK_INTERNAL duk_uint_fast32_t duk_debug_curr_line(duk_hthread *thr) {\n\tduk_activation *act;\n\tduk_uint_fast32_t line;\n\tduk_uint_fast32_t pc;\n\n\tact = thr->callstack_curr;\n\tif (act == NULL) {\n\t\treturn 0;\n\t}\n\n\t/* We're conceptually between two opcodes; act->pc indicates the next\n\t * instruction to be executed.  This is usually the correct pc/line to\n\t * indicate in Status.  (For the 'debugger' statement this now reports\n\t * the pc/line after the debugger statement because the debugger opcode\n\t * has already been executed.)\n\t */\n\n\tpc = duk_hthread_get_act_curr_pc(thr, act);\n\n\t/* XXX: this should be optimized to be a raw query and avoid valstack\n\t * operations if possible.\n\t */\n\tduk_push_tval(thr, &act->tv_func);\n\tline = duk_hobject_pc2line_query(thr, -1, pc);\n\tduk_pop(thr);\n\treturn line;\n}\n\nDUK_INTERNAL void duk_debug_send_status(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tduk_debug_write_notify(thr, DUK_DBG_CMD_STATUS);\n\tduk_debug_write_int(thr, (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) ? 1 : 0));\n\n\tact = thr->callstack_curr;\n\tif (act == NULL) {\n\t\tduk_debug_write_undefined(thr);\n\t\tduk_debug_write_undefined(thr);\n\t\tduk_debug_write_int(thr, 0);\n\t\tduk_debug_write_int(thr, 0);\n\t} else {\n\t\tduk_push_tval(thr, &act->tv_func);\n\t\tduk_get_prop_string(thr, -1, \"fileName\");\n\t\tduk__debug_write_hstring_safe_top(thr);\n\t\tduk_get_prop_string(thr, -2, \"name\");\n\t\tduk__debug_write_hstring_safe_top(thr);\n\t\tduk_pop_3(thr);\n\t\t/* Report next pc/line to be executed. */\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) duk_debug_curr_line(thr));\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) duk_hthread_get_act_curr_pc(thr, act));\n\t}\n\n\tduk_debug_write_eom(thr);\n}\n\n#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)\nDUK_INTERNAL void duk_debug_send_throw(duk_hthread *thr, duk_bool_t fatal) {\n\t/*\n\t *  NFY <int: 5> <int: fatal> <str: msg> <str: filename> <int: linenumber> EOM\n\t */\n\n\tduk_activation *act;\n\tduk_uint32_t pc;\n\n\tDUK_ASSERT(thr->valstack_top > thr->valstack);  /* At least: ... [err] */\n\n\tduk_debug_write_notify(thr, DUK_DBG_CMD_THROW);\n\tduk_debug_write_int(thr, (duk_int32_t) fatal);\n\n\t/* Report thrown value to client coerced to string */\n\tduk_dup_top(thr);\n\tduk__debug_write_hstring_safe_top(thr);\n\tduk_pop(thr);\n\n\tif (duk_is_error(thr, -1)) {\n\t\t/* Error instance, use augmented error data directly */\n\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME);\n\t\tduk__debug_write_hstring_safe_top(thr);\n\t\tduk_get_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER);\n\t\tduk_debug_write_uint(thr, duk_get_uint(thr, -1));\n\t\tduk_pop_2(thr);\n\t} else {\n\t\t/* For anything other than an Error instance, we calculate the\n\t\t * error location directly from the current activation if one\n\t\t * exists.\n\t\t */\n\t\tact = thr->callstack_curr;\n\t\tif (act != NULL) {\n\t\t\tduk_push_tval(thr, &act->tv_func);\n\t\t\tduk_get_prop_string(thr, -1, \"fileName\");\n\t\t\tduk__debug_write_hstring_safe_top(thr);\n\t\t\tpc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr, act);\n\t\t\tduk_debug_write_uint(thr, (duk_uint32_t) duk_hobject_pc2line_query(thr, -2, pc));\n\t\t\tduk_pop_2(thr);\n\t\t} else {\n\t\t\t/* Can happen if duk_throw() is called on an empty\n\t\t\t * callstack.\n\t\t\t */\n\t\t\tduk_debug_write_cstring(thr, \"\");\n\t\t\tduk_debug_write_uint(thr, 0);\n\t\t}\n\t}\n\n\tduk_debug_write_eom(thr);\n}\n#endif  /* DUK_USE_DEBUGGER_THROW_NOTIFY */\n\n/*\n *  Debug message processing\n */\n\n/* Skip dvalue. */\nDUK_LOCAL duk_bool_t duk__debug_skip_dvalue(duk_hthread *thr) {\n\tduk_uint8_t x;\n\tduk_uint32_t len;\n\n\tx = duk_debug_read_byte(thr);\n\n\tif (x >= 0xc0) {\n\t\tduk_debug_skip_byte(thr);\n\t\treturn 0;\n\t}\n\tif (x >= 0x80) {\n\t\treturn 0;\n\t}\n\tif (x >= 0x60) {\n\t\tduk_debug_skip_bytes(thr, (duk_size_t) (x - 0x60));\n\t\treturn 0;\n\t}\n\tswitch(x) {\n\tcase DUK_DBG_IB_EOM:\n\t\treturn 1;  /* Return 1: got EOM */\n\tcase DUK_DBG_IB_REQUEST:\n\tcase DUK_DBG_IB_REPLY:\n\tcase DUK_DBG_IB_ERROR:\n\tcase DUK_DBG_IB_NOTIFY:\n\t\tbreak;\n\tcase DUK_DBG_IB_INT4:\n\t\t(void) duk__debug_read_uint32_raw(thr);\n\t\tbreak;\n\tcase DUK_DBG_IB_STR4:\n\tcase DUK_DBG_IB_BUF4:\n\t\tlen = duk__debug_read_uint32_raw(thr);\n\t\tduk_debug_skip_bytes(thr, len);\n\t\tbreak;\n\tcase DUK_DBG_IB_STR2:\n\tcase DUK_DBG_IB_BUF2:\n\t\tlen = duk__debug_read_uint16_raw(thr);\n\t\tduk_debug_skip_bytes(thr, len);\n\t\tbreak;\n\tcase DUK_DBG_IB_UNUSED:\n\tcase DUK_DBG_IB_UNDEFINED:\n\tcase DUK_DBG_IB_NULL:\n\tcase DUK_DBG_IB_TRUE:\n\tcase DUK_DBG_IB_FALSE:\n\t\tbreak;\n\tcase DUK_DBG_IB_NUMBER:\n\t\tduk_debug_skip_bytes(thr, 8);\n\t\tbreak;\n\tcase DUK_DBG_IB_OBJECT:\n\t\tduk_debug_skip_byte(thr);\n\t\tlen = duk_debug_read_byte(thr);\n\t\tduk_debug_skip_bytes(thr, len);\n\t\tbreak;\n\tcase DUK_DBG_IB_POINTER:\n\tcase DUK_DBG_IB_HEAPPTR:\n\t\tlen = duk_debug_read_byte(thr);\n\t\tduk_debug_skip_bytes(thr, len);\n\t\tbreak;\n\tcase DUK_DBG_IB_LIGHTFUNC:\n\t\tduk_debug_skip_bytes(thr, 2);\n\t\tlen = duk_debug_read_byte(thr);\n\t\tduk_debug_skip_bytes(thr, len);\n\t\tbreak;\n\tdefault:\n\t\tgoto fail;\n\t}\n\n\treturn 0;\n\n fail:\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\treturn 1;  /* Pretend like we got EOM */\n}\n\n/* Skip dvalues to EOM. */\nDUK_LOCAL void duk__debug_skip_to_eom(duk_hthread *thr) {\n\tfor (;;) {\n\t\tif (duk__debug_skip_dvalue(thr)) {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/* Read and validate a call stack index.  If index is invalid, write out an\n * error message and return zero.\n */\nDUK_LOCAL duk_int32_t duk__debug_read_validate_csindex(duk_hthread *thr) {\n\tduk_int32_t level;\n\tlevel = duk_debug_read_int(thr);\n\tif (level >= 0 || -level > (duk_int32_t) thr->callstack_top) {\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, \"invalid callstack index\");\n\t\treturn 0;  /* zero indicates failure */\n\t}\n\treturn level;\n}\n\n/* Read a call stack index and lookup the corresponding duk_activation.\n * If index is invalid, write out an error message and return NULL.\n */\nDUK_LOCAL duk_activation *duk__debug_read_level_get_activation(duk_hthread *thr) {\n\tduk_activation *act;\n\tduk_int32_t level;\n\n\tlevel = duk_debug_read_int(thr);\n\tact = duk_hthread_get_activation_for_level(thr, level);\n\tif (act == NULL) {\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, \"invalid callstack index\");\n\t}\n\treturn act;\n}\n\n/*\n *  Simple commands\n */\n\nDUK_LOCAL void duk__debug_handle_basic_info(duk_hthread *thr, duk_heap *heap) {\n\tDUK_UNREF(heap);\n\tDUK_D(DUK_DPRINT(\"debug command Version\"));\n\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_int(thr, DUK_VERSION);\n\tduk_debug_write_cstring(thr, DUK_GIT_DESCRIBE);\n\tduk_debug_write_cstring(thr, DUK_USE_TARGET_INFO);\n#if defined(DUK_USE_DOUBLE_LE)\n\tduk_debug_write_int(thr, 1);\n#elif defined(DUK_USE_DOUBLE_ME)\n\tduk_debug_write_int(thr, 2);\n#elif defined(DUK_USE_DOUBLE_BE)\n\tduk_debug_write_int(thr, 3);\n#else\n\tduk_debug_write_int(thr, 0);\n#endif\n\tduk_debug_write_int(thr, (duk_int_t) sizeof(void *));\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_trigger_status(duk_hthread *thr, duk_heap *heap) {\n\tDUK_UNREF(heap);\n\tDUK_D(DUK_DPRINT(\"debug command TriggerStatus\"));\n\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_eom(thr);\n\theap->dbg_state_dirty = 1;\n}\n\nDUK_LOCAL void duk__debug_handle_pause(duk_hthread *thr, duk_heap *heap) {\n\tDUK_D(DUK_DPRINT(\"debug command Pause\"));\n\tduk_debug_set_paused(heap);\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_resume(duk_hthread *thr, duk_heap *heap) {\n\tduk_small_uint_t pause_flags;\n\n\tDUK_D(DUK_DPRINT(\"debug command Resume\"));\n\n\tduk_debug_clear_paused(heap);\n\n\tpause_flags = 0;\n#if 0  /* manual testing */\n\tpause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE;\n\tpause_flags |= DUK_PAUSE_FLAG_CAUGHT_ERROR;\n\tpause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR;\n#endif\n#if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT)\n\tpause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR;\n#endif\n\n\tduk__debug_set_pause_state(thr, heap, pause_flags);\n\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_step(duk_hthread *thr, duk_heap *heap, duk_int32_t cmd) {\n\tduk_small_uint_t pause_flags;\n\n\tDUK_D(DUK_DPRINT(\"debug command StepInto/StepOver/StepOut: %d\", (int) cmd));\n\n\tif (cmd == DUK_DBG_CMD_STEPINTO) {\n\t\tpause_flags = DUK_PAUSE_FLAG_LINE_CHANGE |\n\t\t              DUK_PAUSE_FLAG_FUNC_ENTRY |\n\t\t              DUK_PAUSE_FLAG_FUNC_EXIT;\n\t} else if (cmd == DUK_DBG_CMD_STEPOVER) {\n\t\tpause_flags = DUK_PAUSE_FLAG_LINE_CHANGE |\n\t\t              DUK_PAUSE_FLAG_FUNC_EXIT;\n\t} else {\n\t\tDUK_ASSERT(cmd == DUK_DBG_CMD_STEPOUT);\n\t\tpause_flags = DUK_PAUSE_FLAG_FUNC_EXIT;\n\t}\n#if defined(DUK_USE_DEBUGGER_PAUSE_UNCAUGHT)\n\tpause_flags |= DUK_PAUSE_FLAG_UNCAUGHT_ERROR;\n#endif\n\n\t/* If current activation doesn't have line information, line-based\n\t * pause flags are automatically disabled.  As a result, e.g.\n\t * StepInto will then pause on (native) function entry or exit.\n\t */\n\tduk_debug_clear_paused(heap);\n\tduk__debug_set_pause_state(thr, heap, pause_flags);\n\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_list_break(duk_hthread *thr, duk_heap *heap) {\n\tduk_small_int_t i;\n\n\tDUK_D(DUK_DPRINT(\"debug command ListBreak\"));\n\tduk_debug_write_reply(thr);\n\tfor (i = 0; i < (duk_small_int_t) heap->dbg_breakpoint_count; i++) {\n\t\tduk_debug_write_hstring(thr, heap->dbg_breakpoints[i].filename);\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) heap->dbg_breakpoints[i].line);\n\t}\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_add_break(duk_hthread *thr, duk_heap *heap) {\n\tduk_hstring *filename;\n\tduk_uint32_t linenumber;\n\tduk_small_int_t idx;\n\n\tDUK_UNREF(heap);\n\n\tfilename = duk_debug_read_hstring(thr);\n\tlinenumber = (duk_uint32_t) duk_debug_read_int(thr);\n\tDUK_D(DUK_DPRINT(\"debug command AddBreak: %!O:%ld\", (duk_hobject *) filename, (long) linenumber));\n\tidx = duk_debug_add_breakpoint(thr, filename, linenumber);\n\tif (idx >= 0) {\n\t\tduk_debug_write_reply(thr);\n\t\tduk_debug_write_int(thr, (duk_int32_t) idx);\n\t\tduk_debug_write_eom(thr);\n\t} else {\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_TOOMANY, \"no space for breakpoint\");\n\t}\n}\n\nDUK_LOCAL void duk__debug_handle_del_break(duk_hthread *thr, duk_heap *heap) {\n\tduk_small_uint_t idx;\n\n\tDUK_UNREF(heap);\n\n\tDUK_D(DUK_DPRINT(\"debug command DelBreak\"));\n\tidx = (duk_small_uint_t) duk_debug_read_int(thr);\n\tif (duk_debug_remove_breakpoint(thr, idx)) {\n\t\tduk_debug_write_reply(thr);\n\t\tduk_debug_write_eom(thr);\n\t} else {\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, \"invalid breakpoint index\");\n\t}\n}\n\nDUK_LOCAL void duk__debug_handle_get_var(duk_hthread *thr, duk_heap *heap) {\n\tduk_activation *act;\n\tduk_hstring *str;\n\tduk_bool_t rc;\n\n\tDUK_UNREF(heap);\n\tDUK_D(DUK_DPRINT(\"debug command GetVar\"));\n\n\tact = duk__debug_read_level_get_activation(thr);\n\tif (act == NULL) {\n\t\treturn;\n\t}\n\tstr = duk_debug_read_hstring(thr);  /* push to stack */\n\tDUK_ASSERT(str != NULL);\n\n\trc = duk_js_getvar_activation(thr, act, str, 0);\n\n\tduk_debug_write_reply(thr);\n\tif (rc) {\n\t\tduk_debug_write_int(thr, 1);\n\t\tDUK_ASSERT(duk_get_tval(thr, -2) != NULL);\n\t\tduk_debug_write_tval(thr, duk_get_tval(thr, -2));\n\t} else {\n\t\tduk_debug_write_int(thr, 0);\n\t\tduk_debug_write_unused(thr);\n\t}\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_put_var(duk_hthread *thr, duk_heap *heap) {\n\tduk_activation *act;\n\tduk_hstring *str;\n\tduk_tval *tv;\n\n\tDUK_UNREF(heap);\n\tDUK_D(DUK_DPRINT(\"debug command PutVar\"));\n\n\tact = duk__debug_read_level_get_activation(thr);\n\tif (act == NULL) {\n\t\treturn;\n\t}\n\tstr = duk_debug_read_hstring(thr);  /* push to stack */\n\tDUK_ASSERT(str != NULL);\n\ttv = duk_debug_read_tval(thr);\n\tif (tv == NULL) {\n\t\t/* detached */\n\t\treturn;\n\t}\n\n\tduk_js_putvar_activation(thr, act, str, tv, 0);\n\n\t/* XXX: Current putvar implementation doesn't have a success flag,\n\t * add one and send to debug client?\n\t */\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_get_call_stack(duk_hthread *thr, duk_heap *heap) {\n\tduk_hthread *curr_thr = thr;\n\tduk_activation *curr_act;\n\tduk_uint_fast32_t pc;\n\tduk_uint_fast32_t line;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_UNREF(heap);\n\n\tduk_debug_write_reply(thr);\n\twhile (curr_thr != NULL) {\n\t\tfor (curr_act = curr_thr->callstack_curr; curr_act != NULL; curr_act = curr_act->parent) {\n\t\t\t/* PC/line semantics here are:\n\t\t\t *   - For callstack top we're conceptually between two\n\t\t\t *     opcodes and current PC indicates next line to\n\t\t\t *     execute, so report that (matches Status).\n\t\t\t *   - For other activations we're conceptually still\n\t\t\t *     executing the instruction at PC-1, so report that\n\t\t\t *     (matches error stacktrace behavior).\n\t\t\t *   - See: https://github.com/svaarala/duktape/issues/281\n\t\t\t */\n\n\t\t\t/* XXX: optimize to use direct reads, i.e. avoid\n\t\t\t * value stack operations.\n\t\t\t */\n\t\t\tduk_push_tval(thr, &curr_act->tv_func);\n\t\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME);\n\t\t\tduk__debug_write_hstring_safe_top(thr);\n\t\t\tduk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME);\n\t\t\tduk__debug_write_hstring_safe_top(thr);\n\t\t\tpc = duk_hthread_get_act_curr_pc(thr, curr_act);\n\t\t\tif (curr_act != curr_thr->callstack_curr && pc > 0) {\n\t\t\t\tpc--;\n\t\t\t}\n\t\t\tline = duk_hobject_pc2line_query(thr, -3, pc);\n\t\t\tduk_debug_write_uint(thr, (duk_uint32_t) line);\n\t\t\tduk_debug_write_uint(thr, (duk_uint32_t) pc);\n\t\t\tduk_pop_3(thr);\n\t\t}\n\t\tcurr_thr = curr_thr->resumer;\n\t}\n\t/* SCANBUILD: warning about 'thr' potentially being NULL here,\n\t * warning is incorrect because thr != NULL always here.\n\t */\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_get_locals(duk_hthread *thr, duk_heap *heap) {\n\tduk_activation *act;\n\tduk_hstring *varname;\n\n\tDUK_UNREF(heap);\n\n\tact = duk__debug_read_level_get_activation(thr);\n\tif (act == NULL) {\n\t\treturn;\n\t}\n\n\tduk_debug_write_reply(thr);\n\n\t/* XXX: several nice-to-have improvements here:\n\t *   - Use direct reads avoiding value stack operations\n\t *   - Avoid triggering getters, indicate getter values to debug client\n\t *   - If side effects are possible, add error catching\n\t */\n\n\tduk_push_tval(thr, &act->tv_func);\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_VARMAP);\n\tif (duk_is_object(thr, -1)) {\n\t\tduk_enum(thr, -1, 0 /*enum_flags*/);\n\t\twhile (duk_next(thr, -1 /*enum_index*/, 0 /*get_value*/)) {\n\t\t\tvarname = duk_known_hstring(thr, -1);\n\n\t\t\tduk_js_getvar_activation(thr, act, varname, 0 /*throw_flag*/);\n\t\t\t/* [ ... func varmap enum key value this ] */\n\t\t\tduk_debug_write_hstring(thr, duk_get_hstring(thr, -3));\n\t\t\tduk_debug_write_tval(thr, duk_get_tval(thr, -2));\n\t\t\tduk_pop_3(thr);  /* -> [ ... func varmap enum ] */\n\t\t}\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"varmap is not an object in GetLocals, ignore\"));\n\t}\n\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_eval(duk_hthread *thr, duk_heap *heap) {\n\tduk_small_uint_t call_flags;\n\tduk_int_t call_ret;\n\tduk_small_int_t eval_err;\n\tduk_bool_t direct_eval;\n\tduk_int32_t level;\n\tduk_idx_t idx_func;\n\n\tDUK_UNREF(heap);\n\n\tDUK_D(DUK_DPRINT(\"debug command Eval\"));\n\n\t/* The eval code is executed within the lexical environment of a specified\n\t * activation.  For now, use global object eval() function, with the eval\n\t * considered a 'direct call to eval'.\n\t *\n\t * Callstack index for debug commands only affects scope -- the callstack\n\t * as seen by, e.g. Duktape.act() will be the same regardless.\n\t */\n\n\t/* nargs == 2 so we can pass a callstack index to eval(). */\n\tidx_func = duk_get_top(thr);\n\tduk_push_c_function(thr, duk_bi_global_object_eval, 2 /*nargs*/);\n\tduk_push_undefined(thr);  /* 'this' binding shouldn't matter here */\n\n\t/* Read callstack index, if non-null. */\n\tif (duk_debug_peek_byte(thr) == DUK_DBG_IB_NULL) {\n\t\tdirect_eval = 0;\n\t\tlevel = -1;  /* Not needed, but silences warning. */\n\t\t(void) duk_debug_read_byte(thr);\n\t} else {\n\t\tdirect_eval = 1;\n\t\tlevel = duk__debug_read_validate_csindex(thr);\n\t\tif (level == 0) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\tDUK_ASSERT(!direct_eval ||\n\t           (level < 0 && -level <= (duk_int32_t) thr->callstack_top));\n\n\t(void) duk_debug_read_hstring(thr);\n\tif (direct_eval) {\n\t\tduk_push_int(thr, level - 1);  /* compensate for eval() call */\n\t}\n\n\t/* [ ... eval \"eval\" eval_input level? ] */\n\n\tcall_flags = 0;\n\tif (direct_eval) {\n\t\tduk_activation *act;\n\t\tduk_hobject *fun;\n\n\t\tact = duk_hthread_get_activation_for_level(thr, level);\n\t\tif (act != NULL) {\n\t\t\tfun = DUK_ACT_GET_FUNC(act);\n\t\t\tif (fun != NULL && DUK_HOBJECT_IS_COMPFUNC(fun)) {\n\t\t\t\t/* Direct eval requires that there's a current\n\t\t\t\t * activation and it is an Ecmascript function.\n\t\t\t\t * When Eval is executed from e.g. cooperate API\n\t\t\t\t * call we'll need to do an indirect eval instead.\n\t\t\t\t */\n\t\t\t\tcall_flags |= DUK_CALL_FLAG_DIRECT_EVAL;\n\t\t\t}\n\t\t}\n\t}\n\n\tcall_ret = duk_pcall_method_flags(thr, duk_get_top(thr) - (idx_func + 2), call_flags);\n\n\tif (call_ret == DUK_EXEC_SUCCESS) {\n\t\teval_err = 0;\n\t\t/* Use result value as is. */\n\t} else {\n\t\t/* For errors a string coerced result is most informative\n\t\t * right now, as the debug client doesn't have the capability\n\t\t * to traverse the error object.\n\t\t */\n\t\teval_err = 1;\n\t\tduk_safe_to_string(thr, -1);\n\t}\n\n\t/* [ ... result ] */\n\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_int(thr, (duk_int32_t) eval_err);\n\tDUK_ASSERT(duk_get_tval(thr, -1) != NULL);\n\tduk_debug_write_tval(thr, duk_get_tval(thr, -1));\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_detach(duk_hthread *thr, duk_heap *heap) {\n\tDUK_UNREF(heap);\n\tDUK_D(DUK_DPRINT(\"debug command Detach\"));\n\n\tduk_debug_write_reply(thr);\n\tduk_debug_write_eom(thr);\n\n\tDUK_D(DUK_DPRINT(\"debug connection detached, mark broken\"));\n\tDUK__SET_CONN_BROKEN(thr, 0);  /* not an error */\n}\n\nDUK_LOCAL void duk__debug_handle_apprequest(duk_hthread *thr, duk_heap *heap) {\n\tduk_idx_t old_top;\n\n\tDUK_D(DUK_DPRINT(\"debug command AppRequest\"));\n\n\told_top = duk_get_top(thr);  /* save stack top */\n\n\tif (heap->dbg_request_cb != NULL) {\n\t\tduk_idx_t nrets;\n\t\tduk_idx_t nvalues = 0;\n\t\tduk_idx_t top, idx;\n\n\t\t/* Read tvals from the message and push them onto the valstack,\n\t\t * then call the request callback to process the request.\n\t\t */\n\t\twhile (duk_debug_peek_byte(thr) != DUK_DBG_IB_EOM) {\n\t\t\tduk_tval *tv;\n\t\t\tif (!duk_check_stack(thr, 1)) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"failed to allocate space for request dvalue(s)\"));\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\ttv = duk_debug_read_tval(thr);  /* push to stack */\n\t\t\tif (tv == NULL) {\n\t\t\t\t/* detached */\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnvalues++;\n\t\t}\n\t\tDUK_ASSERT(duk_get_top(thr) == old_top + nvalues);\n\n\t\t/* Request callback should push values for reply to client onto valstack */\n\t\tDUK_D(DUK_DPRINT(\"calling into AppRequest request_cb with nvalues=%ld, old_top=%ld, top=%ld\",\n\t\t                 (long) nvalues, (long) old_top, (long) duk_get_top(thr)));\n\t\tnrets = heap->dbg_request_cb(thr, heap->dbg_udata, nvalues);\n\t\tDUK_D(DUK_DPRINT(\"returned from AppRequest request_cb; nvalues=%ld -> nrets=%ld, old_top=%ld, top=%ld\",\n\t\t                 (long) nvalues, (long) nrets, (long) old_top, (long) duk_get_top(thr)));\n\t\tif (nrets >= 0) {\n\t\t\tDUK_ASSERT(duk_get_top(thr) >= old_top + nrets);\n\t\t\tif (duk_get_top(thr) < old_top + nrets) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"AppRequest callback doesn't match value stack configuration, \"\n\t\t\t\t                 \"top=%ld < old_top=%ld + nrets=%ld; \"\n\t\t\t\t                 \"this might mean it's unsafe to continue!\",\n\t\t\t\t                 (long) duk_get_top(thr), (long) old_top, (long) nrets));\n\t\t\t\tgoto fail;\n\t\t\t}\n\n\t\t\t/* Reply with tvals pushed by request callback */\n\t\t\tduk_debug_write_byte(thr, DUK_DBG_IB_REPLY);\n\t\t\ttop = duk_get_top(thr);\n\t\t\tfor (idx = top - nrets; idx < top; idx++) {\n\t\t\t\tduk_debug_write_tval(thr, DUK_GET_TVAL_POSIDX(thr, idx));\n\t\t\t}\n\t\t\tduk_debug_write_eom(thr);\n\t\t} else {\n\t\t\tDUK_ASSERT(duk_get_top(thr) >= old_top + 1);\n\t\t\tif (duk_get_top(thr) < old_top + 1) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"request callback return value doesn't match value stack configuration\"));\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_APPLICATION, duk_get_string(thr, -1));\n\t\t}\n\n\t\tduk_set_top(thr, old_top);  /* restore stack top */\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"no request callback, treat AppRequest as unsupported\"));\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, \"AppRequest unsupported by target\");\n\t}\n\n\treturn;\n\n fail:\n\tduk_set_top(thr, old_top);  /* restore stack top */\n\tDUK__SET_CONN_BROKEN(thr, 1);\n}\n\n/*\n *  DumpHeap command\n */\n\n#if defined(DUK_USE_DEBUGGER_DUMPHEAP)\n/* XXX: this has some overlap with object inspection; remove this and make\n * DumpHeap return lists of heapptrs instead?\n */\nDUK_LOCAL void duk__debug_dump_heaphdr(duk_hthread *thr, duk_heap *heap, duk_heaphdr *hdr) {\n\tDUK_UNREF(heap);\n\n\tduk_debug_write_heapptr(thr, hdr);\n\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_TYPE(hdr));\n\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_FLAGS_RAW(hdr));\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HEAPHDR_GET_REFCOUNT(hdr));\n#else\n\tduk_debug_write_int(thr, (duk_int32_t) -1);\n#endif\n\n\tswitch (DUK_HEAPHDR_GET_TYPE(hdr)) {\n\tcase DUK_HTYPE_STRING: {\n\t\tduk_hstring *h = (duk_hstring *) hdr;\n\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_BYTELEN(h));\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_CHARLEN(h));\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HSTRING_GET_HASH(h));\n\t\tduk_debug_write_hstring(thr, h);\n\t\tbreak;\n\t}\n\tcase DUK_HTYPE_OBJECT: {\n\t\tduk_hobject *h = (duk_hobject *) hdr;\n\t\tduk_hstring *k;\n\t\tduk_uint_fast32_t i;\n\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_CLASS_NUMBER(h));\n\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h));\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ESIZE(h));\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ENEXT(h));\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_ASIZE(h));\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_GET_HSIZE(h));\n\n\t\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) {\n\t\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HOBJECT_E_GET_FLAGS(heap, h, i));\n\t\t\tk = DUK_HOBJECT_E_GET_KEY(heap, h, i);\n\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) k);\n\t\t\tif (k == NULL) {\n\t\t\t\tduk_debug_write_int(thr, 0);  /* isAccessor */\n\t\t\t\tduk_debug_write_unused(thr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) {\n\t\t\t\tduk_debug_write_int(thr, 1);  /* isAccessor */\n\t\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get);\n\t\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set);\n\t\t\t} else {\n\t\t\t\tduk_debug_write_int(thr, 0);  /* isAccessor */\n\n\t\t\t\tduk__debug_write_tval_heapptr(thr, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v);\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) {\n\t\t\t/* Note: array dump will include elements beyond\n\t\t\t * 'length'.\n\t\t\t */\n\t\t\tduk__debug_write_tval_heapptr(thr, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i));\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_HTYPE_BUFFER: {\n\t\tduk_hbuffer *h = (duk_hbuffer *) hdr;\n\n\t\tduk_debug_write_uint(thr, (duk_uint32_t) DUK_HBUFFER_GET_SIZE(h));\n\t\tduk_debug_write_buffer(thr, (const char *) DUK_HBUFFER_GET_DATA_PTR(heap, h), (duk_size_t) DUK_HBUFFER_GET_SIZE(h));\n\t\tbreak;\n\t}\n\tdefault: {\n\t\tDUK_D(DUK_DPRINT(\"invalid htype: %d\", (int) DUK_HEAPHDR_GET_TYPE(hdr)));\n\t}\n\t}\n}\n\nDUK_LOCAL void duk__debug_dump_heap_allocated(duk_hthread *thr, duk_heap *heap) {\n\tduk_heaphdr *hdr;\n\n\thdr = heap->heap_allocated;\n\twhile (hdr != NULL) {\n\t\tduk__debug_dump_heaphdr(thr, heap, hdr);\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t}\n}\n\nDUK_LOCAL void duk__debug_dump_strtab(duk_hthread *thr, duk_heap *heap) {\n\tduk_uint32_t i;\n\tduk_hstring *h;\n\n\tfor (i = 0; i < heap->st_size; i++) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t\th = DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, heap->strtable16[i]);\n#else\n\t\th = heap->strtable[i];\n#endif\n\t\twhile (h != NULL) {\n\t\t\tduk__debug_dump_heaphdr(thr, heap, (duk_heaphdr *) h);\n\t\t\th = h->hdr.h_next;\n\t\t}\n\t}\n}\n\nDUK_LOCAL void duk__debug_handle_dump_heap(duk_hthread *thr, duk_heap *heap) {\n\tDUK_D(DUK_DPRINT(\"debug command DumpHeap\"));\n\n\tduk_debug_write_reply(thr);\n\tduk__debug_dump_heap_allocated(thr, heap);\n\tduk__debug_dump_strtab(thr, heap);\n\tduk_debug_write_eom(thr);\n}\n#endif  /* DUK_USE_DEBUGGER_DUMPHEAP */\n\nDUK_LOCAL void duk__debug_handle_get_bytecode(duk_hthread *thr, duk_heap *heap) {\n\tduk_activation *act;\n\tduk_hcompfunc *fun = NULL;\n\tduk_size_t i, n;\n\tduk_tval *tv;\n\tduk_hobject **fn;\n\tduk_int32_t level = -1;\n\tduk_uint8_t ibyte;\n\n\tDUK_UNREF(heap);\n\n\tDUK_D(DUK_DPRINT(\"debug command GetBytecode\"));\n\n\tibyte = duk_debug_peek_byte(thr);\n\tif (ibyte != DUK_DBG_IB_EOM) {\n\t\ttv = duk_debug_read_tval(thr);\n\t\tif (tv == NULL) {\n\t\t\t/* detached */\n\t\t\treturn;\n\t\t}\n\t\tif (DUK_TVAL_IS_OBJECT(tv)) {\n\t\t\t/* tentative, checked later */\n\t\t\tfun = (duk_hcompfunc *) DUK_TVAL_GET_OBJECT(tv);\n\t\t\tDUK_ASSERT(fun != NULL);\n\t\t} else if (DUK_TVAL_IS_NUMBER(tv)) {\n\t\t\tlevel = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv);\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"invalid argument to GetBytecode: %!T\", tv));\n\t\t\tgoto fail_args;\n\t\t}\n\t}\n\n\tif (fun == NULL) {\n\t\tact = duk_hthread_get_activation_for_level(thr, level);\n\t\tif (act == NULL) {\n\t\t\tgoto fail_index;\n\t\t}\n\t\tfun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);\n\t}\n\n\tif (fun == NULL || !DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)) {\n\t\tDUK_D(DUK_DPRINT(\"invalid argument to GetBytecode: %!O\", fun));\n\t\tgoto fail_args;\n\t}\n\tDUK_ASSERT(fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun));\n\n\tduk_debug_write_reply(thr);\n\tn = DUK_HCOMPFUNC_GET_CONSTS_COUNT(heap, fun);\n\tduk_debug_write_int(thr, (duk_int32_t) n);\n\ttv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, fun);\n\tfor (i = 0; i < n; i++) {\n\t\tduk_debug_write_tval(thr, tv);\n\t\ttv++;\n\t}\n\tn = DUK_HCOMPFUNC_GET_FUNCS_COUNT(heap, fun);\n\tduk_debug_write_int(thr, (duk_int32_t) n);\n\tfn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, fun);\n\tfor (i = 0; i < n; i++) {\n\t\tduk_debug_write_hobject(thr, *fn);\n\t\tfn++;\n\t}\n\tduk_debug_write_string(thr,\n\t                       (const char *) DUK_HCOMPFUNC_GET_CODE_BASE(heap, fun),\n\t                       (duk_size_t) DUK_HCOMPFUNC_GET_CODE_SIZE(heap, fun));\n\tduk_debug_write_eom(thr);\n\treturn;\n\n fail_args:\n\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, \"invalid argument\");\n\treturn;\n\n fail_index:\n\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, \"invalid callstack index\");\n\treturn;\n}\n\n/*\n *  Object inspection commands: GetHeapObjInfo, GetObjPropDesc,\n *  GetObjPropDescRange\n */\n\n#if defined(DUK_USE_DEBUGGER_INSPECT)\n\n#if 0 /* pruned */\nDUK_LOCAL const char * const duk__debug_getinfo_heaphdr_keys[] = {\n\t\"reachable\",\n\t\"temproot\",\n\t\"finalizable\",\n\t\"finalized\",\n\t\"readonly\"\n\t/* NULL not needed here */\n};\nDUK_LOCAL duk_uint_t duk__debug_getinfo_heaphdr_masks[] = {\n\tDUK_HEAPHDR_FLAG_REACHABLE,\n\tDUK_HEAPHDR_FLAG_TEMPROOT,\n\tDUK_HEAPHDR_FLAG_FINALIZABLE,\n\tDUK_HEAPHDR_FLAG_FINALIZED,\n\tDUK_HEAPHDR_FLAG_READONLY,\n\t0  /* terminator */\n};\n#endif\nDUK_LOCAL const char * const duk__debug_getinfo_hstring_keys[] = {\n#if 0\n\t\"arridx\",\n\t\"symbol\",\n\t\"hidden\",\n\t\"reserved_word\",\n\t\"strict_reserved_word\",\n\t\"eval_or_arguments\",\n#endif\n\t\"extdata\"\n\t/* NULL not needed here */\n};\nDUK_LOCAL duk_uint_t duk__debug_getinfo_hstring_masks[] = {\n#if 0\n\tDUK_HSTRING_FLAG_ARRIDX,\n\tDUK_HSTRING_FLAG_SYMBOL,\n\tDUK_HSTRING_FLAG_HIDDEN,\n\tDUK_HSTRING_FLAG_RESERVED_WORD,\n\tDUK_HSTRING_FLAG_STRICT_RESERVED_WORD,\n\tDUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS,\n#endif\n\tDUK_HSTRING_FLAG_EXTDATA,\n\t0  /* terminator */\n};\nDUK_LOCAL const char * const duk__debug_getinfo_hobject_keys[] = {\n\t\"extensible\",\n\t\"constructable\",\n\t\"callable\",\n\t\"boundfunc\",\n\t\"compfunc\",\n\t\"natfunc\",\n\t\"bufobj\",\n\t\"fastrefs\",\n\t\"array_part\",\n\t\"strict\",\n\t\"notail\",\n\t\"newenv\",\n\t\"namebinding\",\n\t\"createargs\",\n\t\"have_finalizer\",\n\t\"exotic_array\",\n\t\"exotic_stringobj\",\n\t\"exotic_arguments\",\n\t\"exotic_proxyobj\",\n\t\"special_call\"\n\t/* NULL not needed here */\n};\nDUK_LOCAL duk_uint_t duk__debug_getinfo_hobject_masks[] = {\n\tDUK_HOBJECT_FLAG_EXTENSIBLE,\n\tDUK_HOBJECT_FLAG_CONSTRUCTABLE,\n\tDUK_HOBJECT_FLAG_CALLABLE,\n\tDUK_HOBJECT_FLAG_BOUNDFUNC,\n\tDUK_HOBJECT_FLAG_COMPFUNC,\n\tDUK_HOBJECT_FLAG_NATFUNC,\n\tDUK_HOBJECT_FLAG_BUFOBJ,\n\tDUK_HOBJECT_FLAG_FASTREFS,\n\tDUK_HOBJECT_FLAG_ARRAY_PART,\n\tDUK_HOBJECT_FLAG_STRICT,\n\tDUK_HOBJECT_FLAG_NOTAIL,\n\tDUK_HOBJECT_FLAG_NEWENV,\n\tDUK_HOBJECT_FLAG_NAMEBINDING,\n\tDUK_HOBJECT_FLAG_CREATEARGS,\n\tDUK_HOBJECT_FLAG_HAVE_FINALIZER,\n\tDUK_HOBJECT_FLAG_EXOTIC_ARRAY,\n\tDUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ,\n\tDUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS,\n\tDUK_HOBJECT_FLAG_EXOTIC_PROXYOBJ,\n\tDUK_HOBJECT_FLAG_SPECIAL_CALL,\n\t0  /* terminator */\n};\nDUK_LOCAL const char * const duk__debug_getinfo_hbuffer_keys[] = {\n\t\"dynamic\",\n\t\"external\"\n\t/* NULL not needed here */\n};\nDUK_LOCAL duk_uint_t duk__debug_getinfo_hbuffer_masks[] = {\n\tDUK_HBUFFER_FLAG_DYNAMIC,\n\tDUK_HBUFFER_FLAG_EXTERNAL,\n\t0  /* terminator */\n};\n\nDUK_LOCAL void duk__debug_getinfo_flags_key(duk_hthread *thr, const char *key) {\n\tduk_debug_write_uint(thr, 0);\n\tduk_debug_write_cstring(thr, key);\n}\n\nDUK_LOCAL void duk__debug_getinfo_prop_uint(duk_hthread *thr, const char *key, duk_uint_t val) {\n\tduk_debug_write_uint(thr, 0);\n\tduk_debug_write_cstring(thr, key);\n\tduk_debug_write_uint(thr, val);\n}\n\nDUK_LOCAL void duk__debug_getinfo_prop_int(duk_hthread *thr, const char *key, duk_int_t val) {\n\tduk_debug_write_uint(thr, 0);\n\tduk_debug_write_cstring(thr, key);\n\tduk_debug_write_int(thr, val);\n}\n\nDUK_LOCAL void duk__debug_getinfo_prop_bool(duk_hthread *thr, const char *key, duk_bool_t val) {\n\tduk_debug_write_uint(thr, 0);\n\tduk_debug_write_cstring(thr, key);\n\tduk_debug_write_boolean(thr, val);\n}\n\nDUK_LOCAL void duk__debug_getinfo_bitmask(duk_hthread *thr, const char * const * keys, duk_uint_t *masks, duk_uint_t flags) {\n\tconst char *key;\n\tduk_uint_t mask;\n\n\tfor (;;) {\n\t\tmask = *masks++;\n\t\tif (mask == 0) {\n\t\t\tbreak;\n\t\t}\n\t\tkey = *keys++;\n\t\tDUK_ASSERT(key != NULL);\n\n\t\tDUK_DD(DUK_DDPRINT(\"inspect bitmask: key=%s, mask=0x%08lx, flags=0x%08lx\", key, (unsigned long) mask, (unsigned long) flags));\n\t\tduk__debug_getinfo_prop_bool(thr, key, flags & mask);\n\t}\n}\n\n/* Inspect a property using a virtual index into a conceptual property list\n * consisting of (1) all array part items from [0,a_size[ (even when above\n * .length) and (2) all entry part items from [0,e_next[.  Unused slots are\n * indicated using dvalue 'unused'.\n */\nDUK_LOCAL duk_bool_t duk__debug_getprop_index(duk_hthread *thr, duk_heap *heap, duk_hobject *h_obj, duk_uint_t idx) {\n\tduk_uint_t a_size;\n\tduk_tval *tv;\n\tduk_hstring *h_key;\n\tduk_hobject *h_getset;\n\tduk_uint_t flags;\n\n\tDUK_UNREF(heap);\n\n\ta_size = DUK_HOBJECT_GET_ASIZE(h_obj);\n\tif (idx < a_size) {\n\t\tduk_debug_write_uint(thr, DUK_PROPDESC_FLAGS_WEC);\n\t\tduk_debug_write_uint(thr, idx);\n\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, h_obj, idx);\n\t\tduk_debug_write_tval(thr, tv);\n\t\treturn 1;\n\t}\n\n\tidx -= a_size;\n\tif (idx >= DUK_HOBJECT_GET_ENEXT(h_obj)) {\n\t\treturn 0;\n\t}\n\n\th_key = DUK_HOBJECT_E_GET_KEY(heap, h_obj, idx);\n\tif (h_key == NULL) {\n\t\tduk_debug_write_uint(thr, 0);\n\t\tduk_debug_write_null(thr);\n\t\tduk_debug_write_unused(thr);\n\t\treturn 1;\n\t}\n\n\tflags = DUK_HOBJECT_E_GET_FLAGS(heap, h_obj, idx);\n\tif (DUK_HSTRING_HAS_SYMBOL(h_key)) {\n\t\tflags |= DUK_DBG_PROPFLAG_SYMBOL;\n\t}\n\tif (DUK_HSTRING_HAS_HIDDEN(h_key)) {\n\t\tflags |= DUK_DBG_PROPFLAG_HIDDEN;\n\t}\n\tduk_debug_write_uint(thr, flags);\n\tduk_debug_write_hstring(thr, h_key);\n\tif (flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\th_getset = DUK_HOBJECT_E_GET_VALUE_GETTER(heap, h_obj, idx);\n\t\tif (h_getset) {\n\t\t\tduk_debug_write_hobject(thr, h_getset);\n\t\t} else {\n\t\t\tduk_debug_write_null(thr);\n\t\t}\n\t\th_getset = DUK_HOBJECT_E_GET_VALUE_SETTER(heap, h_obj, idx);\n\t\tif (h_getset) {\n\t\t\tduk_debug_write_hobject(thr, h_getset);\n\t\t} else {\n\t\t\tduk_debug_write_null(thr);\n\t\t}\n\t} else {\n\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, h_obj, idx);\n\t\tduk_debug_write_tval(thr, tv);\n\t}\n\treturn 1;\n}\n\nDUK_LOCAL void duk__debug_handle_get_heap_obj_info(duk_hthread *thr, duk_heap *heap) {\n\tduk_heaphdr *h;\n\n\tDUK_D(DUK_DPRINT(\"debug command GetHeapObjInfo\"));\n\tDUK_UNREF(heap);\n\n\tDUK_ASSERT(sizeof(duk__debug_getinfo_hstring_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hstring_masks) / sizeof(duk_uint_t) - 1);\n\tDUK_ASSERT(sizeof(duk__debug_getinfo_hobject_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hobject_masks) / sizeof(duk_uint_t) - 1);\n\tDUK_ASSERT(sizeof(duk__debug_getinfo_hbuffer_keys) / sizeof(const char *) == sizeof(duk__debug_getinfo_hbuffer_masks) / sizeof(duk_uint_t) - 1);\n\n\th = duk_debug_read_any_ptr(thr);\n\tif (!h) {\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, \"invalid target\");\n\t\treturn;\n\t}\n\n\tduk_debug_write_reply(thr);\n\n\t/* As with all inspection code, we rely on the debug client providing\n\t * a valid, non-stale pointer: there's no portable way to safely\n\t * validate the pointer here.\n\t */\n\n\tduk__debug_getinfo_flags_key(thr, \"heapptr\");\n\tduk_debug_write_heapptr(thr, h);\n\n\t/* XXX: comes out as signed now */\n\tduk__debug_getinfo_prop_uint(thr, \"heaphdr_flags\", (duk_uint_t) DUK_HEAPHDR_GET_FLAGS(h));\n\tduk__debug_getinfo_prop_uint(thr, \"heaphdr_type\", (duk_uint_t) DUK_HEAPHDR_GET_TYPE(h));\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk__debug_getinfo_prop_uint(thr, \"refcount\", (duk_uint_t) DUK_HEAPHDR_GET_REFCOUNT(h));\n#endif\n#if 0 /* pruned */\n\tduk__debug_getinfo_bitmask(thr,\n\t                           duk__debug_getinfo_heaphdr_keys,\n\t                           duk__debug_getinfo_heaphdr_masks,\n\t                           DUK_HEAPHDR_GET_FLAGS_RAW(h));\n#endif\n\n\tswitch (DUK_HEAPHDR_GET_TYPE(h)) {\n\tcase DUK_HTYPE_STRING: {\n\t\tduk_hstring *h_str;\n\n\t\th_str = (duk_hstring *) h;\n\t\tduk__debug_getinfo_bitmask(thr,\n\t\t                           duk__debug_getinfo_hstring_keys,\n\t\t                           duk__debug_getinfo_hstring_masks,\n\t\t                           DUK_HEAPHDR_GET_FLAGS_RAW(h));\n\t\tduk__debug_getinfo_prop_uint(thr, \"bytelen\", (duk_uint_t) DUK_HSTRING_GET_BYTELEN(h_str));\n\t\tduk__debug_getinfo_prop_uint(thr, \"charlen\", (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_str));\n\t\tduk__debug_getinfo_prop_uint(thr, \"hash\", (duk_uint_t) DUK_HSTRING_GET_HASH(h_str));\n\t\tduk__debug_getinfo_flags_key(thr, \"data\");\n\t\tduk_debug_write_hstring(thr, h_str);\n\t\tbreak;\n\t}\n\tcase DUK_HTYPE_OBJECT: {\n\t\tduk_hobject *h_obj;\n\t\tduk_hobject *h_proto;\n\n\t\th_obj = (duk_hobject *) h;\n\t\th_proto = DUK_HOBJECT_GET_PROTOTYPE(heap, h_obj);\n\n\t\t/* duk_hobject specific fields. */\n\t\tduk__debug_getinfo_bitmask(thr,\n\t\t                           duk__debug_getinfo_hobject_keys,\n\t\t                           duk__debug_getinfo_hobject_masks,\n\t\t                           DUK_HEAPHDR_GET_FLAGS_RAW(h));\n\t\tduk__debug_getinfo_prop_uint(thr, \"class_number\", DUK_HOBJECT_GET_CLASS_NUMBER(h_obj));\n\t\tduk__debug_getinfo_flags_key(thr, \"class_name\");\n\t\tduk_debug_write_hstring(thr, DUK_HOBJECT_GET_CLASS_STRING(heap, h_obj));\n\t\tduk__debug_getinfo_flags_key(thr, \"prototype\");\n\t\tif (h_proto != NULL) {\n\t\t\tduk_debug_write_hobject(thr, h_proto);\n\t\t} else {\n\t\t\tduk_debug_write_null(thr);\n\t\t}\n\t\tduk__debug_getinfo_flags_key(thr, \"props\");\n\t\tduk_debug_write_pointer(thr, (void *) DUK_HOBJECT_GET_PROPS(heap, h_obj));\n\t\tduk__debug_getinfo_prop_uint(thr, \"e_size\", (duk_uint_t) DUK_HOBJECT_GET_ESIZE(h_obj));\n\t\tduk__debug_getinfo_prop_uint(thr, \"e_next\", (duk_uint_t) DUK_HOBJECT_GET_ENEXT(h_obj));\n\t\tduk__debug_getinfo_prop_uint(thr, \"a_size\", (duk_uint_t) DUK_HOBJECT_GET_ASIZE(h_obj));\n\t\tduk__debug_getinfo_prop_uint(thr, \"h_size\", (duk_uint_t) DUK_HOBJECT_GET_HSIZE(h_obj));\n\n\t\tif (DUK_HOBJECT_IS_ARRAY(h_obj)) {\n\t\t\tduk_harray *h_arr;\n\t\t\th_arr = (duk_harray *) h_obj;\n\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"length\", (duk_uint_t) h_arr->length);\n\t\t\tduk__debug_getinfo_prop_bool(thr, \"length_nonwritable\", h_arr->length_nonwritable);\n\t\t}\n\n\t\tif (DUK_HOBJECT_IS_NATFUNC(h_obj)) {\n\t\t\tduk_hnatfunc *h_fun;\n\t\t\th_fun = (duk_hnatfunc *) h_obj;\n\n\t\t\tduk__debug_getinfo_prop_int(thr, \"nargs\", h_fun->nargs);\n\t\t\tduk__debug_getinfo_prop_int(thr, \"magic\", h_fun->magic);\n\t\t\tduk__debug_getinfo_prop_bool(thr, \"varargs\", h_fun->magic == DUK_HNATFUNC_NARGS_VARARGS);\n\t\t\t/* Native function pointer may be different from a void pointer,\n\t\t\t * and we serialize it from memory directly now (no byte swapping etc).\n\t\t\t */\n\t\t\tduk__debug_getinfo_flags_key(thr, \"funcptr\");\n\t\t\tduk_debug_write_buffer(thr, (const char *) &h_fun->func, sizeof(h_fun->func));\n\t\t}\n\n\t\tif (DUK_HOBJECT_IS_COMPFUNC(h_obj)) {\n\t\t\tduk_hcompfunc *h_fun;\n\t\t\tduk_hbuffer *h_buf;\n\t\t\tduk_hobject *h_lexenv;\n\t\t\tduk_hobject *h_varenv;\n\t\t\th_fun = (duk_hcompfunc *) h_obj;\n\n\t\t\tduk__debug_getinfo_prop_int(thr, \"nregs\", h_fun->nregs);\n\t\t\tduk__debug_getinfo_prop_int(thr, \"nargs\", h_fun->nargs);\n\n\t\t\tduk__debug_getinfo_flags_key(thr, \"lex_env\");\n\t\t\th_lexenv = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, h_fun);\n\t\t\tif (h_lexenv != NULL) {\n\t\t\t\tduk_debug_write_hobject(thr, h_lexenv);\n\t\t\t} else {\n\t\t\t\tduk_debug_write_null(thr);\n\t\t\t}\n\t\t\tduk__debug_getinfo_flags_key(thr, \"var_env\");\n\t\t\th_varenv = DUK_HCOMPFUNC_GET_VARENV(thr->heap, h_fun);\n\t\t\tif (h_varenv != NULL) {\n\t\t\t\tduk_debug_write_hobject(thr, h_varenv);\n\t\t\t} else {\n\t\t\t\tduk_debug_write_null(thr);\n\t\t\t}\n\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"start_line\", h_fun->start_line);\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"end_line\", h_fun->end_line);\n\t\t\th_buf = (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(thr->heap, h_fun);\n\t\t\tif (h_buf != NULL) {\n\t\t\t\tduk__debug_getinfo_flags_key(thr, \"data\");\n\t\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) h_buf);\n\t\t\t}\n\t\t}\n\n\t\tif (DUK_HOBJECT_IS_BOUNDFUNC(h_obj)) {\n\t\t\tduk_hboundfunc *h_bfun;\n\t\t\th_bfun = (duk_hboundfunc *) h_obj;\n\n\t\t\tduk__debug_getinfo_flags_key(thr, \"target\");\n\t\t\tduk_debug_write_tval(thr, &h_bfun->target);\n\t\t\tduk__debug_getinfo_flags_key(thr, \"this_binding\");\n\t\t\tduk_debug_write_tval(thr, &h_bfun->this_binding);\n\t\t\tduk__debug_getinfo_flags_key(thr, \"nargs\");\n\t\t\tduk_debug_write_int(thr, h_bfun->nargs);\n\t\t\t/* h_bfun->args not exposed now */\n\t\t}\n\n\t\tif (DUK_HOBJECT_IS_THREAD(h_obj)) {\n\t\t\t/* XXX: Currently no inspection of threads, e.g. value stack, call\n\t\t\t * stack, catch stack, etc.\n\t\t\t */\n\t\t\tduk_hthread *h_thr;\n\t\t\th_thr = (duk_hthread *) h_obj;\n\t\t\tDUK_UNREF(h_thr);\n\t\t}\n\n\t\tif (DUK_HOBJECT_IS_DECENV(h_obj)) {\n\t\t\tduk_hdecenv *h_env;\n\t\t\th_env = (duk_hdecenv *) h_obj;\n\n\t\t\tduk__debug_getinfo_flags_key(thr, \"thread\");\n\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->thread));\n\t\t\tduk__debug_getinfo_flags_key(thr, \"varmap\");\n\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->varmap));\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"regbase\", (duk_uint_t) h_env->regbase_byteoff);\n\t\t}\n\n\t\tif (DUK_HOBJECT_IS_OBJENV(h_obj)) {\n\t\t\tduk_hobjenv *h_env;\n\t\t\th_env = (duk_hobjenv *) h_obj;\n\n\t\t\tduk__debug_getinfo_flags_key(thr, \"target\");\n\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) (h_env->target));\n\t\t\tduk__debug_getinfo_prop_bool(thr, \"has_this\", h_env->has_this);\n\t\t}\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\tif (DUK_HOBJECT_IS_BUFOBJ(h_obj)) {\n\t\t\tduk_hbufobj *h_bufobj;\n\t\t\th_bufobj = (duk_hbufobj *) h_obj;\n\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"slice_offset\", h_bufobj->offset);\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"slice_length\", h_bufobj->length);\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"elem_shift\", (duk_uint_t) h_bufobj->shift);\n\t\t\tduk__debug_getinfo_prop_uint(thr, \"elem_type\", (duk_uint_t) h_bufobj->elem_type);\n\t\t\tduk__debug_getinfo_prop_bool(thr, \"is_typedarray\", (duk_uint_t) h_bufobj->is_typedarray);\n\t\t\tif (h_bufobj->buf != NULL) {\n\t\t\t\tduk__debug_getinfo_flags_key(thr, \"buffer\");\n\t\t\t\tduk_debug_write_heapptr(thr, (duk_heaphdr *) h_bufobj->buf);\n\t\t\t}\n\t\t}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\t\tbreak;\n\t}\n\tcase DUK_HTYPE_BUFFER: {\n\t\tduk_hbuffer *h_buf;\n\n\t\th_buf = (duk_hbuffer *) h;\n\t\tduk__debug_getinfo_bitmask(thr,\n\t\t                           duk__debug_getinfo_hbuffer_keys,\n\t\t                           duk__debug_getinfo_hbuffer_masks,\n\t\t                           DUK_HEAPHDR_GET_FLAGS_RAW(h));\n\t\tduk__debug_getinfo_prop_uint(thr, \"size\", (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_buf));\n\t\tduk__debug_getinfo_flags_key(thr, \"dataptr\");\n\t\tduk_debug_write_pointer(thr, (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf));\n\t\tduk__debug_getinfo_flags_key(thr, \"data\");\n\t\tduk_debug_write_hbuffer(thr, h_buf);  /* tolerates NULL h_buf */\n\t\tbreak;\n\t}\n\tdefault: {\n\t\t/* Since we already started writing the reply, just emit nothing. */\n\t\tDUK_D(DUK_DPRINT(\"inspect target pointer has invalid heaphdr type\"));\n\t}\n\t}\n\n\tduk_debug_write_eom(thr);\n}\n\nDUK_LOCAL void duk__debug_handle_get_obj_prop_desc(duk_hthread *thr, duk_heap *heap) {\n\tduk_heaphdr *h;\n\tduk_hobject *h_obj;\n\tduk_hstring *h_key;\n\tduk_propdesc desc;\n\n\tDUK_D(DUK_DPRINT(\"debug command GetObjPropDesc\"));\n\tDUK_UNREF(heap);\n\n\th = duk_debug_read_any_ptr(thr);\n\tif (!h) {\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, \"invalid target\");\n\t\treturn;\n\t}\n\th_key = duk_debug_read_hstring(thr);\n\tif (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT || h_key == NULL) {\n\t\tgoto fail_args;\n\t}\n\th_obj = (duk_hobject *) h;\n\n\tif (duk_hobject_get_own_propdesc(thr, h_obj, h_key, &desc, 0 /*flags*/)) {\n\t\tduk_int_t virtual_idx;\n\t\tduk_bool_t rc;\n\n\t\t/* To use the shared helper need the virtual index. */\n\t\tDUK_ASSERT(desc.e_idx >= 0 || desc.a_idx >= 0);\n\t\tvirtual_idx = (desc.a_idx >= 0 ? desc.a_idx :\n\t\t               (duk_int_t) DUK_HOBJECT_GET_ASIZE(h_obj) + desc.e_idx);\n\n\t\tduk_debug_write_reply(thr);\n\t\trc = duk__debug_getprop_index(thr, heap, h_obj, (duk_uint_t) virtual_idx);\n\t\tDUK_ASSERT(rc == 1);\n\t\tDUK_UNREF(rc);\n\t\tduk_debug_write_eom(thr);\n\t} else {\n\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_NOTFOUND, \"not found\");\n\t}\n\treturn;\n\n fail_args:\n\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, \"invalid args\");\n}\n\nDUK_LOCAL void duk__debug_handle_get_obj_prop_desc_range(duk_hthread *thr, duk_heap *heap) {\n\tduk_heaphdr *h;\n\tduk_hobject *h_obj;\n\tduk_uint_t idx, idx_start, idx_end;\n\n\tDUK_D(DUK_DPRINT(\"debug command GetObjPropDescRange\"));\n\tDUK_UNREF(heap);\n\n\th = duk_debug_read_any_ptr(thr);\n\tidx_start = (duk_uint_t) duk_debug_read_int(thr);\n\tidx_end = (duk_uint_t) duk_debug_read_int(thr);\n\tif (h == NULL || DUK_HEAPHDR_GET_TYPE(h) != DUK_HTYPE_OBJECT) {\n\t\tgoto fail_args;\n\t}\n\th_obj = (duk_hobject *) h;\n\n\t/* The index range space is conceptually the array part followed by the\n\t * entry part.  Unlike normal enumeration all slots are exposed here as\n\t * is and return 'unused' if the slots are not in active use.  In particular\n\t * the array part is included for the full a_size regardless of what the\n\t * array .length is.\n\t */\n\n\tduk_debug_write_reply(thr);\n\tfor (idx = idx_start; idx < idx_end; idx++) {\n\t\tif (!duk__debug_getprop_index(thr, heap, h_obj, idx)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tduk_debug_write_eom(thr);\n\treturn;\n\n fail_args:\n\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_UNKNOWN, \"invalid args\");\n}\n\n#endif  /* DUK_USE_DEBUGGER_INSPECT */\n\n/*\n *  Process incoming debug requests\n *\n *  Individual request handlers can push temporaries on the value stack and\n *  rely on duk__debug_process_message() to restore the value stack top\n *  automatically.\n */\n\n/* Process one debug message.  Automatically restore value stack top to its\n * entry value, so that individual message handlers don't need exact value\n * stack handling which is convenient.\n */\nDUK_LOCAL void duk__debug_process_message(duk_hthread *thr) {\n\tduk_heap *heap;\n\tduk_uint8_t x;\n\tduk_int32_t cmd;\n\tduk_idx_t entry_top;\n\n\tDUK_ASSERT(thr != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tentry_top = duk_get_top(thr);\n\n\tx = duk_debug_read_byte(thr);\n\tswitch (x) {\n\tcase DUK_DBG_IB_REQUEST: {\n\t\tcmd = duk_debug_read_int(thr);\n\t\tswitch (cmd) {\n\t\tcase DUK_DBG_CMD_BASICINFO: {\n\t\t\tduk__debug_handle_basic_info(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_TRIGGERSTATUS: {\n\t\t\tduk__debug_handle_trigger_status(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_PAUSE: {\n\t\t\tduk__debug_handle_pause(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_RESUME: {\n\t\t\tduk__debug_handle_resume(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_STEPINTO:\n\t\tcase DUK_DBG_CMD_STEPOVER:\n\t\tcase DUK_DBG_CMD_STEPOUT: {\n\t\t\tduk__debug_handle_step(thr, heap, cmd);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_LISTBREAK: {\n\t\t\tduk__debug_handle_list_break(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_ADDBREAK: {\n\t\t\tduk__debug_handle_add_break(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_DELBREAK: {\n\t\t\tduk__debug_handle_del_break(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_GETVAR: {\n\t\t\tduk__debug_handle_get_var(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_PUTVAR: {\n\t\t\tduk__debug_handle_put_var(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_GETCALLSTACK: {\n\t\t\tduk__debug_handle_get_call_stack(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_GETLOCALS: {\n\t\t\tduk__debug_handle_get_locals(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_EVAL: {\n\t\t\tduk__debug_handle_eval(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_DETACH: {\n\t\t\t/* The actual detached_cb call is postponed to message loop so\n\t\t\t * we don't need any special precautions here (just skip to EOM\n\t\t\t * on the already closed connection).\n\t\t\t */\n\t\t\tduk__debug_handle_detach(thr, heap);\n\t\t\tbreak;\n\t\t}\n#if defined(DUK_USE_DEBUGGER_DUMPHEAP)\n\t\tcase DUK_DBG_CMD_DUMPHEAP: {\n\t\t\tduk__debug_handle_dump_heap(thr, heap);\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_DEBUGGER_DUMPHEAP */\n\t\tcase DUK_DBG_CMD_GETBYTECODE: {\n\t\t\tduk__debug_handle_get_bytecode(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_APPREQUEST: {\n\t\t\tduk__debug_handle_apprequest(thr, heap);\n\t\t\tbreak;\n\t\t}\n#if defined(DUK_USE_DEBUGGER_INSPECT)\n\t\tcase DUK_DBG_CMD_GETHEAPOBJINFO: {\n\t\t\tduk__debug_handle_get_heap_obj_info(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_GETOBJPROPDESC: {\n\t\t\tduk__debug_handle_get_obj_prop_desc(thr, heap);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_DBG_CMD_GETOBJPROPDESCRANGE: {\n\t\t\tduk__debug_handle_get_obj_prop_desc_range(thr, heap);\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_DEBUGGER_INSPECT */\n\t\tdefault: {\n\t\t\tDUK_D(DUK_DPRINT(\"debug command unsupported: %d\", (int) cmd));\n\t\t\tduk_debug_write_error_eom(thr, DUK_DBG_ERR_UNSUPPORTED, \"unsupported command\");\n\t\t}\n\t\t}  /* switch cmd */\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_REPLY: {\n\t\tDUK_D(DUK_DPRINT(\"debug reply, skipping\"));\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_ERROR: {\n\t\tDUK_D(DUK_DPRINT(\"debug error, skipping\"));\n\t\tbreak;\n\t}\n\tcase DUK_DBG_IB_NOTIFY: {\n\t\tDUK_D(DUK_DPRINT(\"debug notify, skipping\"));\n\t\tbreak;\n\t}\n\tdefault: {\n\t\tDUK_D(DUK_DPRINT(\"invalid initial byte, drop connection: %d\", (int) x));\n\t\tgoto fail;\n\t}\n\t}  /* switch initial byte */\n\n\tDUK_ASSERT(duk_get_top(thr) >= entry_top);\n\tduk_set_top(thr, entry_top);\n\tduk__debug_skip_to_eom(thr);\n\treturn;\n\n fail:\n\tDUK_ASSERT(duk_get_top(thr) >= entry_top);\n\tduk_set_top(thr, entry_top);\n\tDUK__SET_CONN_BROKEN(thr, 1);\n\treturn;\n}\n\nDUK_LOCAL void duk__check_resend_status(duk_hthread *thr) {\n\tif (thr->heap->dbg_read_cb != NULL && thr->heap->dbg_state_dirty) {\n\t\tduk_debug_send_status(thr);\n\t\tthr->heap->dbg_state_dirty = 0;\n\t}\n}\n\nDUK_INTERNAL duk_bool_t duk_debug_process_messages(duk_hthread *thr, duk_bool_t no_block) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_idx_t entry_top;\n#endif\n\tduk_bool_t retval = 0;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n#if defined(DUK_USE_ASSERTIONS)\n\tentry_top = duk_get_top(thr);\n#endif\n\n\tDUK_D(DUK_DPRINT(\"process debug messages: read_cb=%s, no_block=%ld, detaching=%ld, processing=%ld\",\n\t                 thr->heap->dbg_read_cb ? \"not NULL\" : \"NULL\", (long) no_block,\n\t                 (long) thr->heap->dbg_detaching, (long) thr->heap->dbg_processing));\n\tDUK_DD(DUK_DDPRINT(\"top at entry: %ld\", (long) duk_get_top(thr)));\n\n\t/* thr->heap->dbg_detaching may be != 0 if a debugger write outside\n\t * the message loop caused a transport error and detach1() to run.\n\t */\n\tDUK_ASSERT(thr->heap->dbg_detaching == 0 || thr->heap->dbg_detaching == 1);\n\tDUK_ASSERT(thr->heap->dbg_processing == 0);\n\tthr->heap->dbg_processing = 1;\n\n\t/* Ensure dirty state causes a Status even if never process any\n\t * messages.  This is expected by the bytecode executor when in\n\t * the running state.\n\t */\n\tduk__check_resend_status(thr);\n\n\tfor (;;) {\n\t\t/* Process messages until we're no longer paused or we peek\n\t\t * and see there's nothing to read right now.\n\t\t */\n\t\tDUK_DD(DUK_DDPRINT(\"top at loop top: %ld\", (long) duk_get_top(thr)));\n\t\tDUK_ASSERT(thr->heap->dbg_processing == 1);\n\n\t\twhile (thr->heap->dbg_read_cb == NULL && thr->heap->dbg_detaching) {\n\t\t\t/* Detach is pending; can be triggered from outside the\n\t\t\t * debugger loop (e.g. Status notify write error) or by\n\t\t\t * previous message handling.  Call detached callback\n\t\t\t * here, in a controlled state, to ensure a possible\n\t\t\t * reattach inside the detached_cb is handled correctly.\n\t\t\t *\n\t\t\t * Recheck for detach in a while loop: an immediate\n\t\t\t * reattach involves a call to duk_debugger_attach()\n\t\t\t * which writes a debugger handshake line immediately\n\t\t\t * inside the API call.  If the transport write fails\n\t\t\t * for that handshake, we can immediately end up in a\n\t\t\t * \"transport broken, detaching\" case several times here.\n\t\t\t * Loop back until we're either cleanly attached or\n\t\t\t * fully detached.\n\t\t\t *\n\t\t\t * NOTE: Reset dbg_processing = 1 forcibly, in case we\n\t\t\t * re-attached; duk_debugger_attach() sets dbg_processing\n\t\t\t * to 0 at the moment.\n\t\t\t */\n\n\t\t\tDUK_D(DUK_DPRINT(\"detach pending (dbg_read_cb == NULL, dbg_detaching != 0), call detach2\"));\n\n\t\t\tduk__debug_do_detach2(thr->heap);\n\t\t\tthr->heap->dbg_processing = 1;  /* may be set to 0 by duk_debugger_attach() inside callback */\n\n\t\t\tDUK_D(DUK_DPRINT(\"after detach2 (and possible reattach): dbg_read_cb=%s, dbg_detaching=%ld\",\n\t\t\t                 thr->heap->dbg_read_cb ? \"not NULL\" : \"NULL\", (long) thr->heap->dbg_detaching));\n\t\t}\n\t\tDUK_ASSERT(thr->heap->dbg_detaching == 0);  /* true even with reattach */\n\t\tDUK_ASSERT(thr->heap->dbg_processing == 1);  /* even after a detach and possible reattach */\n\n\t\tif (thr->heap->dbg_read_cb == NULL) {\n\t\t\tDUK_D(DUK_DPRINT(\"debug connection broken (and not detaching), stop processing messages\"));\n\t\t\tbreak;\n\t\t}\n\n\t\tif (!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || no_block) {\n\t\t\tif (!duk_debug_read_peek(thr)) {\n\t\t\t\t/* Note: peek cannot currently trigger a detach\n\t\t\t\t * so the dbg_detaching == 0 assert outside the\n\t\t\t\t * loop is correct.\n\t\t\t\t */\n\t\t\t\tDUK_D(DUK_DPRINT(\"processing debug message, peek indicated no data, stop processing messages\"));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDUK_D(DUK_DPRINT(\"processing debug message, peek indicated there is data, handle it\"));\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"paused, process debug message, blocking if necessary\"));\n\t\t}\n\n\t\tduk__check_resend_status(thr);\n\t\tduk__debug_process_message(thr);\n\t\tduk__check_resend_status(thr);\n\n\t\tretval = 1;  /* processed one or more messages */\n\t}\n\n\tDUK_ASSERT(thr->heap->dbg_detaching == 0);\n\tDUK_ASSERT(thr->heap->dbg_processing == 1);\n\tthr->heap->dbg_processing = 0;\n\n\t/* As an initial implementation, read flush after exiting the message\n\t * loop.  If transport is broken, this is a no-op (with debug logs).\n\t */\n\tduk_debug_read_flush(thr);  /* this cannot initiate a detach */\n\tDUK_ASSERT(thr->heap->dbg_detaching == 0);\n\n\tDUK_DD(DUK_DDPRINT(\"top at exit: %ld\", (long) duk_get_top(thr)));\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* Easy to get wrong, so assert for it. */\n\tDUK_ASSERT(entry_top == duk_get_top(thr));\n#endif\n\n\treturn retval;\n}\n\n/*\n *  Halt execution helper\n */\n\n/* Halt execution and enter a debugger message loop until execution is resumed\n * by the client.  PC for the current activation may be temporarily decremented\n * so that the \"current\" instruction will be shown by the client.  This helper\n * is callable from anywhere, also outside bytecode executor.\n */\n\nDUK_INTERNAL void duk_debug_halt_execution(duk_hthread *thr, duk_bool_t use_prev_pc) {\n\tduk_activation *act;\n\tduk_hcompfunc *fun;\n\tduk_instr_t *old_pc = NULL;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(duk_debug_is_attached(thr->heap));\n\tDUK_ASSERT(thr->heap->dbg_processing == 0);\n\tDUK_ASSERT(!duk_debug_is_paused(thr->heap));\n\n\tduk_debug_set_paused(thr->heap);\n\n\tact = thr->callstack_curr;\n\n\t/* NOTE: act may be NULL if an error is thrown outside of any activation,\n\t * which may happen in the case of, e.g. syntax errors.\n\t */\n\n\t/* Decrement PC if that was requested, this requires a PC sync. */\n\tif (act != NULL) {\n\t\tduk_hthread_sync_currpc(thr);\n\t\told_pc = act->curr_pc;\n\t\tfun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);\n\n\t\t/* Short circuit if is safe: if act->curr_pc != NULL, 'fun' is\n\t\t * guaranteed to be a non-NULL Ecmascript function.\n\t\t */\n\t\tDUK_ASSERT(act->curr_pc == NULL ||\n\t\t           (fun != NULL && DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun)));\n\t\tif (use_prev_pc &&\n\t\t    act->curr_pc != NULL &&\n\t\t    act->curr_pc > DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, fun)) {\n\t\t\tact->curr_pc--;\n\t\t}\n\t}\n\n\t/* Process debug messages until we are no longer paused. */\n\n\t/* NOTE: This is a bit fragile.  It's important to ensure that\n\t * duk_debug_process_messages() never throws an error or\n\t * act->curr_pc will never be reset.\n\t */\n\n\tthr->heap->dbg_state_dirty = 1;\n\twhile (DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) {\n\t\tDUK_ASSERT(duk_debug_is_attached(thr->heap));\n\t\tDUK_ASSERT(thr->heap->dbg_processing == 0);\n\t\tduk_debug_process_messages(thr, 0 /*no_block*/);\n\t}\n\n\t/* XXX: Decrementing and restoring act->curr_pc works now, but if the\n\t * debugger message loop gains the ability to adjust the current PC\n\t * (e.g. a forced jump) restoring the PC here will break.  Another\n\t * approach would be to use a state flag for the \"decrement 1 from\n\t * topmost activation's PC\" and take it into account whenever dealing\n\t * with PC values.\n\t */\n\tif (act != NULL) {\n\t\tact->curr_pc = old_pc;  /* restore PC */\n\t}\n}\n\n/*\n *  Breakpoint management\n */\n\nDUK_INTERNAL duk_small_int_t duk_debug_add_breakpoint(duk_hthread *thr, duk_hstring *filename, duk_uint32_t line) {\n\tduk_heap *heap;\n\tduk_breakpoint *b;\n\n\t/* Caller must trigger recomputation of active breakpoint list.  To\n\t * ensure stale values are not used if that doesn't happen, clear the\n\t * active breakpoint list here.\n\t */\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(filename != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\n\tif (heap->dbg_breakpoint_count >= DUK_HEAP_MAX_BREAKPOINTS) {\n\t\tDUK_D(DUK_DPRINT(\"failed to add breakpoint for %O:%ld, all breakpoint slots used\",\n\t\t                 (duk_heaphdr *) filename, (long) line));\n\t\treturn -1;\n\t}\n\theap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL;\n\tb = heap->dbg_breakpoints + (heap->dbg_breakpoint_count++);\n\tb->filename = filename;\n\tb->line = line;\n\tDUK_HSTRING_INCREF(thr, filename);\n\n\treturn (duk_small_int_t) (heap->dbg_breakpoint_count - 1);  /* index */\n}\n\nDUK_INTERNAL duk_bool_t duk_debug_remove_breakpoint(duk_hthread *thr, duk_small_uint_t breakpoint_index) {\n\tduk_heap *heap;\n\tduk_hstring *h;\n\tduk_breakpoint *b;\n\tduk_size_t move_size;\n\n\t/* Caller must trigger recomputation of active breakpoint list.  To\n\t * ensure stale values are not used if that doesn't happen, clear the\n\t * active breakpoint list here.\n\t */\n\n\tDUK_ASSERT(thr != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(duk_debug_is_attached(thr->heap));\n\tDUK_ASSERT_DISABLE(breakpoint_index >= 0);  /* unsigned */\n\n\tif (breakpoint_index >= heap->dbg_breakpoint_count) {\n\t\tDUK_D(DUK_DPRINT(\"invalid breakpoint index: %ld\", (long) breakpoint_index));\n\t\treturn 0;\n\t}\n\tb = heap->dbg_breakpoints + breakpoint_index;\n\n\th = b->filename;\n\tDUK_ASSERT(h != NULL);\n\n\tmove_size = sizeof(duk_breakpoint) * (heap->dbg_breakpoint_count - breakpoint_index - 1);\n\tif (move_size > 0) {\n\t\tDUK_MEMMOVE((void *) b,\n\t\t            (const void *) (b + 1),\n\t\t            (size_t) move_size);\n\t}\n\theap->dbg_breakpoint_count--;\n\theap->dbg_breakpoints_active[0] = (duk_breakpoint *) NULL;\n\n\tDUK_HSTRING_DECREF(thr, h);  /* side effects */\n\tDUK_UNREF(h);  /* w/o refcounting */\n\n\t/* Breakpoint entries above the used area are left as garbage. */\n\n\treturn 1;\n}\n\n/*\n *  Misc state management\n */\n\nDUK_INTERNAL duk_bool_t duk_debug_is_attached(duk_heap *heap) {\n\treturn (heap->dbg_read_cb != NULL);\n}\n\nDUK_INTERNAL duk_bool_t duk_debug_is_paused(duk_heap *heap) {\n\treturn (DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) != 0);\n}\n\nDUK_INTERNAL void duk_debug_set_paused(duk_heap *heap) {\n\tif (duk_debug_is_paused(heap)) {\n\t\tDUK_D(DUK_DPRINT(\"trying to set paused state when already paused, ignoring\"));\n\t} else {\n\t\tDUK_HEAP_SET_DEBUGGER_PAUSED(heap);\n\t\theap->dbg_state_dirty = 1;\n\t\tduk_debug_clear_pause_state(heap);\n\t\tDUK_ASSERT(heap->ms_running == 0);  /* debugger can't be triggered within mark-and-sweep */\n\t\theap->ms_running = 1;  /* prevent mark-and-sweep, prevent refzero queueing */\n\t\theap->ms_prevent_count++;\n\t\tDUK_ASSERT(heap->ms_prevent_count != 0);  /* Wrap. */\n\t\tDUK_ASSERT(heap->heap_thread != NULL);\n\t}\n}\n\nDUK_INTERNAL void duk_debug_clear_paused(duk_heap *heap) {\n\tif (duk_debug_is_paused(heap)) {\n\t\tDUK_HEAP_CLEAR_DEBUGGER_PAUSED(heap);\n\t\theap->dbg_state_dirty = 1;\n\t\tduk_debug_clear_pause_state(heap);\n\t\tDUK_ASSERT(heap->ms_running == 1);\n\t\tDUK_ASSERT(heap->ms_prevent_count > 0);\n\t\theap->ms_prevent_count--;\n\t\theap->ms_running = 0;\n\t\tDUK_ASSERT(heap->heap_thread != NULL);\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"trying to clear paused state when not paused, ignoring\"));\n\t}\n}\n\nDUK_INTERNAL void duk_debug_clear_pause_state(duk_heap *heap) {\n\theap->dbg_pause_flags = 0;\n\theap->dbg_pause_act = NULL;\n\theap->dbg_pause_startline = 0;\n}\n\n#else  /* DUK_USE_DEBUGGER_SUPPORT */\n\n/* No debugger support. */\n\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n/* automatic undefs */\n#undef DUK__DBG_TPORT_ENTER\n#undef DUK__DBG_TPORT_EXIT\n#undef DUK__SET_CONN_BROKEN\n#line 1 \"duk_error_augment.c\"\n/*\n *  Augmenting errors at their creation site and their throw site.\n *\n *  When errors are created, traceback data is added by built-in code\n *  and a user error handler (if defined) can process or replace the\n *  error.  Similarly, when errors are thrown, a user error handler\n *  (if defined) can process or replace the error.\n *\n *  Augmentation and other processing at error creation time is nice\n *  because an error is only created once, but it may be thrown and\n *  rethrown multiple times.  User error handler registered for processing\n *  an error at its throw site must be careful to handle rethrowing in\n *  a useful manner.\n *\n *  Error augmentation may throw an internal error (e.g. alloc error).\n *\n *  Ecmascript allows throwing any values, so all values cannot be\n *  augmented.  Currently, the built-in augmentation at error creation\n *  only augments error values which are Error instances (= have the\n *  built-in Error.prototype in their prototype chain) and are also\n *  extensible.  User error handlers have no limitations in this respect.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Helper for calling a user error handler.\n *\n *  'thr' must be the currently active thread; the error handler is called\n *  in its context.  The valstack of 'thr' must have the error value on\n *  top, and will be replaced by another error value based on the return\n *  value of the error handler.\n *\n *  The helper calls duk_handle_call() recursively in protected mode.\n *  Before that call happens, no longjmps should happen; as a consequence,\n *  we must assume that the valstack contains enough temporary space for\n *  arguments and such.\n *\n *  While the error handler runs, any errors thrown will not trigger a\n *  recursive error handler call (this is implemented using a heap level\n *  flag which will \"follow\" through any coroutines resumed inside the\n *  error handler).  If the error handler is not callable or throws an\n *  error, the resulting error replaces the original error (for Duktape\n *  internal errors, duk_error_throw.c further substitutes this error with\n *  a DoubleError which is not ideal).  This would be easy to change and\n *  even signal to the caller.\n *\n *  The user error handler is stored in 'Duktape.errCreate' or\n *  'Duktape.errThrow' depending on whether we're augmenting the error at\n *  creation or throw time.  There are several alternatives to this approach,\n *  see doc/error-objects.rst for discussion.\n *\n *  Note: since further longjmp()s may occur while calling the error handler\n *  (for many reasons, e.g. a labeled 'break' inside the handler), the\n *  caller can make no assumptions on the thr->heap->lj state after the\n *  call (this affects especially duk_error_throw.c).  This is not an issue\n *  as long as the caller writes to the lj state only after the error handler\n *  finishes.\n */\n\n#if defined(DUK_USE_ERRTHROW) || defined(DUK_USE_ERRCREATE)\nDUK_LOCAL void duk__err_augment_user(duk_hthread *thr, duk_small_uint_t stridx_cb) {\n\tduk_tval *tv_hnd;\n\tduk_int_t rc;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT_STRIDX_VALID(stridx_cb);\n\n\tif (thr->heap->augmenting_error) {\n\t\tDUK_D(DUK_DPRINT(\"recursive call to error augmentation, ignore\"));\n\t\treturn;\n\t}\n\n\t/*\n\t *  Check whether or not we have an error handler.\n\t *\n\t *  We must be careful of not triggering an error when looking up the\n\t *  property.  For instance, if the property is a getter, we don't want\n\t *  to call it, only plain values are allowed.  The value, if it exists,\n\t *  is not checked.  If the value is not a function, a TypeError happens\n\t *  when it is called and that error replaces the original one.\n\t */\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, 4);  /* 3 entries actually needed below */\n\n\t/* [ ... errval ] */\n\n\tif (thr->builtins[DUK_BIDX_DUKTAPE] == NULL) {\n\t\t/* When creating built-ins, some of the built-ins may not be set\n\t\t * and we want to tolerate that when throwing errors.\n\t\t */\n\t\tDUK_DD(DUK_DDPRINT(\"error occurred when DUK_BIDX_DUKTAPE is NULL, ignoring\"));\n\t\treturn;\n\t}\n\ttv_hnd = duk_hobject_find_existing_entry_tval_ptr(thr->heap,\n\t                                                  thr->builtins[DUK_BIDX_DUKTAPE],\n\t                                                  DUK_HTHREAD_GET_STRING(thr, stridx_cb));\n\tif (tv_hnd == NULL) {\n\t\tDUK_DD(DUK_DDPRINT(\"error handler does not exist or is not a plain value: %!T\",\n\t\t                   (duk_tval *) tv_hnd));\n\t\treturn;\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"error handler dump (callability not checked): %!T\",\n\t                     (duk_tval *) tv_hnd));\n\tduk_push_tval(thr, tv_hnd);\n\n\t/* [ ... errval errhandler ] */\n\n\tduk_insert(thr, -2);  /* -> [ ... errhandler errval ] */\n\tduk_push_undefined(thr);\n\tduk_insert(thr, -2);  /* -> [ ... errhandler undefined(= this) errval ] */\n\n\t/* [ ... errhandler undefined errval ] */\n\n\t/*\n\t *  heap->augmenting_error prevents recursive re-entry and also causes\n\t *  call handling to use a larger (but not unbounded) call stack limit\n\t *  for the duration of error augmentation.\n\t *\n\t *  We ignore errors now: a success return and an error value both\n\t *  replace the original error value.  (This would be easy to change.)\n\t */\n\n\tDUK_ASSERT(thr->heap->augmenting_error == 0);\n\tthr->heap->augmenting_error = 1;\n\n\trc = duk_pcall_method(thr, 1);\n\tDUK_UNREF(rc);  /* no need to check now: both success and error are OK */\n\n\tDUK_ASSERT(thr->heap->augmenting_error == 1);\n\tthr->heap->augmenting_error = 0;\n\n\t/* [ ... errval ] */\n}\n#endif  /* DUK_USE_ERRTHROW || DUK_USE_ERRCREATE */\n\n/*\n *  Add ._Tracedata to an error on the stack top.\n */\n\n#if defined(DUK_USE_TRACEBACKS)\nDUK_LOCAL void duk__add_traceback(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) {\n\tduk_activation *act;\n\tduk_int_t depth;\n\tduk_int_t arr_size;\n\tduk_tval *tv;\n\tduk_hstring *s;\n\tduk_uint32_t u32;\n\tduk_double_t d;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr_callstack != NULL);\n\n\t/* [ ... error ] */\n\n\t/*\n\t *  The traceback format is pretty arcane in an attempt to keep it compact\n\t *  and cheap to create.  It may change arbitrarily from version to version.\n\t *  It should be decoded/accessed through version specific accessors only.\n\t *\n\t *  See doc/error-objects.rst.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"adding traceback to object: %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/* Preallocate array to correct size, so that we can just write out\n\t * the _Tracedata values into the array part.\n\t */\n\tact = thr->callstack_curr;\n\tdepth = DUK_USE_TRACEBACK_DEPTH;\n\tDUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX);  /* callstack limits */\n\tif (depth > (duk_int_t) thr_callstack->callstack_top) {\n\t\tdepth = (duk_int_t) thr_callstack->callstack_top;\n\t}\n\tif (depth > 0) {\n\t\tif (flags & DUK_AUGMENT_FLAG_SKIP_ONE) {\n\t\t\tDUK_ASSERT(act != NULL);\n\t\t\tact = act->parent;\n\t\t\tdepth--;\n\t\t}\n\t}\n\tarr_size = depth * 2;\n\tif (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) {\n\t\tarr_size += 2;\n\t}\n\tif (c_filename) {\n\t\t/* We need the C filename to be interned before getting the\n\t\t * array part pointer to avoid any GC interference while the\n\t\t * array part is populated.\n\t\t */\n\t\tduk_push_string(thr, c_filename);\n\t\tarr_size += 2;\n\t}\n\n\t/* XXX: uninitialized would be OK */\n\tDUK_D(DUK_DPRINT(\"preallocated _Tracedata to %ld items\", (long) arr_size));\n\ttv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) arr_size);\n\tDUK_ASSERT(arr_size == 0 || tv != NULL);\n\n\t/* Compiler SyntaxErrors (and other errors) come first, and are\n\t * blamed by default (not flagged \"noblame\").\n\t */\n\tif (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) {\n\t\ts = thr->compile_ctx->h_filename;\n\t\tDUK_TVAL_SET_STRING(tv, s);\n\t\tDUK_HSTRING_INCREF(thr, s);\n\t\ttv++;\n\n\t\tu32 = (duk_uint32_t) thr->compile_ctx->curr_token.start_line;  /* (flags<<32) + (line), flags = 0 */\n\t\tDUK_TVAL_SET_U32(tv, u32);\n\t\ttv++;\n\t}\n\n\t/* Filename/line from C macros (__FILE__, __LINE__) are added as an\n\t * entry with a special format: (string, number).  The number contains\n\t * the line and flags.\n\t */\n\n\t/* [ ... error c_filename? arr ] */\n\n\tif (c_filename) {\n\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(thr->valstack_top - 2));\n\t\ts = DUK_TVAL_GET_STRING(thr->valstack_top - 2);  /* interned c_filename */\n\t\tDUK_ASSERT(s != NULL);\n\t\tDUK_TVAL_SET_STRING(tv, s);\n\t\tDUK_HSTRING_INCREF(thr, s);\n\t\ttv++;\n\n\t\td = ((flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) ? ((duk_double_t) DUK_TB_FLAG_NOBLAME_FILELINE) * DUK_DOUBLE_2TO32 : 0.0) +\n\t\t    (duk_double_t) c_line;\n\t\tDUK_TVAL_SET_DOUBLE(tv, d);\n\t\ttv++;\n\t}\n\n\t/* Traceback depth doesn't take into account the filename/line\n\t * special handling above (intentional).\n\t */\n\tfor (; depth-- > 0; act = act->parent) {\n\t\tduk_uint32_t pc;\n\t\tduk_tval *tv_src;\n\n\t\t/* [... arr] */\n\n\t\tDUK_ASSERT(act != NULL);  /* depth check above, assumes book-keeping is correct */\n\t\tDUK_ASSERT_DISABLE(act->pc >= 0);  /* unsigned */\n\n\t\t/* Add function object. */\n\t\ttv_src = &act->tv_func;  /* object (function) or lightfunc */\n\t\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv_src) || DUK_TVAL_IS_LIGHTFUNC(tv_src));\n\t\tDUK_TVAL_SET_TVAL(tv, tv_src);\n\t\tDUK_TVAL_INCREF(thr, tv);\n\t\ttv++;\n\n\t\t/* Add a number containing: pc, activation flags.\n\t\t *\n\t\t * PC points to next instruction, find offending PC.  Note that\n\t\t * PC == 0 for native code.\n\t\t */\n\t\tpc = (duk_uint32_t) duk_hthread_get_act_prev_pc(thr_callstack, act);\n\t\tDUK_ASSERT_DISABLE(pc >= 0);  /* unsigned */\n\t\tDUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32);  /* assume PC is at most 32 bits and non-negative */\n\t\td = ((duk_double_t) act->flags) * DUK_DOUBLE_2TO32 + (duk_double_t) pc;\n\t\tDUK_TVAL_SET_DOUBLE(tv, d);\n\t\ttv++;\n\t}\n\n#if defined(DUK_USE_ASSERTIONS)\n\t{\n\t\tduk_harray *a;\n\t\ta = (duk_harray *) duk_known_hobject(thr, -1);\n\t\tDUK_ASSERT(a != NULL);\n\t\tDUK_ASSERT((duk_uint32_t) (tv - DUK_HOBJECT_A_GET_BASE(thr->heap, (duk_hobject *) a)) == a->length);\n\t\tDUK_ASSERT(a->length == (duk_uint32_t) arr_size);\n\t}\n#endif\n\n\t/* [ ... error c_filename? arr ] */\n\n\tif (c_filename) {\n\t\tduk_remove_m2(thr);\n\t}\n\n\t/* [ ... error arr ] */\n\n\tduk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INT_TRACEDATA);  /* -> [ ... error ] */\n}\n#endif  /* DUK_USE_TRACEBACKS */\n\n/*\n *  Add .fileName and .lineNumber to an error on the stack top.\n */\n\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE) && !defined(DUK_USE_TRACEBACKS)\nDUK_LOCAL void duk__add_fileline(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_int_t entry_top;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\tentry_top = duk_get_top(thr);\n#endif\n\n\t/*\n\t *  If tracebacks are disabled, 'fileName' and 'lineNumber' are added\n\t *  as plain own properties.  Since Error.prototype has accessors of\n\t *  the same name, we need to define own properties directly (cannot\n\t *  just use e.g. duk_put_prop_stridx).  Existing properties are not\n\t *  overwritten in case they already exist.\n\t */\n\n\tif (thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL) {\n\t\t/* Compiler SyntaxError (or other error) gets the primary blame.\n\t\t * Currently no flag to prevent blaming.\n\t\t */\n\t\tduk_push_uint(thr, (duk_uint_t) thr->compile_ctx->curr_token.start_line);\n\t\tduk_push_hstring(thr, thr->compile_ctx->h_filename);\n\t} else if (c_filename && (flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE) == 0) {\n\t\t/* C call site gets blamed next, unless flagged not to do so.\n\t\t * XXX: file/line is disabled in minimal builds, so disable this\n\t\t * too when appropriate.\n\t\t */\n\t\tduk_push_int(thr, c_line);\n\t\tduk_push_string(thr, c_filename);\n\t} else {\n\t\t/* Finally, blame the innermost callstack entry which has a\n\t\t * .fileName property.\n\t\t */\n\t\tduk_small_uint_t depth;\n\t\tduk_uint32_t ecma_line;\n\t\tduk_activation *act;\n\n\t\tDUK_ASSERT(thr_callstack->callstack_top <= DUK_INT_MAX);  /* callstack limits */\n\t\tdepth = DUK_USE_TRACEBACK_DEPTH;\n\t\tif (depth > thr_callstack->callstack_top) {\n\t\t\tdepth = thr_callstack->callstack_top;\n\t\t}\n\t\tfor (act = thr_callstack->callstack_curr; depth-- > 0; act = act->parent) {\n\t\t\tduk_hobject *func;\n\t\t\tduk_uint32_t pc;\n\n\t\t\tDUK_ASSERT(act != NULL);\n\t\t\tfunc = DUK_ACT_GET_FUNC(act);\n\t\t\tif (func == NULL) {\n\t\t\t\t/* Lightfunc, not blamed now. */\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* PC points to next instruction, find offending PC,\n\t\t\t * PC == 0 for native code.\n\t\t\t */\n\t\t\tpc = duk_hthread_get_act_prev_pc(thr, act);  /* thr argument only used for thr->heap, so specific thread doesn't matter */\n\t\t\tDUK_UNREF(pc);\n\t\t\tDUK_ASSERT_DISABLE(pc >= 0);  /* unsigned */\n\t\t\tDUK_ASSERT((duk_double_t) pc < DUK_DOUBLE_2TO32);  /* assume PC is at most 32 bits and non-negative */\n\t\t\tact = NULL;  /* invalidated by pushes, so get out of the way */\n\n\t\t\tduk_push_hobject(thr, func);\n\n\t\t\t/* [ ... error func ] */\n\n\t\t\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_FILE_NAME);\n\t\t\tif (!duk_is_string_notsymbol(thr, -1)) {\n\t\t\t\tduk_pop_2(thr);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* [ ... error func fileName ] */\n\n\t\t\tecma_line = 0;\n#if defined(DUK_USE_PC2LINE)\n\t\t\tif (DUK_HOBJECT_IS_COMPFUNC(func)) {\n\t\t\t\tecma_line = duk_hobject_pc2line_query(thr, -2, (duk_uint_fast32_t) pc);\n\t\t\t} else {\n\t\t\t\t/* Native function, no relevant lineNumber. */\n\t\t\t}\n#endif  /* DUK_USE_PC2LINE */\n\t\t\tduk_push_u32(thr, ecma_line);\n\n\t\t\t/* [ ... error func fileName lineNumber ] */\n\n\t\t\tduk_replace(thr, -3);\n\n\t\t\t/* [ ... error lineNumber fileName ] */\n\t\t\tgoto define_props;\n\t\t}\n\n\t\t/* No activation matches, use undefined for both .fileName and\n\t\t * .lineNumber (matches what we do with a _Tracedata based\n\t\t * no-match lookup.\n\t\t */\n\t\tduk_push_undefined(thr);\n\t\tduk_push_undefined(thr);\n\t}\n\n define_props:\n\t/* [ ... error lineNumber fileName ] */\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(duk_get_top(thr) == entry_top + 2);\n#endif\n\tduk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LINE_NUMBER, DUK_PROPDESC_FLAGS_C | DUK_PROPDESC_FLAG_NO_OVERWRITE);\n}\n#endif  /* DUK_USE_AUGMENT_ERROR_CREATE && !DUK_USE_TRACEBACKS */\n\n/*\n *  Add line number to a compiler error.\n */\n\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\nDUK_LOCAL void duk__add_compiler_error_line(duk_hthread *thr) {\n\n\t/* Append a \"(line NNN)\" to the \"message\" property of any error\n\t * thrown during compilation.  Usually compilation errors are\n\t * SyntaxErrors but they can also be out-of-memory errors and\n\t * the like.\n\t */\n\n\t/* [ ... error ] */\n\n\tDUK_ASSERT(duk_is_object(thr, -1));\n\n\tif (!(thr->compile_ctx != NULL && thr->compile_ctx->h_filename != NULL)) {\n\t\treturn;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"compile error, before adding line info: %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tif (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_MESSAGE)) {\n\t\tduk_push_sprintf(thr, \" (line %ld)\", (long) thr->compile_ctx->curr_token.start_line);\n\t\tduk_concat(thr, 2);\n\t\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_MESSAGE);\n\t} else {\n\t\tduk_pop(thr);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"compile error, after adding line info: %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n}\n#endif  /* DUK_USE_AUGMENT_ERROR_CREATE */\n\n/*\n *  Augment an error being created using Duktape specific properties\n *  like _Tracedata or .fileName/.lineNumber.\n */\n\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\nDUK_LOCAL void duk__err_augment_builtin_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_hobject *obj, duk_small_uint_t flags) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_int_t entry_top;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\tentry_top = duk_get_top(thr);\n#endif\n\tDUK_ASSERT(obj != NULL);\n\n\tDUK_UNREF(obj);  /* unreferenced w/o tracebacks */\n\n\tduk__add_compiler_error_line(thr);\n\n#if defined(DUK_USE_TRACEBACKS)\n\t/* If tracebacks are enabled, the '_Tracedata' property is the only\n\t * thing we need: 'fileName' and 'lineNumber' are virtual properties\n\t * which use '_Tracedata'.\n\t */\n\tif (duk_hobject_hasprop_raw(thr, obj, DUK_HTHREAD_STRING_INT_TRACEDATA(thr))) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"error value already has a '_Tracedata' property, not modifying it\"));\n\t} else {\n\t\tduk__add_traceback(thr, thr_callstack, c_filename, c_line, flags);\n\t}\n#else\n\t/* Without tracebacks the concrete .fileName and .lineNumber need\n\t * to be added directly.\n\t */\n\tduk__add_fileline(thr, thr_callstack, c_filename, c_line, flags);\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(duk_get_top(thr) == entry_top);\n#endif\n}\n#endif  /* DUK_USE_AUGMENT_ERROR_CREATE */\n\n/*\n *  Augment an error at creation time with _Tracedata/fileName/lineNumber\n *  and allow a user error handler (if defined) to process/replace the error.\n *  The error to be augmented is at the stack top.\n *\n *  thr: thread containing the error value\n *  thr_callstack: thread which should be used for generating callstack etc.\n *  c_filename: C __FILE__ related to the error\n *  c_line: C __LINE__ related to the error\n *  flags & DUK_AUGMENT_FLAG_NOBLAME_FILELINE:\n *      if true, don't fileName/line as error source, otherwise use traceback\n *      (needed because user code filename/line are reported but internal ones\n *      are not)\n */\n\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\nDUK_INTERNAL void duk_err_augment_error_create(duk_hthread *thr, duk_hthread *thr_callstack, const char *c_filename, duk_int_t c_line, duk_small_uint_t flags) {\n\tduk_hobject *obj;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr_callstack != NULL);\n\n\t/* [ ... error ] */\n\n\t/*\n\t *  Criteria for augmenting:\n\t *\n\t *   - augmentation enabled in build (naturally)\n\t *   - error value internal prototype chain contains the built-in\n\t *     Error prototype object (i.e. 'val instanceof Error')\n\t *\n\t *  Additional criteria for built-in augmenting:\n\t *\n\t *   - error value is an extensible object\n\t */\n\n\tobj = duk_get_hobject(thr, -1);\n\tif (!obj) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"value is not an object, skip both built-in and user augment\"));\n\t\treturn;\n\t}\n\tif (!duk_hobject_prototype_chain_contains(thr, obj, thr->builtins[DUK_BIDX_ERROR_PROTOTYPE], 1 /*ignore_loop*/)) {\n\t\t/* If the value has a prototype loop, it's critical not to\n\t\t * throw here.  Instead, assume the value is not to be\n\t\t * augmented.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"value is not an error instance, skip both built-in and user augment\"));\n\t\treturn;\n\t}\n\tif (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"error meets criteria, built-in augment\"));\n\t\tduk__err_augment_builtin_create(thr, thr_callstack, c_filename, c_line, obj, flags);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"error does not meet criteria, no built-in augment\"));\n\t}\n\n\t/* [ ... error ] */\n\n#if defined(DUK_USE_ERRCREATE)\n\tduk__err_augment_user(thr, DUK_STRIDX_ERR_CREATE);\n#endif\n}\n#endif  /* DUK_USE_AUGMENT_ERROR_CREATE */\n\n/*\n *  Augment an error at throw time; allow a user error handler (if defined)\n *  to process/replace the error.  The error to be augmented is at the\n *  stack top.\n */\n\n#if defined(DUK_USE_AUGMENT_ERROR_THROW)\nDUK_INTERNAL void duk_err_augment_error_throw(duk_hthread *thr) {\n#if defined(DUK_USE_ERRTHROW)\n\tduk__err_augment_user(thr, DUK_STRIDX_ERR_THROW);\n#endif  /* DUK_USE_ERRTHROW */\n}\n#endif  /* DUK_USE_AUGMENT_ERROR_THROW */\n#line 1 \"duk_error_longjmp.c\"\n/*\n *  Do a longjmp call, calling the fatal error handler if no\n *  catchpoint exists.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_PREFER_SIZE)\nDUK_LOCAL void duk__uncaught_minimal(duk_hthread *thr) {\n\t(void) duk_fatal(thr, \"uncaught error\");\n}\n#endif\n\n#if 0\nDUK_LOCAL void duk__uncaught_readable(duk_hthread *thr) {\n\tconst char *summary;\n\tchar buf[DUK_USE_FATAL_MAXLEN];\n\n\tsummary = duk_push_string_tval_readable(thr, &thr->heap->lj.value1);\n\tDUK_SNPRINTF(buf, sizeof(buf), \"uncaught: %s\", summary);\n\tbuf[sizeof(buf) - 1] = (char) 0;\n\t(void) duk_fatal(thr, (const char *) buf);\n}\n#endif\n\n#if !defined(DUK_USE_PREFER_SIZE)\nDUK_LOCAL void duk__uncaught_error_aware(duk_hthread *thr) {\n\tconst char *summary;\n\tchar buf[DUK_USE_FATAL_MAXLEN];\n\n\tsummary = duk_push_string_tval_readable_error(thr, &thr->heap->lj.value1);\n\tDUK_ASSERT(summary != NULL);\n\tDUK_SNPRINTF(buf, sizeof(buf), \"uncaught: %s\", summary);\n\tbuf[sizeof(buf) - 1] = (char) 0;\n\t(void) duk_fatal(thr, (const char *) buf);\n}\n#endif\n\nDUK_INTERNAL void duk_err_longjmp(duk_hthread *thr) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\tDUK_DD(DUK_DDPRINT(\"longjmp error: type=%d iserror=%d value1=%!T value2=%!T\",\n\t                   (int) thr->heap->lj.type, (int) thr->heap->lj.iserror,\n\t                   &thr->heap->lj.value1, &thr->heap->lj.value2));\n\n\t/* Prevent finalizer execution during error handling.  All error\n\t * handling sites will process pending finalizers once error handling\n\t * is complete and we're ready for the side effects.  Does not prevent\n\t * refzero freeing or mark-and-sweep during error handling.\n\t *\n\t * NOTE: when we come here some calling code may have used DECREF\n\t * NORZ macros without an explicit DUK_REFZERO_CHECK_xxx() call.\n\t * We don't want to do it here because it would just check for\n\t * pending finalizers and we prevent that explicitly.  Instead,\n\t * the error catcher will run the finalizers once error handling\n\t * is complete.\n\t */\n\n\tDUK_ASSERT_LJSTATE_SET(thr->heap);\n\n\tthr->heap->pf_prevent_count++;\n\tDUK_ASSERT(thr->heap->pf_prevent_count != 0);  /* Wrap. */\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* XXX: set this immediately when longjmp state is set */\n\tDUK_ASSERT(thr->heap->error_not_allowed == 0);  /* Detect error within critical section. */\n\tthr->heap->error_not_allowed = 1;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"about to longjmp, pf_prevent_count=%ld\", (long) thr->heap->pf_prevent_count));\n\n#if !defined(DUK_USE_CPP_EXCEPTIONS)\n\t/* If we don't have a jmpbuf_ptr, there is little we can do except\n\t * cause a fatal error.  The caller's expectation is that we never\n\t * return.\n\t *\n\t * With C++ exceptions we now just propagate an uncaught error\n\t * instead of invoking the fatal error handler.  Because there's\n\t * a dummy jmpbuf for C++ exceptions now, this could be changed.\n\t */\n\tif (!thr->heap->lj.jmpbuf_ptr) {\n\t\tDUK_D(DUK_DPRINT(\"uncaught error: type=%d iserror=%d value1=%!T value2=%!T\",\n\t\t                 (int) thr->heap->lj.type, (int) thr->heap->lj.iserror,\n\t\t                 &thr->heap->lj.value1, &thr->heap->lj.value2));\n\n#if defined(DUK_USE_PREFER_SIZE)\n\t\tduk__uncaught_minimal(thr);\n#else\n\t\tduk__uncaught_error_aware(thr);\n#endif\n\t\tDUK_UNREACHABLE();\n\t}\n#endif  /* DUK_USE_CPP_EXCEPTIONS */\n\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\t{\n\t\tduk_internal_exception exc;  /* dummy */\n\t\tthrow exc;\n\t}\n#else  /* DUK_USE_CPP_EXCEPTIONS */\n\tDUK_LONGJMP(thr->heap->lj.jmpbuf_ptr->jb);\n#endif  /* DUK_USE_CPP_EXCEPTIONS */\n\n\tDUK_UNREACHABLE();\n}\n#line 1 \"duk_error_misc.c\"\n/*\n *  Error helpers\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Helper to walk the thread chain and see if there is an active error\n *  catcher.  Protected calls or finally blocks aren't considered catching.\n */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_LOCAL duk_bool_t duk__have_active_catcher(duk_hthread *thr) {\n\t/* As noted above, a protected API call won't be counted as a\n\t * catcher.  This is usually convenient, e.g. in the case of a top-\n\t * level duk_pcall(), but may not always be desirable.  Perhaps add\n\t * an argument to treat them as catchers?\n\t */\n\n\tduk_activation *act;\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tfor (; thr != NULL; thr = thr->resumer) {\n\t\tfor (act = thr->callstack_curr; act != NULL; act = act->parent) {\n\t\t\tfor (cat = act->cat; cat != NULL; cat = cat->parent) {\n\t\t\t\tif (DUK_CAT_HAS_CATCH_ENABLED(cat)) {\n\t\t\t\t\treturn 1;  /* all we need to know */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn 0;\n}\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n/*\n *  Get prototype object for an integer error code.\n */\n\nDUK_INTERNAL duk_hobject *duk_error_prototype_from_code(duk_hthread *thr, duk_errcode_t code) {\n\tswitch (code) {\n\tcase DUK_ERR_EVAL_ERROR:\n\t\treturn thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE];\n\tcase DUK_ERR_RANGE_ERROR:\n\t\treturn thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE];\n\tcase DUK_ERR_REFERENCE_ERROR:\n\t\treturn thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE];\n\tcase DUK_ERR_SYNTAX_ERROR:\n\t\treturn thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE];\n\tcase DUK_ERR_TYPE_ERROR:\n\t\treturn thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE];\n\tcase DUK_ERR_URI_ERROR:\n\t\treturn thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE];\n\tcase DUK_ERR_ERROR:\n\tdefault:\n\t\treturn thr->builtins[DUK_BIDX_ERROR_PROTOTYPE];\n\t}\n}\n\n/*\n *  Helper for debugger throw notify and pause-on-uncaught integration.\n */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_INTERNAL void duk_err_check_debugger_integration(duk_hthread *thr) {\n\tduk_bool_t uncaught;\n\tduk_tval *tv_obj;\n\n\t/* If something is thrown with the debugger attached and nobody will\n\t * catch it, execution is paused before the longjmp, turning over\n\t * control to the debug client.  This allows local state to be examined\n\t * before the stack is unwound.  Errors are not intercepted when debug\n\t * message loop is active (e.g. for Eval).\n\t */\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\t/* XXX: Allow customizing the pause and notify behavior at runtime\n\t * using debugger runtime flags.  For now the behavior is fixed using\n\t * config options.\n\t */\n\n\tif (!duk_debug_is_attached(thr->heap) ||\n\t    thr->heap->dbg_processing ||\n\t    thr->heap->lj.type != DUK_LJ_TYPE_THROW ||\n\t    thr->heap->creating_error) {\n\t\tDUK_D(DUK_DPRINT(\"skip debugger error integration; not attached, debugger processing, not THROW, or error thrown while creating error\"));\n\t\treturn;\n\t}\n\n\t/* Don't intercept a DoubleError, we may have caused the initial double\n\t * fault and attempting to intercept it will cause us to be called\n\t * recursively and exhaust the C stack.  (This should no longer happen\n\t * for the initial throw because DoubleError path doesn't do a debugger\n\t * integration check, but it might happen for rethrows.)\n\t */\n\ttv_obj = &thr->heap->lj.value1;\n\tif (DUK_TVAL_IS_OBJECT(tv_obj) && DUK_TVAL_GET_OBJECT(tv_obj) == thr->builtins[DUK_BIDX_DOUBLE_ERROR]) {\n\t\tDUK_D(DUK_DPRINT(\"built-in DoubleError instance (re)thrown, not intercepting\"));\n\t\treturn;\n\t}\n\n\tuncaught = !duk__have_active_catcher(thr);\n\n\t/* Debugger code expects the value at stack top.  This also serves\n\t * as a backup: we need to store/restore the longjmp state because\n\t * when the debugger is paused Eval commands may be executed and\n\t * they can arbitrarily clobber the longjmp state.\n\t */\n\tduk_push_tval(thr, tv_obj);\n\n\t/* Store and reset longjmp state. */\n\tDUK_ASSERT_LJSTATE_SET(thr->heap);\n\tDUK_TVAL_DECREF_NORZ(thr, tv_obj);\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2));  /* Always for THROW type. */\n\tDUK_TVAL_SET_UNDEFINED(tv_obj);\n\tthr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN;\n\tDUK_ASSERT_LJSTATE_UNSET(thr->heap);\n\n#if defined(DUK_USE_DEBUGGER_THROW_NOTIFY)\n\t/* Report it to the debug client */\n\tDUK_D(DUK_DPRINT(\"throw with debugger attached, report to client\"));\n\tduk_debug_send_throw(thr, uncaught);\n#endif\n\n\tif (uncaught) {\n\t\tif (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_UNCAUGHT_ERROR) {\n\t\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by uncaught error\"));\n\t\t\tduk_debug_halt_execution(thr, 1 /*use_prev_pc*/);\n\t\t}\n\t} else {\n\t\tif (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_CAUGHT_ERROR) {\n\t\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by caught error\"));\n\t\t\tduk_debug_halt_execution(thr, 1 /*use_prev_pc*/);\n\t\t}\n\t}\n\n\t/* Restore longjmp state. */\n\tDUK_ASSERT_LJSTATE_UNSET(thr->heap);\n\tthr->heap->lj.type = DUK_LJ_TYPE_THROW;\n\ttv_obj = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value1));\n\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(&thr->heap->lj.value2));\n\tDUK_TVAL_SET_TVAL(&thr->heap->lj.value1, tv_obj);\n\tDUK_TVAL_INCREF(thr, tv_obj);\n\tDUK_ASSERT_LJSTATE_SET(thr->heap);\n\n\tduk_pop(thr);\n}\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n/*\n *  Helpers for setting up heap longjmp state.\n */\n\nDUK_INTERNAL void duk_err_setup_ljstate1(duk_hthread *thr, duk_small_uint_t lj_type, duk_tval *tv_val) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT(thr != NULL);\n\theap = thr->heap;\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(tv_val != NULL);\n\n\tDUK_ASSERT_LJSTATE_UNSET(heap);\n\n\theap->lj.type = lj_type;\n\tDUK_TVAL_SET_TVAL(&heap->lj.value1, tv_val);\n\tDUK_TVAL_INCREF(thr, tv_val);\n\n\tDUK_ASSERT_LJSTATE_SET(heap);\n}\n#line 1 \"duk_error_throw.c\"\n/*\n *  Create and throw an Ecmascript error object based on a code and a message.\n *\n *  Used when we throw errors internally.  Ecmascript generated error objects\n *  are created by Ecmascript code, and the throwing is handled by the bytecode\n *  executor.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Create and throw an error (originating from Duktape internally)\n *\n *  Push an error object on top of the stack, possibly throw augmenting\n *  the error, and finally longjmp.\n *\n *  If an error occurs while we're dealing with the current error, we might\n *  enter an infinite recursion loop.  This is prevented by detecting a\n *  \"double fault\" through the heap->creating_error flag; the recursion\n *  then stops at the second level.\n */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\nDUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code, const char *msg, const char *filename, duk_int_t line) {\n#else\nDUK_INTERNAL void duk_err_create_and_throw(duk_hthread *thr, duk_errcode_t code) {\n#endif\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\tDUK_DD(DUK_DDPRINT(\"duk_err_create_and_throw(): code=%ld, msg=%s, filename=%s, line=%ld\",\n\t                   (long) code, (const char *) msg,\n\t                   (const char *) filename, (long) line));\n#else\n\tDUK_DD(DUK_DDPRINT(\"duk_err_create_and_throw(): code=%ld\", (long) code));\n#endif\n\n\tDUK_ASSERT(thr != NULL);\n\n\t/* Even though nested call is possible because we throw an error when\n\t * trying to create an error, the potential errors must happen before\n\t * the longjmp state is configured.\n\t */\n\tDUK_ASSERT_LJSTATE_UNSET(thr->heap);\n\n\t/* Sync so that augmentation sees up-to-date activations, NULL\n\t * thr->ptr_curr_pc so that it's not used if side effects occur\n\t * in augmentation or longjmp handling.\n\t */\n\tduk_hthread_sync_and_null_currpc(thr);\n\n\t/*\n\t *  Create and push an error object onto the top of stack.\n\t *  The error is potentially augmented before throwing.\n\t *\n\t *  If a \"double error\" occurs, use a fixed error instance\n\t *  to avoid further trouble.\n\t */\n\n\tif (thr->heap->creating_error) {\n\t\tduk_tval tv_val;\n\t\tduk_hobject *h_err;\n\n\t\tthr->heap->creating_error = 0;\n\n\t\th_err = thr->builtins[DUK_BIDX_DOUBLE_ERROR];\n\t\tif (h_err != NULL) {\n\t\t\tDUK_D(DUK_DPRINT(\"double fault detected -> use built-in fixed 'double error' instance\"));\n\t\t\tDUK_TVAL_SET_OBJECT(&tv_val, h_err);\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"double fault detected; there is no built-in fixed 'double error' instance \"\n\t\t\t                 \"-> use the error code as a number\"));\n\t\t\tDUK_TVAL_SET_I32(&tv_val, (duk_int32_t) code);\n\t\t}\n\n\t\tduk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, &tv_val);\n\n\t\t/* No augmentation to avoid any allocations or side effects. */\n\t} else {\n\t\t/* Prevent infinite recursion.  Extra call stack and C\n\t\t * recursion headroom (see GH-191) is added for augmentation.\n\t\t * That is now signalled by heap->augmenting error and taken\n\t\t * into account in call handling without an explicit limit bump.\n\t\t */\n\t\tthr->heap->creating_error = 1;\n\n\t\tduk_require_stack(thr, 1);\n\n\t\t/* XXX: usually unnecessary '%s' formatting here, but cannot\n\t\t * use 'msg' as a format string directly.\n\t\t */\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\t\tduk_push_error_object_raw(thr,\n\t\t                          code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE,\n\t\t                          filename,\n\t\t                          line,\n\t\t                          \"%s\",\n\t\t                          (const char *) msg);\n#else\n\t\tduk_push_error_object_raw(thr,\n\t\t                          code | DUK_ERRCODE_FLAG_NOBLAME_FILELINE,\n\t\t                          NULL,\n\t\t                          0,\n\t\t                          NULL);\n#endif\n\n\t\t/* Note that an alloc error may happen during error augmentation.\n\t\t * This may happen both when the original error is an alloc error\n\t\t * and when it's something else.  Because any error in augmentation\n\t\t * must be handled correctly anyway, there's no special check for\n\t\t * avoiding it for alloc errors (this differs from Duktape 1.x).\n\t\t */\n#if defined(DUK_USE_AUGMENT_ERROR_THROW)\n\t\tDUK_DDD(DUK_DDDPRINT(\"THROW ERROR (INTERNAL): %!iT (before throw augment)\",\n\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\tduk_err_augment_error_throw(thr);\n#endif\n\n\t\tduk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1));\n\t\tthr->heap->creating_error = 0;\n\n\t\t/* Error is now created and we assume no errors can occur any\n\t\t * more.  Check for debugger Throw integration only when the\n\t\t * error is complete.  If we enter debugger message loop,\n\t\t * creating_error must be 0 so that errors can be thrown in\n\t\t * the paused state, e.g. in Eval commands.\n\t\t */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t\tduk_err_check_debugger_integration(thr);\n#endif\n\t}\n\n\t/*\n\t *  Finally, longjmp\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"THROW ERROR (INTERNAL): %!iT, %!iT (after throw augment)\",\n\t                     (duk_tval *) &thr->heap->lj.value1, (duk_tval *) &thr->heap->lj.value2));\n\n\tduk_err_longjmp(thr);\n\tDUK_UNREACHABLE();\n}\n\n/*\n *  Helper for C function call negative return values.\n */\n\nDUK_INTERNAL void duk_error_throw_from_negative_rc(duk_hthread *thr, duk_ret_t rc) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(rc < 0);\n\n\t/*\n\t *  The __FILE__ and __LINE__ information is intentionally not used in the\n\t *  creation of the error object, as it isn't useful in the tracedata.  The\n\t *  tracedata still contains the function which returned the negative return\n\t *  code, and having the file/line of this function isn't very useful.\n\t *\n\t *  The error messages for DUK_RET_xxx shorthand are intentionally very\n\t *  minimal: they're only really useful for low memory targets.\n\t */\n\n\tduk_error_raw(thr, -rc, NULL, 0, \"error (rc %ld)\", (long) rc);\n\tDUK_UNREACHABLE();\n}\n#line 1 \"duk_hbuffer_alloc.c\"\n/*\n *  duk_hbuffer allocation and freeing.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Allocate a new duk_hbuffer of a certain type and return a pointer to it\n * (NULL on error).  Write buffer data pointer to 'out_bufdata' (only if\n * allocation successful).\n */\nDUK_INTERNAL duk_hbuffer *duk_hbuffer_alloc(duk_heap *heap, duk_size_t size, duk_small_uint_t flags, void **out_bufdata) {\n\tduk_hbuffer *res = NULL;\n\tduk_size_t header_size;\n\tduk_size_t alloc_size;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(out_bufdata != NULL);\n\n\tDUK_DDD(DUK_DDDPRINT(\"allocate hbuffer\"));\n\n\t/* Size sanity check.  Should not be necessary because caller is\n\t * required to check this, but we don't want to cause a segfault\n\t * if the size wraps either in duk_size_t computation or when\n\t * storing the size in a 16-bit field.\n\t */\n\tif (size > DUK_HBUFFER_MAX_BYTELEN) {\n\t\tDUK_D(DUK_DPRINT(\"hbuffer alloc failed: size too large: %ld\", (long) size));\n\t\treturn NULL;  /* no need to write 'out_bufdata' */\n\t}\n\n\tif (flags & DUK_BUF_FLAG_EXTERNAL) {\n\t\theader_size = sizeof(duk_hbuffer_external);\n\t\talloc_size = sizeof(duk_hbuffer_external);\n\t} else if (flags & DUK_BUF_FLAG_DYNAMIC) {\n\t\theader_size = sizeof(duk_hbuffer_dynamic);\n\t\talloc_size = sizeof(duk_hbuffer_dynamic);\n\t} else {\n\t\theader_size = sizeof(duk_hbuffer_fixed);\n\t\talloc_size = sizeof(duk_hbuffer_fixed) + size;\n\t\tDUK_ASSERT(alloc_size >= sizeof(duk_hbuffer_fixed));  /* no wrapping */\n\t}\n\n\tres = (duk_hbuffer *) DUK_ALLOC(heap, alloc_size);\n\tif (DUK_UNLIKELY(res == NULL)) {\n\t\tgoto alloc_error;\n\t}\n\n\t/* zero everything unless requested not to do so */\n#if defined(DUK_USE_ZERO_BUFFER_DATA)\n\tDUK_MEMZERO((void *) res,\n\t            (flags & DUK_BUF_FLAG_NOZERO) ? header_size : alloc_size);\n#else\n\tDUK_MEMZERO((void *) res, header_size);\n#endif\n\n\tif (flags & DUK_BUF_FLAG_EXTERNAL) {\n\t\tduk_hbuffer_external *h;\n\t\th = (duk_hbuffer_external *) res;\n\t\tDUK_UNREF(h);\n\t\t*out_bufdata = NULL;\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n#if defined(DUK_USE_HEAPPTR16)\n/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */\n#else\n\t\tDUK_HBUFFER_EXTERNAL_SET_DATA_PTR(heap, h, NULL);\n#endif\n#endif\n\t\tDUK_ASSERT(DUK_HBUFFER_EXTERNAL_GET_DATA_PTR(heap, h) == NULL);\n\t} else if (flags & DUK_BUF_FLAG_DYNAMIC) {\n\t\tduk_hbuffer_dynamic *h = (duk_hbuffer_dynamic *) res;\n\t\tvoid *ptr;\n\n\t\tif (size > 0) {\n\t\t\tDUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL));  /* alloc external with size zero */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"dynamic buffer with nonzero size, alloc actual buffer\"));\n#if defined(DUK_USE_ZERO_BUFFER_DATA)\n\t\t\tptr = DUK_ALLOC_ZEROED(heap, size);\n#else\n\t\t\tptr = DUK_ALLOC(heap, size);\n#endif\n\t\t\tif (DUK_UNLIKELY(ptr == NULL)) {\n\t\t\t\t/* Because size > 0, NULL check is correct */\n\t\t\t\tgoto alloc_error;\n\t\t\t}\n\t\t\t*out_bufdata = ptr;\n\n\t\t\tDUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, ptr);\n\t\t} else {\n\t\t\t*out_bufdata = NULL;\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n#if defined(DUK_USE_HEAPPTR16)\n/* the compressed pointer is zeroed which maps to NULL, so nothing to do. */\n#else\n\t\t\tDUK_HBUFFER_DYNAMIC_SET_DATA_PTR(heap, h, NULL);\n#endif\n#endif\n\t\t\tDUK_ASSERT(DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, h) == NULL);\n\t\t}\n\t} else {\n\t\t*out_bufdata = (void *) ((duk_hbuffer_fixed *) res + 1);\n\t}\n\n\tDUK_HBUFFER_SET_SIZE(res, size);\n\n\tDUK_HEAPHDR_SET_TYPE(&res->hdr, DUK_HTYPE_BUFFER);\n\tif (flags & DUK_BUF_FLAG_DYNAMIC) {\n\t\tDUK_HBUFFER_SET_DYNAMIC(res);\n\t\tif (flags & DUK_BUF_FLAG_EXTERNAL) {\n\t\t\tDUK_HBUFFER_SET_EXTERNAL(res);\n\t\t}\n\t} else {\n\t\tDUK_ASSERT(!(flags & DUK_BUF_FLAG_EXTERNAL));\n\t}\n        DUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &res->hdr);\n\n\tDUK_DDD(DUK_DDDPRINT(\"allocated hbuffer: %p\", (void *) res));\n\treturn res;\n\n alloc_error:\n\tDUK_DD(DUK_DDPRINT(\"hbuffer allocation failed\"));\n\n\tDUK_FREE(heap, res);\n\treturn NULL;  /* no need to write 'out_bufdata' */\n}\n\n/* For indirect allocs. */\n\nDUK_INTERNAL void *duk_hbuffer_get_dynalloc_ptr(duk_heap *heap, void *ud) {\n\tduk_hbuffer_dynamic *buf = (duk_hbuffer_dynamic *) ud;\n\tDUK_UNREF(heap);\n\treturn (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, buf);\n}\n#line 1 \"duk_hbuffer_ops.c\"\n/*\n *  duk_hbuffer operations such as resizing and inserting/appending data to\n *  a dynamic buffer.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Resizing\n */\n\nDUK_INTERNAL void duk_hbuffer_resize(duk_hthread *thr, duk_hbuffer_dynamic *buf, duk_size_t new_size) {\n\tvoid *res;\n\tduk_size_t prev_size;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(buf != NULL);\n\tDUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf));\n\tDUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf));\n\n\t/*\n\t *  Maximum size check\n\t */\n\n\tif (new_size > DUK_HBUFFER_MAX_BYTELEN) {\n\t\tDUK_ERROR_RANGE(thr, \"buffer too long\");\n\t}\n\n\t/*\n\t *  Note: use indirect realloc variant just in case mark-and-sweep\n\t *  (finalizers) might resize this same buffer during garbage\n\t *  collection.\n\t */\n\n\tres = DUK_REALLOC_INDIRECT(thr->heap, duk_hbuffer_get_dynalloc_ptr, (void *) buf, new_size);\n\tif (DUK_LIKELY(res != NULL || new_size == 0)) {\n\t\t/* 'res' may be NULL if new allocation size is 0. */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"resized dynamic buffer %p:%ld -> %p:%ld\",\n\t\t                     (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, buf),\n\t\t                     (long) DUK_HBUFFER_DYNAMIC_GET_SIZE(buf),\n\t\t                     (void *) res,\n\t\t                     (long) new_size));\n\n\t\t/*\n\t\t *  The entire allocated buffer area, regardless of actual used\n\t\t *  size, is kept zeroed in resizes for simplicity.  If the buffer\n\t\t *  is grown, zero the new part.\n\t\t */\n\n\t\tprev_size = DUK_HBUFFER_DYNAMIC_GET_SIZE(buf);\n\t\tif (new_size > prev_size) {\n\t\t\tDUK_ASSERT(new_size - prev_size > 0);\n#if defined(DUK_USE_ZERO_BUFFER_DATA)\n\t\t\tDUK_MEMZERO((void *) ((char *) res + prev_size),\n\t\t\t            (duk_size_t) (new_size - prev_size));\n#endif\n\t\t}\n\n\t\tDUK_HBUFFER_DYNAMIC_SET_SIZE(buf, new_size);\n\t\tDUK_HBUFFER_DYNAMIC_SET_DATA_PTR(thr->heap, buf, res);\n\t} else {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\n\tDUK_ASSERT(res != NULL || new_size == 0);\n}\n\nDUK_INTERNAL void duk_hbuffer_reset(duk_hthread *thr, duk_hbuffer_dynamic *buf) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(buf != NULL);\n\tDUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(buf));\n\tDUK_ASSERT(!DUK_HBUFFER_HAS_EXTERNAL(buf));\n\n\tduk_hbuffer_resize(thr, buf, 0);\n}\n/* #include duk_internal.h -> already included */\n#line 2 \"duk_hbufobj_misc.c\"\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_uint_t duk_hbufobj_clamp_bytelength(duk_hbufobj *h_bufobj, duk_uint_t len) {\n\tduk_uint_t buf_size;\n\tduk_uint_t buf_avail;\n\n\tDUK_ASSERT(h_bufobj != NULL);\n\tDUK_ASSERT(h_bufobj->buf != NULL);\n\n\tbuf_size = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_bufobj->buf);\n\tif (h_bufobj->offset > buf_size) {\n\t\t/* Slice starting point is beyond current length. */\n\t\treturn 0;\n\t}\n\tbuf_avail = buf_size - h_bufobj->offset;\n\n\treturn buf_avail >= len ? len : buf_avail;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n#line 1 \"duk_heap_alloc.c\"\n/*\n *  duk_heap allocation and freeing.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_ROM_STRINGS)\n/* Fixed seed value used with ROM strings. */\n#define DUK__FIXED_HASH_SEED       0xabcd1234\n#endif\n\n/*\n *  Free a heap object.\n *\n *  Free heap object and its internal (non-heap) pointers.  Assumes that\n *  caller has removed the object from heap allocated list or the string\n *  intern table, and any weak references (which strings may have) have\n *  been already dealt with.\n */\n\nDUK_INTERNAL void duk_free_hobject(duk_heap *heap, duk_hobject *h) {\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_FREE(heap, DUK_HOBJECT_GET_PROPS(heap, h));\n\n\tif (DUK_HOBJECT_IS_COMPFUNC(h)) {\n\t\tduk_hcompfunc *f = (duk_hcompfunc *) h;\n\t\tDUK_UNREF(f);\n\t\t/* Currently nothing to free; 'data' is a heap object */\n\t} else if (DUK_HOBJECT_IS_NATFUNC(h)) {\n\t\tduk_hnatfunc *f = (duk_hnatfunc *) h;\n\t\tDUK_UNREF(f);\n\t\t/* Currently nothing to free */\n\t} else if (DUK_HOBJECT_IS_THREAD(h)) {\n\t\tduk_hthread *t = (duk_hthread *) h;\n\t\tduk_activation *act;\n\n\t\tDUK_FREE(heap, t->valstack);\n\n\t\t/* Don't free h->resumer because it exists in the heap.\n\t\t * Callstack entries also contain function pointers which\n\t\t * are not freed for the same reason.  They are decref\n\t\t * finalized and the targets are freed if necessary based\n\t\t * on their refcount (or reachability).\n\t\t */\n\t\tfor (act = t->callstack_curr; act != NULL;) {\n\t\t\tduk_activation *act_next;\n\t\t\tduk_catcher *cat;\n\n\t\t\tfor (cat = act->cat; cat != NULL;) {\n\t\t\t\tduk_catcher *cat_next;\n\n\t\t\t\tcat_next = cat->parent;\n\t\t\t\tDUK_FREE(heap, (void *) cat);\n\t\t\t\tcat = cat_next;\n\t\t\t}\n\n\t\t\tact_next = act->parent;\n\t\t\tDUK_FREE(heap, (void *) act);\n\t\t\tact = act_next;\n\t\t}\n\n\t\t/* XXX: with 'caller' property the callstack would need\n\t\t * to be unwound to update the 'caller' properties of\n\t\t * functions in the callstack.\n\t\t */\n\t} else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) {\n\t\tduk_hboundfunc *f = (duk_hboundfunc *) h;\n\n\t\tDUK_FREE(heap, f->args);\n\t}\n\n\tDUK_FREE(heap, (void *) h);\n}\n\nDUK_INTERNAL void duk_free_hbuffer(duk_heap *heap, duk_hbuffer *h) {\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(h != NULL);\n\n\tif (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h)) {\n\t\tduk_hbuffer_dynamic *g = (duk_hbuffer_dynamic *) h;\n\t\tDUK_DDD(DUK_DDDPRINT(\"free dynamic buffer %p\", (void *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g)));\n\t\tDUK_FREE(heap, DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(heap, g));\n\t}\n\tDUK_FREE(heap, (void *) h);\n}\n\nDUK_INTERNAL void duk_free_hstring(duk_heap *heap, duk_hstring *h) {\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(h != NULL);\n\n\tDUK_UNREF(heap);\n\tDUK_UNREF(h);\n\n#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_FREE)\n\tif (DUK_HSTRING_HAS_EXTDATA(h)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"free extstr: hstring %!O, extdata: %p\",\n\t\t                     h, DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h)));\n\t\tDUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) DUK_HSTRING_GET_EXTDATA((duk_hstring_external *) h));\n\t}\n#endif\n\tDUK_FREE(heap, (void *) h);\n}\n\nDUK_INTERNAL void duk_heap_free_heaphdr_raw(duk_heap *heap, duk_heaphdr *hdr) {\n\tDUK_ASSERT(heap);\n\tDUK_ASSERT(hdr);\n\n\tDUK_DDD(DUK_DDDPRINT(\"free heaphdr %p, htype %ld\", (void *) hdr, (long) DUK_HEAPHDR_GET_TYPE(hdr)));\n\n\tswitch (DUK_HEAPHDR_GET_TYPE(hdr)) {\n\tcase DUK_HTYPE_STRING:\n\t\tduk_free_hstring(heap, (duk_hstring *) hdr);\n\t\tbreak;\n\tcase DUK_HTYPE_OBJECT:\n\t\tduk_free_hobject(heap, (duk_hobject *) hdr);\n\t\tbreak;\n\tdefault:\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) == DUK_HTYPE_BUFFER);\n\t\tduk_free_hbuffer(heap, (duk_hbuffer *) hdr);\n\t}\n\n}\n\n/*\n *  Free the heap.\n *\n *  Frees heap-related non-heap-tracked allocations such as the\n *  string intern table; then frees the heap allocated objects;\n *  and finally frees the heap structure itself.  Reference counts\n *  and GC markers are ignored (and not updated) in this process,\n *  and finalizers won't be called.\n *\n *  The heap pointer and heap object pointers must not be used\n *  after this call.\n */\n\n#if defined(DUK_USE_CACHE_ACTIVATION)\nDUK_LOCAL duk_size_t duk__heap_free_activation_freelist(duk_heap *heap) {\n\tduk_activation *act;\n\tduk_activation *act_next;\n\tduk_size_t count_act = 0;\n\n\tfor (act = heap->activation_free; act != NULL;) {\n\t\tact_next = act->parent;\n\t\tDUK_FREE(heap, (void *) act);\n\t\tact = act_next;\n#if defined(DUK_USE_DEBUG)\n\t\tcount_act++;\n#endif\n\t}\n\theap->activation_free = NULL;  /* needed when called from mark-and-sweep */\n\treturn count_act;\n}\n#endif  /* DUK_USE_CACHE_ACTIVATION */\n\n#if defined(DUK_USE_CACHE_CATCHER)\nDUK_LOCAL duk_size_t duk__heap_free_catcher_freelist(duk_heap *heap) {\n\tduk_catcher *cat;\n\tduk_catcher *cat_next;\n\tduk_size_t count_cat = 0;\n\n\tfor (cat = heap->catcher_free; cat != NULL;) {\n\t\tcat_next = cat->parent;\n\t\tDUK_FREE(heap, (void *) cat);\n\t\tcat = cat_next;\n#if defined(DUK_USE_DEBUG)\n\t\tcount_cat++;\n#endif\n\t}\n\theap->catcher_free = NULL;  /* needed when called from mark-and-sweep */\n\n\treturn count_cat;\n}\n#endif  /* DUK_USE_CACHE_CATCHER */\n\nDUK_INTERNAL void duk_heap_free_freelists(duk_heap *heap) {\n\tduk_size_t count_act = 0;\n\tduk_size_t count_cat = 0;\n\n#if defined(DUK_USE_CACHE_ACTIVATION)\n\tcount_act = duk__heap_free_activation_freelist(heap);\n#endif\n#if defined(DUK_USE_CACHE_CATCHER)\n\tcount_cat = duk__heap_free_catcher_freelist(heap);\n#endif\n\tDUK_UNREF(heap);\n\tDUK_UNREF(count_act);\n\tDUK_UNREF(count_cat);\n\n\tDUK_D(DUK_DPRINT(\"freed %ld activation freelist entries, %ld catcher freelist entries\",\n\t                 (long) count_act, (long) count_cat));\n}\n\nDUK_LOCAL void duk__free_allocated(duk_heap *heap) {\n\tduk_heaphdr *curr;\n\tduk_heaphdr *next;\n\n\tcurr = heap->heap_allocated;\n\twhile (curr) {\n\t\t/* We don't log or warn about freeing zero refcount objects\n\t\t * because they may happen with finalizer processing.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"FINALFREE (allocated): %!iO\",\n\t\t                     (duk_heaphdr *) curr));\n\t\tnext = DUK_HEAPHDR_GET_NEXT(heap, curr);\n\t\tduk_heap_free_heaphdr_raw(heap, curr);\n\t\tcurr = next;\n\t}\n}\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_LOCAL void duk__free_finalize_list(duk_heap *heap) {\n\tduk_heaphdr *curr;\n\tduk_heaphdr *next;\n\n\tcurr = heap->finalize_list;\n\twhile (curr) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"FINALFREE (finalize_list): %!iO\",\n\t\t                     (duk_heaphdr *) curr));\n\t\tnext = DUK_HEAPHDR_GET_NEXT(heap, curr);\n\t\tduk_heap_free_heaphdr_raw(heap, curr);\n\t\tcurr = next;\n\t}\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\nDUK_LOCAL void duk__free_stringtable(duk_heap *heap) {\n\t/* strings are only tracked by stringtable */\n\tduk_heap_strtable_free(heap);\n}\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_LOCAL void duk__free_run_finalizers(duk_heap *heap) {\n\tduk_heaphdr *curr;\n\tduk_uint_t round_no;\n\tduk_size_t count_all;\n\tduk_size_t count_finalized;\n\tduk_size_t curr_limit;\n\n\tDUK_ASSERT(heap != NULL);\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);  /* refzero not running -> must be empty */\n#endif\n\tDUK_ASSERT(heap->finalize_list == NULL);  /* mark-and-sweep last pass */\n\n\tif (heap->heap_thread == NULL) {\n\t\t/* May happen when heap allocation fails right off.  There\n\t\t * cannot be any finalizable objects in this case.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"no heap_thread in heap destruct, assume no finalizable objects\"));\n\t\treturn;\n\t}\n\n\t/* Prevent finalize_list processing and mark-and-sweep entirely.\n\t * Setting ms_running = 1 also prevents refzero handling from moving\n\t * objects away from the heap_allocated list (the flag name is a bit\n\t * misleading here).\n\t */\n\tDUK_ASSERT(heap->pf_prevent_count == 0);\n\theap->pf_prevent_count = 1;\n\tDUK_ASSERT(heap->ms_running == 0);\n\theap->ms_running = 1;\n\tDUK_ASSERT(heap->ms_prevent_count == 0);\n\theap->ms_prevent_count = 1;  /* Bump, because mark-and-sweep assumes it's bumped when ms_running is set. */\n\n\tcurr_limit = 0;  /* suppress warning, not used */\n\tfor (round_no = 0; ; round_no++) {\n\t\tcurr = heap->heap_allocated;\n\t\tcount_all = 0;\n\t\tcount_finalized = 0;\n\t\twhile (curr) {\n\t\t\tcount_all++;\n\t\t\tif (DUK_HEAPHDR_IS_OBJECT(curr)) {\n\t\t\t\t/* Only objects in heap_allocated may have finalizers.  Check that\n\t\t\t\t * the object itself has a _Finalizer property (own or inherited)\n\t\t\t\t * so that we don't execute finalizers for e.g. Proxy objects.\n\t\t\t\t */\n\t\t\t\tDUK_ASSERT(curr != NULL);\n\n\t\t\t\tif (DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) curr)) {\n\t\t\t\t\tif (!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) curr)) {\n\t\t\t\t\t\tDUK_ASSERT(DUK_HEAP_HAS_FINALIZER_NORESCUE(heap));  /* maps to finalizer 2nd argument */\n\t\t\t\t\t\tduk_heap_run_finalizer(heap, (duk_hobject *) curr);\n\t\t\t\t\t\tcount_finalized++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurr = DUK_HEAPHDR_GET_NEXT(heap, curr);\n\t\t}\n\n\t\t/* Each round of finalizer execution may spawn new finalizable objects\n\t\t * which is normal behavior for some applications.  Allow multiple\n\t\t * rounds of finalization, but use a shrinking limit based on the\n\t\t * first round to detect the case where a runaway finalizer creates\n\t\t * an unbounded amount of new finalizable objects.  Finalizer rescue\n\t\t * is not supported: the semantics are unclear because most of the\n\t\t * objects being finalized here are already reachable.  The finalizer\n\t\t * is given a boolean to indicate that rescue is not possible.\n\t\t *\n\t\t * See discussion in: https://github.com/svaarala/duktape/pull/473\n\t\t */\n\n\t\tif (round_no == 0) {\n\t\t\t/* Cannot wrap: each object is at least 8 bytes so count is\n\t\t\t * at most 1/8 of that.\n\t\t\t */\n\t\t\tcurr_limit = count_all * 2;\n\t\t} else {\n\t\t\tcurr_limit = (curr_limit * 3) / 4;   /* Decrease by 25% every round */\n\t\t}\n\t\tDUK_D(DUK_DPRINT(\"finalizer round %ld complete, %ld objects, tried to execute %ld finalizers, current limit is %ld\",\n\t\t                 (long) round_no, (long) count_all, (long) count_finalized, (long) curr_limit));\n\n\t\tif (count_finalized == 0) {\n\t\t\tDUK_D(DUK_DPRINT(\"no more finalizable objects, forced finalization finished\"));\n\t\t\tbreak;\n\t\t}\n\t\tif (count_finalized >= curr_limit) {\n\t\t\tDUK_D(DUK_DPRINT(\"finalizer count above limit, potentially runaway finalizer; skip remaining finalizers\"));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tDUK_ASSERT(heap->ms_running == 1);\n\theap->ms_running = 0;\n\tDUK_ASSERT(heap->pf_prevent_count == 1);\n\theap->pf_prevent_count = 0;\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\nDUK_INTERNAL void duk_heap_free(duk_heap *heap) {\n\tDUK_D(DUK_DPRINT(\"free heap: %p\", (void *) heap));\n\n#if defined(DUK_USE_DEBUG)\n\tduk_heap_strtable_dump(heap);\n#endif\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t/* Detach a debugger if attached (can be called multiple times)\n\t * safely.\n\t */\n\t/* XXX: Add a flag to reject an attempt to re-attach?  Otherwise\n\t * the detached callback may immediately reattach.\n\t */\n\tduk_debug_do_detach(heap);\n#endif\n\n\t/* Execute finalizers before freeing the heap, even for reachable\n\t * objects.  This gives finalizers the chance to free any native\n\t * resources like file handles, allocations made outside Duktape,\n\t * etc.  This is quite tricky to get right, so that all finalizer\n\t * guarantees are honored.\n\t *\n\t * Run mark-and-sweep a few times just in case (unreachable object\n\t * finalizers run already here).  The last round must rescue objects\n\t * from the previous round without running any more finalizers.  This\n\t * ensures rescued objects get their FINALIZED flag cleared so that\n\t * their finalizer is called once more in forced finalization to\n\t * satisfy finalizer guarantees.  However, we don't want to run any\n\t * more finalizers because that'd required one more loop, and so on.\n\t *\n\t * XXX: this perhaps requires an execution time limit.\n\t */\n\tDUK_D(DUK_DPRINT(\"execute finalizers before freeing heap\"));\n\tDUK_ASSERT(heap->pf_skip_finalizers == 0);\n\tDUK_D(DUK_DPRINT(\"forced gc #1 in heap destruction\"));\n\tduk_heap_mark_and_sweep(heap, 0);\n\tDUK_D(DUK_DPRINT(\"forced gc #2 in heap destruction\"));\n\tduk_heap_mark_and_sweep(heap, 0);\n\tDUK_D(DUK_DPRINT(\"forced gc #3 in heap destruction (don't run finalizers)\"));\n\theap->pf_skip_finalizers = 1;\n\tduk_heap_mark_and_sweep(heap, 0);  /* Skip finalizers; queue finalizable objects to heap_allocated. */\n\n\t/* There are never objects in refzero_list at this point, or at any\n\t * point beyond a DECREF (even a DECREF_NORZ).  Since Duktape 2.1\n\t * refzero_list processing is side effect free, so it is always\n\t * processed to completion by a DECREF initially triggering a zero\n\t * refcount.\n\t */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);  /* Always processed to completion inline. */\n#endif\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tDUK_ASSERT(heap->finalize_list == NULL);  /* Last mark-and-sweep with skip_finalizers. */\n#endif\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tDUK_D(DUK_DPRINT(\"run finalizers for remaining finalizable objects\"));\n\tDUK_HEAP_SET_FINALIZER_NORESCUE(heap);  /* Rescue no longer supported. */\n\tduk__free_run_finalizers(heap);\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n\t/* Note: heap->heap_thread, heap->curr_thread, and heap->heap_object\n\t * are on the heap allocated list.\n\t */\n\n\tDUK_D(DUK_DPRINT(\"freeing temporary freelists\"));\n\tduk_heap_free_freelists(heap);\n\n\tDUK_D(DUK_DPRINT(\"freeing heap_allocated of heap: %p\", (void *) heap));\n\tduk__free_allocated(heap);\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);  /* Always processed to completion inline. */\n#endif\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tDUK_D(DUK_DPRINT(\"freeing finalize_list of heap: %p\", (void *) heap));\n\tduk__free_finalize_list(heap);\n#endif\n\n\tDUK_D(DUK_DPRINT(\"freeing string table of heap: %p\", (void *) heap));\n\tduk__free_stringtable(heap);\n\n\tDUK_D(DUK_DPRINT(\"freeing heap structure: %p\", (void *) heap));\n\theap->free_func(heap->heap_udata, heap);\n}\n\n/*\n *  Allocate a heap.\n *\n *  String table is initialized with built-in strings from genbuiltins.py,\n *  either by dynamically creating the strings or by referring to ROM strings.\n */\n\n#if defined(DUK_USE_ROM_STRINGS)\nDUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_small_uint_t i;\n#endif\n\n\tDUK_UNREF(heap);\n\n\t/* With ROM-based strings, heap->strs[] and thr->strs[] are omitted\n\t * so nothing to initialize for strs[].\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\tfor (i = 0; i < sizeof(duk_rom_strings_lookup) / sizeof(const duk_hstring *); i++) {\n\t\tconst duk_hstring *h;\n\t\tduk_uint32_t hash;\n\n\t\th = duk_rom_strings_lookup[i];\n\t\twhile (h != NULL) {\n\t\t\thash = duk_heap_hashstring(heap, (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));\n\t\t\tDUK_DD(DUK_DDPRINT(\"duk_rom_strings_lookup[%d] -> hash 0x%08lx, computed 0x%08lx\",\n\t\t\t                   (int) i, (unsigned long) DUK_HSTRING_GET_HASH(h), (unsigned long) hash));\n\t\t\tDUK_ASSERT(hash == (duk_uint32_t) DUK_HSTRING_GET_HASH(h));\n\n\t\t\th = (const duk_hstring *) h->hdr.h_next;\n\t\t}\n\t}\n#endif\n\treturn 1;\n}\n#else  /* DUK_USE_ROM_STRINGS */\n\nDUK_LOCAL duk_bool_t duk__init_heap_strings(duk_heap *heap) {\n\tduk_bitdecoder_ctx bd_ctx;\n\tduk_bitdecoder_ctx *bd = &bd_ctx;  /* convenience */\n\tduk_small_uint_t i;\n\n\tDUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));\n\tbd->data = (const duk_uint8_t *) duk_strings_data;\n\tbd->length = (duk_size_t) DUK_STRDATA_DATA_LENGTH;\n\n\tfor (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) {\n\t\tduk_uint8_t tmp[DUK_STRDATA_MAX_STRLEN];\n\t\tduk_small_uint_t len;\n\t\tduk_hstring *h;\n\n\t\tlen = duk_bd_decode_bitpacked_string(bd, tmp);\n\n\t\t/* No need to length check string: it will never exceed even\n\t\t * the 16-bit length maximum.\n\t\t */\n\t\tDUK_ASSERT(len <= 0xffffUL);\n\t\tDUK_DDD(DUK_DDDPRINT(\"intern built-in string %ld\", (long) i));\n\t\th = duk_heap_strtable_intern(heap, tmp, len);\n\t\tif (!h) {\n\t\t\tgoto failed;\n\t\t}\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h));\n\n\t\t/* Special flags checks.  Since these strings are always\n\t\t * reachable and a string cannot appear twice in the string\n\t\t * table, there's no need to check/set these flags elsewhere.\n\t\t * The 'internal' flag is set by string intern code.\n\t\t */\n\t\tif (i == DUK_STRIDX_EVAL || i == DUK_STRIDX_LC_ARGUMENTS) {\n\t\t\tDUK_HSTRING_SET_EVAL_OR_ARGUMENTS(h);\n\t\t}\n\t\tif (i >= DUK_STRIDX_START_RESERVED && i < DUK_STRIDX_END_RESERVED) {\n\t\t\tDUK_HSTRING_SET_RESERVED_WORD(h);\n\t\t\tif (i >= DUK_STRIDX_START_STRICT_RESERVED) {\n\t\t\t\tDUK_HSTRING_SET_STRICT_RESERVED_WORD(h);\n\t\t\t}\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"interned: %!O\", (duk_heaphdr *) h));\n\n\t\t/* XXX: The incref macro takes a thread pointer but doesn't\n\t\t * use it right now.\n\t\t */\n\t\tDUK_HSTRING_INCREF(_never_referenced_, h);\n\n#if defined(DUK_USE_HEAPPTR16)\n\t\theap->strs16[i] = DUK_USE_HEAPPTR_ENC16(heap->heap_udata, (void *) h);\n#else\n\t\theap->strs[i] = h;\n#endif\n\t}\n\n\treturn 1;\n\n failed:\n\treturn 0;\n}\n#endif  /* DUK_USE_ROM_STRINGS */\n\nDUK_LOCAL duk_bool_t duk__init_heap_thread(duk_heap *heap) {\n\tduk_hthread *thr;\n\n\tDUK_D(DUK_DPRINT(\"heap init: alloc heap thread\"));\n\tthr = duk_hthread_alloc_unchecked(heap,\n\t                                  DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                  DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD));\n\tif (thr == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"failed to alloc heap_thread\"));\n\t\treturn 0;\n\t}\n\tthr->state = DUK_HTHREAD_STATE_INACTIVE;\n#if defined(DUK_USE_ROM_STRINGS)\n\t/* No strs[] pointer. */\n#else  /* DUK_USE_ROM_STRINGS */\n#if defined(DUK_USE_HEAPPTR16)\n\tthr->strs16 = heap->strs16;\n#else\n\tthr->strs = heap->strs;\n#endif\n#endif  /* DUK_USE_ROM_STRINGS */\n\n\theap->heap_thread = thr;\n\tDUK_HTHREAD_INCREF(thr, thr);  /* Note: first argument not really used */\n\n\t/* 'thr' is now reachable */\n\n\tDUK_D(DUK_DPRINT(\"heap init: init heap thread stacks\"));\n\tif (!duk_hthread_init_stacks(heap, thr)) {\n\t\treturn 0;\n\t}\n\n\t/* XXX: this may now fail, and is not handled correctly */\n\tduk_hthread_create_builtin_objects(thr);\n\n\t/* default prototype */\n\tDUK_HOBJECT_SET_PROTOTYPE_INIT_INCREF(thr, (duk_hobject *) thr, thr->builtins[DUK_BIDX_THREAD_PROTOTYPE]);\n\n\treturn 1;\n}\n\n#if defined(DUK_USE_DEBUG)\n#define DUK__DUMPSZ(t)  do { \\\n\t\tDUK_D(DUK_DPRINT(\"\" #t \"=%ld\", (long) sizeof(t))); \\\n\t} while (0)\n\n/* These is not 100% because format would need to be non-portable \"long long\".\n * Also print out as doubles to catch cases where the \"long\" type is not wide\n * enough; the limits will then not be printed accurately but the magnitude\n * will be correct.\n */\n#define DUK__DUMPLM_SIGNED_RAW(t,a,b)  do { \\\n\t\tDUK_D(DUK_DPRINT(t \"=[%ld,%ld]=[%lf,%lf]\", \\\n\t\t                 (long) (a), (long) (b), \\\n\t\t                 (double) (a), (double) (b))); \\\n\t} while (0)\n#define DUK__DUMPLM_UNSIGNED_RAW(t,a,b)  do { \\\n\t\tDUK_D(DUK_DPRINT(t \"=[%lu,%lu]=[%lf,%lf]\", \\\n\t\t                 (unsigned long) (a), (unsigned long) (b), \\\n\t\t                 (double) (a), (double) (b))); \\\n\t} while (0)\n#define DUK__DUMPLM_SIGNED(t)  do { \\\n\t\tDUK__DUMPLM_SIGNED_RAW(\"DUK_\" #t \"_{MIN,MAX}\", DUK_##t##_MIN, DUK_##t##_MAX); \\\n\t} while (0)\n#define DUK__DUMPLM_UNSIGNED(t)  do { \\\n\t\tDUK__DUMPLM_UNSIGNED_RAW(\"DUK_\" #t \"_{MIN,MAX}\", DUK_##t##_MIN, DUK_##t##_MAX); \\\n\t} while (0)\n\nDUK_LOCAL void duk__dump_type_sizes(void) {\n\tDUK_D(DUK_DPRINT(\"sizeof()\"));\n\n\t/* basic platform types */\n\tDUK__DUMPSZ(char);\n\tDUK__DUMPSZ(short);\n\tDUK__DUMPSZ(int);\n\tDUK__DUMPSZ(long);\n\tDUK__DUMPSZ(double);\n\tDUK__DUMPSZ(void *);\n\tDUK__DUMPSZ(size_t);\n\n\t/* basic types from duk_features.h */\n\tDUK__DUMPSZ(duk_uint8_t);\n\tDUK__DUMPSZ(duk_int8_t);\n\tDUK__DUMPSZ(duk_uint16_t);\n\tDUK__DUMPSZ(duk_int16_t);\n\tDUK__DUMPSZ(duk_uint32_t);\n\tDUK__DUMPSZ(duk_int32_t);\n\tDUK__DUMPSZ(duk_uint64_t);\n\tDUK__DUMPSZ(duk_int64_t);\n\tDUK__DUMPSZ(duk_uint_least8_t);\n\tDUK__DUMPSZ(duk_int_least8_t);\n\tDUK__DUMPSZ(duk_uint_least16_t);\n\tDUK__DUMPSZ(duk_int_least16_t);\n\tDUK__DUMPSZ(duk_uint_least32_t);\n\tDUK__DUMPSZ(duk_int_least32_t);\n#if defined(DUK_USE_64BIT_OPS)\n\tDUK__DUMPSZ(duk_uint_least64_t);\n\tDUK__DUMPSZ(duk_int_least64_t);\n#endif\n\tDUK__DUMPSZ(duk_uint_fast8_t);\n\tDUK__DUMPSZ(duk_int_fast8_t);\n\tDUK__DUMPSZ(duk_uint_fast16_t);\n\tDUK__DUMPSZ(duk_int_fast16_t);\n\tDUK__DUMPSZ(duk_uint_fast32_t);\n\tDUK__DUMPSZ(duk_int_fast32_t);\n#if defined(DUK_USE_64BIT_OPS)\n\tDUK__DUMPSZ(duk_uint_fast64_t);\n\tDUK__DUMPSZ(duk_int_fast64_t);\n#endif\n\tDUK__DUMPSZ(duk_uintptr_t);\n\tDUK__DUMPSZ(duk_intptr_t);\n\tDUK__DUMPSZ(duk_uintmax_t);\n\tDUK__DUMPSZ(duk_intmax_t);\n\tDUK__DUMPSZ(duk_double_t);\n\n\t/* important chosen base types */\n\tDUK__DUMPSZ(duk_int_t);\n\tDUK__DUMPSZ(duk_uint_t);\n\tDUK__DUMPSZ(duk_int_fast_t);\n\tDUK__DUMPSZ(duk_uint_fast_t);\n\tDUK__DUMPSZ(duk_small_int_t);\n\tDUK__DUMPSZ(duk_small_uint_t);\n\tDUK__DUMPSZ(duk_small_int_fast_t);\n\tDUK__DUMPSZ(duk_small_uint_fast_t);\n\n\t/* some derived types */\n\tDUK__DUMPSZ(duk_codepoint_t);\n\tDUK__DUMPSZ(duk_ucodepoint_t);\n\tDUK__DUMPSZ(duk_idx_t);\n\tDUK__DUMPSZ(duk_errcode_t);\n\tDUK__DUMPSZ(duk_uarridx_t);\n\n\t/* tval */\n\tDUK__DUMPSZ(duk_double_union);\n\tDUK__DUMPSZ(duk_tval);\n\n\t/* structs from duk_forwdecl.h */\n\tDUK__DUMPSZ(duk_jmpbuf);  /* just one 'int' for C++ exceptions */\n\tDUK__DUMPSZ(duk_heaphdr);\n\tDUK__DUMPSZ(duk_heaphdr_string);\n\tDUK__DUMPSZ(duk_hstring);\n\tDUK__DUMPSZ(duk_hstring_external);\n\tDUK__DUMPSZ(duk_hobject);\n\tDUK__DUMPSZ(duk_harray);\n\tDUK__DUMPSZ(duk_hcompfunc);\n\tDUK__DUMPSZ(duk_hnatfunc);\n\tDUK__DUMPSZ(duk_hdecenv);\n\tDUK__DUMPSZ(duk_hobjenv);\n\tDUK__DUMPSZ(duk_hthread);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\tDUK__DUMPSZ(duk_hbufobj);\n#endif\n\tDUK__DUMPSZ(duk_hproxy);\n\tDUK__DUMPSZ(duk_hbuffer);\n\tDUK__DUMPSZ(duk_hbuffer_fixed);\n\tDUK__DUMPSZ(duk_hbuffer_dynamic);\n\tDUK__DUMPSZ(duk_hbuffer_external);\n\tDUK__DUMPSZ(duk_propaccessor);\n\tDUK__DUMPSZ(duk_propvalue);\n\tDUK__DUMPSZ(duk_propdesc);\n\tDUK__DUMPSZ(duk_heap);\n\tDUK__DUMPSZ(duk_activation);\n\tDUK__DUMPSZ(duk_catcher);\n\tDUK__DUMPSZ(duk_strcache);\n\tDUK__DUMPSZ(duk_ljstate);\n\tDUK__DUMPSZ(duk_fixedbuffer);\n\tDUK__DUMPSZ(duk_bitdecoder_ctx);\n\tDUK__DUMPSZ(duk_bitencoder_ctx);\n\tDUK__DUMPSZ(duk_token);\n\tDUK__DUMPSZ(duk_re_token);\n\tDUK__DUMPSZ(duk_lexer_point);\n\tDUK__DUMPSZ(duk_lexer_ctx);\n\tDUK__DUMPSZ(duk_compiler_instr);\n\tDUK__DUMPSZ(duk_compiler_func);\n\tDUK__DUMPSZ(duk_compiler_ctx);\n\tDUK__DUMPSZ(duk_re_matcher_ctx);\n\tDUK__DUMPSZ(duk_re_compiler_ctx);\n}\nDUK_LOCAL void duk__dump_type_limits(void) {\n\tDUK_D(DUK_DPRINT(\"limits\"));\n\n\t/* basic types */\n\tDUK__DUMPLM_SIGNED(INT8);\n\tDUK__DUMPLM_UNSIGNED(UINT8);\n\tDUK__DUMPLM_SIGNED(INT_FAST8);\n\tDUK__DUMPLM_UNSIGNED(UINT_FAST8);\n\tDUK__DUMPLM_SIGNED(INT_LEAST8);\n\tDUK__DUMPLM_UNSIGNED(UINT_LEAST8);\n\tDUK__DUMPLM_SIGNED(INT16);\n\tDUK__DUMPLM_UNSIGNED(UINT16);\n\tDUK__DUMPLM_SIGNED(INT_FAST16);\n\tDUK__DUMPLM_UNSIGNED(UINT_FAST16);\n\tDUK__DUMPLM_SIGNED(INT_LEAST16);\n\tDUK__DUMPLM_UNSIGNED(UINT_LEAST16);\n\tDUK__DUMPLM_SIGNED(INT32);\n\tDUK__DUMPLM_UNSIGNED(UINT32);\n\tDUK__DUMPLM_SIGNED(INT_FAST32);\n\tDUK__DUMPLM_UNSIGNED(UINT_FAST32);\n\tDUK__DUMPLM_SIGNED(INT_LEAST32);\n\tDUK__DUMPLM_UNSIGNED(UINT_LEAST32);\n#if defined(DUK_USE_64BIT_OPS)\n\tDUK__DUMPLM_SIGNED(INT64);\n\tDUK__DUMPLM_UNSIGNED(UINT64);\n\tDUK__DUMPLM_SIGNED(INT_FAST64);\n\tDUK__DUMPLM_UNSIGNED(UINT_FAST64);\n\tDUK__DUMPLM_SIGNED(INT_LEAST64);\n\tDUK__DUMPLM_UNSIGNED(UINT_LEAST64);\n#endif\n\tDUK__DUMPLM_SIGNED(INTPTR);\n\tDUK__DUMPLM_UNSIGNED(UINTPTR);\n\tDUK__DUMPLM_SIGNED(INTMAX);\n\tDUK__DUMPLM_UNSIGNED(UINTMAX);\n\n\t/* derived types */\n\tDUK__DUMPLM_SIGNED(INT);\n\tDUK__DUMPLM_UNSIGNED(UINT);\n\tDUK__DUMPLM_SIGNED(INT_FAST);\n\tDUK__DUMPLM_UNSIGNED(UINT_FAST);\n\tDUK__DUMPLM_SIGNED(SMALL_INT);\n\tDUK__DUMPLM_UNSIGNED(SMALL_UINT);\n\tDUK__DUMPLM_SIGNED(SMALL_INT_FAST);\n\tDUK__DUMPLM_UNSIGNED(SMALL_UINT_FAST);\n}\n\nDUK_LOCAL void duk__dump_misc_options(void) {\n\tDUK_D(DUK_DPRINT(\"DUK_VERSION: %ld\", (long) DUK_VERSION));\n\tDUK_D(DUK_DPRINT(\"DUK_GIT_DESCRIBE: %s\", DUK_GIT_DESCRIBE));\n\tDUK_D(DUK_DPRINT(\"OS string: %s\", DUK_USE_OS_STRING));\n\tDUK_D(DUK_DPRINT(\"architecture string: %s\", DUK_USE_ARCH_STRING));\n\tDUK_D(DUK_DPRINT(\"compiler string: %s\", DUK_USE_COMPILER_STRING));\n\tDUK_D(DUK_DPRINT(\"debug level: %ld\", (long) DUK_USE_DEBUG_LEVEL));\n#if defined(DUK_USE_PACKED_TVAL)\n\tDUK_D(DUK_DPRINT(\"DUK_USE_PACKED_TVAL: yes\"));\n#else\n\tDUK_D(DUK_DPRINT(\"DUK_USE_PACKED_TVAL: no\"));\n#endif\n#if defined(DUK_USE_VARIADIC_MACROS)\n\tDUK_D(DUK_DPRINT(\"DUK_USE_VARIADIC_MACROS: yes\"));\n#else\n\tDUK_D(DUK_DPRINT(\"DUK_USE_VARIADIC_MACROS: no\"));\n#endif\n#if defined(DUK_USE_INTEGER_LE)\n\tDUK_D(DUK_DPRINT(\"integer endianness: little\"));\n#elif defined(DUK_USE_INTEGER_ME)\n\tDUK_D(DUK_DPRINT(\"integer endianness: mixed\"));\n#elif defined(DUK_USE_INTEGER_BE)\n\tDUK_D(DUK_DPRINT(\"integer endianness: big\"));\n#else\n\tDUK_D(DUK_DPRINT(\"integer endianness: ???\"));\n#endif\n#if defined(DUK_USE_DOUBLE_LE)\n\tDUK_D(DUK_DPRINT(\"IEEE double endianness: little\"));\n#elif defined(DUK_USE_DOUBLE_ME)\n\tDUK_D(DUK_DPRINT(\"IEEE double endianness: mixed\"));\n#elif defined(DUK_USE_DOUBLE_BE)\n\tDUK_D(DUK_DPRINT(\"IEEE double endianness: big\"));\n#else\n\tDUK_D(DUK_DPRINT(\"IEEE double endianness: ???\"));\n#endif\n}\n#endif  /* DUK_USE_DEBUG */\n\nDUK_INTERNAL\nduk_heap *duk_heap_alloc(duk_alloc_function alloc_func,\n                         duk_realloc_function realloc_func,\n                         duk_free_function free_func,\n                         void *heap_udata,\n                         duk_fatal_function fatal_func) {\n\tduk_heap *res = NULL;\n\tduk_uint32_t st_initsize;\n\n\tDUK_D(DUK_DPRINT(\"allocate heap\"));\n\n\t/*\n\t *  Random config sanity asserts\n\t */\n\n\tDUK_ASSERT(DUK_USE_STRTAB_MINSIZE >= 64);\n\n\tDUK_ASSERT((DUK_HTYPE_STRING & 0x01U) == 0);\n\tDUK_ASSERT((DUK_HTYPE_BUFFER & 0x01U) == 0);\n\tDUK_ASSERT((DUK_HTYPE_OBJECT & 0x01U) == 1);  /* DUK_HEAPHDR_IS_OBJECT() relies ont his. */\n\n\t/*\n\t *  Debug dump type sizes\n\t */\n\n#if defined(DUK_USE_DEBUG)\n\tduk__dump_misc_options();\n\tduk__dump_type_sizes();\n\tduk__dump_type_limits();\n#endif\n\n\t/*\n\t *  If selftests enabled, run them as early as possible.\n\t */\n\n#if defined(DUK_USE_SELF_TESTS)\n\tDUK_D(DUK_DPRINT(\"run self tests\"));\n\tif (duk_selftest_run_tests(alloc_func, realloc_func, free_func, heap_udata) > 0) {\n\t\tfatal_func(heap_udata, \"self test(s) failed\");\n\t}\n\tDUK_D(DUK_DPRINT(\"self tests passed\"));\n#endif\n\n\t/*\n\t *  Important assert-like checks that should be enabled even\n\t *  when assertions are otherwise not enabled.\n\t */\n\n#if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE)\n\t/* Can't check sizeof() using preprocessor so explicit check.\n\t * This will be optimized away in practice; unfortunately a\n\t * warning is generated on some compilers as a result.\n\t */\n#if defined(DUK_USE_PACKED_TVAL)\n\tif (sizeof(duk_tval) != 8) {\n#else\n\tif (sizeof(duk_tval) != 16) {\n#endif\n\t\tfatal_func(heap_udata, \"sizeof(duk_tval) not 8 or 16, cannot use DUK_USE_EXEC_REGCONST_OPTIMIZE option\");\n\t}\n#endif  /* DUK_USE_EXEC_REGCONST_OPTIMIZE */\n\n\t/*\n\t *  Computed values (e.g. INFINITY)\n\t */\n\n#if defined(DUK_USE_COMPUTED_NAN)\n\tdo {\n\t\t/* Workaround for some exotic platforms where NAN is missing\n\t\t * and the expression (0.0 / 0.0) does NOT result in a NaN.\n\t\t * Such platforms use the global 'duk_computed_nan' which must\n\t\t * be initialized at runtime.  Use 'volatile' to ensure that\n\t\t * the compiler will actually do the computation and not try\n\t\t * to do constant folding which might result in the original\n\t\t * problem.\n\t\t */\n\t\tvolatile double dbl1 = 0.0;\n\t\tvolatile double dbl2 = 0.0;\n\t\tduk_computed_nan = dbl1 / dbl2;\n\t} while (0);\n#endif\n\n#if defined(DUK_USE_COMPUTED_INFINITY)\n\tdo {\n\t\t/* Similar workaround for INFINITY. */\n\t\tvolatile double dbl1 = 1.0;\n\t\tvolatile double dbl2 = 0.0;\n\t\tduk_computed_infinity = dbl1 / dbl2;\n\t} while (0);\n#endif\n\n\t/*\n\t *  Allocate heap struct\n\t *\n\t *  Use a raw call, all macros expect the heap to be initialized\n\t */\n\n#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 1)\n\tgoto failed;\n#endif\n\tDUK_D(DUK_DPRINT(\"alloc duk_heap object\"));\n\tres = (duk_heap *) alloc_func(heap_udata, sizeof(duk_heap));\n\tif (!res) {\n\t\tgoto failed;\n\t}\n\n\t/*\n\t *  Zero the struct, and start initializing roughly in order\n\t */\n\n\tDUK_MEMZERO(res, sizeof(*res));\n#if defined(DUK_USE_ASSERTIONS)\n\tres->heap_initializing = 1;\n#endif\n\n\t/* explicit NULL inits */\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->heap_udata = NULL;\n\tres->heap_allocated = NULL;\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tres->refzero_list = NULL;\n#endif\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tres->finalize_list = NULL;\n#if defined(DUK_USE_ASSERTIONS)\n\tres->currently_finalizing = NULL;\n#endif\n#endif\n#if defined(DUK_USE_CACHE_ACTIVATION)\n\tres->activation_free = NULL;\n#endif\n#if defined(DUK_USE_CACHE_CATCHER)\n\tres->catcher_free = NULL;\n#endif\n\tres->heap_thread = NULL;\n\tres->curr_thread = NULL;\n\tres->heap_object = NULL;\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tres->strtable16 = NULL;\n#else\n\tres->strtable = NULL;\n#endif\n#if defined(DUK_USE_ROM_STRINGS)\n\t/* no res->strs[] */\n#else  /* DUK_USE_ROM_STRINGS */\n#if defined(DUK_USE_HEAPPTR16)\n\t/* res->strs16[] is zeroed and zero decodes to NULL, so no NULL inits. */\n#else\n\t{\n\t\tduk_small_uint_t i;\n\t        for (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) {\n\t\t\tres->strs[i] = NULL;\n\t        }\n\t}\n#endif\n#endif  /* DUK_USE_ROM_STRINGS */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tres->dbg_read_cb = NULL;\n\tres->dbg_write_cb = NULL;\n\tres->dbg_peek_cb = NULL;\n\tres->dbg_read_flush_cb = NULL;\n\tres->dbg_write_flush_cb = NULL;\n\tres->dbg_request_cb = NULL;\n\tres->dbg_udata = NULL;\n\tres->dbg_pause_act = NULL;\n#endif\n#endif  /* DUK_USE_EXPLICIT_NULL_INIT */\n\n\tres->alloc_func = alloc_func;\n\tres->realloc_func = realloc_func;\n\tres->free_func = free_func;\n\tres->heap_udata = heap_udata;\n\tres->fatal_func = fatal_func;\n\n\t/* XXX: for now there's a pointer packing zero assumption, i.e.\n\t * NULL <=> compressed pointer 0.  If this is removed, may need\n\t * to precompute e.g. null16 here.\n\t */\n\n\t/* res->ms_trigger_counter == 0 -> now causes immediate GC; which is OK */\n\n\t/* Prevent mark-and-sweep and finalizer execution until heap is completely\n\t * initialized.\n\t */\n\tDUK_ASSERT(res->ms_prevent_count == 0);\n\tDUK_ASSERT(res->pf_prevent_count == 0);\n\tres->ms_prevent_count = 1;\n\tres->pf_prevent_count = 1;\n\tDUK_ASSERT(res->ms_running == 0);\n\n\tres->call_recursion_depth = 0;\n\tres->call_recursion_limit = DUK_USE_NATIVE_CALL_RECLIMIT;\n\n\t/* XXX: use the pointer as a seed for now: mix in time at least */\n\n\t/* The casts through duk_intptr_t is to avoid the following GCC warning:\n\t *\n\t *   warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]\n\t *\n\t * This still generates a /Wp64 warning on VS2010 when compiling for x86.\n\t */\n#if defined(DUK_USE_ROM_STRINGS)\n\t/* XXX: make a common DUK_USE_ option, and allow custom fixed seed? */\n\tDUK_D(DUK_DPRINT(\"using rom strings, force heap hash_seed to fixed value 0x%08lx\", (long) DUK__FIXED_HASH_SEED));\n\tres->hash_seed = (duk_uint32_t) DUK__FIXED_HASH_SEED;\n#else  /* DUK_USE_ROM_STRINGS */\n\tres->hash_seed = (duk_uint32_t) (duk_intptr_t) res;\n#if !defined(DUK_USE_STRHASH_DENSE)\n\tres->hash_seed ^= 5381;  /* Bernstein hash init value is normally 5381; XOR it in in case pointer low bits are 0 */\n#endif\n#endif  /* DUK_USE_ROM_STRINGS */\n\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->lj.jmpbuf_ptr = NULL;\n#endif\n\tDUK_ASSERT(res->lj.type == DUK_LJ_TYPE_UNKNOWN);  /* zero */\n\tDUK_ASSERT(res->lj.iserror == 0);\n\tDUK_TVAL_SET_UNDEFINED(&res->lj.value1);\n\tDUK_TVAL_SET_UNDEFINED(&res->lj.value2);\n\n\tDUK_ASSERT_LJSTATE_UNSET(res);\n\n\t/*\n\t *  Init stringtable: fixed variant\n\t */\n\n\tst_initsize = DUK_USE_STRTAB_MINSIZE;\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tres->strtable16 = (duk_uint16_t *) alloc_func(heap_udata, sizeof(duk_uint16_t) * st_initsize);\n\tif (res->strtable16 == NULL) {\n\t\tgoto failed;\n\t}\n#else\n\tres->strtable = (duk_hstring **) alloc_func(heap_udata, sizeof(duk_hstring *) * st_initsize);\n\tif (res->strtable == NULL) {\n\t\tgoto failed;\n\t}\n#endif\n\tres->st_size = st_initsize;\n\tres->st_mask = st_initsize - 1;\n#if (DUK_USE_STRTAB_MINSIZE != DUK_USE_STRTAB_MAXSIZE)\n\tDUK_ASSERT(res->st_count == 0);\n#endif\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t/* zero assumption */\n\tDUK_MEMZERO(res->strtable16, sizeof(duk_uint16_t) * st_initsize);\n#else\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\t{\n\t\tduk_small_uint_t i;\n\t        for (i = 0; i < st_initsize; i++) {\n\t\t\tres->strtable[i] = NULL;\n\t        }\n\t}\n#else\n\tDUK_MEMZERO(res->strtable, sizeof(duk_hstring *) * st_initsize);\n#endif  /* DUK_USE_EXPLICIT_NULL_INIT */\n#endif  /* DUK_USE_STRTAB_PTRCOMP */\n\n\t/*\n\t *  Init stringcache\n\t */\n\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\t{\n\t\tduk_small_uint_t i;\n\t\tfor (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {\n\t\t\tres->strcache[i].h = NULL;\n\t\t}\n\t}\n#endif\n\n\t/* XXX: error handling is incomplete.  It would be cleanest if\n\t * there was a setjmp catchpoint, so that all init code could\n\t * freely throw errors.  If that were the case, the return code\n\t * passing here could be removed.\n\t */\n\n\t/*\n\t *  Init built-in strings\n\t */\n\n#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 2)\n\tgoto failed;\n#endif\n\tDUK_D(DUK_DPRINT(\"heap init: initialize heap strings\"));\n\tif (!duk__init_heap_strings(res)) {\n\t\tgoto failed;\n\t}\n\n\t/*\n\t *  Init the heap thread\n\t */\n\n#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 3)\n\tgoto failed;\n#endif\n\tDUK_D(DUK_DPRINT(\"heap init: initialize heap thread\"));\n\tif (!duk__init_heap_thread(res)) {\n\t\tgoto failed;\n\t}\n\n\t/*\n\t *  Init the heap object\n\t */\n\n#if defined(DUK_USE_INJECT_HEAP_ALLOC_ERROR) && (DUK_USE_INJECT_HEAP_ALLOC_ERROR == 4)\n\tgoto failed;\n#endif\n\tDUK_D(DUK_DPRINT(\"heap init: initialize heap object\"));\n\tDUK_ASSERT(res->heap_thread != NULL);\n\tres->heap_object = duk_hobject_alloc_unchecked(res, DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                                    DUK_HOBJECT_FLAG_FASTREFS |\n\t                                                    DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT));\n\tif (res->heap_object == NULL) {\n\t\tgoto failed;\n\t}\n\tDUK_HOBJECT_INCREF(res->heap_thread, res->heap_object);\n\n\t/*\n\t *  Odds and ends depending on the heap thread\n\t */\n\n#if !defined(DUK_USE_GET_RANDOM_DOUBLE)\n#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS)\n\tres->rnd_state = (duk_uint32_t) duk_time_get_ecmascript_time(res->heap_thread);\n\tduk_util_tinyrandom_prepare_seed(res->heap_thread);\n#else\n\tres->rnd_state[0] = (duk_uint64_t) duk_time_get_ecmascript_time(res->heap_thread);\n\tDUK_ASSERT(res->rnd_state[1] == 0);  /* Not filled here, filled in by seed preparation. */\n#if 0  /* Manual test values matching misc/xoroshiro128plus_test.c. */\n\tres->rnd_state[0] = DUK_U64_CONSTANT(0xdeadbeef12345678);\n\tres->rnd_state[1] = DUK_U64_CONSTANT(0xcafed00d12345678);\n#endif\n\tduk_util_tinyrandom_prepare_seed(res->heap_thread);\n\t/* Mix in heap pointer: this ensures that if two Duktape heaps are\n\t * created on the same millisecond, they get a different PRNG\n\t * sequence (unless e.g. virtual memory addresses cause also the\n\t * heap object pointer to be the same).\n\t */\n\t{\n\t\tduk_uint64_t tmp_u64;\n\t\ttmp_u64 = 0;\n\t\tDUK_MEMCPY((void *) &tmp_u64,\n\t\t           (const void *) &res,\n\t\t           (size_t) (sizeof(void *) >= sizeof(duk_uint64_t) ? sizeof(duk_uint64_t) : sizeof(void *)));\n\t\tres->rnd_state[1] ^= tmp_u64;\n\t}\n\tdo {\n\t\tduk_small_uint_t i;\n\t\tfor (i = 0; i < 10; i++) {\n\t\t\t/* Throw away a few initial random numbers just in\n\t\t\t * case.  Probably unnecessary due to SplitMix64\n\t\t\t * preparation.\n\t\t\t */\n\t\t\t(void) duk_util_tinyrandom_get_double(res->heap_thread);\n\t\t}\n\t} while (0);\n#endif\n#endif\n\n\t/*\n\t *  Allow finalizer and mark-and-sweep processing.\n\t */\n\n\tDUK_D(DUK_DPRINT(\"heap init: allow finalizer/mark-and-sweep processing\"));\n\tDUK_ASSERT(res->ms_prevent_count == 1);\n\tDUK_ASSERT(res->pf_prevent_count == 1);\n\tres->ms_prevent_count = 0;\n\tres->pf_prevent_count = 0;\n\tDUK_ASSERT(res->ms_running == 0);\n#if defined(DUK_USE_ASSERTIONS)\n\tres->heap_initializing = 0;\n#endif\n\n\t/*\n\t *  All done.\n\t */\n\n\tDUK_D(DUK_DPRINT(\"allocated heap: %p\", (void *) res));\n\treturn res;\n\n failed:\n\tDUK_D(DUK_DPRINT(\"heap allocation failed\"));\n\n\tif (res != NULL) {\n\t\t/* Assumes that allocated pointers and alloc funcs are valid\n\t\t * if res exists.\n\t\t */\n\t\tDUK_ASSERT(res->ms_prevent_count == 1);\n\t\tDUK_ASSERT(res->pf_prevent_count == 1);\n\t\tDUK_ASSERT(res->ms_running == 0);\n\t\tif (res->heap_thread != NULL) {\n\t\t\tres->ms_prevent_count = 0;\n\t\t\tres->pf_prevent_count = 0;\n\t\t}\n#if defined(DUK_USE_ASSERTIONS)\n\t\tres->heap_initializing = 0;\n#endif\n\n\t\tDUK_ASSERT(res->alloc_func != NULL);\n\t\tDUK_ASSERT(res->realloc_func != NULL);\n\t\tDUK_ASSERT(res->free_func != NULL);\n\t\tduk_heap_free(res);\n\t}\n\n\treturn NULL;\n}\n\n/* automatic undefs */\n#undef DUK__DUMPLM_SIGNED\n#undef DUK__DUMPLM_SIGNED_RAW\n#undef DUK__DUMPLM_UNSIGNED\n#undef DUK__DUMPLM_UNSIGNED_RAW\n#undef DUK__DUMPSZ\n#undef DUK__FIXED_HASH_SEED\n#line 1 \"duk_heap_finalize.c\"\n/*\n *  Finalizer handling.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\n/*\n *  Fake torture finalizer.\n */\n\n#if defined(DUK_USE_FINALIZER_TORTURE)\nDUK_LOCAL duk_ret_t duk__fake_global_finalizer(duk_hthread *thr) {\n\tDUK_DD(DUK_DDPRINT(\"fake global torture finalizer executed\"));\n\n\t/* Require a lot of stack to force a value stack grow/shrink. */\n\tduk_require_stack(thr, 100000);\n\n\t/* Force a reallocation with pointer change for value stack\n\t * to maximize side effects.\n\t */\n\tduk_hthread_valstack_torture_realloc(thr);\n\n\t/* Inner function call, error throw. */\n\tduk_eval_string_noresult(thr,\n\t\t\"(function dummy() {\\n\"\n\t\t\"    dummy.prototype = null;  /* break reference loop */\\n\"\n\t\t\"    try {\\n\"\n\t\t\"        throw 'fake-finalizer-dummy-error';\\n\"\n\t\t\"    } catch (e) {\\n\"\n\t\t\"        void e;\\n\"\n\t\t\"    }\\n\"\n\t\t\"})()\");\n\n\t/* The above creates garbage (e.g. a function instance).  Because\n\t * the function/prototype reference loop is broken, it gets collected\n\t * immediately by DECREF.  If Function.prototype has a _Finalizer\n\t * property (happens in some test cases), the garbage gets queued to\n\t * finalize_list.  This still won't cause an infinite loop because\n\t * the torture finalizer is called once per finalize_list run and\n\t * the garbage gets handled in the same run.  (If the garbage needs\n\t * mark-and-sweep collection, an infinite loop might ensue.)\n\t */\n\treturn 0;\n}\n\nDUK_LOCAL void duk__run_global_torture_finalizer(duk_hthread *thr) {\n\tDUK_ASSERT(thr != NULL);\n\n\t/* Avoid fake finalization when callstack limit is near.  Otherwise\n\t * a callstack limit error will be created, then refzero'ed.  The\n\t * +5 headroom is conservative.\n\t */\n\tif (thr->heap->call_recursion_depth + 5 >= thr->heap->call_recursion_limit ||\n\t    thr->callstack_top + 5 >= DUK_USE_CALLSTACK_LIMIT) {\n\t\tDUK_D(DUK_DPRINT(\"skip global torture finalizer, too little headroom for call recursion or call stack size\"));\n\t\treturn;\n\t}\n\n\t/* Run fake finalizer.  Avoid creating unnecessary garbage. */\n\tduk_push_c_function(thr, duk__fake_global_finalizer, 0 /*nargs*/);\n\t(void) duk_pcall(thr, 0 /*nargs*/);\n\tduk_pop(thr);\n}\n#endif  /* DUK_USE_FINALIZER_TORTURE */\n\n/*\n *  Process the finalize_list to completion.\n *\n *  An object may be placed on finalize_list by either refcounting or\n *  mark-and-sweep.  The refcount of objects placed by refcounting will be\n *  zero; the refcount of objects placed by mark-and-sweep is > 0.  In both\n *  cases the refcount is bumped by 1 artificially so that a REFZERO event\n *  can never happen while an object is waiting for finalization.  Without\n *  this bump a REFZERO could now happen because user code may call\n *  duk_push_heapptr() and then pop a value even when it's on finalize_list.\n *\n *  List processing assumes refcounts are kept up-to-date at all times, so\n *  that once the finalizer returns, a zero refcount is a reliable reason to\n *  free the object immediately rather than place it back to the heap.  This\n *  is the case because we run outside of refzero_list processing so that\n *  DECREF cascades are handled fully inline.\n *\n *  For mark-and-sweep queued objects (had_zero_refcount false) the object\n *  may be freed immediately if its refcount is zero after the finalizer call\n *  (i.e. finalizer removed the reference loop for the object).  If not, the\n *  next mark-and-sweep will collect the object unless it has become reachable\n *  (i.e. rescued) by that time and its refcount hasn't fallen to zero before\n *  that.  Mark-and-sweep detects these objects because their FINALIZED flag\n *  is set.\n *\n *  There's an inherent limitation for mark-and-sweep finalizer rescuing: an\n *  object won't get refinalized if (1) it's rescued, but (2) becomes\n *  unreachable before mark-and-sweep has had time to notice it.  The next\n *  mark-and-sweep round simply doesn't have any information of whether the\n *  object has been unreachable the whole time or not (the only way to get\n *  that information would be a mark-and-sweep pass for *every finalized\n *  object*).  This is awkward for the application because the mark-and-sweep\n *  round is not generally visible or under full application control.\n *\n *  For refcount queued objects (had_zero_refcount true) the object is either\n *  immediately freed or rescued, and waiting for a mark-and-sweep round is not\n *  necessary (or desirable); FINALIZED is cleared when a rescued object is\n *  queued back to heap_allocated.  The object is eligible for finalization\n *  again (either via refcounting or mark-and-sweep) immediately after being\n *  rescued.  If a refcount finalized object is placed into an unreachable\n *  reference loop by its finalizer, it will get collected by mark-and-sweep\n *  and currently the finalizer will execute again.\n *\n *  There's a special case where:\n *\n *    - Mark-and-sweep queues an object to finalize_list for finalization.\n *    - The finalizer is executed, FINALIZED is set, and object is queued\n *      back to heap_allocated, waiting for a new mark-and-sweep round.\n *    - The object's refcount drops to zero before mark-and-sweep has a\n *      chance to run another round and make a rescue/free decision.\n *\n *  This is now handled by refzero code: if an object has a finalizer but\n *  FINALIZED is already set, the object is freed without finalizer processing.\n *  The outcome is the same as if mark-and-sweep was executed at that point;\n *  mark-and-sweep would also free the object without another finalizer run.\n *  This could also be changed so that the refzero-triggered finalizer *IS*\n *  executed: being refzero collected implies someone has operated on the\n *  object so it hasn't been totally unreachable the whole time.  This would\n *  risk a finalizer loop however.\n */\n\nDUK_INTERNAL void duk_heap_process_finalize_list(duk_heap *heap) {\n\tduk_heaphdr *curr;\n#if defined(DUK_USE_DEBUG)\n\tduk_size_t count = 0;\n#endif\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk_heap_process_finalize_list: %p\", (void *) heap));\n\n\tif (heap->pf_prevent_count != 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"skip finalize_list processing: pf_prevent_count != 0\"));\n\t\treturn;\n\t}\n\n\t/* Heap alloc prevents mark-and-sweep before heap_thread is ready. */\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tDUK_ASSERT(heap->heap_thread->valstack != NULL);\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);\n#endif\n\n\tDUK_ASSERT(heap->pf_prevent_count == 0);\n\theap->pf_prevent_count = 1;\n\n\t/* Mark-and-sweep no longer needs to be prevented when running\n\t * finalizers: mark-and-sweep skips any rescue decisions if there\n\t * are any objects in finalize_list when mark-and-sweep is entered.\n\t * This protects finalized objects from incorrect rescue decisions\n\t * caused by finalize_list being a reachability root and only\n\t * partially processed.  Freeing decisions are not postponed.\n\t */\n\n\t/* When finalizer torture is enabled, make a fake finalizer call with\n\t * maximum side effects regardless of whether finalize_list is empty.\n\t */\n#if defined(DUK_USE_FINALIZER_TORTURE)\n\tduk__run_global_torture_finalizer(heap->heap_thread);\n#endif\n\n\t/* Process finalize_list until it becomes empty.  There's currently no\n\t * protection against a finalizer always creating more garbage.\n\t */\n\twhile ((curr = heap->finalize_list) != NULL) {\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\tduk_bool_t queue_back;\n#endif\n\n\t\tDUK_DD(DUK_DDPRINT(\"processing finalize_list entry: %p -> %!iO\", (void *) curr, curr));\n\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT);  /* Only objects have finalizers. */\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr));\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(curr));\n\t\tDUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(curr));  /* All objects on finalize_list will have this flag (except object being finalized right now). */\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));   /* Queueing code ensures. */\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr));  /* ROM objects never get freed (or finalized). */\n\n#if defined(DUK_USE_ASSERTIONS)\n\t\tDUK_ASSERT(heap->currently_finalizing == NULL);\n\t\theap->currently_finalizing = curr;\n#endif\n\n\t\t/* Clear FINALIZABLE for object being finalized, so that\n\t\t * duk_push_heapptr() can properly ignore the object.\n\t\t */\n\t\tDUK_HEAPHDR_CLEAR_FINALIZABLE(curr);\n\n\t\tif (DUK_LIKELY(!heap->pf_skip_finalizers)) {\n\t\t\t/* Run the finalizer, duk_heap_run_finalizer() sets\n\t\t\t * and checks for FINALIZED to prevent the finalizer\n\t\t\t * from executing multiple times per finalization cycle.\n\t\t\t * (This safeguard shouldn't be actually needed anymore).\n\t\t\t */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\tduk_bool_t had_zero_refcount;\n#endif\n\n\t\t\t/* The object's refcount is >0 throughout so it won't be\n\t\t\t * refzero processed prematurely.\n\t\t\t */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1);\n\t\t\thad_zero_refcount = (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1);  /* Preincremented on finalize_list insert. */\n#endif\n\n\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));\n\t\t\tduk_heap_run_finalizer(heap, (duk_hobject *) curr);  /* must never longjmp */\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZED(curr));\n\t\t\t/* XXX: assert that object is still in finalize_list\n\t\t\t * when duk_push_heapptr() allows automatic rescue.\n\t\t\t */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\tDUK_DD(DUK_DDPRINT(\"refcount after finalizer (includes bump): %ld\", (long) DUK_HEAPHDR_GET_REFCOUNT(curr)));\n\t\t\tif (DUK_HEAPHDR_GET_REFCOUNT(curr) == 1) {  /* Only artificial bump in refcount? */\n#if defined(DUK_USE_DEBUG)\n\t\t\t\tif (had_zero_refcount) {\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"finalized object's refcount is zero -> free immediately (refcount queued)\"));\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"finalized object's refcount is zero -> free immediately (mark-and-sweep queued)\"));\n\t\t\t\t}\n#endif\n\t\t\t\tqueue_back = 0;\n\t\t\t} else\n#endif\n\t\t\t{\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\t\tqueue_back = 1;\n\t\t\t\tif (had_zero_refcount) {\n\t\t\t\t\t/* When finalization is triggered\n\t\t\t\t\t * by refzero and we queue the object\n\t\t\t\t\t * back, clear FINALIZED right away\n\t\t\t\t\t * so that the object can be refinalized\n\t\t\t\t\t * immediately if necessary.\n\t\t\t\t\t */\n\t\t\t\t\tDUK_HEAPHDR_CLEAR_FINALIZED(curr);\n\t\t\t\t}\n#endif\n\t\t\t}\n\t\t} else {\n\t\t\t/* Used during heap destruction: don't actually run finalizers\n\t\t\t * because we're heading into forced finalization.  Instead,\n\t\t\t * queue finalizable objects back to the heap_allocated list.\n\t\t\t */\n\t\t\tDUK_D(DUK_DPRINT(\"skip finalizers flag set, queue object to heap_allocated without finalizing\"));\n\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\tqueue_back = 1;\n#endif\n\t\t}\n\n\t\t/* Dequeue object from finalize_list.  Note that 'curr' may no\n\t\t * longer be finalize_list head because new objects may have\n\t\t * been queued to the list.  As a result we can't optimize for\n\t\t * the single-linked heap case and must scan the list for\n\t\t * removal, typically the scan is very short however.\n\t\t */\n\t\tDUK_HEAP_REMOVE_FROM_FINALIZE_LIST(heap, curr);\n\n\t\t/* Queue back to heap_allocated or free immediately. */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\tif (queue_back) {\n\t\t\t/* FINALIZED is only cleared if object originally\n\t\t\t * queued for finalization by refcounting.  For\n\t\t\t * mark-and-sweep FINALIZED is left set, so that\n\t\t\t * next mark-and-sweep round can make a rescue/free\n\t\t\t * decision.\n\t\t\t */\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) >= 1);\n\t\t\tDUK_HEAPHDR_PREDEC_REFCOUNT(curr);  /* Remove artificial refcount bump. */\n\t\t\tDUK_HEAPHDR_CLEAR_FINALIZABLE(curr);\n\t\t\tDUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr);\n\t\t} else {\n\t\t\t/* No need to remove the refcount bump here. */\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT);  /* currently, always the case */\n\t\t\tDUK_DD(DUK_DDPRINT(\"refcount finalize after finalizer call: %!O\", curr));\n\t\t\tduk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr);\n\t\t\tduk_free_hobject(heap, (duk_hobject *) curr);\n\t\t\tDUK_DD(DUK_DDPRINT(\"freed hobject after finalization: %p\", (void *) curr));\n\t\t}\n#else  /* DUK_USE_REFERENCE_COUNTING */\n\t\tDUK_HEAPHDR_CLEAR_FINALIZABLE(curr);\n\t\tDUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, curr);\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n#if defined(DUK_USE_DEBUG)\n\t\tcount++;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\t\tDUK_ASSERT(heap->currently_finalizing != NULL);\n\t\theap->currently_finalizing = NULL;\n#endif\n\t}\n\n\t/* finalize_list will always be processed completely. */\n\tDUK_ASSERT(heap->finalize_list == NULL);\n\n#if 0\n\t/* While NORZ macros are used above, this is unnecessary because the\n\t * only pending side effects are now finalizers, and finalize_list is\n\t * empty.\n\t */\n\tDUK_REFZERO_CHECK_SLOW(heap->heap_thread);\n#endif\n\n\t/* Prevent count may be bumped while finalizers run, but should always\n\t * be reliably unbumped by the time we get here.\n\t */\n\tDUK_ASSERT(heap->pf_prevent_count == 1);\n\theap->pf_prevent_count = 0;\n\n#if defined(DUK_USE_DEBUG)\n\tDUK_DD(DUK_DDPRINT(\"duk_heap_process_finalize_list: %ld finalizers called\", (long) count));\n#endif\n}\n\n/*\n *  Run an duk_hobject finalizer.  Must never throw an uncaught error\n *  (but may throw caught errors).\n *\n *  There is no return value.  Any return value or error thrown by\n *  the finalizer is ignored (although errors are debug logged).\n *\n *  Notes:\n *\n *    - The finalizer thread 'top' assertions are there because it is\n *      critical that strict stack policy is observed (i.e. no cruft\n *      left on the finalizer stack).\n */\n\nDUK_LOCAL duk_ret_t duk__finalize_helper(duk_hthread *thr, void *udata) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_UNREF(udata);\n\n\tDUK_DDD(DUK_DDDPRINT(\"protected finalization helper running\"));\n\n\t/* [... obj] */\n\n\t/* _Finalizer property is read without checking if the value is\n\t * callable or even exists.  This is intentional, and handled\n\t * by throwing an error which is caught by the safe call wrapper.\n\t *\n\t * XXX: Finalizer lookup should traverse the prototype chain (to allow\n\t * inherited finalizers) but should not invoke accessors or proxy object\n\t * behavior.  At the moment this lookup will invoke proxy behavior, so\n\t * caller must ensure that this function is not called if the target is\n\t * a Proxy.\n\t */\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FINALIZER);  /* -> [... obj finalizer] */\n\tduk_dup_m2(thr);\n\tduk_push_boolean(thr, DUK_HEAP_HAS_FINALIZER_NORESCUE(thr->heap));\n\tDUK_DDD(DUK_DDDPRINT(\"calling finalizer\"));\n\tduk_call(thr, 2);  /* [ ... obj finalizer obj heapDestruct ]  -> [ ... obj retval ] */\n\tDUK_DDD(DUK_DDDPRINT(\"finalizer returned successfully\"));\n\treturn 0;\n\n\t/* Note: we rely on duk_safe_call() to fix up the stack for the caller,\n\t * so we don't need to pop stuff here.  There is no return value;\n\t * caller determines rescued status based on object refcount.\n\t */\n}\n\nDUK_INTERNAL void duk_heap_run_finalizer(duk_heap *heap, duk_hobject *obj) {\n\tduk_hthread *thr;\n\tduk_ret_t rc;\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_idx_t entry_top;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"running duk_hobject finalizer for object: %p\", (void *) obj));\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tthr = heap->heap_thread;\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT_VALSTACK_SPACE(heap->heap_thread, 1);\n\n#if defined(DUK_USE_ASSERTIONS)\n\tentry_top = duk_get_top(thr);\n#endif\n\t/*\n\t *  Get and call the finalizer.  All of this must be wrapped\n\t *  in a protected call, because even getting the finalizer\n\t *  may trigger an error (getter may throw one, for instance).\n\t */\n\n\t/* ROM objects could inherit a finalizer, but they are never deemed\n\t * unreachable by mark-and-sweep, and their refcount never falls to 0.\n\t */\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));\n\n\t/* Duktape 2.1: finalize_list never contains objects with FINALIZED\n\t * set, so no need to check here.\n\t */\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj));\n#if 0\n\tif (DUK_HEAPHDR_HAS_FINALIZED((duk_heaphdr *) obj)) {\n\t\tDUK_D(DUK_DPRINT(\"object already finalized, avoid running finalizer twice: %!O\", obj));\n\t\treturn;\n\t}\n#endif\n\tDUK_HEAPHDR_SET_FINALIZED((duk_heaphdr *) obj);  /* ensure never re-entered until rescue cycle complete */\n\n#if defined(DUK_USE_ES6_PROXY)\n\tif (DUK_HOBJECT_IS_PROXY(obj)) {\n\t\t/* This may happen if duk_set_finalizer() or Duktape.fin() is\n\t\t * called for a Proxy object.  In such cases the fast finalizer\n\t\t * flag will be set on the Proxy, not the target, and neither\n\t\t * will be finalized.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"object is a Proxy, skip finalizer call\"));\n\t\treturn;\n\t}\n#endif  /* DUK_USE_ES6_PROXY */\n\n\tduk_push_hobject(thr, obj);  /* this also increases refcount by one */\n\trc = duk_safe_call(thr, duk__finalize_helper, NULL /*udata*/, 0 /*nargs*/, 1 /*nrets*/);  /* -> [... obj retval/error] */\n\tDUK_ASSERT_TOP(thr, entry_top + 2);  /* duk_safe_call discipline */\n\n\tif (rc != DUK_EXEC_SUCCESS) {\n\t\t/* Note: we ask for one return value from duk_safe_call to get this\n\t\t * error debugging here.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"wrapped finalizer call failed for object %p (ignored); error: %!T\",\n\t\t                 (void *) obj, (duk_tval *) duk_get_tval(thr, -1)));\n\t}\n\tduk_pop_2(thr);  /* -> [...] */\n\n\tDUK_ASSERT_TOP(thr, entry_top);\n}\n\n#else  /* DUK_USE_FINALIZER_SUPPORT */\n\n/* nothing */\n\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n#line 1 \"duk_heap_hashstring.c\"\n/*\n *  String hash computation (interning).\n *\n *  String hashing is performance critical because a string hash is computed\n *  for all new strings which are candidates to be added to the string table.\n *  However, strings actually added to the string table go through a codepoint\n *  length calculation which dominates performance because it goes through\n *  every byte of the input string (but only for strings added).\n *\n *  The string hash algorithm should be fast, but on the other hand provide\n *  good enough hashes to ensure both string table and object property table\n *  hash tables work reasonably well (i.e., there aren't too many collisions\n *  with real world inputs).  Unless the hash is cryptographic, it's always\n *  possible to craft inputs with maximal hash collisions.\n *\n *  NOTE: The hash algorithms must match tools/dukutil.py:duk_heap_hashstring()\n *  for ROM string support!\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_STRHASH_DENSE)\n/* Constants for duk_hashstring(). */\n#define DUK__STRHASH_SHORTSTRING   4096L\n#define DUK__STRHASH_MEDIUMSTRING  (256L * 1024L)\n#define DUK__STRHASH_BLOCKSIZE     256L\n\nDUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) {\n\tduk_uint32_t hash;\n\n\t/* Use Murmurhash2 directly for short strings, and use \"block skipping\"\n\t * for long strings: hash an initial part and then sample the rest of\n\t * the string with reasonably sized chunks.  An initial offset for the\n\t * sampling is computed based on a hash of the initial part of the string;\n\t * this is done to (usually) avoid the case where all long strings have\n\t * certain offset ranges which are never sampled.\n\t *\n\t * Skip should depend on length and bound the total time to roughly\n\t * logarithmic.  With current values:\n\t *\n\t *   1M string => 256 * 241 = 61696 bytes (0.06M) of hashing\n\t *   1G string => 256 * 16321 = 4178176 bytes (3.98M) of hashing\n\t *\n\t * XXX: It would be better to compute the skip offset more \"smoothly\"\n\t * instead of having a few boundary values.\n\t */\n\n\t/* note: mixing len into seed improves hashing when skipping */\n\tduk_uint32_t str_seed = heap->hash_seed ^ ((duk_uint32_t) len);\n\n\tif (len <= DUK__STRHASH_SHORTSTRING) {\n\t\thash = duk_util_hashbytes(str, len, str_seed);\n\t} else {\n\t\tduk_size_t off;\n\t\tduk_size_t skip;\n\n\t\tif (len <= DUK__STRHASH_MEDIUMSTRING) {\n\t\t\tskip = (duk_size_t) (16 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE);\n\t\t} else {\n\t\t\tskip = (duk_size_t) (256 * DUK__STRHASH_BLOCKSIZE + DUK__STRHASH_BLOCKSIZE);\n\t\t}\n\n\t\thash = duk_util_hashbytes(str, (duk_size_t) DUK__STRHASH_SHORTSTRING, str_seed);\n\t\toff = DUK__STRHASH_SHORTSTRING + (skip * (hash % 256)) / 256;\n\n\t\t/* XXX: inefficient loop */\n\t\twhile (off < len) {\n\t\t\tduk_size_t left = len - off;\n\t\t\tduk_size_t now = (duk_size_t) (left > DUK__STRHASH_BLOCKSIZE ? DUK__STRHASH_BLOCKSIZE : left);\n\t\t\thash ^= duk_util_hashbytes(str + off, now, str_seed);\n\t\t\toff += skip;\n\t\t}\n\t}\n\n#if defined(DUK_USE_STRHASH16)\n\t/* Truncate to 16 bits here, so that a computed hash can be compared\n\t * against a hash stored in a 16-bit field.\n\t */\n\thash &= 0x0000ffffUL;\n#endif\n\treturn hash;\n}\n#else  /* DUK_USE_STRHASH_DENSE */\nDUK_INTERNAL duk_uint32_t duk_heap_hashstring(duk_heap *heap, const duk_uint8_t *str, duk_size_t len) {\n\tduk_uint32_t hash;\n\tduk_size_t step;\n\tduk_size_t off;\n\n\t/* Slightly modified \"Bernstein hash\" from:\n\t *\n\t *     http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx\n\t *\n\t * Modifications: string skipping and reverse direction similar to\n\t * Lua 5.1.5, and different hash initializer.\n\t *\n\t * The reverse direction ensures last byte it always included in the\n\t * hash which is a good default as changing parts of the string are\n\t * more often in the suffix than in the prefix.\n\t */\n\n\thash = heap->hash_seed ^ ((duk_uint32_t) len);  /* Bernstein hash init value is normally 5381 */\n\tstep = (len >> DUK_USE_STRHASH_SKIP_SHIFT) + 1;\n\tfor (off = len; off >= step; off -= step) {\n\t\tDUK_ASSERT(off >= 1);  /* off >= step, and step >= 1 */\n\t\thash = (hash * 33) + str[off - 1];\n\t}\n\n#if defined(DUK_USE_STRHASH16)\n\t/* Truncate to 16 bits here, so that a computed hash can be compared\n\t * against a hash stored in a 16-bit field.\n\t */\n\thash &= 0x0000ffffUL;\n#endif\n\treturn hash;\n}\n#endif  /* DUK_USE_STRHASH_DENSE */\n\n/* automatic undefs */\n#undef DUK__STRHASH_BLOCKSIZE\n#undef DUK__STRHASH_MEDIUMSTRING\n#undef DUK__STRHASH_SHORTSTRING\n#line 1 \"duk_heap_markandsweep.c\"\n/*\n *  Mark-and-sweep garbage collection.\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_LOCAL_DECL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h);\nDUK_LOCAL_DECL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h);\nDUK_LOCAL_DECL void duk__mark_tval(duk_heap *heap, duk_tval *tv);\nDUK_LOCAL_DECL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count);\n\n/*\n *  Marking functions for heap types: mark children recursively.\n */\n\nDUK_LOCAL void duk__mark_hstring(duk_heap *heap, duk_hstring *h) {\n\tDUK_UNREF(heap);\n\tDUK_UNREF(h);\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__mark_hstring: %p\", (void *) h));\n\tDUK_ASSERT(h);\n\n\t/* nothing to process */\n}\n\nDUK_LOCAL void duk__mark_hobject(duk_heap *heap, duk_hobject *h) {\n\tduk_uint_fast32_t i;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__mark_hobject: %p\", (void *) h));\n\n\tDUK_ASSERT(h);\n\n\t/* XXX: use advancing pointers instead of index macros -> faster and smaller? */\n\n\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) {\n\t\tduk_hstring *key = DUK_HOBJECT_E_GET_KEY(heap, h, i);\n\t\tif (key == NULL) {\n\t\t\tcontinue;\n\t\t}\n\t\tduk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) key);\n\t\tif (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, h, i)) {\n\t\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.get);\n\t\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->a.set);\n\t\t} else {\n\t\t\tduk__mark_tval(heap, &DUK_HOBJECT_E_GET_VALUE_PTR(heap, h, i)->v);\n\t\t}\n\t}\n\n\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) {\n\t\tduk__mark_tval(heap, DUK_HOBJECT_A_GET_VALUE_PTR(heap, h, i));\n\t}\n\n\t/* Hash part is a 'weak reference' and does not contribute. */\n\n\tduk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HOBJECT_GET_PROTOTYPE(heap, h));\n\n\t/* Fast path for objects which don't have a subclass struct, or have a\n\t * subclass struct but nothing that needs marking in the subclass struct.\n\t */\n\tif (DUK_HOBJECT_HAS_FASTREFS(h)) {\n\t\tDUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h));\n\t\treturn;\n\t}\n\tDUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h));\n\n\t/* XXX: reorg, more common first */\n\tif (DUK_HOBJECT_IS_COMPFUNC(h)) {\n\t\tduk_hcompfunc *f = (duk_hcompfunc *) h;\n\t\tduk_tval *tv, *tv_end;\n\t\tduk_hobject **fn, **fn_end;\n\n\t\tDUK_ASSERT_HCOMPFUNC_VALID(f);\n\n\t\t/* 'data' is reachable through every compiled function which\n\t\t * contains a reference.\n\t\t */\n\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_DATA(heap, f));\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f));\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f));\n\n\t\tif (DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL) {\n\t\t\ttv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f);\n\t\t\ttv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f);\n\t\t\twhile (tv < tv_end) {\n\t\t\t\tduk__mark_tval(heap, tv);\n\t\t\t\ttv++;\n\t\t\t}\n\n\t\t\tfn = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f);\n\t\t\tfn_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f);\n\t\t\twhile (fn < fn_end) {\n\t\t\t\tduk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) *fn);\n\t\t\t\tfn++;\n\t\t\t}\n\t\t} else {\n\t\t\t/* May happen in some out-of-memory corner cases. */\n\t\t\tDUK_D(DUK_DPRINT(\"duk_hcompfunc 'data' is NULL, skipping marking\"));\n\t\t}\n\t} else if (DUK_HOBJECT_IS_DECENV(h)) {\n\t\tduk_hdecenv *e = (duk_hdecenv *) h;\n\t\tDUK_ASSERT_HDECENV_VALID(e);\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) e->thread);\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) e->varmap);\n\t} else if (DUK_HOBJECT_IS_OBJENV(h)) {\n\t\tduk_hobjenv *e = (duk_hobjenv *) h;\n\t\tDUK_ASSERT_HOBJENV_VALID(e);\n\t\tduk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) e->target);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t} else if (DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\tduk_hbufobj *b = (duk_hbufobj *) h;\n\t\tDUK_ASSERT_HBUFOBJ_VALID(b);\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) b->buf);\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) b->buf_prop);\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\t} else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) {\n\t\tduk_hboundfunc *f = (duk_hboundfunc *) h;\n\t\tDUK_ASSERT_HBOUNDFUNC_VALID(f);\n\t\tduk__mark_tval(heap, &f->target);\n\t\tduk__mark_tval(heap, &f->this_binding);\n\t\tduk__mark_tvals(heap, f->args, f->nargs);\n#if defined(DUK_USE_ES6_PROXY)\n\t} else if (DUK_HOBJECT_IS_PROXY(h)) {\n\t\tduk_hproxy *p = (duk_hproxy *) h;\n\t\tDUK_ASSERT_HPROXY_VALID(p);\n\t\tduk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->target);\n\t\tduk__mark_heaphdr_nonnull(heap, (duk_heaphdr *) p->handler);\n#endif  /* DUK_USE_ES6_PROXY */\n\t} else if (DUK_HOBJECT_IS_THREAD(h)) {\n\t\tduk_hthread *t = (duk_hthread *) h;\n\t\tduk_activation *act;\n\t\tduk_tval *tv;\n\n\t\tDUK_ASSERT_HTHREAD_VALID(t);\n\n\t\ttv = t->valstack;\n\t\twhile (tv < t->valstack_top) {\n\t\t\tduk__mark_tval(heap, tv);\n\t\t\ttv++;\n\t\t}\n\n\t\tfor (act = t->callstack_curr; act != NULL; act = act->parent) {\n\t\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) DUK_ACT_GET_FUNC(act));\n\t\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) act->var_env);\n\t\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) act->lex_env);\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\t\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) act->prev_caller);\n#endif\n#if 0  /* nothing now */\n\t\t\tfor (cat = act->cat; cat != NULL; cat = cat->parent) {\n\t\t\t}\n#endif\n\t\t}\n\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) t->resumer);\n\n\t\tfor (i = 0; i < DUK_NUM_BUILTINS; i++) {\n\t\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) t->builtins[i]);\n\t\t}\n\t} else {\n\t\t/* We may come here if the object should have a FASTREFS flag\n\t\t * but it's missing for some reason.  Assert for never getting\n\t\t * here; however, other than performance, this is harmless.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"missing FASTREFS flag for: %!iO\", h));\n\t\tDUK_ASSERT(0);\n\t}\n}\n\n/* Mark any duk_heaphdr type.  Recursion tracking happens only here. */\nDUK_LOCAL void duk__mark_heaphdr(duk_heap *heap, duk_heaphdr *h) {\n\tDUK_DDD(DUK_DDDPRINT(\"duk__mark_heaphdr %p, type %ld\",\n\t                     (void *) h,\n\t                     (h != NULL ? (long) DUK_HEAPHDR_GET_TYPE(h) : (long) -1)));\n\n\t/* XXX: add non-null variant? */\n\tif (h == NULL) {\n\t\treturn;\n\t}\n\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h) || DUK_HEAPHDR_HAS_REACHABLE(h));\n\n#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)\n\tif (!DUK_HEAPHDR_HAS_READONLY(h)) {\n\t\th->h_assert_refcount++;  /* Comparison refcount: bump even if already reachable. */\n\t}\n#endif\n\tif (DUK_HEAPHDR_HAS_REACHABLE(h)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"already marked reachable, skip\"));\n\t\treturn;\n\t}\n#if defined(DUK_USE_ROM_OBJECTS)\n\t/* READONLY objects always have REACHABLE set, so the check above\n\t * will prevent READONLY objects from being marked here.\n\t */\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(h));\n#endif\n\n\tDUK_HEAPHDR_SET_REACHABLE(h);\n\n\tif (heap->ms_recursion_depth >= DUK_USE_MARK_AND_SWEEP_RECLIMIT) {\n\t\tDUK_D(DUK_DPRINT(\"mark-and-sweep recursion limit reached, marking as temproot: %p\", (void *) h));\n\t\tDUK_HEAP_SET_MARKANDSWEEP_RECLIMIT_REACHED(heap);\n\t\tDUK_HEAPHDR_SET_TEMPROOT(h);\n\t\treturn;\n\t}\n\n\theap->ms_recursion_depth++;\n\tDUK_ASSERT(heap->ms_recursion_depth != 0);  /* Wrap. */\n\n\tswitch (DUK_HEAPHDR_GET_TYPE(h)) {\n\tcase DUK_HTYPE_STRING:\n\t\tduk__mark_hstring(heap, (duk_hstring *) h);\n\t\tbreak;\n\tcase DUK_HTYPE_OBJECT:\n\t\tduk__mark_hobject(heap, (duk_hobject *) h);\n\t\tbreak;\n\tcase DUK_HTYPE_BUFFER:\n\t\t/* nothing to mark */\n\t\tbreak;\n\tdefault:\n\t\tDUK_D(DUK_DPRINT(\"attempt to mark heaphdr %p with invalid htype %ld\", (void *) h, (long) DUK_HEAPHDR_GET_TYPE(h)));\n\t\tDUK_UNREACHABLE();\n\t}\n\n\tDUK_ASSERT(heap->ms_recursion_depth > 0);\n\theap->ms_recursion_depth--;\n}\n\nDUK_LOCAL void duk__mark_tval(duk_heap *heap, duk_tval *tv) {\n\tDUK_DDD(DUK_DDDPRINT(\"duk__mark_tval %p\", (void *) tv));\n\tif (tv == NULL) {\n\t\treturn;\n\t}\n\tif (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {\n\t\tduk_heaphdr *h;\n\t\th = DUK_TVAL_GET_HEAPHDR(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tduk__mark_heaphdr_nonnull(heap, h);\n\t}\n}\n\nDUK_LOCAL void duk__mark_tvals(duk_heap *heap, duk_tval *tv, duk_idx_t count) {\n\tDUK_ASSERT(count == 0 || tv != NULL);\n\n\twhile (count-- > 0) {\n\t\tif (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) {\n\t\t\tduk_heaphdr *h;\n\t\t\th = DUK_TVAL_GET_HEAPHDR(tv);\n\t\t\tDUK_ASSERT(h != NULL);\n\t\t\tduk__mark_heaphdr_nonnull(heap, h);\n\t\t}\n\t\ttv++;\n\t}\n}\n\n/* Mark any duk_heaphdr type, caller guarantees a non-NULL pointer. */\nDUK_LOCAL void duk__mark_heaphdr_nonnull(duk_heap *heap, duk_heaphdr *h) {\n\t/* For now, just call the generic handler.  Change when call sites\n\t * are changed too.\n\t */\n\tduk__mark_heaphdr(heap, h);\n}\n\n/*\n *  Mark the heap.\n */\n\nDUK_LOCAL void duk__mark_roots_heap(duk_heap *heap) {\n\tduk_small_uint_t i;\n\n\tDUK_DD(DUK_DDPRINT(\"duk__mark_roots_heap: %p\", (void *) heap));\n\n\tduk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_thread);\n\tduk__mark_heaphdr(heap, (duk_heaphdr *) heap->heap_object);\n\n\tfor (i = 0; i < DUK_HEAP_NUM_STRINGS; i++) {\n\t\tduk_hstring *h = DUK_HEAP_GET_STRING(heap, i);\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) h);\n\t}\n\n\tduk__mark_tval(heap, &heap->lj.value1);\n\tduk__mark_tval(heap, &heap->lj.value2);\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tfor (i = 0; i < heap->dbg_breakpoint_count; i++) {\n\t\tduk__mark_heaphdr(heap, (duk_heaphdr *) heap->dbg_breakpoints[i].filename);\n\t}\n#endif\n}\n\n/*\n *  Mark unreachable, finalizable objects.\n *\n *  Such objects will be moved aside and their finalizers run later.  They\n *  have to be treated as reachability roots for their properties etc to\n *  remain allocated.  This marking is only done for unreachable values which\n *  would be swept later.\n *\n *  Objects are first marked FINALIZABLE and only then marked as reachability\n *  roots; otherwise circular references might be handled inconsistently.\n */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_LOCAL void duk__mark_finalizable(duk_heap *heap) {\n\tduk_heaphdr *hdr;\n\tduk_size_t count_finalizable = 0;\n\n\tDUK_DD(DUK_DDPRINT(\"duk__mark_finalizable: %p\", (void *) heap));\n\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\n\thdr = heap->heap_allocated;\n\twhile (hdr != NULL) {\n\t\t/* A finalizer is looked up from the object and up its\n\t\t * prototype chain (which allows inherited finalizers).\n\t\t * The finalizer is checked for using a duk_hobject flag\n\t\t * which is kept in sync with the presence and callability\n\t\t * of a _Finalizer hidden symbol.\n\t\t */\n\n\t\tif (!DUK_HEAPHDR_HAS_REACHABLE(hdr) &&\n\t\t    DUK_HEAPHDR_IS_OBJECT(hdr) &&\n\t\t    !DUK_HEAPHDR_HAS_FINALIZED(hdr) &&\n\t\t    DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr)) {\n\t\t\t/* heaphdr:\n\t\t\t *  - is not reachable\n\t\t\t *  - is an object\n\t\t\t *  - is not a finalized object waiting for rescue/keep decision\n\t\t\t *  - has a finalizer\n\t\t\t */\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"unreachable heap object will be \"\n\t\t\t                   \"finalized -> mark as finalizable \"\n\t\t\t                   \"and treat as a reachability root: %p\",\n\t\t\t                   (void *) hdr));\n\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr));\n\t\t\tDUK_HEAPHDR_SET_FINALIZABLE(hdr);\n\t\t\tcount_finalizable++;\n\t\t}\n\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t}\n\n\tif (count_finalizable == 0) {\n\t\treturn;\n\t}\n\n\tDUK_DD(DUK_DDPRINT(\"marked %ld heap objects as finalizable, now mark them reachable\",\n\t                   (long) count_finalizable));\n\n\thdr = heap->heap_allocated;\n\twhile (hdr != NULL) {\n\t\tif (DUK_HEAPHDR_HAS_FINALIZABLE(hdr)) {\n\t\t\tduk__mark_heaphdr_nonnull(heap, hdr);\n\t\t}\n\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t}\n\n\t/* Caller will finish the marking process if we hit a recursion limit. */\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n/*\n *  Mark objects on finalize_list.\n */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_LOCAL void duk__mark_finalize_list(duk_heap *heap) {\n\tduk_heaphdr *hdr;\n#if defined(DUK_USE_DEBUG)\n\tduk_size_t count_finalize_list = 0;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"duk__mark_finalize_list: %p\", (void *) heap));\n\n\thdr = heap->finalize_list;\n\twhile (hdr != NULL) {\n\t\tduk__mark_heaphdr_nonnull(heap, hdr);\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n#if defined(DUK_USE_DEBUG)\n\t\tcount_finalize_list++;\n#endif\n\t}\n\n#if defined(DUK_USE_DEBUG)\n\tif (count_finalize_list > 0) {\n\t\tDUK_D(DUK_DPRINT(\"marked %ld objects on the finalize_list as reachable (previous finalizer run skipped)\",\n\t\t                 (long) count_finalize_list));\n\t}\n#endif\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n/*\n *  Fallback marking handler if recursion limit is reached.\n *\n *  Iterates 'temproots' until recursion limit is no longer hit.  Temproots\n *  can be in heap_allocated or finalize_list; refzero_list is now always\n *  empty for mark-and-sweep.  A temproot may occur in finalize_list now if\n *  there are objects on the finalize_list and user code creates a reference\n *  from an object in heap_allocated to the object in finalize_list (which is\n *  now allowed), and it happened to coincide with the recursion depth limit.\n *\n *  This is a slow scan, but guarantees that we finish with a bounded C stack.\n *\n *  Note that nodes may have been marked as temproots before this scan begun,\n *  OR they may have been marked during the scan (as we process nodes\n *  recursively also during the scan).  This is intended behavior.\n */\n\n#if defined(DUK_USE_DEBUG)\nDUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr, duk_size_t *count) {\n#else\nDUK_LOCAL void duk__handle_temproot(duk_heap *heap, duk_heaphdr *hdr) {\n#endif\n\tDUK_ASSERT(hdr != NULL);\n\n\tif (!DUK_HEAPHDR_HAS_TEMPROOT(hdr)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"not a temp root: %p\", (void *) hdr));\n\t\treturn;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"found a temp root: %p\", (void *) hdr));\n\tDUK_HEAPHDR_CLEAR_TEMPROOT(hdr);\n\tDUK_HEAPHDR_CLEAR_REACHABLE(hdr);  /* Done so that duk__mark_heaphdr() works correctly. */\n#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)\n\thdr->h_assert_refcount--;  /* Same node visited twice. */\n#endif\n\tduk__mark_heaphdr_nonnull(heap, hdr);\n\n#if defined(DUK_USE_DEBUG)\n\t(*count)++;\n#endif\n}\n\nDUK_LOCAL void duk__mark_temproots_by_heap_scan(duk_heap *heap) {\n\tduk_heaphdr *hdr;\n#if defined(DUK_USE_DEBUG)\n\tduk_size_t count;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"duk__mark_temproots_by_heap_scan: %p\", (void *) heap));\n\n\twhile (DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap)) {\n\t\tDUK_DD(DUK_DDPRINT(\"recursion limit reached, doing heap scan to continue from temproots\"));\n\n#if defined(DUK_USE_DEBUG)\n\t\tcount = 0;\n#endif\n\t\tDUK_HEAP_CLEAR_MARKANDSWEEP_RECLIMIT_REACHED(heap);\n\n\t\thdr = heap->heap_allocated;\n\t\twhile (hdr) {\n#if defined(DUK_USE_DEBUG)\n\t\t\tduk__handle_temproot(heap, hdr, &count);\n#else\n\t\t\tduk__handle_temproot(heap, hdr);\n#endif\n\t\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t\t}\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\t\thdr = heap->finalize_list;\n\t\twhile (hdr) {\n#if defined(DUK_USE_DEBUG)\n\t\t\tduk__handle_temproot(heap, hdr, &count);\n#else\n\t\t\tduk__handle_temproot(heap, hdr);\n#endif\n\t\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t\t}\n#endif\n\n#if defined(DUK_USE_DEBUG)\n\t\tDUK_DD(DUK_DDPRINT(\"temproot mark heap scan processed %ld temp roots\", (long) count));\n#endif\n\t}\n}\n\n/*\n *  Finalize refcounts for heap elements just about to be freed.\n *  This must be done for all objects before freeing to avoid any\n *  stale pointer dereferences.\n *\n *  Note that this must deduce the set of objects to be freed\n *  identically to duk__sweep_heap().\n */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\nDUK_LOCAL void duk__finalize_refcounts(duk_heap *heap) {\n\tduk_heaphdr *hdr;\n\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\n\tDUK_DD(DUK_DDPRINT(\"duk__finalize_refcounts: heap=%p\", (void *) heap));\n\n\thdr = heap->heap_allocated;\n\twhile (hdr) {\n\t\tif (!DUK_HEAPHDR_HAS_REACHABLE(hdr)) {\n\t\t\t/*\n\t\t\t *  Unreachable object about to be swept.  Finalize target refcounts\n\t\t\t *  (objects which the unreachable object points to) without doing\n\t\t\t *  refzero processing.  Recursive decrefs are also prevented when\n\t\t\t *  refzero processing is disabled.\n\t\t\t *\n\t\t\t *  Value cannot be a finalizable object, as they have been made\n\t\t\t *  temporarily reachable for this round.\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"unreachable object, refcount finalize before sweeping: %p\", (void *) hdr));\n\n\t\t\t/* Finalize using heap->heap_thread; DECREF has a\n\t\t\t * suppress check for mark-and-sweep which is based\n\t\t\t * on heap->ms_running.\n\t\t\t */\n\t\t\tduk_heaphdr_refcount_finalize_norz(heap, hdr);\n\t\t}\n\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t}\n}\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n/*\n *  Clear (reachable) flags of finalize_list.\n *\n *  We could mostly do in the sweep phase when we move objects from the\n *  heap into the finalize_list.  However, if a finalizer run is skipped\n *  during a mark-and-sweep, the objects on the finalize_list will be marked\n *  reachable during the next mark-and-sweep.  Since they're already on the\n *  finalize_list, no-one will be clearing their REACHABLE flag so we do it\n *  here.  (This now overlaps with the sweep handling in a harmless way.)\n */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_LOCAL void duk__clear_finalize_list_flags(duk_heap *heap) {\n\tduk_heaphdr *hdr;\n\n\tDUK_DD(DUK_DDPRINT(\"duk__clear_finalize_list_flags: %p\", (void *) heap));\n\n\thdr = heap->finalize_list;\n\twhile (hdr) {\n\t\tDUK_HEAPHDR_CLEAR_REACHABLE(hdr);\n#if defined(DUK_USE_ASSERTIONS)\n\t\tDUK_ASSERT(DUK_HEAPHDR_HAS_FINALIZABLE(hdr) || \\\n\t\t           (heap->currently_finalizing == hdr));\n#endif\n\t\t/* DUK_HEAPHDR_FLAG_FINALIZED may be set. */\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr));\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t}\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n/*\n *  Sweep stringtable.\n */\n\nDUK_LOCAL void duk__sweep_stringtable(duk_heap *heap, duk_size_t *out_count_keep) {\n\tduk_hstring *h;\n\tduk_hstring *prev;\n\tduk_uint32_t i;\n#if defined(DUK_USE_DEBUG)\n\tduk_size_t count_free = 0;\n#endif\n\tduk_size_t count_keep = 0;\n\n\tDUK_DD(DUK_DDPRINT(\"duk__sweep_stringtable: %p\", (void *) heap));\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tif (heap->strtable16 == NULL) {\n#else\n\tif (heap->strtable == NULL) {\n#endif\n\t\tgoto done;\n\t}\n\n\tfor (i = 0; i < heap->st_size; i++) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t\th = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]);\n#else\n\t\th = heap->strtable[i];\n#endif\n\t\tprev = NULL;\n\t\twhile (h != NULL) {\n\t\t\tduk_hstring *next;\n\t\t\tnext = h->hdr.h_next;\n\n\t\t\tif (DUK_HEAPHDR_HAS_REACHABLE((duk_heaphdr *) h)) {\n\t\t\t\tDUK_HEAPHDR_CLEAR_REACHABLE((duk_heaphdr *) h);\n\t\t\t\tcount_keep++;\n\t\t\t\tprev = h;\n\t\t\t} else {\n#if defined(DUK_USE_DEBUG)\n\t\t\t\tcount_free++;\n#endif\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\t\t/* Non-zero refcounts should not happen for unreachable strings,\n\t\t\t\t * because we refcount finalize all unreachable objects which\n\t\t\t\t * should have decreased unreachable string refcounts to zero\n\t\t\t\t * (even for cycles).\n\t\t\t\t */\n\t\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) == 0);\n#endif\n\n\t\t\t\t/* Deal with weak references first. */\n\t\t\t\tduk_heap_strcache_string_remove(heap, (duk_hstring *) h);\n\n\t\t\t\t/* Remove the string from the string table. */\n\t\t\t\tduk_heap_strtable_unlink_prev(heap, (duk_hstring *) h, (duk_hstring *) prev);\n\n\t\t\t\t/* Free inner references (these exist e.g. when external\n\t\t\t\t * strings are enabled) and the struct itself.\n\t\t\t\t */\n\t\t\t\tduk_free_hstring(heap, (duk_hstring *) h);\n\n\t\t\t\t/* Don't update 'prev'; it should be last string kept. */\n\t\t\t}\n\n\t\t\th = next;\n\t\t}\n\t}\n\n done:\n#if defined(DUK_USE_DEBUG)\n\tDUK_D(DUK_DPRINT(\"mark-and-sweep sweep stringtable: %ld freed, %ld kept\",\n\t                 (long) count_free, (long) count_keep));\n#endif\n\t*out_count_keep = count_keep;\n}\n\n/*\n *  Sweep heap.\n */\n\nDUK_LOCAL void duk__sweep_heap(duk_heap *heap, duk_small_uint_t flags, duk_size_t *out_count_keep) {\n\tduk_heaphdr *prev;  /* last element that was left in the heap */\n\tduk_heaphdr *curr;\n\tduk_heaphdr *next;\n#if defined(DUK_USE_DEBUG)\n\tduk_size_t count_free = 0;\n\tduk_size_t count_finalize = 0;\n\tduk_size_t count_rescue = 0;\n#endif\n\tduk_size_t count_keep = 0;\n\n\tDUK_DD(DUK_DDPRINT(\"duk__sweep_heap: %p\", (void *) heap));\n\n\tprev = NULL;\n\tcurr = heap->heap_allocated;\n\theap->heap_allocated = NULL;\n\twhile (curr) {\n\t\t/* Strings and ROM objects are never placed on the heap allocated list. */\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_STRING);\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(curr));\n\n\t\tnext = DUK_HEAPHDR_GET_NEXT(heap, curr);\n\n\t\tif (DUK_HEAPHDR_HAS_REACHABLE(curr)) {\n\t\t\t/*\n\t\t\t *  Reachable object:\n\t\t\t *    - If FINALIZABLE -> actually unreachable (but marked\n\t\t\t *      artificially reachable), queue to finalize_list.\n\t\t\t *    - If !FINALIZABLE but FINALIZED -> rescued after\n\t\t\t *      finalizer execution.\n\t\t\t *    - Otherwise just a normal, reachable object.\n\t\t\t *\n\t\t\t *  Objects which are kept are queued to heap_allocated\n\t\t\t *  tail (we're essentially filtering heap_allocated in\n\t\t\t *  practice).\n\t\t\t */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\t\t\tif (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZABLE(curr))) {\n\t\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(curr));\n\t\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT);\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"sweep; reachable, finalizable --> move to finalize_list: %p\", (void *) curr));\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\t\tDUK_HEAPHDR_PREINC_REFCOUNT(curr);  /* Bump refcount so that refzero never occurs when pending a finalizer call. */\n#endif\n\t\t\t\tDUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, curr);\n#if defined(DUK_USE_DEBUG)\n\t\t\t\tcount_finalize++;\n#endif\n\t\t\t}\n\t\t\telse\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\t\t\t{\n\t\t\t\tif (DUK_UNLIKELY(DUK_HEAPHDR_HAS_FINALIZED(curr))) {\n\t\t\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr));\n\t\t\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT);\n\n\t\t\t\t\tif (flags & DUK_MS_FLAG_POSTPONE_RESCUE) {\n\t\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"sweep; reachable, finalized, but postponing rescue decisions --> keep object (with FINALIZED set): %!iO\", curr));\n\t\t\t\t\t\tcount_keep++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"sweep; reachable, finalized --> rescued after finalization: %p\", (void *) curr));\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\t\t\t\t\t\tDUK_HEAPHDR_CLEAR_FINALIZED(curr);\n#endif\n#if defined(DUK_USE_DEBUG)\n\t\t\t\t\t\tcount_rescue++;\n#endif\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"sweep; reachable --> keep: %!iO\", curr));\n\t\t\t\t\tcount_keep++;\n\t\t\t\t}\n\n\t\t\t\tif (prev != NULL) {\n\t\t\t\t\tDUK_ASSERT(heap->heap_allocated != NULL);\n\t\t\t\t\tDUK_HEAPHDR_SET_NEXT(heap, prev, curr);\n\t\t\t\t} else {\n\t\t\t\t\tDUK_ASSERT(heap->heap_allocated == NULL);\n\t\t\t\t\theap->heap_allocated = curr;\n\t\t\t\t}\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n\t\t\t\tDUK_HEAPHDR_SET_PREV(heap, curr, prev);\n#endif\n\t\t\t\tDUK_ASSERT_HEAPHDR_LINKS(heap, prev);\n\t\t\t\tDUK_ASSERT_HEAPHDR_LINKS(heap, curr);\n\t\t\t\tprev = curr;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t *  Shrink check for value stacks here.  We're inside\n\t\t\t *  ms_prevent_count protection which prevents recursive\n\t\t\t *  mark-and-sweep and refzero finalizers, so there are\n\t\t\t *  no side effects that would affect the heap lists.\n\t\t\t */\n\t\t\tif (DUK_HEAPHDR_IS_OBJECT(curr) && DUK_HOBJECT_IS_THREAD((duk_hobject *) curr)) {\n\t\t\t\tduk_hthread *thr_curr = (duk_hthread *) curr;\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"value stack shrink check for thread: %!O\", curr));\n\t\t\t\tduk_valstack_shrink_check_nothrow(thr_curr, flags & DUK_MS_FLAG_EMERGENCY /*snug*/);\n\t\t\t}\n\n\t\t\tDUK_HEAPHDR_CLEAR_REACHABLE(curr);\n\t\t\t/* Keep FINALIZED if set, used if rescue decisions are postponed. */\n\t\t\t/* Keep FINALIZABLE for objects on finalize_list. */\n\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(curr));\n\t\t} else {\n\t\t\t/*\n\t\t\t *  Unreachable object:\n\t\t\t *    - If FINALIZED, object was finalized but not\n\t\t\t *      rescued.  This doesn't affect freeing.\n\t\t\t *    - Otherwise normal unreachable object.\n\t\t\t *\n\t\t\t *  There's no guard preventing a FINALIZED object\n\t\t\t *  from being freed while finalizers execute: the\n\t\t\t *  artificial finalize_list reachability roots can't\n\t\t\t *  cause an incorrect free decision (but can cause\n\t\t\t *  an incorrect rescue decision).\n\t\t\t */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\t/* Non-zero refcounts should not happen because we refcount\n\t\t\t * finalize all unreachable objects which should cancel out\n\t\t\t * refcounts (even for cycles).\n\t\t\t */\n\t\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(curr) == 0);\n#endif\n\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(curr));\n\n#if defined(DUK_USE_DEBUG)\n\t\t\tif (DUK_HEAPHDR_HAS_FINALIZED(curr)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"sweep; unreachable, finalized --> finalized object not rescued: %p\", (void *) curr));\n\t\t\t} else {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"sweep; not reachable --> free: %p\", (void *) curr));\n\t\t\t}\n\n#endif\n\n\t\t\t/* Note: object cannot be a finalizable unreachable object, as\n\t\t\t * they have been marked temporarily reachable for this round,\n\t\t\t * and are handled above.\n\t\t\t */\n\n#if defined(DUK_USE_DEBUG)\n\t\t\tcount_free++;\n#endif\n\n\t\t\t/* Weak refs should be handled here, but no weak refs for\n\t\t\t * any non-string objects exist right now.\n\t\t\t */\n\n\t\t\t/* Free object and all auxiliary (non-heap) allocs. */\n\t\t\tduk_heap_free_heaphdr_raw(heap, curr);\n\t\t}\n\n\t\tcurr = next;\n\t}\n\n\tif (prev != NULL) {\n\t\tDUK_HEAPHDR_SET_NEXT(heap, prev, NULL);\n\t}\n\tDUK_ASSERT_HEAPHDR_LINKS(heap, prev);\n\n#if defined(DUK_USE_DEBUG)\n\tDUK_D(DUK_DPRINT(\"mark-and-sweep sweep objects (non-string): %ld freed, %ld kept, %ld rescued, %ld queued for finalization\",\n\t                 (long) count_free, (long) count_keep, (long) count_rescue, (long) count_finalize));\n#endif\n\t*out_count_keep = count_keep;\n}\n\n/*\n *  Object compaction.\n *\n *  Compaction is assumed to never throw an error.\n */\n\nDUK_LOCAL int duk__protected_compact_object(duk_hthread *thr, void *udata) {\n\tduk_hobject *obj;\n\t/* XXX: for threads, compact stacks? */\n\n\tDUK_UNREF(udata);\n\tobj = duk_known_hobject(thr, -1);\n\tduk_hobject_compact_props(thr, obj);\n\treturn 0;\n}\n\n#if defined(DUK_USE_DEBUG)\nDUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start, duk_size_t *p_count_check, duk_size_t *p_count_compact, duk_size_t *p_count_bytes_saved) {\n#else\nDUK_LOCAL void duk__compact_object_list(duk_heap *heap, duk_hthread *thr, duk_heaphdr *start) {\n#endif\n\tduk_heaphdr *curr;\n#if defined(DUK_USE_DEBUG)\n\tduk_size_t old_size, new_size;\n#endif\n\tduk_hobject *obj;\n\n\tDUK_UNREF(heap);\n\n\tcurr = start;\n\twhile (curr) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"mark-and-sweep compact: %p\", (void *) curr));\n\n\t\tif (DUK_HEAPHDR_GET_TYPE(curr) != DUK_HTYPE_OBJECT) {\n\t\t\tgoto next;\n\t\t}\n\t\tobj = (duk_hobject *) curr;\n\n#if defined(DUK_USE_DEBUG)\n\t\told_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),\n\t\t                                      DUK_HOBJECT_GET_ASIZE(obj),\n\t\t                                      DUK_HOBJECT_GET_HSIZE(obj));\n#endif\n\n\t\tDUK_DD(DUK_DDPRINT(\"compact object: %p\", (void *) obj));\n\t\tduk_push_hobject(thr, obj);\n\t\t/* XXX: disable error handlers for duration of compaction? */\n\t\tduk_safe_call(thr, duk__protected_compact_object, NULL, 1, 0);\n\n#if defined(DUK_USE_DEBUG)\n\t\tnew_size = DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),\n\t\t                                      DUK_HOBJECT_GET_ASIZE(obj),\n\t\t                                      DUK_HOBJECT_GET_HSIZE(obj));\n#endif\n\n#if defined(DUK_USE_DEBUG)\n\t\t(*p_count_compact)++;\n\t\t(*p_count_bytes_saved) += (duk_size_t) (old_size - new_size);\n#endif\n\n\t next:\n\t\tcurr = DUK_HEAPHDR_GET_NEXT(heap, curr);\n#if defined(DUK_USE_DEBUG)\n\t\t(*p_count_check)++;\n#endif\n\t}\n}\n\nDUK_LOCAL void duk__compact_objects(duk_heap *heap) {\n\t/* XXX: which lists should participate?  to be finalized? */\n#if defined(DUK_USE_DEBUG)\n\tduk_size_t count_check = 0;\n\tduk_size_t count_compact = 0;\n\tduk_size_t count_bytes_saved = 0;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"duk__compact_objects: %p\", (void *) heap));\n\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\n#if defined(DUK_USE_DEBUG)\n\tduk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated, &count_check, &count_compact, &count_bytes_saved);\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tduk__compact_object_list(heap, heap->heap_thread, heap->finalize_list, &count_check, &count_compact, &count_bytes_saved);\n#endif\n#else\n\tduk__compact_object_list(heap, heap->heap_thread, heap->heap_allocated);\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tduk__compact_object_list(heap, heap->heap_thread, heap->finalize_list);\n#endif\n#endif\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);  /* Always handled to completion inline in DECREF. */\n#endif\n\n#if defined(DUK_USE_DEBUG)\n\tDUK_D(DUK_DPRINT(\"mark-and-sweep compact objects: %ld checked, %ld compaction attempts, %ld bytes saved by compaction\",\n\t                 (long) count_check, (long) count_compact, (long) count_bytes_saved));\n#endif\n}\n\n/*\n *  Assertion helpers.\n */\n\n#if defined(DUK_USE_ASSERTIONS)\nDUK_LOCAL void duk__assert_heaphdr_flags(duk_heap *heap) {\n\tduk_heaphdr *hdr;\n\n\thdr = heap->heap_allocated;\n\twhile (hdr) {\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_REACHABLE(hdr));\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_TEMPROOT(hdr));\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZABLE(hdr));\n\t\t/* may have FINALIZED */\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t}\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);  /* Always handled to completion inline in DECREF. */\n#endif\n}\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\nDUK_LOCAL void duk__assert_valid_refcounts(duk_heap *heap) {\n\tduk_heaphdr *hdr = heap->heap_allocated;\n\twhile (hdr) {\n\t\t/* Cannot really assert much w.r.t. refcounts now. */\n\n\t\tif (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0 &&\n\t\t    DUK_HEAPHDR_HAS_FINALIZED(hdr)) {\n\t\t\t/* An object may be in heap_allocated list with a zero\n\t\t\t * refcount if it has just been finalized and is waiting\n\t\t\t * to be collected by the next cycle.\n\t\t\t * (This doesn't currently happen however.)\n\t\t\t */\n\t\t} else if (DUK_HEAPHDR_GET_REFCOUNT(hdr) == 0) {\n\t\t\t/* An object may be in heap_allocated list with a zero\n\t\t\t * refcount also if it is a temporary object created\n\t\t\t * during debugger paused state.  It will get collected\n\t\t\t * by mark-and-sweep based on its reachability status\n\t\t\t * (presumably not reachable because refcount is 0).\n\t\t\t */\n\t\t}\n\t\tDUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(hdr) >= 0);  /* Unsigned. */\n\t\thdr = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t}\n}\n\nDUK_LOCAL void duk__clear_assert_refcounts(duk_heap *heap) {\n\tduk_heaphdr *curr;\n\tduk_uint32_t i;\n\n\tfor (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {\n\t\tcurr->h_assert_refcount = 0;\n\t}\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tfor (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {\n\t\tcurr->h_assert_refcount = 0;\n\t}\n#endif\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tfor (curr = heap->refzero_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {\n\t\tcurr->h_assert_refcount = 0;\n\t}\n#endif\n\n\tfor (i = 0; i < heap->st_size; i++) {\n\t\tduk_hstring *h;\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t\th = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]);\n#else\n\t\th = heap->strtable[i];\n#endif\n\t\twhile (h != NULL) {\n\t\t\t((duk_heaphdr *) h)->h_assert_refcount = 0;\n\t\t\th = h->hdr.h_next;\n\t\t}\n\t}\n}\n\nDUK_LOCAL void duk__check_refcount_heaphdr(duk_heaphdr *hdr) {\n\tduk_bool_t count_ok;\n\n\t/* The refcount check only makes sense for reachable objects on\n\t * heap_allocated or string table, after the sweep phase.  Prior to\n\t * sweep phase refcounts will include references that are not visible\n\t * via reachability roots.\n\t *\n\t * Because we're called after the sweep phase, all heap objects on\n\t * heap_allocated are reachable.  REACHABLE flags have already been\n\t * cleared so we can't check them.\n\t */\n\n\t/* ROM objects have intentionally incorrect refcount (1), but we won't\n\t * check them.\n\t */\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY(hdr));\n\n\tcount_ok = ((duk_size_t) DUK_HEAPHDR_GET_REFCOUNT(hdr) == hdr->h_assert_refcount);\n\tif (!count_ok) {\n\t\tDUK_D(DUK_DPRINT(\"refcount mismatch for: %p: header=%ld counted=%ld --> %!iO\",\n\t\t                 (void *) hdr, (long) DUK_HEAPHDR_GET_REFCOUNT(hdr),\n\t\t                 (long) hdr->h_assert_refcount, hdr));\n\t\tDUK_ASSERT(0);\n\t}\n}\n\nDUK_LOCAL void duk__check_assert_refcounts(duk_heap *heap) {\n\tduk_heaphdr *curr;\n\tduk_uint32_t i;\n\n\tfor (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {\n\t\tduk__check_refcount_heaphdr(curr);\n\t}\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tfor (curr = heap->finalize_list; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {\n\t\tduk__check_refcount_heaphdr(curr);\n\t}\n#endif\n\n\tfor (i = 0; i < heap->st_size; i++) {\n\t\tduk_hstring *h;\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t\th = DUK_USE_HEAPPTR_DEC16(heap->heap_udata, heap->strtable16[i]);\n#else\n\t\th = heap->strtable[i];\n#endif\n\t\twhile (h != NULL) {\n\t\t\tduk__check_refcount_heaphdr((duk_heaphdr *) h);\n\t\t\th = h->hdr.h_next;\n\t\t}\n\t}\n}\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n#endif  /* DUK_USE_ASSERTIONS */\n\n/*\n *  Stats dump.\n */\n\n#if defined(DUK_USE_DEBUG)\nDUK_LOCAL void duk__dump_stats(duk_heap *heap) {\n\tDUK_D(DUK_DPRINT(\"stats executor: opcodes=%ld, interrupt=%ld, throw=%ld\",\n\t                 (long) heap->stats_exec_opcodes, (long) heap->stats_exec_interrupt,\n\t                 (long) heap->stats_exec_throw));\n\tDUK_D(DUK_DPRINT(\"stats call: all=%ld, tailcall=%ld, ecmatoecma=%ld\",\n\t                 (long) heap->stats_call_all, (long) heap->stats_call_tailcall,\n\t                 (long) heap->stats_call_ecmatoecma));\n\tDUK_D(DUK_DPRINT(\"stats safecall: all=%ld, nothrow=%ld, throw=%ld\",\n\t                 (long) heap->stats_safecall_all, (long) heap->stats_safecall_nothrow,\n\t                 (long) heap->stats_safecall_throw));\n\tDUK_D(DUK_DPRINT(\"stats mark-and-sweep: try_count=%ld, skip_count=%ld, emergency_count=%ld\",\n\t                 (long) heap->stats_ms_try_count, (long) heap->stats_ms_skip_count,\n\t                 (long) heap->stats_ms_emergency_count));\n\tDUK_D(DUK_DPRINT(\"stats stringtable: intern_hit=%ld, intern_miss=%ld, resize_check=%ld, resize_grow=%ld, resize_shrink=%ld\",\n\t                 (long) heap->stats_strtab_intern_hit, (long) heap->stats_strtab_intern_miss,\n\t                 (long) heap->stats_strtab_resize_check, (long) heap->stats_strtab_resize_grow,\n\t                 (long) heap->stats_strtab_resize_shrink));\n\tDUK_D(DUK_DPRINT(\"stats object: realloc_props=%ld, abandon_array=%ld\",\n\t                 (long) heap->stats_object_realloc_props, (long) heap->stats_object_abandon_array));\n\tDUK_D(DUK_DPRINT(\"stats getownpropdesc: count=%ld, hit=%ld, miss=%ld\",\n\t                 (long) heap->stats_getownpropdesc_count, (long) heap->stats_getownpropdesc_hit,\n\t                 (long) heap->stats_getownpropdesc_miss));\n\tDUK_D(DUK_DPRINT(\"stats getpropdesc: count=%ld, hit=%ld, miss=%ld\",\n\t                 (long) heap->stats_getpropdesc_count, (long) heap->stats_getpropdesc_hit,\n\t                 (long) heap->stats_getpropdesc_miss));\n\tDUK_D(DUK_DPRINT(\"stats getprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, \"\n\t                 \"bufferidx=%ld, bufferlen=%ld, stringidx=%ld, stringlen=%ld, \"\n\t                 \"proxy=%ld, arguments=%ld\",\n\t                 (long) heap->stats_getprop_all, (long) heap->stats_getprop_arrayidx,\n\t                 (long) heap->stats_getprop_bufobjidx, (long) heap->stats_getprop_bufferidx,\n\t                 (long) heap->stats_getprop_bufferlen, (long) heap->stats_getprop_stringidx,\n\t                 (long) heap->stats_getprop_stringlen, (long) heap->stats_getprop_proxy,\n\t                 (long) heap->stats_getprop_arguments));\n\tDUK_D(DUK_DPRINT(\"stats putprop: all=%ld, arrayidx=%ld, bufobjidx=%ld, \"\n\t                 \"bufferidx=%ld, proxy=%ld\",\n\t                 (long) heap->stats_putprop_all, (long) heap->stats_putprop_arrayidx,\n\t                 (long) heap->stats_putprop_bufobjidx, (long) heap->stats_putprop_bufferidx,\n\t                 (long) heap->stats_putprop_proxy));\n\tDUK_D(DUK_DPRINT(\"stats getvar: all=%ld\",\n\t                 (long) heap->stats_getvar_all));\n\tDUK_D(DUK_DPRINT(\"stats putvar: all=%ld\",\n\t                 (long) heap->stats_putvar_all));\n}\n#endif  /* DUK_USE_DEBUG */\n\n/*\n *  Main mark-and-sweep function.\n *\n *  'flags' represents the features requested by the caller.  The current\n *  heap->ms_base_flags is ORed automatically into the flags; the base flags\n *  mask typically prevents certain mark-and-sweep operation to avoid trouble.\n */\n\nDUK_INTERNAL void duk_heap_mark_and_sweep(duk_heap *heap, duk_small_uint_t flags) {\n\tduk_size_t count_keep_obj;\n\tduk_size_t count_keep_str;\n#if defined(DUK_USE_VOLUNTARY_GC)\n\tduk_size_t tmp;\n#endif\n\n\tDUK_STATS_INC(heap, stats_ms_try_count);\n#if defined(DUK_USE_DEBUG)\n\tif (flags & DUK_MS_FLAG_EMERGENCY) {\n\t\tDUK_STATS_INC(heap, stats_ms_emergency_count);\n\t}\n#endif\n\n\t/* If debugger is paused, garbage collection is disabled by default.\n\t * This is achieved by bumping ms_prevent_count when becoming paused.\n\t */\n\tDUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap) || heap->ms_prevent_count > 0);\n\n\t/* Prevention/recursion check as soon as possible because we may\n\t * be called a number of times when voluntary mark-and-sweep is\n\t * pending.\n\t */\n\tif (heap->ms_prevent_count != 0) {\n\t\tDUK_DD(DUK_DDPRINT(\"reject recursive mark-and-sweep\"));\n\t\tDUK_STATS_INC(heap, stats_ms_skip_count);\n\t\treturn;\n\t}\n\tDUK_ASSERT(heap->ms_running == 0);  /* ms_prevent_count is bumped when ms_running is set */\n\n\t/* Heap_thread is used during mark-and-sweep for refcount finalization\n\t * (it's also used for finalizer execution once mark-and-sweep is\n\t * complete).  Heap allocation code ensures heap_thread is set and\n\t * properly initialized before setting ms_prevent_count to 0.\n\t */\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tDUK_ASSERT(heap->heap_thread->valstack != NULL);\n\n\tDUK_D(DUK_DPRINT(\"garbage collect (mark-and-sweep) starting, requested flags: 0x%08lx, effective flags: 0x%08lx\",\n\t                 (unsigned long) flags, (unsigned long) (flags | heap->ms_base_flags)));\n\n\tflags |= heap->ms_base_flags;\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tif (heap->finalize_list != NULL) {\n\t\tflags |= DUK_MS_FLAG_POSTPONE_RESCUE;\n\t}\n#endif\n\n\t/*\n\t *  Assertions before\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(heap->ms_prevent_count == 0);\n\tDUK_ASSERT(heap->ms_running == 0);\n\tDUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(heap));\n\tDUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap));\n\tDUK_ASSERT(heap->ms_recursion_depth == 0);\n\tduk__assert_heaphdr_flags(heap);\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t/* Note: heap->refzero_free_running may be true; a refcount\n\t * finalizer may trigger a mark-and-sweep.\n\t */\n\tduk__assert_valid_refcounts(heap);\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n#endif  /* DUK_USE_ASSERTIONS */\n\n\t/*\n\t *  Begin\n\t */\n\n\tDUK_ASSERT(heap->ms_prevent_count == 0);\n\tDUK_ASSERT(heap->ms_running == 0);\n\theap->ms_prevent_count = 1;\n\theap->ms_running = 1;\n\n\t/*\n\t *  Free activation/catcher freelists on every mark-and-sweep for now.\n\t *  This is an initial rough draft; ideally we'd keep count of the\n\t *  freelist size and free only excess entries.\n\t */\n\n\tDUK_D(DUK_DPRINT(\"freeing temporary freelists\"));\n\tduk_heap_free_freelists(heap);\n\n\t/*\n\t *  Mark roots, hoping that recursion limit is not normally hit.\n\t *  If recursion limit is hit, run additional reachability rounds\n\t *  starting from \"temproots\" until marking is complete.\n\t *\n\t *  Marking happens in two phases: first we mark actual reachability\n\t *  roots (and run \"temproots\" to complete the process).  Then we\n\t *  check which objects are unreachable and are finalizable; such\n\t *  objects are marked as FINALIZABLE and marked as reachability\n\t *  (and \"temproots\" is run again to complete the process).\n\t *\n\t *  The heap finalize_list must also be marked as a reachability root.\n\t *  There may be objects on the list from a previous round if the\n\t *  previous run had finalizer skip flag.\n\t */\n\n#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)\n\tduk__clear_assert_refcounts(heap);\n#endif\n\tduk__mark_roots_heap(heap);               /* Mark main reachability roots. */\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);   /* Always handled to completion inline in DECREF. */\n#endif\n\tduk__mark_temproots_by_heap_scan(heap);   /* Temproots. */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tduk__mark_finalizable(heap);              /* Mark finalizable as reachability roots. */\n\tduk__mark_finalize_list(heap);            /* Mark finalizer work list as reachability roots. */\n#endif\n\tduk__mark_temproots_by_heap_scan(heap);   /* Temproots. */\n\n\t/*\n\t *  Sweep garbage and remove marking flags, and move objects with\n\t *  finalizers to the finalizer work list.\n\t *\n\t *  Objects to be swept need to get their refcounts finalized before\n\t *  they are swept.  In other words, their target object refcounts\n\t *  need to be decreased.  This has to be done before freeing any\n\t *  objects to avoid decref'ing dangling pointers (which may happen\n\t *  even without bugs, e.g. with reference loops)\n\t *\n\t *  Because strings don't point to other heap objects, similar\n\t *  finalization is not necessary for strings.\n\t */\n\n\t/* XXX: more emergency behavior, e.g. find smaller hash sizes etc */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk__finalize_refcounts(heap);\n#endif\n\tduk__sweep_heap(heap, flags, &count_keep_obj);\n\tduk__sweep_stringtable(heap, &count_keep_str);\n#if defined(DUK_USE_ASSERTIONS) && defined(DUK_USE_REFERENCE_COUNTING)\n\tduk__check_assert_refcounts(heap);\n#endif\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tDUK_ASSERT(heap->refzero_list == NULL);   /* Always handled to completion inline in DECREF. */\n#endif\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\tduk__clear_finalize_list_flags(heap);\n#endif\n\n\t/*\n\t *  Object compaction (emergency only).\n\t *\n\t *  Object compaction is a separate step after sweeping, as there is\n\t *  more free memory for it to work with.  Also, currently compaction\n\t *  may insert new objects into the heap allocated list and the string\n\t *  table which we don't want to do during a sweep (the reachability\n\t *  flags of such objects would be incorrect).  The objects inserted\n\t *  are currently:\n\t *\n\t *    - a temporary duk_hbuffer for a new properties allocation\n\t *    - if array part is abandoned, string keys are interned\n\t *\n\t *  The object insertions go to the front of the list, so they do not\n\t *  cause an infinite loop (they are not compacted).\n\t */\n\n\tif ((flags & DUK_MS_FLAG_EMERGENCY) &&\n\t    !(flags & DUK_MS_FLAG_NO_OBJECT_COMPACTION)) {\n\t\tduk__compact_objects(heap);\n\t}\n\n\t/*\n\t *  String table resize check.\n\t *\n\t *  This is mainly useful in emergency GC: if the string table load\n\t *  factor is really low for some reason, we can shrink the string\n\t *  table to a smaller size and free some memory in the process.\n\t *  Only execute in emergency GC.  String table has internal flags\n\t *  to protect against recursive resizing if this mark-and-sweep pass\n\t *  was triggered by a string table resize.\n\t */\n\n\tif (flags & DUK_MS_FLAG_EMERGENCY) {\n\t\tDUK_D(DUK_DPRINT(\"stringtable resize check in emergency gc\"));\n\t\tduk_heap_strtable_force_resize(heap);\n\t}\n\n\t/*\n\t *  Finish\n\t */\n\n\tDUK_ASSERT(heap->ms_prevent_count == 1);\n\theap->ms_prevent_count = 0;\n\tDUK_ASSERT(heap->ms_running == 1);\n\theap->ms_running = 0;\n\n\t/*\n\t *  Assertions after\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(heap->ms_prevent_count == 0);\n\tDUK_ASSERT(!DUK_HEAP_HAS_MARKANDSWEEP_RECLIMIT_REACHED(heap));\n\tDUK_ASSERT(heap->ms_recursion_depth == 0);\n\tduk__assert_heaphdr_flags(heap);\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t/* Note: heap->refzero_free_running may be true; a refcount\n\t * finalizer may trigger a mark-and-sweep.\n\t */\n\tduk__assert_valid_refcounts(heap);\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n#endif  /* DUK_USE_ASSERTIONS */\n\n\t/*\n\t *  Reset trigger counter\n\t */\n\n#if defined(DUK_USE_VOLUNTARY_GC)\n\ttmp = (count_keep_obj + count_keep_str) / 256;\n\theap->ms_trigger_counter = (duk_int_t) (\n\t    (tmp * DUK_HEAP_MARK_AND_SWEEP_TRIGGER_MULT) +\n\t    DUK_HEAP_MARK_AND_SWEEP_TRIGGER_ADD);\n\tDUK_D(DUK_DPRINT(\"garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, trigger reset to %ld\",\n\t                 (long) count_keep_obj, (long) count_keep_str, (long) heap->ms_trigger_counter));\n#else\n\tDUK_D(DUK_DPRINT(\"garbage collect (mark-and-sweep) finished: %ld objects kept, %ld strings kept, no voluntary trigger\",\n\t                 (long) count_keep_obj, (long) count_keep_str));\n#endif\n\n\t/*\n\t *  Stats dump\n\t */\n\n#if defined(DUK_USE_DEBUG)\n\tduk__dump_stats(heap);\n#endif\n\n\t/*\n\t *  Finalize objects in the finalization work list.  Finalized\n\t *  objects are queued back to heap_allocated with FINALIZED set.\n\t *\n\t *  Since finalizers may cause arbitrary side effects, they are\n\t *  prevented e.g. during string table and object property allocation\n\t *  resizing using heap->pf_prevent_count.  In this case the objects\n\t *  remain in the finalization work list after mark-and-sweep exits\n\t *  and they may be finalized on the next pass or any DECREF checking\n\t *  for finalize_list.\n\t *\n\t *  As of Duktape 2.1 finalization happens outside mark-and-sweep\n\t *  protection.  Mark-and-sweep is allowed while the finalize_list\n\t *  is being processed, but no rescue decisions are done while the\n\t *  process is on-going.  This avoids incorrect rescue decisions\n\t *  if an object is considered reachable (and thus rescued) because\n\t *  of a reference via finalize_list (which is considered a reachability\n\t *  root).  When finalize_list is being processed, reachable objects\n\t *  with FINALIZED set will just keep their FINALIZED flag for later\n\t *  mark-and-sweep processing.\n\t *\n\t *  This could also be handled (a bit better) by having a more refined\n\t *  notion of reachability for rescue/free decisions.\n\t *\n\t *  XXX: avoid finalizer execution when doing emergency GC?\n\t */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\t/* Attempt to process finalize_list, pf_prevent_count check\n\t * is inside the target.\n\t */\n\tduk_heap_process_finalize_list(heap);\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n}\n#line 1 \"duk_heap_memory.c\"\n/*\n *  Memory allocation handling.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Voluntary GC check\n */\n\n#if defined(DUK_USE_VOLUNTARY_GC)\nDUK_LOCAL DUK_INLINE void duk__check_voluntary_gc(duk_heap *heap) {\n\tif (DUK_UNLIKELY(--(heap)->ms_trigger_counter < 0)) {\n#if defined(DUK_USE_DEBUG)\n\t\tif (heap->ms_prevent_count == 0) {\n\t\t\tDUK_D(DUK_DPRINT(\"triggering voluntary mark-and-sweep\"));\n\t\t} else {\n\t\t\tDUK_DD(DUK_DDPRINT(\"gc blocked -> skip voluntary mark-and-sweep now\"));\n\t\t}\n#endif\n\n\t\t/* Prevention checks in the call target handle cases where\n\t\t * voluntary GC is not allowed.  The voluntary GC trigger\n\t\t * counter is only rewritten if mark-and-sweep actually runs.\n\t\t */\n\t\tduk_heap_mark_and_sweep(heap, DUK_MS_FLAG_VOLUNTARY /*flags*/);\n\t}\n}\n#define DUK__VOLUNTARY_PERIODIC_GC(heap)  do { duk__check_voluntary_gc((heap)); } while (0)\n#else\n#define DUK__VOLUNTARY_PERIODIC_GC(heap)  /* no voluntary gc */\n#endif  /* DUK_USE_VOLUNTARY_GC */\n\n/*\n *  Allocate memory with garbage collection\n */\n\nDUK_INTERNAL void *duk_heap_mem_alloc(duk_heap *heap, duk_size_t size) {\n\tvoid *res;\n\tduk_small_int_t i;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT_DISABLE(size >= 0);\n\n\t/*\n\t *  Voluntary periodic GC (if enabled)\n\t */\n\n\tDUK__VOLUNTARY_PERIODIC_GC(heap);\n\n\t/*\n\t *  First attempt\n\t */\n\n#if defined(DUK_USE_GC_TORTURE)\n\t/* Simulate alloc failure on every alloc, except when mark-and-sweep\n\t * is running.\n\t */\n\tif (heap->ms_prevent_count == 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"gc torture enabled, pretend that first alloc attempt fails\"));\n\t\tres = NULL;\n\t\tDUK_UNREF(res);\n\t\tgoto skip_attempt;\n\t}\n#endif\n\tres = heap->alloc_func(heap->heap_udata, size);\n\tif (DUK_LIKELY(res || size == 0)) {\n\t\t/* For zero size allocations NULL is allowed. */\n\t\treturn res;\n\t}\n#if defined(DUK_USE_GC_TORTURE)\n skip_attempt:\n#endif\n\n\tDUK_D(DUK_DPRINT(\"first alloc attempt failed, attempt to gc and retry\"));\n\n#if 0\n\t/*\n\t *  Avoid a GC if GC is already running.  This can happen at a late\n\t *  stage in a GC when we try to e.g. resize the stringtable\n\t *  or compact objects.\n\t *\n\t *  NOTE: explicit handling isn't actually be needed: if the GC is\n\t *  not allowed, duk_heap_mark_and_sweep() will reject it for every\n\t *  attempt in the loop below, resulting in a NULL same as here.\n\t */\n\n\tif (heap->ms_prevent_count != 0) {\n\t\tDUK_D(DUK_DPRINT(\"duk_heap_mem_alloc() failed, gc in progress (gc skipped), alloc size %ld\", (long) size));\n\t\treturn NULL;\n\t}\n#endif\n\n\t/*\n\t *  Retry with several GC attempts.  Initial attempts are made without\n\t *  emergency mode; later attempts use emergency mode which minimizes\n\t *  memory allocations forcibly.\n\t */\n\n\tfor (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) {\n\t\tduk_small_uint_t flags;\n\n\t\tflags = 0;\n\t\tif (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) {\n\t\t\tflags |= DUK_MS_FLAG_EMERGENCY;\n\t\t}\n\n\t\tduk_heap_mark_and_sweep(heap, flags);\n\n\t\tres = heap->alloc_func(heap->heap_udata, size);\n\t\tif (res) {\n\t\t\tDUK_D(DUK_DPRINT(\"duk_heap_mem_alloc() succeeded after gc (pass %ld), alloc size %ld\",\n\t\t\t                 (long) (i + 1), (long) size));\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tDUK_D(DUK_DPRINT(\"duk_heap_mem_alloc() failed even after gc, alloc size %ld\", (long) size));\n\treturn NULL;\n}\n\nDUK_INTERNAL void *duk_heap_mem_alloc_zeroed(duk_heap *heap, duk_size_t size) {\n\tvoid *res;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT_DISABLE(size >= 0);\n\n\tres = DUK_ALLOC(heap, size);\n\tif (DUK_LIKELY(res != NULL)) {\n\t\t/* assume memset with zero size is OK */\n\t\tDUK_MEMZERO(res, size);\n\t}\n\treturn res;\n}\n\nDUK_INTERNAL void *duk_heap_mem_alloc_checked(duk_hthread *thr, duk_size_t size) {\n\tvoid *res;\n\n\tDUK_ASSERT(thr != NULL);\n\tres = duk_heap_mem_alloc(thr->heap, size);\n\tif (DUK_LIKELY(res != NULL || size == 0)) {\n\t\treturn res;\n\t}\n\tDUK_ERROR_ALLOC_FAILED(thr);\n\treturn NULL;\n}\n\nDUK_INTERNAL void *duk_heap_mem_alloc_checked_zeroed(duk_hthread *thr, duk_size_t size) {\n\tvoid *res;\n\n\tDUK_ASSERT(thr != NULL);\n\tres = duk_heap_mem_alloc_zeroed(thr->heap, size);\n\tif (DUK_LIKELY(res != NULL || size == 0)) {\n\t\treturn res;\n\t}\n\tDUK_ERROR_ALLOC_FAILED(thr);\n\treturn NULL;\n}\n\n/*\n *  Reallocate memory with garbage collection\n */\n\nDUK_INTERNAL void *duk_heap_mem_realloc(duk_heap *heap, void *ptr, duk_size_t newsize) {\n\tvoid *res;\n\tduk_small_int_t i;\n\n\tDUK_ASSERT(heap != NULL);\n\t/* ptr may be NULL */\n\tDUK_ASSERT_DISABLE(newsize >= 0);\n\n\t/*\n\t *  Voluntary periodic GC (if enabled)\n\t */\n\n\tDUK__VOLUNTARY_PERIODIC_GC(heap);\n\n\t/*\n\t *  First attempt\n\t */\n\n#if defined(DUK_USE_GC_TORTURE)\n\t/* Simulate alloc failure on every realloc, except when mark-and-sweep\n\t * is running.\n\t */\n\tif (heap->ms_prevent_count == 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"gc torture enabled, pretend that first realloc attempt fails\"));\n\t\tres = NULL;\n\t\tDUK_UNREF(res);\n\t\tgoto skip_attempt;\n\t}\n#endif\n\tres = heap->realloc_func(heap->heap_udata, ptr, newsize);\n\tif (DUK_LIKELY(res || newsize == 0)) {\n\t\t/* For zero size allocations NULL is allowed. */\n\t\treturn res;\n\t}\n#if defined(DUK_USE_GC_TORTURE)\n skip_attempt:\n#endif\n\n\tDUK_D(DUK_DPRINT(\"first realloc attempt failed, attempt to gc and retry\"));\n\n#if 0\n\t/*\n\t *  Avoid a GC if GC is already running.  See duk_heap_mem_alloc().\n\t */\n\n\tif (heap->ms_prevent_count != 0) {\n\t\tDUK_D(DUK_DPRINT(\"duk_heap_mem_realloc() failed, gc in progress (gc skipped), alloc size %ld\", (long) newsize));\n\t\treturn NULL;\n\t}\n#endif\n\n\t/*\n\t *  Retry with several GC attempts.  Initial attempts are made without\n\t *  emergency mode; later attempts use emergency mode which minimizes\n\t *  memory allocations forcibly.\n\t */\n\n\tfor (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) {\n\t\tduk_small_uint_t flags;\n\n\t\tflags = 0;\n\t\tif (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) {\n\t\t\tflags |= DUK_MS_FLAG_EMERGENCY;\n\t\t}\n\n\t\tduk_heap_mark_and_sweep(heap, flags);\n\n\t\tres = heap->realloc_func(heap->heap_udata, ptr, newsize);\n\t\tif (res || newsize == 0) {\n\t\t\tDUK_D(DUK_DPRINT(\"duk_heap_mem_realloc() succeeded after gc (pass %ld), alloc size %ld\",\n\t\t\t                 (long) (i + 1), (long) newsize));\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tDUK_D(DUK_DPRINT(\"duk_heap_mem_realloc() failed even after gc, alloc size %ld\", (long) newsize));\n\treturn NULL;\n}\n\n/*\n *  Reallocate memory with garbage collection, using a callback to provide\n *  the current allocated pointer.  This variant is used when a mark-and-sweep\n *  (e.g. finalizers) might change the original pointer.\n */\n\nDUK_INTERNAL void *duk_heap_mem_realloc_indirect(duk_heap *heap, duk_mem_getptr cb, void *ud, duk_size_t newsize) {\n\tvoid *res;\n\tduk_small_int_t i;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT_DISABLE(newsize >= 0);\n\n\t/*\n\t *  Voluntary periodic GC (if enabled)\n\t */\n\n\tDUK__VOLUNTARY_PERIODIC_GC(heap);\n\n\t/*\n\t *  First attempt\n\t */\n\n#if defined(DUK_USE_GC_TORTURE)\n\t/* Simulate alloc failure on every realloc, except when mark-and-sweep\n\t * is running.\n\t */\n\tif (heap->ms_prevent_count == 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"gc torture enabled, pretend that first indirect realloc attempt fails\"));\n\t\tres = NULL;\n\t\tDUK_UNREF(res);\n\t\tgoto skip_attempt;\n\t}\n#endif\n\tres = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize);\n\tif (DUK_LIKELY(res || newsize == 0)) {\n\t\t/* For zero size allocations NULL is allowed. */\n\t\treturn res;\n\t}\n#if defined(DUK_USE_GC_TORTURE)\n skip_attempt:\n#endif\n\n\tDUK_D(DUK_DPRINT(\"first indirect realloc attempt failed, attempt to gc and retry\"));\n\n#if 0\n\t/*\n\t *  Avoid a GC if GC is already running.  See duk_heap_mem_alloc().\n\t */\n\n\tif (heap->ms_prevent_count != 0) {\n\t\tDUK_D(DUK_DPRINT(\"duk_heap_mem_realloc_indirect() failed, gc in progress (gc skipped), alloc size %ld\", (long) newsize));\n\t\treturn NULL;\n\t}\n#endif\n\n\t/*\n\t *  Retry with several GC attempts.  Initial attempts are made without\n\t *  emergency mode; later attempts use emergency mode which minimizes\n\t *  memory allocations forcibly.\n\t */\n\n\tfor (i = 0; i < DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_LIMIT; i++) {\n\t\tduk_small_uint_t flags;\n\n#if defined(DUK_USE_DEBUG)\n\t\tvoid *ptr_pre;\n\t\tvoid *ptr_post;\n#endif\n\n#if defined(DUK_USE_DEBUG)\n\t\tptr_pre = cb(heap, ud);\n#endif\n\t\tflags = 0;\n\t\tif (i >= DUK_HEAP_ALLOC_FAIL_MARKANDSWEEP_EMERGENCY_LIMIT - 1) {\n\t\t\tflags |= DUK_MS_FLAG_EMERGENCY;\n\t\t}\n\n\t\tduk_heap_mark_and_sweep(heap, flags);\n#if defined(DUK_USE_DEBUG)\n\t\tptr_post = cb(heap, ud);\n\t\tif (ptr_pre != ptr_post) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"realloc base pointer changed by mark-and-sweep: %p -> %p\",\n\t\t\t                   (void *) ptr_pre, (void *) ptr_post));\n\t\t}\n#endif\n\n\t\t/* Note: key issue here is to re-lookup the base pointer on every attempt.\n\t\t * The pointer being reallocated may change after every mark-and-sweep.\n\t\t */\n\n\t\tres = heap->realloc_func(heap->heap_udata, cb(heap, ud), newsize);\n\t\tif (res || newsize == 0) {\n\t\t\tDUK_D(DUK_DPRINT(\"duk_heap_mem_realloc_indirect() succeeded after gc (pass %ld), alloc size %ld\",\n\t\t\t                 (long) (i + 1), (long) newsize));\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tDUK_D(DUK_DPRINT(\"duk_heap_mem_realloc_indirect() failed even after gc, alloc size %ld\", (long) newsize));\n\treturn NULL;\n}\n\n/*\n *  Free memory\n */\n\nDUK_INTERNAL void duk_heap_mem_free(duk_heap *heap, void *ptr) {\n\tDUK_ASSERT(heap != NULL);\n\t/* ptr may be NULL */\n\n\t/* Must behave like a no-op with NULL and any pointer returned from\n\t * malloc/realloc with zero size.\n\t */\n\theap->free_func(heap->heap_udata, ptr);\n\n\t/* Never perform a GC (even voluntary) in a memory free, otherwise\n\t * all call sites doing frees would need to deal with the side effects.\n\t * No need to update voluntary GC counter either.\n\t */\n}\n\n/* automatic undefs */\n#undef DUK__VOLUNTARY_PERIODIC_GC\n#line 1 \"duk_heap_misc.c\"\n/*\n *  Support functions for duk_heap.\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_INTERNAL void duk_heap_insert_into_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) {\n\tduk_heaphdr *root;\n\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING);\n\n\troot = heap->heap_allocated;\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n\tif (root != NULL) {\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL);\n\t\tDUK_HEAPHDR_SET_PREV(heap, root, hdr);\n\t}\n\tDUK_HEAPHDR_SET_PREV(heap, hdr, NULL);\n#endif\n\tDUK_HEAPHDR_SET_NEXT(heap, hdr, root);\n\tDUK_ASSERT_HEAPHDR_LINKS(heap, hdr);\n\tDUK_ASSERT_HEAPHDR_LINKS(heap, root);\n\theap->heap_allocated = hdr;\n}\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\nDUK_INTERNAL void duk_heap_remove_from_heap_allocated(duk_heap *heap, duk_heaphdr *hdr) {\n\tduk_heaphdr *prev;\n\tduk_heaphdr *next;\n\n\t/* Strings are in string table. */\n\tDUK_ASSERT(hdr != NULL);\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(hdr) != DUK_HTYPE_STRING);\n\n\t/* Target 'hdr' must be in heap_allocated (not e.g. finalize_list).\n\t * If not, heap lists will become corrupted so assert early for it.\n\t */\n#if defined(DUK_USE_ASSERTIONS)\n\t{\n\t\tduk_heaphdr *tmp;\n\t\tfor (tmp = heap->heap_allocated; tmp != NULL; tmp = DUK_HEAPHDR_GET_NEXT(heap, tmp)) {\n\t\t\tif (tmp == hdr) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tDUK_ASSERT(tmp == hdr);\n\t}\n#endif\n\n\t/* Read/write only once to minimize pointer compression calls. */\n\tprev = DUK_HEAPHDR_GET_PREV(heap, hdr);\n\tnext = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\n\tif (prev != NULL) {\n\t\tDUK_ASSERT(heap->heap_allocated != hdr);\n\t\tDUK_HEAPHDR_SET_NEXT(heap, prev, next);\n\t} else {\n\t\tDUK_ASSERT(heap->heap_allocated == hdr);\n\t\theap->heap_allocated = next;\n\t}\n\tif (next != NULL) {\n\t\tDUK_HEAPHDR_SET_PREV(heap, next, prev);\n\t} else {\n\t\t;\n\t}\n}\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_INTERNAL void duk_heap_insert_into_finalize_list(duk_heap *heap, duk_heaphdr *hdr) {\n\tduk_heaphdr *root;\n\n\troot = heap->finalize_list;\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n\tDUK_HEAPHDR_SET_PREV(heap, hdr, NULL);\n\tif (root != NULL) {\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL);\n\t\tDUK_HEAPHDR_SET_PREV(heap, root, hdr);\n\t}\n#endif\n\tDUK_HEAPHDR_SET_NEXT(heap, hdr, root);\n\tDUK_ASSERT_HEAPHDR_LINKS(heap, hdr);\n\tDUK_ASSERT_HEAPHDR_LINKS(heap, root);\n\theap->finalize_list = hdr;\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_INTERNAL void duk_heap_remove_from_finalize_list(duk_heap *heap, duk_heaphdr *hdr) {\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n\tduk_heaphdr *next;\n\tduk_heaphdr *prev;\n\n\tnext = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\tprev = DUK_HEAPHDR_GET_PREV(heap, hdr);\n\tif (next != NULL) {\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, next) == hdr);\n\t\tDUK_HEAPHDR_SET_PREV(heap, next, prev);\n\t}\n\tif (prev == NULL) {\n\t\tDUK_ASSERT(hdr == heap->finalize_list);\n\t\theap->finalize_list = next;\n\t} else {\n\t\tDUK_ASSERT(hdr != heap->finalize_list);\n\t\tDUK_HEAPHDR_SET_NEXT(heap, prev, next);\n\t}\n#else\n\tduk_heaphdr *next;\n\tduk_heaphdr *curr;\n\n\t/* Random removal is expensive: we need to locate the previous element\n\t * because we don't have a 'prev' pointer.\n\t */\n\tcurr = heap->finalize_list;\n\tif (curr == hdr) {\n\t\theap->finalize_list = DUK_HEAPHDR_GET_NEXT(heap, curr);\n\t} else {\n\t\tDUK_ASSERT(hdr != heap->finalize_list);\n\t\tfor (;;) {\n\t\t\tDUK_ASSERT(curr != NULL);  /* Caller responsibility. */\n\n\t\t\tnext = DUK_HEAPHDR_GET_NEXT(heap, curr);\n\t\t\tif (next == hdr) {\n\t\t\t\tnext = DUK_HEAPHDR_GET_NEXT(heap, hdr);\n\t\t\t\tDUK_HEAPHDR_SET_NEXT(heap, curr, next);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n#endif\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n#if defined(DUK_USE_ASSERTIONS)\nDUK_INTERNAL duk_bool_t duk_heap_in_heap_allocated(duk_heap *heap, duk_heaphdr *ptr) {\n\tduk_heaphdr *curr;\n\tDUK_ASSERT(heap != NULL);\n\n\tfor (curr = heap->heap_allocated; curr != NULL; curr = DUK_HEAPHDR_GET_NEXT(heap, curr)) {\n\t\tif (curr == ptr) {\n\t\t\treturn 1;\n\t\t}\n\t}\n\treturn 0;\n}\n#endif  /* DUK_USE_ASSERTIONS */\n\n#if defined(DUK_USE_INTERRUPT_COUNTER)\nDUK_INTERNAL void duk_heap_switch_thread(duk_heap *heap, duk_hthread *new_thr) {\n\tduk_hthread *curr_thr;\n\n\tDUK_ASSERT(heap != NULL);\n\n\tif (new_thr != NULL) {\n\t\tcurr_thr = heap->curr_thread;\n\t\tif (curr_thr == NULL) {\n\t\t\t/* For initial entry use default value; zero forces an\n\t\t\t * interrupt before executing the first insturction.\n\t\t\t */\n\t\t\tDUK_DD(DUK_DDPRINT(\"switch thread, initial entry, init default interrupt counter\"));\n\t\t\tnew_thr->interrupt_counter = 0;\n\t\t\tnew_thr->interrupt_init = 0;\n\t\t} else {\n\t\t\t/* Copy interrupt counter/init value state to new thread (if any).\n\t\t\t * It's OK for new_thr to be the same as curr_thr.\n\t\t\t */\n#if defined(DUK_USE_DEBUG)\n\t\t\tif (new_thr != curr_thr) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"switch thread, not initial entry, copy interrupt counter\"));\n\t\t\t}\n#endif\n\t\t\tnew_thr->interrupt_counter = curr_thr->interrupt_counter;\n\t\t\tnew_thr->interrupt_init = curr_thr->interrupt_init;\n\t\t}\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"switch thread, new thread is NULL, no interrupt counter changes\"));\n\t}\n\n\theap->curr_thread = new_thr;  /* may be NULL */\n}\n#endif  /* DUK_USE_INTERRUPT_COUNTER */\n#line 1 \"duk_heap_refcount.c\"\n/*\n *  Reference counting implementation.\n *\n *  INCREF/DECREF, finalization and freeing of objects whose refcount reaches\n *  zero (refzero).  These operations are very performance sensitive, so\n *  various small tricks are used in an attempt to maximize speed.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\n#if !defined(DUK_USE_DOUBLE_LINKED_HEAP)\n#error internal error, reference counting requires a double linked heap\n#endif\n\n/*\n *  Heap object refcount finalization.\n *\n *  When an object is about to be freed, all other objects it refers to must\n *  be decref'd.  Refcount finalization does NOT free the object or its inner\n *  allocations (mark-and-sweep shares these helpers), it just manipulates\n *  the refcounts.\n *\n *  Note that any of the DECREFs may cause a refcount to drop to zero.  If so,\n *  the object won't be refzero processed inline, but will just be queued to\n *  refzero_list and processed by an earlier caller working on refzero_list,\n *  eliminating C recursion from even long refzero cascades.  If refzero\n *  finalization is triggered by mark-and-sweep, refzero conditions are ignored\n *  (objects are not even queued to refzero_list) because mark-and-sweep deals\n *  with them; refcounts are still updated so that they remain in sync with\n *  actual references.\n */\n\nDUK_LOCAL void duk__decref_tvals_norz(duk_hthread *thr, duk_tval *tv, duk_idx_t count) {\n\tDUK_ASSERT(count == 0 || tv != NULL);\n\n\twhile (count-- > 0) {\n\t\tDUK_TVAL_DECREF_NORZ(thr, tv);\n\t\ttv++;\n\t}\n}\n\nDUK_INTERNAL void duk_hobject_refcount_finalize_norz(duk_heap *heap, duk_hobject *h) {\n\tduk_hthread *thr;\n\tduk_uint_fast32_t i;\n\tduk_uint_fast32_t n;\n\tduk_propvalue *p_val;\n\tduk_tval *p_tv;\n\tduk_hstring **p_key;\n\tduk_uint8_t *p_flag;\n\tduk_hobject *h_proto;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tDUK_ASSERT(h);\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h) == DUK_HTYPE_OBJECT);\n\n\tthr = heap->heap_thread;\n\tDUK_ASSERT(thr != NULL);\n\n\tp_key = DUK_HOBJECT_E_GET_KEY_BASE(heap, h);\n\tp_val = DUK_HOBJECT_E_GET_VALUE_BASE(heap, h);\n\tp_flag = DUK_HOBJECT_E_GET_FLAGS_BASE(heap, h);\n\tn = DUK_HOBJECT_GET_ENEXT(h);\n\twhile (n-- > 0) {\n\t\tduk_hstring *key;\n\n\t\tkey = p_key[n];\n\t\tif (DUK_UNLIKELY(key == NULL)) {\n\t\t\tcontinue;\n\t\t}\n\t\tDUK_HSTRING_DECREF_NORZ(thr, key);\n\t\tif (DUK_UNLIKELY(p_flag[n] & DUK_PROPDESC_FLAG_ACCESSOR)) {\n\t\t\tduk_hobject *h_getset;\n\t\t\th_getset = p_val[n].a.get;\n\t\t\tDUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset));\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset);\n\t\t\th_getset = p_val[n].a.set;\n\t\t\tDUK_ASSERT(h_getset == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_getset));\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_getset);\n\t\t} else {\n\t\t\tduk_tval *tv_val;\n\t\t\ttv_val = &p_val[n].v;\n\t\t\tDUK_TVAL_DECREF_NORZ(thr, tv_val);\n\t\t}\n\t}\n\n\tp_tv = DUK_HOBJECT_A_GET_BASE(heap, h);\n\tn = DUK_HOBJECT_GET_ASIZE(h);\n\twhile (n-- > 0) {\n\t\tduk_tval *tv_val;\n\t\ttv_val = p_tv + n;\n\t\tDUK_TVAL_DECREF_NORZ(thr, tv_val);\n\t}\n\n\t/* Hash part is a 'weak reference' and doesn't contribute to refcounts. */\n\n\th_proto = (duk_hobject *) DUK_HOBJECT_GET_PROTOTYPE(heap, h);\n\tDUK_ASSERT(h_proto == NULL || DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_proto));\n\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, h_proto);\n\n\t/* XXX: Object subclass tests are quite awkward at present, ideally\n\t * we should be able to switch-case here with a dense index (subtype\n\t * number or something).  For now, fast path plain objects and arrays\n\t * and bit test the rest individually.\n\t */\n\n\tif (DUK_HOBJECT_HAS_FASTREFS(h)) {\n\t\t/* Plain object or array, nothing more to do.  While a\n\t\t * duk_harray has additional fields, none of them need\n\t\t * DECREF updates.\n\t\t */\n\t\tDUK_ASSERT(DUK_HOBJECT_ALLOWS_FASTREFS(h));\n\t\treturn;\n\t}\n\tDUK_ASSERT(DUK_HOBJECT_PROHIBITS_FASTREFS(h));\n\n\t/* Slow path: special object, start bit checks from most likely. */\n\n\t/* XXX: reorg, more common first */\n\tif (DUK_HOBJECT_IS_COMPFUNC(h)) {\n\t\tduk_hcompfunc *f = (duk_hcompfunc *) h;\n\t\tduk_tval *tv, *tv_end;\n\t\tduk_hobject **funcs, **funcs_end;\n\n\t\tDUK_ASSERT_HCOMPFUNC_VALID(f);\n\n\t\tif (DUK_LIKELY(DUK_HCOMPFUNC_GET_DATA(heap, f) != NULL)) {\n\t\t\ttv = DUK_HCOMPFUNC_GET_CONSTS_BASE(heap, f);\n\t\t\ttv_end = DUK_HCOMPFUNC_GET_CONSTS_END(heap, f);\n\t\t\twhile (tv < tv_end) {\n\t\t\t\tDUK_TVAL_DECREF_NORZ(thr, tv);\n\t\t\t\ttv++;\n\t\t\t}\n\n\t\t\tfuncs = DUK_HCOMPFUNC_GET_FUNCS_BASE(heap, f);\n\t\t\tfuncs_end = DUK_HCOMPFUNC_GET_FUNCS_END(heap, f);\n\t\t\twhile (funcs < funcs_end) {\n\t\t\t\tduk_hobject *h_func;\n\t\t\t\th_func = *funcs;\n\t\t\t\tDUK_ASSERT(h_func != NULL);\n\t\t\t\tDUK_ASSERT(DUK_HEAPHDR_IS_OBJECT((duk_heaphdr *) h_func));\n\t\t\t\tDUK_HCOMPFUNC_DECREF_NORZ(thr, (duk_hcompfunc *) h_func);\n\t\t\t\tfuncs++;\n\t\t\t}\n\t\t} else {\n\t\t\t/* May happen in some out-of-memory corner cases. */\n\t\t\tDUK_D(DUK_DPRINT(\"duk_hcompfunc 'data' is NULL, skipping decref\"));\n\t\t}\n\n\t\tDUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_LEXENV(heap, f));\n\t\tDUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_heaphdr *) DUK_HCOMPFUNC_GET_VARENV(heap, f));\n\t\tDUK_HEAPHDR_DECREF_ALLOWNULL(thr, (duk_hbuffer *) DUK_HCOMPFUNC_GET_DATA(heap, f));\n\t} else if (DUK_HOBJECT_IS_DECENV(h)) {\n\t\tduk_hdecenv *e = (duk_hdecenv *) h;\n\t\tDUK_ASSERT_HDECENV_VALID(e);\n\t\tDUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, e->thread);\n\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, e->varmap);\n\t} else if (DUK_HOBJECT_IS_OBJENV(h)) {\n\t\tduk_hobjenv *e = (duk_hobjenv *) h;\n\t\tDUK_ASSERT_HOBJENV_VALID(e);\n\t\tDUK_ASSERT(e->target != NULL);  /* Required for object environments. */\n\t\tDUK_HOBJECT_DECREF_NORZ(thr, e->target);\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t} else if (DUK_HOBJECT_IS_BUFOBJ(h)) {\n\t\tduk_hbufobj *b = (duk_hbufobj *) h;\n\t\tDUK_ASSERT_HBUFOBJ_VALID(b);\n\t\tDUK_HBUFFER_DECREF_NORZ_ALLOWNULL(thr, (duk_hbuffer *) b->buf);\n\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) b->buf_prop);\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\t} else if (DUK_HOBJECT_IS_BOUNDFUNC(h)) {\n\t\tduk_hboundfunc *f = (duk_hboundfunc *) h;\n\t\tDUK_ASSERT_HBOUNDFUNC_VALID(f);\n\t\tDUK_TVAL_DECREF_NORZ(thr, &f->target);\n\t\tDUK_TVAL_DECREF_NORZ(thr, &f->this_binding);\n\t\tduk__decref_tvals_norz(thr, f->args, f->nargs);\n#if defined(DUK_USE_ES6_PROXY)\n\t} else if (DUK_HOBJECT_IS_PROXY(h)) {\n\t\tduk_hproxy *p = (duk_hproxy *) h;\n\t\tDUK_ASSERT_HPROXY_VALID(p);\n\t\tDUK_HOBJECT_DECREF_NORZ(thr, p->target);\n\t\tDUK_HOBJECT_DECREF_NORZ(thr, p->handler);\n#endif  /* DUK_USE_ES6_PROXY */\n\t} else if (DUK_HOBJECT_IS_THREAD(h)) {\n\t\tduk_hthread *t = (duk_hthread *) h;\n\t\tduk_activation *act;\n\t\tduk_tval *tv;\n\n\t\tDUK_ASSERT_HTHREAD_VALID(t);\n\n\t\ttv = t->valstack;\n\t\twhile (tv < t->valstack_top) {\n\t\t\tDUK_TVAL_DECREF_NORZ(thr, tv);\n\t\t\ttv++;\n\t\t}\n\n\t\tfor (act = t->callstack_curr; act != NULL; act = act->parent) {\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) DUK_ACT_GET_FUNC(act));\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->var_env);\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->lex_env);\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) act->prev_caller);\n#endif\n#if 0  /* nothing now */\n\t\t\tfor (cat = act->cat; cat != NULL; cat = cat->parent) {\n\t\t\t}\n#endif\n\t\t}\n\n\n\t\tfor (i = 0; i < DUK_NUM_BUILTINS; i++) {\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, (duk_hobject *) t->builtins[i]);\n\t\t}\n\n\t\tDUK_HTHREAD_DECREF_NORZ_ALLOWNULL(thr, (duk_hthread *) t->resumer);\n\t} else {\n\t\t/* We may come here if the object should have a FASTREFS flag\n\t\t * but it's missing for some reason.  Assert for never getting\n\t\t * here; however, other than performance, this is harmless.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"missing FASTREFS flag for: %!iO\", h));\n\t\tDUK_ASSERT(0);\n\t}\n}\n\nDUK_INTERNAL void duk_heaphdr_refcount_finalize_norz(duk_heap *heap, duk_heaphdr *hdr) {\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tDUK_ASSERT(hdr != NULL);\n\n\tif (DUK_HEAPHDR_IS_OBJECT(hdr)) {\n\t\tduk_hobject_refcount_finalize_norz(heap, (duk_hobject *) hdr);\n\t}\n\t/* DUK_HTYPE_BUFFER: nothing to finalize */\n\t/* DUK_HTYPE_STRING: nothing to finalize */\n}\n\n/*\n *  Refzero processing for duk_hobject: queue a refzero'ed object to either\n *  finalize_list or refzero_list and process the relevent list(s) if\n *  necessary.\n *\n *  Refzero_list is single linked, with only 'prev' pointers set and valid.\n *  All 'next' pointers are intentionally left as garbage.  This doesn't\n *  matter because refzero_list is processed to completion before any other\n *  code (like mark-and-sweep) might walk the list.\n *\n *  In more detail:\n *\n *  - On first insert refzero_list is NULL and the new object becomes the\n *    first and only element on the list; duk__refcount_free_pending() is\n *    called and it starts processing the list from the initial element,\n *    i.e. the list tail.\n *\n *  - As each object is refcount finalized, new objects may be queued to\n *    refzero_list head.  Their 'next' pointers are left as garbage, but\n *    'prev' points are set correctly, with the element at refzero_list\n *    having a NULL 'prev' pointer.  The fact that refzero_list is non-NULL\n *    is used to reject (1) recursive duk__refcount_free_pending() and\n *    (2) finalize_list processing calls.\n *\n *  - When we're done with the current object, read its 'prev' pointer and\n *    free the object.  If 'prev' is NULL, we've reached head of list and are\n *    done: set refzero_list to NULL and process pending finalizers.  Otherwise\n *    continue processing the list.\n *\n *  A refzero cascade is free of side effects because it only involves\n *  queueing more objects and freeing memory; finalizer execution is blocked\n *  in the code path queueing objects to finalize_list.  As a result the\n *  initial refzero call (which triggers duk__refcount_free_pending()) must\n *  check finalize_list so that finalizers are executed snappily.\n *\n *  If finalize_list processing starts first, refzero may occur while we're\n *  processing finalizers.  That's fine: that particular refzero cascade is\n *  handled to completion without side effects.  Once the cascade is complete,\n *  we'll run pending finalizers but notice that we're already doing that and\n *  return.\n *\n *  This could be expanded to allow incremental freeing: just bail out\n *  early and resume at a future alloc/decref/refzero.  However, if that\n *  were done, the list structure would need to be kept consistent at all\n *  times, mark-and-sweep would need to handle refzero_list, etc.\n */\n\nDUK_LOCAL void duk__refcount_free_pending(duk_heap *heap) {\n\tduk_heaphdr *curr;\n#if defined(DUK_USE_DEBUG)\n\tduk_int_t count = 0;\n#endif\n\n\tDUK_ASSERT(heap != NULL);\n\n\tcurr = heap->refzero_list;\n\tDUK_ASSERT(curr != NULL);\n\tDUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, curr) == NULL);  /* We're called on initial insert only. */\n\t/* curr->next is GARBAGE. */\n\n\tdo {\n\t\tduk_heaphdr *prev;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"refzero processing %p: %!O\", (void *) curr, (duk_heaphdr *) curr));\n\n#if defined(DUK_USE_DEBUG)\n\t\tcount++;\n#endif\n\n\t\tDUK_ASSERT(curr != NULL);\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(curr) == DUK_HTYPE_OBJECT);  /* currently, always the case */\n\t\t/* FINALIZED may be set; don't care about flags here. */\n\n\t\t/* Refcount finalize 'curr'.  Refzero_list must be non-NULL\n\t\t * here to prevent recursive entry to duk__refcount_free_pending().\n\t\t */\n\t\tDUK_ASSERT(heap->refzero_list != NULL);\n\t\tduk_hobject_refcount_finalize_norz(heap, (duk_hobject *) curr);\n\n\t\tprev = DUK_HEAPHDR_GET_PREV(heap, curr);\n\t\tDUK_ASSERT((prev == NULL && heap->refzero_list == curr) || \\\n\t\t           (prev != NULL && heap->refzero_list != curr));\n\t\t/* prev->next is intentionally not updated and is garbage. */\n\n\t\tduk_free_hobject(heap, (duk_hobject *) curr);  /* Invalidates 'curr'. */\n\n\t\tcurr = prev;\n\t} while (curr != NULL);\n\n\theap->refzero_list = NULL;\n\n\tDUK_DD(DUK_DDPRINT(\"refzero processed %ld objects\", (long) count));\n}\n\nDUK_LOCAL DUK_INLINE void duk__refcount_refzero_hobject(duk_heap *heap, duk_hobject *obj, duk_bool_t skip_free_pending) {\n\tduk_heaphdr *hdr;\n\tduk_heaphdr *root;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) obj) == DUK_HTYPE_OBJECT);\n\n\thdr = (duk_heaphdr *) obj;\n\n\t/* Refzero'd objects must be in heap_allocated.  They can't be in\n\t * finalize_list because all objects on finalize_list have an\n\t * artificial +1 refcount bump.\n\t */\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(duk_heap_in_heap_allocated(heap, (duk_heaphdr *) obj));\n#endif\n\n\tDUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, hdr);\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\t/* This finalizer check MUST BE side effect free.  It should also be\n\t * as fast as possible because it's applied to every object freed.\n\t */\n\tif (DUK_UNLIKELY(DUK_HOBJECT_HAS_FINALIZER_FAST(heap, (duk_hobject *) hdr) != 0U)) {\n\t\t/* Special case: FINALIZED may be set if mark-and-sweep queued\n\t\t * object for finalization, the finalizer was executed (and\n\t\t * FINALIZED set), mark-and-sweep hasn't yet processed the\n\t\t * object again, but its refcount drops to zero.  Free without\n\t\t * running the finalizer again.\n\t\t */\n\t\tif (DUK_HEAPHDR_HAS_FINALIZED(hdr)) {\n\t\t\tDUK_D(DUK_DPRINT(\"refzero'd object has finalizer and FINALIZED is set -> free\"));\n\t\t} else {\n\t\t\t/* Set FINALIZABLE flag so that all objects on finalize_list\n\t\t\t * will have it set and are thus detectable based on the\n\t\t\t * flag alone.\n\t\t\t */\n\t\t\tDUK_HEAPHDR_SET_FINALIZABLE(hdr);\n\t\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_FINALIZED(hdr));\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\t/* Bump refcount on finalize_list insert so that a\n\t\t\t * refzero can never occur when an object is waiting\n\t\t\t * for its finalizer call.  Refzero might otherwise\n\t\t\t * now happen because we allow duk_push_heapptr() for\n\t\t\t * objects pending finalization.\n\t\t\t */\n\t\t\tDUK_HEAPHDR_PREINC_REFCOUNT(hdr);\n#endif\n\t\t\tDUK_HEAP_INSERT_INTO_FINALIZE_LIST(heap, hdr);\n\n\t\t\t/* Process finalizers unless skipping is explicitly\n\t\t\t * requested (NORZ) or refzero_list is being processed\n\t\t\t * (avoids side effects during a refzero cascade).\n\t\t\t * If refzero_list is processed, the initial refzero\n\t\t\t * call will run pending finalizers when refzero_list\n\t\t\t * is done.\n\t\t\t */\n\t\t\tif (!skip_free_pending && heap->refzero_list == NULL) {\n\t\t\t\tduk_heap_process_finalize_list(heap);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n\t/* No need to finalize, free object via refzero_list. */\n\n\troot = heap->refzero_list;\n\n\tDUK_HEAPHDR_SET_PREV(heap, hdr, NULL);\n\t/* 'next' is left as GARBAGE. */\n\theap->refzero_list = hdr;\n\n\tif (root == NULL) {\n\t\t/* Object is now queued.  Refzero_list was NULL so\n\t\t * no-one is currently processing it; do it here.\n\t\t * With refzero processing just doing a cascade of\n\t\t * free calls, we can process it directly even when\n\t\t * NORZ macros are used: there are no side effects.\n\t\t */\n\t\tduk__refcount_free_pending(heap);\n\t\tDUK_ASSERT(heap->refzero_list == NULL);\n\n\t\t/* Process finalizers only after the entire cascade\n\t\t * is finished.  In most cases there's nothing to\n\t\t * finalize, so fast path check to avoid a call.\n\t\t */\n#if defined(DUK_USE_FINALIZER_SUPPORT)\n\t\tif (!skip_free_pending && DUK_UNLIKELY(heap->finalize_list != NULL)) {\n\t\t\tduk_heap_process_finalize_list(heap);\n\t\t}\n#endif\n\t} else {\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_PREV(heap, root) == NULL);\n\t\tDUK_HEAPHDR_SET_PREV(heap, root, hdr);\n\n\t\t/* Object is now queued.  Because refzero_list was\n\t\t * non-NULL, it's already being processed by someone\n\t\t * in the C call stack, so we're done.\n\t\t */\n\t}\n}\n\n#if defined(DUK_USE_FINALIZER_SUPPORT)\nDUK_INTERNAL DUK_ALWAYS_INLINE void duk_refzero_check_fast(duk_hthread *thr) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(thr->heap->refzero_list == NULL);  /* Processed to completion inline. */\n\n\tif (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) {\n\t\tduk_heap_process_finalize_list(thr->heap);\n\t}\n}\n\nDUK_INTERNAL void duk_refzero_check_slow(duk_hthread *thr) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(thr->heap->refzero_list == NULL);  /* Processed to completion inline. */\n\n\tif (DUK_UNLIKELY(thr->heap->finalize_list != NULL)) {\n\t\tduk_heap_process_finalize_list(thr->heap);\n\t}\n}\n#endif  /* DUK_USE_FINALIZER_SUPPORT */\n\n/*\n *  Refzero processing for duk_hstring.\n */\n\nDUK_LOCAL DUK_INLINE void duk__refcount_refzero_hstring(duk_heap *heap, duk_hstring *str) {\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tDUK_ASSERT(str != NULL);\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) str) == DUK_HTYPE_STRING);\n\n\tduk_heap_strcache_string_remove(heap, str);\n\tduk_heap_strtable_unlink(heap, str);\n\tduk_free_hstring(heap, str);\n}\n\n/*\n *  Refzero processing for duk_hbuffer.\n */\n\nDUK_LOCAL DUK_INLINE void duk__refcount_refzero_hbuffer(duk_heap *heap, duk_hbuffer *buf) {\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->heap_thread != NULL);\n\tDUK_ASSERT(buf != NULL);\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) buf) == DUK_HTYPE_BUFFER);\n\n\tDUK_HEAP_REMOVE_FROM_HEAP_ALLOCATED(heap, (duk_heaphdr *) buf);\n\tduk_free_hbuffer(heap, buf);\n}\n\n/*\n *  Incref and decref functions.\n *\n *  Decref may trigger immediate refzero handling, which may free and finalize\n *  an arbitrary number of objects (a \"DECREF cascade\").\n *\n *  Refzero handling is skipped entirely if (1) mark-and-sweep is running or\n *  (2) execution is paused in the debugger.  The objects are left in the heap,\n *  and will be freed by mark-and-sweep or eventual heap destruction.\n *\n *  This is necessary during mark-and-sweep because refcounts are also updated\n *  during the sweep phase (otherwise objects referenced by a swept object\n *  would have incorrect refcounts) which then calls here.  This could be\n *  avoided by using separate decref macros in mark-and-sweep; however,\n *  mark-and-sweep also calls finalizers which would use the ordinary decref\n *  macros anyway.\n *\n *  We can't process refzeros (= free objects) when the debugger is running\n *  as the debugger might make an object unreachable but still continue\n *  inspecting it (or even cause it to be pushed back).  So we must rely on\n *  mark-and-sweep to collect them.\n *\n *  The DUK__RZ_SUPPRESS_CHECK() condition is also used in heap destruction\n *  when running finalizers for remaining objects: the flag prevents objects\n *  from being moved around in heap linked lists while that's being done.\n *\n *  The suppress condition is important to performance.\n */\n\n#define DUK__RZ_SUPPRESS_ASSERT1() do { \\\n\t\tDUK_ASSERT(thr != NULL); \\\n\t\tDUK_ASSERT(thr->heap != NULL); \\\n\t\t/* When mark-and-sweep runs, heap_thread must exist. */ \\\n\t\tDUK_ASSERT(thr->heap->ms_running == 0 || thr->heap->heap_thread != NULL); \\\n\t\t/* When mark-and-sweep runs, the 'thr' argument always matches heap_thread. \\\n\t\t * This could be used to e.g. suppress check against 'thr' directly (and \\\n\t\t * knowing it would be heap_thread); not really used now. \\\n\t\t */ \\\n\t\tDUK_ASSERT(thr->heap->ms_running == 0 || thr == thr->heap->heap_thread); \\\n\t\t/* We may be called when the heap is initializing and we process \\\n\t\t * refzeros normally, but mark-and-sweep and finalizers are prevented \\\n\t\t * if that's the case. \\\n\t\t */ \\\n\t\tDUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->ms_prevent_count > 0); \\\n\t\tDUK_ASSERT(thr->heap->heap_initializing == 0 || thr->heap->pf_prevent_count > 0); \\\n\t} while (0)\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n#define DUK__RZ_SUPPRESS_ASSERT2() do { \\\n\t\t/* When debugger is paused, ms_running is set. */ \\\n\t\tDUK_ASSERT(!DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->ms_running != 0); \\\n\t} while (0)\n#define DUK__RZ_SUPPRESS_COND()  (heap->ms_running != 0)\n#else\n#define DUK__RZ_SUPPRESS_ASSERT2() do { } while (0)\n#define DUK__RZ_SUPPRESS_COND()  (heap->ms_running != 0)\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n#define DUK__RZ_SUPPRESS_CHECK() do { \\\n\t\tDUK__RZ_SUPPRESS_ASSERT1(); \\\n\t\tDUK__RZ_SUPPRESS_ASSERT2(); \\\n\t\tif (DUK_UNLIKELY(DUK__RZ_SUPPRESS_COND())) { \\\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"refzero handling suppressed (not even queued) when mark-and-sweep running, object: %p\", (void *) h)); \\\n\t\t\treturn; \\\n\t\t} \\\n\t} while (0)\n\n#define DUK__RZ_STRING() do { \\\n\t\tduk__refcount_refzero_hstring(heap, (duk_hstring *) h); \\\n\t} while (0)\n#define DUK__RZ_BUFFER() do { \\\n\t\tduk__refcount_refzero_hbuffer(heap, (duk_hbuffer *) h); \\\n\t} while (0)\n#define DUK__RZ_OBJECT() do { \\\n\t\tduk__refcount_refzero_hobject(heap, (duk_hobject *) h, skip_free_pending); \\\n\t} while (0)\n\n/* XXX: test the effect of inlining here vs. NOINLINE in refzero helpers */\n#if defined(DUK_USE_FAST_REFCOUNT_DEFAULT)\n#define DUK__RZ_INLINE DUK_ALWAYS_INLINE\n#else\n#define DUK__RZ_INLINE /*nop*/\n#endif\n\nDUK_LOCAL DUK__RZ_INLINE void duk__hstring_refzero_helper(duk_hthread *thr, duk_hstring *h) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(h != NULL);\n\theap = thr->heap;\n\n\tDUK__RZ_SUPPRESS_CHECK();\n\tDUK__RZ_STRING();\n}\n\nDUK_LOCAL DUK__RZ_INLINE void duk__hbuffer_refzero_helper(duk_hthread *thr, duk_hbuffer *h) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(h != NULL);\n\theap = thr->heap;\n\n\tDUK__RZ_SUPPRESS_CHECK();\n\tDUK__RZ_BUFFER();\n}\n\nDUK_LOCAL DUK__RZ_INLINE void duk__hobject_refzero_helper(duk_hthread *thr, duk_hobject *h, duk_bool_t skip_free_pending) {\n\tduk_heap *heap;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(h != NULL);\n\theap = thr->heap;\n\n\tDUK__RZ_SUPPRESS_CHECK();\n\tDUK__RZ_OBJECT();\n}\n\nDUK_LOCAL DUK__RZ_INLINE void duk__heaphdr_refzero_helper(duk_hthread *thr, duk_heaphdr *h, duk_bool_t skip_free_pending) {\n\tduk_heap *heap;\n\tduk_small_uint_t htype;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(h != NULL);\n\theap = thr->heap;\n\n\thtype = (duk_small_uint_t) DUK_HEAPHDR_GET_TYPE(h);\n\tDUK__RZ_SUPPRESS_CHECK();\n\n\tswitch (htype) {\n\tcase DUK_HTYPE_STRING:\n\t\t/* Strings have no internal references but do have \"weak\"\n\t\t * references in the string cache.  Also note that strings\n\t\t * are not on the heap_allocated list like other heap\n\t\t * elements.\n\t\t */\n\n\t\tDUK__RZ_STRING();\n\t\tbreak;\n\n\tcase DUK_HTYPE_OBJECT:\n\t\t/* Objects have internal references.  Must finalize through\n\t\t * the \"refzero\" work list.\n\t\t */\n\n\t\tDUK__RZ_OBJECT();\n\t\tbreak;\n\n\tdefault:\n\t\t/* Buffers have no internal references.  However, a dynamic\n\t\t * buffer has a separate allocation for the buffer.  This is\n\t\t * freed by duk_heap_free_heaphdr_raw().\n\t\t */\n\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(h) == DUK_HTYPE_BUFFER);\n\t\tDUK__RZ_BUFFER();\n\t\tbreak;\n\t}\n}\n\nDUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero(duk_hthread *thr, duk_heaphdr *h) {\n\tduk__heaphdr_refzero_helper(thr, h, 0 /*skip_free_pending*/);\n}\n\nDUK_INTERNAL DUK_NOINLINE void duk_heaphdr_refzero_norz(duk_hthread *thr, duk_heaphdr *h) {\n\tduk__heaphdr_refzero_helper(thr, h, 1 /*skip_free_pending*/);\n}\n\nDUK_INTERNAL DUK_NOINLINE void duk_hstring_refzero(duk_hthread *thr, duk_hstring *h) {\n\tduk__hstring_refzero_helper(thr, h);\n}\n\nDUK_INTERNAL DUK_NOINLINE void duk_hbuffer_refzero(duk_hthread *thr, duk_hbuffer *h) {\n\tduk__hbuffer_refzero_helper(thr, h);\n}\n\nDUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero(duk_hthread *thr, duk_hobject *h) {\n\tduk__hobject_refzero_helper(thr, h, 0 /*skip_free_pending*/);\n}\n\nDUK_INTERNAL DUK_NOINLINE void duk_hobject_refzero_norz(duk_hthread *thr, duk_hobject *h) {\n\tduk__hobject_refzero_helper(thr, h, 1 /*skip_free_pending*/);\n}\n\n#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT)\nDUK_INTERNAL void duk_tval_incref(duk_tval *tv) {\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) {\n\t\tduk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));\n\t\tDUK_ASSERT_DISABLE(h->h_refcount >= 0);\n\t\tDUK_HEAPHDR_PREINC_REFCOUNT(h);\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) != 0);  /* No wrapping. */\n\t}\n}\n\nDUK_INTERNAL void duk_tval_decref(duk_hthread *thr, duk_tval *tv) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) {\n\t\tduk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1);\n#if 0\n\t\tif (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) {\n\t\t\treturn;\n\t\t}\n\t\tduk_heaphdr_refzero(thr, h);\n#else\n\t\tduk_heaphdr_decref(thr, h);\n#endif\n\t}\n}\n\nDUK_INTERNAL void duk_tval_decref_norz(duk_hthread *thr, duk_tval *tv) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv != NULL);\n\n\tif (DUK_TVAL_NEEDS_REFCOUNT_UPDATE(tv)) {\n\t\tduk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT(h) >= 1);\n#if 0\n\t\tif (DUK_HEAPHDR_PREDEC_REFCOUNT(h) != 0) {\n\t\t\treturn;\n\t\t}\n\t\tduk_heaphdr_refzero_norz(thr, h);\n#else\n\t\tduk_heaphdr_decref_norz(thr, h);\n#endif\n\t}\n}\n#endif  /* !DUK_USE_FAST_REFCOUNT_DEFAULT */\n\n#define DUK__DECREF_ASSERTS() do { \\\n\t\tDUK_ASSERT(thr != NULL); \\\n\t\tDUK_ASSERT(thr->heap != NULL); \\\n\t\tDUK_ASSERT(h != NULL); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID((duk_heaphdr *) h)); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) >= 1); \\\n\t} while (0)\n#if defined(DUK_USE_ROM_OBJECTS)\n#define DUK__INCREF_SHARED() do { \\\n\t\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \\\n\t\t\treturn; \\\n\t\t} \\\n\t\tDUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0);  /* No wrapping. */ \\\n\t} while (0)\n#define DUK__DECREF_SHARED() do { \\\n\t\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) { \\\n\t\t\treturn; \\\n\t\t} \\\n\t\tif (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \\\n\t\t\treturn; \\\n\t\t} \\\n\t} while (0)\n#else\n#define DUK__INCREF_SHARED() do { \\\n\t\tDUK_HEAPHDR_PREINC_REFCOUNT((duk_heaphdr *) h); \\\n\t\tDUK_ASSERT(DUK_HEAPHDR_GET_REFCOUNT((duk_heaphdr *) h) != 0);  /* No wrapping. */ \\\n\t} while (0)\n#define DUK__DECREF_SHARED() do { \\\n\t\tif (DUK_HEAPHDR_PREDEC_REFCOUNT((duk_heaphdr *) h) != 0) { \\\n\t\t\treturn; \\\n\t\t} \\\n\t} while (0)\n#endif\n\n#if !defined(DUK_USE_FAST_REFCOUNT_DEFAULT)\n/* This will in practice be inlined because it's just an INC instructions\n * and a bit test + INC when ROM objects are enabled.\n */\nDUK_INTERNAL void duk_heaphdr_incref(duk_heaphdr *h) {\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(DUK_HEAPHDR_HTYPE_VALID(h));\n\tDUK_ASSERT_DISABLE(DUK_HEAPHDR_GET_REFCOUNT(h) >= 0);\n\n\tDUK__INCREF_SHARED();\n}\n\nDUK_INTERNAL void duk_heaphdr_decref(duk_hthread *thr, duk_heaphdr *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_heaphdr_refzero(thr, h);\n\n\t/* Forced mark-and-sweep when GC torture enabled; this could happen\n\t * on any DECREF (but not DECREF_NORZ).\n\t */\n\tDUK_GC_TORTURE(thr->heap);\n}\nDUK_INTERNAL void duk_heaphdr_decref_norz(duk_hthread *thr, duk_heaphdr *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_heaphdr_refzero_norz(thr, h);\n}\n#endif  /* !DUK_USE_FAST_REFCOUNT_DEFAULT */\n\n#if 0  /* Not needed. */\nDUK_INTERNAL void duk_hstring_decref(duk_hthread *thr, duk_hstring *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_hstring_refzero(thr, h);\n}\nDUK_INTERNAL void duk_hstring_decref_norz(duk_hthread *thr, duk_hstring *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_hstring_refzero_norz(thr, h);\n}\nDUK_INTERNAL void duk_hbuffer_decref(duk_hthread *thr, duk_hbuffer *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_hbuffer_refzero(thr, h);\n}\nDUK_INTERNAL void duk_hbuffer_decref_norz(duk_hthread *thr, duk_hbuffer *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_hbuffer_refzero_norz(thr, h);\n}\nDUK_INTERNAL void duk_hobject_decref(duk_hthread *thr, duk_hobject *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_hobject_refzero(thr, h);\n}\nDUK_INTERNAL void duk_hobject_decref_norz(duk_hthread *thr, duk_hobject *h) {\n\tDUK__DECREF_ASSERTS();\n\tDUK__DECREF_SHARED();\n\tduk_hobject_refzero_norz(thr, h);\n}\n#endif\n\n#else  /* DUK_USE_REFERENCE_COUNTING */\n\n/* no refcounting */\n\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n/* automatic undefs */\n#undef DUK__DECREF_ASSERTS\n#undef DUK__DECREF_SHARED\n#undef DUK__INCREF_SHARED\n#undef DUK__RZ_BUFFER\n#undef DUK__RZ_INLINE\n#undef DUK__RZ_OBJECT\n#undef DUK__RZ_STRING\n#undef DUK__RZ_SUPPRESS_ASSERT1\n#undef DUK__RZ_SUPPRESS_ASSERT2\n#undef DUK__RZ_SUPPRESS_CHECK\n#undef DUK__RZ_SUPPRESS_COND\n#line 1 \"duk_heap_stringcache.c\"\n/*\n *  String cache.\n *\n *  Provides a cache to optimize indexed string lookups.  The cache keeps\n *  track of (byte offset, char offset) states for a fixed number of strings.\n *  Otherwise we'd need to scan from either end of the string, as we store\n *  strings in (extended) UTF-8.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Delete references to given hstring from the heap string cache.\n *\n *  String cache references are 'weak': they are not counted towards\n *  reference counts, nor serve as roots for mark-and-sweep.  When an\n *  object is about to be freed, such references need to be removed.\n */\n\nDUK_INTERNAL void duk_heap_strcache_string_remove(duk_heap *heap, duk_hstring *h) {\n\tduk_small_int_t i;\n\tfor (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {\n\t\tduk_strcache *c = heap->strcache + i;\n\t\tif (c->h == h) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"deleting weak strcache reference to hstring %p from heap %p\",\n\t\t\t                   (void *) h, (void *) heap));\n\t\t\tc->h = NULL;\n\n\t\t\t/* XXX: the string shouldn't appear twice, but we now loop to the\n\t\t\t * end anyway; if fixed, add a looping assertion to ensure there\n\t\t\t * is no duplicate.\n\t\t\t */\n\t\t}\n\t}\n}\n\n/*\n *  String scanning helpers\n *\n *  All bytes other than UTF-8 continuation bytes ([0x80,0xbf]) are\n *  considered to contribute a character.  This must match how string\n *  character length is computed.\n */\n\nDUK_LOCAL const duk_uint8_t *duk__scan_forwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) {\n\twhile (n > 0) {\n\t\tfor (;;) {\n\t\t\tp++;\n\t\t\tif (p >= q) {\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif ((*p & 0xc0) != 0x80) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tn--;\n\t}\n\treturn p;\n}\n\nDUK_LOCAL const duk_uint8_t *duk__scan_backwards(const duk_uint8_t *p, const duk_uint8_t *q, duk_uint_fast32_t n) {\n\twhile (n > 0) {\n\t\tfor (;;) {\n\t\t\tp--;\n\t\t\tif (p < q) {\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif ((*p & 0xc0) != 0x80) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tn--;\n\t}\n\treturn p;\n}\n\n/*\n *  Convert char offset to byte offset\n *\n *  Avoid using the string cache if possible: for ASCII strings byte and\n *  char offsets are equal and for short strings direct scanning may be\n *  better than using the string cache (which may evict a more important\n *  entry).\n *\n *  Typing now assumes 32-bit string byte/char offsets (duk_uint_fast32_t).\n *  Better typing might be to use duk_size_t.\n *\n *  Caller should ensure 'char_offset' is within the string bounds [0,charlen]\n *  (endpoint is inclusive).  If this is not the case, no memory unsafe\n *  behavior will happen but an error will be thrown.\n */\n\nDUK_INTERNAL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset) {\n\tduk_heap *heap;\n\tduk_strcache *sce;\n\tduk_uint_fast32_t byte_offset;\n\tduk_small_int_t i;\n\tduk_bool_t use_cache;\n\tduk_uint_fast32_t dist_start, dist_end, dist_sce;\n\tduk_uint_fast32_t char_length;\n\tconst duk_uint8_t *p_start;\n\tconst duk_uint8_t *p_end;\n\tconst duk_uint8_t *p_found;\n\n\t/*\n\t *  For ASCII strings, the answer is simple.\n\t */\n\n\tif (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) {\n\t\treturn char_offset;\n\t}\n\n\tchar_length = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h);\n\tDUK_ASSERT(char_offset <= char_length);\n\n\tif (DUK_LIKELY(DUK_HSTRING_IS_ASCII(h))) {\n\t\t/* Must recheck because the 'is ascii' flag may be set\n\t\t * lazily.  Alternatively, we could just compare charlen\n\t\t * to bytelen.\n\t\t */\n\t\treturn char_offset;\n\t}\n\n\t/*\n\t *  For non-ASCII strings, we need to scan forwards or backwards\n\t *  from some starting point.  The starting point may be the start\n\t *  or end of the string, or some cached midpoint in the string\n\t *  cache.\n\t *\n\t *  For \"short\" strings we simply scan without checking or updating\n\t *  the cache.  For longer strings we check and update the cache as\n\t *  necessary, inserting a new cache entry if none exists.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"non-ascii string %p, char_offset=%ld, clen=%ld, blen=%ld\",\n\t                     (void *) h, (long) char_offset,\n\t                     (long) DUK_HSTRING_GET_CHARLEN(h),\n\t                     (long) DUK_HSTRING_GET_BYTELEN(h)));\n\n\theap = thr->heap;\n\tsce = NULL;\n\tuse_cache = (char_length > DUK_HEAP_STRINGCACHE_NOCACHE_LIMIT);\n\n\tif (use_cache) {\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n\t\tDUK_DDD(DUK_DDDPRINT(\"stringcache before char2byte (using cache):\"));\n\t\tfor (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {\n\t\t\tduk_strcache *c = heap->strcache + i;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"  [%ld] -> h=%p, cidx=%ld, bidx=%ld\",\n\t\t\t                     (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx));\n\t\t}\n#endif\n\n\t\tfor (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {\n\t\t\tduk_strcache *c = heap->strcache + i;\n\n\t\t\tif (c->h == h) {\n\t\t\t\tsce = c;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t *  Scan from shortest distance:\n\t *    - start of string\n\t *    - end of string\n\t *    - cache entry (if exists)\n\t */\n\n\tDUK_ASSERT(DUK_HSTRING_GET_CHARLEN(h) >= char_offset);\n\tdist_start = char_offset;\n\tdist_end = char_length - char_offset;\n\tdist_sce = 0; DUK_UNREF(dist_sce);  /* initialize for debug prints, needed if sce==NULL */\n\n\tp_start = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);\n\tp_end = (const duk_uint8_t *) (p_start + DUK_HSTRING_GET_BYTELEN(h));\n\tp_found = NULL;\n\n\tif (sce) {\n\t\tif (char_offset >= sce->cidx) {\n\t\t\tdist_sce = char_offset - sce->cidx;\n\t\t\tif ((dist_sce <= dist_start) && (dist_sce <= dist_end)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, \"\n\t\t\t\t                     \"dist_start=%ld, dist_end=%ld, dist_sce=%ld => \"\n\t\t\t\t                     \"scan forwards from sce\",\n\t\t\t\t                     (long) use_cache, (void *) (sce ? sce->h : NULL),\n\t\t\t\t                     (sce ? (long) sce->cidx : (long) -1),\n\t\t\t\t                     (sce ? (long) sce->bidx : (long) -1),\n\t\t\t\t                     (long) dist_start, (long) dist_end, (long) dist_sce));\n\n\t\t\t\tp_found = duk__scan_forwards(p_start + sce->bidx,\n\t\t\t\t                             p_end,\n\t\t\t\t                             dist_sce);\n\t\t\t\tgoto scan_done;\n\t\t\t}\n\t\t} else {\n\t\t\tdist_sce = sce->cidx - char_offset;\n\t\t\tif ((dist_sce <= dist_start) && (dist_sce <= dist_end)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, \"\n\t\t\t\t                     \"dist_start=%ld, dist_end=%ld, dist_sce=%ld => \"\n\t\t\t\t                     \"scan backwards from sce\",\n\t\t\t\t                     (long) use_cache, (void *) (sce ? sce->h : NULL),\n\t\t\t\t                     (sce ? (long) sce->cidx : (long) -1),\n\t\t\t\t                     (sce ? (long) sce->bidx : (long) -1),\n\t\t\t\t                     (long) dist_start, (long) dist_end, (long) dist_sce));\n\n\t\t\t\tp_found = duk__scan_backwards(p_start + sce->bidx,\n\t\t\t\t                              p_start,\n\t\t\t\t                              dist_sce);\n\t\t\t\tgoto scan_done;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* no sce, or sce scan not best */\n\n\tif (dist_start <= dist_end) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, \"\n\t\t                     \"dist_start=%ld, dist_end=%ld, dist_sce=%ld => \"\n\t\t                     \"scan forwards from string start\",\n\t\t                     (long) use_cache, (void *) (sce ? sce->h : NULL),\n\t\t                     (sce ? (long) sce->cidx : (long) -1),\n\t\t                     (sce ? (long) sce->bidx : (long) -1),\n\t\t                     (long) dist_start, (long) dist_end, (long) dist_sce));\n\n\t\tp_found = duk__scan_forwards(p_start,\n\t\t                             p_end,\n\t\t                             dist_start);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"non-ascii string, use_cache=%ld, sce=%p:%ld:%ld, \"\n\t\t                     \"dist_start=%ld, dist_end=%ld, dist_sce=%ld => \"\n\t\t                     \"scan backwards from string end\",\n\t\t                     (long) use_cache, (void *) (sce ? sce->h : NULL),\n\t\t                     (sce ? (long) sce->cidx : (long) -1),\n\t\t                     (sce ? (long) sce->bidx : (long) -1),\n\t\t                     (long) dist_start, (long) dist_end, (long) dist_sce));\n\n\t\tp_found = duk__scan_backwards(p_end,\n\t\t                              p_start,\n\t\t                              dist_end);\n\t}\n\n scan_done:\n\n\tif (DUK_UNLIKELY(p_found == NULL)) {\n\t\t/* Scan error: this shouldn't normally happen; it could happen if\n\t\t * string is not valid UTF-8 data, and clen/blen are not consistent\n\t\t * with the scanning algorithm.\n\t\t */\n\t\tgoto scan_error;\n\t}\n\n\tDUK_ASSERT(p_found >= p_start);\n\tDUK_ASSERT(p_found <= p_end);  /* may be equal */\n\tbyte_offset = (duk_uint32_t) (p_found - p_start);\n\n\tDUK_DDD(DUK_DDDPRINT(\"-> string %p, cidx %ld -> bidx %ld\",\n\t                     (void *) h, (long) char_offset, (long) byte_offset));\n\n\t/*\n\t *  Update cache entry (allocating if necessary), and move the\n\t *  cache entry to the first place (in an \"LRU\" policy).\n\t */\n\n\tif (use_cache) {\n\t\t/* update entry, allocating if necessary */\n\t\tif (!sce) {\n\t\t\tsce = heap->strcache + DUK_HEAP_STRCACHE_SIZE - 1;  /* take last entry */\n\t\t\tsce->h = h;\n\t\t}\n\t\tDUK_ASSERT(sce != NULL);\n\t\tsce->bidx = (duk_uint32_t) (p_found - p_start);\n\t\tsce->cidx = (duk_uint32_t) char_offset;\n\n\t\t/* LRU: move our entry to first */\n\t\tif (sce > &heap->strcache[0]) {\n\t\t\t/*\n\t\t\t *   A                  C\n\t\t\t *   B                  A\n\t\t\t *   C <- sce    ==>    B\n\t\t\t *   D                  D\n\t\t\t */\n\t\t\tduk_strcache tmp;\n\n\t\t\ttmp = *sce;\n\t\t\tDUK_MEMMOVE((void *) (&heap->strcache[1]),\n\t\t\t            (const void *) (&heap->strcache[0]),\n\t\t\t            (size_t) (((char *) sce) - ((char *) &heap->strcache[0])));\n\t\t\theap->strcache[0] = tmp;\n\n\t\t\t/* 'sce' points to the wrong entry here, but is no longer used */\n\t\t}\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n\t\tDUK_DDD(DUK_DDDPRINT(\"stringcache after char2byte (using cache):\"));\n\t\tfor (i = 0; i < DUK_HEAP_STRCACHE_SIZE; i++) {\n\t\t\tduk_strcache *c = heap->strcache + i;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"  [%ld] -> h=%p, cidx=%ld, bidx=%ld\",\n\t\t\t                     (long) i, (void *) c->h, (long) c->cidx, (long) c->bidx));\n\t\t}\n#endif\n\t}\n\n\treturn byte_offset;\n\n scan_error:\n\tDUK_ERROR_INTERNAL(thr);\n\treturn 0;\n}\n#line 1 \"duk_heap_stringtable.c\"\n/*\n *  Heap string table handling, string interning.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Resize checks not needed if minsize == maxsize, typical for low memory\n * targets.\n */\n#define DUK__STRTAB_RESIZE_CHECK\n#if (DUK_USE_STRTAB_MINSIZE == DUK_USE_STRTAB_MAXSIZE)\n#undef DUK__STRTAB_RESIZE_CHECK\n#endif\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n#define DUK__HEAPPTR_ENC16(heap,ptr)    DUK_USE_HEAPPTR_ENC16((heap)->heap_udata, (ptr))\n#define DUK__HEAPPTR_DEC16(heap,val)    DUK_USE_HEAPPTR_DEC16((heap)->heap_udata, (val))\n#define DUK__GET_STRTABLE(heap)         ((heap)->strtable16)\n#else\n#define DUK__HEAPPTR_ENC16(heap,ptr)    (ptr)\n#define DUK__HEAPPTR_DEC16(heap,val)    (val)\n#define DUK__GET_STRTABLE(heap)         ((heap)->strtable)\n#endif\n\n#define DUK__STRTAB_U32_MAX_STRLEN      10               /* 4'294'967'295 */\n\n/*\n *  Debug dump stringtable.\n */\n\n#if defined(DUK_USE_DEBUG)\nDUK_INTERNAL void duk_heap_strtable_dump(duk_heap *heap) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *strtable;\n#else\n\tduk_hstring **strtable;\n#endif\n\tduk_uint32_t i;\n\tduk_hstring *h;\n\tduk_size_t count_total = 0;\n\tduk_size_t count_chain;\n\tduk_size_t count_chain_min = DUK_SIZE_MAX;\n\tduk_size_t count_chain_max = 0;\n\tduk_size_t count_len[8];  /* chain lengths from 0 to 7 */\n\n\tif (heap == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"string table, heap=NULL\"));\n\t\treturn;\n\t}\n\n\tstrtable = DUK__GET_STRTABLE(heap);\n\tif (strtable == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"string table, strtab=NULL\"));\n\t\treturn;\n\t}\n\n\tDUK_MEMZERO((void *) count_len, sizeof(count_len));\n\tfor (i = 0; i < heap->st_size; i++) {\n\t\th = DUK__HEAPPTR_DEC16(heap, strtable[i]);\n\t\tcount_chain = 0;\n\t\twhile (h != NULL) {\n\t\t\tcount_chain++;\n\t\t\th = h->hdr.h_next;\n\t\t}\n\t\tif (count_chain < sizeof(count_len) / sizeof(duk_size_t)) {\n\t\t\tcount_len[count_chain]++;\n\t\t}\n\t\tcount_chain_max = (count_chain > count_chain_max ? count_chain : count_chain_max);\n\t\tcount_chain_min = (count_chain < count_chain_min ? count_chain : count_chain_min);\n\t\tcount_total += count_chain;\n\t}\n\n\tDUK_D(DUK_DPRINT(\"string table, strtab=%p, count=%lu, chain min=%lu max=%lu avg=%lf: \"\n\t                 \"counts: %lu %lu %lu %lu %lu %lu %lu %lu ...\",\n\t                 (void *) heap->strtable, (unsigned long) count_total,\n\t                 (unsigned long) count_chain_min, (unsigned long) count_chain_max,\n\t                 (double) count_total / (double) heap->st_size,\n\t                 (unsigned long) count_len[0], (unsigned long) count_len[1],\n\t                 (unsigned long) count_len[2], (unsigned long) count_len[3],\n\t                 (unsigned long) count_len[4], (unsigned long) count_len[5],\n\t                 (unsigned long) count_len[6], (unsigned long) count_len[7]));\n}\n#endif  /* DUK_USE_DEBUG */\n\n/*\n *  Assertion helper to ensure strtable is populated correctly.\n */\n\n#if defined(DUK_USE_ASSERTIONS)\nDUK_LOCAL void duk__strtable_assert_checks(duk_heap *heap) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *strtable;\n#else\n\tduk_hstring **strtable;\n#endif\n\tduk_uint32_t i;\n\tduk_hstring *h;\n\tduk_size_t count = 0;\n\n\tDUK_ASSERT(heap != NULL);\n\n\tstrtable = DUK__GET_STRTABLE(heap);\n\tif (strtable != NULL) {\n\t\tDUK_ASSERT(heap->st_size != 0);\n\t\tDUK_ASSERT(heap->st_mask == heap->st_size - 1);\n\n\t\tfor (i = 0; i < heap->st_size; i++) {\n\t\t\th = DUK__HEAPPTR_DEC16(heap, strtable[i]);\n\t\t\twhile (h != NULL) {\n\t\t\t\tDUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i);\n\t\t\t\tcount++;\n\t\t\t\th = h->hdr.h_next;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tDUK_ASSERT(heap->st_size == 0);\n\t\tDUK_ASSERT(heap->st_mask == 0);\n\t}\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\n\tDUK_ASSERT(count == (duk_size_t) heap->st_count);\n#endif\n}\n#endif  /* DUK_USE_ASSERTIONS */\n\n/*\n *  Allocate and initialize a duk_hstring.\n *\n *  Returns a NULL if allocation or initialization fails for some reason.\n *\n *  The string won't be inserted into the string table and isn't tracked in\n *  any way (link pointers will be NULL).  The caller must place the string\n *  into the string table without any risk of a longjmp, otherwise the string\n *  is leaked.\n */\n\nDUK_LOCAL duk_hstring *duk__strtable_alloc_hstring(duk_heap *heap,\n                                                   const duk_uint8_t *str,\n                                                   duk_uint32_t blen,\n                                                   duk_uint32_t strhash,\n                                                   const duk_uint8_t *extdata) {\n\tduk_hstring *res;\n\tconst duk_uint8_t *data;\n#if !defined(DUK_USE_HSTRING_ARRIDX)\n\tduk_uarridx_t dummy;\n#endif\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_UNREF(extdata);\n\n#if defined(DUK_USE_STRLEN16)\n\t/* If blen <= 0xffffUL, clen is also guaranteed to be <= 0xffffUL. */\n\tif (blen > 0xffffUL) {\n\t\tDUK_D(DUK_DPRINT(\"16-bit string blen/clen active and blen over 16 bits, reject intern\"));\n\t\tgoto alloc_error;\n\t}\n#endif\n\n\t/* XXX: Memzeroing the allocated structure is not really necessary\n\t * because we could just initialize all fields explicitly (almost\n\t * all fields are initialized explicitly anyway).\n\t */\n#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK)\n\tif (extdata) {\n\t\tres = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring_external));\n\t\tif (DUK_UNLIKELY(res == NULL)) {\n\t\t\tgoto alloc_error;\n\t\t}\n\t\tDUK_MEMZERO(res, sizeof(duk_hstring_external));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\t\tDUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr);\n#endif\n\t\tDUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, DUK_HSTRING_FLAG_EXTDATA);\n\n\t\tDUK_ASSERT(extdata[blen] == 0);  /* Application responsibility. */\n\t\tdata = extdata;\n\t\t((duk_hstring_external *) res)->extdata = extdata;\n\t} else\n#endif  /* DUK_USE_HSTRING_EXTDATA && DUK_USE_EXTSTR_INTERN_CHECK */\n\t{\n\t\tduk_uint8_t *data_tmp;\n\n\t\t/* NUL terminate for convenient C access */\n\t\tDUK_ASSERT(sizeof(duk_hstring) + blen + 1 > blen);  /* No wrap, limits ensure. */\n\t\tres = (duk_hstring *) DUK_ALLOC(heap, sizeof(duk_hstring) + blen + 1);\n\t\tif (DUK_UNLIKELY(res == NULL)) {\n\t\t\tgoto alloc_error;\n\t\t}\n\t\tDUK_MEMZERO(res, sizeof(duk_hstring));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\t\tDUK_HEAPHDR_STRING_INIT_NULLS(&res->hdr);\n#endif\n\t\tDUK_HEAPHDR_SET_TYPE_AND_FLAGS(&res->hdr, DUK_HTYPE_STRING, 0);\n\n\t\tdata_tmp = (duk_uint8_t *) (res + 1);\n\t\tDUK_MEMCPY(data_tmp, str, blen);\n\t\tdata_tmp[blen] = (duk_uint8_t) 0;\n\t\tdata = (const duk_uint8_t *) data_tmp;\n\t}\n\n\tDUK_HSTRING_SET_BYTELEN(res, blen);\n\tDUK_HSTRING_SET_HASH(res, strhash);\n\n\tDUK_ASSERT(!DUK_HSTRING_HAS_ARRIDX(res));\n#if defined(DUK_USE_HSTRING_ARRIDX)\n\tres->arridx = duk_js_to_arrayindex_string(data, blen);\n\tif (res->arridx != DUK_HSTRING_NO_ARRAY_INDEX) {\n#else\n\tdummy = duk_js_to_arrayindex_string(data, blen);\n\tif (dummy != DUK_HSTRING_NO_ARRAY_INDEX) {\n#endif\n\t\t/* Array index strings cannot be symbol strings,\n\t\t * and they're always pure ASCII so blen == clen.\n\t\t */\n\t\tDUK_HSTRING_SET_ARRIDX(res);\n\t\tDUK_HSTRING_SET_ASCII(res);\n\t\tDUK_ASSERT(duk_unicode_unvalidated_utf8_length(data, (duk_size_t) blen) == blen);\n\t} else {\n\t\t/* Because 'data' is NUL-terminated, we don't need a\n\t\t * blen > 0 check here.  For NUL (0x00) the symbol\n\t\t * checks will be false.\n\t\t */\n\t\tif (DUK_UNLIKELY(data[0] >= 0x80U)) {\n\t\t\tif (data[0] <= 0x81) {\n\t\t\t\tDUK_HSTRING_SET_SYMBOL(res);\n\t\t\t} else if (data[0] == 0x82U || data[0] == 0xffU) {\n\t\t\t\tDUK_HSTRING_SET_HIDDEN(res);\n\t\t\t\tDUK_HSTRING_SET_SYMBOL(res);\n\t\t\t}\n\t\t}\n\n\t\t/* Using an explicit 'ASCII' flag has larger footprint (one call site\n\t\t * only) but is quite useful for the case when there's no explicit\n\t\t * 'clen' in duk_hstring.\n\t\t *\n\t\t * The flag is set lazily for RAM strings.\n\t\t */\n\t\tDUK_ASSERT(!DUK_HSTRING_HAS_ASCII(res));\n\n#if defined(DUK_USE_HSTRING_LAZY_CLEN)\n\t\t/* Charlen initialized to 0, updated on-the-fly. */\n#else\n\t\tduk_hstring_init_charlen(res);  /* Also sets ASCII flag. */\n#endif\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"interned string, hash=0x%08lx, blen=%ld, has_arridx=%ld, has_extdata=%ld\",\n\t                     (unsigned long) DUK_HSTRING_GET_HASH(res),\n\t                     (long) DUK_HSTRING_GET_BYTELEN(res),\n\t                     (long) (DUK_HSTRING_HAS_ARRIDX(res) ? 1 : 0),\n\t                     (long) (DUK_HSTRING_HAS_EXTDATA(res) ? 1 : 0)));\n\n\tDUK_ASSERT(res != NULL);\n\treturn res;\n\n alloc_error:\n\treturn NULL;\n}\n\n/*\n *  Grow strtable allocation in-place.\n */\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\nDUK_LOCAL void duk__strtable_grow_inplace(duk_heap *heap) {\n\tduk_uint32_t new_st_size;\n\tduk_uint32_t old_st_size;\n\tduk_uint32_t i;\n\tduk_hstring *h;\n\tduk_hstring *next;\n\tduk_hstring *prev;\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *new_ptr;\n\tduk_uint16_t *new_ptr_high;\n#else\n\tduk_hstring **new_ptr;\n\tduk_hstring **new_ptr_high;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"grow in-place: %lu -> %lu\", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2));\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->st_resizing == 1);\n\tDUK_ASSERT(heap->st_size >= 2);\n\tDUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0);  /* 2^N */\n\tDUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL);\n\n\tDUK_STATS_INC(heap, stats_strtab_resize_grow);\n\n\tnew_st_size = heap->st_size << 1U;\n\tDUK_ASSERT(new_st_size > heap->st_size);  /* No overflow. */\n\n\t/* Reallocate the strtable first and then work in-place to rehash\n\t * strings.  We don't need an indirect allocation here: even if GC\n\t * is triggered to satisfy the allocation, recursive strtable resize\n\t * is prevented by flags.  This is also why we don't need to use\n\t * DUK_REALLOC_INDIRECT().\n\t */\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tnew_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size);\n#else\n\tnew_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size);\n#endif\n\tif (DUK_UNLIKELY(new_ptr == NULL)) {\n\t\t/* If realloc fails we can continue normally: the string table\n\t\t * won't \"fill up\" although chains will gradually get longer.\n\t\t * When string insertions continue, we'll quite soon try again\n\t\t * with no special handling.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"string table grow failed, ignoring\"));\n\t\treturn;\n\t}\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\theap->strtable16 = new_ptr;\n#else\n\theap->strtable = new_ptr;\n#endif\n\n\t/* Rehash a single bucket into two separate ones.  When we grow\n\t * by x2 the highest 'new' bit determines whether a string remains\n\t * in its old position (bit is 0) or goes to a new one (bit is 1).\n\t */\n\n\told_st_size = heap->st_size;\n\tnew_ptr_high = new_ptr + old_st_size;\n\tfor (i = 0; i < old_st_size; i++) {\n\t\tduk_hstring *new_root;\n\t\tduk_hstring *new_root_high;\n\n\t\th = DUK__HEAPPTR_DEC16(heap, new_ptr[i]);\n\t\tnew_root = h;\n\t\tnew_root_high = NULL;\n\n\t\tprev = NULL;\n\t\twhile (h != NULL) {\n\t\t\tduk_uint32_t mask;\n\n\t\t\tDUK_ASSERT((DUK_HSTRING_GET_HASH(h) & heap->st_mask) == i);\n\t\t\tnext = h->hdr.h_next;\n\n\t\t\t/* Example: if previous size was 256, previous mask is 0xFF\n\t\t\t * and size is 0x100 which corresponds to the new bit that\n\t\t\t * comes into play.\n\t\t\t */\n\t\t\tDUK_ASSERT(heap->st_mask == old_st_size - 1);\n\t\t\tmask = old_st_size;\n\t\t\tif (DUK_HSTRING_GET_HASH(h) & mask) {\n\t\t\t\tif (prev != NULL) {\n\t\t\t\t\tprev->hdr.h_next = h->hdr.h_next;\n\t\t\t\t} else {\n\t\t\t\t\tDUK_ASSERT(h == new_root);\n\t\t\t\t\tnew_root = h->hdr.h_next;\n\t\t\t\t}\n\n\t\t\t\th->hdr.h_next = new_root_high;\n\t\t\t\tnew_root_high = h;\n\t\t\t} else {\n\t\t\t\tprev = h;\n\t\t\t}\n\t\t\th = next;\n\t\t}\n\n\t\tnew_ptr[i] = DUK__HEAPPTR_ENC16(heap, new_root);\n\t\tnew_ptr_high[i] = DUK__HEAPPTR_ENC16(heap, new_root_high);\n\t}\n\n\theap->st_size = new_st_size;\n\theap->st_mask = new_st_size - 1;\n\n#if defined(DUK_USE_ASSERTIONS)\n\tduk__strtable_assert_checks(heap);\n#endif\n}\n#endif  /* DUK__STRTAB_RESIZE_CHECK */\n\n/*\n *  Shrink strtable allocation in-place.\n */\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\nDUK_LOCAL void duk__strtable_shrink_inplace(duk_heap *heap) {\n\tduk_uint32_t new_st_size;\n\tduk_uint32_t i;\n\tduk_hstring *h;\n\tduk_hstring *other;\n\tduk_hstring *root;\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *old_ptr;\n\tduk_uint16_t *old_ptr_high;\n\tduk_uint16_t *new_ptr;\n#else\n\tduk_hstring **old_ptr;\n\tduk_hstring **old_ptr_high;\n\tduk_hstring **new_ptr;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"shrink in-place: %lu -> %lu\", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2));\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(heap->st_resizing == 1);\n\tDUK_ASSERT(heap->st_size >= 2);\n\tDUK_ASSERT((heap->st_size & (heap->st_size - 1)) == 0);  /* 2^N */\n\tDUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL);\n\n\tDUK_STATS_INC(heap, stats_strtab_resize_shrink);\n\n\tnew_st_size = heap->st_size >> 1U;\n\n\t/* Combine two buckets into a single one.  When we shrink, one hash\n\t * bit (highest) disappears.\n\t */\n\told_ptr = DUK__GET_STRTABLE(heap);\n\told_ptr_high = old_ptr + new_st_size;\n\tfor (i = 0; i < new_st_size; i++) {\n\t\th = DUK__HEAPPTR_DEC16(heap, old_ptr[i]);\n\t\tother = DUK__HEAPPTR_DEC16(heap, old_ptr_high[i]);\n\n\t\tif (h == NULL) {\n\t\t\t/* First chain is empty, so use second one as is. */\n\t\t\troot = other;\n\t\t} else {\n\t\t\t/* Find end of first chain, and link in the second. */\n\t\t\troot = h;\n\t\t\twhile (h->hdr.h_next != NULL) {\n\t\t\t\th = h->hdr.h_next;\n\t\t\t}\n\t\t\th->hdr.h_next = other;\n\t\t}\n\n\t\told_ptr[i] = DUK__HEAPPTR_ENC16(heap, root);\n\t}\n\n\theap->st_size = new_st_size;\n\theap->st_mask = new_st_size - 1;\n\n\t/* The strtable is now consistent and we can realloc safely.  Even\n\t * if side effects cause string interning or removal the strtable\n\t * updates are safe.  Recursive resize has been prevented by caller.\n\t * This is also why we don't need to use DUK_REALLOC_INDIRECT().\n\t *\n\t * We assume a realloc() to a smaller size is guaranteed to succeed.\n\t * It would be relatively straightforward to handle the error by\n\t * essentially performing a \"grow\" step to recover.\n\t */\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tnew_ptr = (duk_uint16_t *) DUK_REALLOC(heap, heap->strtable16, sizeof(duk_uint16_t) * new_st_size);\n\tDUK_ASSERT(new_ptr != NULL);\n\theap->strtable16 = new_ptr;\n#else\n\tnew_ptr = (duk_hstring **) DUK_REALLOC(heap, heap->strtable, sizeof(duk_hstring *) * new_st_size);\n\tDUK_ASSERT(new_ptr != NULL);\n\theap->strtable = new_ptr;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\tduk__strtable_assert_checks(heap);\n#endif\n}\n#endif  /* DUK__STRTAB_RESIZE_CHECK */\n\n/*\n *  Grow/shrink check.\n */\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\nDUK_LOCAL DUK_COLD DUK_NOINLINE void duk__strtable_resize_check(duk_heap *heap) {\n\tduk_uint32_t load_factor;  /* fixed point */\n\n\tDUK_ASSERT(heap != NULL);\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tDUK_ASSERT(heap->strtable16 != NULL);\n#else\n\tDUK_ASSERT(heap->strtable != NULL);\n#endif\n\n\tDUK_STATS_INC(heap, stats_strtab_resize_check);\n\n\t/* Prevent recursive resizing. */\n\tif (DUK_UNLIKELY(heap->st_resizing != 0U)) {\n\t\tDUK_D(DUK_DPRINT(\"prevent recursive strtable resize\"));\n\t\treturn;\n\t}\n\n\theap->st_resizing = 1;\n\n\tDUK_ASSERT(heap->st_size >= 16U);\n\tDUK_ASSERT((heap->st_size >> 4U) >= 1);\n\tload_factor = heap->st_count / (heap->st_size >> 4U);\n\n\tDUK_DD(DUK_DDPRINT(\"resize check string table: size=%lu, count=%lu, load_factor=%lu (fixed point .4; float %lf)\",\n\t                   (unsigned long) heap->st_size, (unsigned long) heap->st_count,\n\t                   (unsigned long) load_factor,\n\t                   (double) heap->st_count / (double) heap->st_size));\n\n\tif (load_factor >= DUK_USE_STRTAB_GROW_LIMIT) {\n\t\tif (heap->st_size >= DUK_USE_STRTAB_MAXSIZE) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"want to grow strtable (based on load factor) but already maximum size\"));\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"grow string table: %lu -> %lu\", (unsigned long) heap->st_size, (unsigned long) heap->st_size * 2));\n#if defined(DUK_USE_DEBUG)\n\t\t\tduk_heap_strtable_dump(heap);\n#endif\n\t\t\tduk__strtable_grow_inplace(heap);\n\t\t}\n\t} else if (load_factor <= DUK_USE_STRTAB_SHRINK_LIMIT) {\n\t\tif (heap->st_size <= DUK_USE_STRTAB_MINSIZE) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"want to shrink strtable (based on load factor) but already minimum size\"));\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"shrink string table: %lu -> %lu\", (unsigned long) heap->st_size, (unsigned long) heap->st_size / 2));\n#if defined(DUK_USE_DEBUG)\n\t\t\tduk_heap_strtable_dump(heap);\n#endif\n\t\t\tduk__strtable_shrink_inplace(heap);\n\t\t}\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"no need for strtable resize\"));\n\t}\n\n\theap->st_resizing = 0;\n}\n#endif  /* DUK__STRTAB_RESIZE_CHECK */\n\n/*\n *  Torture grow/shrink: unconditionally grow and shrink back.\n */\n\n#if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK)\nDUK_LOCAL void duk__strtable_resize_torture(duk_heap *heap) {\n\tduk_uint32_t old_st_size;\n\n\tDUK_ASSERT(heap != NULL);\n\n\told_st_size = heap->st_size;\n\tif (old_st_size >= DUK_USE_STRTAB_MAXSIZE) {\n\t\treturn;\n\t}\n\n\theap->st_resizing = 1;\n\tduk__strtable_grow_inplace(heap);\n\tif (heap->st_size > old_st_size) {\n\t\tduk__strtable_shrink_inplace(heap);\n\t}\n\theap->st_resizing = 0;\n}\n#endif  /* DUK_USE_STRTAB_TORTURE && DUK__STRTAB_RESIZE_CHECK */\n\n/*\n *  Raw intern; string already checked not to be present.\n */\n\nDUK_LOCAL duk_hstring *duk__strtable_do_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen, duk_uint32_t strhash) {\n\tduk_hstring *res;\n\tconst duk_uint8_t *extdata;\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *slot;\n#else\n\tduk_hstring **slot;\n#endif\n\n\tDUK_DDD(DUK_DDDPRINT(\"do_intern: heap=%p, str=%p, blen=%lu, strhash=%lx, st_size=%lu, st_count=%lu, load=%lf\",\n\t                     (void *) heap, (const void *) str, (unsigned long) blen, (unsigned long) strhash,\n\t                     (unsigned long) heap->st_size, (unsigned long) heap->st_count,\n\t                     (double) heap->st_count / (double) heap->st_size));\n\n\tDUK_ASSERT(heap != NULL);\n\n\t/* Prevent any side effects on the string table and the caller provided\n\t * str/blen arguments while interning is in progress.  For example, if\n\t * the caller provided str/blen from a dynamic buffer, a finalizer\n\t * might resize or modify that dynamic buffer, invalidating the call\n\t * arguments.\n\t *\n\t * While finalizers must be prevented, mark-and-sweep itself is fine.\n\t * Recursive string table resize is prevented explicitly here.\n\t */\n\n\theap->pf_prevent_count++;\n\tDUK_ASSERT(heap->pf_prevent_count != 0);  /* Wrap. */\n\n#if defined(DUK_USE_STRTAB_TORTURE) && defined(DUK__STRTAB_RESIZE_CHECK)\n\tduk__strtable_resize_torture(heap);\n#endif\n\n\t/* String table grow/shrink check.  Because of chaining (and no\n\t * accumulation issues as with hash probe chains and DELETED\n\t * markers) there's never a mandatory need to resize right now.\n\t * Check for the resize only periodically, based on st_count\n\t * bit pattern.  Because string table removal doesn't do a shrink\n\t * check, we do that also here.\n\t *\n\t * Do the resize and possible grow/shrink before the new duk_hstring\n\t * has been allocated.  Otherwise we may trigger a GC when the result\n\t * duk_hstring is not yet strongly referenced.\n\t */\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\n\tif (DUK_UNLIKELY((heap->st_count & DUK_USE_STRTAB_RESIZE_CHECK_MASK) == 0)) {\n\t\tduk__strtable_resize_check(heap);\n\t}\n#endif\n\n\t/* External string check (low memory optimization). */\n\n#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK)\n\textdata = (const duk_uint8_t *) DUK_USE_EXTSTR_INTERN_CHECK(heap->heap_udata, (void *) DUK_LOSE_CONST(str), (duk_size_t) blen);\n#else\n\textdata = (const duk_uint8_t *) NULL;\n#endif\n\n\t/* Allocate and initialize string, not yet linked.  This may cause a\n\t * GC which may cause other strings to be interned and inserted into\n\t * the string table before we insert our string.  Finalizer execution\n\t * is disabled intentionally to avoid a finalizer from e.g. resizing\n\t * a buffer used as a data area for 'str'.\n\t */\n\n\tres = duk__strtable_alloc_hstring(heap, str, blen, strhash, extdata);\n\n\t/* Allow side effects again: GC must be avoided until duk_hstring\n\t * result (if successful) has been INCREF'd.\n\t */\n\tDUK_ASSERT(heap->pf_prevent_count > 0);\n\theap->pf_prevent_count--;\n\n\t/* Alloc error handling. */\n\n\tif (DUK_UNLIKELY(res == NULL)) {\n#if defined(DUK_USE_HSTRING_EXTDATA) && defined(DUK_USE_EXTSTR_INTERN_CHECK)\n\t\tif (extdata != NULL) {\n\t\t\tDUK_USE_EXTSTR_FREE(heap->heap_udata, (const void *) extdata);\n\t\t}\n#endif\n\t\treturn NULL;\n\t}\n\n\t/* Insert into string table. */\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tslot = heap->strtable16 + (strhash & heap->st_mask);\n#else\n\tslot = heap->strtable + (strhash & heap->st_mask);\n#endif\n\tDUK_ASSERT(res->hdr.h_next == NULL);  /* This is the case now, but unnecessary zeroing/NULLing. */\n\tres->hdr.h_next = DUK__HEAPPTR_DEC16(heap, *slot);\n\t*slot = DUK__HEAPPTR_ENC16(heap, res);\n\n\t/* Update string count only for successful inserts. */\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\n\theap->st_count++;\n#endif\n\n\t/* The duk_hstring is in the string table but is not yet strongly\n\t * reachable.  Calling code MUST NOT make any allocations or other\n\t * side effects before the duk_hstring has been INCREF'd and made\n\t * reachable.\n\t */\n\n\treturn res;\n}\n\n/*\n *  Intern a string from str/blen, returning either an existing duk_hstring\n *  or adding a new one into the string table.  The input string does -not-\n *  need to be NUL terminated.\n *\n *  The input 'str' argument may point to a Duktape managed data area such as\n *  the data area of a dynamic buffer.  It's crucial to avoid any side effects\n *  that might affect the data area (e.g. resize the dynamic buffer, or write\n *  to the buffer) before the string is fully interned.\n */\n\n#if defined(DUK_USE_ROM_STRINGS)\nDUK_LOCAL duk_hstring *duk__strtab_romstring_lookup(duk_heap *heap, const duk_uint8_t *str, duk_size_t blen, duk_uint32_t strhash) {\n\tduk_size_t lookup_hash;\n\tduk_hstring *curr;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_UNREF(heap);\n\n\tlookup_hash = (blen << 4);\n\tif (blen > 0) {\n\t\tlookup_hash += str[0];\n\t}\n\tlookup_hash &= 0xff;\n\n\tcurr = DUK_LOSE_CONST(duk_rom_strings_lookup[lookup_hash]);\n\twhile (curr != NULL) {\n\t\tif (strhash == DUK_HSTRING_GET_HASH(curr) &&\n\t\t    blen == DUK_HSTRING_GET_BYTELEN(curr) &&\n\t\t    DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(curr), blen) == 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"intern check: rom string: %!O, computed hash 0x%08lx, rom hash 0x%08lx\",\n\t\t\t                     curr, (unsigned long) strhash, (unsigned long) DUK_HSTRING_GET_HASH(curr)));\n\t\t\treturn curr;\n\t\t}\n\t\tcurr = curr->hdr.h_next;\n\t}\n\n\treturn NULL;\n}\n#endif  /* DUK_USE_ROM_STRINGS */\n\nDUK_INTERNAL duk_hstring *duk_heap_strtable_intern(duk_heap *heap, const duk_uint8_t *str, duk_uint32_t blen) {\n\tduk_uint32_t strhash;\n\tduk_hstring *h;\n\n\tDUK_DDD(DUK_DDDPRINT(\"intern check: heap=%p, str=%p, blen=%lu\", (void *) heap, (const void *) str, (unsigned long) blen));\n\n\t/* Preliminaries. */\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(blen == 0 || str != NULL);\n\tDUK_ASSERT(blen <= DUK_HSTRING_MAX_BYTELEN);  /* Caller is responsible for ensuring this. */\n\tstrhash = duk_heap_hashstring(heap, str, (duk_size_t) blen);\n\n\t/* String table lookup. */\n\n\tDUK_ASSERT(DUK__GET_STRTABLE(heap) != NULL);\n\tDUK_ASSERT(heap->st_size > 0);\n\tDUK_ASSERT(heap->st_size == heap->st_mask + 1);\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\th = DUK__HEAPPTR_DEC16(heap, heap->strtable16[strhash & heap->st_mask]);\n#else\n\th = heap->strtable[strhash & heap->st_mask];\n#endif\n\twhile (h != NULL) {\n\t\tif (DUK_HSTRING_GET_HASH(h) == strhash &&\n\t\t    DUK_HSTRING_GET_BYTELEN(h) == blen &&\n\t\t    DUK_MEMCMP((const void *) str, (const void *) DUK_HSTRING_GET_DATA(h), (size_t) blen) == 0) {\n\t\t\t/* Found existing entry. */\n\t\t\tDUK_STATS_INC(heap, stats_strtab_intern_hit);\n\t\t\treturn h;\n\t\t}\n\t\th = h->hdr.h_next;\n\t}\n\n\t/* ROM table lookup.  Because this lookup is slower, do it only after\n\t * RAM lookup.  This works because no ROM string is ever interned into\n\t * the RAM string table.\n\t */\n\n#if defined(DUK_USE_ROM_STRINGS)\n\th = duk__strtab_romstring_lookup(heap, str, blen, strhash);\n\tif (h != NULL) {\n\t\tDUK_STATS_INC(heap, stats_strtab_intern_hit);\n\t\treturn h;\n\t}\n#endif\n\n\t/* Not found in string table; insert. */\n\n\tDUK_STATS_INC(heap, stats_strtab_intern_miss);\n\th = duk__strtable_do_intern(heap, str, blen, strhash);\n\treturn h;  /* may be NULL */\n}\n\n/*\n *  Intern a string from u32.\n */\n\n/* XXX: Could arrange some special handling because we know that the result\n * will have an arridx flag and an ASCII flag, won't need a clen check, etc.\n */\n\nDUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32(duk_heap *heap, duk_uint32_t val) {\n\tduk_uint8_t buf[DUK__STRTAB_U32_MAX_STRLEN];\n\tduk_uint8_t *p;\n\n\tDUK_ASSERT(heap != NULL);\n\n\t/* This is smaller and faster than a %lu sprintf. */\n\tp = buf + sizeof(buf);\n\tdo {\n\t\tp--;\n\t\t*p = duk_lc_digits[val % 10];\n\t\tval = val / 10;\n\t} while (val != 0);  /* For val == 0, emit exactly one '0'. */\n\tDUK_ASSERT(p >= buf);\n\n\treturn duk_heap_strtable_intern(heap, (const duk_uint8_t *) p, (duk_uint32_t) ((buf + sizeof(buf)) - p));\n}\n\n/*\n *  Checked convenience variants.\n *\n *  XXX: Because the main use case is for the checked variants, make them the\n *  main functionality and provide a safe variant separately (it is only needed\n *  during heap init).  The problem with that is that longjmp state and error\n *  creation must already be possible to throw.\n */\n\nDUK_INTERNAL duk_hstring *duk_heap_strtable_intern_checked(duk_hthread *thr, const duk_uint8_t *str, duk_uint32_t blen) {\n\tduk_hstring *res;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(blen == 0 || str != NULL);\n\n\tres = duk_heap_strtable_intern(thr->heap, str, blen);\n\tif (DUK_UNLIKELY(res == NULL)) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\treturn res;\n}\n\nDUK_INTERNAL duk_hstring *duk_heap_strtable_intern_u32_checked(duk_hthread *thr, duk_uint32_t val) {\n\tduk_hstring *res;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\tres = duk_heap_strtable_intern_u32(thr->heap, val);\n\tif (DUK_UNLIKELY(res == NULL)) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\treturn res;\n}\n\n/*\n *  Remove (unlink) a string from the string table.\n *\n *  Just unlinks the duk_hstring, leaving link pointers as garbage.\n *  Caller must free the string itself.\n */\n\n#if defined(DUK_USE_REFERENCE_COUNTING)\n/* Unlink without a 'prev' pointer. */\nDUK_INTERNAL void duk_heap_strtable_unlink(duk_heap *heap, duk_hstring *h) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *slot;\n#else\n\tduk_hstring **slot;\n#endif\n\tduk_hstring *other;\n\tduk_hstring *prev;\n\n\tDUK_DDD(DUK_DDDPRINT(\"remove: heap=%p, h=%p, blen=%lu, strhash=%lx\",\n\t                     (void *) heap, (void *) h,\n\t                     (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0),\n\t                     (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0)));\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(h != NULL);\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\n\tDUK_ASSERT(heap->st_count > 0);\n\theap->st_count--;\n#endif\n\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tslot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);\n#else\n\tslot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);\n#endif\n\tother = DUK__HEAPPTR_DEC16(heap, *slot);\n\tDUK_ASSERT(other != NULL);  /* At least argument string is in the chain. */\n\n\tprev = NULL;\n\twhile (other != h) {\n\t\tprev = other;\n\t\tother = other->hdr.h_next;\n\t\tDUK_ASSERT(other != NULL);  /* We'll eventually find 'h'. */\n\t}\n\tif (prev != NULL) {\n\t\t/* Middle of list. */\n\t\tprev->hdr.h_next = h->hdr.h_next;\n\t} else {\n\t\t/* Head of list. */\n\t\t*slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next);\n\t}\n\n\t/* There's no resize check on a string free.  The next string\n\t * intern will do one.\n\t */\n}\n#endif  /* DUK_USE_REFERENCE_COUNTING */\n\n/* Unlink with a 'prev' pointer. */\nDUK_INTERNAL void duk_heap_strtable_unlink_prev(duk_heap *heap, duk_hstring *h, duk_hstring *prev) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *slot;\n#else\n\tduk_hstring **slot;\n#endif\n\n\tDUK_DDD(DUK_DDDPRINT(\"remove: heap=%p, prev=%p, h=%p, blen=%lu, strhash=%lx\",\n\t                     (void *) heap, (void *) prev, (void *) h,\n\t                     (unsigned long) (h != NULL ? DUK_HSTRING_GET_BYTELEN(h) : 0),\n\t                     (unsigned long) (h != NULL ? DUK_HSTRING_GET_HASH(h) : 0)));\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(prev == NULL || prev->hdr.h_next == h);\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\n\tDUK_ASSERT(heap->st_count > 0);\n\theap->st_count--;\n#endif\n\n\tif (prev != NULL) {\n\t\t/* Middle of list. */\n\t\tprev->hdr.h_next = h->hdr.h_next;\n\t} else {\n\t\t/* Head of list. */\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t\tslot = heap->strtable16 + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);\n#else\n\t\tslot = heap->strtable + (DUK_HSTRING_GET_HASH(h) & heap->st_mask);\n#endif\n\t\tDUK_ASSERT(DUK__HEAPPTR_DEC16(heap, *slot) == h);\n\t\t*slot = DUK__HEAPPTR_ENC16(heap, h->hdr.h_next);\n\t}\n}\n\n/*\n *  Force string table resize check in mark-and-sweep.\n */\n\nDUK_INTERNAL void duk_heap_strtable_force_resize(duk_heap *heap) {\n\t/* Does only one grow/shrink step if needed.  The heap->st_resizing\n\t * flag protects against recursive resizing.\n\t */\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_UNREF(heap);\n\n#if defined(DUK__STRTAB_RESIZE_CHECK)\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tif (heap->strtable16 != NULL) {\n#else\n\tif (heap->strtable != NULL) {\n#endif\n\t\tduk__strtable_resize_check(heap);\n\t}\n#endif\n}\n\n/*\n *  Free strings in the string table and the string table itself.\n */\n\nDUK_INTERNAL void duk_heap_strtable_free(duk_heap *heap) {\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\tduk_uint16_t *strtable;\n\tduk_uint16_t *st;\n#else\n\tduk_hstring **strtable;\n\tduk_hstring **st;\n#endif\n\tduk_hstring *h;\n\n\tDUK_ASSERT(heap != NULL);\n\n#if defined(DUK_USE_ASSERTIONS)\n\tduk__strtable_assert_checks(heap);\n#endif\n\n\t/* Strtable can be NULL if heap init fails.  However, in that case\n\t * heap->st_size is 0, so strtable == strtable_end and we skip the\n\t * loop without a special check.\n\t */\n\tstrtable = DUK__GET_STRTABLE(heap);\n\tst = strtable + heap->st_size;\n\tDUK_ASSERT(strtable != NULL || heap->st_size == 0);\n\n\twhile (strtable != st) {\n\t\t--st;\n\t\th = DUK__HEAPPTR_DEC16(heap, *st);\n\t\twhile (h) {\n\t\t\tduk_hstring *h_next;\n\t\t\th_next = h->hdr.h_next;\n\n\t\t\t/* Strings may have inner refs (extdata) in some cases. */\n\t\t\tduk_free_hstring(heap, h);\n\n\t\t\th = h_next;\n\t\t}\n\t}\n\n\tDUK_FREE(heap, strtable);\n}\n\n/* automatic undefs */\n#undef DUK__GET_STRTABLE\n#undef DUK__HEAPPTR_DEC16\n#undef DUK__HEAPPTR_ENC16\n#undef DUK__STRTAB_U32_MAX_STRLEN\n#line 1 \"duk_hobject_alloc.c\"\n/*\n *  Hobject allocation.\n *\n *  Provides primitive allocation functions for all object types (plain object,\n *  compiled function, native function, thread).  The object return is not yet\n *  in \"heap allocated\" list and has a refcount of zero, so caller must careful.\n */\n\n/* XXX: In most cases there's no need for plain allocation without pushing\n * to the value stack.  Maybe rework contract?\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Helpers.\n */\n\nDUK_LOCAL void duk__init_object_parts(duk_heap *heap, duk_uint_t hobject_flags, duk_hobject *obj) {\n\tDUK_ASSERT(obj != NULL);\n\t/* Zeroed by caller. */\n\n\tobj->hdr.h_flags = hobject_flags | DUK_HTYPE_OBJECT;\n\tDUK_ASSERT(DUK_HEAPHDR_GET_TYPE(&obj->hdr) == DUK_HTYPE_OBJECT);  /* Assume zero shift. */\n\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tDUK_HOBJECT_SET_PROTOTYPE(heap, obj, NULL);\n\tDUK_HOBJECT_SET_PROPS(heap, obj, NULL);\n#endif\n#if defined(DUK_USE_HEAPPTR16)\n\t/* Zero encoded pointer is required to match NULL. */\n\tDUK_HEAPHDR_SET_NEXT(heap, &obj->hdr, NULL);\n#if defined(DUK_USE_DOUBLE_LINKED_HEAP)\n\tDUK_HEAPHDR_SET_PREV(heap, &obj->hdr, NULL);\n#endif\n#endif\n\tDUK_ASSERT_HEAPHDR_LINKS(heap, &obj->hdr);\n\tDUK_HEAP_INSERT_INTO_HEAP_ALLOCATED(heap, &obj->hdr);\n\n\t/* obj->props is intentionally left as NULL, and duk_hobject_props.c must deal\n\t * with this properly.  This is intentional: empty objects consume a minimum\n\t * amount of memory.  Further, an initial allocation might fail and cause\n\t * 'obj' to \"leak\" (require a mark-and-sweep) since it is not reachable yet.\n\t */\n}\n\nDUK_LOCAL void *duk__hobject_alloc_init(duk_hthread *thr, duk_uint_t hobject_flags, duk_size_t size) {\n\tvoid *res;\n\n\tres = (void *) DUK_ALLOC_CHECKED_ZEROED(thr, size);\n\tDUK_ASSERT(res != NULL);\n\tduk__init_object_parts(thr->heap, hobject_flags, (duk_hobject *) res);\n\treturn res;\n}\n\n/*\n *  Allocate an duk_hobject.\n *\n *  The allocated object has no allocation for properties; the caller may\n *  want to force a resize if a desired size is known.\n *\n *  The allocated object has zero reference count and is not reachable.\n *  The caller MUST make the object reachable and increase its reference\n *  count before invoking any operation that might require memory allocation.\n */\n\nDUK_INTERNAL duk_hobject *duk_hobject_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) {\n\tduk_hobject *res;\n\n\tDUK_ASSERT(heap != NULL);\n\n\t/* different memory layout, alloc size, and init */\n\tDUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_COMPFUNC) == 0);\n\tDUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_NATFUNC) == 0);\n\tDUK_ASSERT((hobject_flags & DUK_HOBJECT_FLAG_BOUNDFUNC) == 0);\n\n\tres = (duk_hobject *) DUK_ALLOC_ZEROED(heap, sizeof(duk_hobject));\n\tif (DUK_UNLIKELY(res == NULL)) {\n\t\treturn NULL;\n\t}\n\tDUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res));\n\n\tduk__init_object_parts(heap, hobject_flags, res);\n\n\tDUK_ASSERT(!DUK_HOBJECT_IS_THREAD(res));\n\treturn res;\n}\n\nDUK_INTERNAL duk_hobject *duk_hobject_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hobject *res;\n\n\tres = (duk_hobject *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobject));\n\treturn res;\n}\n\nDUK_INTERNAL duk_hcompfunc *duk_hcompfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hcompfunc *res;\n\n\tres = (duk_hcompfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hcompfunc));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n#if defined(DUK_USE_HEAPPTR16)\n\t/* NULL pointer is required to encode to zero, so memset is enough. */\n#else\n\tres->data = NULL;\n\tres->funcs = NULL;\n\tres->bytecode = NULL;\n#endif\n\tres->lex_env = NULL;\n\tres->var_env = NULL;\n#endif\n\n\treturn res;\n}\n\nDUK_INTERNAL duk_hnatfunc *duk_hnatfunc_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hnatfunc *res;\n\n\tres = (duk_hnatfunc *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hnatfunc));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->func = NULL;\n#endif\n\n\treturn res;\n}\n\nDUK_INTERNAL duk_hboundfunc *duk_hboundfunc_alloc(duk_heap *heap, duk_uint_t hobject_flags) {\n\tduk_hboundfunc *res;\n\n\tres = (duk_hboundfunc *) DUK_ALLOC(heap, sizeof(duk_hboundfunc));\n\tif (!res) {\n\t\treturn NULL;\n\t}\n\tDUK_MEMZERO(res, sizeof(duk_hboundfunc));\n\n\tduk__init_object_parts(heap, hobject_flags, &res->obj);\n\n\tDUK_TVAL_SET_UNDEFINED(&res->target);\n\tDUK_TVAL_SET_UNDEFINED(&res->this_binding);\n\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->args = NULL;\n#endif\n\n\treturn res;\n}\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_INTERNAL duk_hbufobj *duk_hbufobj_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hbufobj *res;\n\n\tres = (duk_hbufobj *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hbufobj));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->buf = NULL;\n\tres->buf_prop = NULL;\n#endif\n\n\tDUK_ASSERT_HBUFOBJ_VALID(res);\n\treturn res;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/* Allocate a new thread.\n *\n * Leaves the built-ins array uninitialized.  The caller must either\n * initialize a new global context or share existing built-ins from\n * another thread.\n */\nDUK_INTERNAL duk_hthread *duk_hthread_alloc_unchecked(duk_heap *heap, duk_uint_t hobject_flags) {\n\tduk_hthread *res;\n\n\tres = (duk_hthread *) DUK_ALLOC(heap, sizeof(duk_hthread));\n\tif (DUK_UNLIKELY(res == NULL)) {\n\t\treturn NULL;\n\t}\n\tDUK_MEMZERO(res, sizeof(duk_hthread));\n\n\tduk__init_object_parts(heap, hobject_flags, &res->obj);\n\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->ptr_curr_pc = NULL;\n\tres->heap = NULL;\n\tres->valstack = NULL;\n\tres->valstack_end = NULL;\n\tres->valstack_alloc_end = NULL;\n\tres->valstack_bottom = NULL;\n\tres->valstack_top = NULL;\n\tres->callstack_curr = NULL;\n\tres->resumer = NULL;\n\tres->compile_ctx = NULL,\n#if defined(DUK_USE_HEAPPTR16)\n\tres->strs16 = NULL;\n#else\n\tres->strs = NULL;\n#endif\n\t{\n\t\tduk_small_uint_t i;\n\t\tfor (i = 0; i < DUK_NUM_BUILTINS; i++) {\n\t\t\tres->builtins[i] = NULL;\n\t\t}\n\t}\n#endif\n\t/* When nothing is running, API calls are in non-strict mode. */\n\tDUK_ASSERT(res->strict == 0);\n\n\tres->heap = heap;\n\n\t/* XXX: Any reason not to merge duk_hthread_alloc.c here? */\n\treturn res;\n}\n\nDUK_INTERNAL duk_hthread *duk_hthread_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hthread *res;\n\n\tres = duk_hthread_alloc_unchecked(thr->heap, hobject_flags);\n\tif (res == NULL) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\treturn res;\n}\n\nDUK_INTERNAL duk_harray *duk_harray_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_harray *res;\n\n\tres = (duk_harray *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_harray));\n\n\tDUK_ASSERT(res->length == 0);\n\n\treturn res;\n}\n\nDUK_INTERNAL duk_hdecenv *duk_hdecenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hdecenv *res;\n\n\tres = (duk_hdecenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hdecenv));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->thread = NULL;\n\tres->varmap = NULL;\n#endif\n\n\tDUK_ASSERT(res->thread == NULL);\n\tDUK_ASSERT(res->varmap == NULL);\n\tDUK_ASSERT(res->regbase_byteoff == 0);\n\n\treturn res;\n}\n\nDUK_INTERNAL duk_hobjenv *duk_hobjenv_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hobjenv *res;\n\n\tres = (duk_hobjenv *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hobjenv));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tres->target = NULL;\n#endif\n\n\tDUK_ASSERT(res->target == NULL);\n\n\treturn res;\n}\n\nDUK_INTERNAL duk_hproxy *duk_hproxy_alloc(duk_hthread *thr, duk_uint_t hobject_flags) {\n\tduk_hproxy *res;\n\n\tres = (duk_hproxy *) duk__hobject_alloc_init(thr, hobject_flags, sizeof(duk_hproxy));\n\n\t/* Leave ->target and ->handler uninitialized, as caller will always\n\t * explicitly initialize them before any side effects are possible.\n\t */\n\n\treturn res;\n}\n#line 1 \"duk_hobject_enum.c\"\n/*\n *  Object enumeration support.\n *\n *  Creates an internal enumeration state object to be used e.g. with for-in\n *  enumeration.  The state object contains a snapshot of target object keys\n *  and internal control state for enumeration.  Enumerator flags allow caller\n *  to e.g. request internal/non-enumerable properties, and to enumerate only\n *  \"own\" properties.\n *\n *  Also creates the result value for e.g. Object.keys() based on the same\n *  internal structure.\n *\n *  This snapshot-based enumeration approach is used to simplify enumeration:\n *  non-snapshot-based approaches are difficult to reconcile with mutating\n *  the enumeration target, running multiple long-lived enumerators at the\n *  same time, garbage collection details, etc.  The downside is that the\n *  enumerator object is memory inefficient especially for iterating arrays.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* XXX: identify enumeration target with an object index (not top of stack) */\n\n/* First enumerated key index in enumerator object, must match exactly the\n * number of control properties inserted to the enumerator.\n */\n#define DUK__ENUM_START_INDEX  2\n\n/* Current implementation suffices for ES2015 for now because there's no symbol\n * sorting, so commented out for now.\n */\n\n/*\n *  Helper to sort enumeration keys using a callback for pairwise duk_hstring\n *  comparisons.  The keys are in the enumeration object entry part, starting\n *  from DUK__ENUM_START_INDEX, and the entry part is dense.  Entry part values\n *  are all \"true\", e.g. \"1\" -> true, \"3\" -> true, \"foo\" -> true, \"2\" -> true,\n *  so it suffices to just switch keys without switching values.\n *\n *  ES2015 [[OwnPropertyKeys]] enumeration order for ordinary objects:\n *  (1) array indices in ascending order,\n *  (2) non-array-index keys in insertion order, and\n *  (3) symbols in insertion order.\n *  http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-ownpropertykeys.\n *\n *  This rule is applied to \"own properties\" at each inheritance level;\n *  non-duplicate parent keys always follow child keys.  For example,\n *  an inherited array index will enumerate -after- a symbol in the\n *  child.\n *\n *  Insertion sort is used because (1) it's simple and compact, (2) works\n *  in-place, (3) minimizes operations if data is already nearly sorted,\n *  (4) doesn't reorder elements considered equal.\n *  http://en.wikipedia.org/wiki/Insertion_sort\n */\n\n/* Sort key, must hold array indices, \"not array index\" marker, and one more\n * higher value for symbols.\n */\n#if !defined(DUK_USE_SYMBOL_BUILTIN)\ntypedef duk_uint32_t duk__sort_key_t;\n#elif defined(DUK_USE_64BIT_OPS)\ntypedef duk_uint64_t duk__sort_key_t;\n#else\ntypedef duk_double_t duk__sort_key_t;\n#endif\n\n/* Get sort key for a duk_hstring. */\nDUK_LOCAL duk__sort_key_t duk__hstring_sort_key(duk_hstring *x) {\n\tduk__sort_key_t val;\n\n\t/* For array indices [0,0xfffffffe] use the array index as is.\n\t * For strings, use 0xffffffff, the marker 'arridx' already in\n\t * duk_hstring.  For symbols, any value above 0xffffffff works,\n\t * as long as it is the same for all symbols; currently just add\n\t * the masked flag field into the arridx temporary.\n\t */\n\tDUK_ASSERT(x != NULL);\n\tDUK_ASSERT(!DUK_HSTRING_HAS_SYMBOL(x) || DUK_HSTRING_GET_ARRIDX_FAST(x) == DUK_HSTRING_NO_ARRAY_INDEX);\n\n\tval = (duk__sort_key_t) DUK_HSTRING_GET_ARRIDX_FAST(x);\n\n#if defined(DUK_USE_SYMBOL_BUILTIN)\n\tval = val + (duk__sort_key_t) (DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) x) & DUK_HSTRING_FLAG_SYMBOL);\n#endif\n\n\treturn (duk__sort_key_t) val;\n}\n\n/* Insert element 'b' after element 'a'? */\nDUK_LOCAL duk_bool_t duk__sort_compare_es6(duk_hstring *a, duk_hstring *b, duk__sort_key_t val_b) {\n\tduk__sort_key_t val_a;\n\n\tDUK_ASSERT(a != NULL);\n\tDUK_ASSERT(b != NULL);\n\tDUK_UNREF(b);  /* Not actually needed now, val_b suffices. */\n\n\tval_a = duk__hstring_sort_key(a);\n\n\tif (val_a > val_b) {\n\t\treturn 0;\n\t} else {\n\t\treturn 1;\n\t}\n}\n\nDUK_LOCAL void duk__sort_enum_keys_es6(duk_hthread *thr, duk_hobject *h_obj, duk_int_fast32_t idx_start, duk_int_fast32_t idx_end) {\n\tduk_hstring **keys;\n\tduk_int_fast32_t idx;\n\n\tDUK_ASSERT(h_obj != NULL);\n\tDUK_ASSERT(idx_start >= DUK__ENUM_START_INDEX);\n\tDUK_ASSERT(idx_end >= idx_start);\n\tDUK_UNREF(thr);\n\n\tif (idx_end <= idx_start + 1) {\n\t\treturn;  /* Zero or one element(s). */\n\t}\n\n\tkeys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, h_obj);\n\n\tfor (idx = idx_start + 1; idx < idx_end; idx++) {\n\t\tduk_hstring *h_curr;\n\t\tduk_int_fast32_t idx_insert;\n\t\tduk__sort_key_t val_curr;\n\n\t\th_curr = keys[idx];\n\t\tDUK_ASSERT(h_curr != NULL);\n\n\t\t/* Scan backwards for insertion place.  This works very well\n\t\t * when the elements are nearly in order which is the common\n\t\t * (and optimized for) case.\n\t\t */\n\n\t\tval_curr = duk__hstring_sort_key(h_curr);  /* Remains same during scanning. */\n\t\tfor (idx_insert = idx - 1; idx_insert >= idx_start; idx_insert--) {\n\t\t\tduk_hstring *h_insert;\n\t\t\th_insert = keys[idx_insert];\n\t\t\tDUK_ASSERT(h_insert != NULL);\n\n\t\t\tif (duk__sort_compare_es6(h_insert, h_curr, val_curr)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t/* If we're out of indices, idx_insert == idx_start - 1 and idx_insert++\n\t\t * brings us back to idx_start.\n\t\t */\n\t\tidx_insert++;\n\t\tDUK_ASSERT(idx_insert >= 0 && idx_insert <= idx);\n\n\t\t/*        .-- p_insert   .-- p_curr\n\t\t *        v              v\n\t\t *  | ... | insert | ... | curr\n\t\t */\n\n\t\t/* This could also done when the keys are in order, i.e.\n\t\t * idx_insert == idx.  The result would be an unnecessary\n\t\t * memmove() but we use an explicit check because the keys\n\t\t * are very often in order already.\n\t\t */\n\t\tif (idx != idx_insert) {\n\t\t\tDUK_MEMMOVE((void *) (keys + idx_insert + 1),\n\t\t\t            (const void *) (keys + idx_insert),\n\t\t\t            ((size_t) (idx - idx_insert) * sizeof(duk_hstring *)));\n\t\t\tkeys[idx_insert] = h_curr;\n\t\t}\n\t}\n}\n\n/*\n *  Create an internal enumerator object E, which has its keys ordered\n *  to match desired enumeration ordering.  Also initialize internal control\n *  properties for enumeration.\n *\n *  Note: if an array was used to hold enumeration keys instead, an array\n *  scan would be needed to eliminate duplicates found in the prototype chain.\n */\n\nDUK_LOCAL void duk__add_enum_key(duk_hthread *thr, duk_hstring *k) {\n\t/* 'k' may be unreachable on entry so must push without any\n\t * potential for GC.\n\t */\n\tduk_push_hstring(thr, k);\n\tduk_push_true(thr);\n\tduk_put_prop(thr, -3);\n}\n\nDUK_LOCAL void duk__add_enum_key_stridx(duk_hthread *thr, duk_small_uint_t stridx) {\n\tduk__add_enum_key(thr, DUK_HTHREAD_GET_STRING(thr, stridx));\n}\n\nDUK_INTERNAL void duk_hobject_enumerator_create(duk_hthread *thr, duk_small_uint_t enum_flags) {\n\tduk_hobject *enum_target;\n\tduk_hobject *curr;\n\tduk_hobject *res;\n#if defined(DUK_USE_ES6_PROXY)\n\tduk_hobject *h_proxy_target;\n\tduk_hobject *h_proxy_handler;\n\tduk_hobject *h_trap_result;\n#endif\n\tduk_uint_fast32_t i, len;  /* used for array, stack, and entry indices */\n\tduk_uint_fast32_t sort_start_index;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tenum_target = duk_require_hobject(thr, -1);\n\tDUK_ASSERT(enum_target != NULL);\n\n\tduk_push_bare_object(thr);\n\tres = duk_known_hobject(thr, -1);\n\n\t/* [enum_target res] */\n\n\t/* Target must be stored so that we can recheck whether or not\n\t * keys still exist when we enumerate.  This is not done if the\n\t * enumeration result comes from a proxy trap as there is no\n\t * real object to check against.\n\t */\n\tduk_push_hobject(thr, enum_target);\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_TARGET);\n\n\t/* Initialize index so that we skip internal control keys. */\n\tduk_push_int(thr, DUK__ENUM_START_INDEX);\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT);\n\n\t/*\n\t *  Proxy object handling\n\t */\n\n#if defined(DUK_USE_ES6_PROXY)\n\tif (DUK_LIKELY((enum_flags & DUK_ENUM_NO_PROXY_BEHAVIOR) != 0)) {\n\t\tgoto skip_proxy;\n\t}\n\tif (DUK_LIKELY(!duk_hobject_proxy_check(enum_target,\n\t                                        &h_proxy_target,\n\t                                        &h_proxy_handler))) {\n\t\tgoto skip_proxy;\n\t}\n\n\t/* XXX: share code with Object.keys() Proxy handling */\n\n\t/* In ES2015 for-in invoked the \"enumerate\" trap; in ES2016 \"enumerate\"\n\t * has been obsoleted and \"ownKeys\" is used instead.\n\t */\n\tDUK_DDD(DUK_DDDPRINT(\"proxy enumeration\"));\n\tduk_push_hobject(thr, h_proxy_handler);\n\tif (!duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_OWN_KEYS)) {\n\t\t/* No need to replace the 'enum_target' value in stack, only the\n\t\t * enum_target reference.  This also ensures that the original\n\t\t * enum target is reachable, which keeps the proxy and the proxy\n\t\t * target reachable.  We do need to replace the internal _Target.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"no ownKeys trap, enumerate proxy target instead\"));\n\t\tDUK_DDD(DUK_DDDPRINT(\"h_proxy_target=%!O\", (duk_heaphdr *) h_proxy_target));\n\t\tenum_target = h_proxy_target;\n\n\t\tduk_push_hobject(thr, enum_target);  /* -> [ ... enum_target res handler undefined target ] */\n\t\tduk_put_prop_stridx_short(thr, -4, DUK_STRIDX_INT_TARGET);\n\n\t\tduk_pop_2(thr);  /* -> [ ... enum_target res ] */\n\t\tgoto skip_proxy;\n\t}\n\n\t/* [ ... enum_target res handler trap ] */\n\tduk_insert(thr, -2);\n\tduk_push_hobject(thr, h_proxy_target);    /* -> [ ... enum_target res trap handler target ] */\n\tduk_call_method(thr, 1 /*nargs*/);        /* -> [ ... enum_target res trap_result ] */\n\th_trap_result = duk_require_hobject(thr, -1);\n\tDUK_UNREF(h_trap_result);\n\n\tduk_proxy_ownkeys_postprocess(thr, h_proxy_target, enum_flags);\n\t/* -> [ ... enum_target res trap_result keys_array ] */\n\n\t/* Copy cleaned up trap result keys into the enumerator object. */\n\t/* XXX: result is a dense array; could make use of that. */\n\tDUK_ASSERT(duk_is_array(thr, -1));\n\tlen = (duk_uint_fast32_t) duk_get_length(thr, -1);\n\tfor (i = 0; i < len; i++) {\n\t\t(void) duk_get_prop_index(thr, -1, (duk_uarridx_t) i);\n\t\tDUK_ASSERT(duk_is_string(thr, -1));  /* postprocess cleaned up */\n\t\t/* [ ... enum_target res trap_result keys_array val ] */\n\t\tduk_push_true(thr);\n\t\t/* [ ... enum_target res trap_result keys_array val true ] */\n\t\tduk_put_prop(thr, -5);\n\t}\n\t/* [ ... enum_target res trap_result keys_array ] */\n\tduk_pop_2(thr);\n\tduk_remove_m2(thr);\n\n\t/* [ ... res ] */\n\n\t/* The internal _Target property is kept pointing to the original\n\t * enumeration target (the proxy object), so that the enumerator\n\t * 'next' operation can read property values if so requested.  The\n\t * fact that the _Target is a proxy disables key existence check\n\t * during enumeration.\n\t */\n\tDUK_DDD(DUK_DDDPRINT(\"proxy enumeration, final res: %!O\", (duk_heaphdr *) res));\n\tgoto compact_and_return;\n\n skip_proxy:\n#endif  /* DUK_USE_ES6_PROXY */\n\n\tcurr = enum_target;\n\tsort_start_index = DUK__ENUM_START_INDEX;\n\tDUK_ASSERT(DUK_HOBJECT_GET_ENEXT(res) == DUK__ENUM_START_INDEX);\n\twhile (curr) {\n\t\tduk_uint_fast32_t sort_end_index;\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\tduk_bool_t need_sort = 0;\n#endif\n\n\t\t/* Enumeration proceeds by inheritance level.  Virtual\n\t\t * properties need to be handled specially, followed by\n\t\t * array part, and finally entry part.\n\t\t *\n\t\t * If there are array index keys in the entry part or any\n\t\t * other risk of the ES2015 [[OwnPropertyKeys]] order being\n\t\t * violated, need_sort is set and an explicit ES2015 sort is\n\t\t * done for the inheritance level.\n\t\t */\n\n\t\t/* XXX: inheriting from proxy */\n\n\t\t/*\n\t\t *  Virtual properties.\n\t\t *\n\t\t *  String and buffer indices are virtual and always enumerable,\n\t\t *  'length' is virtual and non-enumerable.  Array and arguments\n\t\t *  object props have special behavior but are concrete.\n\t\t *\n\t\t *  String and buffer objects don't have an array part so as long\n\t\t *  as virtual array index keys are enumerated first, we don't\n\t\t *  need to set need_sort.\n\t\t */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr) || DUK_HOBJECT_IS_BUFOBJ(curr)) {\n#else\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) {\n#endif\n\t\t\tduk_bool_t have_length = 1;\n\n\t\t\t/* String and buffer enumeration behavior is identical now,\n\t\t\t * so use shared handler.\n\t\t\t */\n\t\t\tif (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(curr)) {\n\t\t\t\tduk_hstring *h_val;\n\t\t\t\th_val = duk_hobject_get_internal_value_string(thr->heap, curr);\n\t\t\t\tDUK_ASSERT(h_val != NULL);  /* string objects must not created without internal value */\n\t\t\t\tlen = (duk_uint_fast32_t) DUK_HSTRING_GET_CHARLEN(h_val);\n\t\t\t}\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\t\telse {\n\t\t\t\tduk_hbufobj *h_bufobj;\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_IS_BUFOBJ(curr));\n\t\t\t\th_bufobj = (duk_hbufobj *) curr;\n\n\t\t\t\tif (h_bufobj == NULL || !h_bufobj->is_typedarray) {\n\t\t\t\t\t/* Zero length seems like a good behavior for neutered buffers.\n\t\t\t\t\t * ArrayBuffer (non-view) and DataView don't have index properties\n\t\t\t\t\t * or .length property.\n\t\t\t\t\t */\n\t\t\t\t\tlen = 0;\n\t\t\t\t\thave_length = 0;\n\t\t\t\t} else {\n\t\t\t\t\t/* There's intentionally no check for\n\t\t\t\t\t * current underlying buffer length.\n\t\t\t\t\t */\n\t\t\t\t\tlen = (duk_uint_fast32_t) (h_bufobj->length >> h_bufobj->shift);\n\t\t\t\t}\n\t\t\t}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tduk_hstring *k;\n\n\t\t\t\t/* This is a bit fragile: the string is not\n\t\t\t\t * reachable until it is pushed by the helper.\n\t\t\t\t */\n\t\t\t\tk = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i);\n\t\t\t\tDUK_ASSERT(k);\n\n\t\t\t\tduk__add_enum_key(thr, k);\n\n\t\t\t\t/* [enum_target res] */\n\t\t\t}\n\n\t\t\t/* 'length' and other virtual properties are not\n\t\t\t * enumerable, but are included if non-enumerable\n\t\t\t * properties are requested.\n\t\t\t */\n\n\t\t\tif (have_length && (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE)) {\n\t\t\t\tduk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH);\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t *  Array part\n\t\t */\n\n\t\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(curr); i++) {\n\t\t\tduk_hstring *k;\n\t\t\tduk_tval *tv;\n\n\t\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, curr, i);\n\t\t\tif (DUK_TVAL_IS_UNUSED(tv)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tk = duk_heap_strtable_intern_u32_checked(thr, (duk_uint32_t) i);  /* Fragile reachability. */\n\t\t\tDUK_ASSERT(k);\n\n\t\t\tduk__add_enum_key(thr, k);\n\n\t\t\t/* [enum_target res] */\n\t\t}\n\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_ARRAY(curr)) {\n\t\t\t/* Array .length comes after numeric indices. */\n\t\t\tif (enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) {\n\t\t\t\tduk__add_enum_key_stridx(thr, DUK_STRIDX_LENGTH);\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t *  Entries part\n\t\t */\n\n\t\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(curr); i++) {\n\t\t\tduk_hstring *k;\n\n\t\t\tk = DUK_HOBJECT_E_GET_KEY(thr->heap, curr, i);\n\t\t\tif (!k) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!(enum_flags & DUK_ENUM_INCLUDE_NONENUMERABLE) &&\n\t\t\t    !DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(thr->heap, curr, i)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(k))) {\n\t\t\t\tif (!(enum_flags & DUK_ENUM_INCLUDE_HIDDEN) &&\n\t\t\t\t    DUK_HSTRING_HAS_HIDDEN(k)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (!(enum_flags & DUK_ENUM_INCLUDE_SYMBOLS)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\t\t\tneed_sort = 1;\n#endif\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(!DUK_HSTRING_HAS_HIDDEN(k));  /* would also have symbol flag */\n\t\t\t\tif (enum_flags & DUK_ENUM_EXCLUDE_STRINGS) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (DUK_HSTRING_HAS_ARRIDX(k)) {\n\t\t\t\t/* This in currently only possible if the\n\t\t\t\t * object has no array part: the array part\n\t\t\t\t * is exhaustive when it is present.\n\t\t\t\t */\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\t\t\tneed_sort = 1;\n#endif\n\t\t\t} else {\n\t\t\t\tif (enum_flags & DUK_ENUM_ARRAY_INDICES_ONLY) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, curr, i) ||\n\t\t\t           !DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE_PTR(thr->heap, curr, i)->v));\n\n\t\t\tduk__add_enum_key(thr, k);\n\n\t\t\t/* [enum_target res] */\n\t\t}\n\n\t\t/* Sort enumerated keys according to ES2015 requirements for\n\t\t * the \"inheritance level\" just processed.  This is far from\n\t\t * optimal, ES2015 semantics could be achieved more efficiently\n\t\t * by handling array index string keys (and symbol keys)\n\t\t * specially above in effect doing the sort inline.\n\t\t *\n\t\t * Skip the sort if array index sorting is requested because\n\t\t * we must consider all keys, also inherited, so an explicit\n\t\t * sort is done for the whole result after we're done with the\n\t\t * prototype chain.\n\t\t *\n\t\t * Also skip the sort if need_sort == 0, i.e. we know for\n\t\t * certain that the enumerated order is already correct.\n\t\t */\n\t\tsort_end_index = DUK_HOBJECT_GET_ENEXT(res);\n\n\t\tif (!(enum_flags & DUK_ENUM_SORT_ARRAY_INDICES)) {\n#if defined(DUK_USE_PREFER_SIZE)\n\t\t\tduk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index);\n#else\n\t\t\tif (need_sort) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"need to sort\"));\n\t\t\t\tduk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) sort_start_index, (duk_int_fast32_t) sort_end_index);\n\t\t\t} else {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"no need to sort\"));\n\t\t\t}\n#endif\n\t\t}\n\n\t\tsort_start_index = sort_end_index;\n\n\t\tif (enum_flags & DUK_ENUM_OWN_PROPERTIES_ONLY) {\n\t\t\tbreak;\n\t\t}\n\n\t\tcurr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);\n\t}\n\n\t/* [enum_target res] */\n\n\tduk_remove_m2(thr);\n\n\t/* [res] */\n\n\tif (enum_flags & DUK_ENUM_SORT_ARRAY_INDICES) {\n\t\t/* Some E5/E5.1 algorithms require that array indices are iterated\n\t\t * in a strictly ascending order.  This is the case for e.g.\n\t\t * Array.prototype.forEach() and JSON.stringify() PropertyList\n\t\t * handling.  The caller can request an explicit sort in these\n\t\t * cases.\n\t\t */\n\n\t\t/* Sort to ES2015 order which works for pure array incides but\n\t\t * also for mixed keys.\n\t\t */\n\t\tduk__sort_enum_keys_es6(thr, res, (duk_int_fast32_t) DUK__ENUM_START_INDEX, (duk_int_fast32_t) DUK_HOBJECT_GET_ENEXT(res));\n\t}\n\n#if defined(DUK_USE_ES6_PROXY)\n compact_and_return:\n#endif\n\t/* compact; no need to seal because object is internal */\n\tduk_hobject_compact_props(thr, res);\n\n\tDUK_DDD(DUK_DDDPRINT(\"created enumerator object: %!iT\", (duk_tval *) duk_get_tval(thr, -1)));\n}\n\n/*\n *  Returns non-zero if a key and/or value was enumerated, and:\n *\n *   [enum] -> [key]        (get_value == 0)\n *   [enum] -> [key value]  (get_value == 1)\n *\n *  Returns zero without pushing anything on the stack otherwise.\n */\nDUK_INTERNAL duk_bool_t duk_hobject_enumerator_next(duk_hthread *thr, duk_bool_t get_value) {\n\tduk_hobject *e;\n\tduk_hobject *enum_target;\n\tduk_hstring *res = NULL;\n\tduk_uint_fast32_t idx;\n\tduk_bool_t check_existence;\n\n\tDUK_ASSERT(thr != NULL);\n\n\t/* [... enum] */\n\n\te = duk_require_hobject(thr, -1);\n\n\t/* XXX use get tval ptr, more efficient */\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_NEXT);\n\tidx = (duk_uint_fast32_t) duk_require_uint(thr, -1);\n\tduk_pop(thr);\n\tDUK_DDD(DUK_DDDPRINT(\"enumeration: index is: %ld\", (long) idx));\n\n\t/* Enumeration keys are checked against the enumeration target (to see\n\t * that they still exist).  In the proxy enumeration case _Target will\n\t * be the proxy, and checking key existence against the proxy is not\n\t * required (or sensible, as the keys may be fully virtual).\n\t */\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_TARGET);\n\tenum_target = duk_require_hobject(thr, -1);\n\tDUK_ASSERT(enum_target != NULL);\n#if defined(DUK_USE_ES6_PROXY)\n\tcheck_existence = (!DUK_HOBJECT_IS_PROXY(enum_target));\n#else\n\tcheck_existence = 1;\n#endif\n\tduk_pop(thr);  /* still reachable */\n\n\tDUK_DDD(DUK_DDDPRINT(\"getting next enum value, enum_target=%!iO, enumerator=%!iT\",\n\t                     (duk_heaphdr *) enum_target, (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/* no array part */\n\tfor (;;) {\n\t\tduk_hstring *k;\n\n\t\tif (idx >= DUK_HOBJECT_GET_ENEXT(e)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"enumeration: ran out of elements\"));\n\t\t\tbreak;\n\t\t}\n\n\t\t/* we know these because enum objects are internally created */\n\t\tk = DUK_HOBJECT_E_GET_KEY(thr->heap, e, idx);\n\t\tDUK_ASSERT(k != NULL);\n\t\tDUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, e, idx));\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(&DUK_HOBJECT_E_GET_VALUE(thr->heap, e, idx).v));\n\n\t\tidx++;\n\n\t\t/* recheck that the property still exists */\n\t\tif (check_existence && !duk_hobject_hasprop_raw(thr, enum_target, k)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"property deleted during enumeration, skip\"));\n\t\t\tcontinue;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"enumeration: found element, key: %!O\", (duk_heaphdr *) k));\n\t\tres = k;\n\t\tbreak;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"enumeration: updating next index to %ld\", (long) idx));\n\n\tduk_push_u32(thr, (duk_uint32_t) idx);\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_INT_NEXT);\n\n\t/* [... enum] */\n\n\tif (res) {\n\t\tduk_push_hstring(thr, res);\n\t\tif (get_value) {\n\t\t\tduk_push_hobject(thr, enum_target);\n\t\t\tduk_dup_m2(thr);       /* -> [... enum key enum_target key] */\n\t\t\tduk_get_prop(thr, -2); /* -> [... enum key enum_target val] */\n\t\t\tduk_remove_m2(thr);    /* -> [... enum key val] */\n\t\t\tduk_remove(thr, -3);   /* -> [... key val] */\n\t\t} else {\n\t\t\tduk_remove_m2(thr);    /* -> [... key] */\n\t\t}\n\t\treturn 1;\n\t} else {\n\t\tduk_pop(thr);  /* -> [...] */\n\t\treturn 0;\n\t}\n}\n\n/*\n *  Get enumerated keys in an Ecmascript array.  Matches Object.keys() behavior\n *  described in E5 Section 15.2.3.14.\n */\n\nDUK_INTERNAL duk_ret_t duk_hobject_get_enumerated_keys(duk_hthread *thr, duk_small_uint_t enum_flags) {\n\tduk_hobject *e;\n\tduk_hstring **keys;\n\tduk_tval *tv;\n\tduk_uint_fast32_t count;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(duk_get_hobject(thr, -1) != NULL);\n\n\t/* Create a temporary enumerator to get the (non-duplicated) key list;\n\t * the enumerator state is initialized without being needed, but that\n\t * has little impact.\n\t */\n\n\tduk_hobject_enumerator_create(thr, enum_flags);\n\te = duk_known_hobject(thr, -1);\n\n\t/* [enum_target enum res] */\n\n\t/* Create dense result array to exact size. */\n\tDUK_ASSERT(DUK_HOBJECT_GET_ENEXT(e) >= DUK__ENUM_START_INDEX);\n\tcount = (duk_uint32_t) (DUK_HOBJECT_GET_ENEXT(e) - DUK__ENUM_START_INDEX);\n\n\t/* XXX: uninit would be OK */\n\ttv = duk_push_harray_with_size_outptr(thr, (duk_uint32_t) count);\n\tDUK_ASSERT(count == 0 || tv != NULL);\n\n\t/* Fill result array, no side effects. */\n\n\tkeys = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, e);\n\tkeys += DUK__ENUM_START_INDEX;\n\n\twhile (count-- > 0) {\n\t\tduk_hstring *k;\n\n\t\tk = *keys++;\n\t\tDUK_ASSERT(k != NULL);  /* enumerator must have no keys deleted */\n\n\t\tDUK_TVAL_SET_STRING(tv, k);\n\t\ttv++;\n\t\tDUK_HSTRING_INCREF(thr, k);\n\t}\n\n\t/* [enum_target enum res] */\n\tduk_remove_m2(thr);\n\n\t/* [enum_target res] */\n\n\treturn 1;  /* return 1 to allow callers to tail call */\n}\n\n/* automatic undefs */\n#undef DUK__ENUM_START_INDEX\n#line 1 \"duk_hobject_misc.c\"\n/*\n *  Misc support functions\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_INTERNAL duk_bool_t duk_hobject_prototype_chain_contains(duk_hthread *thr, duk_hobject *h, duk_hobject *p, duk_bool_t ignore_loop) {\n\tduk_uint_t sanity;\n\n\tDUK_ASSERT(thr != NULL);\n\n\t/* False if the object is NULL or the prototype 'p' is NULL.\n\t * In particular, false if both are NULL (don't compare equal).\n\t */\n\tif (h == NULL || p == NULL) {\n\t\treturn 0;\n\t}\n\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\tdo {\n\t\tif (h == p) {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (sanity-- == 0) {\n\t\t\tif (ignore_loop) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);\n\t\t\t}\n\t\t}\n\t\th = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);\n\t} while (h);\n\n\treturn 0;\n}\n\nDUK_INTERNAL void duk_hobject_set_prototype_updref(duk_hthread *thr, duk_hobject *h, duk_hobject *p) {\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk_hobject *tmp;\n\n\tDUK_ASSERT(h);\n\ttmp = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h);\n\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p);\n\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, p);  /* avoid problems if p == h->prototype */\n\tDUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);\n#else\n\tDUK_ASSERT(h);\n\tDUK_UNREF(thr);\n\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, h, p);\n#endif\n}\n#line 1 \"duk_hobject_pc2line.c\"\n/*\n *  Helpers for creating and querying pc2line debug data, which\n *  converts a bytecode program counter to a source line number.\n *\n *  The run-time pc2line data is bit-packed, and documented in:\n *\n *    doc/function-objects.rst\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_PC2LINE)\n\n/* Generate pc2line data for an instruction sequence, leaving a buffer on stack top. */\nDUK_INTERNAL void duk_hobject_pc2line_pack(duk_hthread *thr, duk_compiler_instr *instrs, duk_uint_fast32_t length) {\n\tduk_hbuffer_dynamic *h_buf;\n\tduk_bitencoder_ctx be_ctx_alloc;\n\tduk_bitencoder_ctx *be_ctx = &be_ctx_alloc;\n\tduk_uint32_t *hdr;\n\tduk_size_t new_size;\n\tduk_uint_fast32_t num_header_entries;\n\tduk_uint_fast32_t curr_offset;\n\tduk_int_fast32_t curr_line, next_line, diff_line;\n\tduk_uint_fast32_t curr_pc;\n\tduk_uint_fast32_t hdr_index;\n\n\tDUK_ASSERT(length <= DUK_COMPILER_MAX_BYTECODE_LENGTH);\n\n\tnum_header_entries = (length + DUK_PC2LINE_SKIP - 1) / DUK_PC2LINE_SKIP;\n\tcurr_offset = (duk_uint_fast32_t) (sizeof(duk_uint32_t) + num_header_entries * sizeof(duk_uint32_t) * 2);\n\n\tduk_push_dynamic_buffer(thr, (duk_size_t) curr_offset);\n\th_buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1);\n\tDUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h_buf) && !DUK_HBUFFER_HAS_EXTERNAL(h_buf));\n\n\thdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf);\n\tDUK_ASSERT(hdr != NULL);\n\thdr[0] = (duk_uint32_t) length;  /* valid pc range is [0, length[ */\n\n\tcurr_pc = 0U;\n\twhile (curr_pc < length) {\n\t\tnew_size = (duk_size_t) (curr_offset + DUK_PC2LINE_MAX_DIFF_LENGTH);\n\t\tduk_hbuffer_resize(thr, h_buf, new_size);\n\n\t\thdr = (duk_uint32_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h_buf);\n\t\tDUK_ASSERT(hdr != NULL);\n\t\tDUK_ASSERT(curr_pc < length);\n\t\thdr_index = 1 + (curr_pc / DUK_PC2LINE_SKIP) * 2;\n\t\tcurr_line = (duk_int_fast32_t) instrs[curr_pc].line;\n\t\thdr[hdr_index + 0] = (duk_uint32_t) curr_line;\n\t\thdr[hdr_index + 1] = (duk_uint32_t) curr_offset;\n\n#if 0\n\t\tDUK_DDD(DUK_DDDPRINT(\"hdr[%ld]: pc=%ld line=%ld offset=%ld\",\n\t\t                     (long) (curr_pc / DUK_PC2LINE_SKIP),\n\t\t                     (long) curr_pc,\n\t\t                     (long) hdr[hdr_index + 0],\n\t\t                     (long) hdr[hdr_index + 1]));\n#endif\n\n\t\tDUK_MEMZERO(be_ctx, sizeof(*be_ctx));\n\t\tbe_ctx->data = ((duk_uint8_t *) hdr) + curr_offset;\n\t\tbe_ctx->length = (duk_size_t) DUK_PC2LINE_MAX_DIFF_LENGTH;\n\n\t\tfor (;;) {\n\t\t\tcurr_pc++;\n\t\t\tif ( ((curr_pc % DUK_PC2LINE_SKIP) == 0) ||  /* end of diff run */\n\t\t\t     (curr_pc >= length) ) {                 /* end of bytecode */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDUK_ASSERT(curr_pc < length);\n\t\t\tnext_line = (duk_int32_t) instrs[curr_pc].line;\n\t\t\tdiff_line = next_line - curr_line;\n\n#if 0\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"curr_line=%ld, next_line=%ld -> diff_line=%ld\",\n\t\t\t                     (long) curr_line, (long) next_line, (long) diff_line));\n#endif\n\n\t\t\tif (diff_line == 0) {\n\t\t\t\t/* 0 */\n\t\t\t\tduk_be_encode(be_ctx, 0, 1);\n\t\t\t} else if (diff_line >= 1 && diff_line <= 4) {\n\t\t\t\t/* 1 0 <2 bits> */\n\t\t\t\tduk_be_encode(be_ctx, (duk_uint32_t) ((0x02 << 2) + (diff_line - 1)), 4);\n\t\t\t} else if (diff_line >= -0x80 && diff_line <= 0x7f) {\n\t\t\t\t/* 1 1 0 <8 bits> */\n\t\t\t\tDUK_ASSERT(diff_line + 0x80 >= 0 && diff_line + 0x80 <= 0xff);\n\t\t\t\tduk_be_encode(be_ctx, (duk_uint32_t) ((0x06 << 8) + (diff_line + 0x80)), 11);\n\t\t\t} else {\n\t\t\t\t/* 1 1 1 <32 bits>\n\t\t\t\t * Encode in two parts to avoid bitencode 24-bit limitation\n\t\t\t\t */\n\t\t\t\tduk_be_encode(be_ctx, (duk_uint32_t) ((0x07 << 16) + ((next_line >> 16) & 0xffff)), 19);\n\t\t\t\tduk_be_encode(be_ctx, (duk_uint32_t) (next_line & 0xffff), 16);\n\t\t\t}\n\n\t\t\tcurr_line = next_line;\n\t\t}\n\n\t\tduk_be_finish(be_ctx);\n\t\tDUK_ASSERT(!be_ctx->truncated);\n\n\t\t/* be_ctx->offset == length of encoded bitstream */\n\t\tcurr_offset += (duk_uint_fast32_t) be_ctx->offset;\n\t}\n\n\t/* compact */\n\tnew_size = (duk_size_t) curr_offset;\n\tduk_hbuffer_resize(thr, h_buf, new_size);\n\n\t(void) duk_to_fixed_buffer(thr, -1, NULL);\n\n\tDUK_DDD(DUK_DDDPRINT(\"final pc2line data: pc_limit=%ld, length=%ld, %lf bits/opcode --> %!ixT\",\n\t                     (long) length, (long) new_size, (double) new_size * 8.0 / (double) length,\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n}\n\n/* PC is unsigned.  If caller does PC arithmetic and gets a negative result,\n * it will map to a large PC which is out of bounds and causes a zero to be\n * returned.\n */\nDUK_LOCAL duk_uint_fast32_t duk__hobject_pc2line_query_raw(duk_hthread *thr, duk_hbuffer_fixed *buf, duk_uint_fast32_t pc) {\n\tduk_bitdecoder_ctx bd_ctx_alloc;\n\tduk_bitdecoder_ctx *bd_ctx = &bd_ctx_alloc;\n\tduk_uint32_t *hdr;\n\tduk_uint_fast32_t start_offset;\n\tduk_uint_fast32_t pc_limit;\n\tduk_uint_fast32_t hdr_index;\n\tduk_uint_fast32_t pc_base;\n\tduk_uint_fast32_t n;\n\tduk_uint_fast32_t curr_line;\n\n\tDUK_ASSERT(buf != NULL);\n\tDUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) buf) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) buf));\n\tDUK_UNREF(thr);\n\n\t/*\n\t *  Use the index in the header to find the right starting point\n\t */\n\n\thdr_index = pc / DUK_PC2LINE_SKIP;\n\tpc_base = hdr_index * DUK_PC2LINE_SKIP;\n\tn = pc - pc_base;\n\n\tif (DUK_HBUFFER_FIXED_GET_SIZE(buf) <= sizeof(duk_uint32_t)) {\n\t\tDUK_DD(DUK_DDPRINT(\"pc2line lookup failed: buffer is smaller than minimal header\"));\n\t\tgoto pc2line_error;\n\t}\n\n\thdr = (duk_uint32_t *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, buf);\n\tpc_limit = hdr[0];\n\tif (pc >= pc_limit) {\n\t\t/* Note: pc is unsigned and cannot be negative */\n\t\tDUK_DD(DUK_DDPRINT(\"pc2line lookup failed: pc out of bounds (pc=%ld, limit=%ld)\",\n\t\t                   (long) pc, (long) pc_limit));\n\t\tgoto pc2line_error;\n\t}\n\n\tcurr_line = hdr[1 + hdr_index * 2];\n\tstart_offset = hdr[1 + hdr_index * 2 + 1];\n\tif ((duk_size_t) start_offset > DUK_HBUFFER_FIXED_GET_SIZE(buf)) {\n\t\tDUK_DD(DUK_DDPRINT(\"pc2line lookup failed: start_offset out of bounds (start_offset=%ld, buffer_size=%ld)\",\n\t\t                   (long) start_offset, (long) DUK_HBUFFER_GET_SIZE((duk_hbuffer *) buf)));\n\t\tgoto pc2line_error;\n\t}\n\n\t/*\n\t *  Iterate the bitstream (line diffs) until PC is reached\n\t */\n\n\tDUK_MEMZERO(bd_ctx, sizeof(*bd_ctx));\n\tbd_ctx->data = ((duk_uint8_t *) hdr) + start_offset;\n\tbd_ctx->length = (duk_size_t) (DUK_HBUFFER_FIXED_GET_SIZE(buf) - start_offset);\n\n#if 0\n\tDUK_DDD(DUK_DDDPRINT(\"pc2line lookup: pc=%ld -> hdr_index=%ld, pc_base=%ld, n=%ld, start_offset=%ld\",\n\t                     (long) pc, (long) hdr_index, (long) pc_base, (long) n, (long) start_offset));\n#endif\n\n\twhile (n > 0) {\n#if 0\n\t\tDUK_DDD(DUK_DDDPRINT(\"lookup: n=%ld, curr_line=%ld\", (long) n, (long) curr_line));\n#endif\n\n\t\tif (duk_bd_decode_flag(bd_ctx)) {\n\t\t\tif (duk_bd_decode_flag(bd_ctx)) {\n\t\t\t\tif (duk_bd_decode_flag(bd_ctx)) {\n\t\t\t\t\t/* 1 1 1 <32 bits> */\n\t\t\t\t\tduk_uint_fast32_t t;\n\t\t\t\t\tt = duk_bd_decode(bd_ctx, 16);  /* workaround: max nbits = 24 now */\n\t\t\t\t\tt = (t << 16) + duk_bd_decode(bd_ctx, 16);\n\t\t\t\t\tcurr_line = t;\n\t\t\t\t} else {\n\t\t\t\t\t/* 1 1 0 <8 bits> */\n\t\t\t\t\tduk_uint_fast32_t t;\n\t\t\t\t\tt = duk_bd_decode(bd_ctx, 8);\n\t\t\t\t\tcurr_line = curr_line + t - 0x80;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* 1 0 <2 bits> */\n\t\t\t\tduk_uint_fast32_t t;\n\t\t\t\tt = duk_bd_decode(bd_ctx, 2);\n\t\t\t\tcurr_line = curr_line + t + 1;\n\t\t\t}\n\t\t} else {\n\t\t\t/* 0: no change */\n\t\t}\n\n\t\tn--;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"pc2line lookup result: pc %ld -> line %ld\", (long) pc, (long) curr_line));\n\treturn curr_line;\n\n pc2line_error:\n\tDUK_D(DUK_DPRINT(\"pc2line conversion failed for pc=%ld\", (long) pc));\n\treturn 0;\n}\n\nDUK_INTERNAL duk_uint_fast32_t duk_hobject_pc2line_query(duk_hthread *thr, duk_idx_t idx_func, duk_uint_fast32_t pc) {\n\tduk_hbuffer_fixed *pc2line;\n\tduk_uint_fast32_t line;\n\n\t/* XXX: now that pc2line is used by the debugger quite heavily in\n\t * checked execution, this should be optimized to avoid value stack\n\t * and perhaps also implement some form of pc2line caching (see\n\t * future work in debugger.rst).\n\t */\n\n\tduk_get_prop_stridx(thr, idx_func, DUK_STRIDX_INT_PC2LINE);\n\tpc2line = (duk_hbuffer_fixed *) duk_get_hbuffer(thr, -1);\n\tif (pc2line != NULL) {\n\t\tDUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC((duk_hbuffer *) pc2line) && !DUK_HBUFFER_HAS_EXTERNAL((duk_hbuffer *) pc2line));\n\t\tline = duk__hobject_pc2line_query_raw(thr, pc2line, (duk_uint_fast32_t) pc);\n\t} else {\n\t\tline = 0;\n\t}\n\tduk_pop(thr);\n\n\treturn line;\n}\n\n#endif  /* DUK_USE_PC2LINE */\n#line 1 \"duk_hobject_props.c\"\n/*\n *  duk_hobject property access functionality.\n *\n *  This is very central functionality for size, performance, and compliance.\n *  It is also rather intricate; see hobject-algorithms.rst for discussion on\n *  the algorithms and memory-management.rst for discussion on refcounts and\n *  side effect issues.\n *\n *  Notes:\n *\n *    - It might be tempting to assert \"refcount nonzero\" for objects\n *      being operated on, but that's not always correct: objects with\n *      a zero refcount may be operated on by the refcount implementation\n *      (finalization) for instance.  Hence, no refcount assertions are made.\n *\n *    - Many operations (memory allocation, identifier operations, etc)\n *      may cause arbitrary side effects (e.g. through GC and finalization).\n *      These side effects may invalidate duk_tval pointers which point to\n *      areas subject to reallocation (like value stack).  Heap objects\n *      themselves have stable pointers.  Holding heap object pointers or\n *      duk_tval copies is not problematic with respect to side effects;\n *      care must be taken when holding and using argument duk_tval pointers.\n *\n *    - If a finalizer is executed, it may operate on the the same object\n *      we're currently dealing with.  For instance, the finalizer might\n *      delete a certain property which has already been looked up and\n *      confirmed to exist.  Ideally finalizers would be disabled if GC\n *      happens during property access.  At the moment property table realloc\n *      disables finalizers, and all DECREFs may cause arbitrary changes so\n *      handle DECREF carefully.\n *\n *    - The order of operations for a DECREF matters.  When DECREF is executed,\n *      the entire object graph must be consistent; note that a refzero may\n *      lead to a mark-and-sweep through a refcount finalizer.  Use NORZ macros\n *      and an explicit DUK_REFZERO_CHECK_xxx() if achieving correct order is hard.\n */\n\n/*\n *  XXX: array indices are mostly typed as duk_uint32_t here; duk_uarridx_t\n *  might be more appropriate.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Local defines\n */\n\n#define DUK__NO_ARRAY_INDEX             DUK_HSTRING_NO_ARRAY_INDEX\n\n/* Marker values for hash part. */\n#define DUK__HASH_UNUSED                DUK_HOBJECT_HASHIDX_UNUSED\n#define DUK__HASH_DELETED               DUK_HOBJECT_HASHIDX_DELETED\n\n/* Valstack space that suffices for all local calls, excluding any recursion\n * into Ecmascript or Duktape/C calls (Proxy, getters, etc).\n */\n#define DUK__VALSTACK_SPACE             10\n\n/* Valstack space allocated especially for proxy lookup which does a\n * recursive property lookup.\n */\n#define DUK__VALSTACK_PROXY_LOOKUP      20\n\n/*\n *  Local prototypes\n */\n\nDUK_LOCAL_DECL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc);\nDUK_LOCAL_DECL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag);\nDUK_LOCAL_DECL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc);\n\nDUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr, duk_hobject *obj, duk_uint32_t old_len, duk_uint32_t new_len, duk_bool_t force_flag, duk_uint32_t *out_result_len);\nDUK_LOCAL_DECL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj);\n\nDUK_LOCAL_DECL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags);\nDUK_LOCAL_DECL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags);\n\n/*\n *  Misc helpers\n */\n\n/* Convert a duk_tval number (caller checks) to a 32-bit index.  Returns\n * DUK__NO_ARRAY_INDEX if the number is not whole or not a valid array\n * index.\n */\n/* XXX: for fastints, could use a variant which assumes a double duk_tval\n * (and doesn't need to check for fastint again).\n */\nDUK_LOCAL duk_uint32_t duk__tval_number_to_arr_idx(duk_tval *tv) {\n\tduk_double_t dbl;\n\tduk_uint32_t idx;\n\n\tDUK_ASSERT(tv != NULL);\n\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\n\t/* -0 is accepted here as index 0 because ToString(-0) == \"0\" which is\n\t * in canonical form and thus an array index.\n\t */\n\tdbl = DUK_TVAL_GET_NUMBER(tv);\n\tidx = (duk_uint32_t) dbl;\n\tif ((duk_double_t) idx == dbl) {\n\t        /* Is whole and within 32 bit range.  If the value happens to be 0xFFFFFFFF,\n\t\t * it's not a valid array index but will then match DUK__NO_ARRAY_INDEX.\n\t\t */\n\t\treturn idx;\n\t}\n\treturn DUK__NO_ARRAY_INDEX;\n}\n\n#if defined(DUK_USE_FASTINT)\n/* Convert a duk_tval fastint (caller checks) to a 32-bit index. */\nDUK_LOCAL duk_uint32_t duk__tval_fastint_to_arr_idx(duk_tval *tv) {\n\tduk_int64_t t;\n\n\tDUK_ASSERT(tv != NULL);\n\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));\n\n\tt = DUK_TVAL_GET_FASTINT(tv);\n\tif (((duk_uint64_t) t & ~DUK_U64_CONSTANT(0xffffffff)) != 0) {\n\t\t/* Catches >0x100000000 and negative values. */\n\t\treturn DUK__NO_ARRAY_INDEX;\n\t}\n\n\t/* If the value happens to be 0xFFFFFFFF, it's not a valid array index\n\t * but will then match DUK__NO_ARRAY_INDEX.\n\t */\n\treturn (duk_uint32_t) t;\n}\n#endif  /* DUK_USE_FASTINT */\n\n/* Convert a duk_tval on the value stack (in a trusted index we don't validate)\n * to a string or symbol using ES2015 ToPropertyKey():\n * http://www.ecma-international.org/ecma-262/6.0/#sec-topropertykey.\n *\n * Also check if it's a valid array index and return that (or DUK__NO_ARRAY_INDEX\n * if not).\n */\nDUK_LOCAL duk_uint32_t duk__to_property_key(duk_hthread *thr, duk_idx_t idx, duk_hstring **out_h) {\n\tduk_uint32_t arr_idx;\n\tduk_hstring *h;\n\tduk_tval *tv_dst;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(out_h != NULL);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx));\n\tDUK_ASSERT(idx < 0);\n\n\t/* XXX: The revised ES2015 ToPropertyKey() handling (ES5.1 was just\n\t * ToString()) involves a ToPrimitive(), a symbol check, and finally\n\t * a ToString().  Figure out the best way to have a good fast path\n\t * but still be compliant and share code.\n\t */\n\n\ttv_dst = DUK_GET_TVAL_NEGIDX(thr, idx);  /* intentionally unvalidated */\n\tif (DUK_TVAL_IS_STRING(tv_dst)) {\n\t\t/* Most important path: strings and plain symbols are used as\n\t\t * is.  For symbols the array index check below is unnecessary\n\t\t * (they're never valid array indices) but checking that the\n\t\t * string is a symbol would make the plain string path slower\n\t\t * unnecessarily.\n\t\t */\n\t\th = DUK_TVAL_GET_STRING(tv_dst);\n\t} else {\n\t\th = duk_to_property_key_hstring(thr, idx);\n\t}\n\tDUK_ASSERT(h != NULL);\n\t*out_h = h;\n\n\tarr_idx = DUK_HSTRING_GET_ARRIDX_FAST(h);\n\treturn arr_idx;\n}\n\nDUK_LOCAL duk_uint32_t duk__push_tval_to_property_key(duk_hthread *thr, duk_tval *tv_key, duk_hstring **out_h) {\n\tduk_push_tval(thr, tv_key);  /* XXX: could use an unsafe push here */\n\treturn duk__to_property_key(thr, -1, out_h);\n}\n\n/* String is an own (virtual) property of a plain buffer. */\nDUK_LOCAL duk_bool_t duk__key_is_plain_buf_ownprop(duk_hthread *thr, duk_hbuffer *buf, duk_hstring *key, duk_uint32_t arr_idx) {\n\tDUK_UNREF(thr);\n\n\t/* Virtual index properties.  Checking explicitly for\n\t * 'arr_idx != DUK__NO_ARRAY_INDEX' is not necessary\n\t * because DUK__NO_ARRAY_INDEXi is always larger than\n\t * maximum allowed buffer size.\n\t */\n\tDUK_ASSERT(DUK__NO_ARRAY_INDEX >= DUK_HBUFFER_GET_SIZE(buf));\n\tif (arr_idx < DUK_HBUFFER_GET_SIZE(buf)) {\n\t\treturn 1;\n\t}\n\n\t/* Other virtual properties. */\n\treturn (key == DUK_HTHREAD_STRING_LENGTH(thr));\n}\n\n/*\n *  Helpers for managing property storage size\n */\n\n/* Get default hash part size for a certain entry part size. */\n#if defined(DUK_USE_HOBJECT_HASH_PART)\nDUK_LOCAL duk_uint32_t duk__get_default_h_size(duk_uint32_t e_size) {\n\tDUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES);\n\n\tif (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) {\n\t\tduk_uint32_t res;\n\t\tduk_uint32_t tmp;\n\n\t\t/* Hash size should be 2^N where N is chosen so that 2^N is\n\t\t * larger than e_size.  Extra shifting is used to ensure hash\n\t\t * is relatively sparse.\n\t\t */\n\t\ttmp = e_size;\n\t\tres = 2;  /* Result will be 2 ** (N + 1). */\n\t\twhile (tmp >= 0x40) {\n\t\t\ttmp >>= 6;\n\t\t\tres <<= 6;\n\t\t}\n\t\twhile (tmp != 0) {\n\t\t\ttmp >>= 1;\n\t\t\tres <<= 1;\n\t\t}\n\t\tDUK_ASSERT((DUK_HOBJECT_MAX_PROPERTIES << 2U) > DUK_HOBJECT_MAX_PROPERTIES);  /* Won't wrap, even shifted by 2. */\n\t\tDUK_ASSERT(res > e_size);\n\t\treturn res;\n\t} else {\n\t\treturn 0;\n\t}\n}\n#endif  /* USE_PROP_HASH_PART */\n\n/* Get minimum entry part growth for a certain size. */\nDUK_LOCAL duk_uint32_t duk__get_min_grow_e(duk_uint32_t e_size) {\n\tduk_uint32_t res;\n\n\tDUK_ASSERT(e_size <= DUK_HOBJECT_MAX_PROPERTIES);\n\n\tres = (e_size + DUK_USE_HOBJECT_ENTRY_MINGROW_ADD) / DUK_USE_HOBJECT_ENTRY_MINGROW_DIVISOR;\n\tDUK_ASSERT(res >= 1);  /* important for callers */\n\treturn res;\n}\n\n/* Get minimum array part growth for a certain size. */\nDUK_LOCAL duk_uint32_t duk__get_min_grow_a(duk_uint32_t a_size) {\n\tduk_uint32_t res;\n\n\tDUK_ASSERT((duk_size_t) a_size <= DUK_HOBJECT_MAX_PROPERTIES);\n\n\tres = (a_size + DUK_USE_HOBJECT_ARRAY_MINGROW_ADD) / DUK_USE_HOBJECT_ARRAY_MINGROW_DIVISOR;\n\tDUK_ASSERT(res >= 1);  /* important for callers */\n\treturn res;\n}\n\n/* Count actually used entry part entries (non-NULL keys). */\nDUK_LOCAL duk_uint32_t duk__count_used_e_keys(duk_hthread *thr, duk_hobject *obj) {\n\tduk_uint_fast32_t i;\n\tduk_uint_fast32_t n = 0;\n\tduk_hstring **e;\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_UNREF(thr);\n\n\te = DUK_HOBJECT_E_GET_KEY_BASE(thr->heap, obj);\n\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\tif (*e++) {\n\t\t\tn++;\n\t\t}\n\t}\n\treturn (duk_uint32_t) n;\n}\n\n/* Count actually used array part entries and array minimum size.\n * NOTE: 'out_min_size' can be computed much faster by starting from the\n * end and breaking out early when finding first used entry, but this is\n * not needed now.\n */\nDUK_LOCAL void duk__compute_a_stats(duk_hthread *thr, duk_hobject *obj, duk_uint32_t *out_used, duk_uint32_t *out_min_size) {\n\tduk_uint_fast32_t i;\n\tduk_uint_fast32_t used = 0;\n\tduk_uint_fast32_t highest_idx = (duk_uint_fast32_t) -1;  /* see below */\n\tduk_tval *a;\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(out_used != NULL);\n\tDUK_ASSERT(out_min_size != NULL);\n\tDUK_UNREF(thr);\n\n\ta = DUK_HOBJECT_A_GET_BASE(thr->heap, obj);\n\tfor (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {\n\t\tduk_tval *tv = a++;\n\t\tif (!DUK_TVAL_IS_UNUSED(tv)) {\n\t\t\tused++;\n\t\t\thighest_idx = i;\n\t\t}\n\t}\n\n\t/* Initial value for highest_idx is -1 coerced to unsigned.  This\n\t * is a bit odd, but (highest_idx + 1) will then wrap to 0 below\n\t * for out_min_size as intended.\n\t */\n\n\t*out_used = (duk_uint32_t) used;\n\t*out_min_size = (duk_uint32_t) (highest_idx + 1);  /* 0 if no used entries */\n}\n\n/* Check array density and indicate whether or not the array part should be abandoned. */\nDUK_LOCAL duk_bool_t duk__abandon_array_density_check(duk_uint32_t a_used, duk_uint32_t a_size) {\n\t/*\n\t *  Array abandon check; abandon if:\n\t *\n\t *    new_used / new_size < limit\n\t *    new_used < limit * new_size        || limit is 3 bits fixed point\n\t *    new_used < limit' / 8 * new_size   || *8\n\t *    8*new_used < limit' * new_size     || :8\n\t *    new_used < limit' * (new_size / 8)\n\t *\n\t *  Here, new_used = a_used, new_size = a_size.\n\t *\n\t *  Note: some callers use approximate values for a_used and/or a_size\n\t *  (e.g. dropping a '+1' term).  This doesn't affect the usefulness\n\t *  of the check, but may confuse debugging.\n\t */\n\n\treturn (a_used < DUK_USE_HOBJECT_ARRAY_ABANDON_LIMIT * (a_size >> 3));\n}\n\n/* Fast check for extending array: check whether or not a slow density check is required. */\nDUK_LOCAL duk_bool_t duk__abandon_array_slow_check_required(duk_uint32_t arr_idx, duk_uint32_t old_size) {\n\t/*\n\t *  In a fast check we assume old_size equals old_used (i.e., existing\n\t *  array is fully dense).\n\t *\n\t *  Slow check if:\n\t *\n\t *    (new_size - old_size) / old_size > limit\n\t *    new_size - old_size > limit * old_size\n\t *    new_size > (1 + limit) * old_size        || limit' is 3 bits fixed point\n\t *    new_size > (1 + (limit' / 8)) * old_size || * 8\n\t *    8 * new_size > (8 + limit') * old_size   || : 8\n\t *    new_size > (8 + limit') * (old_size / 8)\n\t *    new_size > limit'' * (old_size / 8)      || limit'' = 9 -> max 25% increase\n\t *    arr_idx + 1 > limit'' * (old_size / 8)\n\t *\n\t *  This check doesn't work well for small values, so old_size is rounded\n\t *  up for the check (and the '+ 1' of arr_idx can be ignored in practice):\n\t *\n\t *    arr_idx > limit'' * ((old_size + 7) / 8)\n\t */\n\n\treturn (arr_idx > DUK_USE_HOBJECT_ARRAY_FAST_RESIZE_LIMIT * ((old_size + 7) >> 3));\n}\n\n/*\n *  Proxy helpers\n */\n\n#if defined(DUK_USE_ES6_PROXY)\nDUK_INTERNAL duk_bool_t duk_hobject_proxy_check(duk_hobject *obj, duk_hobject **out_target, duk_hobject **out_handler) {\n\tduk_hproxy *h_proxy;\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(out_target != NULL);\n\tDUK_ASSERT(out_handler != NULL);\n\n\t/* Caller doesn't need to check exotic proxy behavior (but does so for\n\t * some fast paths).\n\t */\n\tif (DUK_LIKELY(!DUK_HOBJECT_IS_PROXY(obj))) {\n\t\treturn 0;\n\t}\n\th_proxy = (duk_hproxy *) obj;\n\tDUK_ASSERT_HPROXY_VALID(h_proxy);\n\n\tDUK_ASSERT(h_proxy->handler != NULL);\n\tDUK_ASSERT(h_proxy->target != NULL);\n\t*out_handler = h_proxy->handler;\n\t*out_target = h_proxy->target;\n\n\treturn 1;\n}\n#endif  /* DUK_USE_ES6_PROXY */\n\n/* Get Proxy target object.  If the argument is not a Proxy, return it as is.\n * If a Proxy is revoked, an error is thrown.\n */\n#if defined(DUK_USE_ES6_PROXY)\nDUK_INTERNAL duk_hobject *duk_hobject_resolve_proxy_target(duk_hobject *obj) {\n\tDUK_ASSERT(obj != NULL);\n\n\t/* Resolve Proxy targets until Proxy chain ends.  No explicit check for\n\t * a Proxy loop: user code cannot create such a loop (it would only be\n\t * possible by editing duk_hproxy references directly).\n\t */\n\n\twhile (DUK_HOBJECT_IS_PROXY(obj)) {\n\t\tduk_hproxy *h_proxy;\n\n\t\th_proxy = (duk_hproxy *) obj;\n\t\tDUK_ASSERT_HPROXY_VALID(h_proxy);\n\t\tobj = h_proxy->target;\n\t\tDUK_ASSERT(obj != NULL);\n\t}\n\n\tDUK_ASSERT(obj != NULL);\n\treturn obj;\n}\n#endif  /* DUK_USE_ES6_PROXY */\n\n#if defined(DUK_USE_ES6_PROXY)\nDUK_LOCAL duk_bool_t duk__proxy_check_prop(duk_hthread *thr, duk_hobject *obj, duk_small_uint_t stridx_trap, duk_tval *tv_key, duk_hobject **out_target) {\n\tduk_hobject *h_handler;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(tv_key != NULL);\n\tDUK_ASSERT(out_target != NULL);\n\n\tif (!duk_hobject_proxy_check(obj, out_target, &h_handler)) {\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(*out_target != NULL);\n\tDUK_ASSERT(h_handler != NULL);\n\n\t/* XXX: At the moment Duktape accesses internal keys like _Finalizer using a\n\t * normal property set/get which would allow a proxy handler to interfere with\n\t * such behavior and to get access to internal key strings.  This is not a problem\n\t * as such because internal key strings can be created in other ways too (e.g.\n\t * through buffers).  The best fix is to change Duktape internal lookups to\n\t * skip proxy behavior.  Until that, internal property accesses bypass the\n\t * proxy and are applied to the target (as if the handler did not exist).\n\t * This has some side effects, see test-bi-proxy-internal-keys.js.\n\t */\n\n\tif (DUK_TVAL_IS_STRING(tv_key)) {\n\t\tduk_hstring *h_key = (duk_hstring *) DUK_TVAL_GET_STRING(tv_key);\n\t\tDUK_ASSERT(h_key != NULL);\n\t\tif (DUK_HSTRING_HAS_HIDDEN(h_key)) {\n\t\t\t/* Symbol accesses must go through proxy lookup in ES2015.\n\t\t\t * Hidden symbols behave like Duktape 1.x internal keys\n\t\t\t * and currently won't.\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"hidden key, skip proxy handler and apply to target\"));\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/* The handler is looked up with a normal property lookup; it may be an\n\t * accessor or the handler object itself may be a proxy object.  If the\n\t * handler is a proxy, we need to extend the valstack as we make a\n\t * recursive proxy check without a function call in between (in fact\n\t * there is no limit to the potential recursion here).\n\t *\n\t * (For sanity, proxy creation rejects another proxy object as either\n\t * the handler or the target at the moment so recursive proxy cases\n\t * are not realized now.)\n\t */\n\n\t/* XXX: C recursion limit if proxies are allowed as handler/target values */\n\n\tduk_require_stack(thr, DUK__VALSTACK_PROXY_LOOKUP);\n\tduk_push_hobject(thr, h_handler);\n\tif (duk_get_prop_stridx_short(thr, -1, stridx_trap)) {\n\t\t/* -> [ ... handler trap ] */\n\t\tduk_insert(thr, -2);  /* -> [ ... trap handler ] */\n\n\t\t/* stack prepped for func call: [ ... trap handler ] */\n\t\treturn 1;\n\t} else {\n\t\tduk_pop_2_unsafe(thr);\n\t\treturn 0;\n\t}\n}\n#endif  /* DUK_USE_ES6_PROXY */\n\n/*\n *  Reallocate property allocation, moving properties to the new allocation.\n *\n *  Includes key compaction, rehashing, and can also optionally abandon\n *  the array part, 'migrating' array entries into the beginning of the\n *  new entry part.\n *\n *  There is no support for in-place reallocation or just compacting keys\n *  without resizing the property allocation.  This is intentional to keep\n *  code size minimal, but would be useful future work.\n *\n *  The implementation is relatively straightforward, except for the array\n *  abandonment process.  Array abandonment requires that new string keys\n *  are interned, which may trigger GC.  All keys interned so far must be\n *  reachable for GC at all times and correctly refcounted for; valstack is\n *  used for that now.\n *\n *  Also, a GC triggered during this reallocation process must not interfere\n *  with the object being resized.  This is currently controlled by preventing\n *  finalizers (as they may affect ANY object) and object compaction in\n *  mark-and-sweep.  It would suffice to protect only this particular object\n *  from compaction, however.  DECREF refzero cascades are side effect free\n *  and OK.\n *\n *  Note: because we need to potentially resize the valstack (as part\n *  of abandoning the array part), any tval pointers to the valstack\n *  will become invalid after this call.\n */\n\nDUK_INTERNAL void duk_hobject_realloc_props(duk_hthread *thr,\n                                            duk_hobject *obj,\n                                            duk_uint32_t new_e_size,\n                                            duk_uint32_t new_a_size,\n                                            duk_uint32_t new_h_size,\n                                            duk_bool_t abandon_array) {\n\tduk_small_uint_t prev_ms_base_flags;\n\tduk_uint32_t new_alloc_size;\n\tduk_uint32_t new_e_size_adjusted;\n\tduk_uint8_t *new_p;\n\tduk_hstring **new_e_k;\n\tduk_propvalue *new_e_pv;\n\tduk_uint8_t *new_e_f;\n\tduk_tval *new_a;\n\tduk_uint32_t *new_h;\n\tduk_uint32_t new_e_next;\n\tduk_uint_fast32_t i;\n\tduk_size_t array_copy_size;\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_bool_t prev_error_not_allowed;\n#endif\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(!abandon_array || new_a_size == 0);  /* if abandon_array, new_a_size must be 0 */\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL || (DUK_HOBJECT_GET_ESIZE(obj) == 0 && DUK_HOBJECT_GET_ASIZE(obj) == 0));\n\tDUK_ASSERT(new_h_size == 0 || new_h_size >= new_e_size);  /* required to guarantee success of rehashing,\n\t                                                           * intentionally use unadjusted new_e_size\n\t                                                           */\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_STATS_INC(thr->heap, stats_object_realloc_props);\n\n\t/*\n\t *  Pre resize assertions.\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* XXX: pre-checks (such as no duplicate keys) */\n#endif\n\n\t/*\n\t *  For property layout 1, tweak e_size to ensure that the whole entry\n\t *  part (key + val + flags) is a suitable multiple for alignment\n\t *  (platform specific).\n\t *\n\t *  Property layout 2 does not require this tweaking and is preferred\n\t *  on low RAM platforms requiring alignment.\n\t */\n\n#if defined(DUK_USE_HOBJECT_LAYOUT_2) || defined(DUK_USE_HOBJECT_LAYOUT_3)\n\tDUK_DDD(DUK_DDDPRINT(\"using layout 2 or 3, no need to pad e_size: %ld\", (long) new_e_size));\n\tnew_e_size_adjusted = new_e_size;\n#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && (DUK_HOBJECT_ALIGN_TARGET == 1)\n\tDUK_DDD(DUK_DDDPRINT(\"using layout 1, but no need to pad e_size: %ld\", (long) new_e_size));\n\tnew_e_size_adjusted = new_e_size;\n#elif defined(DUK_USE_HOBJECT_LAYOUT_1) && ((DUK_HOBJECT_ALIGN_TARGET == 4) || (DUK_HOBJECT_ALIGN_TARGET == 8))\n\tnew_e_size_adjusted = (new_e_size + (duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U) &\n\t                      (~((duk_uint32_t) DUK_HOBJECT_ALIGN_TARGET - 1U));\n\tDUK_DDD(DUK_DDDPRINT(\"using layout 1, and alignment target is %ld, adjusted e_size: %ld -> %ld\",\n\t                     (long) DUK_HOBJECT_ALIGN_TARGET, (long) new_e_size, (long) new_e_size_adjusted));\n\tDUK_ASSERT(new_e_size_adjusted >= new_e_size);\n#else\n#error invalid hobject layout defines\n#endif\n\n\t/*\n\t *  Debug logging after adjustment.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"attempt to resize hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to \"\n\t                     \"{e_size=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld\",\n\t                     (void *) obj,\n\t                     (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),\n\t                                                       DUK_HOBJECT_GET_ASIZE(obj),\n\t                                                       DUK_HOBJECT_GET_HSIZE(obj)),\n\t                     (long) DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size),\n\t                     (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj),\n\t                     (long) DUK_HOBJECT_GET_ESIZE(obj),\n\t                     (long) DUK_HOBJECT_GET_ENEXT(obj),\n\t                     (long) DUK_HOBJECT_GET_ASIZE(obj),\n\t                     (long) DUK_HOBJECT_GET_HSIZE(obj),\n\t                     (long) new_e_size_adjusted,\n\t                     (long) new_a_size,\n\t                     (long) new_h_size,\n\t                     (long) abandon_array,\n\t                     (long) new_e_size));\n\n\t/*\n\t *  Property count check.  This is the only point where we ensure that\n\t *  we don't get more (allocated) property space that we can handle.\n\t *  There aren't hard limits as such, but some algorithms may fail\n\t *  if we get too close to the 4G property limit.\n\t *\n\t *  Since this works based on allocation size (not actually used size),\n\t *  the limit is a bit approximate but good enough in practice.\n\t */\n\n\tif (new_e_size_adjusted + new_a_size > DUK_HOBJECT_MAX_PROPERTIES) {\n\t\tDUK_ERROR_ALLOC_FAILED(thr);\n\t}\n\n\t/*\n\t *  Compute new alloc size and alloc new area.\n\t *\n\t *  The new area is not tracked in the heap at all, so it's critical\n\t *  we get to free/keep it in a controlled manner.\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* Whole path must be error throw free, but we may be called from\n\t * within error handling so can't assert for error_not_allowed == 0.\n\t */\n\tprev_error_not_allowed = thr->heap->error_not_allowed;\n\tthr->heap->error_not_allowed = 1;\n#endif\n\tprev_ms_base_flags = thr->heap->ms_base_flags;\n\tthr->heap->ms_base_flags |=\n\t        DUK_MS_FLAG_NO_OBJECT_COMPACTION;      /* Avoid attempt to compact the current object (all objects really). */\n\tthr->heap->pf_prevent_count++;                 /* Avoid finalizers. */\n\tDUK_ASSERT(thr->heap->pf_prevent_count != 0);  /* Wrap. */\n\n\tnew_alloc_size = DUK_HOBJECT_P_COMPUTE_SIZE(new_e_size_adjusted, new_a_size, new_h_size);\n\tDUK_DDD(DUK_DDDPRINT(\"new hobject allocation size is %ld\", (long) new_alloc_size));\n\tif (new_alloc_size == 0) {\n\t\tDUK_ASSERT(new_e_size_adjusted == 0);\n\t\tDUK_ASSERT(new_a_size == 0);\n\t\tDUK_ASSERT(new_h_size == 0);\n\t\tnew_p = NULL;\n\t} else {\n\t\t/* Alloc may trigger mark-and-sweep but no compaction, and\n\t\t * cannot throw.\n\t\t */\n#if 0  /* XXX: inject test */\n\t\tif (1) {\n\t\t\tnew_p = NULL;\n\t\t\tgoto alloc_failed;\n\t\t}\n#endif\n\t\tnew_p = (duk_uint8_t *) DUK_ALLOC(thr->heap, new_alloc_size);\n\t\tif (new_p == NULL) {\n\t\t\t/* NULL always indicates alloc failure because\n\t\t\t * new_alloc_size > 0.\n\t\t\t */\n\t\t\tgoto alloc_failed;\n\t\t}\n\t}\n\n\t/* Set up pointers to the new property area: this is hidden behind a macro\n\t * because it is memory layout specific.\n\t */\n\tDUK_HOBJECT_P_SET_REALLOC_PTRS(new_p, new_e_k, new_e_pv, new_e_f, new_a, new_h,\n\t                               new_e_size_adjusted, new_a_size, new_h_size);\n\tDUK_UNREF(new_h);  /* happens when hash part dropped */\n\tnew_e_next = 0;\n\n\t/* if new_p == NULL, all of these pointers are NULL */\n\tDUK_ASSERT((new_p != NULL) ||\n\t           (new_e_k == NULL && new_e_pv == NULL && new_e_f == NULL &&\n\t            new_a == NULL && new_h == NULL));\n\n\tDUK_DDD(DUK_DDDPRINT(\"new alloc size %ld, new_e_k=%p, new_e_pv=%p, new_e_f=%p, new_a=%p, new_h=%p\",\n\t                     (long) new_alloc_size, (void *) new_e_k, (void *) new_e_pv, (void *) new_e_f,\n\t                     (void *) new_a, (void *) new_h));\n\n\t/*\n\t *  Migrate array part to start of entries if requested.\n\t *\n\t *  Note: from an enumeration perspective the order of entry keys matters.\n\t *  Array keys should appear wherever they appeared before the array abandon\n\t *  operation.  (This no longer matters much because keys are ES2015 sorted.)\n\t */\n\n\tif (abandon_array) {\n\t\t/* Assuming new_a_size == 0, and that entry part contains\n\t\t * no conflicting keys, refcounts do not need to be adjusted for\n\t\t * the values, as they remain exactly the same.\n\t\t *\n\t\t * The keys, however, need to be interned, incref'd, and be\n\t\t * reachable for GC.  Any intern attempt may trigger a GC and\n\t\t * claim any non-reachable strings, so every key must be reachable\n\t\t * at all times.  Refcounts must be correct to satisfy refcount\n\t\t * assertions.\n\t\t *\n\t\t * A longjmp must not occur here, as the new_p allocation would\n\t\t * leak.  Refcounts would come out correctly as the interned\n\t\t * strings are valstack tracked.\n\t\t */\n\t\tDUK_ASSERT(new_a_size == 0);\n\n\t\tDUK_STATS_INC(thr->heap, stats_object_abandon_array);\n\n\t\tfor (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {\n\t\t\tduk_tval *tv1;\n\t\t\tduk_tval *tv2;\n\t\t\tduk_hstring *key;\n\n\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL);\n\n\t\t\ttv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);\n\t\t\tif (DUK_TVAL_IS_UNUSED(tv1)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tDUK_ASSERT(new_p != NULL && new_e_k != NULL &&\n\t\t\t           new_e_pv != NULL && new_e_f != NULL);\n\n\t\t\t/*\n\t\t\t *  Intern key via the valstack to ensure reachability behaves\n\t\t\t *  properly.  We must avoid longjmp's here so use non-checked\n\t\t\t *  primitives.\n\t\t\t *\n\t\t\t *  Note: duk_check_stack() potentially reallocs the valstack,\n\t\t\t *  invalidating any duk_tval pointers to valstack.  Callers\n\t\t\t *  must be careful.\n\t\t\t */\n\n#if 0  /* XXX: inject test */\n\t\t\tif (1) {\n\t\t\t\tgoto abandon_error;\n\t\t\t}\n#endif\n\t\t\t/* Never shrinks; auto-adds DUK_VALSTACK_INTERNAL_EXTRA, which\n\t\t\t * is generous.\n\t\t\t */\n\t\t\tif (!duk_check_stack(thr, 1)) {\n\t\t\t\tgoto abandon_error;\n\t\t\t}\n\t\t\tDUK_ASSERT_VALSTACK_SPACE(thr, 1);\n\t\t\tkey = duk_heap_strtable_intern_u32(thr->heap, (duk_uint32_t) i);\n\t\t\tif (key == NULL) {\n\t\t\t\tgoto abandon_error;\n\t\t\t}\n\t\t\tduk_push_hstring(thr, key);  /* keep key reachable for GC etc; guaranteed not to fail */\n\n\t\t\t/* Key is now reachable in the valstack, don't INCREF\n\t\t\t * the new allocation yet (we'll steal the refcounts\n\t\t\t * from the value stack once all keys are done).\n\t\t\t */\n\n\t\t\tnew_e_k[new_e_next] = key;\n\t\t\ttv2 = &new_e_pv[new_e_next].v;  /* array entries are all plain values */\n\t\t\tDUK_TVAL_SET_TVAL(tv2, tv1);\n\t\t\tnew_e_f[new_e_next] = DUK_PROPDESC_FLAG_WRITABLE |\n\t\t\t                      DUK_PROPDESC_FLAG_ENUMERABLE |\n\t\t\t                      DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t\tnew_e_next++;\n\n\t\t\t/* Note: new_e_next matches pushed temp key count, and nothing can\n\t\t\t * fail above between the push and this point.\n\t\t\t */\n\t\t}\n\n\t\t/* Steal refcounts from value stack. */\n\t\tDUK_DDD(DUK_DDDPRINT(\"abandon array: pop %ld key temps from valstack\", (long) new_e_next));\n\t\tduk_pop_n_nodecref_unsafe(thr, (duk_idx_t) new_e_next);\n\t}\n\n\t/*\n\t *  Copy keys and values in the entry part (compacting them at the same time).\n\t */\n\n\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\tduk_hstring *key;\n\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL);\n\n\t\tkey = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i);\n\t\tif (key == NULL) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tDUK_ASSERT(new_p != NULL && new_e_k != NULL &&\n\t\t           new_e_pv != NULL && new_e_f != NULL);\n\n\t\tnew_e_k[new_e_next] = key;\n\t\tnew_e_pv[new_e_next] = DUK_HOBJECT_E_GET_VALUE(thr->heap, obj, i);\n\t\tnew_e_f[new_e_next] = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i);\n\t\tnew_e_next++;\n\t}\n\t/* the entries [new_e_next, new_e_size_adjusted[ are left uninitialized on purpose (ok, not gc reachable) */\n\n\t/*\n\t *  Copy array elements to new array part.  If the new array part is\n\t *  larger, initialize the unused entries as UNUSED because they are\n\t *  GC reachable.\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* Caller must have decref'd values above new_a_size (if that is necessary). */\n\tif (!abandon_array) {\n\t\tfor (i = new_a_size; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {\n\t\t\tduk_tval *tv;\n\t\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNUSED(tv));\n\t\t}\n\t}\n#endif\n\tif (new_a_size > DUK_HOBJECT_GET_ASIZE(obj)) {\n\t\tarray_copy_size = sizeof(duk_tval) * DUK_HOBJECT_GET_ASIZE(obj);\n\t} else {\n\t\tarray_copy_size = sizeof(duk_tval) * new_a_size;\n\t}\n\tif (array_copy_size > 0) {\n\t\t/* Avoid zero copy with an invalid pointer.  If obj->p is NULL,\n\t\t * the 'new_a' pointer will be invalid which is not allowed even\n\t\t * when copy size is zero.\n\t\t */\n\t\tDUK_ASSERT(new_a != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, obj) != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) > 0);\n\t\tDUK_MEMCPY((void *) new_a,\n\t\t           (const void *) DUK_HOBJECT_A_GET_BASE(thr->heap, obj),\n\t\t           array_copy_size);\n\t}\n\tfor (i = DUK_HOBJECT_GET_ASIZE(obj); i < new_a_size; i++) {\n\t\tduk_tval *tv = &new_a[i];\n\t\tDUK_TVAL_SET_UNUSED(tv);\n\t}\n\n\t/*\n\t *  Rebuild the hash part always from scratch (guaranteed to finish\n\t *  as long as caller gave consistent parameters).\n\t *\n\t *  Any resize of hash part requires rehashing.  In addition, by rehashing\n\t *  get rid of any elements marked deleted (DUK__HASH_DELETED) which is critical\n\t *  to ensuring the hash part never fills up.\n\t */\n\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tif (new_h_size == 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"no hash part, no rehash\"));\n\t} else {\n\t\tduk_uint32_t mask;\n\n\t\tDUK_ASSERT(new_h != NULL);\n\n\t\t/* fill new_h with u32 0xff = UNUSED */\n\t\tDUK_ASSERT(new_h_size > 0);\n\t\tDUK_MEMSET(new_h, 0xff, sizeof(duk_uint32_t) * new_h_size);\n\n\t\tDUK_ASSERT(new_e_next <= new_h_size);  /* equality not actually possible */\n\n\t\tmask = new_h_size - 1;\n\t\tfor (i = 0; i < new_e_next; i++) {\n\t\t\tduk_hstring *key = new_e_k[i];\n\t\t\tduk_uint32_t j, step;\n\n\t\t\tDUK_ASSERT(key != NULL);\n\t\t\tj = DUK_HSTRING_GET_HASH(key) & mask;\n\t\t\tstep = 1;  /* Cache friendly but clustering prone. */\n\n\t\t\tfor (;;) {\n\t\t\t\tDUK_ASSERT(new_h[j] != DUK__HASH_DELETED);  /* should never happen */\n\t\t\t\tif (new_h[j] == DUK__HASH_UNUSED) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"rebuild hit %ld -> %ld\", (long) j, (long) i));\n\t\t\t\t\tnew_h[j] = (duk_uint32_t) i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"rebuild miss %ld, step %ld\", (long) j, (long) step));\n\t\t\t\tj = (j + step) & mask;\n\n\t\t\t\t/* Guaranteed to finish (hash is larger than #props). */\n\t\t\t}\n\t\t}\n\t}\n#endif  /* DUK_USE_HOBJECT_HASH_PART */\n\n\t/*\n\t *  Nice debug log.\n\t */\n\n\tDUK_DD(DUK_DDPRINT(\"resized hobject %p props (%ld -> %ld bytes), from {p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld} to \"\n\t                   \"{p=%p,e_size=%ld,e_next=%ld,a_size=%ld,h_size=%ld}, abandon_array=%ld, unadjusted new_e_size=%ld\",\n\t                   (void *) obj,\n\t                   (long) DUK_HOBJECT_P_COMPUTE_SIZE(DUK_HOBJECT_GET_ESIZE(obj),\n\t                                                     DUK_HOBJECT_GET_ASIZE(obj),\n\t                                                     DUK_HOBJECT_GET_HSIZE(obj)),\n\t                   (long) new_alloc_size,\n\t                   (void *) DUK_HOBJECT_GET_PROPS(thr->heap, obj),\n\t                   (long) DUK_HOBJECT_GET_ESIZE(obj),\n\t                   (long) DUK_HOBJECT_GET_ENEXT(obj),\n\t                   (long) DUK_HOBJECT_GET_ASIZE(obj),\n\t                   (long) DUK_HOBJECT_GET_HSIZE(obj),\n\t                   (void *) new_p,\n\t                   (long) new_e_size_adjusted,\n\t                   (long) new_e_next,\n\t                   (long) new_a_size,\n\t                   (long) new_h_size,\n\t                   (long) abandon_array,\n\t                   (long) new_e_size));\n\n\t/*\n\t *  All done, switch properties ('p') allocation to new one.\n\t */\n\n\tDUK_FREE_CHECKED(thr, DUK_HOBJECT_GET_PROPS(thr->heap, obj));  /* NULL obj->p is OK */\n\tDUK_HOBJECT_SET_PROPS(thr->heap, obj, new_p);\n\tDUK_HOBJECT_SET_ESIZE(obj, new_e_size_adjusted);\n\tDUK_HOBJECT_SET_ENEXT(obj, new_e_next);\n\tDUK_HOBJECT_SET_ASIZE(obj, new_a_size);\n\tDUK_HOBJECT_SET_HSIZE(obj, new_h_size);\n\n\t/* Clear array part flag only after switching. */\n\tif (abandon_array) {\n\t\tDUK_HOBJECT_CLEAR_ARRAY_PART(obj);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"resize result: %!O\", (duk_heaphdr *) obj));\n\n\tDUK_ASSERT(thr->heap->pf_prevent_count > 0);\n\tthr->heap->pf_prevent_count--;\n\tthr->heap->ms_base_flags = prev_ms_base_flags;\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(thr->heap->error_not_allowed == 1);\n\tthr->heap->error_not_allowed = prev_error_not_allowed;\n#endif\n\n\t/*\n\t *  Post resize assertions.\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* XXX: post-checks (such as no duplicate keys) */\n#endif\n\treturn;\n\n\t/*\n\t *  Abandon array failed.  We don't need to DECREF anything\n\t *  because the references in the new allocation are not\n\t *  INCREF'd until abandon is complete.  The string interned\n\t *  keys are on the value stack and are handled normally by\n\t *  unwind.\n\t */\n\n abandon_error:\n alloc_failed:\n\tDUK_D(DUK_DPRINT(\"object property table resize failed\"));\n\n\tDUK_FREE_CHECKED(thr, new_p);  /* OK for NULL. */\n\n\tthr->heap->pf_prevent_count--;\n\tthr->heap->ms_base_flags = prev_ms_base_flags;\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(thr->heap->error_not_allowed == 1);\n\tthr->heap->error_not_allowed = prev_error_not_allowed;\n#endif\n\n\tDUK_ERROR_ALLOC_FAILED(thr);\n}\n\n/*\n *  Helpers to resize properties allocation on specific needs.\n */\n\nDUK_INTERNAL void duk_hobject_resize_entrypart(duk_hthread *thr,\n                                               duk_hobject *obj,\n                                               duk_uint32_t new_e_size) {\n\tduk_uint32_t old_e_size;\n\tduk_uint32_t new_a_size;\n\tduk_uint32_t new_h_size;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n\told_e_size = DUK_HOBJECT_GET_ESIZE(obj);\n\tif (old_e_size > new_e_size) {\n\t\tnew_e_size = old_e_size;\n\t}\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tnew_h_size = duk__get_default_h_size(new_e_size);\n#else\n\tnew_h_size = 0;\n#endif\n\tnew_a_size = DUK_HOBJECT_GET_ASIZE(obj);\n\n\tduk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);\n}\n\n#if 0  /*unused */\nDUK_INTERNAL void duk_hobject_resize_arraypart(duk_hthread *thr,\n                                               duk_hobject *obj,\n                                               duk_uint32_t new_a_size) {\n\tduk_uint32_t old_a_size;\n\tduk_uint32_t new_e_size;\n\tduk_uint32_t new_h_size;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n\tif (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\treturn;\n\t}\n\told_a_size = DUK_HOBJECT_GET_ASIZE(obj);\n\tif (old_a_size > new_a_size) {\n\t\tnew_a_size = old_a_size;\n\t}\n\tnew_e_size = DUK_HOBJECT_GET_ESIZE(obj);\n\tnew_h_size = DUK_HOBJECT_GET_HSIZE(obj);\n\n\tduk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);\n}\n#endif\n\n/* Grow entry part allocation for one additional entry. */\nDUK_LOCAL void duk__grow_props_for_new_entry_item(duk_hthread *thr, duk_hobject *obj) {\n\tduk_uint32_t old_e_used;  /* actually used, non-NULL entries */\n\tduk_uint32_t new_e_size;\n\tduk_uint32_t new_a_size;\n\tduk_uint32_t new_h_size;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n\t/* Duktape 0.11.0 and prior tried to optimize the resize by not\n\t * counting the number of actually used keys prior to the resize.\n\t * This worked mostly well but also caused weird leak-like behavior\n\t * as in: test-bug-object-prop-alloc-unbounded.js.  So, now we count\n\t * the keys explicitly to compute the new entry part size.\n\t */\n\n\told_e_used = duk__count_used_e_keys(thr, obj);\n\tnew_e_size = old_e_used + duk__get_min_grow_e(old_e_used);\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tnew_h_size = duk__get_default_h_size(new_e_size);\n#else\n\tnew_h_size = 0;\n#endif\n\tnew_a_size = DUK_HOBJECT_GET_ASIZE(obj);\n\tDUK_ASSERT(new_e_size >= old_e_used + 1);  /* duk__get_min_grow_e() is always >= 1 */\n\n\tduk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);\n}\n\n/* Grow array part for a new highest array index. */\nDUK_LOCAL void duk__grow_props_for_array_item(duk_hthread *thr, duk_hobject *obj, duk_uint32_t highest_arr_idx) {\n\tduk_uint32_t new_e_size;\n\tduk_uint32_t new_a_size;\n\tduk_uint32_t new_h_size;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(highest_arr_idx >= DUK_HOBJECT_GET_ASIZE(obj));\n\n\t/* minimum new length is highest_arr_idx + 1 */\n\n\tnew_e_size = DUK_HOBJECT_GET_ESIZE(obj);\n\tnew_h_size = DUK_HOBJECT_GET_HSIZE(obj);\n\tnew_a_size = highest_arr_idx + duk__get_min_grow_a(highest_arr_idx);\n\tDUK_ASSERT(new_a_size >= highest_arr_idx + 1);  /* duk__get_min_grow_a() is always >= 1 */\n\n\tduk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 0);\n}\n\n/* Abandon array part, moving array entries into entries part.\n * This requires a props resize, which is a heavy operation.\n * We also compact the entries part while we're at it, although\n * this is not strictly required.\n */\nDUK_LOCAL void duk__abandon_array_checked(duk_hthread *thr, duk_hobject *obj) {\n\tduk_uint32_t new_e_size;\n\tduk_uint32_t new_a_size;\n\tduk_uint32_t new_h_size;\n\tduk_uint32_t e_used;  /* actually used, non-NULL keys */\n\tduk_uint32_t a_used;\n\tduk_uint32_t a_size;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n\te_used = duk__count_used_e_keys(thr, obj);\n\tduk__compute_a_stats(thr, obj, &a_used, &a_size);\n\n\t/*\n\t *  Must guarantee all actually used array entries will fit into\n\t *  new entry part.  Add one growth step to ensure we don't run out\n\t *  of space right away.\n\t */\n\n\tnew_e_size = e_used + a_used;\n\tnew_e_size = new_e_size + duk__get_min_grow_e(new_e_size);\n\tnew_a_size = 0;\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tnew_h_size = duk__get_default_h_size(new_e_size);\n#else\n\tnew_h_size = 0;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"abandon array part for hobject %p, \"\n\t                   \"array stats before: e_used=%ld, a_used=%ld, a_size=%ld; \"\n\t                   \"resize to e_size=%ld, a_size=%ld, h_size=%ld\",\n\t                   (void *) obj, (long) e_used, (long) a_used, (long) a_size,\n\t                   (long) new_e_size, (long) new_a_size, (long) new_h_size));\n\n\tduk_hobject_realloc_props(thr, obj, new_e_size, new_a_size, new_h_size, 1);\n}\n\n/*\n *  Compact an object.  Minimizes allocation size for objects which are\n *  not likely to be extended.  This is useful for internal and non-\n *  extensible objects, but can also be called for non-extensible objects.\n *  May abandon the array part if it is computed to be too sparse.\n *\n *  This call is relatively expensive, as it needs to scan both the\n *  entries and the array part.\n *\n *  The call may fail due to allocation error.\n */\n\nDUK_INTERNAL void duk_hobject_compact_props(duk_hthread *thr, duk_hobject *obj) {\n\tduk_uint32_t e_size;       /* currently used -> new size */\n\tduk_uint32_t a_size;       /* currently required */\n\tduk_uint32_t a_used;       /* actually used */\n\tduk_uint32_t h_size;\n\tduk_bool_t abandon_array;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n#if defined(DUK_USE_ROM_OBJECTS)\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {\n\t\tDUK_DD(DUK_DDPRINT(\"ignore attempt to compact a rom object\"));\n\t\treturn;\n\t}\n#endif\n\n\te_size = duk__count_used_e_keys(thr, obj);\n\tduk__compute_a_stats(thr, obj, &a_used, &a_size);\n\n\tDUK_DD(DUK_DDPRINT(\"compacting hobject, used e keys %ld, used a keys %ld, min a size %ld, \"\n\t                   \"resized array density would be: %ld/%ld = %lf\",\n\t                   (long) e_size, (long) a_used, (long) a_size,\n\t                   (long) a_used, (long) a_size,\n\t                   (double) a_used / (double) a_size));\n\n\tif (duk__abandon_array_density_check(a_used, a_size)) {\n\t\tDUK_DD(DUK_DDPRINT(\"decided to abandon array during compaction, a_used=%ld, a_size=%ld\",\n\t\t                   (long) a_used, (long) a_size));\n\t\tabandon_array = 1;\n\t\te_size += a_used;\n\t\ta_size = 0;\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"decided to keep array during compaction\"));\n\t\tabandon_array = 0;\n\t}\n\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tif (e_size >= DUK_USE_HOBJECT_HASH_PROP_LIMIT) {\n\t\th_size = duk__get_default_h_size(e_size);\n\t} else {\n\t\th_size = 0;\n\t}\n#else\n\th_size = 0;\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"compacting hobject -> new e_size %ld, new a_size=%ld, new h_size=%ld, abandon_array=%ld\",\n\t                   (long) e_size, (long) a_size, (long) h_size, (long) abandon_array));\n\n\tduk_hobject_realloc_props(thr, obj, e_size, a_size, h_size, abandon_array);\n}\n\n/*\n *  Find an existing key from entry part either by linear scan or by\n *  using the hash index (if it exists).\n *\n *  Sets entry index (and possibly the hash index) to output variables,\n *  which allows the caller to update the entry and hash entries in-place.\n *  If entry is not found, both values are set to -1.  If entry is found\n *  but there is no hash part, h_idx is set to -1.\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_find_existing_entry(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_int_t *e_idx, duk_int_t *h_idx) {\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(e_idx != NULL);\n\tDUK_ASSERT(h_idx != NULL);\n\tDUK_UNREF(heap);\n\n\tif (DUK_LIKELY(DUK_HOBJECT_GET_HSIZE(obj) == 0))\n\t{\n\t\t/* Linear scan: more likely because most objects are small.\n\t\t * This is an important fast path.\n\t\t *\n\t\t * XXX: this might be worth inlining for property lookups.\n\t\t */\n\t\tduk_uint_fast32_t i;\n\t\tduk_uint_fast32_t n;\n\t\tduk_hstring **h_keys_base;\n\t\tDUK_DDD(DUK_DDDPRINT(\"duk_hobject_find_existing_entry() using linear scan for lookup\"));\n\n\t\th_keys_base = DUK_HOBJECT_E_GET_KEY_BASE(heap, obj);\n\t\tn = DUK_HOBJECT_GET_ENEXT(obj);\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tif (h_keys_base[i] == key) {\n\t\t\t\t*e_idx = (duk_int_t) i;\n\t\t\t\t*h_idx = -1;\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t}\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\telse\n\t{\n\t\t/* hash lookup */\n\t\tduk_uint32_t n;\n\t\tduk_uint32_t i, step;\n\t\tduk_uint32_t *h_base;\n\t\tduk_uint32_t mask;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"duk_hobject_find_existing_entry() using hash part for lookup\"));\n\n\t\th_base = DUK_HOBJECT_H_GET_BASE(heap, obj);\n\t\tn = DUK_HOBJECT_GET_HSIZE(obj);\n\t\tmask = n - 1;\n\t\ti = DUK_HSTRING_GET_HASH(key) & mask;\n\t\tstep = 1;  /* Cache friendly but clustering prone. */\n\n\t\tfor (;;) {\n\t\t\tduk_uint32_t t;\n\n\t\t\tDUK_ASSERT_DISABLE(i >= 0);  /* unsigned */\n\t\t\tDUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj));\n\t\t\tt = h_base[i];\n\t\t\tDUK_ASSERT(t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED ||\n\t\t\t           (t < DUK_HOBJECT_GET_ESIZE(obj)));  /* t >= 0 always true, unsigned */\n\n\t\t\tif (t == DUK__HASH_UNUSED) {\n\t\t\t\tbreak;\n\t\t\t} else if (t == DUK__HASH_DELETED) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"lookup miss (deleted) i=%ld, t=%ld\",\n\t\t\t\t                     (long) i, (long) t));\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(t < DUK_HOBJECT_GET_ESIZE(obj));\n\t\t\t\tif (DUK_HOBJECT_E_GET_KEY(heap, obj, t) == key) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"lookup hit i=%ld, t=%ld -> key %p\",\n\t\t\t\t\t                     (long) i, (long) t, (void *) key));\n\t\t\t\t\t*e_idx = (duk_int_t) t;\n\t\t\t\t\t*h_idx = (duk_int_t) i;\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"lookup miss i=%ld, t=%ld\",\n\t\t\t\t                     (long) i, (long) t));\n\t\t\t}\n\t\t\ti = (i + step) & mask;\n\n\t\t\t/* Guaranteed to finish (hash is larger than #props). */\n\t\t}\n\t}\n#endif  /* DUK_USE_HOBJECT_HASH_PART */\n\n\t/* Not found, leave e_idx and h_idx unset. */\n\treturn 0;\n}\n\n/* For internal use: get non-accessor entry value */\nDUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_hstring *key) {\n\tduk_int_t e_idx;\n\tduk_int_t h_idx;\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_UNREF(heap);\n\n\tif (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) {\n\t\tDUK_ASSERT(e_idx >= 0);\n\t\tif (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) {\n\t\t\treturn DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx);\n\t\t}\n\t}\n\treturn NULL;\n}\n\n/* For internal use: get non-accessor entry value and attributes */\nDUK_INTERNAL duk_tval *duk_hobject_find_existing_entry_tval_ptr_and_attrs(duk_heap *heap, duk_hobject *obj, duk_hstring *key, duk_uint_t *out_attrs) {\n\tduk_int_t e_idx;\n\tduk_int_t h_idx;\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(out_attrs != NULL);\n\tDUK_UNREF(heap);\n\n\tif (duk_hobject_find_existing_entry(heap, obj, key, &e_idx, &h_idx)) {\n\t\tDUK_ASSERT(e_idx >= 0);\n\t\tif (!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx)) {\n\t\t\t*out_attrs = DUK_HOBJECT_E_GET_FLAGS(heap, obj, e_idx);\n\t\t\treturn DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx);\n\t\t}\n\t}\n\t/* If not found, out_attrs is left unset. */\n\treturn NULL;\n}\n\n/* For internal use: get array part value */\nDUK_INTERNAL duk_tval *duk_hobject_find_existing_array_entry_tval_ptr(duk_heap *heap, duk_hobject *obj, duk_uarridx_t i) {\n\tduk_tval *tv;\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_UNREF(heap);\n\n\tif (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\treturn NULL;\n\t}\n\tif (i >= DUK_HOBJECT_GET_ASIZE(obj)) {\n\t\treturn NULL;\n\t}\n\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(heap, obj, i);\n\treturn tv;\n}\n\n/*\n *  Allocate and initialize a new entry, resizing the properties allocation\n *  if necessary.  Returns entry index (e_idx) or throws an error if alloc fails.\n *\n *  Sets the key of the entry (increasing the key's refcount), and updates\n *  the hash part if it exists.  Caller must set value and flags, and update\n *  the entry value refcount.  A decref for the previous value is not necessary.\n */\n\nDUK_LOCAL duk_int_t duk__hobject_alloc_entry_checked(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) {\n\tduk_uint32_t idx;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) <= DUK_HOBJECT_GET_ESIZE(obj));\n\n#if defined(DUK_USE_ASSERTIONS)\n\t/* key must not already exist in entry part */\n\t{\n\t\tduk_uint_fast32_t i;\n\t\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\t\tDUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != key);\n\t\t}\n\t}\n#endif\n\n\tif (DUK_HOBJECT_GET_ENEXT(obj) >= DUK_HOBJECT_GET_ESIZE(obj)) {\n\t\t/* only need to guarantee 1 more slot, but allocation growth is in chunks */\n\t\tDUK_DDD(DUK_DDDPRINT(\"entry part full, allocate space for one more entry\"));\n\t\tduk__grow_props_for_new_entry_item(thr, obj);\n\t}\n\tDUK_ASSERT(DUK_HOBJECT_GET_ENEXT(obj) < DUK_HOBJECT_GET_ESIZE(obj));\n\tidx = DUK_HOBJECT_POSTINC_ENEXT(obj);\n\n\t/* previous value is assumed to be garbage, so don't touch it */\n\tDUK_HOBJECT_E_SET_KEY(thr->heap, obj, idx, key);\n\tDUK_HSTRING_INCREF(thr, key);\n\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\tif (DUK_UNLIKELY(DUK_HOBJECT_GET_HSIZE(obj) > 0)) {\n\t\tduk_uint32_t n, mask;\n\t\tduk_uint32_t i, step;\n\t\tduk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj);\n\n\t\tn = DUK_HOBJECT_GET_HSIZE(obj);\n\t\tmask = n - 1;\n\t\ti = DUK_HSTRING_GET_HASH(key) & mask;\n\t\tstep = 1;  /* Cache friendly but clustering prone. */\n\n\t\tfor (;;) {\n\t\t\tduk_uint32_t t = h_base[i];\n\t\t\tif (t == DUK__HASH_UNUSED || t == DUK__HASH_DELETED) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__hobject_alloc_entry_checked() inserted key into hash part, %ld -> %ld\",\n\t\t\t\t                     (long) i, (long) idx));\n\t\t\t\tDUK_ASSERT_DISABLE(i >= 0);  /* unsigned */\n\t\t\t\tDUK_ASSERT(i < DUK_HOBJECT_GET_HSIZE(obj));\n\t\t\t\tDUK_ASSERT_DISABLE(idx >= 0);\n\t\t\t\tDUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj));\n\t\t\t\th_base[i] = idx;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__hobject_alloc_entry_checked() miss %ld\", (long) i));\n\t\t\ti = (i + step) & mask;\n\n\t\t\t/* Guaranteed to finish (hash is larger than #props). */\n\t\t}\n\t}\n#endif  /* DUK_USE_HOBJECT_HASH_PART */\n\n\t/* Note: we could return the hash index here too, but it's not\n\t * needed right now.\n\t */\n\n\tDUK_ASSERT_DISABLE(idx >= 0);\n\tDUK_ASSERT(idx < DUK_HOBJECT_GET_ESIZE(obj));\n\tDUK_ASSERT(idx < DUK_HOBJECT_GET_ENEXT(obj));\n\treturn (duk_int_t) idx;\n}\n\n/*\n *  Object internal value\n *\n *  Returned value is guaranteed to be reachable / incref'd, caller does not need\n *  to incref OR decref.  No proxies or accessors are invoked, no prototype walk.\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_get_internal_value(duk_heap *heap, duk_hobject *obj, duk_tval *tv_out) {\n\tduk_int_t e_idx;\n\tduk_int_t h_idx;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(tv_out != NULL);\n\n\t/* Always in entry part, no need to look up parents etc. */\n\tif (duk_hobject_find_existing_entry(heap, obj, DUK_HEAP_STRING_INT_VALUE(heap), &e_idx, &h_idx)) {\n\t\tDUK_ASSERT(e_idx >= 0);\n\t\tDUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(heap, obj, e_idx));\n\t\tDUK_TVAL_SET_TVAL(tv_out, DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(heap, obj, e_idx));\n\t\treturn 1;\n\t}\n\tDUK_TVAL_SET_UNDEFINED(tv_out);\n\treturn 0;\n}\n\nDUK_INTERNAL duk_hstring *duk_hobject_get_internal_value_string(duk_heap *heap, duk_hobject *obj) {\n\tduk_tval tv;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n\t/* This is not strictly necessary, but avoids compiler warnings; e.g.\n\t * gcc won't reliably detect that no uninitialized data is read below.\n\t */\n\tDUK_MEMZERO((void *) &tv, sizeof(duk_tval));\n\n\tif (duk_hobject_get_internal_value(heap, obj, &tv)) {\n\t\tduk_hstring *h;\n\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(&tv));\n\t\th = DUK_TVAL_GET_STRING(&tv);\n\t\t/* No explicit check for string vs. symbol, accept both. */\n\t\treturn h;\n\t}\n\n\treturn NULL;\n}\n\n/*\n *  Arguments handling helpers (argument map mainly).\n *\n *  An arguments object has exotic behavior for some numeric indices.\n *  Accesses may translate to identifier operations which may have\n *  arbitrary side effects (potentially invalidating any duk_tval\n *  pointers).\n */\n\n/* Lookup 'key' from arguments internal 'map', perform a variable lookup\n * if mapped, and leave the result on top of stack (and return non-zero).\n * Used in E5 Section 10.6 algorithms [[Get]] and [[GetOwnProperty]].\n */\nDUK_LOCAL\nduk_bool_t duk__lookup_arguments_map(duk_hthread *thr,\n                                     duk_hobject *obj,\n                                     duk_hstring *key,\n                                     duk_propdesc *temp_desc,\n                                     duk_hobject **out_map,\n                                     duk_hobject **out_varenv) {\n\tduk_hobject *map;\n\tduk_hobject *varenv;\n\tduk_bool_t rc;\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_DDD(DUK_DDDPRINT(\"arguments map lookup: thr=%p, obj=%p, key=%p, temp_desc=%p \"\n\t                     \"(obj -> %!O, key -> %!O)\",\n\t                     (void *) thr, (void *) obj, (void *) key, (void *) temp_desc,\n\t                     (duk_heaphdr *) obj, (duk_heaphdr *) key));\n\n\tif (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> no 'map'\"));\n\t\treturn 0;\n\t}\n\n\tmap = duk_require_hobject(thr, -1);\n\tDUK_ASSERT(map != NULL);\n\tduk_pop_unsafe(thr);  /* map is reachable through obj */\n\n\tif (!duk_hobject_get_own_propdesc(thr, map, key, temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> 'map' exists, but key not in map\"));\n\t\treturn 0;\n\t}\n\n\t/* [... varname] */\n\tDUK_DDD(DUK_DDDPRINT(\"-> 'map' exists, and contains key, key is mapped to argument/variable binding %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\tDUK_ASSERT(duk_is_string(thr, -1));  /* guaranteed when building arguments */\n\n\t/* get varenv for varname (callee's declarative lexical environment) */\n\trc = duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_VARENV(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE);\n\tDUK_UNREF(rc);\n\tDUK_ASSERT(rc != 0);  /* arguments MUST have an initialized lexical environment reference */\n\tvarenv = duk_require_hobject(thr, -1);\n\tDUK_ASSERT(varenv != NULL);\n\tduk_pop_unsafe(thr);  /* varenv remains reachable through 'obj' */\n\n\tDUK_DDD(DUK_DDDPRINT(\"arguments varenv is: %!dO\", (duk_heaphdr *) varenv));\n\n\t/* success: leave varname in stack */\n\t*out_map = map;\n\t*out_varenv = varenv;\n\treturn 1;  /* [... varname] */\n}\n\n/* Lookup 'key' from arguments internal 'map', and leave replacement value\n * on stack top if mapped (and return non-zero).\n * Used in E5 Section 10.6 algorithm for [[GetOwnProperty]] (used by [[Get]]).\n */\nDUK_LOCAL duk_bool_t duk__check_arguments_map_for_get(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) {\n\tduk_hobject *map;\n\tduk_hobject *varenv;\n\tduk_hstring *varname;\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tif (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"arguments: key not mapped, no exotic get behavior\"));\n\t\treturn 0;\n\t}\n\n\t/* [... varname] */\n\n\tvarname = duk_require_hstring(thr, -1);\n\tDUK_ASSERT(varname != NULL);\n\tduk_pop_unsafe(thr);  /* varname is still reachable */\n\n\tDUK_DDD(DUK_DDDPRINT(\"arguments object automatic getvar for a bound variable; \"\n\t                     \"key=%!O, varname=%!O\",\n\t                     (duk_heaphdr *) key,\n\t                     (duk_heaphdr *) varname));\n\n\t(void) duk_js_getvar_envrec(thr, varenv, varname, 1 /*throw*/);\n\n\t/* [... value this_binding] */\n\n\tduk_pop_unsafe(thr);\n\n\t/* leave result on stack top */\n\treturn 1;\n}\n\n/* Lookup 'key' from arguments internal 'map', perform a variable write if mapped.\n * Used in E5 Section 10.6 algorithm for [[DefineOwnProperty]] (used by [[Put]]).\n * Assumes stack top contains 'put' value (which is NOT popped).\n */\nDUK_LOCAL void duk__check_arguments_map_for_put(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc, duk_bool_t throw_flag) {\n\tduk_hobject *map;\n\tduk_hobject *varenv;\n\tduk_hstring *varname;\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tif (!duk__lookup_arguments_map(thr, obj, key, temp_desc, &map, &varenv)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"arguments: key not mapped, no exotic put behavior\"));\n\t\treturn;\n\t}\n\n\t/* [... put_value varname] */\n\n\tvarname = duk_require_hstring(thr, -1);\n\tDUK_ASSERT(varname != NULL);\n\tduk_pop_unsafe(thr);  /* varname is still reachable */\n\n\tDUK_DDD(DUK_DDDPRINT(\"arguments object automatic putvar for a bound variable; \"\n\t                     \"key=%!O, varname=%!O, value=%!T\",\n\t                     (duk_heaphdr *) key,\n\t                     (duk_heaphdr *) varname,\n\t                     (duk_tval *) duk_require_tval(thr, -1)));\n\n\t/* [... put_value] */\n\n\t/*\n\t *  Note: although arguments object variable mappings are only established\n\t *  for non-strict functions (and a call to a non-strict function created\n\t *  the arguments object in question), an inner strict function may be doing\n\t *  the actual property write.  Hence the throw_flag applied here comes from\n\t *  the property write call.\n\t */\n\n\tduk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, -1), throw_flag);\n\n\t/* [... put_value] */\n}\n\n/* Lookup 'key' from arguments internal 'map', delete mapping if found.\n * Used in E5 Section 10.6 algorithm for [[Delete]].  Note that the\n * variable/argument itself (where the map points) is not deleted.\n */\nDUK_LOCAL void duk__check_arguments_map_for_delete(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *temp_desc) {\n\tduk_hobject *map;\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tif (!duk_hobject_get_own_propdesc(thr, obj, DUK_HTHREAD_STRING_INT_MAP(thr), temp_desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"arguments: key not mapped, no exotic delete behavior\"));\n\t\treturn;\n\t}\n\n\tmap = duk_require_hobject(thr, -1);\n\tDUK_ASSERT(map != NULL);\n\tduk_pop_unsafe(thr);  /* map is reachable through obj */\n\n\tDUK_DDD(DUK_DDDPRINT(\"-> have 'map', delete key %!O from map (if exists)); ignore result\",\n\t                     (duk_heaphdr *) key));\n\n\t/* Note: no recursion issue, we can trust 'map' to behave */\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_BEHAVIOR(map));\n\tDUK_DDD(DUK_DDDPRINT(\"map before deletion: %!O\", (duk_heaphdr *) map));\n\t(void) duk_hobject_delprop_raw(thr, map, key, 0);  /* ignore result */\n\tDUK_DDD(DUK_DDDPRINT(\"map after deletion: %!O\", (duk_heaphdr *) map));\n}\n\n/*\n *  Ecmascript compliant [[GetOwnProperty]](P), for internal use only.\n *\n *  If property is found:\n *    - Fills descriptor fields to 'out_desc'\n *    - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the\n *      property onto the stack ('undefined' for accessor properties).\n *    - Returns non-zero\n *\n *  If property is not found:\n *    - 'out_desc' is left in untouched state (possibly garbage)\n *    - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE\n *      set)\n *    - Returns zero\n *\n *  Notes:\n *\n *    - Getting a property descriptor may cause an allocation (and hence\n *      GC) to take place, hence reachability and refcount of all related\n *      values matter.  Reallocation of value stack, properties, etc may\n *      invalidate many duk_tval pointers (concretely, those which reside\n *      in memory areas subject to reallocation).  However, heap object\n *      pointers are never affected (heap objects have stable pointers).\n *\n *    - The value of a plain property is always reachable and has a non-zero\n *      reference count.\n *\n *    - The value of a virtual property is not necessarily reachable from\n *      elsewhere and may have a refcount of zero.  Hence we push it onto\n *      the valstack for the caller, which ensures it remains reachable\n *      while it is needed.\n *\n *    - There are no virtual accessor properties.  Hence, all getters and\n *      setters are always related to concretely stored properties, which\n *      ensures that the get/set functions in the resulting descriptor are\n *      reachable and have non-zero refcounts.  Should there be virtual\n *      accessor properties later, this would need to change.\n */\n\nDUK_LOCAL duk_bool_t duk__get_own_propdesc_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_uint32_t arr_idx, duk_propdesc *out_desc, duk_small_uint_t flags) {\n\tduk_tval *tv;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk_hobject_get_own_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, \"\n\t                     \"arr_idx=%ld (obj -> %!O, key -> %!O)\",\n\t                     (void *) thr, (void *) obj, (void *) key, (void *) out_desc,\n\t                     (long) flags, (long) arr_idx,\n\t                     (duk_heaphdr *) obj, (duk_heaphdr *) key));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(out_desc != NULL);\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_STATS_INC(thr->heap, stats_getownpropdesc_count);\n\n\t/* Each code path returning 1 (= found) must fill in all the output\n\t * descriptor fields.  We don't do it beforehand because it'd be\n\t * unnecessary work if the property isn't found and would happen\n\t * multiple times for an inheritance chain.\n\t */\n\tDUK_ASSERT_SET_GARBAGE(out_desc, sizeof(*out_desc));\n#if 0\n\tout_desc->flags = 0;\n\tout_desc->get = NULL;\n\tout_desc->set = NULL;\n\tout_desc->e_idx = -1;\n\tout_desc->h_idx = -1;\n\tout_desc->a_idx = -1;\n#endif\n\n\t/*\n\t *  Try entries part first because it's the common case.\n\t *\n\t *  Array part lookups are usually handled by the array fast path, and\n\t *  are not usually inherited.  Array and entry parts never contain the\n\t *  same keys so the entry part vs. array part order doesn't matter.\n\t */\n\n\tif (duk_hobject_find_existing_entry(thr->heap, obj, key, &out_desc->e_idx, &out_desc->h_idx)) {\n\t\tduk_int_t e_idx = out_desc->e_idx;\n\t\tDUK_ASSERT(out_desc->e_idx >= 0);\n\t\tout_desc->a_idx = -1;\n\t\tout_desc->flags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, e_idx);\n\t\tout_desc->get = NULL;\n\t\tout_desc->set = NULL;\n\t\tif (DUK_UNLIKELY(out_desc->flags & DUK_PROPDESC_FLAG_ACCESSOR)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> found accessor property in entry part\"));\n\t\t\tout_desc->get = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, e_idx);\n\t\t\tout_desc->set = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, e_idx);\n\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\t/* a dummy undefined value is pushed to make valstack\n\t\t\t\t * behavior uniform for caller\n\t\t\t\t */\n\t\t\t\tduk_push_undefined(thr);\n\t\t\t}\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> found plain property in entry part\"));\n\t\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx);\n\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\tduk_push_tval(thr, tv);\n\t\t\t}\n\t\t}\n\t\tgoto prop_found;\n\t}\n\n\t/*\n\t *  Try array part.\n\t */\n\n\tif (DUK_HOBJECT_HAS_ARRAY_PART(obj) && arr_idx != DUK__NO_ARRAY_INDEX) {\n\t\tif (arr_idx < DUK_HOBJECT_GET_ASIZE(obj)) {\n\t\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx);\n\t\t\tif (!DUK_TVAL_IS_UNUSED(tv)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> found in array part\"));\n\t\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\t\tduk_push_tval(thr, tv);\n\t\t\t\t}\n\t\t\t\t/* implicit attributes */\n\t\t\t\tout_desc->flags = DUK_PROPDESC_FLAG_WRITABLE |\n\t\t\t\t                  DUK_PROPDESC_FLAG_CONFIGURABLE |\n\t\t\t\t                  DUK_PROPDESC_FLAG_ENUMERABLE;\n\t\t\t\tout_desc->get = NULL;\n\t\t\t\tout_desc->set = NULL;\n\t\t\t\tout_desc->e_idx = -1;\n\t\t\t\tout_desc->h_idx = -1;\n\t\t\t\tout_desc->a_idx = (duk_int_t) arr_idx;  /* XXX: limit 2G due to being signed */\n\t\t\t\tgoto prop_found;\n\t\t\t}\n\t\t}\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"-> not found as a concrete property\"));\n\n\t/*\n\t *  Not found as a concrete property, check for virtual properties.\n\t */\n\n\tif (!DUK_HOBJECT_HAS_VIRTUAL_PROPERTIES(obj)) {\n\t\t/* Quick skip. */\n\t\tgoto prop_not_found;\n\t}\n\n\tif (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {\n\t\tduk_harray *a;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"array object exotic property get for key: %!O, arr_idx: %ld\",\n\t\t                     (duk_heaphdr *) key, (long) arr_idx));\n\n\t\ta = (duk_harray *) obj;\n\t\tDUK_ASSERT_HARRAY_VALID(a);\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> found, key is 'length', length exotic behavior\"));\n\n\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\tduk_push_uint(thr, (duk_uint_t) a->length);\n\t\t\t}\n\t\t\tout_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL;\n\t\t\tif (DUK_HARRAY_LENGTH_WRITABLE(a)) {\n\t\t\t\tout_desc->flags |= DUK_PROPDESC_FLAG_WRITABLE;\n\t\t\t}\n\t\t\tout_desc->get = NULL;\n\t\t\tout_desc->set = NULL;\n\t\t\tout_desc->e_idx = -1;\n\t\t\tout_desc->h_idx = -1;\n\t\t\tout_desc->a_idx = -1;\n\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));\n\t\t\tgoto prop_found_noexotic;  /* cannot be arguments exotic */\n\t\t}\n\t} else if (DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"string object exotic property get for key: %!O, arr_idx: %ld\",\n\t\t                     (duk_heaphdr *) key, (long) arr_idx));\n\n\t\t/* XXX: charlen; avoid multiple lookups? */\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX) {\n\t\t\tduk_hstring *h_val;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"array index exists\"));\n\n\t\t\th_val = duk_hobject_get_internal_value_string(thr->heap, obj);\n\t\t\tDUK_ASSERT(h_val);\n\t\t\tif (arr_idx < DUK_HSTRING_GET_CHARLEN(h_val)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> found, array index inside string\"));\n\t\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\t\tduk_push_hstring(thr, h_val);\n\t\t\t\t\tduk_substring(thr, -1, arr_idx, arr_idx + 1);  /* [str] -> [substr] */\n\t\t\t\t}\n\t\t\t\tout_desc->flags = DUK_PROPDESC_FLAG_ENUMERABLE |  /* E5 Section 15.5.5.2 */\n\t\t\t\t                  DUK_PROPDESC_FLAG_VIRTUAL;\n\t\t\t\tout_desc->get = NULL;\n\t\t\t\tout_desc->set = NULL;\n\t\t\t\tout_desc->e_idx = -1;\n\t\t\t\tout_desc->h_idx = -1;\n\t\t\t\tout_desc->a_idx = -1;\n\n\t\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));\n\t\t\t\tgoto prop_found_noexotic;  /* cannot be arguments exotic */\n\t\t\t} else {\n\t\t\t\t/* index is above internal string length -> property is fully normal */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"array index outside string -> normal property\"));\n\t\t\t}\n\t\t} else if (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tduk_hstring *h_val;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> found, key is 'length', length exotic behavior\"));\n\n\t\t\th_val = duk_hobject_get_internal_value_string(thr->heap, obj);\n\t\t\tDUK_ASSERT(h_val != NULL);\n\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\tduk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h_val));\n\t\t\t}\n\t\t\tout_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL;  /* E5 Section 15.5.5.1 */\n\t\t\tout_desc->get = NULL;\n\t\t\tout_desc->set = NULL;\n\t\t\tout_desc->e_idx = -1;\n\t\t\tout_desc->h_idx = -1;\n\t\t\tout_desc->a_idx = -1;\n\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));\n\t\t\tgoto prop_found_noexotic;  /* cannot be arguments exotic */\n\t\t}\n\t}\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\telse if (DUK_HOBJECT_IS_BUFOBJ(obj)) {\n\t\tduk_hbufobj *h_bufobj;\n\t\tduk_uint_t byte_off;\n\t\tduk_small_uint_t elem_size;\n\n\t\th_bufobj = (duk_hbufobj *) obj;\n\t\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\t\tDUK_DDD(DUK_DDDPRINT(\"bufobj property get for key: %!O, arr_idx: %ld\",\n\t\t                     (duk_heaphdr *) key, (long) arr_idx));\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"array index exists\"));\n\n\t\t\t/* Careful with wrapping: arr_idx upshift may easily wrap, whereas\n\t\t\t * length downshift won't.\n\t\t\t */\n\t\t\tif (arr_idx < (h_bufobj->length >> h_bufobj->shift)) {\n\t\t\t\tbyte_off = arr_idx << h_bufobj->shift;  /* no wrap assuming h_bufobj->length is valid */\n\t\t\t\telem_size = (duk_small_uint_t) (1U << h_bufobj->shift);\n\t\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\t\tduk_uint8_t *data;\n\n\t\t\t\t\tif (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {\n\t\t\t\t\t\tdata = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;\n\t\t\t\t\t\tduk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDUK_D(DUK_DPRINT(\"bufobj access out of underlying buffer, ignoring (read zero)\"));\n\t\t\t\t\t\tduk_push_uint(thr, 0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tout_desc->flags = DUK_PROPDESC_FLAG_WRITABLE |\n\t\t\t\t                  DUK_PROPDESC_FLAG_VIRTUAL;\n\t\t\t\tif (DUK_HOBJECT_GET_CLASS_NUMBER(obj) != DUK_HOBJECT_CLASS_ARRAYBUFFER) {\n\t\t\t\t\t/* ArrayBuffer indices are non-standard and are\n\t\t\t\t\t * non-enumerable to avoid their serialization.\n\t\t\t\t\t */\n\t\t\t\t\tout_desc->flags |= DUK_PROPDESC_FLAG_ENUMERABLE;\n\t\t\t\t}\n\t\t\t\tout_desc->get = NULL;\n\t\t\t\tout_desc->set = NULL;\n\t\t\t\tout_desc->e_idx = -1;\n\t\t\t\tout_desc->h_idx = -1;\n\t\t\t\tout_desc->a_idx = -1;\n\n\t\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));\n\t\t\t\tgoto prop_found_noexotic;  /* cannot be e.g. arguments exotic, since exotic 'traits' are mutually exclusive */\n\t\t\t} else {\n\t\t\t\t/* index is above internal buffer length -> property is fully normal */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"array index outside buffer -> normal property\"));\n\t\t\t}\n\t\t} else if (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> found, key is 'length', length exotic behavior\"));\n\n\t\t\tif (flags & DUK_GETDESC_FLAG_PUSH_VALUE) {\n\t\t\t\t/* Length in elements: take into account shift, but\n\t\t\t\t * intentionally don't check the underlying buffer here.\n\t\t\t\t */\n\t\t\t\tduk_push_uint(thr, h_bufobj->length >> h_bufobj->shift);\n\t\t\t}\n\t\t\tout_desc->flags = DUK_PROPDESC_FLAG_VIRTUAL;\n\t\t\tout_desc->get = NULL;\n\t\t\tout_desc->set = NULL;\n\t\t\tout_desc->e_idx = -1;\n\t\t\tout_desc->h_idx = -1;\n\t\t\tout_desc->a_idx = -1;\n\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj));\n\t\t\tgoto prop_found_noexotic;  /* cannot be arguments exotic */\n\t\t}\n\t}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n\t/* Array properties have exotic behavior but they are concrete,\n\t * so no special handling here.\n\t *\n\t * Arguments exotic behavior (E5 Section 10.6, [[GetOwnProperty]]\n\t * is only relevant as a post-check implemented below; hence no\n\t * check here.\n\t */\n\n\t/*\n\t *  Not found as concrete or virtual.\n\t */\n\n prop_not_found:\n\tDUK_DDD(DUK_DDDPRINT(\"-> not found (virtual, entry part, or array part)\"));\n\tDUK_STATS_INC(thr->heap, stats_getownpropdesc_miss);\n\treturn 0;\n\n\t/*\n\t *  Found.\n\t *\n\t *  Arguments object has exotic post-processing, see E5 Section 10.6,\n\t *  description of [[GetOwnProperty]] variant for arguments.\n\t */\n\n prop_found:\n\tDUK_DDD(DUK_DDDPRINT(\"-> property found, checking for arguments exotic post-behavior\"));\n\n\t/* Notes:\n\t *  - Only numbered indices are relevant, so arr_idx fast reject is good\n\t *    (this is valid unless there are more than 4**32-1 arguments).\n\t *  - Since variable lookup has no side effects, this can be skipped if\n\t *    DUK_GETDESC_FLAG_PUSH_VALUE is not set.\n\t */\n\n\tif (DUK_UNLIKELY(DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) &&\n\t                 arr_idx != DUK__NO_ARRAY_INDEX &&\n\t                 (flags & DUK_GETDESC_FLAG_PUSH_VALUE))) {\n\t\tduk_propdesc temp_desc;\n\n\t\t/* Magically bound variable cannot be an accessor.  However,\n\t\t * there may be an accessor property (or a plain property) in\n\t\t * place with magic behavior removed.  This happens e.g. when\n\t\t * a magic property is redefined with defineProperty().\n\t\t * Cannot assert for \"not accessor\" here.\n\t\t */\n\n\t\t/* replaces top of stack with new value if necessary */\n\t\tDUK_ASSERT((flags & DUK_GETDESC_FLAG_PUSH_VALUE) != 0);\n\n\t\t/* This can perform a variable lookup but only into a declarative\n\t\t * environment which has no side effects.\n\t\t */\n\t\tif (duk__check_arguments_map_for_get(thr, obj, key, &temp_desc)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> arguments exotic behavior overrides result: %!T -> %!T\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\t/* [... old_result result] -> [... result] */\n\t\t\tduk_remove_m2(thr);\n\t\t}\n\t}\n\n prop_found_noexotic:\n\tDUK_STATS_INC(thr->heap, stats_getownpropdesc_hit);\n\treturn 1;\n}\n\nDUK_INTERNAL duk_bool_t duk_hobject_get_own_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(out_desc != NULL);\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\treturn duk__get_own_propdesc_raw(thr, obj, key, DUK_HSTRING_GET_ARRIDX_SLOW(key), out_desc, flags);\n}\n\n/*\n *  Ecmascript compliant [[GetProperty]](P), for internal use only.\n *\n *  If property is found:\n *    - Fills descriptor fields to 'out_desc'\n *    - If DUK_GETDESC_FLAG_PUSH_VALUE is set, pushes a value related to the\n *      property onto the stack ('undefined' for accessor properties).\n *    - Returns non-zero\n *\n *  If property is not found:\n *    - 'out_desc' is left in untouched state (possibly garbage)\n *    - Nothing is pushed onto the stack (not even with DUK_GETDESC_FLAG_PUSH_VALUE\n *      set)\n *    - Returns zero\n *\n *  May cause arbitrary side effects and invalidate (most) duk_tval\n *  pointers.\n */\n\nDUK_LOCAL duk_bool_t duk__get_propdesc(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_propdesc *out_desc, duk_small_uint_t flags) {\n\tduk_hobject *curr;\n\tduk_uint32_t arr_idx;\n\tduk_uint_t sanity;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(out_desc != NULL);\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_STATS_INC(thr->heap, stats_getpropdesc_count);\n\n\tarr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key);\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__get_propdesc: thr=%p, obj=%p, key=%p, out_desc=%p, flags=%lx, \"\n\t                     \"arr_idx=%ld (obj -> %!O, key -> %!O)\",\n\t                     (void *) thr, (void *) obj, (void *) key, (void *) out_desc,\n\t                     (long) flags, (long) arr_idx,\n\t                     (duk_heaphdr *) obj, (duk_heaphdr *) key));\n\n\tcurr = obj;\n\tDUK_ASSERT(curr != NULL);\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\tdo {\n\t\tif (duk__get_own_propdesc_raw(thr, curr, key, arr_idx, out_desc, flags)) {\n\t\t\t/* stack contains value (if requested), 'out_desc' is set */\n\t\t\tDUK_STATS_INC(thr->heap, stats_getpropdesc_hit);\n\t\t\treturn 1;\n\t\t}\n\n\t\t/* not found in 'curr', next in prototype chain; impose max depth */\n\t\tif (DUK_UNLIKELY(sanity-- == 0)) {\n\t\t\tif (flags & DUK_GETDESC_FLAG_IGNORE_PROTOLOOP) {\n\t\t\t\t/* treat like property not found */\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);\n\t\t\t}\n\t\t}\n\t\tcurr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);\n\t} while (curr != NULL);\n\n\t/* out_desc is left untouched (possibly garbage), caller must use return\n\t * value to determine whether out_desc can be looked up\n\t */\n\n\tDUK_STATS_INC(thr->heap, stats_getpropdesc_miss);\n\treturn 0;\n}\n\n/*\n *  Shallow fast path checks for accessing array elements with numeric\n *  indices.  The goal is to try to avoid coercing an array index to an\n *  (interned) string for the most common lookups, in particular, for\n *  standard Array objects.\n *\n *  Interning is avoided but only for a very narrow set of cases:\n *    - Object has array part, index is within array allocation, and\n *      value is not unused (= key exists)\n *    - Object has no interfering exotic behavior (e.g. arguments or\n *      string object exotic behaviors interfere, array exotic\n *      behavior does not).\n *\n *  Current shortcoming: if key does not exist (even if it is within\n *  the array allocation range) a slow path lookup with interning is\n *  always required.  This can probably be fixed so that there is a\n *  quick fast path for non-existent elements as well, at least for\n *  standard Array objects.\n */\n\n#if defined(DUK_USE_ARRAY_PROP_FASTPATH)\nDUK_LOCAL duk_tval *duk__getprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) {\n\tduk_tval *tv;\n\tduk_uint32_t idx;\n\n\tDUK_UNREF(thr);\n\n\tif (!(DUK_HOBJECT_HAS_ARRAY_PART(obj) &&\n\t     !DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj) &&\n\t     !DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(obj) &&\n\t     !DUK_HOBJECT_IS_BUFOBJ(obj) &&\n\t     !DUK_HOBJECT_IS_PROXY(obj))) {\n\t\t/* Must have array part and no conflicting exotic behaviors.\n\t\t * Doesn't need to have array special behavior, e.g. Arguments\n\t\t * object has array part.\n\t\t */\n\t\treturn NULL;\n\t}\n\n\t/* Arrays never have other exotic behaviors. */\n\n\tDUK_DDD(DUK_DDDPRINT(\"fast path attempt (no exotic string/arguments/buffer \"\n\t                     \"behavior, object has array part)\"));\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_key)) {\n\t\tidx = duk__tval_fastint_to_arr_idx(tv_key);\n\t} else\n#endif\n\tif (DUK_TVAL_IS_DOUBLE(tv_key)) {\n\t\tidx = duk__tval_number_to_arr_idx(tv_key);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"key is not a number\"));\n\t\treturn NULL;\n\t}\n\n\t/* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which\n\t * is 0xffffffffUL.  We don't need to check for that explicitly\n\t * because 0xffffffffUL will never be inside object 'a_size'.\n\t */\n\n\tif (idx >= DUK_HOBJECT_GET_ASIZE(obj)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"key is not an array index or outside array part\"));\n\t\treturn NULL;\n\t}\n\tDUK_ASSERT(idx != 0xffffffffUL);\n\tDUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);\n\n\t/* XXX: for array instances we could take a shortcut here and assume\n\t * Array.prototype doesn't contain an array index property.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"key is a valid array index and inside array part\"));\n\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx);\n\tif (!DUK_TVAL_IS_UNUSED(tv)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> fast path successful\"));\n\t\treturn tv;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"fast path attempt failed, fall back to slow path\"));\n\treturn NULL;\n}\n\nDUK_LOCAL duk_bool_t duk__putprop_shallow_fastpath_array_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) {\n\tduk_tval *tv;\n\tduk_harray *a;\n\tduk_uint32_t idx;\n\tduk_uint32_t old_len, new_len;\n\n\tif (!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj) &&\n\t      DUK_HOBJECT_HAS_ARRAY_PART(obj) &&\n\t      DUK_HOBJECT_HAS_EXTENSIBLE(obj))) {\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));  /* caller ensures */\n\n\ta = (duk_harray *) obj;\n\tDUK_ASSERT_HARRAY_VALID(a);\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_key)) {\n\t\tidx = duk__tval_fastint_to_arr_idx(tv_key);\n\t} else\n#endif\n\tif (DUK_TVAL_IS_DOUBLE(tv_key)) {\n\t\tidx = duk__tval_number_to_arr_idx(tv_key);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"key is not a number\"));\n\t\treturn 0;\n\t}\n\n\t/* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which\n\t * is 0xffffffffUL.  We don't need to check for that explicitly\n\t * because 0xffffffffUL will never be inside object 'a_size'.\n\t */\n\n\tif (idx >= DUK_HOBJECT_GET_ASIZE(obj)) {  /* for resizing of array part, use slow path */\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(idx != 0xffffffffUL);\n\tDUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);\n\n\told_len = a->length;\n\n\tif (idx >= old_len) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"write new array entry requires length update \"\n\t\t                     \"(arr_idx=%ld, old_len=%ld)\",\n\t\t                     (long) idx, (long) old_len));\n\t\tif (DUK_HARRAY_LENGTH_NONWRITABLE(a)) {\n\t\t\t/* The correct behavior here is either a silent error\n\t\t\t * or a TypeError, depending on strictness.  Fall back\n\t\t\t * to the slow path to handle the situation.\n\t\t\t */\n\t\t\treturn 0;\n\t\t}\n\t\tnew_len = idx + 1;\n\n\t\t((duk_harray *) obj)->length = new_len;\n\t}\n\n\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, idx);\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val);  /* side effects */\n\n\tDUK_DDD(DUK_DDDPRINT(\"array fast path success for index %ld\", (long) idx));\n\treturn 1;\n}\n#endif  /* DUK_USE_ARRAY_PROP_FASTPATH */\n\n/*\n *  Fast path for bufobj getprop/putprop\n */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_LOCAL duk_bool_t duk__getprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key) {\n\tduk_uint32_t idx;\n\tduk_hbufobj *h_bufobj;\n\tduk_uint_t byte_off;\n\tduk_small_uint_t elem_size;\n\tduk_uint8_t *data;\n\n\tif (!DUK_HOBJECT_IS_BUFOBJ(obj)) {\n\t\treturn 0;\n\t}\n\th_bufobj = (duk_hbufobj *) obj;\n\tif (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {\n\t\treturn 0;\n\t}\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_key)) {\n\t\tidx = duk__tval_fastint_to_arr_idx(tv_key);\n\t} else\n#endif\n\tif (DUK_TVAL_IS_DOUBLE(tv_key)) {\n\t\tidx = duk__tval_number_to_arr_idx(tv_key);\n\t} else {\n\t\treturn 0;\n\t}\n\n\t/* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which\n\t * is 0xffffffffUL.  We don't need to check for that explicitly\n\t * because 0xffffffffUL will never be inside bufobj length.\n\t */\n\n\t/* Careful with wrapping (left shifting idx would be unsafe). */\n\tif (idx >= (h_bufobj->length >> h_bufobj->shift)) {\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);\n\n\tbyte_off = idx << h_bufobj->shift;  /* no wrap assuming h_bufobj->length is valid */\n\telem_size = (duk_small_uint_t) (1U << h_bufobj->shift);\n\n\tif (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {\n\t\tdata = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;\n\t\tduk_hbufobj_push_validated_read(thr, h_bufobj, data, elem_size);\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"bufobj access out of underlying buffer, ignoring (read zero)\"));\n\t\tduk_push_uint(thr, 0);\n\t}\n\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\nDUK_LOCAL duk_bool_t duk__putprop_fastpath_bufobj_tval(duk_hthread *thr, duk_hobject *obj, duk_tval *tv_key, duk_tval *tv_val) {\n\tduk_uint32_t idx;\n\tduk_hbufobj *h_bufobj;\n\tduk_uint_t byte_off;\n\tduk_small_uint_t elem_size;\n\tduk_uint8_t *data;\n\n\tif (!(DUK_HOBJECT_IS_BUFOBJ(obj) &&\n\t      DUK_TVAL_IS_NUMBER(tv_val))) {\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));  /* caller ensures; rom objects are never bufobjs now */\n\n\th_bufobj = (duk_hbufobj *) obj;\n\tif (!DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {\n\t\treturn 0;\n\t}\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_key)) {\n\t\tidx = duk__tval_fastint_to_arr_idx(tv_key);\n\t} else\n#endif\n\tif (DUK_TVAL_IS_DOUBLE(tv_key)) {\n\t\tidx = duk__tval_number_to_arr_idx(tv_key);\n\t} else {\n\t\treturn 0;\n\t}\n\n\t/* If index is not valid, idx will be DUK__NO_ARRAY_INDEX which\n\t * is 0xffffffffUL.  We don't need to check for that explicitly\n\t * because 0xffffffffUL will never be inside bufobj length.\n\t */\n\n\t/* Careful with wrapping (left shifting idx would be unsafe). */\n\tif (idx >= (h_bufobj->length >> h_bufobj->shift)) {\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(idx != DUK__NO_ARRAY_INDEX);\n\n\tbyte_off = idx << h_bufobj->shift;  /* no wrap assuming h_bufobj->length is valid */\n\telem_size = (duk_small_uint_t) (1U << h_bufobj->shift);\n\n\t/* Value is required to be a number in the fast path so there\n\t * are no side effects in write coercion.\n\t */\n\tduk_push_tval(thr, tv_val);\n\tDUK_ASSERT(duk_is_number(thr, -1));\n\n\tif (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {\n\t\tdata = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;\n\t\tduk_hbufobj_validated_write(thr, h_bufobj, data, elem_size);\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"bufobj access out of underlying buffer, ignoring (write skipped)\"));\n\t}\n\n\tduk_pop_unsafe(thr);\n\treturn 1;\n}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n/*\n *  GETPROP: Ecmascript property read.\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_getprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) {\n\tduk_tval tv_obj_copy;\n\tduk_tval tv_key_copy;\n\tduk_hobject *curr = NULL;\n\tduk_hstring *key = NULL;\n\tduk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX;\n\tduk_propdesc desc;\n\tduk_uint_t sanity;\n\n\tDUK_DDD(DUK_DDDPRINT(\"getprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)\",\n\t                     (void *) thr, (void *) tv_obj, (void *) tv_key,\n\t                     (duk_tval *) tv_obj, (duk_tval *) tv_key));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(tv_obj != NULL);\n\tDUK_ASSERT(tv_key != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_STATS_INC(thr->heap, stats_getprop_all);\n\n\t/*\n\t *  Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of\n\t *  them being invalidated by a valstack resize.\n\t *\n\t *  XXX: this is now an overkill for many fast paths.  Rework this\n\t *  to be faster (although switching to a valstack discipline might\n\t *  be a better solution overall).\n\t */\n\n\tDUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj);\n\tDUK_TVAL_SET_TVAL(&tv_key_copy, tv_key);\n\ttv_obj = &tv_obj_copy;\n\ttv_key = &tv_key_copy;\n\n\t/*\n\t *  Coercion and fast path processing\n\t */\n\n\tswitch (DUK_TVAL_GET_TAG(tv_obj)) {\n\tcase DUK_TAG_UNDEFINED:\n\tcase DUK_TAG_NULL: {\n\t\t/* Note: unconditional throw */\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is undefined or null -> reject\"));\n#if defined(DUK_USE_PARANOID_ERRORS)\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);\n#else\n\t\tDUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, \"cannot read property %s of %s\",\n\t\t               duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));\n#endif\n\t\treturn 0;\n\t}\n\n\tcase DUK_TAG_BOOLEAN: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a boolean, start lookup from boolean prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE];\n\t\tbreak;\n\t}\n\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv_obj);\n\t\tduk_int_t pop_count;\n\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\t/* Symbols (ES2015 or hidden) don't have virtual properties. */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a symbol, start lookup from symbol prototype\"));\n\t\t\tcurr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE];\n\t\t\tbreak;\n\t\t}\n\n#if defined(DUK_USE_FASTINT)\n\t\tif (DUK_TVAL_IS_FASTINT(tv_key)) {\n\t\t\tarr_idx = duk__tval_fastint_to_arr_idx(tv_key);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object string, key is a fast-path fastint; arr_idx %ld\", (long) arr_idx));\n\t\t\tpop_count = 0;\n\t\t} else\n#endif\n\t\tif (DUK_TVAL_IS_NUMBER(tv_key)) {\n\t\t\tarr_idx = duk__tval_number_to_arr_idx(tv_key);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object string, key is a fast-path number; arr_idx %ld\", (long) arr_idx));\n\t\t\tpop_count = 0;\n\t\t} else {\n\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\tDUK_ASSERT(key != NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object string, key is a non-fast-path number; after \"\n\t\t\t                     \"coercion key is %!T, arr_idx %ld\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));\n\t\t\tpop_count = 1;\n\t\t}\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t\t    arr_idx < DUK_HSTRING_GET_CHARLEN(h)) {\n\t\t\tduk_pop_n_unsafe(thr, pop_count);\n\t\t\tduk_push_hstring(thr, h);\n\t\t\tduk_substring(thr, -1, arr_idx, arr_idx + 1);  /* [str] -> [substr] */\n\n\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_stringidx);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (base is string, key is an index inside string length \"\n\t\t\t                     \"after coercion -> return char)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (pop_count == 0) {\n\t\t\t/* This is a pretty awkward control flow, but we need to recheck the\n\t\t\t * key coercion here.\n\t\t\t */\n\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\tDUK_ASSERT(key != NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object string, key is a non-fast-path number; after \"\n\t\t\t                     \"coercion key is %!T, arr_idx %ld\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));\n\t\t}\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tduk_pop_unsafe(thr);  /* [key] -> [] */\n\t\t\tduk_push_uint(thr, (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h));  /* [] -> [res] */\n\n\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_stringlen);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (base is string, key is 'length' after coercion -> \"\n\t\t\t                     \"return string length)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\treturn 1;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a string, start lookup from string prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE];\n\t\tgoto lookup;  /* avoid double coercion */\n\t}\n\n\tcase DUK_TAG_OBJECT: {\n#if defined(DUK_USE_ARRAY_PROP_FASTPATH)\n\t\tduk_tval *tmp;\n#endif\n\n\t\tcurr = DUK_TVAL_GET_OBJECT(tv_obj);\n\t\tDUK_ASSERT(curr != NULL);\n\n\t\t/* XXX: array .length fast path (important in e.g. loops)? */\n\n#if defined(DUK_USE_ARRAY_PROP_FASTPATH)\n\t\ttmp = duk__getprop_shallow_fastpath_array_tval(thr, curr, tv_key);\n\t\tif (tmp) {\n\t\t\tduk_push_tval(thr, tmp);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (base is object, key is a number, array part \"\n\t\t\t                     \"fast path)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_arrayidx);\n\t\t\treturn 1;\n\t\t}\n#endif\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\tif (duk__getprop_fastpath_bufobj_tval(thr, curr, tv_key) != 0) {\n\t\t\t/* Read value pushed on stack. */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (base is bufobj, key is a number, bufobj \"\n\t\t\t                     \"fast path)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_bufobjidx);\n\t\t\treturn 1;\n\t\t}\n#endif\n\n#if defined(DUK_USE_ES6_PROXY)\n\t\tif (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(curr))) {\n\t\t\tduk_hobject *h_target;\n\n\t\t\tif (duk__proxy_check_prop(thr, curr, DUK_STRIDX_GET, tv_key, &h_target)) {\n\t\t\t\t/* -> [ ... trap handler ] */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> proxy object 'get' for key %!T\", (duk_tval *) tv_key));\n\t\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_proxy);\n\t\t\t\tduk_push_hobject(thr, h_target);  /* target */\n\t\t\t\tduk_push_tval(thr, tv_key);       /* P */\n\t\t\t\tduk_push_tval(thr, tv_obj);       /* Receiver: Proxy object */\n\t\t\t\tduk_call_method(thr, 3 /*nargs*/);\n\n\t\t\t\t/* Target object must be checked for a conflicting\n\t\t\t\t * non-configurable property.\n\t\t\t\t */\n\t\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\t\tDUK_ASSERT(key != NULL);\n\n\t\t\t\tif (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\t\t\t\tduk_tval *tv_hook = duk_require_tval(thr, -3);  /* value from hook */\n\t\t\t\t\tduk_tval *tv_targ = duk_require_tval(thr, -1);  /* value from target */\n\t\t\t\t\tduk_bool_t datadesc_reject;\n\t\t\t\t\tduk_bool_t accdesc_reject;\n\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"proxy 'get': target has matching property %!O, check for \"\n\t\t\t\t\t                     \"conflicting property; tv_hook=%!T, tv_targ=%!T, desc.flags=0x%08lx, \"\n\t\t\t\t\t                     \"desc.get=%p, desc.set=%p\",\n\t\t\t\t\t                     (duk_heaphdr *) key, (duk_tval *) tv_hook, (duk_tval *) tv_targ,\n\t\t\t\t\t                     (unsigned long) desc.flags,\n\t\t\t\t\t                     (void *) desc.get, (void *) desc.set));\n\n\t\t\t\t\tdatadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&\n\t\t\t\t\t                  !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&\n\t\t\t\t\t                  !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) &&\n\t\t\t\t\t                  !duk_js_samevalue(tv_hook, tv_targ);\n\t\t\t\t\taccdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&\n\t\t\t\t\t                 !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&\n\t\t\t\t\t                 (desc.get == NULL) &&\n\t\t\t\t\t                 !DUK_TVAL_IS_UNDEFINED(tv_hook);\n\t\t\t\t\tif (datadesc_reject || accdesc_reject) {\n\t\t\t\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);\n\t\t\t\t\t}\n\n\t\t\t\t\tduk_pop_2_unsafe(thr);\n\t\t\t\t} else {\n\t\t\t\t\tduk_pop_unsafe(thr);\n\t\t\t\t}\n\t\t\t\treturn 1;  /* return value */\n\t\t\t}\n\n\t\t\tcurr = h_target;  /* resume lookup from target */\n\t\t\tDUK_TVAL_SET_OBJECT(tv_obj, curr);\n\t\t}\n#endif  /* DUK_USE_ES6_PROXY */\n\n\t\tif (DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(curr)) {\n\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\tDUK_ASSERT(key != NULL);\n\n\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_arguments);\n\t\t\tif (duk__check_arguments_map_for_get(thr, curr, key, &desc)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (base is object with arguments exotic behavior, \"\n\t\t\t\t                     \"key matches magically bound property -> skip standard \"\n\t\t\t\t                     \"Get with replacement value)\",\n\t\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t\t\t\t/* no need for 'caller' post-check, because 'key' must be an array index */\n\n\t\t\t\tduk_remove_m2(thr);  /* [key result] -> [result] */\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tgoto lookup;  /* avoid double coercion */\n\t\t}\n\t\tbreak;\n\t}\n\n\t/* Buffer has virtual properties similar to string, but indexed values\n\t * are numbers, not 1-byte buffers/strings which would perform badly.\n\t */\n\tcase DUK_TAG_BUFFER: {\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj);\n\t\tduk_int_t pop_count;\n\n\t\t/*\n\t\t *  Because buffer values are often looped over, a number fast path\n\t\t *  is important.\n\t\t */\n\n#if defined(DUK_USE_FASTINT)\n\t\tif (DUK_TVAL_IS_FASTINT(tv_key)) {\n\t\t\tarr_idx = duk__tval_fastint_to_arr_idx(tv_key);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a fast-path fastint; arr_idx %ld\", (long) arr_idx));\n\t\t\tpop_count = 0;\n\t\t}\n\t\telse\n#endif\n\t\tif (DUK_TVAL_IS_NUMBER(tv_key)) {\n\t\t\tarr_idx = duk__tval_number_to_arr_idx(tv_key);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a fast-path number; arr_idx %ld\", (long) arr_idx));\n\t\t\tpop_count = 0;\n\t\t} else {\n\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\tDUK_ASSERT(key != NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a non-fast-path number; after \"\n\t\t\t                     \"coercion key is %!T, arr_idx %ld\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));\n\t\t\tpop_count = 1;\n\t\t}\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t\t    arr_idx < DUK_HBUFFER_GET_SIZE(h)) {\n\t\t\tduk_pop_n_unsafe(thr, pop_count);\n\t\t\tduk_push_uint(thr, ((duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h))[arr_idx]);\n\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_bufferidx);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (base is buffer, key is an index inside buffer length \"\n\t\t\t                     \"after coercion -> return byte as number)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (pop_count == 0) {\n\t\t\t/* This is a pretty awkward control flow, but we need to recheck the\n\t\t\t * key coercion here.\n\t\t\t */\n\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\tDUK_ASSERT(key != NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a non-fast-path number; after \"\n\t\t\t                     \"coercion key is %!T, arr_idx %ld\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));\n\t\t}\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tduk_pop_unsafe(thr);  /* [key] -> [] */\n\t\t\tduk_push_uint(thr, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h));  /* [] -> [res] */\n\t\t\tDUK_STATS_INC(thr->heap, stats_getprop_bufferlen);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (base is buffer, key is 'length' \"\n\t\t\t                     \"after coercion -> return buffer length)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\treturn 1;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a buffer, start lookup from Uint8Array prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];\n\t\tgoto lookup;  /* avoid double coercion */\n\t}\n\n\tcase DUK_TAG_POINTER: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a pointer, start lookup from pointer prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE];\n\t\tbreak;\n\t}\n\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\t/* Lightfuncs inherit getter .name and .length from %NativeFunctionPrototype%. */\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a lightfunc, start lookup from function prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE];\n\t\tbreak;\n\t}\n\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault: {\n\t\t/* number */\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a number, start lookup from number prototype\"));\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_obj));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj));\n\t\tcurr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE];\n\t\tbreak;\n\t}\n\t}\n\n\t/* key coercion (unless already coerced above) */\n\tDUK_ASSERT(key == NULL);\n\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\tDUK_ASSERT(key != NULL);\n\t/*\n\t *  Property lookup\n\t */\n\n lookup:\n\t/* [key] (coerced) */\n\tDUK_ASSERT(curr != NULL);\n\tDUK_ASSERT(key != NULL);\n\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\tdo {\n\t\tif (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\t\tgoto next_in_chain;\n\t\t}\n\n\t\tif (desc.get != NULL) {\n\t\t\t/* accessor with defined getter */\n\t\t\tDUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) != 0);\n\n\t\t\tduk_pop_unsafe(thr);              /* [key undefined] -> [key] */\n\t\t\tduk_push_hobject(thr, desc.get);\n\t\t\tduk_push_tval(thr, tv_obj);       /* note: original, uncoerced base */\n#if defined(DUK_USE_NONSTD_GETTER_KEY_ARGUMENT)\n\t\t\tduk_dup_m3(thr);\n\t\t\tduk_call_method(thr, 1);          /* [key getter this key] -> [key retval] */\n#else\n\t\t\tduk_call_method(thr, 0);          /* [key getter this] -> [key retval] */\n#endif\n\t\t} else {\n\t\t\t/* [key value] or [key undefined] */\n\n\t\t\t/* data property or accessor without getter */\n\t\t\tDUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) ||\n\t\t\t           (desc.get == NULL));\n\n\t\t\t/* if accessor without getter, return value is undefined */\n\t\t\tDUK_ASSERT(((desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) == 0) ||\n\t\t\t           duk_is_undefined(thr, -1));\n\n\t\t\t/* Note: for an accessor without getter, falling through to\n\t\t\t * check for \"caller\" exotic behavior is unnecessary as\n\t\t\t * \"undefined\" will never activate the behavior.  But it does\n\t\t\t * no harm, so we'll do it anyway.\n\t\t\t */\n\t\t}\n\n\t\tgoto found;  /* [key result] */\n\n\t next_in_chain:\n\t\t/* XXX: option to pretend property doesn't exist if sanity limit is\n\t\t * hit might be useful.\n\t\t */\n\t\tif (DUK_UNLIKELY(sanity-- == 0)) {\n\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);\n\t\t}\n\t\tcurr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);\n\t} while (curr != NULL);\n\n\t/*\n\t *  Not found\n\t */\n\n\tduk_to_undefined(thr, -1);  /* [key] -> [undefined] (default value) */\n\n\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (not found)\", (duk_tval *) duk_get_tval(thr, -1)));\n\treturn 0;\n\n\t/*\n\t *  Found; post-processing (Function and arguments objects)\n\t */\n\n found:\n\t/* [key result] */\n\n#if !defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\t/* Special behavior for 'caller' property of (non-bound) function objects\n\t * and non-strict Arguments objects: if 'caller' -value- (!) is a strict\n\t * mode function, throw a TypeError (E5 Sections 15.3.5.4, 10.6).\n\t * Quite interestingly, a non-strict function with no formal arguments\n\t * will get an arguments object -without- special 'caller' behavior!\n\t *\n\t * The E5.1 spec is a bit ambiguous if this special behavior applies when\n\t * a bound function is the base value (not the 'caller' value): Section\n\t * 15.3.4.5 (describing bind()) states that [[Get]] for bound functions\n\t * matches that of Section 15.3.5.4 ([[Get]] for Function instances).\n\t * However, Section 13.3.5.4 has \"NOTE: Function objects created using\n\t * Function.prototype.bind use the default [[Get]] internal method.\"\n\t * The current implementation assumes this means that bound functions\n\t * should not have the special [[Get]] behavior.\n\t *\n\t * The E5.1 spec is also a bit unclear if the TypeError throwing is\n\t * applied if the 'caller' value is a strict bound function.  The\n\t * current implementation will throw even for both strict non-bound\n\t * and strict bound functions.\n\t *\n\t * See test-dev-strict-func-as-caller-prop-value.js for quite extensive\n\t * tests.\n\t *\n\t * This exotic behavior is disabled when the non-standard 'caller' property\n\t * is enabled, as it conflicts with the free use of 'caller'.\n\t */\n\tif (key == DUK_HTHREAD_STRING_CALLER(thr) &&\n\t    DUK_TVAL_IS_OBJECT(tv_obj)) {\n\t\tduk_hobject *orig = DUK_TVAL_GET_OBJECT(tv_obj);\n\t\tDUK_ASSERT(orig != NULL);\n\n\t\tif (DUK_HOBJECT_IS_NONBOUND_FUNCTION(orig) ||\n\t\t    DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) {\n\t\t\tduk_hobject *h;\n\n\t\t\t/* XXX: The TypeError is currently not applied to bound\n\t\t\t * functions because the 'strict' flag is not copied by\n\t\t\t * bind().  This may or may not be correct, the specification\n\t\t\t * only refers to the value being a \"strict mode Function\n\t\t\t * object\" which is ambiguous.\n\t\t\t */\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(orig));\n\n\t\t\th = duk_get_hobject(thr, -1);  /* NULL if not an object */\n\t\t\tif (h &&\n\t\t\t    DUK_HOBJECT_IS_FUNCTION(h) &&\n\t\t\t    DUK_HOBJECT_HAS_STRICT(h)) {\n\t\t\t\t/* XXX: sufficient to check 'strict', assert for 'is function' */\n\t\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_STRICT_CALLER_READ);\n\t\t\t}\n\t\t}\n\t}\n#endif   /* !DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */\n\n\tduk_remove_m2(thr);  /* [key result] -> [result] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"-> %!T (found)\", (duk_tval *) duk_get_tval(thr, -1)));\n\treturn 1;\n}\n\n/*\n *  HASPROP: Ecmascript property existence check (\"in\" operator).\n *\n *  Interestingly, the 'in' operator does not do any coercion of\n *  the target object.\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_hasprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key) {\n\tduk_tval tv_key_copy;\n\tduk_hobject *obj;\n\tduk_hstring *key;\n\tduk_uint32_t arr_idx;\n\tduk_bool_t rc;\n\tduk_propdesc desc;\n\n\tDUK_DDD(DUK_DDDPRINT(\"hasprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)\",\n\t                     (void *) thr, (void *) tv_obj, (void *) tv_key,\n\t                     (duk_tval *) tv_obj, (duk_tval *) tv_key));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(tv_obj != NULL);\n\tDUK_ASSERT(tv_key != NULL);\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_TVAL_SET_TVAL(&tv_key_copy, tv_key);\n\ttv_key = &tv_key_copy;\n\n\t/*\n\t *  The 'in' operator requires an object as its right hand side,\n\t *  throwing a TypeError unconditionally if this is not the case.\n\t *\n\t *  However, lightfuncs need to behave like fully fledged objects\n\t *  here to be maximally transparent, so we need to handle them\n\t *  here.  Same goes for plain buffers which behave like ArrayBuffers.\n\t */\n\n\t/* XXX: Refactor key coercion so that it's only called once.  It can't\n\t * be trivially lifted here because the object must be type checked\n\t * first.\n\t */\n\n\tif (DUK_TVAL_IS_OBJECT(tv_obj)) {\n\t\tobj = DUK_TVAL_GET_OBJECT(tv_obj);\n\t\tDUK_ASSERT(obj != NULL);\n\n\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t} else if (DUK_TVAL_IS_BUFFER(tv_obj)) {\n\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\tif (duk__key_is_plain_buf_ownprop(thr, DUK_TVAL_GET_BUFFER(tv_obj), key, arr_idx)) {\n\t\t\trc = 1;\n\t\t\tgoto pop_and_return;\n\t\t}\n\t\tobj = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) {\n\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\n\t\t/* If not found, resume existence check from %NativeFunctionPrototype%.\n\t\t * We can just substitute the value in this case; nothing will\n\t\t * need the original base value (as would be the case with e.g.\n\t\t * setters/getters.\n\t\t */\n\t\tobj = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE];\n\t} else {\n\t\t/* Note: unconditional throw */\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is not an object -> reject\"));\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);\n\t}\n\n\t/* XXX: fast path for arrays? */\n\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_UNREF(arr_idx);\n\n#if defined(DUK_USE_ES6_PROXY)\n\tif (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) {\n\t\tduk_hobject *h_target;\n\t\tduk_bool_t tmp_bool;\n\n\t\t/* XXX: the key in 'key in obj' is string coerced before we're called\n\t\t * (which is the required behavior in E5/E5.1/E6) so the key is a string\n\t\t * here already.\n\t\t */\n\n\t\tif (duk__proxy_check_prop(thr, obj, DUK_STRIDX_HAS, tv_key, &h_target)) {\n\t\t\t/* [ ... key trap handler ] */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> proxy object 'has' for key %!T\", (duk_tval *) tv_key));\n\t\t\tduk_push_hobject(thr, h_target);  /* target */\n\t\t\tduk_push_tval(thr, tv_key);       /* P */\n\t\t\tduk_call_method(thr, 2 /*nargs*/);\n\t\t\ttmp_bool = duk_to_boolean(thr, -1);\n\t\t\tif (!tmp_bool) {\n\t\t\t\t/* Target object must be checked for a conflicting\n\t\t\t\t * non-configurable property.\n\t\t\t\t */\n\n\t\t\t\tif (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) {  /* don't push value */\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"proxy 'has': target has matching property %!O, check for \"\n\t\t\t\t\t                     \"conflicting property; desc.flags=0x%08lx, \"\n\t\t\t\t\t                     \"desc.get=%p, desc.set=%p\",\n\t\t\t\t\t                     (duk_heaphdr *) key, (unsigned long) desc.flags,\n\t\t\t\t\t                     (void *) desc.get, (void *) desc.set));\n\t\t\t\t\t/* XXX: Extensibility check for target uses IsExtensible().  If we\n\t\t\t\t\t * implemented the isExtensible trap and didn't reject proxies as\n\t\t\t\t\t * proxy targets, it should be respected here.\n\t\t\t\t\t */\n\t\t\t\t\tif (!((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&  /* property is configurable and */\n\t\t\t\t\t      DUK_HOBJECT_HAS_EXTENSIBLE(h_target))) {          /* ... target is extensible */\n\t\t\t\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tduk_pop_2_unsafe(thr);  /* [ key trap_result ] -> [] */\n\t\t\treturn tmp_bool;\n\t\t}\n\n\t\tobj = h_target;  /* resume check from proxy target */\n\t}\n#endif  /* DUK_USE_ES6_PROXY */\n\n\t/* XXX: inline into a prototype walking loop? */\n\n\trc = duk__get_propdesc(thr, obj, key, &desc, 0 /*flags*/);  /* don't push value */\n\t/* fall through */\n\n pop_and_return:\n\tduk_pop_unsafe(thr);  /* [ key ] -> [] */\n\treturn rc;\n}\n\n/*\n *  HASPROP variant used internally.\n *\n *  This primitive must never throw an error, callers rely on this.\n *  In particular, don't throw an error for prototype loops; instead,\n *  pretend like the property doesn't exist if a prototype sanity limit\n *  is reached.\n *\n *  Does not implement proxy behavior: if applied to a proxy object,\n *  returns key existence on the proxy object itself.\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_hasprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key) {\n\tduk_propdesc dummy;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\treturn duk__get_propdesc(thr, obj, key, &dummy, DUK_GETDESC_FLAG_IGNORE_PROTOLOOP);  /* don't push value */\n}\n\n/*\n *  Helper: handle Array object 'length' write which automatically\n *  deletes properties, see E5 Section 15.4.5.1, step 3.  This is\n *  quite tricky to get right.\n *\n *  Used by duk_hobject_putprop().\n */\n\n/* Coerce a new .length candidate to a number and check that it's a valid\n * .length.\n */\nDUK_LOCAL duk_uint32_t duk__to_new_array_length_checked(duk_hthread *thr, duk_tval *tv) {\n\tduk_uint32_t res;\n\tduk_double_t d;\n\n#if !defined(DUK_USE_PREFER_SIZE)\n#if defined(DUK_USE_FASTINT)\n\t/* When fastints are enabled, the most interesting case is assigning\n\t * a fastint to .length (e.g. arr.length = 0).\n\t */\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\t/* Very common case. */\n\t\tduk_int64_t fi;\n\t\tfi = DUK_TVAL_GET_FASTINT(tv);\n\t\tif (fi < 0 || fi > DUK_I64_CONSTANT(0xffffffff)) {\n\t\t\tgoto fail_range;\n\t\t}\n\t\treturn (duk_uint32_t) fi;\n\t}\n#else  /* DUK_USE_FASTINT */\n\t/* When fastints are not enabled, the most interesting case is any\n\t * number.\n\t */\n\tif (DUK_TVAL_IS_DOUBLE(tv)) {\n\t\td = DUK_TVAL_GET_NUMBER(tv);\n\t}\n#endif  /* DUK_USE_FASTINT */\n\telse\n#endif  /* !DUK_USE_PREFER_SIZE */\n\t{\n\t\t/* In all other cases, and when doing a size optimized build,\n\t\t * fall back to the comprehensive handler.\n\t\t */\n\t\td = duk_js_tonumber(thr, tv);\n\t}\n\n\t/* Refuse to update an Array's 'length' to a value outside the\n\t * 32-bit range.  Negative zero is accepted as zero.\n\t */\n\tres = (duk_uint32_t) d;\n\tif ((duk_double_t) res != d) {\n\t\tgoto fail_range;\n\t}\n\n\treturn res;\n\n fail_range:\n\tDUK_ERROR_RANGE(thr, DUK_STR_INVALID_ARRAY_LENGTH);\n\treturn 0;  /* unreachable */\n}\n\n/* Delete elements required by a smaller length, taking into account\n * potentially non-configurable elements.  Returns non-zero if all\n * elements could be deleted, and zero if all or some elements could\n * not be deleted.  Also writes final \"target length\" to 'out_result_len'.\n * This is the length value that should go into the 'length' property\n * (must be set by the caller).  Never throws an error.\n */\nDUK_LOCAL\nduk_bool_t duk__handle_put_array_length_smaller(duk_hthread *thr,\n                                                duk_hobject *obj,\n                                                duk_uint32_t old_len,\n                                                duk_uint32_t new_len,\n                                                duk_bool_t force_flag,\n                                                duk_uint32_t *out_result_len) {\n\tduk_uint32_t target_len;\n\tduk_uint_fast32_t i;\n\tduk_uint32_t arr_idx;\n\tduk_hstring *key;\n\tduk_tval *tv;\n\tduk_bool_t rc;\n\n\tDUK_DDD(DUK_DDDPRINT(\"new array length smaller than old (%ld -> %ld), \"\n\t                     \"probably need to remove elements\",\n\t                     (long) old_len, (long) new_len));\n\n\t/*\n\t *  New length is smaller than old length, need to delete properties above\n\t *  the new length.\n\t *\n\t *  If array part exists, this is straightforward: array entries cannot\n\t *  be non-configurable so this is guaranteed to work.\n\t *\n\t *  If array part does not exist, array-indexed values are scattered\n\t *  in the entry part, and some may not be configurable (preventing length\n\t *  from becoming lower than their index + 1).  To handle the algorithm\n\t *  in E5 Section 15.4.5.1, step l correctly, we scan the entire property\n\t *  set twice.\n\t */\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(new_len < old_len);\n\tDUK_ASSERT(out_result_len != NULL);\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj));\n\tDUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj));\n\n\tif (DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\t/*\n\t\t *  All defined array-indexed properties are in the array part\n\t\t *  (we assume the array part is comprehensive), and all array\n\t\t *  entries are writable, configurable, and enumerable.  Thus,\n\t\t *  nothing can prevent array entries from being deleted.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"have array part, easy case\"));\n\n\t\tif (old_len < DUK_HOBJECT_GET_ASIZE(obj)) {\n\t\t\t/* XXX: assertion that entries >= old_len are already unused */\n\t\t\ti = old_len;\n\t\t} else {\n\t\t\ti = DUK_HOBJECT_GET_ASIZE(obj);\n\t\t}\n\t\tDUK_ASSERT(i <= DUK_HOBJECT_GET_ASIZE(obj));\n\n\t\twhile (i > new_len) {\n\t\t\ti--;\n\t\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);\n\t\t\tDUK_TVAL_SET_UNUSED_UPDREF(thr, tv);  /* side effects */\n\t\t}\n\n\t\t*out_result_len = new_len;\n\t\treturn 1;\n\t} else {\n\t\t/*\n\t\t *  Entries part is a bit more complex.\n\t\t */\n\n\t\t/* Stage 1: find highest preventing non-configurable entry (if any).\n\t\t * When forcing, ignore non-configurability.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"no array part, slow case\"));\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"array length write, no array part, stage 1: find target_len \"\n\t\t                     \"(highest preventing non-configurable entry (if any))\"));\n\n\t\ttarget_len = new_len;\n\t\tif (force_flag) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"array length write, no array part; force flag -> skip stage 1\"));\n\t\t\tgoto skip_stage1;\n\t\t}\n\t\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\t\tkey = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i);\n\t\t\tif (!key) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"skip entry index %ld: null key\", (long) i));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!DUK_HSTRING_HAS_ARRIDX(key)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"skip entry index %ld: key not an array index\", (long) i));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tDUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key));  /* XXX: macro checks for array index flag, which is unnecessary here */\n\t\t\tarr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);\n\t\t\tDUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX);\n\t\t\tDUK_ASSERT(arr_idx < old_len);  /* consistency requires this */\n\n\t\t\tif (arr_idx < new_len) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"skip entry index %ld: key is array index %ld, below new_len\",\n\t\t\t\t                     (long) i, (long) arr_idx));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"skip entry index %ld: key is a relevant array index %ld, but configurable\",\n\t\t\t\t                     (long) i, (long) arr_idx));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* relevant array index is non-configurable, blocks write */\n\t\t\tif (arr_idx >= target_len) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"entry at index %ld has arr_idx %ld, is not configurable, \"\n\t\t\t\t                     \"update target_len %ld -> %ld\",\n\t\t\t\t                     (long) i, (long) arr_idx, (long) target_len,\n\t\t\t\t                     (long) (arr_idx + 1)));\n\t\t\t\ttarget_len = arr_idx + 1;\n\t\t\t}\n\t\t}\n\t skip_stage1:\n\n\t\t/* stage 2: delete configurable entries above target length */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"old_len=%ld, new_len=%ld, target_len=%ld\",\n\t\t                     (long) old_len, (long) new_len, (long) target_len));\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"array length write, no array part, stage 2: remove \"\n\t\t                     \"entries >= target_len\"));\n\n\t\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\t\tkey = DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i);\n\t\t\tif (!key) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"skip entry index %ld: null key\", (long) i));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!DUK_HSTRING_HAS_ARRIDX(key)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"skip entry index %ld: key not an array index\", (long) i));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tDUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(key));  /* XXX: macro checks for array index flag, which is unnecessary here */\n\t\t\tarr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);\n\t\t\tDUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX);\n\t\t\tDUK_ASSERT(arr_idx < old_len);  /* consistency requires this */\n\n\t\t\tif (arr_idx < target_len) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"skip entry index %ld: key is array index %ld, below target_len\",\n\t\t\t\t                     (long) i, (long) arr_idx));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tDUK_ASSERT(force_flag || DUK_HOBJECT_E_SLOT_IS_CONFIGURABLE(thr->heap, obj, i));  /* stage 1 guarantees */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"delete entry index %ld: key is array index %ld\",\n\t\t\t                     (long) i, (long) arr_idx));\n\n\t\t\t/*\n\t\t\t *  Slow delete, but we don't care as we're already in a very slow path.\n\t\t\t *  The delete always succeeds: key has no exotic behavior, property\n\t\t\t *  is configurable, and no resize occurs.\n\t\t\t */\n\t\t\trc = duk_hobject_delprop_raw(thr, obj, key, force_flag ? DUK_DELPROP_FLAG_FORCE : 0);\n\t\t\tDUK_UNREF(rc);\n\t\t\tDUK_ASSERT(rc != 0);\n\t\t}\n\n\t\t/* stage 3: update length (done by caller), decide return code */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"array length write, no array part, stage 3: update length (done by caller)\"));\n\n\t\t*out_result_len = target_len;\n\n\t\tif (target_len == new_len) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"target_len matches new_len, return success\"));\n\t\t\treturn 1;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"target_len does not match new_len (some entry prevented \"\n\t\t                     \"full length adjustment), return error\"));\n\t\treturn 0;\n\t}\n\n\tDUK_UNREACHABLE();\n}\n\n/* XXX: is valstack top best place for argument? */\nDUK_LOCAL duk_bool_t duk__handle_put_array_length(duk_hthread *thr, duk_hobject *obj) {\n\tduk_harray *a;\n\tduk_uint32_t old_len;\n\tduk_uint32_t new_len;\n\tduk_uint32_t result_len;\n\tduk_bool_t rc;\n\n\tDUK_DDD(DUK_DDDPRINT(\"handling a put operation to array 'length' exotic property, \"\n\t                     \"new val: %!T\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj));\n\tDUK_ASSERT(DUK_HOBJECT_IS_ARRAY(obj));\n\ta = (duk_harray *) obj;\n\tDUK_ASSERT_HARRAY_VALID(a);\n\n\tDUK_ASSERT(duk_is_valid_index(thr, -1));\n\n\t/*\n\t *  Get old and new length\n\t */\n\n\told_len = a->length;\n\tnew_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1));\n\tDUK_DDD(DUK_DDDPRINT(\"old_len=%ld, new_len=%ld\", (long) old_len, (long) new_len));\n\n\t/*\n\t *  Writability check\n\t */\n\n\tif (DUK_HARRAY_LENGTH_NONWRITABLE(a)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"length is not writable, fail\"));\n\t\treturn 0;\n\t}\n\n\t/*\n\t *  New length not lower than old length => no changes needed\n\t *  (not even array allocation).\n\t */\n\n\tif (new_len >= old_len) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"new length is same or higher than old length, just update length, no deletions\"));\n\t\ta->length = new_len;\n\t\treturn 1;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"new length is lower than old length, probably must delete entries\"));\n\n\t/*\n\t *  New length lower than old length => delete elements, then\n\t *  update length.\n\t *\n\t *  Note: even though a bunch of elements have been deleted, the 'desc' is\n\t *  still valid as properties haven't been resized (and entries compacted).\n\t */\n\n\trc = duk__handle_put_array_length_smaller(thr, obj, old_len, new_len, 0 /*force_flag*/, &result_len);\n\tDUK_ASSERT(result_len >= new_len && result_len <= old_len);\n\n\ta->length = result_len;\n\n\t/* XXX: shrink array allocation or entries compaction here? */\n\n\treturn rc;\n}\n\n/*\n *  PUTPROP: Ecmascript property write.\n *\n *  Unlike Ecmascript primitive which returns nothing, returns 1 to indicate\n *  success and 0 to indicate failure (assuming throw is not set).\n *\n *  This is an extremely tricky function.  Some examples:\n *\n *    * Currently a decref may trigger a GC, which may compact an object's\n *      property allocation.  Consequently, any entry indices (e_idx) will\n *      be potentially invalidated by a decref.\n *\n *    * Exotic behaviors (strings, arrays, arguments object) require,\n *      among other things:\n *\n *      - Preprocessing before and postprocessing after an actual property\n *        write.  For example, array index write requires pre-checking the\n *        array 'length' property for access control, and may require an\n *        array 'length' update after the actual write has succeeded (but\n *        not if it fails).\n *\n *      - Deletion of multiple entries, as a result of array 'length' write.\n *\n *    * Input values are taken as pointers which may point to the valstack.\n *      If valstack is resized because of the put (this may happen at least\n *      when the array part is abandoned), the pointers can be invalidated.\n *      (We currently make a copy of all of the input values to avoid issues.)\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_putprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_tval *tv_val, duk_bool_t throw_flag) {\n\tduk_tval tv_obj_copy;\n\tduk_tval tv_key_copy;\n\tduk_tval tv_val_copy;\n\tduk_hobject *orig = NULL;  /* NULL if tv_obj is primitive */\n\tduk_hobject *curr;\n\tduk_hstring *key = NULL;\n\tduk_propdesc desc;\n\tduk_tval *tv;\n\tduk_uint32_t arr_idx;\n\tduk_bool_t rc;\n\tduk_int_t e_idx;\n\tduk_uint_t sanity;\n\tduk_uint32_t new_array_length = 0;  /* 0 = no update */\n\n\tDUK_DDD(DUK_DDDPRINT(\"putprop: thr=%p, obj=%p, key=%p, val=%p, throw=%ld \"\n\t                     \"(obj -> %!T, key -> %!T, val -> %!T)\",\n\t                     (void *) thr, (void *) tv_obj, (void *) tv_key, (void *) tv_val,\n\t                     (long) throw_flag, (duk_tval *) tv_obj, (duk_tval *) tv_key, (duk_tval *) tv_val));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(tv_obj != NULL);\n\tDUK_ASSERT(tv_key != NULL);\n\tDUK_ASSERT(tv_val != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tDUK_STATS_INC(thr->heap, stats_putprop_all);\n\n\t/*\n\t *  Make a copy of tv_obj, tv_key, and tv_val to avoid any issues of\n\t *  them being invalidated by a valstack resize.\n\t *\n\t *  XXX: this is an overkill for some paths, so optimize this later\n\t *  (or maybe switch to a stack arguments model entirely).\n\t */\n\n\tDUK_TVAL_SET_TVAL(&tv_obj_copy, tv_obj);\n\tDUK_TVAL_SET_TVAL(&tv_key_copy, tv_key);\n\tDUK_TVAL_SET_TVAL(&tv_val_copy, tv_val);\n\ttv_obj = &tv_obj_copy;\n\ttv_key = &tv_key_copy;\n\ttv_val = &tv_val_copy;\n\n\t/*\n\t *  Coercion and fast path processing.\n\t */\n\n\tswitch (DUK_TVAL_GET_TAG(tv_obj)) {\n\tcase DUK_TAG_UNDEFINED:\n\tcase DUK_TAG_NULL: {\n\t\t/* Note: unconditional throw */\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is undefined or null -> reject (object=%!iT)\",\n\t\t                     (duk_tval *) tv_obj));\n#if defined(DUK_USE_PARANOID_ERRORS)\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);\n#else\n\t\tDUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, \"cannot write property %s of %s\",\n\t\t               duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));\n#endif\n\t\treturn 0;\n\t}\n\n\tcase DUK_TAG_BOOLEAN: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a boolean, start lookup from boolean prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE];\n\t\tbreak;\n\t}\n\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv_obj);\n\n\t\t/*\n\t\t *  Note: currently no fast path for array index writes.\n\t\t *  They won't be possible anyway as strings are immutable.\n\t\t */\n\n\t\tDUK_ASSERT(key == NULL);\n\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\tDUK_ASSERT(key != NULL);\n\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\t/* Symbols (ES2015 or hidden) don't have virtual properties. */\n\t\t\tcurr = thr->builtins[DUK_BIDX_SYMBOL_PROTOTYPE];\n\t\t\tgoto lookup;\n\t\t}\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tgoto fail_not_writable;\n\t\t}\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t\t    arr_idx < DUK_HSTRING_GET_CHARLEN(h)) {\n\t\t\tgoto fail_not_writable;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a string, start lookup from string prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_STRING_PROTOTYPE];\n\t\tgoto lookup;  /* avoid double coercion */\n\t}\n\n\tcase DUK_TAG_OBJECT: {\n\t\torig = DUK_TVAL_GET_OBJECT(tv_obj);\n\t\tDUK_ASSERT(orig != NULL);\n\n#if defined(DUK_USE_ROM_OBJECTS)\n\t\t/* With this check in place fast paths won't need read-only\n\t\t * object checks.  This is technically incorrect if there are\n\t\t * setters that cause no writes to ROM objects, but current\n\t\t * built-ins don't have such setters.\n\t\t */\n\t\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"attempt to putprop on read-only target object\"));\n\t\t\tgoto fail_not_writable_no_pop;  /* Must avoid duk_pop() in exit path */\n\t\t}\n#endif\n\n\t\t/* The fast path for array property put is not fully compliant:\n\t\t * If one places conflicting number-indexed properties into\n\t\t * Array.prototype (for example, a non-writable Array.prototype[7])\n\t\t * the fast path will incorrectly ignore them.\n\t\t *\n\t\t * This fast path could be made compliant by falling through\n\t\t * to the slow path if the previous value was UNUSED.  This would\n\t\t * also remove the need to check for extensibility.  Right now a\n\t\t * non-extensible array is slower than an extensible one as far\n\t\t * as writes are concerned.\n\t\t *\n\t\t * The fast path behavior is documented in more detail here:\n\t\t * tests/ecmascript/test-misc-array-fast-write.js\n\t\t */\n\n\t\t/* XXX: array .length? */\n\n#if defined(DUK_USE_ARRAY_PROP_FASTPATH)\n\t\tif (duk__putprop_shallow_fastpath_array_tval(thr, orig, tv_key, tv_val) != 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"array fast path success\"));\n\t\t\tDUK_STATS_INC(thr->heap, stats_putprop_arrayidx);\n\t\t\treturn 1;\n\t\t}\n#endif\n\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\tif (duk__putprop_fastpath_bufobj_tval(thr, orig, tv_key, tv_val) != 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base is bufobj, key is a number, bufobj fast path\"));\n\t\t\tDUK_STATS_INC(thr->heap, stats_putprop_bufobjidx);\n\t\t\treturn 1;\n\t\t}\n#endif\n\n#if defined(DUK_USE_ES6_PROXY)\n\t\tif (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(orig))) {\n\t\t\tduk_hobject *h_target;\n\t\t\tduk_bool_t tmp_bool;\n\n\t\t\tif (duk__proxy_check_prop(thr, orig, DUK_STRIDX_SET, tv_key, &h_target)) {\n\t\t\t\t/* -> [ ... trap handler ] */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> proxy object 'set' for key %!T\", (duk_tval *) tv_key));\n\t\t\t\tDUK_STATS_INC(thr->heap, stats_putprop_proxy);\n\t\t\t\tduk_push_hobject(thr, h_target);  /* target */\n\t\t\t\tduk_push_tval(thr, tv_key);       /* P */\n\t\t\t\tduk_push_tval(thr, tv_val);       /* V */\n\t\t\t\tduk_push_tval(thr, tv_obj);       /* Receiver: Proxy object */\n\t\t\t\tduk_call_method(thr, 4 /*nargs*/);\n\t\t\t\ttmp_bool = duk_to_boolean(thr, -1);\n\t\t\t\tduk_pop_nodecref_unsafe(thr);\n\t\t\t\tif (!tmp_bool) {\n\t\t\t\t\tgoto fail_proxy_rejected;\n\t\t\t\t}\n\n\t\t\t\t/* Target object must be checked for a conflicting\n\t\t\t\t * non-configurable property.\n\t\t\t\t */\n\t\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\t\tDUK_ASSERT(key != NULL);\n\n\t\t\t\tif (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\t\t\t\tduk_tval *tv_targ = duk_require_tval(thr, -1);\n\t\t\t\t\tduk_bool_t datadesc_reject;\n\t\t\t\t\tduk_bool_t accdesc_reject;\n\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"proxy 'set': target has matching property %!O, check for \"\n\t\t\t\t\t                     \"conflicting property; tv_val=%!T, tv_targ=%!T, desc.flags=0x%08lx, \"\n\t\t\t\t\t                     \"desc.get=%p, desc.set=%p\",\n\t\t\t\t\t                     (duk_heaphdr *) key, (duk_tval *) tv_val, (duk_tval *) tv_targ,\n\t\t\t\t\t                     (unsigned long) desc.flags,\n\t\t\t\t\t                     (void *) desc.get, (void *) desc.set));\n\n\t\t\t\t\tdatadesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&\n\t\t\t\t\t                  !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&\n\t\t\t\t\t                  !(desc.flags & DUK_PROPDESC_FLAG_WRITABLE) &&\n\t\t\t\t\t                  !duk_js_samevalue(tv_val, tv_targ);\n\t\t\t\t\taccdesc_reject = (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) &&\n\t\t\t\t\t                 !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) &&\n\t\t\t\t\t                 (desc.set == NULL);\n\t\t\t\t\tif (datadesc_reject || accdesc_reject) {\n\t\t\t\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);\n\t\t\t\t\t}\n\n\t\t\t\t\tduk_pop_2_unsafe(thr);\n\t\t\t\t} else {\n\t\t\t\t\tduk_pop_unsafe(thr);\n\t\t\t\t}\n\t\t\t\treturn 1;  /* success */\n\t\t\t}\n\n\t\t\torig = h_target;  /* resume write to target */\n\t\t\tDUK_TVAL_SET_OBJECT(tv_obj, orig);\n\t\t}\n#endif  /* DUK_USE_ES6_PROXY */\n\n\t\tcurr = orig;\n\t\tbreak;\n\t}\n\n\tcase DUK_TAG_BUFFER: {\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj);\n\t\tduk_int_t pop_count = 0;\n\n\t\t/*\n\t\t *  Because buffer values may be looped over and read/written\n\t\t *  from, an array index fast path is important.\n\t\t */\n\n#if defined(DUK_USE_FASTINT)\n\t\tif (DUK_TVAL_IS_FASTINT(tv_key)) {\n\t\t\tarr_idx = duk__tval_fastint_to_arr_idx(tv_key);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a fast-path fastint; arr_idx %ld\", (long) arr_idx));\n\t\t\tpop_count = 0;\n\t\t} else\n#endif\n\t\tif (DUK_TVAL_IS_NUMBER(tv_key)) {\n\t\t\tarr_idx = duk__tval_number_to_arr_idx(tv_key);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a fast-path number; arr_idx %ld\", (long) arr_idx));\n\t\t\tpop_count = 0;\n\t\t} else {\n\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\tDUK_ASSERT(key != NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a non-fast-path number; after \"\n\t\t\t                     \"coercion key is %!T, arr_idx %ld\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));\n\t\t\tpop_count = 1;\n\t\t}\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t\t    arr_idx < DUK_HBUFFER_GET_SIZE(h)) {\n\t\t\tduk_uint8_t *data;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"writing to buffer data at index %ld\", (long) arr_idx));\n\t\t\tdata = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h);\n\n\t\t\t/* XXX: duk_to_int() ensures we'll get 8 lowest bits as\n\t\t\t * as input is within duk_int_t range (capped outside it).\n\t\t\t */\n#if defined(DUK_USE_FASTINT)\n\t\t\t/* Buffer writes are often integers. */\n\t\t\tif (DUK_TVAL_IS_FASTINT(tv_val)) {\n\t\t\t\tdata[arr_idx] = (duk_uint8_t) DUK_TVAL_GET_FASTINT_U32(tv_val);\n\t\t\t}\n\t\t\telse\n#endif\n\t\t\t{\n\t\t\t\tduk_push_tval(thr, tv_val);\n\t\t\t\tdata[arr_idx] = (duk_uint8_t) duk_to_uint32(thr, -1);\n\t\t\t\tpop_count++;\n\t\t\t}\n\n\t\t\tduk_pop_n_unsafe(thr, pop_count);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"result: success (buffer data write)\"));\n\t\t\tDUK_STATS_INC(thr->heap, stats_putprop_bufferidx);\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (pop_count == 0) {\n\t\t\t/* This is a pretty awkward control flow, but we need to recheck the\n\t\t\t * key coercion here.\n\t\t\t */\n\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\tDUK_ASSERT(key != NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"base object buffer, key is a non-fast-path number; after \"\n\t\t\t                     \"coercion key is %!T, arr_idx %ld\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1), (long) arr_idx));\n\t\t}\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tgoto fail_not_writable;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a buffer, start lookup from Uint8Array prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];\n\t\tgoto lookup;  /* avoid double coercion */\n\t}\n\n\tcase DUK_TAG_POINTER: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a pointer, start lookup from pointer prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE];\n\t\tbreak;\n\t}\n\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\t/* Lightfuncs have no own properties and are considered non-extensible.\n\t\t * However, the write may be captured by an inherited setter which\n\t\t * means we can't stop the lookup here.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a lightfunc, start lookup from function prototype\"));\n\t\tcurr = thr->builtins[DUK_BIDX_NATIVE_FUNCTION_PROTOTYPE];\n\t\tbreak;\n\t}\n\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault: {\n\t\t/* number */\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is a number, start lookup from number prototype\"));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_obj));\n\t\tcurr = thr->builtins[DUK_BIDX_NUMBER_PROTOTYPE];\n\t\tbreak;\n\t}\n\t}\n\n\tDUK_ASSERT(key == NULL);\n\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\tDUK_ASSERT(key != NULL);\n\n lookup:\n\n\t/*\n\t *  Check whether the property already exists in the prototype chain.\n\t *  Note that the actual write goes into the original base object\n\t *  (except if an accessor property captures the write).\n\t */\n\n\t/* [key] */\n\n\tDUK_ASSERT(curr != NULL);\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\tdo {\n\t\tif (!duk__get_own_propdesc_raw(thr, curr, key, arr_idx, &desc, 0 /*flags*/)) {  /* don't push value */\n\t\t\tgoto next_in_chain;\n\t\t}\n\n\t\tif (desc.flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\t/*\n\t\t\t *  Found existing accessor property (own or inherited).\n\t\t\t *  Call setter with 'this' set to orig, and value as the only argument.\n\t\t\t *  Setter calls are OK even for ROM objects.\n\t\t\t *\n\t\t\t *  Note: no exotic arguments object behavior, because [[Put]] never\n\t\t\t *  calls [[DefineOwnProperty]] (E5 Section 8.12.5, step 5.b).\n\t\t\t */\n\n\t\t\tduk_hobject *setter;\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"put to an own or inherited accessor, calling setter\"));\n\n\t\t\tsetter = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, curr, desc.e_idx);\n\t\t\tif (!setter) {\n\t\t\t\tgoto fail_no_setter;\n\t\t\t}\n\t\t\tduk_push_hobject(thr, setter);\n\t\t\tduk_push_tval(thr, tv_obj);  /* note: original, uncoerced base */\n\t\t\tduk_push_tval(thr, tv_val);  /* [key setter this val] */\n#if defined(DUK_USE_NONSTD_SETTER_KEY_ARGUMENT)\n\t\t\tduk_dup_m4(thr);\n\t\t\tduk_call_method(thr, 2);     /* [key setter this val key] -> [key retval] */\n#else\n\t\t\tduk_call_method(thr, 1);     /* [key setter this val] -> [key retval] */\n#endif\n\t\t\tduk_pop_unsafe(thr);         /* ignore retval -> [key] */\n\t\t\tgoto success_no_arguments_exotic;\n\t\t}\n\n\t\tif (orig == NULL) {\n\t\t\t/*\n\t\t\t *  Found existing own or inherited plain property, but original\n\t\t\t *  base is a primitive value.\n\t\t\t */\n\t\t\tDUK_DD(DUK_DDPRINT(\"attempt to create a new property in a primitive base object\"));\n\t\t\tgoto fail_base_primitive;\n\t\t}\n\n\t\tif (curr != orig) {\n\t\t\t/*\n\t\t\t *  Found existing inherited plain property.\n\t\t\t *  Do an access control check, and if OK, write\n\t\t\t *  new property to 'orig'.\n\t\t\t */\n\t\t\tif (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"found existing inherited plain property, but original object is not extensible\"));\n\t\t\t\tgoto fail_not_extensible;\n\t\t\t}\n\t\t\tif (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"found existing inherited plain property, original object is extensible, but inherited property is not writable\"));\n\t\t\t\tgoto fail_not_writable;\n\t\t\t}\n\t\t\tDUK_DD(DUK_DDPRINT(\"put to new property, object extensible, inherited property found and is writable\"));\n\t\t\tgoto create_new;\n\t\t} else {\n\t\t\t/*\n\t\t\t *  Found existing own (non-inherited) plain property.\n\t\t\t *  Do an access control check and update in place.\n\t\t\t */\n\n\t\t\tif (!(desc.flags & DUK_PROPDESC_FLAG_WRITABLE)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"found existing own (non-inherited) plain property, but property is not writable\"));\n\t\t\t\tgoto fail_not_writable;\n\t\t\t}\n\t\t\tif (desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"found existing own (non-inherited) virtual property, property is writable\"));\n\n\t\t\t\tif (DUK_HOBJECT_IS_ARRAY(curr)) {\n\t\t\t\t\t/*\n\t\t\t\t\t *  Write to 'length' of an array is a very complex case\n\t\t\t\t\t *  handled in a helper which updates both the array elements\n\t\t\t\t\t *  and writes the new 'length'.  The write may result in an\n\t\t\t\t\t *  unconditional RangeError or a partial write (indicated\n\t\t\t\t\t *  by a return code).\n\t\t\t\t\t *\n\t\t\t\t\t *  Note: the helper has an unnecessary writability check\n\t\t\t\t\t *  for 'length', we already know it is writable.\n\t\t\t\t\t */\n\t\t\t\t\tDUK_ASSERT(key == DUK_HTHREAD_STRING_LENGTH(thr));  /* only virtual array property */\n\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"writing existing 'length' property to array exotic, invoke complex helper\"));\n\n\t\t\t\t\t/* XXX: the helper currently assumes stack top contains new\n\t\t\t\t\t * 'length' value and the whole calling convention is not very\n\t\t\t\t\t * compatible with what we need.\n\t\t\t\t\t */\n\n\t\t\t\t\tduk_push_tval(thr, tv_val);  /* [key val] */\n\t\t\t\t\trc = duk__handle_put_array_length(thr, orig);\n\t\t\t\t\tduk_pop_unsafe(thr);  /* [key val] -> [key] */\n\t\t\t\t\tif (!rc) {\n\t\t\t\t\t\tgoto fail_array_length_partial;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* key is 'length', cannot match argument exotic behavior */\n\t\t\t\t\tgoto success_no_arguments_exotic;\n\t\t\t\t}\n#if defined(DUK_USE_BUFFEROBJECT_SUPPORT)\n\t\t\t\telse if (DUK_HOBJECT_IS_BUFOBJ(curr)) {\n\t\t\t\t\tduk_hbufobj *h_bufobj;\n\t\t\t\t\tduk_uint_t byte_off;\n\t\t\t\t\tduk_small_uint_t elem_size;\n\n\t\t\t\t\th_bufobj = (duk_hbufobj *) curr;\n\t\t\t\t\tDUK_ASSERT_HBUFOBJ_VALID(h_bufobj);\n\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"writable virtual property is in buffer object\"));\n\n\t\t\t\t\t/* Careful with wrapping: arr_idx upshift may easily wrap, whereas\n\t\t\t\t\t * length downshift won't.\n\t\t\t\t\t */\n\t\t\t\t\tif (arr_idx < (h_bufobj->length >> h_bufobj->shift) && DUK_HBUFOBJ_HAS_VIRTUAL_INDICES(h_bufobj)) {\n\t\t\t\t\t\tduk_uint8_t *data;\n\t\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"writing to buffer data at index %ld\", (long) arr_idx));\n\n\t\t\t\t\t\tDUK_ASSERT(arr_idx != DUK__NO_ARRAY_INDEX);  /* index/length check guarantees */\n\t\t\t\t\t\tbyte_off = arr_idx << h_bufobj->shift;       /* no wrap assuming h_bufobj->length is valid */\n\t\t\t\t\t\telem_size = (duk_small_uint_t) (1U << h_bufobj->shift);\n\n\t\t\t\t\t\t/* Coerce to number before validating pointers etc so that the\n\t\t\t\t\t\t * number coercions in duk_hbufobj_validated_write() are\n\t\t\t\t\t\t * guaranteed to be side effect free and not invalidate the\n\t\t\t\t\t\t * pointer checks we do here.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tduk_push_tval(thr, tv_val);\n\t\t\t\t\t\t(void) duk_to_number_m1(thr);\n\n\t\t\t\t\t\tif (h_bufobj->buf != NULL && DUK_HBUFOBJ_VALID_BYTEOFFSET_EXCL(h_bufobj, byte_off + elem_size)) {\n\t\t\t\t\t\t\tdata = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf) + h_bufobj->offset + byte_off;\n\t\t\t\t\t\t\tduk_hbufobj_validated_write(thr, h_bufobj, data, elem_size);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDUK_D(DUK_DPRINT(\"bufobj access out of underlying buffer, ignoring (write skipped)\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tduk_pop_unsafe(thr);\n\t\t\t\t\t\tgoto success_no_arguments_exotic;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif  /* DUK_USE_BUFFEROBJECT_SUPPORT */\n\n\t\t\t\tDUK_D(DUK_DPRINT(\"should not happen, key %!O\", key));\n\t\t\t\tgoto fail_internal;  /* should not happen */\n\t\t\t}\n\t\t\tDUK_DD(DUK_DDPRINT(\"put to existing own plain property, property is writable\"));\n\t\t\tgoto update_old;\n\t\t}\n\t\tDUK_UNREACHABLE();\n\n\t next_in_chain:\n\t\t/* XXX: option to pretend property doesn't exist if sanity limit is\n\t\t * hit might be useful.\n\t\t */\n\t\tif (DUK_UNLIKELY(sanity-- == 0)) {\n\t\t\tDUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);\n\t\t}\n\t\tcurr = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, curr);\n\t} while (curr != NULL);\n\n\t/*\n\t *  Property not found in prototype chain.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"property not found in prototype chain\"));\n\n\tif (orig == NULL) {\n\t\tDUK_DD(DUK_DDPRINT(\"attempt to create a new property in a primitive base object\"));\n\t\tgoto fail_base_primitive;\n\t}\n\n\tif (!DUK_HOBJECT_HAS_EXTENSIBLE(orig)) {\n\t\tDUK_DD(DUK_DDPRINT(\"put to a new property (not found in prototype chain), but original object not extensible\"));\n\t\tgoto fail_not_extensible;\n\t}\n\n\tgoto create_new;\n\n update_old:\n\n\t/*\n\t *  Update an existing property of the base object.\n\t */\n\n\t/* [key] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"update an existing property of the original object\"));\n\n\tDUK_ASSERT(orig != NULL);\n#if defined(DUK_USE_ROM_OBJECTS)\n\t/* This should not happen because DUK_TAG_OBJECT case checks\n\t * for this already, but check just in case.\n\t */\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) {\n\t\tgoto fail_not_writable;\n\t}\n#endif\n\n\t/* Although there are writable virtual properties (e.g. plain buffer\n\t * and buffer object number indices), they are handled before we come\n\t * here.\n\t */\n\tDUK_ASSERT((desc.flags & DUK_PROPDESC_FLAG_VIRTUAL) == 0);\n\tDUK_ASSERT(desc.a_idx >= 0 || desc.e_idx >= 0);\n\n\t/* Array own property .length is handled above. */\n\tDUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr)));\n\n\tif (desc.e_idx >= 0) {\n\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, desc.e_idx);\n\t\tDUK_DDD(DUK_DDDPRINT(\"previous entry value: %!iT\", (duk_tval *) tv));\n\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val);  /* side effects; e_idx may be invalidated */\n\t\t/* don't touch property attributes or hash part */\n\t\tDUK_DD(DUK_DDPRINT(\"put to an existing entry at index %ld -> new value %!iT\",\n\t\t                   (long) desc.e_idx, (duk_tval *) tv));\n\t} else {\n\t\t/* Note: array entries are always writable, so the writability check\n\t\t * above is pointless for them.  The check could be avoided with some\n\t\t * refactoring but is probably not worth it.\n\t\t */\n\n\t\tDUK_ASSERT(desc.a_idx >= 0);\n\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, desc.a_idx);\n\t\tDUK_DDD(DUK_DDDPRINT(\"previous array value: %!iT\", (duk_tval *) tv));\n\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv_val);  /* side effects; a_idx may be invalidated */\n\t\tDUK_DD(DUK_DDPRINT(\"put to an existing array entry at index %ld -> new value %!iT\",\n\t\t                   (long) desc.a_idx, (duk_tval *) tv));\n\t}\n\n\t/* Regardless of whether property is found in entry or array part,\n\t * it may have arguments exotic behavior (array indices may reside\n\t * in entry part for abandoned / non-existent array parts).\n\t */\n\tgoto success_with_arguments_exotic;\n\n create_new:\n\n\t/*\n\t *  Create a new property in the original object.\n\t *\n\t *  Exotic properties need to be reconsidered here from a write\n\t *  perspective (not just property attributes perspective).\n\t *  However, the property does not exist in the object already,\n\t *  so this limits the kind of exotic properties that apply.\n\t */\n\n\t/* [key] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"create new property to original object\"));\n\n\tDUK_ASSERT(orig != NULL);\n\n\t/* Array own property .length is handled above. */\n\tDUK_ASSERT(!(DUK_HOBJECT_IS_ARRAY(orig) && key == DUK_HTHREAD_STRING_LENGTH(thr)));\n\n#if defined(DUK_USE_ROM_OBJECTS)\n\t/* This should not happen because DUK_TAG_OBJECT case checks\n\t * for this already, but check just in case.\n\t */\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) orig)) {\n\t\tgoto fail_not_writable;\n\t}\n#endif\n\n\t/* Not possible because array object 'length' is present\n\t * from its creation and cannot be deleted, and is thus\n\t * caught as an existing property above.\n\t */\n\tDUK_ASSERT(!(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) &&\n\t             key == DUK_HTHREAD_STRING_LENGTH(thr)));\n\n\tif (DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig) &&\n\t    arr_idx != DUK__NO_ARRAY_INDEX) {\n\t\t/* automatic length update */\n\t\tduk_uint32_t old_len;\n\t\tduk_harray *a;\n\n\t\ta = (duk_harray *) orig;\n\t\tDUK_ASSERT_HARRAY_VALID(a);\n\n\t\told_len = a->length;\n\n\t\tif (arr_idx >= old_len) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"write new array entry requires length update \"\n\t\t\t                     \"(arr_idx=%ld, old_len=%ld)\",\n\t\t\t                     (long) arr_idx, (long) old_len));\n\n\t\t\tif (DUK_HARRAY_LENGTH_NONWRITABLE(a)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"attempt to extend array, but array 'length' is not writable\"));\n\t\t\t\tgoto fail_not_writable;\n\t\t\t}\n\n\t\t\t/* Note: actual update happens once write has been completed\n\t\t\t * without error below.  The write should always succeed\n\t\t\t * from a specification viewpoint, but we may e.g. run out\n\t\t\t * of memory.  It's safer in this order.\n\t\t\t */\n\n\t\t\tDUK_ASSERT(arr_idx != 0xffffffffUL);\n\t\t\tnew_array_length = arr_idx + 1;  /* flag for later write */\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"write new array entry does not require length update \"\n\t\t\t                     \"(arr_idx=%ld, old_len=%ld)\",\n\t\t\t                     (long) arr_idx, (long) old_len));\n\t\t}\n\t}\n\n /* write_to_array_part: */\n\n\t/*\n\t *  Write to array part?\n\t *\n\t *  Note: array abandonding requires a property resize which uses\n\t *  'rechecks' valstack for temporaries and may cause any existing\n\t *  valstack pointers to be invalidated.  To protect against this,\n\t *  tv_obj, tv_key, and tv_val are copies of the original inputs.\n\t */\n\n\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t    DUK_HOBJECT_HAS_ARRAY_PART(orig)) {\n\t\tif (arr_idx < DUK_HOBJECT_GET_ASIZE(orig)) {\n\t\t\tgoto no_array_growth;\n\t\t}\n\n\t\t/*\n\t\t *  Array needs to grow, but we don't want it becoming too sparse.\n\t\t *  If it were to become sparse, abandon array part, moving all\n\t\t *  array entries into the entries part (for good).\n\t\t *\n\t\t *  Since we don't keep track of actual density (used vs. size) of\n\t\t *  the array part, we need to estimate somehow.  The check is made\n\t\t *  in two parts:\n\t\t *\n\t\t *    - Check whether the resize need is small compared to the\n\t\t *      current size (relatively); if so, resize without further\n\t\t *      checking (essentially we assume that the original part is\n\t\t *      \"dense\" so that the result would be dense enough).\n\t\t *\n\t\t *    - Otherwise, compute the resize using an actual density\n\t\t *      measurement based on counting the used array entries.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"write to new array requires array resize, decide whether to do a \"\n\t\t                     \"fast resize without abandon check (arr_idx=%ld, old_size=%ld)\",\n\t\t                     (long) arr_idx, (long) DUK_HOBJECT_GET_ASIZE(orig)));\n\n\t\tif (duk__abandon_array_slow_check_required(arr_idx, DUK_HOBJECT_GET_ASIZE(orig))) {\n\t\t\tduk_uint32_t old_used;\n\t\t\tduk_uint32_t old_size;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"=> fast check is NOT OK, do slow check for array abandon\"));\n\n\t\t\tduk__compute_a_stats(thr, orig, &old_used, &old_size);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"abandon check, array stats: old_used=%ld, old_size=%ld, arr_idx=%ld\",\n\t\t\t                     (long) old_used, (long) old_size, (long) arr_idx));\n\n\t\t\t/* Note: intentionally use approximations to shave a few instructions:\n\t\t\t *   a_used = old_used  (accurate: old_used + 1)\n\t\t\t *   a_size = arr_idx   (accurate: arr_idx + 1)\n\t\t\t */\n\t\t\tif (duk__abandon_array_density_check(old_used, arr_idx)) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"write to new array entry beyond current length, \"\n\t\t\t\t                   \"decided to abandon array part (would become too sparse)\"));\n\n\t\t\t\t/* abandoning requires a props allocation resize and\n\t\t\t\t * 'rechecks' the valstack, invalidating any existing\n\t\t\t\t * valstack value pointers!\n\t\t\t\t */\n\t\t\t\tduk__abandon_array_checked(thr, orig);\n\t\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(orig));\n\n\t\t\t\tgoto write_to_entry_part;\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"=> decided to keep array part\"));\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"=> fast resize is OK\"));\n\t\t}\n\n\t\tDUK_DD(DUK_DDPRINT(\"write to new array entry beyond current length, \"\n\t\t                   \"decided to extend current allocation\"));\n\n\t\tduk__grow_props_for_array_item(thr, orig, arr_idx);\n\n\t no_array_growth:\n\n\t\t/* Note: assume array part is comprehensive, so that either\n\t\t * the write goes to the array part, or we've abandoned the\n\t\t * array above (and will not come here).\n\t\t */\n\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(orig));\n\t\tDUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(orig));\n\n\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, orig, arr_idx);\n\t\t/* prev value must be unused, no decref */\n\t\tDUK_ASSERT(DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_TVAL_SET_TVAL(tv, tv_val);\n\t\tDUK_TVAL_INCREF(thr, tv);\n\t\tDUK_DD(DUK_DDPRINT(\"put to new array entry: %ld -> %!T\",\n\t\t                   (long) arr_idx, (duk_tval *) tv));\n\n\t\t/* Note: array part values are [[Writable]], [[Enumerable]],\n\t\t * and [[Configurable]] which matches the required attributes\n\t\t * here.\n\t\t */\n\t\tgoto entry_updated;\n\t}\n\n write_to_entry_part:\n\n\t/*\n\t *  Write to entry part\n\t */\n\n\t/* entry allocation updates hash part and increases the key\n\t * refcount; may need a props allocation resize but doesn't\n\t * 'recheck' the valstack.\n\t */\n\te_idx = duk__hobject_alloc_entry_checked(thr, orig, key);\n\tDUK_ASSERT(e_idx >= 0);\n\n\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, orig, e_idx);\n\t/* prev value can be garbage, no decref */\n\tDUK_TVAL_SET_TVAL(tv, tv_val);\n\tDUK_TVAL_INCREF(thr, tv);\n\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, orig, e_idx, DUK_PROPDESC_FLAGS_WEC);\n\tgoto entry_updated;\n\n entry_updated:\n\n\t/*\n\t *  Possible pending array length update, which must only be done\n\t *  if the actual entry write succeeded.\n\t */\n\n\tif (new_array_length > 0) {\n\t\t/* Note: zero works as a \"no update\" marker because the new length\n\t\t * can never be zero after a new property is written.\n\t\t */\n\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(orig));\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"write successful, pending array length update to: %ld\",\n\t\t                     (long) new_array_length));\n\n\t\t((duk_harray *) orig)->length = new_array_length;\n\t}\n\n\t/*\n\t *  Arguments exotic behavior not possible for new properties: all\n\t *  magically bound properties are initially present in the arguments\n\t *  object, and if they are deleted, the binding is also removed from\n\t *  parameter map.\n\t */\n\n\tgoto success_no_arguments_exotic;\n\n success_with_arguments_exotic:\n\n\t/*\n\t *  Arguments objects have exotic [[DefineOwnProperty]] which updates\n\t *  the internal 'map' of arguments for writes to currently mapped\n\t *  arguments.  More conretely, writes to mapped arguments generate\n\t *  a write to a bound variable.\n\t *\n\t *  The [[Put]] algorithm invokes [[DefineOwnProperty]] for existing\n\t *  data properties and new properties, but not for existing accessors.\n\t *  Hence, in E5 Section 10.6 ([[DefinedOwnProperty]] algorithm), we\n\t *  have a Desc with 'Value' (and possibly other properties too), and\n\t *  we end up in step 5.b.i.\n\t */\n\n\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t    DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(orig)) {\n\t\t/* Note: only numbered indices are relevant, so arr_idx fast reject\n\t\t * is good (this is valid unless there are more than 4**32-1 arguments).\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"putprop successful, arguments exotic behavior needed\"));\n\n\t\t/* Note: we can reuse 'desc' here */\n\n\t\t/* XXX: top of stack must contain value, which helper doesn't touch,\n\t\t * rework to use tv_val directly?\n\t\t */\n\n\t\tduk_push_tval(thr, tv_val);\n\t\t(void) duk__check_arguments_map_for_put(thr, orig, key, &desc, throw_flag);\n\t\tduk_pop_unsafe(thr);\n\t}\n\t/* fall thru */\n\n success_no_arguments_exotic:\n\t/* shared exit path now */\n\tDUK_DDD(DUK_DDDPRINT(\"result: success\"));\n\tduk_pop_unsafe(thr);  /* remove key */\n\treturn 1;\n\n#if defined(DUK_USE_ES6_PROXY)\n fail_proxy_rejected:\n\tDUK_DDD(DUK_DDDPRINT(\"result: error, proxy rejects\"));\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);\n\t}\n\t/* Note: no key on stack */\n\treturn 0;\n#endif\n\n fail_base_primitive:\n\tDUK_DDD(DUK_DDDPRINT(\"result: error, base primitive\"));\n\tif (throw_flag) {\n#if defined(DUK_USE_PARANOID_ERRORS)\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);\n#else\n\t\tDUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, \"cannot write property %s of %s\",\n\t\t               duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));\n#endif\n\t}\n\tduk_pop_unsafe(thr);  /* remove key */\n\treturn 0;\n\n fail_not_extensible:\n\tDUK_DDD(DUK_DDDPRINT(\"result: error, not extensible\"));\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE);\n\t}\n\tduk_pop_unsafe(thr);  /* remove key */\n\treturn 0;\n\n fail_not_writable:\n\tDUK_DDD(DUK_DDDPRINT(\"result: error, not writable\"));\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE);\n\t}\n\tduk_pop_unsafe(thr);  /* remove key */\n\treturn 0;\n\n#if defined(DUK_USE_ROM_OBJECTS)\n fail_not_writable_no_pop:\n\tDUK_DDD(DUK_DDDPRINT(\"result: error, not writable\"));\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_WRITABLE);\n\t}\n\treturn 0;\n#endif\n\n fail_array_length_partial:\n\tDUK_DD(DUK_DDPRINT(\"result: error, array length write only partially successful\"));\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);\n\t}\n\tduk_pop_unsafe(thr);  /* remove key */\n\treturn 0;\n\n fail_no_setter:\n\tDUK_DDD(DUK_DDDPRINT(\"result: error, accessor property without setter\"));\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_SETTER_UNDEFINED);\n\t}\n\tduk_pop_unsafe(thr);  /* remove key */\n\treturn 0;\n\n fail_internal:\n\tDUK_DDD(DUK_DDDPRINT(\"result: error, internal\"));\n\tif (throw_flag) {\n\t\tDUK_ERROR_INTERNAL(thr);\n\t}\n\tduk_pop_unsafe(thr);  /* remove key */\n\treturn 0;\n}\n\n/*\n *  Ecmascript compliant [[Delete]](P, Throw).\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_delprop_raw(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) {\n\tduk_propdesc desc;\n\tduk_tval *tv;\n\tduk_uint32_t arr_idx;\n\tduk_bool_t throw_flag;\n\tduk_bool_t force_flag;\n\n\tthrow_flag = (flags & DUK_DELPROP_FLAG_THROW);\n\tforce_flag = (flags & DUK_DELPROP_FLAG_FORCE);\n\n\tDUK_DDD(DUK_DDDPRINT(\"delprop_raw: thr=%p, obj=%p, key=%p, throw=%ld, force=%ld (obj -> %!O, key -> %!O)\",\n\t                     (void *) thr, (void *) obj, (void *) key, (long) throw_flag, (long) force_flag,\n\t                     (duk_heaphdr *) obj, (duk_heaphdr *) key));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tarr_idx = DUK_HSTRING_GET_ARRIDX_FAST(key);\n\n\t/* 0 = don't push current value */\n\tif (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) {  /* don't push value */\n\t\tDUK_DDD(DUK_DDDPRINT(\"property not found, succeed always\"));\n\t\tgoto success;\n\t}\n\n#if defined(DUK_USE_ROM_OBJECTS)\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {\n\t\tDUK_DD(DUK_DDPRINT(\"attempt to delprop on read-only target object\"));\n\t\tgoto fail_not_configurable;\n\t}\n#endif\n\n\tif ((desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) == 0 && !force_flag) {\n\t\tgoto fail_not_configurable;\n\t}\n\tif (desc.a_idx < 0 && desc.e_idx < 0) {\n\t\t/* Currently there are no deletable virtual properties, but\n\t\t * with force_flag we might attempt to delete one.\n\t\t */\n\t\tDUK_DD(DUK_DDPRINT(\"delete failed: property found, force flag, but virtual (and implicitly non-configurable)\"));\n\t\tgoto fail_virtual;\n\t}\n\n\tif (desc.a_idx >= 0) {\n\t\tDUK_ASSERT(desc.e_idx < 0);\n\n\t\ttv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx);\n\t\tDUK_TVAL_SET_UNUSED_UPDREF(thr, tv);  /* side effects */\n\t\tgoto success;\n\t} else {\n\t\tDUK_ASSERT(desc.a_idx < 0);\n\n\t\t/* remove hash entry (no decref) */\n#if defined(DUK_USE_HOBJECT_HASH_PART)\n\t\tif (desc.h_idx >= 0) {\n\t\t\tduk_uint32_t *h_base = DUK_HOBJECT_H_GET_BASE(thr->heap, obj);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"removing hash entry at h_idx %ld\", (long) desc.h_idx));\n\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) > 0);\n\t\t\tDUK_ASSERT((duk_uint32_t) desc.h_idx < DUK_HOBJECT_GET_HSIZE(obj));\n\t\t\th_base[desc.h_idx] = DUK__HASH_DELETED;\n\t\t} else {\n\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0);\n\t\t}\n#else\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_HSIZE(obj) == 0);\n#endif\n\n\t\t/* Remove value.  This requires multiple writes so avoid side\n\t\t * effects via no-refzero macros so that e_idx is not\n\t\t * invalidated.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"before removing value, e_idx %ld, key %p, key at slot %p\",\n\t\t                     (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx)));\n\t\tDUK_DDD(DUK_DDDPRINT(\"removing value at e_idx %ld\", (long) desc.e_idx));\n\t\tif (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx)) {\n\t\t\tduk_hobject *tmp;\n\n\t\t\ttmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, desc.e_idx);\n\t\t\tDUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, desc.e_idx, NULL);\n\t\t\tDUK_UNREF(tmp);\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);\n\n\t\t\ttmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, desc.e_idx);\n\t\t\tDUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, desc.e_idx, NULL);\n\t\t\tDUK_UNREF(tmp);\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);\n\t\t} else {\n\t\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx);\n\t\t\tDUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv);\n\t\t}\n#if 0\n\t\t/* Not strictly necessary because if key == NULL, flag MUST be ignored. */\n\t\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, 0);\n#endif\n\n\t\t/* Remove key. */\n\t\tDUK_DDD(DUK_DDDPRINT(\"before removing key, e_idx %ld, key %p, key at slot %p\",\n\t\t                     (long) desc.e_idx, (void *) key, (void *) DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx)));\n\t\tDUK_DDD(DUK_DDDPRINT(\"removing key at e_idx %ld\", (long) desc.e_idx));\n\t\tDUK_ASSERT(key == DUK_HOBJECT_E_GET_KEY(thr->heap, obj, desc.e_idx));\n\t\tDUK_HOBJECT_E_SET_KEY(thr->heap, obj, desc.e_idx, NULL);\n\t\tDUK_HSTRING_DECREF_NORZ(thr, key);\n\n\t\t/* Trigger refzero side effects only when we're done as a\n\t\t * finalizer might operate on the object and affect the\n\t\t * e_idx we're supposed to use.\n\t\t */\n\t\tDUK_REFZERO_CHECK_SLOW(thr);\n\t\tgoto success;\n\t}\n\n\tDUK_UNREACHABLE();\n\n success:\n\t/*\n\t *  Argument exotic [[Delete]] behavior (E5 Section 10.6) is\n\t *  a post-check, keeping arguments internal 'map' in sync with\n\t *  any successful deletes (note that property does not need to\n\t *  exist for delete to 'succeed').\n\t *\n\t *  Delete key from 'map'.  Since 'map' only contains array index\n\t *  keys, we can use arr_idx for a fast skip.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"delete successful, check for arguments exotic behavior\"));\n\n\tif (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) {\n\t\t/* Note: only numbered indices are relevant, so arr_idx fast reject\n\t\t * is good (this is valid unless there are more than 4**32-1 arguments).\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"delete successful, arguments exotic behavior needed\"));\n\n\t\t/* Note: we can reuse 'desc' here */\n\t\t(void) duk__check_arguments_map_for_delete(thr, obj, key, &desc);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"delete successful\"));\n\treturn 1;\n\n fail_virtual:  /* just use the same \"not configurable\" error message */\n fail_not_configurable:\n\tDUK_DDD(DUK_DDDPRINT(\"delete failed: property found, not configurable\"));\n\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);\n\t}\n\treturn 0;\n}\n\n/*\n *  DELPROP: Ecmascript property deletion.\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_delprop(duk_hthread *thr, duk_tval *tv_obj, duk_tval *tv_key, duk_bool_t throw_flag) {\n\tduk_hstring *key = NULL;\n#if defined(DUK_USE_ES6_PROXY)\n\tduk_propdesc desc;\n#endif\n\tduk_int_t entry_top;\n\tduk_uint32_t arr_idx = DUK__NO_ARRAY_INDEX;\n\tduk_bool_t rc;\n\n\tDUK_DDD(DUK_DDDPRINT(\"delprop: thr=%p, obj=%p, key=%p (obj -> %!T, key -> %!T)\",\n\t                     (void *) thr, (void *) tv_obj, (void *) tv_key,\n\t                     (duk_tval *) tv_obj, (duk_tval *) tv_key));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(tv_obj != NULL);\n\tDUK_ASSERT(tv_key != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\t/* Storing the entry top is cheaper here to ensure stack is correct at exit,\n\t * as there are several paths out.\n\t */\n\tentry_top = duk_get_top(thr);\n\n\tif (DUK_TVAL_IS_UNDEFINED(tv_obj) ||\n\t    DUK_TVAL_IS_NULL(tv_obj)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"base object is undefined or null -> reject\"));\n\t\tgoto fail_invalid_base_uncond;\n\t}\n\n\tduk_push_tval(thr, tv_obj);\n\tduk_push_tval(thr, tv_key);\n\n\ttv_obj = DUK_GET_TVAL_NEGIDX(thr, -2);\n\tif (DUK_TVAL_IS_OBJECT(tv_obj)) {\n\t\tduk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_obj);\n\t\tDUK_ASSERT(obj != NULL);\n\n#if defined(DUK_USE_ES6_PROXY)\n\t\tif (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(obj))) {\n\t\t\tduk_hobject *h_target;\n\t\t\tduk_bool_t tmp_bool;\n\n\t\t\t/* Note: proxy handling must happen before key is string coerced. */\n\n\t\t\tif (duk__proxy_check_prop(thr, obj, DUK_STRIDX_DELETE_PROPERTY, tv_key, &h_target)) {\n\t\t\t\t/* -> [ ... obj key trap handler ] */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"-> proxy object 'deleteProperty' for key %!T\", (duk_tval *) tv_key));\n\t\t\t\tduk_push_hobject(thr, h_target);  /* target */\n\t\t\t\tduk_dup_m4(thr);  /* P */\n\t\t\t\tduk_call_method(thr, 2 /*nargs*/);\n\t\t\t\ttmp_bool = duk_to_boolean(thr, -1);\n\t\t\t\tduk_pop_nodecref_unsafe(thr);\n\t\t\t\tif (!tmp_bool) {\n\t\t\t\t\tgoto fail_proxy_rejected;  /* retval indicates delete failed */\n\t\t\t\t}\n\n\t\t\t\t/* Target object must be checked for a conflicting\n\t\t\t\t * non-configurable property.\n\t\t\t\t */\n\t\t\t\ttv_key = DUK_GET_TVAL_NEGIDX(thr, -1);\n\t\t\t\tarr_idx = duk__push_tval_to_property_key(thr, tv_key, &key);\n\t\t\t\tDUK_ASSERT(key != NULL);\n\n\t\t\t\tif (duk__get_own_propdesc_raw(thr, h_target, key, arr_idx, &desc, 0 /*flags*/)) {  /* don't push value */\n\t\t\t\t\tduk_small_int_t desc_reject;\n\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"proxy 'deleteProperty': target has matching property %!O, check for \"\n\t\t\t\t\t                     \"conflicting property; desc.flags=0x%08lx, \"\n\t\t\t\t\t                     \"desc.get=%p, desc.set=%p\",\n\t\t\t\t\t                     (duk_heaphdr *) key, (unsigned long) desc.flags,\n\t\t\t\t\t                     (void *) desc.get, (void *) desc.set));\n\n\t\t\t\t\tdesc_reject = !(desc.flags & DUK_PROPDESC_FLAG_CONFIGURABLE);\n\t\t\t\t\tif (desc_reject) {\n\t\t\t\t\t\t/* unconditional */\n\t\t\t\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trc = 1;  /* success */\n\t\t\t\tgoto done_rc;\n\t\t\t}\n\n\t\t\tobj = h_target;  /* resume delete to target */\n\t\t}\n#endif  /* DUK_USE_ES6_PROXY */\n\n\t\tarr_idx = duk__to_property_key(thr, -1, &key);\n\t\tDUK_ASSERT(key != NULL);\n\n\t\trc = duk_hobject_delprop_raw(thr, obj, key, throw_flag ? DUK_DELPROP_FLAG_THROW : 0);\n\t\tgoto done_rc;\n\t} else if (DUK_TVAL_IS_STRING(tv_obj)) {\n\t\t/* String has .length and array index virtual properties\n\t\t * which can't be deleted.  No need for a symbol check;\n\t\t * no offending virtual symbols exist.\n\t\t */\n\t\t/* XXX: unnecessary string coercion for array indices,\n\t\t * intentional to keep small.\n\t\t */\n\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv_obj);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\tarr_idx = duk__to_property_key(thr, -1, &key);\n\t\tDUK_ASSERT(key != NULL);\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tgoto fail_not_configurable;\n\t\t}\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t\t    arr_idx < DUK_HSTRING_GET_CHARLEN(h)) {\n\t\t\tgoto fail_not_configurable;\n\t\t}\n\t} else if (DUK_TVAL_IS_BUFFER(tv_obj)) {\n\t\t/* XXX: unnecessary string coercion for array indices,\n\t\t * intentional to keep small; some overlap with string\n\t\t * handling.\n\t\t */\n\t\tduk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv_obj);\n\t\tDUK_ASSERT(h != NULL);\n\n\t\tarr_idx = duk__to_property_key(thr, -1, &key);\n\t\tDUK_ASSERT(key != NULL);\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\t\tgoto fail_not_configurable;\n\t\t}\n\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX &&\n\t\t    arr_idx < DUK_HBUFFER_GET_SIZE(h)) {\n\t\t\tgoto fail_not_configurable;\n\t\t}\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv_obj)) {\n\t\t/* Lightfunc has no virtual properties since Duktape 2.2\n\t\t * so success.  Still must coerce key for side effects.\n\t\t */\n\n\t\tarr_idx = duk__to_property_key(thr, -1, &key);\n\t\tDUK_ASSERT(key != NULL);\n\t\tDUK_UNREF(key);\n\t}\n\n\t/* non-object base, no offending virtual property */\n\trc = 1;\n\tgoto done_rc;\n\n done_rc:\n\tduk_set_top_unsafe(thr, entry_top);\n\treturn rc;\n\n fail_invalid_base_uncond:\n\t/* Note: unconditional throw */\n\tDUK_ASSERT(duk_get_top(thr) == entry_top);\n#if defined(DUK_USE_PARANOID_ERRORS)\n\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_BASE);\n#else\n\tDUK_ERROR_FMT2(thr, DUK_ERR_TYPE_ERROR, \"cannot delete property %s of %s\",\n\t               duk_push_string_tval_readable(thr, tv_key), duk_push_string_tval_readable(thr, tv_obj));\n#endif\n\treturn 0;\n\n#if defined(DUK_USE_ES6_PROXY)\n fail_proxy_rejected:\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_PROXY_REJECTED);\n\t}\n\tduk_set_top_unsafe(thr, entry_top);\n\treturn 0;\n#endif\n\n fail_not_configurable:\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);\n\t}\n\tduk_set_top_unsafe(thr, entry_top);\n\treturn 0;\n}\n\n/*\n *  Internal helper to define a property with specific flags, ignoring\n *  normal semantics such as extensibility, write protection etc.\n *  Overwrites any existing value and attributes unless caller requests\n *  that value only be updated if it doesn't already exists.\n *\n *  Does not support:\n *    - virtual properties (error if write attempted)\n *    - getter/setter properties (error if write attempted)\n *    - non-default (!= WEC) attributes for array entries (error if attempted)\n *    - array abandoning: if array part exists, it is always extended\n *    - array 'length' updating\n *\n *  Stack: [... in_val] -> []\n *\n *  Used for e.g. built-in initialization and environment record\n *  operations.\n */\n\nDUK_INTERNAL void duk_hobject_define_property_internal(duk_hthread *thr, duk_hobject *obj, duk_hstring *key, duk_small_uint_t flags) {\n\tduk_propdesc desc;\n\tduk_uint32_t arr_idx;\n\tduk_int_t e_idx;\n\tduk_tval *tv1 = NULL;\n\tduk_tval *tv2 = NULL;\n\tduk_small_uint_t propflags = flags & DUK_PROPDESC_FLAGS_MASK;  /* mask out flags not actually stored */\n\n\tDUK_DDD(DUK_DDDPRINT(\"define new property (internal): thr=%p, obj=%!O, key=%!O, flags=0x%02lx, val=%!T\",\n\t                     (void *) thr, (duk_heaphdr *) obj, (duk_heaphdr *) key,\n\t                     (unsigned long) flags, (duk_tval *) duk_get_tval(thr, -1)));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\tDUK_ASSERT(duk_is_valid_index(thr, -1));  /* contains value */\n\n\tarr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);\n\n\tif (duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &desc, 0 /*flags*/)) {  /* don't push value */\n\t\tif (desc.e_idx >= 0) {\n\t\t\tif (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"property already exists in the entry part -> skip as requested\"));\n\t\t\t\tgoto pop_exit;\n\t\t\t}\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"property already exists in the entry part -> update value and attributes\"));\n\t\t\tif (DUK_UNLIKELY(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, desc.e_idx))) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"existing property is an accessor, not supported\"));\n\t\t\t\tgoto error_internal;\n\t\t\t}\n\n\t\t\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, desc.e_idx, propflags);\n\t\t\ttv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, desc.e_idx);\n\t\t} else if (desc.a_idx >= 0) {\n\t\t\tif (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"property already exists in the array part -> skip as requested\"));\n\t\t\t\tgoto pop_exit;\n\t\t\t}\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"property already exists in the array part -> update value (assert attributes)\"));\n\t\t\tif (propflags != DUK_PROPDESC_FLAGS_WEC) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"existing property in array part, but propflags not WEC (0x%02lx)\",\n\t\t\t\t                 (unsigned long) propflags));\n\t\t\t\tgoto error_internal;\n\t\t\t}\n\n\t\t\ttv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, desc.a_idx);\n\t\t} else {\n\t\t\tif (flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"property already exists but is virtual -> skip as requested\"));\n\t\t\t\tgoto pop_exit;\n\t\t\t}\n\t\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {\n\t\t\t\tduk_uint32_t new_len;\n#if defined(DUK_USE_DEBUG)\n\t\t\t\tduk_uint32_t prev_len;\n\t\t\t\tprev_len = ((duk_harray *) obj)->length;\n#endif\n\t\t\t\tnew_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_NEGIDX(thr, -1));\n\t\t\t\t((duk_harray *) obj)->length = new_len;\n\t\t\t\tDUK_D(DUK_DPRINT(\"internal define property for array .length: %ld -> %ld\",\n\t\t\t\t                 (long) prev_len, (long) ((duk_harray *) obj)->length));\n\t\t\t\tgoto pop_exit;\n\t\t\t}\n\t\t\tDUK_DD(DUK_DDPRINT(\"property already exists but is virtual -> failure\"));\n\t\t\tgoto error_virtual;\n\t\t}\n\n\t\tgoto write_value;\n\t}\n\n\tif (DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\tif (arr_idx != DUK__NO_ARRAY_INDEX) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"property does not exist, object has array part -> possibly extend array part and write value (assert attributes)\"));\n\t\t\tDUK_ASSERT(propflags == DUK_PROPDESC_FLAGS_WEC);\n\n\t\t\t/* always grow the array, no sparse / abandon support here */\n\t\t\tif (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) {\n\t\t\t\tduk__grow_props_for_array_item(thr, obj, arr_idx);\n\t\t\t}\n\n\t\t\tDUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj));\n\t\t\ttv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx);\n\t\t\tgoto write_value;\n\t\t}\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"property does not exist, object belongs in entry part -> allocate new entry and write value and attributes\"));\n\te_idx = duk__hobject_alloc_entry_checked(thr, obj, key);  /* increases key refcount */\n\tDUK_ASSERT(e_idx >= 0);\n\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, propflags);\n\ttv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx);\n\t/* new entry: previous value is garbage; set to undefined to share write_value */\n\tDUK_TVAL_SET_UNDEFINED(tv1);\n\tgoto write_value;\n\n write_value:\n\t/* tv1 points to value storage */\n\n\ttv2 = duk_require_tval(thr, -1);  /* late lookup, avoid side effects */\n\tDUK_DDD(DUK_DDDPRINT(\"writing/updating value: %!T -> %!T\",\n\t                     (duk_tval *) tv1, (duk_tval *) tv2));\n\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2);  /* side effects */\n\tgoto pop_exit;\n\n pop_exit:\n\tduk_pop_unsafe(thr);  /* remove in_val */\n\treturn;\n\n error_virtual:  /* share error message */\n error_internal:\n\tDUK_ERROR_INTERNAL(thr);\n\treturn;\n}\n\n/*\n *  Fast path for defining array indexed values without interning the key.\n *  This is used by e.g. code for Array prototype and traceback creation so\n *  must avoid interning.\n */\n\nDUK_INTERNAL void duk_hobject_define_property_internal_arridx(duk_hthread *thr, duk_hobject *obj, duk_uarridx_t arr_idx, duk_small_uint_t flags) {\n\tduk_hstring *key;\n\tduk_tval *tv1, *tv2;\n\n\tDUK_DDD(DUK_DDDPRINT(\"define new property (internal) arr_idx fast path: thr=%p, obj=%!O, \"\n\t                     \"arr_idx=%ld, flags=0x%02lx, val=%!T\",\n\t                     (void *) thr, obj, (long) arr_idx, (unsigned long) flags,\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj));\n\n\tif (DUK_HOBJECT_HAS_ARRAY_PART(obj) &&\n\t    arr_idx != DUK__NO_ARRAY_INDEX &&\n\t    flags == DUK_PROPDESC_FLAGS_WEC) {\n\t\tDUK_ASSERT((flags & DUK_PROPDESC_FLAG_NO_OVERWRITE) == 0);  /* covered by comparison */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"define property to array part (property may or may not exist yet)\"));\n\n\t\t/* always grow the array, no sparse / abandon support here */\n\t\tif (arr_idx >= DUK_HOBJECT_GET_ASIZE(obj)) {\n\t\t\tduk__grow_props_for_array_item(thr, obj, arr_idx);\n\t\t}\n\n\t\tDUK_ASSERT(arr_idx < DUK_HOBJECT_GET_ASIZE(obj));\n\t\ttv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, arr_idx);\n\t\ttv2 = duk_require_tval(thr, -1);\n\n\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2);  /* side effects */\n\n\t\tduk_pop_unsafe(thr);  /* [ ...val ] -> [ ... ] */\n\t\treturn;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"define property fast path didn't work, use slow path\"));\n\n\tkey = duk_push_uint_to_hstring(thr, (duk_uint_t) arr_idx);\n\tDUK_ASSERT(key != NULL);\n\tduk_insert(thr, -2);  /* [ ... val key ] -> [ ... key val ] */\n\n\tduk_hobject_define_property_internal(thr, obj, key, flags);\n\n\tduk_pop_unsafe(thr);  /* [ ... key ] -> [ ... ] */\n}\n\n/*\n *  Internal helpers for managing object 'length'\n */\n\nDUK_INTERNAL duk_size_t duk_hobject_get_length(duk_hthread *thr, duk_hobject *obj) {\n\tduk_double_t val;\n\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(obj != NULL);\n\n\t/* Fast path for Arrays. */\n\tif (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {\n\t\treturn ((duk_harray *) obj)->length;\n\t}\n\n\t/* Slow path, .length can be e.g. accessor, obj can be a Proxy, etc. */\n\tduk_push_hobject(thr, obj);\n\tduk_push_hstring_stridx(thr, DUK_STRIDX_LENGTH);\n\t(void) duk_hobject_getprop(thr,\n\t                           DUK_GET_TVAL_NEGIDX(thr, -2),\n\t                           DUK_GET_TVAL_NEGIDX(thr, -1));\n\tval = duk_to_number_m1(thr);\n\tduk_pop_3_unsafe(thr);\n\n\t/* This isn't part of Ecmascript semantics; return a value within\n\t * duk_size_t range, or 0 otherwise.\n\t */\n\tif (val >= 0.0 && val <= (duk_double_t) DUK_SIZE_MAX) {\n\t\treturn (duk_size_t) val;\n\t}\n\treturn 0;\n}\n\n/*\n *  Fast finalizer check for an object.  Walks the prototype chain, checking\n *  for finalizer presence using DUK_HOBJECT_FLAG_HAVE_FINALIZER which is kept\n *  in sync with the actual property when setting/removing the finalizer.\n */\n\n#if defined(DUK_USE_HEAPPTR16)\nDUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_heap *heap, duk_hobject *obj) {\n#else\nDUK_INTERNAL duk_bool_t duk_hobject_has_finalizer_fast_raw(duk_hobject *obj) {\n#endif\n\tduk_uint_t sanity;\n\n\tDUK_ASSERT(obj != NULL);\n\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\tdo {\n\t\tif (DUK_UNLIKELY(DUK_HOBJECT_HAS_HAVE_FINALIZER(obj))) {\n\t\t\treturn 1;\n\t\t}\n\t\tif (DUK_UNLIKELY(sanity-- == 0)) {\n\t\t\tDUK_D(DUK_DPRINT(\"prototype loop when checking for finalizer existence; returning false\"));\n\t\t\treturn 0;\n\t\t}\n#if defined(DUK_USE_HEAPPTR16)\n\t\tDUK_ASSERT(heap != NULL);\n\t\tobj = DUK_HOBJECT_GET_PROTOTYPE(heap, obj);\n#else\n\t\tobj = DUK_HOBJECT_GET_PROTOTYPE(NULL, obj);  /* 'heap' arg ignored */\n#endif\n\t} while (obj != NULL);\n\n\treturn 0;\n}\n\n/*\n *  Object.getOwnPropertyDescriptor()  (E5 Sections 15.2.3.3, 8.10.4)\n *\n *  [ ... key ] -> [ ... desc/undefined ]\n */\n\nDUK_INTERNAL void duk_hobject_object_get_own_property_descriptor(duk_hthread *thr, duk_idx_t obj_idx) {\n\tduk_hobject *obj;\n\tduk_hstring *key;\n\tduk_propdesc pd;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\n\tobj = duk_require_hobject_promote_mask(thr, obj_idx, DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\tkey = duk_to_property_key_hstring(thr, -1);\n\tDUK_ASSERT(key != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\tif (!duk_hobject_get_own_propdesc(thr, obj, key, &pd, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\tduk_push_undefined(thr);\n\t\tduk_remove_m2(thr);\n\t\treturn;\n\t}\n\n\tduk_push_object(thr);\n\n\t/* [ ... key value desc ] */\n\n\tif (DUK_PROPDESC_IS_ACCESSOR(&pd)) {\n\t\t/* If a setter/getter is missing (undefined), the descriptor must\n\t\t * still have the property present with the value 'undefined'.\n\t\t */\n\t\tif (pd.get) {\n\t\t\tduk_push_hobject(thr, pd.get);\n\t\t} else {\n\t\t\tduk_push_undefined(thr);\n\t\t}\n\t\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_GET);\n\t\tif (pd.set) {\n\t\t\tduk_push_hobject(thr, pd.set);\n\t\t} else {\n\t\t\tduk_push_undefined(thr);\n\t\t}\n\t\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_SET);\n\t} else {\n\t\tduk_dup_m2(thr);\n\t\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_VALUE);\n\t\tduk_push_boolean(thr, DUK_PROPDESC_IS_WRITABLE(&pd));\n\t\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_WRITABLE);\n\t}\n\tduk_push_boolean(thr, DUK_PROPDESC_IS_ENUMERABLE(&pd));\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_ENUMERABLE);\n\tduk_push_boolean(thr, DUK_PROPDESC_IS_CONFIGURABLE(&pd));\n\tduk_put_prop_stridx_short(thr, -2, DUK_STRIDX_CONFIGURABLE);\n\n\t/* [ ... key value desc ] */\n\n\tduk_replace(thr, -3);\n\tduk_pop_unsafe(thr);  /* -> [ ... desc ] */\n}\n\n/*\n *  NormalizePropertyDescriptor() related helper.\n *\n *  Internal helper which validates and normalizes a property descriptor\n *  represented as an Ecmascript object (e.g. argument to defineProperty()).\n *  The output of this conversion is a set of defprop_flags and possibly\n *  some values pushed on the value stack to (1) ensure borrowed pointers\n *  remain valid, and (2) avoid unnecessary pops for footprint reasons.\n *  Caller must manage stack top carefully because the number of values\n *  pushed depends on the input property descriptor.\n *\n *  The original descriptor object must not be altered in the process.\n */\n\n/* XXX: very basic optimization -> duk_get_prop_stridx_top */\n\nDUK_INTERNAL\nvoid duk_hobject_prepare_property_descriptor(duk_hthread *thr,\n                                             duk_idx_t idx_in,\n                                             duk_uint_t *out_defprop_flags,\n                                             duk_idx_t *out_idx_value,\n                                             duk_hobject **out_getter,\n                                             duk_hobject **out_setter) {\n\tduk_idx_t idx_value = -1;\n\tduk_hobject *getter = NULL;\n\tduk_hobject *setter = NULL;\n\tduk_bool_t is_data_desc = 0;\n\tduk_bool_t is_acc_desc = 0;\n\tduk_uint_t defprop_flags = 0;\n\n\tDUK_ASSERT(out_defprop_flags != NULL);\n\tDUK_ASSERT(out_idx_value != NULL);\n\tDUK_ASSERT(out_getter != NULL);\n\tDUK_ASSERT(out_setter != NULL);\n\tDUK_ASSERT(idx_in <= 0x7fffL);  /* short variants would be OK, but not used to avoid shifts */\n\n\t/* Must be an object, otherwise TypeError (E5.1 Section 8.10.5, step 1). */\n\tidx_in = duk_require_normalize_index(thr, idx_in);\n\t(void) duk_require_hobject(thr, idx_in);\n\n\t/* The coercion order must match the ToPropertyDescriptor() algorithm\n\t * so that side effects in coercion happen in the correct order.\n\t * (This order also happens to be compatible with duk_def_prop(),\n\t * although it doesn't matter in practice.)\n\t */\n\n\tif (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_VALUE)) {\n\t\tis_data_desc = 1;\n\t\tdefprop_flags |= DUK_DEFPROP_HAVE_VALUE;\n\t\tidx_value = duk_get_top_index(thr);\n\t}\n\n\tif (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_WRITABLE)) {\n\t\tis_data_desc = 1;\n\t\tif (duk_to_boolean(thr, -1)) {\n\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE;\n\t\t} else {\n\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_WRITABLE;\n\t\t}\n\t}\n\n\tif (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_GET)) {\n\t\tduk_tval *tv = duk_require_tval(thr, -1);\n\t\tduk_hobject *h_get;\n\n\t\tif (DUK_TVAL_IS_UNDEFINED(tv)) {\n\t\t\t/* undefined is accepted */\n\t\t\tDUK_ASSERT(getter == NULL);\n\t\t} else {\n\t\t\t/* NOTE: lightfuncs are coerced to full functions because\n\t\t\t * lightfuncs don't fit into a property value slot.  This\n\t\t\t * has some side effects, see test-dev-lightfunc-accessor.js.\n\t\t\t */\n\t\t\th_get = duk_get_hobject_promote_lfunc(thr, -1);\n\t\t\tif (h_get == NULL || !DUK_HOBJECT_IS_CALLABLE(h_get)) {\n\t\t\t\tgoto type_error;\n\t\t\t}\n\t\t\tgetter = h_get;\n\t\t}\n\t\tis_acc_desc = 1;\n\t\tdefprop_flags |= DUK_DEFPROP_HAVE_GETTER;\n\t}\n\n\tif (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_SET)) {\n\t\tduk_tval *tv = duk_require_tval(thr, -1);\n\t\tduk_hobject *h_set;\n\n\t\tif (DUK_TVAL_IS_UNDEFINED(tv)) {\n\t\t\t/* undefined is accepted */\n\t\t\tDUK_ASSERT(setter == NULL);\n\t\t}  else {\n\t\t\t/* NOTE: lightfuncs are coerced to full functions because\n\t\t\t * lightfuncs don't fit into a property value slot.  This\n\t\t\t * has some side effects, see test-dev-lightfunc-accessor.js.\n\t\t\t */\n\t\t\th_set = duk_get_hobject_promote_lfunc(thr, -1);\n\t\t\tif (h_set == NULL || !DUK_HOBJECT_IS_CALLABLE(h_set)) {\n\t\t\t\tgoto type_error;\n\t\t\t}\n\t\t\tsetter = h_set;\n\t\t}\n\t\tis_acc_desc = 1;\n\t\tdefprop_flags |= DUK_DEFPROP_HAVE_SETTER;\n\t}\n\n\tif (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_ENUMERABLE)) {\n\t\tif (duk_to_boolean(thr, -1)) {\n\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE;\n\t\t} else {\n\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE;\n\t\t}\n\t}\n\n\tif (duk_get_prop_stridx(thr, idx_in, DUK_STRIDX_CONFIGURABLE)) {\n\t\tif (duk_to_boolean(thr, -1)) {\n\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE;\n\t\t} else {\n\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_CONFIGURABLE;\n\t\t}\n\t}\n\n\tif (is_data_desc && is_acc_desc) {\n\t\tgoto type_error;\n\t}\n\n\t*out_defprop_flags = defprop_flags;\n\t*out_idx_value = idx_value;\n\t*out_getter = getter;\n\t*out_setter = setter;\n\n\t/* [ ... [multiple values] ] */\n\treturn;\n\n type_error:\n\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_DESCRIPTOR);\n}\n\n/*\n *  Object.defineProperty() related helper (E5 Section 15.2.3.6).\n *  Also handles ES2015 Reflect.defineProperty().\n *\n *  Inlines all [[DefineOwnProperty]] exotic behaviors.\n *\n *  Note: Ecmascript compliant [[DefineOwnProperty]](P, Desc, Throw) is not\n *  implemented directly, but Object.defineProperty() serves its purpose.\n *  We don't need the [[DefineOwnProperty]] internally and we don't have a\n *  property descriptor with 'missing values' so it's easier to avoid it\n *  entirely.\n *\n *  Note: this is only called for actual objects, not primitive values.\n *  This must support virtual properties for full objects (e.g. Strings)\n *  but not for plain values (e.g. strings).  Lightfuncs, even though\n *  primitive in a sense, are treated like objects and accepted as target\n *  values.\n */\n\n/* XXX: this is a major target for size optimization */\nDUK_INTERNAL\nduk_bool_t duk_hobject_define_property_helper(duk_hthread *thr,\n                                              duk_uint_t defprop_flags,\n                                              duk_hobject *obj,\n                                              duk_hstring *key,\n                                              duk_idx_t idx_value,\n                                              duk_hobject *get,\n                                              duk_hobject *set,\n                                              duk_bool_t throw_flag) {\n\tduk_uint32_t arr_idx;\n\tduk_tval tv;\n\tduk_bool_t has_enumerable;\n\tduk_bool_t has_configurable;\n\tduk_bool_t has_writable;\n\tduk_bool_t has_value;\n\tduk_bool_t has_get;\n\tduk_bool_t has_set;\n\tduk_bool_t is_enumerable;\n\tduk_bool_t is_configurable;\n\tduk_bool_t is_writable;\n\tduk_bool_t force_flag;\n\tduk_small_uint_t new_flags;\n\tduk_propdesc curr;\n\tduk_uint32_t arridx_new_array_length;  /* != 0 => post-update for array 'length' (used when key is an array index) */\n\tduk_uint32_t arrlen_old_len;\n\tduk_uint32_t arrlen_new_len;\n\tduk_bool_t pending_write_protect;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\tDUK_ASSERT(key != NULL);\n\t/* idx_value may be < 0 (no value), set and get may be NULL */\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n\t/* All the flags fit in 16 bits, so will fit into duk_bool_t. */\n\n\thas_writable = (defprop_flags & DUK_DEFPROP_HAVE_WRITABLE);\n\thas_enumerable = (defprop_flags & DUK_DEFPROP_HAVE_ENUMERABLE);\n\thas_configurable = (defprop_flags & DUK_DEFPROP_HAVE_CONFIGURABLE);\n\thas_value = (defprop_flags & DUK_DEFPROP_HAVE_VALUE);\n\thas_get = (defprop_flags & DUK_DEFPROP_HAVE_GETTER);\n\thas_set = (defprop_flags & DUK_DEFPROP_HAVE_SETTER);\n\tis_writable = (defprop_flags & DUK_DEFPROP_WRITABLE);\n\tis_enumerable = (defprop_flags & DUK_DEFPROP_ENUMERABLE);\n\tis_configurable = (defprop_flags & DUK_DEFPROP_CONFIGURABLE);\n\tforce_flag = (defprop_flags & DUK_DEFPROP_FORCE);\n\n\tarr_idx = DUK_HSTRING_GET_ARRIDX_SLOW(key);\n\n\tarridx_new_array_length = 0;\n\tpending_write_protect = 0;\n\tarrlen_old_len = 0;\n\tarrlen_new_len = 0;\n\n\tDUK_DDD(DUK_DDDPRINT(\"has_enumerable=%ld is_enumerable=%ld \"\n\t                     \"has_configurable=%ld is_configurable=%ld \"\n\t                     \"has_writable=%ld is_writable=%ld \"\n\t                     \"has_value=%ld value=%!T \"\n\t                     \"has_get=%ld get=%p=%!O \"\n\t                     \"has_set=%ld set=%p=%!O \"\n\t                     \"arr_idx=%ld throw_flag=!%ld\",\n\t                     (long) has_enumerable, (long) is_enumerable,\n\t                     (long) has_configurable, (long) is_configurable,\n\t                     (long) has_writable, (long) is_writable,\n\t                     (long) has_value, (duk_tval *) (idx_value >= 0 ? duk_get_tval(thr, idx_value) : NULL),\n\t                     (long) has_get, (void *) get, (duk_heaphdr *) get,\n\t                     (long) has_set, (void *) set, (duk_heaphdr *) set,\n\t                     (long) arr_idx, (long) throw_flag));\n\n\t/*\n\t *  Array exotic behaviors can be implemented at this point.  The local variables\n\t *  are essentially a 'value copy' of the input descriptor (Desc), which is modified\n\t *  by the Array [[DefineOwnProperty]] (E5 Section 15.4.5.1).\n\t */\n\n\tif (!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {\n\t\tgoto skip_array_exotic;\n\t}\n\n\tif (key == DUK_HTHREAD_STRING_LENGTH(thr)) {\n\t\tduk_harray *a;\n\n\t\t/* E5 Section 15.4.5.1, step 3, steps a - i are implemented here, j - n at the end */\n\t\tif (!has_value) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"exotic array behavior for 'length', but no value in descriptor -> normal behavior\"));\n\t\t\tgoto skip_array_exotic;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"exotic array behavior for 'length', value present in descriptor -> exotic behavior\"));\n\n\t\t/*\n\t\t *  Get old and new length\n\t\t */\n\n\t\ta = (duk_harray *) obj;\n\t\tDUK_ASSERT_HARRAY_VALID(a);\n\t\tarrlen_old_len = a->length;\n\n\t\tDUK_ASSERT(idx_value >= 0);\n\t\tarrlen_new_len = duk__to_new_array_length_checked(thr, DUK_GET_TVAL_POSIDX(thr, idx_value));\n\t\tduk_push_u32(thr, arrlen_new_len);\n\t\tduk_replace(thr, idx_value);  /* step 3.e: replace 'Desc.[[Value]]' */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"old_len=%ld, new_len=%ld\", (long) arrlen_old_len, (long) arrlen_new_len));\n\n\t\tif (arrlen_new_len >= arrlen_old_len) {\n\t\t\t/* standard behavior, step 3.f.i */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"new length is same or higher as previous => standard behavior\"));\n\t\t\tgoto skip_array_exotic;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"new length is smaller than previous => exotic post behavior\"));\n\n\t\t/* XXX: consolidated algorithm step 15.f -> redundant? */\n\t\tif (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) {\n\t\t\t/* Array .length is always non-configurable; if it's also\n\t\t\t * non-writable, don't allow it to be written.\n\t\t\t */\n\t\t\tgoto fail_not_configurable;\n\t\t}\n\n\t\t/* steps 3.h and 3.i */\n\t\tif (has_writable && !is_writable) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"desc writable is false, force it back to true, and flag pending write protect\"));\n\t\t\tis_writable = 1;\n\t\t\tpending_write_protect = 1;\n\t\t}\n\n\t\t/* remaining actual steps are carried out if standard DefineOwnProperty succeeds */\n\t} else if (arr_idx != DUK__NO_ARRAY_INDEX) {\n\t\t/* XXX: any chance of unifying this with the 'length' key handling? */\n\n\t\t/* E5 Section 15.4.5.1, step 4 */\n\t\tduk_uint32_t old_len;\n\t\tduk_harray *a;\n\n\t\ta = (duk_harray *) obj;\n\t\tDUK_ASSERT_HARRAY_VALID(a);\n\n\t\told_len = a->length;\n\n\t\tif (arr_idx >= old_len) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty requires array length update \"\n\t\t\t                     \"(arr_idx=%ld, old_len=%ld)\",\n\t\t\t                     (long) arr_idx, (long) old_len));\n\n\t\t\tif (DUK_HARRAY_LENGTH_NONWRITABLE(a) && !force_flag) {\n\t\t\t\t/* Array .length is always non-configurable, so\n\t\t\t\t * if it's also non-writable, don't allow a value\n\t\t\t\t * write.  With force flag allow writing.\n\t\t\t\t */\n\t\t\t\tgoto fail_not_configurable;\n\t\t\t}\n\n\t\t\t/* actual update happens once write has been completed without\n\t\t\t * error below.\n\t\t\t */\n\t\t\tDUK_ASSERT(arr_idx != 0xffffffffUL);\n\t\t\tarridx_new_array_length = arr_idx + 1;\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty does not require length update \"\n\t\t\t                     \"(arr_idx=%ld, old_len=%ld) -> standard behavior\",\n\t\t\t                     (long) arr_idx, (long) old_len));\n\t\t}\n\t}\n skip_array_exotic:\n\n\t/* XXX: There is currently no support for writing buffer object\n\t * indexed elements here.  Attempt to do so will succeed and\n\t * write a concrete property into the buffer object.  This should\n\t * be fixed at some point but because buffers are a custom feature\n\t * anyway, this is relatively unimportant.\n\t */\n\n\t/*\n\t *  Actual Object.defineProperty() default algorithm.\n\t */\n\n\t/*\n\t *  First check whether property exists; if not, simple case.  This covers\n\t *  steps 1-4.\n\t */\n\n\tif (!duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"property does not exist\"));\n\n\t\tif (!DUK_HOBJECT_HAS_EXTENSIBLE(obj) && !force_flag) {\n\t\t\tgoto fail_not_extensible;\n\t\t}\n\n#if defined(DUK_USE_ROM_OBJECTS)\n\t\t/* ROM objects are never extensible but force flag may\n\t\t * allow us to come here anyway.\n\t\t */\n\t\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj) || !DUK_HOBJECT_HAS_EXTENSIBLE(obj));\n\t\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {\n\t\t\tDUK_D(DUK_DPRINT(\"attempt to define property on a read-only target object\"));\n\t\t\tgoto fail_not_configurable;\n\t\t}\n#endif\n\n\t\t/* XXX: share final setting code for value and flags?  difficult because\n\t\t * refcount code is different.  Share entry allocation?  But can't allocate\n\t\t * until array index checked.\n\t\t */\n\n\t\t/* steps 4.a and 4.b are tricky */\n\t\tif (has_set || has_get) {\n\t\t\tduk_int_t e_idx;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"create new accessor property\"));\n\n\t\t\tDUK_ASSERT(has_set || set == NULL);\n\t\t\tDUK_ASSERT(has_get || get == NULL);\n\t\t\tDUK_ASSERT(!has_value);\n\t\t\tDUK_ASSERT(!has_writable);\n\n\t\t\tnew_flags = DUK_PROPDESC_FLAG_ACCESSOR;  /* defaults, E5 Section 8.6.1, Table 7 */\n\t\t\tif (has_enumerable && is_enumerable) {\n\t\t\t\tnew_flags |= DUK_PROPDESC_FLAG_ENUMERABLE;\n\t\t\t}\n\t\t\tif (has_configurable && is_configurable) {\n\t\t\t\tnew_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t\t}\n\n\t\t\tif (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"accessor cannot go to array part, abandon array\"));\n\t\t\t\tduk__abandon_array_checked(thr, obj);\n\t\t\t}\n\n\t\t\t/* write to entry part */\n\t\t\te_idx = duk__hobject_alloc_entry_checked(thr, obj, key);\n\t\t\tDUK_ASSERT(e_idx >= 0);\n\n\t\t\tDUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, e_idx, get);\n\t\t\tDUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, e_idx, set);\n\t\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, get);\n\t\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, set);\n\n\t\t\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags);\n\t\t\tgoto success_exotics;\n\t\t} else {\n\t\t\tduk_int_t e_idx;\n\t\t\tduk_tval *tv2;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"create new data property\"));\n\n\t\t\tDUK_ASSERT(!has_set);\n\t\t\tDUK_ASSERT(!has_get);\n\n\t\t\tnew_flags = 0;  /* defaults, E5 Section 8.6.1, Table 7 */\n\t\t\tif (has_writable && is_writable) {\n\t\t\t\tnew_flags |= DUK_PROPDESC_FLAG_WRITABLE;\n\t\t\t}\n\t\t\tif (has_enumerable && is_enumerable) {\n\t\t\t\tnew_flags |= DUK_PROPDESC_FLAG_ENUMERABLE;\n\t\t\t}\n\t\t\tif (has_configurable && is_configurable) {\n\t\t\t\tnew_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t\t}\n\t\t\tif (has_value) {\n\t\t\t\tduk_tval *tv_tmp = duk_require_tval(thr, idx_value);\n\t\t\t\tDUK_TVAL_SET_TVAL(&tv, tv_tmp);\n\t\t\t} else {\n\t\t\t\tDUK_TVAL_SET_UNDEFINED(&tv);  /* default value */\n\t\t\t}\n\n\t\t\tif (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_ARRAY_PART(obj)) {\n\t\t\t\tif (new_flags == DUK_PROPDESC_FLAGS_WEC) {\n#if 0\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"new data property attributes match array defaults, attempt to write to array part\"));\n\t\t\t\t\t/* may become sparse...*/\n#endif\n\t\t\t\t\t/* XXX: handling for array part missing now; this doesn't affect\n\t\t\t\t\t * compliance but causes array entry writes using defineProperty()\n\t\t\t\t\t * to always abandon array part.\n\t\t\t\t\t */\n\t\t\t\t}\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"new data property cannot go to array part, abandon array\"));\n\t\t\t\tduk__abandon_array_checked(thr, obj);\n\t\t\t\t/* fall through */\n\t\t\t}\n\n\t\t\t/* write to entry part */\n\t\t\te_idx = duk__hobject_alloc_entry_checked(thr, obj, key);\n\t\t\tDUK_ASSERT(e_idx >= 0);\n\t\t\ttv2 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, e_idx);\n\t\t\tDUK_TVAL_SET_TVAL(tv2, &tv);\n\t\t\tDUK_TVAL_INCREF(thr, tv2);\n\n\t\t\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, e_idx, new_flags);\n\t\t\tgoto success_exotics;\n\t\t}\n\t\tDUK_UNREACHABLE();\n\t}\n\n\t/* we currently assume virtual properties are not configurable (as none of them are) */\n\tDUK_ASSERT((curr.e_idx >= 0 || curr.a_idx >= 0) || !(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE));\n\n\t/* [obj key desc value get set curr_value] */\n\n\t/*\n\t *  Property already exists.  Steps 5-6 detect whether any changes need\n\t *  to be made.\n\t */\n\n\tif (has_enumerable) {\n\t\tif (is_enumerable) {\n\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE)) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t} else {\n\t\t\tif (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t}\n\t}\n\tif (has_configurable) {\n\t\tif (is_configurable) {\n\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t} else {\n\t\t\tif (curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t}\n\t}\n\tif (has_value) {\n\t\tduk_tval *tmp1;\n\t\tduk_tval *tmp2;\n\n\t\t/* attempt to change from accessor to data property */\n\t\tif (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\tgoto need_check;\n\t\t}\n\n\t\ttmp1 = duk_require_tval(thr, -1);         /* curr value */\n\t\ttmp2 = duk_require_tval(thr, idx_value);  /* new value */\n\t\tif (!duk_js_samevalue(tmp1, tmp2)) {\n\t\t\tgoto need_check;\n\t\t}\n\t}\n\tif (has_writable) {\n\t\t/* attempt to change from accessor to data property */\n\t\tif (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\tgoto need_check;\n\t\t}\n\n\t\tif (is_writable) {\n\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE)) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t} else {\n\t\t\tif (curr.flags & DUK_PROPDESC_FLAG_WRITABLE) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t}\n\t}\n\tif (has_set) {\n\t\tif (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\tif (set != curr.set) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t} else {\n\t\t\tgoto need_check;\n\t\t}\n\t}\n\tif (has_get) {\n\t\tif (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\tif (get != curr.get) {\n\t\t\t\tgoto need_check;\n\t\t\t}\n\t\t} else {\n\t\t\tgoto need_check;\n\t\t}\n\t}\n\n\t/* property exists, either 'desc' is empty, or all values\n\t * match (SameValue)\n\t */\n\tgoto success_no_exotics;\n\n need_check:\n\n\t/*\n\t *  Some change(s) need to be made.  Steps 7-11.\n\t */\n\n\t/* shared checks for all descriptor types */\n\tif (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {\n\t\tif (has_configurable && is_configurable) {\n\t\t\tgoto fail_not_configurable;\n\t\t}\n\t\tif (has_enumerable) {\n\t\t\tif (curr.flags & DUK_PROPDESC_FLAG_ENUMERABLE) {\n\t\t\t\tif (!is_enumerable) {\n\t\t\t\t\tgoto fail_not_configurable;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (is_enumerable) {\n\t\t\t\t\tgoto fail_not_configurable;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Virtual properties don't have backing so they can't mostly be\n\t * edited.  Some virtual properties are, however, writable: for\n\t * example, virtual index properties of buffer objects and Array\n\t * instance .length.  These are not configurable so the checks\n\t * above mostly cover attempts to change them, except when the\n\t * duk_def_prop() call is used with DUK_DEFPROP_FORCE; even in\n\t * that case we can't forcibly change the property attributes\n\t * because they don't have concrete backing.\n\t */\n\n\t/* XXX: for ROM objects too it'd be best if value modify was\n\t * allowed if the value matches SameValue.\n\t */\n\t/* Reject attempt to change a read-only object. */\n#if defined(DUK_USE_ROM_OBJECTS)\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {\n\t\tDUK_DD(DUK_DDPRINT(\"attempt to define property on read-only target object\"));\n\t\tgoto fail_not_configurable;\n\t}\n#endif\n\n\t/* descriptor type specific checks */\n\tif (has_set || has_get) {\n\t\t/* IsAccessorDescriptor(desc) == true */\n\t\tDUK_ASSERT(!has_writable);\n\t\tDUK_ASSERT(!has_value);\n\n\t\tif (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\t/* curr and desc are accessors */\n\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {\n\t\t\t\tif (has_set && set != curr.set) {\n\t\t\t\t\tgoto fail_not_configurable;\n\t\t\t\t}\n\t\t\t\tif (has_get && get != curr.get) {\n\t\t\t\t\tgoto fail_not_configurable;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tduk_bool_t rc;\n\t\t\tduk_tval *tv1;\n\n\t\t\t/* curr is data, desc is accessor */\n\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {\n\t\t\t\tgoto fail_not_configurable;\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"convert property to accessor property\"));\n\t\t\tif (curr.a_idx >= 0) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"property to convert is stored in an array entry, abandon array and re-lookup\"));\n\t\t\t\tduk__abandon_array_checked(thr, obj);\n\t\t\t\tduk_pop_unsafe(thr);  /* remove old value */\n\t\t\t\trc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE);\n\t\t\t\tDUK_UNREF(rc);\n\t\t\t\tDUK_ASSERT(rc != 0);\n\t\t\t\tDUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0);\n\t\t\t}\n\t\t\tif (curr.e_idx < 0) {\n\t\t\t\tDUK_ASSERT(curr.a_idx < 0 && curr.e_idx < 0);\n\t\t\t\tgoto fail_virtual;  /* safeguard for virtual property */\n\t\t\t}\n\n\t\t\tDUK_ASSERT(curr.e_idx >= 0);\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));\n\n\t\t\ttv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx);\n\t\t\tDUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, tv1);  /* XXX: just decref */\n\n\t\t\tDUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL);\n\t\t\tDUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL);\n\t\t\tDUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx);\n\t\t\tDUK_HOBJECT_E_SLOT_SET_ACCESSOR(thr->heap, obj, curr.e_idx);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"flags after data->accessor conversion: 0x%02lx\",\n\t\t\t                     (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx)));\n\t\t\t/* Update curr.flags; faster than a re-lookup. */\n\t\t\tcurr.flags &= ~DUK_PROPDESC_FLAG_WRITABLE;\n\t\t\tcurr.flags |= DUK_PROPDESC_FLAG_ACCESSOR;\n\t\t}\n\t} else if (has_value || has_writable) {\n\t\t/* IsDataDescriptor(desc) == true */\n\t\tDUK_ASSERT(!has_set);\n\t\tDUK_ASSERT(!has_get);\n\n\t\tif (curr.flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\tduk_hobject *tmp;\n\n\t\t\t/* curr is accessor, desc is data */\n\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {\n\t\t\t\tgoto fail_not_configurable;\n\t\t\t}\n\n\t\t\t/* curr is accessor -> cannot be in array part. */\n\t\t\tDUK_ASSERT(curr.a_idx < 0);\n\t\t\tif (curr.e_idx < 0) {\n\t\t\t\tgoto fail_virtual;  /* safeguard; no virtual accessors now */\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"convert property to data property\"));\n\n\t\t\tDUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));\n\t\t\ttmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx);\n\t\t\tDUK_UNREF(tmp);\n\t\t\tDUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, NULL);\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);\n\t\t\ttmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx);\n\t\t\tDUK_UNREF(tmp);\n\t\t\tDUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, NULL);\n\t\t\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);\n\n\t\t\tDUK_TVAL_SET_UNDEFINED(DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx));\n\t\t\tDUK_HOBJECT_E_SLOT_CLEAR_WRITABLE(thr->heap, obj, curr.e_idx);\n\t\t\tDUK_HOBJECT_E_SLOT_CLEAR_ACCESSOR(thr->heap, obj, curr.e_idx);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"flags after accessor->data conversion: 0x%02lx\",\n\t\t\t                     (unsigned long) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, curr.e_idx)));\n\n\t\t\t/* Update curr.flags; faster than a re-lookup. */\n\t\t\tcurr.flags &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_ACCESSOR);\n\t\t} else {\n\t\t\t/* curr and desc are data */\n\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_CONFIGURABLE) && !force_flag) {\n\t\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_writable && is_writable) {\n\t\t\t\t\tgoto fail_not_configurable;\n\t\t\t\t}\n\t\t\t\t/* Note: changing from writable to non-writable is OK */\n\t\t\t\tif (!(curr.flags & DUK_PROPDESC_FLAG_WRITABLE) && has_value) {\n\t\t\t\t\tduk_tval *tmp1 = duk_require_tval(thr, -1);         /* curr value */\n\t\t\t\t\tduk_tval *tmp2 = duk_require_tval(thr, idx_value);  /* new value */\n\t\t\t\t\tif (!duk_js_samevalue(tmp1, tmp2)) {\n\t\t\t\t\t\tgoto fail_not_configurable;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\t/* IsGenericDescriptor(desc) == true; this means in practice that 'desc'\n\t\t * only has [[Enumerable]] or [[Configurable]] flag updates, which are\n\t\t * allowed at this point.\n\t\t */\n\n\t\tDUK_ASSERT(!has_value && !has_writable && !has_get && !has_set);\n\t}\n\n\t/*\n\t *  Start doing property attributes updates.  Steps 12-13.\n\t *\n\t *  Start by computing new attribute flags without writing yet.\n\t *  Property type conversion is done above if necessary.\n\t */\n\n\tnew_flags = curr.flags;\n\n\tif (has_enumerable) {\n\t\tif (is_enumerable) {\n\t\t\tnew_flags |= DUK_PROPDESC_FLAG_ENUMERABLE;\n\t\t} else {\n\t\t\tnew_flags &= ~DUK_PROPDESC_FLAG_ENUMERABLE;\n\t\t}\n\t}\n\tif (has_configurable) {\n\t\tif (is_configurable) {\n\t\t\tnew_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t} else {\n\t\t\tnew_flags &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t}\n\t}\n\tif (has_writable) {\n\t\tif (is_writable) {\n\t\t\tnew_flags |= DUK_PROPDESC_FLAG_WRITABLE;\n\t\t} else {\n\t\t\tnew_flags &= ~DUK_PROPDESC_FLAG_WRITABLE;\n\t\t}\n\t}\n\n\t/* XXX: write protect after flag? -> any chance of handling it here? */\n\n\tDUK_DDD(DUK_DDDPRINT(\"new flags that we want to write: 0x%02lx\",\n\t                     (unsigned long) new_flags));\n\n\t/*\n\t *  Check whether we need to abandon an array part (if it exists)\n\t */\n\n\tif (curr.a_idx >= 0) {\n\t\tduk_bool_t rc;\n\n\t\tDUK_ASSERT(curr.e_idx < 0);\n\n\t\tif (new_flags == DUK_PROPDESC_FLAGS_WEC) {\n\t\t\tduk_tval *tv1, *tv2;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"array index, new property attributes match array defaults, update in-place\"));\n\n\t\t\tDUK_ASSERT(curr.flags == DUK_PROPDESC_FLAGS_WEC);  /* must have been, since in array part */\n\t\t\tDUK_ASSERT(!has_set);\n\t\t\tDUK_ASSERT(!has_get);\n\t\t\tDUK_ASSERT(idx_value >= 0);  /* must be: if attributes match and we get here the value must differ (otherwise no change) */\n\n\t\t\ttv2 = duk_require_tval(thr, idx_value);\n\t\t\ttv1 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, curr.a_idx);\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2);  /* side effects; may invalidate a_idx */\n\t\t\tgoto success_exotics;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"array index, new property attributes do not match array defaults, abandon array and re-lookup\"));\n\t\tduk__abandon_array_checked(thr, obj);\n\t\tduk_pop_unsafe(thr);  /* remove old value */\n\t\trc = duk__get_own_propdesc_raw(thr, obj, key, arr_idx, &curr, DUK_GETDESC_FLAG_PUSH_VALUE);\n\t\tDUK_UNREF(rc);\n\t\tDUK_ASSERT(rc != 0);\n\t\tDUK_ASSERT(curr.e_idx >= 0 && curr.a_idx < 0);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"updating existing property in entry part\"));\n\n\t/* Array case is handled comprehensively above: either in entry\n\t * part or a virtual property.\n\t */\n\tDUK_ASSERT(curr.a_idx < 0);\n\n\tDUK_DDD(DUK_DDDPRINT(\"update existing property attributes\"));\n\tif (curr.e_idx >= 0) {\n\t\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, obj, curr.e_idx, new_flags);\n\t} else {\n\t\t/* For Array .length the only allowed transition is for .length\n\t\t * to become non-writable.\n\t\t */\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {\n\t\t\tduk_harray *a;\n\t\t\ta = (duk_harray *) obj;\n\t\t\tDUK_DD(DUK_DDPRINT(\"Object.defineProperty() attribute update for duk_harray .length -> %02lx\", (unsigned long) new_flags));\n\t\t\tDUK_ASSERT_HARRAY_VALID(a);\n\t\t\tif ((new_flags & DUK_PROPDESC_FLAGS_EC) != (curr.flags & DUK_PROPDESC_FLAGS_EC)) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"Object.defineProperty() attempt to change virtual array .length enumerable or configurable attribute, fail\"));\n\t\t\t\tgoto fail_virtual;\n\t\t\t}\n\t\t\tif (new_flags & DUK_PROPDESC_FLAG_WRITABLE) {\n\t\t\t\tDUK_HARRAY_SET_LENGTH_WRITABLE(a);\n\t\t\t} else {\n\t\t\t\tDUK_HARRAY_SET_LENGTH_NONWRITABLE(a);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (has_set) {\n\t\tduk_hobject *tmp;\n\n\t\t/* Virtual properties are non-configurable but with a 'force'\n\t\t * flag we might come here so check explicitly for virtual.\n\t\t */\n\t\tif (curr.e_idx < 0) {\n\t\t\tgoto fail_virtual;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"update existing property setter\"));\n\t\tDUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));\n\n\t\ttmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, obj, curr.e_idx);\n\t\tDUK_UNREF(tmp);\n\t\tDUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, obj, curr.e_idx, set);\n\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, set);\n\t\tDUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);  /* side effects; may invalidate e_idx */\n\t}\n\tif (has_get) {\n\t\tduk_hobject *tmp;\n\n\t\tif (curr.e_idx < 0) {\n\t\t\tgoto fail_virtual;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"update existing property getter\"));\n\t\tDUK_ASSERT(DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));\n\n\t\ttmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, obj, curr.e_idx);\n\t\tDUK_UNREF(tmp);\n\t\tDUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, obj, curr.e_idx, get);\n\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, get);\n\t\tDUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);  /* side effects; may invalidate e_idx */\n\t}\n\tif (has_value) {\n\t\tduk_tval *tv1, *tv2;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"update existing property value\"));\n\n\t\tif (curr.e_idx >= 0) {\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, obj, curr.e_idx));\n\t\t\ttv2 = duk_require_tval(thr, idx_value);\n\t\t\ttv1 = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, obj, curr.e_idx);\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2);  /* side effects; may invalidate e_idx */\n\t\t} else {\n\t\t\tDUK_ASSERT(curr.a_idx < 0);  /* array part case handled comprehensively previously */\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"Object.defineProperty(), value update for virtual property\"));\n\t\t\t/* XXX: Uint8Array and other typed array virtual writes not currently\n\t\t\t * handled.\n\t\t\t */\n\t\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr) && DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {\n\t\t\t\tduk_harray *a;\n\t\t\t\ta = (duk_harray *) obj;\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"Object.defineProperty() value update for duk_harray .length -> %ld\", (long) arrlen_new_len));\n\t\t\t\tDUK_ASSERT_HARRAY_VALID(a);\n\t\t\t\ta->length = arrlen_new_len;\n\t\t\t} else {\n\t\t\t\tgoto fail_virtual;  /* should not happen */\n\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t *  Standard algorithm succeeded without errors, check for exotic post-behaviors.\n\t *\n\t *  Arguments exotic behavior in E5 Section 10.6 occurs after the standard\n\t *  [[DefineOwnProperty]] has completed successfully.\n\t *\n\t *  Array exotic behavior in E5 Section 15.4.5.1 is implemented partly\n\t *  prior to the default [[DefineOwnProperty]], but:\n\t *    - for an array index key (e.g. \"10\") the final 'length' update occurs here\n\t *    - for 'length' key the element deletion and 'length' update occurs here\n\t */\n\n success_exotics:\n\n\t/* curr.a_idx or curr.e_idx may have been invalidated by side effects\n\t * above.\n\t */\n\n\t/* [obj key desc value get set curr_value] */\n\n\tif (DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj)) {\n\t\tduk_harray *a;\n\n\t\ta = (duk_harray *) obj;\n\t\tDUK_ASSERT_HARRAY_VALID(a);\n\n\t\tif (arridx_new_array_length > 0) {\n\t\t\t/*\n\t\t\t *  Note: zero works as a \"no update\" marker because the new length\n\t\t\t *  can never be zero after a new property is written.\n\t\t\t */\n\n\t\t\t/* E5 Section 15.4.5.1, steps 4.e.i - 4.e.ii */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty successful, pending array length update to: %ld\",\n\t\t\t                     (long) arridx_new_array_length));\n\n\t\t\ta->length = arridx_new_array_length;\n\t\t}\n\n\t\tif (key == DUK_HTHREAD_STRING_LENGTH(thr) && arrlen_new_len < arrlen_old_len) {\n\t\t\t/*\n\t\t\t *  E5 Section 15.4.5.1, steps 3.k - 3.n.  The order at the end combines\n\t\t\t *  the error case 3.l.iii and the success case 3.m-3.n.\n\t\t\t */\n\n\t\t\t/* XXX: investigate whether write protect can be handled above, if we\n\t\t\t * just update length here while ignoring its protected status\n\t\t\t */\n\n\t\t\tduk_uint32_t result_len;\n\t\t\tduk_bool_t rc;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty successful, key is 'length', exotic array behavior, \"\n\t\t\t                     \"doing array element deletion and length update\"));\n\n\t\t\trc = duk__handle_put_array_length_smaller(thr, obj, arrlen_old_len, arrlen_new_len, force_flag, &result_len);\n\n\t\t\t/* update length (curr points to length, and we assume it's still valid) */\n\t\t\tDUK_ASSERT(result_len >= arrlen_new_len && result_len <= arrlen_old_len);\n\n\t\t\ta->length = result_len;\n\n\t\t\tif (pending_write_protect) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"setting array length non-writable (pending writability update)\"));\n\t\t\t\tDUK_HARRAY_SET_LENGTH_NONWRITABLE(a);\n\t\t\t}\n\n\t\t\t/* XXX: shrink array allocation or entries compaction here? */\n\t\t\tif (!rc) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"array length write only partially successful\"));\n\t\t\t\tgoto fail_not_configurable;\n\t\t\t}\n\t\t}\n\t} else if (arr_idx != DUK__NO_ARRAY_INDEX && DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(obj)) {\n\t\tduk_hobject *map;\n\t\tduk_hobject *varenv;\n\n\t\tDUK_ASSERT(arridx_new_array_length == 0);\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(obj));  /* traits are separate; in particular, arguments not an array */\n\n\t\tmap = NULL;\n\t\tvarenv = NULL;\n\t\tif (!duk__lookup_arguments_map(thr, obj, key, &curr, &map, &varenv)) {\n\t\t\tgoto success_no_exotics;\n\t\t}\n\t\tDUK_ASSERT(map != NULL);\n\t\tDUK_ASSERT(varenv != NULL);\n\n\t\t/* [obj key desc value get set curr_value varname] */\n\n\t\tif (has_set || has_get) {\n\t\t\t/* = IsAccessorDescriptor(Desc) */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty successful, key mapped to arguments 'map' \"\n\t\t\t                     \"changed to an accessor, delete arguments binding\"));\n\n\t\t\t(void) duk_hobject_delprop_raw(thr, map, key, 0);  /* ignore result */\n\t\t} else {\n\t\t\t/* Note: this order matters (final value before deleting map entry must be done) */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty successful, key mapped to arguments 'map', \"\n\t\t\t                     \"check for value update / binding deletion\"));\n\n\t\t\tif (has_value) {\n\t\t\t\tduk_hstring *varname;\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty successful, key mapped to arguments 'map', \"\n\t\t\t\t                     \"update bound value (variable/argument)\"));\n\n\t\t\t\tvarname = duk_require_hstring(thr, -1);\n\t\t\t\tDUK_ASSERT(varname != NULL);\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"arguments object automatic putvar for a bound variable; \"\n\t\t\t\t                     \"key=%!O, varname=%!O, value=%!T\",\n\t\t\t\t                     (duk_heaphdr *) key,\n\t\t\t\t                     (duk_heaphdr *) varname,\n\t\t\t\t                     (duk_tval *) duk_require_tval(thr, idx_value)));\n\n\t\t\t\t/* strict flag for putvar comes from our caller (currently: fixed) */\n\t\t\t\tduk_js_putvar_envrec(thr, varenv, varname, duk_require_tval(thr, idx_value), 1 /*throw_flag*/);\n\t\t\t}\n\t\t\tif (has_writable && !is_writable) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"defineProperty successful, key mapped to arguments 'map', \"\n\t\t\t\t                     \"changed to non-writable, delete arguments binding\"));\n\n\t\t\t\t(void) duk_hobject_delprop_raw(thr, map, key, 0);  /* ignore result */\n\t\t\t}\n\t\t}\n\n\t\t/* 'varname' is in stack in this else branch, leaving an unbalanced stack below,\n\t\t * but this doesn't matter now.\n\t\t */\n\t}\n\n success_no_exotics:\n\t/* Some code paths use NORZ macros for simplicity, ensure refzero\n\t * handling is completed.\n\t */\n\tDUK_REFZERO_CHECK_SLOW(thr);\n\treturn 1;\n\n fail_not_extensible:\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_EXTENSIBLE);\n\t}\n\treturn 0;\n\n fail_virtual:  /* just use the same \"not configurable\" error message\" */\n fail_not_configurable:\n\tif (throw_flag) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);\n\t}\n\treturn 0;\n}\n\n/*\n *  Object.prototype.hasOwnProperty() and Object.prototype.propertyIsEnumerable().\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_object_ownprop_helper(duk_hthread *thr, duk_small_uint_t required_desc_flags) {\n\tduk_hstring *h_v;\n\tduk_hobject *h_obj;\n\tduk_propdesc desc;\n\tduk_bool_t ret;\n\n\t/* coercion order matters */\n\th_v = duk_to_hstring_acceptsymbol(thr, 0);\n\tDUK_ASSERT(h_v != NULL);\n\n\th_obj = duk_push_this_coercible_to_object(thr);\n\tDUK_ASSERT(h_obj != NULL);\n\n\tret = duk_hobject_get_own_propdesc(thr, h_obj, h_v, &desc, 0 /*flags*/);  /* don't push value */\n\n\tduk_push_boolean(thr, ret && ((desc.flags & required_desc_flags) == required_desc_flags));\n\treturn 1;\n}\n\n/*\n *  Object.seal() and Object.freeze()  (E5 Sections 15.2.3.8 and 15.2.3.9)\n *\n *  Since the algorithms are similar, a helper provides both functions.\n *  Freezing is essentially sealing + making plain properties non-writable.\n *\n *  Note: virtual (non-concrete) properties which are non-configurable but\n *  writable would pose some problems, but such properties do not currently\n *  exist (all virtual properties are non-configurable and non-writable).\n *  If they did exist, the non-configurability does NOT prevent them from\n *  becoming non-writable.  However, this change should be recorded somehow\n *  so that it would turn up (e.g. when getting the property descriptor),\n *  requiring some additional flags in the object.\n */\n\nDUK_INTERNAL void duk_hobject_object_seal_freeze_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_freeze) {\n\tduk_uint_fast32_t i;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(obj != NULL);\n\n\tDUK_ASSERT_VALSTACK_SPACE(thr, DUK__VALSTACK_SPACE);\n\n#if defined(DUK_USE_ROM_OBJECTS)\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) obj)) {\n\t\tDUK_DD(DUK_DDPRINT(\"attempt to seal/freeze a readonly object, reject\"));\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CONFIGURABLE);\n\t}\n#endif\n\n\t/*\n\t *  Abandon array part because all properties must become non-configurable.\n\t *  Note that this is now done regardless of whether this is always the case\n\t *  (skips check, but performance problem if caller would do this many times\n\t *  for the same object; not likely).\n\t */\n\n\tduk__abandon_array_checked(thr, obj);\n\tDUK_ASSERT(DUK_HOBJECT_GET_ASIZE(obj) == 0);\n\n\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\tduk_uint8_t *fp;\n\n\t\t/* since duk__abandon_array_checked() causes a resize, there should be no gaps in keys */\n\t\tDUK_ASSERT(DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i) != NULL);\n\n\t\t/* avoid multiple computations of flags address; bypasses macros */\n\t\tfp = DUK_HOBJECT_E_GET_FLAGS_PTR(thr->heap, obj, i);\n\t\tif (is_freeze && !((*fp) & DUK_PROPDESC_FLAG_ACCESSOR)) {\n\t\t\t*fp &= ~(DUK_PROPDESC_FLAG_WRITABLE | DUK_PROPDESC_FLAG_CONFIGURABLE);\n\t\t} else {\n\t\t\t*fp &= ~DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t}\n\t}\n\n\tDUK_HOBJECT_CLEAR_EXTENSIBLE(obj);\n\n\t/* no need to compact since we already did that in duk__abandon_array_checked()\n\t * (regardless of whether an array part existed or not.\n\t */\n\n\treturn;\n}\n\n/*\n *  Object.isSealed() and Object.isFrozen()  (E5 Sections 15.2.3.11, 15.2.3.13)\n *\n *  Since the algorithms are similar, a helper provides both functions.\n *  Freezing is essentially sealing + making plain properties non-writable.\n *\n *  Note: all virtual (non-concrete) properties are currently non-configurable\n *  and non-writable (and there are no accessor virtual properties), so they don't\n *  need to be considered here now.\n */\n\nDUK_INTERNAL duk_bool_t duk_hobject_object_is_sealed_frozen_helper(duk_hthread *thr, duk_hobject *obj, duk_bool_t is_frozen) {\n\tduk_uint_fast32_t i;\n\n\tDUK_ASSERT(obj != NULL);\n\tDUK_UNREF(thr);\n\n\t/* Note: no allocation pressure, no need to check refcounts etc */\n\n\t/* must not be extensible */\n\tif (DUK_HOBJECT_HAS_EXTENSIBLE(obj)) {\n\t\treturn 0;\n\t}\n\n\t/* all virtual properties are non-configurable and non-writable */\n\n\t/* entry part must not contain any configurable properties, or\n\t * writable properties (if is_frozen).\n\t */\n\tfor (i = 0; i < DUK_HOBJECT_GET_ENEXT(obj); i++) {\n\t\tduk_small_uint_t flags;\n\n\t\tif (!DUK_HOBJECT_E_GET_KEY(thr->heap, obj, i)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* avoid multiple computations of flags address; bypasses macros */\n\t\tflags = (duk_small_uint_t) DUK_HOBJECT_E_GET_FLAGS(thr->heap, obj, i);\n\n\t\tif (flags & DUK_PROPDESC_FLAG_CONFIGURABLE) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (is_frozen &&\n\t\t    !(flags & DUK_PROPDESC_FLAG_ACCESSOR) &&\n\t\t    (flags & DUK_PROPDESC_FLAG_WRITABLE)) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/* array part must not contain any non-unused properties, as they would\n\t * be configurable and writable.\n\t */\n\tfor (i = 0; i < DUK_HOBJECT_GET_ASIZE(obj); i++) {\n\t\tduk_tval *tv = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, obj, i);\n\t\tif (!DUK_TVAL_IS_UNUSED(tv)) {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\treturn 1;\n}\n\n/*\n *  Object.preventExtensions() and Object.isExtensible()  (E5 Sections 15.2.3.10, 15.2.3.13)\n *\n *  Not needed, implemented by macros DUK_HOBJECT_{HAS,CLEAR,SET}_EXTENSIBLE\n *  and the Object built-in bindings.\n */\n\n/* automatic undefs */\n#undef DUK__HASH_DELETED\n#undef DUK__HASH_UNUSED\n#undef DUK__NO_ARRAY_INDEX\n#undef DUK__VALSTACK_PROXY_LOOKUP\n#undef DUK__VALSTACK_SPACE\n#line 1 \"duk_hstring_misc.c\"\n/*\n *  Misc support functions\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  duk_hstring charCodeAt, with and without surrogate awareness\n */\n\nDUK_INTERNAL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos, duk_bool_t surrogate_aware) {\n\tduk_uint32_t boff;\n\tconst duk_uint8_t *p, *p_start, *p_end;\n\tduk_ucodepoint_t cp1;\n\tduk_ucodepoint_t cp2;\n\n\t/* Caller must check character offset to be inside the string. */\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT_DISABLE(pos >= 0);  /* unsigned */\n\tDUK_ASSERT(pos < (duk_uint_t) DUK_HSTRING_GET_CHARLEN(h));\n\n\tboff = (duk_uint32_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint32_t) pos);\n\tDUK_DDD(DUK_DDDPRINT(\"charCodeAt: pos=%ld -> boff=%ld, str=%!O\",\n\t                     (long) pos, (long) boff, (duk_heaphdr *) h));\n\tDUK_ASSERT_DISABLE(boff >= 0);\n\tDUK_ASSERT(boff < DUK_HSTRING_GET_BYTELEN(h));\n\n\tp_start = DUK_HSTRING_GET_DATA(h);\n\tp_end = p_start + DUK_HSTRING_GET_BYTELEN(h);\n\tp = p_start + boff;\n\tDUK_DDD(DUK_DDDPRINT(\"p_start=%p, p_end=%p, p=%p\",\n\t                     (const void *) p_start, (const void *) p_end,\n\t                     (const void *) p));\n\n\t/* For invalid UTF-8 (never happens for standard Ecmascript strings)\n\t * return U+FFFD replacement character.\n\t */\n\tif (duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp1)) {\n\t\tif (surrogate_aware && cp1 >= 0xd800UL && cp1 <= 0xdbffUL) {\n\t\t\t/* The decode helper is memory safe even if 'cp1' was\n\t\t\t * decoded at the end of the string and 'p' is no longer\n\t\t\t * within string memory range.\n\t\t\t */\n\t\t\tcp2 = 0;  /* If call fails, this is left untouched and won't match cp2 check. */\n\t\t\t(void) duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp2);\n\t\t\tif (cp2 >= 0xdc00UL && cp2 <= 0xdfffUL) {\n\t\t\t\tcp1 = (duk_ucodepoint_t) (((cp1 - 0xd800UL) << 10) + (cp2 - 0xdc00UL) + 0x10000UL);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tcp1 = DUK_UNICODE_CP_REPLACEMENT_CHARACTER;\n\t}\n\n\treturn cp1;\n}\n\n/*\n *  duk_hstring charlen, when lazy charlen disabled\n */\n\n#if !defined(DUK_USE_HSTRING_LAZY_CLEN)\n#if !defined(DUK_USE_HSTRING_CLEN)\n#error non-lazy duk_hstring charlen but DUK_USE_HSTRING_CLEN not set\n#endif\nDUK_INTERNAL void duk_hstring_init_charlen(duk_hstring *h) {\n\tduk_uint32_t clen;\n\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(!DUK_HSTRING_HAS_ASCII(h));\n\tDUK_ASSERT(!DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h));\n\n\tclen = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));\n#if defined(DUK_USE_STRLEN16)\n\tDUK_ASSERT(clen <= 0xffffUL);  /* Bytelength checked during interning. */\n\th->clen16 = (duk_uint16_t) clen;\n#else\n\th->clen = (duk_uint32_t) clen;\n#endif\n\tif (DUK_LIKELY(clen == DUK_HSTRING_GET_BYTELEN(h))) {\n\t\tDUK_HSTRING_SET_ASCII(h);\n\t}\n}\n\nDUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) {\n#if defined(DUK_USE_STRLEN16)\n\treturn h->clen16;\n#else\n\treturn h->clen;\n#endif\n}\n#endif  /* !DUK_USE_HSTRING_LAZY_CLEN */\n\n/*\n *  duk_hstring charlen, when lazy charlen enabled\n */\n\n#if defined(DUK_USE_HSTRING_LAZY_CLEN)\n#if defined(DUK_USE_HSTRING_CLEN)\nDUK_LOCAL DUK_COLD duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) {\n\tduk_size_t res;\n\n\tDUK_ASSERT(h->clen == 0);  /* Checked by caller. */\n\n#if defined(DUK_USE_ROM_STRINGS)\n\t/* ROM strings have precomputed clen, but if the computed clen is zero\n\t * we can still come here and can't write anything.\n\t */\n\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) {\n\t\treturn 0;\n\t}\n#endif\n\n\tres = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));\n#if defined(DUK_USE_STRLEN16)\n\tDUK_ASSERT(res <= 0xffffUL);  /* Bytelength checked during interning. */\n\th->clen16 = (duk_uint16_t) res;\n#else\n\th->clen = (duk_uint32_t) res;\n#endif\n\tif (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) {\n\t\tDUK_HSTRING_SET_ASCII(h);\n\t}\n\treturn res;\n}\n#else  /* DUK_USE_HSTRING_CLEN */\nDUK_LOCAL duk_size_t duk__hstring_get_charlen_slowpath(duk_hstring *h) {\n\tif (DUK_LIKELY(DUK_HSTRING_HAS_ASCII(h))) {\n\t\t/* Most practical strings will go here. */\n\t\treturn DUK_HSTRING_GET_BYTELEN(h);\n\t} else {\n\t\t/* ASCII flag is lazy, so set it here. */\n\t\tduk_size_t res;\n\n\t\t/* XXX: here we could use the strcache to speed up the\n\t\t * computation (matters for 'i < str.length' loops).\n\t\t */\n\n\t\tres = duk_unicode_unvalidated_utf8_length(DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h));\n\n#if defined(DUK_USE_ROM_STRINGS)\n\t\tif (DUK_HEAPHDR_HAS_READONLY((duk_heaphdr *) h)) {\n\t\t\t/* For ROM strings, can't write anything; ASCII flag\n\t\t\t * is preset so we don't need to update it.\n\t\t\t */\n\t\t\treturn res;\n\t\t}\n#endif\n\t\tif (DUK_LIKELY(res == DUK_HSTRING_GET_BYTELEN(h))) {\n\t\t\tDUK_HSTRING_SET_ASCII(h);\n\t\t}\n\t\treturn res;\n\t}\n}\n#endif  /* DUK_USE_HSTRING_CLEN */\n\n#if defined(DUK_USE_HSTRING_CLEN)\nDUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) {\n#if defined(DUK_USE_STRLEN16)\n\tif (DUK_LIKELY(h->clen16 != 0)) {\n\t\treturn h->clen16;\n\t}\n#else\n\tif (DUK_LIKELY(h->clen != 0)) {\n\t\treturn h->clen;\n\t}\n#endif\n\treturn duk__hstring_get_charlen_slowpath(h);\n}\n#else  /* DUK_USE_HSTRING_CLEN */\nDUK_INTERNAL DUK_HOT duk_size_t duk_hstring_get_charlen(duk_hstring *h) {\n\t/* Always use slow path. */\n\treturn duk__hstring_get_charlen_slowpath(h);\n}\n#endif  /* DUK_USE_HSTRING_CLEN */\n#endif  /* DUK_USE_HSTRING_LAZY_CLEN */\n\n/*\n *  Compare duk_hstring to an ASCII cstring.\n */\n\nDUK_INTERNAL duk_bool_t duk_hstring_equals_ascii_cstring(duk_hstring *h, const char *cstr) {\n\tduk_size_t len;\n\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(cstr != NULL);\n\n\tlen = DUK_STRLEN(cstr);\n\tif (len != DUK_HSTRING_GET_BYTELEN(h)) {\n\t\treturn 0;\n\t}\n\tif (DUK_MEMCMP((const void *) cstr, (const void *) DUK_HSTRING_GET_DATA(h), len) == 0) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n#line 1 \"duk_hthread_alloc.c\"\n/*\n *  duk_hthread allocation and freeing.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Allocate initial stacks for a thread.  Note that 'thr' must be reachable\n *  as a garbage collection may be triggered by the allocation attempts.\n *  Returns zero (without leaking memory) if init fails.\n */\n\nDUK_INTERNAL duk_bool_t duk_hthread_init_stacks(duk_heap *heap, duk_hthread *thr) {\n\tduk_size_t alloc_size;\n\tduk_size_t i;\n\n\tDUK_ASSERT(heap != NULL);\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->valstack == NULL);\n\tDUK_ASSERT(thr->valstack_end == NULL);\n\tDUK_ASSERT(thr->valstack_alloc_end == NULL);\n\tDUK_ASSERT(thr->valstack_bottom == NULL);\n\tDUK_ASSERT(thr->valstack_top == NULL);\n\tDUK_ASSERT(thr->callstack_curr == NULL);\n\n\t/* valstack */\n\tDUK_ASSERT(DUK_VALSTACK_API_ENTRY_MINIMUM <= DUK_VALSTACK_INITIAL_SIZE);\n\talloc_size = sizeof(duk_tval) * DUK_VALSTACK_INITIAL_SIZE;\n\tthr->valstack = (duk_tval *) DUK_ALLOC(heap, alloc_size);\n\tif (!thr->valstack) {\n\t\tgoto fail;\n\t}\n\tDUK_MEMZERO(thr->valstack, alloc_size);\n\tthr->valstack_end = thr->valstack + DUK_VALSTACK_API_ENTRY_MINIMUM;\n\tthr->valstack_alloc_end = thr->valstack + DUK_VALSTACK_INITIAL_SIZE;\n\tthr->valstack_bottom = thr->valstack;\n\tthr->valstack_top = thr->valstack;\n\n\tfor (i = 0; i < DUK_VALSTACK_INITIAL_SIZE; i++) {\n\t\tDUK_TVAL_SET_UNDEFINED(&thr->valstack[i]);\n\t}\n\n\treturn 1;\n\n fail:\n\tDUK_FREE(heap, thr->valstack);\n\tDUK_ASSERT(thr->callstack_curr == NULL);\n\n\tthr->valstack = NULL;\n\treturn 0;\n}\n\n/* For indirect allocs. */\n\nDUK_INTERNAL void *duk_hthread_get_valstack_ptr(duk_heap *heap, void *ud) {\n\tduk_hthread *thr = (duk_hthread *) ud;\n\tDUK_UNREF(heap);\n\treturn (void *) thr->valstack;\n}\n#line 1 \"duk_hthread_builtins.c\"\n/*\n *  Initialize built-in objects.  Current thread must have a valstack\n *  and initialization errors may longjmp, so a setjmp() catch point\n *  must exist.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Encoding constants, must match genbuiltins.py\n */\n\n#define DUK__PROP_FLAGS_BITS             3\n#define DUK__LENGTH_PROP_BITS            3\n#define DUK__NARGS_BITS                  3\n#define DUK__PROP_TYPE_BITS              3\n\n#define DUK__NARGS_VARARGS_MARKER        0x07\n\n#define DUK__PROP_TYPE_DOUBLE            0\n#define DUK__PROP_TYPE_STRING            1\n#define DUK__PROP_TYPE_STRIDX            2\n#define DUK__PROP_TYPE_BUILTIN           3\n#define DUK__PROP_TYPE_UNDEFINED         4\n#define DUK__PROP_TYPE_BOOLEAN_TRUE      5\n#define DUK__PROP_TYPE_BOOLEAN_FALSE     6\n#define DUK__PROP_TYPE_ACCESSOR          7\n\n/*\n *  Create built-in objects by parsing an init bitstream generated\n *  by genbuiltins.py.\n */\n\n#if defined(DUK_USE_ROM_OBJECTS)\n#if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT)\nDUK_LOCAL void duk__duplicate_ram_global_object(duk_hthread *thr) {\n\tduk_hobject *h_global;\n#if defined(DUK_USE_ROM_GLOBAL_CLONE)\n\tduk_hobject *h_oldglobal;\n\tduk_uint8_t *props;\n\tduk_size_t alloc_size;\n#endif\n\tduk_hobject *h_objenv;\n\n\t/* XXX: refactor into internal helper, duk_clone_hobject() */\n\n#if defined(DUK_USE_ROM_GLOBAL_INHERIT)\n\t/* Inherit from ROM-based global object: less RAM usage, less transparent. */\n\th_global = duk_push_object_helper(thr,\n\t                                  DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                  DUK_HOBJECT_FLAG_FASTREFS |\n\t                                  DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL),\n\t                                  DUK_BIDX_GLOBAL);\n\tDUK_ASSERT(h_global != NULL);\n#elif defined(DUK_USE_ROM_GLOBAL_CLONE)\n\t/* Clone the properties of the ROM-based global object to create a\n\t * fully RAM-based global object.  Uses more memory than the inherit\n\t * model but more compliant.\n\t */\n\th_global = duk_push_object_helper(thr,\n\t                                  DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                  DUK_HOBJECT_FLAG_FASTREFS |\n\t                                  DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_GLOBAL),\n\t                                  DUK_BIDX_OBJECT_PROTOTYPE);\n\tDUK_ASSERT(h_global != NULL);\n\th_oldglobal = thr->builtins[DUK_BIDX_GLOBAL];\n\tDUK_ASSERT(h_oldglobal != NULL);\n\n\t/* Copy the property table verbatim; this handles attributes etc.\n\t * For ROM objects it's not necessary (or possible) to update\n\t * refcounts so leave them as is.\n\t */\n\talloc_size = DUK_HOBJECT_P_ALLOC_SIZE(h_oldglobal);\n\tDUK_ASSERT(alloc_size > 0);\n\tprops = DUK_ALLOC_CHECKED(thr, alloc_size);\n\tDUK_ASSERT(props != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal) != NULL);\n\tDUK_MEMCPY((void *) props, (const void *) DUK_HOBJECT_GET_PROPS(thr->heap, h_oldglobal), alloc_size);\n\n\t/* XXX: keep property attributes or tweak them here?\n\t * Properties will now be non-configurable even when they're\n\t * normally configurable for the global object.\n\t */\n\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROPS(thr->heap, h_global) == NULL);\n\tDUK_HOBJECT_SET_PROPS(thr->heap, h_global, props);\n\tDUK_HOBJECT_SET_ESIZE(h_global, DUK_HOBJECT_GET_ESIZE(h_oldglobal));\n\tDUK_HOBJECT_SET_ENEXT(h_global, DUK_HOBJECT_GET_ENEXT(h_oldglobal));\n\tDUK_HOBJECT_SET_ASIZE(h_global, DUK_HOBJECT_GET_ASIZE(h_oldglobal));\n\tDUK_HOBJECT_SET_HSIZE(h_global, DUK_HOBJECT_GET_HSIZE(h_oldglobal));\n#else\n#error internal error in config defines\n#endif\n\n\tduk_hobject_compact_props(thr, h_global);\n\tDUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL);\n\tDUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL]));  /* no need to decref: ROM object */\n\tthr->builtins[DUK_BIDX_GLOBAL] = h_global;\n\tDUK_HOBJECT_INCREF(thr, h_global);\n\tDUK_D(DUK_DPRINT(\"duplicated global object: %!O\", h_global));\n\n\t/* Create a fresh object environment for the global scope.  This is\n\t * needed so that the global scope points to the newly created RAM-based\n\t * global object.\n\t */\n\th_objenv = (duk_hobject *) duk_hobjenv_alloc(thr,\n\t                                             DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                             DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));\n\tDUK_ASSERT(h_objenv != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_objenv) == NULL);\n\tduk_push_hobject(thr, h_objenv);\n\n\tDUK_ASSERT(h_global != NULL);\n\t((duk_hobjenv *) h_objenv)->target = h_global;\n\tDUK_HOBJECT_INCREF(thr, h_global);\n\tDUK_ASSERT(((duk_hobjenv *) h_objenv)->has_this == 0);\n\n\tDUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL);\n\tDUK_ASSERT(!DUK_HEAPHDR_NEEDS_REFCOUNT_UPDATE((duk_heaphdr *) thr->builtins[DUK_BIDX_GLOBAL_ENV]));  /* no need to decref: ROM object */\n\tthr->builtins[DUK_BIDX_GLOBAL_ENV] = h_objenv;\n\tDUK_HOBJECT_INCREF(thr, h_objenv);\n\tDUK_D(DUK_DPRINT(\"duplicated global env: %!O\", h_objenv));\n\n\tDUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) h_objenv);\n\n\tduk_pop_2(thr);  /* Pop global object and global env. */\n}\n#endif  /* DUK_USE_ROM_GLOBAL_CLONE || DUK_USE_ROM_GLOBAL_INHERIT */\n\nDUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) {\n\t/* Setup builtins from ROM objects.  All heaps/threads will share\n\t * the same readonly objects.\n\t */\n\tduk_small_uint_t i;\n\n\tfor (i = 0; i < DUK_NUM_BUILTINS; i++) {\n\t\tduk_hobject *h;\n\t\th = (duk_hobject *) DUK_LOSE_CONST(duk_rom_builtins_bidx[i]);\n\t\tDUK_ASSERT(h != NULL);\n\t\tthr->builtins[i] = h;\n\t}\n\n#if defined(DUK_USE_ROM_GLOBAL_CLONE) || defined(DUK_USE_ROM_GLOBAL_INHERIT)\n\t/* By default the global object is read-only which is often much\n\t * more of an issue than having read-only built-in objects (like\n\t * RegExp, Date, etc).  Use a RAM-based copy of the global object\n\t * and the global environment object for convenience.\n\t */\n\tduk__duplicate_ram_global_object(thr);\n#endif\n}\n#else  /* DUK_USE_ROM_OBJECTS */\nDUK_LOCAL void duk__push_stridx(duk_hthread *thr, duk_bitdecoder_ctx *bd) {\n\tduk_small_uint_t n;\n\n\tn = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\tDUK_ASSERT_DISABLE(n >= 0);  /* unsigned */\n\tDUK_ASSERT(n < DUK_HEAP_NUM_STRINGS);\n\tduk_push_hstring_stridx(thr, n);\n}\nDUK_LOCAL void duk__push_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) {\n\t/* XXX: built-ins data could provide a maximum length that is\n\t * actually needed; bitpacked max length is now 256 bytes.\n\t */\n\tduk_uint8_t tmp[DUK_BD_BITPACKED_STRING_MAXLEN];\n\tduk_small_uint_t len;\n\n\tlen = duk_bd_decode_bitpacked_string(bd, tmp);\n\tduk_push_lstring(thr, (const char *) tmp, (duk_size_t) len);\n}\nDUK_LOCAL void duk__push_stridx_or_string(duk_hthread *thr, duk_bitdecoder_ctx *bd) {\n\tduk_small_uint_t n;\n\n\tn = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\tif (n == 0) {\n\t\tduk__push_string(thr, bd);\n\t} else {\n\t\tn--;\n\t\tDUK_ASSERT(n < DUK_HEAP_NUM_STRINGS);\n\t\tduk_push_hstring_stridx(thr, n);\n\t}\n}\nDUK_LOCAL void duk__push_double(duk_hthread *thr, duk_bitdecoder_ctx *bd) {\n\tduk_double_union du;\n\tduk_small_uint_t i;\n\n\tfor (i = 0; i < 8; i++) {\n\t\t/* Encoding endianness must match target memory layout,\n\t\t * build scripts and genbuiltins.py must ensure this.\n\t\t */\n\t\tdu.uc[i] = (duk_uint8_t) duk_bd_decode(bd, 8);\n\t}\n\n\tduk_push_number(thr, du.d);  /* push operation normalizes NaNs */\n}\n\nDUK_INTERNAL void duk_hthread_create_builtin_objects(duk_hthread *thr) {\n\tduk_bitdecoder_ctx bd_ctx;\n\tduk_bitdecoder_ctx *bd = &bd_ctx;  /* convenience */\n\tduk_hobject *h;\n\tduk_small_uint_t i, j;\n\n\tDUK_D(DUK_DPRINT(\"INITBUILTINS BEGIN: DUK_NUM_BUILTINS=%d, DUK_NUM_BUILTINS_ALL=%d\", (int) DUK_NUM_BUILTINS, (int) DUK_NUM_ALL_BUILTINS));\n\n\tDUK_MEMZERO(&bd_ctx, sizeof(bd_ctx));\n\tbd->data = (const duk_uint8_t *) duk_builtins_data;\n\tbd->length = (duk_size_t) DUK_BUILTINS_DATA_LENGTH;\n\n\t/*\n\t *  First create all built-in bare objects on the empty valstack.\n\t *\n\t *  Built-ins in the index range [0,DUK_NUM_BUILTINS-1] have value\n\t *  stack indices matching their eventual thr->builtins[] index.\n\t *\n\t *  Built-ins in the index range [DUK_NUM_BUILTINS,DUK_NUM_ALL_BUILTINS]\n\t *  will exist on the value stack during init but won't be placed\n\t *  into thr->builtins[].  These are objects referenced in some way\n\t *  from thr->builtins[] roots but which don't need to be indexed by\n\t *  Duktape through thr->builtins[] (e.g. user custom objects).\n\t *\n\t *  Internal prototypes will be incorrect (NULL) at this stage.\n\t */\n\n\tduk_require_stack(thr, DUK_NUM_ALL_BUILTINS);\n\n\tDUK_DD(DUK_DDPRINT(\"create empty built-ins\"));\n\tDUK_ASSERT_TOP(thr, 0);\n\tfor (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {\n\t\tduk_small_uint_t class_num;\n\t\tduk_small_int_t len = -1;  /* must be signed */\n\n\t\tclass_num = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\tlen = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__LENGTH_PROP_BITS, (duk_int32_t) -1 /*def_value*/);\n\n\t\tif (class_num == DUK_HOBJECT_CLASS_FUNCTION) {\n\t\t\tduk_small_uint_t natidx;\n\t\t\tduk_small_int_t c_nargs;  /* must hold DUK_VARARGS */\n\t\t\tduk_c_function c_func;\n\t\t\tduk_int16_t magic;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"len=%ld\", (long) len));\n\t\t\tDUK_ASSERT(len >= 0);\n\n\t\t\tnatidx = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\t\tDUK_ASSERT(natidx != 0);\n\t\t\tc_func = duk_bi_native_functions[natidx];\n\t\t\tDUK_ASSERT(c_func != NULL);\n\n\t\t\tc_nargs = (duk_small_int_t) duk_bd_decode_flagged_signed(bd, DUK__NARGS_BITS, len /*def_value*/);\n\t\t\tif (c_nargs == DUK__NARGS_VARARGS_MARKER) {\n\t\t\t\tc_nargs = DUK_VARARGS;\n\t\t\t}\n\n\t\t\t/* XXX: set magic directly here? (it could share the c_nargs arg) */\n\t\t\t(void) duk_push_c_function_builtin(thr, c_func, c_nargs);\n\t\t\th = duk_known_hobject(thr, -1);\n\n\t\t\t/* Currently all built-in native functions are strict.\n\t\t\t * duk_push_c_function() now sets strict flag, so\n\t\t\t * assert for it.\n\t\t\t */\n\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_STRICT(h));\n\n\t\t\t/* XXX: function properties */\n\n\t\t\tduk__push_stridx_or_string(thr, bd);\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\t\t\tduk_xdef_prop_stridx_short(thr,\n\t\t\t                           -2,\n\t\t\t                           DUK_STRIDX_NAME,\n\t\t\t                           DUK_PROPDESC_FLAGS_C);\n#else\n\t\t\tduk_pop(thr);  /* Not very ideal but good enough for now. */\n#endif\n\n\t\t\t/* Almost all global level Function objects are constructable\n\t\t\t * but not all: Function.prototype is a non-constructable,\n\t\t\t * callable Function.\n\t\t\t */\n\t\t\tif (duk_bd_decode_flag(bd)) {\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_CONSTRUCTABLE(h));\n\t\t\t} else {\n\t\t\t\tDUK_HOBJECT_CLEAR_CONSTRUCTABLE(h);\n\t\t\t}\n\n\t\t\t/* Cast converts magic to 16-bit signed value */\n\t\t\tmagic = (duk_int16_t) duk_bd_decode_varuint(bd);\n\t\t\t((duk_hnatfunc *) h)->magic = magic;\n\t\t} else if (class_num == DUK_HOBJECT_CLASS_ARRAY) {\n\t\t\tduk_push_array(thr);\n\t\t} else if (class_num == DUK_HOBJECT_CLASS_OBJENV) {\n\t\t\tduk_hobjenv *env;\n\t\t\tduk_hobject *global;\n\n\t\t\tDUK_ASSERT(i == DUK_BIDX_GLOBAL_ENV);\n\t\t\tDUK_ASSERT(DUK_BIDX_GLOBAL_ENV > DUK_BIDX_GLOBAL);\n\n\t\t\tenv = duk_hobjenv_alloc(thr,\n\t                                        DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                                        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));\n\t\t\tDUK_ASSERT(env->target == NULL);\n\t\t\tduk_push_hobject(thr, (duk_hobject *) env);\n\n\t\t\tglobal = duk_known_hobject(thr, DUK_BIDX_GLOBAL);\n\t\t\tDUK_ASSERT(global != NULL);\n\t\t\tenv->target = global;\n\t\t\tDUK_HOBJECT_INCREF(thr, global);\n\t\t\tDUK_ASSERT(env->has_this == 0);\n\n\t\t\tDUK_ASSERT_HOBJENV_VALID(env);\n\t\t} else {\n\t\t\tDUK_ASSERT(class_num != DUK_HOBJECT_CLASS_DECENV);\n\n\t\t\t(void) duk_push_object_helper(thr,\n\t\t\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t\t\t                              DUK_HOBJECT_FLAG_EXTENSIBLE,\n\t\t\t                              -1);  /* no prototype or class yet */\n\n\t\t}\n\n\t\th = duk_known_hobject(thr, -1);\n\t\tDUK_HOBJECT_SET_CLASS_NUMBER(h, class_num);\n\n\t\tif (i < DUK_NUM_BUILTINS) {\n\t\t\tthr->builtins[i] = h;\n\t\t\tDUK_HOBJECT_INCREF(thr, &h->hdr);\n\t\t}\n\n\t\tif (len >= 0) {\n\t\t\t/* In ES2015+ built-in function object .length property\n\t\t\t * has property attributes C (configurable only):\n\t\t\t * http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-standard-built-in-objects\n\t\t\t *\n\t\t\t * Array.prototype remains an Array instance in ES2015+\n\t\t\t * and its length has attributes W (writable only).\n\t\t\t * Because .length is now virtual for duk_harray, it is\n\t\t\t * not encoded explicitly in init data.\n\t\t\t */\n\n\t\t\tDUK_ASSERT(class_num != DUK_HOBJECT_CLASS_ARRAY);  /* .length is virtual */\n\t\t\tduk_push_int(thr, len);\n\t\t\tduk_xdef_prop_stridx_short(thr,\n\t\t\t                           -2,\n\t\t\t                           DUK_STRIDX_LENGTH,\n\t\t\t                           DUK_PROPDESC_FLAGS_C);\n\t\t}\n\n\t\t/* enable exotic behaviors last */\n\n\t\tif (class_num == DUK_HOBJECT_CLASS_ARRAY) {\n\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h));  /* set by duk_push_array() */\n\t\t}\n\t\tif (class_num == DUK_HOBJECT_CLASS_STRING) {\n\t\t\tDUK_HOBJECT_SET_EXOTIC_STRINGOBJ(h);\n\t\t}\n\n\t\t/* some assertions */\n\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h));\n\t\t/* DUK_HOBJECT_FLAG_CONSTRUCTABLE varies */\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(h));\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_COMPFUNC(h));\n\t\t/* DUK_HOBJECT_FLAG_NATFUNC varies */\n\t\tDUK_ASSERT(!DUK_HOBJECT_IS_THREAD(h));\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(h) || class_num == DUK_HOBJECT_CLASS_ARRAY);\n\t\t/* DUK_HOBJECT_FLAG_STRICT varies */\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(h) ||  /* all native functions have NEWENV */\n\t\t           DUK_HOBJECT_HAS_NEWENV(h));\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(h));\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(h));\n\t\t/* DUK_HOBJECT_FLAG_EXOTIC_ARRAY varies */\n\t\t/* DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ varies */\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(h));\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"created built-in %ld, class=%ld, length=%ld\", (long) i, (long) class_num, (long) len));\n\t}\n\n\t/*\n\t *  Then decode the builtins init data (see genbuiltins.py) to\n\t *  init objects.  Internal prototypes are set at this stage,\n\t *  with thr->builtins[] populated.\n\t */\n\n\tDUK_DD(DUK_DDPRINT(\"initialize built-in object properties\"));\n\tfor (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {\n\t\tduk_small_uint_t t;\n\t\tduk_small_uint_t num;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"initializing built-in object at index %ld\", (long) i));\n\t\th = duk_known_hobject(thr, (duk_idx_t) i);\n\n\t\tt = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\tif (t > 0) {\n\t\t\tt--;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"set internal prototype: built-in %ld\", (long) t));\n\t\t\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, duk_known_hobject(thr, (duk_idx_t) t));\n\t\t} else if (DUK_HOBJECT_IS_NATFUNC(h)) {\n\t\t\t/* Standard native built-ins cannot inherit from\n\t\t\t * %NativeFunctionPrototype%, they are required to\n\t\t\t * inherit from Function.prototype directly.\n\t\t\t */\n\t\t\tDUK_ASSERT(thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE] != NULL);\n\t\t\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n\t\t}\n\n\t\tt = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\tif (t > 0) {\n\t\t\t/* 'prototype' property for all built-in objects (which have it) has attributes:\n\t\t\t *  [[Writable]] = false,\n\t\t\t *  [[Enumerable]] = false,\n\t\t\t *  [[Configurable]] = false\n\t\t\t */\n\t\t\tt--;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"set external prototype: built-in %ld\", (long) t));\n\t\t\tduk_dup(thr, (duk_idx_t) t);\n\t\t\tduk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_NONE);\n\t\t}\n\n\t\tt = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\tif (t > 0) {\n\t\t\t/* 'constructor' property for all built-in objects (which have it) has attributes:\n\t\t\t *  [[Writable]] = true,\n\t\t\t *  [[Enumerable]] = false,\n\t\t\t *  [[Configurable]] = true\n\t\t\t */\n\t\t\tt--;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"set external constructor: built-in %ld\", (long) t));\n\t\t\tduk_dup(thr, (duk_idx_t) t);\n\t\t\tduk_xdef_prop_stridx(thr, (duk_idx_t) i, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC);\n\t\t}\n\n\t\t/* normal valued properties */\n\t\tnum = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\tDUK_DDD(DUK_DDDPRINT(\"built-in object %ld, %ld normal valued properties\", (long) i, (long) num));\n\t\tfor (j = 0; j < num; j++) {\n\t\t\tduk_small_uint_t defprop_flags;\n\n\t\t\tduk__push_stridx_or_string(thr, bd);\n\n\t\t\t/*\n\t\t\t *  Property attribute defaults are defined in E5 Section 15 (first\n\t\t\t *  few pages); there is a default for all properties and a special\n\t\t\t *  default for 'length' properties.  Variation from the defaults is\n\t\t\t *  signaled using a single flag bit in the bitstream.\n\t\t\t */\n\n\t\t\tif (duk_bd_decode_flag(bd)) {\n\t\t\t\tdefprop_flags = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_FLAGS_BITS);\n\t\t\t} else {\n\t\t\t\tdefprop_flags = DUK_PROPDESC_FLAGS_WC;\n\t\t\t}\n\t\t\tdefprop_flags |= DUK_DEFPROP_FORCE |\n\t\t\t                 DUK_DEFPROP_HAVE_VALUE |\n\t\t\t                 DUK_DEFPROP_HAVE_WRITABLE |\n\t\t\t                 DUK_DEFPROP_HAVE_ENUMERABLE |\n\t\t\t                 DUK_DEFPROP_HAVE_CONFIGURABLE;  /* Defaults for data properties. */\n\n\t\t\t/* The writable, enumerable, configurable flags in prop_flags\n\t\t\t * match both duk_def_prop() and internal property flags.\n\t\t\t */\n\t\t\tDUK_ASSERT(DUK_PROPDESC_FLAG_WRITABLE == DUK_DEFPROP_WRITABLE);\n\t\t\tDUK_ASSERT(DUK_PROPDESC_FLAG_ENUMERABLE == DUK_DEFPROP_ENUMERABLE);\n\t\t\tDUK_ASSERT(DUK_PROPDESC_FLAG_CONFIGURABLE == DUK_DEFPROP_CONFIGURABLE);\n\n\t\t\tt = (duk_small_uint_t) duk_bd_decode(bd, DUK__PROP_TYPE_BITS);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"built-in %ld, normal-valued property %ld, key %!T, flags 0x%02lx, type %ld\",\n\t\t\t                     (long) i, (long) j, duk_get_tval(thr, -1), (unsigned long) defprop_flags, (long) t));\n\n\t\t\tswitch (t) {\n\t\t\tcase DUK__PROP_TYPE_DOUBLE: {\n\t\t\t\tduk__push_double(thr, bd);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DUK__PROP_TYPE_STRING: {\n\t\t\t\tduk__push_string(thr, bd);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DUK__PROP_TYPE_STRIDX: {\n\t\t\t\tduk__push_stridx(thr, bd);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DUK__PROP_TYPE_BUILTIN: {\n\t\t\t\tduk_small_uint_t bidx;\n\n\t\t\t\tbidx = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\t\t\tduk_dup(thr, (duk_idx_t) bidx);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DUK__PROP_TYPE_UNDEFINED: {\n\t\t\t\tduk_push_undefined(thr);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DUK__PROP_TYPE_BOOLEAN_TRUE: {\n\t\t\t\tduk_push_true(thr);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DUK__PROP_TYPE_BOOLEAN_FALSE: {\n\t\t\t\tduk_push_false(thr);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DUK__PROP_TYPE_ACCESSOR: {\n\t\t\t\tduk_small_uint_t natidx_getter = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\t\t\tduk_small_uint_t natidx_setter = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\t\t\tduk_small_uint_t accessor_magic = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\t\t\tduk_c_function c_func_getter;\n\t\t\t\tduk_c_function c_func_setter;\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"built-in accessor property: objidx=%ld, key=%!T, getteridx=%ld, setteridx=%ld, flags=0x%04lx\",\n\t\t\t\t                     (long) i, duk_get_tval(thr, -1), (long) natidx_getter, (long) natidx_setter, (unsigned long) defprop_flags));\n\n\t\t\t\tc_func_getter = duk_bi_native_functions[natidx_getter];\n\t\t\t\tif (c_func_getter != NULL) {\n\t\t\t\t\tduk_push_c_function_builtin_noconstruct(thr, c_func_getter, 0);  /* always 0 args */\n\t\t\t\t\tduk_set_magic(thr, -1, (duk_int_t) accessor_magic);\n\t\t\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_GETTER;\n\t\t\t\t}\n\t\t\t\tc_func_setter = duk_bi_native_functions[natidx_setter];\n\t\t\t\tif (c_func_setter != NULL) {\n\t\t\t\t\tduk_push_c_function_builtin_noconstruct(thr, c_func_setter, 1);  /* always 1 arg */\n\t\t\t\t\tduk_set_magic(thr, -1, (duk_int_t) accessor_magic);\n\t\t\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_SETTER;\n\t\t\t\t}\n\n\t\t\t\t/* Writable flag doesn't make sense for an accessor. */\n\t\t\t\tDUK_ASSERT((defprop_flags & DUK_PROPDESC_FLAG_WRITABLE) == 0);  /* genbuiltins.py ensures */\n\n\t\t\t\tdefprop_flags &= ~(DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE);\n\t\t\t\tdefprop_flags |= DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t/* exhaustive */\n\t\t\t\tDUK_UNREACHABLE();\n\t\t\t}\n\t\t\t}\n\n\t\t\tduk_def_prop(thr, (duk_idx_t) i, defprop_flags);\n\t\t\tDUK_ASSERT_TOP(thr, DUK_NUM_ALL_BUILTINS);\n\t\t}\n\n\t\t/* native function properties */\n\t\tnum = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\t\tDUK_DDD(DUK_DDDPRINT(\"built-in object %ld, %ld function valued properties\", (long) i, (long) num));\n\t\tfor (j = 0; j < num; j++) {\n\t\t\tduk_hstring *h_key;\n\t\t\tduk_small_uint_t natidx;\n\t\t\tduk_int_t c_nargs;  /* must hold DUK_VARARGS */\n\t\t\tduk_small_uint_t c_length;\n\t\t\tduk_int16_t magic;\n\t\t\tduk_c_function c_func;\n\t\t\tduk_hnatfunc *h_func;\n#if defined(DUK_USE_LIGHTFUNC_BUILTINS)\n\t\t\tduk_small_int_t lightfunc_eligible;\n#endif\n\n\t\t\tduk__push_stridx_or_string(thr, bd);\n\t\t\th_key = duk_known_hstring(thr, -1);\n\t\t\tDUK_UNREF(h_key);\n\t\t\tnatidx = (duk_small_uint_t) duk_bd_decode_varuint(bd);\n\n\t\t\tc_length = (duk_small_uint_t) duk_bd_decode(bd, DUK__LENGTH_PROP_BITS);\n\t\t\tc_nargs = (duk_int_t) duk_bd_decode_flagged(bd, DUK__NARGS_BITS, (duk_uint32_t) c_length /*def_value*/);\n\t\t\tif (c_nargs == DUK__NARGS_VARARGS_MARKER) {\n\t\t\t\tc_nargs = DUK_VARARGS;\n\t\t\t}\n\n\t\t\tc_func = duk_bi_native_functions[natidx];\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"built-in %ld, function-valued property %ld, key %!O, natidx %ld, length %ld, nargs %ld\",\n\t\t\t                     (long) i, (long) j, (duk_heaphdr *) h_key, (long) natidx, (long) c_length,\n\t\t\t                     (c_nargs == DUK_VARARGS ? (long) -1 : (long) c_nargs)));\n\n\t\t\t/* Cast converts magic to 16-bit signed value */\n\t\t\tmagic = (duk_int16_t) duk_bd_decode_varuint(bd);\n\n#if defined(DUK_USE_LIGHTFUNC_BUILTINS)\n\t\t\tlightfunc_eligible =\n\t\t\t\t((c_nargs >= DUK_LFUNC_NARGS_MIN && c_nargs <= DUK_LFUNC_NARGS_MAX) || (c_nargs == DUK_VARARGS)) &&\n\t\t\t\t(c_length <= DUK_LFUNC_LENGTH_MAX) &&\n\t\t\t\t(magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX);\n\n\t\t\t/* These functions have trouble working as lightfuncs.\n\t\t\t * Some of them have specific asserts and some may have\n\t\t         * additional properties (e.g. 'require.id' may be written).\n\t\t\t */\n\t\t\tif (c_func == duk_bi_global_object_eval) {\n\t\t\t\tlightfunc_eligible = 0;\n\t\t\t}\n#if defined(DUK_USE_COROUTINE_SUPPORT)\n\t\t\tif (c_func == duk_bi_thread_yield ||\n\t\t\t    c_func == duk_bi_thread_resume) {\n\t\t\t\tlightfunc_eligible = 0;\n\t\t\t}\n#endif\n\t\t\tif (c_func == duk_bi_function_prototype_call ||\n\t\t\t    c_func == duk_bi_function_prototype_apply ||\n\t\t\t    c_func == duk_bi_reflect_apply ||\n\t\t\t    c_func == duk_bi_reflect_construct) {\n\t\t\t\tlightfunc_eligible = 0;\n\t\t\t}\n\n\t\t\tif (lightfunc_eligible) {\n\t\t\t\tduk_tval tv_lfunc;\n\t\t\t\tduk_small_uint_t lf_nargs = (duk_small_uint_t) (c_nargs == DUK_VARARGS ? DUK_LFUNC_NARGS_VARARGS : c_nargs);\n\t\t\t\tduk_small_uint_t lf_flags = DUK_LFUNC_FLAGS_PACK(magic, c_length, lf_nargs);\n\t\t\t\tDUK_TVAL_SET_LIGHTFUNC(&tv_lfunc, c_func, lf_flags);\n\t\t\t\tduk_push_tval(thr, &tv_lfunc);\n\t\t\t\tDUK_D(DUK_DPRINT(\"built-in function eligible as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld -> %!iT\", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic, duk_get_tval(thr, -1)));\n\t\t\t\tgoto lightfunc_skip;\n\t\t\t}\n\n\t\t\tDUK_D(DUK_DPRINT(\"built-in function NOT ELIGIBLE as light function: i=%d, j=%d c_length=%ld, c_nargs=%ld, magic=%ld\", (int) i, (int) j, (long) c_length, (long) c_nargs, (long) magic));\n#endif  /* DUK_USE_LIGHTFUNC_BUILTINS */\n\n\t\t\t/* [ (builtin objects) name ] */\n\n\t\t\tduk_push_c_function_builtin_noconstruct(thr, c_func, c_nargs);\n\t\t\th_func = duk_known_hnatfunc(thr, -1);\n\t\t\tDUK_UNREF(h_func);\n\n\t\t\t/* XXX: add into init data? */\n\n\t\t\t/* Special call handling, not described in init data. */\n\t\t\tif (c_func == duk_bi_global_object_eval ||\n\t\t\t    c_func == duk_bi_function_prototype_call ||\n\t\t\t    c_func == duk_bi_function_prototype_apply ||\n\t\t\t    c_func == duk_bi_reflect_apply ||\n\t\t\t    c_func == duk_bi_reflect_construct) {\n\t\t\t\tDUK_HOBJECT_SET_SPECIAL_CALL((duk_hobject *) h_func);\n\t\t\t}\n\n\t\t\t/* Currently all built-in native functions are strict.\n\t\t\t * This doesn't matter for many functions, but e.g.\n\t\t\t * String.prototype.charAt (and other string functions)\n\t\t\t * rely on being strict so that their 'this' binding is\n\t\t\t * not automatically coerced.\n\t\t\t */\n\t\t\tDUK_HOBJECT_SET_STRICT((duk_hobject *) h_func);\n\n\t\t\t/* No built-in functions are constructable except the top\n\t\t\t * level ones (Number, etc).\n\t\t\t */\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE((duk_hobject *) h_func));\n\n\t\t\t/* XXX: any way to avoid decoding magic bit; there are quite\n\t\t\t * many function properties and relatively few with magic values.\n\t\t\t */\n\t\t\th_func->magic = magic;\n\n\t\t\t/* [ (builtin objects) name func ] */\n\n\t\t\tduk_push_uint(thr, c_length);\n\t\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C);\n\n\t\t\tduk_dup_m2(thr);\n\t\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);\n\n\t\t\t/* XXX: other properties of function instances; 'arguments', 'caller'. */\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"built-in object %ld, function property %ld -> %!T\",\n\t\t\t                   (long) i, (long) j, (duk_tval *) duk_get_tval(thr, -1)));\n\n\t\t\t/* [ (builtin objects) name func ] */\n\n\t\t\t/*\n\t\t\t *  The default property attributes are correct for all\n\t\t\t *  function valued properties of built-in objects now.\n\t\t\t */\n\n#if defined(DUK_USE_LIGHTFUNC_BUILTINS)\n\t\t lightfunc_skip:\n#endif\n\n\t\t\t/* XXX: So far all ES builtins are 'wc' but e.g.\n\t\t\t * performance.now() should be 'wec'.\n\t\t\t */\n\t\t\tduk_xdef_prop(thr, (duk_idx_t) i, DUK_PROPDESC_FLAGS_WC);\n\n\t\t\t/* [ (builtin objects) ] */\n\t\t}\n\t}\n\n\t/*\n\t *  Special post-tweaks, for cases not covered by the init data format.\n\t *\n\t *  - Set Date.prototype.toGMTString to Date.prototype.toUTCString.\n\t *    toGMTString is required to have the same Function object as\n\t *    toUTCString in E5 Section B.2.6.  Note that while Smjs respects\n\t *    this, V8 does not (the Function objects are distinct).\n\t *\n\t *  - Make DoubleError non-extensible.\n\t *\n\t *  - Add info about most important effective compile options to Duktape.\n\t *\n\t *  - Possibly remove some properties (values or methods) which are not\n\t *    desirable with current feature options but are not currently\n\t *    conditional in init data.\n\t */\n\n#if defined(DUK_USE_DATE_BUILTIN)\n\tduk_get_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_UTC_STRING);\n\tduk_xdef_prop_stridx_short(thr, DUK_BIDX_DATE_PROTOTYPE, DUK_STRIDX_TO_GMT_STRING, DUK_PROPDESC_FLAGS_WC);\n#endif\n\n\th = duk_known_hobject(thr, DUK_BIDX_DOUBLE_ERROR);\n\tDUK_HOBJECT_CLEAR_EXTENSIBLE(h);\n\n#if !defined(DUK_USE_ES6_OBJECT_PROTO_PROPERTY)\n\tDUK_DD(DUK_DDPRINT(\"delete Object.prototype.__proto__ built-in which is not enabled in features\"));\n\t(void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_PROTOTYPE], DUK_HTHREAD_STRING___PROTO__(thr), DUK_DELPROP_FLAG_THROW);\n#endif\n\n#if !defined(DUK_USE_ES6_OBJECT_SETPROTOTYPEOF)\n\tDUK_DD(DUK_DDPRINT(\"delete Object.setPrototypeOf built-in which is not enabled in features\"));\n\t(void) duk_hobject_delprop_raw(thr, thr->builtins[DUK_BIDX_OBJECT_CONSTRUCTOR], DUK_HTHREAD_STRING_SET_PROTOTYPE_OF(thr), DUK_DELPROP_FLAG_THROW);\n#endif\n\n\t/* XXX: relocate */\n\tduk_push_string(thr,\n\t\t\t/* Endianness indicator */\n#if defined(DUK_USE_INTEGER_LE)\n\t                \"l\"\n#elif defined(DUK_USE_INTEGER_BE)\n\t                \"b\"\n#elif defined(DUK_USE_INTEGER_ME)  /* integer mixed endian not really used now */\n\t                \"m\"\n#else\n\t                \"?\"\n#endif\n#if defined(DUK_USE_DOUBLE_LE)\n\t                \"l\"\n#elif defined(DUK_USE_DOUBLE_BE)\n\t                \"b\"\n#elif defined(DUK_USE_DOUBLE_ME)\n\t                \"m\"\n#else\n\t                \"?\"\n#endif\n\t                \" \"\n\t\t\t/* Packed or unpacked tval */\n#if defined(DUK_USE_PACKED_TVAL)\n\t                \"p\"\n#else\n\t                \"u\"\n#endif\n#if defined(DUK_USE_FASTINT)\n\t\t\t\"f\"\n#endif\n\t\t\t\" \"\n\t\t\t/* Low memory options */\n#if defined(DUK_USE_STRTAB_PTRCOMP)\n\t\t\t\"s\"\n#endif\n#if !defined(DUK_USE_HEAPPTR16) && !defined(DUK_DATAPTR16) && !defined(DUK_FUNCPTR16)\n\t\t\t\"n\"\n#endif\n#if defined(DUK_USE_HEAPPTR16)\n\t\t\t\"h\"\n#endif\n#if defined(DUK_USE_DATAPTR16)\n\t\t\t\"d\"\n#endif\n#if defined(DUK_USE_FUNCPTR16)\n\t\t\t\"f\"\n#endif\n#if defined(DUK_USE_REFCOUNT16)\n\t\t\t\"R\"\n#endif\n#if defined(DUK_USE_STRHASH16)\n\t\t\t\"H\"\n#endif\n#if defined(DUK_USE_STRLEN16)\n\t\t\t\"S\"\n#endif\n#if defined(DUK_USE_BUFLEN16)\n\t\t\t\"B\"\n#endif\n#if defined(DUK_USE_OBJSIZES16)\n\t\t\t\"O\"\n#endif\n#if defined(DUK_USE_LIGHTFUNC_BUILTINS)\n\t\t\t\"L\"\n#endif\n#if defined(DUK_USE_ROM_STRINGS) || defined(DUK_USE_ROM_OBJECTS)\n\t\t\t/* XXX: This won't be shown in practice now\n\t\t\t * because this code is not run when builtins\n\t\t\t * are in ROM.\n\t\t\t */\n\t\t\t\"Z\"\n#endif\n\t                \" \"\n\t\t\t/* Object property allocation layout */\n#if defined(DUK_USE_HOBJECT_LAYOUT_1)\n\t\t\t\"p1\"\n#elif defined(DUK_USE_HOBJECT_LAYOUT_2)\n\t\t\t\"p2\"\n#elif defined(DUK_USE_HOBJECT_LAYOUT_3)\n\t\t\t\"p3\"\n#else\n\t\t\t\"p?\"\n#endif\n\t\t\t\" \"\n\t\t\t/* Alignment guarantee */\n#if (DUK_USE_ALIGN_BY == 4)\n\t\t\t\"a4\"\n#elif (DUK_USE_ALIGN_BY == 8)\n\t\t\t\"a8\"\n#elif (DUK_USE_ALIGN_BY == 1)\n\t\t\t\"a1\"\n#else\n#error invalid DUK_USE_ALIGN_BY\n#endif\n\t\t\t\" \"\n\t\t\t/* Architecture, OS, and compiler strings */\n\t                DUK_USE_ARCH_STRING\n\t\t\t\" \"\n\t                DUK_USE_OS_STRING\n\t\t\t\" \"\n\t                DUK_USE_COMPILER_STRING);\n\tduk_xdef_prop_stridx_short(thr, DUK_BIDX_DUKTAPE, DUK_STRIDX_ENV, DUK_PROPDESC_FLAGS_WC);\n\n\t/*\n\t *  Since built-ins are not often extended, compact them.\n\t */\n\n\tDUK_DD(DUK_DDPRINT(\"compact built-ins\"));\n\tfor (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {\n\t\tduk_hobject_compact_props(thr, duk_known_hobject(thr, (duk_idx_t) i));\n\t}\n\n\tDUK_D(DUK_DPRINT(\"INITBUILTINS END\"));\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 1)\n\tfor (i = 0; i < DUK_NUM_ALL_BUILTINS; i++) {\n\t\tDUK_DD(DUK_DDPRINT(\"built-in object %ld after initialization and compacting: %!@iO\",\n\t\t                   (long) i, (duk_heaphdr *) duk_require_hobject(thr, i)));\n\t}\n#endif\n\n\t/*\n\t *  Pop built-ins from stack: they are now INCREF'd and\n\t *  reachable from the builtins[] array or indirectly\n\t *  through builtins[].\n\t */\n\n\tduk_set_top(thr, 0);\n\tDUK_ASSERT_TOP(thr, 0);\n}\n#endif  /* DUK_USE_ROM_OBJECTS */\n\nDUK_INTERNAL void duk_hthread_copy_builtin_objects(duk_hthread *thr_from, duk_hthread *thr_to) {\n\tduk_small_uint_t i;\n\n\tfor (i = 0; i < DUK_NUM_BUILTINS; i++) {\n\t\tthr_to->builtins[i] = thr_from->builtins[i];\n\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr_to, thr_to->builtins[i]);  /* side effect free */\n\t}\n}\n\n/* automatic undefs */\n#undef DUK__LENGTH_PROP_BITS\n#undef DUK__NARGS_BITS\n#undef DUK__NARGS_VARARGS_MARKER\n#undef DUK__PROP_FLAGS_BITS\n#undef DUK__PROP_TYPE_ACCESSOR\n#undef DUK__PROP_TYPE_BITS\n#undef DUK__PROP_TYPE_BOOLEAN_FALSE\n#undef DUK__PROP_TYPE_BOOLEAN_TRUE\n#undef DUK__PROP_TYPE_BUILTIN\n#undef DUK__PROP_TYPE_DOUBLE\n#undef DUK__PROP_TYPE_STRIDX\n#undef DUK__PROP_TYPE_STRING\n#undef DUK__PROP_TYPE_UNDEFINED\n#line 1 \"duk_hthread_misc.c\"\n/*\n *  Thread support.\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_INTERNAL void duk_hthread_terminate(duk_hthread *thr) {\n\tDUK_ASSERT(thr != NULL);\n\n\twhile (thr->callstack_curr != NULL) {\n\t\tduk_hthread_activation_unwind_norz(thr);\n\t}\n\n\tthr->valstack_bottom = thr->valstack;\n\tduk_set_top(thr, 0);  /* unwinds valstack, updating refcounts */\n\n\tthr->state = DUK_HTHREAD_STATE_TERMINATED;\n\n\t/* Here we could remove references to built-ins, but it may not be\n\t * worth the effort because built-ins are quite likely to be shared\n\t * with another (unterminated) thread, and terminated threads are also\n\t * usually garbage collected quite quickly.\n\t *\n\t * We could also shrink the value stack here, but that also may not\n\t * be worth the effort for the same reason.\n\t */\n\n\tDUK_REFZERO_CHECK_SLOW(thr);\n}\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_curr_pc(duk_hthread *thr, duk_activation *act) {\n\tduk_instr_t *bcode;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_UNREF(thr);\n\n\t/* XXX: store 'bcode' pointer to activation for faster lookup? */\n\tif (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) {\n\t\tbcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func));\n\t\treturn (duk_uint_fast32_t) (act->curr_pc - bcode);\n\t}\n\treturn 0;\n}\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\nDUK_INTERNAL duk_uint_fast32_t duk_hthread_get_act_prev_pc(duk_hthread *thr, duk_activation *act) {\n\tduk_instr_t *bcode;\n\tduk_uint_fast32_t ret;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_UNREF(thr);\n\n\tif (act->func && DUK_HOBJECT_IS_COMPFUNC(act->func)) {\n\t\tbcode = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) (act->func));\n\t\tret = (duk_uint_fast32_t) (act->curr_pc - bcode);\n\t\tif (ret > 0) {\n\t\t\tret--;\n\t\t}\n\t\treturn ret;\n\t}\n\treturn 0;\n}\n\n/* Write bytecode executor's curr_pc back to topmost activation (if any). */\nDUK_INTERNAL void duk_hthread_sync_currpc(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tif (thr->ptr_curr_pc != NULL) {\n\t\t/* ptr_curr_pc != NULL only when bytecode executor is active. */\n\t\tDUK_ASSERT(thr->callstack_top > 0);\n\t\tDUK_ASSERT(thr->callstack_curr != NULL);\n\t\tact = thr->callstack_curr;\n\t\tDUK_ASSERT(act != NULL);\n\t\tact->curr_pc = *thr->ptr_curr_pc;\n\t}\n}\n\nDUK_INTERNAL void duk_hthread_sync_and_null_currpc(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tif (thr->ptr_curr_pc != NULL) {\n\t\t/* ptr_curr_pc != NULL only when bytecode executor is active. */\n\t\tDUK_ASSERT(thr->callstack_top > 0);\n\t\tDUK_ASSERT(thr->callstack_curr != NULL);\n\t\tact = thr->callstack_curr;\n\t\tDUK_ASSERT(act != NULL);\n\t\tact->curr_pc = *thr->ptr_curr_pc;\n\t\tthr->ptr_curr_pc = NULL;\n\t}\n}\n#line 1 \"duk_hthread_stacks.c\"\n/*\n *  Thread stack (mainly call stack) primitives: allocation of activations,\n *  unwinding catchers and activations, etc.\n *\n *  Value stack handling is a part of the API implementation.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Unwind the topmost catcher of the current activation (caller must check that\n * both exist) without side effects.\n */\nDUK_INTERNAL void duk_hthread_catcher_unwind_norz(duk_hthread *thr, duk_activation *act) {\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(act->cat != NULL);  /* caller must check */\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\n\tDUK_DDD(DUK_DDDPRINT(\"unwinding catch stack entry %p (lexenv check is done)\", (void *) cat));\n\n\tif (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) {\n\t\tduk_hobject *env;\n\n\t\tenv = act->lex_env;             /* current lex_env of the activation (created for catcher) */\n\t\tDUK_ASSERT(env != NULL);        /* must be, since env was created when catcher was created */\n\t\tact->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env);  /* prototype is lex_env before catcher created */\n\t\tDUK_HOBJECT_INCREF(thr, act->lex_env);\n\t\tDUK_HOBJECT_DECREF_NORZ(thr, env);\n\n\t\t/* There is no need to decref anything else than 'env': if 'env'\n\t\t * becomes unreachable, refzero will handle decref'ing its prototype.\n\t\t */\n\t}\n\n\tact->cat = cat->parent;\n\tduk_hthread_catcher_free(thr, cat);\n}\n\n/* Same as above, but caller is certain no catcher-related lexenv may exist. */\nDUK_INTERNAL void duk_hthread_catcher_unwind_nolexenv_norz(duk_hthread *thr, duk_activation *act) {\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(act->cat != NULL);  /* caller must check */\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\n\tDUK_DDD(DUK_DDDPRINT(\"unwinding catch stack entry %p (lexenv check is not done)\", (void *) cat));\n\n\tDUK_ASSERT(!DUK_CAT_HAS_LEXENV_ACTIVE(cat));\n\n\tact->cat = cat->parent;\n\tduk_hthread_catcher_free(thr, cat);\n}\n\nDUK_LOCAL\n#if defined(DUK_USE_CACHE_CATCHER)\nDUK_NOINLINE\n#endif\nduk_catcher *duk__hthread_catcher_alloc_slow(duk_hthread *thr) {\n\tduk_catcher *cat;\n\n\tcat = (duk_catcher *) DUK_ALLOC_CHECKED(thr, sizeof(duk_catcher));\n\tDUK_ASSERT(cat != NULL);\n\treturn cat;\n}\n\n#if defined(DUK_USE_CACHE_CATCHER)\nDUK_INTERNAL DUK_INLINE duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) {\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tcat = thr->heap->catcher_free;\n\tif (DUK_LIKELY(cat != NULL)) {\n\t\tthr->heap->catcher_free = cat->parent;\n\t\treturn cat;\n\t}\n\n\treturn duk__hthread_catcher_alloc_slow(thr);\n}\n#else  /* DUK_USE_CACHE_CATCHER */\nDUK_INTERNAL duk_catcher *duk_hthread_catcher_alloc(duk_hthread *thr) {\n\treturn duk__hthread_catcher_alloc_slow(thr);\n}\n#endif  /* DUK_USE_CACHE_CATCHER */\n\nDUK_INTERNAL void duk_hthread_catcher_free(duk_hthread *thr, duk_catcher *cat) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(cat != NULL);\n\n#if defined(DUK_USE_CACHE_CATCHER)\n\t/* Unconditional caching for now; freed in mark-and-sweep. */\n\tcat->parent = thr->heap->catcher_free;\n\tthr->heap->catcher_free = cat;\n#else\n\tDUK_FREE_CHECKED(thr, (void *) cat);\n#endif\n}\n\nDUK_LOCAL\n#if defined(DUK_USE_CACHE_ACTIVATION)\nDUK_NOINLINE\n#endif\nduk_activation *duk__hthread_activation_alloc_slow(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tact = (duk_activation *) DUK_ALLOC_CHECKED(thr, sizeof(duk_activation));\n\tDUK_ASSERT(act != NULL);\n\treturn act;\n}\n\n#if defined(DUK_USE_CACHE_ACTIVATION)\nDUK_INTERNAL DUK_INLINE duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tact = thr->heap->activation_free;\n\tif (DUK_LIKELY(act != NULL)) {\n\t\tthr->heap->activation_free = act->parent;\n\t\treturn act;\n\t}\n\n\treturn duk__hthread_activation_alloc_slow(thr);\n}\n#else  /* DUK_USE_CACHE_ACTIVATION */\nDUK_INTERNAL duk_activation *duk_hthread_activation_alloc(duk_hthread *thr) {\n\treturn duk__hthread_activation_alloc_slow(thr);\n}\n#endif  /* DUK_USE_CACHE_ACTIVATION */\n\n\nDUK_INTERNAL void duk_hthread_activation_free(duk_hthread *thr, duk_activation *act) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(act != NULL);\n\n#if defined(DUK_USE_CACHE_ACTIVATION)\n\t/* Unconditional caching for now; freed in mark-and-sweep. */\n\tact->parent = thr->heap->activation_free;\n\tthr->heap->activation_free = act;\n#else\n\tDUK_FREE_CHECKED(thr, (void *) act);\n#endif\n}\n\n/* Internal helper: process the unwind for the topmost activation of a thread,\n * but leave the duk_activation in place for possible tailcall reuse.\n */\nDUK_LOCAL void duk__activation_unwind_nofree_norz(duk_hthread *thr) {\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tduk_heap *heap;\n#endif\n\tduk_activation *act;\n\tduk_hobject *func;\n\tduk_hobject *tmp;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->callstack_curr != NULL);  /* caller must check */\n\tDUK_ASSERT(thr->callstack_top > 0);\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\t/* With lightfuncs, act 'func' may be NULL. */\n\n\t/* With duk_activation records allocated separately, 'act' is a stable\n\t * pointer and not affected by side effects.\n\t */\n\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\t/*\n\t *  Restore 'caller' property for non-strict callee functions.\n\t */\n\n\tfunc = DUK_ACT_GET_FUNC(act);\n\tif (func != NULL && !DUK_HOBJECT_HAS_STRICT(func)) {\n\t\tduk_tval *tv_caller;\n\t\tduk_tval tv_tmp;\n\t\tduk_hobject *h_tmp;\n\n\t\ttv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr));\n\n\t\t/* The act->prev_caller should only be set if the entry for 'caller'\n\t\t * exists (as it is only set in that case, and the property is not\n\t\t * configurable), but handle all the cases anyway.\n\t\t */\n\n\t\tif (tv_caller) {\n\t\t\tDUK_TVAL_SET_TVAL(&tv_tmp, tv_caller);\n\t\t\tif (act->prev_caller) {\n\t\t\t\t/* Just transfer the refcount from act->prev_caller to tv_caller,\n\t\t\t\t * so no need for a refcount update.  This is the expected case.\n\t\t\t\t */\n\t\t\t\tDUK_TVAL_SET_OBJECT(tv_caller, act->prev_caller);\n\t\t\t\tact->prev_caller = NULL;\n\t\t\t} else {\n\t\t\t\tDUK_TVAL_SET_NULL(tv_caller);   /* no incref needed */\n\t\t\t\tDUK_ASSERT(act->prev_caller == NULL);\n\t\t\t}\n\t\t\tDUK_TVAL_DECREF_NORZ(thr, &tv_tmp);\n\t\t} else {\n\t\t\th_tmp = act->prev_caller;\n\t\t\tif (h_tmp) {\n\t\t\t\tact->prev_caller = NULL;\n\t\t\t\tDUK_HOBJECT_DECREF_NORZ(thr, h_tmp);\n\t\t\t}\n\t\t}\n\t\tDUK_ASSERT(act->prev_caller == NULL);\n\t}\n#endif\n\n\t/*\n\t *  Unwind debugger state.  If we unwind while stepping\n\t *  (for any step type), pause execution.  This is the\n\t *  only place explicitly handling a step out.\n\t */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\theap = thr->heap;\n\tif (heap->dbg_pause_act == thr->callstack_curr) {\n\t\tif (heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_EXIT) {\n\t\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by function exit\"));\n\t\t\tduk_debug_set_paused(heap);\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"unwound past dbg_pause_act, set to NULL\"));\n\t\t\theap->dbg_pause_act = NULL;  /* avoid stale pointers */\n\t\t}\n\t\tDUK_ASSERT(heap->dbg_pause_act == NULL);\n\t}\n#endif\n\n\t/*\n\t *  Unwind catchers.\n\t *\n\t *  Since there are no references in the catcher structure,\n\t *  unwinding is quite simple.  The only thing we need to\n\t *  look out for is popping a possible lexical environment\n\t *  established for an active catch clause.\n\t */\n\n\twhile (act->cat != NULL) {\n\t\tduk_hthread_catcher_unwind_norz(thr, act);\n\t}\n\n\t/*\n\t *  Close environment record(s) if they exist.\n\t *\n\t *  Only variable environments are closed.  If lex_env != var_env, it\n\t *  cannot currently contain any register bound declarations.\n\t *\n\t *  Only environments created for a NEWENV function are closed.  If an\n\t *  environment is created for e.g. an eval call, it must not be closed.\n\t */\n\n\tfunc = DUK_ACT_GET_FUNC(act);\n\tif (func != NULL && !DUK_HOBJECT_HAS_NEWENV(func)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"skip closing environments, envs not owned by this activation\"));\n\t\tgoto skip_env_close;\n\t}\n\t/* func is NULL for lightfunc */\n\n\t/* Catch sites are required to clean up their environments\n\t * in FINALLY part before propagating, so this should\n\t * always hold here.\n\t */\n\tDUK_ASSERT(act->lex_env == act->var_env);\n\n\t/* XXX: Closing the environment record copies values from registers\n\t * into the scope object.  It's side effect free as such, but may\n\t * currently run out of memory which causes an error throw.  This is\n\t * an actual sandboxing problem for error unwinds, and needs to be\n\t * fixed e.g. by preallocating the scope property slots.\n\t */\n\tif (act->var_env != NULL) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"closing var_env record %p -> %!O\",\n\t\t                     (void *) act->var_env, (duk_heaphdr *) act->var_env));\n\t\tduk_js_close_environment_record(thr, act->var_env);\n\t}\n\n skip_env_close:\n\n\t/*\n\t *  Update preventcount\n\t */\n\n\tif (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) {\n\t\tDUK_ASSERT(thr->callstack_preventcount >= 1);\n\t\tthr->callstack_preventcount--;\n\t}\n\n\t/*\n\t *  Reference count updates, using NORZ macros so we don't\n\t *  need to handle side effects.\n\t *\n\t *  duk_activation pointers like act->var_env are intentionally\n\t *  left as garbage and not NULLed.  Without side effects they\n\t *  can't be used when the values are dangling/garbage.\n\t */\n\n\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->var_env);\n\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, act->lex_env);\n\ttmp = DUK_ACT_GET_FUNC(act);\n\tDUK_HOBJECT_DECREF_NORZ_ALLOWNULL(thr, tmp);\n\tDUK_UNREF(tmp);\n}\n\n/* Unwind topmost duk_activation of a thread, caller must ensure that an\n * activation exists.  The call is side effect free, except that scope\n * closure may currently throw an out-of-memory error.\n */\nDUK_INTERNAL void duk_hthread_activation_unwind_norz(duk_hthread *thr) {\n\tduk_activation *act;\n\n\tduk__activation_unwind_nofree_norz(thr);\n\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT(thr->callstack_top > 0);\n\tact = thr->callstack_curr;\n\tthr->callstack_curr = act->parent;\n\tthr->callstack_top--;\n\n\t/* Ideally we'd restore value stack reserve here to caller's value.\n\t * This doesn't work for current unwind call sites however, because\n\t * the current (unwound) value stack top may be above the reserve.\n\t * Thus value stack reserve is restored by the call sites.\n\t */\n\n\t/* XXX: inline for performance builds? */\n\tduk_hthread_activation_free(thr, act);\n\n\t/* We could clear the book-keeping variables like retval_byteoff for\n\t * the topmost activation, but don't do so now as it's not necessary.\n\t */\n}\n\nDUK_INTERNAL void duk_hthread_activation_unwind_reuse_norz(duk_hthread *thr) {\n\tduk__activation_unwind_nofree_norz(thr);\n}\n\n/* Get duk_activation for given callstack level or NULL if level is invalid\n * or deeper than the call stack.  Level -1 refers to current activation, -2\n * to its caller, etc.  Starting from Duktape 2.2 finding the activation is\n * a linked list scan which gets more expensive the deeper the lookup is.\n */\nDUK_INTERNAL duk_activation *duk_hthread_get_activation_for_level(duk_hthread *thr, duk_int_t level) {\n\tduk_activation *act;\n\n\tif (level >= 0) {\n\t\treturn NULL;\n\t}\n\tact = thr->callstack_curr;\n\tfor (;;) {\n\t\tif (act == NULL) {\n\t\t\treturn act;\n\t\t}\n\t\tif (level == -1) {\n\t\t\treturn act;\n\t\t}\n\t\tlevel++;\n\t\tact = act->parent;\n\t}\n\t/* never here */\n}\n\n#if defined(DUK_USE_FINALIZER_TORTURE)\nDUK_INTERNAL void duk_hthread_valstack_torture_realloc(duk_hthread *thr) {\n\tduk_size_t alloc_size;\n\tduk_tval *new_ptr;\n\tduk_ptrdiff_t alloc_end_off;\n\tduk_ptrdiff_t end_off;\n\tduk_ptrdiff_t bottom_off;\n\tduk_ptrdiff_t top_off;\n\n\tif (thr->valstack == NULL) {\n\t\tDUK_D(DUK_DPRINT(\"skip valstack torture realloc, valstack is NULL\"));\n\t\treturn;\n\t}\n\n\talloc_end_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_alloc_end - (duk_uint8_t *) thr->valstack);\n\tend_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);\n\tbottom_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack);\n\ttop_off = (duk_ptrdiff_t) ((duk_uint8_t *) thr->valstack_top - (duk_uint8_t *) thr->valstack);\n\talloc_size = (duk_size_t) alloc_end_off;\n\tif (alloc_size == 0) {\n\t\tDUK_D(DUK_DPRINT(\"skip valstack torture realloc, alloc_size is zero\"));\n\t\treturn;\n\t}\n\n\t/* Use DUK_ALLOC_RAW() to avoid side effects. */\n\tnew_ptr = (duk_tval *) DUK_ALLOC_RAW(thr->heap, alloc_size);\n\tif (new_ptr != NULL) {\n\t\tDUK_MEMCPY((void *) new_ptr, (const void *) thr->valstack, alloc_size);\n\t\tDUK_MEMSET((void *) thr->valstack, 0x55, alloc_size);\n\t\tDUK_FREE_CHECKED(thr, (void *) thr->valstack);\n\t\tthr->valstack = new_ptr;\n\t\tthr->valstack_alloc_end = (duk_tval *) ((duk_uint8_t *) new_ptr + alloc_end_off);\n\t\tthr->valstack_end = (duk_tval *) ((duk_uint8_t *) new_ptr + end_off);\n\t\tthr->valstack_bottom = (duk_tval *) ((duk_uint8_t *) new_ptr + bottom_off);\n\t\tthr->valstack_top = (duk_tval *) ((duk_uint8_t *) new_ptr + top_off);\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"failed to realloc valstack for torture, ignore\"));\n\t}\n}\n#endif  /* DUK_USE_FINALIZER_TORTURE */\n#line 1 \"duk_js_arith.c\"\n/*\n *  Shared helpers for arithmetic operations\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Ecmascript modulus ('%') does not match IEEE 754 \"remainder\" operation\n * (implemented by remainder() in C99) but does seem to match ANSI C fmod().\n * Compare E5 Section 11.5.3 and \"man fmod\".\n */\nDUK_INTERNAL double duk_js_arith_mod(double d1, double d2) {\n#if defined(DUK_USE_POW_WORKAROUNDS)\n\t/* Specific fixes to common fmod() implementation issues:\n\t * - test-bug-mingw-math-issues.js\n\t */\n\tif (DUK_ISINF(d2)) {\n\t\tif (DUK_ISINF(d1)) {\n\t\t\treturn DUK_DOUBLE_NAN;\n\t\t} else {\n\t\t\treturn d1;\n\t\t}\n\t} else if (d1 == 0.0) {\n\t\t/* d1 +/-0 is returned as is (preserving sign) except when\n\t\t * d2 is zero or NaN.\n\t\t */\n\t\tif (d2 == 0.0 || DUK_ISNAN(d2)) {\n\t\t\treturn DUK_DOUBLE_NAN;\n\t\t} else {\n\t\t\treturn d1;\n\t\t}\n\t}\n#else\n\t/* Some ISO C assumptions. */\n\tDUK_ASSERT(DUK_FMOD(1.0, DUK_DOUBLE_INFINITY) == 1.0);\n\tDUK_ASSERT(DUK_FMOD(-1.0, DUK_DOUBLE_INFINITY) == -1.0);\n\tDUK_ASSERT(DUK_FMOD(1.0, -DUK_DOUBLE_INFINITY) == 1.0);\n\tDUK_ASSERT(DUK_FMOD(-1.0, -DUK_DOUBLE_INFINITY) == -1.0);\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, DUK_DOUBLE_INFINITY)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(-DUK_DOUBLE_INFINITY, -DUK_DOUBLE_INFINITY)));\n\tDUK_ASSERT(DUK_FMOD(0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, 1.0)) == 0);\n\tDUK_ASSERT(DUK_FMOD(-0.0, 1.0) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, 1.0)) != 0);\n\tDUK_ASSERT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0);\n\tDUK_ASSERT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, DUK_DOUBLE_INFINITY)) != 0);\n\tDUK_ASSERT(DUK_FMOD(0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(0.0, DUK_DOUBLE_INFINITY)) == 0);\n\tDUK_ASSERT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY) == 0.0 && DUK_SIGNBIT(DUK_FMOD(-0.0, -DUK_DOUBLE_INFINITY)) != 0);\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, 0.0)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, 0.0)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, -0.0)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, -0.0)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(0.0, DUK_DOUBLE_NAN)));\n\tDUK_ASSERT(DUK_ISNAN(DUK_FMOD(-0.0, DUK_DOUBLE_NAN)));\n#endif\n\n\treturn (duk_double_t) DUK_FMOD((double) d1, (double) d2);\n}\n\n/* Shared helper for Math.pow() and exponentiation operator. */\nDUK_INTERNAL double duk_js_arith_pow(double x, double y) {\n\t/* The ANSI C pow() semantics differ from Ecmascript.\n\t *\n\t * E.g. when x==1 and y is +/- infinite, the Ecmascript required\n\t * result is NaN, while at least Linux pow() returns 1.\n\t */\n\n\tduk_small_int_t cx, cy, sx;\n\n\tDUK_UNREF(cx);\n\tDUK_UNREF(sx);\n\tcy = (duk_small_int_t) DUK_FPCLASSIFY(y);\n\n\tif (cy == DUK_FP_NAN) {\n\t\tgoto ret_nan;\n\t}\n\tif (DUK_FABS(x) == 1.0 && cy == DUK_FP_INFINITE) {\n\t\tgoto ret_nan;\n\t}\n\n#if defined(DUK_USE_POW_WORKAROUNDS)\n\t/* Specific fixes to common pow() implementation issues:\n\t *   - test-bug-netbsd-math-pow.js: NetBSD 6.0 on x86 (at least)\n\t *   - test-bug-mingw-math-issues.js\n\t */\n\tcx = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\tif (cx == DUK_FP_ZERO && y < 0.0) {\n\t\tsx = (duk_small_int_t) DUK_SIGNBIT(x);\n\t\tif (sx == 0) {\n\t\t\t/* Math.pow(+0,y) should be Infinity when y<0.  NetBSD pow()\n\t\t\t * returns -Infinity instead when y is <0 and finite.  The\n\t\t\t * if-clause also catches y == -Infinity (which works even\n\t\t\t * without the fix).\n\t\t\t */\n\t\t\treturn DUK_DOUBLE_INFINITY;\n\t\t} else {\n\t\t\t/* Math.pow(-0,y) where y<0 should be:\n\t\t\t *   - -Infinity if y<0 and an odd integer\n\t\t\t *   - Infinity if y<0 but not an odd integer\n\t\t\t * NetBSD pow() returns -Infinity for all finite y<0.  The\n\t\t\t * if-clause also catches y == -Infinity (which works even\n\t\t\t * without the fix).\n\t\t\t */\n\n\t\t\t/* fmod() return value has same sign as input (negative) so\n\t\t\t * the result here will be in the range ]-2,0], -1 indicates\n\t\t\t * odd.  If x is -Infinity, NaN is returned and the odd check\n\t\t\t * always concludes \"not odd\" which results in desired outcome.\n\t\t\t */\n\t\t\tdouble tmp = DUK_FMOD(y, 2);\n\t\t\tif (tmp == -1.0) {\n\t\t\t\treturn -DUK_DOUBLE_INFINITY;\n\t\t\t} else {\n\t\t\t\t/* Not odd, or y == -Infinity */\n\t\t\t\treturn DUK_DOUBLE_INFINITY;\n\t\t\t}\n\t\t}\n\t} else if (cx == DUK_FP_NAN) {\n\t\tif (y == 0.0) {\n\t\t\t/* NaN ** +/- 0 should always be 1, but is NaN on\n\t\t\t * at least some Cygwin/MinGW versions.\n\t\t\t */\n\t\t\treturn 1.0;\n\t\t}\n\t}\n#else\n\t/* Some ISO C assumptions. */\n\tDUK_ASSERT(DUK_POW(DUK_DOUBLE_NAN, 0.0) == 1.0);\n\tDUK_ASSERT(DUK_ISINF(DUK_POW(0.0, -1.0)) && DUK_SIGNBIT(DUK_POW(0.0, -1.0)) == 0);\n\tDUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -2.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -2.0)) == 0);\n\tDUK_ASSERT(DUK_ISINF(DUK_POW(-0.0, -3.0)) && DUK_SIGNBIT(DUK_POW(-0.0, -3.0)) != 0);\n#endif\n\n\treturn DUK_POW(x, y);\n\n ret_nan:\n\treturn DUK_DOUBLE_NAN;\n}\n#line 1 \"duk_js_call.c\"\n/*\n *  Call handling.\n *\n *  duk_handle_call_unprotected():\n *\n *    - Unprotected call to Ecmascript or Duktape/C function, from native\n *      code or bytecode executor.\n *\n *    - Also handles Ecma-to-Ecma calls which reuses a currently running\n *      executor instance to avoid native recursion.  Call setup is done\n *      normally, but just before calling the bytecode executor a special\n *      return code is used to indicate that a calling executor is reused.\n *\n *    - Also handles tailcalls, i.e. reuse of current duk_activation.\n *\n *    - Also handles setup for initial Duktape.Thread.resume().\n *\n *  duk_handle_safe_call():\n *\n *    - Protected C call within current activation.\n *\n *  setjmp() and local variables have a nasty interaction, see execution.rst;\n *  non-volatile locals modified after setjmp() call are not guaranteed to\n *  keep their value and can cause compiler or compiler version specific\n *  difficult to replicate issues.\n *\n *  See 'execution.rst'.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* XXX: heap->error_not_allowed for success path too? */\n\n/*\n *  Limit check helpers.\n */\n\n/* Allow headroom for calls during error augmentation (see GH-191).\n * We allow space for 10 additional recursions, with one extra\n * for, e.g. a print() call at the deepest level, and an extra\n * +1 for protected call wrapping.\n */\n#define DUK__AUGMENT_CALL_RELAX_COUNT  (10 + 2)\n\nDUK_LOCAL DUK_NOINLINE void duk__call_c_recursion_limit_check_slowpath(duk_hthread *thr) {\n\t/* When augmenting an error, the effective limit is a bit higher.\n\t * Check for it only if the fast path check fails.\n\t */\n#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\tif (thr->heap->augmenting_error) {\n\t\tif (thr->heap->call_recursion_depth < thr->heap->call_recursion_limit + DUK__AUGMENT_CALL_RELAX_COUNT) {\n\t\t\tDUK_D(DUK_DPRINT(\"C recursion limit reached but augmenting error and within relaxed limit\"));\n\t\t\treturn;\n\t\t}\n\t}\n#endif\n\n\tDUK_D(DUK_DPRINT(\"call prevented because C recursion limit reached\"));\n\tDUK_ERROR_RANGE(thr, DUK_STR_C_CALLSTACK_LIMIT);\n}\n\nDUK_LOCAL DUK_ALWAYS_INLINE void duk__call_c_recursion_limit_check(duk_hthread *thr) {\n\tDUK_ASSERT(thr->heap->call_recursion_depth >= 0);\n\tDUK_ASSERT(thr->heap->call_recursion_depth <= thr->heap->call_recursion_limit);\n\n\t/* This check is forcibly inlined because it's very cheap and almost\n\t * always passes.  The slow path is forcibly noinline.\n\t */\n\tif (DUK_LIKELY(thr->heap->call_recursion_depth < thr->heap->call_recursion_limit)) {\n\t\treturn;\n\t}\n\n\tduk__call_c_recursion_limit_check_slowpath(thr);\n}\n\nDUK_LOCAL DUK_NOINLINE void duk__call_callstack_limit_check_slowpath(duk_hthread *thr) {\n\t/* When augmenting an error, the effective limit is a bit higher.\n\t * Check for it only if the fast path check fails.\n\t */\n#if defined(DUK_USE_AUGMENT_ERROR_THROW) || defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\tif (thr->heap->augmenting_error) {\n\t\tif (thr->callstack_top < DUK_USE_CALLSTACK_LIMIT + DUK__AUGMENT_CALL_RELAX_COUNT) {\n\t\t\tDUK_D(DUK_DPRINT(\"call stack limit reached but augmenting error and within relaxed limit\"));\n\t\t\treturn;\n\t\t}\n\t}\n#endif\n\n\t/* XXX: error message is a bit misleading: we reached a recursion\n\t * limit which is also essentially the same as a C callstack limit\n\t * (except perhaps with some relaxed threading assumptions).\n\t */\n\tDUK_D(DUK_DPRINT(\"call prevented because call stack limit reached\"));\n\tDUK_ERROR_RANGE(thr, DUK_STR_CALLSTACK_LIMIT);\n}\n\nDUK_LOCAL DUK_ALWAYS_INLINE void duk__call_callstack_limit_check(duk_hthread *thr) {\n\t/* This check is forcibly inlined because it's very cheap and almost\n\t * always passes.  The slow path is forcibly noinline.\n\t */\n\tif (DUK_LIKELY(thr->callstack_top < DUK_USE_CALLSTACK_LIMIT)) {\n\t\treturn;\n\t}\n\n\tduk__call_callstack_limit_check_slowpath(thr);\n}\n\n/*\n *  Interrupt counter fixup (for development only).\n */\n\n#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)\nDUK_LOCAL void duk__interrupt_fixup(duk_hthread *thr, duk_hthread *entry_curr_thread) {\n\t/* Currently the bytecode executor and executor interrupt\n\t * instruction counts are off because we don't execute the\n\t * interrupt handler when we're about to exit from the initial\n\t * user call into Duktape.\n\t *\n\t * If we were to execute the interrupt handler here, the counts\n\t * would match.  You can enable this block manually to check\n\t * that this is the case.\n\t */\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\n#if defined(DUK_USE_INTERRUPT_DEBUG_FIXUP)\n\tif (entry_curr_thread == NULL) {\n\t\tthr->interrupt_init = thr->interrupt_init - thr->interrupt_counter;\n\t\tthr->heap->inst_count_interrupt += thr->interrupt_init;\n\t\tDUK_DD(DUK_DDPRINT(\"debug test: updated interrupt count on exit to \"\n\t\t                   \"user code, instruction counts: executor=%ld, interrupt=%ld\",\n\t\t                   (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt));\n\t\tDUK_ASSERT(thr->heap->inst_count_exec == thr->heap->inst_count_interrupt);\n\t}\n#else\n\tDUK_UNREF(thr);\n\tDUK_UNREF(entry_curr_thread);\n#endif\n}\n#endif\n\n/*\n *  Arguments object creation.\n *\n *  Creating arguments objects involves many small details, see E5 Section\n *  10.6 for the specific requirements.  Much of the arguments object exotic\n *  behavior is implemented in duk_hobject_props.c, and is enabled by the\n *  object flag DUK_HOBJECT_FLAG_EXOTIC_ARGUMENTS.\n */\n\nDUK_LOCAL void duk__create_arguments_object(duk_hthread *thr,\n                                            duk_hobject *func,\n                                            duk_hobject *varenv,\n                                            duk_idx_t idx_args) {\n\tduk_hobject *arg;          /* 'arguments' */\n\tduk_hobject *formals;      /* formals for 'func' (may be NULL if func is a C function) */\n\tduk_idx_t i_arg;\n\tduk_idx_t i_map;\n\tduk_idx_t i_mappednames;\n\tduk_idx_t i_formals;\n\tduk_idx_t i_argbase;\n\tduk_idx_t n_formals;\n\tduk_idx_t idx;\n\tduk_idx_t num_stack_args;\n\tduk_bool_t need_map;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_NONBOUND_FUNCTION(func));\n\tDUK_ASSERT(varenv != NULL);\n\n\t/* [ ... func this arg1(@idx_args) ... argN envobj ]\n\t * [ arg1(@idx_args) ... argN envobj ] (for tailcalls)\n\t */\n\n\tneed_map = 0;\n\n\ti_argbase = idx_args;\n\tnum_stack_args = duk_get_top(thr) - i_argbase - 1;\n\tDUK_ASSERT(i_argbase >= 0);\n\tDUK_ASSERT(num_stack_args >= 0);\n\n\tduk_push_hobject(thr, func);\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS);\n\tformals = duk_get_hobject(thr, -1);\n\tif (formals) {\n\t\tn_formals = (duk_idx_t) duk_get_length(thr, -1);\n\t} else {\n\t\t/* This shouldn't happen without tampering of internal\n\t\t * properties: if a function accesses 'arguments', _Formals\n\t\t * is kept.  Check for the case anyway in case internal\n\t\t * properties have been modified manually.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"_Formals is undefined when creating arguments, use n_formals == 0\"));\n\t\tn_formals = 0;\n\t}\n\tduk_remove_m2(thr);  /* leave formals on stack for later use */\n\ti_formals = duk_require_top_index(thr);\n\n\tDUK_ASSERT(n_formals >= 0);\n\tDUK_ASSERT(formals != NULL || n_formals == 0);\n\n\tDUK_DDD(DUK_DDDPRINT(\"func=%!O, formals=%!O, n_formals=%ld\",\n\t                     (duk_heaphdr *) func, (duk_heaphdr *) formals,\n\t                     (long) n_formals));\n\n\t/* [ ... formals ] */\n\n\t/*\n\t *  Create required objects:\n\t *    - 'arguments' object: array-like, but not an array\n\t *    - 'map' object: internal object, tied to 'arguments'\n\t *    - 'mappedNames' object: temporary value used during construction\n\t */\n\n\targ = duk_push_object_helper(thr,\n\t                             DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                             DUK_HOBJECT_FLAG_FASTREFS |\n\t                             DUK_HOBJECT_FLAG_ARRAY_PART |\n\t                             DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARGUMENTS),\n\t                             DUK_BIDX_OBJECT_PROTOTYPE);\n\tDUK_ASSERT(arg != NULL);\n\t(void) duk_push_object_helper(thr,\n\t                              DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t                              DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),\n\t                              -1);  /* no prototype */\n\t(void) duk_push_object_helper(thr,\n\t                              DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                              DUK_HOBJECT_FLAG_FASTREFS |\n\t                              DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT),\n\t                              -1);  /* no prototype */\n\ti_arg = duk_get_top(thr) - 3;\n\ti_map = i_arg + 1;\n\ti_mappednames = i_arg + 2;\n\n\t/* [ ... formals arguments map mappedNames ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"created arguments related objects: \"\n\t                     \"arguments at index %ld -> %!O \"\n\t                     \"map at index %ld -> %!O \"\n\t                     \"mappednames at index %ld -> %!O\",\n\t                     (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg),\n\t                     (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map),\n\t                     (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames)));\n\n\t/*\n\t *  Init arguments properties, map, etc.\n\t */\n\n\tduk_push_int(thr, num_stack_args);\n\tduk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_WC);\n\n\t/*\n\t *  Init argument related properties.\n\t */\n\n\t/* step 11 */\n\tidx = num_stack_args - 1;\n\twhile (idx >= 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"arg idx %ld, argbase=%ld, argidx=%ld\",\n\t\t                     (long) idx, (long) i_argbase, (long) (i_argbase + idx)));\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"define arguments[%ld]=arg\", (long) idx));\n\t\tduk_dup(thr, i_argbase + idx);\n\t\tduk_xdef_prop_index_wec(thr, i_arg, (duk_uarridx_t) idx);\n\t\tDUK_DDD(DUK_DDDPRINT(\"defined arguments[%ld]=arg\", (long) idx));\n\n\t\t/* step 11.c is relevant only if non-strict (checked in 11.c.ii) */\n\t\tif (!DUK_HOBJECT_HAS_STRICT(func) && idx < n_formals) {\n\t\t\tDUK_ASSERT(formals != NULL);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"strict function, index within formals (%ld < %ld)\",\n\t\t\t                     (long) idx, (long) n_formals));\n\n\t\t\tduk_get_prop_index(thr, i_formals, (duk_uarridx_t) idx);\n\t\t\tDUK_ASSERT(duk_is_string(thr, -1));\n\n\t\t\tduk_dup_top(thr);  /* [ ... name name ] */\n\n\t\t\tif (!duk_has_prop(thr, i_mappednames)) {\n\t\t\t\t/* steps 11.c.ii.1 - 11.c.ii.4, but our internal book-keeping\n\t\t\t\t * differs from the reference model\n\t\t\t\t */\n\n\t\t\t\t/* [ ... name ] */\n\n\t\t\t\tneed_map = 1;\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"set mappednames[%s]=%ld\",\n\t\t\t\t                     (const char *) duk_get_string(thr, -1),\n\t\t\t\t                     (long) idx));\n\t\t\t\tduk_dup_top(thr);                      /* name */\n\t\t\t\t(void) duk_push_uint_to_hstring(thr, (duk_uint_t) idx);  /* index */\n\t\t\t\tduk_xdef_prop_wec(thr, i_mappednames);  /* out of spec, must be configurable */\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"set map[%ld]=%s\",\n\t\t\t\t                     (long) idx,\n\t\t\t\t                     duk_get_string(thr, -1)));\n\t\t\t\tduk_dup_top(thr);         /* name */\n\t\t\t\tduk_xdef_prop_index_wec(thr, i_map, (duk_uarridx_t) idx);  /* out of spec, must be configurable */\n\t\t\t} else {\n\t\t\t\t/* duk_has_prop() popped the second 'name' */\n\t\t\t}\n\n\t\t\t/* [ ... name ] */\n\t\t\tduk_pop(thr);  /* pop 'name' */\n\t\t}\n\n\t\tidx--;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"actual arguments processed\"));\n\n\t/* step 12 */\n\tif (need_map) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"adding 'map' and 'varenv' to arguments object\"));\n\n\t\t/* should never happen for a strict callee */\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func));\n\n\t\tduk_dup(thr, i_map);\n\t\tduk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_MAP, DUK_PROPDESC_FLAGS_NONE);  /* out of spec, don't care */\n\n\t\t/* The variable environment for magic variable bindings needs to be\n\t\t * given by the caller and recorded in the arguments object.\n\t\t *\n\t\t * See E5 Section 10.6, the creation of setters/getters.\n\t\t *\n\t\t * The variable environment also provides access to the callee, so\n\t\t * an explicit (internal) callee property is not needed.\n\t\t */\n\n\t\tduk_push_hobject(thr, varenv);\n\t\tduk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_INT_VARENV, DUK_PROPDESC_FLAGS_NONE);  /* out of spec, don't care */\n\t}\n\n\t/* steps 13-14 */\n\tif (DUK_HOBJECT_HAS_STRICT(func)) {\n\t\t/* Callee/caller are throwers and are not deletable etc.  They\n\t\t * could be implemented as virtual properties, but currently\n\t\t * there is no support for virtual properties which are accessors\n\t\t * (only plain virtual properties).  This would not be difficult\n\t\t * to change in duk_hobject_props, but we can make the throwers\n\t\t * normal, concrete properties just as easily.\n\t\t *\n\t\t * Note that the specification requires that the *same* thrower\n\t\t * built-in object is used here!  See E5 Section 10.6 main\n\t\t * algoritm, step 14, and Section 13.2.3 which describes the\n\t\t * thrower.  See test case test-arguments-throwers.js.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"strict function, setting caller/callee to throwers\"));\n\n\t\tduk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLER);\n\t\tduk_xdef_prop_stridx_thrower(thr, i_arg, DUK_STRIDX_CALLEE);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"non-strict function, setting callee to actual value\"));\n\t\tduk_push_hobject(thr, func);\n\t\tduk_xdef_prop_stridx(thr, i_arg, DUK_STRIDX_CALLEE, DUK_PROPDESC_FLAGS_WC);\n\t}\n\n\t/* set exotic behavior only after we're done */\n\tif (need_map) {\n\t\t/* Exotic behaviors are only enabled for arguments objects\n\t\t * which have a parameter map (see E5 Section 10.6 main\n\t\t * algorithm, step 12).\n\t\t *\n\t\t * In particular, a non-strict arguments object with no\n\t\t * mapped formals does *NOT* get exotic behavior, even\n\t\t * for e.g. \"caller\" property.  This seems counterintuitive\n\t\t * but seems to be the case.\n\t\t */\n\n\t\t/* cannot be strict (never mapped variables) */\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(func));\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"enabling exotic behavior for arguments object\"));\n\t\tDUK_HOBJECT_SET_EXOTIC_ARGUMENTS(arg);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"not enabling exotic behavior for arguments object\"));\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"final arguments related objects: \"\n\t                     \"arguments at index %ld -> %!O \"\n\t                     \"map at index %ld -> %!O \"\n\t                     \"mappednames at index %ld -> %!O\",\n\t                     (long) i_arg, (duk_heaphdr *) duk_get_hobject(thr, i_arg),\n\t                     (long) i_map, (duk_heaphdr *) duk_get_hobject(thr, i_map),\n\t                     (long) i_mappednames, (duk_heaphdr *) duk_get_hobject(thr, i_mappednames)));\n\n\t/* [ args(n) envobj formals arguments map mappednames ] */\n\n\tduk_pop_2(thr);\n\tduk_remove_m2(thr);\n\n\t/* [ args(n) envobj arguments ] */\n}\n\n/* Helper for creating the arguments object and adding it to the env record\n * on top of the value stack.\n */\nDUK_LOCAL void duk__handle_createargs_for_call(duk_hthread *thr,\n                                               duk_hobject *func,\n                                               duk_hobject *env,\n                                               duk_idx_t idx_args) {\n\tDUK_DDD(DUK_DDDPRINT(\"creating arguments object for function call\"));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(env != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func));\n\n\t/* [ ... arg1 ... argN envobj ] */\n\n\tduk__create_arguments_object(thr,\n\t                             func,\n\t                             env,\n\t                             idx_args);\n\n\t/* [ ... arg1 ... argN envobj argobj ] */\n\n\tduk_xdef_prop_stridx_short(thr,\n\t                           -2,\n\t                           DUK_STRIDX_LC_ARGUMENTS,\n\t                           DUK_HOBJECT_HAS_STRICT(func) ? DUK_PROPDESC_FLAGS_E :   /* strict: non-deletable, non-writable */\n\t                                                          DUK_PROPDESC_FLAGS_WE);  /* non-strict: non-deletable, writable */\n\t/* [ ... arg1 ... argN envobj ] */\n}\n\n/*\n *  Helpers for constructor call handling.\n *\n *  There are two [[Construct]] operations in the specification:\n *\n *    - E5 Section 13.2.2: for Function objects\n *    - E5 Section 15.3.4.5.2: for \"bound\" Function objects\n *\n *  The chain of bound functions is resolved in Section 15.3.4.5.2,\n *  with arguments \"piling up\" until the [[Construct]] internal\n *  method is called on the final, actual Function object.  Note\n *  that the \"prototype\" property is looked up *only* from the\n *  final object, *before* calling the constructor.\n *\n *  Since Duktape 2.2 bound functions are represented with the\n *  duk_hboundfunc internal type, and bound function chains are\n *  collapsed when a bound function is created.  As a result, the\n *  direct target of a duk_hboundfunc is always non-bound and the\n *  this/argument lists have been resolved.\n *\n *  When constructing new Array instances, an unnecessary object is\n *  created and discarded now: the standard [[Construct]] creates an\n *  object, and calls the Array constructor.  The Array constructor\n *  returns an Array instance, which is used as the result value for\n *  the \"new\" operation; the object created before the Array constructor\n *  call is discarded.\n *\n *  This would be easy to fix, e.g. by knowing that the Array constructor\n *  will always create a replacement object and skip creating the fallback\n *  object in that case.\n */\n\n/* Update default instance prototype for constructor call. */\nDUK_LOCAL void duk__update_default_instance_proto(duk_hthread *thr, duk_idx_t idx_func) {\n\tduk_hobject *proto;\n\tduk_hobject *fallback;\n\n\tDUK_ASSERT(duk_is_constructable(thr, idx_func));\n\n\tduk_get_prop_stridx_short(thr, idx_func, DUK_STRIDX_PROTOTYPE);\n\tproto = duk_get_hobject(thr, -1);\n\tif (proto == NULL) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"constructor has no 'prototype' property, or value not an object \"\n\t\t                     \"-> leave standard Object prototype as fallback prototype\"));\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"constructor has 'prototype' property with object value \"\n\t\t                     \"-> set fallback prototype to that value: %!iO\", (duk_heaphdr *) proto));\n\t\t/* Original fallback (default instance) is untouched when\n\t\t * resolving bound functions etc.\n\t\t */\n\t\tfallback = duk_known_hobject(thr, idx_func + 1);\n\t\tDUK_ASSERT(fallback != NULL);\n\t\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, fallback, proto);\n\t}\n\tduk_pop(thr);\n}\n\n/* Postprocess: return value special handling, error augmentation. */\nDUK_INTERNAL void duk_call_construct_postprocess(duk_hthread *thr, duk_small_uint_t proxy_invariant) {\n\t/* Use either fallback (default instance) or retval depending\n\t * on retval type.  Needs to be called before unwind because\n\t * the default instance is read from the current (immutable)\n\t * 'this' binding.\n\t *\n\t * For Proxy 'construct' calls the return value must be an\n\t * Object (we accept object-like values like buffers and\n\t * lightfuncs too).  If not, TypeError.\n\t */\n\tif (duk_check_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT |\n\t                                 DUK_TYPE_MASK_BUFFER |\n\t                                 DUK_TYPE_MASK_LIGHTFUNC)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"replacement value\"));\n\t} else {\n\t\tif (DUK_UNLIKELY(proxy_invariant != 0U)) {\n\t\t\t/* Proxy 'construct' return value invariant violated. */\n\t\t\tDUK_ERROR_TYPE_INVALID_TRAP_RESULT(thr);\n\t\t}\n\t\t/* XXX: direct value stack access */\n\t\tduk_pop(thr);\n\t\tduk_push_this(thr);\n\t}\n\n#if defined(DUK_USE_AUGMENT_ERROR_CREATE)\n\t/* Augment created errors upon creation, not when they are thrown or\n\t * rethrown.  __FILE__ and __LINE__ are not desirable here; the call\n\t * stack reflects the caller which is correct.  Skip topmost, unwound\n\t * activation when creating a traceback.  If thr->ptr_curr_pc was !=\n\t * NULL we'd need to sync the current PC so that the traceback comes\n\t * out right; however it is always synced here so just assert for it.\n\t */\n\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\tduk_err_augment_error_create(thr, thr, NULL, 0, DUK_AUGMENT_FLAG_NOBLAME_FILELINE |\n\t                                                DUK_AUGMENT_FLAG_SKIP_ONE);\n#endif\n}\n\n/*\n *  Helper for handling a bound function when a call is being made.\n *\n *  Assumes that bound function chains have been \"collapsed\" so that either\n *  the target is non-bound or there is one bound function that points to a\n *  nonbound target.\n *\n *  Prepends the bound arguments to the value stack (at idx_func + 2).\n *  The 'this' binding is also updated if necessary (at idx_func + 1).\n *  Note that for constructor calls the 'this' binding is never updated by\n *  [[BoundThis]].\n */\n\nDUK_LOCAL void duk__handle_bound_chain_for_call(duk_hthread *thr,\n                                                duk_idx_t idx_func,\n                                                duk_bool_t is_constructor_call) {\n\tduk_tval *tv_func;\n\tduk_hobject *func;\n\tduk_idx_t len;\n\n\tDUK_ASSERT(thr != NULL);\n\n\t/* On entry, item at idx_func is a bound, non-lightweight function,\n\t * but we don't rely on that below.\n\t */\n\n\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\n\ttv_func = duk_require_tval(thr, idx_func);\n\tDUK_ASSERT(tv_func != NULL);\n\n\tif (DUK_TVAL_IS_OBJECT(tv_func)) {\n\t\tfunc = DUK_TVAL_GET_OBJECT(tv_func);\n\n\t\t/* XXX: separate helper function, out of fast path? */\n\t\tif (DUK_HOBJECT_HAS_BOUNDFUNC(func)) {\n\t\t\tduk_hboundfunc *h_bound;\n\t\t\tduk_tval *tv_args;\n\t\t\tduk_tval *tv_gap;\n\n\t\t\th_bound = (duk_hboundfunc *) func;\n\t\t\ttv_args = h_bound->args;\n\t\t\tlen = h_bound->nargs;\n\t\t\tDUK_ASSERT(len == 0 || tv_args != NULL);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"bound function encountered, ptr=%p: %!T\",\n\t\t\t                     (void *) DUK_TVAL_GET_OBJECT(tv_func), tv_func));\n\n\t\t\t/* [ ... func this arg1 ... argN ] */\n\n\t\t\tif (is_constructor_call) {\n\t\t\t\t/* See: tests/ecmascript/test-spec-bound-constructor.js */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"constructor call: don't update this binding\"));\n\t\t\t} else {\n\t\t\t\t/* XXX: duk_replace_tval */\n\t\t\t\tduk_push_tval(thr, &h_bound->this_binding);\n\t\t\t\tduk_replace(thr, idx_func + 1);  /* idx_this = idx_func + 1 */\n\t\t\t}\n\n\t\t\t/* [ ... func this arg1 ... argN ] */\n\n\t\t\tduk_require_stack(thr, len);\n\n\t\t\ttv_gap = duk_reserve_gap(thr, idx_func + 2, len);\n\t\t\tduk_copy_tvals_incref(thr, tv_gap, tv_args, (duk_size_t) len);\n\n\t\t\t/* [ ... func this <bound args> arg1 ... argN ] */\n\n\t\t\tduk_push_tval(thr, &h_bound->target);\n\t\t\tduk_replace(thr, idx_func);  /* replace in stack */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"bound function handled, idx_func=%ld, curr func=%!T\",\n\t\t\t                     (long) idx_func, duk_get_tval(thr, idx_func)));\n\t\t}\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) {\n\t\t/* Lightweight function: never bound, so terminate. */\n\t\t;\n\t} else {\n\t\t/* Shouldn't happen, so ugly error is enough. */\n\t\tDUK_ERROR_INTERNAL(thr);\n\t}\n\n\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\n\tDUK_DDD(DUK_DDDPRINT(\"final non-bound function is: %!T\", duk_get_tval(thr, idx_func)));\n\n#if defined(DUK_USE_ASSERTIONS)\n\ttv_func = duk_require_tval(thr, idx_func);\n\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func) || DUK_TVAL_IS_OBJECT(tv_func));\n\tif (DUK_TVAL_IS_OBJECT(tv_func)) {\n\t\tfunc = DUK_TVAL_GET_OBJECT(tv_func);\n\t\tDUK_ASSERT(func != NULL);\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func) ||\n\t\t           DUK_HOBJECT_HAS_NATFUNC(func));\n\t}\n#endif\n}\n\n/*\n *  Helper for inline handling of .call(), .apply(), and .construct().\n */\n\nDUK_LOCAL duk_bool_t duk__handle_specialfuncs_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hobject *func, duk_small_uint_t *call_flags, duk_bool_t first) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_c_function natfunc;\n#endif\n\tduk_tval *tv_args;\n\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT((*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0);  /* Caller. */\n\n#if defined(DUK_USE_ASSERTIONS)\n\tnatfunc = ((duk_hnatfunc *) func)->func;\n\tDUK_ASSERT(natfunc != NULL);\n#endif\n\n\t/* On every round of function resolution at least target function and\n\t * 'this' binding are set.  We can assume that here, and must guarantee\n\t * it on exit.  Value stack reserve is extended for bound function and\n\t * .apply() unpacking so we don't need to extend it here when we need a\n\t * few slots.\n\t */\n\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\n\t/* Handle native 'eval' specially.  A direct eval check is only made\n\t * for the first resolution attempt; e.g. a bound eval call is -not-\n\t * a direct eval call.\n\t */\n\tif (DUK_UNLIKELY(((duk_hnatfunc *) func)->magic == 15)) {\n\t\t/* For now no special handling except for direct eval\n\t\t * detection.\n\t\t */\n\t\tDUK_ASSERT(((duk_hnatfunc *) func)->func == duk_bi_global_object_eval);\n\t\tif (first && (*call_flags & DUK_CALL_FLAG_CALLED_AS_EVAL)) {\n\t\t\t*call_flags = (*call_flags & ~DUK_CALL_FLAG_CALLED_AS_EVAL) | DUK_CALL_FLAG_DIRECT_EVAL;\n\t\t}\n\t\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\t\treturn 1;  /* stop resolving */\n\t}\n\n\t/* Handle special functions based on the DUK_HOBJECT_FLAG_SPECIAL_CALL\n\t * flag; their magic value is used for switch-case.\n\t *\n\t * NOTE: duk_unpack_array_like() reserves value stack space\n\t * for the result values (unlike most other value stack calls).\n\t */\n\tswitch (((duk_hnatfunc *) func)->magic) {\n\tcase 0: {  /* 0=Function.prototype.call() */\n\t\t/* Value stack:\n\t\t * idx_func + 0: Function.prototype.call()  [removed]\n\t\t * idx_func + 1: this binding for .call (target function)\n\t\t * idx_func + 2: 1st argument to .call, desired 'this' binding\n\t\t * idx_func + 3: 2nd argument to .call, desired 1st argument for ultimate target\n\t\t * ...\n\t\t *\n\t\t * Remove idx_func + 0 to get:\n\t\t * idx_func + 0: target function\n\t\t * idx_func + 1: this binding\n\t\t * idx_func + 2: call arguments\n\t\t * ...\n\t\t */\n\t\tDUK_ASSERT(natfunc == duk_bi_function_prototype_call);\n\t\tduk_remove_unsafe(thr, idx_func);\n\t\ttv_args = thr->valstack_bottom + idx_func + 2;\n\t\tif (thr->valstack_top < tv_args) {\n\t\t\tDUK_ASSERT(tv_args <= thr->valstack_end);\n\t\t\tthr->valstack_top = tv_args;  /* at least target function and 'this' binding present */\n\t\t}\n\t\tbreak;\n\t}\n\tcase 1: {  /* 1=Function.prototype.apply() */\n\t\t/* Value stack:\n\t\t * idx_func + 0: Function.prototype.apply()  [removed]\n\t\t * idx_func + 1: this binding for .apply (target function)\n\t\t * idx_func + 2: 1st argument to .apply, desired 'this' binding\n\t\t * idx_func + 3: 2nd argument to .apply, argArray\n\t\t * [anything after this MUST be ignored]\n\t\t *\n\t\t * Remove idx_func + 0 and unpack the argArray to get:\n\t\t * idx_func + 0: target function\n\t\t * idx_func + 1: this binding\n\t\t * idx_func + 2: call arguments\n\t\t * ...\n\t\t */\n\t\tDUK_ASSERT(natfunc == duk_bi_function_prototype_apply);\n\t\tduk_remove_unsafe(thr, idx_func);\n\t\tgoto apply_shared;\n\t}\n#if defined(DUK_USE_REFLECT_BUILTIN)\n\tcase 2: {  /* 2=Reflect.apply() */\n\t\t/* Value stack:\n\t\t * idx_func + 0: Reflect.apply()  [removed]\n\t\t * idx_func + 1: this binding for .apply (ignored, usually Reflect)  [removed]\n\t\t * idx_func + 2: 1st argument to .apply, target function\n\t\t * idx_func + 3: 2nd argument to .apply, desired 'this' binding\n\t\t * idx_func + 4: 3rd argument to .apply, argArray\n\t\t * [anything after this MUST be ignored]\n\t\t *\n\t\t * Remove idx_func + 0 and idx_func + 1, and unpack the argArray to get:\n\t\t * idx_func + 0: target function\n\t\t * idx_func + 1: this binding\n\t\t * idx_func + 2: call arguments\n\t\t * ...\n\t\t */\n\t\tDUK_ASSERT(natfunc == duk_bi_reflect_apply);\n\t\tduk_remove_n_unsafe(thr, idx_func, 2);\n\t\tgoto apply_shared;\n\t}\n\tcase 3: {  /* 3=Reflect.construct() */\n\t\t/* Value stack:\n\t\t * idx_func + 0: Reflect.construct()  [removed]\n\t\t * idx_func + 1: this binding for .construct (ignored, usually Reflect)  [removed]\n\t\t * idx_func + 2: 1st argument to .construct, target function\n\t\t * idx_func + 3: 2nd argument to .construct, argArray\n\t\t * idx_func + 4: 3rd argument to .construct, newTarget\n\t\t * [anything after this MUST be ignored]\n\t\t *\n\t\t * Remove idx_func + 0 and idx_func + 1, unpack the argArray,\n\t\t * and insert default instance (prototype not yet updated), to get:\n\t\t * idx_func + 0: target function\n\t\t * idx_func + 1: this binding (default instance)\n\t\t * idx_func + 2: constructor call arguments\n\t\t * ...\n\t\t *\n\t\t * Call flags must be updated to reflect the fact that we're\n\t\t * now dealing with a constructor call, and e.g. the 'this'\n\t\t * binding cannot be overwritten if the target is bound.\n\t\t *\n\t\t * newTarget is checked but not yet passed onwards.\n\t\t */\n\n\t\tduk_idx_t top;\n\n\t\tDUK_ASSERT(natfunc == duk_bi_reflect_construct);\n\t\t*call_flags |= DUK_CALL_FLAG_CONSTRUCT;\n\t\tduk_remove_n_unsafe(thr, idx_func, 2);\n\t\ttop = duk_get_top(thr);\n\t\tif (!duk_is_constructable(thr, idx_func)) {\n\t\t\t/* Target constructability must be checked before\n\t\t\t * unpacking argArray (which may cause side effects).\n\t\t\t * Just return; caller will throw the error.\n\t\t\t */\n\t\t\tduk_set_top_unsafe(thr, idx_func + 2);  /* satisfy asserts */\n\t\t\tbreak;\n\t\t}\n\t\tduk_push_object(thr);\n\t\tduk_insert(thr, idx_func + 1);  /* default instance */\n\n\t\t/* [ ... func default_instance argArray newTarget? ] */\n\n\t\ttop = duk_get_top(thr);\n\t\tif (top < idx_func + 3) {\n\t\t\t/* argArray is a mandatory argument for Reflect.construct(). */\n\t\t\tDUK_ERROR_TYPE_INVALID_ARGS(thr);\n\t\t}\n\t\tif (top > idx_func + 3) {\n\t\t\tif (!duk_strict_equals(thr, idx_func, idx_func + 3)) {\n\t\t\t\t/* XXX: [[Construct]] newTarget currently unsupported */\n\t\t\t\tDUK_ERROR_UNSUPPORTED(thr);\n\t\t\t}\n\t\t\tduk_set_top_unsafe(thr, idx_func + 3);  /* remove any args beyond argArray */\n\t\t}\n\t\tDUK_ASSERT(duk_get_top(thr) == idx_func + 3);\n\t\tDUK_ASSERT(duk_is_valid_index(thr, idx_func + 2));\n\t\t(void) duk_unpack_array_like(thr, idx_func + 2);  /* XXX: should also remove target to be symmetric with duk_pack()? */\n\t\tduk_remove(thr, idx_func + 2);\n\t\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\t\tbreak;\n\t}\n#endif  /* DUK_USE_REFLECT_BUILTIN */\n\tdefault: {\n\t\tDUK_ASSERT(0);\n\t\tDUK_UNREACHABLE();\n\t}\n\t}\n\n\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\treturn 0;  /* keep resolving */\n\n apply_shared:\n\ttv_args = thr->valstack_bottom + idx_func + 2;\n\tif (thr->valstack_top <= tv_args) {\n\t\tDUK_ASSERT(tv_args <= thr->valstack_end);\n\t\tthr->valstack_top = tv_args;  /* at least target func and 'this' binding present */\n\t\t/* No need to check for argArray. */\n\t} else {\n\t\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 3);  /* idx_func + 2 covered above */\n\t\tif (thr->valstack_top > tv_args + 1) {\n\t\t\tduk_set_top_unsafe(thr, idx_func + 3);  /* remove any args beyond argArray */\n\t\t}\n\t\tDUK_ASSERT(duk_is_valid_index(thr, idx_func + 2));\n\t\tif (!duk_is_callable(thr, idx_func)) {\n\t\t\t/* Avoid unpack side effects if the target isn't callable.\n\t\t\t * Calling code will throw the actual error.\n\t\t\t */\n\t\t} else {\n\t\t\t(void) duk_unpack_array_like(thr, idx_func + 2);\n\t\t\tduk_remove(thr, idx_func + 2);\n\t\t}\n\t}\n\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\treturn 0;  /* keep resolving */\n}\n\n/*\n *  Helper for Proxy handling.\n */\n\n#if defined(DUK_USE_ES6_PROXY)\nDUK_LOCAL void duk__handle_proxy_for_call(duk_hthread *thr, duk_idx_t idx_func, duk_hproxy *h_proxy, duk_small_uint_t *call_flags) {\n\tduk_bool_t rc;\n\n\t/* Value stack:\n\t * idx_func + 0: Proxy object\n\t * idx_func + 1: this binding for call\n\t * idx_func + 2: 1st argument for call\n\t * idx_func + 3: 2nd argument for call\n\t * ...\n\t *\n\t * If Proxy doesn't have a trap for the call ('apply' or 'construct'),\n\t * replace Proxy object with target object.\n\t *\n\t * If we're dealing with a normal call and the Proxy has an 'apply'\n\t * trap, manipulate value stack to:\n\t *\n\t * idx_func + 0: trap\n\t * idx_func + 1: Proxy's handler\n\t * idx_func + 2: Proxy's target\n\t * idx_func + 3: this binding for call (from idx_func + 1)\n\t * idx_func + 4: call arguments packed to an array\n\t *\n\t * If we're dealing with a constructor call and the Proxy has a\n\t * 'construct' trap, manipulate value stack to:\n\t *\n\t * idx_func + 0: trap\n\t * idx_func + 1: Proxy's handler\n\t * idx_func + 2: Proxy's target\n\t * idx_func + 3: call arguments packed to an array\n\t * idx_func + 4: newTarget == Proxy object here\n\t *\n\t * As we don't yet have proper newTarget support, the newTarget at\n\t * idx_func + 3 is just the original constructor being called, i.e.\n\t * the Proxy object (not the target).  Note that the default instance\n\t * (original 'this' binding) is dropped and ignored.\n\t */\n\n\tduk_push_hobject(thr, h_proxy->handler);\n\trc = duk_get_prop_stridx_short(thr, -1, (*call_flags & DUK_CALL_FLAG_CONSTRUCT) ? DUK_STRIDX_CONSTRUCT : DUK_STRIDX_APPLY);\n\tif (rc == 0) {\n\t\t/* Not found, continue to target.  If this is a construct\n\t\t * call, update default instance prototype using the Proxy,\n\t\t * not the target.\n\t\t */\n\t\tif (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {\n\t\t\tif (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) {\n\t\t\t\t*call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED;\n\t\t\t\tduk__update_default_instance_proto(thr, idx_func);\n\t\t\t}\n\t\t}\n\t\tduk_pop_2(thr);\n\t\tduk_push_hobject(thr, h_proxy->target);\n\t\tduk_replace(thr, idx_func);\n\t\treturn;\n\t}\n\n\t/* Here we must be careful not to replace idx_func while\n\t * h_proxy is still needed, otherwise h_proxy may become\n\t * dangling.  This could be improved e.g. using a\n\t * duk_pack_slice() with a freeform slice.\n\t */\n\n\t/* Here:\n\t * idx_func + 0: Proxy object\n\t * idx_func + 1: this binding for call\n\t * idx_func + 2: 1st argument for call\n\t * idx_func + 3: 2nd argument for call\n\t * ...\n\t * idx_func + N: handler\n\t * idx_func + N + 1: trap\n\t */\n\n\tduk_insert(thr, idx_func + 1);\n\tduk_insert(thr, idx_func + 2);\n\tduk_push_hobject(thr, h_proxy->target);\n\tduk_insert(thr, idx_func + 3);\n\tduk_pack(thr, duk_get_top(thr) - (idx_func + 5));\n\n\t/* Here:\n\t * idx_func + 0: Proxy object\n\t * idx_func + 1: trap\n\t * idx_func + 2: Proxy's handler\n\t * idx_func + 3: Proxy's target\n\t * idx_func + 4: this binding for call\n\t * idx_func + 5: arguments array\n\t */\n\tDUK_ASSERT(duk_get_top(thr) == idx_func + 6);\n\n\tif (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {\n\t\t*call_flags |= DUK_CALL_FLAG_CONSTRUCT_PROXY;  /* Enable 'construct' trap return invariant check. */\n\t\t*call_flags &= ~(DUK_CALL_FLAG_CONSTRUCT);     /* Resume as non-constructor call to the trap. */\n\n\t\t/* 'apply' args: target, thisArg, argArray\n\t\t * 'construct' args: target, argArray, newTarget\n\t\t */\n\t\tduk_remove(thr, idx_func + 4);\n\t\tduk_push_hobject(thr, (duk_hobject *) h_proxy);\n\t}\n\n\t/* Finalize value stack layout by removing Proxy reference. */\n\tduk_remove(thr, idx_func);\n\th_proxy = NULL;  /* invalidated */\n\tDUK_ASSERT(duk_get_top(thr) == idx_func + 5);\n}\n#endif  /* DUK_USE_ES6_PROXY */\n\n/*\n *  Helper for setting up var_env and lex_env of an activation,\n *  assuming it does NOT have the DUK_HOBJECT_FLAG_NEWENV flag.\n */\n\nDUK_LOCAL void duk__handle_oldenv_for_call(duk_hthread *thr,\n                                           duk_hobject *func,\n                                           duk_activation *act) {\n\tduk_hcompfunc *f;\n\tduk_hobject *h_lex;\n\tduk_hobject *h_var;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV(func));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func));\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(func));\n\tDUK_UNREF(thr);\n\n\tf = (duk_hcompfunc *) func;\n\th_lex = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f);\n\th_var = DUK_HCOMPFUNC_GET_VARENV(thr->heap, f);\n\tDUK_ASSERT(h_lex != NULL);  /* Always true for closures (not for templates) */\n\tDUK_ASSERT(h_var != NULL);\n\tact->lex_env = h_lex;\n\tact->var_env = h_var;\n\tDUK_HOBJECT_INCREF(thr, h_lex);\n\tDUK_HOBJECT_INCREF(thr, h_var);\n}\n\n/*\n *  Helper for updating callee 'caller' property.\n */\n\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\nDUK_LOCAL void duk__update_func_caller_prop(duk_hthread *thr, duk_hobject *func) {\n\tduk_tval *tv_caller;\n\tduk_hobject *h_tmp;\n\tduk_activation *act_callee;\n\tduk_activation *act_caller;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));  /* bound chain resolved */\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\n\tif (DUK_HOBJECT_HAS_STRICT(func)) {\n\t\t/* Strict functions don't get their 'caller' updated. */\n\t\treturn;\n\t}\n\n\tDUK_ASSERT(thr->callstack_top > 0);\n\tact_callee = thr->callstack_curr;\n\tDUK_ASSERT(act_callee != NULL);\n\tact_caller = (thr->callstack_top >= 2 ? act_callee->parent : NULL);\n\n\t/* XXX: check .caller writability? */\n\n\t/* Backup 'caller' property and update its value. */\n\ttv_caller = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_CALLER(thr));\n\tif (tv_caller) {\n\t\t/* If caller is global/eval code, 'caller' should be set to\n\t\t * 'null'.\n\t\t *\n\t\t * XXX: there is no exotic flag to infer this correctly now.\n\t\t * The NEWENV flag is used now which works as intended for\n\t\t * everything (global code, non-strict eval code, and functions)\n\t\t * except strict eval code.  Bound functions are never an issue\n\t\t * because 'func' has been resolved to a non-bound function.\n\t\t */\n\n\t\tif (act_caller != NULL) {\n\t\t\t/* act_caller->func may be NULL in some finalization cases,\n\t\t\t * just treat like we don't know the caller.\n\t\t\t */\n\t\t\tif (act_caller->func && !DUK_HOBJECT_HAS_NEWENV(act_caller->func)) {\n\t\t\t\t/* Setting to NULL causes 'caller' to be set to\n\t\t\t\t * 'null' as desired.\n\t\t\t\t */\n\t\t\t\tact_caller = NULL;\n\t\t\t}\n\t\t}\n\n\t\tif (DUK_TVAL_IS_OBJECT(tv_caller)) {\n\t\t\th_tmp = DUK_TVAL_GET_OBJECT(tv_caller);\n\t\t\tDUK_ASSERT(h_tmp != NULL);\n\t\t\tact_callee->prev_caller = h_tmp;\n\n\t\t\t/* Previous value doesn't need refcount changes because its ownership\n\t\t\t * is transferred to prev_caller.\n\t\t\t */\n\n\t\t\tif (act_caller != NULL) {\n\t\t\t\tDUK_ASSERT(act_caller->func != NULL);\n\t\t\t\tDUK_TVAL_SET_OBJECT(tv_caller, act_caller->func);\n\t\t\t\tDUK_TVAL_INCREF(thr, tv_caller);\n\t\t\t} else {\n\t\t\t\tDUK_TVAL_SET_NULL(tv_caller);  /* no incref */\n\t\t\t}\n\t\t} else {\n\t\t\t/* 'caller' must only take on 'null' or function value */\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_caller));\n\t\t\tDUK_ASSERT(act_callee->prev_caller == NULL);\n\t\t\tif (act_caller != NULL && act_caller->func) {\n\t\t\t\t/* Tolerate act_caller->func == NULL which happens in\n\t\t\t\t * some finalization cases; treat like unknown caller.\n\t\t\t\t */\n\t\t\t\tDUK_TVAL_SET_OBJECT(tv_caller, act_caller->func);\n\t\t\t\tDUK_TVAL_INCREF(thr, tv_caller);\n\t\t\t} else {\n\t\t\t\tDUK_TVAL_SET_NULL(tv_caller);  /* no incref */\n\t\t\t}\n\t\t}\n\t}\n}\n#endif  /* DUK_USE_NONSTD_FUNC_CALLER_PROPERTY */\n\n/*\n *  Shared helpers for resolving the final, non-bound target function of the\n *  call and the effective 'this' binding.  Resolves bound functions and\n *  applies .call(), .apply(), and .construct() inline.\n *\n *  Proxy traps are also handled inline so that if the target is a Proxy with\n *  a 'call' or 'construct' trap, the trap handler is called with a modified\n *  argument list.\n *\n *  Once the bound function / .call() / .apply() / .construct() sequence has\n *  been resolved, the value at idx_func + 1 may need coercion described in\n *  E5 Section 10.4.3.\n *\n *  A call that begins as a non-constructor call may be converted into a\n *  constructor call during the resolution process if Reflect.construct()\n *  is invoked.  This is handled by updating the caller's call_flags.\n *\n *  For global and eval code (E5 Sections 10.4.1 and 10.4.2), we assume\n *  that the caller has provided the correct 'this' binding explicitly\n *  when calling, i.e.:\n *\n *    - global code: this=global object\n *    - direct eval: this=copy from eval() caller's this binding\n *    - other eval:  this=global object\n *\n *  The 'this' coercion may cause a recursive function call with arbitrary\n *  side effects, because ToObject() may be called.\n */\n\nDUK_LOCAL DUK_INLINE void duk__coerce_nonstrict_this_binding(duk_hthread *thr, duk_idx_t idx_this) {\n\tduk_tval *tv_this;\n\tduk_hobject *obj_global;\n\n\ttv_this = thr->valstack_bottom + idx_this;\n\tswitch (DUK_TVAL_GET_TAG(tv_this)) {\n\tcase DUK_TAG_OBJECT:\n\t\tDUK_DDD(DUK_DDDPRINT(\"this binding: non-strict, object -> use directly\"));\n\t\tbreak;\n\tcase DUK_TAG_UNDEFINED:\n\tcase DUK_TAG_NULL:\n\t\tDUK_DDD(DUK_DDDPRINT(\"this binding: non-strict, undefined/null -> use global object\"));\n\t\tobj_global = thr->builtins[DUK_BIDX_GLOBAL];\n\t\t/* XXX: avoid this check somehow */\n\t\tif (DUK_LIKELY(obj_global != NULL)) {\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this));  /* no need to decref previous value */\n\t\t\tDUK_TVAL_SET_OBJECT(tv_this, obj_global);\n\t\t\tDUK_HOBJECT_INCREF(thr, obj_global);\n\t\t} else {\n\t\t\t/* This may only happen if built-ins are being \"torn down\".\n\t\t\t * This behavior is out of specification scope.\n\t\t\t */\n\t\t\tDUK_D(DUK_DPRINT(\"this binding: wanted to use global object, but it is NULL -> using undefined instead\"));\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv_this));  /* no need to decref previous value */\n\t\t\tDUK_TVAL_SET_UNDEFINED(tv_this);  /* nothing to incref */\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\t/* Plain buffers and lightfuncs are object coerced.  Lightfuncs\n\t\t * very rarely come here however, because the call target would\n\t\t * need to be a non-strict non-lightfunc (lightfuncs are considered\n\t\t * strict) with an explicit lightfunc 'this' binding.\n\t\t */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_this));\n\t\tDUK_DDD(DUK_DDDPRINT(\"this binding: non-strict, not object/undefined/null -> use ToObject(value)\"));\n\t\tduk_to_object(thr, idx_this);  /* may have side effects */\n\t\tbreak;\n\t}\n}\n\nDUK_LOCAL DUK_ALWAYS_INLINE duk_bool_t duk__resolve_target_fastpath_check(duk_hthread *thr, duk_idx_t idx_func, duk_hobject **out_func, duk_small_uint_t call_flags) {\n#if defined(DUK_USE_PREFER_SIZE)\n\tDUK_UNREF(thr);\n\tDUK_UNREF(idx_func);\n\tDUK_UNREF(out_func);\n\tDUK_UNREF(call_flags);\n#else  /* DUK_USE_PREFER_SIZE */\n\tduk_tval *tv_func;\n\tduk_hobject *func;\n\n\tif (DUK_UNLIKELY(call_flags & DUK_CALL_FLAG_CONSTRUCT)) {\n\t\treturn 0;\n\t}\n\n\ttv_func = DUK_GET_TVAL_POSIDX(thr, idx_func);\n\tDUK_ASSERT(tv_func != NULL);\n\n\tif (DUK_LIKELY(DUK_TVAL_IS_OBJECT(tv_func))) {\n\t\tfunc = DUK_TVAL_GET_OBJECT(tv_func);\n\t\tif (DUK_HOBJECT_IS_CALLABLE(func) &&\n\t\t    !DUK_HOBJECT_HAS_BOUNDFUNC(func) &&\n\t\t    !DUK_HOBJECT_HAS_SPECIAL_CALL(func)) {\n\t\t\t*out_func = func;\n\n\t\t\tif (DUK_HOBJECT_HAS_STRICT(func)) {\n\t\t\t\t/* Strict function: no 'this' coercion. */\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tduk__coerce_nonstrict_this_binding(thr, idx_func + 1);\n\t\t\treturn 1;\n\t\t}\n\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) {\n\t\t*out_func = NULL;\n\n\t\t/* Lightfuncs are considered strict, so 'this' binding is\n\t\t * used as is.  They're never bound, always constructable,\n\t\t * and never special functions.\n\t\t */\n\t\treturn 1;\n\t}\n#endif  /* DUK_USE_PREFER_SIZE */\n\treturn 0;  /* let slow path deal with it */\n}\n\nDUK_LOCAL duk_hobject *duk__resolve_target_func_and_this_binding(duk_hthread *thr,\n                                                                 duk_idx_t idx_func,\n                                                                 duk_small_uint_t *call_flags) {\n\tduk_tval *tv_func;\n\tduk_hobject *func;\n\tduk_bool_t first;\n\n\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\n\tfor (first = 1;; first = 0) {\n\t\tDUK_ASSERT(duk_get_top(thr) >= idx_func + 2);\n\n\t\ttv_func = DUK_GET_TVAL_POSIDX(thr, idx_func);\n\t\tDUK_ASSERT(tv_func != NULL);\n\n\t\tif (DUK_TVAL_IS_OBJECT(tv_func)) {\n\t\t\tfunc = DUK_TVAL_GET_OBJECT(tv_func);\n\n\t\t\tif (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {\n\t\t\t\tif (DUK_UNLIKELY(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func))) {\n\t\t\t\t\tgoto not_constructable;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (DUK_UNLIKELY(!DUK_HOBJECT_IS_CALLABLE(func))) {\n\t\t\t\t\tgoto not_callable;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DUK_LIKELY(!DUK_HOBJECT_HAS_BOUNDFUNC(func) &&\n\t\t\t               !DUK_HOBJECT_HAS_SPECIAL_CALL(func) &&\n\t\t\t               !DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func))) {\n\t\t\t\t/* Common case, so test for using a single bitfield test.\n\t\t\t\t * Break out to handle this coercion etc.\n\t\t\t\t */\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* XXX: could set specialcall for boundfuncs too, simplify check above */\n\n\t\t\tif (DUK_HOBJECT_HAS_BOUNDFUNC(func)) {\n\t\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_SPECIAL_CALL(func));\n\t\t\t\tDUK_ASSERT(!DUK_HOBJECT_IS_NATFUNC(func));\n\n\t\t\t\t/* Callable/constructable flags are the same\n\t\t\t\t * for the bound function and its target, so\n\t\t\t\t * we don't need to check them here, we can\n\t\t\t\t * check them from the target only.\n\t\t\t\t */\n\t\t\t\tduk__handle_bound_chain_for_call(thr, idx_func, *call_flags & DUK_CALL_FLAG_CONSTRUCT);\n\n\t\t\t\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(duk_require_tval(thr, idx_func)) ||\n\t\t\t\t           DUK_TVAL_IS_LIGHTFUNC(duk_require_tval(thr, idx_func)));\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_SPECIAL_CALL(func));\n\n#if defined(DUK_USE_ES6_PROXY)\n\t\t\t\tif (DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(func)) {\n\t\t\t\t\t/* If no trap, resume processing from Proxy trap.\n\t\t\t\t\t * If trap exists, helper converts call into a trap\n\t\t\t\t\t * call; this may change a constructor call into a\n\t\t\t\t\t * normal (non-constructor) trap call.  We must\n\t\t\t\t\t * continue processing even when a trap is found as\n\t\t\t\t\t * the trap may be bound.\n\t\t\t\t\t */\n\t\t\t\t\tduk__handle_proxy_for_call(thr, idx_func, (duk_hproxy *) func, call_flags);\n\t\t\t\t}\n\t\t\t\telse\n#endif\n\t\t\t\t{\n\t\t\t\t\tDUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func));\n\t\t\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_CALLABLE(func));\n\t\t\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_CONSTRUCTABLE(func));\n\t\t\t\t\t/* Constructable check already done above. */\n\n\t\t\t\t\tif (duk__handle_specialfuncs_for_call(thr, idx_func, func, call_flags, first) != 0) {\n\t\t\t\t\t\t/* Encountered native eval call, normal call\n\t\t\t\t\t\t * context.  Break out, handle this coercion etc.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* Retry loop. */\n\t\t} else if (DUK_TVAL_IS_LIGHTFUNC(tv_func)) {\n\t\t\t/* Lightfuncs are:\n\t\t\t *   - Always strict, so no 'this' coercion.\n\t\t\t *   - Always callable.\n\t\t\t *   - Always constructable.\n\t\t\t *   - Never specialfuncs.\n\t\t\t */\n\t\t\tfunc = NULL;\n\t\t\tgoto finished;\n\t\t} else {\n\t\t\tgoto not_callable;\n\t\t}\n\t}\n\n\tDUK_ASSERT(func != NULL);\n\n\tif (!DUK_HOBJECT_HAS_STRICT(func)) {\n\t\t/* Non-strict target needs 'this' coercion.\n\t\t * This has potential side effects invalidating\n\t\t * 'tv_func'.\n\t\t */\n\t\tduk__coerce_nonstrict_this_binding(thr, idx_func + 1);\n\t}\n\tif (*call_flags & DUK_CALL_FLAG_CONSTRUCT) {\n\t\tif (!(*call_flags & DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED)) {\n\t\t\t*call_flags |= DUK_CALL_FLAG_DEFAULT_INSTANCE_UPDATED;\n\t\t\tduk__update_default_instance_proto(thr, idx_func);\n\t\t}\n\t}\n\n finished:\n\n#if defined(DUK_USE_ASSERTIONS)\n\t{\n\t\tduk_tval *tv_tmp;\n\n\t\ttv_tmp = duk_get_tval(thr, idx_func);\n\t\tDUK_ASSERT(tv_tmp != NULL);\n\n\t\tDUK_ASSERT((DUK_TVAL_IS_OBJECT(tv_tmp) && DUK_HOBJECT_IS_CALLABLE(DUK_TVAL_GET_OBJECT(tv_tmp))) ||\n\t\t           DUK_TVAL_IS_LIGHTFUNC(tv_tmp));\n\t\tDUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func));\n\t\tDUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) ||\n\t\t                            DUK_HOBJECT_IS_NATFUNC(func)));\n\t\tDUK_ASSERT(func == NULL || (DUK_HOBJECT_HAS_CONSTRUCTABLE(func) ||\n\t\t                            (*call_flags & DUK_CALL_FLAG_CONSTRUCT) == 0));\n\t}\n#endif\n\n\treturn func;\n\n not_callable:\n\tDUK_ASSERT(tv_func != NULL);\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\t/* GETPROPC delayed error handling: when target is not callable,\n\t * GETPROPC replaces idx_func+0 with an Error (non-callable) with\n\t * a hidden Symbol to signify it's to be thrown as is here.  The\n\t * hidden Symbol is only checked as an own property, not inherited\n\t * (which would be dangerous).\n\t */\n\tif (DUK_TVAL_IS_OBJECT(tv_func)) {\n\t\tif (duk_hobject_find_existing_entry_tval_ptr(thr->heap, DUK_TVAL_GET_OBJECT(tv_func), DUK_HTHREAD_STRING_INT_TARGET(thr)) != NULL) {\n\t\t\tduk_push_tval(thr, tv_func);\n\t\t\t(void) duk_throw(thr);\n\t\t}\n\t}\n#endif\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n#if defined(DUK_USE_PARANOID_ERRORS)\n\tDUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, \"%s not callable\", duk_get_type_name(thr, idx_func));\n#else\n\tDUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, \"%s not callable\", duk_push_string_tval_readable(thr, tv_func));\n#endif\n#else\n\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CALLABLE);\n#endif\n\tDUK_UNREACHABLE();\n\treturn NULL;  /* never executed */\n\n not_constructable:\n\t/* For now GETPROPC delayed error not needed for constructor calls. */\n#if defined(DUK_USE_VERBOSE_ERRORS)\n#if defined(DUK_USE_PARANOID_ERRORS)\n\tDUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, \"%s not constructable\", duk_get_type_name(thr, idx_func));\n#else\n\tDUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, \"%s not constructable\", duk_push_string_tval_readable(thr, tv_func));\n#endif\n#else\n\tDUK_ERROR_TYPE(thr, DUK_STR_NOT_CONSTRUCTABLE);\n#endif\n\tDUK_UNREACHABLE();\n\treturn NULL;  /* never executed */\n}\n\n/*\n *  Manipulate value stack so that exactly 'num_stack_rets' return\n *  values are at 'idx_retbase' in every case, assuming there are\n *  'rc' return values on top of stack.\n *\n *  This is a bit tricky, because the called C function operates in\n *  the same activation record and may have e.g. popped the stack\n *  empty (below idx_retbase).\n */\n\nDUK_LOCAL void duk__safe_call_adjust_valstack(duk_hthread *thr, duk_idx_t idx_retbase, duk_idx_t num_stack_rets, duk_idx_t num_actual_rets) {\n\tduk_idx_t idx_rcbase;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(idx_retbase >= 0);\n\tDUK_ASSERT(num_stack_rets >= 0);\n\tDUK_ASSERT(num_actual_rets >= 0);\n\n\tidx_rcbase = duk_get_top(thr) - num_actual_rets;  /* base of known return values */\n\tif (DUK_UNLIKELY(idx_rcbase < 0)) {\n\t\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"adjust valstack after func call: \"\n\t                     \"num_stack_rets=%ld, num_actual_rets=%ld, stack_top=%ld, idx_retbase=%ld, idx_rcbase=%ld\",\n\t                     (long) num_stack_rets, (long) num_actual_rets, (long) duk_get_top(thr),\n\t                     (long) idx_retbase, (long) idx_rcbase));\n\n\tDUK_ASSERT(idx_rcbase >= 0);  /* caller must check */\n\n\t/* Space for num_stack_rets was reserved before the safe call.\n\t * Because value stack reserve cannot shrink except in call returns,\n\t * the reserve is still in place.  Adjust valstack, carefully\n\t * ensuring we don't overstep the reserve.\n\t */\n\n\t/* Match idx_rcbase with idx_retbase so that the return values\n\t * start at the correct index.\n\t */\n\tif (idx_rcbase > idx_retbase) {\n\t\tduk_idx_t count = idx_rcbase - idx_retbase;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"elements at/after idx_retbase have enough to cover func retvals \"\n\t\t                     \"(idx_retbase=%ld, idx_rcbase=%ld)\", (long) idx_retbase, (long) idx_rcbase));\n\n\t\t/* Remove values between irc_rcbase (start of intended return\n\t\t * values) and idx_retbase to lower return values to idx_retbase.\n\t\t */\n\t\tDUK_ASSERT(count > 0);\n\t\tduk_remove_n(thr, idx_retbase, count);  /* may be NORZ */\n\t} else {\n\t\tduk_idx_t count = idx_retbase - idx_rcbase;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"not enough elements at/after idx_retbase to cover func retvals \"\n\t\t                     \"(idx_retbase=%ld, idx_rcbase=%ld)\", (long) idx_retbase, (long) idx_rcbase));\n\n\t\t/* Insert 'undefined' at idx_rcbase (start of intended return\n\t\t * values) to lift return values to idx_retbase.\n\t\t */\n\t\tDUK_ASSERT(count >= 0);\n\t\tDUK_ASSERT(thr->valstack_end - thr->valstack_top >= count);  /* reserve cannot shrink */\n\t\tduk_insert_undefined_n(thr, idx_rcbase, count);\n\t}\n\n\t/* Chop extra retvals away / extend with undefined. */\n\tduk_set_top_unsafe(thr, idx_retbase + num_stack_rets);\n}\n\n/*\n *  Activation setup for tailcalls and non-tailcalls.\n */\n\n#if defined(DUK_USE_TAILCALL)\nDUK_LOCAL duk_small_uint_t duk__call_setup_act_attempt_tailcall(duk_hthread *thr,\n                                                                duk_small_uint_t call_flags,\n                                                                duk_idx_t idx_func,\n                                                                duk_hobject *func,\n                                                                duk_size_t entry_valstack_bottom_byteoff,\n                                                                duk_size_t entry_valstack_end_byteoff,\n                                                                duk_idx_t *out_nargs,\n                                                                duk_idx_t *out_nregs,\n                                                                duk_size_t *out_vs_min_bytes,\n                                                                duk_activation **out_act) {\n\tduk_activation *act;\n\tduk_tval *tv1, *tv2;\n\tduk_idx_t idx_args;\n\tduk_small_uint_t flags1, flags2;\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tduk_activation *prev_pause_act;\n#endif\n\n\tDUK_UNREF(entry_valstack_end_byteoff);\n\n\t/* Tailcall cannot be flagged to resume calls, and a\n\t * previous frame must exist.\n\t */\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\t*out_act = act;\n\n\tif (func == NULL || !DUK_HOBJECT_IS_COMPFUNC(func)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"tail call prevented by target not being ecma function\"));\n\t\treturn 0;\n\t}\n\tif (act->flags & DUK_ACT_FLAG_PREVENT_YIELD) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"tail call prevented by current activation having DUK_ACT_FLAG_PREVENT_YIELD\"));\n\t\treturn 0;\n\t}\n\t/* Tailcall is only allowed if current and candidate\n\t * function have identical return value handling.  There\n\t * are three possible return value handling cases:\n\t *   1. Normal function call, no special return value handling.\n\t *   2. Constructor call, return value replacement object check.\n\t *   3. Proxy 'construct' trap call, return value invariant check.\n\t */\n\tflags1 = (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT) ? 1 : 0)\n#if defined(DUK_USE_ES6_PROXY)\n\t         | (duk_small_uint_t) ((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) ? 2 : 0)\n#endif\n\t         ;\n\tflags2 = (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) ? 1 : 0)\n#if defined(DUK_USE_ES6_PROXY)\n\t         | (duk_small_uint_t) ((call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) ? 2 : 0);\n#endif\n\t         ;\n\tif (flags1 != flags2) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"tail call prevented by incompatible return value handling\"));\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT) && (call_flags & DUK_CALL_FLAG_CONSTRUCT)) ||\n\t           (!(act->flags & DUK_ACT_FLAG_CONSTRUCT) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT)));\n\tDUK_ASSERT(((act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY)) ||\n\t           (!(act->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY) && !(call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY)));\n\tif (DUK_HOBJECT_HAS_NOTAIL(func)) {\n\t\t/* See: test-bug-tailcall-preventyield-assert.c. */\n\t\tDUK_DDD(DUK_DDDPRINT(\"tail call prevented by function having a notail flag\"));\n\t\treturn 0;\n\t}\n\n\t/*\n\t *  Tailcall handling\n\t *\n\t *  Although the callstack entry is reused, we need to explicitly unwind\n\t *  the current activation (or simulate an unwind).  In particular, the\n\t *  current activation must be closed, otherwise something like\n\t *  test-bug-reduce-judofyr.js results.  Also catchers need to be unwound\n\t *  because there may be non-error-catching label entries in valid tail calls.\n\t *\n\t *  Special attention is needed for debugger and pause behavior when\n\t *  reusing an activation.\n\t *    - Disable StepOut processing for the activation unwind because\n\t *      we reuse the activation, see:\n\t *      https://github.com/svaarala/duktape/issues/1684.\n\t *    - Disable line change pause flag permanently (if set) because\n\t *      it would no longer be relevant, see:\n\t *      https://github.com/svaarala/duktape/issues/1726.\n\t *    - Check for function entry (e.g. StepInto) pause flag here, because\n\t *      the executor pause check won't trigger due to shared activation, see:\n\t *      https://github.com/svaarala/duktape/issues/1726.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"is tail call, reusing activation at callstack top, at index %ld\",\n                             (long) (thr->callstack_top - 1)));\n\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(func));\n\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func));\n\tDUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);\n\tDUK_ASSERT(call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA);\n\n\t/* Unwind the topmost callstack entry before reusing it.  This\n\t * also unwinds the catchers related to the topmost entry.\n\t */\n\tDUK_ASSERT(thr->callstack_top > 0);\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tprev_pause_act = thr->heap->dbg_pause_act;\n\tthr->heap->dbg_pause_act = NULL;\n\tthr->heap->dbg_pause_flags &= ~DUK_PAUSE_FLAG_LINE_CHANGE;\n\tif (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) {\n\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by function entry (tailcall)\"));\n\t\tduk_debug_set_paused(thr->heap);\n\t}\n#endif\n\tduk_hthread_activation_unwind_reuse_norz(thr);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tthr->heap->dbg_pause_act = prev_pause_act;\n#endif\n\tDUK_ASSERT(act == thr->callstack_curr);\n\n\t/* XXX: We could restore the caller's value stack reserve\n\t * here, as if we did an actual unwind-and-call.  Without\n\t * the restoration, value stack reserve may remain higher\n\t * than would otherwise be possible until we return to a\n\t * non-tailcall.\n\t */\n\n\t/* Then reuse the unwound activation. */\n\tact->cat = NULL;\n\tact->var_env = NULL;\n\tact->lex_env = NULL;\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func));\n\tact->func = func;  /* don't want an intermediate exposed state with func == NULL */\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\tact->prev_caller = NULL;\n#endif\n\t/* don't want an intermediate exposed state with invalid pc */\n\tact->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tact->prev_line = 0;\n#endif\n\tDUK_TVAL_SET_OBJECT(&act->tv_func, func);  /* borrowed, no refcount */\n\tDUK_HOBJECT_INCREF(thr, func);\n\n\tact->flags = DUK_ACT_FLAG_TAILCALLED;\n\tif (DUK_HOBJECT_HAS_STRICT(func)) {\n\t\tact->flags |= DUK_ACT_FLAG_STRICT;\n\t}\n\tif (call_flags & DUK_CALL_FLAG_CONSTRUCT) {\n\t\tact->flags |= DUK_ACT_FLAG_CONSTRUCT;\n\t}\n#if defined(DUK_USE_ES6_PROXY)\n\tif (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) {\n\t\tact->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY;\n\t}\n#endif\n\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(act) == func);      /* already updated */\n\tDUK_ASSERT(act->var_env == NULL);\n\tDUK_ASSERT(act->lex_env == NULL);\n\tact->bottom_byteoff = entry_valstack_bottom_byteoff;  /* tail call -> reuse current \"frame\" */\n#if 0\n\t/* Topmost activation retval_byteoff is considered garbage, no need to init. */\n\tact->retval_byteoff = 0;\n#endif\n\t/* Filled in when final reserve is known, dummy value doesn't matter\n\t * even in error unwind because reserve_byteoff is only used when\n\t * returning to -this- activation.\n\t */\n\tact->reserve_byteoff = 0;\n\n\t/*\n\t *  Manipulate valstack so that args are on the current bottom and the\n\t *  previous caller's 'this' binding (which is the value preceding the\n\t *  current bottom) is replaced with the new 'this' binding:\n\t *\n\t *       [ ... this_old | (crud) func this_new arg1 ... argN ]\n\t *  -->  [ ... this_new | arg1 ... argN ]\n\t *\n\t *  For tail calling to work properly, the valstack bottom must not grow\n\t *  here; otherwise crud would accumulate on the valstack.\n\t */\n\n\ttv1 = thr->valstack_bottom - 1;\n\ttv2 = thr->valstack_bottom + idx_func + 1;\n\tDUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);  /* tv1 is -below- valstack_bottom */\n\tDUK_ASSERT(tv2 >= thr->valstack_bottom && tv2 < thr->valstack_top);\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2);  /* side effects */\n\n\tidx_args = idx_func + 2;\n\tduk_remove_n(thr, 0, idx_args);  /* may be NORZ */\n\n\tidx_func = 0; DUK_UNREF(idx_func);  /* really 'not applicable' anymore, should not be referenced after this */\n\tidx_args = 0;\n\n\t*out_nargs = ((duk_hcompfunc *) func)->nargs;\n\t*out_nregs = ((duk_hcompfunc *) func)->nregs;\n\tDUK_ASSERT(*out_nregs >= 0);\n\tDUK_ASSERT(*out_nregs >= *out_nargs);\n\t*out_vs_min_bytes = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA);\n\n\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n#if defined(DUK_USE_TAILCALL)\n#error incorrect options: tail calls enabled with function caller property\n#endif\n\t/* XXX: This doesn't actually work properly for tail calls, so\n\t * tail calls are disabled when DUK_USE_NONSTD_FUNC_CALLER_PROPERTY\n\t * is in use.\n\t */\n\tduk__update_func_caller_prop(thr, func);\n#endif\n\n\t/* [ ... this_new | arg1 ... argN ] */\n\n\treturn 1;\n}\n#endif  /* DUK_USE_TAILCALL */\n\nDUK_LOCAL void duk__call_setup_act_not_tailcall(duk_hthread *thr,\n                                                duk_small_uint_t call_flags,\n                                                duk_idx_t idx_func,\n                                                duk_hobject *func,\n                                                duk_size_t entry_valstack_bottom_byteoff,\n                                                duk_size_t entry_valstack_end_byteoff,\n                                                duk_idx_t *out_nargs,\n                                                duk_idx_t *out_nregs,\n                                                duk_size_t *out_vs_min_bytes,\n                                                duk_activation **out_act) {\n\tduk_activation *act;\n\tduk_activation *new_act;\n\n\tDUK_UNREF(entry_valstack_end_byteoff);\n\n\tDUK_DDD(DUK_DDDPRINT(\"not a tail call, pushing a new activation to callstack, to index %ld\",\n\t                     (long) (thr->callstack_top)));\n\n\tduk__call_callstack_limit_check(thr);\n\tnew_act = duk_hthread_activation_alloc(thr);\n\tDUK_ASSERT(new_act != NULL);\n\n\tact = thr->callstack_curr;\n\tif (act != NULL) {\n\t\t/*\n\t\t *  Update return value stack index of current activation (if any).\n\t\t *\n\t\t *  Although it might seem this is not necessary (bytecode executor\n\t\t *  does this for Ecmascript-to-Ecmascript calls; other calls are\n\t\t *  handled here), this turns out to be necessary for handling yield\n\t\t *  and resume.  For them, an Ecmascript-to-native call happens, and\n\t\t *  the Ecmascript call's retval_byteoff must be set for things to work.\n\t\t */\n\n\t\tact->retval_byteoff = entry_valstack_bottom_byteoff + (duk_size_t) idx_func * sizeof(duk_tval);\n\t}\n\n\tnew_act->parent = act;\n\tthr->callstack_curr = new_act;\n\tthr->callstack_top++;\n\tact = new_act;\n\t*out_act = act;\n\n\tDUK_ASSERT(thr->valstack_top > thr->valstack_bottom);  /* at least effective 'this' */\n\tDUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func));\n\n\tact->cat = NULL;\n\n\tact->flags = 0;\n\tif (call_flags & DUK_CALL_FLAG_CONSTRUCT) {\n\t\tact->flags |= DUK_ACT_FLAG_CONSTRUCT;\n\t}\n#if defined(DUK_USE_ES6_PROXY)\n\tif (call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY) {\n\t\tact->flags |= DUK_ACT_FLAG_CONSTRUCT_PROXY;\n\t}\n#endif\n\tif (call_flags & DUK_CALL_FLAG_DIRECT_EVAL) {\n\t\tact->flags |= DUK_ACT_FLAG_DIRECT_EVAL;\n\t}\n\n\t/* start of arguments: idx_func + 2. */\n\tact->func = func;  /* NULL for lightfunc */\n\tif (DUK_LIKELY(func != NULL)) {\n\t\tDUK_TVAL_SET_OBJECT(&act->tv_func, func);  /* borrowed, no refcount */\n\t\tif (DUK_HOBJECT_HAS_STRICT(func)) {\n\t\t\tact->flags |= DUK_ACT_FLAG_STRICT;\n\t\t}\n\t\tif (DUK_HOBJECT_IS_COMPFUNC(func)) {\n\t\t\t*out_nargs = ((duk_hcompfunc *) func)->nargs;\n\t\t\t*out_nregs = ((duk_hcompfunc *) func)->nregs;\n\t\t\tDUK_ASSERT(*out_nregs >= 0);\n\t\t\tDUK_ASSERT(*out_nregs >= *out_nargs);\n\t\t\t*out_vs_min_bytes = entry_valstack_bottom_byteoff +\n\t\t\t\tsizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_INTERNAL_EXTRA);\n\t\t} else {\n\t\t\t/* True because of call target lookup checks. */\n\t\t\tDUK_ASSERT(DUK_HOBJECT_IS_NATFUNC(func));\n\n\t\t\t*out_nargs = ((duk_hnatfunc *) func)->nargs;\n\t\t\t*out_nregs = *out_nargs;\n\t\t\tif (*out_nargs >= 0) {\n\t\t\t\t*out_vs_min_bytes = entry_valstack_bottom_byteoff +\n\t\t\t\t\tsizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nregs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);\n\t\t\t} else {\n\t\t\t\t/* Vararg function. */\n\t\t\t\tduk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack));\n\t\t\t\t*out_vs_min_bytes = valstack_top_byteoff +\n\t\t\t\t\tsizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tduk_small_uint_t lf_flags;\n\t\tduk_tval *tv_func;\n\n\t\tact->flags |= DUK_ACT_FLAG_STRICT;\n\n\t\ttv_func = DUK_GET_TVAL_POSIDX(thr, idx_func);\n\t\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func));\n\t\tDUK_TVAL_SET_TVAL(&act->tv_func, tv_func);  /* borrowed, no refcount */\n\n\t\tlf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv_func);\n\t\t*out_nargs = DUK_LFUNC_FLAGS_GET_NARGS(lf_flags);\n\t\tif (*out_nargs != DUK_LFUNC_NARGS_VARARGS) {\n\t\t\t*out_vs_min_bytes = entry_valstack_bottom_byteoff +\n\t\t\t\tsizeof(duk_tval) * ((duk_size_t) idx_func + 2U + (duk_size_t) *out_nargs + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);\n\t\t} else {\n\t\t\tduk_size_t valstack_top_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_top - ((duk_uint8_t *) thr->valstack));\n\t\t\t*out_vs_min_bytes = valstack_top_byteoff +\n\t\t\t\tsizeof(duk_tval) * (DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA);\n\t\t\t*out_nargs = -1;  /* vararg */\n\t\t}\n\t\t*out_nregs = *out_nargs;\n\t}\n\n\tact->var_env = NULL;\n\tact->lex_env = NULL;\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\tact->prev_caller = NULL;\n#endif\n\tact->curr_pc = NULL;\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tact->prev_line = 0;\n#endif\n\tact->bottom_byteoff = entry_valstack_bottom_byteoff + sizeof(duk_tval) * ((duk_size_t) idx_func + 2U);\n#if 0\n\tact->retval_byteoff = 0;   /* topmost activation retval_byteoff is considered garbage, no need to init */\n#endif\n\t/* Filled in when final reserve is known, dummy value doesn't matter\n\t * even in error unwind because reserve_byteoff is only used when\n\t * returning to -this- activation.\n\t */\n\tact->reserve_byteoff = 0;  /* filled in by caller */\n\n\t/* XXX: Is this INCREF necessary? 'func' is always a borrowed\n\t * reference reachable through the value stack?  If changed, stack\n\t * unwind code also needs to be fixed to match.\n\t */\n\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, func);  /* act->func */\n\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\tif (func) {\n\t\tduk__update_func_caller_prop(thr, func);\n\t}\n#endif\n}\n\n/*\n *  Environment setup.\n */\n\nDUK_LOCAL void duk__call_env_setup(duk_hthread *thr, duk_hobject *func, duk_activation *act, duk_idx_t idx_args) {\n\tduk_hobject *env;\n\n\tDUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func));  /* bound function has already been resolved */\n\n\tif (DUK_LIKELY(func != NULL)) {\n\t\tif (DUK_LIKELY(DUK_HOBJECT_HAS_NEWENV(func))) {\n\t\t\tif (DUK_LIKELY(!DUK_HOBJECT_HAS_CREATEARGS(func))) {\n\t\t\t\t/* Use a new environment but there's no 'arguments' object;\n\t\t\t\t * delayed environment initialization.  This is the most\n\t\t\t\t * common case.\n\t\t\t\t */\n\t\t\t\tDUK_ASSERT(act->lex_env == NULL);\n\t\t\t\tDUK_ASSERT(act->var_env == NULL);\n\t\t\t} else {\n\t\t\t\t/* Use a new environment and there's an 'arguments' object.\n\t\t\t\t * We need to initialize it right now.\n\t\t\t\t */\n\n\t\t\t\t/* third arg: absolute index (to entire valstack) of bottom_byteoff of new activation */\n\t\t\t\tenv = duk_create_activation_environment_record(thr, func, act->bottom_byteoff);\n\t\t\t\tDUK_ASSERT(env != NULL);\n\n\t\t\t\t/* [ ... func this arg1 ... argN envobj ] */\n\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_CREATEARGS(func));\n\t\t\t\tduk__handle_createargs_for_call(thr, func, env, idx_args);\n\n\t\t\t\t/* [ ... func this arg1 ... argN envobj ] */\n\n\t\t\t\tact->lex_env = env;\n\t\t\t\tact->var_env = env;\n\t\t\t\tDUK_HOBJECT_INCREF(thr, env);\n\t\t\t\tDUK_HOBJECT_INCREF(thr, env);  /* XXX: incref by count (2) directly */\n\t\t\t\tduk_pop(thr);\n\t\t\t}\n\t\t} else {\n\t\t\t/* Use existing env (e.g. for non-strict eval); cannot have\n\t\t\t * an own 'arguments' object (but can refer to an existing one).\n\t\t\t */\n\n\t\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_CREATEARGS(func));\n\n\t\t\tduk__handle_oldenv_for_call(thr, func, act);\n\n\t\t\tDUK_ASSERT(act->lex_env != NULL);\n\t\t\tDUK_ASSERT(act->var_env != NULL);\n\t\t}\n\t} else {\n\t\t/* Lightfuncs are always native functions and have \"newenv\". */\n\t\tDUK_ASSERT(act->lex_env == NULL);\n\t\tDUK_ASSERT(act->var_env == NULL);\n\t}\n}\n\n/*\n *  Misc shared helpers.\n */\n\n/* Check thread state, update current thread. */\nDUK_LOCAL void duk__call_thread_state_update(duk_hthread *thr) {\n\tDUK_ASSERT(thr != NULL);\n\n\tif (DUK_LIKELY(thr == thr->heap->curr_thread)) {\n\t\tif (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_RUNNING)) {\n\t\t\t/* Should actually never happen, but check anyway. */\n\t\t\tgoto thread_state_error;\n\t\t}\n\t} else {\n\t\tDUK_ASSERT(thr->heap->curr_thread == NULL ||\n\t\t           thr->heap->curr_thread->state == DUK_HTHREAD_STATE_RUNNING);\n\t\tif (DUK_UNLIKELY(thr->state != DUK_HTHREAD_STATE_INACTIVE)) {\n\t\t\tgoto thread_state_error;\n\t\t}\n\t\tDUK_HEAP_SWITCH_THREAD(thr->heap, thr);\n\t\tthr->state = DUK_HTHREAD_STATE_RUNNING;\n\n\t\t/* Multiple threads may be simultaneously in the RUNNING\n\t\t * state, but not in the same \"resume chain\".\n\t\t */\n\t}\n\tDUK_ASSERT(thr->heap->curr_thread == thr);\n\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);\n\treturn;\n\n thread_state_error:\n\tDUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, \"invalid thread state (%ld)\", (long) thr->state);\n\tDUK_UNREACHABLE();\n}\n\n/*\n *  Main unprotected call handler, handles:\n *\n *    - All combinations of native/Ecmascript caller and native/Ecmascript\n *      target.\n *\n *    - Optimized Ecmascript-to-Ecmascript call where call handling only\n *      sets up a new duk_activation but reuses an existing bytecode executor\n *      (the caller) without native recursion.\n *\n *    - Tailcalls, where an activation is reused without increasing call\n *      stack (duk_activation) depth.\n *\n *    - Setup for an initial Duktape.Thread.resume().\n *\n *  The call handler doesn't provide any protection guarantees, protected calls\n *  must be implemented e.g. by wrapping the call in a duk_safe_call().\n *  Call setup may fail at any stage, even when the new activation is in\n *  place; the only guarantee is that the state is consistent for unwinding.\n */\n\nDUK_LOCAL duk_int_t duk__handle_call_raw(duk_hthread *thr,\n                                         duk_idx_t idx_func,\n                                         duk_small_uint_t call_flags) {\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_activation *entry_act;\n\tduk_size_t entry_callstack_top;\n#endif\n\tduk_size_t entry_valstack_bottom_byteoff;\n\tduk_size_t entry_valstack_end_byteoff;\n\tduk_int_t entry_call_recursion_depth;\n\tduk_hthread *entry_curr_thread;\n\tduk_uint_fast8_t entry_thread_state;\n\tduk_instr_t **entry_ptr_curr_pc;\n\tduk_idx_t idx_args;\n\tduk_idx_t nargs;            /* # argument registers target function wants (< 0 => \"as is\") */\n\tduk_idx_t nregs;            /* # total registers target function wants on entry (< 0 => \"as is\") */\n\tduk_size_t vs_min_bytes;    /* minimum value stack size (bytes) for handling call */\n\tduk_hobject *func;          /* 'func' on stack (borrowed reference) */\n\tduk_activation *act;\n\tduk_ret_t rc;\n\tduk_small_uint_t use_tailcall;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\t/* Asserts for heap->curr_thread omitted: it may be NULL, 'thr', or\n\t * any other thread (e.g. when heap thread is used to run finalizers).\n\t */\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\tDUK_ASSERT(idx_func >= 0);\n\n\tDUK_STATS_INC(thr->heap, stats_call_all);\n\n\t/* If a tail call:\n\t *   - an Ecmascript activation must be on top of the callstack\n\t *   - there cannot be any catch stack entries that would catch\n\t *     a return\n\t */\n#if defined(DUK_USE_ASSERTIONS)\n\tif (call_flags & DUK_CALL_FLAG_TAILCALL) {\n\t\tduk_activation *tmp_act;\n\t\tduk_catcher *tmp_cat;\n\n\t\tDUK_ASSERT(thr->callstack_top >= 1);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));\n\n\t\t/* No entry in the catch stack which would actually catch a\n\t\t * throw can refer to the callstack entry being reused.\n\t\t * There *can* be catch stack entries referring to the current\n\t\t * callstack entry as long as they don't catch (e.g. label sites).\n\t\t */\n\n\t\ttmp_act = thr->callstack_curr;\n\t\tfor (tmp_cat = tmp_act->cat; tmp_cat != NULL; tmp_cat = tmp_cat->parent) {\n\t\t\tDUK_ASSERT(DUK_CAT_GET_TYPE(tmp_cat) == DUK_CAT_TYPE_LABEL); /* a non-catching entry */\n\t\t}\n\t}\n#endif  /* DUK_USE_ASSERTIONS */\n\n\t/*\n\t *  Store entry state.\n\t */\n\n#if defined(DUK_USE_ASSERTIONS)\n\tentry_act = thr->callstack_curr;\n\tentry_callstack_top = thr->callstack_top;\n#endif\n\tentry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack);\n\tentry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);\n\tentry_call_recursion_depth = thr->heap->call_recursion_depth;\n\tentry_curr_thread = thr->heap->curr_thread;  /* may be NULL if first call */\n\tentry_thread_state = thr->state;\n\tentry_ptr_curr_pc = thr->ptr_curr_pc;  /* may be NULL */\n\n\t/* If thr->ptr_curr_pc is set, sync curr_pc to act->pc.  Then NULL\n\t * thr->ptr_curr_pc so that it's not accidentally used with an incorrect\n\t * activation when side effects occur.\n\t */\n\tduk_hthread_sync_and_null_currpc(thr);\n\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\n\tDUK_DD(DUK_DDPRINT(\"duk__handle_call_raw: thr=%p, idx_func=%ld, \"\n\t                   \"call_flags=0x%08lx (constructor=%ld), \"\n\t                   \"valstack_top=%ld, idx_func=%ld, idx_args=%ld, rec_depth=%ld/%ld, \"\n\t                   \"entry_valstack_bottom_byteoff=%ld, entry_valstack_end_byteoff=%ld, \"\n\t                   \"entry_call_recursion_depth=%ld, \"\n\t                   \"entry_curr_thread=%p, entry_thread_state=%ld\",\n\t                   (void *) thr,\n\t                   (long) idx_func,\n\t                   (unsigned long) call_flags,\n\t                   (long) ((call_flags & DUK_CALL_FLAG_CONSTRUCT) != 0 ? 1 : 0),\n\t                   (long) duk_get_top(thr),\n\t                   (long) idx_func,\n\t                   (long) (idx_func + 2),\n\t                   (long) thr->heap->call_recursion_depth,\n\t                   (long) thr->heap->call_recursion_limit,\n\t                   (long) entry_valstack_bottom_byteoff,\n\t                   (long) entry_valstack_end_byteoff,\n\t                   (long) entry_call_recursion_depth,\n\t                   (void *) entry_curr_thread,\n\t                   (long) entry_thread_state));\n\n\t/*\n\t *  Thread state check and book-keeping.\n\t */\n\n\tduk__call_thread_state_update(thr);\n\n\t/*\n\t *  Resolve final target function; handle bound functions and special\n\t *  functions like .call() and .apply().  Also figure out the effective\n\t *  'this' binding, which replaces the current value at idx_func + 1.\n\t */\n\n\tif (DUK_LIKELY(duk__resolve_target_fastpath_check(thr, idx_func, &func, call_flags) != 0U)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"fast path target resolve\"));\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"slow path target resolve\"));\n\t\tfunc = duk__resolve_target_func_and_this_binding(thr, idx_func, &call_flags);\n\t}\n\tDUK_ASSERT(duk_get_top(thr) - idx_func >= 2);  /* at least func and this present */\n\n\tDUK_ASSERT(func == NULL || !DUK_HOBJECT_HAS_BOUNDFUNC(func));\n\tDUK_ASSERT(func == NULL || (DUK_HOBJECT_IS_COMPFUNC(func) ||\n\t                            DUK_HOBJECT_IS_NATFUNC(func)));\n\n\t/* [ ... func this arg1 ... argN ] */\n\n\t/*\n\t *  Setup a preliminary activation and figure out nargs/nregs and\n\t *  value stack minimum size.\n\t *\n\t *  Don't touch valstack_bottom or valstack_top yet so that Duktape API\n\t *  calls work normally.\n\t *\n\t *  Because 'act' is not zeroed, all fields must be filled in.\n\t */\n\n#if defined(DUK_USE_TAILCALL)\n\tuse_tailcall = (call_flags & DUK_CALL_FLAG_TAILCALL);\n\tif (use_tailcall) {\n\t\tuse_tailcall = duk__call_setup_act_attempt_tailcall(thr,\n\t\t                                                    call_flags,\n\t\t                                                    idx_func,\n\t\t                                                    func,\n\t\t                                                    entry_valstack_bottom_byteoff,\n\t\t                                                    entry_valstack_end_byteoff,\n\t\t                                                    &nargs,\n\t\t                                                    &nregs,\n\t\t                                                    &vs_min_bytes,\n\t\t                                                    &act);\n\t}\n#else\n\tDUK_ASSERT((call_flags & DUK_CALL_FLAG_TAILCALL) == 0);  /* compiler ensures this */\n\tuse_tailcall = 0;\n#endif\n\n\tif (use_tailcall) {\n\t\tidx_args = 0;\n\t\tDUK_STATS_INC(thr->heap, stats_call_tailcall);\n\t} else {\n\t\tduk__call_setup_act_not_tailcall(thr,\n\t\t                                 call_flags,\n\t\t                                 idx_func,\n\t\t                                 func,\n\t\t                                 entry_valstack_bottom_byteoff,\n\t\t                                 entry_valstack_end_byteoff,\n\t\t                                 &nargs,\n\t\t                                 &nregs,\n\t\t                                 &vs_min_bytes,\n\t\t                                 &act);\n\t\tidx_args = idx_func + 2;\n\t}\n\t/* After this point idx_func is no longer valid for tailcalls. */\n\n\tDUK_ASSERT(act != NULL);\n\n\t/* [ ... func this arg1 ... argN ] */\n\n\t/*\n\t *  Environment record creation and 'arguments' object creation.\n\t *  Named function expression name binding is handled by the\n\t *  compiler; the compiled function's parent env will contain\n\t *  the (immutable) binding already.\n\t *\n\t *  This handling is now identical for C and Ecmascript functions.\n\t *  C functions always have the 'NEWENV' flag set, so their\n\t *  environment record initialization is delayed (which is good).\n\t *\n\t *  Delayed creation (on demand) is handled in duk_js_var.c.\n\t */\n\n\tduk__call_env_setup(thr, func, act, idx_args);\n\n\t/* [ ... func this arg1 ... argN ] */\n\n\t/*\n\t *  Setup value stack: clamp to 'nargs', fill up to 'nregs',\n\t *  ensure value stack size matches target requirements, and\n\t *  switch value stack bottom.  Valstack top is kept.\n\t *\n\t *  Value stack can only grow here.\n\t */\n\n\tduk_valstack_grow_check_throw(thr, vs_min_bytes);\n\tact->reserve_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);\n\n\tif (use_tailcall) {\n\t\tDUK_ASSERT(nregs >= 0);\n\t\tDUK_ASSERT(nregs >= nargs);\n\t\tduk_set_top_and_wipe(thr, nregs, nargs);\n\t} else {\n\t\tif (nregs >= 0) {\n\t\t\tDUK_ASSERT(nregs >= nargs);\n\t\t\tduk_set_top_and_wipe(thr, idx_func + 2 + nregs, idx_func + 2 + nargs);\n\t\t} else {\n\t\t\t;\n\t\t}\n\t\tthr->valstack_bottom = thr->valstack_bottom + idx_func + 2;\n\t}\n\tDUK_ASSERT(thr->valstack_bottom >= thr->valstack);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_top);\n\n\t/*\n\t *  Make the actual call.  For Ecma-to-Ecma calls detect that\n\t *  setup is complete, then return with a status code that allows\n\t *  the caller to reuse the running executor.\n\t */\n\n\tif (func != NULL && DUK_HOBJECT_IS_COMPFUNC(func)) {\n\t\t/*\n\t\t *  Ecmascript call.\n\t\t */\n\n\t\tDUK_ASSERT(func != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(func));\n\t\tact->curr_pc = DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, (duk_hcompfunc *) func);\n\n\t\tif (call_flags & DUK_CALL_FLAG_ALLOW_ECMATOECMA) {\n\t\t\tDUK_DD(DUK_DDPRINT(\"avoid native call, use existing executor\"));\n\t\t\tDUK_STATS_INC(thr->heap, stats_call_ecmatoecma);\n\t\t\tDUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);\n\t\t\tDUK_REFZERO_CHECK_FAST(thr);\n\t\t\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\t\t\treturn 1;  /* 1=reuse executor */\n\t\t}\n\t\tDUK_ASSERT(use_tailcall == 0);\n\n\t\t/* duk_hthread_activation_unwind_norz() will decrease this on unwind */\n\t\tDUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);\n\t\tact->flags |= DUK_ACT_FLAG_PREVENT_YIELD;\n\t\tthr->callstack_preventcount++;\n\n\t\t/* XXX: we could just do this on entry regardless of reuse, as long\n\t\t * as recursion depth is decreased for e2e case.\n\t\t */\n\t\tduk__call_c_recursion_limit_check(thr);\n\t\tthr->heap->call_recursion_depth++;\n\n\t\t/* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */\n\n\t\t/*\n\t\t *  Bytecode executor call.\n\t\t *\n\t\t *  Execute bytecode, handling any recursive function calls and\n\t\t *  thread resumptions.  Returns when execution would return from\n\t\t *  the entry level activation.  When the executor returns, a\n\t\t *  single return value is left on the stack top.\n\t\t *\n\t\t *  The only possible longjmp() is an error (DUK_LJ_TYPE_THROW),\n\t\t *  other types are handled internally by the executor.\n\t\t */\n\n\t\t/* thr->ptr_curr_pc is set by bytecode executor early on entry */\n\t\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\t\tDUK_DDD(DUK_DDDPRINT(\"entering bytecode execution\"));\n\t\tduk_js_execute_bytecode(thr);\n\t\tDUK_DDD(DUK_DDDPRINT(\"returned from bytecode execution\"));\n\t} else {\n\t\t/*\n\t\t *  Native call.\n\t\t */\n\n\t\tDUK_ASSERT(func == NULL || ((duk_hnatfunc *) func)->func != NULL);\n\t\tDUK_ASSERT(use_tailcall == 0);\n\n\t\t/* [ ... func this | arg1 ... argN ] ('this' must precede new bottom) */\n\n\t\t/* duk_hthread_activation_unwind_norz() will decrease this on unwind */\n\t\tDUK_ASSERT((act->flags & DUK_ACT_FLAG_PREVENT_YIELD) == 0);\n\t\tact->flags |= DUK_ACT_FLAG_PREVENT_YIELD;\n\t\tthr->callstack_preventcount++;\n\n\t\t/* XXX: we could just do this on entry regardless of reuse, as long\n\t\t * as recursion depth is decreased for e2e case.\n\t\t */\n\t\tduk__call_c_recursion_limit_check(thr);\n\t\tthr->heap->call_recursion_depth++;\n\n\t\t/* For native calls must be NULL so we don't sync back */\n\t\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\n\t\t/* XXX: native funcptr could come out of call setup. */\n\t\tif (func) {\n\t\t\trc = ((duk_hnatfunc *) func)->func(thr);\n\t\t} else {\n\t\t\tduk_tval *tv_func;\n\t\t\tduk_c_function funcptr;\n\n\t\t\ttv_func = &act->tv_func;\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv_func));\n\t\t\tfuncptr = DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv_func);\n\t\t\trc = funcptr(thr);\n\t\t}\n\n\t\t/* Automatic error throwing, retval check. */\n\n\t\tif (rc == 0) {\n\t\t\tDUK_ASSERT(thr->valstack < thr->valstack_end);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));\n\t\t\tthr->valstack_top++;\n\t\t} else if (rc == 1) {\n\t\t\t;\n\t\t} else if (rc < 0) {\n\t\t\tduk_error_throw_from_negative_rc(thr, rc);\n\t\t\tDUK_UNREACHABLE();\n\t\t} else {\n\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_CFUNC_RC);\n\t\t}\n\t}\n\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\tDUK_ASSERT(use_tailcall == 0);\n\n\t/*\n\t *  Constructor call post processing.\n\t */\n\n#if defined(DUK_USE_ES6_PROXY)\n\tif (call_flags & (DUK_CALL_FLAG_CONSTRUCT | DUK_CALL_FLAG_CONSTRUCT_PROXY)) {\n\t\tduk_call_construct_postprocess(thr, call_flags & DUK_CALL_FLAG_CONSTRUCT_PROXY);\n\t}\n#else\n\tif (call_flags & DUK_CALL_FLAG_CONSTRUCT) {\n\t\tduk_call_construct_postprocess(thr, 0);\n\t}\n#endif\n\n\t/*\n\t *  Unwind, restore valstack bottom and other book-keeping.\n\t */\n\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT(thr->callstack_curr->parent == entry_act);\n\tDUK_ASSERT(thr->callstack_top == entry_callstack_top + 1);\n\tduk_hthread_activation_unwind_norz(thr);\n\tDUK_ASSERT(thr->callstack_curr == entry_act);\n\tDUK_ASSERT(thr->callstack_top == entry_callstack_top);\n\n\tthr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff);\n\t/* keep current valstack_top */\n\tDUK_ASSERT(thr->valstack_bottom >= thr->valstack);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_top);\n\tDUK_ASSERT(thr->valstack_top - thr->valstack_bottom >= idx_func + 1);\n\n\t/* Return value handling. */\n\n\t/* [ ... func this (crud) retval ] */\n\n\t{\n\t\tduk_tval *tv_ret;\n\t\tduk_tval *tv_funret;\n\n\t\ttv_ret = thr->valstack_bottom + idx_func;\n\t\ttv_funret = thr->valstack_top - 1;\n#if defined(DUK_USE_FASTINT)\n\t\t/* Explicit check for fastint downgrade. */\n\t\tDUK_TVAL_CHKFAST_INPLACE_FAST(tv_funret);\n#endif\n\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv_ret, tv_funret);  /* side effects */\n\t}\n\n\tduk_set_top_unsafe(thr, idx_func + 1);\n\n\t/* [ ... retval ] */\n\n\t/* Restore caller's value stack reserve (cannot fail). */\n\tDUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff >= (duk_uint8_t *) thr->valstack_top);\n\tDUK_ASSERT((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff <= (duk_uint8_t *) thr->valstack_alloc_end);\n\tthr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_end_byteoff);\n\n\t/* XXX: Trial value stack shrink would be OK here, but we'd need\n\t * to prevent side effects of the potential realloc.\n\t */\n\n\t/* Restore entry thread executor curr_pc stack frame pointer. */\n\tthr->ptr_curr_pc = entry_ptr_curr_pc;\n\n\tDUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread);  /* may be NULL */\n\tthr->state = (duk_uint8_t) entry_thread_state;\n\n\t/* Disabled assert: triggered with some torture tests. */\n#if 0\n\tDUK_ASSERT((thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread == NULL) ||  /* first call */\n\t           (thr->state == DUK_HTHREAD_STATE_INACTIVE && thr->heap->curr_thread != NULL) ||  /* other call */\n\t           (thr->state == DUK_HTHREAD_STATE_RUNNING && thr->heap->curr_thread == thr));     /* current thread */\n#endif\n\n\tthr->heap->call_recursion_depth = entry_call_recursion_depth;\n\n\t/* If the debugger is active we need to force an interrupt so that\n\t * debugger breakpoints are rechecked.  This is important for function\n\t * calls caused by side effects (e.g. when doing a DUK_OP_GETPROP), see\n\t * GH-303.  Only needed for success path, error path always causes a\n\t * breakpoint recheck in the executor.  It would be enough to set this\n\t * only when returning to an Ecmascript activation, but setting the flag\n\t * on every return should have no ill effect.\n\t */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tif (duk_debug_is_attached(thr->heap)) {\n\t\tDUK_DD(DUK_DDPRINT(\"returning with debugger enabled, force interrupt\"));\n\t\tDUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init);\n\t\tthr->interrupt_init -= thr->interrupt_counter;\n\t\tthr->interrupt_counter = 0;\n\t\tthr->heap->dbg_force_restart = 1;\n\t}\n#endif\n\n#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)\n\tduk__interrupt_fixup(thr, entry_curr_thread);\n#endif\n\n\t/* Restored by success path. */\n\tDUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth);\n\tDUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc);\n\tDUK_ASSERT_LJSTATE_UNSET(thr->heap);\n\n\tDUK_REFZERO_CHECK_FAST(thr);\n\n\treturn 0;  /* 0=call handled inline */\n}\n\nDUK_INTERNAL duk_int_t duk_handle_call_unprotected_nargs(duk_hthread *thr,\n                                                         duk_idx_t nargs,\n                                                         duk_small_uint_t call_flags) {\n\tduk_idx_t idx_func;\n\tDUK_ASSERT(duk_get_top(thr) >= nargs + 2);\n\tidx_func = duk_get_top(thr) - (nargs + 2);\n\tDUK_ASSERT(idx_func >= 0);\n\treturn duk_handle_call_unprotected(thr, idx_func, call_flags);\n}\n\nDUK_INTERNAL duk_int_t duk_handle_call_unprotected(duk_hthread *thr,\n                                                   duk_idx_t idx_func,\n                                                   duk_small_uint_t call_flags) {\n\tDUK_ASSERT(duk_is_valid_index(thr, idx_func));\n\tDUK_ASSERT(idx_func >= 0);\n\treturn duk__handle_call_raw(thr, idx_func, call_flags);\n}\n\n/*\n *  duk_handle_safe_call(): make a \"C protected call\" within the\n *  current activation.\n *\n *  The allowed thread states for making a call are the same as for\n *  duk_handle_call_protected().\n *\n *  Even though this call is protected, errors are thrown for insane arguments\n *  and may result in a fatal error unless there's another protected call which\n *  catches such errors.\n *\n *  The error handling path should be error free, even for out-of-memory\n *  errors, to ensure safe sandboxing.  (As of Duktape 2.2.0 this is not\n *  yet the case for environment closing which may run out of memory, see\n *  XXX notes below.)\n */\n\nDUK_LOCAL void duk__handle_safe_call_inner(duk_hthread *thr,\n                                           duk_safe_call_function func,\n                                           void *udata,\n#if defined(DUK_USE_ASSERTIONS)\n                                           duk_size_t entry_valstack_bottom_byteoff,\n                                           duk_size_t entry_callstack_top,\n#endif\n                                           duk_hthread *entry_curr_thread,\n                                           duk_uint_fast8_t entry_thread_state,\n                                           duk_idx_t idx_retbase,\n                                           duk_idx_t num_stack_rets) {\n\tduk_ret_t rc;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\t/*\n\t *  Thread state check and book-keeping.\n\t */\n\n\tduk__call_thread_state_update(thr);\n\n\t/*\n\t *  Recursion limit check.\n\t */\n\n\tduk__call_c_recursion_limit_check(thr);\n\tthr->heap->call_recursion_depth++;\n\n\t/*\n\t *  Make the C call.\n\t */\n\n\trc = func(thr, udata);\n\n\tDUK_DDD(DUK_DDDPRINT(\"safe_call, func rc=%ld\", (long) rc));\n\n\t/*\n\t *  Valstack manipulation for results.\n\t */\n\n\t/* we're running inside the caller's activation, so no change in call/catch stack or valstack bottom */\n\tDUK_ASSERT(thr->callstack_top == entry_callstack_top);\n\tDUK_ASSERT(thr->valstack_bottom >= thr->valstack);\n\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff);\n\tDUK_ASSERT(thr->valstack_top >= thr->valstack_bottom);\n\tDUK_ASSERT(thr->valstack_end >= thr->valstack_top);\n\n\tif (DUK_UNLIKELY(rc < 0)) {\n\t\tduk_error_throw_from_negative_rc(thr, rc);\n\t}\n\tDUK_ASSERT(rc >= 0);\n\n\tduk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, rc);  /* throws for insane rc */\n\n\tDUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread);  /* may be NULL */\n\tthr->state = (duk_uint8_t) entry_thread_state;\n}\n\nDUK_LOCAL void duk__handle_safe_call_error(duk_hthread *thr,\n                                           duk_activation *entry_act,\n#if defined(DUK_USE_ASSERTIONS)\n                                           duk_size_t entry_callstack_top,\n#endif\n                                           duk_hthread *entry_curr_thread,\n                                           duk_uint_fast8_t entry_thread_state,\n                                           duk_idx_t idx_retbase,\n                                           duk_idx_t num_stack_rets,\n                                           duk_size_t entry_valstack_bottom_byteoff,\n                                           duk_jmpbuf *old_jmpbuf_ptr) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT_CTX_VALID(thr);\n\n\t/*\n\t *  Error during call.  The error value is at heap->lj.value1.\n\t *\n\t *  The very first thing we do is restore the previous setjmp catcher.\n\t *  This means that any error in error handling will propagate outwards\n\t *  instead of causing a setjmp() re-entry above.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"error caught during protected duk_handle_safe_call()\"));\n\n\t/* Other longjmp types are handled by executor before propagating\n\t * the error here.\n\t */\n\tDUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW);\n\tDUK_ASSERT_LJSTATE_SET(thr->heap);\n\n\t/* Either pointer may be NULL (at entry), so don't assert. */\n\tthr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr;\n\n\t/* XXX: callstack unwind may now throw an error when closing\n\t * scopes; this is a sandboxing issue, described in:\n\t * https://github.com/svaarala/duktape/issues/476\n\t */\n\t/* XXX: \"unwind to\" primitive? */\n\n\tDUK_ASSERT(thr->callstack_top >= entry_callstack_top);\n\twhile (thr->callstack_curr != entry_act) {\n\t\tDUK_ASSERT(thr->callstack_curr != NULL);\n\t\tduk_hthread_activation_unwind_norz(thr);\n\t}\n\tDUK_ASSERT(thr->callstack_top == entry_callstack_top);\n\n\t/* Switch active thread before any side effects to avoid a\n\t * dangling curr_thread pointer.\n\t */\n\tDUK_HEAP_SWITCH_THREAD(thr->heap, entry_curr_thread);  /* may be NULL */\n\tthr->state = (duk_uint8_t) entry_thread_state;\n\n\tDUK_ASSERT(thr->heap->curr_thread == entry_curr_thread);\n\tDUK_ASSERT(thr->state == entry_thread_state);\n\n\t/* Restore valstack bottom. */\n\tthr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + entry_valstack_bottom_byteoff);\n\n\t/* [ ... | (crud) ] */\n\n\t/* XXX: ensure space in valstack (now relies on internal reserve)? */\n\tduk_push_tval(thr, &thr->heap->lj.value1);\n\n\t/* [ ... | (crud) errobj ] */\n\n\tDUK_ASSERT(duk_get_top(thr) >= 1);  /* at least errobj must be on stack */\n\n\tduk__safe_call_adjust_valstack(thr, idx_retbase, num_stack_rets, 1);  /* 1 = num actual 'return values' */\n\n\t/* [ ... | ] or [ ... | errobj (M * undefined)] where M = num_stack_rets - 1 */\n\n\t/* Reset longjmp state. */\n\tthr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN;\n\tthr->heap->lj.iserror = 0;\n\tDUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value1);\n\tDUK_TVAL_SET_UNDEFINED_UPDREF_NORZ(thr, &thr->heap->lj.value2);\n\n\t/* Error handling complete, remove side effect protections.  Caller\n\t * will process pending finalizers.\n\t */\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(thr->heap->error_not_allowed == 1);\n\tthr->heap->error_not_allowed = 0;\n#endif\n\tDUK_ASSERT(thr->heap->pf_prevent_count > 0);\n\tthr->heap->pf_prevent_count--;\n\tDUK_DD(DUK_DDPRINT(\"safe call error handled, pf_prevent_count updated to %ld\", (long) thr->heap->pf_prevent_count));\n\n\t/* thr->ptr_curr_pc is restored by\n\t * duk__handle_safe_call_shared_unwind() which is also used for\n\t * success path.\n\t */\n}\n\nDUK_LOCAL void duk__handle_safe_call_shared_unwind(duk_hthread *thr,\n                                                   duk_idx_t idx_retbase,\n                                                   duk_idx_t num_stack_rets,\n#if defined(DUK_USE_ASSERTIONS)\n                                                   duk_size_t entry_callstack_top,\n#endif\n                                                   duk_int_t entry_call_recursion_depth,\n                                                   duk_hthread *entry_curr_thread,\n                                                   duk_instr_t **entry_ptr_curr_pc) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT_CTX_VALID(thr);\n\tDUK_UNREF(idx_retbase);\n\tDUK_UNREF(num_stack_rets);\n\tDUK_UNREF(entry_curr_thread);\n\n\tDUK_ASSERT(thr->callstack_top == entry_callstack_top);\n\n\t/* Restore entry thread executor curr_pc stack frame pointer.\n\t * XXX: would be enough to do in error path only, should nest\n\t * cleanly in success path.\n\t */\n\tthr->ptr_curr_pc = entry_ptr_curr_pc;\n\n\tthr->heap->call_recursion_depth = entry_call_recursion_depth;\n\n\t/* stack discipline consistency check */\n\tDUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets);\n\n\t/* A debugger forced interrupt check is not needed here, as\n\t * problematic safe calls are not caused by side effects.\n\t */\n\n#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)\n\tduk__interrupt_fixup(thr, entry_curr_thread);\n#endif\n}\n\nDUK_INTERNAL duk_int_t duk_handle_safe_call(duk_hthread *thr,\n                                            duk_safe_call_function func,\n                                            void *udata,\n                                            duk_idx_t num_stack_args,\n                                            duk_idx_t num_stack_rets) {\n\tduk_activation *entry_act;\n\tduk_size_t entry_valstack_bottom_byteoff;\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_size_t entry_valstack_end_byteoff;\n\tduk_size_t entry_callstack_top;\n\tduk_size_t entry_callstack_preventcount;\n#endif\n\tduk_int_t entry_call_recursion_depth;\n\tduk_hthread *entry_curr_thread;\n\tduk_uint_fast8_t entry_thread_state;\n\tduk_instr_t **entry_ptr_curr_pc;\n\tduk_jmpbuf *old_jmpbuf_ptr = NULL;\n\tduk_jmpbuf our_jmpbuf;\n\tduk_idx_t idx_retbase;\n\tduk_int_t retval;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(duk_get_top(thr) >= num_stack_args);  /* Caller ensures. */\n\n\tDUK_STATS_INC(thr->heap, stats_safecall_all);\n\n\t/* Value stack reserve handling: safe call assumes caller has reserved\n\t * space for nrets (assuming optimal unwind processing).  Value stack\n\t * reserve is not stored/restored as for normal calls because a safe\n\t * call conceptually happens in the same activation.\n\t */\n\n\t/* Careful with indices like '-x'; if 'x' is zero, it refers to bottom */\n\tentry_act = thr->callstack_curr;\n\tentry_valstack_bottom_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack);\n#if defined(DUK_USE_ASSERTIONS)\n\tentry_valstack_end_byteoff = (duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack);\n\tentry_callstack_top = thr->callstack_top;\n\tentry_callstack_preventcount = thr->callstack_preventcount;\n#endif\n\tentry_call_recursion_depth = thr->heap->call_recursion_depth;\n\tentry_curr_thread = thr->heap->curr_thread;  /* may be NULL if first call */\n\tentry_thread_state = thr->state;\n\tentry_ptr_curr_pc = thr->ptr_curr_pc;  /* may be NULL */\n\tidx_retbase = duk_get_top(thr) - num_stack_args;  /* not a valid stack index if num_stack_args == 0 */\n\tDUK_ASSERT(idx_retbase >= 0);\n\n\tDUK_ASSERT((duk_idx_t) (thr->valstack_top - thr->valstack_bottom) >= num_stack_args);  /* Caller ensures. */\n\tDUK_ASSERT((duk_idx_t) (thr->valstack_end - (thr->valstack_bottom + idx_retbase)) >= num_stack_rets);  /* Caller ensures. */\n\n\t/* Cannot portably debug print a function pointer, hence 'func' not printed! */\n\tDUK_DD(DUK_DDPRINT(\"duk_handle_safe_call: thr=%p, num_stack_args=%ld, num_stack_rets=%ld, \"\n\t                   \"valstack_top=%ld, idx_retbase=%ld, rec_depth=%ld/%ld, \"\n\t                   \"entry_act=%p, entry_valstack_bottom_byteoff=%ld, entry_call_recursion_depth=%ld, \"\n\t                   \"entry_curr_thread=%p, entry_thread_state=%ld\",\n\t                   (void *) thr,\n\t                   (long) num_stack_args,\n\t                   (long) num_stack_rets,\n\t                   (long) duk_get_top(thr),\n\t                   (long) idx_retbase,\n\t                   (long) thr->heap->call_recursion_depth,\n\t                   (long) thr->heap->call_recursion_limit,\n\t                   (void *) entry_act,\n\t                   (long) entry_valstack_bottom_byteoff,\n\t                   (long) entry_call_recursion_depth,\n\t                   (void *) entry_curr_thread,\n\t                   (long) entry_thread_state));\n\n\t/* Setjmp catchpoint setup. */\n\told_jmpbuf_ptr = thr->heap->lj.jmpbuf_ptr;\n\tthr->heap->lj.jmpbuf_ptr = &our_jmpbuf;\n\n\t/* Prevent yields for the duration of the safe call.  This only\n\t * matters if the executor makes safe calls to functions that\n\t * yield, this doesn't currently happen.\n\t */\n\tthr->callstack_preventcount++;\n\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\ttry {\n#else\n\tDUK_ASSERT(thr->heap->lj.jmpbuf_ptr == &our_jmpbuf);\n\tif (DUK_SETJMP(our_jmpbuf.jb) == 0) {\n\t\t/* Success path. */\n#endif\n\t\tDUK_DDD(DUK_DDDPRINT(\"safe_call setjmp catchpoint setup complete\"));\n\n\t\tduk__handle_safe_call_inner(thr,\n\t\t                            func,\n\t\t                            udata,\n#if defined(DUK_USE_ASSERTIONS)\n\t\t                            entry_valstack_bottom_byteoff,\n\t\t                            entry_callstack_top,\n#endif\n\t\t                            entry_curr_thread,\n\t\t                            entry_thread_state,\n\t\t                            idx_retbase,\n\t\t                            num_stack_rets);\n\n\t\tDUK_STATS_INC(thr->heap, stats_safecall_nothrow);\n\n\t\t/* Either pointer may be NULL (at entry), so don't assert */\n\t\tthr->heap->lj.jmpbuf_ptr = old_jmpbuf_ptr;\n\n\t\t/* If calls happen inside the safe call, these are restored by\n\t\t * whatever calls are made.  Reserve cannot decrease.\n\t\t */\n\t\tDUK_ASSERT(thr->callstack_curr == entry_act);\n\t\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);\n\n\t\tretval = DUK_EXEC_SUCCESS;\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\t} catch (duk_internal_exception &exc) {\n\t\tDUK_UNREF(exc);\n#else\n\t} else {\n\t\t/* Error path. */\n#endif\n\t\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);\n\n\t\tDUK_STATS_INC(thr->heap, stats_safecall_throw);\n\n\t\tduk__handle_safe_call_error(thr,\n\t\t                            entry_act,\n#if defined(DUK_USE_ASSERTIONS)\n\t\t                            entry_callstack_top,\n#endif\n\t\t                            entry_curr_thread,\n\t\t                            entry_thread_state,\n\t\t                            idx_retbase,\n\t\t                            num_stack_rets,\n\t\t                            entry_valstack_bottom_byteoff,\n\t\t                            old_jmpbuf_ptr);\n\n\t\tretval = DUK_EXEC_ERROR;\n\t}\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\tcatch (std::exception &exc) {\n\t\tconst char *what = exc.what();\n\t\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);\n\t\tDUK_STATS_INC(thr->heap, stats_safecall_throw);\n\t\tif (!what) {\n\t\t\twhat = \"unknown\";\n\t\t}\n\t\tDUK_D(DUK_DPRINT(\"unexpected c++ std::exception (perhaps thrown by user code)\"));\n\t\ttry {\n\t\t\tDUK_ERROR_FMT1(thr, DUK_ERR_TYPE_ERROR, \"caught invalid c++ std::exception '%s' (perhaps thrown by user code)\", what);\n\t\t} catch (duk_internal_exception exc) {\n\t\t\tDUK_D(DUK_DPRINT(\"caught api error thrown from unexpected c++ std::exception\"));\n\t\t\tDUK_UNREF(exc);\n\t\t\tduk__handle_safe_call_error(thr,\n\t\t\t                            entry_act,\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\t                            entry_callstack_top,\n#endif\n\t\t\t                            entry_curr_thread,\n\t\t\t                            entry_thread_state,\n\t\t\t                            idx_retbase,\n\t\t\t                            num_stack_rets,\n\t\t\t                            entry_valstack_bottom_byteoff,\n\t\t\t                            old_jmpbuf_ptr);\n\t\t\tretval = DUK_EXEC_ERROR;\n\t\t}\n\t} catch (...) {\n\t\tDUK_D(DUK_DPRINT(\"unexpected c++ exception (perhaps thrown by user code)\"));\n\t\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);\n\t\tDUK_STATS_INC(thr->heap, stats_safecall_throw);\n\t\ttry {\n\t\t\tDUK_ERROR_TYPE(thr, \"caught invalid c++ exception (perhaps thrown by user code)\");\n\t\t} catch (duk_internal_exception exc) {\n\t\t\tDUK_D(DUK_DPRINT(\"caught api error thrown from unexpected c++ exception\"));\n\t\t\tDUK_UNREF(exc);\n\t\t\tduk__handle_safe_call_error(thr,\n\t\t\t                            entry_act,\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\t                            entry_callstack_top,\n#endif\n\t\t\t                            entry_curr_thread,\n\t\t\t                            entry_thread_state,\n\t\t\t                            idx_retbase,\n\t\t\t                            num_stack_rets,\n\t\t\t                            entry_valstack_bottom_byteoff,\n\t\t\t                            old_jmpbuf_ptr);\n\t\t\tretval = DUK_EXEC_ERROR;\n\t\t}\n\t}\n#endif\n\n\tDUK_ASSERT(thr->heap->lj.jmpbuf_ptr == old_jmpbuf_ptr);  /* success/error path both do this */\n\n\tDUK_ASSERT_LJSTATE_UNSET(thr->heap);\n\n\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);\n\tduk__handle_safe_call_shared_unwind(thr,\n\t                                    idx_retbase,\n\t                                    num_stack_rets,\n#if defined(DUK_USE_ASSERTIONS)\n\t                                    entry_callstack_top,\n#endif\n\t                                    entry_call_recursion_depth,\n\t                                    entry_curr_thread,\n\t                                    entry_ptr_curr_pc);\n\n\t/* Restore preventcount. */\n\tthr->callstack_preventcount--;\n\tDUK_ASSERT(thr->callstack_preventcount == entry_callstack_preventcount);\n\n\t/* Final asserts. */\n\tDUK_ASSERT(thr->callstack_curr == entry_act);\n\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_bottom - (duk_uint8_t *) thr->valstack) == entry_valstack_bottom_byteoff);\n\tDUK_ASSERT((duk_size_t) ((duk_uint8_t *) thr->valstack_end - (duk_uint8_t *) thr->valstack) >= entry_valstack_end_byteoff);\n\tDUK_ASSERT(thr->callstack_top == entry_callstack_top);\n\tDUK_ASSERT(thr->heap->call_recursion_depth == entry_call_recursion_depth);\n\tDUK_ASSERT(thr->heap->curr_thread == entry_curr_thread);\n\tDUK_ASSERT(thr->state == entry_thread_state);\n\tDUK_ASSERT(thr->ptr_curr_pc == entry_ptr_curr_pc);\n\tDUK_ASSERT(duk_get_top(thr) == idx_retbase + num_stack_rets);\n\tDUK_ASSERT_LJSTATE_UNSET(thr->heap);\n\n\t/* Pending side effects. */\n\tDUK_REFZERO_CHECK_FAST(thr);\n\n\treturn retval;\n}\n\n/*\n *  Property-based call (foo.noSuch()) error setup: replace target function\n *  on stack top with a specially tagged (hidden Symbol) error which gets\n *  thrown in call handling at the proper spot to follow Ecmascript semantics.\n */\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\nDUK_INTERNAL DUK_NOINLINE DUK_COLD void duk_call_setup_propcall_error(duk_hthread *thr, duk_tval *tv_targ, duk_tval *tv_base, duk_tval *tv_key) {\n\tconst char *str1, *str2, *str3;\n\tduk_idx_t entry_top;\n\n\tentry_top = duk_get_top(thr);\n\n\t/* Must stabilize pointers first.  Argument convention is a bit awkward,\n\t * it comes from the executor call site where some arguments may not be\n\t * on the value stack (consts).\n\t */\n\tduk_push_tval(thr, tv_base);\n\tduk_push_tval(thr, tv_key);\n\tduk_push_tval(thr, tv_targ);\n\n\tDUK_GC_TORTURE(thr->heap);\n\n\t/* We only push an error, replacing the call target (at idx_func)\n\t * with the error to ensure side effects come out correctly:\n\t * - Property read\n\t * - Call argument evaluation\n\t * - Callability check and error thrown.\n\t *\n\t * A hidden Symbol on the error object pushed here is used by\n\t * call handling to figure out the error is to be thrown as is.\n\t * It is CRITICAL that the hidden Symbol can never occur on a\n\t * user visible object that may get thrown.\n\t */\n\n#if defined(DUK_USE_PARANOID_ERRORS)\n\tstr1 = duk_get_type_name(thr, -1);\n\tstr2 = duk_get_type_name(thr, -2);\n\tstr3 = duk_get_type_name(thr, -3);\n\tduk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, \"%s not callable (property %s of %s)\", str1, str2, str3);\n#else\n\tstr1 = duk_push_string_readable(thr, -1);\n\tstr2 = duk_push_string_readable(thr, -3);\n\tstr3 = duk_push_string_readable(thr, -5);\n\tduk_push_error_object(thr, DUK_ERR_TYPE_ERROR | DUK_ERRCODE_FLAG_NOBLAME_FILELINE, \"%s not callable (property %s of %s)\", str1, str2, str3);\n#endif\n\n\tduk_push_true(thr);\n\tduk_put_prop_stridx(thr, -2, DUK_STRIDX_INT_TARGET);  /* Marker property, reuse _Target. */\n\n\t/* [ <nregs> propValue <variable> error ] */\n\tduk_replace(thr, entry_top - 1);\n\tduk_set_top(thr, entry_top);\n\n\tDUK_ASSERT(!duk_is_callable(thr, -1));  /* Critical so that call handling will throw the error. */\n}\n#endif  /* DUK_USE_VERBOSE_ERRORS */\n\n/* automatic undefs */\n#undef DUK__AUGMENT_CALL_RELAX_COUNT\n#line 1 \"duk_js_compiler.c\"\n/*\n *  Ecmascript compiler.\n *\n *  Parses an input string and generates a function template result.\n *  Compilation may happen in multiple contexts (global code, eval\n *  code, function code).\n *\n *  The parser uses a traditional top-down recursive parsing for the\n *  statement level, and an operator precedence based top-down approach\n *  for the expression level.  The attempt is to minimize the C stack\n *  depth.  Bytecode is generated directly without an intermediate\n *  representation (tree), at the cost of needing two (and sometimes\n *  three) passes over each function.\n *\n *  The top-down recursive parser functions are named \"duk__parse_XXX\".\n *\n *  Recursion limits are in key functions to prevent arbitrary C recursion:\n *  function body parsing, statement parsing, and expression parsing.\n *\n *  See doc/compiler.rst for discussion on the design.\n *\n *  A few typing notes:\n *\n *    - duk_regconst_t: signed, highest bit set (< 0) means constant,\n *      some call sites use -1 for \"none\" (equivalent to constant 0x7fffffff)\n *    - PC values: duk_int_t, negative values used as markers\n */\n\n/* #include duk_internal.h -> already included */\n\n/* If highest bit of a register number is set, it refers to a constant instead.\n * When interpreted as a signed value, this means const values are always\n * negative (when interpreted as two's complement).  For example DUK__ISREG_TEMP()\n * uses this approach to avoid an explicit DUK__ISREG() check (the condition is\n * logically \"'x' is a register AND 'x' >= temp_first\").\n */\n#define DUK__CONST_MARKER                   DUK_REGCONST_CONST_MARKER\n#define DUK__REMOVECONST(x)                 ((x) & ~DUK__CONST_MARKER)\n#define DUK__ISREG(x)                       ((x) >= 0)\n#define DUK__ISCONST(x)                     ((x) < 0)\n#define DUK__ISREG_TEMP(comp_ctx,x)         ((duk_int32_t) (x) >= (duk_int32_t) ((comp_ctx)->curr_func.temp_first))   /* Check for x >= temp_first && x >= 0 by comparing as signed. */\n#define DUK__ISREG_NOTTEMP(comp_ctx,x)      ((duk_uint32_t) (x) < (duk_uint32_t) ((comp_ctx)->curr_func.temp_first))  /* Check for x >= 0 && x < temp_first by interpreting as unsigned. */\n#define DUK__GETTEMP(comp_ctx)              ((comp_ctx)->curr_func.temp_next)\n#define DUK__SETTEMP(comp_ctx,x)            ((comp_ctx)->curr_func.temp_next = (x))  /* dangerous: must only lower (temp_max not updated) */\n#define DUK__SETTEMP_CHECKMAX(comp_ctx,x)   duk__settemp_checkmax((comp_ctx),(x))\n#define DUK__ALLOCTEMP(comp_ctx)            duk__alloctemp((comp_ctx))\n#define DUK__ALLOCTEMPS(comp_ctx,count)     duk__alloctemps((comp_ctx),(count))\n\n/* Init value set size for array and object literals. */\n#define DUK__MAX_ARRAY_INIT_VALUES        20\n#define DUK__MAX_OBJECT_INIT_PAIRS        10\n\n/* XXX: hack, remove when const lookup is not O(n) */\n#define DUK__GETCONST_MAX_CONSTS_CHECK    256\n\n/* These limits are based on bytecode limits.  Max temps is limited\n * by duk_hcompfunc nargs/nregs fields being 16 bits.\n */\n#define DUK__MAX_CONSTS                   DUK_BC_BC_MAX\n#define DUK__MAX_FUNCS                    DUK_BC_BC_MAX\n#define DUK__MAX_TEMPS                    0xffffL\n\n/* Initial bytecode size allocation. */\n#if defined(DUK_USE_PREFER_SIZE)\n#define DUK__BC_INITIAL_INSTS             16\n#else\n#define DUK__BC_INITIAL_INSTS             256\n#endif\n\n#define DUK__RECURSION_INCREASE(comp_ctx,thr)  do { \\\n\t\tDUK_DDD(DUK_DDDPRINT(\"RECURSION INCREASE: %s:%ld\", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \\\n\t\tduk__comp_recursion_increase((comp_ctx)); \\\n\t} while (0)\n\n#define DUK__RECURSION_DECREASE(comp_ctx,thr)  do { \\\n\t\tDUK_DDD(DUK_DDDPRINT(\"RECURSION DECREASE: %s:%ld\", (const char *) DUK_FILE_MACRO, (long) DUK_LINE_MACRO)); \\\n\t\tduk__comp_recursion_decrease((comp_ctx)); \\\n\t} while (0)\n\n/* Value stack slot limits: these are quite approximate right now, and\n * because they overlap in control flow, some could be eliminated.\n */\n#define DUK__COMPILE_ENTRY_SLOTS          8\n#define DUK__FUNCTION_INIT_REQUIRE_SLOTS  16\n#define DUK__FUNCTION_BODY_REQUIRE_SLOTS  16\n#define DUK__PARSE_STATEMENTS_SLOTS       16\n#define DUK__PARSE_EXPR_SLOTS             16\n\n/* Temporary structure used to pass a stack allocated region through\n * duk_safe_call().\n */\ntypedef struct {\n\tduk_small_uint_t flags;\n\tduk_compiler_ctx comp_ctx_alloc;\n\tduk_lexer_point lex_pt_alloc;\n} duk__compiler_stkstate;\n\n/*\n *  Prototypes\n */\n\n/* lexing */\nDUK_LOCAL_DECL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect);\nDUK_LOCAL_DECL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect);\nDUK_LOCAL_DECL void duk__advance(duk_compiler_ctx *ctx);\n\n/* function helpers */\nDUK_LOCAL_DECL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg);\nDUK_LOCAL_DECL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx);\n\n/* code emission */\nDUK_LOCAL_DECL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc);\nDUK_LOCAL_DECL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins);\nDUK_LOCAL_DECL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op);\nDUK_LOCAL_DECL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c);\nDUK_LOCAL_DECL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b);\nDUK_LOCAL_DECL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c);\n#if 0  /* unused */\nDUK_LOCAL_DECL void duk__emit_a(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a);\nDUK_LOCAL_DECL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b);\n#endif\nDUK_LOCAL_DECL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc);\nDUK_LOCAL_DECL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc);\nDUK_LOCAL_DECL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc);\nDUK_LOCAL_DECL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val);\nDUK_LOCAL_DECL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val);\nDUK_LOCAL_DECL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc);\nDUK_LOCAL_DECL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc);\nDUK_LOCAL_DECL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc);\nDUK_LOCAL_DECL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc);\nDUK_LOCAL_DECL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags);\nDUK_LOCAL_DECL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst);\nDUK_LOCAL_DECL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst);\nDUK_LOCAL_DECL void duk__emit_invalid(duk_compiler_ctx *comp_ctx);\n\n/* ivalue/ispec helpers */\nDUK_LOCAL_DECL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst);\nDUK_LOCAL_DECL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\nDUK_LOCAL_DECL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\nDUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h);\nDUK_LOCAL_DECL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst);\nDUK_LOCAL_DECL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst);\nDUK_LOCAL_DECL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num);\nDUK_LOCAL_DECL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next);\nDUK_LOCAL_DECL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL\nduk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx,\n                                         duk_ispec *x,\n                                         duk_regconst_t forced_reg,\n                                         duk_small_uint_t flags);\nDUK_LOCAL_DECL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg);\nDUK_LOCAL_DECL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg);\nDUK_LOCAL_DECL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\nDUK_LOCAL_DECL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\nDUK_LOCAL_DECL\nduk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx,\n                                          duk_ivalue *x,\n                                          duk_regconst_t forced_reg,\n                                          duk_small_uint_t flags);\nDUK_LOCAL_DECL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\n#if 0  /* unused */\nDUK_LOCAL_DECL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\n#endif\nDUK_LOCAL_DECL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg);\nDUK_LOCAL_DECL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\nDUK_LOCAL_DECL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x);\n\n/* identifier handling */\nDUK_LOCAL_DECL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname);\n\n/* label handling */\nDUK_LOCAL_DECL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id);\nDUK_LOCAL_DECL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags);\nDUK_LOCAL_DECL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest);\nDUK_LOCAL_DECL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len);\n\n/* top-down expression parser */\nDUK_LOCAL_DECL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res);\nDUK_LOCAL_DECL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx);\n\n/* exprtop is the top level variant which resets nud/led counts */\nDUK_LOCAL_DECL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\nDUK_LOCAL_DECL void duk__exprtop(duk_compiler_ctx *ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n\n/* convenience helpers */\n#if 0  /* unused */\nDUK_LOCAL_DECL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#endif\n#if 0  /* unused */\nDUK_LOCAL_DECL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#endif\nDUK_LOCAL_DECL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg);\nDUK_LOCAL_DECL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#if 0  /* unused */\nDUK_LOCAL_DECL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#endif\nDUK_LOCAL_DECL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\nDUK_LOCAL_DECL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\nDUK_LOCAL_DECL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#if 0  /* unused */\nDUK_LOCAL_DECL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#endif\nDUK_LOCAL_DECL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg);\nDUK_LOCAL_DECL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#if 0  /* unused */\nDUK_LOCAL_DECL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags);\n#endif\n\n/* expression parsing helpers */\nDUK_LOCAL_DECL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\n\n/* statement parsing */\nDUK_LOCAL_DECL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname);\nDUK_LOCAL_DECL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags);\nDUK_LOCAL_DECL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);\nDUK_LOCAL_DECL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);\nDUK_LOCAL_DECL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);\nDUK_LOCAL_DECL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site);\nDUK_LOCAL_DECL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res);\nDUK_LOCAL_DECL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem);\nDUK_LOCAL_DECL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id);\nDUK_LOCAL_DECL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof);\n\nDUK_LOCAL_DECL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token);\nDUK_LOCAL_DECL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx);\nDUK_LOCAL_DECL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags);\nDUK_LOCAL_DECL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags);\n\n#define DUK__FUNC_FLAG_DECL            (1 << 0)   /* Parsing a function declaration. */\n#define DUK__FUNC_FLAG_GETSET          (1 << 1)   /* Parsing an object literal getter/setter. */\n#define DUK__FUNC_FLAG_METDEF          (1 << 2)   /* Parsing an object literal method definition shorthand. */\n#define DUK__FUNC_FLAG_PUSHNAME_PASS1  (1 << 3)   /* Push function name when creating template (first pass only). */\n#define DUK__FUNC_FLAG_USE_PREVTOKEN   (1 << 4)   /* Use prev_token to start function parsing (workaround for object literal). */\n\n/*\n *  Parser control values for tokens.  The token table is ordered by the\n *  DUK_TOK_XXX defines.\n *\n *  The binding powers are for lbp() use (i.e. for use in led() context).\n *  Binding powers are positive for typing convenience, and bits at the\n *  top should be reserved for flags.  Binding power step must be higher\n *  than 1 so that binding power \"lbp - 1\" can be used for right associative\n *  operators.  Currently a step of 2 is used (which frees one more bit for\n *  flags).\n */\n\n/* XXX: actually single step levels would work just fine, clean up */\n\n/* binding power \"levels\" (see doc/compiler.rst) */\n#define DUK__BP_INVALID                0             /* always terminates led() */\n#define DUK__BP_EOF                    2\n#define DUK__BP_CLOSING                4             /* token closes expression, e.g. ')', ']' */\n#define DUK__BP_FOR_EXPR               DUK__BP_CLOSING    /* bp to use when parsing a top level Expression */\n#define DUK__BP_COMMA                  6\n#define DUK__BP_ASSIGNMENT             8\n#define DUK__BP_CONDITIONAL            10\n#define DUK__BP_LOR                    12\n#define DUK__BP_LAND                   14\n#define DUK__BP_BOR                    16\n#define DUK__BP_BXOR                   18\n#define DUK__BP_BAND                   20\n#define DUK__BP_EQUALITY               22\n#define DUK__BP_RELATIONAL             24\n#define DUK__BP_SHIFT                  26\n#define DUK__BP_ADDITIVE               28\n#define DUK__BP_MULTIPLICATIVE         30\n#define DUK__BP_EXPONENTIATION         32\n#define DUK__BP_POSTFIX                34\n#define DUK__BP_CALL                   36\n#define DUK__BP_MEMBER                 38\n\n#define DUK__TOKEN_LBP_BP_MASK         0x1f\n#define DUK__TOKEN_LBP_FLAG_NO_REGEXP  (1 << 5)   /* regexp literal must not follow this token */\n#define DUK__TOKEN_LBP_FLAG_TERMINATES (1 << 6)   /* terminates expression; e.g. post-increment/-decrement */\n#define DUK__TOKEN_LBP_FLAG_UNUSED     (1 << 7)   /* unused */\n\n#define DUK__TOKEN_LBP_GET_BP(x)       ((duk_small_uint_t) (((x) & DUK__TOKEN_LBP_BP_MASK) * 2))\n\n#define DUK__MK_LBP(bp)                ((bp) >> 1)    /* bp is assumed to be even */\n#define DUK__MK_LBP_FLAGS(bp,flags)    (((bp) >> 1) | (flags))\n\nDUK_LOCAL const duk_uint8_t duk__token_lbp[] = {\n\tDUK__MK_LBP(DUK__BP_EOF),                                 /* DUK_TOK_EOF */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_IDENTIFIER */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_BREAK */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_CASE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_CATCH */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_CONTINUE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_DEBUGGER */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_DEFAULT */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_DELETE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_DO */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_ELSE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_FINALLY */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_FOR */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_FUNCTION */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_IF */\n\tDUK__MK_LBP(DUK__BP_RELATIONAL),                          /* DUK_TOK_IN */\n\tDUK__MK_LBP(DUK__BP_RELATIONAL),                          /* DUK_TOK_INSTANCEOF */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_NEW */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_RETURN */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_SWITCH */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_THIS */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_THROW */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_TRY */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_TYPEOF */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_VAR */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_CONST */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_VOID */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_WHILE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_WITH */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_CLASS */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_ENUM */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_EXPORT */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_EXTENDS */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_IMPORT */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_SUPER */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_NULL */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_TRUE */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_FALSE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_GET */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_SET */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_IMPLEMENTS */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_INTERFACE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_LET */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_PACKAGE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_PRIVATE */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_PROTECTED */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_PUBLIC */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_STATIC */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_YIELD */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_LCURLY */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_RCURLY */\n\tDUK__MK_LBP(DUK__BP_MEMBER),                              /* DUK_TOK_LBRACKET */\n\tDUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_RBRACKET */\n\tDUK__MK_LBP(DUK__BP_CALL),                                /* DUK_TOK_LPAREN */\n\tDUK__MK_LBP_FLAGS(DUK__BP_CLOSING, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_RPAREN */\n\tDUK__MK_LBP(DUK__BP_MEMBER),                              /* DUK_TOK_PERIOD */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_SEMICOLON */\n\tDUK__MK_LBP(DUK__BP_COMMA),                               /* DUK_TOK_COMMA */\n\tDUK__MK_LBP(DUK__BP_RELATIONAL),                          /* DUK_TOK_LT */\n\tDUK__MK_LBP(DUK__BP_RELATIONAL),                          /* DUK_TOK_GT */\n\tDUK__MK_LBP(DUK__BP_RELATIONAL),                          /* DUK_TOK_LE */\n\tDUK__MK_LBP(DUK__BP_RELATIONAL),                          /* DUK_TOK_GE */\n\tDUK__MK_LBP(DUK__BP_EQUALITY),                            /* DUK_TOK_EQ */\n\tDUK__MK_LBP(DUK__BP_EQUALITY),                            /* DUK_TOK_NEQ */\n\tDUK__MK_LBP(DUK__BP_EQUALITY),                            /* DUK_TOK_SEQ */\n\tDUK__MK_LBP(DUK__BP_EQUALITY),                            /* DUK_TOK_SNEQ */\n\tDUK__MK_LBP(DUK__BP_ADDITIVE),                            /* DUK_TOK_ADD */\n\tDUK__MK_LBP(DUK__BP_ADDITIVE),                            /* DUK_TOK_SUB */\n\tDUK__MK_LBP(DUK__BP_MULTIPLICATIVE),                      /* DUK_TOK_MUL */\n\tDUK__MK_LBP(DUK__BP_MULTIPLICATIVE),                      /* DUK_TOK_DIV */\n\tDUK__MK_LBP(DUK__BP_MULTIPLICATIVE),                      /* DUK_TOK_MOD */\n\tDUK__MK_LBP(DUK__BP_EXPONENTIATION),                      /* DUK_TOK_EXP */\n\tDUK__MK_LBP(DUK__BP_POSTFIX),                             /* DUK_TOK_INCREMENT */\n\tDUK__MK_LBP(DUK__BP_POSTFIX),                             /* DUK_TOK_DECREMENT */\n\tDUK__MK_LBP(DUK__BP_SHIFT),                               /* DUK_TOK_ALSHIFT */\n\tDUK__MK_LBP(DUK__BP_SHIFT),                               /* DUK_TOK_ARSHIFT */\n\tDUK__MK_LBP(DUK__BP_SHIFT),                               /* DUK_TOK_RSHIFT */\n\tDUK__MK_LBP(DUK__BP_BAND),                                /* DUK_TOK_BAND */\n\tDUK__MK_LBP(DUK__BP_BOR),                                 /* DUK_TOK_BOR */\n\tDUK__MK_LBP(DUK__BP_BXOR),                                /* DUK_TOK_BXOR */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_LNOT */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_BNOT */\n\tDUK__MK_LBP(DUK__BP_LAND),                                /* DUK_TOK_LAND */\n\tDUK__MK_LBP(DUK__BP_LOR),                                 /* DUK_TOK_LOR */\n\tDUK__MK_LBP(DUK__BP_CONDITIONAL),                         /* DUK_TOK_QUESTION */\n\tDUK__MK_LBP(DUK__BP_INVALID),                             /* DUK_TOK_COLON */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_EQUALSIGN */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_ADD_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_SUB_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_MUL_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_DIV_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_MOD_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_EXP_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_ALSHIFT_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_ARSHIFT_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_RSHIFT_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_BAND_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_BOR_EQ */\n\tDUK__MK_LBP(DUK__BP_ASSIGNMENT),                          /* DUK_TOK_BXOR_EQ */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_NUMBER */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_STRING */\n\tDUK__MK_LBP_FLAGS(DUK__BP_INVALID, DUK__TOKEN_LBP_FLAG_NO_REGEXP),  /* DUK_TOK_REGEXP */\n};\n\n/*\n *  Misc helpers\n */\n\nDUK_LOCAL void duk__comp_recursion_increase(duk_compiler_ctx *comp_ctx) {\n\tDUK_ASSERT(comp_ctx != NULL);\n\tDUK_ASSERT(comp_ctx->recursion_depth >= 0);\n\tif (comp_ctx->recursion_depth >= comp_ctx->recursion_limit) {\n\t\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_COMPILER_RECURSION_LIMIT);\n\t}\n\tcomp_ctx->recursion_depth++;\n}\n\nDUK_LOCAL void duk__comp_recursion_decrease(duk_compiler_ctx *comp_ctx) {\n\tDUK_ASSERT(comp_ctx != NULL);\n\tDUK_ASSERT(comp_ctx->recursion_depth > 0);\n\tcomp_ctx->recursion_depth--;\n}\n\nDUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments(duk_compiler_ctx *comp_ctx, duk_hstring *h) {\n\tDUK_UNREF(comp_ctx);\n\tDUK_ASSERT(h != NULL);\n\treturn DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h);\n}\n\nDUK_LOCAL duk_bool_t duk__hstring_is_eval_or_arguments_in_strict_mode(duk_compiler_ctx *comp_ctx, duk_hstring *h) {\n\tDUK_ASSERT(h != NULL);\n\treturn (comp_ctx->curr_func.is_strict &&\n\t        DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(h));\n}\n\n/*\n *  Parser duk__advance() token eating functions\n */\n\n/* XXX: valstack handling is awkward.  Add a valstack helper which\n * avoids dup():ing; valstack_copy(src, dst)?\n */\n\nDUK_LOCAL void duk__advance_helper(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_bool_t regexp;\n\n\tDUK_ASSERT_DISABLE(comp_ctx->curr_token.t >= 0);  /* unsigned */\n\tDUK_ASSERT(comp_ctx->curr_token.t <= DUK_TOK_MAXVAL);  /* MAXVAL is inclusive */\n\n\t/*\n\t *  Use current token to decide whether a RegExp can follow.\n\t *\n\t *  We can use either 't' or 't_nores'; the latter would not\n\t *  recognize keywords.  Some keywords can be followed by a\n\t *  RegExp (e.g. \"return\"), so using 't' is better.  This is\n\t *  not trivial, see doc/compiler.rst.\n\t */\n\n\tregexp = 1;\n\tif (duk__token_lbp[comp_ctx->curr_token.t] & DUK__TOKEN_LBP_FLAG_NO_REGEXP) {\n\t\tregexp = 0;\n\t}\n\tif (comp_ctx->curr_func.reject_regexp_in_adv) {\n\t\tcomp_ctx->curr_func.reject_regexp_in_adv = 0;\n\t\tregexp = 0;\n\t}\n\n\tif (expect >= 0 && comp_ctx->curr_token.t != (duk_small_uint_t) expect) {\n\t\tDUK_D(DUK_DPRINT(\"parse error: expect=%ld, got=%ld\",\n\t\t                 (long) expect, (long) comp_ctx->curr_token.t));\n\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR);\n\t}\n\n\t/* make current token the previous; need to fiddle with valstack \"backing store\" */\n\tDUK_MEMCPY(&comp_ctx->prev_token, &comp_ctx->curr_token, sizeof(duk_token));\n\tduk_copy(thr, comp_ctx->tok11_idx, comp_ctx->tok21_idx);\n\tduk_copy(thr, comp_ctx->tok12_idx, comp_ctx->tok22_idx);\n\n\t/* parse new token */\n\tduk_lexer_parse_js_input_element(&comp_ctx->lex,\n\t                                 &comp_ctx->curr_token,\n\t                                 comp_ctx->curr_func.is_strict,\n\t                                 regexp);\n\n\tDUK_DDD(DUK_DDDPRINT(\"advance: curr: tok=%ld/%ld,%ld,term=%ld,%!T,%!T \"\n\t                     \"prev: tok=%ld/%ld,%ld,term=%ld,%!T,%!T\",\n\t                     (long) comp_ctx->curr_token.t,\n\t                     (long) comp_ctx->curr_token.t_nores,\n\t                     (long) comp_ctx->curr_token.start_line,\n\t                     (long) comp_ctx->curr_token.lineterm,\n\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->tok11_idx),\n\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->tok12_idx),\n\t                     (long) comp_ctx->prev_token.t,\n\t                     (long) comp_ctx->prev_token.t_nores,\n\t                     (long) comp_ctx->prev_token.start_line,\n\t                     (long) comp_ctx->prev_token.lineterm,\n\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->tok21_idx),\n\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->tok22_idx)));\n}\n\n/* advance, expecting current token to be a specific token; parse next token in regexp context */\nDUK_LOCAL void duk__advance_expect(duk_compiler_ctx *comp_ctx, duk_small_int_t expect) {\n\tduk__advance_helper(comp_ctx, expect);\n}\n\n/* advance, whatever the current token is; parse next token in regexp context */\nDUK_LOCAL void duk__advance(duk_compiler_ctx *comp_ctx) {\n\tduk__advance_helper(comp_ctx, -1);\n}\n\n/*\n *  Helpers for duk_compiler_func.\n */\n\n/* init function state: inits valstack allocations */\nDUK_LOCAL void duk__init_func_valstack_slots(duk_compiler_ctx *comp_ctx) {\n\tduk_compiler_func *func = &comp_ctx->curr_func;\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_idx_t entry_top;\n\n\tentry_top = duk_get_top(thr);\n\n\tDUK_MEMZERO(func, sizeof(*func));  /* intentional overlap with earlier memzero */\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tfunc->h_name = NULL;\n\tfunc->h_consts = NULL;\n\tfunc->h_funcs = NULL;\n\tfunc->h_decls = NULL;\n\tfunc->h_labelnames = NULL;\n\tfunc->h_labelinfos = NULL;\n\tfunc->h_argnames = NULL;\n\tfunc->h_varmap = NULL;\n#endif\n\n\tduk_require_stack(thr, DUK__FUNCTION_INIT_REQUIRE_SLOTS);\n\n\tDUK_BW_INIT_PUSHBUF(thr, &func->bw_code, DUK__BC_INITIAL_INSTS * sizeof(duk_compiler_instr));\n\t/* code_idx = entry_top + 0 */\n\n\tduk_push_array(thr);\n\tfunc->consts_idx = entry_top + 1;\n\tfunc->h_consts = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 1);\n\tDUK_ASSERT(func->h_consts != NULL);\n\n\tduk_push_array(thr);\n\tfunc->funcs_idx = entry_top + 2;\n\tfunc->h_funcs = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 2);\n\tDUK_ASSERT(func->h_funcs != NULL);\n\tDUK_ASSERT(func->fnum_next == 0);\n\n\tduk_push_array(thr);\n\tfunc->decls_idx = entry_top + 3;\n\tfunc->h_decls = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 3);\n\tDUK_ASSERT(func->h_decls != NULL);\n\n\tduk_push_array(thr);\n\tfunc->labelnames_idx = entry_top + 4;\n\tfunc->h_labelnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 4);\n\tDUK_ASSERT(func->h_labelnames != NULL);\n\n\tduk_push_dynamic_buffer(thr, 0);\n\tfunc->labelinfos_idx = entry_top + 5;\n\tfunc->h_labelinfos = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 5);\n\tDUK_ASSERT(func->h_labelinfos != NULL);\n\tDUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(func->h_labelinfos) && !DUK_HBUFFER_HAS_EXTERNAL(func->h_labelinfos));\n\n\tduk_push_array(thr);\n\tfunc->argnames_idx = entry_top + 6;\n\tfunc->h_argnames = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 6);\n\tDUK_ASSERT(func->h_argnames != NULL);\n\n\tduk_push_bare_object(thr);\n\tfunc->varmap_idx = entry_top + 7;\n\tfunc->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, entry_top + 7);\n\tDUK_ASSERT(func->h_varmap != NULL);\n}\n\n/* reset function state (prepare for pass 2) */\nDUK_LOCAL void duk__reset_func_for_pass2(duk_compiler_ctx *comp_ctx) {\n\tduk_compiler_func *func = &comp_ctx->curr_func;\n\tduk_hthread *thr = comp_ctx->thr;\n\n\t/* reset bytecode buffer but keep current size; pass 2 will\n\t * require same amount or more.\n\t */\n\tDUK_BW_RESET_SIZE(thr, &func->bw_code);\n\n\tduk_set_length(thr, func->consts_idx, 0);\n\t/* keep func->h_funcs; inner functions are not reparsed to avoid O(depth^2) parsing */\n\tfunc->fnum_next = 0;\n\t/* duk_set_length(thr, func->funcs_idx, 0); */\n\tduk_set_length(thr, func->labelnames_idx, 0);\n\tduk_hbuffer_reset(thr, func->h_labelinfos);\n\t/* keep func->h_argnames; it is fixed for all passes */\n\n\t/* truncated in case pass 3 needed */\n\tduk_push_bare_object(thr);\n\tduk_replace(thr, func->varmap_idx);\n\tfunc->h_varmap = DUK_GET_HOBJECT_POSIDX(thr, func->varmap_idx);\n\tDUK_ASSERT(func->h_varmap != NULL);\n}\n\n/* cleanup varmap from any null entries, compact it, etc; returns number\n * of final entries after cleanup.\n */\nDUK_LOCAL duk_int_t duk__cleanup_varmap(duk_compiler_ctx *comp_ctx) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_hobject *h_varmap;\n\tduk_hstring *h_key;\n\tduk_tval *tv;\n\tduk_uint32_t i, e_next;\n\tduk_int_t ret;\n\n\t/* [ ... varmap ] */\n\n\th_varmap = DUK_GET_HOBJECT_NEGIDX(thr, -1);\n\tDUK_ASSERT(h_varmap != NULL);\n\n\tret = 0;\n\te_next = DUK_HOBJECT_GET_ENEXT(h_varmap);\n\tfor (i = 0; i < e_next; i++) {\n\t\th_key = DUK_HOBJECT_E_GET_KEY(thr->heap, h_varmap, i);\n\t\tif (!h_key) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tDUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h_varmap, i));\n\n\t\t/* The entries can either be register numbers or 'null' values.\n\t\t * Thus, no need to DECREF them and get side effects.  DECREF'ing\n\t\t * the keys (strings) can cause memory to be freed but no side\n\t\t * effects as strings don't have finalizers.  This is why we can\n\t\t * rely on the object properties not changing from underneath us.\n\t\t */\n\n\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h_varmap, i);\n\t\tif (!DUK_TVAL_IS_NUMBER(tv)) {\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv));\n\t\t\tDUK_HOBJECT_E_SET_KEY(thr->heap, h_varmap, i, NULL);\n\t\t\tDUK_HSTRING_DECREF(thr, h_key);\n\t\t\t/* when key is NULL, value is garbage so no need to set */\n\t\t} else {\n\t\t\tret++;\n\t\t}\n\t}\n\n\tduk_compact_m1(thr);\n\n\treturn ret;\n}\n\n/* Convert duk_compiler_func into a function template, leaving the result\n * on top of stack.\n */\n/* XXX: awkward and bloated asm -- use faster internal accesses */\nDUK_LOCAL void duk__convert_to_func_template(duk_compiler_ctx *comp_ctx) {\n\tduk_compiler_func *func = &comp_ctx->curr_func;\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_hcompfunc *h_res;\n\tduk_hbuffer_fixed *h_data;\n\tduk_size_t consts_count;\n\tduk_size_t funcs_count;\n\tduk_size_t code_count;\n\tduk_size_t code_size;\n\tduk_size_t data_size;\n\tduk_size_t i;\n\tduk_tval *p_const;\n\tduk_hobject **p_func;\n\tduk_instr_t *p_instr;\n\tduk_compiler_instr *q_instr;\n\tduk_tval *tv;\n\tduk_bool_t keep_varmap;\n\tduk_bool_t keep_formals;\n#if !defined(DUK_USE_DEBUGGER_SUPPORT)\n\tduk_size_t formals_length;\n#endif\n\n\tDUK_DDD(DUK_DDDPRINT(\"converting duk_compiler_func to function/template\"));\n\n\t/*\n\t *  Push result object and init its flags\n\t */\n\n\t/* Valstack should suffice here, required on function valstack init */\n\n\th_res = duk_push_hcompfunc(thr);\n\tDUK_ASSERT(h_res != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_res) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) h_res, NULL);  /* Function templates are \"bare objects\". */\n\n\tif (func->is_function) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"function -> set NEWENV\"));\n\t\tDUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res);\n\n\t\tif (!func->is_arguments_shadowed) {\n\t\t\t/* arguments object would be accessible; note that shadowing\n\t\t\t * bindings are arguments or function declarations, neither\n\t\t\t * of which are deletable, so this is safe.\n\t\t\t */\n\n\t\t\tif (func->id_access_arguments || func->may_direct_eval) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"function may access 'arguments' object directly or \"\n\t\t\t\t                     \"indirectly -> set CREATEARGS\"));\n\t\t\t\tDUK_HOBJECT_SET_CREATEARGS((duk_hobject *) h_res);\n\t\t\t}\n\t\t}\n\t} else if (func->is_eval && func->is_strict) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"strict eval code -> set NEWENV\"));\n\t\tDUK_HOBJECT_SET_NEWENV((duk_hobject *) h_res);\n\t} else {\n\t\t/* non-strict eval: env is caller's env or global env (direct vs. indirect call)\n\t\t * global code: env is is global env\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"non-strict eval code or global code -> no NEWENV\"));\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) h_res));\n\t}\n\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\tif (func->is_function && func->is_namebinding && func->h_name != NULL) {\n\t\t/* Object literal set/get functions have a name (property\n\t\t * name) but must not have a lexical name binding, see\n\t\t * test-bug-getset-func-name.js.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"function expression with a name -> set NAMEBINDING\"));\n\t\tDUK_HOBJECT_SET_NAMEBINDING((duk_hobject *) h_res);\n\t}\n#endif\n\n\tif (func->is_strict) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"function is strict -> set STRICT\"));\n\t\tDUK_HOBJECT_SET_STRICT((duk_hobject *) h_res);\n\t}\n\n\tif (func->is_notail) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"function is notail -> set NOTAIL\"));\n\t\tDUK_HOBJECT_SET_NOTAIL((duk_hobject *) h_res);\n\t}\n\n\tif (func->is_constructable) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"function is constructable -> set CONSTRUCTABLE\"));\n\t\tDUK_HOBJECT_SET_CONSTRUCTABLE((duk_hobject *) h_res);\n\t}\n\n\t/*\n\t *  Build function fixed size 'data' buffer, which contains bytecode,\n\t *  constants, and inner function references.\n\t *\n\t *  During the building phase 'data' is reachable but incomplete.\n\t *  Only incref's occur during building (no refzero or GC happens),\n\t *  so the building process is atomic.\n\t */\n\n\tconsts_count = duk_hobject_get_length(thr, func->h_consts);\n\tfuncs_count = duk_hobject_get_length(thr, func->h_funcs) / 3;\n\tcode_count = DUK_BW_GET_SIZE(thr, &func->bw_code) / sizeof(duk_compiler_instr);\n\tcode_size = code_count * sizeof(duk_instr_t);\n\n\tdata_size = consts_count * sizeof(duk_tval) +\n\t            funcs_count * sizeof(duk_hobject *) +\n\t            code_size;\n\n\tDUK_DDD(DUK_DDDPRINT(\"consts_count=%ld, funcs_count=%ld, code_size=%ld -> \"\n\t                     \"data_size=%ld*%ld + %ld*%ld + %ld = %ld\",\n\t                     (long) consts_count, (long) funcs_count, (long) code_size,\n\t                     (long) consts_count, (long) sizeof(duk_tval),\n\t                     (long) funcs_count, (long) sizeof(duk_hobject *),\n\t                     (long) code_size, (long) data_size));\n\n\tduk_push_fixed_buffer_nozero(thr, data_size);\n\th_data = (duk_hbuffer_fixed *) duk_known_hbuffer(thr, -1);\n\n\tDUK_HCOMPFUNC_SET_DATA(thr->heap, h_res, (duk_hbuffer *) h_data);\n\tDUK_HEAPHDR_INCREF(thr, h_data);\n\n\tp_const = (duk_tval *) (void *) DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data);\n\tfor (i = 0; i < consts_count; i++) {\n\t\tDUK_ASSERT(i <= DUK_UARRIDX_MAX);  /* const limits */\n\t\ttv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_consts, (duk_uarridx_t) i);\n\t\tDUK_ASSERT(tv != NULL);\n\t\tDUK_TVAL_SET_TVAL(p_const, tv);\n\t\tp_const++;\n\t\tDUK_TVAL_INCREF(thr, tv);  /* may be a string constant */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"constant: %!T\", (duk_tval *) tv));\n\t}\n\n\tp_func = (duk_hobject **) p_const;\n\tDUK_HCOMPFUNC_SET_FUNCS(thr->heap, h_res, p_func);\n\tfor (i = 0; i < funcs_count; i++) {\n\t\tduk_hobject *h;\n\t\tDUK_ASSERT(i * 3 <= DUK_UARRIDX_MAX);  /* func limits */\n\t\ttv = duk_hobject_find_existing_array_entry_tval_ptr(thr->heap, func->h_funcs, (duk_uarridx_t) (i * 3));\n\t\tDUK_ASSERT(tv != NULL);\n\t\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));\n\t\th = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(h));\n\t\t*p_func++ = h;\n\t\tDUK_HOBJECT_INCREF(thr, h);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"inner function: %p -> %!iO\",\n\t\t                     (void *) h, (duk_heaphdr *) h));\n\t}\n\n\tp_instr = (duk_instr_t *) p_func;\n\tDUK_HCOMPFUNC_SET_BYTECODE(thr->heap, h_res, p_instr);\n\n\t/* copy bytecode instructions one at a time */\n\tq_instr = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(thr, &func->bw_code);\n\tfor (i = 0; i < code_count; i++) {\n\t\tp_instr[i] = q_instr[i].ins;\n\t}\n\t/* Note: 'q_instr' is still used below */\n\n\tDUK_ASSERT((duk_uint8_t *) (p_instr + code_count) == DUK_HBUFFER_FIXED_GET_DATA_PTR(thr->heap, h_data) + data_size);\n\n\tduk_pop(thr);  /* 'data' (and everything in it) is reachable through h_res now */\n\n\t/*\n\t *  Init non-property result fields\n\t *\n\t *  'nregs' controls how large a register frame is allocated.\n\t *\n\t *  'nargs' controls how many formal arguments are written to registers:\n\t *  r0, ... r(nargs-1).  The remaining registers are initialized to\n\t *  undefined.\n\t */\n\n\tDUK_ASSERT(func->temp_max >= 0);\n\th_res->nregs = (duk_uint16_t) func->temp_max;\n\th_res->nargs = (duk_uint16_t) duk_hobject_get_length(thr, func->h_argnames);\n\tDUK_ASSERT(h_res->nregs >= h_res->nargs);  /* pass2 allocation handles this */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\th_res->start_line = (duk_uint32_t) func->min_line;\n\th_res->end_line = (duk_uint32_t) func->max_line;\n#endif\n\n\t/*\n\t *  Init object properties\n\t *\n\t *  Properties should be added in decreasing order of access frequency.\n\t *  (Not very critical for function templates.)\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"init function properties\"));\n\n\t/* [ ... res ] */\n\n\t/* _Varmap: omitted if function is guaranteed not to do a slow path\n\t * identifier access that might be caught by locally declared variables.\n\t * The varmap can also be omitted if it turns out empty of actual\n\t * register mappings after a cleanup.  When debugging is enabled, we\n\t * always need the varmap to be able to lookup variables at any point.\n\t */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tDUK_DD(DUK_DDPRINT(\"keeping _Varmap because debugger support is enabled\"));\n\tkeep_varmap = 1;\n#else\n\tif (func->id_access_slow_own ||   /* directly uses slow accesses that may match own variables */\n\t    func->id_access_arguments ||  /* accesses 'arguments' directly */\n\t    func->may_direct_eval ||      /* may indirectly slow access through a direct eval */\n\t    funcs_count > 0) {            /* has inner functions which may slow access (XXX: this can be optimized by looking at the inner functions) */\n\t\tDUK_DD(DUK_DDPRINT(\"keeping _Varmap because of direct eval, slow path access that may match local variables, or presence of inner functions\"));\n\t\tkeep_varmap = 1;\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"dropping _Varmap\"));\n\t\tkeep_varmap = 0;\n\t}\n#endif\n\n\tif (keep_varmap) {\n\t\tduk_int_t num_used;\n\t\tduk_dup(thr, func->varmap_idx);\n\t\tnum_used = duk__cleanup_varmap(comp_ctx);\n\t\tDUK_DDD(DUK_DDDPRINT(\"cleaned up varmap: %!T (num_used=%ld)\",\n\t\t                     (duk_tval *) duk_get_tval(thr, -1), (long) num_used));\n\n\t\tif (num_used > 0) {\n\t\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE);\n\t\t} else {\n\t\t\tDUK_DD(DUK_DDPRINT(\"varmap is empty after cleanup -> no need to add\"));\n\t\t\tduk_pop(thr);\n\t\t}\n\t}\n\n\t/* _Formals: omitted if function is guaranteed not to need a (non-strict)\n\t * arguments object, and _Formals.length matches nargs exactly.\n\t *\n\t * Non-arrow functions can't see an outer function's 'argument' binding\n\t * (because they have their own), but arrow functions can.  When arrow\n\t * functions are added, this condition would need to be added:\n\t *     inner_arrow_funcs_count > 0   inner arrow functions may access 'arguments'\n\t */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tDUK_DD(DUK_DDPRINT(\"keeping _Formals because debugger support is enabled\"));\n\tkeep_formals = 1;\n#else\n\tformals_length = duk_get_length(thr, func->argnames_idx);\n\tif (formals_length != (duk_size_t) h_res->nargs) {\n\t\t/* Nargs not enough for closure .length: keep _Formals regardless\n\t\t * of its length.  Shouldn't happen in practice at the moment.\n\t\t */\n\t\tDUK_DD(DUK_DDPRINT(\"keeping _Formals because _Formals.length != nargs\"));\n\t\tkeep_formals = 1;\n\t} else if ((func->id_access_arguments || func->may_direct_eval) &&\n\t           (formals_length > 0)) {\n\t\t/* Direct eval (may access 'arguments') or accesses 'arguments'\n\t\t * explicitly: keep _Formals unless it is zero length.\n\t\t */\n\t\tDUK_DD(DUK_DDPRINT(\"keeping _Formals because of direct eval or explicit access to 'arguments', and _Formals.length != 0\"));\n\t\tkeep_formals = 1;\n\t} else {\n\t\tDUK_DD(DUK_DDPRINT(\"omitting _Formals, nargs matches _Formals.length, so no properties added\"));\n\t\tkeep_formals = 0;\n\t}\n#endif\n\n\tif (keep_formals) {\n\t\tduk_dup(thr, func->argnames_idx);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE);\n\t}\n\n\t/* name */\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\tif (func->h_name) {\n\t\tduk_push_hstring(thr, func->h_name);\n\t\tDUK_DD(DUK_DDPRINT(\"setting function template .name to %!T\", duk_get_tval(thr, -1)));\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_NONE);\n\t}\n#endif  /* DUK_USE_FUNC_NAME_PROPERTY */\n\n\t/* _Source */\n#if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY)\n\tif (0) {\n\t\t/* XXX: Currently function source code is not stored, as it is not\n\t\t * required by the standard.  Source code should not be stored by\n\t\t * default (user should enable it explicitly), and the source should\n\t\t * probably be compressed with a trivial text compressor; average\n\t\t * compression of 20-30% is quite easy to achieve even with a trivial\n\t\t * compressor (RLE + backwards lookup).\n\t\t *\n\t\t * Debugging needs source code to be useful: sometimes input code is\n\t\t * not found in files as it may be generated and then eval()'d, given\n\t\t * by dynamic C code, etc.\n\t\t *\n\t\t * Other issues:\n\t\t *\n\t\t *   - Need tokenizer indices for start and end to substring\n\t\t *   - Always normalize function declaration part?\n\t\t *   - If we keep _Formals, only need to store body\n\t\t */\n\n\t\t/*\n\t\t *  For global or eval code this is straightforward.  For functions\n\t\t *  created with the Function constructor we only get the source for\n\t\t *  the body and must manufacture the \"function ...\" part.\n\t\t *\n\t\t *  For instance, for constructed functions (v8):\n\t\t *\n\t\t *    > a = new Function(\"foo\", \"bar\", \"print(foo)\");\n\t\t *    [Function]\n\t\t *    > a.toString()\n\t\t *    'function anonymous(foo,bar) {\\nprint(foo)\\n}'\n\t\t *\n\t\t *  Similarly for e.g. getters (v8):\n\t\t *\n\t\t *    > x = { get a(foo,bar) { print(foo); } }\n\t\t *    { a: [Getter] }\n\t\t *    > Object.getOwnPropertyDescriptor(x, 'a').get.toString()\n\t\t *    'function a(foo,bar) { print(foo); }'\n\t\t */\n\n#if 0\n\t\tduk_push_string(thr, \"XXX\");\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE);\n#endif\n\t}\n#endif  /* DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY */\n\n\t/* _Pc2line */\n#if defined(DUK_USE_PC2LINE)\n\tif (1) {\n\t\t/*\n\t\t *  Size-optimized pc->line mapping.\n\t\t */\n\n\t\tDUK_ASSERT(code_count <= DUK_COMPILER_MAX_BYTECODE_LENGTH);\n\t\tduk_hobject_pc2line_pack(thr, q_instr, (duk_uint_fast32_t) code_count);  /* -> pushes fixed buffer */\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_NONE);\n\n\t\t/* XXX: if assertions enabled, walk through all valid PCs\n\t\t * and check line mapping.\n\t\t */\n\t}\n#endif  /* DUK_USE_PC2LINE */\n\n\t/* fileName */\n#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)\n\tif (comp_ctx->h_filename) {\n\t\t/*\n\t\t *  Source filename (or equivalent), for identifying thrown errors.\n\t\t */\n\n\t\tduk_push_hstring(thr, comp_ctx->h_filename);\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_NONE);\n\t}\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"converted function: %!ixT\",\n\t                   (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/*\n\t *  Compact the function template.\n\t */\n\n\tduk_compact_m1(thr);\n\n\t/*\n\t *  Debug dumping\n\t */\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n\t{\n\t\tduk_hcompfunc *h;\n\t\tduk_instr_t *p, *p_start, *p_end;\n\n\t\th = (duk_hcompfunc *) duk_get_hobject(thr, -1);\n\t\tp_start = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, h);\n\t\tp_end = (duk_instr_t *) DUK_HCOMPFUNC_GET_CODE_END(thr->heap, h);\n\n\t\tp = p_start;\n\t\twhile (p < p_end) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"BC %04ld: %!I        ; 0x%08lx op=%ld (%!C) a=%ld b=%ld c=%ld\",\n\t\t\t                     (long) (p - p_start),\n\t\t\t                     (duk_instr_t) (*p),\n\t\t\t                     (unsigned long) (*p),\n\t\t\t                     (long) DUK_DEC_OP(*p),\n\t\t\t                     (long) DUK_DEC_OP(*p),\n\t\t\t                     (long) DUK_DEC_A(*p),\n\t\t\t                     (long) DUK_DEC_B(*p),\n\t\t\t                     (long) DUK_DEC_C(*p)));\n\t\t\tp++;\n\t\t}\n\t}\n#endif\n}\n\n/*\n *  Code emission helpers\n *\n *  Some emission helpers understand the range of target and source reg/const\n *  values and automatically emit shuffling code if necessary.  This is the\n *  case when the slot in question (A, B, C) is used in the standard way and\n *  for opcodes the emission helpers explicitly understand (like DUK_OP_MPUTOBJ).\n *\n *  The standard way is that:\n *    - slot A is a target register\n *    - slot B is a source register/constant\n *    - slot C is a source register/constant\n *\n *  If a slot is used in a non-standard way the caller must indicate this\n *  somehow.  If a slot is used as a target instead of a source (or vice\n *  versa), this can be indicated with a flag to trigger proper shuffling\n *  (e.g. DUK__EMIT_FLAG_B_IS_TARGET).  If the value in the slot is not\n *  register/const related at all, the caller must ensure that the raw value\n *  fits into the corresponding slot so as to not trigger shuffling.  The\n *  caller must set a \"no shuffle\" flag to ensure compilation fails if\n *  shuffling were to be triggered because of an internal error.\n *\n *  For slots B and C the raw slot size is 9 bits but one bit is reserved for\n *  the reg/const indicator.  To use the full 9-bit range for a raw value,\n *  shuffling must be disabled with the DUK__EMIT_FLAG_NO_SHUFFLE_{B,C} flag.\n *  Shuffling is only done for A, B, and C slots, not the larger BC or ABC slots.\n *\n *  There is call handling specific understanding in the A-B-C emitter to\n *  convert call setup and call instructions into indirect ones if necessary.\n */\n\n/* Code emission flags, passed in the 'opcode' field.  Opcode + flags\n * fit into 16 bits for now, so use duk_small_uint_t.\n */\n#define DUK__EMIT_FLAG_NO_SHUFFLE_A      (1 << 8)\n#define DUK__EMIT_FLAG_NO_SHUFFLE_B      (1 << 9)\n#define DUK__EMIT_FLAG_NO_SHUFFLE_C      (1 << 10)\n#define DUK__EMIT_FLAG_A_IS_SOURCE       (1 << 11)  /* slot A is a source (default: target) */\n#define DUK__EMIT_FLAG_B_IS_TARGET       (1 << 12)  /* slot B is a target (default: source) */\n#define DUK__EMIT_FLAG_C_IS_TARGET       (1 << 13)  /* slot C is a target (default: source) */\n#define DUK__EMIT_FLAG_BC_REGCONST       (1 << 14)  /* slots B and C are reg/const */\n#define DUK__EMIT_FLAG_RESERVE_JUMPSLOT  (1 << 15)  /* reserve a jumpslot after instr before target spilling, used for NEXTENUM */\n\n/* XXX: macro smaller than call? */\nDUK_LOCAL duk_int_t duk__get_current_pc(duk_compiler_ctx *comp_ctx) {\n\tduk_compiler_func *func;\n\tfunc = &comp_ctx->curr_func;\n\treturn (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &func->bw_code) / sizeof(duk_compiler_instr));\n}\n\nDUK_LOCAL duk_compiler_instr *duk__get_instr_ptr(duk_compiler_ctx *comp_ctx, duk_int_t pc) {\n\tDUK_ASSERT(pc >= 0);\n\tDUK_ASSERT((duk_size_t) pc < (duk_size_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr)));\n\treturn ((duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code)) + pc;\n}\n\n/* emit instruction; could return PC but that's not needed in the majority\n * of cases.\n */\nDUK_LOCAL void duk__emit(duk_compiler_ctx *comp_ctx, duk_instr_t ins) {\n#if defined(DUK_USE_PC2LINE)\n\tduk_int_t line;\n#endif\n\tduk_compiler_instr *instr;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__emit: 0x%08lx curr_token.start_line=%ld prev_token.start_line=%ld pc=%ld --> %!I\",\n\t                     (unsigned long) ins,\n\t                     (long) comp_ctx->curr_token.start_line,\n\t                     (long) comp_ctx->prev_token.start_line,\n\t                     (long) duk__get_current_pc(comp_ctx),\n\t                     (duk_instr_t) ins));\n\n\tinstr = (duk_compiler_instr *) (void *) DUK_BW_ENSURE_GETPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr));\n\tDUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr));\n\n#if defined(DUK_USE_PC2LINE)\n\t/* The line number tracking is a bit inconsistent right now, which\n\t * affects debugger accuracy.  Mostly call sites emit opcodes when\n\t * they have parsed a token (say a terminating semicolon) and called\n\t * duk__advance().  In this case the line number of the previous\n\t * token is the most accurate one (except in prologue where\n\t * prev_token.start_line is 0).  This is probably not 100% correct\n\t * right now.\n\t */\n\t/* approximation, close enough */\n\tline = comp_ctx->prev_token.start_line;\n\tif (line == 0) {\n\t\tline = comp_ctx->curr_token.start_line;\n\t}\n#endif\n\n\tinstr->ins = ins;\n#if defined(DUK_USE_PC2LINE)\n\tinstr->line = (duk_uint32_t) line;\n#endif\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tif (line < comp_ctx->curr_func.min_line) {\n\t\tcomp_ctx->curr_func.min_line = line;\n\t}\n\tif (line > comp_ctx->curr_func.max_line) {\n\t\tcomp_ctx->curr_func.max_line = line;\n\t}\n#endif\n\n\t/* Limit checks for bytecode byte size and line number. */\n\tif (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) {\n\t\tgoto fail_bc_limit;\n\t}\n#if defined(DUK_USE_PC2LINE) && defined(DUK_USE_ESBC_LIMITS)\n#if defined(DUK_USE_BUFLEN16)\n\t/* Buffer length is bounded to 0xffff automatically, avoid compile warning. */\n\tif (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) {\n\t\tgoto fail_bc_limit;\n\t}\n#else\n\tif (DUK_UNLIKELY(line > DUK_USE_ESBC_MAX_LINENUMBER)) {\n\t\tgoto fail_bc_limit;\n\t}\n#endif\n#endif\n\n\treturn;\n\n  fail_bc_limit:\n\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT);\n}\n\n/* Update function min/max line from current token.  Needed to improve\n * function line range information for debugging, so that e.g. opening\n * curly brace is covered by line range even when no opcodes are emitted\n * for the line containing the brace.\n */\nDUK_LOCAL void duk__update_lineinfo_currtoken(duk_compiler_ctx *comp_ctx) {\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tduk_int_t line;\n\n\tline = comp_ctx->curr_token.start_line;\n\tif (line == 0) {\n\t\treturn;\n\t}\n\tif (line < comp_ctx->curr_func.min_line) {\n\t\tcomp_ctx->curr_func.min_line = line;\n\t}\n\tif (line > comp_ctx->curr_func.max_line) {\n\t\tcomp_ctx->curr_func.max_line = line;\n\t}\n#else\n\tDUK_UNREF(comp_ctx);\n#endif\n}\n\nDUK_LOCAL void duk__emit_op_only(duk_compiler_ctx *comp_ctx, duk_small_uint_t op) {\n\tduk__emit(comp_ctx, DUK_ENC_OP_ABC(op, 0));\n}\n\n/* Important main primitive. */\nDUK_LOCAL void duk__emit_a_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b, duk_regconst_t c) {\n\tduk_instr_t ins = 0;\n\tduk_int_t a_out = -1;\n\tduk_int_t b_out = -1;\n\tduk_int_t c_out = -1;\n\tduk_int_t tmp;\n\tduk_small_uint_t op = op_flags & 0xffU;\n\n\tDUK_DDD(DUK_DDDPRINT(\"emit: op_flags=%04lx, a=%ld, b=%ld, c=%ld\",\n\t                     (unsigned long) op_flags, (long) a, (long) b, (long) c));\n\n\t/* We could rely on max temp/const checks: if they don't exceed BC\n\t * limit, nothing here can either (just asserts would be enough).\n\t * Currently we check for the limits, which provides additional\n\t * protection against creating invalid bytecode due to compiler\n\t * bugs.\n\t */\n\n\tDUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN);  /* unsigned */\n\tDUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX);\n\tDUK_ASSERT(DUK__ISREG(a));\n\tDUK_ASSERT(b != -1);  /* Not 'none'. */\n\tDUK_ASSERT(c != -1);  /* Not 'none'. */\n\n\t/* Input shuffling happens before the actual operation, while output\n\t * shuffling happens afterwards.  Output shuffling decisions are still\n\t * made at the same time to reduce branch clutter; output shuffle decisions\n\t * are recorded into X_out variables.\n\t */\n\n\t/* Slot A: currently no support for reg/const. */\n\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\tif (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) {\n#else\n\tif (a <= DUK_BC_A_MAX) {\n#endif\n\t\t;\n\t} else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) {\n\t\tDUK_D(DUK_DPRINT(\"out of regs: 'a' (reg) needs shuffling but shuffle prohibited, a: %ld\", (long) a));\n\t\tgoto error_outofregs;\n\t} else if (a <= DUK_BC_BC_MAX) {\n\t\tcomp_ctx->curr_func.needs_shuffle = 1;\n\t\ttmp = comp_ctx->curr_func.shuffle1;\n\t\tif (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) {\n\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a));\n\t\t} else {\n\t\t\t/* Output shuffle needed after main operation */\n\t\t\ta_out = a;\n\n\t\t\t/* The DUK_OP_CSVAR output shuffle assumes shuffle registers are\n\t\t\t * consecutive.\n\t\t\t */\n\t\t\tDUK_ASSERT((comp_ctx->curr_func.shuffle1 == 0 && comp_ctx->curr_func.shuffle2 == 0) ||\n\t\t\t           (comp_ctx->curr_func.shuffle2 == comp_ctx->curr_func.shuffle1 + 1));\n\t\t\tif (op == DUK_OP_CSVAR) {\n\t\t\t\t/* For CSVAR the limit is one smaller because output shuffle\n\t\t\t\t * must be able to express 'a + 1' in BC.\n\t\t\t\t */\n\t\t\t\tif (a + 1 > DUK_BC_BC_MAX) {\n\t\t\t\t\tgoto error_outofregs;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ta = tmp;\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"out of regs: 'a' (reg) needs shuffling but does not fit into BC, a: %ld\", (long) a));\n\t\tgoto error_outofregs;\n\t}\n\n\t/* Slot B: reg/const support, mapped to bit 0 of opcode. */\n\n\tif ((b & DUK__CONST_MARKER) != 0) {\n\t\tDUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) == 0);\n\t\tDUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0);\n\t\tb = b & ~DUK__CONST_MARKER;\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\t\tif (0) {\n#else\n\t\tif (b <= 0xff) {\n#endif\n\t\t\tif (op_flags & DUK__EMIT_FLAG_BC_REGCONST) {\n\t\t\t\t/* Opcode follows B/C reg/const convention. */\n\t\t\t\tDUK_ASSERT((op & 0x01) == 0);\n\t\t\t\tins |= DUK_ENC_OP_A_B_C(0x01, 0, 0, 0);  /* const flag for B */\n\t\t\t} else {\n\t\t\t\tDUK_D(DUK_DPRINT(\"B is const, opcode is not B/C reg/const: %x\", op_flags));\n\t\t\t}\n\t\t} else if (b <= DUK_BC_BC_MAX) {\n\t\t\tcomp_ctx->curr_func.needs_shuffle = 1;\n\t\t\ttmp = comp_ctx->curr_func.shuffle2;\n\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, b));\n\t\t\tb = tmp;\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"out of regs: 'b' (const) needs shuffling but does not fit into BC, b: %ld\", (long) b));\n\t\t\tgoto error_outofregs;\n\t\t}\n\t} else {\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\t\tif (b <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B)) {\n#else\n\t\tif (b <= 0xff) {\n#endif\n\t\t\t;\n\t\t} else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_B) {\n\t\t\tif (b > DUK_BC_B_MAX) {\n\t\t\t\t/* Note: 0xff != DUK_BC_B_MAX */\n\t\t\t\tDUK_D(DUK_DPRINT(\"out of regs: 'b' (reg) needs shuffling but shuffle prohibited, b: %ld\", (long) b));\n\t\t\t\tgoto error_outofregs;\n\t\t\t}\n\t\t} else if (b <= DUK_BC_BC_MAX) {\n\t\t\tcomp_ctx->curr_func.needs_shuffle = 1;\n\t\t\ttmp = comp_ctx->curr_func.shuffle2;\n\t\t\tif (op_flags & DUK__EMIT_FLAG_B_IS_TARGET) {\n\t\t\t\t/* Output shuffle needed after main operation */\n\t\t\t\tb_out = b;\n\t\t\t}\n\t\t\tif (!(op_flags & DUK__EMIT_FLAG_B_IS_TARGET)) {\n\t\t\t\tif (op == DUK_OP_MPUTOBJ || op == DUK_OP_MPUTARR) {\n\t\t\t\t\t/* Special handling for MPUTOBJ/MPUTARR shuffling.\n\t\t\t\t\t * For each, slot B identifies the first register of a range\n\t\t\t\t\t * of registers, so normal shuffling won't work.  Instead,\n\t\t\t\t\t * an indirect version of the opcode is used.\n\t\t\t\t\t */\n\t\t\t\t\tDUK_ASSERT((op_flags & DUK__EMIT_FLAG_B_IS_TARGET) == 0);\n\t\t\t\t\tduk__emit_load_int32_noshuffle(comp_ctx, tmp, b);\n\t\t\t\t\tDUK_ASSERT(DUK_OP_MPUTOBJI == DUK_OP_MPUTOBJ + 1);\n\t\t\t\t\tDUK_ASSERT(DUK_OP_MPUTARRI == DUK_OP_MPUTARR + 1);\n\t\t\t\t\top_flags++;  /* indirect opcode follows direct */\n\t\t\t\t} else {\n\t\t\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, b));\n\t\t\t\t}\n\t\t\t}\n\t\t\tb = tmp;\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"out of regs: 'b' (reg) needs shuffling but does not fit into BC, b: %ld\", (long) b));\n\t\t\tgoto error_outofregs;\n\t\t}\n\t}\n\n\t/* Slot C: reg/const support, mapped to bit 1 of opcode. */\n\n\tif ((c & DUK__CONST_MARKER) != 0) {\n\t\tDUK_ASSERT((op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) == 0);\n\t\tDUK_ASSERT((op_flags & DUK__EMIT_FLAG_C_IS_TARGET) == 0);\n\t\tc = c & ~DUK__CONST_MARKER;\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\t\tif (0) {\n#else\n\t\tif (c <= 0xff) {\n#endif\n\t\t\tif (op_flags & DUK__EMIT_FLAG_BC_REGCONST) {\n\t\t\t\t/* Opcode follows B/C reg/const convention. */\n\t\t\t\tDUK_ASSERT((op & 0x02) == 0);\n\t\t\t\tins |= DUK_ENC_OP_A_B_C(0x02, 0, 0, 0);  /* const flag for C */\n\t\t\t} else {\n\t\t\t\tDUK_D(DUK_DPRINT(\"C is const, opcode is not B/C reg/const: %x\", op_flags));\n\t\t\t}\n\t\t} else if (c <= DUK_BC_BC_MAX) {\n\t\t\tcomp_ctx->curr_func.needs_shuffle = 1;\n\t\t\ttmp = comp_ctx->curr_func.shuffle3;\n\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDCONST, tmp, c));\n\t\t\tc = tmp;\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"out of regs: 'c' (const) needs shuffling but does not fit into BC, c: %ld\", (long) c));\n\t\t\tgoto error_outofregs;\n\t\t}\n\t} else {\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\t\tif (c <= 0xff && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C)) {\n#else\n\t\tif (c <= 0xff) {\n#endif\n\t\t\t;\n\t\t} else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_C) {\n\t\t\tif (c > DUK_BC_C_MAX) {\n\t\t\t\t/* Note: 0xff != DUK_BC_C_MAX */\n\t\t\t\tDUK_D(DUK_DPRINT(\"out of regs: 'c' (reg) needs shuffling but shuffle prohibited, c: %ld\", (long) c));\n\t\t\t\tgoto error_outofregs;\n\t\t\t}\n\t\t} else if (c <= DUK_BC_BC_MAX) {\n\t\t\tcomp_ctx->curr_func.needs_shuffle = 1;\n\t\t\ttmp = comp_ctx->curr_func.shuffle3;\n\t\t\tif (op_flags & DUK__EMIT_FLAG_C_IS_TARGET) {\n\t\t\t\t/* Output shuffle needed after main operation */\n\t\t\t\tc_out = c;\n\t\t\t} else {\n\t\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, c));\n\t\t\t}\n\t\t\tc = tmp;\n\t\t} else {\n\t\t\tDUK_D(DUK_DPRINT(\"out of regs: 'c' (reg) needs shuffling but does not fit into BC, c: %ld\", (long) c));\n\t\t\tgoto error_outofregs;\n\t\t}\n\t}\n\n\t/* Main operation */\n\n\tDUK_ASSERT(a >= DUK_BC_A_MIN);\n\tDUK_ASSERT(a <= DUK_BC_A_MAX);\n\tDUK_ASSERT(b >= DUK_BC_B_MIN);\n\tDUK_ASSERT(b <= DUK_BC_B_MAX);\n\tDUK_ASSERT(c >= DUK_BC_C_MIN);\n\tDUK_ASSERT(c <= DUK_BC_C_MAX);\n\n\tins |= DUK_ENC_OP_A_B_C(op_flags & 0xff, a, b, c);\n\tduk__emit(comp_ctx, ins);\n\n\t/* NEXTENUM needs a jump slot right after the main instruction.\n\t * When the JUMP is taken, output spilling is not needed so this\n\t * workaround is possible.  The jump slot PC is exceptionally\n\t * plumbed through comp_ctx to minimize call sites.\n\t */\n\tif (op_flags & DUK__EMIT_FLAG_RESERVE_JUMPSLOT) {\n\t\tcomp_ctx->emit_jumpslot_pc = duk__get_current_pc(comp_ctx);\n\t\tduk__emit_abc(comp_ctx, DUK_OP_JUMP, 0);\n\t}\n\n\t/* Output shuffling: only one output register is realistically possible.\n\t *\n\t * (Zero would normally be an OK marker value: if the target register\n\t * was zero, it would never be shuffled.  But with DUK_USE_SHUFFLE_TORTURE\n\t * this is no longer true, so use -1 as a marker instead.)\n\t */\n\n\tif (a_out >= 0) {\n\t\tDUK_ASSERT(b_out < 0);\n\t\tDUK_ASSERT(c_out < 0);\n\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a, a_out));\n\n\t\tif (op == DUK_OP_CSVAR) {\n\t\t\t/* Special handling for CSVAR shuffling.  The variable lookup\n\t\t\t * results in a <value, this binding> pair in successive\n\t\t\t * registers so use two shuffle registers and two output\n\t\t\t * loads.  (In practice this is dead code because temp/const\n\t\t\t * limit is reached first.)\n\t\t\t */\n\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, a + 1, a_out + 1));\n\t\t}\n\t} else if (b_out >= 0) {\n\t\tDUK_ASSERT(a_out < 0);\n\t\tDUK_ASSERT(c_out < 0);\n\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, b, b_out));\n\t} else if (c_out >= 0) {\n\t\tDUK_ASSERT(b_out < 0);\n\t\tDUK_ASSERT(c_out < 0);\n\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, c, c_out));\n\t}\n\n\treturn;\n\n error_outofregs:\n\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);\n}\n\n/* For many of the helpers below it'd be technically correct to add\n * \"no shuffle\" flags for parameters passed in as zero.  For example,\n * duk__emit_a_b() should call duk__emit_a_b_c() with C set to 0, and\n * DUK__EMIT_FLAG_NO_SHUFFLE_C added to op_flags.  However, since the\n * C value is 0, it'll never get shuffled so adding the flag is just\n * unnecessary additional code.  This is unfortunately not true for\n * \"shuffle torture\" mode which needs special handling.\n */\n\nDUK_LOCAL void duk__emit_a_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t b) {\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\top_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_C;\n#endif\n\tduk__emit_a_b_c(comp_ctx, op_flags, a, b, 0);\n}\n\nDUK_LOCAL void duk__emit_b_c(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b, duk_regconst_t c) {\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\top_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A;\n#endif\n\tduk__emit_a_b_c(comp_ctx, op_flags, 0, b, c);\n}\n\n#if 0  /* unused */\nDUK_LOCAL void duk__emit_a(duk_compiler_ctx *comp_ctx, int op_flags, int a) {\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\top_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_B | DUK__EMIT_FLAG_NO_SHUFFLE_C;\n#endif\n\tduk__emit_a_b_c(comp_ctx, op_flags, a, 0, 0);\n}\n#endif\n\n#if 0  /* unused */\nDUK_LOCAL void duk__emit_b(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t b) {\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\top_flags |= DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_NO_SHUFFLE_C;\n#endif\n\tduk__emit_a_b_c(comp_ctx, op_flags, 0, b, 0);\n}\n#endif\n\nDUK_LOCAL void duk__emit_a_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op_flags, duk_regconst_t a, duk_regconst_t bc) {\n\tduk_instr_t ins;\n\tduk_int_t tmp;\n\n\t/* allow caller to give a const number with the DUK__CONST_MARKER */\n\tDUK_ASSERT(bc != -1);  /* Not 'none'. */\n\tbc = bc & (~DUK__CONST_MARKER);\n\n\tDUK_ASSERT_DISABLE((op_flags & 0xff) >= DUK_BC_OP_MIN);  /* unsigned */\n\tDUK_ASSERT((op_flags & 0xff) <= DUK_BC_OP_MAX);\n\tDUK_ASSERT(bc >= DUK_BC_BC_MIN);\n\tDUK_ASSERT(bc <= DUK_BC_BC_MAX);\n\tDUK_ASSERT((bc & DUK__CONST_MARKER) == 0);\n\n\tif (bc <= DUK_BC_BC_MAX) {\n\t\t;\n\t} else {\n\t\t/* No BC shuffling now. */\n\t\tgoto error_outofregs;\n\t}\n\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\tif (a <= DUK_BC_A_MAX && (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A)) {\n#else\n\tif (a <= DUK_BC_A_MAX) {\n#endif\n\t\tins = DUK_ENC_OP_A_BC(op_flags & 0xff, a, bc);\n\t\tduk__emit(comp_ctx, ins);\n\t} else if (op_flags & DUK__EMIT_FLAG_NO_SHUFFLE_A) {\n\t\tgoto error_outofregs;\n\t} else if ((op_flags & 0xf0U) == DUK_OP_CALL0) {\n\t\tcomp_ctx->curr_func.needs_shuffle = 1;\n\t\ttmp = comp_ctx->curr_func.shuffle1;\n\t\tduk__emit_load_int32_noshuffle(comp_ctx, tmp, a);\n\t\top_flags |= DUK_BC_CALL_FLAG_INDIRECT;\n\t\tins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc);\n\t\tduk__emit(comp_ctx, ins);\n\t} else if (a <= DUK_BC_BC_MAX) {\n\t\tcomp_ctx->curr_func.needs_shuffle = 1;\n\t\ttmp = comp_ctx->curr_func.shuffle1;\n\t\tins = DUK_ENC_OP_A_BC(op_flags & 0xff, tmp, bc);\n\t\tif (op_flags & DUK__EMIT_FLAG_A_IS_SOURCE) {\n\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_LDREG, tmp, a));\n\t\t\tduk__emit(comp_ctx, ins);\n\t\t} else {\n\t\t\tduk__emit(comp_ctx, ins);\n\t\t\tduk__emit(comp_ctx, DUK_ENC_OP_A_BC(DUK_OP_STREG, tmp, a));\n\t\t}\n\t} else {\n\t\tgoto error_outofregs;\n\t}\n\treturn;\n\n error_outofregs:\n\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);\n}\n\nDUK_LOCAL void duk__emit_bc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t bc) {\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n\top |= DUK__EMIT_FLAG_NO_SHUFFLE_A;\n#endif\n\tduk__emit_a_bc(comp_ctx, op, 0, bc);\n}\n\nDUK_LOCAL void duk__emit_abc(duk_compiler_ctx *comp_ctx, duk_small_uint_t op, duk_regconst_t abc) {\n\tduk_instr_t ins;\n\n\tDUK_ASSERT_DISABLE(op >= DUK_BC_OP_MIN);  /* unsigned */\n\tDUK_ASSERT(op <= DUK_BC_OP_MAX);\n\tDUK_ASSERT_DISABLE(abc >= DUK_BC_ABC_MIN);  /* unsigned */\n\tDUK_ASSERT(abc <= DUK_BC_ABC_MAX);\n\tDUK_ASSERT((abc & DUK__CONST_MARKER) == 0);\n\tDUK_ASSERT(abc != -1);  /* Not 'none'. */\n\n\tif (abc <= DUK_BC_ABC_MAX) {\n\t\t;\n\t} else {\n\t\tgoto error_outofregs;\n\t}\n\tins = DUK_ENC_OP_ABC(op, abc);\n\tDUK_DDD(DUK_DDDPRINT(\"duk__emit_abc: 0x%08lx line=%ld pc=%ld op=%ld (%!C) abc=%ld (%!I)\",\n\t                     (unsigned long) ins, (long) comp_ctx->curr_token.start_line,\n\t                     (long) duk__get_current_pc(comp_ctx), (long) op, (long) op,\n\t                     (long) abc, (duk_instr_t) ins));\n\tduk__emit(comp_ctx, ins);\n\treturn;\n\n error_outofregs:\n\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);\n}\n\nDUK_LOCAL void duk__emit_load_int32_raw(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val, duk_small_uint_t op_flags) {\n\t/* XXX: Shuffling support could be implemented here so that LDINT+LDINTX\n\t * would only shuffle once (instead of twice).  The current code works\n\t * though, and has a smaller compiler footprint.\n\t */\n\n\tif ((val >= (duk_int32_t) DUK_BC_BC_MIN - (duk_int32_t) DUK_BC_LDINT_BIAS) &&\n\t    (val <= (duk_int32_t) DUK_BC_BC_MAX - (duk_int32_t) DUK_BC_LDINT_BIAS)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"emit LDINT to reg %ld for %ld\", (long) reg, (long) val));\n\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (val + (duk_int32_t) DUK_BC_LDINT_BIAS));\n\t} else {\n\t\tduk_int32_t hi = val >> DUK_BC_LDINTX_SHIFT;\n\t\tduk_int32_t lo = val & ((((duk_int32_t) 1) << DUK_BC_LDINTX_SHIFT) - 1);\n\t\tDUK_ASSERT(lo >= 0);\n\t\tDUK_DDD(DUK_DDDPRINT(\"emit LDINT+LDINTX to reg %ld for %ld -> hi %ld, lo %ld\",\n\t\t                     (long) reg, (long) val, (long) hi, (long) lo));\n\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDINT | op_flags, reg, (duk_regconst_t) (hi + (duk_int32_t) DUK_BC_LDINT_BIAS));\n\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDINTX | op_flags, reg, (duk_regconst_t) lo);\n\t}\n}\n\nDUK_LOCAL void duk__emit_load_int32(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) {\n\tduk__emit_load_int32_raw(comp_ctx, reg, val, 0 /*op_flags*/);\n}\n\n#if defined(DUK_USE_SHUFFLE_TORTURE)\n/* Used by duk__emit*() calls so that we don't shuffle the loadints that\n * are needed to handle indirect opcodes.\n */\nDUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) {\n\tduk__emit_load_int32_raw(comp_ctx, reg, val, DUK__EMIT_FLAG_NO_SHUFFLE_A /*op_flags*/);\n}\n#else\nDUK_LOCAL void duk__emit_load_int32_noshuffle(duk_compiler_ctx *comp_ctx, duk_regconst_t reg, duk_int32_t val) {\n\t/* When torture not enabled, can just use the same helper because\n\t * 'reg' won't get spilled.\n\t */\n\tDUK_ASSERT(reg <= DUK_BC_A_MAX);\n\tduk__emit_load_int32(comp_ctx, reg, val);\n}\n#endif\n\nDUK_LOCAL void duk__emit_jump(duk_compiler_ctx *comp_ctx, duk_int_t target_pc) {\n\tduk_int_t curr_pc;\n\tduk_int_t offset;\n\n\tcurr_pc = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr));\n\toffset = (duk_int_t) target_pc - (duk_int_t) curr_pc - 1;\n\tDUK_ASSERT(offset + DUK_BC_JUMP_BIAS >= DUK_BC_ABC_MIN);\n\tDUK_ASSERT(offset + DUK_BC_JUMP_BIAS <= DUK_BC_ABC_MAX);\n\tduk__emit_abc(comp_ctx, DUK_OP_JUMP, (duk_regconst_t) (offset + DUK_BC_JUMP_BIAS));\n}\n\nDUK_LOCAL duk_int_t duk__emit_jump_empty(duk_compiler_ctx *comp_ctx) {\n\tduk_int_t ret;\n\n\tret = duk__get_current_pc(comp_ctx);  /* useful for patching jumps later */\n\tduk__emit_op_only(comp_ctx, DUK_OP_JUMP);\n\treturn ret;\n}\n\n/* Insert an empty jump in the middle of code emitted earlier.  This is\n * currently needed for compiling for-in.\n */\nDUK_LOCAL void duk__insert_jump_entry(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) {\n#if defined(DUK_USE_PC2LINE)\n\tduk_int_t line;\n#endif\n\tduk_compiler_instr *instr;\n\tduk_size_t offset;\n\n\tDUK_ASSERT(jump_pc >= 0);\n\toffset = (duk_size_t) jump_pc * sizeof(duk_compiler_instr);\n\tinstr = (duk_compiler_instr *) (void *)\n\t        DUK_BW_INSERT_ENSURE_AREA(comp_ctx->thr,\n\t                                  &comp_ctx->curr_func.bw_code,\n\t                                  offset,\n\t                                  sizeof(duk_compiler_instr));\n\n#if defined(DUK_USE_PC2LINE)\n\tline = comp_ctx->curr_token.start_line;  /* approximation, close enough */\n#endif\n\tinstr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, 0);\n#if defined(DUK_USE_PC2LINE)\n\tinstr->line = (duk_uint32_t) line;\n#endif\n\n\tDUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, sizeof(duk_compiler_instr));\n\tif (DUK_UNLIKELY(DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) > DUK_USE_ESBC_MAX_BYTES)) {\n\t\tgoto fail_bc_limit;\n\t}\n\treturn;\n\n  fail_bc_limit:\n\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_BYTECODE_LIMIT);\n}\n\n/* Does not assume that jump_pc contains a DUK_OP_JUMP previously; this is intentional\n * to allow e.g. an INVALID opcode be overwritten with a JUMP (label management uses this).\n */\nDUK_LOCAL void duk__patch_jump(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc, duk_int_t target_pc) {\n\tduk_compiler_instr *instr;\n\tduk_int_t offset;\n\n\t/* allow negative PCs, behave as a no-op */\n\tif (jump_pc < 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"duk__patch_jump(): nop call, jump_pc=%ld (<0), target_pc=%ld\",\n\t\t                     (long) jump_pc, (long) target_pc));\n\t\treturn;\n\t}\n\tDUK_ASSERT(jump_pc >= 0);\n\n\t/* XXX: range assert */\n\tinstr = duk__get_instr_ptr(comp_ctx, jump_pc);\n\tDUK_ASSERT(instr != NULL);\n\n\t/* XXX: range assert */\n\toffset = target_pc - jump_pc - 1;\n\n\tinstr->ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, offset + DUK_BC_JUMP_BIAS);\n\tDUK_DDD(DUK_DDDPRINT(\"duk__patch_jump(): jump_pc=%ld, target_pc=%ld, offset=%ld\",\n\t                     (long) jump_pc, (long) target_pc, (long) offset));\n}\n\nDUK_LOCAL void duk__patch_jump_here(duk_compiler_ctx *comp_ctx, duk_int_t jump_pc) {\n\tduk__patch_jump(comp_ctx, jump_pc, duk__get_current_pc(comp_ctx));\n}\n\nDUK_LOCAL void duk__patch_trycatch(duk_compiler_ctx *comp_ctx, duk_int_t ldconst_pc, duk_int_t trycatch_pc, duk_regconst_t reg_catch, duk_regconst_t const_varname, duk_small_uint_t flags) {\n\tduk_compiler_instr *instr;\n\n\tDUK_ASSERT(DUK__ISREG(reg_catch));\n\n\tinstr = duk__get_instr_ptr(comp_ctx, ldconst_pc);\n\tDUK_ASSERT(DUK_DEC_OP(instr->ins) == DUK_OP_LDCONST);\n\tDUK_ASSERT(instr != NULL);\n\tif (const_varname & DUK__CONST_MARKER) {\n\t\t/* Have a catch variable. */\n\t\tconst_varname = const_varname & (~DUK__CONST_MARKER);\n\t\tif (reg_catch > DUK_BC_BC_MAX || const_varname > DUK_BC_BC_MAX) {\n\t\t\t/* Catch attempts to use out-of-range reg/const.  Without this\n\t\t\t * check Duktape 0.12.0 could generate invalid code which caused\n\t\t\t * an assert failure on execution.  This error is triggered e.g.\n\t\t\t * for functions with a lot of constants and a try-catch statement.\n\t\t\t * Shuffling or opcode semantics change is needed to fix the issue.\n\t\t\t * See: test-bug-trycatch-many-constants.js.\n\t\t\t */\n\t\t\tDUK_D(DUK_DPRINT(\"failed to patch trycatch: flags=%ld, reg_catch=%ld, const_varname=%ld (0x%08lx)\",\n\t\t\t                 (long) flags, (long) reg_catch, (long) const_varname, (long) const_varname));\n\t\t\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_REG_LIMIT);\n\t\t}\n\t\tinstr->ins |= DUK_ENC_OP_A_BC(0, 0, const_varname);\n\t} else {\n\t\t/* No catch variable, e.g. a try-finally; replace LDCONST with\n\t\t * NOP to avoid a bogus LDCONST.\n\t\t */\n\t\tinstr->ins = DUK_ENC_OP(DUK_OP_NOP);\n\t}\n\n\tinstr = duk__get_instr_ptr(comp_ctx, trycatch_pc);\n\tDUK_ASSERT(instr != NULL);\n\tDUK_ASSERT_DISABLE(flags >= DUK_BC_A_MIN);\n\tDUK_ASSERT(flags <= DUK_BC_A_MAX);\n\tinstr->ins = DUK_ENC_OP_A_BC(DUK_OP_TRYCATCH, flags, reg_catch);\n}\n\nDUK_LOCAL void duk__emit_if_false_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) {\n\tduk_small_uint_t op;\n\n\top = DUK__ISREG(regconst) ? DUK_OP_IFFALSE_R : DUK_OP_IFFALSE_C;\n\tduk__emit_bc(comp_ctx, op, regconst);  /* helper will remove const flag */\n}\n\nDUK_LOCAL void duk__emit_if_true_skip(duk_compiler_ctx *comp_ctx, duk_regconst_t regconst) {\n\tduk_small_uint_t op;\n\n\top = DUK__ISREG(regconst) ? DUK_OP_IFTRUE_R : DUK_OP_IFTRUE_C;\n\tduk__emit_bc(comp_ctx, op, regconst);  /* helper will remove const flag */\n}\n\nDUK_LOCAL void duk__emit_invalid(duk_compiler_ctx *comp_ctx) {\n\tduk__emit_op_only(comp_ctx, DUK_OP_INVALID);\n}\n\n/*\n *  Peephole optimizer for finished bytecode.\n *\n *  Does not remove opcodes; currently only straightens out unconditional\n *  jump chains which are generated by several control structures.\n */\n\nDUK_LOCAL void duk__peephole_optimize_bytecode(duk_compiler_ctx *comp_ctx) {\n\tduk_compiler_instr *bc;\n\tduk_small_uint_t iter;\n\tduk_int_t i, n;\n\tduk_int_t count_opt;\n\n\tbc = (duk_compiler_instr *) (void *) DUK_BW_GET_BASEPTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code);\n#if defined(DUK_USE_BUFLEN16)\n\t/* No need to assert, buffer size maximum is 0xffff. */\n#else\n\tDUK_ASSERT((duk_size_t) DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr) <= (duk_size_t) DUK_INT_MAX);  /* bytecode limits */\n#endif\n\tn = (duk_int_t) (DUK_BW_GET_SIZE(comp_ctx->thr, &comp_ctx->curr_func.bw_code) / sizeof(duk_compiler_instr));\n\n\tfor (iter = 0; iter < DUK_COMPILER_PEEPHOLE_MAXITER; iter++) {\n\t\tcount_opt = 0;\n\n\t\tfor (i = 0; i < n; i++) {\n\t\t\tduk_instr_t ins;\n\t\t\tduk_int_t target_pc1;\n\t\t\tduk_int_t target_pc2;\n\n\t\t\tins = bc[i].ins;\n\t\t\tif (DUK_DEC_OP(ins) != DUK_OP_JUMP) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttarget_pc1 = i + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"consider jump at pc %ld; target_pc=%ld\", (long) i, (long) target_pc1));\n\t\t\tDUK_ASSERT(target_pc1 >= 0);\n\t\t\tDUK_ASSERT(target_pc1 < n);\n\n\t\t\t/* Note: if target_pc1 == i, we'll optimize a jump to itself.\n\t\t\t * This does not need to be checked for explicitly; the case\n\t\t\t * is rare and max iter breaks us out.\n\t\t\t */\n\n\t\t\tins = bc[target_pc1].ins;\n\t\t\tif (DUK_DEC_OP(ins) != DUK_OP_JUMP) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttarget_pc2 = target_pc1 + 1 + (duk_int_t) DUK_DEC_ABC(ins) - (duk_int_t) DUK_BC_JUMP_BIAS;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"optimizing jump at pc %ld; old target is %ld -> new target is %ld\",\n\t\t\t                     (long) i, (long) target_pc1, (long) target_pc2));\n\n\t\t\tbc[i].ins = DUK_ENC_OP_ABC(DUK_OP_JUMP, target_pc2 - (i + 1) + DUK_BC_JUMP_BIAS);\n\n\t\t\tcount_opt++;\n\t\t}\n\n\t\tDUK_DD(DUK_DDPRINT(\"optimized %ld jumps on peephole round %ld\", (long) count_opt, (long) (iter + 1)));\n\n\t\tif (count_opt == 0) {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/*\n *  Intermediate value helpers\n */\n\n/* Flags for intermediate value coercions.  A flag for using a forced reg\n * is not needed, the forced_reg argument suffices and generates better\n * code (it is checked as it is used).\n */\n/* XXX: DUK__IVAL_FLAG_REQUIRE_SHORT is passed but not currently implemented\n * by ispec/ivalue operations.\n */\n#define DUK__IVAL_FLAG_ALLOW_CONST          (1 << 0)  /* allow a constant to be returned */\n#define DUK__IVAL_FLAG_REQUIRE_TEMP         (1 << 1)  /* require a (mutable) temporary as a result (or a const if allowed) */\n#define DUK__IVAL_FLAG_REQUIRE_SHORT        (1 << 2)  /* require a short (8-bit) reg/const which fits into bytecode B/C slot */\n\n/* XXX: some code might benefit from DUK__SETTEMP_IFTEMP(thr,x) */\n\n#if 0  /* enable manually for dumping */\n#define DUK__DUMP_ISPEC(compctx,ispec) do { duk__dump_ispec((compctx), (ispec)); } while (0)\n#define DUK__DUMP_IVALUE(compctx,ivalue) do { duk__dump_ivalue((compctx), (ivalue)); } while (0)\n\nDUK_LOCAL void duk__dump_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *x) {\n\tDUK_D(DUK_DPRINT(\"ispec dump: t=%ld regconst=0x%08lx, valstack_idx=%ld, value=%!T\",\n\t                 (long) x->t, (unsigned long) x->regconst, (long) x->valstack_idx,\n\t                 duk_get_tval(comp_ctx->thr, x->valstack_idx)));\n}\nDUK_LOCAL void duk__dump_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\tDUK_D(DUK_DPRINT(\"ivalue dump: t=%ld op=%ld \"\n\t                 \"x1={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T} \"\n\t                 \"x2={t=%ld regconst=0x%08lx valstack_idx=%ld value=%!T}\",\n\t\t         (long) x->t, (long) x->op,\n\t                 (long) x->x1.t, (unsigned long) x->x1.regconst, (long) x->x1.valstack_idx,\n\t                 duk_get_tval(comp_ctx->thr, x->x1.valstack_idx),\n\t                 (long) x->x2.t, (unsigned long) x->x2.regconst, (long) x->x2.valstack_idx,\n\t                 duk_get_tval(comp_ctx->thr, x->x2.valstack_idx)));\n}\n#else\n#define DUK__DUMP_ISPEC(comp_ctx,x) do {} while (0)\n#define DUK__DUMP_IVALUE(comp_ctx,x) do {} while (0)\n#endif\n\nDUK_LOCAL void duk__ivalue_regconst(duk_ivalue *x, duk_regconst_t regconst) {\n\tx->t = DUK_IVAL_PLAIN;\n\tx->x1.t = DUK_ISPEC_REGCONST;\n\tx->x1.regconst = regconst;\n}\n\nDUK_LOCAL void duk__ivalue_plain_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\tx->t = DUK_IVAL_PLAIN;\n\tx->x1.t = DUK_ISPEC_VALUE;\n\tduk_replace(comp_ctx->thr, x->x1.valstack_idx);\n}\n\nDUK_LOCAL void duk__ivalue_var_fromstack(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\tx->t = DUK_IVAL_VAR;\n\tx->x1.t = DUK_ISPEC_VALUE;\n\tduk_replace(comp_ctx->thr, x->x1.valstack_idx);\n}\n\nDUK_LOCAL_DECL void duk__ivalue_var_hstring(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_hstring *h) {\n\tDUK_ASSERT(h != NULL);\n\tduk_push_hstring(comp_ctx->thr, h);\n\tduk__ivalue_var_fromstack(comp_ctx, x);\n}\n\nDUK_LOCAL void duk__copy_ispec(duk_compiler_ctx *comp_ctx, duk_ispec *src, duk_ispec *dst) {\n\tdst->t = src->t;\n\tdst->regconst = src->regconst;\n\tduk_copy(comp_ctx->thr, src->valstack_idx, dst->valstack_idx);\n}\n\nDUK_LOCAL void duk__copy_ivalue(duk_compiler_ctx *comp_ctx, duk_ivalue *src, duk_ivalue *dst) {\n\tdst->t = src->t;\n\tdst->op = src->op;\n\tdst->x1.t = src->x1.t;\n\tdst->x1.regconst = src->x1.regconst;\n\tdst->x2.t = src->x2.t;\n\tdst->x2.regconst = src->x2.regconst;\n\tduk_copy(comp_ctx->thr, src->x1.valstack_idx, dst->x1.valstack_idx);\n\tduk_copy(comp_ctx->thr, src->x2.valstack_idx, dst->x2.valstack_idx);\n}\n\nDUK_LOCAL duk_regconst_t duk__alloctemps(duk_compiler_ctx *comp_ctx, duk_small_int_t num) {\n\tduk_regconst_t res;\n\n\tres = comp_ctx->curr_func.temp_next;\n\tcomp_ctx->curr_func.temp_next += num;\n\n\tif (comp_ctx->curr_func.temp_next > DUK__MAX_TEMPS) {  /* == DUK__MAX_TEMPS is OK */\n\t\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_TEMP_LIMIT);\n\t}\n\n\t/* maintain highest 'used' temporary, needed to figure out nregs of function */\n\tif (comp_ctx->curr_func.temp_next > comp_ctx->curr_func.temp_max) {\n\t\tcomp_ctx->curr_func.temp_max = comp_ctx->curr_func.temp_next;\n\t}\n\n\treturn res;\n}\n\nDUK_LOCAL duk_regconst_t duk__alloctemp(duk_compiler_ctx *comp_ctx) {\n\treturn duk__alloctemps(comp_ctx, 1);\n}\n\nDUK_LOCAL void duk__settemp_checkmax(duk_compiler_ctx *comp_ctx, duk_regconst_t temp_next) {\n\tcomp_ctx->curr_func.temp_next = temp_next;\n\tif (temp_next > comp_ctx->curr_func.temp_max) {\n\t\tcomp_ctx->curr_func.temp_max = temp_next;\n\t}\n}\n\n/* get const for value at valstack top */\nDUK_LOCAL duk_regconst_t duk__getconst(duk_compiler_ctx *comp_ctx) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_compiler_func *f = &comp_ctx->curr_func;\n\tduk_tval *tv1;\n\tduk_int_t i, n, n_check;\n\n\tn = (duk_int_t) duk_get_length(thr, f->consts_idx);\n\n\ttv1 = DUK_GET_TVAL_NEGIDX(thr, -1);\n\tDUK_ASSERT(tv1 != NULL);\n\n#if defined(DUK_USE_FASTINT)\n\t/* Explicit check for fastint downgrade. */\n\tDUK_TVAL_CHKFAST_INPLACE_SLOW(tv1);\n#endif\n\n\t/* Sanity workaround for handling functions with a large number of\n\t * constants at least somewhat reasonably.  Otherwise checking whether\n\t * we already have the constant would grow very slow (as it is O(N^2)).\n\t */\n\tn_check = (n > DUK__GETCONST_MAX_CONSTS_CHECK ? DUK__GETCONST_MAX_CONSTS_CHECK : n);\n\tfor (i = 0; i < n_check; i++) {\n\t\tduk_tval *tv2 = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, f->h_consts, i);\n\n\t\t/* Strict equality is NOT enough, because we cannot use the same\n\t\t * constant for e.g. +0 and -0.\n\t\t */\n\t\tif (duk_js_samevalue(tv1, tv2)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"reused existing constant for %!T -> const index %ld\",\n\t\t\t                     (duk_tval *) tv1, (long) i));\n\t\t\tduk_pop(thr);\n\t\t\treturn (duk_regconst_t) i | (duk_regconst_t) DUK__CONST_MARKER;\n\t\t}\n\t}\n\n\tif (n > DUK__MAX_CONSTS) {\n\t\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_CONST_LIMIT);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"allocating new constant for %!T -> const index %ld\",\n\t                     (duk_tval *) tv1, (long) n));\n\t(void) duk_put_prop_index(thr, f->consts_idx, (duk_uarridx_t) n);  /* invalidates tv1, tv2 */\n\treturn (duk_regconst_t) n | (duk_regconst_t) DUK__CONST_MARKER;\n}\n\nDUK_LOCAL duk_bool_t duk__const_needs_refcount(duk_compiler_ctx *comp_ctx, duk_regconst_t rc) {\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\tduk_compiler_func *f = &comp_ctx->curr_func;\n\tduk_bool_t ret;\n\n\tDUK_ASSERT((rc & DUK__CONST_MARKER) == 0);  /* caller removes const marker */\n\t(void) duk_get_prop_index(comp_ctx->thr, f->consts_idx, (duk_uarridx_t) rc);\n\tret = !duk_is_number(comp_ctx->thr, -1);  /* now only number/string, so conservative check */\n\tduk_pop(comp_ctx->thr);\n\treturn ret;\n#else\n\tDUK_UNREF(comp_ctx);\n\tDUK_UNREF(rc);\n\tDUK_ASSERT((rc & DUK__CONST_MARKER) == 0);  /* caller removes const marker */\n\treturn 0;\n#endif\n}\n\n/* Get the value represented by an duk_ispec to a register or constant.\n * The caller can control the result by indicating whether or not:\n *\n *   (1) a constant is allowed (sometimes the caller needs the result to\n *       be in a register)\n *\n *   (2) a temporary register is required (usually when caller requires\n *       the register to be safely mutable; normally either a bound\n *       register or a temporary register are both OK)\n *\n *   (3) a forced register target needs to be used\n *\n * Bytecode may be emitted to generate the necessary value.  The return\n * value is either a register or a constant.\n */\n\nDUK_LOCAL\nduk_regconst_t duk__ispec_toregconst_raw(duk_compiler_ctx *comp_ctx,\n                                         duk_ispec *x,\n                                         duk_regconst_t forced_reg,\n                                         duk_small_uint_t flags) {\n\tduk_hthread *thr = comp_ctx->thr;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__ispec_toregconst_raw(): x={%ld:%ld:%!T}, \"\n\t                     \"forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld\",\n\t                     (long) x->t,\n\t                     (long) x->regconst,\n\t                     (duk_tval *) duk_get_tval(thr, x->valstack_idx),\n\t                     (long) forced_reg,\n\t                     (unsigned long) flags,\n\t                     (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0),\n\t                     (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0),\n\t                     (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0)));\n\n\tswitch (x->t) {\n\tcase DUK_ISPEC_VALUE: {\n\t\tduk_tval *tv;\n\n\t\ttv = DUK_GET_TVAL_POSIDX(thr, x->valstack_idx);\n\t\tDUK_ASSERT(tv != NULL);\n\n\t\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\t\tcase DUK_TAG_UNDEFINED: {\n\t\t\t/* Note: although there is no 'undefined' literal, undefined\n\t\t\t * values can occur during compilation as a result of e.g.\n\t\t\t * the 'void' operator.\n\t\t\t */\n\t\t\tduk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));\n\t\t\tduk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, dest);\n\t\t\treturn dest;\n\t\t}\n\t\tcase DUK_TAG_NULL: {\n\t\t\tduk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));\n\t\t\tduk__emit_bc(comp_ctx, DUK_OP_LDNULL, dest);\n\t\t\treturn dest;\n\t\t}\n\t\tcase DUK_TAG_BOOLEAN: {\n\t\t\tduk_regconst_t dest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));\n\t\t\tduk__emit_bc(comp_ctx,\n\t\t\t             (DUK_TVAL_GET_BOOLEAN(tv) ? DUK_OP_LDTRUE : DUK_OP_LDFALSE),\n\t\t\t             dest);\n\t\t\treturn dest;\n\t\t}\n\t\tcase DUK_TAG_POINTER: {\n\t\t\tDUK_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_TAG_STRING: {\n\t\t\tduk_hstring *h;\n\t\t\tduk_regconst_t dest;\n\t\t\tduk_regconst_t constidx;\n\n\t\t\th = DUK_TVAL_GET_STRING(tv);\n\t\t\tDUK_UNREF(h);\n\t\t\tDUK_ASSERT(h != NULL);\n\n#if 0  /* XXX: to be implemented? */\n\t\t\t/* Use special opcodes to load short strings */\n\t\t\tif (DUK_HSTRING_GET_BYTELEN(h) <= 2) {\n\t\t\t\t/* Encode into a single opcode (18 bits can encode 1-2 bytes + length indicator) */\n\t\t\t} else if (DUK_HSTRING_GET_BYTELEN(h) <= 6) {\n\t\t\t\t/* Encode into a double constant (53 bits can encode 6*8 = 48 bits + 3-bit length */\n\t\t\t}\n#endif\n\t\t\tduk_dup(thr, x->valstack_idx);\n\t\t\tconstidx = duk__getconst(comp_ctx);\n\n\t\t\tif (flags & DUK__IVAL_FLAG_ALLOW_CONST) {\n\t\t\t\treturn constidx;\n\t\t\t}\n\n\t\t\tdest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));\n\t\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx);\n\t\t\treturn dest;\n\t\t}\n\t\tcase DUK_TAG_OBJECT: {\n\t\t\tDUK_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_TAG_BUFFER: {\n\t\t\tDUK_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_TAG_LIGHTFUNC: {\n\t\t\tDUK_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n#if defined(DUK_USE_FASTINT)\n\t\tcase DUK_TAG_FASTINT:\n#endif\n\t\tdefault: {\n\t\t\t/* number */\n\t\t\tduk_regconst_t dest;\n\t\t\tduk_regconst_t constidx;\n\t\t\tduk_double_t dval;\n\t\t\tduk_int32_t ival;\n\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\t\tdval = DUK_TVAL_GET_NUMBER(tv);\n\n\t\t\tif (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) {\n\t\t\t\t/* A number can be loaded either through a constant, using\n\t\t\t\t * LDINT, or using LDINT+LDINTX.  LDINT is always a size win,\n\t\t\t\t * LDINT+LDINTX is not if the constant is used multiple times.\n\t\t\t\t * Currently always prefer LDINT+LDINTX over a double constant.\n\t\t\t\t */\n\n\t\t\t\tif (duk_is_whole_get_int32_nonegzero(dval, &ival)) {\n\t\t\t\t\tdest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));\n\t\t\t\t\tduk__emit_load_int32(comp_ctx, dest, ival);\n\t\t\t\t\treturn dest;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tduk_dup(thr, x->valstack_idx);\n\t\t\tconstidx = duk__getconst(comp_ctx);\n\n\t\t\tif (flags & DUK__IVAL_FLAG_ALLOW_CONST) {\n\t\t\t\treturn constidx;\n\t\t\t} else {\n\t\t\t\tdest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));\n\t\t\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, constidx);\n\t\t\t\treturn dest;\n\t\t\t}\n\t\t}\n\t\t}  /* end switch */\n\t}\n\tcase DUK_ISPEC_REGCONST: {\n\t\tif (forced_reg >= 0) {\n\t\t\tif (DUK__ISCONST(x->regconst)) {\n\t\t\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, forced_reg, x->regconst);\n\t\t\t} else if (x->regconst != forced_reg) {\n\t\t\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDREG, forced_reg, x->regconst);\n\t\t\t} else {\n\t\t\t\t; /* already in correct reg */\n\t\t\t}\n\t\t\treturn forced_reg;\n\t\t}\n\n\t\tDUK_ASSERT(forced_reg < 0);\n\t\tif (DUK__ISCONST(x->regconst)) {\n\t\t\tif (!(flags & DUK__IVAL_FLAG_ALLOW_CONST)) {\n\t\t\t\tduk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx);\n\t\t\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, dest, x->regconst);\n\t\t\t\treturn dest;\n\t\t\t}\n\t\t\treturn x->regconst;\n\t\t}\n\n\t\tDUK_ASSERT(forced_reg < 0 && !DUK__ISCONST(x->regconst));\n\t\tif ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) && !DUK__ISREG_TEMP(comp_ctx, x->regconst)) {\n\t\t\tduk_regconst_t dest = DUK__ALLOCTEMP(comp_ctx);\n\t\t\tduk__emit_a_bc(comp_ctx, DUK_OP_LDREG, dest, x->regconst);\n\t\t\treturn dest;\n\t\t}\n\t\treturn x->regconst;\n\t}\n\tdefault: {\n\t\tbreak;\n\t}\n\t}\n\n\tDUK_ERROR_INTERNAL(thr);\n\treturn 0;\n}\n\nDUK_LOCAL void duk__ispec_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ispec *x, duk_regconst_t forced_reg) {\n\tDUK_ASSERT(forced_reg >= 0);\n\t(void) duk__ispec_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/);\n}\n\n/* Coerce an duk_ivalue to a 'plain' value by generating the necessary\n * arithmetic operations, property access, or variable access bytecode.\n * The duk_ivalue argument ('x') is converted into a plain value as a\n * side effect.\n */\nDUK_LOCAL void duk__ivalue_toplain_raw(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_regconst_t forced_reg) {\n\tduk_hthread *thr = comp_ctx->thr;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__ivalue_toplain_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, \"\n\t                     \"forced_reg=%ld\",\n\t                     (long) x->t, (long) x->op,\n\t                     (long) x->x1.t, (long) x->x1.regconst,\n\t                     (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx),\n\t                     (long) x->x2.t, (long) x->x2.regconst,\n\t                     (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx),\n\t                     (long) forced_reg));\n\n\tswitch (x->t) {\n\tcase DUK_IVAL_PLAIN: {\n\t\treturn;\n\t}\n\t/* XXX: support unary arithmetic ivalues (useful?) */\n\tcase DUK_IVAL_ARITH: {\n\t\tduk_regconst_t arg1;\n\t\tduk_regconst_t arg2;\n\t\tduk_regconst_t dest;\n\t\tduk_tval *tv1;\n\t\tduk_tval *tv2;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"arith to plain conversion\"));\n\n\t\t/* inline arithmetic check for constant values */\n\t\t/* XXX: use the exactly same arithmetic function here as in executor */\n\t\tif (x->x1.t == DUK_ISPEC_VALUE && x->x2.t == DUK_ISPEC_VALUE && x->t == DUK_IVAL_ARITH) {\n\t\t\ttv1 = DUK_GET_TVAL_POSIDX(thr, x->x1.valstack_idx);\n\t\t\ttv2 = DUK_GET_TVAL_POSIDX(thr, x->x2.valstack_idx);\n\t\t\tDUK_ASSERT(tv1 != NULL);\n\t\t\tDUK_ASSERT(tv2 != NULL);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"arith: tv1=%!T, tv2=%!T\",\n\t\t\t                     (duk_tval *) tv1,\n\t\t\t                     (duk_tval *) tv2));\n\n\t\t\tif (DUK_TVAL_IS_NUMBER(tv1) && DUK_TVAL_IS_NUMBER(tv2)) {\n\t\t\t\tduk_double_t d1 = DUK_TVAL_GET_NUMBER(tv1);\n\t\t\t\tduk_double_t d2 = DUK_TVAL_GET_NUMBER(tv2);\n\t\t\t\tduk_double_t d3;\n\t\t\t\tduk_bool_t accept_fold = 1;\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"arith inline check: d1=%lf, d2=%lf, op=%ld\",\n\t\t\t\t                     (double) d1, (double) d2, (long) x->op));\n\t\t\t\tswitch (x->op) {\n\t\t\t\tcase DUK_OP_ADD: {\n\t\t\t\t\td3 = d1 + d2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase DUK_OP_SUB: {\n\t\t\t\t\td3 = d1 - d2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase DUK_OP_MUL: {\n\t\t\t\t\td3 = d1 * d2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase DUK_OP_DIV: {\n\t\t\t\t\td3 = d1 / d2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase DUK_OP_EXP: {\n\t\t\t\t\td3 = (duk_double_t) duk_js_arith_pow((double) d1, (double) d2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\td3 = 0.0;  /* Won't be used, but silence MSVC /W4 warning. */\n\t\t\t\t\taccept_fold = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (accept_fold) {\n\t\t\t\t\tduk_double_union du;\n\t\t\t\t\tdu.d = d3;\n\t\t\t\t\tDUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);\n\t\t\t\t\td3 = du.d;\n\n\t\t\t\t\tx->t = DUK_IVAL_PLAIN;\n\t\t\t\t\tDUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE);\n\t\t\t\t\tDUK_TVAL_SET_NUMBER(tv1, d3);  /* old value is number: no refcount */\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (x->op == DUK_OP_ADD && DUK_TVAL_IS_STRING(tv1) && DUK_TVAL_IS_STRING(tv2)) {\n\t\t\t\t/* Inline string concatenation.  No need to check for\n\t\t\t\t * symbols, as all inputs are valid Ecmascript strings.\n\t\t\t\t */\n\t\t\t\tduk_dup(thr, x->x1.valstack_idx);\n\t\t\t\tduk_dup(thr, x->x2.valstack_idx);\n\t\t\t\tduk_concat(thr, 2);\n\t\t\t\tduk_replace(thr, x->x1.valstack_idx);\n\t\t\t\tx->t = DUK_IVAL_PLAIN;\n\t\t\t\tDUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\targ1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);\n\t\targ2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);\n\n\t\t/* If forced reg, use it as destination.  Otherwise try to\n\t\t * use either coerced ispec if it is a temporary.\n\t\t */\n\t\tif (forced_reg >= 0) {\n\t\t\tdest = forced_reg;\n\t\t} else if (DUK__ISREG_TEMP(comp_ctx, arg1)) {\n\t\t\tdest = arg1;\n\t\t} else if (DUK__ISREG_TEMP(comp_ctx, arg2)) {\n\t\t\tdest = arg2;\n\t\t} else {\n\t\t\tdest = DUK__ALLOCTEMP(comp_ctx);\n\t\t}\n\n\t\tDUK_ASSERT(DUK__ISREG(dest));\n\t\tduk__emit_a_b_c(comp_ctx, x->op | DUK__EMIT_FLAG_BC_REGCONST, dest, arg1, arg2);\n\n\t\tduk__ivalue_regconst(x, dest);\n\t\treturn;\n\t}\n\tcase DUK_IVAL_PROP: {\n\t\t/* XXX: very similar to DUK_IVAL_ARITH - merge? */\n\t\tduk_regconst_t arg1;\n\t\tduk_regconst_t arg2;\n\t\tduk_regconst_t dest;\n\n\t\t/* Need a short reg/const, does not have to be a mutable temp. */\n\t\targ1 = duk__ispec_toregconst_raw(comp_ctx, &x->x1, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);\n\t\targ2 = duk__ispec_toregconst_raw(comp_ctx, &x->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_SHORT /*flags*/);\n\n\t\t/* Pick a destination register.  If either base value or key\n\t\t * happens to be a temp value, reuse it as the destination.\n\t\t *\n\t\t * XXX: The temp must be a \"mutable\" one, i.e. such that no\n\t\t * other expression is using it anymore.  Here this should be\n\t\t * the case because the value of a property access expression\n\t\t * is neither the base nor the key, but the lookup result.\n\t\t */\n\n\t\tif (forced_reg >= 0) {\n\t\t\tdest = forced_reg;\n\t\t} else if (DUK__ISREG_TEMP(comp_ctx, arg1)) {\n\t\t\tdest = arg1;\n\t\t} else if (DUK__ISREG_TEMP(comp_ctx, arg2)) {\n\t\t\tdest = arg2;\n\t\t} else {\n\t\t\tdest = DUK__ALLOCTEMP(comp_ctx);\n\t\t}\n\n\t\tduk__emit_a_b_c(comp_ctx,\n\t\t                DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t                dest,\n\t\t                arg1,\n\t\t                arg2);\n\n\t\tduk__ivalue_regconst(x, dest);\n\t\treturn;\n\t}\n\tcase DUK_IVAL_VAR: {\n\t\t/* x1 must be a string */\n\t\tduk_regconst_t dest;\n\t\tduk_regconst_t reg_varbind;\n\t\tduk_regconst_t rc_varname;\n\n\t\tDUK_ASSERT(x->x1.t == DUK_ISPEC_VALUE);\n\n\t\tduk_dup(thr, x->x1.valstack_idx);\n\t\tif (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {\n\t\t\tduk__ivalue_regconst(x, reg_varbind);\n\t\t} else {\n\t\t\tdest = (forced_reg >= 0 ? forced_reg : DUK__ALLOCTEMP(comp_ctx));\n\t\t\tduk__emit_a_bc(comp_ctx, DUK_OP_GETVAR, dest, rc_varname);\n\t\t\tduk__ivalue_regconst(x, dest);\n\t\t}\n\t\treturn;\n\t}\n\tcase DUK_IVAL_NONE:\n\tdefault: {\n\t\tDUK_D(DUK_DPRINT(\"invalid ivalue type: %ld\", (long) x->t));\n\t\tbreak;\n\t}\n\t}\n\n\tDUK_ERROR_INTERNAL(thr);\n\treturn;\n}\n\n/* evaluate to plain value, no forced register (temp/bound reg both ok) */\nDUK_LOCAL void duk__ivalue_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\tduk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/);\n}\n\n/* evaluate to final form (e.g. coerce GETPROP to code), throw away temp */\nDUK_LOCAL void duk__ivalue_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\tduk_regconst_t temp;\n\n\t/* If duk__ivalue_toplain_raw() allocates a temp, forget it and\n\t * restore next temp state.\n\t */\n\ttemp = DUK__GETTEMP(comp_ctx);\n\tduk__ivalue_toplain_raw(comp_ctx, x, -1 /*forced_reg*/);\n\tDUK__SETTEMP(comp_ctx, temp);\n}\n\n/* Coerce an duk_ivalue to a register or constant; result register may\n * be a temp or a bound register.\n *\n * The duk_ivalue argument ('x') is converted into a regconst as a\n * side effect.\n */\nDUK_LOCAL\nduk_regconst_t duk__ivalue_toregconst_raw(duk_compiler_ctx *comp_ctx,\n                                          duk_ivalue *x,\n                                          duk_regconst_t forced_reg,\n                                          duk_small_uint_t flags) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_regconst_t reg;\n\tDUK_UNREF(thr);\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__ivalue_toregconst_raw(): x={t=%ld,op=%ld,x1={%ld:%ld:%!T},x2={%ld:%ld:%!T}}, \"\n\t                     \"forced_reg=%ld, flags 0x%08lx: allow_const=%ld require_temp=%ld require_short=%ld\",\n\t                     (long) x->t, (long) x->op,\n\t                     (long) x->x1.t, (long) x->x1.regconst,\n\t                     (duk_tval *) duk_get_tval(thr, x->x1.valstack_idx),\n\t                     (long) x->x2.t, (long) x->x2.regconst,\n\t                     (duk_tval *) duk_get_tval(thr, x->x2.valstack_idx),\n\t                     (long) forced_reg,\n\t                     (unsigned long) flags,\n\t                     (long) ((flags & DUK__IVAL_FLAG_ALLOW_CONST) ? 1 : 0),\n\t                     (long) ((flags & DUK__IVAL_FLAG_REQUIRE_TEMP) ? 1 : 0),\n\t                     (long) ((flags & DUK__IVAL_FLAG_REQUIRE_SHORT) ? 1 : 0)));\n\n\t/* first coerce to a plain value */\n\tduk__ivalue_toplain_raw(comp_ctx, x, forced_reg);\n\tDUK_ASSERT(x->t == DUK_IVAL_PLAIN);\n\n\t/* then to a register */\n\treg = duk__ispec_toregconst_raw(comp_ctx, &x->x1, forced_reg, flags);\n\tduk__ivalue_regconst(x, reg);\n\n\treturn reg;\n}\n\nDUK_LOCAL duk_regconst_t duk__ivalue_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\treturn duk__ivalue_toregconst_raw(comp_ctx, x, -1, 0 /*flags*/);\n}\n\n#if 0  /* unused */\nDUK_LOCAL duk_regconst_t duk__ivalue_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\treturn duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/);\n}\n#endif\n\nDUK_LOCAL void duk__ivalue_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *x, duk_int_t forced_reg) {\n\tDUK_ASSERT(forced_reg >= 0);\n\t(void) duk__ivalue_toregconst_raw(comp_ctx, x, forced_reg, 0 /*flags*/);\n}\n\nDUK_LOCAL duk_regconst_t duk__ivalue_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\treturn duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);\n}\n\nDUK_LOCAL duk_regconst_t duk__ivalue_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *x) {\n\treturn duk__ivalue_toregconst_raw(comp_ctx, x, -1, DUK__IVAL_FLAG_ALLOW_CONST | DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/);\n}\n\n/* The issues below can be solved with better flags */\n\n/* XXX: many operations actually want toforcedtemp() -- brand new temp? */\n/* XXX: need a toplain_ignore() which will only coerce a value to a temp\n * register if it might have a side effect.  Side-effect free values do not\n * need to be coerced.\n */\n\n/*\n *  Identifier handling\n */\n\nDUK_LOCAL duk_regconst_t duk__lookup_active_register_binding(duk_compiler_ctx *comp_ctx) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_hstring *h_varname;\n\tduk_regconst_t ret;\n\n\tDUK_DDD(DUK_DDDPRINT(\"resolving identifier reference to '%!T'\",\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/*\n\t *  Special name handling\n\t */\n\n\th_varname = duk_known_hstring(thr, -1);\n\n\tif (h_varname == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"flagging function as accessing 'arguments'\"));\n\t\tcomp_ctx->curr_func.id_access_arguments = 1;\n\t}\n\n\t/*\n\t *  Inside one or more 'with' statements fall back to slow path always.\n\t *  (See e.g. test-stmt-with.js.)\n\t */\n\n\tif (comp_ctx->curr_func.with_depth > 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"identifier lookup inside a 'with' -> fall back to slow path\"));\n\t\tgoto slow_path_own;\n\t}\n\n\t/*\n\t *  Any catch bindings (\"catch (e)\") also affect identifier binding.\n\t *\n\t *  Currently, the varmap is modified for the duration of the catch\n\t *  clause to ensure any identifier accesses with the catch variable\n\t *  name will use slow path.\n\t */\n\n\tduk_get_prop(thr, comp_ctx->curr_func.varmap_idx);\n\tif (duk_is_number(thr, -1)) {\n\t\tret = duk_to_int(thr, -1);\n\t\tduk_pop(thr);\n\t} else {\n\t\tduk_pop(thr);\n\t\tif (comp_ctx->curr_func.catch_depth > 0 || comp_ctx->curr_func.with_depth > 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"slow path access from inside a try-catch or with needs _Varmap\"));\n\t\t\tgoto slow_path_own;\n\t\t} else {\n\t\t\t/* In this case we're doing a variable lookup that doesn't\n\t\t\t * match our own variables, so _Varmap won't be needed at\n\t\t\t * run time.\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"slow path access outside of try-catch and with, no need for _Varmap\"));\n\t\t\tgoto slow_path_notown;\n\t\t}\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"identifier lookup -> reg %ld\", (long) ret));\n\treturn ret;\n\n slow_path_notown:\n\tDUK_DDD(DUK_DDDPRINT(\"identifier lookup -> slow path, not own variable\"));\n\n\tcomp_ctx->curr_func.id_access_slow = 1;\n\treturn (duk_regconst_t) -1;\n\n slow_path_own:\n\tDUK_DDD(DUK_DDDPRINT(\"identifier lookup -> slow path, may be own variable\"));\n\n\tcomp_ctx->curr_func.id_access_slow = 1;\n\tcomp_ctx->curr_func.id_access_slow_own = 1;\n\treturn (duk_regconst_t) -1;\n}\n\n/* Lookup an identifier name in the current varmap, indicating whether the\n * identifier is register-bound and if not, allocating a constant for the\n * identifier name.  Returns 1 if register-bound, 0 otherwise.  Caller can\n * also check (out_reg_varbind >= 0) to check whether or not identifier is\n * register bound.  The caller must NOT use out_rc_varname at all unless\n * return code is 0 or out_reg_varbind is < 0; this is becuase out_rc_varname\n * is unsigned and doesn't have a \"unused\" / none value.\n */\nDUK_LOCAL duk_bool_t duk__lookup_lhs(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_regconst_t reg_varbind;\n\tduk_regconst_t rc_varname;\n\n\t/* [ ... varname ] */\n\n\tduk_dup_top(thr);\n\treg_varbind = duk__lookup_active_register_binding(comp_ctx);\n\n\tif (reg_varbind >= 0) {\n\t\t*out_reg_varbind = reg_varbind;\n\t\t*out_rc_varname = 0;  /* duk_regconst_t is unsigned, so use 0 as dummy value (ignored by caller) */\n\t\tduk_pop(thr);\n\t\treturn 1;\n\t} else {\n\t\trc_varname = duk__getconst(comp_ctx);\n\t\t*out_reg_varbind = -1;\n\t\t*out_rc_varname = rc_varname;\n\t\treturn 0;\n\t}\n}\n\n/*\n *  Label handling\n *\n *  Labels are initially added with flags prohibiting both break and continue.\n *  When the statement type is finally uncovered (after potentially multiple\n *  labels), all the labels are updated to allow/prohibit break and continue.\n */\n\nDUK_LOCAL void duk__add_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_int_t pc_label, duk_int_t label_id) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_size_t n;\n\tduk_size_t new_size;\n\tduk_uint8_t *p;\n\tduk_labelinfo *li_start, *li;\n\n\t/* Duplicate (shadowing) labels are not allowed, except for the empty\n\t * labels (which are used as default labels for switch and iteration\n\t * statements).\n\t *\n\t * We could also allow shadowing of non-empty pending labels without any\n\t * other issues than breaking the required label shadowing requirements\n\t * of the E5 specification, see Section 12.12.\n\t */\n\n\tp = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos);\n\tli_start = (duk_labelinfo *) (void *) p;\n\tli = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));\n\tn = (duk_size_t) (li - li_start);\n\n\twhile (li > li_start) {\n\t\tli--;\n\n\t\tif (li->h_label == h_label && h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) {\n\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_DUPLICATE_LABEL);\n\t\t}\n\t}\n\n\tduk_push_hstring(thr, h_label);\n\tDUK_ASSERT(n <= DUK_UARRIDX_MAX);  /* label limits */\n\t(void) duk_put_prop_index(thr, comp_ctx->curr_func.labelnames_idx, (duk_uarridx_t) n);\n\n\tnew_size = (n + 1) * sizeof(duk_labelinfo);\n\tduk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, new_size);\n\t/* XXX: slack handling, slow now */\n\n\t/* relookup after possible realloc */\n\tp = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos);\n\tli_start = (duk_labelinfo *) (void *) p;\n\tDUK_UNREF(li_start);  /* silence scan-build warning */\n\tli = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));\n\tli--;\n\n\t/* Labels can be used for iteration statements but also for other statements,\n\t * in particular a label can be used for a block statement.  All cases of a\n\t * named label accept a 'break' so that flag is set here.  Iteration statements\n\t * also allow 'continue', so that flag is updated when we figure out the\n\t * statement type.\n\t */\n\n\tli->flags = DUK_LABEL_FLAG_ALLOW_BREAK;\n\tli->label_id = label_id;\n\tli->h_label = h_label;\n\tli->catch_depth = comp_ctx->curr_func.catch_depth;   /* catch depth from current func */\n\tli->pc_label = pc_label;\n\n\tDUK_DDD(DUK_DDDPRINT(\"registered label: flags=0x%08lx, id=%ld, name=%!O, catch_depth=%ld, pc_label=%ld\",\n\t                     (unsigned long) li->flags, (long) li->label_id, (duk_heaphdr *) li->h_label,\n\t                     (long) li->catch_depth, (long) li->pc_label));\n}\n\n/* Update all labels with matching label_id. */\nDUK_LOCAL void duk__update_label_flags(duk_compiler_ctx *comp_ctx, duk_int_t label_id, duk_small_uint_t flags) {\n\tduk_uint8_t *p;\n\tduk_labelinfo *li_start, *li;\n\n\tp = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(comp_ctx->thr->heap, comp_ctx->curr_func.h_labelinfos);\n\tli_start = (duk_labelinfo *) (void *) p;\n\tli = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));\n\n\t/* Match labels starting from latest; once label_id no longer matches, we can\n\t * safely exit without checking the rest of the labels (only the topmost labels\n\t * are ever updated).\n\t */\n\twhile (li > li_start) {\n\t\tli--;\n\n\t\tif (li->label_id != label_id) {\n\t\t\tbreak;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"updating (overwriting) label flags for li=%p, label_id=%ld, flags=%ld\",\n\t\t                     (void *) li, (long) label_id, (long) flags));\n\n\t\tli->flags = flags;\n\t}\n}\n\n/* Lookup active label information.  Break/continue distinction is necessary to handle switch\n * statement related labels correctly: a switch will only catch a 'break', not a 'continue'.\n *\n * An explicit label cannot appear multiple times in the active set, but empty labels (unlabelled\n * iteration and switch statements) can.  A break will match the closest unlabelled or labelled\n * statement.  A continue will match the closest unlabelled or labelled iteration statement.  It is\n * a syntax error if a continue matches a labelled switch statement; because an explicit label cannot\n * be duplicated, the continue cannot match any valid label outside the switch.\n *\n * A side effect of these rules is that a LABEL statement related to a switch should never actually\n * catch a continue abrupt completion at run-time.  Hence an INVALID opcode can be placed in the\n * continue slot of the switch's LABEL statement.\n */\n\n/* XXX: awkward, especially the bunch of separate output values -> output struct? */\nDUK_LOCAL void duk__lookup_active_label(duk_compiler_ctx *comp_ctx, duk_hstring *h_label, duk_bool_t is_break, duk_int_t *out_label_id, duk_int_t *out_label_catch_depth, duk_int_t *out_label_pc, duk_bool_t *out_is_closest) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_uint8_t *p;\n\tduk_labelinfo *li_start, *li_end, *li;\n\tduk_bool_t match = 0;\n\n\tDUK_DDD(DUK_DDDPRINT(\"looking up active label: label='%!O', is_break=%ld\",\n\t                     (duk_heaphdr *) h_label, (long) is_break));\n\n\tDUK_UNREF(thr);\n\n\tp = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, comp_ctx->curr_func.h_labelinfos);\n\tli_start = (duk_labelinfo *) (void *) p;\n\tli_end = (duk_labelinfo *) (void *) (p + DUK_HBUFFER_GET_SIZE(comp_ctx->curr_func.h_labelinfos));\n\tli = li_end;\n\n\t/* Match labels starting from latest label because there can be duplicate empty\n\t * labels in the label set.\n\t */\n\twhile (li > li_start) {\n\t\tli--;\n\n\t\tif (li->h_label != h_label) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"labelinfo[%ld] ->'%!O' != %!O\",\n\t\t\t                     (long) (li - li_start),\n\t\t\t                     (duk_heaphdr *) li->h_label,\n\t\t\t                     (duk_heaphdr *) h_label));\n\t\t\tcontinue;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"labelinfo[%ld] -> '%!O' label name matches (still need to check type)\",\n\t\t                     (long) (li - li_start), (duk_heaphdr *) h_label));\n\n\t\t/* currently all labels accept a break, so no explicit check for it now */\n\t\tDUK_ASSERT(li->flags & DUK_LABEL_FLAG_ALLOW_BREAK);\n\n\t\tif (is_break) {\n\t\t\t/* break matches always */\n\t\t\tmatch = 1;\n\t\t\tbreak;\n\t\t} else if (li->flags & DUK_LABEL_FLAG_ALLOW_CONTINUE) {\n\t\t\t/* iteration statements allow continue */\n\t\t\tmatch = 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t/* continue matched this label -- we can only continue if this is the empty\n\t\t\t * label, for which duplication is allowed, and thus there is hope of\n\t\t\t * finding a match deeper in the label stack.\n\t\t\t */\n\t\t\tif (h_label != DUK_HTHREAD_STRING_EMPTY_STRING(thr)) {\n\t\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL);\n\t\t\t} else {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"continue matched an empty label which does not \"\n\t\t\t\t                     \"allow a continue -> continue lookup deeper in label stack\"));\n\t\t\t}\n\t\t}\n\t}\n\t/* XXX: match flag is awkward, rework */\n\tif (!match) {\n\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LABEL);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"label match: %!O -> label_id %ld, catch_depth=%ld, pc_label=%ld\",\n\t                     (duk_heaphdr *) h_label, (long) li->label_id,\n\t                     (long) li->catch_depth, (long) li->pc_label));\n\n\t*out_label_id = li->label_id;\n\t*out_label_catch_depth = li->catch_depth;\n\t*out_label_pc = li->pc_label;\n\t*out_is_closest = (li == li_end - 1);\n}\n\nDUK_LOCAL void duk__reset_labels_to_length(duk_compiler_ctx *comp_ctx, duk_size_t len) {\n\tduk_hthread *thr = comp_ctx->thr;\n\n\tduk_set_length(thr, comp_ctx->curr_func.labelnames_idx, len);\n\tduk_hbuffer_resize(thr, comp_ctx->curr_func.h_labelinfos, sizeof(duk_labelinfo) * len);\n}\n\n/*\n *  Expression parsing: duk__expr_nud(), duk__expr_led(), duk__expr_lbp(), and helpers.\n *\n *  - duk__expr_nud(): (\"null denotation\"): process prev_token as a \"start\" of an expression (e.g. literal)\n *  - duk__expr_led(): (\"left denotation\"): process prev_token in the \"middle\" of an expression (e.g. operator)\n *  - duk__expr_lbp(): (\"left-binding power\"): return left-binding power of curr_token\n */\n\n/* object literal key tracking flags */\n#define DUK__OBJ_LIT_KEY_PLAIN  (1 << 0)  /* key encountered as a plain property */\n#define DUK__OBJ_LIT_KEY_GET    (1 << 1)  /* key encountered as a getter */\n#define DUK__OBJ_LIT_KEY_SET    (1 << 2)  /* key encountered as a setter */\n\nDUK_LOCAL void duk__nud_array_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_regconst_t reg_obj;                 /* result reg */\n\tduk_regconst_t reg_temp;                /* temp reg */\n\tduk_regconst_t temp_start;              /* temp reg value for start of loop */\n\tduk_small_uint_t max_init_values;  /* max # of values initialized in one MPUTARR set */\n\tduk_small_uint_t num_values;       /* number of values in current MPUTARR set */\n\tduk_uarridx_t curr_idx;            /* current (next) array index */\n\tduk_uarridx_t start_idx;           /* start array index of current MPUTARR set */\n\tduk_uarridx_t init_idx;            /* last array index explicitly initialized, +1 */\n\tduk_bool_t require_comma;          /* next loop requires a comma */\n#if !defined(DUK_USE_PREFER_SIZE)\n\tduk_int_t pc_newarr;\n\tduk_compiler_instr *instr;\n#endif\n\n\t/* DUK_TOK_LBRACKET already eaten, current token is right after that */\n\tDUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LBRACKET);\n\n\tmax_init_values = DUK__MAX_ARRAY_INIT_VALUES;  /* XXX: depend on available temps? */\n\n\treg_obj = DUK__ALLOCTEMP(comp_ctx);\n#if !defined(DUK_USE_PREFER_SIZE)\n\tpc_newarr = duk__get_current_pc(comp_ctx);\n#endif\n\tduk__emit_bc(comp_ctx, DUK_OP_NEWARR, reg_obj);  /* XXX: patch initial size hint afterwards? */\n\ttemp_start = DUK__GETTEMP(comp_ctx);\n\n\t/*\n\t *  Emit initializers in sets of maximum max_init_values.\n\t *  Corner cases such as single value initializers do not have\n\t *  special handling now.\n\t *\n\t *  Elided elements must not be emitted as 'undefined' values,\n\t *  because such values would be enumerable (which is incorrect).\n\t *  Also note that trailing elisions must be reflected in the\n\t *  length of the final array but cause no elements to be actually\n\t *  inserted.\n\t */\n\n\tcurr_idx = 0;\n\tinit_idx = 0;         /* tracks maximum initialized index + 1 */\n\tstart_idx = 0;\n\trequire_comma = 0;\n\n\tfor (;;) {\n\t\tnum_values = 0;\n\t\tDUK__SETTEMP(comp_ctx, temp_start);\n\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) {\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (;;) {\n\t\t\tif (comp_ctx->curr_token.t == DUK_TOK_RBRACKET) {\n\t\t\t\t/* the outer loop will recheck and exit */\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* comma check */\n\t\t\tif (require_comma) {\n\t\t\t\tif (comp_ctx->curr_token.t == DUK_TOK_COMMA) {\n\t\t\t\t\t/* comma after a value, expected */\n\t\t\t\t\tduk__advance(comp_ctx);\n\t\t\t\t\trequire_comma = 0;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tgoto syntax_error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (comp_ctx->curr_token.t == DUK_TOK_COMMA) {\n\t\t\t\t\t/* elision - flush */\n\t\t\t\t\tcurr_idx++;\n\t\t\t\t\tduk__advance(comp_ctx);\n\t\t\t\t\t/* if num_values > 0, MPUTARR emitted by outer loop after break */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* else an array initializer element */\n\n\t\t\t/* initial index */\n\t\t\tif (num_values == 0) {\n\t\t\t\tstart_idx = curr_idx;\n\t\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\t\t\tduk__emit_load_int32(comp_ctx, reg_temp, (duk_int32_t) start_idx);\n\t\t\t}\n\n\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);   /* alloc temp just in case, to update max temp */\n\t\t\tDUK__SETTEMP(comp_ctx, reg_temp);\n\t\t\tduk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/);\n\t\t\tDUK__SETTEMP(comp_ctx, reg_temp + 1);\n\n\t\t\tnum_values++;\n\t\t\tcurr_idx++;\n\t\t\trequire_comma = 1;\n\n\t\t\tif (num_values >= max_init_values) {\n\t\t\t\t/* MPUTARR emitted by outer loop */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (num_values > 0) {\n\t\t\t/* - A is a source register (it's not a write target, but used\n\t\t\t *   to identify the target object) but can be shuffled.\n\t\t\t * - B cannot be shuffled normally because it identifies a range\n\t\t\t *   of registers, the emitter has special handling for this\n\t\t\t *   (the \"no shuffle\" flag must not be set).\n\t\t\t * - C is a non-register number and cannot be shuffled, but\n\t\t\t *   never needs to be.\n\t\t\t */\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                DUK_OP_MPUTARR |\n\t\t\t                    DUK__EMIT_FLAG_NO_SHUFFLE_C |\n\t\t\t                    DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t                reg_obj,\n\t\t\t                temp_start,\n\t\t\t                (duk_regconst_t) (num_values + 1));\n\t\t\tinit_idx = start_idx + num_values;\n\n\t\t\t/* num_values and temp_start reset at top of outer loop */\n\t\t}\n\t}\n\n\t/* Update initil size for NEWARR, doesn't need to be exact and is\n\t * capped at A field limit.\n\t */\n#if !defined(DUK_USE_PREFER_SIZE)\n\tinstr = duk__get_instr_ptr(comp_ctx, pc_newarr);\n\tinstr->ins |= DUK_ENC_OP_A(0, curr_idx > DUK_BC_A_MAX ? DUK_BC_A_MAX : curr_idx);\n#endif\n\n\tDUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RBRACKET);\n\tduk__advance(comp_ctx);\n\n\tDUK_DDD(DUK_DDDPRINT(\"array literal done, curridx=%ld, initidx=%ld\",\n\t                     (long) curr_idx, (long) init_idx));\n\n\t/* trailing elisions? */\n\tif (curr_idx > init_idx) {\n\t\t/* yes, must set array length explicitly */\n\t\tDUK_DDD(DUK_DDDPRINT(\"array literal has trailing elisions which affect its length\"));\n\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\tduk__emit_load_int32(comp_ctx, reg_temp, (duk_int_t) curr_idx);\n\t\tduk__emit_a_bc(comp_ctx,\n\t\t               DUK_OP_SETALEN | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t               reg_obj,\n\t\t               reg_temp);\n\t}\n\n\tDUK__SETTEMP(comp_ctx, temp_start);\n\n\tduk__ivalue_regconst(res, reg_obj);\n\treturn;\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARRAY_LITERAL);\n}\n\ntypedef struct {\n\tduk_regconst_t reg_obj;\n\tduk_regconst_t temp_start;\n\tduk_small_uint_t num_pairs;\n\tduk_small_uint_t num_total_pairs;\n} duk__objlit_state;\n\nDUK_LOCAL void duk__objlit_flush_keys(duk_compiler_ctx *comp_ctx, duk__objlit_state *st) {\n\tif (st->num_pairs > 0) {\n\t\t/* - A is a source register (it's not a write target, but used\n\t\t *   to identify the target object) but can be shuffled.\n\t\t * - B cannot be shuffled normally because it identifies a range\n\t\t *   of registers, the emitter has special handling for this\n\t\t *   (the \"no shuffle\" flag must not be set).\n\t\t * - C is a non-register number and cannot be shuffled, but\n\t\t *   never needs to be.\n\t\t */\n\t\tDUK_ASSERT(st->num_pairs > 0);\n\t\tduk__emit_a_b_c(comp_ctx,\n\t\t                DUK_OP_MPUTOBJ |\n\t\t                    DUK__EMIT_FLAG_NO_SHUFFLE_C |\n\t\t                    DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t                st->reg_obj,\n\t\t                st->temp_start,\n\t\t                (duk_regconst_t) (st->num_pairs * 2));\n\t\tst->num_total_pairs += st->num_pairs;\n\t\tst->num_pairs = 0;\n\t}\n\tDUK__SETTEMP(comp_ctx, st->temp_start);\n}\n\nDUK_LOCAL duk_bool_t duk__objlit_load_key(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_token *tok, duk_regconst_t reg_temp) {\n\tif (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t_nores == DUK_TOK_STRING) {\n\t\t/* same handling for identifiers and strings */\n\t\tDUK_ASSERT(tok->str1 != NULL);\n\t\tduk_push_hstring(comp_ctx->thr, tok->str1);\n\t} else if (tok->t == DUK_TOK_NUMBER) {\n\t\t/* numbers can be loaded as numbers and coerced on the fly */\n\t\tduk_push_number(comp_ctx->thr, tok->num);\n\t} else {\n\t\treturn 1;  /* error */\n\t}\n\n\tduk__ivalue_plain_fromstack(comp_ctx, res);\n\tDUK__SETTEMP(comp_ctx, reg_temp + 1);\n\tduk__ivalue_toforcedreg(comp_ctx, res, reg_temp);\n\tDUK__SETTEMP(comp_ctx, reg_temp + 1);\n\treturn 0;\n}\n\nDUK_LOCAL void duk__nud_object_literal(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk__objlit_state st;\n\tduk_regconst_t reg_temp;          /* temp reg */\n\tduk_small_uint_t max_init_pairs;  /* max # of key-value pairs initialized in one MPUTOBJ set */\n\tduk_bool_t first;                 /* first value: comma must not precede the value */\n\tduk_bool_t is_set, is_get;        /* temps */\n#if !defined(DUK_USE_PREFER_SIZE)\n\tduk_int_t pc_newobj;\n\tduk_compiler_instr *instr;\n#endif\n\n\tDUK_ASSERT(comp_ctx->prev_token.t == DUK_TOK_LCURLY);\n\n\tmax_init_pairs = DUK__MAX_OBJECT_INIT_PAIRS;  /* XXX: depend on available temps? */\n\n\tst.reg_obj = DUK__ALLOCTEMP(comp_ctx);    /* target object */\n\tst.temp_start = DUK__GETTEMP(comp_ctx);   /* start of MPUTOBJ argument list */\n\tst.num_pairs = 0;                         /* number of key/value pairs emitted for current MPUTOBJ set */\n\tst.num_total_pairs = 0;                   /* number of key/value pairs emitted overall */\n\n#if !defined(DUK_USE_PREFER_SIZE)\n\tpc_newobj = duk__get_current_pc(comp_ctx);\n#endif\n\tduk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, st.reg_obj);\n\n\t/*\n\t *  Emit initializers in sets of maximum max_init_pairs keys.\n\t *  Setter/getter is handled separately and terminates the\n\t *  current set of initializer values.  Corner cases such as\n\t *  single value initializers do not have special handling now.\n\t */\n\n\tfirst = 1;\n\tfor (;;) {\n\t\t/*\n\t\t *  ES5 and ES2015+ provide a lot of different PropertyDefinition\n\t\t *  formats, see http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer.\n\t\t *\n\t\t *  PropertyName can be IdentifierName (includes reserved words), a string\n\t\t *  literal, or a number literal.  Note that IdentifierName allows 'get' and\n\t\t *  'set' too, so we need to look ahead to the next token to distinguish:\n\t\t *\n\t\t *     { get : 1 }\n\t\t *\n\t\t *  and\n\t\t *\n\t\t *     { get foo() { return 1 } }\n\t\t *     { get get() { return 1 } }    // 'get' as getter propertyname\n\t\t *\n\t\t *  Finally, a trailing comma is allowed.\n\t\t *\n\t\t *  Key name is coerced to string at compile time (and ends up as a\n\t\t *  a string constant) even for numeric keys (e.g. \"{1:'foo'}\").\n\t\t *  These could be emitted using e.g. LDINT, but that seems hardly\n\t\t *  worth the effort and would increase code size.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"object literal loop, curr_token->t = %ld\",\n\t\t                     (long) comp_ctx->curr_token.t));\n\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (first) {\n\t\t\tfirst = 0;\n\t\t} else {\n\t\t\tif (comp_ctx->curr_token.t != DUK_TOK_COMMA) {\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\t\t\tduk__advance(comp_ctx);\n\t\t\tif (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {\n\t\t\t\t/* trailing comma followed by rcurly */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* Advance to get one step of lookup. */\n\t\tduk__advance(comp_ctx);\n\n\t\t/* Flush current MPUTOBJ if enough many pairs gathered. */\n\t\tif (st.num_pairs >= max_init_pairs) {\n\t\t\tduk__objlit_flush_keys(comp_ctx, &st);\n\t\t\tDUK_ASSERT(st.num_pairs == 0);\n\t\t}\n\n\t\t/* Reset temp register state and reserve reg_temp and\n\t\t * reg_temp + 1 for handling the current property.\n\t\t */\n\t\tDUK__SETTEMP(comp_ctx, st.temp_start + 2 * (duk_regconst_t) st.num_pairs);\n\t\treg_temp = DUK__ALLOCTEMPS(comp_ctx, 2);\n\n\t\t/* NOTE: \"get\" and \"set\" are not officially ReservedWords and the lexer\n\t\t * currently treats them always like ordinary identifiers (DUK_TOK_GET\n\t\t * and DUK_TOK_SET are unused).  They need to be detected based on the\n\t\t * identifier string content.\n\t\t */\n\n\t\tis_get = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&\n\t\t          comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_GET(thr));\n\t\tis_set = (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&\n\t\t          comp_ctx->prev_token.str1 == DUK_HTHREAD_STRING_SET(thr));\n\t\tif ((is_get || is_set) && comp_ctx->curr_token.t != DUK_TOK_COLON) {\n\t\t\t/* getter/setter */\n\t\t\tduk_int_t fnum;\n\n\t\t\tduk__objlit_flush_keys(comp_ctx, &st);\n\t\t\tDUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start);  /* 2 regs are guaranteed to be allocated w.r.t. temp_max */\n\t\t\treg_temp = DUK__ALLOCTEMPS(comp_ctx, 2);\n\n\t\t\tif (duk__objlit_load_key(comp_ctx, res, &comp_ctx->curr_token, reg_temp) != 0) {\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\n\t\t\t/* curr_token = get/set name */\n\t\t\tfnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_GETSET);\n\n\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t               DUK_OP_CLOSURE,\n\t\t\t               st.temp_start + 1,\n\t\t\t               (duk_regconst_t) fnum);\n\n\t\t\t/* Slot C is used in a non-standard fashion (range of regs),\n\t\t\t * emitter code has special handling for it (must not set the\n\t\t\t * \"no shuffle\" flag).\n\t\t\t */\n\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t              (is_get ? DUK_OP_INITGET : DUK_OP_INITSET) | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t              st.reg_obj,\n\t\t\t              st.temp_start);   /* temp_start+0 = key, temp_start+1 = closure */\n\n\t\t\tDUK_ASSERT(st.num_pairs == 0);  /* temp state is reset on next loop */\n#if defined(DUK_USE_ES6)\n\t\t} else if (comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&\n\t\t           (comp_ctx->curr_token.t == DUK_TOK_COMMA || comp_ctx->curr_token.t == DUK_TOK_RCURLY)) {\n\t\t\tduk_bool_t load_rc;\n\n\t\t\tload_rc = duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp);\n\t\t\tDUK_UNREF(load_rc);\n\t\t\tDUK_ASSERT(load_rc == 0);  /* always succeeds because token is identifier */\n\n\t\t\tduk__ivalue_var_hstring(comp_ctx, res, comp_ctx->prev_token.str1);\n\t\t\tDUK_ASSERT(DUK__GETTEMP(comp_ctx) == reg_temp + 1);\n\t\t\tduk__ivalue_toforcedreg(comp_ctx, res, reg_temp + 1);\n\n\t\t\tst.num_pairs++;\n\t\t} else if ((comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER ||\n\t\t            comp_ctx->prev_token.t == DUK_TOK_STRING ||\n\t\t            comp_ctx->prev_token.t == DUK_TOK_NUMBER) &&\n\t\t           comp_ctx->curr_token.t == DUK_TOK_LPAREN) {\n\t\t\tduk_int_t fnum;\n\n\t\t\t/* Parsing-wise there's a small hickup here: the token parsing\n\t\t\t * state is one step too advanced for the function parse helper\n\t\t\t * compared to other cases.  The current solution is an extra\n\t\t\t * flag to indicate whether function parsing should use the\n\t\t\t * current or the previous token to starting parsing from.\n\t\t\t */\n\n\t\t\tif (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) {\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\n\t\t\tfnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_USE_PREVTOKEN | DUK__FUNC_FLAG_METDEF);\n\n\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t               DUK_OP_CLOSURE,\n\t\t\t               reg_temp + 1,\n\t\t\t               (duk_regconst_t) fnum);\n\n\t\t\tst.num_pairs++;\n#endif  /* DUK_USE_ES6 */\n\t\t} else {\n#if defined(DUK_USE_ES6)\n\t\t\tif (comp_ctx->prev_token.t == DUK_TOK_LBRACKET) {\n\t\t\t\t/* ES2015 computed property name.  Executor ToPropertyKey()\n\t\t\t\t * coerces the key at runtime.\n\t\t\t\t */\n\t\t\t\tDUK__SETTEMP(comp_ctx, reg_temp);\n\t\t\t\tduk__expr_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR, reg_temp);\n\t\t\t\tduk__advance_expect(comp_ctx, DUK_TOK_RBRACKET);\n\n\t\t\t\t/* XXX: If next token is '(' we're dealing with\n\t\t\t\t * the method shorthand with a computed name,\n\t\t\t\t * e.g. { [Symbol.for('foo')](a,b) {} }.  This\n\t\t\t\t * form is not yet supported and causes a\n\t\t\t\t * SyntaxError on the DUK_TOK_COLON check below.\n\t\t\t\t */\n\t\t\t}\n\t\t\telse\n#endif  /* DUK_USE_ES6 */\n\t\t\t{\n\t\t\t\tif (duk__objlit_load_key(comp_ctx, res, &comp_ctx->prev_token, reg_temp) != 0) {\n\t\t\t\t\tgoto syntax_error;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tduk__advance_expect(comp_ctx, DUK_TOK_COLON);\n\n\t\t\tDUK__SETTEMP(comp_ctx, reg_temp + 1);\n\t\t\tduk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp + 1 /*forced_reg*/);\n\n\t\t\tst.num_pairs++;\n\t\t}\n\t}  /* property loop */\n\n\t/* Flush remaining properties. */\n\tduk__objlit_flush_keys(comp_ctx, &st);\n\tDUK_ASSERT(st.num_pairs == 0);\n\tDUK_ASSERT(DUK__GETTEMP(comp_ctx) == st.temp_start);\n\n\t/* Update initial size for NEWOBJ.  The init size doesn't need to be\n\t * exact as the purpose is just to avoid object resizes in common\n\t * cases.  The size is capped to field A limit, and will be too high\n\t * if the object literal contains duplicate keys (this is harmless but\n\t * increases memory traffic if the object is compacted later on).\n\t */\n#if !defined(DUK_USE_PREFER_SIZE)\n\tinstr = duk__get_instr_ptr(comp_ctx, pc_newobj);\n\tinstr->ins |= DUK_ENC_OP_A(0, st.num_total_pairs > DUK_BC_A_MAX ? DUK_BC_A_MAX : st.num_total_pairs);\n#endif\n\n\tDUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY);\n\tduk__advance(comp_ctx);\n\n\tduk__ivalue_regconst(res, st.reg_obj);\n\treturn;\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_OBJECT_LITERAL);\n}\n\n/* Parse argument list.  Arguments are written to temps starting from\n * \"next temp\".  Returns number of arguments parsed.  Expects left paren\n * to be already eaten, and eats the right paren before returning.\n */\nDUK_LOCAL duk_int_t duk__parse_arguments(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_int_t nargs = 0;\n\tduk_regconst_t reg_temp;\n\n\t/* Note: expect that caller has already eaten the left paren */\n\n\tDUK_DDD(DUK_DDDPRINT(\"start parsing arguments, prev_token.t=%ld, curr_token.t=%ld\",\n\t                     (long) comp_ctx->prev_token.t, (long) comp_ctx->curr_token.t));\n\n\tfor (;;) {\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_RPAREN) {\n\t\t\tbreak;\n\t\t}\n\t\tif (nargs > 0) {\n\t\t\tduk__advance_expect(comp_ctx, DUK_TOK_COMMA);\n\t\t}\n\n\t\t/* We want the argument expression value to go to \"next temp\"\n\t\t * without additional moves.  That should almost always be the\n\t\t * case, but we double check after expression parsing.\n\t\t *\n\t\t * This is not the cleanest possible approach.\n\t\t */\n\n\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);  /* bump up \"allocated\" reg count, just in case */\n\t\tDUK__SETTEMP(comp_ctx, reg_temp);\n\n\t\t/* binding power must be high enough to NOT allow comma expressions directly */\n\t\tduk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp);  /* always allow 'in', coerce to 'tr' just in case */\n\n\t\tDUK__SETTEMP(comp_ctx, reg_temp + 1);\n\t\tnargs++;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"argument #%ld written into reg %ld\", (long) nargs, (long) reg_temp));\n\t}\n\n\t/* eat the right paren */\n\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\tDUK_DDD(DUK_DDDPRINT(\"end parsing arguments\"));\n\n\treturn nargs;\n}\n\nDUK_LOCAL duk_bool_t duk__expr_is_empty(duk_compiler_ctx *comp_ctx) {\n\t/* empty expressions can be detected conveniently with nud/led counts */\n\treturn (comp_ctx->curr_func.nud_count == 0) &&\n\t       (comp_ctx->curr_func.led_count == 0);\n}\n\nDUK_LOCAL void duk__expr_nud(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_token *tk;\n\tduk_regconst_t temp_at_entry;\n\tduk_small_uint_t tok;\n\tduk_uint32_t args;  /* temp variable to pass constants and flags to shared code */\n\n\t/*\n\t *  ctx->prev_token     token to process with duk__expr_nud()\n\t *  ctx->curr_token     updated by caller\n\t *\n\t *  Note: the token in the switch below has already been eaten.\n\t */\n\n\ttemp_at_entry = DUK__GETTEMP(comp_ctx);\n\n\tcomp_ctx->curr_func.nud_count++;\n\n\ttk = &comp_ctx->prev_token;\n\ttok = tk->t;\n\tres->t = DUK_IVAL_NONE;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__expr_nud(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld\",\n\t                     (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level));\n\n\tswitch (tok) {\n\n\t/* PRIMARY EXPRESSIONS */\n\n\tcase DUK_TOK_THIS: {\n\t\tduk_regconst_t reg_temp;\n\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\tduk__emit_bc(comp_ctx,\n\t\t             DUK_OP_LDTHIS,\n\t\t             reg_temp);\n\t\tduk__ivalue_regconst(res, reg_temp);\n\t\treturn;\n\t}\n\tcase DUK_TOK_IDENTIFIER: {\n\t\tduk__ivalue_var_hstring(comp_ctx, res, tk->str1);\n\t\treturn;\n\t}\n\tcase DUK_TOK_NULL: {\n\t\tduk_push_null(thr);\n\t\tgoto plain_value;\n\t}\n\tcase DUK_TOK_TRUE: {\n\t\tduk_push_true(thr);\n\t\tgoto plain_value;\n\t}\n\tcase DUK_TOK_FALSE: {\n\t\tduk_push_false(thr);\n\t\tgoto plain_value;\n\t}\n\tcase DUK_TOK_NUMBER: {\n\t\tduk_push_number(thr, tk->num);\n\t\tgoto plain_value;\n\t}\n\tcase DUK_TOK_STRING: {\n\t\tDUK_ASSERT(tk->str1 != NULL);\n\t\tduk_push_hstring(thr, tk->str1);\n\t\tgoto plain_value;\n\t}\n\tcase DUK_TOK_REGEXP: {\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\tduk_regconst_t reg_temp;\n\t\tduk_regconst_t rc_re_bytecode;  /* const */\n\t\tduk_regconst_t rc_re_source;    /* const */\n\n\t\tDUK_ASSERT(tk->str1 != NULL);\n\t\tDUK_ASSERT(tk->str2 != NULL);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"emitting regexp op, str1=%!O, str2=%!O\",\n\t\t                     (duk_heaphdr *) tk->str1,\n\t\t                     (duk_heaphdr *) tk->str2));\n\n\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\tduk_push_hstring(thr, tk->str1);\n\t\tduk_push_hstring(thr, tk->str2);\n\n\t\t/* [ ... pattern flags ] */\n\n\t\tduk_regexp_compile(thr);\n\n\t\t/* [ ... escaped_source bytecode ] */\n\n\t\trc_re_bytecode = duk__getconst(comp_ctx);\n\t\trc_re_source = duk__getconst(comp_ctx);\n\n\t\tduk__emit_a_b_c(comp_ctx,\n\t\t                DUK_OP_REGEXP | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t                reg_temp /*a*/,\n\t\t                rc_re_bytecode /*b*/,\n\t\t                rc_re_source /*c*/);\n\n\t\tduk__ivalue_regconst(res, reg_temp);\n\t\treturn;\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\tgoto syntax_error;\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t}\n\tcase DUK_TOK_LBRACKET: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"parsing array literal\"));\n\t\tduk__nud_array_literal(comp_ctx, res);\n\t\treturn;\n\t}\n\tcase DUK_TOK_LCURLY: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"parsing object literal\"));\n\t\tduk__nud_object_literal(comp_ctx, res);\n\t\treturn;\n\t}\n\tcase DUK_TOK_LPAREN: {\n\t\tduk_bool_t prev_allow_in;\n\n\t\tcomp_ctx->curr_func.paren_level++;\n\t\tprev_allow_in = comp_ctx->curr_func.allow_in;\n\t\tcomp_ctx->curr_func.allow_in = 1; /* reset 'allow_in' for parenthesized expression */\n\n\t\tduk__expr(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);  /* Expression, terminates at a ')' */\n\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\t\tcomp_ctx->curr_func.allow_in = prev_allow_in;\n\t\tcomp_ctx->curr_func.paren_level--;\n\t\treturn;\n\t}\n\n\t/* MEMBER/NEW/CALL EXPRESSIONS */\n\n\tcase DUK_TOK_NEW: {\n\t\t/*\n\t\t *  Parsing an expression starting with 'new' is tricky because\n\t\t *  there are multiple possible productions deriving from\n\t\t *  LeftHandSideExpression which begin with 'new'.\n\t\t *\n\t\t *  We currently resort to one-token lookahead to distinguish the\n\t\t *  cases.  Hopefully this is correct.  The binding power must be\n\t\t *  such that parsing ends at an LPAREN (CallExpression) but not at\n\t\t *  a PERIOD or LBRACKET (MemberExpression).\n\t\t *\n\t\t *  See doc/compiler.rst for discussion on the parsing approach,\n\t\t *  and testcases/test-dev-new.js for a bunch of documented tests.\n\t\t */\n\n\t\tduk_regconst_t reg_target;\n\t\tduk_int_t nargs;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"begin parsing new expression\"));\n\n\t\treg_target = DUK__ALLOCTEMPS(comp_ctx, 2);\n\n#if defined(DUK_USE_ES6)\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_PERIOD) {\n\t\t\t/* new.target */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"new.target\"));\n\t\t\tduk__advance(comp_ctx);\n\t\t\tif (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER ||\n\t\t\t    !duk_hstring_equals_ascii_cstring(comp_ctx->curr_token.str1, \"target\")) {\n\t\t\t\tgoto syntax_error_newtarget;\n\t\t\t}\n\t\t\tif (comp_ctx->curr_func.is_global) {\n\t\t\t\tgoto syntax_error_newtarget;\n\t\t\t}\n\t\t\tduk__advance(comp_ctx);\n\t\t\tduk__emit_bc(comp_ctx,\n\t\t\t             DUK_OP_NEWTARGET,\n\t\t\t             reg_target);\n\t\t\tduk__ivalue_regconst(res, reg_target);\n\t\t\treturn;\n\t\t}\n#endif  /* DUK_USE_ES6 */\n\n\t\tduk__expr_toforcedreg(comp_ctx, res, DUK__BP_CALL /*rbp_flags*/, reg_target /*forced_reg*/);\n\t\tduk__emit_bc(comp_ctx, DUK_OP_NEWOBJ, reg_target + 1);  /* default instance */\n\t\tDUK__SETTEMP(comp_ctx, reg_target + 2);\n\n\t\t/* XXX: 'new obj.noSuch()' doesn't use GETPROPC now which\n\t\t * makes the error message worse than for obj.noSuch().\n\t\t */\n\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_LPAREN) {\n\t\t\t/* 'new' MemberExpression Arguments */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"new expression has argument list\"));\n\t\t\tduk__advance(comp_ctx);\n\t\t\tnargs = duk__parse_arguments(comp_ctx, res);  /* parse args starting from \"next temp\", reg_target + 1 */\n\t\t\t/* right paren eaten */\n\t\t} else {\n\t\t\t/* 'new' MemberExpression */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"new expression has no argument list\"));\n\t\t\tnargs = 0;\n\t\t}\n\n\t\tduk__emit_a_bc(comp_ctx,\n\t\t              DUK_OP_CALL0 | DUK_BC_CALL_FLAG_CONSTRUCT,\n\t\t              nargs /*num_args*/,\n\t\t              reg_target /*target*/);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"end parsing new expression\"));\n\n\t\tduk__ivalue_regconst(res, reg_target);\n\t\treturn;\n\t}\n\n\t/* FUNCTION EXPRESSIONS */\n\n\tcase DUK_TOK_FUNCTION: {\n\t\t/* Function expression.  Note that any statement beginning with 'function'\n\t\t * is handled by the statement parser as a function declaration, or a\n\t\t * non-standard function expression/statement (or a SyntaxError).  We only\n\t\t * handle actual function expressions (occurring inside an expression) here.\n\t\t *\n\t\t * O(depth^2) parse count for inner functions is handled by recording a\n\t\t * lexer offset on the first compilation pass, so that the function can\n\t\t * be efficiently skipped on the second pass.  This is encapsulated into\n\t\t * duk__parse_func_like_fnum().\n\t\t */\n\n\t\tduk_regconst_t reg_temp;\n\t\tduk_int_t fnum;\n\n\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\n\t\t/* curr_token follows 'function' */\n\t\tfnum = duk__parse_func_like_fnum(comp_ctx, 0 /*flags*/);\n\t\tDUK_DDD(DUK_DDDPRINT(\"parsed inner function -> fnum %ld\", (long) fnum));\n\n\t\tduk__emit_a_bc(comp_ctx,\n\t\t               DUK_OP_CLOSURE,\n\t\t               reg_temp /*a*/,\n\t\t               (duk_regconst_t) fnum /*bc*/);\n\n\t\tduk__ivalue_regconst(res, reg_temp);\n\t\treturn;\n\t}\n\n\t/* UNARY EXPRESSIONS */\n\n\tcase DUK_TOK_DELETE: {\n\t\t/* Delete semantics are a bit tricky.  The description in E5 specification\n\t\t * is kind of confusing, because it distinguishes between resolvability of\n\t\t * a reference (which is only known at runtime) seemingly at compile time\n\t\t * (= SyntaxError throwing).\n\t\t */\n\t\tduk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\t\tif (res->t == DUK_IVAL_VAR) {\n\t\t\t/* not allowed in strict mode, regardless of whether resolves;\n\t\t\t * in non-strict mode DELVAR handles both non-resolving and\n\t\t\t * resolving cases (the specification description is a bit confusing).\n\t\t\t */\n\n\t\t\tduk_regconst_t reg_temp;\n\t\t\tduk_regconst_t reg_varbind;\n\t\t\tduk_regconst_t rc_varname;\n\n\t\t\tif (comp_ctx->curr_func.is_strict) {\n\t\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_CANNOT_DELETE_IDENTIFIER);\n\t\t\t}\n\n\t\t\tDUK__SETTEMP(comp_ctx, temp_at_entry);\n\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\n\t\t\tduk_dup(thr, res->x1.valstack_idx);\n\t\t\tif (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {\n\t\t\t\t/* register bound variables are non-configurable -> always false */\n\t\t\t\tduk__emit_bc(comp_ctx,\n\t\t\t\t             DUK_OP_LDFALSE,\n\t\t\t\t             reg_temp);\n\t\t\t} else {\n\t\t\t\tduk_dup(thr, res->x1.valstack_idx);\n\t\t\t\trc_varname = duk__getconst(comp_ctx);\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               DUK_OP_DELVAR,\n\t\t\t\t               reg_temp,\n\t\t\t\t               rc_varname);\n\t\t\t}\n\t\t\tduk__ivalue_regconst(res, reg_temp);\n\t\t} else if (res->t == DUK_IVAL_PROP) {\n\t\t\tduk_regconst_t reg_temp;\n\t\t\tduk_regconst_t reg_obj;\n\t\t\tduk_regconst_t rc_key;\n\n\t\t\tDUK__SETTEMP(comp_ctx, temp_at_entry);\n\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\t\treg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/);  /* don't allow const */\n\t\t\trc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                DUK_OP_DELPROP | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t                reg_temp,\n\t\t\t                reg_obj,\n\t\t\t                rc_key);\n\n\t\t\tduk__ivalue_regconst(res, reg_temp);\n\t\t} else {\n\t\t\t/* non-Reference deletion is always 'true', even in strict mode */\n\t\t\tduk_push_true(thr);\n\t\t\tgoto plain_value;\n\t\t}\n\t\treturn;\n\t}\n\tcase DUK_TOK_VOID: {\n\t\tduk__expr_toplain_ignore(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\t\tduk_push_undefined(thr);\n\t\tgoto plain_value;\n\t}\n\tcase DUK_TOK_TYPEOF: {\n\t\t/* 'typeof' must handle unresolvable references without throwing\n\t\t * a ReferenceError (E5 Section 11.4.3).  Register mapped values\n\t\t * will never be unresolvable so special handling is only required\n\t\t * when an identifier is a \"slow path\" one.\n\t\t */\n\t\tduk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\n\t\tif (res->t == DUK_IVAL_VAR) {\n\t\t\tduk_regconst_t reg_varbind;\n\t\t\tduk_regconst_t rc_varname;\n\t\t\tduk_regconst_t reg_temp;\n\n\t\t\tduk_dup(thr, res->x1.valstack_idx);\n\t\t\tif (!duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"typeof for an identifier name which could not be resolved \"\n\t\t\t\t                     \"at compile time, need to use special run-time handling\"));\n\t\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               DUK_OP_TYPEOFID,\n\t\t\t\t               reg_temp,\n\t\t\t\t               rc_varname);\n\t\t\t\tduk__ivalue_regconst(res, reg_temp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\targs = DUK_OP_TYPEOF;\n\t\tgoto unary;\n\t}\n\tcase DUK_TOK_INCREMENT: {\n\t\targs = (DUK_OP_PREINCP << 8) + DUK_OP_PREINCR;\n\t\tgoto preincdec;\n\t}\n\tcase DUK_TOK_DECREMENT: {\n\t\targs = (DUK_OP_PREDECP << 8) + DUK_OP_PREDECR;\n\t\tgoto preincdec;\n\t}\n\tcase DUK_TOK_ADD: {\n\t\t/* unary plus */\n\t\tduk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\t\tif (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE &&\n\t\t    duk_is_number(thr, res->x1.valstack_idx)) {\n\t\t\t/* unary plus of a number is identity */\n\t\t\treturn;\n\t\t}\n\t\targs = DUK_OP_UNP;\n\t\tgoto unary;\n\t}\n\tcase DUK_TOK_SUB: {\n\t\t/* unary minus */\n\t\tduk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\t\tif (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE &&\n\t\t    duk_is_number(thr, res->x1.valstack_idx)) {\n\t\t\t/* this optimization is important to handle negative literals\n\t\t\t * (which are not directly provided by the lexical grammar)\n\t\t\t */\n\t\t\tduk_tval *tv_num;\n\t\t\tduk_double_union du;\n\n\t\t\ttv_num = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx);\n\t\t\tDUK_ASSERT(tv_num != NULL);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_num));\n\t\t\tdu.d = DUK_TVAL_GET_NUMBER(tv_num);\n\t\t\tdu.d = -du.d;\n\t\t\tDUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);\n\t\t\tDUK_TVAL_SET_NUMBER(tv_num, du.d);\n\t\t\treturn;\n\t\t}\n\t\targs = DUK_OP_UNM;\n\t\tgoto unary;\n\t}\n\tcase DUK_TOK_BNOT: {\n\t\tduk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\t\targs = DUK_OP_BNOT;\n\t\tgoto unary;\n\t}\n\tcase DUK_TOK_LNOT: {\n\t\tduk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\t\tif (res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_VALUE) {\n\t\t\t/* Very minimal inlining to handle common idioms '!0' and '!1',\n\t\t\t * and also boolean arguments like '!false' and '!true'.\n\t\t\t */\n\t\t\tduk_tval *tv_val;\n\n\t\t\ttv_val = DUK_GET_TVAL_POSIDX(thr, res->x1.valstack_idx);\n\t\t\tDUK_ASSERT(tv_val != NULL);\n\t\t\tif (DUK_TVAL_IS_NUMBER(tv_val)) {\n\t\t\t\tduk_double_t d;\n\t\t\t\td = DUK_TVAL_GET_NUMBER(tv_val);\n\t\t\t\tif (d == 0.0) {\n\t\t\t\t\t/* Matches both +0 and -0 on purpose. */\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"inlined lnot: !0 -> true\"));\n\t\t\t\t\tDUK_TVAL_SET_BOOLEAN_TRUE(tv_val);\n\t\t\t\t\treturn;\n\t\t\t\t} else if (d == 1.0) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"inlined lnot: !1 -> false\"));\n\t\t\t\t\tDUK_TVAL_SET_BOOLEAN_FALSE(tv_val);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (DUK_TVAL_IS_BOOLEAN(tv_val)) {\n\t\t\t\tduk_small_uint_t v;\n\t\t\t\tv = DUK_TVAL_GET_BOOLEAN(tv_val);\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"inlined lnot boolean: %ld\", (long) v));\n\t\t\t\tDUK_ASSERT(v == 0 || v == 1);\n\t\t\t\tDUK_TVAL_SET_BOOLEAN(tv_val, v ^ 0x01);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\targs = DUK_OP_LNOT;\n\t\tgoto unary;\n\t}\n\n\t}  /* end switch */\n\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR);\n\treturn;\n\n unary:\n\t{\n\t\t/* Unary opcodes use just the 'BC' register source because it\n\t\t * matches current shuffle limits, and maps cleanly to 16 high\n\t\t * bits of the opcode.\n\t\t */\n\n\t\tduk_regconst_t reg_src, reg_res;\n\n\t\treg_src = duk__ivalue_toregconst_raw(comp_ctx, res, -1 /*forced_reg*/, 0 /*flags*/);\n\t\tif (DUK__ISREG_TEMP(comp_ctx, reg_src)) {\n\t\t\treg_res = reg_src;\n\t\t} else {\n\t\t\treg_res = DUK__ALLOCTEMP(comp_ctx);\n\t\t}\n\t\tduk__emit_a_bc(comp_ctx,\n\t\t             args,\n\t\t             reg_res,\n\t\t             reg_src);\n\t\tduk__ivalue_regconst(res, reg_res);\n\t\treturn;\n\t}\n\n preincdec:\n\t{\n\t\t/* preincrement and predecrement */\n\t\tduk_regconst_t reg_res;\n\t\tduk_small_uint_t args_op1 = args & 0xff;  /* DUK_OP_PREINCR/DUK_OP_PREDECR */\n\t\tduk_small_uint_t args_op2 = args >> 8;    /* DUK_OP_PREINCP_RR/DUK_OP_PREDECP_RR */\n\n\t\t/* Specific assumptions for opcode numbering. */\n\t\tDUK_ASSERT(DUK_OP_PREINCR + 4 == DUK_OP_PREINCV);\n\t\tDUK_ASSERT(DUK_OP_PREDECR + 4 == DUK_OP_PREDECV);\n\n\t\treg_res = DUK__ALLOCTEMP(comp_ctx);\n\n\t\tduk__expr(comp_ctx, res, DUK__BP_MULTIPLICATIVE /*rbp_flags*/);  /* UnaryExpression */\n\t\tif (res->t == DUK_IVAL_VAR) {\n\t\t\tduk_hstring *h_varname;\n\t\t\tduk_regconst_t reg_varbind;\n\t\t\tduk_regconst_t rc_varname;\n\n\t\t\th_varname = duk_known_hstring(thr, res->x1.valstack_idx);\n\n\t\t\tif (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\n\t\t\tduk_dup(thr, res->x1.valstack_idx);\n\t\t\tif (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               args_op1,  /* e.g. DUK_OP_PREINCR */\n\t\t\t\t               reg_res,\n\t\t\t\t               reg_varbind);\n\t\t\t} else {\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t                args_op1 + 4,  /* e.g. DUK_OP_PREINCV */\n\t\t\t\t                reg_res,\n\t\t\t\t                rc_varname);\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"preincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld\",\n\t\t\t                     (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname));\n\t\t} else if (res->t == DUK_IVAL_PROP) {\n\t\t\tduk_regconst_t reg_obj;  /* allocate to reg only (not const) */\n\t\t\tduk_regconst_t rc_key;\n\t\t\treg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/);  /* don't allow const */\n\t\t\trc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                args_op2 | DUK__EMIT_FLAG_BC_REGCONST,  /* e.g. DUK_OP_PREINCP */\n\t\t\t                reg_res,\n\t\t\t                reg_obj,\n\t\t\t                rc_key);\n\t\t} else {\n\t\t\t/* Technically return value is not needed because INVLHS will\n\t\t\t * unconditially throw a ReferenceError.  Coercion is necessary\n\t\t\t * for proper semantics (consider ToNumber() called for an object).\n\t\t\t * Use DUK_OP_UNP with a dummy register to get ToNumber().\n\t\t\t */\n\n\t\t\tduk__ivalue_toforcedreg(comp_ctx, res, reg_res);\n\t\t\tduk__emit_bc(comp_ctx,\n\t\t\t             DUK_OP_UNP,\n\t\t\t             reg_res);  /* for side effects, result ignored */\n\t\t\tduk__emit_op_only(comp_ctx,\n\t\t\t                  DUK_OP_INVLHS);\n\t\t}\n\t\tDUK__SETTEMP(comp_ctx, reg_res + 1);\n\t\tduk__ivalue_regconst(res, reg_res);\n\t\treturn;\n\t}\n\n plain_value:\n\t{\n\t\t/* Stack top contains plain value */\n\t\tduk__ivalue_plain_fromstack(comp_ctx, res);\n\t\treturn;\n\t}\n\n#if defined(DUK_USE_ES6)\n syntax_error_newtarget:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_NEWTARGET);\n#endif\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION);\n}\n\n/* XXX: add flag to indicate whether caller cares about return value; this\n * affects e.g. handling of assignment expressions.  This change needs API\n * changes elsewhere too.\n */\nDUK_LOCAL void duk__expr_led(duk_compiler_ctx *comp_ctx, duk_ivalue *left, duk_ivalue *res) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_token *tk;\n\tduk_small_uint_t tok;\n\tduk_uint32_t args;  /* temp variable to pass constants and flags to shared code */\n\n\t/*\n\t *  ctx->prev_token     token to process with duk__expr_led()\n\t *  ctx->curr_token     updated by caller\n\t */\n\n\tcomp_ctx->curr_func.led_count++;\n\n\t/* The token in the switch has already been eaten here */\n\ttk = &comp_ctx->prev_token;\n\ttok = tk->t;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__expr_led(), prev_token.t=%ld, allow_in=%ld, paren_level=%ld\",\n\t                     (long) tk->t, (long) comp_ctx->curr_func.allow_in, (long) comp_ctx->curr_func.paren_level));\n\n\t/* XXX: default priority for infix operators is duk__expr_lbp(tok) -> get it here? */\n\n\tswitch (tok) {\n\n\t/* PRIMARY EXPRESSIONS */\n\n\tcase DUK_TOK_PERIOD: {\n\t\t/* Property access expressions are critical for correct LHS ordering,\n\t\t * see comments in duk__expr()!\n\t\t *\n\t\t * A conservative approach would be to use duk__ivalue_totempconst()\n\t\t * for 'left'.  However, allowing a reg-bound variable seems safe here\n\t\t * and is nice because \"foo.bar\" is a common expression.  If the ivalue\n\t\t * is used in an expression a GETPROP will occur before any changes to\n\t\t * the base value can occur.  If the ivalue is used as an assignment\n\t\t * LHS, the assignment code will ensure the base value is safe from\n\t\t * RHS mutation.\n\t\t */\n\n\t\t/* XXX: This now coerces an identifier into a GETVAR to a temp, which\n\t\t * causes an extra LDREG in call setup.  It's sufficient to coerce to a\n\t\t * unary ivalue?\n\t\t */\n\t\tduk__ivalue_toplain(comp_ctx, left);\n\n\t\t/* NB: must accept reserved words as property name */\n\t\tif (comp_ctx->curr_token.t_nores != DUK_TOK_IDENTIFIER) {\n\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER);\n\t\t}\n\n\t\tres->t = DUK_IVAL_PROP;\n\t\tduk__copy_ispec(comp_ctx, &left->x1, &res->x1);  /* left.x1 -> res.x1 */\n\t\tDUK_ASSERT(comp_ctx->curr_token.str1 != NULL);\n\t\tduk_push_hstring(thr, comp_ctx->curr_token.str1);\n\t\tduk_replace(thr, res->x2.valstack_idx);\n\t\tres->x2.t = DUK_ISPEC_VALUE;\n\n\t\t/* special RegExp literal handling after IdentifierName */\n\t\tcomp_ctx->curr_func.reject_regexp_in_adv = 1;\n\n\t\tduk__advance(comp_ctx);\n\t\treturn;\n\t}\n\tcase DUK_TOK_LBRACKET: {\n\t\t/* Property access expressions are critical for correct LHS ordering,\n\t\t * see comments in duk__expr()!\n\t\t */\n\n\t\t/* XXX: optimize temp reg use */\n\t\t/* XXX: similar coercion issue as in DUK_TOK_PERIOD */\n\t\t/* XXX: coerce to regs? it might be better for enumeration use, where the\n\t\t * same PROP ivalue is used multiple times.  Or perhaps coerce PROP further\n\t\t * there?\n\t\t */\n\t\t/* XXX: for simple cases like x['y'] an unnecessary LDREG is\n\t\t * emitted for the base value; could avoid it if we knew that\n\t\t * the key expression is safe (e.g. just a single literal).\n\t\t */\n\n\t\t/* The 'left' value must not be a register bound variable\n\t\t * because it may be mutated during the rest of the expression\n\t\t * and E5.1 Section 11.2.1 specifies the order of evaluation\n\t\t * so that the base value is evaluated first.\n\t\t * See: test-bug-nested-prop-mutate.js.\n\t\t */\n\t\tduk__ivalue_totempconst(comp_ctx, left);\n\t\tduk__expr_toplain(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);  /* Expression, ']' terminates */\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_RBRACKET);\n\n\t\tres->t = DUK_IVAL_PROP;\n\t\tduk__copy_ispec(comp_ctx, &res->x1, &res->x2);   /* res.x1 -> res.x2 */\n\t\tduk__copy_ispec(comp_ctx, &left->x1, &res->x1);  /* left.x1 -> res.x1 */\n\t\treturn;\n\t}\n\tcase DUK_TOK_LPAREN: {\n\t\t/* function call */\n\t\tduk_regconst_t reg_cs = DUK__ALLOCTEMPS(comp_ctx, 2);\n\t\tduk_int_t nargs;\n\t\tduk_small_uint_t call_op = DUK_OP_CALL0;\n\n\t\t/* XXX: attempt to get the call result to \"next temp\" whenever\n\t\t * possible to avoid unnecessary register shuffles.\n\t\t */\n\n\t\t/*\n\t\t *  Setup call: target and 'this' binding.  Three cases:\n\t\t *\n\t\t *    1. Identifier base (e.g. \"foo()\")\n\t\t *    2. Property base (e.g. \"foo.bar()\")\n\t\t *    3. Register base (e.g. \"foo()()\"; i.e. when a return value is a function)\n\t\t */\n\n\t\tif (left->t == DUK_IVAL_VAR) {\n\t\t\tduk_hstring *h_varname;\n\t\t\tduk_regconst_t reg_varbind;\n\t\t\tduk_regconst_t rc_varname;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"function call with identifier base\"));\n\n\t\t\th_varname = duk_known_hstring(thr, left->x1.valstack_idx);\n\t\t\tif (h_varname == DUK_HTHREAD_STRING_EVAL(thr)) {\n\t\t\t\t/* Potential direct eval call detected, flag the CALL\n\t\t\t\t * so that a run-time \"direct eval\" check is made and\n\t\t\t\t * special behavior may be triggered.  Note that this\n\t\t\t\t * does not prevent 'eval' from being register bound.\n\t\t\t\t */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"function call with identifier 'eval' \"\n\t\t\t\t                     \"-> using EVALCALL, marking function \"\n\t\t\t\t                     \"as may_direct_eval\"));\n\t\t\t\tcall_op |= DUK_BC_CALL_FLAG_CALLED_AS_EVAL;\n\t\t\t\tcomp_ctx->curr_func.may_direct_eval = 1;\n\t\t\t}\n\n\t\t\tduk_dup(thr, left->x1.valstack_idx);\n\t\t\tif (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t              DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t\t              reg_varbind,\n\t\t\t\t              reg_cs + 0);\n\t\t\t} else {\n\t\t\t\t/* XXX: expand target register or constant field to\n\t\t\t\t * reduce shuffling.\n\t\t\t\t */\n\t\t\t\tDUK_ASSERT(DUK__ISCONST(rc_varname));\n\t\t\t\tduk__emit_a_b(comp_ctx,\n\t\t\t\t              DUK_OP_CSVAR | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t\t              reg_cs + 0,\n\t\t\t\t              rc_varname);\n\t\t\t}\n\t\t} else if (left->t == DUK_IVAL_PROP) {\n\t\t\t/* Call through a property lookup, E5 Section 11.2.3, step 6.a.i,\n\t\t\t * E5 Section 10.4.3.  There used to be a separate CSPROP opcode\n\t\t\t * but a typical call setup took 3 opcodes (e.g. LDREG, LDCONST,\n\t\t\t * CSPROP) and the same can be achieved with ordinary loads.\n\t\t\t */\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\t\t\tduk_regconst_t reg_key;\n#endif\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"function call with property base\"));\n\n\t\t\t/* XXX: For Math.sin() this generates: LDCONST + LDREG +\n\t\t\t * GETPROPC + call.  The LDREG is unnecessary because LDCONST\n\t\t\t * could be loaded directly into reg_cs + 1.  This doesn't\n\t\t\t * happen now because a variable cannot be in left->x1 of a\n\t\t\t * DUK_IVAL_PROP.  We could notice that left->x1 is a temp\n\t\t\t * and reuse, but it would still be in the wrong position\n\t\t\t * (reg_cs + 0 rather than reg_cs + 1).\n\t\t\t */\n\t\t\tduk__ispec_toforcedreg(comp_ctx, &left->x1, reg_cs + 1);  /* base */\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\t\t\treg_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                DUK_OP_GETPROPC | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t                reg_cs + 0,\n\t\t\t                reg_cs + 1,\n\t\t\t                reg_key);\n#else\n\t\t\tduk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0);  /* base[key] */\n#endif\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"function call with register base\"));\n\n\t\t\tduk__ivalue_toforcedreg(comp_ctx, left, reg_cs + 0);\n#if 0\n\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t               DUK_OP_CSREG | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t               reg_cs + 0,\n\t\t\t               reg_cs + 0);  /* in-place setup */\n#endif\n\t\t\t/* Because of in-place setup, REGCS is equivalent to\n\t\t\t * just this LDUNDEF.\n\t\t\t */\n\t\t\tduk__emit_bc(comp_ctx, DUK_OP_LDUNDEF, reg_cs + 1);\n\t\t}\n\n\t\tDUK__SETTEMP(comp_ctx, reg_cs + 2);\n\t\tnargs = duk__parse_arguments(comp_ctx, res);  /* parse args starting from \"next temp\" */\n\n\t\t/* Tailcalls are handled by back-patching the already emitted opcode\n\t\t * later in return statement parser.\n\t\t */\n\n\t\tduk__emit_a_bc(comp_ctx,\n\t\t               call_op,\n\t\t               (duk_regconst_t) nargs /*numargs*/,\n\t\t               reg_cs /*basereg*/);\n\t\tDUK__SETTEMP(comp_ctx, reg_cs + 1);    /* result in csreg */\n\n\t\tduk__ivalue_regconst(res, reg_cs);\n\t\treturn;\n\t}\n\n\t/* POSTFIX EXPRESSION */\n\n\tcase DUK_TOK_INCREMENT: {\n\t\targs = (DUK_OP_POSTINCP_RR << 16) + (DUK_OP_POSTINCR << 8) + 0;\n\t\tgoto postincdec;\n\t}\n\tcase DUK_TOK_DECREMENT: {\n\t\targs = (DUK_OP_POSTDECP_RR << 16) + (DUK_OP_POSTDECR << 8) + 0;\n\t\tgoto postincdec;\n\t}\n\n\t/* EXPONENTIATION EXPRESSION */\n\n#if defined(DUK_USE_ES7_EXP_OPERATOR)\n\tcase DUK_TOK_EXP: {\n\t\targs = (DUK_OP_EXP << 8) + DUK__BP_EXPONENTIATION - 1;  /* UnaryExpression */\n\t\tgoto binary;\n\t}\n#endif\n\n\t/* MULTIPLICATIVE EXPRESSION */\n\n\tcase DUK_TOK_MUL: {\n\t\targs = (DUK_OP_MUL << 8) + DUK__BP_MULTIPLICATIVE;  /* ExponentiationExpression */\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_DIV: {\n\t\targs = (DUK_OP_DIV << 8) + DUK__BP_MULTIPLICATIVE;  /* ExponentiationExpression */\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_MOD: {\n\t\targs = (DUK_OP_MOD << 8) + DUK__BP_MULTIPLICATIVE;  /* ExponentiationExpression */\n\t\tgoto binary;\n\t}\n\n\t/* ADDITIVE EXPRESSION */\n\n\tcase DUK_TOK_ADD: {\n\t\targs = (DUK_OP_ADD << 8) + DUK__BP_ADDITIVE;  /* MultiplicativeExpression */\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_SUB: {\n\t\targs = (DUK_OP_SUB << 8) + DUK__BP_ADDITIVE;  /* MultiplicativeExpression */\n\t\tgoto binary;\n\t}\n\n\t/* SHIFT EXPRESSION */\n\n\tcase DUK_TOK_ALSHIFT: {\n\t\t/* << */\n\t\targs = (DUK_OP_BASL << 8) + DUK__BP_SHIFT;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_ARSHIFT: {\n\t\t/* >> */\n\t\targs = (DUK_OP_BASR << 8) + DUK__BP_SHIFT;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_RSHIFT: {\n\t\t/* >>> */\n\t\targs = (DUK_OP_BLSR << 8) + DUK__BP_SHIFT;\n\t\tgoto binary;\n\t}\n\n\t/* RELATIONAL EXPRESSION */\n\n\tcase DUK_TOK_LT: {\n\t\t/* < */\n\t\targs = (DUK_OP_LT << 8) + DUK__BP_RELATIONAL;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_GT: {\n\t\targs = (DUK_OP_GT << 8) + DUK__BP_RELATIONAL;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_LE: {\n\t\targs = (DUK_OP_LE << 8) + DUK__BP_RELATIONAL;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_GE: {\n\t\targs = (DUK_OP_GE << 8) + DUK__BP_RELATIONAL;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_INSTANCEOF: {\n\t\targs = (DUK_OP_INSTOF << 8) + DUK__BP_RELATIONAL;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_IN: {\n\t\targs = (DUK_OP_IN << 8) + DUK__BP_RELATIONAL;\n\t\tgoto binary;\n\t}\n\n\t/* EQUALITY EXPRESSION */\n\n\tcase DUK_TOK_EQ: {\n\t\targs = (DUK_OP_EQ << 8) + DUK__BP_EQUALITY;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_NEQ: {\n\t\targs = (DUK_OP_NEQ << 8) + DUK__BP_EQUALITY;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_SEQ: {\n\t\targs = (DUK_OP_SEQ << 8) + DUK__BP_EQUALITY;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_SNEQ: {\n\t\targs = (DUK_OP_SNEQ << 8) + DUK__BP_EQUALITY;\n\t\tgoto binary;\n\t}\n\n\t/* BITWISE EXPRESSIONS */\n\n\tcase DUK_TOK_BAND: {\n\t\targs = (DUK_OP_BAND << 8) + DUK__BP_BAND;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_BXOR: {\n\t\targs = (DUK_OP_BXOR << 8) + DUK__BP_BXOR;\n\t\tgoto binary;\n\t}\n\tcase DUK_TOK_BOR: {\n\t\targs = (DUK_OP_BOR << 8) + DUK__BP_BOR;\n\t\tgoto binary;\n\t}\n\n\t/* LOGICAL EXPRESSIONS */\n\n\tcase DUK_TOK_LAND: {\n\t\t/* syntactically left-associative but parsed as right-associative */\n\t\targs = (1 << 8) + DUK__BP_LAND - 1;\n\t\tgoto binary_logical;\n\t}\n\tcase DUK_TOK_LOR: {\n\t\t/* syntactically left-associative but parsed as right-associative */\n\t\targs = (0 << 8) + DUK__BP_LOR - 1;\n\t\tgoto binary_logical;\n\t}\n\n\t/* CONDITIONAL EXPRESSION */\n\n\tcase DUK_TOK_QUESTION: {\n\t\t/* XXX: common reg allocation need is to reuse a sub-expression's temp reg,\n\t\t * but only if it really is a temp.  Nothing fancy here now.\n\t\t */\n\t\tduk_regconst_t reg_temp;\n\t\tduk_int_t pc_jump1;\n\t\tduk_int_t pc_jump2;\n\n\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\tduk__ivalue_toforcedreg(comp_ctx, left, reg_temp);\n\t\tduk__emit_if_true_skip(comp_ctx, reg_temp);\n\t\tpc_jump1 = duk__emit_jump_empty(comp_ctx);  /* jump to false */\n\t\tduk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/);  /* AssignmentExpression */\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_COLON);\n\t\tpc_jump2 = duk__emit_jump_empty(comp_ctx);  /* jump to end */\n\t\tduk__patch_jump_here(comp_ctx, pc_jump1);\n\t\tduk__expr_toforcedreg(comp_ctx, res, DUK__BP_COMMA /*rbp_flags*/, reg_temp /*forced_reg*/);  /* AssignmentExpression */\n\t\tduk__patch_jump_here(comp_ctx, pc_jump2);\n\n\t\tDUK__SETTEMP(comp_ctx, reg_temp + 1);\n\t\tduk__ivalue_regconst(res, reg_temp);\n\t\treturn;\n\t}\n\n\t/* ASSIGNMENT EXPRESSION */\n\n\tcase DUK_TOK_EQUALSIGN: {\n\t\t/*\n\t\t *  Assignments are right associative, allows e.g.\n\t\t *    a = 5;\n\t\t *    a += b = 9;   // same as a += (b = 9)\n\t\t *  -> expression value 14, a = 14, b = 9\n\t\t *\n\t\t *  Right associativiness is reflected in the BP for recursion,\n\t\t *  \"-1\" ensures assignment operations are allowed.\n\t\t *\n\t\t *  XXX: just use DUK__BP_COMMA (i.e. no need for 2-step bp levels)?\n\t\t */\n\t\targs = (DUK_OP_NONE << 8) + DUK__BP_ASSIGNMENT - 1;   /* DUK_OP_NONE marks a 'plain' assignment */\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_ADD_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_ADD << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_SUB_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_SUB << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_MUL_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_MUL << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_DIV_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_DIV << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_MOD_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_MOD << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n#if defined(DUK_USE_ES7_EXP_OPERATOR)\n\tcase DUK_TOK_EXP_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_EXP << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n#endif\n\tcase DUK_TOK_ALSHIFT_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_BASL << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_ARSHIFT_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_BASR << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_RSHIFT_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_BLSR << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_BAND_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_BAND << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_BOR_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_BOR << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\tcase DUK_TOK_BXOR_EQ: {\n\t\t/* right associative */\n\t\targs = (DUK_OP_BXOR << 8) + DUK__BP_ASSIGNMENT - 1;\n\t\tgoto assign;\n\t}\n\n\t/* COMMA */\n\n\tcase DUK_TOK_COMMA: {\n\t\t/* right associative */\n\n\t\tduk__ivalue_toplain_ignore(comp_ctx, left);  /* need side effects, not value */\n\t\tduk__expr_toplain(comp_ctx, res, DUK__BP_COMMA - 1 /*rbp_flags*/);\n\n\t\t/* return 'res' (of right part) as our result */\n\t\treturn;\n\t}\n\n\tdefault: {\n\t\tbreak;\n\t}\n\t}\n\n\tDUK_D(DUK_DPRINT(\"parse error: unexpected token: %ld\", (long) tok));\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_PARSE_ERROR);\n\treturn;\n\n#if 0\n\t/* XXX: shared handling for 'duk__expr_lhs'? */\n\tif (comp_ctx->curr_func.paren_level == 0 && XXX) {\n\t\tcomp_ctx->curr_func.duk__expr_lhs = 0;\n\t}\n#endif\n\n binary:\n\t/*\n\t *  Shared handling of binary operations\n\t *\n\t *  args = (opcode << 8) + rbp\n\t */\n\t{\n\t\tduk__ivalue_toplain(comp_ctx, left);\n\t\tduk__expr_toplain(comp_ctx, res, args & 0xff /*rbp_flags*/);\n\n\t\t/* combine left->x1 and res->x1 (right->x1, really) -> (left->x1 OP res->x1) */\n\t\tDUK_ASSERT(left->t == DUK_IVAL_PLAIN);\n\t\tDUK_ASSERT(res->t == DUK_IVAL_PLAIN);\n\n\t\tres->t = DUK_IVAL_ARITH;\n\t\tres->op = (args >> 8) & 0xff;\n\n\t\tres->x2.t = res->x1.t;\n\t\tres->x2.regconst = res->x1.regconst;\n\t\tduk_copy(thr, res->x1.valstack_idx, res->x2.valstack_idx);\n\n\t\tres->x1.t = left->x1.t;\n\t\tres->x1.regconst = left->x1.regconst;\n\t\tduk_copy(thr, left->x1.valstack_idx, res->x1.valstack_idx);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"binary op, res: t=%ld, x1.t=%ld, x1.regconst=0x%08lx, x2.t=%ld, x2.regconst=0x%08lx\",\n\t\t                     (long) res->t, (long) res->x1.t, (unsigned long) res->x1.regconst, (long) res->x2.t, (unsigned long) res->x2.regconst));\n\t\treturn;\n\t}\n\n binary_logical:\n\t/*\n\t *  Shared handling for logical AND and logical OR.\n\t *\n\t *  args = (truthval << 8) + rbp\n\t *\n\t *  Truthval determines when to skip right-hand-side.\n\t *  For logical AND truthval=1, for logical OR truthval=0.\n\t *\n\t *  See doc/compiler.rst for discussion on compiling logical\n\t *  AND and OR expressions.  The approach here is very simplistic,\n\t *  generating extra jumps and multiple evaluations of truth values,\n\t *  but generates code on-the-fly with only local back-patching.\n\t *\n\t *  Both logical AND and OR are syntactically left-associated.\n\t *  However, logical ANDs are compiled as right associative\n\t *  expressions, i.e. \"A && B && C\" as \"A && (B && C)\", to allow\n\t *  skip jumps to skip over the entire tail.  Similarly for logical OR.\n\t */\n\n\t{\n\t\tduk_regconst_t reg_temp;\n\t\tduk_int_t pc_jump;\n\t\tduk_small_uint_t args_truthval = args >> 8;\n\t\tduk_small_uint_t args_rbp = args & 0xff;\n\n\t\t/* XXX: unoptimal use of temps, resetting */\n\n\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\n\t\tduk__ivalue_toforcedreg(comp_ctx, left, reg_temp);\n\t\tDUK_ASSERT(DUK__ISREG(reg_temp));\n\t\tduk__emit_bc(comp_ctx,\n\t\t            (args_truthval ? DUK_OP_IFTRUE_R : DUK_OP_IFFALSE_R),\n\t\t            reg_temp);  /* skip jump conditionally */\n\t\tpc_jump = duk__emit_jump_empty(comp_ctx);\n\t\tduk__expr_toforcedreg(comp_ctx, res, args_rbp /*rbp_flags*/, reg_temp /*forced_reg*/);\n\t\tduk__patch_jump_here(comp_ctx, pc_jump);\n\n\t\tduk__ivalue_regconst(res, reg_temp);\n\t\treturn;\n\t}\n\n assign:\n\t/*\n\t *  Shared assignment expression handling\n\t *\n\t *  args = (opcode << 8) + rbp\n\t *\n\t *  If 'opcode' is DUK_OP_NONE, plain assignment without arithmetic.\n\t *  Syntactically valid left-hand-side forms which are not accepted as\n\t *  left-hand-side values (e.g. as in \"f() = 1\") must NOT cause a\n\t *  SyntaxError, but rather a run-time ReferenceError.\n\t *\n\t *  When evaluating X <op>= Y, the LHS (X) is conceptually evaluated\n\t *  to a temporary first.  The RHS is then evaluated.  Finally, the\n\t *  <op> is applied to the initial value of RHS (not the value after\n\t *  RHS evaluation), and written to X.  Doing so concretely generates\n\t *  inefficient code so we'd like to avoid the temporary when possible.\n\t *  See: https://github.com/svaarala/duktape/pull/992.\n\t *\n\t *  The expression value (final LHS value, written to RHS) is\n\t *  conceptually copied into a fresh temporary so that it won't\n\t *  change even if the LHS/RHS values change in outer expressions.\n\t *  For example, it'd be generally incorrect for the expression value\n\t *  to be the RHS register binding, unless there's a guarantee that it\n\t *  won't change during further expression evaluation.  Using the\n\t *  temporary concretely produces inefficient bytecode, so we try to\n\t *  avoid the extra temporary for some known-to-be-safe cases.\n\t *  Currently the only safe case we detect is a \"top level assignment\",\n\t *  for example \"x = y + z;\", where the assignment expression value is\n\t *  ignored.\n\t *  See: test-dev-assign-expr.js and test-bug-assign-mutate-gh381.js.\n\t */\n\n\t{\n\t\tduk_small_uint_t args_op = args >> 8;\n\t\tduk_small_uint_t args_rbp = args & 0xff;\n\t\tduk_bool_t toplevel_assign;\n\n\t\t/* XXX: here we need to know if 'left' is left-hand-side compatible.\n\t\t * That information is no longer available from current expr parsing\n\t\t * state; it would need to be carried into the 'left' ivalue or by\n\t\t * some other means.\n\t\t */\n\n\t\t/* A top-level assignment is e.g. \"x = y;\".  For these it's safe\n\t\t * to use the RHS as-is as the expression value, even if the RHS\n\t\t * is a reg-bound identifier.  The RHS ('res') is right associative\n\t\t * so it has consumed all other assignment level operations; the\n\t\t * only relevant lower binding power construct is comma operator\n\t\t * which will ignore the expression value provided here.  Usually\n\t\t * the top level assignment expression value is ignored, but it\n\t\t * is relevant for e.g. eval code.\n\t\t */\n\t\ttoplevel_assign = (comp_ctx->curr_func.nud_count == 1 && /* one token before */\n\t\t                   comp_ctx->curr_func.led_count == 1);  /* one operator (= assign) */\n\t\tDUK_DDD(DUK_DDDPRINT(\"assignment: nud_count=%ld, led_count=%ld, toplevel_assign=%ld\",\n\t\t                     (long) comp_ctx->curr_func.nud_count,\n\t\t                     (long) comp_ctx->curr_func.led_count,\n\t\t                     (long) toplevel_assign));\n\n\t\tif (left->t == DUK_IVAL_VAR) {\n\t\t\tduk_hstring *h_varname;\n\t\t\tduk_regconst_t reg_varbind;\n\t\t\tduk_regconst_t rc_varname;\n\n\t\t\tDUK_ASSERT(left->x1.t == DUK_ISPEC_VALUE);  /* LHS is already side effect free */\n\n\t\t\th_varname = duk_known_hstring(thr, left->x1.valstack_idx);\n\t\t\tif (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {\n\t\t\t\t/* E5 Section 11.13.1 (and others for other assignments), step 4. */\n\t\t\t\tgoto syntax_error_lvalue;\n\t\t\t}\n\t\t\tduk_dup(thr, left->x1.valstack_idx);\n\t\t\t(void) duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname);\n\n\t\t\tif (args_op == DUK_OP_NONE) {\n\t\t\t\tduk__expr(comp_ctx, res, args_rbp /*rbp_flags*/);\n\t\t\t\tif (toplevel_assign) {\n\t\t\t\t\t/* Any 'res' will do. */\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"plain assignment, toplevel assign, use as is\"));\n\t\t\t\t} else {\n\t\t\t\t\t/* 'res' must be a plain ivalue, and not register-bound variable. */\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"plain assignment, not toplevel assign, ensure not a reg-bound identifier\"));\n\t\t\t\t\tif (res->t != DUK_IVAL_PLAIN || (res->x1.t == DUK_ISPEC_REGCONST &&\n\t\t\t\t\t                                 DUK__ISREG_NOTTEMP(comp_ctx, res->x1.regconst))) {\n\t\t\t\t\t\tduk__ivalue_totempconst(comp_ctx, res);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* For X <op>= Y we need to evaluate the pre-op\n\t\t\t\t * value of X before evaluating the RHS: the RHS\n\t\t\t\t * can change X, but when we do <op> we must use\n\t\t\t\t * the pre-op value.\n\t\t\t\t */\n\t\t\t\tduk_regconst_t reg_temp;\n\n\t\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\n\t\t\t\tif (reg_varbind >= 0) {\n\t\t\t\t\tduk_regconst_t reg_res;\n\t\t\t\t\tduk_regconst_t reg_src;\n\t\t\t\t\tduk_int_t pc_temp_load;\n\t\t\t\t\tduk_int_t pc_before_rhs;\n\t\t\t\t\tduk_int_t pc_after_rhs;\n\n\t\t\t\t\tif (toplevel_assign) {\n\t\t\t\t\t\t/* 'reg_varbind' is the operation result and can also\n\t\t\t\t\t\t * become the expression value for top level assignments\n\t\t\t\t\t\t * such as: \"var x; x += y;\".\n\t\t\t\t\t\t */\n\t\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"<op>= expression is top level, write directly to reg_varbind\"));\n\t\t\t\t\t\treg_res = reg_varbind;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/* Not safe to use 'reg_varbind' as assignment expression\n\t\t\t\t\t\t * value, so go through a temp.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"<op>= expression is not top level, write to reg_temp\"));\n\t\t\t\t\t\treg_res = reg_temp;  /* reg_res should be smallest possible */\n\t\t\t\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Try to optimize X <op>= Y for reg-bound\n\t\t\t\t\t * variables.  Detect side-effect free RHS\n\t\t\t\t\t * narrowly by seeing whether it emits code.\n\t\t\t\t\t * If not, rewind the code emitter and overwrite\n\t\t\t\t\t * the unnecessary temp reg load.\n\t\t\t\t\t */\n\n\t\t\t\t\tpc_temp_load = duk__get_current_pc(comp_ctx);\n\t\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t\t               DUK_OP_LDREG,\n\t\t\t\t\t               reg_temp,\n\t\t\t\t\t               reg_varbind);\n\n\t\t\t\t\tpc_before_rhs = duk__get_current_pc(comp_ctx);\n\t\t\t\t\tduk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);\n\t\t\t\t\tDUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);\n\t\t\t\t\tpc_after_rhs = duk__get_current_pc(comp_ctx);\n\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"pc_temp_load=%ld, pc_before_rhs=%ld, pc_after_rhs=%ld\",\n\t\t\t\t\t                   (long) pc_temp_load, (long) pc_before_rhs,\n\t\t\t\t\t                   (long) pc_after_rhs));\n\n\t\t\t\t\tif (pc_after_rhs == pc_before_rhs) {\n\t\t\t\t\t\t/* Note: if the reg_temp load generated shuffling\n\t\t\t\t\t\t * instructions, we may need to rewind more than\n\t\t\t\t\t\t * one instruction, so use explicit PC computation.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"rhs is side effect free, rewind and avoid unnecessary temp for reg-based <op>=\"));\n\t\t\t\t\t\tDUK_BW_ADD_PTR(comp_ctx->thr, &comp_ctx->curr_func.bw_code, (duk_size_t) (pc_temp_load - pc_before_rhs) * sizeof(duk_compiler_instr));\n\t\t\t\t\t\treg_src = reg_varbind;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"rhs evaluation emitted code, not sure if rhs is side effect free; use temp reg for LHS\"));\n\t\t\t\t\t\treg_src = reg_temp;\n\t\t\t\t\t}\n\n\t\t\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t\t\t                args_op | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t\t\t                reg_res,\n\t\t\t\t\t                reg_src,\n\t\t\t\t\t                res->x1.regconst);\n\n\t\t\t\t\tres->x1.regconst = reg_res;\n\n\t\t\t\t\t/* Ensure compact use of temps. */\n\t\t\t\t\tif (DUK__ISREG_TEMP(comp_ctx, reg_res)) {\n\t\t\t\t\t\tDUK__SETTEMP(comp_ctx, reg_res + 1);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t/* When LHS is not register bound, always go through a\n\t\t\t\t\t * temporary.  No optimization for top level assignment.\n\t\t\t\t\t */\n\n\t\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t\t               DUK_OP_GETVAR,\n\t\t\t\t\t               reg_temp,\n\t\t\t\t\t               rc_varname);\n\n\t\t\t\t\tduk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);\n\t\t\t\t\tDUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);\n\n\t\t\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t\t\t                args_op | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t\t\t                reg_temp,\n\t\t\t\t\t                reg_temp,\n\t\t\t\t\t                res->x1.regconst);\n\t\t\t\t\tres->x1.regconst = reg_temp;\n\t\t\t\t}\n\n\t\t\t\tDUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);\n\t\t\t}\n\n\t\t\t/* At this point 'res' holds the potential expression value.\n\t\t\t * It can be basically any ivalue here, including a reg-bound\n\t\t\t * identifier (if code above deems it safe) or a unary/binary\n\t\t\t * operation.  Operations must be resolved to a side effect free\n\t\t\t * plain value, and the side effects must happen exactly once.\n\t\t\t */\n\n\t\t\tif (reg_varbind >= 0) {\n\t\t\t\tif (res->t != DUK_IVAL_PLAIN) {\n\t\t\t\t\t/* Resolve 'res' directly into the LHS binding, and use\n\t\t\t\t\t * that as the expression value if safe.  If not safe,\n\t\t\t\t\t * resolve to a temp/const and copy to LHS.\n\t\t\t\t\t */\n\t\t\t\t\tif (toplevel_assign) {\n\t\t\t\t\t\tduk__ivalue_toforcedreg(comp_ctx, res, (duk_int_t) reg_varbind);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tduk__ivalue_totempconst(comp_ctx, res);\n\t\t\t\t\t\tduk__copy_ivalue(comp_ctx, res, left);  /* use 'left' as a temp */\n\t\t\t\t\t\tduk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t/* Use 'res' as the expression value (it's side effect\n\t\t\t\t\t * free and may be a plain value, a register, or a\n\t\t\t\t\t * constant) and write it to the LHS binding too.\n\t\t\t\t\t */\n\t\t\t\t\tduk__copy_ivalue(comp_ctx, res, left);  /* use 'left' as a temp */\n\t\t\t\t\tduk__ivalue_toforcedreg(comp_ctx, left, (duk_int_t) reg_varbind);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* Only a reg fits into 'A' so coerce 'res' into a register\n\t\t\t\t * for PUTVAR.\n\t\t\t\t *\n\t\t\t\t * XXX: here the current A/B/C split is suboptimal: we could\n\t\t\t\t * just use 9 bits for reg_res (and support constants) and 17\n\t\t\t\t * instead of 18 bits for the varname const index.\n\t\t\t\t */\n\n\t\t\t\tduk__ivalue_toreg(comp_ctx, res);\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t\t               res->x1.regconst,\n\t\t\t\t               rc_varname);\n\t\t\t}\n\n\t\t\t/* 'res' contains expression value */\n\t\t} else if (left->t == DUK_IVAL_PROP) {\n\t\t\t/* E5 Section 11.13.1 (and others) step 4 never matches for prop writes -> no check */\n\t\t\tduk_regconst_t reg_obj;\n\t\t\tduk_regconst_t rc_key;\n\t\t\tduk_regconst_t rc_res;\n\t\t\tduk_regconst_t reg_temp;\n\n\t\t\t/* Property access expressions ('a[b]') are critical to correct\n\t\t\t * LHS evaluation ordering, see test-dev-assign-eval-order*.js.\n\t\t\t * We must make sure that the LHS target slot (base object and\n\t\t\t * key) don't change during RHS evaluation.  The only concrete\n\t\t\t * problem is a register reference to a variable-bound register\n\t\t\t * (i.e., non-temp).  Require temp regs for both key and base.\n\t\t\t *\n\t\t\t * Don't allow a constant for the object (even for a number\n\t\t\t * etc), as it goes into the 'A' field of the opcode.\n\t\t\t */\n\n\t\t\treg_obj = duk__ispec_toregconst_raw(comp_ctx,\n\t\t\t                                    &left->x1,\n\t\t\t                                    -1 /*forced_reg*/,\n\t\t\t                                    DUK__IVAL_FLAG_REQUIRE_TEMP /*flags*/);\n\n\t\t\trc_key = duk__ispec_toregconst_raw(comp_ctx,\n\t\t\t                                   &left->x2,\n\t\t\t                                   -1 /*forced_reg*/,\n\t\t\t                                   DUK__IVAL_FLAG_REQUIRE_TEMP | DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);\n\n\t\t\t/* Evaluate RHS only when LHS is safe. */\n\n\t\t\tif (args_op == DUK_OP_NONE) {\n\t\t\t\tduk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);\n\t\t\t\tDUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);\n\t\t\t\trc_res = res->x1.regconst;\n\t\t\t} else {\n\t\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t\t                DUK_OP_GETPROP | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t\t                reg_temp,\n\t\t\t\t                reg_obj,\n\t\t\t\t                rc_key);\n\n\t\t\t\tduk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);\n\t\t\t\tDUK_ASSERT(res->t == DUK_IVAL_PLAIN && res->x1.t == DUK_ISPEC_REGCONST);\n\n\t\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t\t                args_op | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t\t                reg_temp,\n\t\t\t\t                reg_temp,\n\t\t\t\t                res->x1.regconst);\n\t\t\t\trc_res = reg_temp;\n\t\t\t}\n\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t                reg_obj,\n\t\t\t                rc_key,\n\t\t\t                rc_res);\n\n\t\t\tduk__ivalue_regconst(res, rc_res);\n\t\t} else {\n\t\t\t/* No support for lvalues returned from new or function call expressions.\n\t\t\t * However, these must NOT cause compile-time SyntaxErrors, but run-time\n\t\t\t * ReferenceErrors.  Both left and right sides of the assignment must be\n\t\t\t * evaluated before throwing a ReferenceError.  For instance:\n\t\t\t *\n\t\t\t *     f() = g();\n\t\t\t *\n\t\t\t * must result in f() being evaluated, then g() being evaluated, and\n\t\t\t * finally, a ReferenceError being thrown.  See E5 Section 11.13.1.\n\t\t\t */\n\n\t\t\tduk_regconst_t rc_res;\n\n\t\t\t/* First evaluate LHS fully to ensure all side effects are out. */\n\t\t\tduk__ivalue_toplain_ignore(comp_ctx, left);\n\n\t\t\t/* Then evaluate RHS fully (its value becomes the expression value too).\n\t\t\t * Technically we'd need the side effect safety check here too, but because\n\t\t\t * we always throw using INVLHS the result doesn't matter.\n\t\t\t */\n\t\t\trc_res = duk__expr_toregconst(comp_ctx, res, args_rbp /*rbp_flags*/);\n\n\t\t\tduk__emit_op_only(comp_ctx, DUK_OP_INVLHS);\n\n\t\t\tduk__ivalue_regconst(res, rc_res);\n\t\t}\n\n\t\treturn;\n\t}\n\n postincdec:\n\t{\n\t\t/*\n\t\t *  Post-increment/decrement will return the original value as its\n\t\t *  result value.  However, even that value will be coerced using\n\t\t *  ToNumber() which is quite awkward.  Specific bytecode opcodes\n\t\t *  are used to handle these semantics.\n\t\t *\n\t\t *  Note that post increment/decrement has a \"no LineTerminator here\"\n\t\t *  restriction.  This is handled by duk__expr_lbp(), which forcibly terminates\n\t\t *  the previous expression if a LineTerminator occurs before '++'/'--'.\n\t\t */\n\n\t\tduk_regconst_t reg_res;\n\t\tduk_small_uint_t args_op1 = (args >> 8) & 0xff;  /* DUK_OP_POSTINCR/DUK_OP_POSTDECR */\n\t\tduk_small_uint_t args_op2 = args >> 16;          /* DUK_OP_POSTINCP_RR/DUK_OP_POSTDECP_RR */\n\n\t\t/* Specific assumptions for opcode numbering. */\n\t\tDUK_ASSERT(DUK_OP_POSTINCR + 4 == DUK_OP_POSTINCV);\n\t\tDUK_ASSERT(DUK_OP_POSTDECR + 4 == DUK_OP_POSTDECV);\n\n\t\treg_res = DUK__ALLOCTEMP(comp_ctx);\n\n\t\tif (left->t == DUK_IVAL_VAR) {\n\t\t\tduk_hstring *h_varname;\n\t\t\tduk_regconst_t reg_varbind;\n\t\t\tduk_regconst_t rc_varname;\n\n\t\t\th_varname = duk_known_hstring(thr, left->x1.valstack_idx);\n\n\t\t\tif (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\n\t\t\tduk_dup(thr, left->x1.valstack_idx);\n\t\t\tif (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               args_op1,  /* e.g. DUK_OP_POSTINCR */\n\t\t\t\t               reg_res,\n\t\t\t\t               reg_varbind);\n\t\t\t} else {\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               args_op1 + 4,  /* e.g. DUK_OP_POSTINCV */\n\t\t\t\t               reg_res,\n\t\t\t\t               rc_varname);\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"postincdec to '%!O' -> reg_varbind=%ld, rc_varname=%ld\",\n\t\t\t                     (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname));\n\t\t} else if (left->t == DUK_IVAL_PROP) {\n\t\t\tduk_regconst_t reg_obj;  /* allocate to reg only (not const) */\n\t\t\tduk_regconst_t rc_key;\n\n\t\t\treg_obj = duk__ispec_toregconst_raw(comp_ctx, &left->x1, -1 /*forced_reg*/, 0 /*flags*/);  /* don't allow const */\n\t\t\trc_key = duk__ispec_toregconst_raw(comp_ctx, &left->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                args_op2 | DUK__EMIT_FLAG_BC_REGCONST,  /* e.g. DUK_OP_POSTINCP */\n\t\t\t                reg_res,\n\t\t\t                reg_obj,\n\t\t\t                rc_key);\n\t\t} else {\n\t\t\t/* Technically return value is not needed because INVLHS will\n\t\t\t * unconditially throw a ReferenceError.  Coercion is necessary\n\t\t\t * for proper semantics (consider ToNumber() called for an object).\n\t\t\t * Use DUK_OP_UNP with a dummy register to get ToNumber().\n\t\t\t */\n\t\t\tduk__ivalue_toforcedreg(comp_ctx, left, reg_res);\n\t\t\tduk__emit_bc(comp_ctx,\n\t\t\t             DUK_OP_UNP,\n\t\t\t             reg_res);  /* for side effects, result ignored */\n\t\t\tduk__emit_op_only(comp_ctx,\n\t\t\t                  DUK_OP_INVLHS);\n\t\t}\n\n\t\tDUK__SETTEMP(comp_ctx, reg_res + 1);\n\t\tduk__ivalue_regconst(res, reg_res);\n\t\treturn;\n\t}\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_EXPRESSION);\n\treturn;\n\n syntax_error_lvalue:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_LVALUE);\n\treturn;\n}\n\nDUK_LOCAL duk_small_uint_t duk__expr_lbp(duk_compiler_ctx *comp_ctx) {\n\tduk_small_uint_t tok = comp_ctx->curr_token.t;\n\n\tDUK_ASSERT_DISABLE(tok >= DUK_TOK_MINVAL);  /* unsigned */\n\tDUK_ASSERT(tok <= DUK_TOK_MAXVAL);\n\tDUK_ASSERT(sizeof(duk__token_lbp) == DUK_TOK_MAXVAL + 1);\n\n\t/* XXX: integrate support for this into led() instead?\n\t * Similar issue as post-increment/post-decrement.\n\t */\n\n\t/* prevent duk__expr_led() by using a binding power less than anything valid */\n\tif (tok == DUK_TOK_IN && !comp_ctx->curr_func.allow_in) {\n\t\treturn 0;\n\t}\n\n\tif ((tok == DUK_TOK_DECREMENT || tok == DUK_TOK_INCREMENT) &&\n\t    (comp_ctx->curr_token.lineterm)) {\n\t\t/* '++' or '--' in a post-increment/decrement position,\n\t\t * and a LineTerminator occurs between the operator and\n\t\t * the preceding expression.  Force the previous expr\n\t\t * to terminate, in effect treating e.g. \"a,b\\n++\" as\n\t\t * \"a,b;++\" (= SyntaxError).\n\t\t */\n\t\treturn 0;\n\t}\n\n\treturn DUK__TOKEN_LBP_GET_BP(duk__token_lbp[tok]);  /* format is bit packed */\n}\n\n/*\n *  Expression parsing.\n *\n *  Upon entry to 'expr' and its variants, 'curr_tok' is assumed to be the\n *  first token of the expression.  Upon exit, 'curr_tok' will be the first\n *  token not part of the expression (e.g. semicolon terminating an expression\n *  statement).\n */\n\n#define DUK__EXPR_RBP_MASK           0xff\n#define DUK__EXPR_FLAG_REJECT_IN     (1 << 8)   /* reject 'in' token (used for for-in) */\n#define DUK__EXPR_FLAG_ALLOW_EMPTY   (1 << 9)   /* allow empty expression */\n#define DUK__EXPR_FLAG_REQUIRE_INIT  (1 << 10)  /* require initializer for var/const */\n\n/* main expression parser function */\nDUK_LOCAL void duk__expr(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_ivalue tmp_alloc;   /* 'res' is used for \"left\", and 'tmp' for \"right\" */\n\tduk_ivalue *tmp = &tmp_alloc;\n\tduk_small_uint_t rbp;\n\n\tDUK__RECURSION_INCREASE(comp_ctx, thr);\n\n\tduk_require_stack(thr, DUK__PARSE_EXPR_SLOTS);\n\n\t/* filter out flags from exprtop rbp_flags here to save space */\n\trbp = rbp_flags & DUK__EXPR_RBP_MASK;\n\n\tDUK_DDD(DUK_DDDPRINT(\"duk__expr(), rbp_flags=%ld, rbp=%ld, allow_in=%ld, paren_level=%ld\",\n\t                     (long) rbp_flags, (long) rbp, (long) comp_ctx->curr_func.allow_in,\n\t                     (long) comp_ctx->curr_func.paren_level));\n\n\tDUK_MEMZERO(&tmp_alloc, sizeof(tmp_alloc));\n\ttmp->x1.valstack_idx = duk_get_top(thr);\n\ttmp->x2.valstack_idx = tmp->x1.valstack_idx + 1;\n\tduk_push_undefined(thr);\n\tduk_push_undefined(thr);\n\n\t/* XXX: where to release temp regs in intermediate expressions?\n\t * e.g. 1+2+3 -> don't inflate temp register count when parsing this.\n\t * that particular expression temp regs can be forced here.\n\t */\n\n\t/* XXX: increase ctx->expr_tokens here for every consumed token\n\t * (this would be a nice statistic)?\n\t */\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON || comp_ctx->curr_token.t == DUK_TOK_RPAREN) {\n\t\t/* XXX: possibly incorrect handling of empty expression */\n\t\tDUK_DDD(DUK_DDDPRINT(\"empty expression\"));\n\t\tif (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY)) {\n\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED);\n\t\t}\n\t\tduk_push_undefined(thr);\n\t\tduk__ivalue_plain_fromstack(comp_ctx, res);\n\t\tgoto cleanup;\n\t}\n\n\tduk__advance(comp_ctx);\n\tduk__expr_nud(comp_ctx, res);  /* reuse 'res' as 'left' */\n\twhile (rbp < duk__expr_lbp(comp_ctx)) {\n\t\tduk__advance(comp_ctx);\n\t\tduk__expr_led(comp_ctx, res, tmp);\n\t\tduk__copy_ivalue(comp_ctx, tmp, res);  /* tmp -> res */\n\t}\n\n cleanup:\n\t/* final result is already in 'res' */\n\n\tduk_pop_2(thr);\n\n\tDUK__RECURSION_DECREASE(comp_ctx, thr);\n}\n\nDUK_LOCAL void duk__exprtop(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk_hthread *thr = comp_ctx->thr;\n\n\t/* Note: these variables must reside in 'curr_func' instead of the global\n\t * context: when parsing function expressions, expression parsing is nested.\n\t */\n\tcomp_ctx->curr_func.nud_count = 0;\n\tcomp_ctx->curr_func.led_count = 0;\n\tcomp_ctx->curr_func.paren_level = 0;\n\tcomp_ctx->curr_func.expr_lhs = 1;\n\tcomp_ctx->curr_func.allow_in = (rbp_flags & DUK__EXPR_FLAG_REJECT_IN ? 0 : 1);\n\n\tduk__expr(comp_ctx, res, rbp_flags);\n\n\tif (!(rbp_flags & DUK__EXPR_FLAG_ALLOW_EMPTY) && duk__expr_is_empty(comp_ctx)) {\n\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_EMPTY_EXPR_NOT_ALLOWED);\n\t}\n}\n\n/* A bunch of helpers (for size optimization) that combine duk__expr()/duk__exprtop()\n * and result conversions.\n *\n * Each helper needs at least 2-3 calls to make it worth while to wrap.\n */\n\n#if 0  /* unused */\nDUK_LOCAL duk_regconst_t duk__expr_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__expr(comp_ctx, res, rbp_flags);\n\treturn duk__ivalue_toreg(comp_ctx, res);\n}\n#endif\n\n#if 0  /* unused */\nDUK_LOCAL duk_regconst_t duk__expr_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__expr(comp_ctx, res, rbp_flags);\n\treturn duk__ivalue_totemp(comp_ctx, res);\n}\n#endif\n\nDUK_LOCAL void duk__expr_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) {\n\tDUK_ASSERT(forced_reg >= 0);\n\tduk__expr(comp_ctx, res, rbp_flags);\n\tduk__ivalue_toforcedreg(comp_ctx, res, forced_reg);\n}\n\nDUK_LOCAL duk_regconst_t duk__expr_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__expr(comp_ctx, res, rbp_flags);\n\treturn duk__ivalue_toregconst(comp_ctx, res);\n}\n\n#if 0  /* unused */\nDUK_LOCAL duk_regconst_t duk__expr_totempconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__expr(comp_ctx, res, rbp_flags);\n\treturn duk__ivalue_totempconst(comp_ctx, res);\n}\n#endif\n\nDUK_LOCAL void duk__expr_toplain(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__expr(comp_ctx, res, rbp_flags);\n\tduk__ivalue_toplain(comp_ctx, res);\n}\n\nDUK_LOCAL void duk__expr_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__expr(comp_ctx, res, rbp_flags);\n\tduk__ivalue_toplain_ignore(comp_ctx, res);\n}\n\nDUK_LOCAL duk_regconst_t duk__exprtop_toreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__exprtop(comp_ctx, res, rbp_flags);\n\treturn duk__ivalue_toreg(comp_ctx, res);\n}\n\n#if 0  /* unused */\nDUK_LOCAL duk_regconst_t duk__exprtop_totemp(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__exprtop(comp_ctx, res, rbp_flags);\n\treturn duk__ivalue_totemp(comp_ctx, res);\n}\n#endif\n\nDUK_LOCAL void duk__exprtop_toforcedreg(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags, duk_regconst_t forced_reg) {\n\tDUK_ASSERT(forced_reg >= 0);\n\tduk__exprtop(comp_ctx, res, rbp_flags);\n\tduk__ivalue_toforcedreg(comp_ctx, res, forced_reg);\n}\n\nDUK_LOCAL duk_regconst_t duk__exprtop_toregconst(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t rbp_flags) {\n\tduk__exprtop(comp_ctx, res, rbp_flags);\n\treturn duk__ivalue_toregconst(comp_ctx, res);\n}\n\n#if 0  /* unused */\nDUK_LOCAL void duk__exprtop_toplain_ignore(duk_compiler_ctx *comp_ctx, duk_ivalue *res, int rbp_flags) {\n\tduk__exprtop(comp_ctx, res, rbp_flags);\n\tduk__ivalue_toplain_ignore(comp_ctx, res);\n}\n#endif\n\n/*\n *  Parse an individual source element (top level statement) or a statement.\n *\n *  Handles labeled statements automatically (peeling away labels before\n *  parsing an expression that follows the label(s)).\n *\n *  Upon entry, 'curr_tok' contains the first token of the statement (parsed\n *  in \"allow regexp literal\" mode).  Upon exit, 'curr_tok' contains the first\n *  token following the statement (if the statement has a terminator, this is\n *  the token after the terminator).\n */\n\n#define DUK__HAS_VAL                  (1 << 0)  /* stmt has non-empty value */\n#define DUK__HAS_TERM                 (1 << 1)  /* stmt has explicit/implicit semicolon terminator */\n#define DUK__ALLOW_AUTO_SEMI_ALWAYS   (1 << 2)  /* allow automatic semicolon even without lineterm (compatibility) */\n#define DUK__STILL_PROLOGUE           (1 << 3)  /* statement does not terminate directive prologue */\n#define DUK__IS_TERMINAL              (1 << 4)  /* statement is guaranteed to be terminal (control doesn't flow to next statement) */\n\n/* Parse a single variable declaration (e.g. \"i\" or \"i=10\").  A leading 'var'\n * has already been eaten.  These is no return value in 'res', it is used only\n * as a temporary.\n *\n * When called from 'for-in' statement parser, the initializer expression must\n * not allow the 'in' token.  The caller supply additional expression parsing\n * flags (like DUK__EXPR_FLAG_REJECT_IN) in 'expr_flags'.\n *\n * Finally, out_rc_varname and out_reg_varbind are updated to reflect where\n * the identifier is bound:\n *\n *    If register bound:      out_reg_varbind >= 0, out_rc_varname == 0 (ignore)\n *    If not register bound:  out_reg_varbind < 0, out_rc_varname >= 0\n *\n * These allow the caller to use the variable for further assignment, e.g.\n * as is done in 'for-in' parsing.\n */\n\nDUK_LOCAL void duk__parse_var_decl(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags, duk_regconst_t *out_reg_varbind, duk_regconst_t *out_rc_varname) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_hstring *h_varname;\n\tduk_regconst_t reg_varbind;\n\tduk_regconst_t rc_varname;\n\n\t/* assume 'var' has been eaten */\n\n\t/* Note: Identifier rejects reserved words */\n\tif (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) {\n\t\tgoto syntax_error;\n\t}\n\th_varname = comp_ctx->curr_token.str1;\n\n\tDUK_ASSERT(h_varname != NULL);\n\n\t/* strict mode restrictions (E5 Section 12.2.1) */\n\tif (duk__hstring_is_eval_or_arguments_in_strict_mode(comp_ctx, h_varname)) {\n\t\tgoto syntax_error;\n\t}\n\n\t/* register declarations in first pass */\n\tif (comp_ctx->curr_func.in_scanning) {\n\t\tduk_uarridx_t n;\n\t\tDUK_DDD(DUK_DDDPRINT(\"register variable declaration %!O in pass 1\",\n\t\t                     (duk_heaphdr *) h_varname));\n\t\tn = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx);\n\t\tduk_push_hstring(thr, h_varname);\n\t\tduk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n);\n\t\tduk_push_int(thr, DUK_DECL_TYPE_VAR + (0 << 8));\n\t\tduk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1);\n\t}\n\n\tduk_push_hstring(thr, h_varname);  /* push before advancing to keep reachable */\n\n\t/* register binding lookup is based on varmap (even in first pass) */\n\tduk_dup_top(thr);\n\t(void) duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname);\n\n\tduk__advance(comp_ctx);  /* eat identifier */\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_EQUALSIGN) {\n\t\tduk__advance(comp_ctx);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"vardecl, assign to '%!O' -> reg_varbind=%ld, rc_varname=%ld\",\n\t\t                     (duk_heaphdr *) h_varname, (long) reg_varbind, (long) rc_varname));\n\n\t\tduk__exprtop(comp_ctx, res, DUK__BP_COMMA | expr_flags /*rbp_flags*/);  /* AssignmentExpression */\n\n\t\tif (reg_varbind >= 0) {\n\t\t\tduk__ivalue_toforcedreg(comp_ctx, res, reg_varbind);\n\t\t} else {\n\t\t\tduk_regconst_t reg_val;\n\t\t\treg_val = duk__ivalue_toreg(comp_ctx, res);\n\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t               DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t               reg_val,\n\t\t\t               rc_varname);\n\t\t}\n\t} else {\n\t\tif (expr_flags & DUK__EXPR_FLAG_REQUIRE_INIT) {\n\t\t\t/* Used for minimal 'const': initializer required. */\n\t\t\tgoto syntax_error;\n\t\t}\n\t}\n\n\tduk_pop(thr);  /* pop varname */\n\n\t*out_rc_varname = rc_varname;\n\t*out_reg_varbind = reg_varbind;\n\n\treturn;\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_VAR_DECLARATION);\n}\n\nDUK_LOCAL void duk__parse_var_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_small_uint_t expr_flags) {\n\tduk_regconst_t reg_varbind;\n\tduk_regconst_t rc_varname;\n\n\tduk__advance(comp_ctx);  /* eat 'var' */\n\n\tfor (;;) {\n\t\t/* rc_varname and reg_varbind are ignored here */\n\t\tduk__parse_var_decl(comp_ctx, res, 0 | expr_flags, &reg_varbind, &rc_varname);\n\n\t\tif (comp_ctx->curr_token.t != DUK_TOK_COMMA) {\n\t\t\tbreak;\n\t\t}\n\t\tduk__advance(comp_ctx);\n\t}\n}\n\nDUK_LOCAL void duk__parse_for_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_int_t pc_v34_lhs;         /* start variant 3/4 left-hand-side code (L1 in doc/compiler.rst example) */\n\tduk_regconst_t temp_reset;    /* knock back \"next temp\" to this whenever possible */\n\tduk_regconst_t reg_temps;     /* preallocated temporaries (2) for variants 3 and 4 */\n\n\tDUK_DDD(DUK_DDDPRINT(\"start parsing a for/for-in statement\"));\n\n\t/* Two temporaries are preallocated here for variants 3 and 4 which need\n\t * registers which are never clobbered by expressions in the loop\n\t * (concretely: for the enumerator object and the next enumerated value).\n\t * Variants 1 and 2 \"release\" these temps.\n\t */\n\n\treg_temps = DUK__ALLOCTEMPS(comp_ctx, 2);\n\n\ttemp_reset = DUK__GETTEMP(comp_ctx);\n\n\t/*\n\t *  For/for-in main variants are:\n\t *\n\t *    1. for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement\n\t *    2. for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement\n\t *    3. for (LeftHandSideExpression in Expression) Statement\n\t *    4. for (var VariableDeclarationNoIn in Expression) Statement\n\t *\n\t *  Parsing these without arbitrary lookahead or backtracking is relatively\n\t *  tricky but we manage to do so for now.\n\t *\n\t *  See doc/compiler.rst for a detailed discussion of control flow\n\t *  issues, evaluation order issues, etc.\n\t */\n\n\tduk__advance(comp_ctx);  /* eat 'for' */\n\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\n\tDUK_DDD(DUK_DDDPRINT(\"detecting for/for-in loop variant, pc=%ld\", (long) duk__get_current_pc(comp_ctx)));\n\n\t/* a label site has been emitted by duk__parse_stmt() automatically\n\t * (it will also emit the ENDLABEL).\n\t */\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_VAR) {\n\t\t/*\n\t\t *  Variant 2 or 4\n\t\t */\n\n\t\tduk_regconst_t reg_varbind;  /* variable binding register if register-bound (otherwise < 0) */\n\t\tduk_regconst_t rc_varname;   /* variable name reg/const, if variable not register-bound */\n\n\t\tduk__advance(comp_ctx);  /* eat 'var' */\n\t\tduk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, &reg_varbind, &rc_varname);\n\t\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_IN) {\n\t\t\t/*\n\t\t\t *  Variant 4\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected for variant 4: for (var VariableDeclarationNoIn in Expression) Statement\"));\n\t\t\tpc_v34_lhs = duk__get_current_pc(comp_ctx);  /* jump is inserted here */\n\t\t\tif (reg_varbind >= 0) {\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               DUK_OP_LDREG,\n\t\t\t\t               reg_varbind,\n\t\t\t\t               reg_temps + 0);\n\t\t\t} else {\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t\t               reg_temps + 0,\n\t\t\t\t               rc_varname);\n\t\t\t}\n\t\t\tgoto parse_3_or_4;\n\t\t} else {\n\t\t\t/*\n\t\t\t *  Variant 2\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected for variant 2: for (var VariableDeclarationNoIn; Expression_opt; Expression_opt) Statement\"));\n\t\t\tfor (;;) {\n\t\t\t\t/* more initializers */\n\t\t\t\tif (comp_ctx->curr_token.t != DUK_TOK_COMMA) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"variant 2 has another variable initializer\"));\n\n\t\t\t\tduk__advance(comp_ctx);  /* eat comma */\n\t\t\t\tduk__parse_var_decl(comp_ctx, res, DUK__EXPR_FLAG_REJECT_IN, &reg_varbind, &rc_varname);\n\t\t\t}\n\t\t\tgoto parse_1_or_2;\n\t\t}\n\t} else {\n\t\t/*\n\t\t *  Variant 1 or 3\n\t\t */\n\n\t\tpc_v34_lhs = duk__get_current_pc(comp_ctx);  /* jump is inserted here (variant 3) */\n\n\t\t/* Note that duk__exprtop() here can clobber any reg above current temp_next,\n\t\t * so any loop variables (e.g. enumerator) must be \"preallocated\".\n\t\t */\n\n\t\t/* don't coerce yet to a plain value (variant 3 needs special handling) */\n\t\tduk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_REJECT_IN | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/);  /* Expression */\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_IN) {\n\t\t\t/*\n\t\t\t *  Variant 3\n\t\t\t */\n\n\t\t\t/* XXX: need to determine LHS type, and check that it is LHS compatible */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected for variant 3: for (LeftHandSideExpression in Expression) Statement\"));\n\t\t\tif (duk__expr_is_empty(comp_ctx)) {\n\t\t\t\tgoto syntax_error;  /* LeftHandSideExpression does not allow empty expression */\n\t\t\t}\n\n\t\t\tif (res->t == DUK_IVAL_VAR) {\n\t\t\t\tduk_regconst_t reg_varbind;\n\t\t\t\tduk_regconst_t rc_varname;\n\n\t\t\t\tduk_dup(thr, res->x1.valstack_idx);\n\t\t\t\tif (duk__lookup_lhs(comp_ctx, &reg_varbind, &rc_varname)) {\n\t\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t\t               DUK_OP_LDREG,\n\t\t\t\t\t               reg_varbind,\n\t\t\t\t\t               reg_temps + 0);\n\t\t\t\t} else {\n\t\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t\t               DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t\t\t\t               reg_temps + 0,\n\t\t\t\t\t               rc_varname);\n\t\t\t\t}\n\t\t\t} else if (res->t == DUK_IVAL_PROP) {\n\t\t\t\t/* Don't allow a constant for the object (even for a number etc), as\n\t\t\t\t * it goes into the 'A' field of the opcode.\n\t\t\t\t */\n\t\t\t\tduk_regconst_t reg_obj;\n\t\t\t\tduk_regconst_t rc_key;\n\t\t\t\treg_obj = duk__ispec_toregconst_raw(comp_ctx, &res->x1, -1 /*forced_reg*/, 0 /*flags*/);  /* don't allow const */\n\t\t\t\trc_key = duk__ispec_toregconst_raw(comp_ctx, &res->x2, -1 /*forced_reg*/, DUK__IVAL_FLAG_ALLOW_CONST /*flags*/);\n\t\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t\t                DUK_OP_PUTPROP | DUK__EMIT_FLAG_A_IS_SOURCE | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t\t                reg_obj,\n\t\t\t\t                rc_key,\n\t\t\t\t                reg_temps + 0);\n\t\t\t} else {\n\t\t\t\tduk__ivalue_toplain_ignore(comp_ctx, res);  /* just in case */\n\t\t\t\tduk__emit_op_only(comp_ctx,\n\t\t\t\t                  DUK_OP_INVLHS);\n\t\t\t}\n\t\t\tgoto parse_3_or_4;\n\t\t} else {\n\t\t\t/*\n\t\t\t *  Variant 1\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected for variant 1: for (ExpressionNoIn_opt; Expression_opt; Expression_opt) Statement\"));\n\t\t\tduk__ivalue_toplain_ignore(comp_ctx, res);\n\t\t\tgoto parse_1_or_2;\n\t\t}\n\t}\n\n parse_1_or_2:\n\t/*\n\t *  Parse variant 1 or 2.  The first part expression (which differs\n\t *  in the variants) has already been parsed and its code emitted.\n\t *\n\t *  reg_temps + 0: unused\n\t *  reg_temps + 1: unused\n\t */\n\t{\n\t\tduk_regconst_t rc_cond;\n\t\tduk_int_t pc_l1, pc_l2, pc_l3, pc_l4;\n\t\tduk_int_t pc_jumpto_l3, pc_jumpto_l4;\n\t\tduk_bool_t expr_c_empty;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"shared code for parsing variants 1 and 2\"));\n\n\t\t/* \"release\" preallocated temps since we won't need them */\n\t\ttemp_reset = reg_temps + 0;\n\t\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON);\n\n\t\tpc_l1 = duk__get_current_pc(comp_ctx);\n\t\tduk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/);  /* Expression_opt */\n\t\tif (duk__expr_is_empty(comp_ctx)) {\n\t\t\t/* no need to coerce */\n\t\t\tpc_jumpto_l3 = duk__emit_jump_empty(comp_ctx);  /* to body */\n\t\t\tpc_jumpto_l4 = -1;  /* omitted */\n\t\t} else {\n\t\t\trc_cond = duk__ivalue_toregconst(comp_ctx, res);\n\t\t\tduk__emit_if_false_skip(comp_ctx, rc_cond);\n\t\t\tpc_jumpto_l3 = duk__emit_jump_empty(comp_ctx);  /* to body */\n\t\t\tpc_jumpto_l4 = duk__emit_jump_empty(comp_ctx);  /* to exit */\n\t\t}\n\t\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_SEMICOLON);\n\n\t\tpc_l2 = duk__get_current_pc(comp_ctx);\n\t\tduk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR | DUK__EXPR_FLAG_ALLOW_EMPTY /*rbp_flags*/);  /* Expression_opt */\n\t\tif (duk__expr_is_empty(comp_ctx)) {\n\t\t\t/* no need to coerce */\n\t\t\texpr_c_empty = 1;\n\t\t\t/* JUMP L1 omitted */\n\t\t} else {\n\t\t\tduk__ivalue_toplain_ignore(comp_ctx, res);\n\t\t\texpr_c_empty = 0;\n\t\t\tduk__emit_jump(comp_ctx, pc_l1);\n\t\t}\n\t\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\t\tpc_l3 = duk__get_current_pc(comp_ctx);\n\t\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\t\tif (expr_c_empty) {\n\t\t\tduk__emit_jump(comp_ctx, pc_l1);\n\t\t} else {\n\t\t\tduk__emit_jump(comp_ctx, pc_l2);\n\t\t}\n\t\t/* temp reset is not necessary after duk__parse_stmt(), which already does it */\n\n\t\tpc_l4 = duk__get_current_pc(comp_ctx);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"patching jumps: jumpto_l3: %ld->%ld, jumpto_l4: %ld->%ld, \"\n\t\t                     \"break: %ld->%ld, continue: %ld->%ld\",\n\t\t\t             (long) pc_jumpto_l3, (long) pc_l3, (long) pc_jumpto_l4, (long) pc_l4,\n\t\t                     (long) (pc_label_site + 1), (long) pc_l4, (long) (pc_label_site + 2), (long) pc_l2));\n\n\t\tduk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3);\n\t\tduk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4);\n\t\tduk__patch_jump(comp_ctx,\n\t\t                pc_label_site + 1,\n\t\t                pc_l4);                         /* break jump */\n\t\tduk__patch_jump(comp_ctx,\n\t\t                pc_label_site + 2,\n\t\t                expr_c_empty ? pc_l1 : pc_l2);  /* continue jump */\n\t}\n\tgoto finished;\n\n parse_3_or_4:\n\t/*\n\t *  Parse variant 3 or 4.\n\t *\n\t *  For variant 3 (e.g. \"for (A in C) D;\") the code for A (except the\n\t *  final property/variable write) has already been emitted.  The first\n\t *  instruction of that code is at pc_v34_lhs; a JUMP needs to be inserted\n\t *  there to satisfy control flow needs.\n\t *\n\t *  For variant 4, if the variable declaration had an initializer\n\t *  (e.g. \"for (var A = B in C) D;\") the code for the assignment\n\t *  (B) has already been emitted.\n\t *\n\t *  Variables set before entering here:\n\t *\n\t *    pc_v34_lhs:    insert a \"JUMP L2\" here (see doc/compiler.rst example).\n\t *    reg_temps + 0: iteration target value (written to LHS)\n\t *    reg_temps + 1: enumerator object\n\t */\n\t{\n\t\tduk_int_t pc_l1, pc_l2, pc_l3, pc_l4, pc_l5;\n\t\tduk_int_t pc_jumpto_l2, pc_jumpto_l3, pc_jumpto_l4, pc_jumpto_l5;\n\t\tduk_regconst_t reg_target;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"shared code for parsing variants 3 and 4, pc_v34_lhs=%ld\", (long) pc_v34_lhs));\n\n\t\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\t\t/* First we need to insert a jump in the middle of previously\n\t\t * emitted code to get the control flow right.  No jumps can\n\t\t * cross the position where the jump is inserted.  See doc/compiler.rst\n\t\t * for discussion on the intricacies of control flow and side effects\n\t\t * for variants 3 and 4.\n\t\t */\n\n\t\tduk__insert_jump_entry(comp_ctx, pc_v34_lhs);\n\t\tpc_jumpto_l2 = pc_v34_lhs;  /* inserted jump */\n\t\tpc_l1 = pc_v34_lhs + 1;     /* +1, right after inserted jump */\n\n\t\t/* The code for writing reg_temps + 0 to the left hand side has already\n\t\t * been emitted.\n\t\t */\n\n\t\tpc_jumpto_l3 = duk__emit_jump_empty(comp_ctx);  /* -> loop body */\n\n\t\tduk__advance(comp_ctx);  /* eat 'in' */\n\n\t\t/* Parse enumeration target and initialize enumerator.  For 'null' and 'undefined',\n\t\t * INITENUM will creates a 'null' enumerator which works like an empty enumerator\n\t\t * (E5 Section 12.6.4, step 3).  Note that INITENUM requires the value to be in a\n\t\t * register (constant not allowed).\n\t\t */\n\n\t\tpc_l2 = duk__get_current_pc(comp_ctx);\n\t\treg_target = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);  /* Expression */\n\t\tduk__emit_b_c(comp_ctx,\n\t\t              DUK_OP_INITENUM | DUK__EMIT_FLAG_B_IS_TARGET,\n\t\t              reg_temps + 1,\n\t\t              reg_target);\n\t\tpc_jumpto_l4 = duk__emit_jump_empty(comp_ctx);\n\t\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\t\tpc_l3 = duk__get_current_pc(comp_ctx);\n\t\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\t\t/* temp reset is not necessary after duk__parse_stmt(), which already does it */\n\n\t\t/* NEXTENUM needs a jump slot right after the main opcode.\n\t\t * We need the code emitter to reserve the slot: if there's\n\t\t * target shuffling, the target shuffle opcodes must happen\n\t\t * after the jump slot (for NEXTENUM the shuffle opcodes are\n\t\t * not needed if the enum is finished).\n\t\t */\n\t\tpc_l4 = duk__get_current_pc(comp_ctx);\n\t\tduk__emit_b_c(comp_ctx,\n\t\t              DUK_OP_NEXTENUM | DUK__EMIT_FLAG_B_IS_TARGET | DUK__EMIT_FLAG_RESERVE_JUMPSLOT,\n\t\t              reg_temps + 0,\n\t\t              reg_temps + 1);\n\t\tpc_jumpto_l5 = comp_ctx->emit_jumpslot_pc;  /* NEXTENUM jump slot: executed when enum finished */\n\t\tduk__emit_jump(comp_ctx, pc_l1);  /* jump to next loop, using reg_v34_iter as iterated value */\n\n\t\tpc_l5 = duk__get_current_pc(comp_ctx);\n\n\t\t/* XXX: since the enumerator may be a memory expensive object,\n\t\t * perhaps clear it explicitly here?  If so, break jump must\n\t\t * go through this clearing operation.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"patching jumps: jumpto_l2: %ld->%ld, jumpto_l3: %ld->%ld, \"\n\t\t                     \"jumpto_l4: %ld->%ld, jumpto_l5: %ld->%ld, \"\n\t\t                     \"break: %ld->%ld, continue: %ld->%ld\",\n\t\t\t             (long) pc_jumpto_l2, (long) pc_l2, (long) pc_jumpto_l3, (long) pc_l3,\n\t\t\t             (long) pc_jumpto_l4, (long) pc_l4, (long) pc_jumpto_l5, (long) pc_l5,\n\t\t                     (long) (pc_label_site + 1), (long) pc_l5, (long) (pc_label_site + 2), (long) pc_l4));\n\n\t\tduk__patch_jump(comp_ctx, pc_jumpto_l2, pc_l2);\n\t\tduk__patch_jump(comp_ctx, pc_jumpto_l3, pc_l3);\n\t\tduk__patch_jump(comp_ctx, pc_jumpto_l4, pc_l4);\n\t\tduk__patch_jump(comp_ctx, pc_jumpto_l5, pc_l5);\n\t\tduk__patch_jump(comp_ctx, pc_label_site + 1, pc_l5);  /* break jump */\n\t\tduk__patch_jump(comp_ctx, pc_label_site + 2, pc_l4);  /* continue jump */\n\t}\n\tgoto finished;\n\n finished:\n\tDUK_DDD(DUK_DDDPRINT(\"end parsing a for/for-in statement\"));\n\treturn;\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FOR);\n}\n\nDUK_LOCAL void duk__parse_switch_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_regconst_t temp_at_loop;\n\tduk_regconst_t rc_switch;    /* reg/const for switch value */\n\tduk_regconst_t rc_case;      /* reg/const for case value */\n\tduk_regconst_t reg_temp;     /* general temp register */\n\tduk_int_t pc_prevcase = -1;\n\tduk_int_t pc_prevstmt = -1;\n\tduk_int_t pc_default = -1;   /* -1 == not set, -2 == pending (next statement list) */\n\n\t/* Note: negative pc values are ignored when patching jumps, so no explicit checks needed */\n\n\t/*\n\t *  Switch is pretty complicated because of several conflicting concerns:\n\t *\n\t *    - Want to generate code without an intermediate representation,\n\t *      i.e., in one go\n\t *\n\t *    - Case selectors are expressions, not values, and may thus e.g. throw\n\t *      exceptions (which causes evaluation order concerns)\n\t *\n\t *    - Evaluation semantics of case selectors and default clause need to be\n\t *      carefully implemented to provide correct behavior even with case value\n\t *      side effects\n\t *\n\t *    - Fall through case and default clauses; avoiding dead JUMPs if case\n\t *      ends with an unconditional jump (a break or a continue)\n\t *\n\t *    - The same case value may occur multiple times, but evaluation rules\n\t *      only process the first match before switching to a \"propagation\" mode\n\t *      where case values are no longer evaluated\n\t *\n\t *  See E5 Section 12.11.  Also see doc/compiler.rst for compilation\n\t *  discussion.\n\t */\n\n\tduk__advance(comp_ctx);\n\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\trc_switch = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\tduk__advance_expect(comp_ctx, DUK_TOK_LCURLY);\n\n\tDUK_DDD(DUK_DDDPRINT(\"switch value in register %ld\", (long) rc_switch));\n\n\ttemp_at_loop = DUK__GETTEMP(comp_ctx);\n\n\tfor (;;) {\n\t\tduk_int_t num_stmts;\n\t\tduk_small_uint_t tok;\n\n\t\t/* sufficient for keeping temp reg numbers in check */\n\t\tDUK__SETTEMP(comp_ctx, temp_at_loop);\n\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {\n\t\t\tbreak;\n\t\t}\n\n\t\t/*\n\t\t *  Parse a case or default clause.\n\t\t */\n\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_CASE) {\n\t\t\t/*\n\t\t\t *  Case clause.\n\t\t\t *\n\t\t\t *  Note: cannot use reg_case as a temp register (for SEQ target)\n\t\t\t *  because it may be a constant.\n\t\t\t */\n\n\t\t\tduk__patch_jump_here(comp_ctx, pc_prevcase);  /* chain jumps for case\n\t\t\t                                               * evaluation and checking\n\t\t\t                                               */\n\n\t\t\tduk__advance(comp_ctx);\n\t\t\trc_case = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\t\t\tduk__advance_expect(comp_ctx, DUK_TOK_COLON);\n\n\t\t\treg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                DUK_OP_SEQ | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t                reg_temp,\n\t\t\t                rc_switch,\n\t\t\t                rc_case);\n\t\t\tduk__emit_if_true_skip(comp_ctx, reg_temp);\n\n\t\t\t/* jump to next case clause */\n\t\t\tpc_prevcase = duk__emit_jump_empty(comp_ctx);  /* no match, next case */\n\n\t\t\t/* statements go here (if any) on next loop */\n\t\t} else if (comp_ctx->curr_token.t == DUK_TOK_DEFAULT) {\n\t\t\t/*\n\t\t\t *  Default clause.\n\t\t\t */\n\n\t\t\tif (pc_default >= 0) {\n\t\t\t\tgoto syntax_error;\n\t\t\t}\n\t\t\tduk__advance(comp_ctx);\n\t\t\tduk__advance_expect(comp_ctx, DUK_TOK_COLON);\n\n\t\t\t/* Fix for https://github.com/svaarala/duktape/issues/155:\n\t\t\t * If 'default' is first clause (detected by pc_prevcase < 0)\n\t\t\t * we need to ensure we stay in the matching chain.\n\t\t\t */\n\t\t\tif (pc_prevcase < 0) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"default clause is first, emit prevcase jump\"));\n\t\t\t\tpc_prevcase = duk__emit_jump_empty(comp_ctx);\n\t\t\t}\n\n\t\t\t/* default clause matches next statement list (if any) */\n\t\t\tpc_default = -2;\n\t\t} else {\n\t\t\t/* Code is not accepted before the first case/default clause */\n\t\t\tgoto syntax_error;\n\t\t}\n\n\t\t/*\n\t\t *  Parse code after the clause.  Possible terminators are\n\t\t *  'case', 'default', and '}'.\n\t\t *\n\t\t *  Note that there may be no code at all, not even an empty statement,\n\t\t *  between case clauses.  This must be handled just like an empty statement\n\t\t *  (omitting seemingly pointless JUMPs), to avoid situations like\n\t\t *  test-bug-case-fallthrough.js.\n\t\t */\n\n\t\tnum_stmts = 0;\n\t\tif (pc_default == -2) {\n\t\t\tpc_default = duk__get_current_pc(comp_ctx);\n\t\t}\n\n\t\t/* Note: this is correct even for default clause statements:\n\t\t * they participate in 'fall-through' behavior even if the\n\t\t * default clause is in the middle.\n\t\t */\n\t\tduk__patch_jump_here(comp_ctx, pc_prevstmt);  /* chain jumps for 'fall-through'\n\t\t                                               * after a case matches.\n\t\t                                               */\n\n\t\tfor (;;) {\n\t\t\ttok = comp_ctx->curr_token.t;\n\t\t\tif (tok == DUK_TOK_CASE || tok == DUK_TOK_DEFAULT ||\n\t\t\t    tok == DUK_TOK_RCURLY) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tnum_stmts++;\n\t\t\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\t\t}\n\n\t\t/* fall-through jump to next code of next case (backpatched) */\n\t\tpc_prevstmt = duk__emit_jump_empty(comp_ctx);\n\n\t\t/* XXX: would be nice to omit this jump when the jump is not\n\t\t * reachable, at least in the obvious cases (such as the case\n\t\t * ending with a 'break'.\n\t\t *\n\t\t * Perhaps duk__parse_stmt() could provide some info on whether\n\t\t * the statement is a \"dead end\"?\n\t\t *\n\t\t * If implemented, just set pc_prevstmt to -1 when not needed.\n\t\t */\n\t}\n\n\tDUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RCURLY);\n\tduk__advance(comp_ctx);\n\n\t/* default case control flow patchup; note that if pc_prevcase < 0\n\t * (i.e. no case clauses), control enters default case automatically.\n\t */\n\tif (pc_default >= 0) {\n\t\t/* default case exists: go there if no case matches */\n\t\tduk__patch_jump(comp_ctx, pc_prevcase, pc_default);\n\t} else {\n\t\t/* default case does not exist, or no statements present\n\t\t * after default case: finish case evaluation\n\t\t */\n\t\tduk__patch_jump_here(comp_ctx, pc_prevcase);\n\t}\n\n\t/* fall-through control flow patchup; note that pc_prevstmt may be\n\t * < 0 (i.e. no case clauses), in which case this is a no-op.\n\t */\n\tduk__patch_jump_here(comp_ctx, pc_prevstmt);\n\n\t/* continue jump not patched, an INVALID opcode remains there */\n\tduk__patch_jump_here(comp_ctx, pc_label_site + 1);  /* break jump */\n\n\t/* Note: 'fast' breaks will jump to pc_label_site + 1, which will\n\t * then jump here.  The double jump will be eliminated by a\n\t * peephole pass, resulting in an optimal jump here.  The label\n\t * site jumps will remain in bytecode and will waste code size.\n\t */\n\n\treturn;\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_SWITCH);\n}\n\nDUK_LOCAL void duk__parse_if_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_regconst_t temp_reset;\n\tduk_regconst_t rc_cond;\n\tduk_int_t pc_jump_false;\n\n\tDUK_DDD(DUK_DDDPRINT(\"begin parsing if statement\"));\n\n\ttemp_reset = DUK__GETTEMP(comp_ctx);\n\n\tduk__advance(comp_ctx);  /* eat 'if' */\n\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\n\trc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\tduk__emit_if_true_skip(comp_ctx, rc_cond);\n\tpc_jump_false = duk__emit_jump_empty(comp_ctx);  /* jump to end or else part */\n\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\n\t/* The 'else' ambiguity is resolved by 'else' binding to the innermost\n\t * construct, so greedy matching is correct here.\n\t */\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_ELSE) {\n\t\tduk_int_t pc_jump_end;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"if has else part\"));\n\n\t\tduk__advance(comp_ctx);\n\n\t\tpc_jump_end = duk__emit_jump_empty(comp_ctx);  /* jump from true part to end */\n\t\tduk__patch_jump_here(comp_ctx, pc_jump_false);\n\n\t\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\n\t\tduk__patch_jump_here(comp_ctx, pc_jump_end);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"if does not have else part\"));\n\n\t\tduk__patch_jump_here(comp_ctx, pc_jump_false);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"end parsing if statement\"));\n}\n\nDUK_LOCAL void duk__parse_do_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {\n\tduk_regconst_t rc_cond;\n\tduk_int_t pc_start;\n\n\tDUK_DDD(DUK_DDDPRINT(\"begin parsing do statement\"));\n\n\tduk__advance(comp_ctx);  /* eat 'do' */\n\n\tpc_start = duk__get_current_pc(comp_ctx);\n\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\tduk__patch_jump_here(comp_ctx, pc_label_site + 2);  /* continue jump */\n\n\tduk__advance_expect(comp_ctx, DUK_TOK_WHILE);\n\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\n\trc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\tduk__emit_if_false_skip(comp_ctx, rc_cond);\n\tduk__emit_jump(comp_ctx, pc_start);\n\t/* no need to reset temps, as we're finished emitting code */\n\n\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\tduk__patch_jump_here(comp_ctx, pc_label_site + 1);  /* break jump */\n\n\tDUK_DDD(DUK_DDDPRINT(\"end parsing do statement\"));\n}\n\nDUK_LOCAL void duk__parse_while_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_int_t pc_label_site) {\n\tduk_regconst_t temp_reset;\n\tduk_regconst_t rc_cond;\n\tduk_int_t pc_start;\n\tduk_int_t pc_jump_false;\n\n\tDUK_DDD(DUK_DDDPRINT(\"begin parsing while statement\"));\n\n\ttemp_reset = DUK__GETTEMP(comp_ctx);\n\n\tduk__advance(comp_ctx);  /* eat 'while' */\n\n\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\n\tpc_start = duk__get_current_pc(comp_ctx);\n\tduk__patch_jump_here(comp_ctx, pc_label_site + 2);  /* continue jump */\n\n\trc_cond = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\tduk__emit_if_true_skip(comp_ctx, rc_cond);\n\tpc_jump_false = duk__emit_jump_empty(comp_ctx);\n\tDUK__SETTEMP(comp_ctx, temp_reset);\n\n\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\tduk__emit_jump(comp_ctx, pc_start);\n\n\tduk__patch_jump_here(comp_ctx, pc_jump_false);\n\tduk__patch_jump_here(comp_ctx, pc_label_site + 1);  /* break jump */\n\n\tDUK_DDD(DUK_DDDPRINT(\"end parsing while statement\"));\n}\n\nDUK_LOCAL void duk__parse_break_or_continue_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_bool_t is_break = (comp_ctx->curr_token.t == DUK_TOK_BREAK);\n\tduk_int_t label_id;\n\tduk_int_t label_catch_depth;\n\tduk_int_t label_pc;  /* points to LABEL; pc+1 = jump site for break; pc+2 = jump site for continue */\n\tduk_bool_t label_is_closest;\n\n\tDUK_UNREF(res);\n\n\tduk__advance(comp_ctx);  /* eat 'break' or 'continue' */\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON ||  /* explicit semi follows */\n\t    comp_ctx->curr_token.lineterm ||                /* automatic semi will be inserted */\n\t    comp_ctx->curr_token.allow_auto_semi) {         /* automatic semi will be inserted */\n\t\t/* break/continue without label */\n\n\t\tduk__lookup_active_label(comp_ctx, DUK_HTHREAD_STRING_EMPTY_STRING(thr), is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest);\n\t} else if (comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER) {\n\t\t/* break/continue with label (label cannot be a reserved word, production is 'Identifier' */\n\t\tDUK_ASSERT(comp_ctx->curr_token.str1 != NULL);\n\t\tduk__lookup_active_label(comp_ctx, comp_ctx->curr_token.str1, is_break, &label_id, &label_catch_depth, &label_pc, &label_is_closest);\n\t\tduk__advance(comp_ctx);\n\t} else {\n\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BREAK_CONT_LABEL);\n\t}\n\n\t/* Use a fast break/continue when possible.  A fast break/continue is\n\t * just a jump to the LABEL break/continue jump slot, which then jumps\n\t * to an appropriate place (for break, going through ENDLABEL correctly).\n\t * The peephole optimizer will optimize the jump to a direct one.\n\t */\n\n\tif (label_catch_depth == comp_ctx->curr_func.catch_depth &&\n\t    label_is_closest) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, \"\n\t\t                     \"label_catch_depth=%ld, catch_depth=%ld \"\n\t\t                     \"-> use fast variant (direct jump)\",\n\t\t                     (long) is_break, (long) label_id, (long) label_is_closest,\n\t\t                     (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth));\n\n\t\tduk__emit_jump(comp_ctx, label_pc + (is_break ? 1 : 2));\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"break/continue: is_break=%ld, label_id=%ld, label_is_closest=%ld, \"\n\t\t                     \"label_catch_depth=%ld, catch_depth=%ld \"\n\t\t                     \"-> use slow variant (longjmp)\",\n\t\t                     (long) is_break, (long) label_id, (long) label_is_closest,\n\t\t                     (long) label_catch_depth, (long) comp_ctx->curr_func.catch_depth));\n\n\t\tduk__emit_bc(comp_ctx,\n\t\t             is_break ? DUK_OP_BREAK : DUK_OP_CONTINUE,\n\t\t             (duk_regconst_t) label_id);\n\t}\n}\n\nDUK_LOCAL void duk__parse_return_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_regconst_t rc_val;\n\n\tduk__advance(comp_ctx);  /* eat 'return' */\n\n\t/* A 'return' statement is only allowed inside an actual function body,\n\t * not as part of eval or global code.\n\t */\n\tif (!comp_ctx->curr_func.is_function) {\n\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_RETURN);\n\t}\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON ||  /* explicit semi follows */\n\t    comp_ctx->curr_token.lineterm ||                /* automatic semi will be inserted */\n\t    comp_ctx->curr_token.allow_auto_semi) {         /* automatic semi will be inserted */\n\t\tDUK_DDD(DUK_DDDPRINT(\"empty return value -> undefined\"));\n\t\tduk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF);\n\t} else {\n\t\tduk_int_t pc_before_expr;\n\t\tduk_int_t pc_after_expr;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"return with a value\"));\n\n\t\tDUK_UNREF(pc_before_expr);\n\t\tDUK_UNREF(pc_after_expr);\n\n\t\tpc_before_expr = duk__get_current_pc(comp_ctx);\n\t\trc_val = duk__exprtop_toregconst(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\t\tpc_after_expr = duk__get_current_pc(comp_ctx);\n\n\t\t/* Tail call check: if last opcode emitted was CALL, and\n\t\t * the context allows it, add a tailcall flag to the CALL.\n\t\t * This doesn't guarantee that a tail call will be allowed at\n\t\t * runtime, so the RETURN must still be emitted.  (Duktape\n\t\t * 0.10.0 avoided this and simulated a RETURN if a tail call\n\t\t * couldn't be used at runtime; but this didn't work\n\t\t * correctly with a thread yield/resume, see\n\t\t * test-bug-tailcall-thread-yield-resume.js for discussion.)\n\t\t *\n\t\t * In addition to the last opcode being CALL, we also need to\n\t\t * be sure that 'rc_val' is the result register of the CALL.\n\t\t * For instance, for the expression 'return 0, (function ()\n\t\t * { return 1; }), 2' the last opcode emitted is CALL (no\n\t\t * bytecode is emitted for '2') but 'rc_val' indicates\n\t\t * constant '2'.  Similarly if '2' is replaced by a register\n\t\t * bound variable, no opcodes are emitted but tail call would\n\t\t * be incorrect.\n\t\t *\n\t\t * This is tricky and easy to get wrong.  It would be best to\n\t\t * track enough expression metadata to check that 'rc_val' came\n\t\t * from that last CALL instruction.  We don't have that metadata\n\t\t * now, so we check that 'rc_val' is a temporary register result\n\t\t * (not a constant or a register bound variable).  There should\n\t\t * be no way currently for 'rc_val' to be a temporary for an\n\t\t * expression following the CALL instruction without emitting\n\t\t * some opcodes following the CALL.  This proxy check is used\n\t\t * below.\n\t\t *\n\t\t * See: test-bug-comma-expr-gh131.js.\n\t\t *\n\t\t * The non-standard 'caller' property disables tail calls\n\t\t * because they pose some special cases which haven't been\n\t\t * fixed yet.\n\t\t */\n\n#if defined(DUK_USE_TAILCALL)\n\t\tif (comp_ctx->curr_func.catch_depth == 0 &&   /* no catchers */\n\t\t    pc_after_expr > pc_before_expr) {         /* at least one opcode emitted */\n\t\t\tduk_compiler_instr *instr;\n\t\t\tduk_instr_t ins;\n\t\t\tduk_small_uint_t op;\n\n\t\t\tinstr = duk__get_instr_ptr(comp_ctx, pc_after_expr - 1);\n\t\t\tDUK_ASSERT(instr != NULL);\n\n\t\t\tins = instr->ins;\n\t\t\top = (duk_small_uint_t) DUK_DEC_OP(ins);\n\t\t\tif ((op & ~0x0fU) == DUK_OP_CALL0 &&\n\t\t\t    DUK__ISREG_TEMP(comp_ctx, rc_val) /* see above */) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"return statement detected a tail call opportunity: \"\n\t\t\t\t                     \"catch depth is 0, duk__exprtop() emitted >= 1 instructions, \"\n\t\t\t\t                     \"and last instruction is a CALL \"\n\t\t\t\t                     \"-> change to TAILCALL\"));\n\t\t\t\tins |= DUK_ENC_OP(DUK_BC_CALL_FLAG_TAILCALL);\n\t\t\t\tinstr->ins = ins;\n\t\t\t}\n\t\t}\n#endif  /* DUK_USE_TAILCALL */\n\n\t\tif (DUK__ISREG(rc_val)) {\n\t\t\tduk__emit_bc(comp_ctx, DUK_OP_RETREG, rc_val);\n\t\t} else {\n\t\t\trc_val = DUK__REMOVECONST(rc_val);\n\t\t\tif (duk__const_needs_refcount(comp_ctx, rc_val)) {\n\t\t\t\tduk__emit_bc(comp_ctx, DUK_OP_RETCONST, rc_val);\n\t\t\t} else {\n\t\t\t\tduk__emit_bc(comp_ctx, DUK_OP_RETCONSTN, rc_val);\n\t\t\t}\n\t\t}\n\t}\n}\n\nDUK_LOCAL void duk__parse_throw_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_regconst_t reg_val;\n\n\tduk__advance(comp_ctx);  /* eat 'throw' */\n\n\t/* Unlike break/continue, throw statement does not allow an empty value. */\n\n\tif (comp_ctx->curr_token.lineterm) {\n\t\tDUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_INVALID_THROW);\n\t}\n\n\treg_val = duk__exprtop_toreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\tduk__emit_bc(comp_ctx,\n\t             DUK_OP_THROW,\n\t             reg_val);\n}\n\nDUK_LOCAL void duk__parse_try_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_regconst_t reg_catch;      /* reg_catch+0 and reg_catch+1 are reserved for TRYCATCH */\n\tduk_regconst_t rc_varname = 0;\n\tduk_small_uint_t trycatch_flags = 0;\n\tduk_int_t pc_ldconst = -1;\n\tduk_int_t pc_trycatch = -1;\n\tduk_int_t pc_catch = -1;\n\tduk_int_t pc_finally = -1;\n\n\tDUK_UNREF(res);\n\n\t/*\n\t *  See the following documentation for discussion:\n\t *\n\t *    doc/execution.rst: control flow details\n\t *\n\t *  Try, catch, and finally \"parts\" are Blocks, not Statements, so\n\t *  they must always be delimited by curly braces.  This is unlike e.g.\n\t *  the if statement, which accepts any Statement.  This eliminates any\n\t *  questions of matching parts of nested try statements.  The Block\n\t *  parsing is implemented inline here (instead of calling out).\n\t *\n\t *  Finally part has a 'let scoped' variable, which requires a few kinks\n\t *  here.\n\t */\n\n\tcomp_ctx->curr_func.catch_depth++;\n\n\tduk__advance(comp_ctx);  /* eat 'try' */\n\n\treg_catch = DUK__ALLOCTEMPS(comp_ctx, 2);\n\n\t/* The target for this LDCONST may need output shuffling, but we assume\n\t * that 'pc_ldconst' will be the LDCONST that we can patch later.  This\n\t * should be the case because there's no input shuffling.  (If there's\n\t * no catch clause, this LDCONST will be replaced with a NOP.)\n\t */\n\tpc_ldconst = duk__get_current_pc(comp_ctx);\n\tduk__emit_a_bc(comp_ctx, DUK_OP_LDCONST, reg_catch, 0 /*patched later*/);\n\n\tpc_trycatch = duk__get_current_pc(comp_ctx);\n\tduk__emit_invalid(comp_ctx);  /* TRYCATCH, cannot emit now (not enough info) */\n\tduk__emit_invalid(comp_ctx);  /* jump for 'catch' case */\n\tduk__emit_invalid(comp_ctx);  /* jump for 'finally' case or end (if no finally) */\n\n\t/* try part */\n\tduk__advance_expect(comp_ctx, DUK_TOK_LCURLY);\n\tduk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);\n\t/* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */\n\tduk__emit_op_only(comp_ctx,\n\t                  DUK_OP_ENDTRY);\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_CATCH) {\n\t\t/*\n\t\t *  The catch variable must be updated to reflect the new allocated\n\t\t *  register for the duration of the catch clause.  We need to store\n\t\t *  and restore the original value for the varmap entry (if any).\n\t\t */\n\n\t\t/*\n\t\t *  Note: currently register bindings must be fixed for the entire\n\t\t *  function.  So, even though the catch variable is in a register\n\t\t *  we know, we must use an explicit environment record and slow path\n\t\t *  accesses to read/write the catch binding to make closures created\n\t\t *  within the catch clause work correctly.  This restriction should\n\t\t *  be fixable (at least in common cases) later.\n\t\t *\n\t\t *  See: test-bug-catch-binding-2.js.\n\t\t *\n\t\t *  XXX: improve to get fast path access to most catch clauses.\n\t\t */\n\n\t\tduk_hstring *h_var;\n\t\tduk_int_t varmap_value;  /* for storing/restoring the varmap binding for catch variable */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"stack top at start of catch clause: %ld\", (long) duk_get_top(thr)));\n\n\t\ttrycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_CATCH;\n\n\t\tpc_catch = duk__get_current_pc(comp_ctx);\n\n\t\tduk__advance(comp_ctx);\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\n\t\tif (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) {\n\t\t\t/* Identifier, i.e. don't allow reserved words */\n\t\t\tgoto syntax_error;\n\t\t}\n\t\th_var = comp_ctx->curr_token.str1;\n\t\tDUK_ASSERT(h_var != NULL);\n\n\t\tduk_push_hstring(thr, h_var);  /* keep in on valstack, use borrowed ref below */\n\n\t\tif (comp_ctx->curr_func.is_strict &&\n\t\t    ((h_var == DUK_HTHREAD_STRING_EVAL(thr)) ||\n\t\t     (h_var == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)))) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"catch identifier 'eval' or 'arguments' in strict mode -> SyntaxError\"));\n\t\t\tgoto syntax_error;\n\t\t}\n\n\t\tduk_dup_top(thr);\n\t\trc_varname = duk__getconst(comp_ctx);\n\t\tDUK_DDD(DUK_DDDPRINT(\"catch clause, rc_varname=0x%08lx (%ld)\",\n\t\t                     (unsigned long) rc_varname, (long) rc_varname));\n\n\t\tduk__advance(comp_ctx);\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_LCURLY);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"varmap before modifying for catch clause: %!iT\",\n\t\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx)));\n\n\t\tduk_dup_top(thr);\n\t\tduk_get_prop(thr, comp_ctx->curr_func.varmap_idx);\n\t\tif (duk_is_undefined(thr, -1)) {\n\t\t\tvarmap_value = -2;\n\t\t} else if (duk_is_null(thr, -1)) {\n\t\t\tvarmap_value = -1;\n\t\t} else {\n\t\t\tDUK_ASSERT(duk_is_number(thr, -1));\n\t\t\tvarmap_value = duk_get_int(thr, -1);\n\t\t\tDUK_ASSERT(varmap_value >= 0);\n\t\t}\n\t\tduk_pop(thr);\n\n#if 0\n\t\t/* It'd be nice to do something like this - but it doesn't\n\t\t * work for closures created inside the catch clause.\n\t\t */\n\t\tduk_dup_top(thr);\n\t\tduk_push_int(thr, (duk_int_t) (reg_catch + 0));\n\t\tduk_put_prop(thr, comp_ctx->curr_func.varmap_idx);\n#endif\n\t\tduk_dup_top(thr);\n\t\tduk_push_null(thr);\n\t\tduk_put_prop(thr, comp_ctx->curr_func.varmap_idx);\n\n\t\tduk__emit_a_bc(comp_ctx,\n\t\t               DUK_OP_PUTVAR | DUK__EMIT_FLAG_A_IS_SOURCE,\n\t\t               reg_catch + 0 /*value*/,\n\t\t               rc_varname /*varname*/);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"varmap before parsing catch clause: %!iT\",\n\t\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx)));\n\n\t\tduk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);\n\t\t/* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */\n\n\t\tif (varmap_value == -2) {\n\t\t\t/* not present */\n\t\t\tduk_del_prop(thr, comp_ctx->curr_func.varmap_idx);\n\t\t} else {\n\t\t\tif (varmap_value == -1) {\n\t\t\t\tduk_push_null(thr);\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(varmap_value >= 0);\n\t\t\t\tduk_push_int(thr, varmap_value);\n\t\t\t}\n\t\t\tduk_put_prop(thr, comp_ctx->curr_func.varmap_idx);\n\t\t}\n\t\t/* varname is popped by above code */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"varmap after restore catch clause: %!iT\",\n\t\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx)));\n\n\t\tduk__emit_op_only(comp_ctx,\n\t\t                  DUK_OP_ENDCATCH);\n\n\t\t/*\n\t\t *  XXX: for now, indicate that an expensive catch binding\n\t\t *  declarative environment is always needed.  If we don't\n\t\t *  need it, we don't need the const_varname either.\n\t\t */\n\n\t\ttrycatch_flags |= DUK_BC_TRYCATCH_FLAG_CATCH_BINDING;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"stack top at end of catch clause: %ld\", (long) duk_get_top(thr)));\n\t}\n\n\tif (comp_ctx->curr_token.t == DUK_TOK_FINALLY) {\n\t\ttrycatch_flags |= DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY;\n\n\t\tpc_finally = duk__get_current_pc(comp_ctx);\n\n\t\tduk__advance(comp_ctx);\n\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_LCURLY);\n\t\tduk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);\n\t\t/* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */\n\t\tduk__emit_abc(comp_ctx,\n\t\t              DUK_OP_ENDFIN,\n\t\t              reg_catch);  /* rethrow */\n\t}\n\n\tif (!(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) &&\n\t    !(trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY)) {\n\t\t/* must have catch and/or finally */\n\t\tgoto syntax_error;\n\t}\n\n\t/* If there's no catch block, rc_varname will be 0 and duk__patch_trycatch()\n\t * will replace the LDCONST with a NOP.  For any actual constant (including\n\t * constant 0) the DUK__CONST_MARKER flag will be set in rc_varname.\n\t */\n\n\tduk__patch_trycatch(comp_ctx,\n\t                    pc_ldconst,\n\t                    pc_trycatch,\n\t                    reg_catch,\n\t                    rc_varname,\n\t                    trycatch_flags);\n\n\tif (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) {\n\t\tDUK_ASSERT(pc_catch >= 0);\n\t\tduk__patch_jump(comp_ctx, pc_trycatch + 1, pc_catch);\n\t}\n\n\tif (trycatch_flags & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) {\n\t\tDUK_ASSERT(pc_finally >= 0);\n\t\tduk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finally);\n\t} else {\n\t\t/* without finally, the second jump slot is used to jump to end of stmt */\n\t\tduk__patch_jump_here(comp_ctx, pc_trycatch + 2);\n\t}\n\n\tcomp_ctx->curr_func.catch_depth--;\n\treturn;\n\n syntax_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_TRY);\n}\n\nDUK_LOCAL void duk__parse_with_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res) {\n\tduk_int_t pc_trycatch;\n\tduk_int_t pc_finished;\n\tduk_regconst_t reg_catch;\n\tduk_small_uint_t trycatch_flags;\n\n\tif (comp_ctx->curr_func.is_strict) {\n\t\tDUK_ERROR_SYNTAX(comp_ctx->thr, DUK_STR_WITH_IN_STRICT_MODE);\n\t}\n\n\tcomp_ctx->curr_func.catch_depth++;\n\n\tduk__advance(comp_ctx);  /* eat 'with' */\n\n\treg_catch = DUK__ALLOCTEMPS(comp_ctx, 2);\n\n\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\tduk__exprtop_toforcedreg(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/, reg_catch);\n\tduk__advance_expect(comp_ctx, DUK_TOK_RPAREN);\n\n\tpc_trycatch = duk__get_current_pc(comp_ctx);\n\ttrycatch_flags = DUK_BC_TRYCATCH_FLAG_WITH_BINDING;\n\tduk__emit_a_bc(comp_ctx,\n\t                DUK_OP_TRYCATCH | DUK__EMIT_FLAG_NO_SHUFFLE_A,\n\t                (duk_regconst_t) trycatch_flags /*a*/,\n\t                reg_catch /*bc*/);\n\tduk__emit_invalid(comp_ctx);  /* catch jump */\n\tduk__emit_invalid(comp_ctx);  /* finished jump */\n\n\tduk__parse_stmt(comp_ctx, res, 0 /*allow_source_elem*/);\n\tduk__emit_op_only(comp_ctx,\n\t                  DUK_OP_ENDTRY);\n\n\tpc_finished = duk__get_current_pc(comp_ctx);\n\n\tduk__patch_jump(comp_ctx, pc_trycatch + 2, pc_finished);\n\n\tcomp_ctx->curr_func.catch_depth--;\n}\n\nDUK_LOCAL duk_int_t duk__stmt_label_site(duk_compiler_ctx *comp_ctx, duk_int_t label_id) {\n\t/* if a site already exists, nop: max one label site per statement */\n\tif (label_id >= 0) {\n\t\treturn label_id;\n\t}\n\n\tlabel_id = comp_ctx->curr_func.label_next++;\n\tDUK_DDD(DUK_DDDPRINT(\"allocated new label id for label site: %ld\", (long) label_id));\n\n\tduk__emit_bc(comp_ctx,\n\t             DUK_OP_LABEL,\n\t             (duk_regconst_t) label_id);\n\tduk__emit_invalid(comp_ctx);\n\tduk__emit_invalid(comp_ctx);\n\n\treturn label_id;\n}\n\n/* Parse a single statement.\n *\n * Creates a label site (with an empty label) automatically for iteration\n * statements.  Also \"peels off\" any label statements for explicit labels.\n */\nDUK_LOCAL void duk__parse_stmt(duk_compiler_ctx *comp_ctx, duk_ivalue *res, duk_bool_t allow_source_elem) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_bool_t dir_prol_at_entry;    /* directive prologue status at entry */\n\tduk_regconst_t temp_at_entry;\n\tduk_size_t labels_len_at_entry;\n\tduk_int_t pc_at_entry;           /* assumed to also be PC of \"LABEL\" */\n\tduk_int_t stmt_id;\n\tduk_small_uint_t stmt_flags = 0;\n\tduk_int_t label_id = -1;\n\tduk_small_uint_t tok;\n\tduk_bool_t test_func_decl;\n\n\tDUK__RECURSION_INCREASE(comp_ctx, thr);\n\n\ttemp_at_entry = DUK__GETTEMP(comp_ctx);\n\tpc_at_entry = duk__get_current_pc(comp_ctx);\n\tlabels_len_at_entry = duk_get_length(thr, comp_ctx->curr_func.labelnames_idx);\n\tstmt_id = comp_ctx->curr_func.stmt_next++;\n\tdir_prol_at_entry = comp_ctx->curr_func.in_directive_prologue;\n\n\tDUK_UNREF(stmt_id);\n\n\tDUK_DDD(DUK_DDDPRINT(\"parsing a statement, stmt_id=%ld, temp_at_entry=%ld, labels_len_at_entry=%ld, \"\n\t                     \"is_strict=%ld, in_directive_prologue=%ld, catch_depth=%ld\",\n\t                     (long) stmt_id, (long) temp_at_entry, (long) labels_len_at_entry,\n\t                     (long) comp_ctx->curr_func.is_strict, (long) comp_ctx->curr_func.in_directive_prologue,\n\t                     (long) comp_ctx->curr_func.catch_depth));\n\n\t/* The directive prologue flag is cleared by default so that it is\n\t * unset for any recursive statement parsing.  It is only \"revived\"\n\t * if a directive is detected.  (We could also make directives only\n\t * allowed if 'allow_source_elem' was true.)\n\t */\n\tcomp_ctx->curr_func.in_directive_prologue = 0;\n\n retry_parse:\n\n\tDUK_DDD(DUK_DDDPRINT(\"try stmt parse, stmt_id=%ld, label_id=%ld, allow_source_elem=%ld, catch_depth=%ld\",\n\t                     (long) stmt_id, (long) label_id, (long) allow_source_elem,\n\t                     (long) comp_ctx->curr_func.catch_depth));\n\n\t/*\n\t *  Detect iteration statements; if encountered, establish an\n\t *  empty label.\n\t */\n\n\ttok = comp_ctx->curr_token.t;\n\tif (tok == DUK_TOK_FOR || tok == DUK_TOK_DO || tok == DUK_TOK_WHILE ||\n\t    tok == DUK_TOK_SWITCH) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"iteration/switch statement -> add empty label\"));\n\n\t\tlabel_id = duk__stmt_label_site(comp_ctx, label_id);\n\t\tduk__add_label(comp_ctx,\n\t\t               DUK_HTHREAD_STRING_EMPTY_STRING(thr),\n\t\t               pc_at_entry /*pc_label*/,\n\t\t               label_id);\n\t}\n\n\t/*\n\t *  Main switch for statement / source element type.\n\t */\n\n\tswitch (comp_ctx->curr_token.t) {\n\tcase DUK_TOK_FUNCTION: {\n\t\t/*\n\t\t *  Function declaration, function expression, or (non-standard)\n\t\t *  function statement.\n\t\t *\n\t\t *  The E5 specification only allows function declarations at\n\t\t *  the top level (in \"source elements\").  An ExpressionStatement\n\t\t *  is explicitly not allowed to begin with a \"function\" keyword\n\t\t *  (E5 Section 12.4).  Hence any non-error semantics for such\n\t\t *  non-top-level statements are non-standard.  Duktape semantics\n\t\t *  for function statements are modelled after V8, see\n\t\t *  test-dev-func-decl-outside-top.js.\n\t\t */\n\t\ttest_func_decl = allow_source_elem;\n#if defined(DUK_USE_NONSTD_FUNC_STMT)\n\t\t/* Lenient: allow function declarations outside top level in\n\t\t * non-strict mode but reject them in strict mode.\n\t\t */\n\t\ttest_func_decl = test_func_decl || !comp_ctx->curr_func.is_strict;\n#endif  /* DUK_USE_NONSTD_FUNC_STMT */\n\t\t/* Strict: never allow function declarations outside top level. */\n\t\tif (test_func_decl) {\n\t\t\t/* FunctionDeclaration: not strictly a statement but handled as such.\n\t\t\t *\n\t\t\t * O(depth^2) parse count for inner functions is handled by recording a\n\t\t\t * lexer offset on the first compilation pass, so that the function can\n\t\t\t * be efficiently skipped on the second pass.  This is encapsulated into\n\t\t\t * duk__parse_func_like_fnum().\n\t\t\t */\n\n\t\t\tduk_int_t fnum;\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\tduk_idx_t top_before;\n#endif\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"function declaration statement\"));\n\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\ttop_before = duk_get_top(thr);\n#endif\n\n\t\t\tduk__advance(comp_ctx);  /* eat 'function' */\n\t\t\tfnum = duk__parse_func_like_fnum(comp_ctx, DUK__FUNC_FLAG_DECL | DUK__FUNC_FLAG_PUSHNAME_PASS1);\n\n\t\t\t/* The value stack convention here is a bit odd: the function\n\t\t\t * name is only pushed on pass 1 (in_scanning), and is needed\n\t\t\t * to process function declarations.\n\t\t\t */\n\t\t\tif (comp_ctx->curr_func.in_scanning) {\n\t\t\t\tduk_uarridx_t n;\n\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\t\tDUK_ASSERT(duk_get_top(thr) == top_before + 1);\n#endif\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"register function declaration %!T in pass 1, fnum %ld\",\n\t\t\t\t                     duk_get_tval(thr, -1), (long) fnum));\n\t\t\t\tn = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx);\n\t\t\t\t/* funcname is at index -1 */\n\t\t\t\tduk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n);\n\t\t\t\tduk_push_int(thr, (duk_int_t) (DUK_DECL_TYPE_FUNC + (fnum << 8)));\n\t\t\t\tduk_put_prop_index(thr, comp_ctx->curr_func.decls_idx, n + 1);\n\t\t\t} else {\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\t\tDUK_ASSERT(duk_get_top(thr) == top_before);\n#endif\n\t\t\t}\n\n\t\t\t/* no statement value (unlike function expression) */\n\t\t\tstmt_flags = 0;\n\t\t\tbreak;\n\t\t} else {\n\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_STMT_NOT_ALLOWED);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_TOK_LCURLY: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"block statement\"));\n\t\tduk__advance(comp_ctx);\n\t\tduk__parse_stmts(comp_ctx, 0 /*allow_source_elem*/, 0 /*expect_eof*/);\n\t\t/* the DUK_TOK_RCURLY is eaten by duk__parse_stmts() */\n\t\tif (label_id >= 0) {\n\t\t\tduk__patch_jump_here(comp_ctx, pc_at_entry + 1);  /* break jump */\n\t\t}\n\t\tstmt_flags = 0;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_CONST: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"constant declaration statement\"));\n\t\tduk__parse_var_stmt(comp_ctx, res, DUK__EXPR_FLAG_REQUIRE_INIT /*expr_flags*/);\n\t\tstmt_flags = DUK__HAS_TERM;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_VAR: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"variable declaration statement\"));\n\t\tduk__parse_var_stmt(comp_ctx, res, 0 /*expr_flags*/);\n\t\tstmt_flags = DUK__HAS_TERM;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_SEMICOLON: {\n\t\t/* empty statement with an explicit semicolon */\n\t\tDUK_DDD(DUK_DDDPRINT(\"empty statement\"));\n\t\tstmt_flags = DUK__HAS_TERM;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_IF: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"if statement\"));\n\t\tduk__parse_if_stmt(comp_ctx, res);\n\t\tif (label_id >= 0) {\n\t\t\tduk__patch_jump_here(comp_ctx, pc_at_entry + 1);  /* break jump */\n\t\t}\n\t\tstmt_flags = 0;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_DO: {\n\t\t/*\n\t\t *  Do-while statement is mostly trivial, but there is special\n\t\t *  handling for automatic semicolon handling (triggered by the\n\t\t *  DUK__ALLOW_AUTO_SEMI_ALWAYS) flag related to a bug filed at:\n\t\t *\n\t\t *    https://bugs.ecmascript.org/show_bug.cgi?id=8\n\t\t *\n\t\t *  See doc/compiler.rst for details.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"do statement\"));\n\t\tDUK_ASSERT(label_id >= 0);\n\t\tduk__update_label_flags(comp_ctx,\n\t\t                        label_id,\n\t\t                        DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE);\n\t\tduk__parse_do_stmt(comp_ctx, res, pc_at_entry);\n\t\tstmt_flags = DUK__HAS_TERM | DUK__ALLOW_AUTO_SEMI_ALWAYS;  /* DUK__ALLOW_AUTO_SEMI_ALWAYS workaround */\n\t\tbreak;\n\t}\n\tcase DUK_TOK_WHILE: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"while statement\"));\n\t\tDUK_ASSERT(label_id >= 0);\n\t\tduk__update_label_flags(comp_ctx,\n\t\t                        label_id,\n\t\t                        DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE);\n\t\tduk__parse_while_stmt(comp_ctx, res, pc_at_entry);\n\t\tstmt_flags = 0;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_FOR: {\n\t\t/*\n\t\t *  For/for-in statement is complicated to parse because\n\t\t *  determining the statement type (three-part for vs. a\n\t\t *  for-in) requires potential backtracking.\n\t\t *\n\t\t *  See the helper for the messy stuff.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"for/for-in statement\"));\n\t\tDUK_ASSERT(label_id >= 0);\n\t\tduk__update_label_flags(comp_ctx,\n\t\t                        label_id,\n\t\t                        DUK_LABEL_FLAG_ALLOW_BREAK | DUK_LABEL_FLAG_ALLOW_CONTINUE);\n\t\tduk__parse_for_stmt(comp_ctx, res, pc_at_entry);\n\t\tstmt_flags = 0;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_CONTINUE:\n\tcase DUK_TOK_BREAK: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"break/continue statement\"));\n\t\tduk__parse_break_or_continue_stmt(comp_ctx, res);\n\t\tstmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_RETURN: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"return statement\"));\n\t\tduk__parse_return_stmt(comp_ctx, res);\n\t\tstmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_WITH: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"with statement\"));\n\t\tcomp_ctx->curr_func.with_depth++;\n\t\tduk__parse_with_stmt(comp_ctx, res);\n\t\tif (label_id >= 0) {\n\t\t\tduk__patch_jump_here(comp_ctx, pc_at_entry + 1);  /* break jump */\n\t\t}\n\t\tcomp_ctx->curr_func.with_depth--;\n\t\tstmt_flags = 0;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_SWITCH: {\n\t\t/*\n\t\t *  The switch statement is pretty messy to compile.\n\t\t *  See the helper for details.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"switch statement\"));\n\t\tDUK_ASSERT(label_id >= 0);\n\t\tduk__update_label_flags(comp_ctx,\n\t\t                        label_id,\n\t\t                        DUK_LABEL_FLAG_ALLOW_BREAK);  /* don't allow continue */\n\t\tduk__parse_switch_stmt(comp_ctx, res, pc_at_entry);\n\t\tstmt_flags = 0;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_THROW: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"throw statement\"));\n\t\tduk__parse_throw_stmt(comp_ctx, res);\n\t\tstmt_flags = DUK__HAS_TERM | DUK__IS_TERMINAL;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_TRY: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"try statement\"));\n\t\tduk__parse_try_stmt(comp_ctx, res);\n\t\tstmt_flags = 0;\n\t\tbreak;\n\t}\n\tcase DUK_TOK_DEBUGGER: {\n\t\tduk__advance(comp_ctx);\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t\tDUK_DDD(DUK_DDDPRINT(\"debugger statement: debugging enabled, emit debugger opcode\"));\n\t\tduk__emit_op_only(comp_ctx, DUK_OP_DEBUGGER);\n#else\n\t\tDUK_DDD(DUK_DDDPRINT(\"debugger statement: ignored\"));\n#endif\n\t\tstmt_flags = DUK__HAS_TERM;\n\t\tbreak;\n\t}\n\tdefault: {\n\t\t/*\n\t\t *  Else, must be one of:\n\t\t *    - ExpressionStatement, possibly a directive (String)\n\t\t *    - LabelledStatement (Identifier followed by ':')\n\t\t *\n\t\t *  Expressions beginning with 'function' keyword are covered by a case\n\t\t *  above (such expressions are not allowed in standard E5 anyway).\n\t\t *  Also expressions starting with '{' are interpreted as block\n\t\t *  statements.  See E5 Section 12.4.\n\t\t *\n\t\t *  Directive detection is tricky; see E5 Section 14.1 on directive\n\t\t *  prologue.  A directive is an expression statement with a single\n\t\t *  string literal and an explicit or automatic semicolon.  Escape\n\t\t *  characters are significant and no parens etc are allowed:\n\t\t *\n\t\t *    'use strict';          // valid 'use strict' directive\n\t\t *    'use\\u0020strict';     // valid directive, not a 'use strict' directive\n\t\t *    ('use strict');        // not a valid directive\n\t\t *\n\t\t *  The expression is determined to consist of a single string literal\n\t\t *  based on duk__expr_nud() and duk__expr_led() call counts.  The string literal\n\t\t *  of a 'use strict' directive is determined to lack any escapes based\n\t\t *  num_escapes count from the lexer.  Note that other directives may be\n\t\t *  allowed to contain escapes, so a directive with escapes does not\n\t\t *  terminate a directive prologue.\n\t\t *\n\t\t *  We rely on the fact that the expression parser will not emit any\n\t\t *  code for a single token expression.  However, it will generate an\n\t\t *  intermediate value which we will then successfully ignore.\n\t\t *\n\t\t *  A similar approach is used for labels.\n\t\t */\n\n\t\tduk_bool_t single_token;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"expression statement\"));\n\t\tduk__exprtop(comp_ctx, res, DUK__BP_FOR_EXPR /*rbp_flags*/);\n\n\t\tsingle_token = (comp_ctx->curr_func.nud_count == 1 &&  /* one token */\n\t\t                comp_ctx->curr_func.led_count == 0);   /* no operators */\n\n\t\tif (single_token &&\n\t\t    comp_ctx->prev_token.t == DUK_TOK_IDENTIFIER &&\n\t\t    comp_ctx->curr_token.t == DUK_TOK_COLON) {\n\t\t\t/*\n\t\t\t *  Detected label\n\t\t\t */\n\n\t\t\tduk_hstring *h_lab;\n\n\t\t\t/* expected ival */\n\t\t\tDUK_ASSERT(res->t == DUK_IVAL_VAR);\n\t\t\tDUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx)));\n\t\t\th_lab = comp_ctx->prev_token.str1;\n\t\t\tDUK_ASSERT(h_lab != NULL);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"explicit label site for label '%!O'\",\n\t\t\t                     (duk_heaphdr *) h_lab));\n\n\t\t\tduk__advance(comp_ctx);  /* eat colon */\n\n\t\t\tlabel_id = duk__stmt_label_site(comp_ctx, label_id);\n\n\t\t\tduk__add_label(comp_ctx,\n\t\t\t               h_lab,\n\t\t\t               pc_at_entry /*pc_label*/,\n\t\t\t               label_id);\n\n\t\t\t/* a statement following a label cannot be a source element\n\t\t\t * (a function declaration).\n\t\t\t */\n\t\t\tallow_source_elem = 0;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"label handled, retry statement parsing\"));\n\t\t\tgoto retry_parse;\n\t\t}\n\n\t\tstmt_flags = 0;\n\n\t\tif (dir_prol_at_entry &&                           /* still in prologue */\n\t\t    single_token &&                                /* single string token */\n\t\t    comp_ctx->prev_token.t == DUK_TOK_STRING) {\n\t\t\t/*\n\t\t\t *  Detected a directive\n\t\t\t */\n\t\t\tduk_hstring *h_dir;\n\n\t\t\t/* expected ival */\n\t\t\tDUK_ASSERT(res->t == DUK_IVAL_PLAIN);\n\t\t\tDUK_ASSERT(res->x1.t == DUK_ISPEC_VALUE);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(duk_get_tval(thr, res->x1.valstack_idx)));\n\t\t\th_dir = comp_ctx->prev_token.str1;\n\t\t\tDUK_ASSERT(h_dir != NULL);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"potential directive: %!O\", h_dir));\n\n\t\t\tstmt_flags |= DUK__STILL_PROLOGUE;\n\n\t\t\t/* Note: escaped characters differentiate directives */\n\n\t\t\tif (comp_ctx->prev_token.num_escapes > 0) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"directive contains escapes: valid directive \"\n\t\t\t\t                     \"but we ignore such directives\"));\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t * The length comparisons are present to handle\n\t\t\t\t * strings like \"use strict\\u0000foo\" as required.\n\t\t\t\t */\n\n\t\t\t\tif (DUK_HSTRING_GET_BYTELEN(h_dir) == 10 &&\n\t\t\t\t    DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), \"use strict\", 10) == 0) {\n#if defined(DUK_USE_STRICT_DECL)\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"use strict directive detected: strict flag %ld -> %ld\",\n\t\t\t\t\t                     (long) comp_ctx->curr_func.is_strict, (long) 1));\n\t\t\t\t\tcomp_ctx->curr_func.is_strict = 1;\n#else\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"use strict detected but strict declarations disabled, ignoring\"));\n#endif\n\t\t\t\t} else if (DUK_HSTRING_GET_BYTELEN(h_dir) == 14 &&\n\t\t\t\t           DUK_STRNCMP((const char *) DUK_HSTRING_GET_DATA(h_dir), \"use duk notail\", 14) == 0) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"use duk notail directive detected: notail flag %ld -> %ld\",\n\t\t\t\t\t                     (long) comp_ctx->curr_func.is_notail, (long) 1));\n\t\t\t\t\tcomp_ctx->curr_func.is_notail = 1;\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"unknown directive: '%!O', ignoring but not terminating \"\n\t\t\t\t\t                   \"directive prologue\", (duk_hobject *) h_dir));\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"non-directive expression statement or no longer in prologue; \"\n\t\t\t                     \"prologue terminated if still active\"));\n                }\n\n\t\tstmt_flags |= DUK__HAS_VAL | DUK__HAS_TERM;\n\t}\n\t}  /* end switch (tok) */\n\n\t/*\n\t *  Statement value handling.\n\t *\n\t *  Global code and eval code has an implicit return value\n\t *  which comes from the last statement with a value\n\t *  (technically a non-\"empty\" continuation, which is\n\t *  different from an empty statement).\n\t *\n\t *  Since we don't know whether a later statement will\n\t *  override the value of the current statement, we need\n\t *  to coerce the statement value to a register allocated\n\t *  for implicit return values.  In other cases we need\n\t *  to coerce the statement value to a plain value to get\n\t *  any side effects out (consider e.g. \"foo.bar;\").\n\t */\n\n\t/* XXX: what about statements which leave a half-cooked value in 'res'\n\t * but have no stmt value?  Any such statements?\n\t */\n\n\tif (stmt_flags & DUK__HAS_VAL) {\n\t\tduk_regconst_t reg_stmt_value = comp_ctx->curr_func.reg_stmt_value;\n\t\tif (reg_stmt_value >= 0) {\n\t\t\tduk__ivalue_toforcedreg(comp_ctx, res, reg_stmt_value);\n\t\t} else {\n\t\t\tduk__ivalue_toplain_ignore(comp_ctx, res);\n\t\t}\n\t} else {\n\t\t;\n\t}\n\n\t/*\n\t *  Statement terminator check, including automatic semicolon\n\t *  handling.  After this step, 'curr_tok' should be the first\n\t *  token after a possible statement terminator.\n\t */\n\n\tif (stmt_flags & DUK__HAS_TERM) {\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_SEMICOLON) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"explicit semicolon terminates statement\"));\n\t\t\tduk__advance(comp_ctx);\n\t\t} else {\n\t\t\tif (comp_ctx->curr_token.allow_auto_semi) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"automatic semicolon terminates statement\"));\n\t\t\t} else if (stmt_flags & DUK__ALLOW_AUTO_SEMI_ALWAYS) {\n\t\t\t\t/* XXX: make this lenience dependent on flags or strictness? */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"automatic semicolon terminates statement (allowed for compatibility \"\n\t\t\t\t                     \"even though no lineterm present before next token)\"));\n\t\t\t} else {\n\t\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_UNTERMINATED_STMT);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"statement has no terminator\"));\n\t}\n\n\t/*\n\t *  Directive prologue tracking.\n\t */\n\n\tif (stmt_flags & DUK__STILL_PROLOGUE) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"setting in_directive_prologue\"));\n\t\tcomp_ctx->curr_func.in_directive_prologue = 1;\n\t}\n\n\t/*\n\t *  Cleanups (all statement parsing flows through here).\n\t *\n\t *  Pop label site and reset labels.  Reset 'next temp' to value at\n\t *  entry to reuse temps.\n\t */\n\n\tif (label_id >= 0) {\n\t\tduk__emit_bc(comp_ctx,\n\t\t             DUK_OP_ENDLABEL,\n\t\t             (duk_regconst_t) label_id);\n\t}\n\n\tDUK__SETTEMP(comp_ctx, temp_at_entry);\n\n\tduk__reset_labels_to_length(comp_ctx, labels_len_at_entry);\n\n\t/* XXX: return indication of \"terminalness\" (e.g. a 'throw' is terminal) */\n\n\tDUK__RECURSION_DECREASE(comp_ctx, thr);\n}\n\n/*\n *  Parse a statement list.\n *\n *  Handles automatic semicolon insertion and implicit return value.\n *\n *  Upon entry, 'curr_tok' should contain the first token of the first\n *  statement (parsed in the \"allow regexp literal\" mode).  Upon exit,\n *  'curr_tok' contains the token following the statement list terminator\n *  (EOF or closing brace).\n */\n\nDUK_LOCAL void duk__parse_stmts(duk_compiler_ctx *comp_ctx, duk_bool_t allow_source_elem, duk_bool_t expect_eof) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_ivalue res_alloc;\n\tduk_ivalue *res = &res_alloc;\n\n\t/* Setup state.  Initial ivalue is 'undefined'. */\n\n\tduk_require_stack(thr, DUK__PARSE_STATEMENTS_SLOTS);\n\n\t/* XXX: 'res' setup can be moved to function body level; in fact, two 'res'\n\t * intermediate values suffice for parsing of each function.  Nesting is needed\n\t * for nested functions (which may occur inside expressions).\n\t */\n\n\tDUK_MEMZERO(&res_alloc, sizeof(res_alloc));\n\tres->t = DUK_IVAL_PLAIN;\n\tres->x1.t = DUK_ISPEC_VALUE;\n\tres->x1.valstack_idx = duk_get_top(thr);\n\tres->x2.valstack_idx = res->x1.valstack_idx + 1;\n\tduk_push_undefined(thr);\n\tduk_push_undefined(thr);\n\n\t/* Parse statements until a closing token (EOF or '}') is found. */\n\n\tfor (;;) {\n\t\t/* Check whether statement list ends. */\n\n\t\tif (expect_eof) {\n\t\t\tif (comp_ctx->curr_token.t == DUK_TOK_EOF) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (comp_ctx->curr_token.t == DUK_TOK_RCURLY) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* Check statement type based on the first token type.\n\t\t *\n\t\t * Note: expression parsing helpers expect 'curr_tok' to\n\t\t * contain the first token of the expression upon entry.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"TOKEN %ld (non-whitespace, non-comment)\", (long) comp_ctx->curr_token.t));\n\n\t\tduk__parse_stmt(comp_ctx, res, allow_source_elem);\n\t}\n\n\tduk__advance(comp_ctx);\n\n\t/* Tear down state. */\n\n\tduk_pop_2(thr);\n}\n\n/*\n *  Declaration binding instantiation conceptually happens when calling a\n *  function; for us it essentially means that function prologue.  The\n *  conceptual process is described in E5 Section 10.5.\n *\n *  We need to keep track of all encountered identifiers to (1) create an\n *  identifier-to-register map (\"varmap\"); and (2) detect duplicate\n *  declarations.  Identifiers which are not bound to registers still need\n *  to be tracked for detecting duplicates.  Currently such identifiers\n *  are put into the varmap with a 'null' value, which is later cleaned up.\n *\n *  To support functions with a large number of variable and function\n *  declarations, registers are not allocated beyond a certain limit;\n *  after that limit, variables and functions need slow path access.\n *  Arguments are currently always register bound, which imposes a hard\n *  (and relatively small) argument count limit.\n *\n *  Some bindings in E5 are not configurable (= deletable) and almost all\n *  are mutable (writable).  Exceptions are:\n *\n *    - The 'arguments' binding, established only if no shadowing argument\n *      or function declaration exists.  We handle 'arguments' creation\n *      and binding through an explicit slow path environment record.\n *\n *    - The \"name\" binding for a named function expression.  This is also\n *      handled through an explicit slow path environment record.\n */\n\n/* XXX: add support for variables to not be register bound always, to\n * handle cases with a very large number of variables?\n */\n\nDUK_LOCAL void duk__init_varmap_and_prologue_for_pass2(duk_compiler_ctx *comp_ctx, duk_regconst_t *out_stmt_value_reg) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_hstring *h_name;\n\tduk_bool_t configurable_bindings;\n\tduk_uarridx_t num_args;\n\tduk_uarridx_t num_decls;\n\tduk_regconst_t rc_name;\n\tduk_small_uint_t declvar_flags;\n\tduk_uarridx_t i;\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_idx_t entry_top;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\tentry_top = duk_get_top(thr);\n#endif\n\n\t/*\n\t *  Preliminaries\n\t */\n\n\tconfigurable_bindings = comp_ctx->curr_func.is_eval;\n\tDUK_DDD(DUK_DDDPRINT(\"configurable_bindings=%ld\", (long) configurable_bindings));\n\n\t/* varmap is already in comp_ctx->curr_func.varmap_idx */\n\n\t/*\n\t *  Function formal arguments, always bound to registers\n\t *  (there's no support for shuffling them now).\n\t */\n\n\tnum_args = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx);\n\tDUK_DDD(DUK_DDDPRINT(\"num_args=%ld\", (long) num_args));\n\t/* XXX: check num_args */\n\n\tfor (i = 0; i < num_args; i++) {\n\t\tduk_get_prop_index(thr, comp_ctx->curr_func.argnames_idx, i);\n\t\th_name = duk_known_hstring(thr, -1);\n\n\t\tif (comp_ctx->curr_func.is_strict) {\n\t\t\tif (duk__hstring_is_eval_or_arguments(comp_ctx, h_name)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"arg named 'eval' or 'arguments' in strict mode -> SyntaxError\"));\n\t\t\t\tgoto error_argname;\n\t\t\t}\n\t\t\tduk_dup_top(thr);\n\t\t\tif (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"duplicate arg name in strict mode -> SyntaxError\"));\n\t\t\t\tgoto error_argname;\n\t\t\t}\n\n\t\t\t/* Ensure argument name is not a reserved word in current\n\t\t\t * (final) strictness.  Formal argument parsing may not\n\t\t\t * catch reserved names if strictness changes during\n\t\t\t * parsing.\n\t\t\t *\n\t\t\t * We only need to do this in strict mode because non-strict\n\t\t\t * keyword are always detected in formal argument parsing.\n\t\t\t */\n\n\t\t\tif (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(h_name)) {\n\t\t\t\tgoto error_argname;\n\t\t\t}\n\t\t}\n\n\t\t/* overwrite any previous binding of the same name; the effect is\n\t\t * that last argument of a certain name wins.\n\t\t */\n\n\t\t/* only functions can have arguments */\n\t\tDUK_ASSERT(comp_ctx->curr_func.is_function);\n\t\tduk_push_uarridx(thr, i);  /* -> [ ... name index ] */\n\t\tduk_put_prop(thr, comp_ctx->curr_func.varmap_idx); /* -> [ ... ] */\n\n\t\t/* no code needs to be emitted, the regs already have values */\n\t}\n\n\t/* use temp_next for tracking register allocations */\n\tDUK__SETTEMP_CHECKMAX(comp_ctx, (duk_regconst_t) num_args);\n\n\t/*\n\t *  After arguments, allocate special registers (like shuffling temps)\n\t */\n\n\tif (out_stmt_value_reg) {\n\t\t*out_stmt_value_reg = DUK__ALLOCTEMP(comp_ctx);\n\t}\n\tif (comp_ctx->curr_func.needs_shuffle) {\n\t\tduk_regconst_t shuffle_base = DUK__ALLOCTEMPS(comp_ctx, 3);\n\t\tcomp_ctx->curr_func.shuffle1 = shuffle_base;\n\t\tcomp_ctx->curr_func.shuffle2 = shuffle_base + 1;\n\t\tcomp_ctx->curr_func.shuffle3 = shuffle_base + 2;\n\t\tDUK_D(DUK_DPRINT(\"shuffle registers needed by function, allocated: %ld %ld %ld\",\n\t\t                 (long) comp_ctx->curr_func.shuffle1,\n\t\t                 (long) comp_ctx->curr_func.shuffle2,\n\t\t                 (long) comp_ctx->curr_func.shuffle3));\n\t}\n\tif (comp_ctx->curr_func.temp_next > 0x100) {\n\t\tDUK_D(DUK_DPRINT(\"not enough 8-bit regs: temp_next=%ld\", (long) comp_ctx->curr_func.temp_next));\n\t\tgoto error_outofregs;\n\t}\n\n\t/*\n\t *  Function declarations\n\t */\n\n\tnum_decls = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.decls_idx);\n\tDUK_DDD(DUK_DDDPRINT(\"num_decls=%ld -> %!T\",\n\t                     (long) num_decls,\n\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.decls_idx)));\n\tfor (i = 0; i < num_decls; i += 2) {\n\t\tduk_int_t decl_type;\n\t\tduk_int_t fnum;\n\n\t\tduk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1);  /* decl type */\n\t\tdecl_type = duk_to_int(thr, -1);\n\t\tfnum = decl_type >> 8;  /* XXX: macros */\n\t\tdecl_type = decl_type & 0xff;\n\t\tduk_pop(thr);\n\n\t\tif (decl_type != DUK_DECL_TYPE_FUNC) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tduk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i);  /* decl name */\n\n\t\t/* XXX: spilling */\n\t\tif (comp_ctx->curr_func.is_function) {\n\t\t\tduk_regconst_t reg_bind;\n\t\t\tduk_dup_top(thr);\n\t\t\tif (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) {\n\t\t\t\t/* shadowed; update value */\n\t\t\t\tduk_dup_top(thr);\n\t\t\t\tduk_get_prop(thr, comp_ctx->curr_func.varmap_idx);\n\t\t\t\treg_bind = duk_to_int(thr, -1);  /* [ ... name reg_bind ] */\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               DUK_OP_CLOSURE,\n\t\t\t\t               reg_bind,\n\t\t\t\t               (duk_regconst_t) fnum);\n\t\t\t} else {\n\t\t\t\t/* function: always register bound */\n\t\t\t\treg_bind = DUK__ALLOCTEMP(comp_ctx);\n\t\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t\t               DUK_OP_CLOSURE,\n\t\t\t\t               reg_bind,\n\t\t\t\t               (duk_regconst_t) fnum);\n\t\t\t\tduk_push_int(thr, (duk_int_t) reg_bind);\n\t\t\t}\n\t\t} else {\n\t\t\t/* Function declaration for global/eval code is emitted even\n\t\t\t * for duplicates, because of E5 Section 10.5, step 5.e of\n\t\t\t * E5.1 (special behavior for variable bound to global object).\n\t\t\t *\n\t\t\t * DECLVAR will not re-declare a variable as such, but will\n\t\t\t * update the binding value.\n\t\t\t */\n\n\t\t\tduk_regconst_t reg_temp = DUK__ALLOCTEMP(comp_ctx);\n\t\t\tduk_dup_top(thr);\n\t\t\trc_name = duk__getconst(comp_ctx);\n\t\t\tduk_push_null(thr);\n\n\t\t\tduk__emit_a_bc(comp_ctx,\n\t\t\t               DUK_OP_CLOSURE,\n\t\t\t               reg_temp,\n\t\t\t               (duk_regconst_t) fnum);\n\n\t\t\tdeclvar_flags = DUK_PROPDESC_FLAG_WRITABLE |\n\t\t\t                DUK_PROPDESC_FLAG_ENUMERABLE |\n\t\t\t                DUK_BC_DECLVAR_FLAG_FUNC_DECL;\n\n\t\t\tif (configurable_bindings) {\n\t\t\t\tdeclvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t\t}\n\n\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t                DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t                (duk_regconst_t) declvar_flags /*flags*/,\n\t\t\t                rc_name /*name*/,\n\t\t\t                reg_temp /*value*/);\n\n\t\t\tDUK__SETTEMP(comp_ctx, reg_temp);  /* forget temp */\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"function declaration to varmap: %!T -> %!T\",\n\t\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n#if defined(DUK_USE_FASTINT)\n\t\tDUK_ASSERT(DUK_TVAL_IS_NULL(duk_get_tval(thr, -1)) || DUK_TVAL_IS_FASTINT(duk_get_tval(thr, -1)));\n#endif\n\t\tduk_put_prop(thr, comp_ctx->curr_func.varmap_idx);  /* [ ... name reg/null ] -> [ ... ] */\n\t}\n\n\t/*\n\t *  'arguments' binding is special; if a shadowing argument or\n\t *  function declaration exists, an arguments object will\n\t *  definitely not be needed, regardless of whether the identifier\n\t *  'arguments' is referenced inside the function body.\n\t */\n\n\tif (duk_has_prop_stridx(thr, comp_ctx->curr_func.varmap_idx, DUK_STRIDX_LC_ARGUMENTS)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"'arguments' is shadowed by argument or function declaration \"\n\t\t                     \"-> arguments object creation can be skipped\"));\n\t\tcomp_ctx->curr_func.is_arguments_shadowed = 1;\n\t}\n\n\t/*\n\t *  Variable declarations.\n\t *\n\t *  Unlike function declarations, variable declaration values don't get\n\t *  assigned on entry.  If a binding of the same name already exists, just\n\t *  ignore it silently.\n\t */\n\n\tfor (i = 0; i < num_decls; i += 2) {\n\t\tduk_int_t decl_type;\n\n\t\tduk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i + 1);  /* decl type */\n\t\tdecl_type = duk_to_int(thr, -1);\n\t\tdecl_type = decl_type & 0xff;\n\t\tduk_pop(thr);\n\n\t\tif (decl_type != DUK_DECL_TYPE_VAR) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tduk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i);  /* decl name */\n\n\t\tif (duk_has_prop(thr, comp_ctx->curr_func.varmap_idx)) {\n\t\t\t/* shadowed, ignore */\n\t\t} else {\n\t\t\tduk_get_prop_index(thr, comp_ctx->curr_func.decls_idx, i);  /* decl name */\n\t\t\th_name = duk_known_hstring(thr, -1);\n\n\t\t\tif (h_name == DUK_HTHREAD_STRING_LC_ARGUMENTS(thr) &&\n\t\t\t    !comp_ctx->curr_func.is_arguments_shadowed) {\n\t\t\t\t/* E5 Section steps 7-8 */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"'arguments' not shadowed by a function declaration, \"\n\t\t\t\t                     \"but appears as a variable declaration -> treat as \"\n\t\t\t\t                     \"a no-op for variable declaration purposes\"));\n\t\t\t\tduk_pop(thr);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/* XXX: spilling */\n\t\t\tif (comp_ctx->curr_func.is_function) {\n\t\t\t\tduk_regconst_t reg_bind = DUK__ALLOCTEMP(comp_ctx);\n\t\t\t\t/* no need to init reg, it will be undefined on entry */\n\t\t\t\tduk_push_int(thr, (duk_int_t) reg_bind);\n\t\t\t} else {\n\t\t\t\tduk_dup_top(thr);\n\t\t\t\trc_name = duk__getconst(comp_ctx);\n\t\t\t\tduk_push_null(thr);\n\n\t\t\t\tdeclvar_flags = DUK_PROPDESC_FLAG_WRITABLE |\n\t\t\t                        DUK_PROPDESC_FLAG_ENUMERABLE;\n\t\t\t\tif (configurable_bindings) {\n\t\t\t\t\tdeclvar_flags |= DUK_PROPDESC_FLAG_CONFIGURABLE;\n\t\t\t\t}\n\n\t\t\t\tduk__emit_a_b_c(comp_ctx,\n\t\t\t\t                DUK_OP_DECLVAR | DUK__EMIT_FLAG_NO_SHUFFLE_A | DUK__EMIT_FLAG_BC_REGCONST,\n\t\t\t\t                (duk_regconst_t) declvar_flags /*flags*/,\n\t\t\t\t                rc_name /*name*/,\n\t\t\t\t                0 /*value*/);\n\t\t\t}\n\n\t\t\tduk_put_prop(thr, comp_ctx->curr_func.varmap_idx);  /* [ ... name reg/null ] -> [ ... ] */\n\t\t}\n\t}\n\n\t/*\n\t *  Wrap up\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"varmap: %!T, is_arguments_shadowed=%ld\",\n\t                     (duk_tval *) duk_get_tval(thr, comp_ctx->curr_func.varmap_idx),\n\t                     (long) comp_ctx->curr_func.is_arguments_shadowed));\n\n\tDUK_ASSERT_TOP(thr, entry_top);\n\treturn;\n\n error_outofregs:\n\tDUK_ERROR_RANGE(thr, DUK_STR_REG_LIMIT);\n\tDUK_UNREACHABLE();\n\treturn;\n\n error_argname:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_ARG_NAME);\n\tDUK_UNREACHABLE();\n\treturn;\n}\n\n/*\n *  Parse a function-body-like expression (FunctionBody or Program\n *  in E5 grammar) using a two-pass parse.  The productions appear\n *  in the following contexts:\n *\n *    - function expression\n *    - function statement\n *    - function declaration\n *    - getter in object literal\n *    - setter in object literal\n *    - global code\n *    - eval code\n *    - Function constructor body\n *\n *  This function only parses the statement list of the body; the argument\n *  list and possible function name must be initialized by the caller.\n *  For instance, for Function constructor, the argument names are originally\n *  on the value stack.  The parsing of statements ends either at an EOF or\n *  a closing brace; this is controlled by an input flag.\n *\n *  Note that there are many differences affecting parsing and even code\n *  generation:\n *\n *    - Global and eval code have an implicit return value generated\n *      by the last statement; function code does not\n *\n *    - Global code, eval code, and Function constructor body end in\n *      an EOF, other bodies in a closing brace ('}')\n *\n *  Upon entry, 'curr_tok' is ignored and the function will pull in the\n *  first token on its own.  Upon exit, 'curr_tok' is the terminating\n *  token (EOF or closing brace).\n */\n\nDUK_LOCAL void duk__parse_func_body(duk_compiler_ctx *comp_ctx, duk_bool_t expect_eof, duk_bool_t implicit_return_value, duk_small_int_t expect_token) {\n\tduk_compiler_func *func;\n\tduk_hthread *thr;\n\tduk_regconst_t reg_stmt_value = -1;\n\tduk_lexer_point lex_pt;\n\tduk_regconst_t temp_first;\n\tduk_small_int_t compile_round = 1;\n\n\tDUK_ASSERT(comp_ctx != NULL);\n\n\tthr = comp_ctx->thr;\n\tDUK_ASSERT(thr != NULL);\n\n\tfunc = &comp_ctx->curr_func;\n\tDUK_ASSERT(func != NULL);\n\n\tDUK__RECURSION_INCREASE(comp_ctx, thr);\n\n\tduk_require_stack(thr, DUK__FUNCTION_BODY_REQUIRE_SLOTS);\n\n\t/*\n\t *  Store lexer position for a later rewind\n\t */\n\n\tDUK_LEXER_GETPOINT(&comp_ctx->lex, &lex_pt);\n\n\t/*\n\t *  Program code (global and eval code) has an implicit return value\n\t *  from the last statement value (e.g. eval(\"1; 2+3;\") returns 3).\n\t *  This is not the case with functions.  If implicit statement return\n\t *  value is requested, all statements are coerced to a register\n\t *  allocated here, and used in the implicit return statement below.\n\t */\n\n\t/* XXX: this is pointless here because pass 1 is throw-away */\n\tif (implicit_return_value) {\n\t\treg_stmt_value = DUK__ALLOCTEMP(comp_ctx);\n\n\t\t/* If an implicit return value is needed by caller, it must be\n\t\t * initialized to 'undefined' because we don't know whether any\n\t\t * non-empty (where \"empty\" is a continuation type, and different\n\t\t * from an empty statement) statements will be executed.\n\t\t *\n\t\t * However, since 1st pass is a throwaway one, no need to emit\n\t\t * it here.\n\t\t */\n#if 0\n\t\tduk__emit_bc(comp_ctx,\n\t\t             DUK_OP_LDUNDEF,\n\t\t             0);\n#endif\n\t}\n\n\t/*\n\t *  First pass.\n\t *\n\t *  Gather variable/function declarations needed for second pass.\n\t *  Code generated is dummy and discarded.\n\t */\n\n\tfunc->in_directive_prologue = 1;\n\tfunc->in_scanning = 1;\n\tfunc->may_direct_eval = 0;\n\tfunc->id_access_arguments = 0;\n\tfunc->id_access_slow = 0;\n\tfunc->id_access_slow_own = 0;\n\tfunc->reg_stmt_value = reg_stmt_value;\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tfunc->min_line = DUK_INT_MAX;\n\tfunc->max_line = 0;\n#endif\n\n\t/* duk__parse_stmts() expects curr_tok to be set; parse in \"allow regexp literal\" mode with current strictness */\n\tif (expect_token >= 0) {\n\t\t/* Eating a left curly; regexp mode is allowed by left curly\n\t\t * based on duk__token_lbp[] automatically.\n\t\t */\n\t\tDUK_ASSERT(expect_token == DUK_TOK_LCURLY);\n\t\tduk__update_lineinfo_currtoken(comp_ctx);\n\t\tduk__advance_expect(comp_ctx, expect_token);\n\t} else {\n\t\t/* Need to set curr_token.t because lexing regexp mode depends on current\n\t\t * token type.  Zero value causes \"allow regexp\" mode.\n\t\t */\n\t\tcomp_ctx->curr_token.t = 0;\n\t\tduk__advance(comp_ctx);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"begin 1st pass\"));\n\tduk__parse_stmts(comp_ctx,\n\t                 1,             /* allow source elements */\n\t                 expect_eof);   /* expect EOF instead of } */\n\tDUK_DDD(DUK_DDDPRINT(\"end 1st pass\"));\n\n\t/*\n\t *  Second (and possibly third) pass.\n\t *\n\t *  Generate actual code.  In most cases the need for shuffle\n\t *  registers is detected during pass 1, but in some corner cases\n\t *  we'll only detect it during pass 2 and a third pass is then\n\t *  needed (see GH-115).\n\t */\n\n\tfor (;;) {\n\t\tduk_bool_t needs_shuffle_before = comp_ctx->curr_func.needs_shuffle;\n\t\tcompile_round++;\n\n\t\t/*\n\t\t *  Rewind lexer.\n\t\t *\n\t\t *  duk__parse_stmts() expects curr_tok to be set; parse in \"allow regexp\n\t\t *  literal\" mode with current strictness.\n\t\t *\n\t\t *  curr_token line number info should be initialized for pass 2 before\n\t\t *  generating prologue, to ensure prologue bytecode gets nice line numbers.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"rewind lexer\"));\n\t\tDUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt);\n\t\tcomp_ctx->curr_token.t = 0;  /* this is needed for regexp mode */\n\t\tcomp_ctx->curr_token.start_line = 0;  /* needed for line number tracking (becomes prev_token.start_line) */\n\t\tduk__advance(comp_ctx);\n\n\t\t/*\n\t\t *  Reset function state and perform register allocation, which creates\n\t\t *  'varmap' for second pass.  Function prologue for variable declarations,\n\t\t *  binding value initializations etc is emitted as a by-product.\n\t\t *\n\t\t *  Strict mode restrictions for duplicate and invalid argument\n\t\t *  names are checked here now that we know whether the function\n\t\t *  is actually strict.  See: test-dev-strict-mode-boundary.js.\n\t\t *\n\t\t *  Inner functions are compiled during pass 1 and are not reset.\n\t\t */\n\n\t\tduk__reset_func_for_pass2(comp_ctx);\n\t\tfunc->in_directive_prologue = 1;\n\t\tfunc->in_scanning = 0;\n\n\t\t/* must be able to emit code, alloc consts, etc. */\n\n\t\tduk__init_varmap_and_prologue_for_pass2(comp_ctx,\n\t\t                                        (implicit_return_value ? &reg_stmt_value : NULL));\n\t\tfunc->reg_stmt_value = reg_stmt_value;\n\n\t\ttemp_first = DUK__GETTEMP(comp_ctx);\n\n\t\tfunc->temp_first = temp_first;\n\t\tfunc->temp_next = temp_first;\n\t\tfunc->stmt_next = 0;\n\t\tfunc->label_next = 0;\n\n\t\t/* XXX: init or assert catch depth etc -- all values */\n\t\tfunc->id_access_arguments = 0;\n\t\tfunc->id_access_slow = 0;\n\t\tfunc->id_access_slow_own = 0;\n\n\t\t/*\n\t\t *  Check function name validity now that we know strictness.\n\t\t *  This only applies to function declarations and expressions,\n\t\t *  not setter/getter name.\n\t\t *\n\t\t *  See: test-dev-strict-mode-boundary.js\n\t\t */\n\n\t\tif (func->is_function && !func->is_setget && func->h_name != NULL) {\n\t\t\tif (func->is_strict) {\n\t\t\t\tif (duk__hstring_is_eval_or_arguments(comp_ctx, func->h_name)) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"func name is 'eval' or 'arguments' in strict mode\"));\n\t\t\t\t\tgoto error_funcname;\n\t\t\t\t}\n\t\t\t\tif (DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"func name is a reserved word in strict mode\"));\n\t\t\t\t\tgoto error_funcname;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (DUK_HSTRING_HAS_RESERVED_WORD(func->h_name) &&\n\t\t\t\t    !DUK_HSTRING_HAS_STRICT_RESERVED_WORD(func->h_name)) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"func name is a reserved word in non-strict mode\"));\n\t\t\t\t\tgoto error_funcname;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t *  Second pass parsing.\n\t\t */\n\n\t\tif (implicit_return_value) {\n\t\t\t/* Default implicit return value. */\n\t\t\tduk__emit_bc(comp_ctx,\n\t\t\t             DUK_OP_LDUNDEF,\n\t\t\t             0);\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"begin 2nd pass\"));\n\t\tduk__parse_stmts(comp_ctx,\n\t\t                 1,             /* allow source elements */\n\t\t                 expect_eof);   /* expect EOF instead of } */\n\t\tDUK_DDD(DUK_DDDPRINT(\"end 2nd pass\"));\n\n\t\tduk__update_lineinfo_currtoken(comp_ctx);\n\n\t\tif (needs_shuffle_before == comp_ctx->curr_func.needs_shuffle) {\n\t\t\t/* Shuffle decision not changed. */\n\t\t\tbreak;\n\t\t}\n\t\tif (compile_round >= 3) {\n\t\t\t/* Should never happen but avoid infinite loop just in case. */\n\t\t\tDUK_D(DUK_DPRINT(\"more than 3 compile passes needed, should never happen\"));\n\t\t\tDUK_ERROR_INTERNAL(thr);\n\t\t}\n\t\tDUK_D(DUK_DPRINT(\"need additional round to compile function, round now %d\", (int) compile_round));\n\t}\n\n\t/*\n\t *  Emit a final RETURN.\n\t *\n\t *  It would be nice to avoid emitting an unnecessary \"return\" opcode\n\t *  if the current PC is not reachable.  However, this cannot be reliably\n\t *  detected; even if the previous instruction is an unconditional jump,\n\t *  there may be a previous jump which jumps to current PC (which is the\n\t *  case for iteration and conditional statements, for instance).\n\t */\n\n\t/* XXX: request a \"last statement is terminal\" from duk__parse_stmt() and duk__parse_stmts();\n\t * we could avoid the last RETURN if we could ensure there is no way to get here\n\t * (directly or via a jump)\n\t */\n\n\tDUK_ASSERT(comp_ctx->curr_func.catch_depth == 0);\n\tif (reg_stmt_value >= 0) {\n\t\tDUK_ASSERT(DUK__ISREG(reg_stmt_value));\n\t\tduk__emit_bc(comp_ctx, DUK_OP_RETREG, reg_stmt_value /*reg*/);\n\t} else {\n\t\tduk__emit_op_only(comp_ctx, DUK_OP_RETUNDEF);\n\t}\n\n\t/*\n\t *  Peephole optimize JUMP chains.\n\t */\n\n\tduk__peephole_optimize_bytecode(comp_ctx);\n\n\t/*\n\t *  comp_ctx->curr_func is now ready to be converted into an actual\n\t *  function template.\n\t */\n\n\tDUK__RECURSION_DECREASE(comp_ctx, thr);\n\treturn;\n\n error_funcname:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_FUNC_NAME);\n}\n\n/*\n *  Parse a function-like expression:\n *\n *    - function expression\n *    - function declaration\n *    - function statement (non-standard)\n *    - setter/getter\n *\n *  Adds the function to comp_ctx->curr_func function table and returns the\n *  function number.\n *\n *  On entry, curr_token points to:\n *\n *    - the token after 'function' for function expression/declaration/statement\n *    - the token after 'set' or 'get' for setter/getter\n */\n\n/* Parse formals. */\nDUK_LOCAL void duk__parse_func_formals(duk_compiler_ctx *comp_ctx) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_bool_t first = 1;\n\tduk_uarridx_t n;\n\n\tfor (;;) {\n\t\tif (comp_ctx->curr_token.t == DUK_TOK_RPAREN) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (first) {\n\t\t\t/* no comma */\n\t\t\tfirst = 0;\n\t\t} else {\n\t\t\tduk__advance_expect(comp_ctx, DUK_TOK_COMMA);\n\t\t}\n\n\t\t/* Note: when parsing a formal list in non-strict context, e.g.\n\t\t * \"implements\" is parsed as an identifier.  When the function is\n\t\t * later detected to be strict, the argument list must be rechecked\n\t\t * against a larger set of reserved words (that of strict mode).\n\t\t * This is handled by duk__parse_func_body().  Here we recognize\n\t\t * whatever tokens are considered reserved in current strictness\n\t\t * (which is not always enough).\n\t\t */\n\n\t\tif (comp_ctx->curr_token.t != DUK_TOK_IDENTIFIER) {\n\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_EXPECTED_IDENTIFIER);\n\t\t}\n\t\tDUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_IDENTIFIER);\n\t\tDUK_ASSERT(comp_ctx->curr_token.str1 != NULL);\n\t\tDUK_DDD(DUK_DDDPRINT(\"formal argument: %!O\",\n\t\t                     (duk_heaphdr *) comp_ctx->curr_token.str1));\n\n\t\t/* XXX: append primitive */\n\t\tduk_push_hstring(thr, comp_ctx->curr_token.str1);\n\t\tn = (duk_uarridx_t) duk_get_length(thr, comp_ctx->curr_func.argnames_idx);\n\t\tduk_put_prop_index(thr, comp_ctx->curr_func.argnames_idx, n);\n\n\t\tduk__advance(comp_ctx);  /* eat identifier */\n\t}\n}\n\n/* Parse a function-like expression, assuming that 'comp_ctx->curr_func' is\n * correctly set up.  Assumes that curr_token is just after 'function' (or\n * 'set'/'get' etc).\n */\nDUK_LOCAL void duk__parse_func_like_raw(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_token *tok;\n\tduk_bool_t no_advance;\n\n\tDUK_ASSERT(comp_ctx->curr_func.num_formals == 0);\n\tDUK_ASSERT(comp_ctx->curr_func.is_function == 1);\n\tDUK_ASSERT(comp_ctx->curr_func.is_eval == 0);\n\tDUK_ASSERT(comp_ctx->curr_func.is_global == 0);\n\tDUK_ASSERT(comp_ctx->curr_func.is_setget == ((flags & DUK__FUNC_FLAG_GETSET) != 0));\n\n\tduk__update_lineinfo_currtoken(comp_ctx);\n\n\t/*\n\t *  Function name (if any)\n\t *\n\t *  We don't check for prohibited names here, because we don't\n\t *  yet know whether the function will be strict.  Function body\n\t *  parsing handles this retroactively.\n\t *\n\t *  For function expressions and declarations function name must\n\t *  be an Identifer (excludes reserved words).  For setter/getter\n\t *  it is a PropertyName which allows reserved words and also\n\t *  strings and numbers (e.g. \"{ get 1() { ... } }\").\n\t *\n\t *  Function parsing may start either from prev_token or curr_token\n\t *  (object literal method definition uses prev_token for example).\n\t *  This is dealt with for the initial token.\n\t */\n\n\tno_advance = (flags & DUK__FUNC_FLAG_USE_PREVTOKEN);\n\tif (no_advance) {\n\t\ttok = &comp_ctx->prev_token;\n\t} else {\n\t\ttok = &comp_ctx->curr_token;\n\t}\n\n\tif (flags & DUK__FUNC_FLAG_GETSET) {\n\t\t/* PropertyName -> IdentifierName | StringLiteral | NumericLiteral */\n\t\tif (tok->t_nores == DUK_TOK_IDENTIFIER || tok->t == DUK_TOK_STRING) {\n\t\t\tduk_push_hstring(thr, tok->str1);       /* keep in valstack */\n\t\t} else if (tok->t == DUK_TOK_NUMBER) {\n\t\t\tduk_push_number(thr, tok->num);\n\t\t\tduk_to_string(thr, -1);\n\t\t} else {\n\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_GETSET_NAME);\n\t\t}\n\t\tcomp_ctx->curr_func.h_name = duk_known_hstring(thr, -1);  /* borrowed reference */\n\t} else {\n\t\t/* Function name is an Identifier (not IdentifierName), but we get\n\t\t * the raw name (not recognizing keywords) here and perform the name\n\t\t * checks only after pass 1.\n\t\t */\n\t\tif (tok->t_nores == DUK_TOK_IDENTIFIER) {\n\t\t\tduk_push_hstring(thr, tok->str1);       /* keep in valstack */\n\t\t\tcomp_ctx->curr_func.h_name = duk_known_hstring(thr, -1);  /* borrowed reference */\n\t\t} else {\n\t\t\t/* valstack will be unbalanced, which is OK */\n\t\t\tDUK_ASSERT((flags & DUK__FUNC_FLAG_GETSET) == 0);\n\t\t\tDUK_ASSERT(comp_ctx->curr_func.h_name == NULL);\n\t\t\tno_advance = 1;\n\t\t\tif (flags & DUK__FUNC_FLAG_DECL) {\n\t\t\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_FUNC_NAME_REQUIRED);\n\t\t\t}\n\t\t}\n\t}\n\n\tDUK_DD(DUK_DDPRINT(\"function name: %!O\",\n\t                   (duk_heaphdr *) comp_ctx->curr_func.h_name));\n\n\tif (!no_advance) {\n\t\tduk__advance(comp_ctx);\n\t}\n\n\t/*\n\t *  Formal argument list\n\t *\n\t *  We don't check for prohibited names or for duplicate argument\n\t *  names here, becase we don't yet know whether the function will\n\t *  be strict.  Function body parsing handles this retroactively.\n\t */\n\n\tduk__advance_expect(comp_ctx, DUK_TOK_LPAREN);\n\n\tduk__parse_func_formals(comp_ctx);\n\n\tDUK_ASSERT(comp_ctx->curr_token.t == DUK_TOK_RPAREN);\n\tduk__advance(comp_ctx);\n\n\t/*\n\t *  Parse function body\n\t */\n\n\tduk__parse_func_body(comp_ctx,\n\t                     0,   /* expect_eof */\n\t                     0,   /* implicit_return_value */\n\t                     DUK_TOK_LCURLY);  /* expect_token */\n\n\t/*\n\t *  Convert duk_compiler_func to a function template and add it\n\t *  to the parent function table.\n\t */\n\n\tduk__convert_to_func_template(comp_ctx);  /* -> [ ... func ] */\n}\n\n/* Parse an inner function, adding the function template to the current function's\n * function table.  Return a function number to be used by the outer function.\n *\n * Avoiding O(depth^2) inner function parsing is handled here.  On the first pass,\n * compile and register the function normally into the 'funcs' array, also recording\n * a lexer point (offset/line) to the closing brace of the function.  On the second\n * pass, skip the function and return the same 'fnum' as on the first pass by using\n * a running counter.\n *\n * An unfortunate side effect of this is that when parsing the inner function, almost\n * nothing is known of the outer function, i.e. the inner function's scope.  We don't\n * need that information at the moment, but it would allow some optimizations if it\n * were used.\n */\nDUK_LOCAL duk_int_t duk__parse_func_like_fnum(duk_compiler_ctx *comp_ctx, duk_small_uint_t flags) {\n\tduk_hthread *thr = comp_ctx->thr;\n\tduk_compiler_func old_func;\n\tduk_idx_t entry_top;\n\tduk_int_t fnum;\n\n\t/*\n\t *  On second pass, skip the function.\n\t */\n\n\tif (!comp_ctx->curr_func.in_scanning) {\n\t\tduk_lexer_point lex_pt;\n\n\t\tfnum = comp_ctx->curr_func.fnum_next++;\n\t\tduk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1));\n\t\tlex_pt.offset = (duk_size_t) duk_to_uint(thr, -1);\n\t\tduk_pop(thr);\n\t\tduk_get_prop_index(thr, comp_ctx->curr_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2));\n\t\tlex_pt.line = duk_to_int(thr, -1);\n\t\tduk_pop(thr);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"second pass of an inner func, skip the function, reparse closing brace; lex offset=%ld, line=%ld\",\n\t\t                     (long) lex_pt.offset, (long) lex_pt.line));\n\n\t\tDUK_LEXER_SETPOINT(&comp_ctx->lex, &lex_pt);\n\t\tcomp_ctx->curr_token.t = 0;  /* this is needed for regexp mode */\n\t\tcomp_ctx->curr_token.start_line = 0;  /* needed for line number tracking (becomes prev_token.start_line) */\n\t\tduk__advance(comp_ctx);\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_RCURLY);\n\n\t\treturn fnum;\n\t}\n\n\t/*\n\t *  On first pass, perform actual parsing.  Remember valstack top on entry\n\t *  to restore it later, and switch to using a new function in comp_ctx.\n\t */\n\n\tentry_top = duk_get_top(thr);\n\tDUK_DDD(DUK_DDDPRINT(\"before func: entry_top=%ld, curr_tok.start_offset=%ld\",\n\t                     (long) entry_top, (long) comp_ctx->curr_token.start_offset));\n\n\tDUK_MEMCPY(&old_func, &comp_ctx->curr_func, sizeof(duk_compiler_func));\n\n\tDUK_MEMZERO(&comp_ctx->curr_func, sizeof(duk_compiler_func));\n\tduk__init_func_valstack_slots(comp_ctx);\n\tDUK_ASSERT(comp_ctx->curr_func.num_formals == 0);\n\n\t/* inherit initial strictness from parent */\n\tcomp_ctx->curr_func.is_strict = old_func.is_strict;\n\n\t/* XXX: It might be better to just store the flags into the curr_func\n\t * struct and use them as is without this flag interpretation step\n\t * here.\n\t */\n\tDUK_ASSERT(comp_ctx->curr_func.is_notail == 0);\n\tcomp_ctx->curr_func.is_function = 1;\n\tDUK_ASSERT(comp_ctx->curr_func.is_eval == 0);\n\tDUK_ASSERT(comp_ctx->curr_func.is_global == 0);\n\tcomp_ctx->curr_func.is_setget = ((flags & DUK__FUNC_FLAG_GETSET) != 0);\n\tcomp_ctx->curr_func.is_namebinding = !(flags & (DUK__FUNC_FLAG_GETSET |\n\t                                                DUK__FUNC_FLAG_METDEF |\n\t                                                DUK__FUNC_FLAG_DECL));  /* no name binding for: declarations, objlit getset, objlit method def */\n\tcomp_ctx->curr_func.is_constructable = !(flags & (DUK__FUNC_FLAG_GETSET |\n\t                                                  DUK__FUNC_FLAG_METDEF));  /* not constructable: objlit getset, objlit method def */\n\n\t/*\n\t *  Parse inner function\n\t */\n\n\tduk__parse_func_like_raw(comp_ctx, flags);  /* pushes function template */\n\n\t/* prev_token.start_offset points to the closing brace here; when skipping\n\t * we're going to reparse the closing brace to ensure semicolon insertion\n\t * etc work as expected.\n\t */\n\tDUK_DDD(DUK_DDDPRINT(\"after func: prev_tok.start_offset=%ld, curr_tok.start_offset=%ld\",\n\t                     (long) comp_ctx->prev_token.start_offset, (long) comp_ctx->curr_token.start_offset));\n\tDUK_ASSERT(comp_ctx->lex.input[comp_ctx->prev_token.start_offset] == (duk_uint8_t) DUK_ASC_RCURLY);\n\n\t/* XXX: append primitive */\n\tDUK_ASSERT(duk_get_length(thr, old_func.funcs_idx) == (duk_size_t) (old_func.fnum_next * 3));\n\tfnum = old_func.fnum_next++;\n\n\tif (fnum > DUK__MAX_FUNCS) {\n\t\tDUK_ERROR_RANGE(comp_ctx->thr, DUK_STR_FUNC_LIMIT);\n\t}\n\n\t/* array writes autoincrement length */\n\t(void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3));\n\tduk_push_size_t(thr, comp_ctx->prev_token.start_offset);\n\t(void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 1));\n\tduk_push_int(thr, comp_ctx->prev_token.start_line);\n\t(void) duk_put_prop_index(thr, old_func.funcs_idx, (duk_uarridx_t) (fnum * 3 + 2));\n\n\t/*\n\t *  Cleanup: restore original function, restore valstack state.\n\t *\n\t *  Function declaration handling needs the function name to be pushed\n\t *  on the value stack.\n\t */\n\n\tif (flags & DUK__FUNC_FLAG_PUSHNAME_PASS1) {\n\t\tDUK_ASSERT(comp_ctx->curr_func.h_name != NULL);\n\t\tduk_push_hstring(thr, comp_ctx->curr_func.h_name);\n\t\tduk_replace(thr, entry_top);\n\t\tduk_set_top(thr, entry_top + 1);\n\t} else {\n\t\tduk_set_top(thr, entry_top);\n\t}\n\tDUK_MEMCPY((void *) &comp_ctx->curr_func, (void *) &old_func, sizeof(duk_compiler_func));\n\n\treturn fnum;\n}\n\n/*\n *  Compile input string into an executable function template without\n *  arguments.\n *\n *  The string is parsed as the \"Program\" production of Ecmascript E5.\n *  Compilation context can be either global code or eval code (see E5\n *  Sections 14 and 15.1.2.1).\n *\n *  Input stack:  [ ... filename ]\n *  Output stack: [ ... func_template ]\n */\n\n/* XXX: source code property */\n\nDUK_LOCAL duk_ret_t duk__js_compile_raw(duk_hthread *thr, void *udata) {\n\tduk_hstring *h_filename;\n\tduk__compiler_stkstate *comp_stk;\n\tduk_compiler_ctx *comp_ctx;\n\tduk_lexer_point *lex_pt;\n\tduk_compiler_func *func;\n\tduk_idx_t entry_top;\n\tduk_bool_t is_strict;\n\tduk_bool_t is_eval;\n\tduk_bool_t is_funcexpr;\n\tduk_small_uint_t flags;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(udata != NULL);\n\n\t/*\n\t *  Arguments check\n\t */\n\n\tentry_top = duk_get_top(thr);\n\tDUK_ASSERT(entry_top >= 1);\n\n\tcomp_stk = (duk__compiler_stkstate *) udata;\n\tcomp_ctx = &comp_stk->comp_ctx_alloc;\n\tlex_pt = &comp_stk->lex_pt_alloc;\n\tDUK_ASSERT(comp_ctx != NULL);\n\tDUK_ASSERT(lex_pt != NULL);\n\n\tflags = comp_stk->flags;\n\tis_eval = (flags & DUK_COMPILE_EVAL ? 1 : 0);\n\tis_strict = (flags & DUK_COMPILE_STRICT ? 1 : 0);\n\tis_funcexpr = (flags & DUK_COMPILE_FUNCEXPR ? 1 : 0);\n\n\th_filename = duk_get_hstring(thr, -1);  /* may be undefined */\n\n\t/*\n\t *  Init compiler and lexer contexts\n\t */\n\n\tfunc = &comp_ctx->curr_func;\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tcomp_ctx->thr = NULL;\n\tcomp_ctx->h_filename = NULL;\n\tcomp_ctx->prev_token.str1 = NULL;\n\tcomp_ctx->prev_token.str2 = NULL;\n\tcomp_ctx->curr_token.str1 = NULL;\n\tcomp_ctx->curr_token.str2 = NULL;\n#endif\n\n\tduk_require_stack(thr, DUK__COMPILE_ENTRY_SLOTS);\n\n\tduk_push_dynamic_buffer(thr, 0);       /* entry_top + 0 */\n\tduk_push_undefined(thr);               /* entry_top + 1 */\n\tduk_push_undefined(thr);               /* entry_top + 2 */\n\tduk_push_undefined(thr);               /* entry_top + 3 */\n\tduk_push_undefined(thr);               /* entry_top + 4 */\n\n\tcomp_ctx->thr = thr;\n\tcomp_ctx->h_filename = h_filename;\n\tcomp_ctx->tok11_idx = entry_top + 1;\n\tcomp_ctx->tok12_idx = entry_top + 2;\n\tcomp_ctx->tok21_idx = entry_top + 3;\n\tcomp_ctx->tok22_idx = entry_top + 4;\n\tcomp_ctx->recursion_limit = DUK_USE_COMPILER_RECLIMIT;\n\n\t/* comp_ctx->lex has been pre-initialized by caller: it has been\n\t * zeroed and input/input_length has been set.\n\t */\n\tcomp_ctx->lex.thr = thr;\n\t/* comp_ctx->lex.input and comp_ctx->lex.input_length filled by caller */\n\tcomp_ctx->lex.slot1_idx = comp_ctx->tok11_idx;\n\tcomp_ctx->lex.slot2_idx = comp_ctx->tok12_idx;\n\tcomp_ctx->lex.buf_idx = entry_top + 0;\n\tcomp_ctx->lex.buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, entry_top + 0);\n\tDUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(comp_ctx->lex.buf) && !DUK_HBUFFER_HAS_EXTERNAL(comp_ctx->lex.buf));\n\tcomp_ctx->lex.token_limit = DUK_COMPILER_TOKEN_LIMIT;\n\n\tlex_pt->offset = 0;\n\tlex_pt->line = 1;\n\tDUK_LEXER_SETPOINT(&comp_ctx->lex, lex_pt);    /* fills window */\n\tcomp_ctx->curr_token.start_line = 0;  /* needed for line number tracking (becomes prev_token.start_line) */\n\n\t/*\n\t *  Initialize function state for a zero-argument function\n\t */\n\n\tduk__init_func_valstack_slots(comp_ctx);\n\tDUK_ASSERT(func->num_formals == 0);\n\n\tif (is_funcexpr) {\n\t\t/* Name will be filled from function expression, not by caller.\n\t\t * This case is used by Function constructor and duk_compile()\n\t\t * API with the DUK_COMPILE_FUNCTION option.\n\t\t */\n\t\tDUK_ASSERT(func->h_name == NULL);\n\t} else {\n\t\tduk_push_hstring_stridx(thr, (is_eval ? DUK_STRIDX_EVAL :\n\t\t                                        DUK_STRIDX_GLOBAL));\n\t\tfunc->h_name = duk_get_hstring(thr, -1);\n\t}\n\n\t/*\n\t *  Parse a function body or a function-like expression, depending\n\t *  on flags.\n\t */\n\n\tDUK_ASSERT(func->is_setget == 0);\n\tfunc->is_strict = (duk_uint8_t) is_strict;\n\tDUK_ASSERT(func->is_notail == 0);\n\n\tif (is_funcexpr) {\n\t\tfunc->is_function = 1;\n\t\tDUK_ASSERT(func->is_eval == 0);\n\t\tDUK_ASSERT(func->is_global == 0);\n\t\tfunc->is_namebinding = 1;\n\t\tfunc->is_constructable = 1;\n\n\t\tduk__advance(comp_ctx);  /* init 'curr_token' */\n\t\tduk__advance_expect(comp_ctx, DUK_TOK_FUNCTION);\n\t\t(void) duk__parse_func_like_raw(comp_ctx, 0 /*flags*/);\n\t} else {\n\t\tDUK_ASSERT(func->is_function == 0);\n\t\tDUK_ASSERT(is_eval == 0 || is_eval == 1);\n\t\tfunc->is_eval = (duk_uint8_t) is_eval;\n\t\tfunc->is_global = (duk_uint8_t) !is_eval;\n\t\tDUK_ASSERT(func->is_namebinding == 0);\n\t\tDUK_ASSERT(func->is_constructable == 0);\n\n\t\tduk__parse_func_body(comp_ctx,\n\t\t                     1,             /* expect_eof */\n\t\t                     1,             /* implicit_return_value */\n\t\t                     -1);           /* expect_token */\n\t}\n\n\t/*\n\t *  Convert duk_compiler_func to a function template\n\t */\n\n\tduk__convert_to_func_template(comp_ctx);\n\n\t/*\n\t *  Wrapping duk_safe_call() will mangle the stack, just return stack top\n\t */\n\n\t/* [ ... filename (temps) func ] */\n\n\treturn 1;\n}\n\nDUK_INTERNAL void duk_js_compile(duk_hthread *thr, const duk_uint8_t *src_buffer, duk_size_t src_length, duk_small_uint_t flags) {\n\tduk__compiler_stkstate comp_stk;\n\tduk_compiler_ctx *prev_ctx;\n\tduk_ret_t safe_rc;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(src_buffer != NULL);\n\n\t/* preinitialize lexer state partially */\n\tDUK_MEMZERO(&comp_stk, sizeof(comp_stk));\n\tcomp_stk.flags = flags;\n\tDUK_LEXER_INITCTX(&comp_stk.comp_ctx_alloc.lex);\n\tcomp_stk.comp_ctx_alloc.lex.input = src_buffer;\n\tcomp_stk.comp_ctx_alloc.lex.input_length = src_length;\n\tcomp_stk.comp_ctx_alloc.lex.flags = flags;  /* Forward flags directly for now. */\n\n\t/* [ ... filename ] */\n\n\tprev_ctx = thr->compile_ctx;\n\tthr->compile_ctx = &comp_stk.comp_ctx_alloc;  /* for duk_error_augment.c */\n\tsafe_rc = duk_safe_call(thr, duk__js_compile_raw, (void *) &comp_stk /*udata*/, 1 /*nargs*/, 1 /*nrets*/);\n\tthr->compile_ctx = prev_ctx;  /* must restore reliably before returning */\n\n\tif (safe_rc != DUK_EXEC_SUCCESS) {\n\t\tDUK_D(DUK_DPRINT(\"compilation failed: %!T\", duk_get_tval(thr, -1)));\n\t\t(void) duk_throw(thr);\n\t}\n\n\t/* [ ... template ] */\n}\n\n/* automatic undefs */\n#undef DUK__ALLOCTEMP\n#undef DUK__ALLOCTEMPS\n#undef DUK__ALLOW_AUTO_SEMI_ALWAYS\n#undef DUK__BC_INITIAL_INSTS\n#undef DUK__BP_ADDITIVE\n#undef DUK__BP_ASSIGNMENT\n#undef DUK__BP_BAND\n#undef DUK__BP_BOR\n#undef DUK__BP_BXOR\n#undef DUK__BP_CALL\n#undef DUK__BP_CLOSING\n#undef DUK__BP_COMMA\n#undef DUK__BP_CONDITIONAL\n#undef DUK__BP_EOF\n#undef DUK__BP_EQUALITY\n#undef DUK__BP_EXPONENTIATION\n#undef DUK__BP_FOR_EXPR\n#undef DUK__BP_INVALID\n#undef DUK__BP_LAND\n#undef DUK__BP_LOR\n#undef DUK__BP_MEMBER\n#undef DUK__BP_MULTIPLICATIVE\n#undef DUK__BP_POSTFIX\n#undef DUK__BP_RELATIONAL\n#undef DUK__BP_SHIFT\n#undef DUK__COMPILE_ENTRY_SLOTS\n#undef DUK__CONST_MARKER\n#undef DUK__DUMP_ISPEC\n#undef DUK__DUMP_IVALUE\n#undef DUK__EMIT_FLAG_A_IS_SOURCE\n#undef DUK__EMIT_FLAG_BC_REGCONST\n#undef DUK__EMIT_FLAG_B_IS_TARGET\n#undef DUK__EMIT_FLAG_C_IS_TARGET\n#undef DUK__EMIT_FLAG_NO_SHUFFLE_A\n#undef DUK__EMIT_FLAG_NO_SHUFFLE_B\n#undef DUK__EMIT_FLAG_NO_SHUFFLE_C\n#undef DUK__EMIT_FLAG_RESERVE_JUMPSLOT\n#undef DUK__EXPR_FLAG_ALLOW_EMPTY\n#undef DUK__EXPR_FLAG_REJECT_IN\n#undef DUK__EXPR_FLAG_REQUIRE_INIT\n#undef DUK__EXPR_RBP_MASK\n#undef DUK__FUNCTION_BODY_REQUIRE_SLOTS\n#undef DUK__FUNCTION_INIT_REQUIRE_SLOTS\n#undef DUK__FUNC_FLAG_DECL\n#undef DUK__FUNC_FLAG_GETSET\n#undef DUK__FUNC_FLAG_METDEF\n#undef DUK__FUNC_FLAG_PUSHNAME_PASS1\n#undef DUK__FUNC_FLAG_USE_PREVTOKEN\n#undef DUK__GETCONST_MAX_CONSTS_CHECK\n#undef DUK__GETTEMP\n#undef DUK__HAS_TERM\n#undef DUK__HAS_VAL\n#undef DUK__ISCONST\n#undef DUK__ISREG\n#undef DUK__ISREG_NOTTEMP\n#undef DUK__ISREG_TEMP\n#undef DUK__IS_TERMINAL\n#undef DUK__IVAL_FLAG_ALLOW_CONST\n#undef DUK__IVAL_FLAG_REQUIRE_SHORT\n#undef DUK__IVAL_FLAG_REQUIRE_TEMP\n#undef DUK__MAX_ARRAY_INIT_VALUES\n#undef DUK__MAX_CONSTS\n#undef DUK__MAX_FUNCS\n#undef DUK__MAX_OBJECT_INIT_PAIRS\n#undef DUK__MAX_TEMPS\n#undef DUK__MK_LBP\n#undef DUK__MK_LBP_FLAGS\n#undef DUK__OBJ_LIT_KEY_GET\n#undef DUK__OBJ_LIT_KEY_PLAIN\n#undef DUK__OBJ_LIT_KEY_SET\n#undef DUK__PARSE_EXPR_SLOTS\n#undef DUK__PARSE_STATEMENTS_SLOTS\n#undef DUK__RECURSION_DECREASE\n#undef DUK__RECURSION_INCREASE\n#undef DUK__REMOVECONST\n#undef DUK__SETTEMP\n#undef DUK__SETTEMP_CHECKMAX\n#undef DUK__STILL_PROLOGUE\n#undef DUK__TOKEN_LBP_BP_MASK\n#undef DUK__TOKEN_LBP_FLAG_NO_REGEXP\n#undef DUK__TOKEN_LBP_FLAG_TERMINATES\n#undef DUK__TOKEN_LBP_FLAG_UNUSED\n#undef DUK__TOKEN_LBP_GET_BP\n#line 1 \"duk_js_executor.c\"\n/*\n *  Ecmascript bytecode executor.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Local declarations.\n */\n\nDUK_LOCAL_DECL void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act);\n\n/*\n *  Misc helpers.\n */\n\n/* Forced inline declaration, only applied for performance oriented build. */\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n#define DUK__INLINE_PERF\n#define DUK__NOINLINE_PERF\n#else\n#define DUK__INLINE_PERF DUK_ALWAYS_INLINE\n#define DUK__NOINLINE_PERF DUK_NOINLINE\n#endif\n\n/* Replace value stack top to value at 'tv_ptr'.  Optimize for\n * performance by only applying the net refcount change.\n */\n#define DUK__REPLACE_TO_TVPTR(thr,tv_ptr) do { \\\n\t\tduk_hthread *duk__thr; \\\n\t\tduk_tval *duk__tvsrc; \\\n\t\tduk_tval *duk__tvdst; \\\n\t\tduk_tval duk__tvtmp; \\\n\t\tduk__thr = (thr); \\\n\t\tduk__tvsrc = DUK_GET_TVAL_NEGIDX(duk__thr, -1); \\\n\t\tduk__tvdst = (tv_ptr); \\\n\t\tDUK_TVAL_SET_TVAL(&duk__tvtmp, duk__tvdst); \\\n\t\tDUK_TVAL_SET_TVAL(duk__tvdst, duk__tvsrc); \\\n\t\tDUK_TVAL_SET_UNDEFINED(duk__tvsrc);  /* value stack init policy */ \\\n\t\tduk__thr->valstack_top = duk__tvsrc; \\\n\t\tDUK_TVAL_DECREF(duk__thr, &duk__tvtmp); \\\n\t} while (0)\n\n/* XXX: candidate of being an internal shared API call */\n#if 0  /* unused */\nDUK_LOCAL void duk__push_tvals_incref_only(duk_hthread *thr, duk_tval *tv_src, duk_small_uint_fast_t count) {\n\tduk_tval *tv_dst;\n\tduk_size_t copy_size;\n\tduk_size_t i;\n\n\ttv_dst = thr->valstack_top;\n\tcopy_size = sizeof(duk_tval) * count;\n\tDUK_MEMCPY((void *) tv_dst, (const void *) tv_src, copy_size);\n\tfor (i = 0; i < count; i++) {\n\t\tDUK_TVAL_INCREF(thr, tv_dst);\n\t\ttv_dst++;\n\t}\n\tthr->valstack_top = tv_dst;\n}\n#endif\n\n/*\n *  Arithmetic, binary, and logical helpers.\n *\n *  Note: there is no opcode for logical AND or logical OR; this is on\n *  purpose, because the evalution order semantics for them make such\n *  opcodes pretty pointless: short circuiting means they are most\n *  comfortably implemented as jumps.  However, a logical NOT opcode\n *  is useful.\n *\n *  Note: careful with duk_tval pointers here: they are potentially\n *  invalidated by any DECREF and almost any API call.  It's still\n *  preferable to work without making a copy but that's not always\n *  possible.\n */\n\nDUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_mod(duk_double_t d1, duk_double_t d2) {\n\treturn (duk_double_t) duk_js_arith_mod((double) d1, (double) d2);\n}\n\n#if defined(DUK_USE_ES7_EXP_OPERATOR)\nDUK_LOCAL DUK__INLINE_PERF duk_double_t duk__compute_exp(duk_double_t d1, duk_double_t d2) {\n\treturn (duk_double_t) duk_js_arith_pow((double) d1, (double) d2);\n}\n#endif\n\nDUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_add(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z) {\n\t/*\n\t *  Addition operator is different from other arithmetic\n\t *  operations in that it also provides string concatenation.\n\t *  Hence it is implemented separately.\n\t *\n\t *  There is a fast path for number addition.  Other cases go\n\t *  through potentially multiple coercions as described in the\n\t *  E5 specification.  It may be possible to reduce the number\n\t *  of coercions, but this must be done carefully to preserve\n\t *  the exact semantics.\n\t *\n\t *  E5 Section 11.6.1.\n\t *\n\t *  Custom types also have special behavior implemented here.\n\t */\n\n\tduk_double_union du;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv_x != NULL);  /* may be reg or const */\n\tDUK_ASSERT(tv_y != NULL);  /* may be reg or const */\n\tDUK_ASSERT_DISABLE(idx_z >= 0);  /* unsigned */\n\tDUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr));\n\n\t/*\n\t *  Fast paths\n\t */\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {\n\t\tduk_int64_t v1, v2, v3;\n\t\tduk_int32_t v3_hi;\n\t\tduk_tval *tv_z;\n\n\t\t/* Input values are signed 48-bit so we can detect overflow\n\t\t * reliably from high bits or just a comparison.\n\t\t */\n\n\t\tv1 = DUK_TVAL_GET_FASTINT(tv_x);\n\t\tv2 = DUK_TVAL_GET_FASTINT(tv_y);\n\t\tv3 = v1 + v2;\n\t\tv3_hi = (duk_int32_t) (v3 >> 32);\n\t\tif (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) {\n\t\t\ttv_z = thr->valstack_bottom + idx_z;\n\t\t\tDUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3);  /* side effects */\n\t\t\treturn;\n\t\t} else {\n\t\t\t/* overflow, fall through */\n\t\t\t;\n\t\t}\n\t}\n#endif  /* DUK_USE_FASTINT */\n\n\tif (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) {\n#if !defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tduk_tval *tv_z;\n#endif\n\n\t\tdu.d = DUK_TVAL_GET_NUMBER(tv_x) + DUK_TVAL_GET_NUMBER(tv_y);\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tduk_push_number(thr, du.d);  /* will NaN normalize result */\n\t\tduk_replace(thr, (duk_idx_t) idx_z);\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tDUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);\n\t\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n\t\ttv_z = thr->valstack_bottom + idx_z;\n\t\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d);  /* side effects */\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\treturn;\n\t}\n\n\t/*\n\t *  Slow path: potentially requires function calls for coercion\n\t */\n\n\tduk_push_tval(thr, tv_x);\n\tduk_push_tval(thr, tv_y);\n\tduk_to_primitive(thr, -2, DUK_HINT_NONE);  /* side effects -> don't use tv_x, tv_y after */\n\tduk_to_primitive(thr, -1, DUK_HINT_NONE);\n\n\t/* Since Duktape 2.x plain buffers are treated like ArrayBuffer. */\n\tif (duk_is_string(thr, -2) || duk_is_string(thr, -1)) {\n\t\t/* Symbols shouldn't technically be handled here, but should\n\t\t * go into the default ToNumber() coercion path instead and\n\t\t * fail there with a TypeError.  However, there's a ToString()\n\t\t * in duk_concat_2() which also fails with TypeError so no\n\t\t * explicit check is needed.\n\t\t */\n\t\tduk_concat_2(thr);  /* [... s1 s2] -> [... s1+s2] */\n\t} else {\n\t\tduk_double_t d1, d2;\n\n\t\td1 = duk_to_number_m2(thr);\n\t\td2 = duk_to_number_m1(thr);\n\t\tDUK_ASSERT(duk_is_number(thr, -2));\n\t\tDUK_ASSERT(duk_is_number(thr, -1));\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(d1);\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(d2);\n\n\t\tdu.d = d1 + d2;\n\t\tduk_pop_2_unsafe(thr);\n\t\tduk_push_number(thr, du.d);  /* will NaN normalize result */\n\t}\n\tduk_replace(thr, (duk_idx_t) idx_z);  /* side effects */\n}\n\nDUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_uint_fast_t idx_z, duk_small_uint_fast_t opcode) {\n\t/*\n\t *  Arithmetic operations other than '+' have number-only semantics\n\t *  and are implemented here.  The separate switch-case here means a\n\t *  \"double dispatch\" of the arithmetic opcode, but saves code space.\n\t *\n\t *  E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3.\n\t */\n\n\tduk_double_t d1, d2;\n\tduk_double_union du;\n\tduk_small_uint_fast_t opcode_shifted;\n#if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE)\n\tduk_tval *tv_z;\n#endif\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv_x != NULL);  /* may be reg or const */\n\tDUK_ASSERT(tv_y != NULL);  /* may be reg or const */\n\tDUK_ASSERT_DISABLE(idx_z >= 0);  /* unsigned */\n\tDUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr));\n\n\topcode_shifted = opcode >> 2;  /* Get base opcode without reg/const modifiers. */\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {\n\t\tduk_int64_t v1, v2, v3;\n\t\tduk_int32_t v3_hi;\n\n\t\tv1 = DUK_TVAL_GET_FASTINT(tv_x);\n\t\tv2 = DUK_TVAL_GET_FASTINT(tv_y);\n\n\t\tswitch (opcode_shifted) {\n\t\tcase DUK_OP_SUB >> 2: {\n\t\t\tv3 = v1 - v2;\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MUL >> 2: {\n\t\t\t/* Must ensure result is 64-bit (no overflow); a\n\t\t\t * simple and sufficient fast path is to allow only\n\t\t\t * 32-bit inputs.  Avoid zero inputs to avoid\n\t\t\t * negative zero issues (-1 * 0 = -0, for instance).\n\t\t\t */\n\t\t\tif (v1 >= DUK_I64_CONSTANT(-0x80000000) && v1 <= DUK_I64_CONSTANT(0x7fffffff) && v1 != 0 &&\n\t\t\t    v2 >= DUK_I64_CONSTANT(-0x80000000) && v2 <= DUK_I64_CONSTANT(0x7fffffff) && v2 != 0) {\n\t\t\t\tv3 = v1 * v2;\n\t\t\t} else {\n\t\t\t\tgoto skip_fastint;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_DIV >> 2: {\n\t\t\t/* Don't allow a zero divisor.  Fast path check by\n\t\t\t * \"verifying\" with multiplication.  Also avoid zero\n\t\t\t * dividend to avoid negative zero issues (0 / -1 = -0\n\t\t\t * for instance).\n\t\t\t */\n\t\t\tif (v1 == 0 || v2 == 0) {\n\t\t\t\tgoto skip_fastint;\n\t\t\t}\n\t\t\tv3 = v1 / v2;\n\t\t\tif (v3 * v2 != v1) {\n\t\t\t\tgoto skip_fastint;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MOD >> 2: {\n\t\t\t/* Don't allow a zero divisor.  Restrict both v1 and\n\t\t\t * v2 to positive values to avoid compiler specific\n\t\t\t * behavior.\n\t\t\t */\n\t\t\tif (v1 < 1 || v2 < 1) {\n\t\t\t\tgoto skip_fastint;\n\t\t\t}\n\t\t\tv3 = v1 % v2;\n\t\t\tDUK_ASSERT(v3 >= 0);\n\t\t\tDUK_ASSERT(v3 < v2);\n\t\t\tDUK_ASSERT(v1 - (v1 / v2) * v2 == v3);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\t/* Possible with DUK_OP_EXP. */\n\t\t\tgoto skip_fastint;\n\t\t}\n\t\t}\n\n\t\tv3_hi = (duk_int32_t) (v3 >> 32);\n\t\tif (DUK_LIKELY(v3_hi >= DUK_I64_CONSTANT(-0x8000) && v3_hi <= DUK_I64_CONSTANT(0x7fff))) {\n\t\t\ttv_z = thr->valstack_bottom + idx_z;\n\t\t\tDUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, v3);  /* side effects */\n\t\t\treturn;\n\t\t}\n\t\t/* fall through if overflow etc */\n\t}\n skip_fastint:\n#endif  /* DUK_USE_FASTINT */\n\n\tif (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) {\n\t\t/* fast path */\n\t\td1 = DUK_TVAL_GET_NUMBER(tv_x);\n\t\td2 = DUK_TVAL_GET_NUMBER(tv_y);\n\t} else {\n\t\tduk_push_tval(thr, tv_x);\n\t\tduk_push_tval(thr, tv_y);\n\t\td1 = duk_to_number_m2(thr);  /* side effects */\n\t\td2 = duk_to_number_m1(thr);\n\t\tDUK_ASSERT(duk_is_number(thr, -2));\n\t\tDUK_ASSERT(duk_is_number(thr, -1));\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(d1);\n\t\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(d2);\n\t\tduk_pop_2_unsafe(thr);\n\t}\n\n\tswitch (opcode_shifted) {\n\tcase DUK_OP_SUB >> 2: {\n\t\tdu.d = d1 - d2;\n\t\tbreak;\n\t}\n\tcase DUK_OP_MUL >> 2: {\n\t\tdu.d = d1 * d2;\n\t\tbreak;\n\t}\n\tcase DUK_OP_DIV >> 2: {\n\t\tdu.d = d1 / d2;\n\t\tbreak;\n\t}\n\tcase DUK_OP_MOD >> 2: {\n\t\tdu.d = duk__compute_mod(d1, d2);\n\t\tbreak;\n\t}\n#if defined(DUK_USE_ES7_EXP_OPERATOR)\n\tcase DUK_OP_EXP >> 2: {\n\t\tdu.d = duk__compute_exp(d1, d2);\n\t\tbreak;\n\t}\n#endif\n\tdefault: {\n\t\tDUK_UNREACHABLE();\n\t\tdu.d = DUK_DOUBLE_NAN;  /* should not happen */\n\t\tbreak;\n\t}\n\t}\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\tduk_push_number(thr, du.d);  /* will NaN normalize result */\n\tduk_replace(thr, (duk_idx_t) idx_z);\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t/* important to use normalized NaN with 8-byte tagged types */\n\tDUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);\n\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n\ttv_z = thr->valstack_bottom + idx_z;\n\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, du.d);  /* side effects */\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n}\n\nDUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_binary_op(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_fast_t idx_z, duk_small_uint_fast_t opcode) {\n\t/*\n\t *  Binary bitwise operations use different coercions (ToInt32, ToUint32)\n\t *  depending on the operation.  We coerce the arguments first using\n\t *  ToInt32(), and then cast to an 32-bit value if necessary.  Note that\n\t *  such casts must be correct even if there is no native 32-bit type\n\t *  (e.g., duk_int32_t and duk_uint32_t are 64-bit).\n\t *\n\t *  E5 Sections 11.10, 11.7.1, 11.7.2, 11.7.3\n\t */\n\n\tduk_int32_t i1, i2, i3;\n\tduk_uint32_t u1, u2, u3;\n#if defined(DUK_USE_FASTINT)\n\tduk_int64_t fi3;\n#else\n\tduk_double_t d3;\n#endif\n\tduk_small_uint_fast_t opcode_shifted;\n#if defined(DUK_USE_FASTINT) || !defined(DUK_USE_EXEC_PREFER_SIZE)\n\tduk_tval *tv_z;\n#endif\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv_x != NULL);  /* may be reg or const */\n\tDUK_ASSERT(tv_y != NULL);  /* may be reg or const */\n\tDUK_ASSERT_DISABLE(idx_z >= 0);  /* unsigned */\n\tDUK_ASSERT((duk_uint_t) idx_z < (duk_uint_t) duk_get_top(thr));\n\n\topcode_shifted = opcode >> 2;  /* Get base opcode without reg/const modifiers. */\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {\n\t\ti1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_x);\n\t\ti2 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv_y);\n\t}\n\telse\n#endif  /* DUK_USE_FASTINT */\n\t{\n\t\tduk_push_tval(thr, tv_x);\n\t\tduk_push_tval(thr, tv_y);\n\t\ti1 = duk_to_int32(thr, -2);\n\t\ti2 = duk_to_int32(thr, -1);\n\t\tduk_pop_2_unsafe(thr);\n\t}\n\n\tswitch (opcode_shifted) {\n\tcase DUK_OP_BAND >> 2: {\n\t\ti3 = i1 & i2;\n\t\tbreak;\n\t}\n\tcase DUK_OP_BOR >> 2: {\n\t\ti3 = i1 | i2;\n\t\tbreak;\n\t}\n\tcase DUK_OP_BXOR >> 2: {\n\t\ti3 = i1 ^ i2;\n\t\tbreak;\n\t}\n\tcase DUK_OP_BASL >> 2: {\n\t\t/* Signed shift, named \"arithmetic\" (asl) because the result\n\t\t * is signed, e.g. 4294967295 << 1 -> -2.  Note that result\n\t\t * must be masked.\n\t\t */\n\n\t\tu2 = ((duk_uint32_t) i2) & 0xffffffffUL;\n\t\ti3 = (duk_int32_t) (((duk_uint32_t) i1) << (u2 & 0x1fUL));  /* E5 Section 11.7.1, steps 7 and 8 */\n\t\ti3 = i3 & ((duk_int32_t) 0xffffffffUL);                     /* Note: left shift, should mask */\n\t\tbreak;\n\t}\n\tcase DUK_OP_BASR >> 2: {\n\t\t/* signed shift */\n\n\t\tu2 = ((duk_uint32_t) i2) & 0xffffffffUL;\n\t\ti3 = i1 >> (u2 & 0x1fUL);                      /* E5 Section 11.7.2, steps 7 and 8 */\n\t\tbreak;\n\t}\n\tcase DUK_OP_BLSR >> 2: {\n\t\t/* unsigned shift */\n\n\t\tu1 = ((duk_uint32_t) i1) & 0xffffffffUL;\n\t\tu2 = ((duk_uint32_t) i2) & 0xffffffffUL;\n\n\t\t/* special result value handling */\n\t\tu3 = u1 >> (u2 & 0x1fUL);     /* E5 Section 11.7.2, steps 7 and 8 */\n#if defined(DUK_USE_FASTINT)\n\t\tfi3 = (duk_int64_t) u3;\n\t\tgoto fastint_result_set;\n#else\n\t\td3 = (duk_double_t) u3;\n\t\tgoto result_set;\n#endif\n\t}\n\tdefault: {\n\t\tDUK_UNREACHABLE();\n\t\ti3 = 0;  /* should not happen */\n\t\tbreak;\n\t}\n\t}\n\n#if defined(DUK_USE_FASTINT)\n\t/* Result is always fastint compatible. */\n\t/* XXX: Set 32-bit result (but must then handle signed and\n\t * unsigned results separately).\n\t */\n\tfi3 = (duk_int64_t) i3;\n\n fastint_result_set:\n\ttv_z = thr->valstack_bottom + idx_z;\n\tDUK_TVAL_SET_FASTINT_UPDREF(thr, tv_z, fi3);  /* side effects */\n#else  /* DUK_USE_FASTINT */\n\td3 = (duk_double_t) i3;\n\n result_set:\n\tDUK_ASSERT(!DUK_ISNAN(d3));            /* 'd3' is never NaN, so no need to normalize */\n\tDUK_ASSERT_DOUBLE_IS_NORMALIZED(d3);   /* always normalized */\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\tduk_push_number(thr, d3);  /* would NaN normalize result, but unnecessary */\n\tduk_replace(thr, (duk_idx_t) idx_z);\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\ttv_z = thr->valstack_bottom + idx_z;\n\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv_z, d3);  /* side effects */\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n#endif  /* DUK_USE_FASTINT */\n}\n\n/* In-place unary operation. */\nDUK_LOCAL DUK__INLINE_PERF void duk__vm_arith_unary_op(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst, duk_small_uint_fast_t opcode) {\n\t/*\n\t *  Arithmetic operations other than '+' have number-only semantics\n\t *  and are implemented here.  The separate switch-case here means a\n\t *  \"double dispatch\" of the arithmetic opcode, but saves code space.\n\t *\n\t *  E5 Sections 11.5, 11.5.1, 11.5.2, 11.5.3, 11.6, 11.6.1, 11.6.2, 11.6.3.\n\t */\n\n\tduk_tval *tv;\n\tduk_double_t d1;\n\tduk_double_union du;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(opcode == DUK_OP_UNM || opcode == DUK_OP_UNP);\n\tDUK_ASSERT_DISABLE(idx_src >= 0);\n\tDUK_ASSERT_DISABLE(idx_dst >= 0);\n\n\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src);\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\tduk_int64_t v1, v2;\n\n\t\tv1 = DUK_TVAL_GET_FASTINT(tv);\n\t\tif (opcode == DUK_OP_UNM) {\n\t\t\t/* The smallest fastint is no longer 48-bit when\n\t\t\t * negated.  Positive zero becames negative zero\n\t\t\t * (cannot be represented) when negated.\n\t\t\t */\n\t\t\tif (DUK_LIKELY(v1 != DUK_FASTINT_MIN && v1 != 0)) {\n\t\t\t\tv2 = -v1;\n\t\t\t\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);\n\t\t\t\tDUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\t/* ToNumber() for a fastint is a no-op. */\n\t\t\tDUK_ASSERT(opcode == DUK_OP_UNP);\n\t\t\tv2 = v1;\n\t\t\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);\n\t\t\tDUK_TVAL_SET_FASTINT_UPDREF(thr, tv, v2);\n\t\t\treturn;\n\t\t}\n\t\t/* fall through if overflow etc */\n\t}\n#endif  /* DUK_USE_FASTINT */\n\n\tif (DUK_TVAL_IS_NUMBER(tv)) {\n\t\td1 = DUK_TVAL_GET_NUMBER(tv);\n\t} else {\n\t\td1 = duk_to_number_tval(thr, tv);  /* side effects */\n\t}\n\n\tif (opcode == DUK_OP_UNP) {\n\t\t/* ToNumber() for a double is a no-op, but unary plus is\n\t\t * used to force a fastint check so do that here.\n\t\t */\n\t\tdu.d = d1;\n\t\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n#if defined(DUK_USE_FASTINT)\n\t\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);\n\t\tDUK_TVAL_SET_NUMBER_CHKFAST_UPDREF(thr, tv, du.d);  /* always 'fast', i.e. inlined */\n\t\treturn;\n#endif\n\t} else {\n\t\tDUK_ASSERT(opcode == DUK_OP_UNM);\n\t\tdu.d = -d1;\n\t\tDUK_DBLUNION_NORMALIZE_NAN_CHECK(&du);  /* mandatory if du.d is a NaN */\n\t\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n\t}\n\n\t/* XXX: size optimize: push+replace? */\n\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);\n\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv, du.d);\n}\n\nDUK_LOCAL DUK__INLINE_PERF void duk__vm_bitwise_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) {\n\t/*\n\t *  E5 Section 11.4.8\n\t */\n\n\tduk_tval *tv;\n\tduk_int32_t i1, i2;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT_DISABLE(idx_src >= 0);\n\tDUK_ASSERT_DISABLE(idx_dst >= 0);\n\tDUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr));\n\tDUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr));\n\n\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src);\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\ti1 = (duk_int32_t) DUK_TVAL_GET_FASTINT_I32(tv);\n\t}\n\telse\n#endif  /* DUK_USE_FASTINT */\n\t{\n\t\tduk_push_tval(thr, tv);\n\t\ti1 = duk_to_int32(thr, -1);  /* side effects */\n\t\tduk_pop_unsafe(thr);\n\t}\n\n\t/* Result is always fastint compatible. */\n\ti2 = ~i1;\n\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);\n\tDUK_TVAL_SET_I32_UPDREF(thr, tv, i2);  /* side effects */\n}\n\nDUK_LOCAL DUK__INLINE_PERF void duk__vm_logical_not(duk_hthread *thr, duk_uint_fast_t idx_src, duk_uint_fast_t idx_dst) {\n\t/*\n\t *  E5 Section 11.4.9\n\t */\n\n\tduk_tval *tv;\n\tduk_bool_t res;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT_DISABLE(idx_src >= 0);\n\tDUK_ASSERT_DISABLE(idx_dst >= 0);\n\tDUK_ASSERT((duk_uint_t) idx_src < (duk_uint_t) duk_get_top(thr));\n\tDUK_ASSERT((duk_uint_t) idx_dst < (duk_uint_t) duk_get_top(thr));\n\n\t/* ToBoolean() does not require any operations with side effects so\n\t * we can do it efficiently.  For footprint it would be better to use\n\t * duk_js_toboolean() and then push+replace to the result slot.\n\t */\n\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_src);\n\tres = duk_js_toboolean(tv);  /* does not modify 'tv' */\n\tDUK_ASSERT(res == 0 || res == 1);\n\tres ^= 1;\n\ttv = DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst);\n\t/* XXX: size optimize: push+replace? */\n\tDUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv, res);  /* side effects */\n}\n\n/* XXX: size optimized variant */\nDUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_reg_helper(duk_hthread *thr, duk_tval *tv_dst, duk_tval *tv_src, duk_small_uint_t op) {\n\tduk_double_t x, y, z;\n\n\t/* Two lowest bits of opcode are used to distinguish\n\t * variants.  Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1).\n\t */\n\tDUK_ASSERT((DUK_OP_PREINCR & 0x03) == 0x00);\n\tDUK_ASSERT((DUK_OP_PREDECR & 0x03) == 0x01);\n\tDUK_ASSERT((DUK_OP_POSTINCR & 0x03) == 0x02);\n\tDUK_ASSERT((DUK_OP_POSTDECR & 0x03) == 0x03);\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_src)) {\n\t\tduk_int64_t x_fi, y_fi, z_fi;\n\t\tx_fi = DUK_TVAL_GET_FASTINT(tv_src);\n\t\tif (op & 0x01) {\n\t\t\tif (DUK_UNLIKELY(x_fi == DUK_FASTINT_MIN)) {\n\t\t\t\tgoto skip_fastint;\n\t\t\t}\n\t\t\ty_fi = x_fi - 1;\n\t\t} else {\n\t\t\tif (DUK_UNLIKELY(x_fi == DUK_FASTINT_MAX)) {\n\t\t\t\tgoto skip_fastint;\n\t\t\t}\n\t\t\ty_fi = x_fi + 1;\n\t\t}\n\n\t\tDUK_TVAL_SET_FASTINT(tv_src, y_fi);  /* no need for refcount update */\n\n\t\tz_fi = (op & 0x02) ? x_fi : y_fi;\n\t\tDUK_TVAL_SET_FASTINT_UPDREF(thr, tv_dst, z_fi);  /* side effects */\n\t\treturn;\n\t}\n skip_fastint:\n#endif\n\tif (DUK_TVAL_IS_NUMBER(tv_src)) {\n\t\t/* Fast path for the case where the register\n\t\t * is a number (e.g. loop counter).\n\t\t */\n\n\t\tx = DUK_TVAL_GET_NUMBER(tv_src);\n\t\tif (op & 0x01) {\n\t\t\ty = x - 1.0;\n\t\t} else {\n\t\t\ty = x + 1.0;\n\t\t}\n\n\t\tDUK_TVAL_SET_NUMBER(tv_src, y);  /* no need for refcount update */\n\t} else {\n\t\t/* Preserve duk_tval pointer(s) across a potential valstack\n\t\t * resize by converting them into offsets temporarily.\n\t\t */\n\t\tduk_idx_t bc;\n\t\tduk_size_t off_dst;\n\n\t\toff_dst = (duk_size_t) ((duk_uint8_t *) tv_dst - (duk_uint8_t *) thr->valstack_bottom);\n\t\tbc = (duk_idx_t) (tv_src - thr->valstack_bottom);  /* XXX: pass index explicitly? */\n\t\ttv_src = NULL;  /* no longer referenced */\n\n\t\tx = duk_to_number(thr, bc);\n\t\tif (op & 0x01) {\n\t\t\ty = x - 1.0;\n\t\t} else {\n\t\t\ty = x + 1.0;\n\t\t}\n\n\t\tduk_push_number(thr, y);\n\t\tduk_replace(thr, bc);\n\n\t\ttv_dst = (duk_tval *) (void *) (((duk_uint8_t *) thr->valstack_bottom) + off_dst);\n\t}\n\n\tz = (op & 0x02) ? x : y;\n\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z);  /* side effects */\n}\n\nDUK_LOCAL DUK__INLINE_PERF void duk__prepost_incdec_var_helper(duk_hthread *thr, duk_small_uint_t idx_dst, duk_tval *tv_id, duk_small_uint_t op, duk_small_uint_t is_strict) {\n\tduk_activation *act;\n\tduk_double_t x, y;\n\tduk_hstring *name;\n\n\t/* XXX: The pre/post inc/dec for an identifier lookup is\n\t * missing the important fast path where the identifier\n\t * has a storage location e.g. in a scope object so that\n\t * it can be updated in-place.  In particular, the case\n\t * where the identifier has a storage location AND the\n\t * previous value is a number should be optimized because\n\t * it's side effect free.\n\t */\n\n\t/* Two lowest bits of opcode are used to distinguish\n\t * variants.  Bit 0 = inc(0)/dec(1), bit 1 = pre(0)/post(1).\n\t */\n\tDUK_ASSERT((DUK_OP_PREINCV & 0x03) == 0x00);\n\tDUK_ASSERT((DUK_OP_PREDECV & 0x03) == 0x01);\n\tDUK_ASSERT((DUK_OP_POSTINCV & 0x03) == 0x02);\n\tDUK_ASSERT((DUK_OP_POSTDECV & 0x03) == 0x03);\n\n\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv_id));\n\tname = DUK_TVAL_GET_STRING(tv_id);\n\tDUK_ASSERT(name != NULL);\n\tact = thr->callstack_curr;\n\t(void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/);  /* -> [ ... val this ] */\n\n\t/* XXX: Fastint fast path would be useful here.  Also fastints\n\t * now lose their fastint status in current handling which is\n\t * not intuitive.\n\t */\n\n\tx = duk_to_number_m2(thr);\n\tif (op & 0x01) {\n\t\ty = x - 1.0;\n\t} else {\n\t\ty = x + 1.0;\n\t}\n\n\t/* [... x this] */\n\n\tif (op & 0x02) {\n\t\tduk_push_number(thr, y);  /* -> [ ... x this y ] */\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tduk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict);\n\t\tduk_pop_2_unsafe(thr);  /* -> [ ... x ] */\n\t} else {\n\t\tduk_pop_2_unsafe(thr);  /* -> [ ... ] */\n\t\tduk_push_number(thr, y);  /* -> [ ... y ] */\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tduk_js_putvar_activation(thr, act, name, DUK_GET_TVAL_NEGIDX(thr, -1), is_strict);\n\t}\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\tduk_replace(thr, (duk_idx_t) idx_dst);\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\tDUK__REPLACE_TO_TVPTR(thr, DUK_GET_TVAL_POSIDX(thr, (duk_idx_t) idx_dst));\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n}\n\n/*\n *  Longjmp and other control flow transfer for the bytecode executor.\n *\n *  The longjmp handler can handle all longjmp types: error, yield, and\n *  resume (pseudotypes are never actually thrown).\n *\n *  Error policy for longjmp: should not ordinarily throw errors; if errors\n *  occur (e.g. due to out-of-memory) they bubble outwards rather than being\n *  handled recursively.\n */\n\n#define DUK__LONGJMP_RESTART   0  /* state updated, restart bytecode execution */\n#define DUK__LONGJMP_RETHROW   1  /* exit bytecode executor by rethrowing an error to caller */\n\n#define DUK__RETHAND_RESTART   0  /* state updated, restart bytecode execution */\n#define DUK__RETHAND_FINISHED  1  /* exit bytecode execution with return value */\n\n/* XXX: optimize reconfig valstack operations so that resize, clamp, and setting\n * top are combined into one pass.\n */\n\n/* Reconfigure value stack for return to an Ecmascript function at\n * callstack top (caller unwinds).\n */\nDUK_LOCAL void duk__reconfig_valstack_ecma_return(duk_hthread *thr) {\n\tduk_activation *act;\n\tduk_hcompfunc *h_func;\n\tduk_idx_t clamp_top;\n\n\tDUK_ASSERT(thr != NULL);\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act)));\n\n\t/* Clamp so that values at 'clamp_top' and above are wiped and won't\n\t * retain reachable garbage.  Then extend to 'nregs' because we're\n\t * returning to an Ecmascript function.\n\t */\n\n\th_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);\n\n\tthr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff);\n\tDUK_ASSERT(act->retval_byteoff >= act->bottom_byteoff);\n\tclamp_top = (duk_idx_t) ((act->retval_byteoff - act->bottom_byteoff + sizeof(duk_tval)) / sizeof(duk_tval));  /* +1 = one retval */\n\tduk_set_top_and_wipe(thr, h_func->nregs, clamp_top);\n\n\tDUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff);\n\tthr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff);\n\n\t/* XXX: a best effort shrink check would be OK here */\n}\n\n/* Reconfigure value stack for an Ecmascript catcher.  Use topmost catcher\n * in 'act'.\n */\nDUK_LOCAL void duk__reconfig_valstack_ecma_catcher(duk_hthread *thr, duk_activation *act) {\n\tduk_catcher *cat;\n\tduk_hcompfunc *h_func;\n\tduk_size_t idx_bottom;\n\tduk_idx_t clamp_top;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act)));\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\n\th_func = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);\n\n\tthr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff);\n\tidx_bottom = (duk_size_t) (thr->valstack_bottom - thr->valstack);\n\tDUK_ASSERT(cat->idx_base >= idx_bottom);\n\tclamp_top = (duk_idx_t) (cat->idx_base - idx_bottom + 2);  /* +2 = catcher value, catcher lj_type */\n\tduk_set_top_and_wipe(thr, h_func->nregs, clamp_top);\n\n\tDUK_ASSERT((duk_uint8_t *) thr->valstack_end >= (duk_uint8_t *) thr->valstack + act->reserve_byteoff);\n\tthr->valstack_end = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->reserve_byteoff);\n\n\t/* XXX: a best effort shrink check would be OK here */\n}\n\n/* Set catcher regs: idx_base+0 = value, idx_base+1 = lj_type.\n * No side effects.\n */\nDUK_LOCAL void duk__set_catcher_regs_norz(duk_hthread *thr, duk_catcher *cat, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) {\n\tduk_tval *tv1;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv_val_unstable != NULL);\n\n\ttv1 = thr->valstack + cat->idx_base;\n\tDUK_ASSERT(tv1 < thr->valstack_top);\n\tDUK_TVAL_SET_TVAL_UPDREF_NORZ(thr, tv1, tv_val_unstable);\n\n\ttv1++;\n\tDUK_ASSERT(tv1 == thr->valstack + cat->idx_base + 1);\n\tDUK_ASSERT(tv1 < thr->valstack_top);\n\tDUK_TVAL_SET_U32_UPDREF_NORZ(thr, tv1, (duk_uint32_t) lj_type);\n}\n\nDUK_LOCAL void duk__handle_catch(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) {\n\tduk_activation *act;\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv_val_unstable != NULL);\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(act->cat != NULL);\n\tDUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF);\n\n\tduk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type);\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(act == thr->callstack_curr);\n\tDUK_ASSERT(act != NULL);\n\tduk__reconfig_valstack_ecma_catcher(thr, act);\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(act == thr->callstack_curr);\n\tDUK_ASSERT(act != NULL);\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\n\tact->curr_pc = cat->pc_base + 0;  /* +0 = catch */\n\n\t/*\n\t *  If entering a 'catch' block which requires an automatic\n\t *  catch variable binding, create the lexical environment.\n\t *\n\t *  The binding is mutable (= writable) but not deletable.\n\t *  Step 4 for the catch production in E5 Section 12.14;\n\t *  no value is given for CreateMutableBinding 'D' argument,\n\t *  which implies the binding is not deletable.\n\t */\n\n\tif (DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat)) {\n\t\tduk_hdecenv *new_env;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"catcher has an automatic catch binding\"));\n\n\t\tDUK_ASSERT(thr->callstack_top >= 1);\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tDUK_ASSERT(act != NULL);\n\n\t\tif (act->lex_env == NULL) {\n\t\t\tDUK_ASSERT(act->var_env == NULL);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"delayed environment initialization\"));\n\n\t\t\tduk_js_init_activation_environment_records_delayed(thr, act);\n\t\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\t\tDUK_ASSERT(act != NULL);\n\t\t}\n\t\tDUK_ASSERT(act->lex_env != NULL);\n\t\tDUK_ASSERT(act->var_env != NULL);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);\n\n\t\t/* XXX: If an out-of-memory happens here, longjmp state asserts\n\t\t * will be triggered at present and a try-catch fails to catch.\n\t\t * That's not sandboxing fatal (C API protected calls are what\n\t\t * matters), and script catch code can immediately throw anyway\n\t\t * for almost any operation.\n\t\t */\n\t\tnew_env = duk_hdecenv_alloc(thr,\n\t\t                            DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t                            DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));\n\t\tDUK_ASSERT(new_env != NULL);\n\t\tduk_push_hobject(thr, (duk_hobject *) new_env);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);\n\t\tDUK_DDD(DUK_DDDPRINT(\"new_env allocated: %!iO\", (duk_heaphdr *) new_env));\n\n\t\t/* Note: currently the catch binding is handled without a register\n\t\t * binding because we don't support dynamic register bindings (they\n\t\t * must be fixed for an entire function).  So, there is no need to\n\t\t * record regbases etc.\n\t\t */\n\n\t\t/* XXX: duk_xdef_prop() may cause an out-of-memory, see above. */\n\t\tDUK_ASSERT(cat->h_varname != NULL);\n\t\tduk_push_hstring(thr, cat->h_varname);\n\t\tduk_push_tval(thr, thr->valstack + cat->idx_base);\n\t\tduk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_W);  /* writable, not configurable */\n\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tDUK_ASSERT(act != NULL);\n\t\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, act->lex_env);\n\t\tact->lex_env = (duk_hobject *) new_env;\n\t\tDUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env);  /* reachable through activation */\n\t\t/* Net refcount change to act->lex_env is 0: incref for new_env's\n\t\t * prototype, decref for act->lex_env overwrite.\n\t\t */\n\n\t\tDUK_CAT_SET_LEXENV_ACTIVE(cat);\n\n\t\tduk_pop_unsafe(thr);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"new_env finished: %!iO\", (duk_heaphdr *) new_env));\n\t}\n\n\tDUK_CAT_CLEAR_CATCH_ENABLED(cat);\n}\n\nDUK_LOCAL void duk__handle_finally(duk_hthread *thr, duk_tval *tv_val_unstable, duk_small_uint_t lj_type) {\n\tduk_activation *act;\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv_val_unstable != NULL);\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(act->cat != NULL);\n\tDUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF);\n\n\tduk__set_catcher_regs_norz(thr, act->cat, tv_val_unstable, lj_type);\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(act == thr->callstack_curr);\n\tDUK_ASSERT(act != NULL);\n\tduk__reconfig_valstack_ecma_catcher(thr, act);\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(act == thr->callstack_curr);\n\tDUK_ASSERT(act != NULL);\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\n\tact->curr_pc = cat->pc_base + 1;  /* +1 = finally */\n\n\tDUK_CAT_CLEAR_FINALLY_ENABLED(cat);\n}\n\nDUK_LOCAL void duk__handle_label(duk_hthread *thr, duk_small_uint_t lj_type) {\n\tduk_activation *act;\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(act) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(DUK_ACT_GET_FUNC(act)));\n\n\t/* +0 = break, +1 = continue */\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\tDUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL);\n\n\tact->curr_pc = cat->pc_base + (lj_type == DUK_LJ_TYPE_CONTINUE ? 1 : 0);\n\n\t/* valstack should not need changes */\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(act == thr->callstack_curr);\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack_bottom) ==\n\t           (duk_size_t) ((duk_hcompfunc *) DUK_ACT_GET_FUNC(act))->nregs);\n#endif\n}\n\n/* Called for handling both a longjmp() with type DUK_LJ_TYPE_YIELD and\n * when a RETURN opcode terminates a thread and yields to the resumer.\n * Caller unwinds so that top of callstack is the activation we return to.\n */\n#if defined(DUK_USE_COROUTINE_SUPPORT)\nDUK_LOCAL void duk__handle_yield(duk_hthread *thr, duk_hthread *resumer, duk_tval *tv_val_unstable) {\n\tduk_activation *act_resumer;\n\tduk_tval *tv1;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(resumer != NULL);\n\tDUK_ASSERT(tv_val_unstable != NULL);\n\tact_resumer = resumer->callstack_curr;\n\tDUK_ASSERT(act_resumer != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(act_resumer) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(act_resumer)));  /* resume caller must be an ecmascript func */\n\n\ttv1 = (duk_tval *) (void *) ((duk_uint8_t *) resumer->valstack + act_resumer->retval_byteoff);  /* return value from Duktape.Thread.resume() */\n\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv_val_unstable);  /* side effects */  /* XXX: avoid side effects */\n\n\tduk__reconfig_valstack_ecma_return(resumer);\n\n\t/* caller must change active thread, and set thr->resumer to NULL */\n}\n#endif  /* DUK_USE_COROUTINE_SUPPORT */\n\nDUK_LOCAL duk_small_uint_t duk__handle_longjmp(duk_hthread *thr, duk_activation *entry_act) {\n\tduk_small_uint_t retval = DUK__LONGJMP_RESTART;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(entry_act != NULL);\n\n\t/* 'thr' is the current thread, as no-one resumes except us and we\n\t * switch 'thr' in that case.\n\t */\n\tDUK_ASSERT(thr == thr->heap->curr_thread);\n\n\t/*\n\t *  (Re)try handling the longjmp.\n\t *\n\t *  A longjmp handler may convert the longjmp to a different type and\n\t *  \"virtually\" rethrow by goto'ing to 'check_longjmp'.  Before the goto,\n\t *  the following must be updated:\n\t *    - the heap 'lj' state\n\t *    - 'thr' must reflect the \"throwing\" thread\n\t */\n\n check_longjmp:\n\n\tDUK_DD(DUK_DDPRINT(\"handling longjmp: type=%ld, value1=%!T, value2=%!T, iserror=%ld\",\n\t                   (long) thr->heap->lj.type,\n\t                   (duk_tval *) &thr->heap->lj.value1,\n\t                   (duk_tval *) &thr->heap->lj.value2,\n\t                   (long) thr->heap->lj.iserror));\n\n\tswitch (thr->heap->lj.type) {\n\n#if defined(DUK_USE_COROUTINE_SUPPORT)\n\tcase DUK_LJ_TYPE_RESUME: {\n\t\t/*\n\t\t *  Note: lj.value1 is 'value', lj.value2 is 'resumee'.\n\t\t *  This differs from YIELD.\n\t\t */\n\n\t\tduk_tval *tv;\n\t\tduk_tval *tv2;\n\t\tduk_hthread *resumee;\n\n\t\t/* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */\n\n\t\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);                                                         /* unchanged by Duktape.Thread.resume() */\n\t\tDUK_ASSERT(thr->callstack_top >= 2);                                                                         /* Ecmascript activation + Duktape.Thread.resume() activation */\n\t\tDUK_ASSERT(thr->callstack_curr != NULL);\n\t\tDUK_ASSERT(thr->callstack_curr->parent != NULL);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL &&\n\t\t           DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) &&\n\t\t           ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_resume);\n\n\t\ttv = &thr->heap->lj.value2;  /* resumee */\n\t\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));\n\t\tDUK_ASSERT(DUK_TVAL_GET_OBJECT(tv) != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_THREAD(DUK_TVAL_GET_OBJECT(tv)));\n\t\tresumee = (duk_hthread *) DUK_TVAL_GET_OBJECT(tv);\n\n\t\tDUK_ASSERT(resumee != NULL);\n\t\tDUK_ASSERT(resumee->resumer == NULL);\n\t\tDUK_ASSERT(resumee->state == DUK_HTHREAD_STATE_INACTIVE ||\n\t\t           resumee->state == DUK_HTHREAD_STATE_YIELDED);                                                     /* checked by Duktape.Thread.resume() */\n\t\tDUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED ||\n\t\t           resumee->callstack_top >= 2);                                                                     /* YIELDED: Ecmascript activation + Duktape.Thread.yield() activation */\n\t\tDUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_YIELDED ||\n\t\t           (DUK_ACT_GET_FUNC(resumee->callstack_curr) != NULL &&\n\t\t            DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumee->callstack_curr)) &&\n\t\t            ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumee->callstack_curr))->func == duk_bi_thread_yield));\n\t\tDUK_ASSERT(resumee->state != DUK_HTHREAD_STATE_INACTIVE ||\n\t\t           resumee->callstack_top == 0);                                                                     /* INACTIVE: no activation, single function value on valstack */\n\n\t\tif (thr->heap->lj.iserror) {\n\t\t\t/*\n\t\t\t *  Throw the error in the resumed thread's context; the\n\t\t\t *  error value is pushed onto the resumee valstack.\n\t\t\t *\n\t\t\t *  Note: the callstack of the target may empty in this case\n\t\t\t *  too (i.e. the target thread has never been resumed).  The\n\t\t\t *  value stack will contain the initial function in that case,\n\t\t\t *  which we simply ignore.\n\t\t\t */\n\n\t\t\tDUK_ASSERT(resumee->resumer == NULL);\n\t\t\tresumee->resumer = thr;\n\t\t\tDUK_HTHREAD_INCREF(thr, thr);\n\t\t\tresumee->state = DUK_HTHREAD_STATE_RUNNING;\n\t\t\tthr->state = DUK_HTHREAD_STATE_RESUMED;\n\t\t\tDUK_HEAP_SWITCH_THREAD(thr->heap, resumee);\n\t\t\tthr = resumee;\n\n\t\t\tthr->heap->lj.type = DUK_LJ_TYPE_THROW;\n\n\t\t\t/* thr->heap->lj.value1 is already the value to throw */\n\t\t\t/* thr->heap->lj.value2 is 'thread', will be wiped out at the end */\n\n\t\t\tDUK_ASSERT(thr->heap->lj.iserror);  /* already set */\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> resume with an error, converted to a throw in the resumee, propagate\"));\n\t\t\tgoto check_longjmp;\n\t\t} else if (resumee->state == DUK_HTHREAD_STATE_YIELDED) {\n\t\t\t/* Unwind previous Duktape.Thread.yield() call.  The\n\t\t\t * activation remaining must always be an Ecmascript\n\t\t\t * call now (yield() accepts calls from Ecmascript\n\t\t\t * only).\n\t\t\t */\n\t\t\tduk_activation *act_resumee;\n\n\t\t\tDUK_ASSERT(resumee->callstack_top >= 2);\n\t\t\tact_resumee = resumee->callstack_curr;  /* Duktape.Thread.yield() */\n\t\t\tDUK_ASSERT(act_resumee != NULL);\n\t\t\tact_resumee = act_resumee->parent;      /* Ecmascript call site for yield() */\n\t\t\tDUK_ASSERT(act_resumee != NULL);\n\n\t\t\ttv = (duk_tval *) (void *) ((duk_uint8_t *) resumee->valstack + act_resumee->retval_byteoff);  /* return value from Duktape.Thread.yield() */\n\t\t\tDUK_ASSERT(tv >= resumee->valstack && tv < resumee->valstack_top);\n\t\t\ttv2 = &thr->heap->lj.value1;\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv, tv2);  /* side effects */  /* XXX: avoid side effects */\n\n\t\t\tduk_hthread_activation_unwind_norz(resumee);  /* unwind to 'yield' caller */\n\t\t\t/* no need to unwind catch stack */\n\n\t\t\tduk__reconfig_valstack_ecma_return(resumee);\n\n\t\t\tDUK_ASSERT(resumee->resumer == NULL);\n\t\t\tresumee->resumer = thr;\n\t\t\tDUK_HTHREAD_INCREF(thr, thr);\n\t\t\tresumee->state = DUK_HTHREAD_STATE_RUNNING;\n\t\t\tthr->state = DUK_HTHREAD_STATE_RESUMED;\n\t\t\tDUK_HEAP_SWITCH_THREAD(thr->heap, resumee);\n#if 0\n\t\t\tthr = resumee;  /* not needed, as we exit right away */\n#endif\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> resume with a value, restart execution in resumee\"));\n\t\t\tretval = DUK__LONGJMP_RESTART;\n\t\t\tgoto wipe_and_return;\n\t\t} else {\n\t\t\t/* Initial resume call. */\n\t\t\tduk_small_uint_t call_flags;\n\t\t\tduk_int_t setup_rc;\n\n\t\t\t/* resumee: [... initial_func]  (currently actually: [initial_func]) */\n\n\t\t\tduk_push_undefined(resumee);\n\t\t\ttv = &thr->heap->lj.value1;\n\t\t\tduk_push_tval(resumee, tv);\n\n\t\t\t/* resumee: [... initial_func undefined(= this) resume_value ] */\n\n\t\t\tcall_flags = DUK_CALL_FLAG_ALLOW_ECMATOECMA;  /* not tailcall, ecma-to-ecma (assumed to succeed) */\n\n\t\t\tsetup_rc = duk_handle_call_unprotected_nargs(resumee, 1 /*nargs*/, call_flags);\n\t\t\tif (setup_rc == 0) {\n\t\t\t\t/* This shouldn't happen; Duktape.Thread.resume()\n\t\t\t\t * should make sure of that.  If it does happen\n\t\t\t\t * this internal error will propagate out of the\n\t\t\t\t * executor which can be quite misleading.\n\t\t\t\t */\n\t\t\t\tDUK_ERROR_INTERNAL(thr);\n\t\t\t}\n\n\t\t\tDUK_ASSERT(resumee->resumer == NULL);\n\t\t\tresumee->resumer = thr;\n\t\t\tDUK_HTHREAD_INCREF(thr, thr);\n\t\t\tresumee->state = DUK_HTHREAD_STATE_RUNNING;\n\t\t\tthr->state = DUK_HTHREAD_STATE_RESUMED;\n\t\t\tDUK_HEAP_SWITCH_THREAD(thr->heap, resumee);\n#if 0\n\t\t\tthr = resumee;  /* not needed, as we exit right away */\n#endif\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> resume with a value, restart execution in resumee\"));\n\t\t\tretval = DUK__LONGJMP_RESTART;\n\t\t\tgoto wipe_and_return;\n\t\t}\n\t\tDUK_UNREACHABLE();\n\t\tbreak;  /* never here */\n\t}\n\n\tcase DUK_LJ_TYPE_YIELD: {\n\t\t/*\n\t\t *  Currently only allowed only if yielding thread has only\n\t\t *  Ecmascript activations (except for the Duktape.Thread.yield()\n\t\t *  call at the callstack top) and none of them constructor\n\t\t *  calls.\n\t\t *\n\t\t *  This excludes the 'entry' thread which will always have\n\t\t *  a preventcount > 0.\n\t\t */\n\n\t\tduk_hthread *resumer;\n\n\t\t/* duk_bi_duk_object_yield() and duk_bi_duk_object_resume() ensure all of these are met */\n\n#if 0  /* entry_thread not available for assert */\n\t\tDUK_ASSERT(thr != entry_thread);                                                                             /* Duktape.Thread.yield() should prevent */\n#endif\n\t\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);                                                         /* unchanged from Duktape.Thread.yield() */\n\t\tDUK_ASSERT(thr->callstack_top >= 2);                                                                         /* Ecmascript activation + Duktape.Thread.yield() activation */\n\t\tDUK_ASSERT(thr->callstack_curr != NULL);\n\t\tDUK_ASSERT(thr->callstack_curr->parent != NULL);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL &&\n\t\t           DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)) &&\n\t\t           ((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->callstack_curr))->func == duk_bi_thread_yield);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr->parent) != NULL &&\n\t\t           DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent)));                              /* an Ecmascript function */\n\n\t\tresumer = thr->resumer;\n\n\t\tDUK_ASSERT(resumer != NULL);\n\t\tDUK_ASSERT(resumer->state == DUK_HTHREAD_STATE_RESUMED);                                                     /* written by a previous RESUME handling */\n\t\tDUK_ASSERT(resumer->callstack_top >= 2);                                                                     /* Ecmascript activation + Duktape.Thread.resume() activation */\n\t\tDUK_ASSERT(resumer->callstack_curr != NULL);\n\t\tDUK_ASSERT(resumer->callstack_curr->parent != NULL);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr) != NULL &&\n\t\t           DUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr)) &&\n\t\t           ((duk_hnatfunc *) DUK_ACT_GET_FUNC(resumer->callstack_curr))->func == duk_bi_thread_resume);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent) != NULL &&\n\t\t           DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(resumer->callstack_curr->parent)));                            /* an Ecmascript function */\n\n\t\tif (thr->heap->lj.iserror) {\n\t\t\tthr->state = DUK_HTHREAD_STATE_YIELDED;\n\t\t\tthr->resumer = NULL;\n\t\t\tDUK_HTHREAD_DECREF_NORZ(thr, resumer);\n\t\t\tresumer->state = DUK_HTHREAD_STATE_RUNNING;\n\t\t\tDUK_HEAP_SWITCH_THREAD(thr->heap, resumer);\n\t\t\tthr = resumer;\n\n\t\t\tthr->heap->lj.type = DUK_LJ_TYPE_THROW;\n\t\t\t/* lj.value1 is already set */\n\t\t\tDUK_ASSERT(thr->heap->lj.iserror);  /* already set */\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> yield an error, converted to a throw in the resumer, propagate\"));\n\t\t\tgoto check_longjmp;\n\t\t} else {\n\t\t\tduk_hthread_activation_unwind_norz(resumer);\n\t\t\tduk__handle_yield(thr, resumer, &thr->heap->lj.value1);\n\n\t\t\tthr->state = DUK_HTHREAD_STATE_YIELDED;\n\t\t\tthr->resumer = NULL;\n\t\t\tDUK_HTHREAD_DECREF_NORZ(thr, resumer);\n\t\t\tresumer->state = DUK_HTHREAD_STATE_RUNNING;\n\t\t\tDUK_HEAP_SWITCH_THREAD(thr->heap, resumer);\n#if 0\n\t\t\tthr = resumer;  /* not needed, as we exit right away */\n#endif\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> yield a value, restart execution in resumer\"));\n\t\t\tretval = DUK__LONGJMP_RESTART;\n\t\t\tgoto wipe_and_return;\n\t\t}\n\t\tDUK_UNREACHABLE();\n\t\tbreak;  /* never here */\n\t}\n#endif  /* DUK_USE_COROUTINE_SUPPORT */\n\n\tcase DUK_LJ_TYPE_THROW: {\n\t\t/*\n\t\t *  Three possible outcomes:\n\t\t *    * A try or finally catcher is found => resume there.\n\t\t *      (or)\n\t\t *    * The error propagates to the bytecode executor entry\n\t\t *      level (and we're in the entry thread) => rethrow\n\t\t *      with a new longjmp(), after restoring the previous\n\t\t *      catchpoint.\n\t\t *    * The error is not caught in the current thread, so\n\t\t *      the thread finishes with an error.  This works like\n\t\t *      a yielded error, except that the thread is finished\n\t\t *      and can no longer be resumed.  (There is always a\n\t\t *      resumer in this case.)\n\t\t *\n\t\t *  Note: until we hit the entry level, there can only be\n\t\t *  Ecmascript activations.\n\t\t */\n\n\t\tduk_activation *act;\n\t\tduk_catcher *cat;\n\t\tduk_hthread *resumer;\n\n\t\tfor (;;) {\n\t\t\tact = thr->callstack_curr;\n\t\t\tif (act == NULL) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tfor (;;) {\n\t\t\t\tcat = act->cat;\n\t\t\t\tif (cat == NULL) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (DUK_CAT_HAS_CATCH_ENABLED(cat)) {\n\t\t\t\t\tDUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF);\n\n\t\t\t\t\tduk__handle_catch(thr,\n\t\t\t\t\t                  &thr->heap->lj.value1,\n\t\t\t\t\t                  DUK_LJ_TYPE_THROW);\n\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"-> throw caught by a 'catch' clause, restart execution\"));\n\t\t\t\t\tretval = DUK__LONGJMP_RESTART;\n\t\t\t\t\tgoto wipe_and_return;\n\t\t\t\t}\n\n\t\t\t\tif (DUK_CAT_HAS_FINALLY_ENABLED(cat)) {\n\t\t\t\t\tDUK_ASSERT(DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF);\n\t\t\t\t\tDUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat));\n\n\t\t\t\t\tduk__handle_finally(thr,\n\t\t\t\t\t                    &thr->heap->lj.value1,\n\t\t\t\t\t                    DUK_LJ_TYPE_THROW);\n\n\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"-> throw caught by a 'finally' clause, restart execution\"));\n\t\t\t\t\tretval = DUK__LONGJMP_RESTART;\n\t\t\t\t\tgoto wipe_and_return;\n\t\t\t\t}\n\n\t\t\t\tduk_hthread_catcher_unwind_norz(thr, act);\n\t\t\t}\n\n\t\t\tif (act == entry_act) {\n\t\t\t\t/* Not caught by anything before entry level; rethrow and let the\n\t\t\t\t * final catcher finish unwinding (esp. value stack).\n\t\t\t\t */\n\t\t\t\tDUK_D(DUK_DPRINT(\"-> throw propagated up to entry level, rethrow and exit bytecode executor\"));\n\t\t\t\tretval = DUK__LONGJMP_RETHROW;\n\t\t\t\tgoto just_return;\n\t\t\t}\n\n\t\t\tduk_hthread_activation_unwind_norz(thr);\n\t\t}\n\n\t\tDUK_DD(DUK_DDPRINT(\"-> throw not caught by current thread, yield error to resumer and recheck longjmp\"));\n\n\t\t/* Not caught by current thread, thread terminates (yield error to resumer);\n\t\t * note that this may cause a cascade if the resumer terminates with an uncaught\n\t\t * exception etc (this is OK, but needs careful testing).\n\t\t */\n\n\t\tDUK_ASSERT(thr->resumer != NULL);\n\t\tDUK_ASSERT(thr->resumer->callstack_top >= 2);  /* Ecmascript activation + Duktape.Thread.resume() activation */\n\t\tDUK_ASSERT(thr->resumer->callstack_curr != NULL);\n\t\tDUK_ASSERT(thr->resumer->callstack_curr->parent != NULL);\n\t\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL &&\n\t\t           DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent)));  /* an Ecmascript function */\n\n\t\tresumer = thr->resumer;\n\n\t\t/* reset longjmp */\n\n\t\tDUK_ASSERT(thr->heap->lj.type == DUK_LJ_TYPE_THROW);  /* already set */\n\t\t/* lj.value1 already set */\n\n\t\tduk_hthread_terminate(thr);  /* updates thread state, minimizes its allocations */\n\t\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED);\n\n\t\tthr->resumer = NULL;\n\t\tDUK_HTHREAD_DECREF_NORZ(thr, resumer);\n\t\tresumer->state = DUK_HTHREAD_STATE_RUNNING;\n\t\tDUK_HEAP_SWITCH_THREAD(thr->heap, resumer);\n\t\tthr = resumer;\n\t\tgoto check_longjmp;\n\t}\n\n\tcase DUK_LJ_TYPE_BREAK:  /* pseudotypes, not used in actual longjmps */\n\tcase DUK_LJ_TYPE_CONTINUE:\n\tcase DUK_LJ_TYPE_RETURN:\n\tcase DUK_LJ_TYPE_NORMAL:\n\tdefault: {\n\t\t/* should never happen, but be robust */\n\t\tDUK_D(DUK_DPRINT(\"caught unknown longjmp type %ld, treat as internal error\", (long) thr->heap->lj.type));\n\t\tgoto convert_to_internal_error;\n\t}\n\n\t}  /* end switch */\n\n\tDUK_UNREACHABLE();\n\n wipe_and_return:\n\t/* this is not strictly necessary, but helps debugging */\n\tthr->heap->lj.type = DUK_LJ_TYPE_UNKNOWN;\n\tthr->heap->lj.iserror = 0;\n\n\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value1);  /* side effects */\n\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, &thr->heap->lj.value2);  /* side effects */\n\n\tDUK_GC_TORTURE(thr->heap);\n\n just_return:\n\treturn retval;\n\n convert_to_internal_error:\n\t/* This could also be thrown internally (set the error, goto check_longjmp),\n\t * but it's better for internal errors to bubble outwards so that we won't\n\t * infinite loop in this catchpoint.\n\t */\n\tDUK_ERROR_INTERNAL(thr);\n\tDUK_UNREACHABLE();\n\treturn retval;\n}\n\n/* Handle a BREAK/CONTINUE opcode.  Avoid using longjmp() for BREAK/CONTINUE\n * handling because it has a measurable performance impact in ordinary\n * environments and an extreme impact in Emscripten (GH-342).\n */\nDUK_LOCAL DUK__NOINLINE_PERF void duk__handle_break_or_continue(duk_hthread *thr,\n                                                                duk_uint_t label_id,\n                                                                duk_small_uint_t lj_type) {\n\tduk_activation *act;\n\tduk_catcher *cat;\n\n\tDUK_ASSERT(thr != NULL);\n\n\t/* Find a matching label catcher or 'finally' catcher in\n\t * the same function, unwinding catchers as we go.\n\t *\n\t * A label catcher must always exist and will match unless\n\t * a 'finally' captures the break/continue first.  It is the\n\t * compiler's responsibility to ensure that labels are used\n\t * correctly.\n\t */\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\n\tfor (;;) {\n\t\tcat = act->cat;\n\t\tif (cat == NULL) {\n\t\t\tbreak;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"considering catcher %p: type=%ld label=%ld\",\n\t\t                     (void *) cat,\n\t\t                     (long) DUK_CAT_GET_TYPE(cat),\n\t\t                     (long) DUK_CAT_GET_LABEL(cat)));\n\n\t\t/* XXX: bit mask test; FINALLY <-> TCF, single bit mask would suffice? */\n\n\t\tif (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF &&\n\t\t    DUK_CAT_HAS_FINALLY_ENABLED(cat)) {\n\t\t\tduk_tval tv_tmp;\n\n\t\t\tDUK_TVAL_SET_U32(&tv_tmp, (duk_uint32_t) label_id);\n\t\t\tduk__handle_finally(thr, &tv_tmp, lj_type);\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> break/continue caught by 'finally', restart execution\"));\n\t\t\treturn;\n\t\t}\n\t\tif (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_LABEL &&\n\t\t    (duk_uint_t) DUK_CAT_GET_LABEL(cat) == label_id) {\n\t\t\tduk__handle_label(thr, lj_type);\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> break/continue caught by a label catcher (in the same function), restart execution\"));\n\t\t\treturn;\n\t\t}\n\n\t\tduk_hthread_catcher_unwind_norz(thr, act);\n\t}\n\n\t/* Should never happen, but be robust. */\n\tDUK_D(DUK_DPRINT(\"-> break/continue not caught by anything in the current function (should never happen), throw internal error\"));\n\tDUK_ERROR_INTERNAL(thr);\n\treturn;\n}\n\n/* Handle a RETURN opcode.  Avoid using longjmp() for return handling because\n * it has a measurable performance impact in ordinary environments and an extreme\n * impact in Emscripten (GH-342).  Return value is on value stack top.\n */\nDUK_LOCAL duk_small_uint_t duk__handle_return(duk_hthread *thr, duk_activation *entry_act) {\n\tduk_tval *tv1;\n\tduk_tval *tv2;\n#if defined(DUK_USE_COROUTINE_SUPPORT)\n\tduk_hthread *resumer;\n#endif\n\tduk_activation *act;\n\tduk_catcher *cat;\n\n\t/* We can directly access value stack here. */\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(entry_act != NULL);\n\tDUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);\n\ttv1 = thr->valstack_top - 1;\n\tDUK_TVAL_CHKFAST_INPLACE_FAST(tv1);  /* fastint downgrade check for return values */\n\n\t/*\n\t *  Four possible outcomes:\n\t *\n\t *    1. A 'finally' in the same function catches the 'return'.\n\t *       It may continue to propagate when 'finally' is finished,\n\t *       or it may be neutralized by 'finally' (both handled by\n\t *       ENDFIN).\n\t *\n\t *    2. The return happens at the entry level of the bytecode\n\t *       executor, so return from the executor (in C stack).\n\t *\n\t *    3. There is a calling (Ecmascript) activation in the call\n\t *       stack => return to it, in the same executor instance.\n\t *\n\t *    4. There is no calling activation, and the thread is\n\t *       terminated.  There is always a resumer in this case,\n\t *       which gets the return value similarly to a 'yield'\n\t *       (except that the current thread can no longer be\n\t *       resumed).\n\t */\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\n\tfor (;;) {\n\t\tcat = act->cat;\n\t\tif (cat == NULL) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (DUK_CAT_GET_TYPE(cat) == DUK_CAT_TYPE_TCF &&\n\t\t    DUK_CAT_HAS_FINALLY_ENABLED(cat)) {\n\t\t\tDUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);\n\t\t\tduk__handle_finally(thr, thr->valstack_top - 1, DUK_LJ_TYPE_RETURN);\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"-> return caught by 'finally', restart execution\"));\n\t\t\treturn DUK__RETHAND_RESTART;\n\t\t}\n\n\t\tduk_hthread_catcher_unwind_norz(thr, act);\n\t}\n\n\tif (act == entry_act) {\n\t\t/* Return to the bytecode executor caller who will unwind stacks\n\t\t * and handle constructor post-processing.\n\t\t * Return value is already on the stack top: [ ... retval ].\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> return propagated up to entry level, exit bytecode executor\"));\n\t\treturn DUK__RETHAND_FINISHED;\n\t}\n\n\tif (thr->callstack_top >= 2) {\n\t\t/* There is a caller; it MUST be an Ecmascript caller (otherwise it would\n\t\t * match entry_act check).\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"return to Ecmascript caller, retval_byteoff=%ld, lj_value1=%!T\",\n\t\t                     (long) (thr->callstack_curr->parent->retval_byteoff),\n\t\t                     (duk_tval *) &thr->heap->lj.value1));\n\n\t\tDUK_ASSERT(thr->callstack_curr != NULL);\n\t\tDUK_ASSERT(thr->callstack_curr->parent != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr->parent)));   /* must be ecmascript */\n\n#if defined(DUK_USE_ES6_PROXY)\n\t\tif (thr->callstack_curr->flags & (DUK_ACT_FLAG_CONSTRUCT | DUK_ACT_FLAG_CONSTRUCT_PROXY)) {\n\t\t\tduk_call_construct_postprocess(thr, thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT_PROXY);  /* side effects */\n\t\t}\n#else\n\t\tif (thr->callstack_curr->flags & DUK_ACT_FLAG_CONSTRUCT) {\n\t\t\tduk_call_construct_postprocess(thr, 0);  /* side effects */\n\t\t}\n#endif\n\n\t\ttv1 = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + thr->callstack_curr->parent->retval_byteoff);\n\t\tDUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);\n\t\ttv2 = thr->valstack_top - 1;\n\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv1, tv2);  /* side effects */\n\n\t\t/* Catch stack unwind happens inline in callstack unwind. */\n\t\tduk_hthread_activation_unwind_norz(thr);\n\n\t\tduk__reconfig_valstack_ecma_return(thr);\n\n\t\tDUK_DD(DUK_DDPRINT(\"-> return not intercepted, restart execution in caller\"));\n\t\treturn DUK__RETHAND_RESTART;\n\t}\n\n#if defined(DUK_USE_COROUTINE_SUPPORT)\n\tDUK_DD(DUK_DDPRINT(\"no calling activation, thread finishes (similar to yield)\"));\n\n\tDUK_ASSERT(thr->resumer != NULL);\n\tDUK_ASSERT(thr->resumer->callstack_top >= 2);  /* Ecmascript activation + Duktape.Thread.resume() activation */\n\tDUK_ASSERT(thr->resumer->callstack_curr != NULL);\n\tDUK_ASSERT(thr->resumer->callstack_curr->parent != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr) != NULL &&\n\t\t\tDUK_HOBJECT_IS_NATFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr)) &&\n\t\t\t((duk_hnatfunc *) DUK_ACT_GET_FUNC(thr->resumer->callstack_curr))->func == duk_bi_thread_resume);  /* Duktape.Thread.resume() */\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent) != NULL &&\n\t\t\tDUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->resumer->callstack_curr->parent)));  /* an Ecmascript function */\n\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_RUNNING);\n\tDUK_ASSERT(thr->resumer->state == DUK_HTHREAD_STATE_RESUMED);\n\n\tresumer = thr->resumer;\n\n\t/* Share yield longjmp handler. */\n\tDUK_ASSERT(thr->valstack_top - 1 >= thr->valstack_bottom);\n\tduk_hthread_activation_unwind_norz(resumer);\n\tduk__handle_yield(thr, resumer, thr->valstack_top - 1);\n\n\tduk_hthread_terminate(thr);  /* updates thread state, minimizes its allocations */\n\tDUK_ASSERT(thr->state == DUK_HTHREAD_STATE_TERMINATED);\n\n\tthr->resumer = NULL;\n\tDUK_HTHREAD_DECREF(thr, resumer);\n\tresumer->state = DUK_HTHREAD_STATE_RUNNING;\n\tDUK_HEAP_SWITCH_THREAD(thr->heap, resumer);\n#if 0\n\tthr = resumer;  /* not needed */\n#endif\n\n\tDUK_DD(DUK_DDPRINT(\"-> return not caught, thread terminated; handle like yield, restart execution in resumer\"));\n\treturn DUK__RETHAND_RESTART;\n#else\n\t/* Without coroutine support this case should never happen. */\n\tDUK_ERROR_INTERNAL(thr);\n\treturn DUK__RETHAND_FINISHED;  /* not executed */\n#endif\n}\n\n/*\n *  Executor interrupt handling\n *\n *  The handler is called whenever the interrupt countdown reaches zero\n *  (or below).  The handler must perform whatever checks are activated,\n *  e.g. check for cumulative step count to impose an execution step\n *  limit or check for breakpoints or other debugger interaction.\n *\n *  When the actions are done, the handler must reinit the interrupt\n *  init and counter values.  The 'init' value must indicate how many\n *  bytecode instructions are executed before the next interrupt.  The\n *  counter must interface with the bytecode executor loop.  Concretely,\n *  the new init value is normally one higher than the new counter value.\n *  For instance, to execute exactly one bytecode instruction the init\n *  value is set to 1 and the counter to 0.  If an error is thrown by the\n *  interrupt handler, the counters are set to the same value (e.g. both\n *  to 0 to cause an interrupt when the next bytecode instruction is about\n *  to be executed after error handling).\n *\n *  Maintaining the init/counter value properly is important for accurate\n *  behavior.  For instance, executor step limit needs a cumulative step\n *  count which is simply computed as a sum of 'init' values.  This must\n *  work accurately even when single stepping.\n */\n\n#if defined(DUK_USE_INTERRUPT_COUNTER)\n\n#define DUK__INT_NOACTION    0    /* no specific action, resume normal execution */\n#define DUK__INT_RESTART     1    /* must \"goto restart_execution\", e.g. breakpoints changed */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_LOCAL void duk__interrupt_handle_debugger(duk_hthread *thr, duk_bool_t *out_immediate, duk_small_uint_t *out_interrupt_retval) {\n\tduk_activation *act;\n\tduk_breakpoint *bp;\n\tduk_breakpoint **bp_active;\n\tduk_uint_fast32_t line = 0;\n\tduk_bool_t process_messages;\n\tduk_bool_t processed_messages = 0;\n\n\tDUK_ASSERT(thr->heap->dbg_processing == 0);  /* don't re-enter e.g. during Eval */\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\n\t/* It might seem that replacing 'thr->heap' with just 'heap' below\n\t * might be a good idea, but it increases code size slightly\n\t * (probably due to unnecessary spilling) at least on x64.\n\t */\n\n\t/*\n\t *  Single opcode step check\n\t */\n\n\tif (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE) {\n\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by one opcode step\"));\n\t\tduk_debug_set_paused(thr->heap);\n\t}\n\n\t/*\n\t *  Breakpoint and step state checks\n\t */\n\n\tif (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE ||\n\t    (thr->heap->dbg_pause_act == thr->callstack_curr)) {\n\t\tline = duk_debug_curr_line(thr);\n\n\t\tif (act->prev_line != line) {\n\t\t\t/* Stepped?  Step out is handled by callstack unwind. */\n\t\t\tif ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) &&\n\t\t\t    (thr->heap->dbg_pause_act == thr->callstack_curr) &&\n\t\t\t    (line != thr->heap->dbg_pause_startline)) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by line change, at line %ld\",\n\t\t\t\t                 (long) line));\n\t\t\t\tduk_debug_set_paused(thr->heap);\n\t\t\t}\n\n\t\t\t/* Check for breakpoints only on line transition.\n\t\t\t * Breakpoint is triggered when we enter the target\n\t\t\t * line from a different line, and the previous line\n\t\t\t * was within the same function.\n\t\t\t *\n\t\t\t * This condition is tricky: the condition used to be\n\t\t\t * that transition to -or across- the breakpoint line\n\t\t\t * triggered the breakpoint.  This seems intuitively\n\t\t\t * better because it handles breakpoints on lines with\n\t\t\t * no emitted opcodes; but this leads to the issue\n\t\t\t * described in: https://github.com/svaarala/duktape/issues/263.\n\t\t\t */\n\t\t\tbp_active = thr->heap->dbg_breakpoints_active;\n\t\t\tfor (;;) {\n\t\t\t\tbp = *bp_active++;\n\t\t\t\tif (bp == NULL) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tDUK_ASSERT(bp->filename != NULL);\n\t\t\t\tif (act->prev_line != bp->line && line == bp->line) {\n\t\t\t\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by breakpoint at %!O:%ld\",\n\t\t\t\t\t                 (duk_heaphdr *) bp->filename, (long) bp->line));\n\t\t\t\t\tduk_debug_set_paused(thr->heap);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t;\n\t\t}\n\n\t\tact->prev_line = (duk_uint32_t) line;\n\t}\n\n\t/*\n\t *  Rate limit check for sending status update or peeking into\n\t *  the debug transport.  Both can be expensive operations that\n\t *  we don't want to do on every opcode.\n\t *\n\t *  Making sure the interval remains reasonable on a wide variety\n\t *  of targets and bytecode is difficult without a timestamp, so\n\t *  we use a Date-provided timestamp for the rate limit check.\n\t *  But since it's also expensive to get a timestamp, a bytecode\n\t *  counter is used to rate limit getting timestamps.\n\t */\n\n\tprocess_messages = 0;\n\tif (thr->heap->dbg_state_dirty || DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) || thr->heap->dbg_detaching) {\n\t\t/* Enter message processing loop for sending Status notifys and\n\t\t * to finish a pending detach.\n\t\t */\n\t\tprocess_messages = 1;\n\t}\n\n\t/* XXX: remove heap->dbg_exec_counter, use heap->inst_count_interrupt instead? */\n\tDUK_ASSERT(thr->interrupt_init >= 0);\n\tthr->heap->dbg_exec_counter += (duk_uint_t) thr->interrupt_init;\n\tif (thr->heap->dbg_exec_counter - thr->heap->dbg_last_counter >= DUK_HEAP_DBG_RATELIMIT_OPCODES) {\n\t\t/* Overflow of the execution counter is fine and doesn't break\n\t\t * anything here.\n\t\t */\n\n\t\tduk_double_t now, diff_last;\n\n\t\tthr->heap->dbg_last_counter = thr->heap->dbg_exec_counter;\n\t\tnow = duk_time_get_monotonic_time(thr);\n\n\t\tdiff_last = now - thr->heap->dbg_last_time;\n\t\tif (diff_last < 0.0 || diff_last >= (duk_double_t) DUK_HEAP_DBG_RATELIMIT_MILLISECS) {\n\t\t\t/* Monotonic time should not experience time jumps,\n\t\t\t * but the provider may be missing and we're actually\n\t\t\t * using Ecmascript time.  So, tolerate negative values\n\t\t\t * so that a time jump works reasonably.\n\t\t\t *\n\t\t\t * Same interval is now used for status sending and\n\t\t\t * peeking.\n\t\t\t */\n\n\t\t\tthr->heap->dbg_last_time = now;\n\t\t\tthr->heap->dbg_state_dirty = 1;\n\t\t\tprocess_messages = 1;\n\t\t}\n\t}\n\n\t/*\n\t *  Process messages and send status if necessary.\n\t *\n\t *  If we're paused, we'll block for new messages.  If we're not\n\t *  paused, we'll process anything we can peek but won't block\n\t *  for more.  Detach (and re-attach) handling is all localized\n\t *  to duk_debug_process_messages() too.\n\t *\n\t *  Debugger writes outside the message loop may cause debugger\n\t *  detach1 phase to run, after which dbg_read_cb == NULL and\n\t *  dbg_detaching != 0.  The message loop will finish the detach\n\t *  by running detach2 phase, so enter the message loop also when\n\t *  detaching.\n\t */\n\n\tif (process_messages) {\n\t\tDUK_ASSERT(thr->heap->dbg_processing == 0);\n\t\tprocessed_messages = duk_debug_process_messages(thr, 0 /*no_block*/);\n\t\tDUK_ASSERT(thr->heap->dbg_processing == 0);\n\t}\n\n\t/* Continue checked execution if there are breakpoints or we're stepping.\n\t * Also use checked execution if paused flag is active - it shouldn't be\n\t * because the debug message loop shouldn't terminate if it was.  Step out\n\t * is handled by callstack unwind and doesn't need checked execution.\n\t * Note that debugger may have detached due to error or explicit request\n\t * above, so we must recheck attach status.\n\t */\n\n\tif (duk_debug_is_attached(thr->heap)) {\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tDUK_ASSERT(act != NULL);\n\t\tif (act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE ||\n\t\t    (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) ||\n\t\t    ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) &&\n\t\t     thr->heap->dbg_pause_act == thr->callstack_curr) ||\n\t\t     DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap)) {\n\t\t\t*out_immediate = 1;\n\t\t}\n\n\t\t/* If we processed any debug messages breakpoints may have\n\t\t * changed; restart execution to re-check active breakpoints.\n\t\t */\n\t\tif (processed_messages) {\n\t\t\tDUK_D(DUK_DPRINT(\"processed debug messages, restart execution to recheck possibly changed breakpoints\"));\n\t\t\t*out_interrupt_retval = DUK__INT_RESTART;\n\t\t} else {\n\t\t\tif (thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_ONE_OPCODE) {\n\t\t\t\t/* Set 'pause after one opcode' active only when we're\n\t\t\t\t * actually just about to execute code.\n\t\t\t\t */\n\t\t\t\tthr->heap->dbg_pause_flags |= DUK_PAUSE_FLAG_ONE_OPCODE_ACTIVE;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tDUK_D(DUK_DPRINT(\"debugger became detached, resume normal execution\"));\n\t}\n}\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\nDUK_LOCAL DUK__NOINLINE_PERF DUK_COLD duk_small_uint_t duk__executor_interrupt(duk_hthread *thr) {\n\tduk_int_t ctr;\n\tduk_activation *act;\n\tduk_hcompfunc *fun;\n\tduk_bool_t immediate = 0;\n\tduk_small_uint_t retval;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->heap != NULL);\n\tDUK_ASSERT(thr->callstack_top > 0);\n\n#if defined(DUK_USE_DEBUG)\n\tthr->heap->inst_count_interrupt += thr->interrupt_init;\n\tDUK_DD(DUK_DDPRINT(\"execution interrupt, counter=%ld, init=%ld, \"\n\t                   \"instruction counts: executor=%ld, interrupt=%ld\",\n\t                   (long) thr->interrupt_counter, (long) thr->interrupt_init,\n\t                   (long) thr->heap->inst_count_exec, (long) thr->heap->inst_count_interrupt));\n#endif\n\n\tretval = DUK__INT_NOACTION;\n\tctr = DUK_HTHREAD_INTCTR_DEFAULT;\n\n\t/*\n\t *  Avoid nested calls.  Concretely this happens during debugging, e.g.\n\t *  when we eval() an expression.\n\t *\n\t *  Also don't interrupt if we're currently doing debug processing\n\t *  (which can be initiated outside the bytecode executor) as this\n\t *  may cause the debugger to be called recursively.  Check required\n\t *  for correct operation of throw intercept and other \"exotic\" halting\n\t * scenarios.\n\t */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tif (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap) || thr->heap->dbg_processing) {\n#else\n\tif (DUK_HEAP_HAS_INTERRUPT_RUNNING(thr->heap)) {\n#endif\n\t\tDUK_DD(DUK_DDPRINT(\"nested executor interrupt, ignoring\"));\n\n\t\t/* Set a high interrupt counter; the original executor\n\t\t * interrupt invocation will rewrite before exiting.\n\t\t */\n\t\tthr->interrupt_init = ctr;\n\t\tthr->interrupt_counter = ctr - 1;\n\t\treturn DUK__INT_NOACTION;\n\t}\n\tDUK_HEAP_SET_INTERRUPT_RUNNING(thr->heap);\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\n\tfun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);\n\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC((duk_hobject *) fun));\n\n\tDUK_UNREF(fun);\n\n#if defined(DUK_USE_EXEC_TIMEOUT_CHECK)\n\t/*\n\t *  Execution timeout check\n\t */\n\n\tif (DUK_USE_EXEC_TIMEOUT_CHECK(thr->heap->heap_udata)) {\n\t\t/* Keep throwing an error whenever we get here.  The unusual values\n\t\t * are set this way because no instruction is ever executed, we just\n\t\t * throw an error until all try/catch/finally and other catchpoints\n\t\t * have been exhausted.  Duktape/C code gets control at each protected\n\t\t * call but whenever it enters back into Duktape the RangeError gets\n\t\t * raised.  User exec timeout check must consistently indicate a timeout\n\t\t * until we've fully bubbled out of Duktape.\n\t\t */\n\t\tDUK_D(DUK_DPRINT(\"execution timeout, throwing a RangeError\"));\n\t\tthr->interrupt_init = 0;\n\t\tthr->interrupt_counter = 0;\n\t\tDUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap);\n\t\tDUK_ERROR_RANGE(thr, \"execution timeout\");\n\t}\n#endif  /* DUK_USE_EXEC_TIMEOUT_CHECK */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tif (!thr->heap->dbg_processing &&\n\t    (thr->heap->dbg_read_cb != NULL || thr->heap->dbg_detaching)) {\n\t\t/* Avoid recursive re-entry; enter when we're attached or\n\t\t * detaching (to finish off the pending detach).\n\t\t */\n\t\tduk__interrupt_handle_debugger(thr, &immediate, &retval);\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t}\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n\t/*\n\t *  Update the interrupt counter\n\t */\n\n\tif (immediate) {\n\t\t/* Cause an interrupt after executing one instruction. */\n\t\tctr = 1;\n\t}\n\n\t/* The counter value is one less than the init value: init value should\n\t * indicate how many instructions are executed before interrupt.  To\n\t * execute 1 instruction (after interrupt handler return), counter must\n\t * be 0.\n\t */\n\tDUK_ASSERT(ctr >= 1);\n\tthr->interrupt_init = ctr;\n\tthr->interrupt_counter = ctr - 1;\n\tDUK_HEAP_CLEAR_INTERRUPT_RUNNING(thr->heap);\n\n\treturn retval;\n}\n#endif  /* DUK_USE_INTERRUPT_COUNTER */\n\n/*\n *  Debugger handling for executor restart\n *\n *  Check for breakpoints, stepping, etc, and figure out if we should execute\n *  in checked or normal mode.  Note that we can't do this when an activation\n *  is created, because breakpoint status (and stepping status) may change\n *  later, so we must recheck every time we're executing an activation.\n *  This primitive should be side effect free to avoid changes during check.\n */\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\nDUK_LOCAL void duk__executor_recheck_debugger(duk_hthread *thr, duk_activation *act, duk_hcompfunc *fun) {\n\tduk_heap *heap;\n\tduk_tval *tv_tmp;\n\tduk_hstring *filename;\n\tduk_small_uint_t bp_idx;\n\tduk_breakpoint **bp_active;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(fun != NULL);\n\n\theap = thr->heap;\n\tbp_active = heap->dbg_breakpoints_active;\n\tact->flags &= ~DUK_ACT_FLAG_BREAKPOINT_ACTIVE;\n\n\ttv_tmp = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) fun, DUK_HTHREAD_STRING_FILE_NAME(thr));\n\tif (tv_tmp && DUK_TVAL_IS_STRING(tv_tmp)) {\n\t\tfilename = DUK_TVAL_GET_STRING(tv_tmp);\n\n\t\t/* Figure out all active breakpoints.  A breakpoint is\n\t\t * considered active if the current function's fileName\n\t\t * matches the breakpoint's fileName, AND there is no\n\t\t * inner function that has matching line numbers\n\t\t * (otherwise a breakpoint would be triggered both\n\t\t * inside and outside of the inner function which would\n\t\t * be confusing).  Example:\n\t\t *\n\t\t *     function foo() {\n\t\t *         print('foo');\n\t\t *         function bar() {    <-.  breakpoints in these\n\t\t *             print('bar');     |  lines should not affect\n\t\t *         }                   <-'  foo() execution\n\t\t *         bar();\n\t\t *     }\n\t\t *\n\t\t * We need a few things that are only available when\n\t\t * debugger support is enabled: (1) a line range for\n\t\t * each function, and (2) access to the function\n\t\t * template to access the inner functions (and their\n\t\t * line ranges).\n\t\t *\n\t\t * It's important to have a narrow match for active\n\t\t * breakpoints so that we don't enter checked execution\n\t\t * when that's not necessary.  For instance, if we're\n\t\t * running inside a certain function and there's\n\t\t * breakpoint outside in (after the call site), we\n\t\t * don't want to slow down execution of the function.\n\t\t */\n\n\t\tfor (bp_idx = 0; bp_idx < heap->dbg_breakpoint_count; bp_idx++) {\n\t\t\tduk_breakpoint *bp = heap->dbg_breakpoints + bp_idx;\n\t\t\tduk_hobject **funcs, **funcs_end;\n\t\t\tduk_hcompfunc *inner_fun;\n\t\t\tduk_bool_t bp_match;\n\n\t\t\tif (bp->filename == filename &&\n\t\t\t    bp->line >= fun->start_line && bp->line <= fun->end_line) {\n\t\t\t\tbp_match = 1;\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"breakpoint filename and line match: \"\n\t\t\t\t                   \"%s:%ld vs. %s (line %ld vs. %ld-%ld)\",\n\t\t\t\t                   DUK_HSTRING_GET_DATA(bp->filename),\n\t\t\t\t                   (long) bp->line,\n\t\t\t\t                   DUK_HSTRING_GET_DATA(filename),\n\t\t\t\t                   (long) bp->line,\n\t\t\t\t                   (long) fun->start_line,\n\t\t\t\t                   (long) fun->end_line));\n\n\t\t\t\tfuncs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun);\n\t\t\t\tfuncs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, fun);\n\t\t\t\twhile (funcs != funcs_end) {\n\t\t\t\t\tinner_fun = (duk_hcompfunc *) *funcs;\n\t\t\t\t\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) inner_fun));\n\t\t\t\t\tif (bp->line >= inner_fun->start_line && bp->line <= inner_fun->end_line) {\n\t\t\t\t\t\tDUK_DD(DUK_DDPRINT(\"inner function masks ('captures') breakpoint\"));\n\t\t\t\t\t\tbp_match = 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tfuncs++;\n\t\t\t\t}\n\n\t\t\t\tif (bp_match) {\n\t\t\t\t\t/* No need to check for size of bp_active list,\n\t\t\t\t\t * it's always larger than maximum number of\n\t\t\t\t\t * breakpoints.\n\t\t\t\t\t */\n\t\t\t\t\tact->flags |= DUK_ACT_FLAG_BREAKPOINT_ACTIVE;\n\t\t\t\t\t*bp_active = heap->dbg_breakpoints + bp_idx;\n\t\t\t\t\tbp_active++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t*bp_active = NULL;  /* terminate */\n\n\tDUK_DD(DUK_DDPRINT(\"ACTIVE BREAKPOINTS: %ld\", (long) (bp_active - thr->heap->dbg_breakpoints_active)));\n\n\t/* Force pause if we were doing \"step into\" in another activation. */\n\tif ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_FUNC_ENTRY) &&\n\t    thr->heap->dbg_pause_act != thr->callstack_curr) {\n\t\tDUK_D(DUK_DPRINT(\"PAUSE TRIGGERED by function entry\"));\n\t\tduk_debug_set_paused(thr->heap);\n\t}\n\n\t/* Force interrupt right away if we're paused or in \"checked mode\".\n\t * Step out is handled by callstack unwind.\n\t */\n\tif ((act->flags & DUK_ACT_FLAG_BREAKPOINT_ACTIVE) ||\n\t    DUK_HEAP_HAS_DEBUGGER_PAUSED(thr->heap) ||\n\t    ((thr->heap->dbg_pause_flags & DUK_PAUSE_FLAG_LINE_CHANGE) &&\n\t     thr->heap->dbg_pause_act == thr->callstack_curr)) {\n\t\t/* We'll need to interrupt early so recompute the init\n\t\t * counter to reflect the number of bytecode instructions\n\t\t * executed so that step counts for e.g. debugger rate\n\t\t * limiting are accurate.\n\t\t */\n\t\tDUK_ASSERT(thr->interrupt_counter <= thr->interrupt_init);\n\t\tthr->interrupt_init = thr->interrupt_init - thr->interrupt_counter;\n\t\tthr->interrupt_counter = 0;\n\t}\n}\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n/*\n *  Opcode handlers for opcodes with a lot of code and which are relatively\n *  rare; NOINLINE to reduce amount of code in main bytecode dispatcher.\n */\n\nDUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initset_initget(duk_hthread *thr, duk_uint_fast32_t ins) {\n\tduk_bool_t is_set = (DUK_DEC_OP(ins) == DUK_OP_INITSET);\n\tduk_uint_fast_t idx;\n\tduk_uint_t defprop_flags;\n\n\t/* A -> object register (acts as a source)\n\t * BC -> BC+0 contains key, BC+1 closure (value)\n\t */\n\n\t/* INITSET/INITGET are only used to initialize object literal keys.\n\t * There may be a previous propery in ES2015 because duplicate property\n\t * names are allowed.\n\t */\n\n\t/* This could be made more optimal by accessing internals directly. */\n\n\tidx = (duk_uint_fast_t) DUK_DEC_BC(ins);\n\tduk_dup(thr, (duk_idx_t) (idx + 0));  /* key */\n\tduk_dup(thr, (duk_idx_t) (idx + 1));  /* getter/setter */\n\tif (is_set) {\n\t        defprop_flags = DUK_DEFPROP_HAVE_SETTER |\n\t                        DUK_DEFPROP_FORCE |\n\t                        DUK_DEFPROP_SET_ENUMERABLE |\n\t                        DUK_DEFPROP_SET_CONFIGURABLE;\n\t} else {\n\t        defprop_flags = DUK_DEFPROP_HAVE_GETTER |\n\t                        DUK_DEFPROP_FORCE |\n\t                        DUK_DEFPROP_SET_ENUMERABLE |\n\t                        DUK_DEFPROP_SET_CONFIGURABLE;\n\t}\n\tduk_def_prop(thr, (duk_idx_t) DUK_DEC_A(ins), defprop_flags);\n}\n\nDUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_trycatch(duk_hthread *thr, duk_uint_fast32_t ins, duk_instr_t *curr_pc) {\n\tduk_activation *act;\n\tduk_catcher *cat;\n\tduk_tval *tv1;\n\tduk_small_uint_fast_t a;\n\tduk_small_uint_fast_t bc;\n\n\t/* A -> flags\n\t * BC -> reg_catch; base register for two registers used both during\n\t *       trycatch setup and when catch is triggered\n\t *\n\t *      If DUK_BC_TRYCATCH_FLAG_CATCH_BINDING set:\n\t *          reg_catch + 0: catch binding variable name (string).\n\t *          Automatic declarative environment is established for\n\t *          the duration of the 'catch' clause.\n\t *\n\t *      If DUK_BC_TRYCATCH_FLAG_WITH_BINDING set:\n\t *          reg_catch + 0: with 'target value', which is coerced to\n\t *          an object and then used as a bindind object for an\n\t *          environment record.  The binding is initialized here, for\n\t *          the 'try' clause.\n\t *\n\t * Note that a TRYCATCH generated for a 'with' statement has no\n\t * catch or finally parts.\n\t */\n\n\t/* XXX: TRYCATCH handling should be reworked to avoid creating\n\t * an explicit scope unless it is actually needed (e.g. function\n\t * instances or eval is executed inside the catch block).  This\n\t * rework is not trivial because the compiler doesn't have an\n\t * intermediate representation.  When the rework is done, the\n\t * opcode format can also be made more straightforward.\n\t */\n\n\t/* XXX: side effect handling is quite awkward here */\n\n\tDUK_DDD(DUK_DDDPRINT(\"TRYCATCH: reg_catch=%ld, have_catch=%ld, \"\n\t                     \"have_finally=%ld, catch_binding=%ld, with_binding=%ld (flags=0x%02lx)\",\n\t                     (long) DUK_DEC_BC(ins),\n\t                     (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH ? 1 : 0),\n\t                     (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY ? 1 : 0),\n\t                     (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING ? 1 : 0),\n\t                     (long) (DUK_DEC_A(ins) & DUK_BC_TRYCATCH_FLAG_WITH_BINDING ? 1 : 0),\n\t                     (unsigned long) DUK_DEC_A(ins)));\n\n\ta = DUK_DEC_A(ins);\n\tbc = DUK_DEC_BC(ins);\n\n\t/* Registers 'bc' and 'bc + 1' are written in longjmp handling\n\t * and if their previous values (which are temporaries) become\n\t * unreachable -and- have a finalizer, there'll be a function\n\t * call during error handling which is not supported now (GH-287).\n\t * Ensure that both 'bc' and 'bc + 1' have primitive values to\n\t * guarantee no finalizer calls in error handling.  Scrubbing also\n\t * ensures finalizers for the previous values run here rather than\n\t * later.  Error handling related values are also written to 'bc'\n\t * and 'bc + 1' but those values never become unreachable during\n\t * error handling, so there's no side effect problem even if the\n\t * error value has a finalizer.\n\t */\n\tduk_dup(thr, (duk_idx_t) bc);  /* Stabilize value. */\n\tduk_to_undefined(thr, (duk_idx_t) bc);\n\tduk_to_undefined(thr, (duk_idx_t) (bc + 1));\n\n\t/* Allocate catcher and populate it.  Doesn't have to\n\t * be fully atomic, but the catcher must be in a\n\t * consistent state if side effects (such as finalizer\n\t * calls) occur.\n\t */\n\n\tcat = duk_hthread_catcher_alloc(thr);\n\tDUK_ASSERT(cat != NULL);\n\n\tcat->flags = DUK_CAT_TYPE_TCF;\n\tcat->h_varname = NULL;\n\tcat->pc_base = (duk_instr_t *) curr_pc;  /* pre-incremented, points to first jump slot */\n\tcat->idx_base = (duk_size_t) (thr->valstack_bottom - thr->valstack) + bc;\n\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\tcat->parent = act->cat;\n\tact->cat = cat;\n\n\tif (a & DUK_BC_TRYCATCH_FLAG_HAVE_CATCH) {\n\t\tcat->flags |= DUK_CAT_FLAG_CATCH_ENABLED;\n\t}\n\tif (a & DUK_BC_TRYCATCH_FLAG_HAVE_FINALLY) {\n\t\tcat->flags |= DUK_CAT_FLAG_FINALLY_ENABLED;\n\t}\n\tif (a & DUK_BC_TRYCATCH_FLAG_CATCH_BINDING) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"catch binding flag set to catcher\"));\n\t\tcat->flags |= DUK_CAT_FLAG_CATCH_BINDING_ENABLED;\n\t\ttv1 = DUK_GET_TVAL_NEGIDX(thr, -1);\n\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv1));\n\n\t\t/* borrowed reference; although 'tv1' comes from a register,\n\t\t * its value was loaded using LDCONST so the constant will\n\t\t * also exist and be reachable.\n\t\t */\n\t\tcat->h_varname = DUK_TVAL_GET_STRING(tv1);\n\t} else if (a & DUK_BC_TRYCATCH_FLAG_WITH_BINDING) {\n\t\tduk_hobjenv *env;\n\t\tduk_hobject *target;\n\n\t\t/* Delayed env initialization for activation (if needed). */\n\t\tDUK_ASSERT(thr->callstack_top >= 1);\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tDUK_ASSERT(act != NULL);\n\t\tif (act->lex_env == NULL) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"delayed environment initialization\"));\n\t\t\tDUK_ASSERT(act->var_env == NULL);\n\n\t\t\tduk_js_init_activation_environment_records_delayed(thr, act);\n\t\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\t\tDUK_UNREF(act);  /* 'act' is no longer accessed, scanbuild fix */\n\t\t}\n\t\tDUK_ASSERT(act->lex_env != NULL);\n\t\tDUK_ASSERT(act->var_env != NULL);\n\n\t\t/* Coerce 'with' target. */\n\t\ttarget = duk_to_hobject(thr, -1);\n\t\tDUK_ASSERT(target != NULL);\n\n\t\t/* Create an object environment; it is not pushed\n\t\t * so avoid side effects very carefully until it is\n\t\t * referenced.\n\t\t */\n\t\tenv = duk_hobjenv_alloc(thr,\n\t\t                        DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t                        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV));\n\t\tDUK_ASSERT(env != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL);\n\t\tenv->target = target;  /* always provideThis=true */\n\t\tDUK_HOBJECT_INCREF(thr, target);\n\t\tenv->has_this = 1;\n\t\tDUK_ASSERT_HOBJENV_VALID(env);\n\t\tDUK_DDD(DUK_DDDPRINT(\"environment for with binding: %!iO\", env));\n\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL);\n\t\tDUK_ASSERT(act->lex_env != NULL);\n\t\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, act->lex_env);\n\t\tact->lex_env = (duk_hobject *) env;  /* Now reachable. */\n\t\tDUK_HOBJECT_INCREF(thr, (duk_hobject *) env);\n\t\t/* Net refcount change to act->lex_env is 0: incref for env's\n\t\t * prototype, decref for act->lex_env overwrite.\n\t\t */\n\n\t\t/* Set catcher lex_env active (affects unwind)\n\t\t * only when the whole setup is complete.\n\t\t */\n\t\tcat = act->cat;  /* XXX: better to relookup? not mandatory because 'cat' is stable */\n\t\tcat->flags |= DUK_CAT_FLAG_LEXENV_ACTIVE;\n\t} else {\n\t\t;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"TRYCATCH catcher: flags=0x%08lx, pc_base=%ld, \"\n\t                     \"idx_base=%ld, h_varname=%!O\",\n\t                     (unsigned long) cat->flags,\n\t                     (long) cat->pc_base, (long) cat->idx_base, (duk_heaphdr *) cat->h_varname));\n\n\tduk_pop_unsafe(thr);\n}\n\nDUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endtry(duk_hthread *thr, duk_uint_fast32_t ins) {\n\tduk_activation *act;\n\tduk_catcher *cat;\n\tduk_tval *tv1;\n\tduk_instr_t *pc_base;\n\n\tDUK_UNREF(ins);\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\tDUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_TCF);\n\n\tDUK_DDD(DUK_DDDPRINT(\"ENDTRY: clearing catch active flag (regardless of whether it was set or not)\"));\n\tDUK_CAT_CLEAR_CATCH_ENABLED(cat);\n\n\tpc_base = cat->pc_base;\n\n\tif (DUK_CAT_HAS_FINALLY_ENABLED(cat)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDTRY: finally part is active, jump through 2nd jump slot with 'normal continuation'\"));\n\n\t\ttv1 = thr->valstack + cat->idx_base;\n\t\tDUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);\n\t\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1);  /* side effects */\n\t\ttv1 = NULL;\n\n\t\ttv1 = thr->valstack + cat->idx_base + 1;\n\t\tDUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);\n\t\tDUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL);  /* side effects */\n\t\ttv1 = NULL;\n\n\t\tDUK_CAT_CLEAR_FINALLY_ENABLED(cat);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDTRY: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)\"));\n\n\t\tduk_hthread_catcher_unwind_norz(thr, act);  /* lexenv may be set for 'with' binding */\n\t\t/* no need to unwind callstack */\n\t}\n\n\treturn pc_base + 1;  /* new curr_pc value */\n}\n\nDUK_LOCAL DUK__NOINLINE_PERF duk_instr_t *duk__handle_op_endcatch(duk_hthread *thr, duk_uint_fast32_t ins) {\n\tduk_activation *act;\n\tduk_catcher *cat;\n\tduk_tval *tv1;\n\tduk_instr_t *pc_base;\n\n\tDUK_UNREF(ins);\n\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\tcat = act->cat;\n\tDUK_ASSERT(cat != NULL);\n\tDUK_ASSERT(!DUK_CAT_HAS_CATCH_ENABLED(cat));  /* cleared before entering catch part */\n\n\tif (DUK_CAT_HAS_LEXENV_ACTIVE(cat)) {\n\t\tduk_hobject *prev_env;\n\n\t\t/* 'with' binding has no catch clause, so can't be here unless a normal try-catch */\n\t\tDUK_ASSERT(DUK_CAT_HAS_CATCH_BINDING_ENABLED(cat));\n\t\tDUK_ASSERT(act->lex_env != NULL);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDCATCH: popping catcher part lexical environment\"));\n\n\t\tprev_env = act->lex_env;\n\t\tDUK_ASSERT(prev_env != NULL);\n\t\tact->lex_env = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, prev_env);\n\t\tDUK_CAT_CLEAR_LEXENV_ACTIVE(cat);\n\t\tDUK_HOBJECT_INCREF(thr, act->lex_env);\n\t\tDUK_HOBJECT_DECREF(thr, prev_env);  /* side effects */\n\n\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\tDUK_ASSERT(act != NULL);\n\t}\n\n\tpc_base = cat->pc_base;\n\n\tif (DUK_CAT_HAS_FINALLY_ENABLED(cat)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDCATCH: finally part is active, jump through 2nd jump slot with 'normal continuation'\"));\n\n\t\ttv1 = thr->valstack + cat->idx_base;\n\t\tDUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);\n\t\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1);  /* side effects */\n\t\ttv1 = NULL;\n\n\t\ttv1 = thr->valstack + cat->idx_base + 1;\n\t\tDUK_ASSERT(tv1 >= thr->valstack && tv1 < thr->valstack_top);\n\t\tDUK_TVAL_SET_U32_UPDREF(thr, tv1, (duk_uint32_t) DUK_LJ_TYPE_NORMAL);  /* side effects */\n\t\ttv1 = NULL;\n\n\t\tDUK_CAT_CLEAR_FINALLY_ENABLED(cat);\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDCATCH: no finally part, dismantle catcher, jump through 2nd jump slot (to end of statement)\"));\n\n\t\tduk_hthread_catcher_unwind_norz(thr, act);\n\t\t/* no need to unwind callstack */\n\t}\n\n\treturn pc_base + 1;  /* new curr_pc value */\n}\n\nDUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_endfin(duk_hthread *thr, duk_uint_fast32_t ins, duk_activation *entry_act) {\n\tduk_activation *act;\n\tduk_tval *tv1;\n\tduk_uint_t reg_catch;\n\tduk_small_uint_t cont_type;\n\tduk_small_uint_t ret_result;\n\n\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tact = thr->callstack_curr;\n\tDUK_ASSERT(act != NULL);\n\treg_catch = DUK_DEC_ABC(ins);\n\n\t/* CATCH flag may be enabled or disabled here; it may be enabled if\n\t * the statement has a catch block but the try block does not throw\n\t * an error.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"ENDFIN: completion value=%!T, type=%!T\",\n\t                     (duk_tval *) (thr->valstack_bottom + reg_catch + 0),\n\t                     (duk_tval *) (thr->valstack_bottom + reg_catch + 1)));\n\n\ttv1 = thr->valstack_bottom + reg_catch + 1;  /* type */\n\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));\n#if defined(DUK_USE_FASTINT)\n\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));\n\tcont_type = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1);\n#else\n\tcont_type = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1);\n#endif\n\n\ttv1--;  /* value */\n\n\tswitch (cont_type) {\n\tcase DUK_LJ_TYPE_NORMAL: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDFIN: finally part finishing with 'normal' (non-abrupt) completion -> \"\n\t\t                     \"dismantle catcher, resume execution after ENDFIN\"));\n\n\t\tduk_hthread_catcher_unwind_norz(thr, act);\n\t\t/* no need to unwind callstack */\n\t\treturn 0;  /* restart execution */\n\t}\n\tcase DUK_LJ_TYPE_RETURN: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDFIN: finally part finishing with 'return' complation -> dismantle \"\n\t\t                     \"catcher, handle return, lj.value1=%!T\", tv1));\n\n\t\t/* Not necessary to unwind catch stack: return handling will\n\t\t * do it.  The finally flag of 'cat' is no longer set.  The\n\t\t * catch flag may be set, but it's not checked by return handling.\n\t\t */\n\n\t\tduk_push_tval(thr, tv1);\n\t\tret_result = duk__handle_return(thr, entry_act);\n\t\tif (ret_result == DUK__RETHAND_RESTART) {\n\t\t\treturn 0;  /* restart execution */\n\t\t}\n\t\tDUK_ASSERT(ret_result == DUK__RETHAND_FINISHED);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"exiting executor after ENDFIN and RETURN (pseudo) longjmp type\"));\n\t\treturn 1;  /* exit executor */\n\t}\n\tcase DUK_LJ_TYPE_BREAK:\n\tcase DUK_LJ_TYPE_CONTINUE: {\n\t\tduk_uint_t label_id;\n\t\tduk_small_uint_t lj_type;\n\n\t\t/* Not necessary to unwind catch stack: break/continue\n\t\t * handling will do it.  The finally flag of 'cat' is\n\t\t * no longer set.  The catch flag may be set, but it's\n\t\t * not checked by break/continue handling.\n\t\t */\n\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));\n#if defined(DUK_USE_FASTINT)\n\t\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));\n\t\tlabel_id = (duk_small_uint_t) DUK_TVAL_GET_FASTINT_U32(tv1);\n#else\n\t\tlabel_id = (duk_small_uint_t) DUK_TVAL_GET_NUMBER(tv1);\n#endif\n\t\tlj_type = cont_type;\n\t\tduk__handle_break_or_continue(thr, label_id, lj_type);\n\t\treturn 0;  /* restart execution */\n\t}\n\tdefault: {\n\t\tDUK_DDD(DUK_DDDPRINT(\"ENDFIN: finally part finishing with abrupt completion, lj_type=%ld -> \"\n\t\t                     \"dismantle catcher, re-throw error\",\n\t\t                     (long) cont_type));\n\n\t\tduk_err_setup_ljstate1(thr, (duk_small_uint_t) cont_type, tv1);\n\t\t/* No debugger Throw notify check on purpose (rethrow). */\n\n\t\tDUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL);  /* always in executor */\n\t\tduk_err_longjmp(thr);\n\t\tDUK_UNREACHABLE();\n\t}\n\t}\n\n\tDUK_UNREACHABLE();\n\treturn 0;\n}\n\nDUK_LOCAL DUK__NOINLINE_PERF void duk__handle_op_initenum(duk_hthread *thr, duk_uint_fast32_t ins) {\n\tduk_small_uint_t b;\n\tduk_small_uint_t c;\n\n\t/*\n\t *  Enumeration semantics come from for-in statement, E5 Section 12.6.4.\n\t *  If called with 'null' or 'undefined', this opcode returns 'null' as\n\t *  the enumerator, which is special cased in NEXTENUM.  This simplifies\n\t *  the compiler part\n\t */\n\n\t/* B -> register for writing enumerator object\n\t * C -> value to be enumerated (register)\n\t */\n\tb = DUK_DEC_B(ins);\n\tc = DUK_DEC_C(ins);\n\n\tif (duk_is_null_or_undefined(thr, (duk_idx_t) c)) {\n\t\tduk_push_null(thr);\n\t\tduk_replace(thr, (duk_idx_t) b);\n\t} else {\n\t\tduk_dup(thr, (duk_idx_t) c);\n\t\tduk_to_object(thr, -1);\n\t\tduk_hobject_enumerator_create(thr, 0 /*enum_flags*/);  /* [ ... val ] --> [ ... enum ] */\n\t\tduk_replace(thr, (duk_idx_t) b);\n\t}\n}\n\nDUK_LOCAL DUK__NOINLINE_PERF duk_small_uint_t duk__handle_op_nextenum(duk_hthread *thr, duk_uint_fast32_t ins) {\n\tduk_small_uint_t b;\n\tduk_small_uint_t c;\n\tduk_small_uint_t pc_skip = 0;\n\n\t/*\n\t *  NEXTENUM checks whether the enumerator still has unenumerated\n\t *  keys.  If so, the next key is loaded to the target register\n\t *  and the next instruction is skipped.  Otherwise the next instruction\n\t *  will be executed, jumping out of the enumeration loop.\n\t */\n\n\t/* B -> target register for next key\n\t * C -> enum register\n\t */\n\tb = DUK_DEC_B(ins);\n\tc = DUK_DEC_C(ins);\n\n\tDUK_DDD(DUK_DDDPRINT(\"NEXTENUM: b->%!T, c->%!T\",\n\t                     (duk_tval *) duk_get_tval(thr, (duk_idx_t) b),\n\t                     (duk_tval *) duk_get_tval(thr, (duk_idx_t) c)));\n\n\tif (duk_is_object(thr, (duk_idx_t) c)) {\n\t\t/* XXX: assert 'c' is an enumerator */\n\t\tduk_dup(thr, (duk_idx_t) c);\n\t\tif (duk_hobject_enumerator_next(thr, 0 /*get_value*/)) {\n\t\t\t/* [ ... enum ] -> [ ... next_key ] */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"enum active, next key is %!T, skip jump slot \",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\t\tpc_skip = 1;\n\t\t} else {\n\t\t\t/* [ ... enum ] -> [ ... ] */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"enum finished, execute jump slot\"));\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));  /* valstack policy */\n\t\t\tthr->valstack_top++;\n\t\t}\n\t\tduk_replace(thr, (duk_idx_t) b);\n\t} else {\n\t\t/* 'null' enumerator case -> behave as with an empty enumerator */\n\t\tDUK_ASSERT(duk_is_null(thr, (duk_idx_t) c));\n\t\tDUK_DDD(DUK_DDDPRINT(\"enum is null, execute jump slot\"));\n\t}\n\n\treturn pc_skip;\n}\n\n/*\n *  Call handling helpers.\n */\n\nDUK_LOCAL duk_bool_t duk__executor_handle_call(duk_hthread *thr, duk_idx_t idx, duk_idx_t nargs, duk_small_uint_t call_flags) {\n\tduk_bool_t rc;\n\n\tduk_set_top_unsafe(thr, (duk_idx_t) (idx + nargs + 2));   /* [ ... func this arg1 ... argN ] */\n\n\t/* Attempt an Ecma-to-Ecma call setup.  If the call\n\t * target is (directly or indirectly) Reflect.construct(),\n\t * the call may change into a constructor call on the fly.\n\t */\n\trc = (duk_bool_t) duk_handle_call_unprotected(thr, idx, call_flags);\n\tif (rc != 0) {\n\t\t/* Ecma-to-ecma call possible, may or may not\n\t\t * be a tail call.  Avoid C recursion by\n\t\t * reusing current executor instance.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"ecma-to-ecma call setup possible, restart execution\"));\n\t\t/* curr_pc synced by duk_handle_call_unprotected() */\n\t\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\t\treturn rc;\n\t} else {\n\t\t/* Call was handled inline. */\n\t}\n\tDUK_ASSERT(thr->ptr_curr_pc != NULL);\n\treturn rc;\n}\n\n/*\n *  Ecmascript bytecode executor.\n *\n *  Resume execution for the current thread from its current activation.\n *  Returns when execution would return from the entry level activation,\n *  leaving a single return value on top of the stack.  Function calls\n *  and thread resumptions are handled internally.  If an error occurs,\n *  a longjmp() with type DUK_LJ_TYPE_THROW is called on the entry level\n *  setjmp() jmpbuf.\n *\n *  Ecmascript function calls and coroutine resumptions are handled\n *  internally (by the outer executor function) without recursive C calls.\n *  Other function calls are handled using duk_handle_call(), increasing\n *  C recursion depth.\n *\n *  Abrupt completions (= long control tranfers) are handled either\n *  directly by reconfiguring relevant stacks and restarting execution,\n *  or via a longjmp.  Longjmp-free handling is preferable for performance\n *  (especially Emscripten performance), and is used for: break, continue,\n *  and return.\n *\n *  For more detailed notes, see doc/execution.rst.\n *\n *  Also see doc/code-issues.rst for discussion of setjmp(), longjmp(),\n *  and volatile.\n */\n\n/* Presence of 'fun' is config based, there's a marginal performance\n * difference and the best option is architecture dependent.\n */\n#if defined(DUK_USE_EXEC_FUN_LOCAL)\n#define DUK__FUN()          fun\n#else\n#define DUK__FUN()          ((duk_hcompfunc *) DUK_ACT_GET_FUNC((thr)->callstack_curr))\n#endif\n\n/* Strict flag. */\n#define DUK__STRICT()       ((duk_small_uint_t) DUK_HOBJECT_HAS_STRICT((duk_hobject *) DUK__FUN()))\n\n/* Reg/const access macros: these are very footprint and performance sensitive\n * so modify with care.  Arguments are sometimes evaluated multiple times which\n * is not ideal.\n */\n#define DUK__REG(x)         (*(thr->valstack_bottom + (x)))\n#define DUK__REGP(x)        (thr->valstack_bottom + (x))\n#define DUK__CONST(x)       (*(consts + (x)))\n#define DUK__CONSTP(x)      (consts + (x))\n\n/* Reg/const access macros which take the 32-bit instruction and avoid an\n * explicit field decoding step by using shifts and masks.  These must be\n * kept in sync with duk_js_bytecode.h.  The shift/mask values are chosen\n * so that 'ins' can be shifted and masked and used as a -byte- offset\n * instead of a duk_tval offset which needs further shifting (which is an\n * issue on some, but not all, CPUs).\n */\n#define DUK__RCBIT_B           DUK_BC_REGCONST_B\n#define DUK__RCBIT_C           DUK_BC_REGCONST_C\n#if defined(DUK_USE_EXEC_REGCONST_OPTIMIZE)\n#if defined(DUK_USE_PACKED_TVAL)\n#define DUK__TVAL_SHIFT        3  /* sizeof(duk_tval) == 8 */\n#else\n#define DUK__TVAL_SHIFT        4  /* sizeof(duk_tval) == 16; not always the case so also asserted for */\n#endif\n#define DUK__SHIFT_A           (DUK_BC_SHIFT_A - DUK__TVAL_SHIFT)\n#define DUK__SHIFT_B           (DUK_BC_SHIFT_B - DUK__TVAL_SHIFT)\n#define DUK__SHIFT_C           (DUK_BC_SHIFT_C - DUK__TVAL_SHIFT)\n#define DUK__SHIFT_BC          (DUK_BC_SHIFT_BC - DUK__TVAL_SHIFT)\n#define DUK__MASK_A            (DUK_BC_UNSHIFTED_MASK_A << DUK__TVAL_SHIFT)\n#define DUK__MASK_B            (DUK_BC_UNSHIFTED_MASK_B << DUK__TVAL_SHIFT)\n#define DUK__MASK_C            (DUK_BC_UNSHIFTED_MASK_C << DUK__TVAL_SHIFT)\n#define DUK__MASK_BC           (DUK_BC_UNSHIFTED_MASK_BC << DUK__TVAL_SHIFT)\n#define DUK__BYTEOFF_A(ins)    (((ins) >> DUK__SHIFT_A) & DUK__MASK_A)\n#define DUK__BYTEOFF_B(ins)    (((ins) >> DUK__SHIFT_B) & DUK__MASK_B)\n#define DUK__BYTEOFF_C(ins)    (((ins) >> DUK__SHIFT_C) & DUK__MASK_C)\n#define DUK__BYTEOFF_BC(ins)   (((ins) >> DUK__SHIFT_BC) & DUK__MASK_BC)\n\n#define DUK__REGP_A(ins)       ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_A((ins))))\n#define DUK__REGP_B(ins)       ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_B((ins))))\n#define DUK__REGP_C(ins)       ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_C((ins))))\n#define DUK__REGP_BC(ins)      ((duk_tval *) (void *) ((duk_uint8_t *) thr->valstack_bottom + DUK__BYTEOFF_BC((ins))))\n#define DUK__CONSTP_A(ins)     ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_A((ins))))\n#define DUK__CONSTP_B(ins)     ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_B((ins))))\n#define DUK__CONSTP_C(ins)     ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_C((ins))))\n#define DUK__CONSTP_BC(ins)    ((duk_tval *) (void *) ((duk_uint8_t *) consts + DUK__BYTEOFF_BC((ins))))\n#define DUK__REGCONSTP_B(ins)  ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_B((ins))))\n#define DUK__REGCONSTP_C(ins)  ((duk_tval *) (void *) ((duk_uint8_t *) (((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK__BYTEOFF_C((ins))))\n#else  /* DUK_USE_EXEC_REGCONST_OPTIMIZE */\n/* Safe alternatives, no assumption about duk_tval size. */\n#define DUK__REGP_A(ins)       DUK__REGP(DUK_DEC_A((ins)))\n#define DUK__REGP_B(ins)       DUK__REGP(DUK_DEC_B((ins)))\n#define DUK__REGP_C(ins)       DUK__REGP(DUK_DEC_C((ins)))\n#define DUK__REGP_BC(ins)      DUK__REGP(DUK_DEC_BC((ins)))\n#define DUK__CONSTP_A(ins)     DUK__CONSTP(DUK_DEC_A((ins)))\n#define DUK__CONSTP_B(ins)     DUK__CONSTP(DUK_DEC_B((ins)))\n#define DUK__CONSTP_C(ins)     DUK__CONSTP(DUK_DEC_C((ins)))\n#define DUK__CONSTP_BC(ins)    DUK__CONSTP(DUK_DEC_BC((ins)))\n#define DUK__REGCONSTP_B(ins)  ((((ins) & DUK__RCBIT_B) ? consts : thr->valstack_bottom) + DUK_DEC_B((ins)))\n#define DUK__REGCONSTP_C(ins)  ((((ins) & DUK__RCBIT_C) ? consts : thr->valstack_bottom) + DUK_DEC_C((ins)))\n#endif  /* DUK_USE_EXEC_REGCONST_OPTIMIZE */\n\n#if defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS)\n#define DUK__INTERNAL_ERROR(msg)  do { \\\n\t\tDUK_ERROR_ERROR(thr, (msg)); \\\n\t} while (0)\n#else\n#define DUK__INTERNAL_ERROR(msg)  do { \\\n\t\tgoto internal_error; \\\n\t} while (0)\n#endif\n\n#define DUK__SYNC_CURR_PC()  do { \\\n\t\tduk_activation *duk__act; \\\n\t\tduk__act = thr->callstack_curr; \\\n\t\tduk__act->curr_pc = curr_pc; \\\n\t} while (0)\n#define DUK__SYNC_AND_NULL_CURR_PC()  do { \\\n\t\tduk_activation *duk__act; \\\n\t\tduk__act = thr->callstack_curr; \\\n\t\tduk__act->curr_pc = curr_pc; \\\n\t\tthr->ptr_curr_pc = NULL; \\\n\t} while (0)\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n#define DUK__LOOKUP_INDIRECT(idx) do { \\\n\t\t(idx) = (duk_uint_fast_t) duk_get_uint(thr, (duk_idx_t) (idx)); \\\n\t} while (0)\n#elif defined(DUK_USE_FASTINT)\n#define DUK__LOOKUP_INDIRECT(idx) do { \\\n\t\tduk_tval *tv_ind; \\\n\t\ttv_ind = DUK__REGP((idx)); \\\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \\\n\t\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_ind));  /* compiler guarantees */ \\\n\t\t(idx) = (duk_uint_fast_t) DUK_TVAL_GET_FASTINT_U32(tv_ind); \\\n\t} while (0)\n#else\n#define DUK__LOOKUP_INDIRECT(idx) do { \\\n\t\tduk_tval *tv_ind; \\\n\t\ttv_ind = DUK__REGP(idx); \\\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_ind)); \\\n\t\tidx = (duk_uint_fast_t) DUK_TVAL_GET_NUMBER(tv_ind); \\\n\t} while (0)\n#endif\n\nDUK_LOCAL void duk__handle_executor_error(duk_heap *heap,\n                                          duk_activation *entry_act,\n                                          duk_int_t entry_call_recursion_depth,\n                                          duk_jmpbuf *entry_jmpbuf_ptr) {\n\tduk_small_uint_t lj_ret;\n\n\t/* Longjmp callers are required to sync-and-null thr->ptr_curr_pc\n\t * before longjmp.\n\t */\n\tDUK_ASSERT(heap->curr_thread != NULL);\n\tDUK_ASSERT(heap->curr_thread->ptr_curr_pc == NULL);\n\n\t/* XXX: signalling the need to shrink check (only if unwound) */\n\n\t/* Must be restored here to handle e.g. yields properly. */\n\theap->call_recursion_depth = entry_call_recursion_depth;\n\n\t/* Switch to caller's setjmp() catcher so that if an error occurs\n\t * during error handling, it is always propagated outwards instead\n\t * of causing an infinite loop in our own handler.\n\t */\n\theap->lj.jmpbuf_ptr = (duk_jmpbuf *) entry_jmpbuf_ptr;\n\n\tlj_ret = duk__handle_longjmp(heap->curr_thread, entry_act);\n\n\t/* Error handling complete, remove side effect protections.\n\t */\n#if defined(DUK_USE_ASSERTIONS)\n\tDUK_ASSERT(heap->error_not_allowed == 1);\n\theap->error_not_allowed = 0;\n#endif\n\tDUK_ASSERT(heap->pf_prevent_count > 0);\n\theap->pf_prevent_count--;\n\tDUK_DD(DUK_DDPRINT(\"executor error handled, pf_prevent_count updated to %ld\", (long) heap->pf_prevent_count));\n\n\tif (lj_ret == DUK__LONGJMP_RESTART) {\n\t\t/* Restart bytecode execution, possibly with a changed thread. */\n\t\tDUK_REFZERO_CHECK_SLOW(heap->curr_thread);\n\t} else {\n\t\t/* If an error is propagated, don't run refzero checks here.\n\t\t * The next catcher will deal with that.  Pf_prevent_count\n\t\t * will be re-bumped by the longjmp.\n\t\t */\n\n\t\tDUK_ASSERT(lj_ret == DUK__LONGJMP_RETHROW);  /* Rethrow error to calling state. */\n\t\tDUK_ASSERT(heap->lj.jmpbuf_ptr == entry_jmpbuf_ptr);  /* Longjmp handling has restored jmpbuf_ptr. */\n\n\t\t/* Thread may have changed, e.g. YIELD converted to THROW. */\n\t\tduk_err_longjmp(heap->curr_thread);\n\t\tDUK_UNREACHABLE();\n\t}\n}\n\n/* Outer executor with setjmp/longjmp handling. */\nDUK_INTERNAL void duk_js_execute_bytecode(duk_hthread *exec_thr) {\n\t/* Entry level info. */\n\tduk_hthread *entry_thread;\n\tduk_activation *entry_act;\n\tduk_int_t entry_call_recursion_depth;\n\tduk_jmpbuf *entry_jmpbuf_ptr;\n\tduk_jmpbuf our_jmpbuf;\n\tduk_heap *heap;\n\n\tDUK_ASSERT(exec_thr != NULL);\n\tDUK_ASSERT(exec_thr->heap != NULL);\n\tDUK_ASSERT(exec_thr->heap->curr_thread != NULL);\n\tDUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR((duk_heaphdr *) exec_thr);\n\tDUK_ASSERT(exec_thr->callstack_top >= 1);  /* at least one activation, ours */\n\tDUK_ASSERT(exec_thr->callstack_curr != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(exec_thr->callstack_curr) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(exec_thr->callstack_curr)));\n\n\tDUK_GC_TORTURE(exec_thr->heap);\n\n\tentry_thread = exec_thr;\n\theap = entry_thread->heap;\n\tentry_act = entry_thread->callstack_curr;\n\tDUK_ASSERT(entry_act != NULL);\n\tentry_call_recursion_depth = entry_thread->heap->call_recursion_depth;\n\tentry_jmpbuf_ptr = entry_thread->heap->lj.jmpbuf_ptr;\n\n\t/*\n\t *  Note: we currently assume that the setjmp() catchpoint is\n\t *  not re-entrant (longjmp() cannot be called more than once\n\t *  for a single setjmp()).\n\t *\n\t *  See doc/code-issues.rst for notes on variable assignment\n\t *  before and after setjmp().\n\t */\n\n\tfor (;;) {\n\t\theap->lj.jmpbuf_ptr = &our_jmpbuf;\n\t\tDUK_ASSERT(heap->lj.jmpbuf_ptr != NULL);\n\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\t\ttry {\n#else\n\t\tDUK_ASSERT(heap->lj.jmpbuf_ptr == &our_jmpbuf);\n\t\tif (DUK_SETJMP(our_jmpbuf.jb) == 0) {\n#endif\n\t\t\t/* Execute bytecode until returned or longjmp(). */\n\t\t\tduk__js_execute_bytecode_inner(entry_thread, entry_act);\n\n\t\t\t/* Successful return: restore jmpbuf and return to caller. */\n\t\t\theap->lj.jmpbuf_ptr = entry_jmpbuf_ptr;\n\n\t\t\treturn;\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\t\t} catch (duk_internal_exception &exc) {\n#else\n\t\t} else {\n#endif\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\t\t\tDUK_UNREF(exc);\n#endif\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"longjmp caught by bytecode executor\"));\n\t\t\tDUK_STATS_INC(exec_thr->heap, stats_exec_throw);\n\n\t\t\tduk__handle_executor_error(heap,\n\t\t\t                           entry_act,\n\t\t\t                           entry_call_recursion_depth,\n\t\t\t                           entry_jmpbuf_ptr);\n\t\t}\n#if defined(DUK_USE_CPP_EXCEPTIONS)\n\t\tcatch (std::exception &exc) {\n\t\t\tconst char *what = exc.what();\n\t\t\tif (!what) {\n\t\t\t\twhat = \"unknown\";\n\t\t\t}\n\t\t\tDUK_D(DUK_DPRINT(\"unexpected c++ std::exception (perhaps thrown by user code)\"));\n\t\t\tDUK_STATS_INC(exec_thr->heap, stats_exec_throw);\n\t\t\ttry {\n\t\t\t\tDUK_ASSERT(heap->curr_thread != NULL);\n\t\t\t\tDUK_ERROR_FMT1(heap->curr_thread, DUK_ERR_TYPE_ERROR, \"caught invalid c++ std::exception '%s' (perhaps thrown by user code)\", what);\n\t\t\t} catch (duk_internal_exception exc) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"caught api error thrown from unexpected c++ std::exception\"));\n\t\t\t\tDUK_UNREF(exc);\n\t\t\t\tduk__handle_executor_error(heap,\n\t\t\t\t                           entry_act,\n\t\t\t\t                           entry_call_recursion_depth,\n\t\t\t\t                           entry_jmpbuf_ptr);\n\t\t\t}\n\t\t} catch (...) {\n\t\t\tDUK_D(DUK_DPRINT(\"unexpected c++ exception (perhaps thrown by user code)\"));\n\t\t\tDUK_STATS_INC(exec_thr->heap, stats_exec_throw);\n\t\t\ttry {\n\t\t\t\tDUK_ASSERT(heap->curr_thread != NULL);\n\t\t\t\tDUK_ERROR_TYPE(heap->curr_thread, \"caught invalid c++ exception (perhaps thrown by user code)\");\n\t\t\t} catch (duk_internal_exception exc) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"caught api error thrown from unexpected c++ exception\"));\n\t\t\t\tDUK_UNREF(exc);\n\t\t\t\tduk__handle_executor_error(heap,\n\t\t\t\t                           entry_act,\n\t\t\t\t                           entry_call_recursion_depth,\n\t\t\t\t                           entry_jmpbuf_ptr);\n\t\t\t}\n\t\t}\n#endif\n\t}\n\n\tDUK_UNREACHABLE();\n}\n\n/* Inner executor, performance critical. */\nDUK_LOCAL DUK_NOINLINE DUK_HOT void duk__js_execute_bytecode_inner(duk_hthread *entry_thread, duk_activation *entry_act) {\n\t/* Current PC, accessed by other functions through thr->ptr_to_curr_pc.\n\t * Critical for performance.  It would be safest to make this volatile,\n\t * but that eliminates performance benefits; aliasing guarantees\n\t * should be enough though.\n\t */\n\tduk_instr_t *curr_pc;         /* bytecode has a stable pointer */\n\n\t/* Hot variables for interpretation.  Critical for performance,\n\t * but must add sparingly to minimize register shuffling.\n\t */\n\tduk_hthread *thr;             /* stable */\n\tduk_tval *consts;             /* stable */\n\tduk_uint_fast32_t ins;\n\t/* 'funcs' is quite rarely used, so no local for it */\n#if defined(DUK_USE_EXEC_FUN_LOCAL)\n\tduk_hcompfunc *fun;\n#else\n\t/* 'fun' is quite rarely used, so no local for it */\n#endif\n\n#if defined(DUK_USE_INTERRUPT_COUNTER)\n\tduk_int_t int_ctr;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\tduk_size_t valstack_top_base;    /* valstack top, should match before interpreting each op (no leftovers) */\n#endif\n\n\t/* Optimized reg/const access macros assume sizeof(duk_tval) to be\n\t * either 8 or 16.  Heap allocation checks this even without asserts\n\t * enabled now because it can't be autodetected in duk_config.h.\n\t */\n#if 1\n#if defined(DUK_USE_PACKED_TVAL)\n\tDUK_ASSERT(sizeof(duk_tval) == 8);\n#else\n\tDUK_ASSERT(sizeof(duk_tval) == 16);\n#endif\n#endif\n\n\tDUK_GC_TORTURE(entry_thread->heap);\n\n\t/*\n\t *  Restart execution by reloading thread state.\n\t *\n\t *  Note that 'thr' and any thread configuration may have changed,\n\t *  so all local variables are suspect and we need to reinitialize.\n\t *\n\t *  The number of local variables should be kept to a minimum: if\n\t *  the variables are spilled, they will need to be loaded from\n\t *  memory anyway.\n\t *\n\t *  Any 'goto restart_execution;' code path in opcode dispatch must\n\t *  ensure 'curr_pc' is synced back to act->curr_pc before the goto\n\t *  takes place.\n\t *\n\t *  The interpreter must be very careful with memory pointers, as\n\t *  many pointers are not guaranteed to be 'stable' and may be\n\t *  reallocated and relocated on-the-fly quite easily (e.g. by a\n\t *  memory allocation or a property access).\n\t *\n\t *  The following are assumed to have stable pointers:\n\t *    - the current thread\n\t *    - the current function\n\t *    - the bytecode, constant table, inner function table of the\n\t *      current function (as they are a part of the function allocation)\n\t *\n\t *  The following are assumed to have semi-stable pointers:\n\t *    - the current activation entry: stable as long as callstack\n\t *      is not changed (reallocated by growing or shrinking), or\n\t *      by any garbage collection invocation (through finalizers)\n\t *    - Note in particular that ANY DECREF can invalidate the\n\t *      activation pointer, so for the most part a fresh lookup\n\t *      is required\n\t *\n\t *  The following are not assumed to have stable pointers at all:\n\t *    - the value stack (registers) of the current thread\n\t *\n\t *  See execution.rst for discussion.\n\t */\n\n restart_execution:\n\n\t/* Lookup current thread; use the stable 'entry_thread' for this to\n\t * avoid clobber warnings.  Any valid, reachable 'thr' value would be\n\t * fine for this, so using 'entry_thread' is just to silence warnings.\n\t */\n\tthr = entry_thread->heap->curr_thread;\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(thr->callstack_top >= 1);\n\tDUK_ASSERT(thr->callstack_curr != NULL);\n\tDUK_ASSERT(DUK_ACT_GET_FUNC(thr->callstack_curr) != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(DUK_ACT_GET_FUNC(thr->callstack_curr)));\n\n\tDUK_GC_TORTURE(thr->heap);\n\n\tthr->ptr_curr_pc = &curr_pc;\n\n\t/* Relookup and initialize dispatch loop variables.  Debugger check. */\n\t{\n\t\tduk_activation *act;\n#if !defined(DUK_USE_EXEC_FUN_LOCAL)\n\t\tduk_hcompfunc *fun;\n#endif\n\n\t\t/* Assume interrupt init/counter are properly initialized here. */\n\t\t/* Assume that thr->valstack_bottom has been set-up before getting here. */\n\n\t\tact = thr->callstack_curr;\n\t\tDUK_ASSERT(act != NULL);\n\t\tfun = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);\n\t\tDUK_ASSERT(fun != NULL);\n\t\tDUK_ASSERT(thr->valstack_top - thr->valstack_bottom == fun->nregs);\n\t\tconsts = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, fun);\n\t\tDUK_ASSERT(consts != NULL);\n\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t\tif (DUK_UNLIKELY(duk_debug_is_attached(thr->heap) && !thr->heap->dbg_processing)) {\n\t\t\tduk__executor_recheck_debugger(thr, act, fun);\n\t\t\tDUK_ASSERT(act == thr->callstack_curr);\n\t\t\tDUK_ASSERT(act != NULL);\n\t\t}\n#endif  /* DUK_USE_DEBUGGER_SUPPORT */\n\n#if defined(DUK_USE_ASSERTIONS)\n\t\tvalstack_top_base = (duk_size_t) (thr->valstack_top - thr->valstack);\n#endif\n\n\t\t/* Set up curr_pc for opcode dispatch. */\n\t\tcurr_pc = act->curr_pc;\n\t}\n\n\tDUK_DD(DUK_DDPRINT(\"restarting execution, thr %p, act idx %ld, fun %p,\"\n\t                   \"consts %p, funcs %p, lev %ld, regbot %ld, regtop %ld, \"\n\t                   \"preventcount=%ld\",\n\t                   (void *) thr,\n\t                   (long) (thr->callstack_top - 1),\n\t                   (void *) DUK__FUN(),\n\t                   (void *) DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, DUK__FUN()),\n\t                   (void *) DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, DUK__FUN()),\n\t                   (long) (thr->callstack_top - 1),\n\t                   (long) (thr->valstack_bottom - thr->valstack),\n\t                   (long) (thr->valstack_top - thr->valstack),\n\t                   (long) thr->callstack_preventcount));\n\n\t/* Dispatch loop. */\n\n\tfor (;;) {\n\t\tduk_uint8_t op;\n\n\t\tDUK_ASSERT(thr->callstack_top >= 1);\n\t\tDUK_ASSERT(thr->valstack_top - thr->valstack_bottom == DUK__FUN()->nregs);\n\t\tDUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) == valstack_top_base);\n\n\t\t/* Executor interrupt counter check, used to implement breakpoints,\n\t\t * debugging interface, execution timeouts, etc.  The counter is heap\n\t\t * specific but is maintained in the current thread to make the check\n\t\t * as fast as possible.  The counter is copied back to the heap struct\n\t\t * whenever a thread switch occurs by the DUK_HEAP_SWITCH_THREAD() macro.\n\t\t */\n#if defined(DUK_USE_INTERRUPT_COUNTER)\n\t\tint_ctr = thr->interrupt_counter;\n\t\tif (DUK_LIKELY(int_ctr > 0)) {\n\t\t\tthr->interrupt_counter = int_ctr - 1;\n\t\t} else {\n\t\t\t/* Trigger at zero or below */\n\t\t\tduk_small_uint_t exec_int_ret;\n\n\t\t\tDUK_STATS_INC(thr->heap, stats_exec_interrupt);\n\n\t\t\t/* Write curr_pc back for the debugger. */\n\t\t\t{\n\t\t\t\tduk_activation *act;\n\t\t\t\tDUK_ASSERT(thr->callstack_top > 0);\n\t\t\t\tact = thr->callstack_curr;\n\t\t\t\tDUK_ASSERT(act != NULL);\n\t\t\t\tact->curr_pc = (duk_instr_t *) curr_pc;\n\t\t\t}\n\n\t\t\t/* Forced restart caused by a function return; must recheck\n\t\t\t * debugger breakpoints before checking line transitions,\n\t\t\t * see GH-303.  Restart and then handle interrupt_counter\n\t\t\t * zero again.\n\t\t\t */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t\t\tif (thr->heap->dbg_force_restart) {\n\t\t\t\tDUK_DD(DUK_DDPRINT(\"dbg_force_restart flag forced restart execution\"));  /* GH-303 */\n\t\t\t\tthr->heap->dbg_force_restart = 0;\n\t\t\t\tgoto restart_execution;\n\t\t\t}\n#endif\n\n\t\t\texec_int_ret = duk__executor_interrupt(thr);\n\t\t\tif (exec_int_ret == DUK__INT_RESTART) {\n\t\t\t\t/* curr_pc synced back above */\n\t\t\t\tgoto restart_execution;\n\t\t\t}\n\t\t}\n#endif  /* DUK_USE_INTERRUPT_COUNTER */\n#if defined(DUK_USE_INTERRUPT_COUNTER) && defined(DUK_USE_DEBUG)\n\t\t/* For cross-checking during development: ensure dispatch count\n\t\t * matches cumulative interrupt counter init value sums.\n\t\t */\n\t\tthr->heap->inst_count_exec++;\n#endif\n\n#if defined(DUK_USE_ASSERTIONS) || defined(DUK_USE_DEBUG)\n\t\t{\n\t\t\tduk_activation *act;\n\t\t\tact = thr->callstack_curr;\n\t\t\tDUK_ASSERT(curr_pc >= DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN()));\n\t\t\tDUK_ASSERT(curr_pc < DUK_HCOMPFUNC_GET_CODE_END(thr->heap, DUK__FUN()));\n\t\t\tDUK_UNREF(act);  /* if debugging disabled */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"executing bytecode: pc=%ld, ins=0x%08lx, op=%ld, valstack_top=%ld/%ld, nregs=%ld  -->  %!I\",\n\t\t\t                     (long) (curr_pc - DUK_HCOMPFUNC_GET_CODE_BASE(thr->heap, DUK__FUN())),\n\t\t\t                     (unsigned long) *curr_pc,\n\t\t\t                     (long) DUK_DEC_OP(*curr_pc),\n\t\t\t                     (long) (thr->valstack_top - thr->valstack),\n\t\t\t                     (long) (thr->valstack_end - thr->valstack),\n\t\t\t                     (long) (DUK__FUN() ? DUK__FUN()->nregs : -1),\n\t\t\t                     (duk_instr_t) *curr_pc));\n\t\t}\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\n\t\t/* Quite heavy assert: check valstack policy.  Improper\n\t\t * shuffle instructions can write beyond valstack_top/end\n\t\t * so this check catches them in the act.\n\t\t */\n\t\t{\n\t\t\tduk_tval *tv;\n\t\t\ttv = thr->valstack_top;\n\t\t\twhile (tv != thr->valstack_end) {\n\t\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(tv));\n\t\t\t\ttv++;\n\t\t\t}\n\t\t}\n#endif\n\n\t\tins = *curr_pc++;\n\t\tDUK_STATS_INC(thr->heap, stats_exec_opcodes);\n\n\t\t/* Typing: use duk_small_(u)int_fast_t when decoding small\n\t\t * opcode fields (op, A, B, C, BC) which fit into 16 bits\n\t\t * and duk_(u)int_fast_t when decoding larger fields (e.g.\n\t\t * ABC).  Use unsigned variant by default, signed when the\n\t\t * value is used in signed arithmetic.  Using variable names\n\t\t * such as 'a', 'b', 'c', 'bc', etc makes it easier to spot\n\t\t * typing mismatches.\n\t\t */\n\n\t\t/* Switch based on opcode.  Cast to 8-bit unsigned value and\n\t\t * use a fully populated case clauses so that the compiler\n\t\t * will (at least usually) omit a bounds check.\n\t\t */\n\t\top = (duk_uint8_t) DUK_DEC_OP(ins);\n\t\tswitch (op) {\n\n\t\t/* Some useful macros.  These access inner executor variables\n\t\t * directly so they only apply within the executor.\n\t\t */\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n#define DUK__REPLACE_TOP_A_BREAK() { goto replace_top_a; }\n#define DUK__REPLACE_TOP_BC_BREAK() { goto replace_top_bc; }\n#define DUK__REPLACE_BOOL_A_BREAK(bval) { \\\n\t\tduk_bool_t duk__bval; \\\n\t\tduk__bval = (bval); \\\n\t\tDUK_ASSERT(duk__bval == 0 || duk__bval == 1); \\\n\t\tduk_push_boolean(thr, duk__bval); \\\n\t\tDUK__REPLACE_TOP_A_BREAK(); \\\n\t}\n#else\n#define DUK__REPLACE_TOP_A_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins)); break; }\n#define DUK__REPLACE_TOP_BC_BREAK() { DUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins)); break; }\n#define DUK__REPLACE_BOOL_A_BREAK(bval) { \\\n\t\tduk_bool_t duk__bval; \\\n\t\tduk_tval *duk__tvdst; \\\n\t\tduk__bval = (bval); \\\n\t\tDUK_ASSERT(duk__bval == 0 || duk__bval == 1); \\\n\t\tduk__tvdst = DUK__REGP_A(ins); \\\n\t\tDUK_TVAL_SET_BOOLEAN_UPDREF(thr, duk__tvdst, duk__bval); \\\n\t\tbreak; \\\n\t}\n#endif\n\n\t\t/* XXX: 12 + 12 bit variant might make sense too, for both reg and\n\t\t * const loads.\n\t\t */\n\n\t\t/* For LDREG, STREG, LDCONST footprint optimized variants would just\n\t\t * duk_dup() + duk_replace(), but because they're used quite a lot\n\t\t * they're currently intentionally not size optimized.\n\t\t */\n\t\tcase DUK_OP_LDREG: {\n\t\t\tduk_tval *tv1, *tv2;\n\n\t\t\ttv1 = DUK__REGP_A(ins);\n\t\t\ttv2 = DUK__REGP_BC(ins);\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_STREG: {\n\t\t\tduk_tval *tv1, *tv2;\n\n\t\t\ttv1 = DUK__REGP_A(ins);\n\t\t\ttv2 = DUK__REGP_BC(ins);\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv2, tv1);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_LDCONST: {\n\t\t\tduk_tval *tv1, *tv2;\n\n\t\t\ttv1 = DUK__REGP_A(ins);\n\t\t\ttv2 = DUK__CONSTP_BC(ins);\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\n\t\t/* LDINT and LDINTX are intended to load an arbitrary signed\n\t\t * 32-bit value.  Only an LDINT+LDINTX sequence is supported.\n\t\t * This also guarantees all values remain fastints.\n\t\t */\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_LDINT: {\n\t\t\tduk_int32_t val;\n\n\t\t\tval = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS;\n\t\t\tduk_push_int(thr, val);\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n\t\t}\n\t\tcase DUK_OP_LDINTX: {\n\t\t\tduk_int32_t val;\n\n\t\t\tval = (duk_int32_t) duk_get_int(thr, DUK_DEC_A(ins));\n\t\t\tval = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins);  /* no bias */\n\t\t\tduk_push_int(thr, val);\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_LDINT: {\n\t\t\tduk_tval *tv1;\n\t\t\tduk_int32_t val;\n\n\t\t\tval = (duk_int32_t) DUK_DEC_BC(ins) - (duk_int32_t) DUK_BC_LDINT_BIAS;\n\t\t\ttv1 = DUK__REGP_A(ins);\n\t\t\tDUK_TVAL_SET_I32_UPDREF(thr, tv1, val);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_LDINTX: {\n\t\t\tduk_tval *tv1;\n\t\t\tduk_int32_t val;\n\n\t\t\ttv1 = DUK__REGP_A(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));\n#if defined(DUK_USE_FASTINT)\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));\n\t\t\tval = DUK_TVAL_GET_FASTINT_I32(tv1);\n#else\n\t\t\t/* XXX: fast double-to-int conversion, we know number is integer in [-0x80000000,0xffffffff]. */\n\t\t\tval = (duk_int32_t) DUK_TVAL_GET_NUMBER(tv1);\n#endif\n\t\t\tval = (val << DUK_BC_LDINTX_SHIFT) + (duk_int32_t) DUK_DEC_BC(ins);  /* no bias */\n\t\t\tDUK_TVAL_SET_I32_UPDREF(thr, tv1, val);  /* side effects */\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_LDTHIS: {\n\t\t\tduk_push_this(thr);\n\t\t\tDUK__REPLACE_TOP_BC_BREAK();\n\t\t}\n\t\tcase DUK_OP_LDUNDEF: {\n\t\t\tduk_to_undefined(thr, (duk_idx_t) DUK_DEC_BC(ins));\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_LDNULL: {\n\t\t\tduk_to_null(thr, (duk_idx_t) DUK_DEC_BC(ins));\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_LDTRUE: {\n\t\t\tduk_push_true(thr);\n\t\t\tDUK__REPLACE_TOP_BC_BREAK();\n\t\t}\n\t\tcase DUK_OP_LDFALSE: {\n\t\t\tduk_push_false(thr);\n\t\t\tDUK__REPLACE_TOP_BC_BREAK();\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_LDTHIS: {\n\t\t\t/* Note: 'this' may be bound to any value, not just an object */\n\t\t\tduk_tval *tv1, *tv2;\n\n\t\t\ttv1 = DUK__REGP_BC(ins);\n\t\t\ttv2 = thr->valstack_bottom - 1;  /* 'this binding' is just under bottom */\n\t\t\tDUK_ASSERT(tv2 >= thr->valstack);\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF_FAST(thr, tv1, tv2);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_LDUNDEF: {\n\t\t\tduk_tval *tv1;\n\n\t\t\ttv1 = DUK__REGP_BC(ins);\n\t\t\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv1);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_LDNULL: {\n\t\t\tduk_tval *tv1;\n\n\t\t\ttv1 = DUK__REGP_BC(ins);\n\t\t\tDUK_TVAL_SET_NULL_UPDREF(thr, tv1);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_LDTRUE: {\n\t\t\tduk_tval *tv1;\n\n\t\t\ttv1 = DUK__REGP_BC(ins);\n\t\t\tDUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 1);  /* side effects */\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_LDFALSE: {\n\t\t\tduk_tval *tv1;\n\n\t\t\ttv1 = DUK__REGP_BC(ins);\n\t\t\tDUK_TVAL_SET_BOOLEAN_UPDREF(thr, tv1, 0);  /* side effects */\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\tcase DUK_OP_BNOT: {\n\t\t\tduk__vm_bitwise_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins));\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_LNOT: {\n\t\t\tduk__vm_logical_not(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins));\n\t\t\tbreak;\n\t\t}\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_UNM:\n\t\tcase DUK_OP_UNP: {\n\t\t\tduk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), op);\n\t\t\tbreak;\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_UNM: {\n\t\t\tduk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNM);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_UNP: {\n\t\t\tduk__vm_arith_unary_op(thr, DUK_DEC_BC(ins), DUK_DEC_A(ins), DUK_OP_UNP);\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_TYPEOF: {\n\t\t\tduk_small_uint_t stridx;\n\n\t\t\tstridx = duk_js_typeof_stridx(DUK__REGP_BC(ins));\n\t\t\tDUK_ASSERT_STRIDX_VALID(stridx);\n\t\t\tduk_push_hstring_stridx(thr, stridx);\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_TYPEOF: {\n\t\t\tduk_tval *tv;\n\t\t\tduk_small_uint_t stridx;\n\t\t\tduk_hstring *h_str;\n\n\t\t\ttv = DUK__REGP_BC(ins);\n\t\t\tstridx = duk_js_typeof_stridx(tv);\n\t\t\tDUK_ASSERT_STRIDX_VALID(stridx);\n\t\t\th_str = DUK_HTHREAD_GET_STRING(thr, stridx);\n\t\t\ttv = DUK__REGP_A(ins);\n\t\t\tDUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str);\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\tcase DUK_OP_TYPEOFID: {\n\t\t\tduk_small_uint_t stridx;\n#if !defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\t\tduk_hstring *h_str;\n#endif\n\t\t\tduk_activation *act;\n\t\t\tduk_hstring *name;\n\t\t\tduk_tval *tv;\n\n\t\t\t/* A -> target register\n\t\t\t * BC -> constant index of identifier name\n\t\t\t */\n\n\t\t\ttv = DUK__CONSTP_BC(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv));\n\t\t\tname = DUK_TVAL_GET_STRING(tv);\n\t\t\ttv = NULL;  /* lookup has side effects */\n\t\t\tact = thr->callstack_curr;\n\t\t\tif (duk_js_getvar_activation(thr, act, name, 0 /*throw*/)) {\n\t\t\t\t/* -> [... val this] */\n\t\t\t\ttv = DUK_GET_TVAL_NEGIDX(thr, -2);\n\t\t\t\tstridx = duk_js_typeof_stridx(tv);\n\t\t\t\ttv = NULL;  /* no longer needed */\n\t\t\t\tduk_pop_2_unsafe(thr);\n\t\t\t} else {\n\t\t\t\t/* unresolvable, no stack changes */\n\t\t\t\tstridx = DUK_STRIDX_LC_UNDEFINED;\n\t\t\t}\n\t\t\tDUK_ASSERT_STRIDX_VALID(stridx);\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\t\tduk_push_hstring_stridx(thr, stridx);\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\t\th_str = DUK_HTHREAD_GET_STRING(thr, stridx);\n\t\t\ttv = DUK__REGP_A(ins);\n\t\t\tDUK_TVAL_SET_STRING_UPDREF(thr, tv, h_str);\n\t\t\tbreak;\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\t}\n\n\t\t/* Equality: E5 Sections 11.9.1, 11.9.3 */\n\n#define DUK__EQ_BODY(barg,carg) { \\\n\t\tduk_bool_t tmp; \\\n\t\ttmp = duk_js_equals(thr, (barg), (carg)); \\\n\t\tDUK_ASSERT(tmp == 0 || tmp == 1); \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(tmp); \\\n\t}\n#define DUK__NEQ_BODY(barg,carg) { \\\n\t\tduk_bool_t tmp; \\\n\t\ttmp = duk_js_equals(thr, (barg), (carg)); \\\n\t\tDUK_ASSERT(tmp == 0 || tmp == 1); \\\n\t\ttmp ^= 1; \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(tmp); \\\n\t}\n#define DUK__SEQ_BODY(barg,carg) { \\\n\t\tduk_bool_t tmp; \\\n\t\ttmp = duk_js_strict_equals((barg), (carg)); \\\n\t\tDUK_ASSERT(tmp == 0 || tmp == 1); \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(tmp); \\\n\t}\n#define DUK__SNEQ_BODY(barg,carg) { \\\n\t\tduk_bool_t tmp; \\\n\t\ttmp = duk_js_strict_equals((barg), (carg)); \\\n\t\tDUK_ASSERT(tmp == 0 || tmp == 1); \\\n\t\ttmp ^= 1; \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(tmp); \\\n\t}\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_EQ_RR:\n\t\tcase DUK_OP_EQ_CR:\n\t\tcase DUK_OP_EQ_RC:\n\t\tcase DUK_OP_EQ_CC:\n\t\t\tDUK__EQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_NEQ_RR:\n\t\tcase DUK_OP_NEQ_CR:\n\t\tcase DUK_OP_NEQ_RC:\n\t\tcase DUK_OP_NEQ_CC:\n\t\t\tDUK__NEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_SEQ_RR:\n\t\tcase DUK_OP_SEQ_CR:\n\t\tcase DUK_OP_SEQ_RC:\n\t\tcase DUK_OP_SEQ_CC:\n\t\t\tDUK__SEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_SNEQ_RR:\n\t\tcase DUK_OP_SNEQ_CR:\n\t\tcase DUK_OP_SNEQ_RC:\n\t\tcase DUK_OP_SNEQ_CC:\n\t\t\tDUK__SNEQ_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_EQ_RR:\n\t\t\tDUK__EQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_EQ_CR:\n\t\t\tDUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_EQ_RC:\n\t\t\tDUK__EQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_EQ_CC:\n\t\t\tDUK__EQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_NEQ_RR:\n\t\t\tDUK__NEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_NEQ_CR:\n\t\t\tDUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_NEQ_RC:\n\t\t\tDUK__NEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_NEQ_CC:\n\t\t\tDUK__NEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_SEQ_RR:\n\t\t\tDUK__SEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_SEQ_CR:\n\t\t\tDUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_SEQ_RC:\n\t\t\tDUK__SEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_SEQ_CC:\n\t\t\tDUK__SEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_SNEQ_RR:\n\t\t\tDUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_SNEQ_CR:\n\t\t\tDUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_SNEQ_RC:\n\t\t\tDUK__SNEQ_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_SNEQ_CC:\n\t\t\tDUK__SNEQ_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n#define DUK__COMPARE_BODY(arg1,arg2,flags) { \\\n\t\tduk_bool_t tmp; \\\n\t\ttmp = duk_js_compare_helper(thr, (arg1), (arg2), (flags)); \\\n\t\tDUK_ASSERT(tmp == 0 || tmp == 1); \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(tmp); \\\n\t}\n#define DUK__GT_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), 0)\n#define DUK__GE_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST | DUK_COMPARE_FLAG_NEGATE)\n#define DUK__LT_BODY(barg,carg) DUK__COMPARE_BODY((barg), (carg), DUK_COMPARE_FLAG_EVAL_LEFT_FIRST)\n#define DUK__LE_BODY(barg,carg) DUK__COMPARE_BODY((carg), (barg), DUK_COMPARE_FLAG_NEGATE)\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_GT_RR:\n\t\tcase DUK_OP_GT_CR:\n\t\tcase DUK_OP_GT_RC:\n\t\tcase DUK_OP_GT_CC:\n\t\t\tDUK__GT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_GE_RR:\n\t\tcase DUK_OP_GE_CR:\n\t\tcase DUK_OP_GE_RC:\n\t\tcase DUK_OP_GE_CC:\n\t\t\tDUK__GE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_LT_RR:\n\t\tcase DUK_OP_LT_CR:\n\t\tcase DUK_OP_LT_RC:\n\t\tcase DUK_OP_LT_CC:\n\t\t\tDUK__LT_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_LE_RR:\n\t\tcase DUK_OP_LE_CR:\n\t\tcase DUK_OP_LE_RC:\n\t\tcase DUK_OP_LE_CC:\n\t\t\tDUK__LE_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_GT_RR:\n\t\t\tDUK__GT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GT_CR:\n\t\t\tDUK__GT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GT_RC:\n\t\t\tDUK__GT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_GT_CC:\n\t\t\tDUK__GT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_GE_RR:\n\t\t\tDUK__GE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GE_CR:\n\t\t\tDUK__GE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GE_RC:\n\t\t\tDUK__GE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_GE_CC:\n\t\t\tDUK__GE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_LT_RR:\n\t\t\tDUK__LT_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_LT_CR:\n\t\t\tDUK__LT_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_LT_RC:\n\t\t\tDUK__LT_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_LT_CC:\n\t\t\tDUK__LT_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_LE_RR:\n\t\t\tDUK__LE_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_LE_CR:\n\t\t\tDUK__LE_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_LE_RC:\n\t\t\tDUK__LE_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_LE_CC:\n\t\t\tDUK__LE_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\t/* No size optimized variant at present for IF. */\n\t\tcase DUK_OP_IFTRUE_R: {\n\t\t\tif (duk_js_toboolean(DUK__REGP_BC(ins)) != 0) {\n\t\t\t\tcurr_pc++;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_IFTRUE_C: {\n\t\t\tif (duk_js_toboolean(DUK__CONSTP_BC(ins)) != 0) {\n\t\t\t\tcurr_pc++;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_IFFALSE_R: {\n\t\t\tif (duk_js_toboolean(DUK__REGP_BC(ins)) == 0) {\n\t\t\t\tcurr_pc++;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_IFFALSE_C: {\n\t\t\tif (duk_js_toboolean(DUK__CONSTP_BC(ins)) == 0) {\n\t\t\t\tcurr_pc++;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_ADD_RR:\n\t\tcase DUK_OP_ADD_CR:\n\t\tcase DUK_OP_ADD_RC:\n\t\tcase DUK_OP_ADD_CC: {\n\t\t\t/* XXX: could leave value on stack top and goto replace_top_a; */\n\t\t\tduk__vm_arith_add(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins));\n\t\t\tbreak;\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_ADD_RR: {\n\t\t\tduk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins));\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_ADD_CR: {\n\t\t\tduk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins));\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_ADD_RC: {\n\t\t\tduk__vm_arith_add(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins));\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_ADD_CC: {\n\t\t\tduk__vm_arith_add(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins));\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_SUB_RR:\n\t\tcase DUK_OP_SUB_CR:\n\t\tcase DUK_OP_SUB_RC:\n\t\tcase DUK_OP_SUB_CC:\n\t\tcase DUK_OP_MUL_RR:\n\t\tcase DUK_OP_MUL_CR:\n\t\tcase DUK_OP_MUL_RC:\n\t\tcase DUK_OP_MUL_CC:\n\t\tcase DUK_OP_DIV_RR:\n\t\tcase DUK_OP_DIV_CR:\n\t\tcase DUK_OP_DIV_RC:\n\t\tcase DUK_OP_DIV_CC:\n\t\tcase DUK_OP_MOD_RR:\n\t\tcase DUK_OP_MOD_CR:\n\t\tcase DUK_OP_MOD_RC:\n\t\tcase DUK_OP_MOD_CC:\n#if defined(DUK_USE_ES7_EXP_OPERATOR)\n\t\tcase DUK_OP_EXP_RR:\n\t\tcase DUK_OP_EXP_CR:\n\t\tcase DUK_OP_EXP_RC:\n\t\tcase DUK_OP_EXP_CC:\n#endif  /* DUK_USE_ES7_EXP_OPERATOR */\n\t\t{\n\t\t\t/* XXX: could leave value on stack top and goto replace_top_a; */\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op);\n\t\t\tbreak;\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_SUB_RR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_SUB_CR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_SUB_RC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_SUB_CC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_SUB);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MUL_RR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MUL_CR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MUL_RC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MUL_CC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MUL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_DIV_RR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_DIV_CR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_DIV_RC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_DIV_CC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_DIV);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MOD_RR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MOD_CR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MOD_RC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_MOD_CC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_MOD);\n\t\t\tbreak;\n\t\t}\n#if defined(DUK_USE_ES7_EXP_OPERATOR)\n\t\tcase DUK_OP_EXP_RR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_EXP_CR: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_EXP_RC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_EXP_CC: {\n\t\t\tduk__vm_arith_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_EXP);\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_ES7_EXP_OPERATOR */\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_BAND_RR:\n\t\tcase DUK_OP_BAND_CR:\n\t\tcase DUK_OP_BAND_RC:\n\t\tcase DUK_OP_BAND_CC:\n\t\tcase DUK_OP_BOR_RR:\n\t\tcase DUK_OP_BOR_CR:\n\t\tcase DUK_OP_BOR_RC:\n\t\tcase DUK_OP_BOR_CC:\n\t\tcase DUK_OP_BXOR_RR:\n\t\tcase DUK_OP_BXOR_CR:\n\t\tcase DUK_OP_BXOR_RC:\n\t\tcase DUK_OP_BXOR_CC:\n\t\tcase DUK_OP_BASL_RR:\n\t\tcase DUK_OP_BASL_CR:\n\t\tcase DUK_OP_BASL_RC:\n\t\tcase DUK_OP_BASL_CC:\n\t\tcase DUK_OP_BLSR_RR:\n\t\tcase DUK_OP_BLSR_CR:\n\t\tcase DUK_OP_BLSR_RC:\n\t\tcase DUK_OP_BLSR_CC:\n\t\tcase DUK_OP_BASR_RR:\n\t\tcase DUK_OP_BASR_CR:\n\t\tcase DUK_OP_BASR_RC:\n\t\tcase DUK_OP_BASR_CC: {\n\t\t\t/* XXX: could leave value on stack top and goto replace_top_a; */\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins), DUK_DEC_A(ins), op);\n\t\t\tbreak;\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_BAND_RR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BAND_CR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BAND_RC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BAND_CC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BAND);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BOR_RR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BOR_CR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BOR_RC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BOR_CC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BXOR_RR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BXOR_CR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BXOR_RC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BXOR_CC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BXOR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASL_RR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASL_CR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASL_RC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASL_CC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASL);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BLSR_RR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BLSR_CR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BLSR_RC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BLSR_CC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BLSR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASR_RR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASR_CR: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__REGP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASR_RC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__REGP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_BASR_CC: {\n\t\t\tduk__vm_bitwise_binary_op(thr, DUK__CONSTP_B(ins), DUK__CONSTP_C(ins), DUK_DEC_A(ins), DUK_OP_BASR);\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\t/* For INSTOF and IN, B is always a register. */\n#define DUK__INSTOF_BODY(barg,carg) { \\\n\t\tduk_bool_t tmp; \\\n\t\ttmp = duk_js_instanceof(thr, (barg), (carg)); \\\n\t\tDUK_ASSERT(tmp == 0 || tmp == 1); \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(tmp); \\\n\t}\n#define DUK__IN_BODY(barg,carg) { \\\n\t\tduk_bool_t tmp; \\\n\t\ttmp = duk_js_in(thr, (barg), (carg)); \\\n\t\tDUK_ASSERT(tmp == 0 || tmp == 1); \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(tmp); \\\n\t}\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_INSTOF_RR:\n\t\tcase DUK_OP_INSTOF_CR:\n\t\tcase DUK_OP_INSTOF_RC:\n\t\tcase DUK_OP_INSTOF_CC:\n\t\t\tDUK__INSTOF_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_IN_RR:\n\t\tcase DUK_OP_IN_CR:\n\t\tcase DUK_OP_IN_RC:\n\t\tcase DUK_OP_IN_CC:\n\t\t\tDUK__IN_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_INSTOF_RR:\n\t\t\tDUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_INSTOF_CR:\n\t\t\tDUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_INSTOF_RC:\n\t\t\tDUK__INSTOF_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_INSTOF_CC:\n\t\t\tDUK__INSTOF_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_IN_RR:\n\t\t\tDUK__IN_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_IN_CR:\n\t\t\tDUK__IN_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_IN_RC:\n\t\t\tDUK__IN_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_IN_CC:\n\t\t\tDUK__IN_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\t/* Pre/post inc/dec for register variables, important for loops. */\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_PREINCR:\n\t\tcase DUK_OP_PREDECR:\n\t\tcase DUK_OP_POSTINCR:\n\t\tcase DUK_OP_POSTDECR: {\n\t\t\tduk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), op);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_PREINCV:\n\t\tcase DUK_OP_PREDECV:\n\t\tcase DUK_OP_POSTINCV:\n\t\tcase DUK_OP_POSTDECV: {\n\t\t\tduk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), op, DUK__STRICT());\n\t\t\tbreak;\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_PREINCR: {\n\t\t\tduk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREINCR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_PREDECR: {\n\t\t\tduk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_PREDECR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_POSTINCR: {\n\t\t\tduk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTINCR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_POSTDECR: {\n\t\t\tduk__prepost_incdec_reg_helper(thr, DUK__REGP_A(ins), DUK__REGP_BC(ins), DUK_OP_POSTDECR);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_PREINCV: {\n\t\t\tduk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREINCV, DUK__STRICT());\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_PREDECV: {\n\t\t\tduk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_PREDECV, DUK__STRICT());\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_POSTINCV: {\n\t\t\tduk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTINCV, DUK__STRICT());\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_OP_POSTDECV: {\n\t\t\tduk__prepost_incdec_var_helper(thr, DUK_DEC_A(ins), DUK__CONSTP_BC(ins), DUK_OP_POSTDECV, DUK__STRICT());\n\t\t\tbreak;\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\t/* XXX: Move to separate helper, optimize for perf/size separately. */\n\t\t/* Preinc/predec for object properties. */\n\t\tcase DUK_OP_PREINCP_RR:\n\t\tcase DUK_OP_PREINCP_CR:\n\t\tcase DUK_OP_PREINCP_RC:\n\t\tcase DUK_OP_PREINCP_CC:\n\t\tcase DUK_OP_PREDECP_RR:\n\t\tcase DUK_OP_PREDECP_CR:\n\t\tcase DUK_OP_PREDECP_RC:\n\t\tcase DUK_OP_PREDECP_CC:\n\t\tcase DUK_OP_POSTINCP_RR:\n\t\tcase DUK_OP_POSTINCP_CR:\n\t\tcase DUK_OP_POSTINCP_RC:\n\t\tcase DUK_OP_POSTINCP_CC:\n\t\tcase DUK_OP_POSTDECP_RR:\n\t\tcase DUK_OP_POSTDECP_CR:\n\t\tcase DUK_OP_POSTDECP_RC:\n\t\tcase DUK_OP_POSTDECP_CC: {\n\t\t\tduk_tval *tv_obj;\n\t\t\tduk_tval *tv_key;\n\t\t\tduk_tval *tv_val;\n\t\t\tduk_bool_t rc;\n\t\t\tduk_double_t x, y, z;\n#if !defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\t\tduk_tval *tv_dst;\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\t\t/* A -> target reg\n\t\t\t * B -> object reg/const (may be const e.g. in \"'foo'[1]\")\n\t\t\t * C -> key reg/const\n\t\t\t */\n\n\t\t\t/* Opcode bits 0-1 are used to distinguish reg/const variants.\n\t\t\t * Opcode bits 2-3 are used to distinguish inc/dec variants:\n\t\t\t * Bit 2 = inc(0)/dec(1), bit 3 = pre(0)/post(1).\n\t\t\t */\n\t\t\tDUK_ASSERT((DUK_OP_PREINCP_RR & 0x0c) == 0x00);\n\t\t\tDUK_ASSERT((DUK_OP_PREDECP_RR & 0x0c) == 0x04);\n\t\t\tDUK_ASSERT((DUK_OP_POSTINCP_RR & 0x0c) == 0x08);\n\t\t\tDUK_ASSERT((DUK_OP_POSTDECP_RR & 0x0c) == 0x0c);\n\n\t\t\ttv_obj = DUK__REGCONSTP_B(ins);\n\t\t\ttv_key = DUK__REGCONSTP_C(ins);\n\t\t\trc = duk_hobject_getprop(thr, tv_obj, tv_key);  /* -> [val] */\n\t\t\tDUK_UNREF(rc);  /* ignore */\n\t\t\ttv_obj = NULL;  /* invalidated */\n\t\t\ttv_key = NULL;  /* invalidated */\n\n\t\t\t/* XXX: Fastint fast path would be useful here.  Also fastints\n\t\t\t * now lose their fastint status in current handling which is\n\t\t\t * not intuitive.\n\t\t\t */\n\n\t\t\tx = duk_to_number_m1(thr);\n\t\t\tduk_pop_unsafe(thr);\n\t\t\tif (ins & DUK_BC_INCDECP_FLAG_DEC) {\n\t\t\t\ty = x - 1.0;\n\t\t\t} else {\n\t\t\t\ty = x + 1.0;\n\t\t\t}\n\n\t\t\tduk_push_number(thr, y);\n\t\t\ttv_val = DUK_GET_TVAL_NEGIDX(thr, -1);\n\t\t\tDUK_ASSERT(tv_val != NULL);\n\t\t\ttv_obj = DUK__REGCONSTP_B(ins);\n\t\t\ttv_key = DUK__REGCONSTP_C(ins);\n\t\t\trc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, DUK__STRICT());\n\t\t\tDUK_UNREF(rc);  /* ignore */\n\t\t\ttv_obj = NULL;  /* invalidated */\n\t\t\ttv_key = NULL;  /* invalidated */\n\t\t\tduk_pop_unsafe(thr);\n\n\t\t\tz = (ins & DUK_BC_INCDECP_FLAG_POST) ? x : y;\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\t\tduk_push_number(thr, z);\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n#else\n\t\t\ttv_dst = DUK__REGP_A(ins);\n\t\t\tDUK_TVAL_SET_NUMBER_UPDREF(thr, tv_dst, z);\n\t\t\tbreak;\n#endif\n\t\t}\n\n\t\t/* XXX: GETPROP where object is 'this', GETPROPT?\n\t\t * Occurs relatively often in object oriented code.\n\t\t */\n\n#define DUK__GETPROP_BODY(barg,carg) { \\\n\t\t/* A -> target reg \\\n\t\t * B -> object reg/const (may be const e.g. in \"'foo'[1]\") \\\n\t\t * C -> key reg/const \\\n\t\t */ \\\n\t\t(void) duk_hobject_getprop(thr, (barg), (carg)); \\\n\t\tDUK__REPLACE_TOP_A_BREAK(); \\\n\t}\n#define DUK__GETPROPC_BODY(barg,carg) { \\\n\t\t/* Same as GETPROP but callability check for property-based calls. */ \\\n\t\tduk_tval *tv__targ; \\\n\t\t(void) duk_hobject_getprop(thr, (barg), (carg)); \\\n\t\tDUK_GC_TORTURE(thr->heap); \\\n\t\ttv__targ = DUK_GET_TVAL_NEGIDX(thr, -1); \\\n\t\tif (DUK_UNLIKELY(!duk_is_callable_tval(thr, tv__targ))) { \\\n\t\t\t/* Here we intentionally re-evaluate the macro \\\n\t\t\t * arguments to deal with potentially changed \\\n\t\t\t * valstack base pointer! \\\n\t\t\t */ \\\n\t\t\tduk_call_setup_propcall_error(thr, tv__targ, (barg), (carg)); \\\n\t\t} \\\n\t\tDUK__REPLACE_TOP_A_BREAK(); \\\n\t}\n#define DUK__PUTPROP_BODY(aarg,barg,carg) { \\\n\t\t/* A -> object reg \\\n\t\t * B -> key reg/const \\\n\t\t * C -> value reg/const \\\n\t\t * \\\n\t\t * Note: intentional difference to register arrangement \\\n\t\t * of e.g. GETPROP; 'A' must contain a register-only value. \\\n\t\t */ \\\n\t\t(void) duk_hobject_putprop(thr, (aarg), (barg), (carg), DUK__STRICT()); \\\n\t\tbreak; \\\n\t}\n#define DUK__DELPROP_BODY(barg,carg) { \\\n\t\t/* A -> result reg \\\n\t\t * B -> object reg \\\n\t\t * C -> key reg/const \\\n\t\t */ \\\n\t\tduk_bool_t rc; \\\n\t\trc = duk_hobject_delprop(thr, (barg), (carg), DUK__STRICT()); \\\n\t\tDUK_ASSERT(rc == 0 || rc == 1); \\\n\t\tDUK__REPLACE_BOOL_A_BREAK(rc); \\\n\t}\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_GETPROP_RR:\n\t\tcase DUK_OP_GETPROP_CR:\n\t\tcase DUK_OP_GETPROP_RC:\n\t\tcase DUK_OP_GETPROP_CC:\n\t\t\tDUK__GETPROP_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\t\tcase DUK_OP_GETPROPC_RR:\n\t\tcase DUK_OP_GETPROPC_CR:\n\t\tcase DUK_OP_GETPROPC_RC:\n\t\tcase DUK_OP_GETPROPC_CC:\n\t\t\tDUK__GETPROPC_BODY(DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n#endif\n\t\tcase DUK_OP_PUTPROP_RR:\n\t\tcase DUK_OP_PUTPROP_CR:\n\t\tcase DUK_OP_PUTPROP_RC:\n\t\tcase DUK_OP_PUTPROP_CC:\n\t\t\tDUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGCONSTP_B(ins), DUK__REGCONSTP_C(ins));\n\t\tcase DUK_OP_DELPROP_RR:\n\t\tcase DUK_OP_DELPROP_RC:  /* B is always reg */\n\t\t\tDUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGCONSTP_C(ins));\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_GETPROP_RR:\n\t\t\tDUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GETPROP_CR:\n\t\t\tDUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GETPROP_RC:\n\t\t\tDUK__GETPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_GETPROP_CC:\n\t\t\tDUK__GETPROP_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\t\tcase DUK_OP_GETPROPC_RR:\n\t\t\tDUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GETPROPC_CR:\n\t\t\tDUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_GETPROPC_RC:\n\t\t\tDUK__GETPROPC_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_GETPROPC_CC:\n\t\t\tDUK__GETPROPC_BODY(DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n#endif\n\t\tcase DUK_OP_PUTPROP_RR:\n\t\t\tDUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_PUTPROP_CR:\n\t\t\tDUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_PUTPROP_RC:\n\t\t\tDUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_PUTPROP_CC:\n\t\t\tDUK__PUTPROP_BODY(DUK__REGP_A(ins), DUK__CONSTP_B(ins), DUK__CONSTP_C(ins));\n\t\tcase DUK_OP_DELPROP_RR:  /* B is always reg */\n\t\t\tDUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__REGP_C(ins));\n\t\tcase DUK_OP_DELPROP_RC:\n\t\t\tDUK__DELPROP_BODY(DUK__REGP_B(ins), DUK__CONSTP_C(ins));\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\t/* No fast path for DECLVAR now, it's quite a rare instruction. */\n\t\tcase DUK_OP_DECLVAR_RR:\n\t\tcase DUK_OP_DECLVAR_CR:\n\t\tcase DUK_OP_DECLVAR_RC:\n\t\tcase DUK_OP_DECLVAR_CC: {\n\t\t\tduk_activation *act;\n\t\t\tduk_small_uint_fast_t a = DUK_DEC_A(ins);\n\t\t\tduk_tval *tv1;\n\t\t\tduk_hstring *name;\n\t\t\tduk_small_uint_t prop_flags;\n\t\t\tduk_bool_t is_func_decl;\n\n\t\t\ttv1 = DUK__REGCONSTP_B(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv1));\n\t\t\tname = DUK_TVAL_GET_STRING(tv1);\n\t\t\tDUK_ASSERT(name != NULL);\n\n\t\t\tis_func_decl = ((a & DUK_BC_DECLVAR_FLAG_FUNC_DECL) != 0);\n\n\t\t\t/* XXX: declvar takes an duk_tval pointer, which is awkward and\n\t\t\t * should be reworked.\n\t\t\t */\n\n\t\t\t/* Compiler is responsible for selecting property flags (configurability,\n\t\t\t * writability, etc).\n\t\t\t */\n\t\t\tprop_flags = a & DUK_PROPDESC_FLAGS_MASK;\n\n\t\t\tif (is_func_decl) {\n\t\t\t\tduk_push_tval(thr, DUK__REGCONSTP_C(ins));\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));  /* valstack policy */\n\t\t\t\tthr->valstack_top++;\n\t\t\t}\n\t\t\ttv1 = DUK_GET_TVAL_NEGIDX(thr, -1);\n\n\t\t\tact = thr->callstack_curr;\n\t\t\tif (duk_js_declvar_activation(thr, act, name, tv1, prop_flags, is_func_decl)) {\n\t\t\t\tif (is_func_decl) {\n\t\t\t\t\t/* Already declared, update value. */\n\t\t\t\t\ttv1 = DUK_GET_TVAL_NEGIDX(thr, -1);\n\t\t\t\t\tduk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT());\n\t\t\t\t} else {\n\t\t\t\t\t/* Already declared but no initializer value\n\t\t\t\t\t * (e.g. 'var xyz;'), no-op.\n\t\t\t\t\t */\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tduk_pop_unsafe(thr);\n\t\t\tbreak;\n\t\t}\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\t/* The compiler should never emit DUK_OP_REGEXP if there is no\n\t\t * regexp support.\n\t\t */\n\t\tcase DUK_OP_REGEXP_RR:\n\t\tcase DUK_OP_REGEXP_CR:\n\t\tcase DUK_OP_REGEXP_RC:\n\t\tcase DUK_OP_REGEXP_CC: {\n\t\t\t/* A -> target register\n\t\t\t * B -> bytecode (also contains flags)\n\t\t\t * C -> escaped source\n\t\t\t */\n\n\t\t\tduk_push_tval(thr, DUK__REGCONSTP_C(ins));\n\t\t\tduk_push_tval(thr, DUK__REGCONSTP_B(ins));  /* -> [ ... escaped_source bytecode ] */\n\t\t\tduk_regexp_create_instance(thr);   /* -> [ ... regexp_instance ] */\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n\t\t}\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\n\t\t/* XXX: 'c' is unused, use whole BC, etc. */\n\t\tcase DUK_OP_CSVAR_RR:\n\t\tcase DUK_OP_CSVAR_CR:\n\t\tcase DUK_OP_CSVAR_RC:\n\t\tcase DUK_OP_CSVAR_CC: {\n\t\t\t/* The speciality of calling through a variable binding is that the\n\t\t\t * 'this' value may be provided by the variable lookup: E5 Section 6.b.i.\n\t\t\t *\n\t\t\t * The only (standard) case where the 'this' binding is non-null is when\n\t\t\t *   (1) the variable is found in an object environment record, and\n\t\t\t *   (2) that object environment record is a 'with' block.\n\t\t\t */\n\n\t\t\tduk_activation *act;\n\t\t\tduk_uint_fast_t idx;\n\t\t\tduk_tval *tv1;\n\t\t\tduk_hstring *name;\n\n\t\t\t/* A -> target registers (A, A + 1) for call setup\n\t\t\t * B -> identifier name, usually constant but can be a register due to shuffling\n\t\t\t */\n\n\t\t\ttv1 = DUK__REGCONSTP_B(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv1));\n\t\t\tname = DUK_TVAL_GET_STRING(tv1);\n\t\t\tDUK_ASSERT(name != NULL);\n\t\t\tact = thr->callstack_curr;\n\t\t\t(void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/);  /* -> [... val this] */\n\n\t\t\tidx = (duk_uint_fast_t) DUK_DEC_A(ins);\n\n\t\t\t/* Could add direct value stack handling. */\n\t\t\tduk_replace(thr, (duk_idx_t) (idx + 1));  /* 'this' binding */\n\t\t\tduk_replace(thr, (duk_idx_t) idx);        /* variable value (function, we hope, not checked here) */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_CLOSURE: {\n\t\t\tduk_activation *act;\n\t\t\tduk_hcompfunc *fun_act;\n\t\t\tduk_small_uint_fast_t bc = DUK_DEC_BC(ins);\n\t\t\tduk_hobject *fun_temp;\n\n\t\t\t/* A -> target reg\n\t\t\t * BC -> inner function index\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"CLOSURE to target register %ld, fnum %ld (count %ld)\",\n\t\t\t                     (long) DUK_DEC_A(ins), (long) DUK_DEC_BC(ins), (long) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN())));\n\n\t\t\tDUK_ASSERT_DISABLE(bc >= 0); /* unsigned */\n\t\t\tDUK_ASSERT((duk_uint_t) bc < (duk_uint_t) DUK_HCOMPFUNC_GET_FUNCS_COUNT(thr->heap, DUK__FUN()));\n\n\t\t\tact = thr->callstack_curr;\n\t\t\tfun_act = (duk_hcompfunc *) DUK_ACT_GET_FUNC(act);\n\t\t\tfun_temp = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, fun_act)[bc];\n\t\t\tDUK_ASSERT(fun_temp != NULL);\n\t\t\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC(fun_temp));\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"CLOSURE: function template is: %p -> %!O\",\n\t\t\t                     (void *) fun_temp, (duk_heaphdr *) fun_temp));\n\n\t\t\tif (act->lex_env == NULL) {\n\t\t\t\tDUK_ASSERT(act->var_env == NULL);\n\t\t\t\tduk_js_init_activation_environment_records_delayed(thr, act);\n\t\t\t\tact = thr->callstack_curr;\n\t\t\t}\n\t\t\tDUK_ASSERT(act->lex_env != NULL);\n\t\t\tDUK_ASSERT(act->var_env != NULL);\n\n\t\t\t/* functions always have a NEWENV flag, i.e. they get a\n\t\t\t * new variable declaration environment, so only lex_env\n\t\t\t * matters here.\n\t\t\t */\n\t\t\tduk_js_push_closure(thr,\n\t\t\t                    (duk_hcompfunc *) fun_temp,\n\t\t\t                    act->var_env,\n\t\t\t                    act->lex_env,\n\t\t\t                    1 /*add_auto_proto*/);\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n\t\t}\n\n\t\tcase DUK_OP_GETVAR: {\n\t\t\tduk_activation *act;\n\t\t\tduk_tval *tv1;\n\t\t\tduk_hstring *name;\n\n\t\t\ttv1 = DUK__CONSTP_BC(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv1));\n\t\t\tname = DUK_TVAL_GET_STRING(tv1);\n\t\t\tDUK_ASSERT(name != NULL);\n\t\t\tact = thr->callstack_curr;\n\t\t\tDUK_ASSERT(act != NULL);\n\t\t\t(void) duk_js_getvar_activation(thr, act, name, 1 /*throw*/);  /* -> [... val this] */\n\t\t\tduk_pop_unsafe(thr);  /* 'this' binding is not needed here */\n\t\t\tDUK__REPLACE_TOP_A_BREAK();\n\t\t}\n\n\t\tcase DUK_OP_PUTVAR: {\n\t\t\tduk_activation *act;\n\t\t\tduk_tval *tv1;\n\t\t\tduk_hstring *name;\n\n\t\t\ttv1 = DUK__CONSTP_BC(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv1));\n\t\t\tname = DUK_TVAL_GET_STRING(tv1);\n\t\t\tDUK_ASSERT(name != NULL);\n\n\t\t\t/* XXX: putvar takes a duk_tval pointer, which is awkward and\n\t\t\t * should be reworked.\n\t\t\t */\n\n\t\t\ttv1 = DUK__REGP_A(ins);  /* val */\n\t\t\tact = thr->callstack_curr;\n\t\t\tduk_js_putvar_activation(thr, act, name, tv1, DUK__STRICT());\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_DELVAR: {\n\t\t\tduk_activation *act;\n\t\t\tduk_tval *tv1;\n\t\t\tduk_hstring *name;\n\t\t\tduk_bool_t rc;\n\n\t\t\ttv1 = DUK__CONSTP_BC(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_STRING(tv1));\n\t\t\tname = DUK_TVAL_GET_STRING(tv1);\n\t\t\tDUK_ASSERT(name != NULL);\n\t\t\tact = thr->callstack_curr;\n\t\t\trc = duk_js_delvar_activation(thr, act, name);\n\t\t\tDUK__REPLACE_BOOL_A_BREAK(rc);\n\t\t}\n\n\t\tcase DUK_OP_JUMP: {\n\t\t\t/* Note: without explicit cast to signed, MSVC will\n\t\t\t * apparently generate a large positive jump when the\n\t\t\t * bias-corrected value would normally be negative.\n\t\t\t */\n\t\t\tcurr_pc += (duk_int_fast_t) DUK_DEC_ABC(ins) - (duk_int_fast_t) DUK_BC_JUMP_BIAS;\n\t\t\tbreak;\n\t\t}\n\n#define DUK__RETURN_SHARED() do { \\\n\t\tduk_small_uint_t ret_result; \\\n\t\t/* duk__handle_return() is guaranteed never to throw, except \\\n\t\t * for potential out-of-memory situations which will then \\\n\t\t * propagate out of the executor longjmp handler. \\\n\t\t */ \\\n\t\tDUK_ASSERT(thr->ptr_curr_pc == NULL); \\\n\t\tret_result = duk__handle_return(thr, entry_act); \\\n\t\tif (ret_result == DUK__RETHAND_RESTART) { \\\n\t\t\tgoto restart_execution; \\\n\t\t} \\\n\t\tDUK_ASSERT(ret_result == DUK__RETHAND_FINISHED); \\\n\t\treturn; \\\n\t} while (0)\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t\tcase DUK_OP_RETREG:\n\t\tcase DUK_OP_RETCONST:\n\t\tcase DUK_OP_RETCONSTN:\n\t\tcase DUK_OP_RETUNDEF: {\n\t\t\t /* BC -> return value reg/const */\n\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\n\t\t\tif (op == DUK_OP_RETREG) {\n\t\t\t\tduk_push_tval(thr, DUK__REGP_BC(ins));\n\t\t\t} else if (op == DUK_OP_RETUNDEF) {\n\t\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));  /* valstack policy */\n\t\t\t\tthr->valstack_top++;\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(op == DUK_OP_RETCONST || op == DUK_OP_RETCONSTN);\n\t\t\t\tduk_push_tval(thr, DUK__CONSTP_BC(ins));\n\t\t\t}\n\n\t\t\tDUK__RETURN_SHARED();\n\t\t}\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tcase DUK_OP_RETREG: {\n\t\t\tduk_tval *tv;\n\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\t\t\ttv = DUK__REGP_BC(ins);\n\t\t\tDUK_TVAL_SET_TVAL(thr->valstack_top, tv);\n\t\t\tDUK_TVAL_INCREF(thr, tv);\n\t\t\tthr->valstack_top++;\n\t\t\tDUK__RETURN_SHARED();\n\t\t}\n\t\t/* This will be unused without refcounting. */\n\t\tcase DUK_OP_RETCONST: {\n\t\t\tduk_tval *tv;\n\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\t\t\ttv = DUK__CONSTP_BC(ins);\n\t\t\tDUK_TVAL_SET_TVAL(thr->valstack_top, tv);\n\t\t\tDUK_TVAL_INCREF(thr, tv);\n\t\t\tthr->valstack_top++;\n\t\t\tDUK__RETURN_SHARED();\n\t\t}\n\t\tcase DUK_OP_RETCONSTN: {\n\t\t\tduk_tval *tv;\n\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\t\t\ttv = DUK__CONSTP_BC(ins);\n\t\t\tDUK_TVAL_SET_TVAL(thr->valstack_top, tv);\n#if defined(DUK_USE_REFERENCE_COUNTING)\n\t\t\t/* Without refcounting only RETCONSTN is used. */\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_HEAP_ALLOCATED(tv));  /* no INCREF for this constant */\n#endif\n\t\t\tthr->valstack_top++;\n\t\t\tDUK__RETURN_SHARED();\n\t\t}\n\t\tcase DUK_OP_RETUNDEF: {\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\t\t\tthr->valstack_top++;  /* value at valstack top is already undefined by valstack policy */\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_UNDEFINED(thr->valstack_top));\n\t\t\tDUK__RETURN_SHARED();\n\t\t}\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\n\t\tcase DUK_OP_LABEL: {\n\t\t\tduk_activation *act;\n\t\t\tduk_catcher *cat;\n\t\t\tduk_small_uint_fast_t bc = DUK_DEC_BC(ins);\n\n\t\t\t/* Allocate catcher and populate it (must be atomic). */\n\n\t\t\tcat = duk_hthread_catcher_alloc(thr);\n\t\t\tDUK_ASSERT(cat != NULL);\n\n\t\t\tcat->flags = (duk_uint32_t) (DUK_CAT_TYPE_LABEL | (bc << DUK_CAT_LABEL_SHIFT));\n\t\t\tcat->pc_base = (duk_instr_t *) curr_pc;  /* pre-incremented, points to first jump slot */\n\t\t\tcat->idx_base = 0;  /* unused for label */\n\t\t\tcat->h_varname = NULL;\n\n\t\t\tact = thr->callstack_curr;\n\t\t\tDUK_ASSERT(act != NULL);\n\t\t\tcat->parent = act->cat;\n\t\t\tact->cat = cat;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"LABEL catcher: flags=0x%08lx, pc_base=%ld, \"\n\t\t\t                     \"idx_base=%ld, h_varname=%!O, label_id=%ld\",\n\t\t\t                     (long) cat->flags, (long) cat->pc_base,\n\t\t\t                     (long) cat->idx_base, (duk_heaphdr *) cat->h_varname, (long) DUK_CAT_GET_LABEL(cat)));\n\n\t\t\tcurr_pc += 2;  /* skip jump slots */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_ENDLABEL: {\n\t\t\tduk_activation *act;\n#if (defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)) || defined(DUK_USE_ASSERTIONS)\n\t\t\tduk_small_uint_fast_t bc = DUK_DEC_BC(ins);\n#endif\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"ENDLABEL %ld\", (long) bc));\n#endif\n\n\t\t\tact = thr->callstack_curr;\n\t\t\tDUK_ASSERT(act->cat != NULL);\n\t\t\tDUK_ASSERT(DUK_CAT_GET_TYPE(act->cat) == DUK_CAT_TYPE_LABEL);\n\t\t\tDUK_ASSERT((duk_uint_fast_t) DUK_CAT_GET_LABEL(act->cat) == bc);\n\t\t\tduk_hthread_catcher_unwind_nolexenv_norz(thr, act);\n\n\t\t\t/* no need to unwind callstack */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_BREAK: {\n\t\t\tduk_small_uint_fast_t bc = DUK_DEC_BC(ins);\n\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\t\t\tduk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_BREAK);\n\t\t\tgoto restart_execution;\n\t\t}\n\n\t\tcase DUK_OP_CONTINUE: {\n\t\t\tduk_small_uint_fast_t bc = DUK_DEC_BC(ins);\n\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\t\t\tduk__handle_break_or_continue(thr, (duk_uint_t) bc, DUK_LJ_TYPE_CONTINUE);\n\t\t\tgoto restart_execution;\n\t\t}\n\n\t\t/* XXX: move to helper, too large to be inline here */\n\t\tcase DUK_OP_TRYCATCH: {\n\t\t\tduk__handle_op_trycatch(thr, ins, curr_pc);\n\t\t\tcurr_pc += 2;  /* skip jump slots */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_ENDTRY: {\n\t\t\tcurr_pc = duk__handle_op_endtry(thr, ins);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_ENDCATCH: {\n\t\t\tduk__handle_op_endcatch(thr, ins);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_ENDFIN: {\n\t\t\t/* Sync and NULL early. */\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\n\t\t\tif (duk__handle_op_endfin(thr, ins, entry_act) != 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t/* Must restart because we NULLed out curr_pc. */\n\t\t\tgoto restart_execution;\n\t\t}\n\n\t\tcase DUK_OP_THROW: {\n\t\t\tduk_small_uint_fast_t bc = DUK_DEC_BC(ins);\n\n\t\t\t/* Note: errors are augmented when they are created, not\n\t\t\t * when they are thrown.  So, don't augment here, it would\n\t\t\t * break re-throwing for instance.\n\t\t\t */\n\n\t\t\t/* Sync so that augmentation sees up-to-date activations, NULL\n\t\t\t * thr->ptr_curr_pc so that it's not used if side effects occur\n\t\t\t * in augmentation or longjmp handling.\n\t\t\t */\n\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\n\t\t\tduk_dup(thr, (duk_idx_t) bc);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"THROW ERROR (BYTECODE): %!dT (before throw augment)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n#if defined(DUK_USE_AUGMENT_ERROR_THROW)\n\t\t\tduk_err_augment_error_throw(thr);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"THROW ERROR (BYTECODE): %!dT (after throw augment)\",\n\t\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n#endif\n\n\t\t\tduk_err_setup_ljstate1(thr, DUK_LJ_TYPE_THROW, DUK_GET_TVAL_NEGIDX(thr, -1));\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t\t\tduk_err_check_debugger_integration(thr);\n#endif\n\n\t\t\tDUK_ASSERT(thr->heap->lj.jmpbuf_ptr != NULL);  /* always in executor */\n\t\t\tduk_err_longjmp(thr);\n\t\t\tDUK_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_CSREG: {\n\t\t\t/*\n\t\t\t *  Assuming a register binds to a variable declared within this\n\t\t\t *  function (a declarative binding), the 'this' for the call\n\t\t\t *  setup is always 'undefined'.  E5 Section 10.2.1.1.6.\n\t\t\t */\n\n\t\t\tduk_small_uint_fast_t a = DUK_DEC_A(ins);\n\t\t\tduk_small_uint_fast_t bc = DUK_DEC_BC(ins);\n\n\t\t\t/* A -> register containing target function (not type checked here)\n\t\t\t * BC -> target registers (BC, BC + 1) for call setup\n\t\t\t */\n\n#if defined(DUK_USE_PREFER_SIZE)\n\t\t\tduk_dup(thr, (duk_idx_t) a);\n\t\t\tduk_replace(thr, (duk_idx_t) bc);\n\t\t\tduk_to_undefined(thr, (duk_idx_t) (bc + 1));\n#else\n\t\t\tduk_tval *tv1;\n\t\t\tduk_tval *tv2;\n\t\t\tduk_tval *tv3;\n\t\t\tduk_tval tv_tmp1;\n\t\t\tduk_tval tv_tmp2;\n\n\t\t\ttv1 = DUK__REGP(bc);\n\t\t\ttv2 = tv1 + 1;\n\t\t\tDUK_TVAL_SET_TVAL(&tv_tmp1, tv1);\n\t\t\tDUK_TVAL_SET_TVAL(&tv_tmp2, tv2);\n\t\t\ttv3 = DUK__REGP(a);\n\t\t\tDUK_TVAL_SET_TVAL(tv1, tv3);\n\t\t\tDUK_TVAL_INCREF(thr, tv1);  /* no side effects */\n\t\t\tDUK_TVAL_SET_UNDEFINED(tv2);  /* no need for incref */\n\t\t\tDUK_TVAL_DECREF(thr, &tv_tmp1);\n\t\t\tDUK_TVAL_DECREF(thr, &tv_tmp2);\n#endif\n\t\t\tbreak;\n\t\t}\n\n\n\t\t/* XXX: in some cases it's faster NOT to reuse the value\n\t\t * stack but rather copy the arguments on top of the stack\n\t\t * (mainly when the calling value stack is large and the value\n\t\t * stack resize would be large).\n\t\t */\n\n\t\tcase DUK_OP_CALL0:\n\t\tcase DUK_OP_CALL1:\n\t\tcase DUK_OP_CALL2:\n\t\tcase DUK_OP_CALL3:\n\t\tcase DUK_OP_CALL4:\n\t\tcase DUK_OP_CALL5:\n\t\tcase DUK_OP_CALL6:\n\t\tcase DUK_OP_CALL7: {\n\t\t\t/* Opcode packs 4 flag bits: 1 for indirect, 3 map\n\t\t\t * 1:1 to three lowest call handling flags.\n\t\t\t *\n\t\t\t * A -> nargs or register with nargs (indirect)\n\t\t\t * BC -> base register for call (base -> func, base+1 -> this, base+2 -> arg1 ... base+2+N-1 -> argN)\n\t\t\t */\n\n\t\t\tduk_idx_t nargs;\n\t\t\tduk_idx_t idx;\n\t\t\tduk_small_uint_t call_flags;\n#if !defined(DUK_USE_EXEC_FUN_LOCAL)\n\t\t\tduk_hcompfunc *fun;\n#endif\n\n\t\t\tDUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0);\n\t\t\tDUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) == 0);\n\n\t\t\tnargs = (duk_idx_t) DUK_DEC_A(ins);\n\t\t\tcall_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA;\n\t\t\tidx = (duk_idx_t) DUK_DEC_BC(ins);\n\n\t\t\tif (duk__executor_handle_call(thr, idx, nargs, call_flags)) {\n\t\t\t\t/* curr_pc synced by duk_handle_call_unprotected() */\n\t\t\t\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\t\t\t\tgoto restart_execution;\n\t\t\t}\n\t\t\tDUK_ASSERT(thr->ptr_curr_pc != NULL);\n\n\t\t\t/* duk_js_call.c is required to restore the stack reserve\n\t\t\t * so we only need to reset the top.\n\t\t\t */\n#if !defined(DUK_USE_EXEC_FUN_LOCAL)\n\t\t\tfun = DUK__FUN();\n#endif\n\t\t\tduk_set_top_unsafe(thr, (duk_idx_t) fun->nregs);\n\n\t\t\t/* No need to reinit setjmp() catchpoint, as call handling\n\t\t\t * will store and restore our state.\n\t\t\t *\n\t\t\t * When debugger is enabled, we need to recheck the activation\n\t\t\t * status after returning.  This is now handled by call handling\n\t\t\t * and heap->dbg_force_restart.\n\t\t\t */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_CALL8:\n\t\tcase DUK_OP_CALL9:\n\t\tcase DUK_OP_CALL10:\n\t\tcase DUK_OP_CALL11:\n\t\tcase DUK_OP_CALL12:\n\t\tcase DUK_OP_CALL13:\n\t\tcase DUK_OP_CALL14:\n\t\tcase DUK_OP_CALL15: {\n\t\t\t/* Indirect variant. */\n\t\t\tduk_uint_fast_t nargs;\n\t\t\tduk_idx_t idx;\n\t\t\tduk_small_uint_t call_flags;\n#if !defined(DUK_USE_EXEC_FUN_LOCAL)\n\t\t\tduk_hcompfunc *fun;\n#endif\n\n\t\t\tDUK_ASSERT((DUK_OP_CALL0 & 0x0fU) == 0);\n\t\t\tDUK_ASSERT((ins & DUK_BC_CALL_FLAG_INDIRECT) != 0);\n\n\t\t\tnargs = (duk_uint_fast_t) DUK_DEC_A(ins);\n\t\t\tDUK__LOOKUP_INDIRECT(nargs);\n\t\t\tcall_flags = (ins & 0x07U) | DUK_CALL_FLAG_ALLOW_ECMATOECMA;\n\t\t\tidx = (duk_idx_t) DUK_DEC_BC(ins);\n\n\t\t\tif (duk__executor_handle_call(thr, idx, (duk_idx_t) nargs, call_flags)) {\n\t\t\t\tDUK_ASSERT(thr->ptr_curr_pc == NULL);\n\t\t\t\tgoto restart_execution;\n\t\t\t}\n\t\t\tDUK_ASSERT(thr->ptr_curr_pc != NULL);\n\n#if !defined(DUK_USE_EXEC_FUN_LOCAL)\n\t\t\tfun = DUK__FUN();\n#endif\n\t\t\tduk_set_top_unsafe(thr, (duk_idx_t) fun->nregs);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_NEWOBJ: {\n\t\t\tduk_push_object(thr);\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\t{\n\t\t\t\tduk_hobject *h;\n\t\t\t\th = duk_require_hobject(thr, -1);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0);\n\t\t\t}\n#endif\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\t\t/* XXX: could do a direct props realloc, but need hash size */\n\t\t\tduk_hobject_resize_entrypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins));\n#endif\n\t\t\tDUK__REPLACE_TOP_BC_BREAK();\n\t\t}\n\n\t\tcase DUK_OP_NEWARR: {\n\t\t\tduk_push_array(thr);\n#if defined(DUK_USE_ASSERTIONS)\n\t\t\t{\n\t\t\t\tduk_hobject *h;\n\t\t\t\th = duk_require_hobject(thr, -1);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_ESIZE(h) == 0);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_ENEXT(h) == 0);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_ASIZE(h) == 0);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_HSIZE(h) == 0);\n\t\t\t\tDUK_ASSERT(DUK_HOBJECT_HAS_ARRAY_PART(h));\n\t\t\t}\n#endif\n#if !defined(DUK_USE_PREFER_SIZE)\n\t\t\tduk_hobject_realloc_props(thr,\n\t\t\t                          duk_known_hobject(thr, -1),\n\t\t\t                          0 /*new_e_size*/,\n\t\t\t                          DUK_DEC_A(ins) /*new_a_size*/,\n\t\t\t                          0 /*new_h_size*/,\n\t\t\t                          0 /*abandon_array*/);\n#if 0\n\t\t\tduk_hobject_resize_arraypart(thr, duk_known_hobject(thr, -1), DUK_DEC_A(ins));\n#endif\n#endif\n\t\t\tDUK__REPLACE_TOP_BC_BREAK();\n\t\t}\n\n\t\tcase DUK_OP_MPUTOBJ:\n\t\tcase DUK_OP_MPUTOBJI: {\n\t\t\tduk_idx_t obj_idx;\n\t\t\tduk_uint_fast_t idx, idx_end;\n\t\t\tduk_small_uint_fast_t count;\n\n\t\t\t/* A -> register of target object\n\t\t\t * B -> first register of key/value pair list\n\t\t\t *      or register containing first register number if indirect\n\t\t\t * C -> number of key/value pairs * 2\n\t\t\t *      (= number of value stack indices used starting from 'B')\n\t\t\t */\n\n\t\t\tobj_idx = DUK_DEC_A(ins);\n\t\t\tDUK_ASSERT(duk_is_object(thr, obj_idx));\n\n\t\t\tidx = (duk_uint_fast_t) DUK_DEC_B(ins);\n\t\t\tif (DUK_DEC_OP(ins) == DUK_OP_MPUTOBJI) {\n\t\t\t\tDUK__LOOKUP_INDIRECT(idx);\n\t\t\t}\n\n\t\t\tcount = (duk_small_uint_fast_t) DUK_DEC_C(ins);\n\t\t\tDUK_ASSERT(count > 0);  /* compiler guarantees */\n\t\t\tidx_end = idx + count;\n\n#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK)\n\t\t\tif (DUK_UNLIKELY(idx_end > (duk_uint_fast_t) duk_get_top(thr))) {\n\t\t\t\t/* XXX: use duk_is_valid_index() instead? */\n\t\t\t\t/* XXX: improve check; check against nregs, not against top */\n\t\t\t\tDUK__INTERNAL_ERROR(\"MPUTOBJ out of bounds\");\n\t\t\t}\n#endif\n\n\t\t\t/* Use 'force' flag to duk_def_prop() to ensure that any\n\t\t\t * inherited properties don't prevent the operation.\n\t\t\t * With ES2015 duplicate properties are allowed, so that we\n\t\t\t * must overwrite any previous data or accessor property.\n\t\t\t *\n\t\t\t * With ES2015 computed property names the literal keys\n\t\t\t * may be arbitrary values and need to be ToPropertyKey()\n\t\t\t * coerced at runtime.\n\t\t\t */\n\t\t\tdo {\n\t\t\t\t/* XXX: faster initialization (direct access or better primitives) */\n\t\t\t\tduk_dup(thr, (duk_idx_t) idx);\n\t\t\t\tduk_dup(thr, (duk_idx_t) (idx + 1));\n\t\t\t\tduk_def_prop(thr, obj_idx, DUK_DEFPROP_HAVE_VALUE |\n\t\t\t\t                           DUK_DEFPROP_FORCE |\n\t\t\t\t                           DUK_DEFPROP_SET_WRITABLE |\n\t\t\t\t                           DUK_DEFPROP_SET_ENUMERABLE |\n\t\t\t\t                           DUK_DEFPROP_SET_CONFIGURABLE);\n\t\t\t\tidx += 2;\n\t\t\t} while (idx < idx_end);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_INITSET:\n\t\tcase DUK_OP_INITGET: {\n\t\t\tduk__handle_op_initset_initget(thr, ins);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_MPUTARR:\n\t\tcase DUK_OP_MPUTARRI: {\n\t\t\tduk_idx_t obj_idx;\n\t\t\tduk_uint_fast_t idx, idx_end;\n\t\t\tduk_small_uint_fast_t count;\n\t\t\tduk_tval *tv1;\n\t\t\tduk_uint32_t arr_idx;\n\n\t\t\t/* A -> register of target object\n\t\t\t * B -> first register of value data (start_index, value1, value2, ..., valueN)\n\t\t\t *      or register containing first register number if indirect\n\t\t\t * C -> number of key/value pairs (N)\n\t\t\t */\n\n\t\t\tobj_idx = DUK_DEC_A(ins);\n\t\t\tDUK_ASSERT(duk_is_object(thr, obj_idx));\n\n\t\t\tidx = (duk_uint_fast_t) DUK_DEC_B(ins);\n\t\t\tif (DUK_DEC_OP(ins) == DUK_OP_MPUTARRI) {\n\t\t\t\tDUK__LOOKUP_INDIRECT(idx);\n\t\t\t}\n\n\t\t\tcount = (duk_small_uint_fast_t) DUK_DEC_C(ins);\n\t\t\tDUK_ASSERT(count > 0 + 1);  /* compiler guarantees */\n\t\t\tidx_end = idx + count;\n\n#if defined(DUK_USE_EXEC_INDIRECT_BOUND_CHECK)\n\t\t\tif (idx_end > (duk_uint_fast_t) duk_get_top(thr)) {\n\t\t\t\t/* XXX: use duk_is_valid_index() instead? */\n\t\t\t\t/* XXX: improve check; check against nregs, not against top */\n\t\t\t\tDUK__INTERNAL_ERROR(\"MPUTARR out of bounds\");\n\t\t\t}\n#endif\n\n\t\t\ttv1 = DUK__REGP(idx);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));\n#if defined(DUK_USE_FASTINT)\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));\n\t\t\tarr_idx = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1);\n#else\n\t\t\tarr_idx = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1);\n#endif\n\t\t\tidx++;\n\n\t\t\tdo {\n\t\t\t\t/* duk_xdef_prop() will define an own property without any array\n\t\t\t\t * special behaviors.  We'll need to set the array length explicitly\n\t\t\t\t * in the end.  For arrays with elisions, the compiler will emit an\n\t\t\t\t * explicit SETALEN which will update the length.\n\t\t\t\t */\n\n\t\t\t\t/* XXX: because we're dealing with 'own' properties of a fresh array,\n\t\t\t\t * the array initializer should just ensure that the array has a large\n\t\t\t\t * enough array part and write the values directly into array part,\n\t\t\t\t * and finally set 'length' manually in the end (as already happens now).\n\t\t\t\t */\n\n\t\t\t\tduk_dup(thr, (duk_idx_t) idx);\n\t\t\t\tduk_xdef_prop_index_wec(thr, obj_idx, arr_idx);\n\n\t\t\t\tidx++;\n\t\t\t\tarr_idx++;\n\t\t\t} while (idx < idx_end);\n\n\t\t\t/* XXX: E5.1 Section 11.1.4 coerces the final length through\n\t\t\t * ToUint32() which is odd but happens now as a side effect of\n\t\t\t * 'arr_idx' type.\n\t\t\t */\n\t\t\tduk_set_length(thr, obj_idx, (duk_size_t) (duk_uarridx_t) arr_idx);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_SETALEN: {\n\t\t\tduk_tval *tv1;\n\t\t\tduk_hobject *h;\n\t\t\tduk_uint32_t len;\n\n\t\t\ttv1 = DUK__REGP_A(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1));\n\t\t\th = DUK_TVAL_GET_OBJECT(tv1);\n\t\t\tDUK_ASSERT(DUK_HOBJECT_IS_ARRAY(h));\n\n\t\t\ttv1 = DUK__REGP_BC(ins);\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv1));\n#if defined(DUK_USE_FASTINT)\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv1));\n\t\t\tlen = (duk_uint32_t) DUK_TVAL_GET_FASTINT_U32(tv1);\n#else\n\t\t\tlen = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv1);\n#endif\n\t\t\t((duk_harray *) h)->length = len;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_INITENUM: {\n\t\t\tduk__handle_op_initenum(thr, ins);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_NEXTENUM: {\n\t\t\tcurr_pc += duk__handle_op_nextenum(thr, ins);\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_INVLHS: {\n\t\t\tDUK_ERROR_REFERENCE(thr, DUK_STR_INVALID_LVALUE);\n\t\t\tDUK_UNREACHABLE();\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_DEBUGGER: {\n\t\t\t/* Opcode only emitted by compiler when debugger\n\t\t\t * support is enabled.  Ignore it silently without\n\t\t\t * debugger support, in case it has been loaded\n\t\t\t * from precompiled bytecode.\n\t\t\t */\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\t\t\tif (duk_debug_is_attached(thr->heap)) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"DEBUGGER statement encountered, halt execution\"));\n\t\t\t\tDUK__SYNC_AND_NULL_CURR_PC();\n\t\t\t\tduk_debug_halt_execution(thr, 1 /*use_prev_pc*/);\n\t\t\t\tDUK_D(DUK_DPRINT(\"DEBUGGER statement finished, resume execution\"));\n\t\t\t\tgoto restart_execution;\n\t\t\t} else {\n\t\t\t\tDUK_D(DUK_DPRINT(\"DEBUGGER statement ignored, debugger not attached\"));\n\t\t\t}\n#else\n\t\t\tDUK_D(DUK_DPRINT(\"DEBUGGER statement ignored, no debugger support\"));\n#endif\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_NOP: {\n\t\t\t/* Nop, ignored, but ABC fields may carry a value e.g.\n\t\t\t * for indirect opcode handling.\n\t\t\t */\n\t\t\tbreak;\n\t\t}\n\n\t\tcase DUK_OP_INVALID: {\n\t\t\tDUK_ERROR_FMT1(thr, DUK_ERR_ERROR, \"INVALID opcode (%ld)\", (long) DUK_DEC_ABC(ins));\n\t\t\tbreak;\n\t\t}\n\n#if defined(DUK_USE_ES6)\n\t\tcase DUK_OP_NEWTARGET: {\n\t\t\t/* https://www.ecma-international.org/ecma-262/6.0/#sec-meta-properties-runtime-semantics-evaluation\n\t\t\t * https://www.ecma-international.org/ecma-262/6.0/#sec-getnewtarget\n\t\t\t *\n\t\t\t * No newTarget support now, so as a first approximation\n\t\t\t * use the resolved (non-bound) target function.\n\t\t\t */\n\t\t\t/* XXX: C API: push_new_target()? */\n\t\t\tduk_activation *act;\n\n\t\t\tact = thr->callstack_curr;\n\t\t\tDUK_ASSERT(act != NULL);\n\n\t\t\t/* Check CONSTRUCT flag from current function, or if running\n\t\t\t * direct eval, from a non-direct-eval parent (with possibly\n\t\t\t * more than one nested direct eval).  An alternative to this\n\t\t\t * would be to store [[NewTarget]] as a hidden symbol of the\n\t\t\t * lexical scope, and then just look up that variable.\n\t\t\t */\n\t\t\tfor (;;) {\n\t\t\t\tif (act == NULL) {\n\t\t\t\t\tduk_push_undefined(thr);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (act->flags & DUK_ACT_FLAG_CONSTRUCT) {\n\t\t\t\t\tduk_push_tval(thr, &act->tv_func);\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (act->flags & DUK_ACT_FLAG_DIRECT_EVAL) {\n\t\t\t\t\tact = act->parent;\n\t\t\t\t} else {\n\t\t\t\t\tduk_push_undefined(thr);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDUK__REPLACE_TOP_BC_BREAK();\n\t\t}\n#endif  /* DUK_USE_ES6 */\n\n#if !defined(DUK_USE_EXEC_PREFER_SIZE)\n#if !defined(DUK_USE_ES7_EXP_OPERATOR)\n\t\tcase DUK_OP_EXP_RR:\n\t\tcase DUK_OP_EXP_CR:\n\t\tcase DUK_OP_EXP_RC:\n\t\tcase DUK_OP_EXP_CC:\n#endif\n#if !defined(DUK_USE_ES6)\n\t\tcase DUK_OP_NEWTARGET:\n#endif\n#if !defined(DUK_USE_VERBOSE_ERRORS)\n\t\tcase DUK_OP_GETPROPC_RR:\n\t\tcase DUK_OP_GETPROPC_CR:\n\t\tcase DUK_OP_GETPROPC_RC:\n\t\tcase DUK_OP_GETPROPC_CC:\n#endif\n\t\tcase DUK_OP_UNUSED207:\n\t\tcase DUK_OP_UNUSED212:\n\t\tcase DUK_OP_UNUSED213:\n\t\tcase DUK_OP_UNUSED214:\n\t\tcase DUK_OP_UNUSED215:\n\t\tcase DUK_OP_UNUSED216:\n\t\tcase DUK_OP_UNUSED217:\n\t\tcase DUK_OP_UNUSED218:\n\t\tcase DUK_OP_UNUSED219:\n\t\tcase DUK_OP_UNUSED220:\n\t\tcase DUK_OP_UNUSED221:\n\t\tcase DUK_OP_UNUSED222:\n\t\tcase DUK_OP_UNUSED223:\n\t\tcase DUK_OP_UNUSED224:\n\t\tcase DUK_OP_UNUSED225:\n\t\tcase DUK_OP_UNUSED226:\n\t\tcase DUK_OP_UNUSED227:\n\t\tcase DUK_OP_UNUSED228:\n\t\tcase DUK_OP_UNUSED229:\n\t\tcase DUK_OP_UNUSED230:\n\t\tcase DUK_OP_UNUSED231:\n\t\tcase DUK_OP_UNUSED232:\n\t\tcase DUK_OP_UNUSED233:\n\t\tcase DUK_OP_UNUSED234:\n\t\tcase DUK_OP_UNUSED235:\n\t\tcase DUK_OP_UNUSED236:\n\t\tcase DUK_OP_UNUSED237:\n\t\tcase DUK_OP_UNUSED238:\n\t\tcase DUK_OP_UNUSED239:\n\t\tcase DUK_OP_UNUSED240:\n\t\tcase DUK_OP_UNUSED241:\n\t\tcase DUK_OP_UNUSED242:\n\t\tcase DUK_OP_UNUSED243:\n\t\tcase DUK_OP_UNUSED244:\n\t\tcase DUK_OP_UNUSED245:\n\t\tcase DUK_OP_UNUSED246:\n\t\tcase DUK_OP_UNUSED247:\n\t\tcase DUK_OP_UNUSED248:\n\t\tcase DUK_OP_UNUSED249:\n\t\tcase DUK_OP_UNUSED250:\n\t\tcase DUK_OP_UNUSED251:\n\t\tcase DUK_OP_UNUSED252:\n\t\tcase DUK_OP_UNUSED253:\n\t\tcase DUK_OP_UNUSED254:\n\t\tcase DUK_OP_UNUSED255:\n\t\t/* Force all case clauses to map to an actual handler\n\t\t * so that the compiler can emit a jump without a bounds\n\t\t * check: the switch argument is a duk_uint8_t so that\n\t\t * the compiler may be able to figure it out.  This is\n\t\t * a small detail and obviously compiler dependent.\n\t\t */\n\t\t/* default: clause omitted on purpose */\n#else  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\tdefault:\n#endif  /* DUK_USE_EXEC_PREFER_SIZE */\n\t\t{\n\t\t\t/* Default case catches invalid/unsupported opcodes. */\n\t\t\tDUK_D(DUK_DPRINT(\"invalid opcode: %ld - %!I\", (long) op, ins));\n\t\t\tDUK__INTERNAL_ERROR(\"invalid opcode\");\n\t\t\tbreak;\n\t\t}\n\n\t\t}  /* end switch */\n\n\t\tcontinue;\n\n\t\t/* Some shared exit paths for opcode handling below.  These\n\t\t * are mostly useful to reduce code footprint when multiple\n\t\t * opcodes have a similar epilogue (like replacing stack top\n\t\t * with index 'a').\n\t\t */\n\n#if defined(DUK_USE_EXEC_PREFER_SIZE)\n\t replace_top_a:\n\t\tDUK__REPLACE_TO_TVPTR(thr, DUK__REGP_A(ins));\n\t\tcontinue;\n\t replace_top_bc:\n\t\tDUK__REPLACE_TO_TVPTR(thr, DUK__REGP_BC(ins));\n\t\tcontinue;\n#endif\n\t}\n\tDUK_UNREACHABLE();\n\n#if !defined(DUK_USE_VERBOSE_EXECUTOR_ERRORS)\n internal_error:\n\tDUK_ERROR_INTERNAL(thr);\n#endif\n}\n\n/* automatic undefs */\n#undef DUK__BYTEOFF_A\n#undef DUK__BYTEOFF_B\n#undef DUK__BYTEOFF_BC\n#undef DUK__BYTEOFF_C\n#undef DUK__COMPARE_BODY\n#undef DUK__CONST\n#undef DUK__CONSTP\n#undef DUK__CONSTP_A\n#undef DUK__CONSTP_B\n#undef DUK__CONSTP_BC\n#undef DUK__CONSTP_C\n#undef DUK__DELPROP_BODY\n#undef DUK__EQ_BODY\n#undef DUK__FUN\n#undef DUK__GETPROPC_BODY\n#undef DUK__GETPROP_BODY\n#undef DUK__GE_BODY\n#undef DUK__GT_BODY\n#undef DUK__INLINE_PERF\n#undef DUK__INSTOF_BODY\n#undef DUK__INTERNAL_ERROR\n#undef DUK__INT_NOACTION\n#undef DUK__INT_RESTART\n#undef DUK__IN_BODY\n#undef DUK__LE_BODY\n#undef DUK__LONGJMP_RESTART\n#undef DUK__LONGJMP_RETHROW\n#undef DUK__LOOKUP_INDIRECT\n#undef DUK__LT_BODY\n#undef DUK__MASK_A\n#undef DUK__MASK_B\n#undef DUK__MASK_BC\n#undef DUK__MASK_C\n#undef DUK__NEQ_BODY\n#undef DUK__NOINLINE_PERF\n#undef DUK__PUTPROP_BODY\n#undef DUK__RCBIT_B\n#undef DUK__RCBIT_C\n#undef DUK__REG\n#undef DUK__REGCONSTP_B\n#undef DUK__REGCONSTP_C\n#undef DUK__REGP\n#undef DUK__REGP_A\n#undef DUK__REGP_B\n#undef DUK__REGP_BC\n#undef DUK__REGP_C\n#undef DUK__REPLACE_BOOL_A_BREAK\n#undef DUK__REPLACE_TOP_A_BREAK\n#undef DUK__REPLACE_TOP_BC_BREAK\n#undef DUK__REPLACE_TO_TVPTR\n#undef DUK__RETHAND_FINISHED\n#undef DUK__RETHAND_RESTART\n#undef DUK__RETURN_SHARED\n#undef DUK__SEQ_BODY\n#undef DUK__SHIFT_A\n#undef DUK__SHIFT_B\n#undef DUK__SHIFT_BC\n#undef DUK__SHIFT_C\n#undef DUK__SNEQ_BODY\n#undef DUK__STRICT\n#undef DUK__SYNC_AND_NULL_CURR_PC\n#undef DUK__SYNC_CURR_PC\n#undef DUK__TVAL_SHIFT\n#line 1 \"duk_js_ops.c\"\n/*\n *  Ecmascript specification algorithm and conversion helpers.\n *\n *  These helpers encapsulate the primitive Ecmascript operation semantics,\n *  and are used by the bytecode executor and the API (among other places).\n *  Some primitives are only implemented as part of the API and have no\n *  \"internal\" helper.  This is the case when an internal helper would not\n *  really be useful; e.g. the operation is rare, uses value stack heavily,\n *  etc.\n *\n *  The operation arguments depend on what is required to implement\n *  the operation:\n *\n *    - If an operation is simple and stateless, and has no side\n *      effects, it won't take an duk_hthread argument and its\n *      arguments may be duk_tval pointers (which are safe as long\n *      as no side effects take place).\n *\n *    - If complex coercions are required (e.g. a \"ToNumber\" coercion)\n *      or errors may be thrown, the operation takes an duk_hthread\n *      argument.  This also implies that the operation may have\n *      arbitrary side effects, invalidating any duk_tval pointers.\n *\n *    - For operations with potential side effects, arguments can be\n *      taken in several ways:\n *\n *      a) as duk_tval pointers, which makes sense if the \"common case\"\n *         can be resolved without side effects (e.g. coercion); the\n *         arguments are pushed to the valstack for coercion if\n *         necessary\n *\n *      b) as duk_tval values\n *\n *      c) implicitly on value stack top\n *\n *      d) as indices to the value stack\n *\n *  Future work:\n *\n *     - Argument styles may not be the most sensible in every case now.\n *\n *     - In-place coercions might be useful for several operations, if\n *       in-place coercion is OK for the bytecode executor and the API.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  ToPrimitive()  (E5 Section 9.1)\n *\n *  ==> implemented in the API.\n */\n\n/*\n *  ToBoolean()  (E5 Section 9.2)\n */\n\nDUK_INTERNAL duk_bool_t duk_js_toboolean(duk_tval *tv) {\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED:\n\tcase DUK_TAG_NULL:\n\t\treturn 0;\n\tcase DUK_TAG_BOOLEAN:\n\t\tDUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv) == 0 || DUK_TVAL_GET_BOOLEAN(tv) == 1);\n\t\treturn DUK_TVAL_GET_BOOLEAN(tv);\n\tcase DUK_TAG_STRING: {\n\t\t/* Symbols ToBoolean() coerce to true, regardless of their\n\t\t * description.  This happens with no explicit check because\n\t\t * of the symbol representation byte prefix.\n\t\t */\n\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv);\n\t\tDUK_ASSERT(h != NULL);\n\t\treturn (DUK_HSTRING_GET_BYTELEN(h) > 0 ? 1 : 0);\n\t}\n\tcase DUK_TAG_OBJECT: {\n\t\treturn 1;\n\t}\n\tcase DUK_TAG_BUFFER: {\n\t\t/* Mimic Uint8Array semantics: objects coerce true, regardless\n\t\t * of buffer length (zero or not) or context.\n\t\t */\n\t\treturn 1;\n\t}\n\tcase DUK_TAG_POINTER: {\n\t\tvoid *p = DUK_TVAL_GET_POINTER(tv);\n\t\treturn (p != NULL ? 1 : 0);\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\treturn 1;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n\t\tif (DUK_TVAL_GET_FASTINT(tv) != 0) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n#endif\n\tdefault: {\n\t\t/* number */\n\t\tduk_double_t d;\n#if defined(DUK_USE_PREFER_SIZE)\n\t\tint c;\n#endif\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));\n\t\td = DUK_TVAL_GET_DOUBLE(tv);\n#if defined(DUK_USE_PREFER_SIZE)\n\t\tc = DUK_FPCLASSIFY((double) d);\n\t\tif (c == DUK_FP_ZERO || c == DUK_FP_NAN) {\n\t\t\treturn 0;\n\t\t} else {\n\t\t\treturn 1;\n\t\t}\n#else\n\t\tDUK_ASSERT(duk_double_is_nan_or_zero(d) == 0 || duk_double_is_nan_or_zero(d) == 1);\n\t\treturn duk_double_is_nan_or_zero(d) ^ 1;\n#endif\n\t}\n\t}\n\tDUK_UNREACHABLE();\n}\n\n/*\n *  ToNumber()  (E5 Section 9.3)\n *\n *  Value to convert must be on stack top, and is popped before exit.\n *\n *  See: http://www.cs.indiana.edu/~burger/FP-Printing-PLDI96.pdf\n *       http://www.cs.indiana.edu/~burger/fp/index.html\n *\n *  Notes on the conversion:\n *\n *    - There are specific requirements on the accuracy of the conversion\n *      through a \"Mathematical Value\" (MV), so this conversion is not\n *      trivial.\n *\n *    - Quick rejects (e.g. based on first char) are difficult because\n *      the grammar allows leading and trailing white space.\n *\n *    - Quick reject based on string length is difficult even after\n *      accounting for white space; there may be arbitrarily many\n *      decimal digits.\n *\n *    - Standard grammar allows decimal values (\"123\"), hex values\n *      (\"0x123\") and infinities\n *\n *    - Unlike source code literals, ToNumber() coerces empty strings\n *      and strings with only whitespace to zero (not NaN).\n */\n\n/* E5 Section 9.3.1 */\nDUK_LOCAL duk_double_t duk__tonumber_string_raw(duk_hthread *thr) {\n\tduk_small_uint_t s2n_flags;\n\tduk_double_t d;\n\n\tDUK_ASSERT(duk_is_string(thr, -1));\n\n\t/* Quite lenient, e.g. allow empty as zero, but don't allow trailing\n\t * garbage.\n\t */\n\ts2n_flags = DUK_S2N_FLAG_TRIM_WHITE |\n\t            DUK_S2N_FLAG_ALLOW_EXP |\n\t            DUK_S2N_FLAG_ALLOW_PLUS |\n\t            DUK_S2N_FLAG_ALLOW_MINUS |\n\t            DUK_S2N_FLAG_ALLOW_INF |\n\t            DUK_S2N_FLAG_ALLOW_FRAC |\n\t            DUK_S2N_FLAG_ALLOW_NAKED_FRAC |\n\t            DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |\n\t            DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO |\n\t            DUK_S2N_FLAG_ALLOW_LEADING_ZERO |\n\t            DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT |\n\t            DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT |\n\t            DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT;\n\n\tduk_numconv_parse(thr, 10 /*radix*/, s2n_flags);\n\n#if defined(DUK_USE_PREFER_SIZE)\n\td = duk_get_number(thr, -1);\n\tduk_pop_unsafe(thr);\n#else\n\tthr->valstack_top--;\n\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(thr->valstack_top));\n\tDUK_ASSERT(DUK_TVAL_IS_DOUBLE(thr->valstack_top));  /* no fastint conversion in numconv now */\n\tDUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(thr->valstack_top));\n\td = DUK_TVAL_GET_DOUBLE(thr->valstack_top);  /* assumes not a fastint */\n\tDUK_TVAL_SET_UNDEFINED(thr->valstack_top);\n#endif\n\n\treturn d;\n}\n\nDUK_INTERNAL duk_double_t duk_js_tonumber(duk_hthread *thr, duk_tval *tv) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(tv != NULL);\n\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_UNDEFINED: {\n\t\t/* return a specific NaN (although not strictly necessary) */\n\t\tduk_double_union du;\n\t\tDUK_DBLUNION_SET_NAN(&du);\n\t\tDUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du));\n\t\treturn du.d;\n\t}\n\tcase DUK_TAG_NULL: {\n\t\t/* +0.0 */\n\t\treturn 0.0;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tif (DUK_TVAL_IS_BOOLEAN_TRUE(tv)) {\n\t\t\treturn 1.0;\n\t\t}\n\t\treturn 0.0;\n\t}\n\tcase DUK_TAG_STRING: {\n\t\t/* For Symbols ToNumber() is always a TypeError. */\n\t\tduk_hstring *h = DUK_TVAL_GET_STRING(tv);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(h))) {\n\t\t\tDUK_ERROR_TYPE(thr, DUK_STR_CANNOT_NUMBER_COERCE_SYMBOL);\n\t\t}\n\t\tduk_push_hstring(thr, h);\n\t\treturn duk__tonumber_string_raw(thr);\n\t}\n\tcase DUK_TAG_BUFFER:  /* plain buffer treated like object */\n\tcase DUK_TAG_OBJECT: {\n\t\tduk_double_t d;\n\t\tduk_push_tval(thr, tv);\n\t\tduk_to_primitive(thr, -1, DUK_HINT_NUMBER);  /* 'tv' becomes invalid */\n\n\t\t/* recursive call for a primitive value (guaranteed not to cause second\n\t\t * recursion).\n\t\t */\n\t\tDUK_ASSERT(duk_get_tval(thr, -1) != NULL);\n\t\td = duk_js_tonumber(thr, duk_get_tval(thr, -1));\n\n\t\tduk_pop_unsafe(thr);\n\t\treturn d;\n\t}\n\tcase DUK_TAG_POINTER: {\n\t\t/* Coerce like boolean */\n\t\tvoid *p = DUK_TVAL_GET_POINTER(tv);\n\t\treturn (p != NULL ? 1.0 : 0.0);\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\t/* +(function(){}) -> NaN */\n\t\treturn DUK_DOUBLE_NAN;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n\t\treturn (duk_double_t) DUK_TVAL_GET_FASTINT(tv);\n#endif\n\tdefault: {\n\t\t/* number */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv));\n\t\tDUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv));\n\t\treturn DUK_TVAL_GET_DOUBLE(tv);\n\t}\n\t}\n\n\tDUK_UNREACHABLE();\n}\n\n/*\n *  ToInteger()  (E5 Section 9.4)\n */\n\n/* exposed, used by e.g. duk_bi_date.c */\nDUK_INTERNAL duk_double_t duk_js_tointeger_number(duk_double_t x) {\n#if defined(DUK_USE_PREFER_SIZE)\n\tduk_small_int_t c = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\n\tif (DUK_UNLIKELY(c == DUK_FP_NAN)) {\n\t\treturn 0.0;\n\t} else if (DUK_UNLIKELY(c == DUK_FP_INFINITE)) {\n\t\treturn x;\n\t} else {\n\t\t/* Finite, including neg/pos zero.  Neg zero sign must be\n\t\t * preserved.\n\t\t */\n\t\treturn duk_double_trunc_towards_zero(x);\n\t}\n#else  /* DUK_USE_PREFER_SIZE */\n\t/* NaN and Infinity have the same exponent so it's a cheap\n\t * initial check for the rare path.\n\t */\n\tif (DUK_UNLIKELY(duk_double_is_nan_or_inf(x) != 0U)) {\n\t\tif (duk_double_is_nan(x)) {\n\t\t\treturn 0.0;\n\t\t} else {\n\t\t\treturn x;\n\t\t}\n\t} else {\n\t\treturn duk_double_trunc_towards_zero(x);\n\t}\n#endif  /* DUK_USE_PREFER_SIZE */\n}\n\nDUK_INTERNAL duk_double_t duk_js_tointeger(duk_hthread *thr, duk_tval *tv) {\n\t/* XXX: fastint */\n\tduk_double_t d = duk_js_tonumber(thr, tv);  /* invalidates tv */\n\treturn duk_js_tointeger_number(d);\n}\n\n/*\n *  ToInt32(), ToUint32(), ToUint16()  (E5 Sections 9.5, 9.6, 9.7)\n */\n\n/* combined algorithm matching E5 Sections 9.5 and 9.6 */\nDUK_LOCAL duk_double_t duk__toint32_touint32_helper(duk_double_t x, duk_bool_t is_toint32) {\n#if defined (DUK_USE_PREFER_SIZE)\n\tduk_small_int_t c;\n#endif\n\n#if defined (DUK_USE_PREFER_SIZE)\n\tc = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\tif (c == DUK_FP_NAN || c == DUK_FP_ZERO || c == DUK_FP_INFINITE) {\n\t\treturn 0.0;\n\t}\n#else\n\tif (duk_double_is_nan_zero_inf(x)) {\n\t\treturn 0.0;\n\t}\n#endif\n\n\t/* x = sign(x) * floor(abs(x)), i.e. truncate towards zero, keep sign */\n\tx = duk_double_trunc_towards_zero(x);\n\n\t/* NOTE: fmod(x) result sign is same as sign of x, which\n\t * differs from what Javascript wants (see Section 9.6).\n\t */\n\n\tx = DUK_FMOD(x, DUK_DOUBLE_2TO32);    /* -> x in ]-2**32, 2**32[ */\n\n\tif (x < 0.0) {\n\t\tx += DUK_DOUBLE_2TO32;\n\t}\n\tDUK_ASSERT(x >= 0 && x < DUK_DOUBLE_2TO32);  /* -> x in [0, 2**32[ */\n\n\tif (is_toint32) {\n\t\tif (x >= DUK_DOUBLE_2TO31) {\n\t\t\t/* x in [2**31, 2**32[ */\n\n\t\t\tx -= DUK_DOUBLE_2TO32;  /* -> x in [-2**31,2**31[ */\n\t\t}\n\t}\n\n\treturn x;\n}\n\nDUK_INTERNAL duk_int32_t duk_js_toint32(duk_hthread *thr, duk_tval *tv) {\n\tduk_double_t d;\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\treturn DUK_TVAL_GET_FASTINT_I32(tv);\n\t}\n#endif\n\n\td = duk_js_tonumber(thr, tv);  /* invalidates tv */\n\td = duk__toint32_touint32_helper(d, 1);\n\tDUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL);\n\tDUK_ASSERT(d >= -2147483648.0 && d <= 2147483647.0);  /* [-0x80000000,0x7fffffff] */\n\tDUK_ASSERT(d == ((duk_double_t) ((duk_int32_t) d)));  /* whole, won't clip */\n\treturn (duk_int32_t) d;\n}\n\n\nDUK_INTERNAL duk_uint32_t duk_js_touint32(duk_hthread *thr, duk_tval *tv) {\n\tduk_double_t d;\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv)) {\n\t\treturn DUK_TVAL_GET_FASTINT_U32(tv);\n\t}\n#endif\n\n\td = duk_js_tonumber(thr, tv);  /* invalidates tv */\n\td = duk__toint32_touint32_helper(d, 0);\n\tDUK_ASSERT(DUK_FPCLASSIFY(d) == DUK_FP_ZERO || DUK_FPCLASSIFY(d) == DUK_FP_NORMAL);\n\tDUK_ASSERT(d >= 0.0 && d <= 4294967295.0);  /* [0x00000000, 0xffffffff] */\n\tDUK_ASSERT(d == ((duk_double_t) ((duk_uint32_t) d)));  /* whole, won't clip */\n\treturn (duk_uint32_t) d;\n\n}\n\nDUK_INTERNAL duk_uint16_t duk_js_touint16(duk_hthread *thr, duk_tval *tv) {\n\t/* should be a safe way to compute this */\n\treturn (duk_uint16_t) (duk_js_touint32(thr, tv) & 0x0000ffffU);\n}\n\n/*\n *  ToString()  (E5 Section 9.8)\n *  ToObject()  (E5 Section 9.9)\n *  CheckObjectCoercible()  (E5 Section 9.10)\n *  IsCallable()  (E5 Section 9.11)\n *\n *  ==> implemented in the API.\n */\n\n/*\n *  Loose equality, strict equality, and SameValue (E5 Sections 11.9.1, 11.9.4,\n *  9.12).  These have much in common so they can share some helpers.\n *\n *  Future work notes:\n *\n *    - Current implementation (and spec definition) has recursion; this should\n *      be fixed if possible.\n *\n *    - String-to-number coercion should be possible without going through the\n *      value stack (and be more compact) if a shared helper is invoked.\n */\n\n/* Note that this is the same operation for strict and loose equality:\n *  - E5 Section 11.9.3, step 1.c (loose)\n *  - E5 Section 11.9.6, step 4 (strict)\n */\n\nDUK_LOCAL duk_bool_t duk__js_equals_number(duk_double_t x, duk_double_t y) {\n#if defined(DUK_USE_PARANOID_MATH)\n\t/* Straightforward algorithm, makes fewer compiler assumptions. */\n\tduk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\tduk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y);\n\tif (cx == DUK_FP_NAN || cy == DUK_FP_NAN) {\n\t\treturn 0;\n\t}\n\tif (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) {\n\t\treturn 1;\n\t}\n\tif (x == y) {\n\t\treturn 1;\n\t}\n\treturn 0;\n#else  /* DUK_USE_PARANOID_MATH */\n\t/* Better equivalent algorithm.  If the compiler is compliant, C and\n\t * Ecmascript semantics are identical for this particular comparison.\n\t * In particular, NaNs must never compare equal and zeroes must compare\n\t * equal regardless of sign.  Could also use a macro, but this inlines\n\t * already nicely (no difference on gcc, for instance).\n\t */\n\tif (x == y) {\n\t\t/* IEEE requires that NaNs compare false */\n\t\tDUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN);\n\t\tDUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN);\n\t\treturn 1;\n\t} else {\n\t\t/* IEEE requires that zeros compare the same regardless\n\t\t * of their signed, so if both x and y are zeroes, they\n\t\t * are caught above.\n\t\t */\n\t\tDUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO));\n\t\treturn 0;\n\t}\n#endif  /* DUK_USE_PARANOID_MATH */\n}\n\nDUK_LOCAL duk_bool_t duk__js_samevalue_number(duk_double_t x, duk_double_t y) {\n#if defined(DUK_USE_PARANOID_MATH)\n\tduk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\tduk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y);\n\n\tif (cx == DUK_FP_NAN && cy == DUK_FP_NAN) {\n\t\t/* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */\n\t\treturn 1;\n\t}\n\tif (cx == DUK_FP_ZERO && cy == DUK_FP_ZERO) {\n\t\t/* Note: cannot assume that a non-zero return value of signbit() would\n\t\t * always be the same -- hence cannot (portably) use something like:\n\t\t *\n\t\t *     signbit(x) == signbit(y)\n\t\t */\n\t\tduk_small_int_t sx = DUK_SIGNBIT(x) ? 1 : 0;\n\t\tduk_small_int_t sy = DUK_SIGNBIT(y) ? 1 : 0;\n\t\treturn (sx == sy);\n\t}\n\n\t/* normal comparison; known:\n\t *   - both x and y are not NaNs (but one of them can be)\n\t *   - both x and y are not zero (but one of them can be)\n\t *   - x and y may be denormal or infinite\n\t */\n\n\treturn (x == y);\n#else  /* DUK_USE_PARANOID_MATH */\n\tduk_small_int_t cx = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\tduk_small_int_t cy = (duk_small_int_t) DUK_FPCLASSIFY(y);\n\n\tif (x == y) {\n\t\t/* IEEE requires that NaNs compare false */\n\t\tDUK_ASSERT(DUK_FPCLASSIFY(x) != DUK_FP_NAN);\n\t\tDUK_ASSERT(DUK_FPCLASSIFY(y) != DUK_FP_NAN);\n\n\t\t/* Using classification has smaller footprint than direct comparison. */\n\t\tif (DUK_UNLIKELY(cx == DUK_FP_ZERO && cy == DUK_FP_ZERO)) {\n\t\t\t/* Note: cannot assume that a non-zero return value of signbit() would\n\t\t\t * always be the same -- hence cannot (portably) use something like:\n\t\t\t *\n\t\t\t *     signbit(x) == signbit(y)\n\t\t\t */\n\t\t\treturn duk_double_same_sign(x, y);\n\t\t}\n\t\treturn 1;\n\t} else {\n\t\t/* IEEE requires that zeros compare the same regardless\n\t\t * of their sign, so if both x and y are zeroes, they\n\t\t * are caught above.\n\t\t */\n\t\tDUK_ASSERT(!(DUK_FPCLASSIFY(x) == DUK_FP_ZERO && DUK_FPCLASSIFY(y) == DUK_FP_ZERO));\n\n\t\t/* Difference to non-strict/strict comparison is that NaNs compare\n\t\t * equal and signed zero signs matter.\n\t\t */\n\t\tif (DUK_UNLIKELY(cx == DUK_FP_NAN && cy == DUK_FP_NAN)) {\n\t\t\t/* SameValue(NaN, NaN) = true, regardless of NaN sign or extra bits */\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t}\n#endif  /* DUK_USE_PARANOID_MATH */\n}\n\nDUK_INTERNAL duk_bool_t duk_js_equals_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) {\n\tduk_uint_t type_mask_x;\n\tduk_uint_t type_mask_y;\n\n\t/* If flags != 0 (strict or SameValue), thr can be NULL.  For loose\n\t * equals comparison it must be != NULL.\n\t */\n\tDUK_ASSERT(flags != 0 || thr != NULL);\n\n\t/*\n\t *  Same type?\n\t *\n\t *  Note: since number values have no explicit tag in the 8-byte\n\t *  representation, need the awkward if + switch.\n\t */\n\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y)) {\n\t\tif (DUK_TVAL_GET_FASTINT(tv_x) == DUK_TVAL_GET_FASTINT(tv_y)) {\n\t\t\treturn 1;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\telse\n#endif\n\tif (DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y)) {\n\t\tduk_double_t d1, d2;\n\n\t\t/* Catches both doubles and cases where only one argument is\n\t\t * a fastint so can't assume a double.\n\t\t */\n\t\td1 = DUK_TVAL_GET_NUMBER(tv_x);\n\t\td2 = DUK_TVAL_GET_NUMBER(tv_y);\n\t\tif (DUK_UNLIKELY((flags & DUK_EQUALS_FLAG_SAMEVALUE) != 0)) {\n\t\t\t/* SameValue */\n\t\t\treturn duk__js_samevalue_number(d1, d2);\n\t\t} else {\n\t\t\t/* equals and strict equals */\n\t\t\treturn duk__js_equals_number(d1, d2);\n\t\t}\n\t} else if (DUK_TVAL_GET_TAG(tv_x) == DUK_TVAL_GET_TAG(tv_y)) {\n\t\tswitch (DUK_TVAL_GET_TAG(tv_x)) {\n\t\tcase DUK_TAG_UNDEFINED:\n\t\tcase DUK_TAG_NULL: {\n\t\t\treturn 1;\n\t\t}\n\t\tcase DUK_TAG_BOOLEAN: {\n\t\t\treturn DUK_TVAL_GET_BOOLEAN(tv_x) == DUK_TVAL_GET_BOOLEAN(tv_y);\n\t\t}\n\t\tcase DUK_TAG_POINTER: {\n\t\t\treturn DUK_TVAL_GET_POINTER(tv_x) == DUK_TVAL_GET_POINTER(tv_y);\n\t\t}\n\t\tcase DUK_TAG_STRING:\n\t\tcase DUK_TAG_OBJECT: {\n\t\t\t/* Heap pointer comparison suffices for strings and objects.\n\t\t\t * Symbols compare equal if they have the same internal\n\t\t\t * representation; again heap pointer comparison suffices.\n\t\t\t */\n\t\t\treturn DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y);\n\t\t}\n\t\tcase DUK_TAG_BUFFER: {\n\t\t\t/* In Duktape 2.x plain buffers mimic Uint8Array objects\n\t\t\t * so always compare by heap pointer.  In Duktape 1.x\n\t\t\t * strict comparison would compare heap pointers and\n\t\t\t * non-strict would compare contents.\n\t\t\t */\n\t\t\treturn DUK_TVAL_GET_HEAPHDR(tv_x) == DUK_TVAL_GET_HEAPHDR(tv_y);\n\t\t}\n\t\tcase DUK_TAG_LIGHTFUNC: {\n\t\t\t/* At least 'magic' has a significant impact on function\n\t\t\t * identity.\n\t\t\t */\n\t\t\tduk_small_uint_t lf_flags_x;\n\t\t\tduk_small_uint_t lf_flags_y;\n\t\t\tduk_c_function func_x;\n\t\t\tduk_c_function func_y;\n\n\t\t\tDUK_TVAL_GET_LIGHTFUNC(tv_x, func_x, lf_flags_x);\n\t\t\tDUK_TVAL_GET_LIGHTFUNC(tv_y, func_y, lf_flags_y);\n\t\t\treturn ((func_x == func_y) && (lf_flags_x == lf_flags_y)) ? 1 : 0;\n\t\t}\n#if defined(DUK_USE_FASTINT)\n\t\tcase DUK_TAG_FASTINT:\n#endif\n\t\tdefault: {\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x));\n\t\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_y));\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x));\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_y));\n\t\t\tDUK_UNREACHABLE();\n\t\t\treturn 0;\n\t\t}\n\t\t}\n\t}\n\n\tif ((flags & (DUK_EQUALS_FLAG_STRICT | DUK_EQUALS_FLAG_SAMEVALUE)) != 0) {\n\t\treturn 0;\n\t}\n\n\tDUK_ASSERT(flags == 0);  /* non-strict equality from here on */\n\n\t/*\n\t *  Types are different; various cases for non-strict comparison\n\t *\n\t *  Since comparison is symmetric, we use a \"swap trick\" to reduce\n\t *  code size.\n\t */\n\n\ttype_mask_x = duk_get_type_mask_tval(tv_x);\n\ttype_mask_y = duk_get_type_mask_tval(tv_y);\n\n\t/* Undefined/null are considered equal (e.g. \"null == undefined\" -> true). */\n\tif ((type_mask_x & (DUK_TYPE_MASK_UNDEFINED | DUK_TYPE_MASK_NULL)) &&\n\t    (type_mask_y & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED))) {\n\t\treturn 1;\n\t}\n\n\t/* Number/string -> coerce string to number (e.g. \"'1.5' == 1.5\" -> true). */\n\tif ((type_mask_x & DUK_TYPE_MASK_NUMBER) && (type_mask_y & DUK_TYPE_MASK_STRING)) {\n\t\tif (!DUK_TVAL_STRING_IS_SYMBOL(tv_y)) {\n\t\t\tduk_double_t d1, d2;\n\t\t\td1 = DUK_TVAL_GET_NUMBER(tv_x);\n\t\t\td2 = duk_to_number_tval(thr, tv_y);\n\t\t\treturn duk__js_equals_number(d1, d2);\n\t\t}\n\t}\n\tif ((type_mask_x & DUK_TYPE_MASK_STRING) && (type_mask_y & DUK_TYPE_MASK_NUMBER)) {\n\t\tif (!DUK_TVAL_STRING_IS_SYMBOL(tv_x)) {\n\t\t\tduk_double_t d1, d2;\n\t\t\td1 = DUK_TVAL_GET_NUMBER(tv_y);\n\t\t\td2 = duk_to_number_tval(thr, tv_x);\n\t\t\treturn duk__js_equals_number(d1, d2);\n\t\t}\n\t}\n\n\t/* Boolean/any -> coerce boolean to number and try again.  If boolean is\n\t * compared to a pointer, the final comparison after coercion now always\n\t * yields false (as pointer vs. number compares to false), but this is\n\t * not special cased.\n\t *\n\t * ToNumber(bool) is +1.0 or 0.0.  Tagged boolean value is always 0 or 1.\n\t */\n\tif (type_mask_x & DUK_TYPE_MASK_BOOLEAN) {\n\t\tDUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_x) == 0 || DUK_TVAL_GET_BOOLEAN(tv_x) == 1);\n\t\tduk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_x));\n\t\tduk_push_tval(thr, tv_y);\n\t\tgoto recursive_call;\n\t}\n\tif (type_mask_y & DUK_TYPE_MASK_BOOLEAN) {\n\t\tDUK_ASSERT(DUK_TVAL_GET_BOOLEAN(tv_y) == 0 || DUK_TVAL_GET_BOOLEAN(tv_y) == 1);\n\t\tduk_push_tval(thr, tv_x);\n\t\tduk_push_uint(thr, DUK_TVAL_GET_BOOLEAN(tv_y));\n\t\tgoto recursive_call;\n\t}\n\n\t/* String-number-symbol/object -> coerce object to primitive (apparently without hint), then try again. */\n\tif ((type_mask_x & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER)) &&\n\t    (type_mask_y & DUK_TYPE_MASK_OBJECT)) {\n\t\t/* No symbol check needed because symbols and strings are accepted. */\n\t\tduk_push_tval(thr, tv_x);\n\t\tduk_push_tval(thr, tv_y);\n\t\tduk_to_primitive(thr, -1, DUK_HINT_NONE);  /* apparently no hint? */\n\t\tgoto recursive_call;\n\t}\n\tif ((type_mask_x & DUK_TYPE_MASK_OBJECT) &&\n\t    (type_mask_y & (DUK_TYPE_MASK_STRING | DUK_TYPE_MASK_NUMBER))) {\n\t\t/* No symbol check needed because symbols and strings are accepted. */\n\t\tduk_push_tval(thr, tv_x);\n\t\tduk_push_tval(thr, tv_y);\n\t\tduk_to_primitive(thr, -2, DUK_HINT_NONE);  /* apparently no hint? */\n\t\tgoto recursive_call;\n\t}\n\n\t/* Nothing worked -> not equal. */\n\treturn 0;\n\n recursive_call:\n\t/* Shared code path to call the helper again with arguments on stack top. */\n\t{\n\t\tduk_bool_t rc;\n\t\trc = duk_js_equals_helper(thr,\n\t\t                          DUK_GET_TVAL_NEGIDX(thr, -2),\n\t\t                          DUK_GET_TVAL_NEGIDX(thr, -1),\n\t\t                          0 /*flags:nonstrict*/);\n\t\tduk_pop_2_unsafe(thr);\n\t\treturn rc;\n\t}\n}\n\n/*\n *  Comparisons (x >= y, x > y, x <= y, x < y)\n *\n *  E5 Section 11.8.5: implement 'x < y' and then use negate and eval_left_first\n *  flags to get the rest.\n */\n\n/* XXX: this should probably just operate on the stack top, because it\n * needs to push stuff on the stack anyway...\n */\n\nDUK_INTERNAL duk_small_int_t duk_js_data_compare(const duk_uint8_t *buf1, const duk_uint8_t *buf2, duk_size_t len1, duk_size_t len2) {\n\tduk_size_t prefix_len;\n\tduk_small_int_t rc;\n\n\tprefix_len = (len1 <= len2 ? len1 : len2);\n\n\t/* DUK_MEMCMP() is guaranteed to return zero (equal) for zero length\n\t * inputs so no zero length check is needed.\n\t */\n\trc = DUK_MEMCMP((const void *) buf1,\n\t                (const void *) buf2,\n\t                (size_t) prefix_len);\n\n\tif (rc < 0) {\n\t\treturn -1;\n\t} else if (rc > 0) {\n\t\treturn 1;\n\t}\n\n\t/* prefix matches, lengths matter now */\n\tif (len1 < len2) {\n\t\t/* e.g. \"x\" < \"xx\" */\n\t\treturn -1;\n\t} else if (len1 > len2) {\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\nDUK_INTERNAL duk_small_int_t duk_js_string_compare(duk_hstring *h1, duk_hstring *h2) {\n\t/*\n\t *  String comparison (E5 Section 11.8.5, step 4), which\n\t *  needs to compare codepoint by codepoint.\n\t *\n\t *  However, UTF-8 allows us to use strcmp directly: the shared\n\t *  prefix will be encoded identically (UTF-8 has unique encoding)\n\t *  and the first differing character can be compared with a simple\n\t *  unsigned byte comparison (which strcmp does).\n\t *\n\t *  This will not work properly for non-xutf-8 strings, but this\n\t *  is not an issue for compliance.\n\t */\n\n\tDUK_ASSERT(h1 != NULL);\n\tDUK_ASSERT(h2 != NULL);\n\n\treturn duk_js_data_compare((const duk_uint8_t *) DUK_HSTRING_GET_DATA(h1),\n\t                           (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h2),\n\t                           (duk_size_t) DUK_HSTRING_GET_BYTELEN(h1),\n\t                           (duk_size_t) DUK_HSTRING_GET_BYTELEN(h2));\n}\n\n#if 0  /* unused */\nDUK_INTERNAL duk_small_int_t duk_js_buffer_compare(duk_heap *heap, duk_hbuffer *h1, duk_hbuffer *h2) {\n\t/* Similar to String comparison. */\n\n\tDUK_ASSERT(h1 != NULL);\n\tDUK_ASSERT(h2 != NULL);\n\tDUK_UNREF(heap);\n\n\treturn duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h1),\n\t                           (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(heap, h2),\n\t                           (duk_size_t) DUK_HBUFFER_GET_SIZE(h1),\n\t                           (duk_size_t) DUK_HBUFFER_GET_SIZE(h2));\n}\n#endif\n\n#if defined(DUK_USE_FASTINT)\nDUK_LOCAL duk_bool_t duk__compare_fastint(duk_bool_t retval, duk_int64_t v1, duk_int64_t v2) {\n\tDUK_ASSERT(retval == 0 || retval == 1);\n\tif (v1 < v2) {\n\t\treturn retval ^ 1;\n\t} else {\n\t\treturn retval;\n\t}\n}\n#endif\n\n#if defined(DUK_USE_PARANOID_MATH)\nDUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) {\n\tduk_small_int_t c1, s1, c2, s2;\n\n\tDUK_ASSERT(retval == 0 || retval == 1);\n\tc1 = (duk_small_int_t) DUK_FPCLASSIFY(d1);\n\ts1 = (duk_small_int_t) DUK_SIGNBIT(d1);\n\tc2 = (duk_small_int_t) DUK_FPCLASSIFY(d2);\n\ts2 = (duk_small_int_t) DUK_SIGNBIT(d2);\n\n\tif (c1 == DUK_FP_NAN || c2 == DUK_FP_NAN) {\n\t\treturn 0;  /* Always false, regardless of negation. */\n\t}\n\n\tif (c1 == DUK_FP_ZERO && c2 == DUK_FP_ZERO) {\n\t\t/* For all combinations: +0 < +0, +0 < -0, -0 < +0, -0 < -0,\n\t\t * steps e, f, and g.\n\t\t */\n\t\treturn retval;  /* false */\n\t}\n\n\tif (d1 == d2) {\n\t\treturn retval;  /* false */\n\t}\n\n\tif (c1 == DUK_FP_INFINITE && s1 == 0) {\n\t\t/* x == +Infinity */\n\t\treturn retval;  /* false */\n\t}\n\n\tif (c2 == DUK_FP_INFINITE && s2 == 0) {\n\t\t/* y == +Infinity */\n\t\treturn retval ^ 1;  /* true */\n\t}\n\n\tif (c2 == DUK_FP_INFINITE && s2 != 0) {\n\t\t/* y == -Infinity */\n\t\treturn retval;  /* false */\n\t}\n\n\tif (c1 == DUK_FP_INFINITE && s1 != 0) {\n\t\t/* x == -Infinity */\n\t\treturn retval ^ 1;  /* true */\n\t}\n\n\tif (d1 < d2) {\n\t\treturn retval ^ 1;  /* true */\n\t}\n\n\treturn retval;  /* false */\n}\n#else  /* DUK_USE_PARANOID_MATH */\nDUK_LOCAL duk_bool_t duk__compare_number(duk_bool_t retval, duk_double_t d1, duk_double_t d2) {\n\t/* This comparison tree relies doesn't match the exact steps in\n\t * E5 Section 11.8.5 but should produce the same results.  The\n\t * steps rely on exact IEEE semantics for NaNs, etc.\n\t */\n\n\tDUK_ASSERT(retval == 0 || retval == 1);\n\tif (d1 < d2) {\n\t\t/* In no case should both (d1 < d2) and (d2 < d1) be true.\n\t\t * It's possible that neither is true though, and that's\n\t\t * handled below.\n\t\t */\n\t\tDUK_ASSERT(!(d2 < d1));\n\n\t\t/* - d1 < d2, both d1/d2 are normals (not Infinity, not NaN)\n\t\t * - d2 is +Infinity, d1 != +Infinity and NaN\n\t\t * - d1 is -Infinity, d2 != -Infinity and NaN\n\t\t */\n\t\treturn retval ^ 1;\n\t} else {\n\t\tif (d2 < d1) {\n\t\t\t/* - !(d1 < d2), both d1/d2 are normals (not Infinity, not NaN)\n\t\t\t * - d1 is +Infinity, d2 != +Infinity and NaN\n\t\t\t * - d2 is -Infinity, d1 != -Infinity and NaN\n\t\t\t */\n\t\t\treturn retval;\n\t\t} else {\n\t\t\t/* - d1 and/or d2 is NaN\n\t\t\t * - d1 and d2 are both +/- 0\n\t\t\t * - d1 == d2 (including infinities)\n\t\t\t */\n\t\t\tif (duk_double_is_nan(d1) || duk_double_is_nan(d2)) {\n\t\t\t\t/* Note: undefined from Section 11.8.5 always\n\t\t\t\t * results in false return (see e.g. Section\n\t\t\t\t * 11.8.3) - hence special treatment here.\n\t\t\t\t */\n\t\t\t\treturn 0;  /* zero regardless of negation */\n\t\t\t} else {\n\t\t\t\treturn retval;\n\t\t\t}\n\t\t}\n\t}\n}\n#endif  /* DUK_USE_PARANOID_MATH */\n\nDUK_INTERNAL duk_bool_t duk_js_compare_helper(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y, duk_small_uint_t flags) {\n\tduk_double_t d1, d2;\n\tduk_small_int_t rc;\n\tduk_bool_t retval;\n\n\tDUK_ASSERT(DUK_COMPARE_FLAG_NEGATE == 1);  /* Rely on this flag being lowest. */\n\tretval = flags & DUK_COMPARE_FLAG_NEGATE;\n\tDUK_ASSERT(retval == 0 || retval == 1);\n\n\t/* Fast path for fastints */\n#if defined(DUK_USE_FASTINT)\n\tif (DUK_LIKELY(DUK_TVAL_IS_FASTINT(tv_x) && DUK_TVAL_IS_FASTINT(tv_y))) {\n\t\treturn duk__compare_fastint(retval,\n\t\t                            DUK_TVAL_GET_FASTINT(tv_x),\n\t\t                            DUK_TVAL_GET_FASTINT(tv_y));\n\t}\n#endif  /* DUK_USE_FASTINT */\n\n\t/* Fast path for numbers (one of which may be a fastint) */\n#if !defined(DUK_USE_PREFER_SIZE)\n\tif (DUK_LIKELY(DUK_TVAL_IS_NUMBER(tv_x) && DUK_TVAL_IS_NUMBER(tv_y))) {\n\t\treturn duk__compare_number(retval,\n\t\t                           DUK_TVAL_GET_NUMBER(tv_x),\n\t\t                           DUK_TVAL_GET_NUMBER(tv_y));\n\t}\n#endif\n\n\t/* Slow path */\n\n\tduk_push_tval(thr, tv_x);\n\tduk_push_tval(thr, tv_y);\n\n\tif (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) {\n\t\tduk_to_primitive(thr, -2, DUK_HINT_NUMBER);\n\t\tduk_to_primitive(thr, -1, DUK_HINT_NUMBER);\n\t} else {\n\t\tduk_to_primitive(thr, -1, DUK_HINT_NUMBER);\n\t\tduk_to_primitive(thr, -2, DUK_HINT_NUMBER);\n\t}\n\n\t/* Note: reuse variables */\n\ttv_x = DUK_GET_TVAL_NEGIDX(thr, -2);\n\ttv_y = DUK_GET_TVAL_NEGIDX(thr, -1);\n\n\tif (DUK_TVAL_IS_STRING(tv_x) && DUK_TVAL_IS_STRING(tv_y)) {\n\t\tduk_hstring *h1 = DUK_TVAL_GET_STRING(tv_x);\n\t\tduk_hstring *h2 = DUK_TVAL_GET_STRING(tv_y);\n\t\tDUK_ASSERT(h1 != NULL);\n\t\tDUK_ASSERT(h2 != NULL);\n\n\t\tif (DUK_LIKELY(!DUK_HSTRING_HAS_SYMBOL(h1) && !DUK_HSTRING_HAS_SYMBOL(h2))) {\n\t\t\trc = duk_js_string_compare(h1, h2);\n\t\t\tduk_pop_2_unsafe(thr);\n\t\t\tif (rc < 0) {\n\t\t\t\treturn retval ^ 1;\n\t\t\t} else {\n\t\t\t\treturn retval;\n\t\t\t}\n\t\t}\n\n\t\t/* One or both are Symbols: fall through to handle in the\n\t\t * generic path.  Concretely, ToNumber() will fail.\n\t\t */\n\t}\n\n\t/* Ordering should not matter (E5 Section 11.8.5, step 3.a). */\n#if 0\n\tif (flags & DUK_COMPARE_FLAG_EVAL_LEFT_FIRST) {\n\t\td1 = duk_to_number_m2(thr);\n\t\td2 = duk_to_number_m1(thr);\n\t} else {\n\t\td2 = duk_to_number_m1(thr);\n\t\td1 = duk_to_number_m2(thr);\n\t}\n#endif\n\td1 = duk_to_number_m2(thr);\n\td2 = duk_to_number_m1(thr);\n\n\t/* We want to duk_pop_2_unsafe(thr); because the values are numbers\n\t * no decref check is needed.\n\t */\n#if defined(DUK_USE_PREFER_SIZE)\n\tduk_pop_2_nodecref_unsafe(thr);\n#else\n\tDUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -2)));\n\tDUK_ASSERT(!DUK_TVAL_NEEDS_REFCOUNT_UPDATE(duk_get_tval(thr, -1)));\n\tDUK_ASSERT(duk_get_top(thr) >= 2);\n\tthr->valstack_top -= 2;\n\ttv_x = thr->valstack_top;\n\ttv_y = tv_x + 1;\n\tDUK_TVAL_SET_UNDEFINED(tv_x);  /* Value stack policy */\n\tDUK_TVAL_SET_UNDEFINED(tv_y);\n#endif\n\n\treturn duk__compare_number(retval, d1, d2);\n}\n\n/*\n *  instanceof\n */\n\n/*\n *  E5 Section 11.8.6 describes the main algorithm, which uses\n *  [[HasInstance]].  [[HasInstance]] is defined for only\n *  function objects:\n *\n *    - Normal functions:\n *      E5 Section 15.3.5.3\n *    - Functions established with Function.prototype.bind():\n *      E5 Section 15.3.4.5.3\n *\n *  For other objects, a TypeError is thrown.\n *\n *  Limited Proxy support: don't support 'getPrototypeOf' trap but\n *  continue lookup in Proxy target if the value is a Proxy.\n */\n\nDUK_INTERNAL duk_bool_t duk_js_instanceof(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) {\n\tduk_hobject *func;\n\tduk_hobject *val;\n\tduk_hobject *proto;\n\tduk_tval *tv;\n\tduk_bool_t skip_first;\n\tduk_uint_t sanity;\n\n\t/*\n\t *  Get the values onto the stack first.  It would be possible to cover\n\t *  some normal cases without resorting to the value stack.\n\t *\n\t *  The right hand side could be a light function (as they generally\n\t *  behave like objects).  Light functions never have a 'prototype'\n\t *  property so E5.1 Section 15.3.5.3 step 3 always throws a TypeError.\n\t *  Using duk_require_hobject() is thus correct (except for error msg).\n\t */\n\n\tduk_push_tval(thr, tv_x);\n\tduk_push_tval(thr, tv_y);\n\tfunc = duk_require_hobject(thr, -1);\n\tDUK_ASSERT(func != NULL);\n\n\t/*\n\t *  For bound objects, [[HasInstance]] just calls the target function\n\t *  [[HasInstance]].  If that is again a bound object, repeat until\n\t *  we find a non-bound Function object.\n\t *\n\t *  The bound function chain is now \"collapsed\" so there can be only\n\t *  one bound function in the chain.\n\t */\n\n\tif (!DUK_HOBJECT_IS_CALLABLE(func)) {\n\t\t/*\n\t\t *  Note: of native Ecmascript objects, only Function instances\n\t\t *  have a [[HasInstance]] internal property.  Custom objects might\n\t\t *  also have it, but not in current implementation.\n\t\t *\n\t\t *  XXX: add a separate flag, DUK_HOBJECT_FLAG_ALLOW_INSTANCEOF?\n\t\t */\n\t\tgoto error_invalid_rval;\n\t}\n\n\tif (DUK_HOBJECT_HAS_BOUNDFUNC(func)) {\n\t\tduk_push_tval(thr, &((duk_hboundfunc *) func)->target);\n\t\tduk_replace(thr, -2);\n\t\tfunc = duk_require_hobject(thr, -1);  /* lightfunc throws */\n\n\t\t/* Rely on Function.prototype.bind() never creating bound\n\t\t * functions whose target is not proper.\n\t\t */\n\t\tDUK_ASSERT(func != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func));\n\t}\n\n\t/*\n\t *  'func' is now a non-bound object which supports [[HasInstance]]\n\t *  (which here just means DUK_HOBJECT_FLAG_CALLABLE).  Move on\n\t *  to execute E5 Section 15.3.5.3.\n\t */\n\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));\n\tDUK_ASSERT(DUK_HOBJECT_IS_CALLABLE(func));\n\n\t/* [ ... lval rval(func) ] */\n\n\t/* For lightfuncs, buffers, and pointers start the comparison directly\n\t * from the virtual prototype object.\n\t */\n\tskip_first = 0;\n\ttv = DUK_GET_TVAL_NEGIDX(thr, -2);\n\tswitch (DUK_TVAL_GET_TAG(tv)) {\n\tcase DUK_TAG_LIGHTFUNC:\n\t\tval = thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE];\n\t\tDUK_ASSERT(val != NULL);\n\t\tbreak;\n\tcase DUK_TAG_BUFFER:\n\t\tval = thr->builtins[DUK_BIDX_UINT8ARRAY_PROTOTYPE];\n\t\tDUK_ASSERT(val != NULL);\n\t\tbreak;\n\tcase DUK_TAG_POINTER:\n\t\tval = thr->builtins[DUK_BIDX_POINTER_PROTOTYPE];\n\t\tDUK_ASSERT(val != NULL);\n\t\tbreak;\n\tcase DUK_TAG_OBJECT:\n\t\tskip_first = 1;  /* Ignore object itself on first round. */\n\t\tval = DUK_TVAL_GET_OBJECT(tv);\n\t\tDUK_ASSERT(val != NULL);\n\t\tbreak;\n\tdefault:\n\t\tgoto pop2_and_false;\n\t}\n\tDUK_ASSERT(val != NULL);  /* Loop doesn't actually rely on this. */\n\n\t/* Look up .prototype of rval.  Leave it on the value stack in case it\n\t * has been virtualized (e.g. getter, Proxy trap).\n\t */\n\tduk_get_prop_stridx_short(thr, -1, DUK_STRIDX_PROTOTYPE);  /* -> [ ... lval rval rval.prototype ] */\n#if defined(DUK_USE_VERBOSE_ERRORS)\n\tproto = duk_get_hobject(thr, -1);\n\tif (proto == NULL) {\n\t\tgoto error_invalid_rval_noproto;\n\t}\n#else\n\tproto = duk_require_hobject(thr, -1);\n#endif\n\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\tdo {\n\t\t/*\n\t\t *  Note: prototype chain is followed BEFORE first comparison.  This\n\t\t *  means that the instanceof lval is never itself compared to the\n\t\t *  rval.prototype property.  This is apparently intentional, see E5\n\t\t *  Section 15.3.5.3, step 4.a.\n\t\t *\n\t\t *  Also note:\n\t\t *\n\t\t *      js> (function() {}) instanceof Function\n\t\t *      true\n\t\t *      js> Function instanceof Function\n\t\t *      true\n\t\t *\n\t\t *  For the latter, h_proto will be Function.prototype, which is the\n\t\t *  built-in Function prototype.  Because Function.[[Prototype]] is\n\t\t *  also the built-in Function prototype, the result is true.\n\t\t */\n\n\t\tif (!val) {\n\t\t\tgoto pop3_and_false;\n\t\t}\n\n\t\tDUK_ASSERT(val != NULL);\n#if defined(DUK_USE_ES6_PROXY)\n\t\tval = duk_hobject_resolve_proxy_target(val);\n#endif\n\n\t\tif (skip_first) {\n\t\t\tskip_first = 0;\n\t\t} else if (val == proto) {\n\t\t\tgoto pop3_and_true;\n\t\t}\n\n\t\tDUK_ASSERT(val != NULL);\n\t\tval = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, val);\n\t} while (--sanity > 0);\n\n\tif (DUK_UNLIKELY(sanity == 0)) {\n\t\tDUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);\n\t}\n\tDUK_UNREACHABLE();\n\n pop2_and_false:\n\tduk_pop_2_unsafe(thr);\n\treturn 0;\n\n pop3_and_false:\n\tduk_pop_3_unsafe(thr);\n\treturn 0;\n\n pop3_and_true:\n\tduk_pop_3_unsafe(thr);\n\treturn 1;\n\n error_invalid_rval:\n\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL);\n\treturn 0;\n\n#if defined(DUK_USE_VERBOSE_ERRORS)\n error_invalid_rval_noproto:\n\tDUK_ERROR_TYPE(thr, DUK_STR_INVALID_INSTANCEOF_RVAL_NOPROTO);\n\treturn 0;\n#endif\n}\n\n/*\n *  in\n */\n\n/*\n *  E5 Sections 11.8.7, 8.12.6.\n *\n *  Basically just a property existence check using [[HasProperty]].\n */\n\nDUK_INTERNAL duk_bool_t duk_js_in(duk_hthread *thr, duk_tval *tv_x, duk_tval *tv_y) {\n\tduk_bool_t retval;\n\n\t/*\n\t *  Get the values onto the stack first.  It would be possible to cover\n\t *  some normal cases without resorting to the value stack (e.g. if\n\t *  lval is already a string).\n\t */\n\n\t/* XXX: The ES5/5.1/6 specifications require that the key in 'key in obj'\n\t * must be string coerced before the internal HasProperty() algorithm is\n\t * invoked.  A fast path skipping coercion could be safely implemented for\n\t * numbers (as number-to-string coercion has no side effects).  For ES2015\n\t * proxy behavior, the trap 'key' argument must be in a string coerced\n\t * form (which is a shame).\n\t */\n\n\t/* TypeError if rval is not an object or object like (e.g. lightfunc\n\t * or plain buffer).\n\t */\n\tduk_push_tval(thr, tv_x);\n\tduk_push_tval(thr, tv_y);\n\tduk_require_type_mask(thr, -1, DUK_TYPE_MASK_OBJECT | DUK_TYPE_MASK_LIGHTFUNC | DUK_TYPE_MASK_BUFFER);\n\n\t(void) duk_to_property_key_hstring(thr, -2);\n\n\tretval = duk_hobject_hasprop(thr,\n\t                             DUK_GET_TVAL_NEGIDX(thr, -1),\n\t                             DUK_GET_TVAL_NEGIDX(thr, -2));\n\n\tduk_pop_2_unsafe(thr);\n\treturn retval;\n}\n\n/*\n *  typeof\n *\n *  E5 Section 11.4.3.\n *\n *  Very straightforward.  The only question is what to return for our\n *  non-standard tag / object types.\n *\n *  There is an unfortunate string constant define naming problem with\n *  typeof return values for e.g. \"Object\" and \"object\"; careful with\n *  the built-in string defines.  The LC_XXX defines are used for the\n *  lowercase variants now.\n */\n\nDUK_INTERNAL duk_small_uint_t duk_js_typeof_stridx(duk_tval *tv_x) {\n\tduk_small_uint_t stridx = 0;\n\n\tswitch (DUK_TVAL_GET_TAG(tv_x)) {\n\tcase DUK_TAG_UNDEFINED: {\n\t\tstridx = DUK_STRIDX_LC_UNDEFINED;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_NULL: {\n\t\t/* Note: not a typo, \"object\" is returned for a null value. */\n\t\tstridx = DUK_STRIDX_LC_OBJECT;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BOOLEAN: {\n\t\tstridx = DUK_STRIDX_LC_BOOLEAN;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_POINTER: {\n\t\t/* Implementation specific. */\n\t\tstridx = DUK_STRIDX_LC_POINTER;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_STRING: {\n\t\tduk_hstring *str;\n\n\t\t/* All internal keys are identified as Symbols. */\n\t\tstr = DUK_TVAL_GET_STRING(tv_x);\n\t\tDUK_ASSERT(str != NULL);\n\t\tif (DUK_UNLIKELY(DUK_HSTRING_HAS_SYMBOL(str))) {\n\t\t\tstridx = DUK_STRIDX_LC_SYMBOL;\n\t\t} else {\n\t\t\tstridx = DUK_STRIDX_LC_STRING;\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_TAG_OBJECT: {\n\t\tduk_hobject *obj = DUK_TVAL_GET_OBJECT(tv_x);\n\t\tDUK_ASSERT(obj != NULL);\n\t\tif (DUK_HOBJECT_IS_CALLABLE(obj)) {\n\t\t\tstridx = DUK_STRIDX_LC_FUNCTION;\n\t\t} else {\n\t\t\tstridx = DUK_STRIDX_LC_OBJECT;\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_TAG_BUFFER: {\n\t\t/* Implementation specific.  In Duktape 1.x this would be\n\t\t * 'buffer', in Duktape 2.x changed to 'object' because plain\n\t\t * buffers now mimic Uint8Array objects.\n\t\t */\n\t\tstridx = DUK_STRIDX_LC_OBJECT;\n\t\tbreak;\n\t}\n\tcase DUK_TAG_LIGHTFUNC: {\n\t\tstridx = DUK_STRIDX_LC_FUNCTION;\n\t\tbreak;\n\t}\n#if defined(DUK_USE_FASTINT)\n\tcase DUK_TAG_FASTINT:\n#endif\n\tdefault: {\n\t\t/* number */\n\t\tDUK_ASSERT(!DUK_TVAL_IS_UNUSED(tv_x));\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_x));\n\t\tstridx = DUK_STRIDX_LC_NUMBER;\n\t\tbreak;\n\t}\n\t}\n\n\tDUK_ASSERT_STRIDX_VALID(stridx);\n\treturn stridx;\n}\n\n/*\n *  Array index and length\n *\n *  Array index: E5 Section 15.4\n *  Array length: E5 Section 15.4.5.1 steps 3.c - 3.d (array length write)\n */\n\n/* Compure array index from string context, or return a \"not array index\"\n * indicator.\n */\nDUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_string(const duk_uint8_t *str, duk_uint32_t blen) {\n\tduk_uarridx_t res;\n\n\t/* Only strings with byte length 1-10 can be 32-bit array indices.\n\t * Leading zeroes (except '0' alone), plus/minus signs are not allowed.\n\t * We could do a lot of prechecks here, but since most strings won't\n\t * start with any digits, it's simpler to just parse the number and\n\t * fail quickly.\n\t */\n\n\tres = 0;\n\tif (blen == 0) {\n\t\tgoto parse_fail;\n\t}\n\tdo {\n\t\tduk_uarridx_t dig;\n\t\tdig = (duk_uarridx_t) (*str++) - DUK_ASC_0;\n\n\t\tif (dig <= 9U) {\n\t\t\t/* Careful overflow handling.  When multiplying by 10:\n\t\t\t * - 0x19999998 x 10 = 0xfffffff0: no overflow, and adding\n\t\t\t *   0...9 is safe.\n\t\t\t * - 0x19999999 x 10 = 0xfffffffa: no overflow, adding\n\t\t\t *   0...5 is safe, 6...9 overflows.\n\t\t\t * - 0x1999999a x 10 = 0x100000004: always overflow.\n\t\t\t */\n\t\t\tif (DUK_UNLIKELY(res >= 0x19999999UL)) {\n\t\t\t\tif (res >= 0x1999999aUL) {\n\t\t\t\t\t/* Always overflow. */\n\t\t\t\t\tgoto parse_fail;\n\t\t\t\t}\n\t\t\t\tDUK_ASSERT(res == 0x19999999UL);\n\t\t\t\tif (dig >= 6U) {\n\t\t\t\t\tgoto parse_fail;\n\t\t\t\t}\n\t\t\t\tres = 0xfffffffaUL + dig;\n\t\t\t\tDUK_ASSERT(res >= 0xfffffffaUL);\n\t\t\t\tDUK_ASSERT_DISABLE(res <= 0xffffffffUL);  /* range */\n\t\t\t} else {\n\t\t\t\tres = res * 10U + dig;\n\t\t\t\tif (DUK_UNLIKELY(res == 0)) {\n\t\t\t\t\t/* If 'res' is 0, previous 'res' must\n\t\t\t\t\t * have been 0 and we scanned in a zero.\n\t\t\t\t\t * This is only allowed if blen == 1,\n\t\t\t\t\t * i.e. the exact string '0'.\n\t\t\t\t\t */\n\t\t\t\t\tif (blen == (duk_uint32_t) 1) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tgoto parse_fail;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t/* Because 'dig' is unsigned, catches both values\n\t\t\t * above '9' and below '0'.\n\t\t\t */\n\t\t\tgoto parse_fail;\n\t\t}\n\t} while (--blen > 0);\n\n\treturn res;\n\n parse_fail:\n\treturn DUK_HSTRING_NO_ARRAY_INDEX;\n}\n\n#if !defined(DUK_USE_HSTRING_ARRIDX)\n/* Get array index for a string which is known to be an array index.  This helper\n * is needed when duk_hstring doesn't concretely store the array index, but strings\n * are flagged as array indices at intern time.\n */\nDUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast_known(duk_hstring *h) {\n\tconst duk_uint8_t *p;\n\tduk_uarridx_t res;\n\tduk_uint8_t t;\n\n\tDUK_ASSERT(h != NULL);\n\tDUK_ASSERT(DUK_HSTRING_HAS_ARRIDX(h));\n\n\tp = DUK_HSTRING_GET_DATA(h);\n\tres = 0;\n\tfor (;;) {\n\t\tt = *p++;\n\t\tif (DUK_UNLIKELY(t == 0)) {\n\t\t\t/* Scanning to NUL is always safe for interned strings. */\n\t\t\tbreak;\n\t\t}\n\t\tDUK_ASSERT(t >= (duk_uint8_t) DUK_ASC_0 && t <= (duk_uint8_t) DUK_ASC_9);\n\t\tres = res * 10U + (duk_uarridx_t) t - (duk_uarridx_t) DUK_ASC_0;\n\t}\n\treturn res;\n}\n\nDUK_INTERNAL duk_uarridx_t duk_js_to_arrayindex_hstring_fast(duk_hstring *h) {\n\tDUK_ASSERT(h != NULL);\n\tif (!DUK_HSTRING_HAS_ARRIDX(h)) {\n\t\treturn DUK_HSTRING_NO_ARRAY_INDEX;\n\t}\n\treturn duk_js_to_arrayindex_hstring_fast_known(h);\n}\n#endif  /* DUK_USE_HSTRING_ARRIDX */\n#line 1 \"duk_js_var.c\"\n/*\n *  Identifier access and function closure handling.\n *\n *  Provides the primitives for slow path identifier accesses: GETVAR,\n *  PUTVAR, DELVAR, etc.  The fast path, direct register accesses, should\n *  be used for most identifier accesses.  Consequently, these slow path\n *  primitives should be optimized for maximum compactness.\n *\n *  Ecmascript environment records (declarative and object) are represented\n *  as internal objects with control keys.  Environment records have a\n *  parent record (\"outer environment reference\") which is represented by\n *  the implicit prototype for technical reasons (in other words, it is a\n *  convenient field).  The prototype chain is not followed in the ordinary\n *  sense for variable lookups.\n *\n *  See identifier-handling.rst for more details on the identifier algorithms\n *  and the internal representation.  See function-objects.rst for details on\n *  what function templates and instances are expected to look like.\n *\n *  Care must be taken to avoid duk_tval pointer invalidation caused by\n *  e.g. value stack or object resizing.\n *\n *  TODO: properties for function instances could be initialized much more\n *  efficiently by creating a property allocation for a certain size and\n *  filling in keys and values directly (and INCREFing both with \"bulk incref\"\n *  primitives.\n *\n *  XXX: duk_hobject_getprop() and duk_hobject_putprop() calls are a bit\n *  awkward (especially because they follow the prototype chain); rework\n *  if \"raw\" own property helpers are added.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Local result type for duk__get_identifier_reference() lookup.\n */\n\ntypedef struct {\n\tduk_hobject *env;\n\tduk_hobject *holder;      /* for object-bound identifiers */\n\tduk_tval *value;          /* for register-bound and declarative env identifiers */\n\tduk_uint_t attrs;         /* property attributes for identifier (relevant if value != NULL) */\n\tduk_bool_t has_this;      /* for object-bound identifiers: provide 'this' binding */\n} duk__id_lookup_result;\n\n/*\n *  Create a new function object based on a \"template function\" which contains\n *  compiled bytecode, constants, etc, but lacks a lexical environment.\n *\n *  Ecmascript requires that each created closure is a separate object, with\n *  its own set of editable properties.  However, structured property values\n *  (such as the formal arguments list and the variable map) are shared.\n *  Also the bytecode, constants, and inner functions are shared.\n *\n *  See E5 Section 13.2 for detailed requirements on the function objects;\n *  there are no similar requirements for function \"templates\" which are an\n *  implementation dependent internal feature.  Also see function-objects.rst\n *  for a discussion on the function instance properties provided by this\n *  implementation.\n *\n *  Notes:\n *\n *   * Order of internal properties should match frequency of use, since the\n *     properties will be linearly scanned on lookup (functions usually don't\n *     have enough properties to warrant a hash part).\n *\n *   * The created closure is independent of its template; they do share the\n *     same 'data' buffer object, but the template object itself can be freed\n *     even if the closure object remains reachable.\n */\n\nDUK_LOCAL void duk__inc_data_inner_refcounts(duk_hthread *thr, duk_hcompfunc *f) {\n\tduk_tval *tv, *tv_end;\n\tduk_hobject **funcs, **funcs_end;\n\n\tDUK_UNREF(thr);\n\n\t/* If function creation fails due to out-of-memory, the data buffer\n\t * pointer may be NULL in some cases.  That's actually possible for\n\t * GC code, but shouldn't be possible here because the incomplete\n\t * function will be unwound from the value stack and never instantiated.\n\t */\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, f) != NULL);\n\n\ttv = DUK_HCOMPFUNC_GET_CONSTS_BASE(thr->heap, f);\n\ttv_end = DUK_HCOMPFUNC_GET_CONSTS_END(thr->heap, f);\n\twhile (tv < tv_end) {\n\t\tDUK_TVAL_INCREF(thr, tv);\n\t\ttv++;\n\t}\n\n\tfuncs = DUK_HCOMPFUNC_GET_FUNCS_BASE(thr->heap, f);\n\tfuncs_end = DUK_HCOMPFUNC_GET_FUNCS_END(thr->heap, f);\n\twhile (funcs < funcs_end) {\n\t\tDUK_HEAPHDR_INCREF(thr, (duk_heaphdr *) *funcs);\n\t\tfuncs++;\n\t}\n}\n\n/* Push a new closure on the stack.\n *\n * Note: if fun_temp has NEWENV, i.e. a new lexical and variable declaration\n * is created when the function is called, only outer_lex_env matters\n * (outer_var_env is ignored and may or may not be same as outer_lex_env).\n */\n\nDUK_LOCAL const duk_uint16_t duk__closure_copy_proplist[] = {\n\t/* order: most frequent to least frequent */\n\tDUK_STRIDX_INT_VARMAP,\n\tDUK_STRIDX_INT_FORMALS,\n#if defined(DUK_USE_PC2LINE)\n\tDUK_STRIDX_INT_PC2LINE,\n#endif\n#if defined(DUK_USE_FUNC_FILENAME_PROPERTY)\n\tDUK_STRIDX_FILE_NAME,\n#endif\n#if defined(DUK_USE_NONSTD_FUNC_SOURCE_PROPERTY)\n\tDUK_STRIDX_INT_SOURCE\n#endif\n};\n\nDUK_INTERNAL\nvoid duk_js_push_closure(duk_hthread *thr,\n                         duk_hcompfunc *fun_temp,\n                         duk_hobject *outer_var_env,\n                         duk_hobject *outer_lex_env,\n                         duk_bool_t add_auto_proto) {\n\tduk_hcompfunc *fun_clos;\n\tduk_small_uint_t i;\n\tduk_uint_t len_value;\n\n\tDUK_ASSERT(fun_temp != NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp) != NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp) != NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp) != NULL);\n\tDUK_ASSERT(outer_var_env != NULL);\n\tDUK_ASSERT(outer_lex_env != NULL);\n\tDUK_UNREF(len_value);\n\n\tfun_clos = duk_push_hcompfunc(thr);\n\tDUK_ASSERT(fun_clos != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) fun_clos) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n\n\tduk_push_hobject(thr, &fun_temp->obj);  /* -> [ ... closure template ] */\n\n\tDUK_ASSERT(DUK_HOBJECT_IS_COMPFUNC((duk_hobject *) fun_clos));\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) == NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) == NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) == NULL);\n\n\tDUK_HCOMPFUNC_SET_DATA(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_temp));\n\tDUK_HCOMPFUNC_SET_FUNCS(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_temp));\n\tDUK_HCOMPFUNC_SET_BYTECODE(thr->heap, fun_clos, DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_temp));\n\n\t/* Note: all references inside 'data' need to get their refcounts\n\t * upped too.  This is the case because refcounts are decreased\n\t * through every function referencing 'data' independently.\n\t */\n\n\tDUK_HBUFFER_INCREF(thr, DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos));\n\tduk__inc_data_inner_refcounts(thr, fun_temp);\n\n\tfun_clos->nregs = fun_temp->nregs;\n\tfun_clos->nargs = fun_temp->nargs;\n#if defined(DUK_USE_DEBUGGER_SUPPORT)\n\tfun_clos->start_line = fun_temp->start_line;\n\tfun_clos->end_line = fun_temp->end_line;\n#endif\n\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_DATA(thr->heap, fun_clos) != NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_FUNCS(thr->heap, fun_clos) != NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_BYTECODE(thr->heap, fun_clos) != NULL);\n\n\t/* XXX: Could also copy from template, but there's no way to have any\n\t * other value here now (used code has no access to the template).\n\t * Prototype is set by duk_push_hcompfunc().\n\t */\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n#if 0\n\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &fun_clos->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n#endif\n\n\t/* Copy duk_hobject flags as is from the template using a mask.\n\t * Leave out duk_heaphdr owned flags just in case (e.g. if there's\n\t * some GC flag or similar).  Some flags can then be adjusted\n\t * separately if necessary.\n\t */\n\n\t/* DUK_HEAPHDR_SET_FLAGS() masks changes to non-duk_heaphdr flags only. */\n\tDUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) fun_clos, DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp));\n\tDUK_DD(DUK_DDPRINT(\"fun_temp heaphdr flags: 0x%08lx, fun_clos heaphdr flags: 0x%08lx\",\n\t                   (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_temp),\n\t                   (unsigned long) DUK_HEAPHDR_GET_FLAGS_RAW((duk_heaphdr *) fun_clos)));\n\n\tDUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(&fun_clos->obj));\n\tDUK_ASSERT(DUK_HOBJECT_HAS_COMPFUNC(&fun_clos->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_NATFUNC(&fun_clos->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_IS_THREAD(&fun_clos->obj));\n\t/* DUK_HOBJECT_FLAG_ARRAY_PART: don't care */\n\t/* DUK_HOBJECT_FLAG_NEWENV: handled below */\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&fun_clos->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&fun_clos->obj));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&fun_clos->obj));\n\n\tif (!DUK_HOBJECT_HAS_CONSTRUCTABLE(&fun_clos->obj)) {\n\t\t/* If the template is not constructable don't add an automatic\n\t\t * .prototype property.  This is the case for e.g. ES2015 object\n\t\t * literal getters/setters and method definitions.\n\t\t */\n\t\tadd_auto_proto = 0;\n\t}\n\n\t/*\n\t *  Setup environment record properties based on the template and\n\t *  its flags.\n\t *\n\t *  If DUK_HOBJECT_HAS_NEWENV(fun_temp) is true, the environment\n\t *  records represent identifiers \"outside\" the function; the\n\t *  \"inner\" environment records are created on demand.  Otherwise,\n\t *  the environment records are those that will be directly used\n\t *  (e.g. for declarations).\n\t *\n\t *  _Lexenv is always set; _Varenv defaults to _Lexenv if missing,\n\t *  so _Varenv is only set if _Lexenv != _Varenv.\n\t *\n\t *  This is relatively complex, see doc/identifier-handling.rst.\n\t */\n\n\tif (DUK_HOBJECT_HAS_NEWENV(&fun_clos->obj)) {\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\t\tif (DUK_HOBJECT_HAS_NAMEBINDING(&fun_clos->obj)) {\n\t\t\tduk_hobject *proto;\n\t\t\tduk_hdecenv *new_env;\n\n\t\t\t/*\n\t\t\t *  Named function expression, name needs to be bound\n\t\t\t *  in an intermediate environment record.  The \"outer\"\n\t\t\t *  lexical/variable environment will thus be:\n\t\t\t *\n\t\t\t *  a) { funcname: <func>, __prototype: outer_lex_env }\n\t\t\t *  b) { funcname: <func>, __prototype:  <globalenv> }  (if outer_lex_env missing)\n\t\t\t */\n\n\t\t\tif (outer_lex_env) {\n\t\t\t\tproto = outer_lex_env;\n\t\t\t} else {\n\t\t\t\tproto = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\t\t\t}\n\n\t\t\t/* -> [ ... closure template env ] */\n\t\t\tnew_env = duk_hdecenv_alloc(thr,\n\t\t\t                            DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t\t\t                            DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));\n\t\t\tDUK_ASSERT(new_env != NULL);\n\t\t\tduk_push_hobject(thr, (duk_hobject *) new_env);\n\n\t\t\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) new_env) == NULL);\n\t\t\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) new_env, proto);\n\t\t\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, proto);\n\n\t\t\tDUK_ASSERT(new_env->thread == NULL);  /* Closed. */\n\t\t\tDUK_ASSERT(new_env->varmap == NULL);\n\n\t\t\t/* It's important that duk_xdef_prop() is a 'raw define' so that any\n\t\t\t * properties in an ancestor are never an issue (they should never be\n\t\t\t * e.g. non-writable, but just in case).\n\t\t\t *\n\t\t\t * Because template objects are not visible to user code, the case\n\t\t\t * where .name is missing shouldn't happen in practice.  It it does,\n\t\t\t * the name 'undefined' gets bound and maps to the closure (which is\n\t\t\t * a bit odd, but safe).\n\t\t\t */\n\t\t\t(void) duk_get_prop_stridx_short(thr, -2, DUK_STRIDX_NAME);\n\t\t\t/* -> [ ... closure template env funcname ] */\n\t\t\tduk_dup_m4(thr);                                           /* -> [ ... closure template env funcname closure ] */\n\t\t\tduk_xdef_prop(thr, -3, DUK_PROPDESC_FLAGS_NONE);           /* -> [ ... closure template env ] */\n\t\t\t/* env[funcname] = closure */\n\n\t\t\t/* [ ... closure template env ] */\n\n\t\t\tDUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, (duk_hobject *) new_env);\n\t\t\tDUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, (duk_hobject *) new_env);\n\t\t\tDUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env);\n\t\t\tDUK_HOBJECT_INCREF(thr, (duk_hobject *) new_env);\n\t\t\tduk_pop_unsafe(thr);\n\n\t\t\t/* [ ... closure template ] */\n\t\t}\n\t\telse\n#endif  /* DUK_USE_FUNC_NAME_PROPERTY */\n\t\t{\n\t\t\t/*\n\t\t\t *  Other cases (function declaration, anonymous function expression,\n\t\t\t *  strict direct eval code).  The \"outer\" environment will be whatever\n\t\t\t *  the caller gave us.\n\t\t\t */\n\n\t\t\tDUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env);\n\t\t\tDUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_lex_env);\n\t\t\tDUK_HOBJECT_INCREF(thr, outer_lex_env);\n\t\t\tDUK_HOBJECT_INCREF(thr, outer_lex_env);\n\n\t\t\t/* [ ... closure template ] */\n\t\t}\n\t} else {\n\t\t/*\n\t\t *  Function gets no new environment when called.  This is the\n\t\t *  case for global code, indirect eval code, and non-strict\n\t\t *  direct eval code.  There is no direct correspondence to the\n\t\t *  E5 specification, as global/eval code is not exposed as a\n\t\t *  function.\n\t\t */\n\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_NAMEBINDING(&fun_temp->obj));\n\n\t\tDUK_HCOMPFUNC_SET_LEXENV(thr->heap, fun_clos, outer_lex_env);\n\t\tDUK_HCOMPFUNC_SET_VARENV(thr->heap, fun_clos, outer_var_env);\n\t\tDUK_HOBJECT_INCREF(thr, outer_lex_env);  /* NULLs not allowed; asserted on entry */\n\t\tDUK_HOBJECT_INCREF(thr, outer_var_env);\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"closure varenv -> %!ipO, lexenv -> %!ipO\",\n\t                     (duk_heaphdr *) fun_clos->var_env,\n\t                     (duk_heaphdr *) fun_clos->lex_env));\n\n\t/* Call handling assumes this for all callable closures. */\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_LEXENV(thr->heap, fun_clos) != NULL);\n\tDUK_ASSERT(DUK_HCOMPFUNC_GET_VARENV(thr->heap, fun_clos) != NULL);\n\n\t/*\n\t *  Copy some internal properties directly\n\t *\n\t *  The properties will be non-writable and non-enumerable, but\n\t *  configurable.\n\t */\n\n\t/* [ ... closure template ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"copying properties: closure=%!iT, template=%!iT\",\n\t                     (duk_tval *) duk_get_tval(thr, -2),\n\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\n\tfor (i = 0; i < (duk_small_uint_t) (sizeof(duk__closure_copy_proplist) / sizeof(duk_uint16_t)); i++) {\n\t\tduk_small_int_t stridx = (duk_small_int_t) duk__closure_copy_proplist[i];\n\t\tif (duk_get_prop_stridx_short(thr, -1, stridx)) {\n\t\t\t/* [ ... closure template val ] */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"copying property, stridx=%ld -> found\", (long) stridx));\n\t\t\tduk_xdef_prop_stridx_short(thr, -3, stridx, DUK_PROPDESC_FLAGS_C);\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"copying property, stridx=%ld -> not found\", (long) stridx));\n\t\t\tduk_pop_unsafe(thr);\n\t\t}\n\t}\n\n\t/*\n\t *  \"length\" maps to number of formals (E5 Section 13.2) for function\n\t *  declarations/expressions (non-bound functions).  Note that 'nargs'\n\t *  is NOT necessarily equal to the number of arguments.  Use length\n\t *  of _Formals; if missing, assume nargs matches .length.\n\t */\n\n\t/* [ ... closure template ] */\n\n\t/* XXX: these lookups should be just own property lookups instead of\n\t * looking up the inheritance chain.\n\t */\n\tif (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_INT_FORMALS)) {\n\t\t/* [ ... closure template formals ] */\n\t\tlen_value = (duk_uint_t) duk_get_length(thr, -1);  /* could access duk_harray directly, not important */\n\t\tDUK_DD(DUK_DDPRINT(\"closure length from _Formals -> %ld\", (long) len_value));\n\t} else {\n\t\tlen_value = fun_temp->nargs;\n\t\tDUK_DD(DUK_DDPRINT(\"closure length defaulted from nargs -> %ld\", (long) len_value));\n\t}\n\tduk_pop_unsafe(thr);\n\n\tduk_push_uint(thr, len_value);  /* [ ... closure template len_value ] */\n\tduk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_C);\n\n\t/*\n\t *  \"prototype\" is, by default, a fresh object with the \"constructor\"\n\t *  property.\n\t *\n\t *  Note that this creates a circular reference for every function\n\t *  instance (closure) which prevents refcount-based collection of\n\t *  function instances.\n\t *\n\t *  XXX: Try to avoid creating the default prototype object, because\n\t *  many functions are not used as constructors and the default\n\t *  prototype is unnecessary.  Perhaps it could be created on-demand\n\t *  when it is first accessed?\n\t */\n\n\t/* [ ... closure template ] */\n\n\tif (add_auto_proto) {\n\t\tduk_push_object(thr);  /* -> [ ... closure template newobj ] */\n\t\tduk_dup_m3(thr);       /* -> [ ... closure template newobj closure ] */\n\t\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC);  /* -> [ ... closure template newobj ] */\n\t\tduk_compact(thr, -1);  /* compact the prototype */\n\t\tduk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W);     /* -> [ ... closure template ] */\n\t}\n\n\t/*\n\t *  \"arguments\" and \"caller\" must be mapped to throwers for strict\n\t *  mode and bound functions (E5 Section 15.3.5).\n\t *\n\t *  XXX: This is expensive to have for every strict function instance.\n\t *  Try to implement as virtual properties or on-demand created properties.\n\t */\n\n\t/* [ ... closure template ] */\n\n\tif (DUK_HOBJECT_HAS_STRICT(&fun_clos->obj)) {\n\t\tduk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_CALLER);\n\t\tduk_xdef_prop_stridx_thrower(thr, -2, DUK_STRIDX_LC_ARGUMENTS);\n\t} else {\n#if defined(DUK_USE_NONSTD_FUNC_CALLER_PROPERTY)\n\t\tDUK_DDD(DUK_DDDPRINT(\"function is non-strict and non-standard 'caller' property in use, add initial 'null' value\"));\n\t\tduk_push_null(thr);\n\t\tduk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE);\n#else\n\t\tDUK_DDD(DUK_DDDPRINT(\"function is non-strict and non-standard 'caller' property not used\"));\n#endif\n\t}\n\n\t/*\n\t *  \"name\" used to be non-standard but is now defined by ES2015.\n\t *  In ES2015/ES2016 the .name property is configurable.\n\t */\n\n\t/* [ ... closure template ] */\n\n#if defined(DUK_USE_FUNC_NAME_PROPERTY)\n\t/* XXX: Look for own property only; doesn't matter much because\n\t * templates are bare objects.\n\t */\n\tif (duk_get_prop_stridx_short(thr, -1, DUK_STRIDX_NAME)) {\n\t\t/* [ ... closure template name ] */\n\t\tDUK_ASSERT(duk_is_string(thr, -1));\n\t\tDUK_DD(DUK_DDPRINT(\"setting function instance name to %!T\", duk_get_tval(thr, -1)));\n\t\tduk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_C);  /* -> [ ... closure template ] */\n\t} else {\n\t\t/* Anonymous functions don't have a .name in ES2015, so don't set\n\t\t * it on the instance either.  The instance will then inherit\n\t\t * it from Function.prototype.name.\n\t\t */\n\t\tDUK_DD(DUK_DDPRINT(\"not setting function instance .name\"));\n\t\tduk_pop_unsafe(thr);\n\t}\n#endif\n\n\t/*\n\t *  Compact the closure, in most cases no properties will be added later.\n\t *  Also, without this the closures end up having unused property slots\n\t *  (e.g. in Duktape 0.9.0, 8 slots would be allocated and only 7 used).\n\t *  A better future solution would be to allocate the closure directly\n\t *  to correct size (and setup the properties directly without going\n\t *  through the API).\n\t */\n\n\tduk_compact(thr, -2);\n\n\t/*\n\t *  Some assertions (E5 Section 13.2).\n\t */\n\n\tDUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(&fun_clos->obj) == DUK_HOBJECT_CLASS_FUNCTION);\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, &fun_clos->obj) == thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]);\n\tDUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(&fun_clos->obj));\n\tDUK_ASSERT(duk_has_prop_stridx(thr, -2, DUK_STRIDX_LENGTH) != 0);\n\tDUK_ASSERT(add_auto_proto == 0 || duk_has_prop_stridx(thr, -2, DUK_STRIDX_PROTOTYPE) != 0);\n\t/* May be missing .name */\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) ||\n\t           duk_has_prop_stridx(thr, -2, DUK_STRIDX_CALLER) != 0);\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_STRICT(&fun_clos->obj) ||\n\t           duk_has_prop_stridx(thr, -2, DUK_STRIDX_LC_ARGUMENTS) != 0);\n\n\t/*\n\t *  Finish\n\t */\n\n\t/* [ ... closure template ] */\n\n\tDUK_DDD(DUK_DDDPRINT(\"created function instance: template=%!iT -> closure=%!iT\",\n\t                     (duk_tval *) duk_get_tval(thr, -1),\n\t                     (duk_tval *) duk_get_tval(thr, -2)));\n\n\tduk_pop_unsafe(thr);\n\n\t/* [ ... closure ] */\n}\n\n/*\n *  Delayed activation environment record initialization (for functions\n *  with NEWENV).\n *\n *  The non-delayed initialization is handled by duk_handle_call().\n */\n\n/* shared helper */\nDUK_INTERNAL\nduk_hobject *duk_create_activation_environment_record(duk_hthread *thr,\n                                                      duk_hobject *func,\n                                                      duk_size_t bottom_byteoff) {\n\tduk_hdecenv *env;\n\tduk_hobject *parent;\n\tduk_hcompfunc *f;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(func != NULL);\n\n\tf = (duk_hcompfunc *) func;\n\tparent = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f);\n\tif (!parent) {\n\t\tparent = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\t}\n\n\tenv = duk_hdecenv_alloc(thr,\n\t                        DUK_HOBJECT_FLAG_EXTENSIBLE |\n\t                        DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV));\n\tDUK_ASSERT(env != NULL);\n\tduk_push_hobject(thr, (duk_hobject *) env);\n\n\tDUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) env) == NULL);\n\tDUK_HOBJECT_SET_PROTOTYPE(thr->heap, (duk_hobject *) env, parent);\n\tDUK_HOBJECT_INCREF_ALLOWNULL(thr, parent);  /* parent env is the prototype */\n\n\t/* open scope information, for compiled functions only */\n\n\tDUK_ASSERT(env->thread == NULL);\n\tDUK_ASSERT(env->varmap == NULL);\n\tDUK_ASSERT(env->regbase_byteoff == 0);\n\tif (DUK_HOBJECT_IS_COMPFUNC(func)) {\n\t\tduk_hobject *varmap;\n\t\tduk_tval *tv;\n\n\t\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr));\n\t\tif (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) {\n\t\t\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));\n\t\t\tvarmap = DUK_TVAL_GET_OBJECT(tv);\n\t\t\tDUK_ASSERT(varmap != NULL);\n\t\t\tenv->varmap = varmap;\n\t\t\tDUK_HOBJECT_INCREF(thr, varmap);\n\t\t\tenv->thread = thr;\n\t\t\tDUK_HTHREAD_INCREF(thr, thr);\n\t\t\tenv->regbase_byteoff = bottom_byteoff;\n\t\t} else {\n\t\t\t/* If function has no _Varmap, leave the environment closed. */\n\t\t\tDUK_ASSERT(env->thread == NULL);\n\t\t\tDUK_ASSERT(env->varmap == NULL);\n\t\t\tDUK_ASSERT(env->regbase_byteoff == 0);\n\t\t}\n\t}\n\n\treturn (duk_hobject *) env;\n}\n\nDUK_INTERNAL\nvoid duk_js_init_activation_environment_records_delayed(duk_hthread *thr,\n                                                        duk_activation *act) {\n\tduk_hobject *func;\n\tduk_hobject *env;\n\n\tDUK_ASSERT(thr != NULL);\n\tfunc = DUK_ACT_GET_FUNC(act);\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_BOUNDFUNC(func));  /* bound functions are never in act 'func' */\n\n\t/*\n\t *  Delayed initialization only occurs for 'NEWENV' functions.\n\t */\n\n\tDUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func));\n\tDUK_ASSERT(act->lex_env == NULL);\n\tDUK_ASSERT(act->var_env == NULL);\n\n\tenv = duk_create_activation_environment_record(thr, func, act->bottom_byteoff);\n\tDUK_ASSERT(env != NULL);\n\t/* 'act' is a stable pointer, so still OK. */\n\n\tDUK_DDD(DUK_DDDPRINT(\"created delayed fresh env: %!ipO\", (duk_heaphdr *) env));\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n\t{\n\t\tduk_hobject *p = env;\n\t\twhile (p) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"  -> %!ipO\", (duk_heaphdr *) p));\n\t\t\tp = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, p);\n\t\t}\n\t}\n#endif\n\n\tact->lex_env = env;\n\tact->var_env = env;\n\tDUK_HOBJECT_INCREF(thr, env);  /* XXX: incref by count (here 2 times) */\n\tDUK_HOBJECT_INCREF(thr, env);\n\n\tduk_pop_unsafe(thr);\n}\n\n/*\n *  Closing environment records.\n *\n *  The environment record MUST be closed with the thread where its activation\n *  is; i.e. if 'env' is open, 'thr' must match env->thread, and the regbase\n *  and varmap must still be valid.  On entry, 'env' must be reachable.\n */\n\nDUK_INTERNAL void duk_js_close_environment_record(duk_hthread *thr, duk_hobject *env) {\n\tduk_uint_fast32_t i;\n\tduk_hobject *varmap;\n\tduk_hstring *key;\n\tduk_tval *tv;\n\tduk_uint_t regnum;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(env != NULL);\n\n\tif (DUK_UNLIKELY(!DUK_HOBJECT_IS_DECENV(env))) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"env not a declarative record: %!iO\", (duk_heaphdr *) env));\n\t\treturn;\n\t}\n\n\tvarmap = ((duk_hdecenv *) env)->varmap;\n\tif (varmap == NULL) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"env already closed: %!iO\", (duk_heaphdr *) env));\n\n\t\treturn;\n\t}\n\tDUK_ASSERT(((duk_hdecenv *) env)->thread != NULL);\n\tDUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env);\n\n\tDUK_DDD(DUK_DDDPRINT(\"closing env: %!iO\", (duk_heaphdr *) env));\n\tDUK_DDD(DUK_DDDPRINT(\"varmap: %!O\", (duk_heaphdr *) varmap));\n\n\t/* Env must be closed in the same thread as where it runs. */\n\tDUK_ASSERT(((duk_hdecenv *) env)->thread == thr);\n\n\t/* XXX: additional conditions when to close variables? we don't want to do it\n\t * unless the environment may have \"escaped\" (referenced in a function closure).\n\t * With delayed environments, the existence is probably good enough of a check.\n\t */\n\n\t/* Note: we rely on the _Varmap having a bunch of nice properties, like:\n\t *  - being compacted and unmodified during this process\n\t *  - not containing an array part\n\t *  - having correct value types\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"copying bound register values, %ld bound regs\", (long) DUK_HOBJECT_GET_ENEXT(varmap)));\n\n\t/* Copy over current variable values from value stack to the\n\t * environment record.  The scope object is empty but may\n\t * inherit from another scope which has conflicting names.\n\t */\n\n\t/* XXX: Do this using a once allocated entry area, no side effects.\n\t * Hash part would need special treatment however (maybe copy, and\n\t * then realloc with hash part if large enough).\n\t */\n\tfor (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(varmap); i++) {\n\t\tduk_size_t regbase_byteoff;\n\n\t\tkey = DUK_HOBJECT_E_GET_KEY(thr->heap, varmap, i);\n\t\tDUK_ASSERT(key != NULL);   /* assume keys are compact in _Varmap */\n\t\tDUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, varmap, i));  /* assume plain values */\n\n\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, varmap, i);\n\t\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\t\tDUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX);  /* limits */\n#if defined(DUK_USE_FASTINT)\n\t\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));\n\t\tregnum = (duk_uint_t) DUK_TVAL_GET_FASTINT_U32(tv);\n#else\n\t\tregnum = (duk_uint_t) DUK_TVAL_GET_NUMBER(tv);\n#endif\n\n\t\tregbase_byteoff = ((duk_hdecenv *) env)->regbase_byteoff;\n\t\tDUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum >= (duk_uint8_t *) thr->valstack);\n\t\tDUK_ASSERT((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum < (duk_uint8_t *) thr->valstack_top);\n\n\t\t/* If property already exists, overwrites silently.\n\t\t * Property is writable, but not deletable (not configurable\n\t\t * in terms of property attributes).\n\t\t */\n\t\tduk_push_tval(thr, (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + regbase_byteoff + sizeof(duk_tval) * regnum));\n\t\tDUK_DDD(DUK_DDDPRINT(\"closing identifier %!O -> reg %ld, value %!T\",\n\t\t                     (duk_heaphdr *) key,\n\t\t                     (long) regnum,\n\t\t                     (duk_tval *) duk_get_tval(thr, -1)));\n\t\tduk_hobject_define_property_internal(thr, env, key, DUK_PROPDESC_FLAGS_WE);\n\t}\n\n\t/* NULL atomically to avoid inconsistent state + side effects. */\n\tDUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->thread);\n\tDUK_HOBJECT_DECREF_NORZ(thr, ((duk_hdecenv *) env)->varmap);\n\t((duk_hdecenv *) env)->thread = NULL;\n\t((duk_hdecenv *) env)->varmap = NULL;\n\n\tDUK_DDD(DUK_DDDPRINT(\"env after closing: %!O\", (duk_heaphdr *) env));\n}\n\n/*\n *  GETIDREF: a GetIdentifierReference-like helper.\n *\n *  Provides a parent traversing lookup and a single level lookup\n *  (for HasBinding).\n *\n *  Instead of returning the value, returns a bunch of values allowing\n *  the caller to read, write, or delete the binding.  Value pointers\n *  are duk_tval pointers which can be mutated directly as long as\n *  refcounts are properly updated.  Note that any operation which may\n *  reallocate valstacks or compact objects may invalidate the returned\n *  duk_tval (but not object) pointers, so caller must be very careful.\n *\n *  If starting environment record 'env' is given, 'act' is ignored.\n *  However, if 'env' is NULL, the caller may identify, in 'act', an\n *  activation which hasn't had its declarative environment initialized\n *  yet.  The activation registers are then looked up, and its parent\n *  traversed normally.\n *\n *  The 'out' structure values are only valid if the function returns\n *  success (non-zero).\n */\n\n/* lookup name from an open declarative record's registers */\nDUK_LOCAL\nduk_bool_t duk__getid_open_decl_env_regs(duk_hthread *thr,\n                                         duk_hstring *name,\n                                         duk_hdecenv *env,\n                                         duk__id_lookup_result *out) {\n\tduk_tval *tv;\n\tduk_size_t reg_rel;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(name != NULL);\n\tDUK_ASSERT(env != NULL);\n\tDUK_ASSERT(out != NULL);\n\n\tDUK_ASSERT(DUK_HOBJECT_IS_DECENV((duk_hobject *) env));\n\tDUK_ASSERT_HDECENV_VALID(env);\n\n\tif (env->thread == NULL) {\n\t\t/* already closed */\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(env->varmap != NULL);\n\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, env->varmap, name);\n\tif (DUK_UNLIKELY(tv == NULL)) {\n\t\treturn 0;\n\t}\n\n\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\tDUK_ASSERT(DUK_TVAL_GET_NUMBER(tv) <= (duk_double_t) DUK_UINT32_MAX);  /* limits */\n#if defined(DUK_USE_FASTINT)\n\tDUK_ASSERT(DUK_TVAL_IS_FASTINT(tv));\n\treg_rel = (duk_size_t) DUK_TVAL_GET_FASTINT_U32(tv);\n#else\n\treg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv);\n#endif\n\tDUK_ASSERT_DISABLE(reg_rel >= 0);  /* unsigned */\n\n\ttv = (duk_tval *) (void *) ((duk_uint8_t *) env->thread->valstack + env->regbase_byteoff + sizeof(duk_tval) * reg_rel);\n\tDUK_ASSERT(tv >= env->thread->valstack && tv < env->thread->valstack_end);  /* XXX: more accurate? */\n\n\tout->value = tv;\n\tout->attrs = DUK_PROPDESC_FLAGS_W;  /* registers are mutable, non-deletable */\n\tout->env = (duk_hobject *) env;\n\tout->holder = NULL;\n\tout->has_this = 0;\n\treturn 1;\n}\n\n/* lookup name from current activation record's functions' registers */\nDUK_LOCAL\nduk_bool_t duk__getid_activation_regs(duk_hthread *thr,\n                                      duk_hstring *name,\n                                      duk_activation *act,\n                                      duk__id_lookup_result *out) {\n\tduk_tval *tv;\n\tduk_hobject *func;\n\tduk_hobject *varmap;\n\tduk_size_t reg_rel;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(name != NULL);\n\tDUK_ASSERT(act != NULL);\n\tDUK_ASSERT(out != NULL);\n\n\tfunc = DUK_ACT_GET_FUNC(act);\n\tDUK_ASSERT(func != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func));\n\n\tif (!DUK_HOBJECT_IS_COMPFUNC(func)) {\n\t\treturn 0;\n\t}\n\n\t/* XXX: move varmap to duk_hcompfunc struct field. */\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, func, DUK_HTHREAD_STRING_INT_VARMAP(thr));\n\tif (!tv) {\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(DUK_TVAL_IS_OBJECT(tv));\n\tvarmap = DUK_TVAL_GET_OBJECT(tv);\n\tDUK_ASSERT(varmap != NULL);\n\n\ttv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, varmap, name);\n\tif (!tv) {\n\t\treturn 0;\n\t}\n\tDUK_ASSERT(DUK_TVAL_IS_NUMBER(tv));\n\treg_rel = (duk_size_t) DUK_TVAL_GET_NUMBER(tv);\n\tDUK_ASSERT_DISABLE(reg_rel >= 0);\n\tDUK_ASSERT(reg_rel < ((duk_hcompfunc *) func)->nregs);\n\n\ttv = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + act->bottom_byteoff);\n\ttv += reg_rel;\n\n\tout->value = tv;\n\tout->attrs = DUK_PROPDESC_FLAGS_W;  /* registers are mutable, non-deletable */\n\tout->env = NULL;\n\tout->holder = NULL;\n\tout->has_this = 0;\n\treturn 1;\n}\n\nDUK_LOCAL\nduk_bool_t duk__get_identifier_reference(duk_hthread *thr,\n                                         duk_hobject *env,\n                                         duk_hstring *name,\n                                         duk_activation *act,\n                                         duk_bool_t parents,\n                                         duk__id_lookup_result *out) {\n\tduk_tval *tv;\n\tduk_uint_t sanity;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(env != NULL || act != NULL);\n\tDUK_ASSERT(name != NULL);\n\tDUK_ASSERT(out != NULL);\n\n\tDUK_ASSERT(!env || DUK_HOBJECT_IS_ENV(env));\n\tDUK_ASSERT(!env || !DUK_HOBJECT_HAS_ARRAY_PART(env));\n\n\t/*\n\t *  Conceptually, we look for the identifier binding by starting from\n\t *  'env' and following to chain of environment records (represented\n\t *  by the prototype chain).\n\t *\n\t *  If 'env' is NULL, the current activation does not yet have an\n\t *  allocated declarative environment record; this should be treated\n\t *  exactly as if the environment record existed but had no bindings\n\t *  other than register bindings.\n\t *\n\t *  Note: we assume that with the DUK_HOBJECT_FLAG_NEWENV cleared\n\t *  the environment will always be initialized immediately; hence\n\t *  a NULL 'env' should only happen with the flag set.  This is the\n\t *  case for: (1) function calls, and (2) strict, direct eval calls.\n\t */\n\n\tif (env == NULL && act != NULL) {\n\t\tduk_hobject *func;\n\t\tduk_hcompfunc *f;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference: env is NULL, activation is non-NULL -> \"\n\t\t                     \"delayed env case, look up activation regs first\"));\n\n\t\t/*\n\t\t *  Try registers\n\t\t */\n\n\t\tif (duk__getid_activation_regs(thr, name, act, out)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference successful: \"\n\t\t\t                     \"name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O \"\n\t\t\t                     \"(found from register bindings when env=NULL)\",\n\t\t\t                     (duk_heaphdr *) name, (duk_tval *) out->value,\n\t\t\t                     (long) out->attrs, (long) out->has_this,\n\t\t\t                     (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));\n\t\t\treturn 1;\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"not found in current activation regs\"));\n\n\t\t/*\n\t\t *  Not found in registers, proceed to the parent record.\n\t\t *  Here we need to determine what the parent would be,\n\t\t *  if 'env' was not NULL (i.e. same logic as when initializing\n\t\t *  the record).\n\t\t *\n\t\t *  Note that environment initialization is only deferred when\n\t\t *  DUK_HOBJECT_HAS_NEWENV is set, and this only happens for:\n\t\t *    - Function code\n\t\t *    - Strict eval code\n\t\t *\n\t\t *  We only need to check _Lexenv here; _Varenv exists only if it\n\t\t *  differs from _Lexenv (and thus _Lexenv will also be present).\n\t\t */\n\n\t\tif (!parents) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference failed, no parent traversal \"\n\t\t\t                     \"(not found from register bindings when env=NULL)\"));\n\t\t\tgoto fail_not_found;\n\t\t}\n\n\t\tfunc = DUK_ACT_GET_FUNC(act);\n\t\tDUK_ASSERT(func != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_NEWENV(func));\n\t\tf = (duk_hcompfunc *) func;\n\n\t\tenv = DUK_HCOMPFUNC_GET_LEXENV(thr->heap, f);\n\t\tif (!env) {\n\t\t\tenv = thr->builtins[DUK_BIDX_GLOBAL_ENV];\n\t\t}\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"continue lookup from env: %!iO\",\n\t\t                     (duk_heaphdr *) env));\n\t}\n\n\t/*\n\t *  Prototype walking starting from 'env'.\n\t *\n\t *  ('act' is not needed anywhere here.)\n\t */\n\n\tsanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY;\n\twhile (env != NULL) {\n\t\tduk_small_uint_t cl;\n\t\tduk_uint_t attrs;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference, name=%!O, considering env=%p -> %!iO\",\n\t\t                     (duk_heaphdr *) name,\n\t\t                     (void *) env,\n\t\t                     (duk_heaphdr *) env));\n\n\t\tDUK_ASSERT(env != NULL);\n\t\tDUK_ASSERT(DUK_HOBJECT_IS_ENV(env));\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env));\n\n\t\tcl = DUK_HOBJECT_GET_CLASS_NUMBER(env);\n\t\tDUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV || cl == DUK_HOBJECT_CLASS_DECENV);\n\t\tif (cl == DUK_HOBJECT_CLASS_DECENV) {\n\t\t\t/*\n\t\t\t *  Declarative environment record.\n\t\t\t *\n\t\t\t *  Identifiers can never be stored in ancestors and are\n\t\t\t *  always plain values, so we can use an internal helper\n\t\t\t *  and access the value directly with an duk_tval ptr.\n\t\t\t *\n\t\t\t *  A closed environment is only indicated by it missing\n\t\t\t *  the \"book-keeping\" properties required for accessing\n\t\t\t *  register-bound variables.\n\t\t\t */\n\n\t\t\tDUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env);\n\t\t\tif (duk__getid_open_decl_env_regs(thr, name, (duk_hdecenv *) env, out)) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference successful: \"\n\t\t\t\t                     \"name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O \"\n\t\t\t\t                     \"(declarative environment record, scope open, found in regs)\",\n\t\t\t\t                     (duk_heaphdr *) name, (duk_tval *) out->value,\n\t\t\t\t                     (long) out->attrs, (long) out->has_this,\n\t\t\t\t                     (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\ttv = duk_hobject_find_existing_entry_tval_ptr_and_attrs(thr->heap, env, name, &attrs);\n\t\t\tif (tv) {\n\t\t\t\tout->value = tv;\n\t\t\t\tout->attrs = attrs;\n\t\t\t\tout->env = env;\n\t\t\t\tout->holder = env;\n\t\t\t\tout->has_this = 0;\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference successful: \"\n\t\t\t\t                     \"name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O \"\n\t\t\t\t                     \"(declarative environment record, found in properties)\",\n\t\t\t\t                     (duk_heaphdr *) name, (duk_tval *) out->value,\n\t\t\t\t                     (long) out->attrs, (long) out->has_this,\n\t\t\t\t                     (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t} else {\n\t\t\t/*\n\t\t\t *  Object environment record.\n\t\t\t *\n\t\t\t *  Binding (target) object is an external, uncontrolled object.\n\t\t\t *  Identifier may be bound in an ancestor property, and may be\n\t\t\t *  an accessor.  Target can also be a Proxy which we must support\n\t\t\t *  here.\n\t\t\t */\n\n\t\t\t/* XXX: we could save space by using _Target OR _This.  If _Target, assume\n\t\t\t * this binding is undefined.  If _This, assumes this binding is _This, and\n\t\t\t * target is also _This.  One property would then be enough.\n\t\t\t */\n\n\t\t\tduk_hobject *target;\n\t\t\tduk_bool_t found;\n\n\t\t\tDUK_ASSERT(cl == DUK_HOBJECT_CLASS_OBJENV);\n\t\t\tDUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env);\n\n\t\t\ttarget = ((duk_hobjenv *) env)->target;\n\t\t\tDUK_ASSERT(target != NULL);\n\n\t\t\t/* Target may be a Proxy or property may be an accessor, so we must\n\t\t\t * use an actual, Proxy-aware hasprop check here.\n\t\t\t *\n\t\t\t * out->holder is NOT set to the actual duk_hobject where the\n\t\t\t * property is found, but rather the object binding target object.\n\t\t\t */\n\n#if defined(DUK_USE_ES6_PROXY)\n\t\t\tif (DUK_UNLIKELY(DUK_HOBJECT_IS_PROXY(target))) {\n\t\t\t\tduk_tval tv_name;\n\t\t\t\tduk_tval tv_target_tmp;\n\n\t\t\t\tDUK_ASSERT(name != NULL);\n\t\t\t\tDUK_TVAL_SET_STRING(&tv_name, name);\n\t\t\t\tDUK_TVAL_SET_OBJECT(&tv_target_tmp, target);\n\n\t\t\t\tfound = duk_hobject_hasprop(thr, &tv_target_tmp, &tv_name);\n\t\t\t} else\n#endif  /* DUK_USE_ES6_PROXY */\n\t\t\t{\n\t\t\t\t/* XXX: duk_hobject_hasprop() would be correct for\n\t\t\t\t * non-Proxy objects too, but it is about ~20-25%\n\t\t\t\t * slower at present so separate code paths for\n\t\t\t\t * Proxy and non-Proxy now.\n\t\t\t\t */\n\t\t\t\tfound = duk_hobject_hasprop_raw(thr, target, name);\n\t\t\t}\n\n\t\t\tif (found) {\n\t\t\t\tout->value = NULL;  /* can't get value, may be accessor */\n\t\t\t\tout->attrs = 0;     /* irrelevant when out->value == NULL */\n\t\t\t\tout->env = env;\n\t\t\t\tout->holder = target;\n\t\t\t\tout->has_this = ((duk_hobjenv *) env)->has_this;\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference successful: \"\n\t\t\t\t                     \"name=%!O -> value=%!T, attrs=%ld, has_this=%ld, env=%!O, holder=%!O \"\n\t\t\t\t                     \"(object environment record)\",\n\t\t\t\t                     (duk_heaphdr *) name, (duk_tval *) out->value,\n\t\t\t\t                     (long) out->attrs, (long) out->has_this,\n\t\t\t\t                     (duk_heaphdr *) out->env, (duk_heaphdr *) out->holder));\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\n\t\tif (!parents) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"duk__get_identifier_reference failed, no parent traversal \"\n\t\t\t                     \"(not found from first traversed env)\"));\n\t\t\tgoto fail_not_found;\n\t\t}\n\n                if (DUK_UNLIKELY(sanity-- == 0)) {\n                        DUK_ERROR_RANGE(thr, DUK_STR_PROTOTYPE_CHAIN_LIMIT);\n                }\n\t\tenv = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, env);\n\t}\n\n\t/*\n\t *  Not found (even in global object)\n\t */\n\n fail_not_found:\n\treturn 0;\n}\n\n/*\n *  HASVAR: check identifier binding from a given environment record\n *  without traversing its parents.\n *\n *  This primitive is not exposed to user code as such, but is used\n *  internally for e.g. declaration binding instantiation.\n *\n *  See E5 Sections:\n *    10.2.1.1.1 HasBinding(N)\n *    10.2.1.2.1 HasBinding(N)\n *\n *  Note: strictness has no bearing on this check.  Hence we don't take\n *  a 'strict' parameter.\n */\n\n#if 0  /*unused*/\nDUK_INTERNAL\nduk_bool_t duk_js_hasvar_envrec(duk_hthread *thr,\n                                duk_hobject *env,\n                                duk_hstring *name) {\n\tduk__id_lookup_result ref;\n\tduk_bool_t parents;\n\n\tDUK_DDD(DUK_DDDPRINT(\"hasvar: thr=%p, env=%p, name=%!O \"\n\t                     \"(env -> %!dO)\",\n\t                     (void *) thr, (void *) env, (duk_heaphdr *) name,\n\t                     (duk_heaphdr *) env));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(env != NULL);\n\tDUK_ASSERT(name != NULL);\n\n        DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env);\n        DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);\n\n\tDUK_ASSERT(DUK_HOBJECT_IS_ENV(env));\n\tDUK_ASSERT(!DUK_HOBJECT_HAS_ARRAY_PART(env));\n\n\t/* lookup results is ignored */\n\tparents = 0;\n\treturn duk__get_identifier_reference(thr, env, name, NULL, parents, &ref);\n}\n#endif\n\n/*\n *  GETVAR\n *\n *  See E5 Sections:\n *    11.1.2 Identifier Reference\n *    10.3.1 Identifier Resolution\n *    11.13.1 Simple Assignment  [example of where the Reference is GetValue'd]\n *    8.7.1 GetValue (V)\n *    8.12.1 [[GetOwnProperty]] (P)\n *    8.12.2 [[GetProperty]] (P)\n *    8.12.3 [[Get]] (P)\n *\n *  If 'throw' is true, always leaves two values on top of stack: [val this].\n *\n *  If 'throw' is false, returns 0 if identifier cannot be resolved, and the\n *  stack will be unaffected in this case.  If identifier is resolved, returns\n *  1 and leaves [val this] on top of stack.\n *\n *  Note: the 'strict' flag of a reference returned by GetIdentifierReference\n *  is ignored by GetValue.  Hence we don't take a 'strict' parameter.\n *\n *  The 'throw' flag is needed for implementing 'typeof' for an unreferenced\n *  identifier.  An unreference identifier in other contexts generates a\n *  ReferenceError.\n */\n\nDUK_LOCAL\nduk_bool_t duk__getvar_helper(duk_hthread *thr,\n                              duk_hobject *env,\n                              duk_activation *act,\n                              duk_hstring *name,\n                              duk_bool_t throw_flag) {\n\tduk__id_lookup_result ref;\n\tduk_tval tv_tmp_obj;\n\tduk_tval tv_tmp_key;\n\tduk_bool_t parents;\n\n\tDUK_DDD(DUK_DDDPRINT(\"getvar: thr=%p, env=%p, act=%p, name=%!O \"\n\t                     \"(env -> %!dO)\",\n\t                     (void *) thr, (void *) env, (void *) act,\n\t                     (duk_heaphdr *) name, (duk_heaphdr *) env));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(name != NULL);\n\t/* env and act may be NULL */\n\n\tDUK_STATS_INC(thr->heap, stats_getvar_all);\n\n        DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env);\n        DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);\n\n\tparents = 1;     /* follow parent chain */\n\tif (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) {\n\t\tif (ref.value) {\n\t\t\tduk_push_tval(thr, ref.value);\n\t\t\tduk_push_undefined(thr);\n\t\t} else {\n\t\t\tDUK_ASSERT(ref.holder != NULL);\n\n\t\t\t/* ref.holder is safe across the getprop call (even\n\t\t\t * with side effects) because 'env' is reachable and\n\t\t\t * ref.holder is a direct heap pointer.\n\t\t\t */\n\n\t\t\tDUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder);\n\t\t\tDUK_TVAL_SET_STRING(&tv_tmp_key, name);\n\t\t\t(void) duk_hobject_getprop(thr, &tv_tmp_obj, &tv_tmp_key);  /* [value] */\n\n\t\t\tif (ref.has_this) {\n\t\t\t\tduk_push_hobject(thr, ref.holder);\n\t\t\t} else {\n\t\t\t\tduk_push_undefined(thr);\n\t\t\t}\n\n\t\t\t/* [value this] */\n\t\t}\n\n\t\treturn 1;\n\t} else {\n\t\tif (throw_flag) {\n\t\t\tDUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR,\n\t\t\t               \"identifier '%s' undefined\",\n\t\t\t               (const char *) DUK_HSTRING_GET_DATA(name));\n\t\t}\n\n\t\treturn 0;\n\t}\n}\n\nDUK_INTERNAL\nduk_bool_t duk_js_getvar_envrec(duk_hthread *thr,\n                                duk_hobject *env,\n                                duk_hstring *name,\n                                duk_bool_t throw_flag) {\n\treturn duk__getvar_helper(thr, env, NULL, name, throw_flag);\n}\n\nDUK_INTERNAL\nduk_bool_t duk_js_getvar_activation(duk_hthread *thr,\n                                    duk_activation *act,\n                                    duk_hstring *name,\n                                    duk_bool_t throw_flag) {\n\tDUK_ASSERT(act != NULL);\n\treturn duk__getvar_helper(thr, act->lex_env, act, name, throw_flag);\n}\n\n/*\n *  PUTVAR\n *\n *  See E5 Sections:\n *    11.1.2 Identifier Reference\n *    10.3.1 Identifier Resolution\n *    11.13.1 Simple Assignment  [example of where the Reference is PutValue'd]\n *    8.7.2 PutValue (V,W)  [see especially step 3.b, undefined -> automatic global in non-strict mode]\n *    8.12.4 [[CanPut]] (P)\n *    8.12.5 [[Put]] (P)\n *\n *  Note: may invalidate any valstack (or object) duk_tval pointers because\n *  putting a value may reallocate any object or any valstack.  Caller beware.\n */\n\nDUK_LOCAL\nvoid duk__putvar_helper(duk_hthread *thr,\n                        duk_hobject *env,\n                        duk_activation *act,\n                        duk_hstring *name,\n                        duk_tval *val,\n                        duk_bool_t strict) {\n\tduk__id_lookup_result ref;\n\tduk_tval tv_tmp_obj;\n\tduk_tval tv_tmp_key;\n\tduk_bool_t parents;\n\n\tDUK_STATS_INC(thr->heap, stats_putvar_all);\n\n\tDUK_DDD(DUK_DDDPRINT(\"putvar: thr=%p, env=%p, act=%p, name=%!O, val=%p, strict=%ld \"\n\t                     \"(env -> %!dO, val -> %!T)\",\n\t                     (void *) thr, (void *) env, (void *) act,\n\t                     (duk_heaphdr *) name, (void *) val, (long) strict,\n\t                     (duk_heaphdr *) env, (duk_tval *) val));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(name != NULL);\n\tDUK_ASSERT(val != NULL);\n\t/* env and act may be NULL */\n\n        DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(env);\n        DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);\n\tDUK_ASSERT_REFCOUNT_NONZERO_TVAL(val);\n\n\t/*\n\t *  In strict mode E5 protects 'eval' and 'arguments' from being\n\t *  assigned to (or even declared anywhere).  Attempt to do so\n\t *  should result in a compile time SyntaxError.  See the internal\n\t *  design documentation for details.\n\t *\n\t *  Thus, we should never come here, run-time, for strict code,\n\t *  and name 'eval' or 'arguments'.\n\t */\n\n\tDUK_ASSERT(!strict ||\n\t           (name != DUK_HTHREAD_STRING_EVAL(thr) &&\n\t            name != DUK_HTHREAD_STRING_LC_ARGUMENTS(thr)));\n\n\t/*\n\t *  Lookup variable and update in-place if found.\n\t */\n\n\tparents = 1;     /* follow parent chain */\n\n\tif (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) {\n\t\tif (ref.value && (ref.attrs & DUK_PROPDESC_FLAG_WRITABLE)) {\n\t\t\t/* Update duk_tval in-place if pointer provided and the\n\t\t\t * property is writable.  If the property is not writable\n\t\t\t * (immutable binding), use duk_hobject_putprop() which\n\t\t\t * will respect mutability.\n\t\t\t */\n\t\t\tduk_tval *tv_val;\n\n\t\t\ttv_val = ref.value;\n\t\t\tDUK_ASSERT(tv_val != NULL);\n\t\t\tDUK_TVAL_SET_TVAL_UPDREF(thr, tv_val, val);  /* side effects */\n\n\t\t\t/* ref.value invalidated here */\n\t\t} else {\n\t\t\tDUK_ASSERT(ref.holder != NULL);\n\n\t\t\tDUK_TVAL_SET_OBJECT(&tv_tmp_obj, ref.holder);\n\t\t\tDUK_TVAL_SET_STRING(&tv_tmp_key, name);\n\t\t\t(void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, strict);\n\n\t\t\t/* ref.value invalidated here */\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/*\n\t *  Not found: write to global object (non-strict) or ReferenceError\n\t *  (strict); see E5 Section 8.7.2, step 3.\n\t */\n\n\tif (strict) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"identifier binding not found, strict => reference error\"));\n\t\tDUK_ERROR_FMT1(thr, DUK_ERR_REFERENCE_ERROR,\n\t\t               \"identifier '%s' undefined\",\n\t\t               (const char *) DUK_HSTRING_GET_DATA(name));\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"identifier binding not found, not strict => set to global\"));\n\n\tDUK_TVAL_SET_OBJECT(&tv_tmp_obj, thr->builtins[DUK_BIDX_GLOBAL]);\n\tDUK_TVAL_SET_STRING(&tv_tmp_key, name);\n\t(void) duk_hobject_putprop(thr, &tv_tmp_obj, &tv_tmp_key, val, 0);  /* 0 = no throw */\n\n\t/* NB: 'val' may be invalidated here because put_value may realloc valstack,\n\t * caller beware.\n\t */\n}\n\nDUK_INTERNAL\nvoid duk_js_putvar_envrec(duk_hthread *thr,\n                          duk_hobject *env,\n                          duk_hstring *name,\n                          duk_tval *val,\n                          duk_bool_t strict) {\n\tduk__putvar_helper(thr, env, NULL, name, val, strict);\n}\n\nDUK_INTERNAL\nvoid duk_js_putvar_activation(duk_hthread *thr,\n                              duk_activation *act,\n                              duk_hstring *name,\n                              duk_tval *val,\n                              duk_bool_t strict) {\n\tDUK_ASSERT(act != NULL);\n\tduk__putvar_helper(thr, act->lex_env, act, name, val, strict);\n}\n\n/*\n *  DELVAR\n *\n *  See E5 Sections:\n *    11.4.1 The delete operator\n *    10.2.1.1.5 DeleteBinding (N)  [declarative environment record]\n *    10.2.1.2.5 DeleteBinding (N)  [object environment record]\n *\n *  Variable bindings established inside eval() are deletable (configurable),\n *  other bindings are not, including variables declared in global level.\n *  Registers are always non-deletable, and the deletion of other bindings\n *  is controlled by the configurable flag.\n *\n *  For strict mode code, the 'delete' operator should fail with a compile\n *  time SyntaxError if applied to identifiers.  Hence, no strict mode\n *  run-time deletion of identifiers should ever happen.  This function\n *  should never be called from strict mode code!\n */\n\nDUK_LOCAL\nduk_bool_t duk__delvar_helper(duk_hthread *thr,\n                              duk_hobject *env,\n                              duk_activation *act,\n                              duk_hstring *name) {\n\tduk__id_lookup_result ref;\n\tduk_bool_t parents;\n\n\tDUK_DDD(DUK_DDDPRINT(\"delvar: thr=%p, env=%p, act=%p, name=%!O \"\n\t                     \"(env -> %!dO)\",\n\t                     (void *) thr, (void *) env, (void *) act,\n\t                     (duk_heaphdr *) name, (duk_heaphdr *) env));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(name != NULL);\n\t/* env and act may be NULL */\n\n        DUK_ASSERT_REFCOUNT_NONZERO_HEAPHDR(name);\n\n\tparents = 1;     /* follow parent chain */\n\n\tif (duk__get_identifier_reference(thr, env, name, act, parents, &ref)) {\n\t\tif (ref.value && !(ref.attrs & DUK_PROPDESC_FLAG_CONFIGURABLE)) {\n\t\t\t/* Identifier found in registers (always non-deletable)\n\t\t\t * or declarative environment record and non-configurable.\n\t\t\t */\n\t\t\treturn 0;\n\t\t}\n\t\tDUK_ASSERT(ref.holder != NULL);\n\n\t\treturn duk_hobject_delprop_raw(thr, ref.holder, name, 0);\n\t}\n\n\t/*\n\t *  Not found (even in global object).\n\t *\n\t *  In non-strict mode this is a silent SUCCESS (!), see E5 Section 11.4.1,\n\t *  step 3.b.  In strict mode this case is a compile time SyntaxError so\n\t *  we should not come here.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"identifier to be deleted not found: name=%!O \"\n\t                     \"(treated as silent success)\",\n\t                     (duk_heaphdr *) name));\n\treturn 1;\n}\n\n#if 0  /*unused*/\nDUK_INTERNAL\nduk_bool_t duk_js_delvar_envrec(duk_hthread *thr,\n                                duk_hobject *env,\n                                duk_hstring *name) {\n\treturn duk__delvar_helper(thr, env, NULL, name);\n}\n#endif\n\nDUK_INTERNAL\nduk_bool_t duk_js_delvar_activation(duk_hthread *thr,\n                                    duk_activation *act,\n                                    duk_hstring *name) {\n\tDUK_ASSERT(act != NULL);\n\treturn duk__delvar_helper(thr, act->lex_env, act, name);\n}\n\n/*\n *  DECLVAR\n *\n *  See E5 Sections:\n *    10.4.3 Entering Function Code\n *    10.5 Declaration Binding Instantion\n *    12.2 Variable Statement\n *    11.1.2 Identifier Reference\n *    10.3.1 Identifier Resolution\n *\n *  Variable declaration behavior is mainly discussed in Section 10.5,\n *  and is not discussed in the execution semantics (Sections 11-13).\n *\n *  Conceptually declarations happen when code (global, eval, function)\n *  is entered, before any user code is executed.  In practice, register-\n *  bound identifiers are 'declared' automatically (by virtue of being\n *  allocated to registers with the initial value 'undefined').  Other\n *  identifiers are declared in the function prologue with this primitive.\n *\n *  Since non-register bindings eventually back to an internal object's\n *  properties, the 'prop_flags' argument is used to specify binding\n *  type:\n *\n *    - Immutable binding: set DUK_PROPDESC_FLAG_WRITABLE to false\n *    - Non-deletable binding: set DUK_PROPDESC_FLAG_CONFIGURABLE to false\n *    - The flag DUK_PROPDESC_FLAG_ENUMERABLE should be set, although it\n *      doesn't really matter for internal objects\n *\n *  All bindings are non-deletable mutable bindings except:\n *\n *    - Declarations in eval code (mutable, deletable)\n *    - 'arguments' binding in strict function code (immutable)\n *    - Function name binding of a function expression (immutable)\n *\n *  Declarations may go to declarative environment records (always\n *  so for functions), but may also go to object environment records\n *  (e.g. global code).  The global object environment has special\n *  behavior when re-declaring a function (but not a variable); see\n *  E5.1 specification, Section 10.5, step 5.e.\n *\n *  Declarations always go to the 'top-most' environment record, i.e.\n *  we never check the record chain.  It's not an error even if a\n *  property (even an immutable or non-deletable one) of the same name\n *  already exists.\n *\n *  If a declared variable already exists, its value needs to be updated\n *  (if possible).  Returns 1 if a PUTVAR needs to be done by the caller;\n *  otherwise returns 0.\n */\n\nDUK_LOCAL\nduk_bool_t duk__declvar_helper(duk_hthread *thr,\n                               duk_hobject *env,\n                               duk_hstring *name,\n                               duk_tval *val,\n                               duk_small_uint_t prop_flags,\n                               duk_bool_t is_func_decl) {\n\tduk_hobject *holder;\n\tduk_bool_t parents;\n\tduk__id_lookup_result ref;\n\tduk_tval *tv;\n\n\tDUK_DDD(DUK_DDDPRINT(\"declvar: thr=%p, env=%p, name=%!O, val=%!T, prop_flags=0x%08lx, is_func_decl=%ld \"\n\t                     \"(env -> %!iO)\",\n\t                     (void *) thr, (void *) env, (duk_heaphdr *) name,\n\t                     (duk_tval *) val, (unsigned long) prop_flags,\n\t                     (unsigned int) is_func_decl, (duk_heaphdr *) env));\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(env != NULL);\n\tDUK_ASSERT(name != NULL);\n\tDUK_ASSERT(val != NULL);\n\n\t/* Note: in strict mode the compiler should reject explicit\n\t * declaration of 'eval' or 'arguments'.  However, internal\n\t * bytecode may declare 'arguments' in the function prologue.\n\t * We don't bother checking (or asserting) for these now.\n\t */\n\n\t/* Note: val is a stable duk_tval pointer.  The caller makes\n\t * a value copy into its stack frame, so 'tv_val' is not subject\n\t * to side effects here.\n\t */\n\n\t/*\n\t *  Check whether already declared.\n\t *\n\t *  We need to check whether the binding exists in the environment\n\t *  without walking its parents.  However, we still need to check\n\t *  register-bound identifiers and the prototype chain of an object\n\t *  environment target object.\n\t */\n\n\tparents = 0;  /* just check 'env' */\n\tif (duk__get_identifier_reference(thr, env, name, NULL, parents, &ref)) {\n\t\tduk_int_t e_idx;\n\t\tduk_int_t h_idx;\n\t\tduk_small_uint_t flags;\n\n\t\t/*\n\t\t *  Variable already declared, ignore re-declaration.\n\t\t *  The only exception is the updated behavior of E5.1 for\n\t\t *  global function declarations, E5.1 Section 10.5, step 5.e.\n\t\t *  This behavior does not apply to global variable declarations.\n\t\t */\n\n\t\tif (!(is_func_decl && env == thr->builtins[DUK_BIDX_GLOBAL_ENV])) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"re-declare a binding, ignoring\"));\n\t\t\treturn 1;  /* 1 -> needs a PUTVAR */\n\t\t}\n\n\t\t/*\n\t\t *  Special behavior in E5.1.\n\t\t *\n\t\t *  Note that even though parents == 0, the conflicting property\n\t\t *  may be an inherited property (currently our global object's\n\t\t *  prototype is Object.prototype).  Step 5.e first operates on\n\t\t *  the existing property (which is potentially in an ancestor)\n\t\t *  and then defines a new property in the global object (and\n\t\t *  never modifies the ancestor).\n\t\t *\n\t\t *  Also note that this logic would become even more complicated\n\t\t *  if the conflicting property might be a virtual one.  Object\n\t\t *  prototype has no virtual properties, though.\n\t\t *\n\t\t *  XXX: this is now very awkward, rework.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"re-declare a function binding in global object, \"\n\t\t                     \"updated E5.1 processing\"));\n\n\t\tDUK_ASSERT(ref.holder != NULL);\n\t\tholder = ref.holder;\n\n\t\t/* holder will be set to the target object, not the actual object\n\t\t * where the property was found (see duk__get_identifier_reference()).\n\t\t */\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(holder) == DUK_HOBJECT_CLASS_GLOBAL);\n\t\tDUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(holder));  /* global object doesn't have array part */\n\n\t\t/* XXX: use a helper for prototype traversal; no loop check here */\n\t\t/* must be found: was found earlier, and cannot be inherited */\n\t\tfor (;;) {\n\t\t\tDUK_ASSERT(holder != NULL);\n\t\t\tif (duk_hobject_find_existing_entry(thr->heap, holder, name, &e_idx, &h_idx)) {\n\t\t\t\tDUK_ASSERT(e_idx >= 0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t/* SCANBUILD: NULL pointer dereference, doesn't actually trigger,\n\t\t\t * asserted above.\n\t\t\t */\n\t\t\tholder = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, holder);\n\t\t}\n\t\tDUK_ASSERT(holder != NULL);\n\t\tDUK_ASSERT(e_idx >= 0);\n\t\t/* SCANBUILD: scan-build produces a NULL pointer dereference warning\n\t\t * below; it never actually triggers because holder is actually never\n\t\t * NULL.\n\t\t */\n\n\t\t/* ref.holder is global object, holder is the object with the\n\t\t * conflicting property.\n\t\t */\n\n\t\tflags = DUK_HOBJECT_E_GET_FLAGS(thr->heap, holder, e_idx);\n\t\tif (!(flags & DUK_PROPDESC_FLAG_CONFIGURABLE)) {\n\t\t\tif (flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"existing property is a non-configurable \"\n\t\t\t\t                     \"accessor -> reject\"));\n\t\t\t\tgoto fail_existing_attributes;\n\t\t\t}\n\t\t\tif (!((flags & DUK_PROPDESC_FLAG_WRITABLE) &&\n\t\t\t      (flags & DUK_PROPDESC_FLAG_ENUMERABLE))) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"existing property is a non-configurable \"\n\t\t\t\t                     \"plain property which is not writable and \"\n\t\t\t\t                     \"enumerable -> reject\"));\n\t\t\t\tgoto fail_existing_attributes;\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"existing property is not configurable but \"\n\t\t\t                     \"is plain, enumerable, and writable -> \"\n\t\t\t                     \"allow redeclaration\"));\n\t\t}\n\n\t\tif (holder == ref.holder) {\n\t\t\t/* XXX: if duk_hobject_define_property_internal() was updated\n\t\t\t * to handle a pre-existing accessor property, this would be\n\t\t\t * a simple call (like for the ancestor case).\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"redefine, offending property in global object itself\"));\n\n\t\t\tif (flags & DUK_PROPDESC_FLAG_ACCESSOR) {\n\t\t\t\tduk_hobject *tmp;\n\n\t\t\t\ttmp = DUK_HOBJECT_E_GET_VALUE_GETTER(thr->heap, holder, e_idx);\n\t\t\t\tDUK_HOBJECT_E_SET_VALUE_GETTER(thr->heap, holder, e_idx, NULL);\n\t\t\t\tDUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);\n\t\t\t\tDUK_UNREF(tmp);\n\t\t\t\ttmp = DUK_HOBJECT_E_GET_VALUE_SETTER(thr->heap, holder, e_idx);\n\t\t\t\tDUK_HOBJECT_E_SET_VALUE_SETTER(thr->heap, holder, e_idx, NULL);\n\t\t\t\tDUK_HOBJECT_DECREF_ALLOWNULL(thr, tmp);\n\t\t\t\tDUK_UNREF(tmp);\n\t\t\t} else {\n\t\t\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx);\n\t\t\t\tDUK_TVAL_SET_UNDEFINED_UPDREF(thr, tv);\n\t\t\t}\n\n\t\t\t/* Here val would be potentially invalid if we didn't make\n\t\t\t * a value copy at the caller.\n\t\t\t */\n\n\t\t\ttv = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx);\n\t\t\tDUK_TVAL_SET_TVAL(tv, val);\n\t\t\tDUK_TVAL_INCREF(thr, tv);\n\t\t\tDUK_HOBJECT_E_SET_FLAGS(thr->heap, holder, e_idx, prop_flags);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"updated global binding, final result: \"\n\t\t\t                     \"value -> %!T, prop_flags=0x%08lx\",\n\t\t\t                     (duk_tval *) DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, holder, e_idx),\n\t\t\t                     (unsigned long) prop_flags));\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"redefine, offending property in ancestor\"));\n\n\t\t\tDUK_ASSERT(ref.holder == thr->builtins[DUK_BIDX_GLOBAL]);\n\t\t\tduk_push_tval(thr, val);\n\t\t\tduk_hobject_define_property_internal(thr, ref.holder, name, prop_flags);\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t/*\n\t *  Not found (in registers or record objects).  Declare\n\t *  to current variable environment.\n\t */\n\n\t/*\n\t *  Get holder object\n\t */\n\n\tif (DUK_HOBJECT_IS_DECENV(env)) {\n\t\tDUK_ASSERT_HDECENV_VALID((duk_hdecenv *) env);\n\t\tholder = env;\n\t} else {\n\t\tDUK_ASSERT_HOBJENV_VALID((duk_hobjenv *) env);\n\t\tholder = ((duk_hobjenv *) env)->target;\n\t\tDUK_ASSERT(holder != NULL);\n\t}\n\n\t/*\n\t *  Define new property\n\t *\n\t *  Note: this may fail if the holder is not extensible.\n\t */\n\n\t/* XXX: this is awkward as we use an internal method which doesn't handle\n\t * extensibility etc correctly.  Basically we'd want to do a [[DefineOwnProperty]]\n\t * or Object.defineProperty() here.\n\t */\n\n\tif (!DUK_HOBJECT_HAS_EXTENSIBLE(holder)) {\n\t\tgoto fail_not_extensible;\n\t}\n\n\tduk_push_hobject(thr, holder);\n\tduk_push_hstring(thr, name);\n\tduk_push_tval(thr, val);\n\tduk_xdef_prop(thr, -3, prop_flags);  /* [holder name val] -> [holder] */\n\tduk_pop_unsafe(thr);\n\n\treturn 0;\n\n fail_existing_attributes:\n fail_not_extensible:\n\tDUK_ERROR_TYPE(thr, \"declaration failed\");\n\treturn 0;\n}\n\nDUK_INTERNAL\nduk_bool_t duk_js_declvar_activation(duk_hthread *thr,\n                                     duk_activation *act,\n                                     duk_hstring *name,\n                                     duk_tval *val,\n                                     duk_small_uint_t prop_flags,\n                                     duk_bool_t is_func_decl) {\n\tduk_hobject *env;\n\tduk_tval tv_val_copy;\n\n\tDUK_ASSERT(act != NULL);\n\n\t/*\n\t *  Make a value copy of the input val.  This ensures that\n\t *  side effects cannot invalidate the pointer.\n\t */\n\n\tDUK_TVAL_SET_TVAL(&tv_val_copy, val);\n\tval = &tv_val_copy;\n\n\t/*\n\t *  Delayed env creation check\n\t */\n\n\tif (!act->var_env) {\n\t\tDUK_ASSERT(act->lex_env == NULL);\n\t\tduk_js_init_activation_environment_records_delayed(thr, act);\n\t\t/* 'act' is a stable pointer, so still OK. */\n\t}\n\tDUK_ASSERT(act->lex_env != NULL);\n\tDUK_ASSERT(act->var_env != NULL);\n\n\tenv = act->var_env;\n\tDUK_ASSERT(env != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_IS_ENV(env));\n\n\treturn duk__declvar_helper(thr, env, name, val, prop_flags, is_func_decl);\n}\n#line 1 \"duk_lexer.c\"\n/*\n *  Lexer for source files, ToNumber() string conversions, RegExp expressions,\n *  and JSON.\n *\n *  Provides a stream of Ecmascript tokens from an UTF-8/CESU-8 buffer.  The\n *  caller can also rewind the token stream into a certain position which is\n *  needed by the compiler part for multi-pass scanning.  Tokens are\n *  represented as duk_token structures, and contain line number information.\n *  Token types are identified with DUK_TOK_* defines.\n *\n *  Characters are decoded into a fixed size lookup window consisting of\n *  decoded Unicode code points, with window positions past the end of the\n *  input filled with an invalid codepoint (-1).  The tokenizer can thus\n *  perform multiple character lookups efficiently and with few sanity\n *  checks (such as access outside the end of the input), which keeps the\n *  tokenization code small at the cost of performance.\n *\n *  Character data in tokens, such as identifier names and string literals,\n *  is encoded into CESU-8 format on-the-fly while parsing the token in\n *  question.  The string data is made reachable to garbage collection by\n *  placing the token-related values in value stack entries allocated for\n *  this purpose by the caller.  The characters exist in Unicode code point\n *  form only in the fixed size lookup window, which keeps character data\n *  expansion (of especially ASCII data) low.\n *\n *  Token parsing supports the full range of Unicode characters as described\n *  in the E5 specification.  Parsing has been optimized for ASCII characters\n *  because ordinary Ecmascript code consists almost entirely of ASCII\n *  characters.  Matching of complex Unicode codepoint sets (such as in the\n *  IdentifierStart and IdentifierPart productions) is optimized for size,\n *  and is done using a linear scan of a bit-packed list of ranges.  This is\n *  very slow, but should never be entered unless the source code actually\n *  contains Unicode characters.\n *\n *  Ecmascript tokenization is partially context sensitive.  First,\n *  additional future reserved words are recognized in strict mode (see E5\n *  Section 7.6.1.2).  Second, a forward slash character ('/') can be\n *  recognized either as starting a RegExp literal or as a division operator,\n *  depending on context.  The caller must provide necessary context flags\n *  when requesting a new token.\n *\n *  Future work:\n *\n *    * Make line number tracking optional, as it consumes space.\n *\n *    * Add a feature flag for disabling UTF-8 decoding of input, as most\n *      source code is ASCII.  Because of Unicode escapes written in ASCII,\n *      this does not allow Unicode support to be removed from e.g.\n *      duk_unicode_is_identifier_start() nor does it allow removal of CESU-8\n *      encoding of e.g. string literals.\n *\n *    * Add a feature flag for disabling Unicode compliance of e.g. identifier\n *      names.  This allows for a build more than a kilobyte smaller, because\n *      Unicode ranges needed by duk_unicode_is_identifier_start() and\n *      duk_unicode_is_identifier_part() can be dropped.  String literals\n *      should still be allowed to contain escaped Unicode, so this still does\n *      not allow removal of CESU-8 encoding of e.g. string literals.\n *\n *    * Character lookup tables for codepoints above BMP could be stripped.\n *\n *    * Strictly speaking, E5 specification requires that source code consists\n *      of 16-bit code units, and if not, must be conceptually converted to\n *      that format first.  The current lexer processes Unicode code points\n *      and allows characters outside the BMP.  These should be converted to\n *      surrogate pairs while reading the source characters into the window,\n *      not after tokens have been formed (as is done now).  However, the fix\n *      is not trivial because two characters are decoded from one codepoint.\n *\n *    * Optimize for speed as well as size.  Large if-else ladders are (at\n *      least potentially) slow.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Various defines and file specific helper macros\n */\n\n#define DUK__MAX_RE_DECESC_DIGITS     9\n#define DUK__MAX_RE_QUANT_DIGITS      9   /* Does not allow e.g. 2**31-1, but one more would allow overflows of u32. */\n\n/* whether to use macros or helper function depends on call count */\n#define DUK__ISDIGIT(x)          ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_9)\n#define DUK__ISHEXDIGIT(x)       duk__is_hex_digit((x))\n#define DUK__ISOCTDIGIT(x)       ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_7)\n#define DUK__ISDIGIT03(x)        ((x) >= DUK_ASC_0 && (x) <= DUK_ASC_3)\n#define DUK__ISDIGIT47(x)        ((x) >= DUK_ASC_4 && (x) <= DUK_ASC_7)\n\n/* lexer character window helpers */\n#define DUK__LOOKUP(lex_ctx,idx)            ((lex_ctx)->window[(idx)].codepoint)\n#define DUK__ADVANCECHARS(lex_ctx,count)    duk__advance_chars((lex_ctx), (count))\n#define DUK__ADVANCEBYTES(lex_ctx,count)    duk__advance_bytes((lex_ctx), (count))\n#define DUK__INITBUFFER(lex_ctx)            duk__initbuffer((lex_ctx))\n#define DUK__APPENDBUFFER(lex_ctx,x)        duk__appendbuffer((lex_ctx), (duk_codepoint_t) (x))\n#define DUK__APPENDBUFFER_ASCII(lex_ctx,x)  duk__appendbuffer_ascii((lex_ctx), (duk_codepoint_t) (x))\n\n/* lookup shorthands (note: assume context variable is named 'lex_ctx') */\n#define DUK__L0()  DUK__LOOKUP(lex_ctx, 0)\n#define DUK__L1()  DUK__LOOKUP(lex_ctx, 1)\n#define DUK__L2()  DUK__LOOKUP(lex_ctx, 2)\n#define DUK__L3()  DUK__LOOKUP(lex_ctx, 3)\n#define DUK__L4()  DUK__LOOKUP(lex_ctx, 4)\n#define DUK__L5()  DUK__LOOKUP(lex_ctx, 5)\n\n/* packed advance/token number macro used by multiple functions */\n#define DUK__ADVTOK(advbytes,tok)  ((((advbytes) * sizeof(duk_lexer_codepoint)) << 8) + (tok))\n\n/*\n *  Advance lookup window by N characters, filling in new characters as\n *  necessary.  After returning caller is guaranteed a character window of\n *  at least DUK_LEXER_WINDOW_SIZE characters.\n *\n *  The main function duk__advance_bytes() is called at least once per every\n *  token so it has a major lexer/compiler performance impact.  There are two\n *  variants for the main duk__advance_bytes() algorithm: a sliding window\n *  approach which is slightly faster at the cost of larger code footprint,\n *  and a simple copying one.\n *\n *  Decoding directly from the source string would be another lexing option.\n *  But the lookup window based approach has the advantage of hiding the\n *  source string and its encoding effectively which gives more flexibility\n *  going forward to e.g. support chunked streaming of source from flash.\n *\n *  Decodes UTF-8/CESU-8 leniently with support for code points from U+0000 to\n *  U+10FFFF, causing an error if the input is unparseable.  Leniency means:\n *\n *    * Unicode code point validation is intentionally not performed,\n *      except to check that the codepoint does not exceed 0x10ffff.\n *\n *    * In particular, surrogate pairs are allowed and not combined, which\n *      allows source files to represent all SourceCharacters with CESU-8.\n *      Broken surrogate pairs are allowed, as Ecmascript does not mandate\n *      their validation.\n *\n *    * Allow non-shortest UTF-8 encodings.\n *\n *  Leniency here causes few security concerns because all character data is\n *  decoded into Unicode codepoints before lexer processing, and is then\n *  re-encoded into CESU-8.  The source can be parsed as strict UTF-8 with\n *  a compiler option.  However, Ecmascript source characters include -all-\n *  16-bit unsigned integer codepoints, so leniency seems to be appropriate.\n *\n *  Note that codepoints above the BMP are not strictly SourceCharacters,\n *  but the lexer still accepts them as such.  Before ending up in a string\n *  or an identifier name, codepoints above BMP are converted into surrogate\n *  pairs and then CESU-8 encoded, resulting in 16-bit Unicode data as\n *  expected by Ecmascript.\n *\n *  An alternative approach to dealing with invalid or partial sequences\n *  would be to skip them and replace them with e.g. the Unicode replacement\n *  character U+FFFD.  This has limited utility because a replacement character\n *  will most likely cause a parse error, unless it occurs inside a string.\n *  Further, Ecmascript source is typically pure ASCII.\n *\n *  See:\n *\n *     http://en.wikipedia.org/wiki/UTF-8\n *     http://en.wikipedia.org/wiki/CESU-8\n *     http://tools.ietf.org/html/rfc3629\n *     http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences\n *\n *  Future work:\n *\n *    * Reject other invalid Unicode sequences (see Wikipedia entry for examples)\n *      in strict UTF-8 mode.\n *\n *    * Size optimize.  An attempt to use a 16-byte lookup table for the first\n *      byte resulted in a code increase though.\n *\n *    * Is checking against maximum 0x10ffff really useful?  4-byte encoding\n *      imposes a certain limit anyway.\n *\n *    * Support chunked streaming of source code.  Can be implemented either\n *      by streaming chunks of bytes or chunks of codepoints.\n */\n\n#if defined(DUK_USE_LEXER_SLIDING_WINDOW)\nDUK_LOCAL void duk__fill_lexer_buffer(duk_lexer_ctx *lex_ctx, duk_small_uint_t start_offset_bytes) {\n\tduk_lexer_codepoint *cp, *cp_end;\n\tduk_ucodepoint_t x;\n\tduk_small_uint_t contlen;\n\tconst duk_uint8_t *p, *p_end;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\tduk_ucodepoint_t mincp;\n#endif\n\tduk_int_t input_line;\n\n\t/* Use temporaries and update lex_ctx only when finished. */\n\tinput_line = lex_ctx->input_line;\n\tp = lex_ctx->input + lex_ctx->input_offset;\n\tp_end = lex_ctx->input + lex_ctx->input_length;\n\n\tcp = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->buffer + start_offset_bytes);\n\tcp_end = lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE;\n\n\tfor (; cp != cp_end; cp++) {\n\t\tcp->offset = (duk_size_t) (p - lex_ctx->input);\n\t\tcp->line = input_line;\n\n\t\t/* XXX: potential issue with signed pointers, p_end < p. */\n\t\tif (DUK_UNLIKELY(p >= p_end)) {\n\t\t\t/* If input_offset were assigned a negative value, it would\n\t\t\t * result in a large positive value.  Most likely it would be\n\t\t\t * larger than input_length and be caught here.  In any case\n\t\t\t * no memory unsafe behavior would happen.\n\t\t\t */\n\t\t\tcp->codepoint = -1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tx = (duk_ucodepoint_t) (*p++);\n\n\t\t/* Fast path. */\n\n\t\tif (DUK_LIKELY(x < 0x80UL)) {\n\t\t\tDUK_ASSERT(x != 0x2028UL && x != 0x2029UL);  /* not LS/PS */\n\t\t\tif (DUK_UNLIKELY(x <= 0x000dUL)) {\n\t\t\t\tif ((x == 0x000aUL) ||\n\t\t\t\t    ((x == 0x000dUL) && (p >= p_end || *p != 0x000aUL))) {\n\t\t\t\t\t/* lookup for 0x000a above assumes shortest encoding now */\n\n\t\t\t\t\t/* E5 Section 7.3, treat the following as newlines:\n\t\t\t\t\t *   LF\n\t\t\t\t\t *   CR [not followed by LF]\n\t\t\t\t\t *   LS\n\t\t\t\t\t *   PS\n\t\t\t\t\t *\n\t\t\t\t\t * For CR LF, CR is ignored if it is followed by LF, and the LF will bump\n\t\t\t\t\t * the line number.\n\t\t\t\t\t */\n\t\t\t\t\tinput_line++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcp->codepoint = (duk_codepoint_t) x;\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* Slow path. */\n\n\t\tif (x < 0xc0UL) {\n\t\t\t/* 10xx xxxx -> invalid */\n\t\t\tgoto error_encoding;\n\t\t} else if (x < 0xe0UL) {\n\t\t\t/* 110x xxxx   10xx xxxx  */\n\t\t\tcontlen = 1;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\t\t\tmincp = 0x80UL;\n#endif\n\t\t\tx = x & 0x1fUL;\n\t\t} else if (x < 0xf0UL) {\n\t\t\t/* 1110 xxxx   10xx xxxx   10xx xxxx */\n\t\t\tcontlen = 2;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\t\t\tmincp = 0x800UL;\n#endif\n\t\t\tx = x & 0x0fUL;\n\t\t} else if (x < 0xf8UL) {\n\t\t\t/* 1111 0xxx   10xx xxxx   10xx xxxx   10xx xxxx */\n\t\t\tcontlen = 3;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\t\t\tmincp = 0x10000UL;\n#endif\n\t\t\tx = x & 0x07UL;\n\t\t} else {\n\t\t\t/* no point in supporting encodings of 5 or more bytes */\n\t\t\tgoto error_encoding;\n\t\t}\n\n\t\tDUK_ASSERT(p_end >= p);\n\t\tif ((duk_size_t) contlen > (duk_size_t) (p_end - p)) {\n\t\t\tgoto error_clipped;\n\t\t}\n\n\t\twhile (contlen > 0) {\n\t\t\tduk_small_uint_t y;\n\t\t\ty = *p++;\n\t\t\tif ((y & 0xc0U) != 0x80U) {\n\t\t\t\t/* check that byte has the form 10xx xxxx */\n\t\t\t\tgoto error_encoding;\n\t\t\t}\n\t\t\tx = x << 6;\n\t\t\tx += y & 0x3fUL;\n\t\t\tcontlen--;\n\t\t}\n\n\t\t/* check final character validity */\n\n\t\tif (x > 0x10ffffUL) {\n\t\t\tgoto error_encoding;\n\t\t}\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\t\tif (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) {\n\t\t\tgoto error_encoding;\n\t\t}\n#endif\n\n\t\tDUK_ASSERT(x != 0x000aUL && x != 0x000dUL);\n\t\tif ((x == 0x2028UL) || (x == 0x2029UL)) {\n\t\t\tinput_line++;\n\t\t}\n\n\t\tcp->codepoint = (duk_codepoint_t) x;\n\t}\n\n\tlex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input);\n\tlex_ctx->input_line = input_line;\n\treturn;\n\n error_clipped:   /* clipped codepoint */\n error_encoding:  /* invalid codepoint encoding or codepoint */\n\tlex_ctx->input_offset = (duk_size_t) (p - lex_ctx->input);\n\tlex_ctx->input_line = input_line;\n\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED);\n}\n\nDUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) {\n\tduk_small_uint_t used_bytes, avail_bytes;\n\n\tDUK_ASSERT_DISABLE(count_bytes >= 0);  /* unsigned */\n\tDUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint)));\n\tDUK_ASSERT(lex_ctx->window >= lex_ctx->buffer);\n\tDUK_ASSERT(lex_ctx->window < lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE);\n\tDUK_ASSERT((duk_uint8_t *) lex_ctx->window + count_bytes <= (duk_uint8_t *) lex_ctx->buffer + DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint));\n\n\t/* Zero 'count' is also allowed to make call sites easier.\n\t * Arithmetic in bytes generates better code in GCC.\n\t */\n\n\tlex_ctx->window = (duk_lexer_codepoint *) (void *) ((duk_uint8_t *) lex_ctx->window + count_bytes);  /* avoid multiply */\n\tused_bytes = (duk_small_uint_t) ((duk_uint8_t *) lex_ctx->window - (duk_uint8_t *) lex_ctx->buffer);\n\tavail_bytes = DUK_LEXER_BUFFER_SIZE * sizeof(duk_lexer_codepoint) - used_bytes;\n\tif (avail_bytes < (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint))) {\n\t\t/* Not enough data to provide a full window, so \"scroll\" window to\n\t\t * start of buffer and fill up the rest.\n\t\t */\n\t\tDUK_MEMMOVE((void *) lex_ctx->buffer,\n\t\t            (const void *) lex_ctx->window,\n\t\t            (size_t) avail_bytes);\n\t\tlex_ctx->window = lex_ctx->buffer;\n\t\tduk__fill_lexer_buffer(lex_ctx, avail_bytes);\n\t}\n}\n\nDUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) {\n\tlex_ctx->window = lex_ctx->buffer;\n\tduk__fill_lexer_buffer(lex_ctx, 0);\n}\n#else  /* DUK_USE_LEXER_SLIDING_WINDOW */\nDUK_LOCAL duk_codepoint_t duk__read_char(duk_lexer_ctx *lex_ctx) {\n\tduk_ucodepoint_t x;\n\tduk_small_uint_t len;\n\tduk_small_uint_t i;\n\tconst duk_uint8_t *p;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\tduk_ucodepoint_t mincp;\n#endif\n\tduk_size_t input_offset;\n\n\tinput_offset = lex_ctx->input_offset;\n\tif (DUK_UNLIKELY(input_offset >= lex_ctx->input_length)) {\n\t\t/* If input_offset were assigned a negative value, it would\n\t\t * result in a large positive value.  Most likely it would be\n\t\t * larger than input_length and be caught here.  In any case\n\t\t * no memory unsafe behavior would happen.\n\t\t */\n\t\treturn -1;\n\t}\n\n\tp = lex_ctx->input + input_offset;\n\tx = (duk_ucodepoint_t) (*p);\n\n\tif (DUK_LIKELY(x < 0x80UL)) {\n\t\t/* 0xxx xxxx -> fast path */\n\n\t\t/* input offset tracking */\n\t\tlex_ctx->input_offset++;\n\n\t\tDUK_ASSERT(x != 0x2028UL && x != 0x2029UL);  /* not LS/PS */\n\t\tif (DUK_UNLIKELY(x <= 0x000dUL)) {\n\t\t\tif ((x == 0x000aUL) ||\n\t\t\t    ((x == 0x000dUL) && (lex_ctx->input_offset >= lex_ctx->input_length ||\n\t\t\t                         lex_ctx->input[lex_ctx->input_offset] != 0x000aUL))) {\n\t\t\t\t/* lookup for 0x000a above assumes shortest encoding now */\n\n\t\t\t\t/* E5 Section 7.3, treat the following as newlines:\n\t\t\t\t *   LF\n\t\t\t\t *   CR [not followed by LF]\n\t\t\t\t *   LS\n\t\t\t\t *   PS\n\t\t\t\t *\n\t\t\t\t * For CR LF, CR is ignored if it is followed by LF, and the LF will bump\n\t\t\t\t * the line number.\n\t\t\t\t */\n\t\t\t\tlex_ctx->input_line++;\n\t\t\t}\n\t\t}\n\n\t\treturn (duk_codepoint_t) x;\n\t}\n\n\t/* Slow path. */\n\n\tif (x < 0xc0UL) {\n\t\t/* 10xx xxxx -> invalid */\n\t\tgoto error_encoding;\n\t} else if (x < 0xe0UL) {\n\t\t/* 110x xxxx   10xx xxxx  */\n\t\tlen = 2;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\t\tmincp = 0x80UL;\n#endif\n\t\tx = x & 0x1fUL;\n\t} else if (x < 0xf0UL) {\n\t\t/* 1110 xxxx   10xx xxxx   10xx xxxx */\n\t\tlen = 3;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\t\tmincp = 0x800UL;\n#endif\n\t\tx = x & 0x0fUL;\n\t} else if (x < 0xf8UL) {\n\t\t/* 1111 0xxx   10xx xxxx   10xx xxxx   10xx xxxx */\n\t\tlen = 4;\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\t\tmincp = 0x10000UL;\n#endif\n\t\tx = x & 0x07UL;\n\t} else {\n\t\t/* no point in supporting encodings of 5 or more bytes */\n\t\tgoto error_encoding;\n\t}\n\n\tDUK_ASSERT(lex_ctx->input_length >= lex_ctx->input_offset);\n\tif ((duk_size_t) len > (duk_size_t) (lex_ctx->input_length - lex_ctx->input_offset)) {\n\t\tgoto error_clipped;\n\t}\n\n\tp++;\n\tfor (i = 1; i < len; i++) {\n\t\tduk_small_uint_t y;\n\t\ty = *p++;\n\t\tif ((y & 0xc0U) != 0x80U) {\n\t\t\t/* check that byte has the form 10xx xxxx */\n\t\t\tgoto error_encoding;\n\t\t}\n\t\tx = x << 6;\n\t\tx += y & 0x3fUL;\n\t}\n\n\t/* check final character validity */\n\n\tif (x > 0x10ffffUL) {\n\t\tgoto error_encoding;\n\t}\n#if defined(DUK_USE_STRICT_UTF8_SOURCE)\n\tif (x < mincp || (x >= 0xd800UL && x <= 0xdfffUL) || x == 0xfffeUL) {\n\t\tgoto error_encoding;\n\t}\n#endif\n\n\t/* input offset tracking */\n\tlex_ctx->input_offset += len;\n\n\t/* line tracking */\n\tDUK_ASSERT(x != 0x000aUL && x != 0x000dUL);\n\tif ((x == 0x2028UL) || (x == 0x2029UL)) {\n\t\tlex_ctx->input_line++;\n\t}\n\n\treturn (duk_codepoint_t) x;\n\n error_clipped:   /* clipped codepoint */\n error_encoding:  /* invalid codepoint encoding or codepoint */\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_SOURCE_DECODE_FAILED);\n\treturn 0;\n}\n\nDUK_LOCAL void duk__advance_bytes(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_bytes) {\n\tduk_small_uint_t keep_bytes;\n\tduk_lexer_codepoint *cp, *cp_end;\n\n\tDUK_ASSERT_DISABLE(count_bytes >= 0);  /* unsigned */\n\tDUK_ASSERT(count_bytes <= (duk_small_uint_t) (DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint)));\n\n\t/* Zero 'count' is also allowed to make call sites easier. */\n\n\tkeep_bytes = DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint) - count_bytes;\n\tDUK_MEMMOVE((void *) lex_ctx->window,\n\t            (const void *) ((duk_uint8_t *) lex_ctx->window + count_bytes),\n\t            (size_t) keep_bytes);\n\n\tcp = (duk_lexer_codepoint *) ((duk_uint8_t *) lex_ctx->window + keep_bytes);\n\tcp_end = lex_ctx->window + DUK_LEXER_WINDOW_SIZE;\n\tfor (; cp != cp_end; cp++) {\n\t\tcp->offset = lex_ctx->input_offset;\n\t\tcp->line = lex_ctx->input_line;\n\t\tcp->codepoint = duk__read_char(lex_ctx);\n\t}\n}\n\nDUK_LOCAL void duk__init_lexer_window(duk_lexer_ctx *lex_ctx) {\n\t/* Call with count == DUK_LEXER_WINDOW_SIZE to fill buffer initially. */\n\tduk__advance_bytes(lex_ctx, DUK_LEXER_WINDOW_SIZE * sizeof(duk_lexer_codepoint));  /* fill window */\n}\n#endif  /* DUK_USE_LEXER_SLIDING_WINDOW */\n\nDUK_LOCAL void duk__advance_chars(duk_lexer_ctx *lex_ctx, duk_small_uint_t count_chars) {\n\tduk__advance_bytes(lex_ctx, count_chars * sizeof(duk_lexer_codepoint));\n}\n\n/*\n *  (Re)initialize the temporary byte buffer.  May be called extra times\n *  with little impact.\n */\n\nDUK_LOCAL void duk__initbuffer(duk_lexer_ctx *lex_ctx) {\n\t/* Reuse buffer as is unless buffer has grown large. */\n\tif (DUK_HBUFFER_DYNAMIC_GET_SIZE(lex_ctx->buf) < DUK_LEXER_TEMP_BUF_LIMIT) {\n\t\t/* Keep current size */\n\t} else {\n\t\tduk_hbuffer_resize(lex_ctx->thr, lex_ctx->buf, DUK_LEXER_TEMP_BUF_LIMIT);\n\t}\n\n\tDUK_BW_INIT_WITHBUF(lex_ctx->thr, &lex_ctx->bw, lex_ctx->buf);\n}\n\n/*\n *  Append a Unicode codepoint to the temporary byte buffer.  Performs\n *  CESU-8 surrogate pair encoding for codepoints above the BMP.\n *  Existing surrogate pairs are allowed and also encoded into CESU-8.\n */\n\nDUK_LOCAL void duk__appendbuffer(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) {\n\t/*\n\t *  Since character data is only generated by decoding the source or by\n\t *  the compiler itself, we rely on the input codepoints being correct\n\t *  and avoid a check here.\n\t *\n\t *  Character data can also come here through decoding of Unicode\n\t *  escapes (\"\\udead\\ubeef\") so all 16-but unsigned values can be\n\t *  present, even when the source file itself is strict UTF-8.\n\t */\n\tDUK_ASSERT(x >= 0 && x <= 0x10ffffL);\n\n\tDUK_BW_WRITE_ENSURE_CESU8(lex_ctx->thr, &lex_ctx->bw, (duk_ucodepoint_t) x);\n}\n\nDUK_LOCAL void duk__appendbuffer_ascii(duk_lexer_ctx *lex_ctx, duk_codepoint_t x) {\n\t/* ASCII characters can be emitted as a single byte without encoding\n\t * which matters for some fast paths.\n\t */\n\tDUK_ASSERT(x >= 0 && x <= 0x7f);\n\n\tDUK_BW_WRITE_ENSURE_U8(lex_ctx->thr, &lex_ctx->bw, (duk_uint8_t) x);\n}\n\n/*\n *  Intern the temporary byte buffer into a valstack slot\n *  (in practice, slot1 or slot2).\n */\n\nDUK_LOCAL duk_hstring *duk__internbuffer(duk_lexer_ctx *lex_ctx, duk_idx_t valstack_idx) {\n\tDUK_ASSERT(valstack_idx == lex_ctx->slot1_idx || valstack_idx == lex_ctx->slot2_idx);\n\n\tDUK_BW_PUSH_AS_STRING(lex_ctx->thr, &lex_ctx->bw);\n\tduk_replace(lex_ctx->thr, valstack_idx);\n\treturn duk_known_hstring(lex_ctx->thr, valstack_idx);\n}\n\n/*\n *  Init lexer context\n */\n\nDUK_INTERNAL void duk_lexer_initctx(duk_lexer_ctx *lex_ctx) {\n\tDUK_ASSERT(lex_ctx != NULL);\n\n\tDUK_MEMZERO(lex_ctx, sizeof(*lex_ctx));\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n#if defined(DUK_USE_LEXER_SLIDING_WINDOW)\n\tlex_ctx->window = NULL;\n#endif\n\tlex_ctx->thr = NULL;\n\tlex_ctx->input = NULL;\n\tlex_ctx->buf = NULL;\n#endif\n}\n\n/*\n *  Set lexer input position and reinitialize lookup window.\n */\n\nDUK_INTERNAL void duk_lexer_getpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) {\n\tpt->offset = lex_ctx->window[0].offset;\n\tpt->line = lex_ctx->window[0].line;\n}\n\nDUK_INTERNAL void duk_lexer_setpoint(duk_lexer_ctx *lex_ctx, duk_lexer_point *pt) {\n\tDUK_ASSERT_DISABLE(pt->offset >= 0);  /* unsigned */\n\tDUK_ASSERT(pt->line >= 1);\n\tlex_ctx->input_offset = pt->offset;\n\tlex_ctx->input_line = pt->line;\n\tduk__init_lexer_window(lex_ctx);\n}\n\n/*\n *  Lexing helpers\n */\n\n/* Numeric value of a hex digit (also covers octal and decimal digits) or\n * -1 if not a valid hex digit.\n */\nDUK_LOCAL duk_codepoint_t duk__hexval_validate(duk_codepoint_t x) {\n\tduk_small_int_t t;\n\n\t/* Here 'x' is a Unicode codepoint */\n\tif (DUK_LIKELY(x >= 0 && x <= 0xff)) {\n\t\tt = duk_hex_dectab[x];\n\t\tif (DUK_LIKELY(t >= 0)) {\n\t\t\treturn t;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/* Just a wrapper for call sites where 'x' is known to be valid so\n * we assert for it before decoding.\n */\nDUK_LOCAL duk_codepoint_t duk__hexval(duk_codepoint_t x) {\n\tduk_codepoint_t ret;\n\n\tDUK_ASSERT((x >= DUK_ASC_0 && x <= DUK_ASC_9) ||\n\t           (x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_F) ||\n\t           (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_F));\n\tret = duk__hexval_validate(x);\n\tDUK_ASSERT(ret >= 0 && ret <= 15);\n\treturn ret;\n}\n\n/* having this as a separate function provided a size benefit */\nDUK_LOCAL duk_bool_t duk__is_hex_digit(duk_codepoint_t x) {\n\tif (DUK_LIKELY(x >= 0 && x <= 0xff)) {\n\t\treturn (duk_hex_dectab[x] >= 0);\n\t}\n\treturn 0;\n}\n\n/* Parse a Unicode escape of the form \\xHH, \\uHHHH, or \\u{H+}.  Shared by\n * source and RegExp parsing.\n */\nDUK_LOCAL duk_codepoint_t duk__lexer_parse_escape(duk_lexer_ctx *lex_ctx, duk_bool_t allow_es6) {\n\tduk_small_int_t digits;  /* Initial value 2 or 4 for fixed length escapes, 0 for ES2015 \\u{H+}. */\n\tduk_codepoint_t escval;\n\tduk_codepoint_t x;\n\tduk_small_uint_t adv;\n\n\tDUK_ASSERT(DUK__L0() == DUK_ASC_BACKSLASH);  /* caller responsibilities */\n\tDUK_ASSERT(DUK__L1() == DUK_ASC_LC_X || DUK__L1() == DUK_ASC_LC_U);\n\tDUK_UNREF(allow_es6);\n\n\tadv = 2;\n\tdigits = 2;\n\tif (DUK__L1() == DUK_ASC_LC_U) {\n\t\tdigits = 4;\n#if defined(DUK_USE_ES6_UNICODE_ESCAPE)\n\t\tif (DUK__L2() == DUK_ASC_LCURLY && allow_es6) {\n\t\t\tdigits = 0;\n\t\t\tadv = 3;\n\t\t}\n#endif\n\t}\n\tDUK__ADVANCECHARS(lex_ctx, adv);\n\n\tescval = 0;\n\tfor (;;) {\n\t\t/* One of the escape forms: \\xHH, \\uHHHH, \\u{H+}.\n\t\t * The 'digits' variable tracks parsing state and is\n\t\t * initialized to:\n\t\t *\n\t\t *   \\xHH     2\n\t\t *   \\uHH     4\n\t\t *   \\u{H+}   0 first time, updated to -1 to indicate\n\t\t *            at least one digit has been parsed\n\t\t *\n\t\t * Octal parsing is handled separately because it can be\n\t\t * done with fixed lookahead and also has validation\n\t\t * rules which depend on the escape length (which is\n\t\t * variable).\n\t\t *\n\t\t * We don't need a specific check for x < 0 (end of\n\t\t * input) or duk_unicode_is_line_terminator(x)\n\t\t * because the 'dig' decode will fail and lead to a\n\t\t * SyntaxError.\n\t\t */\n\t\tduk_codepoint_t dig;\n\n\t\tx = DUK__L0();\n\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\n\t\tdig = duk__hexval_validate(x);\n\t\tif (digits > 0) {\n\t\t\tdigits--;\n\t\t\tif (dig < 0) {\n\t\t\t\tgoto fail_escape;\n\t\t\t}\n\t\t\tDUK_ASSERT(dig >= 0x00 && dig <= 0x0f);\n\t\t\tescval = (escval << 4) + dig;\n\t\t\tif (digits == 0) {\n\t\t\t\tDUK_ASSERT(escval >= 0 && escval <= 0xffffL);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n#if defined(DUK_USE_ES6_UNICODE_ESCAPE)\n\t\t\tDUK_ASSERT(digits == 0 /* first time */ || digits == -1 /* others */);\n\t\t\tif (dig >= 0) {\n\t\t\t\tDUK_ASSERT(dig >= 0x00 && dig <= 0x0f);\n\t\t\t\tescval = (escval << 4) + dig;\n\t\t\t\tif (escval > 0x10ffffL) {\n\t\t\t\t\tgoto fail_escape;\n\t\t\t\t}\n\t\t\t} else if (x == DUK_ASC_RCURLY) {\n\t\t\t\tif (digits == 0) {\n\t\t\t\t\t/* Empty escape, \\u{}. */\n\t\t\t\t\tgoto fail_escape;\n\t\t\t\t}\n\t\t\t\tDUK_ASSERT(escval >= 0 && escval <= 0x10ffffL);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tgoto fail_escape;\n\t\t\t}\n\t\t\tdigits = -1;  /* Indicate we have at least one digit. */\n#else  /* DUK_USE_ES6_UNICODE_ESCAPE */\n\t\t\tDUK_ASSERT(0);  /* Never happens if \\u{H+} support disabled. */\n#endif  /* DUK_USE_ES6_UNICODE_ESCAPE */\n\t\t}\n\t}\n\n\treturn escval;\n\n fail_escape:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE);\n}\n\n/* Parse legacy octal escape of the form \\N{1,3}, e.g. \\0, \\5, \\0377.  Maximum\n * allowed value is \\0377 (U+00FF), longest match is used.  Used for both string\n * RegExp octal escape parsing.  Window[0] must be the slash '\\' and the first\n * digit must already be validated to be in [0-9] by the caller.\n */\nDUK_LOCAL duk_codepoint_t duk__lexer_parse_legacy_octal(duk_lexer_ctx *lex_ctx, duk_small_uint_t *out_adv, duk_bool_t reject_annex_b) {\n\tduk_codepoint_t cp;\n\tduk_small_uint_t lookup_idx;\n\tduk_small_uint_t adv;\n\tduk_codepoint_t tmp;\n\n\tDUK_ASSERT(out_adv != NULL);\n\tDUK_ASSERT(DUK__LOOKUP(lex_ctx, 0) == DUK_ASC_BACKSLASH);\n\tDUK_ASSERT(DUK__LOOKUP(lex_ctx, 1) >= DUK_ASC_0 && DUK__LOOKUP(lex_ctx, 1) <= DUK_ASC_9);\n\n\tcp = 0;\n\ttmp = 0;\n\tfor (lookup_idx = 1; lookup_idx <= 3; lookup_idx++) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"lookup_idx=%ld, cp=%ld\", (long) lookup_idx, (long) cp));\n\t\ttmp = DUK__LOOKUP(lex_ctx, lookup_idx);\n\t\tif (tmp < DUK_ASC_0 || tmp > DUK_ASC_7) {\n\t\t\t/* No more valid digits. */\n\t\t\tbreak;\n\t\t}\n\t\ttmp = (cp << 3) + (tmp - DUK_ASC_0);\n\t\tif (tmp > 0xff) {\n\t\t\t/* Three digit octal escapes above \\377 (= 0xff)\n\t\t\t * are not allowed.\n\t\t\t */\n\t\t\tbreak;\n\t\t}\n\t\tcp = tmp;\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"final lookup_idx=%ld, cp=%ld\", (long) lookup_idx, (long) cp));\n\n\tadv = lookup_idx;\n\tif (lookup_idx == 1) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"\\\\8 or \\\\9 -> treat as literal, accept in strict mode too\"));\n\t\tDUK_ASSERT(tmp == DUK_ASC_8 || tmp == DUK_ASC_9);\n\t\tcp = tmp;\n\t\tadv++;  /* correction to above, eat offending character */\n\t} else if (lookup_idx == 2 && cp == 0) {\n\t\t/* Note: 'foo\\0bar' is OK in strict mode, but 'foo\\00bar' is not.\n\t\t * It won't be interpreted as 'foo\\u{0}0bar' but as a SyntaxError.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"\\\\0 -> accept in strict mode too\"));\n\t} else {\n\t\t/* This clause also handles non-shortest zero, e.g. \\00. */\n\t\tif (reject_annex_b) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"non-zero octal literal %ld -> reject in strict-mode\", (long) cp));\n\t\t\tcp = -1;\n\t\t} else {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"non-zero octal literal %ld -> accepted\", (long) cp));\n\t\t\tDUK_ASSERT(cp >= 0 && cp <= 0xff);\n\t\t}\n\t}\n\n\t*out_adv = adv;\n\n\tDUK_ASSERT((cp >= 0 && cp <= 0xff) || (cp == -1 && reject_annex_b));\n\treturn cp;\n}\n\n/* XXX: move strict mode to lex_ctx? */\nDUK_LOCAL void duk__lexer_parse_string_literal(duk_lexer_ctx *lex_ctx, duk_token *out_token, duk_small_int_t quote, duk_bool_t strict_mode) {\n\tduk_small_uint_t adv;\n\n\tfor (adv = 1 /* initial quote */ ;;) {\n\t\tduk_codepoint_t x;\n\n\t\tDUK__ADVANCECHARS(lex_ctx, adv);  /* eat opening quote on first loop */\n\t\tx = DUK__L0();\n\n\t\tadv = 1;\n\t\tif (x == quote) {\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);  /* eat closing quote */\n\t\t\tbreak;\n\t\t} else if (x == '\\\\') {\n\t\t\t/* DUK__L0        -> '\\' char\n\t\t\t * DUK__L1 ... DUK__L5 -> more lookup\n\t\t\t */\n\t\t\tduk_small_int_t emitcp = -1;\n\n\t\t\tx = DUK__L1();\n\n\t\t\t/* How much to advance before next loop. */\n\t\t\tadv = 2;  /* note: long live range */\n\n\t\t\tswitch (x) {\n\t\t\tcase '\\'':\n\t\t\t\temitcp = 0x0027;\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\temitcp = 0x0022;\n\t\t\t\tbreak;\n\t\t\tcase '\\\\':\n\t\t\t\temitcp = 0x005c;\n\t\t\t\tbreak;\n\t\t\tcase 'b':\n\t\t\t\temitcp = 0x0008;\n\t\t\t\tbreak;\n\t\t\tcase 'f':\n\t\t\t\temitcp = 0x000c;\n\t\t\t\tbreak;\n\t\t\tcase 'n':\n\t\t\t\temitcp = 0x000a;\n\t\t\t\tbreak;\n\t\t\tcase 'r':\n\t\t\t\temitcp = 0x000d;\n\t\t\t\tbreak;\n\t\t\tcase 't':\n\t\t\t\temitcp = 0x0009;\n\t\t\t\tbreak;\n\t\t\tcase 'v':\n\t\t\t\temitcp = 0x000b;\n\t\t\t\tbreak;\n\t\t\tcase 'x':\n\t\t\tcase 'u': {\n\t\t\t\tduk_codepoint_t esc_cp;\n\t\t\t\tesc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/);\n\t\t\t\tDUK__APPENDBUFFER(lex_ctx, esc_cp);\n\t\t\t\tadv = 0;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (duk_unicode_is_line_terminator(x)) {\n\t\t\t\t\t/* line continuation */\n\t\t\t\t\tif (x == 0x000d && DUK__L2() == 0x000a) {\n\t\t\t\t\t\t/* CR LF again a special case */\n\t\t\t\t\t\tadv = 3;  /* line terminator, CR, LF */\n\t\t\t\t\t}\n\t\t\t\t} else if (DUK__ISDIGIT(x)) {\n\t\t\t\t\t/*\n\t\t\t\t\t *  Octal escape or zero escape:\n\t\t\t\t\t *    \\0                                     (lookahead not OctalDigit)\n\t\t\t\t\t *    \\1 ... \\7                              (lookahead not OctalDigit)\n\t\t\t\t\t *    \\ZeroToThree OctalDigit                (lookahead not OctalDigit)\n\t\t\t\t\t *    \\FourToSeven OctalDigit                (no lookahead restrictions)\n\t\t\t\t\t *    \\ZeroToThree OctalDigit OctalDigit     (no lookahead restrictions)\n\t\t\t\t\t *\n\t\t\t\t\t *  Zero escape is part of the standard syntax.  Octal escapes are\n\t\t\t\t\t *  defined in E5 Section B.1.2, and are only allowed in non-strict mode.\n\t\t\t\t\t *  Any other productions starting with a decimal digit are invalid\n\t\t\t\t\t *  but are in practice treated like identity escapes.\n\t\t\t\t\t *\n\t\t\t\t\t *  Parse octal (up to 3 digits) from the lookup window.\n\t\t\t\t\t */\n\n\t\t\t\t\temitcp = duk__lexer_parse_legacy_octal(lex_ctx, &adv, strict_mode /*reject_annex_b*/);\n\t\t\t\t\tif (emitcp < 0) {\n\t\t\t\t\t\tgoto fail_escape;\n\t\t\t\t\t}\n\t\t\t\t} else if (x < 0) {\n\t\t\t\t\tgoto fail_unterminated;\n\t\t\t\t} else {\n\t\t\t\t\t/* escaped NonEscapeCharacter */\n\t\t\t\t\tDUK__APPENDBUFFER(lex_ctx, x);\n\t\t\t\t}\n\t\t\t}  /* end default clause */\n\t\t\t}  /* end switch */\n\n\t\t\t/* Shared handling for single codepoint escapes. */\n\t\t\tif (emitcp >= 0) {\n\t\t\t\tDUK__APPENDBUFFER(lex_ctx, emitcp);\n\t\t\t}\n\n\t\t\t/* Track number of escapes; count not really needed but directive\n\t\t\t * prologues need to detect whether there were any escapes or line\n\t\t\t * continuations or not.\n\t\t\t */\n\t\t\tout_token->num_escapes++;\n\t\t} else if (x >= 0x20 && x <= 0x7f) {\n\t\t\t/* Fast path for ASCII case, avoids line terminator\n\t\t\t * check and CESU-8 encoding.\n\t\t\t */\n\t\t\tDUK_ASSERT(x >= 0);\n\t\t\tDUK_ASSERT(!duk_unicode_is_line_terminator(x));\n\t\t\tDUK_ASSERT(x != quote);\n\t\t\tDUK_ASSERT(x != DUK_ASC_BACKSLASH);\n\t\t\tDUK__APPENDBUFFER_ASCII(lex_ctx, x);\n\t\t} else if (x < 0 || duk_unicode_is_line_terminator(x)) {\n\t\t\tgoto fail_unterminated;\n\t\t} else {\n\t\t\t/* Character which is part of the string but wasn't handled\n\t\t\t * by the fast path.\n\t\t\t */\n\t\t\tDUK__APPENDBUFFER(lex_ctx, x);\n\t\t}\n\t} /* string parse loop */\n\n\treturn;\n\n fail_escape:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE);\n\treturn;\n\n fail_unterminated:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_STRING);\n\treturn;\n}\n\n/* Skip to end-of-line (or end-of-file), used for single line comments. */\nDUK_LOCAL void duk__lexer_skip_to_endofline(duk_lexer_ctx *lex_ctx) {\n\tfor (;;) {\n\t\tduk_codepoint_t x;\n\n\t\tx = DUK__L0();\n\t\tif (x < 0 || duk_unicode_is_line_terminator(x)) {\n\t\t\tbreak;\n\t\t}\n\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t}\n}\n\n/*\n *  Parse Ecmascript source InputElementDiv or InputElementRegExp\n *  (E5 Section 7), skipping whitespace, comments, and line terminators.\n *\n *  Possible results are:\n *    (1) a token\n *    (2) a line terminator (skipped)\n *    (3) a comment (skipped)\n *    (4) EOF\n *\n *  White space is automatically skipped from the current position (but\n *  not after the input element).  If input has already ended, returns\n *  DUK_TOK_EOF indefinitely.  If a parse error occurs, uses an DUK_ERROR()\n *  macro call (and hence a longjmp through current heap longjmp context).\n *  Comments and line terminator tokens are automatically skipped.\n *\n *  The input element being matched is determined by regexp_mode; if set,\n *  parses a InputElementRegExp, otherwise a InputElementDiv.  The\n *  difference between these are handling of productions starting with a\n *  forward slash.\n *\n *  If strict_mode is set, recognizes additional future reserved words\n *  specific to strict mode, and refuses to parse octal literals.\n *\n *  The matching strategy below is to (currently) use a six character\n *  lookup window to quickly determine which production is the -longest-\n *  matching one, and then parse that.  The top-level if-else clauses\n *  match the first character, and the code blocks for each clause\n *  handle -all- alternatives for that first character.  Ecmascript\n *  specification uses the \"longest match wins\" semantics, so the order\n *  of the if-clauses matters.\n *\n *  Misc notes:\n *\n *    * Ecmascript numeric literals do not accept a sign character.\n *      Consequently e.g. \"-1.0\" is parsed as two tokens: a negative\n *      sign and a positive numeric literal.  The compiler performs\n *      the negation during compilation, so this has no adverse impact.\n *\n *    * There is no token for \"undefined\": it is just a value available\n *      from the global object (or simply established by doing a reference\n *      to an undefined value).\n *\n *    * Some contexts want Identifier tokens, which are IdentifierNames\n *      excluding reserved words, while some contexts want IdentifierNames\n *      directly.  In the latter case e.g. \"while\" is interpreted as an\n *      identifier name, not a DUK_TOK_WHILE token.  The solution here is\n *      to provide both token types: DUK_TOK_WHILE goes to 't' while\n *      DUK_TOK_IDENTIFIER goes to 't_nores', and 'slot1' always contains\n *      the identifier / keyword name.\n *\n *    * Directive prologue needs to identify string literals such as\n *      \"use strict\" and 'use strict', which are sensitive to line\n *      continuations and escape sequences.  For instance, \"use\\u0020strict\"\n *      is a valid directive but is distinct from \"use strict\".  The solution\n *      here is to decode escapes while tokenizing, but to keep track of the\n *      number of escapes.  Directive detection can then check that the\n *      number of escapes is zero.\n *\n *    * Multi-line comments with one or more internal LineTerminator are\n *      treated like a line terminator to comply with automatic semicolon\n *      insertion.\n */\n\nDUK_INTERNAL\nvoid duk_lexer_parse_js_input_element(duk_lexer_ctx *lex_ctx,\n                                      duk_token *out_token,\n                                      duk_bool_t strict_mode,\n                                      duk_bool_t regexp_mode) {\n\tduk_codepoint_t x;           /* temporary, must be signed and 32-bit to hold Unicode code points */\n\tduk_small_uint_t advtok = 0; /* (advance << 8) + token_type, updated at function end,\n\t                              * init is unnecessary but suppresses \"may be used uninitialized\" warnings.\n\t                              */\n\tduk_bool_t got_lineterm = 0;  /* got lineterm preceding non-whitespace, non-lineterm token */\n\n\tif (++lex_ctx->token_count >= lex_ctx->token_limit) {\n\t\tgoto fail_token_limit;\n\t}\n\n\tout_token->t = DUK_TOK_EOF;\n\tout_token->t_nores = DUK_TOK_INVALID;  /* marker: copy t if not changed */\n#if 0  /* not necessary to init, disabled for faster parsing */\n\tout_token->num = DUK_DOUBLE_NAN;\n\tout_token->str1 = NULL;\n\tout_token->str2 = NULL;\n#endif\n\tout_token->num_escapes = 0;\n\t/* out_token->lineterm set by caller */\n\n\t/* This would be nice, but parsing is faster without resetting the\n\t * value slots.  The only side effect is that references to temporary\n\t * string values may linger until lexing is finished; they're then\n\t * freed normally.\n\t */\n#if 0\n\tduk_to_undefined(lex_ctx->thr, lex_ctx->slot1_idx);\n\tduk_to_undefined(lex_ctx->thr, lex_ctx->slot2_idx);\n#endif\n\n\t/* 'advtok' indicates how much to advance and which token id to assign\n\t * at the end.  This shared functionality minimizes code size.  All\n\t * code paths are required to set 'advtok' to some value, so no default\n\t * init value is used.  Code paths calling DUK_ERROR() never return so\n\t * they don't need to set advtok.\n\t */\n\n\t/*\n\t *  Matching order:\n\t *\n\t *    Punctuator first chars, also covers comments, regexps\n\t *    LineTerminator\n\t *    Identifier or reserved word, also covers null/true/false literals\n\t *    NumericLiteral\n\t *    StringLiteral\n\t *    EOF\n\t *\n\t *  The order does not matter as long as the longest match is\n\t *  always correctly identified.  There are order dependencies\n\t *  in the clauses, so it's not trivial to convert to a switch.\n\t */\n\n restart_lineupdate:\n\tout_token->start_line = lex_ctx->window[0].line;\n\n restart:\n\tout_token->start_offset = lex_ctx->window[0].offset;\n\n\tx = DUK__L0();\n\n\tswitch (x) {\n\tcase DUK_ASC_SPACE:\n\tcase DUK_ASC_HT:  /* fast paths for space and tab */\n\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\tgoto restart;\n\tcase DUK_ASC_LF:  /* LF line terminator; CR LF and Unicode lineterms are handled in slow path */\n\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\tgot_lineterm = 1;\n\t\tgoto restart_lineupdate;\n#if defined(DUK_USE_SHEBANG_COMMENTS)\n\tcase DUK_ASC_HASH:  /* '#' */\n\t\tif (DUK__L1() == DUK_ASC_EXCLAMATION && lex_ctx->window[0].offset == 0 &&\n\t\t    (lex_ctx->flags & DUK_COMPILE_SHEBANG)) {\n\t\t\t/* \"Shebang\" comment ('#! ...') on first line. */\n\t\t\t/* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */\n\t\t\tduk__lexer_skip_to_endofline(lex_ctx);\n\t\t\tgoto restart;  /* line terminator will be handled on next round */\n\t\t}\n\t\tgoto fail_token;\n#endif  /* DUK_USE_SHEBANG_COMMENTS */\n\tcase DUK_ASC_SLASH:  /* '/' */\n\t\tif (DUK__L1() == DUK_ASC_SLASH) {\n\t\t\t/*\n\t\t\t *  E5 Section 7.4, allow SourceCharacter (which is any 16-bit\n\t\t\t *  code point).\n\t\t\t */\n\n\t\t\t/* DUK__ADVANCECHARS(lex_ctx, 2) would be correct here, but not necessary */\n\t\t\tduk__lexer_skip_to_endofline(lex_ctx);\n\t\t\tgoto restart;  /* line terminator will be handled on next round */\n\t\t} else if (DUK__L1() == DUK_ASC_STAR) {\n\t\t\t/*\n\t\t\t *  E5 Section 7.4.  If the multi-line comment contains a newline,\n\t\t\t *  it is treated like a single line terminator for automatic\n\t\t\t *  semicolon insertion.\n\t\t\t */\n\n\t\t\tduk_bool_t last_asterisk = 0;\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 2);\n\t\t\tfor (;;) {\n\t\t\t\tx = DUK__L0();\n\t\t\t\tif (x < 0) {\n\t\t\t\t\tgoto fail_unterm_comment;\n\t\t\t\t}\n\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\t\t\tif (last_asterisk && x == DUK_ASC_SLASH) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (duk_unicode_is_line_terminator(x)) {\n\t\t\t\t\tgot_lineterm = 1;\n\t\t\t\t}\n\t\t\t\tlast_asterisk = (x == DUK_ASC_STAR);\n\t\t\t}\n\t\t\tgoto restart_lineupdate;\n\t\t} else if (regexp_mode) {\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\t\t\t/*\n\t\t\t *  \"/\" followed by something in regexp mode.  See E5 Section 7.8.5.\n\t\t\t *\n\t\t\t *  RegExp parsing is a bit complex.  First, the regexp body is delimited\n\t\t\t *  by forward slashes, but the body may also contain forward slashes as\n\t\t\t *  part of an escape sequence or inside a character class (delimited by\n\t\t\t *  square brackets).  A mini state machine is used to implement these.\n\t\t\t *\n\t\t\t *  Further, an early (parse time) error must be thrown if the regexp\n\t\t\t *  would cause a run-time error when used in the expression new RegExp(...).\n\t\t\t *  Parsing here simply extracts the (candidate) regexp, and also accepts\n\t\t\t *  invalid regular expressions (which are delimited properly).  The caller\n\t\t\t *  (compiler) must perform final validation and regexp compilation.\n\t\t\t *\n\t\t\t *  RegExp first char may not be '/' (single line comment) or '*' (multi-\n\t\t\t *  line comment).  These have already been checked above, so there is no\n\t\t\t *  need below for special handling of the first regexp character as in\n\t\t\t *  the E5 productions.\n\t\t\t *\n\t\t\t *  About unicode escapes within regexp literals:\n\t\t\t *\n\t\t\t *      E5 Section 7.8.5 grammar does NOT accept \\uHHHH escapes.\n\t\t\t *      However, Section 6 states that regexps accept the escapes,\n\t\t\t *      see paragraph starting with \"In string literals...\".\n\t\t\t *      The regexp grammar, which sees the decoded regexp literal\n\t\t\t *      (after lexical parsing) DOES have a \\uHHHH unicode escape.\n\t\t\t *      So, for instance:\n\t\t\t *\n\t\t\t *          /\\u1234/\n\t\t\t *\n\t\t\t *      should first be parsed by the lexical grammar as:\n\t\t\t *\n\t\t\t *          '\\' 'u'      RegularExpressionBackslashSequence\n\t\t\t *          '1'          RegularExpressionNonTerminator\n\t\t\t *          '2'          RegularExpressionNonTerminator\n\t\t\t *          '3'          RegularExpressionNonTerminator\n\t\t\t *          '4'          RegularExpressionNonTerminator\n\t\t\t *\n\t\t\t *      and the escape itself is then parsed by the regexp engine.\n\t\t\t *      This is the current implementation.\n\t\t\t *\n\t\t\t *  Minor spec inconsistency:\n\t\t\t *\n\t\t\t *      E5 Section 7.8.5 RegularExpressionBackslashSequence is:\n\t\t\t *\n\t\t\t *         \\ RegularExpressionNonTerminator\n\t\t\t *\n\t\t\t *      while Section A.1 RegularExpressionBackslashSequence is:\n\t\t\t *\n\t\t\t *         \\ NonTerminator\n\t\t\t *\n\t\t\t *      The latter is not normative and a typo.\n\t\t\t *\n\t\t\t */\n\n\t\t\t/* first, parse regexp body roughly */\n\n\t\t\tduk_small_int_t state = 0;  /* 0=base, 1=esc, 2=class, 3=class+esc */\n\n\t\t\tDUK__INITBUFFER(lex_ctx);\n\t\t\tfor (;;) {\n\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);  /* skip opening slash on first loop */\n\t\t\t\tx = DUK__L0();\n\t\t\t\tif (x < 0 || duk_unicode_is_line_terminator(x)) {\n\t\t\t\t\tgoto fail_unterm_regexp;\n\t\t\t\t}\n\t\t\t\tx = DUK__L0();  /* re-read to avoid spill / fetch */\n\t\t\t\tif (state == 0) {\n\t\t\t\t\tif (x == DUK_ASC_SLASH) {\n\t\t\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);  /* eat closing slash */\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} else if (x == DUK_ASC_BACKSLASH) {\n\t\t\t\t\t\tstate = 1;\n\t\t\t\t\t} else if (x == DUK_ASC_LBRACKET) {\n\t\t\t\t\t\tstate = 2;\n\t\t\t\t\t}\n\t\t\t\t} else if (state == 1) {\n\t\t\t\t\tstate = 0;\n\t\t\t\t} else if (state == 2) {\n\t\t\t\t\tif (x == DUK_ASC_RBRACKET) {\n\t\t\t\t\t\tstate = 0;\n\t\t\t\t\t} else if (x == DUK_ASC_BACKSLASH) {\n\t\t\t\t\t\tstate = 3;\n\t\t\t\t\t}\n\t\t\t\t} else { /* state == 3 */\n\t\t\t\t\tstate = 2;\n\t\t\t\t}\n\t\t\t\tDUK__APPENDBUFFER(lex_ctx, x);\n\t\t\t}\n\t\t\tout_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx);\n\n\t\t\t/* second, parse flags */\n\n\t\t\tDUK__INITBUFFER(lex_ctx);\n\t\t\tfor (;;) {\n\t\t\t\tx = DUK__L0();\n\t\t\t\tif (!duk_unicode_is_identifier_part(x)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tx = DUK__L0();  /* re-read to avoid spill / fetch */\n\t\t\t\tDUK__APPENDBUFFER(lex_ctx, x);\n\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\t\t}\n\t\t\tout_token->str2 = duk__internbuffer(lex_ctx, lex_ctx->slot2_idx);\n\n\t\t\tDUK__INITBUFFER(lex_ctx);  /* free some memory */\n\n\t\t\t/* validation of the regexp is caller's responsibility */\n\n\t\t\tadvtok = DUK__ADVTOK(0, DUK_TOK_REGEXP);\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\t\t\tgoto fail_regexp_support;\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\t/* \"/=\" and not in regexp mode */\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_DIV_EQ);\n\t\t} else {\n\t\t\t/* \"/\" and not in regexp mode */\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_DIV);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_LCURLY:  /* '{' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_LCURLY);\n\t\tbreak;\n\tcase DUK_ASC_RCURLY:  /* '}' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_RCURLY);\n\t\tbreak;\n\tcase DUK_ASC_LPAREN:  /* '(' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_LPAREN);\n\t\tbreak;\n\tcase DUK_ASC_RPAREN:  /* ')' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_RPAREN);\n\t\tbreak;\n\tcase DUK_ASC_LBRACKET:  /* '[' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_LBRACKET);\n\t\tbreak;\n\tcase DUK_ASC_RBRACKET:  /* ']' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_RBRACKET);\n\t\tbreak;\n\tcase DUK_ASC_PERIOD:  /* '.' */\n\t\tif (DUK__ISDIGIT(DUK__L1())) {\n\t\t\t/* Period followed by a digit can only start DecimalLiteral\n\t\t\t * (handled in slow path).  We could jump straight into the\n\t\t\t * DecimalLiteral handling but should avoid goto to inside\n\t\t\t * a block.\n\t\t\t */\n\t\t\tgoto slow_path;\n\t\t}\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_PERIOD);\n\t\tbreak;\n\tcase DUK_ASC_SEMICOLON:  /* ';' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_SEMICOLON);\n\t\tbreak;\n\tcase DUK_ASC_COMMA:  /* ',' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_COMMA);\n\t\tbreak;\n\tcase DUK_ASC_LANGLE:  /* '<' */\n#if defined(DUK_USE_HTML_COMMENTS)\n\t\tif (DUK__L1() == DUK_ASC_EXCLAMATION && DUK__L2() == DUK_ASC_MINUS && DUK__L3() == DUK_ASC_MINUS) {\n\t\t\t/*\n\t\t\t *  ES2015: B.1.3, handle \"<!--\" SingleLineHTMLOpenComment\n\t\t\t */\n\n\t\t\t/* DUK__ADVANCECHARS(lex_ctx, 4) would be correct here, but not necessary */\n\t\t\tduk__lexer_skip_to_endofline(lex_ctx);\n\t\t\tgoto restart;  /* line terminator will be handled on next round */\n\t\t}\n\t\telse\n#endif  /* DUK_USE_HTML_COMMENTS */\n\t\tif (DUK__L1() == DUK_ASC_LANGLE && DUK__L2() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(3, DUK_TOK_ALSHIFT_EQ);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_LE);\n\t\t} else if (DUK__L1() == DUK_ASC_LANGLE) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_ALSHIFT);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_LT);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_RANGLE:  /* '>' */\n\t\tif (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE && DUK__L3() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(4, DUK_TOK_RSHIFT_EQ);\n\t\t} else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_RANGLE) {\n\t\t\tadvtok = DUK__ADVTOK(3, DUK_TOK_RSHIFT);\n\t\t} else if (DUK__L1() == DUK_ASC_RANGLE && DUK__L2() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(3, DUK_TOK_ARSHIFT_EQ);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_GE);\n\t\t} else if (DUK__L1() == DUK_ASC_RANGLE) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_ARSHIFT);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_GT);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_EQUALS:  /* '=' */\n\t\tif (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(3, DUK_TOK_SEQ);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_EQUALSIGN);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_EXCLAMATION:  /* '!' */\n\t\tif (DUK__L1() == DUK_ASC_EQUALS && DUK__L2() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(3, DUK_TOK_SNEQ);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_NEQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_LNOT);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_PLUS:  /* '+' */\n\t\tif (DUK__L1() == DUK_ASC_PLUS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_INCREMENT);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_ADD_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_ADD);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_MINUS:  /* '-' */\n#if defined(DUK_USE_HTML_COMMENTS)\n\t\tif (got_lineterm && DUK__L1() == DUK_ASC_MINUS && DUK__L2() == DUK_ASC_RANGLE) {\n\t\t\t/*\n\t\t\t *  ES2015: B.1.3, handle \"-->\" SingleLineHTMLCloseComment\n\t\t\t *  Only allowed:\n\t\t\t *  - on new line\n\t\t\t *  - preceded only by whitespace\n\t\t\t *  - preceded by end of multiline comment and optional whitespace\n\t\t\t *\n\t\t\t * Since whitespace generates no tokens, and multiline comments\n\t\t\t * are treated as a line ending, consulting `got_lineterm` is\n\t\t\t * sufficient to test for these three options.\n\t\t\t */\n\n\t\t\t/* DUK__ADVANCECHARS(lex_ctx, 3) would be correct here, but not necessary */\n\t\t\tduk__lexer_skip_to_endofline(lex_ctx);\n\t\t\tgoto restart;  /* line terminator will be handled on next round */\n\t\t} else\n#endif  /* DUK_USE_HTML_COMMENTS */\n\t\tif (DUK__L1() == DUK_ASC_MINUS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_DECREMENT);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_SUB_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_SUB);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_STAR:  /* '*' */\n#if defined(DUK_USE_ES7_EXP_OPERATOR)\n\t\tif (DUK__L1() == DUK_ASC_STAR && DUK__L2() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(3, DUK_TOK_EXP_EQ);\n\t\t} else if (DUK__L1() == DUK_ASC_STAR) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_EXP);\n\t\t} else\n#endif\n\t\tif (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_MUL_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_MUL);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_PERCENT:  /* '%' */\n\t\tif (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_MOD_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_MOD);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_AMP:  /* '&' */\n\t\tif (DUK__L1() == DUK_ASC_AMP) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_LAND);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_BAND_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_BAND);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_PIPE:  /* '|' */\n\t\tif (DUK__L1() == DUK_ASC_PIPE) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_LOR);\n\t\t} else if (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_BOR_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_BOR);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_CARET:  /* '^' */\n\t\tif (DUK__L1() == DUK_ASC_EQUALS) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_TOK_BXOR_EQ);\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_BXOR);\n\t\t}\n\t\tbreak;\n\tcase DUK_ASC_TILDE:  /* '~' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_BNOT);\n\t\tbreak;\n\tcase DUK_ASC_QUESTION:  /* '?' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_QUESTION);\n\t\tbreak;\n\tcase DUK_ASC_COLON:  /* ':' */\n\t\tadvtok = DUK__ADVTOK(1, DUK_TOK_COLON);\n\t\tbreak;\n\tcase DUK_ASC_DOUBLEQUOTE:    /* '\"' */\n\tcase DUK_ASC_SINGLEQUOTE: {  /* '\\'' */\n\t\tDUK__INITBUFFER(lex_ctx);\n\t\tduk__lexer_parse_string_literal(lex_ctx, out_token, x /*quote*/, strict_mode);\n\t\tduk__internbuffer(lex_ctx, lex_ctx->slot1_idx);\n\t\tout_token->str1 = duk_known_hstring(lex_ctx->thr, lex_ctx->slot1_idx);\n\n\t\tDUK__INITBUFFER(lex_ctx);  /* free some memory */\n\n\t\tadvtok = DUK__ADVTOK(0, DUK_TOK_STRING);\n\t\tbreak;\n\t}\n\tdefault:\n\t\tgoto slow_path;\n\t}  /* switch */\n\n\tgoto skip_slow_path;\n\n slow_path:\n\tif (duk_unicode_is_line_terminator(x)) {\n\t\tif (x == 0x000d && DUK__L1() == 0x000a) {\n\t\t\t/*\n\t\t\t *  E5 Section 7.3: CR LF is detected as a single line terminator for\n\t\t\t *  line numbers.  Here we also detect it as a single line terminator\n\t\t\t *  token.\n\t\t\t */\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 2);\n\t\t} else {\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\t}\n\t\tgot_lineterm = 1;\n\t\tgoto restart_lineupdate;\n\t} else if (duk_unicode_is_identifier_start(x) || x == DUK_ASC_BACKSLASH) {\n\t\t/*\n\t\t *  Parse an identifier and then check whether it is:\n\t\t *    - reserved word (keyword or other reserved word)\n\t\t *    - \"null\"  (NullLiteral)\n\t\t *    - \"true\"  (BooleanLiteral)\n\t\t *    - \"false\" (BooleanLiteral)\n\t\t *    - anything else => identifier\n\t\t *\n\t\t *  This does not follow the E5 productions cleanly, but is\n\t\t *  useful and compact.\n\t\t *\n\t\t *  Note that identifiers may contain Unicode escapes,\n\t\t *  see E5 Sections 6 and 7.6.  They must be decoded first,\n\t\t *  and the result checked against allowed characters.\n\t\t *  The above if-clause accepts an identifier start and an\n\t\t *  '\\' character -- no other token can begin with a '\\'.\n\t\t *\n\t\t *  Note that \"get\" and \"set\" are not reserved words in E5\n\t\t *  specification so they are recognized as plain identifiers\n\t\t *  (the tokens DUK_TOK_GET and DUK_TOK_SET are actually not\n\t\t *  used now).  The compiler needs to work around this.\n\t\t *\n\t\t *  Strictly speaking, following Ecmascript longest match\n\t\t *  specification, an invalid escape for the first character\n\t\t *  should cause a syntax error.  However, an invalid escape\n\t\t *  for IdentifierParts should just terminate the identifier\n\t\t *  early (longest match), and let the next tokenization\n\t\t *  fail.  For instance Rhino croaks with 'foo\\z' when\n\t\t *  parsing the identifier.  This has little practical impact.\n\t\t */\n\n\t\tduk_small_uint_t i, i_end;\n\t\tduk_bool_t first = 1;\n\t\tduk_hstring *str;\n\n\t\tDUK__INITBUFFER(lex_ctx);\n\t\tfor (;;) {\n\t\t\t/* re-lookup first char on first loop */\n\t\t\tif (DUK__L0() == DUK_ASC_BACKSLASH) {\n\t\t\t\tduk_codepoint_t esc_cp;\n\t\t\t\tif (DUK__L1() != DUK_ASC_LC_U) {\n\t\t\t\t\tgoto fail_escape;\n\t\t\t\t}\n\t\t\t\tesc_cp = duk__lexer_parse_escape(lex_ctx, 1 /*allow_es6*/);\n\t\t\t\tDUK__APPENDBUFFER(lex_ctx, esc_cp);\n\n\t\t\t\t/* IdentifierStart is stricter than IdentifierPart, so if the first\n\t\t\t\t * character is escaped, must have a stricter check here.\n\t\t\t\t */\n\t\t\t\tif (!(first ? duk_unicode_is_identifier_start(esc_cp) : duk_unicode_is_identifier_part(esc_cp))) {\n\t\t\t\t\tgoto fail_escape;\n\t\t\t\t}\n\n\t\t\t\t/* Track number of escapes: necessary for proper keyword\n\t\t\t\t * detection.\n\t\t\t\t */\n\t\t\t\tout_token->num_escapes++;\n\t\t\t} else {\n\t\t\t\t/* Note: first character is checked against this.  But because\n\t\t\t\t * IdentifierPart includes all IdentifierStart characters, and\n\t\t\t\t * the first character (if unescaped) has already been checked\n\t\t\t\t * in the if condition, this is OK.\n\t\t\t\t */\n\t\t\t\tif (!duk_unicode_is_identifier_part(DUK__L0())) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tDUK__APPENDBUFFER(lex_ctx, DUK__L0());\n\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\t\t}\n\t\t\tfirst = 0;\n\t\t}\n\n\t\tout_token->str1 = duk__internbuffer(lex_ctx, lex_ctx->slot1_idx);\n\t\tstr = out_token->str1;\n\t\tout_token->t_nores = DUK_TOK_IDENTIFIER;\n\n\t\tDUK__INITBUFFER(lex_ctx);  /* free some memory */\n\n\t\t/*\n\t\t *  Interned identifier is compared against reserved words, which are\n\t\t *  currently interned into the heap context.  See genbuiltins.py.\n\t\t *\n\t\t *  Note that an escape in the identifier disables recognition of\n\t\t *  keywords; e.g. \"\\u0069f = 1;\" is a valid statement (assigns to\n\t\t *  identifier named \"if\").  This is not necessarily compliant,\n\t\t *  see test-dec-escaped-char-in-keyword.js.\n\t\t *\n\t\t *  Note: \"get\" and \"set\" are awkward.  They are not officially\n\t\t *  ReservedWords (and indeed e.g. \"var set = 1;\" is valid), and\n\t\t *  must come out as DUK_TOK_IDENTIFIER.  The compiler needs to\n\t\t *  work around this a bit.\n\t\t */\n\n\t\t/* XXX: optimize by adding the token numbers directly into the\n\t\t * always interned duk_hstring objects (there should be enough\n\t\t * flag bits free for that)?\n\t\t */\n\n\t\ti_end = (strict_mode ? DUK_STRIDX_END_RESERVED : DUK_STRIDX_START_STRICT_RESERVED);\n\n\t\tadvtok = DUK__ADVTOK(0, DUK_TOK_IDENTIFIER);\n\t\tif (out_token->num_escapes == 0) {\n\t\t\tfor (i = DUK_STRIDX_START_RESERVED; i < i_end; i++) {\n\t\t\t\tDUK_ASSERT_DISABLE(i >= 0);  /* unsigned */\n\t\t\t\tDUK_ASSERT(i < DUK_HEAP_NUM_STRINGS);\n\t\t\t\tif (DUK_HTHREAD_GET_STRING(lex_ctx->thr, i) == str) {\n\t\t\t\t\tadvtok = DUK__ADVTOK(0, DUK_STRIDX_TO_TOK(i));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (DUK__ISDIGIT(x) || (x == DUK_ASC_PERIOD)) {\n\t\t/* Note: decimal number may start with a period, but must be followed by a digit */\n\n\t\t/*\n\t\t *  Pre-parsing for decimal, hex, octal (both legacy and ES2015),\n\t\t *  and binary literals, followed by an actual parser step\n\t\t *  provided by numconv.\n\t\t *\n\t\t *  Note: the leading sign character ('+' or '-') is -not- part of\n\t\t *  the production in E5 grammar, and that the a DecimalLiteral\n\t\t *  starting with a '0' must be followed by a non-digit.\n\t\t *\n\t\t *  XXX: the two step parsing process is quite awkward, it would\n\t\t *  be more straightforward to allow numconv to parse the longest\n\t\t *  valid prefix (it already does that, it only needs to indicate\n\t\t *  where the input ended).  However, the lexer decodes characters\n\t\t *  using a limited lookup window, so this is not a trivial change.\n\t\t */\n\n\t\t/* XXX: because of the final check below (that the literal is not\n\t\t * followed by a digit), this could maybe be simplified, if we bail\n\t\t * out early from a leading zero (and if there are no periods etc).\n\t\t * Maybe too complex.\n\t\t */\n\n\t\tduk_double_t val;\n\t\tduk_bool_t legacy_oct = 0;\n\t\tduk_small_int_t state;  /* 0=before period/exp,\n\t\t                         * 1=after period, before exp\n\t\t                         * 2=after exp, allow '+' or '-'\n\t\t                         * 3=after exp and exp sign\n\t\t                         */\n\t\tduk_small_uint_t s2n_flags;\n\t\tduk_codepoint_t y, z;\n\t\tduk_small_int_t s2n_radix = 10;\n\t\tduk_small_uint_t pre_adv = 0;\n\n\t\tDUK__INITBUFFER(lex_ctx);\n\t\ty = DUK__L1();\n\n\t\tif (x == DUK_ASC_0) {\n\t\t\tz = DUK_LOWERCASE_CHAR_ASCII(y);\n\n\t\t\tpre_adv = 2;  /* default for 0xNNN, 0oNNN, 0bNNN. */\n\t\t\tif (z == DUK_ASC_LC_X) {\n\t\t\t\ts2n_radix = 16;\n\t\t\t} else if (z == DUK_ASC_LC_O) {\n\t\t\t\ts2n_radix = 8;\n\t\t\t} else if (z == DUK_ASC_LC_B) {\n\t\t\t\ts2n_radix = 2;\n\t\t\t} else {\n\t\t\t\tpre_adv = 0;\n\t\t\t\tif (DUK__ISDIGIT(y)) {\n\t\t\t\t\tif (strict_mode) {\n\t\t\t\t\t\t/* Reject octal like \\07 but also octal-lookalike\n\t\t\t\t\t\t * decimal like \\08 in strict mode.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tgoto fail_number_literal;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/* Legacy OctalIntegerLiteral or octal-lookalice\n\t\t\t\t\t\t * decimal.  Deciding between the two happens below\n\t\t\t\t\t\t * in digit scanning.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tDUK__APPENDBUFFER(lex_ctx, x);\n\t\t\t\t\t\tpre_adv = 1;\n\t\t\t\t\t\tlegacy_oct = 1;\n\t\t\t\t\t\ts2n_radix = 8;  /* tentative unless conflicting digits found */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tDUK__ADVANCECHARS(lex_ctx, pre_adv);\n\n\t\t/* XXX: we could parse integers here directly, and fall back\n\t\t * to numconv only when encountering a fractional expression\n\t\t * or when an octal literal turned out to be decimal (0778 etc).\n\t\t */\n\t\tstate = 0;\n\t\tfor (;;) {\n\t\t\tx = DUK__L0();  /* re-lookup curr char on first round */\n\t\t\tif (DUK__ISDIGIT(x)) {\n\t\t\t\t/* Note: intentionally allow leading zeroes here, as the\n\t\t\t\t * actual parser will check for them.\n\t\t\t\t */\n\t\t\t\tif (state == 0 && legacy_oct && (x == DUK_ASC_8 || x == DUK_ASC_9)) {\n\t\t\t\t\t/* Started out as an octal-lookalike\n\t\t\t\t\t * but interpreted as decimal, e.g.\n\t\t\t\t\t * '0779' -> 779.  This also means\n\t\t\t\t\t * that fractions are allowed, e.g.\n\t\t\t\t\t * '0779.123' is allowed but '0777.123'\n\t\t\t\t\t * is not!\n\t\t\t\t\t */\n\t\t\t\t\ts2n_radix = 10;\n\t\t\t\t}\n\t\t\t\tif (state == 2) {\n\t\t\t\t\tstate = 3;\n\t\t\t\t}\n\t\t\t} else if (s2n_radix == 16 && DUK__ISHEXDIGIT(x)) {\n\t\t\t\t/* Note: 'e' and 'E' are also accepted here. */\n\t\t\t\t;\n\t\t\t} else if (x == DUK_ASC_PERIOD) {\n\t\t\t\tif (state >= 1 || s2n_radix != 10) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tstate = 1;\n\t\t\t\t}\n\t\t\t} else if (x == DUK_ASC_LC_E || x == DUK_ASC_UC_E) {\n\t\t\t\tif (state >= 2 || s2n_radix != 10) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tstate = 2;\n\t\t\t\t}\n\t\t\t} else if (x == DUK_ASC_MINUS || x == DUK_ASC_PLUS) {\n\t\t\t\tif (state != 2) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tstate = 3;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDUK__APPENDBUFFER(lex_ctx, x);\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\t}\n\n\t\t/* XXX: better coercion */\n\t\t(void) duk__internbuffer(lex_ctx, lex_ctx->slot1_idx);\n\n\t\tif (s2n_radix != 10) {\n\t\t\t/* For bases other than 10, integer only. */\n\t\t\ts2n_flags = DUK_S2N_FLAG_ALLOW_LEADING_ZERO;\n\t\t} else {\n\t\t\ts2n_flags = DUK_S2N_FLAG_ALLOW_EXP |\n\t\t\t            DUK_S2N_FLAG_ALLOW_FRAC |\n\t\t\t            DUK_S2N_FLAG_ALLOW_NAKED_FRAC |\n\t\t\t            DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |\n\t\t\t            DUK_S2N_FLAG_ALLOW_LEADING_ZERO;\n\t\t}\n\n\t\tduk_dup(lex_ctx->thr, lex_ctx->slot1_idx);\n\t\tduk_numconv_parse(lex_ctx->thr, s2n_radix, s2n_flags);\n\t\tval = duk_to_number_m1(lex_ctx->thr);\n\t\tif (DUK_ISNAN(val)) {\n\t\t\tgoto fail_number_literal;\n\t\t}\n\t\tduk_replace(lex_ctx->thr, lex_ctx->slot1_idx);  /* could also just pop? */\n\n\t\tDUK__INITBUFFER(lex_ctx);  /* free some memory */\n\n\t\t/* Section 7.8.3 (note): NumericLiteral must be followed by something other than\n\t\t * IdentifierStart or DecimalDigit.\n\t\t */\n\n\t\tif (DUK__ISDIGIT(DUK__L0()) || duk_unicode_is_identifier_start(DUK__L0())) {\n\t\t\tgoto fail_number_literal;\n\t\t}\n\n\t\tout_token->num = val;\n\t\tadvtok = DUK__ADVTOK(0, DUK_TOK_NUMBER);\n\t} else if (duk_unicode_is_whitespace(DUK__LOOKUP(lex_ctx, 0))) {\n\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\tgoto restart;\n\t} else if (x < 0) {\n\t\tadvtok = DUK__ADVTOK(0, DUK_TOK_EOF);\n\t} else {\n\t\tgoto fail_token;\n\t}\n skip_slow_path:\n\n\t/*\n\t *  Shared exit path\n\t */\n\n\tDUK__ADVANCEBYTES(lex_ctx, advtok >> 8);\n\tout_token->t = advtok & 0xff;\n\tif (out_token->t_nores == DUK_TOK_INVALID) {\n\t\tout_token->t_nores = out_token->t;\n\t}\n\tout_token->lineterm = got_lineterm;\n\n\t/* Automatic semicolon insertion is allowed if a token is preceded\n\t * by line terminator(s), or terminates a statement list (right curly\n\t * or EOF).\n\t */\n\tif (got_lineterm || out_token->t == DUK_TOK_RCURLY || out_token->t == DUK_TOK_EOF) {\n\t\tout_token->allow_auto_semi = 1;\n\t} else {\n\t\tout_token->allow_auto_semi = 0;\n\t}\n\n\treturn;\n\n fail_token_limit:\n\tDUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT);\n\treturn;\n\n fail_token:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_TOKEN);\n\treturn;\n\n fail_number_literal:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_NUMBER_LITERAL);\n\treturn;\n\n fail_escape:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_ESCAPE);\n\treturn;\n\n fail_unterm_regexp:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_REGEXP);\n\treturn;\n\n fail_unterm_comment:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_COMMENT);\n\treturn;\n\n#if !defined(DUK_USE_REGEXP_SUPPORT)\n fail_regexp_support:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_REGEXP_SUPPORT_DISABLED);\n\treturn;\n#endif\n}\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\n/*\n *  Parse a RegExp token.  The grammar is described in E5 Section 15.10.\n *  Terminal constructions (such as quantifiers) are parsed directly here.\n *\n *  0xffffffffU is used as a marker for \"infinity\" in quantifiers.  Further,\n *  DUK__MAX_RE_QUANT_DIGITS limits the maximum number of digits that\n *  will be accepted for a quantifier.\n */\n\nDUK_INTERNAL void duk_lexer_parse_re_token(duk_lexer_ctx *lex_ctx, duk_re_token *out_token) {\n\tduk_small_uint_t advtok = 0;  /* init is unnecessary but suppresses \"may be used uninitialized\" warnings */\n\tduk_codepoint_t x, y;\n\n\tif (++lex_ctx->token_count >= lex_ctx->token_limit) {\n\t\tgoto fail_token_limit;\n\t}\n\n\tDUK_MEMZERO(out_token, sizeof(*out_token));\n\n\tx = DUK__L0();\n\ty = DUK__L1();\n\n\tDUK_DDD(DUK_DDDPRINT(\"parsing regexp token, L0=%ld, L1=%ld\", (long) x, (long) y));\n\n\tswitch (x) {\n\tcase DUK_ASC_PIPE: {\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_DISJUNCTION);\n\t\tbreak;\n\t}\n\tcase DUK_ASC_CARET: {\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_START);\n\t\tbreak;\n\t}\n\tcase DUK_ASC_DOLLAR: {\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ASSERT_END);\n\t\tbreak;\n\t}\n\tcase DUK_ASC_QUESTION: {\n\t\tout_token->qmin = 0;\n\t\tout_token->qmax = 1;\n\t\tif (y == DUK_ASC_QUESTION) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER);\n\t\t\tout_token->greedy = 0;\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER);\n\t\t\tout_token->greedy = 1;\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_ASC_STAR: {\n\t\tout_token->qmin = 0;\n\t\tout_token->qmax = DUK_RE_QUANTIFIER_INFINITE;\n\t\tif (y == DUK_ASC_QUESTION) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER);\n\t\t\tout_token->greedy = 0;\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER);\n\t\t\tout_token->greedy = 1;\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_ASC_PLUS: {\n\t\tout_token->qmin = 1;\n\t\tout_token->qmax = DUK_RE_QUANTIFIER_INFINITE;\n\t\tif (y == DUK_ASC_QUESTION) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_QUANTIFIER);\n\t\t\tout_token->greedy = 0;\n\t\t} else {\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_QUANTIFIER);\n\t\t\tout_token->greedy = 1;\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_ASC_LCURLY: {\n\t\t/* Production allows 'DecimalDigits', including leading zeroes */\n\t\tduk_uint32_t val1 = 0;\n\t\tduk_uint32_t val2 = DUK_RE_QUANTIFIER_INFINITE;\n\t\tduk_small_int_t digits = 0;\n#if defined(DUK_USE_ES6_REGEXP_SYNTAX)\n\t\tduk_lexer_point lex_pt;\n#endif\n\n#if defined(DUK_USE_ES6_REGEXP_SYNTAX)\n\t\t/* Store lexer position, restoring if quantifier is invalid. */\n\t\tDUK_LEXER_GETPOINT(lex_ctx, &lex_pt);\n#endif\n\n\t\tfor (;;) {\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);  /* eat '{' on entry */\n\t\t\tx = DUK__L0();\n\t\t\tif (DUK__ISDIGIT(x)) {\n\t\t\t\tdigits++;\n\t\t\t\tval1 = val1 * 10 + (duk_uint32_t) duk__hexval(x);\n\t\t\t} else if (x == DUK_ASC_COMMA) {\n\t\t\t\tif (digits > DUK__MAX_RE_QUANT_DIGITS) {\n\t\t\t\t\tgoto invalid_quantifier;\n\t\t\t\t}\n\t\t\t\tif (val2 != DUK_RE_QUANTIFIER_INFINITE) {\n\t\t\t\t\tgoto invalid_quantifier;\n\t\t\t\t}\n\t\t\t\tif (DUK__L1() == DUK_ASC_RCURLY) {\n\t\t\t\t\t/* form: { DecimalDigits , }, val1 = min count */\n\t\t\t\t\tif (digits == 0) {\n\t\t\t\t\t\tgoto invalid_quantifier;\n\t\t\t\t\t}\n\t\t\t\t\tout_token->qmin = val1;\n\t\t\t\t\tout_token->qmax = DUK_RE_QUANTIFIER_INFINITE;\n\t\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tval2 = val1;\n\t\t\t\tval1 = 0;\n\t\t\t\tdigits = 0;  /* not strictly necessary because of lookahead '}' above */\n\t\t\t} else if (x == DUK_ASC_RCURLY) {\n\t\t\t\tif (digits > DUK__MAX_RE_QUANT_DIGITS) {\n\t\t\t\t\tgoto invalid_quantifier;\n\t\t\t\t}\n\t\t\t\tif (digits == 0) {\n\t\t\t\t\tgoto invalid_quantifier;\n\t\t\t\t}\n\t\t\t\tif (val2 != DUK_RE_QUANTIFIER_INFINITE) {\n\t\t\t\t\t/* val2 = min count, val1 = max count */\n\t\t\t\t\tout_token->qmin = val2;\n\t\t\t\t\tout_token->qmax = val1;\n\t\t\t\t} else {\n\t\t\t\t\t/* val1 = count */\n\t\t\t\t\tout_token->qmin = val1;\n\t\t\t\t\tout_token->qmax = val1;\n\t\t\t\t}\n\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tgoto invalid_quantifier;\n\t\t\t}\n\t\t}\n\t\tif (DUK__L0() == DUK_ASC_QUESTION) {\n\t\t\tout_token->greedy = 0;\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);\n\t\t} else {\n\t\t\tout_token->greedy = 1;\n\t\t}\n\t\tadvtok = DUK__ADVTOK(0, DUK_RETOK_QUANTIFIER);\n\t\tbreak;\n invalid_quantifier:\n#if defined(DUK_USE_ES6_REGEXP_SYNTAX)\n\t\t/* Failed to match the quantifier, restore lexer and parse\n\t\t * opening brace as a literal.\n\t\t */\n\t\tDUK_LEXER_SETPOINT(lex_ctx, &lex_pt);\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR);\n\t\tout_token->num = DUK_ASC_LCURLY;\n#else\n\t\tgoto fail_quantifier;\n#endif\n\t\tbreak;\n\t}\n\tcase DUK_ASC_PERIOD: {\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_PERIOD);\n\t\tbreak;\n\t}\n\tcase DUK_ASC_BACKSLASH: {\n\t\t/* The E5.1 specification does not seem to allow IdentifierPart characters\n\t\t * to be used as identity escapes.  Unfortunately this includes '$', which\n\t\t * cannot be escaped as '\\$'; it needs to be escaped e.g. as '\\u0024'.\n\t\t * Many other implementations (including V8 and Rhino, for instance) do\n\t\t * accept '\\$' as a valid identity escape, which is quite pragmatic, and\n\t\t * ES2015 Annex B relaxes the rules to allow these (and other) real world forms.\n\t\t */\n\n\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR);  /* default: char escape (two chars) */\n\t\tif (y == DUK_ASC_LC_B) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_WORD_BOUNDARY);\n\t\t} else if (y == DUK_ASC_UC_B) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY);\n\t\t} else if (y == DUK_ASC_LC_F) {\n\t\t\tout_token->num = 0x000c;\n\t\t} else if (y == DUK_ASC_LC_N) {\n\t\t\tout_token->num = 0x000a;\n\t\t} else if (y == DUK_ASC_LC_T) {\n\t\t\tout_token->num = 0x0009;\n\t\t} else if (y == DUK_ASC_LC_R) {\n\t\t\tout_token->num = 0x000d;\n\t\t} else if (y == DUK_ASC_LC_V) {\n\t\t\tout_token->num = 0x000b;\n\t\t} else if (y == DUK_ASC_LC_C) {\n\t\t\tx = DUK__L2();\n\t\t\tif ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) ||\n\t\t\t    (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) {\n\t\t\t\tout_token->num = (duk_uint32_t) (x % 32);\n\t\t\t\tadvtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_CHAR);\n\t\t\t} else {\n\t\t\t\tgoto fail_escape;\n\t\t\t}\n\t\t} else if (y == DUK_ASC_LC_X || y == DUK_ASC_LC_U) {\n\t\t\t/* The token value is the Unicode codepoint without\n\t\t\t * it being decode into surrogate pair characters\n\t\t\t * here.  The \\u{H+} is only allowed in Unicode mode\n\t\t\t * which we don't support yet.\n\t\t\t */\n\t\t\tout_token->num = (duk_uint32_t) duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/);\n\t\t\tadvtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_CHAR);\n\t\t} else if (y == DUK_ASC_LC_D) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_DIGIT);\n\t\t} else if (y == DUK_ASC_UC_D) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_DIGIT);\n\t\t} else if (y == DUK_ASC_LC_S) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WHITE);\n\t\t} else if (y == DUK_ASC_UC_S) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WHITE);\n\t\t} else if (y == DUK_ASC_LC_W) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_WORD_CHAR);\n\t\t} else if (y == DUK_ASC_UC_W) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_NOT_WORD_CHAR);\n\t\t} else if (DUK__ISDIGIT(y)) {\n\t\t\t/* E5 Section 15.10.2.11 */\n\t\t\tif (y == DUK_ASC_0) {\n\t\t\t\tif (DUK__ISDIGIT(DUK__L2())) {\n\t\t\t\t\tgoto fail_escape;\n\t\t\t\t}\n\t\t\t\tout_token->num = 0x0000;\n\t\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_CHAR);\n\t\t\t} else {\n\t\t\t\t/* XXX: shared parsing? */\n\t\t\t\tduk_uint32_t val = 0;\n\t\t\t\tduk_small_int_t i;\n\t\t\t\tfor (i = 0; ; i++) {\n\t\t\t\t\tif (i >= DUK__MAX_RE_DECESC_DIGITS) {\n\t\t\t\t\t\tgoto fail_escape;\n\t\t\t\t\t}\n\t\t\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);  /* eat backslash on entry */\n\t\t\t\t\tx = DUK__L0();\n\t\t\t\t\tif (!DUK__ISDIGIT(x)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tval = val * 10 + (duk_uint32_t) duk__hexval(x);\n\t\t\t\t}\n\t\t\t\t/* DUK__L0() cannot be a digit, because the loop doesn't terminate if it is */\n\t\t\t\tadvtok = DUK__ADVTOK(0, DUK_RETOK_ATOM_BACKREFERENCE);\n\t\t\t\tout_token->num = val;\n\t\t\t}\n#if defined(DUK_USE_ES6_REGEXP_SYNTAX)\n\t\t} else if (y >= 0) {\n\t\t\t/* For ES2015 Annex B, accept any source character as identity\n\t\t\t * escape except 'c' which is used for control characters.\n\t\t\t * http://www.ecma-international.org/ecma-262/6.0/#sec-regular-expressions-patterns\n\t\t\t * Careful not to match end-of-buffer (<0) here.\n\t\t\t * This is not yet full ES2015 Annex B because cases above\n\t\t\t * (like hex escape) won't backtrack.\n\t\t\t */\n\t\t\tDUK_ASSERT(y != DUK_ASC_LC_C);  /* covered above */\n#else  /* DUK_USE_ES6_REGEXP_SYNTAX */\n\t\t} else if ((y >= 0 && !duk_unicode_is_identifier_part(y)) ||\n\t\t           y == DUK_UNICODE_CP_ZWNJ ||\n\t\t           y == DUK_UNICODE_CP_ZWJ) {\n\t\t\t/* For ES5.1 identity escapes are not allowed for identifier\n\t\t\t * parts.  This conflicts with a lot of real world code as this\n\t\t\t * doesn't e.g. allow escaping a dollar sign as /\\$/, see\n\t\t\t * test-regexp-identity-escape-dollar.js.\n\t\t\t */\n#endif  /* DUK_USE_ES6_REGEXP_SYNTAX */\n\t\t\tout_token->num = (duk_uint32_t) y;\n\t\t} else {\n\t\t\tgoto fail_escape;\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_ASC_LPAREN: {\n\t\t/* XXX: naming is inconsistent: ATOM_END_GROUP ends an ASSERT_START_LOOKAHEAD */\n\n\t\tif (y == DUK_ASC_QUESTION) {\n\t\t\tif (DUK__L2() == DUK_ASC_EQUALS) {\n\t\t\t\t/* (?= */\n\t\t\t\tadvtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_POS_LOOKAHEAD);\n\t\t\t} else if (DUK__L2() == DUK_ASC_EXCLAMATION) {\n\t\t\t\t/* (?! */\n\t\t\t\tadvtok = DUK__ADVTOK(3, DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD);\n\t\t\t} else if (DUK__L2() == DUK_ASC_COLON) {\n\t\t\t\t/* (?: */\n\t\t\t\tadvtok = DUK__ADVTOK(3, DUK_RETOK_ATOM_START_NONCAPTURE_GROUP);\n\t\t\t} else {\n\t\t\t\tgoto fail_group;\n\t\t\t}\n\t\t} else {\n\t\t\t/* ( */\n\t\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CAPTURE_GROUP);\n\t\t}\n\t\tbreak;\n\t}\n\tcase DUK_ASC_RPAREN: {\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_END_GROUP);\n\t\tbreak;\n\t}\n\tcase DUK_ASC_LBRACKET: {\n\t\t/*\n\t\t *  To avoid creating a heavy intermediate value for the list of ranges,\n\t\t *  only the start token ('[' or '[^') is parsed here.  The regexp\n\t\t *  compiler parses the ranges itself.\n\t\t */\n\n\t\t/* XXX: with DUK_USE_ES6_REGEXP_SYNTAX we should allow left bracket\n\t\t * literal too, but it's not easy to parse without backtracking.\n\t\t */\n\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_START_CHARCLASS);\n\t\tif (y == DUK_ASC_CARET) {\n\t\t\tadvtok = DUK__ADVTOK(2, DUK_RETOK_ATOM_START_CHARCLASS_INVERTED);\n\t\t}\n\t\tbreak;\n\t}\n#if !defined(DUK_USE_ES6_REGEXP_SYNTAX)\n\tcase DUK_ASC_RCURLY:\n\tcase DUK_ASC_RBRACKET: {\n\t\t/* Although these could be parsed as PatternCharacters unambiguously (here),\n\t\t * E5 Section 15.10.1 grammar explicitly forbids these as PatternCharacters.\n\t\t */\n\t\tgoto fail_invalid_char;\n\t\tbreak;\n\t}\n#endif\n\tcase -1: {\n\t\t/* EOF */\n\t\tadvtok = DUK__ADVTOK(0, DUK_TOK_EOF);\n\t\tbreak;\n\t}\n\tdefault: {\n\t\t/* PatternCharacter, all excluded characters are matched by cases above */\n\t\tadvtok = DUK__ADVTOK(1, DUK_RETOK_ATOM_CHAR);\n\t\tout_token->num = (duk_uint32_t) x;\n\t\tbreak;\n\t}\n\t}\n\n\t/*\n\t *  Shared exit path\n\t */\n\n\tDUK__ADVANCEBYTES(lex_ctx, advtok >> 8);\n\tout_token->t = advtok & 0xff;\n\treturn;\n\n fail_token_limit:\n\tDUK_ERROR_RANGE(lex_ctx->thr, DUK_STR_TOKEN_LIMIT);\n\treturn;\n\n fail_escape:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE);\n\treturn;\n\n fail_group:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_GROUP);\n\treturn;\n\n#if !defined(DUK_USE_ES6_REGEXP_SYNTAX)\n fail_invalid_char:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_CHARACTER);\n\treturn;\n\n fail_quantifier:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_QUANTIFIER);\n\treturn;\n#endif\n}\n\n/*\n *  Special parser for character classes; calls callback for every\n *  range parsed and returns the number of ranges present.\n */\n\n/* XXX: this duplicates functionality in duk_regexp.c where a similar loop is\n * required anyway.  We could use that BUT we need to update the regexp compiler\n * 'nranges' too.  Work this out a bit more cleanly to save space.\n */\n\n/* XXX: the handling of character range detection is a bit convoluted.\n * Try to simplify and make smaller.\n */\n\n/* XXX: logic for handling character ranges is now incorrect, it will accept\n * e.g. [\\d-z] whereas it should croak from it?  SMJS accepts this too, though.\n *\n * Needs a read through and a lot of additional tests.\n */\n\nDUK_LOCAL\nvoid duk__emit_u16_direct_ranges(duk_lexer_ctx *lex_ctx,\n                                 duk_re_range_callback gen_range,\n                                 void *userdata,\n                                 const duk_uint16_t *ranges,\n                                 duk_small_int_t num) {\n\tconst duk_uint16_t *ranges_end;\n\n\tDUK_UNREF(lex_ctx);\n\n\tranges_end = ranges + num;\n\twhile (ranges < ranges_end) {\n\t\t/* mark range 'direct', bypass canonicalization (see Wiki) */\n\t\tgen_range(userdata, (duk_codepoint_t) ranges[0], (duk_codepoint_t) ranges[1], 1);\n\t\tranges += 2;\n\t}\n}\n\nDUK_INTERNAL void duk_lexer_parse_re_ranges(duk_lexer_ctx *lex_ctx, duk_re_range_callback gen_range, void *userdata) {\n\tduk_codepoint_t start = -1;\n\tduk_codepoint_t ch;\n\tduk_codepoint_t x;\n\tduk_bool_t dash = 0;\n\tduk_small_uint_t adv = 0;\n\n\tDUK_DD(DUK_DDPRINT(\"parsing regexp ranges\"));\n\n\tfor (;;) {\n\t\tDUK__ADVANCECHARS(lex_ctx, adv);\n\t\tadv = 1;\n\n\t\tx = DUK__L0();\n\n\t\tch = -1;  /* not strictly necessary, but avoids \"uninitialized variable\" warnings */\n\t\tDUK_UNREF(ch);\n\n\t\tif (x < 0) {\n\t\t\tgoto fail_unterm_charclass;\n\t\t} else if (x == DUK_ASC_RBRACKET) {\n\t\t\tif (start >= 0) {\n\t\t\t\tgen_range(userdata, start, start, 0);\n\t\t\t}\n\t\t\tDUK__ADVANCECHARS(lex_ctx, 1);  /* eat ']' before finishing */\n\t\t\tbreak;\n\t\t} else if (x == DUK_ASC_MINUS) {\n\t\t\tif (start >= 0 && !dash && DUK__L1() != DUK_ASC_RBRACKET) {\n\t\t\t\t/* '-' as a range indicator */\n\t\t\t\tdash = 1;\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\t/* '-' verbatim */\n\t\t\t\tch = x;\n\t\t\t}\n\t\t} else if (x == DUK_ASC_BACKSLASH) {\n\t\t\t/*\n\t\t\t *  The escapes are same as outside a character class, except that \\b has a\n\t\t\t *  different meaning, and \\B and backreferences are prohibited (see E5\n\t\t\t *  Section 15.10.2.19).  However, it's difficult to share code because we\n\t\t\t *  handle e.g. \"\\n\" very differently: here we generate a single character\n\t\t\t *  range for it.\n\t\t\t */\n\n\t\t\t/* XXX: ES2015 surrogate pair handling. */\n\n\t\t\tx = DUK__L1();\n\n\t\t\tadv = 2;\n\n\t\t\tif (x == DUK_ASC_LC_B) {\n\t\t\t\t/* Note: '\\b' in char class is different than outside (assertion),\n\t\t\t\t * '\\B' is not allowed and is caught by the duk_unicode_is_identifier_part()\n\t\t\t\t * check below.\n\t\t\t\t */\n\t\t\t\tch = 0x0008;\n\t\t\t} else if (x == DUK_ASC_LC_F) {\n\t\t\t\tch = 0x000c;\n\t\t\t} else if (x == DUK_ASC_LC_N) {\n\t\t\t\tch = 0x000a;\n\t\t\t} else if (x == DUK_ASC_LC_T) {\n\t\t\t\tch = 0x0009;\n\t\t\t} else if (x == DUK_ASC_LC_R) {\n\t\t\t\tch = 0x000d;\n\t\t\t} else if (x == DUK_ASC_LC_V) {\n\t\t\t\tch = 0x000b;\n\t\t\t} else if (x == DUK_ASC_LC_C) {\n\t\t\t\tx = DUK__L2();\n\t\t\t\tadv = 3;\n\t\t\t\tif ((x >= DUK_ASC_LC_A && x <= DUK_ASC_LC_Z) ||\n\t\t\t\t    (x >= DUK_ASC_UC_A && x <= DUK_ASC_UC_Z)) {\n\t\t\t\t\tch = (x % 32);\n\t\t\t\t} else {\n\t\t\t\t\tgoto fail_escape;\n\t\t\t\t}\n\t\t\t} else if (x == DUK_ASC_LC_X || x == DUK_ASC_LC_U) {\n\t\t\t\t/* The \\u{H+} form is only allowed in Unicode mode which\n\t\t\t\t * we don't support yet.\n\t\t\t\t */\n\t\t\t\tch = duk__lexer_parse_escape(lex_ctx, 0 /*allow_es6*/);\n\t\t\t\tadv = 0;\n\t\t\t} else if (x == DUK_ASC_LC_D) {\n\t\t\t\tduk__emit_u16_direct_ranges(lex_ctx,\n\t\t\t\t                            gen_range,\n\t\t\t\t                            userdata,\n\t\t\t\t                            duk_unicode_re_ranges_digit,\n\t\t\t\t                            sizeof(duk_unicode_re_ranges_digit) / sizeof(duk_uint16_t));\n\t\t\t\tch = -1;\n\t\t\t} else if (x == DUK_ASC_UC_D) {\n\t\t\t\tduk__emit_u16_direct_ranges(lex_ctx,\n\t\t\t\t                            gen_range,\n\t\t\t\t                            userdata,\n\t\t\t\t                            duk_unicode_re_ranges_not_digit,\n\t\t\t\t                            sizeof(duk_unicode_re_ranges_not_digit) / sizeof(duk_uint16_t));\n\t\t\t\tch = -1;\n\t\t\t} else if (x == DUK_ASC_LC_S) {\n\t\t\t\tduk__emit_u16_direct_ranges(lex_ctx,\n\t\t\t\t                            gen_range,\n\t\t\t\t                            userdata,\n\t\t\t\t                            duk_unicode_re_ranges_white,\n\t\t\t\t                            sizeof(duk_unicode_re_ranges_white) / sizeof(duk_uint16_t));\n\t\t\t\tch = -1;\n\t\t\t} else if (x == DUK_ASC_UC_S) {\n\t\t\t\tduk__emit_u16_direct_ranges(lex_ctx,\n\t\t\t\t                            gen_range,\n\t\t\t\t                            userdata,\n\t\t\t\t                            duk_unicode_re_ranges_not_white,\n\t\t\t\t                            sizeof(duk_unicode_re_ranges_not_white) / sizeof(duk_uint16_t));\n\t\t\t\tch = -1;\n\t\t\t} else if (x == DUK_ASC_LC_W) {\n\t\t\t\tduk__emit_u16_direct_ranges(lex_ctx,\n\t\t\t\t                            gen_range,\n\t\t\t\t                            userdata,\n\t\t\t\t                            duk_unicode_re_ranges_wordchar,\n\t\t\t\t                            sizeof(duk_unicode_re_ranges_wordchar) / sizeof(duk_uint16_t));\n\t\t\t\tch = -1;\n\t\t\t} else if (x == DUK_ASC_UC_W) {\n\t\t\t\tduk__emit_u16_direct_ranges(lex_ctx,\n\t\t\t\t                            gen_range,\n\t\t\t\t                            userdata,\n\t\t\t\t                            duk_unicode_re_ranges_not_wordchar,\n\t\t\t\t                            sizeof(duk_unicode_re_ranges_not_wordchar) / sizeof(duk_uint16_t));\n\t\t\t\tch = -1;\n\t\t\t} else if (DUK__ISDIGIT(x)) {\n\t\t\t\t/* DecimalEscape, only \\0 is allowed, no leading\n\t\t\t\t * zeroes are allowed.\n\t\t\t\t *\n\t\t\t\t * ES2015 Annex B also allows (maximal match) legacy\n\t\t\t\t * octal escapes up to \\377 and \\8 and \\9 are\n\t\t\t\t * accepted as literal '8' and '9', also in strict mode.\n\t\t\t\t */\n\n#if defined(DUK_USE_ES6_REGEXP_SYNTAX)\n\t\t\t\tch = duk__lexer_parse_legacy_octal(lex_ctx, &adv, 0 /*reject_annex_b*/);\n\t\t\t\tDUK_ASSERT(ch >= 0);  /* no rejections */\n#else\n\t\t\t\tif (x == DUK_ASC_0 && !DUK__ISDIGIT(DUK__L2())) {\n\t\t\t\t\tch = 0x0000;\n\t\t\t\t} else {\n\t\t\t\t\tgoto fail_escape;\n\t\t\t\t}\n#endif\n#if defined(DUK_USE_ES6_REGEXP_SYNTAX)\n\t\t\t} else if (x >= 0) {\n\t\t\t\t/* IdentityEscape: ES2015 Annex B allows almost all\n\t\t\t\t * source characters here.  Match anything except\n\t\t\t\t * EOF here.\n\t\t\t\t */\n\t\t\t\tch = x;\n#else  /* DUK_USE_ES6_REGEXP_SYNTAX */\n\t\t\t} else if (!duk_unicode_is_identifier_part(x)) {\n\t\t\t\t/* IdentityEscape: ES5.1 doesn't allow identity escape\n\t\t\t\t * for identifier part characters, which conflicts with\n\t\t\t\t * some real world code.  For example, it doesn't allow\n\t\t\t\t * /[\\$]/ which is awkward.\n\t\t\t\t */\n\t\t\t\tch = x;\n#endif  /* DUK_USE_ES6_REGEXP_SYNTAX */\n\t\t\t} else {\n\t\t\t\tgoto fail_escape;\n\t\t\t}\n\t\t} else {\n\t\t\t/* character represents itself */\n\t\t\tch = x;\n\t\t}\n\n\t\t/* ch is a literal character here or -1 if parsed entity was\n\t\t * an escape such as \"\\s\".\n\t\t */\n\n\t\tif (ch < 0) {\n\t\t\t/* multi-character sets not allowed as part of ranges, see\n\t\t\t * E5 Section 15.10.2.15, abstract operation CharacterRange.\n\t\t\t */\n\t\t\tif (start >= 0) {\n\t\t\t\tif (dash) {\n\t\t\t\t\tgoto fail_range;\n\t\t\t\t} else {\n\t\t\t\t\tgen_range(userdata, start, start, 0);\n\t\t\t\t\tstart = -1;\n\t\t\t\t\t/* dash is already 0 */\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (start >= 0) {\n\t\t\t\tif (dash) {\n\t\t\t\t\tif (start > ch) {\n\t\t\t\t\t\tgoto fail_range;\n\t\t\t\t\t}\n\t\t\t\t\tgen_range(userdata, start, ch, 0);\n\t\t\t\t\tstart = -1;\n\t\t\t\t\tdash = 0;\n\t\t\t\t} else {\n\t\t\t\t\tgen_range(userdata, start, start, 0);\n\t\t\t\t\tstart = ch;\n\t\t\t\t\t/* dash is already 0 */\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tstart = ch;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn;\n\n fail_escape:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_REGEXP_ESCAPE);\n\treturn;\n\n fail_range:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_INVALID_RANGE);\n\treturn;\n\n fail_unterm_charclass:\n\tDUK_ERROR_SYNTAX(lex_ctx->thr, DUK_STR_UNTERMINATED_CHARCLASS);\n\treturn;\n}\n\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\n/* automatic undefs */\n#undef DUK__ADVANCEBYTES\n#undef DUK__ADVANCECHARS\n#undef DUK__ADVTOK\n#undef DUK__APPENDBUFFER\n#undef DUK__APPENDBUFFER_ASCII\n#undef DUK__INITBUFFER\n#undef DUK__ISDIGIT\n#undef DUK__ISDIGIT03\n#undef DUK__ISDIGIT47\n#undef DUK__ISHEXDIGIT\n#undef DUK__ISOCTDIGIT\n#undef DUK__L0\n#undef DUK__L1\n#undef DUK__L2\n#undef DUK__L3\n#undef DUK__L4\n#undef DUK__L5\n#undef DUK__LOOKUP\n#undef DUK__MAX_RE_DECESC_DIGITS\n#undef DUK__MAX_RE_QUANT_DIGITS\n#line 1 \"duk_numconv.c\"\n/*\n *  Number-to-string and string-to-number conversions.\n *\n *  Slow path number-to-string and string-to-number conversion is based on\n *  a Dragon4 variant, with fast paths for small integers.  Big integer\n *  arithmetic is needed for guaranteeing that the conversion is correct\n *  and uses a minimum number of digits.  The big number arithmetic has a\n *  fixed maximum size and does not require dynamic allocations.\n *\n *  See: doc/number-conversion.rst.\n */\n\n/* #include duk_internal.h -> already included */\n\n#define DUK__IEEE_DOUBLE_EXP_BIAS  1023\n#define DUK__IEEE_DOUBLE_EXP_MIN   (-1022)   /* biased exp == 0 -> denormal, exp -1022 */\n\n#define DUK__DIGITCHAR(x)  duk_lc_digits[(x)]\n\n/*\n *  Tables generated with util/gennumdigits.py.\n *\n *  duk__str2num_digits_for_radix indicates, for each radix, how many input\n *  digits should be considered significant for string-to-number conversion.\n *  The input is also padded to this many digits to give the Dragon4\n *  conversion enough (apparent) precision to work with.\n *\n *  duk__str2num_exp_limits indicates, for each radix, the radix-specific\n *  minimum/maximum exponent values (for a Dragon4 integer mantissa)\n *  below and above which the number is guaranteed to underflow to zero\n *  or overflow to Infinity.  This allows parsing to keep bigint values\n *  bounded.\n */\n\nDUK_LOCAL const duk_uint8_t duk__str2num_digits_for_radix[] = {\n\t69, 44, 35, 30, 27, 25, 23, 22, 20, 20,    /* 2 to 11 */\n\t20, 19, 19, 18, 18, 17, 17, 17, 16, 16,    /* 12 to 21 */\n\t16, 16, 16, 15, 15, 15, 15, 15, 15, 14,    /* 22 to 31 */\n\t14, 14, 14, 14, 14                         /* 31 to 36 */\n};\n\ntypedef struct {\n\tduk_int16_t upper;\n\tduk_int16_t lower;\n} duk__exp_limits;\n\nDUK_LOCAL const duk__exp_limits duk__str2num_exp_limits[] = {\n\t{ 957, -1147 }, { 605, -725 },  { 479, -575 },  { 414, -496 },\n\t{ 372, -446 },  { 342, -411 },  { 321, -384 },  { 304, -364 },\n\t{ 291, -346 },  { 279, -334 },  { 268, -323 },  { 260, -312 },\n\t{ 252, -304 },  { 247, -296 },  { 240, -289 },  { 236, -283 },\n\t{ 231, -278 },  { 227, -273 },  { 223, -267 },  { 220, -263 },\n\t{ 216, -260 },  { 213, -256 },  { 210, -253 },  { 208, -249 },\n\t{ 205, -246 },  { 203, -244 },  { 201, -241 },  { 198, -239 },\n\t{ 196, -237 },  { 195, -234 },  { 193, -232 },  { 191, -230 },\n\t{ 190, -228 },  { 188, -226 },  { 187, -225 },\n};\n\n/*\n *  Limited functionality bigint implementation.\n *\n *  Restricted to non-negative numbers with less than 32 * DUK__BI_MAX_PARTS bits,\n *  with the caller responsible for ensuring this is never exceeded.  No memory\n *  allocation (except stack) is needed for bigint computation.  Operations\n *  have been tailored for number conversion needs.\n *\n *  Argument order is \"assignment order\", i.e. target first, then arguments:\n *  x <- y * z  -->  duk__bi_mul(x, y, z);\n */\n\n/* This upper value has been experimentally determined; debug build will check\n * bigint size with assertions.\n */\n#define DUK__BI_MAX_PARTS  37  /* 37x32 = 1184 bits */\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n#define DUK__BI_PRINT(name,x)  duk__bi_print((name),(x))\n#else\n#define DUK__BI_PRINT(name,x)\n#endif\n\n/* Current size is about 152 bytes. */\ntypedef struct {\n\tduk_small_int_t n;\n\tduk_uint32_t v[DUK__BI_MAX_PARTS];  /* low to high */\n} duk__bigint;\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\nDUK_LOCAL void duk__bi_print(const char *name, duk__bigint *x) {\n\t/* Overestimate required size; debug code so not critical to be tight. */\n\tchar buf[DUK__BI_MAX_PARTS * 9 + 64];\n\tchar *p = buf;\n\tduk_small_int_t i;\n\n\t/* No NUL term checks in this debug code. */\n\tp += DUK_SPRINTF(p, \"%p n=%ld\", (void *) x, (long) x->n);\n\tif (x->n == 0) {\n\t\tp += DUK_SPRINTF(p, \" 0\");\n\t}\n\tfor (i = x->n - 1; i >= 0; i--) {\n\t\tp += DUK_SPRINTF(p, \" %08lx\", (unsigned long) x->v[i]);\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"%s: %s\", (const char *) name, (const char *) buf));\n}\n#endif\n\n#if defined(DUK_USE_ASSERTIONS)\nDUK_LOCAL duk_small_int_t duk__bi_is_valid(duk__bigint *x) {\n\treturn (duk_small_int_t)\n\t       ( ((x->n >= 0) && (x->n <= DUK__BI_MAX_PARTS)) /* is valid size */ &&\n\t         ((x->n == 0) || (x->v[x->n - 1] != 0)) /* is normalized */ );\n}\n#endif\n\nDUK_LOCAL void duk__bi_normalize(duk__bigint *x) {\n\tduk_small_int_t i;\n\n\tfor (i = x->n - 1; i >= 0; i--) {\n\t\tif (x->v[i] != 0) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* Note: if 'x' is zero, x->n becomes 0 here */\n\tx->n = i + 1;\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n\n/* x <- y */\nDUK_LOCAL void duk__bi_copy(duk__bigint *x, duk__bigint *y) {\n\tduk_small_int_t n;\n\n\tn = y->n;\n\tx->n = n;\n\tif (n == 0) {\n\t\treturn;\n\t}\n\tDUK_MEMCPY((void *) x->v, (const void *) y->v, (size_t) (sizeof(duk_uint32_t) * (size_t) n));\n}\n\nDUK_LOCAL void duk__bi_set_small(duk__bigint *x, duk_uint32_t v) {\n\tif (v == 0U) {\n\t\tx->n = 0;\n\t} else {\n\t\tx->n = 1;\n\t\tx->v[0] = v;\n\t}\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n\n/* Return value: <0  <=>  x < y\n *                0  <=>  x == y\n *               >0  <=>  x > y\n */\nDUK_LOCAL int duk__bi_compare(duk__bigint *x, duk__bigint *y) {\n\tduk_small_int_t i, nx, ny;\n\tduk_uint32_t tx, ty;\n\n\tDUK_ASSERT(duk__bi_is_valid(x));\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\n\tnx = x->n;\n\tny = y->n;\n\tif (nx > ny) {\n\t\tgoto ret_gt;\n\t}\n\tif (nx < ny) {\n\t\tgoto ret_lt;\n\t}\n\tfor (i = nx - 1; i >= 0; i--) {\n\t\ttx = x->v[i];\n\t\tty = y->v[i];\n\n\t\tif (tx > ty) {\n\t\t\tgoto ret_gt;\n\t\t}\n\t\tif (tx < ty) {\n\t\t\tgoto ret_lt;\n\t\t}\n\t}\n\n\treturn 0;\n\n ret_gt:\n\treturn 1;\n\n ret_lt:\n\treturn -1;\n}\n\n/* x <- y + z */\n#if defined(DUK_USE_64BIT_OPS)\nDUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) {\n\tduk_uint64_t tmp;\n\tduk_small_int_t i, ny, nz;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\tDUK_ASSERT(duk__bi_is_valid(z));\n\n\tif (z->n > y->n) {\n\t\tduk__bigint *t;\n\t\tt = y; y = z; z = t;\n\t}\n\tDUK_ASSERT(y->n >= z->n);\n\n\tny = y->n; nz = z->n;\n\ttmp = 0U;\n\tfor (i = 0; i < ny; i++) {\n\t\tDUK_ASSERT(i < DUK__BI_MAX_PARTS);\n\t\ttmp += y->v[i];\n\t\tif (i < nz) {\n\t\t\ttmp += z->v[i];\n\t\t}\n\t\tx->v[i] = (duk_uint32_t) (tmp & 0xffffffffUL);\n\t\ttmp = tmp >> 32;\n\t}\n\tif (tmp != 0U) {\n\t\tDUK_ASSERT(i < DUK__BI_MAX_PARTS);\n\t\tx->v[i++] = (duk_uint32_t) tmp;\n\t}\n\tx->n = i;\n\tDUK_ASSERT(x->n <= DUK__BI_MAX_PARTS);\n\n\t/* no need to normalize */\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n#else  /* DUK_USE_64BIT_OPS */\nDUK_LOCAL void duk__bi_add(duk__bigint *x, duk__bigint *y, duk__bigint *z) {\n\tduk_uint32_t carry, tmp1, tmp2;\n\tduk_small_int_t i, ny, nz;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\tDUK_ASSERT(duk__bi_is_valid(z));\n\n\tif (z->n > y->n) {\n\t\tduk__bigint *t;\n\t\tt = y; y = z; z = t;\n\t}\n\tDUK_ASSERT(y->n >= z->n);\n\n\tny = y->n; nz = z->n;\n\tcarry = 0U;\n\tfor (i = 0; i < ny; i++) {\n\t\t/* Carry is detected based on wrapping which relies on exact 32-bit\n\t\t * types.\n\t\t */\n\t\tDUK_ASSERT(i < DUK__BI_MAX_PARTS);\n\t\ttmp1 = y->v[i];\n\t\ttmp2 = tmp1;\n\t\tif (i < nz) {\n\t\t\ttmp2 += z->v[i];\n\t\t}\n\n\t\t/* Careful with carry condition:\n\t\t *  - If carry not added: 0x12345678 + 0 + 0xffffffff = 0x12345677 (< 0x12345678)\n\t\t *  - If carry added:     0x12345678 + 1 + 0xffffffff = 0x12345678 (== 0x12345678)\n\t\t */\n\t\tif (carry) {\n\t\t\ttmp2++;\n\t\t\tcarry = (tmp2 <= tmp1 ? 1U : 0U);\n\t\t} else {\n\t\t\tcarry = (tmp2 < tmp1 ? 1U : 0U);\n\t\t}\n\n\t\tx->v[i] = tmp2;\n\t}\n\tif (carry) {\n\t\tDUK_ASSERT(i < DUK__BI_MAX_PARTS);\n\t\tDUK_ASSERT(carry == 1U);\n\t\tx->v[i++] = carry;\n\t}\n\tx->n = i;\n\tDUK_ASSERT(x->n <= DUK__BI_MAX_PARTS);\n\n\t/* no need to normalize */\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n#endif  /* DUK_USE_64BIT_OPS */\n\n/* x <- y + z */\nDUK_LOCAL void duk__bi_add_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) {\n\tduk__bigint tmp;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\n\t/* XXX: this could be optimized; there is only one call site now though */\n\tduk__bi_set_small(&tmp, z);\n\tduk__bi_add(x, y, &tmp);\n\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n\n#if 0  /* unused */\n/* x <- x + y, use t as temp */\nDUK_LOCAL void duk__bi_add_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) {\n\tduk__bi_add(t, x, y);\n\tduk__bi_copy(x, t);\n}\n#endif\n\n/* x <- y - z, require x >= y => z >= 0, i.e. y >= z */\n#if defined(DUK_USE_64BIT_OPS)\nDUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) {\n\tduk_small_int_t i, ny, nz;\n\tduk_uint32_t ty, tz;\n\tduk_int64_t tmp;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\tDUK_ASSERT(duk__bi_is_valid(z));\n\tDUK_ASSERT(duk__bi_compare(y, z) >= 0);\n\tDUK_ASSERT(y->n >= z->n);\n\n\tny = y->n; nz = z->n;\n\ttmp = 0;\n\tfor (i = 0; i < ny; i++) {\n\t\tty = y->v[i];\n\t\tif (i < nz) {\n\t\t\ttz = z->v[i];\n\t\t} else {\n\t\t\ttz = 0;\n\t\t}\n\t\ttmp = (duk_int64_t) ty - (duk_int64_t) tz + tmp;\n\t\tx->v[i] = (duk_uint32_t) ((duk_uint64_t) tmp & 0xffffffffUL);\n\t\ttmp = tmp >> 32;  /* 0 or -1 */\n\t}\n\tDUK_ASSERT(tmp == 0);\n\n\tx->n = i;\n\tduk__bi_normalize(x);  /* need to normalize, may even cancel to 0 */\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n#else\nDUK_LOCAL void duk__bi_sub(duk__bigint *x, duk__bigint *y, duk__bigint *z) {\n\tduk_small_int_t i, ny, nz;\n\tduk_uint32_t tmp1, tmp2, borrow;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\tDUK_ASSERT(duk__bi_is_valid(z));\n\tDUK_ASSERT(duk__bi_compare(y, z) >= 0);\n\tDUK_ASSERT(y->n >= z->n);\n\n\tny = y->n; nz = z->n;\n\tborrow = 0U;\n\tfor (i = 0; i < ny; i++) {\n\t\t/* Borrow is detected based on wrapping which relies on exact 32-bit\n\t\t * types.\n\t\t */\n\t\ttmp1 = y->v[i];\n\t\ttmp2 = tmp1;\n\t\tif (i < nz) {\n\t\t\ttmp2 -= z->v[i];\n\t\t}\n\n\t\t/* Careful with borrow condition:\n\t\t *  - If borrow not subtracted: 0x12345678 - 0 - 0xffffffff = 0x12345679 (> 0x12345678)\n\t\t *  - If borrow subtracted:     0x12345678 - 1 - 0xffffffff = 0x12345678 (== 0x12345678)\n\t\t */\n\t\tif (borrow) {\n\t\t\ttmp2--;\n\t\t\tborrow = (tmp2 >= tmp1 ? 1U : 0U);\n\t\t} else {\n\t\t\tborrow = (tmp2 > tmp1 ? 1U : 0U);\n\t\t}\n\n\t\tx->v[i] = tmp2;\n\t}\n\tDUK_ASSERT(borrow == 0U);\n\n\tx->n = i;\n\tduk__bi_normalize(x);  /* need to normalize, may even cancel to 0 */\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n#endif\n\n#if 0  /* unused */\n/* x <- y - z */\nDUK_LOCAL void duk__bi_sub_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) {\n\tduk__bigint tmp;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\n\t/* XXX: this could be optimized */\n\tduk__bi_set_small(&tmp, z);\n\tduk__bi_sub(x, y, &tmp);\n\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n#endif\n\n/* x <- x - y, use t as temp */\nDUK_LOCAL void duk__bi_sub_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) {\n\tduk__bi_sub(t, x, y);\n\tduk__bi_copy(x, t);\n}\n\n/* x <- y * z */\nDUK_LOCAL void duk__bi_mul(duk__bigint *x, duk__bigint *y, duk__bigint *z) {\n\tduk_small_int_t i, j, nx, nz;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\tDUK_ASSERT(duk__bi_is_valid(z));\n\n\tnx = y->n + z->n;  /* max possible */\n\tDUK_ASSERT(nx <= DUK__BI_MAX_PARTS);\n\n\tif (nx == 0) {\n\t\t/* Both inputs are zero; cases where only one is zero can go\n\t\t * through main algorithm.\n\t\t */\n\t\tx->n = 0;\n\t\treturn;\n\t}\n\n\tDUK_MEMZERO((void *) x->v, (size_t) (sizeof(duk_uint32_t) * (size_t) nx));\n\tx->n = nx;\n\n\tnz = z->n;\n\tfor (i = 0; i < y->n; i++) {\n#if defined(DUK_USE_64BIT_OPS)\n\t\tduk_uint64_t tmp = 0U;\n\t\tfor (j = 0; j < nz; j++) {\n\t\t\ttmp += (duk_uint64_t) y->v[i] * (duk_uint64_t) z->v[j] + x->v[i+j];\n\t\t\tx->v[i+j] = (duk_uint32_t) (tmp & 0xffffffffUL);\n\t\t\ttmp = tmp >> 32;\n\t\t}\n\t\tif (tmp > 0) {\n\t\t\tDUK_ASSERT(i + j < nx);\n\t\t\tDUK_ASSERT(i + j < DUK__BI_MAX_PARTS);\n\t\t\tDUK_ASSERT(x->v[i+j] == 0U);\n\t\t\tx->v[i+j] = (duk_uint32_t) tmp;\n\t\t}\n#else\n\t\t/*\n\t\t *  Multiply + add + carry for 32-bit components using only 16x16->32\n\t\t *  multiplies and carry detection based on unsigned overflow.\n\t\t *\n\t\t *    1st mult, 32-bit: (A*2^16 + B)\n\t\t *    2nd mult, 32-bit: (C*2^16 + D)\n\t\t *    3rd add, 32-bit: E\n\t\t *    4th add, 32-bit: F\n\t\t *\n\t\t *      (AC*2^16 + B) * (C*2^16 + D) + E + F\n\t\t *    = AC*2^32 + AD*2^16 + BC*2^16 + BD + E + F\n\t\t *    = AC*2^32 + (AD + BC)*2^16 + (BD + E + F)\n\t\t *    = AC*2^32 + AD*2^16 + BC*2^16 + (BD + E + F)\n\t\t */\n\t\tduk_uint32_t a, b, c, d, e, f;\n\t\tduk_uint32_t r, s, t;\n\n\t\ta = y->v[i]; b = a & 0xffffUL; a = a >> 16;\n\n\t\tf = 0;\n\t\tfor (j = 0; j < nz; j++) {\n\t\t\tc = z->v[j]; d = c & 0xffffUL; c = c >> 16;\n\t\t\te = x->v[i+j];\n\n\t\t\t/* build result as: (r << 32) + s: start with (BD + E + F) */\n\t\t\tr = 0;\n\t\t\ts = b * d;\n\n\t\t\t/* add E */\n\t\t\tt = s + e;\n\t\t\tif (t < s) { r++; }  /* carry */\n\t\t\ts = t;\n\n\t\t\t/* add F */\n\t\t\tt = s + f;\n\t\t\tif (t < s) { r++; }  /* carry */\n\t\t\ts = t;\n\n\t\t\t/* add BC*2^16 */\n\t\t\tt = b * c;\n\t\t\tr += (t >> 16);\n\t\t\tt = s + ((t & 0xffffUL) << 16);\n\t\t\tif (t < s) { r++; }  /* carry */\n\t\t\ts = t;\n\n\t\t\t/* add AD*2^16 */\n\t\t\tt = a * d;\n\t\t\tr += (t >> 16);\n\t\t\tt = s + ((t & 0xffffUL) << 16);\n\t\t\tif (t < s) { r++; }  /* carry */\n\t\t\ts = t;\n\n\t\t\t/* add AC*2^32 */\n\t\t\tt = a * c;\n\t\t\tr += t;\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"ab=%08lx cd=%08lx ef=%08lx -> rs=%08lx %08lx\",\n\t\t\t                     (unsigned long) y->v[i], (unsigned long) z->v[j],\n\t\t\t                     (unsigned long) x->v[i+j], (unsigned long) r,\n\t\t\t                     (unsigned long) s));\n\n\t\t\tx->v[i+j] = s;\n\t\t\tf = r;\n\t\t}\n\t\tif (f > 0U) {\n\t\t\tDUK_ASSERT(i + j < nx);\n\t\t\tDUK_ASSERT(i + j < DUK__BI_MAX_PARTS);\n\t\t\tDUK_ASSERT(x->v[i+j] == 0U);\n\t\t\tx->v[i+j] = (duk_uint32_t) f;\n\t\t}\n#endif  /* DUK_USE_64BIT_OPS */\n\t}\n\n\tduk__bi_normalize(x);\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n\n/* x <- y * z */\nDUK_LOCAL void duk__bi_mul_small(duk__bigint *x, duk__bigint *y, duk_uint32_t z) {\n\tduk__bigint tmp;\n\n\tDUK_ASSERT(duk__bi_is_valid(y));\n\n\t/* XXX: this could be optimized */\n\tduk__bi_set_small(&tmp, z);\n\tduk__bi_mul(x, y, &tmp);\n\n\tDUK_ASSERT(duk__bi_is_valid(x));\n}\n\n/* x <- x * y, use t as temp */\nDUK_LOCAL void duk__bi_mul_copy(duk__bigint *x, duk__bigint *y, duk__bigint *t) {\n\tduk__bi_mul(t, x, y);\n\tduk__bi_copy(x, t);\n}\n\n/* x <- x * y, use t as temp */\nDUK_LOCAL void duk__bi_mul_small_copy(duk__bigint *x, duk_uint32_t y, duk__bigint *t) {\n\tduk__bi_mul_small(t, x, y);\n\tduk__bi_copy(x, t);\n}\n\nDUK_LOCAL int duk__bi_is_even(duk__bigint *x) {\n\tDUK_ASSERT(duk__bi_is_valid(x));\n\treturn (x->n == 0) || ((x->v[0] & 0x01) == 0);\n}\n\nDUK_LOCAL int duk__bi_is_zero(duk__bigint *x) {\n\tDUK_ASSERT(duk__bi_is_valid(x));\n\treturn (x->n == 0);  /* this is the case for normalized numbers */\n}\n\n/* Bigint is 2^52.  Used to detect normalized IEEE double mantissa values\n * which are at the lowest edge (next floating point value downwards has\n * a different exponent).  The lowest mantissa has the form:\n *\n *     1000........000    (52 zeroes; only \"hidden bit\" is set)\n */\nDUK_LOCAL duk_small_int_t duk__bi_is_2to52(duk__bigint *x) {\n\tDUK_ASSERT(duk__bi_is_valid(x));\n\treturn (duk_small_int_t)\n\t        (x->n == 2) && (x->v[0] == 0U) && (x->v[1] == (1U << (52-32)));\n}\n\n/* x <- (1<<y) */\nDUK_LOCAL void duk__bi_twoexp(duk__bigint *x, duk_small_int_t y) {\n\tduk_small_int_t n, r;\n\n\tn = (y / 32) + 1;\n\tDUK_ASSERT(n > 0);\n\tr = y % 32;\n\tDUK_MEMZERO((void *) x->v, sizeof(duk_uint32_t) * (size_t) n);\n\tx->n = n;\n\tx->v[n - 1] = (((duk_uint32_t) 1) << r);\n}\n\n/* x <- b^y; use t1 and t2 as temps */\nDUK_LOCAL void duk__bi_exp_small(duk__bigint *x, duk_small_int_t b, duk_small_int_t y, duk__bigint *t1, duk__bigint *t2) {\n\t/* Fast path the binary case */\n\n\tDUK_ASSERT(x != t1 && x != t2 && t1 != t2);  /* distinct bignums, easy mistake to make */\n\tDUK_ASSERT(b >= 0);\n\tDUK_ASSERT(y >= 0);\n\n\tif (b == 2) {\n\t\tduk__bi_twoexp(x, y);\n\t\treturn;\n\t}\n\n\t/* http://en.wikipedia.org/wiki/Exponentiation_by_squaring */\n\n\tDUK_DDD(DUK_DDDPRINT(\"exp_small: b=%ld, y=%ld\", (long) b, (long) y));\n\n\tduk__bi_set_small(x, 1);\n\tduk__bi_set_small(t1, (duk_uint32_t) b);\n\tfor (;;) {\n\t\t/* Loop structure ensures that we don't compute t1^2 unnecessarily\n\t\t * on the final round, as that might create a bignum exceeding the\n\t\t * current DUK__BI_MAX_PARTS limit.\n\t\t */\n\t\tif (y & 0x01) {\n\t\t\tduk__bi_mul_copy(x, t1, t2);\n\t\t}\n\t\ty = y >> 1;\n\t\tif (y == 0) {\n\t\t\tbreak;\n\t\t}\n\t\tduk__bi_mul_copy(t1, t1, t2);\n\t}\n\n\tDUK__BI_PRINT(\"exp_small result\", x);\n}\n\n/*\n *  A Dragon4 number-to-string variant, based on:\n *\n *    Guy L. Steele Jr., Jon L. White: \"How to Print Floating-Point Numbers\n *    Accurately\"\n *\n *    Robert G. Burger, R. Kent Dybvig: \"Printing Floating-Point Numbers\n *    Quickly and Accurately\"\n *\n *  The current algorithm is based on Figure 1 of the Burger-Dybvig paper,\n *  i.e. the base implementation without logarithm estimation speedups\n *  (these would increase code footprint considerably).  Fixed-format output\n *  does not follow the suggestions in the paper; instead, we generate an\n *  extra digit and round-with-carry.\n *\n *  The same algorithm is used for number parsing (with b=10 and B=2)\n *  by generating one extra digit and doing rounding manually.\n *\n *  See doc/number-conversion.rst for limitations.\n */\n\n/* Maximum number of digits generated. */\n#define DUK__MAX_OUTPUT_DIGITS          1040  /* (Number.MAX_VALUE).toString(2).length == 1024, + slack */\n\n/* Maximum number of characters in formatted value. */\n#define DUK__MAX_FORMATTED_LENGTH       1040  /* (-Number.MAX_VALUE).toString(2).length == 1025, + slack */\n\n/* Number and (minimum) size of bigints in the nc_ctx structure. */\n#define DUK__NUMCONV_CTX_NUM_BIGINTS    7\n#define DUK__NUMCONV_CTX_BIGINTS_SIZE   (sizeof(duk__bigint) * DUK__NUMCONV_CTX_NUM_BIGINTS)\n\ntypedef struct {\n\t/* Currently about 7*152 = 1064 bytes.  The space for these\n\t * duk__bigints is used also as a temporary buffer for generating\n\t * the final string.  This is a bit awkard; a union would be\n\t * more correct.\n\t */\n\tduk__bigint f, r, s, mp, mm, t1, t2;\n\n\tduk_small_int_t is_s2n;        /* if 1, doing a string-to-number; else doing a number-to-string */\n\tduk_small_int_t is_fixed;      /* if 1, doing a fixed format output (not free format) */\n\tduk_small_int_t req_digits;    /* requested number of output digits; 0 = free-format */\n\tduk_small_int_t abs_pos;       /* digit position is absolute, not relative */\n\tduk_small_int_t e;             /* exponent for 'f' */\n\tduk_small_int_t b;             /* input radix */\n\tduk_small_int_t B;             /* output radix */\n\tduk_small_int_t k;             /* see algorithm */\n\tduk_small_int_t low_ok;        /* see algorithm */\n\tduk_small_int_t high_ok;       /* see algorithm */\n\tduk_small_int_t unequal_gaps;  /* m+ != m- (very rarely) */\n\n\t/* Buffer used for generated digits, values are in the range [0,B-1]. */\n\tduk_uint8_t digits[DUK__MAX_OUTPUT_DIGITS];\n\tduk_small_int_t count;  /* digit count */\n} duk__numconv_stringify_ctx;\n\n/* Note: computes with 'idx' in assertions, so caller beware.\n * 'idx' is preincremented, i.e. '1' on first call, because it\n * is more convenient for the caller.\n */\n#define DUK__DRAGON4_OUTPUT_PREINC(nc_ctx,preinc_idx,x)  do { \\\n\t\tDUK_ASSERT((preinc_idx) - 1 >= 0); \\\n\t\tDUK_ASSERT((preinc_idx) - 1 < DUK__MAX_OUTPUT_DIGITS); \\\n\t\t((nc_ctx)->digits[(preinc_idx) - 1]) = (duk_uint8_t) (x); \\\n\t} while (0)\n\nDUK_LOCAL duk_size_t duk__dragon4_format_uint32(duk_uint8_t *buf, duk_uint32_t x, duk_small_int_t radix) {\n\tduk_uint8_t *p;\n\tduk_size_t len;\n\tduk_small_int_t dig;\n\tduk_uint32_t t;\n\n\tDUK_ASSERT(radix >= 2 && radix <= 36);\n\n\t/* A 32-bit unsigned integer formats to at most 32 digits (the\n\t * worst case happens with radix == 2).  Output the digits backwards,\n\t * and use a memmove() to get them in the right place.\n\t */\n\n\tp = buf + 32;\n\tfor (;;) {\n\t\tt = x / (duk_uint32_t) radix;\n\t\tdig = (duk_small_int_t) (x - t * (duk_uint32_t) radix);\n\t\tx = t;\n\n\t\tDUK_ASSERT(dig >= 0 && dig < 36);\n\t\t*(--p) = DUK__DIGITCHAR(dig);\n\n\t\tif (x == 0) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tlen = (duk_size_t) ((buf + 32) - p);\n\n\tDUK_MEMMOVE((void *) buf, (const void *) p, (size_t) len);\n\n\treturn len;\n}\n\nDUK_LOCAL void duk__dragon4_prepare(duk__numconv_stringify_ctx *nc_ctx) {\n\tduk_small_int_t lowest_mantissa;\n\n#if 1\n\t/* Assume IEEE round-to-even, so that shorter encoding can be used\n\t * when round-to-even would produce correct result.  By removing\n\t * this check (and having low_ok == high_ok == 0) the results would\n\t * still be accurate but in some cases longer than necessary.\n\t */\n\tif (duk__bi_is_even(&nc_ctx->f)) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"f is even\"));\n\t\tnc_ctx->low_ok = 1;\n\t\tnc_ctx->high_ok = 1;\n\t} else {\n\t\tDUK_DDD(DUK_DDDPRINT(\"f is odd\"));\n\t\tnc_ctx->low_ok = 0;\n\t\tnc_ctx->high_ok = 0;\n\t}\n#else\n\t/* Note: not honoring round-to-even should work but now generates incorrect\n\t * results.  For instance, 1e23 serializes to \"a000...\", i.e. the first digit\n\t * equals the radix (10).  Scaling stops one step too early in this case.\n\t * Don't know why this is the case, but since this code path is unused, it\n\t * doesn't matter.\n\t */\n\tnc_ctx->low_ok = 0;\n\tnc_ctx->high_ok = 0;\n#endif\n\n\t/* For string-to-number, pretend we never have the lowest mantissa as there\n\t * is no natural \"precision\" for inputs.  Having lowest_mantissa == 0, we'll\n\t * fall into the base cases for both e >= 0 and e < 0.\n\t */\n\tif (nc_ctx->is_s2n) {\n\t\tlowest_mantissa = 0;\n\t} else {\n\t\tlowest_mantissa = duk__bi_is_2to52(&nc_ctx->f);\n\t}\n\n\tnc_ctx->unequal_gaps = 0;\n\tif (nc_ctx->e >= 0) {\n\t\t/* exponent non-negative (and thus not minimum exponent) */\n\n\t\tif (lowest_mantissa) {\n\t\t\t/* (>= e 0) AND (= f (expt b (- p 1)))\n\t\t\t *\n\t\t\t * be <- (expt b e) == b^e\n\t\t\t * be1 <- (* be b) == (expt b (+ e 1)) == b^(e+1)\n\t\t\t * r <- (* f be1 2) == 2 * f * b^(e+1)    [if b==2 -> f * b^(e+2)]\n\t\t\t * s <- (* b 2)                           [if b==2 -> 4]\n\t\t\t * m+ <- be1 == b^(e+1)\n\t\t\t * m- <- be == b^e\n\t\t\t * k <- 0\n\t\t\t * B <- B\n\t\t\t * low_ok <- round\n\t\t\t * high_ok <- round\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"non-negative exponent (not smallest exponent); \"\n\t\t\t                     \"lowest mantissa value for this exponent -> \"\n\t\t\t                     \"unequal gaps\"));\n\n\t\t\tduk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2);  /* mm <- b^e */\n\t\t\tduk__bi_mul_small(&nc_ctx->mp, &nc_ctx->mm, (duk_uint32_t) nc_ctx->b);           /* mp <- b^(e+1) */\n\t\t\tduk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2);\n\t\t\tduk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp);              /* r <- (2 * f) * b^(e+1) */\n\t\t\tduk__bi_set_small(&nc_ctx->s, (duk_uint32_t) (nc_ctx->b * 2));  /* s <- 2 * b */\n\t\t\tnc_ctx->unequal_gaps = 1;\n\t\t} else {\n\t\t\t/* (>= e 0) AND (not (= f (expt b (- p 1))))\n\t\t\t *\n\t\t\t * be <- (expt b e) == b^e\n\t\t\t * r <- (* f be 2) == 2 * f * b^e    [if b==2 -> f * b^(e+1)]\n\t\t\t * s <- 2\n\t\t\t * m+ <- be == b^e\n\t\t\t * m- <- be == b^e\n\t\t\t * k <- 0\n\t\t\t * B <- B\n\t\t\t * low_ok <- round\n\t\t\t * high_ok <- round\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"non-negative exponent (not smallest exponent); \"\n\t\t\t                     \"not lowest mantissa for this exponent -> \"\n\t\t\t                     \"equal gaps\"));\n\n\t\t\tduk__bi_exp_small(&nc_ctx->mm, nc_ctx->b, nc_ctx->e, &nc_ctx->t1, &nc_ctx->t2);  /* mm <- b^e */\n\t\t\tduk__bi_copy(&nc_ctx->mp, &nc_ctx->mm);                /* mp <- b^e */\n\t\t\tduk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, 2);\n\t\t\tduk__bi_mul(&nc_ctx->r, &nc_ctx->t1, &nc_ctx->mp);     /* r <- (2 * f) * b^e */\n\t\t\tduk__bi_set_small(&nc_ctx->s, 2);                      /* s <- 2 */\n\t\t}\n\t} else {\n\t\t/* When doing string-to-number, lowest_mantissa is always 0 so\n\t\t * the exponent check, while incorrect, won't matter.\n\t\t */\n\t\tif (nc_ctx->e > DUK__IEEE_DOUBLE_EXP_MIN /*not minimum exponent*/ &&\n\t\t    lowest_mantissa /* lowest mantissa for this exponent*/) {\n\t\t\t/* r <- (* f b 2)                                [if b==2 -> (* f 4)]\n\t\t\t * s <- (* (expt b (- 1 e)) 2) == b^(1-e) * 2    [if b==2 -> b^(2-e)]\n\t\t\t * m+ <- b == 2\n\t\t\t * m- <- 1\n\t\t\t * k <- 0\n\t\t\t * B <- B\n\t\t\t * low_ok <- round\n\t\t\t * high_ok <- round\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"negative exponent; not minimum exponent and \"\n\t\t\t                     \"lowest mantissa for this exponent -> \"\n\t\t\t                     \"unequal gaps\"));\n\n\t\t\tduk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, (duk_uint32_t) (nc_ctx->b * 2));  /* r <- (2 * b) * f */\n\t\t\tduk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, 1 - nc_ctx->e, &nc_ctx->s, &nc_ctx->t2);  /* NB: use 's' as temp on purpose */\n\t\t\tduk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2);             /* s <- b^(1-e) * 2 */\n\t\t\tduk__bi_set_small(&nc_ctx->mp, 2);\n\t\t\tduk__bi_set_small(&nc_ctx->mm, 1);\n\t\t\tnc_ctx->unequal_gaps = 1;\n\t\t} else {\n\t\t\t/* r <- (* f 2)\n\t\t\t * s <- (* (expt b (- e)) 2) == b^(-e) * 2    [if b==2 -> b^(1-e)]\n\t\t\t * m+ <- 1\n\t\t\t * m- <- 1\n\t\t\t * k <- 0\n\t\t\t * B <- B\n\t\t\t * low_ok <- round\n\t\t\t * high_ok <- round\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"negative exponent; minimum exponent or not \"\n\t\t\t                     \"lowest mantissa for this exponent -> \"\n\t\t\t                     \"equal gaps\"));\n\n\t\t\tduk__bi_mul_small(&nc_ctx->r, &nc_ctx->f, 2);            /* r <- 2 * f */\n\t\t\tduk__bi_exp_small(&nc_ctx->t1, nc_ctx->b, -nc_ctx->e, &nc_ctx->s, &nc_ctx->t2);  /* NB: use 's' as temp on purpose */\n\t\t\tduk__bi_mul_small(&nc_ctx->s, &nc_ctx->t1, 2);           /* s <- b^(-e) * 2 */\n\t\t\tduk__bi_set_small(&nc_ctx->mp, 1);\n\t\t\tduk__bi_set_small(&nc_ctx->mm, 1);\n\t\t}\n\t}\n}\n\nDUK_LOCAL void duk__dragon4_scale(duk__numconv_stringify_ctx *nc_ctx) {\n\tduk_small_int_t k = 0;\n\n\t/* This is essentially the 'scale' algorithm, with recursion removed.\n\t * Note that 'k' is either correct immediately, or will move in one\n\t * direction in the loop.  There's no need to do the low/high checks\n\t * on every round (like the Scheme algorithm does).\n\t *\n\t * The scheme algorithm finds 'k' and updates 's' simultaneously,\n\t * while the logical algorithm finds 'k' with 's' having its initial\n\t * value, after which 's' is updated separately (see the Burger-Dybvig\n\t * paper, Section 3.1, steps 2 and 3).\n\t *\n\t * The case where m+ == m- (almost always) is optimized for, because\n\t * it reduces the bigint operations considerably and almost always\n\t * applies.  The scale loop only needs to work with m+, so this works.\n\t */\n\n\t/* XXX: this algorithm could be optimized quite a lot by using e.g.\n\t * a logarithm based estimator for 'k' and performing B^n multiplication\n\t * using a lookup table or using some bit-representation based exp\n\t * algorithm.  Currently we just loop, with significant performance\n\t * impact for very large and very small numbers.\n\t */\n\n\tDUK_DDD(DUK_DDDPRINT(\"scale: B=%ld, low_ok=%ld, high_ok=%ld\",\n\t                     (long) nc_ctx->B, (long) nc_ctx->low_ok, (long) nc_ctx->high_ok));\n\tDUK__BI_PRINT(\"r(init)\", &nc_ctx->r);\n\tDUK__BI_PRINT(\"s(init)\", &nc_ctx->s);\n\tDUK__BI_PRINT(\"mp(init)\", &nc_ctx->mp);\n\tDUK__BI_PRINT(\"mm(init)\", &nc_ctx->mm);\n\n\tfor (;;) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"scale loop (inc k), k=%ld\", (long) k));\n\t\tDUK__BI_PRINT(\"r\", &nc_ctx->r);\n\t\tDUK__BI_PRINT(\"s\", &nc_ctx->s);\n\t\tDUK__BI_PRINT(\"m+\", &nc_ctx->mp);\n\t\tDUK__BI_PRINT(\"m-\", &nc_ctx->mm);\n\n\t\tduk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp);  /* t1 = (+ r m+) */\n\t\tif (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"k is too low\"));\n\t\t\t/* r <- r\n\t\t\t * s <- (* s B)\n\t\t\t * m+ <- m+\n\t\t\t * m- <- m-\n\t\t\t * k <- (+ k 1)\n\t\t\t */\n\n\t\t\tduk__bi_mul_small_copy(&nc_ctx->s, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);\n\t\t\tk++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* k > 0 -> k was too low, and cannot be too high */\n\tif (k > 0) {\n\t\tgoto skip_dec_k;\n\t}\n\n\tfor (;;) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"scale loop (dec k), k=%ld\", (long) k));\n\t\tDUK__BI_PRINT(\"r\", &nc_ctx->r);\n\t\tDUK__BI_PRINT(\"s\", &nc_ctx->s);\n\t\tDUK__BI_PRINT(\"m+\", &nc_ctx->mp);\n\t\tDUK__BI_PRINT(\"m-\", &nc_ctx->mm);\n\n\t\tduk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp);  /* t1 = (+ r m+) */\n\t\tduk__bi_mul_small(&nc_ctx->t2, &nc_ctx->t1, (duk_uint32_t) nc_ctx->B);   /* t2 = (* (+ r m+) B) */\n\t\tif (duk__bi_compare(&nc_ctx->t2, &nc_ctx->s) <= (nc_ctx->high_ok ? -1 : 0)) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"k is too high\"));\n\t\t\t/* r <- (* r B)\n\t\t\t * s <- s\n\t\t\t * m+ <- (* m+ B)\n\t\t\t * m- <- (* m- B)\n\t\t\t * k <- (- k 1)\n\t\t\t */\n\t\t\tduk__bi_mul_small_copy(&nc_ctx->r, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);\n\t\t\tduk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);\n\t\t\tif (nc_ctx->unequal_gaps) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"m+ != m- -> need to update m- too\"));\n\t\t\t\tduk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t1);\n\t\t\t}\n\t\t\tk--;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n skip_dec_k:\n\n\tif (!nc_ctx->unequal_gaps) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"equal gaps, copy m- from m+\"));\n\t\tduk__bi_copy(&nc_ctx->mm, &nc_ctx->mp);  /* mm <- mp */\n\t}\n\tnc_ctx->k = k;\n\n\tDUK_DDD(DUK_DDDPRINT(\"final k: %ld\", (long) k));\n\tDUK__BI_PRINT(\"r(final)\", &nc_ctx->r);\n\tDUK__BI_PRINT(\"s(final)\", &nc_ctx->s);\n\tDUK__BI_PRINT(\"mp(final)\", &nc_ctx->mp);\n\tDUK__BI_PRINT(\"mm(final)\", &nc_ctx->mm);\n}\n\nDUK_LOCAL void duk__dragon4_generate(duk__numconv_stringify_ctx *nc_ctx) {\n\tduk_small_int_t tc1, tc2;    /* terminating conditions */\n\tduk_small_int_t d;           /* current digit */\n\tduk_small_int_t count = 0;   /* digit count */\n\n\t/*\n\t *  Digit generation loop.\n\t *\n\t *  Different termination conditions:\n\t *\n\t *    1. Free format output.  Terminate when shortest accurate\n\t *       representation found.\n\t *\n\t *    2. Fixed format output, with specific number of digits.\n\t *       Ignore termination conditions, terminate when digits\n\t *       generated.  Caller requests an extra digit and rounds.\n\t *\n\t *    3. Fixed format output, with a specific absolute cut-off\n\t *       position (e.g. 10 digits after decimal point).  Note\n\t *       that we always generate at least one digit, even if\n\t *       the digit is below the cut-off point already.\n\t */\n\n\tfor (;;) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"generate loop, count=%ld, k=%ld, B=%ld, low_ok=%ld, high_ok=%ld\",\n\t\t                     (long) count, (long) nc_ctx->k, (long) nc_ctx->B,\n\t\t                     (long) nc_ctx->low_ok, (long) nc_ctx->high_ok));\n\t\tDUK__BI_PRINT(\"r\", &nc_ctx->r);\n\t\tDUK__BI_PRINT(\"s\", &nc_ctx->s);\n\t\tDUK__BI_PRINT(\"m+\", &nc_ctx->mp);\n\t\tDUK__BI_PRINT(\"m-\", &nc_ctx->mm);\n\n\t\t/* (quotient-remainder (* r B) s) using a dummy subtraction loop */\n\t\tduk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, (duk_uint32_t) nc_ctx->B);       /* t1 <- (* r B) */\n\t\td = 0;\n\t\tfor (;;) {\n\t\t\tif (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tduk__bi_sub_copy(&nc_ctx->t1, &nc_ctx->s, &nc_ctx->t2);  /* t1 <- t1 - s */\n\t\t\td++;\n\t\t}\n\t\tduk__bi_copy(&nc_ctx->r, &nc_ctx->t1);  /* r <- (remainder (* r B) s) */\n\t\t                                        /* d <- (quotient (* r B) s)   (in range 0...B-1) */\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> d(quot)=%ld\", (long) d));\n\t\tDUK__BI_PRINT(\"r(rem)\", &nc_ctx->r);\n\n\t\tduk__bi_mul_small_copy(&nc_ctx->mp, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m+ <- (* m+ B) */\n\t\tduk__bi_mul_small_copy(&nc_ctx->mm, (duk_uint32_t) nc_ctx->B, &nc_ctx->t2); /* m- <- (* m- B) */\n\t\tDUK__BI_PRINT(\"mp(upd)\", &nc_ctx->mp);\n\t\tDUK__BI_PRINT(\"mm(upd)\", &nc_ctx->mm);\n\n\t\t/* Terminating conditions.  For fixed width output, we just ignore the\n\t\t * terminating conditions (and pretend that tc1 == tc2 == false).  The\n\t\t * the current shortcut for fixed-format output is to generate a few\n\t\t * extra digits and use rounding (with carry) to finish the output.\n\t\t */\n\n\t\tif (nc_ctx->is_fixed == 0) {\n\t\t\t/* free-form */\n\t\t\ttc1 = (duk__bi_compare(&nc_ctx->r, &nc_ctx->mm) <= (nc_ctx->low_ok ? 0 : -1));\n\n\t\t\tduk__bi_add(&nc_ctx->t1, &nc_ctx->r, &nc_ctx->mp);  /* t1 <- (+ r m+) */\n\t\t\ttc2 = (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) >= (nc_ctx->high_ok ? 0 : 1));\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"tc1=%ld, tc2=%ld\", (long) tc1, (long) tc2));\n\t\t} else {\n\t\t\t/* fixed-format */\n\t\t\ttc1 = 0;\n\t\t\ttc2 = 0;\n\t\t}\n\n\t\t/* Count is incremented before DUK__DRAGON4_OUTPUT_PREINC() call\n\t\t * on purpose, which is taken into account by the macro.\n\t\t */\n\t\tcount++;\n\n\t\tif (tc1) {\n\t\t\tif (tc2) {\n\t\t\t\t/* tc1 = true, tc2 = true */\n\t\t\t\tduk__bi_mul_small(&nc_ctx->t1, &nc_ctx->r, 2);\n\t\t\t\tif (duk__bi_compare(&nc_ctx->t1, &nc_ctx->s) < 0) {  /* (< (* r 2) s) */\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"tc1=true, tc2=true, 2r > s: output d --> %ld (k=%ld)\",\n\t\t\t\t\t                     (long) d, (long) nc_ctx->k));\n\t\t\t\t\tDUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d);\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"tc1=true, tc2=true, 2r <= s: output d+1 --> %ld (k=%ld)\",\n\t\t\t\t\t                     (long) (d + 1), (long) nc_ctx->k));\n\t\t\t\t\tDUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t/* tc1 = true, tc2 = false */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"tc1=true, tc2=false: output d --> %ld (k=%ld)\",\n\t\t\t\t                     (long) d, (long) nc_ctx->k));\n\t\t\t\tDUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (tc2) {\n\t\t\t\t/* tc1 = false, tc2 = true */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"tc1=false, tc2=true: output d+1 --> %ld (k=%ld)\",\n\t\t\t\t                     (long) (d + 1), (long) nc_ctx->k));\n\t\t\t\tDUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d + 1);\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\t/* tc1 = false, tc2 = false */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"tc1=false, tc2=false: output d --> %ld (k=%ld)\",\n\t\t\t\t                     (long) d, (long) nc_ctx->k));\n\t\t\t\tDUK__DRAGON4_OUTPUT_PREINC(nc_ctx, count, d);\n\n\t\t\t\t/* r <- r    (updated above: r <- (remainder (* r B) s)\n\t\t\t\t * s <- s\n\t\t\t\t * m+ <- m+  (updated above: m+ <- (* m+ B)\n\t\t\t\t * m- <- m-  (updated above: m- <- (* m- B)\n\t\t\t\t * B, low_ok, high_ok are fixed\n\t\t\t\t */\n\n\t\t\t\t/* fall through and continue for-loop */\n\t\t\t}\n\t\t}\n\n\t\t/* fixed-format termination conditions */\n\t\tif (nc_ctx->is_fixed) {\n\t\t\tif (nc_ctx->abs_pos) {\n\t\t\t\tint pos = nc_ctx->k - count + 1;  /* count is already incremented, take into account */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"fixed format, absolute: abs pos=%ld, k=%ld, count=%ld, req=%ld\",\n\t\t\t\t                     (long) pos, (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits));\n\t\t\t\tif (pos <= nc_ctx->req_digits) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"digit position reached req_digits, end generate loop\"));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"fixed format, relative: k=%ld, count=%ld, req=%ld\",\n\t\t\t\t                     (long) nc_ctx->k, (long) count, (long) nc_ctx->req_digits));\n\t\t\t\tif (count >= nc_ctx->req_digits) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"digit count reached req_digits, end generate loop\"));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}  /* for */\n\n\tnc_ctx->count = count;\n\n\tDUK_DDD(DUK_DDDPRINT(\"generate finished\"));\n\n#if defined(DUK_USE_DEBUG_LEVEL) && (DUK_USE_DEBUG_LEVEL >= 2)\n\t{\n\t\tduk_uint8_t buf[2048];\n\t\tduk_small_int_t i, t;\n\t\tDUK_MEMZERO(buf, sizeof(buf));\n\t\tfor (i = 0; i < nc_ctx->count; i++) {\n\t\t\tt = nc_ctx->digits[i];\n\t\t\tif (t < 0 || t > 36) {\n\t\t\t\tbuf[i] = (duk_uint8_t) '?';\n\t\t\t} else {\n\t\t\t\tbuf[i] = (duk_uint8_t) DUK__DIGITCHAR(t);\n\t\t\t}\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"-> generated digits; k=%ld, digits='%s'\",\n\t\t                     (long) nc_ctx->k, (const char *) buf));\n\t}\n#endif\n}\n\n/* Round up digits to a given position.  If position is out-of-bounds,\n * does nothing.  If carry propagates over the first digit, a '1' is\n * prepended to digits and 'k' will be updated.  Return value indicates\n * whether carry propagated over the first digit.\n *\n * Note that nc_ctx->count is NOT updated based on the rounding position\n * (it is updated only if carry overflows over the first digit and an\n * extra digit is prepended).\n */\nDUK_LOCAL duk_small_int_t duk__dragon4_fixed_format_round(duk__numconv_stringify_ctx *nc_ctx, duk_small_int_t round_idx) {\n\tduk_small_int_t t;\n\tduk_uint8_t *p;\n\tduk_uint8_t roundup_limit;\n\tduk_small_int_t ret = 0;\n\n\t/*\n\t *  round_idx points to the digit which is considered for rounding; the\n\t *  digit to its left is the final digit of the rounded value.  If round_idx\n\t *  is zero, rounding will be performed; the result will either be an empty\n\t *  rounded value or if carry happens a '1' digit is generated.\n\t */\n\n\tif (round_idx >= nc_ctx->count) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"round_idx out of bounds (%ld >= %ld (count)) -> no rounding\",\n\t\t                     (long) round_idx, (long) nc_ctx->count));\n\t\treturn 0;\n\t} else if (round_idx < 0) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"round_idx out of bounds (%ld < 0) -> no rounding\",\n\t\t                     (long) round_idx));\n\t\treturn 0;\n\t}\n\n\t/*\n\t *  Round-up limit.\n\t *\n\t *  For even values, divides evenly, e.g. 10 -> roundup_limit=5.\n\t *\n\t *  For odd values, rounds up, e.g. 3 -> roundup_limit=2.\n\t *  If radix is 3, 0/3 -> down, 1/3 -> down, 2/3 -> up.\n\t */\n\troundup_limit = (duk_uint8_t) ((nc_ctx->B + 1) / 2);\n\n\tp = &nc_ctx->digits[round_idx];\n\tif (*p >= roundup_limit) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"fixed-format rounding carry required\"));\n\t\t/* carry */\n\t\tfor (;;) {\n\t\t\t*p = 0;\n\t\t\tif (p == &nc_ctx->digits[0]) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"carry propagated to first digit -> special case handling\"));\n\t\t\t\tDUK_MEMMOVE((void *) (&nc_ctx->digits[1]),\n\t\t\t\t            (const void *) (&nc_ctx->digits[0]),\n\t\t\t\t            (size_t) (sizeof(char) * (size_t) nc_ctx->count));\n\t\t\t\tnc_ctx->digits[0] = 1;  /* don't increase 'count' */\n\t\t\t\tnc_ctx->k++;  /* position of highest digit changed */\n\t\t\t\tnc_ctx->count++;  /* number of digits changed */\n\t\t\t\tret = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"fixed-format rounding carry: B=%ld, roundup_limit=%ld, p=%p, digits=%p\",\n\t\t\t                     (long) nc_ctx->B, (long) roundup_limit, (void *) p, (void *) nc_ctx->digits));\n\t\t\tp--;\n\t\t\tt = *p;\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"digit before carry: %ld\", (long) t));\n\t\t\tif (++t < nc_ctx->B) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"rounding carry terminated\"));\n\t\t\t\t*p = (duk_uint8_t) t;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"wraps, carry to next digit\"));\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n#define DUK__NO_EXP  (65536)  /* arbitrary marker, outside valid exp range */\n\nDUK_LOCAL void duk__dragon4_convert_and_push(duk__numconv_stringify_ctx *nc_ctx,\n                                             duk_hthread *thr,\n                                             duk_small_int_t radix,\n                                             duk_small_int_t digits,\n                                             duk_small_uint_t flags,\n                                             duk_small_int_t neg) {\n\tduk_small_int_t k;\n\tduk_small_int_t pos, pos_end;\n\tduk_small_int_t expt;\n\tduk_small_int_t dig;\n\tduk_uint8_t *q;\n\tduk_uint8_t *buf;\n\n\t/*\n\t *  The string conversion here incorporates all the necessary Ecmascript\n\t *  semantics without attempting to be generic.  nc_ctx->digits contains\n\t *  nc_ctx->count digits (>= 1), with the topmost digit's 'position'\n\t *  indicated by nc_ctx->k as follows:\n\t *\n\t *    digits=\"123\" count=3 k=0   -->   0.123\n\t *    digits=\"123\" count=3 k=1   -->   1.23\n\t *    digits=\"123\" count=3 k=5   -->   12300\n\t *    digits=\"123\" count=3 k=-1  -->   0.0123\n\t *\n\t *  Note that the identifier names used for format selection are different\n\t *  in Burger-Dybvig paper and Ecmascript specification (quite confusingly\n\t *  so, because e.g. 'k' has a totally different meaning in each).  See\n\t *  documentation for discussion.\n\t *\n\t *  Ecmascript doesn't specify any specific behavior for format selection\n\t *  (e.g. when to use exponent notation) for non-base-10 numbers.\n\t *\n\t *  The bigint space in the context is reused for string output, as there\n\t *  is more than enough space for that (>1kB at the moment), and we avoid\n\t *  allocating even more stack.\n\t */\n\n\tDUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= DUK__MAX_FORMATTED_LENGTH);\n\tDUK_ASSERT(nc_ctx->count >= 1);\n\n\tk = nc_ctx->k;\n\tbuf = (duk_uint8_t *) &nc_ctx->f;  /* XXX: union would be more correct */\n\tq = buf;\n\n\t/* Exponent handling: if exponent format is used, record exponent value and\n\t * fake k such that one leading digit is generated (e.g. digits=123 -> \"1.23\").\n\t *\n\t * toFixed() prevents exponent use; otherwise apply a set of criteria to\n\t * match the other API calls (toString(), toPrecision, etc).\n\t */\n\n\texpt = DUK__NO_EXP;\n\tif (!nc_ctx->abs_pos /* toFixed() */) {\n\t\tif ((flags & DUK_N2S_FLAG_FORCE_EXP) ||             /* exponential notation forced */\n\t\t    ((flags & DUK_N2S_FLAG_NO_ZERO_PAD) &&          /* fixed precision and zero padding would be required */\n\t             (k - digits >= 1)) ||                          /* (e.g. k=3, digits=2 -> \"12X\") */\n\t\t    ((k > 21 || k <= -6) && (radix == 10))) {       /* toString() conditions */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"use exponential notation: k=%ld -> expt=%ld\",\n\t\t\t                     (long) k, (long) (k - 1)));\n\t\t\texpt = k - 1;  /* e.g. 12.3 -> digits=\"123\" k=2 -> 1.23e1 */\n\t\t\tk = 1;  /* generate mantissa with a single leading whole number digit */\n\t\t}\n\t}\n\n\tif (neg) {\n\t\t*q++ = '-';\n\t}\n\n\t/* Start position (inclusive) and end position (exclusive) */\n\tpos = (k >= 1 ? k : 1);\n\tif (nc_ctx->is_fixed) {\n\t\tif (nc_ctx->abs_pos) {\n\t\t\t/* toFixed() */\n\t\t\tpos_end = -digits;\n\t\t} else {\n\t\t\tpos_end = k - digits;\n\t\t}\n\t} else {\n\t\tpos_end = k - nc_ctx->count;\n\t}\n\tif (pos_end > 0) {\n\t\tpos_end = 0;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"expt=%ld, k=%ld, count=%ld, pos=%ld, pos_end=%ld, is_fixed=%ld, \"\n\t                     \"digits=%ld, abs_pos=%ld\",\n\t                     (long) expt, (long) k, (long) nc_ctx->count, (long) pos, (long) pos_end,\n\t                     (long) nc_ctx->is_fixed, (long) digits, (long) nc_ctx->abs_pos));\n\n\t/* Digit generation */\n\twhile (pos > pos_end) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"digit generation: pos=%ld, pos_end=%ld\",\n\t\t                     (long) pos, (long) pos_end));\n\t\tif (pos == 0) {\n\t\t\t*q++ = (duk_uint8_t) '.';\n\t\t}\n\t\tif (pos > k) {\n\t\t\t*q++ = (duk_uint8_t) '0';\n\t\t} else if (pos <= k - nc_ctx->count) {\n\t\t\t*q++ = (duk_uint8_t) '0';\n\t\t} else {\n\t\t\tdig = nc_ctx->digits[k - pos];\n\t\t\tDUK_ASSERT(dig >= 0 && dig < nc_ctx->B);\n\t\t\t*q++ = (duk_uint8_t) DUK__DIGITCHAR(dig);\n\t\t}\n\n\t\tpos--;\n\t}\n\tDUK_ASSERT(pos <= 1);\n\n\t/* Exponent */\n\tif (expt != DUK__NO_EXP) {\n\t\t/*\n\t\t *  Exponent notation for non-base-10 numbers isn't specified in Ecmascript\n\t\t *  specification, as it never explicitly turns up: non-decimal numbers can\n\t\t *  only be formatted with Number.prototype.toString([radix]) and for that,\n\t\t *  behavior is not explicitly specified.\n\t\t *\n\t\t *  Logical choices include formatting the exponent as decimal (e.g. binary\n\t\t *  100000 as 1e+5) or in current radix (e.g. binary 100000 as 1e+101).\n\t\t *  The Dragon4 algorithm (in the original paper) prints the exponent value\n\t\t *  in the target radix B.  However, for radix values 15 and above, the\n\t\t *  exponent separator 'e' is no longer easily parseable.  Consider, for\n\t\t *  instance, the number \"1.faecee+1c\".\n\t\t */\n\n\t\tduk_size_t len;\n\t\tchar expt_sign;\n\n\t\t*q++ = 'e';\n\t\tif (expt >= 0) {\n\t\t\texpt_sign = '+';\n\t\t} else {\n\t\t\texpt_sign = '-';\n\t\t\texpt = -expt;\n\t\t}\n\t\t*q++ = (duk_uint8_t) expt_sign;\n\t\tlen = duk__dragon4_format_uint32(q, (duk_uint32_t) expt, radix);\n\t\tq += len;\n\t}\n\n\tduk_push_lstring(thr, (const char *) buf, (size_t) (q - buf));\n}\n\n/*\n *  Conversion helpers\n */\n\nDUK_LOCAL void duk__dragon4_double_to_ctx(duk__numconv_stringify_ctx *nc_ctx, duk_double_t x) {\n\tduk_double_union u;\n\tduk_uint32_t tmp;\n\tduk_small_int_t expt;\n\n\t/*\n\t *    seeeeeee eeeeffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff\n\t *       A        B        C        D        E        F        G        H\n\t *\n\t *    s       sign bit\n\t *    eee...  exponent field\n\t *    fff...  fraction\n\t *\n\t *    ieee value = 1.ffff... * 2^(e - 1023)  (normal)\n\t *               = 0.ffff... * 2^(-1022)     (denormal)\n\t *\n\t *    algorithm v = f * b^e\n\t */\n\n\tDUK_DBLUNION_SET_DOUBLE(&u, x);\n\n\tnc_ctx->f.n = 2;\n\n\ttmp = DUK_DBLUNION_GET_LOW32(&u);\n\tnc_ctx->f.v[0] = tmp;\n\ttmp = DUK_DBLUNION_GET_HIGH32(&u);\n\tnc_ctx->f.v[1] = tmp & 0x000fffffUL;\n\texpt = (duk_small_int_t) ((tmp >> 20) & 0x07ffUL);\n\n\tif (expt == 0) {\n\t\t/* denormal */\n\t\texpt = DUK__IEEE_DOUBLE_EXP_MIN - 52;\n\t\tduk__bi_normalize(&nc_ctx->f);\n\t} else {\n\t\t/* normal: implicit leading 1-bit */\n\t\tnc_ctx->f.v[1] |= 0x00100000UL;\n\t\texpt = expt - DUK__IEEE_DOUBLE_EXP_BIAS - 52;\n\t\tDUK_ASSERT(duk__bi_is_valid(&nc_ctx->f));  /* true, because v[1] has at least one bit set */\n\t}\n\n\tDUK_ASSERT(duk__bi_is_valid(&nc_ctx->f));\n\n\tnc_ctx->e = expt;\n}\n\nDUK_LOCAL void duk__dragon4_ctx_to_double(duk__numconv_stringify_ctx *nc_ctx, duk_double_t *x) {\n\tduk_double_union u;\n\tduk_small_int_t expt;\n\tduk_small_int_t i;\n\tduk_small_int_t bitstart;\n\tduk_small_int_t bitround;\n\tduk_small_int_t bitidx;\n\tduk_small_int_t skip_round;\n\tduk_uint32_t t, v;\n\n\tDUK_ASSERT(nc_ctx->count == 53 + 1);\n\n\t/* Sometimes this assert is not true right now; it will be true after\n\t * rounding.  See: test-bug-numconv-mantissa-assert.js.\n\t */\n\tDUK_ASSERT_DISABLE(nc_ctx->digits[0] == 1);  /* zero handled by caller */\n\n\t/* Should not be required because the code below always sets both high\n\t * and low parts, but at least gcc-4.4.5 fails to deduce this correctly\n\t * (perhaps because the low part is set (seemingly) conditionally in a\n\t * loop), so this is here to avoid the bogus warning.\n\t */\n\tDUK_MEMZERO((void *) &u, sizeof(u));\n\n\t/*\n\t *  Figure out how generated digits match up with the mantissa,\n\t *  and then perform rounding.  If mantissa overflows, need to\n\t *  recompute the exponent (it is bumped and may overflow to\n\t *  infinity).\n\t *\n\t *  For normal numbers the leading '1' is hidden and ignored,\n\t *  and the last bit is used for rounding:\n\t *\n\t *                          rounding pt\n\t *       <--------52------->|\n\t *     1 x x x x ... x x x x|y  ==>  x x x x ... x x x x\n\t *\n\t *  For denormals, the leading '1' is included in the number,\n\t *  and the rounding point is different:\n\t *\n\t *                      rounding pt\n\t *     <--52 or less--->|\n\t *     1 x x x x ... x x|x x y  ==>  0 0 ... 1 x x ... x x\n\t *\n\t *  The largest denormals will have a mantissa beginning with\n\t *  a '1' (the explicit leading bit); smaller denormals will\n\t *  have leading zero bits.\n\t *\n\t *  If the exponent would become too high, the result becomes\n\t *  Infinity.  If the exponent is so small that the entire\n\t *  mantissa becomes zero, the result becomes zero.\n\t *\n\t *  Note: the Dragon4 'k' is off-by-one with respect to the IEEE\n\t *  exponent.  For instance, k==0 indicates that the leading '1'\n\t *  digit is at the first binary fraction position (0.1xxx...);\n\t *  the corresponding IEEE exponent would be -1.\n\t */\n\n\tskip_round = 0;\n\n recheck_exp:\n\n\texpt = nc_ctx->k - 1;   /* IEEE exp without bias */\n\tif (expt > 1023) {\n\t\t/* Infinity */\n\t\tbitstart = -255;  /* needed for inf: causes mantissa to become zero,\n\t\t                   * and rounding to be skipped.\n\t\t                   */\n\t\texpt = 2047;\n\t} else if (expt >= -1022) {\n\t\t/* normal */\n\t\tbitstart = 1;  /* skip leading digit */\n\t\texpt += DUK__IEEE_DOUBLE_EXP_BIAS;\n\t\tDUK_ASSERT(expt >= 1 && expt <= 2046);\n\t} else {\n\t\t/* denormal or zero */\n\t\tbitstart = 1023 + expt;  /* expt==-1023 -> bitstart=0 (leading 1);\n\t\t                          * expt==-1024 -> bitstart=-1 (one left of leading 1), etc\n\t\t                          */\n\t\texpt = 0;\n\t}\n\tbitround = bitstart + 52;\n\n\tDUK_DDD(DUK_DDDPRINT(\"ieee expt=%ld, bitstart=%ld, bitround=%ld\",\n\t                     (long) expt, (long) bitstart, (long) bitround));\n\n\tif (!skip_round) {\n\t\tif (duk__dragon4_fixed_format_round(nc_ctx, bitround)) {\n\t\t\t/* Corner case: see test-numconv-parse-mant-carry.js.  We could\n\t\t\t * just bump the exponent and update bitstart, but it's more robust\n\t\t\t * to recompute (but avoid rounding twice).\n\t\t\t */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"rounding caused exponent to be bumped, recheck exponent\"));\n\t\t\tskip_round = 1;\n\t\t\tgoto recheck_exp;\n\t\t}\n\t}\n\n\t/*\n\t *  Create mantissa\n\t */\n\n\tt = 0;\n\tfor (i = 0; i < 52; i++) {\n\t\tbitidx = bitstart + 52 - 1 - i;\n\t\tif (bitidx >= nc_ctx->count) {\n\t\t\tv = 0;\n\t\t} else if (bitidx < 0) {\n\t\t\tv = 0;\n\t\t} else {\n\t\t\tv = nc_ctx->digits[bitidx];\n\t\t}\n\t\tDUK_ASSERT(v == 0 || v == 1);\n\t\tt += v << (i % 32);\n\t\tif (i == 31) {\n\t\t\t/* low 32 bits is complete */\n\t\t\tDUK_DBLUNION_SET_LOW32(&u, t);\n\t\t\tt = 0;\n\t\t}\n\t}\n\t/* t has high mantissa */\n\n\tDUK_DDD(DUK_DDDPRINT(\"mantissa is complete: %08lx %08lx\",\n\t                     (unsigned long) t,\n\t                     (unsigned long) DUK_DBLUNION_GET_LOW32(&u)));\n\n\tDUK_ASSERT(expt >= 0 && expt <= 0x7ffL);\n\tt += ((duk_uint32_t) expt) << 20;\n#if 0  /* caller handles sign change */\n\tif (negative) {\n\t\tt |= 0x80000000U;\n\t}\n#endif\n\tDUK_DBLUNION_SET_HIGH32(&u, t);\n\n\tDUK_DDD(DUK_DDDPRINT(\"number is complete: %08lx %08lx\",\n\t                     (unsigned long) DUK_DBLUNION_GET_HIGH32(&u),\n\t                     (unsigned long) DUK_DBLUNION_GET_LOW32(&u)));\n\n\t*x = DUK_DBLUNION_GET_DOUBLE(&u);\n}\n\n/*\n *  Exposed number-to-string API\n *\n *  Input: [ number ]\n *  Output: [ string ]\n */\n\nDUK_INTERNAL void duk_numconv_stringify(duk_hthread *thr, duk_small_int_t radix, duk_small_int_t digits, duk_small_uint_t flags) {\n\tduk_double_t x;\n\tduk_small_int_t c;\n\tduk_small_int_t neg;\n\tduk_uint32_t uval;\n\tduk__numconv_stringify_ctx nc_ctx_alloc;  /* large context; around 2kB now */\n\tduk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc;\n\n\tx = (duk_double_t) duk_require_number(thr, -1);\n\tduk_pop(thr);\n\n\t/*\n\t *  Handle special cases (NaN, infinity, zero).\n\t */\n\n\tc = (duk_small_int_t) DUK_FPCLASSIFY(x);\n\tif (DUK_SIGNBIT((double) x)) {\n\t\tx = -x;\n\t\tneg = 1;\n\t} else {\n\t\tneg = 0;\n\t}\n\n\t/* NaN sign bit is platform specific with unpacked, un-normalized NaNs */\n\tDUK_ASSERT(c == DUK_FP_NAN || DUK_SIGNBIT((double) x) == 0);\n\n\tif (c == DUK_FP_NAN) {\n\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_NAN);\n\t\treturn;\n\t} else if (c == DUK_FP_INFINITE) {\n\t\tif (neg) {\n\t\t\t/* -Infinity */\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_MINUS_INFINITY);\n\t\t} else {\n\t\t\t/* Infinity */\n\t\t\tduk_push_hstring_stridx(thr, DUK_STRIDX_INFINITY);\n\t\t}\n\t\treturn;\n\t} else if (c == DUK_FP_ZERO) {\n\t\t/* We can't shortcut zero here if it goes through special formatting\n\t\t * (such as forced exponential notation).\n\t\t */\n\t\t;\n\t}\n\n\t/*\n\t *  Handle integers in 32-bit range (that is, [-(2**32-1),2**32-1])\n\t *  specially, as they're very likely for embedded programs.  This\n\t *  is now done for all radix values.  We must be careful not to use\n\t *  the fast path when special formatting (e.g. forced exponential)\n\t *  is in force.\n\t *\n\t *  XXX: could save space by supporting radix 10 only and using\n\t *  sprintf \"%lu\" for the fast path and for exponent formatting.\n\t */\n\n\tuval = (unsigned int) x;\n\tif (((double) uval) == x &&  /* integer number in range */\n\t    flags == 0) {            /* no special formatting */\n\t\t/* use bigint area as a temp */\n\t\tduk_uint8_t *buf = (duk_uint8_t *) (&nc_ctx->f);\n\t\tduk_uint8_t *p = buf;\n\n\t\tDUK_ASSERT(DUK__NUMCONV_CTX_BIGINTS_SIZE >= 32 + 1);  /* max size: radix=2 + sign */\n\t\tif (neg && uval != 0) {\n\t\t\t/* no negative sign for zero */\n\t\t\t*p++ = (duk_uint8_t) '-';\n\t\t}\n\t\tp += duk__dragon4_format_uint32(p, uval, radix);\n\t\tduk_push_lstring(thr, (const char *) buf, (duk_size_t) (p - buf));\n\t\treturn;\n\t}\n\n\t/*\n\t *  Dragon4 setup.\n\t *\n\t *  Convert double from IEEE representation for conversion;\n\t *  normal finite values have an implicit leading 1-bit.  The\n\t *  slow path algorithm doesn't handle zero, so zero is special\n\t *  cased here but still creates a valid nc_ctx, and goes\n\t *  through normal formatting in case special formatting has\n\t *  been requested (e.g. forced exponential format: 0 -> \"0e+0\").\n\t */\n\n\t/* Would be nice to bulk clear the allocation, but the context\n\t * is 1-2 kilobytes and nothing should rely on it being zeroed.\n\t */\n#if 0\n\tDUK_MEMZERO((void *) nc_ctx, sizeof(*nc_ctx));  /* slow init, do only for slow path cases */\n#endif\n\n\tnc_ctx->is_s2n = 0;\n\tnc_ctx->b = 2;\n\tnc_ctx->B = radix;\n\tnc_ctx->abs_pos = 0;\n\tif (flags & DUK_N2S_FLAG_FIXED_FORMAT) {\n\t\tnc_ctx->is_fixed = 1;\n\t\tif (flags & DUK_N2S_FLAG_FRACTION_DIGITS) {\n\t\t\t/* absolute req_digits; e.g. digits = 1 -> last digit is 0,\n\t\t\t * but add an extra digit for rounding.\n\t\t\t */\n\t\t\tnc_ctx->abs_pos = 1;\n\t\t\tnc_ctx->req_digits = (-digits + 1) - 1;\n\t\t} else {\n\t\t\tnc_ctx->req_digits = digits + 1;\n\t\t}\n\t} else {\n\t\tnc_ctx->is_fixed = 0;\n\t\tnc_ctx->req_digits = 0;\n\t}\n\n\tif (c == DUK_FP_ZERO) {\n\t\t/* Zero special case: fake requested number of zero digits; ensure\n\t\t * no sign bit is printed.  Relative and absolute fixed format\n\t\t * require separate handling.\n\t\t */\n\t\tduk_small_int_t count;\n\t\tif (nc_ctx->is_fixed) {\n\t\t\tif (nc_ctx->abs_pos) {\n\t\t\t\tcount = digits + 2;  /* lead zero + 'digits' fractions + 1 for rounding */\n\t\t\t} else {\n\t\t\t\tcount = digits + 1;  /* + 1 for rounding */\n\t\t\t}\n\t\t} else {\n\t\t\tcount = 1;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"count=%ld\", (long) count));\n\t\tDUK_ASSERT(count >= 1);\n\t\tDUK_MEMZERO((void *) nc_ctx->digits, (size_t) count);\n\t\tnc_ctx->count = count;\n\t\tnc_ctx->k = 1;  /* 0.000... */\n\t\tneg = 0;\n\t\tgoto zero_skip;\n\t}\n\n\tduk__dragon4_double_to_ctx(nc_ctx, x);   /* -> sets 'f' and 'e' */\n\tDUK__BI_PRINT(\"f\", &nc_ctx->f);\n\tDUK_DDD(DUK_DDDPRINT(\"e=%ld\", (long) nc_ctx->e));\n\n\t/*\n\t *  Dragon4 slow path digit generation.\n\t */\n\n\tduk__dragon4_prepare(nc_ctx);  /* setup many variables in nc_ctx */\n\n\tDUK_DDD(DUK_DDDPRINT(\"after prepare:\"));\n\tDUK__BI_PRINT(\"r\", &nc_ctx->r);\n\tDUK__BI_PRINT(\"s\", &nc_ctx->s);\n\tDUK__BI_PRINT(\"mp\", &nc_ctx->mp);\n\tDUK__BI_PRINT(\"mm\", &nc_ctx->mm);\n\n\tduk__dragon4_scale(nc_ctx);\n\n\tDUK_DDD(DUK_DDDPRINT(\"after scale; k=%ld\", (long) nc_ctx->k));\n\tDUK__BI_PRINT(\"r\", &nc_ctx->r);\n\tDUK__BI_PRINT(\"s\", &nc_ctx->s);\n\tDUK__BI_PRINT(\"mp\", &nc_ctx->mp);\n\tDUK__BI_PRINT(\"mm\", &nc_ctx->mm);\n\n\tduk__dragon4_generate(nc_ctx);\n\n\t/*\n\t *  Convert and push final string.\n\t */\n\n zero_skip:\n\n\tif (flags & DUK_N2S_FLAG_FIXED_FORMAT) {\n\t\t/* Perform fixed-format rounding. */\n\t\tduk_small_int_t roundpos;\n\t\tif (flags & DUK_N2S_FLAG_FRACTION_DIGITS) {\n\t\t\t/* 'roundpos' is relative to nc_ctx->k and increases to the right\n\t\t\t * (opposite of how 'k' changes).\n\t\t\t */\n\t\t\troundpos = -digits;  /* absolute position for digit considered for rounding */\n\t\t\troundpos = nc_ctx->k - roundpos;\n\t\t} else {\n\t\t\troundpos = digits;\n\t\t}\n\t\tDUK_DDD(DUK_DDDPRINT(\"rounding: k=%ld, count=%ld, digits=%ld, roundpos=%ld\",\n\t\t                     (long) nc_ctx->k, (long) nc_ctx->count, (long) digits, (long) roundpos));\n\t\t(void) duk__dragon4_fixed_format_round(nc_ctx, roundpos);\n\n\t\t/* Note: 'count' is currently not adjusted by rounding (i.e. the\n\t\t * digits are not \"chopped off\".  That shouldn't matter because\n\t\t * the digit position (absolute or relative) is passed on to the\n\t\t * convert-and-push function.\n\t\t */\n\t}\n\n\tduk__dragon4_convert_and_push(nc_ctx, thr, radix, digits, flags, neg);\n}\n\n/*\n *  Exposed string-to-number API\n *\n *  Input: [ string ]\n *  Output: [ number ]\n *\n *  If number parsing fails, a NaN is pushed as the result.  If number parsing\n *  fails due to an internal error, an InternalError is thrown.\n */\n\nDUK_INTERNAL void duk_numconv_parse(duk_hthread *thr, duk_small_int_t radix, duk_small_uint_t flags) {\n\tduk__numconv_stringify_ctx nc_ctx_alloc;  /* large context; around 2kB now */\n\tduk__numconv_stringify_ctx *nc_ctx = &nc_ctx_alloc;\n\tduk_double_t res;\n\tduk_hstring *h_str;\n\tduk_small_int_t expt;\n\tduk_small_int_t expt_neg;\n\tduk_small_int_t expt_adj;\n\tduk_small_int_t neg;\n\tduk_small_int_t dig;\n\tduk_small_int_t dig_whole;\n\tduk_small_int_t dig_lzero;\n\tduk_small_int_t dig_frac;\n\tduk_small_int_t dig_expt;\n\tduk_small_int_t dig_prec;\n\tconst duk__exp_limits *explim;\n\tconst duk_uint8_t *p;\n\tduk_small_int_t ch;\n\n\tDUK_DDD(DUK_DDDPRINT(\"parse number: %!T, radix=%ld, flags=0x%08lx\",\n\t                     (duk_tval *) duk_get_tval(thr, -1),\n\t                     (long) radix, (unsigned long) flags));\n\n\tDUK_ASSERT(radix >= 2 && radix <= 36);\n\tDUK_ASSERT(radix - 2 < (duk_small_int_t) sizeof(duk__str2num_digits_for_radix));\n\n\t/*\n\t *  Preliminaries: trim, sign, Infinity check\n\t *\n\t *  We rely on the interned string having a NUL terminator, which will\n\t *  cause a parse failure wherever it is encountered.  As a result, we\n\t *  don't need separate pointer checks.\n\t *\n\t *  There is no special parsing for 'NaN' in the specification although\n\t *  'Infinity' (with an optional sign) is allowed in some contexts.\n\t *  Some contexts allow plus/minus sign, while others only allow the\n\t *  minus sign (like JSON.parse()).\n\t *\n\t *  Automatic hex number detection (leading '0x' or '0X') and octal\n\t *  number detection (leading '0' followed by at least one octal digit)\n\t *  is done here too.\n\t *\n\t *  Symbols are not explicitly rejected here (that's up to the caller).\n\t *  If a symbol were passed here, it should ultimately safely fail\n\t *  parsing due to a syntax error.\n\t */\n\n\tif (flags & DUK_S2N_FLAG_TRIM_WHITE) {\n\t\t/* Leading / trailing whitespace is sometimes accepted and\n\t\t * sometimes not.  After white space trimming, all valid input\n\t\t * characters are pure ASCII.\n\t\t */\n\t\tduk_trim(thr, -1);\n\t}\n\th_str = duk_require_hstring(thr, -1);\n\tDUK_ASSERT(h_str != NULL);\n\tp = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_str);\n\n\tneg = 0;\n\tch = *p;\n\tif (ch == (duk_small_int_t) '+') {\n\t\tif ((flags & DUK_S2N_FLAG_ALLOW_PLUS) == 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: leading plus sign not allowed\"));\n\t\t\tgoto parse_fail;\n\t\t}\n\t\tp++;\n\t} else if (ch == (duk_small_int_t) '-') {\n\t\tif ((flags & DUK_S2N_FLAG_ALLOW_MINUS) == 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: leading minus sign not allowed\"));\n\t\t\tgoto parse_fail;\n\t\t}\n\t\tp++;\n\t\tneg = 1;\n\t}\n\n\tif ((flags & DUK_S2N_FLAG_ALLOW_INF) && DUK_STRNCMP((const char *) p, \"Infinity\", 8) == 0) {\n\t\t/* Don't check for Infinity unless the context allows it.\n\t\t * 'Infinity' is a valid integer literal in e.g. base-36:\n\t\t *\n\t\t *   parseInt('Infinity', 36)\n\t\t *   1461559270678\n\t\t */\n\n\t\tif ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0 && p[8] != DUK_ASC_NUL) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: trailing garbage after matching 'Infinity' not allowed\"));\n\t\t\tgoto parse_fail;\n\t\t} else {\n\t\t\tres = DUK_DOUBLE_INFINITY;\n\t\t\tgoto negcheck_and_ret;\n\t\t}\n\t}\n\tch = *p;\n\tif (ch == (duk_small_int_t) '0') {\n\t\tduk_small_int_t detect_radix = 0;\n\t\tch = DUK_LOWERCASE_CHAR_ASCII(p[1]);  /* 'x' or 'X' -> 'x' */\n\t\tif ((flags & DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT) && ch == DUK_ASC_LC_X) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected 0x/0X hex prefix, changing radix and preventing fractions and exponent\"));\n\t\t\tdetect_radix = 16;\n#if 0\n\t\t} else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_LEGACY_OCT_INT) &&\n\t\t           (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9')) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected 0n oct prefix, changing radix and preventing fractions and exponent\"));\n\t\t\tdetect_radix = 8;\n\n\t\t\t/* NOTE: if this legacy octal case is added back, it has\n\t\t\t * different flags and 'p' advance so this needs to be\n\t\t\t * reworked.\n\t\t\t */\n\t\t\tflags |= DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO;  /* interpret e.g. '09' as '0', not NaN */\n\t\t\tp += 1;\n#endif\n\t\t} else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT) && ch == DUK_ASC_LC_O) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected 0o oct prefix, changing radix and preventing fractions and exponent\"));\n\t\t\tdetect_radix = 8;\n\t\t} else if ((flags & DUK_S2N_FLAG_ALLOW_AUTO_BIN_INT) && ch == DUK_ASC_LC_B) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"detected 0b bin prefix, changing radix and preventing fractions and exponent\"));\n\t\t\tdetect_radix = 2;\n\t\t}\n\t\tif (detect_radix > 0) {\n\t\t\tradix = detect_radix;\n\t\t\t/* Clear empty as zero flag: interpret e.g. '0x' and '0xg' as a NaN (= parse error) */\n\t\t\tflags &= ~(DUK_S2N_FLAG_ALLOW_EXP | DUK_S2N_FLAG_ALLOW_EMPTY_FRAC |\n\t\t\t           DUK_S2N_FLAG_ALLOW_FRAC | DUK_S2N_FLAG_ALLOW_NAKED_FRAC |\n\t\t\t           DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO);\n\t\t\tflags |= DUK_S2N_FLAG_ALLOW_LEADING_ZERO;  /* allow e.g. '0x0009' and '0b00010001' */\n\t\t\tp += 2;\n\t\t}\n\t}\n\n\t/*\n\t *  Scan number and setup for Dragon4.\n\t *\n\t *  The fast path case is detected during setup: an integer which\n\t *  can be converted without rounding, no net exponent.  The fast\n\t *  path could be implemented as a separate scan, but may not really\n\t *  be worth it: the multiplications for building 'f' are not\n\t *  expensive when 'f' is small.\n\t *\n\t *  The significand ('f') must contain enough bits of (apparent)\n\t *  accuracy, so that Dragon4 will generate enough binary output digits.\n\t *  For decimal numbers, this means generating a 20-digit significand,\n\t *  which should yield enough practical accuracy to parse IEEE doubles.\n\t *  In fact, the Ecmascript specification explicitly allows an\n\t *  implementation to treat digits beyond 20 as zeroes (and even\n\t *  to round the 20th digit upwards).  For non-decimal numbers, the\n\t *  appropriate number of digits has been precomputed for comparable\n\t *  accuracy.\n\t *\n\t *  Digit counts:\n\t *\n\t *    [ dig_lzero ]\n\t *      |\n\t *     .+-..---[ dig_prec ]----.\n\t *     |  ||                   |\n\t *     0000123.456789012345678901234567890e+123456\n\t *     |     | |                         |  |    |\n\t *     `--+--' `------[ dig_frac ]-------'  `-+--'\n\t *        |                                   |\n\t *    [ dig_whole ]                       [ dig_expt ]\n\t *\n\t *    dig_frac and dig_expt are -1 if not present\n\t *    dig_lzero is only computed for whole number part\n\t *\n\t *  Parsing state\n\t *\n\t *     Parsing whole part      dig_frac < 0 AND dig_expt < 0\n\t *     Parsing fraction part   dig_frac >= 0 AND dig_expt < 0\n\t *     Parsing exponent part   dig_expt >= 0   (dig_frac may be < 0 or >= 0)\n\t *\n\t *  Note: in case we hit an implementation limit (like exponent range),\n\t *  we should throw an error, NOT return NaN or Infinity.  Even with\n\t *  very large exponent (or significand) values the final result may be\n\t *  finite, so NaN/Infinity would be incorrect.\n\t */\n\n\tduk__bi_set_small(&nc_ctx->f, 0);\n\tdig_prec = 0;\n\tdig_lzero = 0;\n\tdig_whole = 0;\n\tdig_frac = -1;\n\tdig_expt = -1;\n\texpt = 0;\n\texpt_adj = 0;  /* essentially tracks digit position of lowest 'f' digit */\n\texpt_neg = 0;\n\tfor (;;) {\n\t\tch = *p++;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"parse digits: p=%p, ch='%c' (%ld), expt=%ld, expt_adj=%ld, \"\n\t\t                     \"dig_whole=%ld, dig_frac=%ld, dig_expt=%ld, dig_lzero=%ld, dig_prec=%ld\",\n\t\t                     (const void *) p, (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : '?'), (long) ch,\n\t\t                     (long) expt, (long) expt_adj, (long) dig_whole, (long) dig_frac,\n\t\t                     (long) dig_expt, (long) dig_lzero, (long) dig_prec));\n\t\tDUK__BI_PRINT(\"f\", &nc_ctx->f);\n\n\t\t/* Most common cases first. */\n\t\tif (ch >= (duk_small_int_t) '0' && ch <= (duk_small_int_t) '9') {\n\t\t\tdig = (duk_small_int_t) ch - '0' + 0;\n\t\t} else if (ch == (duk_small_int_t) '.') {\n\t\t\t/* A leading digit is not required in some cases, e.g. accept \".123\".\n\t\t\t * In other cases (JSON.parse()) a leading digit is required.  This\n\t\t\t * is checked for after the loop.\n\t\t\t */\n\t\t\tif (dig_frac >= 0 || dig_expt >= 0) {\n\t\t\t\tif (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"garbage termination (invalid period)\"));\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: period not allowed\"));\n\t\t\t\t\tgoto parse_fail;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ((flags & DUK_S2N_FLAG_ALLOW_FRAC) == 0) {\n\t\t\t\t/* Some contexts don't allow fractions at all; this can't be a\n\t\t\t\t * post-check because the state ('f' and expt) would be incorrect.\n\t\t\t\t */\n\t\t\t\tif (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"garbage termination (invalid first period)\"));\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: fraction part not allowed\"));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"start fraction part\"));\n\t\t\tdig_frac = 0;\n\t\t\tcontinue;\n\t\t} else if (ch == (duk_small_int_t) 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"NUL termination\"));\n\t\t\tbreak;\n\t\t} else if ((flags & DUK_S2N_FLAG_ALLOW_EXP) &&\n\t\t           dig_expt < 0 && (ch == (duk_small_int_t) 'e' || ch == (duk_small_int_t) 'E')) {\n\t\t\t/* Note: we don't parse back exponent notation for anything else\n\t\t\t * than radix 10, so this is not an ambiguous check (e.g. hex\n\t\t\t * exponent values may have 'e' either as a significand digit\n\t\t\t * or as an exponent separator).\n\t\t\t *\n\t\t\t * If the exponent separator occurs twice, 'e' will be interpreted\n\t\t\t * as a digit (= 14) and will be rejected as an invalid decimal\n\t\t\t * digit.\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"start exponent part\"));\n\n\t\t\t/* Exponent without a sign or with a +/- sign is accepted\n\t\t\t * by all call sites (even JSON.parse()).\n\t\t\t */\n\t\t\tch = *p;\n\t\t\tif (ch == (duk_small_int_t) '-') {\n\t\t\t\texpt_neg = 1;\n\t\t\t\tp++;\n\t\t\t} else if (ch == (duk_small_int_t) '+') {\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tdig_expt = 0;\n\t\t\tcontinue;\n\t\t} else if (ch >= (duk_small_int_t) 'a' && ch <= (duk_small_int_t) 'z') {\n\t\t\tdig = (duk_small_int_t) (ch - (duk_small_int_t) 'a' + 0x0a);\n\t\t} else if (ch >= (duk_small_int_t) 'A' && ch <= (duk_small_int_t) 'Z') {\n\t\t\tdig = (duk_small_int_t) (ch - (duk_small_int_t) 'A' + 0x0a);\n\t\t} else {\n\t\t\tdig = 255;  /* triggers garbage digit check below */\n\t\t}\n\t\tDUK_ASSERT((dig >= 0 && dig <= 35) || dig == 255);\n\n\t\tif (dig >= radix) {\n\t\t\tif (flags & DUK_S2N_FLAG_ALLOW_GARBAGE) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"garbage termination\"));\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: trailing garbage or invalid digit\"));\n\t\t\t\tgoto parse_fail;\n\t\t\t}\n\t\t}\n\n\t\tif (dig_expt < 0) {\n\t\t\t/* whole or fraction digit */\n\n\t\t\tif (dig_prec < duk__str2num_digits_for_radix[radix - 2]) {\n\t\t\t\t/* significant from precision perspective */\n\n\t\t\t\tduk_small_int_t f_zero = duk__bi_is_zero(&nc_ctx->f);\n\t\t\t\tif (f_zero && dig == 0) {\n\t\t\t\t\t/* Leading zero is not counted towards precision digits; not\n\t\t\t\t\t * in the integer part, nor in the fraction part.\n\t\t\t\t\t */\n\t\t\t\t\tif (dig_frac < 0) {\n\t\t\t\t\t\tdig_lzero++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t/* XXX: join these ops (multiply-accumulate), but only if\n\t\t\t\t\t * code footprint decreases.\n\t\t\t\t\t */\n\t\t\t\t\tduk__bi_mul_small(&nc_ctx->t1, &nc_ctx->f, (duk_uint32_t) radix);\n\t\t\t\t\tduk__bi_add_small(&nc_ctx->f, &nc_ctx->t1, (duk_uint32_t) dig);\n\t\t\t\t\tdig_prec++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t/* Ignore digits beyond a radix-specific limit, but note them\n\t\t\t\t * in expt_adj.\n\t\t\t\t */\n\t\t\t\texpt_adj++;\n\t\t\t}\n\n\t\t\tif (dig_frac >= 0) {\n\t\t\t\tdig_frac++;\n\t\t\t\texpt_adj--;\n\t\t\t} else {\n\t\t\t\tdig_whole++;\n\t\t\t}\n\t\t} else {\n\t\t\t/* exponent digit */\n\n\t\t\texpt = expt * radix + dig;\n\t\t\tif (expt > DUK_S2N_MAX_EXPONENT) {\n\t\t\t\t/* impose a reasonable exponent limit, so that exp\n\t\t\t\t * doesn't need to get tracked using a bigint.\n\t\t\t\t */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: exponent too large\"));\n\t\t\t\tgoto parse_explimit_error;\n\t\t\t}\n\t\t\tdig_expt++;\n\t\t}\n\t}\n\n\t/* Leading zero. */\n\n\tif (dig_lzero > 0 && dig_whole > 1) {\n\t\tif ((flags & DUK_S2N_FLAG_ALLOW_LEADING_ZERO) == 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: leading zeroes not allowed in integer part\"));\n\t\t\tgoto parse_fail;\n\t\t}\n\t}\n\n\t/* Validity checks for various fraction formats (\"0.1\", \".1\", \"1.\", \".\"). */\n\n\tif (dig_whole == 0) {\n\t\tif (dig_frac == 0) {\n\t\t\t/* \".\" is not accepted in any format */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: plain period without leading or trailing digits\"));\n\t\t\tgoto parse_fail;\n\t\t} else if (dig_frac > 0) {\n\t\t\t/* \".123\" */\n\t\t\tif ((flags & DUK_S2N_FLAG_ALLOW_NAKED_FRAC) == 0) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: fraction part not allowed without \"\n\t\t\t\t                     \"leading integer digit(s)\"));\n\t\t\t\tgoto parse_fail;\n\t\t\t}\n\t\t} else {\n\t\t\t/* empty (\"\") is allowed in some formats (e.g. Number(''), as zero */\n\t\t\tif ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_AS_ZERO) == 0) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: empty string not allowed (as zero)\"));\n\t\t\t\tgoto parse_fail;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif (dig_frac == 0) {\n\t\t\t/* \"123.\" is allowed in some formats */\n\t\t\tif ((flags & DUK_S2N_FLAG_ALLOW_EMPTY_FRAC) == 0) {\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: empty fractions\"));\n\t\t\t\tgoto parse_fail;\n\t\t\t}\n\t\t} else if (dig_frac > 0) {\n\t\t\t/* \"123.456\" */\n\t\t\t;\n\t\t} else {\n\t\t\t/* \"123\" */\n\t\t\t;\n\t\t}\n\t}\n\n\t/* Exponent without digits (e.g. \"1e\" or \"1e+\").  If trailing garbage is\n\t * allowed, ignore exponent part as garbage (= parse as \"1\", i.e. exp 0).\n\t */\n\n\tif (dig_expt == 0) {\n\t\tif ((flags & DUK_S2N_FLAG_ALLOW_GARBAGE) == 0) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"parse failed: empty exponent\"));\n\t\t\tgoto parse_fail;\n\t\t}\n\t\tDUK_ASSERT(expt == 0);\n\t}\n\n\tif (expt_neg) {\n\t\texpt = -expt;\n\t}\n\tDUK_DDD(DUK_DDDPRINT(\"expt=%ld, expt_adj=%ld, net exponent -> %ld\",\n\t                     (long) expt, (long) expt_adj, (long) (expt + expt_adj)));\n\texpt += expt_adj;\n\n\t/* Fast path check. */\n\n\tif (nc_ctx->f.n <= 1 &&   /* 32-bit value */\n\t    expt == 0    /* no net exponent */) {\n\t\t/* Fast path is triggered for no exponent and also for balanced exponent\n\t\t * and fraction parts, e.g. for \"1.23e2\" == \"123\".  Remember to respect\n\t\t * zero sign.\n\t\t */\n\n\t\t/* XXX: could accept numbers larger than 32 bits, e.g. up to 53 bits? */\n\t\tDUK_DDD(DUK_DDDPRINT(\"fast path number parse\"));\n\t\tif (nc_ctx->f.n == 1) {\n\t\t\tres = (double) nc_ctx->f.v[0];\n\t\t} else {\n\t\t\tres = 0.0;\n\t\t}\n\t\tgoto negcheck_and_ret;\n\t}\n\n\t/* Significand ('f') padding. */\n\n\twhile (dig_prec < duk__str2num_digits_for_radix[radix - 2]) {\n\t\t/* Pad significand with \"virtual\" zero digits so that Dragon4 will\n\t\t * have enough (apparent) precision to work with.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"dig_prec=%ld, pad significand with zero\", (long) dig_prec));\n\t\tduk__bi_mul_small_copy(&nc_ctx->f, (duk_uint32_t) radix, &nc_ctx->t1);\n\t\tDUK__BI_PRINT(\"f\", &nc_ctx->f);\n\t\texpt--;\n\t\tdig_prec++;\n\t}\n\n\tDUK_DDD(DUK_DDDPRINT(\"final exponent: %ld\", (long) expt));\n\n\t/* Detect zero special case. */\n\n\tif (nc_ctx->f.n == 0) {\n\t\t/* This may happen even after the fast path check, if exponent is\n\t\t * not balanced (e.g. \"0e1\").  Remember to respect zero sign.\n\t\t */\n\t\tDUK_DDD(DUK_DDDPRINT(\"significand is zero\"));\n\t\tres = 0.0;\n\t\tgoto negcheck_and_ret;\n\t}\n\n\n\t/* Quick reject of too large or too small exponents.  This check\n\t * would be incorrect for zero (e.g. \"0e1000\" is zero, not Infinity)\n\t * so zero check must be above.\n\t */\n\n\texplim = &duk__str2num_exp_limits[radix - 2];\n\tif (expt > explim->upper) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"exponent too large -> infinite\"));\n\t\tres = (duk_double_t) DUK_DOUBLE_INFINITY;\n\t\tgoto negcheck_and_ret;\n\t} else if (expt < explim->lower) {\n\t\tDUK_DDD(DUK_DDDPRINT(\"exponent too small -> zero\"));\n\t\tres = (duk_double_t) 0.0;\n\t\tgoto negcheck_and_ret;\n\t}\n\n\tnc_ctx->is_s2n = 1;\n\tnc_ctx->e = expt;\n\tnc_ctx->b = radix;\n\tnc_ctx->B = 2;\n\tnc_ctx->is_fixed = 1;\n\tnc_ctx->abs_pos = 0;\n\tnc_ctx->req_digits = 53 + 1;\n\n\tDUK__BI_PRINT(\"f\", &nc_ctx->f);\n\tDUK_DDD(DUK_DDDPRINT(\"e=%ld\", (long) nc_ctx->e));\n\n\t/*\n\t *  Dragon4 slow path (binary) digit generation.\n\t *  An extra digit is generated for rounding.\n\t */\n\n\tduk__dragon4_prepare(nc_ctx);  /* setup many variables in nc_ctx */\n\n\tDUK_DDD(DUK_DDDPRINT(\"after prepare:\"));\n\tDUK__BI_PRINT(\"r\", &nc_ctx->r);\n\tDUK__BI_PRINT(\"s\", &nc_ctx->s);\n\tDUK__BI_PRINT(\"mp\", &nc_ctx->mp);\n\tDUK__BI_PRINT(\"mm\", &nc_ctx->mm);\n\n\tduk__dragon4_scale(nc_ctx);\n\n\tDUK_DDD(DUK_DDDPRINT(\"after scale; k=%ld\", (long) nc_ctx->k));\n\tDUK__BI_PRINT(\"r\", &nc_ctx->r);\n\tDUK__BI_PRINT(\"s\", &nc_ctx->s);\n\tDUK__BI_PRINT(\"mp\", &nc_ctx->mp);\n\tDUK__BI_PRINT(\"mm\", &nc_ctx->mm);\n\n\tduk__dragon4_generate(nc_ctx);\n\n\tDUK_ASSERT(nc_ctx->count == 53 + 1);\n\n\t/*\n\t *  Convert binary digits into an IEEE double.  Need to handle\n\t *  denormals and rounding correctly.\n\t *\n\t *  Some call sites currently assume the result is always a\n\t *  non-fastint double.  If this is changed, check all call\n\t *  sites.\n\t */\n\n\tduk__dragon4_ctx_to_double(nc_ctx, &res);\n\tgoto negcheck_and_ret;\n\n negcheck_and_ret:\n\tif (neg) {\n\t\tres = -res;\n\t}\n\tduk_pop(thr);\n\tduk_push_number(thr, (double) res);\n\tDUK_DDD(DUK_DDDPRINT(\"result: %!T\", (duk_tval *) duk_get_tval(thr, -1)));\n\treturn;\n\n parse_fail:\n\tDUK_DDD(DUK_DDDPRINT(\"parse failed\"));\n\tduk_pop(thr);\n\tduk_push_nan(thr);\n\treturn;\n\n parse_explimit_error:\n\tDUK_DDD(DUK_DDDPRINT(\"parse failed, internal error, can't return a value\"));\n\tDUK_ERROR_RANGE(thr, \"exponent too large\");\n\treturn;\n}\n\n/* automatic undefs */\n#undef DUK__BI_MAX_PARTS\n#undef DUK__BI_PRINT\n#undef DUK__DIGITCHAR\n#undef DUK__DRAGON4_OUTPUT_PREINC\n#undef DUK__IEEE_DOUBLE_EXP_BIAS\n#undef DUK__IEEE_DOUBLE_EXP_MIN\n#undef DUK__MAX_FORMATTED_LENGTH\n#undef DUK__MAX_OUTPUT_DIGITS\n#undef DUK__NO_EXP\n#undef DUK__NUMCONV_CTX_BIGINTS_SIZE\n#undef DUK__NUMCONV_CTX_NUM_BIGINTS\n#line 1 \"duk_regexp_compiler.c\"\n/*\n *  Regexp compilation.\n *\n *  See doc/regexp.rst for a discussion of the compilation approach and\n *  current limitations.\n *\n *  Regexp bytecode assumes jumps can be expressed with signed 32-bit\n *  integers.  Consequently the bytecode size must not exceed 0x7fffffffL.\n *  The implementation casts duk_size_t (buffer size) to duk_(u)int32_t\n *  in many places.  Although this could be changed, the bytecode format\n *  limit would still prevent regexps exceeding the signed 32-bit limit\n *  from working.\n *\n *  XXX: The implementation does not prevent bytecode from exceeding the\n *  maximum supported size.  This could be done by limiting the maximum\n *  input string size (assuming an upper bound can be computed for number\n *  of bytecode bytes emitted per input byte) or checking buffer maximum\n *  size when emitting bytecode (slower).\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\n/*\n *  Helper macros\n */\n\n#define DUK__RE_INITIAL_BUFSIZE 64\n\n#define DUK__RE_BUFLEN(re_ctx) \\\n\tDUK_BW_GET_SIZE(re_ctx->thr, &re_ctx->bw)\n\n/*\n *  Disjunction struct: result of parsing a disjunction\n */\n\ntypedef struct {\n\t/* Number of characters that the atom matches (e.g. 3 for 'abc'),\n\t * -1 if atom is complex and number of matched characters either\n\t * varies or is not known.\n\t */\n\tduk_int32_t charlen;\n\n#if 0\n\t/* These are not needed to implement quantifier capture handling,\n\t * but might be needed at some point.\n\t */\n\n\t/* re_ctx->captures at start and end of atom parsing.\n\t * Since 'captures' indicates highest capture number emitted\n\t * so far in a DUK_REOP_SAVE, the captures numbers saved by\n\t * the atom are: ]start_captures,end_captures].\n\t */\n\tduk_uint32_t start_captures;\n\tduk_uint32_t end_captures;\n#endif\n} duk__re_disjunction_info;\n\n/*\n *  Encoding helpers\n *\n *  Some of the typing is bytecode based, e.g. slice sizes are unsigned 32-bit\n *  even though the buffer operations will use duk_size_t.\n */\n\n/* XXX: the insert helpers should ensure that the bytecode result is not\n * larger than expected (or at least assert for it).  Many things in the\n * bytecode, like skip offsets, won't work correctly if the bytecode is\n * larger than say 2G.\n */\n\nDUK_LOCAL duk_uint32_t duk__encode_i32(duk_int32_t x) {\n\tif (x < 0) {\n\t\treturn ((duk_uint32_t) (-x)) * 2 + 1;\n\t} else {\n\t\treturn ((duk_uint32_t) x) * 2;\n\t}\n}\n\n/* XXX: return type should probably be duk_size_t, or explicit checks are needed for\n * maximum size.\n */\nDUK_LOCAL duk_uint32_t duk__insert_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t x) {\n\tduk_uint8_t buf[DUK_UNICODE_MAX_XUTF8_LENGTH];\n\tduk_small_int_t len;\n\n\tlen = duk_unicode_encode_xutf8((duk_ucodepoint_t) x, buf);\n\tDUK_ASSERT(len >= 0);\n\tDUK_BW_INSERT_ENSURE_BYTES(re_ctx->thr, &re_ctx->bw, offset, buf, (duk_size_t) len);\n\treturn (duk_uint32_t) len;\n}\n\nDUK_LOCAL void duk__append_u32(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) {\n\tDUK_BW_WRITE_ENSURE_XUTF8(re_ctx->thr, &re_ctx->bw, x);\n}\n\nDUK_LOCAL void duk__append_7bit(duk_re_compiler_ctx *re_ctx, duk_uint32_t x) {\n#if defined(DUK_USE_PREFER_SIZE)\n\tduk__append_u32(re_ctx, x);\n#else\n\tDUK_ASSERT(x <= 0x7fU);\n\tDUK_BW_WRITE_ENSURE_U8(re_ctx->thr, &re_ctx->bw, (duk_uint8_t) x);\n#endif\n}\n\n#if 0\nDUK_LOCAL void duk__append_2bytes(duk_re_compiler_ctx *re_ctx, duk_uint8_t x, duk_uint8_t y) {\n\tDUK_BW_WRITE_ENSURE_U8_2(re_ctx->thr, &re_ctx->bw, x, y);\n}\n#endif\n\nDUK_LOCAL duk_uint32_t duk__insert_i32(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t x) {\n\treturn duk__insert_u32(re_ctx, offset, duk__encode_i32(x));\n}\n\nDUK_LOCAL void duk__append_reop(duk_re_compiler_ctx *re_ctx, duk_uint32_t reop) {\n\tDUK_ASSERT(reop <= 0x7fU);\n\t(void) duk__append_7bit(re_ctx, reop);\n}\n\n#if 0  /* unused */\nDUK_LOCAL void duk__append_i32(duk_re_compiler_ctx *re_ctx, duk_int32_t x) {\n\tduk__append_u32(re_ctx, duk__encode_i32(x));\n}\n#endif\n\n/* special helper for emitting u16 lists (used for character ranges for built-in char classes) */\nDUK_LOCAL void duk__append_u16_list(duk_re_compiler_ctx *re_ctx, const duk_uint16_t *values, duk_uint32_t count) {\n\t/* Call sites don't need the result length so it's not accumulated. */\n\twhile (count-- > 0) {\n\t\tduk__append_u32(re_ctx, (duk_uint32_t) (*values++));\n\t}\n}\n\nDUK_LOCAL void duk__insert_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_uint32_t data_offset, duk_uint32_t data_length) {\n\tDUK_BW_INSERT_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, offset, data_offset, data_length);\n}\n\nDUK_LOCAL void duk__append_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) {\n\tDUK_BW_WRITE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length);\n}\n\nDUK_LOCAL void duk__remove_slice(duk_re_compiler_ctx *re_ctx, duk_uint32_t data_offset, duk_uint32_t data_length) {\n\tDUK_BW_REMOVE_ENSURE_SLICE(re_ctx->thr, &re_ctx->bw, data_offset, data_length);\n}\n\n/*\n *  Insert a jump offset at 'offset' to complete an instruction\n *  (the jump offset is always the last component of an instruction).\n *  The 'skip' argument must be computed relative to 'offset',\n *  -without- taking into account the skip field being inserted.\n *\n *       ... A B C ins X Y Z ...   (ins may be a JUMP, SPLIT1/SPLIT2, etc)\n *   =>  ... A B C ins SKIP X Y Z\n *\n *  Computing the final (adjusted) skip value, which is relative to the\n *  first byte of the next instruction, is a bit tricky because of the\n *  variable length UTF-8 encoding.  See doc/regexp.rst for discussion.\n */\nDUK_LOCAL duk_uint32_t duk__insert_jump_offset(duk_re_compiler_ctx *re_ctx, duk_uint32_t offset, duk_int32_t skip) {\n#if 0\n\t/* Iterative solution. */\n\tif (skip < 0) {\n\t\tduk_small_int_t len;\n\t\t/* two encoding attempts suffices */\n\t\tlen = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip));\n\t\tlen = duk_unicode_get_xutf8_length((duk_codepoint_t) duk__encode_i32(skip - (duk_int32_t) len));\n\t\tDUK_ASSERT(duk_unicode_get_xutf8_length(duk__encode_i32(skip - (duk_int32_t) len)) == len);  /* no change */\n\t\tskip -= (duk_int32_t) len;\n\t}\n#endif\n\n#if defined(DUK_USE_PREFER_SIZE)\n\t/* Closed form solution, this produces smallest code.\n\t * See re_neg_jump_offset (closed2).\n\t */\n\tif (skip < 0) {\n\t\tskip--;\n\t\tif (skip < -0x3fL) {\n\t\t\tskip--;\n\t\t}\n\t\tif (skip < -0x3ffL) {\n\t\t\tskip--;\n\t\t}\n\t\tif (skip < -0x7fffL) {\n\t\t\tskip--;\n\t\t}\n\t\tif (skip < -0xfffffL) {\n\t\t\tskip--;\n\t\t}\n\t\tif (skip < -0x1ffffffL) {\n\t\t\tskip--;\n\t\t}\n\t\tif (skip < -0x3fffffffL) {\n\t\t\tskip--;\n\t\t}\n\t}\n#else  /* DUK_USE_PREFER_SIZE */\n\t/* Closed form solution, this produces fastest code.\n\t * See re_neg_jump_offset (closed1).\n\t */\n\tif (skip < 0) {\n\t\tif (skip >= -0x3eL) {\n\t\t\tskip -= 1;\n\t\t} else if (skip >= -0x3fdL) {\n\t\t\tskip -= 2;\n\t\t} else if (skip >= -0x7ffcL) {\n\t\t\tskip -= 3;\n\t\t} else if (skip >= -0xffffbL) {\n\t\t\tskip -= 4;\n\t\t} else if (skip >= -0x1fffffaL) {\n\t\t\tskip -= 5;\n\t\t} else if (skip >= -0x3ffffff9L) {\n\t\t\tskip -= 6;\n\t\t} else {\n\t\t\tskip -= 7;\n\t\t}\n\t}\n#endif  /* DUK_USE_PREFER_SIZE */\n\n\treturn duk__insert_i32(re_ctx, offset, skip);\n}\n\nDUK_LOCAL duk_uint32_t duk__append_jump_offset(duk_re_compiler_ctx *re_ctx, duk_int32_t skip) {\n\treturn (duk_uint32_t) duk__insert_jump_offset(re_ctx, (duk_uint32_t) DUK__RE_BUFLEN(re_ctx), skip);\n}\n\n/*\n *  duk_re_range_callback for generating character class ranges.\n *\n *  When ignoreCase is false, the range is simply emitted as is.  We don't,\n *  for instance, eliminate duplicates or overlapping ranges in a character\n *  class.\n *\n *  When ignoreCase is true but the 'direct' flag is set, the caller knows\n *  that the range canonicalizes to itself for case insensitive matching,\n *  so the range is emitted as is.  This is mainly useful for built-in ranges\n *  like \\W.\n *\n *  Otherwise, when ignoreCase is true, the range needs to be normalized\n *  through canonicalization.  Unfortunately a canonicalized version of a\n *  continuous range is not necessarily continuous (e.g. [x-{] is continuous\n *  but [X-{] is not).  As a result, a single input range may expand to a lot\n *  of output ranges.  The current algorithm creates the canonicalized ranges\n *  footprint efficiently at the cost of compile time execution time; see\n *  doc/regexp.rst for discussion, and some more details below.\n *\n *  Note that the ctx->nranges is a context-wide temporary value.  This is OK\n *  because there cannot be multiple character classes being parsed\n *  simultaneously.\n *\n *  More detail on canonicalization:\n *\n *  Conceptually, a range is canonicalized by scanning the entire range,\n *  normalizing each codepoint by converting it to uppercase, and generating\n *  a set of result ranges.\n *\n *  Ideally a minimal set of output ranges would be emitted by merging all\n *  possible ranges even if they're emitted out of sequence.  Because the\n *  input string is also case normalized during matching, some codepoints\n *  never occur at runtime; these \"don't care\" codepoints can be included or\n *  excluded from ranges when merging/optimizing ranges.\n *\n *  The current algorithm does not do optimal range merging.  Rather, output\n *  codepoints are generated in sequence, and when the output codepoints are\n *  continuous (CP, CP+1, CP+2, ...), they are merged locally into as large a\n *  range as possible.  A small canonicalization bitmap is used to reduce\n *  actual codepoint canonicalizations which are quite slow at present.  The\n *  bitmap provides a \"codepoint block is continuous with respect to\n *  canonicalization\" for N-codepoint blocks.  This allows blocks to be\n *  skipped quickly.\n *\n *  There are a number of shortcomings and future work here:\n *\n *    - Individual codepoint normalizations are slow because they involve\n *      walking bit-packed rules without a lookup index.\n *\n *    - The conceptual algorithm needs to canonicalize every codepoint in the\n *      input range to figure out the output range(s).  Even with the small\n *      canonicalization bitmap the algorithm runs quite slowly for worst case\n *      inputs.  There are many data structure alternatives to improve this.\n *\n *    - While the current algorithm generates maximal output ranges when the\n *      output codepoints are emitted linearly, output ranges are not sorted or\n *      merged otherwise.  In the worst case a lot of ranges are emitted when\n *      most of the ranges could be merged.  In this process one could take\n *      advantage of \"don't care\" codepoints, which are never matched against at\n *      runtime due to canonicalization of input codepoints before comparison,\n *      to merge otherwise discontinuous output ranges.\n *\n *    - The runtime data structure is just a linear list of ranges to match\n *      against.  This can be quite slow if there are a lot of output ranges.\n *      There are various ways to make matching against the ranges faster,\n *      e.g. sorting the ranges and using a binary search; skip lists; tree\n *      based representations; full or approximate codepoint bitmaps, etc.\n *\n *    - Only BMP is supported, codepoints above BMP are assumed to canonicalize\n *      to themselves.  For now this is one place where we don't want to\n *      support chars outside the BMP, because the exhaustive search would be\n *      massively larger.  It would be possible to support non-BMP with a\n *      different algorithm, or perhaps doing case normalization only at match\n *      time.\n */\n\nDUK_LOCAL void duk__regexp_emit_range(duk_re_compiler_ctx *re_ctx, duk_codepoint_t r1, duk_codepoint_t r2) {\n\tDUK_ASSERT(r2 >= r1);\n\tduk__append_u32(re_ctx, (duk_uint32_t) r1);\n\tduk__append_u32(re_ctx, (duk_uint32_t) r2);\n\tre_ctx->nranges++;\n}\n\n#if defined(DUK_USE_REGEXP_CANON_BITMAP)\n/* Find next canonicalization discontinuity (conservative estimate) starting\n * from 'start', not exceeding 'end'.  If continuity is fine up to 'end'\n * inclusive, returns end.  Minimum possible return value is start.\n */\nDUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) {\n\tduk_uint_t start_blk;\n\tduk_uint_t end_blk;\n\tduk_uint_t blk;\n\tduk_uint_t offset;\n\tduk_uint8_t mask;\n\n\t/* Inclusive block range. */\n\tDUK_ASSERT(start >= 0);\n\tDUK_ASSERT(end >= 0);\n\tDUK_ASSERT(end >= start);\n\tstart_blk = (duk_uint_t) (start >> DUK_CANON_BITMAP_BLKSHIFT);\n\tend_blk = (duk_uint_t) (end >> DUK_CANON_BITMAP_BLKSHIFT);\n\n\tfor (blk = start_blk; blk <= end_blk; blk++) {\n\t\toffset = blk >> 3;\n\t\tmask = 1U << (blk & 0x07);\n\t\tif (offset >= sizeof(duk_unicode_re_canon_bitmap)) {\n\t\t\t/* Reached non-BMP range which is assumed continuous. */\n\t\t\treturn end;\n\t\t}\n\t\tDUK_ASSERT(offset < sizeof(duk_unicode_re_canon_bitmap));\n\t\tif ((duk_unicode_re_canon_bitmap[offset] & mask) == 0) {\n\t\t\t/* Block is discontinuous, continuity is guaranteed\n\t\t\t * only up to end of previous block (+1 for exclusive\n\t\t\t * return value => start of current block).  Start\n\t\t\t * block requires special handling.\n\t\t\t */\n\t\t\tif (blk > start_blk) {\n\t\t\t\treturn (duk_codepoint_t) (blk << DUK_CANON_BITMAP_BLKSHIFT);\n\t\t\t} else {\n\t\t\t\treturn start;\n\t\t\t}\n\t\t}\n\t}\n\tDUK_ASSERT(blk == end_blk + 1);  /* Reached end block which is continuous. */\n\treturn end;\n}\n#else  /* DUK_USE_REGEXP_CANON_BITMAP */\nDUK_LOCAL duk_codepoint_t duk__re_canon_next_discontinuity(duk_codepoint_t start, duk_codepoint_t end) {\n\tDUK_ASSERT(start >= 0);\n\tDUK_ASSERT(end >= 0);\n\tDUK_ASSERT(end >= start);\n\tif (start >= 0x10000) {\n\t\t/* Even without the bitmap, treat non-BMP as continuous. */\n\t\treturn end;\n\t}\n\treturn start;\n}\n#endif  /* DUK_USE_REGEXP_CANON_BITMAP */\n\nDUK_LOCAL void duk__regexp_generate_ranges(void *userdata, duk_codepoint_t r1, duk_codepoint_t r2, duk_bool_t direct) {\n\tduk_re_compiler_ctx *re_ctx = (duk_re_compiler_ctx *) userdata;\n\tduk_codepoint_t r_start;\n\tduk_codepoint_t r_end;\n\tduk_codepoint_t i;\n\tduk_codepoint_t t;\n\tduk_codepoint_t r_disc;\n\n\tDUK_DD(DUK_DDPRINT(\"duk__regexp_generate_ranges(): re_ctx=%p, range=[%ld,%ld] direct=%ld\",\n\t                   (void *) re_ctx, (long) r1, (long) r2, (long) direct));\n\n\tDUK_ASSERT(r2 >= r1);  /* SyntaxError for out of order range. */\n\n\tif (direct || (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) == 0) {\n\t\tDUK_DD(DUK_DDPRINT(\"direct or not case sensitive, emit range: [%ld,%ld]\", (long) r1, (long) r2));\n\t\tduk__regexp_emit_range(re_ctx, r1, r2);\n\t\treturn;\n\t}\n\n\tDUK_DD(DUK_DDPRINT(\"case sensitive, process range: [%ld,%ld]\", (long) r1, (long) r2));\n\n\tr_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1);\n\tr_end = r_start;\n\n\tfor (i = r1 + 1; i <= r2;) {\n\t\t/* Input codepoint space processed up to i-1, and\n\t\t * current range in r_{start,end} is up-to-date\n\t\t * (inclusive) and may either break or continue.\n\t\t */\n\t\tr_disc = duk__re_canon_next_discontinuity(i, r2);\n\t\tDUK_ASSERT(r_disc >= i);\n\t\tDUK_ASSERT(r_disc <= r2);\n\n\t\tr_end += r_disc - i;  /* May be zero. */\n\t\tt = duk_unicode_re_canonicalize_char(re_ctx->thr, r_disc);\n\t\tif (t == r_end + 1) {\n\t\t\t/* Not actually a discontinuity, continue range\n\t\t\t * to r_disc and recheck.\n\t\t\t */\n\t\t\tr_end = t;\n\t\t} else {\n\t\t\tduk__regexp_emit_range(re_ctx, r_start, r_end);\n\t\t\tr_start = t;\n\t\t\tr_end = t;\n\t\t}\n\t\ti = r_disc + 1;  /* Guarantees progress. */\n\t}\n\tduk__regexp_emit_range(re_ctx, r_start, r_end);\n\n#if 0  /* Exhaustive search, very slow. */\n\tr_start = duk_unicode_re_canonicalize_char(re_ctx->thr, r1);\n\tr_end = r_start;\n\tfor (i = r1 + 1; i <= r2; i++) {\n\t\tt = duk_unicode_re_canonicalize_char(re_ctx->thr, i);\n\t\tif (t == r_end + 1) {\n\t\t\tr_end = t;\n\t\t} else {\n\t\t\tDUK_DD(DUK_DDPRINT(\"canonicalized, emit range: [%ld,%ld]\", (long) r_start, (long) r_end));\n\t\t\tduk__append_u32(re_ctx, (duk_uint32_t) r_start);\n\t\t\tduk__append_u32(re_ctx, (duk_uint32_t) r_end);\n\t\t\tre_ctx->nranges++;\n\t\t\tr_start = t;\n\t\t\tr_end = t;\n\t\t}\n\t}\n\tDUK_DD(DUK_DDPRINT(\"canonicalized, emit range: [%ld,%ld]\", (long) r_start, (long) r_end));\n\tduk__append_u32(re_ctx, (duk_uint32_t) r_start);\n\tduk__append_u32(re_ctx, (duk_uint32_t) r_end);\n\tre_ctx->nranges++;\n#endif\n}\n\n/*\n *  Parse regexp Disjunction.  Most of regexp compilation happens here.\n *\n *  Handles Disjunction, Alternative, and Term productions directly without\n *  recursion.  The only constructs requiring recursion are positive/negative\n *  lookaheads, capturing parentheses, and non-capturing parentheses.\n *\n *  The function determines whether the entire disjunction is a 'simple atom'\n *  (see doc/regexp.rst discussion on 'simple quantifiers') and if so,\n *  returns the atom character length which is needed by the caller to keep\n *  track of its own atom character length.  A disjunction with more than one\n *  alternative is never considered a simple atom (although in some cases\n *  that might be the case).\n *\n *  Return value: simple atom character length or < 0 if not a simple atom.\n *  Appends the bytecode for the disjunction matcher to the end of the temp\n *  buffer.\n *\n *  Regexp top level structure is:\n *\n *    Disjunction = Term*\n *                | Term* | Disjunction\n *\n *    Term = Assertion\n *         | Atom\n *         | Atom Quantifier\n *\n *  An empty Term sequence is a valid disjunction alternative (e.g. /|||c||/).\n *\n *  Notes:\n *\n *    * Tracking of the 'simple-ness' of the current atom vs. the entire\n *      disjunction are separate matters.  For instance, the disjunction\n *      may be complex, but individual atoms may be simple.  Furthermore,\n *      simple quantifiers are used whenever possible, even if the\n *      disjunction as a whole is complex.\n *\n *    * The estimate of whether an atom is simple is conservative now,\n *      and it would be possible to expand it.  For instance, captures\n *      cause the disjunction to be marked complex, even though captures\n *      -can- be handled by simple quantifiers with some minor modifications.\n *\n *    * Disjunction 'tainting' as 'complex' is handled at the end of the\n *      main for loop collectively for atoms.  Assertions, quantifiers,\n *      and '|' tokens need to taint the result manually if necessary.\n *      Assertions cannot add to result char length, only atoms (and\n *      quantifiers) can; currently quantifiers will taint the result\n *      as complex though.\n */\n\nDUK_LOCAL const duk_uint16_t * const duk__re_range_lookup1[3] = {\n\tduk_unicode_re_ranges_digit,\n\tduk_unicode_re_ranges_white,\n\tduk_unicode_re_ranges_wordchar\n};\nDUK_LOCAL const duk_uint8_t duk__re_range_lookup2[3] = {\n\tsizeof(duk_unicode_re_ranges_digit) / (2 * sizeof(duk_uint16_t)),\n\tsizeof(duk_unicode_re_ranges_white) / (2 * sizeof(duk_uint16_t)),\n\tsizeof(duk_unicode_re_ranges_wordchar) / (2 * sizeof(duk_uint16_t))\n};\n\nDUK_LOCAL void duk__append_range_atom_matcher(duk_re_compiler_ctx *re_ctx, duk_small_uint_t re_op, const duk_uint16_t *ranges, duk_small_uint_t count) {\n#if 0\n\tDUK_ASSERT(re_op <= 0x7fUL);\n\tDUK_ASSERT(count <= 0x7fUL);\n\tduk__append_2bytes(re_ctx, (duk_uint8_t) re_op, (duk_uint8_t) count);\n#endif\n\tduk__append_reop(re_ctx, re_op);\n\tduk__append_7bit(re_ctx, count);\n\tduk__append_u16_list(re_ctx, ranges, count * 2);\n}\n\nDUK_LOCAL void duk__parse_disjunction(duk_re_compiler_ctx *re_ctx, duk_bool_t expect_eof, duk__re_disjunction_info *out_atom_info) {\n\tduk_int32_t atom_start_offset = -1;                   /* negative -> no atom matched on previous round */\n\tduk_int32_t atom_char_length = 0;                     /* negative -> complex atom */\n\tduk_uint32_t atom_start_captures = re_ctx->captures;  /* value of re_ctx->captures at start of atom */\n\tduk_int32_t unpatched_disjunction_split = -1;\n\tduk_int32_t unpatched_disjunction_jump = -1;\n\tduk_uint32_t entry_offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx);\n\tduk_int32_t res_charlen = 0;  /* -1 if disjunction is complex, char length if simple */\n\tduk__re_disjunction_info tmp_disj;\n\n\tDUK_ASSERT(out_atom_info != NULL);\n\n\tif (re_ctx->recursion_depth >= re_ctx->recursion_limit) {\n\t\tDUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_COMPILER_RECURSION_LIMIT);\n\t}\n\tre_ctx->recursion_depth++;\n\n#if 0\n\tout_atom_info->start_captures = re_ctx->captures;\n#endif\n\n\tfor (;;) {\n\t\t/* atom_char_length, atom_start_offset, atom_start_offset reflect the\n\t\t * atom matched on the previous loop.  If a quantifier is encountered\n\t\t * on this loop, these are needed to handle the quantifier correctly.\n\t\t * new_atom_char_length etc are for the atom parsed on this round;\n\t\t * they're written to atom_char_length etc at the end of the round.\n\t\t */\n\t\tduk_int32_t new_atom_char_length;   /* char length of the atom parsed in this loop */\n\t\tduk_int32_t new_atom_start_offset;  /* bytecode start offset of the atom parsed in this loop\n\t\t                                     * (allows quantifiers to copy the atom bytecode)\n\t\t                                     */\n\t\tduk_uint32_t new_atom_start_captures;  /* re_ctx->captures at the start of the atom parsed in this loop */\n\n\t\tduk_lexer_parse_re_token(&re_ctx->lex, &re_ctx->curr_token);\n\n\t\tDUK_DD(DUK_DDPRINT(\"re token: %ld (num=%ld, char=%c)\",\n\t\t                   (long) re_ctx->curr_token.t,\n\t\t                   (long) re_ctx->curr_token.num,\n\t\t                   (re_ctx->curr_token.num >= 0x20 && re_ctx->curr_token.num <= 0x7e) ?\n\t\t                   (int) re_ctx->curr_token.num : (int) '?'));\n\n\t\t/* set by atom case clauses */\n\t\tnew_atom_start_offset = -1;\n\t\tnew_atom_char_length = -1;\n\t\tnew_atom_start_captures = re_ctx->captures;\n\n\t\tswitch (re_ctx->curr_token.t) {\n\t\tcase DUK_RETOK_DISJUNCTION: {\n\t\t\t/*\n\t\t\t *  The handling here is a bit tricky.  If a previous '|' has been processed,\n\t\t\t *  we have a pending split1 and a pending jump (for a previous match).  These\n\t\t\t *  need to be back-patched carefully.  See docs for a detailed example.\n\t\t\t */\n\n\t\t\t/* patch pending jump and split */\n\t\t\tif (unpatched_disjunction_jump >= 0) {\n\t\t\t\tduk_uint32_t offset;\n\n\t\t\t\tDUK_ASSERT(unpatched_disjunction_split >= 0);\n\t\t\t\toffset = (duk_uint32_t) unpatched_disjunction_jump;\n\t\t\t\toffset += duk__insert_jump_offset(re_ctx,\n\t\t\t\t                                  offset,\n\t\t\t\t                                  (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset));\n\t\t\t\t/* offset is now target of the pending split (right after jump) */\n\t\t\t\tduk__insert_jump_offset(re_ctx,\n\t\t\t\t                        (duk_uint32_t) unpatched_disjunction_split,\n\t\t\t\t                        (duk_int32_t) offset - unpatched_disjunction_split);\n\t\t\t}\n\n\t\t\t/* add a new pending split to the beginning of the entire disjunction */\n\t\t\t(void) duk__insert_u32(re_ctx,\n\t\t\t                       entry_offset,\n\t\t\t                       DUK_REOP_SPLIT1);   /* prefer direct execution */\n\t\t\tunpatched_disjunction_split = (duk_int32_t) (entry_offset + 1);   /* +1 for opcode */\n\n\t\t\t/* add a new pending match jump for latest finished alternative */\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_JUMP);\n\t\t\tunpatched_disjunction_jump = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\n\t\t\t/* 'taint' result as complex */\n\t\t\tres_charlen = -1;\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_QUANTIFIER: {\n\t\t\tif (atom_start_offset < 0) {\n\t\t\t\tDUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_NO_ATOM);\n\t\t\t}\n\t\t\tif (re_ctx->curr_token.qmin > re_ctx->curr_token.qmax) {\n\t\t\t\tDUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_INVALID_QUANTIFIER_VALUES);\n\t\t\t}\n\t\t\tif (atom_char_length >= 0) {\n\t\t\t\t/*\n\t\t\t\t *  Simple atom\n\t\t\t\t *\n\t\t\t\t *  If atom_char_length is zero, we'll have unbounded execution time for e.g.\n\t\t\t\t *  /()*x/.exec('x').  We can't just skip the match because it might have some\n\t\t\t\t *  side effects (for instance, if we allowed captures in simple atoms, the\n\t\t\t\t *  capture needs to happen).  The simple solution below is to force the\n\t\t\t\t *  quantifier to match at most once, since the additional matches have no effect.\n\t\t\t\t *\n\t\t\t\t *  With a simple atom there can be no capture groups, so no captures need\n\t\t\t\t *  to be reset.\n\t\t\t\t */\n\t\t\t\tduk_int32_t atom_code_length;\n\t\t\t\tduk_uint32_t offset;\n\t\t\t\tduk_uint32_t qmin, qmax;\n\n\t\t\t\tqmin = re_ctx->curr_token.qmin;\n\t\t\t\tqmax = re_ctx->curr_token.qmax;\n\t\t\t\tif (atom_char_length == 0) {\n\t\t\t\t\t/* qmin and qmax will be 0 or 1 */\n\t\t\t\t\tif (qmin > 1) {\n\t\t\t\t\t\tqmin = 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (qmax > 1) {\n\t\t\t\t\t\tqmax = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tduk__append_reop(re_ctx, DUK_REOP_MATCH);   /* complete 'sub atom' */\n\t\t\t\tatom_code_length = (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (duk_size_t) atom_start_offset);\n\n\t\t\t\toffset = (duk_uint32_t) atom_start_offset;\n\t\t\t\tif (re_ctx->curr_token.greedy) {\n\t\t\t\t\toffset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQGREEDY);\n\t\t\t\t\toffset += duk__insert_u32(re_ctx, offset, qmin);\n\t\t\t\t\toffset += duk__insert_u32(re_ctx, offset, qmax);\n\t\t\t\t\toffset += duk__insert_u32(re_ctx, offset, (duk_uint32_t) atom_char_length);\n\t\t\t\t\toffset += duk__insert_jump_offset(re_ctx, offset, atom_code_length);\n\t\t\t\t} else {\n\t\t\t\t\toffset += duk__insert_u32(re_ctx, offset, DUK_REOP_SQMINIMAL);\n\t\t\t\t\toffset += duk__insert_u32(re_ctx, offset, qmin);\n\t\t\t\t\toffset += duk__insert_u32(re_ctx, offset, qmax);\n\t\t\t\t\toffset += duk__insert_jump_offset(re_ctx, offset, atom_code_length);\n\t\t\t\t}\n\t\t\t\tDUK_UNREF(offset);  /* silence scan-build warning */\n\t\t\t} else {\n\t\t\t\t/*\n\t\t\t\t *  Complex atom\n\t\t\t\t *\n\t\t\t\t *  The original code is used as a template, and removed at the end\n\t\t\t\t *  (this differs from the handling of simple quantifiers).\n\t\t\t\t *\n\t\t\t\t *  NOTE: there is no current solution for empty atoms in complex\n\t\t\t\t *  quantifiers.  This would need some sort of a 'progress' instruction.\n\t\t\t\t *\n\t\t\t\t *  XXX: impose limit on maximum result size, i.e. atom_code_len * atom_copies?\n\t\t\t\t */\n\t\t\t\tduk_int32_t atom_code_length;\n\t\t\t\tduk_uint32_t atom_copies;\n\t\t\t\tduk_uint32_t tmp_qmin, tmp_qmax;\n\n\t\t\t\t/* pre-check how many atom copies we're willing to make (atom_copies not needed below) */\n\t\t\t\tatom_copies = (re_ctx->curr_token.qmax == DUK_RE_QUANTIFIER_INFINITE) ?\n\t\t\t\t              re_ctx->curr_token.qmin : re_ctx->curr_token.qmax;\n\t\t\t\tif (atom_copies > DUK_RE_MAX_ATOM_COPIES) {\n\t\t\t\t\tDUK_ERROR_RANGE(re_ctx->thr, DUK_STR_QUANTIFIER_TOO_MANY_COPIES);\n\t\t\t\t}\n\n\t\t\t\t/* wipe the capture range made by the atom (if any) */\n\t\t\t\tDUK_ASSERT(atom_start_captures <= re_ctx->captures);\n\t\t\t\tif (atom_start_captures != re_ctx->captures) {\n\t\t\t\t\tDUK_ASSERT(atom_start_captures < re_ctx->captures);\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"must wipe ]atom_start_captures,re_ctx->captures]: ]%ld,%ld]\",\n\t\t\t\t\t                     (long) atom_start_captures, (long) re_ctx->captures));\n\n\t\t\t\t\t/* insert (DUK_REOP_WIPERANGE, start, count) in reverse order so the order ends up right */\n\t\t\t\t\tduk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (re_ctx->captures - atom_start_captures) * 2U);\n\t\t\t\t\tduk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, (atom_start_captures + 1) * 2);\n\t\t\t\t\tduk__insert_u32(re_ctx, (duk_uint32_t) atom_start_offset, DUK_REOP_WIPERANGE);\n\t\t\t\t} else {\n\t\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"no need to wipe captures: atom_start_captures == re_ctx->captures == %ld\",\n\t\t\t\t\t                     (long) atom_start_captures));\n\t\t\t\t}\n\n\t\t\t\tatom_code_length = (duk_int32_t) DUK__RE_BUFLEN(re_ctx) - atom_start_offset;\n\n\t\t\t\t/* insert the required matches (qmin) by copying the atom */\n\t\t\t\ttmp_qmin = re_ctx->curr_token.qmin;\n\t\t\t\ttmp_qmax = re_ctx->curr_token.qmax;\n\t\t\t\twhile (tmp_qmin > 0) {\n\t\t\t\t\tduk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);\n\t\t\t\t\ttmp_qmin--;\n\t\t\t\t\tif (tmp_qmax != DUK_RE_QUANTIFIER_INFINITE) {\n\t\t\t\t\t\ttmp_qmax--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tDUK_ASSERT(tmp_qmin == 0);\n\n\t\t\t\t/* insert code for matching the remainder - infinite or finite */\n\t\t\t\tif (tmp_qmax == DUK_RE_QUANTIFIER_INFINITE) {\n\t\t\t\t\t/* reuse last emitted atom for remaining 'infinite' quantifier */\n\n\t\t\t\t\tif (re_ctx->curr_token.qmin == 0) {\n\t\t\t\t\t\t/* Special case: original qmin was zero so there is nothing\n\t\t\t\t\t\t * to repeat.  Emit an atom copy but jump over it here.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tduk__append_reop(re_ctx, DUK_REOP_JUMP);\n\t\t\t\t\t\tduk__append_jump_offset(re_ctx, atom_code_length);\n\t\t\t\t\t\tduk__append_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);\n\t\t\t\t\t}\n\t\t\t\t\tif (re_ctx->curr_token.greedy) {\n\t\t\t\t\t\tduk__append_reop(re_ctx, DUK_REOP_SPLIT2);   /* prefer jump */\n\t\t\t\t\t} else {\n\t\t\t\t\t\tduk__append_reop(re_ctx, DUK_REOP_SPLIT1);   /* prefer direct */\n\t\t\t\t\t}\n\t\t\t\t\tduk__append_jump_offset(re_ctx, -atom_code_length - 1);  /* -1 for opcode */\n\t\t\t\t} else {\n\t\t\t\t\t/*\n\t\t\t\t\t *  The remaining matches are emitted as sequence of SPLITs and atom\n\t\t\t\t\t *  copies; the SPLITs skip the remaining copies and match the sequel.\n\t\t\t\t\t *  This sequence needs to be emitted starting from the last copy\n\t\t\t\t\t *  because the SPLITs are variable length due to the variable length\n\t\t\t\t\t *  skip offset.  This causes a lot of memory copying now.\n\t\t\t\t\t *\n\t\t\t\t\t *  Example structure (greedy, match maximum # atoms):\n\t\t\t\t\t *\n\t\t\t\t\t *      SPLIT1 LSEQ\n\t\t\t\t\t *      (atom)\n\t\t\t\t\t *      SPLIT1 LSEQ    ; <- the byte length of this instruction is needed\n\t\t\t\t\t *      (atom)         ; to encode the above SPLIT1 correctly\n\t\t\t\t\t *      ...\n\t\t\t\t\t *   LSEQ:\n\t\t\t\t\t */\n\t\t\t\t\tduk_uint32_t offset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\t\t\twhile (tmp_qmax > 0) {\n\t\t\t\t\t\tduk__insert_slice(re_ctx, offset, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);\n\t\t\t\t\t\tif (re_ctx->curr_token.greedy) {\n\t\t\t\t\t\t\tduk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT1);   /* prefer direct */\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tduk__insert_u32(re_ctx, offset, DUK_REOP_SPLIT2);   /* prefer jump */\n\t\t\t\t\t\t}\n\t\t\t\t\t\tduk__insert_jump_offset(re_ctx,\n\t\t\t\t\t\t                        offset + 1,   /* +1 for opcode */\n\t\t\t\t\t\t                        (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1)));\n\t\t\t\t\t\ttmp_qmax--;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/* remove the original 'template' atom */\n\t\t\t\tduk__remove_slice(re_ctx, (duk_uint32_t) atom_start_offset, (duk_uint32_t) atom_code_length);\n\t\t\t}\n\n\t\t\t/* 'taint' result as complex */\n\t\t\tres_charlen = -1;\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ASSERT_START: {\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_ASSERT_START);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ASSERT_END: {\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_ASSERT_END);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ASSERT_WORD_BOUNDARY: {\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_ASSERT_WORD_BOUNDARY);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ASSERT_NOT_WORD_BOUNDARY: {\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_ASSERT_NOT_WORD_BOUNDARY);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ASSERT_START_POS_LOOKAHEAD:\n\t\tcase DUK_RETOK_ASSERT_START_NEG_LOOKAHEAD: {\n\t\t\tduk_uint32_t offset;\n\t\t\tduk_uint32_t opcode = (re_ctx->curr_token.t == DUK_RETOK_ASSERT_START_POS_LOOKAHEAD) ?\n\t\t\t                      DUK_REOP_LOOKPOS : DUK_REOP_LOOKNEG;\n\n\t\t\toffset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\tduk__parse_disjunction(re_ctx, 0, &tmp_disj);\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_MATCH);\n\n\t\t\t(void) duk__insert_u32(re_ctx, offset, opcode);\n\t\t\t(void) duk__insert_jump_offset(re_ctx,\n\t\t\t                               offset + 1,   /* +1 for opcode */\n\t\t\t                               (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - (offset + 1)));\n\n\t\t\t/* 'taint' result as complex -- this is conservative,\n\t\t\t * as lookaheads do not backtrack.\n\t\t\t */\n\t\t\tres_charlen = -1;\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_PERIOD: {\n\t\t\tnew_atom_char_length = 1;\n\t\t\tnew_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_PERIOD);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_CHAR: {\n\t\t\t/* Note: successive characters could be joined into string matches\n\t\t\t * but this is not trivial (consider e.g. '/xyz+/); see docs for\n\t\t\t * more discussion.\n\t\t\t *\n\t\t\t * No support for \\u{H+} yet.  While only BMP Unicode escapes are\n\t\t\t * supported for RegExps at present, 'ch' may still be a non-BMP\n\t\t\t * codepoint if it is decoded straight from source text UTF-8.\n\t\t\t * There's no non-BMP support yet so this is handled simply by\n\t\t\t * matching the non-BMP character (which is custom behavior).\n\t\t\t */\n\t\t\tduk_uint32_t ch;\n\n\t\t\tnew_atom_char_length = 1;\n\t\t\tnew_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_CHAR);\n\t\t\tch = re_ctx->curr_token.num;\n\t\t\tif (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) {\n\t\t\t\tch = (duk_uint32_t) duk_unicode_re_canonicalize_char(re_ctx->thr, (duk_codepoint_t) ch);\n\t\t\t}\n\t\t\tduk__append_u32(re_ctx, ch);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_DIGIT:\n\t\tcase DUK_RETOK_ATOM_NOT_DIGIT:\n\t\tcase DUK_RETOK_ATOM_WHITE:\n\t\tcase DUK_RETOK_ATOM_NOT_WHITE:\n\t\tcase DUK_RETOK_ATOM_WORD_CHAR:\n\t\tcase DUK_RETOK_ATOM_NOT_WORD_CHAR: {\n\t\t\tduk_small_uint_t re_op;\n\t\t\tduk_small_uint_t idx;\n\n\t\t\tnew_atom_char_length = 1;\n\t\t\tnew_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\n\t\t\tDUK_ASSERT((DUK_RETOK_ATOM_DIGIT & 0x01) != 0);\n\t\t\tDUK_ASSERT((DUK_RETOK_ATOM_WHITE & 0x01) != 0);\n\t\t\tDUK_ASSERT((DUK_RETOK_ATOM_WORD_CHAR & 0x01) != 0);\n\t\t\tDUK_ASSERT((DUK_RETOK_ATOM_NOT_DIGIT & 0x01) == 0);\n\t\t\tDUK_ASSERT((DUK_RETOK_ATOM_NOT_WHITE & 0x01) == 0);\n\t\t\tDUK_ASSERT((DUK_RETOK_ATOM_NOT_WORD_CHAR & 0x01) == 0);\n\t\t\tre_op = (re_ctx->curr_token.t & 0x01) ? DUK_REOP_RANGES : DUK_REOP_INVRANGES;\n\n\t\t\tDUK_ASSERT(DUK_RETOK_ATOM_WHITE == DUK_RETOK_ATOM_DIGIT + 2);\n\t\t\tDUK_ASSERT(DUK_RETOK_ATOM_WORD_CHAR == DUK_RETOK_ATOM_DIGIT + 4);\n\t\t\tidx = (duk_small_uint_t) ((re_ctx->curr_token.t - DUK_RETOK_ATOM_DIGIT) >> 1U);\n\t\t\tDUK_ASSERT(idx <= 2U);  /* Assume continuous token numbers; also checks negative underflow. */\n\n\t\t\tduk__append_range_atom_matcher(re_ctx, re_op, duk__re_range_lookup1[idx], duk__re_range_lookup2[idx]);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_BACKREFERENCE: {\n\t\t\tduk_uint32_t backref = (duk_uint32_t) re_ctx->curr_token.num;\n\t\t\tif (backref > re_ctx->highest_backref) {\n\t\t\t\tre_ctx->highest_backref = backref;\n\t\t\t}\n\t\t\tnew_atom_char_length = -1;   /* mark as complex */\n\t\t\tnew_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_BACKREFERENCE);\n\t\t\tduk__append_u32(re_ctx, backref);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_START_CAPTURE_GROUP: {\n\t\t\tduk_uint32_t cap;\n\n\t\t\tnew_atom_char_length = -1;   /* mark as complex (capture handling) */\n\t\t\tnew_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\tcap = ++re_ctx->captures;\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_SAVE);\n\t\t\tduk__append_u32(re_ctx, cap * 2);\n\t\t\tduk__parse_disjunction(re_ctx, 0, &tmp_disj);  /* retval (sub-atom char length) unused, tainted as complex above */\n\t\t\tduk__append_reop(re_ctx, DUK_REOP_SAVE);\n\t\t\tduk__append_u32(re_ctx, cap * 2 + 1);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_START_NONCAPTURE_GROUP: {\n\t\t\tnew_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\tduk__parse_disjunction(re_ctx, 0, &tmp_disj);\n\t\t\tnew_atom_char_length = tmp_disj.charlen;\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_START_CHARCLASS:\n\t\tcase DUK_RETOK_ATOM_START_CHARCLASS_INVERTED: {\n\t\t\t/*\n\t\t\t *  Range parsing is done with a special lexer function which calls\n\t\t\t *  us for every range parsed.  This is different from how rest of\n\t\t\t *  the parsing works, but avoids a heavy, arbitrary size intermediate\n\t\t\t *  value type to hold the ranges.\n\t\t\t *\n\t\t\t *  Another complication is the handling of character ranges when\n\t\t\t *  case insensitive matching is used (see docs for discussion).\n\t\t\t *  The range handler callback given to the lexer takes care of this\n\t\t\t *  as well.\n\t\t\t *\n\t\t\t *  Note that duplicate ranges are not eliminated when parsing character\n\t\t\t *  classes, so that canonicalization of\n\t\t\t *\n\t\t\t *    [0-9a-fA-Fx-{]\n\t\t\t *\n\t\t\t *  creates the result (note the duplicate ranges):\n\t\t\t *\n\t\t\t *    [0-9A-FA-FX-Z{-{]\n\t\t\t *\n\t\t\t *  where [x-{] is split as a result of canonicalization.  The duplicate\n\t\t\t *  ranges are not a semantics issue: they work correctly.\n\t\t\t */\n\n\t\t\tduk_uint32_t offset;\n\n\t\t\tDUK_DD(DUK_DDPRINT(\"character class\"));\n\n\t\t\t/* insert ranges instruction, range count patched in later */\n\t\t\tnew_atom_char_length = 1;\n\t\t\tnew_atom_start_offset = (duk_int32_t) DUK__RE_BUFLEN(re_ctx);\n\t\t\tduk__append_reop(re_ctx,\n\t\t\t                 (re_ctx->curr_token.t == DUK_RETOK_ATOM_START_CHARCLASS) ?\n\t\t\t                 DUK_REOP_RANGES : DUK_REOP_INVRANGES);\n\t\t\toffset = (duk_uint32_t) DUK__RE_BUFLEN(re_ctx);    /* patch in range count later */\n\n\t\t\t/* parse ranges until character class ends */\n\t\t\tre_ctx->nranges = 0;    /* note: ctx-wide temporary */\n\t\t\tduk_lexer_parse_re_ranges(&re_ctx->lex, duk__regexp_generate_ranges, (void *) re_ctx);\n\n\t\t\t/* insert range count */\n\t\t\tduk__insert_u32(re_ctx, offset, re_ctx->nranges);\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_RETOK_ATOM_END_GROUP: {\n\t\t\tif (expect_eof) {\n\t\t\t\tDUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_CLOSING_PAREN);\n\t\t\t}\n\t\t\tgoto done;\n\t\t}\n\t\tcase DUK_RETOK_EOF: {\n\t\t\tif (!expect_eof) {\n\t\t\t\tDUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_END_OF_PATTERN);\n\t\t\t}\n\t\t\tgoto done;\n\t\t}\n\t\tdefault: {\n\t\t\tDUK_ERROR_SYNTAX(re_ctx->thr, DUK_STR_UNEXPECTED_REGEXP_TOKEN);\n\t\t}\n\t\t}\n\n\t\t/* a complex (new) atom taints the result */\n\t\tif (new_atom_start_offset >= 0) {\n\t\t\tif (new_atom_char_length < 0) {\n\t\t\t\tres_charlen = -1;\n\t\t\t} else if (res_charlen >= 0) {\n\t\t\t\t/* only advance if not tainted */\n\t\t\t\tres_charlen += new_atom_char_length;\n\t\t\t}\n\t\t}\n\n\t\t/* record previous atom info in case next token is a quantifier */\n\t\tatom_start_offset = new_atom_start_offset;\n\t\tatom_char_length = new_atom_char_length;\n\t\tatom_start_captures = new_atom_start_captures;\n\t}\n\n done:\n\n\t/* finish up pending jump and split for last alternative */\n\tif (unpatched_disjunction_jump >= 0) {\n\t\tduk_uint32_t offset;\n\n\t\tDUK_ASSERT(unpatched_disjunction_split >= 0);\n\t\toffset = (duk_uint32_t) unpatched_disjunction_jump;\n\t\toffset += duk__insert_jump_offset(re_ctx,\n\t\t                                  offset,\n\t\t                                  (duk_int32_t) (DUK__RE_BUFLEN(re_ctx) - offset));\n\t\t/* offset is now target of the pending split (right after jump) */\n\t\tduk__insert_jump_offset(re_ctx,\n\t\t                        (duk_uint32_t) unpatched_disjunction_split,\n\t\t                        (duk_int32_t) offset - unpatched_disjunction_split);\n\t}\n\n#if 0\n\tout_atom_info->end_captures = re_ctx->captures;\n#endif\n\tout_atom_info->charlen = res_charlen;\n\tDUK_DDD(DUK_DDDPRINT(\"parse disjunction finished: charlen=%ld\",\n\t                     (long) out_atom_info->charlen));\n\n\tre_ctx->recursion_depth--;\n}\n\n/*\n *  Flags parsing (see E5 Section 15.10.4.1).\n */\n\nDUK_LOCAL duk_uint32_t duk__parse_regexp_flags(duk_hthread *thr, duk_hstring *h) {\n\tconst duk_uint8_t *p;\n\tconst duk_uint8_t *p_end;\n\tduk_uint32_t flags = 0;\n\n\tp = DUK_HSTRING_GET_DATA(h);\n\tp_end = p + DUK_HSTRING_GET_BYTELEN(h);\n\n\t/* Note: can be safely scanned as bytes (undecoded) */\n\n\twhile (p < p_end) {\n\t\tduk_uint8_t c = *p++;\n\t\tswitch (c) {\n\t\tcase (duk_uint8_t) 'g': {\n\t\t\tif (flags & DUK_RE_FLAG_GLOBAL) {\n\t\t\t\tgoto flags_error;\n\t\t\t}\n\t\t\tflags |= DUK_RE_FLAG_GLOBAL;\n\t\t\tbreak;\n\t\t}\n\t\tcase (duk_uint8_t) 'i': {\n\t\t\tif (flags & DUK_RE_FLAG_IGNORE_CASE) {\n\t\t\t\tgoto flags_error;\n\t\t\t}\n\t\t\tflags |= DUK_RE_FLAG_IGNORE_CASE;\n\t\t\tbreak;\n\t\t}\n\t\tcase (duk_uint8_t) 'm': {\n\t\t\tif (flags & DUK_RE_FLAG_MULTILINE) {\n\t\t\t\tgoto flags_error;\n\t\t\t}\n\t\t\tflags |= DUK_RE_FLAG_MULTILINE;\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tgoto flags_error;\n\t\t}\n\t\t}\n\t}\n\n\treturn flags;\n\n flags_error:\n\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_REGEXP_FLAGS);\n\treturn 0;  /* never here */\n}\n\n/*\n *  Create escaped RegExp source (E5 Section 15.10.3).\n *\n *  The current approach is to special case the empty RegExp\n *  ('' -> '(?:)') and otherwise replace unescaped '/' characters\n *  with '\\/' regardless of where they occur in the regexp.\n *\n *  Note that normalization does not seem to be necessary for\n *  RegExp literals (e.g. '/foo/') because to be acceptable as\n *  a RegExp literal, the text between forward slashes must\n *  already match the escaping requirements (e.g. must not contain\n *  unescaped forward slashes or be empty).  Escaping IS needed\n *  for expressions like 'new Regexp(\"...\", \"\")' however.\n *  Currently, we re-escape in either case.\n *\n *  Also note that we process the source here in UTF-8 encoded\n *  form.  This is correct, because any non-ASCII characters are\n *  passed through without change.\n */\n\nDUK_LOCAL void duk__create_escaped_source(duk_hthread *thr, int idx_pattern) {\n\tduk_hstring *h;\n\tconst duk_uint8_t *p;\n\tduk_bufwriter_ctx bw_alloc;\n\tduk_bufwriter_ctx *bw;\n\tduk_uint8_t *q;\n\tduk_size_t i, n;\n\tduk_uint_fast8_t c_prev, c;\n\n\th = duk_known_hstring(thr, idx_pattern);\n\tp = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h);\n\tn = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h);\n\n\tif (n == 0) {\n\t\tduk_push_string(thr, \"(?:)\");\n\t\treturn;\n\t}\n\n\tbw = &bw_alloc;\n\tDUK_BW_INIT_PUSHBUF(thr, bw, n);\n\tq = DUK_BW_GET_PTR(thr, bw);\n\n\tc_prev = (duk_uint_fast8_t) 0;\n\n\tfor (i = 0; i < n; i++) {\n\t\tc = p[i];\n\n\t\tq = DUK_BW_ENSURE_RAW(thr, bw, 2, q);\n\n\t\tif (c == (duk_uint_fast8_t) '/' && c_prev != (duk_uint_fast8_t) '\\\\') {\n\t\t\t/* Unescaped '/' ANYWHERE in the regexp (in disjunction,\n\t\t\t * inside a character class, ...) => same escape works.\n\t\t\t */\n\t\t\t*q++ = DUK_ASC_BACKSLASH;\n\t\t}\n\t\t*q++ = (duk_uint8_t) c;\n\n\t\tc_prev = c;\n\t}\n\n\tDUK_BW_SETPTR_AND_COMPACT(thr, bw, q);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe if input is safe. */\n\n\t/* [ ... escaped_source ] */\n}\n\n/*\n *  Exposed regexp compilation primitive.\n *\n *  Sets up a regexp compilation context, and calls duk__parse_disjunction() to do the\n *  actual parsing.  Handles generation of the compiled regexp header and the\n *  \"boilerplate\" capture of the matching substring (save 0 and 1).  Also does some\n *  global level regexp checks after recursive compilation has finished.\n *\n *  An escaped version of the regexp source, suitable for use as a RegExp instance\n *  'source' property (see E5 Section 15.10.3), is also left on the stack.\n *\n *  Input stack:  [ pattern flags ]\n *  Output stack: [ bytecode escaped_source ]  (both as strings)\n */\n\nDUK_INTERNAL void duk_regexp_compile(duk_hthread *thr) {\n\tduk_re_compiler_ctx re_ctx;\n\tduk_lexer_point lex_point;\n\tduk_hstring *h_pattern;\n\tduk_hstring *h_flags;\n\tduk__re_disjunction_info ign_disj;\n\n\tDUK_ASSERT(thr != NULL);\n\n\t/*\n\t *  Args validation\n\t */\n\n\t/* TypeError if fails */\n\th_pattern = duk_require_hstring_notsymbol(thr, -2);\n\th_flags = duk_require_hstring_notsymbol(thr, -1);\n\n\t/*\n\t *  Create normalized 'source' property (E5 Section 15.10.3).\n\t */\n\n\t/* [ ... pattern flags ] */\n\n\tduk__create_escaped_source(thr, -2);\n\n\t/* [ ... pattern flags escaped_source ] */\n\n\t/*\n\t *  Init compilation context\n\t */\n\n\t/* [ ... pattern flags escaped_source buffer ] */\n\n\tDUK_MEMZERO(&re_ctx, sizeof(re_ctx));\n\tDUK_LEXER_INITCTX(&re_ctx.lex);  /* duplicate zeroing, expect for (possible) NULL inits */\n\tre_ctx.thr = thr;\n\tre_ctx.lex.thr = thr;\n\tre_ctx.lex.input = DUK_HSTRING_GET_DATA(h_pattern);\n\tre_ctx.lex.input_length = DUK_HSTRING_GET_BYTELEN(h_pattern);\n\tre_ctx.lex.token_limit = DUK_RE_COMPILE_TOKEN_LIMIT;\n\tre_ctx.recursion_limit = DUK_USE_REGEXP_COMPILER_RECLIMIT;\n\tre_ctx.re_flags = duk__parse_regexp_flags(thr, h_flags);\n\n\tDUK_BW_INIT_PUSHBUF(thr, &re_ctx.bw, DUK__RE_INITIAL_BUFSIZE);\n\n\tDUK_DD(DUK_DDPRINT(\"regexp compiler ctx initialized, flags=0x%08lx, recursion_limit=%ld\",\n\t                   (unsigned long) re_ctx.re_flags, (long) re_ctx.recursion_limit));\n\n\t/*\n\t *  Init lexer\n\t */\n\n\tlex_point.offset = 0;  /* expensive init, just want to fill window */\n\tlex_point.line = 1;\n\tDUK_LEXER_SETPOINT(&re_ctx.lex, &lex_point);\n\n\t/*\n\t *  Compilation\n\t */\n\n\tDUK_DD(DUK_DDPRINT(\"starting regexp compilation\"));\n\n\tduk__append_reop(&re_ctx, DUK_REOP_SAVE);\n\tduk__append_7bit(&re_ctx, 0);\n\tduk__parse_disjunction(&re_ctx, 1 /*expect_eof*/, &ign_disj);\n\tduk__append_reop(&re_ctx, DUK_REOP_SAVE);\n\tduk__append_7bit(&re_ctx, 1);\n\tduk__append_reop(&re_ctx, DUK_REOP_MATCH);\n\n\t/*\n\t *  Check for invalid backreferences; note that it is NOT an error\n\t *  to back-reference a capture group which has not yet been introduced\n\t *  in the pattern (as in /\\1(foo)/); in fact, the backreference will\n\t *  always match!  It IS an error to back-reference a capture group\n\t *  which will never be introduced in the pattern.  Thus, we can check\n\t *  for such references only after parsing is complete.\n\t */\n\n\tif (re_ctx.highest_backref > re_ctx.captures) {\n\t\tDUK_ERROR_SYNTAX(thr, DUK_STR_INVALID_BACKREFS);\n\t}\n\n\t/*\n\t *  Emit compiled regexp header: flags, ncaptures\n\t *  (insertion order inverted on purpose)\n\t */\n\n\tduk__insert_u32(&re_ctx, 0, (re_ctx.captures + 1) * 2);\n\tduk__insert_u32(&re_ctx, 0, re_ctx.re_flags);\n\n\t/* [ ... pattern flags escaped_source buffer ] */\n\n\tDUK_BW_COMPACT(thr, &re_ctx.bw);\n\t(void) duk_buffer_to_string(thr, -1);  /* Safe because flags is at most 7 bit. */\n\n\t/* [ ... pattern flags escaped_source bytecode ] */\n\n\t/*\n\t *  Finalize stack\n\t */\n\n\tduk_remove(thr, -4);     /* -> [ ... flags escaped_source bytecode ] */\n\tduk_remove(thr, -3);     /* -> [ ... escaped_source bytecode ] */\n\n\tDUK_DD(DUK_DDPRINT(\"regexp compilation successful, bytecode: %!T, escaped source: %!T\",\n\t                   (duk_tval *) duk_get_tval(thr, -1), (duk_tval *) duk_get_tval(thr, -2)));\n}\n\n/*\n *  Create a RegExp instance (E5 Section 15.10.7).\n *\n *  Note: the output stack left by duk_regexp_compile() is directly compatible\n *  with the input here.\n *\n *  Input stack:  [ escaped_source bytecode ]  (both as strings)\n *  Output stack: [ RegExp ]\n */\n\nDUK_INTERNAL void duk_regexp_create_instance(duk_hthread *thr) {\n\tduk_hobject *h;\n\n\t/* [ ... escaped_source bytecode ] */\n\n\tduk_push_object(thr);\n\th = duk_known_hobject(thr, -1);\n\tduk_insert(thr, -3);\n\n\t/* [ ... regexp_object escaped_source bytecode ] */\n\n\tDUK_HOBJECT_SET_CLASS_NUMBER(h, DUK_HOBJECT_CLASS_REGEXP);\n\tDUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[DUK_BIDX_REGEXP_PROTOTYPE]);\n\n\tduk_xdef_prop_stridx_short(thr, -3, DUK_STRIDX_INT_BYTECODE, DUK_PROPDESC_FLAGS_NONE);\n\n\t/* [ ... regexp_object escaped_source ] */\n\n\t/* In ES2015 .source, and the .global, .multiline, etc flags are\n\t * inherited getters.  Store the escaped source as an internal\n\t * property for the getter.\n\t */\n\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_INT_SOURCE, DUK_PROPDESC_FLAGS_NONE);\n\n\t/* [ ... regexp_object ] */\n\n\tduk_push_int(thr, 0);\n\tduk_xdef_prop_stridx_short(thr, -2, DUK_STRIDX_LAST_INDEX, DUK_PROPDESC_FLAGS_W);\n\n\t/* [ ... regexp_object ] */\n}\n\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\n/* regexp support disabled */\n\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n\n/* automatic undefs */\n#undef DUK__RE_BUFLEN\n#undef DUK__RE_INITIAL_BUFSIZE\n#line 1 \"duk_regexp_executor.c\"\n/*\n *  Regexp executor.\n *\n *  Safety: the Ecmascript executor should prevent user from reading and\n *  replacing regexp bytecode.  Even so, the executor must validate all\n *  memory accesses etc.  When an invalid access is detected (e.g. a 'save'\n *  opcode to invalid, unallocated index) it should fail with an internal\n *  error but not cause a segmentation fault.\n *\n *  Notes:\n *\n *    - Backtrack counts are limited to unsigned 32 bits but should\n *      technically be duk_size_t for strings longer than 4G chars.\n *      This also requires a regexp bytecode change.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_REGEXP_SUPPORT)\n\n/*\n *  Helpers for UTF-8 handling\n *\n *  For bytecode readers the duk_uint32_t and duk_int32_t types are correct\n *  because they're used for more than just codepoints.\n */\n\nDUK_LOCAL duk_uint32_t duk__bc_get_u32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) {\n\treturn (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end);\n}\n\nDUK_LOCAL duk_int32_t duk__bc_get_i32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc) {\n\tduk_uint32_t t;\n\n\t/* signed integer encoding needed to work with UTF-8 */\n\tt = (duk_uint32_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, pc, re_ctx->bytecode, re_ctx->bytecode_end);\n\tif (t & 1) {\n\t\treturn -((duk_int32_t) (t >> 1));\n\t} else {\n\t\treturn (duk_int32_t) (t >> 1);\n\t}\n}\n\nDUK_LOCAL const duk_uint8_t *duk__utf8_backtrack(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) {\n\tconst duk_uint8_t *p;\n\n\t/* Note: allow backtracking from p == ptr_end */\n\tp = *ptr;\n\tif (p < ptr_start || p > ptr_end) {\n\t\tgoto fail;\n\t}\n\n\twhile (count > 0) {\n\t\tfor (;;) {\n\t\t\tp--;\n\t\t\tif (p < ptr_start) {\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif ((*p & 0xc0) != 0x80) {\n\t\t\t\t/* utf-8 continuation bytes have the form 10xx xxxx */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tcount--;\n\t}\n\t*ptr = p;\n\treturn p;\n\n fail:\n\tDUK_ERROR_INTERNAL(thr);\n\treturn NULL;  /* never here */\n}\n\nDUK_LOCAL const duk_uint8_t *duk__utf8_advance(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count) {\n\tconst duk_uint8_t *p;\n\n\tp = *ptr;\n\tif (p < ptr_start || p >= ptr_end) {\n\t\tgoto fail;\n\t}\n\n\twhile (count > 0) {\n\t\tfor (;;) {\n\t\t\tp++;\n\n\t\t\t/* Note: if encoding ends by hitting end of input, we don't check that\n\t\t\t * the encoding is valid, we just assume it is.\n\t\t\t */\n\t\t\tif (p >= ptr_end || ((*p & 0xc0) != 0x80)) {\n\t\t\t\t/* utf-8 continuation bytes have the form 10xx xxxx */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tcount--;\n\t}\n\n\t*ptr = p;\n\treturn p;\n\n fail:\n\tDUK_ERROR_INTERNAL(thr);\n\treturn NULL;  /* never here */\n}\n\n/*\n *  Helpers for dealing with the input string\n */\n\n/* Get a (possibly canonicalized) input character from current sp.  The input\n * itself is never modified, and captures always record non-canonicalized\n * characters even in case-insensitive matching.  Return <0 if out of input.\n */\nDUK_LOCAL duk_codepoint_t duk__inp_get_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp) {\n\tduk_codepoint_t res;\n\n\tif (*sp >= re_ctx->input_end) {\n\t\treturn -1;\n\t}\n\tres = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end);\n\tif (re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) {\n\t\tres = duk_unicode_re_canonicalize_char(re_ctx->thr, res);\n\t}\n\treturn res;\n}\n\nDUK_LOCAL const duk_uint8_t *duk__inp_backtrack(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp, duk_uint_fast32_t count) {\n\treturn duk__utf8_backtrack(re_ctx->thr, sp, re_ctx->input, re_ctx->input_end, count);\n}\n\n/* Backtrack utf-8 input and return a (possibly canonicalized) input character. */\nDUK_LOCAL duk_codepoint_t duk__inp_get_prev_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *sp) {\n\t/* note: caller 'sp' is intentionally not updated here */\n\t(void) duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) 1);\n\treturn duk__inp_get_cp(re_ctx, &sp);\n}\n\n/*\n *  Regexp recursive matching function.\n *\n *  Returns 'sp' on successful match (points to character after last matched one),\n *  NULL otherwise.\n *\n *  The C recursion depth limit check is only performed in this function, this\n *  suffices because the function is present in all true recursion required by\n *  regexp execution.\n */\n\nDUK_LOCAL const duk_uint8_t *duk__match_regexp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *pc, const duk_uint8_t *sp) {\n\tif (re_ctx->recursion_depth >= re_ctx->recursion_limit) {\n\t\tDUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT);\n\t}\n\tre_ctx->recursion_depth++;\n\n\tfor (;;) {\n\t\tduk_small_int_t op;\n\n\t\tif (re_ctx->steps_count >= re_ctx->steps_limit) {\n\t\t\tDUK_ERROR_RANGE(re_ctx->thr, DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT);\n\t\t}\n\t\tre_ctx->steps_count++;\n\n\t\t/* Opcodes are at most 7 bits now so they encode to one byte.  If this\n\t\t * were not the case or 'pc' is invalid here (due to a bug etc) we'll\n\t\t * still fail safely through the switch default case.\n\t\t */\n\t\tDUK_ASSERT(pc[0] <= 0x7fU);\n#if 0\n\t\top = (duk_small_int_t) duk__bc_get_u32(re_ctx, &pc);\n#endif\n\t\top = *pc++;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"match: rec=%ld, steps=%ld, pc (after op)=%ld, sp=%ld, op=%ld\",\n\t\t                     (long) re_ctx->recursion_depth,\n\t\t                     (long) re_ctx->steps_count,\n\t\t                     (long) (pc - re_ctx->bytecode),\n\t\t                     (long) (sp - re_ctx->input),\n\t\t                     (long) op));\n\n\t\tswitch (op) {\n\t\tcase DUK_REOP_MATCH: {\n\t\t\tgoto match;\n\t\t}\n\t\tcase DUK_REOP_CHAR: {\n\t\t\t/*\n\t\t\t *  Byte-based matching would be possible for case-sensitive\n\t\t\t *  matching but not for case-insensitive matching.  So, we\n\t\t\t *  match by decoding the input and bytecode character normally.\n\t\t\t *\n\t\t\t *  Bytecode characters are assumed to be already canonicalized.\n\t\t\t *  Input characters are canonicalized automatically by\n\t\t\t *  duk__inp_get_cp() if necessary.\n\t\t\t *\n\t\t\t *  There is no opcode for matching multiple characters.  The\n\t\t\t *  regexp compiler has trouble joining strings efficiently\n\t\t\t *  during compilation.  See doc/regexp.rst for more discussion.\n\t\t\t */\n\t\t\tduk_codepoint_t c1, c2;\n\n\t\t\tc1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc);\n\t\t\tDUK_ASSERT(!(re_ctx->re_flags & DUK_RE_FLAG_IGNORE_CASE) ||\n\t\t\t           c1 == duk_unicode_re_canonicalize_char(re_ctx->thr, c1));  /* canonicalized by compiler */\n\t\t\tc2 = duk__inp_get_cp(re_ctx, &sp);\n\t\t\t/* No need to check for c2 < 0 (end of input): because c1 >= 0, it\n\t\t\t * will fail the match below automatically and cause goto fail.\n\t\t\t */\n#if 0\n\t\t\tif (c2 < 0) {\n\t\t\t\tgoto fail;\n\t\t\t}\n#endif\n\t\t\tDUK_ASSERT(c1 >= 0);\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"char match, c1=%ld, c2=%ld\", (long) c1, (long) c2));\n\t\t\tif (c1 != c2) {\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_REOP_PERIOD: {\n\t\t\tduk_codepoint_t c;\n\n\t\t\tc = duk__inp_get_cp(re_ctx, &sp);\n\t\t\tif (c < 0 || duk_unicode_is_line_terminator(c)) {\n\t\t\t\t/* E5 Sections 15.10.2.8, 7.3 */\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_REOP_RANGES:\n\t\tcase DUK_REOP_INVRANGES: {\n\t\t\tduk_uint32_t n;\n\t\t\tduk_codepoint_t c;\n\t\t\tduk_small_int_t match;\n\n\t\t\tn = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tc = duk__inp_get_cp(re_ctx, &sp);\n\t\t\tif (c < 0) {\n\t\t\t\tgoto fail;\n\t\t\t}\n\n\t\t\tmatch = 0;\n\t\t\twhile (n) {\n\t\t\t\tduk_codepoint_t r1, r2;\n\t\t\t\tr1 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc);\n\t\t\t\tr2 = (duk_codepoint_t) duk__bc_get_u32(re_ctx, &pc);\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"matching ranges/invranges, n=%ld, r1=%ld, r2=%ld, c=%ld\",\n\t\t\t\t                     (long) n, (long) r1, (long) r2, (long) c));\n\t\t\t\tif (c >= r1 && c <= r2) {\n\t\t\t\t\t/* Note: don't bail out early, we must read all the ranges from\n\t\t\t\t\t * bytecode.  Another option is to skip them efficiently after\n\t\t\t\t\t * breaking out of here.  Prefer smallest code.\n\t\t\t\t\t */\n\t\t\t\t\tmatch = 1;\n\t\t\t\t}\n\t\t\t\tn--;\n\t\t\t}\n\n\t\t\tif (op == DUK_REOP_RANGES) {\n\t\t\t\tif (!match) {\n\t\t\t\t\tgoto fail;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(op == DUK_REOP_INVRANGES);\n\t\t\t\tif (match) {\n\t\t\t\t\tgoto fail;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_REOP_ASSERT_START: {\n\t\t\tduk_codepoint_t c;\n\n\t\t\tif (sp <= re_ctx->input) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) {\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tc = duk__inp_get_prev_cp(re_ctx, sp);\n\t\t\tif (duk_unicode_is_line_terminator(c)) {\n\t\t\t\t/* E5 Sections 15.10.2.8, 7.3 */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tcase DUK_REOP_ASSERT_END: {\n\t\t\tduk_codepoint_t c;\n\t\t\tconst duk_uint8_t *tmp_sp;\n\n\t\t\ttmp_sp = sp;\n\t\t\tc = duk__inp_get_cp(re_ctx, &tmp_sp);\n\t\t\tif (c < 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!(re_ctx->re_flags & DUK_RE_FLAG_MULTILINE)) {\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (duk_unicode_is_line_terminator(c)) {\n\t\t\t\t/* E5 Sections 15.10.2.8, 7.3 */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tcase DUK_REOP_ASSERT_WORD_BOUNDARY:\n\t\tcase DUK_REOP_ASSERT_NOT_WORD_BOUNDARY: {\n\t\t\t/*\n\t\t\t *  E5 Section 15.10.2.6.  The previous and current character\n\t\t\t *  should -not- be canonicalized as they are now.  However,\n\t\t\t *  canonicalization does not affect the result of IsWordChar()\n\t\t\t *  (which depends on Unicode characters never canonicalizing\n\t\t\t *  into ASCII characters) so this does not matter.\n\t\t\t */\n\t\t\tduk_small_int_t w1, w2;\n\n\t\t\tif (sp <= re_ctx->input) {\n\t\t\t\tw1 = 0;  /* not a wordchar */\n\t\t\t} else {\n\t\t\t\tduk_codepoint_t c;\n\t\t\t\tc = duk__inp_get_prev_cp(re_ctx, sp);\n\t\t\t\tw1 = duk_unicode_re_is_wordchar(c);\n\t\t\t}\n\t\t\tif (sp >= re_ctx->input_end) {\n\t\t\t\tw2 = 0;  /* not a wordchar */\n\t\t\t} else {\n\t\t\t\tconst duk_uint8_t *tmp_sp = sp;  /* dummy so sp won't get updated */\n\t\t\t\tduk_codepoint_t c;\n\t\t\t\tc = duk__inp_get_cp(re_ctx, &tmp_sp);\n\t\t\t\tw2 = duk_unicode_re_is_wordchar(c);\n\t\t\t}\n\n\t\t\tif (op == DUK_REOP_ASSERT_WORD_BOUNDARY) {\n\t\t\t\tif (w1 == w2) {\n\t\t\t\t\tgoto fail;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDUK_ASSERT(op == DUK_REOP_ASSERT_NOT_WORD_BOUNDARY);\n\t\t\t\tif (w1 != w2) {\n\t\t\t\t\tgoto fail;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_REOP_JUMP: {\n\t\t\tduk_int32_t skip;\n\n\t\t\tskip = duk__bc_get_i32(re_ctx, &pc);\n\t\t\tpc += skip;\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_REOP_SPLIT1: {\n\t\t\t/* split1: prefer direct execution (no jump) */\n\t\t\tconst duk_uint8_t *sub_sp;\n\t\t\tduk_int32_t skip;\n\n\t\t\tskip = duk__bc_get_i32(re_ctx, &pc);\n\t\t\tsub_sp = duk__match_regexp(re_ctx, pc, sp);\n\t\t\tif (sub_sp) {\n\t\t\t\tsp = sub_sp;\n\t\t\t\tgoto match;\n\t\t\t}\n\t\t\tpc += skip;\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_REOP_SPLIT2: {\n\t\t\t/* split2: prefer jump execution (not direct) */\n\t\t\tconst duk_uint8_t *sub_sp;\n\t\t\tduk_int32_t skip;\n\n\t\t\tskip = duk__bc_get_i32(re_ctx, &pc);\n\t\t\tsub_sp = duk__match_regexp(re_ctx, pc + skip, sp);\n\t\t\tif (sub_sp) {\n\t\t\t\tsp = sub_sp;\n\t\t\t\tgoto match;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase DUK_REOP_SQMINIMAL: {\n\t\t\tduk_uint32_t q, qmin, qmax;\n\t\t\tduk_int32_t skip;\n\t\t\tconst duk_uint8_t *sub_sp;\n\n\t\t\tqmin = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tqmax = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tskip = duk__bc_get_i32(re_ctx, &pc);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"minimal quantifier, qmin=%lu, qmax=%lu, skip=%ld\",\n\t\t\t                     (unsigned long) qmin, (unsigned long) qmax, (long) skip));\n\n\t\t\tq = 0;\n\t\t\twhile (q <= qmax) {\n\t\t\t\tif (q >= qmin) {\n\t\t\t\t\tsub_sp = duk__match_regexp(re_ctx, pc + skip, sp);\n\t\t\t\t\tif (sub_sp) {\n\t\t\t\t\t\tsp = sub_sp;\n\t\t\t\t\t\tgoto match;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsub_sp = duk__match_regexp(re_ctx, pc, sp);\n\t\t\t\tif (!sub_sp) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tsp = sub_sp;\n\t\t\t\tq++;\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tcase DUK_REOP_SQGREEDY: {\n\t\t\tduk_uint32_t q, qmin, qmax, atomlen;\n\t\t\tduk_int32_t skip;\n\t\t\tconst duk_uint8_t *sub_sp;\n\n\t\t\tqmin = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tqmax = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tatomlen = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tskip = duk__bc_get_i32(re_ctx, &pc);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"greedy quantifier, qmin=%lu, qmax=%lu, atomlen=%lu, skip=%ld\",\n\t\t\t                     (unsigned long) qmin, (unsigned long) qmax, (unsigned long) atomlen, (long) skip));\n\n\t\t\tq = 0;\n\t\t\twhile (q < qmax) {\n\t\t\t\tsub_sp = duk__match_regexp(re_ctx, pc, sp);\n\t\t\t\tif (!sub_sp) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tsp = sub_sp;\n\t\t\t\tq++;\n\t\t\t}\n\t\t\twhile (q >= qmin) {\n\t\t\t\tsub_sp = duk__match_regexp(re_ctx, pc + skip, sp);\n\t\t\t\tif (sub_sp) {\n\t\t\t\t\tsp = sub_sp;\n\t\t\t\t\tgoto match;\n\t\t\t\t}\n\t\t\t\tif (q == qmin) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\t/* Note: if atom were to contain e.g. captures, we would need to\n\t\t\t\t * re-match the atom to get correct captures.  Simply quantifiers\n\t\t\t\t * do not allow captures in their atom now, so this is not an issue.\n\t\t\t\t */\n\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"greedy quantifier, backtrack %ld characters (atomlen)\",\n\t\t\t\t                     (long) atomlen));\n\t\t\t\tsp = duk__inp_backtrack(re_ctx, &sp, (duk_uint_fast32_t) atomlen);\n\t\t\t\tq--;\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tcase DUK_REOP_SAVE: {\n\t\t\tduk_uint32_t idx;\n\t\t\tconst duk_uint8_t *old;\n\t\t\tconst duk_uint8_t *sub_sp;\n\n\t\t\tidx = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tif (idx >= re_ctx->nsaved) {\n\t\t\t\t/* idx is unsigned, < 0 check is not necessary */\n\t\t\t\tDUK_D(DUK_DPRINT(\"internal error, regexp save index insane: idx=%ld\", (long) idx));\n\t\t\t\tgoto internal_error;\n\t\t\t}\n\t\t\told = re_ctx->saved[idx];\n\t\t\tre_ctx->saved[idx] = sp;\n\t\t\tsub_sp = duk__match_regexp(re_ctx, pc, sp);\n\t\t\tif (sub_sp) {\n\t\t\t\tsp = sub_sp;\n\t\t\t\tgoto match;\n\t\t\t}\n\t\t\tre_ctx->saved[idx] = old;\n\t\t\tgoto fail;\n\t\t}\n\t\tcase DUK_REOP_WIPERANGE: {\n\t\t\t/* Wipe capture range and save old values for backtracking.\n\t\t\t *\n\t\t\t * XXX: this typically happens with a relatively small idx_count.\n\t\t\t * It might be useful to handle cases where the count is small\n\t\t\t * (say <= 8) by saving the values in stack instead.  This would\n\t\t\t * reduce memory churn and improve performance, at the cost of a\n\t\t\t * slightly higher code footprint.\n\t\t\t */\n\t\t\tduk_uint32_t idx_start, idx_count;\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\t\t\tduk_uint32_t idx_end, idx;\n#endif\n\t\t\tduk_uint8_t **range_save;\n\t\t\tconst duk_uint8_t *sub_sp;\n\n\t\t\tidx_start = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tidx_count = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"wipe saved range: start=%ld, count=%ld -> [%ld,%ld] (captures [%ld,%ld])\",\n\t\t\t                     (long) idx_start, (long) idx_count,\n\t\t\t                     (long) idx_start, (long) (idx_start + idx_count - 1),\n\t\t\t                     (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2)));\n\t\t\tif (idx_start + idx_count > re_ctx->nsaved || idx_count == 0) {\n\t\t\t\t/* idx is unsigned, < 0 check is not necessary */\n\t\t\t\tDUK_D(DUK_DPRINT(\"internal error, regexp wipe indices insane: idx_start=%ld, idx_count=%ld\",\n\t\t\t\t                 (long) idx_start, (long) idx_count));\n\t\t\t\tgoto internal_error;\n\t\t\t}\n\t\t\tDUK_ASSERT(idx_count > 0);\n\n\t\t\tduk_require_stack(re_ctx->thr, 1);\n\t\t\trange_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr,\n\t\t\t                                                           sizeof(duk_uint8_t *) * idx_count);\n\t\t\tDUK_ASSERT(range_save != NULL);\n\t\t\tDUK_MEMCPY(range_save, re_ctx->saved + idx_start, sizeof(duk_uint8_t *) * idx_count);\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\t\t\tidx_end = idx_start + idx_count;\n\t\t\tfor (idx = idx_start; idx < idx_end; idx++) {\n\t\t\t\tre_ctx->saved[idx] = NULL;\n\t\t\t}\n#else\n\t\t\tDUK_MEMZERO((void *) (re_ctx->saved + idx_start), sizeof(duk_uint8_t *) * idx_count);\n#endif\n\n\t\t\tsub_sp = duk__match_regexp(re_ctx, pc, sp);\n\t\t\tif (sub_sp) {\n\t\t\t\t/* match: keep wiped/resaved values */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"match: keep wiped/resaved values [%ld,%ld] (captures [%ld,%ld])\",\n\t\t\t\t                     (long) idx_start, (long) (idx_start + idx_count - 1),\n\t\t\t                             (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2)));\n\t\t\t\tduk_pop_unsafe(re_ctx->thr);\n\t\t\t\tsp = sub_sp;\n\t\t\t\tgoto match;\n\t\t\t}\n\n\t\t\t/* fail: restore saves */\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"fail: restore wiped/resaved values [%ld,%ld] (captures [%ld,%ld])\",\n\t\t\t                     (long) idx_start, (long) (idx_start + idx_count - 1),\n\t\t\t                     (long) (idx_start / 2), (long) ((idx_start + idx_count - 1) / 2)));\n\t\t\tDUK_MEMCPY((void *) (re_ctx->saved + idx_start),\n\t\t\t           (const void *) range_save,\n\t\t\t           sizeof(duk_uint8_t *) * idx_count);\n\t\t\tduk_pop_unsafe(re_ctx->thr);\n\t\t\tgoto fail;\n\t\t}\n\t\tcase DUK_REOP_LOOKPOS:\n\t\tcase DUK_REOP_LOOKNEG: {\n\t\t\t/*\n\t\t\t *  Needs a save of multiple saved[] entries depending on what range\n\t\t\t *  may be overwritten.  Because the regexp parser does no such analysis,\n\t\t\t *  we currently save the entire saved array here.  Lookaheads are thus\n\t\t\t *  a bit expensive.  Note that the saved array is not needed for just\n\t\t\t *  the lookahead sub-match, but for the matching of the entire sequel.\n\t\t\t *\n\t\t\t *  The temporary save buffer is pushed on to the valstack to handle\n\t\t\t *  errors correctly.  Each lookahead causes a C recursion and pushes\n\t\t\t *  more stuff on the value stack.  If the C recursion limit is less\n\t\t\t *  than the value stack slack, there is no need to check the stack.\n\t\t\t *  We do so regardless, just in case.\n\t\t\t */\n\n\t\t\tduk_int32_t skip;\n\t\t\tduk_uint8_t **full_save;\n\t\t\tconst duk_uint8_t *sub_sp;\n\n\t\t\tDUK_ASSERT(re_ctx->nsaved > 0);\n\n\t\t\tduk_require_stack(re_ctx->thr, 1);\n\t\t\tfull_save = (duk_uint8_t **) duk_push_fixed_buffer_nozero(re_ctx->thr,\n\t\t\t                                                          sizeof(duk_uint8_t *) * re_ctx->nsaved);\n\t\t\tDUK_ASSERT(full_save != NULL);\n\t\t\tDUK_MEMCPY(full_save, re_ctx->saved, sizeof(duk_uint8_t *) * re_ctx->nsaved);\n\n\t\t\tskip = duk__bc_get_i32(re_ctx, &pc);\n\t\t\tsub_sp = duk__match_regexp(re_ctx, pc, sp);\n\t\t\tif (op == DUK_REOP_LOOKPOS) {\n\t\t\t\tif (!sub_sp) {\n\t\t\t\t\tgoto lookahead_fail;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (sub_sp) {\n\t\t\t\t\tgoto lookahead_fail;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsub_sp = duk__match_regexp(re_ctx, pc + skip, sp);\n\t\t\tif (sub_sp) {\n\t\t\t\t/* match: keep saves */\n\t\t\t\tduk_pop_unsafe(re_ctx->thr);\n\t\t\t\tsp = sub_sp;\n\t\t\t\tgoto match;\n\t\t\t}\n\n\t\t\t/* fall through */\n\n\t\t lookahead_fail:\n\t\t\t/* fail: restore saves */\n\t\t\tDUK_MEMCPY((void *) re_ctx->saved,\n\t\t\t           (const void *) full_save,\n\t\t\t           sizeof(duk_uint8_t *) * re_ctx->nsaved);\n\t\t\tduk_pop_unsafe(re_ctx->thr);\n\t\t\tgoto fail;\n\t\t}\n\t\tcase DUK_REOP_BACKREFERENCE: {\n\t\t\t/*\n\t\t\t *  Byte matching for back-references would be OK in case-\n\t\t\t *  sensitive matching.  In case-insensitive matching we need\n\t\t\t *  to canonicalize characters, so back-reference matching needs\n\t\t\t *  to be done with codepoints instead.  So, we just decode\n\t\t\t *  everything normally here, too.\n\t\t\t *\n\t\t\t *  Note: back-reference index which is 0 or higher than\n\t\t\t *  NCapturingParens (= number of capturing parens in the\n\t\t\t *  -entire- regexp) is a compile time error.  However, a\n\t\t\t *  backreference referring to a valid capture which has\n\t\t\t *  not matched anything always succeeds!  See E5 Section\n\t\t\t *  15.10.2.9, step 5, sub-step 3.\n\t\t\t */\n\t\t\tduk_uint32_t idx;\n\t\t\tconst duk_uint8_t *p;\n\n\t\t\tidx = duk__bc_get_u32(re_ctx, &pc);\n\t\t\tidx = idx << 1;  /* backref n -> saved indices [n*2, n*2+1] */\n\t\t\tif (idx < 2 || idx + 1 >= re_ctx->nsaved) {\n\t\t\t\t/* regexp compiler should catch these */\n\t\t\t\tDUK_D(DUK_DPRINT(\"internal error, backreference index insane\"));\n\t\t\t\tgoto internal_error;\n\t\t\t}\n\t\t\tif (!re_ctx->saved[idx] || !re_ctx->saved[idx+1]) {\n\t\t\t\t/* capture is 'undefined', always matches! */\n\t\t\t\tDUK_DDD(DUK_DDDPRINT(\"backreference: saved[%ld,%ld] not complete, always match\",\n\t\t\t\t                     (long) idx, (long) (idx + 1)));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"backreference: match saved[%ld,%ld]\", (long) idx, (long) (idx + 1)));\n\n\t\t\tp = re_ctx->saved[idx];\n\t\t\twhile (p < re_ctx->saved[idx+1]) {\n\t\t\t\tduk_codepoint_t c1, c2;\n\n\t\t\t\t/* Note: not necessary to check p against re_ctx->input_end:\n\t\t\t\t * the memory access is checked by duk__inp_get_cp(), while\n\t\t\t\t * valid compiled regexps cannot write a saved[] entry\n\t\t\t\t * which points to outside the string.\n\t\t\t\t */\n\t\t\t\tc1 = duk__inp_get_cp(re_ctx, &p);\n\t\t\t\tDUK_ASSERT(c1 >= 0);\n\t\t\t\tc2 = duk__inp_get_cp(re_ctx, &sp);\n\t\t\t\t/* No need for an explicit c2 < 0 check: because c1 >= 0,\n\t\t\t\t * the comparison will always fail if c2 < 0.\n\t\t\t\t */\n#if 0\n\t\t\t\tif (c2 < 0) {\n\t\t\t\t\tgoto fail;\n\t\t\t\t}\n#endif\n\t\t\t\tif (c1 != c2) {\n\t\t\t\t\tgoto fail;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tDUK_D(DUK_DPRINT(\"internal error, regexp opcode error: %ld\", (long) op));\n\t\t\tgoto internal_error;\n\t\t}\n\t\t}\n\t}\n\n match:\n\tre_ctx->recursion_depth--;\n\treturn sp;\n\n fail:\n\tre_ctx->recursion_depth--;\n\treturn NULL;\n\n internal_error:\n\tDUK_ERROR_INTERNAL(re_ctx->thr);\n\treturn NULL;  /* never here */\n}\n\n/*\n *  Exposed matcher function which provides the semantics of RegExp.prototype.exec().\n *\n *  RegExp.prototype.test() has the same semantics as exec() but does not return the\n *  result object (which contains the matching string and capture groups).  Currently\n *  there is no separate test() helper, so a temporary result object is created and\n *  discarded if test() is needed.  This is intentional, to save code space.\n *\n *  Input stack:  [ ... re_obj input ]\n *  Output stack: [ ... result ]\n */\n\nDUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_global) {\n\tduk_re_matcher_ctx re_ctx;\n\tduk_hobject *h_regexp;\n\tduk_hstring *h_bytecode;\n\tduk_hstring *h_input;\n\tduk_uint8_t *p_buf;\n\tconst duk_uint8_t *pc;\n\tconst duk_uint8_t *sp;\n\tduk_small_int_t match = 0;\n\tduk_small_int_t global;\n\tduk_uint_fast32_t i;\n\tdouble d;\n\tduk_uint32_t char_offset;\n\n\tDUK_ASSERT(thr != NULL);\n\n\tDUK_DD(DUK_DDPRINT(\"regexp match: regexp=%!T, input=%!T\",\n\t                   (duk_tval *) duk_get_tval(thr, -2),\n\t                   (duk_tval *) duk_get_tval(thr, -1)));\n\n\t/*\n\t *  Regexp instance check, bytecode check, input coercion.\n\t *\n\t *  See E5 Section 15.10.6.\n\t */\n\n\t/* TypeError if wrong; class check, see E5 Section 15.10.6 */\n\th_regexp = duk_require_hobject_with_class(thr, -2, DUK_HOBJECT_CLASS_REGEXP);\n\tDUK_ASSERT(h_regexp != NULL);\n\tDUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_regexp) == DUK_HOBJECT_CLASS_REGEXP);\n\tDUK_UNREF(h_regexp);\n\n\th_input = duk_to_hstring(thr, -1);\n\tDUK_ASSERT(h_input != NULL);\n\n\tduk_get_prop_stridx_short(thr, -2, DUK_STRIDX_INT_BYTECODE);  /* [ ... re_obj input ] -> [ ... re_obj input bc ] */\n\th_bytecode = duk_require_hstring(thr, -1);  /* no regexp instance should exist without a non-configurable bytecode property */\n\tDUK_ASSERT(h_bytecode != NULL);\n\n\t/*\n\t *  Basic context initialization.\n\t *\n\t *  Some init values are read from the bytecode header\n\t *  whose format is (UTF-8 codepoints):\n\t *\n\t *    uint   flags\n\t *    uint   nsaved (even, 2n+2 where n = num captures)\n\t */\n\n\t/* [ ... re_obj input bc ] */\n\n\tDUK_MEMZERO(&re_ctx, sizeof(re_ctx));\n\n\tre_ctx.thr = thr;\n\tre_ctx.input = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input);\n\tre_ctx.input_end = re_ctx.input + DUK_HSTRING_GET_BYTELEN(h_input);\n\tre_ctx.bytecode = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_bytecode);\n\tre_ctx.bytecode_end = re_ctx.bytecode + DUK_HSTRING_GET_BYTELEN(h_bytecode);\n\tre_ctx.saved = NULL;\n\tre_ctx.recursion_limit = DUK_USE_REGEXP_EXECUTOR_RECLIMIT;\n\tre_ctx.steps_limit = DUK_RE_EXECUTE_STEPS_LIMIT;\n\n\t/* read header */\n\tpc = re_ctx.bytecode;\n\tre_ctx.re_flags = duk__bc_get_u32(&re_ctx, &pc);\n\tre_ctx.nsaved = duk__bc_get_u32(&re_ctx, &pc);\n\tre_ctx.bytecode = pc;\n\n\tDUK_ASSERT(DUK_RE_FLAG_GLOBAL < 0x10000UL);  /* must fit into duk_small_int_t */\n\tglobal = (duk_small_int_t) (force_global | (duk_small_int_t) (re_ctx.re_flags & DUK_RE_FLAG_GLOBAL));\n\n\tDUK_ASSERT(re_ctx.nsaved >= 2);\n\tDUK_ASSERT((re_ctx.nsaved % 2) == 0);\n\n\tp_buf = (duk_uint8_t *) duk_push_fixed_buffer(thr, sizeof(duk_uint8_t *) * re_ctx.nsaved);  /* rely on zeroing */\n\tDUK_UNREF(p_buf);\n\tre_ctx.saved = (const duk_uint8_t **) duk_get_buffer(thr, -1, NULL);\n\tDUK_ASSERT(re_ctx.saved != NULL);\n\n\t/* [ ... re_obj input bc saved_buf ] */\n\n#if defined(DUK_USE_EXPLICIT_NULL_INIT)\n\tfor (i = 0; i < re_ctx.nsaved; i++) {\n\t\tre_ctx.saved[i] = (duk_uint8_t *) NULL;\n\t}\n#elif defined(DUK_USE_ZERO_BUFFER_DATA)\n\t/* buffer is automatically zeroed */\n#else\n\tDUK_MEMZERO((void *) p_buf, sizeof(duk_uint8_t *) * re_ctx.nsaved);\n#endif\n\n\tDUK_DDD(DUK_DDDPRINT(\"regexp ctx initialized, flags=0x%08lx, nsaved=%ld, recursion_limit=%ld, steps_limit=%ld\",\n\t                     (unsigned long) re_ctx.re_flags, (long) re_ctx.nsaved, (long) re_ctx.recursion_limit,\n\t                     (long) re_ctx.steps_limit));\n\n\t/*\n\t *  Get starting character offset for match, and initialize 'sp' based on it.\n\t *\n\t *  Note: lastIndex is non-configurable so it must be present (we check the\n\t *  internal class of the object above, so we know it is).  User code can set\n\t *  its value to an arbitrary (garbage) value though; E5 requires that lastIndex\n\t *  be coerced to a number before using.  The code below works even if the\n\t *  property is missing: the value will then be coerced to zero.\n\t *\n\t *  Note: lastIndex may be outside Uint32 range even after ToInteger() coercion.\n\t *  For instance, ToInteger(+Infinity) = +Infinity.  We track the match offset\n\t *  as an integer, but pre-check it to be inside the 32-bit range before the loop.\n\t *  If not, the check in E5 Section 15.10.6.2, step 9.a applies.\n\t */\n\n\t/* XXX: lastIndex handling produces a lot of asm */\n\n\t/* [ ... re_obj input bc saved_buf ] */\n\n\tduk_get_prop_stridx_short(thr, -4, DUK_STRIDX_LAST_INDEX);  /* -> [ ... re_obj input bc saved_buf lastIndex ] */\n\t(void) duk_to_int(thr, -1);  /* ToInteger(lastIndex) */\n\td = duk_get_number(thr, -1);  /* integer, but may be +/- Infinite, +/- zero (not NaN, though) */\n\tduk_pop_nodecref_unsafe(thr);\n\n\tif (global) {\n\t\tif (d < 0.0 || d > (double) DUK_HSTRING_GET_CHARLEN(h_input)) {\n\t\t\t/* match fail */\n\t\t\tchar_offset = 0;   /* not really necessary */\n\t\t\tDUK_ASSERT(match == 0);\n\t\t\tgoto match_over;\n\t\t}\n\t\tchar_offset = (duk_uint32_t) d;\n\t} else {\n\t\t/* lastIndex must be ignored for non-global regexps, but get the\n\t\t * value for (theoretical) side effects.  No side effects can\n\t\t * really occur, because lastIndex is a normal property and is\n\t\t * always non-configurable for RegExp instances.\n\t\t */\n\t\tchar_offset = (duk_uint32_t) 0;\n\t}\n\n\tDUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input));\n\tsp = re_ctx.input + duk_heap_strcache_offset_char2byte(thr, h_input, char_offset);\n\n\t/*\n\t *  Match loop.\n\t *\n\t *  Try matching at different offsets until match found or input exhausted.\n\t */\n\n\t/* [ ... re_obj input bc saved_buf ] */\n\n\tDUK_ASSERT(match == 0);\n\n\tfor (;;) {\n\t\t/* char offset in [0, h_input->clen] (both ends inclusive), checked before entry */\n\t\tDUK_ASSERT_DISABLE(char_offset >= 0);\n\t\tDUK_ASSERT(char_offset <= DUK_HSTRING_GET_CHARLEN(h_input));\n\n\t\t/* Note: re_ctx.steps is intentionally not reset, it applies to the entire unanchored match */\n\t\tDUK_ASSERT(re_ctx.recursion_depth == 0);\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"attempt match at char offset %ld; %p [%p,%p]\",\n\t\t                     (long) char_offset, (const void *) sp,\n\t\t                     (const void *) re_ctx.input, (const void *) re_ctx.input_end));\n\n\t\t/*\n\t\t *  Note:\n\t\t *\n\t\t *    - duk__match_regexp() is required not to longjmp() in ordinary \"non-match\"\n\t\t *      conditions; a longjmp() will terminate the entire matching process.\n\t\t *\n\t\t *    - Clearing saved[] is not necessary because backtracking does it\n\t\t *\n\t\t *    - Backtracking also rewinds re_ctx.recursion back to zero, unless an\n\t\t *      internal/limit error occurs (which causes a longjmp())\n\t\t *\n\t\t *    - If we supported anchored matches, we would break out here\n\t\t *      unconditionally; however, Ecmascript regexps don't have anchored\n\t\t *      matches.  It might make sense to implement a fast bail-out if\n\t\t *      the regexp begins with '^' and sp is not 0: currently we'll just\n\t\t *      run through the entire input string, trivially failing the match\n\t\t *      at every non-zero offset.\n\t\t */\n\n\t\tif (duk__match_regexp(&re_ctx, re_ctx.bytecode, sp) != NULL) {\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"match at offset %ld\", (long) char_offset));\n\t\t\tmatch = 1;\n\t\t\tbreak;\n\t\t}\n\n\t\t/* advance by one character (code point) and one char_offset */\n\t\tchar_offset++;\n\t\tif (char_offset > DUK_HSTRING_GET_CHARLEN(h_input)) {\n\t\t\t/*\n\t\t\t *  Note:\n\t\t\t *\n\t\t\t *    - Intentionally attempt (empty) match at char_offset == k_input->clen\n\t\t\t *\n\t\t\t *    - Negative char_offsets have been eliminated and char_offset is duk_uint32_t\n\t\t\t *      -> no need or use for a negative check\n\t\t\t */\n\n\t\t\tDUK_DDD(DUK_DDDPRINT(\"no match after trying all sp offsets\"));\n\t\t\tbreak;\n\t\t}\n\n\t\t/* avoid calling at end of input, will DUK_ERROR (above check suffices to avoid this) */\n\t\t(void) duk__utf8_advance(thr, &sp, re_ctx.input, re_ctx.input_end, (duk_uint_fast32_t) 1);\n\t}\n\n match_over:\n\n\t/*\n\t *  Matching complete, create result array or return a 'null'.  Update lastIndex\n\t *  if necessary.  See E5 Section 15.10.6.2.\n\t *\n\t *  Because lastIndex is a character (not byte) offset, we need the character\n\t *  length of the match which we conveniently get as a side effect of interning\n\t *  the matching substring (0th index of result array).\n\t *\n\t *  saved[0]         start pointer (~ byte offset) of current match\n\t *  saved[1]         end pointer (~ byte offset) of current match (exclusive)\n\t *  char_offset      start character offset of current match (-> .index of result)\n\t *  char_end_offset  end character offset (computed below)\n\t */\n\n\t/* [ ... re_obj input bc saved_buf ] */\n\n\tif (match) {\n#if defined(DUK_USE_ASSERTIONS)\n\t\tduk_hobject *h_res;\n#endif\n\t\tduk_uint32_t char_end_offset = 0;\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"regexp matches at char_offset %ld\", (long) char_offset));\n\n\t\tDUK_ASSERT(re_ctx.nsaved >= 2);        /* must have start and end */\n\t\tDUK_ASSERT((re_ctx.nsaved % 2) == 0);  /* and even number */\n\n\t\t/* XXX: Array size is known before and (2 * re_ctx.nsaved) but not taken\n\t\t * advantage of now.  The array is not compacted either, as regexp match\n\t\t * objects are usually short lived.\n\t\t */\n\n\t\tduk_push_array(thr);\n\n#if defined(DUK_USE_ASSERTIONS)\n\t\th_res = duk_require_hobject(thr, -1);\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE(h_res));\n\t\tDUK_ASSERT(DUK_HOBJECT_HAS_EXOTIC_ARRAY(h_res));\n\t\tDUK_ASSERT(DUK_HOBJECT_GET_CLASS_NUMBER(h_res) == DUK_HOBJECT_CLASS_ARRAY);\n#endif\n\n\t\t/* [ ... re_obj input bc saved_buf res_obj ] */\n\n\t\tduk_push_u32(thr, char_offset);\n\t\tduk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INDEX);\n\n\t\tduk_dup_m4(thr);\n\t\tduk_xdef_prop_stridx_short_wec(thr, -2, DUK_STRIDX_INPUT);\n\n\t\tfor (i = 0; i < re_ctx.nsaved; i += 2) {\n\t\t\t/* Captures which are undefined have NULL pointers and are returned\n\t\t\t * as 'undefined'.  The same is done when saved[] pointers are insane\n\t\t\t * (this should, of course, never happen in practice).\n\t\t\t */\n\t\t\tif (re_ctx.saved[i] && re_ctx.saved[i + 1] && re_ctx.saved[i + 1] >= re_ctx.saved[i]) {\n\t\t\t\tduk_push_lstring(thr,\n\t\t\t\t                 (const char *) re_ctx.saved[i],\n\t\t\t\t                 (duk_size_t) (re_ctx.saved[i+1] - re_ctx.saved[i]));\n\t\t\t\tif (i == 0) {\n\t\t\t\t\t/* Assumes that saved[0] and saved[1] are always\n\t\t\t\t\t * set by regexp bytecode (if not, char_end_offset\n\t\t\t\t\t * will be zero).  Also assumes clen reflects the\n\t\t\t\t\t * correct char length.\n\t\t\t\t\t */\n\t\t\t\t\tchar_end_offset = char_offset + (duk_uint32_t) duk_get_length(thr, -1);  /* add charlen */\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tduk_push_undefined(thr);\n\t\t\t}\n\n\t\t\t/* [ ... re_obj input bc saved_buf res_obj val ] */\n\t\t\tduk_put_prop_index(thr, -2, (duk_uarridx_t) (i / 2));\n\t\t}\n\n\t\t/* [ ... re_obj input bc saved_buf res_obj ] */\n\n\t\t/* NB: 'length' property is automatically updated by the array setup loop */\n\n\t\tif (global) {\n\t\t\t/* global regexp: lastIndex updated on match */\n\t\t\tduk_push_u32(thr, char_end_offset);\n\t\t\tduk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX);\n\t\t} else {\n\t\t\t/* non-global regexp: lastIndex never updated on match */\n\t\t\t;\n\t\t}\n\t} else {\n\t\t/*\n\t\t *  No match, E5 Section 15.10.6.2, step 9.a.i - 9.a.ii apply, regardless\n\t\t *  of 'global' flag of the RegExp.  In particular, if lastIndex is invalid\n\t\t *  initially, it is reset to zero.\n\t\t */\n\n\t\tDUK_DDD(DUK_DDDPRINT(\"regexp does not match\"));\n\n\t\tduk_push_null(thr);\n\n\t\t/* [ ... re_obj input bc saved_buf res_obj ] */\n\n\t\tduk_push_int(thr, 0);\n\t\tduk_put_prop_stridx_short(thr, -6, DUK_STRIDX_LAST_INDEX);\n\t}\n\n\t/* [ ... re_obj input bc saved_buf res_obj ] */\n\n\tduk_insert(thr, -5);\n\n\t/* [ ... res_obj re_obj input bc saved_buf ] */\n\n\tduk_pop_n_unsafe(thr, 4);\n\n\t/* [ ... res_obj ] */\n\n\t/* XXX: these last tricks are unnecessary if the function is made\n\t * a genuine native function.\n\t */\n}\n\nDUK_INTERNAL void duk_regexp_match(duk_hthread *thr) {\n\tduk__regexp_match_helper(thr, 0 /*force_global*/);\n}\n\n/* This variant is needed by String.prototype.split(); it needs to perform\n * global-style matching on a cloned RegExp which is potentially non-global.\n */\nDUK_INTERNAL void duk_regexp_match_force_global(duk_hthread *thr) {\n\tduk__regexp_match_helper(thr, 1 /*force_global*/);\n}\n\n#else  /* DUK_USE_REGEXP_SUPPORT */\n\n/* regexp support disabled */\n\n#endif  /* DUK_USE_REGEXP_SUPPORT */\n#line 1 \"duk_selftest.c\"\n/*\n *  Self tests to ensure execution environment is sane.  Intended to catch\n *  compiler/platform problems which cannot be detected at compile time.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_SELF_TESTS)\n\n/*\n *  Unions and structs for self tests\n */\n\ntypedef union {\n\tdouble d;\n\tduk_uint8_t x[8];\n} duk__test_double_union;\n\n/* Self test failed.  Expects a local variable 'error_count' to exist. */\n#define DUK__FAILED(msg)  do { \\\n\t\tDUK_D(DUK_DPRINT(\"self test failed: \" #msg \" at \" DUK_FILE_MACRO \":\" DUK_MACRO_STRINGIFY(DUK_LINE_MACRO))); \\\n\t\terror_count++; \\\n\t} while (0)\n\n#define DUK__DBLUNION_CMP_TRUE(a,b)  do { \\\n\t\tif (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) != 0) { \\\n\t\t\tDUK__FAILED(\"double union compares false (expected true)\"); \\\n\t\t} \\\n\t} while (0)\n\n#define DUK__DBLUNION_CMP_FALSE(a,b)  do { \\\n\t\tif (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) == 0) { \\\n\t\t\tDUK__FAILED(\"double union compares true (expected false)\"); \\\n\t\t} \\\n\t} while (0)\n\ntypedef union {\n\tduk_uint32_t i;\n\tduk_uint8_t x[8];\n} duk__test_u32_union;\n\n#if defined(DUK_USE_INTEGER_LE)\n#define DUK__U32_INIT(u, a, b, c, d) do { \\\n\t\t(u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \\\n\t} while (0)\n#elif defined(DUK_USE_INTEGER_ME)\n#error integer mixed endian not supported now\n#elif defined(DUK_USE_INTEGER_BE)\n#define DUK__U32_INIT(u, a, b, c, d) do { \\\n\t\t(u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \\\n\t} while (0)\n#else\n#error unknown integer endianness\n#endif\n\n#if defined(DUK_USE_DOUBLE_LE)\n#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \\\n\t\t(u)->x[0] = (h); (u)->x[1] = (g); (u)->x[2] = (f); (u)->x[3] = (e); \\\n\t\t(u)->x[4] = (d); (u)->x[5] = (c); (u)->x[6] = (b); (u)->x[7] = (a); \\\n\t} while (0)\n#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \\\n\t((u)->x[0] == (h) && (u)->x[1] == (g) && (u)->x[2] == (f) && (u)->x[3] == (e) && \\\n\t (u)->x[4] == (d) && (u)->x[5] == (c) && (u)->x[6] == (b) && (u)->x[7] == (a))\n#elif defined(DUK_USE_DOUBLE_ME)\n#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \\\n\t\t(u)->x[0] = (d); (u)->x[1] = (c); (u)->x[2] = (b); (u)->x[3] = (a); \\\n\t\t(u)->x[4] = (h); (u)->x[5] = (g); (u)->x[6] = (f); (u)->x[7] = (e); \\\n\t} while (0)\n#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \\\n\t((u)->x[0] == (d) && (u)->x[1] == (c) && (u)->x[2] == (b) && (u)->x[3] == (a) && \\\n\t (u)->x[4] == (h) && (u)->x[5] == (g) && (u)->x[6] == (f) && (u)->x[7] == (e))\n#elif defined(DUK_USE_DOUBLE_BE)\n#define DUK__DOUBLE_INIT(u, a, b, c, d, e, f, g, h) do { \\\n\t\t(u)->x[0] = (a); (u)->x[1] = (b); (u)->x[2] = (c); (u)->x[3] = (d); \\\n\t\t(u)->x[4] = (e); (u)->x[5] = (f); (u)->x[6] = (g); (u)->x[7] = (h); \\\n\t} while (0)\n#define DUK__DOUBLE_COMPARE(u, a, b, c, d, e, f, g, h) \\\n\t((u)->x[0] == (a) && (u)->x[1] == (b) && (u)->x[2] == (c) && (u)->x[3] == (d) && \\\n\t (u)->x[4] == (e) && (u)->x[5] == (f) && (u)->x[6] == (g) && (u)->x[7] == (h))\n#else\n#error unknown double endianness\n#endif\n\n/*\n *  Various sanity checks for typing\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_types(void) {\n\tduk_uint_t error_count = 0;\n\n\tif (!(sizeof(duk_int8_t) == 1 &&\n\t      sizeof(duk_uint8_t) == 1 &&\n\t      sizeof(duk_int16_t) == 2 &&\n\t      sizeof(duk_uint16_t) == 2 &&\n\t      sizeof(duk_int32_t) == 4 &&\n\t      sizeof(duk_uint32_t) == 4)) {\n\t\tDUK__FAILED(\"duk_(u)int{8,16,32}_t size\");\n\t}\n#if defined(DUK_USE_64BIT_OPS)\n\tif (!(sizeof(duk_int64_t) == 8 &&\n\t      sizeof(duk_uint64_t) == 8)) {\n\t\tDUK__FAILED(\"duk_(u)int64_t size\");\n\t}\n#endif\n\n\tif (!(sizeof(duk_size_t) >= sizeof(duk_uint_t))) {\n\t\t/* Some internal code now assumes that all duk_uint_t values\n\t\t * can be expressed with a duk_size_t.\n\t\t */\n\t\tDUK__FAILED(\"duk_size_t is smaller than duk_uint_t\");\n\t}\n\tif (!(sizeof(duk_int_t) >= 4)) {\n\t\tDUK__FAILED(\"duk_int_t is not 32 bits\");\n\t}\n\n\treturn error_count;\n}\n\n/*\n *  Packed tval sanity\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_packed_tval(void) {\n\tduk_uint_t error_count = 0;\n\n#if defined(DUK_USE_PACKED_TVAL)\n\tif (sizeof(void *) > 4) {\n\t\tDUK__FAILED(\"packed duk_tval in use but sizeof(void *) > 4\");\n\t}\n#endif\n\n\treturn error_count;\n}\n\n/*\n *  Two's complement arithmetic.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_twos_complement(void) {\n\tduk_uint_t error_count = 0;\n\tvolatile int test;\n\ttest = -1;\n\n\t/* Note that byte order doesn't affect this test: all bytes in\n\t * 'test' will be 0xFF for two's complement.\n\t */\n\tif (((volatile duk_uint8_t *) &test)[0] != (duk_uint8_t) 0xff) {\n\t\tDUK__FAILED(\"two's complement arithmetic\");\n\t}\n\n\treturn error_count;\n}\n\n/*\n *  Byte order.  Important to self check, because on some exotic platforms\n *  there is no actual detection but rather assumption based on platform\n *  defines.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_byte_order(void) {\n\tduk_uint_t error_count = 0;\n\tduk__test_u32_union u1;\n\tduk__test_double_union u2;\n\n\t/*\n\t *  >>> struct.pack('>d', 102030405060).encode('hex')\n\t *  '4237c17c6dc40000'\n\t */\n\n\tDUK__U32_INIT(&u1, 0xde, 0xad, 0xbe, 0xef);\n\tDUK__DOUBLE_INIT(&u2, 0x42, 0x37, 0xc1, 0x7c, 0x6d, 0xc4, 0x00, 0x00);\n\n\tif (u1.i != (duk_uint32_t) 0xdeadbeefUL) {\n\t\tDUK__FAILED(\"duk_uint32_t byte order\");\n\t}\n\n\tif (u2.d != (double) 102030405060.0) {\n\t\tDUK__FAILED(\"double byte order\");\n\t}\n\n\treturn error_count;\n}\n\n/*\n *  DUK_BSWAP macros\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_bswap_macros(void) {\n\tduk_uint_t error_count = 0;\n\tduk_uint32_t x32;\n\tduk_uint16_t x16;\n\tduk_double_union du;\n\tduk_double_t du_diff;\n\n\tx16 = 0xbeefUL;\n\tx16 = DUK_BSWAP16(x16);\n\tif (x16 != (duk_uint16_t) 0xefbeUL) {\n\t\tDUK__FAILED(\"DUK_BSWAP16\");\n\t}\n\n\tx32 = 0xdeadbeefUL;\n\tx32 = DUK_BSWAP32(x32);\n\tif (x32 != (duk_uint32_t) 0xefbeaddeUL) {\n\t\tDUK__FAILED(\"DUK_BSWAP32\");\n\t}\n\n\t/* >>> struct.unpack('>d', '4000112233445566'.decode('hex'))\n\t * (2.008366013071895,)\n\t */\n\n\tdu.uc[0] = 0x40; du.uc[1] = 0x00; du.uc[2] = 0x11; du.uc[3] = 0x22;\n\tdu.uc[4] = 0x33; du.uc[5] = 0x44; du.uc[6] = 0x55; du.uc[7] = 0x66;\n\tDUK_DBLUNION_DOUBLE_NTOH(&du);\n\tdu_diff = du.d - 2.008366013071895;\n#if 0\n\tDUK_D(DUK_DPRINT(\"du_diff: %lg\\n\", (double) du_diff));\n#endif\n\tif (du_diff > 1e-15) {\n\t\t/* Allow very small lenience because some compilers won't parse\n\t\t * exact IEEE double constants (happened in matrix testing with\n\t\t * Linux gcc-4.8 -m32 at least).\n\t\t */\n#if 0\n\t\tDUK_D(DUK_DPRINT(\"Result of DUK_DBLUNION_DOUBLE_NTOH: %02x %02x %02x %02x %02x %02x %02x %02x\\n\",\n\t\t            (unsigned int) du.uc[0], (unsigned int) du.uc[1],\n\t\t            (unsigned int) du.uc[2], (unsigned int) du.uc[3],\n\t\t            (unsigned int) du.uc[4], (unsigned int) du.uc[5],\n\t\t            (unsigned int) du.uc[6], (unsigned int) du.uc[7]));\n#endif\n\t\tDUK__FAILED(\"DUK_DBLUNION_DOUBLE_NTOH\");\n\t}\n\n\treturn error_count;\n}\n\n/*\n *  Basic double / byte union memory layout.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_double_union_size(void) {\n\tduk_uint_t error_count = 0;\n\n\tif (sizeof(duk__test_double_union) != 8) {\n\t\tDUK__FAILED(\"invalid union size\");\n\t}\n\n\treturn error_count;\n}\n\n/*\n *  Union aliasing, see misc/clang_aliasing.c.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_double_aliasing(void) {\n\t/* This testcase fails when Emscripten-generated code runs on Firefox.\n\t * It's not an issue because the failure should only affect packed\n\t * duk_tval representation, which is not used with Emscripten.\n\t */\n#if defined(DUK_USE_PACKED_TVAL)\n\tduk_uint_t error_count = 0;\n\tduk__test_double_union a, b;\n\n\t/* Test signaling NaN and alias assignment in all endianness combinations.\n\t */\n\n\t/* little endian */\n\ta.x[0] = 0x11; a.x[1] = 0x22; a.x[2] = 0x33; a.x[3] = 0x44;\n\ta.x[4] = 0x00; a.x[5] = 0x00; a.x[6] = 0xf1; a.x[7] = 0xff;\n\tb = a;\n\tDUK__DBLUNION_CMP_TRUE(&a, &b);\n\n\t/* big endian */\n\ta.x[0] = 0xff; a.x[1] = 0xf1; a.x[2] = 0x00; a.x[3] = 0x00;\n\ta.x[4] = 0x44; a.x[5] = 0x33; a.x[6] = 0x22; a.x[7] = 0x11;\n\tb = a;\n\tDUK__DBLUNION_CMP_TRUE(&a, &b);\n\n\t/* mixed endian */\n\ta.x[0] = 0x00; a.x[1] = 0x00; a.x[2] = 0xf1; a.x[3] = 0xff;\n\ta.x[4] = 0x11; a.x[5] = 0x22; a.x[6] = 0x33; a.x[7] = 0x44;\n\tb = a;\n\tDUK__DBLUNION_CMP_TRUE(&a, &b);\n\n\treturn error_count;\n#else\n\tDUK_D(DUK_DPRINT(\"skip double aliasing self test when duk_tval is not packed\"));\n\treturn 0;\n#endif\n}\n\n/*\n *  Zero sign, see misc/tcc_zerosign2.c.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_double_zero_sign(void) {\n\tduk_uint_t error_count = 0;\n\tduk__test_double_union a, b;\n\n\ta.d = 0.0;\n\tb.d = -a.d;\n\tDUK__DBLUNION_CMP_FALSE(&a, &b);\n\n\treturn error_count;\n}\n\n/*\n *  Rounding mode: Duktape assumes round-to-nearest, check that this is true.\n *  If we had C99 fenv.h we could check that fegetround() == FE_TONEAREST,\n *  but we don't want to rely on that header; and even if we did, it's good\n *  to ensure the rounding actually works.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_double_rounding(void) {\n\tduk_uint_t error_count = 0;\n\tduk__test_double_union a, b, c;\n\n#if 0\n\t/* Include <fenv.h> and test manually; these trigger failures: */\n\tfesetround(FE_UPWARD);\n\tfesetround(FE_DOWNWARD);\n\tfesetround(FE_TOWARDZERO);\n\n\t/* This is the default and passes. */\n\tfesetround(FE_TONEAREST);\n#endif\n\n\t/* Rounding tests check that none of the other modes (round to\n\t * +Inf, round to -Inf, round to zero) can be active:\n\t * http://www.gnu.org/software/libc/manual/html_node/Rounding.html\n\t */\n\n\t/* 1.0 + 2^(-53): result is midway between 1.0 and 1.0 + ulp.\n\t * Round to nearest: 1.0\n\t * Round to +Inf:    1.0 + ulp\n\t * Round to -Inf:    1.0\n\t * Round to zero:    1.0\n\t * => Correct result eliminates round to +Inf.\n\t */\n\tDUK__DOUBLE_INIT(&a, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n\tDUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n\tDUK_MEMSET((void *) &c, 0, sizeof(c));\n\tc.d = a.d + b.d;\n\tif (!DUK__DOUBLE_COMPARE(&c, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)) {\n\t\tDUK_D(DUK_DPRINT(\"broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x\",\n\t\t                 (unsigned int) c.x[0], (unsigned int) c.x[1],\n\t\t                 (unsigned int) c.x[2], (unsigned int) c.x[3],\n\t\t                 (unsigned int) c.x[4], (unsigned int) c.x[5],\n\t\t                 (unsigned int) c.x[6], (unsigned int) c.x[7]));\n\t\tDUK__FAILED(\"invalid result from 1.0 + 0.5ulp\");\n\t}\n\n\t/* (1.0 + ulp) + 2^(-53): result is midway between 1.0 + ulp and 1.0 + 2*ulp.\n\t * Round to nearest: 1.0 + 2*ulp (round to even mantissa)\n\t * Round to +Inf:    1.0 + 2*ulp\n\t * Round to -Inf:    1.0 + ulp\n\t * Round to zero:    1.0 + ulp\n\t * => Correct result eliminates round to -Inf and round to zero.\n\t */\n\tDUK__DOUBLE_INIT(&a, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01);\n\tDUK__DOUBLE_INIT(&b, 0x3c, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);\n\tDUK_MEMSET((void *) &c, 0, sizeof(c));\n\tc.d = a.d + b.d;\n\tif (!DUK__DOUBLE_COMPARE(&c, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02)) {\n\t\tDUK_D(DUK_DPRINT(\"broken result (native endiannesss): %02x %02x %02x %02x %02x %02x %02x %02x\",\n\t\t                 (unsigned int) c.x[0], (unsigned int) c.x[1],\n\t\t                 (unsigned int) c.x[2], (unsigned int) c.x[3],\n\t\t                 (unsigned int) c.x[4], (unsigned int) c.x[5],\n\t\t                 (unsigned int) c.x[6], (unsigned int) c.x[7]));\n\t\tDUK__FAILED(\"invalid result from (1.0 + ulp) + 0.5ulp\");\n\t}\n\n\t/* Could do negative number testing too, but the tests above should\n\t * differentiate between IEEE 754 rounding modes.\n\t */\n\treturn error_count;\n}\n\n/*\n *  fmod(): often a portability issue in embedded or bare platform targets.\n *  Check for at least minimally correct behavior.  Unlike some other math\n *  functions (like cos()) Duktape relies on fmod() internally too.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_fmod(void) {\n\tduk_uint_t error_count = 0;\n\tduk__test_double_union u1, u2;\n\tvolatile duk_double_t t1, t2, t3;\n\n\t/* fmod() with integer argument and exponent 2^32 is used by e.g.\n\t * ToUint32() and some Duktape internals.\n\t */\n\tu1.d = DUK_FMOD(10.0, 4294967296.0);\n\tu2.d = 10.0;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\n\tu1.d = DUK_FMOD(4294967306.0, 4294967296.0);\n\tu2.d = 10.0;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\n\tu1.d = DUK_FMOD(73014444042.0, 4294967296.0);\n\tu2.d = 10.0;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\n\t/* 52-bit integer split into two parts:\n\t * >>> 0x1fedcba9876543\n\t * 8987183256397123\n\t * >>> float(0x1fedcba9876543) / float(2**53)\n\t * 0.9977777777777778\n\t */\n\tu1.d = DUK_FMOD(8987183256397123.0, 4294967296.0);\n\tu2.d = (duk_double_t) 0xa9876543UL;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\tt1 = 8987183256397123.0;\n\tt2 = 4294967296.0;\n\tt3 = t1 / t2;\n\tu1.d = DUK_FLOOR(t3);\n\tu2.d = (duk_double_t) 0x1fedcbUL;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\n\t/* C99 behavior is for fmod() result sign to mathc argument sign. */\n\tu1.d = DUK_FMOD(-10.0, 4294967296.0);\n\tu2.d = -10.0;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\n\tu1.d = DUK_FMOD(-4294967306.0, 4294967296.0);\n\tu2.d = -10.0;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\n\tu1.d = DUK_FMOD(-73014444042.0, 4294967296.0);\n\tu2.d = -10.0;\n\tDUK__DBLUNION_CMP_TRUE(&u1, &u2);\n\n\treturn error_count;\n}\n\n/*\n *  Struct size/alignment if platform requires it\n *\n *  There are some compiler specific struct padding pragmas etc in use, this\n *  selftest ensures they're correctly detected and used.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_struct_align(void) {\n\tduk_uint_t error_count = 0;\n\n#if (DUK_USE_ALIGN_BY == 4)\n\tif ((sizeof(duk_hbuffer_fixed) % 4) != 0) {\n\t\tDUK__FAILED(\"sizeof(duk_hbuffer_fixed) not aligned to 4\");\n\t}\n#elif (DUK_USE_ALIGN_BY == 8)\n\tif ((sizeof(duk_hbuffer_fixed) % 8) != 0) {\n\t\tDUK__FAILED(\"sizeof(duk_hbuffer_fixed) not aligned to 8\");\n\t}\n#elif (DUK_USE_ALIGN_BY == 1)\n\t/* no check */\n#else\n#error invalid DUK_USE_ALIGN_BY\n#endif\n\treturn error_count;\n}\n\n/*\n *  64-bit arithmetic\n *\n *  There are some platforms/compilers where 64-bit types are available\n *  but don't work correctly.  Test for known cases.\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_64bit_arithmetic(void) {\n\tduk_uint_t error_count = 0;\n#if defined(DUK_USE_64BIT_OPS)\n\tvolatile duk_int64_t i;\n\tvolatile duk_double_t d;\n\n\t/* Catch a double-to-int64 cast issue encountered in practice. */\n\td = 2147483648.0;\n\ti = (duk_int64_t) d;\n\tif (i != DUK_I64_CONSTANT(0x80000000)) {\n\t\tDUK__FAILED(\"casting 2147483648.0 to duk_int64_t failed\");\n\t}\n#else\n\t/* nop */\n#endif\n\treturn error_count;\n}\n\n/*\n *  Casting\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_cast_double_to_small_uint(void) {\n\t/*\n\t *  https://github.com/svaarala/duktape/issues/127#issuecomment-77863473\n\t */\n\n\tduk_uint_t error_count = 0;\n\n\tduk_double_t d1, d2;\n\tduk_small_uint_t u;\n\n\tduk_double_t d1v, d2v;\n\tduk_small_uint_t uv;\n\n\t/* Test without volatiles */\n\n\td1 = 1.0;\n\tu = (duk_small_uint_t) d1;\n\td2 = (duk_double_t) u;\n\n\tif (!(d1 == 1.0 && u == 1 && d2 == 1.0 && d1 == d2)) {\n\t\tDUK__FAILED(\"double to duk_small_uint_t cast failed\");\n\t}\n\n\t/* Same test with volatiles */\n\n\td1v = 1.0;\n\tuv = (duk_small_uint_t) d1v;\n\td2v = (duk_double_t) uv;\n\n\tif (!(d1v == 1.0 && uv == 1 && d2v == 1.0 && d1v == d2v)) {\n\t\tDUK__FAILED(\"double to duk_small_uint_t cast failed\");\n\t}\n\n\treturn error_count;\n}\n\nDUK_LOCAL duk_uint_t duk__selftest_cast_double_to_uint32(void) {\n\t/*\n\t *  This test fails on an exotic ARM target; double-to-uint\n\t *  cast is incorrectly clamped to -signed- int highest value.\n\t *\n\t *  https://github.com/svaarala/duktape/issues/336\n\t */\n\n\tduk_uint_t error_count = 0;\n\tduk_double_t dv;\n\tduk_uint32_t uv;\n\n\tdv = 3735928559.0;  /* 0xdeadbeef in decimal */\n\tuv = (duk_uint32_t) dv;\n\n\tif (uv != 0xdeadbeefUL) {\n\t\tDUK__FAILED(\"double to duk_uint32_t cast failed\");\n\t}\n\n\treturn error_count;\n}\n\n/*\n *  Minimal test of user supplied allocation functions\n *\n *    - Basic alloc + realloc + free cycle\n *\n *    - Realloc to significantly larger size to (hopefully) trigger a\n *      relocation and check that relocation copying works\n */\n\nDUK_LOCAL duk_uint_t duk__selftest_alloc_funcs(duk_alloc_function alloc_func,\n                                               duk_realloc_function realloc_func,\n                                               duk_free_function free_func,\n                                               void *udata) {\n\tduk_uint_t error_count = 0;\n\tvoid *ptr;\n\tvoid *new_ptr;\n\tduk_small_int_t i, j;\n\tunsigned char x;\n\n\tif (alloc_func == NULL || realloc_func == NULL || free_func == NULL) {\n\t\treturn 0;\n\t}\n\n\tfor (i = 1; i <= 256; i++) {\n\t\tptr = alloc_func(udata, (duk_size_t) i);\n\t\tif (ptr == NULL) {\n\t\t\tDUK_D(DUK_DPRINT(\"alloc failed, ignore\"));\n\t\t\tcontinue;  /* alloc failed, ignore */\n\t\t}\n\t\tfor (j = 0; j < i; j++) {\n\t\t\t((unsigned char *) ptr)[j] = (unsigned char) (0x80 + j);\n\t\t}\n\t\tnew_ptr = realloc_func(udata, ptr, 1024);\n\t\tif (new_ptr == NULL) {\n\t\t\tDUK_D(DUK_DPRINT(\"realloc failed, ignore\"));\n\t\t\tfree_func(udata, ptr);\n\t\t\tcontinue;  /* realloc failed, ignore */\n\t\t}\n\t\tptr = new_ptr;\n\t\tfor (j = 0; j < i; j++) {\n\t\t\tx = ((unsigned char *) ptr)[j];\n\t\t\tif (x != (unsigned char) (0x80 + j)) {\n\t\t\t\tDUK_D(DUK_DPRINT(\"byte at index %ld doesn't match after realloc: %02lx\",\n\t\t\t\t                 (long) j, (unsigned long) x));\n\t\t\t\tDUK__FAILED(\"byte compare after realloc\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfree_func(udata, ptr);\n\t}\n\n\treturn error_count;\n}\n\n/*\n *  Self test main\n */\n\nDUK_INTERNAL duk_uint_t duk_selftest_run_tests(duk_alloc_function alloc_func,\n                                               duk_realloc_function realloc_func,\n                                               duk_free_function free_func,\n                                               void *udata) {\n\tduk_uint_t error_count = 0;\n\n\tDUK_D(DUK_DPRINT(\"self test starting\"));\n\n\terror_count += duk__selftest_types();\n\terror_count += duk__selftest_packed_tval();\n\terror_count += duk__selftest_twos_complement();\n\terror_count += duk__selftest_byte_order();\n\terror_count += duk__selftest_bswap_macros();\n\terror_count += duk__selftest_double_union_size();\n\terror_count += duk__selftest_double_aliasing();\n\terror_count += duk__selftest_double_zero_sign();\n\terror_count += duk__selftest_double_rounding();\n\terror_count += duk__selftest_fmod();\n\terror_count += duk__selftest_struct_align();\n\terror_count += duk__selftest_64bit_arithmetic();\n\terror_count += duk__selftest_cast_double_to_small_uint();\n\terror_count += duk__selftest_cast_double_to_uint32();\n\terror_count += duk__selftest_alloc_funcs(alloc_func, realloc_func, free_func, udata);\n\n\tDUK_D(DUK_DPRINT(\"self test complete, total error count: %ld\", (long) error_count));\n\n\treturn error_count;\n}\n\n#endif  /* DUK_USE_SELF_TESTS */\n\n/* automatic undefs */\n#undef DUK__DBLUNION_CMP_FALSE\n#undef DUK__DBLUNION_CMP_TRUE\n#undef DUK__DOUBLE_COMPARE\n#undef DUK__DOUBLE_INIT\n#undef DUK__FAILED\n#undef DUK__U32_INIT\n/* #include duk_internal.h -> already included */\n#line 2 \"duk_tval.c\"\n\n#if defined(DUK_USE_FASTINT)\n\n/*\n *  Manually optimized double-to-fastint downgrade check.\n *\n *  This check has a large impact on performance, especially for fastint\n *  slow paths, so must be changed carefully.  The code should probably be\n *  optimized for the case where the result does not fit into a fastint,\n *  to minimize the penalty for \"slow path code\" dealing with fractions etc.\n *\n *  At least on one tested soft float ARM platform double-to-int64 coercion\n *  is very slow (and sometimes produces incorrect results, see self tests).\n *  This algorithm combines a fastint compatibility check and extracting the\n *  integer value from an IEEE double for setting the tagged fastint.  For\n *  other platforms a more naive approach might be better.\n *\n *  See doc/fastint.rst for details.\n */\n\nDUK_INTERNAL DUK_ALWAYS_INLINE void duk_tval_set_number_chkfast_fast(duk_tval *tv, duk_double_t x) {\n\tduk_double_union du;\n\tduk_int64_t i;\n\tduk_small_int_t expt;\n\tduk_small_int_t shift;\n\n\t/* XXX: optimize for packed duk_tval directly? */\n\n\tdu.d = x;\n\ti = (duk_int64_t) DUK_DBLUNION_GET_INT64(&du);\n\texpt = (duk_small_int_t) ((i >> 52) & 0x07ff);\n\tshift = expt - 1023;\n\n\tif (shift >= 0 && shift <= 46) {  /* exponents 1023 to 1069 */\n\t\tduk_int64_t t;\n\n\t\tif (((DUK_I64_CONSTANT(0x000fffffffffffff) >> shift) & i) == 0) {\n\t\t\tt = i | DUK_I64_CONSTANT(0x0010000000000000);  /* implicit leading one */\n\t\t\tt = t & DUK_I64_CONSTANT(0x001fffffffffffff);\n\t\t\tt = t >> (52 - shift);\n\t\t\tif (i < 0) {\n\t\t\t\tt = -t;\n\t\t\t}\n\t\t\tDUK_TVAL_SET_FASTINT(tv, t);\n\t\t\treturn;\n\t\t}\n\t} else if (shift == -1023) {  /* exponent 0 */\n\t\tif (i >= 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) {\n\t\t\t/* Note: reject negative zero. */\n\t\t\tDUK_TVAL_SET_FASTINT(tv, (duk_int64_t) 0);\n\t\t\treturn;\n\t\t}\n\t} else if (shift == 47) {  /* exponent 1070 */\n\t\tif (i < 0 && (i & DUK_I64_CONSTANT(0x000fffffffffffff)) == 0) {\n\t\t\tDUK_TVAL_SET_FASTINT(tv, (duk_int64_t) DUK_FASTINT_MIN);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tDUK_TVAL_SET_DOUBLE(tv, x);\n\treturn;\n}\n\nDUK_INTERNAL DUK_NOINLINE void duk_tval_set_number_chkfast_slow(duk_tval *tv, duk_double_t x) {\n\tduk_tval_set_number_chkfast_fast(tv, x);\n}\n\n/*\n *  Manually optimized number-to-double conversion\n */\n\n#if defined(DUK_USE_FASTINT) && defined(DUK_USE_PACKED_TVAL)\nDUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_packed(duk_tval *tv) {\n\tduk_double_union du;\n\tduk_uint64_t t;\n\n\tt = (duk_uint64_t) DUK_DBLUNION_GET_UINT64(tv);\n\tif ((t >> 48) != DUK_TAG_FASTINT) {\n\t\treturn tv->d;\n\t} else if (t & DUK_U64_CONSTANT(0x0000800000000000)) {\n\t\tt = (duk_uint64_t) (-((duk_int64_t) t));  /* avoid unary minus on unsigned */\n\t\tt = t & DUK_U64_CONSTANT(0x0000ffffffffffff);  /* negative */\n\t\tt |= DUK_U64_CONSTANT(0xc330000000000000);\n\t\tDUK_DBLUNION_SET_UINT64(&du, t);\n\t\treturn du.d + 4503599627370496.0;  /* 1 << 52 */\n\t} else if (t != 0) {\n\t\tt &= DUK_U64_CONSTANT(0x0000ffffffffffff);  /* positive */\n\t\tt |= DUK_U64_CONSTANT(0x4330000000000000);\n\t\tDUK_DBLUNION_SET_UINT64(&du, t);\n\t\treturn du.d - 4503599627370496.0;  /* 1 << 52 */\n\t} else {\n\t\treturn 0.0;  /* zero */\n\t}\n}\n#endif  /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */\n\n#if 0  /* unused */\n#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL)\nDUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked(duk_tval *tv) {\n\tduk_double_union du;\n\tduk_uint64_t t;\n\n\tDUK_ASSERT(tv->t == DUK_TAG_NUMBER || tv->t == DUK_TAG_FASTINT);\n\n\tif (tv->t == DUK_TAG_FASTINT) {\n\t\tif (tv->v.fi >= 0) {\n\t\t\tt = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi;\n\t\t\tDUK_DBLUNION_SET_UINT64(&du, t);\n\t\t\treturn du.d - 4503599627370496.0;  /* 1 << 52 */\n\t\t} else {\n\t\t\tt = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi);\n\t\t\tDUK_DBLUNION_SET_UINT64(&du, t);\n\t\t\treturn du.d + 4503599627370496.0;  /* 1 << 52 */\n\t\t}\n\t} else {\n\t\treturn tv->v.d;\n\t}\n}\n#endif  /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */\n#endif  /* 0 */\n\n#if defined(DUK_USE_FASTINT) && !defined(DUK_USE_PACKED_TVAL)\nDUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_tval_get_number_unpacked_fastint(duk_tval *tv) {\n\tduk_double_union du;\n\tduk_uint64_t t;\n\n\tDUK_ASSERT(tv->t == DUK_TAG_FASTINT);\n\n\tif (tv->v.fi >= 0) {\n\t\tt = DUK_U64_CONSTANT(0x4330000000000000) | (duk_uint64_t) tv->v.fi;\n\t\tDUK_DBLUNION_SET_UINT64(&du, t);\n\t\treturn du.d - 4503599627370496.0;  /* 1 << 52 */\n\t} else {\n\t\tt = DUK_U64_CONSTANT(0xc330000000000000) | (duk_uint64_t) (-tv->v.fi);\n\t\tDUK_DBLUNION_SET_UINT64(&du, t);\n\t\treturn du.d + 4503599627370496.0;  /* 1 << 52 */\n\t}\n}\n#endif  /* DUK_USE_FASTINT && DUK_USE_PACKED_TVAL */\n\n#endif  /* DUK_USE_FASTINT */\n#line 1 \"duk_unicode_tables.c\"\n/*\n *  Unicode support tables automatically generated during build.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Unicode tables containing ranges of Unicode characters in a\n *  packed format.  These tables are used to match non-ASCII\n *  characters of complex productions by resorting to a linear\n *  range-by-range comparison.  This is very slow, but is expected\n *  to be very rare in practical Ecmascript source code, and thus\n *  compactness is most important.\n *\n *  The tables are matched using uni_range_match() and the format\n *  is described in tools/extract_chars.py.\n */\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n/* IdentifierStart production with ASCII excluded */\n/* duk_unicode_ids_noa[] */\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_ids_noa[1036] = {\n249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34,\n2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191,\n21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240,\n101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19,\n240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47,\n2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18,\n47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12,\n38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6,\n41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98,\n34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2,\n85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35,\n63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227,\n240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5,\n15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40,\n240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27,\n43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47,\n15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68,\n112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52,\n29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12,\n146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255,\n224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63,\n253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34,\n35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31,\n240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32,\n240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7,\n95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245,\n207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10,\n207,73,69,53,53,50,241,91,47,10,47,3,33,46,61,241,79,107,243,127,37,255,\n223,13,79,33,242,31,16,240,47,11,111,22,191,14,63,20,87,36,241,207,142,240,\n79,20,95,20,95,24,159,36,248,239,254,2,154,240,107,127,138,83,2,241,194,20,\n3,240,123,240,122,240,255,51,240,50,27,240,107,240,175,56,242,135,31,50,15,\n1,50,34,240,191,30,240,212,240,223,21,114,240,207,13,242,107,240,107,240,\n62,240,47,96,243,159,41,242,62,242,63,254,32,79,37,243,223,29,241,47,9,240,\n207,20,241,191,19,64,223,32,240,3,240,112,32,241,95,2,47,9,244,102,32,35,\n46,41,143,31,241,135,49,63,6,38,33,36,64,240,64,212,249,15,37,240,67,242,\n127,32,240,97,32,250,175,31,241,179,241,111,32,240,96,242,223,27,244,127,\n10,255,224,122,243,15,17,15,254,11,79,41,255,152,47,21,240,48,242,63,14,\n255,226,100,255,226,140,245,143,95,240,63,180,255,233,176,255,227,33,255,\n238,197,255,225,57,255,240,1,10,223,254,18,184,240,255,99,240,239,4,242,15,\n2,63,17,240,86,240,63,254,38,79,53,192,243,76,243,32,241,31,255,0,6,223,\n240,95,254,30,95,255,0,20,1,31,254,175,47,91,108,72,137,255,240,0,101,175,\n69,47,55,33,48,49,51,43,32,38,47,49,35,55,38,47,12,35,36,32,70,47,254,4,99,\n240,146,240,146,240,242,240,146,240,242,240,146,240,242,240,146,240,242,\n240,146,127,254,242,143,181,242,223,52,255,227,176,50,240,178,18,3,2,146,\n50,2,7,5,2,2,2,34,18,3,2,2,2,2,2,18,3,50,98,50,50,2,146,240,22,34,66,240,\n31,255,0,0,56,255,240,9,92,159,27,255,239,39,207,206,63,255,0,5,116,255,\n240,1,133,47,254,17,0,\n};\n#else\n/* IdentifierStart production with ASCII and non-BMP excluded */\n/* duk_unicode_ids_noabmp[] */\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_ids_noabmp[625] = {\n249,176,176,80,111,7,47,15,47,254,11,197,191,0,72,2,15,115,66,19,50,7,2,34,\n2,240,66,244,50,247,185,249,98,241,99,8,241,127,58,240,182,47,31,241,191,\n21,18,245,50,15,1,24,27,35,15,2,2,240,239,15,244,156,15,10,241,26,21,6,240,\n101,10,4,15,9,240,159,57,240,82,127,56,242,100,15,4,8,159,1,240,5,115,19,\n240,98,98,4,52,15,2,14,18,47,0,31,5,85,19,240,98,98,18,18,31,17,50,15,5,47,\n2,130,34,240,98,98,18,68,15,4,15,1,31,9,12,115,19,240,98,98,18,68,15,16,18,\n47,1,15,3,2,84,34,52,18,2,20,20,36,191,8,15,38,114,34,240,114,240,4,15,12,\n38,31,16,5,114,34,240,114,146,68,15,18,2,31,1,31,4,114,34,241,147,15,2,6,\n41,47,10,86,240,36,240,130,130,3,111,44,242,2,29,111,44,18,3,18,3,7,50,98,\n34,2,3,18,50,26,3,66,15,7,63,18,15,49,114,241,79,13,79,101,241,191,6,15,2,\n85,52,4,24,37,205,15,3,241,98,6,3,241,178,255,224,63,35,54,32,35,63,25,35,\n63,17,35,54,32,35,62,47,41,35,63,51,241,127,0,240,47,70,53,79,254,21,227,\n240,18,240,166,243,180,168,194,63,0,240,47,0,240,47,0,194,47,1,242,79,21,5,\n15,53,244,137,67,241,34,6,243,107,240,255,35,240,227,76,241,197,240,175,40,\n240,122,242,95,68,15,79,241,255,3,111,41,240,238,27,241,207,12,241,79,27,\n43,241,67,143,82,50,52,26,251,15,50,255,224,8,53,63,22,53,55,32,32,32,47,\n15,63,37,38,32,66,38,67,53,92,98,38,246,96,224,240,44,245,112,80,57,32,68,\n112,32,32,35,42,51,100,80,240,63,25,255,233,107,241,242,241,242,247,87,52,\n29,241,98,6,3,242,136,15,2,240,122,98,98,98,98,98,98,98,111,66,15,254,12,\n146,240,184,132,52,95,70,114,47,74,35,111,25,79,78,240,63,11,242,127,0,255,\n224,244,255,240,0,138,143,60,255,240,4,12,143,28,255,227,127,243,95,30,63,\n253,79,0,177,240,111,31,240,47,15,63,64,241,152,63,87,63,20,39,243,26,34,\n35,47,7,240,255,36,240,15,34,243,5,64,32,223,12,191,7,240,191,13,143,31,\n240,224,240,36,41,180,47,25,240,146,39,240,111,7,64,79,34,32,65,52,48,32,\n240,162,58,130,213,53,53,166,38,47,27,41,191,99,240,255,255,0,26,150,223,7,\n95,33,255,240,0,255,143,254,6,3,245,175,24,109,70,2,146,194,66,2,18,18,245,\n207,19,255,224,93,240,79,48,63,38,241,171,246,100,47,119,241,111,10,127,10,\n207,73,69,53,53,50,0,\n};\n#endif\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n/* IdentifierStart production with Letter and ASCII excluded */\n/* duk_unicode_ids_m_let_noa[] */\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_ids_m_let_noa[42] = {\n255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89,\n249,255,240,4,148,79,37,255,224,192,9,15,120,79,255,0,15,30,245,240,\n};\n#else\n/* IdentifierStart production with Letter, ASCII, and non-BMP excluded */\n/* duk_unicode_ids_m_let_noabmp[] */\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_ids_m_let_noabmp[24] = {\n255,240,0,94,18,255,233,99,241,51,63,254,215,32,240,184,240,2,255,240,6,89,\n249,0,\n};\n#endif\n\n#if defined(DUK_USE_SOURCE_NONBMP)\n/* IdentifierPart production with IdentifierStart and ASCII excluded */\n/* duk_unicode_idp_m_ids_noa[] */\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_idp_m_ids_noa[530] = {\n255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112,\n245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34,\n36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50,\n160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240,\n97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9,\n240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50,\n242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41,\n244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245,\n111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241,\n241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242,\n244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57,\n241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31,\n35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31,\n255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242,\n79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29,\n208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3,\n225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,15,254,27,16,253,64,\n248,116,255,224,25,159,254,68,178,33,99,241,162,80,249,113,255,228,13,47,\n39,239,17,159,1,63,31,175,39,151,47,22,210,159,37,13,47,34,218,36,159,68,\n183,15,146,182,151,63,42,2,99,19,42,11,19,100,79,178,240,42,159,72,240,77,\n159,199,99,143,13,31,68,240,31,1,159,67,201,159,69,229,159,254,9,169,255,\n226,57,114,127,2,159,42,240,98,223,255,0,60,157,159,120,79,45,111,11,159,\n254,46,191,30,240,35,255,240,3,191,225,255,240,0,59,164,69,151,54,241,3,\n248,98,255,228,125,242,47,254,15,79,39,95,34,144,240,0,240,132,46,255,228,\n68,98,240,19,98,18,79,254,121,150,245,246,105,255,240,192,105,175,224,0,\n};\n#else\n/* IdentifierPart production with IdentifierStart, ASCII, and non-BMP excluded */\n/* duk_unicode_idp_m_ids_noabmp[] */\n/*\n *  Automatically generated by extract_chars.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_idp_m_ids_noabmp[357] = {\n255,225,243,246,15,254,0,116,255,191,29,32,33,33,32,243,170,242,47,15,112,\n245,118,53,49,35,57,240,144,241,15,11,244,218,240,25,241,56,241,67,40,34,\n36,241,210,246,173,47,17,242,130,47,2,38,177,57,240,50,242,160,38,49,50,\n160,177,57,240,50,242,160,36,81,50,64,240,107,64,194,242,160,39,34,34,240,\n97,57,240,50,242,160,38,49,50,145,177,57,240,64,242,212,66,35,160,240,9,\n240,35,242,198,34,35,129,193,57,240,50,242,160,38,34,35,129,193,57,240,50,\n242,198,34,35,160,177,57,240,65,243,128,85,32,39,121,49,242,240,54,215,41,\n244,144,53,33,197,57,243,1,121,192,32,32,81,242,63,4,33,106,47,20,160,245,\n111,4,41,211,82,34,54,67,235,46,255,225,179,47,254,42,98,240,242,240,241,\n241,1,243,47,16,160,57,241,50,57,245,209,241,64,246,139,91,185,247,41,242,\n244,242,185,47,13,58,121,240,141,243,68,242,31,1,201,240,56,210,241,12,57,\n241,237,242,47,4,153,121,246,130,47,5,80,82,65,251,143,38,100,255,225,0,31,\n35,31,5,15,109,197,4,191,254,175,34,247,240,245,47,16,255,225,30,95,91,31,\n255,0,100,121,159,55,5,159,18,31,66,31,254,0,64,64,80,240,148,244,161,242,\n79,2,185,127,2,240,9,240,231,240,188,241,227,242,29,240,25,192,185,242,29,\n208,145,57,241,50,242,64,34,49,97,32,241,180,97,253,231,33,57,255,240,3,\n225,128,255,225,213,240,15,2,240,4,31,10,47,178,159,23,0,\n};\n#endif\n\n/*\n *  Case conversion tables generated using tools/extract_caseconv.py.\n */\n\n/* duk_unicode_caseconv_uc[] */\n/* duk_unicode_caseconv_lc[] */\n\n/*\n *  Automatically generated by extract_caseconv.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_caseconv_uc[1386] = {\n144,3,128,3,0,184,7,192,6,192,112,35,242,199,224,64,74,192,49,32,128,162,\n128,108,65,1,189,129,254,131,3,173,3,136,6,7,98,7,34,68,15,12,14,140,72,30,\n104,28,112,32,67,0,65,4,0,138,0,128,4,1,88,65,76,83,9,252,9,248,6,28,131,4,\n33,4,62,0,62,16,32,124,64,124,96,48,249,0,249,64,129,243,1,243,129,3,232,3,\n233,1,135,216,7,218,4,15,184,15,221,2,31,114,31,200,8,62,236,63,180,8,125,\n224,127,224,16,251,208,255,80,33,247,193,255,160,67,246,3,247,0,135,244,7,\n246,1,15,240,15,244,2,33,112,33,96,32,73,160,73,108,104,176,192,176,1,121,\n104,0,133,2,106,183,1,58,10,31,232,63,228,38,162,1,1,1,0,48,2,102,2,100,12,\n4,232,4,228,64,10,88,10,81,112,23,160,23,144,96,48,96,48,64,128,104,64,104,\n1,128,218,0,217,130,1,206,1,205,16,3,190,3,188,36,7,228,7,224,160,17,24,17,\n16,144,36,112,36,96,160,110,32,110,0,128,246,64,246,6,2,48,130,48,17,4,139,\n4,138,54,9,132,9,130,28,19,68,19,65,128,240,8,240,4,177,234,17,234,6,3,234,\n35,235,33,11,26,11,25,193,150,64,150,64,50,44,236,44,235,5,76,131,76,128,\n94,154,6,154,0,117,57,29,57,16,122,115,58,115,35,244,239,84,239,32,169,223,\n233,223,130,211,200,211,200,2,167,151,167,150,21,79,107,79,104,8,112,26,\n208,26,192,64,56,160,56,128,192,113,128,113,1,128,249,0,248,130,2,128,1,\n166,4,7,240,7,238,8,177,204,177,200,16,96,49,0,48,224,128,110,64,110,1,1,\n51,83,213,2,0,48,35,192,35,176,64,77,32,50,192,139,73,196,49,193,127,48,2,\n212,14,112,3,252,5,224,4,196,1,36,5,252,1,76,6,0,9,12,6,72,6,68,6,84,7,216,\n6,100,6,96,6,104,8,244,6,120,8,128,6,160,6,156,6,252,7,220,7,116,6,56,7,\n204,7,196,9,64,177,188,9,68,177,180,9,72,177,192,9,76,6,4,9,80,6,24,9,100,\n6,60,9,108,6,64,9,114,158,172,9,128,6,76,9,134,158,176,9,140,6,80,9,150,\n158,52,9,160,6,92,9,172,177,136,9,178,158,180,9,196,177,184,9,200,6,116,9,\n212,6,124,9,244,177,144,10,30,158,196,10,32,6,184,10,36,9,16,10,48,9,20,10,\n72,6,220,10,118,158,200,10,122,158,192,13,20,14,100,13,220,13,216,14,176,\n14,24,15,8,14,140,15,48,14,48,15,64,14,72,15,68,14,96,15,84,14,152,15,88,\n14,128,15,92,15,60,15,192,14,104,15,196,14,132,15,200,15,228,15,204,13,252,\n15,212,14,84,19,60,19,0,114,0,16,72,114,4,16,80,114,8,16,120,114,20,16,136,\n114,24,16,168,114,28,17,136,114,34,153,40,117,230,157,244,117,244,177,140,\n122,108,121,128,126,248,14,100,127,148,127,176,133,56,132,200,134,16,134,\n12,177,132,177,128,177,148,8,232,177,152,8,248,179,204,179,202,158,50,158,\n46,173,78,158,207,48,6,252,0,166,0,166,2,147,1,94,0,39,0,248,64,9,64,97,\n128,114,24,28,200,24,64,24,8,29,134,7,74,6,16,6,2,11,15,2,154,130,169,15,\n75,64,9,0,102,35,210,240,2,160,24,64,244,196,0,174,6,20,61,51,0,44,129,133,\n15,77,64,8,32,87,195,234,16,29,40,24,152,250,150,7,74,6,38,6,0,62,169,129,\n210,129,137,129,128,143,171,96,116,160,98,96,104,67,240,16,248,64,28,200,\n252,12,62,18,7,50,63,5,15,133,1,204,143,193,195,225,96,115,35,240,144,248,\n96,28,200,252,44,62,26,7,50,63,13,15,135,1,204,143,195,195,225,224,115,35,\n241,16,248,64,28,200,252,76,62,18,7,50,63,21,15,133,1,204,143,197,195,225,\n96,115,35,241,144,248,96,28,200,252,108,62,26,7,50,63,29,15,135,1,204,143,\n199,195,225,224,115,35,242,16,249,64,28,200,252,140,62,82,7,50,63,37,15,\n149,1,204,143,201,195,229,96,115,35,242,144,249,96,28,200,252,172,62,90,7,\n50,63,45,15,151,1,204,143,203,195,229,224,115,35,243,16,249,64,28,200,252,\n204,62,82,7,50,63,53,15,149,1,204,143,205,195,229,96,115,35,243,144,249,96,\n28,200,252,236,62,90,7,50,63,61,15,151,1,204,143,207,195,229,224,115,35,\n244,16,251,64,28,200,253,12,62,210,7,50,63,69,15,181,1,204,143,209,195,237,\n96,115,35,244,144,251,96,28,200,253,44,62,218,7,50,63,77,15,183,1,204,143,\n211,195,237,224,115,35,245,16,251,64,28,200,253,76,62,210,7,50,63,85,15,\n181,1,204,143,213,195,237,96,115,35,245,144,251,96,28,200,253,108,62,218,7,\n50,63,93,15,183,1,204,143,215,195,237,224,115,35,246,80,253,208,28,200,253,\n156,7,34,7,50,63,105,1,195,1,204,143,219,64,114,32,104,67,246,248,28,136,\n26,16,28,200,253,228,7,34,7,50,63,133,15,229,1,204,143,225,192,114,224,115,\n35,248,144,28,72,28,200,254,52,7,46,6,132,63,143,129,203,129,161,1,204,143,\n230,64,114,224,115,35,250,88,28,200,24,64,24,0,254,158,7,50,6,16,6,2,63,\n173,1,204,129,161,15,235,224,115,32,97,0,104,67,252,88,29,40,24,64,24,0,\n255,30,7,74,6,16,6,2,63,201,1,208,129,137,143,243,64,116,160,104,67,252,\n248,29,40,24,64,26,16,255,148,63,244,7,50,63,231,1,212,129,204,143,250,64,\n113,224,115,35,254,208,29,72,26,16,255,190,7,82,6,132,7,50,63,249,1,212,\n129,204,253,128,64,8,192,8,223,96,48,2,48,2,79,216,20,0,140,0,153,246,7,\n128,35,0,35,0,36,253,130,96,8,192,8,192,9,159,96,176,2,152,2,167,216,52,0,\n166,0,169,246,39,2,162,2,163,125,138,64,168,128,166,191,98,176,42,32,41,\n223,216,180,10,156,10,141,246,47,2,162,2,158,128,\n};\nconst duk_uint8_t duk_unicode_caseconv_lc[680] = {\n152,3,0,3,128,184,6,192,7,192,112,24,144,37,96,64,54,32,81,64,128,226,0,\n235,65,129,199,1,230,130,3,145,3,177,34,7,70,7,134,36,15,244,13,236,24,32,\n0,34,129,0,65,0,67,4,0,166,32,172,41,132,40,11,64,19,9,208,85,184,80,19,\n240,19,248,12,62,16,62,0,32,124,96,124,64,48,249,64,249,0,129,243,129,243,\n1,3,233,3,232,1,135,218,7,216,4,15,196,15,192,8,31,152,31,144,16,63,80,63,\n64,32,126,224,126,192,16,253,208,251,128,33,252,129,247,32,131,251,3,250,0,\n135,246,135,221,129,15,244,15,240,2,31,234,31,122,4,63,240,62,240,8,127,\n232,125,240,17,11,1,11,129,2,75,98,77,3,69,128,5,134,11,203,31,128,143,193,\n127,144,255,160,154,140,4,0,4,4,192,9,144,9,152,48,19,144,19,161,0,41,64,\n41,101,192,94,64,94,129,128,193,0,193,130,1,160,1,161,6,3,102,3,104,8,7,44,\n7,48,72,14,240,14,248,144,31,32,31,48,64,63,0,63,37,0,136,128,136,196,129,\n35,1,35,133,3,112,3,113,4,7,176,7,178,48,17,128,17,132,136,36,80,36,89,176,\n76,16,76,32,224,154,0,154,44,7,128,7,128,101,143,80,15,80,176,31,89,31,81,\n8,88,206,88,208,12,178,0,178,5,145,103,89,103,96,42,100,10,100,18,244,208,\n20,208,35,169,200,169,200,195,211,153,83,153,159,167,121,167,122,5,78,253,\n78,254,22,158,66,158,68,21,60,181,60,184,170,123,74,123,80,67,0,211,1,64,2,\n1,172,1,173,4,3,136,3,140,12,7,20,7,24,16,31,184,31,192,34,199,34,199,48,\n65,128,195,128,196,2,1,184,1,185,5,79,84,4,204,8,0,192,101,128,154,65,1,29,\n129,30,2,16,199,45,39,5,251,240,23,128,15,240,24,16,37,48,24,96,37,64,24,\n224,29,208,24,240,37,144,25,0,37,176,25,16,25,32,25,48,38,0,25,64,38,48,25,\n112,38,128,25,128,25,144,25,208,39,32,25,240,39,80,26,112,26,128,26,224,40,\n128,27,112,41,32,31,16,31,48,31,96,25,80,31,112,27,240,34,0,25,224,35,162,\n198,80,35,208,25,160,35,226,198,96,36,48,24,0,36,64,40,144,36,80,40,192,55,\n96,55,112,55,240,63,48,56,96,58,192,56,192,60,192,60,240,61,112,63,64,59,\n128,63,144,63,32,76,0,76,241,233,224,13,241,251,193,251,49,252,193,252,49,\n254,193,254,81,255,193,255,50,18,96,60,146,18,160,6,178,18,176,14,82,19,34,\n20,226,24,50,24,66,198,2,198,18,198,32,38,178,198,49,215,210,198,64,39,210,\n198,208,37,18,198,224,39,18,198,240,37,2,199,0,37,34,207,34,207,58,119,209,\n215,154,120,186,120,202,120,208,38,90,122,176,37,202,122,192,38,26,122,208,\n38,202,123,0,41,234,123,16,40,122,123,32,41,218,123,58,181,48,32,38,16,3,\n72,24,56,\n};\n\n#if defined(DUK_USE_REGEXP_CANON_WORKAROUND)\n/*\n *  Automatically generated by extract_caseconv.py, do not edit!\n */\n\nconst duk_uint16_t duk_unicode_re_canon_lookup[65536] = {\n0,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,\n28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,\n53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,\n78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,65,66,67,68,69,70,\n71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,123,124,125,\n126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,\n144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,\n162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,\n180,924,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,\n198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,\n216,217,218,219,220,221,222,223,192,193,194,195,196,197,198,199,200,201,\n202,203,204,205,206,207,208,209,210,211,212,213,214,247,216,217,218,219,\n220,221,222,376,256,256,258,258,260,260,262,262,264,264,266,266,268,268,\n270,270,272,272,274,274,276,276,278,278,280,280,282,282,284,284,286,286,\n288,288,290,290,292,292,294,294,296,296,298,298,300,300,302,302,304,305,\n306,306,308,308,310,310,312,313,313,315,315,317,317,319,319,321,321,323,\n323,325,325,327,327,329,330,330,332,332,334,334,336,336,338,338,340,340,\n342,342,344,344,346,346,348,348,350,350,352,352,354,354,356,356,358,358,\n360,360,362,362,364,364,366,366,368,368,370,370,372,372,374,374,376,377,\n377,379,379,381,381,383,579,385,386,386,388,388,390,391,391,393,394,395,\n395,397,398,399,400,401,401,403,404,502,406,407,408,408,573,411,412,413,\n544,415,416,416,418,418,420,420,422,423,423,425,426,427,428,428,430,431,\n431,433,434,435,435,437,437,439,440,440,442,443,444,444,446,503,448,449,\n450,451,452,452,452,455,455,455,458,458,458,461,461,463,463,465,465,467,\n467,469,469,471,471,473,473,475,475,398,478,478,480,480,482,482,484,484,\n486,486,488,488,490,490,492,492,494,494,496,497,497,497,500,500,502,503,\n504,504,506,506,508,508,510,510,512,512,514,514,516,516,518,518,520,520,\n522,522,524,524,526,526,528,528,530,530,532,532,534,534,536,536,538,538,\n540,540,542,542,544,545,546,546,548,548,550,550,552,552,554,554,556,556,\n558,558,560,560,562,562,564,565,566,567,568,569,570,571,571,573,574,11390,\n11391,577,577,579,580,581,582,582,584,584,586,586,588,588,590,590,11375,\n11373,11376,385,390,597,393,394,600,399,602,400,42923L,605,606,607,403,\n42924L,610,404,612,42893L,42922L,615,407,406,42926L,11362,42925L,621,622,\n412,624,11374,413,627,628,415,630,631,632,633,634,635,636,11364,638,639,\n422,641,642,425,644,645,646,42929L,430,580,433,434,581,653,654,655,656,657,\n439,659,660,661,662,663,664,665,666,667,668,42930L,42928L,671,672,673,674,\n675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,\n693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,\n711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,\n729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,\n747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,\n765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,\n783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,\n801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,\n819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,\n921,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,\n855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,\n873,874,875,876,877,878,879,880,880,882,882,884,885,886,886,888,889,890,\n1021,1022,1023,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,\n909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,\n927,928,929,930,931,932,933,934,935,936,937,938,939,902,904,905,906,944,\n913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,\n931,932,933,934,935,936,937,938,939,908,910,911,975,914,920,978,979,980,\n934,928,975,984,984,986,986,988,988,990,990,992,992,994,994,996,996,998,\n998,1000,1000,1002,1002,1004,1004,1006,1006,922,929,1017,895,1012,917,1014,\n1015,1015,1017,1018,1018,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,\n1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,\n1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,\n1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1040,1041,1042,\n1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,\n1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1024,\n1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,\n1120,1120,1122,1122,1124,1124,1126,1126,1128,1128,1130,1130,1132,1132,1134,\n1134,1136,1136,1138,1138,1140,1140,1142,1142,1144,1144,1146,1146,1148,1148,\n1150,1150,1152,1152,1154,1155,1156,1157,1158,1159,1160,1161,1162,1162,1164,\n1164,1166,1166,1168,1168,1170,1170,1172,1172,1174,1174,1176,1176,1178,1178,\n1180,1180,1182,1182,1184,1184,1186,1186,1188,1188,1190,1190,1192,1192,1194,\n1194,1196,1196,1198,1198,1200,1200,1202,1202,1204,1204,1206,1206,1208,1208,\n1210,1210,1212,1212,1214,1214,1216,1217,1217,1219,1219,1221,1221,1223,1223,\n1225,1225,1227,1227,1229,1229,1216,1232,1232,1234,1234,1236,1236,1238,1238,\n1240,1240,1242,1242,1244,1244,1246,1246,1248,1248,1250,1250,1252,1252,1254,\n1254,1256,1256,1258,1258,1260,1260,1262,1262,1264,1264,1266,1266,1268,1268,\n1270,1270,1272,1272,1274,1274,1276,1276,1278,1278,1280,1280,1282,1282,1284,\n1284,1286,1286,1288,1288,1290,1290,1292,1292,1294,1294,1296,1296,1298,1298,\n1300,1300,1302,1302,1304,1304,1306,1306,1308,1308,1310,1310,1312,1312,1314,\n1314,1316,1316,1318,1318,1320,1320,1322,1322,1324,1324,1326,1326,1328,1329,\n1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,\n1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,\n1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,\n1375,1376,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,\n1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,\n1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1415,1416,1417,1418,1419,\n1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,\n1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,\n1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,\n1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,\n1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,\n1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,\n1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,\n1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,\n1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,\n1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,\n1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,\n1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,\n1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,\n1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,\n1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,\n1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,\n1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,\n1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,\n1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,\n1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,\n1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,\n1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,\n1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,\n1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,\n1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,\n1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,\n1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,\n1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,\n1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,\n1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,\n1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,\n1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,\n1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,\n1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,\n1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,\n1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,\n1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,\n1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,\n1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,\n2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,\n2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033,2034,\n2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,\n2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,\n2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,\n2080,2081,2082,2083,2084,2085,2086,2087,2088,2089,2090,2091,2092,2093,2094,\n2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,\n2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,\n2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,\n2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,\n2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,\n2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,\n2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,\n2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,\n2215,2216,2217,2218,2219,2220,2221,2222,2223,2224,2225,2226,2227,2228,2229,\n2230,2231,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,\n2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,\n2260,2261,2262,2263,2264,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,\n2275,2276,2277,2278,2279,2280,2281,2282,2283,2284,2285,2286,2287,2288,2289,\n2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,\n2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,\n2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,\n2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,\n2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,\n2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,\n2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,\n2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2409,\n2410,2411,2412,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,\n2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,\n2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,\n2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,\n2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,\n2485,2486,2487,2488,2489,2490,2491,2492,2493,2494,2495,2496,2497,2498,2499,\n2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,\n2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,2529,\n2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,\n2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,2559,\n2560,2561,2562,2563,2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,\n2575,2576,2577,2578,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,\n2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2601,2602,2603,2604,\n2605,2606,2607,2608,2609,2610,2611,2612,2613,2614,2615,2616,2617,2618,2619,\n2620,2621,2622,2623,2624,2625,2626,2627,2628,2629,2630,2631,2632,2633,2634,\n2635,2636,2637,2638,2639,2640,2641,2642,2643,2644,2645,2646,2647,2648,2649,\n2650,2651,2652,2653,2654,2655,2656,2657,2658,2659,2660,2661,2662,2663,2664,\n2665,2666,2667,2668,2669,2670,2671,2672,2673,2674,2675,2676,2677,2678,2679,\n2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690,2691,2692,2693,2694,\n2695,2696,2697,2698,2699,2700,2701,2702,2703,2704,2705,2706,2707,2708,2709,\n2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,\n2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735,2736,2737,2738,2739,\n2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750,2751,2752,2753,2754,\n2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765,2766,2767,2768,2769,\n2770,2771,2772,2773,2774,2775,2776,2777,2778,2779,2780,2781,2782,2783,2784,\n2785,2786,2787,2788,2789,2790,2791,2792,2793,2794,2795,2796,2797,2798,2799,\n2800,2801,2802,2803,2804,2805,2806,2807,2808,2809,2810,2811,2812,2813,2814,\n2815,2816,2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,\n2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,\n2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2857,2858,2859,\n2860,2861,2862,2863,2864,2865,2866,2867,2868,2869,2870,2871,2872,2873,2874,\n2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,\n2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901,2902,2903,2904,\n2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915,2916,2917,2918,2919,\n2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,2931,2932,2933,2934,\n2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,\n2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,\n2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976,2977,2978,2979,\n2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992,2993,2994,\n2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008,3009,\n3010,3011,3012,3013,3014,3015,3016,3017,3018,3019,3020,3021,3022,3023,3024,\n3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037,3038,3039,\n3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,\n3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066,3067,3068,3069,\n3070,3071,3072,3073,3074,3075,3076,3077,3078,3079,3080,3081,3082,3083,3084,\n3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,\n3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3113,3114,\n3115,3116,3117,3118,3119,3120,3121,3122,3123,3124,3125,3126,3127,3128,3129,\n3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140,3141,3142,3143,3144,\n3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156,3157,3158,3159,\n3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,\n3175,3176,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187,3188,3189,\n3190,3191,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201,3202,3203,3204,\n3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217,3218,3219,\n3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,\n3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248,3249,\n3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264,\n3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,3278,3279,\n3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,\n3295,3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,\n3310,3311,3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,\n3325,3326,3327,3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,\n3340,3341,3342,3343,3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,\n3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,\n3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,\n3385,3386,3387,3388,3389,3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,\n3400,3401,3402,3403,3404,3405,3406,3407,3408,3409,3410,3411,3412,3413,3414,\n3415,3416,3417,3418,3419,3420,3421,3422,3423,3424,3425,3426,3427,3428,3429,\n3430,3431,3432,3433,3434,3435,3436,3437,3438,3439,3440,3441,3442,3443,3444,\n3445,3446,3447,3448,3449,3450,3451,3452,3453,3454,3455,3456,3457,3458,3459,\n3460,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,\n3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488,3489,\n3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,\n3505,3506,3507,3508,3509,3510,3511,3512,3513,3514,3515,3516,3517,3518,3519,\n3520,3521,3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,\n3535,3536,3537,3538,3539,3540,3541,3542,3543,3544,3545,3546,3547,3548,3549,\n3550,3551,3552,3553,3554,3555,3556,3557,3558,3559,3560,3561,3562,3563,3564,\n3565,3566,3567,3568,3569,3570,3571,3572,3573,3574,3575,3576,3577,3578,3579,\n3580,3581,3582,3583,3584,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,\n3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,\n3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,\n3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,\n3640,3641,3642,3643,3644,3645,3646,3647,3648,3649,3650,3651,3652,3653,3654,\n3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,\n3670,3671,3672,3673,3674,3675,3676,3677,3678,3679,3680,3681,3682,3683,3684,\n3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695,3696,3697,3698,3699,\n3700,3701,3702,3703,3704,3705,3706,3707,3708,3709,3710,3711,3712,3713,3714,\n3715,3716,3717,3718,3719,3720,3721,3722,3723,3724,3725,3726,3727,3728,3729,\n3730,3731,3732,3733,3734,3735,3736,3737,3738,3739,3740,3741,3742,3743,3744,\n3745,3746,3747,3748,3749,3750,3751,3752,3753,3754,3755,3756,3757,3758,3759,\n3760,3761,3762,3763,3764,3765,3766,3767,3768,3769,3770,3771,3772,3773,3774,\n3775,3776,3777,3778,3779,3780,3781,3782,3783,3784,3785,3786,3787,3788,3789,\n3790,3791,3792,3793,3794,3795,3796,3797,3798,3799,3800,3801,3802,3803,3804,\n3805,3806,3807,3808,3809,3810,3811,3812,3813,3814,3815,3816,3817,3818,3819,\n3820,3821,3822,3823,3824,3825,3826,3827,3828,3829,3830,3831,3832,3833,3834,\n3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,\n3850,3851,3852,3853,3854,3855,3856,3857,3858,3859,3860,3861,3862,3863,3864,\n3865,3866,3867,3868,3869,3870,3871,3872,3873,3874,3875,3876,3877,3878,3879,\n3880,3881,3882,3883,3884,3885,3886,3887,3888,3889,3890,3891,3892,3893,3894,\n3895,3896,3897,3898,3899,3900,3901,3902,3903,3904,3905,3906,3907,3908,3909,\n3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,\n3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,\n3940,3941,3942,3943,3944,3945,3946,3947,3948,3949,3950,3951,3952,3953,3954,\n3955,3956,3957,3958,3959,3960,3961,3962,3963,3964,3965,3966,3967,3968,3969,\n3970,3971,3972,3973,3974,3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,\n3985,3986,3987,3988,3989,3990,3991,3992,3993,3994,3995,3996,3997,3998,3999,\n4000,4001,4002,4003,4004,4005,4006,4007,4008,4009,4010,4011,4012,4013,4014,\n4015,4016,4017,4018,4019,4020,4021,4022,4023,4024,4025,4026,4027,4028,4029,\n4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040,4041,4042,4043,4044,\n4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055,4056,4057,4058,4059,\n4060,4061,4062,4063,4064,4065,4066,4067,4068,4069,4070,4071,4072,4073,4074,\n4075,4076,4077,4078,4079,4080,4081,4082,4083,4084,4085,4086,4087,4088,4089,\n4090,4091,4092,4093,4094,4095,4096,4097,4098,4099,4100,4101,4102,4103,4104,\n4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,\n4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,\n4135,4136,4137,4138,4139,4140,4141,4142,4143,4144,4145,4146,4147,4148,4149,\n4150,4151,4152,4153,4154,4155,4156,4157,4158,4159,4160,4161,4162,4163,4164,\n4165,4166,4167,4168,4169,4170,4171,4172,4173,4174,4175,4176,4177,4178,4179,\n4180,4181,4182,4183,4184,4185,4186,4187,4188,4189,4190,4191,4192,4193,4194,\n4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205,4206,4207,4208,4209,\n4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,\n4225,4226,4227,4228,4229,4230,4231,4232,4233,4234,4235,4236,4237,4238,4239,\n4240,4241,4242,4243,4244,4245,4246,4247,4248,4249,4250,4251,4252,4253,4254,\n4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,\n4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,\n4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4297,4298,4299,\n4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,\n4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,\n4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,\n4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,\n4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,\n4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,\n4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,\n4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,\n4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,\n4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,\n4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,\n4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,\n4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,\n4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,\n4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,\n4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,\n4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,\n4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,\n4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,\n4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,\n4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,\n4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,\n4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,\n4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,\n4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,\n4675,4676,4677,4678,4679,4680,4681,4682,4683,4684,4685,4686,4687,4688,4689,\n4690,4691,4692,4693,4694,4695,4696,4697,4698,4699,4700,4701,4702,4703,4704,\n4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,\n4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,\n4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749,\n4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,\n4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,\n4780,4781,4782,4783,4784,4785,4786,4787,4788,4789,4790,4791,4792,4793,4794,\n4795,4796,4797,4798,4799,4800,4801,4802,4803,4804,4805,4806,4807,4808,4809,\n4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4823,4824,\n4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,\n4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,\n4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,\n4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4881,4882,4883,4884,\n4885,4886,4887,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,\n4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,\n4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,\n4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,\n4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4955,4956,4957,4958,4959,\n4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970,4971,4972,4973,4974,\n4975,4976,4977,4978,4979,4980,4981,4982,4983,4984,4985,4986,4987,4988,4989,\n4990,4991,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,\n5005,5006,5007,5008,5009,5010,5011,5012,5013,5014,5015,5016,5017,5018,5019,\n5020,5021,5022,5023,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,\n5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,\n5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,\n5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,\n5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,\n5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5109,\n5110,5111,5104,5105,5106,5107,5108,5109,5118,5119,5120,5121,5122,5123,5124,\n5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,\n5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,\n5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,\n5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,\n5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,\n5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,\n5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,\n5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,\n5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,\n5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,\n5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,\n5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,\n5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,\n5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,\n5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,\n5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,\n5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,\n5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,\n5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,\n5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,\n5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,\n5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,\n5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,\n5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,\n5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,\n5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,\n5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,\n5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,\n5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,\n5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,\n5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,\n5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,\n5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,\n5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,\n5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,\n5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,\n5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,\n5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,\n5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,\n5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,\n5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,\n5740,5741,5742,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,\n5755,5756,5757,5758,5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,5769,\n5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,\n5785,5786,5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,\n5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,\n5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,\n5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,\n5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,\n5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,\n5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,\n5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,\n5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,\n5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,\n5935,5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,\n5950,5951,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,\n5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,\n5980,5981,5982,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,\n5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009,\n6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,\n6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,\n6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,\n6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,\n6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,\n6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,\n6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,\n6115,6116,6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,\n6130,6131,6132,6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,\n6145,6146,6147,6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,\n6160,6161,6162,6163,6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,\n6175,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,\n6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,\n6205,6206,6207,6208,6209,6210,6211,6212,6213,6214,6215,6216,6217,6218,6219,\n6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,\n6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,\n6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6264,\n6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275,6276,6277,6278,6279,\n6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,\n6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,\n6310,6311,6312,6313,6314,6315,6316,6317,6318,6319,6320,6321,6322,6323,6324,\n6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,\n6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,\n6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,\n6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,\n6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397,6398,6399,\n6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,\n6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6429,\n6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6444,\n6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456,6457,6458,6459,\n6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474,\n6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,\n6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,\n6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,\n6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,\n6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,\n6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,\n6565,6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,\n6580,6581,6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,\n6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,\n6610,6611,6612,6613,6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,\n6625,6626,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,6639,\n6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,\n6655,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,\n6670,6671,6672,6673,6674,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,\n6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,\n6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,\n6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,\n6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,\n6745,6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,\n6760,6761,6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,\n6775,6776,6777,6778,6779,6780,6781,6782,6783,6784,6785,6786,6787,6788,6789,\n6790,6791,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,\n6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,\n6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,\n6835,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,6847,6848,6849,\n6850,6851,6852,6853,6854,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864,\n6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,\n6880,6881,6882,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894,\n6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,6905,6906,6907,6908,6909,\n6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,\n6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,\n6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,\n6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968,6969,\n6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984,\n6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,6998,6999,\n7000,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013,7014,\n7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029,\n7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042,7043,7044,\n7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,\n7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074,\n7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,\n7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,\n7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,\n7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,\n7135,7136,7137,7138,7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,\n7150,7151,7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,\n7165,7166,7167,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,\n7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,\n7195,7196,7197,7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,\n7210,7211,7212,7213,7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,\n7225,7226,7227,7228,7229,7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,\n7240,7241,7242,7243,7244,7245,7246,7247,7248,7249,7250,7251,7252,7253,7254,\n7255,7256,7257,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,\n7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,\n7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,1042,1044,1054,1057,\n1058,1058,1066,1122,42570L,7305,7306,7307,7308,7309,7310,7311,7312,7313,\n7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327,7328,\n7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343,\n7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,\n7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,\n7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,\n7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,\n7404,7405,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,\n7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,\n7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,\n7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,\n7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,\n7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,\n7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,\n7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,\n7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537,7538,\n7539,7540,7541,7542,7543,7544,42877L,7546,7547,7548,11363,7550,7551,7552,\n7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,\n7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,\n7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,\n7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,\n7613,7614,7615,7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,\n7628,7629,7630,7631,7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,\n7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,\n7658,7659,7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,7671,7672,\n7673,7674,7675,7676,7677,7678,7679,7680,7680,7682,7682,7684,7684,7686,7686,\n7688,7688,7690,7690,7692,7692,7694,7694,7696,7696,7698,7698,7700,7700,7702,\n7702,7704,7704,7706,7706,7708,7708,7710,7710,7712,7712,7714,7714,7716,7716,\n7718,7718,7720,7720,7722,7722,7724,7724,7726,7726,7728,7728,7730,7730,7732,\n7732,7734,7734,7736,7736,7738,7738,7740,7740,7742,7742,7744,7744,7746,7746,\n7748,7748,7750,7750,7752,7752,7754,7754,7756,7756,7758,7758,7760,7760,7762,\n7762,7764,7764,7766,7766,7768,7768,7770,7770,7772,7772,7774,7774,7776,7776,\n7778,7778,7780,7780,7782,7782,7784,7784,7786,7786,7788,7788,7790,7790,7792,\n7792,7794,7794,7796,7796,7798,7798,7800,7800,7802,7802,7804,7804,7806,7806,\n7808,7808,7810,7810,7812,7812,7814,7814,7816,7816,7818,7818,7820,7820,7822,\n7822,7824,7824,7826,7826,7828,7828,7830,7831,7832,7833,7834,7776,7836,7837,\n7838,7839,7840,7840,7842,7842,7844,7844,7846,7846,7848,7848,7850,7850,7852,\n7852,7854,7854,7856,7856,7858,7858,7860,7860,7862,7862,7864,7864,7866,7866,\n7868,7868,7870,7870,7872,7872,7874,7874,7876,7876,7878,7878,7880,7880,7882,\n7882,7884,7884,7886,7886,7888,7888,7890,7890,7892,7892,7894,7894,7896,7896,\n7898,7898,7900,7900,7902,7902,7904,7904,7906,7906,7908,7908,7910,7910,7912,\n7912,7914,7914,7916,7916,7918,7918,7920,7920,7922,7922,7924,7924,7926,7926,\n7928,7928,7930,7930,7932,7932,7934,7934,7944,7945,7946,7947,7948,7949,7950,\n7951,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,\n7958,7959,7960,7961,7962,7963,7964,7965,7966,7967,7976,7977,7978,7979,7980,\n7981,7982,7983,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,\n7996,7997,7998,7999,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,\n8011,8012,8013,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,8025,\n8018,8027,8020,8029,8022,8031,8024,8025,8026,8027,8028,8029,8030,8031,8040,\n8041,8042,8043,8044,8045,8046,8047,8040,8041,8042,8043,8044,8045,8046,8047,\n8122,8123,8136,8137,8138,8139,8154,8155,8184,8185,8170,8171,8186,8187,8062,\n8063,8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,\n8078,8079,8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,\n8093,8094,8095,8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,\n8108,8109,8110,8111,8120,8121,8114,8115,8116,8117,8118,8119,8120,8121,8122,\n8123,8124,8125,921,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,\n8138,8139,8140,8141,8142,8143,8152,8153,8146,8147,8148,8149,8150,8151,8152,\n8153,8154,8155,8156,8157,8158,8159,8168,8169,8162,8163,8164,8172,8166,8167,\n8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,8182,\n8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,\n8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,\n8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,\n8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,\n8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,\n8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,\n8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,\n8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,\n8303,8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,\n8318,8319,8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,\n8333,8334,8335,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,\n8348,8349,8350,8351,8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,\n8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,\n8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,\n8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405,8406,8407,\n8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421,8422,\n8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437,\n8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,\n8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,\n8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,\n8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,\n8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,\n8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8498,8527,\n8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,\n8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,\n8558,8559,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,\n8557,8558,8559,8576,8577,8578,8579,8579,8581,8582,8583,8584,8585,8586,8587,\n8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,\n8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,\n8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629,8630,8631,8632,\n8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645,8646,8647,\n8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661,8662,\n8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677,\n8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,\n8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,\n8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,\n8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,\n8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749,8750,8751,8752,\n8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,8764,8765,8766,8767,\n8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,\n8783,8784,8785,8786,8787,8788,8789,8790,8791,8792,8793,8794,8795,8796,8797,\n8798,8799,8800,8801,8802,8803,8804,8805,8806,8807,8808,8809,8810,8811,8812,\n8813,8814,8815,8816,8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,\n8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839,8840,8841,8842,\n8843,8844,8845,8846,8847,8848,8849,8850,8851,8852,8853,8854,8855,8856,8857,\n8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870,8871,8872,\n8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,8885,8886,8887,\n8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901,8902,\n8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,\n8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,\n8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,\n8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,\n8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,\n8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,\n8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,\n9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,\n9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,\n9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,\n9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,\n9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,\n9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,\n9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,\n9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,\n9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,\n9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,\n9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,\n9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,\n9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,\n9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,\n9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,\n9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,\n9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,\n9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,9275,9276,9277,\n9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,9290,9291,9292,\n9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,9305,9306,9307,\n9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,\n9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,9333,9334,9335,9336,9337,\n9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9352,\n9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,\n9368,9369,9370,9371,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,\n9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,\n9398,9399,9400,9401,9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,\n9413,9414,9415,9416,9417,9418,9419,9420,9421,9422,9423,9398,9399,9400,9401,\n9402,9403,9404,9405,9406,9407,9408,9409,9410,9411,9412,9413,9414,9415,9416,\n9417,9418,9419,9420,9421,9422,9423,9450,9451,9452,9453,9454,9455,9456,9457,\n9458,9459,9460,9461,9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,\n9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,\n9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,\n9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,\n9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,\n9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,\n9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,\n9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,\n9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,9590,9591,9592,\n9593,9594,9595,9596,9597,9598,9599,9600,9601,9602,9603,9604,9605,9606,9607,\n9608,9609,9610,9611,9612,9613,9614,9615,9616,9617,9618,9619,9620,9621,9622,\n9623,9624,9625,9626,9627,9628,9629,9630,9631,9632,9633,9634,9635,9636,9637,\n9638,9639,9640,9641,9642,9643,9644,9645,9646,9647,9648,9649,9650,9651,9652,\n9653,9654,9655,9656,9657,9658,9659,9660,9661,9662,9663,9664,9665,9666,9667,\n9668,9669,9670,9671,9672,9673,9674,9675,9676,9677,9678,9679,9680,9681,9682,\n9683,9684,9685,9686,9687,9688,9689,9690,9691,9692,9693,9694,9695,9696,9697,\n9698,9699,9700,9701,9702,9703,9704,9705,9706,9707,9708,9709,9710,9711,9712,\n9713,9714,9715,9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,\n9728,9729,9730,9731,9732,9733,9734,9735,9736,9737,9738,9739,9740,9741,9742,\n9743,9744,9745,9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,\n9758,9759,9760,9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,\n9773,9774,9775,9776,9777,9778,9779,9780,9781,9782,9783,9784,9785,9786,9787,\n9788,9789,9790,9791,9792,9793,9794,9795,9796,9797,9798,9799,9800,9801,9802,\n9803,9804,9805,9806,9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,\n9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,\n9833,9834,9835,9836,9837,9838,9839,9840,9841,9842,9843,9844,9845,9846,9847,\n9848,9849,9850,9851,9852,9853,9854,9855,9856,9857,9858,9859,9860,9861,9862,\n9863,9864,9865,9866,9867,9868,9869,9870,9871,9872,9873,9874,9875,9876,9877,\n9878,9879,9880,9881,9882,9883,9884,9885,9886,9887,9888,9889,9890,9891,9892,\n9893,9894,9895,9896,9897,9898,9899,9900,9901,9902,9903,9904,9905,9906,9907,\n9908,9909,9910,9911,9912,9913,9914,9915,9916,9917,9918,9919,9920,9921,9922,\n9923,9924,9925,9926,9927,9928,9929,9930,9931,9932,9933,9934,9935,9936,9937,\n9938,9939,9940,9941,9942,9943,9944,9945,9946,9947,9948,9949,9950,9951,9952,\n9953,9954,9955,9956,9957,9958,9959,9960,9961,9962,9963,9964,9965,9966,9967,\n9968,9969,9970,9971,9972,9973,9974,9975,9976,9977,9978,9979,9980,9981,9982,\n9983,9984,9985,9986,9987,9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,\n9998,9999,10000,10001,10002,10003,10004,10005,10006,10007,10008,10009,\n10010,10011,10012,10013,10014,10015,10016,10017,10018,10019,10020,10021,\n10022,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033,\n10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,\n10046,10047,10048,10049,10050,10051,10052,10053,10054,10055,10056,10057,\n10058,10059,10060,10061,10062,10063,10064,10065,10066,10067,10068,10069,\n10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080,10081,\n10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,10093,\n10094,10095,10096,10097,10098,10099,10100,10101,10102,10103,10104,10105,\n10106,10107,10108,10109,10110,10111,10112,10113,10114,10115,10116,10117,\n10118,10119,10120,10121,10122,10123,10124,10125,10126,10127,10128,10129,\n10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,10141,\n10142,10143,10144,10145,10146,10147,10148,10149,10150,10151,10152,10153,\n10154,10155,10156,10157,10158,10159,10160,10161,10162,10163,10164,10165,\n10166,10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,\n10178,10179,10180,10181,10182,10183,10184,10185,10186,10187,10188,10189,\n10190,10191,10192,10193,10194,10195,10196,10197,10198,10199,10200,10201,\n10202,10203,10204,10205,10206,10207,10208,10209,10210,10211,10212,10213,\n10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,\n10226,10227,10228,10229,10230,10231,10232,10233,10234,10235,10236,10237,\n10238,10239,10240,10241,10242,10243,10244,10245,10246,10247,10248,10249,\n10250,10251,10252,10253,10254,10255,10256,10257,10258,10259,10260,10261,\n10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,\n10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,\n10286,10287,10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,\n10298,10299,10300,10301,10302,10303,10304,10305,10306,10307,10308,10309,\n10310,10311,10312,10313,10314,10315,10316,10317,10318,10319,10320,10321,\n10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,\n10334,10335,10336,10337,10338,10339,10340,10341,10342,10343,10344,10345,\n10346,10347,10348,10349,10350,10351,10352,10353,10354,10355,10356,10357,\n10358,10359,10360,10361,10362,10363,10364,10365,10366,10367,10368,10369,\n10370,10371,10372,10373,10374,10375,10376,10377,10378,10379,10380,10381,\n10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,10393,\n10394,10395,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,\n10406,10407,10408,10409,10410,10411,10412,10413,10414,10415,10416,10417,\n10418,10419,10420,10421,10422,10423,10424,10425,10426,10427,10428,10429,\n10430,10431,10432,10433,10434,10435,10436,10437,10438,10439,10440,10441,\n10442,10443,10444,10445,10446,10447,10448,10449,10450,10451,10452,10453,\n10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,\n10466,10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,\n10478,10479,10480,10481,10482,10483,10484,10485,10486,10487,10488,10489,\n10490,10491,10492,10493,10494,10495,10496,10497,10498,10499,10500,10501,\n10502,10503,10504,10505,10506,10507,10508,10509,10510,10511,10512,10513,\n10514,10515,10516,10517,10518,10519,10520,10521,10522,10523,10524,10525,\n10526,10527,10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,\n10538,10539,10540,10541,10542,10543,10544,10545,10546,10547,10548,10549,\n10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561,\n10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,10573,\n10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,\n10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,\n10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,10608,10609,\n10610,10611,10612,10613,10614,10615,10616,10617,10618,10619,10620,10621,\n10622,10623,10624,10625,10626,10627,10628,10629,10630,10631,10632,10633,\n10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,\n10646,10647,10648,10649,10650,10651,10652,10653,10654,10655,10656,10657,\n10658,10659,10660,10661,10662,10663,10664,10665,10666,10667,10668,10669,\n10670,10671,10672,10673,10674,10675,10676,10677,10678,10679,10680,10681,\n10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692,10693,\n10694,10695,10696,10697,10698,10699,10700,10701,10702,10703,10704,10705,\n10706,10707,10708,10709,10710,10711,10712,10713,10714,10715,10716,10717,\n10718,10719,10720,10721,10722,10723,10724,10725,10726,10727,10728,10729,\n10730,10731,10732,10733,10734,10735,10736,10737,10738,10739,10740,10741,\n10742,10743,10744,10745,10746,10747,10748,10749,10750,10751,10752,10753,\n10754,10755,10756,10757,10758,10759,10760,10761,10762,10763,10764,10765,\n10766,10767,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,\n10778,10779,10780,10781,10782,10783,10784,10785,10786,10787,10788,10789,\n10790,10791,10792,10793,10794,10795,10796,10797,10798,10799,10800,10801,\n10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812,10813,\n10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,\n10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,10837,\n10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849,\n10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861,\n10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,\n10874,10875,10876,10877,10878,10879,10880,10881,10882,10883,10884,10885,\n10886,10887,10888,10889,10890,10891,10892,10893,10894,10895,10896,10897,\n10898,10899,10900,10901,10902,10903,10904,10905,10906,10907,10908,10909,\n10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,10920,10921,\n10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,10933,\n10934,10935,10936,10937,10938,10939,10940,10941,10942,10943,10944,10945,\n10946,10947,10948,10949,10950,10951,10952,10953,10954,10955,10956,10957,\n10958,10959,10960,10961,10962,10963,10964,10965,10966,10967,10968,10969,\n10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,\n10982,10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,\n10994,10995,10996,10997,10998,10999,11000,11001,11002,11003,11004,11005,\n11006,11007,11008,11009,11010,11011,11012,11013,11014,11015,11016,11017,\n11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029,\n11030,11031,11032,11033,11034,11035,11036,11037,11038,11039,11040,11041,\n11042,11043,11044,11045,11046,11047,11048,11049,11050,11051,11052,11053,\n11054,11055,11056,11057,11058,11059,11060,11061,11062,11063,11064,11065,\n11066,11067,11068,11069,11070,11071,11072,11073,11074,11075,11076,11077,\n11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088,11089,\n11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,\n11102,11103,11104,11105,11106,11107,11108,11109,11110,11111,11112,11113,\n11114,11115,11116,11117,11118,11119,11120,11121,11122,11123,11124,11125,\n11126,11127,11128,11129,11130,11131,11132,11133,11134,11135,11136,11137,\n11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,\n11150,11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,\n11162,11163,11164,11165,11166,11167,11168,11169,11170,11171,11172,11173,\n11174,11175,11176,11177,11178,11179,11180,11181,11182,11183,11184,11185,\n11186,11187,11188,11189,11190,11191,11192,11193,11194,11195,11196,11197,\n11198,11199,11200,11201,11202,11203,11204,11205,11206,11207,11208,11209,\n11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,\n11222,11223,11224,11225,11226,11227,11228,11229,11230,11231,11232,11233,\n11234,11235,11236,11237,11238,11239,11240,11241,11242,11243,11244,11245,\n11246,11247,11248,11249,11250,11251,11252,11253,11254,11255,11256,11257,\n11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,\n11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,\n11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,\n11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,\n11306,11307,11308,11309,11310,11311,11264,11265,11266,11267,11268,11269,\n11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,\n11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,\n11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,\n11306,11307,11308,11309,11310,11359,11360,11360,11362,11363,11364,570,574,\n11367,11367,11369,11369,11371,11371,11373,11374,11375,11376,11377,11378,\n11378,11380,11381,11381,11383,11384,11385,11386,11387,11388,11389,11390,\n11391,11392,11392,11394,11394,11396,11396,11398,11398,11400,11400,11402,\n11402,11404,11404,11406,11406,11408,11408,11410,11410,11412,11412,11414,\n11414,11416,11416,11418,11418,11420,11420,11422,11422,11424,11424,11426,\n11426,11428,11428,11430,11430,11432,11432,11434,11434,11436,11436,11438,\n11438,11440,11440,11442,11442,11444,11444,11446,11446,11448,11448,11450,\n11450,11452,11452,11454,11454,11456,11456,11458,11458,11460,11460,11462,\n11462,11464,11464,11466,11466,11468,11468,11470,11470,11472,11472,11474,\n11474,11476,11476,11478,11478,11480,11480,11482,11482,11484,11484,11486,\n11486,11488,11488,11490,11490,11492,11493,11494,11495,11496,11497,11498,\n11499,11499,11501,11501,11503,11504,11505,11506,11506,11508,11509,11510,\n11511,11512,11513,11514,11515,11516,11517,11518,11519,4256,4257,4258,4259,\n4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,\n4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,\n4290,4291,4292,4293,11558,4295,11560,11561,11562,11563,11564,4301,11566,\n11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,\n11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,\n11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,\n11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,\n11615,11616,11617,11618,11619,11620,11621,11622,11623,11624,11625,11626,\n11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638,\n11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,\n11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,\n11663,11664,11665,11666,11667,11668,11669,11670,11671,11672,11673,11674,\n11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685,11686,\n11687,11688,11689,11690,11691,11692,11693,11694,11695,11696,11697,11698,\n11699,11700,11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,\n11711,11712,11713,11714,11715,11716,11717,11718,11719,11720,11721,11722,\n11723,11724,11725,11726,11727,11728,11729,11730,11731,11732,11733,11734,\n11735,11736,11737,11738,11739,11740,11741,11742,11743,11744,11745,11746,\n11747,11748,11749,11750,11751,11752,11753,11754,11755,11756,11757,11758,\n11759,11760,11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,\n11771,11772,11773,11774,11775,11776,11777,11778,11779,11780,11781,11782,\n11783,11784,11785,11786,11787,11788,11789,11790,11791,11792,11793,11794,\n11795,11796,11797,11798,11799,11800,11801,11802,11803,11804,11805,11806,\n11807,11808,11809,11810,11811,11812,11813,11814,11815,11816,11817,11818,\n11819,11820,11821,11822,11823,11824,11825,11826,11827,11828,11829,11830,\n11831,11832,11833,11834,11835,11836,11837,11838,11839,11840,11841,11842,\n11843,11844,11845,11846,11847,11848,11849,11850,11851,11852,11853,11854,\n11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866,\n11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,\n11879,11880,11881,11882,11883,11884,11885,11886,11887,11888,11889,11890,\n11891,11892,11893,11894,11895,11896,11897,11898,11899,11900,11901,11902,\n11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913,11914,\n11915,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,\n11927,11928,11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,\n11939,11940,11941,11942,11943,11944,11945,11946,11947,11948,11949,11950,\n11951,11952,11953,11954,11955,11956,11957,11958,11959,11960,11961,11962,\n11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,\n11975,11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,\n11987,11988,11989,11990,11991,11992,11993,11994,11995,11996,11997,11998,\n11999,12000,12001,12002,12003,12004,12005,12006,12007,12008,12009,12010,\n12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021,12022,\n12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,\n12035,12036,12037,12038,12039,12040,12041,12042,12043,12044,12045,12046,\n12047,12048,12049,12050,12051,12052,12053,12054,12055,12056,12057,12058,\n12059,12060,12061,12062,12063,12064,12065,12066,12067,12068,12069,12070,\n12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,\n12083,12084,12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,\n12095,12096,12097,12098,12099,12100,12101,12102,12103,12104,12105,12106,\n12107,12108,12109,12110,12111,12112,12113,12114,12115,12116,12117,12118,\n12119,12120,12121,12122,12123,12124,12125,12126,12127,12128,12129,12130,\n12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,\n12143,12144,12145,12146,12147,12148,12149,12150,12151,12152,12153,12154,\n12155,12156,12157,12158,12159,12160,12161,12162,12163,12164,12165,12166,\n12167,12168,12169,12170,12171,12172,12173,12174,12175,12176,12177,12178,\n12179,12180,12181,12182,12183,12184,12185,12186,12187,12188,12189,12190,\n12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,\n12203,12204,12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,\n12215,12216,12217,12218,12219,12220,12221,12222,12223,12224,12225,12226,\n12227,12228,12229,12230,12231,12232,12233,12234,12235,12236,12237,12238,\n12239,12240,12241,12242,12243,12244,12245,12246,12247,12248,12249,12250,\n12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,\n12263,12264,12265,12266,12267,12268,12269,12270,12271,12272,12273,12274,\n12275,12276,12277,12278,12279,12280,12281,12282,12283,12284,12285,12286,\n12287,12288,12289,12290,12291,12292,12293,12294,12295,12296,12297,12298,\n12299,12300,12301,12302,12303,12304,12305,12306,12307,12308,12309,12310,\n12311,12312,12313,12314,12315,12316,12317,12318,12319,12320,12321,12322,\n12323,12324,12325,12326,12327,12328,12329,12330,12331,12332,12333,12334,\n12335,12336,12337,12338,12339,12340,12341,12342,12343,12344,12345,12346,\n12347,12348,12349,12350,12351,12352,12353,12354,12355,12356,12357,12358,\n12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,\n12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,\n12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,\n12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,\n12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,\n12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,\n12431,12432,12433,12434,12435,12436,12437,12438,12439,12440,12441,12442,\n12443,12444,12445,12446,12447,12448,12449,12450,12451,12452,12453,12454,\n12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,\n12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,\n12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,\n12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,\n12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,\n12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,\n12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,\n12539,12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,\n12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,\n12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,\n12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,\n12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,\n12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,\n12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,\n12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,\n12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,\n12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,\n12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,\n12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,\n12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,\n12695,12696,12697,12698,12699,12700,12701,12702,12703,12704,12705,12706,\n12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,\n12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,\n12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742,\n12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,\n12755,12756,12757,12758,12759,12760,12761,12762,12763,12764,12765,12766,\n12767,12768,12769,12770,12771,12772,12773,12774,12775,12776,12777,12778,\n12779,12780,12781,12782,12783,12784,12785,12786,12787,12788,12789,12790,\n12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,\n12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,\n12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,\n12827,12828,12829,12830,12831,12832,12833,12834,12835,12836,12837,12838,\n12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849,12850,\n12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,12862,\n12863,12864,12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,\n12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12885,12886,\n12887,12888,12889,12890,12891,12892,12893,12894,12895,12896,12897,12898,\n12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,\n12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,\n12923,12924,12925,12926,12927,12928,12929,12930,12931,12932,12933,12934,\n12935,12936,12937,12938,12939,12940,12941,12942,12943,12944,12945,12946,\n12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,12957,12958,\n12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,\n12971,12972,12973,12974,12975,12976,12977,12978,12979,12980,12981,12982,\n12983,12984,12985,12986,12987,12988,12989,12990,12991,12992,12993,12994,\n12995,12996,12997,12998,12999,13000,13001,13002,13003,13004,13005,13006,\n13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018,\n13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,13030,\n13031,13032,13033,13034,13035,13036,13037,13038,13039,13040,13041,13042,\n13043,13044,13045,13046,13047,13048,13049,13050,13051,13052,13053,13054,\n13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065,13066,\n13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,\n13079,13080,13081,13082,13083,13084,13085,13086,13087,13088,13089,13090,\n13091,13092,13093,13094,13095,13096,13097,13098,13099,13100,13101,13102,\n13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113,13114,\n13115,13116,13117,13118,13119,13120,13121,13122,13123,13124,13125,13126,\n13127,13128,13129,13130,13131,13132,13133,13134,13135,13136,13137,13138,\n13139,13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,\n13151,13152,13153,13154,13155,13156,13157,13158,13159,13160,13161,13162,\n13163,13164,13165,13166,13167,13168,13169,13170,13171,13172,13173,13174,\n13175,13176,13177,13178,13179,13180,13181,13182,13183,13184,13185,13186,\n13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,\n13199,13200,13201,13202,13203,13204,13205,13206,13207,13208,13209,13210,\n13211,13212,13213,13214,13215,13216,13217,13218,13219,13220,13221,13222,\n13223,13224,13225,13226,13227,13228,13229,13230,13231,13232,13233,13234,\n13235,13236,13237,13238,13239,13240,13241,13242,13243,13244,13245,13246,\n13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,\n13259,13260,13261,13262,13263,13264,13265,13266,13267,13268,13269,13270,\n13271,13272,13273,13274,13275,13276,13277,13278,13279,13280,13281,13282,\n13283,13284,13285,13286,13287,13288,13289,13290,13291,13292,13293,13294,\n13295,13296,13297,13298,13299,13300,13301,13302,13303,13304,13305,13306,\n13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,\n13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,\n13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,\n13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,\n13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,\n13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,\n13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,\n13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,\n13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,\n13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,\n13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,\n13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,\n13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,\n13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,\n13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,\n13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,\n13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,\n13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,\n13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,\n13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,\n13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,\n13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,\n13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,\n13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,\n13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,\n13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,\n13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,\n13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,\n13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,\n13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,\n13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,\n13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,\n13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,\n13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,\n13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,\n13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,\n13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,\n13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,\n13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,\n13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,\n13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,\n13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,\n13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,\n13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,\n13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,\n13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,\n13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,\n13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,\n13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,\n13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,\n13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,\n13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,\n13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,\n13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,\n13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,\n13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,\n13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,\n13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,\n14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,\n14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,\n14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,\n14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,\n14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,\n14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,\n14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,\n14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,\n14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,\n14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,\n14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,\n14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,\n14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,\n14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,\n14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,\n14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,\n14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,\n14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,\n14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,\n14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,\n14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,\n14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,\n14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,\n14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,\n14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,\n14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,\n14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,\n14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,\n14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,\n14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,\n14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,\n14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,\n14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,\n14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,\n14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,\n14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,\n14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,\n14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,\n14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,\n14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,\n14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,\n14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,\n14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,\n14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,\n14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,\n14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,\n14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,\n14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,\n14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,\n14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,\n14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,\n14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,\n14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,\n14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,\n14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,\n14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,\n14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,\n14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,\n14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,\n14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,\n14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,\n14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,\n14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,\n14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,\n14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,\n14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,\n14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,\n14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,\n14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,\n14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,\n14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,\n14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,\n14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,\n14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,\n14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,\n14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,\n14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,\n14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,\n14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,\n14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,\n14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,\n14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,\n14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,\n14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,\n15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,\n15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,\n15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,\n15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,\n15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,\n15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,\n15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,\n15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,\n15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,\n15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,\n15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,\n15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,\n15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,\n15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,\n15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,\n15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,\n15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,\n15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,\n15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,\n15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,\n15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,\n15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,\n15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,\n15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,\n15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,\n15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,\n15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,\n15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,\n15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,\n15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,\n15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,\n15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,\n15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,\n15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,\n15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,\n15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,\n15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,\n15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,\n15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,\n15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,\n15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,\n15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,\n15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,\n15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,\n15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,\n15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,\n15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,\n15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,\n15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,\n15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,\n15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,\n15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,\n15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,\n15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,\n15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,\n15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,\n15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,\n15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,\n15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,\n15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,\n15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,\n15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,\n15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,\n15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,\n15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,\n15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,\n15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,\n15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,\n15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,\n15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,\n15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,\n15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,\n15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,\n15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,\n15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,\n15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,\n15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,\n15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,\n15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,\n15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,\n15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,\n15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,\n15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,\n16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,\n16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,\n16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,\n16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,\n16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,\n16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,\n16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,\n16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,\n16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,\n16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,\n16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,\n16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,\n16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,\n16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,\n16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,\n16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,\n16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,\n16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,\n16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,\n16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,\n16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,\n16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,\n16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,\n16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,\n16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,\n16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,\n16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,\n16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,\n16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,\n16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,\n16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,\n16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,\n16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,\n16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,\n16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,\n16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,\n16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,\n16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,\n16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,\n16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,\n16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,\n16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,\n16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,\n16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,\n16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,\n16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,\n16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,\n16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,\n16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,\n16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,\n16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,\n16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,\n16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,\n16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,\n16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,\n16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,\n16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,\n16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,\n16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,\n16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,\n16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,\n16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,\n16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,\n16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,\n16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,\n16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,\n16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,\n16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,\n16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,\n16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,\n16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,\n16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,\n16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,\n16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,\n16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,\n16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,\n16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,\n16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,\n16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,\n16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,\n16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,\n16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,\n16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,\n17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,\n17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,\n17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,\n17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,\n17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,\n17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,\n17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,\n17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,\n17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,\n17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,\n17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,\n17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,\n17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,\n17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,\n17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,\n17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,\n17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,\n17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,\n17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,\n17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,\n17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,\n17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,\n17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,\n17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,\n17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,\n17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,\n17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,\n17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,\n17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,\n17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,\n17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,\n17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,\n17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,\n17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,\n17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,\n17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,\n17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,\n17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,\n17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,\n17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,\n17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,\n17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,\n17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,\n17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,\n17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,\n17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,\n17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,\n17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,\n17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,\n17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,\n17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,\n17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,\n17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,\n17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,\n17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,\n17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,\n17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,\n17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,\n17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,\n17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,\n17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,\n17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,\n17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,\n17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,\n17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,\n17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,\n17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,\n17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,\n17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,\n17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,\n17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,\n17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,\n17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,\n17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,\n17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,\n17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,\n17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,\n17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,\n17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,\n17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,\n17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,\n17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,\n17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,\n17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,\n18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,\n18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,\n18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,\n18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,\n18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,\n18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,\n18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,\n18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,\n18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,\n18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,\n18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,\n18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,\n18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,\n18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,\n18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,\n18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,\n18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,\n18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,\n18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,\n18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,\n18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,\n18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,\n18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,\n18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,\n18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,\n18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,\n18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,\n18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,\n18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,\n18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,\n18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,\n18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,\n18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,\n18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,\n18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,\n18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,\n18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,\n18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,\n18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,\n18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,\n18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,\n18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,\n18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,\n18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,\n18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,\n18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,\n18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,\n18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,\n18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,\n18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,\n18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,\n18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,\n18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,\n18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,\n18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,\n18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,\n18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,\n18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,\n18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,\n18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,\n18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,\n18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,\n18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,\n18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,\n18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,\n18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,\n18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,\n18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,\n18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,\n18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,\n18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,\n18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,\n18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,\n18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,\n18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,\n18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,\n18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,\n18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,\n18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,\n18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,\n18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,\n18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,\n18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,\n19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,\n19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,\n19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,\n19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,\n19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,\n19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,\n19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,\n19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,\n19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,\n19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,\n19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,\n19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,\n19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,\n19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,\n19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,\n19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,\n19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,\n19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,\n19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,\n19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,\n19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,\n19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,\n19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,\n19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,\n19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,\n19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,\n19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,\n19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,\n19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,\n19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,\n19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,\n19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,\n19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,\n19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,\n19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,\n19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,\n19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,\n19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,\n19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,\n19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,\n19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,\n19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,\n19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,\n19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,\n19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,\n19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,\n19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,\n19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,\n19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,\n19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,\n19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,\n19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,\n19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,\n19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,\n19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,\n19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,\n19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,\n19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,\n19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,\n19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,\n19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,\n19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,\n19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,\n19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,\n19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,\n19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,\n19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,\n19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,\n19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,\n19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,\n19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,\n19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,\n19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,\n19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19894,\n19895,19896,19897,19898,19899,19900,19901,19902,19903,19904,19905,19906,\n19907,19908,19909,19910,19911,19912,19913,19914,19915,19916,19917,19918,\n19919,19920,19921,19922,19923,19924,19925,19926,19927,19928,19929,19930,\n19931,19932,19933,19934,19935,19936,19937,19938,19939,19940,19941,19942,\n19943,19944,19945,19946,19947,19948,19949,19950,19951,19952,19953,19954,\n19955,19956,19957,19958,19959,19960,19961,19962,19963,19964,19965,19966,\n19967,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,\n19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,\n19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,\n20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,\n20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,\n20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,\n20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,\n20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,\n20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,\n20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,\n20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,\n20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,\n20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,\n20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,\n20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,\n20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,\n20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,\n20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,\n20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,\n20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,\n20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,\n20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,\n20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,\n20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,\n20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,\n20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,\n20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,\n20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,\n20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,\n20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,\n20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,\n20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,\n20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,\n20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,\n20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,\n20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,\n20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,\n20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,\n20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,\n20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,\n20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,\n20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,\n20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,\n20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,\n20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,\n20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,\n20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,\n20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,\n20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,\n20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,\n20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,\n20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,\n20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,\n20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,\n20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,\n20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,\n20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,\n20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,\n20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,\n20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,\n20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,\n20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,\n20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,\n20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,\n20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,\n20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,\n20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,\n20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,\n20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,\n20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,\n20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,\n20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,\n20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,\n20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,\n20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,\n20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,\n20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,\n20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,\n20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,\n20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,\n20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,\n20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,\n20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,\n20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,\n20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,\n20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,\n20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,\n21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,\n21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,\n21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,\n21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,\n21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,\n21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,\n21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,\n21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,\n21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,\n21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,\n21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,\n21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,\n21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,\n21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,\n21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,\n21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,\n21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,\n21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,\n21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,\n21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,\n21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,\n21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,\n21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,\n21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,\n21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,\n21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,\n21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,\n21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,\n21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,\n21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,\n21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,\n21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,\n21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,\n21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,\n21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,\n21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,\n21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,\n21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,\n21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,\n21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,\n21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,\n21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,\n21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,\n21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,\n21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,\n21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,\n21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,\n21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,\n21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,\n21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,\n21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,\n21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,\n21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,\n21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,\n21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,\n21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,\n21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,\n21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,\n21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,\n21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,\n21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,\n21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,\n21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,\n21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,\n21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,\n21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,\n21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,\n21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,\n21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,\n21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,\n21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,\n21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,\n21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,\n21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,\n21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,\n21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,\n21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,\n21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,\n21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,\n21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,\n21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,\n21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,\n21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,\n22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,\n22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,\n22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,\n22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,\n22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,\n22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,\n22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,\n22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,\n22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,\n22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,\n22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,\n22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,\n22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,\n22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,\n22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,\n22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,\n22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,\n22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,\n22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,\n22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,\n22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,\n22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,\n22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,\n22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,\n22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,\n22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,\n22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,\n22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,\n22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,\n22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,\n22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,\n22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,\n22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,\n22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,\n22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,\n22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,\n22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,\n22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,\n22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,\n22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,\n22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,\n22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,\n22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,\n22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,\n22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,\n22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,\n22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,\n22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,\n22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,\n22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,\n22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,\n22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,\n22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,\n22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,\n22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,\n22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,\n22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,\n22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,\n22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,\n22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,\n22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,\n22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,\n22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,\n22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,\n22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,\n22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,\n22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,\n22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,\n22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,\n22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,\n22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,\n22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,\n22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,\n22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,\n22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,\n22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,\n22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,\n22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,\n22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,\n22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,\n22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,\n22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,\n22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,\n23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,\n23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,\n23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,\n23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,\n23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,\n23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,\n23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,\n23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,\n23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,\n23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,\n23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,\n23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,\n23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,\n23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,\n23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,\n23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,\n23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,\n23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,\n23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,\n23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,\n23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,\n23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,\n23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,\n23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,\n23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,\n23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,\n23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,\n23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,\n23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,\n23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,\n23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,\n23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,\n23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,\n23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,\n23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,\n23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,\n23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,\n23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,\n23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,\n23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,\n23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,\n23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,\n23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,\n23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,\n23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,\n23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,\n23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,\n23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,\n23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,\n23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,\n23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,\n23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,\n23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,\n23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,\n23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,\n23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,\n23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,\n23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,\n23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,\n23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,\n23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,\n23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,\n23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,\n23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,\n23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,\n23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,\n23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,\n23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,\n23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,\n23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,\n23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,\n23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,\n23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,\n23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,\n23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,\n23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,\n23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,\n23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,\n23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,\n23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,\n23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,\n23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,\n23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,\n23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,\n24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,\n24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,\n24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,\n24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,\n24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,\n24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,\n24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,\n24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,\n24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,\n24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,\n24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,\n24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,\n24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,\n24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,\n24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,\n24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,\n24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,\n24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,\n24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,\n24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,\n24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,\n24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,\n24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,\n24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,\n24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,\n24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,\n24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,\n24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,\n24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,\n24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,\n24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,\n24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,\n24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,\n24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,\n24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,\n24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,\n24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,\n24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,\n24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,\n24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,\n24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,\n24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,\n24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,\n24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,\n24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,\n24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,\n24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,\n24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,\n24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,\n24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,\n24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,\n24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,\n24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,\n24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,\n24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,\n24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,\n24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,\n24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,\n24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,\n24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,\n24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,\n24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,\n24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,\n24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,\n24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,\n24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,\n24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,\n24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,\n24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,\n24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,\n24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,\n24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,\n24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,\n24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,\n24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,\n24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,\n24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,\n24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,\n24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,\n24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,\n24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,\n24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,\n24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,\n25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,\n25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,\n25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,\n25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,\n25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,\n25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,\n25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,\n25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,\n25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,\n25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,\n25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,\n25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,\n25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,\n25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,\n25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,\n25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,\n25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,\n25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,\n25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,\n25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,\n25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,\n25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,\n25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,\n25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,\n25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,\n25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,\n25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,\n25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,\n25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,\n25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,\n25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,\n25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,\n25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,\n25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,\n25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,\n25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,\n25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,\n25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,\n25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,\n25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,\n25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,\n25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,\n25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,\n25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,\n25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,\n25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,\n25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,\n25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,\n25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,\n25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,\n25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,\n25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,\n25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,\n25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,\n25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,\n25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,\n25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,\n25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,\n25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,\n25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,\n25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,\n25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,\n25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,\n25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,\n25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,\n25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,\n25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,\n25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,\n25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,\n25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,\n25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,\n25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,\n25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,\n25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,\n25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,\n25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,\n25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,\n25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,\n25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,\n25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,\n25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,\n25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,\n25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,\n26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,\n26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,\n26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,\n26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,\n26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,\n26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,\n26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,\n26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,\n26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,\n26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,\n26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,\n26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,\n26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,\n26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,\n26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,\n26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,\n26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,\n26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,\n26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,\n26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,\n26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,\n26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,\n26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,\n26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,\n26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,\n26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,\n26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,\n26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,\n26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,\n26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,\n26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,\n26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,\n26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,\n26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,\n26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,\n26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,\n26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,\n26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,\n26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,\n26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,\n26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,\n26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,\n26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,\n26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,\n26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,\n26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,\n26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,\n26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,\n26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,\n26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,\n26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,\n26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,\n26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,\n26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,\n26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,\n26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,\n26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,\n26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,\n26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,\n26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,\n26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,\n26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,\n26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,\n26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,\n26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,\n26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,\n26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,\n26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,\n26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,\n26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,\n26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,\n26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,\n26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,\n26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,\n26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,\n26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,\n26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,\n26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,\n26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,\n26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,\n26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,\n26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,\n26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,\n26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,\n27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,\n27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,\n27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,\n27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,\n27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,\n27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,\n27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,\n27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,\n27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,\n27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,\n27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,\n27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,\n27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,\n27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,\n27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,\n27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,\n27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,\n27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,\n27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,\n27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,\n27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,\n27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,\n27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,\n27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,\n27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,\n27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,\n27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,\n27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,\n27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,\n27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,\n27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,\n27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,\n27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,\n27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,\n27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,\n27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,\n27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,\n27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,\n27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,\n27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,\n27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,\n27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,\n27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,\n27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,\n27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,\n27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,\n27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,\n27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,\n27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,\n27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,\n27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,\n27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,\n27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,\n27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,\n27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,\n27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,\n27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,\n27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,\n27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,\n27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,\n27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,\n27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,\n27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,\n27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,\n27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,\n27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,\n27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,\n27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,\n27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,\n27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,\n27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,\n27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,\n27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,\n27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,\n27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,\n27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,\n27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,\n27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,\n27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,\n27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,\n27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,\n27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,\n27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,\n28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,\n28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,\n28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,\n28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,\n28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,\n28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,\n28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,\n28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,\n28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,\n28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,\n28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,\n28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,\n28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,\n28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,\n28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,\n28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,\n28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,\n28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,\n28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,\n28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,\n28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,\n28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,\n28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,\n28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,\n28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,\n28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,\n28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,\n28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,\n28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,\n28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,\n28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,\n28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,\n28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,\n28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,\n28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,\n28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,\n28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,\n28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,\n28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,\n28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,\n28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,\n28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,\n28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,\n28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,\n28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,\n28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,\n28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,\n28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,\n28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,\n28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,\n28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,\n28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,\n28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,\n28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,\n28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,\n28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,\n28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,\n28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,\n28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,\n28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,\n28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,\n28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,\n28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,\n28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,\n28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,\n28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,\n28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,\n28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,\n28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,\n28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,\n28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,\n28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,\n28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,\n28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,\n28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,\n28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,\n28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,\n28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,\n28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,\n28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,\n28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,\n28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,\n28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,\n29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,\n29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,\n29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,\n29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,\n29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,\n29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,\n29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,\n29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,\n29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,\n29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,\n29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,\n29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,\n29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,\n29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,\n29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,\n29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,\n29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,\n29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,\n29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,\n29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,\n29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,\n29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,\n29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,\n29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,\n29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,\n29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,\n29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,\n29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,\n29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,\n29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,\n29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,\n29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,\n29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,\n29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,\n29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,\n29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,\n29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,\n29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,\n29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,\n29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,\n29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,\n29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,\n29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,\n29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,\n29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,\n29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,\n29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,\n29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,\n29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,\n29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,\n29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,\n29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,\n29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,\n29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,\n29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,\n29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,\n29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,\n29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,\n29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,\n29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,\n29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,\n29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,\n29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,\n29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,\n29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,\n29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,\n29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,\n29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,\n29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,\n29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,\n29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,\n29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,\n29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,\n29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,\n29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,\n29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,\n29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,\n29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,\n29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,\n29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,\n29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,\n29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,\n29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,\n29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,\n30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,\n30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,\n30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,\n30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,\n30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,\n30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,\n30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,\n30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,\n30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,\n30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,\n30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,\n30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,\n30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,\n30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,\n30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,\n30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,\n30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,\n30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,\n30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,\n30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,\n30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,\n30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,\n30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,\n30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,\n30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,\n30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,\n30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,\n30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,\n30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,\n30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,\n30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,\n30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,\n30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,\n30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,\n30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,\n30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,\n30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,\n30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,\n30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,\n30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,\n30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,\n30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,\n30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,\n30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,\n30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,\n30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,\n30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,\n30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,\n30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,\n30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,\n30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,\n30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,\n30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,\n30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,\n30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,\n30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,\n30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,\n30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,\n30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,\n30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,\n30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,\n30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,\n30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,\n30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,\n30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,\n30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,\n30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,\n30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,\n30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,\n30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,\n30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,\n30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,\n30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,\n30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,\n30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,\n30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,\n30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,\n30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,\n30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,\n30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,\n30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,\n30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,\n30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,\n31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,\n31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,\n31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,\n31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,\n31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,\n31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,\n31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,\n31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,\n31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,\n31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,\n31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,\n31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,\n31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,\n31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,\n31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,\n31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,\n31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,\n31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,\n31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,\n31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,\n31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,\n31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,\n31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,\n31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,\n31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,\n31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,\n31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,\n31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,\n31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,\n31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,\n31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,\n31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,\n31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,\n31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,\n31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,\n31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,\n31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,\n31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,\n31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,\n31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,\n31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,\n31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,\n31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,\n31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,\n31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,\n31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,\n31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,\n31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,\n31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,\n31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,\n31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,\n31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,\n31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,\n31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,\n31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,\n31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,\n31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,\n31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,\n31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,\n31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,\n31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,\n31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,\n31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,\n31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,\n31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,\n31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,\n31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,\n31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,\n31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,\n31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,\n31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,\n31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,\n31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,\n31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,\n31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,\n31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,\n31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,\n31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,\n31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,\n31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,\n31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,\n31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,\n31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,\n32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,\n32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,\n32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,\n32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,\n32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,\n32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,\n32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,\n32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,\n32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,\n32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,\n32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,\n32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,\n32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,\n32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,\n32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,\n32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,\n32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,\n32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,\n32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,\n32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,\n32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,\n32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,\n32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,\n32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,\n32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,\n32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,\n32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,\n32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,\n32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,\n32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,\n32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,\n32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,\n32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,\n32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,\n32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,\n32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,\n32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,\n32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,\n32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,\n32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,\n32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,\n32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,\n32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,\n32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,\n32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,\n32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,\n32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,\n32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,\n32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,\n32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,\n32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,\n32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,\n32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,\n32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,\n32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,\n32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,\n32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,\n32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,\n32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,\n32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,\n32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,\n32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,\n32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,\n32759,32760,32761,32762,32763,32764,32765,32766,32767,32768L,32769L,32770L,\n32771L,32772L,32773L,32774L,32775L,32776L,32777L,32778L,32779L,32780L,\n32781L,32782L,32783L,32784L,32785L,32786L,32787L,32788L,32789L,32790L,\n32791L,32792L,32793L,32794L,32795L,32796L,32797L,32798L,32799L,32800L,\n32801L,32802L,32803L,32804L,32805L,32806L,32807L,32808L,32809L,32810L,\n32811L,32812L,32813L,32814L,32815L,32816L,32817L,32818L,32819L,32820L,\n32821L,32822L,32823L,32824L,32825L,32826L,32827L,32828L,32829L,32830L,\n32831L,32832L,32833L,32834L,32835L,32836L,32837L,32838L,32839L,32840L,\n32841L,32842L,32843L,32844L,32845L,32846L,32847L,32848L,32849L,32850L,\n32851L,32852L,32853L,32854L,32855L,32856L,32857L,32858L,32859L,32860L,\n32861L,32862L,32863L,32864L,32865L,32866L,32867L,32868L,32869L,32870L,\n32871L,32872L,32873L,32874L,32875L,32876L,32877L,32878L,32879L,32880L,\n32881L,32882L,32883L,32884L,32885L,32886L,32887L,32888L,32889L,32890L,\n32891L,32892L,32893L,32894L,32895L,32896L,32897L,32898L,32899L,32900L,\n32901L,32902L,32903L,32904L,32905L,32906L,32907L,32908L,32909L,32910L,\n32911L,32912L,32913L,32914L,32915L,32916L,32917L,32918L,32919L,32920L,\n32921L,32922L,32923L,32924L,32925L,32926L,32927L,32928L,32929L,32930L,\n32931L,32932L,32933L,32934L,32935L,32936L,32937L,32938L,32939L,32940L,\n32941L,32942L,32943L,32944L,32945L,32946L,32947L,32948L,32949L,32950L,\n32951L,32952L,32953L,32954L,32955L,32956L,32957L,32958L,32959L,32960L,\n32961L,32962L,32963L,32964L,32965L,32966L,32967L,32968L,32969L,32970L,\n32971L,32972L,32973L,32974L,32975L,32976L,32977L,32978L,32979L,32980L,\n32981L,32982L,32983L,32984L,32985L,32986L,32987L,32988L,32989L,32990L,\n32991L,32992L,32993L,32994L,32995L,32996L,32997L,32998L,32999L,33000L,\n33001L,33002L,33003L,33004L,33005L,33006L,33007L,33008L,33009L,33010L,\n33011L,33012L,33013L,33014L,33015L,33016L,33017L,33018L,33019L,33020L,\n33021L,33022L,33023L,33024L,33025L,33026L,33027L,33028L,33029L,33030L,\n33031L,33032L,33033L,33034L,33035L,33036L,33037L,33038L,33039L,33040L,\n33041L,33042L,33043L,33044L,33045L,33046L,33047L,33048L,33049L,33050L,\n33051L,33052L,33053L,33054L,33055L,33056L,33057L,33058L,33059L,33060L,\n33061L,33062L,33063L,33064L,33065L,33066L,33067L,33068L,33069L,33070L,\n33071L,33072L,33073L,33074L,33075L,33076L,33077L,33078L,33079L,33080L,\n33081L,33082L,33083L,33084L,33085L,33086L,33087L,33088L,33089L,33090L,\n33091L,33092L,33093L,33094L,33095L,33096L,33097L,33098L,33099L,33100L,\n33101L,33102L,33103L,33104L,33105L,33106L,33107L,33108L,33109L,33110L,\n33111L,33112L,33113L,33114L,33115L,33116L,33117L,33118L,33119L,33120L,\n33121L,33122L,33123L,33124L,33125L,33126L,33127L,33128L,33129L,33130L,\n33131L,33132L,33133L,33134L,33135L,33136L,33137L,33138L,33139L,33140L,\n33141L,33142L,33143L,33144L,33145L,33146L,33147L,33148L,33149L,33150L,\n33151L,33152L,33153L,33154L,33155L,33156L,33157L,33158L,33159L,33160L,\n33161L,33162L,33163L,33164L,33165L,33166L,33167L,33168L,33169L,33170L,\n33171L,33172L,33173L,33174L,33175L,33176L,33177L,33178L,33179L,33180L,\n33181L,33182L,33183L,33184L,33185L,33186L,33187L,33188L,33189L,33190L,\n33191L,33192L,33193L,33194L,33195L,33196L,33197L,33198L,33199L,33200L,\n33201L,33202L,33203L,33204L,33205L,33206L,33207L,33208L,33209L,33210L,\n33211L,33212L,33213L,33214L,33215L,33216L,33217L,33218L,33219L,33220L,\n33221L,33222L,33223L,33224L,33225L,33226L,33227L,33228L,33229L,33230L,\n33231L,33232L,33233L,33234L,33235L,33236L,33237L,33238L,33239L,33240L,\n33241L,33242L,33243L,33244L,33245L,33246L,33247L,33248L,33249L,33250L,\n33251L,33252L,33253L,33254L,33255L,33256L,33257L,33258L,33259L,33260L,\n33261L,33262L,33263L,33264L,33265L,33266L,33267L,33268L,33269L,33270L,\n33271L,33272L,33273L,33274L,33275L,33276L,33277L,33278L,33279L,33280L,\n33281L,33282L,33283L,33284L,33285L,33286L,33287L,33288L,33289L,33290L,\n33291L,33292L,33293L,33294L,33295L,33296L,33297L,33298L,33299L,33300L,\n33301L,33302L,33303L,33304L,33305L,33306L,33307L,33308L,33309L,33310L,\n33311L,33312L,33313L,33314L,33315L,33316L,33317L,33318L,33319L,33320L,\n33321L,33322L,33323L,33324L,33325L,33326L,33327L,33328L,33329L,33330L,\n33331L,33332L,33333L,33334L,33335L,33336L,33337L,33338L,33339L,33340L,\n33341L,33342L,33343L,33344L,33345L,33346L,33347L,33348L,33349L,33350L,\n33351L,33352L,33353L,33354L,33355L,33356L,33357L,33358L,33359L,33360L,\n33361L,33362L,33363L,33364L,33365L,33366L,33367L,33368L,33369L,33370L,\n33371L,33372L,33373L,33374L,33375L,33376L,33377L,33378L,33379L,33380L,\n33381L,33382L,33383L,33384L,33385L,33386L,33387L,33388L,33389L,33390L,\n33391L,33392L,33393L,33394L,33395L,33396L,33397L,33398L,33399L,33400L,\n33401L,33402L,33403L,33404L,33405L,33406L,33407L,33408L,33409L,33410L,\n33411L,33412L,33413L,33414L,33415L,33416L,33417L,33418L,33419L,33420L,\n33421L,33422L,33423L,33424L,33425L,33426L,33427L,33428L,33429L,33430L,\n33431L,33432L,33433L,33434L,33435L,33436L,33437L,33438L,33439L,33440L,\n33441L,33442L,33443L,33444L,33445L,33446L,33447L,33448L,33449L,33450L,\n33451L,33452L,33453L,33454L,33455L,33456L,33457L,33458L,33459L,33460L,\n33461L,33462L,33463L,33464L,33465L,33466L,33467L,33468L,33469L,33470L,\n33471L,33472L,33473L,33474L,33475L,33476L,33477L,33478L,33479L,33480L,\n33481L,33482L,33483L,33484L,33485L,33486L,33487L,33488L,33489L,33490L,\n33491L,33492L,33493L,33494L,33495L,33496L,33497L,33498L,33499L,33500L,\n33501L,33502L,33503L,33504L,33505L,33506L,33507L,33508L,33509L,33510L,\n33511L,33512L,33513L,33514L,33515L,33516L,33517L,33518L,33519L,33520L,\n33521L,33522L,33523L,33524L,33525L,33526L,33527L,33528L,33529L,33530L,\n33531L,33532L,33533L,33534L,33535L,33536L,33537L,33538L,33539L,33540L,\n33541L,33542L,33543L,33544L,33545L,33546L,33547L,33548L,33549L,33550L,\n33551L,33552L,33553L,33554L,33555L,33556L,33557L,33558L,33559L,33560L,\n33561L,33562L,33563L,33564L,33565L,33566L,33567L,33568L,33569L,33570L,\n33571L,33572L,33573L,33574L,33575L,33576L,33577L,33578L,33579L,33580L,\n33581L,33582L,33583L,33584L,33585L,33586L,33587L,33588L,33589L,33590L,\n33591L,33592L,33593L,33594L,33595L,33596L,33597L,33598L,33599L,33600L,\n33601L,33602L,33603L,33604L,33605L,33606L,33607L,33608L,33609L,33610L,\n33611L,33612L,33613L,33614L,33615L,33616L,33617L,33618L,33619L,33620L,\n33621L,33622L,33623L,33624L,33625L,33626L,33627L,33628L,33629L,33630L,\n33631L,33632L,33633L,33634L,33635L,33636L,33637L,33638L,33639L,33640L,\n33641L,33642L,33643L,33644L,33645L,33646L,33647L,33648L,33649L,33650L,\n33651L,33652L,33653L,33654L,33655L,33656L,33657L,33658L,33659L,33660L,\n33661L,33662L,33663L,33664L,33665L,33666L,33667L,33668L,33669L,33670L,\n33671L,33672L,33673L,33674L,33675L,33676L,33677L,33678L,33679L,33680L,\n33681L,33682L,33683L,33684L,33685L,33686L,33687L,33688L,33689L,33690L,\n33691L,33692L,33693L,33694L,33695L,33696L,33697L,33698L,33699L,33700L,\n33701L,33702L,33703L,33704L,33705L,33706L,33707L,33708L,33709L,33710L,\n33711L,33712L,33713L,33714L,33715L,33716L,33717L,33718L,33719L,33720L,\n33721L,33722L,33723L,33724L,33725L,33726L,33727L,33728L,33729L,33730L,\n33731L,33732L,33733L,33734L,33735L,33736L,33737L,33738L,33739L,33740L,\n33741L,33742L,33743L,33744L,33745L,33746L,33747L,33748L,33749L,33750L,\n33751L,33752L,33753L,33754L,33755L,33756L,33757L,33758L,33759L,33760L,\n33761L,33762L,33763L,33764L,33765L,33766L,33767L,33768L,33769L,33770L,\n33771L,33772L,33773L,33774L,33775L,33776L,33777L,33778L,33779L,33780L,\n33781L,33782L,33783L,33784L,33785L,33786L,33787L,33788L,33789L,33790L,\n33791L,33792L,33793L,33794L,33795L,33796L,33797L,33798L,33799L,33800L,\n33801L,33802L,33803L,33804L,33805L,33806L,33807L,33808L,33809L,33810L,\n33811L,33812L,33813L,33814L,33815L,33816L,33817L,33818L,33819L,33820L,\n33821L,33822L,33823L,33824L,33825L,33826L,33827L,33828L,33829L,33830L,\n33831L,33832L,33833L,33834L,33835L,33836L,33837L,33838L,33839L,33840L,\n33841L,33842L,33843L,33844L,33845L,33846L,33847L,33848L,33849L,33850L,\n33851L,33852L,33853L,33854L,33855L,33856L,33857L,33858L,33859L,33860L,\n33861L,33862L,33863L,33864L,33865L,33866L,33867L,33868L,33869L,33870L,\n33871L,33872L,33873L,33874L,33875L,33876L,33877L,33878L,33879L,33880L,\n33881L,33882L,33883L,33884L,33885L,33886L,33887L,33888L,33889L,33890L,\n33891L,33892L,33893L,33894L,33895L,33896L,33897L,33898L,33899L,33900L,\n33901L,33902L,33903L,33904L,33905L,33906L,33907L,33908L,33909L,33910L,\n33911L,33912L,33913L,33914L,33915L,33916L,33917L,33918L,33919L,33920L,\n33921L,33922L,33923L,33924L,33925L,33926L,33927L,33928L,33929L,33930L,\n33931L,33932L,33933L,33934L,33935L,33936L,33937L,33938L,33939L,33940L,\n33941L,33942L,33943L,33944L,33945L,33946L,33947L,33948L,33949L,33950L,\n33951L,33952L,33953L,33954L,33955L,33956L,33957L,33958L,33959L,33960L,\n33961L,33962L,33963L,33964L,33965L,33966L,33967L,33968L,33969L,33970L,\n33971L,33972L,33973L,33974L,33975L,33976L,33977L,33978L,33979L,33980L,\n33981L,33982L,33983L,33984L,33985L,33986L,33987L,33988L,33989L,33990L,\n33991L,33992L,33993L,33994L,33995L,33996L,33997L,33998L,33999L,34000L,\n34001L,34002L,34003L,34004L,34005L,34006L,34007L,34008L,34009L,34010L,\n34011L,34012L,34013L,34014L,34015L,34016L,34017L,34018L,34019L,34020L,\n34021L,34022L,34023L,34024L,34025L,34026L,34027L,34028L,34029L,34030L,\n34031L,34032L,34033L,34034L,34035L,34036L,34037L,34038L,34039L,34040L,\n34041L,34042L,34043L,34044L,34045L,34046L,34047L,34048L,34049L,34050L,\n34051L,34052L,34053L,34054L,34055L,34056L,34057L,34058L,34059L,34060L,\n34061L,34062L,34063L,34064L,34065L,34066L,34067L,34068L,34069L,34070L,\n34071L,34072L,34073L,34074L,34075L,34076L,34077L,34078L,34079L,34080L,\n34081L,34082L,34083L,34084L,34085L,34086L,34087L,34088L,34089L,34090L,\n34091L,34092L,34093L,34094L,34095L,34096L,34097L,34098L,34099L,34100L,\n34101L,34102L,34103L,34104L,34105L,34106L,34107L,34108L,34109L,34110L,\n34111L,34112L,34113L,34114L,34115L,34116L,34117L,34118L,34119L,34120L,\n34121L,34122L,34123L,34124L,34125L,34126L,34127L,34128L,34129L,34130L,\n34131L,34132L,34133L,34134L,34135L,34136L,34137L,34138L,34139L,34140L,\n34141L,34142L,34143L,34144L,34145L,34146L,34147L,34148L,34149L,34150L,\n34151L,34152L,34153L,34154L,34155L,34156L,34157L,34158L,34159L,34160L,\n34161L,34162L,34163L,34164L,34165L,34166L,34167L,34168L,34169L,34170L,\n34171L,34172L,34173L,34174L,34175L,34176L,34177L,34178L,34179L,34180L,\n34181L,34182L,34183L,34184L,34185L,34186L,34187L,34188L,34189L,34190L,\n34191L,34192L,34193L,34194L,34195L,34196L,34197L,34198L,34199L,34200L,\n34201L,34202L,34203L,34204L,34205L,34206L,34207L,34208L,34209L,34210L,\n34211L,34212L,34213L,34214L,34215L,34216L,34217L,34218L,34219L,34220L,\n34221L,34222L,34223L,34224L,34225L,34226L,34227L,34228L,34229L,34230L,\n34231L,34232L,34233L,34234L,34235L,34236L,34237L,34238L,34239L,34240L,\n34241L,34242L,34243L,34244L,34245L,34246L,34247L,34248L,34249L,34250L,\n34251L,34252L,34253L,34254L,34255L,34256L,34257L,34258L,34259L,34260L,\n34261L,34262L,34263L,34264L,34265L,34266L,34267L,34268L,34269L,34270L,\n34271L,34272L,34273L,34274L,34275L,34276L,34277L,34278L,34279L,34280L,\n34281L,34282L,34283L,34284L,34285L,34286L,34287L,34288L,34289L,34290L,\n34291L,34292L,34293L,34294L,34295L,34296L,34297L,34298L,34299L,34300L,\n34301L,34302L,34303L,34304L,34305L,34306L,34307L,34308L,34309L,34310L,\n34311L,34312L,34313L,34314L,34315L,34316L,34317L,34318L,34319L,34320L,\n34321L,34322L,34323L,34324L,34325L,34326L,34327L,34328L,34329L,34330L,\n34331L,34332L,34333L,34334L,34335L,34336L,34337L,34338L,34339L,34340L,\n34341L,34342L,34343L,34344L,34345L,34346L,34347L,34348L,34349L,34350L,\n34351L,34352L,34353L,34354L,34355L,34356L,34357L,34358L,34359L,34360L,\n34361L,34362L,34363L,34364L,34365L,34366L,34367L,34368L,34369L,34370L,\n34371L,34372L,34373L,34374L,34375L,34376L,34377L,34378L,34379L,34380L,\n34381L,34382L,34383L,34384L,34385L,34386L,34387L,34388L,34389L,34390L,\n34391L,34392L,34393L,34394L,34395L,34396L,34397L,34398L,34399L,34400L,\n34401L,34402L,34403L,34404L,34405L,34406L,34407L,34408L,34409L,34410L,\n34411L,34412L,34413L,34414L,34415L,34416L,34417L,34418L,34419L,34420L,\n34421L,34422L,34423L,34424L,34425L,34426L,34427L,34428L,34429L,34430L,\n34431L,34432L,34433L,34434L,34435L,34436L,34437L,34438L,34439L,34440L,\n34441L,34442L,34443L,34444L,34445L,34446L,34447L,34448L,34449L,34450L,\n34451L,34452L,34453L,34454L,34455L,34456L,34457L,34458L,34459L,34460L,\n34461L,34462L,34463L,34464L,34465L,34466L,34467L,34468L,34469L,34470L,\n34471L,34472L,34473L,34474L,34475L,34476L,34477L,34478L,34479L,34480L,\n34481L,34482L,34483L,34484L,34485L,34486L,34487L,34488L,34489L,34490L,\n34491L,34492L,34493L,34494L,34495L,34496L,34497L,34498L,34499L,34500L,\n34501L,34502L,34503L,34504L,34505L,34506L,34507L,34508L,34509L,34510L,\n34511L,34512L,34513L,34514L,34515L,34516L,34517L,34518L,34519L,34520L,\n34521L,34522L,34523L,34524L,34525L,34526L,34527L,34528L,34529L,34530L,\n34531L,34532L,34533L,34534L,34535L,34536L,34537L,34538L,34539L,34540L,\n34541L,34542L,34543L,34544L,34545L,34546L,34547L,34548L,34549L,34550L,\n34551L,34552L,34553L,34554L,34555L,34556L,34557L,34558L,34559L,34560L,\n34561L,34562L,34563L,34564L,34565L,34566L,34567L,34568L,34569L,34570L,\n34571L,34572L,34573L,34574L,34575L,34576L,34577L,34578L,34579L,34580L,\n34581L,34582L,34583L,34584L,34585L,34586L,34587L,34588L,34589L,34590L,\n34591L,34592L,34593L,34594L,34595L,34596L,34597L,34598L,34599L,34600L,\n34601L,34602L,34603L,34604L,34605L,34606L,34607L,34608L,34609L,34610L,\n34611L,34612L,34613L,34614L,34615L,34616L,34617L,34618L,34619L,34620L,\n34621L,34622L,34623L,34624L,34625L,34626L,34627L,34628L,34629L,34630L,\n34631L,34632L,34633L,34634L,34635L,34636L,34637L,34638L,34639L,34640L,\n34641L,34642L,34643L,34644L,34645L,34646L,34647L,34648L,34649L,34650L,\n34651L,34652L,34653L,34654L,34655L,34656L,34657L,34658L,34659L,34660L,\n34661L,34662L,34663L,34664L,34665L,34666L,34667L,34668L,34669L,34670L,\n34671L,34672L,34673L,34674L,34675L,34676L,34677L,34678L,34679L,34680L,\n34681L,34682L,34683L,34684L,34685L,34686L,34687L,34688L,34689L,34690L,\n34691L,34692L,34693L,34694L,34695L,34696L,34697L,34698L,34699L,34700L,\n34701L,34702L,34703L,34704L,34705L,34706L,34707L,34708L,34709L,34710L,\n34711L,34712L,34713L,34714L,34715L,34716L,34717L,34718L,34719L,34720L,\n34721L,34722L,34723L,34724L,34725L,34726L,34727L,34728L,34729L,34730L,\n34731L,34732L,34733L,34734L,34735L,34736L,34737L,34738L,34739L,34740L,\n34741L,34742L,34743L,34744L,34745L,34746L,34747L,34748L,34749L,34750L,\n34751L,34752L,34753L,34754L,34755L,34756L,34757L,34758L,34759L,34760L,\n34761L,34762L,34763L,34764L,34765L,34766L,34767L,34768L,34769L,34770L,\n34771L,34772L,34773L,34774L,34775L,34776L,34777L,34778L,34779L,34780L,\n34781L,34782L,34783L,34784L,34785L,34786L,34787L,34788L,34789L,34790L,\n34791L,34792L,34793L,34794L,34795L,34796L,34797L,34798L,34799L,34800L,\n34801L,34802L,34803L,34804L,34805L,34806L,34807L,34808L,34809L,34810L,\n34811L,34812L,34813L,34814L,34815L,34816L,34817L,34818L,34819L,34820L,\n34821L,34822L,34823L,34824L,34825L,34826L,34827L,34828L,34829L,34830L,\n34831L,34832L,34833L,34834L,34835L,34836L,34837L,34838L,34839L,34840L,\n34841L,34842L,34843L,34844L,34845L,34846L,34847L,34848L,34849L,34850L,\n34851L,34852L,34853L,34854L,34855L,34856L,34857L,34858L,34859L,34860L,\n34861L,34862L,34863L,34864L,34865L,34866L,34867L,34868L,34869L,34870L,\n34871L,34872L,34873L,34874L,34875L,34876L,34877L,34878L,34879L,34880L,\n34881L,34882L,34883L,34884L,34885L,34886L,34887L,34888L,34889L,34890L,\n34891L,34892L,34893L,34894L,34895L,34896L,34897L,34898L,34899L,34900L,\n34901L,34902L,34903L,34904L,34905L,34906L,34907L,34908L,34909L,34910L,\n34911L,34912L,34913L,34914L,34915L,34916L,34917L,34918L,34919L,34920L,\n34921L,34922L,34923L,34924L,34925L,34926L,34927L,34928L,34929L,34930L,\n34931L,34932L,34933L,34934L,34935L,34936L,34937L,34938L,34939L,34940L,\n34941L,34942L,34943L,34944L,34945L,34946L,34947L,34948L,34949L,34950L,\n34951L,34952L,34953L,34954L,34955L,34956L,34957L,34958L,34959L,34960L,\n34961L,34962L,34963L,34964L,34965L,34966L,34967L,34968L,34969L,34970L,\n34971L,34972L,34973L,34974L,34975L,34976L,34977L,34978L,34979L,34980L,\n34981L,34982L,34983L,34984L,34985L,34986L,34987L,34988L,34989L,34990L,\n34991L,34992L,34993L,34994L,34995L,34996L,34997L,34998L,34999L,35000L,\n35001L,35002L,35003L,35004L,35005L,35006L,35007L,35008L,35009L,35010L,\n35011L,35012L,35013L,35014L,35015L,35016L,35017L,35018L,35019L,35020L,\n35021L,35022L,35023L,35024L,35025L,35026L,35027L,35028L,35029L,35030L,\n35031L,35032L,35033L,35034L,35035L,35036L,35037L,35038L,35039L,35040L,\n35041L,35042L,35043L,35044L,35045L,35046L,35047L,35048L,35049L,35050L,\n35051L,35052L,35053L,35054L,35055L,35056L,35057L,35058L,35059L,35060L,\n35061L,35062L,35063L,35064L,35065L,35066L,35067L,35068L,35069L,35070L,\n35071L,35072L,35073L,35074L,35075L,35076L,35077L,35078L,35079L,35080L,\n35081L,35082L,35083L,35084L,35085L,35086L,35087L,35088L,35089L,35090L,\n35091L,35092L,35093L,35094L,35095L,35096L,35097L,35098L,35099L,35100L,\n35101L,35102L,35103L,35104L,35105L,35106L,35107L,35108L,35109L,35110L,\n35111L,35112L,35113L,35114L,35115L,35116L,35117L,35118L,35119L,35120L,\n35121L,35122L,35123L,35124L,35125L,35126L,35127L,35128L,35129L,35130L,\n35131L,35132L,35133L,35134L,35135L,35136L,35137L,35138L,35139L,35140L,\n35141L,35142L,35143L,35144L,35145L,35146L,35147L,35148L,35149L,35150L,\n35151L,35152L,35153L,35154L,35155L,35156L,35157L,35158L,35159L,35160L,\n35161L,35162L,35163L,35164L,35165L,35166L,35167L,35168L,35169L,35170L,\n35171L,35172L,35173L,35174L,35175L,35176L,35177L,35178L,35179L,35180L,\n35181L,35182L,35183L,35184L,35185L,35186L,35187L,35188L,35189L,35190L,\n35191L,35192L,35193L,35194L,35195L,35196L,35197L,35198L,35199L,35200L,\n35201L,35202L,35203L,35204L,35205L,35206L,35207L,35208L,35209L,35210L,\n35211L,35212L,35213L,35214L,35215L,35216L,35217L,35218L,35219L,35220L,\n35221L,35222L,35223L,35224L,35225L,35226L,35227L,35228L,35229L,35230L,\n35231L,35232L,35233L,35234L,35235L,35236L,35237L,35238L,35239L,35240L,\n35241L,35242L,35243L,35244L,35245L,35246L,35247L,35248L,35249L,35250L,\n35251L,35252L,35253L,35254L,35255L,35256L,35257L,35258L,35259L,35260L,\n35261L,35262L,35263L,35264L,35265L,35266L,35267L,35268L,35269L,35270L,\n35271L,35272L,35273L,35274L,35275L,35276L,35277L,35278L,35279L,35280L,\n35281L,35282L,35283L,35284L,35285L,35286L,35287L,35288L,35289L,35290L,\n35291L,35292L,35293L,35294L,35295L,35296L,35297L,35298L,35299L,35300L,\n35301L,35302L,35303L,35304L,35305L,35306L,35307L,35308L,35309L,35310L,\n35311L,35312L,35313L,35314L,35315L,35316L,35317L,35318L,35319L,35320L,\n35321L,35322L,35323L,35324L,35325L,35326L,35327L,35328L,35329L,35330L,\n35331L,35332L,35333L,35334L,35335L,35336L,35337L,35338L,35339L,35340L,\n35341L,35342L,35343L,35344L,35345L,35346L,35347L,35348L,35349L,35350L,\n35351L,35352L,35353L,35354L,35355L,35356L,35357L,35358L,35359L,35360L,\n35361L,35362L,35363L,35364L,35365L,35366L,35367L,35368L,35369L,35370L,\n35371L,35372L,35373L,35374L,35375L,35376L,35377L,35378L,35379L,35380L,\n35381L,35382L,35383L,35384L,35385L,35386L,35387L,35388L,35389L,35390L,\n35391L,35392L,35393L,35394L,35395L,35396L,35397L,35398L,35399L,35400L,\n35401L,35402L,35403L,35404L,35405L,35406L,35407L,35408L,35409L,35410L,\n35411L,35412L,35413L,35414L,35415L,35416L,35417L,35418L,35419L,35420L,\n35421L,35422L,35423L,35424L,35425L,35426L,35427L,35428L,35429L,35430L,\n35431L,35432L,35433L,35434L,35435L,35436L,35437L,35438L,35439L,35440L,\n35441L,35442L,35443L,35444L,35445L,35446L,35447L,35448L,35449L,35450L,\n35451L,35452L,35453L,35454L,35455L,35456L,35457L,35458L,35459L,35460L,\n35461L,35462L,35463L,35464L,35465L,35466L,35467L,35468L,35469L,35470L,\n35471L,35472L,35473L,35474L,35475L,35476L,35477L,35478L,35479L,35480L,\n35481L,35482L,35483L,35484L,35485L,35486L,35487L,35488L,35489L,35490L,\n35491L,35492L,35493L,35494L,35495L,35496L,35497L,35498L,35499L,35500L,\n35501L,35502L,35503L,35504L,35505L,35506L,35507L,35508L,35509L,35510L,\n35511L,35512L,35513L,35514L,35515L,35516L,35517L,35518L,35519L,35520L,\n35521L,35522L,35523L,35524L,35525L,35526L,35527L,35528L,35529L,35530L,\n35531L,35532L,35533L,35534L,35535L,35536L,35537L,35538L,35539L,35540L,\n35541L,35542L,35543L,35544L,35545L,35546L,35547L,35548L,35549L,35550L,\n35551L,35552L,35553L,35554L,35555L,35556L,35557L,35558L,35559L,35560L,\n35561L,35562L,35563L,35564L,35565L,35566L,35567L,35568L,35569L,35570L,\n35571L,35572L,35573L,35574L,35575L,35576L,35577L,35578L,35579L,35580L,\n35581L,35582L,35583L,35584L,35585L,35586L,35587L,35588L,35589L,35590L,\n35591L,35592L,35593L,35594L,35595L,35596L,35597L,35598L,35599L,35600L,\n35601L,35602L,35603L,35604L,35605L,35606L,35607L,35608L,35609L,35610L,\n35611L,35612L,35613L,35614L,35615L,35616L,35617L,35618L,35619L,35620L,\n35621L,35622L,35623L,35624L,35625L,35626L,35627L,35628L,35629L,35630L,\n35631L,35632L,35633L,35634L,35635L,35636L,35637L,35638L,35639L,35640L,\n35641L,35642L,35643L,35644L,35645L,35646L,35647L,35648L,35649L,35650L,\n35651L,35652L,35653L,35654L,35655L,35656L,35657L,35658L,35659L,35660L,\n35661L,35662L,35663L,35664L,35665L,35666L,35667L,35668L,35669L,35670L,\n35671L,35672L,35673L,35674L,35675L,35676L,35677L,35678L,35679L,35680L,\n35681L,35682L,35683L,35684L,35685L,35686L,35687L,35688L,35689L,35690L,\n35691L,35692L,35693L,35694L,35695L,35696L,35697L,35698L,35699L,35700L,\n35701L,35702L,35703L,35704L,35705L,35706L,35707L,35708L,35709L,35710L,\n35711L,35712L,35713L,35714L,35715L,35716L,35717L,35718L,35719L,35720L,\n35721L,35722L,35723L,35724L,35725L,35726L,35727L,35728L,35729L,35730L,\n35731L,35732L,35733L,35734L,35735L,35736L,35737L,35738L,35739L,35740L,\n35741L,35742L,35743L,35744L,35745L,35746L,35747L,35748L,35749L,35750L,\n35751L,35752L,35753L,35754L,35755L,35756L,35757L,35758L,35759L,35760L,\n35761L,35762L,35763L,35764L,35765L,35766L,35767L,35768L,35769L,35770L,\n35771L,35772L,35773L,35774L,35775L,35776L,35777L,35778L,35779L,35780L,\n35781L,35782L,35783L,35784L,35785L,35786L,35787L,35788L,35789L,35790L,\n35791L,35792L,35793L,35794L,35795L,35796L,35797L,35798L,35799L,35800L,\n35801L,35802L,35803L,35804L,35805L,35806L,35807L,35808L,35809L,35810L,\n35811L,35812L,35813L,35814L,35815L,35816L,35817L,35818L,35819L,35820L,\n35821L,35822L,35823L,35824L,35825L,35826L,35827L,35828L,35829L,35830L,\n35831L,35832L,35833L,35834L,35835L,35836L,35837L,35838L,35839L,35840L,\n35841L,35842L,35843L,35844L,35845L,35846L,35847L,35848L,35849L,35850L,\n35851L,35852L,35853L,35854L,35855L,35856L,35857L,35858L,35859L,35860L,\n35861L,35862L,35863L,35864L,35865L,35866L,35867L,35868L,35869L,35870L,\n35871L,35872L,35873L,35874L,35875L,35876L,35877L,35878L,35879L,35880L,\n35881L,35882L,35883L,35884L,35885L,35886L,35887L,35888L,35889L,35890L,\n35891L,35892L,35893L,35894L,35895L,35896L,35897L,35898L,35899L,35900L,\n35901L,35902L,35903L,35904L,35905L,35906L,35907L,35908L,35909L,35910L,\n35911L,35912L,35913L,35914L,35915L,35916L,35917L,35918L,35919L,35920L,\n35921L,35922L,35923L,35924L,35925L,35926L,35927L,35928L,35929L,35930L,\n35931L,35932L,35933L,35934L,35935L,35936L,35937L,35938L,35939L,35940L,\n35941L,35942L,35943L,35944L,35945L,35946L,35947L,35948L,35949L,35950L,\n35951L,35952L,35953L,35954L,35955L,35956L,35957L,35958L,35959L,35960L,\n35961L,35962L,35963L,35964L,35965L,35966L,35967L,35968L,35969L,35970L,\n35971L,35972L,35973L,35974L,35975L,35976L,35977L,35978L,35979L,35980L,\n35981L,35982L,35983L,35984L,35985L,35986L,35987L,35988L,35989L,35990L,\n35991L,35992L,35993L,35994L,35995L,35996L,35997L,35998L,35999L,36000L,\n36001L,36002L,36003L,36004L,36005L,36006L,36007L,36008L,36009L,36010L,\n36011L,36012L,36013L,36014L,36015L,36016L,36017L,36018L,36019L,36020L,\n36021L,36022L,36023L,36024L,36025L,36026L,36027L,36028L,36029L,36030L,\n36031L,36032L,36033L,36034L,36035L,36036L,36037L,36038L,36039L,36040L,\n36041L,36042L,36043L,36044L,36045L,36046L,36047L,36048L,36049L,36050L,\n36051L,36052L,36053L,36054L,36055L,36056L,36057L,36058L,36059L,36060L,\n36061L,36062L,36063L,36064L,36065L,36066L,36067L,36068L,36069L,36070L,\n36071L,36072L,36073L,36074L,36075L,36076L,36077L,36078L,36079L,36080L,\n36081L,36082L,36083L,36084L,36085L,36086L,36087L,36088L,36089L,36090L,\n36091L,36092L,36093L,36094L,36095L,36096L,36097L,36098L,36099L,36100L,\n36101L,36102L,36103L,36104L,36105L,36106L,36107L,36108L,36109L,36110L,\n36111L,36112L,36113L,36114L,36115L,36116L,36117L,36118L,36119L,36120L,\n36121L,36122L,36123L,36124L,36125L,36126L,36127L,36128L,36129L,36130L,\n36131L,36132L,36133L,36134L,36135L,36136L,36137L,36138L,36139L,36140L,\n36141L,36142L,36143L,36144L,36145L,36146L,36147L,36148L,36149L,36150L,\n36151L,36152L,36153L,36154L,36155L,36156L,36157L,36158L,36159L,36160L,\n36161L,36162L,36163L,36164L,36165L,36166L,36167L,36168L,36169L,36170L,\n36171L,36172L,36173L,36174L,36175L,36176L,36177L,36178L,36179L,36180L,\n36181L,36182L,36183L,36184L,36185L,36186L,36187L,36188L,36189L,36190L,\n36191L,36192L,36193L,36194L,36195L,36196L,36197L,36198L,36199L,36200L,\n36201L,36202L,36203L,36204L,36205L,36206L,36207L,36208L,36209L,36210L,\n36211L,36212L,36213L,36214L,36215L,36216L,36217L,36218L,36219L,36220L,\n36221L,36222L,36223L,36224L,36225L,36226L,36227L,36228L,36229L,36230L,\n36231L,36232L,36233L,36234L,36235L,36236L,36237L,36238L,36239L,36240L,\n36241L,36242L,36243L,36244L,36245L,36246L,36247L,36248L,36249L,36250L,\n36251L,36252L,36253L,36254L,36255L,36256L,36257L,36258L,36259L,36260L,\n36261L,36262L,36263L,36264L,36265L,36266L,36267L,36268L,36269L,36270L,\n36271L,36272L,36273L,36274L,36275L,36276L,36277L,36278L,36279L,36280L,\n36281L,36282L,36283L,36284L,36285L,36286L,36287L,36288L,36289L,36290L,\n36291L,36292L,36293L,36294L,36295L,36296L,36297L,36298L,36299L,36300L,\n36301L,36302L,36303L,36304L,36305L,36306L,36307L,36308L,36309L,36310L,\n36311L,36312L,36313L,36314L,36315L,36316L,36317L,36318L,36319L,36320L,\n36321L,36322L,36323L,36324L,36325L,36326L,36327L,36328L,36329L,36330L,\n36331L,36332L,36333L,36334L,36335L,36336L,36337L,36338L,36339L,36340L,\n36341L,36342L,36343L,36344L,36345L,36346L,36347L,36348L,36349L,36350L,\n36351L,36352L,36353L,36354L,36355L,36356L,36357L,36358L,36359L,36360L,\n36361L,36362L,36363L,36364L,36365L,36366L,36367L,36368L,36369L,36370L,\n36371L,36372L,36373L,36374L,36375L,36376L,36377L,36378L,36379L,36380L,\n36381L,36382L,36383L,36384L,36385L,36386L,36387L,36388L,36389L,36390L,\n36391L,36392L,36393L,36394L,36395L,36396L,36397L,36398L,36399L,36400L,\n36401L,36402L,36403L,36404L,36405L,36406L,36407L,36408L,36409L,36410L,\n36411L,36412L,36413L,36414L,36415L,36416L,36417L,36418L,36419L,36420L,\n36421L,36422L,36423L,36424L,36425L,36426L,36427L,36428L,36429L,36430L,\n36431L,36432L,36433L,36434L,36435L,36436L,36437L,36438L,36439L,36440L,\n36441L,36442L,36443L,36444L,36445L,36446L,36447L,36448L,36449L,36450L,\n36451L,36452L,36453L,36454L,36455L,36456L,36457L,36458L,36459L,36460L,\n36461L,36462L,36463L,36464L,36465L,36466L,36467L,36468L,36469L,36470L,\n36471L,36472L,36473L,36474L,36475L,36476L,36477L,36478L,36479L,36480L,\n36481L,36482L,36483L,36484L,36485L,36486L,36487L,36488L,36489L,36490L,\n36491L,36492L,36493L,36494L,36495L,36496L,36497L,36498L,36499L,36500L,\n36501L,36502L,36503L,36504L,36505L,36506L,36507L,36508L,36509L,36510L,\n36511L,36512L,36513L,36514L,36515L,36516L,36517L,36518L,36519L,36520L,\n36521L,36522L,36523L,36524L,36525L,36526L,36527L,36528L,36529L,36530L,\n36531L,36532L,36533L,36534L,36535L,36536L,36537L,36538L,36539L,36540L,\n36541L,36542L,36543L,36544L,36545L,36546L,36547L,36548L,36549L,36550L,\n36551L,36552L,36553L,36554L,36555L,36556L,36557L,36558L,36559L,36560L,\n36561L,36562L,36563L,36564L,36565L,36566L,36567L,36568L,36569L,36570L,\n36571L,36572L,36573L,36574L,36575L,36576L,36577L,36578L,36579L,36580L,\n36581L,36582L,36583L,36584L,36585L,36586L,36587L,36588L,36589L,36590L,\n36591L,36592L,36593L,36594L,36595L,36596L,36597L,36598L,36599L,36600L,\n36601L,36602L,36603L,36604L,36605L,36606L,36607L,36608L,36609L,36610L,\n36611L,36612L,36613L,36614L,36615L,36616L,36617L,36618L,36619L,36620L,\n36621L,36622L,36623L,36624L,36625L,36626L,36627L,36628L,36629L,36630L,\n36631L,36632L,36633L,36634L,36635L,36636L,36637L,36638L,36639L,36640L,\n36641L,36642L,36643L,36644L,36645L,36646L,36647L,36648L,36649L,36650L,\n36651L,36652L,36653L,36654L,36655L,36656L,36657L,36658L,36659L,36660L,\n36661L,36662L,36663L,36664L,36665L,36666L,36667L,36668L,36669L,36670L,\n36671L,36672L,36673L,36674L,36675L,36676L,36677L,36678L,36679L,36680L,\n36681L,36682L,36683L,36684L,36685L,36686L,36687L,36688L,36689L,36690L,\n36691L,36692L,36693L,36694L,36695L,36696L,36697L,36698L,36699L,36700L,\n36701L,36702L,36703L,36704L,36705L,36706L,36707L,36708L,36709L,36710L,\n36711L,36712L,36713L,36714L,36715L,36716L,36717L,36718L,36719L,36720L,\n36721L,36722L,36723L,36724L,36725L,36726L,36727L,36728L,36729L,36730L,\n36731L,36732L,36733L,36734L,36735L,36736L,36737L,36738L,36739L,36740L,\n36741L,36742L,36743L,36744L,36745L,36746L,36747L,36748L,36749L,36750L,\n36751L,36752L,36753L,36754L,36755L,36756L,36757L,36758L,36759L,36760L,\n36761L,36762L,36763L,36764L,36765L,36766L,36767L,36768L,36769L,36770L,\n36771L,36772L,36773L,36774L,36775L,36776L,36777L,36778L,36779L,36780L,\n36781L,36782L,36783L,36784L,36785L,36786L,36787L,36788L,36789L,36790L,\n36791L,36792L,36793L,36794L,36795L,36796L,36797L,36798L,36799L,36800L,\n36801L,36802L,36803L,36804L,36805L,36806L,36807L,36808L,36809L,36810L,\n36811L,36812L,36813L,36814L,36815L,36816L,36817L,36818L,36819L,36820L,\n36821L,36822L,36823L,36824L,36825L,36826L,36827L,36828L,36829L,36830L,\n36831L,36832L,36833L,36834L,36835L,36836L,36837L,36838L,36839L,36840L,\n36841L,36842L,36843L,36844L,36845L,36846L,36847L,36848L,36849L,36850L,\n36851L,36852L,36853L,36854L,36855L,36856L,36857L,36858L,36859L,36860L,\n36861L,36862L,36863L,36864L,36865L,36866L,36867L,36868L,36869L,36870L,\n36871L,36872L,36873L,36874L,36875L,36876L,36877L,36878L,36879L,36880L,\n36881L,36882L,36883L,36884L,36885L,36886L,36887L,36888L,36889L,36890L,\n36891L,36892L,36893L,36894L,36895L,36896L,36897L,36898L,36899L,36900L,\n36901L,36902L,36903L,36904L,36905L,36906L,36907L,36908L,36909L,36910L,\n36911L,36912L,36913L,36914L,36915L,36916L,36917L,36918L,36919L,36920L,\n36921L,36922L,36923L,36924L,36925L,36926L,36927L,36928L,36929L,36930L,\n36931L,36932L,36933L,36934L,36935L,36936L,36937L,36938L,36939L,36940L,\n36941L,36942L,36943L,36944L,36945L,36946L,36947L,36948L,36949L,36950L,\n36951L,36952L,36953L,36954L,36955L,36956L,36957L,36958L,36959L,36960L,\n36961L,36962L,36963L,36964L,36965L,36966L,36967L,36968L,36969L,36970L,\n36971L,36972L,36973L,36974L,36975L,36976L,36977L,36978L,36979L,36980L,\n36981L,36982L,36983L,36984L,36985L,36986L,36987L,36988L,36989L,36990L,\n36991L,36992L,36993L,36994L,36995L,36996L,36997L,36998L,36999L,37000L,\n37001L,37002L,37003L,37004L,37005L,37006L,37007L,37008L,37009L,37010L,\n37011L,37012L,37013L,37014L,37015L,37016L,37017L,37018L,37019L,37020L,\n37021L,37022L,37023L,37024L,37025L,37026L,37027L,37028L,37029L,37030L,\n37031L,37032L,37033L,37034L,37035L,37036L,37037L,37038L,37039L,37040L,\n37041L,37042L,37043L,37044L,37045L,37046L,37047L,37048L,37049L,37050L,\n37051L,37052L,37053L,37054L,37055L,37056L,37057L,37058L,37059L,37060L,\n37061L,37062L,37063L,37064L,37065L,37066L,37067L,37068L,37069L,37070L,\n37071L,37072L,37073L,37074L,37075L,37076L,37077L,37078L,37079L,37080L,\n37081L,37082L,37083L,37084L,37085L,37086L,37087L,37088L,37089L,37090L,\n37091L,37092L,37093L,37094L,37095L,37096L,37097L,37098L,37099L,37100L,\n37101L,37102L,37103L,37104L,37105L,37106L,37107L,37108L,37109L,37110L,\n37111L,37112L,37113L,37114L,37115L,37116L,37117L,37118L,37119L,37120L,\n37121L,37122L,37123L,37124L,37125L,37126L,37127L,37128L,37129L,37130L,\n37131L,37132L,37133L,37134L,37135L,37136L,37137L,37138L,37139L,37140L,\n37141L,37142L,37143L,37144L,37145L,37146L,37147L,37148L,37149L,37150L,\n37151L,37152L,37153L,37154L,37155L,37156L,37157L,37158L,37159L,37160L,\n37161L,37162L,37163L,37164L,37165L,37166L,37167L,37168L,37169L,37170L,\n37171L,37172L,37173L,37174L,37175L,37176L,37177L,37178L,37179L,37180L,\n37181L,37182L,37183L,37184L,37185L,37186L,37187L,37188L,37189L,37190L,\n37191L,37192L,37193L,37194L,37195L,37196L,37197L,37198L,37199L,37200L,\n37201L,37202L,37203L,37204L,37205L,37206L,37207L,37208L,37209L,37210L,\n37211L,37212L,37213L,37214L,37215L,37216L,37217L,37218L,37219L,37220L,\n37221L,37222L,37223L,37224L,37225L,37226L,37227L,37228L,37229L,37230L,\n37231L,37232L,37233L,37234L,37235L,37236L,37237L,37238L,37239L,37240L,\n37241L,37242L,37243L,37244L,37245L,37246L,37247L,37248L,37249L,37250L,\n37251L,37252L,37253L,37254L,37255L,37256L,37257L,37258L,37259L,37260L,\n37261L,37262L,37263L,37264L,37265L,37266L,37267L,37268L,37269L,37270L,\n37271L,37272L,37273L,37274L,37275L,37276L,37277L,37278L,37279L,37280L,\n37281L,37282L,37283L,37284L,37285L,37286L,37287L,37288L,37289L,37290L,\n37291L,37292L,37293L,37294L,37295L,37296L,37297L,37298L,37299L,37300L,\n37301L,37302L,37303L,37304L,37305L,37306L,37307L,37308L,37309L,37310L,\n37311L,37312L,37313L,37314L,37315L,37316L,37317L,37318L,37319L,37320L,\n37321L,37322L,37323L,37324L,37325L,37326L,37327L,37328L,37329L,37330L,\n37331L,37332L,37333L,37334L,37335L,37336L,37337L,37338L,37339L,37340L,\n37341L,37342L,37343L,37344L,37345L,37346L,37347L,37348L,37349L,37350L,\n37351L,37352L,37353L,37354L,37355L,37356L,37357L,37358L,37359L,37360L,\n37361L,37362L,37363L,37364L,37365L,37366L,37367L,37368L,37369L,37370L,\n37371L,37372L,37373L,37374L,37375L,37376L,37377L,37378L,37379L,37380L,\n37381L,37382L,37383L,37384L,37385L,37386L,37387L,37388L,37389L,37390L,\n37391L,37392L,37393L,37394L,37395L,37396L,37397L,37398L,37399L,37400L,\n37401L,37402L,37403L,37404L,37405L,37406L,37407L,37408L,37409L,37410L,\n37411L,37412L,37413L,37414L,37415L,37416L,37417L,37418L,37419L,37420L,\n37421L,37422L,37423L,37424L,37425L,37426L,37427L,37428L,37429L,37430L,\n37431L,37432L,37433L,37434L,37435L,37436L,37437L,37438L,37439L,37440L,\n37441L,37442L,37443L,37444L,37445L,37446L,37447L,37448L,37449L,37450L,\n37451L,37452L,37453L,37454L,37455L,37456L,37457L,37458L,37459L,37460L,\n37461L,37462L,37463L,37464L,37465L,37466L,37467L,37468L,37469L,37470L,\n37471L,37472L,37473L,37474L,37475L,37476L,37477L,37478L,37479L,37480L,\n37481L,37482L,37483L,37484L,37485L,37486L,37487L,37488L,37489L,37490L,\n37491L,37492L,37493L,37494L,37495L,37496L,37497L,37498L,37499L,37500L,\n37501L,37502L,37503L,37504L,37505L,37506L,37507L,37508L,37509L,37510L,\n37511L,37512L,37513L,37514L,37515L,37516L,37517L,37518L,37519L,37520L,\n37521L,37522L,37523L,37524L,37525L,37526L,37527L,37528L,37529L,37530L,\n37531L,37532L,37533L,37534L,37535L,37536L,37537L,37538L,37539L,37540L,\n37541L,37542L,37543L,37544L,37545L,37546L,37547L,37548L,37549L,37550L,\n37551L,37552L,37553L,37554L,37555L,37556L,37557L,37558L,37559L,37560L,\n37561L,37562L,37563L,37564L,37565L,37566L,37567L,37568L,37569L,37570L,\n37571L,37572L,37573L,37574L,37575L,37576L,37577L,37578L,37579L,37580L,\n37581L,37582L,37583L,37584L,37585L,37586L,37587L,37588L,37589L,37590L,\n37591L,37592L,37593L,37594L,37595L,37596L,37597L,37598L,37599L,37600L,\n37601L,37602L,37603L,37604L,37605L,37606L,37607L,37608L,37609L,37610L,\n37611L,37612L,37613L,37614L,37615L,37616L,37617L,37618L,37619L,37620L,\n37621L,37622L,37623L,37624L,37625L,37626L,37627L,37628L,37629L,37630L,\n37631L,37632L,37633L,37634L,37635L,37636L,37637L,37638L,37639L,37640L,\n37641L,37642L,37643L,37644L,37645L,37646L,37647L,37648L,37649L,37650L,\n37651L,37652L,37653L,37654L,37655L,37656L,37657L,37658L,37659L,37660L,\n37661L,37662L,37663L,37664L,37665L,37666L,37667L,37668L,37669L,37670L,\n37671L,37672L,37673L,37674L,37675L,37676L,37677L,37678L,37679L,37680L,\n37681L,37682L,37683L,37684L,37685L,37686L,37687L,37688L,37689L,37690L,\n37691L,37692L,37693L,37694L,37695L,37696L,37697L,37698L,37699L,37700L,\n37701L,37702L,37703L,37704L,37705L,37706L,37707L,37708L,37709L,37710L,\n37711L,37712L,37713L,37714L,37715L,37716L,37717L,37718L,37719L,37720L,\n37721L,37722L,37723L,37724L,37725L,37726L,37727L,37728L,37729L,37730L,\n37731L,37732L,37733L,37734L,37735L,37736L,37737L,37738L,37739L,37740L,\n37741L,37742L,37743L,37744L,37745L,37746L,37747L,37748L,37749L,37750L,\n37751L,37752L,37753L,37754L,37755L,37756L,37757L,37758L,37759L,37760L,\n37761L,37762L,37763L,37764L,37765L,37766L,37767L,37768L,37769L,37770L,\n37771L,37772L,37773L,37774L,37775L,37776L,37777L,37778L,37779L,37780L,\n37781L,37782L,37783L,37784L,37785L,37786L,37787L,37788L,37789L,37790L,\n37791L,37792L,37793L,37794L,37795L,37796L,37797L,37798L,37799L,37800L,\n37801L,37802L,37803L,37804L,37805L,37806L,37807L,37808L,37809L,37810L,\n37811L,37812L,37813L,37814L,37815L,37816L,37817L,37818L,37819L,37820L,\n37821L,37822L,37823L,37824L,37825L,37826L,37827L,37828L,37829L,37830L,\n37831L,37832L,37833L,37834L,37835L,37836L,37837L,37838L,37839L,37840L,\n37841L,37842L,37843L,37844L,37845L,37846L,37847L,37848L,37849L,37850L,\n37851L,37852L,37853L,37854L,37855L,37856L,37857L,37858L,37859L,37860L,\n37861L,37862L,37863L,37864L,37865L,37866L,37867L,37868L,37869L,37870L,\n37871L,37872L,37873L,37874L,37875L,37876L,37877L,37878L,37879L,37880L,\n37881L,37882L,37883L,37884L,37885L,37886L,37887L,37888L,37889L,37890L,\n37891L,37892L,37893L,37894L,37895L,37896L,37897L,37898L,37899L,37900L,\n37901L,37902L,37903L,37904L,37905L,37906L,37907L,37908L,37909L,37910L,\n37911L,37912L,37913L,37914L,37915L,37916L,37917L,37918L,37919L,37920L,\n37921L,37922L,37923L,37924L,37925L,37926L,37927L,37928L,37929L,37930L,\n37931L,37932L,37933L,37934L,37935L,37936L,37937L,37938L,37939L,37940L,\n37941L,37942L,37943L,37944L,37945L,37946L,37947L,37948L,37949L,37950L,\n37951L,37952L,37953L,37954L,37955L,37956L,37957L,37958L,37959L,37960L,\n37961L,37962L,37963L,37964L,37965L,37966L,37967L,37968L,37969L,37970L,\n37971L,37972L,37973L,37974L,37975L,37976L,37977L,37978L,37979L,37980L,\n37981L,37982L,37983L,37984L,37985L,37986L,37987L,37988L,37989L,37990L,\n37991L,37992L,37993L,37994L,37995L,37996L,37997L,37998L,37999L,38000L,\n38001L,38002L,38003L,38004L,38005L,38006L,38007L,38008L,38009L,38010L,\n38011L,38012L,38013L,38014L,38015L,38016L,38017L,38018L,38019L,38020L,\n38021L,38022L,38023L,38024L,38025L,38026L,38027L,38028L,38029L,38030L,\n38031L,38032L,38033L,38034L,38035L,38036L,38037L,38038L,38039L,38040L,\n38041L,38042L,38043L,38044L,38045L,38046L,38047L,38048L,38049L,38050L,\n38051L,38052L,38053L,38054L,38055L,38056L,38057L,38058L,38059L,38060L,\n38061L,38062L,38063L,38064L,38065L,38066L,38067L,38068L,38069L,38070L,\n38071L,38072L,38073L,38074L,38075L,38076L,38077L,38078L,38079L,38080L,\n38081L,38082L,38083L,38084L,38085L,38086L,38087L,38088L,38089L,38090L,\n38091L,38092L,38093L,38094L,38095L,38096L,38097L,38098L,38099L,38100L,\n38101L,38102L,38103L,38104L,38105L,38106L,38107L,38108L,38109L,38110L,\n38111L,38112L,38113L,38114L,38115L,38116L,38117L,38118L,38119L,38120L,\n38121L,38122L,38123L,38124L,38125L,38126L,38127L,38128L,38129L,38130L,\n38131L,38132L,38133L,38134L,38135L,38136L,38137L,38138L,38139L,38140L,\n38141L,38142L,38143L,38144L,38145L,38146L,38147L,38148L,38149L,38150L,\n38151L,38152L,38153L,38154L,38155L,38156L,38157L,38158L,38159L,38160L,\n38161L,38162L,38163L,38164L,38165L,38166L,38167L,38168L,38169L,38170L,\n38171L,38172L,38173L,38174L,38175L,38176L,38177L,38178L,38179L,38180L,\n38181L,38182L,38183L,38184L,38185L,38186L,38187L,38188L,38189L,38190L,\n38191L,38192L,38193L,38194L,38195L,38196L,38197L,38198L,38199L,38200L,\n38201L,38202L,38203L,38204L,38205L,38206L,38207L,38208L,38209L,38210L,\n38211L,38212L,38213L,38214L,38215L,38216L,38217L,38218L,38219L,38220L,\n38221L,38222L,38223L,38224L,38225L,38226L,38227L,38228L,38229L,38230L,\n38231L,38232L,38233L,38234L,38235L,38236L,38237L,38238L,38239L,38240L,\n38241L,38242L,38243L,38244L,38245L,38246L,38247L,38248L,38249L,38250L,\n38251L,38252L,38253L,38254L,38255L,38256L,38257L,38258L,38259L,38260L,\n38261L,38262L,38263L,38264L,38265L,38266L,38267L,38268L,38269L,38270L,\n38271L,38272L,38273L,38274L,38275L,38276L,38277L,38278L,38279L,38280L,\n38281L,38282L,38283L,38284L,38285L,38286L,38287L,38288L,38289L,38290L,\n38291L,38292L,38293L,38294L,38295L,38296L,38297L,38298L,38299L,38300L,\n38301L,38302L,38303L,38304L,38305L,38306L,38307L,38308L,38309L,38310L,\n38311L,38312L,38313L,38314L,38315L,38316L,38317L,38318L,38319L,38320L,\n38321L,38322L,38323L,38324L,38325L,38326L,38327L,38328L,38329L,38330L,\n38331L,38332L,38333L,38334L,38335L,38336L,38337L,38338L,38339L,38340L,\n38341L,38342L,38343L,38344L,38345L,38346L,38347L,38348L,38349L,38350L,\n38351L,38352L,38353L,38354L,38355L,38356L,38357L,38358L,38359L,38360L,\n38361L,38362L,38363L,38364L,38365L,38366L,38367L,38368L,38369L,38370L,\n38371L,38372L,38373L,38374L,38375L,38376L,38377L,38378L,38379L,38380L,\n38381L,38382L,38383L,38384L,38385L,38386L,38387L,38388L,38389L,38390L,\n38391L,38392L,38393L,38394L,38395L,38396L,38397L,38398L,38399L,38400L,\n38401L,38402L,38403L,38404L,38405L,38406L,38407L,38408L,38409L,38410L,\n38411L,38412L,38413L,38414L,38415L,38416L,38417L,38418L,38419L,38420L,\n38421L,38422L,38423L,38424L,38425L,38426L,38427L,38428L,38429L,38430L,\n38431L,38432L,38433L,38434L,38435L,38436L,38437L,38438L,38439L,38440L,\n38441L,38442L,38443L,38444L,38445L,38446L,38447L,38448L,38449L,38450L,\n38451L,38452L,38453L,38454L,38455L,38456L,38457L,38458L,38459L,38460L,\n38461L,38462L,38463L,38464L,38465L,38466L,38467L,38468L,38469L,38470L,\n38471L,38472L,38473L,38474L,38475L,38476L,38477L,38478L,38479L,38480L,\n38481L,38482L,38483L,38484L,38485L,38486L,38487L,38488L,38489L,38490L,\n38491L,38492L,38493L,38494L,38495L,38496L,38497L,38498L,38499L,38500L,\n38501L,38502L,38503L,38504L,38505L,38506L,38507L,38508L,38509L,38510L,\n38511L,38512L,38513L,38514L,38515L,38516L,38517L,38518L,38519L,38520L,\n38521L,38522L,38523L,38524L,38525L,38526L,38527L,38528L,38529L,38530L,\n38531L,38532L,38533L,38534L,38535L,38536L,38537L,38538L,38539L,38540L,\n38541L,38542L,38543L,38544L,38545L,38546L,38547L,38548L,38549L,38550L,\n38551L,38552L,38553L,38554L,38555L,38556L,38557L,38558L,38559L,38560L,\n38561L,38562L,38563L,38564L,38565L,38566L,38567L,38568L,38569L,38570L,\n38571L,38572L,38573L,38574L,38575L,38576L,38577L,38578L,38579L,38580L,\n38581L,38582L,38583L,38584L,38585L,38586L,38587L,38588L,38589L,38590L,\n38591L,38592L,38593L,38594L,38595L,38596L,38597L,38598L,38599L,38600L,\n38601L,38602L,38603L,38604L,38605L,38606L,38607L,38608L,38609L,38610L,\n38611L,38612L,38613L,38614L,38615L,38616L,38617L,38618L,38619L,38620L,\n38621L,38622L,38623L,38624L,38625L,38626L,38627L,38628L,38629L,38630L,\n38631L,38632L,38633L,38634L,38635L,38636L,38637L,38638L,38639L,38640L,\n38641L,38642L,38643L,38644L,38645L,38646L,38647L,38648L,38649L,38650L,\n38651L,38652L,38653L,38654L,38655L,38656L,38657L,38658L,38659L,38660L,\n38661L,38662L,38663L,38664L,38665L,38666L,38667L,38668L,38669L,38670L,\n38671L,38672L,38673L,38674L,38675L,38676L,38677L,38678L,38679L,38680L,\n38681L,38682L,38683L,38684L,38685L,38686L,38687L,38688L,38689L,38690L,\n38691L,38692L,38693L,38694L,38695L,38696L,38697L,38698L,38699L,38700L,\n38701L,38702L,38703L,38704L,38705L,38706L,38707L,38708L,38709L,38710L,\n38711L,38712L,38713L,38714L,38715L,38716L,38717L,38718L,38719L,38720L,\n38721L,38722L,38723L,38724L,38725L,38726L,38727L,38728L,38729L,38730L,\n38731L,38732L,38733L,38734L,38735L,38736L,38737L,38738L,38739L,38740L,\n38741L,38742L,38743L,38744L,38745L,38746L,38747L,38748L,38749L,38750L,\n38751L,38752L,38753L,38754L,38755L,38756L,38757L,38758L,38759L,38760L,\n38761L,38762L,38763L,38764L,38765L,38766L,38767L,38768L,38769L,38770L,\n38771L,38772L,38773L,38774L,38775L,38776L,38777L,38778L,38779L,38780L,\n38781L,38782L,38783L,38784L,38785L,38786L,38787L,38788L,38789L,38790L,\n38791L,38792L,38793L,38794L,38795L,38796L,38797L,38798L,38799L,38800L,\n38801L,38802L,38803L,38804L,38805L,38806L,38807L,38808L,38809L,38810L,\n38811L,38812L,38813L,38814L,38815L,38816L,38817L,38818L,38819L,38820L,\n38821L,38822L,38823L,38824L,38825L,38826L,38827L,38828L,38829L,38830L,\n38831L,38832L,38833L,38834L,38835L,38836L,38837L,38838L,38839L,38840L,\n38841L,38842L,38843L,38844L,38845L,38846L,38847L,38848L,38849L,38850L,\n38851L,38852L,38853L,38854L,38855L,38856L,38857L,38858L,38859L,38860L,\n38861L,38862L,38863L,38864L,38865L,38866L,38867L,38868L,38869L,38870L,\n38871L,38872L,38873L,38874L,38875L,38876L,38877L,38878L,38879L,38880L,\n38881L,38882L,38883L,38884L,38885L,38886L,38887L,38888L,38889L,38890L,\n38891L,38892L,38893L,38894L,38895L,38896L,38897L,38898L,38899L,38900L,\n38901L,38902L,38903L,38904L,38905L,38906L,38907L,38908L,38909L,38910L,\n38911L,38912L,38913L,38914L,38915L,38916L,38917L,38918L,38919L,38920L,\n38921L,38922L,38923L,38924L,38925L,38926L,38927L,38928L,38929L,38930L,\n38931L,38932L,38933L,38934L,38935L,38936L,38937L,38938L,38939L,38940L,\n38941L,38942L,38943L,38944L,38945L,38946L,38947L,38948L,38949L,38950L,\n38951L,38952L,38953L,38954L,38955L,38956L,38957L,38958L,38959L,38960L,\n38961L,38962L,38963L,38964L,38965L,38966L,38967L,38968L,38969L,38970L,\n38971L,38972L,38973L,38974L,38975L,38976L,38977L,38978L,38979L,38980L,\n38981L,38982L,38983L,38984L,38985L,38986L,38987L,38988L,38989L,38990L,\n38991L,38992L,38993L,38994L,38995L,38996L,38997L,38998L,38999L,39000L,\n39001L,39002L,39003L,39004L,39005L,39006L,39007L,39008L,39009L,39010L,\n39011L,39012L,39013L,39014L,39015L,39016L,39017L,39018L,39019L,39020L,\n39021L,39022L,39023L,39024L,39025L,39026L,39027L,39028L,39029L,39030L,\n39031L,39032L,39033L,39034L,39035L,39036L,39037L,39038L,39039L,39040L,\n39041L,39042L,39043L,39044L,39045L,39046L,39047L,39048L,39049L,39050L,\n39051L,39052L,39053L,39054L,39055L,39056L,39057L,39058L,39059L,39060L,\n39061L,39062L,39063L,39064L,39065L,39066L,39067L,39068L,39069L,39070L,\n39071L,39072L,39073L,39074L,39075L,39076L,39077L,39078L,39079L,39080L,\n39081L,39082L,39083L,39084L,39085L,39086L,39087L,39088L,39089L,39090L,\n39091L,39092L,39093L,39094L,39095L,39096L,39097L,39098L,39099L,39100L,\n39101L,39102L,39103L,39104L,39105L,39106L,39107L,39108L,39109L,39110L,\n39111L,39112L,39113L,39114L,39115L,39116L,39117L,39118L,39119L,39120L,\n39121L,39122L,39123L,39124L,39125L,39126L,39127L,39128L,39129L,39130L,\n39131L,39132L,39133L,39134L,39135L,39136L,39137L,39138L,39139L,39140L,\n39141L,39142L,39143L,39144L,39145L,39146L,39147L,39148L,39149L,39150L,\n39151L,39152L,39153L,39154L,39155L,39156L,39157L,39158L,39159L,39160L,\n39161L,39162L,39163L,39164L,39165L,39166L,39167L,39168L,39169L,39170L,\n39171L,39172L,39173L,39174L,39175L,39176L,39177L,39178L,39179L,39180L,\n39181L,39182L,39183L,39184L,39185L,39186L,39187L,39188L,39189L,39190L,\n39191L,39192L,39193L,39194L,39195L,39196L,39197L,39198L,39199L,39200L,\n39201L,39202L,39203L,39204L,39205L,39206L,39207L,39208L,39209L,39210L,\n39211L,39212L,39213L,39214L,39215L,39216L,39217L,39218L,39219L,39220L,\n39221L,39222L,39223L,39224L,39225L,39226L,39227L,39228L,39229L,39230L,\n39231L,39232L,39233L,39234L,39235L,39236L,39237L,39238L,39239L,39240L,\n39241L,39242L,39243L,39244L,39245L,39246L,39247L,39248L,39249L,39250L,\n39251L,39252L,39253L,39254L,39255L,39256L,39257L,39258L,39259L,39260L,\n39261L,39262L,39263L,39264L,39265L,39266L,39267L,39268L,39269L,39270L,\n39271L,39272L,39273L,39274L,39275L,39276L,39277L,39278L,39279L,39280L,\n39281L,39282L,39283L,39284L,39285L,39286L,39287L,39288L,39289L,39290L,\n39291L,39292L,39293L,39294L,39295L,39296L,39297L,39298L,39299L,39300L,\n39301L,39302L,39303L,39304L,39305L,39306L,39307L,39308L,39309L,39310L,\n39311L,39312L,39313L,39314L,39315L,39316L,39317L,39318L,39319L,39320L,\n39321L,39322L,39323L,39324L,39325L,39326L,39327L,39328L,39329L,39330L,\n39331L,39332L,39333L,39334L,39335L,39336L,39337L,39338L,39339L,39340L,\n39341L,39342L,39343L,39344L,39345L,39346L,39347L,39348L,39349L,39350L,\n39351L,39352L,39353L,39354L,39355L,39356L,39357L,39358L,39359L,39360L,\n39361L,39362L,39363L,39364L,39365L,39366L,39367L,39368L,39369L,39370L,\n39371L,39372L,39373L,39374L,39375L,39376L,39377L,39378L,39379L,39380L,\n39381L,39382L,39383L,39384L,39385L,39386L,39387L,39388L,39389L,39390L,\n39391L,39392L,39393L,39394L,39395L,39396L,39397L,39398L,39399L,39400L,\n39401L,39402L,39403L,39404L,39405L,39406L,39407L,39408L,39409L,39410L,\n39411L,39412L,39413L,39414L,39415L,39416L,39417L,39418L,39419L,39420L,\n39421L,39422L,39423L,39424L,39425L,39426L,39427L,39428L,39429L,39430L,\n39431L,39432L,39433L,39434L,39435L,39436L,39437L,39438L,39439L,39440L,\n39441L,39442L,39443L,39444L,39445L,39446L,39447L,39448L,39449L,39450L,\n39451L,39452L,39453L,39454L,39455L,39456L,39457L,39458L,39459L,39460L,\n39461L,39462L,39463L,39464L,39465L,39466L,39467L,39468L,39469L,39470L,\n39471L,39472L,39473L,39474L,39475L,39476L,39477L,39478L,39479L,39480L,\n39481L,39482L,39483L,39484L,39485L,39486L,39487L,39488L,39489L,39490L,\n39491L,39492L,39493L,39494L,39495L,39496L,39497L,39498L,39499L,39500L,\n39501L,39502L,39503L,39504L,39505L,39506L,39507L,39508L,39509L,39510L,\n39511L,39512L,39513L,39514L,39515L,39516L,39517L,39518L,39519L,39520L,\n39521L,39522L,39523L,39524L,39525L,39526L,39527L,39528L,39529L,39530L,\n39531L,39532L,39533L,39534L,39535L,39536L,39537L,39538L,39539L,39540L,\n39541L,39542L,39543L,39544L,39545L,39546L,39547L,39548L,39549L,39550L,\n39551L,39552L,39553L,39554L,39555L,39556L,39557L,39558L,39559L,39560L,\n39561L,39562L,39563L,39564L,39565L,39566L,39567L,39568L,39569L,39570L,\n39571L,39572L,39573L,39574L,39575L,39576L,39577L,39578L,39579L,39580L,\n39581L,39582L,39583L,39584L,39585L,39586L,39587L,39588L,39589L,39590L,\n39591L,39592L,39593L,39594L,39595L,39596L,39597L,39598L,39599L,39600L,\n39601L,39602L,39603L,39604L,39605L,39606L,39607L,39608L,39609L,39610L,\n39611L,39612L,39613L,39614L,39615L,39616L,39617L,39618L,39619L,39620L,\n39621L,39622L,39623L,39624L,39625L,39626L,39627L,39628L,39629L,39630L,\n39631L,39632L,39633L,39634L,39635L,39636L,39637L,39638L,39639L,39640L,\n39641L,39642L,39643L,39644L,39645L,39646L,39647L,39648L,39649L,39650L,\n39651L,39652L,39653L,39654L,39655L,39656L,39657L,39658L,39659L,39660L,\n39661L,39662L,39663L,39664L,39665L,39666L,39667L,39668L,39669L,39670L,\n39671L,39672L,39673L,39674L,39675L,39676L,39677L,39678L,39679L,39680L,\n39681L,39682L,39683L,39684L,39685L,39686L,39687L,39688L,39689L,39690L,\n39691L,39692L,39693L,39694L,39695L,39696L,39697L,39698L,39699L,39700L,\n39701L,39702L,39703L,39704L,39705L,39706L,39707L,39708L,39709L,39710L,\n39711L,39712L,39713L,39714L,39715L,39716L,39717L,39718L,39719L,39720L,\n39721L,39722L,39723L,39724L,39725L,39726L,39727L,39728L,39729L,39730L,\n39731L,39732L,39733L,39734L,39735L,39736L,39737L,39738L,39739L,39740L,\n39741L,39742L,39743L,39744L,39745L,39746L,39747L,39748L,39749L,39750L,\n39751L,39752L,39753L,39754L,39755L,39756L,39757L,39758L,39759L,39760L,\n39761L,39762L,39763L,39764L,39765L,39766L,39767L,39768L,39769L,39770L,\n39771L,39772L,39773L,39774L,39775L,39776L,39777L,39778L,39779L,39780L,\n39781L,39782L,39783L,39784L,39785L,39786L,39787L,39788L,39789L,39790L,\n39791L,39792L,39793L,39794L,39795L,39796L,39797L,39798L,39799L,39800L,\n39801L,39802L,39803L,39804L,39805L,39806L,39807L,39808L,39809L,39810L,\n39811L,39812L,39813L,39814L,39815L,39816L,39817L,39818L,39819L,39820L,\n39821L,39822L,39823L,39824L,39825L,39826L,39827L,39828L,39829L,39830L,\n39831L,39832L,39833L,39834L,39835L,39836L,39837L,39838L,39839L,39840L,\n39841L,39842L,39843L,39844L,39845L,39846L,39847L,39848L,39849L,39850L,\n39851L,39852L,39853L,39854L,39855L,39856L,39857L,39858L,39859L,39860L,\n39861L,39862L,39863L,39864L,39865L,39866L,39867L,39868L,39869L,39870L,\n39871L,39872L,39873L,39874L,39875L,39876L,39877L,39878L,39879L,39880L,\n39881L,39882L,39883L,39884L,39885L,39886L,39887L,39888L,39889L,39890L,\n39891L,39892L,39893L,39894L,39895L,39896L,39897L,39898L,39899L,39900L,\n39901L,39902L,39903L,39904L,39905L,39906L,39907L,39908L,39909L,39910L,\n39911L,39912L,39913L,39914L,39915L,39916L,39917L,39918L,39919L,39920L,\n39921L,39922L,39923L,39924L,39925L,39926L,39927L,39928L,39929L,39930L,\n39931L,39932L,39933L,39934L,39935L,39936L,39937L,39938L,39939L,39940L,\n39941L,39942L,39943L,39944L,39945L,39946L,39947L,39948L,39949L,39950L,\n39951L,39952L,39953L,39954L,39955L,39956L,39957L,39958L,39959L,39960L,\n39961L,39962L,39963L,39964L,39965L,39966L,39967L,39968L,39969L,39970L,\n39971L,39972L,39973L,39974L,39975L,39976L,39977L,39978L,39979L,39980L,\n39981L,39982L,39983L,39984L,39985L,39986L,39987L,39988L,39989L,39990L,\n39991L,39992L,39993L,39994L,39995L,39996L,39997L,39998L,39999L,40000L,\n40001L,40002L,40003L,40004L,40005L,40006L,40007L,40008L,40009L,40010L,\n40011L,40012L,40013L,40014L,40015L,40016L,40017L,40018L,40019L,40020L,\n40021L,40022L,40023L,40024L,40025L,40026L,40027L,40028L,40029L,40030L,\n40031L,40032L,40033L,40034L,40035L,40036L,40037L,40038L,40039L,40040L,\n40041L,40042L,40043L,40044L,40045L,40046L,40047L,40048L,40049L,40050L,\n40051L,40052L,40053L,40054L,40055L,40056L,40057L,40058L,40059L,40060L,\n40061L,40062L,40063L,40064L,40065L,40066L,40067L,40068L,40069L,40070L,\n40071L,40072L,40073L,40074L,40075L,40076L,40077L,40078L,40079L,40080L,\n40081L,40082L,40083L,40084L,40085L,40086L,40087L,40088L,40089L,40090L,\n40091L,40092L,40093L,40094L,40095L,40096L,40097L,40098L,40099L,40100L,\n40101L,40102L,40103L,40104L,40105L,40106L,40107L,40108L,40109L,40110L,\n40111L,40112L,40113L,40114L,40115L,40116L,40117L,40118L,40119L,40120L,\n40121L,40122L,40123L,40124L,40125L,40126L,40127L,40128L,40129L,40130L,\n40131L,40132L,40133L,40134L,40135L,40136L,40137L,40138L,40139L,40140L,\n40141L,40142L,40143L,40144L,40145L,40146L,40147L,40148L,40149L,40150L,\n40151L,40152L,40153L,40154L,40155L,40156L,40157L,40158L,40159L,40160L,\n40161L,40162L,40163L,40164L,40165L,40166L,40167L,40168L,40169L,40170L,\n40171L,40172L,40173L,40174L,40175L,40176L,40177L,40178L,40179L,40180L,\n40181L,40182L,40183L,40184L,40185L,40186L,40187L,40188L,40189L,40190L,\n40191L,40192L,40193L,40194L,40195L,40196L,40197L,40198L,40199L,40200L,\n40201L,40202L,40203L,40204L,40205L,40206L,40207L,40208L,40209L,40210L,\n40211L,40212L,40213L,40214L,40215L,40216L,40217L,40218L,40219L,40220L,\n40221L,40222L,40223L,40224L,40225L,40226L,40227L,40228L,40229L,40230L,\n40231L,40232L,40233L,40234L,40235L,40236L,40237L,40238L,40239L,40240L,\n40241L,40242L,40243L,40244L,40245L,40246L,40247L,40248L,40249L,40250L,\n40251L,40252L,40253L,40254L,40255L,40256L,40257L,40258L,40259L,40260L,\n40261L,40262L,40263L,40264L,40265L,40266L,40267L,40268L,40269L,40270L,\n40271L,40272L,40273L,40274L,40275L,40276L,40277L,40278L,40279L,40280L,\n40281L,40282L,40283L,40284L,40285L,40286L,40287L,40288L,40289L,40290L,\n40291L,40292L,40293L,40294L,40295L,40296L,40297L,40298L,40299L,40300L,\n40301L,40302L,40303L,40304L,40305L,40306L,40307L,40308L,40309L,40310L,\n40311L,40312L,40313L,40314L,40315L,40316L,40317L,40318L,40319L,40320L,\n40321L,40322L,40323L,40324L,40325L,40326L,40327L,40328L,40329L,40330L,\n40331L,40332L,40333L,40334L,40335L,40336L,40337L,40338L,40339L,40340L,\n40341L,40342L,40343L,40344L,40345L,40346L,40347L,40348L,40349L,40350L,\n40351L,40352L,40353L,40354L,40355L,40356L,40357L,40358L,40359L,40360L,\n40361L,40362L,40363L,40364L,40365L,40366L,40367L,40368L,40369L,40370L,\n40371L,40372L,40373L,40374L,40375L,40376L,40377L,40378L,40379L,40380L,\n40381L,40382L,40383L,40384L,40385L,40386L,40387L,40388L,40389L,40390L,\n40391L,40392L,40393L,40394L,40395L,40396L,40397L,40398L,40399L,40400L,\n40401L,40402L,40403L,40404L,40405L,40406L,40407L,40408L,40409L,40410L,\n40411L,40412L,40413L,40414L,40415L,40416L,40417L,40418L,40419L,40420L,\n40421L,40422L,40423L,40424L,40425L,40426L,40427L,40428L,40429L,40430L,\n40431L,40432L,40433L,40434L,40435L,40436L,40437L,40438L,40439L,40440L,\n40441L,40442L,40443L,40444L,40445L,40446L,40447L,40448L,40449L,40450L,\n40451L,40452L,40453L,40454L,40455L,40456L,40457L,40458L,40459L,40460L,\n40461L,40462L,40463L,40464L,40465L,40466L,40467L,40468L,40469L,40470L,\n40471L,40472L,40473L,40474L,40475L,40476L,40477L,40478L,40479L,40480L,\n40481L,40482L,40483L,40484L,40485L,40486L,40487L,40488L,40489L,40490L,\n40491L,40492L,40493L,40494L,40495L,40496L,40497L,40498L,40499L,40500L,\n40501L,40502L,40503L,40504L,40505L,40506L,40507L,40508L,40509L,40510L,\n40511L,40512L,40513L,40514L,40515L,40516L,40517L,40518L,40519L,40520L,\n40521L,40522L,40523L,40524L,40525L,40526L,40527L,40528L,40529L,40530L,\n40531L,40532L,40533L,40534L,40535L,40536L,40537L,40538L,40539L,40540L,\n40541L,40542L,40543L,40544L,40545L,40546L,40547L,40548L,40549L,40550L,\n40551L,40552L,40553L,40554L,40555L,40556L,40557L,40558L,40559L,40560L,\n40561L,40562L,40563L,40564L,40565L,40566L,40567L,40568L,40569L,40570L,\n40571L,40572L,40573L,40574L,40575L,40576L,40577L,40578L,40579L,40580L,\n40581L,40582L,40583L,40584L,40585L,40586L,40587L,40588L,40589L,40590L,\n40591L,40592L,40593L,40594L,40595L,40596L,40597L,40598L,40599L,40600L,\n40601L,40602L,40603L,40604L,40605L,40606L,40607L,40608L,40609L,40610L,\n40611L,40612L,40613L,40614L,40615L,40616L,40617L,40618L,40619L,40620L,\n40621L,40622L,40623L,40624L,40625L,40626L,40627L,40628L,40629L,40630L,\n40631L,40632L,40633L,40634L,40635L,40636L,40637L,40638L,40639L,40640L,\n40641L,40642L,40643L,40644L,40645L,40646L,40647L,40648L,40649L,40650L,\n40651L,40652L,40653L,40654L,40655L,40656L,40657L,40658L,40659L,40660L,\n40661L,40662L,40663L,40664L,40665L,40666L,40667L,40668L,40669L,40670L,\n40671L,40672L,40673L,40674L,40675L,40676L,40677L,40678L,40679L,40680L,\n40681L,40682L,40683L,40684L,40685L,40686L,40687L,40688L,40689L,40690L,\n40691L,40692L,40693L,40694L,40695L,40696L,40697L,40698L,40699L,40700L,\n40701L,40702L,40703L,40704L,40705L,40706L,40707L,40708L,40709L,40710L,\n40711L,40712L,40713L,40714L,40715L,40716L,40717L,40718L,40719L,40720L,\n40721L,40722L,40723L,40724L,40725L,40726L,40727L,40728L,40729L,40730L,\n40731L,40732L,40733L,40734L,40735L,40736L,40737L,40738L,40739L,40740L,\n40741L,40742L,40743L,40744L,40745L,40746L,40747L,40748L,40749L,40750L,\n40751L,40752L,40753L,40754L,40755L,40756L,40757L,40758L,40759L,40760L,\n40761L,40762L,40763L,40764L,40765L,40766L,40767L,40768L,40769L,40770L,\n40771L,40772L,40773L,40774L,40775L,40776L,40777L,40778L,40779L,40780L,\n40781L,40782L,40783L,40784L,40785L,40786L,40787L,40788L,40789L,40790L,\n40791L,40792L,40793L,40794L,40795L,40796L,40797L,40798L,40799L,40800L,\n40801L,40802L,40803L,40804L,40805L,40806L,40807L,40808L,40809L,40810L,\n40811L,40812L,40813L,40814L,40815L,40816L,40817L,40818L,40819L,40820L,\n40821L,40822L,40823L,40824L,40825L,40826L,40827L,40828L,40829L,40830L,\n40831L,40832L,40833L,40834L,40835L,40836L,40837L,40838L,40839L,40840L,\n40841L,40842L,40843L,40844L,40845L,40846L,40847L,40848L,40849L,40850L,\n40851L,40852L,40853L,40854L,40855L,40856L,40857L,40858L,40859L,40860L,\n40861L,40862L,40863L,40864L,40865L,40866L,40867L,40868L,40869L,40870L,\n40871L,40872L,40873L,40874L,40875L,40876L,40877L,40878L,40879L,40880L,\n40881L,40882L,40883L,40884L,40885L,40886L,40887L,40888L,40889L,40890L,\n40891L,40892L,40893L,40894L,40895L,40896L,40897L,40898L,40899L,40900L,\n40901L,40902L,40903L,40904L,40905L,40906L,40907L,40908L,40909L,40910L,\n40911L,40912L,40913L,40914L,40915L,40916L,40917L,40918L,40919L,40920L,\n40921L,40922L,40923L,40924L,40925L,40926L,40927L,40928L,40929L,40930L,\n40931L,40932L,40933L,40934L,40935L,40936L,40937L,40938L,40939L,40940L,\n40941L,40942L,40943L,40944L,40945L,40946L,40947L,40948L,40949L,40950L,\n40951L,40952L,40953L,40954L,40955L,40956L,40957L,40958L,40959L,40960L,\n40961L,40962L,40963L,40964L,40965L,40966L,40967L,40968L,40969L,40970L,\n40971L,40972L,40973L,40974L,40975L,40976L,40977L,40978L,40979L,40980L,\n40981L,40982L,40983L,40984L,40985L,40986L,40987L,40988L,40989L,40990L,\n40991L,40992L,40993L,40994L,40995L,40996L,40997L,40998L,40999L,41000L,\n41001L,41002L,41003L,41004L,41005L,41006L,41007L,41008L,41009L,41010L,\n41011L,41012L,41013L,41014L,41015L,41016L,41017L,41018L,41019L,41020L,\n41021L,41022L,41023L,41024L,41025L,41026L,41027L,41028L,41029L,41030L,\n41031L,41032L,41033L,41034L,41035L,41036L,41037L,41038L,41039L,41040L,\n41041L,41042L,41043L,41044L,41045L,41046L,41047L,41048L,41049L,41050L,\n41051L,41052L,41053L,41054L,41055L,41056L,41057L,41058L,41059L,41060L,\n41061L,41062L,41063L,41064L,41065L,41066L,41067L,41068L,41069L,41070L,\n41071L,41072L,41073L,41074L,41075L,41076L,41077L,41078L,41079L,41080L,\n41081L,41082L,41083L,41084L,41085L,41086L,41087L,41088L,41089L,41090L,\n41091L,41092L,41093L,41094L,41095L,41096L,41097L,41098L,41099L,41100L,\n41101L,41102L,41103L,41104L,41105L,41106L,41107L,41108L,41109L,41110L,\n41111L,41112L,41113L,41114L,41115L,41116L,41117L,41118L,41119L,41120L,\n41121L,41122L,41123L,41124L,41125L,41126L,41127L,41128L,41129L,41130L,\n41131L,41132L,41133L,41134L,41135L,41136L,41137L,41138L,41139L,41140L,\n41141L,41142L,41143L,41144L,41145L,41146L,41147L,41148L,41149L,41150L,\n41151L,41152L,41153L,41154L,41155L,41156L,41157L,41158L,41159L,41160L,\n41161L,41162L,41163L,41164L,41165L,41166L,41167L,41168L,41169L,41170L,\n41171L,41172L,41173L,41174L,41175L,41176L,41177L,41178L,41179L,41180L,\n41181L,41182L,41183L,41184L,41185L,41186L,41187L,41188L,41189L,41190L,\n41191L,41192L,41193L,41194L,41195L,41196L,41197L,41198L,41199L,41200L,\n41201L,41202L,41203L,41204L,41205L,41206L,41207L,41208L,41209L,41210L,\n41211L,41212L,41213L,41214L,41215L,41216L,41217L,41218L,41219L,41220L,\n41221L,41222L,41223L,41224L,41225L,41226L,41227L,41228L,41229L,41230L,\n41231L,41232L,41233L,41234L,41235L,41236L,41237L,41238L,41239L,41240L,\n41241L,41242L,41243L,41244L,41245L,41246L,41247L,41248L,41249L,41250L,\n41251L,41252L,41253L,41254L,41255L,41256L,41257L,41258L,41259L,41260L,\n41261L,41262L,41263L,41264L,41265L,41266L,41267L,41268L,41269L,41270L,\n41271L,41272L,41273L,41274L,41275L,41276L,41277L,41278L,41279L,41280L,\n41281L,41282L,41283L,41284L,41285L,41286L,41287L,41288L,41289L,41290L,\n41291L,41292L,41293L,41294L,41295L,41296L,41297L,41298L,41299L,41300L,\n41301L,41302L,41303L,41304L,41305L,41306L,41307L,41308L,41309L,41310L,\n41311L,41312L,41313L,41314L,41315L,41316L,41317L,41318L,41319L,41320L,\n41321L,41322L,41323L,41324L,41325L,41326L,41327L,41328L,41329L,41330L,\n41331L,41332L,41333L,41334L,41335L,41336L,41337L,41338L,41339L,41340L,\n41341L,41342L,41343L,41344L,41345L,41346L,41347L,41348L,41349L,41350L,\n41351L,41352L,41353L,41354L,41355L,41356L,41357L,41358L,41359L,41360L,\n41361L,41362L,41363L,41364L,41365L,41366L,41367L,41368L,41369L,41370L,\n41371L,41372L,41373L,41374L,41375L,41376L,41377L,41378L,41379L,41380L,\n41381L,41382L,41383L,41384L,41385L,41386L,41387L,41388L,41389L,41390L,\n41391L,41392L,41393L,41394L,41395L,41396L,41397L,41398L,41399L,41400L,\n41401L,41402L,41403L,41404L,41405L,41406L,41407L,41408L,41409L,41410L,\n41411L,41412L,41413L,41414L,41415L,41416L,41417L,41418L,41419L,41420L,\n41421L,41422L,41423L,41424L,41425L,41426L,41427L,41428L,41429L,41430L,\n41431L,41432L,41433L,41434L,41435L,41436L,41437L,41438L,41439L,41440L,\n41441L,41442L,41443L,41444L,41445L,41446L,41447L,41448L,41449L,41450L,\n41451L,41452L,41453L,41454L,41455L,41456L,41457L,41458L,41459L,41460L,\n41461L,41462L,41463L,41464L,41465L,41466L,41467L,41468L,41469L,41470L,\n41471L,41472L,41473L,41474L,41475L,41476L,41477L,41478L,41479L,41480L,\n41481L,41482L,41483L,41484L,41485L,41486L,41487L,41488L,41489L,41490L,\n41491L,41492L,41493L,41494L,41495L,41496L,41497L,41498L,41499L,41500L,\n41501L,41502L,41503L,41504L,41505L,41506L,41507L,41508L,41509L,41510L,\n41511L,41512L,41513L,41514L,41515L,41516L,41517L,41518L,41519L,41520L,\n41521L,41522L,41523L,41524L,41525L,41526L,41527L,41528L,41529L,41530L,\n41531L,41532L,41533L,41534L,41535L,41536L,41537L,41538L,41539L,41540L,\n41541L,41542L,41543L,41544L,41545L,41546L,41547L,41548L,41549L,41550L,\n41551L,41552L,41553L,41554L,41555L,41556L,41557L,41558L,41559L,41560L,\n41561L,41562L,41563L,41564L,41565L,41566L,41567L,41568L,41569L,41570L,\n41571L,41572L,41573L,41574L,41575L,41576L,41577L,41578L,41579L,41580L,\n41581L,41582L,41583L,41584L,41585L,41586L,41587L,41588L,41589L,41590L,\n41591L,41592L,41593L,41594L,41595L,41596L,41597L,41598L,41599L,41600L,\n41601L,41602L,41603L,41604L,41605L,41606L,41607L,41608L,41609L,41610L,\n41611L,41612L,41613L,41614L,41615L,41616L,41617L,41618L,41619L,41620L,\n41621L,41622L,41623L,41624L,41625L,41626L,41627L,41628L,41629L,41630L,\n41631L,41632L,41633L,41634L,41635L,41636L,41637L,41638L,41639L,41640L,\n41641L,41642L,41643L,41644L,41645L,41646L,41647L,41648L,41649L,41650L,\n41651L,41652L,41653L,41654L,41655L,41656L,41657L,41658L,41659L,41660L,\n41661L,41662L,41663L,41664L,41665L,41666L,41667L,41668L,41669L,41670L,\n41671L,41672L,41673L,41674L,41675L,41676L,41677L,41678L,41679L,41680L,\n41681L,41682L,41683L,41684L,41685L,41686L,41687L,41688L,41689L,41690L,\n41691L,41692L,41693L,41694L,41695L,41696L,41697L,41698L,41699L,41700L,\n41701L,41702L,41703L,41704L,41705L,41706L,41707L,41708L,41709L,41710L,\n41711L,41712L,41713L,41714L,41715L,41716L,41717L,41718L,41719L,41720L,\n41721L,41722L,41723L,41724L,41725L,41726L,41727L,41728L,41729L,41730L,\n41731L,41732L,41733L,41734L,41735L,41736L,41737L,41738L,41739L,41740L,\n41741L,41742L,41743L,41744L,41745L,41746L,41747L,41748L,41749L,41750L,\n41751L,41752L,41753L,41754L,41755L,41756L,41757L,41758L,41759L,41760L,\n41761L,41762L,41763L,41764L,41765L,41766L,41767L,41768L,41769L,41770L,\n41771L,41772L,41773L,41774L,41775L,41776L,41777L,41778L,41779L,41780L,\n41781L,41782L,41783L,41784L,41785L,41786L,41787L,41788L,41789L,41790L,\n41791L,41792L,41793L,41794L,41795L,41796L,41797L,41798L,41799L,41800L,\n41801L,41802L,41803L,41804L,41805L,41806L,41807L,41808L,41809L,41810L,\n41811L,41812L,41813L,41814L,41815L,41816L,41817L,41818L,41819L,41820L,\n41821L,41822L,41823L,41824L,41825L,41826L,41827L,41828L,41829L,41830L,\n41831L,41832L,41833L,41834L,41835L,41836L,41837L,41838L,41839L,41840L,\n41841L,41842L,41843L,41844L,41845L,41846L,41847L,41848L,41849L,41850L,\n41851L,41852L,41853L,41854L,41855L,41856L,41857L,41858L,41859L,41860L,\n41861L,41862L,41863L,41864L,41865L,41866L,41867L,41868L,41869L,41870L,\n41871L,41872L,41873L,41874L,41875L,41876L,41877L,41878L,41879L,41880L,\n41881L,41882L,41883L,41884L,41885L,41886L,41887L,41888L,41889L,41890L,\n41891L,41892L,41893L,41894L,41895L,41896L,41897L,41898L,41899L,41900L,\n41901L,41902L,41903L,41904L,41905L,41906L,41907L,41908L,41909L,41910L,\n41911L,41912L,41913L,41914L,41915L,41916L,41917L,41918L,41919L,41920L,\n41921L,41922L,41923L,41924L,41925L,41926L,41927L,41928L,41929L,41930L,\n41931L,41932L,41933L,41934L,41935L,41936L,41937L,41938L,41939L,41940L,\n41941L,41942L,41943L,41944L,41945L,41946L,41947L,41948L,41949L,41950L,\n41951L,41952L,41953L,41954L,41955L,41956L,41957L,41958L,41959L,41960L,\n41961L,41962L,41963L,41964L,41965L,41966L,41967L,41968L,41969L,41970L,\n41971L,41972L,41973L,41974L,41975L,41976L,41977L,41978L,41979L,41980L,\n41981L,41982L,41983L,41984L,41985L,41986L,41987L,41988L,41989L,41990L,\n41991L,41992L,41993L,41994L,41995L,41996L,41997L,41998L,41999L,42000L,\n42001L,42002L,42003L,42004L,42005L,42006L,42007L,42008L,42009L,42010L,\n42011L,42012L,42013L,42014L,42015L,42016L,42017L,42018L,42019L,42020L,\n42021L,42022L,42023L,42024L,42025L,42026L,42027L,42028L,42029L,42030L,\n42031L,42032L,42033L,42034L,42035L,42036L,42037L,42038L,42039L,42040L,\n42041L,42042L,42043L,42044L,42045L,42046L,42047L,42048L,42049L,42050L,\n42051L,42052L,42053L,42054L,42055L,42056L,42057L,42058L,42059L,42060L,\n42061L,42062L,42063L,42064L,42065L,42066L,42067L,42068L,42069L,42070L,\n42071L,42072L,42073L,42074L,42075L,42076L,42077L,42078L,42079L,42080L,\n42081L,42082L,42083L,42084L,42085L,42086L,42087L,42088L,42089L,42090L,\n42091L,42092L,42093L,42094L,42095L,42096L,42097L,42098L,42099L,42100L,\n42101L,42102L,42103L,42104L,42105L,42106L,42107L,42108L,42109L,42110L,\n42111L,42112L,42113L,42114L,42115L,42116L,42117L,42118L,42119L,42120L,\n42121L,42122L,42123L,42124L,42125L,42126L,42127L,42128L,42129L,42130L,\n42131L,42132L,42133L,42134L,42135L,42136L,42137L,42138L,42139L,42140L,\n42141L,42142L,42143L,42144L,42145L,42146L,42147L,42148L,42149L,42150L,\n42151L,42152L,42153L,42154L,42155L,42156L,42157L,42158L,42159L,42160L,\n42161L,42162L,42163L,42164L,42165L,42166L,42167L,42168L,42169L,42170L,\n42171L,42172L,42173L,42174L,42175L,42176L,42177L,42178L,42179L,42180L,\n42181L,42182L,42183L,42184L,42185L,42186L,42187L,42188L,42189L,42190L,\n42191L,42192L,42193L,42194L,42195L,42196L,42197L,42198L,42199L,42200L,\n42201L,42202L,42203L,42204L,42205L,42206L,42207L,42208L,42209L,42210L,\n42211L,42212L,42213L,42214L,42215L,42216L,42217L,42218L,42219L,42220L,\n42221L,42222L,42223L,42224L,42225L,42226L,42227L,42228L,42229L,42230L,\n42231L,42232L,42233L,42234L,42235L,42236L,42237L,42238L,42239L,42240L,\n42241L,42242L,42243L,42244L,42245L,42246L,42247L,42248L,42249L,42250L,\n42251L,42252L,42253L,42254L,42255L,42256L,42257L,42258L,42259L,42260L,\n42261L,42262L,42263L,42264L,42265L,42266L,42267L,42268L,42269L,42270L,\n42271L,42272L,42273L,42274L,42275L,42276L,42277L,42278L,42279L,42280L,\n42281L,42282L,42283L,42284L,42285L,42286L,42287L,42288L,42289L,42290L,\n42291L,42292L,42293L,42294L,42295L,42296L,42297L,42298L,42299L,42300L,\n42301L,42302L,42303L,42304L,42305L,42306L,42307L,42308L,42309L,42310L,\n42311L,42312L,42313L,42314L,42315L,42316L,42317L,42318L,42319L,42320L,\n42321L,42322L,42323L,42324L,42325L,42326L,42327L,42328L,42329L,42330L,\n42331L,42332L,42333L,42334L,42335L,42336L,42337L,42338L,42339L,42340L,\n42341L,42342L,42343L,42344L,42345L,42346L,42347L,42348L,42349L,42350L,\n42351L,42352L,42353L,42354L,42355L,42356L,42357L,42358L,42359L,42360L,\n42361L,42362L,42363L,42364L,42365L,42366L,42367L,42368L,42369L,42370L,\n42371L,42372L,42373L,42374L,42375L,42376L,42377L,42378L,42379L,42380L,\n42381L,42382L,42383L,42384L,42385L,42386L,42387L,42388L,42389L,42390L,\n42391L,42392L,42393L,42394L,42395L,42396L,42397L,42398L,42399L,42400L,\n42401L,42402L,42403L,42404L,42405L,42406L,42407L,42408L,42409L,42410L,\n42411L,42412L,42413L,42414L,42415L,42416L,42417L,42418L,42419L,42420L,\n42421L,42422L,42423L,42424L,42425L,42426L,42427L,42428L,42429L,42430L,\n42431L,42432L,42433L,42434L,42435L,42436L,42437L,42438L,42439L,42440L,\n42441L,42442L,42443L,42444L,42445L,42446L,42447L,42448L,42449L,42450L,\n42451L,42452L,42453L,42454L,42455L,42456L,42457L,42458L,42459L,42460L,\n42461L,42462L,42463L,42464L,42465L,42466L,42467L,42468L,42469L,42470L,\n42471L,42472L,42473L,42474L,42475L,42476L,42477L,42478L,42479L,42480L,\n42481L,42482L,42483L,42484L,42485L,42486L,42487L,42488L,42489L,42490L,\n42491L,42492L,42493L,42494L,42495L,42496L,42497L,42498L,42499L,42500L,\n42501L,42502L,42503L,42504L,42505L,42506L,42507L,42508L,42509L,42510L,\n42511L,42512L,42513L,42514L,42515L,42516L,42517L,42518L,42519L,42520L,\n42521L,42522L,42523L,42524L,42525L,42526L,42527L,42528L,42529L,42530L,\n42531L,42532L,42533L,42534L,42535L,42536L,42537L,42538L,42539L,42540L,\n42541L,42542L,42543L,42544L,42545L,42546L,42547L,42548L,42549L,42550L,\n42551L,42552L,42553L,42554L,42555L,42556L,42557L,42558L,42559L,42560L,\n42560L,42562L,42562L,42564L,42564L,42566L,42566L,42568L,42568L,42570L,\n42570L,42572L,42572L,42574L,42574L,42576L,42576L,42578L,42578L,42580L,\n42580L,42582L,42582L,42584L,42584L,42586L,42586L,42588L,42588L,42590L,\n42590L,42592L,42592L,42594L,42594L,42596L,42596L,42598L,42598L,42600L,\n42600L,42602L,42602L,42604L,42604L,42606L,42607L,42608L,42609L,42610L,\n42611L,42612L,42613L,42614L,42615L,42616L,42617L,42618L,42619L,42620L,\n42621L,42622L,42623L,42624L,42624L,42626L,42626L,42628L,42628L,42630L,\n42630L,42632L,42632L,42634L,42634L,42636L,42636L,42638L,42638L,42640L,\n42640L,42642L,42642L,42644L,42644L,42646L,42646L,42648L,42648L,42650L,\n42650L,42652L,42653L,42654L,42655L,42656L,42657L,42658L,42659L,42660L,\n42661L,42662L,42663L,42664L,42665L,42666L,42667L,42668L,42669L,42670L,\n42671L,42672L,42673L,42674L,42675L,42676L,42677L,42678L,42679L,42680L,\n42681L,42682L,42683L,42684L,42685L,42686L,42687L,42688L,42689L,42690L,\n42691L,42692L,42693L,42694L,42695L,42696L,42697L,42698L,42699L,42700L,\n42701L,42702L,42703L,42704L,42705L,42706L,42707L,42708L,42709L,42710L,\n42711L,42712L,42713L,42714L,42715L,42716L,42717L,42718L,42719L,42720L,\n42721L,42722L,42723L,42724L,42725L,42726L,42727L,42728L,42729L,42730L,\n42731L,42732L,42733L,42734L,42735L,42736L,42737L,42738L,42739L,42740L,\n42741L,42742L,42743L,42744L,42745L,42746L,42747L,42748L,42749L,42750L,\n42751L,42752L,42753L,42754L,42755L,42756L,42757L,42758L,42759L,42760L,\n42761L,42762L,42763L,42764L,42765L,42766L,42767L,42768L,42769L,42770L,\n42771L,42772L,42773L,42774L,42775L,42776L,42777L,42778L,42779L,42780L,\n42781L,42782L,42783L,42784L,42785L,42786L,42786L,42788L,42788L,42790L,\n42790L,42792L,42792L,42794L,42794L,42796L,42796L,42798L,42798L,42800L,\n42801L,42802L,42802L,42804L,42804L,42806L,42806L,42808L,42808L,42810L,\n42810L,42812L,42812L,42814L,42814L,42816L,42816L,42818L,42818L,42820L,\n42820L,42822L,42822L,42824L,42824L,42826L,42826L,42828L,42828L,42830L,\n42830L,42832L,42832L,42834L,42834L,42836L,42836L,42838L,42838L,42840L,\n42840L,42842L,42842L,42844L,42844L,42846L,42846L,42848L,42848L,42850L,\n42850L,42852L,42852L,42854L,42854L,42856L,42856L,42858L,42858L,42860L,\n42860L,42862L,42862L,42864L,42865L,42866L,42867L,42868L,42869L,42870L,\n42871L,42872L,42873L,42873L,42875L,42875L,42877L,42878L,42878L,42880L,\n42880L,42882L,42882L,42884L,42884L,42886L,42886L,42888L,42889L,42890L,\n42891L,42891L,42893L,42894L,42895L,42896L,42896L,42898L,42898L,42900L,\n42901L,42902L,42902L,42904L,42904L,42906L,42906L,42908L,42908L,42910L,\n42910L,42912L,42912L,42914L,42914L,42916L,42916L,42918L,42918L,42920L,\n42920L,42922L,42923L,42924L,42925L,42926L,42927L,42928L,42929L,42930L,\n42931L,42932L,42932L,42934L,42934L,42936L,42937L,42938L,42939L,42940L,\n42941L,42942L,42943L,42944L,42945L,42946L,42947L,42948L,42949L,42950L,\n42951L,42952L,42953L,42954L,42955L,42956L,42957L,42958L,42959L,42960L,\n42961L,42962L,42963L,42964L,42965L,42966L,42967L,42968L,42969L,42970L,\n42971L,42972L,42973L,42974L,42975L,42976L,42977L,42978L,42979L,42980L,\n42981L,42982L,42983L,42984L,42985L,42986L,42987L,42988L,42989L,42990L,\n42991L,42992L,42993L,42994L,42995L,42996L,42997L,42998L,42999L,43000L,\n43001L,43002L,43003L,43004L,43005L,43006L,43007L,43008L,43009L,43010L,\n43011L,43012L,43013L,43014L,43015L,43016L,43017L,43018L,43019L,43020L,\n43021L,43022L,43023L,43024L,43025L,43026L,43027L,43028L,43029L,43030L,\n43031L,43032L,43033L,43034L,43035L,43036L,43037L,43038L,43039L,43040L,\n43041L,43042L,43043L,43044L,43045L,43046L,43047L,43048L,43049L,43050L,\n43051L,43052L,43053L,43054L,43055L,43056L,43057L,43058L,43059L,43060L,\n43061L,43062L,43063L,43064L,43065L,43066L,43067L,43068L,43069L,43070L,\n43071L,43072L,43073L,43074L,43075L,43076L,43077L,43078L,43079L,43080L,\n43081L,43082L,43083L,43084L,43085L,43086L,43087L,43088L,43089L,43090L,\n43091L,43092L,43093L,43094L,43095L,43096L,43097L,43098L,43099L,43100L,\n43101L,43102L,43103L,43104L,43105L,43106L,43107L,43108L,43109L,43110L,\n43111L,43112L,43113L,43114L,43115L,43116L,43117L,43118L,43119L,43120L,\n43121L,43122L,43123L,43124L,43125L,43126L,43127L,43128L,43129L,43130L,\n43131L,43132L,43133L,43134L,43135L,43136L,43137L,43138L,43139L,43140L,\n43141L,43142L,43143L,43144L,43145L,43146L,43147L,43148L,43149L,43150L,\n43151L,43152L,43153L,43154L,43155L,43156L,43157L,43158L,43159L,43160L,\n43161L,43162L,43163L,43164L,43165L,43166L,43167L,43168L,43169L,43170L,\n43171L,43172L,43173L,43174L,43175L,43176L,43177L,43178L,43179L,43180L,\n43181L,43182L,43183L,43184L,43185L,43186L,43187L,43188L,43189L,43190L,\n43191L,43192L,43193L,43194L,43195L,43196L,43197L,43198L,43199L,43200L,\n43201L,43202L,43203L,43204L,43205L,43206L,43207L,43208L,43209L,43210L,\n43211L,43212L,43213L,43214L,43215L,43216L,43217L,43218L,43219L,43220L,\n43221L,43222L,43223L,43224L,43225L,43226L,43227L,43228L,43229L,43230L,\n43231L,43232L,43233L,43234L,43235L,43236L,43237L,43238L,43239L,43240L,\n43241L,43242L,43243L,43244L,43245L,43246L,43247L,43248L,43249L,43250L,\n43251L,43252L,43253L,43254L,43255L,43256L,43257L,43258L,43259L,43260L,\n43261L,43262L,43263L,43264L,43265L,43266L,43267L,43268L,43269L,43270L,\n43271L,43272L,43273L,43274L,43275L,43276L,43277L,43278L,43279L,43280L,\n43281L,43282L,43283L,43284L,43285L,43286L,43287L,43288L,43289L,43290L,\n43291L,43292L,43293L,43294L,43295L,43296L,43297L,43298L,43299L,43300L,\n43301L,43302L,43303L,43304L,43305L,43306L,43307L,43308L,43309L,43310L,\n43311L,43312L,43313L,43314L,43315L,43316L,43317L,43318L,43319L,43320L,\n43321L,43322L,43323L,43324L,43325L,43326L,43327L,43328L,43329L,43330L,\n43331L,43332L,43333L,43334L,43335L,43336L,43337L,43338L,43339L,43340L,\n43341L,43342L,43343L,43344L,43345L,43346L,43347L,43348L,43349L,43350L,\n43351L,43352L,43353L,43354L,43355L,43356L,43357L,43358L,43359L,43360L,\n43361L,43362L,43363L,43364L,43365L,43366L,43367L,43368L,43369L,43370L,\n43371L,43372L,43373L,43374L,43375L,43376L,43377L,43378L,43379L,43380L,\n43381L,43382L,43383L,43384L,43385L,43386L,43387L,43388L,43389L,43390L,\n43391L,43392L,43393L,43394L,43395L,43396L,43397L,43398L,43399L,43400L,\n43401L,43402L,43403L,43404L,43405L,43406L,43407L,43408L,43409L,43410L,\n43411L,43412L,43413L,43414L,43415L,43416L,43417L,43418L,43419L,43420L,\n43421L,43422L,43423L,43424L,43425L,43426L,43427L,43428L,43429L,43430L,\n43431L,43432L,43433L,43434L,43435L,43436L,43437L,43438L,43439L,43440L,\n43441L,43442L,43443L,43444L,43445L,43446L,43447L,43448L,43449L,43450L,\n43451L,43452L,43453L,43454L,43455L,43456L,43457L,43458L,43459L,43460L,\n43461L,43462L,43463L,43464L,43465L,43466L,43467L,43468L,43469L,43470L,\n43471L,43472L,43473L,43474L,43475L,43476L,43477L,43478L,43479L,43480L,\n43481L,43482L,43483L,43484L,43485L,43486L,43487L,43488L,43489L,43490L,\n43491L,43492L,43493L,43494L,43495L,43496L,43497L,43498L,43499L,43500L,\n43501L,43502L,43503L,43504L,43505L,43506L,43507L,43508L,43509L,43510L,\n43511L,43512L,43513L,43514L,43515L,43516L,43517L,43518L,43519L,43520L,\n43521L,43522L,43523L,43524L,43525L,43526L,43527L,43528L,43529L,43530L,\n43531L,43532L,43533L,43534L,43535L,43536L,43537L,43538L,43539L,43540L,\n43541L,43542L,43543L,43544L,43545L,43546L,43547L,43548L,43549L,43550L,\n43551L,43552L,43553L,43554L,43555L,43556L,43557L,43558L,43559L,43560L,\n43561L,43562L,43563L,43564L,43565L,43566L,43567L,43568L,43569L,43570L,\n43571L,43572L,43573L,43574L,43575L,43576L,43577L,43578L,43579L,43580L,\n43581L,43582L,43583L,43584L,43585L,43586L,43587L,43588L,43589L,43590L,\n43591L,43592L,43593L,43594L,43595L,43596L,43597L,43598L,43599L,43600L,\n43601L,43602L,43603L,43604L,43605L,43606L,43607L,43608L,43609L,43610L,\n43611L,43612L,43613L,43614L,43615L,43616L,43617L,43618L,43619L,43620L,\n43621L,43622L,43623L,43624L,43625L,43626L,43627L,43628L,43629L,43630L,\n43631L,43632L,43633L,43634L,43635L,43636L,43637L,43638L,43639L,43640L,\n43641L,43642L,43643L,43644L,43645L,43646L,43647L,43648L,43649L,43650L,\n43651L,43652L,43653L,43654L,43655L,43656L,43657L,43658L,43659L,43660L,\n43661L,43662L,43663L,43664L,43665L,43666L,43667L,43668L,43669L,43670L,\n43671L,43672L,43673L,43674L,43675L,43676L,43677L,43678L,43679L,43680L,\n43681L,43682L,43683L,43684L,43685L,43686L,43687L,43688L,43689L,43690L,\n43691L,43692L,43693L,43694L,43695L,43696L,43697L,43698L,43699L,43700L,\n43701L,43702L,43703L,43704L,43705L,43706L,43707L,43708L,43709L,43710L,\n43711L,43712L,43713L,43714L,43715L,43716L,43717L,43718L,43719L,43720L,\n43721L,43722L,43723L,43724L,43725L,43726L,43727L,43728L,43729L,43730L,\n43731L,43732L,43733L,43734L,43735L,43736L,43737L,43738L,43739L,43740L,\n43741L,43742L,43743L,43744L,43745L,43746L,43747L,43748L,43749L,43750L,\n43751L,43752L,43753L,43754L,43755L,43756L,43757L,43758L,43759L,43760L,\n43761L,43762L,43763L,43764L,43765L,43766L,43767L,43768L,43769L,43770L,\n43771L,43772L,43773L,43774L,43775L,43776L,43777L,43778L,43779L,43780L,\n43781L,43782L,43783L,43784L,43785L,43786L,43787L,43788L,43789L,43790L,\n43791L,43792L,43793L,43794L,43795L,43796L,43797L,43798L,43799L,43800L,\n43801L,43802L,43803L,43804L,43805L,43806L,43807L,43808L,43809L,43810L,\n43811L,43812L,43813L,43814L,43815L,43816L,43817L,43818L,43819L,43820L,\n43821L,43822L,43823L,43824L,43825L,43826L,43827L,43828L,43829L,43830L,\n43831L,43832L,43833L,43834L,43835L,43836L,43837L,43838L,43839L,43840L,\n43841L,43842L,43843L,43844L,43845L,43846L,43847L,43848L,43849L,43850L,\n43851L,43852L,43853L,43854L,43855L,43856L,43857L,43858L,42931L,43860L,\n43861L,43862L,43863L,43864L,43865L,43866L,43867L,43868L,43869L,43870L,\n43871L,43872L,43873L,43874L,43875L,43876L,43877L,43878L,43879L,43880L,\n43881L,43882L,43883L,43884L,43885L,43886L,43887L,5024,5025,5026,5027,5028,\n5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,\n5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,\n5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,\n5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,\n5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,\n43968L,43969L,43970L,43971L,43972L,43973L,43974L,43975L,43976L,43977L,\n43978L,43979L,43980L,43981L,43982L,43983L,43984L,43985L,43986L,43987L,\n43988L,43989L,43990L,43991L,43992L,43993L,43994L,43995L,43996L,43997L,\n43998L,43999L,44000L,44001L,44002L,44003L,44004L,44005L,44006L,44007L,\n44008L,44009L,44010L,44011L,44012L,44013L,44014L,44015L,44016L,44017L,\n44018L,44019L,44020L,44021L,44022L,44023L,44024L,44025L,44026L,44027L,\n44028L,44029L,44030L,44031L,44032L,44033L,44034L,44035L,44036L,44037L,\n44038L,44039L,44040L,44041L,44042L,44043L,44044L,44045L,44046L,44047L,\n44048L,44049L,44050L,44051L,44052L,44053L,44054L,44055L,44056L,44057L,\n44058L,44059L,44060L,44061L,44062L,44063L,44064L,44065L,44066L,44067L,\n44068L,44069L,44070L,44071L,44072L,44073L,44074L,44075L,44076L,44077L,\n44078L,44079L,44080L,44081L,44082L,44083L,44084L,44085L,44086L,44087L,\n44088L,44089L,44090L,44091L,44092L,44093L,44094L,44095L,44096L,44097L,\n44098L,44099L,44100L,44101L,44102L,44103L,44104L,44105L,44106L,44107L,\n44108L,44109L,44110L,44111L,44112L,44113L,44114L,44115L,44116L,44117L,\n44118L,44119L,44120L,44121L,44122L,44123L,44124L,44125L,44126L,44127L,\n44128L,44129L,44130L,44131L,44132L,44133L,44134L,44135L,44136L,44137L,\n44138L,44139L,44140L,44141L,44142L,44143L,44144L,44145L,44146L,44147L,\n44148L,44149L,44150L,44151L,44152L,44153L,44154L,44155L,44156L,44157L,\n44158L,44159L,44160L,44161L,44162L,44163L,44164L,44165L,44166L,44167L,\n44168L,44169L,44170L,44171L,44172L,44173L,44174L,44175L,44176L,44177L,\n44178L,44179L,44180L,44181L,44182L,44183L,44184L,44185L,44186L,44187L,\n44188L,44189L,44190L,44191L,44192L,44193L,44194L,44195L,44196L,44197L,\n44198L,44199L,44200L,44201L,44202L,44203L,44204L,44205L,44206L,44207L,\n44208L,44209L,44210L,44211L,44212L,44213L,44214L,44215L,44216L,44217L,\n44218L,44219L,44220L,44221L,44222L,44223L,44224L,44225L,44226L,44227L,\n44228L,44229L,44230L,44231L,44232L,44233L,44234L,44235L,44236L,44237L,\n44238L,44239L,44240L,44241L,44242L,44243L,44244L,44245L,44246L,44247L,\n44248L,44249L,44250L,44251L,44252L,44253L,44254L,44255L,44256L,44257L,\n44258L,44259L,44260L,44261L,44262L,44263L,44264L,44265L,44266L,44267L,\n44268L,44269L,44270L,44271L,44272L,44273L,44274L,44275L,44276L,44277L,\n44278L,44279L,44280L,44281L,44282L,44283L,44284L,44285L,44286L,44287L,\n44288L,44289L,44290L,44291L,44292L,44293L,44294L,44295L,44296L,44297L,\n44298L,44299L,44300L,44301L,44302L,44303L,44304L,44305L,44306L,44307L,\n44308L,44309L,44310L,44311L,44312L,44313L,44314L,44315L,44316L,44317L,\n44318L,44319L,44320L,44321L,44322L,44323L,44324L,44325L,44326L,44327L,\n44328L,44329L,44330L,44331L,44332L,44333L,44334L,44335L,44336L,44337L,\n44338L,44339L,44340L,44341L,44342L,44343L,44344L,44345L,44346L,44347L,\n44348L,44349L,44350L,44351L,44352L,44353L,44354L,44355L,44356L,44357L,\n44358L,44359L,44360L,44361L,44362L,44363L,44364L,44365L,44366L,44367L,\n44368L,44369L,44370L,44371L,44372L,44373L,44374L,44375L,44376L,44377L,\n44378L,44379L,44380L,44381L,44382L,44383L,44384L,44385L,44386L,44387L,\n44388L,44389L,44390L,44391L,44392L,44393L,44394L,44395L,44396L,44397L,\n44398L,44399L,44400L,44401L,44402L,44403L,44404L,44405L,44406L,44407L,\n44408L,44409L,44410L,44411L,44412L,44413L,44414L,44415L,44416L,44417L,\n44418L,44419L,44420L,44421L,44422L,44423L,44424L,44425L,44426L,44427L,\n44428L,44429L,44430L,44431L,44432L,44433L,44434L,44435L,44436L,44437L,\n44438L,44439L,44440L,44441L,44442L,44443L,44444L,44445L,44446L,44447L,\n44448L,44449L,44450L,44451L,44452L,44453L,44454L,44455L,44456L,44457L,\n44458L,44459L,44460L,44461L,44462L,44463L,44464L,44465L,44466L,44467L,\n44468L,44469L,44470L,44471L,44472L,44473L,44474L,44475L,44476L,44477L,\n44478L,44479L,44480L,44481L,44482L,44483L,44484L,44485L,44486L,44487L,\n44488L,44489L,44490L,44491L,44492L,44493L,44494L,44495L,44496L,44497L,\n44498L,44499L,44500L,44501L,44502L,44503L,44504L,44505L,44506L,44507L,\n44508L,44509L,44510L,44511L,44512L,44513L,44514L,44515L,44516L,44517L,\n44518L,44519L,44520L,44521L,44522L,44523L,44524L,44525L,44526L,44527L,\n44528L,44529L,44530L,44531L,44532L,44533L,44534L,44535L,44536L,44537L,\n44538L,44539L,44540L,44541L,44542L,44543L,44544L,44545L,44546L,44547L,\n44548L,44549L,44550L,44551L,44552L,44553L,44554L,44555L,44556L,44557L,\n44558L,44559L,44560L,44561L,44562L,44563L,44564L,44565L,44566L,44567L,\n44568L,44569L,44570L,44571L,44572L,44573L,44574L,44575L,44576L,44577L,\n44578L,44579L,44580L,44581L,44582L,44583L,44584L,44585L,44586L,44587L,\n44588L,44589L,44590L,44591L,44592L,44593L,44594L,44595L,44596L,44597L,\n44598L,44599L,44600L,44601L,44602L,44603L,44604L,44605L,44606L,44607L,\n44608L,44609L,44610L,44611L,44612L,44613L,44614L,44615L,44616L,44617L,\n44618L,44619L,44620L,44621L,44622L,44623L,44624L,44625L,44626L,44627L,\n44628L,44629L,44630L,44631L,44632L,44633L,44634L,44635L,44636L,44637L,\n44638L,44639L,44640L,44641L,44642L,44643L,44644L,44645L,44646L,44647L,\n44648L,44649L,44650L,44651L,44652L,44653L,44654L,44655L,44656L,44657L,\n44658L,44659L,44660L,44661L,44662L,44663L,44664L,44665L,44666L,44667L,\n44668L,44669L,44670L,44671L,44672L,44673L,44674L,44675L,44676L,44677L,\n44678L,44679L,44680L,44681L,44682L,44683L,44684L,44685L,44686L,44687L,\n44688L,44689L,44690L,44691L,44692L,44693L,44694L,44695L,44696L,44697L,\n44698L,44699L,44700L,44701L,44702L,44703L,44704L,44705L,44706L,44707L,\n44708L,44709L,44710L,44711L,44712L,44713L,44714L,44715L,44716L,44717L,\n44718L,44719L,44720L,44721L,44722L,44723L,44724L,44725L,44726L,44727L,\n44728L,44729L,44730L,44731L,44732L,44733L,44734L,44735L,44736L,44737L,\n44738L,44739L,44740L,44741L,44742L,44743L,44744L,44745L,44746L,44747L,\n44748L,44749L,44750L,44751L,44752L,44753L,44754L,44755L,44756L,44757L,\n44758L,44759L,44760L,44761L,44762L,44763L,44764L,44765L,44766L,44767L,\n44768L,44769L,44770L,44771L,44772L,44773L,44774L,44775L,44776L,44777L,\n44778L,44779L,44780L,44781L,44782L,44783L,44784L,44785L,44786L,44787L,\n44788L,44789L,44790L,44791L,44792L,44793L,44794L,44795L,44796L,44797L,\n44798L,44799L,44800L,44801L,44802L,44803L,44804L,44805L,44806L,44807L,\n44808L,44809L,44810L,44811L,44812L,44813L,44814L,44815L,44816L,44817L,\n44818L,44819L,44820L,44821L,44822L,44823L,44824L,44825L,44826L,44827L,\n44828L,44829L,44830L,44831L,44832L,44833L,44834L,44835L,44836L,44837L,\n44838L,44839L,44840L,44841L,44842L,44843L,44844L,44845L,44846L,44847L,\n44848L,44849L,44850L,44851L,44852L,44853L,44854L,44855L,44856L,44857L,\n44858L,44859L,44860L,44861L,44862L,44863L,44864L,44865L,44866L,44867L,\n44868L,44869L,44870L,44871L,44872L,44873L,44874L,44875L,44876L,44877L,\n44878L,44879L,44880L,44881L,44882L,44883L,44884L,44885L,44886L,44887L,\n44888L,44889L,44890L,44891L,44892L,44893L,44894L,44895L,44896L,44897L,\n44898L,44899L,44900L,44901L,44902L,44903L,44904L,44905L,44906L,44907L,\n44908L,44909L,44910L,44911L,44912L,44913L,44914L,44915L,44916L,44917L,\n44918L,44919L,44920L,44921L,44922L,44923L,44924L,44925L,44926L,44927L,\n44928L,44929L,44930L,44931L,44932L,44933L,44934L,44935L,44936L,44937L,\n44938L,44939L,44940L,44941L,44942L,44943L,44944L,44945L,44946L,44947L,\n44948L,44949L,44950L,44951L,44952L,44953L,44954L,44955L,44956L,44957L,\n44958L,44959L,44960L,44961L,44962L,44963L,44964L,44965L,44966L,44967L,\n44968L,44969L,44970L,44971L,44972L,44973L,44974L,44975L,44976L,44977L,\n44978L,44979L,44980L,44981L,44982L,44983L,44984L,44985L,44986L,44987L,\n44988L,44989L,44990L,44991L,44992L,44993L,44994L,44995L,44996L,44997L,\n44998L,44999L,45000L,45001L,45002L,45003L,45004L,45005L,45006L,45007L,\n45008L,45009L,45010L,45011L,45012L,45013L,45014L,45015L,45016L,45017L,\n45018L,45019L,45020L,45021L,45022L,45023L,45024L,45025L,45026L,45027L,\n45028L,45029L,45030L,45031L,45032L,45033L,45034L,45035L,45036L,45037L,\n45038L,45039L,45040L,45041L,45042L,45043L,45044L,45045L,45046L,45047L,\n45048L,45049L,45050L,45051L,45052L,45053L,45054L,45055L,45056L,45057L,\n45058L,45059L,45060L,45061L,45062L,45063L,45064L,45065L,45066L,45067L,\n45068L,45069L,45070L,45071L,45072L,45073L,45074L,45075L,45076L,45077L,\n45078L,45079L,45080L,45081L,45082L,45083L,45084L,45085L,45086L,45087L,\n45088L,45089L,45090L,45091L,45092L,45093L,45094L,45095L,45096L,45097L,\n45098L,45099L,45100L,45101L,45102L,45103L,45104L,45105L,45106L,45107L,\n45108L,45109L,45110L,45111L,45112L,45113L,45114L,45115L,45116L,45117L,\n45118L,45119L,45120L,45121L,45122L,45123L,45124L,45125L,45126L,45127L,\n45128L,45129L,45130L,45131L,45132L,45133L,45134L,45135L,45136L,45137L,\n45138L,45139L,45140L,45141L,45142L,45143L,45144L,45145L,45146L,45147L,\n45148L,45149L,45150L,45151L,45152L,45153L,45154L,45155L,45156L,45157L,\n45158L,45159L,45160L,45161L,45162L,45163L,45164L,45165L,45166L,45167L,\n45168L,45169L,45170L,45171L,45172L,45173L,45174L,45175L,45176L,45177L,\n45178L,45179L,45180L,45181L,45182L,45183L,45184L,45185L,45186L,45187L,\n45188L,45189L,45190L,45191L,45192L,45193L,45194L,45195L,45196L,45197L,\n45198L,45199L,45200L,45201L,45202L,45203L,45204L,45205L,45206L,45207L,\n45208L,45209L,45210L,45211L,45212L,45213L,45214L,45215L,45216L,45217L,\n45218L,45219L,45220L,45221L,45222L,45223L,45224L,45225L,45226L,45227L,\n45228L,45229L,45230L,45231L,45232L,45233L,45234L,45235L,45236L,45237L,\n45238L,45239L,45240L,45241L,45242L,45243L,45244L,45245L,45246L,45247L,\n45248L,45249L,45250L,45251L,45252L,45253L,45254L,45255L,45256L,45257L,\n45258L,45259L,45260L,45261L,45262L,45263L,45264L,45265L,45266L,45267L,\n45268L,45269L,45270L,45271L,45272L,45273L,45274L,45275L,45276L,45277L,\n45278L,45279L,45280L,45281L,45282L,45283L,45284L,45285L,45286L,45287L,\n45288L,45289L,45290L,45291L,45292L,45293L,45294L,45295L,45296L,45297L,\n45298L,45299L,45300L,45301L,45302L,45303L,45304L,45305L,45306L,45307L,\n45308L,45309L,45310L,45311L,45312L,45313L,45314L,45315L,45316L,45317L,\n45318L,45319L,45320L,45321L,45322L,45323L,45324L,45325L,45326L,45327L,\n45328L,45329L,45330L,45331L,45332L,45333L,45334L,45335L,45336L,45337L,\n45338L,45339L,45340L,45341L,45342L,45343L,45344L,45345L,45346L,45347L,\n45348L,45349L,45350L,45351L,45352L,45353L,45354L,45355L,45356L,45357L,\n45358L,45359L,45360L,45361L,45362L,45363L,45364L,45365L,45366L,45367L,\n45368L,45369L,45370L,45371L,45372L,45373L,45374L,45375L,45376L,45377L,\n45378L,45379L,45380L,45381L,45382L,45383L,45384L,45385L,45386L,45387L,\n45388L,45389L,45390L,45391L,45392L,45393L,45394L,45395L,45396L,45397L,\n45398L,45399L,45400L,45401L,45402L,45403L,45404L,45405L,45406L,45407L,\n45408L,45409L,45410L,45411L,45412L,45413L,45414L,45415L,45416L,45417L,\n45418L,45419L,45420L,45421L,45422L,45423L,45424L,45425L,45426L,45427L,\n45428L,45429L,45430L,45431L,45432L,45433L,45434L,45435L,45436L,45437L,\n45438L,45439L,45440L,45441L,45442L,45443L,45444L,45445L,45446L,45447L,\n45448L,45449L,45450L,45451L,45452L,45453L,45454L,45455L,45456L,45457L,\n45458L,45459L,45460L,45461L,45462L,45463L,45464L,45465L,45466L,45467L,\n45468L,45469L,45470L,45471L,45472L,45473L,45474L,45475L,45476L,45477L,\n45478L,45479L,45480L,45481L,45482L,45483L,45484L,45485L,45486L,45487L,\n45488L,45489L,45490L,45491L,45492L,45493L,45494L,45495L,45496L,45497L,\n45498L,45499L,45500L,45501L,45502L,45503L,45504L,45505L,45506L,45507L,\n45508L,45509L,45510L,45511L,45512L,45513L,45514L,45515L,45516L,45517L,\n45518L,45519L,45520L,45521L,45522L,45523L,45524L,45525L,45526L,45527L,\n45528L,45529L,45530L,45531L,45532L,45533L,45534L,45535L,45536L,45537L,\n45538L,45539L,45540L,45541L,45542L,45543L,45544L,45545L,45546L,45547L,\n45548L,45549L,45550L,45551L,45552L,45553L,45554L,45555L,45556L,45557L,\n45558L,45559L,45560L,45561L,45562L,45563L,45564L,45565L,45566L,45567L,\n45568L,45569L,45570L,45571L,45572L,45573L,45574L,45575L,45576L,45577L,\n45578L,45579L,45580L,45581L,45582L,45583L,45584L,45585L,45586L,45587L,\n45588L,45589L,45590L,45591L,45592L,45593L,45594L,45595L,45596L,45597L,\n45598L,45599L,45600L,45601L,45602L,45603L,45604L,45605L,45606L,45607L,\n45608L,45609L,45610L,45611L,45612L,45613L,45614L,45615L,45616L,45617L,\n45618L,45619L,45620L,45621L,45622L,45623L,45624L,45625L,45626L,45627L,\n45628L,45629L,45630L,45631L,45632L,45633L,45634L,45635L,45636L,45637L,\n45638L,45639L,45640L,45641L,45642L,45643L,45644L,45645L,45646L,45647L,\n45648L,45649L,45650L,45651L,45652L,45653L,45654L,45655L,45656L,45657L,\n45658L,45659L,45660L,45661L,45662L,45663L,45664L,45665L,45666L,45667L,\n45668L,45669L,45670L,45671L,45672L,45673L,45674L,45675L,45676L,45677L,\n45678L,45679L,45680L,45681L,45682L,45683L,45684L,45685L,45686L,45687L,\n45688L,45689L,45690L,45691L,45692L,45693L,45694L,45695L,45696L,45697L,\n45698L,45699L,45700L,45701L,45702L,45703L,45704L,45705L,45706L,45707L,\n45708L,45709L,45710L,45711L,45712L,45713L,45714L,45715L,45716L,45717L,\n45718L,45719L,45720L,45721L,45722L,45723L,45724L,45725L,45726L,45727L,\n45728L,45729L,45730L,45731L,45732L,45733L,45734L,45735L,45736L,45737L,\n45738L,45739L,45740L,45741L,45742L,45743L,45744L,45745L,45746L,45747L,\n45748L,45749L,45750L,45751L,45752L,45753L,45754L,45755L,45756L,45757L,\n45758L,45759L,45760L,45761L,45762L,45763L,45764L,45765L,45766L,45767L,\n45768L,45769L,45770L,45771L,45772L,45773L,45774L,45775L,45776L,45777L,\n45778L,45779L,45780L,45781L,45782L,45783L,45784L,45785L,45786L,45787L,\n45788L,45789L,45790L,45791L,45792L,45793L,45794L,45795L,45796L,45797L,\n45798L,45799L,45800L,45801L,45802L,45803L,45804L,45805L,45806L,45807L,\n45808L,45809L,45810L,45811L,45812L,45813L,45814L,45815L,45816L,45817L,\n45818L,45819L,45820L,45821L,45822L,45823L,45824L,45825L,45826L,45827L,\n45828L,45829L,45830L,45831L,45832L,45833L,45834L,45835L,45836L,45837L,\n45838L,45839L,45840L,45841L,45842L,45843L,45844L,45845L,45846L,45847L,\n45848L,45849L,45850L,45851L,45852L,45853L,45854L,45855L,45856L,45857L,\n45858L,45859L,45860L,45861L,45862L,45863L,45864L,45865L,45866L,45867L,\n45868L,45869L,45870L,45871L,45872L,45873L,45874L,45875L,45876L,45877L,\n45878L,45879L,45880L,45881L,45882L,45883L,45884L,45885L,45886L,45887L,\n45888L,45889L,45890L,45891L,45892L,45893L,45894L,45895L,45896L,45897L,\n45898L,45899L,45900L,45901L,45902L,45903L,45904L,45905L,45906L,45907L,\n45908L,45909L,45910L,45911L,45912L,45913L,45914L,45915L,45916L,45917L,\n45918L,45919L,45920L,45921L,45922L,45923L,45924L,45925L,45926L,45927L,\n45928L,45929L,45930L,45931L,45932L,45933L,45934L,45935L,45936L,45937L,\n45938L,45939L,45940L,45941L,45942L,45943L,45944L,45945L,45946L,45947L,\n45948L,45949L,45950L,45951L,45952L,45953L,45954L,45955L,45956L,45957L,\n45958L,45959L,45960L,45961L,45962L,45963L,45964L,45965L,45966L,45967L,\n45968L,45969L,45970L,45971L,45972L,45973L,45974L,45975L,45976L,45977L,\n45978L,45979L,45980L,45981L,45982L,45983L,45984L,45985L,45986L,45987L,\n45988L,45989L,45990L,45991L,45992L,45993L,45994L,45995L,45996L,45997L,\n45998L,45999L,46000L,46001L,46002L,46003L,46004L,46005L,46006L,46007L,\n46008L,46009L,46010L,46011L,46012L,46013L,46014L,46015L,46016L,46017L,\n46018L,46019L,46020L,46021L,46022L,46023L,46024L,46025L,46026L,46027L,\n46028L,46029L,46030L,46031L,46032L,46033L,46034L,46035L,46036L,46037L,\n46038L,46039L,46040L,46041L,46042L,46043L,46044L,46045L,46046L,46047L,\n46048L,46049L,46050L,46051L,46052L,46053L,46054L,46055L,46056L,46057L,\n46058L,46059L,46060L,46061L,46062L,46063L,46064L,46065L,46066L,46067L,\n46068L,46069L,46070L,46071L,46072L,46073L,46074L,46075L,46076L,46077L,\n46078L,46079L,46080L,46081L,46082L,46083L,46084L,46085L,46086L,46087L,\n46088L,46089L,46090L,46091L,46092L,46093L,46094L,46095L,46096L,46097L,\n46098L,46099L,46100L,46101L,46102L,46103L,46104L,46105L,46106L,46107L,\n46108L,46109L,46110L,46111L,46112L,46113L,46114L,46115L,46116L,46117L,\n46118L,46119L,46120L,46121L,46122L,46123L,46124L,46125L,46126L,46127L,\n46128L,46129L,46130L,46131L,46132L,46133L,46134L,46135L,46136L,46137L,\n46138L,46139L,46140L,46141L,46142L,46143L,46144L,46145L,46146L,46147L,\n46148L,46149L,46150L,46151L,46152L,46153L,46154L,46155L,46156L,46157L,\n46158L,46159L,46160L,46161L,46162L,46163L,46164L,46165L,46166L,46167L,\n46168L,46169L,46170L,46171L,46172L,46173L,46174L,46175L,46176L,46177L,\n46178L,46179L,46180L,46181L,46182L,46183L,46184L,46185L,46186L,46187L,\n46188L,46189L,46190L,46191L,46192L,46193L,46194L,46195L,46196L,46197L,\n46198L,46199L,46200L,46201L,46202L,46203L,46204L,46205L,46206L,46207L,\n46208L,46209L,46210L,46211L,46212L,46213L,46214L,46215L,46216L,46217L,\n46218L,46219L,46220L,46221L,46222L,46223L,46224L,46225L,46226L,46227L,\n46228L,46229L,46230L,46231L,46232L,46233L,46234L,46235L,46236L,46237L,\n46238L,46239L,46240L,46241L,46242L,46243L,46244L,46245L,46246L,46247L,\n46248L,46249L,46250L,46251L,46252L,46253L,46254L,46255L,46256L,46257L,\n46258L,46259L,46260L,46261L,46262L,46263L,46264L,46265L,46266L,46267L,\n46268L,46269L,46270L,46271L,46272L,46273L,46274L,46275L,46276L,46277L,\n46278L,46279L,46280L,46281L,46282L,46283L,46284L,46285L,46286L,46287L,\n46288L,46289L,46290L,46291L,46292L,46293L,46294L,46295L,46296L,46297L,\n46298L,46299L,46300L,46301L,46302L,46303L,46304L,46305L,46306L,46307L,\n46308L,46309L,46310L,46311L,46312L,46313L,46314L,46315L,46316L,46317L,\n46318L,46319L,46320L,46321L,46322L,46323L,46324L,46325L,46326L,46327L,\n46328L,46329L,46330L,46331L,46332L,46333L,46334L,46335L,46336L,46337L,\n46338L,46339L,46340L,46341L,46342L,46343L,46344L,46345L,46346L,46347L,\n46348L,46349L,46350L,46351L,46352L,46353L,46354L,46355L,46356L,46357L,\n46358L,46359L,46360L,46361L,46362L,46363L,46364L,46365L,46366L,46367L,\n46368L,46369L,46370L,46371L,46372L,46373L,46374L,46375L,46376L,46377L,\n46378L,46379L,46380L,46381L,46382L,46383L,46384L,46385L,46386L,46387L,\n46388L,46389L,46390L,46391L,46392L,46393L,46394L,46395L,46396L,46397L,\n46398L,46399L,46400L,46401L,46402L,46403L,46404L,46405L,46406L,46407L,\n46408L,46409L,46410L,46411L,46412L,46413L,46414L,46415L,46416L,46417L,\n46418L,46419L,46420L,46421L,46422L,46423L,46424L,46425L,46426L,46427L,\n46428L,46429L,46430L,46431L,46432L,46433L,46434L,46435L,46436L,46437L,\n46438L,46439L,46440L,46441L,46442L,46443L,46444L,46445L,46446L,46447L,\n46448L,46449L,46450L,46451L,46452L,46453L,46454L,46455L,46456L,46457L,\n46458L,46459L,46460L,46461L,46462L,46463L,46464L,46465L,46466L,46467L,\n46468L,46469L,46470L,46471L,46472L,46473L,46474L,46475L,46476L,46477L,\n46478L,46479L,46480L,46481L,46482L,46483L,46484L,46485L,46486L,46487L,\n46488L,46489L,46490L,46491L,46492L,46493L,46494L,46495L,46496L,46497L,\n46498L,46499L,46500L,46501L,46502L,46503L,46504L,46505L,46506L,46507L,\n46508L,46509L,46510L,46511L,46512L,46513L,46514L,46515L,46516L,46517L,\n46518L,46519L,46520L,46521L,46522L,46523L,46524L,46525L,46526L,46527L,\n46528L,46529L,46530L,46531L,46532L,46533L,46534L,46535L,46536L,46537L,\n46538L,46539L,46540L,46541L,46542L,46543L,46544L,46545L,46546L,46547L,\n46548L,46549L,46550L,46551L,46552L,46553L,46554L,46555L,46556L,46557L,\n46558L,46559L,46560L,46561L,46562L,46563L,46564L,46565L,46566L,46567L,\n46568L,46569L,46570L,46571L,46572L,46573L,46574L,46575L,46576L,46577L,\n46578L,46579L,46580L,46581L,46582L,46583L,46584L,46585L,46586L,46587L,\n46588L,46589L,46590L,46591L,46592L,46593L,46594L,46595L,46596L,46597L,\n46598L,46599L,46600L,46601L,46602L,46603L,46604L,46605L,46606L,46607L,\n46608L,46609L,46610L,46611L,46612L,46613L,46614L,46615L,46616L,46617L,\n46618L,46619L,46620L,46621L,46622L,46623L,46624L,46625L,46626L,46627L,\n46628L,46629L,46630L,46631L,46632L,46633L,46634L,46635L,46636L,46637L,\n46638L,46639L,46640L,46641L,46642L,46643L,46644L,46645L,46646L,46647L,\n46648L,46649L,46650L,46651L,46652L,46653L,46654L,46655L,46656L,46657L,\n46658L,46659L,46660L,46661L,46662L,46663L,46664L,46665L,46666L,46667L,\n46668L,46669L,46670L,46671L,46672L,46673L,46674L,46675L,46676L,46677L,\n46678L,46679L,46680L,46681L,46682L,46683L,46684L,46685L,46686L,46687L,\n46688L,46689L,46690L,46691L,46692L,46693L,46694L,46695L,46696L,46697L,\n46698L,46699L,46700L,46701L,46702L,46703L,46704L,46705L,46706L,46707L,\n46708L,46709L,46710L,46711L,46712L,46713L,46714L,46715L,46716L,46717L,\n46718L,46719L,46720L,46721L,46722L,46723L,46724L,46725L,46726L,46727L,\n46728L,46729L,46730L,46731L,46732L,46733L,46734L,46735L,46736L,46737L,\n46738L,46739L,46740L,46741L,46742L,46743L,46744L,46745L,46746L,46747L,\n46748L,46749L,46750L,46751L,46752L,46753L,46754L,46755L,46756L,46757L,\n46758L,46759L,46760L,46761L,46762L,46763L,46764L,46765L,46766L,46767L,\n46768L,46769L,46770L,46771L,46772L,46773L,46774L,46775L,46776L,46777L,\n46778L,46779L,46780L,46781L,46782L,46783L,46784L,46785L,46786L,46787L,\n46788L,46789L,46790L,46791L,46792L,46793L,46794L,46795L,46796L,46797L,\n46798L,46799L,46800L,46801L,46802L,46803L,46804L,46805L,46806L,46807L,\n46808L,46809L,46810L,46811L,46812L,46813L,46814L,46815L,46816L,46817L,\n46818L,46819L,46820L,46821L,46822L,46823L,46824L,46825L,46826L,46827L,\n46828L,46829L,46830L,46831L,46832L,46833L,46834L,46835L,46836L,46837L,\n46838L,46839L,46840L,46841L,46842L,46843L,46844L,46845L,46846L,46847L,\n46848L,46849L,46850L,46851L,46852L,46853L,46854L,46855L,46856L,46857L,\n46858L,46859L,46860L,46861L,46862L,46863L,46864L,46865L,46866L,46867L,\n46868L,46869L,46870L,46871L,46872L,46873L,46874L,46875L,46876L,46877L,\n46878L,46879L,46880L,46881L,46882L,46883L,46884L,46885L,46886L,46887L,\n46888L,46889L,46890L,46891L,46892L,46893L,46894L,46895L,46896L,46897L,\n46898L,46899L,46900L,46901L,46902L,46903L,46904L,46905L,46906L,46907L,\n46908L,46909L,46910L,46911L,46912L,46913L,46914L,46915L,46916L,46917L,\n46918L,46919L,46920L,46921L,46922L,46923L,46924L,46925L,46926L,46927L,\n46928L,46929L,46930L,46931L,46932L,46933L,46934L,46935L,46936L,46937L,\n46938L,46939L,46940L,46941L,46942L,46943L,46944L,46945L,46946L,46947L,\n46948L,46949L,46950L,46951L,46952L,46953L,46954L,46955L,46956L,46957L,\n46958L,46959L,46960L,46961L,46962L,46963L,46964L,46965L,46966L,46967L,\n46968L,46969L,46970L,46971L,46972L,46973L,46974L,46975L,46976L,46977L,\n46978L,46979L,46980L,46981L,46982L,46983L,46984L,46985L,46986L,46987L,\n46988L,46989L,46990L,46991L,46992L,46993L,46994L,46995L,46996L,46997L,\n46998L,46999L,47000L,47001L,47002L,47003L,47004L,47005L,47006L,47007L,\n47008L,47009L,47010L,47011L,47012L,47013L,47014L,47015L,47016L,47017L,\n47018L,47019L,47020L,47021L,47022L,47023L,47024L,47025L,47026L,47027L,\n47028L,47029L,47030L,47031L,47032L,47033L,47034L,47035L,47036L,47037L,\n47038L,47039L,47040L,47041L,47042L,47043L,47044L,47045L,47046L,47047L,\n47048L,47049L,47050L,47051L,47052L,47053L,47054L,47055L,47056L,47057L,\n47058L,47059L,47060L,47061L,47062L,47063L,47064L,47065L,47066L,47067L,\n47068L,47069L,47070L,47071L,47072L,47073L,47074L,47075L,47076L,47077L,\n47078L,47079L,47080L,47081L,47082L,47083L,47084L,47085L,47086L,47087L,\n47088L,47089L,47090L,47091L,47092L,47093L,47094L,47095L,47096L,47097L,\n47098L,47099L,47100L,47101L,47102L,47103L,47104L,47105L,47106L,47107L,\n47108L,47109L,47110L,47111L,47112L,47113L,47114L,47115L,47116L,47117L,\n47118L,47119L,47120L,47121L,47122L,47123L,47124L,47125L,47126L,47127L,\n47128L,47129L,47130L,47131L,47132L,47133L,47134L,47135L,47136L,47137L,\n47138L,47139L,47140L,47141L,47142L,47143L,47144L,47145L,47146L,47147L,\n47148L,47149L,47150L,47151L,47152L,47153L,47154L,47155L,47156L,47157L,\n47158L,47159L,47160L,47161L,47162L,47163L,47164L,47165L,47166L,47167L,\n47168L,47169L,47170L,47171L,47172L,47173L,47174L,47175L,47176L,47177L,\n47178L,47179L,47180L,47181L,47182L,47183L,47184L,47185L,47186L,47187L,\n47188L,47189L,47190L,47191L,47192L,47193L,47194L,47195L,47196L,47197L,\n47198L,47199L,47200L,47201L,47202L,47203L,47204L,47205L,47206L,47207L,\n47208L,47209L,47210L,47211L,47212L,47213L,47214L,47215L,47216L,47217L,\n47218L,47219L,47220L,47221L,47222L,47223L,47224L,47225L,47226L,47227L,\n47228L,47229L,47230L,47231L,47232L,47233L,47234L,47235L,47236L,47237L,\n47238L,47239L,47240L,47241L,47242L,47243L,47244L,47245L,47246L,47247L,\n47248L,47249L,47250L,47251L,47252L,47253L,47254L,47255L,47256L,47257L,\n47258L,47259L,47260L,47261L,47262L,47263L,47264L,47265L,47266L,47267L,\n47268L,47269L,47270L,47271L,47272L,47273L,47274L,47275L,47276L,47277L,\n47278L,47279L,47280L,47281L,47282L,47283L,47284L,47285L,47286L,47287L,\n47288L,47289L,47290L,47291L,47292L,47293L,47294L,47295L,47296L,47297L,\n47298L,47299L,47300L,47301L,47302L,47303L,47304L,47305L,47306L,47307L,\n47308L,47309L,47310L,47311L,47312L,47313L,47314L,47315L,47316L,47317L,\n47318L,47319L,47320L,47321L,47322L,47323L,47324L,47325L,47326L,47327L,\n47328L,47329L,47330L,47331L,47332L,47333L,47334L,47335L,47336L,47337L,\n47338L,47339L,47340L,47341L,47342L,47343L,47344L,47345L,47346L,47347L,\n47348L,47349L,47350L,47351L,47352L,47353L,47354L,47355L,47356L,47357L,\n47358L,47359L,47360L,47361L,47362L,47363L,47364L,47365L,47366L,47367L,\n47368L,47369L,47370L,47371L,47372L,47373L,47374L,47375L,47376L,47377L,\n47378L,47379L,47380L,47381L,47382L,47383L,47384L,47385L,47386L,47387L,\n47388L,47389L,47390L,47391L,47392L,47393L,47394L,47395L,47396L,47397L,\n47398L,47399L,47400L,47401L,47402L,47403L,47404L,47405L,47406L,47407L,\n47408L,47409L,47410L,47411L,47412L,47413L,47414L,47415L,47416L,47417L,\n47418L,47419L,47420L,47421L,47422L,47423L,47424L,47425L,47426L,47427L,\n47428L,47429L,47430L,47431L,47432L,47433L,47434L,47435L,47436L,47437L,\n47438L,47439L,47440L,47441L,47442L,47443L,47444L,47445L,47446L,47447L,\n47448L,47449L,47450L,47451L,47452L,47453L,47454L,47455L,47456L,47457L,\n47458L,47459L,47460L,47461L,47462L,47463L,47464L,47465L,47466L,47467L,\n47468L,47469L,47470L,47471L,47472L,47473L,47474L,47475L,47476L,47477L,\n47478L,47479L,47480L,47481L,47482L,47483L,47484L,47485L,47486L,47487L,\n47488L,47489L,47490L,47491L,47492L,47493L,47494L,47495L,47496L,47497L,\n47498L,47499L,47500L,47501L,47502L,47503L,47504L,47505L,47506L,47507L,\n47508L,47509L,47510L,47511L,47512L,47513L,47514L,47515L,47516L,47517L,\n47518L,47519L,47520L,47521L,47522L,47523L,47524L,47525L,47526L,47527L,\n47528L,47529L,47530L,47531L,47532L,47533L,47534L,47535L,47536L,47537L,\n47538L,47539L,47540L,47541L,47542L,47543L,47544L,47545L,47546L,47547L,\n47548L,47549L,47550L,47551L,47552L,47553L,47554L,47555L,47556L,47557L,\n47558L,47559L,47560L,47561L,47562L,47563L,47564L,47565L,47566L,47567L,\n47568L,47569L,47570L,47571L,47572L,47573L,47574L,47575L,47576L,47577L,\n47578L,47579L,47580L,47581L,47582L,47583L,47584L,47585L,47586L,47587L,\n47588L,47589L,47590L,47591L,47592L,47593L,47594L,47595L,47596L,47597L,\n47598L,47599L,47600L,47601L,47602L,47603L,47604L,47605L,47606L,47607L,\n47608L,47609L,47610L,47611L,47612L,47613L,47614L,47615L,47616L,47617L,\n47618L,47619L,47620L,47621L,47622L,47623L,47624L,47625L,47626L,47627L,\n47628L,47629L,47630L,47631L,47632L,47633L,47634L,47635L,47636L,47637L,\n47638L,47639L,47640L,47641L,47642L,47643L,47644L,47645L,47646L,47647L,\n47648L,47649L,47650L,47651L,47652L,47653L,47654L,47655L,47656L,47657L,\n47658L,47659L,47660L,47661L,47662L,47663L,47664L,47665L,47666L,47667L,\n47668L,47669L,47670L,47671L,47672L,47673L,47674L,47675L,47676L,47677L,\n47678L,47679L,47680L,47681L,47682L,47683L,47684L,47685L,47686L,47687L,\n47688L,47689L,47690L,47691L,47692L,47693L,47694L,47695L,47696L,47697L,\n47698L,47699L,47700L,47701L,47702L,47703L,47704L,47705L,47706L,47707L,\n47708L,47709L,47710L,47711L,47712L,47713L,47714L,47715L,47716L,47717L,\n47718L,47719L,47720L,47721L,47722L,47723L,47724L,47725L,47726L,47727L,\n47728L,47729L,47730L,47731L,47732L,47733L,47734L,47735L,47736L,47737L,\n47738L,47739L,47740L,47741L,47742L,47743L,47744L,47745L,47746L,47747L,\n47748L,47749L,47750L,47751L,47752L,47753L,47754L,47755L,47756L,47757L,\n47758L,47759L,47760L,47761L,47762L,47763L,47764L,47765L,47766L,47767L,\n47768L,47769L,47770L,47771L,47772L,47773L,47774L,47775L,47776L,47777L,\n47778L,47779L,47780L,47781L,47782L,47783L,47784L,47785L,47786L,47787L,\n47788L,47789L,47790L,47791L,47792L,47793L,47794L,47795L,47796L,47797L,\n47798L,47799L,47800L,47801L,47802L,47803L,47804L,47805L,47806L,47807L,\n47808L,47809L,47810L,47811L,47812L,47813L,47814L,47815L,47816L,47817L,\n47818L,47819L,47820L,47821L,47822L,47823L,47824L,47825L,47826L,47827L,\n47828L,47829L,47830L,47831L,47832L,47833L,47834L,47835L,47836L,47837L,\n47838L,47839L,47840L,47841L,47842L,47843L,47844L,47845L,47846L,47847L,\n47848L,47849L,47850L,47851L,47852L,47853L,47854L,47855L,47856L,47857L,\n47858L,47859L,47860L,47861L,47862L,47863L,47864L,47865L,47866L,47867L,\n47868L,47869L,47870L,47871L,47872L,47873L,47874L,47875L,47876L,47877L,\n47878L,47879L,47880L,47881L,47882L,47883L,47884L,47885L,47886L,47887L,\n47888L,47889L,47890L,47891L,47892L,47893L,47894L,47895L,47896L,47897L,\n47898L,47899L,47900L,47901L,47902L,47903L,47904L,47905L,47906L,47907L,\n47908L,47909L,47910L,47911L,47912L,47913L,47914L,47915L,47916L,47917L,\n47918L,47919L,47920L,47921L,47922L,47923L,47924L,47925L,47926L,47927L,\n47928L,47929L,47930L,47931L,47932L,47933L,47934L,47935L,47936L,47937L,\n47938L,47939L,47940L,47941L,47942L,47943L,47944L,47945L,47946L,47947L,\n47948L,47949L,47950L,47951L,47952L,47953L,47954L,47955L,47956L,47957L,\n47958L,47959L,47960L,47961L,47962L,47963L,47964L,47965L,47966L,47967L,\n47968L,47969L,47970L,47971L,47972L,47973L,47974L,47975L,47976L,47977L,\n47978L,47979L,47980L,47981L,47982L,47983L,47984L,47985L,47986L,47987L,\n47988L,47989L,47990L,47991L,47992L,47993L,47994L,47995L,47996L,47997L,\n47998L,47999L,48000L,48001L,48002L,48003L,48004L,48005L,48006L,48007L,\n48008L,48009L,48010L,48011L,48012L,48013L,48014L,48015L,48016L,48017L,\n48018L,48019L,48020L,48021L,48022L,48023L,48024L,48025L,48026L,48027L,\n48028L,48029L,48030L,48031L,48032L,48033L,48034L,48035L,48036L,48037L,\n48038L,48039L,48040L,48041L,48042L,48043L,48044L,48045L,48046L,48047L,\n48048L,48049L,48050L,48051L,48052L,48053L,48054L,48055L,48056L,48057L,\n48058L,48059L,48060L,48061L,48062L,48063L,48064L,48065L,48066L,48067L,\n48068L,48069L,48070L,48071L,48072L,48073L,48074L,48075L,48076L,48077L,\n48078L,48079L,48080L,48081L,48082L,48083L,48084L,48085L,48086L,48087L,\n48088L,48089L,48090L,48091L,48092L,48093L,48094L,48095L,48096L,48097L,\n48098L,48099L,48100L,48101L,48102L,48103L,48104L,48105L,48106L,48107L,\n48108L,48109L,48110L,48111L,48112L,48113L,48114L,48115L,48116L,48117L,\n48118L,48119L,48120L,48121L,48122L,48123L,48124L,48125L,48126L,48127L,\n48128L,48129L,48130L,48131L,48132L,48133L,48134L,48135L,48136L,48137L,\n48138L,48139L,48140L,48141L,48142L,48143L,48144L,48145L,48146L,48147L,\n48148L,48149L,48150L,48151L,48152L,48153L,48154L,48155L,48156L,48157L,\n48158L,48159L,48160L,48161L,48162L,48163L,48164L,48165L,48166L,48167L,\n48168L,48169L,48170L,48171L,48172L,48173L,48174L,48175L,48176L,48177L,\n48178L,48179L,48180L,48181L,48182L,48183L,48184L,48185L,48186L,48187L,\n48188L,48189L,48190L,48191L,48192L,48193L,48194L,48195L,48196L,48197L,\n48198L,48199L,48200L,48201L,48202L,48203L,48204L,48205L,48206L,48207L,\n48208L,48209L,48210L,48211L,48212L,48213L,48214L,48215L,48216L,48217L,\n48218L,48219L,48220L,48221L,48222L,48223L,48224L,48225L,48226L,48227L,\n48228L,48229L,48230L,48231L,48232L,48233L,48234L,48235L,48236L,48237L,\n48238L,48239L,48240L,48241L,48242L,48243L,48244L,48245L,48246L,48247L,\n48248L,48249L,48250L,48251L,48252L,48253L,48254L,48255L,48256L,48257L,\n48258L,48259L,48260L,48261L,48262L,48263L,48264L,48265L,48266L,48267L,\n48268L,48269L,48270L,48271L,48272L,48273L,48274L,48275L,48276L,48277L,\n48278L,48279L,48280L,48281L,48282L,48283L,48284L,48285L,48286L,48287L,\n48288L,48289L,48290L,48291L,48292L,48293L,48294L,48295L,48296L,48297L,\n48298L,48299L,48300L,48301L,48302L,48303L,48304L,48305L,48306L,48307L,\n48308L,48309L,48310L,48311L,48312L,48313L,48314L,48315L,48316L,48317L,\n48318L,48319L,48320L,48321L,48322L,48323L,48324L,48325L,48326L,48327L,\n48328L,48329L,48330L,48331L,48332L,48333L,48334L,48335L,48336L,48337L,\n48338L,48339L,48340L,48341L,48342L,48343L,48344L,48345L,48346L,48347L,\n48348L,48349L,48350L,48351L,48352L,48353L,48354L,48355L,48356L,48357L,\n48358L,48359L,48360L,48361L,48362L,48363L,48364L,48365L,48366L,48367L,\n48368L,48369L,48370L,48371L,48372L,48373L,48374L,48375L,48376L,48377L,\n48378L,48379L,48380L,48381L,48382L,48383L,48384L,48385L,48386L,48387L,\n48388L,48389L,48390L,48391L,48392L,48393L,48394L,48395L,48396L,48397L,\n48398L,48399L,48400L,48401L,48402L,48403L,48404L,48405L,48406L,48407L,\n48408L,48409L,48410L,48411L,48412L,48413L,48414L,48415L,48416L,48417L,\n48418L,48419L,48420L,48421L,48422L,48423L,48424L,48425L,48426L,48427L,\n48428L,48429L,48430L,48431L,48432L,48433L,48434L,48435L,48436L,48437L,\n48438L,48439L,48440L,48441L,48442L,48443L,48444L,48445L,48446L,48447L,\n48448L,48449L,48450L,48451L,48452L,48453L,48454L,48455L,48456L,48457L,\n48458L,48459L,48460L,48461L,48462L,48463L,48464L,48465L,48466L,48467L,\n48468L,48469L,48470L,48471L,48472L,48473L,48474L,48475L,48476L,48477L,\n48478L,48479L,48480L,48481L,48482L,48483L,48484L,48485L,48486L,48487L,\n48488L,48489L,48490L,48491L,48492L,48493L,48494L,48495L,48496L,48497L,\n48498L,48499L,48500L,48501L,48502L,48503L,48504L,48505L,48506L,48507L,\n48508L,48509L,48510L,48511L,48512L,48513L,48514L,48515L,48516L,48517L,\n48518L,48519L,48520L,48521L,48522L,48523L,48524L,48525L,48526L,48527L,\n48528L,48529L,48530L,48531L,48532L,48533L,48534L,48535L,48536L,48537L,\n48538L,48539L,48540L,48541L,48542L,48543L,48544L,48545L,48546L,48547L,\n48548L,48549L,48550L,48551L,48552L,48553L,48554L,48555L,48556L,48557L,\n48558L,48559L,48560L,48561L,48562L,48563L,48564L,48565L,48566L,48567L,\n48568L,48569L,48570L,48571L,48572L,48573L,48574L,48575L,48576L,48577L,\n48578L,48579L,48580L,48581L,48582L,48583L,48584L,48585L,48586L,48587L,\n48588L,48589L,48590L,48591L,48592L,48593L,48594L,48595L,48596L,48597L,\n48598L,48599L,48600L,48601L,48602L,48603L,48604L,48605L,48606L,48607L,\n48608L,48609L,48610L,48611L,48612L,48613L,48614L,48615L,48616L,48617L,\n48618L,48619L,48620L,48621L,48622L,48623L,48624L,48625L,48626L,48627L,\n48628L,48629L,48630L,48631L,48632L,48633L,48634L,48635L,48636L,48637L,\n48638L,48639L,48640L,48641L,48642L,48643L,48644L,48645L,48646L,48647L,\n48648L,48649L,48650L,48651L,48652L,48653L,48654L,48655L,48656L,48657L,\n48658L,48659L,48660L,48661L,48662L,48663L,48664L,48665L,48666L,48667L,\n48668L,48669L,48670L,48671L,48672L,48673L,48674L,48675L,48676L,48677L,\n48678L,48679L,48680L,48681L,48682L,48683L,48684L,48685L,48686L,48687L,\n48688L,48689L,48690L,48691L,48692L,48693L,48694L,48695L,48696L,48697L,\n48698L,48699L,48700L,48701L,48702L,48703L,48704L,48705L,48706L,48707L,\n48708L,48709L,48710L,48711L,48712L,48713L,48714L,48715L,48716L,48717L,\n48718L,48719L,48720L,48721L,48722L,48723L,48724L,48725L,48726L,48727L,\n48728L,48729L,48730L,48731L,48732L,48733L,48734L,48735L,48736L,48737L,\n48738L,48739L,48740L,48741L,48742L,48743L,48744L,48745L,48746L,48747L,\n48748L,48749L,48750L,48751L,48752L,48753L,48754L,48755L,48756L,48757L,\n48758L,48759L,48760L,48761L,48762L,48763L,48764L,48765L,48766L,48767L,\n48768L,48769L,48770L,48771L,48772L,48773L,48774L,48775L,48776L,48777L,\n48778L,48779L,48780L,48781L,48782L,48783L,48784L,48785L,48786L,48787L,\n48788L,48789L,48790L,48791L,48792L,48793L,48794L,48795L,48796L,48797L,\n48798L,48799L,48800L,48801L,48802L,48803L,48804L,48805L,48806L,48807L,\n48808L,48809L,48810L,48811L,48812L,48813L,48814L,48815L,48816L,48817L,\n48818L,48819L,48820L,48821L,48822L,48823L,48824L,48825L,48826L,48827L,\n48828L,48829L,48830L,48831L,48832L,48833L,48834L,48835L,48836L,48837L,\n48838L,48839L,48840L,48841L,48842L,48843L,48844L,48845L,48846L,48847L,\n48848L,48849L,48850L,48851L,48852L,48853L,48854L,48855L,48856L,48857L,\n48858L,48859L,48860L,48861L,48862L,48863L,48864L,48865L,48866L,48867L,\n48868L,48869L,48870L,48871L,48872L,48873L,48874L,48875L,48876L,48877L,\n48878L,48879L,48880L,48881L,48882L,48883L,48884L,48885L,48886L,48887L,\n48888L,48889L,48890L,48891L,48892L,48893L,48894L,48895L,48896L,48897L,\n48898L,48899L,48900L,48901L,48902L,48903L,48904L,48905L,48906L,48907L,\n48908L,48909L,48910L,48911L,48912L,48913L,48914L,48915L,48916L,48917L,\n48918L,48919L,48920L,48921L,48922L,48923L,48924L,48925L,48926L,48927L,\n48928L,48929L,48930L,48931L,48932L,48933L,48934L,48935L,48936L,48937L,\n48938L,48939L,48940L,48941L,48942L,48943L,48944L,48945L,48946L,48947L,\n48948L,48949L,48950L,48951L,48952L,48953L,48954L,48955L,48956L,48957L,\n48958L,48959L,48960L,48961L,48962L,48963L,48964L,48965L,48966L,48967L,\n48968L,48969L,48970L,48971L,48972L,48973L,48974L,48975L,48976L,48977L,\n48978L,48979L,48980L,48981L,48982L,48983L,48984L,48985L,48986L,48987L,\n48988L,48989L,48990L,48991L,48992L,48993L,48994L,48995L,48996L,48997L,\n48998L,48999L,49000L,49001L,49002L,49003L,49004L,49005L,49006L,49007L,\n49008L,49009L,49010L,49011L,49012L,49013L,49014L,49015L,49016L,49017L,\n49018L,49019L,49020L,49021L,49022L,49023L,49024L,49025L,49026L,49027L,\n49028L,49029L,49030L,49031L,49032L,49033L,49034L,49035L,49036L,49037L,\n49038L,49039L,49040L,49041L,49042L,49043L,49044L,49045L,49046L,49047L,\n49048L,49049L,49050L,49051L,49052L,49053L,49054L,49055L,49056L,49057L,\n49058L,49059L,49060L,49061L,49062L,49063L,49064L,49065L,49066L,49067L,\n49068L,49069L,49070L,49071L,49072L,49073L,49074L,49075L,49076L,49077L,\n49078L,49079L,49080L,49081L,49082L,49083L,49084L,49085L,49086L,49087L,\n49088L,49089L,49090L,49091L,49092L,49093L,49094L,49095L,49096L,49097L,\n49098L,49099L,49100L,49101L,49102L,49103L,49104L,49105L,49106L,49107L,\n49108L,49109L,49110L,49111L,49112L,49113L,49114L,49115L,49116L,49117L,\n49118L,49119L,49120L,49121L,49122L,49123L,49124L,49125L,49126L,49127L,\n49128L,49129L,49130L,49131L,49132L,49133L,49134L,49135L,49136L,49137L,\n49138L,49139L,49140L,49141L,49142L,49143L,49144L,49145L,49146L,49147L,\n49148L,49149L,49150L,49151L,49152L,49153L,49154L,49155L,49156L,49157L,\n49158L,49159L,49160L,49161L,49162L,49163L,49164L,49165L,49166L,49167L,\n49168L,49169L,49170L,49171L,49172L,49173L,49174L,49175L,49176L,49177L,\n49178L,49179L,49180L,49181L,49182L,49183L,49184L,49185L,49186L,49187L,\n49188L,49189L,49190L,49191L,49192L,49193L,49194L,49195L,49196L,49197L,\n49198L,49199L,49200L,49201L,49202L,49203L,49204L,49205L,49206L,49207L,\n49208L,49209L,49210L,49211L,49212L,49213L,49214L,49215L,49216L,49217L,\n49218L,49219L,49220L,49221L,49222L,49223L,49224L,49225L,49226L,49227L,\n49228L,49229L,49230L,49231L,49232L,49233L,49234L,49235L,49236L,49237L,\n49238L,49239L,49240L,49241L,49242L,49243L,49244L,49245L,49246L,49247L,\n49248L,49249L,49250L,49251L,49252L,49253L,49254L,49255L,49256L,49257L,\n49258L,49259L,49260L,49261L,49262L,49263L,49264L,49265L,49266L,49267L,\n49268L,49269L,49270L,49271L,49272L,49273L,49274L,49275L,49276L,49277L,\n49278L,49279L,49280L,49281L,49282L,49283L,49284L,49285L,49286L,49287L,\n49288L,49289L,49290L,49291L,49292L,49293L,49294L,49295L,49296L,49297L,\n49298L,49299L,49300L,49301L,49302L,49303L,49304L,49305L,49306L,49307L,\n49308L,49309L,49310L,49311L,49312L,49313L,49314L,49315L,49316L,49317L,\n49318L,49319L,49320L,49321L,49322L,49323L,49324L,49325L,49326L,49327L,\n49328L,49329L,49330L,49331L,49332L,49333L,49334L,49335L,49336L,49337L,\n49338L,49339L,49340L,49341L,49342L,49343L,49344L,49345L,49346L,49347L,\n49348L,49349L,49350L,49351L,49352L,49353L,49354L,49355L,49356L,49357L,\n49358L,49359L,49360L,49361L,49362L,49363L,49364L,49365L,49366L,49367L,\n49368L,49369L,49370L,49371L,49372L,49373L,49374L,49375L,49376L,49377L,\n49378L,49379L,49380L,49381L,49382L,49383L,49384L,49385L,49386L,49387L,\n49388L,49389L,49390L,49391L,49392L,49393L,49394L,49395L,49396L,49397L,\n49398L,49399L,49400L,49401L,49402L,49403L,49404L,49405L,49406L,49407L,\n49408L,49409L,49410L,49411L,49412L,49413L,49414L,49415L,49416L,49417L,\n49418L,49419L,49420L,49421L,49422L,49423L,49424L,49425L,49426L,49427L,\n49428L,49429L,49430L,49431L,49432L,49433L,49434L,49435L,49436L,49437L,\n49438L,49439L,49440L,49441L,49442L,49443L,49444L,49445L,49446L,49447L,\n49448L,49449L,49450L,49451L,49452L,49453L,49454L,49455L,49456L,49457L,\n49458L,49459L,49460L,49461L,49462L,49463L,49464L,49465L,49466L,49467L,\n49468L,49469L,49470L,49471L,49472L,49473L,49474L,49475L,49476L,49477L,\n49478L,49479L,49480L,49481L,49482L,49483L,49484L,49485L,49486L,49487L,\n49488L,49489L,49490L,49491L,49492L,49493L,49494L,49495L,49496L,49497L,\n49498L,49499L,49500L,49501L,49502L,49503L,49504L,49505L,49506L,49507L,\n49508L,49509L,49510L,49511L,49512L,49513L,49514L,49515L,49516L,49517L,\n49518L,49519L,49520L,49521L,49522L,49523L,49524L,49525L,49526L,49527L,\n49528L,49529L,49530L,49531L,49532L,49533L,49534L,49535L,49536L,49537L,\n49538L,49539L,49540L,49541L,49542L,49543L,49544L,49545L,49546L,49547L,\n49548L,49549L,49550L,49551L,49552L,49553L,49554L,49555L,49556L,49557L,\n49558L,49559L,49560L,49561L,49562L,49563L,49564L,49565L,49566L,49567L,\n49568L,49569L,49570L,49571L,49572L,49573L,49574L,49575L,49576L,49577L,\n49578L,49579L,49580L,49581L,49582L,49583L,49584L,49585L,49586L,49587L,\n49588L,49589L,49590L,49591L,49592L,49593L,49594L,49595L,49596L,49597L,\n49598L,49599L,49600L,49601L,49602L,49603L,49604L,49605L,49606L,49607L,\n49608L,49609L,49610L,49611L,49612L,49613L,49614L,49615L,49616L,49617L,\n49618L,49619L,49620L,49621L,49622L,49623L,49624L,49625L,49626L,49627L,\n49628L,49629L,49630L,49631L,49632L,49633L,49634L,49635L,49636L,49637L,\n49638L,49639L,49640L,49641L,49642L,49643L,49644L,49645L,49646L,49647L,\n49648L,49649L,49650L,49651L,49652L,49653L,49654L,49655L,49656L,49657L,\n49658L,49659L,49660L,49661L,49662L,49663L,49664L,49665L,49666L,49667L,\n49668L,49669L,49670L,49671L,49672L,49673L,49674L,49675L,49676L,49677L,\n49678L,49679L,49680L,49681L,49682L,49683L,49684L,49685L,49686L,49687L,\n49688L,49689L,49690L,49691L,49692L,49693L,49694L,49695L,49696L,49697L,\n49698L,49699L,49700L,49701L,49702L,49703L,49704L,49705L,49706L,49707L,\n49708L,49709L,49710L,49711L,49712L,49713L,49714L,49715L,49716L,49717L,\n49718L,49719L,49720L,49721L,49722L,49723L,49724L,49725L,49726L,49727L,\n49728L,49729L,49730L,49731L,49732L,49733L,49734L,49735L,49736L,49737L,\n49738L,49739L,49740L,49741L,49742L,49743L,49744L,49745L,49746L,49747L,\n49748L,49749L,49750L,49751L,49752L,49753L,49754L,49755L,49756L,49757L,\n49758L,49759L,49760L,49761L,49762L,49763L,49764L,49765L,49766L,49767L,\n49768L,49769L,49770L,49771L,49772L,49773L,49774L,49775L,49776L,49777L,\n49778L,49779L,49780L,49781L,49782L,49783L,49784L,49785L,49786L,49787L,\n49788L,49789L,49790L,49791L,49792L,49793L,49794L,49795L,49796L,49797L,\n49798L,49799L,49800L,49801L,49802L,49803L,49804L,49805L,49806L,49807L,\n49808L,49809L,49810L,49811L,49812L,49813L,49814L,49815L,49816L,49817L,\n49818L,49819L,49820L,49821L,49822L,49823L,49824L,49825L,49826L,49827L,\n49828L,49829L,49830L,49831L,49832L,49833L,49834L,49835L,49836L,49837L,\n49838L,49839L,49840L,49841L,49842L,49843L,49844L,49845L,49846L,49847L,\n49848L,49849L,49850L,49851L,49852L,49853L,49854L,49855L,49856L,49857L,\n49858L,49859L,49860L,49861L,49862L,49863L,49864L,49865L,49866L,49867L,\n49868L,49869L,49870L,49871L,49872L,49873L,49874L,49875L,49876L,49877L,\n49878L,49879L,49880L,49881L,49882L,49883L,49884L,49885L,49886L,49887L,\n49888L,49889L,49890L,49891L,49892L,49893L,49894L,49895L,49896L,49897L,\n49898L,49899L,49900L,49901L,49902L,49903L,49904L,49905L,49906L,49907L,\n49908L,49909L,49910L,49911L,49912L,49913L,49914L,49915L,49916L,49917L,\n49918L,49919L,49920L,49921L,49922L,49923L,49924L,49925L,49926L,49927L,\n49928L,49929L,49930L,49931L,49932L,49933L,49934L,49935L,49936L,49937L,\n49938L,49939L,49940L,49941L,49942L,49943L,49944L,49945L,49946L,49947L,\n49948L,49949L,49950L,49951L,49952L,49953L,49954L,49955L,49956L,49957L,\n49958L,49959L,49960L,49961L,49962L,49963L,49964L,49965L,49966L,49967L,\n49968L,49969L,49970L,49971L,49972L,49973L,49974L,49975L,49976L,49977L,\n49978L,49979L,49980L,49981L,49982L,49983L,49984L,49985L,49986L,49987L,\n49988L,49989L,49990L,49991L,49992L,49993L,49994L,49995L,49996L,49997L,\n49998L,49999L,50000L,50001L,50002L,50003L,50004L,50005L,50006L,50007L,\n50008L,50009L,50010L,50011L,50012L,50013L,50014L,50015L,50016L,50017L,\n50018L,50019L,50020L,50021L,50022L,50023L,50024L,50025L,50026L,50027L,\n50028L,50029L,50030L,50031L,50032L,50033L,50034L,50035L,50036L,50037L,\n50038L,50039L,50040L,50041L,50042L,50043L,50044L,50045L,50046L,50047L,\n50048L,50049L,50050L,50051L,50052L,50053L,50054L,50055L,50056L,50057L,\n50058L,50059L,50060L,50061L,50062L,50063L,50064L,50065L,50066L,50067L,\n50068L,50069L,50070L,50071L,50072L,50073L,50074L,50075L,50076L,50077L,\n50078L,50079L,50080L,50081L,50082L,50083L,50084L,50085L,50086L,50087L,\n50088L,50089L,50090L,50091L,50092L,50093L,50094L,50095L,50096L,50097L,\n50098L,50099L,50100L,50101L,50102L,50103L,50104L,50105L,50106L,50107L,\n50108L,50109L,50110L,50111L,50112L,50113L,50114L,50115L,50116L,50117L,\n50118L,50119L,50120L,50121L,50122L,50123L,50124L,50125L,50126L,50127L,\n50128L,50129L,50130L,50131L,50132L,50133L,50134L,50135L,50136L,50137L,\n50138L,50139L,50140L,50141L,50142L,50143L,50144L,50145L,50146L,50147L,\n50148L,50149L,50150L,50151L,50152L,50153L,50154L,50155L,50156L,50157L,\n50158L,50159L,50160L,50161L,50162L,50163L,50164L,50165L,50166L,50167L,\n50168L,50169L,50170L,50171L,50172L,50173L,50174L,50175L,50176L,50177L,\n50178L,50179L,50180L,50181L,50182L,50183L,50184L,50185L,50186L,50187L,\n50188L,50189L,50190L,50191L,50192L,50193L,50194L,50195L,50196L,50197L,\n50198L,50199L,50200L,50201L,50202L,50203L,50204L,50205L,50206L,50207L,\n50208L,50209L,50210L,50211L,50212L,50213L,50214L,50215L,50216L,50217L,\n50218L,50219L,50220L,50221L,50222L,50223L,50224L,50225L,50226L,50227L,\n50228L,50229L,50230L,50231L,50232L,50233L,50234L,50235L,50236L,50237L,\n50238L,50239L,50240L,50241L,50242L,50243L,50244L,50245L,50246L,50247L,\n50248L,50249L,50250L,50251L,50252L,50253L,50254L,50255L,50256L,50257L,\n50258L,50259L,50260L,50261L,50262L,50263L,50264L,50265L,50266L,50267L,\n50268L,50269L,50270L,50271L,50272L,50273L,50274L,50275L,50276L,50277L,\n50278L,50279L,50280L,50281L,50282L,50283L,50284L,50285L,50286L,50287L,\n50288L,50289L,50290L,50291L,50292L,50293L,50294L,50295L,50296L,50297L,\n50298L,50299L,50300L,50301L,50302L,50303L,50304L,50305L,50306L,50307L,\n50308L,50309L,50310L,50311L,50312L,50313L,50314L,50315L,50316L,50317L,\n50318L,50319L,50320L,50321L,50322L,50323L,50324L,50325L,50326L,50327L,\n50328L,50329L,50330L,50331L,50332L,50333L,50334L,50335L,50336L,50337L,\n50338L,50339L,50340L,50341L,50342L,50343L,50344L,50345L,50346L,50347L,\n50348L,50349L,50350L,50351L,50352L,50353L,50354L,50355L,50356L,50357L,\n50358L,50359L,50360L,50361L,50362L,50363L,50364L,50365L,50366L,50367L,\n50368L,50369L,50370L,50371L,50372L,50373L,50374L,50375L,50376L,50377L,\n50378L,50379L,50380L,50381L,50382L,50383L,50384L,50385L,50386L,50387L,\n50388L,50389L,50390L,50391L,50392L,50393L,50394L,50395L,50396L,50397L,\n50398L,50399L,50400L,50401L,50402L,50403L,50404L,50405L,50406L,50407L,\n50408L,50409L,50410L,50411L,50412L,50413L,50414L,50415L,50416L,50417L,\n50418L,50419L,50420L,50421L,50422L,50423L,50424L,50425L,50426L,50427L,\n50428L,50429L,50430L,50431L,50432L,50433L,50434L,50435L,50436L,50437L,\n50438L,50439L,50440L,50441L,50442L,50443L,50444L,50445L,50446L,50447L,\n50448L,50449L,50450L,50451L,50452L,50453L,50454L,50455L,50456L,50457L,\n50458L,50459L,50460L,50461L,50462L,50463L,50464L,50465L,50466L,50467L,\n50468L,50469L,50470L,50471L,50472L,50473L,50474L,50475L,50476L,50477L,\n50478L,50479L,50480L,50481L,50482L,50483L,50484L,50485L,50486L,50487L,\n50488L,50489L,50490L,50491L,50492L,50493L,50494L,50495L,50496L,50497L,\n50498L,50499L,50500L,50501L,50502L,50503L,50504L,50505L,50506L,50507L,\n50508L,50509L,50510L,50511L,50512L,50513L,50514L,50515L,50516L,50517L,\n50518L,50519L,50520L,50521L,50522L,50523L,50524L,50525L,50526L,50527L,\n50528L,50529L,50530L,50531L,50532L,50533L,50534L,50535L,50536L,50537L,\n50538L,50539L,50540L,50541L,50542L,50543L,50544L,50545L,50546L,50547L,\n50548L,50549L,50550L,50551L,50552L,50553L,50554L,50555L,50556L,50557L,\n50558L,50559L,50560L,50561L,50562L,50563L,50564L,50565L,50566L,50567L,\n50568L,50569L,50570L,50571L,50572L,50573L,50574L,50575L,50576L,50577L,\n50578L,50579L,50580L,50581L,50582L,50583L,50584L,50585L,50586L,50587L,\n50588L,50589L,50590L,50591L,50592L,50593L,50594L,50595L,50596L,50597L,\n50598L,50599L,50600L,50601L,50602L,50603L,50604L,50605L,50606L,50607L,\n50608L,50609L,50610L,50611L,50612L,50613L,50614L,50615L,50616L,50617L,\n50618L,50619L,50620L,50621L,50622L,50623L,50624L,50625L,50626L,50627L,\n50628L,50629L,50630L,50631L,50632L,50633L,50634L,50635L,50636L,50637L,\n50638L,50639L,50640L,50641L,50642L,50643L,50644L,50645L,50646L,50647L,\n50648L,50649L,50650L,50651L,50652L,50653L,50654L,50655L,50656L,50657L,\n50658L,50659L,50660L,50661L,50662L,50663L,50664L,50665L,50666L,50667L,\n50668L,50669L,50670L,50671L,50672L,50673L,50674L,50675L,50676L,50677L,\n50678L,50679L,50680L,50681L,50682L,50683L,50684L,50685L,50686L,50687L,\n50688L,50689L,50690L,50691L,50692L,50693L,50694L,50695L,50696L,50697L,\n50698L,50699L,50700L,50701L,50702L,50703L,50704L,50705L,50706L,50707L,\n50708L,50709L,50710L,50711L,50712L,50713L,50714L,50715L,50716L,50717L,\n50718L,50719L,50720L,50721L,50722L,50723L,50724L,50725L,50726L,50727L,\n50728L,50729L,50730L,50731L,50732L,50733L,50734L,50735L,50736L,50737L,\n50738L,50739L,50740L,50741L,50742L,50743L,50744L,50745L,50746L,50747L,\n50748L,50749L,50750L,50751L,50752L,50753L,50754L,50755L,50756L,50757L,\n50758L,50759L,50760L,50761L,50762L,50763L,50764L,50765L,50766L,50767L,\n50768L,50769L,50770L,50771L,50772L,50773L,50774L,50775L,50776L,50777L,\n50778L,50779L,50780L,50781L,50782L,50783L,50784L,50785L,50786L,50787L,\n50788L,50789L,50790L,50791L,50792L,50793L,50794L,50795L,50796L,50797L,\n50798L,50799L,50800L,50801L,50802L,50803L,50804L,50805L,50806L,50807L,\n50808L,50809L,50810L,50811L,50812L,50813L,50814L,50815L,50816L,50817L,\n50818L,50819L,50820L,50821L,50822L,50823L,50824L,50825L,50826L,50827L,\n50828L,50829L,50830L,50831L,50832L,50833L,50834L,50835L,50836L,50837L,\n50838L,50839L,50840L,50841L,50842L,50843L,50844L,50845L,50846L,50847L,\n50848L,50849L,50850L,50851L,50852L,50853L,50854L,50855L,50856L,50857L,\n50858L,50859L,50860L,50861L,50862L,50863L,50864L,50865L,50866L,50867L,\n50868L,50869L,50870L,50871L,50872L,50873L,50874L,50875L,50876L,50877L,\n50878L,50879L,50880L,50881L,50882L,50883L,50884L,50885L,50886L,50887L,\n50888L,50889L,50890L,50891L,50892L,50893L,50894L,50895L,50896L,50897L,\n50898L,50899L,50900L,50901L,50902L,50903L,50904L,50905L,50906L,50907L,\n50908L,50909L,50910L,50911L,50912L,50913L,50914L,50915L,50916L,50917L,\n50918L,50919L,50920L,50921L,50922L,50923L,50924L,50925L,50926L,50927L,\n50928L,50929L,50930L,50931L,50932L,50933L,50934L,50935L,50936L,50937L,\n50938L,50939L,50940L,50941L,50942L,50943L,50944L,50945L,50946L,50947L,\n50948L,50949L,50950L,50951L,50952L,50953L,50954L,50955L,50956L,50957L,\n50958L,50959L,50960L,50961L,50962L,50963L,50964L,50965L,50966L,50967L,\n50968L,50969L,50970L,50971L,50972L,50973L,50974L,50975L,50976L,50977L,\n50978L,50979L,50980L,50981L,50982L,50983L,50984L,50985L,50986L,50987L,\n50988L,50989L,50990L,50991L,50992L,50993L,50994L,50995L,50996L,50997L,\n50998L,50999L,51000L,51001L,51002L,51003L,51004L,51005L,51006L,51007L,\n51008L,51009L,51010L,51011L,51012L,51013L,51014L,51015L,51016L,51017L,\n51018L,51019L,51020L,51021L,51022L,51023L,51024L,51025L,51026L,51027L,\n51028L,51029L,51030L,51031L,51032L,51033L,51034L,51035L,51036L,51037L,\n51038L,51039L,51040L,51041L,51042L,51043L,51044L,51045L,51046L,51047L,\n51048L,51049L,51050L,51051L,51052L,51053L,51054L,51055L,51056L,51057L,\n51058L,51059L,51060L,51061L,51062L,51063L,51064L,51065L,51066L,51067L,\n51068L,51069L,51070L,51071L,51072L,51073L,51074L,51075L,51076L,51077L,\n51078L,51079L,51080L,51081L,51082L,51083L,51084L,51085L,51086L,51087L,\n51088L,51089L,51090L,51091L,51092L,51093L,51094L,51095L,51096L,51097L,\n51098L,51099L,51100L,51101L,51102L,51103L,51104L,51105L,51106L,51107L,\n51108L,51109L,51110L,51111L,51112L,51113L,51114L,51115L,51116L,51117L,\n51118L,51119L,51120L,51121L,51122L,51123L,51124L,51125L,51126L,51127L,\n51128L,51129L,51130L,51131L,51132L,51133L,51134L,51135L,51136L,51137L,\n51138L,51139L,51140L,51141L,51142L,51143L,51144L,51145L,51146L,51147L,\n51148L,51149L,51150L,51151L,51152L,51153L,51154L,51155L,51156L,51157L,\n51158L,51159L,51160L,51161L,51162L,51163L,51164L,51165L,51166L,51167L,\n51168L,51169L,51170L,51171L,51172L,51173L,51174L,51175L,51176L,51177L,\n51178L,51179L,51180L,51181L,51182L,51183L,51184L,51185L,51186L,51187L,\n51188L,51189L,51190L,51191L,51192L,51193L,51194L,51195L,51196L,51197L,\n51198L,51199L,51200L,51201L,51202L,51203L,51204L,51205L,51206L,51207L,\n51208L,51209L,51210L,51211L,51212L,51213L,51214L,51215L,51216L,51217L,\n51218L,51219L,51220L,51221L,51222L,51223L,51224L,51225L,51226L,51227L,\n51228L,51229L,51230L,51231L,51232L,51233L,51234L,51235L,51236L,51237L,\n51238L,51239L,51240L,51241L,51242L,51243L,51244L,51245L,51246L,51247L,\n51248L,51249L,51250L,51251L,51252L,51253L,51254L,51255L,51256L,51257L,\n51258L,51259L,51260L,51261L,51262L,51263L,51264L,51265L,51266L,51267L,\n51268L,51269L,51270L,51271L,51272L,51273L,51274L,51275L,51276L,51277L,\n51278L,51279L,51280L,51281L,51282L,51283L,51284L,51285L,51286L,51287L,\n51288L,51289L,51290L,51291L,51292L,51293L,51294L,51295L,51296L,51297L,\n51298L,51299L,51300L,51301L,51302L,51303L,51304L,51305L,51306L,51307L,\n51308L,51309L,51310L,51311L,51312L,51313L,51314L,51315L,51316L,51317L,\n51318L,51319L,51320L,51321L,51322L,51323L,51324L,51325L,51326L,51327L,\n51328L,51329L,51330L,51331L,51332L,51333L,51334L,51335L,51336L,51337L,\n51338L,51339L,51340L,51341L,51342L,51343L,51344L,51345L,51346L,51347L,\n51348L,51349L,51350L,51351L,51352L,51353L,51354L,51355L,51356L,51357L,\n51358L,51359L,51360L,51361L,51362L,51363L,51364L,51365L,51366L,51367L,\n51368L,51369L,51370L,51371L,51372L,51373L,51374L,51375L,51376L,51377L,\n51378L,51379L,51380L,51381L,51382L,51383L,51384L,51385L,51386L,51387L,\n51388L,51389L,51390L,51391L,51392L,51393L,51394L,51395L,51396L,51397L,\n51398L,51399L,51400L,51401L,51402L,51403L,51404L,51405L,51406L,51407L,\n51408L,51409L,51410L,51411L,51412L,51413L,51414L,51415L,51416L,51417L,\n51418L,51419L,51420L,51421L,51422L,51423L,51424L,51425L,51426L,51427L,\n51428L,51429L,51430L,51431L,51432L,51433L,51434L,51435L,51436L,51437L,\n51438L,51439L,51440L,51441L,51442L,51443L,51444L,51445L,51446L,51447L,\n51448L,51449L,51450L,51451L,51452L,51453L,51454L,51455L,51456L,51457L,\n51458L,51459L,51460L,51461L,51462L,51463L,51464L,51465L,51466L,51467L,\n51468L,51469L,51470L,51471L,51472L,51473L,51474L,51475L,51476L,51477L,\n51478L,51479L,51480L,51481L,51482L,51483L,51484L,51485L,51486L,51487L,\n51488L,51489L,51490L,51491L,51492L,51493L,51494L,51495L,51496L,51497L,\n51498L,51499L,51500L,51501L,51502L,51503L,51504L,51505L,51506L,51507L,\n51508L,51509L,51510L,51511L,51512L,51513L,51514L,51515L,51516L,51517L,\n51518L,51519L,51520L,51521L,51522L,51523L,51524L,51525L,51526L,51527L,\n51528L,51529L,51530L,51531L,51532L,51533L,51534L,51535L,51536L,51537L,\n51538L,51539L,51540L,51541L,51542L,51543L,51544L,51545L,51546L,51547L,\n51548L,51549L,51550L,51551L,51552L,51553L,51554L,51555L,51556L,51557L,\n51558L,51559L,51560L,51561L,51562L,51563L,51564L,51565L,51566L,51567L,\n51568L,51569L,51570L,51571L,51572L,51573L,51574L,51575L,51576L,51577L,\n51578L,51579L,51580L,51581L,51582L,51583L,51584L,51585L,51586L,51587L,\n51588L,51589L,51590L,51591L,51592L,51593L,51594L,51595L,51596L,51597L,\n51598L,51599L,51600L,51601L,51602L,51603L,51604L,51605L,51606L,51607L,\n51608L,51609L,51610L,51611L,51612L,51613L,51614L,51615L,51616L,51617L,\n51618L,51619L,51620L,51621L,51622L,51623L,51624L,51625L,51626L,51627L,\n51628L,51629L,51630L,51631L,51632L,51633L,51634L,51635L,51636L,51637L,\n51638L,51639L,51640L,51641L,51642L,51643L,51644L,51645L,51646L,51647L,\n51648L,51649L,51650L,51651L,51652L,51653L,51654L,51655L,51656L,51657L,\n51658L,51659L,51660L,51661L,51662L,51663L,51664L,51665L,51666L,51667L,\n51668L,51669L,51670L,51671L,51672L,51673L,51674L,51675L,51676L,51677L,\n51678L,51679L,51680L,51681L,51682L,51683L,51684L,51685L,51686L,51687L,\n51688L,51689L,51690L,51691L,51692L,51693L,51694L,51695L,51696L,51697L,\n51698L,51699L,51700L,51701L,51702L,51703L,51704L,51705L,51706L,51707L,\n51708L,51709L,51710L,51711L,51712L,51713L,51714L,51715L,51716L,51717L,\n51718L,51719L,51720L,51721L,51722L,51723L,51724L,51725L,51726L,51727L,\n51728L,51729L,51730L,51731L,51732L,51733L,51734L,51735L,51736L,51737L,\n51738L,51739L,51740L,51741L,51742L,51743L,51744L,51745L,51746L,51747L,\n51748L,51749L,51750L,51751L,51752L,51753L,51754L,51755L,51756L,51757L,\n51758L,51759L,51760L,51761L,51762L,51763L,51764L,51765L,51766L,51767L,\n51768L,51769L,51770L,51771L,51772L,51773L,51774L,51775L,51776L,51777L,\n51778L,51779L,51780L,51781L,51782L,51783L,51784L,51785L,51786L,51787L,\n51788L,51789L,51790L,51791L,51792L,51793L,51794L,51795L,51796L,51797L,\n51798L,51799L,51800L,51801L,51802L,51803L,51804L,51805L,51806L,51807L,\n51808L,51809L,51810L,51811L,51812L,51813L,51814L,51815L,51816L,51817L,\n51818L,51819L,51820L,51821L,51822L,51823L,51824L,51825L,51826L,51827L,\n51828L,51829L,51830L,51831L,51832L,51833L,51834L,51835L,51836L,51837L,\n51838L,51839L,51840L,51841L,51842L,51843L,51844L,51845L,51846L,51847L,\n51848L,51849L,51850L,51851L,51852L,51853L,51854L,51855L,51856L,51857L,\n51858L,51859L,51860L,51861L,51862L,51863L,51864L,51865L,51866L,51867L,\n51868L,51869L,51870L,51871L,51872L,51873L,51874L,51875L,51876L,51877L,\n51878L,51879L,51880L,51881L,51882L,51883L,51884L,51885L,51886L,51887L,\n51888L,51889L,51890L,51891L,51892L,51893L,51894L,51895L,51896L,51897L,\n51898L,51899L,51900L,51901L,51902L,51903L,51904L,51905L,51906L,51907L,\n51908L,51909L,51910L,51911L,51912L,51913L,51914L,51915L,51916L,51917L,\n51918L,51919L,51920L,51921L,51922L,51923L,51924L,51925L,51926L,51927L,\n51928L,51929L,51930L,51931L,51932L,51933L,51934L,51935L,51936L,51937L,\n51938L,51939L,51940L,51941L,51942L,51943L,51944L,51945L,51946L,51947L,\n51948L,51949L,51950L,51951L,51952L,51953L,51954L,51955L,51956L,51957L,\n51958L,51959L,51960L,51961L,51962L,51963L,51964L,51965L,51966L,51967L,\n51968L,51969L,51970L,51971L,51972L,51973L,51974L,51975L,51976L,51977L,\n51978L,51979L,51980L,51981L,51982L,51983L,51984L,51985L,51986L,51987L,\n51988L,51989L,51990L,51991L,51992L,51993L,51994L,51995L,51996L,51997L,\n51998L,51999L,52000L,52001L,52002L,52003L,52004L,52005L,52006L,52007L,\n52008L,52009L,52010L,52011L,52012L,52013L,52014L,52015L,52016L,52017L,\n52018L,52019L,52020L,52021L,52022L,52023L,52024L,52025L,52026L,52027L,\n52028L,52029L,52030L,52031L,52032L,52033L,52034L,52035L,52036L,52037L,\n52038L,52039L,52040L,52041L,52042L,52043L,52044L,52045L,52046L,52047L,\n52048L,52049L,52050L,52051L,52052L,52053L,52054L,52055L,52056L,52057L,\n52058L,52059L,52060L,52061L,52062L,52063L,52064L,52065L,52066L,52067L,\n52068L,52069L,52070L,52071L,52072L,52073L,52074L,52075L,52076L,52077L,\n52078L,52079L,52080L,52081L,52082L,52083L,52084L,52085L,52086L,52087L,\n52088L,52089L,52090L,52091L,52092L,52093L,52094L,52095L,52096L,52097L,\n52098L,52099L,52100L,52101L,52102L,52103L,52104L,52105L,52106L,52107L,\n52108L,52109L,52110L,52111L,52112L,52113L,52114L,52115L,52116L,52117L,\n52118L,52119L,52120L,52121L,52122L,52123L,52124L,52125L,52126L,52127L,\n52128L,52129L,52130L,52131L,52132L,52133L,52134L,52135L,52136L,52137L,\n52138L,52139L,52140L,52141L,52142L,52143L,52144L,52145L,52146L,52147L,\n52148L,52149L,52150L,52151L,52152L,52153L,52154L,52155L,52156L,52157L,\n52158L,52159L,52160L,52161L,52162L,52163L,52164L,52165L,52166L,52167L,\n52168L,52169L,52170L,52171L,52172L,52173L,52174L,52175L,52176L,52177L,\n52178L,52179L,52180L,52181L,52182L,52183L,52184L,52185L,52186L,52187L,\n52188L,52189L,52190L,52191L,52192L,52193L,52194L,52195L,52196L,52197L,\n52198L,52199L,52200L,52201L,52202L,52203L,52204L,52205L,52206L,52207L,\n52208L,52209L,52210L,52211L,52212L,52213L,52214L,52215L,52216L,52217L,\n52218L,52219L,52220L,52221L,52222L,52223L,52224L,52225L,52226L,52227L,\n52228L,52229L,52230L,52231L,52232L,52233L,52234L,52235L,52236L,52237L,\n52238L,52239L,52240L,52241L,52242L,52243L,52244L,52245L,52246L,52247L,\n52248L,52249L,52250L,52251L,52252L,52253L,52254L,52255L,52256L,52257L,\n52258L,52259L,52260L,52261L,52262L,52263L,52264L,52265L,52266L,52267L,\n52268L,52269L,52270L,52271L,52272L,52273L,52274L,52275L,52276L,52277L,\n52278L,52279L,52280L,52281L,52282L,52283L,52284L,52285L,52286L,52287L,\n52288L,52289L,52290L,52291L,52292L,52293L,52294L,52295L,52296L,52297L,\n52298L,52299L,52300L,52301L,52302L,52303L,52304L,52305L,52306L,52307L,\n52308L,52309L,52310L,52311L,52312L,52313L,52314L,52315L,52316L,52317L,\n52318L,52319L,52320L,52321L,52322L,52323L,52324L,52325L,52326L,52327L,\n52328L,52329L,52330L,52331L,52332L,52333L,52334L,52335L,52336L,52337L,\n52338L,52339L,52340L,52341L,52342L,52343L,52344L,52345L,52346L,52347L,\n52348L,52349L,52350L,52351L,52352L,52353L,52354L,52355L,52356L,52357L,\n52358L,52359L,52360L,52361L,52362L,52363L,52364L,52365L,52366L,52367L,\n52368L,52369L,52370L,52371L,52372L,52373L,52374L,52375L,52376L,52377L,\n52378L,52379L,52380L,52381L,52382L,52383L,52384L,52385L,52386L,52387L,\n52388L,52389L,52390L,52391L,52392L,52393L,52394L,52395L,52396L,52397L,\n52398L,52399L,52400L,52401L,52402L,52403L,52404L,52405L,52406L,52407L,\n52408L,52409L,52410L,52411L,52412L,52413L,52414L,52415L,52416L,52417L,\n52418L,52419L,52420L,52421L,52422L,52423L,52424L,52425L,52426L,52427L,\n52428L,52429L,52430L,52431L,52432L,52433L,52434L,52435L,52436L,52437L,\n52438L,52439L,52440L,52441L,52442L,52443L,52444L,52445L,52446L,52447L,\n52448L,52449L,52450L,52451L,52452L,52453L,52454L,52455L,52456L,52457L,\n52458L,52459L,52460L,52461L,52462L,52463L,52464L,52465L,52466L,52467L,\n52468L,52469L,52470L,52471L,52472L,52473L,52474L,52475L,52476L,52477L,\n52478L,52479L,52480L,52481L,52482L,52483L,52484L,52485L,52486L,52487L,\n52488L,52489L,52490L,52491L,52492L,52493L,52494L,52495L,52496L,52497L,\n52498L,52499L,52500L,52501L,52502L,52503L,52504L,52505L,52506L,52507L,\n52508L,52509L,52510L,52511L,52512L,52513L,52514L,52515L,52516L,52517L,\n52518L,52519L,52520L,52521L,52522L,52523L,52524L,52525L,52526L,52527L,\n52528L,52529L,52530L,52531L,52532L,52533L,52534L,52535L,52536L,52537L,\n52538L,52539L,52540L,52541L,52542L,52543L,52544L,52545L,52546L,52547L,\n52548L,52549L,52550L,52551L,52552L,52553L,52554L,52555L,52556L,52557L,\n52558L,52559L,52560L,52561L,52562L,52563L,52564L,52565L,52566L,52567L,\n52568L,52569L,52570L,52571L,52572L,52573L,52574L,52575L,52576L,52577L,\n52578L,52579L,52580L,52581L,52582L,52583L,52584L,52585L,52586L,52587L,\n52588L,52589L,52590L,52591L,52592L,52593L,52594L,52595L,52596L,52597L,\n52598L,52599L,52600L,52601L,52602L,52603L,52604L,52605L,52606L,52607L,\n52608L,52609L,52610L,52611L,52612L,52613L,52614L,52615L,52616L,52617L,\n52618L,52619L,52620L,52621L,52622L,52623L,52624L,52625L,52626L,52627L,\n52628L,52629L,52630L,52631L,52632L,52633L,52634L,52635L,52636L,52637L,\n52638L,52639L,52640L,52641L,52642L,52643L,52644L,52645L,52646L,52647L,\n52648L,52649L,52650L,52651L,52652L,52653L,52654L,52655L,52656L,52657L,\n52658L,52659L,52660L,52661L,52662L,52663L,52664L,52665L,52666L,52667L,\n52668L,52669L,52670L,52671L,52672L,52673L,52674L,52675L,52676L,52677L,\n52678L,52679L,52680L,52681L,52682L,52683L,52684L,52685L,52686L,52687L,\n52688L,52689L,52690L,52691L,52692L,52693L,52694L,52695L,52696L,52697L,\n52698L,52699L,52700L,52701L,52702L,52703L,52704L,52705L,52706L,52707L,\n52708L,52709L,52710L,52711L,52712L,52713L,52714L,52715L,52716L,52717L,\n52718L,52719L,52720L,52721L,52722L,52723L,52724L,52725L,52726L,52727L,\n52728L,52729L,52730L,52731L,52732L,52733L,52734L,52735L,52736L,52737L,\n52738L,52739L,52740L,52741L,52742L,52743L,52744L,52745L,52746L,52747L,\n52748L,52749L,52750L,52751L,52752L,52753L,52754L,52755L,52756L,52757L,\n52758L,52759L,52760L,52761L,52762L,52763L,52764L,52765L,52766L,52767L,\n52768L,52769L,52770L,52771L,52772L,52773L,52774L,52775L,52776L,52777L,\n52778L,52779L,52780L,52781L,52782L,52783L,52784L,52785L,52786L,52787L,\n52788L,52789L,52790L,52791L,52792L,52793L,52794L,52795L,52796L,52797L,\n52798L,52799L,52800L,52801L,52802L,52803L,52804L,52805L,52806L,52807L,\n52808L,52809L,52810L,52811L,52812L,52813L,52814L,52815L,52816L,52817L,\n52818L,52819L,52820L,52821L,52822L,52823L,52824L,52825L,52826L,52827L,\n52828L,52829L,52830L,52831L,52832L,52833L,52834L,52835L,52836L,52837L,\n52838L,52839L,52840L,52841L,52842L,52843L,52844L,52845L,52846L,52847L,\n52848L,52849L,52850L,52851L,52852L,52853L,52854L,52855L,52856L,52857L,\n52858L,52859L,52860L,52861L,52862L,52863L,52864L,52865L,52866L,52867L,\n52868L,52869L,52870L,52871L,52872L,52873L,52874L,52875L,52876L,52877L,\n52878L,52879L,52880L,52881L,52882L,52883L,52884L,52885L,52886L,52887L,\n52888L,52889L,52890L,52891L,52892L,52893L,52894L,52895L,52896L,52897L,\n52898L,52899L,52900L,52901L,52902L,52903L,52904L,52905L,52906L,52907L,\n52908L,52909L,52910L,52911L,52912L,52913L,52914L,52915L,52916L,52917L,\n52918L,52919L,52920L,52921L,52922L,52923L,52924L,52925L,52926L,52927L,\n52928L,52929L,52930L,52931L,52932L,52933L,52934L,52935L,52936L,52937L,\n52938L,52939L,52940L,52941L,52942L,52943L,52944L,52945L,52946L,52947L,\n52948L,52949L,52950L,52951L,52952L,52953L,52954L,52955L,52956L,52957L,\n52958L,52959L,52960L,52961L,52962L,52963L,52964L,52965L,52966L,52967L,\n52968L,52969L,52970L,52971L,52972L,52973L,52974L,52975L,52976L,52977L,\n52978L,52979L,52980L,52981L,52982L,52983L,52984L,52985L,52986L,52987L,\n52988L,52989L,52990L,52991L,52992L,52993L,52994L,52995L,52996L,52997L,\n52998L,52999L,53000L,53001L,53002L,53003L,53004L,53005L,53006L,53007L,\n53008L,53009L,53010L,53011L,53012L,53013L,53014L,53015L,53016L,53017L,\n53018L,53019L,53020L,53021L,53022L,53023L,53024L,53025L,53026L,53027L,\n53028L,53029L,53030L,53031L,53032L,53033L,53034L,53035L,53036L,53037L,\n53038L,53039L,53040L,53041L,53042L,53043L,53044L,53045L,53046L,53047L,\n53048L,53049L,53050L,53051L,53052L,53053L,53054L,53055L,53056L,53057L,\n53058L,53059L,53060L,53061L,53062L,53063L,53064L,53065L,53066L,53067L,\n53068L,53069L,53070L,53071L,53072L,53073L,53074L,53075L,53076L,53077L,\n53078L,53079L,53080L,53081L,53082L,53083L,53084L,53085L,53086L,53087L,\n53088L,53089L,53090L,53091L,53092L,53093L,53094L,53095L,53096L,53097L,\n53098L,53099L,53100L,53101L,53102L,53103L,53104L,53105L,53106L,53107L,\n53108L,53109L,53110L,53111L,53112L,53113L,53114L,53115L,53116L,53117L,\n53118L,53119L,53120L,53121L,53122L,53123L,53124L,53125L,53126L,53127L,\n53128L,53129L,53130L,53131L,53132L,53133L,53134L,53135L,53136L,53137L,\n53138L,53139L,53140L,53141L,53142L,53143L,53144L,53145L,53146L,53147L,\n53148L,53149L,53150L,53151L,53152L,53153L,53154L,53155L,53156L,53157L,\n53158L,53159L,53160L,53161L,53162L,53163L,53164L,53165L,53166L,53167L,\n53168L,53169L,53170L,53171L,53172L,53173L,53174L,53175L,53176L,53177L,\n53178L,53179L,53180L,53181L,53182L,53183L,53184L,53185L,53186L,53187L,\n53188L,53189L,53190L,53191L,53192L,53193L,53194L,53195L,53196L,53197L,\n53198L,53199L,53200L,53201L,53202L,53203L,53204L,53205L,53206L,53207L,\n53208L,53209L,53210L,53211L,53212L,53213L,53214L,53215L,53216L,53217L,\n53218L,53219L,53220L,53221L,53222L,53223L,53224L,53225L,53226L,53227L,\n53228L,53229L,53230L,53231L,53232L,53233L,53234L,53235L,53236L,53237L,\n53238L,53239L,53240L,53241L,53242L,53243L,53244L,53245L,53246L,53247L,\n53248L,53249L,53250L,53251L,53252L,53253L,53254L,53255L,53256L,53257L,\n53258L,53259L,53260L,53261L,53262L,53263L,53264L,53265L,53266L,53267L,\n53268L,53269L,53270L,53271L,53272L,53273L,53274L,53275L,53276L,53277L,\n53278L,53279L,53280L,53281L,53282L,53283L,53284L,53285L,53286L,53287L,\n53288L,53289L,53290L,53291L,53292L,53293L,53294L,53295L,53296L,53297L,\n53298L,53299L,53300L,53301L,53302L,53303L,53304L,53305L,53306L,53307L,\n53308L,53309L,53310L,53311L,53312L,53313L,53314L,53315L,53316L,53317L,\n53318L,53319L,53320L,53321L,53322L,53323L,53324L,53325L,53326L,53327L,\n53328L,53329L,53330L,53331L,53332L,53333L,53334L,53335L,53336L,53337L,\n53338L,53339L,53340L,53341L,53342L,53343L,53344L,53345L,53346L,53347L,\n53348L,53349L,53350L,53351L,53352L,53353L,53354L,53355L,53356L,53357L,\n53358L,53359L,53360L,53361L,53362L,53363L,53364L,53365L,53366L,53367L,\n53368L,53369L,53370L,53371L,53372L,53373L,53374L,53375L,53376L,53377L,\n53378L,53379L,53380L,53381L,53382L,53383L,53384L,53385L,53386L,53387L,\n53388L,53389L,53390L,53391L,53392L,53393L,53394L,53395L,53396L,53397L,\n53398L,53399L,53400L,53401L,53402L,53403L,53404L,53405L,53406L,53407L,\n53408L,53409L,53410L,53411L,53412L,53413L,53414L,53415L,53416L,53417L,\n53418L,53419L,53420L,53421L,53422L,53423L,53424L,53425L,53426L,53427L,\n53428L,53429L,53430L,53431L,53432L,53433L,53434L,53435L,53436L,53437L,\n53438L,53439L,53440L,53441L,53442L,53443L,53444L,53445L,53446L,53447L,\n53448L,53449L,53450L,53451L,53452L,53453L,53454L,53455L,53456L,53457L,\n53458L,53459L,53460L,53461L,53462L,53463L,53464L,53465L,53466L,53467L,\n53468L,53469L,53470L,53471L,53472L,53473L,53474L,53475L,53476L,53477L,\n53478L,53479L,53480L,53481L,53482L,53483L,53484L,53485L,53486L,53487L,\n53488L,53489L,53490L,53491L,53492L,53493L,53494L,53495L,53496L,53497L,\n53498L,53499L,53500L,53501L,53502L,53503L,53504L,53505L,53506L,53507L,\n53508L,53509L,53510L,53511L,53512L,53513L,53514L,53515L,53516L,53517L,\n53518L,53519L,53520L,53521L,53522L,53523L,53524L,53525L,53526L,53527L,\n53528L,53529L,53530L,53531L,53532L,53533L,53534L,53535L,53536L,53537L,\n53538L,53539L,53540L,53541L,53542L,53543L,53544L,53545L,53546L,53547L,\n53548L,53549L,53550L,53551L,53552L,53553L,53554L,53555L,53556L,53557L,\n53558L,53559L,53560L,53561L,53562L,53563L,53564L,53565L,53566L,53567L,\n53568L,53569L,53570L,53571L,53572L,53573L,53574L,53575L,53576L,53577L,\n53578L,53579L,53580L,53581L,53582L,53583L,53584L,53585L,53586L,53587L,\n53588L,53589L,53590L,53591L,53592L,53593L,53594L,53595L,53596L,53597L,\n53598L,53599L,53600L,53601L,53602L,53603L,53604L,53605L,53606L,53607L,\n53608L,53609L,53610L,53611L,53612L,53613L,53614L,53615L,53616L,53617L,\n53618L,53619L,53620L,53621L,53622L,53623L,53624L,53625L,53626L,53627L,\n53628L,53629L,53630L,53631L,53632L,53633L,53634L,53635L,53636L,53637L,\n53638L,53639L,53640L,53641L,53642L,53643L,53644L,53645L,53646L,53647L,\n53648L,53649L,53650L,53651L,53652L,53653L,53654L,53655L,53656L,53657L,\n53658L,53659L,53660L,53661L,53662L,53663L,53664L,53665L,53666L,53667L,\n53668L,53669L,53670L,53671L,53672L,53673L,53674L,53675L,53676L,53677L,\n53678L,53679L,53680L,53681L,53682L,53683L,53684L,53685L,53686L,53687L,\n53688L,53689L,53690L,53691L,53692L,53693L,53694L,53695L,53696L,53697L,\n53698L,53699L,53700L,53701L,53702L,53703L,53704L,53705L,53706L,53707L,\n53708L,53709L,53710L,53711L,53712L,53713L,53714L,53715L,53716L,53717L,\n53718L,53719L,53720L,53721L,53722L,53723L,53724L,53725L,53726L,53727L,\n53728L,53729L,53730L,53731L,53732L,53733L,53734L,53735L,53736L,53737L,\n53738L,53739L,53740L,53741L,53742L,53743L,53744L,53745L,53746L,53747L,\n53748L,53749L,53750L,53751L,53752L,53753L,53754L,53755L,53756L,53757L,\n53758L,53759L,53760L,53761L,53762L,53763L,53764L,53765L,53766L,53767L,\n53768L,53769L,53770L,53771L,53772L,53773L,53774L,53775L,53776L,53777L,\n53778L,53779L,53780L,53781L,53782L,53783L,53784L,53785L,53786L,53787L,\n53788L,53789L,53790L,53791L,53792L,53793L,53794L,53795L,53796L,53797L,\n53798L,53799L,53800L,53801L,53802L,53803L,53804L,53805L,53806L,53807L,\n53808L,53809L,53810L,53811L,53812L,53813L,53814L,53815L,53816L,53817L,\n53818L,53819L,53820L,53821L,53822L,53823L,53824L,53825L,53826L,53827L,\n53828L,53829L,53830L,53831L,53832L,53833L,53834L,53835L,53836L,53837L,\n53838L,53839L,53840L,53841L,53842L,53843L,53844L,53845L,53846L,53847L,\n53848L,53849L,53850L,53851L,53852L,53853L,53854L,53855L,53856L,53857L,\n53858L,53859L,53860L,53861L,53862L,53863L,53864L,53865L,53866L,53867L,\n53868L,53869L,53870L,53871L,53872L,53873L,53874L,53875L,53876L,53877L,\n53878L,53879L,53880L,53881L,53882L,53883L,53884L,53885L,53886L,53887L,\n53888L,53889L,53890L,53891L,53892L,53893L,53894L,53895L,53896L,53897L,\n53898L,53899L,53900L,53901L,53902L,53903L,53904L,53905L,53906L,53907L,\n53908L,53909L,53910L,53911L,53912L,53913L,53914L,53915L,53916L,53917L,\n53918L,53919L,53920L,53921L,53922L,53923L,53924L,53925L,53926L,53927L,\n53928L,53929L,53930L,53931L,53932L,53933L,53934L,53935L,53936L,53937L,\n53938L,53939L,53940L,53941L,53942L,53943L,53944L,53945L,53946L,53947L,\n53948L,53949L,53950L,53951L,53952L,53953L,53954L,53955L,53956L,53957L,\n53958L,53959L,53960L,53961L,53962L,53963L,53964L,53965L,53966L,53967L,\n53968L,53969L,53970L,53971L,53972L,53973L,53974L,53975L,53976L,53977L,\n53978L,53979L,53980L,53981L,53982L,53983L,53984L,53985L,53986L,53987L,\n53988L,53989L,53990L,53991L,53992L,53993L,53994L,53995L,53996L,53997L,\n53998L,53999L,54000L,54001L,54002L,54003L,54004L,54005L,54006L,54007L,\n54008L,54009L,54010L,54011L,54012L,54013L,54014L,54015L,54016L,54017L,\n54018L,54019L,54020L,54021L,54022L,54023L,54024L,54025L,54026L,54027L,\n54028L,54029L,54030L,54031L,54032L,54033L,54034L,54035L,54036L,54037L,\n54038L,54039L,54040L,54041L,54042L,54043L,54044L,54045L,54046L,54047L,\n54048L,54049L,54050L,54051L,54052L,54053L,54054L,54055L,54056L,54057L,\n54058L,54059L,54060L,54061L,54062L,54063L,54064L,54065L,54066L,54067L,\n54068L,54069L,54070L,54071L,54072L,54073L,54074L,54075L,54076L,54077L,\n54078L,54079L,54080L,54081L,54082L,54083L,54084L,54085L,54086L,54087L,\n54088L,54089L,54090L,54091L,54092L,54093L,54094L,54095L,54096L,54097L,\n54098L,54099L,54100L,54101L,54102L,54103L,54104L,54105L,54106L,54107L,\n54108L,54109L,54110L,54111L,54112L,54113L,54114L,54115L,54116L,54117L,\n54118L,54119L,54120L,54121L,54122L,54123L,54124L,54125L,54126L,54127L,\n54128L,54129L,54130L,54131L,54132L,54133L,54134L,54135L,54136L,54137L,\n54138L,54139L,54140L,54141L,54142L,54143L,54144L,54145L,54146L,54147L,\n54148L,54149L,54150L,54151L,54152L,54153L,54154L,54155L,54156L,54157L,\n54158L,54159L,54160L,54161L,54162L,54163L,54164L,54165L,54166L,54167L,\n54168L,54169L,54170L,54171L,54172L,54173L,54174L,54175L,54176L,54177L,\n54178L,54179L,54180L,54181L,54182L,54183L,54184L,54185L,54186L,54187L,\n54188L,54189L,54190L,54191L,54192L,54193L,54194L,54195L,54196L,54197L,\n54198L,54199L,54200L,54201L,54202L,54203L,54204L,54205L,54206L,54207L,\n54208L,54209L,54210L,54211L,54212L,54213L,54214L,54215L,54216L,54217L,\n54218L,54219L,54220L,54221L,54222L,54223L,54224L,54225L,54226L,54227L,\n54228L,54229L,54230L,54231L,54232L,54233L,54234L,54235L,54236L,54237L,\n54238L,54239L,54240L,54241L,54242L,54243L,54244L,54245L,54246L,54247L,\n54248L,54249L,54250L,54251L,54252L,54253L,54254L,54255L,54256L,54257L,\n54258L,54259L,54260L,54261L,54262L,54263L,54264L,54265L,54266L,54267L,\n54268L,54269L,54270L,54271L,54272L,54273L,54274L,54275L,54276L,54277L,\n54278L,54279L,54280L,54281L,54282L,54283L,54284L,54285L,54286L,54287L,\n54288L,54289L,54290L,54291L,54292L,54293L,54294L,54295L,54296L,54297L,\n54298L,54299L,54300L,54301L,54302L,54303L,54304L,54305L,54306L,54307L,\n54308L,54309L,54310L,54311L,54312L,54313L,54314L,54315L,54316L,54317L,\n54318L,54319L,54320L,54321L,54322L,54323L,54324L,54325L,54326L,54327L,\n54328L,54329L,54330L,54331L,54332L,54333L,54334L,54335L,54336L,54337L,\n54338L,54339L,54340L,54341L,54342L,54343L,54344L,54345L,54346L,54347L,\n54348L,54349L,54350L,54351L,54352L,54353L,54354L,54355L,54356L,54357L,\n54358L,54359L,54360L,54361L,54362L,54363L,54364L,54365L,54366L,54367L,\n54368L,54369L,54370L,54371L,54372L,54373L,54374L,54375L,54376L,54377L,\n54378L,54379L,54380L,54381L,54382L,54383L,54384L,54385L,54386L,54387L,\n54388L,54389L,54390L,54391L,54392L,54393L,54394L,54395L,54396L,54397L,\n54398L,54399L,54400L,54401L,54402L,54403L,54404L,54405L,54406L,54407L,\n54408L,54409L,54410L,54411L,54412L,54413L,54414L,54415L,54416L,54417L,\n54418L,54419L,54420L,54421L,54422L,54423L,54424L,54425L,54426L,54427L,\n54428L,54429L,54430L,54431L,54432L,54433L,54434L,54435L,54436L,54437L,\n54438L,54439L,54440L,54441L,54442L,54443L,54444L,54445L,54446L,54447L,\n54448L,54449L,54450L,54451L,54452L,54453L,54454L,54455L,54456L,54457L,\n54458L,54459L,54460L,54461L,54462L,54463L,54464L,54465L,54466L,54467L,\n54468L,54469L,54470L,54471L,54472L,54473L,54474L,54475L,54476L,54477L,\n54478L,54479L,54480L,54481L,54482L,54483L,54484L,54485L,54486L,54487L,\n54488L,54489L,54490L,54491L,54492L,54493L,54494L,54495L,54496L,54497L,\n54498L,54499L,54500L,54501L,54502L,54503L,54504L,54505L,54506L,54507L,\n54508L,54509L,54510L,54511L,54512L,54513L,54514L,54515L,54516L,54517L,\n54518L,54519L,54520L,54521L,54522L,54523L,54524L,54525L,54526L,54527L,\n54528L,54529L,54530L,54531L,54532L,54533L,54534L,54535L,54536L,54537L,\n54538L,54539L,54540L,54541L,54542L,54543L,54544L,54545L,54546L,54547L,\n54548L,54549L,54550L,54551L,54552L,54553L,54554L,54555L,54556L,54557L,\n54558L,54559L,54560L,54561L,54562L,54563L,54564L,54565L,54566L,54567L,\n54568L,54569L,54570L,54571L,54572L,54573L,54574L,54575L,54576L,54577L,\n54578L,54579L,54580L,54581L,54582L,54583L,54584L,54585L,54586L,54587L,\n54588L,54589L,54590L,54591L,54592L,54593L,54594L,54595L,54596L,54597L,\n54598L,54599L,54600L,54601L,54602L,54603L,54604L,54605L,54606L,54607L,\n54608L,54609L,54610L,54611L,54612L,54613L,54614L,54615L,54616L,54617L,\n54618L,54619L,54620L,54621L,54622L,54623L,54624L,54625L,54626L,54627L,\n54628L,54629L,54630L,54631L,54632L,54633L,54634L,54635L,54636L,54637L,\n54638L,54639L,54640L,54641L,54642L,54643L,54644L,54645L,54646L,54647L,\n54648L,54649L,54650L,54651L,54652L,54653L,54654L,54655L,54656L,54657L,\n54658L,54659L,54660L,54661L,54662L,54663L,54664L,54665L,54666L,54667L,\n54668L,54669L,54670L,54671L,54672L,54673L,54674L,54675L,54676L,54677L,\n54678L,54679L,54680L,54681L,54682L,54683L,54684L,54685L,54686L,54687L,\n54688L,54689L,54690L,54691L,54692L,54693L,54694L,54695L,54696L,54697L,\n54698L,54699L,54700L,54701L,54702L,54703L,54704L,54705L,54706L,54707L,\n54708L,54709L,54710L,54711L,54712L,54713L,54714L,54715L,54716L,54717L,\n54718L,54719L,54720L,54721L,54722L,54723L,54724L,54725L,54726L,54727L,\n54728L,54729L,54730L,54731L,54732L,54733L,54734L,54735L,54736L,54737L,\n54738L,54739L,54740L,54741L,54742L,54743L,54744L,54745L,54746L,54747L,\n54748L,54749L,54750L,54751L,54752L,54753L,54754L,54755L,54756L,54757L,\n54758L,54759L,54760L,54761L,54762L,54763L,54764L,54765L,54766L,54767L,\n54768L,54769L,54770L,54771L,54772L,54773L,54774L,54775L,54776L,54777L,\n54778L,54779L,54780L,54781L,54782L,54783L,54784L,54785L,54786L,54787L,\n54788L,54789L,54790L,54791L,54792L,54793L,54794L,54795L,54796L,54797L,\n54798L,54799L,54800L,54801L,54802L,54803L,54804L,54805L,54806L,54807L,\n54808L,54809L,54810L,54811L,54812L,54813L,54814L,54815L,54816L,54817L,\n54818L,54819L,54820L,54821L,54822L,54823L,54824L,54825L,54826L,54827L,\n54828L,54829L,54830L,54831L,54832L,54833L,54834L,54835L,54836L,54837L,\n54838L,54839L,54840L,54841L,54842L,54843L,54844L,54845L,54846L,54847L,\n54848L,54849L,54850L,54851L,54852L,54853L,54854L,54855L,54856L,54857L,\n54858L,54859L,54860L,54861L,54862L,54863L,54864L,54865L,54866L,54867L,\n54868L,54869L,54870L,54871L,54872L,54873L,54874L,54875L,54876L,54877L,\n54878L,54879L,54880L,54881L,54882L,54883L,54884L,54885L,54886L,54887L,\n54888L,54889L,54890L,54891L,54892L,54893L,54894L,54895L,54896L,54897L,\n54898L,54899L,54900L,54901L,54902L,54903L,54904L,54905L,54906L,54907L,\n54908L,54909L,54910L,54911L,54912L,54913L,54914L,54915L,54916L,54917L,\n54918L,54919L,54920L,54921L,54922L,54923L,54924L,54925L,54926L,54927L,\n54928L,54929L,54930L,54931L,54932L,54933L,54934L,54935L,54936L,54937L,\n54938L,54939L,54940L,54941L,54942L,54943L,54944L,54945L,54946L,54947L,\n54948L,54949L,54950L,54951L,54952L,54953L,54954L,54955L,54956L,54957L,\n54958L,54959L,54960L,54961L,54962L,54963L,54964L,54965L,54966L,54967L,\n54968L,54969L,54970L,54971L,54972L,54973L,54974L,54975L,54976L,54977L,\n54978L,54979L,54980L,54981L,54982L,54983L,54984L,54985L,54986L,54987L,\n54988L,54989L,54990L,54991L,54992L,54993L,54994L,54995L,54996L,54997L,\n54998L,54999L,55000L,55001L,55002L,55003L,55004L,55005L,55006L,55007L,\n55008L,55009L,55010L,55011L,55012L,55013L,55014L,55015L,55016L,55017L,\n55018L,55019L,55020L,55021L,55022L,55023L,55024L,55025L,55026L,55027L,\n55028L,55029L,55030L,55031L,55032L,55033L,55034L,55035L,55036L,55037L,\n55038L,55039L,55040L,55041L,55042L,55043L,55044L,55045L,55046L,55047L,\n55048L,55049L,55050L,55051L,55052L,55053L,55054L,55055L,55056L,55057L,\n55058L,55059L,55060L,55061L,55062L,55063L,55064L,55065L,55066L,55067L,\n55068L,55069L,55070L,55071L,55072L,55073L,55074L,55075L,55076L,55077L,\n55078L,55079L,55080L,55081L,55082L,55083L,55084L,55085L,55086L,55087L,\n55088L,55089L,55090L,55091L,55092L,55093L,55094L,55095L,55096L,55097L,\n55098L,55099L,55100L,55101L,55102L,55103L,55104L,55105L,55106L,55107L,\n55108L,55109L,55110L,55111L,55112L,55113L,55114L,55115L,55116L,55117L,\n55118L,55119L,55120L,55121L,55122L,55123L,55124L,55125L,55126L,55127L,\n55128L,55129L,55130L,55131L,55132L,55133L,55134L,55135L,55136L,55137L,\n55138L,55139L,55140L,55141L,55142L,55143L,55144L,55145L,55146L,55147L,\n55148L,55149L,55150L,55151L,55152L,55153L,55154L,55155L,55156L,55157L,\n55158L,55159L,55160L,55161L,55162L,55163L,55164L,55165L,55166L,55167L,\n55168L,55169L,55170L,55171L,55172L,55173L,55174L,55175L,55176L,55177L,\n55178L,55179L,55180L,55181L,55182L,55183L,55184L,55185L,55186L,55187L,\n55188L,55189L,55190L,55191L,55192L,55193L,55194L,55195L,55196L,55197L,\n55198L,55199L,55200L,55201L,55202L,55203L,55204L,55205L,55206L,55207L,\n55208L,55209L,55210L,55211L,55212L,55213L,55214L,55215L,55216L,55217L,\n55218L,55219L,55220L,55221L,55222L,55223L,55224L,55225L,55226L,55227L,\n55228L,55229L,55230L,55231L,55232L,55233L,55234L,55235L,55236L,55237L,\n55238L,55239L,55240L,55241L,55242L,55243L,55244L,55245L,55246L,55247L,\n55248L,55249L,55250L,55251L,55252L,55253L,55254L,55255L,55256L,55257L,\n55258L,55259L,55260L,55261L,55262L,55263L,55264L,55265L,55266L,55267L,\n55268L,55269L,55270L,55271L,55272L,55273L,55274L,55275L,55276L,55277L,\n55278L,55279L,55280L,55281L,55282L,55283L,55284L,55285L,55286L,55287L,\n55288L,55289L,55290L,55291L,55292L,55293L,55294L,55295L,55296L,55297L,\n55298L,55299L,55300L,55301L,55302L,55303L,55304L,55305L,55306L,55307L,\n55308L,55309L,55310L,55311L,55312L,55313L,55314L,55315L,55316L,55317L,\n55318L,55319L,55320L,55321L,55322L,55323L,55324L,55325L,55326L,55327L,\n55328L,55329L,55330L,55331L,55332L,55333L,55334L,55335L,55336L,55337L,\n55338L,55339L,55340L,55341L,55342L,55343L,55344L,55345L,55346L,55347L,\n55348L,55349L,55350L,55351L,55352L,55353L,55354L,55355L,55356L,55357L,\n55358L,55359L,55360L,55361L,55362L,55363L,55364L,55365L,55366L,55367L,\n55368L,55369L,55370L,55371L,55372L,55373L,55374L,55375L,55376L,55377L,\n55378L,55379L,55380L,55381L,55382L,55383L,55384L,55385L,55386L,55387L,\n55388L,55389L,55390L,55391L,55392L,55393L,55394L,55395L,55396L,55397L,\n55398L,55399L,55400L,55401L,55402L,55403L,55404L,55405L,55406L,55407L,\n55408L,55409L,55410L,55411L,55412L,55413L,55414L,55415L,55416L,55417L,\n55418L,55419L,55420L,55421L,55422L,55423L,55424L,55425L,55426L,55427L,\n55428L,55429L,55430L,55431L,55432L,55433L,55434L,55435L,55436L,55437L,\n55438L,55439L,55440L,55441L,55442L,55443L,55444L,55445L,55446L,55447L,\n55448L,55449L,55450L,55451L,55452L,55453L,55454L,55455L,55456L,55457L,\n55458L,55459L,55460L,55461L,55462L,55463L,55464L,55465L,55466L,55467L,\n55468L,55469L,55470L,55471L,55472L,55473L,55474L,55475L,55476L,55477L,\n55478L,55479L,55480L,55481L,55482L,55483L,55484L,55485L,55486L,55487L,\n55488L,55489L,55490L,55491L,55492L,55493L,55494L,55495L,55496L,55497L,\n55498L,55499L,55500L,55501L,55502L,55503L,55504L,55505L,55506L,55507L,\n55508L,55509L,55510L,55511L,55512L,55513L,55514L,55515L,55516L,55517L,\n55518L,55519L,55520L,55521L,55522L,55523L,55524L,55525L,55526L,55527L,\n55528L,55529L,55530L,55531L,55532L,55533L,55534L,55535L,55536L,55537L,\n55538L,55539L,55540L,55541L,55542L,55543L,55544L,55545L,55546L,55547L,\n55548L,55549L,55550L,55551L,55552L,55553L,55554L,55555L,55556L,55557L,\n55558L,55559L,55560L,55561L,55562L,55563L,55564L,55565L,55566L,55567L,\n55568L,55569L,55570L,55571L,55572L,55573L,55574L,55575L,55576L,55577L,\n55578L,55579L,55580L,55581L,55582L,55583L,55584L,55585L,55586L,55587L,\n55588L,55589L,55590L,55591L,55592L,55593L,55594L,55595L,55596L,55597L,\n55598L,55599L,55600L,55601L,55602L,55603L,55604L,55605L,55606L,55607L,\n55608L,55609L,55610L,55611L,55612L,55613L,55614L,55615L,55616L,55617L,\n55618L,55619L,55620L,55621L,55622L,55623L,55624L,55625L,55626L,55627L,\n55628L,55629L,55630L,55631L,55632L,55633L,55634L,55635L,55636L,55637L,\n55638L,55639L,55640L,55641L,55642L,55643L,55644L,55645L,55646L,55647L,\n55648L,55649L,55650L,55651L,55652L,55653L,55654L,55655L,55656L,55657L,\n55658L,55659L,55660L,55661L,55662L,55663L,55664L,55665L,55666L,55667L,\n55668L,55669L,55670L,55671L,55672L,55673L,55674L,55675L,55676L,55677L,\n55678L,55679L,55680L,55681L,55682L,55683L,55684L,55685L,55686L,55687L,\n55688L,55689L,55690L,55691L,55692L,55693L,55694L,55695L,55696L,55697L,\n55698L,55699L,55700L,55701L,55702L,55703L,55704L,55705L,55706L,55707L,\n55708L,55709L,55710L,55711L,55712L,55713L,55714L,55715L,55716L,55717L,\n55718L,55719L,55720L,55721L,55722L,55723L,55724L,55725L,55726L,55727L,\n55728L,55729L,55730L,55731L,55732L,55733L,55734L,55735L,55736L,55737L,\n55738L,55739L,55740L,55741L,55742L,55743L,55744L,55745L,55746L,55747L,\n55748L,55749L,55750L,55751L,55752L,55753L,55754L,55755L,55756L,55757L,\n55758L,55759L,55760L,55761L,55762L,55763L,55764L,55765L,55766L,55767L,\n55768L,55769L,55770L,55771L,55772L,55773L,55774L,55775L,55776L,55777L,\n55778L,55779L,55780L,55781L,55782L,55783L,55784L,55785L,55786L,55787L,\n55788L,55789L,55790L,55791L,55792L,55793L,55794L,55795L,55796L,55797L,\n55798L,55799L,55800L,55801L,55802L,55803L,55804L,55805L,55806L,55807L,\n55808L,55809L,55810L,55811L,55812L,55813L,55814L,55815L,55816L,55817L,\n55818L,55819L,55820L,55821L,55822L,55823L,55824L,55825L,55826L,55827L,\n55828L,55829L,55830L,55831L,55832L,55833L,55834L,55835L,55836L,55837L,\n55838L,55839L,55840L,55841L,55842L,55843L,55844L,55845L,55846L,55847L,\n55848L,55849L,55850L,55851L,55852L,55853L,55854L,55855L,55856L,55857L,\n55858L,55859L,55860L,55861L,55862L,55863L,55864L,55865L,55866L,55867L,\n55868L,55869L,55870L,55871L,55872L,55873L,55874L,55875L,55876L,55877L,\n55878L,55879L,55880L,55881L,55882L,55883L,55884L,55885L,55886L,55887L,\n55888L,55889L,55890L,55891L,55892L,55893L,55894L,55895L,55896L,55897L,\n55898L,55899L,55900L,55901L,55902L,55903L,55904L,55905L,55906L,55907L,\n55908L,55909L,55910L,55911L,55912L,55913L,55914L,55915L,55916L,55917L,\n55918L,55919L,55920L,55921L,55922L,55923L,55924L,55925L,55926L,55927L,\n55928L,55929L,55930L,55931L,55932L,55933L,55934L,55935L,55936L,55937L,\n55938L,55939L,55940L,55941L,55942L,55943L,55944L,55945L,55946L,55947L,\n55948L,55949L,55950L,55951L,55952L,55953L,55954L,55955L,55956L,55957L,\n55958L,55959L,55960L,55961L,55962L,55963L,55964L,55965L,55966L,55967L,\n55968L,55969L,55970L,55971L,55972L,55973L,55974L,55975L,55976L,55977L,\n55978L,55979L,55980L,55981L,55982L,55983L,55984L,55985L,55986L,55987L,\n55988L,55989L,55990L,55991L,55992L,55993L,55994L,55995L,55996L,55997L,\n55998L,55999L,56000L,56001L,56002L,56003L,56004L,56005L,56006L,56007L,\n56008L,56009L,56010L,56011L,56012L,56013L,56014L,56015L,56016L,56017L,\n56018L,56019L,56020L,56021L,56022L,56023L,56024L,56025L,56026L,56027L,\n56028L,56029L,56030L,56031L,56032L,56033L,56034L,56035L,56036L,56037L,\n56038L,56039L,56040L,56041L,56042L,56043L,56044L,56045L,56046L,56047L,\n56048L,56049L,56050L,56051L,56052L,56053L,56054L,56055L,56056L,56057L,\n56058L,56059L,56060L,56061L,56062L,56063L,56064L,56065L,56066L,56067L,\n56068L,56069L,56070L,56071L,56072L,56073L,56074L,56075L,56076L,56077L,\n56078L,56079L,56080L,56081L,56082L,56083L,56084L,56085L,56086L,56087L,\n56088L,56089L,56090L,56091L,56092L,56093L,56094L,56095L,56096L,56097L,\n56098L,56099L,56100L,56101L,56102L,56103L,56104L,56105L,56106L,56107L,\n56108L,56109L,56110L,56111L,56112L,56113L,56114L,56115L,56116L,56117L,\n56118L,56119L,56120L,56121L,56122L,56123L,56124L,56125L,56126L,56127L,\n56128L,56129L,56130L,56131L,56132L,56133L,56134L,56135L,56136L,56137L,\n56138L,56139L,56140L,56141L,56142L,56143L,56144L,56145L,56146L,56147L,\n56148L,56149L,56150L,56151L,56152L,56153L,56154L,56155L,56156L,56157L,\n56158L,56159L,56160L,56161L,56162L,56163L,56164L,56165L,56166L,56167L,\n56168L,56169L,56170L,56171L,56172L,56173L,56174L,56175L,56176L,56177L,\n56178L,56179L,56180L,56181L,56182L,56183L,56184L,56185L,56186L,56187L,\n56188L,56189L,56190L,56191L,56192L,56193L,56194L,56195L,56196L,56197L,\n56198L,56199L,56200L,56201L,56202L,56203L,56204L,56205L,56206L,56207L,\n56208L,56209L,56210L,56211L,56212L,56213L,56214L,56215L,56216L,56217L,\n56218L,56219L,56220L,56221L,56222L,56223L,56224L,56225L,56226L,56227L,\n56228L,56229L,56230L,56231L,56232L,56233L,56234L,56235L,56236L,56237L,\n56238L,56239L,56240L,56241L,56242L,56243L,56244L,56245L,56246L,56247L,\n56248L,56249L,56250L,56251L,56252L,56253L,56254L,56255L,56256L,56257L,\n56258L,56259L,56260L,56261L,56262L,56263L,56264L,56265L,56266L,56267L,\n56268L,56269L,56270L,56271L,56272L,56273L,56274L,56275L,56276L,56277L,\n56278L,56279L,56280L,56281L,56282L,56283L,56284L,56285L,56286L,56287L,\n56288L,56289L,56290L,56291L,56292L,56293L,56294L,56295L,56296L,56297L,\n56298L,56299L,56300L,56301L,56302L,56303L,56304L,56305L,56306L,56307L,\n56308L,56309L,56310L,56311L,56312L,56313L,56314L,56315L,56316L,56317L,\n56318L,56319L,56320L,56321L,56322L,56323L,56324L,56325L,56326L,56327L,\n56328L,56329L,56330L,56331L,56332L,56333L,56334L,56335L,56336L,56337L,\n56338L,56339L,56340L,56341L,56342L,56343L,56344L,56345L,56346L,56347L,\n56348L,56349L,56350L,56351L,56352L,56353L,56354L,56355L,56356L,56357L,\n56358L,56359L,56360L,56361L,56362L,56363L,56364L,56365L,56366L,56367L,\n56368L,56369L,56370L,56371L,56372L,56373L,56374L,56375L,56376L,56377L,\n56378L,56379L,56380L,56381L,56382L,56383L,56384L,56385L,56386L,56387L,\n56388L,56389L,56390L,56391L,56392L,56393L,56394L,56395L,56396L,56397L,\n56398L,56399L,56400L,56401L,56402L,56403L,56404L,56405L,56406L,56407L,\n56408L,56409L,56410L,56411L,56412L,56413L,56414L,56415L,56416L,56417L,\n56418L,56419L,56420L,56421L,56422L,56423L,56424L,56425L,56426L,56427L,\n56428L,56429L,56430L,56431L,56432L,56433L,56434L,56435L,56436L,56437L,\n56438L,56439L,56440L,56441L,56442L,56443L,56444L,56445L,56446L,56447L,\n56448L,56449L,56450L,56451L,56452L,56453L,56454L,56455L,56456L,56457L,\n56458L,56459L,56460L,56461L,56462L,56463L,56464L,56465L,56466L,56467L,\n56468L,56469L,56470L,56471L,56472L,56473L,56474L,56475L,56476L,56477L,\n56478L,56479L,56480L,56481L,56482L,56483L,56484L,56485L,56486L,56487L,\n56488L,56489L,56490L,56491L,56492L,56493L,56494L,56495L,56496L,56497L,\n56498L,56499L,56500L,56501L,56502L,56503L,56504L,56505L,56506L,56507L,\n56508L,56509L,56510L,56511L,56512L,56513L,56514L,56515L,56516L,56517L,\n56518L,56519L,56520L,56521L,56522L,56523L,56524L,56525L,56526L,56527L,\n56528L,56529L,56530L,56531L,56532L,56533L,56534L,56535L,56536L,56537L,\n56538L,56539L,56540L,56541L,56542L,56543L,56544L,56545L,56546L,56547L,\n56548L,56549L,56550L,56551L,56552L,56553L,56554L,56555L,56556L,56557L,\n56558L,56559L,56560L,56561L,56562L,56563L,56564L,56565L,56566L,56567L,\n56568L,56569L,56570L,56571L,56572L,56573L,56574L,56575L,56576L,56577L,\n56578L,56579L,56580L,56581L,56582L,56583L,56584L,56585L,56586L,56587L,\n56588L,56589L,56590L,56591L,56592L,56593L,56594L,56595L,56596L,56597L,\n56598L,56599L,56600L,56601L,56602L,56603L,56604L,56605L,56606L,56607L,\n56608L,56609L,56610L,56611L,56612L,56613L,56614L,56615L,56616L,56617L,\n56618L,56619L,56620L,56621L,56622L,56623L,56624L,56625L,56626L,56627L,\n56628L,56629L,56630L,56631L,56632L,56633L,56634L,56635L,56636L,56637L,\n56638L,56639L,56640L,56641L,56642L,56643L,56644L,56645L,56646L,56647L,\n56648L,56649L,56650L,56651L,56652L,56653L,56654L,56655L,56656L,56657L,\n56658L,56659L,56660L,56661L,56662L,56663L,56664L,56665L,56666L,56667L,\n56668L,56669L,56670L,56671L,56672L,56673L,56674L,56675L,56676L,56677L,\n56678L,56679L,56680L,56681L,56682L,56683L,56684L,56685L,56686L,56687L,\n56688L,56689L,56690L,56691L,56692L,56693L,56694L,56695L,56696L,56697L,\n56698L,56699L,56700L,56701L,56702L,56703L,56704L,56705L,56706L,56707L,\n56708L,56709L,56710L,56711L,56712L,56713L,56714L,56715L,56716L,56717L,\n56718L,56719L,56720L,56721L,56722L,56723L,56724L,56725L,56726L,56727L,\n56728L,56729L,56730L,56731L,56732L,56733L,56734L,56735L,56736L,56737L,\n56738L,56739L,56740L,56741L,56742L,56743L,56744L,56745L,56746L,56747L,\n56748L,56749L,56750L,56751L,56752L,56753L,56754L,56755L,56756L,56757L,\n56758L,56759L,56760L,56761L,56762L,56763L,56764L,56765L,56766L,56767L,\n56768L,56769L,56770L,56771L,56772L,56773L,56774L,56775L,56776L,56777L,\n56778L,56779L,56780L,56781L,56782L,56783L,56784L,56785L,56786L,56787L,\n56788L,56789L,56790L,56791L,56792L,56793L,56794L,56795L,56796L,56797L,\n56798L,56799L,56800L,56801L,56802L,56803L,56804L,56805L,56806L,56807L,\n56808L,56809L,56810L,56811L,56812L,56813L,56814L,56815L,56816L,56817L,\n56818L,56819L,56820L,56821L,56822L,56823L,56824L,56825L,56826L,56827L,\n56828L,56829L,56830L,56831L,56832L,56833L,56834L,56835L,56836L,56837L,\n56838L,56839L,56840L,56841L,56842L,56843L,56844L,56845L,56846L,56847L,\n56848L,56849L,56850L,56851L,56852L,56853L,56854L,56855L,56856L,56857L,\n56858L,56859L,56860L,56861L,56862L,56863L,56864L,56865L,56866L,56867L,\n56868L,56869L,56870L,56871L,56872L,56873L,56874L,56875L,56876L,56877L,\n56878L,56879L,56880L,56881L,56882L,56883L,56884L,56885L,56886L,56887L,\n56888L,56889L,56890L,56891L,56892L,56893L,56894L,56895L,56896L,56897L,\n56898L,56899L,56900L,56901L,56902L,56903L,56904L,56905L,56906L,56907L,\n56908L,56909L,56910L,56911L,56912L,56913L,56914L,56915L,56916L,56917L,\n56918L,56919L,56920L,56921L,56922L,56923L,56924L,56925L,56926L,56927L,\n56928L,56929L,56930L,56931L,56932L,56933L,56934L,56935L,56936L,56937L,\n56938L,56939L,56940L,56941L,56942L,56943L,56944L,56945L,56946L,56947L,\n56948L,56949L,56950L,56951L,56952L,56953L,56954L,56955L,56956L,56957L,\n56958L,56959L,56960L,56961L,56962L,56963L,56964L,56965L,56966L,56967L,\n56968L,56969L,56970L,56971L,56972L,56973L,56974L,56975L,56976L,56977L,\n56978L,56979L,56980L,56981L,56982L,56983L,56984L,56985L,56986L,56987L,\n56988L,56989L,56990L,56991L,56992L,56993L,56994L,56995L,56996L,56997L,\n56998L,56999L,57000L,57001L,57002L,57003L,57004L,57005L,57006L,57007L,\n57008L,57009L,57010L,57011L,57012L,57013L,57014L,57015L,57016L,57017L,\n57018L,57019L,57020L,57021L,57022L,57023L,57024L,57025L,57026L,57027L,\n57028L,57029L,57030L,57031L,57032L,57033L,57034L,57035L,57036L,57037L,\n57038L,57039L,57040L,57041L,57042L,57043L,57044L,57045L,57046L,57047L,\n57048L,57049L,57050L,57051L,57052L,57053L,57054L,57055L,57056L,57057L,\n57058L,57059L,57060L,57061L,57062L,57063L,57064L,57065L,57066L,57067L,\n57068L,57069L,57070L,57071L,57072L,57073L,57074L,57075L,57076L,57077L,\n57078L,57079L,57080L,57081L,57082L,57083L,57084L,57085L,57086L,57087L,\n57088L,57089L,57090L,57091L,57092L,57093L,57094L,57095L,57096L,57097L,\n57098L,57099L,57100L,57101L,57102L,57103L,57104L,57105L,57106L,57107L,\n57108L,57109L,57110L,57111L,57112L,57113L,57114L,57115L,57116L,57117L,\n57118L,57119L,57120L,57121L,57122L,57123L,57124L,57125L,57126L,57127L,\n57128L,57129L,57130L,57131L,57132L,57133L,57134L,57135L,57136L,57137L,\n57138L,57139L,57140L,57141L,57142L,57143L,57144L,57145L,57146L,57147L,\n57148L,57149L,57150L,57151L,57152L,57153L,57154L,57155L,57156L,57157L,\n57158L,57159L,57160L,57161L,57162L,57163L,57164L,57165L,57166L,57167L,\n57168L,57169L,57170L,57171L,57172L,57173L,57174L,57175L,57176L,57177L,\n57178L,57179L,57180L,57181L,57182L,57183L,57184L,57185L,57186L,57187L,\n57188L,57189L,57190L,57191L,57192L,57193L,57194L,57195L,57196L,57197L,\n57198L,57199L,57200L,57201L,57202L,57203L,57204L,57205L,57206L,57207L,\n57208L,57209L,57210L,57211L,57212L,57213L,57214L,57215L,57216L,57217L,\n57218L,57219L,57220L,57221L,57222L,57223L,57224L,57225L,57226L,57227L,\n57228L,57229L,57230L,57231L,57232L,57233L,57234L,57235L,57236L,57237L,\n57238L,57239L,57240L,57241L,57242L,57243L,57244L,57245L,57246L,57247L,\n57248L,57249L,57250L,57251L,57252L,57253L,57254L,57255L,57256L,57257L,\n57258L,57259L,57260L,57261L,57262L,57263L,57264L,57265L,57266L,57267L,\n57268L,57269L,57270L,57271L,57272L,57273L,57274L,57275L,57276L,57277L,\n57278L,57279L,57280L,57281L,57282L,57283L,57284L,57285L,57286L,57287L,\n57288L,57289L,57290L,57291L,57292L,57293L,57294L,57295L,57296L,57297L,\n57298L,57299L,57300L,57301L,57302L,57303L,57304L,57305L,57306L,57307L,\n57308L,57309L,57310L,57311L,57312L,57313L,57314L,57315L,57316L,57317L,\n57318L,57319L,57320L,57321L,57322L,57323L,57324L,57325L,57326L,57327L,\n57328L,57329L,57330L,57331L,57332L,57333L,57334L,57335L,57336L,57337L,\n57338L,57339L,57340L,57341L,57342L,57343L,57344L,57345L,57346L,57347L,\n57348L,57349L,57350L,57351L,57352L,57353L,57354L,57355L,57356L,57357L,\n57358L,57359L,57360L,57361L,57362L,57363L,57364L,57365L,57366L,57367L,\n57368L,57369L,57370L,57371L,57372L,57373L,57374L,57375L,57376L,57377L,\n57378L,57379L,57380L,57381L,57382L,57383L,57384L,57385L,57386L,57387L,\n57388L,57389L,57390L,57391L,57392L,57393L,57394L,57395L,57396L,57397L,\n57398L,57399L,57400L,57401L,57402L,57403L,57404L,57405L,57406L,57407L,\n57408L,57409L,57410L,57411L,57412L,57413L,57414L,57415L,57416L,57417L,\n57418L,57419L,57420L,57421L,57422L,57423L,57424L,57425L,57426L,57427L,\n57428L,57429L,57430L,57431L,57432L,57433L,57434L,57435L,57436L,57437L,\n57438L,57439L,57440L,57441L,57442L,57443L,57444L,57445L,57446L,57447L,\n57448L,57449L,57450L,57451L,57452L,57453L,57454L,57455L,57456L,57457L,\n57458L,57459L,57460L,57461L,57462L,57463L,57464L,57465L,57466L,57467L,\n57468L,57469L,57470L,57471L,57472L,57473L,57474L,57475L,57476L,57477L,\n57478L,57479L,57480L,57481L,57482L,57483L,57484L,57485L,57486L,57487L,\n57488L,57489L,57490L,57491L,57492L,57493L,57494L,57495L,57496L,57497L,\n57498L,57499L,57500L,57501L,57502L,57503L,57504L,57505L,57506L,57507L,\n57508L,57509L,57510L,57511L,57512L,57513L,57514L,57515L,57516L,57517L,\n57518L,57519L,57520L,57521L,57522L,57523L,57524L,57525L,57526L,57527L,\n57528L,57529L,57530L,57531L,57532L,57533L,57534L,57535L,57536L,57537L,\n57538L,57539L,57540L,57541L,57542L,57543L,57544L,57545L,57546L,57547L,\n57548L,57549L,57550L,57551L,57552L,57553L,57554L,57555L,57556L,57557L,\n57558L,57559L,57560L,57561L,57562L,57563L,57564L,57565L,57566L,57567L,\n57568L,57569L,57570L,57571L,57572L,57573L,57574L,57575L,57576L,57577L,\n57578L,57579L,57580L,57581L,57582L,57583L,57584L,57585L,57586L,57587L,\n57588L,57589L,57590L,57591L,57592L,57593L,57594L,57595L,57596L,57597L,\n57598L,57599L,57600L,57601L,57602L,57603L,57604L,57605L,57606L,57607L,\n57608L,57609L,57610L,57611L,57612L,57613L,57614L,57615L,57616L,57617L,\n57618L,57619L,57620L,57621L,57622L,57623L,57624L,57625L,57626L,57627L,\n57628L,57629L,57630L,57631L,57632L,57633L,57634L,57635L,57636L,57637L,\n57638L,57639L,57640L,57641L,57642L,57643L,57644L,57645L,57646L,57647L,\n57648L,57649L,57650L,57651L,57652L,57653L,57654L,57655L,57656L,57657L,\n57658L,57659L,57660L,57661L,57662L,57663L,57664L,57665L,57666L,57667L,\n57668L,57669L,57670L,57671L,57672L,57673L,57674L,57675L,57676L,57677L,\n57678L,57679L,57680L,57681L,57682L,57683L,57684L,57685L,57686L,57687L,\n57688L,57689L,57690L,57691L,57692L,57693L,57694L,57695L,57696L,57697L,\n57698L,57699L,57700L,57701L,57702L,57703L,57704L,57705L,57706L,57707L,\n57708L,57709L,57710L,57711L,57712L,57713L,57714L,57715L,57716L,57717L,\n57718L,57719L,57720L,57721L,57722L,57723L,57724L,57725L,57726L,57727L,\n57728L,57729L,57730L,57731L,57732L,57733L,57734L,57735L,57736L,57737L,\n57738L,57739L,57740L,57741L,57742L,57743L,57744L,57745L,57746L,57747L,\n57748L,57749L,57750L,57751L,57752L,57753L,57754L,57755L,57756L,57757L,\n57758L,57759L,57760L,57761L,57762L,57763L,57764L,57765L,57766L,57767L,\n57768L,57769L,57770L,57771L,57772L,57773L,57774L,57775L,57776L,57777L,\n57778L,57779L,57780L,57781L,57782L,57783L,57784L,57785L,57786L,57787L,\n57788L,57789L,57790L,57791L,57792L,57793L,57794L,57795L,57796L,57797L,\n57798L,57799L,57800L,57801L,57802L,57803L,57804L,57805L,57806L,57807L,\n57808L,57809L,57810L,57811L,57812L,57813L,57814L,57815L,57816L,57817L,\n57818L,57819L,57820L,57821L,57822L,57823L,57824L,57825L,57826L,57827L,\n57828L,57829L,57830L,57831L,57832L,57833L,57834L,57835L,57836L,57837L,\n57838L,57839L,57840L,57841L,57842L,57843L,57844L,57845L,57846L,57847L,\n57848L,57849L,57850L,57851L,57852L,57853L,57854L,57855L,57856L,57857L,\n57858L,57859L,57860L,57861L,57862L,57863L,57864L,57865L,57866L,57867L,\n57868L,57869L,57870L,57871L,57872L,57873L,57874L,57875L,57876L,57877L,\n57878L,57879L,57880L,57881L,57882L,57883L,57884L,57885L,57886L,57887L,\n57888L,57889L,57890L,57891L,57892L,57893L,57894L,57895L,57896L,57897L,\n57898L,57899L,57900L,57901L,57902L,57903L,57904L,57905L,57906L,57907L,\n57908L,57909L,57910L,57911L,57912L,57913L,57914L,57915L,57916L,57917L,\n57918L,57919L,57920L,57921L,57922L,57923L,57924L,57925L,57926L,57927L,\n57928L,57929L,57930L,57931L,57932L,57933L,57934L,57935L,57936L,57937L,\n57938L,57939L,57940L,57941L,57942L,57943L,57944L,57945L,57946L,57947L,\n57948L,57949L,57950L,57951L,57952L,57953L,57954L,57955L,57956L,57957L,\n57958L,57959L,57960L,57961L,57962L,57963L,57964L,57965L,57966L,57967L,\n57968L,57969L,57970L,57971L,57972L,57973L,57974L,57975L,57976L,57977L,\n57978L,57979L,57980L,57981L,57982L,57983L,57984L,57985L,57986L,57987L,\n57988L,57989L,57990L,57991L,57992L,57993L,57994L,57995L,57996L,57997L,\n57998L,57999L,58000L,58001L,58002L,58003L,58004L,58005L,58006L,58007L,\n58008L,58009L,58010L,58011L,58012L,58013L,58014L,58015L,58016L,58017L,\n58018L,58019L,58020L,58021L,58022L,58023L,58024L,58025L,58026L,58027L,\n58028L,58029L,58030L,58031L,58032L,58033L,58034L,58035L,58036L,58037L,\n58038L,58039L,58040L,58041L,58042L,58043L,58044L,58045L,58046L,58047L,\n58048L,58049L,58050L,58051L,58052L,58053L,58054L,58055L,58056L,58057L,\n58058L,58059L,58060L,58061L,58062L,58063L,58064L,58065L,58066L,58067L,\n58068L,58069L,58070L,58071L,58072L,58073L,58074L,58075L,58076L,58077L,\n58078L,58079L,58080L,58081L,58082L,58083L,58084L,58085L,58086L,58087L,\n58088L,58089L,58090L,58091L,58092L,58093L,58094L,58095L,58096L,58097L,\n58098L,58099L,58100L,58101L,58102L,58103L,58104L,58105L,58106L,58107L,\n58108L,58109L,58110L,58111L,58112L,58113L,58114L,58115L,58116L,58117L,\n58118L,58119L,58120L,58121L,58122L,58123L,58124L,58125L,58126L,58127L,\n58128L,58129L,58130L,58131L,58132L,58133L,58134L,58135L,58136L,58137L,\n58138L,58139L,58140L,58141L,58142L,58143L,58144L,58145L,58146L,58147L,\n58148L,58149L,58150L,58151L,58152L,58153L,58154L,58155L,58156L,58157L,\n58158L,58159L,58160L,58161L,58162L,58163L,58164L,58165L,58166L,58167L,\n58168L,58169L,58170L,58171L,58172L,58173L,58174L,58175L,58176L,58177L,\n58178L,58179L,58180L,58181L,58182L,58183L,58184L,58185L,58186L,58187L,\n58188L,58189L,58190L,58191L,58192L,58193L,58194L,58195L,58196L,58197L,\n58198L,58199L,58200L,58201L,58202L,58203L,58204L,58205L,58206L,58207L,\n58208L,58209L,58210L,58211L,58212L,58213L,58214L,58215L,58216L,58217L,\n58218L,58219L,58220L,58221L,58222L,58223L,58224L,58225L,58226L,58227L,\n58228L,58229L,58230L,58231L,58232L,58233L,58234L,58235L,58236L,58237L,\n58238L,58239L,58240L,58241L,58242L,58243L,58244L,58245L,58246L,58247L,\n58248L,58249L,58250L,58251L,58252L,58253L,58254L,58255L,58256L,58257L,\n58258L,58259L,58260L,58261L,58262L,58263L,58264L,58265L,58266L,58267L,\n58268L,58269L,58270L,58271L,58272L,58273L,58274L,58275L,58276L,58277L,\n58278L,58279L,58280L,58281L,58282L,58283L,58284L,58285L,58286L,58287L,\n58288L,58289L,58290L,58291L,58292L,58293L,58294L,58295L,58296L,58297L,\n58298L,58299L,58300L,58301L,58302L,58303L,58304L,58305L,58306L,58307L,\n58308L,58309L,58310L,58311L,58312L,58313L,58314L,58315L,58316L,58317L,\n58318L,58319L,58320L,58321L,58322L,58323L,58324L,58325L,58326L,58327L,\n58328L,58329L,58330L,58331L,58332L,58333L,58334L,58335L,58336L,58337L,\n58338L,58339L,58340L,58341L,58342L,58343L,58344L,58345L,58346L,58347L,\n58348L,58349L,58350L,58351L,58352L,58353L,58354L,58355L,58356L,58357L,\n58358L,58359L,58360L,58361L,58362L,58363L,58364L,58365L,58366L,58367L,\n58368L,58369L,58370L,58371L,58372L,58373L,58374L,58375L,58376L,58377L,\n58378L,58379L,58380L,58381L,58382L,58383L,58384L,58385L,58386L,58387L,\n58388L,58389L,58390L,58391L,58392L,58393L,58394L,58395L,58396L,58397L,\n58398L,58399L,58400L,58401L,58402L,58403L,58404L,58405L,58406L,58407L,\n58408L,58409L,58410L,58411L,58412L,58413L,58414L,58415L,58416L,58417L,\n58418L,58419L,58420L,58421L,58422L,58423L,58424L,58425L,58426L,58427L,\n58428L,58429L,58430L,58431L,58432L,58433L,58434L,58435L,58436L,58437L,\n58438L,58439L,58440L,58441L,58442L,58443L,58444L,58445L,58446L,58447L,\n58448L,58449L,58450L,58451L,58452L,58453L,58454L,58455L,58456L,58457L,\n58458L,58459L,58460L,58461L,58462L,58463L,58464L,58465L,58466L,58467L,\n58468L,58469L,58470L,58471L,58472L,58473L,58474L,58475L,58476L,58477L,\n58478L,58479L,58480L,58481L,58482L,58483L,58484L,58485L,58486L,58487L,\n58488L,58489L,58490L,58491L,58492L,58493L,58494L,58495L,58496L,58497L,\n58498L,58499L,58500L,58501L,58502L,58503L,58504L,58505L,58506L,58507L,\n58508L,58509L,58510L,58511L,58512L,58513L,58514L,58515L,58516L,58517L,\n58518L,58519L,58520L,58521L,58522L,58523L,58524L,58525L,58526L,58527L,\n58528L,58529L,58530L,58531L,58532L,58533L,58534L,58535L,58536L,58537L,\n58538L,58539L,58540L,58541L,58542L,58543L,58544L,58545L,58546L,58547L,\n58548L,58549L,58550L,58551L,58552L,58553L,58554L,58555L,58556L,58557L,\n58558L,58559L,58560L,58561L,58562L,58563L,58564L,58565L,58566L,58567L,\n58568L,58569L,58570L,58571L,58572L,58573L,58574L,58575L,58576L,58577L,\n58578L,58579L,58580L,58581L,58582L,58583L,58584L,58585L,58586L,58587L,\n58588L,58589L,58590L,58591L,58592L,58593L,58594L,58595L,58596L,58597L,\n58598L,58599L,58600L,58601L,58602L,58603L,58604L,58605L,58606L,58607L,\n58608L,58609L,58610L,58611L,58612L,58613L,58614L,58615L,58616L,58617L,\n58618L,58619L,58620L,58621L,58622L,58623L,58624L,58625L,58626L,58627L,\n58628L,58629L,58630L,58631L,58632L,58633L,58634L,58635L,58636L,58637L,\n58638L,58639L,58640L,58641L,58642L,58643L,58644L,58645L,58646L,58647L,\n58648L,58649L,58650L,58651L,58652L,58653L,58654L,58655L,58656L,58657L,\n58658L,58659L,58660L,58661L,58662L,58663L,58664L,58665L,58666L,58667L,\n58668L,58669L,58670L,58671L,58672L,58673L,58674L,58675L,58676L,58677L,\n58678L,58679L,58680L,58681L,58682L,58683L,58684L,58685L,58686L,58687L,\n58688L,58689L,58690L,58691L,58692L,58693L,58694L,58695L,58696L,58697L,\n58698L,58699L,58700L,58701L,58702L,58703L,58704L,58705L,58706L,58707L,\n58708L,58709L,58710L,58711L,58712L,58713L,58714L,58715L,58716L,58717L,\n58718L,58719L,58720L,58721L,58722L,58723L,58724L,58725L,58726L,58727L,\n58728L,58729L,58730L,58731L,58732L,58733L,58734L,58735L,58736L,58737L,\n58738L,58739L,58740L,58741L,58742L,58743L,58744L,58745L,58746L,58747L,\n58748L,58749L,58750L,58751L,58752L,58753L,58754L,58755L,58756L,58757L,\n58758L,58759L,58760L,58761L,58762L,58763L,58764L,58765L,58766L,58767L,\n58768L,58769L,58770L,58771L,58772L,58773L,58774L,58775L,58776L,58777L,\n58778L,58779L,58780L,58781L,58782L,58783L,58784L,58785L,58786L,58787L,\n58788L,58789L,58790L,58791L,58792L,58793L,58794L,58795L,58796L,58797L,\n58798L,58799L,58800L,58801L,58802L,58803L,58804L,58805L,58806L,58807L,\n58808L,58809L,58810L,58811L,58812L,58813L,58814L,58815L,58816L,58817L,\n58818L,58819L,58820L,58821L,58822L,58823L,58824L,58825L,58826L,58827L,\n58828L,58829L,58830L,58831L,58832L,58833L,58834L,58835L,58836L,58837L,\n58838L,58839L,58840L,58841L,58842L,58843L,58844L,58845L,58846L,58847L,\n58848L,58849L,58850L,58851L,58852L,58853L,58854L,58855L,58856L,58857L,\n58858L,58859L,58860L,58861L,58862L,58863L,58864L,58865L,58866L,58867L,\n58868L,58869L,58870L,58871L,58872L,58873L,58874L,58875L,58876L,58877L,\n58878L,58879L,58880L,58881L,58882L,58883L,58884L,58885L,58886L,58887L,\n58888L,58889L,58890L,58891L,58892L,58893L,58894L,58895L,58896L,58897L,\n58898L,58899L,58900L,58901L,58902L,58903L,58904L,58905L,58906L,58907L,\n58908L,58909L,58910L,58911L,58912L,58913L,58914L,58915L,58916L,58917L,\n58918L,58919L,58920L,58921L,58922L,58923L,58924L,58925L,58926L,58927L,\n58928L,58929L,58930L,58931L,58932L,58933L,58934L,58935L,58936L,58937L,\n58938L,58939L,58940L,58941L,58942L,58943L,58944L,58945L,58946L,58947L,\n58948L,58949L,58950L,58951L,58952L,58953L,58954L,58955L,58956L,58957L,\n58958L,58959L,58960L,58961L,58962L,58963L,58964L,58965L,58966L,58967L,\n58968L,58969L,58970L,58971L,58972L,58973L,58974L,58975L,58976L,58977L,\n58978L,58979L,58980L,58981L,58982L,58983L,58984L,58985L,58986L,58987L,\n58988L,58989L,58990L,58991L,58992L,58993L,58994L,58995L,58996L,58997L,\n58998L,58999L,59000L,59001L,59002L,59003L,59004L,59005L,59006L,59007L,\n59008L,59009L,59010L,59011L,59012L,59013L,59014L,59015L,59016L,59017L,\n59018L,59019L,59020L,59021L,59022L,59023L,59024L,59025L,59026L,59027L,\n59028L,59029L,59030L,59031L,59032L,59033L,59034L,59035L,59036L,59037L,\n59038L,59039L,59040L,59041L,59042L,59043L,59044L,59045L,59046L,59047L,\n59048L,59049L,59050L,59051L,59052L,59053L,59054L,59055L,59056L,59057L,\n59058L,59059L,59060L,59061L,59062L,59063L,59064L,59065L,59066L,59067L,\n59068L,59069L,59070L,59071L,59072L,59073L,59074L,59075L,59076L,59077L,\n59078L,59079L,59080L,59081L,59082L,59083L,59084L,59085L,59086L,59087L,\n59088L,59089L,59090L,59091L,59092L,59093L,59094L,59095L,59096L,59097L,\n59098L,59099L,59100L,59101L,59102L,59103L,59104L,59105L,59106L,59107L,\n59108L,59109L,59110L,59111L,59112L,59113L,59114L,59115L,59116L,59117L,\n59118L,59119L,59120L,59121L,59122L,59123L,59124L,59125L,59126L,59127L,\n59128L,59129L,59130L,59131L,59132L,59133L,59134L,59135L,59136L,59137L,\n59138L,59139L,59140L,59141L,59142L,59143L,59144L,59145L,59146L,59147L,\n59148L,59149L,59150L,59151L,59152L,59153L,59154L,59155L,59156L,59157L,\n59158L,59159L,59160L,59161L,59162L,59163L,59164L,59165L,59166L,59167L,\n59168L,59169L,59170L,59171L,59172L,59173L,59174L,59175L,59176L,59177L,\n59178L,59179L,59180L,59181L,59182L,59183L,59184L,59185L,59186L,59187L,\n59188L,59189L,59190L,59191L,59192L,59193L,59194L,59195L,59196L,59197L,\n59198L,59199L,59200L,59201L,59202L,59203L,59204L,59205L,59206L,59207L,\n59208L,59209L,59210L,59211L,59212L,59213L,59214L,59215L,59216L,59217L,\n59218L,59219L,59220L,59221L,59222L,59223L,59224L,59225L,59226L,59227L,\n59228L,59229L,59230L,59231L,59232L,59233L,59234L,59235L,59236L,59237L,\n59238L,59239L,59240L,59241L,59242L,59243L,59244L,59245L,59246L,59247L,\n59248L,59249L,59250L,59251L,59252L,59253L,59254L,59255L,59256L,59257L,\n59258L,59259L,59260L,59261L,59262L,59263L,59264L,59265L,59266L,59267L,\n59268L,59269L,59270L,59271L,59272L,59273L,59274L,59275L,59276L,59277L,\n59278L,59279L,59280L,59281L,59282L,59283L,59284L,59285L,59286L,59287L,\n59288L,59289L,59290L,59291L,59292L,59293L,59294L,59295L,59296L,59297L,\n59298L,59299L,59300L,59301L,59302L,59303L,59304L,59305L,59306L,59307L,\n59308L,59309L,59310L,59311L,59312L,59313L,59314L,59315L,59316L,59317L,\n59318L,59319L,59320L,59321L,59322L,59323L,59324L,59325L,59326L,59327L,\n59328L,59329L,59330L,59331L,59332L,59333L,59334L,59335L,59336L,59337L,\n59338L,59339L,59340L,59341L,59342L,59343L,59344L,59345L,59346L,59347L,\n59348L,59349L,59350L,59351L,59352L,59353L,59354L,59355L,59356L,59357L,\n59358L,59359L,59360L,59361L,59362L,59363L,59364L,59365L,59366L,59367L,\n59368L,59369L,59370L,59371L,59372L,59373L,59374L,59375L,59376L,59377L,\n59378L,59379L,59380L,59381L,59382L,59383L,59384L,59385L,59386L,59387L,\n59388L,59389L,59390L,59391L,59392L,59393L,59394L,59395L,59396L,59397L,\n59398L,59399L,59400L,59401L,59402L,59403L,59404L,59405L,59406L,59407L,\n59408L,59409L,59410L,59411L,59412L,59413L,59414L,59415L,59416L,59417L,\n59418L,59419L,59420L,59421L,59422L,59423L,59424L,59425L,59426L,59427L,\n59428L,59429L,59430L,59431L,59432L,59433L,59434L,59435L,59436L,59437L,\n59438L,59439L,59440L,59441L,59442L,59443L,59444L,59445L,59446L,59447L,\n59448L,59449L,59450L,59451L,59452L,59453L,59454L,59455L,59456L,59457L,\n59458L,59459L,59460L,59461L,59462L,59463L,59464L,59465L,59466L,59467L,\n59468L,59469L,59470L,59471L,59472L,59473L,59474L,59475L,59476L,59477L,\n59478L,59479L,59480L,59481L,59482L,59483L,59484L,59485L,59486L,59487L,\n59488L,59489L,59490L,59491L,59492L,59493L,59494L,59495L,59496L,59497L,\n59498L,59499L,59500L,59501L,59502L,59503L,59504L,59505L,59506L,59507L,\n59508L,59509L,59510L,59511L,59512L,59513L,59514L,59515L,59516L,59517L,\n59518L,59519L,59520L,59521L,59522L,59523L,59524L,59525L,59526L,59527L,\n59528L,59529L,59530L,59531L,59532L,59533L,59534L,59535L,59536L,59537L,\n59538L,59539L,59540L,59541L,59542L,59543L,59544L,59545L,59546L,59547L,\n59548L,59549L,59550L,59551L,59552L,59553L,59554L,59555L,59556L,59557L,\n59558L,59559L,59560L,59561L,59562L,59563L,59564L,59565L,59566L,59567L,\n59568L,59569L,59570L,59571L,59572L,59573L,59574L,59575L,59576L,59577L,\n59578L,59579L,59580L,59581L,59582L,59583L,59584L,59585L,59586L,59587L,\n59588L,59589L,59590L,59591L,59592L,59593L,59594L,59595L,59596L,59597L,\n59598L,59599L,59600L,59601L,59602L,59603L,59604L,59605L,59606L,59607L,\n59608L,59609L,59610L,59611L,59612L,59613L,59614L,59615L,59616L,59617L,\n59618L,59619L,59620L,59621L,59622L,59623L,59624L,59625L,59626L,59627L,\n59628L,59629L,59630L,59631L,59632L,59633L,59634L,59635L,59636L,59637L,\n59638L,59639L,59640L,59641L,59642L,59643L,59644L,59645L,59646L,59647L,\n59648L,59649L,59650L,59651L,59652L,59653L,59654L,59655L,59656L,59657L,\n59658L,59659L,59660L,59661L,59662L,59663L,59664L,59665L,59666L,59667L,\n59668L,59669L,59670L,59671L,59672L,59673L,59674L,59675L,59676L,59677L,\n59678L,59679L,59680L,59681L,59682L,59683L,59684L,59685L,59686L,59687L,\n59688L,59689L,59690L,59691L,59692L,59693L,59694L,59695L,59696L,59697L,\n59698L,59699L,59700L,59701L,59702L,59703L,59704L,59705L,59706L,59707L,\n59708L,59709L,59710L,59711L,59712L,59713L,59714L,59715L,59716L,59717L,\n59718L,59719L,59720L,59721L,59722L,59723L,59724L,59725L,59726L,59727L,\n59728L,59729L,59730L,59731L,59732L,59733L,59734L,59735L,59736L,59737L,\n59738L,59739L,59740L,59741L,59742L,59743L,59744L,59745L,59746L,59747L,\n59748L,59749L,59750L,59751L,59752L,59753L,59754L,59755L,59756L,59757L,\n59758L,59759L,59760L,59761L,59762L,59763L,59764L,59765L,59766L,59767L,\n59768L,59769L,59770L,59771L,59772L,59773L,59774L,59775L,59776L,59777L,\n59778L,59779L,59780L,59781L,59782L,59783L,59784L,59785L,59786L,59787L,\n59788L,59789L,59790L,59791L,59792L,59793L,59794L,59795L,59796L,59797L,\n59798L,59799L,59800L,59801L,59802L,59803L,59804L,59805L,59806L,59807L,\n59808L,59809L,59810L,59811L,59812L,59813L,59814L,59815L,59816L,59817L,\n59818L,59819L,59820L,59821L,59822L,59823L,59824L,59825L,59826L,59827L,\n59828L,59829L,59830L,59831L,59832L,59833L,59834L,59835L,59836L,59837L,\n59838L,59839L,59840L,59841L,59842L,59843L,59844L,59845L,59846L,59847L,\n59848L,59849L,59850L,59851L,59852L,59853L,59854L,59855L,59856L,59857L,\n59858L,59859L,59860L,59861L,59862L,59863L,59864L,59865L,59866L,59867L,\n59868L,59869L,59870L,59871L,59872L,59873L,59874L,59875L,59876L,59877L,\n59878L,59879L,59880L,59881L,59882L,59883L,59884L,59885L,59886L,59887L,\n59888L,59889L,59890L,59891L,59892L,59893L,59894L,59895L,59896L,59897L,\n59898L,59899L,59900L,59901L,59902L,59903L,59904L,59905L,59906L,59907L,\n59908L,59909L,59910L,59911L,59912L,59913L,59914L,59915L,59916L,59917L,\n59918L,59919L,59920L,59921L,59922L,59923L,59924L,59925L,59926L,59927L,\n59928L,59929L,59930L,59931L,59932L,59933L,59934L,59935L,59936L,59937L,\n59938L,59939L,59940L,59941L,59942L,59943L,59944L,59945L,59946L,59947L,\n59948L,59949L,59950L,59951L,59952L,59953L,59954L,59955L,59956L,59957L,\n59958L,59959L,59960L,59961L,59962L,59963L,59964L,59965L,59966L,59967L,\n59968L,59969L,59970L,59971L,59972L,59973L,59974L,59975L,59976L,59977L,\n59978L,59979L,59980L,59981L,59982L,59983L,59984L,59985L,59986L,59987L,\n59988L,59989L,59990L,59991L,59992L,59993L,59994L,59995L,59996L,59997L,\n59998L,59999L,60000L,60001L,60002L,60003L,60004L,60005L,60006L,60007L,\n60008L,60009L,60010L,60011L,60012L,60013L,60014L,60015L,60016L,60017L,\n60018L,60019L,60020L,60021L,60022L,60023L,60024L,60025L,60026L,60027L,\n60028L,60029L,60030L,60031L,60032L,60033L,60034L,60035L,60036L,60037L,\n60038L,60039L,60040L,60041L,60042L,60043L,60044L,60045L,60046L,60047L,\n60048L,60049L,60050L,60051L,60052L,60053L,60054L,60055L,60056L,60057L,\n60058L,60059L,60060L,60061L,60062L,60063L,60064L,60065L,60066L,60067L,\n60068L,60069L,60070L,60071L,60072L,60073L,60074L,60075L,60076L,60077L,\n60078L,60079L,60080L,60081L,60082L,60083L,60084L,60085L,60086L,60087L,\n60088L,60089L,60090L,60091L,60092L,60093L,60094L,60095L,60096L,60097L,\n60098L,60099L,60100L,60101L,60102L,60103L,60104L,60105L,60106L,60107L,\n60108L,60109L,60110L,60111L,60112L,60113L,60114L,60115L,60116L,60117L,\n60118L,60119L,60120L,60121L,60122L,60123L,60124L,60125L,60126L,60127L,\n60128L,60129L,60130L,60131L,60132L,60133L,60134L,60135L,60136L,60137L,\n60138L,60139L,60140L,60141L,60142L,60143L,60144L,60145L,60146L,60147L,\n60148L,60149L,60150L,60151L,60152L,60153L,60154L,60155L,60156L,60157L,\n60158L,60159L,60160L,60161L,60162L,60163L,60164L,60165L,60166L,60167L,\n60168L,60169L,60170L,60171L,60172L,60173L,60174L,60175L,60176L,60177L,\n60178L,60179L,60180L,60181L,60182L,60183L,60184L,60185L,60186L,60187L,\n60188L,60189L,60190L,60191L,60192L,60193L,60194L,60195L,60196L,60197L,\n60198L,60199L,60200L,60201L,60202L,60203L,60204L,60205L,60206L,60207L,\n60208L,60209L,60210L,60211L,60212L,60213L,60214L,60215L,60216L,60217L,\n60218L,60219L,60220L,60221L,60222L,60223L,60224L,60225L,60226L,60227L,\n60228L,60229L,60230L,60231L,60232L,60233L,60234L,60235L,60236L,60237L,\n60238L,60239L,60240L,60241L,60242L,60243L,60244L,60245L,60246L,60247L,\n60248L,60249L,60250L,60251L,60252L,60253L,60254L,60255L,60256L,60257L,\n60258L,60259L,60260L,60261L,60262L,60263L,60264L,60265L,60266L,60267L,\n60268L,60269L,60270L,60271L,60272L,60273L,60274L,60275L,60276L,60277L,\n60278L,60279L,60280L,60281L,60282L,60283L,60284L,60285L,60286L,60287L,\n60288L,60289L,60290L,60291L,60292L,60293L,60294L,60295L,60296L,60297L,\n60298L,60299L,60300L,60301L,60302L,60303L,60304L,60305L,60306L,60307L,\n60308L,60309L,60310L,60311L,60312L,60313L,60314L,60315L,60316L,60317L,\n60318L,60319L,60320L,60321L,60322L,60323L,60324L,60325L,60326L,60327L,\n60328L,60329L,60330L,60331L,60332L,60333L,60334L,60335L,60336L,60337L,\n60338L,60339L,60340L,60341L,60342L,60343L,60344L,60345L,60346L,60347L,\n60348L,60349L,60350L,60351L,60352L,60353L,60354L,60355L,60356L,60357L,\n60358L,60359L,60360L,60361L,60362L,60363L,60364L,60365L,60366L,60367L,\n60368L,60369L,60370L,60371L,60372L,60373L,60374L,60375L,60376L,60377L,\n60378L,60379L,60380L,60381L,60382L,60383L,60384L,60385L,60386L,60387L,\n60388L,60389L,60390L,60391L,60392L,60393L,60394L,60395L,60396L,60397L,\n60398L,60399L,60400L,60401L,60402L,60403L,60404L,60405L,60406L,60407L,\n60408L,60409L,60410L,60411L,60412L,60413L,60414L,60415L,60416L,60417L,\n60418L,60419L,60420L,60421L,60422L,60423L,60424L,60425L,60426L,60427L,\n60428L,60429L,60430L,60431L,60432L,60433L,60434L,60435L,60436L,60437L,\n60438L,60439L,60440L,60441L,60442L,60443L,60444L,60445L,60446L,60447L,\n60448L,60449L,60450L,60451L,60452L,60453L,60454L,60455L,60456L,60457L,\n60458L,60459L,60460L,60461L,60462L,60463L,60464L,60465L,60466L,60467L,\n60468L,60469L,60470L,60471L,60472L,60473L,60474L,60475L,60476L,60477L,\n60478L,60479L,60480L,60481L,60482L,60483L,60484L,60485L,60486L,60487L,\n60488L,60489L,60490L,60491L,60492L,60493L,60494L,60495L,60496L,60497L,\n60498L,60499L,60500L,60501L,60502L,60503L,60504L,60505L,60506L,60507L,\n60508L,60509L,60510L,60511L,60512L,60513L,60514L,60515L,60516L,60517L,\n60518L,60519L,60520L,60521L,60522L,60523L,60524L,60525L,60526L,60527L,\n60528L,60529L,60530L,60531L,60532L,60533L,60534L,60535L,60536L,60537L,\n60538L,60539L,60540L,60541L,60542L,60543L,60544L,60545L,60546L,60547L,\n60548L,60549L,60550L,60551L,60552L,60553L,60554L,60555L,60556L,60557L,\n60558L,60559L,60560L,60561L,60562L,60563L,60564L,60565L,60566L,60567L,\n60568L,60569L,60570L,60571L,60572L,60573L,60574L,60575L,60576L,60577L,\n60578L,60579L,60580L,60581L,60582L,60583L,60584L,60585L,60586L,60587L,\n60588L,60589L,60590L,60591L,60592L,60593L,60594L,60595L,60596L,60597L,\n60598L,60599L,60600L,60601L,60602L,60603L,60604L,60605L,60606L,60607L,\n60608L,60609L,60610L,60611L,60612L,60613L,60614L,60615L,60616L,60617L,\n60618L,60619L,60620L,60621L,60622L,60623L,60624L,60625L,60626L,60627L,\n60628L,60629L,60630L,60631L,60632L,60633L,60634L,60635L,60636L,60637L,\n60638L,60639L,60640L,60641L,60642L,60643L,60644L,60645L,60646L,60647L,\n60648L,60649L,60650L,60651L,60652L,60653L,60654L,60655L,60656L,60657L,\n60658L,60659L,60660L,60661L,60662L,60663L,60664L,60665L,60666L,60667L,\n60668L,60669L,60670L,60671L,60672L,60673L,60674L,60675L,60676L,60677L,\n60678L,60679L,60680L,60681L,60682L,60683L,60684L,60685L,60686L,60687L,\n60688L,60689L,60690L,60691L,60692L,60693L,60694L,60695L,60696L,60697L,\n60698L,60699L,60700L,60701L,60702L,60703L,60704L,60705L,60706L,60707L,\n60708L,60709L,60710L,60711L,60712L,60713L,60714L,60715L,60716L,60717L,\n60718L,60719L,60720L,60721L,60722L,60723L,60724L,60725L,60726L,60727L,\n60728L,60729L,60730L,60731L,60732L,60733L,60734L,60735L,60736L,60737L,\n60738L,60739L,60740L,60741L,60742L,60743L,60744L,60745L,60746L,60747L,\n60748L,60749L,60750L,60751L,60752L,60753L,60754L,60755L,60756L,60757L,\n60758L,60759L,60760L,60761L,60762L,60763L,60764L,60765L,60766L,60767L,\n60768L,60769L,60770L,60771L,60772L,60773L,60774L,60775L,60776L,60777L,\n60778L,60779L,60780L,60781L,60782L,60783L,60784L,60785L,60786L,60787L,\n60788L,60789L,60790L,60791L,60792L,60793L,60794L,60795L,60796L,60797L,\n60798L,60799L,60800L,60801L,60802L,60803L,60804L,60805L,60806L,60807L,\n60808L,60809L,60810L,60811L,60812L,60813L,60814L,60815L,60816L,60817L,\n60818L,60819L,60820L,60821L,60822L,60823L,60824L,60825L,60826L,60827L,\n60828L,60829L,60830L,60831L,60832L,60833L,60834L,60835L,60836L,60837L,\n60838L,60839L,60840L,60841L,60842L,60843L,60844L,60845L,60846L,60847L,\n60848L,60849L,60850L,60851L,60852L,60853L,60854L,60855L,60856L,60857L,\n60858L,60859L,60860L,60861L,60862L,60863L,60864L,60865L,60866L,60867L,\n60868L,60869L,60870L,60871L,60872L,60873L,60874L,60875L,60876L,60877L,\n60878L,60879L,60880L,60881L,60882L,60883L,60884L,60885L,60886L,60887L,\n60888L,60889L,60890L,60891L,60892L,60893L,60894L,60895L,60896L,60897L,\n60898L,60899L,60900L,60901L,60902L,60903L,60904L,60905L,60906L,60907L,\n60908L,60909L,60910L,60911L,60912L,60913L,60914L,60915L,60916L,60917L,\n60918L,60919L,60920L,60921L,60922L,60923L,60924L,60925L,60926L,60927L,\n60928L,60929L,60930L,60931L,60932L,60933L,60934L,60935L,60936L,60937L,\n60938L,60939L,60940L,60941L,60942L,60943L,60944L,60945L,60946L,60947L,\n60948L,60949L,60950L,60951L,60952L,60953L,60954L,60955L,60956L,60957L,\n60958L,60959L,60960L,60961L,60962L,60963L,60964L,60965L,60966L,60967L,\n60968L,60969L,60970L,60971L,60972L,60973L,60974L,60975L,60976L,60977L,\n60978L,60979L,60980L,60981L,60982L,60983L,60984L,60985L,60986L,60987L,\n60988L,60989L,60990L,60991L,60992L,60993L,60994L,60995L,60996L,60997L,\n60998L,60999L,61000L,61001L,61002L,61003L,61004L,61005L,61006L,61007L,\n61008L,61009L,61010L,61011L,61012L,61013L,61014L,61015L,61016L,61017L,\n61018L,61019L,61020L,61021L,61022L,61023L,61024L,61025L,61026L,61027L,\n61028L,61029L,61030L,61031L,61032L,61033L,61034L,61035L,61036L,61037L,\n61038L,61039L,61040L,61041L,61042L,61043L,61044L,61045L,61046L,61047L,\n61048L,61049L,61050L,61051L,61052L,61053L,61054L,61055L,61056L,61057L,\n61058L,61059L,61060L,61061L,61062L,61063L,61064L,61065L,61066L,61067L,\n61068L,61069L,61070L,61071L,61072L,61073L,61074L,61075L,61076L,61077L,\n61078L,61079L,61080L,61081L,61082L,61083L,61084L,61085L,61086L,61087L,\n61088L,61089L,61090L,61091L,61092L,61093L,61094L,61095L,61096L,61097L,\n61098L,61099L,61100L,61101L,61102L,61103L,61104L,61105L,61106L,61107L,\n61108L,61109L,61110L,61111L,61112L,61113L,61114L,61115L,61116L,61117L,\n61118L,61119L,61120L,61121L,61122L,61123L,61124L,61125L,61126L,61127L,\n61128L,61129L,61130L,61131L,61132L,61133L,61134L,61135L,61136L,61137L,\n61138L,61139L,61140L,61141L,61142L,61143L,61144L,61145L,61146L,61147L,\n61148L,61149L,61150L,61151L,61152L,61153L,61154L,61155L,61156L,61157L,\n61158L,61159L,61160L,61161L,61162L,61163L,61164L,61165L,61166L,61167L,\n61168L,61169L,61170L,61171L,61172L,61173L,61174L,61175L,61176L,61177L,\n61178L,61179L,61180L,61181L,61182L,61183L,61184L,61185L,61186L,61187L,\n61188L,61189L,61190L,61191L,61192L,61193L,61194L,61195L,61196L,61197L,\n61198L,61199L,61200L,61201L,61202L,61203L,61204L,61205L,61206L,61207L,\n61208L,61209L,61210L,61211L,61212L,61213L,61214L,61215L,61216L,61217L,\n61218L,61219L,61220L,61221L,61222L,61223L,61224L,61225L,61226L,61227L,\n61228L,61229L,61230L,61231L,61232L,61233L,61234L,61235L,61236L,61237L,\n61238L,61239L,61240L,61241L,61242L,61243L,61244L,61245L,61246L,61247L,\n61248L,61249L,61250L,61251L,61252L,61253L,61254L,61255L,61256L,61257L,\n61258L,61259L,61260L,61261L,61262L,61263L,61264L,61265L,61266L,61267L,\n61268L,61269L,61270L,61271L,61272L,61273L,61274L,61275L,61276L,61277L,\n61278L,61279L,61280L,61281L,61282L,61283L,61284L,61285L,61286L,61287L,\n61288L,61289L,61290L,61291L,61292L,61293L,61294L,61295L,61296L,61297L,\n61298L,61299L,61300L,61301L,61302L,61303L,61304L,61305L,61306L,61307L,\n61308L,61309L,61310L,61311L,61312L,61313L,61314L,61315L,61316L,61317L,\n61318L,61319L,61320L,61321L,61322L,61323L,61324L,61325L,61326L,61327L,\n61328L,61329L,61330L,61331L,61332L,61333L,61334L,61335L,61336L,61337L,\n61338L,61339L,61340L,61341L,61342L,61343L,61344L,61345L,61346L,61347L,\n61348L,61349L,61350L,61351L,61352L,61353L,61354L,61355L,61356L,61357L,\n61358L,61359L,61360L,61361L,61362L,61363L,61364L,61365L,61366L,61367L,\n61368L,61369L,61370L,61371L,61372L,61373L,61374L,61375L,61376L,61377L,\n61378L,61379L,61380L,61381L,61382L,61383L,61384L,61385L,61386L,61387L,\n61388L,61389L,61390L,61391L,61392L,61393L,61394L,61395L,61396L,61397L,\n61398L,61399L,61400L,61401L,61402L,61403L,61404L,61405L,61406L,61407L,\n61408L,61409L,61410L,61411L,61412L,61413L,61414L,61415L,61416L,61417L,\n61418L,61419L,61420L,61421L,61422L,61423L,61424L,61425L,61426L,61427L,\n61428L,61429L,61430L,61431L,61432L,61433L,61434L,61435L,61436L,61437L,\n61438L,61439L,61440L,61441L,61442L,61443L,61444L,61445L,61446L,61447L,\n61448L,61449L,61450L,61451L,61452L,61453L,61454L,61455L,61456L,61457L,\n61458L,61459L,61460L,61461L,61462L,61463L,61464L,61465L,61466L,61467L,\n61468L,61469L,61470L,61471L,61472L,61473L,61474L,61475L,61476L,61477L,\n61478L,61479L,61480L,61481L,61482L,61483L,61484L,61485L,61486L,61487L,\n61488L,61489L,61490L,61491L,61492L,61493L,61494L,61495L,61496L,61497L,\n61498L,61499L,61500L,61501L,61502L,61503L,61504L,61505L,61506L,61507L,\n61508L,61509L,61510L,61511L,61512L,61513L,61514L,61515L,61516L,61517L,\n61518L,61519L,61520L,61521L,61522L,61523L,61524L,61525L,61526L,61527L,\n61528L,61529L,61530L,61531L,61532L,61533L,61534L,61535L,61536L,61537L,\n61538L,61539L,61540L,61541L,61542L,61543L,61544L,61545L,61546L,61547L,\n61548L,61549L,61550L,61551L,61552L,61553L,61554L,61555L,61556L,61557L,\n61558L,61559L,61560L,61561L,61562L,61563L,61564L,61565L,61566L,61567L,\n61568L,61569L,61570L,61571L,61572L,61573L,61574L,61575L,61576L,61577L,\n61578L,61579L,61580L,61581L,61582L,61583L,61584L,61585L,61586L,61587L,\n61588L,61589L,61590L,61591L,61592L,61593L,61594L,61595L,61596L,61597L,\n61598L,61599L,61600L,61601L,61602L,61603L,61604L,61605L,61606L,61607L,\n61608L,61609L,61610L,61611L,61612L,61613L,61614L,61615L,61616L,61617L,\n61618L,61619L,61620L,61621L,61622L,61623L,61624L,61625L,61626L,61627L,\n61628L,61629L,61630L,61631L,61632L,61633L,61634L,61635L,61636L,61637L,\n61638L,61639L,61640L,61641L,61642L,61643L,61644L,61645L,61646L,61647L,\n61648L,61649L,61650L,61651L,61652L,61653L,61654L,61655L,61656L,61657L,\n61658L,61659L,61660L,61661L,61662L,61663L,61664L,61665L,61666L,61667L,\n61668L,61669L,61670L,61671L,61672L,61673L,61674L,61675L,61676L,61677L,\n61678L,61679L,61680L,61681L,61682L,61683L,61684L,61685L,61686L,61687L,\n61688L,61689L,61690L,61691L,61692L,61693L,61694L,61695L,61696L,61697L,\n61698L,61699L,61700L,61701L,61702L,61703L,61704L,61705L,61706L,61707L,\n61708L,61709L,61710L,61711L,61712L,61713L,61714L,61715L,61716L,61717L,\n61718L,61719L,61720L,61721L,61722L,61723L,61724L,61725L,61726L,61727L,\n61728L,61729L,61730L,61731L,61732L,61733L,61734L,61735L,61736L,61737L,\n61738L,61739L,61740L,61741L,61742L,61743L,61744L,61745L,61746L,61747L,\n61748L,61749L,61750L,61751L,61752L,61753L,61754L,61755L,61756L,61757L,\n61758L,61759L,61760L,61761L,61762L,61763L,61764L,61765L,61766L,61767L,\n61768L,61769L,61770L,61771L,61772L,61773L,61774L,61775L,61776L,61777L,\n61778L,61779L,61780L,61781L,61782L,61783L,61784L,61785L,61786L,61787L,\n61788L,61789L,61790L,61791L,61792L,61793L,61794L,61795L,61796L,61797L,\n61798L,61799L,61800L,61801L,61802L,61803L,61804L,61805L,61806L,61807L,\n61808L,61809L,61810L,61811L,61812L,61813L,61814L,61815L,61816L,61817L,\n61818L,61819L,61820L,61821L,61822L,61823L,61824L,61825L,61826L,61827L,\n61828L,61829L,61830L,61831L,61832L,61833L,61834L,61835L,61836L,61837L,\n61838L,61839L,61840L,61841L,61842L,61843L,61844L,61845L,61846L,61847L,\n61848L,61849L,61850L,61851L,61852L,61853L,61854L,61855L,61856L,61857L,\n61858L,61859L,61860L,61861L,61862L,61863L,61864L,61865L,61866L,61867L,\n61868L,61869L,61870L,61871L,61872L,61873L,61874L,61875L,61876L,61877L,\n61878L,61879L,61880L,61881L,61882L,61883L,61884L,61885L,61886L,61887L,\n61888L,61889L,61890L,61891L,61892L,61893L,61894L,61895L,61896L,61897L,\n61898L,61899L,61900L,61901L,61902L,61903L,61904L,61905L,61906L,61907L,\n61908L,61909L,61910L,61911L,61912L,61913L,61914L,61915L,61916L,61917L,\n61918L,61919L,61920L,61921L,61922L,61923L,61924L,61925L,61926L,61927L,\n61928L,61929L,61930L,61931L,61932L,61933L,61934L,61935L,61936L,61937L,\n61938L,61939L,61940L,61941L,61942L,61943L,61944L,61945L,61946L,61947L,\n61948L,61949L,61950L,61951L,61952L,61953L,61954L,61955L,61956L,61957L,\n61958L,61959L,61960L,61961L,61962L,61963L,61964L,61965L,61966L,61967L,\n61968L,61969L,61970L,61971L,61972L,61973L,61974L,61975L,61976L,61977L,\n61978L,61979L,61980L,61981L,61982L,61983L,61984L,61985L,61986L,61987L,\n61988L,61989L,61990L,61991L,61992L,61993L,61994L,61995L,61996L,61997L,\n61998L,61999L,62000L,62001L,62002L,62003L,62004L,62005L,62006L,62007L,\n62008L,62009L,62010L,62011L,62012L,62013L,62014L,62015L,62016L,62017L,\n62018L,62019L,62020L,62021L,62022L,62023L,62024L,62025L,62026L,62027L,\n62028L,62029L,62030L,62031L,62032L,62033L,62034L,62035L,62036L,62037L,\n62038L,62039L,62040L,62041L,62042L,62043L,62044L,62045L,62046L,62047L,\n62048L,62049L,62050L,62051L,62052L,62053L,62054L,62055L,62056L,62057L,\n62058L,62059L,62060L,62061L,62062L,62063L,62064L,62065L,62066L,62067L,\n62068L,62069L,62070L,62071L,62072L,62073L,62074L,62075L,62076L,62077L,\n62078L,62079L,62080L,62081L,62082L,62083L,62084L,62085L,62086L,62087L,\n62088L,62089L,62090L,62091L,62092L,62093L,62094L,62095L,62096L,62097L,\n62098L,62099L,62100L,62101L,62102L,62103L,62104L,62105L,62106L,62107L,\n62108L,62109L,62110L,62111L,62112L,62113L,62114L,62115L,62116L,62117L,\n62118L,62119L,62120L,62121L,62122L,62123L,62124L,62125L,62126L,62127L,\n62128L,62129L,62130L,62131L,62132L,62133L,62134L,62135L,62136L,62137L,\n62138L,62139L,62140L,62141L,62142L,62143L,62144L,62145L,62146L,62147L,\n62148L,62149L,62150L,62151L,62152L,62153L,62154L,62155L,62156L,62157L,\n62158L,62159L,62160L,62161L,62162L,62163L,62164L,62165L,62166L,62167L,\n62168L,62169L,62170L,62171L,62172L,62173L,62174L,62175L,62176L,62177L,\n62178L,62179L,62180L,62181L,62182L,62183L,62184L,62185L,62186L,62187L,\n62188L,62189L,62190L,62191L,62192L,62193L,62194L,62195L,62196L,62197L,\n62198L,62199L,62200L,62201L,62202L,62203L,62204L,62205L,62206L,62207L,\n62208L,62209L,62210L,62211L,62212L,62213L,62214L,62215L,62216L,62217L,\n62218L,62219L,62220L,62221L,62222L,62223L,62224L,62225L,62226L,62227L,\n62228L,62229L,62230L,62231L,62232L,62233L,62234L,62235L,62236L,62237L,\n62238L,62239L,62240L,62241L,62242L,62243L,62244L,62245L,62246L,62247L,\n62248L,62249L,62250L,62251L,62252L,62253L,62254L,62255L,62256L,62257L,\n62258L,62259L,62260L,62261L,62262L,62263L,62264L,62265L,62266L,62267L,\n62268L,62269L,62270L,62271L,62272L,62273L,62274L,62275L,62276L,62277L,\n62278L,62279L,62280L,62281L,62282L,62283L,62284L,62285L,62286L,62287L,\n62288L,62289L,62290L,62291L,62292L,62293L,62294L,62295L,62296L,62297L,\n62298L,62299L,62300L,62301L,62302L,62303L,62304L,62305L,62306L,62307L,\n62308L,62309L,62310L,62311L,62312L,62313L,62314L,62315L,62316L,62317L,\n62318L,62319L,62320L,62321L,62322L,62323L,62324L,62325L,62326L,62327L,\n62328L,62329L,62330L,62331L,62332L,62333L,62334L,62335L,62336L,62337L,\n62338L,62339L,62340L,62341L,62342L,62343L,62344L,62345L,62346L,62347L,\n62348L,62349L,62350L,62351L,62352L,62353L,62354L,62355L,62356L,62357L,\n62358L,62359L,62360L,62361L,62362L,62363L,62364L,62365L,62366L,62367L,\n62368L,62369L,62370L,62371L,62372L,62373L,62374L,62375L,62376L,62377L,\n62378L,62379L,62380L,62381L,62382L,62383L,62384L,62385L,62386L,62387L,\n62388L,62389L,62390L,62391L,62392L,62393L,62394L,62395L,62396L,62397L,\n62398L,62399L,62400L,62401L,62402L,62403L,62404L,62405L,62406L,62407L,\n62408L,62409L,62410L,62411L,62412L,62413L,62414L,62415L,62416L,62417L,\n62418L,62419L,62420L,62421L,62422L,62423L,62424L,62425L,62426L,62427L,\n62428L,62429L,62430L,62431L,62432L,62433L,62434L,62435L,62436L,62437L,\n62438L,62439L,62440L,62441L,62442L,62443L,62444L,62445L,62446L,62447L,\n62448L,62449L,62450L,62451L,62452L,62453L,62454L,62455L,62456L,62457L,\n62458L,62459L,62460L,62461L,62462L,62463L,62464L,62465L,62466L,62467L,\n62468L,62469L,62470L,62471L,62472L,62473L,62474L,62475L,62476L,62477L,\n62478L,62479L,62480L,62481L,62482L,62483L,62484L,62485L,62486L,62487L,\n62488L,62489L,62490L,62491L,62492L,62493L,62494L,62495L,62496L,62497L,\n62498L,62499L,62500L,62501L,62502L,62503L,62504L,62505L,62506L,62507L,\n62508L,62509L,62510L,62511L,62512L,62513L,62514L,62515L,62516L,62517L,\n62518L,62519L,62520L,62521L,62522L,62523L,62524L,62525L,62526L,62527L,\n62528L,62529L,62530L,62531L,62532L,62533L,62534L,62535L,62536L,62537L,\n62538L,62539L,62540L,62541L,62542L,62543L,62544L,62545L,62546L,62547L,\n62548L,62549L,62550L,62551L,62552L,62553L,62554L,62555L,62556L,62557L,\n62558L,62559L,62560L,62561L,62562L,62563L,62564L,62565L,62566L,62567L,\n62568L,62569L,62570L,62571L,62572L,62573L,62574L,62575L,62576L,62577L,\n62578L,62579L,62580L,62581L,62582L,62583L,62584L,62585L,62586L,62587L,\n62588L,62589L,62590L,62591L,62592L,62593L,62594L,62595L,62596L,62597L,\n62598L,62599L,62600L,62601L,62602L,62603L,62604L,62605L,62606L,62607L,\n62608L,62609L,62610L,62611L,62612L,62613L,62614L,62615L,62616L,62617L,\n62618L,62619L,62620L,62621L,62622L,62623L,62624L,62625L,62626L,62627L,\n62628L,62629L,62630L,62631L,62632L,62633L,62634L,62635L,62636L,62637L,\n62638L,62639L,62640L,62641L,62642L,62643L,62644L,62645L,62646L,62647L,\n62648L,62649L,62650L,62651L,62652L,62653L,62654L,62655L,62656L,62657L,\n62658L,62659L,62660L,62661L,62662L,62663L,62664L,62665L,62666L,62667L,\n62668L,62669L,62670L,62671L,62672L,62673L,62674L,62675L,62676L,62677L,\n62678L,62679L,62680L,62681L,62682L,62683L,62684L,62685L,62686L,62687L,\n62688L,62689L,62690L,62691L,62692L,62693L,62694L,62695L,62696L,62697L,\n62698L,62699L,62700L,62701L,62702L,62703L,62704L,62705L,62706L,62707L,\n62708L,62709L,62710L,62711L,62712L,62713L,62714L,62715L,62716L,62717L,\n62718L,62719L,62720L,62721L,62722L,62723L,62724L,62725L,62726L,62727L,\n62728L,62729L,62730L,62731L,62732L,62733L,62734L,62735L,62736L,62737L,\n62738L,62739L,62740L,62741L,62742L,62743L,62744L,62745L,62746L,62747L,\n62748L,62749L,62750L,62751L,62752L,62753L,62754L,62755L,62756L,62757L,\n62758L,62759L,62760L,62761L,62762L,62763L,62764L,62765L,62766L,62767L,\n62768L,62769L,62770L,62771L,62772L,62773L,62774L,62775L,62776L,62777L,\n62778L,62779L,62780L,62781L,62782L,62783L,62784L,62785L,62786L,62787L,\n62788L,62789L,62790L,62791L,62792L,62793L,62794L,62795L,62796L,62797L,\n62798L,62799L,62800L,62801L,62802L,62803L,62804L,62805L,62806L,62807L,\n62808L,62809L,62810L,62811L,62812L,62813L,62814L,62815L,62816L,62817L,\n62818L,62819L,62820L,62821L,62822L,62823L,62824L,62825L,62826L,62827L,\n62828L,62829L,62830L,62831L,62832L,62833L,62834L,62835L,62836L,62837L,\n62838L,62839L,62840L,62841L,62842L,62843L,62844L,62845L,62846L,62847L,\n62848L,62849L,62850L,62851L,62852L,62853L,62854L,62855L,62856L,62857L,\n62858L,62859L,62860L,62861L,62862L,62863L,62864L,62865L,62866L,62867L,\n62868L,62869L,62870L,62871L,62872L,62873L,62874L,62875L,62876L,62877L,\n62878L,62879L,62880L,62881L,62882L,62883L,62884L,62885L,62886L,62887L,\n62888L,62889L,62890L,62891L,62892L,62893L,62894L,62895L,62896L,62897L,\n62898L,62899L,62900L,62901L,62902L,62903L,62904L,62905L,62906L,62907L,\n62908L,62909L,62910L,62911L,62912L,62913L,62914L,62915L,62916L,62917L,\n62918L,62919L,62920L,62921L,62922L,62923L,62924L,62925L,62926L,62927L,\n62928L,62929L,62930L,62931L,62932L,62933L,62934L,62935L,62936L,62937L,\n62938L,62939L,62940L,62941L,62942L,62943L,62944L,62945L,62946L,62947L,\n62948L,62949L,62950L,62951L,62952L,62953L,62954L,62955L,62956L,62957L,\n62958L,62959L,62960L,62961L,62962L,62963L,62964L,62965L,62966L,62967L,\n62968L,62969L,62970L,62971L,62972L,62973L,62974L,62975L,62976L,62977L,\n62978L,62979L,62980L,62981L,62982L,62983L,62984L,62985L,62986L,62987L,\n62988L,62989L,62990L,62991L,62992L,62993L,62994L,62995L,62996L,62997L,\n62998L,62999L,63000L,63001L,63002L,63003L,63004L,63005L,63006L,63007L,\n63008L,63009L,63010L,63011L,63012L,63013L,63014L,63015L,63016L,63017L,\n63018L,63019L,63020L,63021L,63022L,63023L,63024L,63025L,63026L,63027L,\n63028L,63029L,63030L,63031L,63032L,63033L,63034L,63035L,63036L,63037L,\n63038L,63039L,63040L,63041L,63042L,63043L,63044L,63045L,63046L,63047L,\n63048L,63049L,63050L,63051L,63052L,63053L,63054L,63055L,63056L,63057L,\n63058L,63059L,63060L,63061L,63062L,63063L,63064L,63065L,63066L,63067L,\n63068L,63069L,63070L,63071L,63072L,63073L,63074L,63075L,63076L,63077L,\n63078L,63079L,63080L,63081L,63082L,63083L,63084L,63085L,63086L,63087L,\n63088L,63089L,63090L,63091L,63092L,63093L,63094L,63095L,63096L,63097L,\n63098L,63099L,63100L,63101L,63102L,63103L,63104L,63105L,63106L,63107L,\n63108L,63109L,63110L,63111L,63112L,63113L,63114L,63115L,63116L,63117L,\n63118L,63119L,63120L,63121L,63122L,63123L,63124L,63125L,63126L,63127L,\n63128L,63129L,63130L,63131L,63132L,63133L,63134L,63135L,63136L,63137L,\n63138L,63139L,63140L,63141L,63142L,63143L,63144L,63145L,63146L,63147L,\n63148L,63149L,63150L,63151L,63152L,63153L,63154L,63155L,63156L,63157L,\n63158L,63159L,63160L,63161L,63162L,63163L,63164L,63165L,63166L,63167L,\n63168L,63169L,63170L,63171L,63172L,63173L,63174L,63175L,63176L,63177L,\n63178L,63179L,63180L,63181L,63182L,63183L,63184L,63185L,63186L,63187L,\n63188L,63189L,63190L,63191L,63192L,63193L,63194L,63195L,63196L,63197L,\n63198L,63199L,63200L,63201L,63202L,63203L,63204L,63205L,63206L,63207L,\n63208L,63209L,63210L,63211L,63212L,63213L,63214L,63215L,63216L,63217L,\n63218L,63219L,63220L,63221L,63222L,63223L,63224L,63225L,63226L,63227L,\n63228L,63229L,63230L,63231L,63232L,63233L,63234L,63235L,63236L,63237L,\n63238L,63239L,63240L,63241L,63242L,63243L,63244L,63245L,63246L,63247L,\n63248L,63249L,63250L,63251L,63252L,63253L,63254L,63255L,63256L,63257L,\n63258L,63259L,63260L,63261L,63262L,63263L,63264L,63265L,63266L,63267L,\n63268L,63269L,63270L,63271L,63272L,63273L,63274L,63275L,63276L,63277L,\n63278L,63279L,63280L,63281L,63282L,63283L,63284L,63285L,63286L,63287L,\n63288L,63289L,63290L,63291L,63292L,63293L,63294L,63295L,63296L,63297L,\n63298L,63299L,63300L,63301L,63302L,63303L,63304L,63305L,63306L,63307L,\n63308L,63309L,63310L,63311L,63312L,63313L,63314L,63315L,63316L,63317L,\n63318L,63319L,63320L,63321L,63322L,63323L,63324L,63325L,63326L,63327L,\n63328L,63329L,63330L,63331L,63332L,63333L,63334L,63335L,63336L,63337L,\n63338L,63339L,63340L,63341L,63342L,63343L,63344L,63345L,63346L,63347L,\n63348L,63349L,63350L,63351L,63352L,63353L,63354L,63355L,63356L,63357L,\n63358L,63359L,63360L,63361L,63362L,63363L,63364L,63365L,63366L,63367L,\n63368L,63369L,63370L,63371L,63372L,63373L,63374L,63375L,63376L,63377L,\n63378L,63379L,63380L,63381L,63382L,63383L,63384L,63385L,63386L,63387L,\n63388L,63389L,63390L,63391L,63392L,63393L,63394L,63395L,63396L,63397L,\n63398L,63399L,63400L,63401L,63402L,63403L,63404L,63405L,63406L,63407L,\n63408L,63409L,63410L,63411L,63412L,63413L,63414L,63415L,63416L,63417L,\n63418L,63419L,63420L,63421L,63422L,63423L,63424L,63425L,63426L,63427L,\n63428L,63429L,63430L,63431L,63432L,63433L,63434L,63435L,63436L,63437L,\n63438L,63439L,63440L,63441L,63442L,63443L,63444L,63445L,63446L,63447L,\n63448L,63449L,63450L,63451L,63452L,63453L,63454L,63455L,63456L,63457L,\n63458L,63459L,63460L,63461L,63462L,63463L,63464L,63465L,63466L,63467L,\n63468L,63469L,63470L,63471L,63472L,63473L,63474L,63475L,63476L,63477L,\n63478L,63479L,63480L,63481L,63482L,63483L,63484L,63485L,63486L,63487L,\n63488L,63489L,63490L,63491L,63492L,63493L,63494L,63495L,63496L,63497L,\n63498L,63499L,63500L,63501L,63502L,63503L,63504L,63505L,63506L,63507L,\n63508L,63509L,63510L,63511L,63512L,63513L,63514L,63515L,63516L,63517L,\n63518L,63519L,63520L,63521L,63522L,63523L,63524L,63525L,63526L,63527L,\n63528L,63529L,63530L,63531L,63532L,63533L,63534L,63535L,63536L,63537L,\n63538L,63539L,63540L,63541L,63542L,63543L,63544L,63545L,63546L,63547L,\n63548L,63549L,63550L,63551L,63552L,63553L,63554L,63555L,63556L,63557L,\n63558L,63559L,63560L,63561L,63562L,63563L,63564L,63565L,63566L,63567L,\n63568L,63569L,63570L,63571L,63572L,63573L,63574L,63575L,63576L,63577L,\n63578L,63579L,63580L,63581L,63582L,63583L,63584L,63585L,63586L,63587L,\n63588L,63589L,63590L,63591L,63592L,63593L,63594L,63595L,63596L,63597L,\n63598L,63599L,63600L,63601L,63602L,63603L,63604L,63605L,63606L,63607L,\n63608L,63609L,63610L,63611L,63612L,63613L,63614L,63615L,63616L,63617L,\n63618L,63619L,63620L,63621L,63622L,63623L,63624L,63625L,63626L,63627L,\n63628L,63629L,63630L,63631L,63632L,63633L,63634L,63635L,63636L,63637L,\n63638L,63639L,63640L,63641L,63642L,63643L,63644L,63645L,63646L,63647L,\n63648L,63649L,63650L,63651L,63652L,63653L,63654L,63655L,63656L,63657L,\n63658L,63659L,63660L,63661L,63662L,63663L,63664L,63665L,63666L,63667L,\n63668L,63669L,63670L,63671L,63672L,63673L,63674L,63675L,63676L,63677L,\n63678L,63679L,63680L,63681L,63682L,63683L,63684L,63685L,63686L,63687L,\n63688L,63689L,63690L,63691L,63692L,63693L,63694L,63695L,63696L,63697L,\n63698L,63699L,63700L,63701L,63702L,63703L,63704L,63705L,63706L,63707L,\n63708L,63709L,63710L,63711L,63712L,63713L,63714L,63715L,63716L,63717L,\n63718L,63719L,63720L,63721L,63722L,63723L,63724L,63725L,63726L,63727L,\n63728L,63729L,63730L,63731L,63732L,63733L,63734L,63735L,63736L,63737L,\n63738L,63739L,63740L,63741L,63742L,63743L,63744L,63745L,63746L,63747L,\n63748L,63749L,63750L,63751L,63752L,63753L,63754L,63755L,63756L,63757L,\n63758L,63759L,63760L,63761L,63762L,63763L,63764L,63765L,63766L,63767L,\n63768L,63769L,63770L,63771L,63772L,63773L,63774L,63775L,63776L,63777L,\n63778L,63779L,63780L,63781L,63782L,63783L,63784L,63785L,63786L,63787L,\n63788L,63789L,63790L,63791L,63792L,63793L,63794L,63795L,63796L,63797L,\n63798L,63799L,63800L,63801L,63802L,63803L,63804L,63805L,63806L,63807L,\n63808L,63809L,63810L,63811L,63812L,63813L,63814L,63815L,63816L,63817L,\n63818L,63819L,63820L,63821L,63822L,63823L,63824L,63825L,63826L,63827L,\n63828L,63829L,63830L,63831L,63832L,63833L,63834L,63835L,63836L,63837L,\n63838L,63839L,63840L,63841L,63842L,63843L,63844L,63845L,63846L,63847L,\n63848L,63849L,63850L,63851L,63852L,63853L,63854L,63855L,63856L,63857L,\n63858L,63859L,63860L,63861L,63862L,63863L,63864L,63865L,63866L,63867L,\n63868L,63869L,63870L,63871L,63872L,63873L,63874L,63875L,63876L,63877L,\n63878L,63879L,63880L,63881L,63882L,63883L,63884L,63885L,63886L,63887L,\n63888L,63889L,63890L,63891L,63892L,63893L,63894L,63895L,63896L,63897L,\n63898L,63899L,63900L,63901L,63902L,63903L,63904L,63905L,63906L,63907L,\n63908L,63909L,63910L,63911L,63912L,63913L,63914L,63915L,63916L,63917L,\n63918L,63919L,63920L,63921L,63922L,63923L,63924L,63925L,63926L,63927L,\n63928L,63929L,63930L,63931L,63932L,63933L,63934L,63935L,63936L,63937L,\n63938L,63939L,63940L,63941L,63942L,63943L,63944L,63945L,63946L,63947L,\n63948L,63949L,63950L,63951L,63952L,63953L,63954L,63955L,63956L,63957L,\n63958L,63959L,63960L,63961L,63962L,63963L,63964L,63965L,63966L,63967L,\n63968L,63969L,63970L,63971L,63972L,63973L,63974L,63975L,63976L,63977L,\n63978L,63979L,63980L,63981L,63982L,63983L,63984L,63985L,63986L,63987L,\n63988L,63989L,63990L,63991L,63992L,63993L,63994L,63995L,63996L,63997L,\n63998L,63999L,64000L,64001L,64002L,64003L,64004L,64005L,64006L,64007L,\n64008L,64009L,64010L,64011L,64012L,64013L,64014L,64015L,64016L,64017L,\n64018L,64019L,64020L,64021L,64022L,64023L,64024L,64025L,64026L,64027L,\n64028L,64029L,64030L,64031L,64032L,64033L,64034L,64035L,64036L,64037L,\n64038L,64039L,64040L,64041L,64042L,64043L,64044L,64045L,64046L,64047L,\n64048L,64049L,64050L,64051L,64052L,64053L,64054L,64055L,64056L,64057L,\n64058L,64059L,64060L,64061L,64062L,64063L,64064L,64065L,64066L,64067L,\n64068L,64069L,64070L,64071L,64072L,64073L,64074L,64075L,64076L,64077L,\n64078L,64079L,64080L,64081L,64082L,64083L,64084L,64085L,64086L,64087L,\n64088L,64089L,64090L,64091L,64092L,64093L,64094L,64095L,64096L,64097L,\n64098L,64099L,64100L,64101L,64102L,64103L,64104L,64105L,64106L,64107L,\n64108L,64109L,64110L,64111L,64112L,64113L,64114L,64115L,64116L,64117L,\n64118L,64119L,64120L,64121L,64122L,64123L,64124L,64125L,64126L,64127L,\n64128L,64129L,64130L,64131L,64132L,64133L,64134L,64135L,64136L,64137L,\n64138L,64139L,64140L,64141L,64142L,64143L,64144L,64145L,64146L,64147L,\n64148L,64149L,64150L,64151L,64152L,64153L,64154L,64155L,64156L,64157L,\n64158L,64159L,64160L,64161L,64162L,64163L,64164L,64165L,64166L,64167L,\n64168L,64169L,64170L,64171L,64172L,64173L,64174L,64175L,64176L,64177L,\n64178L,64179L,64180L,64181L,64182L,64183L,64184L,64185L,64186L,64187L,\n64188L,64189L,64190L,64191L,64192L,64193L,64194L,64195L,64196L,64197L,\n64198L,64199L,64200L,64201L,64202L,64203L,64204L,64205L,64206L,64207L,\n64208L,64209L,64210L,64211L,64212L,64213L,64214L,64215L,64216L,64217L,\n64218L,64219L,64220L,64221L,64222L,64223L,64224L,64225L,64226L,64227L,\n64228L,64229L,64230L,64231L,64232L,64233L,64234L,64235L,64236L,64237L,\n64238L,64239L,64240L,64241L,64242L,64243L,64244L,64245L,64246L,64247L,\n64248L,64249L,64250L,64251L,64252L,64253L,64254L,64255L,64256L,64257L,\n64258L,64259L,64260L,64261L,64262L,64263L,64264L,64265L,64266L,64267L,\n64268L,64269L,64270L,64271L,64272L,64273L,64274L,64275L,64276L,64277L,\n64278L,64279L,64280L,64281L,64282L,64283L,64284L,64285L,64286L,64287L,\n64288L,64289L,64290L,64291L,64292L,64293L,64294L,64295L,64296L,64297L,\n64298L,64299L,64300L,64301L,64302L,64303L,64304L,64305L,64306L,64307L,\n64308L,64309L,64310L,64311L,64312L,64313L,64314L,64315L,64316L,64317L,\n64318L,64319L,64320L,64321L,64322L,64323L,64324L,64325L,64326L,64327L,\n64328L,64329L,64330L,64331L,64332L,64333L,64334L,64335L,64336L,64337L,\n64338L,64339L,64340L,64341L,64342L,64343L,64344L,64345L,64346L,64347L,\n64348L,64349L,64350L,64351L,64352L,64353L,64354L,64355L,64356L,64357L,\n64358L,64359L,64360L,64361L,64362L,64363L,64364L,64365L,64366L,64367L,\n64368L,64369L,64370L,64371L,64372L,64373L,64374L,64375L,64376L,64377L,\n64378L,64379L,64380L,64381L,64382L,64383L,64384L,64385L,64386L,64387L,\n64388L,64389L,64390L,64391L,64392L,64393L,64394L,64395L,64396L,64397L,\n64398L,64399L,64400L,64401L,64402L,64403L,64404L,64405L,64406L,64407L,\n64408L,64409L,64410L,64411L,64412L,64413L,64414L,64415L,64416L,64417L,\n64418L,64419L,64420L,64421L,64422L,64423L,64424L,64425L,64426L,64427L,\n64428L,64429L,64430L,64431L,64432L,64433L,64434L,64435L,64436L,64437L,\n64438L,64439L,64440L,64441L,64442L,64443L,64444L,64445L,64446L,64447L,\n64448L,64449L,64450L,64451L,64452L,64453L,64454L,64455L,64456L,64457L,\n64458L,64459L,64460L,64461L,64462L,64463L,64464L,64465L,64466L,64467L,\n64468L,64469L,64470L,64471L,64472L,64473L,64474L,64475L,64476L,64477L,\n64478L,64479L,64480L,64481L,64482L,64483L,64484L,64485L,64486L,64487L,\n64488L,64489L,64490L,64491L,64492L,64493L,64494L,64495L,64496L,64497L,\n64498L,64499L,64500L,64501L,64502L,64503L,64504L,64505L,64506L,64507L,\n64508L,64509L,64510L,64511L,64512L,64513L,64514L,64515L,64516L,64517L,\n64518L,64519L,64520L,64521L,64522L,64523L,64524L,64525L,64526L,64527L,\n64528L,64529L,64530L,64531L,64532L,64533L,64534L,64535L,64536L,64537L,\n64538L,64539L,64540L,64541L,64542L,64543L,64544L,64545L,64546L,64547L,\n64548L,64549L,64550L,64551L,64552L,64553L,64554L,64555L,64556L,64557L,\n64558L,64559L,64560L,64561L,64562L,64563L,64564L,64565L,64566L,64567L,\n64568L,64569L,64570L,64571L,64572L,64573L,64574L,64575L,64576L,64577L,\n64578L,64579L,64580L,64581L,64582L,64583L,64584L,64585L,64586L,64587L,\n64588L,64589L,64590L,64591L,64592L,64593L,64594L,64595L,64596L,64597L,\n64598L,64599L,64600L,64601L,64602L,64603L,64604L,64605L,64606L,64607L,\n64608L,64609L,64610L,64611L,64612L,64613L,64614L,64615L,64616L,64617L,\n64618L,64619L,64620L,64621L,64622L,64623L,64624L,64625L,64626L,64627L,\n64628L,64629L,64630L,64631L,64632L,64633L,64634L,64635L,64636L,64637L,\n64638L,64639L,64640L,64641L,64642L,64643L,64644L,64645L,64646L,64647L,\n64648L,64649L,64650L,64651L,64652L,64653L,64654L,64655L,64656L,64657L,\n64658L,64659L,64660L,64661L,64662L,64663L,64664L,64665L,64666L,64667L,\n64668L,64669L,64670L,64671L,64672L,64673L,64674L,64675L,64676L,64677L,\n64678L,64679L,64680L,64681L,64682L,64683L,64684L,64685L,64686L,64687L,\n64688L,64689L,64690L,64691L,64692L,64693L,64694L,64695L,64696L,64697L,\n64698L,64699L,64700L,64701L,64702L,64703L,64704L,64705L,64706L,64707L,\n64708L,64709L,64710L,64711L,64712L,64713L,64714L,64715L,64716L,64717L,\n64718L,64719L,64720L,64721L,64722L,64723L,64724L,64725L,64726L,64727L,\n64728L,64729L,64730L,64731L,64732L,64733L,64734L,64735L,64736L,64737L,\n64738L,64739L,64740L,64741L,64742L,64743L,64744L,64745L,64746L,64747L,\n64748L,64749L,64750L,64751L,64752L,64753L,64754L,64755L,64756L,64757L,\n64758L,64759L,64760L,64761L,64762L,64763L,64764L,64765L,64766L,64767L,\n64768L,64769L,64770L,64771L,64772L,64773L,64774L,64775L,64776L,64777L,\n64778L,64779L,64780L,64781L,64782L,64783L,64784L,64785L,64786L,64787L,\n64788L,64789L,64790L,64791L,64792L,64793L,64794L,64795L,64796L,64797L,\n64798L,64799L,64800L,64801L,64802L,64803L,64804L,64805L,64806L,64807L,\n64808L,64809L,64810L,64811L,64812L,64813L,64814L,64815L,64816L,64817L,\n64818L,64819L,64820L,64821L,64822L,64823L,64824L,64825L,64826L,64827L,\n64828L,64829L,64830L,64831L,64832L,64833L,64834L,64835L,64836L,64837L,\n64838L,64839L,64840L,64841L,64842L,64843L,64844L,64845L,64846L,64847L,\n64848L,64849L,64850L,64851L,64852L,64853L,64854L,64855L,64856L,64857L,\n64858L,64859L,64860L,64861L,64862L,64863L,64864L,64865L,64866L,64867L,\n64868L,64869L,64870L,64871L,64872L,64873L,64874L,64875L,64876L,64877L,\n64878L,64879L,64880L,64881L,64882L,64883L,64884L,64885L,64886L,64887L,\n64888L,64889L,64890L,64891L,64892L,64893L,64894L,64895L,64896L,64897L,\n64898L,64899L,64900L,64901L,64902L,64903L,64904L,64905L,64906L,64907L,\n64908L,64909L,64910L,64911L,64912L,64913L,64914L,64915L,64916L,64917L,\n64918L,64919L,64920L,64921L,64922L,64923L,64924L,64925L,64926L,64927L,\n64928L,64929L,64930L,64931L,64932L,64933L,64934L,64935L,64936L,64937L,\n64938L,64939L,64940L,64941L,64942L,64943L,64944L,64945L,64946L,64947L,\n64948L,64949L,64950L,64951L,64952L,64953L,64954L,64955L,64956L,64957L,\n64958L,64959L,64960L,64961L,64962L,64963L,64964L,64965L,64966L,64967L,\n64968L,64969L,64970L,64971L,64972L,64973L,64974L,64975L,64976L,64977L,\n64978L,64979L,64980L,64981L,64982L,64983L,64984L,64985L,64986L,64987L,\n64988L,64989L,64990L,64991L,64992L,64993L,64994L,64995L,64996L,64997L,\n64998L,64999L,65000L,65001L,65002L,65003L,65004L,65005L,65006L,65007L,\n65008L,65009L,65010L,65011L,65012L,65013L,65014L,65015L,65016L,65017L,\n65018L,65019L,65020L,65021L,65022L,65023L,65024L,65025L,65026L,65027L,\n65028L,65029L,65030L,65031L,65032L,65033L,65034L,65035L,65036L,65037L,\n65038L,65039L,65040L,65041L,65042L,65043L,65044L,65045L,65046L,65047L,\n65048L,65049L,65050L,65051L,65052L,65053L,65054L,65055L,65056L,65057L,\n65058L,65059L,65060L,65061L,65062L,65063L,65064L,65065L,65066L,65067L,\n65068L,65069L,65070L,65071L,65072L,65073L,65074L,65075L,65076L,65077L,\n65078L,65079L,65080L,65081L,65082L,65083L,65084L,65085L,65086L,65087L,\n65088L,65089L,65090L,65091L,65092L,65093L,65094L,65095L,65096L,65097L,\n65098L,65099L,65100L,65101L,65102L,65103L,65104L,65105L,65106L,65107L,\n65108L,65109L,65110L,65111L,65112L,65113L,65114L,65115L,65116L,65117L,\n65118L,65119L,65120L,65121L,65122L,65123L,65124L,65125L,65126L,65127L,\n65128L,65129L,65130L,65131L,65132L,65133L,65134L,65135L,65136L,65137L,\n65138L,65139L,65140L,65141L,65142L,65143L,65144L,65145L,65146L,65147L,\n65148L,65149L,65150L,65151L,65152L,65153L,65154L,65155L,65156L,65157L,\n65158L,65159L,65160L,65161L,65162L,65163L,65164L,65165L,65166L,65167L,\n65168L,65169L,65170L,65171L,65172L,65173L,65174L,65175L,65176L,65177L,\n65178L,65179L,65180L,65181L,65182L,65183L,65184L,65185L,65186L,65187L,\n65188L,65189L,65190L,65191L,65192L,65193L,65194L,65195L,65196L,65197L,\n65198L,65199L,65200L,65201L,65202L,65203L,65204L,65205L,65206L,65207L,\n65208L,65209L,65210L,65211L,65212L,65213L,65214L,65215L,65216L,65217L,\n65218L,65219L,65220L,65221L,65222L,65223L,65224L,65225L,65226L,65227L,\n65228L,65229L,65230L,65231L,65232L,65233L,65234L,65235L,65236L,65237L,\n65238L,65239L,65240L,65241L,65242L,65243L,65244L,65245L,65246L,65247L,\n65248L,65249L,65250L,65251L,65252L,65253L,65254L,65255L,65256L,65257L,\n65258L,65259L,65260L,65261L,65262L,65263L,65264L,65265L,65266L,65267L,\n65268L,65269L,65270L,65271L,65272L,65273L,65274L,65275L,65276L,65277L,\n65278L,65279L,65280L,65281L,65282L,65283L,65284L,65285L,65286L,65287L,\n65288L,65289L,65290L,65291L,65292L,65293L,65294L,65295L,65296L,65297L,\n65298L,65299L,65300L,65301L,65302L,65303L,65304L,65305L,65306L,65307L,\n65308L,65309L,65310L,65311L,65312L,65313L,65314L,65315L,65316L,65317L,\n65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L,65326L,65327L,\n65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L,65336L,65337L,\n65338L,65339L,65340L,65341L,65342L,65343L,65344L,65313L,65314L,65315L,\n65316L,65317L,65318L,65319L,65320L,65321L,65322L,65323L,65324L,65325L,\n65326L,65327L,65328L,65329L,65330L,65331L,65332L,65333L,65334L,65335L,\n65336L,65337L,65338L,65371L,65372L,65373L,65374L,65375L,65376L,65377L,\n65378L,65379L,65380L,65381L,65382L,65383L,65384L,65385L,65386L,65387L,\n65388L,65389L,65390L,65391L,65392L,65393L,65394L,65395L,65396L,65397L,\n65398L,65399L,65400L,65401L,65402L,65403L,65404L,65405L,65406L,65407L,\n65408L,65409L,65410L,65411L,65412L,65413L,65414L,65415L,65416L,65417L,\n65418L,65419L,65420L,65421L,65422L,65423L,65424L,65425L,65426L,65427L,\n65428L,65429L,65430L,65431L,65432L,65433L,65434L,65435L,65436L,65437L,\n65438L,65439L,65440L,65441L,65442L,65443L,65444L,65445L,65446L,65447L,\n65448L,65449L,65450L,65451L,65452L,65453L,65454L,65455L,65456L,65457L,\n65458L,65459L,65460L,65461L,65462L,65463L,65464L,65465L,65466L,65467L,\n65468L,65469L,65470L,65471L,65472L,65473L,65474L,65475L,65476L,65477L,\n65478L,65479L,65480L,65481L,65482L,65483L,65484L,65485L,65486L,65487L,\n65488L,65489L,65490L,65491L,65492L,65493L,65494L,65495L,65496L,65497L,\n65498L,65499L,65500L,65501L,65502L,65503L,65504L,65505L,65506L,65507L,\n65508L,65509L,65510L,65511L,65512L,65513L,65514L,65515L,65516L,65517L,\n65518L,65519L,65520L,65521L,65522L,65523L,65524L,65525L,65526L,65527L,\n65528L,65529L,65530L,65531L,65532L,65533L,65534L,65535L,\n};\n#endif\n\n#if defined(DUK_USE_REGEXP_CANON_BITMAP)\n/*\n *  Automatically generated by extract_caseconv.py, do not edit!\n */\n\nconst duk_uint8_t duk_unicode_re_canon_bitmap[256] = {\n23,0,224,19,1,228,255,255,255,255,255,255,255,255,255,255,255,255,255,127,\n255,255,255,255,255,255,255,255,231,247,0,16,255,227,255,255,63,255,255,\n255,255,255,255,255,1,252,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n227,193,255,255,255,147,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,\n255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,251,\n};\n#endif\n#line 1 \"duk_util_bitdecoder.c\"\n/*\n *  Bitstream decoder.\n */\n\n/* #include duk_internal.h -> already included */\n\n/* Decode 'bits' bits from the input stream (bits must be 1...24).\n * When reading past bitstream end, zeroes are shifted in.  The result\n * is signed to match duk_bd_decode_flagged.\n */\nDUK_INTERNAL duk_uint32_t duk_bd_decode(duk_bitdecoder_ctx *ctx, duk_small_int_t bits) {\n\tduk_small_int_t shift;\n\tduk_uint32_t mask;\n\tduk_uint32_t tmp;\n\n\t/* Note: cannot read more than 24 bits without possibly shifting top bits out.\n\t * Fixable, but adds complexity.\n\t */\n\tDUK_ASSERT(bits >= 1 && bits <= 24);\n\n\twhile (ctx->currbits < bits) {\n#if 0\n\t\tDUK_DDD(DUK_DDDPRINT(\"decode_bits: shift more data (bits=%ld, currbits=%ld)\",\n\t\t                     (long) bits, (long) ctx->currbits));\n#endif\n\t\tctx->currval <<= 8;\n\t\tif (ctx->offset < ctx->length) {\n\t\t\t/* If ctx->offset >= ctx->length, we \"shift zeroes in\"\n\t\t\t * instead of croaking.\n\t\t\t */\n\t\t\tctx->currval |= ctx->data[ctx->offset++];\n\t\t}\n\t\tctx->currbits += 8;\n\t}\n#if 0\n\tDUK_DDD(DUK_DDDPRINT(\"decode_bits: bits=%ld, currbits=%ld, currval=0x%08lx\",\n\t                     (long) bits, (long) ctx->currbits, (unsigned long) ctx->currval));\n#endif\n\n\t/* Extract 'top' bits of currval; note that the extracted bits do not need\n\t * to be cleared, we just ignore them on next round.\n\t */\n\tshift = ctx->currbits - bits;\n\tmask = (((duk_uint32_t) 1U) << bits) - 1U;\n\ttmp = (ctx->currval >> shift) & mask;\n\tctx->currbits = shift;  /* remaining */\n\n#if 0\n\tDUK_DDD(DUK_DDDPRINT(\"decode_bits: %ld bits -> 0x%08lx (%ld), currbits=%ld, currval=0x%08lx\",\n\t                     (long) bits, (unsigned long) tmp, (long) tmp, (long) ctx->currbits, (unsigned long) ctx->currval));\n#endif\n\n\treturn tmp;\n}\n\nDUK_INTERNAL duk_small_uint_t duk_bd_decode_flag(duk_bitdecoder_ctx *ctx) {\n\treturn (duk_small_uint_t) duk_bd_decode(ctx, 1);\n}\n\n/* Decode a one-bit flag, and if set, decode a value of 'bits', otherwise return\n * default value.\n */\nDUK_INTERNAL duk_uint32_t duk_bd_decode_flagged(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_uint32_t def_value) {\n\tif (duk_bd_decode_flag(ctx)) {\n\t\treturn duk_bd_decode(ctx, bits);\n\t} else {\n\t\treturn def_value;\n\t}\n}\n\n/* Signed variant, allows negative marker value. */\nDUK_INTERNAL duk_int32_t duk_bd_decode_flagged_signed(duk_bitdecoder_ctx *ctx, duk_small_int_t bits, duk_int32_t def_value) {\n\treturn (duk_int32_t) duk_bd_decode_flagged(ctx, bits, (duk_uint32_t) def_value);\n}\n\n/* Shared varint encoding.  Match dukutil.py BitEncode.varuint(). */\nDUK_INTERNAL duk_uint32_t duk_bd_decode_varuint(duk_bitdecoder_ctx *ctx) {\n\tduk_small_uint_t t;\n\n\t/* The bit encoding choices here are based on manual testing against\n\t * the actual varuints generated by genbuiltins.py.\n\t */\n\tswitch (duk_bd_decode(ctx, 2)) {\n\tcase 0:\n\t\treturn 0;  /* [0,0] */\n\tcase 1:\n\t\treturn duk_bd_decode(ctx, 2) + 1;  /* [1,4] */\n\tcase 2:\n\t\treturn duk_bd_decode(ctx, 5) + 5;  /* [5,36] */\n\tdefault:\n\t\tt = duk_bd_decode(ctx, 7);\n\t\tif (t == 0) {\n\t\t\treturn duk_bd_decode(ctx, 20);\n\t\t}\n\t\treturn (t - 1) + 37;  /* [37,163] */\n\t}\n}\n\n/* Decode a bit packed string from a custom format used by genbuiltins.py.\n * This function is here because it's used for both heap and thread inits.\n * Caller must supply the output buffer whose size is NOT checked!\n */\n\n#define DUK__BITPACK_LETTER_LIMIT  26\n#define DUK__BITPACK_LOOKUP1       26\n#define DUK__BITPACK_LOOKUP2       27\n#define DUK__BITPACK_SWITCH1       28\n#define DUK__BITPACK_SWITCH        29\n#define DUK__BITPACK_UNUSED1       30\n#define DUK__BITPACK_EIGHTBIT      31\n\nDUK_LOCAL const duk_uint8_t duk__bitpacked_lookup[16] = {\n\tDUK_ASC_0, DUK_ASC_1, DUK_ASC_2, DUK_ASC_3,\n\tDUK_ASC_4, DUK_ASC_5, DUK_ASC_6, DUK_ASC_7,\n\tDUK_ASC_8, DUK_ASC_9, DUK_ASC_UNDERSCORE, DUK_ASC_SPACE,\n\t0x82, 0x80, DUK_ASC_DOUBLEQUOTE, DUK_ASC_LCURLY\n};\n\nDUK_INTERNAL duk_small_uint_t duk_bd_decode_bitpacked_string(duk_bitdecoder_ctx *bd, duk_uint8_t *out) {\n\tduk_small_uint_t len;\n\tduk_small_uint_t mode;\n\tduk_small_uint_t t;\n\tduk_small_uint_t i;\n\n\tlen = duk_bd_decode(bd, 5);\n\tif (len == 31) {\n\t\tlen = duk_bd_decode(bd, 8);  /* Support up to 256 bytes; rare. */\n\t}\n\n\tmode = 32;  /* 0 = uppercase, 32 = lowercase (= 'a' - 'A') */\n\tfor (i = 0; i < len; i++) {\n\t\tt = duk_bd_decode(bd, 5);\n\t\tif (t < DUK__BITPACK_LETTER_LIMIT) {\n\t\t\tt = t + DUK_ASC_UC_A + mode;\n\t\t} else if (t == DUK__BITPACK_LOOKUP1) {\n\t\t\tt = duk__bitpacked_lookup[duk_bd_decode(bd, 3)];\n\t\t} else if (t == DUK__BITPACK_LOOKUP2) {\n\t\t\tt = duk__bitpacked_lookup[8 + duk_bd_decode(bd, 3)];\n\t\t} else if (t == DUK__BITPACK_SWITCH1) {\n\t\t\tt = duk_bd_decode(bd, 5);\n\t\t\tDUK_ASSERT_DISABLE(t >= 0);  /* unsigned */\n\t\t\tDUK_ASSERT(t <= 25);\n\t\t\tt = t + DUK_ASC_UC_A + (mode ^ 32);\n\t\t} else if (t == DUK__BITPACK_SWITCH) {\n\t\t\tmode = mode ^ 32;\n\t\t\tt = duk_bd_decode(bd, 5);\n\t\t\tDUK_ASSERT_DISABLE(t >= 0);\n\t\t\tDUK_ASSERT(t <= 25);\n\t\t\tt = t + DUK_ASC_UC_A + mode;\n\t\t} else if (t == DUK__BITPACK_EIGHTBIT) {\n\t\t\tt = duk_bd_decode(bd, 8);\n\t\t}\n\t\tout[i] = (duk_uint8_t) t;\n\t}\n\n\treturn len;\n}\n\n/* automatic undefs */\n#undef DUK__BITPACK_EIGHTBIT\n#undef DUK__BITPACK_LETTER_LIMIT\n#undef DUK__BITPACK_LOOKUP1\n#undef DUK__BITPACK_LOOKUP2\n#undef DUK__BITPACK_SWITCH\n#undef DUK__BITPACK_SWITCH1\n#undef DUK__BITPACK_UNUSED1\n#line 1 \"duk_util_bitencoder.c\"\n/*\n *  Bitstream encoder.\n */\n\n/* #include duk_internal.h -> already included */\n\nDUK_INTERNAL void duk_be_encode(duk_bitencoder_ctx *ctx, duk_uint32_t data, duk_small_int_t bits) {\n\tduk_uint8_t tmp;\n\n\tDUK_ASSERT(ctx != NULL);\n\tDUK_ASSERT(ctx->currbits < 8);\n\n\t/* This limitation would be fixable but adds unnecessary complexity. */\n\tDUK_ASSERT(bits >= 1 && bits <= 24);\n\n\tctx->currval = (ctx->currval << bits) | data;\n\tctx->currbits += bits;\n\n\twhile (ctx->currbits >= 8) {\n\t\tif (ctx->offset < ctx->length) {\n\t\t\ttmp = (duk_uint8_t) ((ctx->currval >> (ctx->currbits - 8)) & 0xff);\n\t\t\tctx->data[ctx->offset++] = tmp;\n\t\t} else {\n\t\t\t/* If buffer has been exhausted, truncate bitstream */\n\t\t\tctx->truncated = 1;\n\t\t}\n\n\t\tctx->currbits -= 8;\n\t}\n}\n\nDUK_INTERNAL void duk_be_finish(duk_bitencoder_ctx *ctx) {\n\tduk_small_int_t npad;\n\n\tDUK_ASSERT(ctx != NULL);\n\tDUK_ASSERT(ctx->currbits < 8);\n\n\tnpad = (duk_small_int_t) (8 - ctx->currbits);\n\tif (npad > 0) {\n\t\tduk_be_encode(ctx, 0, npad);\n\t}\n\tDUK_ASSERT(ctx->currbits == 0);\n}\n#line 1 \"duk_util_bufwriter.c\"\n/*\n *  Fast buffer writer with slack management.\n */\n\n/* #include duk_internal.h -> already included */\n\n/*\n *  Macro support functions (use only macros in calling code)\n */\n\nDUK_LOCAL void duk__bw_update_ptrs(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t curr_offset, duk_size_t new_length) {\n\tduk_uint8_t *p;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw_ctx != NULL);\n\tDUK_UNREF(thr);\n\n\tp = (duk_uint8_t *) DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, bw_ctx->buf);\n\tDUK_ASSERT(p != NULL || (DUK_HBUFFER_DYNAMIC_GET_SIZE(bw_ctx->buf) == 0 && curr_offset == 0 && new_length == 0));\n\tbw_ctx->p = p + curr_offset;\n\tbw_ctx->p_base = p;\n\tbw_ctx->p_limit = p + new_length;\n}\n\nDUK_INTERNAL void duk_bw_init(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_hbuffer_dynamic *h_buf) {\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw_ctx != NULL);\n\tDUK_ASSERT(h_buf != NULL);\n\n\tbw_ctx->buf = h_buf;\n\tduk__bw_update_ptrs(thr, bw_ctx, 0, DUK_HBUFFER_DYNAMIC_GET_SIZE(h_buf));\n}\n\nDUK_INTERNAL void duk_bw_init_pushbuf(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t buf_size) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw_ctx != NULL);\n\n\t(void) duk_push_dynamic_buffer(thr, buf_size);\n\tbw_ctx->buf = (duk_hbuffer_dynamic *) duk_known_hbuffer(thr, -1);\n\tduk__bw_update_ptrs(thr, bw_ctx, 0, buf_size);\n}\n\n/* Resize target buffer for requested size.  Called by the macro only when the\n * fast path test (= there is space) fails.\n */\nDUK_INTERNAL duk_uint8_t *duk_bw_resize(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx, duk_size_t sz) {\n\tduk_size_t curr_off;\n\tduk_size_t add_sz;\n\tduk_size_t new_sz;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw_ctx != NULL);\n\n\t/* We could do this operation without caller updating bw_ctx->ptr,\n\t * but by writing it back here we can share code better.\n\t */\n\n\tcurr_off = (duk_size_t) (bw_ctx->p - bw_ctx->p_base);\n\tadd_sz = (curr_off >> DUK_BW_SLACK_SHIFT) + DUK_BW_SLACK_ADD;\n\tnew_sz = curr_off + sz + add_sz;\n\tif (DUK_UNLIKELY(new_sz < curr_off)) {\n\t\t/* overflow */\n\t\tDUK_ERROR_RANGE(thr, DUK_STR_BUFFER_TOO_LONG);\n\t\treturn NULL;  /* not reachable */\n\t}\n#if 0  /* for manual torture testing: tight allocation, useful with valgrind */\n\tnew_sz = curr_off + sz;\n#endif\n\n\t/* This is important to ensure dynamic buffer data pointer is not\n\t * NULL (which is possible if buffer size is zero), which in turn\n\t * causes portability issues with e.g. memmove() and memcpy().\n\t */\n\tDUK_ASSERT(new_sz >= 1);\n\n\tDUK_DD(DUK_DDPRINT(\"resize bufferwriter from %ld to %ld (add_sz=%ld)\", (long) curr_off, (long) new_sz, (long) add_sz));\n\n\tduk_hbuffer_resize(thr, bw_ctx->buf, new_sz);\n\tduk__bw_update_ptrs(thr, bw_ctx, curr_off, new_sz);\n\treturn bw_ctx->p;\n}\n\n/* Make buffer compact, matching current written size. */\nDUK_INTERNAL void duk_bw_compact(duk_hthread *thr, duk_bufwriter_ctx *bw_ctx) {\n\tduk_size_t len;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw_ctx != NULL);\n\tDUK_UNREF(thr);\n\n\tlen = (duk_size_t) (bw_ctx->p - bw_ctx->p_base);\n\tduk_hbuffer_resize(thr, bw_ctx->buf, len);\n\tduk__bw_update_ptrs(thr, bw_ctx, len, len);\n}\n\nDUK_INTERNAL void duk_bw_write_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) {\n\tduk_uint8_t *p_base;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_UNREF(thr);\n\n\tp_base = bw->p_base;\n\tDUK_MEMCPY((void *) bw->p,\n\t           (const void *) (p_base + src_off),\n\t           (size_t) len);\n\tbw->p += len;\n}\n\nDUK_INTERNAL void duk_bw_write_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t src_off, duk_size_t len) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));\n\n\tDUK_BW_ENSURE(thr, bw, len);\n\tduk_bw_write_raw_slice(thr, bw, src_off, len);\n}\n\nDUK_INTERNAL void duk_bw_insert_raw_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) {\n\tduk_uint8_t *p_base;\n\tduk_size_t buf_sz, move_sz;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(buf != NULL);\n\tDUK_UNREF(thr);\n\n\tp_base = bw->p_base;\n\tbuf_sz = (duk_size_t) (bw->p - p_base);  /* constrained by maximum buffer size */\n\tmove_sz = buf_sz - dst_off;\n\n\tDUK_ASSERT(p_base != NULL);  /* buffer size is >= 1 */\n\tDUK_MEMMOVE((void *) (p_base + dst_off + len),\n\t            (const void *) (p_base + dst_off),\n\t            (size_t) move_sz);\n\tDUK_MEMCPY((void *) (p_base + dst_off),\n\t           (const void *) buf,\n\t           (size_t) len);\n\tbw->p += len;\n}\n\nDUK_INTERNAL void duk_bw_insert_ensure_bytes(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, const duk_uint8_t *buf, duk_size_t len) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(buf != NULL);\n\n\tDUK_BW_ENSURE(thr, bw, len);\n\tduk_bw_insert_raw_bytes(thr, bw, dst_off, buf, len);\n}\n\nDUK_INTERNAL void duk_bw_insert_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) {\n\tduk_uint8_t *p_base;\n\tduk_size_t buf_sz, move_sz;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_UNREF(thr);\n\n\tp_base = bw->p_base;\n\n\t/* Don't support \"straddled\" source now. */\n\tDUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len);\n\n\tif (dst_off <= src_off) {\n\t\t/* Target is before source.  Source offset is expressed as\n\t\t * a \"before change\" offset.  Account for the memmove.\n\t\t */\n\t\tsrc_off += len;\n\t}\n\n\tbuf_sz = (duk_size_t) (bw->p - p_base);\n\tmove_sz = buf_sz - dst_off;\n\n\tDUK_ASSERT(p_base != NULL);  /* buffer size is >= 1 */\n\tDUK_MEMMOVE((void *) (p_base + dst_off + len),\n\t            (const void *) (p_base + dst_off),\n\t            (size_t) move_sz);\n\tDUK_MEMCPY((void *) (p_base + dst_off),\n\t           (const void *) (p_base + src_off),\n\t           (size_t) len);\n\tbw->p += len;\n}\n\nDUK_INTERNAL void duk_bw_insert_ensure_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t dst_off, duk_size_t src_off, duk_size_t len) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(dst_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(src_off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(src_off + len <= DUK_BW_GET_SIZE(thr, bw));\n\n\t/* Don't support \"straddled\" source now. */\n\tDUK_ASSERT(dst_off <= src_off || dst_off >= src_off + len);\n\n\tDUK_BW_ENSURE(thr, bw, len);\n\tduk_bw_insert_raw_slice(thr, bw, dst_off, src_off, len);\n}\n\nDUK_INTERNAL duk_uint8_t *duk_bw_insert_raw_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) {\n\tduk_uint8_t *p_base, *p_dst, *p_src;\n\tduk_size_t buf_sz, move_sz;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_UNREF(thr);\n\n\tp_base = bw->p_base;\n\tbuf_sz = (duk_size_t) (bw->p - p_base);\n\tmove_sz = buf_sz - off;\n\tp_dst = p_base + off + len;\n\tp_src = p_base + off;\n\tDUK_MEMMOVE((void *) p_dst, (const void *) p_src, (size_t) move_sz);\n\treturn p_src;  /* point to start of 'reserved area' */\n}\n\nDUK_INTERNAL duk_uint8_t *duk_bw_insert_ensure_area(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) {\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw));\n\n\tDUK_BW_ENSURE(thr, bw, len);\n\treturn duk_bw_insert_raw_area(thr, bw, off, len);\n}\n\nDUK_INTERNAL void duk_bw_remove_raw_slice(duk_hthread *thr, duk_bufwriter_ctx *bw, duk_size_t off, duk_size_t len) {\n\tduk_size_t move_sz;\n\n\tduk_uint8_t *p_base;\n\tduk_uint8_t *p_src;\n\tduk_uint8_t *p_dst;\n\n\tDUK_ASSERT(thr != NULL);\n\tDUK_ASSERT(bw != NULL);\n\tDUK_ASSERT(off <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_ASSERT(off + len <= DUK_BW_GET_SIZE(thr, bw));\n\tDUK_UNREF(thr);\n\n\tp_base = bw->p_base;\n\tp_dst = p_base + off;\n\tp_src = p_dst + len;\n\tmove_sz = (duk_size_t) (bw->p - p_src);\n\tDUK_MEMMOVE((void *) p_dst,\n\t            (const void *) p_src,\n\t            (size_t) move_sz);\n\tbw->p -= len;\n}\n\n/*\n *  Macro support functions for reading/writing raw data.\n *\n *  These are done using mempcy to ensure they're valid even for unaligned\n *  reads/writes on platforms where alignment counts.  On x86 at least gcc\n *  is able to compile these into a bswap+mov.  \"Always inline\" is used to\n *  ensure these macros compile to minimal code.\n *\n *  Not really bufwriter related, but currently used together.\n */\n\nDUK_INTERNAL DUK_ALWAYS_INLINE duk_uint16_t duk_raw_read_u16_be(duk_uint8_t **p) {\n\tunion {\n\t\tduk_uint8_t b[2];\n\t\tduk_uint16_t x;\n\t} u;\n\n\tDUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 2);\n\tu.x = DUK_NTOH16(u.x);\n\t*p += 2;\n\treturn u.x;\n}\n\nDUK_INTERNAL DUK_ALWAYS_INLINE duk_uint32_t duk_raw_read_u32_be(duk_uint8_t **p) {\n\tunion {\n\t\tduk_uint8_t b[4];\n\t\tduk_uint32_t x;\n\t} u;\n\n\tDUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4);\n\tu.x = DUK_NTOH32(u.x);\n\t*p += 4;\n\treturn u.x;\n}\n\nDUK_INTERNAL DUK_ALWAYS_INLINE duk_double_t duk_raw_read_double_be(duk_uint8_t **p) {\n\tduk_double_union du;\n\tunion {\n\t\tduk_uint8_t b[4];\n\t\tduk_uint32_t x;\n\t} u;\n\n\tDUK_MEMCPY((void *) u.b, (const void *) (*p), (size_t) 4);\n\tu.x = DUK_NTOH32(u.x);\n\tdu.ui[DUK_DBL_IDX_UI0] = u.x;\n\tDUK_MEMCPY((void *) u.b, (const void *) (*p + 4), (size_t) 4);\n\tu.x = DUK_NTOH32(u.x);\n\tdu.ui[DUK_DBL_IDX_UI1] = u.x;\n\t*p += 8;\n\n\treturn du.d;\n}\n\nDUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u16_be(duk_uint8_t **p, duk_uint16_t val) {\n\tunion {\n\t\tduk_uint8_t b[2];\n\t\tduk_uint16_t x;\n\t} u;\n\n\tu.x = DUK_HTON16(val);\n\tDUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 2);\n\t*p += 2;\n}\n\nDUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_u32_be(duk_uint8_t **p, duk_uint32_t val) {\n\tunion {\n\t\tduk_uint8_t b[4];\n\t\tduk_uint32_t x;\n\t} u;\n\n\tu.x = DUK_HTON32(val);\n\tDUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4);\n\t*p += 4;\n}\n\nDUK_INTERNAL DUK_ALWAYS_INLINE void duk_raw_write_double_be(duk_uint8_t **p, duk_double_t val) {\n\tduk_double_union du;\n\tunion {\n\t\tduk_uint8_t b[4];\n\t\tduk_uint32_t x;\n\t} u;\n\n\tdu.d = val;\n\tu.x = du.ui[DUK_DBL_IDX_UI0];\n\tu.x = DUK_HTON32(u.x);\n\tDUK_MEMCPY((void *) (*p), (const void *) u.b, (size_t) 4);\n\tu.x = du.ui[DUK_DBL_IDX_UI1];\n\tu.x = DUK_HTON32(u.x);\n\tDUK_MEMCPY((void *) (*p + 4), (const void *) u.b, (size_t) 4);\n\t*p += 8;\n}\n#line 1 \"duk_util_hashbytes.c\"\n/*\n *  Hash function duk_util_hashbytes().\n *\n *  Currently, 32-bit MurmurHash2.\n *\n *  Don't rely on specific hash values; hash function may be endianness\n *  dependent, for instance.\n */\n\n/* #include duk_internal.h -> already included */\n\n#if defined(DUK_USE_STRHASH_DENSE)\n/* 'magic' constants for Murmurhash2 */\n#define DUK__MAGIC_M  ((duk_uint32_t) 0x5bd1e995UL)\n#define DUK__MAGIC_R  24\n\nDUK_INTERNAL duk_uint32_t duk_util_hashbytes(const duk_uint8_t *data, duk_size_t len, duk_uint32_t seed) {\n\tduk_uint32_t h = seed ^ ((duk_uint32_t) len);\n\n\twhile (len >= 4) {\n\t\t/* Portability workaround is required for platforms without\n\t\t * unaligned access.  The replacement code emulates little\n\t\t * endian access even on big endian architectures, which is\n\t\t * OK as long as it is consistent for a build.\n\t\t */\n#if defined(DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS)\n\t\tduk_uint32_t k = *((const duk_uint32_t *) (const void *) data);\n#else\n\t\tduk_uint32_t k = ((duk_uint32_t) data[0]) |\n\t\t                 (((duk_uint32_t) data[1]) << 8) |\n\t\t                 (((duk_uint32_t) data[2]) << 16) |\n\t\t                 (((duk_uint32_t) data[3]) << 24);\n#endif\n\n\t\tk *= DUK__MAGIC_M;\n\t\tk ^= k >> DUK__MAGIC_R;\n\t\tk *= DUK__MAGIC_M;\n\t\th *= DUK__MAGIC_M;\n\t\th ^= k;\n\t\tdata += 4;\n\t\tlen -= 4;\n\t}\n\n\tswitch (len) {\n\tcase 3: h ^= data[2] << 16;\n\tcase 2: h ^= data[1] << 8;\n\tcase 1: h ^= data[0];\n\t        h *= DUK__MAGIC_M;\n        }\n\n\th ^= h >> 13;\n\th *= DUK__MAGIC_M;\n\th ^= h >> 15;\n\n\treturn h;\n}\n#endif  /* DUK_USE_STRHASH_DENSE */\n\n/* automatic undefs */\n#undef DUK__MAGIC_M\n#undef DUK__MAGIC_R\n#line 1 \"duk_util_tinyrandom.c\"\n/*\n *  A tiny random number generator used for Math.random() and other internals.\n *\n *  Default algorithm is xoroshiro128+: http://xoroshiro.di.unimi.it/xoroshiro128plus.c\n *  with SplitMix64 seed preparation: http://xorshift.di.unimi.it/splitmix64.c.\n *\n *  Low memory targets and targets without 64-bit types use a slightly smaller\n *  (but slower) algorithm by Adi Shamir:\n *  http://www.woodmann.com/forum/archive/index.php/t-3100.html.\n *\n */\n\n/* #include duk_internal.h -> already included */\n\n#if !defined(DUK_USE_GET_RANDOM_DOUBLE)\n\n#if defined(DUK_USE_PREFER_SIZE) || !defined(DUK_USE_64BIT_OPS)\n#define DUK__RANDOM_SHAMIR3OP\n#else\n#define DUK__RANDOM_XOROSHIRO128PLUS\n#endif\n\n#if defined(DUK__RANDOM_SHAMIR3OP)\n#define DUK__UPDATE_RND(rnd) do { \\\n\t\t(rnd) += ((rnd) * (rnd)) | 0x05UL; \\\n\t\t(rnd) = ((rnd) & 0xffffffffUL);       /* if duk_uint32_t is exactly 32 bits, this is a NOP */ \\\n\t} while (0)\n\n#define DUK__RND_BIT(rnd)  ((rnd) >> 31)  /* only use the highest bit */\n\nDUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) {\n\tDUK_UNREF(thr);  /* Nothing now. */\n}\n\nDUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) {\n\tduk_double_t t;\n\tduk_small_int_t n;\n\tduk_uint32_t rnd;\n\n\trnd = thr->heap->rnd_state;\n\n\tn = 53;  /* enough to cover the whole mantissa */\n\tt = 0.0;\n\n\tdo {\n\t\tDUK__UPDATE_RND(rnd);\n\t\tt += DUK__RND_BIT(rnd);\n\t\tt /= 2.0;\n\t} while (--n);\n\n\tthr->heap->rnd_state = rnd;\n\n\tDUK_ASSERT(t >= (duk_double_t) 0.0);\n\tDUK_ASSERT(t < (duk_double_t) 1.0);\n\n\treturn t;\n}\n#endif  /* DUK__RANDOM_SHAMIR3OP */\n\n#if defined(DUK__RANDOM_XOROSHIRO128PLUS)\nDUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_splitmix64(duk_uint64_t *x) {\n\tduk_uint64_t z;\n\tz = (*x += DUK_U64_CONSTANT(0x9E3779B97F4A7C15));\n\tz = (z ^ (z >> 30U)) * DUK_U64_CONSTANT(0xBF58476D1CE4E5B9);\n\tz = (z ^ (z >> 27U)) * DUK_U64_CONSTANT(0x94D049BB133111EB);\n\treturn z ^ (z >> 31U);\n}\n\nDUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__rnd_rotl(const duk_uint64_t x, duk_small_uint_t k) {\n\treturn (x << k) | (x >> (64U - k));\n}\n\nDUK_LOCAL DUK_ALWAYS_INLINE duk_uint64_t duk__xoroshiro128plus(duk_uint64_t *s) {\n\tduk_uint64_t s0;\n\tduk_uint64_t s1;\n\tduk_uint64_t res;\n\n\ts0 = s[0];\n\ts1 = s[1];\n\tres = s0 + s1;\n\ts1 ^= s0;\n\ts[0] = duk__rnd_rotl(s0, 55) ^ s1 ^ (s1 << 14U);\n\ts[1] = duk__rnd_rotl(s1, 36);\n\n\treturn res;\n}\n\nDUK_INTERNAL void duk_util_tinyrandom_prepare_seed(duk_hthread *thr) {\n\tduk_small_uint_t i;\n\tduk_uint64_t x;\n\n\t/* Mix both halves of the initial seed with SplitMix64.  The intent\n\t * is to ensure that very similar raw seeds (which is usually the case\n\t * because current seed is Date.now()) result in different xoroshiro128+\n\t * seeds.\n\t */\n\tx = thr->heap->rnd_state[0];  /* Only [0] is used as input here. */\n\tfor (i = 0; i < 64; i++) {\n\t\tthr->heap->rnd_state[i & 0x01] = duk__rnd_splitmix64(&x);  /* Keep last 2 values. */\n\t}\n}\n\nDUK_INTERNAL duk_double_t duk_util_tinyrandom_get_double(duk_hthread *thr) {\n\tduk_uint64_t v;\n\tduk_double_union du;\n\n\t/* For big and little endian the integer and IEEE double byte order\n\t * is the same so a direct assignment works.  For mixed endian the\n\t * 32-bit parts must be swapped.\n\t */\n\tv = (DUK_U64_CONSTANT(0x3ff) << 52U) | (duk__xoroshiro128plus((duk_uint64_t *) thr->heap->rnd_state) >> 12U);\n\tdu.ull[0] = v;\n#if defined(DUK_USE_DOUBLE_ME)\n\tdo {\n\t\tduk_uint32_t tmp;\n\t\ttmp = du.ui[0];\n\t\tdu.ui[0] = du.ui[1];\n\t\tdu.ui[1] = tmp;\n\t} while (0);\n#endif\n\treturn du.d - 1.0;\n}\n#endif  /* DUK__RANDOM_XOROSHIRO128PLUS */\n\n#endif  /* !DUK_USE_GET_RANDOM_DOUBLE */\n\n/* automatic undefs */\n#undef DUK__RANDOM_SHAMIR3OP\n#undef DUK__RANDOM_XOROSHIRO128PLUS\n#undef DUK__RND_BIT\n#undef DUK__UPDATE_RND\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duktape.go",
    "content": "package duktape\n\n/*\n#cgo !windows CFLAGS: -std=c99 -O3 -Wall -fomit-frame-pointer -fstrict-aliasing\n#cgo windows CFLAGS: -O3 -Wall -fomit-frame-pointer -fstrict-aliasing\n#cgo linux LDFLAGS: -lm\n#cgo freebsd LDFLAGS: -lm\n#cgo openbsd LDFLAGS: -lm\n\n#include \"duktape.h\"\n#include \"duk_logging.h\"\n#include \"duk_print_alert.h\"\n#include \"duk_module_duktape.h\"\n#include \"duk_console.h\"\nextern duk_ret_t goFunctionCall(duk_context *ctx);\nextern void goFinalizeCall(duk_context *ctx);\n*/\nimport \"C\"\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"regexp\"\n\t\"sync\"\n\t\"unsafe\"\n)\n\nvar reFuncName = regexp.MustCompile(\"^[a-z_][a-z0-9_]*([A-Z_][a-z0-9_]*)*$\")\n\nconst (\n\tgoFunctionPtrProp = \"\\xff\" + \"goFunctionPtrProp\"\n\tgoContextPtrProp  = \"\\xff\" + \"goContextPtrProp\"\n)\n\ntype Context struct {\n\t*context\n}\n\n// transmute replaces the value from Context with the value of pointer\nfunc (c *Context) transmute(p unsafe.Pointer) {\n\t*c = *(*Context)(p)\n}\n\n// this is a pojo containing only the values of the Context\ntype context struct {\n\tsync.Mutex\n\tduk_context *C.duk_context\n\tfnIndex     *functionIndex\n\ttimerIndex  *timerIndex\n}\n\n// New returns plain initialized duktape context object\n// See: http://duktape.org/api.html#duk_create_heap_default\nfunc New() *Context {\n\td := &Context{\n\t\t&context{\n\t\t\tduk_context: C.duk_create_heap(nil, nil, nil, nil, nil),\n\t\t\tfnIndex:     newFunctionIndex(),\n\t\t\ttimerIndex:  &timerIndex{},\n\t\t},\n\t}\n\n\tctx := d.duk_context\n\tC.duk_logging_init(ctx, 0)\n\tC.duk_print_alert_init(ctx, 0)\n\tC.duk_module_duktape_init(ctx)\n\tC.duk_console_init(ctx, 0)\n\n\treturn d\n}\n\n// Flags is a set of flags for controlling the behaviour of duktape.\ntype Flags struct {\n\tLogging    uint\n\tPrintAlert uint\n\tConsole    uint\n}\n\n// FlagConsoleProxyWrapper is a Console flag.\n// Use a proxy wrapper to make undefined methods (console.foo()) no-ops.\nconst FlagConsoleProxyWrapper = 1 << 0\n\n// FlagConsoleFlush is a Console flag.\n// Flush output after every call.\nconst FlagConsoleFlush = 1 << 1\n\n// NewWithFlags returns plain initialized duktape context object\n// You can control the behaviour of duktape by setting flags.\n// See: http://duktape.org/api.html#duk_create_heap_default\nfunc NewWithFlags(flags *Flags) *Context {\n\td := &Context{\n\t\t&context{\n\t\t\tduk_context: C.duk_create_heap(nil, nil, nil, nil, nil),\n\t\t\tfnIndex:     newFunctionIndex(),\n\t\t\ttimerIndex:  &timerIndex{},\n\t\t},\n\t}\n\n\tctx := d.duk_context\n\tC.duk_logging_init(ctx, C.duk_uint_t(flags.Logging))\n\tC.duk_print_alert_init(ctx, C.duk_uint_t(flags.PrintAlert))\n\tC.duk_module_duktape_init(ctx)\n\tC.duk_console_init(ctx, C.duk_uint_t(flags.Console))\n\n\treturn d\n}\n\nfunc contextFromPointer(ctx *C.duk_context) *Context {\n\treturn &Context{&context{duk_context: ctx}}\n}\n\n// PushGlobalGoFunction push the given function into duktape global object\n// Returns non-negative index (relative to stack bottom) of the pushed function\n// also returns error if the function name is invalid\nfunc (d *Context) PushGlobalGoFunction(name string, fn func(*Context) int) (int, error) {\n\tif !reFuncName.MatchString(name) {\n\t\treturn -1, errors.New(\"Malformed function name '\" + name + \"'\")\n\t}\n\n\td.PushGlobalObject()\n\tidx := d.PushGoFunction(fn)\n\td.PutPropString(-2, name)\n\td.Pop()\n\n\treturn idx, nil\n}\n\n// PushGoFunction push the given function into duktape stack, returns non-negative\n// index (relative to stack bottom) of the pushed function\nfunc (d *Context) PushGoFunction(fn func(*Context) int) int {\n\tfunPtr := d.fnIndex.add(fn)\n\tctxPtr := contexts.add(d)\n\n\tidx := d.PushCFunction((*[0]byte)(C.goFunctionCall), C.DUK_VARARGS)\n\td.PushCFunction((*[0]byte)(C.goFinalizeCall), 1)\n\td.PushPointer(funPtr)\n\td.PutPropString(-2, goFunctionPtrProp)\n\td.PushPointer(ctxPtr)\n\td.PutPropString(-2, goContextPtrProp)\n\td.SetFinalizer(-2)\n\n\td.PushPointer(funPtr)\n\td.PutPropString(-2, goFunctionPtrProp)\n\td.PushPointer(ctxPtr)\n\td.PutPropString(-2, goContextPtrProp)\n\n\treturn idx\n}\n\n//export goFunctionCall\nfunc goFunctionCall(cCtx *C.duk_context) C.duk_ret_t {\n\td := contextFromPointer(cCtx)\n\n\tfunPtr, ctx := d.getFunctionPtrs()\n\td.transmute(unsafe.Pointer(ctx))\n\n\tresult := d.fnIndex.get(funPtr)(d)\n\n\treturn C.duk_ret_t(result)\n}\n\n//export goFinalizeCall\nfunc goFinalizeCall(cCtx *C.duk_context) {\n\td := contextFromPointer(cCtx)\n\n\tfunPtr, ctx := d.getFunctionPtrs()\n\td.transmute(unsafe.Pointer(ctx))\n\n\td.fnIndex.delete(funPtr)\n}\n\nfunc (d *Context) getFunctionPtrs() (unsafe.Pointer, *Context) {\n\td.PushCurrentFunction()\n\td.GetPropString(-1, goFunctionPtrProp)\n\tfunPtr := d.GetPointer(-1)\n\n\td.Pop()\n\n\td.GetPropString(-1, goContextPtrProp)\n\tctx := contexts.get(d.GetPointer(-1))\n\td.Pop2()\n\treturn funPtr, ctx\n}\n\n// Destroy destroy all the references to the functions and freed the pointers\nfunc (d *Context) Destroy() {\n\td.fnIndex.destroy()\n\tcontexts.delete(d)\n}\n\ntype Error struct {\n\tType       string\n\tMessage    string\n\tFileName   string\n\tLineNumber int\n\tStack      string\n}\n\nfunc (e *Error) Error() string {\n\treturn fmt.Sprintf(\"%s: %s\", e.Type, e.Message)\n}\n\ntype Type int\n\nfunc (t Type) IsNone() bool      { return t == TypeNone }\nfunc (t Type) IsUndefined() bool { return t == TypeUndefined }\nfunc (t Type) IsNull() bool      { return t == TypeNull }\nfunc (t Type) IsBool() bool      { return t == TypeBoolean }\nfunc (t Type) IsNumber() bool    { return t == TypeNumber }\nfunc (t Type) IsString() bool    { return t == TypeString }\nfunc (t Type) IsObject() bool    { return t == TypeObject }\nfunc (t Type) IsBuffer() bool    { return t == TypeBuffer }\nfunc (t Type) IsPointer() bool   { return t == TypePointer }\nfunc (t Type) IsLightFunc() bool { return t == TypeLightFunc }\n\nfunc (t Type) String() string {\n\tswitch t {\n\tcase TypeNone:\n\t\treturn \"None\"\n\tcase TypeUndefined:\n\t\treturn \"Undefined\"\n\tcase TypeNull:\n\t\treturn \"Null\"\n\tcase TypeBoolean:\n\t\treturn \"Boolean\"\n\tcase TypeNumber:\n\t\treturn \"Number\"\n\tcase TypeString:\n\t\treturn \"String\"\n\tcase TypeObject:\n\t\treturn \"Object\"\n\tcase TypeBuffer:\n\t\treturn \"Buffer\"\n\tcase TypePointer:\n\t\treturn \"Pointer\"\n\tcase TypeLightFunc:\n\t\treturn \"LightFunc\"\n\tdefault:\n\t\treturn \"Unknown\"\n\t}\n}\n\ntype functionIndex struct {\n\tfunctions map[unsafe.Pointer]func(*Context) int\n\tsync.RWMutex\n}\n\ntype timerIndex struct {\n\tc float64\n\tsync.Mutex\n}\n\nfunc (t *timerIndex) get() float64 {\n\tt.Lock()\n\tdefer t.Unlock()\n\tt.c++\n\treturn t.c\n}\n\nfunc newFunctionIndex() *functionIndex {\n\treturn &functionIndex{\n\t\tfunctions: make(map[unsafe.Pointer]func(*Context) int, 0),\n\t}\n}\n\nfunc (i *functionIndex) add(fn func(*Context) int) unsafe.Pointer {\n\tptr := C.malloc(1)\n\n\ti.Lock()\n\ti.functions[ptr] = fn\n\ti.Unlock()\n\n\treturn ptr\n}\n\nfunc (i *functionIndex) get(ptr unsafe.Pointer) func(*Context) int {\n\ti.RLock()\n\tfn := i.functions[ptr]\n\ti.RUnlock()\n\n\treturn fn\n}\n\nfunc (i *functionIndex) delete(ptr unsafe.Pointer) {\n\ti.Lock()\n\tdelete(i.functions, ptr)\n\ti.Unlock()\n\n\tC.free(ptr)\n}\n\nfunc (i *functionIndex) destroy() {\n\ti.Lock()\n\n\tfor ptr, _ := range i.functions {\n\t\tdelete(i.functions, ptr)\n\t\tC.free(ptr)\n\t}\n\ti.Unlock()\n}\n\ntype ctxIndex struct {\n\tsync.RWMutex\n\tctxs map[unsafe.Pointer]*Context\n}\n\nfunc (ci *ctxIndex) add(ctx *Context) unsafe.Pointer {\n\n\tci.RLock()\n\tfor ptr, ctxPtr := range ci.ctxs {\n\t\tif ctxPtr == ctx {\n\t\t\tci.RUnlock()\n\t\t\treturn ptr\n\t\t}\n\t}\n\tci.RUnlock()\n\n\tci.Lock()\n\tfor ptr, ctxPtr := range ci.ctxs {\n\t\tif ctxPtr == ctx {\n\t\t\tci.Unlock()\n\t\t\treturn ptr\n\t\t}\n\t}\n\tptr := C.malloc(1)\n\tci.ctxs[ptr] = ctx\n\tci.Unlock()\n\n\treturn ptr\n}\n\nfunc (ci *ctxIndex) get(ptr unsafe.Pointer) *Context {\n\tci.RLock()\n\tctx := ci.ctxs[ptr]\n\tci.RUnlock()\n\treturn ctx\n}\n\nfunc (ci *ctxIndex) delete(ctx *Context) {\n\tci.Lock()\n\tfor ptr, ctxPtr := range ci.ctxs {\n\t\tif ctxPtr == ctx {\n\t\t\tdelete(ci.ctxs, ptr)\n\t\t\tC.free(ptr)\n\t\t\tci.Unlock()\n\t\t\treturn\n\t\t}\n\t}\n\tpanic(fmt.Sprintf(\"context (%p) doesn't exist\", ctx))\n}\n\nvar contexts *ctxIndex\n\nfunc init() {\n\tcontexts = &ctxIndex{\n\t\tctxs: make(map[unsafe.Pointer]*Context),\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/duktape.h",
    "content": "/*\n *  Duktape public API for Duktape 2.2.0.\n *\n *  See the API reference for documentation on call semantics.  The exposed,\n *  supported API is between the \"BEGIN PUBLIC API\" and \"END PUBLIC API\"\n *  comments.  Other parts of the header are Duktape internal and related to\n *  e.g. platform/compiler/feature detection.\n *\n *  Git commit a459cf3c9bd1779fc01b435d69302b742675a08f (v2.2.0).\n *  Git branch master.\n *\n *  See Duktape AUTHORS.rst and LICENSE.txt for copyright and\n *  licensing information.\n */\n\n/* LICENSE.txt */\n/*\n *  ===============\n *  Duktape license\n *  ===============\n *\n *  (http://opensource.org/licenses/MIT)\n *\n *  Copyright (c) 2013-2017 by Duktape authors (see AUTHORS.rst)\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\n *  all 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\n *  THE SOFTWARE.\n */\n\n/* AUTHORS.rst */\n/*\n *  ===============\n *  Duktape authors\n *  ===============\n *\n *  Copyright\n *  =========\n *\n *  Duktape copyrights are held by its authors.  Each author has a copyright\n *  to their contribution, and agrees to irrevocably license the contribution\n *  under the Duktape ``LICENSE.txt``.\n *\n *  Authors\n *  =======\n *\n *  Please include an e-mail address, a link to your GitHub profile, or something\n *  similar to allow your contribution to be identified accurately.\n *\n *  The following people have contributed code, website contents, or Wiki contents,\n *  and agreed to irrevocably license their contributions under the Duktape\n *  ``LICENSE.txt`` (in order of appearance):\n *\n *  * Sami Vaarala <sami.vaarala@iki.fi>\n *  * Niki Dobrev\n *  * Andreas \\u00d6man <andreas@lonelycoder.com>\n *  * L\\u00e1szl\\u00f3 Lang\\u00f3 <llango.u-szeged@partner.samsung.com>\n *  * Legimet <legimet.calc@gmail.com>\n *  * Karl Skomski <karl@skomski.com>\n *  * Bruce Pascoe <fatcerberus1@gmail.com>\n *  * Ren\\u00e9 Hollander <rene@rene8888.at>\n *  * Julien Hamaide (https://github.com/crazyjul)\n *  * Sebastian G\\u00f6tte (https://github.com/jaseg)\n *  * Tomasz Magulski (https://github.com/magul)\n *  * \\D. Bohdan (https://github.com/dbohdan)\n *  * Ond\\u0159ej Jirman (https://github.com/megous)\n *  * Sa\\u00fal Ibarra Corretg\\u00e9 <saghul@gmail.com>\n *  * Jeremy HU <huxingyi@msn.com>\n *  * Ole Andr\\u00e9 Vadla Ravn\\u00e5s (https://github.com/oleavr)\n *  * Harold Brenes (https://github.com/harold-b)\n *  * Oliver Crow (https://github.com/ocrow)\n *  * Jakub Ch\\u0142api\\u0144ski (https://github.com/jchlapinski)\n *  * Brett Vickers (https://github.com/beevik)\n *  * Dominik Okwieka (https://github.com/okitec)\n *  * Remko Tron\\u00e7on (https://el-tramo.be)\n *  * Romero Malaquias (rbsm@ic.ufal.br)\n *  * Michael Drake <michael.drake@codethink.co.uk>\n *  * Steven Don (https://github.com/shdon)\n *  * Simon Stone (https://github.com/sstone1)\n *  * \\J. McC. (https://github.com/jmhmccr)\n *\n *  Other contributions\n *  ===================\n *\n *  The following people have contributed something other than code (e.g. reported\n *  bugs, provided ideas, etc; roughly in order of appearance):\n *\n *  * Greg Burns\n *  * Anthony Rabine\n *  * Carlos Costa\n *  * Aur\\u00e9lien Bouilland\n *  * Preet Desai (Pris Matic)\n *  * judofyr (http://www.reddit.com/user/judofyr)\n *  * Jason Woofenden\n *  * Micha\\u0142 Przyby\\u015b\n *  * Anthony Howe\n *  * Conrad Pankoff\n *  * Jim Schimpf\n *  * Rajaran Gaunker (https://github.com/zimbabao)\n *  * Andreas \\u00d6man\n *  * Doug Sanden\n *  * Josh Engebretson (https://github.com/JoshEngebretson)\n *  * Remo Eichenberger (https://github.com/remoe)\n *  * Mamod Mehyar (https://github.com/mamod)\n *  * David Demelier (https://github.com/markand)\n *  * Tim Caswell (https://github.com/creationix)\n *  * Mitchell Blank Jr (https://github.com/mitchblank)\n *  * https://github.com/yushli\n *  * Seo Sanghyeon (https://github.com/sanxiyn)\n *  * Han ChoongWoo (https://github.com/tunz)\n *  * Joshua Peek (https://github.com/josh)\n *  * Bruce E. Pascoe (https://github.com/fatcerberus)\n *  * https://github.com/Kelledin\n *  * https://github.com/sstruchtrup\n *  * Michael Drake (https://github.com/tlsa)\n *  * https://github.com/chris-y\n *  * Laurent Zubiaur (https://github.com/lzubiaur)\n *  * Neil Kolban (https://github.com/nkolban)\n *\n *  If you are accidentally missing from this list, send me an e-mail\n *  (``sami.vaarala@iki.fi``) and I'll fix the omission.\n */\n\n#if !defined(DUKTAPE_H_INCLUDED)\n#define DUKTAPE_H_INCLUDED\n\n#define DUK_SINGLE_FILE\n\n/*\n *  BEGIN PUBLIC API\n */\n\n/*\n *  Version and Git commit identification\n */\n\n/* Duktape version, (major * 10000) + (minor * 100) + patch.  Allows C code\n * to #if (DUK_VERSION >= NNN) against Duktape API version.  The same value\n * is also available to Ecmascript code in Duktape.version.  Unofficial\n * development snapshots have 99 for patch level (e.g. 0.10.99 would be a\n * development version after 0.10.0 but before the next official release).\n */\n#define DUK_VERSION                       20200L\n\n/* Git commit, describe, and branch for Duktape build.  Useful for\n * non-official snapshot builds so that application code can easily log\n * which Duktape snapshot was used.  Not available in the Ecmascript\n * environment.\n */\n#define DUK_GIT_COMMIT                    \"a459cf3c9bd1779fc01b435d69302b742675a08f\"\n#define DUK_GIT_DESCRIBE                  \"v2.2.0\"\n#define DUK_GIT_BRANCH                    \"master\"\n\n/* External duk_config.h provides platform/compiler/OS dependent\n * typedefs and macros, and DUK_USE_xxx config options so that\n * the rest of Duktape doesn't need to do any feature detection.\n * DUK_VERSION is defined before including so that configuration\n * snippets can react to it.\n */\n#include \"duk_config.h\"\n\n/*\n *  Avoid C++ name mangling\n */\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*\n *  Some defines forwarded from feature detection\n */\n\n#undef DUK_API_VARIADIC_MACROS\n#if defined(DUK_USE_VARIADIC_MACROS)\n#define DUK_API_VARIADIC_MACROS\n#endif\n\n#define DUK_API_NORETURN(decl) DUK_NORETURN(decl)\n\n/*\n *  Public API specific typedefs\n *\n *  Many types are wrapped by Duktape for portability to rare platforms\n *  where e.g. 'int' is a 16-bit type.  See practical typing discussion\n *  in Duktape web documentation.\n */\n\nstruct duk_thread_state;\nstruct duk_memory_functions;\nstruct duk_function_list_entry;\nstruct duk_number_list_entry;\nstruct duk_time_components;\n\n/* duk_context is now defined in duk_config.h because it may also be\n * referenced there by prototypes.\n */\ntypedef struct duk_thread_state duk_thread_state;\ntypedef struct duk_memory_functions duk_memory_functions;\ntypedef struct duk_function_list_entry duk_function_list_entry;\ntypedef struct duk_number_list_entry duk_number_list_entry;\ntypedef struct duk_time_components duk_time_components;\n\ntypedef duk_ret_t (*duk_c_function)(duk_context *ctx);\ntypedef void *(*duk_alloc_function) (void *udata, duk_size_t size);\ntypedef void *(*duk_realloc_function) (void *udata, void *ptr, duk_size_t size);\ntypedef void (*duk_free_function) (void *udata, void *ptr);\ntypedef void (*duk_fatal_function) (void *udata, const char *msg);\ntypedef void (*duk_decode_char_function) (void *udata, duk_codepoint_t codepoint);\ntypedef duk_codepoint_t (*duk_map_char_function) (void *udata, duk_codepoint_t codepoint);\ntypedef duk_ret_t (*duk_safe_call_function) (duk_context *ctx, void *udata);\ntypedef duk_size_t (*duk_debug_read_function) (void *udata, char *buffer, duk_size_t length);\ntypedef duk_size_t (*duk_debug_write_function) (void *udata, const char *buffer, duk_size_t length);\ntypedef duk_size_t (*duk_debug_peek_function) (void *udata);\ntypedef void (*duk_debug_read_flush_function) (void *udata);\ntypedef void (*duk_debug_write_flush_function) (void *udata);\ntypedef duk_idx_t (*duk_debug_request_function) (duk_context *ctx, void *udata, duk_idx_t nvalues);\ntypedef void (*duk_debug_detached_function) (duk_context *ctx, void *udata);\n\nstruct duk_thread_state {\n\t/* XXX: Enough space to hold internal suspend/resume structure.\n\t * This is rather awkward and to be fixed when the internal\n\t * structure is visible for the public API header.\n\t */\n\tchar data[128];\n};\n\nstruct duk_memory_functions {\n\tduk_alloc_function alloc_func;\n\tduk_realloc_function realloc_func;\n\tduk_free_function free_func;\n\tvoid *udata;\n};\n\nstruct duk_function_list_entry {\n\tconst char *key;\n\tduk_c_function value;\n\tduk_idx_t nargs;\n};\n\nstruct duk_number_list_entry {\n\tconst char *key;\n\tduk_double_t value;\n};\n\nstruct duk_time_components {\n\tduk_double_t year;          /* year, e.g. 2016, Ecmascript year range */\n\tduk_double_t month;         /* month: 1-12 */\n\tduk_double_t day;           /* day: 1-31 */\n\tduk_double_t hours;         /* hour: 0-59 */\n\tduk_double_t minutes;       /* minute: 0-59 */\n\tduk_double_t seconds;       /* second: 0-59 (in POSIX time no leap second) */\n\tduk_double_t milliseconds;  /* may contain sub-millisecond fractions */\n\tduk_double_t weekday;       /* weekday: 0-6, 0=Sunday, 1=Monday, ..., 6=Saturday */\n};\n\n/*\n *  Constants\n */\n\n/* Duktape debug protocol version used by this build. */\n#define DUK_DEBUG_PROTOCOL_VERSION        2\n\n/* Used to represent invalid index; if caller uses this without checking,\n * this index will map to a non-existent stack entry.  Also used in some\n * API calls as a marker to denote \"no value\".\n */\n#define DUK_INVALID_INDEX                 DUK_IDX_MIN\n\n/* Indicates that a native function does not have a fixed number of args,\n * and the argument stack should not be capped/extended at all.\n */\n#define DUK_VARARGS                       ((duk_int_t) (-1))\n\n/* Number of value stack entries (in addition to actual call arguments)\n * guaranteed to be allocated on entry to a Duktape/C function.\n */\n#define DUK_API_ENTRY_STACK               64U\n\n/* Value types, used by e.g. duk_get_type() */\n#define DUK_TYPE_MIN                      0U\n#define DUK_TYPE_NONE                     0U    /* no value, e.g. invalid index */\n#define DUK_TYPE_UNDEFINED                1U    /* Ecmascript undefined */\n#define DUK_TYPE_NULL                     2U    /* Ecmascript null */\n#define DUK_TYPE_BOOLEAN                  3U    /* Ecmascript boolean: 0 or 1 */\n#define DUK_TYPE_NUMBER                   4U    /* Ecmascript number: double */\n#define DUK_TYPE_STRING                   5U    /* Ecmascript string: CESU-8 / extended UTF-8 encoded */\n#define DUK_TYPE_OBJECT                   6U    /* Ecmascript object: includes objects, arrays, functions, threads */\n#define DUK_TYPE_BUFFER                   7U    /* fixed or dynamic, garbage collected byte buffer */\n#define DUK_TYPE_POINTER                  8U    /* raw void pointer */\n#define DUK_TYPE_LIGHTFUNC                9U    /* lightweight function pointer */\n#define DUK_TYPE_MAX                      9U\n\n/* Value mask types, used by e.g. duk_get_type_mask() */\n#define DUK_TYPE_MASK_NONE                (1U << DUK_TYPE_NONE)\n#define DUK_TYPE_MASK_UNDEFINED           (1U << DUK_TYPE_UNDEFINED)\n#define DUK_TYPE_MASK_NULL                (1U << DUK_TYPE_NULL)\n#define DUK_TYPE_MASK_BOOLEAN             (1U << DUK_TYPE_BOOLEAN)\n#define DUK_TYPE_MASK_NUMBER              (1U << DUK_TYPE_NUMBER)\n#define DUK_TYPE_MASK_STRING              (1U << DUK_TYPE_STRING)\n#define DUK_TYPE_MASK_OBJECT              (1U << DUK_TYPE_OBJECT)\n#define DUK_TYPE_MASK_BUFFER              (1U << DUK_TYPE_BUFFER)\n#define DUK_TYPE_MASK_POINTER             (1U << DUK_TYPE_POINTER)\n#define DUK_TYPE_MASK_LIGHTFUNC           (1U << DUK_TYPE_LIGHTFUNC)\n#define DUK_TYPE_MASK_THROW               (1U << 10)  /* internal flag value: throw if mask doesn't match */\n#define DUK_TYPE_MASK_PROMOTE             (1U << 11)  /* internal flag value: promote to object if mask matches */\n\n/* Coercion hints */\n#define DUK_HINT_NONE                     0    /* prefer number, unless input is a Date, in which\n                                                * case prefer string (E5 Section 8.12.8)\n                                                */\n#define DUK_HINT_STRING                   1    /* prefer string */\n#define DUK_HINT_NUMBER                   2    /* prefer number */\n\n/* Enumeration flags for duk_enum() */\n#define DUK_ENUM_INCLUDE_NONENUMERABLE    (1U << 0)    /* enumerate non-numerable properties in addition to enumerable */\n#define DUK_ENUM_INCLUDE_HIDDEN           (1U << 1)    /* enumerate hidden symbols too (in Duktape 1.x called internal properties) */\n#define DUK_ENUM_INCLUDE_SYMBOLS          (1U << 2)    /* enumerate symbols */\n#define DUK_ENUM_EXCLUDE_STRINGS          (1U << 3)    /* exclude strings */\n#define DUK_ENUM_OWN_PROPERTIES_ONLY      (1U << 4)    /* don't walk prototype chain, only check own properties */\n#define DUK_ENUM_ARRAY_INDICES_ONLY       (1U << 5)    /* only enumerate array indices */\n/* XXX: misleading name */\n#define DUK_ENUM_SORT_ARRAY_INDICES       (1U << 6)    /* sort array indices (applied to full enumeration result, including inherited array indices); XXX: misleading name */\n#define DUK_ENUM_NO_PROXY_BEHAVIOR        (1U << 7)    /* enumerate a proxy object itself without invoking proxy behavior */\n\n/* Compilation flags for duk_compile() and duk_eval() */\n/* DUK_COMPILE_xxx bits 0-2 are reserved for an internal 'nargs' argument.\n */\n#define DUK_COMPILE_EVAL                  (1U << 3)    /* compile eval code (instead of global code) */\n#define DUK_COMPILE_FUNCTION              (1U << 4)    /* compile function code (instead of global code) */\n#define DUK_COMPILE_STRICT                (1U << 5)    /* use strict (outer) context for global, eval, or function code */\n#define DUK_COMPILE_SHEBANG               (1U << 6)    /* allow shebang ('#! ...') comment on first line of source */\n#define DUK_COMPILE_SAFE                  (1U << 7)    /* (internal) catch compilation errors */\n#define DUK_COMPILE_NORESULT              (1U << 8)    /* (internal) omit eval result */\n#define DUK_COMPILE_NOSOURCE              (1U << 9)    /* (internal) no source string on stack */\n#define DUK_COMPILE_STRLEN                (1U << 10)   /* (internal) take strlen() of src_buffer (avoids double evaluation in macro) */\n#define DUK_COMPILE_NOFILENAME            (1U << 11)   /* (internal) no filename on stack */\n#define DUK_COMPILE_FUNCEXPR              (1U << 12)   /* (internal) source is a function expression (used for Function constructor) */\n\n/* Flags for duk_def_prop() and its variants; base flags + a lot of convenience shorthands */\n#define DUK_DEFPROP_WRITABLE              (1U << 0)    /* set writable (effective if DUK_DEFPROP_HAVE_WRITABLE set) */\n#define DUK_DEFPROP_ENUMERABLE            (1U << 1)    /* set enumerable (effective if DUK_DEFPROP_HAVE_ENUMERABLE set) */\n#define DUK_DEFPROP_CONFIGURABLE          (1U << 2)    /* set configurable (effective if DUK_DEFPROP_HAVE_CONFIGURABLE set) */\n#define DUK_DEFPROP_HAVE_WRITABLE         (1U << 3)    /* set/clear writable */\n#define DUK_DEFPROP_HAVE_ENUMERABLE       (1U << 4)    /* set/clear enumerable */\n#define DUK_DEFPROP_HAVE_CONFIGURABLE     (1U << 5)    /* set/clear configurable */\n#define DUK_DEFPROP_HAVE_VALUE            (1U << 6)    /* set value (given on value stack) */\n#define DUK_DEFPROP_HAVE_GETTER           (1U << 7)    /* set getter (given on value stack) */\n#define DUK_DEFPROP_HAVE_SETTER           (1U << 8)    /* set setter (given on value stack) */\n#define DUK_DEFPROP_FORCE                 (1U << 9)    /* force change if possible, may still fail for e.g. virtual properties */\n#define DUK_DEFPROP_SET_WRITABLE          (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_WRITABLE)\n#define DUK_DEFPROP_CLEAR_WRITABLE        DUK_DEFPROP_HAVE_WRITABLE\n#define DUK_DEFPROP_SET_ENUMERABLE        (DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_ENUMERABLE)\n#define DUK_DEFPROP_CLEAR_ENUMERABLE      DUK_DEFPROP_HAVE_ENUMERABLE\n#define DUK_DEFPROP_SET_CONFIGURABLE      (DUK_DEFPROP_HAVE_CONFIGURABLE | DUK_DEFPROP_CONFIGURABLE)\n#define DUK_DEFPROP_CLEAR_CONFIGURABLE    DUK_DEFPROP_HAVE_CONFIGURABLE\n#define DUK_DEFPROP_W                     DUK_DEFPROP_WRITABLE\n#define DUK_DEFPROP_E                     DUK_DEFPROP_ENUMERABLE\n#define DUK_DEFPROP_C                     DUK_DEFPROP_CONFIGURABLE\n#define DUK_DEFPROP_WE                    (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE)\n#define DUK_DEFPROP_WC                    (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_CONFIGURABLE)\n#define DUK_DEFPROP_WEC                   (DUK_DEFPROP_WRITABLE | DUK_DEFPROP_ENUMERABLE | DUK_DEFPROP_CONFIGURABLE)\n#define DUK_DEFPROP_HAVE_W                DUK_DEFPROP_HAVE_WRITABLE\n#define DUK_DEFPROP_HAVE_E                DUK_DEFPROP_HAVE_ENUMERABLE\n#define DUK_DEFPROP_HAVE_C                DUK_DEFPROP_HAVE_CONFIGURABLE\n#define DUK_DEFPROP_HAVE_WE               (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE)\n#define DUK_DEFPROP_HAVE_WC               (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_CONFIGURABLE)\n#define DUK_DEFPROP_HAVE_WEC              (DUK_DEFPROP_HAVE_WRITABLE | DUK_DEFPROP_HAVE_ENUMERABLE | DUK_DEFPROP_HAVE_CONFIGURABLE)\n#define DUK_DEFPROP_SET_W                 DUK_DEFPROP_SET_WRITABLE\n#define DUK_DEFPROP_SET_E                 DUK_DEFPROP_SET_ENUMERABLE\n#define DUK_DEFPROP_SET_C                 DUK_DEFPROP_SET_CONFIGURABLE\n#define DUK_DEFPROP_SET_WE                (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE)\n#define DUK_DEFPROP_SET_WC                (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_CONFIGURABLE)\n#define DUK_DEFPROP_SET_WEC               (DUK_DEFPROP_SET_WRITABLE | DUK_DEFPROP_SET_ENUMERABLE | DUK_DEFPROP_SET_CONFIGURABLE)\n#define DUK_DEFPROP_CLEAR_W               DUK_DEFPROP_CLEAR_WRITABLE\n#define DUK_DEFPROP_CLEAR_E               DUK_DEFPROP_CLEAR_ENUMERABLE\n#define DUK_DEFPROP_CLEAR_C               DUK_DEFPROP_CLEAR_CONFIGURABLE\n#define DUK_DEFPROP_CLEAR_WE              (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE)\n#define DUK_DEFPROP_CLEAR_WC              (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE)\n#define DUK_DEFPROP_CLEAR_WEC             (DUK_DEFPROP_CLEAR_WRITABLE | DUK_DEFPROP_CLEAR_ENUMERABLE | DUK_DEFPROP_CLEAR_CONFIGURABLE)\n#define DUK_DEFPROP_ATTR_W                (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_W)\n#define DUK_DEFPROP_ATTR_E                (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_E)\n#define DUK_DEFPROP_ATTR_C                (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_C)\n#define DUK_DEFPROP_ATTR_WE               (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WE)\n#define DUK_DEFPROP_ATTR_WC               (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WC)\n#define DUK_DEFPROP_ATTR_WEC              (DUK_DEFPROP_HAVE_WEC | DUK_DEFPROP_WEC)\n\n/* Flags for duk_push_thread_raw() */\n#define DUK_THREAD_NEW_GLOBAL_ENV         (1U << 0)    /* create a new global environment */\n\n/* Flags for duk_gc() */\n#define DUK_GC_COMPACT                    (1U << 0)    /* compact heap objects */\n\n/* Error codes (must be 8 bits at most, see duk_error.h) */\n#define DUK_ERR_NONE                      0    /* no error (e.g. from duk_get_error_code()) */\n#define DUK_ERR_ERROR                     1    /* Error */\n#define DUK_ERR_EVAL_ERROR                2    /* EvalError */\n#define DUK_ERR_RANGE_ERROR               3    /* RangeError */\n#define DUK_ERR_REFERENCE_ERROR           4    /* ReferenceError */\n#define DUK_ERR_SYNTAX_ERROR              5    /* SyntaxError */\n#define DUK_ERR_TYPE_ERROR                6    /* TypeError */\n#define DUK_ERR_URI_ERROR                 7    /* URIError */\n\n/* Return codes for C functions (shortcut for throwing an error) */\n#define DUK_RET_ERROR                     (-DUK_ERR_ERROR)\n#define DUK_RET_EVAL_ERROR                (-DUK_ERR_EVAL_ERROR)\n#define DUK_RET_RANGE_ERROR               (-DUK_ERR_RANGE_ERROR)\n#define DUK_RET_REFERENCE_ERROR           (-DUK_ERR_REFERENCE_ERROR)\n#define DUK_RET_SYNTAX_ERROR              (-DUK_ERR_SYNTAX_ERROR)\n#define DUK_RET_TYPE_ERROR                (-DUK_ERR_TYPE_ERROR)\n#define DUK_RET_URI_ERROR                 (-DUK_ERR_URI_ERROR)\n\n/* Return codes for protected calls (duk_safe_call(), duk_pcall()) */\n#define DUK_EXEC_SUCCESS                  0\n#define DUK_EXEC_ERROR                    1\n\n/* Debug levels for DUK_USE_DEBUG_WRITE(). */\n#define DUK_LEVEL_DEBUG                   0\n#define DUK_LEVEL_DDEBUG                  1\n#define DUK_LEVEL_DDDEBUG                 2\n\n/*\n *  Macros to create Symbols as C statically constructed strings.\n *\n *  Call e.g. as DUK_HIDDEN_SYMBOL(\"myProperty\") <=> (\"\\xFF\" \"myProperty\").\n *  Local symbols have a unique suffix, caller should take care to avoid\n *  conflicting with the Duktape internal representation by e.g. prepending\n *  a '!' character: DUK_LOCAL_SYMBOL(\"myLocal\", \"!123\").\n *\n *  Note that these can only be used for string constants, not dynamically\n *  created strings.\n */\n\n#define DUK_HIDDEN_SYMBOL(x)     (\"\\xFF\" x)\n#define DUK_GLOBAL_SYMBOL(x)     (\"\\x80\" x)\n#define DUK_LOCAL_SYMBOL(x,uniq) (\"\\x81\" x \"\\xff\" uniq)\n#define DUK_WELLKNOWN_SYMBOL(x)  (\"\\x81\" x \"\\xff\")\n\n/*\n *  If no variadic macros, __FILE__ and __LINE__ are passed through globals\n *  which is ugly and not thread safe.\n */\n\n#if !defined(DUK_API_VARIADIC_MACROS)\nDUK_EXTERNAL_DECL const char *duk_api_global_filename;\nDUK_EXTERNAL_DECL duk_int_t duk_api_global_line;\n#endif\n\n/*\n *  Context management\n */\n\nDUK_EXTERNAL_DECL\nduk_context *duk_create_heap(duk_alloc_function alloc_func,\n                             duk_realloc_function realloc_func,\n                             duk_free_function free_func,\n                             void *heap_udata,\n                             duk_fatal_function fatal_handler);\nDUK_EXTERNAL_DECL void duk_destroy_heap(duk_context *ctx);\n\nDUK_EXTERNAL_DECL void duk_suspend(duk_context *ctx, duk_thread_state *state);\nDUK_EXTERNAL_DECL void duk_resume(duk_context *ctx, const duk_thread_state *state);\n\n#define duk_create_heap_default() \\\n\tduk_create_heap(NULL, NULL, NULL, NULL, NULL)\n\n/*\n *  Memory management\n *\n *  Raw functions have no side effects (cannot trigger GC).\n */\n\nDUK_EXTERNAL_DECL void *duk_alloc_raw(duk_context *ctx, duk_size_t size);\nDUK_EXTERNAL_DECL void duk_free_raw(duk_context *ctx, void *ptr);\nDUK_EXTERNAL_DECL void *duk_realloc_raw(duk_context *ctx, void *ptr, duk_size_t size);\nDUK_EXTERNAL_DECL void *duk_alloc(duk_context *ctx, duk_size_t size);\nDUK_EXTERNAL_DECL void duk_free(duk_context *ctx, void *ptr);\nDUK_EXTERNAL_DECL void *duk_realloc(duk_context *ctx, void *ptr, duk_size_t size);\nDUK_EXTERNAL_DECL void duk_get_memory_functions(duk_context *ctx, duk_memory_functions *out_funcs);\nDUK_EXTERNAL_DECL void duk_gc(duk_context *ctx, duk_uint_t flags);\n\n/*\n *  Error handling\n */\n\nDUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_throw_raw(duk_context *ctx));\n#define duk_throw(ctx) \\\n\t(duk_throw_raw((ctx)), (duk_ret_t) 0)\nDUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_fatal_raw(duk_context *ctx, const char *err_msg));\n#define duk_fatal(ctx,err_msg) \\\n\t(duk_fatal_raw((ctx), (err_msg)), (duk_ret_t) 0)\nDUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...));\n\n#if defined(DUK_API_VARIADIC_MACROS)\n#define duk_error(ctx,err_code,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#define duk_generic_error(ctx,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#define duk_eval_error(ctx,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#define duk_range_error(ctx,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#define duk_reference_error(ctx,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#define duk_syntax_error(ctx,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#define duk_type_error(ctx,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#define duk_uri_error(ctx,...)  \\\n\t(duk_error_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__), (duk_ret_t) 0)\n#else  /* DUK_API_VARIADIC_MACROS */\n/* For legacy compilers without variadic macros a macro hack is used to allow\n * variable arguments.  While the macro allows \"return duk_error(...)\", it\n * will fail with e.g. \"(void) duk_error(...)\".  The calls are noreturn but\n * with a return value to allow the \"return duk_error(...)\" idiom.  This may\n * cause some compiler warnings, but without noreturn the generated code is\n * often worse.  The same approach as with variadic macros (using\n * \"(duk_error(...), 0)\") won't work due to the macro hack structure.\n */\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...));\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_generic_error_stash(duk_context *ctx, const char *fmt, ...));\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_eval_error_stash(duk_context *ctx, const char *fmt, ...));\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_range_error_stash(duk_context *ctx, const char *fmt, ...));\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_reference_error_stash(duk_context *ctx, const char *fmt, ...));\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_syntax_error_stash(duk_context *ctx, const char *fmt, ...));\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_type_error_stash(duk_context *ctx, const char *fmt, ...));\nDUK_API_NORETURN(DUK_EXTERNAL_DECL duk_ret_t duk_uri_error_stash(duk_context *ctx, const char *fmt, ...));\n#define duk_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_error_stash)  /* last value is func pointer, arguments follow in parens */\n#define duk_generic_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_generic_error_stash)\n#define duk_eval_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_eval_error_stash)\n#define duk_range_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_range_error_stash)\n#define duk_reference_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_reference_error_stash)\n#define duk_syntax_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_syntax_error_stash)\n#define duk_type_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_type_error_stash)\n#define duk_uri_error  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_uri_error_stash)\n#endif  /* DUK_API_VARIADIC_MACROS */\n\nDUK_API_NORETURN(DUK_EXTERNAL_DECL void duk_error_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap));\n\n#define duk_error_va(ctx,err_code,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n#define duk_generic_error_va(ctx,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n#define duk_eval_error_va(ctx,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_EVAL_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n#define duk_range_error_va(ctx,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_RANGE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n#define duk_reference_error_va(ctx,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_REFERENCE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n#define duk_syntax_error_va(ctx,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_SYNTAX_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n#define duk_type_error_va(ctx,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_TYPE_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n#define duk_uri_error_va(ctx,fmt,ap)  \\\n\t(duk_error_va_raw((ctx), (duk_errcode_t) DUK_ERR_URI_ERROR, (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap)), (duk_ret_t) 0)\n\n/*\n *  Other state related functions\n */\n\nDUK_EXTERNAL_DECL duk_bool_t duk_is_strict_call(duk_context *ctx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_constructor_call(duk_context *ctx);\n\n/*\n *  Stack management\n */\n\nDUK_EXTERNAL_DECL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_require_valid_index(duk_context *ctx, duk_idx_t idx);\n\nDUK_EXTERNAL_DECL duk_idx_t duk_get_top(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_set_top(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_idx_t duk_get_top_index(duk_context *ctx);\nDUK_EXTERNAL_DECL duk_idx_t duk_require_top_index(duk_context *ctx);\n\n/* Although extra/top could be an unsigned type here, using a signed type\n * makes the API more robust to calling code calculation errors or corner\n * cases (where caller might occasionally come up with negative values).\n * Negative values are treated as zero, which is better than casting them\n * to a large unsigned number.  (This principle is used elsewhere in the\n * API too.)\n */\nDUK_EXTERNAL_DECL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra);\nDUK_EXTERNAL_DECL void duk_require_stack(duk_context *ctx, duk_idx_t extra);\nDUK_EXTERNAL_DECL duk_bool_t duk_check_stack_top(duk_context *ctx, duk_idx_t top);\nDUK_EXTERNAL_DECL void duk_require_stack_top(duk_context *ctx, duk_idx_t top);\n\n/*\n *  Stack manipulation (other than push/pop)\n */\n\nDUK_EXTERNAL_DECL void duk_swap(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);\nDUK_EXTERNAL_DECL void duk_swap_top(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_dup(duk_context *ctx, duk_idx_t from_idx);\nDUK_EXTERNAL_DECL void duk_dup_top(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_insert(duk_context *ctx, duk_idx_t to_idx);\nDUK_EXTERNAL_DECL void duk_replace(duk_context *ctx, duk_idx_t to_idx);\nDUK_EXTERNAL_DECL void duk_copy(duk_context *ctx, duk_idx_t from_idx, duk_idx_t to_idx);\nDUK_EXTERNAL_DECL void duk_remove(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_xcopymove_raw(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count, duk_bool_t is_copy);\n\n#define duk_xmove_top(to_ctx,from_ctx,count) \\\n\tduk_xcopymove_raw((to_ctx), (from_ctx), (count), 0 /*is_copy*/)\n#define duk_xcopy_top(to_ctx,from_ctx,count) \\\n\tduk_xcopymove_raw((to_ctx), (from_ctx), (count), 1 /*is_copy*/)\n\n/*\n *  Push operations\n *\n *  Push functions return the absolute (relative to bottom of frame)\n *  position of the pushed value for convenience.\n *\n *  Note: duk_dup() is technically a push.\n */\n\nDUK_EXTERNAL_DECL void duk_push_undefined(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_null(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_boolean(duk_context *ctx, duk_bool_t val);\nDUK_EXTERNAL_DECL void duk_push_true(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_false(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_number(duk_context *ctx, duk_double_t val);\nDUK_EXTERNAL_DECL void duk_push_nan(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_int(duk_context *ctx, duk_int_t val);\nDUK_EXTERNAL_DECL void duk_push_uint(duk_context *ctx, duk_uint_t val);\nDUK_EXTERNAL_DECL const char *duk_push_string(duk_context *ctx, const char *str);\nDUK_EXTERNAL_DECL const char *duk_push_lstring(duk_context *ctx, const char *str, duk_size_t len);\nDUK_EXTERNAL_DECL void duk_push_pointer(duk_context *ctx, void *p);\nDUK_EXTERNAL_DECL const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...);\nDUK_EXTERNAL_DECL const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap);\n\nDUK_EXTERNAL_DECL void duk_push_this(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_current_function(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_current_thread(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_global_object(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_heap_stash(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_global_stash(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_push_thread_stash(duk_context *ctx, duk_context *target_ctx);\n\nDUK_EXTERNAL_DECL duk_idx_t duk_push_object(duk_context *ctx);\nDUK_EXTERNAL_DECL duk_idx_t duk_push_bare_object(duk_context *ctx);\nDUK_EXTERNAL_DECL duk_idx_t duk_push_array(duk_context *ctx);\nDUK_EXTERNAL_DECL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_idx_t nargs);\nDUK_EXTERNAL_DECL duk_idx_t duk_push_c_lightfunc(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic);\nDUK_EXTERNAL_DECL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t flags);\nDUK_EXTERNAL_DECL duk_idx_t duk_push_proxy(duk_context *ctx, duk_uint_t proxy_flags);\n\n#define duk_push_thread(ctx) \\\n\tduk_push_thread_raw((ctx), 0 /*flags*/)\n\n#define duk_push_thread_new_globalenv(ctx) \\\n\tduk_push_thread_raw((ctx), DUK_THREAD_NEW_GLOBAL_ENV /*flags*/)\n\nDUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...);\n\n#if defined(DUK_API_VARIADIC_MACROS)\n#define duk_push_error_object(ctx,err_code,...)  \\\n\tduk_push_error_object_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), __VA_ARGS__)\n#else\nDUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...);\n/* Note: parentheses are required so that the comma expression works in assignments. */\n#define duk_push_error_object  \\\n\t(duk_api_global_filename = (const char *) (DUK_FILE_MACRO), \\\n\t duk_api_global_line = (duk_int_t) (DUK_LINE_MACRO), \\\n\t duk_push_error_object_stash)  /* last value is func pointer, arguments follow in parens */\n#endif\n\nDUK_EXTERNAL_DECL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap);\n#define duk_push_error_object_va(ctx,err_code,fmt,ap)  \\\n\tduk_push_error_object_va_raw((ctx), (err_code), (const char *) (DUK_FILE_MACRO), (duk_int_t) (DUK_LINE_MACRO), (fmt), (ap))\n\n#define DUK_BUF_FLAG_DYNAMIC   (1 << 0)    /* internal flag: dynamic buffer */\n#define DUK_BUF_FLAG_EXTERNAL  (1 << 1)    /* internal flag: external buffer */\n#define DUK_BUF_FLAG_NOZERO    (1 << 2)    /* internal flag: don't zero allocated buffer */\n\nDUK_EXTERNAL_DECL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_small_uint_t flags);\n\n#define duk_push_buffer(ctx,size,dynamic) \\\n\tduk_push_buffer_raw((ctx), (size), (dynamic) ? DUK_BUF_FLAG_DYNAMIC : 0)\n#define duk_push_fixed_buffer(ctx,size) \\\n\tduk_push_buffer_raw((ctx), (size), 0 /*flags*/)\n#define duk_push_dynamic_buffer(ctx,size) \\\n\tduk_push_buffer_raw((ctx), (size), DUK_BUF_FLAG_DYNAMIC /*flags*/)\n#define duk_push_external_buffer(ctx) \\\n\t((void) duk_push_buffer_raw((ctx), 0, DUK_BUF_FLAG_DYNAMIC | DUK_BUF_FLAG_EXTERNAL))\n\n#define DUK_BUFOBJ_ARRAYBUFFER         0\n#define DUK_BUFOBJ_NODEJS_BUFFER       1\n#define DUK_BUFOBJ_DATAVIEW            2\n#define DUK_BUFOBJ_INT8ARRAY           3\n#define DUK_BUFOBJ_UINT8ARRAY          4\n#define DUK_BUFOBJ_UINT8CLAMPEDARRAY   5\n#define DUK_BUFOBJ_INT16ARRAY          6\n#define DUK_BUFOBJ_UINT16ARRAY         7\n#define DUK_BUFOBJ_INT32ARRAY          8\n#define DUK_BUFOBJ_UINT32ARRAY         9\n#define DUK_BUFOBJ_FLOAT32ARRAY        10\n#define DUK_BUFOBJ_FLOAT64ARRAY        11\n\nDUK_EXTERNAL_DECL void duk_push_buffer_object(duk_context *ctx, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags);\n\nDUK_EXTERNAL_DECL duk_idx_t duk_push_heapptr(duk_context *ctx, void *ptr);\n\n/*\n *  Pop operations\n */\n\nDUK_EXTERNAL_DECL void duk_pop(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_pop_n(duk_context *ctx, duk_idx_t count);\nDUK_EXTERNAL_DECL void duk_pop_2(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_pop_3(duk_context *ctx);\n\n/*\n *  Type checks\n *\n *  duk_is_none(), which would indicate whether index it outside of stack,\n *  is not needed; duk_is_valid_index() gives the same information.\n */\n\nDUK_EXTERNAL_DECL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t idx, duk_int_t type);\nDUK_EXTERNAL_DECL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t idx, duk_uint_t mask);\n\nDUK_EXTERNAL_DECL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t idx);\n#define duk_is_null_or_undefined(ctx, idx) \\\n\t((duk_get_type_mask((ctx), (idx)) & (DUK_TYPE_MASK_NULL | DUK_TYPE_MASK_UNDEFINED)) ? 1 : 0)\n\nDUK_EXTERNAL_DECL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_buffer_data(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t idx);\n\nDUK_EXTERNAL_DECL duk_bool_t duk_is_symbol(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t idx);\n\n#define duk_is_callable(ctx,idx) \\\n\tduk_is_function((ctx), (idx))\nDUK_EXTERNAL_DECL duk_bool_t duk_is_constructable(duk_context *ctx, duk_idx_t idx);\n\nDUK_EXTERNAL_DECL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_is_external_buffer(duk_context *ctx, duk_idx_t idx);\n\n/* Buffers and lightfuncs are not considered primitive because they mimic\n * objects and e.g. duk_to_primitive() will coerce them instead of returning\n * them as is.  Symbols are represented as strings internally.\n */\n#define duk_is_primitive(ctx,idx) \\\n\tduk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_UNDEFINED | \\\n\t                                  DUK_TYPE_MASK_NULL | \\\n\t                                  DUK_TYPE_MASK_BOOLEAN | \\\n\t                                  DUK_TYPE_MASK_NUMBER | \\\n\t                                  DUK_TYPE_MASK_STRING | \\\n\t                                  DUK_TYPE_MASK_POINTER)\n\n/* Symbols are object coercible, covered by DUK_TYPE_MASK_STRING. */\n#define duk_is_object_coercible(ctx,idx) \\\n\tduk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \\\n\t                                  DUK_TYPE_MASK_NUMBER | \\\n\t                                  DUK_TYPE_MASK_STRING | \\\n\t                                  DUK_TYPE_MASK_OBJECT | \\\n\t                                  DUK_TYPE_MASK_BUFFER | \\\n\t                                  DUK_TYPE_MASK_POINTER | \\\n\t                                  DUK_TYPE_MASK_LIGHTFUNC)\n\nDUK_EXTERNAL_DECL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t idx);\n#define duk_is_error(ctx,idx) \\\n\t(duk_get_error_code((ctx), (idx)) != 0)\n#define duk_is_eval_error(ctx,idx) \\\n\t(duk_get_error_code((ctx), (idx)) == DUK_ERR_EVAL_ERROR)\n#define duk_is_range_error(ctx,idx) \\\n\t(duk_get_error_code((ctx), (idx)) == DUK_ERR_RANGE_ERROR)\n#define duk_is_reference_error(ctx,idx) \\\n\t(duk_get_error_code((ctx), (idx)) == DUK_ERR_REFERENCE_ERROR)\n#define duk_is_syntax_error(ctx,idx) \\\n\t(duk_get_error_code((ctx), (idx)) == DUK_ERR_SYNTAX_ERROR)\n#define duk_is_type_error(ctx,idx) \\\n\t(duk_get_error_code((ctx), (idx)) == DUK_ERR_TYPE_ERROR)\n#define duk_is_uri_error(ctx,idx) \\\n\t(duk_get_error_code((ctx), (idx)) == DUK_ERR_URI_ERROR)\n\n/*\n *  Get operations: no coercion, returns default value for invalid\n *  indices and invalid value types.\n *\n *  duk_get_undefined() and duk_get_null() would be pointless and\n *  are not included.\n */\n\nDUK_EXTERNAL_DECL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_get_string(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_get_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);\nDUK_EXTERNAL_DECL void *duk_get_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);\nDUK_EXTERNAL_DECL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);\nDUK_EXTERNAL_DECL void *duk_get_pointer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_context *duk_get_context(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void *duk_get_heapptr(duk_context *ctx, duk_idx_t idx);\n\n/*\n *  Get-with-explicit default operations: like get operations but with an\n *  explicit default value.\n */\n\nDUK_EXTERNAL_DECL duk_bool_t duk_get_boolean_default(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value);\nDUK_EXTERNAL_DECL duk_double_t duk_get_number_default(duk_context *ctx, duk_idx_t idx, duk_double_t def_value);\nDUK_EXTERNAL_DECL duk_int_t duk_get_int_default(duk_context *ctx, duk_idx_t idx, duk_int_t def_value);\nDUK_EXTERNAL_DECL duk_uint_t duk_get_uint_default(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value);\nDUK_EXTERNAL_DECL const char *duk_get_string_default(duk_context *ctx, duk_idx_t idx, const char *def_value);\nDUK_EXTERNAL_DECL const char *duk_get_lstring_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len);\nDUK_EXTERNAL_DECL void *duk_get_buffer_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len);\nDUK_EXTERNAL_DECL void *duk_get_buffer_data_default(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_len);\nDUK_EXTERNAL_DECL void *duk_get_pointer_default(duk_context *ctx, duk_idx_t idx, void *def_value);\nDUK_EXTERNAL_DECL duk_c_function duk_get_c_function_default(duk_context *ctx, duk_idx_t idx, duk_c_function def_value);\nDUK_EXTERNAL_DECL duk_context *duk_get_context_default(duk_context *ctx, duk_idx_t idx, duk_context *def_value);\nDUK_EXTERNAL_DECL void *duk_get_heapptr_default(duk_context *ctx, duk_idx_t idx, void *def_value);\n\n/*\n *  Opt operations: like require operations but with an explicit default value\n *  when value is undefined or index is invalid, null and non-matching types\n *  cause a TypeError.\n */\n\nDUK_EXTERNAL_DECL duk_bool_t duk_opt_boolean(duk_context *ctx, duk_idx_t idx, duk_bool_t def_value);\nDUK_EXTERNAL_DECL duk_double_t duk_opt_number(duk_context *ctx, duk_idx_t idx, duk_double_t def_value);\nDUK_EXTERNAL_DECL duk_int_t duk_opt_int(duk_context *ctx, duk_idx_t idx, duk_int_t def_value);\nDUK_EXTERNAL_DECL duk_uint_t duk_opt_uint(duk_context *ctx, duk_idx_t idx, duk_uint_t def_value);\nDUK_EXTERNAL_DECL const char *duk_opt_string(duk_context *ctx, duk_idx_t idx, const char *def_ptr);\nDUK_EXTERNAL_DECL const char *duk_opt_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len, const char *def_ptr, duk_size_t def_len);\nDUK_EXTERNAL_DECL void *duk_opt_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size);\nDUK_EXTERNAL_DECL void *duk_opt_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, void *def_ptr, duk_size_t def_size);\nDUK_EXTERNAL_DECL void *duk_opt_pointer(duk_context *ctx, duk_idx_t idx, void *def_value);\nDUK_EXTERNAL_DECL duk_c_function duk_opt_c_function(duk_context *ctx, duk_idx_t idx, duk_c_function def_value);\nDUK_EXTERNAL_DECL duk_context *duk_opt_context(duk_context *ctx, duk_idx_t idx, duk_context *def_value);\nDUK_EXTERNAL_DECL void *duk_opt_heapptr(duk_context *ctx, duk_idx_t idx, void *def_value);\n\n/*\n *  Require operations: no coercion, throw error if index or type\n *  is incorrect.  No defaulting.\n */\n\n#define duk_require_type_mask(ctx,idx,mask) \\\n\t((void) duk_check_type_mask((ctx), (idx), (mask) | DUK_TYPE_MASK_THROW))\n\nDUK_EXTERNAL_DECL void duk_require_undefined(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_require_null(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_require_string(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_require_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);\nDUK_EXTERNAL_DECL void duk_require_object(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void *duk_require_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);\nDUK_EXTERNAL_DECL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);\nDUK_EXTERNAL_DECL void *duk_require_pointer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_context *duk_require_context(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_require_function(duk_context *ctx, duk_idx_t idx);\n#define duk_require_callable(ctx,idx) \\\n\tduk_require_function((ctx), (idx))\nDUK_EXTERNAL_DECL void *duk_require_heapptr(duk_context *ctx, duk_idx_t idx);\n\n/* Symbols are object coercible and covered by DUK_TYPE_MASK_STRING. */\n#define duk_require_object_coercible(ctx,idx) \\\n\t((void) duk_check_type_mask((ctx), (idx), DUK_TYPE_MASK_BOOLEAN | \\\n\t                                            DUK_TYPE_MASK_NUMBER | \\\n\t                                            DUK_TYPE_MASK_STRING | \\\n\t                                            DUK_TYPE_MASK_OBJECT | \\\n\t                                            DUK_TYPE_MASK_BUFFER | \\\n\t                                            DUK_TYPE_MASK_POINTER | \\\n\t                                            DUK_TYPE_MASK_LIGHTFUNC | \\\n\t                                            DUK_TYPE_MASK_THROW))\n\n/*\n *  Coercion operations: in-place coercion, return coerced value where\n *  applicable.  If index is invalid, throw error.  Some coercions may\n *  throw an expected error (e.g. from a toString() or valueOf() call)\n *  or an internal error (e.g. from out of memory).\n */\n\nDUK_EXTERNAL_DECL void duk_to_undefined(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_to_null(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_to_string(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);\nDUK_EXTERNAL_DECL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size, duk_uint_t flags);\nDUK_EXTERNAL_DECL void *duk_to_pointer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_to_object(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_to_primitive(duk_context *ctx, duk_idx_t idx, duk_int_t hint);\n\n#define DUK_BUF_MODE_FIXED      0   /* internal: request fixed buffer result */\n#define DUK_BUF_MODE_DYNAMIC    1   /* internal: request dynamic buffer result */\n#define DUK_BUF_MODE_DONTCARE   2   /* internal: don't care about fixed/dynamic nature */\n\n#define duk_to_buffer(ctx,idx,out_size) \\\n\tduk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DONTCARE)\n#define duk_to_fixed_buffer(ctx,idx,out_size) \\\n\tduk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_FIXED)\n#define duk_to_dynamic_buffer(ctx,idx,out_size) \\\n\tduk_to_buffer_raw((ctx), (idx), (out_size), DUK_BUF_MODE_DYNAMIC)\n\n/* safe variants of a few coercion operations */\nDUK_EXTERNAL_DECL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t idx, duk_size_t *out_len);\n#define duk_safe_to_string(ctx,idx) \\\n\tduk_safe_to_lstring((ctx), (idx), NULL)\n\n/*\n *  Value length\n */\n\nDUK_EXTERNAL_DECL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_set_length(duk_context *ctx, duk_idx_t idx, duk_size_t len);\n#if 0\n/* duk_require_length()? */\n/* duk_opt_length()? */\n#endif\n\n/*\n *  Misc conversion\n */\n\nDUK_EXTERNAL_DECL const char *duk_base64_encode(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_base64_decode(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_hex_encode(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_hex_decode(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL const char *duk_json_encode(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_json_decode(duk_context *ctx, duk_idx_t idx);\n\nDUK_EXTERNAL_DECL const char *duk_buffer_to_string(duk_context *ctx, duk_idx_t idx);\n\n/*\n *  Buffer\n */\n\nDUK_EXTERNAL_DECL void *duk_resize_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t new_size);\nDUK_EXTERNAL_DECL void *duk_steal_buffer(duk_context *ctx, duk_idx_t idx, duk_size_t *out_size);\nDUK_EXTERNAL_DECL void duk_config_buffer(duk_context *ctx, duk_idx_t idx, void *ptr, duk_size_t len);\n\n/*\n *  Property access\n *\n *  The basic function assumes key is on stack.  The _string variant takes\n *  a C string as a property name, while the _index variant takes an array\n *  index as a property name (e.g. 123 is equivalent to the key \"123\").\n */\n\nDUK_EXTERNAL_DECL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);\nDUK_EXTERNAL_DECL duk_bool_t duk_get_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);\nDUK_EXTERNAL_DECL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_get_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);\nDUK_EXTERNAL_DECL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);\nDUK_EXTERNAL_DECL duk_bool_t duk_put_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);\nDUK_EXTERNAL_DECL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_put_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);\nDUK_EXTERNAL_DECL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);\nDUK_EXTERNAL_DECL duk_bool_t duk_del_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);\nDUK_EXTERNAL_DECL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_del_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);\nDUK_EXTERNAL_DECL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key);\nDUK_EXTERNAL_DECL duk_bool_t duk_has_prop_lstring(duk_context *ctx, duk_idx_t obj_idx, const char *key, duk_size_t key_len);\nDUK_EXTERNAL_DECL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx);\nDUK_EXTERNAL_DECL duk_bool_t duk_has_prop_heapptr(duk_context *ctx, duk_idx_t obj_idx, void *ptr);\n\nDUK_EXTERNAL_DECL void duk_get_prop_desc(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags);\nDUK_EXTERNAL_DECL void duk_def_prop(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t flags);\n\nDUK_EXTERNAL_DECL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key);\nDUK_EXTERNAL_DECL duk_bool_t duk_get_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len);\nDUK_EXTERNAL_DECL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key);\nDUK_EXTERNAL_DECL duk_bool_t duk_put_global_lstring(duk_context *ctx, const char *key, duk_size_t key_len);\n\n/*\n *  Inspection\n */\n\nDUK_EXTERNAL_DECL void duk_inspect_value(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_inspect_callstack_entry(duk_context *ctx, duk_int_t level);\n\n/*\n *  Object prototype\n */\n\nDUK_EXTERNAL_DECL void duk_get_prototype(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_set_prototype(duk_context *ctx, duk_idx_t idx);\n\n/*\n *  Object finalizer\n */\n\nDUK_EXTERNAL_DECL void duk_get_finalizer(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_set_finalizer(duk_context *ctx, duk_idx_t idx);\n\n/*\n *  Global object\n */\n\nDUK_EXTERNAL_DECL void duk_set_global_object(duk_context *ctx);\n\n/*\n *  Duktape/C function magic value\n */\n\nDUK_EXTERNAL_DECL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL void duk_set_magic(duk_context *ctx, duk_idx_t idx, duk_int_t magic);\nDUK_EXTERNAL_DECL duk_int_t duk_get_current_magic(duk_context *ctx);\n\n/*\n *  Module helpers: put multiple function or constant properties\n */\n\nDUK_EXTERNAL_DECL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_idx, const duk_function_list_entry *funcs);\nDUK_EXTERNAL_DECL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_idx, const duk_number_list_entry *numbers);\n\n/*\n *  Object operations\n */\n\nDUK_EXTERNAL_DECL void duk_compact(duk_context *ctx, duk_idx_t obj_idx);\nDUK_EXTERNAL_DECL void duk_enum(duk_context *ctx, duk_idx_t obj_idx, duk_uint_t enum_flags);\nDUK_EXTERNAL_DECL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_idx, duk_bool_t get_value);\nDUK_EXTERNAL_DECL void duk_seal(duk_context *ctx, duk_idx_t obj_idx);\nDUK_EXTERNAL_DECL void duk_freeze(duk_context *ctx, duk_idx_t obj_idx);\n\n/*\n *  String manipulation\n */\n\nDUK_EXTERNAL_DECL void duk_concat(duk_context *ctx, duk_idx_t count);\nDUK_EXTERNAL_DECL void duk_join(duk_context *ctx, duk_idx_t count);\nDUK_EXTERNAL_DECL void duk_decode_string(duk_context *ctx, duk_idx_t idx, duk_decode_char_function callback, void *udata);\nDUK_EXTERNAL_DECL void duk_map_string(duk_context *ctx, duk_idx_t idx, duk_map_char_function callback, void *udata);\nDUK_EXTERNAL_DECL void duk_substring(duk_context *ctx, duk_idx_t idx, duk_size_t start_char_offset, duk_size_t end_char_offset);\nDUK_EXTERNAL_DECL void duk_trim(duk_context *ctx, duk_idx_t idx);\nDUK_EXTERNAL_DECL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t idx, duk_size_t char_offset);\n\n/*\n *  Ecmascript operators\n */\n\nDUK_EXTERNAL_DECL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);\nDUK_EXTERNAL_DECL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);\nDUK_EXTERNAL_DECL duk_bool_t duk_samevalue(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);\nDUK_EXTERNAL_DECL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t idx1, duk_idx_t idx2);\n\n/*\n *  Function (method) calls\n */\n\nDUK_EXTERNAL_DECL void duk_call(duk_context *ctx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL void duk_call_method(duk_context *ctx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL void duk_call_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_idx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL void duk_new(duk_context *ctx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL duk_int_t duk_pnew(duk_context *ctx, duk_idx_t nargs);\nDUK_EXTERNAL_DECL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, void *udata, duk_idx_t nargs, duk_idx_t nrets);\n\n/*\n *  Thread management\n */\n\n/* There are currently no native functions to yield/resume, due to the internal\n * limitations on coroutine handling.  These will be added later.\n */\n\n/*\n *  Compilation and evaluation\n */\n\nDUK_EXTERNAL_DECL duk_int_t duk_eval_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags);\nDUK_EXTERNAL_DECL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags);\n\n/* plain */\n#define duk_eval(ctx)  \\\n\t((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOFILENAME))\n\n#define duk_eval_noresult(ctx)  \\\n\t((void) duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))\n\n#define duk_peval(ctx)  \\\n\t(duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME))\n\n#define duk_peval_noresult(ctx)  \\\n\t(duk_eval_raw((ctx), NULL, 0, 1 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))\n\n#define duk_compile(ctx,flags)  \\\n\t((void) duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags)))\n\n#define duk_pcompile(ctx,flags)  \\\n\t(duk_compile_raw((ctx), NULL, 0, 2 /*args*/ | (flags) | DUK_COMPILE_SAFE))\n\n/* string */\n#define duk_eval_string(ctx,src)  \\\n\t((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))\n\n#define duk_eval_string_noresult(ctx,src)  \\\n\t((void) duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))\n\n#define duk_peval_string(ctx,src)  \\\n\t(duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))\n\n#define duk_peval_string_noresult(ctx,src)  \\\n\t(duk_eval_raw((ctx), (src), 0, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))\n\n#define duk_compile_string(ctx,flags,src)  \\\n\t((void) duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))\n\n#define duk_compile_string_filename(ctx,flags,src)  \\\n\t((void) duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))\n\n#define duk_pcompile_string(ctx,flags,src)  \\\n\t(duk_compile_raw((ctx), (src), 0, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN | DUK_COMPILE_NOFILENAME))\n\n#define duk_pcompile_string_filename(ctx,flags,src)  \\\n\t(duk_compile_raw((ctx), (src), 0, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_STRLEN))\n\n/* lstring */\n#define duk_eval_lstring(ctx,buf,len)  \\\n\t((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME))\n\n#define duk_eval_lstring_noresult(ctx,buf,len)  \\\n\t((void) duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))\n\n#define duk_peval_lstring(ctx,buf,len)  \\\n\t(duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_NOSOURCE | DUK_COMPILE_SAFE | DUK_COMPILE_NOFILENAME))\n\n#define duk_peval_lstring_noresult(ctx,buf,len)  \\\n\t(duk_eval_raw((ctx), buf, len, 0 /*args*/ | DUK_COMPILE_EVAL | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NORESULT | DUK_COMPILE_NOFILENAME))\n\n#define duk_compile_lstring(ctx,flags,buf,len)  \\\n\t((void) duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME))\n\n#define duk_compile_lstring_filename(ctx,flags,buf,len)  \\\n\t((void) duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_NOSOURCE))\n\n#define duk_pcompile_lstring(ctx,flags,buf,len)  \\\n\t(duk_compile_raw((ctx), buf, len, 0 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE | DUK_COMPILE_NOFILENAME))\n\n#define duk_pcompile_lstring_filename(ctx,flags,buf,len)  \\\n\t(duk_compile_raw((ctx), buf, len, 1 /*args*/ | (flags) | DUK_COMPILE_SAFE | DUK_COMPILE_NOSOURCE))\n\n/*\n *  Bytecode load/dump\n */\n\nDUK_EXTERNAL_DECL void duk_dump_function(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_load_function(duk_context *ctx);\n\n/*\n *  Debugging\n */\n\nDUK_EXTERNAL_DECL void duk_push_context_dump(duk_context *ctx);\n\n/*\n *  Debugger (debug protocol)\n */\n\nDUK_EXTERNAL_DECL void duk_debugger_attach(duk_context *ctx,\n                                           duk_debug_read_function read_cb,\n                                           duk_debug_write_function write_cb,\n                                           duk_debug_peek_function peek_cb,\n                                           duk_debug_read_flush_function read_flush_cb,\n                                           duk_debug_write_flush_function write_flush_cb,\n                                           duk_debug_request_function request_cb,\n                                           duk_debug_detached_function detached_cb,\n                                           void *udata);\nDUK_EXTERNAL_DECL void duk_debugger_detach(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_debugger_cooperate(duk_context *ctx);\nDUK_EXTERNAL_DECL duk_bool_t duk_debugger_notify(duk_context *ctx, duk_idx_t nvalues);\nDUK_EXTERNAL_DECL void duk_debugger_pause(duk_context *ctx);\n\n/*\n *  Time handling\n */\n\nDUK_EXTERNAL_DECL duk_double_t duk_get_now(duk_context *ctx);\nDUK_EXTERNAL_DECL void duk_time_to_components(duk_context *ctx, duk_double_t timeval, duk_time_components *comp);\nDUK_EXTERNAL_DECL duk_double_t duk_components_to_time(duk_context *ctx, duk_time_components *comp);\n\n/*\n *  Date provider related constants\n *\n *  NOTE: These are \"semi public\" - you should only use these if you write\n *  your own platform specific Date provider, see doc/datetime.rst.\n */\n\n/* Millisecond count constants. */\n#define DUK_DATE_MSEC_SECOND          1000L\n#define DUK_DATE_MSEC_MINUTE          (60L * 1000L)\n#define DUK_DATE_MSEC_HOUR            (60L * 60L * 1000L)\n#define DUK_DATE_MSEC_DAY             (24L * 60L * 60L * 1000L)\n\n/* Ecmascript date range is 100 million days from Epoch:\n * > 100e6 * 24 * 60 * 60 * 1000  // 100M days in millisecs\n * 8640000000000000\n * (= 8.64e15)\n */\n#define DUK_DATE_MSEC_100M_DAYS         (8.64e15)\n#define DUK_DATE_MSEC_100M_DAYS_LEEWAY  (8.64e15 + 24 * 3600e3)\n\n/* Ecmascript year range:\n * > new Date(100e6 * 24 * 3600e3).toISOString()\n * '+275760-09-13T00:00:00.000Z'\n * > new Date(-100e6 * 24 * 3600e3).toISOString()\n * '-271821-04-20T00:00:00.000Z'\n */\n#define DUK_DATE_MIN_ECMA_YEAR     (-271821L)\n#define DUK_DATE_MAX_ECMA_YEAR     275760L\n\n/* Part indices for internal breakdowns.  Part order from DUK_DATE_IDX_YEAR\n * to DUK_DATE_IDX_MILLISECOND matches argument ordering of Ecmascript API\n * calls (like Date constructor call).  Some functions in duk_bi_date.c\n * depend on the specific ordering, so change with care.  16 bits are not\n * enough for all parts (year, specifically).\n *\n * Must be in-sync with genbuiltins.py.\n */\n#define DUK_DATE_IDX_YEAR           0  /* year */\n#define DUK_DATE_IDX_MONTH          1  /* month: 0 to 11 */\n#define DUK_DATE_IDX_DAY            2  /* day within month: 0 to 30 */\n#define DUK_DATE_IDX_HOUR           3\n#define DUK_DATE_IDX_MINUTE         4\n#define DUK_DATE_IDX_SECOND         5\n#define DUK_DATE_IDX_MILLISECOND    6\n#define DUK_DATE_IDX_WEEKDAY        7  /* weekday: 0 to 6, 0=sunday, 1=monday, etc */\n#define DUK_DATE_IDX_NUM_PARTS      8\n\n/* Internal API call flags, used for various functions in duk_bi_date.c.\n * Certain flags are used by only certain functions, but since the flags\n * don't overlap, a single flags value can be passed around to multiple\n * functions.\n *\n * The unused top bits of the flags field are also used to pass values\n * to helpers (duk__get_part_helper() and duk__set_part_helper()).\n *\n * Must be in-sync with genbuiltins.py.\n */\n\n/* NOTE: when writing a Date provider you only need a few specific\n * flags from here, the rest are internal.  Avoid using anything you\n * don't need.\n */\n\n#define DUK_DATE_FLAG_NAN_TO_ZERO          (1 << 0)  /* timeval breakdown: internal time value NaN -> zero */\n#define DUK_DATE_FLAG_NAN_TO_RANGE_ERROR   (1 << 1)  /* timeval breakdown: internal time value NaN -> RangeError (toISOString) */\n#define DUK_DATE_FLAG_ONEBASED             (1 << 2)  /* timeval breakdown: convert month and day-of-month parts to one-based (default is zero-based) */\n#define DUK_DATE_FLAG_EQUIVYEAR            (1 << 3)  /* timeval breakdown: replace year with equivalent year in the [1971,2037] range for DST calculations */\n#define DUK_DATE_FLAG_LOCALTIME            (1 << 4)  /* convert time value to local time */\n#define DUK_DATE_FLAG_SUB1900              (1 << 5)  /* getter: subtract 1900 from year when getting year part */\n#define DUK_DATE_FLAG_TOSTRING_DATE        (1 << 6)  /* include date part in string conversion result */\n#define DUK_DATE_FLAG_TOSTRING_TIME        (1 << 7)  /* include time part in string conversion result */\n#define DUK_DATE_FLAG_TOSTRING_LOCALE      (1 << 8)  /* use locale specific formatting if available */\n#define DUK_DATE_FLAG_TIMESETTER           (1 << 9)  /* setter: call is a time setter (affects hour, min, sec, ms); otherwise date setter (affects year, month, day-in-month) */\n#define DUK_DATE_FLAG_YEAR_FIXUP           (1 << 10) /* setter: perform 2-digit year fixup (00...99 -> 1900...1999) */\n#define DUK_DATE_FLAG_SEP_T                (1 << 11) /* string conversion: use 'T' instead of ' ' as a separator */\n#define DUK_DATE_FLAG_VALUE_SHIFT          12        /* additional values begin at bit 12 */\n\n/*\n *  ROM pointer compression\n */\n\n/* Support array for ROM pointer compression.  Only declared when ROM\n * pointer compression is active.\n */\n#if defined(DUK_USE_ROM_OBJECTS) && defined(DUK_USE_HEAPPTR16)\nDUK_EXTERNAL_DECL const void * const duk_rom_compressed_pointers[];\n#endif\n\n/*\n *  C++ name mangling\n */\n\n#if defined(__cplusplus)\n/* end 'extern \"C\"' wrapper */\n}\n#endif\n\n/*\n *  END PUBLIC API\n */\n\n#endif  /* DUKTAPE_H_INCLUDED */\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/timers.go",
    "content": "package duktape\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// DefineTimers defines `setTimeout`, `clearTimeout`, `setInterval`,\n// `clearInterval` into global context.\nfunc (d *Context) PushTimers() error {\n\td.PushGlobalStash()\n\t// check if timers already exists\n\tif !d.HasPropString(-1, \"timers\") {\n\t\td.PushObject()\n\t\td.PutPropString(-2, \"timers\") // stash -> [ timers:{} ]\n\t\td.Pop()\n\n\t\td.PushGlobalGoFunction(\"setTimeout\", setTimeout)\n\t\td.PushGlobalGoFunction(\"setInterval\", setInterval)\n\t\td.PushGlobalGoFunction(\"clearTimeout\", clearTimeout)\n\t\td.PushGlobalGoFunction(\"clearInterval\", clearTimeout)\n\t\treturn nil\n\t} else {\n\t\td.Pop()\n\t\treturn errors.New(\"Timers are already defined\")\n\t}\n}\n\nfunc (d *Context) FlushTimers() {\n\td.PushGlobalStash()\n\td.PushObject()\n\td.PutPropString(-2, \"timers\") // stash -> [ timers:{} ]\n\td.Pop()\n}\n\nfunc setTimeout(c *Context) int {\n\tid := c.pushTimer(0)\n\ttimeout := c.ToNumber(1)\n\tif timeout < 1 {\n\t\ttimeout = 1\n\t}\n\tgo func(id float64) {\n\t\t<-time.After(time.Duration(timeout) * time.Millisecond)\n\t\tc.Lock()\n\t\tdefer c.Unlock()\n\t\tif c.duk_context == nil {\n\t\t\tfmt.Println(\"[duktape] Warning!\\nsetTimeout invokes callback after the context was destroyed.\")\n\t\t\treturn\n\t\t}\n\n\t\t// check if timer still exists\n\t\tc.putTimer(id)\n\t\tif c.GetType(-1).IsObject() {\n\t\t\tc.Pcall(0 /* nargs */)\n\t\t}\n\t\tc.dropTimer(id)\n\t}(id)\n\tc.PushNumber(id)\n\treturn 1\n}\n\nfunc clearTimeout(c *Context) int {\n\tif c.GetType(0).IsNumber() {\n\t\tc.dropTimer(c.GetNumber(0))\n\t\tc.Pop()\n\t}\n\treturn 0\n}\n\nfunc setInterval(c *Context) int {\n\tid := c.pushTimer(0)\n\ttimeout := c.ToNumber(1)\n\tif timeout < 1 {\n\t\ttimeout = 1\n\t}\n\tgo func(id float64) {\n\t\tticker := time.NewTicker(time.Duration(timeout) * time.Millisecond)\n\t\tfor _ = range ticker.C {\n\t\t\tc.Lock()\n\t\t\t// check if duktape context exists\n\t\t\tif c.duk_context == nil {\n\t\t\t\tc.dropTimer(id)\n\t\t\t\tc.Pop()\n\t\t\t\tticker.Stop()\n\t\t\t\tfmt.Println(\"[duktape] Warning!\\nsetInterval invokes callback after the context was destroyed.\")\n\t\t\t\tc.Unlock()\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// check if timer still exists\n\t\t\tc.putTimer(id)\n\t\t\tif c.GetType(-1).IsObject() {\n\t\t\t\tc.Pcall(0 /* nargs */)\n\t\t\t\tc.Pop()\n\t\t\t} else {\n\t\t\t\tc.dropTimer(id)\n\t\t\t\tc.Pop()\n\t\t\t\tticker.Stop()\n\t\t\t}\n\t\t\tc.Unlock()\n\t\t}\n\t}(id)\n\tc.PushNumber(id)\n\treturn 1\n}\n\nfunc (d *Context) pushTimer(index int) float64 {\n\tid := d.timerIndex.get()\n\n\td.PushGlobalStash()\n\td.GetPropString(-1, \"timers\")\n\td.PushNumber(id)\n\td.Dup(index)\n\td.PutProp(-3)\n\td.Pop2()\n\n\treturn id\n}\n\nfunc (d *Context) dropTimer(id float64) {\n\td.PushGlobalStash()\n\td.GetPropString(-1, \"timers\")\n\td.PushNumber(id)\n\td.DelProp(-2)\n\td.Pop2()\n}\n\nfunc (d *Context) putTimer(id float64) {\n\td.PushGlobalStash()           // stash -> [ ..., timers: { <id>: { func: true } } ]\n\td.GetPropString(-1, \"timers\") // stash -> [ ..., timers: { <id>: { func: true } } }, { <id>: { func: true } ]\n\td.PushNumber(id)\n\td.GetProp(-2) // stash -> [ ..., timers: { <id>: { func: true } } }, { <id>: { func: true }, { func: true } ]\n\td.Replace(-3)\n\td.Pop()\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/utils.go",
    "content": "package duktape\n\n// Must returns existing *Context or throw panic.\n// It is highly recommended to use Must all the time.\nfunc (d *Context) Must() *Context {\n\tif d.duk_context == nil {\n\t\tpanic(\"[duktape] Context does not exists!\\nYou cannot call any contexts methods after `DestroyHeap()` was called.\")\n\t}\n\treturn d\n}\n"
  },
  {
    "path": "vendor/gopkg.in/olebedev/go-duktape.v3/wercker.yml",
    "content": "box: golang\nbuild:\n  steps:\n    - setup-go-workspace\n    - script:\n        name: go get\n        code: |\n          cd $WERCKER_SOURCE_DIR\n          go version\n          go get gopkg.in/check.v1\n    - script:\n        name: go test\n        code: |\n          go test . -v\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/LICENSE",
    "content": "Copyright (c) 2016 The github.com/go-redis/redis Contributors.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/Makefile",
    "content": "all: testdeps\n\tgo test ./...\n\tgo test ./... -short -race\n\ntestdeps: testdata/redis/src/redis-server\n\nbench: testdeps\n\tgo test ./... -test.run=NONE -test.bench=. -test.benchmem\n\n.PHONY: all test testdeps bench\n\ntestdata/redis:\n\tmkdir -p $@\n\twget -qO- https://github.com/antirez/redis/archive/unstable.tar.gz | tar xvz --strip-components=1 -C $@\n\ntestdata/redis/src/redis-server: testdata/redis\n\tcd $< && make all\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/README.md",
    "content": "# Redis client for Golang [![Build Status](https://travis-ci.org/go-redis/redis.png?branch=master)](https://travis-ci.org/go-redis/redis)\n\nSupports:\n\n- Redis 3 commands except QUIT, MONITOR, SLOWLOG and SYNC.\n- [Pub/Sub](http://godoc.org/gopkg.in/redis.v3#PubSub).\n- [Transactions](http://godoc.org/gopkg.in/redis.v3#Multi).\n- [Pipelining](http://godoc.org/gopkg.in/redis.v3#Client.Pipeline).\n- [Scripting](http://godoc.org/gopkg.in/redis.v3#Script).\n- [Timeouts](http://godoc.org/gopkg.in/redis.v3#Options).\n- [Redis Sentinel](http://godoc.org/gopkg.in/redis.v3#NewFailoverClient).\n- [Redis Cluster](http://godoc.org/gopkg.in/redis.v3#NewClusterClient).\n- [Ring](http://godoc.org/gopkg.in/redis.v3#NewRing).\n- [Cache friendly](https://github.com/go-redis/cache).\n- [Rate limiting](https://github.com/go-redis/rate).\n- [Distributed Locks](https://github.com/bsm/redis-lock).\n\nAPI docs: http://godoc.org/gopkg.in/redis.v3.\nExamples: http://godoc.org/gopkg.in/redis.v3#pkg-examples.\n\n## Installation\n\nInstall:\n\n    go get gopkg.in/redis.v3\n\n## Quickstart\n\n```go\nfunc ExampleNewClient() {\n\tclient := redis.NewClient(&redis.Options{\n\t\tAddr:     \"localhost:6379\",\n\t\tPassword: \"\", // no password set\n\t\tDB:       0,  // use default DB\n\t})\n\n\tpong, err := client.Ping().Result()\n\tfmt.Println(pong, err)\n\t// Output: PONG <nil>\n}\n\nfunc ExampleClient() {\n\terr := client.Set(\"key\", \"value\", 0).Err()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tval, err := client.Get(\"key\").Result()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"key\", val)\n\n\tval2, err := client.Get(\"key2\").Result()\n\tif err == redis.Nil {\n\t\tfmt.Println(\"key2 does not exists\")\n\t} else if err != nil {\n\t\tpanic(err)\n\t} else {\n\t\tfmt.Println(\"key2\", val2)\n\t}\n\t// Output: key value\n\t// key2 does not exists\n}\n```\n\n## Howto\n\nPlease go through [examples](http://godoc.org/gopkg.in/redis.v3#pkg-examples) to get an idea how to use this package.\n\n## Look and feel\n\nSome corner cases:\n\n    SET key value EX 10 NX\n    set, err := client.SetNX(\"key\", \"value\", 10*time.Second).Result()\n\n    SORT list LIMIT 0 2 ASC\n    vals, err := client.Sort(\"list\", redis.Sort{Offset: 0, Count: 2, Order: \"ASC\"}).Result()\n\n    ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2\n    vals, err := client.ZRangeByScoreWithScores(\"zset\", redis.ZRangeByScore{\n        Min: \"-inf\",\n        Max: \"+inf\",\n        Offset: 0,\n        Count: 2,\n    }).Result()\n\n    ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3 AGGREGATE SUM\n    vals, err := client.ZInterStore(\"out\", redis.ZStore{Weights: []int64{2, 3}}, \"zset1\", \"zset2\").Result()\n\n    EVAL \"return {KEYS[1],ARGV[1]}\" 1 \"key\" \"hello\"\n    vals, err := client.Eval(\"return {KEYS[1],ARGV[1]}\", []string{\"key\"}, []string{\"hello\"}).Result()\n\n## Benchmark\n\ngo-redis vs redigo:\n\n```\nBenchmarkSetGoRedis10Conns64Bytes-4 \t  200000\t      7621 ns/op\t     210 B/op\t       6 allocs/op\nBenchmarkSetGoRedis100Conns64Bytes-4\t  200000\t      7554 ns/op\t     210 B/op\t       6 allocs/op\nBenchmarkSetGoRedis10Conns1KB-4     \t  200000\t      7697 ns/op\t     210 B/op\t       6 allocs/op\nBenchmarkSetGoRedis100Conns1KB-4    \t  200000\t      7688 ns/op\t     210 B/op\t       6 allocs/op\nBenchmarkSetGoRedis10Conns10KB-4    \t  200000\t      9214 ns/op\t     210 B/op\t       6 allocs/op\nBenchmarkSetGoRedis100Conns10KB-4   \t  200000\t      9181 ns/op\t     210 B/op\t       6 allocs/op\nBenchmarkSetGoRedis10Conns1MB-4     \t    2000\t    583242 ns/op\t    2337 B/op\t       6 allocs/op\nBenchmarkSetGoRedis100Conns1MB-4    \t    2000\t    583089 ns/op\t    2338 B/op\t       6 allocs/op\nBenchmarkSetRedigo10Conns64Bytes-4  \t  200000\t      7576 ns/op\t     208 B/op\t       7 allocs/op\nBenchmarkSetRedigo100Conns64Bytes-4 \t  200000\t      7782 ns/op\t     208 B/op\t       7 allocs/op\nBenchmarkSetRedigo10Conns1KB-4      \t  200000\t      7958 ns/op\t     208 B/op\t       7 allocs/op\nBenchmarkSetRedigo100Conns1KB-4     \t  200000\t      7725 ns/op\t     208 B/op\t       7 allocs/op\nBenchmarkSetRedigo10Conns10KB-4     \t  100000\t     18442 ns/op\t     208 B/op\t       7 allocs/op\nBenchmarkSetRedigo100Conns10KB-4    \t  100000\t     18818 ns/op\t     208 B/op\t       7 allocs/op\nBenchmarkSetRedigo10Conns1MB-4      \t    2000\t    668829 ns/op\t     226 B/op\t       7 allocs/op\nBenchmarkSetRedigo100Conns1MB-4     \t    2000\t    679542 ns/op\t     226 B/op\t       7 allocs/op\n```\n\nRedis Cluster:\n\n```\nBenchmarkRedisPing-4                \t  200000\t      6983 ns/op\t     116 B/op\t       4 allocs/op\nBenchmarkRedisClusterPing-4         \t  100000\t     11535 ns/op\t     117 B/op\t       4 allocs/op\n```\n\n## Shameless plug\n\nCheck my [PostgreSQL client for Go](https://github.com/go-pg/pg).\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/cluster.go",
    "content": "package redis\n\nimport (\n\t\"math/rand\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gopkg.in/redis.v3/internal\"\n\t\"gopkg.in/redis.v3/internal/hashtag\"\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\n// ClusterClient is a Redis Cluster client representing a pool of zero\n// or more underlying connections. It's safe for concurrent use by\n// multiple goroutines.\ntype ClusterClient struct {\n\tcommandable\n\n\topt *ClusterOptions\n\n\tslotsMx sync.RWMutex // protects slots and addrs\n\taddrs   []string\n\tslots   [][]string\n\n\tclientsMx sync.RWMutex // protects clients and closed\n\tclients   map[string]*Client\n\n\t_closed int32 // atomic\n\n\t// Reports where slots reloading is in progress.\n\treloading uint32\n}\n\n// NewClusterClient returns a Redis Cluster client as described in\n// http://redis.io/topics/cluster-spec.\nfunc NewClusterClient(opt *ClusterOptions) *ClusterClient {\n\tclient := &ClusterClient{\n\t\topt:     opt,\n\t\taddrs:   opt.Addrs,\n\t\tslots:   make([][]string, hashtag.SlotNumber),\n\t\tclients: make(map[string]*Client),\n\t}\n\tclient.commandable.process = client.process\n\tclient.reloadSlots()\n\treturn client\n}\n\n// getClients returns a snapshot of clients for cluster nodes\n// this ClusterClient has been working with recently.\n// Note that snapshot can contain closed clients.\nfunc (c *ClusterClient) getClients() map[string]*Client {\n\tc.clientsMx.RLock()\n\tclients := make(map[string]*Client, len(c.clients))\n\tfor addr, client := range c.clients {\n\t\tclients[addr] = client\n\t}\n\tc.clientsMx.RUnlock()\n\treturn clients\n}\n\n// Watch creates new transaction and marks the keys to be watched\n// for conditional execution of a transaction.\nfunc (c *ClusterClient) Watch(keys ...string) (*Multi, error) {\n\taddr := c.slotMasterAddr(hashtag.Slot(keys[0]))\n\tclient, err := c.getClient(addr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn client.Watch(keys...)\n}\n\n// PoolStats returns accumulated connection pool stats.\nfunc (c *ClusterClient) PoolStats() *PoolStats {\n\tacc := PoolStats{}\n\tfor _, client := range c.getClients() {\n\t\ts := client.connPool.Stats()\n\t\tacc.Requests += s.Requests\n\t\tacc.Hits += s.Hits\n\t\tacc.Waits += s.Waits\n\t\tacc.Timeouts += s.Timeouts\n\t\tacc.TotalConns += s.TotalConns\n\t\tacc.FreeConns += s.FreeConns\n\t}\n\treturn &acc\n}\n\nfunc (c *ClusterClient) closed() bool {\n\treturn atomic.LoadInt32(&c._closed) == 1\n}\n\n// Close closes the cluster client, releasing any open resources.\n//\n// It is rare to Close a ClusterClient, as the ClusterClient is meant\n// to be long-lived and shared between many goroutines.\nfunc (c *ClusterClient) Close() error {\n\tif !atomic.CompareAndSwapInt32(&c._closed, 0, 1) {\n\t\treturn pool.ErrClosed\n\t}\n\n\tc.clientsMx.Lock()\n\tc.resetClients()\n\tc.clientsMx.Unlock()\n\tc.setSlots(nil)\n\treturn nil\n}\n\n// getClient returns a Client for a given address.\nfunc (c *ClusterClient) getClient(addr string) (*Client, error) {\n\tif c.closed() {\n\t\treturn nil, pool.ErrClosed\n\t}\n\n\tif addr == \"\" {\n\t\treturn c.randomClient()\n\t}\n\n\tc.clientsMx.RLock()\n\tclient, ok := c.clients[addr]\n\tc.clientsMx.RUnlock()\n\tif ok {\n\t\treturn client, nil\n\t}\n\n\tc.clientsMx.Lock()\n\tclient, ok = c.clients[addr]\n\tif !ok {\n\t\topt := c.opt.clientOptions()\n\t\topt.Addr = addr\n\t\tclient = NewClient(opt)\n\t\tc.clients[addr] = client\n\t}\n\tc.clientsMx.Unlock()\n\n\treturn client, nil\n}\n\nfunc (c *ClusterClient) slotAddrs(slot int) []string {\n\tc.slotsMx.RLock()\n\taddrs := c.slots[slot]\n\tc.slotsMx.RUnlock()\n\treturn addrs\n}\n\nfunc (c *ClusterClient) slotMasterAddr(slot int) string {\n\taddrs := c.slotAddrs(slot)\n\tif len(addrs) > 0 {\n\t\treturn addrs[0]\n\t}\n\treturn \"\"\n}\n\n// randomClient returns a Client for the first live node.\nfunc (c *ClusterClient) randomClient() (client *Client, err error) {\n\tfor i := 0; i < 10; i++ {\n\t\tn := rand.Intn(len(c.addrs))\n\t\tclient, err = c.getClient(c.addrs[n])\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\t\terr = client.ClusterInfo().Err()\n\t\tif err == nil {\n\t\t\treturn client, nil\n\t\t}\n\t}\n\treturn nil, err\n}\n\nfunc (c *ClusterClient) process(cmd Cmder) {\n\tvar ask bool\n\n\tslot := hashtag.Slot(cmd.clusterKey())\n\n\taddr := c.slotMasterAddr(slot)\n\tclient, err := c.getClient(addr)\n\tif err != nil {\n\t\tcmd.setErr(err)\n\t\treturn\n\t}\n\n\tfor attempt := 0; attempt <= c.opt.getMaxRedirects(); attempt++ {\n\t\tif attempt > 0 {\n\t\t\tcmd.reset()\n\t\t}\n\n\t\tif ask {\n\t\t\tpipe := client.Pipeline()\n\t\t\tpipe.Process(NewCmd(\"ASKING\"))\n\t\t\tpipe.Process(cmd)\n\t\t\t_, _ = pipe.Exec()\n\t\t\tpipe.Close()\n\t\t\task = false\n\t\t} else {\n\t\t\tclient.Process(cmd)\n\t\t}\n\n\t\t// If there is no (real) error, we are done!\n\t\terr := cmd.Err()\n\t\tif err == nil {\n\t\t\treturn\n\t\t}\n\n\t\t// On network errors try random node.\n\t\tif shouldRetry(err) {\n\t\t\tclient, err = c.randomClient()\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tvar moved bool\n\t\tvar addr string\n\t\tmoved, ask, addr = isMovedError(err)\n\t\tif moved || ask {\n\t\t\tif moved && c.slotMasterAddr(slot) != addr {\n\t\t\t\tc.lazyReloadSlots()\n\t\t\t}\n\t\t\tclient, err = c.getClient(addr)\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tbreak\n\t}\n}\n\n// Closes all clients and returns last error if there are any.\nfunc (c *ClusterClient) resetClients() (retErr error) {\n\tfor addr, client := range c.clients {\n\t\tif err := client.Close(); err != nil && retErr == nil {\n\t\t\tretErr = err\n\t\t}\n\t\tdelete(c.clients, addr)\n\t}\n\treturn retErr\n}\n\nfunc (c *ClusterClient) setSlots(slots []ClusterSlotInfo) {\n\tc.slotsMx.Lock()\n\n\tseen := make(map[string]struct{})\n\tfor _, addr := range c.addrs {\n\t\tseen[addr] = struct{}{}\n\t}\n\n\tfor i := 0; i < hashtag.SlotNumber; i++ {\n\t\tc.slots[i] = c.slots[i][:0]\n\t}\n\tfor _, info := range slots {\n\t\tfor slot := info.Start; slot <= info.End; slot++ {\n\t\t\tc.slots[slot] = info.Addrs\n\t\t}\n\n\t\tfor _, addr := range info.Addrs {\n\t\t\tif _, ok := seen[addr]; !ok {\n\t\t\t\tc.addrs = append(c.addrs, addr)\n\t\t\t\tseen[addr] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n\n\tc.slotsMx.Unlock()\n}\n\nfunc (c *ClusterClient) reloadSlots() {\n\tdefer atomic.StoreUint32(&c.reloading, 0)\n\n\tclient, err := c.randomClient()\n\tif err != nil {\n\t\tinternal.Logf(\"randomClient failed: %s\", err)\n\t\treturn\n\t}\n\n\tslots, err := client.ClusterSlots().Result()\n\tif err != nil {\n\t\tinternal.Logf(\"ClusterSlots failed: %s\", err)\n\t\treturn\n\t}\n\tc.setSlots(slots)\n}\n\nfunc (c *ClusterClient) lazyReloadSlots() {\n\tif !atomic.CompareAndSwapUint32(&c.reloading, 0, 1) {\n\t\treturn\n\t}\n\tgo c.reloadSlots()\n}\n\n// reaper closes idle connections to the cluster.\nfunc (c *ClusterClient) reaper(frequency time.Duration) {\n\tticker := time.NewTicker(frequency)\n\tdefer ticker.Stop()\n\n\tfor _ = range ticker.C {\n\t\tif c.closed() {\n\t\t\tbreak\n\t\t}\n\n\t\tvar n int\n\t\tfor _, client := range c.getClients() {\n\t\t\tnn, err := client.connPool.(*pool.ConnPool).ReapStaleConns()\n\t\t\tif err != nil {\n\t\t\t\tinternal.Logf(\"ReapStaleConns failed: %s\", err)\n\t\t\t} else {\n\t\t\t\tn += nn\n\t\t\t}\n\t\t}\n\n\t\ts := c.PoolStats()\n\t\tinternal.Logf(\n\t\t\t\"reaper: removed %d stale conns (TotalConns=%d FreeConns=%d Requests=%d Hits=%d Timeouts=%d)\",\n\t\t\tn, s.TotalConns, s.FreeConns, s.Requests, s.Hits, s.Timeouts,\n\t\t)\n\t}\n}\n\n//------------------------------------------------------------------------------\n\n// ClusterOptions are used to configure a cluster client and should be\n// passed to NewClusterClient.\ntype ClusterOptions struct {\n\t// A seed list of host:port addresses of cluster nodes.\n\tAddrs []string\n\n\t// The maximum number of retries before giving up. Command is retried\n\t// on network errors and MOVED/ASK redirects.\n\t// Default is 16.\n\tMaxRedirects int\n\n\t// Following options are copied from Options struct.\n\n\tPassword string\n\n\tDialTimeout  time.Duration\n\tReadTimeout  time.Duration\n\tWriteTimeout time.Duration\n\n\t// PoolSize applies per cluster node and not for the whole cluster.\n\tPoolSize           int\n\tPoolTimeout        time.Duration\n\tIdleTimeout        time.Duration\n\tIdleCheckFrequency time.Duration\n}\n\nfunc (opt *ClusterOptions) getMaxRedirects() int {\n\tif opt.MaxRedirects == -1 {\n\t\treturn 0\n\t}\n\tif opt.MaxRedirects == 0 {\n\t\treturn 16\n\t}\n\treturn opt.MaxRedirects\n}\n\nfunc (opt *ClusterOptions) clientOptions() *Options {\n\treturn &Options{\n\t\tPassword: opt.Password,\n\n\t\tDialTimeout:  opt.DialTimeout,\n\t\tReadTimeout:  opt.ReadTimeout,\n\t\tWriteTimeout: opt.WriteTimeout,\n\n\t\tPoolSize:    opt.PoolSize,\n\t\tPoolTimeout: opt.PoolTimeout,\n\t\tIdleTimeout: opt.IdleTimeout,\n\t\t// IdleCheckFrequency is not copied to disable reaper\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/cluster_pipeline.go",
    "content": "package redis\n\nimport (\n\t\"gopkg.in/redis.v3/internal/hashtag\"\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\n// ClusterPipeline is not thread-safe.\ntype ClusterPipeline struct {\n\tcommandable\n\n\tcluster *ClusterClient\n\n\tcmds   []Cmder\n\tclosed bool\n}\n\n// Pipeline creates a new pipeline which is able to execute commands\n// against multiple shards. It's NOT safe for concurrent use by\n// multiple goroutines.\nfunc (c *ClusterClient) Pipeline() *ClusterPipeline {\n\tpipe := &ClusterPipeline{\n\t\tcluster: c,\n\t\tcmds:    make([]Cmder, 0, 10),\n\t}\n\tpipe.commandable.process = pipe.process\n\treturn pipe\n}\n\nfunc (c *ClusterClient) Pipelined(fn func(*ClusterPipeline) error) ([]Cmder, error) {\n\tpipe := c.Pipeline()\n\tif err := fn(pipe); err != nil {\n\t\treturn nil, err\n\t}\n\tcmds, err := pipe.Exec()\n\t_ = pipe.Close()\n\treturn cmds, err\n}\n\nfunc (pipe *ClusterPipeline) process(cmd Cmder) {\n\tpipe.cmds = append(pipe.cmds, cmd)\n}\n\n// Discard resets the pipeline and discards queued commands.\nfunc (pipe *ClusterPipeline) Discard() error {\n\tif pipe.closed {\n\t\treturn pool.ErrClosed\n\t}\n\tpipe.cmds = pipe.cmds[:0]\n\treturn nil\n}\n\nfunc (pipe *ClusterPipeline) Exec() (cmds []Cmder, retErr error) {\n\tif pipe.closed {\n\t\treturn nil, pool.ErrClosed\n\t}\n\tif len(pipe.cmds) == 0 {\n\t\treturn []Cmder{}, nil\n\t}\n\n\tcmds = pipe.cmds\n\tpipe.cmds = make([]Cmder, 0, 10)\n\n\tcmdsMap := make(map[string][]Cmder)\n\tfor _, cmd := range cmds {\n\t\tslot := hashtag.Slot(cmd.clusterKey())\n\t\taddr := pipe.cluster.slotMasterAddr(slot)\n\t\tcmdsMap[addr] = append(cmdsMap[addr], cmd)\n\t}\n\n\tfor attempt := 0; attempt <= pipe.cluster.opt.getMaxRedirects(); attempt++ {\n\t\tfailedCmds := make(map[string][]Cmder)\n\n\t\tfor addr, cmds := range cmdsMap {\n\t\t\tclient, err := pipe.cluster.getClient(addr)\n\t\t\tif err != nil {\n\t\t\t\tsetCmdsErr(cmds, err)\n\t\t\t\tretErr = err\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tcn, err := client.conn()\n\t\t\tif err != nil {\n\t\t\t\tsetCmdsErr(cmds, err)\n\t\t\t\tretErr = err\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tfailedCmds, err = pipe.execClusterCmds(cn, cmds, failedCmds)\n\t\t\tif err != nil {\n\t\t\t\tretErr = err\n\t\t\t}\n\t\t\tclient.putConn(cn, err, false)\n\t\t}\n\n\t\tcmdsMap = failedCmds\n\t}\n\n\treturn cmds, retErr\n}\n\n// Close closes the pipeline, releasing any open resources.\nfunc (pipe *ClusterPipeline) Close() error {\n\tpipe.Discard()\n\tpipe.closed = true\n\treturn nil\n}\n\nfunc (pipe *ClusterPipeline) execClusterCmds(\n\tcn *pool.Conn, cmds []Cmder, failedCmds map[string][]Cmder,\n) (map[string][]Cmder, error) {\n\tif err := writeCmd(cn, cmds...); err != nil {\n\t\tsetCmdsErr(cmds, err)\n\t\treturn failedCmds, err\n\t}\n\n\tvar firstCmdErr error\n\tfor i, cmd := range cmds {\n\t\terr := cmd.readReply(cn)\n\t\tif err == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif isNetworkError(err) {\n\t\t\tcmd.reset()\n\t\t\tfailedCmds[\"\"] = append(failedCmds[\"\"], cmds[i:]...)\n\t\t\tbreak\n\t\t} else if moved, ask, addr := isMovedError(err); moved {\n\t\t\tpipe.cluster.lazyReloadSlots()\n\t\t\tcmd.reset()\n\t\t\tfailedCmds[addr] = append(failedCmds[addr], cmd)\n\t\t} else if ask {\n\t\t\tcmd.reset()\n\t\t\tfailedCmds[addr] = append(failedCmds[addr], NewCmd(\"ASKING\"), cmd)\n\t\t} else if firstCmdErr == nil {\n\t\t\tfirstCmdErr = err\n\t\t}\n\t}\n\n\treturn failedCmds, firstCmdErr\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/command.go",
    "content": "package redis\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\nvar (\n\t_ Cmder = (*Cmd)(nil)\n\t_ Cmder = (*SliceCmd)(nil)\n\t_ Cmder = (*StatusCmd)(nil)\n\t_ Cmder = (*IntCmd)(nil)\n\t_ Cmder = (*DurationCmd)(nil)\n\t_ Cmder = (*BoolCmd)(nil)\n\t_ Cmder = (*StringCmd)(nil)\n\t_ Cmder = (*FloatCmd)(nil)\n\t_ Cmder = (*StringSliceCmd)(nil)\n\t_ Cmder = (*BoolSliceCmd)(nil)\n\t_ Cmder = (*StringStringMapCmd)(nil)\n\t_ Cmder = (*StringIntMapCmd)(nil)\n\t_ Cmder = (*ZSliceCmd)(nil)\n\t_ Cmder = (*ScanCmd)(nil)\n\t_ Cmder = (*ClusterSlotCmd)(nil)\n)\n\ntype Cmder interface {\n\targs() []interface{}\n\treadReply(*pool.Conn) error\n\tsetErr(error)\n\treset()\n\n\treadTimeout() *time.Duration\n\tclusterKey() string\n\n\tErr() error\n\tfmt.Stringer\n}\n\nfunc setCmdsErr(cmds []Cmder, e error) {\n\tfor _, cmd := range cmds {\n\t\tcmd.setErr(e)\n\t}\n}\n\nfunc resetCmds(cmds []Cmder) {\n\tfor _, cmd := range cmds {\n\t\tcmd.reset()\n\t}\n}\n\nfunc writeCmd(cn *pool.Conn, cmds ...Cmder) error {\n\tcn.Buf = cn.Buf[:0]\n\tfor _, cmd := range cmds {\n\t\tvar err error\n\t\tcn.Buf, err = appendArgs(cn.Buf, cmd.args())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t_, err := cn.Write(cn.Buf)\n\treturn err\n}\n\nfunc cmdString(cmd Cmder, val interface{}) string {\n\tvar ss []string\n\tfor _, arg := range cmd.args() {\n\t\tss = append(ss, fmt.Sprint(arg))\n\t}\n\ts := strings.Join(ss, \" \")\n\tif err := cmd.Err(); err != nil {\n\t\treturn s + \": \" + err.Error()\n\t}\n\tif val != nil {\n\t\tswitch vv := val.(type) {\n\t\tcase []byte:\n\t\t\treturn s + \": \" + string(vv)\n\t\tdefault:\n\t\t\treturn s + \": \" + fmt.Sprint(val)\n\t\t}\n\t}\n\treturn s\n\n}\n\n//------------------------------------------------------------------------------\n\ntype baseCmd struct {\n\t_args []interface{}\n\n\terr error\n\n\t_clusterKeyPos int\n\n\t_readTimeout *time.Duration\n}\n\nfunc (cmd *baseCmd) Err() error {\n\tif cmd.err != nil {\n\t\treturn cmd.err\n\t}\n\treturn nil\n}\n\nfunc (cmd *baseCmd) args() []interface{} {\n\treturn cmd._args\n}\n\nfunc (cmd *baseCmd) readTimeout() *time.Duration {\n\treturn cmd._readTimeout\n}\n\nfunc (cmd *baseCmd) setReadTimeout(d time.Duration) {\n\tcmd._readTimeout = &d\n}\n\nfunc (cmd *baseCmd) clusterKey() string {\n\tif cmd._clusterKeyPos > 0 && cmd._clusterKeyPos < len(cmd._args) {\n\t\treturn fmt.Sprint(cmd._args[cmd._clusterKeyPos])\n\t}\n\treturn \"\"\n}\n\nfunc (cmd *baseCmd) setErr(e error) {\n\tcmd.err = e\n}\n\n//------------------------------------------------------------------------------\n\ntype Cmd struct {\n\tbaseCmd\n\n\tval interface{}\n}\n\nfunc NewCmd(args ...interface{}) *Cmd {\n\treturn &Cmd{baseCmd: baseCmd{_args: args}}\n}\n\nfunc (cmd *Cmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *Cmd) Val() interface{} {\n\treturn cmd.val\n}\n\nfunc (cmd *Cmd) Result() (interface{}, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *Cmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *Cmd) readReply(cn *pool.Conn) error {\n\tval, err := readReply(cn, sliceParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn cmd.err\n\t}\n\tif v, ok := val.([]byte); ok {\n\t\t// Convert to string to preserve old behaviour.\n\t\t// TODO: remove in v4\n\t\tcmd.val = string(v)\n\t} else {\n\t\tcmd.val = val\n\t}\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype SliceCmd struct {\n\tbaseCmd\n\n\tval []interface{}\n}\n\nfunc NewSliceCmd(args ...interface{}) *SliceCmd {\n\treturn &SliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *SliceCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *SliceCmd) Val() []interface{} {\n\treturn cmd.val\n}\n\nfunc (cmd *SliceCmd) Result() ([]interface{}, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *SliceCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *SliceCmd) readReply(cn *pool.Conn) error {\n\tv, err := readArrayReply(cn, sliceParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = v.([]interface{})\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype StatusCmd struct {\n\tbaseCmd\n\n\tval string\n}\n\nfunc NewStatusCmd(args ...interface{}) *StatusCmd {\n\treturn &StatusCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc newKeylessStatusCmd(args ...interface{}) *StatusCmd {\n\treturn &StatusCmd{baseCmd: baseCmd{_args: args}}\n}\n\nfunc (cmd *StatusCmd) reset() {\n\tcmd.val = \"\"\n\tcmd.err = nil\n}\n\nfunc (cmd *StatusCmd) Val() string {\n\treturn cmd.val\n}\n\nfunc (cmd *StatusCmd) Result() (string, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *StatusCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *StatusCmd) readReply(cn *pool.Conn) error {\n\tcmd.val, cmd.err = readStringReply(cn)\n\treturn cmd.err\n}\n\n//------------------------------------------------------------------------------\n\ntype IntCmd struct {\n\tbaseCmd\n\n\tval int64\n}\n\nfunc NewIntCmd(args ...interface{}) *IntCmd {\n\treturn &IntCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *IntCmd) reset() {\n\tcmd.val = 0\n\tcmd.err = nil\n}\n\nfunc (cmd *IntCmd) Val() int64 {\n\treturn cmd.val\n}\n\nfunc (cmd *IntCmd) Result() (int64, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *IntCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *IntCmd) readReply(cn *pool.Conn) error {\n\tcmd.val, cmd.err = readIntReply(cn)\n\treturn cmd.err\n}\n\n//------------------------------------------------------------------------------\n\ntype DurationCmd struct {\n\tbaseCmd\n\n\tval       time.Duration\n\tprecision time.Duration\n}\n\nfunc NewDurationCmd(precision time.Duration, args ...interface{}) *DurationCmd {\n\treturn &DurationCmd{\n\t\tprecision: precision,\n\t\tbaseCmd:   baseCmd{_args: args, _clusterKeyPos: 1},\n\t}\n}\n\nfunc (cmd *DurationCmd) reset() {\n\tcmd.val = 0\n\tcmd.err = nil\n}\n\nfunc (cmd *DurationCmd) Val() time.Duration {\n\treturn cmd.val\n}\n\nfunc (cmd *DurationCmd) Result() (time.Duration, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *DurationCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *DurationCmd) readReply(cn *pool.Conn) error {\n\tn, err := readIntReply(cn)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = time.Duration(n) * cmd.precision\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype BoolCmd struct {\n\tbaseCmd\n\n\tval bool\n}\n\nfunc NewBoolCmd(args ...interface{}) *BoolCmd {\n\treturn &BoolCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *BoolCmd) reset() {\n\tcmd.val = false\n\tcmd.err = nil\n}\n\nfunc (cmd *BoolCmd) Val() bool {\n\treturn cmd.val\n}\n\nfunc (cmd *BoolCmd) Result() (bool, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *BoolCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nvar ok = []byte(\"OK\")\n\nfunc (cmd *BoolCmd) readReply(cn *pool.Conn) error {\n\tv, err := readReply(cn, nil)\n\t// `SET key value NX` returns nil when key already exists. But\n\t// `SETNX key value` returns bool (0/1). So convert nil to bool.\n\t// TODO: is this okay?\n\tif err == Nil {\n\t\tcmd.val = false\n\t\treturn nil\n\t}\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tswitch vv := v.(type) {\n\tcase int64:\n\t\tcmd.val = vv == 1\n\t\treturn nil\n\tcase []byte:\n\t\tcmd.val = bytes.Equal(vv, ok)\n\t\treturn nil\n\tdefault:\n\t\treturn fmt.Errorf(\"got %T, wanted int64 or string\", v)\n\t}\n}\n\n//------------------------------------------------------------------------------\n\ntype StringCmd struct {\n\tbaseCmd\n\n\tval []byte\n}\n\nfunc NewStringCmd(args ...interface{}) *StringCmd {\n\treturn &StringCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *StringCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *StringCmd) Val() string {\n\treturn bytesToString(cmd.val)\n}\n\nfunc (cmd *StringCmd) Result() (string, error) {\n\treturn cmd.Val(), cmd.err\n}\n\nfunc (cmd *StringCmd) Bytes() ([]byte, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *StringCmd) Int64() (int64, error) {\n\tif cmd.err != nil {\n\t\treturn 0, cmd.err\n\t}\n\treturn strconv.ParseInt(cmd.Val(), 10, 64)\n}\n\nfunc (cmd *StringCmd) Uint64() (uint64, error) {\n\tif cmd.err != nil {\n\t\treturn 0, cmd.err\n\t}\n\treturn strconv.ParseUint(cmd.Val(), 10, 64)\n}\n\nfunc (cmd *StringCmd) Float64() (float64, error) {\n\tif cmd.err != nil {\n\t\treturn 0, cmd.err\n\t}\n\treturn strconv.ParseFloat(cmd.Val(), 64)\n}\n\nfunc (cmd *StringCmd) Scan(val interface{}) error {\n\tif cmd.err != nil {\n\t\treturn cmd.err\n\t}\n\treturn scan(cmd.val, val)\n}\n\nfunc (cmd *StringCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *StringCmd) readReply(cn *pool.Conn) error {\n\tb, err := readBytesReply(cn)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\n\tnew := make([]byte, len(b))\n\tcopy(new, b)\n\tcmd.val = new\n\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype FloatCmd struct {\n\tbaseCmd\n\n\tval float64\n}\n\nfunc NewFloatCmd(args ...interface{}) *FloatCmd {\n\treturn &FloatCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *FloatCmd) reset() {\n\tcmd.val = 0\n\tcmd.err = nil\n}\n\nfunc (cmd *FloatCmd) Val() float64 {\n\treturn cmd.val\n}\n\nfunc (cmd *FloatCmd) Result() (float64, error) {\n\treturn cmd.Val(), cmd.Err()\n}\n\nfunc (cmd *FloatCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *FloatCmd) readReply(cn *pool.Conn) error {\n\tcmd.val, cmd.err = readFloatReply(cn)\n\treturn cmd.err\n}\n\n//------------------------------------------------------------------------------\n\ntype StringSliceCmd struct {\n\tbaseCmd\n\n\tval []string\n}\n\nfunc NewStringSliceCmd(args ...interface{}) *StringSliceCmd {\n\treturn &StringSliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *StringSliceCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *StringSliceCmd) Val() []string {\n\treturn cmd.val\n}\n\nfunc (cmd *StringSliceCmd) Result() ([]string, error) {\n\treturn cmd.Val(), cmd.Err()\n}\n\nfunc (cmd *StringSliceCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *StringSliceCmd) readReply(cn *pool.Conn) error {\n\tv, err := readArrayReply(cn, stringSliceParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = v.([]string)\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype BoolSliceCmd struct {\n\tbaseCmd\n\n\tval []bool\n}\n\nfunc NewBoolSliceCmd(args ...interface{}) *BoolSliceCmd {\n\treturn &BoolSliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *BoolSliceCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *BoolSliceCmd) Val() []bool {\n\treturn cmd.val\n}\n\nfunc (cmd *BoolSliceCmd) Result() ([]bool, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *BoolSliceCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *BoolSliceCmd) readReply(cn *pool.Conn) error {\n\tv, err := readArrayReply(cn, boolSliceParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = v.([]bool)\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype StringStringMapCmd struct {\n\tbaseCmd\n\n\tval map[string]string\n}\n\nfunc NewStringStringMapCmd(args ...interface{}) *StringStringMapCmd {\n\treturn &StringStringMapCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *StringStringMapCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *StringStringMapCmd) Val() map[string]string {\n\treturn cmd.val\n}\n\nfunc (cmd *StringStringMapCmd) Result() (map[string]string, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *StringStringMapCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *StringStringMapCmd) readReply(cn *pool.Conn) error {\n\tv, err := readArrayReply(cn, stringStringMapParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = v.(map[string]string)\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype StringIntMapCmd struct {\n\tbaseCmd\n\n\tval map[string]int64\n}\n\nfunc NewStringIntMapCmd(args ...interface{}) *StringIntMapCmd {\n\treturn &StringIntMapCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *StringIntMapCmd) Val() map[string]int64 {\n\treturn cmd.val\n}\n\nfunc (cmd *StringIntMapCmd) Result() (map[string]int64, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *StringIntMapCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *StringIntMapCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *StringIntMapCmd) readReply(cn *pool.Conn) error {\n\tv, err := readArrayReply(cn, stringIntMapParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = v.(map[string]int64)\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype ZSliceCmd struct {\n\tbaseCmd\n\n\tval []Z\n}\n\nfunc NewZSliceCmd(args ...interface{}) *ZSliceCmd {\n\treturn &ZSliceCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *ZSliceCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *ZSliceCmd) Val() []Z {\n\treturn cmd.val\n}\n\nfunc (cmd *ZSliceCmd) Result() ([]Z, error) {\n\treturn cmd.val, cmd.err\n}\n\nfunc (cmd *ZSliceCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *ZSliceCmd) readReply(cn *pool.Conn) error {\n\tv, err := readArrayReply(cn, zSliceParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = v.([]Z)\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\ntype ScanCmd struct {\n\tbaseCmd\n\n\tcursor int64\n\tkeys   []string\n}\n\nfunc NewScanCmd(args ...interface{}) *ScanCmd {\n\treturn &ScanCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *ScanCmd) reset() {\n\tcmd.cursor = 0\n\tcmd.keys = nil\n\tcmd.err = nil\n}\n\n// TODO: cursor should be string to match redis type\n// TODO: swap return values\n\nfunc (cmd *ScanCmd) Val() (int64, []string) {\n\treturn cmd.cursor, cmd.keys\n}\n\nfunc (cmd *ScanCmd) Result() (int64, []string, error) {\n\treturn cmd.cursor, cmd.keys, cmd.err\n}\n\nfunc (cmd *ScanCmd) String() string {\n\treturn cmdString(cmd, cmd.keys)\n}\n\nfunc (cmd *ScanCmd) readReply(cn *pool.Conn) error {\n\tkeys, cursor, err := readScanReply(cn)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn cmd.err\n\t}\n\tcmd.keys = keys\n\tcmd.cursor = cursor\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\n// TODO: rename to ClusterSlot\ntype ClusterSlotInfo struct {\n\tStart int\n\tEnd   int\n\tAddrs []string\n}\n\n// TODO: rename to ClusterSlotsCmd\ntype ClusterSlotCmd struct {\n\tbaseCmd\n\n\tval []ClusterSlotInfo\n}\n\nfunc NewClusterSlotCmd(args ...interface{}) *ClusterSlotCmd {\n\treturn &ClusterSlotCmd{baseCmd: baseCmd{_args: args, _clusterKeyPos: 1}}\n}\n\nfunc (cmd *ClusterSlotCmd) Val() []ClusterSlotInfo {\n\treturn cmd.val\n}\n\nfunc (cmd *ClusterSlotCmd) Result() ([]ClusterSlotInfo, error) {\n\treturn cmd.Val(), cmd.Err()\n}\n\nfunc (cmd *ClusterSlotCmd) String() string {\n\treturn cmdString(cmd, cmd.val)\n}\n\nfunc (cmd *ClusterSlotCmd) reset() {\n\tcmd.val = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *ClusterSlotCmd) readReply(cn *pool.Conn) error {\n\tv, err := readArrayReply(cn, clusterSlotInfoSliceParser)\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.val = v.([]ClusterSlotInfo)\n\treturn nil\n}\n\n//------------------------------------------------------------------------------\n\n// GeoLocation is used with GeoAdd to add geospatial location.\ntype GeoLocation struct {\n\tName                      string\n\tLongitude, Latitude, Dist float64\n\tGeoHash                   int64\n}\n\n// GeoRadiusQuery is used with GeoRadius to query geospatial index.\ntype GeoRadiusQuery struct {\n\tRadius float64\n\t// Can be m, km, ft, or mi. Default is km.\n\tUnit        string\n\tWithCoord   bool\n\tWithDist    bool\n\tWithGeoHash bool\n\tCount       int\n\t// Can be ASC or DESC. Default is no sort order.\n\tSort string\n}\n\ntype GeoLocationCmd struct {\n\tbaseCmd\n\n\tq         *GeoRadiusQuery\n\tlocations []GeoLocation\n}\n\nfunc NewGeoLocationCmd(q *GeoRadiusQuery, args ...interface{}) *GeoLocationCmd {\n\targs = append(args, q.Radius)\n\tif q.Unit != \"\" {\n\t\targs = append(args, q.Unit)\n\t} else {\n\t\targs = append(args, \"km\")\n\t}\n\tif q.WithCoord {\n\t\targs = append(args, \"WITHCOORD\")\n\t}\n\tif q.WithDist {\n\t\targs = append(args, \"WITHDIST\")\n\t}\n\tif q.WithGeoHash {\n\t\targs = append(args, \"WITHHASH\")\n\t}\n\tif q.Count > 0 {\n\t\targs = append(args, \"COUNT\", q.Count)\n\t}\n\tif q.Sort != \"\" {\n\t\targs = append(args, q.Sort)\n\t}\n\treturn &GeoLocationCmd{\n\t\tbaseCmd: baseCmd{\n\t\t\t_args:          args,\n\t\t\t_clusterKeyPos: 1,\n\t\t},\n\t\tq: q,\n\t}\n}\n\nfunc (cmd *GeoLocationCmd) reset() {\n\tcmd.locations = nil\n\tcmd.err = nil\n}\n\nfunc (cmd *GeoLocationCmd) Val() []GeoLocation {\n\treturn cmd.locations\n}\n\nfunc (cmd *GeoLocationCmd) Result() ([]GeoLocation, error) {\n\treturn cmd.locations, cmd.err\n}\n\nfunc (cmd *GeoLocationCmd) String() string {\n\treturn cmdString(cmd, cmd.locations)\n}\n\nfunc (cmd *GeoLocationCmd) readReply(cn *pool.Conn) error {\n\treply, err := readArrayReply(cn, newGeoLocationSliceParser(cmd.q))\n\tif err != nil {\n\t\tcmd.err = err\n\t\treturn err\n\t}\n\tcmd.locations = reply.([]GeoLocation)\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/commands.go",
    "content": "package redis\n\nimport (\n\t\"io\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gopkg.in/redis.v3/internal\"\n)\n\nfunc formatInt(i int64) string {\n\treturn strconv.FormatInt(i, 10)\n}\n\nfunc formatUint(i uint64) string {\n\treturn strconv.FormatUint(i, 10)\n}\n\nfunc formatFloat(f float64) string {\n\treturn strconv.FormatFloat(f, 'f', -1, 64)\n}\n\nfunc readTimeout(timeout time.Duration) time.Duration {\n\tif timeout == 0 {\n\t\treturn 0\n\t}\n\treturn timeout + time.Second\n}\n\nfunc usePrecise(dur time.Duration) bool {\n\treturn dur < time.Second || dur%time.Second != 0\n}\n\nfunc formatMs(dur time.Duration) string {\n\tif dur > 0 && dur < time.Millisecond {\n\t\tinternal.Logf(\n\t\t\t\"specified duration is %s, but minimal supported value is %s\",\n\t\t\tdur, time.Millisecond,\n\t\t)\n\t}\n\treturn formatInt(int64(dur / time.Millisecond))\n}\n\nfunc formatSec(dur time.Duration) string {\n\tif dur > 0 && dur < time.Second {\n\t\tinternal.Logf(\n\t\t\t\"specified duration is %s, but minimal supported value is %s\",\n\t\t\tdur, time.Second,\n\t\t)\n\t}\n\treturn formatInt(int64(dur / time.Second))\n}\n\ntype commandable struct {\n\tprocess func(cmd Cmder)\n}\n\nfunc (c *commandable) Process(cmd Cmder) {\n\tc.process(cmd)\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) Auth(password string) *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"AUTH\", password)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Echo(message string) *StringCmd {\n\tcmd := NewStringCmd(\"ECHO\", message)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Ping() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"PING\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Quit() *StatusCmd {\n\tpanic(\"not implemented\")\n}\n\nfunc (c *commandable) Select(index int64) *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"SELECT\", index)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) Del(keys ...string) *IntCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"DEL\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Dump(key string) *StringCmd {\n\tcmd := NewStringCmd(\"DUMP\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Exists(key string) *BoolCmd {\n\tcmd := NewBoolCmd(\"EXISTS\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Expire(key string, expiration time.Duration) *BoolCmd {\n\tcmd := NewBoolCmd(\"EXPIRE\", key, formatSec(expiration))\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ExpireAt(key string, tm time.Time) *BoolCmd {\n\tcmd := NewBoolCmd(\"EXPIREAT\", key, tm.Unix())\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Keys(pattern string) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"KEYS\", pattern)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Migrate(host, port, key string, db int64, timeout time.Duration) *StatusCmd {\n\tcmd := NewStatusCmd(\n\t\t\"MIGRATE\",\n\t\thost,\n\t\tport,\n\t\tkey,\n\t\tdb,\n\t\tformatMs(timeout),\n\t)\n\tcmd._clusterKeyPos = 3\n\tcmd.setReadTimeout(readTimeout(timeout))\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Move(key string, db int64) *BoolCmd {\n\tcmd := NewBoolCmd(\"MOVE\", key, db)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ObjectRefCount(keys ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"OBJECT\"\n\targs[1] = \"REFCOUNT\"\n\tfor i, key := range keys {\n\t\targs[2+i] = key\n\t}\n\tcmd := NewIntCmd(args...)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ObjectEncoding(keys ...string) *StringCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"OBJECT\"\n\targs[1] = \"ENCODING\"\n\tfor i, key := range keys {\n\t\targs[2+i] = key\n\t}\n\tcmd := NewStringCmd(args...)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ObjectIdleTime(keys ...string) *DurationCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"OBJECT\"\n\targs[1] = \"IDLETIME\"\n\tfor i, key := range keys {\n\t\targs[2+i] = key\n\t}\n\tcmd := NewDurationCmd(time.Second, args...)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Persist(key string) *BoolCmd {\n\tcmd := NewBoolCmd(\"PERSIST\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) PExpire(key string, expiration time.Duration) *BoolCmd {\n\tcmd := NewBoolCmd(\"PEXPIRE\", key, formatMs(expiration))\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) PExpireAt(key string, tm time.Time) *BoolCmd {\n\tcmd := NewBoolCmd(\n\t\t\"PEXPIREAT\",\n\t\tkey,\n\t\ttm.UnixNano()/int64(time.Millisecond),\n\t)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) PTTL(key string) *DurationCmd {\n\tcmd := NewDurationCmd(time.Millisecond, \"PTTL\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) RandomKey() *StringCmd {\n\tcmd := NewStringCmd(\"RANDOMKEY\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Rename(key, newkey string) *StatusCmd {\n\tcmd := NewStatusCmd(\"RENAME\", key, newkey)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) RenameNX(key, newkey string) *BoolCmd {\n\tcmd := NewBoolCmd(\"RENAMENX\", key, newkey)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Restore(key string, ttl time.Duration, value string) *StatusCmd {\n\tcmd := NewStatusCmd(\n\t\t\"RESTORE\",\n\t\tkey,\n\t\tformatMs(ttl),\n\t\tvalue,\n\t)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) RestoreReplace(key string, ttl time.Duration, value string) *StatusCmd {\n\tcmd := NewStatusCmd(\n\t\t\"RESTORE\",\n\t\tkey,\n\t\tformatMs(ttl),\n\t\tvalue,\n\t\t\"REPLACE\",\n\t)\n\tc.Process(cmd)\n\treturn cmd\n}\n\ntype Sort struct {\n\tBy            string\n\tOffset, Count float64\n\tGet           []string\n\tOrder         string\n\tIsAlpha       bool\n\tStore         string\n}\n\nfunc (sort *Sort) args(key string) []interface{} {\n\targs := []interface{}{\"SORT\", key}\n\tif sort.By != \"\" {\n\t\targs = append(args, \"BY\", sort.By)\n\t}\n\tif sort.Offset != 0 || sort.Count != 0 {\n\t\targs = append(args, \"LIMIT\", sort.Offset, sort.Count)\n\t}\n\tfor _, get := range sort.Get {\n\t\targs = append(args, \"GET\", get)\n\t}\n\tif sort.Order != \"\" {\n\t\targs = append(args, sort.Order)\n\t}\n\tif sort.IsAlpha {\n\t\targs = append(args, \"ALPHA\")\n\t}\n\tif sort.Store != \"\" {\n\t\targs = append(args, \"STORE\", sort.Store)\n\t}\n\treturn args\n}\n\nfunc (c *commandable) Sort(key string, sort Sort) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(sort.args(key)...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SortInterfaces(key string, sort Sort) *SliceCmd {\n\tcmd := NewSliceCmd(sort.args(key)...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) TTL(key string) *DurationCmd {\n\tcmd := NewDurationCmd(time.Second, \"TTL\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Type(key string) *StatusCmd {\n\tcmd := NewStatusCmd(\"TYPE\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Scan(cursor int64, match string, count int64) *ScanCmd {\n\targs := []interface{}{\"SCAN\", cursor}\n\tif match != \"\" {\n\t\targs = append(args, \"MATCH\", match)\n\t}\n\tif count > 0 {\n\t\targs = append(args, \"COUNT\", count)\n\t}\n\tcmd := NewScanCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SScan(key string, cursor int64, match string, count int64) *ScanCmd {\n\targs := []interface{}{\"SSCAN\", key, cursor}\n\tif match != \"\" {\n\t\targs = append(args, \"MATCH\", match)\n\t}\n\tif count > 0 {\n\t\targs = append(args, \"COUNT\", count)\n\t}\n\tcmd := NewScanCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HScan(key string, cursor int64, match string, count int64) *ScanCmd {\n\targs := []interface{}{\"HSCAN\", key, cursor}\n\tif match != \"\" {\n\t\targs = append(args, \"MATCH\", match)\n\t}\n\tif count > 0 {\n\t\targs = append(args, \"COUNT\", count)\n\t}\n\tcmd := NewScanCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZScan(key string, cursor int64, match string, count int64) *ScanCmd {\n\targs := []interface{}{\"ZSCAN\", key, cursor}\n\tif match != \"\" {\n\t\targs = append(args, \"MATCH\", match)\n\t}\n\tif count > 0 {\n\t\targs = append(args, \"COUNT\", count)\n\t}\n\tcmd := NewScanCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) Append(key, value string) *IntCmd {\n\tcmd := NewIntCmd(\"APPEND\", key, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\ntype BitCount struct {\n\tStart, End int64\n}\n\nfunc (c *commandable) BitCount(key string, bitCount *BitCount) *IntCmd {\n\targs := []interface{}{\"BITCOUNT\", key}\n\tif bitCount != nil {\n\t\targs = append(\n\t\t\targs,\n\t\t\tbitCount.Start,\n\t\t\tbitCount.End,\n\t\t)\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) bitOp(op, destKey string, keys ...string) *IntCmd {\n\targs := make([]interface{}, 3+len(keys))\n\targs[0] = \"BITOP\"\n\targs[1] = op\n\targs[2] = destKey\n\tfor i, key := range keys {\n\t\targs[3+i] = key\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) BitOpAnd(destKey string, keys ...string) *IntCmd {\n\treturn c.bitOp(\"AND\", destKey, keys...)\n}\n\nfunc (c *commandable) BitOpOr(destKey string, keys ...string) *IntCmd {\n\treturn c.bitOp(\"OR\", destKey, keys...)\n}\n\nfunc (c *commandable) BitOpXor(destKey string, keys ...string) *IntCmd {\n\treturn c.bitOp(\"XOR\", destKey, keys...)\n}\n\nfunc (c *commandable) BitOpNot(destKey string, key string) *IntCmd {\n\treturn c.bitOp(\"NOT\", destKey, key)\n}\n\nfunc (c *commandable) BitPos(key string, bit int64, pos ...int64) *IntCmd {\n\targs := make([]interface{}, 3+len(pos))\n\targs[0] = \"BITPOS\"\n\targs[1] = key\n\targs[2] = bit\n\tswitch len(pos) {\n\tcase 0:\n\tcase 1:\n\t\targs[3] = pos[0]\n\tcase 2:\n\t\targs[3] = pos[0]\n\t\targs[4] = pos[1]\n\tdefault:\n\t\tpanic(\"too many arguments\")\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Decr(key string) *IntCmd {\n\tcmd := NewIntCmd(\"DECR\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) DecrBy(key string, decrement int64) *IntCmd {\n\tcmd := NewIntCmd(\"DECRBY\", key, decrement)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Get(key string) *StringCmd {\n\tcmd := NewStringCmd(\"GET\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) GetBit(key string, offset int64) *IntCmd {\n\tcmd := NewIntCmd(\"GETBIT\", key, offset)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) GetRange(key string, start, end int64) *StringCmd {\n\tcmd := NewStringCmd(\"GETRANGE\", key, start, end)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) GetSet(key string, value interface{}) *StringCmd {\n\tcmd := NewStringCmd(\"GETSET\", key, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Incr(key string) *IntCmd {\n\tcmd := NewIntCmd(\"INCR\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) IncrBy(key string, value int64) *IntCmd {\n\tcmd := NewIntCmd(\"INCRBY\", key, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) IncrByFloat(key string, value float64) *FloatCmd {\n\tcmd := NewFloatCmd(\"INCRBYFLOAT\", key, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) MGet(keys ...string) *SliceCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"MGET\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) MSet(pairs ...string) *StatusCmd {\n\targs := make([]interface{}, 1+len(pairs))\n\targs[0] = \"MSET\"\n\tfor i, pair := range pairs {\n\t\targs[1+i] = pair\n\t}\n\tcmd := NewStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) MSetNX(pairs ...string) *BoolCmd {\n\targs := make([]interface{}, 1+len(pairs))\n\targs[0] = \"MSETNX\"\n\tfor i, pair := range pairs {\n\t\targs[1+i] = pair\n\t}\n\tcmd := NewBoolCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `SET key value [expiration]` command.\n//\n// Zero expiration means the key has no expiration time.\nfunc (c *commandable) Set(key string, value interface{}, expiration time.Duration) *StatusCmd {\n\targs := make([]interface{}, 3, 5)\n\targs[0] = \"SET\"\n\targs[1] = key\n\targs[2] = value\n\tif expiration > 0 {\n\t\tif usePrecise(expiration) {\n\t\t\targs = append(args, \"PX\", formatMs(expiration))\n\t\t} else {\n\t\t\targs = append(args, \"EX\", formatSec(expiration))\n\t\t}\n\t}\n\tcmd := NewStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SetBit(key string, offset int64, value int) *IntCmd {\n\tcmd := NewIntCmd(\n\t\t\"SETBIT\",\n\t\tkey,\n\t\toffset,\n\t\tvalue,\n\t)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `SET key value [expiration] NX` command.\n//\n// Zero expiration means the key has no expiration time.\nfunc (c *commandable) SetNX(key string, value interface{}, expiration time.Duration) *BoolCmd {\n\tvar cmd *BoolCmd\n\tif expiration == 0 {\n\t\t// Use old `SETNX` to support old Redis versions.\n\t\tcmd = NewBoolCmd(\"SETNX\", key, value)\n\t} else {\n\t\tif usePrecise(expiration) {\n\t\t\tcmd = NewBoolCmd(\"SET\", key, value, \"PX\", formatMs(expiration), \"NX\")\n\t\t} else {\n\t\t\tcmd = NewBoolCmd(\"SET\", key, value, \"EX\", formatSec(expiration), \"NX\")\n\t\t}\n\t}\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `SET key value [expiration] XX` command.\n//\n// Zero expiration means the key has no expiration time.\nfunc (c *commandable) SetXX(key string, value interface{}, expiration time.Duration) *BoolCmd {\n\tvar cmd *BoolCmd\n\tif usePrecise(expiration) {\n\t\tcmd = NewBoolCmd(\"SET\", key, value, \"PX\", formatMs(expiration), \"XX\")\n\t} else {\n\t\tcmd = NewBoolCmd(\"SET\", key, value, \"EX\", formatSec(expiration), \"XX\")\n\t}\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SetRange(key string, offset int64, value string) *IntCmd {\n\tcmd := NewIntCmd(\"SETRANGE\", key, offset, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) StrLen(key string) *IntCmd {\n\tcmd := NewIntCmd(\"STRLEN\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) HDel(key string, fields ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(fields))\n\targs[0] = \"HDEL\"\n\targs[1] = key\n\tfor i, field := range fields {\n\t\targs[2+i] = field\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HExists(key, field string) *BoolCmd {\n\tcmd := NewBoolCmd(\"HEXISTS\", key, field)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HGet(key, field string) *StringCmd {\n\tcmd := NewStringCmd(\"HGET\", key, field)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HGetAll(key string) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"HGETALL\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HGetAllMap(key string) *StringStringMapCmd {\n\tcmd := NewStringStringMapCmd(\"HGETALL\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HIncrBy(key, field string, incr int64) *IntCmd {\n\tcmd := NewIntCmd(\"HINCRBY\", key, field, incr)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HIncrByFloat(key, field string, incr float64) *FloatCmd {\n\tcmd := NewFloatCmd(\"HINCRBYFLOAT\", key, field, incr)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HKeys(key string) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"HKEYS\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HLen(key string) *IntCmd {\n\tcmd := NewIntCmd(\"HLEN\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HMGet(key string, fields ...string) *SliceCmd {\n\targs := make([]interface{}, 2+len(fields))\n\targs[0] = \"HMGET\"\n\targs[1] = key\n\tfor i, field := range fields {\n\t\targs[2+i] = field\n\t}\n\tcmd := NewSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HMSet(key, field, value string, pairs ...string) *StatusCmd {\n\targs := make([]interface{}, 4+len(pairs))\n\targs[0] = \"HMSET\"\n\targs[1] = key\n\targs[2] = field\n\targs[3] = value\n\tfor i, pair := range pairs {\n\t\targs[4+i] = pair\n\t}\n\tcmd := NewStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HMSetMap(key string, fields map[string]string) *StatusCmd {\n\targs := make([]interface{}, 2+len(fields)*2)\n\targs[0] = \"HMSET\"\n\targs[1] = key\n\ti := 2\n\tfor k, v := range fields {\n\t\targs[i] = k\n\t\targs[i+1] = v\n\t\ti += 2\n\t}\n\tcmd := NewStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HSet(key, field, value string) *BoolCmd {\n\tcmd := NewBoolCmd(\"HSET\", key, field, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HSetNX(key, field, value string) *BoolCmd {\n\tcmd := NewBoolCmd(\"HSETNX\", key, field, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) HVals(key string) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"HVALS\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) BLPop(timeout time.Duration, keys ...string) *StringSliceCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"BLPOP\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\targs[len(args)-1] = formatSec(timeout)\n\tcmd := NewStringSliceCmd(args...)\n\tcmd.setReadTimeout(readTimeout(timeout))\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) BRPop(timeout time.Duration, keys ...string) *StringSliceCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"BRPOP\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\targs[len(args)-1] = formatSec(timeout)\n\tcmd := NewStringSliceCmd(args...)\n\tcmd.setReadTimeout(readTimeout(timeout))\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) BRPopLPush(source, destination string, timeout time.Duration) *StringCmd {\n\tcmd := NewStringCmd(\n\t\t\"BRPOPLPUSH\",\n\t\tsource,\n\t\tdestination,\n\t\tformatSec(timeout),\n\t)\n\tcmd.setReadTimeout(readTimeout(timeout))\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LIndex(key string, index int64) *StringCmd {\n\tcmd := NewStringCmd(\"LINDEX\", key, index)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LInsert(key, op, pivot, value string) *IntCmd {\n\tcmd := NewIntCmd(\"LINSERT\", key, op, pivot, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LLen(key string) *IntCmd {\n\tcmd := NewIntCmd(\"LLEN\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LPop(key string) *StringCmd {\n\tcmd := NewStringCmd(\"LPOP\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LPush(key string, values ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(values))\n\targs[0] = \"LPUSH\"\n\targs[1] = key\n\tfor i, value := range values {\n\t\targs[2+i] = value\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LPushX(key, value interface{}) *IntCmd {\n\tcmd := NewIntCmd(\"LPUSHX\", key, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LRange(key string, start, stop int64) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\n\t\t\"LRANGE\",\n\t\tkey,\n\t\tstart,\n\t\tstop,\n\t)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LRem(key string, count int64, value interface{}) *IntCmd {\n\tcmd := NewIntCmd(\"LREM\", key, count, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LSet(key string, index int64, value interface{}) *StatusCmd {\n\tcmd := NewStatusCmd(\"LSET\", key, index, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LTrim(key string, start, stop int64) *StatusCmd {\n\tcmd := NewStatusCmd(\n\t\t\"LTRIM\",\n\t\tkey,\n\t\tstart,\n\t\tstop,\n\t)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) RPop(key string) *StringCmd {\n\tcmd := NewStringCmd(\"RPOP\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) RPopLPush(source, destination string) *StringCmd {\n\tcmd := NewStringCmd(\"RPOPLPUSH\", source, destination)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) RPush(key string, values ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(values))\n\targs[0] = \"RPUSH\"\n\targs[1] = key\n\tfor i, value := range values {\n\t\targs[2+i] = value\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) RPushX(key string, value interface{}) *IntCmd {\n\tcmd := NewIntCmd(\"RPUSHX\", key, value)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) SAdd(key string, members ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(members))\n\targs[0] = \"SADD\"\n\targs[1] = key\n\tfor i, member := range members {\n\t\targs[2+i] = member\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SCard(key string) *IntCmd {\n\tcmd := NewIntCmd(\"SCARD\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SDiff(keys ...string) *StringSliceCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"SDIFF\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SDiffStore(destination string, keys ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"SDIFFSTORE\"\n\targs[1] = destination\n\tfor i, key := range keys {\n\t\targs[2+i] = key\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SInter(keys ...string) *StringSliceCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"SINTER\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SInterStore(destination string, keys ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"SINTERSTORE\"\n\targs[1] = destination\n\tfor i, key := range keys {\n\t\targs[2+i] = key\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SIsMember(key string, member interface{}) *BoolCmd {\n\tcmd := NewBoolCmd(\"SISMEMBER\", key, member)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SMembers(key string) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"SMEMBERS\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SMove(source, destination string, member interface{}) *BoolCmd {\n\tcmd := NewBoolCmd(\"SMOVE\", source, destination, member)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `SPOP key` command.\nfunc (c *commandable) SPop(key string) *StringCmd {\n\tcmd := NewStringCmd(\"SPOP\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `SPOP key count` command.\nfunc (c *commandable) SPopN(key string, count int64) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"SPOP\", key, count)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `SRANDMEMBER key` command.\nfunc (c *commandable) SRandMember(key string) *StringCmd {\n\tcmd := NewStringCmd(\"SRANDMEMBER\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `SRANDMEMBER key count` command.\nfunc (c *commandable) SRandMemberN(key string, count int64) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"SRANDMEMBER\", key, count)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SRem(key string, members ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(members))\n\targs[0] = \"SREM\"\n\targs[1] = key\n\tfor i, member := range members {\n\t\targs[2+i] = member\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SUnion(keys ...string) *StringSliceCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"SUNION\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SUnionStore(destination string, keys ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"SUNIONSTORE\"\n\targs[1] = destination\n\tfor i, key := range keys {\n\t\targs[2+i] = key\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\n// Z represents sorted set member.\ntype Z struct {\n\tScore  float64\n\tMember interface{}\n}\n\n// ZStore is used as an arg to ZInterStore and ZUnionStore.\ntype ZStore struct {\n\tWeights []float64\n\t// Can be SUM, MIN or MAX.\n\tAggregate string\n}\n\nfunc (c *commandable) zAdd(a []interface{}, n int, members ...Z) *IntCmd {\n\tfor i, m := range members {\n\t\ta[n+2*i] = m.Score\n\t\ta[n+2*i+1] = m.Member\n\t}\n\tcmd := NewIntCmd(a...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `ZADD key score member [score member ...]` command.\nfunc (c *commandable) ZAdd(key string, members ...Z) *IntCmd {\n\tconst n = 2\n\ta := make([]interface{}, n+2*len(members))\n\ta[0], a[1] = \"ZADD\", key\n\treturn c.zAdd(a, n, members...)\n}\n\n// Redis `ZADD key NX score member [score member ...]` command.\nfunc (c *commandable) ZAddNX(key string, members ...Z) *IntCmd {\n\tconst n = 3\n\ta := make([]interface{}, n+2*len(members))\n\ta[0], a[1], a[2] = \"ZADD\", key, \"NX\"\n\treturn c.zAdd(a, n, members...)\n}\n\n// Redis `ZADD key XX score member [score member ...]` command.\nfunc (c *commandable) ZAddXX(key string, members ...Z) *IntCmd {\n\tconst n = 3\n\ta := make([]interface{}, n+2*len(members))\n\ta[0], a[1], a[2] = \"ZADD\", key, \"XX\"\n\treturn c.zAdd(a, n, members...)\n}\n\n// Redis `ZADD key CH score member [score member ...]` command.\nfunc (c *commandable) ZAddCh(key string, members ...Z) *IntCmd {\n\tconst n = 3\n\ta := make([]interface{}, n+2*len(members))\n\ta[0], a[1], a[2] = \"ZADD\", key, \"CH\"\n\treturn c.zAdd(a, n, members...)\n}\n\n// Redis `ZADD key NX CH score member [score member ...]` command.\nfunc (c *commandable) ZAddNXCh(key string, members ...Z) *IntCmd {\n\tconst n = 4\n\ta := make([]interface{}, n+2*len(members))\n\ta[0], a[1], a[2], a[3] = \"ZADD\", key, \"NX\", \"CH\"\n\treturn c.zAdd(a, n, members...)\n}\n\n// Redis `ZADD key XX CH score member [score member ...]` command.\nfunc (c *commandable) ZAddXXCh(key string, members ...Z) *IntCmd {\n\tconst n = 4\n\ta := make([]interface{}, n+2*len(members))\n\ta[0], a[1], a[2], a[3] = \"ZADD\", key, \"XX\", \"CH\"\n\treturn c.zAdd(a, n, members...)\n}\n\nfunc (c *commandable) zIncr(a []interface{}, n int, members ...Z) *FloatCmd {\n\tfor i, m := range members {\n\t\ta[n+2*i] = m.Score\n\t\ta[n+2*i+1] = m.Member\n\t}\n\tcmd := NewFloatCmd(a...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Redis `ZADD key INCR score member` command.\nfunc (c *commandable) ZIncr(key string, member Z) *FloatCmd {\n\tconst n = 3\n\ta := make([]interface{}, n+2)\n\ta[0], a[1], a[2] = \"ZADD\", key, \"INCR\"\n\treturn c.zIncr(a, n, member)\n}\n\n// Redis `ZADD key NX INCR score member` command.\nfunc (c *commandable) ZIncrNX(key string, member Z) *FloatCmd {\n\tconst n = 4\n\ta := make([]interface{}, n+2)\n\ta[0], a[1], a[2], a[3] = \"ZADD\", key, \"INCR\", \"NX\"\n\treturn c.zIncr(a, n, member)\n}\n\n// Redis `ZADD key XX INCR score member` command.\nfunc (c *commandable) ZIncrXX(key string, member Z) *FloatCmd {\n\tconst n = 4\n\ta := make([]interface{}, n+2)\n\ta[0], a[1], a[2], a[3] = \"ZADD\", key, \"INCR\", \"XX\"\n\treturn c.zIncr(a, n, member)\n}\n\nfunc (c *commandable) ZCard(key string) *IntCmd {\n\tcmd := NewIntCmd(\"ZCARD\", key)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZCount(key, min, max string) *IntCmd {\n\tcmd := NewIntCmd(\"ZCOUNT\", key, min, max)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZIncrBy(key string, increment float64, member string) *FloatCmd {\n\tcmd := NewFloatCmd(\"ZINCRBY\", key, increment, member)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZInterStore(destination string, store ZStore, keys ...string) *IntCmd {\n\targs := make([]interface{}, 3+len(keys))\n\targs[0] = \"ZINTERSTORE\"\n\targs[1] = destination\n\targs[2] = strconv.Itoa(len(keys))\n\tfor i, key := range keys {\n\t\targs[3+i] = key\n\t}\n\tif len(store.Weights) > 0 {\n\t\targs = append(args, \"WEIGHTS\")\n\t\tfor _, weight := range store.Weights {\n\t\t\targs = append(args, weight)\n\t\t}\n\t}\n\tif store.Aggregate != \"\" {\n\t\targs = append(args, \"AGGREGATE\", store.Aggregate)\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) zRange(key string, start, stop int64, withScores bool) *StringSliceCmd {\n\targs := []interface{}{\n\t\t\"ZRANGE\",\n\t\tkey,\n\t\tstart,\n\t\tstop,\n\t}\n\tif withScores {\n\t\targs = append(args, \"WITHSCORES\")\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRange(key string, start, stop int64) *StringSliceCmd {\n\treturn c.zRange(key, start, stop, false)\n}\n\nfunc (c *commandable) ZRangeWithScores(key string, start, stop int64) *ZSliceCmd {\n\tcmd := NewZSliceCmd(\"ZRANGE\", key, start, stop, \"WITHSCORES\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// TODO: Rename to something more generic in v4\ntype ZRangeByScore struct {\n\tMin, Max      string\n\tOffset, Count int64\n}\n\nfunc (c *commandable) zRangeBy(zcmd, key string, opt ZRangeByScore, withScores bool) *StringSliceCmd {\n\targs := []interface{}{zcmd, key, opt.Min, opt.Max}\n\tif withScores {\n\t\targs = append(args, \"WITHSCORES\")\n\t}\n\tif opt.Offset != 0 || opt.Count != 0 {\n\t\targs = append(\n\t\t\targs,\n\t\t\t\"LIMIT\",\n\t\t\topt.Offset,\n\t\t\topt.Count,\n\t\t)\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRangeByScore(key string, opt ZRangeByScore) *StringSliceCmd {\n\treturn c.zRangeBy(\"ZRANGEBYSCORE\", key, opt, false)\n}\n\nfunc (c *commandable) ZRangeByLex(key string, opt ZRangeByScore) *StringSliceCmd {\n\treturn c.zRangeBy(\"ZRANGEBYLEX\", key, opt, false)\n}\n\nfunc (c *commandable) ZRangeByScoreWithScores(key string, opt ZRangeByScore) *ZSliceCmd {\n\targs := []interface{}{\"ZRANGEBYSCORE\", key, opt.Min, opt.Max, \"WITHSCORES\"}\n\tif opt.Offset != 0 || opt.Count != 0 {\n\t\targs = append(\n\t\t\targs,\n\t\t\t\"LIMIT\",\n\t\t\topt.Offset,\n\t\t\topt.Count,\n\t\t)\n\t}\n\tcmd := NewZSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRank(key, member string) *IntCmd {\n\tcmd := NewIntCmd(\"ZRANK\", key, member)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRem(key string, members ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(members))\n\targs[0] = \"ZREM\"\n\targs[1] = key\n\tfor i, member := range members {\n\t\targs[2+i] = member\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRemRangeByRank(key string, start, stop int64) *IntCmd {\n\tcmd := NewIntCmd(\n\t\t\"ZREMRANGEBYRANK\",\n\t\tkey,\n\t\tstart,\n\t\tstop,\n\t)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRemRangeByScore(key, min, max string) *IntCmd {\n\tcmd := NewIntCmd(\"ZREMRANGEBYSCORE\", key, min, max)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRevRange(key string, start, stop int64) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"ZREVRANGE\", key, start, stop)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRevRangeWithScores(key string, start, stop int64) *ZSliceCmd {\n\tcmd := NewZSliceCmd(\"ZREVRANGE\", key, start, stop, \"WITHSCORES\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) zRevRangeBy(zcmd, key string, opt ZRangeByScore) *StringSliceCmd {\n\targs := []interface{}{zcmd, key, opt.Max, opt.Min}\n\tif opt.Offset != 0 || opt.Count != 0 {\n\t\targs = append(\n\t\t\targs,\n\t\t\t\"LIMIT\",\n\t\t\topt.Offset,\n\t\t\topt.Count,\n\t\t)\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRevRangeByScore(key string, opt ZRangeByScore) *StringSliceCmd {\n\treturn c.zRevRangeBy(\"ZREVRANGEBYSCORE\", key, opt)\n}\n\nfunc (c *commandable) ZRevRangeByLex(key string, opt ZRangeByScore) *StringSliceCmd {\n\treturn c.zRevRangeBy(\"ZREVRANGEBYLEX\", key, opt)\n}\n\nfunc (c *commandable) ZRevRangeByScoreWithScores(key string, opt ZRangeByScore) *ZSliceCmd {\n\targs := []interface{}{\"ZREVRANGEBYSCORE\", key, opt.Max, opt.Min, \"WITHSCORES\"}\n\tif opt.Offset != 0 || opt.Count != 0 {\n\t\targs = append(\n\t\t\targs,\n\t\t\t\"LIMIT\",\n\t\t\topt.Offset,\n\t\t\topt.Count,\n\t\t)\n\t}\n\tcmd := NewZSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZRevRank(key, member string) *IntCmd {\n\tcmd := NewIntCmd(\"ZREVRANK\", key, member)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZScore(key, member string) *FloatCmd {\n\tcmd := NewFloatCmd(\"ZSCORE\", key, member)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ZUnionStore(dest string, store ZStore, keys ...string) *IntCmd {\n\targs := make([]interface{}, 3+len(keys))\n\targs[0] = \"ZUNIONSTORE\"\n\targs[1] = dest\n\targs[2] = strconv.Itoa(len(keys))\n\tfor i, key := range keys {\n\t\targs[3+i] = key\n\t}\n\tif len(store.Weights) > 0 {\n\t\targs = append(args, \"WEIGHTS\")\n\t\tfor _, weight := range store.Weights {\n\t\t\targs = append(args, weight)\n\t\t}\n\t}\n\tif store.Aggregate != \"\" {\n\t\targs = append(args, \"AGGREGATE\", store.Aggregate)\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) PFAdd(key string, fields ...string) *IntCmd {\n\targs := make([]interface{}, 2+len(fields))\n\targs[0] = \"PFADD\"\n\targs[1] = key\n\tfor i, field := range fields {\n\t\targs[2+i] = field\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) PFCount(keys ...string) *IntCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"PFCOUNT\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) PFMerge(dest string, keys ...string) *StatusCmd {\n\targs := make([]interface{}, 2+len(keys))\n\targs[0] = \"PFMERGE\"\n\targs[1] = dest\n\tfor i, key := range keys {\n\t\targs[2+i] = key\n\t}\n\tcmd := NewStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) BgRewriteAOF() *StatusCmd {\n\tcmd := NewStatusCmd(\"BGREWRITEAOF\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) BgSave() *StatusCmd {\n\tcmd := NewStatusCmd(\"BGSAVE\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClientKill(ipPort string) *StatusCmd {\n\tcmd := NewStatusCmd(\"CLIENT\", \"KILL\", ipPort)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClientList() *StringCmd {\n\tcmd := NewStringCmd(\"CLIENT\", \"LIST\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClientPause(dur time.Duration) *BoolCmd {\n\tcmd := NewBoolCmd(\"CLIENT\", \"PAUSE\", formatMs(dur))\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// ClientSetName assigns a name to the one of many connections in the pool.\nfunc (c *commandable) ClientSetName(name string) *BoolCmd {\n\tcmd := NewBoolCmd(\"CLIENT\", \"SETNAME\", name)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// ClientGetName returns the name of the one of many connections in the pool.\nfunc (c *Client) ClientGetName() *StringCmd {\n\tcmd := NewStringCmd(\"CLIENT\", \"GETNAME\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ConfigGet(parameter string) *SliceCmd {\n\tcmd := NewSliceCmd(\"CONFIG\", \"GET\", parameter)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ConfigResetStat() *StatusCmd {\n\tcmd := NewStatusCmd(\"CONFIG\", \"RESETSTAT\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ConfigSet(parameter, value string) *StatusCmd {\n\tcmd := NewStatusCmd(\"CONFIG\", \"SET\", parameter, value)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) DbSize() *IntCmd {\n\tcmd := NewIntCmd(\"DBSIZE\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) FlushAll() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"FLUSHALL\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) FlushDb() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"FLUSHDB\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Info(section ...string) *StringCmd {\n\targs := []interface{}{\"INFO\"}\n\tif len(section) > 0 {\n\t\targs = append(args, section[0])\n\t}\n\tcmd := NewStringCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) LastSave() *IntCmd {\n\tcmd := NewIntCmd(\"LASTSAVE\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Save() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"SAVE\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) shutdown(modifier string) *StatusCmd {\n\tvar args []interface{}\n\tif modifier == \"\" {\n\t\targs = []interface{}{\"SHUTDOWN\"}\n\t} else {\n\t\targs = []interface{}{\"SHUTDOWN\", modifier}\n\t}\n\tcmd := newKeylessStatusCmd(args...)\n\tc.Process(cmd)\n\tif err := cmd.Err(); err != nil {\n\t\tif err == io.EOF {\n\t\t\t// Server quit as expected.\n\t\t\tcmd.err = nil\n\t\t}\n\t} else {\n\t\t// Server did not quit. String reply contains the reason.\n\t\tcmd.err = errorf(cmd.val)\n\t\tcmd.val = \"\"\n\t}\n\treturn cmd\n}\n\nfunc (c *commandable) Shutdown() *StatusCmd {\n\treturn c.shutdown(\"\")\n}\n\nfunc (c *commandable) ShutdownSave() *StatusCmd {\n\treturn c.shutdown(\"SAVE\")\n}\n\nfunc (c *commandable) ShutdownNoSave() *StatusCmd {\n\treturn c.shutdown(\"NOSAVE\")\n}\n\nfunc (c *commandable) SlaveOf(host, port string) *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"SLAVEOF\", host, port)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) SlowLog() {\n\tpanic(\"not implemented\")\n}\n\nfunc (c *commandable) Sync() {\n\tpanic(\"not implemented\")\n}\n\nfunc (c *commandable) Time() *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"TIME\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) Eval(script string, keys []string, args []string) *Cmd {\n\tcmdArgs := make([]interface{}, 3+len(keys)+len(args))\n\tcmdArgs[0] = \"EVAL\"\n\tcmdArgs[1] = script\n\tcmdArgs[2] = strconv.Itoa(len(keys))\n\tfor i, key := range keys {\n\t\tcmdArgs[3+i] = key\n\t}\n\tpos := 3 + len(keys)\n\tfor i, arg := range args {\n\t\tcmdArgs[pos+i] = arg\n\t}\n\tcmd := NewCmd(cmdArgs...)\n\tif len(keys) > 0 {\n\t\tcmd._clusterKeyPos = 3\n\t}\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) EvalSha(sha1 string, keys []string, args []string) *Cmd {\n\tcmdArgs := make([]interface{}, 3+len(keys)+len(args))\n\tcmdArgs[0] = \"EVALSHA\"\n\tcmdArgs[1] = sha1\n\tcmdArgs[2] = strconv.Itoa(len(keys))\n\tfor i, key := range keys {\n\t\tcmdArgs[3+i] = key\n\t}\n\tpos := 3 + len(keys)\n\tfor i, arg := range args {\n\t\tcmdArgs[pos+i] = arg\n\t}\n\tcmd := NewCmd(cmdArgs...)\n\tif len(keys) > 0 {\n\t\tcmd._clusterKeyPos = 3\n\t}\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ScriptExists(scripts ...string) *BoolSliceCmd {\n\targs := make([]interface{}, 2+len(scripts))\n\targs[0] = \"SCRIPT\"\n\targs[1] = \"EXISTS\"\n\tfor i, script := range scripts {\n\t\targs[2+i] = script\n\t}\n\tcmd := NewBoolSliceCmd(args...)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ScriptFlush() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"SCRIPT\", \"FLUSH\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ScriptKill() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"SCRIPT\", \"KILL\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ScriptLoad(script string) *StringCmd {\n\tcmd := NewStringCmd(\"SCRIPT\", \"LOAD\", script)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) DebugObject(key string) *StringCmd {\n\tcmd := NewStringCmd(\"DEBUG\", \"OBJECT\", key)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) PubSubChannels(pattern string) *StringSliceCmd {\n\targs := []interface{}{\"PUBSUB\", \"CHANNELS\"}\n\tif pattern != \"*\" {\n\t\targs = append(args, pattern)\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) PubSubNumSub(channels ...string) *StringIntMapCmd {\n\targs := make([]interface{}, 2+len(channels))\n\targs[0] = \"PUBSUB\"\n\targs[1] = \"NUMSUB\"\n\tfor i, channel := range channels {\n\t\targs[2+i] = channel\n\t}\n\tcmd := NewStringIntMapCmd(args...)\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) PubSubNumPat() *IntCmd {\n\tcmd := NewIntCmd(\"PUBSUB\", \"NUMPAT\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) ClusterSlots() *ClusterSlotCmd {\n\tcmd := NewClusterSlotCmd(\"CLUSTER\", \"slots\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterNodes() *StringCmd {\n\tcmd := NewStringCmd(\"CLUSTER\", \"nodes\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterMeet(host, port string) *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"CLUSTER\", \"meet\", host, port)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterForget(nodeID string) *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"CLUSTER\", \"forget\", nodeID)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterReplicate(nodeID string) *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"CLUSTER\", \"replicate\", nodeID)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterResetSoft() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"CLUSTER\", \"reset\", \"soft\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterResetHard() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"CLUSTER\", \"reset\", \"hard\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterInfo() *StringCmd {\n\tcmd := NewStringCmd(\"CLUSTER\", \"info\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterKeySlot(key string) *IntCmd {\n\tcmd := NewIntCmd(\"CLUSTER\", \"keyslot\", key)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterCountFailureReports(nodeID string) *IntCmd {\n\tcmd := NewIntCmd(\"CLUSTER\", \"count-failure-reports\", nodeID)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterCountKeysInSlot(slot int) *IntCmd {\n\tcmd := NewIntCmd(\"CLUSTER\", \"countkeysinslot\", slot)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterDelSlots(slots ...int) *StatusCmd {\n\targs := make([]interface{}, 2+len(slots))\n\targs[0] = \"CLUSTER\"\n\targs[1] = \"DELSLOTS\"\n\tfor i, slot := range slots {\n\t\targs[2+i] = slot\n\t}\n\tcmd := newKeylessStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterDelSlotsRange(min, max int) *StatusCmd {\n\tsize := max - min + 1\n\tslots := make([]int, size)\n\tfor i := 0; i < size; i++ {\n\t\tslots[i] = min + i\n\t}\n\treturn c.ClusterDelSlots(slots...)\n}\n\nfunc (c *commandable) ClusterSaveConfig() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"CLUSTER\", \"saveconfig\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterSlaves(nodeID string) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"CLUSTER\", \"SLAVES\", nodeID)\n\tcmd._clusterKeyPos = 2\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) Readonly() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"READONLY\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ReadWrite() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"READWRITE\")\n\tcmd._clusterKeyPos = 0\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterFailover() *StatusCmd {\n\tcmd := newKeylessStatusCmd(\"CLUSTER\", \"failover\")\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterAddSlots(slots ...int) *StatusCmd {\n\targs := make([]interface{}, 2+len(slots))\n\targs[0] = \"CLUSTER\"\n\targs[1] = \"ADDSLOTS\"\n\tfor i, num := range slots {\n\t\targs[2+i] = strconv.Itoa(num)\n\t}\n\tcmd := newKeylessStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) ClusterAddSlotsRange(min, max int) *StatusCmd {\n\tsize := max - min + 1\n\tslots := make([]int, size)\n\tfor i := 0; i < size; i++ {\n\t\tslots[i] = min + i\n\t}\n\treturn c.ClusterAddSlots(slots...)\n}\n\n//------------------------------------------------------------------------------\n\nfunc (c *commandable) GeoAdd(key string, geoLocation ...*GeoLocation) *IntCmd {\n\targs := make([]interface{}, 2+3*len(geoLocation))\n\targs[0] = \"GEOADD\"\n\targs[1] = key\n\tfor i, eachLoc := range geoLocation {\n\t\targs[2+3*i] = eachLoc.Longitude\n\t\targs[2+3*i+1] = eachLoc.Latitude\n\t\targs[2+3*i+2] = eachLoc.Name\n\t}\n\tcmd := NewIntCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) GeoRadius(key string, longitude, latitude float64, query *GeoRadiusQuery) *GeoLocationCmd {\n\tcmd := NewGeoLocationCmd(query, \"GEORADIUS\", key, longitude, latitude)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) GeoRadiusByMember(key, member string, query *GeoRadiusQuery) *GeoLocationCmd {\n\tcmd := NewGeoLocationCmd(query, \"GEORADIUSBYMEMBER\", key, member)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) GeoDist(key string, member1, member2, unit string) *FloatCmd {\n\tif unit == \"\" {\n\t\tunit = \"km\"\n\t}\n\tcmd := NewFloatCmd(\"GEODIST\", key, member1, member2, unit)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *commandable) GeoHash(key string, members ...string) *StringSliceCmd {\n\targs := make([]interface{}, 2+len(members))\n\targs[0] = \"GEOHASH\"\n\targs[1] = key\n\tfor i, member := range members {\n\t\targs[2+i] = member\n\t}\n\tcmd := NewStringSliceCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/doc.go",
    "content": "/*\nPackage redis implements a Redis client.\n*/\npackage redis\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/error.go",
    "content": "package redis\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"strings\"\n)\n\n// Redis nil reply, .e.g. when key does not exist.\nvar Nil = errorf(\"redis: nil\")\n\n// Redis transaction failed.\nvar TxFailedErr = errorf(\"redis: transaction failed\")\n\ntype redisError struct {\n\ts string\n}\n\nfunc errorf(s string, args ...interface{}) redisError {\n\treturn redisError{s: fmt.Sprintf(s, args...)}\n}\n\nfunc (err redisError) Error() string {\n\treturn err.s\n}\n\nfunc isInternalError(err error) bool {\n\t_, ok := err.(redisError)\n\treturn ok\n}\n\nfunc isNetworkError(err error) bool {\n\tif err == io.EOF {\n\t\treturn true\n\t}\n\t_, ok := err.(net.Error)\n\treturn ok\n}\n\nfunc isBadConn(err error, allowTimeout bool) bool {\n\tif err == nil {\n\t\treturn false\n\t}\n\tif isInternalError(err) {\n\t\treturn false\n\t}\n\tif allowTimeout {\n\t\tif netErr, ok := err.(net.Error); ok && netErr.Timeout() {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc isMovedError(err error) (moved bool, ask bool, addr string) {\n\tif _, ok := err.(redisError); !ok {\n\t\treturn\n\t}\n\n\ts := err.Error()\n\tif strings.HasPrefix(s, \"MOVED \") {\n\t\tmoved = true\n\t} else if strings.HasPrefix(s, \"ASK \") {\n\t\task = true\n\t} else {\n\t\treturn\n\t}\n\n\tind := strings.LastIndexByte(s, ' ')\n\tif ind == -1 {\n\t\treturn false, false, \"\"\n\t}\n\taddr = s[ind+1:]\n\treturn\n}\n\n// shouldRetry reports whether failed command should be retried.\nfunc shouldRetry(err error) bool {\n\treturn isNetworkError(err)\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/internal/consistenthash/consistenthash.go",
    "content": "/*\nCopyright 2013 Google Inc.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n     http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Package consistenthash provides an implementation of a ring hash.\npackage consistenthash\n\nimport (\n\t\"hash/crc32\"\n\t\"sort\"\n\t\"strconv\"\n)\n\ntype Hash func(data []byte) uint32\n\ntype Map struct {\n\thash     Hash\n\treplicas int\n\tkeys     []int // Sorted\n\thashMap  map[int]string\n}\n\nfunc New(replicas int, fn Hash) *Map {\n\tm := &Map{\n\t\treplicas: replicas,\n\t\thash:     fn,\n\t\thashMap:  make(map[int]string),\n\t}\n\tif m.hash == nil {\n\t\tm.hash = crc32.ChecksumIEEE\n\t}\n\treturn m\n}\n\n// Returns true if there are no items available.\nfunc (m *Map) IsEmpty() bool {\n\treturn len(m.keys) == 0\n}\n\n// Adds some keys to the hash.\nfunc (m *Map) Add(keys ...string) {\n\tfor _, key := range keys {\n\t\tfor i := 0; i < m.replicas; i++ {\n\t\t\thash := int(m.hash([]byte(strconv.Itoa(i) + key)))\n\t\t\tm.keys = append(m.keys, hash)\n\t\t\tm.hashMap[hash] = key\n\t\t}\n\t}\n\tsort.Ints(m.keys)\n}\n\n// Gets the closest item in the hash to the provided key.\nfunc (m *Map) Get(key string) string {\n\tif m.IsEmpty() {\n\t\treturn \"\"\n\t}\n\n\thash := int(m.hash([]byte(key)))\n\n\t// Binary search for appropriate replica.\n\tidx := sort.Search(len(m.keys), func(i int) bool { return m.keys[i] >= hash })\n\n\t// Means we have cycled back to the first replica.\n\tif idx == len(m.keys) {\n\t\tidx = 0\n\t}\n\n\treturn m.hashMap[m.keys[idx]]\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/internal/hashtag/hashtag.go",
    "content": "package hashtag\n\nimport (\n\t\"math/rand\"\n\t\"strings\"\n)\n\nconst SlotNumber = 16384\n\n// CRC16 implementation according to CCITT standards.\n// Copyright 2001-2010 Georges Menie (www.menie.org)\n// Copyright 2013 The Go Authors. All rights reserved.\n// http://redis.io/topics/cluster-spec#appendix-a-crc16-reference-implementation-in-ansi-c\nvar crc16tab = [256]uint16{\n\t0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\n\t0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\n\t0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n\t0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\n\t0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\n\t0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n\t0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\n\t0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\n\t0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n\t0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\n\t0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\n\t0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n\t0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\n\t0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\n\t0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n\t0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\n\t0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\n\t0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n\t0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\n\t0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\n\t0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n\t0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n\t0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\n\t0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n\t0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\n\t0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\n\t0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n\t0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\n\t0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\n\t0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n\t0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\n\t0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n}\n\nfunc Key(key string) string {\n\tif s := strings.IndexByte(key, '{'); s > -1 {\n\t\tif e := strings.IndexByte(key[s+1:], '}'); e > 0 {\n\t\t\treturn key[s+1 : s+e+1]\n\t\t}\n\t}\n\treturn key\n}\n\n// hashSlot returns a consistent slot number between 0 and 16383\n// for any given string key.\nfunc Slot(key string) int {\n\tkey = Key(key)\n\tif key == \"\" {\n\t\treturn rand.Intn(SlotNumber)\n\t}\n\treturn int(crc16sum(key)) % SlotNumber\n}\n\nfunc crc16sum(key string) (crc uint16) {\n\tfor i := 0; i < len(key); i++ {\n\t\tcrc = (crc << 8) ^ crc16tab[(byte(crc>>8)^key[i])&0x00ff]\n\t}\n\treturn\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/internal/log.go",
    "content": "package internal\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"log\"\n)\n\nvar Debug bool\n\nvar Logger = log.New(ioutil.Discard, \"redis: \", log.LstdFlags)\n\nfunc Debugf(s string, args ...interface{}) {\n\tif !Debug {\n\t\treturn\n\t}\n\tLogger.Output(2, fmt.Sprintf(s, args...))\n}\n\nfunc Logf(s string, args ...interface{}) {\n\tLogger.Output(2, fmt.Sprintf(s, args...))\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/internal/pool/conn.go",
    "content": "package pool\n\nimport (\n\t\"bufio\"\n\t\"io\"\n\t\"net\"\n\t\"time\"\n)\n\nconst defaultBufSize = 4096\n\nvar noDeadline = time.Time{}\n\ntype Conn struct {\n\tNetConn net.Conn\n\tRd      *bufio.Reader\n\tBuf     []byte\n\n\tInited bool\n\tUsedAt time.Time\n\n\tReadTimeout  time.Duration\n\tWriteTimeout time.Duration\n}\n\nfunc NewConn(netConn net.Conn) *Conn {\n\tcn := &Conn{\n\t\tNetConn: netConn,\n\t\tBuf:     make([]byte, defaultBufSize),\n\n\t\tUsedAt: time.Now(),\n\t}\n\tcn.Rd = bufio.NewReader(cn)\n\treturn cn\n}\n\nfunc (cn *Conn) IsStale(timeout time.Duration) bool {\n\treturn timeout > 0 && time.Since(cn.UsedAt) > timeout\n}\n\nfunc (cn *Conn) Read(b []byte) (int, error) {\n\tcn.UsedAt = time.Now()\n\tif cn.ReadTimeout != 0 {\n\t\tcn.NetConn.SetReadDeadline(cn.UsedAt.Add(cn.ReadTimeout))\n\t} else {\n\t\tcn.NetConn.SetReadDeadline(noDeadline)\n\t}\n\treturn cn.NetConn.Read(b)\n}\n\nfunc (cn *Conn) Write(b []byte) (int, error) {\n\tcn.UsedAt = time.Now()\n\tif cn.WriteTimeout != 0 {\n\t\tcn.NetConn.SetWriteDeadline(cn.UsedAt.Add(cn.WriteTimeout))\n\t} else {\n\t\tcn.NetConn.SetWriteDeadline(noDeadline)\n\t}\n\treturn cn.NetConn.Write(b)\n}\n\nfunc (cn *Conn) RemoteAddr() net.Addr {\n\treturn cn.NetConn.RemoteAddr()\n}\n\nfunc (cn *Conn) ReadN(n int) ([]byte, error) {\n\tif d := n - cap(cn.Buf); d > 0 {\n\t\tcn.Buf = cn.Buf[:cap(cn.Buf)]\n\t\tcn.Buf = append(cn.Buf, make([]byte, d)...)\n\t} else {\n\t\tcn.Buf = cn.Buf[:n]\n\t}\n\t_, err := io.ReadFull(cn.Rd, cn.Buf)\n\treturn cn.Buf, err\n}\n\nfunc (cn *Conn) Close() error {\n\treturn cn.NetConn.Close()\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/internal/pool/pool.go",
    "content": "package pool\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"gopkg.in/bsm/ratelimit.v1\"\n\n\t\"gopkg.in/redis.v3/internal\"\n)\n\nvar (\n\tErrClosed      = errors.New(\"redis: client is closed\")\n\tErrPoolTimeout = errors.New(\"redis: connection pool timeout\")\n\terrConnStale   = errors.New(\"connection is stale\")\n)\n\nvar timers = sync.Pool{\n\tNew: func() interface{} {\n\t\treturn time.NewTimer(0)\n\t},\n}\n\n// PoolStats contains pool state information and accumulated stats.\n// TODO: remove Waits\ntype PoolStats struct {\n\tRequests uint32 // number of times a connection was requested by the pool\n\tHits     uint32 // number of times free connection was found in the pool\n\tWaits    uint32 // number of times the pool had to wait for a connection\n\tTimeouts uint32 // number of times a wait timeout occurred\n\n\tTotalConns uint32 // the number of total connections in the pool\n\tFreeConns  uint32 // the number of free connections in the pool\n}\n\ntype Pooler interface {\n\tGet() (*Conn, error)\n\tPut(*Conn) error\n\tRemove(*Conn, error) error\n\tLen() int\n\tFreeLen() int\n\tStats() *PoolStats\n\tClose() error\n\tClosed() bool\n}\n\ntype dialer func() (net.Conn, error)\n\ntype ConnPool struct {\n\t_dial       dialer\n\tDialLimiter *ratelimit.RateLimiter\n\tOnClose     func(*Conn) error\n\n\tpoolTimeout time.Duration\n\tidleTimeout time.Duration\n\n\tqueue chan struct{}\n\n\tconnsMu sync.Mutex\n\tconns   []*Conn\n\n\tfreeConnsMu sync.Mutex\n\tfreeConns   []*Conn\n\n\tstats PoolStats\n\n\t_closed int32 // atomic\n\tlastErr atomic.Value\n}\n\nvar _ Pooler = (*ConnPool)(nil)\n\nfunc NewConnPool(dial dialer, poolSize int, poolTimeout, idleTimeout, idleCheckFrequency time.Duration) *ConnPool {\n\tp := &ConnPool{\n\t\t_dial:       dial,\n\t\tDialLimiter: ratelimit.New(3*poolSize, time.Second),\n\n\t\tpoolTimeout: poolTimeout,\n\t\tidleTimeout: idleTimeout,\n\n\t\tqueue:     make(chan struct{}, poolSize),\n\t\tconns:     make([]*Conn, 0, poolSize),\n\t\tfreeConns: make([]*Conn, 0, poolSize),\n\t}\n\tfor i := 0; i < poolSize; i++ {\n\t\tp.queue <- struct{}{}\n\t}\n\tif idleTimeout > 0 && idleCheckFrequency > 0 {\n\t\tgo p.reaper(idleCheckFrequency)\n\t}\n\treturn p\n}\n\nfunc (p *ConnPool) dial() (net.Conn, error) {\n\tif p.DialLimiter != nil && p.DialLimiter.Limit() {\n\t\terr := fmt.Errorf(\n\t\t\t\"redis: you open connections too fast (last_error=%q)\",\n\t\t\tp.loadLastErr(),\n\t\t)\n\t\treturn nil, err\n\t}\n\n\tcn, err := p._dial()\n\tif err != nil {\n\t\tp.storeLastErr(err.Error())\n\t\treturn nil, err\n\t}\n\treturn cn, nil\n}\n\nfunc (p *ConnPool) NewConn() (*Conn, error) {\n\tnetConn, err := p.dial()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewConn(netConn), nil\n}\n\nfunc (p *ConnPool) PopFree() *Conn {\n\ttimer := timers.Get().(*time.Timer)\n\tif !timer.Reset(p.poolTimeout) {\n\t\t<-timer.C\n\t}\n\n\tselect {\n\tcase <-p.queue:\n\t\ttimers.Put(timer)\n\tcase <-timer.C:\n\t\ttimers.Put(timer)\n\t\tatomic.AddUint32(&p.stats.Timeouts, 1)\n\t\treturn nil\n\t}\n\n\tp.freeConnsMu.Lock()\n\tcn := p.popFree()\n\tp.freeConnsMu.Unlock()\n\n\tif cn == nil {\n\t\tp.queue <- struct{}{}\n\t}\n\treturn cn\n}\n\nfunc (p *ConnPool) popFree() *Conn {\n\tif len(p.freeConns) == 0 {\n\t\treturn nil\n\t}\n\n\tidx := len(p.freeConns) - 1\n\tcn := p.freeConns[idx]\n\tp.freeConns = p.freeConns[:idx]\n\treturn cn\n}\n\n// Get returns existed connection from the pool or creates a new one.\nfunc (p *ConnPool) Get() (*Conn, error) {\n\tif p.Closed() {\n\t\treturn nil, ErrClosed\n\t}\n\n\tatomic.AddUint32(&p.stats.Requests, 1)\n\n\ttimer := timers.Get().(*time.Timer)\n\tif !timer.Reset(p.poolTimeout) {\n\t\t<-timer.C\n\t}\n\n\tselect {\n\tcase <-p.queue:\n\t\ttimers.Put(timer)\n\tcase <-timer.C:\n\t\ttimers.Put(timer)\n\t\tatomic.AddUint32(&p.stats.Timeouts, 1)\n\t\treturn nil, ErrPoolTimeout\n\t}\n\n\tp.freeConnsMu.Lock()\n\tcn := p.popFree()\n\tp.freeConnsMu.Unlock()\n\n\tif cn != nil {\n\t\tatomic.AddUint32(&p.stats.Hits, 1)\n\t\tif !cn.IsStale(p.idleTimeout) {\n\t\t\treturn cn, nil\n\t\t}\n\t\t_ = cn.Close()\n\t}\n\n\tnewcn, err := p.NewConn()\n\tif err != nil {\n\t\tp.queue <- struct{}{}\n\t\treturn nil, err\n\t}\n\n\tp.connsMu.Lock()\n\tif cn != nil {\n\t\tp.remove(cn, errConnStale)\n\t}\n\tp.conns = append(p.conns, newcn)\n\tp.connsMu.Unlock()\n\n\treturn newcn, nil\n}\n\nfunc (p *ConnPool) Put(cn *Conn) error {\n\tif cn.Rd.Buffered() != 0 {\n\t\tb, _ := cn.Rd.Peek(cn.Rd.Buffered())\n\t\terr := fmt.Errorf(\"connection has unread data: %q\", b)\n\t\tinternal.Logf(err.Error())\n\t\treturn p.Remove(cn, err)\n\t}\n\tp.freeConnsMu.Lock()\n\tp.freeConns = append(p.freeConns, cn)\n\tp.freeConnsMu.Unlock()\n\tp.queue <- struct{}{}\n\treturn nil\n}\n\nfunc (p *ConnPool) Remove(cn *Conn, reason error) error {\n\t_ = cn.Close()\n\tp.connsMu.Lock()\n\tp.remove(cn, reason)\n\tp.connsMu.Unlock()\n\tp.queue <- struct{}{}\n\treturn nil\n}\n\nfunc (p *ConnPool) remove(cn *Conn, reason error) {\n\tp.storeLastErr(reason.Error())\n\tfor i, c := range p.conns {\n\t\tif c == cn {\n\t\t\tp.conns = append(p.conns[:i], p.conns[i+1:]...)\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n// Len returns total number of connections.\nfunc (p *ConnPool) Len() int {\n\tp.connsMu.Lock()\n\tl := len(p.conns)\n\tp.connsMu.Unlock()\n\treturn l\n}\n\n// FreeLen returns number of free connections.\nfunc (p *ConnPool) FreeLen() int {\n\tp.freeConnsMu.Lock()\n\tl := len(p.freeConns)\n\tp.freeConnsMu.Unlock()\n\treturn l\n}\n\nfunc (p *ConnPool) Stats() *PoolStats {\n\tstats := PoolStats{}\n\tstats.Requests = atomic.LoadUint32(&p.stats.Requests)\n\tstats.Hits = atomic.LoadUint32(&p.stats.Hits)\n\tstats.Waits = atomic.LoadUint32(&p.stats.Waits)\n\tstats.Timeouts = atomic.LoadUint32(&p.stats.Timeouts)\n\tstats.TotalConns = uint32(p.Len())\n\tstats.FreeConns = uint32(p.FreeLen())\n\treturn &stats\n}\n\nfunc (p *ConnPool) Closed() bool {\n\treturn atomic.LoadInt32(&p._closed) == 1\n}\n\nfunc (p *ConnPool) Close() (retErr error) {\n\tif !atomic.CompareAndSwapInt32(&p._closed, 0, 1) {\n\t\treturn ErrClosed\n\t}\n\n\tp.connsMu.Lock()\n\n\t// Close all connections.\n\tfor _, cn := range p.conns {\n\t\tif cn == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif err := p.closeConn(cn); err != nil && retErr == nil {\n\t\t\tretErr = err\n\t\t}\n\t}\n\tp.conns = nil\n\tp.connsMu.Unlock()\n\n\tp.freeConnsMu.Lock()\n\tp.freeConns = nil\n\tp.freeConnsMu.Unlock()\n\n\treturn retErr\n}\n\nfunc (p *ConnPool) closeConn(cn *Conn) error {\n\tif p.OnClose != nil {\n\t\t_ = p.OnClose(cn)\n\t}\n\treturn cn.Close()\n}\n\nfunc (p *ConnPool) ReapStaleConns() (n int, err error) {\n\t<-p.queue\n\tp.freeConnsMu.Lock()\n\n\tif len(p.freeConns) == 0 {\n\t\tp.freeConnsMu.Unlock()\n\t\tp.queue <- struct{}{}\n\t\treturn\n\t}\n\n\tvar idx int\n\tvar cn *Conn\n\tfor idx, cn = range p.freeConns {\n\t\tif !cn.IsStale(p.idleTimeout) {\n\t\t\tbreak\n\t\t}\n\t\tp.connsMu.Lock()\n\t\tp.remove(cn, errConnStale)\n\t\tp.connsMu.Unlock()\n\t\tn++\n\t}\n\tif idx > 0 {\n\t\tp.freeConns = append(p.freeConns[:0], p.freeConns[idx:]...)\n\t}\n\n\tp.freeConnsMu.Unlock()\n\tp.queue <- struct{}{}\n\treturn\n}\n\nfunc (p *ConnPool) reaper(frequency time.Duration) {\n\tticker := time.NewTicker(frequency)\n\tdefer ticker.Stop()\n\n\tfor _ = range ticker.C {\n\t\tif p.Closed() {\n\t\t\tbreak\n\t\t}\n\t\tn, err := p.ReapStaleConns()\n\t\tif err != nil {\n\t\t\tinternal.Logf(\"ReapStaleConns failed: %s\", err)\n\t\t\tcontinue\n\t\t}\n\t\ts := p.Stats()\n\t\tinternal.Logf(\n\t\t\t\"reaper: removed %d stale conns (TotalConns=%d FreeConns=%d Requests=%d Hits=%d Timeouts=%d)\",\n\t\t\tn, s.TotalConns, s.FreeConns, s.Requests, s.Hits, s.Timeouts,\n\t\t)\n\t}\n}\n\nfunc (p *ConnPool) storeLastErr(err string) {\n\tp.lastErr.Store(err)\n}\n\nfunc (p *ConnPool) loadLastErr() string {\n\tif v := p.lastErr.Load(); v != nil {\n\t\treturn v.(string)\n\t}\n\treturn \"\"\n}\n\n//------------------------------------------------------------------------------\n\nvar idleCheckFrequency atomic.Value\n\nfunc SetIdleCheckFrequency(d time.Duration) {\n\tidleCheckFrequency.Store(d)\n}\n\nfunc getIdleCheckFrequency() time.Duration {\n\tv := idleCheckFrequency.Load()\n\tif v == nil {\n\t\treturn time.Minute\n\t}\n\treturn v.(time.Duration)\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/internal/pool/pool_single.go",
    "content": "package pool\n\ntype SingleConnPool struct {\n\tcn *Conn\n}\n\nvar _ Pooler = (*SingleConnPool)(nil)\n\nfunc NewSingleConnPool(cn *Conn) *SingleConnPool {\n\treturn &SingleConnPool{\n\t\tcn: cn,\n\t}\n}\n\nfunc (p *SingleConnPool) First() *Conn {\n\treturn p.cn\n}\n\nfunc (p *SingleConnPool) Get() (*Conn, error) {\n\treturn p.cn, nil\n}\n\nfunc (p *SingleConnPool) Put(cn *Conn) error {\n\tif p.cn != cn {\n\t\tpanic(\"p.cn != cn\")\n\t}\n\treturn nil\n}\n\nfunc (p *SingleConnPool) Remove(cn *Conn, _ error) error {\n\tif p.cn != cn {\n\t\tpanic(\"p.cn != cn\")\n\t}\n\treturn nil\n}\n\nfunc (p *SingleConnPool) Len() int {\n\treturn 1\n}\n\nfunc (p *SingleConnPool) FreeLen() int {\n\treturn 0\n}\n\nfunc (p *SingleConnPool) Stats() *PoolStats {\n\treturn nil\n}\n\nfunc (p *SingleConnPool) Close() error {\n\treturn nil\n}\n\nfunc (p *SingleConnPool) Closed() bool {\n\treturn false\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/internal/pool/pool_sticky.go",
    "content": "package pool\n\nimport (\n\t\"errors\"\n\t\"sync\"\n)\n\ntype StickyConnPool struct {\n\tpool     *ConnPool\n\treusable bool\n\n\tcn     *Conn\n\tclosed bool\n\tmx     sync.Mutex\n}\n\nvar _ Pooler = (*StickyConnPool)(nil)\n\nfunc NewStickyConnPool(pool *ConnPool, reusable bool) *StickyConnPool {\n\treturn &StickyConnPool{\n\t\tpool:     pool,\n\t\treusable: reusable,\n\t}\n}\n\nfunc (p *StickyConnPool) First() *Conn {\n\tp.mx.Lock()\n\tcn := p.cn\n\tp.mx.Unlock()\n\treturn cn\n}\n\nfunc (p *StickyConnPool) Get() (*Conn, error) {\n\tdefer p.mx.Unlock()\n\tp.mx.Lock()\n\n\tif p.closed {\n\t\treturn nil, ErrClosed\n\t}\n\tif p.cn != nil {\n\t\treturn p.cn, nil\n\t}\n\n\tcn, err := p.pool.Get()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tp.cn = cn\n\treturn cn, nil\n}\n\nfunc (p *StickyConnPool) put() (err error) {\n\terr = p.pool.Put(p.cn)\n\tp.cn = nil\n\treturn err\n}\n\nfunc (p *StickyConnPool) Put(cn *Conn) error {\n\tdefer p.mx.Unlock()\n\tp.mx.Lock()\n\tif p.closed {\n\t\treturn ErrClosed\n\t}\n\tif p.cn != cn {\n\t\tpanic(\"p.cn != cn\")\n\t}\n\treturn nil\n}\n\nfunc (p *StickyConnPool) remove(reason error) error {\n\terr := p.pool.Remove(p.cn, reason)\n\tp.cn = nil\n\treturn err\n}\n\nfunc (p *StickyConnPool) Remove(cn *Conn, reason error) error {\n\tdefer p.mx.Unlock()\n\tp.mx.Lock()\n\tif p.closed {\n\t\treturn nil\n\t}\n\tif p.cn == nil {\n\t\tpanic(\"p.cn == nil\")\n\t}\n\tif cn != nil && p.cn != cn {\n\t\tpanic(\"p.cn != cn\")\n\t}\n\treturn p.remove(reason)\n}\n\nfunc (p *StickyConnPool) Len() int {\n\tdefer p.mx.Unlock()\n\tp.mx.Lock()\n\tif p.cn == nil {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\nfunc (p *StickyConnPool) FreeLen() int {\n\tdefer p.mx.Unlock()\n\tp.mx.Lock()\n\tif p.cn == nil {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc (p *StickyConnPool) Stats() *PoolStats { return nil }\n\nfunc (p *StickyConnPool) Close() error {\n\tdefer p.mx.Unlock()\n\tp.mx.Lock()\n\tif p.closed {\n\t\treturn ErrClosed\n\t}\n\tp.closed = true\n\tvar err error\n\tif p.cn != nil {\n\t\tif p.reusable {\n\t\t\terr = p.put()\n\t\t} else {\n\t\t\treason := errors.New(\"redis: sticky not reusable connection\")\n\t\t\terr = p.remove(reason)\n\t\t}\n\t}\n\treturn err\n}\n\nfunc (p *StickyConnPool) Closed() bool {\n\tp.mx.Lock()\n\tclosed := p.closed\n\tp.mx.Unlock()\n\treturn closed\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/multi.go",
    "content": "package redis\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"gopkg.in/redis.v3/internal\"\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\nvar errDiscard = errors.New(\"redis: Discard can be used only inside Exec\")\n\n// Multi implements Redis transactions as described in\n// http://redis.io/topics/transactions. It's NOT safe for concurrent use\n// by multiple goroutines, because Exec resets list of watched keys.\n// If you don't need WATCH it is better to use Pipeline.\n//\n// TODO(vmihailenco): rename to Tx and rework API\ntype Multi struct {\n\tcommandable\n\n\tbase *baseClient\n\n\tcmds   []Cmder\n\tclosed bool\n}\n\n// Watch creates new transaction and marks the keys to be watched\n// for conditional execution of a transaction.\nfunc (c *Client) Watch(keys ...string) (*Multi, error) {\n\ttx := c.Multi()\n\tif err := tx.Watch(keys...).Err(); err != nil {\n\t\ttx.Close()\n\t\treturn nil, err\n\t}\n\treturn tx, nil\n}\n\n// Deprecated. Use Watch instead.\nfunc (c *Client) Multi() *Multi {\n\tmulti := &Multi{\n\t\tbase: &baseClient{\n\t\t\topt:      c.opt,\n\t\t\tconnPool: pool.NewStickyConnPool(c.connPool.(*pool.ConnPool), true),\n\t\t},\n\t}\n\tmulti.commandable.process = multi.process\n\treturn multi\n}\n\nfunc (c *Multi) process(cmd Cmder) {\n\tif c.cmds == nil {\n\t\tc.base.process(cmd)\n\t} else {\n\t\tc.cmds = append(c.cmds, cmd)\n\t}\n}\n\n// Close closes the client, releasing any open resources.\nfunc (c *Multi) Close() error {\n\tc.closed = true\n\tif err := c.Unwatch().Err(); err != nil {\n\t\tinternal.Logf(\"Unwatch failed: %s\", err)\n\t}\n\treturn c.base.Close()\n}\n\n// Watch marks the keys to be watched for conditional execution\n// of a transaction.\nfunc (c *Multi) Watch(keys ...string) *StatusCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"WATCH\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Unwatch flushes all the previously watched keys for a transaction.\nfunc (c *Multi) Unwatch(keys ...string) *StatusCmd {\n\targs := make([]interface{}, 1+len(keys))\n\targs[0] = \"UNWATCH\"\n\tfor i, key := range keys {\n\t\targs[1+i] = key\n\t}\n\tcmd := NewStatusCmd(args...)\n\tc.Process(cmd)\n\treturn cmd\n}\n\n// Discard discards queued commands.\nfunc (c *Multi) Discard() error {\n\tif c.cmds == nil {\n\t\treturn errDiscard\n\t}\n\tc.cmds = c.cmds[:1]\n\treturn nil\n}\n\n// Exec executes all previously queued commands in a transaction\n// and restores the connection state to normal.\n//\n// When using WATCH, EXEC will execute commands only if the watched keys\n// were not modified, allowing for a check-and-set mechanism.\n//\n// Exec always returns list of commands. If transaction fails\n// TxFailedErr is returned. Otherwise Exec returns error of the first\n// failed command or nil.\nfunc (c *Multi) Exec(f func() error) ([]Cmder, error) {\n\tif c.closed {\n\t\treturn nil, pool.ErrClosed\n\t}\n\n\tc.cmds = []Cmder{NewStatusCmd(\"MULTI\")}\n\tif err := f(); err != nil {\n\t\treturn nil, err\n\t}\n\tc.cmds = append(c.cmds, NewSliceCmd(\"EXEC\"))\n\n\tcmds := c.cmds\n\tc.cmds = nil\n\n\tif len(cmds) == 2 {\n\t\treturn []Cmder{}, nil\n\t}\n\n\t// Strip MULTI and EXEC commands.\n\tretCmds := cmds[1 : len(cmds)-1]\n\n\tcn, err := c.base.conn()\n\tif err != nil {\n\t\tsetCmdsErr(retCmds, err)\n\t\treturn retCmds, err\n\t}\n\n\terr = c.execCmds(cn, cmds)\n\tc.base.putConn(cn, err, false)\n\treturn retCmds, err\n}\n\nfunc (c *Multi) execCmds(cn *pool.Conn, cmds []Cmder) error {\n\terr := writeCmd(cn, cmds...)\n\tif err != nil {\n\t\tsetCmdsErr(cmds[1:len(cmds)-1], err)\n\t\treturn err\n\t}\n\n\tstatusCmd := NewStatusCmd()\n\n\t// Omit last command (EXEC).\n\tcmdsLen := len(cmds) - 1\n\n\t// Parse queued replies.\n\tfor i := 0; i < cmdsLen; i++ {\n\t\tif err := statusCmd.readReply(cn); err != nil {\n\t\t\tsetCmdsErr(cmds[1:len(cmds)-1], err)\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Parse number of replies.\n\tline, err := readLine(cn)\n\tif err != nil {\n\t\tif err == Nil {\n\t\t\terr = TxFailedErr\n\t\t}\n\t\tsetCmdsErr(cmds[1:len(cmds)-1], err)\n\t\treturn err\n\t}\n\tif line[0] != '*' {\n\t\terr := fmt.Errorf(\"redis: expected '*', but got line %q\", line)\n\t\tsetCmdsErr(cmds[1:len(cmds)-1], err)\n\t\treturn err\n\t}\n\n\tvar firstCmdErr error\n\n\t// Parse replies.\n\t// Loop starts from 1 to omit MULTI cmd.\n\tfor i := 1; i < cmdsLen; i++ {\n\t\tcmd := cmds[i]\n\t\tif err := cmd.readReply(cn); err != nil {\n\t\t\tif firstCmdErr == nil {\n\t\t\t\tfirstCmdErr = err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn firstCmdErr\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/options.go",
    "content": "package redis\n\nimport (\n\t\"net\"\n\t\"time\"\n\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\ntype Options struct {\n\t// The network type, either tcp or unix.\n\t// Default is tcp.\n\tNetwork string\n\t// host:port address.\n\tAddr string\n\n\t// Dialer creates new network connection and has priority over\n\t// Network and Addr options.\n\tDialer func() (net.Conn, error)\n\n\t// An optional password. Must match the password specified in the\n\t// requirepass server configuration option.\n\tPassword string\n\t// A database to be selected after connecting to server.\n\tDB int64\n\n\t// The maximum number of retries before giving up.\n\t// Default is to not retry failed commands.\n\tMaxRetries int\n\n\t// Sets the deadline for establishing new connections. If reached,\n\t// dial will fail with a timeout.\n\t// Default is 5 seconds.\n\tDialTimeout time.Duration\n\t// Sets the deadline for socket reads. If reached, commands will\n\t// fail with a timeout instead of blocking.\n\tReadTimeout time.Duration\n\t// Sets the deadline for socket writes. If reached, commands will\n\t// fail with a timeout instead of blocking.\n\tWriteTimeout time.Duration\n\n\t// The maximum number of socket connections.\n\t// Default is 10 connections.\n\tPoolSize int\n\t// Specifies amount of time client waits for connection if all\n\t// connections are busy before returning an error.\n\t// Default is 1 second.\n\tPoolTimeout time.Duration\n\t// Specifies amount of time after which client closes idle\n\t// connections. Should be less than server's timeout.\n\t// Default is to not close idle connections.\n\tIdleTimeout time.Duration\n\t// The frequency of idle checks.\n\t// Default is 1 minute.\n\tIdleCheckFrequency time.Duration\n}\n\nfunc (opt *Options) getNetwork() string {\n\tif opt.Network == \"\" {\n\t\treturn \"tcp\"\n\t}\n\treturn opt.Network\n}\n\nfunc (opt *Options) getDialer() func() (net.Conn, error) {\n\tif opt.Dialer != nil {\n\t\treturn opt.Dialer\n\t}\n\treturn func() (net.Conn, error) {\n\t\treturn net.DialTimeout(opt.getNetwork(), opt.Addr, opt.getDialTimeout())\n\t}\n}\n\nfunc (opt *Options) getPoolSize() int {\n\tif opt.PoolSize == 0 {\n\t\treturn 10\n\t}\n\treturn opt.PoolSize\n}\n\nfunc (opt *Options) getDialTimeout() time.Duration {\n\tif opt.DialTimeout == 0 {\n\t\treturn 5 * time.Second\n\t}\n\treturn opt.DialTimeout\n}\n\nfunc (opt *Options) getPoolTimeout() time.Duration {\n\tif opt.PoolTimeout == 0 {\n\t\treturn 1 * time.Second\n\t}\n\treturn opt.PoolTimeout\n}\n\nfunc (opt *Options) getIdleTimeout() time.Duration {\n\treturn opt.IdleTimeout\n}\n\nfunc (opt *Options) getIdleCheckFrequency() time.Duration {\n\tif opt.IdleCheckFrequency == 0 {\n\t\treturn time.Minute\n\t}\n\treturn opt.IdleCheckFrequency\n}\n\nfunc newConnPool(opt *Options) *pool.ConnPool {\n\treturn pool.NewConnPool(\n\t\topt.getDialer(),\n\t\topt.getPoolSize(),\n\t\topt.getPoolTimeout(),\n\t\topt.getIdleTimeout(),\n\t\topt.getIdleCheckFrequency(),\n\t)\n}\n\n// PoolStats contains pool state information and accumulated stats.\ntype PoolStats struct {\n\tRequests uint32 // number of times a connection was requested by the pool\n\tHits     uint32 // number of times free connection was found in the pool\n\tWaits    uint32 // number of times the pool had to wait for a connection\n\tTimeouts uint32 // number of times a wait timeout occurred\n\n\tTotalConns uint32 // the number of total connections in the pool\n\tFreeConns  uint32 // the number of free connections in the pool\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/parser.go",
    "content": "package redis\n\nimport (\n\t\"bufio\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"strconv\"\n\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\nconst (\n\terrorReply  = '-'\n\tstatusReply = '+'\n\tintReply    = ':'\n\tstringReply = '$'\n\tarrayReply  = '*'\n)\n\ntype multiBulkParser func(cn *pool.Conn, n int64) (interface{}, error)\n\nvar errEmptyReply = errors.New(\"redis: reply is empty\")\n\n//------------------------------------------------------------------------------\n\n// Copy of encoding.BinaryMarshaler.\ntype binaryMarshaler interface {\n\tMarshalBinary() (data []byte, err error)\n}\n\n// Copy of encoding.BinaryUnmarshaler.\ntype binaryUnmarshaler interface {\n\tUnmarshalBinary(data []byte) error\n}\n\nfunc appendString(b []byte, s string) []byte {\n\tb = append(b, '$')\n\tb = strconv.AppendUint(b, uint64(len(s)), 10)\n\tb = append(b, '\\r', '\\n')\n\tb = append(b, s...)\n\tb = append(b, '\\r', '\\n')\n\treturn b\n}\n\nfunc appendBytes(b, bb []byte) []byte {\n\tb = append(b, '$')\n\tb = strconv.AppendUint(b, uint64(len(bb)), 10)\n\tb = append(b, '\\r', '\\n')\n\tb = append(b, bb...)\n\tb = append(b, '\\r', '\\n')\n\treturn b\n}\n\nfunc appendArg(b []byte, val interface{}) ([]byte, error) {\n\tswitch v := val.(type) {\n\tcase nil:\n\t\tb = appendString(b, \"\")\n\tcase string:\n\t\tb = appendString(b, v)\n\tcase []byte:\n\t\tb = appendBytes(b, v)\n\tcase int:\n\t\tb = appendString(b, formatInt(int64(v)))\n\tcase int8:\n\t\tb = appendString(b, formatInt(int64(v)))\n\tcase int16:\n\t\tb = appendString(b, formatInt(int64(v)))\n\tcase int32:\n\t\tb = appendString(b, formatInt(int64(v)))\n\tcase int64:\n\t\tb = appendString(b, formatInt(v))\n\tcase uint:\n\t\tb = appendString(b, formatUint(uint64(v)))\n\tcase uint8:\n\t\tb = appendString(b, formatUint(uint64(v)))\n\tcase uint16:\n\t\tb = appendString(b, formatUint(uint64(v)))\n\tcase uint32:\n\t\tb = appendString(b, formatUint(uint64(v)))\n\tcase uint64:\n\t\tb = appendString(b, formatUint(v))\n\tcase float32:\n\t\tb = appendString(b, formatFloat(float64(v)))\n\tcase float64:\n\t\tb = appendString(b, formatFloat(v))\n\tcase bool:\n\t\tif v {\n\t\t\tb = appendString(b, \"1\")\n\t\t} else {\n\t\t\tb = appendString(b, \"0\")\n\t\t}\n\tdefault:\n\t\tif bm, ok := val.(binaryMarshaler); ok {\n\t\t\tbb, err := bm.MarshalBinary()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tb = appendBytes(b, bb)\n\t\t} else {\n\t\t\terr := fmt.Errorf(\n\t\t\t\t\"redis: can't marshal %T (consider implementing BinaryMarshaler)\", val)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn b, nil\n}\n\nfunc appendArgs(b []byte, args []interface{}) ([]byte, error) {\n\tb = append(b, arrayReply)\n\tb = strconv.AppendUint(b, uint64(len(args)), 10)\n\tb = append(b, '\\r', '\\n')\n\tfor _, arg := range args {\n\t\tvar err error\n\t\tb, err = appendArg(b, arg)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn b, nil\n}\n\nfunc scan(b []byte, val interface{}) error {\n\tswitch v := val.(type) {\n\tcase nil:\n\t\treturn errorf(\"redis: Scan(nil)\")\n\tcase *string:\n\t\t*v = bytesToString(b)\n\t\treturn nil\n\tcase *[]byte:\n\t\t*v = b\n\t\treturn nil\n\tcase *int:\n\t\tvar err error\n\t\t*v, err = strconv.Atoi(bytesToString(b))\n\t\treturn err\n\tcase *int8:\n\t\tn, err := strconv.ParseInt(bytesToString(b), 10, 8)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = int8(n)\n\t\treturn nil\n\tcase *int16:\n\t\tn, err := strconv.ParseInt(bytesToString(b), 10, 16)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = int16(n)\n\t\treturn nil\n\tcase *int32:\n\t\tn, err := strconv.ParseInt(bytesToString(b), 10, 16)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = int32(n)\n\t\treturn nil\n\tcase *int64:\n\t\tn, err := strconv.ParseInt(bytesToString(b), 10, 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = n\n\t\treturn nil\n\tcase *uint:\n\t\tn, err := strconv.ParseUint(bytesToString(b), 10, 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = uint(n)\n\t\treturn nil\n\tcase *uint8:\n\t\tn, err := strconv.ParseUint(bytesToString(b), 10, 8)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = uint8(n)\n\t\treturn nil\n\tcase *uint16:\n\t\tn, err := strconv.ParseUint(bytesToString(b), 10, 16)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = uint16(n)\n\t\treturn nil\n\tcase *uint32:\n\t\tn, err := strconv.ParseUint(bytesToString(b), 10, 32)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = uint32(n)\n\t\treturn nil\n\tcase *uint64:\n\t\tn, err := strconv.ParseUint(bytesToString(b), 10, 64)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = n\n\t\treturn nil\n\tcase *float32:\n\t\tn, err := strconv.ParseFloat(bytesToString(b), 32)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t*v = float32(n)\n\t\treturn err\n\tcase *float64:\n\t\tvar err error\n\t\t*v, err = strconv.ParseFloat(bytesToString(b), 64)\n\t\treturn err\n\tcase *bool:\n\t\t*v = len(b) == 1 && b[0] == '1'\n\t\treturn nil\n\tdefault:\n\t\tif bu, ok := val.(binaryUnmarshaler); ok {\n\t\t\treturn bu.UnmarshalBinary(b)\n\t\t}\n\t\terr := fmt.Errorf(\n\t\t\t\"redis: can't unmarshal %T (consider implementing BinaryUnmarshaler)\", val)\n\t\treturn err\n\t}\n}\n\n//------------------------------------------------------------------------------\n\nfunc readLine(cn *pool.Conn) ([]byte, error) {\n\tline, isPrefix, err := cn.Rd.ReadLine()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif isPrefix {\n\t\treturn nil, bufio.ErrBufferFull\n\t}\n\tif len(line) == 0 {\n\t\treturn nil, errEmptyReply\n\t}\n\tif isNilReply(line) {\n\t\treturn nil, Nil\n\t}\n\treturn line, nil\n}\n\nfunc isNilReply(b []byte) bool {\n\treturn len(b) == 3 &&\n\t\t(b[0] == stringReply || b[0] == arrayReply) &&\n\t\tb[1] == '-' && b[2] == '1'\n}\n\n//------------------------------------------------------------------------------\n\nfunc parseErrorReply(cn *pool.Conn, line []byte) error {\n\treturn errorf(string(line[1:]))\n}\n\nfunc parseStatusReply(cn *pool.Conn, line []byte) ([]byte, error) {\n\treturn line[1:], nil\n}\n\nfunc parseIntReply(cn *pool.Conn, line []byte) (int64, error) {\n\tn, err := strconv.ParseInt(bytesToString(line[1:]), 10, 64)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn n, nil\n}\n\nfunc readIntReply(cn *pool.Conn) (int64, error) {\n\tline, err := readLine(cn)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tswitch line[0] {\n\tcase errorReply:\n\t\treturn 0, parseErrorReply(cn, line)\n\tcase intReply:\n\t\treturn parseIntReply(cn, line)\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"redis: can't parse int reply: %.100q\", line)\n\t}\n}\n\nfunc parseBytesReply(cn *pool.Conn, line []byte) ([]byte, error) {\n\tif isNilReply(line) {\n\t\treturn nil, Nil\n\t}\n\n\treplyLen, err := strconv.Atoi(bytesToString(line[1:]))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tb, err := cn.ReadN(replyLen + 2)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn b[:replyLen], nil\n}\n\nfunc readBytesReply(cn *pool.Conn) ([]byte, error) {\n\tline, err := readLine(cn)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitch line[0] {\n\tcase errorReply:\n\t\treturn nil, parseErrorReply(cn, line)\n\tcase stringReply:\n\t\treturn parseBytesReply(cn, line)\n\tcase statusReply:\n\t\treturn parseStatusReply(cn, line)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"redis: can't parse string reply: %.100q\", line)\n\t}\n}\n\nfunc readStringReply(cn *pool.Conn) (string, error) {\n\tb, err := readBytesReply(cn)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(b), nil\n}\n\nfunc readFloatReply(cn *pool.Conn) (float64, error) {\n\tb, err := readBytesReply(cn)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn strconv.ParseFloat(bytesToString(b), 64)\n}\n\nfunc parseArrayHeader(cn *pool.Conn, line []byte) (int64, error) {\n\tif isNilReply(line) {\n\t\treturn 0, Nil\n\t}\n\n\tn, err := strconv.ParseInt(bytesToString(line[1:]), 10, 64)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn n, nil\n}\n\nfunc parseArrayReply(cn *pool.Conn, p multiBulkParser, line []byte) (interface{}, error) {\n\tn, err := parseArrayHeader(cn, line)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn p(cn, n)\n}\n\nfunc readArrayHeader(cn *pool.Conn) (int64, error) {\n\tline, err := readLine(cn)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tswitch line[0] {\n\tcase errorReply:\n\t\treturn 0, parseErrorReply(cn, line)\n\tcase arrayReply:\n\t\treturn parseArrayHeader(cn, line)\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"redis: can't parse array reply: %.100q\", line)\n\t}\n}\n\nfunc readArrayReply(cn *pool.Conn, p multiBulkParser) (interface{}, error) {\n\tline, err := readLine(cn)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitch line[0] {\n\tcase errorReply:\n\t\treturn nil, parseErrorReply(cn, line)\n\tcase arrayReply:\n\t\treturn parseArrayReply(cn, p, line)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"redis: can't parse array reply: %.100q\", line)\n\t}\n}\n\nfunc readReply(cn *pool.Conn, p multiBulkParser) (interface{}, error) {\n\tline, err := readLine(cn)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tswitch line[0] {\n\tcase errorReply:\n\t\treturn nil, parseErrorReply(cn, line)\n\tcase statusReply:\n\t\treturn parseStatusReply(cn, line)\n\tcase intReply:\n\t\treturn parseIntReply(cn, line)\n\tcase stringReply:\n\t\treturn parseBytesReply(cn, line)\n\tcase arrayReply:\n\t\treturn parseArrayReply(cn, p, line)\n\t}\n\treturn nil, fmt.Errorf(\"redis: can't parse %.100q\", line)\n}\n\nfunc readScanReply(cn *pool.Conn) ([]string, int64, error) {\n\tn, err := readArrayHeader(cn)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\tif n != 2 {\n\t\treturn nil, 0, fmt.Errorf(\"redis: got %d elements in scan reply, expected 2\", n)\n\t}\n\n\tb, err := readBytesReply(cn)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tcursor, err := strconv.ParseInt(bytesToString(b), 10, 64)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tn, err = readArrayHeader(cn)\n\tif err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tkeys := make([]string, n)\n\tfor i := int64(0); i < n; i++ {\n\t\tkey, err := readStringReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, 0, err\n\t\t}\n\t\tkeys[i] = key\n\t}\n\n\treturn keys, cursor, err\n}\n\nfunc sliceParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tvals := make([]interface{}, 0, n)\n\tfor i := int64(0); i < n; i++ {\n\t\tv, err := readReply(cn, sliceParser)\n\t\tif err == Nil {\n\t\t\tvals = append(vals, nil)\n\t\t} else if err != nil {\n\t\t\treturn nil, err\n\t\t} else {\n\t\t\tswitch vv := v.(type) {\n\t\t\tcase []byte:\n\t\t\t\tvals = append(vals, string(vv))\n\t\t\tdefault:\n\t\t\t\tvals = append(vals, v)\n\t\t\t}\n\t\t}\n\t}\n\treturn vals, nil\n}\n\nfunc intSliceParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tints := make([]int64, 0, n)\n\tfor i := int64(0); i < n; i++ {\n\t\tn, err := readIntReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tints = append(ints, n)\n\t}\n\treturn ints, nil\n}\n\nfunc boolSliceParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tbools := make([]bool, 0, n)\n\tfor i := int64(0); i < n; i++ {\n\t\tn, err := readIntReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tbools = append(bools, n == 1)\n\t}\n\treturn bools, nil\n}\n\nfunc stringSliceParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tss := make([]string, 0, n)\n\tfor i := int64(0); i < n; i++ {\n\t\ts, err := readStringReply(cn)\n\t\tif err == Nil {\n\t\t\tss = append(ss, \"\")\n\t\t} else if err != nil {\n\t\t\treturn nil, err\n\t\t} else {\n\t\t\tss = append(ss, s)\n\t\t}\n\t}\n\treturn ss, nil\n}\n\nfunc floatSliceParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tnn := make([]float64, 0, n)\n\tfor i := int64(0); i < n; i++ {\n\t\tn, err := readFloatReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tnn = append(nn, n)\n\t}\n\treturn nn, nil\n}\n\nfunc stringStringMapParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tm := make(map[string]string, n/2)\n\tfor i := int64(0); i < n; i += 2 {\n\t\tkey, err := readStringReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvalue, err := readStringReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tm[key] = value\n\t}\n\treturn m, nil\n}\n\nfunc stringIntMapParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tm := make(map[string]int64, n/2)\n\tfor i := int64(0); i < n; i += 2 {\n\t\tkey, err := readStringReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tn, err := readIntReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tm[key] = n\n\t}\n\treturn m, nil\n}\n\nfunc zSliceParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tzz := make([]Z, n/2)\n\tfor i := int64(0); i < n; i += 2 {\n\t\tvar err error\n\n\t\tz := &zz[i/2]\n\n\t\tz.Member, err = readStringReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tz.Score, err = readFloatReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn zz, nil\n}\n\nfunc clusterSlotInfoSliceParser(cn *pool.Conn, n int64) (interface{}, error) {\n\tinfos := make([]ClusterSlotInfo, 0, n)\n\tfor i := int64(0); i < n; i++ {\n\t\tn, err := readArrayHeader(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif n < 2 {\n\t\t\terr := fmt.Errorf(\"redis: got %d elements in cluster info, expected at least 2\", n)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tstart, err := readIntReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tend, err := readIntReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\taddrsn := n - 2\n\t\tinfo := ClusterSlotInfo{\n\t\t\tStart: int(start),\n\t\t\tEnd:   int(end),\n\t\t\tAddrs: make([]string, addrsn),\n\t\t}\n\n\t\tfor i := int64(0); i < addrsn; i++ {\n\t\t\tn, err := readArrayHeader(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif n != 2 && n != 3 {\n\t\t\t\terr := fmt.Errorf(\"got %d elements in cluster info address, expected 2 or 3\", n)\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tip, err := readStringReply(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tport, err := readIntReply(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tif n == 3 {\n\t\t\t\t// TODO: expose id in ClusterSlotInfo\n\t\t\t\t_, err := readStringReply(cn)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinfo.Addrs[i] = net.JoinHostPort(ip, strconv.FormatInt(port, 10))\n\t\t}\n\n\t\tinfos = append(infos, info)\n\t}\n\treturn infos, nil\n}\n\nfunc newGeoLocationParser(q *GeoRadiusQuery) multiBulkParser {\n\treturn func(cn *pool.Conn, n int64) (interface{}, error) {\n\t\tvar loc GeoLocation\n\n\t\tvar err error\n\t\tloc.Name, err = readStringReply(cn)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif q.WithDist {\n\t\t\tloc.Dist, err = readFloatReply(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tif q.WithGeoHash {\n\t\t\tloc.GeoHash, err = readIntReply(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t\tif q.WithCoord {\n\t\t\tn, err := readArrayHeader(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif n != 2 {\n\t\t\t\treturn nil, fmt.Errorf(\"got %d coordinates, expected 2\", n)\n\t\t\t}\n\n\t\t\tloc.Longitude, err = readFloatReply(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tloc.Latitude, err = readFloatReply(cn)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\n\t\treturn &loc, nil\n\t}\n}\n\nfunc newGeoLocationSliceParser(q *GeoRadiusQuery) multiBulkParser {\n\treturn func(cn *pool.Conn, n int64) (interface{}, error) {\n\t\tlocs := make([]GeoLocation, 0, n)\n\t\tfor i := int64(0); i < n; i++ {\n\t\t\tv, err := readReply(cn, newGeoLocationParser(q))\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tswitch vv := v.(type) {\n\t\t\tcase []byte:\n\t\t\t\tlocs = append(locs, GeoLocation{\n\t\t\t\t\tName: string(vv),\n\t\t\t\t})\n\t\t\tcase *GeoLocation:\n\t\t\t\tlocs = append(locs, *vv)\n\t\t\tdefault:\n\t\t\t\treturn nil, fmt.Errorf(\"got %T, expected string or *GeoLocation\", v)\n\t\t\t}\n\t\t}\n\t\treturn locs, nil\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/pipeline.go",
    "content": "package redis\n\nimport (\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\n// Pipeline implements pipelining as described in\n// http://redis.io/topics/pipelining. It's safe for concurrent use\n// by multiple goroutines.\ntype Pipeline struct {\n\tcommandable\n\n\tclient baseClient\n\n\tmu   sync.Mutex // protects cmds\n\tcmds []Cmder\n\n\tclosed int32\n}\n\nfunc (c *Client) Pipeline() *Pipeline {\n\tpipe := &Pipeline{\n\t\tclient: c.baseClient,\n\t\tcmds:   make([]Cmder, 0, 10),\n\t}\n\tpipe.commandable.process = pipe.process\n\treturn pipe\n}\n\nfunc (c *Client) Pipelined(fn func(*Pipeline) error) ([]Cmder, error) {\n\tpipe := c.Pipeline()\n\tif err := fn(pipe); err != nil {\n\t\treturn nil, err\n\t}\n\tcmds, err := pipe.Exec()\n\t_ = pipe.Close()\n\treturn cmds, err\n}\n\nfunc (pipe *Pipeline) process(cmd Cmder) {\n\tpipe.mu.Lock()\n\tpipe.cmds = append(pipe.cmds, cmd)\n\tpipe.mu.Unlock()\n}\n\n// Close closes the pipeline, releasing any open resources.\nfunc (pipe *Pipeline) Close() error {\n\tatomic.StoreInt32(&pipe.closed, 1)\n\tpipe.Discard()\n\treturn nil\n}\n\nfunc (pipe *Pipeline) isClosed() bool {\n\treturn atomic.LoadInt32(&pipe.closed) == 1\n}\n\n// Discard resets the pipeline and discards queued commands.\nfunc (pipe *Pipeline) Discard() error {\n\tdefer pipe.mu.Unlock()\n\tpipe.mu.Lock()\n\tif pipe.isClosed() {\n\t\treturn pool.ErrClosed\n\t}\n\tpipe.cmds = pipe.cmds[:0]\n\treturn nil\n}\n\n// Exec executes all previously queued commands using one\n// client-server roundtrip.\n//\n// Exec always returns list of commands and error of the first failed\n// command if any.\nfunc (pipe *Pipeline) Exec() (cmds []Cmder, retErr error) {\n\tif pipe.isClosed() {\n\t\treturn nil, pool.ErrClosed\n\t}\n\n\tdefer pipe.mu.Unlock()\n\tpipe.mu.Lock()\n\n\tif len(pipe.cmds) == 0 {\n\t\treturn pipe.cmds, nil\n\t}\n\n\tcmds = pipe.cmds\n\tpipe.cmds = make([]Cmder, 0, 10)\n\n\tfailedCmds := cmds\n\tfor i := 0; i <= pipe.client.opt.MaxRetries; i++ {\n\t\tcn, err := pipe.client.conn()\n\t\tif err != nil {\n\t\t\tsetCmdsErr(failedCmds, err)\n\t\t\treturn cmds, err\n\t\t}\n\n\t\tif i > 0 {\n\t\t\tresetCmds(failedCmds)\n\t\t}\n\t\tfailedCmds, err = execCmds(cn, failedCmds)\n\t\tpipe.client.putConn(cn, err, false)\n\t\tif err != nil && retErr == nil {\n\t\t\tretErr = err\n\t\t}\n\t\tif len(failedCmds) == 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn cmds, retErr\n}\n\nfunc execCmds(cn *pool.Conn, cmds []Cmder) ([]Cmder, error) {\n\tif err := writeCmd(cn, cmds...); err != nil {\n\t\tsetCmdsErr(cmds, err)\n\t\treturn cmds, err\n\t}\n\n\tvar firstCmdErr error\n\tvar failedCmds []Cmder\n\tfor _, cmd := range cmds {\n\t\terr := cmd.readReply(cn)\n\t\tif err == nil {\n\t\t\tcontinue\n\t\t}\n\t\tif firstCmdErr == nil {\n\t\t\tfirstCmdErr = err\n\t\t}\n\t\tif shouldRetry(err) {\n\t\t\tfailedCmds = append(failedCmds, cmd)\n\t\t}\n\t}\n\n\treturn failedCmds, firstCmdErr\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/pubsub.go",
    "content": "package redis\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n\n\t\"gopkg.in/redis.v3/internal\"\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\n// Posts a message to the given channel.\nfunc (c *Client) Publish(channel, message string) *IntCmd {\n\treq := NewIntCmd(\"PUBLISH\", channel, message)\n\tc.Process(req)\n\treturn req\n}\n\n// PubSub implements Pub/Sub commands as described in\n// http://redis.io/topics/pubsub. It's NOT safe for concurrent use by\n// multiple goroutines.\ntype PubSub struct {\n\tbase *baseClient\n\n\tchannels []string\n\tpatterns []string\n\n\tnsub int // number of active subscriptions\n}\n\n// Deprecated. Use Subscribe/PSubscribe instead.\nfunc (c *Client) PubSub() *PubSub {\n\treturn &PubSub{\n\t\tbase: &baseClient{\n\t\t\topt:      c.opt,\n\t\t\tconnPool: pool.NewStickyConnPool(c.connPool.(*pool.ConnPool), false),\n\t\t},\n\t}\n}\n\n// Subscribes the client to the specified channels.\nfunc (c *Client) Subscribe(channels ...string) (*PubSub, error) {\n\tpubsub := c.PubSub()\n\treturn pubsub, pubsub.Subscribe(channels...)\n}\n\n// Subscribes the client to the given patterns.\nfunc (c *Client) PSubscribe(channels ...string) (*PubSub, error) {\n\tpubsub := c.PubSub()\n\treturn pubsub, pubsub.PSubscribe(channels...)\n}\n\nfunc (c *PubSub) subscribe(redisCmd string, channels ...string) error {\n\tcn, err := c.base.conn()\n\tif err != nil {\n\t\treturn err\n\t}\n\tc.putConn(cn, err)\n\n\targs := make([]interface{}, 1+len(channels))\n\targs[0] = redisCmd\n\tfor i, channel := range channels {\n\t\targs[1+i] = channel\n\t}\n\tcmd := NewSliceCmd(args...)\n\n\treturn writeCmd(cn, cmd)\n}\n\n// Subscribes the client to the specified channels.\nfunc (c *PubSub) Subscribe(channels ...string) error {\n\terr := c.subscribe(\"SUBSCRIBE\", channels...)\n\tif err == nil {\n\t\tc.channels = append(c.channels, channels...)\n\t\tc.nsub += len(channels)\n\t}\n\treturn err\n}\n\n// Subscribes the client to the given patterns.\nfunc (c *PubSub) PSubscribe(patterns ...string) error {\n\terr := c.subscribe(\"PSUBSCRIBE\", patterns...)\n\tif err == nil {\n\t\tc.patterns = append(c.patterns, patterns...)\n\t\tc.nsub += len(patterns)\n\t}\n\treturn err\n}\n\nfunc remove(ss []string, es ...string) []string {\n\tif len(es) == 0 {\n\t\treturn ss[:0]\n\t}\n\tfor _, e := range es {\n\t\tfor i, s := range ss {\n\t\t\tif s == e {\n\t\t\t\tss = append(ss[:i], ss[i+1:]...)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\treturn ss\n}\n\n// Unsubscribes the client from the given channels, or from all of\n// them if none is given.\nfunc (c *PubSub) Unsubscribe(channels ...string) error {\n\terr := c.subscribe(\"UNSUBSCRIBE\", channels...)\n\tif err == nil {\n\t\tc.channels = remove(c.channels, channels...)\n\t}\n\treturn err\n}\n\n// Unsubscribes the client from the given patterns, or from all of\n// them if none is given.\nfunc (c *PubSub) PUnsubscribe(patterns ...string) error {\n\terr := c.subscribe(\"PUNSUBSCRIBE\", patterns...)\n\tif err == nil {\n\t\tc.patterns = remove(c.patterns, patterns...)\n\t}\n\treturn err\n}\n\nfunc (c *PubSub) Close() error {\n\treturn c.base.Close()\n}\n\nfunc (c *PubSub) Ping(payload string) error {\n\tcn, err := c.base.conn()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\targs := []interface{}{\"PING\"}\n\tif payload != \"\" {\n\t\targs = append(args, payload)\n\t}\n\tcmd := NewCmd(args...)\n\treturn writeCmd(cn, cmd)\n}\n\n// Message received after a successful subscription to channel.\ntype Subscription struct {\n\t// Can be \"subscribe\", \"unsubscribe\", \"psubscribe\" or \"punsubscribe\".\n\tKind string\n\t// Channel name we have subscribed to.\n\tChannel string\n\t// Number of channels we are currently subscribed to.\n\tCount int\n}\n\nfunc (m *Subscription) String() string {\n\treturn fmt.Sprintf(\"%s: %s\", m.Kind, m.Channel)\n}\n\n// Message received as result of a PUBLISH command issued by another client.\ntype Message struct {\n\tChannel string\n\tPattern string\n\tPayload string\n}\n\nfunc (m *Message) String() string {\n\treturn fmt.Sprintf(\"Message<%s: %s>\", m.Channel, m.Payload)\n}\n\n// TODO: remove PMessage if favor of Message\n\n// Message matching a pattern-matching subscription received as result\n// of a PUBLISH command issued by another client.\ntype PMessage struct {\n\tChannel string\n\tPattern string\n\tPayload string\n}\n\nfunc (m *PMessage) String() string {\n\treturn fmt.Sprintf(\"PMessage<%s: %s>\", m.Channel, m.Payload)\n}\n\n// Pong received as result of a PING command issued by another client.\ntype Pong struct {\n\tPayload string\n}\n\nfunc (p *Pong) String() string {\n\tif p.Payload != \"\" {\n\t\treturn fmt.Sprintf(\"Pong<%s>\", p.Payload)\n\t}\n\treturn \"Pong\"\n}\n\nfunc (c *PubSub) newMessage(reply []interface{}) (interface{}, error) {\n\tswitch kind := reply[0].(string); kind {\n\tcase \"subscribe\", \"unsubscribe\", \"psubscribe\", \"punsubscribe\":\n\t\treturn &Subscription{\n\t\t\tKind:    kind,\n\t\t\tChannel: reply[1].(string),\n\t\t\tCount:   int(reply[2].(int64)),\n\t\t}, nil\n\tcase \"message\":\n\t\treturn &Message{\n\t\t\tChannel: reply[1].(string),\n\t\t\tPayload: reply[2].(string),\n\t\t}, nil\n\tcase \"pmessage\":\n\t\treturn &PMessage{\n\t\t\tPattern: reply[1].(string),\n\t\t\tChannel: reply[2].(string),\n\t\t\tPayload: reply[3].(string),\n\t\t}, nil\n\tcase \"pong\":\n\t\treturn &Pong{\n\t\t\tPayload: reply[1].(string),\n\t\t}, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"redis: unsupported pubsub notification: %q\", kind)\n\t}\n}\n\n// ReceiveTimeout acts like Receive but returns an error if message\n// is not received in time. This is low-level API and most clients\n// should use ReceiveMessage.\nfunc (c *PubSub) ReceiveTimeout(timeout time.Duration) (interface{}, error) {\n\tif c.nsub == 0 {\n\t\tc.resubscribe()\n\t}\n\n\tcn, err := c.base.conn()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcn.ReadTimeout = timeout\n\n\tcmd := NewSliceCmd()\n\terr = cmd.readReply(cn)\n\tc.putConn(cn, err)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn c.newMessage(cmd.Val())\n}\n\n// Receive returns a message as a Subscription, Message, PMessage,\n// Pong or error. See PubSub example for details. This is low-level\n// API and most clients should use ReceiveMessage.\nfunc (c *PubSub) Receive() (interface{}, error) {\n\treturn c.ReceiveTimeout(0)\n}\n\n// ReceiveMessage returns a Message or error ignoring Subscription or Pong\n// messages. It automatically reconnects to Redis Server and resubscribes\n// to channels in case of network errors.\nfunc (c *PubSub) ReceiveMessage() (*Message, error) {\n\treturn c.receiveMessage(5 * time.Second)\n}\n\nfunc (c *PubSub) receiveMessage(timeout time.Duration) (*Message, error) {\n\tvar errNum uint\n\tfor {\n\t\tmsgi, err := c.ReceiveTimeout(timeout)\n\t\tif err != nil {\n\t\t\tif !isNetworkError(err) {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\terrNum++\n\t\t\tif errNum < 3 {\n\t\t\t\tif netErr, ok := err.(net.Error); ok && netErr.Timeout() {\n\t\t\t\t\terr := c.Ping(\"\")\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tinternal.Logf(\"PubSub.Ping failed: %s\", err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 3 consequent errors - connection is bad\n\t\t\t\t// and/or Redis Server is down.\n\t\t\t\t// Sleep to not exceed max number of open connections.\n\t\t\t\ttime.Sleep(time.Second)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// Reset error number, because we received a message.\n\t\terrNum = 0\n\n\t\tswitch msg := msgi.(type) {\n\t\tcase *Subscription:\n\t\t\t// Ignore.\n\t\tcase *Pong:\n\t\t\t// Ignore.\n\t\tcase *Message:\n\t\t\treturn msg, nil\n\t\tcase *PMessage:\n\t\t\treturn &Message{\n\t\t\t\tChannel: msg.Channel,\n\t\t\t\tPattern: msg.Pattern,\n\t\t\t\tPayload: msg.Payload,\n\t\t\t}, nil\n\t\tdefault:\n\t\t\treturn nil, fmt.Errorf(\"redis: unknown message: %T\", msgi)\n\t\t}\n\t}\n}\n\nfunc (c *PubSub) putConn(cn *pool.Conn, err error) {\n\tif !c.base.putConn(cn, err, true) {\n\t\tc.nsub = 0\n\t}\n}\n\nfunc (c *PubSub) resubscribe() {\n\tif c.base.closed() {\n\t\treturn\n\t}\n\tif len(c.channels) > 0 {\n\t\tif err := c.Subscribe(c.channels...); err != nil {\n\t\t\tinternal.Logf(\"Subscribe failed: %s\", err)\n\t\t}\n\t}\n\tif len(c.patterns) > 0 {\n\t\tif err := c.PSubscribe(c.patterns...); err != nil {\n\t\t\tinternal.Logf(\"PSubscribe failed: %s\", err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/redis.go",
    "content": "package redis // import \"gopkg.in/redis.v3\"\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"gopkg.in/redis.v3/internal\"\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\nvar Logger *log.Logger\n\nfunc SetLogger(logger *log.Logger) {\n\tinternal.Logger = logger\n}\n\ntype baseClient struct {\n\tconnPool pool.Pooler\n\topt      *Options\n\n\tonClose func() error // hook called when client is closed\n}\n\nfunc (c *baseClient) String() string {\n\treturn fmt.Sprintf(\"Redis<%s db:%d>\", c.opt.Addr, c.opt.DB)\n}\n\nfunc (c *baseClient) conn() (*pool.Conn, error) {\n\tcn, err := c.connPool.Get()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif !cn.Inited {\n\t\tif err := c.initConn(cn); err != nil {\n\t\t\t_ = c.connPool.Remove(cn, err)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn cn, err\n}\n\nfunc (c *baseClient) putConn(cn *pool.Conn, err error, allowTimeout bool) bool {\n\tif isBadConn(err, allowTimeout) {\n\t\t_ = c.connPool.Remove(cn, err)\n\t\treturn false\n\t}\n\n\t_ = c.connPool.Put(cn)\n\treturn true\n}\n\nfunc (c *baseClient) initConn(cn *pool.Conn) error {\n\tcn.Inited = true\n\n\tif c.opt.Password == \"\" && c.opt.DB == 0 {\n\t\treturn nil\n\t}\n\n\t// Temp client for Auth and Select.\n\tclient := newClient(c.opt, pool.NewSingleConnPool(cn))\n\n\tif c.opt.Password != \"\" {\n\t\tif err := client.Auth(c.opt.Password).Err(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif c.opt.DB > 0 {\n\t\tif err := client.Select(c.opt.DB).Err(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (c *baseClient) process(cmd Cmder) {\n\tfor i := 0; i <= c.opt.MaxRetries; i++ {\n\t\tif i > 0 {\n\t\t\tcmd.reset()\n\t\t}\n\n\t\tcn, err := c.conn()\n\t\tif err != nil {\n\t\t\tcmd.setErr(err)\n\t\t\treturn\n\t\t}\n\n\t\treadTimeout := cmd.readTimeout()\n\t\tif readTimeout != nil {\n\t\t\tcn.ReadTimeout = *readTimeout\n\t\t} else {\n\t\t\tcn.ReadTimeout = c.opt.ReadTimeout\n\t\t}\n\t\tcn.WriteTimeout = c.opt.WriteTimeout\n\n\t\tif err := writeCmd(cn, cmd); err != nil {\n\t\t\tc.putConn(cn, err, false)\n\t\t\tcmd.setErr(err)\n\t\t\tif err != nil && shouldRetry(err) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\terr = cmd.readReply(cn)\n\t\tc.putConn(cn, err, readTimeout != nil)\n\t\tif err != nil && shouldRetry(err) {\n\t\t\tcontinue\n\t\t}\n\n\t\treturn\n\t}\n}\n\nfunc (c *baseClient) closed() bool {\n\treturn c.connPool.Closed()\n}\n\n// Close closes the client, releasing any open resources.\n//\n// It is rare to Close a Client, as the Client is meant to be\n// long-lived and shared between many goroutines.\nfunc (c *baseClient) Close() error {\n\tvar retErr error\n\tif c.onClose != nil {\n\t\tif err := c.onClose(); err != nil && retErr == nil {\n\t\t\tretErr = err\n\t\t}\n\t}\n\tif err := c.connPool.Close(); err != nil && retErr == nil {\n\t\tretErr = err\n\t}\n\treturn retErr\n}\n\n//------------------------------------------------------------------------------\n\n// Client is a Redis client representing a pool of zero or more\n// underlying connections. It's safe for concurrent use by multiple\n// goroutines.\ntype Client struct {\n\tbaseClient\n\tcommandable\n}\n\nfunc newClient(opt *Options, pool pool.Pooler) *Client {\n\tbase := baseClient{opt: opt, connPool: pool}\n\treturn &Client{\n\t\tbaseClient: base,\n\t\tcommandable: commandable{\n\t\t\tprocess: base.process,\n\t\t},\n\t}\n}\n\n// NewClient returns a client to the Redis Server specified by Options.\nfunc NewClient(opt *Options) *Client {\n\treturn newClient(opt, newConnPool(opt))\n}\n\n// PoolStats returns connection pool stats.\nfunc (c *Client) PoolStats() *PoolStats {\n\ts := c.connPool.Stats()\n\treturn &PoolStats{\n\t\tRequests: s.Requests,\n\t\tHits:     s.Hits,\n\t\tWaits:    s.Waits,\n\t\tTimeouts: s.Timeouts,\n\n\t\tTotalConns: s.TotalConns,\n\t\tFreeConns:  s.FreeConns,\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/ring.go",
    "content": "package redis\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gopkg.in/redis.v3/internal\"\n\t\"gopkg.in/redis.v3/internal/consistenthash\"\n\t\"gopkg.in/redis.v3/internal/hashtag\"\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\nvar (\n\terrRingShardsDown = errors.New(\"redis: all ring shards are down\")\n)\n\n// RingOptions are used to configure a ring client and should be\n// passed to NewRing.\ntype RingOptions struct {\n\t// A map of name => host:port addresses of ring shards.\n\tAddrs map[string]string\n\n\t// Following options are copied from Options struct.\n\n\tDB       int64\n\tPassword string\n\n\tMaxRetries int\n\n\tDialTimeout  time.Duration\n\tReadTimeout  time.Duration\n\tWriteTimeout time.Duration\n\n\tPoolSize           int\n\tPoolTimeout        time.Duration\n\tIdleTimeout        time.Duration\n\tIdleCheckFrequency time.Duration\n}\n\nfunc (opt *RingOptions) clientOptions() *Options {\n\treturn &Options{\n\t\tDB:       opt.DB,\n\t\tPassword: opt.Password,\n\n\t\tDialTimeout:  opt.DialTimeout,\n\t\tReadTimeout:  opt.ReadTimeout,\n\t\tWriteTimeout: opt.WriteTimeout,\n\n\t\tPoolSize:           opt.PoolSize,\n\t\tPoolTimeout:        opt.PoolTimeout,\n\t\tIdleTimeout:        opt.IdleTimeout,\n\t\tIdleCheckFrequency: opt.IdleCheckFrequency,\n\t}\n}\n\ntype ringShard struct {\n\tClient *Client\n\tdown   int\n}\n\nfunc (shard *ringShard) String() string {\n\tvar state string\n\tif shard.IsUp() {\n\t\tstate = \"up\"\n\t} else {\n\t\tstate = \"down\"\n\t}\n\treturn fmt.Sprintf(\"%s is %s\", shard.Client, state)\n}\n\nfunc (shard *ringShard) IsDown() bool {\n\tconst threshold = 5\n\treturn shard.down >= threshold\n}\n\nfunc (shard *ringShard) IsUp() bool {\n\treturn !shard.IsDown()\n}\n\n// Vote votes to set shard state and returns true if state was changed.\nfunc (shard *ringShard) Vote(up bool) bool {\n\tif up {\n\t\tchanged := shard.IsDown()\n\t\tshard.down = 0\n\t\treturn changed\n\t}\n\n\tif shard.IsDown() {\n\t\treturn false\n\t}\n\n\tshard.down++\n\treturn shard.IsDown()\n}\n\n// Ring is a Redis client that uses constistent hashing to distribute\n// keys across multiple Redis servers (shards). It's safe for\n// concurrent use by multiple goroutines.\n//\n// Ring monitors the state of each shard and removes dead shards from\n// the ring. When shard comes online it is added back to the ring. This\n// gives you maximum availability and partition tolerance, but no\n// consistency between different shards or even clients. Each client\n// uses shards that are available to the client and does not do any\n// coordination when shard state is changed.\n//\n// Ring should be used when you use multiple Redis servers for caching\n// and can tolerate losing data when one of the servers dies.\n// Otherwise you should use Redis Cluster.\ntype Ring struct {\n\tcommandable\n\n\topt       *RingOptions\n\tnreplicas int\n\n\tmx     sync.RWMutex\n\thash   *consistenthash.Map\n\tshards map[string]*ringShard\n\n\tclosed bool\n}\n\nfunc NewRing(opt *RingOptions) *Ring {\n\tconst nreplicas = 100\n\tring := &Ring{\n\t\topt:       opt,\n\t\tnreplicas: nreplicas,\n\n\t\thash:   consistenthash.New(nreplicas, nil),\n\t\tshards: make(map[string]*ringShard),\n\t}\n\tring.commandable.process = ring.process\n\tfor name, addr := range opt.Addrs {\n\t\tclopt := opt.clientOptions()\n\t\tclopt.Addr = addr\n\t\tring.addClient(name, NewClient(clopt))\n\t}\n\tgo ring.heartbeat()\n\treturn ring\n}\n\nfunc (ring *Ring) addClient(name string, cl *Client) {\n\tring.mx.Lock()\n\tring.hash.Add(name)\n\tring.shards[name] = &ringShard{Client: cl}\n\tring.mx.Unlock()\n}\n\nfunc (ring *Ring) getClient(key string) (*Client, error) {\n\tring.mx.RLock()\n\n\tif ring.closed {\n\t\treturn nil, pool.ErrClosed\n\t}\n\n\tname := ring.hash.Get(hashtag.Key(key))\n\tif name == \"\" {\n\t\tring.mx.RUnlock()\n\t\treturn nil, errRingShardsDown\n\t}\n\n\tcl := ring.shards[name].Client\n\tring.mx.RUnlock()\n\treturn cl, nil\n}\n\nfunc (ring *Ring) process(cmd Cmder) {\n\tcl, err := ring.getClient(cmd.clusterKey())\n\tif err != nil {\n\t\tcmd.setErr(err)\n\t\treturn\n\t}\n\tcl.baseClient.process(cmd)\n}\n\n// rebalance removes dead shards from the ring.\nfunc (ring *Ring) rebalance() {\n\tdefer ring.mx.Unlock()\n\tring.mx.Lock()\n\n\tring.hash = consistenthash.New(ring.nreplicas, nil)\n\tfor name, shard := range ring.shards {\n\t\tif shard.IsUp() {\n\t\t\tring.hash.Add(name)\n\t\t}\n\t}\n}\n\n// heartbeat monitors state of each shard in the ring.\nfunc (ring *Ring) heartbeat() {\n\tticker := time.NewTicker(100 * time.Millisecond)\n\tdefer ticker.Stop()\n\tfor _ = range ticker.C {\n\t\tvar rebalance bool\n\n\t\tring.mx.RLock()\n\n\t\tif ring.closed {\n\t\t\tring.mx.RUnlock()\n\t\t\tbreak\n\t\t}\n\n\t\tfor _, shard := range ring.shards {\n\t\t\terr := shard.Client.Ping().Err()\n\t\t\tif shard.Vote(err == nil || err == pool.ErrPoolTimeout) {\n\t\t\t\tinternal.Logf(\"ring shard state changed: %s\", shard)\n\t\t\t\trebalance = true\n\t\t\t}\n\t\t}\n\n\t\tring.mx.RUnlock()\n\n\t\tif rebalance {\n\t\t\tring.rebalance()\n\t\t}\n\t}\n}\n\n// Close closes the ring client, releasing any open resources.\n//\n// It is rare to Close a Ring, as the Ring is meant to be long-lived\n// and shared between many goroutines.\nfunc (ring *Ring) Close() (retErr error) {\n\tdefer ring.mx.Unlock()\n\tring.mx.Lock()\n\n\tif ring.closed {\n\t\treturn nil\n\t}\n\tring.closed = true\n\n\tfor _, shard := range ring.shards {\n\t\tif err := shard.Client.Close(); err != nil {\n\t\t\tretErr = err\n\t\t}\n\t}\n\tring.hash = nil\n\tring.shards = nil\n\n\treturn retErr\n}\n\n// RingPipeline creates a new pipeline which is able to execute commands\n// against multiple shards. It's NOT safe for concurrent use by\n// multiple goroutines.\ntype RingPipeline struct {\n\tcommandable\n\n\tring *Ring\n\n\tcmds   []Cmder\n\tclosed bool\n}\n\nfunc (ring *Ring) Pipeline() *RingPipeline {\n\tpipe := &RingPipeline{\n\t\tring: ring,\n\t\tcmds: make([]Cmder, 0, 10),\n\t}\n\tpipe.commandable.process = pipe.process\n\treturn pipe\n}\n\nfunc (ring *Ring) Pipelined(fn func(*RingPipeline) error) ([]Cmder, error) {\n\tpipe := ring.Pipeline()\n\tif err := fn(pipe); err != nil {\n\t\treturn nil, err\n\t}\n\tcmds, err := pipe.Exec()\n\tpipe.Close()\n\treturn cmds, err\n}\n\nfunc (pipe *RingPipeline) process(cmd Cmder) {\n\tpipe.cmds = append(pipe.cmds, cmd)\n}\n\n// Discard resets the pipeline and discards queued commands.\nfunc (pipe *RingPipeline) Discard() error {\n\tif pipe.closed {\n\t\treturn pool.ErrClosed\n\t}\n\tpipe.cmds = pipe.cmds[:0]\n\treturn nil\n}\n\n// Exec always returns list of commands and error of the first failed\n// command if any.\nfunc (pipe *RingPipeline) Exec() (cmds []Cmder, retErr error) {\n\tif pipe.closed {\n\t\treturn nil, pool.ErrClosed\n\t}\n\tif len(pipe.cmds) == 0 {\n\t\treturn pipe.cmds, nil\n\t}\n\n\tcmds = pipe.cmds\n\tpipe.cmds = make([]Cmder, 0, 10)\n\n\tcmdsMap := make(map[string][]Cmder)\n\tfor _, cmd := range cmds {\n\t\tname := pipe.ring.hash.Get(hashtag.Key(cmd.clusterKey()))\n\t\tif name == \"\" {\n\t\t\tcmd.setErr(errRingShardsDown)\n\t\t\tif retErr == nil {\n\t\t\t\tretErr = errRingShardsDown\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tcmdsMap[name] = append(cmdsMap[name], cmd)\n\t}\n\n\tfor i := 0; i <= pipe.ring.opt.MaxRetries; i++ {\n\t\tfailedCmdsMap := make(map[string][]Cmder)\n\n\t\tfor name, cmds := range cmdsMap {\n\t\t\tclient := pipe.ring.shards[name].Client\n\t\t\tcn, err := client.conn()\n\t\t\tif err != nil {\n\t\t\t\tsetCmdsErr(cmds, err)\n\t\t\t\tif retErr == nil {\n\t\t\t\t\tretErr = err\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif i > 0 {\n\t\t\t\tresetCmds(cmds)\n\t\t\t}\n\t\t\tfailedCmds, err := execCmds(cn, cmds)\n\t\t\tclient.putConn(cn, err, false)\n\t\t\tif err != nil && retErr == nil {\n\t\t\t\tretErr = err\n\t\t\t}\n\t\t\tif len(failedCmds) > 0 {\n\t\t\t\tfailedCmdsMap[name] = failedCmds\n\t\t\t}\n\t\t}\n\n\t\tif len(failedCmdsMap) == 0 {\n\t\t\tbreak\n\t\t}\n\t\tcmdsMap = failedCmdsMap\n\t}\n\n\treturn cmds, retErr\n}\n\n// Close closes the pipeline, releasing any open resources.\nfunc (pipe *RingPipeline) Close() error {\n\tpipe.Discard()\n\tpipe.closed = true\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/safe.go",
    "content": "// +build appengine\n\npackage redis\n\nfunc bytesToString(b []byte) string {\n\treturn string(b)\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/script.go",
    "content": "package redis\n\nimport (\n\t\"crypto/sha1\"\n\t\"encoding/hex\"\n\t\"io\"\n\t\"strings\"\n)\n\ntype scripter interface {\n\tEval(script string, keys []string, args []string) *Cmd\n\tEvalSha(sha1 string, keys []string, args []string) *Cmd\n\tScriptExists(scripts ...string) *BoolSliceCmd\n\tScriptLoad(script string) *StringCmd\n}\n\ntype Script struct {\n\tsrc, hash string\n}\n\nfunc NewScript(src string) *Script {\n\th := sha1.New()\n\tio.WriteString(h, src)\n\treturn &Script{\n\t\tsrc:  src,\n\t\thash: hex.EncodeToString(h.Sum(nil)),\n\t}\n}\n\nfunc (s *Script) Load(c scripter) *StringCmd {\n\treturn c.ScriptLoad(s.src)\n}\n\nfunc (s *Script) Exists(c scripter) *BoolSliceCmd {\n\treturn c.ScriptExists(s.src)\n}\n\nfunc (s *Script) Eval(c scripter, keys []string, args []string) *Cmd {\n\treturn c.Eval(s.src, keys, args)\n}\n\nfunc (s *Script) EvalSha(c scripter, keys []string, args []string) *Cmd {\n\treturn c.EvalSha(s.hash, keys, args)\n}\n\nfunc (s *Script) Run(c scripter, keys []string, args []string) *Cmd {\n\tr := s.EvalSha(c, keys, args)\n\tif err := r.Err(); err != nil && strings.HasPrefix(err.Error(), \"NOSCRIPT \") {\n\t\treturn s.Eval(c, keys, args)\n\t}\n\treturn r\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/sentinel.go",
    "content": "package redis\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"gopkg.in/redis.v3/internal\"\n\t\"gopkg.in/redis.v3/internal/pool\"\n)\n\n//------------------------------------------------------------------------------\n\n// FailoverOptions are used to configure a failover client and should\n// be passed to NewFailoverClient.\ntype FailoverOptions struct {\n\t// The master name.\n\tMasterName string\n\t// A seed list of host:port addresses of sentinel nodes.\n\tSentinelAddrs []string\n\n\t// Following options are copied from Options struct.\n\n\tPassword string\n\tDB       int64\n\n\tMaxRetries int\n\n\tDialTimeout  time.Duration\n\tReadTimeout  time.Duration\n\tWriteTimeout time.Duration\n\n\tPoolSize           int\n\tPoolTimeout        time.Duration\n\tIdleTimeout        time.Duration\n\tIdleCheckFrequency time.Duration\n}\n\nfunc (opt *FailoverOptions) options() *Options {\n\treturn &Options{\n\t\tAddr: \"FailoverClient\",\n\n\t\tDB:       opt.DB,\n\t\tPassword: opt.Password,\n\n\t\tMaxRetries: opt.MaxRetries,\n\n\t\tDialTimeout:  opt.DialTimeout,\n\t\tReadTimeout:  opt.ReadTimeout,\n\t\tWriteTimeout: opt.WriteTimeout,\n\n\t\tPoolSize:           opt.PoolSize,\n\t\tPoolTimeout:        opt.PoolTimeout,\n\t\tIdleTimeout:        opt.IdleTimeout,\n\t\tIdleCheckFrequency: opt.IdleCheckFrequency,\n\t}\n}\n\n// NewFailoverClient returns a Redis client that uses Redis Sentinel\n// for automatic failover. It's safe for concurrent use by multiple\n// goroutines.\nfunc NewFailoverClient(failoverOpt *FailoverOptions) *Client {\n\topt := failoverOpt.options()\n\tfailover := &sentinelFailover{\n\t\tmasterName:    failoverOpt.MasterName,\n\t\tsentinelAddrs: failoverOpt.SentinelAddrs,\n\n\t\topt: opt,\n\t}\n\tbase := baseClient{\n\t\topt:      opt,\n\t\tconnPool: failover.Pool(),\n\n\t\tonClose: func() error {\n\t\t\treturn failover.Close()\n\t\t},\n\t}\n\treturn &Client{\n\t\tbaseClient: base,\n\t\tcommandable: commandable{\n\t\t\tprocess: base.process,\n\t\t},\n\t}\n}\n\n//------------------------------------------------------------------------------\n\ntype sentinelClient struct {\n\tbaseClient\n\tcommandable\n}\n\nfunc newSentinel(opt *Options) *sentinelClient {\n\tbase := baseClient{\n\t\topt:      opt,\n\t\tconnPool: newConnPool(opt),\n\t}\n\treturn &sentinelClient{\n\t\tbaseClient:  base,\n\t\tcommandable: commandable{process: base.process},\n\t}\n}\n\nfunc (c *sentinelClient) PubSub() *PubSub {\n\treturn &PubSub{\n\t\tbase: &baseClient{\n\t\t\topt:      c.opt,\n\t\t\tconnPool: pool.NewStickyConnPool(c.connPool.(*pool.ConnPool), false),\n\t\t},\n\t}\n}\n\nfunc (c *sentinelClient) GetMasterAddrByName(name string) *StringSliceCmd {\n\tcmd := NewStringSliceCmd(\"SENTINEL\", \"get-master-addr-by-name\", name)\n\tc.Process(cmd)\n\treturn cmd\n}\n\nfunc (c *sentinelClient) Sentinels(name string) *SliceCmd {\n\tcmd := NewSliceCmd(\"SENTINEL\", \"sentinels\", name)\n\tc.Process(cmd)\n\treturn cmd\n}\n\ntype sentinelFailover struct {\n\tmasterName    string\n\tsentinelAddrs []string\n\n\topt *Options\n\n\tpool     *pool.ConnPool\n\tpoolOnce sync.Once\n\n\tmu       sync.RWMutex\n\tsentinel *sentinelClient\n}\n\nfunc (d *sentinelFailover) Close() error {\n\treturn d.resetSentinel()\n}\n\nfunc (d *sentinelFailover) dial() (net.Conn, error) {\n\taddr, err := d.MasterAddr()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn net.DialTimeout(\"tcp\", addr, d.opt.DialTimeout)\n}\n\nfunc (d *sentinelFailover) Pool() *pool.ConnPool {\n\td.poolOnce.Do(func() {\n\t\td.opt.Dialer = d.dial\n\t\td.pool = newConnPool(d.opt)\n\t})\n\treturn d.pool\n}\n\nfunc (d *sentinelFailover) MasterAddr() (string, error) {\n\tdefer d.mu.Unlock()\n\td.mu.Lock()\n\n\t// Try last working sentinel.\n\tif d.sentinel != nil {\n\t\taddr, err := d.sentinel.GetMasterAddrByName(d.masterName).Result()\n\t\tif err != nil {\n\t\t\tinternal.Logf(\"sentinel: GetMasterAddrByName %q failed: %s\", d.masterName, err)\n\t\t\td._resetSentinel()\n\t\t} else {\n\t\t\taddr := net.JoinHostPort(addr[0], addr[1])\n\t\t\tinternal.Logf(\"sentinel: %q addr is %s\", d.masterName, addr)\n\t\t\treturn addr, nil\n\t\t}\n\t}\n\n\tfor i, sentinelAddr := range d.sentinelAddrs {\n\t\tsentinel := newSentinel(&Options{\n\t\t\tAddr: sentinelAddr,\n\n\t\t\tDialTimeout:  d.opt.DialTimeout,\n\t\t\tReadTimeout:  d.opt.ReadTimeout,\n\t\t\tWriteTimeout: d.opt.WriteTimeout,\n\n\t\t\tPoolSize:    d.opt.PoolSize,\n\t\t\tPoolTimeout: d.opt.PoolTimeout,\n\t\t\tIdleTimeout: d.opt.IdleTimeout,\n\t\t})\n\t\tmasterAddr, err := sentinel.GetMasterAddrByName(d.masterName).Result()\n\t\tif err != nil {\n\t\t\tinternal.Logf(\"sentinel: GetMasterAddrByName %q failed: %s\", d.masterName, err)\n\t\t\tsentinel.Close()\n\t\t\tcontinue\n\t\t}\n\n\t\t// Push working sentinel to the top.\n\t\td.sentinelAddrs[0], d.sentinelAddrs[i] = d.sentinelAddrs[i], d.sentinelAddrs[0]\n\n\t\td.setSentinel(sentinel)\n\t\taddr := net.JoinHostPort(masterAddr[0], masterAddr[1])\n\t\tinternal.Logf(\"sentinel: %q addr is %s\", d.masterName, addr)\n\t\treturn addr, nil\n\t}\n\n\treturn \"\", errors.New(\"redis: all sentinels are unreachable\")\n}\n\nfunc (d *sentinelFailover) setSentinel(sentinel *sentinelClient) {\n\td.discoverSentinels(sentinel)\n\td.sentinel = sentinel\n\tgo d.listen(sentinel)\n}\n\nfunc (d *sentinelFailover) resetSentinel() error {\n\td.mu.Lock()\n\terr := d._resetSentinel()\n\td.mu.Unlock()\n\treturn err\n}\n\nfunc (d *sentinelFailover) _resetSentinel() error {\n\tvar err error\n\tif d.sentinel != nil {\n\t\terr = d.sentinel.Close()\n\t\td.sentinel = nil\n\t}\n\treturn err\n}\n\nfunc (d *sentinelFailover) discoverSentinels(sentinel *sentinelClient) {\n\tsentinels, err := sentinel.Sentinels(d.masterName).Result()\n\tif err != nil {\n\t\tinternal.Logf(\"sentinel: Sentinels %q failed: %s\", d.masterName, err)\n\t\treturn\n\t}\n\tfor _, sentinel := range sentinels {\n\t\tvals := sentinel.([]interface{})\n\t\tfor i := 0; i < len(vals); i += 2 {\n\t\t\tkey := vals[i].(string)\n\t\t\tif key == \"name\" {\n\t\t\t\tsentinelAddr := vals[i+1].(string)\n\t\t\t\tif !contains(d.sentinelAddrs, sentinelAddr) {\n\t\t\t\t\tinternal.Logf(\n\t\t\t\t\t\t\"sentinel: discovered new %q sentinel: %s\",\n\t\t\t\t\t\td.masterName, sentinelAddr,\n\t\t\t\t\t)\n\t\t\t\t\td.sentinelAddrs = append(d.sentinelAddrs, sentinelAddr)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n// closeOldConns closes connections to the old master after failover switch.\nfunc (d *sentinelFailover) closeOldConns(newMaster string) {\n\t// Good connections that should be put back to the pool. They\n\t// can't be put immediately, because pool.First will return them\n\t// again on next iteration.\n\tcnsToPut := make([]*pool.Conn, 0)\n\n\tfor {\n\t\tcn := d.pool.PopFree()\n\t\tif cn == nil {\n\t\t\tbreak\n\t\t}\n\t\tif cn.RemoteAddr().String() != newMaster {\n\t\t\terr := fmt.Errorf(\n\t\t\t\t\"sentinel: closing connection to the old master %s\",\n\t\t\t\tcn.RemoteAddr(),\n\t\t\t)\n\t\t\tinternal.Logf(err.Error())\n\t\t\td.pool.Remove(cn, err)\n\t\t} else {\n\t\t\tcnsToPut = append(cnsToPut, cn)\n\t\t}\n\t}\n\n\tfor _, cn := range cnsToPut {\n\t\td.pool.Put(cn)\n\t}\n}\n\nfunc (d *sentinelFailover) listen(sentinel *sentinelClient) {\n\tvar pubsub *PubSub\n\tfor {\n\t\tif pubsub == nil {\n\t\t\tpubsub = sentinel.PubSub()\n\t\t\tif err := pubsub.Subscribe(\"+switch-master\"); err != nil {\n\t\t\t\tinternal.Logf(\"sentinel: Subscribe failed: %s\", err)\n\t\t\t\td.resetSentinel()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tmsg, err := pubsub.ReceiveMessage()\n\t\tif err != nil {\n\t\t\tinternal.Logf(\"sentinel: ReceiveMessage failed: %s\", err)\n\t\t\tpubsub.Close()\n\t\t\td.resetSentinel()\n\t\t\treturn\n\t\t}\n\n\t\tswitch msg.Channel {\n\t\tcase \"+switch-master\":\n\t\t\tparts := strings.Split(msg.Payload, \" \")\n\t\t\tif parts[0] != d.masterName {\n\t\t\t\tinternal.Logf(\"sentinel: ignore new %s addr\", parts[0])\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\taddr := net.JoinHostPort(parts[3], parts[4])\n\t\t\tinternal.Logf(\n\t\t\t\t\"sentinel: new %q addr is %s\",\n\t\t\t\td.masterName, addr,\n\t\t\t)\n\n\t\t\td.closeOldConns(addr)\n\t\t}\n\t}\n}\n\nfunc contains(slice []string, str string) bool {\n\tfor _, s := range slice {\n\t\tif s == str {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "vendor/gopkg.in/redis.v3/unsafe.go",
    "content": "// +build !appengine\n\npackage redis\n\nimport (\n\t\"reflect\"\n\t\"unsafe\"\n)\n\nfunc bytesToString(b []byte) string {\n\tbytesHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b))\n\tstrHeader := reflect.StringHeader{bytesHeader.Data, bytesHeader.Len}\n\treturn *(*string)(unsafe.Pointer(&strHeader))\n}\n"
  },
  {
    "path": "vendor/gopkg.in/sourcemap.v1/LICENSE",
    "content": "Copyright (c) 2016 The github.com/go-sourcemap/sourcemap Contributors.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n   * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "vendor/gopkg.in/sourcemap.v1/Makefile",
    "content": "all:\n\tgo test ./...\n\tgo test ./... -short -race\n\tgo vet\n"
  },
  {
    "path": "vendor/gopkg.in/sourcemap.v1/README.md",
    "content": "# Source Maps consumer for Golang [![Build Status](https://travis-ci.org/go-sourcemap/sourcemap.svg?branch=v1)](https://travis-ci.org/go-sourcemap/sourcemap)\n\n## Installation\n\nInstall:\n\n    go get gopkg.in/sourcemap.v1\n\n## Quickstart\n\n```go\nfunc ExampleParse() {\n\tmapURL := \"http://code.jquery.com/jquery-2.0.3.min.map\"\n\tresp, err := http.Get(mapURL)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer resp.Body.Close()\n\n\tb, err := ioutil.ReadAll(resp.Body)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tsmap, err := sourcemap.Parse(mapURL, b)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tline, column := 5, 6789\n\tfile, fn, line, col, ok := smap.Source(line, column)\n\tfmt.Println(file, fn, line, col, ok)\n\t// Output: http://code.jquery.com/jquery-2.0.3.js apply 4360 27 true\n}\n```\n"
  },
  {
    "path": "vendor/gopkg.in/sourcemap.v1/base64vlq/base64_vlq.go",
    "content": "package base64vlq\n\nimport (\n\t\"io\"\n)\n\nconst encodeStd = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\n\nconst (\n\tvlqBaseShift       = 5\n\tvlqBase            = 1 << vlqBaseShift\n\tvlqBaseMask        = vlqBase - 1\n\tvlqSignBit         = 1\n\tvlqContinuationBit = vlqBase\n)\n\nvar decodeMap [256]byte\n\nfunc init() {\n\tfor i := 0; i < len(encodeStd); i++ {\n\t\tdecodeMap[encodeStd[i]] = byte(i)\n\t}\n}\n\nfunc toVLQSigned(n int) int {\n\tif n < 0 {\n\t\treturn -n<<1 + 1\n\t}\n\treturn n << 1\n}\n\nfunc fromVLQSigned(n int) int {\n\tisNeg := n&vlqSignBit != 0\n\tn >>= 1\n\tif isNeg {\n\t\treturn -n\n\t}\n\treturn n\n}\n\ntype Encoder struct {\n\tw io.ByteWriter\n}\n\nfunc NewEncoder(w io.ByteWriter) *Encoder {\n\treturn &Encoder{\n\t\tw: w,\n\t}\n}\n\nfunc (enc Encoder) Encode(n int) error {\n\tn = toVLQSigned(n)\n\tfor digit := vlqContinuationBit; digit&vlqContinuationBit != 0; {\n\t\tdigit = n & vlqBaseMask\n\t\tn >>= vlqBaseShift\n\t\tif n > 0 {\n\t\t\tdigit |= vlqContinuationBit\n\t\t}\n\n\t\terr := enc.w.WriteByte(encodeStd[digit])\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\ntype Decoder struct {\n\tr io.ByteReader\n}\n\nfunc NewDecoder(r io.ByteReader) *Decoder {\n\treturn &Decoder{\n\t\tr: r,\n\t}\n}\n\nfunc (dec Decoder) Decode() (n int, err error) {\n\tshift := uint(0)\n\tfor continuation := true; continuation; {\n\t\tc, err := dec.r.ReadByte()\n\t\tif err != nil {\n\t\t\treturn 0, err\n\t\t}\n\n\t\tc = decodeMap[c]\n\t\tcontinuation = c&vlqContinuationBit != 0\n\t\tn += int(c&vlqBaseMask) << shift\n\t\tshift += vlqBaseShift\n\t}\n\treturn fromVLQSigned(n), nil\n}\n"
  },
  {
    "path": "vendor/gopkg.in/sourcemap.v1/consumer.go",
    "content": "package sourcemap\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"path\"\n\t\"sort\"\n\t\"strconv\"\n)\n\ntype Consumer struct {\n\tsourceRootURL *url.URL\n\tsmap          *sourceMap\n\tmappings      []mapping\n}\n\nfunc Parse(mapURL string, b []byte) (*Consumer, error) {\n\tsmap := new(sourceMap)\n\terr := json.Unmarshal(b, smap)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif smap.Version != 3 {\n\t\treturn nil, fmt.Errorf(\n\t\t\t\"sourcemap: got version=%d, but only 3rd version is supported\",\n\t\t\tsmap.Version,\n\t\t)\n\t}\n\n\tvar sourceRootURL *url.URL\n\tif smap.SourceRoot != \"\" {\n\t\tu, err := url.Parse(smap.SourceRoot)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif u.IsAbs() {\n\t\t\tsourceRootURL = u\n\t\t}\n\t} else if mapURL != \"\" {\n\t\tu, err := url.Parse(mapURL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif u.IsAbs() {\n\t\t\tu.Path = path.Dir(u.Path)\n\t\t\tsourceRootURL = u\n\t\t}\n\t}\n\n\tmappings, err := parseMappings(smap.Mappings)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Free memory.\n\tsmap.Mappings = \"\"\n\n\treturn &Consumer{\n\t\tsourceRootURL: sourceRootURL,\n\t\tsmap:          smap,\n\t\tmappings:      mappings,\n\t}, nil\n}\n\nfunc (c *Consumer) File() string {\n\treturn c.smap.File\n}\n\nfunc (c *Consumer) Source(genLine, genCol int) (source, name string, line, col int, ok bool) {\n\ti := sort.Search(len(c.mappings), func(i int) bool {\n\t\tm := &c.mappings[i]\n\t\tif m.genLine == genLine {\n\t\t\treturn m.genCol >= genCol\n\t\t}\n\t\treturn m.genLine >= genLine\n\t})\n\n\t// Mapping not found.\n\tif i == len(c.mappings) {\n\t\treturn\n\t}\n\n\tmatch := &c.mappings[i]\n\n\t// Fuzzy match.\n\tif match.genLine > genLine || match.genCol > genCol {\n\t\tif i == 0 {\n\t\t\treturn\n\t\t}\n\t\tmatch = &c.mappings[i-1]\n\t}\n\n\tif match.sourcesInd >= 0 {\n\t\tsource = c.absSource(c.smap.Sources[match.sourcesInd])\n\t}\n\tif match.namesInd >= 0 {\n\t\tv := c.smap.Names[match.namesInd]\n\t\tswitch v := v.(type) {\n\t\tcase string:\n\t\t\tname = v\n\t\tcase float64:\n\t\t\tname = strconv.FormatFloat(v, 'f', -1, 64)\n\t\tdefault:\n\t\t\tname = fmt.Sprint(v)\n\t\t}\n\t}\n\tline = match.sourceLine\n\tcol = match.sourceCol\n\tok = true\n\treturn\n}\n\nfunc (c *Consumer) absSource(source string) string {\n\tif path.IsAbs(source) {\n\t\treturn source\n\t}\n\n\tif u, err := url.Parse(source); err == nil && u.IsAbs() {\n\t\treturn source\n\t}\n\n\tif c.sourceRootURL != nil {\n\t\tu := *c.sourceRootURL\n\t\tu.Path = path.Join(c.sourceRootURL.Path, source)\n\t\treturn u.String()\n\t}\n\n\tif c.smap.SourceRoot != \"\" {\n\t\treturn path.Join(c.smap.SourceRoot, source)\n\t}\n\n\treturn source\n}\n"
  },
  {
    "path": "vendor/gopkg.in/sourcemap.v1/sourcemap.go",
    "content": "package sourcemap // import \"gopkg.in/sourcemap.v1\"\n\nimport (\n\t\"io\"\n\t\"strings\"\n\n\t\"gopkg.in/sourcemap.v1/base64vlq\"\n)\n\ntype fn func(m *mappings) (fn, error)\n\ntype sourceMap struct {\n\tVersion    int           `json:\"version\"`\n\tFile       string        `json:\"file\"`\n\tSourceRoot string        `json:\"sourceRoot\"`\n\tSources    []string      `json:\"sources\"`\n\tNames      []interface{} `json:\"names\"`\n\tMappings   string        `json:\"mappings\"`\n}\n\ntype mapping struct {\n\tgenLine    int\n\tgenCol     int\n\tsourcesInd int\n\tsourceLine int\n\tsourceCol  int\n\tnamesInd   int\n}\n\ntype mappings struct {\n\trd  *strings.Reader\n\tdec *base64vlq.Decoder\n\n\thasName bool\n\tvalue   mapping\n\n\tvalues []mapping\n}\n\nfunc parseMappings(s string) ([]mapping, error) {\n\trd := strings.NewReader(s)\n\tm := &mappings{\n\t\trd:  rd,\n\t\tdec: base64vlq.NewDecoder(rd),\n\t}\n\tm.value.genLine = 1\n\tm.value.sourceLine = 1\n\n\terr := m.parse()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn m.values, nil\n}\n\nfunc (m *mappings) parse() error {\n\tnext := parseGenCol\n\tfor {\n\t\tc, err := m.rd.ReadByte()\n\t\tif err == io.EOF {\n\t\t\tm.pushValue()\n\t\t\treturn nil\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tswitch c {\n\t\tcase ',':\n\t\t\tm.pushValue()\n\t\t\tnext = parseGenCol\n\t\tcase ';':\n\t\t\tm.pushValue()\n\n\t\t\tm.value.genLine++\n\t\t\tm.value.genCol = 0\n\n\t\t\tnext = parseGenCol\n\t\tdefault:\n\t\t\terr := m.rd.UnreadByte()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tnext, err = next(m)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc parseGenCol(m *mappings) (fn, error) {\n\tn, err := m.dec.Decode()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm.value.genCol += n\n\treturn parseSourcesInd, nil\n}\n\nfunc parseSourcesInd(m *mappings) (fn, error) {\n\tn, err := m.dec.Decode()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm.value.sourcesInd += n\n\treturn parseSourceLine, nil\n}\n\nfunc parseSourceLine(m *mappings) (fn, error) {\n\tn, err := m.dec.Decode()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm.value.sourceLine += n\n\treturn parseSourceCol, nil\n}\n\nfunc parseSourceCol(m *mappings) (fn, error) {\n\tn, err := m.dec.Decode()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm.value.sourceCol += n\n\treturn parseNamesInd, nil\n}\n\nfunc parseNamesInd(m *mappings) (fn, error) {\n\tn, err := m.dec.Decode()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tm.hasName = true\n\tm.value.namesInd += n\n\treturn parseGenCol, nil\n}\n\nfunc (m *mappings) pushValue() {\n\tif m.value.sourceLine == 1 && m.value.sourceCol == 0 {\n\t\treturn\n\t}\n\n\tif m.hasName {\n\t\tm.values = append(m.values, m.value)\n\t\tm.hasName = false\n\t} else {\n\t\tm.values = append(m.values, mapping{\n\t\t\tgenLine:    m.value.genLine,\n\t\t\tgenCol:     m.value.genCol,\n\t\t\tsourcesInd: m.value.sourcesInd,\n\t\t\tsourceLine: m.value.sourceLine,\n\t\t\tsourceCol:  m.value.sourceCol,\n\t\t\tnamesInd:   -1,\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/CHANGELOG.md",
    "content": "# Change Log\n\n**ATTN**: This project uses [semantic versioning](http://semver.org/).\n\n## [Unreleased]\n\n## 1.20.0 - 2017-08-10\n\n### Fixed\n\n* `HandleExitCoder` is now correctly iterates over all errors in\n  a `MultiError`. The exit code is the exit code of the last error or `1` if\n  there are no `ExitCoder`s in the `MultiError`.\n* Fixed YAML file loading on Windows (previously would fail validate the file path)\n* Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly\n  propogated\n* `ErrWriter` is now passed downwards through command structure to avoid the\n  need to redefine it\n* Pass `Command` context into `OnUsageError` rather than parent context so that\n  all fields are avaiable\n* Errors occuring in `Before` funcs are no longer double printed\n* Use `UsageText` in the help templates for commands and subcommands if\n  defined; otherwise build the usage as before (was previously ignoring this\n  field)\n* `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if\n  a program calls `Set` or `GlobalSet` directly after flag parsing (would\n  previously only return `true` if the flag was set during parsing)\n\n### Changed\n\n* No longer exit the program on command/subcommand error if the error raised is\n  not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was\n  determined to be a regression in functionality. See [the\n  PR](https://github.com/urfave/cli/pull/595) for discussion.\n\n### Added\n\n* `CommandsByName` type was added to make it easy to sort `Command`s by name,\n  alphabetically\n* `altsrc` now handles loading of string and int arrays from TOML\n* Support for definition of custom help templates for `App` via\n  `CustomAppHelpTemplate`\n* Support for arbitrary key/value fields on `App` to be used with\n  `CustomAppHelpTemplate` via `ExtraInfo`\n* `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be\n  `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag`\n  interface to be used.\n\n\n## [1.19.1] - 2016-11-21\n\n### Fixed\n\n- Fixes regression introduced in 1.19.0 where using an `ActionFunc` as\n  the `Action` for a command would cause it to error rather than calling the\n  function. Should not have a affected declarative cases using `func(c\n  *cli.Context) err)`.\n- Shell completion now handles the case where the user specifies\n  `--generate-bash-completion` immediately after a flag that takes an argument.\n  Previously it call the application with `--generate-bash-completion` as the\n  flag value.\n\n## [1.19.0] - 2016-11-19\n### Added\n- `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`)\n- A `Description` field was added to `App` for a more detailed description of\n  the application (similar to the existing `Description` field on `Command`)\n- Flag type code generation via `go generate`\n- Write to stderr and exit 1 if action returns non-nil error\n- Added support for TOML to the `altsrc` loader\n- `SkipArgReorder` was added to allow users to skip the argument reordering.\n  This is useful if you want to consider all \"flags\" after an argument as\n  arguments rather than flags (the default behavior of the stdlib `flag`\n  library). This is backported functionality from the [removal of the flag\n  reordering](https://github.com/urfave/cli/pull/398) in the unreleased version\n  2\n- For formatted errors (those implementing `ErrorFormatter`), the errors will\n  be formatted during output. Compatible with `pkg/errors`.\n\n### Changed\n- Raise minimum tested/supported Go version to 1.2+\n\n### Fixed\n- Consider empty environment variables as set (previously environment variables\n  with the equivalent of `\"\"` would be skipped rather than their value used).\n- Return an error if the value in a given environment variable cannot be parsed\n  as the flag type. Previously these errors were silently swallowed.\n- Print full error when an invalid flag is specified (which includes the invalid flag)\n- `App.Writer` defaults to `stdout` when `nil`\n- If no action is specified on a command or app, the help is now printed instead of `panic`ing\n- `App.Metadata` is initialized automatically now (previously was `nil` unless initialized)\n- Correctly show help message if `-h` is provided to a subcommand\n- `context.(Global)IsSet` now respects environment variables. Previously it\n  would return `false` if a flag was specified in the environment rather than\n  as an argument\n- Removed deprecation warnings to STDERR to avoid them leaking to the end-user\n- `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This\n  fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well\n  as `altsrc` where Go would complain that the types didn't match\n\n## [1.18.1] - 2016-08-28\n### Fixed\n- Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported)\n\n## [1.18.0] - 2016-06-27\n### Added\n- `./runtests` test runner with coverage tracking by default\n- testing on OS X\n- testing on Windows\n- `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code\n\n### Changed\n- Use spaces for alignment in help/usage output instead of tabs, making the\n  output alignment consistent regardless of tab width\n\n### Fixed\n- Printing of command aliases in help text\n- Printing of visible flags for both struct and struct pointer flags\n- Display the `help` subcommand when using `CommandCategories`\n- No longer swallows `panic`s that occur within the `Action`s themselves when\n  detecting the signature of the `Action` field\n\n## [1.17.1] - 2016-08-28\n### Fixed\n- Removed deprecation warnings to STDERR to avoid them leaking to the end-user\n\n## [1.17.0] - 2016-05-09\n### Added\n- Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc`\n- `context.GlobalBoolT` was added as an analogue to `context.GlobalBool`\n- Support for hiding commands by setting `Hidden: true` -- this will hide the\n  commands in help output\n\n### Changed\n- `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer\n  quoted in help text output.\n- All flag types now include `(default: {value})` strings following usage when a\n  default value can be (reasonably) detected.\n- `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent\n  with non-slice flag types\n- Apps now exit with a code of 3 if an unknown subcommand is specified\n  (previously they printed \"No help topic for...\", but still exited 0. This\n  makes it easier to script around apps built using `cli` since they can trust\n  that a 0 exit code indicated a successful execution.\n- cleanups based on [Go Report Card\n  feedback](https://goreportcard.com/report/github.com/urfave/cli)\n\n## [1.16.1] - 2016-08-28\n### Fixed\n- Removed deprecation warnings to STDERR to avoid them leaking to the end-user\n\n## [1.16.0] - 2016-05-02\n### Added\n- `Hidden` field on all flag struct types to omit from generated help text\n\n### Changed\n- `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from\ngenerated help text via the `Hidden` field\n\n### Fixed\n- handling of error values in `HandleAction` and `HandleExitCoder`\n\n## [1.15.0] - 2016-04-30\n### Added\n- This file!\n- Support for placeholders in flag usage strings\n- `App.Metadata` map for arbitrary data/state management\n- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after\nparsing.\n- Support for nested lookup of dot-delimited keys in structures loaded from\nYAML.\n\n### Changed\n- The `App.Action` and `Command.Action` now prefer a return signature of\n`func(*cli.Context) error`, as defined by `cli.ActionFunc`.  If a non-nil\n`error` is returned, there may be two outcomes:\n    - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called\n    automatically\n    - Else the error is bubbled up and returned from `App.Run`\n- Specifying an `Action` with the legacy return signature of\n`func(*cli.Context)` will produce a deprecation message to stderr\n- Specifying an `Action` that is not a `func` type will produce a non-zero exit\nfrom `App.Run`\n- Specifying an `Action` func that has an invalid (input) signature will\nproduce a non-zero exit from `App.Run`\n\n### Deprecated\n- <a name=\"deprecated-cli-app-runandexitonerror\"></a>\n`cli.App.RunAndExitOnError`, which should now be done by returning an error\nthat fulfills `cli.ExitCoder` to `cli.App.Run`.\n- <a name=\"deprecated-cli-app-action-signature\"></a> the legacy signature for\n`cli.App.Action` of `func(*cli.Context)`, which should now have a return\nsignature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`.\n\n### Fixed\n- Added missing `*cli.Context.GlobalFloat64` method\n\n## [1.14.0] - 2016-04-03 (backfilled 2016-04-25)\n### Added\n- Codebeat badge\n- Support for categorization via `CategorizedHelp` and `Categories` on app.\n\n### Changed\n- Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`.\n\n### Fixed\n- Ensure version is not shown in help text when `HideVersion` set.\n\n## [1.13.0] - 2016-03-06 (backfilled 2016-04-25)\n### Added\n- YAML file input support.\n- `NArg` method on context.\n\n## [1.12.0] - 2016-02-17 (backfilled 2016-04-25)\n### Added\n- Custom usage error handling.\n- Custom text support in `USAGE` section of help output.\n- Improved help messages for empty strings.\n- AppVeyor CI configuration.\n\n### Changed\n- Removed `panic` from default help printer func.\n- De-duping and optimizations.\n\n### Fixed\n- Correctly handle `Before`/`After` at command level when no subcommands.\n- Case of literal `-` argument causing flag reordering.\n- Environment variable hints on Windows.\n- Docs updates.\n\n## [1.11.1] - 2015-12-21 (backfilled 2016-04-25)\n### Changed\n- Use `path.Base` in `Name` and `HelpName`\n- Export `GetName` on flag types.\n\n### Fixed\n- Flag parsing when skipping is enabled.\n- Test output cleanup.\n- Move completion check to account for empty input case.\n\n## [1.11.0] - 2015-11-15 (backfilled 2016-04-25)\n### Added\n- Destination scan support for flags.\n- Testing against `tip` in Travis CI config.\n\n### Changed\n- Go version in Travis CI config.\n\n### Fixed\n- Removed redundant tests.\n- Use correct example naming in tests.\n\n## [1.10.2] - 2015-10-29 (backfilled 2016-04-25)\n### Fixed\n- Remove unused var in bash completion.\n\n## [1.10.1] - 2015-10-21 (backfilled 2016-04-25)\n### Added\n- Coverage and reference logos in README.\n\n### Fixed\n- Use specified values in help and version parsing.\n- Only display app version and help message once.\n\n## [1.10.0] - 2015-10-06 (backfilled 2016-04-25)\n### Added\n- More tests for existing functionality.\n- `ArgsUsage` at app and command level for help text flexibility.\n\n### Fixed\n- Honor `HideHelp` and `HideVersion` in `App.Run`.\n- Remove juvenile word from README.\n\n## [1.9.0] - 2015-09-08 (backfilled 2016-04-25)\n### Added\n- `FullName` on command with accompanying help output update.\n- Set default `$PROG` in bash completion.\n\n### Changed\n- Docs formatting.\n\n### Fixed\n- Removed self-referential imports in tests.\n\n## [1.8.0] - 2015-06-30 (backfilled 2016-04-25)\n### Added\n- Support for `Copyright` at app level.\n- `Parent` func at context level to walk up context lineage.\n\n### Fixed\n- Global flag processing at top level.\n\n## [1.7.1] - 2015-06-11 (backfilled 2016-04-25)\n### Added\n- Aggregate errors from `Before`/`After` funcs.\n- Doc comments on flag structs.\n- Include non-global flags when checking version and help.\n- Travis CI config updates.\n\n### Fixed\n- Ensure slice type flags have non-nil values.\n- Collect global flags from the full command hierarchy.\n- Docs prose.\n\n## [1.7.0] - 2015-05-03 (backfilled 2016-04-25)\n### Changed\n- `HelpPrinter` signature includes output writer.\n\n### Fixed\n- Specify go 1.1+ in docs.\n- Set `Writer` when running command as app.\n\n## [1.6.0] - 2015-03-23 (backfilled 2016-04-25)\n### Added\n- Multiple author support.\n- `NumFlags` at context level.\n- `Aliases` at command level.\n\n### Deprecated\n- `ShortName` at command level.\n\n### Fixed\n- Subcommand help output.\n- Backward compatible support for deprecated `Author` and `Email` fields.\n- Docs regarding `Names`/`Aliases`.\n\n## [1.5.0] - 2015-02-20 (backfilled 2016-04-25)\n### Added\n- `After` hook func support at app and command level.\n\n### Fixed\n- Use parsed context when running command as subcommand.\n- Docs prose.\n\n## [1.4.1] - 2015-01-09 (backfilled 2016-04-25)\n### Added\n- Support for hiding `-h / --help` flags, but not `help` subcommand.\n- Stop flag parsing after `--`.\n\n### Fixed\n- Help text for generic flags to specify single value.\n- Use double quotes in output for defaults.\n- Use `ParseInt` instead of `ParseUint` for int environment var values.\n- Use `0` as base when parsing int environment var values.\n\n## [1.4.0] - 2014-12-12 (backfilled 2016-04-25)\n### Added\n- Support for environment variable lookup \"cascade\".\n- Support for `Stdout` on app for output redirection.\n\n### Fixed\n- Print command help instead of app help in `ShowCommandHelp`.\n\n## [1.3.1] - 2014-11-13 (backfilled 2016-04-25)\n### Added\n- Docs and example code updates.\n\n### Changed\n- Default `-v / --version` flag made optional.\n\n## [1.3.0] - 2014-08-10 (backfilled 2016-04-25)\n### Added\n- `FlagNames` at context level.\n- Exposed `VersionPrinter` var for more control over version output.\n- Zsh completion hook.\n- `AUTHOR` section in default app help template.\n- Contribution guidelines.\n- `DurationFlag` type.\n\n## [1.2.0] - 2014-08-02\n### Added\n- Support for environment variable defaults on flags plus tests.\n\n## [1.1.0] - 2014-07-15\n### Added\n- Bash completion.\n- Optional hiding of built-in help command.\n- Optional skipping of flag parsing at command level.\n- `Author`, `Email`, and `Compiled` metadata on app.\n- `Before` hook func support at app and command level.\n- `CommandNotFound` func support at app level.\n- Command reference available on context.\n- `GenericFlag` type.\n- `Float64Flag` type.\n- `BoolTFlag` type.\n- `IsSet` flag helper on context.\n- More flag lookup funcs at context level.\n- More tests &amp; docs.\n\n### Changed\n- Help template updates to account for presence/absence of flags.\n- Separated subcommand help template.\n- Exposed `HelpPrinter` var for more control over help output.\n\n## [1.0.0] - 2013-11-01\n### Added\n- `help` flag in default app flag set and each command flag set.\n- Custom handling of argument parsing errors.\n- Command lookup by name at app level.\n- `StringSliceFlag` type and supporting `StringSlice` type.\n- `IntSliceFlag` type and supporting `IntSlice` type.\n- Slice type flag lookups by name at context level.\n- Export of app and command help functions.\n- More tests &amp; docs.\n\n## 0.1.0 - 2013-07-22\n### Added\n- Initial implementation.\n\n[Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD\n[1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0\n[1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0\n[1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0\n[1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0\n[1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0\n[1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0\n[1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0\n[1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1\n[1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0\n[1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2\n[1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1\n[1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0\n[1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0\n[1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0\n[1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1\n[1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0\n[1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0\n[1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0\n[1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1\n[1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0\n[1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1\n[1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0\n[1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0\n[1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0\n[1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2016 Jeremy Saenz & Contributors\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": "vendor/gopkg.in/urfave/cli.v1/README.md",
    "content": "cli\n===\n\n[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli)\n[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli)\n[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli)\n[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli)\n[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli)\n[![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 \"top level coverage\")](http://gocover.io/github.com/urfave/cli) /\n[![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 \"altsrc coverage\")](http://gocover.io/github.com/urfave/cli/altsrc)\n\n**Notice:** This is the library formerly known as\n`github.com/codegangsta/cli` -- Github will automatically redirect requests\nto this repository, but we recommend updating your references for clarity.\n\ncli is a simple, fast, and fun package for building command line apps in Go. The\ngoal is to enable developers to write fast and distributable command line\napplications in an expressive way.\n\n<!-- toc -->\n\n- [Overview](#overview)\n- [Installation](#installation)\n  * [Supported platforms](#supported-platforms)\n  * [Using the `v2` branch](#using-the-v2-branch)\n  * [Pinning to the `v1` releases](#pinning-to-the-v1-releases)\n- [Getting Started](#getting-started)\n- [Examples](#examples)\n  * [Arguments](#arguments)\n  * [Flags](#flags)\n    + [Placeholder Values](#placeholder-values)\n    + [Alternate Names](#alternate-names)\n    + [Ordering](#ordering)\n    + [Values from the Environment](#values-from-the-environment)\n    + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others)\n  * [Subcommands](#subcommands)\n  * [Subcommands categories](#subcommands-categories)\n  * [Exit code](#exit-code)\n  * [Bash Completion](#bash-completion)\n    + [Enabling](#enabling)\n    + [Distribution](#distribution)\n    + [Customization](#customization)\n  * [Generated Help Text](#generated-help-text)\n    + [Customization](#customization-1)\n  * [Version Flag](#version-flag)\n    + [Customization](#customization-2)\n    + [Full API Example](#full-api-example)\n- [Contribution Guidelines](#contribution-guidelines)\n\n<!-- tocstop -->\n\n## Overview\n\nCommand line apps are usually so tiny that there is absolutely no reason why\nyour code should *not* be self-documenting. Things like generating help text and\nparsing command flags/options should not hinder productivity when writing a\ncommand line app.\n\n**This is where cli comes into play.** cli makes command line programming fun,\norganized, and expressive!\n\n## Installation\n\nMake sure you have a working Go environment.  Go version 1.2+ is supported.  [See\nthe install instructions for Go](http://golang.org/doc/install.html).\n\nTo install cli, simply run:\n```\n$ go get github.com/urfave/cli\n```\n\nMake sure your `PATH` includes the `$GOPATH/bin` directory so your commands can\nbe easily used:\n```\nexport PATH=$PATH:$GOPATH/bin\n```\n\n### Supported platforms\n\ncli is tested against multiple versions of Go on Linux, and against the latest\nreleased version of Go on OS X and Windows.  For full details, see\n[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml).\n\n### Using the `v2` branch\n\n**Warning**: The `v2` branch is currently unreleased and considered unstable.\n\nThere is currently a long-lived branch named `v2` that is intended to land as\nthe new `master` branch once development there has settled down.  The current\n`master` branch (mirrored as `v1`) is being manually merged into `v2` on\nan irregular human-based schedule, but generally if one wants to \"upgrade\" to\n`v2` *now* and accept the volatility (read: \"awesomeness\") that comes along with\nthat, please use whatever version pinning of your preference, such as via\n`gopkg.in`:\n\n```\n$ go get gopkg.in/urfave/cli.v2\n```\n\n``` go\n...\nimport (\n  \"gopkg.in/urfave/cli.v2\" // imports as package \"cli\"\n)\n...\n```\n\n### Pinning to the `v1` releases\n\nSimilarly to the section above describing use of the `v2` branch, if one wants\nto avoid any unexpected compatibility pains once `v2` becomes `master`, then\npinning to `v1` is an acceptable option, e.g.:\n\n```\n$ go get gopkg.in/urfave/cli.v1\n```\n\n``` go\n...\nimport (\n  \"gopkg.in/urfave/cli.v1\" // imports as package \"cli\"\n)\n...\n```\n\nThis will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing).\n\n## Getting Started\n\nOne of the philosophies behind cli is that an API should be playful and full of\ndiscovery. So a cli app can be as little as one line of code in `main()`.\n\n<!-- {\n  \"args\": [\"&#45;&#45;help\"],\n  \"output\": \"A new cli application\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  cli.NewApp().Run(os.Args)\n}\n```\n\nThis app will run and show help text, but is not very useful. Let's give an\naction to execute and some help documentation:\n\n<!-- {\n  \"output\": \"boom! I say!\"\n} -->\n``` go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n  app.Name = \"boom\"\n  app.Usage = \"make an explosive entrance\"\n  app.Action = func(c *cli.Context) error {\n    fmt.Println(\"boom! I say!\")\n    return nil\n  }\n\n  app.Run(os.Args)\n}\n```\n\nRunning this already gives you a ton of functionality, plus support for things\nlike subcommands and flags, which are covered below.\n\n## Examples\n\nBeing a programmer can be a lonely job. Thankfully by the power of automation\nthat is not the case! Let's create a greeter app to fend off our demons of\nloneliness!\n\nStart by creating a directory named `greet`, and within it, add a file,\n`greet.go` with the following code in it:\n\n<!-- {\n  \"output\": \"Hello friend!\"\n} -->\n``` go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n  app.Name = \"greet\"\n  app.Usage = \"fight the loneliness!\"\n  app.Action = func(c *cli.Context) error {\n    fmt.Println(\"Hello friend!\")\n    return nil\n  }\n\n  app.Run(os.Args)\n}\n```\n\nInstall our command to the `$GOPATH/bin` directory:\n\n```\n$ go install\n```\n\nFinally run our new command:\n\n```\n$ greet\nHello friend!\n```\n\ncli also generates neat help text:\n\n```\n$ greet help\nNAME:\n    greet - fight the loneliness!\n\nUSAGE:\n    greet [global options] command [command options] [arguments...]\n\nVERSION:\n    0.0.0\n\nCOMMANDS:\n    help, h  Shows a list of commands or help for one command\n\nGLOBAL OPTIONS\n    --version Shows version information\n```\n\n### Arguments\n\nYou can lookup arguments by calling the `Args` function on `cli.Context`, e.g.:\n\n<!-- {\n  \"output\": \"Hello \\\"\"\n} -->\n``` go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Action = func(c *cli.Context) error {\n    fmt.Printf(\"Hello %q\", c.Args().Get(0))\n    return nil\n  }\n\n  app.Run(os.Args)\n}\n```\n\n### Flags\n\nSetting and querying flags is simple.\n\n<!-- {\n  \"output\": \"Hello Nefertiti\"\n} -->\n``` go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Flags = []cli.Flag {\n    cli.StringFlag{\n      Name: \"lang\",\n      Value: \"english\",\n      Usage: \"language for the greeting\",\n    },\n  }\n\n  app.Action = func(c *cli.Context) error {\n    name := \"Nefertiti\"\n    if c.NArg() > 0 {\n      name = c.Args().Get(0)\n    }\n    if c.String(\"lang\") == \"spanish\" {\n      fmt.Println(\"Hola\", name)\n    } else {\n      fmt.Println(\"Hello\", name)\n    }\n    return nil\n  }\n\n  app.Run(os.Args)\n}\n```\n\nYou can also set a destination variable for a flag, to which the content will be\nscanned.\n\n<!-- {\n  \"output\": \"Hello someone\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n  \"fmt\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  var language string\n\n  app := cli.NewApp()\n\n  app.Flags = []cli.Flag {\n    cli.StringFlag{\n      Name:        \"lang\",\n      Value:       \"english\",\n      Usage:       \"language for the greeting\",\n      Destination: &language,\n    },\n  }\n\n  app.Action = func(c *cli.Context) error {\n    name := \"someone\"\n    if c.NArg() > 0 {\n      name = c.Args()[0]\n    }\n    if language == \"spanish\" {\n      fmt.Println(\"Hola\", name)\n    } else {\n      fmt.Println(\"Hello\", name)\n    }\n    return nil\n  }\n\n  app.Run(os.Args)\n}\n```\n\nSee full list of flags at http://godoc.org/github.com/urfave/cli\n\n#### Placeholder Values\n\nSometimes it's useful to specify a flag's value within the usage string itself.\nSuch placeholders are indicated with back quotes.\n\nFor example this:\n\n<!-- {\n  \"args\": [\"&#45;&#45;help\"],\n  \"output\": \"&#45;&#45;config FILE, &#45;c FILE\"\n} -->\n```go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Flags = []cli.Flag{\n    cli.StringFlag{\n      Name:  \"config, c\",\n      Usage: \"Load configuration from `FILE`\",\n    },\n  }\n\n  app.Run(os.Args)\n}\n```\n\nWill result in help output like:\n\n```\n--config FILE, -c FILE   Load configuration from FILE\n```\n\nNote that only the first placeholder is used. Subsequent back-quoted words will\nbe left as-is.\n\n#### Alternate Names\n\nYou can set alternate (or short) names for flags by providing a comma-delimited\nlist for the `Name`. e.g.\n\n<!-- {\n  \"args\": [\"&#45;&#45;help\"],\n  \"output\": \"&#45;&#45;lang value, &#45;l value.*language for the greeting.*default: \\\"english\\\"\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Flags = []cli.Flag {\n    cli.StringFlag{\n      Name: \"lang, l\",\n      Value: \"english\",\n      Usage: \"language for the greeting\",\n    },\n  }\n\n  app.Run(os.Args)\n}\n```\n\nThat flag can then be set with `--lang spanish` or `-l spanish`. Note that\ngiving two different forms of the same flag in the same command invocation is an\nerror.\n\n#### Ordering\n\nFlags for the application and commands are shown in the order they are defined.\nHowever, it's possible to sort them from outside this library by using `FlagsByName`\nor `CommandsByName` with `sort`.\n\nFor example this:\n\n<!-- {\n  \"args\": [\"&#45;&#45;help\"],\n  \"output\": \"add a task to the list\\n.*complete a task on the list\\n.*\\n\\n.*\\n.*Load configuration from FILE\\n.*Language for the greeting.*\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n  \"sort\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Flags = []cli.Flag {\n    cli.StringFlag{\n      Name: \"lang, l\",\n      Value: \"english\",\n      Usage: \"Language for the greeting\",\n    },\n    cli.StringFlag{\n      Name: \"config, c\",\n      Usage: \"Load configuration from `FILE`\",\n    },\n  }\n\n  app.Commands = []cli.Command{\n    {\n      Name:    \"complete\",\n      Aliases: []string{\"c\"},\n      Usage:   \"complete a task on the list\",\n      Action:  func(c *cli.Context) error {\n        return nil\n      },\n    },\n    {\n      Name:    \"add\",\n      Aliases: []string{\"a\"},\n      Usage:   \"add a task to the list\",\n      Action:  func(c *cli.Context) error {\n        return nil\n      },\n    },\n  }\n\n  sort.Sort(cli.FlagsByName(app.Flags))\n  sort.Sort(cli.CommandsByName(app.Commands))\n\n  app.Run(os.Args)\n}\n```\n\nWill result in help output like:\n\n```\n--config FILE, -c FILE  Load configuration from FILE\n--lang value, -l value  Language for the greeting (default: \"english\")\n```\n\n#### Values from the Environment\n\nYou can also have the default value set from the environment via `EnvVar`.  e.g.\n\n<!-- {\n  \"args\": [\"&#45;&#45;help\"],\n  \"output\": \"language for the greeting.*APP_LANG\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Flags = []cli.Flag {\n    cli.StringFlag{\n      Name: \"lang, l\",\n      Value: \"english\",\n      Usage: \"language for the greeting\",\n      EnvVar: \"APP_LANG\",\n    },\n  }\n\n  app.Run(os.Args)\n}\n```\n\nThe `EnvVar` may also be given as a comma-delimited \"cascade\", where the first\nenvironment variable that resolves is used as the default.\n\n<!-- {\n  \"args\": [\"&#45;&#45;help\"],\n  \"output\": \"language for the greeting.*LEGACY_COMPAT_LANG.*APP_LANG.*LANG\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Flags = []cli.Flag {\n    cli.StringFlag{\n      Name: \"lang, l\",\n      Value: \"english\",\n      Usage: \"language for the greeting\",\n      EnvVar: \"LEGACY_COMPAT_LANG,APP_LANG,LANG\",\n    },\n  }\n\n  app.Run(os.Args)\n}\n```\n\n#### Values from alternate input sources (YAML, TOML, and others)\n\nThere is a separate package altsrc that adds support for getting flag values\nfrom other file input sources.\n\nCurrently supported input source formats:\n* YAML\n* TOML\n\nIn order to get values for a flag from an alternate input source the following\ncode would be added to wrap an existing cli.Flag like below:\n\n``` go\n  altsrc.NewIntFlag(cli.IntFlag{Name: \"test\"})\n```\n\nInitialization must also occur for these flags. Below is an example initializing\ngetting data from a yaml file below.\n\n``` go\n  command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc(\"load\"))\n```\n\nThe code above will use the \"load\" string as a flag name to get the file name of\na yaml file from the cli.Context.  It will then use that file name to initialize\nthe yaml input source for any flags that are defined on that command.  As a note\nthe \"load\" flag used would also have to be defined on the command flags in order\nfor this code snipped to work.\n\nCurrently only the aboved specified formats are supported but developers can\nadd support for other input sources by implementing the\naltsrc.InputSourceContext for their given sources.\n\nHere is a more complete sample of a command using YAML support:\n\n<!-- {\n  \"args\": [\"test-cmd\", \"&#45;&#45;help\"],\n  \"output\": \"&#45&#45;test value.*default: 0\"\n} -->\n``` go\npackage notmain\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n  \"github.com/urfave/cli/altsrc\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  flags := []cli.Flag{\n    altsrc.NewIntFlag(cli.IntFlag{Name: \"test\"}),\n    cli.StringFlag{Name: \"load\"},\n  }\n\n  app.Action = func(c *cli.Context) error {\n    fmt.Println(\"yaml ist rad\")\n    return nil\n  }\n\n  app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc(\"load\"))\n  app.Flags = flags\n\n  app.Run(os.Args)\n}\n```\n\n### Subcommands\n\nSubcommands can be defined for a more git-like command line app.\n\n<!-- {\n  \"args\": [\"template\", \"add\"],\n  \"output\": \"new task template: .+\"\n} -->\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Commands = []cli.Command{\n    {\n      Name:    \"add\",\n      Aliases: []string{\"a\"},\n      Usage:   \"add a task to the list\",\n      Action:  func(c *cli.Context) error {\n        fmt.Println(\"added task: \", c.Args().First())\n        return nil\n      },\n    },\n    {\n      Name:    \"complete\",\n      Aliases: []string{\"c\"},\n      Usage:   \"complete a task on the list\",\n      Action:  func(c *cli.Context) error {\n        fmt.Println(\"completed task: \", c.Args().First())\n        return nil\n      },\n    },\n    {\n      Name:        \"template\",\n      Aliases:     []string{\"t\"},\n      Usage:       \"options for task templates\",\n      Subcommands: []cli.Command{\n        {\n          Name:  \"add\",\n          Usage: \"add a new template\",\n          Action: func(c *cli.Context) error {\n            fmt.Println(\"new task template: \", c.Args().First())\n            return nil\n          },\n        },\n        {\n          Name:  \"remove\",\n          Usage: \"remove an existing template\",\n          Action: func(c *cli.Context) error {\n            fmt.Println(\"removed task template: \", c.Args().First())\n            return nil\n          },\n        },\n      },\n    },\n  }\n\n  app.Run(os.Args)\n}\n```\n\n### Subcommands categories\n\nFor additional organization in apps that have many subcommands, you can\nassociate a category for each command to group them together in the help\noutput.\n\nE.g.\n\n```go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n\n  app.Commands = []cli.Command{\n    {\n      Name: \"noop\",\n    },\n    {\n      Name:     \"add\",\n      Category: \"template\",\n    },\n    {\n      Name:     \"remove\",\n      Category: \"template\",\n    },\n  }\n\n  app.Run(os.Args)\n}\n```\n\nWill include:\n\n```\nCOMMANDS:\n    noop\n\n  Template actions:\n    add\n    remove\n```\n\n### Exit code\n\nCalling `App.Run` will not automatically call `os.Exit`, which means that by\ndefault the exit code will \"fall through\" to being `0`.  An explicit exit code\nmay be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a\n`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.:\n\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  app := cli.NewApp()\n  app.Flags = []cli.Flag{\n    cli.BoolTFlag{\n      Name:  \"ginger-crouton\",\n      Usage: \"is it in the soup?\",\n    },\n  }\n  app.Action = func(ctx *cli.Context) error {\n    if !ctx.Bool(\"ginger-crouton\") {\n      return cli.NewExitError(\"it is not in the soup\", 86)\n    }\n    return nil\n  }\n\n  app.Run(os.Args)\n}\n```\n\n### Bash Completion\n\nYou can enable completion commands by setting the `EnableBashCompletion`\nflag on the `App` object.  By default, this setting will only auto-complete to\nshow an app's subcommands, but you can write your own completion methods for\nthe App or its subcommands.\n\n<!-- {\n  \"args\": [\"complete\", \"&#45;&#45;generate&#45;bash&#45;completion\"],\n  \"output\": \"laundry\"\n} -->\n``` go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  tasks := []string{\"cook\", \"clean\", \"laundry\", \"eat\", \"sleep\", \"code\"}\n\n  app := cli.NewApp()\n  app.EnableBashCompletion = true\n  app.Commands = []cli.Command{\n    {\n      Name:  \"complete\",\n      Aliases: []string{\"c\"},\n      Usage: \"complete a task on the list\",\n      Action: func(c *cli.Context) error {\n         fmt.Println(\"completed task: \", c.Args().First())\n         return nil\n      },\n      BashComplete: func(c *cli.Context) {\n        // This will complete if no args are passed\n        if c.NArg() > 0 {\n          return\n        }\n        for _, t := range tasks {\n          fmt.Println(t)\n        }\n      },\n    },\n  }\n\n  app.Run(os.Args)\n}\n```\n\n#### Enabling\n\nSource the `autocomplete/bash_autocomplete` file in your `.bashrc` file while\nsetting the `PROG` variable to the name of your program:\n\n`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete`\n\n#### Distribution\n\nCopy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename\nit to the name of the program you wish to add autocomplete support for (or\nautomatically install it there if you are distributing a package). Don't forget\nto source the file to make it active in the current shell.\n\n```\nsudo cp src/bash_autocomplete /etc/bash_completion.d/<myprogram>\nsource /etc/bash_completion.d/<myprogram>\n```\n\nAlternatively, you can just document that users should source the generic\n`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set\nto the name of their program (as above).\n\n#### Customization\n\nThe default bash completion flag (`--generate-bash-completion`) is defined as\n`cli.BashCompletionFlag`, and may be redefined if desired, e.g.:\n\n<!-- {\n  \"args\": [\"&#45;&#45;compgen\"],\n  \"output\": \"wat\\nhelp\\nh\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  cli.BashCompletionFlag = cli.BoolFlag{\n    Name:   \"compgen\",\n    Hidden: true,\n  }\n\n  app := cli.NewApp()\n  app.EnableBashCompletion = true\n  app.Commands = []cli.Command{\n    {\n      Name: \"wat\",\n    },\n  }\n  app.Run(os.Args)\n}\n```\n\n### Generated Help Text\n\nThe default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked\nby the cli internals in order to print generated help text for the app, command,\nor subcommand, and break execution.\n\n#### Customization\n\nAll of the help text generation may be customized, and at multiple levels.  The\ntemplates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and\n`SubcommandHelpTemplate` which may be reassigned or augmented, and full override\nis possible by assigning a compatible func to the `cli.HelpPrinter` variable,\ne.g.:\n\n<!-- {\n  \"output\": \"Ha HA.  I pwnd the help!!1\"\n} -->\n``` go\npackage main\n\nimport (\n  \"fmt\"\n  \"io\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  // EXAMPLE: Append to an existing template\n  cli.AppHelpTemplate = fmt.Sprintf(`%s\n\nWEBSITE: http://awesometown.example.com\n\nSUPPORT: support@awesometown.example.com\n\n`, cli.AppHelpTemplate)\n\n  // EXAMPLE: Override a template\n  cli.AppHelpTemplate = `NAME:\n   {{.Name}} - {{.Usage}}\nUSAGE:\n   {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}\n   {{if len .Authors}}\nAUTHOR:\n   {{range .Authors}}{{ . }}{{end}}\n   {{end}}{{if .Commands}}\nCOMMANDS:\n{{range .Commands}}{{if not .HideHelp}}   {{join .Names \", \"}}{{ \"\\t\"}}{{.Usage}}{{ \"\\n\" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}}\nGLOBAL OPTIONS:\n   {{range .VisibleFlags}}{{.}}\n   {{end}}{{end}}{{if .Copyright }}\nCOPYRIGHT:\n   {{.Copyright}}\n   {{end}}{{if .Version}}\nVERSION:\n   {{.Version}}\n   {{end}}\n`\n\n  // EXAMPLE: Replace the `HelpPrinter` func\n  cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) {\n    fmt.Println(\"Ha HA.  I pwnd the help!!1\")\n  }\n\n  cli.NewApp().Run(os.Args)\n}\n```\n\nThe default flag may be customized to something other than `-h/--help` by\nsetting `cli.HelpFlag`, e.g.:\n\n<!-- {\n  \"args\": [\"&#45;&#45halp\"],\n  \"output\": \"haaaaalp.*HALP\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  cli.HelpFlag = cli.BoolFlag{\n    Name: \"halp, haaaaalp\",\n    Usage: \"HALP\",\n    EnvVar: \"SHOW_HALP,HALPPLZ\",\n  }\n\n  cli.NewApp().Run(os.Args)\n}\n```\n\n### Version Flag\n\nThe default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which\nis checked by the cli internals in order to print the `App.Version` via\n`cli.VersionPrinter` and break execution.\n\n#### Customization\n\nThe default flag may be customized to something other than `-v/--version` by\nsetting `cli.VersionFlag`, e.g.:\n\n<!-- {\n  \"args\": [\"&#45;&#45print-version\"],\n  \"output\": \"partay version 19\\\\.99\\\\.0\"\n} -->\n``` go\npackage main\n\nimport (\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc main() {\n  cli.VersionFlag = cli.BoolFlag{\n    Name: \"print-version, V\",\n    Usage: \"print only the version\",\n  }\n\n  app := cli.NewApp()\n  app.Name = \"partay\"\n  app.Version = \"19.99.0\"\n  app.Run(os.Args)\n}\n```\n\nAlternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.:\n\n<!-- {\n  \"args\": [\"&#45;&#45version\"],\n  \"output\": \"version=19\\\\.99\\\\.0 revision=fafafaf\"\n} -->\n``` go\npackage main\n\nimport (\n  \"fmt\"\n  \"os\"\n\n  \"github.com/urfave/cli\"\n)\n\nvar (\n  Revision = \"fafafaf\"\n)\n\nfunc main() {\n  cli.VersionPrinter = func(c *cli.Context) {\n    fmt.Printf(\"version=%s revision=%s\\n\", c.App.Version, Revision)\n  }\n\n  app := cli.NewApp()\n  app.Name = \"partay\"\n  app.Version = \"19.99.0\"\n  app.Run(os.Args)\n}\n```\n\n#### Full API Example\n\n**Notice**: This is a contrived (functioning) example meant strictly for API\ndemonstration purposes.  Use of one's imagination is encouraged.\n\n<!-- {\n  \"output\": \"made it!\\nPhew!\"\n} -->\n``` go\npackage main\n\nimport (\n  \"errors\"\n  \"flag\"\n  \"fmt\"\n  \"io\"\n  \"io/ioutil\"\n  \"os\"\n  \"time\"\n\n  \"github.com/urfave/cli\"\n)\n\nfunc init() {\n  cli.AppHelpTemplate += \"\\nCUSTOMIZED: you bet ur muffins\\n\"\n  cli.CommandHelpTemplate += \"\\nYMMV\\n\"\n  cli.SubcommandHelpTemplate += \"\\nor something\\n\"\n\n  cli.HelpFlag = cli.BoolFlag{Name: \"halp\"}\n  cli.BashCompletionFlag = cli.BoolFlag{Name: \"compgen\", Hidden: true}\n  cli.VersionFlag = cli.BoolFlag{Name: \"print-version, V\"}\n\n  cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) {\n    fmt.Fprintf(w, \"best of luck to you\\n\")\n  }\n  cli.VersionPrinter = func(c *cli.Context) {\n    fmt.Fprintf(c.App.Writer, \"version=%s\\n\", c.App.Version)\n  }\n  cli.OsExiter = func(c int) {\n    fmt.Fprintf(cli.ErrWriter, \"refusing to exit %d\\n\", c)\n  }\n  cli.ErrWriter = ioutil.Discard\n  cli.FlagStringer = func(fl cli.Flag) string {\n    return fmt.Sprintf(\"\\t\\t%s\", fl.GetName())\n  }\n}\n\ntype hexWriter struct{}\n\nfunc (w *hexWriter) Write(p []byte) (int, error) {\n  for _, b := range p {\n    fmt.Printf(\"%x\", b)\n  }\n  fmt.Printf(\"\\n\")\n\n  return len(p), nil\n}\n\ntype genericType struct{\n  s string\n}\n\nfunc (g *genericType) Set(value string) error {\n  g.s = value\n  return nil\n}\n\nfunc (g *genericType) String() string {\n  return g.s\n}\n\nfunc main() {\n  app := cli.NewApp()\n  app.Name = \"kənˈtrīv\"\n  app.Version = \"19.99.0\"\n  app.Compiled = time.Now()\n  app.Authors = []cli.Author{\n    cli.Author{\n      Name:  \"Example Human\",\n      Email: \"human@example.com\",\n    },\n  }\n  app.Copyright = \"(c) 1999 Serious Enterprise\"\n  app.HelpName = \"contrive\"\n  app.Usage = \"demonstrate available API\"\n  app.UsageText = \"contrive - demonstrating the available API\"\n  app.ArgsUsage = \"[args and such]\"\n  app.Commands = []cli.Command{\n    cli.Command{\n      Name:        \"doo\",\n      Aliases:     []string{\"do\"},\n      Category:    \"motion\",\n      Usage:       \"do the doo\",\n      UsageText:   \"doo - does the dooing\",\n      Description: \"no really, there is a lot of dooing to be done\",\n      ArgsUsage:   \"[arrgh]\",\n      Flags: []cli.Flag{\n        cli.BoolFlag{Name: \"forever, forevvarr\"},\n      },\n      Subcommands: cli.Commands{\n        cli.Command{\n          Name:   \"wop\",\n          Action: wopAction,\n        },\n      },\n      SkipFlagParsing: false,\n      HideHelp:        false,\n      Hidden:          false,\n      HelpName:        \"doo!\",\n      BashComplete: func(c *cli.Context) {\n        fmt.Fprintf(c.App.Writer, \"--better\\n\")\n      },\n      Before: func(c *cli.Context) error {\n        fmt.Fprintf(c.App.Writer, \"brace for impact\\n\")\n        return nil\n      },\n      After: func(c *cli.Context) error {\n        fmt.Fprintf(c.App.Writer, \"did we lose anyone?\\n\")\n        return nil\n      },\n      Action: func(c *cli.Context) error {\n        c.Command.FullName()\n        c.Command.HasName(\"wop\")\n        c.Command.Names()\n        c.Command.VisibleFlags()\n        fmt.Fprintf(c.App.Writer, \"dodododododoodododddooooododododooo\\n\")\n        if c.Bool(\"forever\") {\n          c.Command.Run(c)\n        }\n        return nil\n      },\n      OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error {\n        fmt.Fprintf(c.App.Writer, \"for shame\\n\")\n        return err\n      },\n    },\n  }\n  app.Flags = []cli.Flag{\n    cli.BoolFlag{Name: \"fancy\"},\n    cli.BoolTFlag{Name: \"fancier\"},\n    cli.DurationFlag{Name: \"howlong, H\", Value: time.Second * 3},\n    cli.Float64Flag{Name: \"howmuch\"},\n    cli.GenericFlag{Name: \"wat\", Value: &genericType{}},\n    cli.Int64Flag{Name: \"longdistance\"},\n    cli.Int64SliceFlag{Name: \"intervals\"},\n    cli.IntFlag{Name: \"distance\"},\n    cli.IntSliceFlag{Name: \"times\"},\n    cli.StringFlag{Name: \"dance-move, d\"},\n    cli.StringSliceFlag{Name: \"names, N\"},\n    cli.UintFlag{Name: \"age\"},\n    cli.Uint64Flag{Name: \"bigage\"},\n  }\n  app.EnableBashCompletion = true\n  app.HideHelp = false\n  app.HideVersion = false\n  app.BashComplete = func(c *cli.Context) {\n    fmt.Fprintf(c.App.Writer, \"lipstick\\nkiss\\nme\\nlipstick\\nringo\\n\")\n  }\n  app.Before = func(c *cli.Context) error {\n    fmt.Fprintf(c.App.Writer, \"HEEEERE GOES\\n\")\n    return nil\n  }\n  app.After = func(c *cli.Context) error {\n    fmt.Fprintf(c.App.Writer, \"Phew!\\n\")\n    return nil\n  }\n  app.CommandNotFound = func(c *cli.Context, command string) {\n    fmt.Fprintf(c.App.Writer, \"Thar be no %q here.\\n\", command)\n  }\n  app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error {\n    if isSubcommand {\n      return err\n    }\n\n    fmt.Fprintf(c.App.Writer, \"WRONG: %#v\\n\", err)\n    return nil\n  }\n  app.Action = func(c *cli.Context) error {\n    cli.DefaultAppComplete(c)\n    cli.HandleExitCoder(errors.New(\"not an exit coder, though\"))\n    cli.ShowAppHelp(c)\n    cli.ShowCommandCompletions(c, \"nope\")\n    cli.ShowCommandHelp(c, \"also-nope\")\n    cli.ShowCompletions(c)\n    cli.ShowSubcommandHelp(c)\n    cli.ShowVersion(c)\n\n    categories := c.App.Categories()\n    categories.AddCommand(\"sounds\", cli.Command{\n      Name: \"bloop\",\n    })\n\n    for _, category := range c.App.Categories() {\n      fmt.Fprintf(c.App.Writer, \"%s\\n\", category.Name)\n      fmt.Fprintf(c.App.Writer, \"%#v\\n\", category.Commands)\n      fmt.Fprintf(c.App.Writer, \"%#v\\n\", category.VisibleCommands())\n    }\n\n    fmt.Printf(\"%#v\\n\", c.App.Command(\"doo\"))\n    if c.Bool(\"infinite\") {\n      c.App.Run([]string{\"app\", \"doo\", \"wop\"})\n    }\n\n    if c.Bool(\"forevar\") {\n      c.App.RunAsSubcommand(c)\n    }\n    c.App.Setup()\n    fmt.Printf(\"%#v\\n\", c.App.VisibleCategories())\n    fmt.Printf(\"%#v\\n\", c.App.VisibleCommands())\n    fmt.Printf(\"%#v\\n\", c.App.VisibleFlags())\n\n    fmt.Printf(\"%#v\\n\", c.Args().First())\n    if len(c.Args()) > 0 {\n      fmt.Printf(\"%#v\\n\", c.Args()[1])\n    }\n    fmt.Printf(\"%#v\\n\", c.Args().Present())\n    fmt.Printf(\"%#v\\n\", c.Args().Tail())\n\n    set := flag.NewFlagSet(\"contrive\", 0)\n    nc := cli.NewContext(c.App, set, c)\n\n    fmt.Printf(\"%#v\\n\", nc.Args())\n    fmt.Printf(\"%#v\\n\", nc.Bool(\"nope\"))\n    fmt.Printf(\"%#v\\n\", nc.BoolT(\"nerp\"))\n    fmt.Printf(\"%#v\\n\", nc.Duration(\"howlong\"))\n    fmt.Printf(\"%#v\\n\", nc.Float64(\"hay\"))\n    fmt.Printf(\"%#v\\n\", nc.Generic(\"bloop\"))\n    fmt.Printf(\"%#v\\n\", nc.Int64(\"bonk\"))\n    fmt.Printf(\"%#v\\n\", nc.Int64Slice(\"burnks\"))\n    fmt.Printf(\"%#v\\n\", nc.Int(\"bips\"))\n    fmt.Printf(\"%#v\\n\", nc.IntSlice(\"blups\"))\n    fmt.Printf(\"%#v\\n\", nc.String(\"snurt\"))\n    fmt.Printf(\"%#v\\n\", nc.StringSlice(\"snurkles\"))\n    fmt.Printf(\"%#v\\n\", nc.Uint(\"flub\"))\n    fmt.Printf(\"%#v\\n\", nc.Uint64(\"florb\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalBool(\"global-nope\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalBoolT(\"global-nerp\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalDuration(\"global-howlong\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalFloat64(\"global-hay\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalGeneric(\"global-bloop\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalInt(\"global-bips\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalIntSlice(\"global-blups\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalString(\"global-snurt\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalStringSlice(\"global-snurkles\"))\n\n    fmt.Printf(\"%#v\\n\", nc.FlagNames())\n    fmt.Printf(\"%#v\\n\", nc.GlobalFlagNames())\n    fmt.Printf(\"%#v\\n\", nc.GlobalIsSet(\"wat\"))\n    fmt.Printf(\"%#v\\n\", nc.GlobalSet(\"wat\", \"nope\"))\n    fmt.Printf(\"%#v\\n\", nc.NArg())\n    fmt.Printf(\"%#v\\n\", nc.NumFlags())\n    fmt.Printf(\"%#v\\n\", nc.Parent())\n\n    nc.Set(\"wat\", \"also-nope\")\n\n    ec := cli.NewExitError(\"ohwell\", 86)\n    fmt.Fprintf(c.App.Writer, \"%d\", ec.ExitCode())\n    fmt.Printf(\"made it!\\n\")\n    return ec\n  }\n\n  if os.Getenv(\"HEXY\") != \"\" {\n    app.Writer = &hexWriter{}\n    app.ErrWriter = &hexWriter{}\n  }\n\n  app.Metadata = map[string]interface{}{\n    \"layers\":     \"many\",\n    \"explicable\": false,\n    \"whatever-values\": 19.99,\n  }\n\n  app.Run(os.Args)\n}\n\nfunc wopAction(c *cli.Context) error {\n  fmt.Fprintf(c.App.Writer, \":wave: over here, eh\\n\")\n  return nil\n}\n```\n\n## Contribution Guidelines\n\nFeel free to put up a pull request to fix a bug or maybe add a feature. I will\ngive it a code review and make sure that it does not break backwards\ncompatibility. If I or any other collaborators agree that it is in line with\nthe vision of the project, we will work with you to get the code into\na mergeable state and merge it into the master branch.\n\nIf you have contributed something significant to the project, we will most\nlikely add you as a collaborator. As a collaborator you are given the ability\nto merge others pull requests. It is very important that new code does not\nbreak existing code, so be careful about what code you do choose to merge.\n\nIf you feel like you have contributed to the project but have not yet been\nadded as a collaborator, we probably forgot to add you, please open an issue.\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/app.go",
    "content": "package cli\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"time\"\n)\n\nvar (\n\tchangeLogURL                    = \"https://github.com/urfave/cli/blob/master/CHANGELOG.md\"\n\tappActionDeprecationURL         = fmt.Sprintf(\"%s#deprecated-cli-app-action-signature\", changeLogURL)\n\trunAndExitOnErrorDeprecationURL = fmt.Sprintf(\"%s#deprecated-cli-app-runandexitonerror\", changeLogURL)\n\n\tcontactSysadmin = \"This is an error in the application.  Please contact the distributor of this application if this is not you.\"\n\n\terrInvalidActionType = NewExitError(\"ERROR invalid Action type. \"+\n\t\tfmt.Sprintf(\"Must be `func(*Context`)` or `func(*Context) error).  %s\", contactSysadmin)+\n\t\tfmt.Sprintf(\"See %s\", appActionDeprecationURL), 2)\n)\n\n// App is the main structure of a cli application. It is recommended that\n// an app be created with the cli.NewApp() function\ntype App struct {\n\t// The name of the program. Defaults to path.Base(os.Args[0])\n\tName string\n\t// Full name of command for help, defaults to Name\n\tHelpName string\n\t// Description of the program.\n\tUsage string\n\t// Text to override the USAGE section of help\n\tUsageText string\n\t// Description of the program argument format.\n\tArgsUsage string\n\t// Version of the program\n\tVersion string\n\t// Description of the program\n\tDescription string\n\t// List of commands to execute\n\tCommands []Command\n\t// List of flags to parse\n\tFlags []Flag\n\t// Boolean to enable bash completion commands\n\tEnableBashCompletion bool\n\t// Boolean to hide built-in help command\n\tHideHelp bool\n\t// Boolean to hide built-in version flag and the VERSION section of help\n\tHideVersion bool\n\t// Populate on app startup, only gettable through method Categories()\n\tcategories CommandCategories\n\t// An action to execute when the bash-completion flag is set\n\tBashComplete BashCompleteFunc\n\t// An action to execute before any subcommands are run, but after the context is ready\n\t// If a non-nil error is returned, no subcommands are run\n\tBefore BeforeFunc\n\t// An action to execute after any subcommands are run, but after the subcommand has finished\n\t// It is run even if Action() panics\n\tAfter AfterFunc\n\n\t// The action to execute when no subcommands are specified\n\t// Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}`\n\t// *Note*: support for the deprecated `Action` signature will be removed in a future version\n\tAction interface{}\n\n\t// Execute this function if the proper command cannot be found\n\tCommandNotFound CommandNotFoundFunc\n\t// Execute this function if an usage error occurs\n\tOnUsageError OnUsageErrorFunc\n\t// Compilation date\n\tCompiled time.Time\n\t// List of all authors who contributed\n\tAuthors []Author\n\t// Copyright of the binary if any\n\tCopyright string\n\t// Name of Author (Note: Use App.Authors, this is deprecated)\n\tAuthor string\n\t// Email of Author (Note: Use App.Authors, this is deprecated)\n\tEmail string\n\t// Writer writer to write output to\n\tWriter io.Writer\n\t// ErrWriter writes error output\n\tErrWriter io.Writer\n\t// Other custom info\n\tMetadata map[string]interface{}\n\t// Carries a function which returns app specific info.\n\tExtraInfo func() map[string]string\n\t// CustomAppHelpTemplate the text template for app help topic.\n\t// cli.go uses text/template to render templates. You can\n\t// render custom help text by setting this variable.\n\tCustomAppHelpTemplate string\n\n\tdidSetup bool\n}\n\n// Tries to find out when this binary was compiled.\n// Returns the current time if it fails to find it.\nfunc compileTime() time.Time {\n\tinfo, err := os.Stat(os.Args[0])\n\tif err != nil {\n\t\treturn time.Now()\n\t}\n\treturn info.ModTime()\n}\n\n// NewApp creates a new cli Application with some reasonable defaults for Name,\n// Usage, Version and Action.\nfunc NewApp() *App {\n\treturn &App{\n\t\tName:         filepath.Base(os.Args[0]),\n\t\tHelpName:     filepath.Base(os.Args[0]),\n\t\tUsage:        \"A new cli application\",\n\t\tUsageText:    \"\",\n\t\tVersion:      \"0.0.0\",\n\t\tBashComplete: DefaultAppComplete,\n\t\tAction:       helpCommand.Action,\n\t\tCompiled:     compileTime(),\n\t\tWriter:       os.Stdout,\n\t}\n}\n\n// Setup runs initialization code to ensure all data structures are ready for\n// `Run` or inspection prior to `Run`.  It is internally called by `Run`, but\n// will return early if setup has already happened.\nfunc (a *App) Setup() {\n\tif a.didSetup {\n\t\treturn\n\t}\n\n\ta.didSetup = true\n\n\tif a.Author != \"\" || a.Email != \"\" {\n\t\ta.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email})\n\t}\n\n\tnewCmds := []Command{}\n\tfor _, c := range a.Commands {\n\t\tif c.HelpName == \"\" {\n\t\t\tc.HelpName = fmt.Sprintf(\"%s %s\", a.HelpName, c.Name)\n\t\t}\n\t\tnewCmds = append(newCmds, c)\n\t}\n\ta.Commands = newCmds\n\n\tif a.Command(helpCommand.Name) == nil && !a.HideHelp {\n\t\ta.Commands = append(a.Commands, helpCommand)\n\t\tif (HelpFlag != BoolFlag{}) {\n\t\t\ta.appendFlag(HelpFlag)\n\t\t}\n\t}\n\n\tif !a.HideVersion {\n\t\ta.appendFlag(VersionFlag)\n\t}\n\n\ta.categories = CommandCategories{}\n\tfor _, command := range a.Commands {\n\t\ta.categories = a.categories.AddCommand(command.Category, command)\n\t}\n\tsort.Sort(a.categories)\n\n\tif a.Metadata == nil {\n\t\ta.Metadata = make(map[string]interface{})\n\t}\n\n\tif a.Writer == nil {\n\t\ta.Writer = os.Stdout\n\t}\n}\n\n// Run is the entry point to the cli app. Parses the arguments slice and routes\n// to the proper flag/args combination\nfunc (a *App) Run(arguments []string) (err error) {\n\ta.Setup()\n\n\t// handle the completion flag separately from the flagset since\n\t// completion could be attempted after a flag, but before its value was put\n\t// on the command line. this causes the flagset to interpret the completion\n\t// flag name as the value of the flag before it which is undesirable\n\t// note that we can only do this because the shell autocomplete function\n\t// always appends the completion flag at the end of the command\n\tshellComplete, arguments := checkShellCompleteFlag(a, arguments)\n\n\t// parse flags\n\tset, err := flagSet(a.Name, a.Flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tset.SetOutput(ioutil.Discard)\n\terr = set.Parse(arguments[1:])\n\tnerr := normalizeFlags(a.Flags, set)\n\tcontext := NewContext(a, set, nil)\n\tif nerr != nil {\n\t\tfmt.Fprintln(a.Writer, nerr)\n\t\tShowAppHelp(context)\n\t\treturn nerr\n\t}\n\tcontext.shellComplete = shellComplete\n\n\tif checkCompletions(context) {\n\t\treturn nil\n\t}\n\n\tif err != nil {\n\t\tif a.OnUsageError != nil {\n\t\t\terr := a.OnUsageError(context, err, false)\n\t\t\tHandleExitCoder(err)\n\t\t\treturn err\n\t\t}\n\t\tfmt.Fprintf(a.Writer, \"%s %s\\n\\n\", \"Incorrect Usage.\", err.Error())\n\t\tShowAppHelp(context)\n\t\treturn err\n\t}\n\n\tif !a.HideHelp && checkHelp(context) {\n\t\tShowAppHelp(context)\n\t\treturn nil\n\t}\n\n\tif !a.HideVersion && checkVersion(context) {\n\t\tShowVersion(context)\n\t\treturn nil\n\t}\n\n\tif a.After != nil {\n\t\tdefer func() {\n\t\t\tif afterErr := a.After(context); afterErr != nil {\n\t\t\t\tif err != nil {\n\t\t\t\t\terr = NewMultiError(err, afterErr)\n\t\t\t\t} else {\n\t\t\t\t\terr = afterErr\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n\n\tif a.Before != nil {\n\t\tbeforeErr := a.Before(context)\n\t\tif beforeErr != nil {\n\t\t\tShowAppHelp(context)\n\t\t\tHandleExitCoder(beforeErr)\n\t\t\terr = beforeErr\n\t\t\treturn err\n\t\t}\n\t}\n\n\targs := context.Args()\n\tif args.Present() {\n\t\tname := args.First()\n\t\tc := a.Command(name)\n\t\tif c != nil {\n\t\t\treturn c.Run(context)\n\t\t}\n\t}\n\n\tif a.Action == nil {\n\t\ta.Action = helpCommand.Action\n\t}\n\n\t// Run default Action\n\terr = HandleAction(a.Action, context)\n\n\tHandleExitCoder(err)\n\treturn err\n}\n\n// RunAndExitOnError calls .Run() and exits non-zero if an error was returned\n//\n// Deprecated: instead you should return an error that fulfills cli.ExitCoder\n// to cli.App.Run. This will cause the application to exit with the given eror\n// code in the cli.ExitCoder\nfunc (a *App) RunAndExitOnError() {\n\tif err := a.Run(os.Args); err != nil {\n\t\tfmt.Fprintln(a.errWriter(), err)\n\t\tOsExiter(1)\n\t}\n}\n\n// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to\n// generate command-specific flags\nfunc (a *App) RunAsSubcommand(ctx *Context) (err error) {\n\t// append help to commands\n\tif len(a.Commands) > 0 {\n\t\tif a.Command(helpCommand.Name) == nil && !a.HideHelp {\n\t\t\ta.Commands = append(a.Commands, helpCommand)\n\t\t\tif (HelpFlag != BoolFlag{}) {\n\t\t\t\ta.appendFlag(HelpFlag)\n\t\t\t}\n\t\t}\n\t}\n\n\tnewCmds := []Command{}\n\tfor _, c := range a.Commands {\n\t\tif c.HelpName == \"\" {\n\t\t\tc.HelpName = fmt.Sprintf(\"%s %s\", a.HelpName, c.Name)\n\t\t}\n\t\tnewCmds = append(newCmds, c)\n\t}\n\ta.Commands = newCmds\n\n\t// parse flags\n\tset, err := flagSet(a.Name, a.Flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tset.SetOutput(ioutil.Discard)\n\terr = set.Parse(ctx.Args().Tail())\n\tnerr := normalizeFlags(a.Flags, set)\n\tcontext := NewContext(a, set, ctx)\n\n\tif nerr != nil {\n\t\tfmt.Fprintln(a.Writer, nerr)\n\t\tfmt.Fprintln(a.Writer)\n\t\tif len(a.Commands) > 0 {\n\t\t\tShowSubcommandHelp(context)\n\t\t} else {\n\t\t\tShowCommandHelp(ctx, context.Args().First())\n\t\t}\n\t\treturn nerr\n\t}\n\n\tif checkCompletions(context) {\n\t\treturn nil\n\t}\n\n\tif err != nil {\n\t\tif a.OnUsageError != nil {\n\t\t\terr = a.OnUsageError(context, err, true)\n\t\t\tHandleExitCoder(err)\n\t\t\treturn err\n\t\t}\n\t\tfmt.Fprintf(a.Writer, \"%s %s\\n\\n\", \"Incorrect Usage.\", err.Error())\n\t\tShowSubcommandHelp(context)\n\t\treturn err\n\t}\n\n\tif len(a.Commands) > 0 {\n\t\tif checkSubcommandHelp(context) {\n\t\t\treturn nil\n\t\t}\n\t} else {\n\t\tif checkCommandHelp(ctx, context.Args().First()) {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tif a.After != nil {\n\t\tdefer func() {\n\t\t\tafterErr := a.After(context)\n\t\t\tif afterErr != nil {\n\t\t\t\tHandleExitCoder(err)\n\t\t\t\tif err != nil {\n\t\t\t\t\terr = NewMultiError(err, afterErr)\n\t\t\t\t} else {\n\t\t\t\t\terr = afterErr\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n\n\tif a.Before != nil {\n\t\tbeforeErr := a.Before(context)\n\t\tif beforeErr != nil {\n\t\t\tHandleExitCoder(beforeErr)\n\t\t\terr = beforeErr\n\t\t\treturn err\n\t\t}\n\t}\n\n\targs := context.Args()\n\tif args.Present() {\n\t\tname := args.First()\n\t\tc := a.Command(name)\n\t\tif c != nil {\n\t\t\treturn c.Run(context)\n\t\t}\n\t}\n\n\t// Run default Action\n\terr = HandleAction(a.Action, context)\n\n\tHandleExitCoder(err)\n\treturn err\n}\n\n// Command returns the named command on App. Returns nil if the command does not exist\nfunc (a *App) Command(name string) *Command {\n\tfor _, c := range a.Commands {\n\t\tif c.HasName(name) {\n\t\t\treturn &c\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Categories returns a slice containing all the categories with the commands they contain\nfunc (a *App) Categories() CommandCategories {\n\treturn a.categories\n}\n\n// VisibleCategories returns a slice of categories and commands that are\n// Hidden=false\nfunc (a *App) VisibleCategories() []*CommandCategory {\n\tret := []*CommandCategory{}\n\tfor _, category := range a.categories {\n\t\tif visible := func() *CommandCategory {\n\t\t\tfor _, command := range category.Commands {\n\t\t\t\tif !command.Hidden {\n\t\t\t\t\treturn category\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn nil\n\t\t}(); visible != nil {\n\t\t\tret = append(ret, visible)\n\t\t}\n\t}\n\treturn ret\n}\n\n// VisibleCommands returns a slice of the Commands with Hidden=false\nfunc (a *App) VisibleCommands() []Command {\n\tret := []Command{}\n\tfor _, command := range a.Commands {\n\t\tif !command.Hidden {\n\t\t\tret = append(ret, command)\n\t\t}\n\t}\n\treturn ret\n}\n\n// VisibleFlags returns a slice of the Flags with Hidden=false\nfunc (a *App) VisibleFlags() []Flag {\n\treturn visibleFlags(a.Flags)\n}\n\nfunc (a *App) hasFlag(flag Flag) bool {\n\tfor _, f := range a.Flags {\n\t\tif flag == f {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc (a *App) errWriter() io.Writer {\n\n\t// When the app ErrWriter is nil use the package level one.\n\tif a.ErrWriter == nil {\n\t\treturn ErrWriter\n\t}\n\n\treturn a.ErrWriter\n}\n\nfunc (a *App) appendFlag(flag Flag) {\n\tif !a.hasFlag(flag) {\n\t\ta.Flags = append(a.Flags, flag)\n\t}\n}\n\n// Author represents someone who has contributed to a cli project.\ntype Author struct {\n\tName  string // The Authors name\n\tEmail string // The Authors email\n}\n\n// String makes Author comply to the Stringer interface, to allow an easy print in the templating process\nfunc (a Author) String() string {\n\te := \"\"\n\tif a.Email != \"\" {\n\t\te = \" <\" + a.Email + \">\"\n\t}\n\n\treturn fmt.Sprintf(\"%v%v\", a.Name, e)\n}\n\n// HandleAction attempts to figure out which Action signature was used.  If\n// it's an ActionFunc or a func with the legacy signature for Action, the func\n// is run!\nfunc HandleAction(action interface{}, context *Context) (err error) {\n\tif a, ok := action.(ActionFunc); ok {\n\t\treturn a(context)\n\t} else if a, ok := action.(func(*Context) error); ok {\n\t\treturn a(context)\n\t} else if a, ok := action.(func(*Context)); ok { // deprecated function signature\n\t\ta(context)\n\t\treturn nil\n\t} else {\n\t\treturn errInvalidActionType\n\t}\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/appveyor.yml",
    "content": "version: \"{build}\"\n\nos: Windows Server 2016\n\nimage: Visual Studio 2017\n\nclone_folder: c:\\gopath\\src\\github.com\\urfave\\cli\n\nenvironment:\n  GOPATH: C:\\gopath\n  GOVERSION: 1.8.x\n  PYTHON: C:\\Python36-x64\n  PYTHON_VERSION: 3.6.x\n  PYTHON_ARCH: 64\n\ninstall:\n- set PATH=%GOPATH%\\bin;C:\\go\\bin;%PATH%\n- go version\n- go env\n- go get github.com/urfave/gfmrun/...\n- go get -v -t ./...\n\nbuild_script:\n- python runtests vet\n- python runtests test\n- python runtests gfmrun\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/category.go",
    "content": "package cli\n\n// CommandCategories is a slice of *CommandCategory.\ntype CommandCategories []*CommandCategory\n\n// CommandCategory is a category containing commands.\ntype CommandCategory struct {\n\tName     string\n\tCommands Commands\n}\n\nfunc (c CommandCategories) Less(i, j int) bool {\n\treturn c[i].Name < c[j].Name\n}\n\nfunc (c CommandCategories) Len() int {\n\treturn len(c)\n}\n\nfunc (c CommandCategories) Swap(i, j int) {\n\tc[i], c[j] = c[j], c[i]\n}\n\n// AddCommand adds a command to a category.\nfunc (c CommandCategories) AddCommand(category string, command Command) CommandCategories {\n\tfor _, commandCategory := range c {\n\t\tif commandCategory.Name == category {\n\t\t\tcommandCategory.Commands = append(commandCategory.Commands, command)\n\t\t\treturn c\n\t\t}\n\t}\n\treturn append(c, &CommandCategory{Name: category, Commands: []Command{command}})\n}\n\n// VisibleCommands returns a slice of the Commands with Hidden=false\nfunc (c *CommandCategory) VisibleCommands() []Command {\n\tret := []Command{}\n\tfor _, command := range c.Commands {\n\t\tif !command.Hidden {\n\t\t\tret = append(ret, command)\n\t\t}\n\t}\n\treturn ret\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/cli.go",
    "content": "// Package cli provides a minimal framework for creating and organizing command line\n// Go applications. cli is designed to be easy to understand and write, the most simple\n// cli application can be written as follows:\n//   func main() {\n//     cli.NewApp().Run(os.Args)\n//   }\n//\n// Of course this application does not do much, so let's make this an actual application:\n//   func main() {\n//     app := cli.NewApp()\n//     app.Name = \"greet\"\n//     app.Usage = \"say a greeting\"\n//     app.Action = func(c *cli.Context) error {\n//       println(\"Greetings\")\n//       return nil\n//     }\n//\n//     app.Run(os.Args)\n//   }\npackage cli\n\n//go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/command.go",
    "content": "package cli\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"sort\"\n\t\"strings\"\n)\n\n// Command is a subcommand for a cli.App.\ntype Command struct {\n\t// The name of the command\n\tName string\n\t// short name of the command. Typically one character (deprecated, use `Aliases`)\n\tShortName string\n\t// A list of aliases for the command\n\tAliases []string\n\t// A short description of the usage of this command\n\tUsage string\n\t// Custom text to show on USAGE section of help\n\tUsageText string\n\t// A longer explanation of how the command works\n\tDescription string\n\t// A short description of the arguments of this command\n\tArgsUsage string\n\t// The category the command is part of\n\tCategory string\n\t// The function to call when checking for bash command completions\n\tBashComplete BashCompleteFunc\n\t// An action to execute before any sub-subcommands are run, but after the context is ready\n\t// If a non-nil error is returned, no sub-subcommands are run\n\tBefore BeforeFunc\n\t// An action to execute after any subcommands are run, but after the subcommand has finished\n\t// It is run even if Action() panics\n\tAfter AfterFunc\n\t// The function to call when this command is invoked\n\tAction interface{}\n\t// TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind\n\t// of deprecation period has passed, maybe?\n\n\t// Execute this function if a usage error occurs.\n\tOnUsageError OnUsageErrorFunc\n\t// List of child commands\n\tSubcommands Commands\n\t// List of flags to parse\n\tFlags []Flag\n\t// Treat all flags as normal arguments if true\n\tSkipFlagParsing bool\n\t// Skip argument reordering which attempts to move flags before arguments,\n\t// but only works if all flags appear after all arguments. This behavior was\n\t// removed n version 2 since it only works under specific conditions so we\n\t// backport here by exposing it as an option for compatibility.\n\tSkipArgReorder bool\n\t// Boolean to hide built-in help command\n\tHideHelp bool\n\t// Boolean to hide this command from help or completion\n\tHidden bool\n\n\t// Full name of command for help, defaults to full command name, including parent commands.\n\tHelpName        string\n\tcommandNamePath []string\n\n\t// CustomHelpTemplate the text template for the command help topic.\n\t// cli.go uses text/template to render templates. You can\n\t// render custom help text by setting this variable.\n\tCustomHelpTemplate string\n}\n\ntype CommandsByName []Command\n\nfunc (c CommandsByName) Len() int {\n\treturn len(c)\n}\n\nfunc (c CommandsByName) Less(i, j int) bool {\n\treturn c[i].Name < c[j].Name\n}\n\nfunc (c CommandsByName) Swap(i, j int) {\n\tc[i], c[j] = c[j], c[i]\n}\n\n// FullName returns the full name of the command.\n// For subcommands this ensures that parent commands are part of the command path\nfunc (c Command) FullName() string {\n\tif c.commandNamePath == nil {\n\t\treturn c.Name\n\t}\n\treturn strings.Join(c.commandNamePath, \" \")\n}\n\n// Commands is a slice of Command\ntype Commands []Command\n\n// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags\nfunc (c Command) Run(ctx *Context) (err error) {\n\tif len(c.Subcommands) > 0 {\n\t\treturn c.startApp(ctx)\n\t}\n\n\tif !c.HideHelp && (HelpFlag != BoolFlag{}) {\n\t\t// append help to flags\n\t\tc.Flags = append(\n\t\t\tc.Flags,\n\t\t\tHelpFlag,\n\t\t)\n\t}\n\n\tset, err := flagSet(c.Name, c.Flags)\n\tif err != nil {\n\t\treturn err\n\t}\n\tset.SetOutput(ioutil.Discard)\n\n\tif c.SkipFlagParsing {\n\t\terr = set.Parse(append([]string{\"--\"}, ctx.Args().Tail()...))\n\t} else if !c.SkipArgReorder {\n\t\tfirstFlagIndex := -1\n\t\tterminatorIndex := -1\n\t\tfor index, arg := range ctx.Args() {\n\t\t\tif arg == \"--\" {\n\t\t\t\tterminatorIndex = index\n\t\t\t\tbreak\n\t\t\t} else if arg == \"-\" {\n\t\t\t\t// Do nothing. A dash alone is not really a flag.\n\t\t\t\tcontinue\n\t\t\t} else if strings.HasPrefix(arg, \"-\") && firstFlagIndex == -1 {\n\t\t\t\tfirstFlagIndex = index\n\t\t\t}\n\t\t}\n\n\t\tif firstFlagIndex > -1 {\n\t\t\targs := ctx.Args()\n\t\t\tregularArgs := make([]string, len(args[1:firstFlagIndex]))\n\t\t\tcopy(regularArgs, args[1:firstFlagIndex])\n\n\t\t\tvar flagArgs []string\n\t\t\tif terminatorIndex > -1 {\n\t\t\t\tflagArgs = args[firstFlagIndex:terminatorIndex]\n\t\t\t\tregularArgs = append(regularArgs, args[terminatorIndex:]...)\n\t\t\t} else {\n\t\t\t\tflagArgs = args[firstFlagIndex:]\n\t\t\t}\n\n\t\t\terr = set.Parse(append(flagArgs, regularArgs...))\n\t\t} else {\n\t\t\terr = set.Parse(ctx.Args().Tail())\n\t\t}\n\t} else {\n\t\terr = set.Parse(ctx.Args().Tail())\n\t}\n\n\tnerr := normalizeFlags(c.Flags, set)\n\tif nerr != nil {\n\t\tfmt.Fprintln(ctx.App.Writer, nerr)\n\t\tfmt.Fprintln(ctx.App.Writer)\n\t\tShowCommandHelp(ctx, c.Name)\n\t\treturn nerr\n\t}\n\n\tcontext := NewContext(ctx.App, set, ctx)\n\tcontext.Command = c\n\tif checkCommandCompletions(context, c.Name) {\n\t\treturn nil\n\t}\n\n\tif err != nil {\n\t\tif c.OnUsageError != nil {\n\t\t\terr := c.OnUsageError(context, err, false)\n\t\t\tHandleExitCoder(err)\n\t\t\treturn err\n\t\t}\n\t\tfmt.Fprintln(context.App.Writer, \"Incorrect Usage:\", err.Error())\n\t\tfmt.Fprintln(context.App.Writer)\n\t\tShowCommandHelp(context, c.Name)\n\t\treturn err\n\t}\n\n\tif checkCommandHelp(context, c.Name) {\n\t\treturn nil\n\t}\n\n\tif c.After != nil {\n\t\tdefer func() {\n\t\t\tafterErr := c.After(context)\n\t\t\tif afterErr != nil {\n\t\t\t\tHandleExitCoder(err)\n\t\t\t\tif err != nil {\n\t\t\t\t\terr = NewMultiError(err, afterErr)\n\t\t\t\t} else {\n\t\t\t\t\terr = afterErr\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\t}\n\n\tif c.Before != nil {\n\t\terr = c.Before(context)\n\t\tif err != nil {\n\t\t\tShowCommandHelp(context, c.Name)\n\t\t\tHandleExitCoder(err)\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif c.Action == nil {\n\t\tc.Action = helpSubcommand.Action\n\t}\n\n\terr = HandleAction(c.Action, context)\n\n\tif err != nil {\n\t\tHandleExitCoder(err)\n\t}\n\treturn err\n}\n\n// Names returns the names including short names and aliases.\nfunc (c Command) Names() []string {\n\tnames := []string{c.Name}\n\n\tif c.ShortName != \"\" {\n\t\tnames = append(names, c.ShortName)\n\t}\n\n\treturn append(names, c.Aliases...)\n}\n\n// HasName returns true if Command.Name or Command.ShortName matches given name\nfunc (c Command) HasName(name string) bool {\n\tfor _, n := range c.Names() {\n\t\tif n == name {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (c Command) startApp(ctx *Context) error {\n\tapp := NewApp()\n\tapp.Metadata = ctx.App.Metadata\n\t// set the name and usage\n\tapp.Name = fmt.Sprintf(\"%s %s\", ctx.App.Name, c.Name)\n\tif c.HelpName == \"\" {\n\t\tapp.HelpName = c.HelpName\n\t} else {\n\t\tapp.HelpName = app.Name\n\t}\n\n\tapp.Usage = c.Usage\n\tapp.Description = c.Description\n\tapp.ArgsUsage = c.ArgsUsage\n\n\t// set CommandNotFound\n\tapp.CommandNotFound = ctx.App.CommandNotFound\n\tapp.CustomAppHelpTemplate = c.CustomHelpTemplate\n\n\t// set the flags and commands\n\tapp.Commands = c.Subcommands\n\tapp.Flags = c.Flags\n\tapp.HideHelp = c.HideHelp\n\n\tapp.Version = ctx.App.Version\n\tapp.HideVersion = ctx.App.HideVersion\n\tapp.Compiled = ctx.App.Compiled\n\tapp.Author = ctx.App.Author\n\tapp.Email = ctx.App.Email\n\tapp.Writer = ctx.App.Writer\n\tapp.ErrWriter = ctx.App.ErrWriter\n\n\tapp.categories = CommandCategories{}\n\tfor _, command := range c.Subcommands {\n\t\tapp.categories = app.categories.AddCommand(command.Category, command)\n\t}\n\n\tsort.Sort(app.categories)\n\n\t// bash completion\n\tapp.EnableBashCompletion = ctx.App.EnableBashCompletion\n\tif c.BashComplete != nil {\n\t\tapp.BashComplete = c.BashComplete\n\t}\n\n\t// set the actions\n\tapp.Before = c.Before\n\tapp.After = c.After\n\tif c.Action != nil {\n\t\tapp.Action = c.Action\n\t} else {\n\t\tapp.Action = helpSubcommand.Action\n\t}\n\tapp.OnUsageError = c.OnUsageError\n\n\tfor index, cc := range app.Commands {\n\t\tapp.Commands[index].commandNamePath = []string{c.Name, cc.Name}\n\t}\n\n\treturn app.RunAsSubcommand(ctx)\n}\n\n// VisibleFlags returns a slice of the Flags with Hidden=false\nfunc (c Command) VisibleFlags() []Flag {\n\treturn visibleFlags(c.Flags)\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/context.go",
    "content": "package cli\n\nimport (\n\t\"errors\"\n\t\"flag\"\n\t\"reflect\"\n\t\"strings\"\n\t\"syscall\"\n)\n\n// Context is a type that is passed through to\n// each Handler action in a cli application. Context\n// can be used to retrieve context-specific Args and\n// parsed command-line options.\ntype Context struct {\n\tApp           *App\n\tCommand       Command\n\tshellComplete bool\n\tflagSet       *flag.FlagSet\n\tsetFlags      map[string]bool\n\tparentContext *Context\n}\n\n// NewContext creates a new context. For use in when invoking an App or Command action.\nfunc NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context {\n\tc := &Context{App: app, flagSet: set, parentContext: parentCtx}\n\n\tif parentCtx != nil {\n\t\tc.shellComplete = parentCtx.shellComplete\n\t}\n\n\treturn c\n}\n\n// NumFlags returns the number of flags set\nfunc (c *Context) NumFlags() int {\n\treturn c.flagSet.NFlag()\n}\n\n// Set sets a context flag to a value.\nfunc (c *Context) Set(name, value string) error {\n\tc.setFlags = nil\n\treturn c.flagSet.Set(name, value)\n}\n\n// GlobalSet sets a context flag to a value on the global flagset\nfunc (c *Context) GlobalSet(name, value string) error {\n\tglobalContext(c).setFlags = nil\n\treturn globalContext(c).flagSet.Set(name, value)\n}\n\n// IsSet determines if the flag was actually set\nfunc (c *Context) IsSet(name string) bool {\n\tif c.setFlags == nil {\n\t\tc.setFlags = make(map[string]bool)\n\n\t\tc.flagSet.Visit(func(f *flag.Flag) {\n\t\t\tc.setFlags[f.Name] = true\n\t\t})\n\n\t\tc.flagSet.VisitAll(func(f *flag.Flag) {\n\t\t\tif _, ok := c.setFlags[f.Name]; ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tc.setFlags[f.Name] = false\n\t\t})\n\n\t\t// XXX hack to support IsSet for flags with EnvVar\n\t\t//\n\t\t// There isn't an easy way to do this with the current implementation since\n\t\t// whether a flag was set via an environment variable is very difficult to\n\t\t// determine here. Instead, we intend to introduce a backwards incompatible\n\t\t// change in version 2 to add `IsSet` to the Flag interface to push the\n\t\t// responsibility closer to where the information required to determine\n\t\t// whether a flag is set by non-standard means such as environment\n\t\t// variables is avaliable.\n\t\t//\n\t\t// See https://github.com/urfave/cli/issues/294 for additional discussion\n\t\tflags := c.Command.Flags\n\t\tif c.Command.Name == \"\" { // cannot == Command{} since it contains slice types\n\t\t\tif c.App != nil {\n\t\t\t\tflags = c.App.Flags\n\t\t\t}\n\t\t}\n\t\tfor _, f := range flags {\n\t\t\teachName(f.GetName(), func(name string) {\n\t\t\t\tif isSet, ok := c.setFlags[name]; isSet || !ok {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tval := reflect.ValueOf(f)\n\t\t\t\tif val.Kind() == reflect.Ptr {\n\t\t\t\t\tval = val.Elem()\n\t\t\t\t}\n\n\t\t\t\tenvVarValue := val.FieldByName(\"EnvVar\")\n\t\t\t\tif !envVarValue.IsValid() {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\teachName(envVarValue.String(), func(envVar string) {\n\t\t\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\t\t\tif _, ok := syscall.Getenv(envVar); ok {\n\t\t\t\t\t\tc.setFlags[name] = true\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n\n\treturn c.setFlags[name]\n}\n\n// GlobalIsSet determines if the global flag was actually set\nfunc (c *Context) GlobalIsSet(name string) bool {\n\tctx := c\n\tif ctx.parentContext != nil {\n\t\tctx = ctx.parentContext\n\t}\n\n\tfor ; ctx != nil; ctx = ctx.parentContext {\n\t\tif ctx.IsSet(name) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// FlagNames returns a slice of flag names used in this context.\nfunc (c *Context) FlagNames() (names []string) {\n\tfor _, flag := range c.Command.Flags {\n\t\tname := strings.Split(flag.GetName(), \",\")[0]\n\t\tif name == \"help\" {\n\t\t\tcontinue\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\treturn\n}\n\n// GlobalFlagNames returns a slice of global flag names used by the app.\nfunc (c *Context) GlobalFlagNames() (names []string) {\n\tfor _, flag := range c.App.Flags {\n\t\tname := strings.Split(flag.GetName(), \",\")[0]\n\t\tif name == \"help\" || name == \"version\" {\n\t\t\tcontinue\n\t\t}\n\t\tnames = append(names, name)\n\t}\n\treturn\n}\n\n// Parent returns the parent context, if any\nfunc (c *Context) Parent() *Context {\n\treturn c.parentContext\n}\n\n// value returns the value of the flag coressponding to `name`\nfunc (c *Context) value(name string) interface{} {\n\treturn c.flagSet.Lookup(name).Value.(flag.Getter).Get()\n}\n\n// Args contains apps console arguments\ntype Args []string\n\n// Args returns the command line arguments associated with the context.\nfunc (c *Context) Args() Args {\n\targs := Args(c.flagSet.Args())\n\treturn args\n}\n\n// NArg returns the number of the command line arguments.\nfunc (c *Context) NArg() int {\n\treturn len(c.Args())\n}\n\n// Get returns the nth argument, or else a blank string\nfunc (a Args) Get(n int) string {\n\tif len(a) > n {\n\t\treturn a[n]\n\t}\n\treturn \"\"\n}\n\n// First returns the first argument, or else a blank string\nfunc (a Args) First() string {\n\treturn a.Get(0)\n}\n\n// Tail returns the rest of the arguments (not the first one)\n// or else an empty string slice\nfunc (a Args) Tail() []string {\n\tif len(a) >= 2 {\n\t\treturn []string(a)[1:]\n\t}\n\treturn []string{}\n}\n\n// Present checks if there are any arguments present\nfunc (a Args) Present() bool {\n\treturn len(a) != 0\n}\n\n// Swap swaps arguments at the given indexes\nfunc (a Args) Swap(from, to int) error {\n\tif from >= len(a) || to >= len(a) {\n\t\treturn errors.New(\"index out of range\")\n\t}\n\ta[from], a[to] = a[to], a[from]\n\treturn nil\n}\n\nfunc globalContext(ctx *Context) *Context {\n\tif ctx == nil {\n\t\treturn nil\n\t}\n\n\tfor {\n\t\tif ctx.parentContext == nil {\n\t\t\treturn ctx\n\t\t}\n\t\tctx = ctx.parentContext\n\t}\n}\n\nfunc lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet {\n\tif ctx.parentContext != nil {\n\t\tctx = ctx.parentContext\n\t}\n\tfor ; ctx != nil; ctx = ctx.parentContext {\n\t\tif f := ctx.flagSet.Lookup(name); f != nil {\n\t\t\treturn ctx.flagSet\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) {\n\tswitch ff.Value.(type) {\n\tcase *StringSlice:\n\tdefault:\n\t\tset.Set(name, ff.Value.String())\n\t}\n}\n\nfunc normalizeFlags(flags []Flag, set *flag.FlagSet) error {\n\tvisited := make(map[string]bool)\n\tset.Visit(func(f *flag.Flag) {\n\t\tvisited[f.Name] = true\n\t})\n\tfor _, f := range flags {\n\t\tparts := strings.Split(f.GetName(), \",\")\n\t\tif len(parts) == 1 {\n\t\t\tcontinue\n\t\t}\n\t\tvar ff *flag.Flag\n\t\tfor _, name := range parts {\n\t\t\tname = strings.Trim(name, \" \")\n\t\t\tif visited[name] {\n\t\t\t\tif ff != nil {\n\t\t\t\t\treturn errors.New(\"Cannot use two forms of the same flag: \" + name + \" \" + ff.Name)\n\t\t\t\t}\n\t\t\t\tff = set.Lookup(name)\n\t\t\t}\n\t\t}\n\t\tif ff == nil {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, name := range parts {\n\t\t\tname = strings.Trim(name, \" \")\n\t\t\tif !visited[name] {\n\t\t\t\tcopyFlag(name, ff, set)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/errors.go",
    "content": "package cli\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n)\n\n// OsExiter is the function used when the app exits. If not set defaults to os.Exit.\nvar OsExiter = os.Exit\n\n// ErrWriter is used to write errors to the user. This can be anything\n// implementing the io.Writer interface and defaults to os.Stderr.\nvar ErrWriter io.Writer = os.Stderr\n\n// MultiError is an error that wraps multiple errors.\ntype MultiError struct {\n\tErrors []error\n}\n\n// NewMultiError creates a new MultiError. Pass in one or more errors.\nfunc NewMultiError(err ...error) MultiError {\n\treturn MultiError{Errors: err}\n}\n\n// Error implements the error interface.\nfunc (m MultiError) Error() string {\n\terrs := make([]string, len(m.Errors))\n\tfor i, err := range m.Errors {\n\t\terrs[i] = err.Error()\n\t}\n\n\treturn strings.Join(errs, \"\\n\")\n}\n\ntype ErrorFormatter interface {\n\tFormat(s fmt.State, verb rune)\n}\n\n// ExitCoder is the interface checked by `App` and `Command` for a custom exit\n// code\ntype ExitCoder interface {\n\terror\n\tExitCode() int\n}\n\n// ExitError fulfills both the builtin `error` interface and `ExitCoder`\ntype ExitError struct {\n\texitCode int\n\tmessage  interface{}\n}\n\n// NewExitError makes a new *ExitError\nfunc NewExitError(message interface{}, exitCode int) *ExitError {\n\treturn &ExitError{\n\t\texitCode: exitCode,\n\t\tmessage:  message,\n\t}\n}\n\n// Error returns the string message, fulfilling the interface required by\n// `error`\nfunc (ee *ExitError) Error() string {\n\treturn fmt.Sprintf(\"%v\", ee.message)\n}\n\n// ExitCode returns the exit code, fulfilling the interface required by\n// `ExitCoder`\nfunc (ee *ExitError) ExitCode() int {\n\treturn ee.exitCode\n}\n\n// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if\n// so prints the error to stderr (if it is non-empty) and calls OsExiter with the\n// given exit code.  If the given error is a MultiError, then this func is\n// called on all members of the Errors slice and calls OsExiter with the last exit code.\nfunc HandleExitCoder(err error) {\n\tif err == nil {\n\t\treturn\n\t}\n\n\tif exitErr, ok := err.(ExitCoder); ok {\n\t\tif err.Error() != \"\" {\n\t\t\tif _, ok := exitErr.(ErrorFormatter); ok {\n\t\t\t\tfmt.Fprintf(ErrWriter, \"%+v\\n\", err)\n\t\t\t} else {\n\t\t\t\tfmt.Fprintln(ErrWriter, err)\n\t\t\t}\n\t\t}\n\t\tOsExiter(exitErr.ExitCode())\n\t\treturn\n\t}\n\n\tif multiErr, ok := err.(MultiError); ok {\n\t\tcode := handleMultiError(multiErr)\n\t\tOsExiter(code)\n\t\treturn\n\t}\n}\n\nfunc handleMultiError(multiErr MultiError) int {\n\tcode := 1\n\tfor _, merr := range multiErr.Errors {\n\t\tif multiErr2, ok := merr.(MultiError); ok {\n\t\t\tcode = handleMultiError(multiErr2)\n\t\t} else {\n\t\t\tfmt.Fprintln(ErrWriter, merr)\n\t\t\tif exitErr, ok := merr.(ExitCoder); ok {\n\t\t\t\tcode = exitErr.ExitCode()\n\t\t\t}\n\t\t}\n\t}\n\treturn code\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/flag-types.json",
    "content": "[\n  {\n    \"name\": \"Bool\",\n    \"type\": \"bool\",\n    \"value\": false,\n    \"context_default\": \"false\",\n    \"parser\": \"strconv.ParseBool(f.Value.String())\"\n  },\n  {\n    \"name\": \"BoolT\",\n    \"type\": \"bool\",\n    \"value\": false,\n    \"doctail\": \" that is true by default\",\n    \"context_default\": \"false\",\n    \"parser\": \"strconv.ParseBool(f.Value.String())\"\n  },\n  {\n    \"name\": \"Duration\",\n    \"type\": \"time.Duration\",\n    \"doctail\": \" (see https://golang.org/pkg/time/#ParseDuration)\",\n    \"context_default\": \"0\",\n    \"parser\": \"time.ParseDuration(f.Value.String())\"\n  },\n  {\n    \"name\": \"Float64\",\n    \"type\": \"float64\",\n    \"context_default\": \"0\",\n    \"parser\": \"strconv.ParseFloat(f.Value.String(), 64)\"\n  },\n  {\n    \"name\": \"Generic\",\n    \"type\": \"Generic\",\n    \"dest\": false,\n    \"context_default\": \"nil\",\n    \"context_type\": \"interface{}\"\n  },\n  {\n    \"name\": \"Int64\",\n    \"type\": \"int64\",\n    \"context_default\": \"0\",\n    \"parser\": \"strconv.ParseInt(f.Value.String(), 0, 64)\"\n  },\n  {\n    \"name\": \"Int\",\n    \"type\": \"int\",\n    \"context_default\": \"0\",\n    \"parser\": \"strconv.ParseInt(f.Value.String(), 0, 64)\",\n    \"parser_cast\": \"int(parsed)\"\n  },\n  {\n    \"name\": \"IntSlice\",\n    \"type\": \"*IntSlice\",\n    \"dest\": false,\n    \"context_default\": \"nil\",\n    \"context_type\": \"[]int\",\n    \"parser\": \"(f.Value.(*IntSlice)).Value(), error(nil)\"\n  },\n  {\n    \"name\": \"Int64Slice\",\n    \"type\": \"*Int64Slice\",\n    \"dest\": false,\n    \"context_default\": \"nil\",\n    \"context_type\": \"[]int64\",\n    \"parser\": \"(f.Value.(*Int64Slice)).Value(), error(nil)\"\n  },\n  {\n    \"name\": \"String\",\n    \"type\": \"string\",\n    \"context_default\": \"\\\"\\\"\",\n    \"parser\": \"f.Value.String(), error(nil)\"\n  },\n  {\n    \"name\": \"StringSlice\",\n    \"type\": \"*StringSlice\",\n    \"dest\": false,\n    \"context_default\": \"nil\",\n    \"context_type\": \"[]string\",\n    \"parser\": \"(f.Value.(*StringSlice)).Value(), error(nil)\"\n  },\n  {\n    \"name\": \"Uint64\",\n    \"type\": \"uint64\",\n    \"context_default\": \"0\",\n    \"parser\": \"strconv.ParseUint(f.Value.String(), 0, 64)\"\n  },\n  {\n    \"name\": \"Uint\",\n    \"type\": \"uint\",\n    \"context_default\": \"0\",\n    \"parser\": \"strconv.ParseUint(f.Value.String(), 0, 64)\",\n    \"parser_cast\": \"uint(parsed)\"\n  }\n]\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/flag.go",
    "content": "package cli\n\nimport (\n\t\"flag\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"syscall\"\n\t\"time\"\n)\n\nconst defaultPlaceholder = \"value\"\n\n// BashCompletionFlag enables bash-completion for all commands and subcommands\nvar BashCompletionFlag Flag = BoolFlag{\n\tName:   \"generate-bash-completion\",\n\tHidden: true,\n}\n\n// VersionFlag prints the version for the application\nvar VersionFlag Flag = BoolFlag{\n\tName:  \"version, v\",\n\tUsage: \"print the version\",\n}\n\n// HelpFlag prints the help for all commands and subcommands\n// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand\n// unless HideHelp is set to true)\nvar HelpFlag Flag = BoolFlag{\n\tName:  \"help, h\",\n\tUsage: \"show help\",\n}\n\n// FlagStringer converts a flag definition to a string. This is used by help\n// to display a flag.\nvar FlagStringer FlagStringFunc = stringifyFlag\n\n// FlagsByName is a slice of Flag.\ntype FlagsByName []Flag\n\nfunc (f FlagsByName) Len() int {\n\treturn len(f)\n}\n\nfunc (f FlagsByName) Less(i, j int) bool {\n\treturn f[i].GetName() < f[j].GetName()\n}\n\nfunc (f FlagsByName) Swap(i, j int) {\n\tf[i], f[j] = f[j], f[i]\n}\n\n// Flag is a common interface related to parsing flags in cli.\n// For more advanced flag parsing techniques, it is recommended that\n// this interface be implemented.\ntype Flag interface {\n\tfmt.Stringer\n\t// Apply Flag settings to the given flag set\n\tApply(*flag.FlagSet)\n\tGetName() string\n}\n\n// errorableFlag is an interface that allows us to return errors during apply\n// it allows flags defined in this library to return errors in a fashion backwards compatible\n// TODO remove in v2 and modify the existing Flag interface to return errors\ntype errorableFlag interface {\n\tFlag\n\n\tApplyWithError(*flag.FlagSet) error\n}\n\nfunc flagSet(name string, flags []Flag) (*flag.FlagSet, error) {\n\tset := flag.NewFlagSet(name, flag.ContinueOnError)\n\n\tfor _, f := range flags {\n\t\t//TODO remove in v2 when errorableFlag is removed\n\t\tif ef, ok := f.(errorableFlag); ok {\n\t\t\tif err := ef.ApplyWithError(set); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t} else {\n\t\t\tf.Apply(set)\n\t\t}\n\t}\n\treturn set, nil\n}\n\nfunc eachName(longName string, fn func(string)) {\n\tparts := strings.Split(longName, \",\")\n\tfor _, name := range parts {\n\t\tname = strings.Trim(name, \" \")\n\t\tfn(name)\n\t}\n}\n\n// Generic is a generic parseable type identified by a specific flag\ntype Generic interface {\n\tSet(value string) error\n\tString() string\n}\n\n// Apply takes the flagset and calls Set on the generic flag with the value\n// provided by the user for parsing by the flag\n// Ignores parsing errors\nfunc (f GenericFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError takes the flagset and calls Set on the generic flag with the value\n// provided by the user for parsing by the flag\nfunc (f GenericFlag) ApplyWithError(set *flag.FlagSet) error {\n\tval := f.Value\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tif err := val.Set(envVal); err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tset.Var(f.Value, name, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter\ntype StringSlice []string\n\n// Set appends the string value to the list of values\nfunc (f *StringSlice) Set(value string) error {\n\t*f = append(*f, value)\n\treturn nil\n}\n\n// String returns a readable representation of this value (for usage defaults)\nfunc (f *StringSlice) String() string {\n\treturn fmt.Sprintf(\"%s\", *f)\n}\n\n// Value returns the slice of strings set by this flag\nfunc (f *StringSlice) Value() []string {\n\treturn *f\n}\n\n// Get returns the slice of strings set by this flag\nfunc (f *StringSlice) Get() interface{} {\n\treturn *f\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f StringSliceFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tnewVal := &StringSlice{}\n\t\t\t\tfor _, s := range strings.Split(envVal, \",\") {\n\t\t\t\t\ts = strings.TrimSpace(s)\n\t\t\t\t\tif err := newVal.Set(s); err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as string value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tf.Value = newVal\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Value == nil {\n\t\t\tf.Value = &StringSlice{}\n\t\t}\n\t\tset.Var(f.Value, name, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter\ntype IntSlice []int\n\n// Set parses the value into an integer and appends it to the list of values\nfunc (f *IntSlice) Set(value string) error {\n\ttmp, err := strconv.Atoi(value)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*f = append(*f, tmp)\n\treturn nil\n}\n\n// String returns a readable representation of this value (for usage defaults)\nfunc (f *IntSlice) String() string {\n\treturn fmt.Sprintf(\"%#v\", *f)\n}\n\n// Value returns the slice of ints set by this flag\nfunc (f *IntSlice) Value() []int {\n\treturn *f\n}\n\n// Get returns the slice of ints set by this flag\nfunc (f *IntSlice) Get() interface{} {\n\treturn *f\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f IntSliceFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tnewVal := &IntSlice{}\n\t\t\t\tfor _, s := range strings.Split(envVal, \",\") {\n\t\t\t\t\ts = strings.TrimSpace(s)\n\t\t\t\t\tif err := newVal.Set(s); err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as int slice value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tf.Value = newVal\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Value == nil {\n\t\t\tf.Value = &IntSlice{}\n\t\t}\n\t\tset.Var(f.Value, name, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter\ntype Int64Slice []int64\n\n// Set parses the value into an integer and appends it to the list of values\nfunc (f *Int64Slice) Set(value string) error {\n\ttmp, err := strconv.ParseInt(value, 10, 64)\n\tif err != nil {\n\t\treturn err\n\t}\n\t*f = append(*f, tmp)\n\treturn nil\n}\n\n// String returns a readable representation of this value (for usage defaults)\nfunc (f *Int64Slice) String() string {\n\treturn fmt.Sprintf(\"%#v\", *f)\n}\n\n// Value returns the slice of ints set by this flag\nfunc (f *Int64Slice) Value() []int64 {\n\treturn *f\n}\n\n// Get returns the slice of ints set by this flag\nfunc (f *Int64Slice) Get() interface{} {\n\treturn *f\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f Int64SliceFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tnewVal := &Int64Slice{}\n\t\t\t\tfor _, s := range strings.Split(envVal, \",\") {\n\t\t\t\t\ts = strings.TrimSpace(s)\n\t\t\t\t\tif err := newVal.Set(s); err != nil {\n\t\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as int64 slice value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tf.Value = newVal\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Value == nil {\n\t\t\tf.Value = &Int64Slice{}\n\t\t}\n\t\tset.Var(f.Value, name, f.Usage)\n\t})\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f BoolFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f BoolFlag) ApplyWithError(set *flag.FlagSet) error {\n\tval := false\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tif envVal == \"\" {\n\t\t\t\t\tval = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tenvValBool, err := strconv.ParseBool(envVal)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as bool value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\n\t\t\t\tval = envValBool\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.BoolVar(f.Destination, name, val, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Bool(name, val, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f BoolTFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error {\n\tval := true\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tif envVal == \"\" {\n\t\t\t\t\tval = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tenvValBool, err := strconv.ParseBool(envVal)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as bool value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\n\t\t\t\tval = envValBool\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.BoolVar(f.Destination, name, val, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Bool(name, val, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f StringFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f StringFlag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tf.Value = envVal\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.StringVar(f.Destination, name, f.Value, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.String(name, f.Value, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f IntFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f IntFlag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tenvValInt, err := strconv.ParseInt(envVal, 0, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as int value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\t\t\t\tf.Value = int(envValInt)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.IntVar(f.Destination, name, f.Value, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Int(name, f.Value, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f Int64Flag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f Int64Flag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tenvValInt, err := strconv.ParseInt(envVal, 0, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as int value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\n\t\t\t\tf.Value = envValInt\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.Int64Var(f.Destination, name, f.Value, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Int64(name, f.Value, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f UintFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f UintFlag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tenvValInt, err := strconv.ParseUint(envVal, 0, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as uint value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\n\t\t\t\tf.Value = uint(envValInt)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.UintVar(f.Destination, name, f.Value, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Uint(name, f.Value, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f Uint64Flag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tenvValInt, err := strconv.ParseUint(envVal, 0, 64)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as uint64 value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\n\t\t\t\tf.Value = uint64(envValInt)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.Uint64Var(f.Destination, name, f.Value, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Uint64(name, f.Value, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f DurationFlag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f DurationFlag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tenvValDuration, err := time.ParseDuration(envVal)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as duration for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\n\t\t\t\tf.Value = envValDuration\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.DurationVar(f.Destination, name, f.Value, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Duration(name, f.Value, f.Usage)\n\t})\n\n\treturn nil\n}\n\n// Apply populates the flag given the flag set and environment\n// Ignores errors\nfunc (f Float64Flag) Apply(set *flag.FlagSet) {\n\tf.ApplyWithError(set)\n}\n\n// ApplyWithError populates the flag given the flag set and environment\nfunc (f Float64Flag) ApplyWithError(set *flag.FlagSet) error {\n\tif f.EnvVar != \"\" {\n\t\tfor _, envVar := range strings.Split(f.EnvVar, \",\") {\n\t\t\tenvVar = strings.TrimSpace(envVar)\n\t\t\tif envVal, ok := syscall.Getenv(envVar); ok {\n\t\t\t\tenvValFloat, err := strconv.ParseFloat(envVal, 10)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn fmt.Errorf(\"could not parse %s as float64 value for flag %s: %s\", envVal, f.Name, err)\n\t\t\t\t}\n\n\t\t\t\tf.Value = float64(envValFloat)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\teachName(f.Name, func(name string) {\n\t\tif f.Destination != nil {\n\t\t\tset.Float64Var(f.Destination, name, f.Value, f.Usage)\n\t\t\treturn\n\t\t}\n\t\tset.Float64(name, f.Value, f.Usage)\n\t})\n\n\treturn nil\n}\n\nfunc visibleFlags(fl []Flag) []Flag {\n\tvisible := []Flag{}\n\tfor _, flag := range fl {\n\t\tfield := flagValue(flag).FieldByName(\"Hidden\")\n\t\tif !field.IsValid() || !field.Bool() {\n\t\t\tvisible = append(visible, flag)\n\t\t}\n\t}\n\treturn visible\n}\n\nfunc prefixFor(name string) (prefix string) {\n\tif len(name) == 1 {\n\t\tprefix = \"-\"\n\t} else {\n\t\tprefix = \"--\"\n\t}\n\n\treturn\n}\n\n// Returns the placeholder, if any, and the unquoted usage string.\nfunc unquoteUsage(usage string) (string, string) {\n\tfor i := 0; i < len(usage); i++ {\n\t\tif usage[i] == '`' {\n\t\t\tfor j := i + 1; j < len(usage); j++ {\n\t\t\t\tif usage[j] == '`' {\n\t\t\t\t\tname := usage[i+1 : j]\n\t\t\t\t\tusage = usage[:i] + name + usage[j+1:]\n\t\t\t\t\treturn name, usage\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\t}\n\treturn \"\", usage\n}\n\nfunc prefixedNames(fullName, placeholder string) string {\n\tvar prefixed string\n\tparts := strings.Split(fullName, \",\")\n\tfor i, name := range parts {\n\t\tname = strings.Trim(name, \" \")\n\t\tprefixed += prefixFor(name) + name\n\t\tif placeholder != \"\" {\n\t\t\tprefixed += \" \" + placeholder\n\t\t}\n\t\tif i < len(parts)-1 {\n\t\t\tprefixed += \", \"\n\t\t}\n\t}\n\treturn prefixed\n}\n\nfunc withEnvHint(envVar, str string) string {\n\tenvText := \"\"\n\tif envVar != \"\" {\n\t\tprefix := \"$\"\n\t\tsuffix := \"\"\n\t\tsep := \", $\"\n\t\tif runtime.GOOS == \"windows\" {\n\t\t\tprefix = \"%\"\n\t\t\tsuffix = \"%\"\n\t\t\tsep = \"%, %\"\n\t\t}\n\t\tenvText = fmt.Sprintf(\" [%s%s%s]\", prefix, strings.Join(strings.Split(envVar, \",\"), sep), suffix)\n\t}\n\treturn str + envText\n}\n\nfunc flagValue(f Flag) reflect.Value {\n\tfv := reflect.ValueOf(f)\n\tfor fv.Kind() == reflect.Ptr {\n\t\tfv = reflect.Indirect(fv)\n\t}\n\treturn fv\n}\n\nfunc stringifyFlag(f Flag) string {\n\tfv := flagValue(f)\n\n\tswitch f.(type) {\n\tcase IntSliceFlag:\n\t\treturn withEnvHint(fv.FieldByName(\"EnvVar\").String(),\n\t\t\tstringifyIntSliceFlag(f.(IntSliceFlag)))\n\tcase Int64SliceFlag:\n\t\treturn withEnvHint(fv.FieldByName(\"EnvVar\").String(),\n\t\t\tstringifyInt64SliceFlag(f.(Int64SliceFlag)))\n\tcase StringSliceFlag:\n\t\treturn withEnvHint(fv.FieldByName(\"EnvVar\").String(),\n\t\t\tstringifyStringSliceFlag(f.(StringSliceFlag)))\n\t}\n\n\tplaceholder, usage := unquoteUsage(fv.FieldByName(\"Usage\").String())\n\n\tneedsPlaceholder := false\n\tdefaultValueString := \"\"\n\n\tif val := fv.FieldByName(\"Value\"); val.IsValid() {\n\t\tneedsPlaceholder = true\n\t\tdefaultValueString = fmt.Sprintf(\" (default: %v)\", val.Interface())\n\n\t\tif val.Kind() == reflect.String && val.String() != \"\" {\n\t\t\tdefaultValueString = fmt.Sprintf(\" (default: %q)\", val.String())\n\t\t}\n\t}\n\n\tif defaultValueString == \" (default: )\" {\n\t\tdefaultValueString = \"\"\n\t}\n\n\tif needsPlaceholder && placeholder == \"\" {\n\t\tplaceholder = defaultPlaceholder\n\t}\n\n\tusageWithDefault := strings.TrimSpace(fmt.Sprintf(\"%s%s\", usage, defaultValueString))\n\n\treturn withEnvHint(fv.FieldByName(\"EnvVar\").String(),\n\t\tfmt.Sprintf(\"%s\\t%s\", prefixedNames(fv.FieldByName(\"Name\").String(), placeholder), usageWithDefault))\n}\n\nfunc stringifyIntSliceFlag(f IntSliceFlag) string {\n\tdefaultVals := []string{}\n\tif f.Value != nil && len(f.Value.Value()) > 0 {\n\t\tfor _, i := range f.Value.Value() {\n\t\t\tdefaultVals = append(defaultVals, fmt.Sprintf(\"%d\", i))\n\t\t}\n\t}\n\n\treturn stringifySliceFlag(f.Usage, f.Name, defaultVals)\n}\n\nfunc stringifyInt64SliceFlag(f Int64SliceFlag) string {\n\tdefaultVals := []string{}\n\tif f.Value != nil && len(f.Value.Value()) > 0 {\n\t\tfor _, i := range f.Value.Value() {\n\t\t\tdefaultVals = append(defaultVals, fmt.Sprintf(\"%d\", i))\n\t\t}\n\t}\n\n\treturn stringifySliceFlag(f.Usage, f.Name, defaultVals)\n}\n\nfunc stringifyStringSliceFlag(f StringSliceFlag) string {\n\tdefaultVals := []string{}\n\tif f.Value != nil && len(f.Value.Value()) > 0 {\n\t\tfor _, s := range f.Value.Value() {\n\t\t\tif len(s) > 0 {\n\t\t\t\tdefaultVals = append(defaultVals, fmt.Sprintf(\"%q\", s))\n\t\t\t}\n\t\t}\n\t}\n\n\treturn stringifySliceFlag(f.Usage, f.Name, defaultVals)\n}\n\nfunc stringifySliceFlag(usage, name string, defaultVals []string) string {\n\tplaceholder, usage := unquoteUsage(usage)\n\tif placeholder == \"\" {\n\t\tplaceholder = defaultPlaceholder\n\t}\n\n\tdefaultVal := \"\"\n\tif len(defaultVals) > 0 {\n\t\tdefaultVal = fmt.Sprintf(\" (default: %s)\", strings.Join(defaultVals, \", \"))\n\t}\n\n\tusageWithDefault := strings.TrimSpace(fmt.Sprintf(\"%s%s\", usage, defaultVal))\n\treturn fmt.Sprintf(\"%s\\t%s\", prefixedNames(name, placeholder), usageWithDefault)\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/flag_generated.go",
    "content": "package cli\n\nimport (\n\t\"flag\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// WARNING: This file is generated!\n\n// BoolFlag is a flag with type bool\ntype BoolFlag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tDestination *bool\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f BoolFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f BoolFlag) GetName() string {\n\treturn f.Name\n}\n\n// Bool looks up the value of a local BoolFlag, returns\n// false if not found\nfunc (c *Context) Bool(name string) bool {\n\treturn lookupBool(name, c.flagSet)\n}\n\n// GlobalBool looks up the value of a global BoolFlag, returns\n// false if not found\nfunc (c *Context) GlobalBool(name string) bool {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupBool(name, fs)\n\t}\n\treturn false\n}\n\nfunc lookupBool(name string, set *flag.FlagSet) bool {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := strconv.ParseBool(f.Value.String())\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\treturn parsed\n\t}\n\treturn false\n}\n\n// BoolTFlag is a flag with type bool that is true by default\ntype BoolTFlag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tDestination *bool\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f BoolTFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f BoolTFlag) GetName() string {\n\treturn f.Name\n}\n\n// BoolT looks up the value of a local BoolTFlag, returns\n// false if not found\nfunc (c *Context) BoolT(name string) bool {\n\treturn lookupBoolT(name, c.flagSet)\n}\n\n// GlobalBoolT looks up the value of a global BoolTFlag, returns\n// false if not found\nfunc (c *Context) GlobalBoolT(name string) bool {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupBoolT(name, fs)\n\t}\n\treturn false\n}\n\nfunc lookupBoolT(name string, set *flag.FlagSet) bool {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := strconv.ParseBool(f.Value.String())\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t\treturn parsed\n\t}\n\treturn false\n}\n\n// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration)\ntype DurationFlag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tValue       time.Duration\n\tDestination *time.Duration\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f DurationFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f DurationFlag) GetName() string {\n\treturn f.Name\n}\n\n// Duration looks up the value of a local DurationFlag, returns\n// 0 if not found\nfunc (c *Context) Duration(name string) time.Duration {\n\treturn lookupDuration(name, c.flagSet)\n}\n\n// GlobalDuration looks up the value of a global DurationFlag, returns\n// 0 if not found\nfunc (c *Context) GlobalDuration(name string) time.Duration {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupDuration(name, fs)\n\t}\n\treturn 0\n}\n\nfunc lookupDuration(name string, set *flag.FlagSet) time.Duration {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := time.ParseDuration(f.Value.String())\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\treturn parsed\n\t}\n\treturn 0\n}\n\n// Float64Flag is a flag with type float64\ntype Float64Flag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tValue       float64\n\tDestination *float64\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f Float64Flag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f Float64Flag) GetName() string {\n\treturn f.Name\n}\n\n// Float64 looks up the value of a local Float64Flag, returns\n// 0 if not found\nfunc (c *Context) Float64(name string) float64 {\n\treturn lookupFloat64(name, c.flagSet)\n}\n\n// GlobalFloat64 looks up the value of a global Float64Flag, returns\n// 0 if not found\nfunc (c *Context) GlobalFloat64(name string) float64 {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupFloat64(name, fs)\n\t}\n\treturn 0\n}\n\nfunc lookupFloat64(name string, set *flag.FlagSet) float64 {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := strconv.ParseFloat(f.Value.String(), 64)\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\treturn parsed\n\t}\n\treturn 0\n}\n\n// GenericFlag is a flag with type Generic\ntype GenericFlag struct {\n\tName   string\n\tUsage  string\n\tEnvVar string\n\tHidden bool\n\tValue  Generic\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f GenericFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f GenericFlag) GetName() string {\n\treturn f.Name\n}\n\n// Generic looks up the value of a local GenericFlag, returns\n// nil if not found\nfunc (c *Context) Generic(name string) interface{} {\n\treturn lookupGeneric(name, c.flagSet)\n}\n\n// GlobalGeneric looks up the value of a global GenericFlag, returns\n// nil if not found\nfunc (c *Context) GlobalGeneric(name string) interface{} {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupGeneric(name, fs)\n\t}\n\treturn nil\n}\n\nfunc lookupGeneric(name string, set *flag.FlagSet) interface{} {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := f.Value, error(nil)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn parsed\n\t}\n\treturn nil\n}\n\n// Int64Flag is a flag with type int64\ntype Int64Flag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tValue       int64\n\tDestination *int64\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f Int64Flag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f Int64Flag) GetName() string {\n\treturn f.Name\n}\n\n// Int64 looks up the value of a local Int64Flag, returns\n// 0 if not found\nfunc (c *Context) Int64(name string) int64 {\n\treturn lookupInt64(name, c.flagSet)\n}\n\n// GlobalInt64 looks up the value of a global Int64Flag, returns\n// 0 if not found\nfunc (c *Context) GlobalInt64(name string) int64 {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupInt64(name, fs)\n\t}\n\treturn 0\n}\n\nfunc lookupInt64(name string, set *flag.FlagSet) int64 {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := strconv.ParseInt(f.Value.String(), 0, 64)\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\treturn parsed\n\t}\n\treturn 0\n}\n\n// IntFlag is a flag with type int\ntype IntFlag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tValue       int\n\tDestination *int\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f IntFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f IntFlag) GetName() string {\n\treturn f.Name\n}\n\n// Int looks up the value of a local IntFlag, returns\n// 0 if not found\nfunc (c *Context) Int(name string) int {\n\treturn lookupInt(name, c.flagSet)\n}\n\n// GlobalInt looks up the value of a global IntFlag, returns\n// 0 if not found\nfunc (c *Context) GlobalInt(name string) int {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupInt(name, fs)\n\t}\n\treturn 0\n}\n\nfunc lookupInt(name string, set *flag.FlagSet) int {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := strconv.ParseInt(f.Value.String(), 0, 64)\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\treturn int(parsed)\n\t}\n\treturn 0\n}\n\n// IntSliceFlag is a flag with type *IntSlice\ntype IntSliceFlag struct {\n\tName   string\n\tUsage  string\n\tEnvVar string\n\tHidden bool\n\tValue  *IntSlice\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f IntSliceFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f IntSliceFlag) GetName() string {\n\treturn f.Name\n}\n\n// IntSlice looks up the value of a local IntSliceFlag, returns\n// nil if not found\nfunc (c *Context) IntSlice(name string) []int {\n\treturn lookupIntSlice(name, c.flagSet)\n}\n\n// GlobalIntSlice looks up the value of a global IntSliceFlag, returns\n// nil if not found\nfunc (c *Context) GlobalIntSlice(name string) []int {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupIntSlice(name, fs)\n\t}\n\treturn nil\n}\n\nfunc lookupIntSlice(name string, set *flag.FlagSet) []int {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := (f.Value.(*IntSlice)).Value(), error(nil)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn parsed\n\t}\n\treturn nil\n}\n\n// Int64SliceFlag is a flag with type *Int64Slice\ntype Int64SliceFlag struct {\n\tName   string\n\tUsage  string\n\tEnvVar string\n\tHidden bool\n\tValue  *Int64Slice\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f Int64SliceFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f Int64SliceFlag) GetName() string {\n\treturn f.Name\n}\n\n// Int64Slice looks up the value of a local Int64SliceFlag, returns\n// nil if not found\nfunc (c *Context) Int64Slice(name string) []int64 {\n\treturn lookupInt64Slice(name, c.flagSet)\n}\n\n// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns\n// nil if not found\nfunc (c *Context) GlobalInt64Slice(name string) []int64 {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupInt64Slice(name, fs)\n\t}\n\treturn nil\n}\n\nfunc lookupInt64Slice(name string, set *flag.FlagSet) []int64 {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := (f.Value.(*Int64Slice)).Value(), error(nil)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn parsed\n\t}\n\treturn nil\n}\n\n// StringFlag is a flag with type string\ntype StringFlag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tValue       string\n\tDestination *string\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f StringFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f StringFlag) GetName() string {\n\treturn f.Name\n}\n\n// String looks up the value of a local StringFlag, returns\n// \"\" if not found\nfunc (c *Context) String(name string) string {\n\treturn lookupString(name, c.flagSet)\n}\n\n// GlobalString looks up the value of a global StringFlag, returns\n// \"\" if not found\nfunc (c *Context) GlobalString(name string) string {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupString(name, fs)\n\t}\n\treturn \"\"\n}\n\nfunc lookupString(name string, set *flag.FlagSet) string {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := f.Value.String(), error(nil)\n\t\tif err != nil {\n\t\t\treturn \"\"\n\t\t}\n\t\treturn parsed\n\t}\n\treturn \"\"\n}\n\n// StringSliceFlag is a flag with type *StringSlice\ntype StringSliceFlag struct {\n\tName   string\n\tUsage  string\n\tEnvVar string\n\tHidden bool\n\tValue  *StringSlice\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f StringSliceFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f StringSliceFlag) GetName() string {\n\treturn f.Name\n}\n\n// StringSlice looks up the value of a local StringSliceFlag, returns\n// nil if not found\nfunc (c *Context) StringSlice(name string) []string {\n\treturn lookupStringSlice(name, c.flagSet)\n}\n\n// GlobalStringSlice looks up the value of a global StringSliceFlag, returns\n// nil if not found\nfunc (c *Context) GlobalStringSlice(name string) []string {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupStringSlice(name, fs)\n\t}\n\treturn nil\n}\n\nfunc lookupStringSlice(name string, set *flag.FlagSet) []string {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := (f.Value.(*StringSlice)).Value(), error(nil)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn parsed\n\t}\n\treturn nil\n}\n\n// Uint64Flag is a flag with type uint64\ntype Uint64Flag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tValue       uint64\n\tDestination *uint64\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f Uint64Flag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f Uint64Flag) GetName() string {\n\treturn f.Name\n}\n\n// Uint64 looks up the value of a local Uint64Flag, returns\n// 0 if not found\nfunc (c *Context) Uint64(name string) uint64 {\n\treturn lookupUint64(name, c.flagSet)\n}\n\n// GlobalUint64 looks up the value of a global Uint64Flag, returns\n// 0 if not found\nfunc (c *Context) GlobalUint64(name string) uint64 {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupUint64(name, fs)\n\t}\n\treturn 0\n}\n\nfunc lookupUint64(name string, set *flag.FlagSet) uint64 {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := strconv.ParseUint(f.Value.String(), 0, 64)\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\treturn parsed\n\t}\n\treturn 0\n}\n\n// UintFlag is a flag with type uint\ntype UintFlag struct {\n\tName        string\n\tUsage       string\n\tEnvVar      string\n\tHidden      bool\n\tValue       uint\n\tDestination *uint\n}\n\n// String returns a readable representation of this value\n// (for usage defaults)\nfunc (f UintFlag) String() string {\n\treturn FlagStringer(f)\n}\n\n// GetName returns the name of the flag\nfunc (f UintFlag) GetName() string {\n\treturn f.Name\n}\n\n// Uint looks up the value of a local UintFlag, returns\n// 0 if not found\nfunc (c *Context) Uint(name string) uint {\n\treturn lookupUint(name, c.flagSet)\n}\n\n// GlobalUint looks up the value of a global UintFlag, returns\n// 0 if not found\nfunc (c *Context) GlobalUint(name string) uint {\n\tif fs := lookupGlobalFlagSet(name, c); fs != nil {\n\t\treturn lookupUint(name, fs)\n\t}\n\treturn 0\n}\n\nfunc lookupUint(name string, set *flag.FlagSet) uint {\n\tf := set.Lookup(name)\n\tif f != nil {\n\t\tparsed, err := strconv.ParseUint(f.Value.String(), 0, 64)\n\t\tif err != nil {\n\t\t\treturn 0\n\t\t}\n\t\treturn uint(parsed)\n\t}\n\treturn 0\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/funcs.go",
    "content": "package cli\n\n// BashCompleteFunc is an action to execute when the bash-completion flag is set\ntype BashCompleteFunc func(*Context)\n\n// BeforeFunc is an action to execute before any subcommands are run, but after\n// the context is ready if a non-nil error is returned, no subcommands are run\ntype BeforeFunc func(*Context) error\n\n// AfterFunc is an action to execute after any subcommands are run, but after the\n// subcommand has finished it is run even if Action() panics\ntype AfterFunc func(*Context) error\n\n// ActionFunc is the action to execute when no subcommands are specified\ntype ActionFunc func(*Context) error\n\n// CommandNotFoundFunc is executed if the proper command cannot be found\ntype CommandNotFoundFunc func(*Context, string)\n\n// OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying\n// customized usage error messages.  This function is able to replace the\n// original error messages.  If this function is not set, the \"Incorrect usage\"\n// is displayed and the execution is interrupted.\ntype OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error\n\n// FlagStringFunc is used by the help generation to display a flag, which is\n// expected to be a single line.\ntype FlagStringFunc func(Flag) string\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/generate-flag-types",
    "content": "#!/usr/bin/env python\n\"\"\"\nThe flag types that ship with the cli library have many things in common, and\nso we can take advantage of the `go generate` command to create much of the\nsource code from a list of definitions.  These definitions attempt to cover\nthe parts that vary between flag types, and should evolve as needed.\n\nAn example of the minimum definition needed is:\n\n    {\n      \"name\": \"SomeType\",\n      \"type\": \"sometype\",\n      \"context_default\": \"nil\"\n    }\n\nIn this example, the code generated for the `cli` package will include a type\nnamed `SomeTypeFlag` that is expected to wrap a value of type `sometype`.\nFetching values by name via `*cli.Context` will default to a value of `nil`.\n\nA more complete, albeit somewhat redundant, example showing all available\ndefinition keys is:\n\n    {\n      \"name\": \"VeryMuchType\",\n      \"type\": \"*VeryMuchType\",\n      \"value\": true,\n      \"dest\": false,\n      \"doctail\": \" which really only wraps a []float64, oh well!\",\n      \"context_type\": \"[]float64\",\n      \"context_default\": \"nil\",\n      \"parser\": \"parseVeryMuchType(f.Value.String())\",\n      \"parser_cast\": \"[]float64(parsed)\"\n    }\n\nThe meaning of each field is as follows:\n\n               name (string) - The type \"name\", which will be suffixed with\n                               `Flag` when generating the type definition\n                               for `cli` and the wrapper type for `altsrc`\n               type (string) - The type that the generated `Flag` type for `cli`\n                               is expected to \"contain\" as its `.Value` member\n                value (bool) - Should the generated `cli` type have a `Value`\n                               member?\n                 dest (bool) - Should the generated `cli` type support a\n                               destination pointer?\n            doctail (string) - Additional docs for the `cli` flag type comment\n       context_type (string) - The literal type used in the `*cli.Context`\n                               reader func signature\n    context_default (string) - The literal value used as the default by the\n                               `*cli.Context` reader funcs when no value is\n                               present\n             parser (string) - Literal code used to parse the flag `f`,\n                               expected to have a return signature of\n                               (value, error)\n        parser_cast (string) - Literal code used to cast the `parsed` value\n                               returned from the `parser` code\n\"\"\"\n\nfrom __future__ import print_function, unicode_literals\n\nimport argparse\nimport json\nimport os\nimport subprocess\nimport sys\nimport tempfile\nimport textwrap\n\n\nclass _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter,\n                      argparse.RawDescriptionHelpFormatter):\n    pass\n\n\ndef main(sysargs=sys.argv[:]):\n    parser = argparse.ArgumentParser(\n        description='Generate flag type code!',\n        formatter_class=_FancyFormatter)\n    parser.add_argument(\n        'package',\n        type=str, default='cli', choices=_WRITEFUNCS.keys(),\n        help='Package for which flag types will be generated'\n    )\n    parser.add_argument(\n        '-i', '--in-json',\n        type=argparse.FileType('r'),\n        default=sys.stdin,\n        help='Input JSON file which defines each type to be generated'\n    )\n    parser.add_argument(\n        '-o', '--out-go',\n        type=argparse.FileType('w'),\n        default=sys.stdout,\n        help='Output file/stream to which generated source will be written'\n    )\n    parser.epilog = __doc__\n\n    args = parser.parse_args(sysargs[1:])\n    _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json)\n    return 0\n\n\ndef _generate_flag_types(writefunc, output_go, input_json):\n    types = json.load(input_json)\n\n    tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False)\n    writefunc(tmp, types)\n    tmp.close()\n\n    new_content = subprocess.check_output(\n        ['goimports', tmp.name]\n    ).decode('utf-8')\n\n    print(new_content, file=output_go, end='')\n    output_go.flush()\n    os.remove(tmp.name)\n\n\ndef _set_typedef_defaults(typedef):\n    typedef.setdefault('doctail', '')\n    typedef.setdefault('context_type', typedef['type'])\n    typedef.setdefault('dest', True)\n    typedef.setdefault('value', True)\n    typedef.setdefault('parser', 'f.Value, error(nil)')\n    typedef.setdefault('parser_cast', 'parsed')\n\n\ndef _write_cli_flag_types(outfile, types):\n    _fwrite(outfile, \"\"\"\\\n        package cli\n\n        // WARNING: This file is generated!\n\n        \"\"\")\n\n    for typedef in types:\n        _set_typedef_defaults(typedef)\n\n        _fwrite(outfile, \"\"\"\\\n        // {name}Flag is a flag with type {type}{doctail}\n        type {name}Flag struct {{\n            Name string\n            Usage string\n            EnvVar string\n            Hidden bool\n        \"\"\".format(**typedef))\n\n        if typedef['value']:\n            _fwrite(outfile, \"\"\"\\\n            Value {type}\n            \"\"\".format(**typedef))\n\n        if typedef['dest']:\n            _fwrite(outfile, \"\"\"\\\n            Destination *{type}\n            \"\"\".format(**typedef))\n\n        _fwrite(outfile, \"\\n}\\n\\n\")\n\n        _fwrite(outfile, \"\"\"\\\n            // String returns a readable representation of this value\n            // (for usage defaults)\n            func (f {name}Flag) String() string {{\n                return FlagStringer(f)\n            }}\n\n            // GetName returns the name of the flag\n            func (f {name}Flag) GetName() string {{\n                return f.Name\n            }}\n\n            // {name} looks up the value of a local {name}Flag, returns\n            // {context_default} if not found\n            func (c *Context) {name}(name string) {context_type} {{\n                return lookup{name}(name, c.flagSet)\n            }}\n\n            // Global{name} looks up the value of a global {name}Flag, returns\n            // {context_default} if not found\n            func (c *Context) Global{name}(name string) {context_type} {{\n                if fs := lookupGlobalFlagSet(name, c); fs != nil {{\n                    return lookup{name}(name, fs)\n                }}\n                return {context_default}\n            }}\n\n            func lookup{name}(name string, set *flag.FlagSet) {context_type} {{\n                f := set.Lookup(name)\n                if f != nil {{\n                    parsed, err := {parser}\n                    if err != nil {{\n                        return {context_default}\n                    }}\n                    return {parser_cast}\n                }}\n                return {context_default}\n            }}\n            \"\"\".format(**typedef))\n\n\ndef _write_altsrc_flag_types(outfile, types):\n    _fwrite(outfile, \"\"\"\\\n        package altsrc\n\n        import (\n            \"gopkg.in/urfave/cli.v1\"\n        )\n\n        // WARNING: This file is generated!\n\n        \"\"\")\n\n    for typedef in types:\n        _set_typedef_defaults(typedef)\n\n        _fwrite(outfile, \"\"\"\\\n        // {name}Flag is the flag type that wraps cli.{name}Flag to allow\n        // for other values to be specified\n        type {name}Flag struct {{\n            cli.{name}Flag\n            set *flag.FlagSet\n        }}\n\n        // New{name}Flag creates a new {name}Flag\n        func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{\n            return &{name}Flag{{{name}Flag: fl, set: nil}}\n        }}\n\n        // Apply saves the flagSet for later usage calls, then calls the\n        // wrapped {name}Flag.Apply\n        func (f *{name}Flag) Apply(set *flag.FlagSet) {{\n            f.set = set\n            f.{name}Flag.Apply(set)\n        }}\n\n        // ApplyWithError saves the flagSet for later usage calls, then calls the\n        // wrapped {name}Flag.ApplyWithError\n        func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{\n            f.set = set\n            return f.{name}Flag.ApplyWithError(set)\n        }}\n        \"\"\".format(**typedef))\n\n\ndef _fwrite(outfile, text):\n    print(textwrap.dedent(text), end='', file=outfile)\n\n\n_WRITEFUNCS = {\n    'cli': _write_cli_flag_types,\n    'altsrc': _write_altsrc_flag_types\n}\n\nif __name__ == '__main__':\n    sys.exit(main())\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/help.go",
    "content": "package cli\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\t\"text/template\"\n)\n\n// AppHelpTemplate is the text template for the Default help topic.\n// cli.go uses text/template to render templates. You can\n// render custom help text by setting this variable.\nvar AppHelpTemplate = `NAME:\n   {{.Name}}{{if .Usage}} - {{.Usage}}{{end}}\n\nUSAGE:\n   {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}}\n\nVERSION:\n   {{.Version}}{{end}}{{end}}{{if .Description}}\n\nDESCRIPTION:\n   {{.Description}}{{end}}{{if len .Authors}}\n\nAUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}:\n   {{range $index, $author := .Authors}}{{if $index}}\n   {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}}\n\nCOMMANDS:{{range .VisibleCategories}}{{if .Name}}\n   {{.Name}}:{{end}}{{range .VisibleCommands}}\n     {{join .Names \", \"}}{{\"\\t\"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}\n\nGLOBAL OPTIONS:\n   {{range $index, $option := .VisibleFlags}}{{if $index}}\n   {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}}\n\nCOPYRIGHT:\n   {{.Copyright}}{{end}}\n`\n\n// CommandHelpTemplate is the text template for the command help topic.\n// cli.go uses text/template to render templates. You can\n// render custom help text by setting this variable.\nvar CommandHelpTemplate = `NAME:\n   {{.HelpName}} - {{.Usage}}\n\nUSAGE:\n   {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}}\n\nCATEGORY:\n   {{.Category}}{{end}}{{if .Description}}\n\nDESCRIPTION:\n   {{.Description}}{{end}}{{if .VisibleFlags}}\n\nOPTIONS:\n   {{range .VisibleFlags}}{{.}}\n   {{end}}{{end}}\n`\n\n// SubcommandHelpTemplate is the text template for the subcommand help topic.\n// cli.go uses text/template to render templates. You can\n// render custom help text by setting this variable.\nvar SubcommandHelpTemplate = `NAME:\n   {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}}\n\nUSAGE:\n   {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}\n\nCOMMANDS:{{range .VisibleCategories}}{{if .Name}}\n   {{.Name}}:{{end}}{{range .VisibleCommands}}\n     {{join .Names \", \"}}{{\"\\t\"}}{{.Usage}}{{end}}\n{{end}}{{if .VisibleFlags}}\nOPTIONS:\n   {{range .VisibleFlags}}{{.}}\n   {{end}}{{end}}\n`\n\nvar helpCommand = Command{\n\tName:      \"help\",\n\tAliases:   []string{\"h\"},\n\tUsage:     \"Shows a list of commands or help for one command\",\n\tArgsUsage: \"[command]\",\n\tAction: func(c *Context) error {\n\t\targs := c.Args()\n\t\tif args.Present() {\n\t\t\treturn ShowCommandHelp(c, args.First())\n\t\t}\n\n\t\tShowAppHelp(c)\n\t\treturn nil\n\t},\n}\n\nvar helpSubcommand = Command{\n\tName:      \"help\",\n\tAliases:   []string{\"h\"},\n\tUsage:     \"Shows a list of commands or help for one command\",\n\tArgsUsage: \"[command]\",\n\tAction: func(c *Context) error {\n\t\targs := c.Args()\n\t\tif args.Present() {\n\t\t\treturn ShowCommandHelp(c, args.First())\n\t\t}\n\n\t\treturn ShowSubcommandHelp(c)\n\t},\n}\n\n// Prints help for the App or Command\ntype helpPrinter func(w io.Writer, templ string, data interface{})\n\n// Prints help for the App or Command with custom template function.\ntype helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{})\n\n// HelpPrinter is a function that writes the help output. If not set a default\n// is used. The function signature is:\n// func(w io.Writer, templ string, data interface{})\nvar HelpPrinter helpPrinter = printHelp\n\n// HelpPrinterCustom is same as HelpPrinter but\n// takes a custom function for template function map.\nvar HelpPrinterCustom helpPrinterCustom = printHelpCustom\n\n// VersionPrinter prints the version for the App\nvar VersionPrinter = printVersion\n\n// ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code.\nfunc ShowAppHelpAndExit(c *Context, exitCode int) {\n\tShowAppHelp(c)\n\tos.Exit(exitCode)\n}\n\n// ShowAppHelp is an action that displays the help.\nfunc ShowAppHelp(c *Context) (err error) {\n\tif c.App.CustomAppHelpTemplate == \"\" {\n\t\tHelpPrinter(c.App.Writer, AppHelpTemplate, c.App)\n\t\treturn\n\t}\n\tcustomAppData := func() map[string]interface{} {\n\t\tif c.App.ExtraInfo == nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn map[string]interface{}{\n\t\t\t\"ExtraInfo\": c.App.ExtraInfo,\n\t\t}\n\t}\n\tHelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData())\n\treturn nil\n}\n\n// DefaultAppComplete prints the list of subcommands as the default app completion method\nfunc DefaultAppComplete(c *Context) {\n\tfor _, command := range c.App.Commands {\n\t\tif command.Hidden {\n\t\t\tcontinue\n\t\t}\n\t\tfor _, name := range command.Names() {\n\t\t\tfmt.Fprintln(c.App.Writer, name)\n\t\t}\n\t}\n}\n\n// ShowCommandHelpAndExit - exits with code after showing help\nfunc ShowCommandHelpAndExit(c *Context, command string, code int) {\n\tShowCommandHelp(c, command)\n\tos.Exit(code)\n}\n\n// ShowCommandHelp prints help for the given command\nfunc ShowCommandHelp(ctx *Context, command string) error {\n\t// show the subcommand help for a command with subcommands\n\tif command == \"\" {\n\t\tHelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App)\n\t\treturn nil\n\t}\n\n\tfor _, c := range ctx.App.Commands {\n\t\tif c.HasName(command) {\n\t\t\tif c.CustomHelpTemplate != \"\" {\n\t\t\t\tHelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil)\n\t\t\t} else {\n\t\t\t\tHelpPrinter(ctx.App.Writer, CommandHelpTemplate, c)\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tif ctx.App.CommandNotFound == nil {\n\t\treturn NewExitError(fmt.Sprintf(\"No help topic for '%v'\", command), 3)\n\t}\n\n\tctx.App.CommandNotFound(ctx, command)\n\treturn nil\n}\n\n// ShowSubcommandHelp prints help for the given subcommand\nfunc ShowSubcommandHelp(c *Context) error {\n\treturn ShowCommandHelp(c, c.Command.Name)\n}\n\n// ShowVersion prints the version number of the App\nfunc ShowVersion(c *Context) {\n\tVersionPrinter(c)\n}\n\nfunc printVersion(c *Context) {\n\tfmt.Fprintf(c.App.Writer, \"%v version %v\\n\", c.App.Name, c.App.Version)\n}\n\n// ShowCompletions prints the lists of commands within a given context\nfunc ShowCompletions(c *Context) {\n\ta := c.App\n\tif a != nil && a.BashComplete != nil {\n\t\ta.BashComplete(c)\n\t}\n}\n\n// ShowCommandCompletions prints the custom completions for a given command\nfunc ShowCommandCompletions(ctx *Context, command string) {\n\tc := ctx.App.Command(command)\n\tif c != nil && c.BashComplete != nil {\n\t\tc.BashComplete(ctx)\n\t}\n}\n\nfunc printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) {\n\tfuncMap := template.FuncMap{\n\t\t\"join\": strings.Join,\n\t}\n\tif customFunc != nil {\n\t\tfor key, value := range customFunc {\n\t\t\tfuncMap[key] = value\n\t\t}\n\t}\n\n\tw := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0)\n\tt := template.Must(template.New(\"help\").Funcs(funcMap).Parse(templ))\n\terr := t.Execute(w, data)\n\tif err != nil {\n\t\t// If the writer is closed, t.Execute will fail, and there's nothing\n\t\t// we can do to recover.\n\t\tif os.Getenv(\"CLI_TEMPLATE_ERROR_DEBUG\") != \"\" {\n\t\t\tfmt.Fprintf(ErrWriter, \"CLI TEMPLATE ERROR: %#v\\n\", err)\n\t\t}\n\t\treturn\n\t}\n\tw.Flush()\n}\n\nfunc printHelp(out io.Writer, templ string, data interface{}) {\n\tprintHelpCustom(out, templ, data, nil)\n}\n\nfunc checkVersion(c *Context) bool {\n\tfound := false\n\tif VersionFlag.GetName() != \"\" {\n\t\teachName(VersionFlag.GetName(), func(name string) {\n\t\t\tif c.GlobalBool(name) || c.Bool(name) {\n\t\t\t\tfound = true\n\t\t\t}\n\t\t})\n\t}\n\treturn found\n}\n\nfunc checkHelp(c *Context) bool {\n\tfound := false\n\tif HelpFlag.GetName() != \"\" {\n\t\teachName(HelpFlag.GetName(), func(name string) {\n\t\t\tif c.GlobalBool(name) || c.Bool(name) {\n\t\t\t\tfound = true\n\t\t\t}\n\t\t})\n\t}\n\treturn found\n}\n\nfunc checkCommandHelp(c *Context, name string) bool {\n\tif c.Bool(\"h\") || c.Bool(\"help\") {\n\t\tShowCommandHelp(c, name)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc checkSubcommandHelp(c *Context) bool {\n\tif c.Bool(\"h\") || c.Bool(\"help\") {\n\t\tShowSubcommandHelp(c)\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc checkShellCompleteFlag(a *App, arguments []string) (bool, []string) {\n\tif !a.EnableBashCompletion {\n\t\treturn false, arguments\n\t}\n\n\tpos := len(arguments) - 1\n\tlastArg := arguments[pos]\n\n\tif lastArg != \"--\"+BashCompletionFlag.GetName() {\n\t\treturn false, arguments\n\t}\n\n\treturn true, arguments[:pos]\n}\n\nfunc checkCompletions(c *Context) bool {\n\tif !c.shellComplete {\n\t\treturn false\n\t}\n\n\tif args := c.Args(); args.Present() {\n\t\tname := args.First()\n\t\tif cmd := c.App.Command(name); cmd != nil {\n\t\t\t// let the command handle the completion\n\t\t\treturn false\n\t\t}\n\t}\n\n\tShowCompletions(c)\n\treturn true\n}\n\nfunc checkCommandCompletions(c *Context, name string) bool {\n\tif !c.shellComplete {\n\t\treturn false\n\t}\n\n\tShowCommandCompletions(c, name)\n\treturn true\n}\n"
  },
  {
    "path": "vendor/gopkg.in/urfave/cli.v1/runtests",
    "content": "#!/usr/bin/env python\nfrom __future__ import print_function\n\nimport argparse\nimport os\nimport sys\nimport tempfile\n\nfrom subprocess import check_call, check_output\n\n\nPACKAGE_NAME = os.environ.get(\n    'CLI_PACKAGE_NAME', 'github.com/urfave/cli'\n)\n\n\ndef main(sysargs=sys.argv[:]):\n    targets = {\n        'vet': _vet,\n        'test': _test,\n        'gfmrun': _gfmrun,\n        'toc': _toc,\n        'gen': _gen,\n    }\n\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\n        'target', nargs='?', choices=tuple(targets.keys()), default='test'\n    )\n    args = parser.parse_args(sysargs[1:])\n\n    targets[args.target]()\n    return 0\n\n\ndef _test():\n    if check_output('go version'.split()).split()[2] < 'go1.2':\n        _run('go test -v .')\n        return\n\n    coverprofiles = []\n    for subpackage in ['', 'altsrc']:\n        coverprofile = 'cli.coverprofile'\n        if subpackage != '':\n            coverprofile = '{}.coverprofile'.format(subpackage)\n\n        coverprofiles.append(coverprofile)\n\n        _run('go test -v'.split() + [\n            '-coverprofile={}'.format(coverprofile),\n            ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/')\n        ])\n\n    combined_name = _combine_coverprofiles(coverprofiles)\n    _run('go tool cover -func={}'.format(combined_name))\n    os.remove(combined_name)\n\n\ndef _gfmrun():\n    go_version = check_output('go version'.split()).split()[2]\n    if go_version < 'go1.3':\n        print('runtests: skip on {}'.format(go_version), file=sys.stderr)\n        return\n    _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md'])\n\n\ndef _vet():\n    _run('go vet ./...')\n\n\ndef _toc():\n    _run('node_modules/.bin/markdown-toc -i README.md')\n    _run('git diff --exit-code')\n\n\ndef _gen():\n    go_version = check_output('go version'.split()).split()[2]\n    if go_version < 'go1.5':\n        print('runtests: skip on {}'.format(go_version), file=sys.stderr)\n        return\n\n    _run('go generate ./...')\n    _run('git diff --exit-code')\n\n\ndef _run(command):\n    if hasattr(command, 'split'):\n        command = command.split()\n    print('runtests: {}'.format(' '.join(command)), file=sys.stderr)\n    check_call(command)\n\n\ndef _gfmrun_count():\n    with open('README.md') as infile:\n        lines = infile.read().splitlines()\n        return len(filter(_is_go_runnable, lines))\n\n\ndef _is_go_runnable(line):\n    return line.startswith('package main')\n\n\ndef _combine_coverprofiles(coverprofiles):\n    combined = tempfile.NamedTemporaryFile(\n        suffix='.coverprofile', delete=False\n    )\n    combined.write('mode: set\\n')\n\n    for coverprofile in coverprofiles:\n        with open(coverprofile, 'r') as infile:\n            for line in infile.readlines():\n                if not line.startswith('mode: '):\n                    combined.write(line)\n\n    combined.flush()\n    name = combined.name\n    combined.close()\n    return name\n\n\nif __name__ == '__main__':\n    sys.exit(main())\n"
  },
  {
    "path": "vendor/vendor.json",
    "content": "{\n\t\"comment\": \"\",\n\t\"ignore\": \"test\",\n\t\"package\": [\n\t\t{\n\t\t\t\"checksumSHA1\": \"b5bkSc2hlmUV7PlLY6JlLwiJpiE=\",\n\t\t\t\"path\": \"bazil.org/fuse\",\n\t\t\t\"revision\": \"371fbbdaa8987b715bdd21d6adc4c9b20155f748\",\n\t\t\t\"revisionTime\": \"2016-08-11T21:22:31Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"389JFJTJADMtZkTIfdSnsmHVOUs=\",\n\t\t\t\"path\": \"bazil.org/fuse/fs\",\n\t\t\t\"revision\": \"371fbbdaa8987b715bdd21d6adc4c9b20155f748\",\n\t\t\t\"revisionTime\": \"2016-08-11T21:22:31Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"NPgkh9UWMsaTtsAAs3kPrclHT9Y=\",\n\t\t\t\"path\": \"bazil.org/fuse/fuseutil\",\n\t\t\t\"revision\": \"371fbbdaa8987b715bdd21d6adc4c9b20155f748\",\n\t\t\t\"revisionTime\": \"2016-08-11T21:22:31Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"z+M6FYl9EKsoZZMLcT0Ktwfk8pI=\",\n\t\t\t\"path\": \"github.com/Azure/azure-pipeline-go/pipeline\",\n\t\t\t\"revision\": \"7571e8eb0876932ab505918ff7ed5107773e5ee2\",\n\t\t\t\"revisionTime\": \"2018-06-07T21:19:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"5nsGu77r69lloEWbFhMof2UA9rY=\",\n\t\t\t\"path\": \"github.com/Azure/azure-storage-blob-go/2018-03-28/azblob\",\n\t\t\t\"revision\": \"eaae161d9d5e07363f04ddb19d84d57efc66d1a1\",\n\t\t\t\"revisionTime\": \"2018-07-12T00:56:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"QC55lHNOv1+UAL2xtIHw17MJ8J8=\",\n\t\t\t\"path\": \"github.com/StackExchange/wmi\",\n\t\t\t\"revision\": \"5d049714c4a64225c3c79a7cf7d02f7fb5b96338\",\n\t\t\t\"revisionTime\": \"2018-01-16T20:38:02Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"USkefO0g1U9mr+8hagv3fpSkrxg=\",\n\t\t\t\"path\": \"github.com/aristanetworks/goarista/monotime\",\n\t\t\t\"revision\": \"ea17b1a17847fb6e4c0a91de0b674704693469b0\",\n\t\t\t\"revisionTime\": \"2017-02-10T01:56:32Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"gZHfOHB+zlaNWUjdlu1nFD7VBX0=\",\n\t\t\t\"path\": \"github.com/btcsuite/btcutil\",\n\t\t\t\"revision\": \"9e5f4b9a998d263e3ce9c56664a7816001ac8000\",\n\t\t\t\"revisionTime\": \"2019-04-25T00:47:09Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"oQgLy8KmIOVov04WXH7KgU1bszc=\",\n\t\t\t\"path\": \"github.com/btcsuite/btcutil/base58\",\n\t\t\t\"revision\": \"9e5f4b9a998d263e3ce9c56664a7816001ac8000\",\n\t\t\t\"revisionTime\": \"2019-04-25T00:47:09Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"BBnsAiKyNfocRwmEav5EJpVCwzk=\",\n\t\t\t\"path\": \"github.com/btcsuite/btcutil/bech32\",\n\t\t\t\"revision\": \"9e5f4b9a998d263e3ce9c56664a7816001ac8000\",\n\t\t\t\"revisionTime\": \"2019-04-25T00:47:09Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"cDMtzKmdTx4CcIpP4broa+16X9g=\",\n\t\t\t\"path\": \"github.com/cespare/cp\",\n\t\t\t\"revision\": \"165db2f241fd235aec29ba6d9b1ccd5f1c14637c\",\n\t\t\t\"revisionTime\": \"2015-01-22T07:26:53Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"7gK+lSShSu1NRw83/A95BcgMqsI=\",\n\t\t\t\"path\": \"github.com/codahale/hdrhistogram\",\n\t\t\t\"revision\": \"3a0bb77429bd3a61596f5e8a3172445844342120\",\n\t\t\t\"revisionTime\": \"2016-10-10T02:54:55Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"dvabztWVQX8f6oMLRyv4dLH+TGY=\",\n\t\t\t\"path\": \"github.com/davecgh/go-spew/spew\",\n\t\t\t\"revision\": \"346938d642f2ec3594ed81d874461961cd0faa76\",\n\t\t\t\"revisionTime\": \"2016-10-29T20:57:26Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"1xK7ycc1ICRInk/S9iiyB9Rpv50=\",\n\t\t\t\"path\": \"github.com/deckarep/golang-set\",\n\t\t\t\"revision\": \"504e848d77ea4752b3057b8fb46da0e7f746ccf3\",\n\t\t\t\"revisionTime\": \"2018-06-03T19:32:48Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"2Fy1Y6Z3lRRX1891WF/+HT4XS2I=\",\n\t\t\t\"path\": \"github.com/dgrijalva/jwt-go\",\n\t\t\t\"revision\": \"2268707a8f0843315e2004ee4f1d021dc08baedf\",\n\t\t\t\"revisionTime\": \"2017-02-01T22:58:49Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Ad8LPSCP9HctFrmskh+S5HpHXcs=\",\n\t\t\t\"path\": \"github.com/docker/docker/pkg/reexec\",\n\t\t\t\"revision\": \"8e610b2b55bfd1bfa9436ab110d311f5e8a74dcb\",\n\t\t\t\"revisionTime\": \"2018-06-25T18:44:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"zYnPsNAVm1/ViwCkN++dX2JQhBo=\",\n\t\t\t\"path\": \"github.com/edsrzf/mmap-go\",\n\t\t\t\"revision\": \"935e0e8a636ca4ba70b713f3e38a19e1b77739e8\",\n\t\t\t\"revisionTime\": \"2016-05-12T03:30:02Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"jElNoLEe7m/iaoF1vYIHyNaS2SE=\",\n\t\t\t\"path\": \"github.com/elastic/gosigar\",\n\t\t\t\"revision\": \"37f05ff46ffa7a825d1b24cf2b62d4a4c1a9d2e8\",\n\t\t\t\"revisionTime\": \"2018-03-30T10:04:40Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"qDsgp2kAeI9nhj565HUScaUyjU4=\",\n\t\t\t\"path\": \"github.com/elastic/gosigar/sys/windows\",\n\t\t\t\"revision\": \"a3814ce5008e612a0c6d027608b54e1d0d9a5613\",\n\t\t\t\"revisionTime\": \"2018-01-22T22:25:45Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"7oFpbmDfGobwKsFLIf6wMUvVoKw=\",\n\t\t\t\"path\": \"github.com/fatih/color\",\n\t\t\t\"revision\": \"5ec5d9d3c2cf82e9688b34e9bc27a94d616a7193\",\n\t\t\t\"revisionTime\": \"2017-02-09T08:00:14Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Jq1rrHSGPfh689nA2hL1QVb62zE=\",\n\t\t\t\"path\": \"github.com/fjl/memsize\",\n\t\t\t\"revision\": \"ca190fb6ffbc076ff49197b7168a760f30182d2e\",\n\t\t\t\"revisionTime\": \"2018-04-18T12:24:29Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Z13QAYTqeW4cTiglkc2F05gWLu4=\",\n\t\t\t\"path\": \"github.com/fjl/memsize/memsizeui\",\n\t\t\t\"revision\": \"ca190fb6ffbc076ff49197b7168a760f30182d2e\",\n\t\t\t\"revisionTime\": \"2018-04-18T12:24:29Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"0orwvPL96wFckVJyPl39fz2QsgA=\",\n\t\t\t\"path\": \"github.com/gizak/termui\",\n\t\t\t\"revision\": \"991cd3d3809135dc24daf6188dc6edcaf3d7d2d9\",\n\t\t\t\"revisionTime\": \"2017-01-17T22:23:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"gxV/cPPLkByTdY8y172t7v4qcZA=\",\n\t\t\t\"path\": \"github.com/go-ole/go-ole\",\n\t\t\t\"revision\": \"a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506\",\n\t\t\t\"revisionTime\": \"2017-11-10T16:07:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"PArleDBtadu2qO4hJwHR8a3IOTA=\",\n\t\t\t\"path\": \"github.com/go-ole/go-ole/oleutil\",\n\t\t\t\"revision\": \"a41e3c4b706f6ae8dfbff342b06e40fa4d2d0506\",\n\t\t\t\"revisionTime\": \"2017-11-10T16:07:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"KZ3QD2QgUS4RcoKiA3mn5pSlJxQ=\",\n\t\t\t\"path\": \"github.com/go-stack/stack\",\n\t\t\t\"revision\": \"54be5f394ed2c3e19dac9134a40a95ba5a017f7b\",\n\t\t\t\"revisionTime\": \"2017-07-10T16:04:46Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"yqF125xVSkmfLpIVGrLlfE05IUk=\",\n\t\t\t\"path\": \"github.com/golang/protobuf/proto\",\n\t\t\t\"revision\": \"748d386b5c1ea99658fd69fe9f03991ce86a90c1\",\n\t\t\t\"revisionTime\": \"2017-07-26T21:28:29Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Z1gJ3PKzwBpOoPnTSEM5yd0zHYA=\",\n\t\t\t\"path\": \"github.com/golang/protobuf/protoc-gen-go/descriptor\",\n\t\t\t\"revision\": \"748d386b5c1ea99658fd69fe9f03991ce86a90c1\",\n\t\t\t\"revisionTime\": \"2017-07-26T21:28:29Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"p/8vSviYF91gFflhrt5vkyksroo=\",\n\t\t\t\"path\": \"github.com/golang/snappy\",\n\t\t\t\"revision\": \"553a641470496b2327abcac10b36396bd98e45c9\",\n\t\t\t\"revisionTime\": \"2017-02-15T23:32:05Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"D8ksSACYQOb+3nx6lHB8kR2VCOo=\",\n\t\t\t\"path\": \"github.com/gosuri/uilive\",\n\t\t\t\"revision\": \"ac356e6e42cd31fcef8e6aec13ae9ed6fe87713e\",\n\t\t\t\"revisionTime\": \"2017-03-23T04:15:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"zTVV9gr0Qn6mDWQ5ZTiVdIJV3CE=\",\n\t\t\t\"path\": \"github.com/gosuri/uiprogress\",\n\t\t\t\"revision\": \"d0567a9d84a1c40dd7568115ea66f4887bf57b33\",\n\t\t\t\"revisionTime\": \"2017-02-24T06:39:37Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"1dKG7apJl3CGGIrmXMHZp3emYTQ=\",\n\t\t\t\"path\": \"github.com/gosuri/uiprogress/util/strutil\",\n\t\t\t\"revision\": \"d0567a9d84a1c40dd7568115ea66f4887bf57b33\",\n\t\t\t\"revisionTime\": \"2017-02-24T06:39:37Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"d9PxF1XQGLMJZRct2R8qVM/eYlE=\",\n\t\t\t\"path\": \"github.com/hashicorp/golang-lru\",\n\t\t\t\"revision\": \"0a025b7e63adc15a622f29b0b2c4c3848243bbf6\",\n\t\t\t\"revisionTime\": \"2016-08-13T22:13:03Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"9hffs0bAIU6CquiRhKQdzjHnKt0=\",\n\t\t\t\"path\": \"github.com/hashicorp/golang-lru/simplelru\",\n\t\t\t\"revision\": \"0a025b7e63adc15a622f29b0b2c4c3848243bbf6\",\n\t\t\t\"revisionTime\": \"2016-08-13T22:13:03Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"f55gR+6YClh0i/FOhdy66SOUiwY=\",\n\t\t\t\"path\": \"github.com/huin/goupnp\",\n\t\t\t\"revision\": \"679507af18f3c7ba2bcc7905392ce23e148661c3\",\n\t\t\t\"revisionTime\": \"2016-12-24T10:41:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"U3NsxkodNX/tmOqkVDnGFRZ6dI4=\",\n\t\t\t\"path\": \"github.com/huin/goupnp/dcps/internetgateway1\",\n\t\t\t\"revision\": \"679507af18f3c7ba2bcc7905392ce23e148661c3\",\n\t\t\t\"revisionTime\": \"2016-12-24T10:41:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"znTn+P/iEwi6Ax7r3N0GikeYMlk=\",\n\t\t\t\"path\": \"github.com/huin/goupnp/dcps/internetgateway2\",\n\t\t\t\"revision\": \"679507af18f3c7ba2bcc7905392ce23e148661c3\",\n\t\t\t\"revisionTime\": \"2016-12-24T10:41:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"RLygtUlTOCtrI3KMswYLJnte1OU=\",\n\t\t\t\"path\": \"github.com/huin/goupnp/httpu\",\n\t\t\t\"revision\": \"679507af18f3c7ba2bcc7905392ce23e148661c3\",\n\t\t\t\"revisionTime\": \"2016-12-24T10:41:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"+S2t2qKK+wcpM+07eW7dCK/6oFU=\",\n\t\t\t\"path\": \"github.com/huin/goupnp/scpd\",\n\t\t\t\"revision\": \"679507af18f3c7ba2bcc7905392ce23e148661c3\",\n\t\t\t\"revisionTime\": \"2016-12-24T10:41:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"80ieA8iPFaFeQFw++EiYn4jhcGs=\",\n\t\t\t\"path\": \"github.com/huin/goupnp/soap\",\n\t\t\t\"revision\": \"679507af18f3c7ba2bcc7905392ce23e148661c3\",\n\t\t\t\"revisionTime\": \"2016-12-24T10:41:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"iqPUC/MoFGaRQnAudYGAW9BvF2o=\",\n\t\t\t\"path\": \"github.com/huin/goupnp/ssdp\",\n\t\t\t\"revision\": \"679507af18f3c7ba2bcc7905392ce23e148661c3\",\n\t\t\t\"revisionTime\": \"2016-12-24T10:41:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"6tNwbL5tUS0dxYzADKVZtI2d/lE=\",\n\t\t\t\"path\": \"github.com/influxdata/influxdb/client\",\n\t\t\t\"revision\": \"a55dd0f50edd14c9c798d3564189eb4f53914309\",\n\t\t\t\"revisionTime\": \"2017-10-09T17:24:46Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"O4XpbSNeUhSIMD2FWtQximJiFIs=\",\n\t\t\t\"path\": \"github.com/influxdata/influxdb/client/v2\",\n\t\t\t\"revision\": \"b36b9f109f2da91c8941679caf5356e08eee0b2b\",\n\t\t\t\"revisionTime\": \"2018-01-17T01:42:09Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"cfumoC9gHEUROd+fA8qK3WLFAZQ=\",\n\t\t\t\"path\": \"github.com/influxdata/influxdb/models\",\n\t\t\t\"revision\": \"b36b9f109f2da91c8941679caf5356e08eee0b2b\",\n\t\t\t\"revisionTime\": \"2018-01-17T01:42:09Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Z0Bb5PWa5WL/j5Dm2KJCLGn1l7U=\",\n\t\t\t\"path\": \"github.com/influxdata/influxdb/pkg/escape\",\n\t\t\t\"revision\": \"01288bdb0883a01cac999326bd34421b29acaec8\",\n\t\t\t\"revisionTime\": \"2018-02-21T22:33:40Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"vTGKMIfiMwz43y5bsgx9PrL+AVw=\",\n\t\t\t\"path\": \"github.com/jackpal/go-nat-pmp\",\n\t\t\t\"revision\": \"1fa385a6f45828c83361136b45b1a21a12139493\",\n\t\t\t\"revisionTime\": \"2016-06-03T03:41:37Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"gKyBj05YkfuLFruAyPZ4KV9nFp8=\",\n\t\t\t\"path\": \"github.com/julienschmidt/httprouter\",\n\t\t\t\"revision\": \"975b5c4c7c21c0e3d2764200bf2aa8e34657ae6e\",\n\t\t\t\"revisionTime\": \"2017-04-30T22:20:11Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"UpjhOUZ1+0zNt+iIvdtECSHXmTs=\",\n\t\t\t\"path\": \"github.com/karalabe/hid\",\n\t\t\t\"revision\": \"f00545f9f3748e591590be3732d913c77525b10f\",\n\t\t\t\"revisionTime\": \"2017-08-21T10:38:37Z\",\n\t\t\t\"tree\": true\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"7hln62oZPZmyqEmgXaybf9WxQ7A=\",\n\t\t\t\"path\": \"github.com/maruel/panicparse/stack\",\n\t\t\t\"revision\": \"ad661195ed0e88491e0f14be6613304e3b1141d6\",\n\t\t\t\"revisionTime\": \"2016-07-20T14:16:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"I4njd26dG5hxFT2nawuByM4pxzY=\",\n\t\t\t\"path\": \"github.com/mattn/go-colorable\",\n\t\t\t\"revision\": \"5411d3eea5978e6cdc258b30de592b60df6aba96\",\n\t\t\t\"revisionTime\": \"2017-02-10T17:28:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"EkT5JmFvz3zOPWappEFyYWUaeY0=\",\n\t\t\t\"path\": \"github.com/mattn/go-isatty\",\n\t\t\t\"revision\": \"281032e84ae07510239465db46bf442aa44b953a\",\n\t\t\t\"revisionTime\": \"2017-02-09T17:56:15Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"MNkKJyk2TazKMJYbal5wFHybpyA=\",\n\t\t\t\"path\": \"github.com/mattn/go-runewidth\",\n\t\t\t\"revision\": \"14207d285c6c197daabb5c9793d63e7af9ab2d50\",\n\t\t\t\"revisionTime\": \"2017-02-01T02:35:40Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"L3leymg2RT8hFl5uL+5KP/LpBkg=\",\n\t\t\t\"path\": \"github.com/mitchellh/go-wordwrap\",\n\t\t\t\"revision\": \"ad45545899c7b13c020ea92b2072220eefad42b8\",\n\t\t\t\"revisionTime\": \"2015-03-14T17:03:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"2jsbDTvwxafPp7FJjJ8IIFlTLjs=\",\n\t\t\t\"path\": \"github.com/mohae/deepcopy\",\n\t\t\t\"revision\": \"c48cc78d482608239f6c4c92a4abd87eb8761c90\",\n\t\t\t\"revisionTime\": \"2017-09-29T03:49:55Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"FYM/8R2CqS6PSNAoKl6X5gNJ20A=\",\n\t\t\t\"path\": \"github.com/naoina/toml\",\n\t\t\t\"revision\": \"9fafd69674167c06933b1787ae235618431ce87f\",\n\t\t\t\"revisionTime\": \"2017-09-18T21:04:37Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"xZBlSMT5o/A+EDOro6KbfHZwSNc=\",\n\t\t\t\"path\": \"github.com/naoina/toml/ast\",\n\t\t\t\"revision\": \"eb52202f758b98ac5b1a8eb26f36455205d688f0\",\n\t\t\t\"revisionTime\": \"2017-04-03T15:03:10Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"R1h9XHH3dTmLq7yKL9/uW0xFwfs=\",\n\t\t\t\"path\": \"github.com/nsf/termbox-go\",\n\t\t\t\"revision\": \"3540b76b9c77679aeffd0a47e00243fb0ce47133\",\n\t\t\t\"revisionTime\": \"2017-02-11T01:27:00Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"h+oCMj21PiQfIdBog0eyUtF1djs=\",\n\t\t\t\"path\": \"github.com/olekukonko/tablewriter\",\n\t\t\t\"revision\": \"febf2d34b54a69ce7530036c7503b1c9fbfdf0bb\",\n\t\t\t\"revisionTime\": \"2017-01-28T05:05:32Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"wIcN7tZiF441h08RHAm4NV8cYO4=\",\n\t\t\t\"path\": \"github.com/opentracing/opentracing-go\",\n\t\t\t\"revision\": \"bd9c3193394760d98b2fa6ebb2291f0cd1d06a7d\",\n\t\t\t\"revisionTime\": \"2018-06-06T20:41:48Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"uhDxBvLEqRAMZKgpTZ8MFuLIIM8=\",\n\t\t\t\"path\": \"github.com/opentracing/opentracing-go/ext\",\n\t\t\t\"revision\": \"bd9c3193394760d98b2fa6ebb2291f0cd1d06a7d\",\n\t\t\t\"revisionTime\": \"2018-06-06T20:41:48Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"tnkdNJbJxNKuPZMWapP1xhKIIGw=\",\n\t\t\t\"path\": \"github.com/opentracing/opentracing-go/log\",\n\t\t\t\"revision\": \"bd9c3193394760d98b2fa6ebb2291f0cd1d06a7d\",\n\t\t\t\"revisionTime\": \"2018-06-06T20:41:48Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Se195FlZ160eaEk/uVx4KdTPSxU=\",\n\t\t\t\"path\": \"github.com/pborman/uuid\",\n\t\t\t\"revision\": \"1b00554d822231195d1babd97ff4a781231955c9\",\n\t\t\t\"revisionTime\": \"2017-01-12T15:04:04Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"lSRg5clrIZUxq4aaExbpnpAgtWA=\",\n\t\t\t\"path\": \"github.com/peterh/liner\",\n\t\t\t\"revision\": \"a37ad39843113264dae84a5d89fcee28f50b35c6\",\n\t\t\t\"revisionTime\": \"2017-09-02T20:46:57Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"xCv4GBFyw07vZkVtKF/XrUnkHRk=\",\n\t\t\t\"path\": \"github.com/pkg/errors\",\n\t\t\t\"revision\": \"e881fd58d78e04cf6d0de1217f8707c8cc2249bc\",\n\t\t\t\"revisionTime\": \"2017-12-16T07:03:16Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"LuFv4/jlrmFNnDb/5SCSEPAM9vU=\",\n\t\t\t\"path\": \"github.com/pmezard/go-difflib/difflib\",\n\t\t\t\"revision\": \"792786c7400a136282c1664665ae0a8db921c6c2\",\n\t\t\t\"revisionTime\": \"2016-01-10T10:55:54Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"WbbxCn2jUYIL5viqLo0BKXEdPrQ=\",\n\t\t\t\"path\": \"github.com/prometheus/prometheus/util/flock\",\n\t\t\t\"revision\": \"3101606756c53221ed58ba94ecba6b26adf89dcc\",\n\t\t\t\"revisionTime\": \"2017-08-14T17:01:13Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"lU41NL1TEDtsrr0yUdp3SMB4Y9o=\",\n\t\t\t\"path\": \"github.com/rjeczalik/notify\",\n\t\t\t\"revision\": \"0f065fa99b48b842c3fd3e2c8b194c6f2b69f6b8\",\n\t\t\t\"revisionTime\": \"2018-08-27T19:31:19Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"5uqO4ITTDMklKi3uNaE/D9LQ5nM=\",\n\t\t\t\"path\": \"github.com/robertkrimen/otto\",\n\t\t\t\"revision\": \"6a77b7cbc37d0c39f7d5fa5766826e541df31fd5\",\n\t\t\t\"revisionTime\": \"2017-02-05T01:36:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"qgziiO3/QDVJMKw2nGrUbC8QldY=\",\n\t\t\t\"path\": \"github.com/robertkrimen/otto/ast\",\n\t\t\t\"revision\": \"6a77b7cbc37d0c39f7d5fa5766826e541df31fd5\",\n\t\t\t\"revisionTime\": \"2017-02-05T01:36:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"L0KsB2EzTlPgv0iae3q3SukNW7U=\",\n\t\t\t\"path\": \"github.com/robertkrimen/otto/dbg\",\n\t\t\t\"revision\": \"6a77b7cbc37d0c39f7d5fa5766826e541df31fd5\",\n\t\t\t\"revisionTime\": \"2017-02-05T01:36:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"euDLJKhw4doeTSxjEoezjxYXLzs=\",\n\t\t\t\"path\": \"github.com/robertkrimen/otto/file\",\n\t\t\t\"revision\": \"6a77b7cbc37d0c39f7d5fa5766826e541df31fd5\",\n\t\t\t\"revisionTime\": \"2017-02-05T01:36:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"LLuLITFO8chqSG0+APJIy5NtOHU=\",\n\t\t\t\"path\": \"github.com/robertkrimen/otto/parser\",\n\t\t\t\"revision\": \"6a77b7cbc37d0c39f7d5fa5766826e541df31fd5\",\n\t\t\t\"revisionTime\": \"2017-02-05T01:36:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"7J/7NaYRqKhBvZ+dTIutsEoEgFw=\",\n\t\t\t\"path\": \"github.com/robertkrimen/otto/registry\",\n\t\t\t\"revision\": \"6a77b7cbc37d0c39f7d5fa5766826e541df31fd5\",\n\t\t\t\"revisionTime\": \"2017-02-05T01:36:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"/jMXYuXycBpTqWhRyJ2xsqvHvQI=\",\n\t\t\t\"path\": \"github.com/robertkrimen/otto/token\",\n\t\t\t\"revision\": \"6a77b7cbc37d0c39f7d5fa5766826e541df31fd5\",\n\t\t\t\"revisionTime\": \"2017-02-05T01:36:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"xGlhb4NZjBVCNSbb7GIMvhn6mQg=\",\n\t\t\t\"path\": \"github.com/robfig/cron\",\n\t\t\t\"revision\": \"b41be1df696709bb6395fe435af20370037c0b4c\",\n\t\t\t\"revisionTime\": \"2018-05-05T20:34:41Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"LjPdvMphElL0GOVNQCsmZMVgWIw=\",\n\t\t\t\"path\": \"github.com/rs/cors\",\n\t\t\t\"revision\": \"a62a804a8a009876ca59105f7899938a1349f4b3\",\n\t\t\t\"revisionTime\": \"2016-06-17T23:19:35Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"hCRfPlNpqv8tvVivLzmXsoUOf1c=\",\n\t\t\t\"path\": \"github.com/rs/xhandler\",\n\t\t\t\"revision\": \"ed27b6fd65218132ee50cd95f38474a3d8a2cd12\",\n\t\t\t\"revisionTime\": \"2016-06-18T19:32:21Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"mGbTYZ8dHVTiPTTJu3ktp+84pPI=\",\n\t\t\t\"path\": \"github.com/stretchr/testify/assert\",\n\t\t\t\"revision\": \"890a5c3458b43e6104ff5da8dfa139d013d77544\",\n\t\t\t\"revisionTime\": \"2017-07-05T02:17:15Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"7vs6dSc1PPGBKyzb/SCIyeMJPLQ=\",\n\t\t\t\"path\": \"github.com/stretchr/testify/require\",\n\t\t\t\"revision\": \"890a5c3458b43e6104ff5da8dfa139d013d77544\",\n\t\t\t\"revisionTime\": \"2017-07-05T02:17:15Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"k6zbR5hiI10hkWtiK91rIY5s5/E=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"EKIow7XkgNdWvR/982ffIZxKG8Y=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/cache\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"5KPgnvCPlR0ysDAqo6jApzRQ3tw=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/comparer\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"1DRAxdlWzS4U0xKN/yQ/fdNN7f0=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/errors\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"eqKeD6DS7eNCtxVYZEHHRKkyZrw=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/filter\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"weSsccMav4BCerDpSLzh3mMxAYo=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/iterator\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"gJY7bRpELtO0PJpZXgPQ2BYFJ88=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/journal\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"MtYY1b2234y/MlS+djL8tXVAcQs=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/memdb\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"UmQeotV+m8/FduKEfLOhjdp18rs=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/opt\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"ZnyuciM+R19NG8L5YS3TIJdo1e8=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/storage\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"gWFPMz8OQeul0t54RM66yMTX49g=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/table\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"V/Dh7NV0/fy/5jX1KaAjmGcNbzI=\",\n\t\t\t\"path\": \"github.com/syndtr/goleveldb/leveldb/util\",\n\t\t\t\"revision\": \"c4c61651e9e37fa117f53c5a906d3b63090d8445\",\n\t\t\t\"revisionTime\": \"2018-07-08T03:05:51Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"SsMMqb3xn7hg1ZX5ugwZz5rzpx0=\",\n\t\t\t\"path\": \"github.com/tyler-smith/go-bip39\",\n\t\t\t\"revision\": \"dbb3b84ba2ef14e894f5e33d6c6e43641e665738\",\n\t\t\t\"revisionTime\": \"2018-10-17T06:06:43Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"xa+UUbqD3zPfa8mKAxWabRsqSzM=\",\n\t\t\t\"path\": \"github.com/tyler-smith/go-bip39/wordlists\",\n\t\t\t\"revision\": \"dbb3b84ba2ef14e894f5e33d6c6e43641e665738\",\n\t\t\t\"revisionTime\": \"2018-10-17T06:06:43Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"nD6S4KB0S+YHxVMDDE+w3PyXaMk=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"cjhPfiQbTqfkHmZM3Bi+Bm8qgN4=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/config\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"KM5UXTWkHULmw0dDRNuk8ogWyGs=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/internal/baggage\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"tZqlcHV1XoLdZp9jfnydzsZAvYo=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/internal/baggage/remote\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"QB0L0GrzyMGQp6ivkkxp7a1DPsE=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/internal/spanlog\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"79HRO/+ekkpwqDB/OMiW+AHJtlE=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/internal/throttler\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"OVQDWFtFMs+NODe0F/S5kYViQco=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/internal/throttler/remote\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"tMP/vxbHwNAbOEaUhic5/meKfac=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/log\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"j4WrA/B2SJCqHxttCQ+TYbmtQqE=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/rpcmetrics\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"+ffspyTBQLql2UiU6muvfWR/m1o=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/thrift\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"fMIQ4sJFCkqFYhXvvLKIlofqxvY=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/thrift-gen/agent\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"fRR2p+JAp7paApf32YuQuWU7yzY=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/thrift-gen/baggage\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"JZkMEOmiOFFEuGCsDOVLK5RzvMM=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/thrift-gen/jaeger\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"0teQUhTqTE1fLs+vbnTTzWOqdEQ=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/thrift-gen/sampling\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Nx5witfz05BSO2YlFzh2Gno6bA0=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/thrift-gen/zipkincore\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"DKwwIk9vq53IKO7RKccat9cnqeo=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-client-go/utils\",\n\t\t\t\"revision\": \"f7e0d4744fa6d5287c53b8ac8d4f83089ce07ce8\",\n\t\t\t\"revisionTime\": \"2018-06-07T15:18:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"k1iaOSBmLp3TpGvHNnRQXyJfwyI=\",\n\t\t\t\"path\": \"github.com/uber/jaeger-lib/metrics\",\n\t\t\t\"revision\": \"a51202d6f4a7e5a219e3841a43614ff7187ae7f1\",\n\t\t\t\"revisionTime\": \"2018-06-15T20:27:29Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"TT1rac6kpQp2vz24m5yDGUNQ/QQ=\",\n\t\t\t\"path\": \"golang.org/x/crypto/cast5\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"IQkUIOnvlf0tYloFx9mLaXSvXWQ=\",\n\t\t\t\"path\": \"golang.org/x/crypto/curve25519\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"1hwn8cgg4EVXhCpJIqmMbzqnUo0=\",\n\t\t\t\"path\": \"golang.org/x/crypto/ed25519\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"LXFcVx8I587SnWmKycSDEq9yvK8=\",\n\t\t\t\"path\": \"golang.org/x/crypto/ed25519/internal/edwards25519\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"IIhFTrLlmlc6lEFSitqi4aw2lw0=\",\n\t\t\t\"path\": \"golang.org/x/crypto/openpgp\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"olOKkhrdkYQHZ0lf1orrFQPQrv4=\",\n\t\t\t\"path\": \"golang.org/x/crypto/openpgp/armor\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"eo/KtdjieJQXH7Qy+faXFcF70ME=\",\n\t\t\t\"path\": \"golang.org/x/crypto/openpgp/elgamal\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"rlxVSaGgqdAgwblsErxTxIfuGfg=\",\n\t\t\t\"path\": \"golang.org/x/crypto/openpgp/errors\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Pq88+Dgh04UdXWZN6P+bLgYnbRc=\",\n\t\t\t\"path\": \"golang.org/x/crypto/openpgp/packet\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"s2qT4UwvzBSkzXuiuMkowif1Olw=\",\n\t\t\t\"path\": \"golang.org/x/crypto/openpgp/s2k\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"1MGpGDQqnUoRpv7VEcQrXOBydXE=\",\n\t\t\t\"path\": \"golang.org/x/crypto/pbkdf2\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"y/oIaxq2d3WPizRZfVjo8RCRYTU=\",\n\t\t\t\"path\": \"golang.org/x/crypto/ripemd160\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"dHh6VeHcbNg11miGjGEl8LbPe7w=\",\n\t\t\t\"path\": \"golang.org/x/crypto/scrypt\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Wi44TcpIOXdojyVWkvyOBnBKIS4=\",\n\t\t\t\"path\": \"golang.org/x/crypto/ssh\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"5Yb2z6UO+Arm/TEd+OEtdnwOt1A=\",\n\t\t\t\"path\": \"golang.org/x/crypto/ssh/terminal\",\n\t\t\t\"revision\": \"6a293f2d4b14b8e6d3f0539e383f6d0d30fce3fd\",\n\t\t\t\"revisionTime\": \"2017-09-25T11:22:06Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Y+HGqEkYM15ir+J93MEaHdyFy0c=\",\n\t\t\t\"path\": \"golang.org/x/net/context\",\n\t\t\t\"revision\": \"a6577fac2d73be281a500b310739095313165611\",\n\t\t\t\"revisionTime\": \"2017-03-08T20:54:49Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"vqc3a+oTUGX8PmD0TS+qQ7gmN8I=\",\n\t\t\t\"path\": \"golang.org/x/net/html\",\n\t\t\t\"revision\": \"b4690f45fa1cafc47b1c280c2e75116efe40cc13\",\n\t\t\t\"revisionTime\": \"2017-02-15T08:41:58Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"00eQaGynDYrv3tL+C7l9xH0IDZg=\",\n\t\t\t\"path\": \"golang.org/x/net/html/atom\",\n\t\t\t\"revision\": \"b4690f45fa1cafc47b1c280c2e75116efe40cc13\",\n\t\t\t\"revisionTime\": \"2017-02-15T08:41:58Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"barUU39reQ7LdgYLA323hQ/UGy4=\",\n\t\t\t\"path\": \"golang.org/x/net/html/charset\",\n\t\t\t\"revision\": \"b4690f45fa1cafc47b1c280c2e75116efe40cc13\",\n\t\t\t\"revisionTime\": \"2017-02-15T08:41:58Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"RcrB7tgYS/GMW4QrwVdMOTNqIU8=\",\n\t\t\t\"path\": \"golang.org/x/net/idna\",\n\t\t\t\"revision\": \"5ccada7d0a7ba9aeb5d3aca8d3501b4c2a509fec\",\n\t\t\t\"revisionTime\": \"2018-01-12T01:53:59Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"7EZyXN0EmZLgGxZxK01IJua4c8o=\",\n\t\t\t\"path\": \"golang.org/x/net/websocket\",\n\t\t\t\"revision\": \"b4690f45fa1cafc47b1c280c2e75116efe40cc13\",\n\t\t\t\"revisionTime\": \"2017-02-15T08:41:58Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"4TEYFKrAUuwBMqExjQBsnf/CgjQ=\",\n\t\t\t\"path\": \"golang.org/x/sync/syncmap\",\n\t\t\t\"revision\": \"f52d1811a62927559de87708c8913c1650ce4f26\",\n\t\t\t\"revisionTime\": \"2017-05-17T20:25:26Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"r1jWq0V3AI5DLN0aCnXXMH/is9Q=\",\n\t\t\t\"path\": \"golang.org/x/sys/unix\",\n\t\t\t\"revision\": \"1e2299c37cc91a509f1b12369872d27be0ce98a6\",\n\t\t\t\"revisionTime\": \"2017-11-09T13:50:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"ck5uxoEeMDUL/QqPvGvBmcbsJzg=\",\n\t\t\t\"path\": \"golang.org/x/sys/windows\",\n\t\t\t\"revision\": \"1e2299c37cc91a509f1b12369872d27be0ce98a6\",\n\t\t\t\"revisionTime\": \"2017-11-09T13:50:42Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Mr4ur60bgQJnQFfJY0dGtwWwMPE=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"3VrGQv2Z1t3JhwzGDLCz7DvnowA=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/charmap\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"8TGdZF55Q7PEu82rD7WG3C8ikhA=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/htmlindex\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"zeHyHebIZl1tGuwGllIhjfci+wI=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/internal\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"/108BuAIqv6xdIw1mi27RnopKak=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/internal/identifier\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"HeZV82ktrmgyAaYLtNFS0qYgspI=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/japanese\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"8y87WJz3OkDWtPCIXxJcYpo+OY8=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/korean\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"WYfmebIyX5Zae8NUfu9PsQjQff0=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/simplifiedchinese\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"KKqYmi6fxt3r3uo4lExss2yTMbs=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/traditionalchinese\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"G9LfJI9gySazd+MyyC6QbTHx4to=\",\n\t\t\t\"path\": \"golang.org/x/text/encoding/unicode\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"hyNCcTwMQnV6/MK8uUW9E5H0J0M=\",\n\t\t\t\"path\": \"golang.org/x/text/internal/tag\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Qk7dljcrEK1BJkAEZguxAbG9dSo=\",\n\t\t\t\"path\": \"golang.org/x/text/internal/utf8internal\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"euHabPKoKBA1T8PJWKTxjPoIDhc=\",\n\t\t\t\"path\": \"golang.org/x/text/language\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"IV4MN7KGBSocu/5NR3le3sxup4Y=\",\n\t\t\t\"path\": \"golang.org/x/text/runes\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"CbpjEkkOeh0fdM/V8xKDdI0AA88=\",\n\t\t\t\"path\": \"golang.org/x/text/secure/bidirule\",\n\t\t\t\"revision\": \"e19ae1496984b1c655b8044a65c0300a3c878dd3\",\n\t\t\t\"revisionTime\": \"2017-12-24T20:31:28Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"ziMb9+ANGRJSSIuxYdRbA+cDRBQ=\",\n\t\t\t\"path\": \"golang.org/x/text/transform\",\n\t\t\t\"revision\": \"85c29909967d7f171f821e7a42e7b7af76fb9598\",\n\t\t\t\"revisionTime\": \"2017-02-11T12:01:23Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"w8kDfZ1Ug+qAcVU0v8obbu3aDOY=\",\n\t\t\t\"path\": \"golang.org/x/text/unicode/bidi\",\n\t\t\t\"revision\": \"e19ae1496984b1c655b8044a65c0300a3c878dd3\",\n\t\t\t\"revisionTime\": \"2017-12-24T20:31:28Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"BCNYmf4Ek93G4lk5x3ucNi/lTwA=\",\n\t\t\t\"path\": \"golang.org/x/text/unicode/norm\",\n\t\t\t\"revision\": \"e19ae1496984b1c655b8044a65c0300a3c878dd3\",\n\t\t\t\"revisionTime\": \"2017-12-24T20:31:28Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"ikor+YKJu2eKwyFteBWhsb8IGy8=\",\n\t\t\t\"path\": \"golang.org/x/tools/go/ast/astutil\",\n\t\t\t\"revision\": \"be0fcc31ae2332374e800dfff29b721c585b35df\",\n\t\t\t\"revisionTime\": \"2016-11-04T18:56:24Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"2ko3hvt1vrfwG+p7SLW+zqDEeV4=\",\n\t\t\t\"path\": \"golang.org/x/tools/imports\",\n\t\t\t\"revision\": \"be0fcc31ae2332374e800dfff29b721c585b35df\",\n\t\t\t\"revisionTime\": \"2016-11-04T18:56:24Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"+4r0PnLwwyhO5/jvU5R/TEJb4kA=\",\n\t\t\t\"path\": \"gopkg.in/bsm/ratelimit.v1\",\n\t\t\t\"revision\": \"db14e161995a5177acef654cb0dd785e8ee8bc22\",\n\t\t\t\"revisionTime\": \"2016-02-20T15:49:07Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"CEFTYXtWmgSh+3Ik1NmDaJcz4E0=\",\n\t\t\t\"path\": \"gopkg.in/check.v1\",\n\t\t\t\"revision\": \"20d25e2804050c1cd24a7eea1e7a6447dd0e74ec\",\n\t\t\t\"revisionTime\": \"2016-12-08T18:13:25Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"DQXNV0EivoHm4q+bkdahYXrjjfE=\",\n\t\t\t\"path\": \"gopkg.in/karalabe/cookiejar.v2/collections/prque\",\n\t\t\t\"revision\": \"8dcd6a7f4951f6ff3ee9cbb919a06d8925822e57\",\n\t\t\t\"revisionTime\": \"2015-07-24T13:16:13Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"0xgs8lwcWLUffemlj+SsgKlxvDU=\",\n\t\t\t\"path\": \"gopkg.in/natefinch/npipe.v2\",\n\t\t\t\"revision\": \"c1b8fa8bdccecb0b8db834ee0b92fdbcfa606dd6\",\n\t\t\t\"revisionTime\": \"2016-06-21T03:49:01Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"vndxs5Tv09/8S+Dr2PBAiM557lI=\",\n\t\t\t\"path\": \"gopkg.in/olebedev/go-duktape.v3\",\n\t\t\t\"revision\": \"abf0ba0be5d5d36b1f9266463cc320b9a5ab224e\",\n\t\t\t\"revisionTime\": \"2018-03-02T12:15:09Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"/EL/UuzIPObHgESjkBMaD4gaXOw=\",\n\t\t\t\"path\": \"gopkg.in/redis.v3\",\n\t\t\t\"revision\": \"b5e368500d0a508ef8f16e9c2d4025a8a46bcc29\",\n\t\t\t\"revisionTime\": \"2016-06-27T09:56:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"b4Z72l8sq4xuWhR+nM5vbLQIv+o=\",\n\t\t\t\"path\": \"gopkg.in/redis.v3/internal\",\n\t\t\t\"revision\": \"b5e368500d0a508ef8f16e9c2d4025a8a46bcc29\",\n\t\t\t\"revisionTime\": \"2016-06-27T09:56:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"tNI/mAuqqQqfYU4vuJghUroIts4=\",\n\t\t\t\"path\": \"gopkg.in/redis.v3/internal/consistenthash\",\n\t\t\t\"revision\": \"b5e368500d0a508ef8f16e9c2d4025a8a46bcc29\",\n\t\t\t\"revisionTime\": \"2016-06-27T09:56:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"JvqkSear94dc+NgofRqBAUmLcN0=\",\n\t\t\t\"path\": \"gopkg.in/redis.v3/internal/hashtag\",\n\t\t\t\"revision\": \"b5e368500d0a508ef8f16e9c2d4025a8a46bcc29\",\n\t\t\t\"revisionTime\": \"2016-06-27T09:56:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"ROpD4/McQLnnxpPenjA0mEZfTL8=\",\n\t\t\t\"path\": \"gopkg.in/redis.v3/internal/pool\",\n\t\t\t\"revision\": \"b5e368500d0a508ef8f16e9c2d4025a8a46bcc29\",\n\t\t\t\"revisionTime\": \"2016-06-27T09:56:34Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"4BwmmgQUhWtizsR2soXND0nqZ1I=\",\n\t\t\t\"path\": \"gopkg.in/sourcemap.v1\",\n\t\t\t\"revision\": \"6e83acea0053641eff084973fee085f0c193c61a\",\n\t\t\t\"revisionTime\": \"2017-02-13T14:20:43Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"GDXPA04g0Dfwu2w++JiOKkYuZEc=\",\n\t\t\t\"path\": \"gopkg.in/sourcemap.v1/base64vlq\",\n\t\t\t\"revision\": \"6e83acea0053641eff084973fee085f0c193c61a\",\n\t\t\t\"revisionTime\": \"2017-02-13T14:20:43Z\"\n\t\t},\n\t\t{\n\t\t\t\"checksumSHA1\": \"Yx1MU40fyGe7hhqW9+dkv8kXa60=\",\n\t\t\t\"path\": \"gopkg.in/urfave/cli.v1\",\n\t\t\t\"revision\": \"cfb38830724cc34fedffe9a2a29fb54fa9169cd1\",\n\t\t\t\"revisionTime\": \"2017-08-11T01:42:03Z\"\n\t\t}\n\t],\n\t\"rootPath\": \"github.com/sero-cash/go-sero\"\n}\n"
  },
  {
    "path": "voter/backend.go",
    "content": "// Copyright 2015 The go-ethereum Authors\n// This file is part of the go-ethereum library.\n//\n// The go-ethereum library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-ethereum library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.\n\n// Package ethapi implements the general Ethereum API functions.\npackage voter\n\nimport (\n\t\"github.com/sero-cash/go-sero/accounts\"\n)\n\n// Backend interface provides the common API services (that are provided by\n// both full and light clients) with access to necessary functions.\ntype Backend interface {\n\tAccountManager() *accounts.Manager\n}\n"
  },
  {
    "path": "voter/utils.go",
    "content": "package voter\n\nimport (\n\t\"container/heap\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\ntype lotteryItem struct {\n\tLottery  *types.Lottery\n\tAttempts uint8\n}\n\ntype Item struct {\n\tKey   interface{} //the unique key of item\n\tValue interface{} //the value of the item\n\tBlock uint64      //the priority of the item in the queue\n\n\t//heap.Interface need this index and update them\n\tIndex int //index of the item in the heap\n}\n\ntype itemslice struct {\n\titems    []*Item\n\titemsMap map[interface{}]*Item //find item according to the key (inteface {} type)\n}\n\nfunc (s itemslice) Len() int { return len(s.items) }\nfunc (s itemslice) Less(i, j int) bool {\n\treturn s.items[i].Block > s.items[j].Block\n}\n\nfunc (s itemslice) Swap(i, j int) {\n\ts.items[i], s.items[j] = s.items[j], s.items[i]\n\ts.items[i].Index = i\n\ts.items[j].Index = j\n\tif s.itemsMap != nil {\n\t\ts.itemsMap[s.items[i].Key] = s.items[i]\n\t\ts.itemsMap[s.items[j].Key] = s.items[j]\n\t}\n}\n\nfunc (s *itemslice) Push(x interface{}) {\n\tn := len(s.items)\n\titem := x.(*Item)\n\titem.Index = n\n\ts.items = append(s.items, item)\n\ts.itemsMap[item.Key] = item\n}\n\nfunc (s *itemslice) Pop() interface{} {\n\told := s.items\n\tn := len(old)\n\titem := old[n-1]\n\titem.Index = -1\n\tdelete(s.itemsMap, item.Key)\n\ts.items = old[0 : n-1]\n\treturn item\n}\n\nfunc (s *itemslice) Update(key interface{}, value interface{}, block uint64) {\n\titem := s.itemByKey(key)\n\tif item != nil {\n\t\ts.updateItem(item, value, block)\n\t}\n\n}\n\nfunc (s *itemslice) itemByKey(key interface{}) *Item {\n\tif item, found := s.itemsMap[key]; found {\n\t\treturn item\n\t}\n\treturn nil\n}\n\nfunc (s *itemslice) updateItem(item *Item,\n\tvalue interface{}, block uint64) {\n\titem.Value = value\n\titem.Block = block\n\theap.Fix(s, item.Index)\n}\n\ntype PriorityQueue struct {\n\tslice   itemslice\n\tmaxSize int\n\tmutex   sync.RWMutex\n}\n\nfunc (pq *PriorityQueue) Init(maxSize int) {\n\tpq.slice.items = make([]*Item, 0, pq.maxSize)\n\tpq.slice.itemsMap = make(map[interface{}]*Item)\n\tpq.maxSize = maxSize\n}\n\nfunc (pq PriorityQueue) Len() int {\n\tpq.mutex.RLock()\n\tsize := pq.slice.Len()\n\tpq.mutex.RUnlock()\n\treturn size\n}\n\nfunc (pq *PriorityQueue) minItem() *Item {\n\tlen := pq.slice.Len()\n\tif len == 0 {\n\t\treturn nil\n\t}\n\treturn pq.slice.items[0]\n}\n\nfunc (pq *PriorityQueue) MinItem() *Item {\n\tpq.mutex.RLock()\n\tdefer pq.mutex.RUnlock()\n\treturn pq.minItem()\n}\n\nfunc (pq *PriorityQueue) PushItem(key, value interface{},\n\tblock uint64) (bPushed bool) {\n\tpq.mutex.Lock()\n\tdefer pq.mutex.Unlock()\n\tsize := pq.slice.Len()\n\titem := pq.slice.itemByKey(key)\n\tif size > 0 && item != nil {\n\t\tpq.slice.updateItem(item, value, block)\n\t\treturn true\n\t}\n\titem = &Item{\n\t\tValue: value,\n\t\tKey:   key,\n\t\tBlock: block,\n\t\tIndex: -1,\n\t}\n\tif pq.maxSize <= 0 || size < pq.maxSize {\n\t\theap.Push(&(pq.slice), item)\n\t\treturn true\n\t}\n\theap.Pop(&(pq.slice))\n\theap.Push(&(pq.slice), item)\n\treturn true\n}\n\nfunc (pq *PriorityQueue) PopItem() interface{} {\n\tpq.mutex.Lock()\n\tdefer pq.mutex.Unlock()\n\tsz := pq.slice.Len()\n\tif sz > 0 {\n\t\treturn heap.Pop(&(pq.slice)).(*Item).Value\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc (pq *PriorityQueue) Pop() *Item {\n\tpq.mutex.Lock()\n\tdefer pq.mutex.Unlock()\n\tsz := pq.slice.Len()\n\tif sz > 0 {\n\t\treturn heap.Pop(&(pq.slice)).(*Item)\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc (pq PriorityQueue) GetQueue() []interface{} {\n\titems := pq.GetQueueItems()\n\tvalues := make([]interface{}, len(items))\n\tfor i := 0; i < len(items); i++ {\n\t\tvalues[i] = items[i].Value\n\t}\n\treturn values\n}\n\nfunc (pq PriorityQueue) GetQueueItems() []*Item {\n\tsize := pq.Len()\n\tif size == 0 {\n\t\treturn []*Item{}\n\t}\n\ts := itemslice{}\n\ts.items = make([]*Item, size)\n\tpq.mutex.RLock()\n\tfor i := 0; i < size; i++ {\n\t\ts.items[i] = &Item{\n\t\t\tValue: pq.slice.items[i].Value,\n\t\t\tBlock: pq.slice.items[i].Block,\n\t\t}\n\t}\n\tpq.mutex.RUnlock()\n\tsort.Sort(s)\n\treturn s.items\n}\n"
  },
  {
    "path": "voter/voter.go",
    "content": "package voter\n\nimport (\n\t\"math/big\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/accounts\"\n\n\t\"github.com/sero-cash/go-sero/serodb\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/params\"\n)\n\nconst (\n\tevictionInterval = time.Minute\n\tchainLotterySize = 300\n\tlifeTime         = 30 * time.Minute\n\n\tdelayNum         = 1\n\tlotteryQueueSize = 12\n)\n\ntype blockChain interface {\n\tCurrentBlock() *types.Block\n\tGetHeaderByHash(hash common.Hash) *types.Header\n\tStateAt(header *types.Header) (*state.StateDB, error)\n\tSubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription\n\tGetHeader(hash common.Hash, number uint64) *types.Header\n\tGetHeaderByNumber(number uint64) *types.Header\n\tGetBlock(hash common.Hash, number uint64) *types.Block\n\tGetDB() serodb.Database\n}\n\ntype Voter struct {\n\tchain        blockChain\n\tsero         Backend\n\tlotteryCh    chan *types.Lottery\n\tvoteFeed     event.Feed\n\tvoteWorkFeed event.Feed\n\tlotteryFeed  event.Feed\n\tscope        event.SubscriptionScope\n\t//abi       types.Signer\n\tvoteMu    sync.RWMutex\n\tlotteryMu sync.RWMutex\n\twg        sync.WaitGroup\n\n\tvotes    map[common.Hash]time.Time\n\tlotterys map[common.Hash]time.Time\n\n\tstopLottery  chan struct{}\n\tstopVote     chan struct{}\n\tlotteryQueue *PriorityQueue\n\trunning      int32\n}\n\nfunc NewVoter(chainconfig *params.ChainConfig, chain blockChain, sero Backend) *Voter {\n\t// Sanitize the input to ensure no vulnerable gas prices are set\n\n\t// Create the transaction pool with its initial settings\n\tvoter := &Voter{\n\t\tsero:         sero,\n\t\tchain:        chain,\n\t\tlotteryCh:    make(chan *types.Lottery, chainLotterySize),\n\t\tvotes:        make(map[common.Hash]time.Time),\n\t\tlotterys:     make(map[common.Hash]time.Time),\n\t\tlotteryQueue: &PriorityQueue{},\n\t\tstopLottery:  make(chan struct{}),\n\t\tstopVote:     make(chan struct{}),\n\t}\n\tvoter.lotteryQueue.Init(lotteryQueueSize)\n\n\t// Subscribe events from blockchain\n\t//voter.chainHeadSub = voter.chain.SubscribeChainHeadEvent(voter.chainHeadCh)\n\n\t// Start the event loop and return\n\tgo voter.loop()\n\tgo voter.lotteryTaskLoop()\n\tgo voter.voteLoop()\n\n\treturn voter\n}\n\nfunc (self *Voter) loop() {\n\tevict := time.NewTicker(evictionInterval)\n\tdefer evict.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-evict.C:\n\t\t\tself.lotteryMu.Lock()\n\n\t\t\tdropLotterys := []common.Hash{}\n\t\t\tfor k, v := range self.lotterys {\n\t\t\t\tif time.Since(v) > lifeTime {\n\t\t\t\t\tdropLotterys = append(dropLotterys, k)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, h := range dropLotterys {\n\t\t\t\tdelete(self.lotterys, h)\n\t\t\t}\n\t\t\tself.lotteryMu.Unlock()\n\t\t\tself.voteMu.Lock()\n\t\t\tdropVotes := []common.Hash{}\n\t\t\tfor k, v := range self.votes {\n\t\t\t\tif time.Since(v) > lifeTime {\n\t\t\t\t\tdropVotes = append(dropVotes, k)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor _, h := range dropVotes {\n\t\t\t\tdelete(self.votes, h)\n\t\t\t}\n\t\t\tself.voteMu.Unlock()\n\t\t}\n\t}\n}\n\nfunc (self *Voter) IsLotteryValid(lottery *types.Lottery) bool {\n\tcurrent := self.chain.CurrentBlock().NumberU64()\n\tif (lottery.ParentNum + 1) < current-1 {\n\t\treturn false\n\t}\n\tif (lottery.ParentNum + 1) > current+2 {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (self *Voter) lotteryTaskLoop() {\n\tself.wg.Add(1)\n\tdefer self.wg.Done()\n\tfor {\n\t\tselect {\n\t\tcase lottery := <-self.lotteryCh:\n\t\t\t//current := self.chain.CurrentBlock().NumberU64()\n\t\t\tif !self.IsLotteryValid(lottery) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t//log.Info(\">>>>>>>lotteryTaskLoop new lottery\", \"poshash\", lottery.PosHash, \"block\", lottery.ParentNum+1, \"localBlock\", current)\n\t\t\tparentBlock := self.chain.GetBlock(lottery.ParentHash, lottery.ParentNum)\n\t\t\tif parentBlock == nil {\n\t\t\t\tlog.Trace(\">>>>>lotteryTaskLoop can not find parentblock\", \"parent block\", lottery.ParentNum)\n\t\t\t\tself.lotteryQueue.PushItem(lottery.PosHash, &lotteryItem{Lottery: lottery, Attempts: uint8(0)}, lottery.ParentNum+1)\n\t\t\t} else {\n\t\t\t\tselfShares, err := self.SelfShares(lottery.PosHash, lottery.ParentHash, parentBlock.Number())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"lotteryTaskLoop\", \"selfShare error \", err)\n\t\t\t\t} else {\n\t\t\t\t\tfor _, s := range selfShares {\n\t\t\t\t\t\tgo self.sign(s)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tcase <-self.stopLottery:\n\t\t\tlog.Info(\"strop voter lottery loop ....\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *Voter) voteLoop() {\n\tself.wg.Add(1)\n\tdefer self.wg.Done()\n\tevict := time.NewTicker(time.Second)\n\tdefer evict.Stop()\n\tfor {\n\t\tselect {\n\t\tcase <-evict.C:\n\t\t\tcurrent := self.chain.CurrentBlock().NumberU64()\n\t\t\tfor item := self.lotteryQueue.Pop(); item != nil; item = self.lotteryQueue.Pop() {\n\t\t\t\tlItem := item.Value.(*lotteryItem)\n\t\t\t\t//log.Info(\">>>>>voteLoop get Vote Item\", \"poshash\", lItem.Lottery.PosHash, \"block\", lItem.Lottery.ParentNum+1)\n\t\t\t\tif current > lItem.Lottery.ParentNum+delayNum {\n\t\t\t\t\tlog.Trace(\">>>>>>not need vote\", \"current\", current, \"vote block\", lItem.Lottery.ParentNum+1)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tparentBlock := self.chain.GetBlock(lItem.Lottery.ParentHash, lItem.Lottery.ParentNum)\n\t\t\t\tif parentBlock == nil {\n\t\t\t\t\tlog.Trace(\">>>>>voteLoop get parent is nil\", \"hash\", lItem.Lottery.ParentHash, \"block\", lItem.Lottery.ParentNum)\n\t\t\t\t\tself.lotteryQueue.PushItem(lItem.Lottery.PosHash, lItem, item.Block)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tselfShares, err := self.SelfShares(lItem.Lottery.PosHash, parentBlock.Hash(), parentBlock.Number())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Trace(\"lotteryTaskLoop\", \"selfShare error \", err)\n\t\t\t\t} else {\n\t\t\t\t\tfor _, s := range selfShares {\n\t\t\t\t\t\tself.sign(s)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\tcase <-self.stopVote:\n\t\t\tlog.Info(\"strop voter vote loop ....\")\n\t\t\treturn\n\t\t}\n\t}\n}\n\ntype voteInfo struct {\n\tindex     uint32\n\tparentNum uint64\n\tshareHash common.Hash\n\tposhash   common.Hash\n\tstakeHash common.Hash\n\tvotePKr   c_type.PKr\n\tisPool    bool\n\tseed      address.Seed\n}\n\nfunc cotainsVoteInfo(voteInfos []voteInfo, item voteInfo, pool *stake.StakePool) bool {\n\tif pool != nil && pool.Closed {\n\t\treturn false\n\t}\n\tfor _, v := range voteInfos {\n\t\tif v.seed == item.seed && v.index == item.index &&\n\t\t\tv.shareHash == v.shareHash && v.poshash == item.poshash &&\n\t\t\tv.parentNum == item.parentNum {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc pkrToAddress(pkr c_type.PKr) common.Address {\n\tvar addr common.Address\n\tcopy(addr[:], pkr[:])\n\treturn addr\n}\n\nfunc GetSeedByVotePkr(wallets []accounts.Wallet, pkr c_type.PKr) *address.Seed {\n\tfor _, w := range wallets {\n\t\tif w.IsMine(pkr) {\n\t\t\tseed, err := w.GetSeed()\n\t\t\tif err != nil {\n\t\t\t\tlog.Trace(\"GetSeedByVotePkr\", \"err\", err)\n\t\t\t\treturn nil\n\t\t\t} else {\n\t\t\t\treturn seed\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *Voter) SelfShares(poshash common.Hash, parent common.Hash, parentNumber *big.Int) ([]voteInfo, error) {\n\tcurrent := self.chain.CurrentBlock().NumberU64()\n\tif current > delayNum+parentNumber.Uint64() {\n\t\treturn nil, nil\n\t}\n\tparentHeader := self.chain.GetHeaderByHash(parent)\n\tif parentHeader == nil {\n\t\treturn nil, nil\n\t}\n\tstate, err := self.chain.StateAt(parentHeader)\n\tif err != nil {\n\t\tlog.Trace(\"lotteryTaskLoop\", \"stateAt\", poshash, \"err\", err)\n\t\treturn nil, err\n\t} else {\n\t\tstakeState := stake.NewStakeState(state)\n\n\t\theader := &types.Header{\n\t\t\tParentHash: parent,\n\t\t\tNumber:     new(big.Int).Add(parentNumber, common.Big1),\n\t\t}\n\t\terr := stakeState.ProcessBeforeApply(self.chain, header)\n\t\tif err != nil {\n\t\t\tlog.Error(\"lotteryTaskLoop\", \"err\", err)\n\t\t\treturn nil, nil\n\t\t}\n\t\tif stakeState.ShareSize() == 0 {\n\t\t\treturn nil, nil\n\t\t}\n\t\tints, shares, err := stakeState.SeleteShare(poshash, header.Number.Uint64())\n\t\tlog.Info(\"SelfShares selete share\", \"poshash\", poshash, \"blockNumber\", header.Number.Uint64(), \"indexs\", ints, \"pool size\", stakeState.ShareSize())\n\t\tif err != nil {\n\t\t\tlog.Info(\"lotteryTaskLoop\", \"SeleteShare\", poshash, \"err\", err)\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvar voteInfos []voteInfo\n\t\tif len(ints) > 0 {\n\t\t\tparentPos := parentHeader.HashPos()\n\t\t\twallets := self.sero.AccountManager().Wallets()\n\t\t\tfor i, share := range shares {\n\t\t\t\tvar pool *stake.StakePool\n\t\t\t\tif share.PoolId != nil {\n\t\t\t\t\tpool = stakeState.GetStakePool(*share.PoolId)\n\t\t\t\t\tif pool == nil {\n\t\t\t\t\t\tlog.Error(\"lotteryTaskLoop\", \"GetStakePool\", share.PoolId, \"note exist\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif pool != nil {\n\t\t\t\t\tstakeHash := types.StakeHash(&poshash, &parentPos, true)\n\t\t\t\t\tseed := GetSeedByVotePkr(wallets, pool.VotePKr)\n\t\t\t\t\tif seed != nil {\n\t\t\t\t\t\tvoteInfos = append(voteInfos, voteInfo{\n\t\t\t\t\t\t\tints[i],\n\t\t\t\t\t\t\tparentNumber.Uint64(),\n\t\t\t\t\t\t\tcommon.BytesToHash(share.Id()),\n\t\t\t\t\t\t\tposhash,\n\t\t\t\t\t\t\tstakeHash,\n\t\t\t\t\t\t\tpool.VotePKr,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t*seed})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshareVoteSeed := GetSeedByVotePkr(wallets, share.VotePKr)\n\t\t\t\tif shareVoteSeed != nil {\n\t\t\t\t\tstakeHash := types.StakeHash(&poshash, &parentPos, false)\n\t\t\t\t\tinfo := voteInfo{\n\t\t\t\t\t\tints[i],\n\t\t\t\t\t\tparentNumber.Uint64(),\n\t\t\t\t\t\tcommon.BytesToHash(share.Id()),\n\t\t\t\t\t\tposhash,\n\t\t\t\t\t\tstakeHash,\n\t\t\t\t\t\tshare.VotePKr,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t*shareVoteSeed}\n\t\t\t\t\tif cotainsVoteInfo(voteInfos, info, pool) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvoteInfos = append(voteInfos, info)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\treturn voteInfos, nil\n\t}\n\n}\n\nfunc (self *Voter) sign(info voteInfo) {\n\tdata := c_type.Uint256{}\n\tcopy(data[:], info.stakeHash[:])\n\tversion := 1\n\tif c_superzk.IsSzkPKr(&info.votePKr) {\n\t\tversion = 2\n\t}\n\tsk := superzk.Seed2Sk(info.seed.SeedToUint256(), version)\n\tsign, err := superzk.SignPKr_ByHeight(info.parentNum+1, &sk, &data, &info.votePKr)\n\tif err != nil {\n\t\tlog.Error(\"voter sign\", \"sign err\", err)\n\t\treturn\n\t}\n\tlog.Info(\">>>>>>>>>>>>>sign vote\", \"poshas\", info.poshash, \"block\", info.parentNum+1, \"share\", info.shareHash, \"idx\", info.index, \"isPool\", info.isPool)\n\tvote := &types.Vote{info.index, info.parentNum, info.shareHash, info.poshash, info.isPool, sign}\n\t//go self.voteWorkFeed.Send(core.NewVoteEvent{vote})\n\tself.AddVote(vote)\n}\n\n// SubscribeNewTxsEvent registers a subscription of NewTxsEvent and\n// starts sending event to the given channel.\nfunc (self *Voter) SubscribeNewVoteEvent(ch chan<- core.NewVoteEvent) event.Subscription {\n\treturn self.scope.Track(self.voteFeed.Subscribe(ch))\n}\n\nfunc (self *Voter) SubscribeWorkerVoteEvent(ch chan<- core.NewVoteEvent) event.Subscription {\n\treturn self.scope.Track(self.voteWorkFeed.Subscribe(ch))\n}\n\nfunc (self *Voter) SubscribeNewLotteryEvent(ch chan<- core.NewLotteryEvent) event.Subscription {\n\treturn self.scope.Track(self.lotteryFeed.Subscribe(ch))\n}\n\nfunc (self *Voter) SendLotteryEvent(lottery *types.Lottery) {\n\tgo self.lotteryFeed.Send(core.NewLotteryEvent{lottery})\n}\n\nfunc (self *Voter) SendVoteEvent(vote *types.Vote) {\n\tgo self.voteFeed.Send(core.NewVoteEvent{vote})\n}\n\nfunc (self *Voter) AddLottery(lottery *types.Lottery) {\n\tself.lotteryMu.Lock()\n\tdefer self.lotteryMu.Unlock()\n\tcurrent := self.chain.CurrentBlock().Number().Uint64()\n\tif current > lottery.ParentNum+delayNum {\n\t\tlog.Trace(\"AddLottery droped\", \"current\", current, \"voteBlock\", lottery.ParentNum+1)\n\t\treturn\n\t}\n\t_, exits := self.lotterys[lottery.PosHash]\n\tif !exits {\n\t\tlog.Trace(\"AddLottery\", \"poshas\", lottery.PosHash, \"block\", lottery.ParentNum+1)\n\t\tself.lotterys[lottery.PosHash] = time.Now()\n\t\tself.lotteryCh <- lottery\n\t\tself.SendLotteryEvent(lottery)\n\t}\n}\n\nfunc (self *Voter) getStateByNumber(num uint64) (*state.StateDB, error) {\n\theader := self.chain.GetHeaderByNumber(num)\n\tif header == nil {\n\t\treturn nil, nil\n\t}\n\treturn self.chain.StateAt(header)\n\n}\n\nfunc (self *Voter) AddVote(vote *types.Vote) {\n\tself.voteMu.Lock()\n\tdefer self.voteMu.Unlock()\n\n\tcurrent := self.chain.CurrentBlock().Number().Uint64()\n\tif current > vote.ParentNum+delayNum {\n\t\tlog.Trace(\"AddVote droped\", \"current\", current, \"voteBlock\", vote.ParentNum+1)\n\t\treturn\n\t}\n\t_, exits := self.votes[vote.Hash()]\n\tif !exits {\n\t\tlog.Trace(\"AddVote\", \"hashpos\", vote.PosHash, \"block\", vote.ParentNum+1)\n\t\tgo self.voteWorkFeed.Send(core.NewVoteEvent{vote})\n\t\tself.SendVoteEvent(vote)\n\t\tself.votes[vote.Hash()] = time.Now()\n\t}\n}\n\nfunc (self *Voter) Close() {\n\tif !atomic.CompareAndSwapInt32(&self.running, 0, 1) {\n\t\treturn\n\t}\n\tclose(self.stopLottery)\n\tclose(self.stopVote)\n\tself.wg.Wait()\n}\n"
  },
  {
    "path": "zero/account/address.go",
    "content": "package account\n\nimport (\n\t\"crypto/md5\"\n\t\"encoding/hex\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n\n\t\"github.com/pkg/errors\"\n)\n\nconst separator = \"0\"\n\ntype Address struct {\n\tBytes    []byte\n\tBase58   string\n\tProtocol string\n\tVersion  string\n\tSum      string\n\tIsHex    bool\n}\n\n//const hextable = \"0123456789abcdef\"\n\nfunc (self *Address) calcSum() {\n\tc := append([]byte(self.Protocol+self.Version), self.Bytes...)\n\tm := md5.Sum(c)\n\ts := base58.Encode(m[:])\n\tself.Sum = s[:2]\n}\n\nfunc (self *Address) genVersion() {\n\tif c_superzk.IsFlagSet(self.Bytes) {\n\t\tself.Version = \"1\"\n\t} else {\n\t\tself.Version = \"0\"\n\t}\n}\n\nfunc (self *Address) setBytes(bs []byte) {\n\tself.Bytes = bs\n\tself.Base58 = base58.Encode(self.Bytes)\n\tself.genVersion()\n}\n\nfunc Decode(input string) ([]byte, error) {\n\tif len(input) == 0 {\n\t\treturn nil, errors.New(\"empty hex strin\")\n\t}\n\tif !has0xPrefix(input) {\n\t\treturn nil, errors.New(\"hex string without 0x prefix\")\n\t}\n\tb, err := hex.DecodeString(input[2:])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn b, err\n}\n\nfunc has0xPrefix(input string) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\n\nfunc (self *Address) setHex(hex string) (e error) {\n\tself.IsHex = true\n\tif strings.Index(hex, \"0x\") != 0 {\n\t\thex = \"0x\" + hex\n\t}\n\tif bytes, err := Decode(hex); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tif len(bytes) == 0 {\n\t\t\te = errors.New(\"the bytes length is 0\")\n\t\t\treturn\n\t\t} else {\n\t\t\tself.setBytes(bytes)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *Address) setBase58(bs string) (e error) {\n\tif IsBase58Str(bs) {\n\t\tbytes := base58.Decode(bs)\n\t\tif len(bytes) == 0 {\n\t\t\te = errors.New(\"the bytes length is 0\")\n\t\t\treturn\n\t\t} else {\n\t\t\tself.Base58 = bs\n\t\t\tself.Bytes = bytes\n\t\t\tself.genVersion()\n\t\t\treturn\n\t\t}\n\t} else {\n\t\te = errors.New(\"the addr is not base58\")\n\t\treturn\n\t}\n\n}\nfunc (self *Address) ToCode() (ret string) {\n\treturn self.Protocol + self.Version + separator + self.Base58 + separator + self.Sum\n}\n\nfunc Encode(b []byte) string {\n\tenc := make([]byte, len(b)*2+2)\n\tcopy(enc, \"0x\")\n\thex.Encode(enc[2:], b)\n\treturn string(enc)\n}\n\nfunc (self *Address) ToHex() (ret string) {\n\treturn Encode(self.Bytes)\n}\n\nfunc (self *Address) ToBase58() (ret string) {\n\treturn self.Base58\n}\n\nfunc (self *Address) MatchProtocol(ver string) bool {\n\tif len(self.Protocol) > 0 {\n\t\treturn self.Protocol == ver\n\t} else {\n\t\treturn true\n\t}\n}\n\nfunc (self *Address) SetProtocol(p string) *Address {\n\tself.Protocol = p\n\tself.calcSum()\n\treturn self\n}\n\nfunc NewAddressByBytes(addr []byte) (ret Address) {\n\tret.setBytes(addr)\n\tret.calcSum()\n\treturn\n}\n\nfunc NewAddressByHex(addr string) (ret Address, e error) {\n\tif e = ret.setHex(addr); e != nil {\n\t\treturn\n\t}\n\tret.calcSum()\n\treturn\n}\n\nfunc IsBase58Str(s string) bool {\n\tpattern := \"^[\" + \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\" + \"]+$\"\n\tmatch, err := regexp.MatchString(pattern, s)\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn match\n}\nfunc isHexCharacter(c byte) bool {\n\treturn ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')\n}\n\nfunc IsHex(s string) bool {\n\tif has0xPrefix(s) {\n\t\ts = s[2:]\n\t}\n\n\tfor _, c := range []byte(s) {\n\t\tif !isHexCharacter(c) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc NewAddressByBase58(addr string) (ret Address, e error) {\n\tif e = ret.setBase58(addr); e != nil {\n\t\treturn\n\t}\n\tret.calcSum()\n\treturn\n}\n\n//var reg, _ = regexp.Compile(`^(.*)\\.(.*)\\.(.*)$`)\nvar reg, _ = regexp.Compile(`^(.*)0(.*)0(.*)$`)\n\nfunc NewAddressByString(addr string) (ret Address, e error) {\n\tif IsHex(addr) {\n\t\treturn NewAddressByHex(addr)\n\t} else {\n\t\tif strs := reg.FindStringSubmatch(addr); len(strs) != 4 {\n\t\t\tif IsBase58Str(addr) {\n\t\t\t\treturn NewAddressByBase58(addr)\n\t\t\t} else {\n\t\t\t\te = errors.New(\"invalid base58 string\")\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\tif e = ret.setBase58(strs[2]); e != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tret.Protocol = strs[1][:len(strs[1])-1]\n\t\t\tret.calcSum()\n\t\t\tif ret.Version != strs[1][len(strs[1])-1:] {\n\t\t\t\te = errors.New(\"the version check failed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ret.Sum != strs[3] {\n\t\t\t\te = errors.New(\"the sum check failed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/account/address_test.go",
    "content": "package account\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"testing\"\n)\n\nfunc TestAddress(t *testing.T) {\n\tbytes := []byte(\"hello address\")\n\taddr := NewAddressByBytes(bytes)\n\tfmt.Println(addr.ToCode())\n\n\thexs := \"0x12346889093334\"\n\taddr1, e := NewAddressByHex(hexs)\n\tfmt.Println(addr1.ToCode(), e)\n\tfmt.Println(addr1.ToHex())\n\n\taddr2, e := NewAddressByString(addr.ToCode())\n\tfmt.Println(addr2.ToCode())\n}\n\nvar reg1, _ = regexp.Compile(`^(.*)0(.*)0(.*)$`)\n\nfunc TestRex(t *testing.T) {\n\ta := \"SP103ATBFhrrwJhbLGd7PEGZeTg3uFjjknyegqvDyN5pvM4gvp4jyfyGTTLvwEwJhwqBjS2ceaQjN7uHC5Q5biifbRZf0NF\"\n\tstrs := reg1.FindStringSubmatch(a)\n\tfmt.Println(strs)\n}\n"
  },
  {
    "path": "zero/consensus/bytes.go",
    "content": "package consensus\n\ntype BytePair struct {\n\tKey   []byte\n\tValue []byte\n}\n\nfunc (self *BytePair) CopyTo() CItem {\n\tret := &BytePair{}\n\tret.Key = append([]byte{}, self.Key...)\n\tret.Value = append([]byte{}, self.Value...)\n\treturn ret\n}\n\nfunc (self *BytePair) CopyFrom(from CItem) {\n\tif from != nil {\n\t\tf := from.(*BytePair)\n\t\tself.Key = append([]byte{}, f.Key...)\n\t\tself.Value = append([]byte{}, f.Value...)\n\t} else {\n\t\tself.Key = []byte{}\n\t\tself.Value = []byte{}\n\t}\n\treturn\n}\n\nfunc (self *BytePair) Id() (ret []byte) {\n\tret = append([]byte{}, self.Key...)\n\treturn\n}\n\nfunc (self *BytePair) State() (ret []byte) {\n\tret = append([]byte{}, self.Value...)\n\treturn\n}\n\ntype Bytes []byte\n\nfunc (self *Bytes) CopyTo() CItem {\n\tret := append(Bytes{}, *self...)\n\treturn &ret\n}\n\nfunc (self *Bytes) CopyFrom(from CItem) {\n\tif from != nil {\n\t\t(*self) = append(Bytes{}, (*from.(*Bytes))...)\n\t} else {\n\t\t(*self) = []byte{}\n\t}\n\treturn\n}\n\nfunc (self *Bytes) Id() (ret []byte) {\n\tret = append(ret, *self...)\n\treturn\n}\n"
  },
  {
    "path": "zero/consensus/cons.go",
    "content": "package consensus\n\nimport (\n\t\"fmt\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"math/big\"\n\t\"sort\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\ntype changelog struct {\n\tkey   string\n\told   CItem\n\tindex int\n\tver   int\n}\n\ntype key struct {\n\tpre string\n\tid  []byte\n}\n\nfunc (self *key) CopyTo() (ret key) {\n\tret.pre = self.pre\n\tret.id = append([]byte{}, self.id...)\n\treturn\n}\n\nfunc (self *key) k() string {\n\treturn self.pre + string(self.id)\n}\n\ntype inBlock struct {\n\tname string\n\tref  []byte\n}\n\ntype inDB struct {\n\tref []byte\n}\n\nfunc (self *inBlock) CopyRef() (ret *inBlock) {\n\tif self != nil {\n\t\tret = &inBlock{\n\t\t\tself.name,\n\t\t\tappend([]byte{}, self.ref...),\n\t\t}\n\t}\n\treturn\n}\n\ntype consItem struct {\n\tkey     key\n\titem    CItem\n\tindex   int\n\tinCons  bool\n\tinBlock *inBlock\n\tinDB    *inDB\n}\n\nfunc (self *consItem) Log() string {\n\tret := fmt.Sprintf(\"index(%v) - id(%v) - \", self.index, hexutil.Encode(self.key.id))\n\tif self.inCons {\n\t\tret += \"inCons(true) - \"\n\t} else {\n\t\tret += \"inCons(false) - \"\n\t}\n\tif self.inBlock != nil {\n\t\tret += fmt.Sprintf(\"inBlock(%v : %v) - \", self.inBlock.name, hexutil.Encode(self.inBlock.ref))\n\t} else {\n\t\tret += \"inBlock(NULL) - \"\n\t}\n\tif self.inDB != nil {\n\t\tret += fmt.Sprintf(\"inDB(%v) - \", hexutil.Encode(self.inDB.ref))\n\t} else {\n\t\tret += \"inDB(NULL) - \"\n\t}\n\tret += fmt.Sprintf(\"VALUE(%v)\", self.item)\n\treturn ret\n}\n\nfunc (self *consItem) CopyRef() (ret *consItem) {\n\tvar item_copy CItem\n\tif self.item != nil {\n\t\titem_copy = self.item.CopyTo()\n\t}\n\tret = &consItem{\n\t\tself.key.CopyTo(),\n\t\titem_copy,\n\t\tself.index,\n\t\tself.inCons,\n\t\tself.inBlock.CopyRef(),\n\t\tself.inDB,\n\t}\n\treturn\n}\n\nfunc (self *consItem) CopyRefWithoutItem() (ret *consItem) {\n\tret = &consItem{\n\t\tself.key.CopyTo(),\n\t\tself.item,\n\t\tself.index,\n\t\tself.inCons,\n\t\tself.inBlock.CopyRef(),\n\t\tself.inDB,\n\t}\n\treturn\n}\n\ntype Cons struct {\n\tdb        DB\n\tpre       string\n\tcontent   map[string]*consItem\n\tcls       []changelog\n\tver       int\n\tupdateVer int\n}\n\nfunc NewCons(db DB, pre string) (ret Cons) {\n\tret.content = make(map[string]*consItem)\n\tret.pre = pre\n\tret.db = db\n\tret.ver = -1\n\tret.updateVer = -1\n\treturn\n}\n\nfunc (self *Cons) Copy(db DB) (ret *Cons) {\n\tret = &Cons{}\n\tret.db = db\n\tret.pre = self.pre\n\tret.content = make(map[string]*consItem)\n\tret.ver = self.ver\n\tret.updateVer = self.updateVer\n\tfor _, log := range self.cls {\n\t\ttemp := log\n\t\tif log.old != nil {\n\t\t\ttemp.old = log.old.CopyTo()\n\t\t}\n\t\tret.cls = append(ret.cls, temp)\n\t}\n\tfor k, v := range self.content {\n\t\tret.content[k] = v.CopyRef()\n\t}\n\treturn\n}\n\nfunc (self *Cons) CreateSnapshot(ver int) {\n\tself.ver = ver\n}\n\nfunc (self *Cons) RevertToSnapshot(ver int) {\n\tif ver <= self.updateVer {\n\t\tpanic(fmt.Errorf(\"revert snapshot version(%v) < update version(%v)\", ver, self.updateVer))\n\t}\n\tl := len(self.cls)\n\tfor ; l > 0; l-- {\n\t\tcl := self.cls[l-1]\n\t\tif cl.ver >= ver {\n\t\t\tif cl.old != nil {\n\t\t\t\tif v, ok := self.content[cl.key]; ok {\n\t\t\t\t\tv.item = cl.old\n\t\t\t\t\tself.content[cl.key] = v\n\t\t\t\t} else {\n\t\t\t\t\tpanic(errors.New(\"revert snapshot but can not find the keypair\"))\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdelete(self.content, cl.key)\n\t\t\t}\n\t\t} else {\n\t\t\tbreak\n\t\t}\n\t}\n\tif l != len(self.cls) {\n\t\tself.cls = self.cls[:l]\n\t}\n}\n\nfunc (self *Cons) deleteObj(k *key, item CItem, inCons bool, inblock *inBlock, indb *inDB) {\n\tif item == nil {\n\t\tpanic(errors.New(\"item can not be nil\"))\n\t}\n\tis_indb := false\n\tif indb != nil {\n\t\tis_indb = true\n\t}\n\told := self.getObj(k, item.CopyTo(), inCons, is_indb)\n\tcl := changelog{}\n\tcl.key = k.k()\n\tif old != nil {\n\t\tcl.old = old.item\n\t\tcl.index = old.index\n\t} else {\n\t\tcl.old = nil\n\t\tcl.index = -1\n\t}\n\tcl.ver = self.ver\n\tself.content[k.k()] = &consItem{k.CopyTo(), nil, len(self.cls), inCons, inblock, indb}\n\tself.cls = append(self.cls, cl)\n\treturn\n}\n\nfunc (self *Cons) addObj(k *key, item CItem, inCons bool, inblock *inBlock, indb *inDB) {\n\tif item == nil {\n\t\tpanic(errors.New(\"item can not be nil\"))\n\t}\n\tis_indb := false\n\tif indb != nil {\n\t\tis_indb = true\n\t}\n\told := self.getObj(k, item.CopyTo(), inCons, is_indb)\n\tcl := changelog{}\n\tcl.key = k.k()\n\tif old != nil {\n\t\tcl.old = old.item\n\t\tcl.index = old.index\n\t} else {\n\t\tcl.old = nil\n\t\tcl.index = -1\n\t}\n\tcl.ver = self.ver\n\tself.content[k.k()] = &consItem{k.CopyTo(), item.CopyTo(), len(self.cls), inCons, inblock, indb}\n\tself.cls = append(self.cls, cl)\n\treturn\n}\n\nfunc (self *Cons) getData(k []byte, inCons bool, inDB bool) (ret []byte) {\n\tif inDB {\n\t\tif v, err := self.db.GlobalGetter().Get(k); err != nil {\n\t\t\treturn\n\t\t} else {\n\t\t\treturn v\n\t\t}\n\t}\n\tif inCons {\n\t\tif v, err := self.db.CurrentTri().TryGet(k); err != nil {\n\t\t\treturn\n\t\t} else {\n\t\t\treturn v\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *Cons) getObj(k *key, item CItem, inCons bool, indb bool) (ret *consItem) {\n\tif i, ok := self.content[k.k()]; !ok {\n\t\tif v := self.getData([]byte(k.k()), inCons, indb); v == nil {\n\t\t\treturn nil\n\t\t} else {\n\t\t\tif e := rlp.DecodeBytes(v, item); e != nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tret = &consItem{k.CopyTo(), item, -1, false, nil, nil}\n\t\t\tself.content[k.k()] = ret.CopyRef()\n\t\t\treturn\n\t\t}\n\t} else {\n\t\titem.CopyFrom(i.item)\n\t\tret = i.CopyRefWithoutItem()\n\t\tret.item = item\n\t\treturn\n\t}\n}\n\ntype consItems []*consItem\n\nfunc (self consItems) Len() int {\n\treturn len(self)\n}\nfunc (self consItems) Less(i, j int) bool {\n\treturn self[i].index < self[j].index\n}\nfunc (self consItems) Swap(i, j int) {\n\tself[i], self[j] = self[j], self[i]\n}\n\nfunc (self *Cons) fetchConsPairs(onlyget bool) (ret consItems) {\n\tfor _, v := range self.content {\n\t\tif v.inCons {\n\t\t\tret = append(ret, v)\n\t\t\tif !onlyget {\n\t\t\t\tv.inCons = false\n\t\t\t}\n\t\t}\n\t}\n\tsort.Sort(ret)\n\treturn\n}\n\nfunc (self *Cons) fetchDBPairs() (ret consItems) {\n\tcis := consItems{}\n\tfor _, v := range self.content {\n\t\tif v.inDB != nil {\n\t\t\tcis = append(cis, v)\n\t\t}\n\t}\n\tsort.Sort(cis)\n\n\tref_map := make(map[string]*consItem)\n\tfor _, v := range cis {\n\t\tref_map[string(v.inDB.ref)] = v\n\t}\n\n\tfor _, v := range ref_map {\n\t\tret = append(ret, v)\n\t}\n\n\tsort.Sort(ret)\n\n\t/*for _, v := range cis {\n\t\tif !onlyget {\n\t\t\tv.inDB = nil\n\t\t}\n\t}*/\n\treturn\n}\n\ntype RecordPair struct {\n\tRef  []byte\n\tHash []byte\n}\ntype Record struct {\n\tName  string\n\tPairs []RecordPair\n}\n\nfunc (self *Record) Log() string {\n\tret := fmt.Sprintf(\"Name(%v)\\n\", self.Name)\n\tfor _, pair := range self.Pairs {\n\t\tret += fmt.Sprint(\"  \")\n\t\tret += fmt.Sprintf(\"Record(ref=%v,hash=%v)\", hexutil.Encode(pair.Ref), hexutil.Encode(pair.Hash))\n\t\tret += \"\\n\"\n\t}\n\treturn ret\n}\n\nfunc (self *Cons) fetchBlockRecords() (ret []*Record) {\n\n\tcis0 := consItems{}\n\tfor _, v := range self.content {\n\t\tif v.inBlock != nil {\n\t\t\tcis0 = append(cis0, v)\n\t\t}\n\t}\n\tsort.Sort(cis0)\n\n\tref_map := make(map[string]*consItem)\n\tfor _, v := range cis0 {\n\t\tref_map[string(v.inBlock.ref)] = v\n\t}\n\n\tcis1 := consItems{}\n\n\tfor _, v := range ref_map {\n\t\tcis1 = append(cis1, v)\n\t}\n\n\tsort.Sort(cis1)\n\n\tm := make(map[string]*Record)\n\n\tfor _, v := range cis1 {\n\t\tvar r *Record\n\t\tif record, ok := m[v.inBlock.name]; ok {\n\t\t\tr = record\n\t\t} else {\n\t\t\tr = &Record{Name: v.inBlock.name}\n\t\t\tm[v.inBlock.name] = r\n\t\t\tret = append(ret, r)\n\t\t}\n\t\trp := RecordPair{}\n\t\trp.Hash = append([]byte{}, v.key.id...)\n\t\trp.Ref = append([]byte{}, v.inBlock.ref...)\n\t\tr.Pairs = append(r.Pairs, rp)\n\t}\n\n\t/*for _, v := range cis0 {\n\t\tif !onlyget {\n\t\t\tv.inBlock = nil\n\t\t}\n\t}*/\n\treturn\n}\n\nfunc (self *Cons) ReportConItems(name string, items consItems, num uint64) {\n\treturn\n\tfmt.Printf(\"%v REPORT ITEMS: num=%v\\n\", name, num)\n\tfor _, item := range items {\n\t\tfmt.Print(\"  \")\n\t\tfmt.Println(item.Log())\n\t}\n\tfmt.Print(\"\\n\")\n}\n\nfunc (self *Cons) ReportRecords(records []*Record, num uint64) {\n\treturn\n\tfmt.Printf(\"BLOCK RECORDS : num=%v\\n\", num)\n\tfor _, record := range records {\n\t\tfmt.Print(record.Log())\n\t}\n\tfmt.Print(\"\\n\")\n}\n\nfunc (self *Cons) Update() {\n\tself.updateVer = self.ver\n\tself.ReportConItems(\"CONS\", self.fetchConsPairs(true), 0)\n\tconslist := self.fetchConsPairs(false)\n\tfor _, v := range conslist {\n\t\tif v.item == nil {\n\t\t\tif err := self.db.CurrentTri().TryDelete([]byte(v.key.k())); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t} else {\n\t\t\tif b, err := rlp.EncodeToBytes(v.item); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t} else {\n\t\t\t\tif err := self.db.CurrentTri().TryUpdate([]byte(v.key.k()), b); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\ntype DPutter interface {\n\tserodb.Putter\n\tserodb.Deleter\n}\n\nfunc ConsKeysKey(num uint64,bhash common.Hash) []byte {\n\tkey := []byte(\"$CONS$KEYS\")\n\tkey = append(key, big.NewInt(int64(num)).Bytes()...)\n\tkey = append(key,bhash[:]...)\n\treturn key\n}\n\nfunc PutConsKeys(putter serodb.Putter,num uint64,bhash common.Hash,keys [][]byte) {\n\tif v,err:=rlp.EncodeToBytes(keys);err!=nil {\n\t\tpanic(err)\n\t} else {\n\t\tif err:=putter.Put(ConsKeysKey(num,bhash),v);err!=nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n\nfunc GetConsKeys(getter serodb.Getter,num uint64,bhash common.Hash) [][]byte {\n\tif v,err:=getter.Get(ConsKeysKey(num,bhash));err!=nil {\n\t\treturn [][]byte{}\n\t} else {\n\t\tvar ret [][]byte\n\t\tif err:=rlp.DecodeBytes(v,&ret);err!=nil {\n\t\t\tpanic(err)\n\t\t} else {\n\t\t\treturn ret\n\t\t}\n\t}\n}\n\nfunc (self *Cons) Record(header *types.Header, batch DPutter) {\n\trecordlist := self.fetchBlockRecords()\n\tself.ReportRecords(recordlist, header.Number.Uint64())\n\n\tkeys:=[][]byte{}\n\n\tif len(recordlist) > 0 {\n\t\thash := header.Hash()\n\t\tkey:=DBObj{self.pre}.setBlockRecords(batch, header.Number.Uint64(), &hash, recordlist)\n\t\tkeys=append(keys,key)\n\t}\n\n\tdblist := self.fetchDBPairs()\n\tself.ReportConItems(\"DB\", dblist, header.Number.Uint64())\n\tfor _, v := range dblist {\n\t\tif v.item == nil {\n\t\t\tif err := batch.Delete([]byte(v.key.k())); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t} else {\n\t\t\tif b, err := rlp.EncodeToBytes(v.item); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t} else {\n\t\t\t\tk:=[]byte(v.key.k())\n\t\t\t\tif err := batch.Put(k, b); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t}\n\t\t\t\tkeys=append(keys,k)\n\t\t\t}\n\t\t}\n\t}\n\tPutConsKeys(batch,header.Number.Uint64(),header.Hash(),keys)\n}\n"
  },
  {
    "path": "zero/consensus/cons_test.go",
    "content": "package consensus\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n)\n\nfunc s2u(str string) (ret []byte) {\n\treturn []byte(str)\n}\n\nfunc TestConsSetValue(t *testing.T) {\n\tdb := NewFakeDB()\n\n\tcmap := NewCons(&db, \"block\")\n\n\ttree := NewKVPt(&cmap, \"tree\", \"test\")\n\n\ttree.SetValue(s2u(\"k0\"), s2u(\"v0\"))\n\ttree.SetValue(s2u(\"k1\"), s2u(\"v1\"))\n\tv := tree.GetValue(s2u(\"k0\"))\n\tif v == nil || bytes.Compare(v, s2u(\"v0\")) != 0 {\n\t\tt.FailNow()\n\t}\n\tv = tree.GetValue(s2u(\"k1\"))\n\tif v == nil || bytes.Compare(v, s2u(\"v1\")) != 0 {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n}\n\nfunc TestConsSnapshot(t *testing.T) {\n\tdb := NewFakeDB()\n\tcmap := NewCons(&db, \"block\")\n\ttree := NewKVPt(&cmap, \"tree\", \"test\")\n\n\tcmap.CreateSnapshot(0)\n\n\ttree.SetValue(s2u(\"k0\"), s2u(\"v0\"))\n\tv := tree.GetValue(s2u(\"k0\"))\n\tif v == nil || bytes.Compare(v, s2u(\"v0\")) != 0 {\n\t\tt.FailNow()\n\t}\n\n\tcmap.CreateSnapshot(1)\n\n\ttree.SetValue(s2u(\"k0\"), s2u(\"v1\"))\n\tv = tree.GetValue(s2u(\"k0\"))\n\tif v == nil || bytes.Compare(v, s2u(\"v1\")) != 0 {\n\t\tt.FailNow()\n\t}\n\n\tcmap.RevertToSnapshot(1)\n\n\tv = tree.GetValue(s2u(\"k0\"))\n\tif v == nil || bytes.Compare(v, s2u(\"v0\")) != 0 {\n\t\tt.FailNow()\n\t}\n\n\tcmap.RevertToSnapshot(0)\n\n\tv = tree.GetValue(s2u(\"k0\"))\n\tif v != nil {\n\t\tt.FailNow()\n\t}\n}\n\ntype TestObj struct {\n\tI string\n\tS string\n}\n\nfunc (self *TestObj) CopyTo() CItem {\n\tr := &TestObj{}\n\tr.I = self.I\n\tr.S = self.S\n\treturn r\n}\nfunc (self *TestObj) CopyFrom(item CItem) {\n\ti := item.(*TestObj)\n\tself.I = i.I\n\tself.S = i.S\n\treturn\n}\n\nfunc (self *TestObj) Id() (ret []byte) {\n\treturn append([]byte{}, []byte(self.I)...)\n}\n\nfunc (self *TestObj) State() (ret []byte) {\n\treturn append([]byte{}, []byte(self.S)...)\n}\n\nfunc NewTestObj(name string) (ret *TestObj) {\n\tret = &TestObj{}\n\tret.I = \"obj0\"\n\tret.S = name\n\treturn\n}\n\nfunc NewTestObj2(id string, name string) (ret *TestObj) {\n\tret = &TestObj{}\n\tret.I = id\n\tret.S = name\n\treturn\n}\n\nfunc TestConsSetObj(t *testing.T) {\n\tdb := NewFakeDB()\n\tcmap := NewCons(&db, \"block\")\n\ttree := NewObjPt(&cmap, \"tree$\", \"treestate$\", \"test\")\n\n\tcmap.CreateSnapshot(0)\n\n\ttree.AddObj(NewTestObj(\"0\"))\n\tv := tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"0\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\tcmap.CreateSnapshot(1)\n\n\ttree.AddObj(NewTestObj(\"1\"))\n\tv = tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"1\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\tcmap.RevertToSnapshot(1)\n\n\tv = tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"0\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\tcmap.RevertToSnapshot(0)\n\n\tv = tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v != nil {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\tconslist := cmap.fetchConsPairs(true)\n\tblocklist := cmap.fetchConsPairs(true)\n\tdblist := cmap.fetchConsPairs(true)\n\tfmt.Println(conslist)\n\tfmt.Println(blocklist)\n\tfmt.Println(dblist)\n}\n\nfunc TestConsFetch(t *testing.T) {\n\tdb := NewFakeDB()\n\tcmap := NewCons(&db, \"block\")\n\tdbobj := DBObj{\"treestate$\"}\n\ttree := NewObjPt(&cmap, \"tree$\", dbobj.Pre, \"test\")\n\n\tcmap.CreateSnapshot(0)\n\n\ttree.AddObj(NewTestObj(\"0\"))\n\tv := tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"0\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\tcmap.CreateSnapshot(1)\n\n\ttree.AddObj(NewTestObj(\"1\"))\n\tv = tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"1\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\tconslist := cmap.fetchConsPairs(false)\n\tif len(conslist) != 1 {\n\t\tt.FailNow()\n\t}\n\tblocklist := cmap.fetchBlockRecords()\n\tif len(blocklist) != 1 && len(blocklist[0].Pairs) != 1 {\n\t\tt.FailNow()\n\t}\n\tdblist := cmap.fetchDBPairs()\n\tif len(dblist) != 1 {\n\t\tt.FailNow()\n\t}\n\n\tconslist = cmap.fetchConsPairs(true)\n\tif len(conslist) != 0 {\n\t\tt.FailNow()\n\t}\n\tblocklist = cmap.fetchBlockRecords()\n\tif len(blocklist) != 1 && len(blocklist[0].Pairs) != 1 {\n\t\tt.FailNow()\n\t}\n\tdblist = cmap.fetchDBPairs()\n\tif len(dblist) != 1 {\n\t\tt.FailNow()\n\t}\n\n}\n\nfunc TestConsRecord(t *testing.T) {\n\tdb := NewFakeDB()\n\tdbcons := DBObj{\"BLOCK$CONS$INDEX$\"}\n\tcmap := NewCons(&db, dbcons.Pre)\n\tdbobj := DBObj{\"treestate$\"}\n\ttree := NewObjPt(&cmap, \"tree$\", dbobj.Pre, \"test\")\n\n\tcmap.CreateSnapshot(0)\n\n\ttree.AddObj(NewTestObj(\"0\"))\n\tv := tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"0\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\tcmap.CreateSnapshot(1)\n\n\ttree.AddObj(NewTestObj(\"1\"))\n\tv = tree.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"1\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\ttree.AddObj(NewTestObj2(\"obj1\", \"3\"))\n\tv = tree.GetObj(s2u(\"obj1\"), &TestObj{})\n\tif v.(*TestObj).S != \"3\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n\theader := types.Header{Number: big.NewInt(0)}\n\tcmap.Record(&header, &db.db)\n\n\ttestObj := TestObj{}\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"1\"), &testObj)\n\tif v == nil {\n\t\tt.FailNow()\n\t}\n\tif testObj.S != \"1\" {\n\t\tt.FailNow()\n\t}\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"0\"), &testObj)\n\tif v != nil {\n\t\tt.FailNow()\n\t}\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"2\"), &testObj)\n\tif v != nil {\n\t\tt.FailNow()\n\t}\n\n\thash := header.Hash()\n\trecords := dbcons.GetBlockRecords(db.GlobalGetter(), 0, &hash)\n\tif len(records) != 1 && len(records[0].Pairs) != 2 {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(records)\n\n\tcmap.Update()\n\n\tcmap1 := NewCons(&db, dbcons.Pre)\n\ttree1 := NewObjPt(&cmap1, \"tree$\", dbobj.Pre, \"test\")\n\tv = tree1.GetObj(s2u(\"obj0\"), &TestObj{})\n\tif v.(*TestObj).S != \"1\" {\n\t\tt.FailNow()\n\t}\n\tv = tree1.GetObj(s2u(\"obj1\"), &TestObj{})\n\tif v.(*TestObj).S != \"3\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n}\n\nfunc TestConsRecord2(t *testing.T) {\n\tdb := NewFakeDB()\n\tdbcons := DBObj{\"BLOCK$CONS$INDEX$\"}\n\tc := NewCons(&db, dbcons.Pre)\n\tcmap := &c\n\tdbobj := DBObj{\"treestate$\"}\n\ttree := NewObjPt(cmap, \"tree$\", dbobj.Pre, \"test\")\n\n\tcmap.CreateSnapshot(0)\n\n\ttree.AddObj(NewTestObj2(\"obj1\", \"11\"))\n\ttree.AddObj(NewTestObj2(\"obj1\", \"12\"))\n\ttree.AddObj(NewTestObj2(\"obj1\", \"13\"))\n\ttree.AddObj(NewTestObj2(\"obj2\", \"21\"))\n\ttree.AddObj(NewTestObj2(\"obj2\", \"22\"))\n\ttree.AddObj(NewTestObj2(\"obj3\", \"33\"))\n\n\tcmap.CreateSnapshot(1)\n\ttree.AddObj(NewTestObj2(\"obj1\", \"14\"))\n\ttree.AddObj(NewTestObj2(\"obj2\", \"25\"))\n\ttree.AddObj(NewTestObj2(\"obj3\", \"36\"))\n\n\tv := tree.GetObj(s2u(\"obj1\"), &TestObj{})\n\tif v.(*TestObj).S != \"14\" {\n\t\tt.FailNow()\n\t}\n\tv = tree.GetObj(s2u(\"obj2\"), &TestObj{})\n\tif v.(*TestObj).S != \"25\" {\n\t\tt.FailNow()\n\t}\n\tv = tree.GetObj(s2u(\"obj3\"), &TestObj{})\n\tif v.(*TestObj).S != \"36\" {\n\t\tt.FailNow()\n\t}\n\n\tcmap.RevertToSnapshot(1)\n\n\tv = tree.GetObj(s2u(\"obj1\"), &TestObj{})\n\tif v.(*TestObj).S != \"13\" {\n\t\tt.FailNow()\n\t}\n\tv = tree.GetObj(s2u(\"obj2\"), &TestObj{})\n\tif v.(*TestObj).S != \"22\" {\n\t\tt.FailNow()\n\t}\n\tv = tree.GetObj(s2u(\"obj3\"), &TestObj{})\n\tif v.(*TestObj).S != \"33\" {\n\t\tt.FailNow()\n\t}\n\n\tcmap = cmap.Copy(cmap.db)\n\n\theader := types.Header{Number: big.NewInt(0)}\n\tcmap.Record(&header, &db.db)\n\n\ttestObj := TestObj{}\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"13\"), &testObj)\n\tif v == nil {\n\t\tt.FailNow()\n\t}\n\tif testObj.I != \"obj1\" {\n\t\tt.FailNow()\n\t}\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"22\"), &testObj)\n\tif v == nil {\n\t\tt.FailNow()\n\t}\n\tif testObj.I != \"obj2\" {\n\t\tt.FailNow()\n\t}\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"33\"), &testObj)\n\tif v == nil {\n\t\tt.FailNow()\n\t}\n\tif testObj.I != \"obj3\" {\n\t\tt.FailNow()\n\t}\n\n\t//========\n\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"11\"), &testObj)\n\tif v != nil {\n\t\tt.FailNow()\n\t}\n\n\tv = dbobj.GetObject(db.GlobalGetter(), []byte(\"21\"), &testObj)\n\tif v != nil {\n\t\tt.FailNow()\n\t}\n\n\thash := header.Hash()\n\trecords := dbcons.GetBlockRecords(db.GlobalGetter(), 0, &hash)\n\tif len(records) != 1 && len(records[0].Pairs) != 3 {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(records)\n\n\tcmap.Update()\n\n\tcmap1 := NewCons(&db, dbcons.Pre)\n\ttree1 := NewObjPt(&cmap1, \"tree$\", dbobj.Pre, \"test\")\n\tv = tree1.GetObj(s2u(\"obj1\"), &TestObj{})\n\tif v.(*TestObj).S != \"13\" {\n\t\tt.FailNow()\n\t}\n\tv = tree1.GetObj(s2u(\"obj2\"), &TestObj{})\n\tif v.(*TestObj).S != \"22\" {\n\t\tt.FailNow()\n\t}\n\tv = tree1.GetObj(s2u(\"obj3\"), &TestObj{})\n\tif v.(*TestObj).S != \"33\" {\n\t\tt.FailNow()\n\t}\n\tfmt.Println(v)\n\n}\n"
  },
  {
    "path": "zero/consensus/dbobj.go",
    "content": "package consensus\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\ntype DBObj struct {\n\tPre string\n}\n\nfunc makeBlockName(pre string, num uint64, hash *common.Hash) (ret []byte) {\n\tret = []byte(pre)\n\tret = append(ret, big.NewInt(int64(num)).Bytes()...)\n\tret = append(ret, hash[:]...)\n\treturn\n}\n\nfunc (self DBObj) setBlockRecords(batch serodb.Putter, num uint64, hash *common.Hash, records []*Record) (key []byte) {\n\tif b, err := rlp.EncodeToBytes(&records); err != nil {\n\t\tpanic(err)\n\t} else {\n\t\tname := makeBlockName(self.Pre, num, hash)\n\t\tif err := batch.Put(name, b); err != nil {\n\t\t\tpanic(err)\n\t\t} else {\n\t\t\tkey=name\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self DBObj) GetBlockRecords(getter serodb.Getter, num uint64, hash *common.Hash) (records []*Record) {\n\tif b, err := getter.Get(makeBlockName(self.Pre, num, hash)); err != nil {\n\t\treturn\n\t} else {\n\t\tif err := rlp.DecodeBytes(b, &records); err != nil {\n\t\t\tpanic(err)\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self DBObj) GetBlockRecordsMap(getter serodb.Getter, num uint64, hash *common.Hash) (records map[string][]RecordPair) {\n\trecords = make(map[string][]RecordPair)\n\trds := self.GetBlockRecords(getter, num, hash)\n\tfor _, v := range rds {\n\t\trecords[v.Name] = v.Pairs\n\t}\n\treturn\n}\n\nfunc (self DBObj) GetObject(getter serodb.Getter, hash []byte, item CItem) (ret CItem) {\n\tk := key{self.Pre, hash}\n\tif v, err := getter.Get([]byte(k.k())); err != nil {\n\t\treturn\n\t} else {\n\t\tif e := rlp.DecodeBytes(v, item); e != nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn item\n\t}\n}\n"
  },
  {
    "path": "zero/consensus/fakedb.go",
    "content": "package consensus\n\nimport (\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\ntype FakeTri struct {\n\tm map[string][]byte\n}\n\nfunc NewFakeTri() (ret FakeTri) {\n\tret.m = make(map[string][]byte)\n\treturn\n}\n\nfunc (self *FakeTri) Get(key []byte) ([]byte, error) {\n\treturn self.TryGet(key)\n}\n\nfunc (self *FakeTri) Has(key []byte) (bool, error) {\n\tif _, ok := self.m[string(key)]; !ok {\n\t\treturn false, nil\n\t} else {\n\t\treturn true, nil\n\t}\n}\n\nfunc (self *FakeTri) TryGet(key []byte) ([]byte, error) {\n\tif v, ok := self.m[string(key)]; !ok {\n\t\treturn nil, errors.New(\"can not find value\")\n\t} else {\n\t\treturn v, nil\n\t}\n}\n\nfunc (self *FakeTri) Put(key, value []byte) error {\n\treturn self.TryUpdate(key, value)\n}\n\nfunc (self *FakeTri) TryUpdate(key, value []byte) error {\n\tstr := string(key)\n\tself.m[str] = append([]byte{}, value...)\n\treturn nil\n}\n\nfunc (self *FakeTri) Delete(key []byte) error {\n\treturn self.TryDelete(key)\n}\n\nfunc (self *FakeTri) TryDelete(key []byte) error {\n\tif _, ok := self.m[string(key)]; ok {\n\t\tdelete(self.m, string(key))\n\t\treturn nil\n\t} else {\n\t\treturn errors.New(\"delete a empty item\")\n\t}\n}\n\ntype FakeDB struct {\n\ttri FakeTri\n\tdb  FakeTri\n}\n\nfunc NewFakeDB() (ret FakeDB) {\n\tret.tri = NewFakeTri()\n\tret.db = NewFakeTri()\n\treturn\n}\n\nfunc (self *FakeDB) Num() uint64 {\n\treturn 0\n}\n\nfunc (self *FakeDB) CurrentTri() serodb.Tri {\n\treturn &self.tri\n}\n\nfunc (self *FakeDB) GlobalGetter() serodb.Getter {\n\treturn &self.db\n}\n"
  },
  {
    "path": "zero/consensus/iface.go",
    "content": "package consensus\n\nimport (\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\ntype DB interface {\n\tCurrentTri() serodb.Tri\n\tGlobalGetter() serodb.Getter\n}\n\ntype CItem interface {\n\tCopyTo() (ret CItem)\n\tCopyFrom(CItem)\n}\n\ntype PItem interface {\n\tCItem\n\tId() (ret []byte)\n\tState() (ret []byte)\n}\n"
  },
  {
    "path": "zero/consensus/kvpoint.go",
    "content": "package consensus\n\ntype KVPoint struct {\n\tkeyPre string\n\tcons   *Cons\n}\n\nfunc NewKVPt(cons *Cons, keyPre string, inblock string) (ret KVPoint) {\n\tret.keyPre = keyPre\n\tret.cons = cons\n\treturn\n}\n\nfunc (self *KVPoint) SetValue(id []byte, value []byte) {\n\tv := Bytes(value)\n\tself.cons.addObj(&key{self.keyPre, id}, &v, true, nil, nil)\n\treturn\n}\n\nfunc (self *KVPoint) GetValue(id []byte) (ret []byte) {\n\tif v := self.cons.getObj(&key{self.keyPre, id}, &Bytes{}, true, false); v != nil && v.item != nil {\n\t\tret = append([]byte{}, *v.item.(*Bytes)...)\n\t\treturn\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "zero/consensus/objpoint.go",
    "content": "package consensus\n\nimport \"errors\"\n\ntype ObjPoint struct {\n\tobjPre   string\n\tstatePre string\n\tinblock  string\n\tcons     *Cons\n}\n\nfunc NewObjPt(cons *Cons, objPre string, statePre string, inblock string) (ret ObjPoint) {\n\tret.objPre = objPre\n\tret.statePre = statePre\n\tret.inblock = inblock\n\tret.cons = cons\n\treturn\n}\n\nfunc (self *ObjPoint) AddObj(item PItem) {\n\tif item == nil {\n\t\tpanic(errors.New(\"item can not be nil\"))\n\t}\n\tstateHash := Bytes(item.State())\n\tself.cons.addObj(&key{self.objPre, item.Id()}, &stateHash, true, nil, nil)\n\tself.cons.addObj(&key{self.statePre, stateHash}, item, false, &inBlock{self.inblock, item.Id()}, &inDB{item.Id()})\n\treturn\n}\n\nfunc (self *ObjPoint) GetObj(id []byte, item PItem) (ret CItem) {\n\n\tif v := self.cons.getObj(&key{self.objPre, id}, &Bytes{}, true, false); v != nil && v.item != nil {\n\t\tstateHash := *v.item.(*Bytes)\n\t\tif v := self.cons.getObj(&key{self.statePre, stateHash}, item, false, true); v != nil && v.item != nil {\n\t\t\treturn v.item.(CItem)\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "zero/localdb/block.go",
    "content": "package localdb\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype Block struct {\n\tRoots []c_type.Uint256\n\tDels  []c_type.Uint256\n\tPkgs  []c_type.Uint256\n}\n\nfunc (self *Block) Serial() (ret []byte, e error) {\n\tif self != nil {\n\t\tif bytes, err := rlp.EncodeToBytes(self); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tret = bytes\n\t\t\treturn\n\t\t}\n\t} else {\n\t\treturn\n\t}\n}\n\ntype BlockGet struct {\n\tOut *Block\n}\n\nfunc (self *BlockGet) Unserial(v []byte) (e error) {\n\tif len(v) == 0 {\n\t\treturn\n\t} else {\n\t\tout := Block{}\n\t\tif err := rlp.DecodeBytes(v, &out); err != nil {\n\t\t\treturn\n\t\t} else {\n\t\t\tself.Out = &out\n\t\t\treturn\n\t\t}\n\t}\n}\nfunc BlockKey(num uint64, hash *c_type.Uint256) []byte {\n\tblock_key := []byte(\"$SERO_ZSTATE_BLOCK_SHOOTCUT$\")\n\tblock_key = append(block_key, big.NewInt(int64(num)).Bytes()...)\n\tblock_key = append(block_key, []byte(\"$\")...)\n\tblock_key = append(block_key, hash[:]...)\n\treturn block_key\n}\n\nfunc PutBlock(db serodb.Putter, num uint64, hash *c_type.Uint256, block *Block) {\n\tblockkey := BlockKey(num, hash)\n\ttri.UpdateDBObj(db, blockkey, block)\n}\n\nfunc GetBlock(db serodb.Database, num uint64, hash *c_type.Uint256) (ret *Block) {\n\tblockkey := BlockKey(num, hash)\n\tblockget := BlockGet{}\n\ttri.GetDBObj(db, blockkey, &blockget)\n\tret = blockget.Out\n\treturn\n}\n"
  },
  {
    "path": "zero/localdb/out.go",
    "content": "package localdb\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype OutState struct {\n\tIndex  uint64\n\tOut_O  *stx_v0.Out_O   `rlp:\"nil\"`\n\tOut_Z  *stx_v0.Out_Z   `rlp:\"nil\"`\n\tOut_P  *stx_v1.Out_P   `rlp:\"nil\"`\n\tOut_C  *stx_v1.Out_C   `rlp:\"nil\"`\n\tOutCM  *c_type.Uint256 `rlp:\"nil\"`\n\tRootCM *c_type.Uint256 `rlp:\"nil\"`\n}\n\nfunc (self *OutState) genOutCM() {\n\tif self.OutCM == nil {\n\t\tif cm, err := genOutCM(self); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t\tself.OutCM = &cm\n\t\t\treturn\n\t\t}\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *OutState) TryGetOutCM() (ret *c_type.Uint256) {\n\tif self.Out_O != nil {\n\t\tret = self.OutCM\n\t\treturn\n\t} else if self.Out_Z != nil {\n\t\tret = &self.Out_Z.OutCM\n\t\treturn\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *OutState) GenRootCM() {\n\tif self.Out_O != nil {\n\t\tself.genOutCM()\n\t}\n\tif self.RootCM == nil {\n\t\tif cm, err := genRootCM(self); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t\tself.RootCM = &cm\n\t\t\treturn\n\t\t}\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (out *OutState) TxType() string {\n\tif out.Out_O != nil {\n\t\treturn \"Out_O\"\n\t}\n\tif out.Out_Z != nil {\n\t\treturn \"Out_Z\"\n\t}\n\tif out.Out_P != nil {\n\t\treturn \"Out_P\"\n\t}\n\tif out.Out_C != nil {\n\t\treturn \"Out_C\"\n\t}\n\treturn \"EMPTY\"\n}\n\nfunc (out *OutState) IsZero() bool {\n\tif out.Out_Z != nil || out.Out_C != nil {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\nfunc (out *OutState) IsSzk() bool {\n\tif out.Out_P != nil || out.Out_C != nil {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (self *OutState) Clone() (ret OutState) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\nfunc (self *OutState) ToPKr() *c_type.PKr {\n\tif self.Out_O != nil {\n\t\treturn &self.Out_O.Addr\n\t} else if self.Out_Z != nil {\n\t\treturn &self.Out_Z.PKr\n\t} else if self.Out_P != nil {\n\t\treturn &self.Out_P.PKr\n\t} else if self.Out_C != nil {\n\t\treturn &self.Out_C.PKr\n\t}\n\treturn nil\n}\n\nfunc (self *OutState) Serial() (ret []byte, e error) {\n\tif self != nil {\n\t\treturn rlp.EncodeToBytes(self)\n\t} else {\n\t\treturn\n\t}\n}\n\ntype OutState0Get struct {\n\tOut *OutState\n}\n\nfunc (self *OutState0Get) Unserial(v []byte) (e error) {\n\tif len(v) == 0 {\n\t\tself.Out = nil\n\t\treturn\n\t} else {\n\t\tself.Out = &OutState{}\n\t\tif err := rlp.DecodeBytes(v, &self.Out); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/localdb/out_commitment.go",
    "content": "package localdb\n\nimport (\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nfunc HashIndexRsk(index uint64) (ret c_type.Uint256) {\n\tret = utils.NewU256(index).ToRef().ToUint256()\n\treturn\n}\n\nfunc HashIndexAr(index uint64) (ret c_type.Uint256) {\n\tindex_bytes := utils.NewU256(index)\n\tpre_ar := index_bytes.ToUint256()\n\tar_bytes := crypto.Keccak256(pre_ar[:])\n\tcopy(ret[:], ar_bytes)\n\tret = c_superzk.ForceFr(&ret)\n\treturn\n}\n\nfunc genOutCM(self *OutState) (cm c_type.Uint256, e error) {\n\tif self.Out_O != nil {\n\t\tcm, e = c_superzk.Czero_genOutCM(\n\t\t\tself.Out_O.Asset.ToTypeAsset().NewRef(),\n\t\t\t&self.Out_O.Memo,\n\t\t\t&self.Out_O.Addr,\n\t\t\tHashIndexRsk(self.Index).NewRef(),\n\t\t)\n\t\treturn\n\t} else if self.Out_Z != nil {\n\t\tcm = self.Out_Z.OutCM\n\t\treturn\n\t} else {\n\t\te = errors.New(\"no output for out cm\")\n\t\treturn\n\t}\n}\n\nfunc genRootCM(self *OutState) (cm c_type.Uint256, e error) {\n\tif self.Out_O != nil {\n\t\tout_cm := self.OutCM\n\t\tcm = c_superzk.Czero_genRootCM(self.Index, out_cm)\n\t\treturn\n\t} else if self.Out_Z != nil {\n\t\tout_cm := self.Out_Z.OutCM\n\t\tcm = c_superzk.Czero_genRootCM(self.Index, &out_cm)\n\t\treturn\n\t} else if self.Out_P != nil {\n\t\tar := HashIndexAr(self.Index)\n\t\ttype_asset := self.Out_P.Asset.ToTypeAsset()\n\t\tcm, e = c_superzk.GenRootCM_P(\n\t\t\tself.Index,\n\t\t\t&type_asset,\n\t\t\t&ar,\n\t\t\t&self.Out_P.PKr,\n\t\t)\n\t\treturn\n\t} else if self.Out_C != nil {\n\t\tcm, e = c_superzk.GenRootCM_C(\n\t\t\tself.Index,\n\t\t\t&self.Out_C.AssetCM,\n\t\t\t&self.Out_C.PKr,\n\t\t)\n\t\treturn\n\t} else {\n\t\te = errors.New(\"no output for root cm\")\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "zero/localdb/out_test.go",
    "content": "package localdb\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype Test struct {\n\tI0 int\n\tI1 int\n}\n\ntype Test1 struct {\n\tI0 int\n\tI1 int\n\tI2 int\n}\n\nfunc TestRlp(t *testing.T) {\n\ttest := Test{1, 2}\n\tbs, _ := rlp.EncodeToBytes(&test)\n\n\tvar test1 Test1\n\te := rlp.DecodeBytes(bs, &test1)\n\tfmt.Println(e)\n\tfmt.Println(test1.I2)\n}\n"
  },
  {
    "path": "zero/localdb/out_vserial.go",
    "content": "package localdb\n\nimport (\n\t\"io\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/core/types/vserial\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n)\n\ntype OutState_Version0 struct {\n\tIndex  uint64\n\tOut_O  *stx_v0.Out_O   `rlp:\"nil\"`\n\tOut_Z  *stx_v0.Out_Z   `rlp:\"nil\"`\n\tOutCM  *c_type.Uint256 `rlp:\"nil\"`\n\tRootCM *c_type.Uint256 `rlp:\"nil\"`\n}\n\ntype OutState_Version1 struct {\n\tOut_P *stx_v1.Out_P `rlp:\"nil\"`\n\tOut_C *stx_v1.Out_C `rlp:\"nil\"`\n}\n\nfunc (b *OutState) DecodeRLP(s *rlp.Stream) error {\n\tvs := vserial.NewVSerial()\n\tv0 := OutState_Version0{}\n\tv1 := OutState_Version1{}\n\n\tvs.Add(&v0, vserial.VERSION_0)\n\tvs.Add(&v1, vserial.VERSION_1)\n\tif e := s.Decode(&vs); e != nil {\n\t\treturn e\n\t}\n\n\tif vs.V() <= vserial.VERSION_1 {\n\t\tSetOSForVersion0(b, &v0)\n\t\tif vs.V() >= vserial.VERSION_1 {\n\t\t\tSetOSForVersion1(b, &v1)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc SetVersion0ForOS(v0 *OutState_Version0, b *OutState) {\n\tv0.Index = b.Index\n\tv0.Out_O = b.Out_O\n\tv0.Out_Z = b.Out_Z\n\tv0.OutCM = b.OutCM\n\tv0.RootCM = b.RootCM\n}\n\nfunc SetOSForVersion0(b *OutState, v0 *OutState_Version0) {\n\tb.Index = v0.Index\n\tb.Out_O = v0.Out_O\n\tb.Out_Z = v0.Out_Z\n\tb.OutCM = v0.OutCM\n\tb.RootCM = v0.RootCM\n}\n\nfunc SetVersion1ForOS(v1 *OutState_Version1, b *OutState) {\n\tv1.Out_P = b.Out_P\n\tv1.Out_C = b.Out_C\n}\n\nfunc SetOSForVersion1(b *OutState, v1 *OutState_Version1) {\n\tb.Out_P = v1.Out_P\n\tb.Out_C = v1.Out_C\n}\n\nfunc (b *OutState) EncodeRLP(w io.Writer) error {\n\tvs := vserial.NewVSerial()\n\n\tv0 := OutState_Version0{}\n\tSetVersion0ForOS(&v0, b)\n\tvs.Add(&v0, vserial.VERSION_0)\n\n\tif b.IsSzk() {\n\t\tv1 := OutState_Version1{}\n\t\tSetVersion1ForOS(&v1, b)\n\t\tvs.Add(&v1, vserial.VERSION_1)\n\t}\n\n\treturn rlp.Encode(w, &vs)\n}\n"
  },
  {
    "path": "zero/localdb/outstat.go",
    "content": "package localdb\n\nimport (\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype OutStat struct {\n\tTime  int64\n\tValue utils.U256\n\tZ     bool\n}\n\nfunc (self *OutStat) Serial() (ret []byte, e error) {\n\tif self != nil {\n\t\treturn rlp.EncodeToBytes(self)\n\t} else {\n\t\treturn\n\t}\n}\n\ntype OutStatGet struct {\n\tout *OutStat\n}\n\nfunc (self *OutStatGet) Unserial(v []byte) (e error) {\n\tif len(v) == 0 {\n\t\tself.out = nil\n\t\treturn\n\t} else {\n\t\tself.out = &OutStat{}\n\t\tif err := rlp.DecodeBytes(v, self.out); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc outStatName(root *c_type.Uint256) (ret []byte) {\n\tret = []byte(\"$ZSTATE_OUT_STAT$\")\n\tret = append(ret, root[:]...)\n\treturn\n}\n\nfunc UpdateOutStat(db serodb.Putter, root *c_type.Uint256, os *OutStat) {\n\tos.Time = time.Now().UnixNano()\n\ttri.UpdateDBObj(db, outStatName(root), os)\n}\n\nfunc GetOutStat(db serodb.Getter, root *c_type.Uint256) (ret *OutStat) {\n\tget := OutStatGet{}\n\ttri.GetDBObj(db, outStatName(root), &get)\n\tif get.out != nil {\n\t\tret = get.out\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/localdb/pkg.go",
    "content": "package localdb\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype ZPkg struct {\n\tHigh   uint64\n\tFrom   c_type.PKr\n\tPack   stx.PkgCreate\n\tClosed bool\n}\n\nfunc (self *ZPkg) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(big.NewInt(int64(self.High)).Bytes())\n\td.Write(self.From[:])\n\td.Write(self.Pack.ToHash().NewRef()[:])\n\tif self.Closed {\n\t\td.Write([]byte{1})\n\t} else {\n\t\td.Write([]byte{0})\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *ZPkg) Serial() (ret []byte, e error) {\n\treturn rlp.EncodeToBytes(self)\n}\n\ntype PkgGet struct {\n\tOut *ZPkg\n}\n\nfunc (self *PkgGet) Unserial(v []byte) (e error) {\n\tif len(v) < 2 {\n\t\tself.Out = nil\n\t\treturn\n\t} else {\n\t\tself.Out = &ZPkg{}\n\t\tif err := rlp.DecodeBytes(v, &self.Out); err != nil {\n\t\t\te = err\n\t\t\tself.Out = nil\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc PkgKey(root *c_type.Uint256) []byte {\n\tkey := []byte(\"$SERO_LOCALDB_PKG_HASH$\")\n\tkey = append(key, root[:]...)\n\treturn key\n}\n\nfunc PutPkg(db serodb.Putter, hash *c_type.Uint256, pkg *ZPkg) {\n\tkey := PkgKey(hash)\n\ttri.UpdateDBObj(db, key, pkg)\n}\n\nfunc GetPkg(db serodb.Getter, hash *c_type.Uint256) (ret *ZPkg) {\n\tkey := PkgKey(hash)\n\tget := PkgGet{}\n\ttri.GetDBObj(db, key, &get)\n\tret = get.Out\n\treturn\n}\n"
  },
  {
    "path": "zero/localdb/root.go",
    "content": "package localdb\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype RootState struct {\n\tOS     OutState\n\tTxHash c_type.Uint256\n\tNum    uint64\n}\n\nfunc (self *RootState) Serial() (ret []byte, e error) {\n\tif self != nil {\n\t\treturn rlp.EncodeToBytes(self)\n\t} else {\n\t\treturn\n\t}\n}\n\ntype RootStateGet struct {\n\tOut *RootState\n}\n\nfunc (self *RootStateGet) Unserial(v []byte) (e error) {\n\tif len(v) == 0 {\n\t\tself.Out = nil\n\t\treturn\n\t} else {\n\t\tself.Out = &RootState{}\n\t\tif err := rlp.DecodeBytes(v, &self.Out); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc Root2TxHashKey(root *c_type.Uint256) []byte {\n\tkey := []byte(\"$SERO_LOCALDB_ROOTSTATE$\")\n\tkey = append(key, root[:]...)\n\treturn key\n}\n\nfunc RootCM2RootKey(root_cm *c_type.Uint256) []byte {\n\tkey := []byte(\"$SERO_LOCALDB_ROOTCM2ROOT$\")\n\tkey = append(key, root_cm[:]...)\n\treturn key\n}\n\nfunc PutRoot(db serodb.Putter, root *c_type.Uint256, rs *RootState) {\n\trootkey := Root2TxHashKey(root)\n\ttri.UpdateDBObj(db, rootkey, rs)\n\trootcmkey := RootCM2RootKey(rs.OS.RootCM)\n\tdb.Put(rootcmkey, root[:])\n}\n\nfunc GetRoot(db serodb.Getter, root *c_type.Uint256) (ret *RootState) {\n\trootkey := Root2TxHashKey(root)\n\trootget := RootStateGet{}\n\ttri.GetDBObj(db, rootkey, &rootget)\n\tret = rootget.Out\n\treturn\n}\n\nfunc GetRootByRootCM(db serodb.Getter, root_cm *c_type.Uint256) (root *c_type.Uint256) {\n\trootcmkey := RootCM2RootKey(root_cm)\n\tif root_bs, err := db.Get(rootcmkey); err != nil {\n\t\treturn\n\t} else {\n\t\troot = &c_type.Uint256{}\n\t\tcopy(root[:], root_bs)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "zero/proofservice/client.go",
    "content": "package proofservice\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"log\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/light\"\n)\n\ntype LocalClient struct {\n\tbackend Backend\n}\n\nfunc NewLocalClient(backend Backend) *LocalClient {\n\treturn &LocalClient{backend}\n}\n\nfunc (self *LocalClient) CommitTx(tx *txtool.GTx) error {\n\treturn self.backend.CommitTx(tx)\n}\nfunc (self *LocalClient) CheckNils(nils []c_type.Uint256) bool {\n\tif nilResps, err := self.backend.CheckNil(nils); err == nil {\n\t\treturn len(nilResps) == 0\n\t}\n\treturn false\n}\n\ntype RemoteClient struct {\n\thost string\n}\n\nfunc NewRemoteClient(host string) *RemoteClient {\n\treturn &RemoteClient{host}\n}\n\nfunc (self *RemoteClient) CommitTx(tx *txtool.GTx) error {\n\tif _, err := commitTx(self.host, tx); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (self *RemoteClient) CheckNils(nils []c_type.Uint256) bool {\n\n\treturn checkNils(self.host, nils)\n}\n\nfunc checkNils(host string, nils []c_type.Uint256) bool {\n\tresp, err := doPost(host, \"light_checkNil\", []interface{}{nils})\n\tif err != nil {\n\t\treturn false\n\t}\n\n\tnilResps := []light.NilValue{}\n\tmessage := *resp.Result\n\terr = json.Unmarshal(message[:], &nilResps)\n\tif err != nil {\n\t\treturn false\n\t}\n\treturn len(nilResps) == 0\n}\n\nfunc commitTx(host string, tx *txtool.GTx) (string, error) {\n\n\thash := tx.Tx.ToHash()\n\t_, err := doPost(host, \"sero_commitTx\", []interface{}{tx})\n\tif err != nil {\n\t\treturn common.Bytes2Hex(hash[:]), err\n\t}\n\n\treturn common.Bytes2Hex(hash[:]), nil\n}\n\ntype JSONRpcResp struct {\n\tId     *json.RawMessage       `json:\"id\"`\n\tResult *json.RawMessage       `json:\"result\"`\n\tError  map[string]interface{} `json:\"error\"`\n}\n\nfunc doPost(url string, method string, params interface{}) (*JSONRpcResp, error) {\n\tclient := &http.Client{\n\t\tTimeout: MustParseDuration(\"900s\"),\n\t}\n\tjsonReq := map[string]interface{}{\"jsonrpc\": \"2.0\", \"method\": method, \"params\": params, \"id\": 0}\n\tdata, err := json.Marshal(jsonReq)\n\tif err != nil {\n\t\tlog.Printf(err.Error())\n\t\treturn nil, err\n\t}\n\n\treq, err := http.NewRequest(\"POST\", url, bytes.NewBuffer(data))\n\tif err != nil {\n\t\tlog.Printf(err.Error())\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Length\", (string)(len(data)))\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\treq.Header.Set(\"Accept\", \"application/json\")\n\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tvar rpcResp *JSONRpcResp\n\terr = json.NewDecoder(resp.Body).Decode(&rpcResp)\n\tif err != nil {\n\n\t\treturn nil, err\n\t}\n\tif rpcResp.Error != nil {\n\t\treturn nil, errors.New(rpcResp.Error[\"message\"].(string))\n\n\t}\n\tdata, _ = json.Marshal(rpcResp)\n\treturn rpcResp, err\n}\n\nfunc MustParseDuration(s string) time.Duration {\n\tvalue, err := time.ParseDuration(s)\n\tif err != nil {\n\t\tpanic(\"util: Can't parse duration `\" + s + \"`: \" + err.Error())\n\t}\n\treturn value\n}\n"
  },
  {
    "path": "zero/proofservice/proofservice.go",
    "content": "package proofservice\n\nimport (\n\t\"errors\"\n\t\"math/big\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\t\"github.com/sero-cash/go-sero/zero/wallet/light\"\n)\n\ntype ServiceFee struct {\n\tZinFee   *big.Int\n\tOinFee   *big.Int\n\tOutFee   *big.Int\n\tFixedFee *big.Int\n}\n\ntype Job struct {\n\tTxHash    common.Hash\n\tTimestamp time.Time\n\tError     error\n\n\ttx    *stx.T\n\tparam *txtool.GTxParam\n}\n\nfunc newJob(tx *stx.T, param *txtool.GTxParam) *Job {\n\treturn &Job{tx: tx, param: param}\n}\n\nvar instance *ProofService\n\ntype Config struct {\n\tPKr            c_type.PKr\n\tMaxWorkNumber  int\n\tMaxQueueNumber int\n\tFee            ServiceFee\n}\n\ntype ProofService struct {\n\trpc    string\n\tconfig *Config\n\n\tqueueChan chan *Job\n\tworkChan  chan *Job\n\tjobs      sync.Map\n\tworkNum   int32\n\tclient    SeroClient\n\t// redisClient *RedisClient\n\tstorage Storage\n}\n\nfunc Instance() *ProofService {\n\treturn instance\n}\n\ntype Backend interface {\n\tCommitTx(tx *txtool.GTx) error\n\tCheckNil(Nils []c_type.Uint256) (nilResps []light.NilValue, e error)\n}\n\ntype SeroClient interface {\n\tCheckNils(nils []c_type.Uint256) bool\n\tCommitTx(tx *txtool.GTx) error\n}\n\ntype Storage interface {\n\tExists(common.Hash) bool\n\tSave(job *Job)\n\tGet(hash common.Hash) *Job\n}\n\ntype MapStorage struct {\n\tcache map[common.Hash]*Job\n}\n\nfunc newMapStorage() *MapStorage {\n\treturn &MapStorage{make(map[common.Hash]*Job)}\n}\n\nfunc (storage *MapStorage) Exists(hash common.Hash) bool {\n\t_, ok := storage.cache[hash]\n\treturn ok\n}\n\nfunc (storage *MapStorage) Save(job *Job) {\n\thash := job.tx.Tx1.Tx1_Hash()\n\tstorage.cache[common.BytesToHash(hash[:])] = job\n}\n\nfunc (storage *MapStorage) Get(hash common.Hash) *Job {\n\treturn storage.cache[hash]\n}\n\nfunc NewProofService(rpc string, backend Backend, config *Config) *ProofService {\n\tproof := &ProofService{\n\t\trpc:       rpc,\n\t\tconfig:    config,\n\t\tqueueChan: make(chan *Job, config.MaxQueueNumber),\n\t}\n\n\tproof.client = NewLocalClient(backend)\n\tproof.storage = newMapStorage()\n\n\tinstance = proof\n\tgo proof.loop()\n\tlog.Info(\"ProofService start\", \"config:\", config)\n\treturn proof\n}\n\nfunc (proof *ProofService) FindTxHash(hash common.Hash) common.Hash {\n\tjob := proof.storage.Get(hash)\n\tif job != nil {\n\t\treturn job.TxHash\n\t}\n\treturn common.Hash{}\n}\n\nvar sero = *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256()\n\nfunc (proof *ProofService) checkFee(param *txtool.GTxParam) bool {\n\tif proof.config.Fee.FixedFee.Sign() > 0 {\n\t\tfor _, out := range param.Outs {\n\t\t\tif out.PKr == proof.config.PKr {\n\t\t\t\tif out.Asset.Tkn != nil {\n\t\t\t\t\tif out.Asset.Tkn.Currency == sero {\n\t\t\t\t\t\tamount := out.Asset.Tkn.Value.ToInt()\n\t\t\t\t\t\treturn amount.Cmp(proof.config.Fee.FixedFee) >= 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfee := big.NewInt(0)\n\t\tfor _, in := range param.Ins {\n\t\t\tif in.Out.State.OS.Out_P != nil {\n\t\t\t\tfee = new(big.Int).Add(fee, proof.config.Fee.ZinFee)\n\t\t\t} else if in.Out.State.OS.Out_C != nil {\n\t\t\t\tfee = new(big.Int).Add(fee, proof.config.Fee.OinFee)\n\t\t\t} else {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\tfee = new(big.Int).Add(fee, new(big.Int).Mul(proof.config.Fee.OutFee, big.NewInt(int64(len(param.Outs)-1))))\n\t\tfor _, out := range param.Outs {\n\t\t\tif out.PKr == proof.config.PKr {\n\t\t\t\tif out.Asset.Tkn != nil {\n\t\t\t\t\tif out.Asset.Tkn.Currency == sero {\n\t\t\t\t\t\tamount := out.Asset.Tkn.Value.ToInt()\n\t\t\t\t\t\treturn amount.Cmp(fee) >= 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc (proof *ProofService) Fee() ServiceFee {\n\treturn proof.config.Fee\n}\n\nfunc (proof *ProofService) SubmitWork(tx *stx.T, param *txtool.GTxParam) error {\n\thash := tx.Tx1_Hash()\n\tif !proof.checkFee(param) {\n\t\tlog.Error(\"check fee error\", \"txHash\", common.Bytes2Hex(hash[:]))\n\t\terrors.New(\"checkFee error\")\n\t}\n\n\tif proof.storage.Exists(common.BytesToHash(hash[:])) {\n\t\tlog.Warn(\"already exists\", \"txHash\", common.Bytes2Hex(hash[:]))\n\t\treturn errors.New(\"already exists\")\n\t}\n\n\tjob := newJob(tx, param)\n\tif TryEnqueue(job, proof.queueChan) {\n\t\tproof.storage.Save(job)\n\t\treturn nil\n\t}\n\treturn errors.New(\"server is busy\")\n}\n\nfunc (proof *ProofService) processJob(job *Job) {\n\tgtx, err := flight.ProveTx1(job.tx, job.param)\n\tif err != nil {\n\t\tlog.Error(\"processJob error\", \"error\", err)\n\t\tjob.Error = err\n\t\tproof.storage.Save(job)\n\t\treturn\n\t}\n\tif err := proof.client.CommitTx(&gtx); err != nil {\n\t\tlog.Error(\"processJob error\", \"error\", err)\n\t\tjob.Error = err\n\t\tproof.storage.Save(job)\n\t\treturn\n\t}\n\ttxHash := gtx.Tx.ToHash()\n\tjob.TxHash = common.BytesToHash(txHash[:])\n\tproof.storage.Save(job)\n}\n\nfunc (proof *ProofService) loop() {\n\tclear := time.NewTicker(time.Minute * 10)\n\tdefer clear.Stop()\n\n\tfor {\n\t\tfor proof.workNum >= 5 {\n\t\t\ttime.Sleep(time.Second)\n\t\t}\n\t\tselect {\n\t\tcase job := <-proof.queueChan:\n\t\t\tatomic.AddInt32(&proof.workNum, 1)\n\t\t\tgo func() {\n\t\t\t\tdefer atomic.AddInt32(&proof.workNum, -1)\n\t\t\t\tproof.processJob(job)\n\t\t\t}()\n\t\tcase <-clear.C:\n\t\t\tproof.jobs.Range(func(key, value interface{}) bool {\n\t\t\t\tjob := value.(*Job)\n\t\t\t\tif job.Timestamp.Add(time.Hour * 2).Before(time.Now()) {\n\t\t\t\t\tproof.jobs.Delete(key)\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\t}\n}\n\nfunc TryEnqueue(job *Job, jobChan chan *Job) bool {\n\tselect {\n\tcase jobChan <- job:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "zero/snapshot/generator.go",
    "content": "package snapshot\n\nimport (\n\t\"fmt\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/trie\"\n\t\"github.com/sero-cash/go-sero/zero/consensus\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n\t\"log\"\n\t\"os\"\n)\n\ntype SnapshotGen struct {\n\tsrc_db *serodb.LDBDatabase\n\tsrc_state_db state.Database\n\tsrc_head_block_hash common.Hash\n\tsrc_head_num int64\n\ttarget_db *serodb.LDBDatabase\n\n\ttarget_head_block_hash common.Hash\n\ttarget_head_num int64\n\n\tblockStop chan bool\n\tstateStop chan bool\n}\n\nfunc NewSnapshotGen(src string,target string) (ret *SnapshotGen,err error) {\n\tsg:=SnapshotGen{}\n\tif sg.src_db,err=serodb.NewLDBDatabaseEx(src,1024*8,1024,true);err!=nil {\n\t\treturn nil,err\n\t}\n\tsg.src_state_db=state.NewDatabase(sg.src_db)\n\n\t{\n\t\thash := rawdb.ReadHeadBlockHash(sg.src_db)\n\t\tnum := *rawdb.ReadHeaderNumber(sg.src_db, hash)\n\t\theader := rawdb.ReadHeader(sg.src_db, hash, num)\n\t\tfor {\n\t\t\tif _, err := state.New(sg.src_state_db, header); err == nil {\n\t\t\t\tsg.src_head_num = header.Number.Int64()\n\t\t\t\tsg.src_head_block_hash = header.Hash()\n\t\t\t\tbreak\n\t\t\t}\n\t\t\theader = rawdb.ReadHeader(sg.src_db, header.ParentHash, header.Number.Uint64()-1)\n\t\t}\n\t}\n\n\n\tif err=sg.VerifyDB();err!=nil {\n\t\treturn nil,err\n\t}\n\n\tif err=os.MkdirAll(target,os.ModePerm);err!=nil {\n\t\treturn nil,err\n\t}\n\tif sg.target_db,err=serodb.NewLDBDatabase(target,1024*8,1024);err!=nil {\n\t\treturn nil,err\n\t}\n\tsg.target_head_block_hash=rawdb.ReadHeadBlockHash(sg.target_db)\n\tif num:=rawdb.ReadHeaderNumber(sg.target_db,sg.target_head_block_hash);num!=nil {\n\t\tsg.target_head_num=int64(*num)\n\t} else {\n\t\tsg.target_head_num=-1\n\t}\n\n\tsg.blockStop=make(chan bool)\n\tsg.stateStop=make(chan bool)\n\treturn &sg,nil\n}\n\nfunc (self *SnapshotGen) Close() {\n\tself.src_db.Close();\n\tself.target_db.Close();\n}\n\nfunc (self *SnapshotGen) RunBlock() {\n\tfor {\n\t\tif self.ProcessBlock(10000)==true {\n\t\t\tbreak\n\t\t}\n\t\tlog.Print(\"Process Block:\",self.target_head_num)\n\t}\n\tself.blockStop<-true\n}\n\nfunc (self *SnapshotGen) RunState() {\n\tnum:=uint64(self.src_head_num)\n\thblock := rawdb.ReadCanonicalHash(self.src_db, num)\n\theader := rawdb.ReadHeader(self.src_db, hblock, num)\n\tif ok,count:=self.ProcessState(header.Root);ok {\n\t\tlog.Print(\"End Process State:\", num,\"count=\",count)\n\t}\n\tself.stateStop<-true\n}\n\nfunc (self *SnapshotGen) Run() {\n\tgo self.RunBlock()\n\tgo self.RunState()\n\n\t<-self.blockStop\n\t<-self.stateStop\n}\n\nfunc (self *SnapshotGen) VerifyDB() error {\n\tvar num uint64 =1310000;\n\thash:=rawdb.ReadCanonicalHash(self.src_db,num)\n\tconsKeys:=consensus.GetConsKeys(self.src_db,num,hash)\n\tif len(consKeys)==0 {\n\t\treturn fmt.Errorf(\"The src db is not SIP10 Snapshot\")\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc (self *SnapshotGen) ProcessBlock(step int) (bool) {\n\tif step==0 {\n\t\treturn true\n\t}\n\tif self.target_head_num>=self.src_head_num {\n\t\treturn true\n\t}\n\tif self.target_head_num+int64(step)>self.src_head_num {\n\t\tstep=int(self.src_head_num-self.target_head_num)\n\t}\n\tbatch:=self.target_db.NewBatch()\n\tfor i:=0;i<step;i++ {\n\t\tself.target_head_num++\n\t\tnum:=uint64(self.target_head_num);\n\n\t\tself.target_head_block_hash = rawdb.ReadCanonicalHash(self.src_db, num)\n\t\thblock:=self.target_head_block_hash\n\t\trawdb.WriteCanonicalHash(batch, hblock, num)\n\n\t\tif self.target_head_num==0 {\n\t\t\tconfig:=rawdb.ReadChainConfig(self.src_db,hblock)\n\t\t\trawdb.WriteChainConfig(batch,hblock,config)\n\t\t\tver:=rawdb.ReadDatabaseVersion(self.src_db)\n\t\t\trawdb.WriteDatabaseVersion(batch,ver)\n\t\t}\n\n\t\theader:=rawdb.ReadHeader(self.src_db,hblock,num)\n\t\trawdb.WriteHeader(batch,header)\n\n\t\tbody:=rawdb.ReadBody(self.src_db,hblock,num)\n\t\trawdb.WriteBody(batch,hblock,num,body)\n\n\t\tblock:=types.NewBlockWithHeader(header).WithBody(body.Transactions)\n\t\trawdb.WriteTxLookupEntries(batch,block)\n\n\t\treceipts:=rawdb.ReadReceipts(self.src_db,hblock,num)\n\t\trawdb.WriteReceipts(batch,hblock,num,receipts)\n\n\t\ttd:=rawdb.ReadTd(self.src_db,hblock,num)\n\t\trawdb.WriteTd(batch,hblock,num,td)\n\n\n\t\tlcBlock:=localdb.GetBlock(self.src_db,num,hblock.HashToUint256())\n\t\tlocaldb.PutBlock(batch,num,hblock.HashToUint256(),lcBlock)\n\t\tfor _,pkg:=range lcBlock.Pkgs {\n\t\t\tp:=localdb.GetPkg(self.src_db,&pkg)\n\t\t\tlocaldb.PutPkg(batch,&pkg,p)\n\t\t}\n\t\tfor _,root:=range lcBlock.Roots {\n\t\t\tr:=localdb.GetRoot(self.src_db,&root)\n\t\t\tif r==nil {\n\t\t\t\tif num>=seroparam.SIP2() {\n\t\t\t\t\tpanic(\"root state err\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlocaldb.PutRoot(batch,&root,r)\n\t\t\t}\n\t\t}\n\n\t\tconsKeys := consensus.GetConsKeys(self.src_db, num, hblock)\n\t\tif len(consKeys) > 0 {\n\t\t\tconsensus.PutConsKeys(batch, num, hblock, consKeys)\n\t\t\tfor _, key := range consKeys {\n\t\t\t\tif v, err := self.src_db.Get(key); err != nil {\n\t\t\t\t\tpanic(err)\n\t\t\t\t} else {\n\t\t\t\t\tbatch.Put(key, v)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbsnkey := stake.BlockShareNumKey(hblock)\n\t\tif v, err := self.src_db.Get(bsnkey); err != nil {\n\t\t} else {\n\t\t\tbatch.Put(bsnkey, v)\n\t\t}\n\n\t\tbvkey := stake.BlockVotesKey(hblock)\n\t\tif v, err := self.src_db.Get(bvkey); err != nil {\n\t\t} else {\n\t\t\tbatch.Put(bvkey, v)\n\t\t}\n\n\t}\n\trawdb.WriteHeadBlockHash(batch,self.target_head_block_hash)\n\trawdb.WriteHeadHeaderHash(batch,self.target_head_block_hash)\n\trawdb.WriteHeadFastBlockHash(batch,self.target_head_block_hash)\n\tbatch.Write()\n\treturn false\n}\n\nfunc (self *SnapshotGen) ProcessState(root common.Hash) (bool,int) {\n\tconst batch_num int=1024*10;\n\tsched := state.NewStateSync(root,self.target_db)\n\tqueue := append([]common.Hash{}, sched.Missing(batch_num)...)\n\tcount:=0\n\tfor len(queue) > 0 {\n\t\tresults := make([]trie.SyncResult, len(queue))\n\t\tconst c int=1024\n\t\tinput:=make(chan int)\n\t\tend:=make(chan bool)\n\t\toutput:=make(chan bool)\n\t\tfor i:=0;i<c;i++ {\n\t\t\tgo func() {\n\t\t\t\tDONE:\n\t\t\t\tfor {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase index := <-input:\n\t\t\t\t\t\thash := queue[index]\n\t\t\t\t\t\tdata, err := self.src_state_db.TrieDB().Node(hash)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tpanic(\"tri get node error\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresults[index] = trie.SyncResult{Hash: hash, Data: data}\n\t\t\t\t\tcase <-end:\n\t\t\t\t\t\tbreak DONE\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\toutput <- true\n\t\t\t}()\n\t\t}\n\t\tfor i:=0;i<len(queue);i++ {\n\t\t\tinput<-i\n\t\t}\n\t\tfor i:=0;i<c;i++ {\n\t\t\tend<-true\n\t\t}\n\t\tfor i:=0;i<c;i++ {\n\t\t\t<-output\n\t\t}\n\t\tif _, _, err := sched.Process(results); err != nil {\n\t\t\tpanic(\"sched process error\")\n\t\t}\n\t\tif ct, err := sched.Commit(self.target_db); err != nil {\n\t\t\tpanic(\"sched commit error\")\n\t\t} else {\n\t\t\tlog.Print(\"trie:\",ct)\n\t\t\tcount+=ct\n\t\t}\n\t\tqueue = append(queue[:0], sched.Missing(batch_num)...)\n\t}\n\treturn true,count\n}\n"
  },
  {
    "path": "zero/snapshot/snapshot_test.go",
    "content": "package snapshot\n\nimport (\n\t\"testing\"\n)\n\nfunc TestSnapshot(t *testing.T) {\n\tsg,_:=NewSnapshotGen(\n\t\t\"/Users/tangzhige/Documents/Env/gero/data0/datadir/gero/chaindata\",\n\t\t\"/Users/tangzhige/Documents/Env/gero/data0/datadir/gero/chaindata_bk\",\n\t)\n\tsg.Run()\n\tsg.Close()\n}"
  },
  {
    "path": "zero/stake/Hash256PRNG.go",
    "content": "package stake\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nvar (\n\t// seedConst is a constant derived from the hex representation of pi. It\n\t// is used along with a caller-provided seed when initializing\n\t// the deterministic lottery prng.\n\tseedConst = [8]byte{0x24, 0x3F, 0x6A, 0x88, 0x85, 0xA3, 0x08, 0xD3}\n)\n\n// Hash256PRNG is a determinstic pseudorandom number generator that uses a\n// 256-bit secure hashing function to generate random uint32s starting from\n// an initial seed.\ntype Hash256PRNG struct {\n\tseed     common.Hash // The seed used to initialize\n\thashIdx  int         // Position in the cached hash\n\tidx      uint64      // Position in the hash iterator\n\tlastHash common.Hash // Cached last hash used\n}\n\n// CalcHash256PRNGIV calculates and returns the initialization vector for a\n// given seed.  This can be used in conjunction with the NewHash256PRNGFromIV\n// function to arrive at the same values that are produced when calling\n// NewHash256PRNG with the seed.\nfunc CalcHash256PRNGIV(seed []byte) common.Hash {\n\tbuf := make([]byte, len(seed)+len(seedConst))\n\tcopy(buf, seed)\n\tcopy(buf[len(seed):], seedConst[:])\n\treturn common.BytesToHash(buf)\n}\n\n// NewHash256PRNGFromIV returns a deterministic pseudorandom number generator\n// that uses a 256-bit secure hashing function to generate random uint32s given\n// an initialization vector.  The CalcHash256PRNGIV can be used to calculate an\n// initialization vector for a given seed such that the generator will produce\n// the same values as if NewHash256PRNG were called with the same seed.  This\n// allows callers to cache and reuse the initialization vector for a given seed\n// to avoid recomputation.\nfunc NewHash256PRNGFromIV(iv common.Hash) *Hash256PRNG {\n\t// idx and lastHash are automatically initialized\n\t// as 0.  We initialize the seed by appending a constant\n\t// to it and hashing to give 32 bytes. This ensures\n\t// that regardless of the input, the PRNG is always\n\t// doing a short number of rounds because it only\n\t// has to hash < 64 byte messages.  The constant is\n\t// derived from the hexadecimal representation of\n\t// pi.\n\thp := new(Hash256PRNG)\n\thp.seed = iv\n\thp.lastHash = hp.seed\n\thp.idx = 0\n\treturn hp\n}\n\n// NewHash256PRNG returns a deterministic pseudorandom number generator that\n// uses a 256-bit secure hashing function to generate random uint32s given a\n// seed.\nfunc NewHash256PRNG(seed []byte) *Hash256PRNG {\n\treturn NewHash256PRNGFromIV(CalcHash256PRNGIV(seed))\n}\n\n// StateHash returns a hash referencing the current state the deterministic PRNG.\nfunc (hp *Hash256PRNG) StateHash() common.Hash {\n\tfHash := hp.lastHash\n\tfIdx := hp.idx\n\tfHashIdx := hp.hashIdx\n\n\tfinalState := make([]byte, len(fHash)+4+1)\n\tcopy(finalState, fHash[:])\n\tbinary.BigEndian.PutUint32(finalState[len(fHash):], uint32(fIdx))\n\tfinalState[len(fHash)+4] = byte(fHashIdx)\n\n\treturn common.BytesToHash(finalState)\n}\n\n// Hash256Rand returns a uint32 random number using the pseudorandom number\n// generator and updates the state.\nfunc (hp *Hash256PRNG) Hash256Rand() uint32 {\n\tr := binary.BigEndian.Uint32(hp.lastHash[hp.hashIdx*4 : hp.hashIdx*4+4])\n\thp.hashIdx++\n\n\t// 'roll over' the hash index to use and store it.\n\tif hp.hashIdx > 7 {\n\t\tidxB := make([]byte, 4)\n\t\tbinary.BigEndian.PutUint32(idxB, uint32(hp.idx))\n\t\thp.lastHash = common.BytesToHash(append(hp.seed[:], idxB...))\n\t\thp.idx++\n\t\thp.hashIdx = 0\n\t}\n\n\t// 'roll over' the PRNG by re-hashing the seed when\n\t// we overflow idx.\n\tif hp.idx > 0xFFFFFFFF {\n\t\thp.seed = common.BytesToHash(hp.seed[:])\n\t\thp.lastHash = hp.seed\n\t\thp.idx = 0\n\t}\n\n\treturn r\n}\n\n// uniformRandom returns a random in the range [0 ... upperBound) while avoiding\n// modulo bias, thus giving a normal distribution within the specified range.\n//\n// Ported from\n// https://github.com/conformal/clens/blob/master/src/arc4random_uniform.c\nfunc (hp *Hash256PRNG) uniformRandom(upperBound uint32) uint32 {\n\tvar r, min uint32\n\tif upperBound < 2 {\n\t\treturn 0\n\t}\n\n\tif upperBound > 0x80000000 {\n\t\tmin = 1 + ^upperBound\n\t} else {\n\t\t// (2**32 - (x * 2)) % x == 2**32 % x when x <= 2**31\n\t\tmin = ((0xFFFFFFFF - (upperBound * 2)) + 1) % upperBound\n\t}\n\n\tfor {\n\t\tr = hp.Hash256Rand()\n\t\tif r >= min {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn r % upperBound\n}\n\n// intInSlice returns true if an integer is in the passed slice, false otherwise.\nfunc intInSlice(i uint32, sl []uint32) bool {\n\tfor _, e := range sl {\n\t\tif i == e {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// findShareIdxs finds n many unique index numbers for a list length size.\nfunc findShareIdxs(size uint32, n uint16, prng *Hash256PRNG) ([]uint32, error) {\n\tif size < uint32(n) {\n\t\treturn nil, fmt.Errorf(\"list size too small: %v < %v\", size, n)\n\t}\n\n\tmax := int64(0xFFFFFFFF)\n\tif int64(size) > max {\n\t\treturn nil, fmt.Errorf(\"list size too big: %v > %v\", size, max)\n\t}\n\tsz := uint32(size)\n\n\tvar list []uint32\n\tvar listLen uint16\n\tfor listLen < n {\n\t\tr := prng.uniformRandom(sz)\n\t\tif !intInSlice(r, list) {\n\t\t\tlist = append(list, r)\n\t\t\tlistLen++\n\t\t}\n\t}\n\n\treturn list, nil\n}\n\n// FindShareIdxs is the exported version of findShareIdxs used for testing.\nfunc FindShareIdxs(size uint32, n uint16, prng *Hash256PRNG) ([]uint32, error) {\n\treturn findShareIdxs(size, n, prng)\n}\n"
  },
  {
    "path": "zero/stake/ITree.go",
    "content": "package stake\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype ITree interface {\n\tInsert(*Node)\n\tDelete(nodeHash common.Hash, num uint32) *Node\n\tFindByIndex(index uint32) (*Node, error)\n\n\tMidtraverse()\n\t// GetNode(nodeHash common.Hash) *Node\n\tSize() uint32\n}\n\nfunc NewTree(state State, blockNumber uint64) ITree {\n\tif blockNumber >= seroparam.SIP8() {\n\t\treturn &AVLTree{state}\n\t} else {\n\t\treturn &STree{state}\n\t}\n}\n\ntype Node struct {\n\tpkey   common.Hash\n\tkey    common.Hash\n\tnum    uint32\n\ttotal  uint32\n\tfactor int\n}\n\nfunc (node *Node) Print() {\n\tpadn := \"|\"\n\t// for i := 2; i <= node.height; i++ {\n\t// \tpadn += \"   \"\n\t// }\n\tif node == nil || node.key == emptyHash {\n\t\treturn\n\t}\n\tfmt.Printf(\"%02v, %s%s, %v, %v\\n\", node.factor, padn, node.key.String(), node.total, node.num)\n}\n\nfunc (node *Node) copy() *Node {\n\treturn &Node{node.pkey, node.key, node.num, node.total, node.factor}\n}\n\nfunc (node *Node) del(state State) {\n\tstate.GetStakeState(node.totalKey())\n}\n\nfunc (node *Node) load(state State) *Node {\n\ttotal := state.GetStakeState(node.totalKey())\n\tnum := state.GetStakeState(node.numKey())\n\tfactor := state.GetStakeState(node.factorKey())\n\tnode.total = utils.DecodeNumber32(total[28:32])\n\tnode.num = utils.DecodeNumber32(num[28:32])\n\tnode.factor = int(utils.DecodeNumber32(factor[28:32]))\n\treturn node\n}\n\nfunc (node *Node) store(state State) {\n\tstate.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.total)), 32)))\n\tstate.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.num)), 32)))\n\tstate.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.factor)), 32)))\n\tstate.SetStakeState(node.leftKey(), emptyHash)\n\tstate.SetStakeState(node.rightKey(), emptyHash)\n}\n\nfunc (node *Node) setNode(state State, valNode *Node, pkey common.Hash, leftChild, rightChild *Node) {\n\tnode.key = valNode.key\n\tnode.num = valNode.num\n\n\tnode.pkey = pkey\n\tstate.SetStakeState(pkey, node.key)\n\tstate.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.num)), 32)))\n\tstate.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.factor)), 32)))\n\tstate.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.total)), 32)))\n\n\tif leftChild != nil {\n\t\tstate.SetStakeState(node.leftKey(), leftChild.key)\n\t} else {\n\t\tstate.SetStakeState(node.leftKey(), emptyHash)\n\t}\n\n\tif rightChild != nil {\n\t\tstate.SetStakeState(node.rightKey(), rightChild.key)\n\t} else {\n\t\tstate.SetStakeState(node.rightKey(), emptyHash)\n\t}\n}\n\nfunc (node *Node) setLeftChild(state State, left *Node) {\n\tif left != nil {\n\t\tstate.SetStakeState(node.leftKey(), left.key)\n\t} else {\n\t\tstate.SetStakeState(node.leftKey(), emptyHash)\n\t}\n}\n\nfunc (node *Node) setRightChild(state State, right *Node) {\n\tif right != nil {\n\t\tstate.SetStakeState(node.rightKey(), right.key)\n\t} else {\n\t\tstate.SetStakeState(node.rightKey(), emptyHash)\n\t}\n}\n\nfunc (node *Node) setTotal(state State, val uint32) {\n\tnode.total = val\n\tstate.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(val)), 32)))\n}\n\nfunc (node *Node) setFactor(state State, val int) {\n\tif node.factor != val {\n\t\tnode.factor = val\n\t\tstate.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(val)), 32)))\n\t}\n}\n\nfunc (node *Node) setNum(state State, val uint32) {\n\tnode.num = val\n\tstate.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(val)), 32)))\n}\n\nfunc (node *Node) left(state State) *Node {\n\tpath := node.leftKey()\n\thash := state.GetStakeState(path)\n\tif hash == emptyHash {\n\t\treturn nil\n\t} else {\n\t\tleft := &Node{key: hash, pkey: path}\n\t\treturn left.load(state)\n\t}\n}\n\nfunc (node *Node) leftChildKey(state State) common.Hash {\n\tleftChild := node.left(state)\n\tif leftChild != nil {\n\t\treturn leftChild.key\n\t} else {\n\t\treturn emptyHash\n\t}\n}\n\nfunc (node *Node) leftChildTotal(state State) uint32 {\n\tleftChild := node.left(state)\n\tif leftChild != nil {\n\t\treturn leftChild.total\n\t} else {\n\t\treturn 0\n\t}\n}\n\nfunc (node *Node) leftChildFactor(state State) int {\n\tleftChild := node.left(state)\n\tif leftChild != nil {\n\t\treturn leftChild.factor\n\t} else {\n\t\treturn 0\n\t}\n}\n\nfunc (node *Node) right(state State) *Node {\n\tpath := node.rightKey()\n\thash := state.GetStakeState(path)\n\tif hash == emptyHash {\n\t\treturn nil\n\t} else {\n\t\tright := &Node{key: hash, pkey: path}\n\t\treturn right.load(state)\n\t}\n}\n\nfunc (node *Node) rightChildKey(state State) common.Hash {\n\trightChild := node.right(state)\n\tif rightChild != nil {\n\t\treturn rightChild.key\n\t} else {\n\t\treturn emptyHash\n\t}\n}\n\nfunc (node *Node) rightChildFactor(state State) int {\n\trightChild := node.right(state)\n\tif rightChild != nil {\n\t\treturn rightChild.factor\n\t} else {\n\t\treturn 0\n\t}\n}\n\nfunc (node *Node) rightChildTotal(state State) uint32 {\n\trightChild := node.right(state)\n\tif rightChild != nil {\n\t\treturn rightChild.total\n\t} else {\n\t\treturn 0\n\t}\n}\n\nfunc (node *Node) leftKey() common.Hash {\n\thash := common.BytesToHash(node.key[:])\n\thash[29] = 0\n\thash[30] = 0\n\thash[31] = 0\n\treturn hash\n}\n\nfunc (node *Node) rightKey() common.Hash {\n\thash := common.BytesToHash(node.key[:])\n\thash[29] = 0\n\thash[30] = 0\n\thash[31] = 1\n\treturn hash\n}\n\nfunc (node *Node) numKey() common.Hash {\n\thash := common.BytesToHash(node.key[:])\n\thash[29] = 0\n\thash[30] = 1\n\thash[31] = 0\n\treturn hash\n}\n\nfunc (node *Node) totalKey() common.Hash {\n\thash := common.BytesToHash(node.key[:])\n\thash[29] = 0\n\thash[30] = 1\n\thash[31] = 1\n\treturn hash\n}\n\nfunc (node *Node) factorKey() common.Hash {\n\thash := common.BytesToHash(node.key[:])\n\thash[29] = 1\n\thash[30] = 0\n\thash[31] = 0\n\treturn hash\n}\n\nfunc safeSub(a, b uint32) uint32 {\n\tif a < b {\n\t\tpanic(\"\")\n\t}\n\treturn a - b\n}\n"
  },
  {
    "path": "zero/stake/avltree.go",
    "content": "package stake\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nvar (\n//errNotExist       = errors.New(\"index is not existed\")\n//errTreeNil        = errors.New(\"tree is null\")\n//errTreeIndexExist = errors.New(\"tree index is existed\")\n)\n\nvar (\n\trootKey_new = common.BytesToHash([]byte(\"ROOT\"))\n)\n\ntype AVLTree struct {\n\tstate State\n}\n\nfunc NewAVLTree(state State) *AVLTree {\n\treturn &AVLTree{state}\n}\n\nfunc InitAVLTree(state State) {\n\toldTree := &STree{state}\n\tCopyFromOldV0(oldTree)\n}\n\nfunc CopyFromOldV0(old *STree) *AVLTree {\n\tlist := make([]*Node, 0)\n\told.midtraverse(old.newRootNode(), func(node *Node) {\n\t\tlist = append(list, node)\n\n\t}, nil)\n\told.state.SetStakeState(rootKey, emptyHash)\n\n\ttree := NewAVLTree(old.state)\n\tfor _, node := range list {\n\t\told.state.SetStakeState(node.leftKey(), emptyHash)\n\t\told.state.SetStakeState(node.rightKey(), emptyHash)\n\t\ttree.Insert(&Node{key: node.key, total: node.num, num: node.num, factor: 1})\n\t}\n\treturn tree\n}\n\nfunc CopyFromOldV1(old *STree) *AVLTree {\n\told.Lasttraverse(old.newRootNode(), func(node *Node) {\n\t\tleft := node.left(old.state)\n\t\tright := node.right(old.state)\n\n\t\tif left != nil && right != nil {\n\t\t\theight := max(int(left.factor), int(right.factor)) + 1\n\t\t\told.state.SetStakeState(node.factorKey(),\n\t\t\t\tcommon.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(height)), 32)))\n\t\t} else if left != nil {\n\t\t\told.state.SetStakeState(node.factorKey(),\n\t\t\t\tcommon.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(left.factor)+1), 32)))\n\t\t} else if right != nil {\n\t\t\told.state.SetStakeState(node.factorKey(),\n\t\t\t\tcommon.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(right.factor)+1), 32)))\n\t\t} else {\n\t\t\told.state.SetStakeState(node.factorKey(),\n\t\t\t\tcommon.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(1), 32)))\n\t\t}\n\t})\n\n\ttree := NewAVLTree(old.state)\n\treturn tree\n}\n\nfunc Copy(state State, old *AVLTree) *AVLTree {\n\ttree := NewAVLTree(state)\n\tnode := old.newRootNode()\n\tstate.SetStakeState(rootKey_new, node.key)\n\told.midtraverse(node, func(node *Node) {\n\t\tnode.store(state)\n\t\tnode.setLeftChild(state, node.left(old.state))\n\t\tnode.setRightChild(state, node.right(old.state))\n\n\t\t//\n\t}, nil)\n\treturn tree\n}\n\nfunc max(data1 int, data2 int) int {\n\tif data1 > data2 {\n\t\treturn data1\n\t}\n\treturn data2\n}\n\nfunc (tree *AVLTree) getHeight(node *Node) int {\n\tif node == nil {\n\t\treturn 0\n\t}\n\n\tdata := tree.state.GetStakeState(node.factorKey())\n\treturn int(utils.DecodeNumber32(data[28:32]))\n}\n\nfunc (tree *AVLTree) llRotation(node *Node) *Node {\n\tprchild := node.right(tree.state)\n\tnode.setRightChild(tree.state, prchild.left(tree.state))\n\tprchild.setLeftChild(tree.state, node)\n\tnode.setFactor(tree.state, max(node.leftChildFactor(tree.state), node.rightChildFactor(tree.state))+1)\n\tprchild.setFactor(tree.state, max(prchild.leftChildFactor(tree.state), prchild.rightChildFactor(tree.state))+1)\n\n\ttotal := safeSub(node.total, prchild.total) + node.rightChildTotal(tree.state)\n\tprchild.setTotal(tree.state, node.total)\n\tnode.setTotal(tree.state, total)\n\n\treturn prchild\n}\n\nfunc (tree *AVLTree) rrRotation(node *Node) *Node {\n\tplchild := node.left(tree.state)\n\tnode.setLeftChild(tree.state, plchild.right(tree.state))\n\tplchild.setRightChild(tree.state, node)\n\n\tnode.setFactor(tree.state, max(node.leftChildFactor(tree.state), node.rightChildFactor(tree.state))+1)\n\tplchild.setFactor(tree.state, max(plchild.leftChildFactor(tree.state), plchild.rightChildFactor(tree.state))+1)\n\n\ttotal := safeSub(node.total, plchild.total) + node.leftChildTotal(tree.state)\n\tplchild.setTotal(tree.state, node.total)\n\tnode.setTotal(tree.state, total)\n\treturn plchild\n}\n\nfunc (tree *AVLTree) lrRotation(node *Node) *Node {\n\tplchild := tree.llRotation(node.left(tree.state))\n\tnode.setLeftChild(tree.state, plchild)\n\treturn tree.rrRotation(node)\n}\n\nfunc (tree *AVLTree) rlRotation(node *Node) *Node {\n\tprchild := tree.rrRotation(node.right(tree.state))\n\tnode.setRightChild(tree.state, prchild)\n\treturn tree.llRotation(node)\n}\n\nfunc (tree *AVLTree) handleBF(node *Node) *Node {\n\tleftChild := node.left(tree.state)\n\trightChild := node.right(tree.state)\n\n\tif tree.getHeight(leftChild)-tree.getHeight(rightChild) == 2 {\n\t\tif leftChild.leftChildFactor(tree.state)-leftChild.rightChildFactor(tree.state) > 0 { // RR\n\t\t\tnode = tree.rrRotation(node)\n\t\t} else {\n\t\t\tnode = tree.lrRotation(node)\n\t\t}\n\t} else if tree.getHeight(leftChild)-tree.getHeight(rightChild) == -2 {\n\t\tif rightChild.leftChildFactor(tree.state)-rightChild.rightChildFactor(tree.state) < 0 { // LL\n\t\t\tnode = tree.llRotation(node)\n\t\t} else {\n\t\t\tnode = tree.rlRotation(node)\n\t\t}\n\t}\n\treturn node\n}\n\nfunc (tree *AVLTree) Insert(node *Node) {\n\thash := tree.state.GetStakeState(rootKey_new)\n\trootNode := tree.insertNode(tree.newRootNode(), node)\n\tif rootNode.key != hash {\n\t\ttree.state.SetStakeState(rootKey_new, rootNode.key)\n\t}\n}\n\nfunc (tree *AVLTree) insertNode(parent *Node, node *Node) *Node {\n\tif parent == nil {\n\t\tnode.store(tree.state)\n\t\treturn node\n\t}\n\n\tparent.setTotal(tree.state, parent.total+node.num)\n\tif cmp(parent.key, node.key) > 0 {\n\t\tlchild := tree.insertNode(parent.left(tree.state), node)\n\t\tparent.setLeftChild(tree.state, lchild)\n\t\tparent = tree.handleBF(parent)\n\t} else {\n\t\trchild := tree.insertNode(parent.right(tree.state), node)\n\t\tparent.setRightChild(tree.state, rchild)\n\t\tparent = tree.handleBF(parent)\n\t}\n\n\tparent.setFactor(tree.state, max(parent.leftChildFactor(tree.state), parent.rightChildFactor(tree.state))+1)\n\treturn parent\n}\n\nfunc (tree *AVLTree) Midtraverse() {\n\ttree.midtraverse(tree.newRootNode(), func(node *Node) {\n\t\tnode.Print()\n\t}, nil)\n}\n\nfunc (tree *AVLTree) midtraverse(node *Node, handle func(*Node), check func(*Node)) error {\n\tif node == nil {\n\t\treturn nil\n\t} else {\n\t\tif check != nil {\n\t\t\tcheck(node)\n\t\t}\n\n\t\tif err := tree.midtraverse(node.left(tree.state), handle, check); err != nil { // 处理左子树\n\t\t\treturn err\n\t\t}\n\t\thandle(node)\n\t\tif err := tree.midtraverse(node.right(tree.state), handle, check); err != nil { // 处理右子树\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (tree *AVLTree) GetNode(nodeHash common.Hash) *Node {\n\t// hash := tree.state.GetStakeState(rootKey_new)\n\t// if nodeHash == emptyHash {\n\t// \treturn nil\n\t// }\n\tnode := &Node{key: nodeHash, pkey: rootKey_new}\n\tnode.load(tree.state)\n\treturn node\n}\n\nfunc (tree *AVLTree) newRootNode() *Node {\n\thash := tree.state.GetStakeState(rootKey_new)\n\tif hash == emptyHash {\n\t\treturn nil\n\t}\n\tnode := &Node{key: hash, pkey: rootKey_new}\n\tnode.load(tree.state)\n\treturn node\n}\n\nfunc (tree *AVLTree) FindByIndex(index uint32) (*Node, error) {\n\tnode := tree.newRootNode()\n\n\tfor {\n\t\tleft := node.left(tree.state)\n\t\tif left != nil {\n\t\t\tif index < left.total {\n\t\t\t\tnode = left\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tindex -= left.total\n\t\t}\n\t\tif index < node.num {\n\t\t\treturn node, nil\n\t\t}\n\t\tindex -= node.num\n\n\t\tright := node.right(tree.state)\n\t\tif right != nil {\n\t\t\tnode = right\n\t\t\tcontinue\n\t\t}\n\t\treturn nil, errors.New(\"not found node by index\")\n\t}\n}\n\nfunc (tree *AVLTree) Delete(key common.Hash, num uint32) *Node {\n\trootNode := tree.newRootNode()\n\tnode, ret := tree.delete(rootNode, key, num)\n\n\tif node == nil {\n\t\ttree.state.SetStakeState(rootKey_new, emptyHash)\n\t} else {\n\t\tif rootNode.key != node.key {\n\t\t\ttree.state.SetStakeState(rootKey_new, node.key)\n\t\t}\n\t}\n\treturn ret\n}\n\nfunc (tree *AVLTree) delete(node *Node, key common.Hash, num uint32) (*Node, *Node) {\n\tif node == nil {\n\t\treturn nil, nil\n\t}\n\n\tvar ret *Node\n\tlchild := node.left(tree.state)\n\trchild := node.right(tree.state)\n\tif node.key == key {\n\t\tret = &Node{key: key}\n\t\tret.load(tree.state)\n\t\tif node.num == num {\n\t\t\tif lchild == nil && rchild == nil {\n\t\t\t\treturn nil, ret\n\t\t\t} else if lchild == nil || rchild == nil {\n\t\t\t\tif lchild != nil {\n\t\t\t\t\treturn lchild, ret\n\t\t\t\t} else {\n\t\t\t\t\treturn rchild, ret\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tn := lchild\n\t\t\t\tfor {\n\t\t\t\t\tnright := n.right(tree.state)\n\t\t\t\t\tif nright == nil {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tn = nright\n\t\t\t\t}\n\n\t\t\t\tif n.key != lchild.key {\n\t\t\t\t\ttn := lchild\n\t\t\t\t\tfor {\n\t\t\t\t\t\ttn.setTotal(tree.state, safeSub(tn.total+node.num, n.num))\n\t\t\t\t\t\ttn = tn.right(tree.state)\n\t\t\t\t\t\tif tn == nil || tn.key == n.key {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tncpoy := n.copy()\n\t\t\t\tnodeCopy := node.copy()\n\n\t\t\t\tncpoylchild := ncpoy.left(tree.state)\n\t\t\t\tncpoyrchild := ncpoy.right(tree.state)\n\t\t\t\tnodeCopylchild := nodeCopy.left(tree.state)\n\t\t\t\tnodeCopyrchild := nodeCopy.right(tree.state)\n\n\t\t\t\tif bytes.Compare(ncpoy.pkey[0:29], nodeCopy.key[0:29]) == 0 {\n\t\t\t\t\tnode.setNode(tree.state, ncpoy, node.pkey, nodeCopy, nodeCopyrchild)\n\t\t\t\t\tn.setNode(tree.state, nodeCopy, ncpoy.key, ncpoylchild, ncpoyrchild)\n\t\t\t\t} else {\n\t\t\t\t\tnode.setNode(tree.state, ncpoy, node.pkey, nodeCopylchild, nodeCopyrchild)\n\t\t\t\t\tn.setNode(tree.state, nodeCopy, ncpoy.pkey, ncpoylchild, ncpoyrchild)\n\t\t\t\t}\n\n\t\t\t\tlchild, ret = tree.delete(node.left(tree.state), key, num)\n\t\t\t\tnode.setLeftChild(tree.state, lchild)\n\t\t\t}\n\t\t} else {\n\t\t\tnode.setNum(tree.state, safeSub(node.num, num))\n\t\t}\n\t} else if cmp(node.key, key) > 0 {\n\t\tlchild, ret = tree.delete(lchild, key, num)\n\t\tnode.setLeftChild(tree.state, lchild)\n\t} else {\n\t\trchild, ret = tree.delete(rchild, key, num)\n\t\tnode.setRightChild(tree.state, rchild)\n\t}\n\n\tnode.setFactor(tree.state, max(tree.getHeight(lchild), tree.getHeight(rchild))+1)\n\tnode.setTotal(tree.state, safeSub(node.total, num))\n\n\tnode = tree.handleBF(node)\n\treturn node, ret\n}\n\nfunc (tree *AVLTree) Size() uint32 {\n\tnode := tree.newRootNode()\n\tif node == nil {\n\t\treturn 0\n\t}\n\treturn node.total\n}\n"
  },
  {
    "path": "zero/stake/avltree_test.go",
    "content": "package stake\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\n//var newprint = func(node *Node) {\n//\tnode.Print()\n//}\n\n// func newState() (State, *state.StateDB) {\n//\tdb := serodb.NewMemDatabase()\n//\tstate, _ := state.New(common.Hash{}, state.NewDatabase(db), 0)\n//\t//state.GetZState()\n//\t//return state\n//\t//db := consensus.NewFakeDB()\n//\treturn NewStakeState(state), state\n// }\n\nfunc initAVLTree(state State, n int) (*AVLTree, map[common.Hash]uint32) {\n\tall := map[common.Hash]uint32{}\n\ttree := NewAVLTree(state)\n\tfor i := 1; i <= n; i++ {\n\n\t\tu := uint64(rand.Intn(1000))\n\t\tnum := uint32(u%10 + 1)\n\t\ttree.Insert(initAVLNode(uint64(i), num, all))\n\t}\n\n\treturn tree, all\n}\n\nfunc initAVLNode(seed uint64, num uint32, all map[common.Hash]uint32) *Node {\n\thash := crypto.Keccak256Hash(utils.EncodeNumber(seed))\n\t// for all[hash] > 0 {\n\t//\tu = uint64(rand.Intn(1000000))\n\t//\thash = crypto.Keccak256Hash(append(utils.EncodeNumber(u), uint8(i)))\n\t// }\n\tif _, ok := all[hash]; ok {\n\t\tpanic(\"initAVLNode\")\n\t}\n\tall[hash] = num\n\n\treturn &Node{key: hash, total: num, num: num, factor: 1}\n}\n\nfunc TestAVLTree(t *testing.T) {\n\tdb, _ := newState()\n\ttree, all := initAVLTree(db, 10)\n\ttree.Midtraverse()\n\tfmt.Println(tree.Size(), len(all), tree.newRootNode().factor)\n}\n\nfunc TestAVLTreeCopy(t *testing.T) {\n\tdb1, _ := newState()\n\ttree, all := initAVLTree(db1, 20)\n\ttree.Midtraverse()\n\tfmt.Println(tree.Size(), len(all), tree.newRootNode().factor)\n\tdb2, _ := newState()\n\tnewTree := Copy(db2, tree)\n\tnewTree.Midtraverse()\n\tfmt.Println(newTree.Size(), newTree.newRootNode().factor)\n}\n\nfunc TestAVLTreeFindByIndex(t *testing.T) {\n\tdb, _ := newState()\n\ttree, _ := initAVLTree(db, 10)\n\ttree.Midtraverse()\n\tfmt.Println()\n\tnode, _ := tree.FindByIndex(0)\n\tnode.Print()\n}\n\nfunc TestAVLDelByIndex(t *testing.T) {\n\n\tdb, _ := newState()\n\ttree, _ := initAVLTree(db, 100)\n\n\tcount := uint32(0)\n\tall := tree.newRootNode().total\n\tfmt.Println()\n\tfor {\n\n\t\tif tree.Size() == 0 || count >= all {\n\t\t\tbreak\n\t\t}\n\t\tcount++\n\t\tindex := rand.Uint32() % tree.Size()\n\t\tnode, err := tree.FindByIndex(index)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tret := tree.Delete(node.key, 1)\n\t\tif ret == nil || node.num != ret.num {\n\t\t\tpanic(\"delete err\")\n\t\t}\n\t\ttree.Midtraverse()\n\t\tfmt.Println()\n\t\t// tree.newRootNode().Print()\n\t\tfmt.Println(\"------------------------------------------\")\n\t}\n\tif all != count {\n\t\tt.Error(\"error\")\n\t}\n}\n\nfunc TestAVLDelByHash(t *testing.T) {\n\tdb, _ := newState()\n\ttree, all := initAVLTree(db, 1000)\n\tfmt.Println()\n\tstart := 100000\n\tfor {\n\t\tvar key common.Hash\n\t\tvar num uint32\n\t\tfor key, num = range all {\n\t\t\tif num == 0 {\n\t\t\t\tt.Error(\"error\", num)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif num >= 5 {\n\t\t\t\tnum = 5\n\t\t\t} else {\n\t\t\t\tnum = 1\n\t\t\t}\n\n\t\t\t// ddb, _ := newState()\n\t\t\t// dTree := Copy(ddb, tree)\n\t\t\tfmt.Println(\"delete \", common.Bytes2Hex(key[:]), num)\n\t\t\ttree.Delete(key, num)\n\t\t\ttree.midtraverse(tree.newRootNode(), func(node *Node) {\n\t\t\t\t// node.Print()\n\t\t\t}, func(node *Node) {\n\t\t\t\tif !check(node, node.left(tree.state), node.right(tree.state)) {\n\t\t\t\t\tpanic(\"\")\n\t\t\t\t\t// node.Print()\n\t\t\t\t\t// dTree.Delete(key, num)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tstart++\n\t\t\tu := uint64(rand.Intn(10))\n\t\t\tnode := initAVLNode(uint64(start), uint32(u%10+1), all)\n\t\t\tfmt.Println()\n\t\t\tfmt.Print(\"insert: \")\n\t\t\tnode.Print()\n\n\t\t\t// idb, _ := newState()\n\t\t\t// iTree := Copy(idb, tree)\n\t\t\ttree.Insert(node)\n\n\t\t\ttree.midtraverse(tree.newRootNode(), func(node *Node) {\n\t\t\t\t// node.Print()\n\t\t\t}, func(node *Node) {\n\t\t\t\tif !check(node, node.left(tree.state), node.right(tree.state)) {\n\t\t\t\t\tpanic(\"\")\n\t\t\t\t\t// node.Print()\n\t\t\t\t\t// iTree.Insert(&Node{key: node.key, num: node.num, height: 1})\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tfmt.Println(\"-------------------\")\n\t\t\tbreak\n\t\t}\n\t\tall[key] -= num\n\t\tif all[key] == 0 {\n\t\t\tdelete(all, key)\n\t\t\tfmt.Println(\"remove\", key.String())\n\t\t}\n\t\tif len(all) == 0 {\n\t\t\tbreak\n\t\t}\n\t\trootNode := tree.newRootNode()\n\t\tfmt.Println(\"tree\", len(all), rootNode.total, rootNode.factor)\n\t\tif len(all) < 2^(rootNode.factor-3) {\n\t\t\tpanic(\"len(all) < 2^(rootNode.height-3)\")\n\t\t}\n\t\ttime.Sleep(time.Microsecond * 100)\n\t}\n\n\trootNode := tree.newRootNode()\n\n\tfmt.Println(\"rootNode\", rootNode.key)\n\ttree.Midtraverse()\n\tfmt.Println()\n}\n\nfunc TestOldAndNew(t *testing.T) {\n\tstate1, _ := newState()\n\toldTree, all := initTree(state1, 10)\n\toldTree.Midtraverse()\n\tfmt.Println(\"____________________________\")\n\t// oldTree.newRootNode().Print()\n\n\tnewTree := CopyFromOldV0(oldTree)\n\tnewTree.Midtraverse()\n\tfmt.Println()\n\tnewTree.newRootNode().Print()\n\tfmt.Println()\n\tfor i := 11; i <= 20; i++ {\n\t\tu := uint64(rand.Intn(10))\n\t\tnode := initAVLNode(uint64(i), uint32(u%10+1), all)\n\t\tfmt.Print(\"insert: \")\n\t\tnode.Print()\n\t\tnewTree.Insert(node)\n\t}\n\n\tnewTree.Midtraverse()\n\tfmt.Println()\n\tnewTree.newRootNode().Print()\n\tfmt.Println()\n\t// idb, _ := newState()\n\t// iTree := Copy(idb, tree)\n\n}\n\nfunc check(node, left, right *Node) bool {\n\tleftH := 0\n\trightH := 0\n\tleftT := uint32(0)\n\trightT := uint32(0)\n\n\tif left != nil {\n\t\tleftH = left.factor\n\t\tleftT = left.total\n\t}\n\tif right != nil {\n\t\trightH = right.factor\n\t\trightT = right.total\n\t}\n\tif node.factor != max(leftH, rightH)+1 {\n\t\treturn false\n\t}\n\n\tif node.total != leftT+rightT+node.num {\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "zero/stake/sharepool.go",
    "content": "package stake\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-sero/consensus/ethash\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/consensus\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Status int8\n\nconst (\n\tSTATUS_VALID     Status = 0\n\tSTATUS_OUTOFDATE Status = 1\n\tSTATUS_FINISHED  Status = 2\n)\n\ntype Share struct {\n\tPKr             c_type.PKr\n\tVotePKr         c_type.PKr\n\tTransactionHash common.Hash\n\tPoolId          *common.Hash `rlp:\"nil\"`\n\tValue           *big.Int     `rlp:\"nil\"`\n\tBlockNumber     uint64\n\tInitNum         uint32\n\tFee             uint16\n\n\tNum         uint32\n\tWillVoteNum uint32\n\tStatus      Status\n\tIncome      *big.Int `rlp:\"nil\"`\n\tProfit      *big.Int `rlp:\"nil\"`\n\tLastPayTime uint64\n}\n\nfunc (s *Share) Id() []byte {\n\thw := sha3.NewKeccak256()\n\thash := common.Hash{}\n\trlp.Encode(hw, []interface{}{\n\t\ts.PKr,\n\t\ts.VotePKr,\n\t\ts.TransactionHash,\n\t\ts.PoolId,\n\t\ts.Value,\n\t\ts.BlockNumber,\n\t\ts.InitNum,\n\t\ts.Fee,\n\t})\n\thw.Sum(hash[:0])\n\treturn hash.Bytes()\n}\n\nfunc (s *Share) State() []byte {\n\thw := sha3.NewKeccak256()\n\thash := common.Hash{}\n\trlp.Encode(hw, []interface{}{\n\t\ts.Id(),\n\t\ts.Num,\n\t\ts.WillVoteNum,\n\t\ts.Status,\n\t\ts.Income,\n\t\ts.Profit,\n\t\ts.LastPayTime,\n\t})\n\thw.Sum(hash[:0])\n\treturn hash.Bytes()\n}\n\nfunc (s *Share) CopyTo() (ret consensus.CItem) {\n\tshare := &Share{\n\t\tPKr:             s.PKr,\n\t\tVotePKr:         s.VotePKr,\n\t\tTransactionHash: s.TransactionHash,\n\t\tPoolId:          s.PoolId,\n\t\tValue:           new(big.Int).Set(s.Value),\n\t\tBlockNumber:     s.BlockNumber,\n\t\tInitNum:         s.InitNum,\n\t\tFee:             s.Fee,\n\t\tNum:             s.Num,\n\t\tWillVoteNum:     s.WillVoteNum,\n\t\tStatus:          s.Status,\n\t\tIncome:          new(big.Int).Set(s.Income),\n\t\tProfit:          new(big.Int).Set(s.Profit),\n\t\tLastPayTime:     s.LastPayTime,\n\t}\n\treturn share\n}\n\nfunc (s *Share) CopyFrom(ret consensus.CItem) {\n\tobj := ret.(*Share)\n\ts.PKr = obj.PKr\n\ts.VotePKr = obj.VotePKr\n\ts.TransactionHash = obj.TransactionHash\n\ts.PoolId = obj.PoolId\n\ts.BlockNumber = obj.BlockNumber\n\ts.Value = new(big.Int).Set(obj.Value)\n\ts.Fee = obj.Fee\n\ts.InitNum = obj.InitNum\n\ts.Num = obj.Num\n\ts.WillVoteNum = obj.WillVoteNum\n\ts.Status = obj.Status\n\ts.Income = new(big.Int).Set(obj.Income)\n\ts.Profit = new(big.Int).Set(obj.Profit)\n\ts.LastPayTime = obj.LastPayTime\n}\n\nfunc (s *Share) addProfit(profit *big.Int) {\n\tif s.Profit == nil {\n\t\ts.Profit = new(big.Int)\n\t}\n\ts.Profit.Add(s.Profit, profit)\n}\n\nfunc (s *Share) addIncome(income *big.Int) {\n\tif s.Income == nil {\n\t\ts.Income = new(big.Int)\n\t}\n\ts.Income.Add(s.Income, income)\n}\n\nfunc (s *Share) setIncomeZero() {\n\ts.Income = big.NewInt(0)\n}\n\ntype StakePool struct {\n\tPKr             c_type.PKr\n\tVotePKr         c_type.PKr\n\tBlockNumber     uint64\n\tTransactionHash common.Hash\n\tAmount          *big.Int `rlp:\"nil\"`\n\tFee             uint16\n\n\tCurrentShareNum uint32\n\tWishVoteNum     uint32\n\tChoicedShareNum uint32\n\tMissedVoteNum   uint32\n\tExpireNum       uint32\n\n\tIncome      *big.Int `rlp:\"nil\"`\n\tProfit      *big.Int `rlp:\"nil\"`\n\tLastPayTime uint64\n\tClosed      bool\n}\n\nfunc (self *StakePool) CanBeVote() bool {\n\tif self.CurrentShareNum+self.WishVoteNum > 0 {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc (s *StakePool) Id() []byte {\n\treturn crypto.Keccak256Hash(s.PKr[:]).Bytes()\n}\n\nfunc (s *StakePool) State() []byte {\n\thw := sha3.NewKeccak256()\n\thash := common.Hash{}\n\trlp.Encode(hw, []interface{}{\n\t\ts.Id(),\n\t\ts.VotePKr,\n\t\ts.BlockNumber,\n\t\ts.TransactionHash,\n\t\ts.Amount,\n\t\ts.Fee,\n\t\ts.CurrentShareNum,\n\t\ts.WishVoteNum,\n\t\ts.ChoicedShareNum,\n\t\ts.MissedVoteNum,\n\t\ts.ExpireNum,\n\t\ts.Income,\n\t\ts.Profit,\n\t\ts.LastPayTime,\n\t\ts.Closed,\n\t})\n\thw.Sum(hash[:0])\n\treturn hash.Bytes()\n}\n\nfunc (s *StakePool) CopyTo() (ret consensus.CItem) {\n\treturn &StakePool{\n\t\tPKr:             s.PKr,\n\t\tVotePKr:         s.VotePKr,\n\t\tBlockNumber:     s.BlockNumber,\n\t\tTransactionHash: s.TransactionHash,\n\t\tAmount:          new(big.Int).Set(s.Amount),\n\t\tFee:             s.Fee,\n\n\t\tCurrentShareNum: s.CurrentShareNum,\n\t\tWishVoteNum:     s.WishVoteNum,\n\t\tChoicedShareNum: s.ChoicedShareNum,\n\t\tMissedVoteNum:   s.MissedVoteNum,\n\t\tExpireNum:       s.ExpireNum,\n\n\t\tIncome:      new(big.Int).Set(s.Income),\n\t\tProfit:      new(big.Int).Set(s.Profit),\n\t\tLastPayTime: s.LastPayTime,\n\t\tClosed:      s.Closed,\n\t}\n}\n\nfunc (s *StakePool) CopyFrom(ret consensus.CItem) {\n\tobj := ret.(*StakePool)\n\ts.PKr = obj.PKr\n\ts.VotePKr = obj.VotePKr\n\ts.BlockNumber = obj.BlockNumber\n\ts.TransactionHash = obj.TransactionHash\n\ts.Amount = new(big.Int).Set(obj.Amount)\n\ts.Fee = obj.Fee\n\ts.CurrentShareNum = obj.CurrentShareNum\n\ts.WishVoteNum = obj.WishVoteNum\n\ts.ChoicedShareNum = obj.ChoicedShareNum\n\ts.MissedVoteNum = obj.MissedVoteNum\n\ts.ExpireNum = obj.ExpireNum\n\ts.Income = new(big.Int).Set(obj.Income)\n\ts.Profit = new(big.Int).Set(obj.Profit)\n\ts.LastPayTime = obj.LastPayTime\n\ts.Closed = obj.Closed\n}\n\nfunc (s *StakePool) addProfit(profit *big.Int) {\n\tif s.Profit == nil {\n\t\ts.Profit = new(big.Int)\n\t}\n\ts.Profit.Add(s.Profit, profit)\n}\n\nfunc (s *StakePool) addIncome(income *big.Int) {\n\tif s.Income == nil {\n\t\ts.Income = new(big.Int)\n\t}\n\ts.Income.Add(s.Income, income)\n}\n\nfunc (s *StakePool) setIncomeZero() {\n\ts.Income = big.NewInt(0)\n}\n\ntype blockChain interface {\n\tGetHeader(hash common.Hash, number uint64) *types.Header\n\tGetBlock(hash common.Hash, number uint64) *types.Block\n\tGetDB() serodb.Database\n}\n\ntype State interface {\n\tSetStakeState(key common.Hash, value common.Hash)\n\tGetStakeState(key common.Hash) common.Hash\n}\n\ntype StakeState struct {\n\tstatedb *state.StateDB\n\n\tsharePool    consensus.KVPoint\n\tshareObj     consensus.ObjPoint\n\tstakePoolObj consensus.ObjPoint\n\tmissedNum    consensus.KVPoint\n\tblockHash    consensus.KVPoint\n\tnewShareNum  consensus.KVPoint\n}\n\nvar (\n\tShareDB             = consensus.DBObj{\"STAKE$SHARE$\"}\n\tStakePoolDB         = consensus.DBObj{\"STAKE$POOL$\"}\n\tmissedNumKey        = []byte(\"missednum\")\n\tblockVotesPrefix    = []byte(\"STAKE$BLOCKVOTES$\")\n\tblockShareNumPrefix = []byte(\"STAKE$SHARE$NUM$\")\n)\n\ntype selectShare struct {\n\tIdx    []uint32\n\tShares []common.Hash\n}\n\nfunc BlockVotesKey(hash common.Hash) []byte {\n\treturn append(blockVotesPrefix, hash[:]...)\n}\n\nfunc BlockShareNumKey(hash common.Hash) []byte {\n\treturn append(blockShareNumPrefix, hash[:]...)\n}\n\nfunc (self *StakeState) RecordVotes(batch serodb.Batch, block *types.Block) error {\n\tidx, shares, err := self.SeleteShare(block.HashPos(), block.NumberU64())\n\tif err != nil {\n\t\treturn err\n\t}\n\tss := selectShare{}\n\tss.Idx = idx\n\tfor _, share := range shares {\n\t\tss.Shares = append(ss.Shares, common.BytesToHash(share.State()))\n\t}\n\n\tdata, err := rlp.EncodeToBytes(&ss)\n\tif err != nil {\n\t\tlog.Crit(\"Failed to RLP encode blockVotes\", \"err\", err)\n\t}\n\n\tif err := batch.Put(BlockVotesKey(block.Hash()), data); err != nil {\n\t\tlog.Crit(\"Failed to store blockVotes to number mapping\", \"err\", err)\n\t}\n\n\tif zconfig.RecordShareNum() {\n\t\tbatch.Put(BlockShareNumKey(block.Hash()), new(big.Int).SetUint64(uint64(self.ShareSize())).Bytes())\n\t}\n\treturn nil\n}\n\nfunc BlockShareNum(getter serodb.Getter, block common.Hash) (num uint64) {\n\tdata, _ := getter.Get(BlockShareNumKey(block))\n\tif len(data) == 0 {\n\t\treturn\n\t}\n\n\treturn new(big.Int).SetBytes(data).Uint64()\n}\n\nfunc SeleteBlockShare(getter serodb.Getter, block common.Hash) (idx []uint32, shares []*Share) {\n\tdata, _ := getter.Get(BlockVotesKey(block))\n\tif len(data) == 0 {\n\t\treturn\n\t}\n\tss := selectShare{}\n\tif err := rlp.Decode(bytes.NewReader(data), &ss); err != nil {\n\t\tlog.Error(\"Invalid block blockVotes RLP\", \"hash\", block, \"err\", err)\n\t\treturn\n\t}\n\tidx = ss.Idx\n\tfor _, hash := range ss.Shares {\n\t\tshare := GetShare(getter, hash)\n\t\tif share == nil {\n\t\t\tlog.Crit(\"Select Block Share Error: can not get share by hash\", \"hash\", hash)\n\t\t}\n\t\tshares = append(shares, share)\n\t}\n\treturn\n}\n\nfunc NewStakeState(statedb *state.StateDB) *StakeState {\n\tcons := statedb.GetStakeCons()\n\tstakeState := &StakeState{statedb: statedb}\n\tstakeState.missedNum = consensus.NewKVPt(cons, \"STAKE$EMISSEDNNUM$\", \"\")\n\tstakeState.sharePool = consensus.NewKVPt(cons, \"STAKE$SHAREPOOL$CONS$\", \"\")\n\tstakeState.shareObj = consensus.NewObjPt(cons, \"STAKE$SHAREOBJ$CONS\", ShareDB.Pre, \"share\")\n\tstakeState.stakePoolObj = consensus.NewObjPt(cons, \"STAKE$POOL$CONS\", StakePoolDB.Pre, \"pool\")\n\tstakeState.blockHash = consensus.NewKVPt(cons, \"BLOCK$BLOCKHASH$\", \"\")\n\tstakeState.newShareNum = consensus.NewKVPt(cons, \"STAKE$NEWSHARENUM$\", \"\")\n\treturn stakeState\n}\n\nfunc (self *StakeState) setBlockHash(blockNumber uint64, blockHash common.Hash) {\n\tself.blockHash.SetValue(utils.EncodeNumber(blockNumber), blockHash[:])\n}\n\nfunc (self *StakeState) getBlockHash(blockNumber uint64) common.Hash {\n\tret := self.blockHash.GetValue(utils.EncodeNumber(blockNumber))\n\treturn common.BytesToHash(ret[:])\n}\n\nfunc (self *StakeState) SetStakeState(key common.Hash, value common.Hash) {\n\tself.sharePool.SetValue(key[:], value[:])\n}\n\nfunc (self *StakeState) GetStakeState(key common.Hash) common.Hash {\n\treturn common.BytesToHash(self.sharePool.GetValue(key.Bytes()))\n}\n\nvar newShareNumKey = []byte(\"newShareNum\")\n\nfunc (self *StakeState) setNewShareNum(num uint32) {\n\tself.newShareNum.SetValue(newShareNumKey, utils.EncodeNumber32(num))\n}\n\nfunc (self *StakeState) getNewShareNum() uint32 {\n\tvalue := self.newShareNum.GetValue(newShareNumKey)\n\treturn utils.DecodeNumber32(value)\n}\n\nfunc (self *StakeState) AddPendingShare(share *Share) {\n\t// tree := newOldTree(self)\n\t// tree.insert(&SNode{key: common.BytesToHash(share.Id()), num: share.InitNum})\n\tshare.Status = STATUS_VALID\n\tshare.Num = share.InitNum\n\tif share.Income == nil {\n\t\tshare.Income = new(big.Int)\n\t}\n\tif share.Profit == nil {\n\t\tshare.Profit = new(big.Int)\n\t}\n\tself.setNewShareNum(self.getNewShareNum() + share.InitNum)\n\tself.updateShare(share)\n}\n\nfunc (self *StakeState) insertSharePool(share *Share, blockNumber uint64) error {\n\tnum := self.getNewShareNum()\n\tif num < share.InitNum {\n\t\treturn errors.New(\"newsharenum < share.InitNum\")\n\t}\n\tself.setNewShareNum(num - share.InitNum)\n\ttree := NewTree(self, blockNumber)\n\ttree.Insert(&Node{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num, factor: 1})\n\treturn nil\n}\n\nfunc (self *StakeState) updateShare(share *Share) {\n\tself.shareObj.AddObj(share)\n}\n\nfunc (self *StakeState) AddStakePool(pool *StakePool) {\n\tif pool.Income == nil {\n\t\tpool.Income = new(big.Int)\n\t}\n\tif pool.Profit == nil {\n\t\tpool.Profit = new(big.Int)\n\t}\n\tself.stakePoolObj.AddObj(pool)\n}\n\nfunc (self *StakeState) updateStakePool(pool *StakePool) {\n\tself.stakePoolObj.AddObj(pool)\n}\n\nfunc (self *StakeState) NeedTwoVote(num uint64) bool {\n\twindow_size := getStatisticsMissWindow()\n\tif num > seroparam.SIP4()+window_size {\n\t\tmissedNum := utils.DecodeNumber32(self.missedNum.GetValue(missedNumKey))\n\t\tseletedNum := window_size * MaxVoteCount\n\t\tratio := float64(missedNum) / float64(seletedNum)\n\t\tif ratio > minMissRate || self.ShareSize() < getMinSharePoolSize() {\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunc (self *StakeState) ShareSize() uint32 {\n\ttree := NewTree(self, 0)\n\treturn tree.Size()\n}\n\nfunc (self *StakeState) SeleteShare(seed common.Hash, blockNumber uint64) (ints []uint32, shares []*Share, err error) {\n\ttree := NewTree(self, blockNumber)\n\n\tif tree.Size() < MaxVoteCount {\n\t\treturn\n\t}\n\n\tints, _ = FindShareIdxs(tree.Size(), MaxVoteCount, NewHash256PRNG(seed[:]))\n\tfor _, i := range ints {\n\t\tnode, e := tree.FindByIndex(uint32(i))\n\t\tif e != nil {\n\t\t\terr = e\n\t\t\treturn\n\t\t}\n\t\tshare := self.GetShare(node.key)\n\t\tif share == nil {\n\t\t\terr = errors.New(\"not found share by index\")\n\t\t\treturn\n\t\t}\n\t\tshares = append(shares, share)\n\t}\n\treturn\n}\n\nfunc (self *StakeState) GetShare(key common.Hash) *Share {\n\titem := self.shareObj.GetObj(key.Bytes(), &Share{})\n\tif item == nil {\n\t\treturn nil\n\t}\n\treturn item.(*Share)\n}\n\nfunc GetStakePoolByBlockNumber(getter serodb.Getter, id common.Hash, blockHash common.Hash, blockNumber uint64) *StakePool {\n\trecords := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash)\n\tfor _, record := range records {\n\t\tif record.Name == \"pool\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tif bytes.Equal(id[:], each.Ref) {\n\t\t\t\t\tret := StakePoolDB.GetObject(getter, each.Hash, &StakePool{})\n\t\t\t\t\tif ret != nil {\n\t\t\t\t\t\treturn ret.(*StakePool)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *StakeState) GetStakePool(poolId common.Hash) *StakePool {\n\titem := self.stakePoolObj.GetObj(poolId.Bytes(), &StakePool{})\n\tif item == nil {\n\t\treturn nil\n\t}\n\treturn item.(*StakePool)\n}\n\nfunc GetBlockRecords(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share, pools []*StakePool) {\n\trecords := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash)\n\tfor _, record := range records {\n\t\tif record.Name == \"share\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tret := ShareDB.GetObject(getter, each.Hash, &Share{})\n\t\t\t\tshares = append(shares, ret.(*Share))\n\t\t\t}\n\t\t}\n\t\tif record.Name == \"pool\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tret := StakePoolDB.GetObject(getter, each.Hash, &StakePool{})\n\t\t\t\tpools = append(pools, ret.(*StakePool))\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *StakeState) getBlockRecords(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share, pools []*StakePool, err error) {\n\trecords := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash)\n\tfor _, record := range records {\n\t\tif record.Name == \"share\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tkey := common.BytesToHash(each.Ref)\n\t\t\t\tshare := self.GetShare(key)\n\t\t\t\tif share == nil {\n\t\t\t\t\terr = errors.New(\"not found share by shareId\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tshares = append(shares, share)\n\t\t\t}\n\t\t}\n\t\tif record.Name == \"pool\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tkey := common.BytesToHash(each.Ref)\n\t\t\t\tpool := self.GetStakePool(key)\n\t\t\t\tif pool == nil {\n\t\t\t\t\terr = errors.New(\"not found pool by poolId\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tpools = append(pools, pool)\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc GetShare(getter serodb.Getter, hash common.Hash) *Share {\n\tret := ShareDB.GetObject(getter, hash[:], &Share{})\n\treturn ret.(*Share)\n}\n\nfunc GetShareByBlockNumber(getter serodb.Getter, id common.Hash, blockHash common.Hash, blockNumber uint64) *Share {\n\trecords := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash)\n\tfor _, record := range records {\n\t\tif record.Name == \"share\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tif bytes.Equal(id[:], each.Ref) {\n\t\t\t\t\tret := ShareDB.GetObject(getter, each.Hash, &Share{})\n\t\t\t\t\tif ret != nil {\n\t\t\t\t\t\treturn ret.(*Share)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc GetSharesByBlock(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share) {\n\trecords := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash)\n\tfor _, record := range records {\n\t\tif record.Name == \"share\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tret := ShareDB.GetObject(getter, each.Hash, &Share{})\n\t\t\t\tif ret == nil {\n\t\t\t\t\tpanic(\"not found share by hash\")\n\t\t\t\t}\n\t\t\t\tshares = append(shares, ret.(*Share))\n\t\t\t}\n\t\t}\n\n\t}\n\treturn\n}\n\nfunc (self *StakeState) getShares(getter serodb.Getter, blockHash common.Hash, blockNumber uint64) (shares []*Share, err error) {\n\trecords := state.StakeDB.GetBlockRecords(getter, blockNumber, &blockHash)\n\tfor _, record := range records {\n\t\tif record.Name == \"share\" {\n\t\t\tfor _, each := range record.Pairs {\n\t\t\t\tkey := common.BytesToHash(each.Ref)\n\t\t\t\tshare := self.GetShare(key)\n\t\t\t\tif share == nil {\n\t\t\t\t\terr = errors.New(\"not found share by shareId\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tshares = append(shares, share)\n\t\t\t}\n\t\t}\n\n\t}\n\treturn\n}\n\nfunc (self *StakeState) CurrentPrice() *big.Int {\n\ttree := NewTree(self, 0)\n\tnewNum := self.getNewShareNum()\n\tsize := tree.Size() + newNum\n\treturn new(big.Int).Add(basePrice, new(big.Int).Mul(addition, big.NewInt(int64(size))))\n}\n\nfunc (self *StakeState) SumAmount(n int64) *big.Int {\n\treturn sum(self.CurrentPrice(), addition, n)\n}\n\nfunc sum(basePrice, addition *big.Int, n int64) *big.Int {\n\treturn new(big.Int).Add(\n\t\tnew(big.Int).Mul(basePrice, big.NewInt(n)),\n\t\tnew(big.Int).Div(\n\t\t\tnew(big.Int).Mul(\n\t\t\t\tnew(big.Int).Mul(big.NewInt(n), big.NewInt(n-1)),\n\t\t\t\taddition,\n\t\t\t),\n\t\t\tbig.NewInt(2),\n\t\t),\n\t)\n}\n\nfunc (self *StakeState) CaleAvgPrice(amount *big.Int) (uint32, *big.Int, *big.Int) {\n\tbasePrice := self.CurrentPrice()\n\tleft := int64(1)\n\tright := new(big.Int).Div(amount, basePrice).Int64()\n\tif right <= 1 {\n\t\treturn uint32(right), basePrice, basePrice\n\t}\n\tminx := new(big.Int).Set(amount)\n\t// n := int64(0)\n\tfor {\n\t\tif right < left {\n\t\t\tbreak\n\t\t}\n\t\tmid := (left + right) / 2\n\t\tsumAmount := sum(basePrice, addition, mid)\n\t\tsub := new(big.Int).Sub(amount, sumAmount)\n\t\tabs := new(big.Int).Abs(sub)\n\n\t\tif minx.Cmp(new(big.Int).Abs(abs)) > 0 {\n\t\t\t// n = mid\n\t\t\tminx = abs\n\t\t}\n\n\t\tif sub.Sign() < 0 {\n\t\t\tright = mid - 1\n\t\t} else {\n\t\t\tleft = mid + 1\n\t\t}\n\t}\n\tsumAmount := sum(basePrice, addition, left)\n\tif sumAmount.Cmp(amount) > 0 {\n\t\tleft -= 1\n\t\tsumAmount = sum(basePrice, addition, left)\n\t}\n\treturn uint32(left), new(big.Int).Div(sumAmount, big.NewInt(left)), basePrice\n}\n\nfunc (self *StakeState) StakeCurrentReward(blockNumber *big.Int) (soloRewards *big.Int, totalRewards *big.Int) {\n\tif seroparam.Is_Dev() {\n\t\treturn big.NewInt(600000000000000000), big.NewInt(900000000000000000)\n\t}\n\n\tsize := NewTree(self, blockNumber.Uint64()).Size()\n\ttotalReward := new(big.Int).Add(baseReware, new(big.Int).Mul(rewareStep, big.NewInt(int64(size))))\n\n\tif totalReward.Cmp(maxReware) > 0 {\n\t\ttotalReward = new(big.Int).Set(maxReware)\n\t}\n\n\thalve := ethash.Halve(blockNumber)\n\ttotalReward = new(big.Int).Div(totalReward, halve)\n\ttotalReward = new(big.Int).Div(totalReward, big.NewInt(3))\n\n\treturn new(big.Int).Div(new(big.Int).Mul(totalReward, big.NewInt(SOLO_RATE)), big.NewInt(TOTAL_RATE)), totalReward\n}\n\nfunc GetPosRewardBySize(size uint64, blockNumber int64) (soloRewards *big.Int, totalRewards *big.Int) {\n\n\ttotalReward := new(big.Int).Add(baseReware, new(big.Int).Mul(rewareStep, big.NewInt(int64(size))))\n\n\tif totalReward.Cmp(maxReware) > 0 {\n\t\ttotalReward = new(big.Int).Set(maxReware)\n\t}\n\n\thalve := ethash.Halve(big.NewInt(0).SetInt64(blockNumber))\n\ttotalReward = new(big.Int).Div(totalReward, halve)\n\ttotalReward = new(big.Int).Div(totalReward, big.NewInt(3))\n\n\treturn new(big.Int).Div(new(big.Int).Mul(totalReward, big.NewInt(SOLO_RATE)), big.NewInt(TOTAL_RATE)), totalReward\n}\n\nfunc (self *StakeState) checkShareRepeated(header *types.Header) error {\n\ttree := NewTree(self, header.Number.Uint64())\n\tseed := header.HashPos()\n\tindexs, err := FindShareIdxs(tree.Size(), 3, NewHash256PRNG(seed[:]))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvoteNumMap := map[common.Hash]int{}\n\tfor _, index := range indexs {\n\t\tsndoe, err := tree.FindByIndex(index)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tvoteNumMap[sndoe.key] += 1\n\t}\n\tfor _, vote := range header.CurrentVotes {\n\t\tif num, ok := voteNumMap[vote.Id]; ok && num > 0 {\n\t\t\tvoteNumMap[vote.Id] -= 1\n\t\t} else {\n\t\t\treturn errors.New(\"vote repeated\")\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *StakeState) CheckVotes(block *types.Block, bc blockChain) error {\n\n\theader := block.Header()\n\tif len(header.CurrentVotes) > 3 || len(header.ParentVotes) > 3 {\n\t\treturn errors.New(\"header.CurrentVotes.len > 3 or header.ParentVotes > 3\")\n\t}\n\n\tif self.NeedTwoVote(block.NumberU64()) {\n\t\tif len(header.CurrentVotes) < 2 {\n\t\t\treturn errors.New(\"header.CurrentVotes.len < 2\")\n\t\t}\n\t}\n\tparentblock := bc.GetBlock(header.ParentHash, header.Number.Uint64()-1)\n\tif len(header.CurrentVotes) > 0 {\n\t\t// check repeated vote\n\t\tparentPosHash := parentblock.HashPos()\n\t\tblockPosHash := block.HashPos()\n\t\tvoteNumMap := map[c_type.Uint512]bool{}\n\t\tfor _, vote := range header.CurrentVotes {\n\t\t\tret := types.StakeHash(&blockPosHash, &parentPosHash, vote.IsPool)\n\t\t\tif err := self.verifyVote(block.NumberU64(), vote, ret); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tvoteNumMap[vote.Sign] = true\n\t\t}\n\n\t\tif len(voteNumMap) != len(header.CurrentVotes) {\n\t\t\treturn errors.New(\"vote sign repeated\")\n\t\t}\n\n\t\tif err := self.checkShareRepeated(header); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif len(header.ParentVotes) > 0 {\n\t\tpreHeader := parentblock.Header()\n\t\tshareMapNum := map[common.Hash]int{}\n\t\t_, shares := SeleteBlockShare(bc.GetDB(), header.ParentHash)\n\t\tfor _, share := range shares {\n\t\t\tshareMapNum[common.BytesToHash(share.Id())] += 1\n\t\t}\n\n\t\tparentVoteMap := map[c_type.Uint512]types.HeaderVote{}\n\t\tfor _, vote := range preHeader.CurrentVotes {\n\t\t\tif shareMapNum[vote.Id] == 0 {\n\t\t\t\treturn errors.New(\"vote error\")\n\t\t\t}\n\t\t\tshareMapNum[vote.Id] -= 1\n\t\t\tparentVoteMap[vote.Sign] = vote\n\t\t}\n\n\t\tperperBlock := bc.GetBlock(parentblock.ParentHash(), parentblock.NumberU64()-1)\n\t\tparentPosHash := perperBlock.HashPos()\n\t\tblockPosHash := parentblock.HashPos()\n\t\tfor _, vote := range header.ParentVotes {\n\t\t\tret := types.StakeHash(&blockPosHash, &parentPosHash, vote.IsPool)\n\t\t\tif err := self.verifyVote(parentblock.NumberU64(), vote, ret); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tif _, ok := parentVoteMap[vote.Sign]; ok {\n\t\t\t\treturn errors.New(\"exist in parent header votes\")\n\t\t\t}\n\t\t\tif shareMapNum[vote.Id] == 0 {\n\t\t\t\treturn errors.New(\"vote error\")\n\t\t\t} else {\n\t\t\t\tshareMapNum[vote.Id] -= 1\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *StakeState) verifyVote(num uint64, vote types.HeaderVote, stakeHash common.Hash) error {\n\tshare := self.GetShare(vote.Id)\n\tif share == nil {\n\t\treturn errors.New(\"not found share by shareId\")\n\t}\n\tif share.Num+share.WillVoteNum == 0 {\n\t\treturn errors.New(\"the share num is 0\")\n\t}\n\tif vote.IsPool {\n\t\tpool := self.GetStakePool(*share.PoolId)\n\t\tif pool == nil {\n\t\t\treturn errors.New(\"not found pool by poolId\")\n\t\t}\n\t\tif pool.CurrentShareNum+pool.WishVoteNum == 0 {\n\t\t\treturn errors.New(\"the pool current share num is 0\")\n\t\t}\n\t\tif !superzk.VerifyPKr_ByHeight(num, stakeHash.HashToUint256(), &vote.Sign, &pool.VotePKr) {\n\t\t\treturn errors.New(\"Verify header votes error\")\n\t\t}\n\t} else {\n\t\tif !superzk.VerifyPKr_ByHeight(num, stakeHash.HashToUint256(), &vote.Sign, &share.VotePKr) {\n\t\t\treturn errors.New(\"Verify header votes error\")\n\t\t}\n\t}\n\treturn nil\n\n}\n\nfunc (self *StakeState) processRemedyRewards(bc blockChain, header *types.Header) {\n\tif header.Number.Uint64() > 0 {\n\t\tparentHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1)\n\t\tif len(parentHeader.CurrentVotes) >= 2 && len(parentHeader.ParentVotes) > 0 {\n\t\t\tsoloReware, totalReward := self.StakeCurrentReward(parentHeader.Number)\n\t\t\treward := new(big.Int)\n\t\t\tfor _, vote := range parentHeader.ParentVotes {\n\t\t\t\tif vote.IsPool {\n\t\t\t\t\treward.Add(reward, new(big.Int).Div(totalReward, big.NewInt(3)))\n\t\t\t\t} else {\n\t\t\t\t\treward.Add(reward, new(big.Int).Div(soloReware, big.NewInt(3)))\n\t\t\t\t}\n\t\t\t}\n\t\t\tasset := assets.Asset{\n\t\t\t\t&assets.Token{\n\t\t\t\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\t\t\t\tutils.U256(*reward),\n\t\t\t\t},\n\t\t\t\tnil,\n\t\t\t}\n\t\t\tself.statedb.NextZState().AddTxOut(parentHeader.Coinbase, asset, common.BytesToHash([]byte{3}))\n\t\t}\n\t}\n}\n\nfunc (self *StakeState) ProcessBeforeApply(bc blockChain, header *types.Header) (err error) {\n\tif header.Number.Uint64() == seroparam.SIP8() {\n\t\tInitAVLTree(self)\n\t\t// NewTree(self, header.Number.Uint64()).Midtraverse()\n\t}\n\n\t// if header.Number.Uint64() > seroparam.SIP8() && header.Number.Uint64()%100 == 0 {\n\t// \tNewTree(self, header.Number.Uint64()).Midtraverse()\n\t// }\n\n\tself.setBlockHash(header.Number.Uint64()-1, header.ParentHash)\n\t// last round\n\terr = self.processVotedShare(header, bc)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = self.processOutDate(header, bc)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = self.processMissVoted(header, bc)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// last round buy share\n\terr = self.processNowShares(header, bc)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// to last round circyle payment\n\terr = self.payIncome(bc, header)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// last block pow remedy rewards\n\tself.processRemedyRewards(bc, header)\n\t// last block statistics\n\terr = self.statisticsByWindow(header, bc)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn\n}\n\nfunc (self *StakeState) statisticsByWindow(header *types.Header, bc blockChain) error {\n\tstatisticsMissWindow := getStatisticsMissWindow()\n\tif header.Number.Uint64() < 1 || header.Number.Uint64()-1 < seroparam.SIP4() {\n\t\treturn nil\n\t}\n\tvalue := self.missedNum.GetValue(missedNumKey)\n\n\tpreHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1)\n\ttotalVote := len(preHeader.CurrentVotes) + len(preHeader.ParentVotes)\n\tmissedNum := utils.DecodeNumber32(value)\n\tif totalVote < MaxVoteCount {\n\t\tmissedNum += uint32(MaxVoteCount - totalVote)\n\t}\n\n\tif preHeader.Number.Uint64() >= seroparam.SIP4()+statisticsMissWindow {\n\t\tpreNumber := preHeader.Number.Uint64() - statisticsMissWindow\n\t\twindiwHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber)\n\t\ttotalWVote := len(windiwHeader.CurrentVotes) + len(windiwHeader.ParentVotes)\n\t\tvar delNum uint32\n\t\tif totalWVote < MaxVoteCount {\n\t\t\tdelNum = uint32(MaxVoteCount - totalWVote)\n\t\t}\n\t\tif missedNum < delNum {\n\t\t\treturn errors.New(\"ProcessBeforeApply: statisticsByWindow err\")\n\t\t} else {\n\t\t\tmissedNum -= delNum\n\t\t}\n\t}\n\tself.missedNum.SetValue(missedNumKey, utils.EncodeNumber32(missedNum))\n\treturn nil\n}\n\nfunc (self *StakeState) processVotedShare(header *types.Header, bc blockChain) (err error) {\n\tif header.Number.Uint64() == 1 || header.Number.Uint64()-1 < seroparam.SIP4() {\n\t\treturn\n\t}\n\tpreHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1)\n\ttree := NewTree(self, header.Number.Uint64())\n\tposhash := preHeader.HashPos()\n\tindexs, e := FindShareIdxs(tree.Size(), MaxVoteCount, NewHash256PRNG(poshash[:]))\n\tif e == nil {\n\t\tndoes := []*Node{}\n\t\tfor _, index := range indexs {\n\t\t\tsndoe, e1 := tree.FindByIndex(index)\n\t\t\tif e1 != nil {\n\t\t\t\terr = e1\n\t\t\t\treturn\n\t\t\t}\n\t\t\tndoes = append(ndoes, sndoe)\n\n\t\t\tshare := self.GetShare(sndoe.key)\n\t\t\tif share == nil {\n\t\t\t\terr = errors.New(\"not found share by shareId\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tshare.WillVoteNum += 1\n\t\t\tif share.Num > 0 {\n\t\t\t\tshare.Num -= 1\n\t\t\t} else {\n\t\t\t\treturn errors.New(fmt.Sprint(\"ProcessBeforeApply: process vote err \", \"shareId=\", common.Bytes2Hex(share.Id()), \" error=\", \"share.Num=0\"))\n\t\t\t}\n\t\t\tself.updateShare(share)\n\n\t\t\tif share.PoolId != nil {\n\t\t\t\tpool := self.GetStakePool(*share.PoolId)\n\t\t\t\tif pool == nil {\n\t\t\t\t\terr = errors.New(\"not found pool by poolId\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tpool.ChoicedShareNum += 1\n\t\t\t\tpool.MissedVoteNum += 1\n\n\t\t\t\tif pool.CurrentShareNum > 0 {\n\t\t\t\t\tpool.CurrentShareNum -= 1\n\t\t\t\t} else {\n\t\t\t\t\terr = errors.New(fmt.Sprint(\"ProcessBeforeApply: process vote err\", \" poolId=\", share.PoolId, \" error=\", \"pool.CurrentShareNum=0\"))\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tpool.WishVoteNum += 1\n\t\t\t\tself.updateStakePool(pool)\n\t\t\t}\n\t\t}\n\t\tfor _, node := range ndoes {\n\t\t\ttree.Delete(node.key, 1)\n\t\t}\n\t}\n\n\tsoloReware, reward := self.StakeCurrentReward(preHeader.Number)\n\tif len(preHeader.CurrentVotes) > 0 {\n\t\tfor _, vote := range preHeader.CurrentVotes {\n\t\t\terr = self.rewardVote(vote, soloReware, reward, preHeader.Number.Uint64())\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(preHeader.ParentVotes) > 0 {\n\t\treward = new(big.Int).Sub(reward, new(big.Int).Div(reward, big.NewInt(3)))\n\t\tsoloReware = new(big.Int).Sub(soloReware, new(big.Int).Div(soloReware, big.NewInt(3)))\n\t\tfor _, vote := range preHeader.ParentVotes {\n\t\t\terr = self.rewardVote(vote, soloReware, reward, preHeader.Number.Uint64())\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *StakeState) rewardVote(vote types.HeaderVote, soloReware, reward *big.Int, block uint64) error {\n\n\tshare := self.GetShare(vote.Id)\n\tif share == nil {\n\t\treturn errors.New(\"not found share by shareId\")\n\t}\n\tif share.WillVoteNum > 0 {\n\t\tshare.WillVoteNum -= 1\n\t} else {\n\t\treturn errors.New(fmt.Sprint(\"ProcessBeforeApply: process vote err\", \" shareId=\", common.Bytes2Hex(share.Id()), \" error=\", \"share.WillVoteNum=0\"))\n\t}\n\n\tif share.PoolId != nil {\n\t\tpool := self.GetStakePool(*share.PoolId)\n\t\tif pool == nil {\n\t\t\treturn errors.New(\"not found pool by poolId\")\n\t\t}\n\t\tif pool.WishVoteNum > 0 {\n\t\t\tpool.WishVoteNum -= 1\n\t\t\tif pool.Closed && pool.CurrentShareNum == 0 && pool.WishVoteNum == 0 {\n\t\t\t\tpool.addIncome(pool.Amount)\n\t\t\t\tpool.Amount = new(big.Int)\n\t\t\t}\n\t\t} else {\n\t\t\treturn errors.New(fmt.Sprint(\"ProcessBeforeApply: process vote err\", \" poolId=\", share.PoolId, \" error=\", \"pool.WillVoteNum=0\"))\n\t\t}\n\t\tself.updateStakePool(pool)\n\t}\n\n\tif vote.IsPool {\n\t\tpool := self.GetStakePool(*share.PoolId)\n\t\tif pool == nil {\n\t\t\treturn errors.New(\"not found pool by poolId\")\n\t\t}\n\t\tif pool.MissedVoteNum > 0 {\n\t\t\tpool.MissedVoteNum -= 1\n\t\t} else {\n\t\t\treturn errors.New(fmt.Sprint(\"ProcessBeforeApply: process vote err\", \" poolId=\", share.PoolId, \" error=\", \"pool.MissedVoteNum=0\"))\n\t\t}\n\n\t\tpoolReward := new(big.Int).Div(new(big.Int).Mul(reward, big.NewInt(int64(share.Fee))), big.NewInt(10000))\n\t\tpool.addProfit(poolReward)\n\t\tpool.addIncome(poolReward)\n\n\t\tshare.addProfit(new(big.Int).Sub(reward, poolReward))\n\t\tshare.addIncome(new(big.Int).Add(share.Value, new(big.Int).Sub(reward, poolReward)))\n\t\tself.updateStakePool(pool)\n\t} else {\n\t\tshare.addProfit(soloReware)\n\t\tshare.addIncome(new(big.Int).Add(share.Value, soloReware))\n\t}\n\tself.updateShare(share)\n\treturn nil\n}\n\nfunc (self *StakeState) processOutDate(header *types.Header, bc blockChain) (err error) {\n\toutOfDatePeriod := getOutOfDateWindow()\n\tif header.Number.Uint64() < outOfDatePeriod || header.Number.Uint64()-outOfDatePeriod < seroparam.SIP4() {\n\t\treturn\n\t}\n\n\tpreNumber := header.Number.Uint64() - outOfDatePeriod\n\tif preNumber < seroparam.SIP4() {\n\t\treturn\n\t}\n\n\tpreHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber)\n\tshares, e := self.getShares(bc.GetDB(), preHeader.Hash(), preHeader.Number.Uint64())\n\tif e != nil {\n\t\terr = e\n\t\treturn\n\t}\n\tif len(shares) > 0 {\n\t\ttree := NewTree(self, header.Number.Uint64())\n\t\tfor _, share := range shares {\n\t\t\tif share.BlockNumber == preHeader.Number.Uint64() {\n\t\t\t\tif share.Status == STATUS_OUTOFDATE {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif share.Num == 0 {\n\t\t\t\t\tshare.Status = STATUS_OUTOFDATE\n\t\t\t\t\tself.updateShare(share)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tsndoe := tree.Delete(common.BytesToHash(share.Id()), share.Num)\n\t\t\t\tif sndoe == nil {\n\t\t\t\t\terr = errors.New(\"processOutDate share not found\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif share.Num != sndoe.num {\n\t\t\t\t\terr = errors.New(fmt.Sprint(\"ProcessBeforeApply: processOutDate err\", \" share.num=\", share.Num, \" snode.num=\", sndoe.num))\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif share.PoolId != nil {\n\t\t\t\t\tpool := self.GetStakePool(*share.PoolId)\n\t\t\t\t\tif pool == nil {\n\t\t\t\t\t\terr = errors.New(\"not found pool by poolId\")\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif pool.CurrentShareNum >= share.Num {\n\t\t\t\t\t\tpool.CurrentShareNum -= share.Num\n\t\t\t\t\t\tpool.ExpireNum += share.Num\n\t\t\t\t\t} else {\n\t\t\t\t\t\terr = errors.New(fmt.Sprint(\"ProcessBeforeApply: processOutDate err\", \" pool.CurrentShareNum \", pool.CurrentShareNum, \" share.num=\", share.Num))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif pool.Closed && pool.CurrentShareNum == 0 && pool.WishVoteNum == 0 {\n\t\t\t\t\t\tpool.addIncome(pool.Amount)\n\t\t\t\t\t\tpool.Amount = new(big.Int)\n\t\t\t\t\t}\n\t\t\t\t\tself.updateStakePool(pool)\n\t\t\t\t}\n\n\t\t\t\tshare.addIncome(new(big.Int).Mul(share.Value, big.NewInt(int64(share.Num))))\n\t\t\t\tshare.Status = STATUS_OUTOFDATE\n\t\t\t\tself.updateShare(share)\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *StakeState) processMissVoted(header *types.Header, bc blockChain) (err error) {\n\tmissVotedPeriod := getMissVotedWindow()\n\tif header.Number.Uint64() < missVotedPeriod {\n\t\treturn\n\t}\n\tpreNumber := header.Number.Uint64() - missVotedPeriod\n\tif preNumber < seroparam.SIP4() {\n\t\treturn\n\t}\n\tpreHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber)\n\tshares, e := self.getShares(bc.GetDB(), preHeader.Hash(), preHeader.Number.Uint64())\n\tif e != nil {\n\t\terr = e\n\t\treturn\n\t}\n\tif len(shares) > 0 {\n\t\tfor _, share := range shares {\n\t\t\tif share.BlockNumber == preHeader.Number.Uint64() {\n\t\t\t\tif share.Status == STATUS_FINISHED {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif share.WillVoteNum == 0 {\n\t\t\t\t\tshare.Status = STATUS_FINISHED\n\t\t\t\t\tself.updateShare(share)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tif share.PoolId != nil {\n\t\t\t\t\tpool := self.GetStakePool(*share.PoolId)\n\t\t\t\t\tif pool == nil {\n\t\t\t\t\t\terr = errors.New(\"not found pool by poolId\")\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif pool.WishVoteNum < share.WillVoteNum {\n\t\t\t\t\t\terr = errors.New(fmt.Sprint(\"ProcessBeforeApply: processMissVoted err\", \" poolId=\", common.Bytes2Hex(share.Id()), \" error=\", \"pool.WishVoteNum < share.WillVoteNum\"))\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tpool.WishVoteNum -= share.WillVoteNum\n\t\t\t\t\tif pool.Closed && pool.CurrentShareNum == 0 && pool.WishVoteNum == 0 {\n\t\t\t\t\t\tpool.addIncome(pool.Amount)\n\t\t\t\t\t\tpool.Amount = new(big.Int)\n\t\t\t\t\t}\n\t\t\t\t\tself.updateStakePool(pool)\n\t\t\t\t}\n\n\t\t\t\tshare.addIncome(new(big.Int).Mul(share.Value, big.NewInt(int64(share.WillVoteNum))))\n\t\t\t\tshare.Status = STATUS_FINISHED\n\t\t\t\tself.updateShare(share)\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *StakeState) processNowShares(header *types.Header, bc blockChain) (err error) {\n\tperHeader := bc.GetHeader(header.ParentHash, header.Number.Uint64()-1)\n\tshares := GetSharesByBlock(bc.GetDB(), perHeader.Hash(), perHeader.Number.Uint64())\n\t// shares := self.getShares(bc.GetDB(), perHeader.Hash(), perHeader.Number.Uint64(), shareCacheMap)\n\tif len(shares) > 0 {\n\t\tfor _, share := range shares {\n\t\t\tif share.BlockNumber != perHeader.Number.Uint64() {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// tree.insert(&SNode{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num, nodeNum: 1})\n\t\t\terr = self.insertSharePool(share, header.Number.Uint64())\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif share.PoolId != nil {\n\t\t\t\tpool := self.GetStakePool(*share.PoolId)\n\t\t\t\tif pool == nil {\n\t\t\t\t\terr = errors.New(\"not found pool by poolId\")\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tpool.CurrentShareNum += share.Num\n\t\t\t\tself.updateStakePool(pool)\n\t\t\t}\n\t\t}\n\t\tif self.getNewShareNum() != 0 {\n\t\t\treturn fmt.Errorf(\"processNowShares: newShareNum(%v) != 0\", self.getNewShareNum())\n\t\t\t// log.Crit(\"processNowShares newShareNum != 0\")\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *StakeState) payIncome(bc blockChain, header *types.Header) (err error) {\n\tpayPeriod := getPayPeriod()\n\tif header.Number.Uint64() < payPeriod {\n\t\treturn\n\t}\n\tpreNumber := header.Number.Uint64() - payPeriod\n\tif preNumber < seroparam.SIP4() {\n\t\treturn\n\t}\n\tpreHeader := bc.GetHeader(self.getBlockHash(preNumber), preNumber)\n\tshares, pools, e := self.getBlockRecords(bc.GetDB(), preHeader.Hash(), preHeader.Number.Uint64())\n\tif e != nil {\n\t\terr = e\n\t\treturn\n\t}\n\n\tfor _, share := range shares {\n\t\tif share.Income.Sign() > 0 && header.Number.Uint64()-share.LastPayTime >= payPeriod {\n\t\t\taddr := common.Address{}\n\t\t\tcopy(addr[:], share.PKr[:])\n\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\tValue:    utils.U256(*share.Income),\n\t\t\t},\n\t\t\t}\n\n\t\t\tshare.LastPayTime = header.Number.Uint64()\n\t\t\tshare.setIncomeZero()\n\t\t\tself.statedb.NextZState().AddTxOut(addr, asset, common.BytesToHash([]byte{2}))\n\t\t\tself.updateShare(share)\n\t\t}\n\t}\n\tfor _, pool := range pools {\n\t\tif pool.Income.Sign() > 0 && header.Number.Uint64()-pool.LastPayTime >= payPeriod {\n\t\t\taddr := common.Address{}\n\t\t\tcopy(addr[:], pool.PKr[:])\n\t\t\tasset := assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(\"SERO\"), 32)).HashToUint256(),\n\t\t\t\tValue:    utils.U256(*pool.Income),\n\t\t\t},\n\t\t\t}\n\t\t\tpool.LastPayTime = header.Number.Uint64()\n\t\t\tpool.setIncomeZero()\n\t\t\tself.statedb.NextZState().AddTxOut(addr, asset, common.BytesToHash([]byte{2}))\n\t\t\tself.updateStakePool(pool)\n\t\t}\n\t}\n\treturn nil\n}\n\n//\n// func (self *StakeState) ChangeVersion() {\n// \toldTree := newOldTree(self)\n//\n// \tlist := make([]*SNode, 0)\n// \toldTree.Midtraverse(oldTree.newRootNode(), func(node *SNode) {\n// \t\tlist = append(list, node)\n// \t})\n// \t// state2, _ := newState()\n// \tnewTree := NewAVLTree(self.statedb)\n// \tfor _, each := range list {\n// \t\tnewTree.Insert(&Node{pkey: common.Hash{}, key: each.key, total: each.num, num: each.num, height: 1})\n// \t}\n// \tif oldTree.size() != newTree.size() {\n// \t\tpanic(\"stake changeVersion err\")\n// \t}\n// }\n"
  },
  {
    "path": "zero/stake/sharepool_test.go",
    "content": "package stake\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/state\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\nfunc newState() (*StakeState, *state.StateDB) {\n\tdb := serodb.NewMemDatabase()\n\tstate, _ := state.New(state.NewDatabase(db), nil)\n\treturn NewStakeState(state), state\n}\n\nfunc TestAddShare(t *testing.T) {\n\tstate, stateDB := newState()\n\tvar pkr c_type.PKr\n\tcopy(pkr[:], crypto.Keccak512([]byte(\"123\")))\n\tshare1 := &Share{PKr: pkr, Value: big.NewInt(10000), InitNum: 10, Num: 10}\n\tstate.AddPendingShare(share1)\n\tshare2 := &Share{PKr: pkr, Value: big.NewInt(10001), InitNum: 10, Num: 10}\n\tstate.AddPendingShare(share2)\n\tfmt.Println(common.Bytes2Hex(share1.Id()), common.Bytes2Hex(share2.Id()))\n\n\troot := stateDB.IntermediateRoot(true)\n\tfmt.Println(\"root:\", root.String())\n\n\tfmt.Println(state.GetShare(common.BytesToHash(share1.Id())))\n\tfmt.Println(state.GetShare(common.BytesToHash(share2.Id())))\n\n\t//fmt.Println(state.ShareSize())\n}\n\nfunc TestCaleAvePrice(t *testing.T) {\n\tstate, _ := newState()\n\t//var pkr c_type.PKr\n\t//copy(pkr[:], crypto.Keccak512([]byte(\"123\")))\n\t//share := &Share{PKr: c_type.PKr{}, Value: big.NewInt(10000), InitNum: 10, Num: 10}\n\t//state.AddPendingShare(share)\n\t//root := stateDB.IntermediateRoot(true)\n\t//fmt.Println(\"root:\", root.String())\n\t//fmt.Println(state.ShareSize())\n\n\tamount, _ := big.NewInt(0).SetString(\"0\", 10)\n\tn, price, _ := state.CaleAvgPrice(amount)\n\tsum := sum(basePrice, addition, int64(n))\n\tfmt.Println(n, price, sum)\n\tfmt.Println(new(big.Int).Mul(big.NewInt(int64(n)), price))\n}\n\nfunc TestSeleteShare(t *testing.T) {\n\tstate, stateDB := newState()\n\ttree, _ := initTree(state, 1000)\n\tfmt.Println()\n\tstateDB.IntermediateRoot(true)\n\n\tseed := crypto.Keccak256Hash([]byte(\"abc\"))\n\tprng := NewHash256PRNG(seed[:])\n\n\tints, err := FindShareIdxs(tree.Size(), 3, prng)\n\tfmt.Println(ints, err)\n\n\tfor _, i := range ints {\n\t\tnode, _ := tree.FindByIndex(uint32(i))\n\t\tfmt.Println(common.Bytes2Hex(node.key[:]), node.num)\n\t}\n\n}\n\nfunc TestPosRewad(t *testing.T) {\n\tstate, _ := newState()\n\n\tvar pkr c_type.PKr\n\tcopy(pkr[:], crypto.Keccak512([]byte(\"123\")))\n\tshare := &Share{PKr: c_type.PKr{}, Value: big.NewInt(10000), InitNum: 326592 + 10, Num: 326592 + 10}\n\t//state.AddPendingShare(share)\n\t//fmt.Println(\"root:\", root.String())\n\n\ttree := NewTree(state, 0)\n\ttree.Insert(&Node{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num})\n\tfmt.Println(state.ShareSize())\n\tfmt.Println(maxReware)\n\tfmt.Println(state.StakeCurrentReward(big.NewInt(3057599)))\n\tfmt.Println(state.StakeCurrentReward(big.NewInt(3057600)))\n\tfmt.Println(state.StakeCurrentReward(big.NewInt(3057600 + 8294400)))\n}\n\nfunc TestPosDif(t *testing.T) {\n\tstate, _ := newState()\n\n\tvar pkr c_type.PKr\n\tcopy(pkr[:], crypto.Keccak512([]byte(\"123\")))\n\tshare := &Share{PKr: c_type.PKr{}, Value: big.NewInt(10000), InitNum: 10000, Num: 10000}\n\t//state.AddPendingShare(share)\n\t//fmt.Println(\"root:\", root.String())\n\n\ttree := NewTree(state, 0)\n\ttree.Insert(&Node{key: common.BytesToHash(share.Id()), num: share.Num, total: share.Num})\n\tfmt.Println(state.ShareSize())\n\tprice := state.CurrentPrice()\n\tfmt.Println(price)\n\t//basePrice = big.NewInt(2000000000000000000)\n\n\tamount := sum(price, addition, 10000)\n\tfmt.Println(amount)\n\tfmt.Println(state.CaleAvgPrice(amount))\n}\n"
  },
  {
    "path": "zero/stake/stakeConfig.go",
    "content": "package stake\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n)\n\nvar (\n\tpoolValueThreshold, _ = new(big.Int).SetString(\"200000000000000000000000\", 10) //200K SERO\n\tlockingBlockNum       = uint64(198720)                                         // 1 month 30*24*60*4.6\n\n\tbasePrice = big.NewInt(2000000000000000000) //2 SERO\n\taddition  = big.NewInt(759357240838722)\n\n\tbaseReware, _ = new(big.Int).SetString(\"10500000000000000000\", 10) // 10.5 SERO\n\trewareStep    = big.NewInt(76854301391338)\n\n\tmaxReware, _ = new(big.Int).SetString(\"35600000000000000000\", 10) //35.6 SERO\n\n\toutOfDateWindow      = uint64(198720) // 1 month 30*24*60*4.6\n\tmissVotedWindow      = uint64(596160) // 3 month 3*30*24*60*4.6\n\tpayWindow            = uint64(42336)  // 1 week 7*24*60*4.6\n\tstatisticsMissWindow = uint64(6048)   // 1 day 24*60*4.6\n\n\t//test\n\t//outOfDateWindow      = uint64(100)\n\t//missVotedWindow      = uint64(120)\n\t//payWindow            = uint64(5)\n\t//statisticsMissWindow = uint64(10)\n)\n\nconst (\n\tSOLO_RATE  = 3\n\tTOTAL_RATE = 4\n\n\tminSharePoolSize = 20000 // 20K\n\t//test\n\t//minSharePoolSize = 20\n\n\tminMissRate    = 0.2\n\tMaxVoteCount   = 3\n\tValidVoteCount = 2\n)\n\nfunc getMinSharePoolSize() uint32 {\n\tif zconfig.IsTestFork() {\n\t\treturn 10000000\n\t}\n\tif seroparam.Is_Dev() {\n\t\treturn 20\n\t}\n\n\treturn minSharePoolSize\n}\n\nfunc GetPoolValueThreshold() *big.Int {\n\tif seroparam.Is_Dev() {\n\t\treturn big.NewInt(1000000000000000000)\n\t}\n\treturn poolValueThreshold\n}\n\nfunc GetLockingBlockNum() uint64 {\n\tif seroparam.Is_Dev() {\n\t\treturn 10\n\t}\n\treturn lockingBlockNum\n}\n\nfunc getStatisticsMissWindow() uint64 {\n\tif seroparam.Is_Dev() {\n\t\treturn 10\n\t}\n\treturn statisticsMissWindow\n}\n\nfunc getOutOfDateWindow() uint64 {\n\tif seroparam.Is_Dev() {\n\t\treturn 100\n\t}\n\treturn outOfDateWindow\n}\n\nfunc getMissVotedWindow() uint64 {\n\tif seroparam.Is_Dev() {\n\t\treturn 105\n\t}\n\treturn missVotedWindow\n}\n\nfunc getPayPeriod() uint64 {\n\tif seroparam.Is_Dev() {\n\t\treturn 5\n\t}\n\treturn payWindow\n}\n"
  },
  {
    "path": "zero/stake/tree.go",
    "content": "package stake\n\nimport (\n\t\"errors\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nvar (\n\temptyHash = common.Hash{}\n\trootKey   = common.BytesToHash([]byte(\"ROOT\"))\n)\n\ntype STree struct {\n\tstate State\n}\n\n// func newOldTree(state State) *STree {\n// \treturn &STree{common.Hash{}, state}\n// }\n\nfunc (tree *STree) newRootNode() *Node {\n\trootNode := &Node{key: tree.state.GetStakeState(rootKey)}\n\trootNode.load(tree.state)\n\treturn rootNode\n}\n\nfunc (tree *STree) Midtraverse() {\n\ttree.midtraverse(tree.newRootNode(), func(node *Node) {\n\t\tnode.Print()\n\t}, nil)\n}\n\nfunc (tree *STree) midtraverse(node *Node, handle func(*Node), check func(*Node)) {\n\tif node == nil {\n\t\treturn\n\t}\n\ttree.midtraverse(node.left(tree.state), handle, check)\n\thandle(node)\n\ttree.midtraverse(node.right(tree.state), handle, check)\n}\n\nfunc (tree *STree) Lasttraverse(node *Node, handle func(*Node)) {\n\tif node == nil {\n\t\treturn\n\t}\n\ttree.Lasttraverse(node.left(tree.state), handle)\n\ttree.Lasttraverse(node.right(tree.state), handle)\n\thandle(node)\n}\n\nfunc (tree *STree) Size() uint32 {\n\tparentHash := tree.state.GetStakeState(rootKey)\n\tparent := &Node{key: parentHash}\n\treturn parent.load(tree.state).total\n}\n\nfunc cmp(hash0, hash1 common.Hash) int {\n\treturn new(big.Int).SetBytes(hash0[0:32]).Cmp(new(big.Int).SetBytes(hash1[0:32]))\n}\n\nfunc cmp1(hash0, hash1 string) int {\n\treturn strings.Compare(hash0, hash1)\n}\n\nfunc (tree *STree) Insert(node *Node) {\n\thash := tree.state.GetStakeState(rootKey)\n\tif hash == emptyHash {\n\t\ttree.state.SetStakeState(rootKey, node.key)\n\t\ttree.state.SetStakeState(node.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(node.total), 32)))\n\t\ttree.state.SetStakeState(node.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(node.num), 32)))\n\t\ttree.state.SetStakeState(node.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(node.factor)), 32)))\n\t} else {\n\t\ttree.insertNode(&Node{key: hash}, node)\n\t}\n\n}\n\nfunc (tree *STree) insertNode(parent *Node, children *Node) {\n\tfor {\n\t\tvalue := tree.state.GetStakeState(parent.totalKey())\n\t\ttotalNum := utils.DecodeNumber32(value[28:32])\n\t\ttree.state.SetStakeState(parent.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(totalNum+children.total), 32)))\n\t\tvalue = tree.state.GetStakeState(parent.factorKey())\n\t\tnodeNum := utils.DecodeNumber32(value[28:32])\n\t\ttree.state.SetStakeState(parent.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(nodeNum+uint32(children.factor)), 32)))\n\n\t\tvar hash, key common.Hash\n\t\tif parent.key == children.key {\n\t\t\treturn\n\t\t}\n\t\tif cmp(children.key, parent.key) < 0 {\n\t\t\tkey = parent.leftKey()\n\t\t\thash = tree.state.GetStakeState(key)\n\t\t} else {\n\t\t\tkey = parent.rightKey()\n\t\t\thash = tree.state.GetStakeState(key)\n\t\t}\n\t\tif hash == emptyHash {\n\t\t\ttree.state.SetStakeState(key, children.key)\n\t\t\ttree.state.SetStakeState(children.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(children.num), 32)))\n\t\t\ttree.state.SetStakeState(children.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(children.total), 32)))\n\t\t\ttree.state.SetStakeState(children.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(uint32(children.factor)), 32)))\n\t\t\treturn\n\t\t} else {\n\t\t\tparent = &Node{key: hash}\n\t\t}\n\t}\n}\n\nfunc (tree *STree) Delete(nodeHash common.Hash, num uint32) *Node {\n\trootHash := tree.state.GetStakeState(rootKey)\n\tif rootHash == nodeHash {\n\t\tnode := &Node{key: rootHash}\n\t\tnode.load(tree.state)\n\t\ttree.deleteNode(rootKey, node, num)\n\t\treturn node\n\t} else {\n\t\tpaths := []*Node{}\n\t\tparent := &Node{key: rootHash}\n\t\tfor {\n\t\t\tvar hash, key common.Hash\n\t\t\tif cmp(nodeHash, parent.key) < 0 {\n\t\t\t\tkey = parent.leftKey()\n\t\t\t\thash = tree.state.GetStakeState(key)\n\t\t\t} else {\n\t\t\t\tkey = parent.rightKey()\n\t\t\t\thash = tree.state.GetStakeState(key)\n\t\t\t}\n\n\t\t\tpaths = append(paths, parent)\n\n\t\t\tif hash == nodeHash {\n\t\t\t\tnode := &Node{key: nodeHash}\n\t\t\t\tnode.load(tree.state)\n\n\t\t\t\tfor _, path := range paths {\n\t\t\t\t\tvalue := tree.state.GetStakeState(path.totalKey())\n\t\t\t\t\tnumber := utils.DecodeNumber32(value[28:32])\n\t\t\t\t\ttree.state.SetStakeState(path.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(safeSub(number, num)), 32)))\n\t\t\t\t\tif num == node.num {\n\t\t\t\t\t\tvalue = tree.state.GetStakeState(path.factorKey())\n\t\t\t\t\t\tnodeNum := utils.DecodeNumber32(value[28:32])\n\t\t\t\t\t\ttree.state.SetStakeState(path.factorKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(safeSub(nodeNum, 1)), 32)))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttree.deleteNode(key, node, num)\n\t\t\t\treturn node\n\t\t\t}\n\n\t\t\tif hash == emptyHash {\n\t\t\t\treturn nil\n\t\t\t} else {\n\t\t\t\tparent = &Node{key: hash}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (tree *STree) deleteNode(key common.Hash, children *Node, num uint32) *Node {\n\tnumber := children.num - num\n\ttree.state.SetStakeState(children.numKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(number), 32)))\n\ttree.state.SetStakeState(children.totalKey(), common.BytesToHash(common.LeftPadBytes(utils.EncodeNumber32(children.total-num), 32)))\n\n\tif number == 0 {\n\t\tright := children.right(tree.state)\n\t\tif right != nil {\n\t\t\tleft := children.left(tree.state)\n\t\t\tif left == nil {\n\t\t\t\ttree.state.SetStakeState(key, right.key)\n\t\t\t} else {\n\t\t\t\tif right.factor > left.factor {\n\t\t\t\t\ttree.state.SetStakeState(key, right.key)\n\t\t\t\t\ttree.insertNode(right, left)\n\t\t\t\t} else {\n\t\t\t\t\ttree.state.SetStakeState(key, left.key)\n\t\t\t\t\ttree.insertNode(left, right)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tleft := children.left(tree.state)\n\t\t\tif left != nil {\n\t\t\t\ttree.state.SetStakeState(key, left.key)\n\t\t\t} else {\n\t\t\t\ttree.state.SetStakeState(key, emptyHash)\n\t\t\t\treturn children\n\t\t\t}\n\t\t}\n\t}\n\treturn children\n}\n\nfunc (tree *STree) FindByIndex(index uint32) (*Node, error) {\n\troot := tree.state.GetStakeState(rootKey)\n\tnode := &Node{key: root}\n\tnode.load(tree.state)\n\n\tfor {\n\t\tleft := node.left(tree.state)\n\t\tif left != nil {\n\t\t\tif index < left.total {\n\t\t\t\tnode = left\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tindex -= left.total\n\t\t}\n\n\t\tif index < node.num {\n\t\t\treturn node, nil\n\t\t}\n\t\tindex -= node.num\n\n\t\tright := node.right(tree.state)\n\t\tif right != nil {\n\t\t\tnode = right\n\t\t\tcontinue\n\t\t}\n\t\treturn nil, errors.New(\"not found node by index\")\n\t}\n}\n"
  },
  {
    "path": "zero/stake/tree_test.go",
    "content": "package stake\n\nimport (\n\t\"fmt\"\n\t\"math/rand\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\n// func newState() (State, *state.StateDB) {\n//\tdb := serodb.NewMemDatabase()\n//\tstate, _ := state.New(common.Hash{}, state.NewDatabase(db), 0)\n//\t//state.GetZState()\n//\t//return state\n//\t//db := consensus.NewFakeDB()\n//\treturn NewStakeState(state), state\n// }\nfunc TestTree(t *testing.T) {\n\tdb, stateDB := newState()\n\troot := stateDB.IntermediateRoot(true)\n\tfmt.Println(\"root:\", root.String())\n\ttree, _ := initTree(db, 1000)\n\troot = stateDB.IntermediateRoot(true)\n\tfmt.Println(\"root:\", root.String())\n\tfmt.Println(tree.Size())\n}\n\nfunc initNode(seed uint64, num uint32, all map[common.Hash]uint32) *Node {\n\thash := crypto.Keccak256Hash(utils.EncodeNumber(seed))\n\t// for all[hash] > 0 {\n\t//\tu = uint64(rand.Intn(1000000))\n\t//\thash = crypto.Keccak256Hash(append(utils.EncodeNumber(u), uint8(i)))\n\t// }\n\n\tall[hash] = num\n\n\treturn &Node{key: hash, total: num, num: num, factor: 1}\n}\n\nfunc initTree(state State, n int) (*STree, map[common.Hash]uint32) {\n\tall := map[common.Hash]uint32{}\n\ttree := &STree{state: state}\n\tfor i := 1; i <= n; i++ {\n\n\t\tu := uint64(rand.Intn(100))\n\t\tnum := uint32(u%10 + 1)\n\t\ttree.Insert(initNode(uint64(i), num, all))\n\t}\n\t// hash := state.GetStakeState(rootKey)\n\t// root := &Node{key: hash}\n\t// root.load(tree.state)\n\t// tree.midtraverse(root, func(node *Node) {\n\t// \tnode.Print()\n\t// }, nil)\n\treturn tree, all\n}\n\nfunc TestTreeFindByIndex(t *testing.T) {\n\tdb, _ := newState()\n\ttree, _ := initTree(db, 10)\n\n\tfmt.Println()\n\tnode, _ := tree.FindByIndex(0)\n\tnode.Print()\n}\n\nfunc TestDelByIndex(t *testing.T) {\n\n\tstate, stateDB := newState()\n\ttree, _ := initTree(state, 10)\n\n\tfmt.Println()\n\tfor {\n\t\tsize := tree.Size()\n\n\t\tif size == 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// snapshot := stateDB.Snapshot()\n\t\tfmt.Println(\"size : \", size)\n\t\tindex := rand.Uint32() % size\n\t\tnode, err := tree.FindByIndex(index)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tnode = tree.Delete(node.key, 1)\n\t\tnode.Print()\n\n\t\t// stateDB.RevertToSnapshot(snapshot)\n\n\t\ttree.midtraverse(tree.newRootNode(), func(node *Node) {\n\t\t\tnode.Print()\n\t\t}, nil)\n\n\t\troot := stateDB.IntermediateRoot(true)\n\t\tfmt.Println(\"root:\", root.String())\n\t\tfmt.Println()\n\t}\n\n\ttree.midtraverse(tree.newRootNode(), func(node *Node) {\n\t\tnode.Print()\n\t}, nil)\n\n\troot := stateDB.IntermediateRoot(true)\n\tfmt.Println(\"root:\", root.String())\n}\n\nfunc TestDelByHash(t *testing.T) {\n\tstate, _ := newState()\n\ttree, all := initTree(state, 1000)\n\n\tstart := uint64(100000 + 1)\n\tfmt.Println()\n\tfor {\n\t\tvar key common.Hash\n\t\tvar num uint32\n\t\tfor key, num = range all {\n\t\t\tif num == 0 {\n\t\t\t\tlog.Error(\"error\", num)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfmt.Println(\"delete \", common.Bytes2Hex(key[:]))\n\n\t\t\tif num >= 5 {\n\t\t\t\tnum = 5\n\t\t\t} else {\n\t\t\t\tnum = 1\n\t\t\t}\n\t\t\t// snapshot := stateDB.Snapshot()\n\t\t\t// fmt.Println(\"snapshot : \", snapshot)\n\t\t\ttree.Delete(key, num)\n\n\t\t\tif num != 1 {\n\t\t\t\tstart++\n\t\t\t\ttree.Insert(initNode(start, 1, all))\n\t\t\t}\n\n\t\t\t// if index == 2 {\n\t\t\t//\troot := stateDB.IntermediateRoot(true)\n\t\t\t//\tfmt.Println(\"root : \", root.String())\n\t\t\t// } else {\n\t\t\t//\tstateDB.RevertToSnapshot(snapshot)\n\t\t\t// }\n\n\t\t\trootNode := &Node{key: state.GetStakeState(rootKey)}\n\t\t\trootNode.load(state)\n\t\t\trootNode.Print()\n\t\t\t// rootNode.MiddleOrder(state)\n\t\t\tfmt.Println()\n\t\t\tbreak\n\t\t}\n\t\tall[key] -= num\n\t\tif all[key] == 0 {\n\t\t\tdelete(all, key)\n\t\t}\n\t\tif len(all) == 0 {\n\t\t\tbreak\n\t\t}\n\n\t}\n\n\thash := state.GetStakeState(rootKey)\n\troot := &Node{key: hash}\n\tfmt.Println(\"rootNode\", common.Bytes2Hex(hash[:]))\n\n\ttree.midtraverse(root, func(node *Node) {\n\t\tnode.Print()\n\t}, nil)\n\tfmt.Println()\n}\n"
  },
  {
    "path": "zero/txs/assets/assets.go",
    "content": "package assets\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Asset struct {\n\tTkn *Token  `rlp:\"nil\"`\n\tTkt *Ticket `rlp:\"nil\"`\n}\n\nfunc (self *Asset) IsValid() bool {\n\tif self.Tkn != nil {\n\t\treturn self.Tkn.IsValid()\n\t}\n\treturn true\n}\n\nfunc (self *Asset) HasAsset() bool {\n\tif self != nil {\n\t\tif self.Tkn != nil {\n\t\t\tif self.Tkn.Value.Cmp(&utils.U256_0) != 0 {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\tif self.Tkt != nil {\n\t\t\tif self.Tkt.Value != c_type.Empty_Uint256 {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n\nfunc NewAssetByType(asset *c_type.Asset) (ret Asset) {\n\tret = NewAsset(\n\t\t&Token{\n\t\t\tasset.Tkn_currency,\n\t\t\tutils.NewU256_ByKey(&asset.Tkn_value),\n\t\t},\n\t\t&Ticket{\n\t\t\tasset.Tkt_category,\n\t\t\tasset.Tkt_value,\n\t\t},\n\t)\n\treturn\n}\nfunc NewAsset(tkn *Token, tkt *Ticket) (ret Asset) {\n\tif tkn != nil {\n\t\tif tkn.Value.Cmp(&utils.U256_0) > 0 && tkn.Currency != c_type.Empty_Uint256 {\n\t\t\tret.Tkn = tkn.Clone().ToRef()\n\t\t}\n\t}\n\tif tkt != nil {\n\t\tif tkt.Value != c_type.Empty_Uint256 && tkt.Category != c_type.Empty_Uint256 {\n\t\t\tret.Tkt = tkt.Clone().ToRef()\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self Asset) ToRef() (ret *Asset) {\n\treturn &self\n}\n\nfunc (self *Asset) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tif self.Tkn != nil {\n\t\td.Write(self.Tkn.ToHash().NewRef()[:])\n\t}\n\tif self.Tkt != nil {\n\t\td.Write(self.Tkt.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *Asset) Clone() (ret Asset) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/assets/ckstate.go",
    "content": "package assets\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype cyState struct {\n\tbalance utils.I256\n}\n\ntype cyStateMap map[c_type.Uint256]*cyState\n\nfunc (self cyStateMap) add(key *c_type.Uint256, value *utils.U256) {\n\tif _, ok := self[*key]; ok {\n\t\tself[*key].balance.AddU(value)\n\t} else {\n\t\tself[*key] = &cyState{\n\t\t\t*value.ToI256().ToRef(),\n\t\t}\n\t}\n}\n\nfunc (self cyStateMap) sub(key *c_type.Uint256, value *utils.U256) {\n\tif _, ok := self[*key]; ok {\n\t\tself[*key].balance.SubU(value)\n\t} else {\n\t\tself[*key] = &cyState{}\n\t\tself[*key].balance.SubU(value)\n\t}\n}\n\nfunc newcyStateMap() (ret cyStateMap) {\n\tret = make(cyStateMap)\n\treturn\n}\n\ntype cgState struct {\n\tcount int\n}\n\ntype cgStateMap map[c_type.Uint512]*cgState\n\nfunc newcgStateMap() (ret cgStateMap) {\n\tret = make(cgStateMap)\n\treturn\n}\n\nfunc (self cgStateMap) add(category *c_type.Uint256, value *c_type.Uint256) {\n\tticket := c_type.Uint512{}\n\tcopy(ticket[:], category[:])\n\tcopy(ticket[32:], value[:])\n\tif _, ok := self[ticket]; ok {\n\t\tstate := self[ticket]\n\t\tstate.count++\n\t} else {\n\t\tself[ticket] = &cgState{1}\n\t}\n}\n\nfunc (self cgStateMap) sub(category *c_type.Uint256, value *c_type.Uint256) {\n\tticket := c_type.Uint512{}\n\tcopy(ticket[:], category[:])\n\tcopy(ticket[32:], value[:])\n\tif _, ok := self[ticket]; ok {\n\t\tstate := self[ticket]\n\t\tstate.count--\n\t} else {\n\t\tself[ticket] = &cgState{-1}\n\t}\n}\n\ntype CKState struct {\n\toutPlus bool\n\tcy      cyStateMap\n\ttk      cgStateMap\n}\n\nfunc NewCKState(outPlus bool, fee *Token) (ret CKState) {\n\tret.outPlus = outPlus\n\tret.cy = newcyStateMap()\n\tret.tk = newcgStateMap()\n\tif outPlus {\n\t\tret.cy.add(&fee.Currency, &fee.Value)\n\t} else {\n\t\tret.cy.sub(&fee.Currency, &fee.Value)\n\t}\n\treturn\n}\n\nfunc (self *CKState) Tkns() (ret []Token) {\n\tfor c, v := range self.cy {\n\t\tif v.balance.Cmp(&utils.I256_0) > 0 {\n\t\t\tret = append(ret, Token{c, utils.U256(v.balance)})\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *CKState) Tkts() (ret []Ticket) {\n\tfor c, v := range self.tk {\n\t\tif v.count > 0 {\n\t\t\tcategory := c_type.Uint256{}\n\t\t\tvalue := c_type.Uint256{}\n\t\t\tcopy(category[:], c[:32])\n\t\t\tcopy(value[:], c[32:])\n\t\t\tret = append(ret, Ticket{category, value})\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *CKState) GetList() (tkns []Token, tkts []Ticket) {\n\ttkns = self.Tkns()\n\ttkts = self.Tkts()\n\treturn\n}\n\nfunc (self *CKState) AddIn(asset *Asset) (added bool) {\n\tadded = false\n\tif asset.Tkn != nil {\n\t\tif asset.Tkn.Currency != c_type.Empty_Uint256 {\n\t\t\tif asset.Tkn.Value.ToUint256() != c_type.Empty_Uint256 {\n\t\t\t\tif self.outPlus {\n\t\t\t\t\tself.cy.sub(&asset.Tkn.Currency, &asset.Tkn.Value)\n\t\t\t\t} else {\n\t\t\t\t\tself.cy.add(&asset.Tkn.Currency, &asset.Tkn.Value)\n\t\t\t\t}\n\t\t\t\tadded = true\n\t\t\t}\n\t\t}\n\t}\n\tif asset.Tkt != nil {\n\t\tif asset.Tkt.Category != c_type.Empty_Uint256 {\n\t\t\tif asset.Tkt.Value != c_type.Empty_Uint256 {\n\t\t\t\tif self.outPlus {\n\t\t\t\t\tself.tk.sub(&asset.Tkt.Category, &asset.Tkt.Value)\n\t\t\t\t} else {\n\t\t\t\t\tself.tk.add(&asset.Tkt.Category, &asset.Tkt.Value)\n\t\t\t\t}\n\t\t\t\tadded = true\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *CKState) AddOut(asset *Asset) (added bool) {\n\tadded = false\n\tif asset.Tkn != nil {\n\t\tif self.outPlus {\n\t\t\tself.cy.add(&asset.Tkn.Currency, &asset.Tkn.Value)\n\t\t} else {\n\t\t\tself.cy.sub(&asset.Tkn.Currency, &asset.Tkn.Value)\n\t\t}\n\t\tadded = true\n\t}\n\tif asset.Tkt != nil {\n\t\tif self.outPlus {\n\t\t\tself.tk.add(&asset.Tkt.Category, &asset.Tkt.Value)\n\t\t} else {\n\t\t\tself.tk.sub(&asset.Tkt.Category, &asset.Tkt.Value)\n\t\t}\n\t\tadded = true\n\t}\n\treturn\n}\n\nfunc (self *CKState) CheckToken() (e error) {\n\tfor currency, state := range self.cy {\n\t\tif state.balance.Cmp(&utils.I256_0) != 0 {\n\t\t\te = fmt.Errorf(\"currency %v value %v not balance\", utils.BytesToCurrency(currency[:]), state.balance.ToIntRef())\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *CKState) CheckTicket() (e error) {\n\tfor c, v := range self.tk {\n\t\tcategory := c_type.Uint256{}\n\t\tvalue := c_type.Uint256{}\n\t\tcopy(category[:], c[:32])\n\t\tcopy(value[:], c[32:])\n\t\tif v.count != 0 {\n\t\t\te = fmt.Errorf(\"category %v value %v not balance\", utils.BytesToCurrency(category[:]), hex.EncodeToString(value[:]))\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *CKState) Check() (e error) {\n\tif e = self.CheckToken(); e != nil {\n\t\treturn\n\t}\n\tif e = self.CheckTicket(); e != nil {\n\t\treturn\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/assets/ckstate_test.go",
    "content": "package assets\n\nimport (\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nvar sero_token = Token{\n\tutils.CurrencyToUint256(\"SERO\"),\n\tutils.NewU256(100),\n}\n\nvar tk_ticket = Ticket{\n\tutils.CurrencyToUint256(\"TK\"),\n\tc_type.RandUint256(),\n}\n\nvar token_asset = Asset{&sero_token, nil}\n\nvar ticket_asset = Asset{nil, &tk_ticket}\n\nvar asset = Asset{&sero_token, &tk_ticket}\n\nfunc TestCkState_OutPlus(t *testing.T) {\n\tck := NewCKState(true, &sero_token)\n\tif ck.Check() == nil {\n\t\tt.Fail()\n\t}\n\tck.AddIn(&token_asset)\n\tif ck.Check() != nil {\n\t\tt.Fail()\n\t}\n\tck.AddIn(&ticket_asset)\n\tif ck.Check() == nil {\n\t\tt.Fail()\n\t}\n\n\tck.AddOut(&asset)\n\tif ck.Check() == nil {\n\t\tt.Fail()\n\t}\n\n\ttkns, tkts := ck.GetList()\n\tif len(tkns) != 1 {\n\t\tt.Fail()\n\t}\n\tif len(tkts) != 0 {\n\t\tt.Fail()\n\t}\n\tck.AddIn(&token_asset)\n\tif ck.Check() != nil {\n\t\tt.Fail()\n\t}\n\ttkns, tkts = ck.GetList()\n\tif len(tkns) != 0 {\n\t\tt.Fail()\n\t}\n\tif len(tkts) != 0 {\n\t\tt.Fail()\n\t}\n\n}\n\nfunc TestCkState_InPlus(t *testing.T) {\n\tck := NewCKState(false, &sero_token)\n\tif ck.Check() == nil {\n\t\tt.Fail()\n\t}\n\tck.AddIn(&token_asset)\n\tif ck.Check() != nil {\n\t\tt.Fail()\n\t}\n\tck.AddIn(&ticket_asset)\n\tif ck.Check() == nil {\n\t\tt.Fail()\n\t}\n\n\ttkns, tkts := ck.GetList()\n\tif len(tkns) != 0 {\n\t\tt.Fail()\n\t}\n\tif len(tkts) != 1 {\n\t\tt.Fail()\n\t}\n\n\tck.AddOut(&asset)\n\tif ck.Check() == nil {\n\t\tt.Fail()\n\t}\n\n\tck.AddIn(&token_asset)\n\tif ck.Check() != nil {\n\t\tt.Fail()\n\t}\n\ttkns, tkts = ck.GetList()\n\tif len(tkns) != 0 {\n\t\tt.Fail()\n\t}\n\tif len(tkts) != 0 {\n\t\tt.Fail()\n\t}\n\n}\n"
  },
  {
    "path": "zero/txs/assets/flat_asset.go",
    "content": "package assets\n\nimport \"github.com/sero-cash/go-czero-import/c_type\"\n\ntype FlatAssert struct {\n\tTkn Token\n\tTkt Ticket\n}\n\nfunc (self *Asset) ToFlatAsset() (ret FlatAssert) {\n\tif self.Tkt != nil {\n\t\tret.Tkt = *self.Tkt\n\t}\n\tif self.Tkn != nil {\n\t\tret.Tkn = *self.Tkn\n\t}\n\treturn\n}\n\nfunc (self *Asset) ToTypeAsset() (ret c_type.Asset) {\n\tasset := self.ToFlatAsset()\n\tret = c_type.Asset{\n\t\tTkn_currency: asset.Tkn.Currency,\n\t\tTkn_value:    asset.Tkn.Value.ToUint256(),\n\t\tTkt_category: asset.Tkt.Category,\n\t\tTkt_value:    asset.Tkt.Value,\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/assets/ticket.go",
    "content": "package assets\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Ticket struct {\n\tCategory c_type.Uint256\n\tValue    c_type.Uint256\n}\n\nfunc (self *Ticket) Clone() (ret Ticket) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\nfunc (this Ticket) ToRef() (ret *Ticket) {\n\tret = &this\n\treturn\n}\n\nfunc (self *Ticket) ToHash() (ret c_type.Uint256) {\n\tif self == nil {\n\t\treturn\n\t} else {\n\t\thash := crypto.Keccak256(\n\t\t\tself.Category[:],\n\t\t\tself.Value[:],\n\t\t)\n\t\tcopy(ret[:], hash)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "zero/txs/assets/token.go",
    "content": "package assets\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Token struct {\n\tCurrency c_type.Uint256\n\tValue    utils.U256\n}\n\nfunc (self *Token) IsValid() bool {\n\treturn self.Value.IsValid()\n}\n\nfunc (self *Token) ToTypeAsset() c_type.Asset {\n\treturn c_type.Asset{\n\t\tTkn_currency: self.Currency,\n\t\tTkn_value:    self.Value.ToUint256(),\n\t\tTkt_category: c_type.Empty_Uint256,\n\t\tTkt_value:    c_type.Empty_Uint256,\n\t}\n}\n\nfunc (self *Token) Clone() (ret Token) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\nfunc (this Token) ToRef() (ret *Token) {\n\tret = &this\n\treturn\n}\n\nfunc (self *Token) ToHash() (ret c_type.Uint256) {\n\tif self == nil {\n\t\treturn\n\t} else {\n\t\thash := crypto.Keccak256(\n\t\t\tself.Currency[:],\n\t\t\tself.Value.ToUint256().NewRef()[:],\n\t\t)\n\t\tcopy(ret[:], hash)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "zero/txs/outs.go",
    "content": "package txs\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n)\n\nfunc WatchPkg(id *c_type.Uint256, key *c_type.Uint256) (ret pkg.Pkg_O, pkr c_type.PKr, e error) {\n\t/*\n\t\tst1 := lstate.CurrentLState()\n\t\tif st1 == nil {\n\t\t\te = errors.New(\"Watch Pkg but lstate is nil\")\n\t\t\treturn\n\t\t}\n\t\tpg := st1.CurrentZState().Pkgs.GetPkgById(id)\n\t\tif pg == nil || pg.Closed {\n\t\t\te = errors.New(\"Watch Pkg but has been closed\")\n\t\t\treturn\n\t\t}\n\t\tpkr = pg.Pack.PKr\n\t\tret, e = pkg.DePkg(key, &pg.Pack.Pkg)\n\t*/\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/pkg/opkg.go",
    "content": "package pkg\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Pkg_O struct {\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n\tAr    c_type.Uint256\n}\n\nfunc (this Pkg_O) ToRef() (ret *Pkg_O) {\n\tret = &this\n\treturn\n}\n\nfunc (self *Pkg_O) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Asset.ToHash().NewRef()[:])\n\td.Write(self.Memo[:])\n\td.Write(self.Ar[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *Pkg_O) Clone() (ret Pkg_O) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/pkg/tools.go",
    "content": "package pkg\n\nimport (\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n)\n\nfunc DePkg(key *c_type.Uint256, pkg *Pkg_Z) (ret Pkg_O, e error) {\n\tif asset, memo, ar, err := c_superzk.DecEInfo(key, &pkg.EInfo); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tret.Memo = memo\n\t\tret.Asset = assets.NewAssetByType(&asset)\n\t\tret.Ar = ar\n\t}\n\treturn\n}\n\nfunc GetKey(pkr *c_type.PKr, tk *c_type.Tk) (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(pkr[:])\n\td.Write(tk[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc ConfirmPkg(o *Pkg_O, z *Pkg_Z) (e error) {\n\tif cm, _, err := c_superzk.GenAssetCM_PC(o.Asset.ToTypeAsset().NewRef(), &o.Ar); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tif z.AssetCM != cm {\n\t\t\te = errors.New(\"pkg asset_cm is not match\")\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/pkg/zpkg.go",
    "content": "package pkg\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Pkg_Z struct {\n\tAssetCM c_type.Uint256\n\tEInfo   c_type.Einfo\n}\n\nfunc (this Pkg_Z) ToRef() (ret *Pkg_Z) {\n\tret = &this\n\treturn\n}\n\nfunc (self *Pkg_Z) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.AssetCM[:])\n\td.Write(self.EInfo[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *Pkg_Z) Clone() (ret Pkg_Z) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/stx/cmd.go",
    "content": "package stx\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"math/big\"\n\t\"sync/atomic\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype BuyShareCmd struct {\n\tValue utils.U256\n\tVote  c_type.PKr\n\tPool  *c_type.Uint256 `rlp:\"nil\"`\n}\n\nfunc (self *BuyShareCmd) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Value.ToBEBytes())\n\td.Write(self.Vote[:])\n\tif self.Pool != nil {\n\t\td.Write(self.Pool[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *BuyShareCmd) Asset() (ret assets.Asset) {\n\tret.Tkn = &assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tself.Value,\n\t}\n\treturn\n}\n\ntype RegistPoolCmd struct {\n\tValue   utils.U256\n\tVote    c_type.PKr\n\tFeeRate uint32\n}\n\nfunc (self *RegistPoolCmd) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Value.ToBEBytes())\n\td.Write(self.Vote[:])\n\td.Write(big.NewInt(int64(self.FeeRate)).Bytes())\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *RegistPoolCmd) Asset() (ret assets.Asset) {\n\tret.Tkn = &assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tself.Value,\n\t}\n\treturn\n}\n\ntype ClosePoolCmd struct {\n\tNone byte\n}\n\nfunc (self *ClosePoolCmd) ToHash() (ret c_type.Uint256) {\n\tret[0] = 1\n\treturn\n}\n\n//go:generate gencodec -type ContractCmd -field-override ContractCmdMarshaling -out gen_contractCmd_json.go\n\ntype ContractCmd struct {\n\tAsset assets.Asset\n\tTo    *c_type.PKr `rlp:\"nil\"`\n\tData  []byte\n}\n\ntype ContractData []byte\n\n// MarshalText implements encoding.TextMarshaler\nfunc (b ContractData) MarshalText() ([]byte, error) {\n\tresult := make([]byte, len(b)*2+2)\n\tcopy(result, `0x`)\n\thex.Encode(result[2:], b)\n\treturn result, nil\n}\n\nfunc (b *ContractData) UnmarshalText(input []byte) error {\n\tif len(input) == 0 {\n\t\tdec := make([]byte, len(input)/2)\n\t\t*b = dec\n\t\treturn nil\n\t}\n\tif IsHex(string(input)) {\n\t\traw, err := checkText(input, true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tdec := make([]byte, len(raw)/2)\n\t\tif _, err = hex.Decode(dec, raw); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t*b = dec\n\t\t}\n\t\treturn nil\n\t} else {\n\t\tif dec, err := base64.StdEncoding.DecodeString(string(input)); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\t*b = dec\n\t\t}\n\t\treturn nil\n\t}\n}\n\nfunc checkText(input []byte, wantPrefix bool) ([]byte, error) {\n\tif len(input) == 0 {\n\t\treturn nil, nil // empty strings are allowed\n\t}\n\tif bytesHave0xPrefix(input) {\n\t\tinput = input[2:]\n\t} else if wantPrefix {\n\t\treturn nil, errors.New(\"hex string without 0x prefi\")\n\t}\n\tif len(input)%2 != 0 {\n\t\treturn nil, errors.New(\"hex string of odd lengt\")\n\t}\n\treturn input, nil\n}\n\nfunc bytesHave0xPrefix(input []byte) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\n\nfunc has0xPrefix(input string) bool {\n\treturn len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X')\n}\nfunc isHexCharacter(c byte) bool {\n\treturn ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')\n}\n\nfunc IsHex(s string) bool {\n\tif has0xPrefix(s) {\n\t\ts = s[2:]\n\t}\n\n\tfor _, c := range []byte(s) {\n\t\tif !isHexCharacter(c) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\ntype ContractCmdMarshaling struct {\n\tAsset assets.Asset\n\tTo    *c_type.PKr\n\tData  ContractData\n}\n\nfunc (self *ContractCmd) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Asset.ToHash().NewRef()[:])\n\tif self.To != nil {\n\t\td.Write(self.To[:])\n\t}\n\td.Write(self.Data)\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\ntype DescCmd struct {\n\tBuyShare   *BuyShareCmd   `rlp:\"nil\"`\n\tRegistPool *RegistPoolCmd `rlp:\"nil\"`\n\tClosePool  *ClosePoolCmd  `rlp:\"nil\"`\n\tContract   *ContractCmd   `rlp:\"nil\"`\n\n\t//Cache\n\tassetCC_Szk atomic.Value\n}\n\nfunc (self *DescCmd) ToPkr() *c_type.PKr {\n\tif self.BuyShare != nil {\n\t\treturn &self.BuyShare.Vote\n\t}\n\tif self.RegistPool != nil {\n\t\treturn &self.RegistPool.Vote\n\t}\n\treturn nil\n}\n\nfunc (self *DescCmd) ToAssetCC_Szk() *c_type.Uint256 {\n\tif asset := self.OutAsset(); asset != nil {\n\t\tif cc, ok := self.assetCC_Szk.Load().(c_type.Uint256); ok {\n\t\t\treturn &cc\n\t\t}\n\t\tv, _ := c_superzk.GenAssetCC(asset.ToTypeAsset().NewRef())\n\t\tself.assetCC_Szk.Store(v)\n\t\treturn &v\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc (self *DescCmd) OutAsset() *assets.Asset {\n\tif self.BuyShare != nil {\n\t\tasset := self.BuyShare.Asset()\n\t\treturn &asset\n\t}\n\tif self.RegistPool != nil {\n\t\tasset := self.RegistPool.Asset()\n\t\treturn &asset\n\t}\n\tif self.Contract != nil {\n\t\treturn &self.Contract.Asset\n\t}\n\treturn nil\n}\n\nfunc (self *DescCmd) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tif self.BuyShare != nil {\n\t\td.Write(self.BuyShare.ToHash().NewRef()[:])\n\t}\n\tif self.RegistPool != nil {\n\t\td.Write(self.RegistPool.ToHash().NewRef()[:])\n\t}\n\tif self.ClosePool != nil {\n\t\td.Write(self.ClosePool.ToHash().NewRef()[:])\n\t}\n\tif self.Contract != nil {\n\t\td.Write(self.Contract.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *DescCmd) Count() int {\n\tcount := 0\n\tif self.BuyShare != nil {\n\t\tcount++\n\t}\n\tif self.RegistPool != nil {\n\t\tcount++\n\t}\n\tif self.ClosePool != nil {\n\t\tcount++\n\t}\n\tif self.Contract != nil {\n\t\tcount++\n\t}\n\treturn count\n}\n\nfunc (self *DescCmd) Valid() bool {\n\tif self.Count() <= 1 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "zero/txs/stx/cmd_test.go",
    "content": "package stx\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\nfunc TestContractData_UnmarshalText(t *testing.T) {\n\tstr1 := \"0x3c87d061b8bfc306c0882e8b8a43627b0000fa30b251000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046464646400000000000000000000000000000000000000000000000000000000\"\n\tvar r1 ContractData\n\tinput := []byte(str1)\n\terr := r1.UnmarshalText(input)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\tstr2 := \"PIfQYbi/wwbAiC6LikNiewAA+jCyUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARkZGRkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==\"\n\tvar r2 ContractData\n\terr = r2.UnmarshalText([]byte(str2))\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tif bytes.Compare(r1[:], r2[:]) != 0 {\n\t\tt.Error(\"not equals\")\n\t}\n}\n"
  },
  {
    "path": "zero/txs/stx/gen_contractCmd_json.go",
    "content": "// Code generated by github.com/fjl/gencodec. DO NOT EDIT.\n\npackage stx\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n)\n\nvar _ = (*ContractCmdMarshaling)(nil)\n\n// MarshalJSON marshals as JSON.\nfunc (c ContractCmd) MarshalJSON() ([]byte, error) {\n\ttype ContractCmd struct {\n\t\tAsset assets.Asset\n\t\tTo    *c_type.PKr\n\t\tData  ContractData\n\t}\n\tvar enc ContractCmd\n\tenc.Asset = c.Asset\n\tenc.To = c.To\n\tenc.Data = c.Data\n\treturn json.Marshal(&enc)\n}\n\n// UnmarshalJSON unmarshals from JSON.\nfunc (c *ContractCmd) UnmarshalJSON(input []byte) error {\n\ttype ContractCmd struct {\n\t\tAsset *assets.Asset\n\t\tTo    *c_type.PKr `rlp:\"nil\"`\n\t\tData  *ContractData\n\t}\n\tvar dec ContractCmd\n\tif err := json.Unmarshal(input, &dec); err != nil {\n\t\treturn err\n\t}\n\tif dec.Asset != nil {\n\t\tc.Asset = *dec.Asset\n\t}\n\tif dec.To != nil {\n\t\tc.To = dec.To\n\t}\n\tif dec.Data != nil {\n\t\tc.Data = *dec.Data\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "zero/txs/stx/hash_v1.go",
    "content": "package stx\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n)\n\nfunc (self *T) Tx1_Hash_From() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Ehash[:])\n\td.Write(self.From[:])\n\td.Write(self.Fee.ToHash().NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *T) Tx1_Hash_Cmd() (ret c_type.Uint256) {\n\treturn self.Desc_Cmd.ToHash()\n}\n\nfunc (self *T) Tx1_Hash_Pkg() (ret c_type.Uint256) {\n\treturn self.Desc_Pkg.Tx1_Hash()\n}\n\nfunc (self *T) Tx1_Hash_Tx1() (ret c_type.Uint256) {\n\treturn self.Tx1.Tx1_Hash()\n}\n\nfunc (self *T) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Tx1_Hash_From().NewRef()[:])\n\td.Write(self.Tx1_Hash_Cmd().NewRef()[:])\n\td.Write(self.Tx1_Hash_Pkg().NewRef()[:])\n\td.Write(self.Tx1_Hash_Tx1().NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n"
  },
  {
    "path": "zero/txs/stx/pkg.go",
    "content": "package stx\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype PkgClose struct {\n\tId   c_type.Uint256\n\tSign c_type.Uint512\n}\n\nfunc (this PkgClose) ToRef() (ret *PkgClose) {\n\tret = &this\n\treturn\n}\n\nfunc (self *PkgClose) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.Sign[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgClose) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *PkgClose) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgClose) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgClose) Clone() (ret PkgClose) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\ntype PkgTransfer struct {\n\tId   c_type.Uint256\n\tPKr  c_type.PKr\n\tSign c_type.Uint512\n}\n\nfunc (this PkgTransfer) ToRef() (ret *PkgTransfer) {\n\tret = &this\n\treturn\n}\n\nfunc (self *PkgTransfer) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *PkgTransfer) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\td.Write(self.Sign[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgTransfer) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgTransfer) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgTransfer) Clone() (ret PkgTransfer) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\ntype PkgCreate struct {\n\tId    c_type.Uint256\n\tPKr   c_type.PKr\n\tPkg   pkg.Pkg_Z\n\tProof c_type.Proof\n}\n\nfunc (self *PkgCreate) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\td.Write(self.Pkg.ToHash().NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (this PkgCreate) ToRef() (ret *PkgCreate) {\n\tret = &this\n\treturn\n}\n\nfunc (self *PkgCreate) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\td.Write(self.Pkg.ToHash().NewRef()[:])\n\td.Write(stx_v0.ProofToHash(&self.Proof).NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgCreate) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgCreate) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Id[:])\n\td.Write(self.PKr[:])\n\td.Write(self.Pkg.ToHash().NewRef()[:])\n\td.Write(stx_v0.ProofToHash(&self.Proof).NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgCreate) Clone() (ret PkgCreate) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\ntype PkgDesc_Z struct {\n\tCreate   *PkgCreate   `rlp:\"nil\"`\n\tTransfer *PkgTransfer `rlp:\"nil\"`\n\tClose    *PkgClose    `rlp:\"nil\"`\n}\n\nfunc (self *PkgDesc_Z) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tif self.Create != nil {\n\t\td.Write(self.Create.Tx1_Hash().NewRef()[:])\n\t}\n\tif self.Transfer != nil {\n\t\td.Write(self.Transfer.Tx1_Hash().NewRef()[:])\n\t}\n\tif self.Close != nil {\n\t\td.Write(self.Close.Tx1_Hash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *PkgDesc_Z) Count() int {\n\tcount := 0\n\tif self.Create != nil {\n\t\tcount++\n\t}\n\tif self.Transfer != nil {\n\t\tcount++\n\t}\n\tif self.Close != nil {\n\t\tcount++\n\t}\n\treturn count\n}\n\nfunc (self *PkgDesc_Z) Valid() bool {\n\tif self.Count() <= 1 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunc (this PkgDesc_Z) ToRef() (ret *PkgDesc_Z) {\n\tret = &this\n\treturn\n}\n\nfunc (self *PkgDesc_Z) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tif self.Create != nil {\n\t\td.Write(self.Create.ToHash().NewRef()[:])\n\t}\n\tif self.Transfer != nil {\n\t\td.Write(self.Transfer.ToHash().NewRef()[:])\n\t}\n\tif self.Close != nil {\n\t\td.Write(self.Close.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgDesc_Z) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tif self.Create != nil {\n\t\td.Write(self.Create.ToHash_for_gen().NewRef()[:])\n\t}\n\tif self.Transfer != nil {\n\t\td.Write(self.Transfer.ToHash_for_gen().NewRef()[:])\n\t}\n\tif self.Close != nil {\n\t\td.Write(self.Close.ToHash_for_gen().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgDesc_Z) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tif self.Create != nil {\n\t\td.Write(self.Create.ToHash_for_sign().NewRef()[:])\n\t}\n\tif self.Transfer != nil {\n\t\td.Write(self.Transfer.ToHash_for_sign().NewRef()[:])\n\t}\n\tif self.Close != nil {\n\t\td.Write(self.Close.ToHash_for_sign().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *PkgDesc_Z) Clone() (ret PkgDesc_Z) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/stx/stx_v0/otx.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage stx_v0\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n)\n\ntype Out_O struct {\n\tAddr  c_type.PKr\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n}\n\nfunc (self *Out_O) Clone() (ret Out_O) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\nfunc (this Out_O) ToRef() (ret *Out_O) {\n\tret = &this\n\treturn\n}\n\nfunc (self *Out_O) ToHash() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Addr[:],\n\t\tself.Asset.ToHash().NewRef()[:],\n\t\tself.Memo[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\nfunc (self *Out_O) ToHash_for_gen() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Addr[:],\n\t\tself.Asset.ToHash().NewRef()[:],\n\t\tself.Memo[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\nfunc (self *Out_O) ToHash_for_sign() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Addr[:],\n\t\tself.Asset.ToHash().NewRef()[:],\n\t\tself.Memo[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\n/*\ntype In_O struct {\n\tRoot c_type.Uint256\n\tSign c_type.Uint512\n}\n\nfunc (ino In_O) MarshalText() ([]byte, error) {\n\tinput := [64]byte{}\n\tcopy(input[:32], ino.Root[:])\n\tcopy(input[32:], ino.Sign[:])\n\tresult := make([]byte, len(input)*2+2)\n\tcopy(result, `0x`)\n\thex.Encode(result[2:], input[:])\n\treturn result, nil\n}\n\nfunc (self *In_O) ToHash() (ret c_type.Uint256) {\n\tcopy(ret[:], self.Root[:])\n\tcopy(ret[:], self.Sign[:])\n\treturn ret\n}\n\nfunc (self *In_O) ToHash_for_gen() (ret c_type.Uint256) {\n\tcopy(ret[:], self.Root[:])\n\treturn ret\n}\n\nfunc (self *In_O) ToHash_for_sign() (ret c_type.Uint256) {\n\tcopy(ret[:], self.Root[:])\n\treturn ret\n}\n*/\n\ntype In_S struct {\n\tRoot c_type.Uint256\n\tNil  c_type.Uint256\n\tSign c_type.Uint512\n}\n\nfunc (self *In_S) ToHash() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Root[:],\n\t\tself.Nil[:],\n\t\tself.Sign[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\nfunc (self *In_S) ToHash_for_gen() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Root[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\nfunc (self *In_S) ToHash_for_sign() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Root[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\ntype Desc_O struct {\n\tIns  []In_S\n\tOuts []Out_O\n}\n\nfunc (self *Desc_O) HasContent() bool {\n\treturn len(self.Ins) > 0 || len(self.Outs) > 0\n}\n\nfunc (self *Desc_O) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, in := range self.Ins {\n\t\td.Write(in.ToHash().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs {\n\t\td.Write(out.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *Desc_O) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, in := range self.Ins {\n\t\td.Write(in.ToHash_for_gen().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs {\n\t\td.Write(out.ToHash_for_gen().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *Desc_O) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, in := range self.Ins {\n\t\td.Write(in.ToHash_for_sign().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs {\n\t\td.Write(out.ToHash_for_sign().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/stx/stx_v0/tx.go",
    "content": "package stx_v0\n\ntype Tx struct {\n\tDesc_O Desc_O\n\tDesc_Z Desc_Z\n}\n"
  },
  {
    "path": "zero/txs/stx/stx_v0/ztx.go",
    "content": "package stx_v0\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype In_Z struct {\n\tAnchor  c_type.Uint256\n\tNil     c_type.Uint256\n\tTrace   c_type.Uint256\n\tAssetCM c_type.Uint256\n\tProof   c_type.Proof\n}\n\nfunc (self *In_Z) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Anchor[:])\n\td.Write(self.Nil[:])\n\td.Write(self.Trace[:])\n\td.Write(self.AssetCM[:])\n\td.Write(ProofToHash(&self.Proof).NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *In_Z) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Anchor[:])\n\td.Write(self.Nil[:])\n\td.Write(self.Trace[:])\n\td.Write(self.AssetCM[:])\n\td.Write(ProofToHash(&self.Proof).NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\ntype Out_Z struct {\n\tAssetCM c_type.Uint256\n\tOutCM   c_type.Uint256\n\tRPK     c_type.Uint256\n\tEInfo   c_type.Einfo\n\tPKr     c_type.PKr\n\tProof   c_type.Proof\n}\n\nfunc (self *Out_Z) Clone() (ret Out_Z) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\nfunc (this Out_Z) ToRef() (ret *Out_Z) {\n\tret = &Out_Z{}\n\t*ret = this\n\treturn\n}\n\nfunc (self *Out_Z) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.AssetCM[:])\n\td.Write(self.OutCM[:])\n\td.Write(self.EInfo[:])\n\td.Write(self.PKr[:])\n\td.Write(ProofToHash(&self.Proof).NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *Out_Z) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.PKr[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *Out_Z) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.AssetCM[:])\n\td.Write(self.OutCM[:])\n\td.Write(self.EInfo[:])\n\td.Write(self.PKr[:])\n\td.Write(ProofToHash(&self.Proof).NewRef()[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\ntype Desc_Z struct {\n\tIns  []In_Z\n\tOuts []Out_Z\n}\n\nfunc (self *Desc_Z) HasContent() bool {\n\treturn len(self.Ins) > 0 || len(self.Outs) > 0\n}\n\nfunc (self *Desc_Z) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, in := range self.Ins {\n\t\td.Write(in.ToHash().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs {\n\t\td.Write(out.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *Desc_Z) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, out := range self.Outs {\n\t\td.Write(out.ToHash_for_gen().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *Desc_Z) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, in := range self.Ins {\n\t\td.Write(in.ToHash_for_sign().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs {\n\t\td.Write(out.ToHash_for_sign().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc ProofToHash(proof *c_type.Proof) (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(proof[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/stx/stx_v1/ctx.go",
    "content": "package stx_v1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Out_C struct {\n\tPKr     c_type.PKr\n\tAssetCM c_type.Uint256\n\tRPK     c_type.Uint256\n\tEInfo   c_type.Einfo\n\tProof   c_type.Proof\n}\n\nfunc (self *Out_C) Clone() (ret Out_C) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\nfunc (self *Out_C) Tx1_Hash() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.PKr[:],\n\t\tself.AssetCM[:],\n\t\tself.RPK[:],\n\t\tself.EInfo[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\nfunc (self *Out_C) ToHash() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.PKr[:],\n\t\tself.AssetCM[:],\n\t\tself.RPK[:],\n\t\tself.EInfo[:],\n\t\tself.Proof[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\ntype In_C struct {\n\tAnchor  c_type.Uint256\n\tNil     c_type.Uint256\n\tAssetCM c_type.Uint256\n\tZPKa    c_type.Uint256\n\tSign    c_type.Uint512\n\tProof   c_type.Proof\n}\n\nfunc (self *In_C) Tx1_Hash() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Anchor[:],\n\t\tself.Nil[:],\n\t\tself.AssetCM[:],\n\t\tself.ZPKa[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n\nfunc (self *In_C) ToHash() (ret c_type.Uint256) {\n\thash := crypto.Keccak256(\n\t\tself.Anchor[:],\n\t\tself.Nil[:],\n\t\tself.AssetCM[:],\n\t\tself.ZPKa[:],\n\t\tself.Sign[:],\n\t\tself.Proof[:],\n\t)\n\tcopy(ret[:], hash)\n\treturn ret\n}\n"
  },
  {
    "path": "zero/txs/stx/stx_v1/ptx.go",
    "content": "package stx_v1\n\nimport (\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype In_P struct {\n\tRoot  c_type.Uint256\n\tNil   c_type.Uint256\n\tKey   *c_type.Uint256 `rlp:\"nil\"`\n\tNSign c_type.SignN\n\tASign c_type.Uint512\n}\n\nfunc (self *In_P) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Root[:])\n\td.Write(self.Nil[:])\n\tif self.Key != nil {\n\t\td.Write(self.Key[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *In_P) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Root[:])\n\td.Write(self.Nil[:])\n\tif self.Key != nil {\n\t\td.Write(self.Key[:])\n\t}\n\td.Write(self.NSign[:])\n\td.Write(self.ASign[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\ntype In_P0 struct {\n\tRoot  c_type.Uint256\n\tNil   c_type.Uint256\n\tTrace c_type.Uint256\n\tKey   *c_type.Uint256 `rlp:\"nil\"`\n\tSign  c_type.SignN\n}\n\nfunc (self *In_P0) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Root[:])\n\td.Write(self.Nil[:])\n\td.Write(self.Trace[:])\n\tif self.Key != nil {\n\t\td.Write(self.Key[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *In_P0) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Root[:])\n\td.Write(self.Nil[:])\n\td.Write(self.Trace[:])\n\tif self.Key != nil {\n\t\td.Write(self.Key[:])\n\t}\n\td.Write(self.Sign[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\ntype Out_P struct {\n\tPKr   c_type.PKr\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n\n\tassetCC_Szk atomic.Value\n}\n\nfunc (self *Out_P) ToAssetCC_Szk() c_type.Uint256 {\n\tif cc, ok := self.assetCC_Szk.Load().(c_type.Uint256); ok {\n\t\treturn cc\n\t}\n\tv, _ := c_superzk.GenAssetCC(self.Asset.ToTypeAsset().NewRef())\n\tself.assetCC_Szk.Store(v)\n\treturn v\n}\n\nfunc (self *Out_P) Clone() (ret Out_P) {\n\tutils.DeepCopy(&ret, self)\n\treturn\n}\n\nfunc (this Out_P) ToRef() (ret *Out_P) {\n\tret = &this\n\treturn\n}\n\nfunc (self *Out_P) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.PKr[:])\n\td.Write(self.Asset.ToHash().NewRef()[:])\n\td.Write(self.Memo[:])\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n"
  },
  {
    "path": "zero/txs/stx/stx_v1/zktx.go",
    "content": "package stx_v1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n)\n\ntype Tx struct {\n\tIns_P  []In_P\n\tIns_P0 []In_P0\n\tIns_C  []In_C\n\tOuts_C []Out_C\n\tOuts_P []Out_P\n}\n\nfunc (self *Tx) Count() (ret int) {\n\tret += len(self.Ins_P0)\n\tret += len(self.Ins_P)\n\tret += len(self.Ins_C)\n\tret += len(self.Outs_C)\n\tret += len(self.Outs_P)\n\treturn\n}\n\nfunc (self *Tx) Tx1_Hash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, in := range self.Ins_P0 {\n\t\td.Write(in.Tx1_Hash().NewRef()[:])\n\t}\n\tfor _, in := range self.Ins_P {\n\t\td.Write(in.Tx1_Hash().NewRef()[:])\n\t}\n\tfor _, in := range self.Ins_C {\n\t\td.Write(in.Tx1_Hash().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs_C {\n\t\td.Write(out.Tx1_Hash().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs_P {\n\t\td.Write(out.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n\nfunc (self *Tx) ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\tfor _, in := range self.Ins_P0 {\n\t\td.Write(in.ToHash().NewRef()[:])\n\t}\n\tfor _, in := range self.Ins_P {\n\t\td.Write(in.ToHash().NewRef()[:])\n\t}\n\tfor _, in := range self.Ins_C {\n\t\td.Write(in.ToHash().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs_C {\n\t\td.Write(out.ToHash().NewRef()[:])\n\t}\n\tfor _, out := range self.Outs_P {\n\t\td.Write(out.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn ret\n}\n"
  },
  {
    "path": "zero/txs/stx/typeserial.go",
    "content": "package stx\n\nimport (\n\t\"io\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/core/types/vserial\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n)\n\ntype ZtxVersion_0 struct {\n\tEhash    c_type.Uint256\n\tFrom     c_type.PKr\n\tFee      assets.Token\n\tSign     c_type.Uint512\n\tBcr      c_type.Uint256\n\tBsign    c_type.Uint512\n\tDesc_Z   stx_v0.Desc_Z\n\tDesc_O   stx_v0.Desc_O\n\tDesc_Pkg PkgDesc_Z\n}\n\ntype ZtxVersion_1 struct {\n\tBuyShare   *BuyShareCmd   `rlp:\"nil\"`\n\tRegistPool *RegistPoolCmd `rlp:\"nil\"`\n\tClosePool  *ClosePoolCmd  `rlp:\"nil\"`\n\tContract   *ContractCmd   `rlp:\"nil\"`\n}\n\ntype ZtxVersion_2 struct {\n\tVersion0 ZtxVersion_0\n\tVersion1 ZtxVersion_1\n\tTx1      stx_v1.Tx\n}\n\nfunc SetTxForVersion0(b *T, v0 *ZtxVersion_0) {\n\tb.Ehash = v0.Ehash\n\tb.From = v0.From\n\tb.Fee = v0.Fee\n\tb.Sign = v0.Sign\n\tb.Bcr = v0.Bcr\n\tb.Bsign = v0.Bsign\n\tb.Desc_Pkg = v0.Desc_Pkg\n\tb.Desc_Z = v0.Desc_Z\n\tb.Desc_O = v0.Desc_O\n}\n\nfunc SetTxForVersion1(b *T, v1 *ZtxVersion_1) {\n\tb.Desc_Cmd.BuyShare = v1.BuyShare\n\tb.Desc_Cmd.RegistPool = v1.RegistPool\n\tb.Desc_Cmd.ClosePool = v1.ClosePool\n\tb.Desc_Cmd.Contract = v1.Contract\n}\n\nfunc SetTxForVersion2(b *T, v2 *ZtxVersion_2) {\n\tSetTxForVersion0(b, &v2.Version0)\n\tSetTxForVersion1(b, &v2.Version1)\n\tb.Tx1 = v2.Tx1\n}\n\nfunc (b *T) DecodeRLP(s *rlp.Stream) error {\n\tvs := vserial.NewVSerial()\n\tv0 := ZtxVersion_0{}\n\tv1 := ZtxVersion_1{}\n\tv2 := ZtxVersion_2{}\n\n\tvs.Add(&v0, vserial.VERSION_0)\n\tvs.Add(&v1, vserial.VERSION_1)\n\tvs.Add(&v2, vserial.VERSION_2)\n\tif e := s.Decode(&vs); e != nil {\n\t\treturn e\n\t}\n\n\tif vs.V() <= vserial.VERSION_1 {\n\t\tSetTxForVersion0(b, &v0)\n\t\tif vs.V() >= vserial.VERSION_1 {\n\t\t\tSetTxForVersion1(b, &v1)\n\t\t}\n\t} else if vs.V() >= vserial.VERSION_2 {\n\t\tSetTxForVersion2(b, &v2)\n\t}\n\treturn nil\n}\n\nfunc SetVersion0ForTx(v0 *ZtxVersion_0, b *T) {\n\tv0.Ehash = b.Ehash\n\tv0.From = b.From\n\tv0.Fee = b.Fee\n\tv0.Sign = b.Sign\n\tv0.Bcr = b.Bcr\n\tv0.Bsign = b.Bsign\n\tv0.Desc_Z = b.Desc_Z\n\tv0.Desc_O = b.Desc_O\n\tv0.Desc_Pkg = b.Desc_Pkg\n}\n\nfunc SetVersion1ForTx(v1 *ZtxVersion_1, b *T) {\n\tv1.BuyShare = b.Desc_Cmd.BuyShare\n\tv1.RegistPool = b.Desc_Cmd.RegistPool\n\tv1.ClosePool = b.Desc_Cmd.ClosePool\n\tv1.Contract = b.Desc_Cmd.Contract\n}\n\nfunc SetVersion2ForTx(v2 *ZtxVersion_2, b *T) {\n\tSetVersion0ForTx(&v2.Version0, b)\n\tSetVersion1ForTx(&v2.Version1, b)\n\tv2.Tx1 = b.Tx1\n}\n\n// EncodeRLP serializes b into the Ethereum RLP block format.\nfunc (b *T) EncodeRLP(w io.Writer) error {\n\tvs := vserial.NewVSerial()\n\n\tif b.Tx1.Count() > 0 {\n\t\tv2 := ZtxVersion_2{}\n\t\tSetVersion2ForTx(&v2, b)\n\t\tvs.Add(&v2, vserial.VERSION_2)\n\t\treturn rlp.Encode(w, &vs)\n\t}\n\n\tv0 := ZtxVersion_0{}\n\tSetVersion0ForTx(&v0, b)\n\tvs.Add(&v0, vserial.VERSION_0)\n\n\tif b.Desc_Cmd.Count() > 0 {\n\t\tv1 := ZtxVersion_1{}\n\t\tSetVersion1ForTx(&v1, b)\n\t\tvs.Add(&v1, vserial.VERSION_1)\n\t}\n\n\treturn rlp.Encode(w, &vs)\n}\n"
  },
  {
    "path": "zero/txs/stx/ztx.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage stx\n\nimport (\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto/sha3\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n)\n\ntype Tx2 struct {\n}\n\ntype T struct {\n\tEhash    c_type.Uint256\n\tFrom     c_type.PKr\n\tFee      assets.Token\n\tSign     c_type.Uint512\n\tBcr      c_type.Uint256\n\tBsign    c_type.Uint512\n\tDesc_O   stx_v0.Desc_O\n\tDesc_Z   stx_v0.Desc_Z\n\tDesc_Pkg PkgDesc_Z\n\tDesc_Cmd DescCmd\n\tTx1      stx_v1.Tx\n\n\t//cache\n\thash      atomic.Value\n\tfeeCC_Szk atomic.Value\n}\n\nfunc (self *T) Tx0() (ret *stx_v0.Tx) {\n\tif self.Desc_O.HasContent() || self.Desc_Z.HasContent() {\n\t\tret = &stx_v0.Tx{}\n\t\tret.Desc_Z = self.Desc_Z\n\t\tret.Desc_O = self.Desc_O\n\t\treturn\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *T) ContractAsset() *assets.Asset {\n\tif self.Desc_Cmd.Contract != nil {\n\t\treturn &self.Desc_Cmd.Contract.Asset\n\t} else {\n\t\tfor _, desc_o := range self.Desc_O.Outs {\n\t\t\treturn &desc_o.Asset\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *T) ContractAddress() *c_type.PKr {\n\tif self.Desc_Cmd.Contract != nil {\n\t\treturn self.Desc_Cmd.Contract.To\n\t} else {\n\t\tfor _, out := range self.Desc_O.Outs {\n\t\t\tif out.Addr != (c_type.PKr{}) {\n\t\t\t\treturn &out.Addr\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *T) IsOpContract() bool {\n\tif self.Desc_Cmd.Contract != nil {\n\t\treturn true\n\t} else {\n\t\tif len(self.Desc_O.Outs) > 0 {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (self *T) ToFeeCC_Szk() c_type.Uint256 {\n\tif cc, ok := self.feeCC_Szk.Load().(c_type.Uint256); ok {\n\t\treturn cc\n\t}\n\tv, _ := c_superzk.GenAssetCC(self.Fee.ToTypeAsset().NewRef())\n\tself.feeCC_Szk.Store(v)\n\treturn v\n}\n\nfunc (self *T) ToHash() (ret c_type.Uint256) {\n\tif h, ok := self.hash.Load().(c_type.Uint256); ok {\n\t\tret = h\n\t\treturn\n\t}\n\tv := self._ToHash()\n\tself.hash.Store(v)\n\treturn v\n}\n\nfunc (self *T) _ToHash() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Ehash[:])\n\td.Write(self.From[:])\n\td.Write(self.Fee.ToHash().NewRef()[:])\n\td.Write(self.Desc_Z.ToHash().NewRef()[:])\n\td.Write(self.Desc_O.ToHash().NewRef()[:])\n\tif self.Tx1.Count() > 0 {\n\t\td.Write(self.Tx1.ToHash().NewRef()[:])\n\t}\n\td.Write(self.Desc_Pkg.ToHash().NewRef()[:])\n\td.Write(self.Sign[:])\n\td.Write(self.Bcr[:])\n\td.Write(self.Bsign[:])\n\tif self.Desc_Cmd.Count() > 0 {\n\t\td.Write(self.Desc_Cmd.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *T) ToHash_for_gen() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Ehash[:])\n\td.Write(self.From[:])\n\td.Write(self.Fee.ToHash().NewRef()[:])\n\td.Write(self.Desc_Z.ToHash_for_gen().NewRef()[:])\n\td.Write(self.Desc_O.ToHash_for_gen().NewRef()[:])\n\td.Write(self.Desc_Pkg.ToHash_for_gen().NewRef()[:])\n\tif self.Desc_Cmd.Count() > 0 {\n\t\td.Write(self.Desc_Cmd.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n\nfunc (self *T) ToHash_for_sign() (ret c_type.Uint256) {\n\td := sha3.NewKeccak256()\n\td.Write(self.Ehash[:])\n\td.Write(self.From[:])\n\td.Write(self.Fee.ToHash().NewRef()[:])\n\td.Write(self.Desc_Z.ToHash_for_sign().NewRef()[:])\n\td.Write(self.Desc_O.ToHash_for_sign().NewRef()[:])\n\td.Write(self.Desc_Pkg.ToHash_for_sign().NewRef()[:])\n\tif self.Desc_Cmd.Count() > 0 {\n\t\td.Write(self.Desc_Cmd.ToHash().NewRef()[:])\n\t}\n\tcopy(ret[:], d.Sum(nil))\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/stx/ztx_test.go",
    "content": "package stx\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"fmt\"\n\t\"sync/atomic\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\nfunc TestLoad(t *testing.T) {\n\th := atomic.Value{}\n\n\tv, ok := h.Load().(c_type.Uint256)\n\tfmt.Println(v, ok)\n\n\th.Store(c_type.RandUint256())\n\tv, ok = h.Load().(c_type.Uint256)\n\tfmt.Println(v, ok)\n}\n\nfunc TestRLP(t *testing.T) {\n\tbuf := bytes.Buffer{}\n\tw := bufio.NewWriter(&buf)\n\n\ttx := T{}\n\ttx.Fee.Value = utils.NewU256(2)\n\ttx.Fee.Currency = utils.CurrencyToUint256(\"SERO\")\n\ttx.Desc_Cmd.RegistPool = &RegistPoolCmd{}\n\ttx.Desc_Cmd.RegistPool.Value = utils.NewU256(3)\n\ttx.Desc_Cmd.RegistPool.FeeRate = 10\n\n\te := rlp.Encode(w, &tx)\n\tfmt.Println(e)\n\tw.Flush()\n\n\tdtx := T{}\n\tstream := rlp.NewStream(&buf, uint64(buf.Len()))\n\t_, size, _ := stream.Kind()\n\tfmt.Println(size)\n\te = stream.Decode(&dtx)\n\tfmt.Println(e)\n\tfmt.Println(dtx)\n}\n\nfunc TestClose(t *testing.T) {\n\tbuf := bytes.Buffer{}\n\tw := bufio.NewWriter(&buf)\n\n\ttx := T{}\n\ttx.Fee.Value = utils.NewU256(2)\n\ttx.Fee.Currency = utils.CurrencyToUint256(\"SERO\")\n\ttx.Desc_Cmd.ClosePool = &ClosePoolCmd{}\n\n\te := rlp.Encode(w, &tx)\n\tfmt.Println(e)\n\tw.Flush()\n\n\tdtx := T{}\n\tstream := rlp.NewStream(&buf, uint64(buf.Len()))\n\t_, size, _ := stream.Kind()\n\tfmt.Println(size)\n\te = stream.Decode(&dtx)\n\tfmt.Println(e)\n\tfmt.Println(dtx)\n}\n"
  },
  {
    "path": "zero/txs/test/txs.go",
    "content": "package test\n"
  },
  {
    "path": "zero/txs/test/txs_test.go",
    "content": "//// copyright 2018 The sero.cash Authors\n//// This file is part of the go-sero library.\n////\n//// The go-sero library is free software: you can redistribute it and/or modify\n//// it under the terms of the GNU Lesser 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//// The go-sero library 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 Lesser General Public License for more details.\n////\n//// You should have received a copy of the GNU Lesser General Public License\n//// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n//\npackage test\n\n//\n//import (\n//\t\"fmt\"\n//\t\"testing\"\n//\n//\t\"github.com/sero-cash/go-sero/zero/txs/verify\"\n//\n//\t\"github.com/sero-cash/go-sero/zero/wallet/lstate/generate\"\n//\n//\t\"github.com/sero-cash/go-sero/zero/txs/zstate/txstate\"\n//\n//\t\"github.com/sero-cash/go-sero/common\"\n//\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n//\n//\t\"github.com/sero-cash/go-sero/zero/txs/tx\"\n//\n//\t\"github.com/sero-cash/go-czero-import/c_czero\"\n//\t\"github.com/sero-cash/go-czero-import/c_type\"\n//\t\"github.com/sero-cash/go-czero-import/superzk\"\n//\n//\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n//\n//\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n//\t\"github.com/sero-cash/go-sero/zero/utils\"\n//\n//\t\"github.com/sero-cash/go-sero/core/state\"\n//\n//\t\"github.com/sero-cash/go-sero/serodb\"\n//)\n//\n//type Blocks struct {\n//\tca  state.Database\n//\tsd  *state.StateDB\n//\tst  *zstate.ZState\n//\tst0 *txstate.State\n//\tst1 *state1.State1_storage\n//}\n//\n//var g_blocks Blocks\n//\n//func NewBlock() {\n//\tif g_blocks.ca == nil {\n//\t\tdb := serodb.NewMemDatabase()\n//\t\tg_blocks.ca = state.NewDatabase(db)\n//\t\tg_blocks.sd, _ = state.NewGenesis(common.Hash{}, g_blocks.ca)\n//\t\tg_blocks.st = g_blocks.sd.GetZState()\n//\t\tg_blocks.st0 = &g_blocks.st.State\n//\t} else {\n//\t\tg_blocks.st0.Block = txstate.StateBlock{}\n//\t}\n//}\n//\n//func EndBlock() {\n//\tif g_blocks.st1 == nil {\n//\t\tst1 := state1.LoadState(g_blocks.st, \"\")\n//\t\tg_blocks.st1 = &st1\n//\t} else {\n//\t\tg_blocks.st1.State = g_blocks.st\n//\t}\n//\tg_blocks.st1.UpdateWitness(keys.Seeds2Tks(seeds))\n//\tNewBlock()\n//}\n//\n//type user struct {\n//\ti    int\n//\tseed c_type.Uint256\n//\taddr c_type.Uint512\n//}\n//\n//var seeds = []c_type.Uint256{}\n//\n//func newUser(i int) (ret user) {\n//\tfmt.Printf(\"\\n\\n===========new user(%v)============\\n\", i)\n//\tret = user{}\n//\tret.i = i\n//\tret.seed = c_type.Uint256{byte(i)}\n//\tret.addr = keys.Seed2Addr(&ret.seed)\n//\tseeds = append(seeds, ret.seed)\n//\tfmt.Printf(\"\\nseed: \")\n//\tret.seed.LogOut()\n//\tfmt.Printf(\"\\naddr: \")\n//\tret.addr.LogOut()\n//\treturn\n//}\n//\n//func (self *user) getAR() (pkr c_type.PKr) {\n//\tpkr = superzk.Pk2PKr(&self.addr, nil)\n//\tfmt.Printf(\"\\nuser(%v):get pkr: \", self.i)\n//\tpkr.LogOut()\n//\treturn\n//}\n//\n//func (self *user) addOut(v int) {\n//\tout := stx.Out_O{}\n//\tout.Addr = self.getAR()\n//\tout.Asset = assets.NewAsset(\n//\t\t&assets.Token{\n//\t\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\t\tutils.NewU256(uint64(v)),\n//\t\t},\n//\t\tnil,\n//\t)\n//\tg_blocks.st.addOut_O(&out)\n//\tg_blocks.st.Update()\n//\tEndBlock()\n//}\n//\n//func (self *user) addTkt(v int) {\n//\tout := stx.Out_O{}\n//\tout.Addr = self.getAR()\n//\tout.Asset = assets.Asset{\n//\t\t&assets.Token{\n//\t\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\t\tutils.NewU256(uint64(v)),\n//\t\t},\n//\t\t&assets.Ticket{\n//\t\t\tutils.CurrencyToUint256(\"SERO_TICKET\"),\n//\t\t\tcpt.Random(),\n//\t\t},\n//\t}\n//\tg_blocks.st.addOut_O(&out)\n//\tg_blocks.st.Update()\n//\tEndBlock()\n//}\n//\n//func (self *user) GetOuts() (outs []*state1.OutState) {\n//\tif os, e := g_blocks.st1.GetOuts(keys.Seed2Tk(&self.seed).NewRef()); e != nil {\n//\t\tpanic(e)\n//\t\treturn\n//\t} else {\n//\t\touts = os\n//\t\treturn\n//\t}\n//}\n//\n//func (self *user) GetPkgs(is_from bool) (ret []*state1.Pkg) {\n//\tret = g_blocks.st1.GetPkgs(keys.Seed2Tk(&self.seed).NewRef(), is_from)\n//\treturn\n//}\n//\n//func (self *user) Gen(seed *c_type.Uint256, t *tx.T) (s stx.T, e error) {\n//\treturn generate.Gen_lstate(g_blocks.st1, seed, t)\n//}\n//\n//func (self *user) Verify(t *stx.T) (e error) {\n//\treturn verify.Verify_state1(t, g_blocks.st1.State)\n//}\n//\n//func (self *user) Logout() (ret uint64) {\n//\tfmt.Printf(\"\\n\\n===========user(%v)============\\n\", self.i)\n//\touts := self.GetOuts()\n//\tfor _, out := range outs {\n//\t\tif out.Out_O.Asset.Tkn != nil {\n//\t\t\tfmt.Printf(\"TKN: (%v:%v)---%v-----%v\\n\", out.Root[1], out.OutIndex, out.Out_O.Asset.Tkn.Currency[0], out.Out_O.Asset.Tkn.Value.ToIntRef().Int64())\n//\t\t\tret += out.Out_O.Asset.Tkn.Value.ToIntRef().Uint64()\n//\t\t}\n//\t\tif out.Out_O.Asset.Tkt != nil {\n//\t\t\tfmt.Printf(\"TKT: (%v:%v)---%v-----%v\\n\", out.Root[1], out.OutIndex, out.Out_O.Asset.Tkt.Category[0], out.Out_O.Asset.Tkt.Value)\n//\t\t}\n//\t}\n//\tfmt.Printf(\"===========user(%v)============\\n\\n\", self.i)\n//\treturn\n//}\n//\n//func (self *user) Close(id *c_type.Uint256, v int, key *c_type.Uint256) {\n//\tfmt.Printf(\"user(%v) close pkg %v\\n\", self.i, id)\n//\tt := tx.T{}\n//\tt.Fee = assets.Token{\n//\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\tutils.NewU256(uint64(0)),\n//\t}\n//\tt.PkgClose = &tx.PkgClose{}\n//\tt.PkgClose.Key = *key\n//\tt.PkgClose.Id = *id\n//\n//\tout1 := tx.Out{}\n//\tout1.Asset = assets.Asset{\n//\t\t&assets.Token{\n//\t\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\t\tutils.NewU256(uint64(v)),\n//\t\t},\n//\t\tnil,\n//\t}\n//\tout1.IsZ = true\n//\tout1.Addr = self.getAR()\n//\tt.Outs = append(t.Outs, out1)\n//\n//\ts, e := self.Gen(&self.seed, &t)\n//\tif e != nil {\n//\t\tfmt.Printf(\"user(%v) send gen error: %v\", self.i, e)\n//\t}\n//\n//\tif e := self.Verify(&s); e != nil {\n//\t\tfmt.Printf(\"user(%v) send verify error: %v\", self.i, e)\n//\t}\n//\n//\tg_blocks.st.AddStx(&s)\n//\tg_blocks.st.Update()\n//\tEndBlock()\n//\treturn\n//}\n//\n//func (self *user) Package(v int, fee int, u user) (ret c_type.PKr) {\n//\tfmt.Printf(\"user(%v) send %v:%v to user(%v)\\n\", self.i, v, fee, u.i)\n//\touts := self.GetOuts()\n//\tin := tx.In{}\n//\tin.Root = outs[0].Root\n//\tout0 := tx.PkgCreate{}\n//\tout0.PKr = u.getAR()\n//\tret = out0.PKr\n//\tout0.Pkg.Asset = assets.Asset{\n//\t\t&assets.Token{\n//\t\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\t\tutils.NewU256(uint64(v)),\n//\t\t},\n//\t\tnil,\n//\t}\n//\n//\tout1 := tx.Out{}\n//\tout1.Addr = self.getAR()\n//\tout1.Asset = outs[0].Out_O.Asset.Clone()\n//\tout1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(v)).ToRef())\n//\tout1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(fee)).ToRef())\n//\n//\tout1.IsZ = true\n//\n//\tt := tx.T{}\n//\tt.Fee = assets.Token{\n//\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\tutils.NewU256(uint64(fee)),\n//\t}\n//\tt.Ins = append(t.Ins, in)\n//\tt.Outs = append(t.Outs, out1)\n//\tt.PkgCreate = &out0\n//\n//\ts, e := self.Gen(&self.seed, &t)\n//\tif e != nil {\n//\t\tfmt.Printf(\"user(%v) send gen error: %v\", self.i, e)\n//\t}\n//\n//\tif e := self.Verify(&s); e != nil {\n//\t\tfmt.Printf(\"user(%v) send verify error: %v\", self.i, e)\n//\t}\n//\n//\tg_blocks.st.AddStx(&s)\n//\tg_blocks.st.Update()\n//\tEndBlock()\n//\treturn\n//}\n//\n//func (self *user) Send(v int, fee int, u user, z bool) {\n//\tfmt.Printf(\"user(%v) send %v:%v to user(%v)\\n\", self.i, v, fee, u.i)\n//\touts := self.GetOuts()\n//\tin := tx.In{}\n//\tin.Root = outs[0].Root\n//\tout0 := tx.Out{}\n//\tout0.Addr = u.getAR()\n//\tout0.Asset = assets.Asset{\n//\t\t&assets.Token{\n//\t\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\t\tutils.NewU256(uint64(v)),\n//\t\t},\n//\t\tnil,\n//\t}\n//\tout0.IsZ = z\n//\n//\tout1 := tx.Out{}\n//\tout1.Addr = self.getAR()\n//\tout1.Asset = outs[0].Out_O.Asset.Clone()\n//\tout1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(v)).ToRef())\n//\tout1.Asset.Tkn.Value.SubU(utils.NewU256(uint64(fee)).ToRef())\n//\n//\tout1.IsZ = z\n//\n//\tt := tx.T{}\n//\tt.Fee = assets.Token{\n//\t\tutils.CurrencyToUint256(\"SERO\"),\n//\t\tutils.NewU256(uint64(fee)),\n//\t}\n//\tt.Ins = append(t.Ins, in)\n//\tt.Outs = append(t.Outs, out0)\n//\tt.Outs = append(t.Outs, out1)\n//\n//\ts, e := self.Gen(&self.seed, &t)\n//\tif e != nil {\n//\t\tfmt.Printf(\"user(%v) send gen error: %v\", self.i, e)\n//\t}\n//\n//\tif e := self.Verify(&s); e != nil {\n//\t\tfmt.Printf(\"user(%v) send verify error: %v\", self.i, e)\n//\t}\n//\n//\tg_blocks.st.AddStx(&s)\n//\tg_blocks.st.Update()\n//\tEndBlock()\n//}\n//\n//type ArrayObj struct {\n//\tp0 int\n//\tp1 uint64\n//}\n//\n//func TestArrayObj(t *testing.T) {\n//\ta := [6]ArrayObj{}\n//\ta[1].p0 = 0\n//\tfmt.Printf(\"%v\\n\", a)\n//}\n//\n//func TestMain(m *testing.M) {\n//\tcpt.ZeroInit(\"\", c_czero.NET_Dev)\n//\tNewBlock()\n//\tm.Run()\n//}\n//\n//func TestTx(t *testing.T) {\n//\tuser_m := newUser(1)\n//\tuser_a := newUser(2)\n//\tuser_m.addOut(100)\n//\tuser_m.Send(50, 10, user_a, true)\n//\tif user_m.Logout() != 40 {\n//\t\tt.Fail()\n//\t}\n//}\n//\n//func TestPkg(t *testing.T) {\n//\tuser_m := newUser(1)\n//\tuser_a := newUser(2)\n//\tuser_m.addOut(100)\n//\tuser_m.Package(50, 10, user_a)\n//\tif user_m.Logout() != 40 {\n//\t\tt.FailNow()\n//\t}\n//\tuser_a.Close(&c_type.Uint256{}, 50, &g_blocks.st1.GetPkgs(nil, true)[0].Key)\n//\tif user_a.Logout() != 50 {\n//\t\tt.FailNow()\n//\t}\n//}\n//\n//func TestTxs(t *testing.T) {\n//\tuser_m := newUser(1)\n//\tuser_a := newUser(2)\n//\tuser_b := newUser(3)\n//\tuser_c := newUser(4)\n//\n//\tuser_m.addTkt(100)\n//\tuser_m.addOut(100)\n//\tuser_m.addOut(100)\n//\tuser_m.addOut(100)\n//\n//\tif user_m.Logout() != 400 {\n//\t\tt.FailNow()\n//\t}\n//\n//\tpkg_pkr := user_m.Package(50, 10, user_a)\n//\tif g_blocks.st.Pkgs.GetPkg(&c_type.Uint256{}) == nil {\n//\t\tt.FailNow()\n//\t}\n//\n//\tvar key c_type.Uint256\n//\tif pkgs := user_m.GetPkgs(true); len(pkgs) == 0 {\n//\t\tt.FailNow()\n//\t} else {\n//\t\tkey = pkgs[0].Key\n//\t}\n//\tif pkgs := user_a.GetPkgs(false); len(pkgs) == 0 {\n//\t\tt.FailNow()\n//\t}\n//\n//\tg_blocks.st.Pkgs.Close(&c_type.Uint256{}, &pkg_pkr, &key)\n//\tg_blocks.st.Update()\n//\tEndBlock()\n//\n//\tif g_blocks.st.Pkgs.GetPkg(&c_type.Uint256{}) != nil {\n//\t\tt.FailNow()\n//\t}\n//\tif pkgs := user_m.GetPkgs(true); len(pkgs) != 0 {\n//\t\tt.FailNow()\n//\t}\n//\tif pkgs := user_a.GetPkgs(false); len(pkgs) != 0 {\n//\t\tt.FailNow()\n//\t}\n//\n//\tEndBlock()\n//\n//\tuser_a.addOut(50)\n//\n//\tif user_m.Logout() != 340 {\n//\t\tt.FailNow()\n//\t}\n//\tif user_a.Logout() != 50 {\n//\t\tt.FailNow()\n//\t}\n//\n//\tuser_m.addOut(100)\n//\n//\tif user_m.Logout() != 440 {\n//\t\tt.FailNow()\n//\t}\n//\tif user_a.Logout() != 50 {\n//\t\tt.FailNow()\n//\t}\n//\n//\tuser_a.Send(20, 5, user_b, true)\n//\n//\tif user_a.Logout() != 25 {\n//\t\tt.FailNow()\n//\t}\n//\tif user_b.Logout() != 20 {\n//\t\tt.FailNow()\n//\t}\n//\n//\tuser_b.Send(10, 5, user_c, true)\n//\n//\tif user_b.Logout() != 5 {\n//\t\tt.FailNow()\n//\t}\n//\tif user_c.Logout() != 10 {\n//\t\tt.FailNow()\n//\t}\n//}\n//\n//func TestStrTree(t *testing.T) {\n//\n//\toutState := txstate.NewMerkleTree(g_blocks.st.Tri)\n//\n//\tcm1 := c_type.Uint256{1}\n//\toutState.AppendLeaf(cm1)\n//\n//\tcm2 := c_type.Uint256{2}\n//\toutState.AppendLeaf(cm2)\n//\n//\tcm3 := c_type.Uint256{3}\n//\toutState.AppendLeaf(cm3)\n//\n//\tcm4 := c_type.Uint256{4}\n//\trt4 := outState.AppendLeaf(cm4)\n//\n//\tpos, path, anchor := outState.GetPaths(cm3)\n//\trt := txstate.CalcRoot(&cm3, pos, &path)\n//\n//\tif rt != rt4 {\n//\t\tt.FailNow()\n//\t}\n//\tif rt != anchor {\n//\t\tt.FailNow()\n//\t}\n//\n//\tfmt.Print(pos, path)\n//}\n"
  },
  {
    "path": "zero/txs/tx/tx.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tx\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype In struct {\n\tRoot c_type.Uint256\n\tIsO  bool\n}\n\ntype Out struct {\n\tAddr  c_type.PKr\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n\tIsZ   bool\n}\n\ntype PkgCreate struct {\n\tId  c_type.Uint256\n\tPKr c_type.PKr\n\tPkg pkg.Pkg_O\n}\n\ntype PkgClose struct {\n\tId  c_type.Uint256\n\tKey c_type.Uint256\n}\n\ntype PkgTransfer struct {\n\tId  c_type.Uint256\n\tPKr c_type.PKr\n}\n\ntype T struct {\n\tFromRnd     *c_type.Uint256\n\tEhash       c_type.Uint256\n\tFee         assets.Token\n\tIns         []In\n\tOuts        []Out\n\tPkgCreate   *PkgCreate\n\tPkgTransfer *PkgTransfer\n\tPkgClose    *PkgClose\n}\n\nfunc (self *T) TokenCost() (ret map[c_type.Uint256]utils.U256) {\n\tret = make(map[c_type.Uint256]utils.U256)\n\tret[self.Fee.Currency] = self.Fee.Value\n\tif len(self.Outs) > 0 {\n\t\tfor _, out := range self.Outs {\n\t\t\tif out.Asset.Tkn != nil {\n\t\t\t\tif cost, ok := ret[out.Asset.Tkn.Currency]; ok {\n\t\t\t\t\tcost.AddU(&out.Asset.Tkn.Value)\n\t\t\t\t\tret[out.Asset.Tkn.Currency] = cost\n\t\t\t\t} else {\n\t\t\t\t\tret[out.Asset.Tkn.Currency] = out.Asset.Tkn.Value\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif self.PkgCreate != nil {\n\t\tasset := self.PkgCreate.Pkg.Asset\n\t\tif asset.Tkn != nil {\n\t\t\tif cost, ok := ret[asset.Tkn.Currency]; ok {\n\t\t\t\tcost.AddU(&asset.Tkn.Value)\n\t\t\t\tret[asset.Tkn.Currency] = cost\n\t\t\t} else {\n\t\t\t\tret[asset.Tkn.Currency] = asset.Tkn.Value\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *T) TikectCost() (ret map[c_type.Uint256][]c_type.Uint256) {\n\tret = make(map[c_type.Uint256][]c_type.Uint256)\n\tif len(self.Outs) > 0 {\n\t\tfor _, out := range self.Outs {\n\t\t\tif out.Asset.Tkt != nil {\n\t\t\t\tif tkts, ok := ret[out.Asset.Tkt.Category]; ok {\n\t\t\t\t\ttkts = append(tkts, out.Asset.Tkt.Value)\n\t\t\t\t\tret[out.Asset.Tkt.Category] = tkts\n\t\t\t\t} else {\n\t\t\t\t\tret[out.Asset.Tkt.Category] = []c_type.Uint256{out.Asset.Tkt.Value}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif self.PkgCreate != nil {\n\t\tasset := self.PkgCreate.Pkg.Asset\n\t\tif asset.Tkt != nil {\n\t\t\tif tkts, ok := ret[asset.Tkt.Category]; ok {\n\t\t\t\ttkts = append(tkts, asset.Tkt.Value)\n\t\t\t\tret[asset.Tkt.Category] = tkts\n\t\t\t} else {\n\t\t\t\tret[asset.Tkt.Category] = []c_type.Uint256{asset.Tkt.Value}\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/tx/tx_test.go",
    "content": "package tx\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nfunc TestT_TokenCost(t *testing.T) {\n\tseroCy := utils.CurrencyToUint256(\"SERO\")\n\tfmt.Printf(\"%t\\n\", seroCy)\n\tcy := utils.CurrencyToUint256(\"d\")\n\tret := make(map[c_type.Uint256]utils.U256)\n\tret[seroCy] = utils.NewU256(24)\n\tif cost, ok := ret[seroCy]; ok {\n\t\tadd := utils.NewU256(12)\n\t\tcost.AddU(&add)\n\t\tret[seroCy] = cost\n\t} else {\n\t\tcost := utils.NewU256(48)\n\t\tret[cy] = cost\n\t}\n\n\tfmt.Printf(\"%t\", ret)\n\n}\n"
  },
  {
    "path": "zero/txs/zstate/merkle/merkle.go",
    "content": "package merkle\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype CombinFunc func(*c_type.Uint256, *c_type.Uint256) (out c_type.Uint256)\n\ntype Param struct {\n\temptyRoots   [c_type.DEPTH + 1]c_type.Uint256\n\tobj          c_type.PKr\n\tis_load      bool\n\tindexLeafKey c_type.Uint256\n\tindexTreeKey c_type.Uint256\n\tcap          uint64\n\tleafcap      uint64\n\tstartIndex   uint64\n\tcombine      CombinFunc\n}\n\nfunc NewParam(obj *c_type.PKr, combine CombinFunc) (ret Param) {\n\tret.obj = *obj\n\tret.indexLeafKey = c_type.Uint256(crypto.Keccak256Hash([]byte(\"outTreeIndex_Leaf\")))\n\tret.indexTreeKey = c_type.Uint256(crypto.Keccak256Hash([]byte(\"outTreeIndex_Self\")))\n\tret.cap = toPow2(DEPTH + 1)\n\tret.leafcap = toPow2(DEPTH)\n\tret.startIndex = toPow2(DEPTH)\n\tret.combine = combine\n\treturn\n}\n\nfunc (self *Param) CalcRoot(value *c_type.Uint256, pos uint64, paths *[DEPTH]c_type.Uint256) (ret c_type.Uint256) {\n\tret = *value\n\tfor _, path := range paths {\n\t\tif pos%2 == 0 {\n\t\t\tret = self.combine(&ret, &path)\n\t\t} else {\n\t\t\tret = self.combine(&path, &ret)\n\t\t}\n\t\tpos >>= 1\n\t}\n\treturn\n}\n\nfunc (self *Param) createEmpty() (ret [c_type.DEPTH + 1]c_type.Uint256) {\n\tret[0] = c_type.Empty_Uint256\n\tfor i := 1; i <= c_type.DEPTH; i++ {\n\t\tret[i] = self.combine(&ret[i-1], &ret[i-1])\n\t}\n\treturn\n}\n\nfunc (self *Param) EmptyRoots() []c_type.Uint256 {\n\tif !self.is_load {\n\t\tself.is_load = true\n\t\tself.emptyRoots = self.createEmpty()\n\t}\n\treturn self.emptyRoots[:]\n}\n\ntype Leaf struct {\n\tleafIndex uint64\n\ttreeIndex uint64\n\tvalue     c_type.Uint256\n}\n\ntype MerkleTree struct {\n\tparam *Param\n\tdb    tri.Tri\n}\n\nfunc (self *Param) NewMerkleTree(db tri.Tri) (ret MerkleTree) {\n\tret.db = db\n\tret.param = self\n\treturn\n}\n\nfunc (self *MerkleTree) AppendLeaf(value c_type.Uint256) c_type.Uint256 {\n\tleafIndex := self.nextLeafIndex()\n\ttreeIndex := self.geCurrentTreeIndex()\n\tself.db.SetState(&self.param.obj, leafKey(value).NewRef(), c_type.Uint64_To_Uint256(leafIndex).NewRef())\n\tself.db.SetState(&self.param.obj, treeKey(value).NewRef(), c_type.Uint64_To_Uint256(treeIndex).NewRef())\n\tself.db.SetState(&self.param.obj, indexPathKey(leafIndex, treeIndex).NewRef(), &value)\n\n\tcurrent_value := value\n\tdepth := toDepth(leafIndex)\n\tfor leafIndex != 1 {\n\t\tbrotherIndex := brother(leafIndex)\n\t\tvar brotherValue c_type.Uint256\n\t\tif brotherIndex > leafIndex {\n\t\t\tbrotherValue = self.param.EmptyRoots()[depth]\n\t\t} else {\n\t\t\tbrotherValue = self.db.GetState(&self.param.obj, indexPathKey(brotherIndex, treeIndex).NewRef())\n\t\t\tif brotherValue == c_type.Empty_Uint256 {\n\t\t\t\tpanic(fmt.Sprintf(\"brother value is empty\"))\n\t\t\t}\n\t\t}\n\n\t\tif leafIndex%2 == 0 {\n\t\t\tcurrent_value = self.param.combine(&current_value, &brotherValue)\n\t\t} else {\n\t\t\tcurrent_value = self.param.combine(&brotherValue, &current_value)\n\t\t}\n\n\t\tleafIndex = parent(leafIndex)\n\t\tdepth++\n\t\tself.db.SetState(&self.param.obj, indexPathKey(leafIndex, treeIndex).NewRef(), &current_value)\n\t}\n\treturn current_value\n}\n\nfunc (self *MerkleTree) GetLeafSize() (ret uint64) {\n\tleafIndex := self.getCurrentLeafIndex() - self.param.startIndex\n\ttree_count := self.geCurrentTreeIndex()\n\treturn tree_count*self.param.leafcap + leafIndex\n}\n\nfunc (self *MerkleTree) GetPaths(value c_type.Uint256) (pos uint64, paths [DEPTH]c_type.Uint256, anchor c_type.Uint256) {\n\tleafIndex := c_type.Uint256_To_Uint64(self.db.GetState(&self.param.obj, leafKey(value).NewRef()).NewRef())\n\tif leafIndex == 0 {\n\t\tpanic(fmt.Errorf(\"leaf index can not be 0\"))\n\t}\n\n\ttreeIndex := c_type.Uint256_To_Uint64(self.db.GetState(&self.param.obj, treeKey(value).NewRef()).NewRef())\n\tcurrentTreeIndex := self.geCurrentTreeIndex()\n\n\tvar cur_leafIndex uint64\n\tif currentTreeIndex == treeIndex {\n\t\tcur_leafIndex = self.getCurrentLeafIndex() - 1\n\t} else {\n\t\tcur_leafIndex = self.param.cap - 1\n\t}\n\n\tanchor = self.db.GetState(&self.param.obj, indexPathKey(1, treeIndex).NewRef())\n\tpos = leafIndex - self.param.startIndex\n\n\tdepth := toDepth(leafIndex)\n\tfor leafIndex != 1 {\n\t\tbrotherIndex := brother(leafIndex)\n\t\tvar brotherValue c_type.Uint256\n\t\tif brotherIndex > cur_leafIndex {\n\t\t\tbrotherValue = self.param.EmptyRoots()[depth]\n\t\t} else {\n\t\t\tbrotherValue = self.db.GetState(&self.param.obj, indexPathKey(brotherIndex, treeIndex).NewRef())\n\t\t\tif brotherValue == c_type.Empty_Uint256 {\n\t\t\t\tpanic(fmt.Sprintf(\"brother value is empty\"))\n\t\t\t}\n\t\t}\n\t\tpaths[depth] = brotherValue\n\t\tleafIndex = parent(leafIndex)\n\t\tcur_leafIndex = parent(cur_leafIndex)\n\t\tdepth++\n\t}\n\treturn\n}\n\nfunc (self *MerkleTree) nextLeafIndex() uint64 {\n\tleafIndex := self.getCurrentLeafIndex()\n\tif leafIndex == self.param.cap {\n\t\tleafIndex = self.param.startIndex\n\t\ttreeIndex := self.geCurrentTreeIndex()\n\t\ttreeIndex = treeIndex + 1\n\t\tself.db.SetState(&self.param.obj, &self.param.indexTreeKey, c_type.Uint64_To_Uint256(treeIndex).NewRef())\n\t}\n\tself.db.SetState(&self.param.obj, &self.param.indexLeafKey, c_type.Uint64_To_Uint256(leafIndex+1).NewRef())\n\treturn leafIndex\n}\n\nfunc (self *MerkleTree) getCurrentLeafIndex() uint64 {\n\tvalue := self.db.GetState(&self.param.obj, &self.param.indexLeafKey)\n\tindex := c_type.Uint256_To_Uint64(&value)\n\tif index == 0 {\n\t\tindex = self.param.startIndex\n\t}\n\treturn index\n}\n\nfunc (self *MerkleTree) geCurrentTreeIndex() uint64 {\n\tvalue := self.db.GetState(&self.param.obj, &self.param.indexTreeKey)\n\tindex := c_type.Uint256_To_Uint64(&value)\n\treturn index\n}\n\nfunc parent(index uint64) uint64 {\n\treturn index / 2\n}\n\nfunc brother(index uint64) uint64 {\n\tif index%2 == 0 {\n\t\treturn index + 1\n\t} else {\n\t\treturn index - 1\n\t}\n}\n\nfunc leafKey(value c_type.Uint256) c_type.Uint256 {\n\treturn c_type.Uint256(crypto.Keccak256Hash(append([]byte(\"LEAF_\"), value[:]...)))\n}\n\nfunc treeKey(value c_type.Uint256) c_type.Uint256 {\n\treturn c_type.Uint256(crypto.Keccak256Hash(append([]byte(\"TREE_\"), value[:]...)))\n}\n\nfunc indexPathKey(leafIndex, treeIndex uint64) c_type.Uint256 {\n\tbytes, _ := rlp.EncodeToBytes([]interface{}{leafIndex, treeIndex, []byte(\"PATH\")})\n\treturn c_type.Uint256(crypto.Keccak256Hash(bytes))\n}\n"
  },
  {
    "path": "zero/txs/zstate/merkle/merkle_test.go",
    "content": "package merkle\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/consensus\"\n)\n\ntype TreeState struct {\n\tdb *consensus.FakeTri\n}\n\nfunc (self *TreeState) TryGet(key []byte) ([]byte, error) {\n\treturn nil, nil\n}\nfunc (self *TreeState) TryUpdate(key, value []byte) error {\n\treturn nil\n}\n\nfunc (self *TreeState) SetState(obj *c_type.PKr, key *c_type.Uint256, value *c_type.Uint256) {\n\tself.db.TryUpdate(key[:], value[:])\n}\nfunc (self *TreeState) GetState(obj *c_type.PKr, key *c_type.Uint256) (ret c_type.Uint256) {\n\tr, e := self.db.TryGet(key[:])\n\tif e == nil {\n\t\tcopy(ret[:], r)\n\t}\n\treturn\n}\nfunc (self *TreeState) GlobalGetter() serodb.Getter {\n\treturn nil\n}\n\nvar Address = c_type.PKr{}\nvar MerkleParam = NewParam(&Address, c_superzk.Combine)\n\nfunc TestOutTree(t *testing.T) {\n\t// Create an empty state database\n\tsuperzk.ZeroInit(\"\", 0)\n\n\tft := consensus.NewFakeTri()\n\toutState := MerkleParam.NewMerkleTree(&TreeState{db: &ft})\n\n\tfor i := 1; i <= 100; i++ {\n\t\tvalue := crypto.Keccak256Hash(big.NewInt(int64(i)).Bytes()).HashToUint256()\n\t\toutState.AppendLeaf(*value)\n\n\t\t/*for i := 1; i <= 15; i++ {\n\t\t\tkey := indexPathKey(uint64(i), uint64(0))\n\t\t\tvalue := outState.db.GetState(&key)\n\t\t\tfmt.Println(i, \":\", common.Bytes2Hex(value[:]))\n\t\t}*/\n\n\t\t/*if i == 3 {\n\t\t\tcurrent := crypto.Keccak256Hash(big.NewInt(int64(1)).Bytes()).HashToUint256()\n\t\t\tindex, getPaths, anchor := outState.GetPaths(*current)\n\t\t\tret := CalcRoot(current, index, &getPaths)\n\t\t\tif anchor != ret {\n\t\t\t\tfmt.Println(i, 1)\n\t\t\t\tt.FailNow()\n\t\t\t}\n\t\t}*/\n\n\t\tfor j := 1; j <= i; j++ {\n\t\t\tcurrent := crypto.Keccak256Hash(big.NewInt(int64(j)).Bytes()).HashToUint256()\n\t\t\tindex, getPaths, anchor := outState.GetPaths(*current)\n\t\t\tret := MerkleParam.CalcRoot(current, index, &getPaths)\n\t\t\tif anchor != ret {\n\t\t\t\tfmt.Println(i, j)\n\t\t\t\tt.FailNow()\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txs/zstate/merkle/utils.go",
    "content": "package merkle\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n)\n\nconst DEPTH = c_type.DEPTH\n\nfunc toDepth(index uint64) (ret uint8) {\n\tret = 0\n\tfor index != 0 {\n\t\tindex >>= 1\n\t\tret++\n\t}\n\treturn DEPTH + 1 - ret\n}\n\nfunc toPow2(index int) (ret uint64) {\n\tret = uint64(1) << uint64(index)\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/zstate/pkgstate/data/data.go",
    "content": "package data\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Data struct {\n\tId2Hash  utils.H2Hash\n\tIdDirtys utils.Dirtys\n\tHash2Pkg map[c_type.Uint256]localdb.ZPkg\n}\n\nfunc NewData() (ret *Data) {\n\treturn &Data{\n\t\tId2Hash: utils.NewH2Hash(\"$ZState0$Pkg$Id2Hash$\"),\n\t}\n}\nfunc (self *Data) Clear() {\n\tself.Id2Hash.Clear()\n\tself.IdDirtys.Clear()\n\tself.Hash2Pkg = make(map[c_type.Uint256]localdb.ZPkg)\n}\nfunc (self *Data) Add(pkg *localdb.ZPkg) {\n\thash := pkg.ToHash()\n\tself.Hash2Pkg[hash] = *pkg\n\tself.Id2Hash.Add(&pkg.Pack.Id, &hash)\n\tself.IdDirtys.Append(&pkg.Pack.Id)\n}\n\nfunc (self *Data) GetHashes() (ret []c_type.Uint256) {\n\tfor _, id := range self.IdDirtys.List() {\n\t\thash := self.Id2Hash.Get(&id)\n\t\tret = append(ret, hash)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/zstate/pkgstate/data/data_state.go",
    "content": "package data\n\nimport (\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\nfunc (self *Data) SaveState(tr tri.Tri) {\n\tG2pkgs_dirty := self.IdDirtys.List()\n\tfor _, k := range G2pkgs_dirty {\n\t\tself.Id2Hash.SaveByTri(tr, &k)\n\t}\n}\n\nfunc (self *Data) RecordState(putter serodb.Putter, hash *c_type.Uint256) {\n\tif pkg, ok := self.Hash2Pkg[*hash]; ok {\n\t\tlocaldb.PutPkg(putter, hash, &pkg)\n\t} else {\n\t\tpanic(errors.New(\"PKG record index error: hash2pkg\"))\n\t}\n}\n\nfunc (self *Data) GetPkgById(tr tri.Tri, id *c_type.Uint256) (pg *localdb.ZPkg) {\n\tif hash := self.Id2Hash.GetByTri(tr, id); hash != c_type.Empty_Uint256 {\n\t\tpg = self.GetPkgByHash(tr, &hash)\n\t\treturn\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *Data) GetPkgByHash(tr tri.Tri, hash *c_type.Uint256) (pg *localdb.ZPkg) {\n\tif p, ok := self.Hash2Pkg[*hash]; ok {\n\t\tpg = &p\n\t\treturn\n\t} else {\n\t\tif p := localdb.GetPkg(tr.GlobalGetter(), hash); p != nil {\n\t\t\tself.Hash2Pkg[*hash] = *p\n\t\t\tpg = p\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txs/zstate/pkgstate/state.go",
    "content": "package pkgstate\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-sero/serodb\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/pkgstate/data\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype PkgState struct {\n\ttri tri.Tri\n\trw  *sync.RWMutex\n\tnum uint64\n\n\tdata      data.Data\n\tsnapshots utils.Snapshots\n}\n\nfunc NewPkgState(tri tri.Tri, num uint64) (state PkgState) {\n\tstate = PkgState{tri: tri, num: num}\n\tstate.data = *data.NewData()\n\tstate.rw = new(sync.RWMutex)\n\tstate.data.Clear()\n\tstate.load()\n\treturn\n}\n\nfunc (self *PkgState) Snapshot(revid int) {\n\tself.snapshots.Push(revid, &self.data)\n}\nfunc (self *PkgState) Revert(revid int) {\n\tself.data.Clear()\n\tself.data = *self.snapshots.Revert(revid).(*data.Data)\n\treturn\n}\n\nfunc (self *PkgState) load() {\n}\n\nfunc (self *PkgState) Update() {\n\tself.data.SaveState(self.tri)\n\treturn\n}\n\nfunc (self *PkgState) RecordState(putter serodb.Putter, hash *c_type.Uint256) {\n\tself.data.RecordState(putter, hash)\n}\n\nfunc (self *PkgState) GetPkgByHash(hash *c_type.Uint256) (ret *localdb.ZPkg) {\n\tret = self.data.GetPkgByHash(self.tri, hash)\n\treturn\n}\n\nfunc (self *PkgState) GetPkgById(id *c_type.Uint256) (ret *localdb.ZPkg) {\n\tret = self.data.GetPkgById(self.tri, id)\n\treturn\n}\n\nfunc (state *PkgState) GetPkgHashes() (ret []c_type.Uint256) {\n\treturn state.data.GetHashes()\n}\n\nfunc (self *PkgState) Force_del(hash *c_type.Uint256, close *stx.PkgClose) (e error) {\n\tself.rw.Lock()\n\tdefer self.rw.Unlock()\n\tif pg := self.data.GetPkgById(self.tri, &close.Id); pg == nil || pg.Closed {\n\t\te = fmt.Errorf(\"Close Pkg is nil: %v\", hexutil.Encode(close.Id[:]))\n\t\treturn\n\t} else {\n\t\tif c_superzk.VerifyPKr_X(hash, &close.Sign, &pg.Pack.PKr) {\n\t\t\tpg.Closed = true\n\t\t\tself.data.Add(pg)\n\t\t} else {\n\t\t\te = fmt.Errorf(\"Close Pkg signed error: %v\", hexutil.Encode(close.Id[:]))\n\t\t\treturn\n\t\t}\n\t\treturn\n\t}\n}\n\nfunc (self *PkgState) Force_add(from *c_type.PKr, pack *stx.PkgCreate) (e error) {\n\tself.rw.Lock()\n\tdefer self.rw.Unlock()\n\n\tif pg := self.data.GetPkgById(self.tri, &pack.Id); pg != nil {\n\t\te = fmt.Errorf(\"Create Pkg is not nil: %v\", hexutil.Encode(pack.Id[:]))\n\t\treturn\n\t} else {\n\t\tzpkg := localdb.ZPkg{\n\t\t\tself.num,\n\t\t\t*from,\n\t\t\tpack.Clone(),\n\t\t\tfalse,\n\t\t}\n\t\tself.data.Add(&zpkg)\n\t\treturn\n\t}\n\n}\n\nfunc (self *PkgState) Force_transfer(hash *c_type.Uint256, trans *stx.PkgTransfer) (e error) {\n\tself.rw.Lock()\n\tdefer self.rw.Unlock()\n\tif pg := self.data.GetPkgById(self.tri, &trans.Id); pg == nil || pg.Closed {\n\t\te = fmt.Errorf(\"Transfer Pkg is nil: %v\", hexutil.Encode(trans.Id[:]))\n\t\treturn\n\t} else {\n\t\tif c_superzk.VerifyPKr_X(hash, &trans.Sign, &pg.Pack.PKr) {\n\t\t\tpg.Pack.PKr = trans.PKr\n\t\t\tself.data.Add(pg)\n\t\t} else {\n\t\t\te = fmt.Errorf(\"Transfer Pkg signed error: %v\", hexutil.Encode(trans.Id[:]))\n\t\t\treturn\n\t\t}\n\t\treturn\n\t}\n}\n\ntype OPkg struct {\n\tZ localdb.ZPkg\n\tO pkg.Pkg_O\n}\n\nfunc (self *PkgState) Close(id *c_type.Uint256, pkr *c_type.PKr, key *c_type.Uint256) (ret OPkg, e error) {\n\tself.rw.Lock()\n\tdefer self.rw.Unlock()\n\tif pg := self.data.GetPkgById(self.tri, id); pg == nil || pg.Closed {\n\t\te = fmt.Errorf(\"Close Pkg is nil: %v\", hexutil.Encode(id[:]))\n\t\treturn\n\t} else {\n\t\tif pg.Pack.PKr != *pkr {\n\t\t\te = fmt.Errorf(\"Close Pkg Owner Check Failed: %v\", hexutil.Encode(id[:]))\n\t\t\treturn\n\t\t} else {\n\t\t\tif ret.O, e = pkg.DePkg(key, &pg.Pack.Pkg); e != nil {\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tret.Z = *pg\n\t\t\t\tif e = pkg.ConfirmPkg(&ret.O, &ret.Z.Pack.Pkg); e != nil {\n\t\t\t\t\treturn\n\t\t\t\t} else {\n\t\t\t\t\tpg.Closed = true\n\t\t\t\t\tself.data.Add(pg)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (self *PkgState) Transfer(id *c_type.Uint256, pkr *c_type.PKr, to *c_type.PKr) (e error) {\n\tself.rw.Lock()\n\tdefer self.rw.Unlock()\n\tif pg := self.data.GetPkgById(self.tri, id); pg == nil || pg.Closed {\n\t\te = fmt.Errorf(\"Transfer Pkg is nil: %v\", hexutil.Encode(id[:]))\n\t\treturn\n\t} else {\n\t\tif pg.Pack.PKr != *pkr {\n\t\t\te = fmt.Errorf(\"Transfer Pkg Owner Check Failed: %v\", hexutil.Encode(id[:]))\n\t\t\treturn\n\t\t} else {\n\t\t\tpg.Pack.PKr = *to\n\t\t\tself.data.Add(pg)\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txs/zstate/tri/tri.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage tri\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n)\n\ntype Tri interface {\n\tTryGet(key []byte) ([]byte, error)\n\tTryUpdate(key, value []byte) error\n\tSetState(obj *c_type.PKr, key *c_type.Uint256, value *c_type.Uint256)\n\tGetState(obj *c_type.PKr, key *c_type.Uint256) (ret c_type.Uint256)\n\tGlobalGetter() serodb.Getter\n}\n\nfunc slice2Uint256(s []byte) (r c_type.Uint256) {\n\tcopy(r[:], s)\n\treturn\n}\n\ntype KEY_NAME string\n\nfunc (name KEY_NAME) Bytes() []byte {\n\treturn []byte(name)\n}\n\nfunc TryGetUint256s(tri Tri, key []byte, cb func([]byte, *c_type.Uint256)) (hashes []c_type.Uint256) {\n\tif v, err := tri.TryGet(key); err != nil {\n\t\tpanic(err)\n\t\treturn\n\t} else {\n\t\tif len(v) > 0 {\n\t\t\tfor i := 0; i < len(v); i += 32 {\n\t\t\t\tb := slice2Uint256(v[i : i+32])\n\t\t\t\thashes = append(hashes, b)\n\t\t\t\tif cb != nil {\n\t\t\t\t\tif o, err := tri.TryGet(b[:]); err != nil {\n\t\t\t\t\t\tpanic(err)\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif len(o) > 0 {\n\t\t\t\t\t\t\tcb(o, &b)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc TryUpdateUint256s(tri Tri, key []byte, hashes []c_type.Uint256) {\n\touts := []byte{}\n\tfor _, v := range hashes {\n\t\touts = append(outs, v[:]...)\n\t}\n\tif len(outs) > 0 {\n\t\tif err := tri.TryUpdate(key, outs); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\ntype unserial interface {\n\tUnserial(v []byte) error\n}\n\nfunc GetObj(tri Tri, key []byte, obj unserial) {\n\tif v, err := tri.TryGet(key); err != nil {\n\t\tpanic(err)\n\t\treturn\n\t} else {\n\t\tif err := obj.Unserial(v); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t}\n\treturn\n}\n\n/*func GetGlobalObj(tri Tri, key []byte, obj unserial) {\n\tif v, err := tri.TryGlobalGet(key); err != nil {\n\t\tif err := obj.Unserial(nil); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t} else {\n\t\tif err := obj.Unserial(v); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t}\n\treturn\n}*/\n\nfunc GetDBObj(db serodb.Getter, key []byte, obj unserial) {\n\tif v, err := db.Get(key); err != nil {\n\t\tif err := obj.Unserial(nil); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t} else {\n\t\tif err := obj.Unserial(v); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t}\n\treturn\n}\n\ntype serial interface {\n\tSerial() ([]byte, error)\n}\n\nfunc UpdateObj(tri Tri, key []byte, obj serial) {\n\tif s, err := obj.Serial(); err != nil {\n\t\tpanic(err)\n\t\treturn\n\t} else {\n\t\tif err := tri.TryUpdate(key, s); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t}\n\treturn\n}\n\n/*func UpdateGlobalObj(tri Tri, key []byte, obj serial) {\n\tif s, err := obj.Serial(); err != nil {\n\t\tpanic(err)\n\t\treturn\n\t} else {\n\t\tif err := tri.TryGlobalPut(key, s); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t}\n\treturn\n}*/\n\nfunc UpdateDBObj(database serodb.Putter, key []byte, obj serial) {\n\tif s, err := obj.Serial(); err != nil {\n\t\tpanic(err)\n\t\treturn\n\t} else {\n\t\tif err := database.Put(key, s); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t} else {\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/data/data.go",
    "content": "package data\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n)\n\ntype Data struct {\n\tNum    uint64\n\tCur    Current\n\tBlock  StateBlock\n\tG2outs map[c_type.Uint256]*localdb.OutState\n\tH2tx   map[c_type.Uint256]*c_type.Uint256\n\n\tDirty_G2ins  map[c_type.Uint256]bool\n\tDirty_G2outs map[c_type.Uint256]bool\n}\n\nfunc NewData(num uint64) (ret *Data) {\n\tret = &Data{}\n\tret.Num = num\n\treturn\n}\n\nfunc (state *Data) clear_dirty() {\n\tstate.Dirty_G2ins = make(map[c_type.Uint256]bool)\n\tstate.Dirty_G2outs = make(map[c_type.Uint256]bool)\n}\n\nfunc (state *Data) Clear() {\n\tstate.Cur = NewCur()\n\tstate.G2outs = make(map[c_type.Uint256]*localdb.OutState)\n\tstate.H2tx = make(map[c_type.Uint256]*c_type.Uint256)\n\tstate.Block = StateBlock{}\n\tstate.clear_dirty()\n}\n\nfunc (self *Data) appendDel(del *c_type.Uint256) {\n\tif del == nil {\n\t\tpanic(\"set_last_out but del is nil\")\n\t}\n\tself.Block.Dels = append(self.Block.Dels, *del)\n}\n\nfunc (self *Data) appendRoot(root *c_type.Uint256) {\n\tif root == nil {\n\t\tpanic(\"set_last_out but root is nil\")\n\t}\n\t//self.Cur.Index = self.Cur.Index + int64(1)\n\t//self.Cur.Index =\n\tself.Block.Roots = append(self.Block.Roots, *root)\n}\n\nfunc (self *Data) addInByNilOrRoot(in *c_type.Uint256) {\n\tself.Dirty_G2ins[*in] = true\n}\n\nfunc (self *Data) addOutByRoot(k *c_type.Uint256, out *localdb.OutState) {\n\tself.G2outs[*k] = out\n\tself.Dirty_G2outs[*k] = true\n}\n\nfunc (self *Data) AddTxOut(pkr *c_type.PKr) int {\n\treturn 0\n}\n\nfunc (self *Data) AddOut(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256) {\n\tself.Cur.Index = int64(out.Index)\n\tself.addOutByRoot(root, out)\n\tself.appendRoot(root)\n\tif txhash != nil {\n\t\tth := *txhash\n\t\tself.H2tx[*root] = &th\n\t} else {\n\t\tself.H2tx[*root] = nil\n\t}\n\tif self.Cur.Index != int64(out.Index) {\n\t\tpanic(\"add out but cur.index != current_index\")\n\t}\n\tif self.Cur.Index < 0 {\n\t\tpanic(\"add out but cur.index < 0\")\n\t}\n\treturn\n}\n\nfunc (self *Data) AddNil(in *c_type.Uint256) {\n\tself.addInByNilOrRoot(in)\n\tself.appendDel(in)\n}\n\nfunc (self *Data) AddDel(in *c_type.Uint256) {\n\tself.appendDel(in)\n}\n\nfunc (self *Data) GetRoots() (roots []c_type.Uint256) {\n\treturn self.Block.Roots\n}\n\nfunc (self *Data) GetDels() (dels []c_type.Uint256) {\n\treturn self.Block.Dels\n}\n\nfunc (self *Data) GetIndex() (index int64) {\n\treturn self.Cur.Index\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/data/data_state.go",
    "content": "package data\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/serodb\"\n\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nconst LAST_OUTSTATE0_NAME = tri.KEY_NAME(\"ZState0_Cur\")\nconst BLOCK_NAME = \"ZState0_BLOCK\"\nconst ZSTATE0_INNAME = \"ZState0_InName\"\nconst ZSTATE0_OUTNAME = \"ZState0_OutName\"\n\nfunc Name2BKey(name string, num uint64) (ret []byte) {\n\tkey := fmt.Sprintf(\"%s_%d\", name, num)\n\tret = []byte(key)\n\treturn\n}\nfunc InName(k *c_type.Uint256) (ret []byte) {\n\tret = []byte(ZSTATE0_INNAME)\n\tret = append(ret, k[:]...)\n\treturn\n}\nfunc OutName0(k *c_type.Uint256) (ret []byte) {\n\tret = []byte(ZSTATE0_OUTNAME)\n\tret = append(ret, k[:]...)\n\treturn\n}\n\nfunc (self *Data) RecordState(putter serodb.Putter, root *c_type.Uint256) {\n\tif int64(self.Num) > int64(seroparam.SIP2())-13000 {\n\t\tif out, ok := self.G2outs[*root]; ok {\n\t\t\trs := localdb.RootState{}\n\t\t\trs.Num = self.Num\n\t\t\trs.OS = *out\n\t\t\tif txhash, ok := self.H2tx[*root]; ok {\n\t\t\t\tif txhash != nil {\n\t\t\t\t\trs.TxHash = *txhash\n\t\t\t\t}\n\t\t\t\tlocaldb.PutRoot(putter, root, &rs)\n\t\t\t} else {\n\t\t\t\tpanic(fmt.Errorf(\"data record state h2tx error for : %v\", self.Num))\n\t\t\t}\n\t\t} else {\n\t\t\tpanic(fmt.Errorf(\"data record state G2outs error for : %v\", self.Num))\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *Data) LoadState(tr tri.Tri) {\n\tif self.Num >= 0 {\n\t\tget := CurrentGet{}\n\t\ttri.GetObj(\n\t\t\ttr,\n\t\t\tLAST_OUTSTATE0_NAME.Bytes(),\n\t\t\t&get,\n\t\t)\n\t\tself.Cur = get.Out\n\n\t\tblockget := State0BlockGet{}\n\t\ttri.GetObj(\n\t\t\ttr,\n\t\t\tName2BKey(BLOCK_NAME, uint64(self.Num)),\n\t\t\t&blockget,\n\t\t)\n\t\tself.Block = blockget.Out\n\t}\n\treturn\n}\n\nfunc (self *Data) SaveState(tr tri.Tri) {\n\ttri.UpdateObj(tr, LAST_OUTSTATE0_NAME.Bytes(), &self.Cur)\n\ttri.UpdateObj(\n\t\ttr,\n\t\tName2BKey(BLOCK_NAME, self.Num),\n\t\t&self.Block,\n\t)\n\tg2ins_dirty := utils.Uint256s{}\n\tfor k := range self.Dirty_G2ins {\n\t\tg2ins_dirty = append(g2ins_dirty, k)\n\t}\n\tsort.Sort(g2ins_dirty)\n\n\tfor _, k := range g2ins_dirty {\n\t\tv := []byte{1}\n\t\tif err := tr.TryUpdate(InName(&k), v); err != nil {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t}\n\t}\n\n\tg2outs_dirty := utils.Uint256s{}\n\tfor k := range self.Dirty_G2outs {\n\t\tg2outs_dirty = append(g2outs_dirty, k)\n\t}\n\tsort.Sort(g2outs_dirty)\n\n\tfor _, k := range g2outs_dirty {\n\t\tif v := self.G2outs[k]; v != nil {\n\t\t\ttri.UpdateObj(tr, OutName0(&k), v)\n\t\t} else {\n\t\t\tpanic(\"state0 update g2outs can not find dirty out\")\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *Data) HasIn(tr tri.Tri, hash *c_type.Uint256) (exists bool) {\n\tif v, err := tr.TryGet(InName(hash)); err != nil {\n\t\tpanic(err)\n\t\treturn\n\t} else {\n\t\tif v != nil && v[0] == 1 {\n\t\t\texists = true\n\t\t} else {\n\t\t\texists = false\n\t\t}\n\t}\n\treturn\n}\nfunc (self *Data) HashRoot(tr tri.Tri, root *c_type.Uint256) bool {\n\tif out := self.GetOut(tr, root); out == nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (self *Data) GetOut(tr tri.Tri, root *c_type.Uint256) (src *localdb.OutState) {\n\tif out := self.G2outs[*root]; out != nil {\n\t\treturn out\n\t} else {\n\t\tget := localdb.OutState0Get{}\n\t\ttri.GetObj(tr, OutName0(root), &get)\n\t\tif get.Out != nil {\n\t\t\tself.G2outs[*root] = get.Out\n\t\t\treturn get.Out\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/data/iface.go",
    "content": "package data\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype Log interface {\n\tOp(state IData)\n}\n\ntype AddTxOutLog struct {\n\tPkr *c_type.PKr\n}\n\nfunc (log AddTxOutLog) Op(state IData) {\n\tstate.AddTxOut(log.Pkr)\n}\n\ntype AddOutLog struct {\n\tRoot   *c_type.Uint256\n\tOut    *localdb.OutState\n\tTxhash *c_type.Uint256\n}\n\nfunc (log AddOutLog) Op(state IData) {\n\tstate.AddOut(log.Root, log.Out, log.Txhash)\n}\n\ntype AddNilLog struct {\n\tIn *c_type.Uint256\n}\n\nfunc (log AddNilLog) Op(state IData) {\n\tstate.AddNil(log.In)\n}\n\ntype AddDelLog struct {\n\tIn *c_type.Uint256\n}\n\nfunc (log AddDelLog) Op(state IData) {\n\tstate.AddDel(log.In)\n}\n\ntype Revision struct {\n\tId           int\n\tJournalIndex int\n}\n\ntype IData interface {\n\tClear()\n\n\tAddTxOut(pkr *c_type.PKr) int\n\tAddOut(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256)\n\tAddNil(in *c_type.Uint256)\n\tAddDel(in *c_type.Uint256)\n\n\tLoadState(tr tri.Tri)\n\tSaveState(tr tri.Tri)\n\tRecordState(putter serodb.Putter, root *c_type.Uint256)\n\n\tHasIn(tr tri.Tri, hash *c_type.Uint256) (exists bool)\n\tGetOut(tr tri.Tri, root *c_type.Uint256) (src *localdb.OutState)\n\n\tHashRoot(tr tri.Tri, root *c_type.Uint256) bool\n\n\tGetRoots() (roots []c_type.Uint256)\n\tGetDels() (dels []c_type.Uint256)\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/data/meta.go",
    "content": "package data\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype Current struct {\n\tIndex int64\n}\n\nfunc NewCur() (ret Current) {\n\tret.Index = -1\n\treturn\n}\n\nfunc (self *Current) Serial() (ret []byte, e error) {\n\tif self != nil {\n\t\treturn rlp.EncodeToBytes(self)\n\t} else {\n\t\treturn\n\t}\n}\n\ntype CurrentGet struct {\n\tOut Current\n}\n\nfunc (self *CurrentGet) Unserial(v []byte) (e error) {\n\tif len(v) == 0 {\n\t\tself.Out = NewCur()\n\t\treturn\n\t} else {\n\t\tif err := rlp.DecodeBytes(v, &self.Out); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n\ntype StateBlock struct {\n\tRoots []c_type.Uint256\n\tDels  []c_type.Uint256\n}\n\nfunc (self *StateBlock) Serial() (ret []byte, e error) {\n\tif self != nil {\n\t\tif bytes, err := rlp.EncodeToBytes(self); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tret = bytes\n\t\t\treturn\n\t\t}\n\t} else {\n\t\treturn\n\t}\n}\n\ntype State0BlockGet struct {\n\tOut StateBlock\n}\n\nfunc (self *State0BlockGet) Unserial(v []byte) (e error) {\n\tif len(v) == 0 {\n\t\treturn\n\t} else {\n\t\tif err := rlp.DecodeBytes(v, &self.Out); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/data_v1/data.go",
    "content": "package data_v1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nconst ZSTATE0_ROOT_OUT = \"$ZState0$ROOT-OUT$\"\n\ntype Data struct {\n\tNum uint64\n\n\tRoot2Out map[c_type.Uint256]localdb.RootState\n\n\tDels  utils.Dirtys\n\tNils  utils.HSet\n\tRoots utils.HSet\n\n\tPKr2Count map[c_type.PKr]int\n}\n\nfunc NewData(num uint64) (ret *Data) {\n\tret = &Data{}\n\tret.Num = num\n\tret.Nils = utils.NewHSet(data.ZSTATE0_INNAME)\n\tret.Roots = utils.NewHSet(ZSTATE0_ROOT_OUT)\n\treturn\n}\n\nfunc (state *Data) Clear() {\n\tstate.Root2Out = make(map[c_type.Uint256]localdb.RootState)\n\tstate.PKr2Count = make(map[c_type.PKr]int)\n\tstate.Dels.Clear()\n\tstate.Nils.Clear()\n\tstate.Roots.Clear()\n}\n\nfunc (self *Data) AddTxOut(pkr *c_type.PKr) int {\n\tif count, ok := self.PKr2Count[*pkr]; !ok {\n\t\tself.PKr2Count[*pkr] = 1\n\t\treturn 1\n\t} else {\n\t\tcount++\n\t\tself.PKr2Count[*pkr] = count\n\t\treturn count\n\t}\n}\n\nfunc (self *Data) AddOut(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256) {\n\tself.Roots.Append(root)\n\trs := localdb.RootState{}\n\trs.Num = self.Num\n\trs.OS = *out\n\tif txhash != nil {\n\t\trs.TxHash = *txhash\n\t}\n\tself.Root2Out[*root] = rs\n\treturn\n}\n\nfunc (self *Data) AddNil(in *c_type.Uint256) {\n\tself.Nils.Append(in)\n\tself.Dels.Append(in)\n}\n\nfunc (self *Data) AddDel(in *c_type.Uint256) {\n\tself.Dels.Append(in)\n}\n\nfunc (self *Data) GetRoots() (roots []c_type.Uint256) {\n\treturn self.Roots.List()\n}\n\nfunc (self *Data) GetDels() (dels []c_type.Uint256) {\n\treturn self.Dels.List()\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/data_v1/data_state.go",
    "content": "package data_v1\n\nimport (\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data\"\n)\n\nfunc (self *Data) RecordState(putter serodb.Putter, root *c_type.Uint256) {\n\tif out, ok := self.Root2Out[*root]; ok {\n\t\tlocaldb.PutRoot(putter, root, &out)\n\t} else {\n\t\tpanic(errors.New(\"data_v1.recordstate can not find root\"))\n\t}\n\treturn\n}\n\nfunc (self *Data) LoadState(tr tri.Tri) {\n\treturn\n}\n\nfunc (self *Data) SaveState(tr tri.Tri) {\n\tself.Nils.Save(tr)\n\tself.Roots.Save(tr)\n\tself.PKr2Count = make(map[c_type.PKr]int)\n\treturn\n}\n\nfunc (self *Data) HasIn(tr tri.Tri, hash *c_type.Uint256) (exists bool) {\n\treturn self.Nils.Has(tr, hash)\n}\n\nfunc (self *Data) HashRoot(tr tri.Tri, root *c_type.Uint256) bool {\n\treturn self.Roots.Has(tr, root)\n}\n\nfunc (self *Data) GetOut(tr tri.Tri, root *c_type.Uint256) (src *localdb.OutState) {\n\tif self.Roots.Has(tr, root) {\n\t\tvar rt *localdb.RootState\n\t\tif r, ok := self.Root2Out[*root]; !ok {\n\t\t\trt = localdb.GetRoot(tr.GlobalGetter(), root)\n\t\t\tself.Root2Out[*root] = *rt\n\t\t} else {\n\t\t\trt = &r\n\t\t}\n\t\tif rt != nil {\n\t\t\tsrc = &rt.OS\n\t\t}\n\t}\n\tif src == nil {\n\t\td := data.NewData(self.Num)\n\t\td.Clear()\n\t\tsrc = d.GetOut(tr, root)\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/debug.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage txstate\n\nimport (\n\t\"runtime\"\n\t\"runtime/debug\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\nfunc Need_debug() bool {\n\treturn false\n\tif false {\n\t\treturn true\n\t} else {\n\t\treturn seroparam.Is_Dev()\n\t}\n}\n\nfunc Debug_Weak_panic(msg string, ctx ...interface{}) {\n\tif Need_debug() {\n\t\tlog.Debug(\">========debug_painc:=======>\"+msg, ctx...)\n\t\tdebug.PrintStack()\n\t\truntime.Breakpoint()\n\t}\n}\n"
  },
  {
    "path": "zero/txs/zstate/txstate/merkle.go",
    "content": "package txstate\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/crypto\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/merkle\"\n)\n\nvar CzeroAddress = c_type.NewPKrByBytes(crypto.Keccak512(nil))\nvar CzeroMerkleParam = merkle.NewParam(&CzeroAddress, c_superzk.Czero_combine)\n\nvar SzkAddress = c_type.NewPKrByBytes(crypto.Keccak256([]byte(\"$SuperZK$MerkleTree\")))\nvar SzkMerkleParam = merkle.NewParam(&SzkAddress, c_superzk.Combine)\n"
  },
  {
    "path": "zero/txs/zstate/txstate/state.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage txstate\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/merkle\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/serodb\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data_v1\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/txstate/data\"\n\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype State struct {\n\ttri       tri.Tri\n\trw        *sync.RWMutex\n\tnum       uint64\n\tCzeroTree merkle.MerkleTree\n\tSzkTree   merkle.MerkleTree\n\n\tdata data.IData\n\n\tlogs      []data.Log\n\trevisions []data.Revision\n}\n\nfunc (self *State) Num() uint64 {\n\treturn self.num\n}\n\nfunc (self *State) Tri() tri.Tri {\n\treturn self.tri\n}\n\nfunc NewState(tri tri.Tri, num uint64) (state State) {\n\tstate = State{tri: tri, num: num}\n\tstate.rw = new(sync.RWMutex)\n\tstate.CzeroTree = CzeroMerkleParam.NewMerkleTree(tri)\n\tstate.SzkTree = SzkMerkleParam.NewMerkleTree(tri)\n\tif state.num >= seroparam.SIP2() {\n\t\tstate.data = data_v1.NewData(num)\n\t} else {\n\t\tstate.data = data.NewData(num)\n\t}\n\tstate.data.Clear()\n\tstate.load()\n\treturn\n}\n\nfunc (self *State) RecordState(putter serodb.Putter, root *c_type.Uint256) {\n\tself.data.RecordState(putter, root)\n}\n\nfunc (self *State) load() {\n\tself.data.LoadState(self.tri)\n}\n\nfunc (self *State) Update() {\n\tself.rw.Lock()\n\tdefer self.rw.Unlock()\n\tself.data.SaveState(self.tri)\n\treturn\n}\n\nfunc (state *State) Snapshot(revid int) {\n\tstate.revisions = append(state.revisions, data.Revision{revid, len(state.logs)})\n}\n\nfunc (state *State) Revert(revid int) {\n\n\tidx := sort.Search(len(state.revisions), func(i int) bool {\n\t\treturn state.revisions[i].Id >= revid\n\t})\n\tif idx == len(state.revisions) || state.revisions[idx].Id != revid {\n\t\tpanic(fmt.Errorf(\"revision id %v cannot be reverted\", revid))\n\t}\n\n\tindex := state.revisions[idx].JournalIndex\n\n\tstate.revisions = state.revisions[:idx]\n\tstate.logs = state.logs[:index]\n\n\tstate.data.Clear()\n\tfor _, log := range state.logs {\n\t\tlog.Op(state.data)\n\t}\n}\n\nfunc (self *State) addOut_Log(root *c_type.Uint256, out *localdb.OutState, txhash *c_type.Uint256) {\n\tclone := out.Clone()\n\tif txhash != nil {\n\t\tself.logs = append(self.logs, data.AddOutLog{root.NewRef(), &clone, txhash.NewRef()})\n\t} else {\n\t\tself.logs = append(self.logs, data.AddOutLog{root.NewRef(), &clone, nil})\n\t}\n\n\tself.data.AddOut(root, out, txhash)\n\treturn\n}\nfunc (self *State) addNil_Log(in *c_type.Uint256) {\n\tself.logs = append(self.logs, data.AddNilLog{in.NewRef()})\n\tself.data.AddNil(in)\n}\nfunc (self *State) addDel_Log(in *c_type.Uint256) {\n\tself.logs = append(self.logs, data.AddDelLog{in.NewRef()})\n\tself.data.AddDel(in)\n}\n\nfunc (self *State) AddTxOut_Log(pkr *c_type.PKr) int {\n\tself.logs = append(self.logs, data.AddTxOutLog{pkr.NewRef()})\n\treturn self.data.AddTxOut(pkr)\n}\n\nfunc (state *State) AddOut_O(out_o *stx_v0.Out_O, txhash *c_type.Uint256) (root c_type.Uint256) {\n\tstate.rw.Lock()\n\tdefer state.rw.Unlock()\n\treturn state.addOut_O(out_o, txhash)\n}\n\nfunc (state *State) AddOut_P(out_p *stx_v1.Out_P, txhash *c_type.Uint256) (root c_type.Uint256) {\n\tstate.rw.Lock()\n\tdefer state.rw.Unlock()\n\treturn state.addOut_P(out_p, txhash)\n}\n\nfunc (state *State) insertOS(os *localdb.OutState, txhash *c_type.Uint256) (root c_type.Uint256) {\n\tif os.Out_O != nil || os.Out_Z != nil {\n\t\tos.Index = state.CzeroTree.GetLeafSize()\n\t\tos.GenRootCM()\n\t\troot = state.CzeroTree.AppendLeaf(*os.RootCM)\n\t\tstate.addOut_Log(&root, os, txhash)\n\t} else {\n\t\tos.Index = state.SzkTree.GetLeafSize()\n\t\tos.GenRootCM()\n\t\troot = state.SzkTree.AppendLeaf(*os.RootCM)\n\t\tstate.addOut_Log(&root, os, txhash)\n\t}\n\treturn\n}\n\nfunc (state *State) addOut_O(out_o *stx_v0.Out_O, txhash *c_type.Uint256) (root c_type.Uint256) {\n\tos := localdb.OutState{}\n\tif out_o != nil {\n\t\to := *out_o\n\t\tos.Out_O = &o\n\t}\n\treturn state.insertOS(&os, txhash)\n}\n\nfunc (state *State) addOut_Z(out_z *stx_v0.Out_Z, txhash *c_type.Uint256) (root c_type.Uint256) {\n\tos := localdb.OutState{}\n\tif out_z != nil {\n\t\to := out_z.Clone()\n\t\tos.Out_Z = &o\n\t}\n\treturn state.insertOS(&os, txhash)\n}\n\nfunc (state *State) addOut_C(out_c *stx_v1.Out_C, txhash *c_type.Uint256) (root c_type.Uint256) {\n\tos := localdb.OutState{}\n\tif out_c != nil {\n\t\to := out_c.Clone()\n\t\tos.Out_C = &o\n\t}\n\treturn state.insertOS(&os, txhash)\n}\n\nfunc (state *State) addOut_P(out_p *stx_v1.Out_P, txhash *c_type.Uint256) (root c_type.Uint256) {\n\tos := localdb.OutState{}\n\tif out_p != nil {\n\t\to := out_p.Clone()\n\t\tos.Out_P = &o\n\t}\n\treturn state.insertOS(&os, txhash)\n}\n\nfunc (self *State) HasIn(hash *c_type.Uint256) (exists bool) {\n\tself.rw.Lock()\n\tdefer self.rw.Unlock()\n\treturn self.data.HasIn(self.tri, hash)\n}\n\nfunc (state *State) addTx0(tx *stx_v0.Tx, txhash *c_type.Uint256) (e error) {\n\tt := utils.TR_enter(\"AddStx---ins\")\n\tfor _, in := range tx.Desc_O.Ins {\n\t\tif state.num >= seroparam.SIP2() {\n\t\t\tif state.data.HasIn(state.tri, &in.Nil) {\n\t\t\t\te = errors.New(\"desc_o.in.nil already be used !\")\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tstate.addNil_Log(&in.Nil)\n\t\t\t\tstate.addDel_Log(&in.Root)\n\t\t\t}\n\t\t} else {\n\t\t\tif state.data.HasIn(state.tri, &in.Root) {\n\t\t\t\te = errors.New(\"desc_o.in.root already be used !\")\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tstate.addNil_Log(&in.Root)\n\t\t\t}\n\t\t}\n\t}\n\n\tt.Renter(\"AddStx---z_ins\")\n\tfor _, in := range tx.Desc_Z.Ins {\n\t\tif state.data.HasIn(state.tri, &in.Nil) {\n\t\t\te = errors.New(\"desc_o.nil already be used !\")\n\t\t\treturn\n\t\t} else {\n\t\t\tstate.addNil_Log(&in.Nil)\n\t\t\tstate.addDel_Log(&in.Trace)\n\t\t}\n\t}\n\n\tt.Renter(\"AddStx---z_outs\")\n\tfor _, out := range tx.Desc_Z.Outs {\n\t\tstate.addOut_Z(&out, txhash)\n\t}\n\n\tt.Leave()\n\treturn\n}\n\nfunc (state *State) addTx1(tx *stx_v1.Tx, txhash *c_type.Uint256) (e error) {\n\tfor _, in := range tx.Ins_P0 {\n\t\tif !state.data.HasIn(state.tri, &in.Nil) {\n\t\t\tif !state.data.HasIn(state.tri, &in.Root) {\n\t\t\t\tstate.addNil_Log(&in.Nil)\n\t\t\t\tstate.addNil_Log(&in.Root)\n\t\t\t\tstate.addDel_Log(&in.Trace)\n\t\t\t} else {\n\t\t\t\te = errors.New(\"tx1.in_p0.root already be used !\")\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\te = errors.New(\"tx1.in_p0.nil already be used !\")\n\t\t\treturn\n\t\t}\n\t}\n\tfor _, in := range tx.Ins_P {\n\t\tif !state.data.HasIn(state.tri, &in.Nil) {\n\t\t\tif !state.data.HasIn(state.tri, &in.Root) {\n\t\t\t\tstate.addNil_Log(&in.Nil)\n\t\t\t\tstate.addNil_Log(&in.Root)\n\t\t\t} else {\n\t\t\t\te = errors.New(\"tx1.in_p.root already be used !\")\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\te = errors.New(\"tx1.in_p.nil already be used !\")\n\t\t\treturn\n\t\t}\n\t}\n\tfor _, in := range tx.Ins_C {\n\t\tif !state.data.HasIn(state.tri, &in.Nil) {\n\t\t\tstate.addNil_Log(&in.Nil)\n\t\t} else {\n\t\t\te = errors.New(\"tx1.in_c.nil already be used !\")\n\t\t\treturn\n\t\t}\n\t}\n\tfor _, out := range tx.Outs_C {\n\t\tstate.addOut_C(&out, txhash)\n\t}\n\tfor _, out := range tx.Outs_P {\n\t\tif c_superzk.IsSzkPKr(&out.PKr) {\n\t\t\tstate.addOut_P(&out, txhash)\n\t\t} else {\n\t\t\tstate.addOut_O(\n\t\t\t\t&stx_v0.Out_O{\n\t\t\t\t\tAddr:  out.PKr,\n\t\t\t\t\tAsset: out.Asset,\n\t\t\t\t\tMemo:  out.Memo,\n\t\t\t\t},\n\t\t\t\ttxhash,\n\t\t\t)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (state *State) AddStx(st *stx.T) (e error) {\n\tstate.rw.Lock()\n\tdefer state.rw.Unlock()\n\ttxhash := st.ToHash()\n\tif st.Tx0() != nil && st.Tx1.Count() > 0 {\n\t\treturn fmt.Errorf(\"add stx, tx0 & tx1 only one can has value \")\n\t}\n\n\tif st.Tx0() != nil {\n\t\treturn state.addTx0(st.Tx0(), &txhash)\n\t}\n\n\tif st.Tx1.Count() > 0 {\n\t\treturn state.addTx1(&st.Tx1, &txhash)\n\t}\n\n\treturn\n}\n\nfunc (state *State) GetOut(root *c_type.Uint256) (src *localdb.OutState) {\n\tstate.rw.Lock()\n\tdefer state.rw.Unlock()\n\treturn state.data.GetOut(state.tri, root)\n}\n\nfunc (state *State) FindAnchorInSzk(root *c_type.Uint256) bool {\n\tstate.rw.Lock()\n\tdefer state.rw.Unlock()\n\treturn state.data.HashRoot(state.tri, root)\n}\n\nfunc (self *State) GetBlockRoots() (roots []c_type.Uint256) {\n\treturn self.data.GetRoots()\n}\n\nfunc (self *State) GetBlockDels() (dels []c_type.Uint256) {\n\treturn self.data.GetDels()\n}\n\ntype Chain interface {\n\tGetBlock(hash common.Hash, number uint64) *types.Block\n}\n\nfunc AnalyzeNils(header *types.Header, ch Chain) {\n\thash := header.ParentHash\n\tnumber := header.Number.Uint64() - 1\n\tm := make(map[c_type.Uint256]int)\n\tfor {\n\t\tb := ch.GetBlock(hash, number)\n\t\tfor _, tx := range b.Transactions() {\n\t\t\tif tx.Stxt().Tx0() != nil {\n\t\t\t\tfor _, in := range tx.Stxt().Tx0().Desc_O.Ins {\n\t\t\t\t\tif v, ok := m[in.Root]; ok {\n\t\t\t\t\t\tfmt.Printf(\"num=%v,block=%v,tx=%v,current=%v,hit=%v\\n\", number, hexutil.Encode(hash[:]), hexutil.Encode(in.ToHash().NewRef()[:]), 1, v)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tm[in.Root] = 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor _, in := range tx.Stxt().Tx0().Desc_O.Ins {\n\t\t\t\t\tif v, ok := m[in.Nil]; ok {\n\t\t\t\t\t\tfmt.Printf(\"num=%v,block=%v,tx=%v,current=%v,hit=%v\\n\", number, hexutil.Encode(hash[:]), hexutil.Encode(in.ToHash().NewRef()[:]), 2, v)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tm[in.Nil] = 2\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor _, in := range tx.Stxt().Tx0().Desc_Z.Ins {\n\t\t\t\t\tif v, ok := m[in.Nil]; ok {\n\t\t\t\t\t\tfmt.Printf(\"num=%v,block=%v,tx=%v,current=%v,hit=%v\\n\", number, hexutil.Encode(hash[:]), hexutil.Encode(in.ToHash().NewRef()[:]), 3, v)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tm[in.Nil] = 3\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif number == 0 {\n\t\t\tbreak\n\t\t}\n\t\thash = b.ParentHash()\n\t\tnumber = number - 1\n\t}\n}\n\nfunc (self *State) PreGenerateRoot(header *types.Header, ch Chain) {\n\tif header.Number.Uint64() == (seroparam.SIP2()) {\n\t\thash := header.ParentHash\n\t\tnumber := header.Number.Uint64() - 1\n\t\tsize := number\n\t\tprogress := utils.NewProgress(\"PRE GEN ROOTS: \", size)\n\t\tcount := 0\n\t\tfor {\n\t\t\tb := ch.GetBlock(hash, number)\n\t\t\tfor _, tx := range b.Transactions() {\n\t\t\t\tif tx.Stxt().Tx0() != nil {\n\t\t\t\t\tfor _, in := range tx.Stxt().Tx0().Desc_O.Ins {\n\t\t\t\t\t\tself.addNil_Log(&in.Nil)\n\t\t\t\t\t\tcount++\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tprogress.Tick(size-number, \"count\", count)\n\t\t\tif number == 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\thash = b.ParentHash()\n\t\t\tnumber = number - 1\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txs/zstate/zstate.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage zstate\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/pkgstate\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/txstate\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype ZState struct {\n\tTri   tri.Tri\n\tnum   uint64\n\tState txstate.State\n\tPkgs  pkgstate.PkgState\n}\n\nfunc (self *ZState) Num() uint64 {\n\treturn self.num\n}\n\nfunc CurrentState(tri0 tri.Tri, num uint64) (state *ZState) {\n\tstate = &ZState{}\n\tstate.Tri = tri0\n\tstate.num = num\n\tstate.State = txstate.NewState(tri0, num)\n\tstate.Pkgs = pkgstate.NewPkgState(tri0, num)\n\treturn\n}\n\nfunc NextState(tri0 tri.Tri, num int64) (state *ZState) {\n\treturn CurrentState(tri0, uint64(num+1))\n}\n\nfunc (self *ZState) Copy() *ZState {\n\treturn self\n}\n\nfunc (self *ZState) Update() {\n\tself.State.Update()\n\tself.Pkgs.Update()\n\treturn\n}\n\nfunc (self *ZState) PreGenerateRoot(header *types.Header, ch txstate.Chain) {\n\tself.State.PreGenerateRoot(header, ch)\n}\n\nfunc (self *ZState) RecordBlock(db serodb.Putter, hash *c_type.Uint256) {\n\tblock := localdb.Block{}\n\tblock.Roots = self.State.GetBlockRoots()\n\tblock.Dels = self.State.GetBlockDels()\n\tblock.Pkgs = self.Pkgs.GetPkgHashes()\n\tlocaldb.PutBlock(db, self.num, hash, &block)\n\n\tfor _, hash := range block.Pkgs {\n\t\tself.Pkgs.RecordState(db, &hash)\n\t}\n\n\tfor _, k := range block.Roots {\n\t\tself.State.RecordState(db, &k)\n\t}\n}\n\nfunc (self *ZState) Snapshot(revid int) {\n\tt := utils.TR_enter(\"Snapshot\")\n\tself.State.Snapshot(revid)\n\tself.Pkgs.Snapshot(revid)\n\tt.Leave()\n}\n\nfunc (self *ZState) Revert(revid int) {\n\tself.State.Revert(revid)\n\tself.Pkgs.Revert(revid)\n\treturn\n}\n\nfunc (state *ZState) addOut_O(out *stx_v0.Out_O, txhash common.Hash) {\n\tstate.State.AddOut_O(out.Clone().ToRef(), txhash.HashToUint256())\n}\n\nfunc (state *ZState) addOut_P(out *stx_v1.Out_P, txhash common.Hash) {\n\tstate.State.AddOut_P(out.Clone().ToRef(), txhash.HashToUint256())\n}\n\nfunc (state *ZState) AddStx(st *stx.T) (e error) {\n\tif err := state.State.AddStx(st); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\thash_for_s := st.ToHash_for_sign()\n\t\tif st.Desc_Pkg.Create != nil {\n\t\t\tif e = state.Pkgs.Force_add(&st.From, st.Desc_Pkg.Create); e != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif st.Desc_Pkg.Close != nil {\n\t\t\tif e = state.Pkgs.Force_del(&hash_for_s, st.Desc_Pkg.Close); e != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif st.Desc_Pkg.Transfer != nil {\n\t\t\tif e = state.Pkgs.Force_transfer(&hash_for_s, st.Desc_Pkg.Transfer); e != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (state *ZState) AddTxOutWithCheck(addr common.Address, asset assets.Asset, txhash common.Hash) (alarm bool) {\n\talarm = false\n\tif state.Num() >= seroparam.VP0() {\n\t\tcount := state.State.AddTxOut_Log(addr.ToPKr())\n\t\tif count > seroparam.MAX_CONTRACT_OUT_COUNT_LENGTH {\n\t\t\tlog.Error(\"[ALARM] ZState AddTxOut Overflow\", \"MAX_CONTRACT_OUT_COUNT_LENGTH\", seroparam.MAX_CONTRACT_OUT_COUNT_LENGTH, \"txHash\", txhash.Hex())\n\t\t\talarm = true\n\t\t}\n\t}\n\n\tstate.AddTxOut(addr, asset, txhash)\n\n\treturn\n}\n\nfunc (state *ZState) AddTxOut(addr common.Address, asset assets.Asset, txhash common.Hash) {\n\tt := utils.TR_enter(\"AddTxOut-----\")\n\tneed_add := false\n\tif asset.Tkn != nil {\n\t\tif asset.Tkn.Currency != c_type.Empty_Uint256 {\n\t\t\tif asset.Tkn.Value.ToUint256() != c_type.Empty_Uint256 {\n\t\t\t\tneed_add = true\n\t\t\t}\n\t\t}\n\t}\n\tif asset.Tkt != nil {\n\t\tif asset.Tkt.Category != c_type.Empty_Uint256 {\n\t\t\tif asset.Tkt.Value != c_type.Empty_Uint256 {\n\t\t\t\tneed_add = true\n\t\t\t}\n\t\t}\n\t}\n\tif need_add {\n\t\tpkr := addr.ToPKr()\n\t\tif state.Num() >= seroparam.SIP5() {\n\t\t\tif c_superzk.IsSzkPKr(pkr) {\n\t\t\t\to := stx_v1.Out_P{PKr: *addr.ToPKr(), Asset: asset, Memo: c_type.Uint512{}}\n\t\t\t\tstate.addOut_P(&o, txhash)\n\t\t\t} else {\n\t\t\t\to := stx_v0.Out_O{Addr: *addr.ToPKr(), Asset: asset, Memo: c_type.Uint512{}}\n\t\t\t\tstate.addOut_O(&o, txhash)\n\t\t\t}\n\t\t} else {\n\t\t\to := stx_v0.Out_O{Addr: *addr.ToPKr(), Asset: asset, Memo: c_type.Uint512{}}\n\t\t\tstate.addOut_O(&o, txhash)\n\t\t}\n\t}\n\tt.Leave()\n\n\treturn\n}\n"
  },
  {
    "path": "zero/txtool/flight/sli.go",
    "content": "package flight\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/generate/generate_1\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n)\n\nfunc GenTx(param *txtool.GTxParam) (gtx txtool.GTx, e error) {\n\tvar need_szk = true\n\n\tif (txtool.Ref_inst.Bc != nil) && (!seroparam.Is_Offline()) {\n\t\tif txtool.Ref_inst.Bc.GetCurrenHeader().Number.Uint64()+1 < seroparam.SIP5() {\n\t\t\tneed_szk = false\n\t\t\tparam.Z = nil\n\t\t} else {\n\t\t\tparam.Z = &need_szk\n\t\t}\n\t} else {\n\t\tif param.Z == nil {\n\t\t\tneed_szk = false\n\t\t}\n\t}\n\n\tif need_szk {\n\t\tif tx, param, keys, bases, err := SignTx1(param); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tif gtx, e = ProveTx1(&tx, &param); e != nil {\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tgtx.Keys = keys\n\t\t\t\tgtx.Bases = bases\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn SignTx0(param)\n\t}\n}\n\nfunc SignTx(sk *c_type.Uint512, paramTx *txtool.GTxParam) (tx txtool.GTx, e error) {\n\tcopy(paramTx.From.SKr[:], sk[:])\n\tfor i := range paramTx.Ins {\n\t\tcopy(paramTx.Ins[i].SKr[:], sk[:])\n\t}\n\treturn GenTx(paramTx)\n}\n\nfunc SignLight(sk *c_type.Uint512, paramTx *txtool.GTxParam) (tx stx.T, param txtool.GTxParam, keys []c_type.Uint256, bases []c_type.Uint256, e error) {\n\tcopy(paramTx.From.SKr[:], sk[:])\n\tfor i := range paramTx.Ins {\n\t\tcopy(paramTx.Ins[i].SKr[:], sk[:])\n\t}\n\treturn SignTx1(paramTx)\n}\n\nfunc DecOut(tk *c_type.Tk, outs []txtool.Out) (douts []txtool.TDOut) {\n\tfor _, out := range outs {\n\n\t\tdout := txtool.TDOut{}\n\n\t\tif out.State.OS.Out_O != nil {\n\n\t\t\tdout.Asset = out.State.OS.Out_O.Asset.Clone()\n\t\t\tdout.Memo = out.State.OS.Out_O.Memo\n\t\t\tif til, e := c_superzk.Czero_genTrace(tk, out.State.OS.RootCM); e == nil {\n\t\t\t\tdout.Nils = append(dout.Nils, til)\n\t\t\t\t// dout.Nils = append(dout.Nils, c_czero.GenNil(tk, out.State.OS.RootCM))\n\t\t\t\tdout.Nils = append(dout.Nils, out.Root)\n\t\t\t}\n\n\t\t} else if out.State.OS.Out_Z != nil {\n\n\t\t\tif key, flag, e := c_superzk.Czero_fetchKey(tk, &out.State.OS.Out_Z.RPK); e == nil {\n\t\t\t\tif confirm_out := generate_1.ConfirmOutZ(&key, flag, out.State.OS.Out_Z); confirm_out != nil {\n\t\t\t\t\tdout = *confirm_out\n\t\t\t\t\tif til, e := c_superzk.Czero_genTrace(tk, out.State.OS.RootCM); e == nil {\n\t\t\t\t\t\tdout.Nils = append(dout.Nils, til)\n\t\t\t\t\t\t// dout.Nils = append(dout.Nils, c_czero.GenNil(tk, out.State.OS.RootCM))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if out.State.OS.Out_P != nil {\n\n\t\t\tif nl, e := c_superzk.GenNil(tk, out.State.OS.RootCM.NewRef(), &out.State.OS.Out_P.PKr); e == nil {\n\t\t\t\tdout.Asset = out.State.OS.Out_P.Asset\n\t\t\t\tdout.Memo = out.State.OS.Out_P.Memo\n\t\t\t\tdout.Nils = append(dout.Nils, nl)\n\t\t\t}\n\n\t\t} else if out.State.OS.Out_C != nil {\n\n\t\t\tif key, _, e := c_superzk.FetchKey(&out.State.OS.Out_C.PKr, tk, &out.State.OS.Out_C.RPK); e == nil {\n\t\t\t\tif confirm_out, _ := generate_1.ConfirmOutC(&key, out.State.OS.Out_C); confirm_out != nil {\n\t\t\t\t\tif nl, e := c_superzk.GenNil(tk, out.State.OS.RootCM.NewRef(), &out.State.OS.Out_C.PKr); e == nil {\n\t\t\t\t\t\tdout = *confirm_out\n\t\t\t\t\t\tdout.Nils = append(dout.Nils, nl)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tpanic(errors.New(\"OutState has no Out_X\"))\n\n\t\t}\n\n\t\tdouts = append(douts, dout)\n\t}\n\treturn\n}\n\nfunc ConfirmOutZ(key *c_type.Uint256, z *stx_v0.Out_Z) (dout txtool.TDOut, e error) {\n\tif out := generate_1.ConfirmOutZ(key, true, z); out != nil {\n\t\tdout = *out\n\t\treturn\n\t} else {\n\t\te = errors.New(\"confirm outz error\")\n\t\treturn\n\t}\n}\n\nfunc ConfirmOutC(key *c_type.Uint256, c *stx_v1.Out_C) (dout txtool.TDOut, e error) {\n\tif out, _ := generate_1.ConfirmOutC(key, c); out != nil {\n\t\tdout = *out\n\t\treturn\n\t} else {\n\t\te = errors.New(\"confirm outz error\")\n\t\treturn\n\t}\n}\n\nfunc CurrencyToId(currency string) (ret c_type.Uint256) {\n\tbs := utils.CurrencyToBytes(currency)\n\tcopy(ret[:], bs[:])\n\treturn\n}\n\nfunc IdToCurrency(id *c_type.Uint256) (ret string) {\n\treturn utils.Uint256ToCurrency(id)\n}\n"
  },
  {
    "path": "zero/txtool/flight/sli_test.go",
    "content": "package flight\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nfunc TestDecOut(t *testing.T) {\n\touts_str := `[{\"Root\":\"0xf3ead30acaf8576362413db319f2abf543c5db555dc0f91f7dd7d0bae28c3425\",\"State\":{\"OS\":{\"index\":1983489,\"Out_O\":{\"Addr\":\"\",\"Asset\":{\"Tkn\":{\"Currency\":\"0x0000000000000000000000000000000000000000000000000000000000000000\",\"Value\":0}}},\"Out_Z\":{\"PKr\":\"0xeb4a555d1132357bbeb184132e163f9bd7cde4790231e802d783005f0b43b8a20e87f2e41c1e0221e3374c341331ec51c3acda0195da6c130a 166a3d0676b38fa5ea369d5cc177ff9d1d8d6e97ae117758de391e0426986370edbcecfe4f4322\"},\"Out_CM\":null,\"RootCM\":\"0x0d48e240051ac932 46aa7e46c024945a2493c02b19982d4bd9fddbf51ff1b611\"},\"TxHash\":\"0x75be54e70f74cd5c7ba799c73db80569634274e9f1f599411c8c62de79b6 3a09\",\"Num\":1538009}}]`\n\tvar outs []txtool.Out\n\touts = append(outs, txtool.Out{})\n\tbs, err := json.Marshal(outs)\n\tfmt.Println(string(bs))\n\terr = json.Unmarshal([]byte(outs_str), &outs)\n\tfmt.Println(err)\n}\n"
  },
  {
    "path": "zero/txtool/flight/sri.go",
    "content": "package flight\n\nimport (\n\t\"fmt\"\n\t\"math/big\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n)\n\ntype SRI struct {\n}\n\nvar SRI_Inst = SRI{}\n\nfunc Trace2Root(tk *c_type.Tk, trace *c_type.Uint256, base *c_type.Uint256) (root *c_type.Uint256) {\n\tif root_cm, e := superzk.FetchRootCM(tk, trace, base); e != nil {\n\t\treturn\n\t} else {\n\t\troot = localdb.GetRootByRootCM(txtool.Ref_inst.Bc.GetDB(), &root_cm)\n\t\treturn\n\t}\n}\n\nfunc GetOut(root *c_type.Uint256, num uint64) (out *localdb.RootState) {\n\trs := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), root)\n\tif rs != nil {\n\t\treturn rs\n\t} else {\n\t\tzst := txtool.Ref_inst.CurrentState()\n\t\tif os := zst.State.GetOut(root); os == nil {\n\t\t\treturn nil\n\t\t} else {\n\t\t\tout := localdb.RootState{\n\t\t\t\t*os,\n\t\t\t\tc_type.Uint256{},\n\t\t\t\tnum,\n\t\t\t}\n\t\t\treturn &out\n\t\t}\n\t}\n}\n\nfunc GetBlock(num uint64, hash *common.Hash) (ret *localdb.Block) {\n\tret = localdb.GetBlock(txtool.Ref_inst.Bc.GetDB(), num, hash.HashToUint256())\n\tif ret == nil {\n\t\ttemp_state := txtool.Ref_inst.Bc.CurrentState(hash)\n\t\tif temp_state == nil {\n\t\t\tpanic(fmt.Sprintf(\"new zstate error: %v:%v !\", num, hash))\n\t\t} else {\n\t\t\tlog.Debug(\"STATE1_PARSE GO BACK TO STATE: \", \"num\", num, \"hash\", hash)\n\t\t}\n\t\tret = &localdb.Block{}\n\t\tret.Pkgs = temp_state.Pkgs.GetPkgHashes()\n\t\tret.Roots = temp_state.State.GetBlockRoots()\n\t\tret.Dels = temp_state.State.GetBlockDels()\n\t}\n\treturn\n}\n\nfunc (self *SRI) GetBlocksInfoByDelay(start uint64, count uint64, delay uint64) (blocks []txtool.Block, e error) {\n\tstable_num := txtool.Ref_inst.GetDelayedNum(delay)\n\tif start <= stable_num {\n\t\tif stable_num-start+1 < count {\n\t\t\tcount = stable_num - start + 1\n\t\t}\n\t\tfor i := uint64(0); i < count; i++ {\n\t\t\tnum := start + i\n\t\t\t//log.Info(\"GetBlocksInfoByDelay \", \"num\", num)\n\t\t\tchain_block := txtool.Ref_inst.Bc.GetBlockByNumber(num)\n\t\t\thash := chain_block.Hash()\n\t\t\t//log.Info(\"GetBlocksInfoByDelay \", \"hash \", hash.String(), \"num\", num)\n\t\t\tlocal_block := GetBlock(num, &hash)\n\t\t\tif local_block != nil {\n\t\t\t\tblock := txtool.Block{}\n\t\t\t\tblock.Hash = *hash.HashToUint256()\n\t\t\t\tblock.Num = hexutil.Uint64(num)\n\t\t\t\tfor _, k := range local_block.Dels {\n\t\t\t\t\tblock.Nils = append(block.Nils, k)\n\t\t\t\t}\n\t\t\t\tfor _, k := range local_block.Roots {\n\t\t\t\t\tif out := GetOut(&k, num); out == nil {\n\t\t\t\t\t\tlog.Error(\"GetBlocksInfo ERROR\", \"num\", num, \"root\", k)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblock.Outs = append(block.Outs, txtool.Out{k, *out})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor _, k := range local_block.Pkgs {\n\t\t\t\t\tif pkg := localdb.GetPkg(txtool.Ref_inst.Bc.GetDB(), &k); pkg == nil {\n\t\t\t\t\t\tlog.Error(\"GetBlocksInfo ERROR\", \"num\", num, \"pkg\", k)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblock.Pkgs = append(block.Pkgs, *pkg)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tblocks = append(blocks, block)\n\t\t\t} else {\n\t\t\t\te = fmt.Errorf(\"GetBlocksInfo.GetBlock Failed, num: %v\", num)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\treturn\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *SRI) GetBlocksInfo(start uint64, count uint64) (blocks []txtool.Block, e error) {\n\treturn self.GetBlocksInfoByDelay(start, count, seroparam.DefaultConfirmedBlock())\n}\n\nfunc (self *SRI) GetAnchor(roots []c_type.Uint256) (wits []txtool.Witness, e error) {\n\tstate := txtool.Ref_inst.CurrentState()\n\tif state != nil {\n\t\tfor _, root := range roots {\n\t\t\twit := txtool.Witness{}\n\t\t\tif out := GetOut(&root, 0); out == nil {\n\t\t\t\te = errors.New(\"GetAnchor use root but out is nil !!!\")\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tif out.OS.IsSzk() {\n\t\t\t\t\tpos, paths, anchor := state.State.SzkTree.GetPaths(*out.OS.RootCM)\n\t\t\t\t\twit.Pos = hexutil.Uint64(pos)\n\t\t\t\t\twit.Paths = paths\n\t\t\t\t\twit.Anchor = anchor\n\t\t\t\t\twits = append(wits, wit)\n\t\t\t\t} else {\n\t\t\t\t\tpos, paths, anchor := state.State.CzeroTree.GetPaths(*out.OS.RootCM)\n\t\t\t\t\twit.Pos = hexutil.Uint64(pos)\n\t\t\t\t\twit.Paths = paths\n\t\t\t\t\twit.Anchor = anchor\n\t\t\t\t\twits = append(wits, wit)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn\n\t} else {\n\t\te = errors.New(\"State is nil\")\n\t\treturn\n\t}\n\treturn\n}\n\nfunc GenTxParam(param *PreTxParam, tk c_type.Tk) (p txtool.GTxParam, e error) {\n\tlog.Debug(\"genTx start\")\n\tp.Gas = param.Gas\n\tp.GasPrice = big.NewInt(0).SetUint64(param.GasPrice)\n\tp.Fee = assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*new(big.Int).Mul(new(big.Int).SetUint64(param.Gas), new(big.Int).SetUint64(param.GasPrice))),\n\t}\n\tp.From.PKr = param.From\n\n\tp.Outs = param.Outs\n\n\troots := []c_type.Uint256{}\n\touts := []txtool.Out{}\n\n\tamounts := make(map[string]*big.Int)\n\tticekts := make(map[c_type.Uint256]c_type.Uint256)\n\tfor _, in := range param.Ins {\n\t\troots = append(roots, in)\n\t\tif root := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), &in); root == nil {\n\t\t\te = fmt.Errorf(\"SRI.GenTxParam get root Error for root %v\", in)\n\t\t\treturn\n\t\t} else {\n\t\t\tout := txtool.Out{in, *root}\n\t\t\tdOuts := DecOut(&tk, []txtool.Out{out})\n\t\t\tif len(dOuts) == 0 {\n\t\t\t\te = fmt.Errorf(\"SRI.GenTxParam dec outs Error for root %v\", in)\n\t\t\t\treturn\n\t\t\t}\n\t\t\toOut := dOuts[0]\n\t\t\tif len(oOut.Nils) == 0 {\n\t\t\t\te = fmt.Errorf(\"SRI.GenTxParam dec outs Error for root %v\", in)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif oOut.Asset.Tkn != nil {\n\t\t\t\tcurrency := strings.Trim(string(oOut.Asset.Tkn.Currency[:]), string([]byte{0}))\n\t\t\t\tif amount, ok := amounts[currency]; ok {\n\t\t\t\t\tamount.Add(amount, oOut.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t} else {\n\t\t\t\t\tamounts[currency] = oOut.Asset.Tkn.Value.ToIntRef()\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tif oOut.Asset.Tkt != nil {\n\t\t\t\tticekts[oOut.Asset.Tkt.Value] = oOut.Asset.Tkt.Category\n\t\t\t}\n\t\t\touts = append(outs, txtool.Out{in, *root})\n\t\t}\n\t}\n\n\tfor _, out := range param.Outs {\n\t\tif out.Asset.Tkn != nil {\n\t\t\tcurrency := strings.Trim(string(out.Asset.Tkn.Currency[:]), string([]byte{0}))\n\t\t\ttoken := out.Asset.Tkn.Value.ToIntRef()\n\t\t\tif amount, ok := amounts[currency]; ok && amount.Cmp(token) >= 0 {\n\t\t\t\tamount.Sub(amount, token)\n\t\t\t\tif amount.Sign() == 0 {\n\t\t\t\t\tdelete(amounts, currency)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\te = fmt.Errorf(\"SSI GenTx Error: balance is not enough\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif out.Asset.Tkt != nil {\n\t\t\tif value, ok := ticekts[out.Asset.Tkt.Value]; ok && value == out.Asset.Tkt.Category {\n\t\t\t\tdelete(ticekts, out.Asset.Tkt.Value)\n\t\t\t} else {\n\t\t\t\te = fmt.Errorf(\"SSI GenTx Erro: balance is not enough\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tif amount, ok := amounts[utils.Uint256ToCurrency(&p.Fee.Currency)]; !ok || amount.Cmp(p.Fee.Value.ToInt()) < 0 {\n\t\te = fmt.Errorf(\"SSI GenTx Error: sero amount < Fee\")\n\t\treturn\n\t} else {\n\t\tamount.Sub(amount, p.Fee.Value.ToInt())\n\t\tif amount.Sign() == 0 {\n\t\t\tdelete(amounts, utils.Uint256ToCurrency(&p.Fee.Currency))\n\t\t}\n\t}\n\n\tif len(amounts) > 0 || len(ticekts) > 0 {\n\t\tfor currency, value := range amounts {\n\t\t\tp.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(),\n\t\t\t\tValue:    utils.U256(*value),\n\t\t\t}}})\n\t\t}\n\t\tfor value, category := range ticekts {\n\t\t\tp.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkt: &assets.Ticket{\n\t\t\t\tCategory: category,\n\t\t\t\tValue:    value,\n\t\t\t}}})\n\t\t}\n\t}\n\n\twits := []txtool.Witness{}\n\n\tif wits, e = SRI_Inst.GetAnchor(roots); e != nil {\n\t\treturn\n\t}\n\n\tfor i := 0; i < len(wits); i++ {\n\t\tin := txtool.GIn{}\n\t\tin.Out = outs[i]\n\t\tin.Witness = wits[i]\n\t\tp.Ins = append(p.Ins, in)\n\t}\n\n\tif e = p.GenZ(); e != nil {\n\t\treturn\n\t}\n\n\tlog.Debug(\"genTxParam ins : %v, outs : %v\", len(p.Ins), len(p.Outs))\n\treturn\n}\n"
  },
  {
    "path": "zero/txtool/flight/tx.go",
    "content": "package flight\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/generate/generate_1\"\n)\n\nfunc SignTx0(param *txtool.GTxParam) (gtx txtool.GTx, e error) {\n\te = fmt.Errorf(\"SignTx0 Error: signTx0 not support after sip5\")\n\treturn\n}\n\nfunc SignTx1(txParam *txtool.GTxParam) (tx stx.T, param txtool.GTxParam, keys []c_type.Uint256, bases []c_type.Uint256, e error) {\n\tif ctx, err := generate_1.SignTx(txParam); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\ttx = ctx.Tx()\n\t\tparam = ctx.Param()\n\t\tkeys = ctx.Keys()\n\t\tbases = ctx.Bases()\n\t\treturn\n\t}\n}\n\nfunc ProveTx1(tx *stx.T, param *txtool.GTxParam) (gtx txtool.GTx, e error) {\n\tif ctx, err := generate_1.ProveTx(tx, param); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tgtx.Tx = ctx.Tx()\n\t\tgtx.Gas = hexutil.Uint64(param.Gas)\n\t\tgtx.GasPrice = hexutil.Big(*param.GasPrice)\n\t\tgtx.Hash = gtx.Tx.ToHash()\n\t\treturn\n\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/flight/types.go",
    "content": "package flight\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\ntype PreTxParam struct {\n\tGas      uint64\n\tGasPrice uint64\n\tFrom     c_type.PKr\n\tIns      []c_type.Uint256\n\tOuts     []txtool.GOut\n}\n"
  },
  {
    "path": "zero/txtool/generate/generate.go",
    "content": "package generate\n"
  },
  {
    "path": "zero/txtool/generate/generate_1/prove.go",
    "content": "package generate_1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\ntype prove_ctx struct {\n\tparam  txtool.GTxParam\n\ttx     stx.T\n\tp0_ins []*txtool.GIn\n\tp_ins  []*txtool.GIn\n\tc_ins  []*txtool.GIn\n\tc_outs []*txtool.GOut\n\tp_outs []*txtool.GOut\n}\n\nfunc (self *prove_ctx) Tx() (ret stx.T) {\n\tret = self.tx\n\treturn\n}\n\nfunc (self *prove_ctx) prepare() {\n\tfor i := range self.param.Ins {\n\t\tin := &self.param.Ins[i]\n\t\tif in.Out.State.OS.Out_O != nil {\n\t\t\tself.p0_ins = append(self.p0_ins, in)\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_Z != nil {\n\t\t\tself.p0_ins = append(self.p0_ins, in)\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_P != nil {\n\t\t\tself.p_ins = append(self.p_ins, in)\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_C != nil {\n\t\t\tif self.param.Z != nil && *self.param.Z {\n\t\t\t\tself.c_ins = append(self.c_ins, in)\n\t\t\t} else {\n\t\t\t\tself.p_ins = append(self.p_ins, in)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t}\n\tfor i := range self.param.Outs {\n\t\tout := &self.param.Outs[i]\n\t\tif c_superzk.IsSzkPKr(&out.PKr) {\n\t\t\tif self.param.Z != nil && *self.param.Z {\n\t\t\t\tself.c_outs = append(self.c_outs, out)\n\t\t\t} else {\n\t\t\t\tself.p_outs = append(self.p_outs, out)\n\t\t\t}\n\t\t} else {\n\t\t\tself.p_outs = append(self.p_outs, out)\n\t\t}\n\t}\n}\n\nfunc (self *prove_ctx) prove() (e error) {\n\tvar gen_output_procs = gen_output_procs_pool.GetProcs()\n\tdefer gen_output_procs_pool.PutProcs(gen_output_procs)\n\tfor i, out := range self.c_outs {\n\n\t\tg := gen_output_desc{}\n\t\tg.asset_cm = self.tx.Tx1.Outs_C[i].AssetCM\n\t\tg.ar = *out.Ar\n\t\tg.asset = out.Asset.ToTypeAsset()\n\t\tg.index = i\n\n\t\tif self.param.IsExt != nil && *self.param.IsExt {\n\t\t\tg.isEx = true\n\t\t}\n\n\t\tgen_output_procs.StartProc(&g)\n\t}\n\n\tvar gen_input_procs = gen_input_procs_pool.GetProcs()\n\tdefer gen_input_procs_pool.PutProcs(gen_input_procs)\n\tfor i, in := range self.c_ins {\n\t\tt_in := self.tx.Tx1.Ins_C[i]\n\t\tg := gen_input_desc{}\n\t\tg.asset_cm_new = t_in.AssetCM\n\t\tg.zpka = t_in.ZPKa\n\t\tg.nil = t_in.Nil\n\t\tg.anchor = t_in.Anchor\n\t\tg.asset_cc = *in.CC\n\t\tg.ar_old = *in.ArOld\n\t\tg.ar_new = *in.Ar\n\t\tg.index = in.Out.State.OS.Index\n\t\tcopy(g.zpkr[:], in.Out.State.OS.ToPKr()[:32])\n\t\tg.vskr = *in.Vskr\n\t\tcopy(g.baser[:], in.Out.State.OS.ToPKr()[64:])\n\t\tg.a = *in.A\n\t\tfor i, path := range in.Witness.Paths {\n\t\t\tcopy(g.paths[len(g.paths)-32-(i*32):], path[:])\n\t\t}\n\t\tg.pos = uint64(in.Witness.Pos)\n\t\tgen_input_procs.StartProc(&g)\n\t}\n\n\tvar gen_pkg_procs = gen_pkg_procs_pool.GetProcs()\n\tdefer gen_pkg_procs_pool.PutProcs(gen_pkg_procs)\n\tif self.param.Cmds.PkgCreate != nil {\n\t\tg := gen_pkg_desc{}\n\t\tg.asset = self.param.Cmds.PkgCreate.Asset.ToTypeAsset()\n\t\tg.ar = self.param.Cmds.PkgCreate.Ar\n\t\tg.asset_cm = self.tx.Desc_Pkg.Create.Pkg.AssetCM\n\t\tgen_pkg_procs.StartProc(&g)\n\t}\n\n\t//-----------------\n\n\tif gen_output_procs.HasProc() {\n\t\tif e = gen_output_procs.End(); e == nil {\n\t\t\tfor _, g := range gen_output_procs.Runs {\n\t\t\t\toutput_desc := g.(*gen_output_desc)\n\t\t\t\tself.tx.Tx1.Outs_C[output_desc.index].Proof = output_desc.proof\n\t\t\t}\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif gen_input_procs.HasProc() {\n\t\tif e = gen_input_procs.End(); e == nil {\n\t\t\tfor i, g := range gen_input_procs.Runs {\n\t\t\t\tinput_desc := g.(*gen_input_desc)\n\t\t\t\tself.tx.Tx1.Ins_C[i].Proof = input_desc.proof\n\t\t\t}\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n\n\tif gen_pkg_procs.HasProc() {\n\t\tif e = gen_pkg_procs.End(); e == nil {\n\t\t\tpkg_desc := gen_pkg_procs.Runs[0].(*gen_pkg_desc)\n\t\t\tself.tx.Desc_Pkg.Create.Proof = pkg_desc.proof\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc ProveTx(tx *stx.T, param *txtool.GTxParam) (ctx prove_ctx, e error) {\n\tctx.param = *param\n\tctx.tx = *tx\n\tctx.prepare()\n\n\tif e = ctx.prove(); e != nil {\n\t\treturn\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txtool/generate/generate_1/prove_proc.go",
    "content": "package generate_1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n)\n\nvar gen_output_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_p_thread_num })\n\ntype gen_output_desc struct {\n\tasset    c_type.Asset\n\tar       c_type.Uint256\n\tasset_cm c_type.Uint256\n\tproof    c_type.Proof\n\tindex    int\n\tisEx     bool\n\te        error\n}\n\nfunc (self *gen_output_desc) Run() error {\n\tif proof, err := c_superzk.ProveOutput(&self.asset, &self.ar, &self.asset_cm, self.isEx); err != nil {\n\t\tself.e = err\n\t\treturn err\n\t} else {\n\t\tself.proof = proof\n\t\treturn nil\n\t}\n}\n\nvar gen_input_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_p_thread_num })\n\ntype gen_input_desc struct {\n\tasset_cm_new c_type.Uint256\n\tzpka         c_type.Uint256\n\tnil          c_type.Uint256\n\tanchor       c_type.Uint256\n\tasset_cc     c_type.Uint256\n\tar_old       c_type.Uint256\n\tar_new       c_type.Uint256\n\tindex        uint64\n\tzpkr         c_type.Uint256\n\tvskr         c_type.Uint256\n\tbaser        c_type.Uint256\n\ta            c_type.Uint256\n\tpaths        [c_type.DEPTH * 32]byte\n\tpos          uint64\n\tproof        c_type.Proof\n\te            error\n}\n\nfunc (self *gen_input_desc) Run() error {\n\tif proof, err := c_superzk.ProveInput(\n\t\t&self.asset_cm_new,\n\t\t&self.zpka,\n\t\t&self.nil,\n\t\t&self.anchor,\n\t\t&self.asset_cc,\n\t\t&self.ar_old,\n\t\t&self.ar_new,\n\t\tself.index,\n\t\t&self.zpkr,\n\t\t&self.vskr,\n\t\t&self.baser,\n\t\t&self.a,\n\t\t&self.paths,\n\t\tself.pos,\n\t); err != nil {\n\t\tself.e = err\n\t\treturn err\n\t} else {\n\t\tself.proof = proof\n\t\treturn nil\n\t}\n}\n\nvar gen_pkg_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_p_thread_num })\n\ntype gen_pkg_desc struct {\n\tasset_cm c_type.Uint256\n\tasset    c_type.Asset\n\tar       c_type.Uint256\n\tproof    c_type.Proof\n\te        error\n}\n\nfunc (self *gen_pkg_desc) Run() error {\n\tif proof, e := c_superzk.ProveOutput(&self.asset, &self.ar, &self.asset_cm, true); e != nil {\n\t\tself.e = e\n\t\treturn e\n\t} else {\n\t\tself.proof = proof\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/generate/generate_1/sign.go",
    "content": "package generate_1\n\nimport (\n\t\"errors\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n\n\t\"github.com/sero-cash/go-sero/core/types\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\ntype sign_ctx struct {\n\tparam        txtool.GTxParam\n\tp0_ins       []*txtool.GIn\n\tp_ins        []*txtool.GIn\n\tc_ins        []*txtool.GIn\n\tc_outs       []*txtool.GOut\n\tp_outs       []*txtool.GOut\n\tbalance_desc c_type.BalanceDesc\n\tkeys         []c_type.Uint256\n\tbases        []c_type.Uint256\n\ts            stx.T\n\tck           assets.CKState\n}\n\nfunc (self *sign_ctx) Tx() (ret stx.T) {\n\tret = self.s\n\treturn\n}\n\nfunc (self *sign_ctx) Param() (ret txtool.GTxParam) {\n\tret = self.param\n\treturn\n}\n\nfunc (self *sign_ctx) Keys() (ret []c_type.Uint256) {\n\tret = self.keys\n\treturn\n}\n\nfunc (self *sign_ctx) Bases() (ret []c_type.Uint256) {\n\tret = self.bases\n\treturn\n}\n\nfunc SignTx(param *txtool.GTxParam) (ctx sign_ctx, e error) {\n\tctx.param = *param\n\tif e = ctx.check(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.prepare(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genFrom(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genFee(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genCmd(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genInsP0(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genInsP(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genInsC(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genOutsC(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genOutsP(); e != nil {\n\t\treturn\n\t}\n\tif e = ctx.genSign(); e != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) check() (e error) {\n\tsk := self.param.From.SKr.ToUint512()\n\ttk, e := superzk.Sk2Tk(&sk)\n\tif !superzk.IsMyPKr(&tk, &self.param.From.PKr) {\n\t\te = errors.New(\"sk unmatch pkr for the From field\")\n\t\treturn\n\t}\n\n\tfor _, in := range self.param.Ins {\n\t\ttk, _ := superzk.Sk2Tk(in.SKr.ToUint512().NewRef())\n\t\tif in.Out.State.OS.Out_O != nil {\n\t\t\tif !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_O.Addr) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_Z != nil {\n\t\t\tif !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_Z.PKr) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_P != nil {\n\t\t\tif !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_P.PKr) {\n\t\t\t\te = errors.New(\"sk unmatch pkr for out_z\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_C != nil {\n\t\t\tif !superzk.IsMyPKr(&tk, &in.Out.State.OS.Out_C.PKr) {\n\t\t\t\te = errors.New(\"sk unmatch pkr for out_z\")\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) prepare() (e error) {\n\tfor i := range self.param.Ins {\n\t\tin := &self.param.Ins[i]\n\t\tif in.Out.State.OS.Out_O != nil {\n\t\t\tself.p0_ins = append(self.p0_ins, in)\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_Z != nil {\n\t\t\tself.p0_ins = append(self.p0_ins, in)\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_P != nil {\n\t\t\tself.p_ins = append(self.p_ins, in)\n\t\t\tcontinue\n\t\t}\n\t\tif in.Out.State.OS.Out_C != nil {\n\t\t\tif self.param.Z != nil && *self.param.Z {\n\t\t\t\tself.c_ins = append(self.c_ins, in)\n\t\t\t} else {\n\t\t\t\tself.p_ins = append(self.p_ins, in)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t}\n\tfor i := range self.param.Outs {\n\t\tout := &self.param.Outs[i]\n\t\tif c_superzk.IsSzkPKr(&out.PKr) {\n\t\t\tif self.param.Z != nil && *self.param.Z {\n\t\t\t\tself.c_outs = append(self.c_outs, out)\n\t\t\t} else {\n\t\t\t\tself.p_outs = append(self.p_outs, out)\n\t\t\t}\n\t\t} else {\n\t\t\tself.p_outs = append(self.p_outs, out)\n\t\t}\n\t}\n\tself.s.Ehash = types.Ehash(*self.param.GasPrice, self.param.Gas, []byte{})\n\treturn\n}\n\nfunc (self *sign_ctx) genFrom() (e error) {\n\tself.s.From = self.param.From.PKr\n\treturn\n}\n\nfunc (self *sign_ctx) genFee() (e error) {\n\tself.s.Fee = self.param.Fee\n\n\tif cc, err := c_superzk.GenAssetCC(self.param.Fee.ToTypeAsset().NewRef()); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tself.ck = assets.NewCKState(true, &self.param.Fee)\n\t\tself.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...)\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) genCmd() (e error) {\n\tvar a *assets.Asset\n\tif self.param.Cmds.BuyShare != nil {\n\t\tself.s.Desc_Cmd.BuyShare = self.param.Cmds.BuyShare\n\t\tasset := self.param.Cmds.BuyShare.Asset()\n\t\ta = &asset\n\t}\n\tif self.param.Cmds.RegistPool != nil {\n\t\tself.s.Desc_Cmd.RegistPool = self.param.Cmds.RegistPool\n\t\tasset := self.param.Cmds.RegistPool.Asset()\n\t\ta = &asset\n\t}\n\tif self.param.Cmds.ClosePool != nil {\n\t\tself.s.Desc_Cmd.ClosePool = self.param.Cmds.ClosePool\n\t}\n\tif self.param.Cmds.Contract != nil {\n\t\tself.s.Desc_Cmd.Contract = self.param.Cmds.Contract\n\t\ta = &self.param.Cmds.Contract.Asset\n\t}\n\tif self.param.Cmds.PkgCreate != nil {\n\t\tcreate := self.param.Cmds.PkgCreate\n\t\tself.s.Desc_Pkg.Create = &stx.PkgCreate{}\n\t\tself.s.Desc_Pkg.Create.PKr = create.PKr\n\t\tself.s.Desc_Pkg.Create.Id = create.Id\n\t\tcreate.Ar = c_superzk.RandomFr()\n\t\tif cm, _, err := c_superzk.GenAssetCM_PC(create.Asset.ToTypeAsset().NewRef(), &create.Ar); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.s.Desc_Pkg.Create.Pkg.AssetCM = cm\n\t\t}\n\t\tsk := self.param.From.SKr.ToUint512()\n\t\ttk, err := superzk.Sk2Tk(&sk)\n\t\tif err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t\tkey := pkg.GetKey(&self.param.From.PKr, &tk)\n\t\tif einfo, err := c_superzk.EncInfo(&key, create.Asset.ToTypeAsset().NewRef(), &create.Memo, &create.Ar); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.s.Desc_Pkg.Create.Pkg.EInfo = einfo\n\t\t}\n\t}\n\tif self.param.Cmds.PkgTransfer != nil {\n\t\tchange := self.param.Cmds.PkgTransfer\n\t\tself.s.Desc_Pkg.Transfer = &stx.PkgTransfer{}\n\t\tself.s.Desc_Pkg.Transfer.Id = change.Id\n\t\tself.s.Desc_Pkg.Transfer.PKr = change.PKr\n\t}\n\tif self.param.Cmds.PkgClose != nil {\n\t\tclose := self.param.Cmds.PkgClose\n\t\tself.s.Desc_Pkg.Close = &stx.PkgClose{}\n\t\tself.s.Desc_Pkg.Close.Id = close.Id\n\t\tself.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, close.AssetCM[:]...)\n\t\tself.balance_desc.Zin_ars = append(self.balance_desc.Zin_ars, close.Ar[:]...)\n\t}\n\tif a != nil {\n\t\tif cc, err := c_superzk.GenAssetCC(a.ToTypeAsset().NewRef()); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.ck.AddOut(a)\n\t\t\tself.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) genInsP0() (e error) {\n\tfor _, in := range self.p0_ins {\n\t\tsk := in.SKr.ToUint512()\n\t\ttk, _ := superzk.Sk2Tk(&sk)\n\n\t\tt_in := stx_v1.In_P0{}\n\t\tt_in.Root = in.Out.Root\n\t\tif t_in.Trace, e = c_superzk.Czero_genTrace(&tk, in.Out.State.OS.RootCM); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif t_in.Nil, e = c_superzk.Czero_genNil(&sk, in.Out.State.OS.RootCM); e != nil {\n\t\t\treturn\n\t\t}\n\n\t\tvar asset_desc assets.Asset\n\t\tif in.Out.State.OS.Out_O != nil {\n\t\t\tasset_desc = in.Out.State.OS.Out_O.Asset\n\t\t} else {\n\t\t\tif key, flag, err := c_superzk.Czero_fetchKey(&tk, &in.Out.State.OS.Out_Z.RPK); err != nil {\n\t\t\t\te = err\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tt_in.Key = &key\n\t\t\t\tif out := ConfirmOutZ(&key, flag, in.Out.State.OS.Out_Z); out == nil {\n\t\t\t\t\te = errors.New(\"gen tx1 confirm outz error\")\n\t\t\t\t\treturn\n\t\t\t\t} else {\n\t\t\t\t\tasset_desc = out.Asset\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif cc, err := c_superzk.GenAssetCC(asset_desc.ToTypeAsset().NewRef()); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.ck.AddIn(&asset_desc)\n\t\t\tself.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...)\n\t\t}\n\t\tself.s.Tx1.Ins_P0 = append(self.s.Tx1.Ins_P0, t_in)\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) genInsP() (e error) {\n\tfor _, in := range self.p_ins {\n\t\tsk := in.SKr.ToUint512()\n\t\ttk, _ := superzk.Sk2Tk(&sk)\n\n\t\tt_in := stx_v1.In_P{}\n\t\tt_in.Root = in.Out.Root\n\t\tt_in.Nil, e = c_superzk.GenNil(&tk, in.Out.State.OS.RootCM, in.Out.State.OS.ToPKr())\n\t\tif e != nil {\n\t\t\treturn\n\t\t}\n\t\tvar asset_desc assets.Asset\n\t\tif in.Out.State.OS.Out_P != nil {\n\t\t\tasset_desc = in.Out.State.OS.Out_P.Asset\n\t\t} else {\n\t\t\tif out_c := in.Out.State.OS.Out_C; out_c != nil {\n\t\t\t\tif key, _, err := c_superzk.FetchKey(&out_c.PKr, &tk, &out_c.RPK); err != nil {\n\t\t\t\t\te = err\n\t\t\t\t\treturn\n\t\t\t\t} else {\n\t\t\t\t\tif dout, _ := ConfirmOutC(&key, out_c); dout == nil {\n\t\t\t\t\t\te = errors.New(\"gen tx1 confirm outz error\")\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt_in.Key = &key\n\t\t\t\t\t\tasset_desc = dout.Asset\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\te = errors.New(\"gen in_p but no out_p or out_c\")\n\t\t\t}\n\t\t}\n\n\t\tif cc, err := c_superzk.GenAssetCC(asset_desc.ToTypeAsset().NewRef()); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.ck.AddIn(&asset_desc)\n\t\t\tself.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...)\n\t\t\tself.s.Tx1.Ins_P = append(self.s.Tx1.Ins_P, t_in)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) genInsC() (e error) {\n\tfor _, in := range self.c_ins {\n\t\tsk := in.SKr.ToUint512()\n\t\ttk, _ := superzk.Sk2Tk(&sk)\n\n\t\tt_in := stx_v1.In_C{}\n\n\t\tt_in.Nil, e = c_superzk.GenNil(&tk, in.Out.State.OS.RootCM, in.Out.State.OS.ToPKr())\n\t\tif e != nil {\n\t\t\treturn\n\t\t}\n\n\t\tkey, vskr, err := c_superzk.FetchKey(&in.Out.State.OS.Out_C.PKr, &tk, &in.Out.State.OS.Out_C.RPK)\n\t\tif err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t\tin.Vskr = &vskr\n\n\t\tdout, ar_old := ConfirmOutC(&key, in.Out.State.OS.Out_C)\n\t\tif dout == nil {\n\t\t\te = errors.New(\"gen in_c error: can not find out_c\")\n\t\t\treturn\n\t\t}\n\t\tin.ArOld = &ar_old\n\t\t//self.keys = append(self.keys, key)\n\n\t\tin.Ar = c_superzk.RandomFr().NewRef()\n\t\tcm, cc, err := c_superzk.GenAssetCM_PC(dout.Asset.ToTypeAsset().NewRef(), in.Ar)\n\t\tif err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t\tt_in.AssetCM = cm\n\t\tin.CC = &cc\n\n\t\tin.A = c_superzk.RandomFr().NewRef()\n\t\tt_in.ZPKa, e = c_superzk.GenZPKa(&in.Out.State.OS.Out_C.PKr, in.A)\n\t\tif e != nil {\n\t\t\treturn\n\t\t}\n\n\t\tt_in.Anchor = in.Witness.Anchor\n\n\t\tself.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, t_in.AssetCM[:]...)\n\t\tself.balance_desc.Zin_ars = append(self.balance_desc.Zin_ars, in.Ar[:]...)\n\t\tself.s.Tx1.Ins_C = append(self.s.Tx1.Ins_C, t_in)\n\n\t\tbaser := c_superzk.ClearPKr(in.Out.State.OS.ToPKr()).BASEr()\n\t\tself.bases = append(self.bases, baser)\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) genOutsC() (e error) {\n\tfor _, out := range self.c_outs {\n\t\tt_out := stx_v1.Out_C{}\n\n\t\tout.Ar = c_superzk.RandomFr().NewRef()\n\t\tt_out.AssetCM, _, e = c_superzk.GenAssetCM_PC(out.Asset.ToTypeAsset().NewRef(), out.Ar)\n\t\tif e != nil {\n\t\t\treturn\n\t\t}\n\n\t\tt_out.PKr = out.PKr\n\t\tvar key c_type.Uint256\n\t\tkey, t_out.RPK, _, e = c_superzk.GenKey(&out.PKr)\n\t\tif e != nil {\n\t\t\treturn\n\t\t}\n\n\t\tt_out.EInfo, e = c_superzk.EncInfo(&key, out.Asset.ToTypeAsset().NewRef(), &out.Memo, out.Ar)\n\t\tif e != nil {\n\t\t\treturn\n\t\t}\n\n\t\tself.balance_desc.Zout_acms = append(self.balance_desc.Zout_acms, t_out.AssetCM[:]...)\n\t\tself.balance_desc.Zout_ars = append(self.balance_desc.Zout_ars, out.Ar[:]...)\n\t\tself.s.Tx1.Outs_C = append(self.s.Tx1.Outs_C, t_out)\n\t\tself.keys = append(self.keys, key)\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) genOutsP() (e error) {\n\tfor _, out := range self.p_outs {\n\t\tt_out := stx_v1.Out_P{}\n\t\tt_out.PKr = out.PKr\n\t\tt_out.Asset = out.Asset\n\t\tt_out.Memo = out.Memo\n\n\t\tif cc, err := c_superzk.GenAssetCC(out.Asset.ToTypeAsset().NewRef()); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.ck.AddOut(&out.Asset)\n\t\t\tself.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...)\n\t\t\tself.s.Tx1.Outs_P = append(self.s.Tx1.Outs_P, t_out)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) genSign() (e error) {\n\n\tself.balance_desc.Hash = self.s.Tx1_Hash()\n\n\tif e = self.signFrom(); e != nil {\n\t\treturn\n\t}\n\tif e = self.signInsP0(); e != nil {\n\t\treturn\n\t}\n\tif e = self.signInsP(); e != nil {\n\t\treturn\n\t}\n\tif e = self.signInsC(); e != nil {\n\t\treturn\n\t}\n\tif e = self.signPkg(); e != nil {\n\t\treturn\n\t}\n\tif e = self.signBalance(); e != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) signFrom() (e error) {\n\tif sign, err := c_superzk.SignPKr_X(self.param.From.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, &self.s.From); err != nil {\n\t\treturn err\n\t} else {\n\t\tself.s.Sign = sign\n\t\treturn nil\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) signInsP0() (e error) {\n\tfor i := range self.s.Tx1.Ins_P0 {\n\t\tt_in := self.p0_ins[i]\n\t\tif sign, err := c_superzk.SignNil_P0(\n\t\t\t&self.balance_desc.Hash,\n\t\t\tt_in.SKr.ToUint512().NewRef(),\n\t\t\tt_in.Out.State.OS.ToPKr(),\n\t\t\tt_in.Out.State.OS.RootCM.NewRef(),\n\t\t); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.s.Tx1.Ins_P0[i].Sign = sign\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) signInsP() (e error) {\n\tfor i := range self.s.Tx1.Ins_P {\n\t\tt_in := self.p_ins[i]\n\t\tif sign, err := c_superzk.SignPKr_P(t_in.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, t_in.Out.State.OS.ToPKr()); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\tself.s.Tx1.Ins_P[i].ASign = sign\n\t\t}\n\t\ttk, _ := superzk.Sk2Tk(t_in.SKr.ToUint512().NewRef())\n\t\tif sign, err := c_superzk.SignNil(\n\t\t\t&tk,\n\t\t\t&self.balance_desc.Hash,\n\t\t\tt_in.Out.State.OS.RootCM.NewRef(),\n\t\t\tt_in.Out.State.OS.ToPKr(),\n\t\t); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.s.Tx1.Ins_P[i].NSign = sign\n\t\t}\n\t}\n\treturn\n}\nfunc (self *sign_ctx) signInsC() (e error) {\n\tfor i := range self.s.Tx1.Ins_C {\n\t\tt_in := self.c_ins[i]\n\t\tif sign, err := c_superzk.SignZPKa(t_in.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, t_in.A, t_in.Out.State.OS.ToPKr()); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tself.s.Tx1.Ins_C[i].Sign = sign\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *sign_ctx) signPkg() error {\n\tif self.param.Cmds.PkgTransfer != nil {\n\t\tif sign, err := c_superzk.SignPKr_X(self.param.From.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, &self.param.Cmds.PkgTransfer.Owner); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\tself.s.Desc_Pkg.Transfer.Sign = sign\n\t\t}\n\t}\n\tif self.param.Cmds.PkgClose != nil {\n\t\tif sign, err := c_superzk.SignPKr_X(self.param.From.SKr.ToUint512().NewRef(), &self.balance_desc.Hash, &self.param.Cmds.PkgClose.Owner); err != nil {\n\t\t\treturn err\n\t\t} else {\n\t\t\tself.s.Desc_Pkg.Transfer.Sign = sign\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (self *sign_ctx) signBalance() (e error) {\n\tif len(self.balance_desc.Zin_acms) > 0 || len(self.balance_desc.Zout_acms) > 0 {\n\t\tif e = c_superzk.SignBalance(&self.balance_desc); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif self.balance_desc.Bcr == c_type.Empty_Uint256 {\n\t\t\treturn errors.New(\"sign balance failed!!!\")\n\t\t} else {\n\t\t\tself.s.Bcr = self.balance_desc.Bcr\n\t\t\tself.s.Bsign = self.balance_desc.Bsign\n\t\t\treturn nil\n\t\t}\n\t} else {\n\t\tif e = self.ck.Check(); e != nil {\n\t\t\treturn\n\t\t} else {\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/generate/generate_1/sign_test.go",
    "content": "package generate_1\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nfunc TestSign(t *testing.T) {\n\tsuperzk.ZeroInit_NoCircuit()\n\n\tstr := \"{\\\"Cmds\\\": {   \\\"BuyShare\\\": null,   \\\"ClosePool\\\": null,   \\\"Contract\\\": null,   \\\"PkgClose\\\": null,   \\\"PkgCreate\\\": null,   \\\"PkgTransfer\\\": null,   \\\"RegistPool\\\": null  },  \\\"Fee\\\": {   \\\"Currency\\\": \\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",   \\\"Value\\\": \\\"25000000000000\\\"  },  \\\"From\\\": {   \\\"PKr\\\": \\\"0xc200d439f05f4cd23e367abc41c505e0f79990a1eee5613cd2033dee36077511b34214e3e0786e14536d22f0b2d7e0068bec6284b626e46f59f974b21d371020948ab05d5c21304e4c4963375c24736670b63a025c709f0b6b97f04a6c1b8b2c\\\",   \\\"SKr\\\": \\\"0x38da86e05a64c7020db02312130e832e299d96830e7455f6b62da898fc044901ea6b778dfe5206460b35fa4ac75a65fa651c3b8cb5ffcc65d38e5c0a3d0bc9010000000000000000000000000000000000000000000000000000000000000000\\\"  },  \\\"Gas\\\": 25000,  \\\"GasPrice\\\": 1000000000,  \\\"Ins\\\": [{   \\\"A\\\": null,   \\\"Ar\\\": null,   \\\"ArOld\\\": null,   \\\"CC\\\": null,   \\\"Out\\\": {    \\\"Root\\\": \\\"0x5122d953535832ab6f2549fb07c1a48301e417acf08a471d5b873552d0304916\\\",    \\\"State\\\": {     \\\"Num\\\": 29,     \\\"OS\\\": {      \\\"Index\\\": 29,      \\\"OutCM\\\": null,      \\\"Out_C\\\": null,      \\\"Out_O\\\": null,      \\\"Out_P\\\": null,      \\\"Out_Z\\\": {       \\\"AssetCM\\\": \\\"0x7d02ba2fd5b686e76603cc2c14b8c400013611484dae4f534a2753a89e768208\\\",       \\\"EInfo\\\": \\\"0x172c7962c348449ce8fcea9fa4279eaed4eeb7717ecd669d08c6ba527ac74754d3e64984b54cdbea6c132c08b65494de41e26703b9663de96842f481b46f8f656c8f064f99bf8d1b0c1e813a988f23075d6e591c055f9b814a48dbfc4bc262ea8c9a2cfa5447901c33d9d75be717f0c729f9825ffbc0924e06982279ebfb02969a586894c68a088c673f117019c6c551ca54bdb174c4da2a2c9c86d1dfc26c4d6c5d983343db87cede81b92ad181c6ee58df4658cd65b4da873cb9413eb812c34c38666de024fcfc781f3e9989563e8a822ddf72b1d250b99c68adf54c105acd\\\",       \\\"OutCM\\\": \\\"0xaa39041683a7b143c22d678daea4aab713e34e928799587464832acf55253590\\\",       \\\"PKr\\\": \\\"0x3e9a783dc651deca5a801c0a5e490c4fbb82fb0ea0d034642578443f6f879c955537c687923f76efc82abf3dca117e31bcb5df2adf29aa1236a36855987f66a28d00fc36daca0488d0d8b4c041ed954e286ea94198f32a1e76012440f3e18c82\\\",       \\\"Proof\\\": \\\"0x0214ce94b025a44e68333c8a05e5a63a5141c3042d35b96bef9980df81180adf000a62802b1f7d9435b1a6bca401a9258335805a1c75b488f7e8e8a12ccb29ecd87c98c29974fe2ac337c250f9b5f1407d540040a7b569170a1943779b5de22776040249b0b6bfad004385bec0573d6f77ede1c2ae28bf739caca7df05ff45ec3a2c20\\\",       \\\"RPK\\\": \\\"0xc58c5fd31db5f4f2b65632a8e916f59bbf354e35b70abef79a35b2ac6fad43c1\\\"      },      \\\"RootCM\\\": \\\"0x2e78f95db341d04d5e4b6f9201eff7453d8860d84a7c804bca42b5d1ef91f112\\\"     },     \\\"TxHash\\\": \\\"0xfa98a9c4a2dae32d4f9b90c7f263352a253018fae4330a559077243b6328d77e\\\"    }   },   \\\"SKr\\\": \\\"0x38da86e05a64c7020db02312130e832e299d96830e7455f6b62da898fc044901ea6b778dfe5206460b35fa4ac75a65fa651c3b8cb5ffcc65d38e5c0a3d0bc9010000000000000000000000000000000000000000000000000000000000000000\\\",   \\\"Vskr\\\": null,   \\\"Witness\\\": {    \\\"Anchor\\\": \\\"0x868bb7990cc2423d46eed1eac70a85acbf98c32f48194e3602bb118607509e10\\\",    \\\"Paths\\\": [\\\"0x4816b0f4f85ac8c25279424b08d8662d831a641e4a31a03bfd0aa083678ab185\\\", \\\"0x40163431945acd58343ea4e5a7ea4d1a256c767ebb3ab669975e53da93f40d8c\\\", \\\"0xabb1f1d8cc981b4e6c4d75f6343c7d20923fd1531478e00e1912be084bfd6218\\\", \\\"0xad15866081d2a25f42e6ba874b2167184dd83013ceb21a5a8edffd09f8771a96\\\", \\\"0x2676d074fd027c9ea610408ca619771fe38c653ff024f2f3aca637e5c95b020e\\\", \\\"0x75720bad848dc8d1909c2a7201564f6ea10434a565b364a3c4c9328b78d8bc05\\\", \\\"0x6eb9d1bbaad7ae8e1ad41b2be597da14321efdbc9c7f4358e6525789d4318c8b\\\", \\\"0xa0f4e174f7fe46368a2c4ed56659c672e0187d0bca2e7619660b9e38564a958e\\\", \\\"0x19faaa87edc67b3a03edb38a7690e88bb35f90eaa38556adf4eea04f0a41329b\\\", \\\"0x78e2fae5201f6e8b5bcbb7d2cfd9a05b51ee5daac55dc1c67d5bf9496443b124\\\", \\\"0x8c473676e83787c7748e9d956e0fd2f316e00dd13771f2cee0367fcf5588f40c\\\", \\\"0x6488a7d2ae45fe1f028a2b3d140073efba82aba8db01e9c96d165d515a2b5ead\\\", \\\"0xc2baf1c827cfce1eb852561d737b454fe12c7555945ba68017fa6222c93d7f1d\\\", \\\"0xc6052c7af376fef1daf078b85913d5b147a68f4c6de75cc9e49399d62a515c92\\\", \\\"0xbddc1775065a6ee9386737303af7b9da6ad995c369706fbdcf4a7fcb8cc2cca0\\\", \\\"0xd14f617a18014f5bb594e7ca4c999354bc095a6b136a6cd3d097928fe3defd86\\\", \\\"0xcfe35d771cfcc111868b623b0885277c74b94f6f5bc544c78c66bc0b5458a524\\\", \\\"0x4163b9a6368d125edd8ee3e538f320752b0bd0f113dd79349a72fa3af06c64ab\\\", \\\"0x78cb874b15e37a66ae8eee4cf13b1e8af6e63ea72c234067a1023f1f6d989a06\\\", \\\"0x13c184ef8cd27a98857dcf2c0a21cefde8808551b4fbc18b1a62b97186662990\\\", \\\"0x93584e7b2c0ced44fca221aa0d934cedb1cddb82e0296f041b1934875d505986\\\", \\\"0x77865dd539eda3960520bee9cd3e0a8563b9a0ddc854885a1d9dee14b11b3da0\\\", \\\"0x8665f83639732248eeba9454540184cc94598e0fe73d126b6e3db31725352f28\\\", \\\"0xa322e919186a4b2f2039601db976b005e7b2968e56d75cbf71a77bbe8905292b\\\", \\\"0xb995f437374bd1e1a9eb3443bc3d7855f15b4d6ce628051332fe20a3a8cd0e9c\\\", \\\"0x75df3f7f39ed5132f0b10ca3d97487eca629128ad37d4e6b5ba391ece4f4702c\\\", \\\"0xf59c191e25659b57738ef22ede3d6113091d0425f40ec862de14bf1149fb382e\\\", \\\"0xa9588c6ec3513da0ecfdb7967fcf6711ca3566e5ae1b8b60bcc7d54a123f2a07\\\", \\\"0x3edc6044a176db79bb6ffccd3f3c950cb5a56b9ba65d4243e9e03cbcf4bbe382\\\"],    \\\"Pos\\\": \\\"0x1d\\\"   }  }],  \\\"Outs\\\": [{   \\\"Ar\\\": null,   \\\"Asset\\\": {    \\\"Tkn\\\": {     \\\"Currency\\\": \\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",     \\\"Value\\\": \\\"1\\\"    },    \\\"Tkt\\\": null   },   \\\"Memo\\\": \\\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\",   \\\"PKr\\\": \\\"0xa8e68b2b7398c188fa431ecf89ce51aa0646c7cc6656cb02de7ee44cc73eec084ea84b8185cfd99d3e5cdb76171a108a35aa858e710dd824175b7f9c35e3f2286ae0e1b5980e64711352822720d083b16472c4cf2226535457cab5b45491f0d8\\\"  }, {   \\\"Ar\\\": null,   \\\"Asset\\\": {    \\\"Tkn\\\": {     \\\"Currency\\\": \\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",     \\\"Value\\\": \\\"7999974999999999999\\\"    },    \\\"Tkt\\\": null   },   \\\"Memo\\\": \\\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\",   \\\"PKr\\\": \\\"0xc200d439f05f4cd23e367abc41c505e0f79990a1eee5613cd2033dee36077511b34214e3e0786e14536d22f0b2d7e0068bec6284b626e46f59f974b21d371020948ab05d5c21304e4c4963375c24736670b63a025c709f0b6b97f04a6c1b8b2c\\\"  }],  \\\"Z\\\": true }\"\n\tparam := &txtool.GTxParam{}\n\tjson.Unmarshal([]byte(str), param)\n\t//param.Z = nil\n\tctx, e := SignTx(param)\n\tfmt.Println(e)\n\tbytes, _ := json.Marshal(ctx.Tx())\n\tfmt.Println(string(bytes))\n\ttx := ctx.Tx()\n\t_, er := ProveTx(&tx, param)\n\tfmt.Println(er)\n\n}\n"
  },
  {
    "path": "zero/txtool/generate/generate_1/utils.go",
    "content": "package generate_1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v0\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx/stx_v1\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nfunc ConfirmOutC(key *c_type.Uint256, outc *stx_v1.Out_C) (dout *txtool.TDOut, ar c_type.Uint256) {\n\tinfo := c_superzk.DecInfoDesc{}\n\tinfo.Key = *key\n\tinfo.Einfo = outc.EInfo\n\tc_superzk.DecOutput(&info)\n\tasset_desc := c_superzk.AssetDesc{}\n\tasset_desc.Asset = info.Asset_ret\n\tasset_desc.Ar = info.Ar_ret\n\tar = asset_desc.Ar\n\tif e := c_superzk.GenAssetCM(&asset_desc); e != nil {\n\t\treturn\n\t}\n\tif asset_desc.Asset_cm_ret == outc.AssetCM {\n\t\tdout = &txtool.TDOut{}\n\t\tdout.Asset = assets.NewAssetByType(&info.Asset_ret)\n\t\tdout.Memo = info.Memo_ret\n\t\treturn\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc ConfirmOutZ(key *c_type.Uint256, flag bool, outz *stx_v0.Out_Z) (dout *txtool.TDOut) {\n\tif asset, rsk, memo, e := c_superzk.Czero_decEInfo(key, flag, &outz.EInfo); e != nil {\n\t\treturn\n\t} else {\n\t\tif out_cm, err := c_superzk.Czero_genOutCM(&asset, &memo, &outz.PKr, &rsk); err != nil {\n\t\t\treturn\n\t\t} else {\n\t\t\tif out_cm != outz.OutCM {\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tdout = &txtool.TDOut{}\n\t\t\t\tdout.Asset = assets.NewAssetByType(&asset)\n\t\t\t\tdout.Memo = memo\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/gtx_test.go",
    "content": "package txtool\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nfunc TestHash(t *testing.T) {\n\tstr := \"{\\\"Gas\\\":\\\"0x61a8\\\",\\\"GasPrice\\\":\\\"0x3b9aca00\\\",\\\"Tx\\\":{\\\"Desc_O\\\":{},\\\"Desc_Z\\\":{},\\\"Desc_Pkg\\\":{},\\\"Desc_Cmd\\\":{},\\\"Tx1\\\":{\\\"Ins_P\\\":[{\\\"Root\\\":\\\"0xf7b106944ab25059519a34737ca69602677e2a3990f3df76dae0e1209f655c2e\\\",\\\"Nil\\\":\\\"0x66e4d272b05d2ce6db32597d9e1ca498205f44108d9d47607d63eb795fb8b051\\\",\\\"ASign\\\":\\\"0xa87565d07ef40617004d84b3b9c01d9964966b73e51aeb54b8b6af8564c9701ebc829323465fa0eab9145a1a53551ec976dd0a439ca8809cbd8a01cd3f1d7d00\\\",\\\"NSign\\\":\\\"0x5f6ec704660e3c0885cebd9da6752a0251c1406b3043154cd76cedb14587ed01c6c9ec82ef4d3b438eaf77196bdb3079c515bd4e1f0518e49a60df1f1fb1a4809f5fef3e8fd4b18378b8d6e5a8b2ca911ba6a7994ad46395c04099d3da31428f\\\"}],\\\"Ins_P0\\\":[],\\\"Ins_C\\\":[],\\\"Outs_C\\\":[{\\\"AssetCM\\\":\\\"0xc35cfaefa805cbf699d4709bd859c3db605266d7b91437aa3eaf02558d9e15a3\\\",\\\"PKr\\\":\\\"0x9c06afd139faaebf52ce2fa878a3a8634922024241a74aefe1cfa71040ab4591da3bd4e399a12897f08f521d207d1d10960ec1a2765abd7bb1183a779932de25726ba54e9aeb13d9b5ed6684cc4f1d7e02d6395b4a9952381d0bcdc743c8c1d7\\\",\\\"RPK\\\":\\\"0x84bb7417e4bb006d98bf0b5090462ed6bb97a148e180cdea70b77a10bd45bd0c\\\",\\\"EInfo\\\":\\\"0xb4310cbce58078bda847647383f7a4e1243dcc307df83dd710e40020f9787a87398544ac35a61ae3da6bf635d011bce6920a038226de74413ee3f9c042c0ca7dd5781772b2bf1b2fd28b3a8416b1dc14b1c80b8805e72868e3fa6048be6ce1ecfa57dc87375cf8e7bc2363e8aeeec1605c2251433d62e65d319edb2fd4c8a83ae008aa77d5a58577a6d79d9a6188bc78c3b65b7b52ca7d2565e0ccc29f4dc415604776ddc0e238c939f55aea670dfa82524bef4bf03ba5d509dc5b39563f1592950065d7c24ddb9367a85f788456edbbd511f4d7be7cbb0e90fe3af9754a9367\\\"},{\\\"AssetCM\\\":\\\"0x7bf388d5929c20ac0ca7f7496d68946d799b92f66787362eb9a600afa51a10aa\\\",\\\"PKr\\\":\\\"0x37fffccf6c32303e14670257e87f64cd81781574a04ff5b27fcc18fe0ca8b928f5a62be6d74218c948a4d92862579e1094d2ecf0c1e37e0bc197896524e73c979cce512ef12dddbfc9d019341853207e2396b3aaed7f9d7fd3f31b60e587a867\\\",\\\"RPK\\\":\\\"0x3d9737be5b9ab7f066b79e17c2d8319dd716df819eab1f8952435172d2c60a1d\\\",\\\"EInfo\\\":\\\"0x86b0aa3a076a606d116a497ec52e98eb7396462da0fa0732ce85ea115e81a4f006b748e59a65c3f81367eda8b6d13b87a0c1d0ca21654e6ef98228817bbb1c8f89d22a2e21965e1053b6690453dce1a094e9f355c2ee9637f4dc3f2d2a8d3acdb7864752e21d6d362776091754b96bae12b73922ad113d9e7af9e48bbcfd335ad1e11c4091263d12e2fd7cf66d19ec477c2d43a97c8b856a10addac28df26a43b3cf106343a367ba72d0932aff8833f4b648c488cef3b7eabdd1290ce294bbb6c0a9b9c28d695bbdef34f0f3c4745ea419b318d0e2bdbc041ea143c2389d59a5\\\"}],\\\"Outs_P\\\":[]},\\\"Bcr\\\":\\\"0x818abb14d68d167e3f1c322f4d90b170acf494a4e137684d2491801124a385a4\\\",\\\"Bsign\\\":\\\"0x69d3a1b89ce0fca3dc4af13b09bb563401963796cb3a0021ddcc26ac7de8008bff93e3ac9336aa3f9e711810b09ab0f4cd479d5747d6e48ef289a3e4f4278101\\\",\\\"Ehash\\\":\\\"0x59bd488f5e20e9b883fb510f5cf33ead2105f39adaec025bf9218e4e16a2e2b0\\\",\\\"From\\\":\\\"0x37fffccf6c32303e14670257e87f64cd81781574a04ff5b27fcc18fe0ca8b928f5a62be6d74218c948a4d92862579e1094d2ecf0c1e37e0bc197896524e73c979cce512ef12dddbfc9d019341853207e2396b3aaed7f9d7fd3f31b60e587a867\\\",\\\"Fee\\\":{\\\"Currency\\\":\\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",\\\"Value\\\":\\\"25000000000000\\\"},\\\"Sign\\\":\\\"0xfa4be5a89c70b7663995af09583ab067c5e1685b160a7a941bff9e531e92d02f88efca9ac2923065106c9dd0a195f0a6699f5079e9292ce8f60888d694386403\\\"},\\\"Hash\\\":\\\"0xb9793158922500e8330c2c87bd3099d761724a47a1edbb9158bb89a87bef11e8\\\"}\"\n\ttx := GTx{}\n\tjson.Unmarshal([]byte(str), &tx)\n\tret := tx.Tx.ToHash()\n\tfmt.Println(common.Bytes2Hex(ret[:]))\n\ttx1_hash := tx.Tx.Tx1_Hash()\n\tfmt.Println(\"tx1_hash\", common.Bytes2Hex(tx1_hash[:]))\n\ttx1_tohash := tx.Tx.Tx1.ToHash()\n\tfmt.Println(\"tx1_tohash\", common.Bytes2Hex(tx1_tohash[:]))\n\t// bytes, _ := json.Marshal(tx)\n\t// fmt.Println(string(bytes));\n}\n\nfunc TestJson() {\n\t// str := \"{\\\"Gas\\\":90000,\\\"GasPrice\\\":1000000000,\\\"Fee\\\":{\\\"Currency\\\":\\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",\\\"Value\\\":\\\"90000000000000\\\"},\\\"From\\\":{\\\"SKr\\\":\\\"0x8e0d8402367784517c1a7f3f11940747f519d5dc33636ad2af373ee6b44877006c4d2a8607922277d6a0635b2ff6fa25d7db06ed65619507169e0ee7089203030000000000000000000000000000000000000000000000000000000000000000\\\",\\\"PKr\\\":\\\"0xed75a97a82f8266115e967734747de0db062b467563116fbfd73d909c9b464aff47ca967203cafc7aaf4f89d0282bbdeebcda08663cdf9d7c57732a396a1fa068289fa3f5f27c44a936e08b734de8b4af103c952589a917539077bb901431bc1\\\"},\\\"Ins\\\":[{\\\"SKr\\\":\\\"0x8e0d8402367784517c1a7f3f11940747f519d5dc33636ad2af373ee6b44877006c4d2a8607922277d6a0635b2ff6fa25d7db06ed65619507169e0ee7089203030000000000000000000000000000000000000000000000000000000000000000\\\",\\\"Out\\\":{\\\"Root\\\":\\\"0x683dfbbba9e686db3f2ca23f2cb993cca9427bb0e1e2ce510f3bad9293c24a2f\\\",\\\"State\\\":{\\\"OS\\\":{\\\"Index\\\":21,\\\"Out_O\\\":null,\\\"Out_Z\\\":null,\\\"Out_P\\\":{\\\"PKr\\\":\\\"0x385f1b179fb44e9f804c3e8a2e742f832207f3e3330e082c0abbd1b3c905eb2ca2e7f8be409341ec2259572ca3b8193d19b929411270233464c5f9fbab28cd2ebfe1442e0a69888e69d20abc1ddca7bd619a5ddec66184cc106f10f6e7172ef0\\\",\\\"Asset\\\":{\\\"Tkn\\\":{\\\"Currency\\\":\\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",\\\"Value\\\":\\\"65000000000000\\\"},\\\"Tkt\\\":null},\\\"Memo\\\":\\\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\"},\\\"Out_C\\\":null,\\\"OutCM\\\":null,\\\"RootCM\\\":\\\"0xe2e35de2e89d05abb6988f8a6418dee37cac0ca34b0a969e2a68846a26311c9a\\\"},\\\"TxHash\\\":\\\"0xd2c9507cfda88ce89542798a743a343d9d6101d163273e28242fc4ab0f659c87\\\",\\\"Num\\\":79}},\\\"Witness\\\":{\\\"Pos\\\":\\\"0x15\\\",\\\"Paths\\\":[\\\"0x568c4229a69a833b0de0a0716a2de1c45cd16da96bd0383b09e07f96d5cf1683\\\",\\\"0x0100000000000000000000000000000000000000000000000000000000000000\\\",\\\"0xff6a7f715e73e79878d4c5ee6ea1133b056f078bef296346e01605dccdeb4d97\\\",\\\"0x130adf7ac88bef31232230e2954ce96f35945f640c7517930ab14d89a995bc1c\\\",\\\"0xf507f7f38d8c1cd206d898e1bde0285f81b39381a7275bd53732b0cca8278c2c\\\",\\\"0x9cda5493957ef78fa117f61252eb9b79e835906dd62f4f230964b4c2b790b892\\\",\\\"0xff3bd1141de02f0c80b435835dbb245fd5f47295e94df8935269940ae3940209\\\",\\\"0xf57f2632fe188f663c4bd0215aab05170aeb2abebadd28132ef279c5b49f79ae\\\",\\\"0xc0f73a47ede0ce8d04cc301e0ecd44148fbf887068b153e297550690fe67061f\\\",\\\"0x75eb8ed603b7e4ef3f5ad521f318b08030b25ea492ff84bc20773ed75d88570b\\\",\\\"0x9bdd82fcd971d4159e17a321242575fc15d6c56151edccc9f312a8d7e75edb2a\\\",\\\"0x50813d276f42fc0a25719f10ef573feef34ce47e2cdcdfd8ae0fa17dce70e698\\\",\\\"0xcbd115a1efe853defd7fc120b08606fa7f389c3f9425b747950682c1e09deb12\\\",\\\"0x80c0d8b03bff5f553da3fc641866ac3afbbf310908569daddf5e0e7092ad62a0\\\",\\\"0x7865c55ce8f7cb355aca5f593426d38b5f82bf0b9f4d19784d75ab498b3ca8ac\\\",\\\"0x2ceadea63565bfa72235374aa70c6ff9146456dab2a1febb1b83df2bb0b5bf90\\\",\\\"0x3686698d6e508112eb93891d48c7b50e12d54914bfdd437076ceaa60ef696e88\\\",\\\"0x311565e80def136b1a7838d09a2f1f0bfd7b7ac2a6d04d4cb6cb2efd4b33b011\\\",\\\"0x9f3b87c8faa34d9104e865b38b3cb87bc5ff71cb0a36a23b71723fbfd31fa72a\\\",\\\"0xdbdbab4b98abd0fb19465930710c700bfb07cede792139f1b4a49f340a161f24\\\",\\\"0x68b4a158325154aee284f9aec951c0da13fe4b44c9188973644a7b68f78735ac\\\",\\\"0xfb9cbf55b5bb63b8e420be52a51ffcf8bbbe878afc696ca70f3f4f2f3358260c\\\",\\\"0x31f7aa53943b9bfe0ccc6f8e25479952f2b446ffa731ef90e45a395b2b4a6e09\\\",\\\"0x447bdf93bb335d8b268dc74569477a5717197fe538795acdf6ab63fb3d848a98\\\",\\\"0x79808b4393da03ae5d0b064b532972d235b571fbc7d5900fe745834385c6981c\\\",\\\"0x042415ac74349b1eb318c113474f3b2373fcf4915f9224208f8a70224c10ac03\\\",\\\"0xf3519d004458238b7277d6cae47c966cc1b2131bbc14bb6ad8c95d4b1cb75425\\\",\\\"0xbc656cd9fd825411e4f2a1da79073c1bb4083432a6aebb80947be38a94cdba80\\\",\\\"0x24378894a012b4e87b04e8d4613b81d1795d87089f83c86f6c42cd8c3c67898e\\\"],\\\"Anchor\\\":\\\"0x683dfbbba9e686db3f2ca23f2cb993cca9427bb0e1e2ce510f3bad9293c24a2f\\\"},\\\"A\\\":null,\\\"Ar\\\":null},{\\\"SKr\\\":\\\"0x8e0d8402367784517c1a7f3f11940747f519d5dc33636ad2af373ee6b44877006c4d2a8607922277d6a0635b2ff6fa25d7db06ed65619507169e0ee7089203030000000000000000000000000000000000000000000000000000000000000000\\\",\\\"Out\\\":{\\\"Root\\\":\\\"0xb146c4181ae841c64f5eb20e090e01cd580a28b6774d7c10226dfe603bd3fb22\\\",\\\"State\\\":{\\\"OS\\\":{\\\"Index\\\":20,\\\"Out_O\\\":null,\\\"Out_Z\\\":null,\\\"Out_P\\\":null,\\\"Out_C\\\":{\\\"PKr\\\":\\\"0x385f1b179fb44e9f804c3e8a2e742f832207f3e3330e082c0abbd1b3c905eb2ca2e7f8be409341ec2259572ca3b8193d19b929411270233464c5f9fbab28cd2ebfe1442e0a69888e69d20abc1ddca7bd619a5ddec66184cc106f10f6e7172ef0\\\",\\\"AssetCM\\\":\\\"0x37967302a56a32104a73edda03c03bc65929e84324080d72bc093ee057eac196\\\",\\\"RPK\\\":\\\"0x37daffa4de3416dd57e1a36256224fd63050f9714593ff791a2a0747727dcc96\\\",\\\"EInfo\\\":\\\"0xbacbf563267e46729761d0909fca5cc322a01c5c131811daa50ecec3f7fad0830e44a1c6435ae6bd4715c3a3e8e6a1b100832c8350684e83d7a2c64d623fe717809df12528f58bc1ae0ddfa8aeb029a8ffbc910d8a2e3d43760eecb0344c2af1f31b0256bfbaaaeb3960f85665dc566f6ab4941051baab11951bd169835356326219babb70d4ae466ca11661cdefdab339389d37e763531b3de9754bbcb391eaf68923c3feaa0a76c86510ec0a54fc78ce005e4f8f478a29e36063651e239bd2600a5ea444cf1b8381294a099429e0db319c14d8b444a211cb1a1d9a561d2e08\\\",\\\"Proof\\\":\\\"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\"},\\\"OutCM\\\":null,\\\"RootCM\\\":\\\"0x568c4229a69a833b0de0a0716a2de1c45cd16da96bd0383b09e07f96d5cf1683\\\"},\\\"TxHash\\\":\\\"0xd2c9507cfda88ce89542798a743a343d9d6101d163273e28242fc4ab0f659c87\\\",\\\"Num\\\":79}},\\\"Witness\\\":{\\\"Pos\\\":\\\"0x14\\\",\\\"Paths\\\":[\\\"0xe2e35de2e89d05abb6988f8a6418dee37cac0ca34b0a969e2a68846a26311c9a\\\",\\\"0x0100000000000000000000000000000000000000000000000000000000000000\\\",\\\"0xff6a7f715e73e79878d4c5ee6ea1133b056f078bef296346e01605dccdeb4d97\\\",\\\"0x130adf7ac88bef31232230e2954ce96f35945f640c7517930ab14d89a995bc1c\\\",\\\"0xf507f7f38d8c1cd206d898e1bde0285f81b39381a7275bd53732b0cca8278c2c\\\",\\\"0x9cda5493957ef78fa117f61252eb9b79e835906dd62f4f230964b4c2b790b892\\\",\\\"0xff3bd1141de02f0c80b435835dbb245fd5f47295e94df8935269940ae3940209\\\",\\\"0xf57f2632fe188f663c4bd0215aab05170aeb2abebadd28132ef279c5b49f79ae\\\",\\\"0xc0f73a47ede0ce8d04cc301e0ecd44148fbf887068b153e297550690fe67061f\\\",\\\"0x75eb8ed603b7e4ef3f5ad521f318b08030b25ea492ff84bc20773ed75d88570b\\\",\\\"0x9bdd82fcd971d4159e17a321242575fc15d6c56151edccc9f312a8d7e75edb2a\\\",\\\"0x50813d276f42fc0a25719f10ef573feef34ce47e2cdcdfd8ae0fa17dce70e698\\\",\\\"0xcbd115a1efe853defd7fc120b08606fa7f389c3f9425b747950682c1e09deb12\\\",\\\"0x80c0d8b03bff5f553da3fc641866ac3afbbf310908569daddf5e0e7092ad62a0\\\",\\\"0x7865c55ce8f7cb355aca5f593426d38b5f82bf0b9f4d19784d75ab498b3ca8ac\\\",\\\"0x2ceadea63565bfa72235374aa70c6ff9146456dab2a1febb1b83df2bb0b5bf90\\\",\\\"0x3686698d6e508112eb93891d48c7b50e12d54914bfdd437076ceaa60ef696e88\\\",\\\"0x311565e80def136b1a7838d09a2f1f0bfd7b7ac2a6d04d4cb6cb2efd4b33b011\\\",\\\"0x9f3b87c8faa34d9104e865b38b3cb87bc5ff71cb0a36a23b71723fbfd31fa72a\\\",\\\"0xdbdbab4b98abd0fb19465930710c700bfb07cede792139f1b4a49f340a161f24\\\",\\\"0x68b4a158325154aee284f9aec951c0da13fe4b44c9188973644a7b68f78735ac\\\",\\\"0xfb9cbf55b5bb63b8e420be52a51ffcf8bbbe878afc696ca70f3f4f2f3358260c\\\",\\\"0x31f7aa53943b9bfe0ccc6f8e25479952f2b446ffa731ef90e45a395b2b4a6e09\\\",\\\"0x447bdf93bb335d8b268dc74569477a5717197fe538795acdf6ab63fb3d848a98\\\",\\\"0x79808b4393da03ae5d0b064b532972d235b571fbc7d5900fe745834385c6981c\\\",\\\"0x042415ac74349b1eb318c113474f3b2373fcf4915f9224208f8a70224c10ac03\\\",\\\"0xf3519d004458238b7277d6cae47c966cc1b2131bbc14bb6ad8c95d4b1cb75425\\\",\\\"0xbc656cd9fd825411e4f2a1da79073c1bb4083432a6aebb80947be38a94cdba80\\\",\\\"0x24378894a012b4e87b04e8d4613b81d1795d87089f83c86f6c42cd8c3c67898e\\\"],\\\"Anchor\\\":\\\"0x683dfbbba9e686db3f2ca23f2cb993cca9427bb0e1e2ce510f3bad9293c24a2f\\\"},\\\"A\\\":null,\\\"Ar\\\":null}],\\\"Outs\\\":[{\\\"PKr\\\":\\\"0xa83e205ebf864e5ed78bce2dd3766253cc553324a8134ae517aefedc43700793366d8a85742a26a5d02498f6ceaa7aa4778bb6c029b39f952e7e88bfd319b7201721c261629c0677a3aaa743b85210a4f5e9f9305debb9bd6c444fdb63edcbc6\\\",\\\"Asset\\\":{\\\"Tkn\\\":{\\\"Currency\\\":\\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",\\\"Value\\\":\\\"589925000000\\\"},\\\"Tkt\\\":null},\\\"Memo\\\":\\\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\",\\\"Ar\\\":null},{\\\"PKr\\\":\\\"0xed75a97a82f8266115e967734747de0db062b467563116fbfd73d909c9b464aff47ca967203cafc7aaf4f89d0282bbdeebcda08663cdf9d7c57732a396a1fa068289fa3f5f27c44a936e08b734de8b4af103c952589a917539077bb901431bc1\\\",\\\"Asset\\\":{\\\"Tkn\\\":{\\\"Currency\\\":\\\"0x000000000000000000000000000000000000000000000000000000005345524f\\\",\\\"Value\\\":\\\"9884410075000000\\\"},\\\"Tkt\\\":null},\\\"Memo\\\":\\\"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\",\\\"Ar\\\":null}],\\\"Cmds\\\":{\\\"BuyShare\\\":null,\\\"RegistPool\\\":null,\\\"ClosePool\\\":null,\\\"Contract\\\":null,\\\"PkgCreate\\\":null,\\\"PkgTransfer\\\":null,\\\"PkgClose\\\":null}}\"\n\n}\n"
  },
  {
    "path": "zero/txtool/iface.go",
    "content": "package txtool\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n)\n\ntype GIn struct {\n\tSKr     c_type.PKr\n\tOut     Out\n\tWitness Witness\n\tA       *c_type.Uint256\n\tAr      *c_type.Uint256\n\tArOld   *c_type.Uint256\n\tVskr    *c_type.Uint256\n\tCC      *c_type.Uint256\n}\n\ntype GOut struct {\n\tPKr   c_type.PKr\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n\tAr    *c_type.Uint256\n}\n\ntype GTx struct {\n\tGas      hexutil.Uint64\n\tGasPrice hexutil.Big\n\tTx       stx.T\n\tHash     c_type.Uint256\n\tRoots    []c_type.Uint256\n\tKeys     []c_type.Uint256\n\tBases    []c_type.Uint256\n}\n\ntype GPkgCloseCmd struct {\n\tId      c_type.Uint256\n\tOwner   c_type.PKr\n\tAssetCM c_type.Uint256\n\tAr      c_type.Uint256\n}\n\ntype GPkgTransferCmd struct {\n\tId    c_type.Uint256\n\tOwner c_type.PKr\n\tPKr   c_type.PKr\n}\n\ntype GPkgCreateCmd struct {\n\tId    c_type.Uint256\n\tPKr   c_type.PKr\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n\tAr    c_type.Uint256\n}\n\ntype Cmds struct {\n\t//Share\n\tBuyShare *stx.BuyShareCmd\n\t//Pool\n\tRegistPool *stx.RegistPoolCmd\n\tClosePool  *stx.ClosePoolCmd\n\t//Contract\n\tContract *stx.ContractCmd\n\t//Package\n\tPkgCreate   *GPkgCreateCmd\n\tPkgTransfer *GPkgTransferCmd\n\tPkgClose    *GPkgCloseCmd\n}\n\ntype GTxParam struct {\n\tGas      uint64\n\tGasPrice *big.Int\n\tFee      assets.Token\n\tFrom     Kr\n\tIns      []GIn\n\tOuts     []GOut\n\tCmds     Cmds\n\tZ        *bool\n\tNum      *uint64\n\tIsExt    *bool\n}\n\nfunc (self *GTxParam) IsSzk() (ret bool) {\n\tcheck := utils.NewPKrChecker()\n\tcheck.AddPKr(&self.From.PKr)\n\tfor _, in := range self.Ins {\n\t\tcheck.AddPKr(in.Out.State.OS.ToPKr())\n\t}\n\tfor _, out := range self.Outs {\n\t\tcheck.AddPKr(&out.PKr)\n\t}\n\treturn check.IsSzk()\n}\n\nfunc (self *GTxParam) GenZ() (e error) {\n\tZ := true\n\tself.Z = &Z\n\tif Ref_inst.Bc != nil {\n\t\tnum := Ref_inst.Bc.GetCurrenHeader().Number.Uint64()\n\t\tif num >= seroparam.SIP7() {\n\t\t\tisExt := true\n\t\t\tself.IsExt = &isExt\n\t\t}\n\t\tself.Num = &num\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txtool/main.go",
    "content": "package txtool\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n)\n\ntype BlockChain interface {\n\tIsValid() bool\n\tGetCurrenHeader() *types.Header\n\tGetHeader(hash *common.Hash) *types.Header\n\tCurrentState(hash *common.Hash) *zstate.ZState\n\tIsContract(address common.Address) (ret bool, e error)\n\tGetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error)\n\tGetTks() []c_type.Tk\n\tGetTkAt(tk *c_type.Tk) uint64\n\tGetBlockByNumber(num uint64) *types.Block\n\tGetHeaderByNumber(num uint64) *types.Header\n\tGetDB() serodb.Database\n}\n\ntype Ref struct {\n\tBc BlockChain\n}\n\nvar Ref_inst Ref\n\nfunc (self *Ref) SetBC(bc BlockChain) {\n\tself.Bc = bc\n}\n\nfunc (self *Ref) GetDelayedNum(delay uint64) (ret uint64) {\n\tret = GetDelayNumber(\n\t\tself.Bc.GetCurrenHeader().Number.Uint64(),\n\t\tdelay,\n\t)\n\treturn\n}\n\nfunc (self *Ref) CurrentState() (ret *zstate.ZState) {\n\tdefer func() {\n\t\tif p := recover(); p != nil {\n\t\t\tnum := self.GetDelayedNum(0)\n\t\t\tblock := self.Bc.GetBlockByNumber(num)\n\t\t\thash := block.Hash()\n\t\t\tret = self.Bc.CurrentState(&hash)\n\t\t}\n\t}()\n\tnum := self.GetDelayedNum(seroparam.DefaultConfirmedBlock())\n\tblock := self.Bc.GetBlockByNumber(num)\n\thash := block.Hash()\n\tret = self.Bc.CurrentState(&hash)\n\treturn\n}\n\nfunc GetDelayNumber(current uint64, delay uint64) (num uint64) {\n\tif current < delay {\n\t\treturn 0\n\t} else {\n\t\treturn current - delay\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/prepare/prepare.go",
    "content": "package prepare\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nfunc SelectUtxos(param *PreTxParam, generator TxParamGenerator) (utxos Utxos, e error) {\n\tif len(param.Roots) > 0 {\n\t\tfor _, root := range param.Roots {\n\t\t\tif utxo := generator.GetRoot(&root); utxo == nil {\n\t\t\t\treturn utxos, fmt.Errorf(\"can not find the utxo for root : %v\", hexutil.Encode(root[:]))\n\t\t\t} else {\n\t\t\t\tutxos = append(utxos, *utxo)\n\t\t\t}\n\t\t}\n\t\treturn\n\t} else {\n\t\tck := assets.NewCKState(true, &param.Fee)\n\n\t\tif cmdsAsset := param.Cmds.OutAsset(); cmdsAsset != nil {\n\t\t\tck.AddOut(cmdsAsset)\n\t\t}\n\n\t\tfor _, reception := range param.Receptions {\n\t\t\tck.AddOut(&reception.Asset)\n\t\t}\n\n\t\tif cmdsAsset, err := param.Cmds.InAsset(); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tif cmdsAsset != nil {\n\t\t\t\tck.AddIn(cmdsAsset)\n\t\t\t}\n\t\t}\n\n\t\tif tks := ck.Tkts(); len(tks) > 0 {\n\t\t\tif outs, remain := generator.FindRootsByTicket(&param.From, tks); len(remain) == 0 {\n\t\t\t\tutxos = append(utxos, outs...)\n\t\t\t\tfor _, out := range outs {\n\t\t\t\t\tck.AddIn(&out.Asset)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\te = errors.New(\"no enough unlocked utxos\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tfor _, tkn := range ck.Tkns() {\n\t\t\touts, remain := generator.FindRoots(&param.From, utils.Uint256ToCurrency(&tkn.Currency), tkn.Value.ToIntRef())\n\t\t\tif remain.Sign() <= 0 {\n\t\t\t\tutxos = append(utxos, outs...)\n\t\t\t} else {\n\t\t\t\te = errors.New(\"no enough unlocked utxos\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\treturn\n\t}\n}\n\ntype BeforeTxParam struct {\n\tFee        assets.Token\n\tGasPrice   big.Int\n\tUtxos      Utxos\n\tRefundTo   c_type.PKr\n\tReceptions []Reception\n\tCmds       Cmds\n}\n\nfunc BuildTxParam(\n\tstate TxParamState,\n\tparam *BeforeTxParam,\n) (txParam *txtool.GTxParam, e error) {\n\n\ttxParam = &txtool.GTxParam{}\n\n\tck := assets.NewCKState(false, &param.Fee)\n\n\ttxParam.Fee = param.Fee\n\ttxParam.GasPrice = &param.GasPrice\n\n\ttxParam.From = txtool.Kr{PKr: param.RefundTo}\n\n\twits, err := state.GetAnchor(param.Utxos.Roots())\n\tif err != nil {\n\t\te = err\n\t\treturn\n\t}\n\n\tIns := []txtool.GIn{}\n\toins_count := 0\n\tfor index, utxo := range param.Utxos {\n\t\tif out := state.GetOut(&utxo.Root); out != nil {\n\t\t\tif ck.AddIn(&utxo.Asset) {\n\t\t\t\tIns = append(Ins, txtool.GIn{Out: txtool.Out{Root: utxo.Root, State: *out}, Witness: wits[index]})\n\t\t\t\tif out.OS.Out_O != nil {\n\t\t\t\t\toins_count++\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\te = fmt.Errorf(\"can not find Out for utxo %v\", hexutil.Encode(utxo.Root[:]))\n\t\t\treturn\n\t\t}\n\t}\n\n\tif oins_count > 2500 {\n\t\te = fmt.Errorf(\"o_ins count > 2500\")\n\t\treturn\n\t}\n\n\tif cmdsAsset, err := param.Cmds.InAsset(); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tif cmdsAsset != nil {\n\t\t\tck.AddIn(cmdsAsset)\n\t\t}\n\t}\n\n\tOuts := []txtool.GOut{}\n\tfor _, reception := range param.Receptions {\n\t\tpkr := reception.Addr\n\t\tif IsPk(reception.Addr) {\n\t\t\tpk := reception.Addr.ToUint512()\n\t\t\tpkr = CreatePkr(&pk, 0)\n\t\t}\n\t\tck.AddOut(&reception.Asset)\n\t\tOuts = append(Outs, txtool.GOut{PKr: pkr, Asset: reception.Asset})\n\t}\n\n\tif cmdsAsset := param.Cmds.OutAsset(); cmdsAsset != nil {\n\t\tck.AddOut(cmdsAsset)\n\t}\n\n\ttkns, tkts := ck.GetList()\n\tvar maxlen int\n\tif len(tkns) > maxlen {\n\t\tmaxlen = len(tkns)\n\t}\n\tif len(tkts) > maxlen {\n\t\tmaxlen = len(tkts)\n\t}\n\n\tfor i := 0; i < maxlen; i++ {\n\t\ta := assets.Asset{}\n\t\tif i < len(tkns) {\n\t\t\ttkn := tkns[i]\n\t\t\ta.Tkn = &assets.Token{}\n\t\t\ta.Tkn.Currency = tkn.Currency\n\t\t\ta.Tkn.Value = tkn.Value\n\t\t}\n\t\tif i < len(tkts) {\n\t\t\ttkt := tkts[i]\n\t\t\ta.Tkt = &assets.Ticket{}\n\t\t\ta.Tkt.Category = tkt.Category\n\t\t\ta.Tkt.Value = tkt.Value\n\t\t}\n\t\tif a.HasAsset() {\n\t\t\tck.AddOut(&a)\n\t\t\tOuts = append(Outs, txtool.GOut{PKr: txParam.From.PKr, Asset: a})\n\t\t}\n\t}\n\n\tif e = ck.Check(); e != nil {\n\t\treturn\n\t}\n\n\ttxParam.Ins = Ins\n\ttxParam.Outs = Outs\n\ttxParam.Cmds.Contract = param.Cmds.Contract\n\ttxParam.Cmds.BuyShare = param.Cmds.BuyShare\n\ttxParam.Cmds.RegistPool = param.Cmds.RegistPool\n\ttxParam.Cmds.ClosePool = param.Cmds.ClosePool\n\n\tif param.Cmds.PkgCreate != nil {\n\t\tif pkg := state.GetPkgById(&param.Cmds.PkgCreate.Id); pkg != nil {\n\t\t\te = errors.New(\"create pkg but the pkg id is exsits\")\n\t\t\treturn\n\t\t}\n\t\ttxParam.Cmds.PkgCreate = &txtool.GPkgCreateCmd{}\n\t\ttxParam.Cmds.PkgCreate.Id = param.Cmds.PkgCreate.Id\n\t\ttxParam.Cmds.PkgCreate.PKr = param.Cmds.PkgCreate.PKr\n\t\ttxParam.Cmds.PkgCreate.Asset = param.Cmds.PkgCreate.Asset\n\t\ttxParam.Cmds.PkgCreate.Memo = param.Cmds.PkgCreate.Memo\n\t}\n\n\tif param.Cmds.PkgTransfer != nil {\n\t\tif pkg := state.GetPkgById(&param.Cmds.PkgTransfer.Id); pkg == nil {\n\t\t\te = errors.New(\"transfer pkg but the pkg id is not exsits\")\n\t\t\treturn\n\t\t} else {\n\t\t\tif !pkg.Closed {\n\t\t\t\ttxParam.Cmds.PkgTransfer = &txtool.GPkgTransferCmd{}\n\t\t\t\ttxParam.Cmds.PkgTransfer.Id = param.Cmds.PkgTransfer.Id\n\t\t\t\ttxParam.Cmds.PkgTransfer.PKr = param.Cmds.PkgTransfer.PKr\n\t\t\t\ttxParam.Cmds.PkgTransfer.Owner = pkg.Pack.PKr\n\t\t\t} else {\n\t\t\t\te = errors.New(\"transfer pkg but the pkg is closed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tif param.Cmds.PkgClose != nil {\n\t\tif p := state.GetPkgById(&param.Cmds.PkgTransfer.Id); p == nil {\n\t\t\te = errors.New(\"close pkg but the pkg id is not exsits\")\n\t\t\treturn\n\t\t} else {\n\t\t\tif !p.Closed {\n\t\t\t\ttxParam.Cmds.PkgClose.Id = param.Cmds.PkgClose.Id\n\t\t\t\ttxParam.Cmds.PkgClose.Owner = p.Pack.PKr\n\t\t\t\ttxParam.Cmds.PkgClose.AssetCM = p.Pack.Pkg.AssetCM\n\t\t\t\tif opkg, err := pkg.DePkg(&param.Cmds.PkgClose.Key, &p.Pack.Pkg); err != nil {\n\t\t\t\t\te = errors.New(\"close pkg but password is error\")\n\t\t\t\t\treturn\n\t\t\t\t} else {\n\t\t\t\t\ttxParam.Cmds.PkgClose.Ar = opkg.Ar\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\te = errors.New(\"close pkg but the pkg is closed\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tvar contractTo *common.Address\n\tif param.Cmds.Contract != nil {\n\t\tif param.Cmds.Contract.To != nil {\n\t\t\tcontractTo = &common.Address{}\n\t\t\tcopy(contractTo[:], param.Cmds.Contract.To[:])\n\t\t}\n\t}\n\n\tif gaslimit, err := state.GetSeroGasLimit(contractTo, &txParam.Fee, txParam.GasPrice); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\ttxParam.Gas = gaslimit\n\t}\n\n\tif e = txParam.GenZ(); e != nil {\n\t\treturn\n\t}\n\n\treturn\n\n}\n"
  },
  {
    "path": "zero/txtool/prepare/preparetx.go",
    "content": "package prepare\n\nimport (\n\t\"bytes\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nfunc GenTxParam(param *PreTxParam, gen TxParamGenerator, state TxParamState) (txParam *txtool.GTxParam, e error) {\n\tif len(param.Receptions) > 500 {\n\t\treturn nil, errors.New(\"receptions count must <= 500\")\n\t}\n\tutxos, err := SelectUtxos(param, gen)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif param.RefundTo == nil {\n\t\tif param.RefundTo = gen.DefaultRefundTo(&param.From); param.RefundTo == nil {\n\t\t\treturn nil, errors.New(\"can not find default refund to\")\n\t\t}\n\t}\n\tbparam := BeforeTxParam{\n\t\tparam.Fee,\n\t\t*param.GasPrice,\n\t\tutxos,\n\t\t*param.RefundTo,\n\t\tparam.Receptions,\n\t\tparam.Cmds,\n\t}\n\ttxParam, e = BuildTxParam(state, &bparam)\n\treturn\n}\n\nfunc IsPk(addr c_type.PKr) bool {\n\tbyte32 := common.Hash{}\n\treturn bytes.Equal(byte32[:], addr[64:96])\n}\n\nfunc CreatePkr(pk *c_type.Uint512, index uint64) c_type.PKr {\n\tr := c_type.Uint256{}\n\tcopy(r[:], common.LeftPadBytes(utils.EncodeNumber(index), 32))\n\tif index == 0 {\n\t\treturn superzk.Pk2PKr(pk, nil)\n\t} else {\n\t\treturn superzk.Pk2PKr(pk, &r)\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/prepare/types.go",
    "content": "package prepare\n\nimport (\n\t\"errors\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/pkg\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\ntype Reception struct {\n\tAddr  c_type.PKr\n\tAsset assets.Asset\n}\n\ntype PkgCloseCmd struct {\n\tId  c_type.Uint256\n\tKey c_type.Uint256\n}\n\nfunc (self *PkgCloseCmd) Asset() (ret assets.Asset, e error) {\n\tif p := txtool.Ref_inst.CurrentState().Pkgs.GetPkgById(&self.Id); p == nil {\n\t\te = errors.New(\"close pkg but not find the pkg\")\n\t\treturn\n\t} else {\n\t\tif opkg, err := pkg.DePkg(&self.Key, &p.Pack.Pkg); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tret = opkg.Asset\n\t\t\treturn\n\t\t}\n\t}\n}\n\ntype PkgTransferCmd struct {\n\tId  c_type.Uint256\n\tPKr c_type.PKr\n}\n\ntype PkgCreateCmd struct {\n\tId    c_type.Uint256\n\tPKr   c_type.PKr\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n}\n\ntype Cmds struct {\n\t//Share\n\tBuyShare *stx.BuyShareCmd\n\t//Pool\n\tRegistPool *stx.RegistPoolCmd\n\tClosePool  *stx.ClosePoolCmd\n\t//Contract\n\tContract *stx.ContractCmd\n\t//Package\n\tPkgCreate   *PkgCreateCmd\n\tPkgTransfer *PkgTransferCmd\n\tPkgClose    *PkgCloseCmd\n}\n\nfunc (self *Cmds) ToPkr() (ret *c_type.PKr) {\n\tif self.BuyShare != nil {\n\t\treturn &self.BuyShare.Vote\n\t}\n\tif self.RegistPool != nil {\n\t\treturn &self.RegistPool.Vote\n\t}\n\tif self.PkgCreate != nil {\n\t\tif self.PkgCreate.PKr.IsEndEmpty() {\n\t\t\treturn\n\t\t} else {\n\t\t\treturn &self.PkgCreate.PKr\n\t\t}\n\t}\n\tif self.PkgTransfer != nil {\n\t\tif self.PkgTransfer.PKr.IsEndEmpty() {\n\t\t\treturn\n\t\t} else {\n\t\t\treturn &self.PkgTransfer.PKr\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *Cmds) InAsset() (asset *assets.Asset, e error) {\n\tif self.PkgClose != nil {\n\t\tif a, err := self.PkgClose.Asset(); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t} else {\n\t\t\tasset = &a\n\t\t\treturn\n\t\t}\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *Cmds) OutAsset() *assets.Asset {\n\tif self.PkgCreate != nil {\n\t\treturn &self.PkgCreate.Asset\n\t}\n\tif self.BuyShare != nil {\n\t\tasset := self.BuyShare.Asset()\n\t\treturn &asset\n\t}\n\tif self.RegistPool != nil {\n\t\tasset := self.RegistPool.Asset()\n\t\treturn &asset\n\t}\n\tif self.Contract != nil {\n\t\treturn &self.Contract.Asset\n\t}\n\treturn nil\n}\n\nfunc (self *Cmds) Valid() bool {\n\tcount := 0\n\tif self.PkgCreate != nil {\n\t\tcount++\n\t}\n\tif self.PkgTransfer != nil {\n\t\tcount++\n\t}\n\tif self.PkgClose != nil {\n\t\tcount++\n\t}\n\tif self.BuyShare != nil {\n\t\tcount++\n\t}\n\tif self.RegistPool != nil {\n\t\tcount++\n\t}\n\tif self.ClosePool != nil {\n\t\tcount++\n\t}\n\tif self.Contract != nil {\n\t\tcount++\n\t}\n\tif count <= 1 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\ntype PreTxParam struct {\n\tFrom       c_type.Uint512\n\tRefundTo   *c_type.PKr\n\tReceptions []Reception\n\tCmds       Cmds\n\tFee        assets.Token\n\tGasPrice   *big.Int\n\tRoots      []c_type.Uint256\n}\n\ntype Utxo struct {\n\tRoot  c_type.Uint256\n\tAsset assets.Asset\n}\n\ntype Utxos []Utxo\n\nfunc (self *Utxos) Roots() (roots []c_type.Uint256) {\n\tfor _, utxo := range *self {\n\t\troots = append(roots, utxo.Root)\n\t}\n\treturn\n}\n\ntype TxParamGenerator interface {\n\tFindRoots(pk *c_type.Uint512, currency string, amount *big.Int) (utxos Utxos, remain big.Int)\n\tFindRootsByTicket(pk *c_type.Uint512, tickets []assets.Ticket) (roots Utxos, remain map[c_type.Uint256]c_type.Uint256)\n\tGetRoot(root *c_type.Uint256) (utxos *Utxo)\n\tDefaultRefundTo(pk *c_type.Uint512) (ret *c_type.PKr)\n}\n\ntype TxParamState interface {\n\tGetAnchor(roots []c_type.Uint256) (wits []txtool.Witness, e error)\n\tGetOut(root *c_type.Uint256) (out *localdb.RootState)\n\tGetPkgById(id *c_type.Uint256) (ret *localdb.ZPkg)\n\tGetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error)\n}\n\ntype DefaultTxParamState struct {\n}\n\nfunc (self *DefaultTxParamState) GetAnchor(roots []c_type.Uint256) (wits []txtool.Witness, e error) {\n\treturn flight.SRI_Inst.GetAnchor(roots)\n}\n\nfunc (self *DefaultTxParamState) GetOut(root *c_type.Uint256) (out *localdb.RootState) {\n\treturn flight.GetOut(root, 0)\n}\n\nfunc (self *DefaultTxParamState) GetPkgById(id *c_type.Uint256) (ret *localdb.ZPkg) {\n\treturn txtool.Ref_inst.CurrentState().Pkgs.GetPkgById(id)\n}\n\nfunc (self *DefaultTxParamState) GetSeroGasLimit(to *common.Address, tfee *assets.Token, gasPrice *big.Int) (gaslimit uint64, e error) {\n\treturn txtool.Ref_inst.Bc.GetSeroGasLimit(to, tfee, gasPrice)\n}\n"
  },
  {
    "path": "zero/txtool/type.go",
    "content": "package txtool\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n)\n\ntype Kr struct {\n\tSKr c_type.PKr\n\tPKr c_type.PKr\n}\n\ntype Out struct {\n\tRoot  c_type.Uint256\n\tState localdb.RootState\n}\n\ntype TDOut struct {\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n\tNils  []c_type.Uint256\n}\n\ntype DOut struct {\n\tAsset assets.Asset\n\tMemo  c_type.Uint512\n\tNil   c_type.Uint256\n}\n\ntype Block struct {\n\tNum  hexutil.Uint64\n\tHash c_type.Uint256\n\tOuts []Out\n\tNils []c_type.Uint256\n\tPkgs []localdb.ZPkg\n}\n\ntype Witness struct {\n\tPos    hexutil.Uint64\n\tPaths  [c_type.DEPTH]c_type.Uint256\n\tAnchor c_type.Uint256\n}\n\ntype Tx struct {\n\tHash c_type.Uint256\n\tTx   stx.T\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify.go",
    "content": "package verify\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/verify/verify_1\"\n)\n\nfunc VerifyWithoutState(ehash *c_type.Uint256, tx *stx.T, num uint64) (e error) {\n\tif num >= seroparam.SIP5() {\n\t\treturn verify_1.VerifyWithoutState(ehash, tx, num)\n\t} else {\n\t\treturn fmt.Errorf(\"VerifyWithoutState Error: verify_0 no longer be used\")\n\t\t//return verify_0.VerifyWithoutState(ehash, tx, num)\n\t}\n}\n\nfunc VerifyWithState(tx *stx.T, state *zstate.ZState, num uint64) (e error) {\n\tif num >= seroparam.SIP5() {\n\t\treturn verify_1.VerifyWithState(tx, state)\n\t} else {\n\t\treturn fmt.Errorf(\"VerifyWithState Error: verify_0 no longer be used\")\n\t\t//return verify_0.VerifyWithState(tx, state)\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify_1/input_c_pool.go",
    "content": "package verify_1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n)\n\nvar verify_input_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_v_thread_num })\n\ntype verify_input_desc struct {\n\tproof        c_type.Proof\n\tasset_cm_new c_type.Uint256\n\tzpka         c_type.Uint256\n\tnil          c_type.Uint256\n\tanchor       c_type.Uint256\n}\n\nfunc (self *verify_input_desc) Run() error {\n\tif err := c_superzk.VerifyInput(\n\t\t&self.proof,\n\t\t&self.asset_cm_new,\n\t\t&self.zpka,\n\t\t&self.nil,\n\t\t&self.anchor,\n\t); err != nil {\n\t\treturn err\n\t} else {\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify_1/output_c_pool.go",
    "content": "package verify_1\n\nimport (\n\t\"github.com/pkg/errors\"\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n)\n\nvar verify_output_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_v_thread_num })\n\ntype verify_output_desc struct {\n\tpkr      c_type.PKr\n\tasset_cm c_type.Uint256\n\tproof    c_type.Proof\n\tisEx     bool\n\te        error\n}\n\nfunc (self *verify_output_desc) Run() error {\n\tif c_superzk.IsPKrValid(&self.pkr) {\n\t\tif err := c_superzk.VerifyOutput(&self.asset_cm, &self.proof, self.isEx); err != nil {\n\t\t\tself.e = err\n\t\t\treturn err\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t} else {\n\t\tself.e = errors.New(\"z_out pkr is invalid !\")\n\t\treturn self.e\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify_1/pkg_pool.go",
    "content": "package verify_1\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n)\n\nvar verify_pkg_procs_pool = utils.NewProcsPool(func() int { return zconfig.G_v_thread_num })\n\ntype verify_pkg_desc struct {\n\tasset_cm c_type.Uint256\n\tproof    c_type.Proof\n\te        error\n}\n\nfunc (self *verify_pkg_desc) Run() error {\n\tif e := c_superzk.VerifyOutput(&self.asset_cm, &self.proof, true); e != nil {\n\t\tself.e = e\n\t\treturn e\n\t} else {\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify_1/verify_proof.go",
    "content": "package verify_1\n\nimport \"github.com/sero-cash/go-czero-import/seroparam\"\n\nfunc (self *verifyWithoutStateCtx) ProcessVerifyProof() {\n\tfor _, in := range self.tx.Tx1.Ins_C {\n\t\tg := verify_input_desc{}\n\t\tg.anchor = in.Anchor\n\t\tg.proof = in.Proof\n\t\tg.nil = in.Nil\n\t\tg.zpka = in.ZPKa\n\t\tg.asset_cm_new = in.AssetCM\n\t\tself.cin_proof_proc.StartProc(&g)\n\t}\n\tfor _, out := range self.tx.Tx1.Outs_C {\n\t\tg := verify_output_desc{}\n\t\tg.proof = out.Proof\n\t\tg.asset_cm = out.AssetCM\n\t\tg.pkr = out.PKr\n\t\tif self.num >= seroparam.SIP7() {\n\t\t\tg.isEx = true\n\t\t}\n\t\tself.cout_proof_proc.StartProc(&g)\n\t}\n\tif self.tx.Desc_Pkg.Create != nil {\n\t\tg := verify_pkg_desc{}\n\t\tg.asset_cm = self.tx.Desc_Pkg.Create.Pkg.AssetCM\n\t\tg.proof = self.tx.Desc_Pkg.Create.Proof\n\t\tself.pkg_proof_proc.StartProc(&g)\n\t}\n}\n\nfunc (self *verifyWithoutStateCtx) WaitVerifyProof() (e error) {\n\tif self.cin_proof_proc.HasProc() {\n\t\tif e = self.cin_proof_proc.End(); e != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tif self.cout_proof_proc.HasProc() {\n\t\tif e = self.cout_proof_proc.End(); e != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tif self.pkg_proof_proc.HasProc() {\n\t\tif e = self.pkg_proof_proc.End(); e != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify_1/verify_state.go",
    "content": "package verify_1\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/zero/zconfig\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/verify/verify_utils\"\n)\n\ntype verifyWithStateCtx struct {\n\ttx           *stx.T\n\tstate        *zstate.ZState\n\tbalance_desc c_type.BalanceDesc\n\tck           assets.CKState\n}\n\nfunc VerifyWithState(tx *stx.T, state *zstate.ZState) (e error) {\n\tctx := verifyWithStateCtx{}\n\tctx.tx = tx\n\tctx.state = state\n\treturn ctx.verify()\n}\n\nfunc (self *verifyWithStateCtx) prepare() {\n\tself.balance_desc.Hash = self.tx.Tx1_Hash()\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) clear() {\n\n}\n\nfunc (self *verifyWithStateCtx) verifyDescO() (e error) {\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyDescZ() (e error) {\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyFee() (e error) {\n\tfeeCC := self.tx.ToFeeCC_Szk()\n\tself.ck = assets.NewCKState(true, &self.tx.Fee)\n\tself.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, feeCC[:]...)\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyFrom() (e error) {\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyPkg() (e error) {\n\tif self.tx.Desc_Pkg.Create != nil {\n\t\tif pg := self.state.Pkgs.GetPkgById(&self.tx.Desc_Pkg.Create.Id); pg != nil {\n\t\t\te = verify_utils.ReportError(fmt.Sprintf(\"pkg id already exists %v\", hexutil.Encode(self.tx.Desc_Pkg.Create.Id[:])), self.tx)\n\t\t\treturn\n\t\t} else {\n\t\t\tself.balance_desc.Zout_acms = append(self.balance_desc.Zout_acms, self.tx.Desc_Pkg.Create.Pkg.AssetCM[:]...)\n\t\t}\n\t}\n\n\tif self.tx.Desc_Pkg.Transfer != nil {\n\t\tif pg := self.state.Pkgs.GetPkgById(&self.tx.Desc_Pkg.Transfer.Id); pg == nil || pg.Closed {\n\t\t\te = verify_utils.ReportError(fmt.Sprintf(\"Can not find pkg of the id %v\", hexutil.Encode(self.tx.Desc_Pkg.Transfer.Id[:])), self.tx)\n\t\t\treturn\n\t\t} else {\n\t\t\tif c_superzk.VerifyPKr_X(&self.balance_desc.Hash, &self.tx.Desc_Pkg.Transfer.Sign, &pg.Pack.PKr) {\n\t\t\t} else {\n\t\t\t\te = verify_utils.ReportError(fmt.Sprintf(\"Can not verify pkg sign of the id %v\", hexutil.Encode(self.tx.Desc_Pkg.Transfer.Id[:])), self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tif self.tx.Desc_Pkg.Close != nil {\n\t\tif pg := self.state.Pkgs.GetPkgById(&self.tx.Desc_Pkg.Close.Id); pg == nil || pg.Closed {\n\t\t\te = verify_utils.ReportError(fmt.Sprintf(\"Can not find pkg of the id %v\", hexutil.Encode(self.tx.Desc_Pkg.Close.Id[:])), self.tx)\n\t\t\treturn\n\t\t} else {\n\t\t\tif c_superzk.VerifyPKr_X(&self.balance_desc.Hash, &self.tx.Desc_Pkg.Close.Sign, &pg.Pack.PKr) {\n\t\t\t\tself.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, pg.Pack.Pkg.AssetCM[:]...)\n\t\t\t} else {\n\t\t\t\te = verify_utils.ReportError(fmt.Sprintf(\"Can not verify pkg sign of the id %v\", hexutil.Encode(self.tx.Desc_Pkg.Close.Id[:])), self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyCmd() (e error) {\n\tif cc := self.tx.Desc_Cmd.ToAssetCC_Szk(); cc != nil {\n\t\tself.ck.AddOut(self.tx.Desc_Cmd.OutAsset())\n\t\tself.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...)\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyInsP0() (e error) {\n\tfor _, in := range self.tx.Tx1.Ins_P0 {\n\t\tif ok := self.state.State.HasIn(&in.Nil); ok {\n\t\t\te = verify_utils.ReportError(\"txs.verify p0_in already in nils\", self.tx)\n\t\t\treturn\n\t\t}\n\t\tif ok := self.state.State.HasIn(&in.Root); ok {\n\t\t\te = verify_utils.ReportError(\"txs.verify p0_in already in nil-roots\", self.tx)\n\t\t\treturn\n\t\t}\n\t\tif src := self.state.State.GetOut(&in.Root); src != nil {\n\t\t\tif e = c_superzk.VerifyNil_P0(&self.balance_desc.Hash, &in.Sign, src.ToPKr(), src.RootCM, &in.Nil); e != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tvar asset_desc c_type.Asset\n\t\t\tif in.Key != nil {\n\t\t\t\tif src.Out_Z != nil {\n\t\t\t\t\tflag := c_superzk.IsFlagSet(src.Out_Z.RPK[:])\n\t\t\t\t\tif asset, rsk, memo, err := c_superzk.Czero_decEInfo(in.Key, flag, &src.Out_Z.EInfo); err != nil {\n\t\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p0_in dec info error\", self.tx)\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif out_cm, err := c_superzk.Czero_genOutCM(&asset, &memo, &src.Out_Z.PKr, &rsk); err != nil {\n\t\t\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p0_in gen out cm error\", self.tx)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif out_cm != src.Out_Z.OutCM {\n\t\t\t\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p0_in confirm error\", self.tx)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tasset_desc = asset\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} else {\n\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p0_in has key but not point to Out_Z\", self.tx)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif src.Out_O != nil {\n\t\t\t\t\tasset_desc = src.Out_O.Asset.ToTypeAsset()\n\t\t\t\t} else {\n\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p0_in no key but not point to Out_O\", self.tx)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tif cc, err := c_superzk.GenAssetCC(&asset_desc); err != nil {\n\t\t\t\te = verify_utils.ReportError(\"txs.verify p0_in no key gen cc error\", self.tx)\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tasset := assets.NewAssetByType(&asset_desc)\n\t\t\t\tif asset.IsValid() {\n\t\t\t\t\tself.ck.AddIn(&asset)\n\t\t\t\t\tself.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...)\n\t\t\t\t} else {\n\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p0_in but asset is invalid\", self.tx)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\te = verify_utils.ReportError(\"txs.Verify: p0_in not find in the outs!\", self.tx)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyInsP() (e error) {\n\tfor _, in := range self.tx.Tx1.Ins_P {\n\t\tif !zconfig.IsValidRoot(in.Root) {\n\t\t\te = verify_utils.ReportError(\"txs.verify p_in already in nils-roots\", self.tx)\n\t\t\treturn\n\t\t}\n\t\tif ok := self.state.State.HasIn(&in.Nil); ok {\n\t\t\te = verify_utils.ReportError(\"txs.verify p_in already in nils\", self.tx)\n\t\t\treturn\n\t\t}\n\t\tif ok := self.state.State.HasIn(&in.Root); ok {\n\t\t\te = verify_utils.ReportError(\"txs.verify p_in already in nil-roots\", self.tx)\n\t\t\treturn\n\t\t}\n\t\tif src := self.state.State.GetOut(&in.Root); src != nil {\n\t\t\tif e = c_superzk.VerifyNil(&self.balance_desc.Hash, &in.NSign, &in.Nil, src.RootCM, src.ToPKr()); e != nil {\n\t\t\t\te = verify_utils.ReportError(\"txs.verify p_in verify nil error\", self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !c_superzk.VerifyPKr_P(&self.balance_desc.Hash, &in.ASign, src.ToPKr()) {\n\t\t\t\te = verify_utils.ReportError(\"txs.verify p_in verify pkr error\", self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tvar asset_desc c_type.Asset\n\t\t\tif in.Key == nil {\n\t\t\t\tif src.Out_P != nil {\n\t\t\t\t\tasset_desc = src.Out_P.Asset.ToTypeAsset()\n\t\t\t\t} else {\n\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p_in has no key but not point to Out_P\", self.tx)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif src.Out_C != nil {\n\t\t\t\t\tif asset, _, ar, err := c_superzk.DecEInfo(in.Key, &src.Out_C.EInfo); err != nil {\n\t\t\t\t\t\te = err\n\t\t\t\t\t\treturn\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif cm, _, err := c_superzk.GenAssetCM_PC(&asset, &ar); err != nil {\n\t\t\t\t\t\t\te = err\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif cm != src.Out_C.AssetCM {\n\t\t\t\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p_in can not confirm to Out_C\", self.tx)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tasset_desc = asset\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} else {\n\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p_in has key but not point to Out_C\", self.tx)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tif cc, err := c_superzk.GenAssetCC(&asset_desc); err != nil {\n\t\t\t\te = err\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tasset := assets.NewAssetByType(&asset_desc)\n\t\t\t\tif !asset.IsValid() {\n\t\t\t\t\te = verify_utils.ReportError(\"txs.verify p_in asset is invalid\", self.tx)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tself.ck.AddIn(&asset)\n\t\t\t\tself.balance_desc.Oin_accs = append(self.balance_desc.Oin_accs, cc[:]...)\n\t\t\t}\n\t\t} else {\n\t\t\te = verify_utils.ReportError(\"txs.Verify: in_o not find in the outs!\", self.tx)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyInsC() (e error) {\n\tfor _, in := range self.tx.Tx1.Ins_C {\n\t\tself.balance_desc.Zin_acms = append(self.balance_desc.Zin_acms, in.AssetCM[:]...)\n\t\tif ok := self.state.State.HasIn(&in.Nil); ok {\n\t\t\te = verify_utils.ReportError(\"txs.verify in already in nils\", self.tx)\n\t\t\treturn\n\t\t} else {\n\t\t\tif !self.state.State.FindAnchorInSzk(&in.Anchor) {\n\t\t\t\te = verify_utils.ReportError(\"txs.verify can not find out for anchor\", self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyOutP() (e error) {\n\tfor _, out := range self.tx.Tx1.Outs_P {\n\t\tself.ck.AddOut(&out.Asset)\n\t\tcc := out.ToAssetCC_Szk()\n\t\tself.balance_desc.Oout_accs = append(self.balance_desc.Oout_accs, cc[:]...)\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyOutC() (e error) {\n\tfor _, out := range self.tx.Tx1.Outs_C {\n\t\tself.balance_desc.Zout_acms = append(self.balance_desc.Zout_acms, out.AssetCM[:]...)\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verifyBalance() (e error) {\n\tif len(self.balance_desc.Zout_acms) > 0 || len(self.balance_desc.Zin_acms) > 0 {\n\t\tself.balance_desc.Bcr = self.tx.Bcr\n\t\tself.balance_desc.Bsign = self.tx.Bsign\n\t\tif err := c_superzk.VerifyBalance(&self.balance_desc); err != nil {\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t} else {\n\t\tif e = self.ck.Check(); e != nil {\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *verifyWithStateCtx) verify() (e error) {\n\tself.prepare()\n\tdefer self.clear()\n\tif e = self.verifyDescO(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyDescZ(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyFee(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyFrom(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyPkg(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyCmd(); e != nil {\n\t\treturn\n\t}\n\tif self.tx.Tx1.Count() > 0 {\n\t\tif e = self.verifyInsP0(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyInsP(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyInsC(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyOutP(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyOutC(); e != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tif e = self.verifyBalance(); e != nil {\n\t\treturn\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify_1/verify_static.go",
    "content": "package verify_1\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/verify/verify_utils\"\n)\n\ntype verifyWithoutStateCtx struct {\n\ttx              *stx.T\n\tnum             uint64\n\thash            c_type.Uint256\n\toout_count      int\n\toin_count       int\n\tzout_count      int\n\tzin_count       int\n\tcin_proof_proc  *utils.Procs\n\tcout_proof_proc *utils.Procs\n\tpkg_proof_proc  *utils.Procs\n}\n\nfunc VerifyWithoutState(ehash *c_type.Uint256, tx *stx.T, num uint64) (e error) {\n\tif *ehash != tx.Ehash {\n\t\te = verify_utils.ReportError(\"ehash error\", tx)\n\t\treturn\n\t}\n\tctx := verifyWithoutStateCtx{}\n\tctx.num = num\n\tctx.tx = tx\n\treturn ctx.verify()\n}\n\nfunc (self *verifyWithoutStateCtx) prepare() {\n\tself.hash = self.tx.Tx1_Hash()\n\tself.cin_proof_proc = verify_input_procs_pool.GetProcs()\n\tself.cout_proof_proc = verify_output_procs_pool.GetProcs()\n\tself.pkg_proof_proc = verify_pkg_procs_pool.GetProcs()\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) clear() {\n\tverify_input_procs_pool.PutProcs(self.cin_proof_proc)\n\tverify_output_procs_pool.PutProcs(self.cout_proof_proc)\n\tverify_pkg_procs_pool.PutProcs(self.pkg_proof_proc)\n}\n\nfunc (self *verifyWithoutStateCtx) verifyDescO() (e error) {\n\tif self.tx.Desc_O.HasContent() {\n\t\treturn verify_utils.ReportError(\"desc o must empty\", self.tx)\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyDescZ() (e error) {\n\tif self.tx.Desc_Z.HasContent() {\n\t\treturn verify_utils.ReportError(\"desc z must empty\", self.tx)\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyFee() (e error) {\n\tif !verify_utils.CheckUint(&self.tx.Fee.Value) {\n\t\te = verify_utils.ReportError(\"txs.verify check fee too big\", self.tx)\n\t\treturn\n\t}\n\tself.tx.ToFeeCC_Szk()\n\tself.oout_count++\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyFrom() (e error) {\n\tif !superzk.IsPKrValid(&self.tx.From) {\n\t\te = verify_utils.ReportError(\"txs.verify from is invalid\", self.tx)\n\t\treturn\n\t}\n\tif !c_superzk.VerifyPKr_X(&self.hash, &self.tx.Sign, &self.tx.From) {\n\t\te = verify_utils.ReportError(\"txs.verify from verify failed\", self.tx)\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyPkg() (e error) {\n\tif self.tx.Desc_Cmd.Count() > 0 && self.tx.Desc_Pkg.Count() > 0 {\n\t\te = verify_utils.ReportError(\"pkg and cmd desc only exists one\", self.tx)\n\t\treturn\n\t}\n\tif !self.tx.Desc_Pkg.Valid() {\n\t\te = verify_utils.ReportError(\"pkg desc is invalid\", self.tx)\n\t\treturn\n\t}\n\tif self.tx.Desc_Pkg.Create != nil {\n\t\tself.zout_count++\n\t}\n\tif self.tx.Desc_Pkg.Close != nil {\n\t\tself.zin_count++\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyCmd() (e error) {\n\tif !self.tx.Desc_Cmd.Valid() {\n\t\te = verify_utils.ReportError(\"cmd desc is invalid\", self.tx)\n\t\treturn\n\t}\n\tif asset := self.tx.Desc_Cmd.OutAsset(); asset != nil {\n\t\tself.oout_count++\n\t\tif asset.Tkn != nil {\n\t\t\tif !verify_utils.CheckUint(&asset.Tkn.Value) {\n\t\t\t\te = verify_utils.ReportError(\"cmd asset tkn value invalid\", self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tself.tx.Desc_Cmd.ToAssetCC_Szk()\n\t}\n\tif pkr := self.tx.Desc_Cmd.ToPkr(); pkr != nil {\n\t\tif !superzk.IsPKrValid(pkr) {\n\t\t\te = verify_utils.ReportError(\"cmd pkr invalid\", self.tx)\n\t\t\treturn\n\t\t}\n\t}\n\tif self.tx.Desc_Cmd.RegistPool != nil {\n\t\tif self.tx.Desc_Cmd.RegistPool.FeeRate > seroparam.HIGHEST_STAKING_NODE_FEE_RATE {\n\t\t\te = verify_utils.ReportError(fmt.Sprintf(\"regist pool the fee rate must < %v%%\", seroparam.HIGHEST_STAKING_NODE_FEE_RATE), self.tx)\n\t\t\treturn\n\t\t}\n\t\tif self.tx.Desc_Cmd.RegistPool.FeeRate < seroparam.LOWEST_STAKING_NODE_FEE_RATE {\n\t\t\te = verify_utils.ReportError(fmt.Sprintf(\"regist pool fee must >= %v%%\", seroparam.LOWEST_STAKING_NODE_FEE_RATE/100), self.tx)\n\t\t\treturn\n\t\t}\n\t}\n\tif self.tx.Desc_Cmd.Contract != nil {\n\t\tif self.tx.Desc_Cmd.Contract.To != nil {\n\t\t\tempty := c_type.PKr{}\n\t\t\tif *self.tx.Desc_Cmd.Contract.To == empty {\n\t\t\t\te = verify_utils.ReportError(\"contract target can not be zero\", self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyInsP0() (e error) {\n\tself.oin_count += len(self.tx.Tx1.Ins_P0)\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyInsP() (e error) {\n\tself.oin_count += len(self.tx.Tx1.Ins_P)\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyInsC() (e error) {\n\tfor _, in := range self.tx.Tx1.Ins_C {\n\t\tif !c_superzk.VerifyZPKa(&self.hash, &in.Sign, &in.ZPKa) {\n\t\t\te = verify_utils.ReportError(\"c_out zpka verify invalid\", self.tx)\n\t\t\treturn\n\t\t}\n\t\tself.zin_count++\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyOutP() (e error) {\n\tfor i, out := range self.tx.Tx1.Outs_P {\n\t\tself.oout_count++\n\t\tif !superzk.IsPKrValid(&out.PKr) {\n\t\t\te = verify_utils.ReportError(\"p_out pkr invalid\", self.tx)\n\t\t\treturn\n\t\t}\n\t\tif out.Asset.Tkn != nil {\n\t\t\tif !verify_utils.CheckUint(&out.Asset.Tkn.Value) {\n\t\t\t\te = verify_utils.ReportError(\"p_out tkn value invalid\", self.tx)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tself.tx.Tx1.Outs_P[i].ToAssetCC_Szk()\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyOutC() (e error) {\n\tfor _, out := range self.tx.Tx1.Outs_C {\n\t\tself.zout_count++\n\t\tif !c_superzk.IsPKrValid(&out.PKr) {\n\t\t\te = verify_utils.ReportError(\"c_out pkr invalid\", self.tx)\n\t\t\treturn\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verifyBalance() (e error) {\n\tif self.oout_count+self.zout_count > seroparam.MAX_Z_OUT_LENGTH_SIP2 {\n\t\te = verify_utils.ReportError(\"verify error: out_size > 500\", self.tx)\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (self *verifyWithoutStateCtx) verify() (e error) {\n\tself.prepare()\n\tdefer self.clear()\n\n\tself.ProcessVerifyProof()\n\n\tif e = self.verifyDescO(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyDescZ(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyFee(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyFrom(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyPkg(); e != nil {\n\t\treturn\n\t}\n\tif e = self.verifyCmd(); e != nil {\n\t\treturn\n\t}\n\tif self.tx.Tx1.Count() > 0 {\n\t\tif e = self.verifyInsP0(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyInsP(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyInsC(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyOutP(); e != nil {\n\t\t\treturn\n\t\t}\n\t\tif e = self.verifyOutC(); e != nil {\n\t\t\treturn\n\t\t}\n\t}\n\tif e = self.verifyBalance(); e != nil {\n\t\treturn\n\t}\n\tif e = self.WaitVerifyProof(); e != nil {\n\t\treturn\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/txtool/verify/verify_utils/utils.go",
    "content": "package verify_utils\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/zero/txs/stx\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\nfunc CheckUint(i *utils.U256) bool {\n\treturn i.IsValid()\n}\nfunc ReportError(str string, tx *stx.T) (e error) {\n\th := hexutil.Encode(tx.ToHash().NewRef()[:])\n\tlog.Error(\"Verify Tx Error\", \"reason\", str, \"hash\", h)\n\treturn fmt.Errorf(\"Verify Tx Error: resean=%v , hash=%v\", str, h)\n}\n"
  },
  {
    "path": "zero/utils/base58.go",
    "content": "package utils\n\nimport \"C\"\nimport (\n\t\"errors\"\n\n\t\"github.com/btcsuite/btcutil/base58\"\n)\n\nfunc Base58Encode(bytes []byte) (ret *string) {\n\tstr := base58.Encode(bytes)\n\tif len(str) > len(bytes) {\n\t\tret = &str\n\t\treturn\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc Base58Decode(str string, bytes []byte) (e error) {\n\tbs := base58.Decode(str)\n\tif len(bs) <= len(bytes) {\n\t\tcopy(bytes, bs)\n\t\treturn\n\t} else {\n\t\te = errors.New(\"base58 can not decode string\")\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "zero/utils/deep_copy.go",
    "content": "package utils\n\nimport (\n\t\"bytes\"\n\t\"encoding/gob\"\n\t\"fmt\"\n)\n\nfunc DeepSerial(src interface{}) (ret bytes.Buffer) {\n\tif err := gob.NewEncoder(&ret).Encode(src); err != nil {\n\t\tpanic(fmt.Sprintf(\"deepCopy encode error for : %v\", src))\n\t}\n\treturn\n}\n\nfunc DeepUnserial(buf *bytes.Buffer, dst interface{}) {\n\tif err := gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst); err != nil {\n\t\tpanic(fmt.Sprintf(\"deepCopy decode error for : %v\", err))\n\t}\n}\n\nfunc DeepCopy(dst, src interface{}) {\n\tvar buf bytes.Buffer\n\tbuf = DeepSerial(src)\n\tDeepUnserial(&buf, dst)\n}\n"
  },
  {
    "path": "zero/utils/dirtys.go",
    "content": "package utils\n\nimport \"github.com/sero-cash/go-czero-import/c_type\"\n\ntype Dirtys struct {\n\tOrders []c_type.Uint256\n}\n\nfunc (self *Dirtys) Clear() {\n\tself.Orders = []c_type.Uint256{}\n}\nfunc (self *Dirtys) Append(item *c_type.Uint256) {\n\tself.Orders = append(self.Orders, *item)\n}\n\nfunc (self *Dirtys) List() (ret []c_type.Uint256) {\n\treturn self.Orders\n}\n\n/*\nfunc (self *Dirtys) SortedList() (ret []c_type.Uint256) {\n\tlist := Uint256s{}\n\tfor _, k := range self.Orders {\n\t\tlist = append(list, k)\n\t}\n\tsort.Sort(list)\n\tret = []c_type.Uint256(list)\n\treturn\n}\n*/\n"
  },
  {
    "path": "zero/utils/h2hash.go",
    "content": "package utils\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype H2Hash struct {\n\tName string\n\tM    map[c_type.Uint256]c_type.Uint256\n}\n\nfunc NewH2Hash(name string) (ret H2Hash) {\n\tret.Name = name\n\treturn\n}\n\nfunc (self *H2Hash) Clear() {\n\tself.M = make(map[c_type.Uint256]c_type.Uint256)\n}\n\nfunc (self *H2Hash) Add(id *c_type.Uint256, hash *c_type.Uint256) {\n\tself.M[*id] = *hash\n}\n\nfunc (self *H2Hash) Del(id *c_type.Uint256) (ret c_type.Uint256) {\n\tret = self.M[*id]\n\tdelete(self.M, *id)\n\treturn\n}\n\nfunc (self *H2Hash) Get(id *c_type.Uint256) (ret c_type.Uint256) {\n\tret = self.M[*id]\n\treturn\n}\n\nfunc (self *H2Hash) K2Name(k *c_type.Uint256) (ret []byte) {\n\tret = []byte(self.Name)\n\tret = append(ret, k[:]...)\n\treturn\n}\n\nfunc (self *H2Hash) SaveByDB(putter serodb.Putter, id *c_type.Uint256) {\n\tv := self.M[*id]\n\tif err := putter.Put(self.K2Name(id), v[:]); err == nil {\n\t\treturn\n\t} else {\n\t\tpanic(err)\n\t\treturn\n\t}\n}\n\nfunc (self *H2Hash) GetByDB(getter serodb.Getter, id *c_type.Uint256) (ret c_type.Uint256) {\n\tvar ok bool\n\tif ret, ok = self.M[*id]; !ok {\n\t\tif bs, err := getter.Get(self.K2Name(id)); err == nil {\n\t\t\tcopy(ret[:], bs[:])\n\t\t\tself.M[*id] = ret\n\t\t\treturn\n\t\t} else {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t}\n\t} else {\n\t\treturn\n\t}\n}\n\nfunc (self *H2Hash) SaveByTri(tr tri.Tri, id *c_type.Uint256) {\n\tv := self.M[*id]\n\tif err := tr.TryUpdate(self.K2Name(id), v[:]); err == nil {\n\t\treturn\n\t} else {\n\t\tpanic(err)\n\t\treturn\n\t}\n}\n\nfunc (self *H2Hash) GetByTri(tr tri.Tri, id *c_type.Uint256) (ret c_type.Uint256) {\n\tvar ok bool\n\tif ret, ok = self.M[*id]; !ok {\n\t\tif bs, err := tr.TryGet(self.K2Name(id)); err == nil {\n\t\t\tcopy(ret[:], bs[:])\n\t\t\tself.M[*id] = ret\n\t\t\treturn\n\t\t} else {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t}\n\t} else {\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "zero/utils/hset.go",
    "content": "package utils\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/zstate/tri\"\n)\n\ntype HSet struct {\n\tName   string\n\tM      map[c_type.Uint256]bool\n\tOrders []c_type.Uint256\n}\n\nfunc NewHSet(name string) (ret HSet) {\n\tret.Name = name\n\treturn\n}\n\nfunc (self *HSet) Clear() {\n\tself.M = make(map[c_type.Uint256]bool)\n\tself.Orders = []c_type.Uint256{}\n}\n\nfunc (self *HSet) Append(item *c_type.Uint256) {\n\tself.M[*item] = true\n\tself.Orders = append(self.Orders, *item)\n}\n\nfunc (self *HSet) List() (ret []c_type.Uint256) {\n\treturn self.Orders\n}\n\nfunc (self *HSet) K2Name(k *c_type.Uint256) (ret []byte) {\n\tret = []byte(self.Name)\n\tret = append(ret, k[:]...)\n\treturn\n}\n\nfunc (self *HSet) Save(tr tri.Tri) {\n\tfor _, k := range self.Orders {\n\t\tif err := tr.TryUpdate(self.K2Name(&k), []byte{1}); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n}\n\nfunc (self *HSet) Has(tr tri.Tri, k *c_type.Uint256) (ret bool) {\n\tif _, ok := self.M[*k]; ok {\n\t\tret = true\n\t\treturn\n\t} else {\n\t\tif bs, err := tr.TryGet(self.K2Name(k)); err == nil {\n\t\t\tif len(bs) > 0 && bs[0] == 1 {\n\t\t\t\tret = true\n\t\t\t\tself.M[*k] = true\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\treturn\n\t\t\t}\n\t\t} else {\n\t\t\tpanic(err)\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/utils/i256.go",
    "content": "package utils\n\nimport (\n\t\"io\"\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype I256 big.Int\n\nvar I256_0 I256 = I256(*big.NewInt(0))\n\nfunc NewI256(i int64) (ret I256) {\n\tret = I256(*big.NewInt(i))\n\treturn\n}\n\nfunc (self I256) DeepCopy() interface{} {\n\tbi := big.Int(self)\n\tdc := I256(*big.NewInt(0).Set(&bi))\n\treturn dc\n}\n\nfunc (x *I256) GobEncode() ([]byte, error) {\n\tb := big.Int(*x)\n\treturn b.GobEncode()\n}\n\nfunc (z *I256) GobDecode(buf []byte) error {\n\tvar a big.Int\n\tif err := a.GobDecode(buf); err != nil {\n\t\treturn err\n\t}\n\t*z = I256(a)\n\treturn nil\n}\n\nfunc (b I256) EncodeRLP(w io.Writer) error {\n\ti := big.Int(b)\n\tif bytes, e := i.GobEncode(); e != nil {\n\t\treturn e\n\t} else {\n\t\tif e = rlp.Encode(w, bytes); e != nil {\n\t\t\treturn e\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc (b *I256) DecodeRLP(s *rlp.Stream) error {\n\tbytes := []byte{}\n\tif e := s.Decode(&bytes); e != nil {\n\t\treturn e\n\t} else {\n\t\ti := big.Int{}\n\t\tif e := i.GobDecode(bytes); e != nil {\n\t\t\treturn e\n\t\t} else {\n\t\t\t*b = I256(i)\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc (b I256) MarshalText() ([]byte, error) {\n\ti := big.Int(b)\n\treturn i.MarshalText()\n}\n\nfunc (b *I256) UnmarshalJSON(input []byte) error {\n\ti := big.Int{}\n\tif e := i.UnmarshalJSON(input); e != nil {\n\t\treturn e\n\t} else {\n\t\t*b = I256(i)\n\t\treturn nil\n\t}\n}\n\nfunc (b *I256) UnmarshalText(input []byte) error {\n\ti := big.Int{}\n\tif e := i.UnmarshalText(input); e != nil {\n\t\treturn e\n\t} else {\n\t\t*b = I256(i)\n\t\treturn nil\n\t}\n}\n\nfunc (self I256) IsPositive() bool {\n\tl := big.Int(self)\n\treturn l.Sign() >= 0\n}\n\nfunc (self I256) Abs() (ret U256) {\n\tl := big.Int(*self.ToRef())\n\tl.Abs(&l)\n\tret = U256(l)\n\treturn\n}\n\nfunc (self I256) ToRef() (ret *I256) {\n\ts := big.Int(self)\n\tr := big.NewInt(0)\n\tr.Set(&s)\n\tt := I256(*r)\n\tret = &t\n\treturn\n}\n\nfunc (self *I256) Reverse() {\n\tl := big.Int(*self.ToRef())\n\tz := big.NewInt(0)\n\tz.Sub(z, &l)\n\t*self = I256(*z)\n}\n\nfunc (self *I256) AddI(a *I256) {\n\tl := big.Int(*self.ToRef())\n\tr := big.Int(*a)\n\tl.Add(&l, &r)\n\t*self = I256(l)\n\treturn\n}\n\nfunc (self *I256) AddU(a *U256) {\n\tl := big.Int(*self.ToRef())\n\tr := big.Int(*a)\n\tl.Add(&l, &r)\n\t*self = I256(l)\n\treturn\n}\n\nfunc (self *I256) SubI(a *I256) {\n\tl := big.Int(*self.ToRef())\n\tr := big.Int(*a)\n\tl.Sub(&l, &r)\n\t*self = I256(l)\n\treturn\n}\n\nfunc (self *I256) SubU(a *U256) {\n\tl := big.Int(*self.ToRef())\n\tr := big.Int(*a)\n\tl.Sub(&l, &r)\n\t*self = I256(l)\n\treturn\n}\n\nfunc (self *I256) ToIntRef() (ret *big.Int) {\n\tr := big.Int(*self.ToRef())\n\tret = &r\n\treturn\n}\n\nfunc (self *I256) ToUint256() (ret c_type.Uint256) {\n\ti := big.Int(*self.ToRef())\n\tbytes := i.Bytes()\n\tfor i := 0; i < len(bytes)/2; i++ {\n\t\tbytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i]\n\t}\n\tcopy(ret[:], bytes[:])\n\tif i.Sign() < 0 {\n\t\tret[31] = 1\n\t} else {\n\t\tret[31] = 0\n\t}\n\treturn\n}\nfunc (self *I256) Cmp(a *I256) int {\n\tl := big.Int(*self)\n\tr := big.Int(*a)\n\treturn l.Cmp(&r)\n}\n"
  },
  {
    "path": "zero/utils/pkrs_check.go",
    "content": "package utils\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n)\n\ntype pkrsChecker struct {\n\tisSzk bool\n}\n\nfunc NewPKrChecker() (ret pkrsChecker) {\n\treturn\n}\n\nfunc (self *pkrsChecker) AddPKr(pkr *c_type.PKr) {\n\tif c_superzk.IsSzkPKr(pkr) {\n\t\tself.isSzk = true\n\t}\n}\n\nfunc (self *pkrsChecker) AddPK(pk *c_type.Uint512) {\n\tif c_superzk.IsSzkPK(pk) {\n\t\tself.isSzk = true\n\t}\n}\n\nfunc (self *pkrsChecker) AddNil(nl *c_type.Uint256) {\n\tif c_superzk.IsSzkNil(nl) {\n\t\tself.isSzk = true\n\t}\n}\n\nfunc (self *pkrsChecker) IsSzk() (ret bool) {\n\treturn self.isSzk\n}\n"
  },
  {
    "path": "zero/utils/process.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/pkg/errors\"\n)\n\ntype Proc interface {\n\tRun() error\n}\n\ntype Procs struct {\n\tch   chan int\n\twait sync.WaitGroup\n\tRuns []Proc\n\tE    error\n\tERun Proc\n}\n\nfunc NewProcs(num int) (ret Procs) {\n\tret = Procs{\n\t\tmake(chan int, num),\n\t\tsync.WaitGroup{},\n\t\tnil,\n\t\tnil,\n\t\tnil,\n\t}\n\treturn\n}\n\nfunc (self *Procs) HasProc() bool {\n\tif len(self.Runs) > 0 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunc (self *Procs) StartProc(run Proc) {\n\tself.Runs = append(self.Runs, run)\n\tif c_superzk.Is_czero_debug() {\n\t\tif e := run.Run(); e != nil {\n\t\t\tself.E = e\n\t\t}\n\t} else {\n\t\tself.wait.Add(1)\n\t\tgo func(run Proc) {\n\t\t\tdefer func() {\n\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\tself.E = errors.Errorf(\"process panic: %v\", r)\n\t\t\t\t\tself.ERun = run\n\t\t\t\t}\n\t\t\t\t<-self.ch\n\t\t\t\tself.wait.Done()\n\t\t\t}()\n\t\t\tself.ch <- 0\n\t\t\tif self.E == nil {\n\t\t\t\tif e := run.Run(); e != nil {\n\t\t\t\t\tself.E = e\n\t\t\t\t\tself.ERun = run\n\t\t\t\t}\n\t\t\t}\n\t\t}(run)\n\t}\n}\n\nfunc (self *Procs) End() error {\n\tself.wait.Wait()\n\tif self.E == nil {\n\t\treturn nil\n\t} else {\n\t\treturn self.E\n\t}\n}\n\ntype ProcsPool struct {\n\tpool sync.Pool\n}\n\nfunc NewProcsPool(numget func() int) (ret ProcsPool) {\n\tret = ProcsPool{\n\t\tsync.Pool{\n\t\t\tNew: func() interface{} {\n\t\t\t\tprocs := NewProcs(numget())\n\t\t\t\treturn &procs\n\t\t\t},\n\t\t},\n\t}\n\treturn\n}\n\nfunc (self *ProcsPool) GetProcs() (ret *Procs) {\n\tret = self.pool.Get().(*Procs)\n\tret.Runs = []Proc{}\n\tif ret == nil {\n\t\tpanic(fmt.Errorf(\"GetProcsFromPool error: fetch nil!\"))\n\t}\n\treturn\n}\n\nfunc (self *ProcsPool) PutProcs(p *Procs) {\n\tself.pool.Put(p)\n}\n"
  },
  {
    "path": "zero/utils/progress.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-sero/log\"\n)\n\ntype Progress struct {\n\tstart  int64\n\ttarget uint64\n\tlabel  string\n}\n\nfunc NewProgress(label string, target uint64) (ret Progress) {\n\treturn Progress{\n\t\tstart:  -1,\n\t\ttarget: target,\n\t\tlabel:  label,\n\t}\n}\n\nfunc (self *Progress) Tick(cur uint64, ctx ...interface{}) {\n\tif self.start == -1 {\n\t\tself.start = int64(cur)\n\t}\n\n\tdist := self.target - uint64(self.start)\n\n\tif dist == 0 {\n\t\treturn\n\t}\n\n\tprog := cur - uint64(self.start)\n\tstep := dist / 10\n\tif step == 0 {\n\t\tstep = 1\n\t}\n\n\tif cur == self.target || cur == uint64(self.start) || prog%step == 0 {\n\t\tpercent := (float32(prog) / float32(dist)) * 100\n\t\tp := []interface{}{\n\t\t\t\"t\", self.target,\n\t\t\t\"c\", cur,\n\t\t\t\"p\", fmt.Sprintf(\"%d%%\", uint64(percent)),\n\t\t}\n\t\tp = append(p, ctx...)\n\t\tlog.Info(\n\t\t\tself.label,\n\t\t\tp...,\n\t\t)\n\t}\n}\n"
  },
  {
    "path": "zero/utils/snapshot.go",
    "content": "package utils\n\nimport (\n\t\"github.com/mohae/deepcopy\"\n)\n\ntype Snapshot struct {\n\tid  int\n\tbuf interface{}\n}\n\ntype Snapshots struct {\n\tobjs []*Snapshot\n}\n\nfunc (self *Snapshots) Push(id int, obj interface{}) {\n\tcp := deepcopy.Copy(obj)\n\tself.objs = append(self.objs, &Snapshot{id, cp})\n\treturn\n}\n\nfunc (self *Snapshots) Revert(id int) (to interface{}) {\n\tvar temp []*Snapshot\n\tvar max_temp *Snapshot\n\tfor _, s := range self.objs {\n\t\tif s.id <= id {\n\t\t\ttemp = append(temp, s)\n\t\t\tmax_temp = s\n\t\t}\n\t}\n\tself.objs = temp\n\tto = max_temp.buf\n\treturn\n}\n"
  },
  {
    "path": "zero/utils/time_record.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\ntype TimeRecord struct {\n\tstart  time.Time\n\tname   string\n\tenable bool\n}\n\nfunc TR_enter(name string) (tr TimeRecord) {\n\ttr.start = time.Now()\n\ttr.name = name\n\ttr.enable = false\n\treturn\n}\n\nfunc TR_enter_f(name string) (tr TimeRecord) {\n\ttr.start = time.Now()\n\ttr.name = name\n\ttr.enable = true\n\treturn\n}\n\nfunc (tr *TimeRecord) Renter(name string) {\n\tif tr.enable {\n\t\ttd := time.Since(tr.start)\n\t\tfmt.Printf(\"TR-----(\"+tr.name+\")     s=%v\\n\", td)\n\t\ttr.name = name\n\t\ttr.start = time.Now()\n\t}\n}\n\nfunc (tr *TimeRecord) Leave() time.Duration {\n\ttd := time.Since(tr.start)\n\tif tr.enable {\n\t\tfmt.Printf(\"TR-----(\"+tr.name+\")     s=%v\\n\", td)\n\t}\n\treturn td\n}\n"
  },
  {
    "path": "zero/utils/u256.go",
    "content": "package utils\n\nimport (\n\t\"io\"\n\t\"math/big\"\n\n\t\"github.com/pkg/errors\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n)\n\ntype U256 big.Int\n\nvar U256_0 U256 = U256(*big.NewInt(0))\n\nfunc NewU256(i uint64) (ret U256) {\n\tret = U256(*big.NewInt(int64(i)))\n\treturn\n}\n\nfunc (self U256) IsValid() bool {\n\tv := self.ToInt()\n\tif v.Sign() < 0 {\n\t\treturn false\n\t}\n\tif len(v.Bytes()) > 32 {\n\t\treturn false\n\t}\n\tu := self.ToUint256()\n\tif u[31] == 0 && u[30] == 0 {\n\t\treturn true\n\t} else {\n\t\treturn false\n\t}\n}\n\nfunc (self U256) DeepCopy() interface{} {\n\tbi := big.Int(self)\n\tdc := U256(*big.NewInt(0).Set(&bi))\n\treturn dc\n}\n\nfunc (x *U256) GobEncode() ([]byte, error) {\n\tb := big.Int(*x)\n\treturn b.GobEncode()\n}\n\nfunc (z *U256) GobDecode(buf []byte) error {\n\tvar a big.Int\n\tif err := a.GobDecode(buf); err != nil {\n\t\treturn err\n\t}\n\t*z = U256(a)\n\treturn nil\n}\n\nfunc (b U256) EncodeRLP(w io.Writer) error {\n\ti := big.Int(b)\n\tif bytes, e := i.GobEncode(); e != nil {\n\t\treturn e\n\t} else {\n\t\tif e = rlp.Encode(w, bytes); e != nil {\n\t\t\treturn e\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc (b *U256) DecodeRLP(s *rlp.Stream) error {\n\tbytes := []byte{}\n\tif e := s.Decode(&bytes); e != nil {\n\t\treturn e\n\t} else {\n\t\ti := big.Int{}\n\t\tif e := i.GobDecode(bytes); e != nil {\n\t\t\treturn e\n\t\t} else {\n\t\t\t*b = U256(i)\n\t\t\treturn nil\n\t\t}\n\t}\n}\n\nfunc isString(input []byte) bool {\n\treturn len(input) >= 2 && input[0] == '\"' && input[len(input)-1] == '\"'\n}\n\nfunc (b U256) MarshalJSON() ([]byte, error) {\n\ti := big.Int(b)\n\tby, err := i.MarshalJSON()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif seroparam.IsExchangeValueStr() {\n\t\tbytes := make([]byte, len(by)+2)\n\t\tcopy(bytes[1:len(bytes)-1], by[:])\n\t\tbytes[0] = '\"'\n\t\tbytes[len(bytes)-1] = '\"'\n\t\treturn bytes, nil\n\t} else {\n\t\treturn by, err\n\t}\n\n}\n\nfunc (b *U256) ToInt() *big.Int {\n\treturn (*big.Int)(b)\n}\n\nfunc (b *U256) ToBEBytes() (ret []byte) {\n\tret = b.ToInt().Bytes()\n\treturn\n}\n\n//func (b U256) MarshalText() ([]byte, error) {\n//\ti := big.Int(b)\n//\treturn i.MarshalText()\n//}\n\nfunc (b *U256) UnmarshalJSON(input []byte) error {\n\tif isString(input) {\n\t\tinput = input[1 : len(input)-1]\n\t}\n\ti := big.Int{}\n\tif e := i.UnmarshalJSON(input); e != nil {\n\t\treturn e\n\t} else {\n\t\t*b = U256(i)\n\t\treturn nil\n\t}\n}\n\nfunc (b *U256) UnmarshalText(input []byte) error {\n\ti := big.Int{}\n\tif e := i.UnmarshalText(input); e != nil {\n\t\treturn e\n\t} else {\n\t\t*b = U256(i)\n\t\treturn nil\n\t}\n}\n\nfunc NewU256_ByKey(k *c_type.Uint256) (ret U256) {\n\tbytes := *k.NewRef()\n\tfor i := 0; i < len(bytes)/2; i++ {\n\t\tbytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i]\n\t}\n\tr := big.NewInt(0)\n\tr.SetBytes(bytes[:])\n\tret = U256(*r)\n\treturn\n}\n\nfunc (self U256) ToRef() (ret *U256) {\n\ts := big.Int(self)\n\tr := big.NewInt(0)\n\tr.Set(&s)\n\tt := U256(*r)\n\tret = &t\n\treturn\n}\n\nfunc (self *U256) ToI256() (ret I256) {\n\tb := big.Int(*self.ToRef())\n\tret = I256(b)\n\treturn\n}\n\nfunc (self *U256) ToUint256() (ret c_type.Uint256) {\n\ti := big.Int(*self.ToRef())\n\tbytes := i.Bytes()\n\tfor i := 0; i < len(bytes)/2; i++ {\n\t\tbytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i]\n\t}\n\tcopy(ret[:], bytes[:])\n\treturn\n}\n\nfunc (self *U256) ToLEBytes() (ret []byte) {\n\tr := self.ToUint256()\n\treturn r[:]\n}\n\nfunc (self *U256) ToIntRef() (ret *big.Int) {\n\tr := big.Int(*self.ToRef())\n\tret = &r\n\treturn\n}\n\nfunc (self *U256) AddU(a *U256) {\n\tl := big.Int(*self.ToRef())\n\tr := big.Int(*a)\n\tl.Add(&l, &r)\n\t*self = U256(l)\n\treturn\n}\n\nfunc (self *U256) Cmp(a *U256) int {\n\tl := big.Int(*self)\n\tr := big.Int(*a)\n\treturn l.Cmp(&r)\n}\n\nfunc (self *U256) SubU(a *U256) {\n\tif self.Cmp(a) < 0 {\n\t\tpanic(errors.New(\"u256 sub error: result is negative\"))\n\t}\n\tl := big.Int(*self.ToRef())\n\tr := big.Int(*a)\n\tl.Sub(&l, &r)\n\t*self = U256(l)\n\treturn\n}\n"
  },
  {
    "path": "zero/utils/u256_test.go",
    "content": "package utils\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"testing\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n)\n\nfunc TestU256_MarshalText(t *testing.T) {\n\ta := big.NewInt(75)\n\ta.Mul(a, big.NewInt(100000000000))\n\ta.Mul(a, big.NewInt(100000000000000))\n\tvalue := a\n\tb := U256(*value)\n\tm, _ := json.Marshal(b)\n\tfmt.Print(string(m))\n}\n\nfunc TestU256_M(t *testing.T) {\n\tu := U256_0\n\tb, e := u.MarshalJSON()\n\tfmt.Println((e))\n\tfmt.Println(string(b))\n}\n\nfunc TestU256_UnmarshalText(t *testing.T) {\n\tb := []byte(\"\\\"750000000000000000000000000\\\"\")\n\ta := U256{}\n\t//err := a.UnmarshalJSON(b)\n\t//if err != nil {\n\t//\tt.Error(err)\n\t//}\n\n\t//err = a.UnmarshalText(b)\n\terr := json.Unmarshal(b, &a)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tfmt.Printf(\"%v\", a)\n}\n\nfunc TestU256_ToBEBytes(t *testing.T) {\n\t//a := big.NewInt(339014133842837404430)\n\t//b := U256(*a)\n\tb := []byte(\"\\\"339014133842837404430\\\"\")\n\ta := U256{}\n\terr := json.Unmarshal(b, &a)\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\n\tr := a.ToBEBytes()\n\tfmt.Println(hexutil.Encode(r))\n}\n"
  },
  {
    "path": "zero/utils/utils.go",
    "content": "// copyright 2018 The sero.cash Authors\n// This file is part of the go-sero library.\n//\n// The go-sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The go-sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the go-sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage utils\n\nimport (\n\t\"bytes\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common\"\n)\n\nfunc Uint64ToBytes(r uint64) []byte {\n\tvalue := new(big.Int).SetUint64(r)\n\treturn value.Bytes()\n}\nfunc Int64ToBytes(r int64) []byte {\n\tvalue := new(big.Int).SetInt64(r)\n\treturn value.Bytes()\n}\nfunc Uint256SliceCut(is []c_type.Uint256, l int) (ret []c_type.Uint256) {\n\tis_l := len(is)\n\tif is_l < l {\n\t\tl = is_l\n\t}\n\tret = is[:l]\n\treturn\n}\n\ntype Uint256s []c_type.Uint256\n\nfunc (self Uint256s) Len() int {\n\treturn len(self)\n}\nfunc (self Uint256s) Less(i, j int) bool {\n\treturn bytes.Compare(self[i][:], self[j][:]) < 0\n}\nfunc (self Uint256s) Swap(i, j int) {\n\tself[i], self[j] = self[j], self[i]\n}\n\nfunc CurrencyToUint256(str string) (ret c_type.Uint256) {\n\tbs := CurrencyToBytes(str)\n\tcopy(ret[:], bs)\n\treturn\n}\n\nfunc Uint256ToCurrency(u *c_type.Uint256) (ret string) {\n\treturn BytesToCurrency(u[:])\n}\n\nfunc CurrencyToBytes(currency string) []byte {\n\treturn common.LeftPadBytes([]byte(strings.ToUpper(currency)), 32)\n}\n\nfunc BytesToCurrency(bs []byte) string {\n\treturn common.BytesToString(bs)\n}\n\nfunc ShowStack() {\n\tvar buf [4096]byte\n\tn := runtime.Stack(buf[:], false)\n\tfmt.Printf(\"==> %s\\n\", string(buf[:n]))\n}\n\nfunc DecodeNumber32(data []byte) uint32 {\n\tif len(data) == 0 {\n\t\treturn 0\n\t}\n\treturn binary.BigEndian.Uint32(data)\n}\n\nfunc EncodeNumber32(number uint32) []byte {\n\tenc := make([]byte, 4)\n\tbinary.BigEndian.PutUint32(enc, number)\n\treturn enc\n}\n\nfunc EncodeNumber(number uint64) []byte {\n\tenc := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(enc, number)\n\treturn enc\n}\n\nfunc DecodeNumber(data []byte) uint64 {\n\tif len(data) == 0 {\n\t\treturn 0\n\t}\n\treturn binary.BigEndian.Uint64(data)\n}\n\nvar (\n//sero = 1000000000000000000\n//gta  = big.NewInt(1000000000)\n//ta   = big.NewInt(1)\n)\n\nfunc ParseAmount(s string) (*big.Int, error) {\n\ts = strings.ToUpper(s)\n\tbase := 1.0\n\tif strings.HasSuffix(s, \"SERO\") {\n\t\ts = s[0 : len(s)-4]\n\t\tbase = 1000000000000000000.0\n\t} else if strings.HasSuffix(s, \"GTA\") {\n\t\ts = s[0 : len(s)-3]\n\t\tbase = 1000000000.0\n\t} else if strings.HasSuffix(s, \"TA\") {\n\t\ts = s[0 : len(s)-2]\n\t}\n\tif valFloat, ok := new(big.Float).SetString(s); ok {\n\t\tvalFloat = new(big.Float).Mul(valFloat, big.NewFloat(base))\n\t\tret, _ := valFloat.Int(nil)\n\t\treturn ret, nil\n\t}\n\n\treturn nil, errors.New(\"illegal args\")\n}\n"
  },
  {
    "path": "zero/utils/utils_test.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/mohae/deepcopy\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n)\n\ntype copytest struct {\n\tM map[string]bool\n\tL []string\n\tP *c_type.Uint256\n}\n\nfunc TestSnapshots(t *testing.T) {\n\tct := copytest{}\n\tct.M = make(map[string]bool)\n\tct.M[\"hello\"] = true\n\tct.L = append(ct.L, \"list\")\n\tct.P = &c_type.Uint256{1}\n\n\tss := Snapshots{}\n\tss.Push(0, &ct)\n\n\tct1 := copytest{}\n\tct1 = *ss.Revert(1).(*copytest)\n\tfmt.Print(ct1)\n}\n\nfunc TestDeepCopy(t *testing.T) {\n\tct := copytest{}\n\tct.M = make(map[string]bool)\n\tct.M[\"hello\"] = true\n\tct.L = append(ct.L, \"list\")\n\tct.P = &c_type.Uint256{1}\n\n\ttr := TR_enter(\"dp\")\n\tcp := deepcopy.Copy(ct).(copytest)\n\ttr.Renter(\"cp\")\n\tctd := copytest{}\n\tDeepCopy(&ctd, &ct)\n\ttr.Leave()\n\n\tfmt.Print(cp)\n\n\tDeepCopy(&ct, &ct)\n}\n"
  },
  {
    "path": "zero/utils/work_chain.go",
    "content": "package utils\n\nimport (\n\t\"runtime\"\n)\n\ntype WorkResult struct {\n\te error\n\tw Runner\n}\n\ntype WorkChain struct {\n\tabort   chan struct{}\n\tresults chan *WorkResult\n}\n\nfunc (self *WorkChain) Release() {\n\tclose(self.abort)\n}\n\ntype Runner interface {\n\tRun() error\n}\n\nfunc NewWorkChain(runners []Runner) (ret *WorkChain) {\n\n\tret = &WorkChain{}\n\tret.abort = make(chan struct{})\n\n\tif len(runners) == 0 {\n\t\treturn\n\t}\n\n\t// Spawn as many workers as allowed threads\n\tworkers := runtime.GOMAXPROCS(0)\n\tif len(runners) < workers {\n\t\tworkers = len(runners)\n\t}\n\n\t// Create a task channel and spawn the verifiers\n\tvar (\n\t\tinputs = make(chan int)\n\t\tdone   = make(chan int, workers)\n\t\terrors = make([]*WorkResult, len(runners))\n\t)\n\tfor i := 0; i < workers; i++ {\n\t\tgo func() {\n\t\t\tfor index := range inputs {\n\t\t\t\trunner := runners[index]\n\t\t\t\terrors[index] = &WorkResult{runner.Run(), runner}\n\t\t\t\tdone <- index\n\t\t\t}\n\t\t}()\n\t}\n\n\tret.results = make(chan *WorkResult, len(runners))\n\tgo func() {\n\t\tdefer close(inputs)\n\t\tvar (\n\t\t\tin, out = 0, 0\n\t\t\tchecked = make([]bool, len(runners))\n\t\t\tinputs  = inputs\n\t\t)\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase inputs <- in:\n\t\t\t\tif in++; in == len(runners) {\n\t\t\t\t\t// Reached end of headers. Stop sending to workers.\n\t\t\t\t\tinputs = nil\n\t\t\t\t}\n\t\t\tcase index := <-done:\n\t\t\t\tfor checked[index] = true; checked[out]; out++ {\n\t\t\t\t\tret.results <- errors[out]\n\t\t\t\t\tif out == len(runners)-1 {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase <-ret.abort:\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\treturn\n}\n"
  },
  {
    "path": "zero/wallet/exchange/exchange.go",
    "content": "package exchange\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/common/address\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/robfig/cron\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/types\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n)\n\ntype Account struct {\n\twallet        accounts.Wallet\n\tpk            *c_type.Uint512\n\ttk            *c_type.Tk\n\tskr           c_type.PKr\n\tmainPkr       c_type.PKr\n\tbalancePkr    *c_type.PKr\n\tbalances      map[string]*big.Int\n\ttickets       map[string][]*common.Hash\n\tutxoNums      map[string]uint64\n\tisChanged     bool\n\tnextMergeTime time.Time\n\tversion       int\n}\n\ntype PkrAccount struct {\n\tPkr      c_type.PKr\n\tbalances map[string]*big.Int\n\tnum      uint64\n}\n\ntype UtxoList []Utxo\n\nfunc (list UtxoList) Len() int {\n\treturn len(list)\n}\n\nfunc (list UtxoList) Swap(i, j int) {\n\tlist[i], list[j] = list[j], list[i]\n}\n\nfunc (list UtxoList) Less(i, j int) bool {\n\tif list[i].flag == list[j].flag {\n\t\treturn list[i].Asset.Tkn.Value.ToIntRef().Cmp(list[j].Asset.Tkn.Value.ToIntRef()) < 0\n\t} else {\n\t\treturn list[i].flag < list[j].flag\n\t}\n}\n\nfunc (list UtxoList) Roots() (roots prepare.Utxos) {\n\tfor _, utxo := range list {\n\t\troots = append(roots, prepare.Utxo{utxo.Root, utxo.Asset})\n\t}\n\treturn\n}\n\ntype (\n\tHandleUtxoFunc func(utxo Utxo)\n)\n\ntype PkKey struct {\n\tkey c_type.Uint512\n\tNum uint64\n}\n\ntype PkrKey struct {\n\tpkr c_type.PKr\n\tnum uint64\n}\n\ntype FetchJob struct {\n\tstart    uint64\n\taccounts []Account\n}\n\ntype Exchange struct {\n\tdb             *serodb.LDBDatabase\n\ttxPool         *core.TxPool\n\taccountManager *accounts.Manager\n\n\taccounts    sync.Map\n\tpkrAccounts sync.Map\n\n\tusedFlag sync.Map\n\tnumbers  sync.Map\n\n\tfeed    event.Feed\n\tupdater event.Subscription        // Wallet update subscriptions for all backends\n\tupdate  chan accounts.WalletEvent // Subscription sink for backend wallet changes\n\tquit    chan chan error\n\tlock    sync.RWMutex\n}\n\nvar current_exchange *Exchange\n\nfunc CurrentExchange() *Exchange {\n\treturn current_exchange\n}\n\nfunc NewExchange(dbpath string, txPool *core.TxPool, accountManager *accounts.Manager, autoMerge bool) (exchange *Exchange) {\n\n\tupdate := make(chan accounts.WalletEvent, 1)\n\tupdater := accountManager.Subscribe(update)\n\n\texchange = &Exchange{\n\t\ttxPool:         txPool,\n\t\taccountManager: accountManager,\n\t\tupdate:         update,\n\t\tupdater:        updater,\n\t}\n\tcurrent_exchange = exchange\n\n\tdb, err := serodb.NewLDBDatabase(dbpath, 1024, 1024)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\texchange.db = db\n\n\texchange.numbers = sync.Map{}\n\texchange.accounts = sync.Map{}\n\tfor _, w := range accountManager.Wallets() {\n\t\texchange.initWallet(w)\n\t}\n\n\texchange.pkrAccounts = sync.Map{}\n\texchange.usedFlag = sync.Map{}\n\n\tAddJob(\"0/10 * * * * ?\", exchange.fetchBlockInfo)\n\n\tif autoMerge {\n\t\tAddJob(\"0 0/5 * * * ?\", exchange.merge)\n\t}\n\n\tgo exchange.updateAccount()\n\tlog.Info(\"Init NewExchange success\")\n\treturn\n}\n\nfunc (self *Exchange) initWallet(w accounts.Wallet) {\n\n\tif _, ok := self.accounts.Load(w.Accounts()[0].GetPk()); !ok {\n\t\taccount := Account{}\n\t\taccount.wallet = w\n\t\taccount.pk = w.Accounts()[0].GetPk().NewRef()\n\t\taccount.tk = w.Accounts()[0].Tk.ToTk().NewRef()\n\t\tcopy(account.skr[:], account.tk[:])\n\t\taccount.mainPkr = w.Accounts()[0].GetDefaultPkr(1)\n\t\taccount.isChanged = true\n\t\taccount.nextMergeTime = time.Now()\n\t\taccount.version = w.Accounts()[0].Version\n\t\tself.accounts.Store(*account.pk, &account)\n\t\tbalancePkr := self.getBalancePkr(account.pk)\n\t\tif balancePkr != nil {\n\t\t\tif superzk.IsMyPKr(account.tk, balancePkr) {\n\t\t\t\taccount.balancePkr = balancePkr\n\t\t\t}\n\t\t}\n\n\t\tif num := self.starNum(account.pk); num > w.Accounts()[0].At {\n\t\t\tself.numbers.Store(*account.pk, num)\n\t\t} else {\n\t\t\tself.numbers.Store(*account.pk, w.Accounts()[0].At)\n\t\t}\n\n\t\tlog.Info(\"Add PK\", \"pk\", w.Accounts()[0].Address, \"At\", self.GetCurrencyNumber(*account.pk))\n\t}\n}\n\nfunc (self *Exchange) starNum(pk *c_type.Uint512) uint64 {\n\tvalue, err := self.db.Get(numKey(*pk))\n\tif err != nil {\n\t\treturn 0\n\t}\n\treturn utils.DecodeNumber(value)\n}\n\nfunc (self *Exchange) getBalancePkr(pk *c_type.Uint512) *c_type.PKr {\n\tvalue, err := self.db.Get(balancPkrKey(*pk))\n\tif err != nil {\n\t\treturn nil\n\t}\n\tvar pkr c_type.PKr\n\terr = rlp.DecodeBytes(value, &pkr)\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn &pkr\n}\n\nfunc (self *Exchange) putBalancePkr(pk *c_type.Uint512, pkr c_type.PKr) error {\n\tdata, err := rlp.EncodeToBytes(&pkr)\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = self.db.Put(balancPkrKey(*pk), data)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (self *Exchange) SetBalancePkr(pk *c_type.Uint512, pkr c_type.PKr) error {\n\n\terr := self.putBalancePkr(pk, pkr)\n\tif err != nil {\n\t\treturn err\n\t}\n\tvalue, ok := self.accounts.Load(*pk)\n\tif !ok {\n\t\treturn errors.New(\"account not exists\")\n\t}\n\taccount := value.(*Account)\n\taccount.balancePkr = &pkr\n\tself.accounts.Store(pk, account)\n\treturn nil\n}\n\nfunc (self *Exchange) updateAccount() {\n\t// Close all subscriptions when the manager terminates\n\tdefer func() {\n\t\tself.lock.Lock()\n\t\tself.updater.Unsubscribe()\n\t\tself.updater = nil\n\t\tself.lock.Unlock()\n\t}()\n\n\t// Loop until termination\n\tfor {\n\t\tselect {\n\t\tcase event := <-self.update:\n\t\t\t// Wallet event arrived, update local cache\n\t\t\tself.lock.Lock()\n\t\t\tswitch event.Kind {\n\t\t\tcase accounts.WalletArrived:\n\t\t\t\t// wallet := event.Wallet\n\t\t\t\tself.initWallet(event.Wallet)\n\t\t\tcase accounts.WalletDropped:\n\t\t\t\taddress := event.Wallet.Accounts()[0].Address\n\t\t\t\tself.numbers.Delete(address.ToUint512())\n\t\t\t}\n\t\t\tself.lock.Unlock()\n\n\t\tcase errc := <-self.quit:\n\t\t\t// Manager terminating, return\n\t\t\terrc <- nil\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *Exchange) GetUtxoNum(pk c_type.Uint512) map[string]uint64 {\n\tif account := self.getAccountByPk(pk); account != nil {\n\t\treturn account.utxoNums\n\t}\n\treturn map[string]uint64{}\n}\n\nfunc (self *Exchange) GetRootByNil(Nil c_type.Uint256) (root *c_type.Uint256) {\n\tdata, err := self.db.Get(nilToRootKey(Nil))\n\tif err != nil {\n\t\treturn\n\t}\n\troot = &c_type.Uint256{}\n\tcopy(root[:], data[:])\n\treturn\n}\n\nfunc (self *Exchange) GetCurrencyNumber(pk c_type.Uint512) uint64 {\n\tvalue, ok := self.numbers.Load(pk)\n\tif !ok {\n\t\treturn 0\n\t}\n\tif value.(uint64) == 0 {\n\t\treturn value.(uint64)\n\t}\n\treturn value.(uint64) - 1\n}\n\nfunc (self *Exchange) GetPkr(pk *c_type.Uint512, index *c_type.Uint256) (pkr c_type.PKr, err error) {\n\tif index == nil {\n\t\treturn pkr, errors.New(\"index must not be empty\")\n\t}\n\tif new(big.Int).SetBytes(index[:]).Cmp(big.NewInt(100)) < 0 {\n\t\treturn pkr, errors.New(\"index must > 100\")\n\t}\n\tif value, ok := self.accounts.Load(*pk); !ok {\n\t\treturn pkr, errors.New(\"not found Pk\")\n\t} else {\n\t\tacc := value.(*Account)\n\t\treturn acc.wallet.Accounts()[0].GetPkr(index), nil\n\n\t}\n\n}\n\nfunc (self *Exchange) ClearUsedFlagForPK(pk *c_type.Uint512) (count int) {\n\tif _, ok := self.accounts.Load(*pk); ok {\n\t\tprefix := append(pkPrefix, pk[:]...)\n\t\titerator := self.db.NewIteratorWithPrefix(prefix)\n\n\t\tfor iterator.Next() {\n\t\t\tkey := iterator.Key()\n\t\t\tvar root c_type.Uint256\n\t\t\tcopy(root[:], key[98:130])\n\t\t\tif _, flag := self.usedFlag.Load(root); flag {\n\t\t\t\tself.usedFlag.Delete(root)\n\t\t\t\tcount++\n\t\t\t}\n\t\t}\n\t\titerator.Release()\n\t}\n\treturn\n}\n\nfunc (self *Exchange) ClearUsedFlagForRoot(root c_type.Uint256) (count int) {\n\tif _, flag := self.usedFlag.Load(root); flag {\n\t\tself.usedFlag.Delete(root)\n\t\tcount++\n\t}\n\treturn\n}\n\nfunc (self *Exchange) GetLockedBalances(pk c_type.Uint512) (balances map[string]*big.Int) {\n\tif _, ok := self.accounts.Load(pk); ok {\n\t\tprefix := append(pkPrefix, pk[:]...)\n\t\titerator := self.db.NewIteratorWithPrefix(prefix)\n\t\tbalances = map[string]*big.Int{}\n\n\t\tfor iterator.Next() {\n\t\t\tkey := iterator.Key()\n\t\t\tvar root c_type.Uint256\n\t\t\tcopy(root[:], key[98:130])\n\t\t\tif utxo, err := self.getUtxo(root); err == nil {\n\t\t\t\tif utxo.Asset.Tkn != nil {\n\t\t\t\t\tcurrency := common.BytesToString(utxo.Asset.Tkn.Currency[:])\n\t\t\t\t\tif _, flag := self.usedFlag.Load(utxo.Root); flag {\n\t\t\t\t\t\tif amount, ok := balances[currency]; ok {\n\t\t\t\t\t\t\tamount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbalances[currency] = new(big.Int).Set(utxo.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrency_locked_key := currency + \"_locked\"\n\t\t\t\t\t\tif amount, ok := balances[currency_locked_key]; ok {\n\t\t\t\t\t\t\tamount.Add(amount, big.NewInt(1))\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbalances[currency_locked_key] = big.NewInt(1)\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\t\titerator.Release()\n\t\treturn balances\n\t}\n\treturn\n}\n\nfunc (self *Exchange) GetMaxAvailable(pk c_type.Uint512, currency string) (amount *big.Int) {\n\tcurrency = strings.ToUpper(currency)\n\tprefix := append(pkPrefix, append(pk[:], common.LeftPadBytes([]byte(currency), 32)...)...)\n\titerator := self.db.NewIteratorWithPrefix(prefix)\n\n\tamount = new(big.Int)\n\tcount := 0\n\tfor iterator.Next() {\n\t\tkey := iterator.Key()\n\t\tvar root c_type.Uint256\n\t\tcopy(root[:], key[98:130])\n\n\t\tif utxo, err := self.getUtxo(root); err == nil {\n\t\t\tif utxo.Ignore {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, flag := self.usedFlag.Load(utxo.Root); !flag {\n\t\t\t\tif utxo.Asset.Tkn != nil {\n\t\t\t\t\tif utxo.IsZ {\n\t\t\t\t\t\tamount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif count < 2500 {\n\t\t\t\t\t\t\tamount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\t\t\tcount++\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\t}\n\titerator.Release()\n\treturn\n}\n\nfunc (self *Exchange) IgnorePkrUtxos(pkr c_type.PKr, ignore bool) (utxos []Utxo, e error) {\n\taccount := self.getAccountByPkr(pkr)\n\tif account == nil {\n\t\te = errors.New(\"not found PK by pkr\")\n\t\treturn\n\t}\n\tpk := account.pk\n\n\tprefix := append(pkPrefix, pk[:]...)\n\titerator := self.db.NewIteratorWithPrefix(prefix)\n\tfor iterator.Next() {\n\t\tkey := iterator.Key()\n\t\tvar root c_type.Uint256\n\t\tcopy(root[:], key[98:130])\n\t\tif utxo, err := self.getUtxo(root); err == nil {\n\t\t\tif utxo.Pkr == pkr {\n\t\t\t\tutxos = append(utxos, utxo)\n\t\t\t}\n\t\t} else {\n\t\t\te = err\n\t\t\titerator.Release()\n\t\t\treturn\n\t\t}\n\t}\n\titerator.Release()\n\n\tif len(utxos) > 0 {\n\t\tbatch := self.db.NewBatch()\n\t\tfor _, utxo := range utxos {\n\t\t\tutxo.Ignore = ignore\n\t\t\tif bs, err := rlp.EncodeToBytes(&utxo); err == nil {\n\t\t\t\tif err := batch.Put(rootKey(utxo.Root), bs); err != nil {\n\t\t\t\t\te = err\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\te = err\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif e = batch.Write(); e != nil {\n\t\t\treturn\n\t\t}\n\t\taccount.isChanged = true\n\t}\n\treturn\n\n}\n\nfunc (self *Exchange) GetBalances(pk c_type.Uint512) (balances map[string]*big.Int, tickets map[string][]*common.Hash) {\n\tif value, ok := self.accounts.Load(pk); ok {\n\t\taccount := value.(*Account)\n\t\tif account.isChanged {\n\t\t\tprefix := append(pkPrefix, pk[:]...)\n\t\t\titerator := self.db.NewIteratorWithPrefix(prefix)\n\t\t\tbalances = map[string]*big.Int{}\n\t\t\ttickets = make(map[string][]*common.Hash)\n\t\t\tutxoNums := map[string]uint64{}\n\t\t\tfor iterator.Next() {\n\t\t\t\tkey := iterator.Key()\n\t\t\t\tvar root c_type.Uint256\n\t\t\t\tcopy(root[:], key[98:130])\n\t\t\t\tif utxo, err := self.getUtxo(root); err == nil {\n\t\t\t\t\tif utxo.Ignore {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif utxo.Asset.Tkn != nil {\n\t\t\t\t\t\tcurrency := common.BytesToString(utxo.Asset.Tkn.Currency[:])\n\t\t\t\t\t\tif amount, ok := balances[currency]; ok {\n\t\t\t\t\t\t\tamount.Add(amount, utxo.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\t\t\tutxoNums[currency] += 1\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbalances[currency] = new(big.Int).Set(utxo.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\t\t\tutxoNums[currency] = 1\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif utxo.Asset.Tkt != nil {\n\t\t\t\t\t\tcategory := common.BytesToString(utxo.Asset.Tkt.Category[:])\n\t\t\t\t\t\tticket := common.BytesToHash(utxo.Asset.Tkt.Value[:])\n\t\t\t\t\t\tif _, ok := tickets[category]; ok {\n\t\t\t\t\t\t\ttickets[category] = append(tickets[category], &ticket)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttickets[category] = []*common.Hash{&ticket}\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\titerator.Release()\n\t\t\taccount.balances = balances\n\t\t\taccount.tickets = tickets\n\t\t\taccount.utxoNums = utxoNums\n\t\t\taccount.isChanged = false\n\t\t} else {\n\t\t\treturn account.balances, account.tickets\n\t\t}\n\t}\n\n\treturn\n}\n\ntype BlockInfo struct {\n\tNum  uint64\n\tHash c_type.Uint256\n\tIns  []c_type.Uint256\n\tOuts []Utxo\n}\n\nfunc (self *Exchange) GetBlocksInfo(start, end uint64) (blocks []BlockInfo, err error) {\n\titerator := self.db.NewIteratorWithPrefix(blockPrefix)\n\tfor ok := iterator.Seek(blockKey(start)); ok; ok = iterator.Next() {\n\t\tkey := iterator.Key()\n\t\tnum := utils.DecodeNumber(key[5:13])\n\t\tif num >= end {\n\t\t\tbreak\n\t\t}\n\n\t\tvar block BlockInfo\n\t\tif err = rlp.Decode(bytes.NewReader(iterator.Value()), &block); err != nil {\n\t\t\tlog.Error(\"Exchange Invalid block RLP\", \"Num\", num, \"err\", err)\n\t\t\titerator.Release()\n\t\t\treturn\n\t\t}\n\t\tblocks = append(blocks, block)\n\t}\n\titerator.Release()\n\treturn\n}\n\nfunc (self *Exchange) GetRecordsByTxHash(txHash c_type.Uint256) (records []Utxo, err error) {\n\tdata, err := self.db.Get(txKey(txHash))\n\tif err != nil {\n\t\treturn\n\t}\n\tif err = rlp.Decode(bytes.NewReader(data), &records); err != nil {\n\t\tlog.Error(\"Invalid utxos RLP\", \"txHash\", common.Bytes2Hex(txHash[:]), \"err\", err)\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (self *Exchange) GetRecordsByPk(pk *c_type.Uint512, begin, end uint64) (records []Utxo, err error) {\n\terr = self.iteratorUtxo(pk, begin, end, func(utxo Utxo) {\n\t\trecords = append(records, utxo)\n\t})\n\treturn\n}\n\nfunc (self *Exchange) GetRecordsByPkr(pkr c_type.PKr, begin, end uint64) (records []Utxo, err error) {\n\taccount := self.getAccountByPkr(pkr)\n\tif account == nil {\n\t\terr = errors.New(\"not found PK by pkr\")\n\t\treturn\n\t}\n\tpk := account.pk\n\n\terr = self.iteratorUtxo(pk, begin, end, func(utxo Utxo) {\n\t\tif pkr != utxo.Pkr {\n\t\t\treturn\n\t\t}\n\t\trecords = append(records, utxo)\n\t})\n\treturn\n}\n\nfunc (self *Exchange) GenTxWithSign(param prepare.PreTxParam) (pretx *txtool.GTxParam, tx *txtool.GTx, e error) {\n\tif self == nil {\n\t\te = errors.New(\"exchange instance is nil\")\n\t\treturn\n\t}\n\tvar roots prepare.Utxos\n\tif roots, e = prepare.SelectUtxos(&param, self); e != nil {\n\t\treturn\n\t}\n\n\tvar account *Account\n\tif value, ok := self.accounts.Load(param.From); ok {\n\t\taccount = value.(*Account)\n\t} else {\n\t\te = errors.New(\"not found Pk\")\n\t\treturn\n\t}\n\n\tif param.RefundTo == nil {\n\t\tif param.RefundTo = self.DefaultRefundTo(&param.From); param.RefundTo == nil {\n\t\t\te = errors.New(\"can not find default refund to\")\n\t\t\treturn\n\t\t}\n\t}\n\n\tbparam := prepare.BeforeTxParam{\n\t\tparam.Fee,\n\t\t*param.GasPrice,\n\t\troots,\n\t\t*param.RefundTo,\n\t\tparam.Receptions,\n\t\tparam.Cmds,\n\t}\n\n\tif pretx, tx, e = self.genTx(account, &bparam); e != nil {\n\t\tlog.Error(\"Exchange genTx\", \"error\", e)\n\t\treturn\n\t}\n\ttx.Hash = tx.Tx.ToHash()\n\tlog.Info(\"Exchange genTx success\")\n\treturn\n}\n\nfunc (self *Exchange) getAccountByPk(pk c_type.Uint512) *Account {\n\tif value, ok := self.accounts.Load(pk); ok {\n\t\treturn value.(*Account)\n\t}\n\treturn nil\n}\n\nfunc (self *Exchange) getAccountByPkr(pkr c_type.PKr) (a *Account) {\n\tself.accounts.Range(func(pk, value interface{}) bool {\n\t\taccount := value.(*Account)\n\t\tif superzk.IsMyPKr(account.tk, &pkr) {\n\t\t\ta = account\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t})\n\treturn\n}\n\nfunc (self *Exchange) ClearTxParam(txParam *txtool.GTxParam) (count int) {\n\tif self == nil {\n\t\treturn\n\t}\n\tif txParam == nil {\n\t\treturn\n\t}\n\tfor _, in := range txParam.Ins {\n\t\tcount += self.ClearUsedFlagForRoot(in.Out.Root)\n\t}\n\treturn\n}\n\nfunc (self *Exchange) genTx(account *Account, param *prepare.BeforeTxParam) (txParam *txtool.GTxParam, tx *txtool.GTx, e error) {\n\tif txParam, e = self.buildTxParam(param); e != nil {\n\t\treturn\n\t}\n\n\tvar seed *address.Seed\n\tif seed, e = account.wallet.GetSeed(); e != nil {\n\t\tself.ClearTxParam(txParam)\n\t\treturn\n\t}\n\n\tsk := superzk.Seed2Sk(seed.SeedToUint256(), account.version)\n\tgtx, err := flight.SignTx(&sk, txParam)\n\tif err != nil {\n\t\tself.ClearTxParam(txParam)\n\t\te = err\n\t\treturn\n\t} else {\n\t\ttx = &gtx\n\t\treturn\n\t}\n}\n\nfunc (self *Exchange) commitTx(tx *txtool.GTx) (err error) {\n\tgasPrice := big.Int(tx.GasPrice)\n\tgas := uint64(tx.Gas)\n\tsignedTx := types.NewTxWithGTx(gas, &gasPrice, &tx.Tx)\n\tlog.Info(\"Exchange commitTx\", \"txhash\", signedTx.Hash().String())\n\terr = self.txPool.AddLocal(signedTx)\n\treturn err\n}\n\nfunc (self *Exchange) iteratorUtxo(Pk *c_type.Uint512, begin, end uint64, handler HandleUtxoFunc) (e error) {\n\tvar pk c_type.Uint512\n\tif Pk != nil {\n\t\tpk = *Pk\n\t}\n\titerator := self.db.NewIteratorWithPrefix(utxoPrefix)\n\tfor ok := iterator.Seek(utxoKey(begin, pk)); ok; ok = iterator.Next() {\n\t\tkey := iterator.Key()\n\t\tnum := utils.DecodeNumber(key[4:12])\n\t\tif num >= end {\n\t\t\tbreak\n\t\t}\n\t\tcopy(pk[:], key[12:76])\n\n\t\tif Pk != nil && *Pk != pk {\n\t\t\tcontinue\n\t\t}\n\n\t\tvalue := iterator.Value()\n\t\troots := []c_type.Uint256{}\n\t\tif err := rlp.Decode(bytes.NewReader(value), &roots); err != nil {\n\t\t\tlog.Error(\"Invalid roots RLP\", \"accoutKey\", common.Bytes2Hex(pk[:]), \"blockNumber\", num, \"err\", err)\n\t\t\te = err\n\t\t\titerator.Release()\n\t\t\treturn\n\t\t}\n\t\tfor _, root := range roots {\n\t\t\tif utxo, err := self.getUtxo(root); err != nil {\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\thandler(utxo)\n\t\t\t}\n\t\t}\n\t}\n\titerator.Release()\n\n\treturn\n}\n\nvar ignorePKr = common.Base58ToAddress(\"i3zesDa26i7jAtkR2fBYBeZsoQ7NAJxQNCsbgwvaWap3HVDGmvzsQSLqTZRyadswzBoC4edWYJzejyY6AXVhGkcqFYVvVPH1w5vHfvbazp1ReQ5Wa9qi15UPAwztrxe9oJQ\").ToPKr()\n\nfunc (self *Exchange) getUtxo(root c_type.Uint256) (utxo Utxo, e error) {\n\tdata, err := self.db.Get(rootKey(root))\n\tif err != nil {\n\t\treturn\n\t}\n\tif err := rlp.Decode(bytes.NewReader(data), &utxo); err != nil {\n\t\tlog.Error(\"Exchange Invalid utxo RLP\", \"root\", common.Bytes2Hex(root[:]), \"err\", err)\n\t\te = err\n\t\treturn\n\t}\n\n\tif utxo.Pkr == *ignorePKr {\n\t\tutxo.Ignore = true\n\t}\n\n\tif value, ok := self.usedFlag.Load(utxo.Root); ok {\n\t\tutxo.flag = value.(int)\n\t}\n\treturn\n}\n\nfunc (self *Exchange) findUtxosByTicket(pk *c_type.Uint512, tickets []assets.Ticket) (utxos []Utxo, remain map[c_type.Uint256]c_type.Uint256) {\n\tremain = map[c_type.Uint256]c_type.Uint256{}\n\tfor _, ticket := range tickets {\n\t\tremain[ticket.Value] = ticket.Category\n\t\tprefix := append(pkPrefix, append(pk[:], ticket.Value[:]...)...)\n\t\titerator := self.db.NewIteratorWithPrefix(prefix)\n\t\tif iterator.Next() {\n\t\t\tkey := iterator.Key()\n\t\t\tvar root c_type.Uint256\n\t\t\tcopy(root[:], key[98:130])\n\n\t\t\tif utxo, err := self.getUtxo(root); err == nil {\n\t\t\t\tif utxo.Ignore {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif utxo.Asset.Tkt != nil && utxo.Asset.Tkt.Category == ticket.Category {\n\t\t\t\t\tif _, ok := self.usedFlag.Load(utxo.Root); !ok {\n\t\t\t\t\t\tutxos = append(utxos, utxo)\n\t\t\t\t\t\tdelete(remain, ticket.Value)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\titerator.Release()\n\t}\n\treturn\n}\n\nfunc (self *Exchange) findUtxos(pk *c_type.Uint512, currency string, amount *big.Int) (utxos []Utxo, remain *big.Int) {\n\tremain = new(big.Int).Set(amount)\n\n\tcurrency = strings.ToUpper(currency)\n\tprefix := append(pkPrefix, append(pk[:], common.LeftPadBytes([]byte(currency), 32)...)...)\n\titerator := self.db.NewIteratorWithPrefix(prefix)\n\n\tfor iterator.Next() {\n\t\tkey := iterator.Key()\n\t\tvar root c_type.Uint256\n\t\tcopy(root[:], key[98:130])\n\n\t\tif utxo, err := self.getUtxo(root); err == nil {\n\t\t\tif utxo.Ignore {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif utxo.Asset.Tkn != nil {\n\t\t\t\tif _, ok := self.usedFlag.Load(utxo.Root); !ok {\n\t\t\t\t\tutxos = append(utxos, utxo)\n\t\t\t\t\tremain.Sub(remain, utxo.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t\tif remain.Sign() <= 0 {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\titerator.Release()\n\treturn\n}\n\nfunc DecOuts(outs []txtool.Out, skr *c_type.PKr) (douts []txtool.DOut) {\n\ttk := c_type.Tk{}\n\tcopy(tk[:], skr[:])\n\ttdouts := flight.DecOut(&tk, outs)\n\tfor _, tdout := range tdouts {\n\t\tot := txtool.DOut{\n\t\t\tAsset: tdout.Asset,\n\t\t\tMemo:  tdout.Memo,\n\t\t}\n\t\tif len(tdout.Nils) > 0 {\n\t\t\tot.Nil = tdout.Nils[0]\n\t\t}\n\t\tdouts = append(douts, ot)\n\t}\n\treturn\n}\n\ntype uint64Slice []uint64\n\nfunc (c uint64Slice) Len() int {\n\treturn len(c)\n}\nfunc (c uint64Slice) Swap(i, j int) {\n\tc[i], c[j] = c[j], c[i]\n}\nfunc (c uint64Slice) Less(i, j int) bool {\n\treturn c[i] < c[j]\n}\n\nvar fetchCount = uint64(5000)\n\nfunc (self *Exchange) fetchBlockInfo() {\n\tif txtool.Ref_inst.Bc == nil || !txtool.Ref_inst.Bc.IsValid() {\n\t\treturn\n\t}\n\tfor {\n\t\tindexs := map[uint64][]c_type.Uint512{}\n\t\torders := uint64Slice{}\n\t\tself.numbers.Range(func(key, value interface{}) bool {\n\t\t\tpk := key.(c_type.Uint512)\n\t\t\tnum := value.(uint64)\n\t\t\tif list, ok := indexs[num]; ok {\n\t\t\t\tindexs[num] = append(list, pk)\n\t\t\t} else {\n\t\t\t\tindexs[num] = []c_type.Uint512{pk}\n\t\t\t\torders = append(orders, num)\n\t\t\t}\n\t\t\treturn true\n\t\t})\n\t\tif orders.Len() == 0 {\n\t\t\treturn\n\t\t}\n\n\t\tsort.Sort(orders)\n\t\tstart := orders[0]\n\t\tend := start + fetchCount\n\t\tif orders.Len() > 1 {\n\t\t\tend = orders[1]\n\t\t}\n\n\t\taccountKeys := indexs[start]\n\t\tfor end > start {\n\t\t\tcount := fetchCount\n\t\t\tif end-start < fetchCount {\n\t\t\t\tcount = end - start\n\t\t\t}\n\t\t\tif count == 0 {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif self.fetchAndIndexUtxo(start, count, accountKeys) < int(count) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tstart += count\n\t\t}\n\t}\n}\n\nfunc (self *Exchange) fetchAndIndexUtxo(start, countBlock uint64, pks []c_type.Uint512) (count int) {\n\n\tblocks, err := flight.SRI_Inst.GetBlocksInfo(start, countBlock)\n\tif err != nil {\n\t\tlog.Info(\"Exchange GetBlocksInfo\", \"error\", err)\n\t\treturn\n\t}\n\n\tif len(blocks) == 0 {\n\t\treturn\n\t}\n\n\tutxosMap := map[PkKey][]Utxo{}\n\tnilsMap := map[c_type.Uint256]Utxo{}\n\tnils := []c_type.Uint256{}\n\tblockMap := map[uint64]*BlockInfo{}\n\tfor _, block := range blocks {\n\t\tnum := uint64(block.Num)\n\t\tutxos := []Utxo{}\n\t\tfor _, out := range block.Outs {\n\t\t\tpkr := out.State.OS.ToPKr()\n\n\t\t\tif pkr == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\taccount, ok := self.ownPkr(pks, *pkr)\n\t\t\t// log.Info(\"index\", \">>>>\", account.wallet.Accounts()[0].Address.String())\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tkey := PkKey{key: *account.pk, Num: out.State.Num}\n\t\t\tdout := DecOuts([]txtool.Out{out}, &account.skr)[0]\n\n\t\t\tif dout.Nil == c_type.Empty_Uint256 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tutxo := Utxo{Pkr: *pkr, Root: out.Root, Nil: dout.Nil, TxHash: out.State.TxHash, Num: out.State.Num, Asset: dout.Asset, IsZ: out.State.OS.IsZero()}\n\t\t\tnilsMap[utxo.Root] = utxo\n\t\t\tnilsMap[utxo.Nil] = utxo\n\n\t\t\tif list, ok := utxosMap[key]; ok {\n\t\t\t\tutxosMap[key] = append(list, utxo)\n\t\t\t} else {\n\t\t\t\tutxosMap[key] = []Utxo{utxo}\n\t\t\t}\n\t\t\tutxos = append(utxos, utxo)\n\t\t}\n\n\t\tif len(utxos) > 0 {\n\t\t\tblockMap[num] = &BlockInfo{Num: num, Hash: block.Hash, Outs: utxos}\n\t\t}\n\n\t\tif len(block.Nils) > 0 {\n\t\t\troots := []c_type.Uint256{}\n\t\t\tfor _, Nil := range block.Nils {\n\t\t\t\tvar utxo Utxo\n\t\t\t\tif value, ok := nilsMap[Nil]; ok {\n\t\t\t\t\tutxo = value\n\t\t\t\t} else {\n\t\t\t\t\tvalue, _ := self.db.Get(nilKey(Nil))\n\t\t\t\t\tif value != nil {\n\t\t\t\t\t\tvar root c_type.Uint256\n\t\t\t\t\t\tcopy(root[:], value[98:130])\n\n\t\t\t\t\t\tif utxo, err = self.getUtxo(root); err != nil {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar pk c_type.Uint512\n\t\t\t\t\t\t\tcopy(pk[:], value[2:66])\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnils = append(nils, Nil)\n\t\t\t\troots = append(roots, utxo.Root)\n\t\t\t}\n\t\t\tif len(roots) > 0 {\n\t\t\t\tif blockInfo, ok := blockMap[num]; ok {\n\t\t\t\t\tblockInfo.Ins = roots\n\t\t\t\t} else {\n\t\t\t\t\tblockMap[num] = &BlockInfo{Num: num, Hash: block.Hash, Ins: roots}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tbatch := self.db.NewBatch()\n\n\tself.indexPkgs(pks, batch, blocks)\n\n\tvar roots []c_type.Uint256\n\tif len(utxosMap) > 0 || len(nils) > 0 {\n\t\tif roots, err = self.indexBlocks(batch, utxosMap, blockMap, nils); err != nil {\n\t\t\tlog.Error(\"indexBlocks \", \"error\", err)\n\t\t\treturn\n\t\t}\n\t}\n\n\tcount = len(blocks)\n\tnum := uint64(blocks[count-1].Num) + 1\n\t// \"NUM\"+PK  => Num\n\tdata := utils.EncodeNumber(num)\n\tfor _, pk := range pks {\n\t\tbatch.Put(numKey(pk), data)\n\t}\n\n\terr = batch.Write()\n\tif err == nil {\n\t\tfor _, pk := range pks {\n\t\t\tself.numbers.Store(pk, num)\n\t\t}\n\t}\n\n\tfor _, root := range roots {\n\t\tself.usedFlag.Delete(root)\n\t}\n\tlog.Info(\"Exchange indexed\", \"blockNumber\", num-1)\n\treturn\n}\n\nfunc (self *Exchange) indexBlocks(batch serodb.Batch, utxosMap map[PkKey][]Utxo, blockMap map[uint64]*BlockInfo, nils []c_type.Uint256) (delRoots []c_type.Uint256, err error) {\n\tops := map[string]string{}\n\n\tfor num, blockInfo := range blockMap {\n\t\tdata, e := rlp.EncodeToBytes(&blockInfo)\n\t\tif e != nil {\n\t\t\terr = e\n\t\t\treturn\n\t\t}\n\t\tbatch.Put(blockKey(num), data)\n\t}\n\n\ttxMap := map[c_type.Uint256][]Utxo{}\n\tfor key, list := range utxosMap {\n\t\troots := []c_type.Uint256{}\n\t\tfor _, utxo := range list {\n\t\t\tdata, e := rlp.EncodeToBytes(&utxo)\n\t\t\tif e != nil {\n\t\t\t\terr = e\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// \"ROOT\" + root\n\t\t\tbatch.Put(rootKey(utxo.Root), data)\n\t\t\t// nil => root\n\t\t\tbatch.Put(nilToRootKey(utxo.Nil), utxo.Root[:])\n\n\t\t\tvar pkKeys []byte\n\t\t\tif utxo.Asset.Tkn != nil {\n\t\t\t\t// \"PK\" + PK + currency + root\n\t\t\t\tpkKey := utxoPkKey(key.key, utxo.Asset.Tkn.Currency[:], &utxo.Root)\n\t\t\t\tops[common.Bytes2Hex(pkKey)] = common.Bytes2Hex([]byte{0})\n\t\t\t\tpkKeys = append(pkKeys, pkKey...)\n\t\t\t}\n\n\t\t\tif utxo.Asset.Tkt != nil {\n\t\t\t\t// \"PK\" + PK + tkt + root\n\t\t\t\tpkKey := utxoPkKey(key.key, utxo.Asset.Tkt.Value[:], &utxo.Root)\n\t\t\t\tops[common.Bytes2Hex(pkKey)] = common.Bytes2Hex([]byte{0})\n\t\t\t\tpkKeys = append(pkKeys, pkKey...)\n\t\t\t}\n\t\t\t// \"PK\" + PK + currency + root => 0\n\n\t\t\t// \"NIL\" + PK + tkt + root => \"PK\" + PK + currency + root\n\t\t\tnilkey := nilKey(utxo.Nil)\n\t\t\trootkey := nilKey(utxo.Root)\n\n\t\t\t// \"NIL\" +nil/root => pkKey\n\t\t\tops[common.Bytes2Hex(nilkey)] = common.Bytes2Hex(pkKeys)\n\t\t\tops[common.Bytes2Hex(rootkey)] = common.Bytes2Hex(pkKeys)\n\n\t\t\troots = append(roots, utxo.Root)\n\n\t\t\tif list, ok := txMap[utxo.TxHash]; ok {\n\t\t\t\ttxMap[utxo.TxHash] = append(list, utxo)\n\t\t\t} else {\n\t\t\t\ttxMap[utxo.TxHash] = []Utxo{utxo}\n\t\t\t}\n\n\t\t\t// log.Info(\"Index add\", \"PK\", base58.EncodeToString(key.PK[:]), \"Nil\", common.Bytes2Hex(utxo.Nil[:]), \"root\", common.Bytes2Hex(utxo.Root[:]), \"Value\", utxo.Asset.Tkn.Value)\n\t\t}\n\n\t\tdata, e := rlp.EncodeToBytes(&roots)\n\t\tif e != nil {\n\t\t\terr = e\n\t\t\treturn\n\t\t}\n\t\t// blockNumber + PK => [roots]\n\t\tbatch.Put(utxoKey(key.Num, key.key), data)\n\n\t\tif account := self.getAccountByPk(key.key); account != nil {\n\t\t\taccount.isChanged = true\n\t\t}\n\t}\n\n\tfor txHash, list := range txMap {\n\t\tkey := txKey(txHash)\n\t\tdata, e := self.db.Get(key)\n\t\tvar records []Utxo\n\t\tif e == nil {\n\t\t\tif e = rlp.Decode(bytes.NewReader(data), &records); e != nil {\n\t\t\t\terr = e\n\t\t\t\tlog.Error(\"Invalid utxos RLP\", \"txHash\", common.Bytes2Hex(txHash[:]), \"err\", e)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\trecords = append(records, list...)\n\t\tdata, err = rlp.EncodeToBytes(&records)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tbatch.Put(key, data)\n\t}\n\n\tfor _, Nil := range nils {\n\n\t\tvar pk c_type.Uint512\n\t\tkey := nilKey(Nil)\n\t\thex := common.Bytes2Hex(key)\n\t\tif value, ok := ops[hex]; ok {\n\t\t\tdelete(ops, hex)\n\t\t\tif len(value) == 260 {\n\t\t\t\tdelete(ops, value)\n\t\t\t} else {\n\t\t\t\tdelete(ops, value[0:260])\n\t\t\t\tdelete(ops, value[260:])\n\t\t\t}\n\n\t\t\tvar root c_type.Uint256\n\t\t\tcopy(root[:], value[98:130])\n\t\t\tdelete(ops, common.Bytes2Hex(nilKey(root)))\n\t\t\t// self.usedFlag.Delete(root)\n\t\t\tdelRoots = append(delRoots, root)\n\n\t\t\tcopy(pk[:], value[2:66])\n\t\t} else {\n\t\t\tvalue, _ := self.db.Get(key)\n\t\t\tif value != nil {\n\t\t\t\tif len(value) == 130 {\n\t\t\t\t\tbatch.Delete(value)\n\t\t\t\t} else {\n\t\t\t\t\tbatch.Delete(value[0:130])\n\t\t\t\t\tbatch.Delete(value[130:260])\n\t\t\t\t}\n\t\t\t\tbatch.Delete(nilKey(Nil))\n\n\t\t\t\tvar root c_type.Uint256\n\t\t\t\tcopy(root[:], value[98:130])\n\t\t\t\tbatch.Delete(nilKey(root))\n\t\t\t\t// self.usedFlag.Delete(root)\n\t\t\t\tdelRoots = append(delRoots, root)\n\n\t\t\t\tcopy(pk[:], value[2:66])\n\t\t\t}\n\t\t}\n\n\t\tif account := self.getAccountByPk(pk); account != nil {\n\t\t\taccount.isChanged = true\n\t\t}\n\t}\n\n\tfor key, value := range ops {\n\t\tbatch.Put(common.Hex2Bytes(key), common.Hex2Bytes(value))\n\t}\n\n\treturn\n}\n\nfunc (self *Exchange) ownPkr(pks []c_type.Uint512, pkr c_type.PKr) (account *Account, ok bool) {\n\tfor _, pk := range pks {\n\t\tvalue, ok := self.accounts.Load(pk)\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\taccount = value.(*Account)\n\t\tif account.balancePkr != nil {\n\t\t\tif pkr == *account.balancePkr {\n\t\t\t\treturn account, true\n\t\t\t}\n\t\t} else {\n\t\t\tif superzk.IsMyPKr(account.tk, &pkr) {\n\t\t\t\treturn account, true\n\t\t\t}\n\t\t}\n\n\t}\n\treturn\n}\n\ntype MergeUtxos struct {\n\tlist   UtxoList\n\tzcount int\n\tocount int\n\t//amount  big.Int\n\t//tickets map[c_type.Uint256]c_type.Uint256\n}\n\nvar default_fee_value = new(big.Int).Mul(big.NewInt(25000), big.NewInt(1000000000))\n\nfunc (self *Exchange) getMergeUtxos(from *c_type.Uint512, currency string, zcount int, left int, icount int) (mu MergeUtxos, e error) {\n\tif zcount > 400 {\n\t\te = errors.New(\"zout count must <= 400\")\n\t}\n\tif icount <= 0 {\n\t\ticount = 1000\n\t}\n\tck := assets.NewCKState(true, &assets.Token{utils.CurrencyToUint256(\"SERO\"), utils.U256(*default_fee_value)})\n\tprefix := utxoPkKey(*from, common.LeftPadBytes([]byte(currency), 32), nil)\n\titerator := self.db.NewIteratorWithPrefix(prefix)\n\toutxos := UtxoList{}\n\tzutxos := UtxoList{}\n\tfor iterator.Next() {\n\t\tkey := iterator.Key()\n\t\tvar root c_type.Uint256\n\t\tcopy(root[:], key[98:130])\n\n\t\tif utxo, err := self.getUtxo(root); err == nil {\n\t\t\tif utxo.Ignore {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif _, ok := self.usedFlag.Load(utxo.Root); !ok {\n\t\t\t\tif utxo.IsZ {\n\t\t\t\t\tzutxos = append(zutxos, utxo)\n\t\t\t\t} else {\n\t\t\t\t\toutxos = append(outxos, utxo)\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\tif zutxos.Len() >= zcount+left {\n\t\t\tbreak\n\t\t}\n\t\tif outxos.Len()+zutxos.Len() >= icount+left {\n\t\t\tbreak\n\t\t}\n\t}\n\titerator.Release()\n\tif outxos.Len() >= icount {\n\t\tzutxos = UtxoList{}\n\t}\n\tmu.ocount = outxos.Len()\n\tmu.zcount = zutxos.Len()\n\tutxos := append(zutxos, outxos...)\n\tif utxos.Len() <= left {\n\t\te = fmt.Errorf(\"no need to merge the account, utxo count == %v\", utxos.Len())\n\t\treturn\n\t}\n\tsort.Sort(utxos)\n\tmu.list = utxos[0 : utxos.Len()-(left-1)]\n\tfor _, utxo := range mu.list {\n\t\tck.AddIn(&utxo.Asset)\n\t}\n\n\tfor _, tkn := range ck.Tkns() {\n\t\tif utxos, r := self.findUtxos(from, utils.BytesToCurrency(tkn.Currency[:]), tkn.Value.ToInt()); r == nil || r.Sign() > 0 {\n\t\t\te = errors.New(\"No enough SERO coins for fee\")\n\t\t\treturn\n\t\t} else {\n\t\t\tmu.list = append(mu.list, utxos...)\n\t\t}\n\t}\n\treturn\n}\n\ntype MergeParam struct {\n\tFrom     c_type.Uint512\n\tTo       *c_type.PKr\n\tCurrency string\n\tZcount   uint64\n\tLeft     uint64\n\tIcount   uint64\n}\n\nfunc (self *Exchange) GenMergeTx(mp *MergeParam) (txParam *txtool.GTxParam, e error) {\n\taccount := self.getAccountByPk(mp.From)\n\tif account == nil {\n\t\te = errors.New(\"account is nil\")\n\t\treturn\n\t}\n\tif mp.To == nil {\n\t\tmp.To = account.wallet.Accounts()[0].GetDefaultPkr(1).NewRef()\n\t}\n\tvar mu MergeUtxos\n\tif mu, e = self.getMergeUtxos(account.pk, mp.Currency, int(mp.Zcount), int(mp.Left), int(mp.Icount)); e != nil {\n\t\treturn\n\t}\n\n\tbytes := common.LeftPadBytes([]byte(mp.Currency), 32)\n\tvar Currency c_type.Uint256\n\tcopy(Currency[:], bytes[:])\n\n\tck := assets.NewCKState(false, &assets.Token{utils.CurrencyToUint256(\"SERO\"), utils.U256(*default_fee_value)})\n\n\tfor _, utxo := range mu.list {\n\t\tck.AddIn(&utxo.Asset)\n\t}\n\n\treceptions := []prepare.Reception{}\n\n\tfor _, utxo := range ck.Tkns() {\n\t\treceptions = append(receptions, prepare.Reception{\n\t\t\tAddr: *mp.To,\n\t\t\tAsset: assets.Asset{\n\t\t\t\tTkn: &assets.Token{\n\t\t\t\t\tCurrency: utxo.Currency,\n\t\t\t\t\tValue:    utxo.Value,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t}\n\n\tfor _, utxo := range ck.Tkts() {\n\t\treceptions = append(receptions, prepare.Reception{\n\t\t\tAddr: *mp.To,\n\t\t\tAsset: assets.Asset{\n\t\t\t\tTkt: &assets.Ticket{\n\t\t\t\t\tCategory: utxo.Category,\n\t\t\t\t\tValue:    utxo.Value,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t}\n\n\tbparam := prepare.BeforeTxParam{\n\t\tassets.Token{\n\t\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\t\tutils.U256(*default_fee_value),\n\t\t},\n\t\t*big.NewInt(1000000000),\n\t\tmu.list.Roots(),\n\t\t*mp.To,\n\t\treceptions,\n\t\tprepare.Cmds{},\n\t}\n\n\ttxParam, e = self.buildTxParam(&bparam)\n\tif e != nil {\n\t\treturn\n\t}\n\treturn\n}\n\nfunc (self *Exchange) Merge(pk *c_type.Uint512, currency string, force bool) (count int, txhash c_type.Uint256, e error) {\n\taccount := self.getAccountByPk(*pk)\n\tif account == nil {\n\t\te = errors.New(\"account is nil\")\n\t\treturn\n\t}\n\n\tseed, err := account.wallet.GetSeed()\n\tif err != nil || seed == nil {\n\t\te = errors.New(\"account is locked\")\n\t\treturn\n\t}\n\n\tvar mu MergeUtxos\n\tif mu, e = self.getMergeUtxos(account.pk, currency, 100, 50, 0); e != nil {\n\t\treturn\n\t}\n\n\tif mu.zcount >= 100 || mu.ocount >= 2400 || time.Now().After(account.nextMergeTime) || force {\n\n\t\tcount = mu.list.Len()\n\t\tbytes := common.LeftPadBytes([]byte(currency), 32)\n\t\tvar Currency c_type.Uint256\n\t\tcopy(Currency[:], bytes[:])\n\n\t\tck := assets.NewCKState(false, &assets.Token{utils.CurrencyToUint256(\"SERO\"), utils.U256(*default_fee_value)})\n\n\t\tfor _, utxo := range mu.list {\n\t\t\tck.AddIn(&utxo.Asset)\n\t\t}\n\n\t\treceptions := []prepare.Reception{}\n\n\t\tfor _, utxo := range ck.Tkns() {\n\t\t\treceptions = append(receptions, prepare.Reception{\n\t\t\t\tAddr: account.mainPkr,\n\t\t\t\tAsset: assets.Asset{\n\t\t\t\t\tTkn: &assets.Token{\n\t\t\t\t\t\tCurrency: utxo.Currency,\n\t\t\t\t\t\tValue:    utxo.Value,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tfor _, utxo := range ck.Tkts() {\n\t\t\treceptions = append(receptions, prepare.Reception{\n\t\t\t\tAddr: account.mainPkr,\n\t\t\t\tAsset: assets.Asset{\n\t\t\t\t\tTkt: &assets.Ticket{\n\t\t\t\t\t\tCategory: utxo.Category,\n\t\t\t\t\t\tValue:    utxo.Value,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tbparam := prepare.BeforeTxParam{\n\t\t\tassets.Token{\n\t\t\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\t\t\tutils.U256(*default_fee_value),\n\t\t\t},\n\t\t\t*big.NewInt(1000000000),\n\t\t\tmu.list.Roots(),\n\t\t\taccount.mainPkr,\n\t\t\treceptions,\n\t\t\tprepare.Cmds{},\n\t\t}\n\n\t\tpretx, gtx, err := self.genTx(account, &bparam)\n\t\tif err != nil {\n\t\t\taccount.nextMergeTime = time.Now().Add(time.Hour * 6)\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t\ttxhash = gtx.Hash\n\t\tif err := self.commitTx(gtx); err != nil {\n\t\t\taccount.nextMergeTime = time.Now().Add(time.Hour * 6)\n\t\t\tself.ClearTxParam(pretx)\n\t\t\te = err\n\t\t\treturn\n\t\t}\n\t\tif mu.list.Len() < 100 {\n\t\t\taccount.nextMergeTime = time.Now().Add(time.Hour * 6)\n\t\t}\n\t\treturn\n\t} else {\n\t\te = fmt.Errorf(\"no need to merge the account, utxo count == %v\", mu.list.Len())\n\t\treturn\n\t}\n}\n\nfunc (self *Exchange) merge() {\n\tif txtool.Ref_inst.Bc == nil || !txtool.Ref_inst.Bc.IsValid() {\n\t\treturn\n\t}\n\tself.accounts.Range(func(key, value interface{}) bool {\n\t\taccount := value.(*Account)\n\t\tif count, txhash, err := self.Merge(account.pk, \"SERO\", false); err != nil {\n\t\t\tlog.Error(\"autoMerge fail\", \"accountKey\", *utils.Base58Encode(account.pk[:]), \"count\", count, \"error\", err)\n\t\t} else {\n\t\t\tlog.Info(\"autoMerge succ\", \"accountKey\", *utils.Base58Encode(account.pk[:]), \"tx\", hexutil.Encode(txhash[:]), \"count\", count)\n\t\t}\n\t\treturn true\n\t})\n\n}\n\nvar (\n\tnumPrefix       = []byte(\"NUM\")\n\tbalancPkrPrefix = []byte(\"BALANCPKR\")\n\tpkPrefix        = []byte(\"PK\")\n\tutxoPrefix      = []byte(\"UTXO\")\n\trootPrefix      = []byte(\"ROOT\")\n\tnilPrefix       = []byte(\"NIL\")\n\n\tblockPrefix = []byte(\"BLOCK\")\n\t//outUtxoPrefix = []byte(\"OUTUTXO\")\n\ttxPrefix      = []byte(\"TX\")\n\tnilRootPrefix = []byte(\"NOILTOROOT\")\n)\n\nfunc nilToRootKey(nil c_type.Uint256) []byte {\n\treturn append(nilRootPrefix, nil[:]...)\n}\n\nfunc txKey(txHash c_type.Uint256) []byte {\n\treturn append(txPrefix, txHash[:]...)\n}\n\nfunc blockKey(number uint64) []byte {\n\treturn append(blockPrefix, utils.EncodeNumber(number)...)\n}\n\nfunc numKey(pk c_type.Uint512) []byte {\n\treturn append(numPrefix, pk[:]...)\n}\n\nfunc balancPkrKey(pk c_type.Uint512) []byte {\n\treturn append(balancPkrPrefix, pk[:]...)\n}\n\nfunc nilKey(nil c_type.Uint256) []byte {\n\treturn append(nilPrefix, nil[:]...)\n}\n\nfunc rootKey(root c_type.Uint256) []byte {\n\treturn append(rootPrefix, root[:]...)\n}\n\n// func outUtxoKey(number uint64, pk c_type.Uint512) []byte {\n//\treturn append(outUtxoPrefix, append(encodeNumber(number), pk[:]...)...)\n// }\n\n// utxoKey = PK + currency +root\nfunc utxoPkKey(pk c_type.Uint512, currency []byte, root *c_type.Uint256) []byte {\n\tkey := append(pkPrefix, pk[:]...)\n\tif len(currency) > 0 {\n\t\tkey = append(key, currency...)\n\t}\n\tif root != nil {\n\t\tkey = append(key, root[:]...)\n\t}\n\treturn key\n}\n\nfunc utxoKey(number uint64, pk c_type.Uint512) []byte {\n\treturn append(utxoPrefix, append(utils.EncodeNumber(number), pk[:]...)...)\n}\n\nfunc AddJob(spec string, run RunFunc) *cron.Cron {\n\tc := cron.New()\n\tc.AddJob(spec, &RunJob{run: run})\n\tc.Start()\n\treturn c\n}\n\ntype (\n\tRunFunc func()\n)\n\ntype RunJob struct {\n\trunning int32\n\trun     RunFunc\n}\n\nfunc (r *RunJob) Run() {\n\tx := atomic.LoadInt32(&r.running)\n\tif x == 1 {\n\t\treturn\n\t}\n\n\tatomic.StoreInt32(&r.running, 1)\n\tdefer func() {\n\t\tatomic.StoreInt32(&r.running, 0)\n\t}()\n\n\tr.run()\n}\n"
  },
  {
    "path": "zero/wallet/exchange/generate.go",
    "content": "package exchange\n\nimport (\n\t\"math/big\"\n\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/prepare\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nfunc (self *Exchange) GenTx(param prepare.PreTxParam) (txParam *txtool.GTxParam, e error) {\n\ttxParam, e = prepare.GenTxParam(&param, self, &prepare.DefaultTxParamState{})\n\tif e == nil && txParam != nil {\n\t\tfor _, in := range txParam.Ins {\n\t\t\tself.usedFlag.Store(in.Out.Root, 1)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *Exchange) buildTxParam(param *prepare.BeforeTxParam) (txParam *txtool.GTxParam, e error) {\n\n\ttxParam, e = prepare.BuildTxParam(&prepare.DefaultTxParamState{}, param)\n\n\tif e == nil && txParam != nil {\n\t\tfor _, in := range txParam.Ins {\n\t\t\tself.usedFlag.Store(in.Out.Root, 1)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (self *Exchange) FindRoots(pk *c_type.Uint512, currency string, amount *big.Int) (roots prepare.Utxos, remain big.Int) {\n\tutxos, r := self.findUtxos(pk, currency, amount)\n\tfor _, utxo := range utxos {\n\t\troots = append(roots, prepare.Utxo{utxo.Root, utxo.Asset})\n\t}\n\tremain = *r\n\treturn\n}\n\nfunc (self *Exchange) FindRootsByTicket(pk *c_type.Uint512, tickets []assets.Ticket) (roots prepare.Utxos, remain map[c_type.Uint256]c_type.Uint256) {\n\tutxos, remain := self.findUtxosByTicket(pk, tickets)\n\tfor _, utxo := range utxos {\n\t\troots = append(roots, prepare.Utxo{utxo.Root, utxo.Asset})\n\t}\n\treturn\n}\n\nfunc (self *Exchange) DefaultRefundTo(pk *c_type.Uint512) (ret *c_type.PKr) {\n\tif value, ok := self.accounts.Load(*pk); ok {\n\t\taccount := value.(*Account)\n\t\treturn &account.mainPkr\n\t}\n\treturn nil\n}\n\nfunc (self *Exchange) GetRoot(root *c_type.Uint256) (utxos *prepare.Utxo) {\n\tif u, e := self.getUtxo(*root); e != nil {\n\t\treturn nil\n\t} else {\n\t\treturn &prepare.Utxo{u.Root, u.Asset}\n\t}\n}\n"
  },
  {
    "path": "zero/wallet/exchange/pkg.go",
    "content": "package exchange\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nvar (\n\tpk_from_id_2_id_KeyPrefix = []byte(\"PK_FROM_ID_2_ID\")\n\tid_2_pkg_KeyPrefix        = []byte(\"ID_2_PKG\")\n)\n\nfunc pk_from_id_2_id_Key(pk *c_type.Uint512, from *bool, id *c_type.Uint256) []byte {\n\tret := append(pk_from_id_2_id_KeyPrefix, pk[:]...)\n\tif from != nil {\n\t\tf := byte(0)\n\t\tif *from {\n\t\t\tf = byte(1)\n\t\t}\n\t\tret = append(ret, f)\n\t}\n\tif id != nil {\n\t\tret = append(ret, id[:]...)\n\t}\n\treturn ret\n}\n\ntype Pkg struct {\n\tz    localdb.ZPkg\n\tto   *c_type.Uint512 `rlp: nil`\n\tfrom *c_type.Uint512 `rlp: nil`\n}\n\nfunc id_2_pkg_key(id *c_type.Uint256) []byte {\n\tret := append(id_2_pkg_KeyPrefix, id[:]...)\n\treturn ret\n}\n\nfunc (self *Exchange) FindPkgs(pk *c_type.Uint512, from bool) (pkgs []Pkg) {\n\tprefix := pk_from_id_2_id_Key(pk, &from, nil)\n\titerator := self.db.NewIteratorWithPrefix(prefix)\n\tfor iterator.Next() {\n\t\tif id := iterator.Value(); len(id) == 32 {\n\t\t\ti := c_type.Uint256{}\n\t\t\tcopy(i[:], id[:])\n\t\t\tif pkg := self.FindPkgById(&i); pkg != nil {\n\t\t\t\tpkgs = append(pkgs, *pkg)\n\t\t\t} else {\n\t\t\t\tlog.Error(\"find pkg error\", \"pkg\", id)\n\t\t\t}\n\t\t} else {\n\t\t\tlog.Error(\"pkg id error\", \"pkg\", id)\n\t\t}\n\t}\n\titerator.Release()\n\treturn\n}\n\nfunc (self *Exchange) FindPkgById(id *c_type.Uint256) (pkg *Pkg) {\n\tif bs, e := self.db.Get(id_2_pkg_key(id)); e != nil {\n\t\treturn\n\t} else {\n\t\tpkg := Pkg{}\n\t\tif e := rlp.DecodeBytes(bs, &pkg); e == nil {\n\t\t\treturn &pkg\n\t\t} else {\n\t\t\tpanic(e)\n\t\t}\n\t}\n}\n\ntype pkgIndexes struct {\n\tdeleteKeys      [][]byte\n\tpk_from_id_maps map[string]c_type.Uint256\n}\n\nfunc (self *Exchange) indexPkgs(pks []c_type.Uint512, batch serodb.Batch, blocks []txtool.Block) {\n\tfor _, block := range blocks {\n\t\tfor _, pkg := range block.Pkgs {\n\t\t\tif p := self.FindPkgById(&pkg.Pack.Id); p != nil {\n\t\t\t\tif p.to != nil {\n\t\t\t\t\tfrom := false\n\t\t\t\t\tbatch.Delete(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id))\n\t\t\t\t}\n\t\t\t\tif p.from != nil {\n\t\t\t\t\tfrom := true\n\t\t\t\t\tbatch.Delete(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id))\n\t\t\t\t}\n\t\t\t\tbatch.Delete(id_2_pkg_key(&p.z.Pack.Id))\n\t\t\t}\n\t\t\tvar p Pkg\n\t\t\tif account, ok := self.ownPkr(pks, pkg.Pack.PKr); ok {\n\t\t\t\tp.to = account.pk\n\t\t\t}\n\t\t\tif account, ok := self.ownPkr(pks, pkg.From); ok {\n\t\t\t\tp.from = account.pk\n\t\t\t}\n\t\t\tif p.from != nil || p.to != nil {\n\t\t\t\tif !pkg.Closed {\n\t\t\t\t\tp.z = pkg\n\t\t\t\t\tif bs, e := rlp.EncodeToBytes(&p); e == nil {\n\t\t\t\t\t\tif p.to != nil {\n\t\t\t\t\t\t\tfrom := false\n\t\t\t\t\t\t\tif e := batch.Put(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id), p.z.Pack.Id[:]); e != nil {\n\t\t\t\t\t\t\t\tpanic(e)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif p.from != nil {\n\t\t\t\t\t\t\tfrom := true\n\t\t\t\t\t\t\tif e := batch.Put(pk_from_id_2_id_Key(p.to, &from, &p.z.Pack.Id), p.z.Pack.Id[:]); e != nil {\n\t\t\t\t\t\t\t\tpanic(e)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif e := batch.Put(id_2_pkg_key(&p.z.Pack.Id), bs); e != nil {\n\t\t\t\t\t\t\tpanic(e)\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpanic(e)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/wallet/exchange/utxo.go",
    "content": "package exchange\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n)\n\ntype Utxo struct {\n\tPkr    c_type.PKr\n\tRoot   c_type.Uint256\n\tTxHash c_type.Uint256\n\tNil    c_type.Uint256\n\tNum    uint64\n\tAsset  assets.Asset\n\tIsZ    bool\n\tIgnore bool\n\tflag   int\n}\n\nfunc (utxo *Utxo) NilTxType() string {\n\tif c_superzk.IsSzkNil(&utxo.Nil) {\n\t\treturn \"SZK\"\n\t} else {\n\t\treturn \"CZERO\"\n\t}\n}\n"
  },
  {
    "path": "zero/wallet/exchange/utxo_version.go",
    "content": "package exchange\n\nimport (\n\t\"io\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/core/types/vserial\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n)\n\ntype Utxo_Version0 struct {\n\tPkr    c_type.PKr\n\tRoot   c_type.Uint256\n\tTxHash c_type.Uint256\n\tNil    c_type.Uint256\n\tNum    uint64\n\tAsset  assets.Asset\n\tIsZ    bool\n}\n\ntype Utxo_Version1 struct {\n\tIgnore bool\n}\n\nfunc (b *Utxo) DecodeRLP(s *rlp.Stream) error {\n\tvs := vserial.NewVSerial()\n\tv0 := Utxo_Version0{}\n\tv1 := Utxo_Version1{}\n\n\tvs.Add(&v0, vserial.VERSION_0)\n\tvs.Add(&v1, vserial.VERSION_1)\n\tif e := s.Decode(&vs); e != nil {\n\t\treturn e\n\t}\n\n\tif vs.V() <= vserial.VERSION_1 {\n\t\tSetUtxoForVersion0(b, &v0)\n\t\tif vs.V() >= vserial.VERSION_1 {\n\t\t\tSetUtxoForVersion1(b, &v1)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc SetVersion0ForUtxo(v0 *Utxo_Version0, b *Utxo) {\n\tv0.Pkr = b.Pkr\n\tv0.Root = b.Root\n\tv0.TxHash = b.TxHash\n\tv0.Nil = b.Nil\n\tv0.Num = b.Num\n\tv0.Asset = b.Asset\n\tv0.IsZ = b.IsZ\n}\n\nfunc SetUtxoForVersion0(b *Utxo, v0 *Utxo_Version0) {\n\tb.Pkr = v0.Pkr\n\tb.Root = v0.Root\n\tb.TxHash = v0.TxHash\n\tb.Nil = v0.Nil\n\tb.Num = v0.Num\n\tb.Asset = v0.Asset\n\tb.IsZ = v0.IsZ\n}\n\nfunc SetVersion1ForUtxo(v1 *Utxo_Version1, b *Utxo) {\n\tv1.Ignore = b.Ignore\n}\n\nfunc SetUtxoForVersion1(b *Utxo, v1 *Utxo_Version1) {\n\tb.Ignore = v1.Ignore\n}\n\nfunc (b *Utxo) EncodeRLP(w io.Writer) error {\n\tvs := vserial.NewVSerial()\n\n\tv0 := Utxo_Version0{}\n\tSetVersion0ForUtxo(&v0, b)\n\tvs.Add(&v0, vserial.VERSION_0)\n\n\tif b.Ignore {\n\t\tv1 := Utxo_Version1{}\n\t\tSetVersion1ForUtxo(&v1, b)\n\t\tvs.Add(&v1, vserial.VERSION_1)\n\t}\n\n\treturn rlp.Encode(w, &vs)\n}\n"
  },
  {
    "path": "zero/wallet/light/api.go",
    "content": "package light\n\nimport (\n\t\"bytes\"\n\t\"sort\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nvar Current_light *LightNode\n\nfunc (self *LightNode) CurrentLight() *LightNode {\n\treturn Current_light\n}\n\nconst pageSize = uint64(100000)\n\nfunc (self *LightNode) GetOutsByPKr(pkrs []c_type.PKr, start uint64, end *uint64) (br BlockOutResp, e error) {\n\tbr.CurrentNum = self.getLastNumber()\n\tbr.PageSize = pageSize\n\tblockOuts := []BlockOut{}\n\tif end == nil {\n\t\tend = &br.CurrentNum\n\t} else {\n\t\tif *end == 0 {\n\t\t\t*end = start + pageSize\n\t\t}\n\t}\n\n\tfor _, pkr := range pkrs {\n\t\t//uPKr := pkr.ToUint512()\n\t\tprefix := append(pkrPrefix, pkr[:]...)\n\t\titerator := self.db.NewIteratorWithPrefix(prefix)\n\n\t\tfor ok := iterator.Seek(pkrKey(pkr, start)); ok; ok = iterator.Next() {\n\n\t\t\tkey := iterator.Key()\n\t\t\tnum := bytesToUint64(key[99:107])\n\t\t\tif num > *end {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvar bds []BlockData\n\t\t\tif err := rlp.Decode(bytes.NewReader(iterator.Value()), &bds); err != nil {\n\t\t\t\tlog.Error(\"Light Invalid block RLP\", \"Num:\", num, \"err:\", err)\n\t\t\t\titerator.Release()\n\t\t\t\treturn br, err\n\t\t\t} else {\n\t\t\t\tblockOut := BlockOut{Num: num, Data: bds}\n\t\t\t\tblockOuts = append(blockOuts, blockOut)\n\t\t\t}\n\n\t\t}\n\t\titerator.Release()\n\t}\n\tbr.BlockOuts = blockOuts\n\treturn br, nil\n}\n\nfunc (self *LightNode) GetPendingOuts(pkrs []c_type.PKr) (br BlockOutResp, e error) {\n\tblockOuts := []BlockOut{}\n\n\tnumBlokcDatas := self.CurrentLight().getImmatureTx(pkrs)\n\n\tif pendingBlockOuts, ok := numBlokcDatas[0]; ok {\n\t\tif len(pendingBlockOuts) > 0 {\n\t\t\tblockOut := BlockOut{Num: 0, Data: pendingBlockOuts}\n\t\t\tblockOuts = append(blockOuts, blockOut)\n\t\t}\n\t}\n\n\timmatureBlokOuts := BlocOuts{}\n\tfor k, v := range numBlokcDatas {\n\t\tif k != 0 {\n\t\t\tblockOut := BlockOut{Num: k, Data: v}\n\t\t\timmatureBlokOuts = append(immatureBlokOuts, blockOut)\n\t\t}\n\n\t}\n\tsort.Sort(immatureBlokOuts)\n\tblockOuts = append(blockOuts, immatureBlokOuts[:]...)\n\tbr.BlockOuts = blockOuts\n\treturn br, nil\n}\n\nfunc (self *LightNode) CheckNil(Nils []c_type.Uint256) (nilResps []NilValue, e error) {\n\tif len(Nils) == 0 {\n\t\treturn\n\t}\n\tfor _, Nil := range Nils {\n\t\tif data, err := self.db.Get(nilKey(Nil)); err != nil {\n\t\t\tcontinue\n\t\t} else {\n\n\t\t\tnilResp := NilValue{}\n\t\t\tif err := rlp.DecodeBytes(data, &nilResp); err != nil {\n\t\t\t\tcontinue\n\t\t\t} else {\n\t\t\t\tnilResp.Nil = Nil\n\t\t\t\tnilResps = append(nilResps, nilResp)\n\t\t\t}\n\t\t}\n\t}\n\treturn nilResps, nil\n}\n\ntype BlockOutResp struct {\n\tCurrentNum uint64\n\tBlockOuts  []BlockOut\n\tPageSize   uint64\n}\n\ntype BlockOut struct {\n\tNum  uint64\n\tData []BlockData\n}\n\ntype BlockData struct {\n\tTxInfo TxInfo\n\tOut    txtool.Out\n}\n\ntype BlocOuts []BlockOut\n\nfunc (s BlocOuts) Len() int           { return len(s) }\nfunc (s BlocOuts) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }\nfunc (s BlocOuts) Less(i, j int) bool { return s[i].Num > s[j].Num }\n"
  },
  {
    "path": "zero/wallet/light/api_test.go",
    "content": "package light\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"log\"\n\t\"net/http\"\n\t\"testing\"\n\t\"time\"\n)\n\nvar (\n\thost = \"http://127.0.0.1:8545\"\n)\n\n/**\ncurl -i -H 'Content-Type:application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"light_getOutsByPKr\",\"params\":[\"2HVVk8CN2qTSTKUd4GgqKN4nkMMA4KjE97PwczEv9nkz5VEKG6P5kiLbYMHM7ihKcY36MSxMpCvxGt8zqzwpS7ag5pq4EweHzNpUtjYBGJov4hgcEGf26DRGrTTiR2nSeNm6\",0,200]}' http://127.0.0.1:8545\n*/\n\nfunc TestLightNode_GetOutsByPKr(t *testing.T) {\n\tGetOutsByPKr(\"2HVVk8CN2qTSTKUd4GgqKN4nkMMA4KjE97PwczEv9nkz5VEKG6P5kiLbYMHM7ihKcY36MSxMpCvxGt8zqzwpS7ag5pq4EweHzNpUtjYBGJov4hgcEGf26DRGrTTiR2nSeNm6\", 0, 100)\n}\n\nfunc GetOutsByPKr(pkr string, begin, end uint64) {\n\tresp, e := doPost(host, \"light_getOutsByPKr\", []interface{}{pkr, begin, end})\n\tif e != nil {\n\t\tfmt.Println(e)\n\t\treturn\n\t}\n\tmessage := *resp.Result\n\tif message == nil {\n\t\treturn\n\t}\n\t//e = json.Unmarshal(message[:], &balances)\n\tlog.Printf(string(message))\n\treturn\n}\n\ntype JSONRpcResp struct {\n\tId     *json.RawMessage       `json:\"id\"`\n\tResult *json.RawMessage       `json:\"result\"`\n\tError  map[string]interface{} `json:\"error\"`\n}\n\nfunc doPost(url string, method string, params interface{}) (*JSONRpcResp, error) {\n\tclient := &http.Client{\n\t\tTimeout: 900 * time.Second,\n\t}\n\tjsonReq := map[string]interface{}{\"jsonrpc\": \"2.0\", \"method\": method, \"params\": params, \"id\": 0}\n\tdata, err := json.Marshal(jsonReq)\n\tif err != nil {\n\t\tlog.Printf(err.Error())\n\t\treturn nil, err\n\t}\n\tlog.Printf(string(data))\n\n\treq, err := http.NewRequest(\"POST\", url, bytes.NewBuffer(data))\n\tif err != nil {\n\t\tlog.Printf(err.Error())\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Content-Length\", (string)(len(data)))\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\treq.Header.Set(\"Accept\", \"application/json\")\n\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tvar rpcResp *JSONRpcResp\n\terr = json.NewDecoder(resp.Body).Decode(&rpcResp)\n\tif err != nil {\n\n\t\treturn nil, err\n\t}\n\tif rpcResp.Error != nil {\n\t\treturn nil, fmt.Errorf(rpcResp.Error[\"message\"].(string))\n\n\t}\n\treturn rpcResp, err\n}\n"
  },
  {
    "path": "zero/wallet/light/light.go",
    "content": "package light\n\nimport (\n\t\"encoding/binary\"\n\t\"math/big\"\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\n\t\"github.com/robfig/cron\"\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/core/rawdb\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/rlp\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n)\n\ntype LightNode struct {\n\tdb   *serodb.LDBDatabase\n\tbcDB serodb.Database\n\t//immatureTx *ImmatureTx\n\n\ttxPool *core.TxPool\n\n\tsri flight.SRI\n\n\tlastNumber uint64\n}\n\nvar (\n\tteamReward = common.Hash{}\n\tpowReward  = common.BytesToHash([]byte{1})\n\tposReward  = common.BytesToHash([]byte{2})\n\tposMiner   = common.BytesToHash([]byte{3})\n)\n\nvar (\n\tpkrPrefix = []byte(\"PKr\")\n\tnilPrefix = []byte(\"NIL\")\n)\n\nfunc NewLightNode(dbPath string, txPool *core.TxPool, bcDB serodb.Database) (lightNode *LightNode) {\n\n\tdb, err := serodb.NewLDBDatabase(dbPath, 1024, 1024)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t//immatureTx := NewImmatureTx(db, txPool)\n\tlightNode = &LightNode{\n\t\ttxPool: txPool,\n\t\tsri:    flight.SRI_Inst,\n\t\tdb:     db,\n\t\tbcDB:   bcDB,\n\t\t//immatureTx: immatureTx,\n\t}\n\tCurrent_light = lightNode\n\n\tAddJob(\"0/10 * * * * ?\", lightNode.fetchBlockInfo)\n\n\tlog.Info(\"Init NewLightNode success\")\n\treturn\n}\n\nvar fetchCount = uint64(5000)\n\nfunc (self *LightNode) getLastNumber() (num uint64) {\n\n\tif self.lastNumber == 0 {\n\t\t// light wallet start at block 1200000\n\t\tvar initBlockNum = uint64(1280000)\n\t\tif seroparam.Is_Dev() {\n\t\t\tinitBlockNum = uint64(0)\n\t\t}\n\t\tvalue, err := self.db.Get(numKey())\n\t\tif err != nil {\n\t\t\tself.db.Put(numKey(), uint64ToBytes(initBlockNum))\n\t\t\treturn initBlockNum\n\t\t}\n\t\tself.lastNumber = bytesToUint64(value)\n\t\tif self.lastNumber == 0 {\n\t\t\tself.lastNumber = initBlockNum\n\t\t\tself.db.Put(numKey(), uint64ToBytes(initBlockNum))\n\t\t}\n\t}\n\treturn self.lastNumber\n\n}\n\nfunc numKey() []byte {\n\treturn []byte(\"LIGHT_SYNC_NUM\")\n}\n\nfunc (self *LightNode) fetchBlockInfo() {\n\n\t//self.immatureTx.fetchBlockInfo()\n\n\tif txtool.Ref_inst.Bc == nil || !txtool.Ref_inst.Bc.IsValid() {\n\t\treturn\n\t}\n\n\tstart := self.getLastNumber()\n\n\tblocks, err := self.sri.GetBlocksInfo(start+1, fetchCount)\n\tif err != nil {\n\t\tlog.Error(\"light GetBlocksInfo err:\", err.Error())\n\t}\n\tif len(blocks) == 0 {\n\t\treturn\n\t}\n\tvar count uint64 = 0\n\tbatch := self.db.NewBatch()\n\tfor _, block := range blocks {\n\t\t// PKR -> Outs\n\t\touts := block.Outs\n\t\tpkrMap := make(map[c_type.PKr][]BlockData)\n\t\tblockHash := common.Hash{}\n\t\tblockNum := uint64(block.Num)\n\t\tcopy(blockHash[:], block.Hash[:])\n\t\tbody := rawdb.ReadBody(self.bcDB, blockHash, blockNum)\n\t\tblockDB := rawdb.ReadBlock(self.bcDB, blockHash, blockNum)\n\n\t\tfor _, out := range outs {\n\t\t\ttxHash := common.Hash{}\n\t\t\tcopy(txHash[:], out.State.TxHash[:])\n\n\t\t\tif teamReward == txHash {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif hexutil.Encode(out.Root[:]) == \"0x0577fc34724b205de4356f4b967ffe267e26b027634ef9c5bd73233a8c6fb9ad\" {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tvar txInfo TxInfo\n\t\t\tif !(teamReward == txHash || powReward == txHash || posReward == txHash || posMiner == txHash) {\n\t\t\t\t//fmt.Println(\"hex hash::\", hexutil.Encode(txHash[:]), out.State.Num)\n\t\t\t\ttxReceipt, _, _, _ := rawdb.ReadReceipt(self.bcDB, txHash)\n\t\t\t\ttx, _, _, _ := rawdb.ReadTransaction(self.bcDB, txHash)\n\t\t\t\tif txReceipt == nil {\n\t\t\t\t\tlog.Info(\"light fetchBlockInfo receipt is nil\", \"blockNum\", out.State.Num, \"txHash\", hexutil.Encode(txHash[:]), \"root\", hexutil.Encode(out.Root[:]))\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tgasUsed := txReceipt.GasUsed\n\t\t\t\ttxInfo = TxInfo{\n\t\t\t\t\tNum:       blockNum,\n\t\t\t\t\tTxHash:    out.State.TxHash,\n\t\t\t\t\tBlockHash: blockDB.Hash(),\n\t\t\t\t\tGas:       tx.Gas(),\n\t\t\t\t\tGasUsed:   gasUsed,\n\t\t\t\t\tGasPrice:  *tx.GasPrice(),\n\t\t\t\t\tFrom:      tx.From(),\n\t\t\t\t\t// To:       *tx.To(),\n\t\t\t\t\tTime: *blockDB.Time(),\n\t\t\t\t}\n\t\t\t\tself.txPool.DelMaturedOuts(*out.State.OS.ToPKr(), out.State.TxHash, blockNum)\n\t\t\t} else {\n\t\t\t\ttxInfo = TxInfo{\n\t\t\t\t\tNum:       blockNum,\n\t\t\t\t\tTxHash:    out.State.TxHash,\n\t\t\t\t\tBlockHash: blockDB.Hash(),\n\t\t\t\t\t// To:       *tx.To(),\n\t\t\t\t\tTime: *blockDB.Time(),\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tblockData := BlockData{\n\t\t\t\tTxInfo: txInfo,\n\t\t\t\tOut:    out,\n\t\t\t}\n\n\t\t\tpkr := *out.State.OS.ToPKr()\n\n\t\t\t//self.immatureTx.lockedDelImmatureTx(pkr, blockData.TxInfo.TxHash)\n\n\t\t\tif value, ok := pkrMap[pkr]; ok {\n\t\t\t\tv := value\n\t\t\t\tv = append(v, blockData)\n\t\t\t\tpkrMap[pkr] = v\n\t\t\t} else {\n\t\t\t\tpkrMap[pkr] = []BlockData{blockData}\n\t\t\t}\n\t\t}\n\t\tfor pkr, v := range pkrMap {\n\t\t\tdata, err := rlp.EncodeToBytes(v)\n\t\t\tif err != nil {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tbatch.Put(pkrKey(pkr, uint64(block.Num)), data)\n\t\t}\n\t\tfor _, tx := range body.Transactions {\n\t\t\thash := tx.Hash()\n\t\t\ttxHash := c_type.Uint256{}\n\t\t\tcopy(txHash[:], hash[:])\n\n\t\t\ttxReceipt, _, _, _ := rawdb.ReadReceipt(self.bcDB, tx.Hash())\n\t\t\tgasUsed := txReceipt.GasUsed\n\n\t\t\t// Index Tx Info\n\t\t\ttxInfo := TxInfo{\n\t\t\t\tNum:       blockNum,\n\t\t\t\tTxHash:    txHash,\n\t\t\t\tBlockHash: blockDB.Hash(),\n\t\t\t\tGas:       tx.Gas(),\n\t\t\t\tGasUsed:   gasUsed,\n\t\t\t\tGasPrice:  *tx.GasPrice(),\n\t\t\t\tFrom:      tx.From(),\n\t\t\t\t// To:       *tx.To(),\n\t\t\t\tTime: *blockDB.Time(),\n\t\t\t}\n\n\t\t\tnilValue := NilValue{\n\t\t\t\tNum:    blockNum,\n\t\t\t\tTxHash: txHash,\n\t\t\t\tTxInfo: txInfo,\n\t\t\t}\n\t\t\tif nilValue, err := rlp.EncodeToBytes(nilValue); err != nil {\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tif tx.Stxt().Tx0() != nil {\n\t\t\t\t\tfor _, in := range tx.Stxt().Tx0().Desc_O.Ins {\n\t\t\t\t\t\tbatch.Put(nilKey(in.Nil), nilValue)\n\t\t\t\t\t\tbatch.Put(nilKey(in.Root), nilValue)\n\t\t\t\t\t}\n\t\t\t\t\tfor _, in := range tx.Stxt().Tx0().Desc_Z.Ins {\n\t\t\t\t\t\tbatch.Put(nilKey(in.Trace), nilValue)\n\t\t\t\t\t\tbatch.Put(nilKey(in.Nil), nilValue)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif tx.Stxt().Tx1.Ins_C != nil {\n\t\t\t\t\tfor _, in := range tx.Stxt().Tx1.Ins_C {\n\t\t\t\t\t\tbatch.Put(nilKey(in.Nil), nilValue)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif tx.Stxt().Tx1.Ins_P != nil {\n\t\t\t\t\tfor _, in := range tx.Stxt().Tx1.Ins_P {\n\t\t\t\t\t\tbatch.Put(nilKey(in.Nil), nilValue)\n\t\t\t\t\t\tbatch.Put(nilKey(in.Root), nilValue)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif tx.Stxt().Tx1.Ins_P0 != nil {\n\t\t\t\t\tfor _, in := range tx.Stxt().Tx1.Ins_P0 {\n\t\t\t\t\t\tbatch.Put(nilKey(in.Nil), nilValue)\n\t\t\t\t\t\tbatch.Put(nilKey(in.Root), nilValue)\n\t\t\t\t\t\tbatch.Put(nilKey(in.Trace), nilValue)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// nils := block.Nils\n\t\t// if len(nils) > 0 {\n\t\t//\tfor _, Nil := range nils {\n\t\t//\t\tbatch.Put(nilKey(Nil, uint64(block.Num)), uint64ToBytes(1))\n\t\t//\t}\n\t\t// }\n\t\tcount++\n\t}\n\tif count == 0 {\n\t\treturn\n\t}\n\n\tlastNumber := self.lastNumber\n\tif count < fetchCount {\n\t\tlastNumber = start + count\n\t} else {\n\t\tlastNumber = start + fetchCount\n\t}\n\tbatch.Put(numKey(), uint64ToBytes(lastNumber))\n\terr = batch.Write()\n\tif err == nil {\n\t\tself.lastNumber = lastNumber\n\t}\n\treturn\n}\n\ntype NilValue struct {\n\tNil    c_type.Uint256\n\tNum    uint64\n\tTxHash c_type.Uint256\n\tTxInfo TxInfo\n}\n\nfunc uint64ToBytes(i uint64) []byte {\n\tvar buf = make([]byte, 8)\n\tbinary.BigEndian.PutUint64(buf, uint64(i))\n\treturn buf\n}\n\nfunc bytesToUint64(data []byte) uint64 {\n\treturn binary.BigEndian.Uint64(data)\n}\n\nfunc nilKey(Nil c_type.Uint256) []byte {\n\treturn append(nilPrefix, Nil[:]...)\n}\n\nfunc pkrKey(pkr c_type.PKr, num uint64) []byte {\n\tkey := append(pkrPrefix, pkr[:]...)\n\treturn append(key, uint64ToBytes(num)...)\n}\n\nfunc AddJob(spec string, run RunFunc) *cron.Cron {\n\tc := cron.New()\n\tc.AddJob(spec, &RunJob{run: run})\n\tc.Start()\n\treturn c\n}\n\ntype TxInfo struct {\n\tTxHash    c_type.Uint256\n\tNum       uint64\n\tBlockHash common.Hash\n\tGas       uint64\n\tGasUsed   uint64\n\tGasPrice  big.Int\n\tFrom      common.Address\n\tTo        common.Address\n\tTime      big.Int\n}\ntype (\n\tRunFunc func()\n)\n\ntype RunJob struct {\n\trunning int32\n\trun     RunFunc\n}\n\nfunc (r *RunJob) Run() {\n\tx := atomic.LoadInt32(&r.running)\n\tif x == 1 {\n\t\treturn\n\t}\n\n\tatomic.StoreInt32(&r.running, 1)\n\tdefer func() {\n\t\tatomic.StoreInt32(&r.running, 0)\n\t}()\n\n\tr.run()\n}\n\nfunc outInfoToTxInfo(info core.TxOutInfo) TxInfo {\n\n\ttxInfo := TxInfo{\n\t\tTxHash:    info.TxHash,\n\t\tNum:       info.BlockNumber,\n\t\tBlockHash: info.BlockHash,\n\t\tGas:       info.Gas,\n\t\tGasUsed:   info.GasUsed,\n\t\tGasPrice:  *info.GasPrice,\n\t\tFrom:      info.From,\n\t\tTime:      *big.NewInt(0).SetUint64(info.Time),\n\t}\n\treturn txInfo\n}\n\nfunc (self *LightNode) getImmatureTx(pkrs []c_type.PKr) (immatureBlockOuts map[uint64][]BlockData) {\n\n\timmatureBlockOuts = make(map[uint64][]BlockData)\n\n\tlastLightNum := self.getLastNumber()\n\n\tfor _, pkr := range pkrs {\n\n\t\ttxPoolTxOut := self.txPool.PendingOuts(pkr)\n\n\t\tfor _, outInfo := range txPoolTxOut {\n\n\t\t\tif outInfo != nil {\n\t\t\t\ttxInfo := outInfoToTxInfo(*outInfo)\n\t\t\t\tfor index := range outInfo.Outs {\n\t\t\t\t\tblockData := BlockData{\n\t\t\t\t\t\tTxInfo: txInfo,\n\t\t\t\t\t\tOut:    outInfo.Outs[index],\n\t\t\t\t\t}\n\t\t\t\t\tif blockData.TxInfo.Num == 0 || (blockData.TxInfo.Num+seroparam.DefaultConfirmedBlock()) > lastLightNum {\n\t\t\t\t\t\timmatureBlockOuts[blockData.TxInfo.Num] = append(immatureBlockOuts[blockData.TxInfo.Num], blockData)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn\n\n}\n"
  },
  {
    "path": "zero/wallet/ssi/ssi.go",
    "content": "package ssi\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"math/big\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/flight\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/zero/txs/assets\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-sero/zero/localdb\"\n)\n\ntype SSI struct {\n}\n\nvar SSI_Inst = SSI{}\n\nfunc (self *SSI) CreateKr(flag bool) (kr txtool.Kr) {\n\trnd := c_superzk.RandomFr()\n\tzsk := c_superzk.RandomFr()\n\tvsk := c_superzk.RandomFr()\n\n\tskr := c_type.PKr{}\n\tcopy(skr[:], zsk[:])\n\tcopy(skr[32:], vsk[:])\n\tcopy(skr[64:], rnd[:])\n\n\tif flag {\n\t\tc_superzk.SetFlag(skr[:64])\n\t}\n\n\tsk := c_type.Uint512{}\n\tcopy(sk[:], skr[:])\n\ttk, _ := superzk.Sk2Tk(&sk)\n\tvar pk c_type.Uint512\n\tpk, _ = superzk.Tk2Pk(&tk)\n\n\tpkr := superzk.Pk2PKr(&pk, &rnd)\n\tkr.PKr = pkr\n\tkr.SKr = skr\n\treturn\n}\n\nfunc (self *SSI) GetBlocksInfo(start uint64, count uint64) (blocks []Block, e error) {\n\n\tif bs, err := flight.SRI_Inst.GetBlocksInfo(start, count); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tfor _, b := range bs {\n\t\t\tblock := Block{}\n\t\t\tblock.Num = b.Num\n\t\t\tblock.Hash = b.Hash\n\t\t\tblock.Nils = b.Nils\n\t\t\tfor _, o := range b.Outs {\n\t\t\t\tblock.Outs = append(\n\t\t\t\t\tblock.Outs,\n\t\t\t\t\tOut{\n\t\t\t\t\t\to.Root,\n\t\t\t\t\t\to.State.TxHash,\n\t\t\t\t\t\t*o.State.OS.ToPKr(),\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\t\t\tblocks = append(blocks, block)\n\t\t}\n\t}\n\n\treturn\n}\n\nfunc (self *SSI) Detail(roots []c_type.Uint256, skr *c_type.PKr) (douts []txtool.DOut, e error) {\n\n\touts := []txtool.Out{}\n\tfor _, r := range roots {\n\t\tif root := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), &r); root == nil {\n\t\t\te = fmt.Errorf(\"SSI Detail Error for root %v\", r)\n\t\t\treturn\n\t\t} else {\n\t\t\touts = append(outs, txtool.Out{r, *root})\n\t\t}\n\t}\n\tdouts = DecNilOuts(outs, skr)\n\n\treturn\n}\n\nvar txMap sync.Map\n\nfunc (self *SSI) GenTxParam(param *PreTxParam) (p txtool.GTxParam, e error) {\n\tlog.Printf(\"genTx start\")\n\tp.Gas = param.Gas\n\tp.GasPrice = big.NewInt(0).SetUint64(param.GasPrice)\n\tp.Fee = assets.Token{\n\t\tutils.CurrencyToUint256(\"SERO\"),\n\t\tutils.U256(*new(big.Int).Mul(new(big.Int).SetUint64(param.Gas), new(big.Int).SetUint64(param.GasPrice))),\n\t}\n\tp.From = param.From\n\tp.Outs = param.Outs\n\n\troots := []c_type.Uint256{}\n\touts := []txtool.Out{}\n\n\tamounts := make(map[string]*big.Int)\n\tticekts := make(map[c_type.Uint256]c_type.Uint256)\n\tfor _, in := range param.Ins {\n\t\troots = append(roots, in.Root)\n\t\tif root := localdb.GetRoot(txtool.Ref_inst.Bc.GetDB(), &in.Root); root == nil {\n\t\t\te = fmt.Errorf(\"SSI GenTx Error for root %v\", in.Root)\n\t\t\treturn\n\t\t} else {\n\t\t\tout := txtool.Out{in.Root, *root}\n\t\t\tdOuts := DecNilOuts([]txtool.Out{out}, &in.SKr)\n\t\t\tif len(dOuts) == 0 {\n\t\t\t\te = fmt.Errorf(\"SSI GenTx Error for root %v\", in.Root)\n\t\t\t\treturn\n\t\t\t}\n\t\t\toOut := dOuts[0]\n\t\t\tif oOut.Asset.Tkn != nil {\n\t\t\t\tcurrency := strings.Trim(string(oOut.Asset.Tkn.Currency[:]), string([]byte{0}))\n\t\t\t\tif amount, ok := amounts[currency]; ok {\n\t\t\t\t\tamount.Add(amount, oOut.Asset.Tkn.Value.ToIntRef())\n\t\t\t\t} else {\n\t\t\t\t\tamounts[currency] = oOut.Asset.Tkn.Value.ToIntRef()\n\t\t\t\t}\n\n\t\t\t}\n\t\t\tif oOut.Asset.Tkt != nil {\n\t\t\t\tticekts[oOut.Asset.Tkt.Value] = oOut.Asset.Tkt.Category\n\t\t\t}\n\t\t\touts = append(outs, txtool.Out{in.Root, *root})\n\t\t}\n\t}\n\n\tfor _, out := range param.Outs {\n\t\tif out.Asset.Tkn != nil {\n\t\t\tcurrency := strings.Trim(string(out.Asset.Tkn.Currency[:]), string([]byte{0}))\n\t\t\ttoken := out.Asset.Tkn.Value.ToIntRef()\n\t\t\tif amount, ok := amounts[currency]; ok && amount.Cmp(token) >= 0 {\n\t\t\t\tamount.Sub(amount, token)\n\t\t\t\tif amount.Sign() == 0 {\n\t\t\t\t\tdelete(amounts, currency)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\te = fmt.Errorf(\"SSI GenTx Error: balance is not enough\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif out.Asset.Tkt != nil {\n\t\t\tif value, ok := ticekts[out.Asset.Tkt.Value]; ok && value == out.Asset.Tkt.Category {\n\t\t\t\tdelete(ticekts, out.Asset.Tkt.Value)\n\t\t\t} else {\n\t\t\t\te = fmt.Errorf(\"SSI GenTx Erro: balance is not enough\")\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tif amount, ok := amounts[utils.Uint256ToCurrency(&p.Fee.Currency)]; !ok || amount.Cmp(p.Fee.Value.ToInt()) < 0 {\n\t\te = fmt.Errorf(\"SSI GenTx Error: sero amount < Fee\")\n\t\treturn\n\t} else {\n\t\tamount.Sub(amount, p.Fee.Value.ToInt())\n\t\tif amount.Sign() == 0 {\n\t\t\tdelete(amounts, utils.Uint256ToCurrency(&p.Fee.Currency))\n\t\t}\n\t}\n\n\tif len(amounts) > 0 || len(ticekts) > 0 {\n\t\tfor currency, value := range amounts {\n\t\t\tp.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkn: &assets.Token{\n\t\t\t\tCurrency: *common.BytesToHash(common.LeftPadBytes([]byte(currency), 32)).HashToUint256(),\n\t\t\t\tValue:    utils.U256(*value),\n\t\t\t}}})\n\t\t}\n\t\tfor value, category := range ticekts {\n\t\t\tp.Outs = append(p.Outs, txtool.GOut{PKr: p.From.PKr, Asset: assets.Asset{Tkt: &assets.Ticket{\n\t\t\t\tCategory: category,\n\t\t\t\tValue:    value,\n\t\t\t}}})\n\t\t}\n\t}\n\n\twits := []txtool.Witness{}\n\n\tif wits, e = flight.SRI_Inst.GetAnchor(roots); e != nil {\n\t\treturn\n\t}\n\n\tfor i := 0; i < len(wits); i++ {\n\t\tin := txtool.GIn{}\n\t\tin.SKr = param.Ins[i].SKr\n\t\tin.Out = outs[i]\n\t\tin.Witness = wits[i]\n\t\tp.Ins = append(p.Ins, in)\n\t}\n\n\tif e = p.GenZ(); e != nil {\n\t\treturn\n\t}\n\n\tlog.Printf(\"genTxParam ins : %v, outs : %v\", len(p.Ins), len(p.Outs))\n\treturn\n}\n\nfunc (self *SSI) GenTx(param *PreTxParam) (hash c_type.Uint256, e error) {\n\tif p, err := self.GenTxParam(param); err != nil {\n\t\te = err\n\t\treturn\n\t} else {\n\t\tif gtx, err := flight.GenTx(&p); err != nil {\n\t\t\te = err\n\t\t\tlog.Printf(\"genTx error : %v\", err)\n\t\t\treturn\n\t\t} else {\n\t\t\thash = gtx.Tx.ToHash()\n\t\t\ttxMap.Store(hash, &gtx)\n\t\t\tlog.Printf(\"genTx success hash: %s\", common.Bytes2Hex(hash[:]))\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *SSI) GetTx(txhash c_type.Uint256) (tx *txtool.GTx, e error) {\n\tif ld, ok := txMap.Load(txhash); !ok {\n\t\te = fmt.Errorf(\"SSI GetTx Failed : %v\", txhash)\n\t} else {\n\t\tif ld == nil {\n\t\t\te = fmt.Errorf(\"SSI GetTx Nil : %v\", txhash)\n\t\t} else {\n\t\t\ttx = ld.(*txtool.GTx)\n\t\t}\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/wallet/ssi/type.go",
    "content": "package ssi\n\nimport (\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/common/hexutil\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\ntype Out struct {\n\tRoot c_type.Uint256\n\tHash c_type.Uint256\n\tPKr  c_type.PKr\n}\ntype Block struct {\n\tNum  hexutil.Uint64\n\tHash c_type.Uint256\n\tOuts []Out\n\tNils []c_type.Uint256\n}\n\ntype GIn struct {\n\tSKr  c_type.PKr\n\tRoot c_type.Uint256\n}\n\ntype PreTxParam struct {\n\tGas      uint64\n\tGasPrice uint64\n\tFrom     txtool.Kr\n\tIns      []GIn\n\tOuts     []txtool.GOut\n}\n\ntype ISSI interface {\n\tGetBlocksInfo(start uint64, count uint64) ([]Block, error)\n\tDetail(root []c_type.Uint256, skr *c_type.PKr) ([]txtool.DOut, error)\n\tGenTx(param *PreTxParam) (c_type.Uint256, error)\n\tCommitTx(txhash *c_type.Uint256) error\n}\n"
  },
  {
    "path": "zero/wallet/ssi/utils.go",
    "content": "package ssi\n\nimport (\n\t\"encoding/json\"\n\t\"log\"\n\n\t\"github.com/sero-cash/go-sero/zero/txtool/generate/generate_1\"\n\n\t\"github.com/sero-cash/go-czero-import/c_superzk\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-sero/zero/txtool\"\n)\n\nfunc DecNilOuts(outs []txtool.Out, skr *c_type.PKr) (douts []txtool.DOut) {\n\tsk := c_type.Uint512{}\n\tcopy(sk[:], skr[:])\n\ttk, _ := superzk.Sk2Tk(&sk)\n\tfor _, out := range outs {\n\t\tdout := txtool.DOut{}\n\n\t\tdata, _ := json.Marshal(out)\n\t\tlog.Printf(\"DecOuts out : %s\", string(data))\n\n\t\tif out.State.OS.Out_O != nil {\n\t\t\tdout.Asset = out.State.OS.Out_O.Asset.Clone()\n\t\t\tdout.Memo = out.State.OS.Out_O.Memo\n\t\t\tif nl, e := c_superzk.Czero_genNil(&sk, out.State.OS.RootCM); e == nil {\n\t\t\t\tdout.Nil = nl\n\t\t\t}\n\t\t\tlog.Printf(\"DecOuts Out_O\")\n\t\t} else if out.State.OS.Out_Z != nil {\n\t\t\tif key, flag, e := c_superzk.Czero_fetchKey(&tk, &out.State.OS.Out_Z.RPK); e == nil {\n\t\t\t\tif o := generate_1.ConfirmOutZ(&key, flag, out.State.OS.Out_Z); o != nil {\n\t\t\t\t\tdout.Asset = o.Asset\n\t\t\t\t\tdout.Memo = o.Memo\n\t\t\t\t\tif nl, e := c_superzk.Czero_genNil(&sk, out.State.OS.RootCM); e == nil {\n\t\t\t\t\t\tdout.Nil = nl\n\t\t\t\t\t\tlog.Printf(\"DecOuts success\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlog.Printf(\"DecOuts Out_Z\")\n\t\t} else if out.State.OS.Out_P != nil {\n\t\t\tif nl, e := c_superzk.GenNil(&tk, out.State.OS.RootCM, &out.State.OS.Out_P.PKr); e == nil {\n\t\t\t\tdout.Asset = out.State.OS.Out_P.Asset.Clone()\n\t\t\t\tdout.Memo = out.State.OS.Out_P.Memo\n\t\t\t\tdout.Nil = nl\n\t\t\t\tlog.Printf(\"DecOuts success\")\n\t\t\t}\n\t\t\tlog.Printf(\"DecOuts Out_P\")\n\t\t} else if out.State.OS.Out_C != nil {\n\t\t\tif key, _, e := c_superzk.FetchKey(&out.State.OS.Out_C.PKr, &tk, &out.State.OS.Out_C.RPK); e == nil {\n\t\t\t\tif o, _ := generate_1.ConfirmOutC(&key, out.State.OS.Out_C); o != nil {\n\t\t\t\t\tif nl, e := c_superzk.GenNil(&tk, out.State.OS.RootCM.NewRef(), out.State.OS.ToPKr()); e == nil {\n\t\t\t\t\t\tdout.Asset = o.Asset\n\t\t\t\t\t\tdout.Memo = o.Memo\n\t\t\t\t\t\tdout.Nil = nl\n\t\t\t\t\t\tlog.Printf(\"DecOuts success\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlog.Printf(\"DecOuts Out_C\")\n\t\t}\n\t\tdouts = append(douts, dout)\n\n\t\tdata, _ = json.Marshal(douts)\n\t\tlog.Printf(\"DecOuts douts : %s\", string(data))\n\t}\n\treturn\n}\n"
  },
  {
    "path": "zero/wallet/stakeservice/stakeservice.go",
    "content": "package stakeservice\n\nimport (\n\t\"math/big\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/sero-cash/go-sero/rlp\"\n\n\t\"github.com/robfig/cron\"\n\t\"github.com/sero-cash/go-sero/common\"\n\t\"github.com/sero-cash/go-sero/common/math\"\n\t\"github.com/sero-cash/go-sero/zero/utils\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n\t\"github.com/sero-cash/go-czero-import/superzk\"\n\t\"github.com/sero-cash/go-sero/accounts\"\n\t\"github.com/sero-cash/go-sero/core\"\n\t\"github.com/sero-cash/go-sero/event\"\n\t\"github.com/sero-cash/go-sero/log\"\n\t\"github.com/sero-cash/go-sero/serodb\"\n\t\"github.com/sero-cash/go-sero/zero/stake\"\n)\n\ntype Account struct {\n\tpk      *c_type.Uint512\n\ttk      *c_type.Tk\n\tversion int\n}\n\ntype StakeService struct {\n\tbc             *core.BlockChain\n\taccountManager *accounts.Manager\n\tdb             *serodb.LDBDatabase\n\n\taccounts sync.Map\n\tnumbers  sync.Map\n\n\tfeed    event.Feed\n\tupdater event.Subscription        // Wallet update subscriptions for all backends\n\tupdate  chan accounts.WalletEvent // Subscription sink for backend wallet changes\n\tquit    chan chan error\n\tlock    sync.RWMutex\n}\n\nvar current_StakeService *StakeService\n\nfunc CurrentStakeService() *StakeService {\n\treturn current_StakeService\n}\n\nfunc NewStakeService(dbpath string, bc *core.BlockChain, accountManager *accounts.Manager) *StakeService {\n\tupdate := make(chan accounts.WalletEvent, 1)\n\tupdater := accountManager.Subscribe(update)\n\n\tstakeService := &StakeService{\n\t\tbc:             bc,\n\t\taccountManager: accountManager,\n\t\tupdate:         update,\n\t\tupdater:        updater,\n\t}\n\tcurrent_StakeService = stakeService\n\n\tdb, err := serodb.NewLDBDatabase(dbpath, 1024, 1024)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tstakeService.db = db\n\n\tstakeService.numbers = sync.Map{}\n\tstakeService.accounts = sync.Map{}\n\tfor _, w := range accountManager.Wallets() {\n\t\tstakeService.initWallet(w)\n\t}\n\n\tAddJob(\"0/10 * * * * ?\", stakeService.stakeIndex)\n\tgo stakeService.updateAccount()\n\treturn stakeService\n}\n\nfunc (self *StakeService) StakePools() (pools []*stake.StakePool) {\n\titerator := self.db.NewIteratorWithPrefix(poolPrefix)\n\tfor iterator.Next() {\n\n\t\tvalue := iterator.Value()\n\t\tpool := stake.StakePoolDB.GetObject(self.bc.GetDB(), value, &stake.StakePool{})\n\t\tpools = append(pools, pool.(*stake.StakePool))\n\t}\n\titerator.Release()\n\treturn\n}\n\nfunc (self *StakeService) Shares() (shares []*stake.Share) {\n\titerator := self.db.NewIteratorWithPrefix(sharePrefix)\n\tfor iterator.Next() {\n\t\tvalue := iterator.Value()\n\t\tshare := stake.ShareDB.GetObject(self.bc.GetDB(), value, &stake.Share{})\n\t\tshares = append(shares, share.(*stake.Share))\n\t}\n\titerator.Release()\n\treturn\n}\n\nfunc (self *StakeService) SharesInfoByPKr(pkr c_type.PKr) *SharesInfo {\n\thash, err := self.db.Get(pkrInfoKey(pkr))\n\tif err != nil {\n\t\treturn nil\n\t}\n\titem := &SharesInfo{}\n\tif e := rlp.DecodeBytes(hash, item); e != nil {\n\t\treturn nil\n\t}\n\treturn item\n}\n\nfunc (self *StakeService) SharesInfoByPK(pk c_type.Uint512) *SharesInfo {\n\thash, err := self.db.Get(pkInfoKey(pk))\n\tif err != nil {\n\t\treturn nil\n\t}\n\titem := &SharesInfo{}\n\tif e := rlp.DecodeBytes(hash, item); e != nil {\n\t\treturn nil\n\t}\n\treturn item\n}\n\nfunc (self *StakeService) SharesById(id common.Hash) *stake.Share {\n\thash, err := self.db.Get(sharekey(id[:]))\n\tif err != nil {\n\t\treturn nil\n\t}\n\treturn self.getShareByHash(hash)\n}\n\nfunc (self *StakeService) getShareByHash(hash []byte) *stake.Share {\n\tret := stake.ShareDB.GetObject(self.bc.GetDB(), hash, &stake.Share{})\n\tif ret == nil {\n\t\treturn nil\n\t}\n\treturn ret.(*stake.Share)\n}\n\nfunc (self *StakeService) SharesByPk(pk c_type.Uint512) (shares []*stake.Share) {\n\titerator := self.db.NewIteratorWithPrefix(pk[:])\n\tfor iterator.Next() {\n\t\tvalue := iterator.Value()\n\t\tshare := stake.ShareDB.GetObject(self.bc.GetDB(), value, &stake.Share{})\n\t\tshares = append(shares, share.(*stake.Share))\n\t}\n\titerator.Release()\n\treturn\n}\n\nfunc (self *StakeService) SharesInfoByPkr(pkr c_type.PKr) (sharesInfo *SharesInfo) {\n\tif date, err := self.db.Get(pkrInfoKey(pkr)); err != nil {\n\t\treturn\n\t} else {\n\t\tsharesInfo = &SharesInfo{}\n\t\tif e := rlp.DecodeBytes(date, sharesInfo); e != nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn sharesInfo\n\t}\n\treturn\n}\n\nfunc (self *StakeService) SharesInfoByPk(pk c_type.Uint512) (sharesInfo *SharesInfo) {\n\tif date, err := self.db.Get(pkInfoKey(pk)); err != nil {\n\t\treturn\n\t} else {\n\t\tsharesInfo = &SharesInfo{}\n\t\tif e := rlp.DecodeBytes(date, sharesInfo); e != nil {\n\t\t\treturn nil\n\t\t}\n\t\treturn sharesInfo\n\t}\n\treturn\n}\n\nfunc (self *StakeService) SharesByPkr(pkr c_type.PKr) (shares []*stake.Share) {\n\titerator := self.db.NewIteratorWithPrefix(pkr[:])\n\tfor iterator.Next() {\n\t\tvalue := iterator.Value()\n\t\tshare := stake.ShareDB.GetObject(self.bc.GetDB(), value, &stake.Share{})\n\t\tshares = append(shares, share.(*stake.Share))\n\t}\n\titerator.Release()\n\treturn\n}\n\nfunc (self *StakeService) GetBlockRecords(blockNumber uint64) (shares []*stake.Share, pools []*stake.StakePool) {\n\theader := self.bc.GetHeaderByNumber(blockNumber)\n\treturn stake.GetBlockRecords(self.bc.GetDB(), header.Hash(), blockNumber)\n}\n\ntype SharesInfo struct {\n\tTotal       uint32\n\tRemaining   uint32\n\tMissed      uint32\n\tExpired     uint32\n\tShareIds    []common.Hash\n\tProfit      *big.Int `rlp:\"nil\"`\n\tTotalAmount *big.Int `rlp:\"nil\"`\n}\n\nfunc (self *StakeService) getShare(id common.Hash, cache map[common.Hash]*stake.Share) *stake.Share {\n\tif val, ok := cache[id]; ok {\n\t\treturn val\n\t} else {\n\t\treturn self.SharesById(id)\n\t}\n}\n\nfunc (self *StakeService) getStakeInfoByPKr(pkr c_type.PKr, cache map[c_type.PKr]*SharesInfo) *SharesInfo {\n\tif val, ok := cache[pkr]; ok {\n\t\treturn val\n\t} else {\n\t\tinfo := self.SharesInfoByPKr(pkr)\n\t\tif info != nil {\n\t\t\tcache[pkr] = info\n\t\t}\n\t\treturn info\n\t}\n}\n\nfunc (self *StakeService) getStakeInfoByPK(pk c_type.Uint512, cache map[c_type.Uint512]*SharesInfo) *SharesInfo {\n\tif val, ok := cache[pk]; ok {\n\t\treturn val\n\t} else {\n\t\tinfo := self.SharesInfoByPK(pk)\n\t\tif info != nil {\n\t\t\tcache[pk] = info\n\t\t}\n\t\treturn info\n\t}\n}\n\nfunc (self *StakeService) stakeIndex() {\n\tstart := uint64(math.MaxUint64)\n\tself.numbers.Range(func(key, value interface{}) bool {\n\t\tnum := value.(uint64)\n\t\tif start > num {\n\t\t\tstart = num\n\t\t}\n\t\treturn true\n\t})\n\tif start == uint64(math.MaxUint64) {\n\t\treturn\n\t}\n\tif !seroparam.Is_Dev() && start < 1300000 {\n\t\tstart = 1300000\n\t}\n\n\theader := self.bc.CurrentHeader()\n\tsharesCount := 0\n\tpoolsCount := 0\n\tbatch := self.db.NewBatch()\n\tblocNumber := start\n\tsharesCache := map[common.Hash]*stake.Share{}\n\tpkrStakeInfoCache := map[c_type.PKr]*SharesInfo{}\n\tpkStakeInfoCache := map[c_type.Uint512]*SharesInfo{}\n\tfor blocNumber+seroparam.DefaultConfirmedBlock() <= header.Number.Uint64() {\n\t\tshares, pools := self.GetBlockRecords(blocNumber)\n\t\tfor _, share := range shares {\n\t\t\t// batch.Put(sharekey(share.Id()), share.State())\n\t\t\t// batch.Put(pkrShareKey(share.PKr, share.Id()), share.State())\n\n\t\t\tself.indexStakeInfoByPKr(share.PKr, pkrStakeInfoCache, share, sharesCache, blocNumber, batch)\n\t\t\tif accountKey, ok := self.ownPkr(share.PKr); ok {\n\t\t\t\t// batch.Put(pkShareKey(accountKey, share.Id()), share.State())\n\t\t\t\tself.indexStakeInfoByPK(*accountKey, pkStakeInfoCache, share, sharesCache, blocNumber, batch)\n\t\t\t}\n\t\t\tsharesCache[common.BytesToHash(share.Id())] = share\n\t\t}\n\n\t\tfor _, pool := range pools {\n\t\t\tbatch.Put(poolKey(pool.Id()), pool.State())\n\t\t}\n\t\tsharesCount += len(shares)\n\t\tpoolsCount += len(pools)\n\t\tblocNumber++\n\t\tif blocNumber-start >= 10000 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tfor _, share := range sharesCache {\n\t\thash := share.State()\n\t\tid := share.Id()\n\t\tbatch.Put(sharekey(id), hash)\n\t\tbatch.Put(pkrShareKey(share.PKr, id), hash)\n\n\t\tif accountKey, ok := self.ownPkr(share.PKr); ok {\n\t\t\tbatch.Put(pkShareKey(accountKey, id), hash)\n\t\t}\n\t}\n\n\tfor key, val := range pkrStakeInfoCache {\n\t\tif b, err := rlp.EncodeToBytes(val); err != nil {\n\t\t\tpanic(err)\n\t\t} else {\n\t\t\tif err := batch.Put(pkrInfoKey(key), b); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t}\n\n\tfor key, val := range pkStakeInfoCache {\n\t\tif b, err := rlp.EncodeToBytes(&val); err != nil {\n\t\t\tpanic(err)\n\t\t} else {\n\t\t\tif err := batch.Put(pkInfoKey(key), b); err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t}\n\n\tif blocNumber == start {\n\t\treturn\n\t}\n\n\tself.numbers.Range(func(key, value interface{}) bool {\n\t\tpk := key.(c_type.Uint512)\n\t\tbatch.Put(numKey(pk), utils.EncodeNumber(blocNumber))\n\t\treturn true\n\t})\n\terr := batch.Write()\n\tif err == nil {\n\t\tself.numbers.Range(func(key, value interface{}) bool {\n\t\t\tpk := key.(c_type.Uint512)\n\t\t\tself.numbers.Store(pk, blocNumber)\n\t\t\treturn true\n\t\t})\n\t\tlog.Info(\"StakeIndex\", \"blockNumber\", blocNumber, \"sharesCount\", sharesCount, \"poolsCount\", poolsCount)\n\t}\n}\n\nfunc (self *StakeService) indexStakeInfoByPKr(pkr c_type.PKr, stakeInfoCache map[c_type.PKr]*SharesInfo, share *stake.Share, sharesCache map[common.Hash]*stake.Share, blocNumber uint64, batch serodb.Batch) {\n\tsharesInfo := self.getStakeInfoByPKr(pkr, stakeInfoCache)\n\tif sharesInfo == nil {\n\t\tsharesInfo = &SharesInfo{\n\t\t\tProfit:      new(big.Int),\n\t\t\tTotalAmount: new(big.Int),\n\t\t}\n\t\tstakeInfoCache[pkr] = sharesInfo\n\t}\n\n\tself.updateSharesInfo(share, sharesCache, sharesInfo, blocNumber)\n}\n\nfunc (self *StakeService) indexStakeInfoByPK(pk c_type.Uint512, stakeInfoCache map[c_type.Uint512]*SharesInfo, share *stake.Share, sharesCache map[common.Hash]*stake.Share, blocNumber uint64, batch serodb.Batch) {\n\tsharesInfo := self.getStakeInfoByPK(pk, stakeInfoCache)\n\tif sharesInfo == nil {\n\t\tsharesInfo = &SharesInfo{\n\t\t\tProfit:      new(big.Int),\n\t\t\tTotalAmount: new(big.Int),\n\t\t}\n\t\tstakeInfoCache[pk] = sharesInfo\n\t}\n\n\tself.updateSharesInfo(share, sharesCache, sharesInfo, blocNumber)\n}\n\nfunc (self *StakeService) updateSharesInfo(share *stake.Share, sharesCache map[common.Hash]*stake.Share, sharesInfo *SharesInfo, blocNumber uint64) {\n\tid := common.BytesToHash(share.Id())\n\n\toldShare := self.getShare(id, sharesCache)\n\t// sharesCache[id] = share\n\tif oldShare != nil {\n\t\tif share.WillVoteNum > oldShare.WillVoteNum {\n\t\t\tsharesInfo.Missed += (share.WillVoteNum - oldShare.WillVoteNum)\n\t\t} else if share.WillVoteNum < oldShare.WillVoteNum {\n\t\t\tif sharesInfo.Missed >= (oldShare.WillVoteNum - share.WillVoteNum) {\n\t\t\t\tsharesInfo.Missed -= (oldShare.WillVoteNum - share.WillVoteNum)\n\t\t\t}\n\t\t}\n\n\t\tif oldShare.Status == stake.STATUS_VALID {\n\t\t\tif sharesInfo.Remaining >= (oldShare.Num - share.Num) {\n\t\t\t\tsharesInfo.Remaining -= (oldShare.Num - share.Num)\n\t\t\t}\n\t\t}\n\n\t\tif oldShare.Status == stake.STATUS_VALID && share.Status == stake.STATUS_OUTOFDATE {\n\t\t\tif sharesInfo.Remaining >= share.Num {\n\t\t\t\tsharesInfo.Remaining -= share.Num\n\t\t\t}\n\t\t\tsharesInfo.Expired += share.Num\n\t\t}\n\t\tsharesInfo.Profit = big.NewInt(0).Add(sharesInfo.Profit, new(big.Int).Sub(share.Profit, oldShare.Profit))\n\t} else {\n\t\tsharesInfo.ShareIds = append(sharesInfo.ShareIds, id)\n\t\tsharesInfo.Total += share.InitNum\n\n\t\tif share.Status == stake.STATUS_VALID {\n\t\t\tsharesInfo.Remaining += share.Num\n\t\t} else {\n\t\t\tsharesInfo.Expired += share.Num\n\t\t}\n\n\t\tsharesInfo.Missed += share.WillVoteNum\n\t\tsharesInfo.Profit = new(big.Int).Add(sharesInfo.Profit, share.Profit)\n\t\tsharesInfo.TotalAmount = new(big.Int).Add(sharesInfo.TotalAmount, new(big.Int).Mul(big.NewInt(int64(share.InitNum)), share.Value))\n\t}\n\n\tif share.LastPayTime == blocNumber {\n\t\tif oldShare != nil && oldShare.LastPayTime != 0 {\n\t\t\theader := self.bc.GetBlockByNumber(oldShare.LastPayTime)\n\t\t\tsnapshot := stake.GetShareByBlockNumber(self.bc.GetDB(), id, header.Hash(), header.NumberU64())\n\t\t\tif snapshot != nil {\n\t\t\t\tmul := new(big.Int).Mul(big.NewInt(int64(\n\t\t\t\t\t(snapshot.Num+snapshot.WillVoteNum)-(share.Num+share.WillVoteNum))),\n\t\t\t\t\tshare.Value)\n\t\t\t\tif sharesInfo.TotalAmount.Cmp(mul) >= 0 {\n\t\t\t\t\tsharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tmul := new(big.Int).Mul(big.NewInt(int64(\n\t\t\t\tshare.InitNum-share.Num-share.WillVoteNum)),\n\t\t\t\tshare.Value)\n\t\t\tif sharesInfo.TotalAmount.Cmp(mul) >= 0 {\n\t\t\t\tsharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul)\n\t\t\t}\n\t\t}\n\n\t\tif share.Status == stake.STATUS_OUTOFDATE {\n\t\t\tmul := new(big.Int).Mul(big.NewInt(int64(\n\t\t\t\tshare.Num)),\n\t\t\t\tshare.Value)\n\t\t\tif sharesInfo.TotalAmount.Cmp(mul) >= 0 {\n\t\t\t\tsharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul)\n\t\t\t}\n\t\t}\n\t\tif share.Status == stake.STATUS_FINISHED {\n\t\t\tmul := new(big.Int).Mul(big.NewInt(int64(\n\t\t\t\tshare.WillVoteNum)),\n\t\t\t\tshare.Value)\n\t\t\tif sharesInfo.TotalAmount.Cmp(mul) >= 0 {\n\t\t\t\tsharesInfo.TotalAmount = new(big.Int).Sub(sharesInfo.TotalAmount, mul)\n\t\t\t}\n\t\t}\n\t}\n\n\tif stake.STATUS_FINISHED == share.Status {\n\t\tfor i, each := range sharesInfo.ShareIds {\n\t\t\tif each == id {\n\t\t\t\tsharesInfo.ShareIds = append(sharesInfo.ShareIds[:i], sharesInfo.ShareIds[i+1:]...)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (self *StakeService) ownPkr(pkr c_type.PKr) (pk *c_type.Uint512, ok bool) {\n\tvar account *Account\n\tself.accounts.Range(func(key, value interface{}) bool {\n\t\ta := value.(*Account)\n\t\tif superzk.IsMyPKr(a.tk, &pkr) {\n\t\t\taccount = a\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t})\n\tif account != nil {\n\t\treturn account.pk.NewRef(), true\n\t}\n\treturn\n}\n\nfunc (self *StakeService) updateAccount() {\n\t// Close all subscriptions when the manager terminates\n\tdefer func() {\n\t\tself.lock.Lock()\n\t\tself.updater.Unsubscribe()\n\t\tself.updater = nil\n\t\tself.lock.Unlock()\n\t}()\n\n\t// Loop until termination\n\tfor {\n\t\tselect {\n\t\tcase event := <-self.update:\n\t\t\t// Wallet event arrived, update local cache\n\t\t\tself.lock.Lock()\n\t\t\tswitch event.Kind {\n\t\t\tcase accounts.WalletArrived:\n\t\t\t\tself.initWallet(event.Wallet)\n\t\t\tcase accounts.WalletDropped:\n\t\t\t\taddress := event.Wallet.Accounts()[0].GetPk()\n\t\t\t\tself.numbers.Delete(address)\n\t\t\t}\n\t\t\tself.lock.Unlock()\n\n\t\tcase errc := <-self.quit:\n\t\t\t// Manager terminating, return\n\t\t\terrc <- nil\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (self *StakeService) initWallet(w accounts.Wallet) {\n\tif _, ok := self.accounts.Load(w.Accounts()[0].GetPk()); !ok {\n\t\taccount := Account{}\n\t\taccount.pk = w.Accounts()[0].GetPk().NewRef()\n\t\taccount.tk = w.Accounts()[0].Tk.ToTk().NewRef()\n\t\taccount.version = w.Accounts()[0].Version\n\t\tself.accounts.Store(*account.pk, &account)\n\n\t\tvar num uint64\n\t\tif num = self.starNum(account.pk); num < w.Accounts()[0].At {\n\t\t\tnum = w.Accounts()[0].At\n\t\t}\n\t\tself.numbers.Store(*account.pk, num)\n\t\tlog.Info(\"Add PK\", \"pk\", w.Accounts()[0].Address, \"At\", num)\n\t}\n}\n\nfunc (self *StakeService) starNum(pk *c_type.Uint512) uint64 {\n\tvalue, err := self.db.Get(numKey(*pk))\n\tif err != nil {\n\t\treturn 0\n\t}\n\treturn utils.DecodeNumber(value)\n}\n\nvar (\n\tnumPrefix     = []byte(\"NUM\")\n\tsharePrefix   = []byte(\"SHARE\")\n\tpoolPrefix    = []byte(\"POOL\")\n\tpkrInfoPrefix = []byte(\"PKRINFO\")\n\tpkInfoPrefix  = []byte(\"PKINFO\")\n)\n\nfunc pkShareKey(pk *c_type.Uint512, key []byte) []byte {\n\treturn append(pk[:], key[:]...)\n}\n\nfunc pkrShareKey(pk c_type.PKr, key []byte) []byte {\n\treturn append(pk[:], key[:]...)\n}\n\nfunc sharekey(key []byte) []byte {\n\treturn append(sharePrefix, key[:]...)\n}\n\nfunc poolKey(key []byte) []byte {\n\treturn append(poolPrefix, key[:]...)\n}\n\nfunc numKey(pk c_type.Uint512) []byte {\n\treturn append(numPrefix, pk[:]...)\n}\n\nfunc pkrInfoKey(pkr c_type.PKr) []byte {\n\treturn append(pkrInfoPrefix, pkr[:]...)\n}\n\nfunc pkInfoKey(pk c_type.Uint512) []byte {\n\treturn append(pkInfoPrefix, pk[:]...)\n}\n\nfunc AddJob(spec string, run RunFunc) *cron.Cron {\n\tc := cron.New()\n\tc.AddJob(spec, &RunJob{run: run})\n\tc.Start()\n\treturn c\n}\n\ntype (\n\tRunFunc func()\n)\n\ntype RunJob struct {\n\trunning int32\n\trun     RunFunc\n}\n\nfunc (r *RunJob) Run() {\n\tx := atomic.LoadInt32(&r.running)\n\tif x == 1 {\n\t\treturn\n\t}\n\n\tatomic.StoreInt32(&r.running, 1)\n\tdefer func() {\n\t\tatomic.StoreInt32(&r.running, 0)\n\t}()\n\n\tr.run()\n}\n"
  },
  {
    "path": "zero/zconfig/backup.go",
    "content": "// Copyright 2020 The sero Authors\n// This file is part of the sero library.\n//\n// The sero library is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser 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// The sero library 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 Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with the sero library. If not, see <http://www.gnu.org/licenses/>.\n\npackage zconfig\n\nimport \"path/filepath\"\n\nfunc Backup_dir() string {\n\treturn filepath.Join(dir, \"backup\")\n}\n"
  },
  {
    "path": "zero/zconfig/balance.go",
    "content": "package zconfig\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n)\n\nfunc Balance_dir() string {\n\treturn filepath.Join(dir, \"balance\")\n}\n\nfunc Init_Balance_dir() {\n\tos.Mkdir(Balance_dir(), os.ModePerm)\n}\n\nvar eroot_json = `[\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae01\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae02\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae03\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae04\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae05\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae06\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae07\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae08\",\n\t\"0xeb85bf17f7f2fe9a1410f99f7e174b409f48479addd41266779308780406ae09\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa1\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa2\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa3\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa4\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa5\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa6\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa7\",\n\t\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa9\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f611\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f612\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f613\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f614\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f615\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f616\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f617\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f618\",\n\t\"0x6a6f6429fa3901b196c69400c3cd6219d81d119b8c7eaf5319851ff28b26f619\"\n]`\n\n//\"0x75a2488445fb7ec5d37f4740b15f976ae35c358e01806701dca891221bdecfa8\",\n\nfunc error_roots() (ret map[c_type.Uint256]bool) {\n\tret = make(map[c_type.Uint256]bool)\n\tvar erts []c_type.Uint256\n\tjson.Unmarshal([]byte(eroot_json), &erts)\n\n\tfor _, ert := range erts {\n\t\tvar key c_type.Uint256\n\t\tcopy(key[:], ert[:])\n\t\tret[key] = true\n\t}\n\treturn\n}\n\nvar ERS = error_roots()\n\nfunc IsValidRoot(root c_type.Uint256) bool {\n\treturn true\n\t/*if _, ok := ERS[root]; ok {\n\t\treturn false\n\t} else {\n\t\treturn true\n\t}*/\n}\n"
  },
  {
    "path": "zero/zconfig/checkpoint.go",
    "content": "package zconfig\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/sero-cash/go-czero-import/c_type\"\n\t\"github.com/sero-cash/go-czero-import/seroparam\"\n)\n\n/*******\nvar current=sero.blockNumber\nfor(var i=0;i<current;i+=10000) {\n\tconsole.log('{\"Num\":'+i+',\"Root\":\"'+sero.getBlock(i).stateRoot+'\"},')\n}\n********/\n\nvar checkpoints_json = `[\n{\"Num\":10000,\"Root\":\"0xcd9587c499db006a592554f4abcb4bb8365c1770df95583471bde010d6b5a490\"},\n{\"Num\":20000,\"Root\":\"0xefdfb2c3fd89654fdbf820c825315ba1bfd1e4db5f24c76fbc49ace31dcb5cae\"},\n{\"Num\":30000,\"Root\":\"0x4213e8bfa24e46176aa8c8d3695ca218e9f7e062954ea90ff0f33b9c06dcfd91\"},\n{\"Num\":40000,\"Root\":\"0x6af932bc35db057969320441839f673e2c7a2c77a958e1cc546eee2d0aba3c52\"},\n{\"Num\":50000,\"Root\":\"0x59344f2c16f736303ba9a0a104dbbc8cbed26770c9107d5e0909ab9149488f0a\"},\n{\"Num\":60000,\"Root\":\"0x79766862a12638c46f5b2d2dc9c5014a738e71cd7e84c08d0ff785b10954720b\"},\n{\"Num\":70000,\"Root\":\"0x838486e8f63f98cbd3ce417026558e63a135f03c6cdba20cf88d80f1b662cfc5\"},\n{\"Num\":80000,\"Root\":\"0x3290fc56d1226e853d2e26096454a10dc5b9339196234984a655e839c1d4fe8b\"},\n{\"Num\":90000,\"Root\":\"0xaba3f48b5384e9265c5d1b0f561d3decafd113c5d04f937a4e0161e040753e56\"},\n{\"Num\":100000,\"Root\":\"0xa2f85951bf5c634bbe1bc911c2da4e7e20756500fe5266dc250bfc46846e87b9\"},\n{\"Num\":110000,\"Root\":\"0x586ec0c5f7f8c31f424e5bc5c9f78d01c4b4c0517cdc57e24e42b443cc34e95c\"},\n{\"Num\":120000,\"Root\":\"0x947f60a772a331db579dbe4e5d1a3d40af27c545d921d87a8ea4a5cc02fc0e9b\"},\n{\"Num\":130000,\"Root\":\"0x0b915d1ba6ea3e77662e56f7c2eb4b1f78ba3c69c5f3095f950d0cbcaa13b9a1\"},\n{\"Num\":140000,\"Root\":\"0x284fbe7f648335354f150b7d7fb3b5a6f00b21b368656bd93c0041133ef3733b\"},\n{\"Num\":150000,\"Root\":\"0x9b0a11c49ef30734192336a22dd946bb8c54e5b86ab51b4c191655d53fe983aa\"},\n{\"Num\":160000,\"Root\":\"0x9bd3a200a8e3e7af5d0ad40c4659c40e3ddd63d426ceb49344415443b501e241\"},\n{\"Num\":170000,\"Root\":\"0xeb2d8c03537fc5eecae7186f19a7e5ed0bcba6343454b08b3d8e56ddc2b438da\"},\n{\"Num\":180000,\"Root\":\"0x8ccc6b569c2df237e954a8422eda15a15d6530e6fd6f8fe2815a0fe8f54e2461\"},\n{\"Num\":190000,\"Root\":\"0x839cc55124f07747f7af5232e9c6b25f3c6d3e99e19e1da0a29920ef21294ce4\"},\n{\"Num\":200000,\"Root\":\"0x25be98af6587e55885c8f8fa2f23bb45dfe0d774afad64478f73bc61b5ac2994\"},\n{\"Num\":210000,\"Root\":\"0xe9e27f595e5ad30b153ce6c3d50a447572dfaf25bec356cb27d33b0c6e5d849e\"},\n{\"Num\":220000,\"Root\":\"0x730c42a8be29f91058db7cb4a4e9565ba7f82b6c3beb78dbe081be56e150f0a9\"},\n{\"Num\":230000,\"Root\":\"0x1aaf6cb4847ce78082ed2bdb27066f07dc465cdd3886afe66e40490e0e5024bd\"},\n{\"Num\":240000,\"Root\":\"0xa85f17ec3805d6332afebf3ef18ee7ad22328921de0845d13cdfff0c6be39d11\"},\n{\"Num\":250000,\"Root\":\"0x163563cae7794a0fdd4f212d800901ca985964b16a30cc0f99b0408b694b8bda\"},\n{\"Num\":260000,\"Root\":\"0x5c57bba48256818ed7c3e08045b2fbcb37deee697389d846b6e0463b7c93fd34\"},\n{\"Num\":270000,\"Root\":\"0x9bb9f7271f056b262f492e9ae16d2bf6d7d067e0385d1608863a775c94c7e89f\"},\n{\"Num\":280000,\"Root\":\"0xc07c6f311faa98ad1b6d9b40b7bdda5237cc6d4204059e3cff8fe21d48ee01e7\"},\n{\"Num\":290000,\"Root\":\"0x337950aa76b9ec626318a433d1ceae1d016918f2811072e2af22d1541ac78374\"},\n{\"Num\":300000,\"Root\":\"0xa236b6918a2def438169439061668a885c2cd98a578a31f7f144f4a368354467\"},\n{\"Num\":310000,\"Root\":\"0x718cd32fca605f42fe7ebb3f5979771ce1d722161ae54f5ec5b452d2688304e8\"},\n{\"Num\":320000,\"Root\":\"0x797b3da43895611b006ac35681aae7deaeb56ccb9dedbc1b4573de17e3d92ee2\"},\n{\"Num\":330000,\"Root\":\"0xa136c680eca63c182e722c68f2ff7927fcf979aa18a71c47b28f3305b5c456de\"},\n{\"Num\":340000,\"Root\":\"0xff09c0e79c8645cd4bb47968336446c0f5ae8eb442095bf05b4d26ffc6cd209c\"},\n{\"Num\":350000,\"Root\":\"0x3af050024d1ecfbb132fae8476bd1eb19246ba27967e72f3c40f4cbb8fa445ee\"},\n{\"Num\":360000,\"Root\":\"0xe6c759b313d195ca0d7c35aafef3df36f2392f259ec33d79ce737a0a63aedb0f\"},\n{\"Num\":370000,\"Root\":\"0x6abb17acb1777b1a466f7a4b1f6bbe77f6b15bf1b86601294ea8d252ce04999a\"},\n{\"Num\":380000,\"Root\":\"0x30fde8a2291e9b2e20f183da2ecc044d52acd3ccf0324cc5368d4c7ab4390e73\"},\n{\"Num\":390000,\"Root\":\"0xeb54e46a2017ed43c1b1392e5dae813b75b753de0488c1293032e98ca7f0cf86\"},\n{\"Num\":400000,\"Root\":\"0x863cd150279e46a7fceb4ce4f822c163d7da6ae62d7dfa03aca2b979ae945429\"},\n{\"Num\":410000,\"Root\":\"0xd6cd5173f7be0a6dfe624219c52f0933c11840045aa3ce6363559dffd8103b3d\"},\n{\"Num\":420000,\"Root\":\"0x22f4f8d41e958dbd842ffcdd5fc3ffa505432d4965e567fe356cea363103c6a2\"},\n{\"Num\":430000,\"Root\":\"0xb6001748e691f05ebbf3907b02350fba2d9e5ccdf76488bfb17b8fbd194fe946\"},\n{\"Num\":440000,\"Root\":\"0xc2ede3a881aa96b3562f2429c61760996cbd405834492b9ef2993f9ed3c76049\"},\n{\"Num\":450000,\"Root\":\"0x84a0eb99a7728183e16fbf7ada642f4f26084763b055c74e2bd0248b50506507\"},\n{\"Num\":460000,\"Root\":\"0x289fcb3ce0a1eab70a6faa03fafb5c6576ee3350a4c4930d73454a15dbca63fc\"},\n{\"Num\":470000,\"Root\":\"0xcc46d72a69421ddc5da7425cae1142ec91e8191673b1464ef02d9e50e2df9c2a\"},\n{\"Num\":480000,\"Root\":\"0x4421b99bc117a60b42e4d3227b44e6a88c8a662edcfb9cc6a9b4d8fbf7f5221e\"},\n{\"Num\":490000,\"Root\":\"0x8b40e4e432b80c82457f3efe0381952a534a3ac5f8e9ddda27b9cbf440fb0a2d\"},\n{\"Num\":500000,\"Root\":\"0x5232d67c9b9d5040ec0b1b4b26cd3ce7231bfb15b4385396863751234e3c6ce6\"},\n{\"Num\":510000,\"Root\":\"0xad44ce5d17f2487eee8345b907bb619691247b95ed09e040c1b5717d8592eef5\"},\n{\"Num\":520000,\"Root\":\"0x6437748164638539586bd3f1fde9c5f26f4022dd65e3743b85319521c0dd2d90\"},\n{\"Num\":530000,\"Root\":\"0x1aa4265bcdfb52212272065edef5744f8ec98d221c5d5083358ebefb6a5a633d\"},\n{\"Num\":540000,\"Root\":\"0x7fe2560aafb35ad1b06ead7e4579147657150e334d5459dd4c40d24acccd1966\"},\n{\"Num\":550000,\"Root\":\"0xc7f3ffab0814f5a00602c7ae934453429696b1d1daa6be0112532a4e68d052c1\"},\n{\"Num\":560000,\"Root\":\"0x4d19cf78ae4d3c05fc4664ca1baac62ad78fc7a37b2f11f2c77943e82b4c3791\"},\n{\"Num\":570000,\"Root\":\"0xbe5f7face52b2c815919aa6702e801eb6cd2bef1a5e86de6ba45dda0b6eba166\"},\n{\"Num\":580000,\"Root\":\"0x625d02cdb2b9a90bee493321963b6ebb0210b0d1d807f9b395060f99a3611b61\"},\n{\"Num\":590000,\"Root\":\"0x44659ea294fef4f21a1ee09f75e424c918bcd18fc936891acd2828862b3311d9\"},\n{\"Num\":600000,\"Root\":\"0x34a4c75db8ecab1e4f7f172a42744ffa6af0df38231bf00b6dbbfe88395a2f59\"},\n{\"Num\":610000,\"Root\":\"0x0c2e94c0abafaad9009e7a915b18e32bd32fefc1bf60c8d55e7f2bda6b6d417d\"},\n{\"Num\":620000,\"Root\":\"0x624c0515061f3b35d76f8990f958af9d4e8c707759c7d9db3212502a5baed277\"},\n{\"Num\":630000,\"Root\":\"0xc0b472ac9bc7dcd0919d2a698695cd4da5f294970d4d12ce9721657a7cf89dd3\"},\n{\"Num\":640000,\"Root\":\"0x070f1bbff21a9d24848aad3bd4500fc0aac6d7593896a211fffafe085b425473\"},\n{\"Num\":650000,\"Root\":\"0x7db0b840ed88760edcfa317a1c6bab72d988bd068605fa85e408826952fb6453\"},\n{\"Num\":660000,\"Root\":\"0x199036d45e635ab31de4c5324a7777f81d37efe37b7a083c7ae0bbc9f6ad45ac\"},\n{\"Num\":670000,\"Root\":\"0x22a4bfc050c63742f942cdb95559d2f76f2e2f70eacc4de424eccb8ef722a777\"},\n{\"Num\":680000,\"Root\":\"0xeff0709e0b8df7dd3c8b881cab0dbdafacd50d8d36b294a9873033520582fdea\"},\n{\"Num\":690000,\"Root\":\"0xbac6db023a1eb68fdf59c9e87afd58ed5153c2e7ed043e4f8ca1ba9b7b6adb78\"},\n{\"Num\":700000,\"Root\":\"0xaf621ba8c2665ab54a2cacabf2169f951985111cebb49c44b6aad481fd4de24a\"},\n{\"Num\":710000,\"Root\":\"0x702c54ea498ee1638cc1a225bd0a2b8e74127b4fc7e059d6db9538a9f34064d9\"},\n{\"Num\":720000,\"Root\":\"0x5b74933fd3e6c916304ab608bdb603c357a37e2ac76266ea33e782451c7035bb\"},\n{\"Num\":730000,\"Root\":\"0x37fac9b6bcf1cfb4caf6a23561c6b27b6446fdd7a368a387c58e6c68483dffcd\"},\n{\"Num\":740000,\"Root\":\"0x268a0e1f6b52e53b549bf97eced44a9f86d712340c557af21d5735d836e3cd59\"},\n{\"Num\":750000,\"Root\":\"0x8b619837fa8eff8ab6fc0f703ca85fed039c5e4678ddbe4cd270b14c88df1446\"},\n{\"Num\":760000,\"Root\":\"0x3f70723a651afdaff4b49f6ea61bde6312cbcd2d4cfba421e0f755b94e104682\"},\n{\"Num\":770000,\"Root\":\"0x6bc907e05389851b637b4d5d587278ef05fce584a4b32844ad536b3464838a90\"},\n{\"Num\":780000,\"Root\":\"0x9ad8c57f44b80e34e85fe4f87ab6ca0a5da035517eb1a674eceb264ae5daf547\"},\n{\"Num\":790000,\"Root\":\"0x8b456150a4785d02c51b40b69ebb2ee58a7c8b9918fe234e73d1c17ac3c25b8a\"},\n{\"Num\":800000,\"Root\":\"0x43c879567982ad241950788f581b1a3c78744fa9194a36813135e1e0ed24741f\"},\n{\"Num\":810000,\"Root\":\"0x6f6312f45a4385c04b039a5231cae31fef4bb132cc1fd6c85660e57daa69b2e9\"},\n{\"Num\":820000,\"Root\":\"0xcc50107df9d21f437126cfe19da2dbdda14a6e1a31420dd9d678f1b2c43afdc4\"},\n{\"Num\":830000,\"Root\":\"0xba2c1974022c5f454a0c4a4a64d04d1f8bebad92005bdfa0a475fba7b03e2880\"},\n{\"Num\":840000,\"Root\":\"0xc990b02617928ac32b0532d08cdf93e25bf79a17976e5015c5c06e2e7736c829\"},\n{\"Num\":850000,\"Root\":\"0x1970b08132c86ba8d14373ca17273142d85e0424c50078ceec40e673e67dd36f\"},\n{\"Num\":860000,\"Root\":\"0x958e5079aa7aadc11d08f770770196384eb08ccb91ce6377002cd152b5d5efc8\"},\n{\"Num\":870000,\"Root\":\"0x6641a30ba2bcfbf8f850046b3cb35c124725474cd20fcf87e858682ffafe31a5\"},\n{\"Num\":880000,\"Root\":\"0xaec011fc471e6a16ce093c10cd45385934861872dd888a28e39d9f9df6bbad2c\"},\n{\"Num\":890000,\"Root\":\"0x37f7f8833b3379b90ccbf9988f046c4eb30d25b11923c8dab21d9df1e3e1a540\"},\n{\"Num\":900000,\"Root\":\"0x9080e00760cc6dd53bd8ab3188e792feacaea61f0c0c47a6c51b68a947a60481\"},\n{\"Num\":910000,\"Root\":\"0x35263a79cba25fa655c50648197d886c9cda419fa9f76751195b555cb7397933\"},\n{\"Num\":920000,\"Root\":\"0xd23af42fa657b1ce7470f85bb4632d7990385728771346a96f67858bed64e966\"},\n{\"Num\":930000,\"Root\":\"0x0fc3e9a2d476f2018783b6ea739c3eb7e0b1b1ddbd79529a7c1f4c7a9cee0940\"},\n{\"Num\":940000,\"Root\":\"0x13ad6d7788dc9f115fd980fb82b68eed984ec24f389252233f27fc2f18dfa3eb\"},\n{\"Num\":950000,\"Root\":\"0x625c459784f8c12954a75eb90fc906256f5fa7220595a7f5b5a6368a92280a39\"},\n{\"Num\":960000,\"Root\":\"0x83d32e87425d4f74eb46ecd380c013a747a6c260ba7cca48d68a5e30c73373a6\"},\n{\"Num\":970000,\"Root\":\"0xd68e94cb38e2e84177b562f17a8491ca36ce3dab7d802422ea4301d648b14687\"},\n{\"Num\":980000,\"Root\":\"0xa544d8febd14080421dc85e1283d1aee4cbf83741fd0a7e94b213686cee9ea3e\"},\n{\"Num\":990000,\"Root\":\"0x4fe87930525d2a66bb0ea4af4e8cea41da11b924394a0b4cd6d6e1af8bd990a2\"},\n{\"Num\":1000000,\"Root\":\"0x2e48fe82e83726c0a4de8b7a9244bbc70afe8378365910694f75e1c35c2f87c7\"},\n{\"Num\":1010000,\"Root\":\"0x6ec880002c21347ddb5aa42732b03c0cc6dea08315687dbdcd84b7f4072d8c3c\"},\n{\"Num\":1020000,\"Root\":\"0xcad3f8876d26c0831175081fc81c5357096e3f3f9d400316cb226a3fd57661e3\"},\n{\"Num\":1030000,\"Root\":\"0x618bbf408496dc434ea2c205552098ff8f2354d6b076a22a276be0bb2a161d6c\"},\n{\"Num\":1040000,\"Root\":\"0xcb0e6cce596aeb66dfae301fecc871a382ed05ac5d1a63f1db6ccfc54581c36d\"},\n{\"Num\":1050000,\"Root\":\"0x858050f9ac86d3d69c524457dcce3c108a9a138fb2fae9920dbedf56c081d3b1\"},\n{\"Num\":1060000,\"Root\":\"0xc3caebd9204e7dd57792606bd6f60a87c77c9b38b9ff349126ae27b4df0b49c0\"},\n{\"Num\":1070000,\"Root\":\"0x7313e275126210da6dfe1dc1020eafc1878a8e2a5b53a2461aa3671db268623f\"},\n{\"Num\":1080000,\"Root\":\"0x7113e40fef31ebe856774ce8d08d0fcc55bbae2cf4057318442f9bb3715087da\"},\n{\"Num\":1090000,\"Root\":\"0x9f8e20a9aaefc51805d3d0200dedb7ac6d01070d8eb0455f96a08310edab6599\"},\n{\"Num\":1100000,\"Root\":\"0x209413182efbf4f61d28038f4359bb535e1ba30ceb886629d0aa7b0a37f3b60c\"},\n{\"Num\":1110000,\"Root\":\"0x112193d27f9325d5ae4cf10714fca30f9f22b7b35e2cfd30b24a1cbb80c1fb25\"},\n{\"Num\":1120000,\"Root\":\"0x6ae9b88309b6c3c4f2c388bd89d4b6bda5ec48547c9b2118af2ccbb24f7f7cc2\"},\n{\"Num\":1130000,\"Root\":\"0x0a66f9e7a92cf1ab777f8b3d9b239f5350d46fe03cffc2007bb5dd1f0de1e4d9\"},\n{\"Num\":1140000,\"Root\":\"0x00e64dacd2a14e5ff399d69e3a613a441d019ce47dd72d0693648ae65fe06aaa\"},\n{\"Num\":1150000,\"Root\":\"0xbde6eb447706c480bdac3e6919331f609ce4eae03f80a83c52cf1cce83dd06d4\"},\n{\"Num\":1160000,\"Root\":\"0xeecbbe6ef4298e21b4bdbf6ec5a2c4f3cfef923c762c3f3e85683b930fc30143\"},\n{\"Num\":1170000,\"Root\":\"0x0b4801fec511a4a6805e780215aba24e2676b0ae5a79f40d351f89fc595b8531\"},\n{\"Num\":1180000,\"Root\":\"0xadc0371f6b594d352db494320140b9ab28c4bbc7bca6d110a352811a54db4c5f\"},\n{\"Num\":1190000,\"Root\":\"0xf87f7e17ff4c4312e70c8195d029993f8ac0a87de4522ea91a5d7c84d7ba2766\"},\n{\"Num\":1200000,\"Root\":\"0x34fd98ee150fe3e64a3020c4ff6e4840e11d8ec50cd3753ab25d4fb6d385d471\"},\n{\"Num\":1210000,\"Root\":\"0x82fd5b66b796ec99d7f2c75ddcf461076107e58d3b751d966702fc62853dce30\"},\n{\"Num\":1220000,\"Root\":\"0xdcf56ef7f006915025ce414937cd2c0c29e1b3f6870dc1e4d63ff4251553954f\"},\n{\"Num\":1230000,\"Root\":\"0x8b694a39b5039b459dcf7f779c286c24e4c812b9ad91b32dc31f35805074e399\"},\n{\"Num\":1240000,\"Root\":\"0xe834c68db5c231f1e224074eb7faab6c9e44526d416ae7ea18176616973a6878\"},\n{\"Num\":1250000,\"Root\":\"0xdd30cb31262aa74b2344be45bb3b68d35a7cf1e298a4fb279c2004a5d91c2c54\"},\n{\"Num\":1260000,\"Root\":\"0x9b61882c6eda6b6e3b4a7faf5a5225ee13c74d1ff45e530d284771422bcd980c\"},\n{\"Num\":1270000,\"Root\":\"0x6e77f2c28ede98d31e828942efa8063b0002ebd4ba3250d902c1214228a2fe91\"},\n{\"Num\":1280000,\"Root\":\"0xb9e660408237945b8f76da966466100ff8a8bca806f1284e1ce6af8d4d40a746\"},\n{\"Num\":1290000,\"Root\":\"0xaba73d0407298994b0ab9946f3c82f71509f3374f6d2917ebe96a038d42749f1\"},\n{\"Num\":1300000,\"Root\":\"0xadc81382c55a2fa882eab6c42c169f2b640da3bdeeecb784544a4ec83a543864\"},\n{\"Num\":1310000,\"Root\":\"0x6aaa4561cfa3fcf76a0535a644a309c61c330ef32dcde0957362dca4fb2c896d\"},\n{\"Num\":1320000,\"Root\":\"0x6baf6bc86d1f5fa31c7be03eb31d0697497cd2821b0d807c0ec2b1dc87f7602b\"},\n{\"Num\":1330000,\"Root\":\"0x9d5d566c34084a52275e019b17542f1dc72d662b1ef1f2db4e7c4281fa48f178\"},\n{\"Num\":1340000,\"Root\":\"0x07a1e2e1da3cfa2808e3cd055a74847d005ca6b65282eb22771499a2ee02eab4\"},\n{\"Num\":1350000,\"Root\":\"0x4c1bfa91016ea8f0b258895c0263df5791783a6a987f71698414f15a0a4a0629\"},\n{\"Num\":1360000,\"Root\":\"0x588d40e97718bf230769511fd6e5512d2874c3682eac4fe0290c0c02f55bffda\"},\n{\"Num\":1370000,\"Root\":\"0x0796b53e114dbd562f16b4a927f3a3ab6ead7a9acf33ba2bb9c8a0c57180fcdf\"},\n{\"Num\":1380000,\"Root\":\"0x452d85f201f1f6e1abe51bd98812a6ce506a76e1c322018da3daec6a80311efe\"},\n{\"Num\":1390000,\"Root\":\"0x3ba0568240d7c65ffa0d2cbd924ff2894deabb0f46d0019443527dca68ebe396\"},\n{\"Num\":1400000,\"Root\":\"0x6193c7c47ee455207bda011580767e2a569bfbd37ebad4343c0089a1d8420146\"},\n{\"Num\":1410000,\"Root\":\"0xcb70825002e752bec2e8ed332d5433cc50449089181ec7da4f8f0a71012644d2\"},\n{\"Num\":1420000,\"Root\":\"0xeb64d47792162223f7982b5a521074c3141932019567e090c7c624cdcb66a393\"},\n{\"Num\":1430000,\"Root\":\"0xf409197a89459070db26ffd72ec617295b17ae846790d2758f5fa374ba9c5b86\"},\n{\"Num\":1440000,\"Root\":\"0x0c394d5c8e5fca6dcd3c030bee24e80fa4493e860e8f48208c979deb0f8d0936\"},\n{\"Num\":1450000,\"Root\":\"0xa26ecc96eb54ff135432c135a6574a858a3c21c7f870ae37c39ef7acb44bb6d1\"},\n{\"Num\":1460000,\"Root\":\"0x9b359b566237432b8adf26681be00037ff3887605db2596d48159aa7e4e5924a\"},\n{\"Num\":1470000,\"Root\":\"0x2490c6e73e3ea58d0c3ed338f8419780e55f25a15ebf014abae3193718ed80eb\"},\n{\"Num\":1480000,\"Root\":\"0xe0aa4d74e945b401c52ae388e759eebcf1a8ac445abe30d11e6e82f02c8a1729\"},\n{\"Num\":1490000,\"Root\":\"0x3ccea39fbd250b2874de3cbea1541dbb5f26c7d1acbe9d7049f38862fdab4e04\"},\n{\"Num\":1500000,\"Root\":\"0x5b4e32df1fd3ad601117a72e58661d80006fd4c455e68369bdc2b41dd5a0ae98\"},\n{\"Num\":1510000,\"Root\":\"0x625a8b4d4284a4db4397789cc5c8a6e4f11038df7409d122f4fa4e8668467238\"},\n{\"Num\":1520000,\"Root\":\"0x87c1c0857ed142115f9d529b7faea27735f04a48e8c35e91629ff4a5e626b9a2\"},\n{\"Num\":1530000,\"Root\":\"0xd732e320dc5120baac6aada96719c36d96407aff71944ffafb2992d40dc7c2af\"},\n{\"Num\":1540000,\"Root\":\"0x8302e31fa7c365a2eaf55024330347001f0cf622d9bc1c7c5d092dacccb258f2\"},\n{\"Num\":1550000,\"Root\":\"0x4618755ced966a37aab86f3b2a4cfeae62a46cf4966676ca9279892531299aae\"},\n{\"Num\":1560000,\"Root\":\"0xdfa1fb801816a41c7c2364bfb716541c35bff3bad483b42433c7880f9e92ccc4\"},\n{\"Num\":1570000,\"Root\":\"0x1c742c5f1787a63f80284b47f106439306a9ac2f1d0bbfd73bba2b3b423030d0\"},\n{\"Num\":1580000,\"Root\":\"0x8b22ce5e347bba23ef7f4a1d1327ed9957ed31fd465cb43958bafe0cdee1d6cd\"},\n{\"Num\":1590000,\"Root\":\"0xcf3897168b09a7806fc91efc3a8ce17e6def85c44e277c7f1d4548aa282a494f\"},\n{\"Num\":1600000,\"Root\":\"0x95fc53848ba7f471b1068e9f9704cb3e2b90341bcbf27d7d75b55d37c970835f\"},\n{\"Num\":1610000,\"Root\":\"0x025483045de798ad99f394b7407efc08e8c30ffdcc11ca1fa4af9728b512c8cf\"},\n{\"Num\":1620000,\"Root\":\"0x2ec7ecfb0190449952d2990108d8119cde1957210c5b93a1b97234773e206847\"},\n{\"Num\":1630000,\"Root\":\"0xe035ac34e475ca081d3a65040614e057d6f9738ab5a020e80244df395774bfe2\"},\n{\"Num\":1640000,\"Root\":\"0x1c23ca92db26dbdb5235d36f2fcb33dc1bb8e660a4d28cb9f8a14b9286a19d50\"},\n{\"Num\":1650000,\"Root\":\"0xd884f64da61de381c4a115791056a535f5d36316a0d9a50493926bbf73e572ab\"},\n{\"Num\":1660000,\"Root\":\"0x72f0c4d856858b2d97c7a45a729638ff72625e8b6f4c541c087daebfbeb0c9e0\"},\n{\"Num\":1670000,\"Root\":\"0x366a90f79a83d1171274480990da68bfde20a5dff59c39277f4a8f0dd33d3461\"},\n{\"Num\":1680000,\"Root\":\"0x2b0000512f84bfc406b30d0ec442284936e26f93e2dbb984eaad0582f22aa5e0\"},\n{\"Num\":1690000,\"Root\":\"0x11ee044665586826490dcaab8cc04b4789fea8955a9be5142814ccd5b577dec9\"},\n{\"Num\":1700000,\"Root\":\"0x9babd63ec8f6f91e5a03558561bc08e415416f04a5a9ba8317afa40384e1b117\"},\n{\"Num\":1710000,\"Root\":\"0x1c550f3959fc10d272d514d7aa41b7f413cf1404ce50464bf9c9925fe19e2d87\"},\n{\"Num\":1720000,\"Root\":\"0x7939760dc3ff89f8847a79c0b6b4ea2cdeaa2b11c2bd97e1053ea902117e6635\"},\n{\"Num\":1730000,\"Root\":\"0xe3fe347233273ba63a77f5668a68106a381224ccd6df78fe536edce5e631f64a\"},\n{\"Num\":1740000,\"Root\":\"0x416e6db45f3297577bf23fff522af26dec3b62046cfb1777801de7ddae6e2f82\"},\n{\"Num\":1750000,\"Root\":\"0x497d38c6dc86fba4db9a2a922058d9202645bf50d8c67e4290e27b5cecc1a267\"},\n{\"Num\":1760000,\"Root\":\"0x3a1e5f9406a393ce0614e75bf8b843fc5740c8d868ab093ea85c31900c43d229\"},\n{\"Num\":1770000,\"Root\":\"0xbcc782e2b75be10b202d56ce82147b126fddcfec7c48ab74c54cc0999fcb0f06\"},\n{\"Num\":1780000,\"Root\":\"0x91bd219321ded8c3dbffa2558c2e27a35c5da19ea979b8aa33a415bb123037b9\"},\n{\"Num\":1790000,\"Root\":\"0xa41c1e7e0f383c1b2b08349b0161e5479633d636246c31913fcbb6ba8d106de9\"},\n{\"Num\":1800000,\"Root\":\"0xce5392165e44903e7622ec133f65c1f728f3909ab44a6358aa2cb5dc02a9ea4a\"},\n{\"Num\":1810000,\"Root\":\"0xd6e5190c9171c42643bb58d7421701293366bba56090387238c571a4de6167ae\"},\n{\"Num\":1820000,\"Root\":\"0xf7eccf168db89e270eb553ae211946b54580a069941431b0580d93b33433ebe0\"},\n{\"Num\":1830000,\"Root\":\"0xa25a855abe89e5b6902c9ef03189fdfa4595a181608a572a4770e8d1867705e3\"},\n{\"Num\":1840000,\"Root\":\"0xc52a3e3b72d1ba8f2843a360734fa2f93ada1ef7ed0ad52a9b9746df86f3ee05\"},\n{\"Num\":1850000,\"Root\":\"0xad0c85b7e727dc4cac1edfa4bd9f89a1000adcc1b030ce2b440b2718eb048dd4\"},\n{\"Num\":1860000,\"Root\":\"0xabfef093a0856e8e5f0bd35e7d1827d8748f417d885a143e891f5bc6371352f7\"},\n{\"Num\":1870000,\"Root\":\"0x621248178ffef879e9c14b4a716f19771895e2617d3c1591573f641f7b812a96\"},\n{\"Num\":1880000,\"Root\":\"0xd98f63b31405e2a7de5ab3d2a7837c7fcae6714e3932df7676a4ba8425013bcc\"},\n{\"Num\":1890000,\"Root\":\"0xe7771ad7e3e210ef0d059b6205eb0a99afd48f2ce4cbfd420ce7b784d253ba54\"},\n{\"Num\":1900000,\"Root\":\"0x4a59c4ebb7687a47d37b7cd0e27296752e63d3b9ba94734aae751168c54c62b2\"},\n{\"Num\":1910000,\"Root\":\"0xae94d26fab9211d12ebb9425ce7d10497fbe2614ce9f01fd7b45229ebe8ca542\"},\n{\"Num\":1920000,\"Root\":\"0x1a1f7334bd01950dd7d9635b0229564a0d6e1b8a9a7911285478e6451758e2b4\"},\n{\"Num\":1930000,\"Root\":\"0x276cdde344e1768d07c06be8aebaaa6ce02f4039b60b8f9b7912cd0b9096492c\"},\n{\"Num\":1940000,\"Root\":\"0x7c5151c5c0557b63a9eff6dc3ff54e7331ca4a363223905bb7983e7c3895c68d\"},\n{\"Num\":1950000,\"Root\":\"0x13db1cf9e49e67cf90067dd4be174125e86465c83270b9937edc39df79557995\"},\n{\"Num\":1960000,\"Root\":\"0x0e551799affe15d095e41cd02933701630259b6160724918e9ec6b342493d089\"},\n{\"Num\":1970000,\"Root\":\"0x5639c73cb9e4ecf0b6c65a9f77de70aa114e6ef1ab1ebbe70dfb00111c21508a\"},\n{\"Num\":1980000,\"Root\":\"0x3207a5d37b9eef4257e929c9176e9befde3b983d4bdc9cb9210a805a3a948611\"},\n{\"Num\":1990000,\"Root\":\"0xfe8b303f3f4d98986995774280af893ad5e81d7e16ea051c3b1f07bc48b7d91c\"},\n{\"Num\":2000000,\"Root\":\"0x5fe899461a38067ca07fb2dab16ca8bfb660964d5005761c7482f09a624ffd63\"},\n{\"Num\":2010000,\"Root\":\"0x9d9d0ffd33895d97a895362aa44d5c7fa5660a512ae2de05f9466ee5850a82af\"},\n{\"Num\":2020000,\"Root\":\"0x0cd920bae5ec0c526fe6a232edaf915cb01999ae7a6db20dcfe25c25a38731ec\"},\n{\"Num\":2030000,\"Root\":\"0xeea5df7c0a66e284c1366ccf58c25df19461eb501cb579d3c9aaa6fae8ee191b\"},\n{\"Num\":2040000,\"Root\":\"0x9f1bf6850e339be4dbf1152623bdd6770fe6775b02140cf3d60a1e62a15dac8f\"},\n{\"Num\":2050000,\"Root\":\"0x9dc9cf0cb2564e92f238a4ce4e6443195237060884c906d3e6b5749e4f1c66e6\"},\n{\"Num\":2060000,\"Root\":\"0x1646658d4c18d985adb882243bc4a6bb36d9c0fdebb6f6dc0609f6f923d6932f\"},\n{\"Num\":2070000,\"Root\":\"0xbb9e20fe483d942a67b3fb0f69bba275cae3eeeff7debfe2f621b530f2fed240\"},\n{\"Num\":2080000,\"Root\":\"0x3e092e0491c29876f7b2443490ae415b0e784380f808d2918c581ed9a93d0f29\"},\n{\"Num\":2090000,\"Root\":\"0x2fe1d9a39a63dcb8971ccfa4084ce44d07d9d3e2f5d8ed6a81ab3b2d0f713fe9\"},\n{\"Num\":2100000,\"Root\":\"0x1f5e39714008912bde4cc6c32331d6f44c61bd3b0bbba1e22af091a932ca90da\"},\n{\"Num\":2110000,\"Root\":\"0x2e275f4a3f8c8557fbb2404410f48898fac59f5314118f66696da2b341c2e40f\"},\n{\"Num\":2120000,\"Root\":\"0xda59c191e868e44d62f6d6ad0d750f0a604ca4a691cb994b43eded79fa0d6506\"},\n{\"Num\":2130000,\"Root\":\"0x93a7dba4685e50ddf65487014e42830881ec3c7ca11ad58f009a16c337268bd9\"},\n{\"Num\":2140000,\"Root\":\"0xa356346357a33ed89243b5c8a5ab4ddc95e9f6ba291896bb376c9d600527658c\"},\n{\"Num\":2150000,\"Root\":\"0x2a3b94ce4ddb3cc523cf837ada63b4f0dc8e629583b30c7e42be2a5491f55d10\"},\n{\"Num\":2160000,\"Root\":\"0x248cde0970fc00ebba81fe2b7efbc4ad186ead534482dc352ce05dad18cb8203\"},\n{\"Num\":2170000,\"Root\":\"0xdc046d8a84029d2e4ba9a74e6bc142b30361eea0d939a3f0f0e98832de897a7a\"},\n{\"Num\":2180000,\"Root\":\"0xe27b79fe6767751517e7de847fa2c9de2069a803b839ef5d35f3ed121cb7f1e8\"},\n{\"Num\":2190000,\"Root\":\"0xef31d8a3ac1f96a50fc3390b5676892b5faf891886d181be3309f76e89f9c17b\"},\n{\"Num\":2200000,\"Root\":\"0xf25fc2b4f7e459dde6d8ce99aa27af34fc370cefcceeedbfe755d53735fb5048\"},\n{\"Num\":2210000,\"Root\":\"0x807857711e98df74fdaeff12a73585dc0f1db2c1f802d27531dea451fa56da00\"},\n{\"Num\":2220000,\"Root\":\"0xc014342ea0d245b3850d80be2ef9790c3c7e2024b63f9c13fe46f861ba8d0ed5\"},\n{\"Num\":2230000,\"Root\":\"0xb4e7d115a224c1fe725fef77a3114405e6c3b016dd6f3007306e57c743821234\"},\n{\"Num\":2240000,\"Root\":\"0x2b6b5fb03352dbc6cd9a51ec195dde1a47304086fe2da76fbeaa5a2ac23dc145\"},\n{\"Num\":2250000,\"Root\":\"0xf9b7bd57baf83ef32027991ea30898ab028f8151243e1c7f261c6c3212ea092b\"},\n{\"Num\":2260000,\"Root\":\"0xe47937a34a548b2279e09423c2226d8597f3a19047d4fdbe27d484ca018bb146\"},\n{\"Num\":2270000,\"Root\":\"0x863695ab01ff759a03a9ec93de18b60f22309185fae39fd2d27c614940553281\"},\n{\"Num\":2280000,\"Root\":\"0x09ab19fbe7e7d5282106e6dc2d1aa3ff5c559465241fef6d9aca44bcf854383e\"},\n{\"Num\":2290000,\"Root\":\"0xbdf566c4afd1b3f2a1e809da74c195bb024fb6294905783d92b834a6dc563e1f\"},\n{\"Num\":2300000,\"Root\":\"0x136c1c48d1bc37d5447a7b562ea17a513a4310db65a3fc455f9d6bc49fd98c78\"},\n{\"Num\":2310000,\"Root\":\"0x1925ea4ad0da9efb20efc0e0cec045612513d15d6085352c0b995ef0a2eda924\"},\n{\"Num\":2320000,\"Root\":\"0xeff682997caf9fb7910e39448ef3df101cdc53b204707ff96db831de815c8b09\"},\n{\"Num\":2330000,\"Root\":\"0xcf984b6e796651f99a65405986458a6f99de9916a4311916962f017dcf0912bf\"},\n{\"Num\":2340000,\"Root\":\"0xcc08fc841beec954cf3c7e49817d6cdf76e26fc10883c9c5cee5b53a8a37d3e4\"},\n{\"Num\":2350000,\"Root\":\"0xf9733d33fb6c4a25554321b11e605030a8357248c153a313182290fcfd1b0c3a\"},\n{\"Num\":2360000,\"Root\":\"0xd1365a6cd5ab73bf019220cd6f77e7f3b52fcd894c202e4006bf57ea49998916\"},\n{\"Num\":2370000,\"Root\":\"0x040151a35449ca2b26a3649a5a4ca5701520156fe8bb7465bc81efca332e1767\"},\n{\"Num\":2380000,\"Root\":\"0xdabd6cf2d06584a79f93c65e9aacd5307609b3fcd290cd0354a8e6c2c683484e\"},\n{\"Num\":2390000,\"Root\":\"0xe63d557443dd880d2d6df8d18426095058a3c38d2c878a1c46cf99f7b4ce30f4\"},\n{\"Num\":2400000,\"Root\":\"0xde871dea768eb4fab6958872a1fc519518c8ca9a69e82a77f494bdeb33278a6b\"},\n{\"Num\":2410000,\"Root\":\"0xe630bb5e9ba4d304bc11434b254ffdf260825b7e2cad3fd435c069821ac6fde4\"},\n{\"Num\":2420000,\"Root\":\"0x38278c4d0337bfd32b70bbf530074dfc0a2ec9f088213f78a3a6048fb17032be\"},\n{\"Num\":2430000,\"Root\":\"0x928f7ef9e7fd00fd712a7bdc5ddfc4fb9b8098812ef9ac3d1ec3b0c26654d1ef\"},\n{\"Num\":2440000,\"Root\":\"0xd531001b27b1e1d8b98fa86e9593eea92ecb23077a301204d0fbf9c2e8d887fa\"},\n{\"Num\":2450000,\"Root\":\"0xf58994b6594845aba20878ecb46b149660fb40f268850164900ae46fe23fab65\"},\n{\"Num\":2460000,\"Root\":\"0x3d7fbdc4d29151c3eb709d39de3448d1f8a40fcf0fa269550377c3eb0f3b109f\"},\n{\"Num\":2470000,\"Root\":\"0x44f589a903eb66b531f528d9bae1d435431e3f7b978113b060472cb9cb8a977f\"},\n{\"Num\":2480000,\"Root\":\"0xadcf99a569b55794e2a25bf30c1b5e84a5298e3455991cffc728adc01a139b05\"},\n{\"Num\":2490000,\"Root\":\"0x70fc9b888109563c8c39b08229056de63d7d551ecf13ac022bfc9a08c225d59e\"},\n{\"Num\":2500000,\"Root\":\"0xcfecf832ee946ee0f006f4eb267952606d07df9bd7f152ee7ec3d768cb4b485e\"},\n{\"Num\":2510000,\"Root\":\"0x81c50a16ba67979ccb2c503a5b096f993e9b6d2be11131be0426cba1865b5cf8\"},\n{\"Num\":2520000,\"Root\":\"0x6ce442b69866f384a34bfcc5bd395e2c8d412c5a16540665044b01eb7664e307\"},\n{\"Num\":2530000,\"Root\":\"0xfefe66793bbc8dc414759a4048649729a6e3c8f2d8b06f3a06dd045fe008c63e\"},\n{\"Num\":2540000,\"Root\":\"0x3e7c618666e7d089b7ed36fe50e41b7e0f1df5459c0862e08c4450095ef30176\"},\n{\"Num\":2550000,\"Root\":\"0xdf5656d66826c54086b3c58f084ab2d3eaf4d233aed8b02086bcb03cb6dd8199\"},\n{\"Num\":2560000,\"Root\":\"0x8e241539c874497bd99b003161b41a9a25ee66d0ccfae6a249ca7eec18a54574\"},\n{\"Num\":2570000,\"Root\":\"0x2fc2081542b3d20572a14692876c686a702d2f2aaae847eb1b82459f0e3c4d21\"},\n{\"Num\":2580000,\"Root\":\"0x8935c958e056fd6a8f44f04bf7c4fc1802ff68a7c3a7929d6e6be32674c300a3\"},\n{\"Num\":2590000,\"Root\":\"0xc262f7ce5f0e774b93a87c38b9480acfbef92fd1e34c51522b3a04a2ad1c71ec\"},\n{\"Num\":2600000,\"Root\":\"0xd765b50f579521cf11e228a41eb09e97f48bf9c62a6f21dbbb15c7c3b9024da0\"},\n{\"Num\":2610000,\"Root\":\"0x9eab5ff1dc3a758051c9357ceb14f01f27ff484e76c8fa5ce93e355173297baa\"},\n{\"Num\":2620000,\"Root\":\"0x4f0f24a0aa6997f84721bdb1c1208d0d456298fcb101c7685d65cc87fbbbe8bf\"},\n{\"Num\":2630000,\"Root\":\"0x68b863421769763ad923f86726c72625aceecf2da3872061fe8c4d478d99cb4c\"},\n{\"Num\":2640000,\"Root\":\"0xd4042a6cd2a01e5fafbc23db127d60e265a9e242edc95fff8638c3297cae7803\"},\n{\"Num\":2650000,\"Root\":\"0x4b9317e642306af20ae72dfeff8d3fbacfa74ae302ba3ab639c709115788dcf7\"},\n{\"Num\":2660000,\"Root\":\"0xcbedce982f698eb089f85fc338e5f73d7a09fc474930c979510c138b5c556f5e\"},\n{\"Num\":2670000,\"Root\":\"0x442cda0379772c8f608bcdcf12e28a80a4075cf9770ea78c37ac8c55f501a9b7\"},\n{\"Num\":2680000,\"Root\":\"0x16fe4df432c546879605467b4865653ba22f7d4fd02d6243eeecabf58a16a5c0\"},\n{\"Num\":2690000,\"Root\":\"0xabc413d8039cda930f9a1b8761ab618381dcf4ebb39aa7ad922a6bd07cdd3cfd\"},\n{\"Num\":2700000,\"Root\":\"0xa0fdd5ee8d6beadad0bb2fdb3a22abe7d5b36a08955f60051061f9cc1171dd5a\"},\n{\"Num\":2710000,\"Root\":\"0xae6fc5d34c4b722db53c2c385926239d867f8d48072d90347e8e7acc6115fd03\"},\n{\"Num\":2720000,\"Root\":\"0x264fc5ef91ceea3a4ccaa451613afc85a35e8e5c2d190d976451d4d0274aa14b\"},\n{\"Num\":2730000,\"Root\":\"0xd7f5efb56ab49ac378dee02cc127098f35b0f6876a1b76d63703c2e433488013\"},\n{\"Num\":2740000,\"Root\":\"0xc7a896a47c4d4585e85fc51c6197c59164a299953f945af50dc2aba6a038a344\"},\n{\"Num\":2750000,\"Root\":\"0xa71743d9c290dfd6384a3a70fc893478715e74e217ba02d3cc3843e23944f787\"},\n{\"Num\":2760000,\"Root\":\"0xd53f4708d01ed39a2213e0f9713256ebec620f9d1d9a5877016999b71cdb5622\"},\n{\"Num\":2770000,\"Root\":\"0xecab2f42e2332acdf1306fd4269ca4ba1d862c3526dfe96c8a36ed459dbf6ca0\"},\n{\"Num\":2780000,\"Root\":\"0x73ef30e8bd408c6c52d88b3b1b2f06f038aa331613897e201f62cf7132991e29\"},\n{\"Num\":2790000,\"Root\":\"0x0b553785377f118725d0716b447b055fdfa7bdb3d67e56f2530a440045e9c984\"},\n{\"Num\":2800000,\"Root\":\"0x63535abf306e233f302fbb8d4e6684e309a61a6f3417e27f11c6613a5aad7aaa\"},\n{\"Num\":2810000,\"Root\":\"0xcb802a9f6919fbc970a4b5dfaaa2d86a21d4cb8fa559ac2f804eb23ebf46498c\"},\n{\"Num\":2820000,\"Root\":\"0x197818c331da43f76221f67a1f4e3f9f2b69e726ff6b5fffd47b4404efd8e15b\"},\n{\"Num\":2830000,\"Root\":\"0xf375fb17d71ca56117a34cb9f94e371ef4ca14c4271a3307750a6695f392aad0\"},\n{\"Num\":2840000,\"Root\":\"0x7643ca6d80c03b0a6c03057a44e81a01251c51c6b481b0c71eb5273e5e8f232d\"},\n{\"Num\":2850000,\"Root\":\"0xab94ca79be6d30f44f0d887e7d1a614d43dc7b90d62d0c6038311c6fd172c943\"},\n{\"Num\":2860000,\"Root\":\"0xfda4b29c92320fbeda43214cb993eff6fbc953520d824330fa16de22aaf84ea9\"},\n{\"Num\":2870000,\"Root\":\"0x0eb25972a5f332673853dce15e8fc6613776eeaa13b1f5cbf0cbd4c111695556\"},\n{\"Num\":2880000,\"Root\":\"0x90579ef9494f362b8a9f187a3808cf2ecbafbe27503d5201b7ee829836cf4edb\"},\n{\"Num\":2890000,\"Root\":\"0xb2e7b399163b54755b077a7e9f636902770ad5158067c513a5ec0fd70472f43e\"},\n{\"Num\":2900000,\"Root\":\"0xf73752e5804f0c31201a9e171a26904a8d5b47e456368dba4b9710fc8085eb68\"},\n{\"Num\":2910000,\"Root\":\"0xe3cec50d40f874b49f86199d5fff42e83f7bfc5e3564fed5f7a0035a46f41bee\"},\n{\"Num\":2920000,\"Root\":\"0xbd88af6b58ca657fa72433fcefd56ee68af86af596d50792eb5bf1e0ef123bd4\"},\n{\"Num\":2930000,\"Root\":\"0x382531d3b40b8a6504b91c1483a31b6cf6c565b38fb3d510a6b60b6ce5e6e17c\"},\n{\"Num\":2940000,\"Root\":\"0x8b970fae3829fd00ec3f6abbe7abc2feac3865d4cd005297281426602273aa14\"},\n{\"Num\":2950000,\"Root\":\"0xa01abced21c2e7e2dc0d889432a38b08368bda3c1525586d444f50771c901c10\"},\n{\"Num\":2960000,\"Root\":\"0x54abaf5991f4bef35c3b2a003d971ba53e0e2d302209e94452af5795c464b896\"},\n{\"Num\":2970000,\"Root\":\"0x79201755b667676fac49894b23e85978f546bd5c7bad565cd1a2b628a15af777\"},\n{\"Num\":2980000,\"Root\":\"0x1b88659e364d0eaaee4f8f8c001ff8c2737c974736146117a576d909c1baa82f\"},\n{\"Num\":2990000,\"Root\":\"0x5caee84cce9466c8dd02e24e8e89965ceecf57d6af837bc532ab2b3906a8ea51\"},\n{\"Num\":3000000,\"Root\":\"0x01e1599d3e65b208cb288eb2a455ccf09d5c11d2b6382f719fc5ca3f42952c71\"},\n{\"Num\":3010000,\"Root\":\"0xc1728fbbca8c7dcab7011e25cfca704d054b312020cd66d8bdd9f77c8a2aa29b\"},\n{\"Num\":3020000,\"Root\":\"0x20355de7745e3705df11fa86505deb76c8a6e902b0560703cfcf1eae49b3c2ad\"},\n{\"Num\":3030000,\"Root\":\"0xffba8c66a62b2c6b9449e7937e33856eef8e1ad10b180cc9d3f88cb1e726282f\"},\n{\"Num\":3040000,\"Root\":\"0x05fa8ceab822f277e6577ed594dc526204a3868ba0d697af3b7f5868acd59037\"},\n{\"Num\":3050000,\"Root\":\"0x99ce028cd8d3829907ffc198851e72da1ab746f7f4a6d10710dcb8729378af9c\"},\n{\"Num\":3060000,\"Root\":\"0x4b544bfc0562fb70a5b7cae05af83ba559976fe62e11e9f4edea64cbc2f7946b\"},\n{\"Num\":3070000,\"Root\":\"0x10f07ffcab1998479cbe709dd73e0eb54c89e2db188bb167df440e7ea18388dd\"},\n{\"Num\":3080000,\"Root\":\"0x0e3dbde004ea6d320d9916b2c0043bd14af9874a17c965b25221c2c06bfb8184\"},\n{\"Num\":3090000,\"Root\":\"0x64dfcd092f13f78c016e3ce53b4002d41fa61d24c652a2b966dea01de65cd8b4\"},\n{\"Num\":3100000,\"Root\":\"0x2e78d13575064448cff7361090d88af8904f6b331f720a52a0853f047f65af51\"},\n{\"Num\":3110000,\"Root\":\"0x8d186109ca6ab95d2b4f5bdbe6fb6a26d40d7df7e6ee07825ae920747bd5a720\"},\n{\"Num\":3120000,\"Root\":\"0x66a9590f9fcc39ed366c6ae7427da544ac4c4fcce22c0f62efa7b7544f2ecf4d\"},\n{\"Num\":3130000,\"Root\":\"0x069ee97776a166afbc937234c035c7d11b9c90cbd1fa5a32399afb68a20b5c6a\"},\n{\"Num\":3140000,\"Root\":\"0x51732e86d5fdd47c746350089e5ba31884560c91dedc29759188b3789112e3d0\"},\n{\"Num\":3150000,\"Root\":\"0xb7a7832461ee89826785d32e6714d82584b4d8a0b3ad74fc4176669705599da5\"},\n{\"Num\":3160000,\"Root\":\"0x588e7d9a241650c67171e9df305eaf71d581c9c978b351089ba3d1ae5e3fafff\"},\n{\"Num\":3170000,\"Root\":\"0x5d2d0f81b5d90dd54cd42a072b65e0e2ca6f1ead39821cf5cd784c9c6246bfc4\"},\n{\"Num\":3180000,\"Root\":\"0x20c03d45844ddbe15082abe2c4f9d02b061e1fcb3b57ef2476b77c18faa61589\"},\n{\"Num\":3190000,\"Root\":\"0x941901dd47b1ad5a239896c8e575923ff08d8c9a670dbcd363ca9561d80d6bab\"},\n{\"Num\":3200000,\"Root\":\"0x1a45d7cdc93a10e5bd06ef3c03e9f8c9f682e2fff929db7755e3b79168e4c7b3\"},\n{\"Num\":3210000,\"Root\":\"0x37b6ffaf8c034cc57b2f88cef2f27c74bc0e7a1dc67f9d76da0fc8dfb5872a20\"},\n{\"Num\":3220000,\"Root\":\"0xaed2652d43945e138ecfdc319829d3787dbad0547bce83c52a0aaf2318167416\"},\n{\"Num\":3230000,\"Root\":\"0xc0cfff1f045d069778c7b23bf10317709013f98715f5876e008f0b42e7a31036\"},\n{\"Num\":3240000,\"Root\":\"0xaa64d8f25dd6328585c2b87420c12144edf2c4a6547f70744a1973f24d76f28d\"},\n{\"Num\":3250000,\"Root\":\"0x6ae6f45e9a8da79591cab909daa52e08a3b2a7e7083ab155df863ae5ee49403b\"},\n{\"Num\":3260000,\"Root\":\"0x25481815e398128c5b862cc8ffe4390292d0a61f6a66fc57f9d768a638ef5a5a\"},\n{\"Num\":3270000,\"Root\":\"0x0e386be14519b40f3a341d3ff9416ca9647880fe120ee7e85163b3a66a86f7d6\"},\n{\"Num\":3280000,\"Root\":\"0x1a99264b16ba40ca33e00f56503d5565681790b27dba83ed6e12dda99efc1d7e\"},\n{\"Num\":3290000,\"Root\":\"0xb07b377893f5c8663b79e32903e74b8176e246f3479505b04656c2d860fa710c\"},\n{\"Num\":3300000,\"Root\":\"0xe1b23856dbcbb6c5dd9a2cbc4d2cbce1d34f0afa1147fb302226cea88a46da81\"},\n{\"Num\":3310000,\"Root\":\"0xa54e1ad8e2a3885b6df09f141987297be7607ce0895b7b8929b406a1e057686f\"},\n{\"Num\":3320000,\"Root\":\"0x20d8391fb0658628272fb722896a15d90177fe8a6eeded27cfb81f10ce9cf9d8\"},\n{\"Num\":3330000,\"Root\":\"0x0e1aae418f73112b6b180cfe7703de04a0b93e32314f9ba46815b1768bac863e\"},\n{\"Num\":3340000,\"Root\":\"0x9c12723ea67ad684751ba2cfaebf843b494cada829343f392db56e6e85f792e2\"},\n{\"Num\":3350000,\"Root\":\"0xec41d5844f6f7cb30d5ef0f5a53e7b8e2b15d7d87a6e8632be3b50b86a749f8f\"},\n{\"Num\":3360000,\"Root\":\"0x1e5f2164eccc85679bd7855b315e5c0fa2b1b4f20bc34b3074fec61289573b36\"},\n{\"Num\":3370000,\"Root\":\"0x54d5d69ad75258e7903be0fb805540f3c7d8f4cd03814f08a8448f05d085136c\"},\n{\"Num\":3380000,\"Root\":\"0x27256952b8a587c2518ee91b087266d04fd7902406aa9b2990405dc2de1df5a3\"},\n{\"Num\":3390000,\"Root\":\"0xc51712602af11b2f41fd87c32845898f94a3394a4f0d2e645ffa124a69d3dacf\"},\n{\"Num\":3400000,\"Root\":\"0xb04006958eb5920a87cd0103503dae3d8c64a593eed367ac85e0d5fd93f6e9f8\"},\n{\"Num\":3410000,\"Root\":\"0x746a02a112258ad01ccecf45639c2f840d0cc8698b62ca77686d3e23aaa77018\"},\n{\"Num\":3420000,\"Root\":\"0xacb6c6b0be02cedbbd87ef01475a2ceaae6e30acd72ba0b009f70a1a7cbf4227\"},\n{\"Num\":3430000,\"Root\":\"0x660c162376afd305156ec4bebf5a4551867c0f01d0e54ec131f95be6cff58333\"},\n{\"Num\":3440000,\"Root\":\"0xa1565187633d53dbe467e0b42ca6dc9868c3c10c8739c28a7c40a29b3da3d9f6\"},\n{\"Num\":3450000,\"Root\":\"0xb094da470e1908aa4bb8fbb7c3d42a0225171b8d3e0c2d4b6b33c637355254a7\"},\n{\"Num\":3460000,\"Root\":\"0x87a96507fff8d490b16b544f062ba4a44dfb4b3e571ead37e1280aa7f1b68569\"},\n{\"Num\":3470000,\"Root\":\"0xd3d7283bb9dbff353a9b4e6e337fecf9c5d49be6f3b02178af8081bec3bf20ca\"},\n{\"Num\":3480000,\"Root\":\"0xaf3abcd3831f5506a5a41df174b5460af947a179a5038f0022655e0879ca5dcd\"},\n{\"Num\":3490000,\"Root\":\"0x72d5320403b6d04864a4a64ce20d90299e1ef6daeff960bb65592f948124affa\"},\n{\"Num\":3500000,\"Root\":\"0xea4e5e671a037640548042ebbba23f96c486218cc2f3d2f4a06c9f14f38a7374\"},\n{\"Num\":3510000,\"Root\":\"0x8e662e15ca45deafcc03349732bff6a07698159abd0ff926437f624d882b827c\"},\n{\"Num\":3520000,\"Root\":\"0x812c4d165909bdbb4174494d6cf08e3d3d02408f66c8a8e94835788098c30ea9\"},\n{\"Num\":3530000,\"Root\":\"0x3f166fe6588316c017a64fc15548a24fcb5db87a2e7562c63c01b35d2671b8e2\"},\n{\"Num\":3540000,\"Root\":\"0x1bd1a60ffb91cea40153cb86af4c858caef47546928b20f29e5818a62ae2b360\"},\n{\"Num\":3550000,\"Root\":\"0x8b43ccbd0e77620c2a1ef973f2fc953973c61f98dfc7b9c41b57f78849195f58\"},\n{\"Num\":3560000,\"Root\":\"0x3ff6563376f9c8b70555ef366c283c401c9de7f035d623ea24d38202e78a8d6a\"},\n{\"Num\":3570000,\"Root\":\"0x3cdbe28f87206938abb4add8bcd506a4fcfb34e0da013d3eb3651eb860e431c6\"},\n{\"Num\":3580000,\"Root\":\"0x8ca1b3b12d874a7d783c7209e9a7099f0c5508a80a8a0601afc4c9450468ba53\"},\n{\"Num\":3590000,\"Root\":\"0x4182a2985ac1fe55b2054dc0a9aad37b9d6ac6360c79cb65e2bd0a7aa3ce4833\"},\n{\"Num\":3600000,\"Root\":\"0x3a031503403929de73be6e9143366bd81b25a7cd7309946de6133c172a8e166a\"},\n{\"Num\":3610000,\"Root\":\"0x25f8d5ac5636b302420f443aa74d01e7ded0a41f4e7dd1c2d0dc2daa9c0b654c\"},\n{\"Num\":3620000,\"Root\":\"0xc7508e8f280837b6f340c6d6d8ae3e0df285a41486c0ee8cb3149e222857e446\"},\n{\"Num\":3630000,\"Root\":\"0x2217f4b4839de1f9e347da2aca7bb308f387be1fd2594aa899552407aa218362\"},\n{\"Num\":3640000,\"Root\":\"0xd38c2bddd0e1d17425d563f05dc655b5325ceed3db022e6c57983e4d8c18e8d0\"},\n{\"Num\":3650000,\"Root\":\"0xe4a75d5402aafc5cc353dff08539ac1e1f46f17795c3f3327889abb5502b763d\"},\n{\"Num\":3660000,\"Root\":\"0x77ee4a516a6bb369ce2e13240bae6e5141deb5cd586ab8786e1c469274596980\"},\n{\"Num\":3670000,\"Root\":\"0xc74facd891c57a1a6f2d7d07799be53aab193f818cda1ffb724435481664fc1f\"},\n{\"Num\":3680000,\"Root\":\"0x90844a29ccd9dcf16ca765d7d39e69a0d5563fe7d4ed975ae4f653fc1f06f3df\"},\n{\"Num\":3690000,\"Root\":\"0x22a2f296f6997502e06792f99c8a516f2cc302aaf2161e75b7552656ec3cdeef\"},\n{\"Num\":3700000,\"Root\":\"0xf0a246c2c698b609f9b4418717f785932ca711c44e722b5d562f41cbfcbfa5fa\"},\n{\"Num\":3710000,\"Root\":\"0x1671757782af19d9275e4181d8b3be61037abbbc644a47a566cda103551c08f9\"},\n{\"Num\":3720000,\"Root\":\"0x055a22a4033a8ff8e30af255144296f3bf20bb720e5f22a7cc7eb4fdb790c896\"},\n{\"Num\":3730000,\"Root\":\"0x85183f302b849426f5b38d10a9e13d8ba49928e1fa314dda3425610065846caa\"},\n{\"Num\":3740000,\"Root\":\"0xf46de0d9523e2300fe52cbae4d2641183c8379c2a2735d4e74bb718e5c6a4e9b\"},\n{\"Num\":3750000,\"Root\":\"0xd813f0cc0b9e50ac242b45ffc8865184ce2c64fab456b82776f3455a5e8365fe\"},\n{\"Num\":3760000,\"Root\":\"0x614ddfbb72772663f327ae28461f71e4ecb38a769ace296ecace3573737c4bef\"},\n{\"Num\":3770000,\"Root\":\"0xb14101cbb5fe083b5e4e5f16d0b9076f1117dd64e6b817d474055223d7455e61\"},\n{\"Num\":3780000,\"Root\":\"0x3cf327a1f7944740d5be103f72ad2f6fd55edd027de0d0fdff44e6bcc1dcdbb8\"},\n{\"Num\":3790000,\"Root\":\"0x5ab91a404313d1e44d25a5fcac088668550c31e94e517e803f61c04b64b8fbcf\"},\n{\"Num\":3800000,\"Root\":\"0x22f6f18b26f3ed756b6356239a4a4971799cd546326bc45dd0cf6567b1c12220\"},\n{\"Num\":3810000,\"Root\":\"0x27a9a53096de882cff9e653219378afe80c73e5fd3dfb26c782cca6410afaebb\"},\n{\"Num\":3820000,\"Root\":\"0x684749af7bed74854e9e22b8b39ca1efc2aac631a43ff4226665ac55053d6d40\"},\n{\"Num\":3830000,\"Root\":\"0xc49a9588f477761644e2e6ce3351ae969662a1075f1cb8b6027c562b7fefc9b3\"},\n{\"Num\":3840000,\"Root\":\"0x23a3fa00630246b33c0b08c646f4dfba7c2c81a4a9d725c60702f7fc1ca5a469\"},\n{\"Num\":3850000,\"Root\":\"0xfb2793c92ba8308a0b14e2249d72bf8eb7f112511028be4d91702ac61ea78244\"},\n{\"Num\":3860000,\"Root\":\"0xf50b77c304b3cd09d697856f66a700d9908a34349b9613e0a91fed6f6afa0bcb\"},\n{\"Num\":3870000,\"Root\":\"0xe1aeddbe17e4cbb61dbe1107e10bcc8694e5a620e59156db1cfeda4647e94993\"},\n{\"Num\":3880000,\"Root\":\"0x46637f4d636d62071dcec439b3507993f0228f1a972d49d0b3f4feeb2d0992d4\"},\n{\"Num\":3890000,\"Root\":\"0xef2958a0535182bd8cc279d1bab3aa8174d37a3b92088d74b815c23b5632a514\"},\n{\"Num\":3900000,\"Root\":\"0x5a735baa7494a5a697eee5a92e0026485750d880f3fdc78c8837c2a2645d92a5\"},\n{\"Num\":3910000,\"Root\":\"0x39d61f413176d758cc99173a4ccdcca966f7811818291bb6611a6afb4db6d45e\"},\n{\"Num\":3920000,\"Root\":\"0x4f11eaf9f55957f0734f2dfaee929014087016605a178f096e927acb1b062fa3\"},\n{\"Num\":3930000,\"Root\":\"0x4e7b122e85ebae065f0990ec572a1bdcf9e1506eaa9b4b04a1d30ffc1661c1c9\"},\n{\"Num\":3940000,\"Root\":\"0xb251a08aebd9d202fde78cee71cc63e176f3bdfb183b90d4c8cf03e5d0d736b7\"},\n{\"Num\":3950000,\"Root\":\"0xa7b5cbf0e648003c01bc9f46f260c8139dc50934bc4e32df474162617753e073\"},\n{\"Num\":3960000,\"Root\":\"0xf14109a9d81280e1ecfb6534daeeb7a25bb4db5fb5c525cc99f9e09a7b8ac1d4\"},\n{\"Num\":3970000,\"Root\":\"0xa34021504cc2181cd072f1d688fc8e23d862c231a38d11396894441e9d97fb0e\"},\n{\"Num\":3980000,\"Root\":\"0x1f494247506c32b632f2812d715131fc6517c925564f4535e1e8038c1da8859d\"},\n{\"Num\":3990000,\"Root\":\"0xf399b77f38706ec7fbef31082511083ff6b1f66e73a83df89dd6888a072eb98e\"},\n{\"Num\":4000000,\"Root\":\"0x8cf2956dafa8d860732c91a27eec54e2c140653db75b8d45508856f6778f6dcd\"},\n{\"Num\":4010000,\"Root\":\"0x002ce839790497766979548eb3c978fbda06b1e5342b32a6bff6c9b4ee5dc5e8\"},\n{\"Num\":4020000,\"Root\":\"0xa08dfe82b2bed4c87a07346c04b803829b1b74f238f285ed2072cbc088aa88db\"},\n{\"Num\":4030000,\"Root\":\"0xdaaccc53fd17d8110b4b695c4fc9c4ec02661955e2efcf460f76d6c49609ac66\"},\n{\"Num\":4040000,\"Root\":\"0x3a59c9ea341a717c8730699873d6ba6ed27231d88f6b0e23e2b9e71ef91b6c65\"},\n{\"Num\":4050000,\"Root\":\"0x0b538c00c20ee6ffad5c92eba732b9b5d01e8a830c24445f4da83ee3698c7ec6\"},\n{\"Num\":4060000,\"Root\":\"0x90e68d1b6664afd41c9df4450ed91acb0e1a8a5b49a42e10bc364b8e88b3983c\"},\n{\"Num\":4070000,\"Root\":\"0xa1c837e10b01b57ec98d35b551bcb3b464b618b695253d22e6b3f0d95b129dc8\"},\n{\"Num\":4080000,\"Root\":\"0x04c8f20061c5b62dbddd7a0109806d3870678c7ce476fd09473ff0855edb4b02\"},\n{\"Num\":4090000,\"Root\":\"0x7a5c40fbc0f38fdfeb756f33467e00be98b2af0d3793c493d40ff625d536945a\"},\n{\"Num\":4100000,\"Root\":\"0x2dda3973379a32a75f06de8aca5ca0d70488021d4d81d89a0e6a5e0d7840070a\"},\n{\"Num\":4110000,\"Root\":\"0xb5c8876571bc8de04acf174fba40ef210ee8144b21e3988ba91c903082d0e6ea\"},\n{\"Num\":4120000,\"Root\":\"0x8c0ca252d7bc4a98d04558c4f61fc31be52a57d06ee60121d84456a00fbf660b\"},\n{\"Num\":4130000,\"Root\":\"0x1c5aa1c1b7632a8a9fca9a0a59cf69c4caf97d4a40bb3cf563a9a4d6805106bb\"},\n{\"Num\":4140000,\"Root\":\"0x5a51c47d1812a86183564824eac92c887b135517bcf169d15a4456c34ece65f3\"},\n{\"Num\":4150000,\"Root\":\"0x228112a0a7e1005dcbc5b1ca2116e7e269708de16c691fd94d522ab8cceca91c\"},\n{\"Num\":4160000,\"Root\":\"0xdb90205041dec169292da2bff73e9f294a6a6a3ab576c414d8ca309c9de75097\"},\n{\"Num\":4170000,\"Root\":\"0x5a95cec635a7f43b9ac08662af30bee24f39f706f413f5d3c4491f9484e7999f\"},\n{\"Num\":4180000,\"Root\":\"0xdaac505be9043fc111f35dfcd6df922f5c2716d77902b4b22e69ebd922416244\"},\n{\"Num\":4190000,\"Root\":\"0x8ef2cc1e95ef600a448c272eb48bc147dbaff777977a746ebe4fa6a0bafe6ed6\"},\n{\"Num\":4200000,\"Root\":\"0xda1827a219d1da513f7359937f64b344bda209e9b9b914be44dd56b498b737ef\"},\n{\"Num\":4210000,\"Root\":\"0x21f2427d8937acb27218f76be1de501bb993d4707d212f228f3b88e3a8ed7134\"},\n{\"Num\":4220000,\"Root\":\"0x3b4195cf75209e01af919c1c2c05a92e24169714d5bc6ff32374a376c729ab03\"},\n{\"Num\":4230000,\"Root\":\"0x2c2d7398363b358fa4aac120ac74af976d13b3b6985feb491142316f31cff038\"},\n{\"Num\":4240000,\"Root\":\"0x8078b693e6e0182103b269ae8ab324e977bb359a697804ecbfa7d613608d35df\"},\n{\"Num\":4250000,\"Root\":\"0x9899be11e598709f8cefbb49599122d6166fcfafdbd4a73a65c44cbbd05180ab\"},\n{\"Num\":4260000,\"Root\":\"0xf9648f91252d75fbbd590c5c77ec878120ef0708324b031de225368c9b4e5c3c\"},\n{\"Num\":4270000,\"Root\":\"0x0d68f42abb0fafb1c699c91c5c00360b9a3d71c250cccb8edbe4e6cc0d6800ee\"},\n{\"Num\":4280000,\"Root\":\"0x8b885c6607be668c33e9ed33f2badf03afcc4c15e33b22809645f32b2e5dc30a\"},\n{\"Num\":4290000,\"Root\":\"0xd308f0cff2cdfd4279dd91273420fb758720dc20c8bbdae17ce8eaacf53a5a50\"},\n{\"Num\":4300000,\"Root\":\"0xee433db61658f84367acc1226a6a58f6422a0536f0c531e0c77741efe244f8df\"},\n{\"Num\":4310000,\"Root\":\"0x3cfdecebb45ad48d1e5c4490a97c32b31d1ee23a3e60faa79c76b83769a35e72\"},\n{\"Num\":4320000,\"Root\":\"0x60d4c9cf3e1a1066c98c9d6d5182fd3e61082a55fa7b0605a014008bdf58313a\"},\n{\"Num\":4330000,\"Root\":\"0xeaf0ddb22ff71ef682f2b69f0127de6ea89d0f0632a9307ef71604a64d350cff\"},\n{\"Num\":4340000,\"Root\":\"0x7ee10081c6ae1f39e8b59c9f07831baf6e2a7a1a0f93381a9e7d493e708a6b83\"},\n{\"Num\":4350000,\"Root\":\"0xc950820d5dcad163b9b1b3036bb061205785040b0bb7b01fa8d57750d7f8cde8\"},\n{\"Num\":4360000,\"Root\":\"0xe64b8e2137c913b727c3760afedd7b43c1e785c60609e89872acb5ddd19ad793\"},\n{\"Num\":4370000,\"Root\":\"0x5554178fae825f3d42aafc93d09b71fe7ab703eff5070978084d440af599f3ad\"},\n{\"Num\":4380000,\"Root\":\"0x6e596abeae9d63a39b78e3b689d3301b3bfad147eb5949baf3786d12a8e4b1a9\"},\n{\"Num\":4390000,\"Root\":\"0x007ae617ec982c2861c68934333aaaf2e09afb8eb70641211e0b64994c791d6a\"},\n{\"Num\":4400000,\"Root\":\"0x94ed9462e1b94d959776f0f068f508f34e0d9f4d215f503fbb5a879a5b3dae79\"},\n{\"Num\":4410000,\"Root\":\"0x5d1b5f691b7a40eb0eb6ab5d3c261473060e605548c44899c5941fa4a176ffeb\"},\n{\"Num\":4420000,\"Root\":\"0xff91907c0b2b6bf224572fdffc6495b6d043ac0bea55d588a39743350d98a68f\"},\n{\"Num\":4430000,\"Root\":\"0xd0281533d55bed7934e3a5033400b97f078fdd7e3e2e84c9a53f6e045d5d0dc5\"},\n{\"Num\":4440000,\"Root\":\"0x38c70c5262699a7673e14bc09650845367ee8ddebf6f74914e33e19f568c28f7\"},\n{\"Num\":4450000,\"Root\":\"0x76583d6d11cc89e3c76406b01c7527c812852c6b00c02bce504790f11b23d000\"},\n{\"Num\":4460000,\"Root\":\"0x8e8a9e7b497efa123388a1e8b1104154388841ed16840e556258bfaf38f50677\"},\n{\"Num\":4470000,\"Root\":\"0xa041c8468fe9dff94ebe51e8ff98acf8a720aabb0edfc0108d3639eb35ca42c9\"},\n{\"Num\":4480000,\"Root\":\"0xcde69b44a7045e5c94deb02c5817c4740b4aa4fae47922d2f1f7c3b3d9d6c95c\"},\n{\"Num\":4490000,\"Root\":\"0x70e3f46a938b6d88014feeceb60125ad6df890a60ec7d83f3f6d680fe45e0928\"},\n{\"Num\":4500000,\"Root\":\"0x77d8f0aea6dadbaf34065b613a80fa966165d2e8486ee3c47e50e04b3f704615\"},\n{\"Num\":4510000,\"Root\":\"0x581c33ef623413c83c3812325c314f0fa3fb15c1bdfea1e2d04a08c66199e2fe\"},\n{\"Num\":4520000,\"Root\":\"0xb09084d8702d53f384498e6535de8a50f806a035b6a0c80c0790c0716b313bbd\"},\n{\"Num\":4530000,\"Root\":\"0x535a45284b3c681f773108bd8989e2dee6cd7c09a27807d794bccd83ec0450fc\"},\n{\"Num\":4540000,\"Root\":\"0xa0bc0492acf86126a074409cb5e1231b4f48ec43fe52e78b35b25b7a4f790043\"},\n{\"Num\":4550000,\"Root\":\"0xf2358077ec35fd95513b48fda68c6deeb8a73acf8c373e052ac2a817589dc828\"},\n{\"Num\":4560000,\"Root\":\"0xcf7ba5d1159b1004087695a9ee2e8dd6d945771de6d0794db92b42b83b946138\"},\n{\"Num\":4570000,\"Root\":\"0xc6365118143190498dbffdb918eb40aec0392e2f5a26f5d430e86f7eef03cd0b\"},\n{\"Num\":4580000,\"Root\":\"0xa2fa241bec686f5fad2bb4e2799c6b5fdaad8fc3d8c9b0d1133927097116627f\"},\n{\"Num\":4590000,\"Root\":\"0xb8e44e8c56ac92f8b05b462dbde402bb1474cadfd05e87720f6fa1543e23dfbc\"},\n{\"Num\":4600000,\"Root\":\"0x970877b7c4465a4c44e32dae3ced9f5dd65e13428fe981c7284761ee742aaa6a\"},\n{\"Num\":4610000,\"Root\":\"0x0b9842880f995cd37f0a8060d10bc8164ab707b8bdb723711cdfcec5466249b4\"},\n{\"Num\":4620000,\"Root\":\"0x64a7cb8ad8c15050d2899580eca2e0f6793a63f55b10ec972c6ced950d321f1d\"},\n{\"Num\":4630000,\"Root\":\"0x94bb640eb3326cb500b808989541ed386a26a177b778b9008a1d866f14332c04\"},\n{\"Num\":4640000,\"Root\":\"0xa157ff62a1180925a88cae7ccc36e53a4fe7fb222227f01ebf6e0a7a71fcddbf\"},\n{\"Num\":4650000,\"Root\":\"0xa900feeef6d70131ef79633243a3ac92d493168148d1126e625c79ee06a6180c\"},\n{\"Num\":4660000,\"Root\":\"0x9ffaeefda79215a9bd1efec7b68a65e3405313977cc1cbc64f42402c2c165489\"},\n{\"Num\":4670000,\"Root\":\"0xfe8887f61b49204e1f44a9b03589dc28c1f90cb0acdb4d591129f70f8aaffabe\"},\n{\"Num\":4680000,\"Root\":\"0xa676996ca729613578d0814a5e5a63029f6ee247db441064b2cd4aed302b6e48\"},\n{\"Num\":4690000,\"Root\":\"0xbb392e20735daaaac6bb26f1d182e90c93c4a1c0afb4f79c39a6bd1ee699592f\"},\n{\"Num\":4700000,\"Root\":\"0x06f75eba330bbccdc1fca944bc90150351edac114c1c114c1e420793a4850363\"},\n{\"Num\":4710000,\"Root\":\"0x2f3bbd29209850c17c6290d7e0fd22be416f061592a3bc6f255a0438d97f7620\"},\n{\"Num\":4720000,\"Root\":\"0xd71e589882c776d5df0be704c3c592d2eaf145a995aee24d1e0e3f5517a6848c\"},\n{\"Num\":4730000,\"Root\":\"0xa40f6029bb9a5170e9a704e01c6809f57fede7917d872b648bec0f4537fff6b5\"},\n{\"Num\":4740000,\"Root\":\"0x193ed0179740a3e6f50f9db37b8214037a5e68414eca7ad336f876826c8c2799\"},\n{\"Num\":4750000,\"Root\":\"0xa2dfccad80c6c80b7a2c267da7e15e355b36189aeae9388640a110928ceae454\"},\n{\"Num\":4760000,\"Root\":\"0x98b185566b62df72507df6d1b7f5a68c609d92d4d33a36a77cab004c96922e4f\"},\n{\"Num\":4770000,\"Root\":\"0x663dd314a821d95037580bf16643d0b1e64d71046b878066feb4e13cd90a1cd9\"},\n{\"Num\":4780000,\"Root\":\"0xcec18daba392a7fc788a66a41ddc2621433f08a3f7238976e0d9bb966c6bb818\"},\n{\"Num\":4790000,\"Root\":\"0xe715abeec4f0644c6d837bd22360140452d3bd6fe132e2f24dec7753e4c72aff\"},\n{\"Num\":4800000,\"Root\":\"0xbee6671530bc6dfe156a55d650ff84e3bbda146b38c6da3e3f3280319f33fa76\"},\n{\"Num\":4810000,\"Root\":\"0x29d9d53242375953b43a37df17d39a6fb24b9704a0e91b595405492e11d514ed\"},\n{\"Num\":4820000,\"Root\":\"0xc10487d0a34e9ec806100d35e55e6575dbc938e5e53ad45e8e88a182870a60f3\"},\n{\"Num\":4830000,\"Root\":\"0xd354a12cbf42a4eb5448fa22ef945559e5f53368bc14ec6f8642671a4f6b9ce8\"},\n{\"Num\":4840000,\"Root\":\"0x66e71cf4dc38ecda0b7e38a4bd986a2125836fb49e769578f051d1498e9db87f\"},\n{\"Num\":4850000,\"Root\":\"0x2acd922b9afefec442c5df51b990be38b84ae970a6bf96bff9b0eb2b74a7d24e\"},\n{\"Num\":4860000,\"Root\":\"0xada128902c4c9877a9d438624e51bf49432cd833f9296aa7eaf2c8ccdfbcdbc8\"},\n{\"Num\":4870000,\"Root\":\"0xee5a4eb9d725923df171e1b18551356d002ec03acdcb140aaa573081056e2f19\"},\n{\"Num\":4880000,\"Root\":\"0x2ca064abdf2ac736fb8b1d0a155f00437bdce1ea19b6d342891c43ddd9926a1d\"},\n{\"Num\":4890000,\"Root\":\"0xea465c1d047690239f29333685cb3637e0f0611abdc5fd73009f0ffd5cc0276e\"},\n{\"Num\":4900000,\"Root\":\"0x5f602e127a6625c9545984456370e23825ea2b99bca797da619a51061eabbef0\"},\n{\"Num\":4910000,\"Root\":\"0x0048440c67530c1e9796fc572f72d5455e46c4e1cc267b876d92e82cf6c2579c\"},\n{\"Num\":4920000,\"Root\":\"0x43eb5d41e46e3e688d69a20d752326b7545a0c85e21077fe789810b259030b81\"},\n{\"Num\":4930000,\"Root\":\"0x5dfa6d3cde2a4ea97a3c7a1cac825bedc5482837e09a783e4e6ef133096b91de\"},\n{\"Num\":4940000,\"Root\":\"0x5c161a8d9fbb2d9e36335fa86c2ea5801fac4c26d2836a04e7c89e664b14f30f\"},\n{\"Num\":4950000,\"Root\":\"0xfc230cbd17ce5a3457aa9572d813ed35ae45911de7fdbedf9c28e77abba422d8\"},\n{\"Num\":4960000,\"Root\":\"0x48d7be627d5ddce93985e8d27ed7d0ed3a4f801a19aab556ee54f7f071cd01bc\"},\n{\"Num\":4970000,\"Root\":\"0xb4b4d21abcff5be92f3d8c7942d866aeb92229e9567a24d780ac3b9600953f7a\"},\n{\"Num\":4980000,\"Root\":\"0xda77d2ad0522c8e879398f3f45b95c648d8d9b7aa8e0cb113d06fdb158f7b559\"},\n{\"Num\":4990000,\"Root\":\"0xfbbcb038f61f48d1b4d0424f363b1057ca863b1fdefc2a3233508d79c9706efb\"},\n{\"Num\":5000000,\"Root\":\"0x3fd102d5698ea31181e455591676733fc1e9fe9f5675f74d6ee718ba5d32d8dc\"},\n{\"Num\":5010000,\"Root\":\"0xd7c34ea303d6badf4794a69bda0349b0aacf9c102c9332a1457df769feaa5fca\"},\n{\"Num\":5020000,\"Root\":\"0xb2d27e4a2062f1e6826949f6716273445a2adc71c0419942af1ffea84e721782\"},\n{\"Num\":5030000,\"Root\":\"0xf9ddabb2a740b8f65bc27353d82cbcac0bae86b2f190219b0d7108e0ae5584ba\"},\n{\"Num\":5040000,\"Root\":\"0xac942fa0062c2a62f17bc77d5f219697143100852880bfc894fbd6529aa154a2\"},\n{\"Num\":5050000,\"Root\":\"0x3e01849da5263b68002dea26a8de30bf1c01d68640bb7e2404a4fe4cd28a1de6\"},\n{\"Num\":5060000,\"Root\":\"0x8a52f66bd259d66bd0d1897d6e03cc934abcd52eddda014e31e37c18b0f98443\"},\n{\"Num\":5070000,\"Root\":\"0xf9d278da7c929ff473e77f84928f618e6e6fee4ebd65a29912b08baa8b03672c\"},\n{\"Num\":5080000,\"Root\":\"0x568cea9e0c8b5257517d88797b8979f0b4e5fdd77f24b30ee17d392ce8fec0b2\"},\n{\"Num\":5090000,\"Root\":\"0x076ec6c26ccf79e0b3f0af84a133b3c2628e2900643faffeceaffae1673e0717\"},\n{\"Num\":5100000,\"Root\":\"0x376169e21732b5317f616e548bea0ca6c0f55fccb98c15222f6b402c910a5acf\"},\n{\"Num\":5110000,\"Root\":\"0x8d2fc6282fb384ba292747c35a4e82f62a2bdcbd01b93f1f3a2c1bef509daea4\"},\n{\"Num\":5120000,\"Root\":\"0xb562a79496b2e2a0e592f34d9273f802b4e6764e8d0a6c117e3982a98248ab2c\"},\n{\"Num\":5130000,\"Root\":\"0xf547f8875b8bec1dd7406c4e103d2e9b2ad034ac20efc27e6b5698828ebf33dd\"},\n{\"Num\":5140000,\"Root\":\"0x89268de97bcde01c5ac59fd9d6cdccae3ab7014a62ad5aacbc7596f99ac74cdb\"},\n{\"Num\":5150000,\"Root\":\"0xb803fcc1aa0a84bc6c52c99b76202b0ba6a7b0a97679902a2fb12de09cdd9efe\"},\n{\"Num\":5160000,\"Root\":\"0x42a0d4f54f47fa45185f7a8d87314ff44ff21a654af0b90d9f2aec6ba0d6d0f8\"},\n{\"Num\":5170000,\"Root\":\"0x2c76ee2f30b25124917ba299ee1a32770b02235a61cfe0e15fa8692da69a60e2\"},\n{\"Num\":5180000,\"Root\":\"0x929f3f3909f56605c980a1e5a31514b1db2b576ff016425c2ad332ad3b020e09\"},\n{\"Num\":5190000,\"Root\":\"0x7b6f350413aa303d4eb198d2d8147bc8120e36bedcc316f60264920d19f7305c\"},\n{\"Num\":5200000,\"Root\":\"0xa84de1d83790c651e1dfbca135f60c2cc0212c54e9dd91f3a629a1139b902374\"},\n{\"Num\":5210000,\"Root\":\"0x87318346d56b060d536b545bfcd1835f4173e34fed3eadcd807d1ee85ae7f821\"},\n{\"Num\":5220000,\"Root\":\"0x6f72a4fe4e386205dd16aafc24ff5c1236745f6836bdb814a1540b273df0040f\"},\n{\"Num\":5230000,\"Root\":\"0x35f5f64f8aa97926c6b74925a1dcce70ea64bf7b1968ee883b92d806e9dbc623\"},\n{\"Num\":5240000,\"Root\":\"0xeb89c0d5dadc2e4bd7e49d43e98bf23a4e3a8663d043639d3e39d83229a3e135\"},\n{\"Num\":5250000,\"Root\":\"0xc8a9ee2e31deda2d7227cec194be93b47c7759224d6d7f8c9a4886b97a176258\"},\n{\"Num\":5260000,\"Root\":\"0x19145c70d05b4cddb84afbf158165f328c5d7727575964afca1dda479f0ebca0\"},\n{\"Num\":5270000,\"Root\":\"0xae5dd588b3595d232c81d07f85f2ade6aa38455c005809ebe4cd5f8d8d3ee56a\"},\n{\"Num\":5280000,\"Root\":\"0x251d72321b548e83eca5052c655cde34a733e39b4ece2c16d9f030367df2c1b9\"},\n{\"Num\":5290000,\"Root\":\"0xc1f0ec1a6219e56152542d6586fb368d276c45d5298f5daa003394094d1d435a\"},\n{\"Num\":5300000,\"Root\":\"0xd6a9cb9581fbffae89adf7d19a1a2214dc431d7ccf9d698c1d487d473e3cfcba\"},\n{\"Num\":5310000,\"Root\":\"0xd79d36d164b96a303215999fe38675494aa892ec10b2b776e2d69ff96b47ed12\"},\n{\"Num\":5320000,\"Root\":\"0x49af5a664bad807f60aa1c79344591b1ec7a1397c10ece6bffee06e1e2d7c0ca\"},\n{\"Num\":5330000,\"Root\":\"0x89e3d88c80a62985652f8b344941aae9f8eeb1147e2494869600ef948bdcd260\"}\n]`\n\n/*\n */\n\ntype checkPoint struct {\n\tNum  uint64\n\tRoot c_type.Uint256\n}\n\ntype checkPoints struct {\n\tmaxNum uint64\n\tpoints map[uint64][]byte\n}\n\nfunc (self *checkPoints) MaxNum() (ret uint64) {\n\tif seroparam.Is_Dev() {\n\t\treturn 0\n\t} else {\n\t\treturn self.maxNum\n\t}\n}\n\nfunc (self *checkPoints) Check(num uint64, root []byte) (e error) {\n\tif num > self.maxNum {\n\t\tpanic(fmt.Errorf(\"check points error: the num > maxNum %d-%s\", num, hex.EncodeToString(root)))\n\t}\n\tif (num > 0) && (num%10000 == 0) {\n\t\tif rt, ok := self.points[num]; !ok {\n\t\t\treturn fmt.Errorf(\"check points error: can not find the point %d-%s\", num, hex.EncodeToString(root))\n\t\t} else {\n\t\t\tif bytes.Compare(rt, root) != 0 {\n\t\t\t\treturn fmt.Errorf(\"check points error: the point are not match %d-%s (%s)\", num, hex.EncodeToString(root), hex.EncodeToString(rt))\n\t\t\t} else {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn nil\n\t}\n}\n\nfunc newCheckPoints() (ret checkPoints) {\n\tret.points = make(map[uint64][]byte)\n\tvar cps []*checkPoint\n\tjson.Unmarshal([]byte(checkpoints_json), &cps)\n\n\tfor _, cp := range cps {\n\t\tret.points[cp.Num] = cp.Root[:]\n\t\tif cp.Num > ret.maxNum {\n\t\t\tret.maxNum = cp.Num\n\t\t}\n\t}\n\treturn\n}\n\nvar CheckPoints = newCheckPoints()\n"
  },
  {
    "path": "zero/zconfig/checkpoint_test.go",
    "content": "package zconfig\n\nimport (\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestCheckPoint(t *testing.T) {\n\tfmt.Println(\"checkpoint: \", hex.EncodeToString(CheckPoints.points[10000]))\n\tfmt.Println(\"maxNum: \", CheckPoints.MaxNum())\n}\n"
  },
  {
    "path": "zero/zconfig/exchange.go",
    "content": "package zconfig\n\nimport \"path/filepath\"\n\nfunc Exchange_dir() string {\n\treturn filepath.Join(dir, \"exchange\")\n}\n"
  },
  {
    "path": "zero/zconfig/light.go",
    "content": "package zconfig\n\nimport \"path/filepath\"\n\nfunc Light_dir() string {\n\treturn filepath.Join(dir, \"light\")\n}\n"
  },
  {
    "path": "zero/zconfig/main.go",
    "content": "package zconfig\n\nimport \"io/ioutil\"\n\nvar dir = \"\"\n\nfunc Init_Data_dir(d string) {\n\tdir = d\n}\n\nfunc IsDirExists(path string) bool {\n\tfiles, err := ioutil.ReadDir(path)\n\tif err != nil {\n\t\treturn false\n\t} else {\n\t\tif len(files) > 0 {\n\t\t\treturn true\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "zero/zconfig/main_test.go",
    "content": "package zconfig\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestSign(t *testing.T) {\n\tis := []int{}\n\tis = append(is, 1)\n\tis = append(is, 2)\n\tr_is := &is[0]\n\t(*r_is) = 2\n\tfmt.Println(is)\n}\n"
  },
  {
    "path": "zero/zconfig/runtime.go",
    "content": "package zconfig\n\nimport \"runtime\"\n\nvar G_p_thread_num = runtime.NumCPU()\nvar G_v_thread_num = runtime.NumCPU()\n"
  },
  {
    "path": "zero/zconfig/snapshot.go",
    "content": "package zconfig\n\nvar snapshot_flag uint64\n\nfunc Init_Snapshot(num uint64) {\n\tsnapshot_flag = num\n}\n\nfunc IsSnapshotMode() bool {\n\tif snapshot_flag > 0 {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc NeedSnapshot(num uint64) bool {\n\tif num == snapshot_flag {\n\t\treturn true\n\t}\n\treturn false\n}\n\nvar testForkStartBlock uint64\n\nfunc Init_TestForkStartBlock(num uint64) {\n\ttestForkStartBlock = num\n}\n\nfunc GetTestForkStartBlock() uint64 {\n\treturn testForkStartBlock\n}\n\nvar testFork bool\n\nfunc Init_TestFork() {\n\ttestFork = true\n}\n\nfunc IsTestFork() bool {\n\tif testFork && testForkStartBlock == 0 {\n\t\tpanic(\"please set testForkStartBlock\")\n\t}\n\treturn testFork\n}\n\nvar recordBlockShareNumber bool\n\nfunc Init_RecordShareNum() {\n\trecordBlockShareNumber = true\n}\n\nfunc RecordShareNum() bool {\n\treturn recordBlockShareNumber\n}\n"
  },
  {
    "path": "zero/zconfig/stake.go",
    "content": "package zconfig\n\nimport \"path/filepath\"\n\nfunc Stake_dir() string {\n\treturn filepath.Join(dir, \"stake\")\n}\n"
  }
]